diff --git a/.gitignore b/.gitignore index 71bb7c06d4..4c961a6db9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,22 @@ - -#ignore thumbnails created by windows +# Ignore files created by windows Thumbs.db -#Ignore files built by Visual Studio -*.obj -*.exe -*.pdb -*.user -*.aps -*.pch -*.vspscc -*_i.c -*_p.c -*.ncb -*.suo -*.tlb -*.tlh -*.bak -*.cache -*.ilk -*.log -[Bb]in -[Dd]ebug*/ -*.lib -*.sbr -obj/ -[Rr]elease*/ -_ReSharper*/ -[Tt]est[Rr]esult* -Binary +# Ignore files created by OS X +.DS_Store +# Ignore autogenerated source files Source/Core/Common/Src/scmrev.h +# Ignore files output by build +/[Bb]uild/ +/[Bb]inary/ +# Ignore files created by visual studio +*.ipch *.opensdf *.sdf -[Bb]uild -*.ipch -.sconsign.dblite -Externals/scons-local/* -.DS_Store +*.suo +*.vcxproj.user +*.obj +# Ignore files created by posix people *~ -#Ignore transifix configuration directory +# Ignore transifix configuration directory .tx +# Ignore tlog files +*.tlog \ No newline at end of file diff --git a/.hgeol b/.hgeol deleted file mode 100644 index d6ac94569e..0000000000 --- a/.hgeol +++ /dev/null @@ -1,3 +0,0 @@ -[patterns] -Data/User/Wii/**.* = BIN -** = native \ No newline at end of file diff --git a/.hgignore b/.hgignore deleted file mode 100644 index e8da105116..0000000000 --- a/.hgignore +++ /dev/null @@ -1,25 +0,0 @@ -syntax:glob -Binary -*.obj -*.pdb -*.idb -*.ilk -*.pch -*.sdf -*.suo -*.vcxproj.*.user -*/Win32/Release -*/Win32/DebugFast -*/Win32/Debug -*/x64/Release -*/x64/DebugFast -*/x64/Debug -Source/ipch -BuildLog.htm -Source/Core/Common/Src/svnrev.h -Externals/wxWidgets/build/msw/*/Release -Externals/wxWidgets/build/msw/*/DebugFast -Externals/wxWidgets/build/msw/*/Debug -*.svn* -Data/User/GameConfig -Data/User/Shaders \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index eb519aada9..d350fdeb2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ option(USE_GLES "Enables GLES2 And EGL, disables OGL" OFF) option(USE_GLES3 "Enables GLES3 and EGL" OFF) option(USE_UPNP "Enables UPnP port mapping support" ON) option(DISABLE_WX "Disable wxWidgets (use CLI interface)" OFF) +option(ENABLE_PCH "Use PCH to speed up compilation" ON) option(FASTLOG "Enable all logs" OFF) option(OPROFILING "Enable profiling" OFF) @@ -25,11 +26,17 @@ option(UNITTESTS "Build unitests" OFF) # Update compiler before calling project() if (APPLE) # Use clang compiler - set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang") - set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++") - if (NOT EXISTS "${CMAKE_CXX_COMPILER}") - set(CMAKE_C_COMPILER "clang") - set(CMAKE_CXX_COMPILER "clang++") + if (NOT DEFINED CMAKE_CXX_COMPILER) + set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++") + if (NOT EXISTS "${CMAKE_CXX_COMPILER}") + set(CMAKE_CXX_COMPILER "clang++") + endif() + endif() + if (NOT DEFINED CMAKE_CXX_COMPILER) + set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang") + if (NOT EXISTS "${CMAKE_C_COMPILER}") + set(CMAKE_C_COMPILER "clang") + endif() endif() endif() project(dolphin-emu) @@ -104,8 +111,8 @@ if(GIT_FOUND AND NOT DOLPHIN_WC_REVISION) endif() # version number -set(DOLPHIN_VERSION_MAJOR "3") -set(DOLPHIN_VERSION_MINOR "5") +set(DOLPHIN_VERSION_MAJOR "4") +set(DOLPHIN_VERSION_MINOR "0") if(DOLPHIN_IS_STABLE) set(DOLPHIN_VERSION_PATCH "0") else() @@ -116,17 +123,12 @@ if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm") set(_M_GENERIC 1) set(_M_ARM 1) add_definitions(-marm -march=armv7-a) - add_definitions(-D_M_ARM=1) - add_definitions(-D_M_GENERIC=1) # Set generic options so you don't have to pass anything to cmake to build ARM set(USE_GLES 1) endif() if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") set(_M_GENERIC 1) - set(_M_MIPS 1) - add_definitions(-D_M_MIPS=1) - add_definitions(-D_M_GENERIC=1) endif() # Set these next two lines to test generic @@ -255,9 +257,16 @@ if(NOT CMAKE_BUILD_TYPE) "Build type (Release/Debug/RelWithDebInfo/MinSizeRe)" FORCE) endif(NOT CMAKE_BUILD_TYPE) + if(CMAKE_BUILD_TYPE STREQUAL Debug) add_definitions(-D_DEBUG -ggdb) set(wxWidgets_USE_DEBUG ON CACHE BOOL "Use wxWidgets Debugging") + + option(ENABLE_GPROF "Enable gprof profiling (must be using Debug build)" OFF) + if(ENABLE_GPROF) + add_definitions(-pg) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") + endif() endif(CMAKE_BUILD_TYPE STREQUAL Debug) if(CMAKE_BUILD_TYPE STREQUAL Release AND NOT APPLE) @@ -268,6 +277,11 @@ if(FASTLOG) add_definitions(-DDEBUGFAST) endif() +option(GDBSTUB "Enable gdb stub for remote debugging." OFF) +if(GDBSTUB) + add_definitions(-DUSE_GDBSTUB) +endif(GDBSTUB) + if(ANDROID) message("Building for Android") add_definitions(-DANDROID) @@ -316,8 +330,9 @@ add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE) # TODO: We should have options for dependencies included in the externals to # override autodetection of system libraries and force the usage of the # externals. +include(CheckLib) +include(CheckCXXSourceRuns) if(NOT ANDROID) - include(CheckLib) include(FindOpenGL) include_directories(${OPENGL_INCLUDE_DIR}) @@ -442,7 +457,6 @@ if(NOT ANDROID) check_libav() endif() - include(CheckCXXSourceRuns) set(CMAKE_REQUIRED_LIBRARIES portaudio) CHECK_CXX_SOURCE_RUNS( "#include @@ -470,6 +484,7 @@ if(NOT ANDROID) endif() endif() endif() + ######################################## # Setup include directories (and make sure they are preferred over the Externals) # @@ -509,11 +524,16 @@ else() set(LZO lzo2) endif() -if(ANDROID) +if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ANDROID) + check_lib(PNG png png.h QUIET) +endif() +if (PNG_FOUND) + message("Using shared libpng") +else() message("Using static libpng from Externals") add_subdirectory(Externals/libpng) include_directories(Externals/libpng) - set(PNG libpng) + set(PNG png) endif() if(OPENAL_FOUND) @@ -553,6 +573,13 @@ if(NOT ANDROID) endif(SDL2_FOUND) endif() +include(FindLibUSB OPTIONAL) +if(LIBUSB_FOUND) + message("Using shared LibUSB") + add_definitions(-D__LIBUSB__) + include_directories(${LIBUSB_INCLUDE_DIR}) +endif(LIBUSB_FOUND) + set(SFML_FIND_VERSION TRUE) set(SFML_FIND_VERSION_MAJOR 1) set(SFML_FIND_VERSION_MINOR 5) @@ -582,6 +609,19 @@ if(USE_UPNP) add_definitions(-DUSE_UPNP) endif() +if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ANDROID) + include(FindPolarSSL) +endif() +if(POLARSSL_FOUND AND POLARSSL_WORKS) + message("Using shared PolarSSL") + include_directories(${POLARSSL_INCLUDE_DIR}) +else() + message("Using PolarSSL from Externals") + set(POLARSSL_LIBRARY polarssl) + add_subdirectory(Externals/polarssl/) + include_directories(Externals/polarssl/include) +endif() + if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ANDROID) check_lib(SOIL SOIL SOIL/SOIL.h QUIET) endif() @@ -612,18 +652,24 @@ if(WIN32) find_library(GLEW glew32s PATHS Externals/GLew) include_directories(Externals/GLew/include) else() - if(NOT ANDROID) + if(NOT USE_GLES3) if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - check_lib(GLEW GLEW GL/glew.h) + include(FindGLEW) endif() - if(NOT GLEW_FOUND) + if(NOT GLEW_FOUND OR NOT GLEW_HAS_1_9_METHODS) message("Using static GLEW from Externals") add_subdirectory(Externals/GLew) include_directories(Externals/GLew/include) - endif(NOT GLEW_FOUND) + endif() endif() endif() +if (ANDROID) + message("Using static iconv from Externals") + include_directories(Externals/libiconv-1.14/include) + add_subdirectory(Externals/libiconv-1.14) +endif() + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT ANDROID) find_library(CL OpenCL) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-weak_framework,OpenCL") @@ -637,7 +683,7 @@ if(NOT DISABLE_WX AND NOT ANDROID) FIND_PACKAGE(wxWidgets COMPONENTS core aui adv) if(wxWidgets_FOUND) - EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + EXECUTE_PROCESS(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" ${wxWidgets_CONFIG_OPTIONS} --version OUTPUT_VARIABLE wxWidgets_VERSION @@ -739,14 +785,8 @@ add_subdirectory(Source) # Install shared data files # if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) - install(DIRECTORY Data/User/ DESTINATION ${datadir}/user PATTERN) install(DIRECTORY Data/Sys/ DESTINATION ${datadir}/sys PATTERN) endif() -include(FindGettext) -if(GETTEXT_FOUND AND NOT DISABLE_WX) - file(GLOB LINGUAS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Languages/po/*.po) - GETTEXT_CREATE_TRANSLATIONS(Languages/po/dolphin-emu.pot ALL ${LINGUAS}) -endif() if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|Darwin")) install(FILES Data/license.txt DESTINATION ${datadir}) endif() @@ -783,3 +823,4 @@ list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}") # CPack must be included after the CPACK_* variables are set in order for those # variables to take effect. Include(CPack) + diff --git a/CMakeTests/FindGLEW.cmake b/CMakeTests/FindGLEW.cmake new file mode 100644 index 0000000000..4861292558 --- /dev/null +++ b/CMakeTests/FindGLEW.cmake @@ -0,0 +1,32 @@ +include(FindPkgConfig OPTIONAL) + +# This is a hack to deal with Ubuntu's mess. +# Ubuntu's version of glew is 1.8, but they have patched in most of glew 1.9. +# So Ubuntu's version works for dolphin. +macro(test_glew) + set(CMAKE_REQUIRED_INCLUDES ${GLEW_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LIBRARIES GLEW) + check_cxx_source_runs(" + #include + int main() + { + #ifdef GLEW_ARB_shader_image_load_store + return 0; + #else + return 1; + #endif + }" + GLEW_HAS_1_9_METHODS) +endmacro() + +if(PKG_CONFIG_FOUND AND NOT ${var}_FOUND) + pkg_search_module(GLEW glew>=1.8) +endif() + +if(GLEW_FOUND) + test_glew() + if (GLEW_HAS_1_9_METHODS) + include_directories(${GLEW_INCLUDE_DIRS}) + message("GLEW found") + endif() +endif() diff --git a/CMakeTests/FindLibUSB.cmake b/CMakeTests/FindLibUSB.cmake new file mode 100644 index 0000000000..b829eef66b --- /dev/null +++ b/CMakeTests/FindLibUSB.cmake @@ -0,0 +1,43 @@ +# - Find libusb-1.0 library +# This module defines +# LIBUSB_INCLUDE_DIR, where to find bluetooth.h +# LIBUSB_LIBRARIES, the libraries needed to use libusb-1.0. +# LIBUSB_FOUND, If false, do not try to use libusb-1.0. +# +# Copyright (c) 2009, Michal Cihar, +# +# vim: expandtab sw=4 ts=4 sts=4: + +if(ANDROID) + set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found") + message(STATUS "libusb-1.0 not found.") +elseif (NOT LIBUSB_FOUND) + pkg_check_modules (LIBUSB_PKG libusb-1.0) + + find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h + PATHS + ${LIBUSB_PKG_INCLUDE_DIRS} + /usr/include/libusb-1.0 + /usr/include + /usr/local/include/libusb-1.0 + /usr/local/include + ) + + find_library(LIBUSB_LIBRARIES NAMES usb-1.0 + PATHS + ${LIBUSB_PKG_LIBRARY_DIRS} + /usr/lib + /usr/local/lib + ) + + if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found") + message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}") + else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found") + message(STATUS "libusb-1.0 not found.") + endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + + mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) +endif () + diff --git a/CMakeTests/FindPolarSSL.cmake b/CMakeTests/FindPolarSSL.cmake new file mode 100644 index 0000000000..be67c5613a --- /dev/null +++ b/CMakeTests/FindPolarSSL.cmake @@ -0,0 +1,59 @@ +# Locate polarssl library +# This module defines +# POLARSSL_FOUND +# POLARSSL_LIBRARY +# POLARSSL_INCLUDE_DIR +# POLARSSL_WORKS, this is true if polarssl is found and contains the methods +# needed by dolphin-emu + +if(POLARSSL_INCLUDE_DIR AND POLARSSL_LIBRARY) + # Already in cache, be silent + set(POLARSSL_FIND_QUIETLY TRUE) +endif() + +find_path(POLARSSL_INCLUDE_DIR polarssl/ssl.h) +find_library(POLARSSL_LIBRARY polarssl) + +if (POLARSSL_INCLUDE_DIR AND POLARSSL_LIBRARY) + set (POLARSSL_FOUND TRUE) +endif () + +if (POLARSSL_FOUND) + if (NOT POLARSSL_FIND_QUIETLY) + message (STATUS "Found the polarssl libraries at ${POLARSSL_LIBRARY}") + message (STATUS "Found the polarssl headers at ${POLARSSL_INCLUDE_DIR}") + endif (NOT POLARSSL_FIND_QUIETLY) + + message(STATUS "Checking to see if system version contains necessary methods") + + set(CMAKE_REQUIRED_INCLUDES ${POLARSSL_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${POLARSSL_LIBRARY}) + check_cxx_source_compiles(" + #include + #include + #include + int main() + { + ssl_context ctx; + ssl_session session; + havege_state hs; + + ssl_init(&ctx); + havege_init(&hs); + ssl_set_rng(&ctx, havege_random, &hs); + ssl_set_session(&ctx, &session); + + ssl_close_notify(&ctx); + ssl_session_free(&session); + ssl_free(&ctx); + + return 0; + }" + POLARSSL_WORKS) + +else () + message (STATUS "Could not find polarssl") +endif () + +MARK_AS_ADVANCED(POLARSSL_INCLUDE_DIR POLARSSL_LIBRARY) + diff --git a/Data/User/GameConfig/D43E01.ini b/Data/Sys/GameSettings/D43E01.ini similarity index 100% rename from Data/User/GameConfig/D43E01.ini rename to Data/Sys/GameSettings/D43E01.ini diff --git a/Data/User/GameConfig/D43J01.ini b/Data/Sys/GameSettings/D43J01.ini similarity index 97% rename from Data/User/GameConfig/D43J01.ini rename to Data/Sys/GameSettings/D43J01.ini index 03d04723dd..6db05bda2d 100644 --- a/Data/User/GameConfig/D43J01.ini +++ b/Data/Sys/GameSettings/D43J01.ini @@ -13,7 +13,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$loophack +$loophack 0x806866E4:word:0x60000000 [ActionReplay] diff --git a/Data/User/GameConfig/D43P01.ini b/Data/Sys/GameSettings/D43P01.ini similarity index 100% rename from Data/User/GameConfig/D43P01.ini rename to Data/Sys/GameSettings/D43P01.ini diff --git a/Data/User/GameConfig/D43U01.ini b/Data/Sys/GameSettings/D43U01.ini similarity index 100% rename from Data/User/GameConfig/D43U01.ini rename to Data/Sys/GameSettings/D43U01.ini diff --git a/Data/User/GameConfig/DTLX01.ini b/Data/Sys/GameSettings/DTLX01.ini similarity index 100% rename from Data/User/GameConfig/DTLX01.ini rename to Data/Sys/GameSettings/DTLX01.ini diff --git a/Data/User/GameConfig/DVDXDV.ini b/Data/Sys/GameSettings/DVDXDV.ini similarity index 100% rename from Data/User/GameConfig/DVDXDV.ini rename to Data/Sys/GameSettings/DVDXDV.ini diff --git a/Data/User/GameConfig/FABP01.ini b/Data/Sys/GameSettings/FABP01.ini similarity index 100% rename from Data/User/GameConfig/FABP01.ini rename to Data/Sys/GameSettings/FABP01.ini diff --git a/Data/User/GameConfig/FBYE01.ini b/Data/Sys/GameSettings/FBYE01.ini similarity index 100% rename from Data/User/GameConfig/FBYE01.ini rename to Data/Sys/GameSettings/FBYE01.ini diff --git a/Data/User/GameConfig/G2BE5G.ini b/Data/Sys/GameSettings/G2BE5G.ini similarity index 100% rename from Data/User/GameConfig/G2BE5G.ini rename to Data/Sys/GameSettings/G2BE5G.ini diff --git a/Data/User/GameConfig/G2BP7D.ini b/Data/Sys/GameSettings/G2BP7D.ini similarity index 100% rename from Data/User/GameConfig/G2BP7D.ini rename to Data/Sys/GameSettings/G2BP7D.ini diff --git a/Data/User/GameConfig/G2CE52.ini b/Data/Sys/GameSettings/G2CE52.ini similarity index 100% rename from Data/User/GameConfig/G2CE52.ini rename to Data/Sys/GameSettings/G2CE52.ini diff --git a/Data/User/GameConfig/G2FE78.ini b/Data/Sys/GameSettings/G2FE78.ini similarity index 100% rename from Data/User/GameConfig/G2FE78.ini rename to Data/Sys/GameSettings/G2FE78.ini diff --git a/Data/User/GameConfig/G2GJB2.ini b/Data/Sys/GameSettings/G2GJB2.ini similarity index 100% rename from Data/User/GameConfig/G2GJB2.ini rename to Data/Sys/GameSettings/G2GJB2.ini diff --git a/Data/User/GameConfig/G2ME01.ini b/Data/Sys/GameSettings/G2ME01.ini similarity index 100% rename from Data/User/GameConfig/G2ME01.ini rename to Data/Sys/GameSettings/G2ME01.ini diff --git a/Data/User/GameConfig/G2MP01.ini b/Data/Sys/GameSettings/G2MP01.ini similarity index 100% rename from Data/User/GameConfig/G2MP01.ini rename to Data/Sys/GameSettings/G2MP01.ini diff --git a/Data/User/GameConfig/G2OE41.ini b/Data/Sys/GameSettings/G2OE41.ini similarity index 100% rename from Data/User/GameConfig/G2OE41.ini rename to Data/Sys/GameSettings/G2OE41.ini diff --git a/Data/User/GameConfig/G2OP41.ini b/Data/Sys/GameSettings/G2OP41.ini similarity index 100% rename from Data/User/GameConfig/G2OP41.ini rename to Data/Sys/GameSettings/G2OP41.ini diff --git a/Data/User/GameConfig/G2RE52.ini b/Data/Sys/GameSettings/G2RE52.ini similarity index 100% rename from Data/User/GameConfig/G2RE52.ini rename to Data/Sys/GameSettings/G2RE52.ini diff --git a/Data/User/GameConfig/G2TE52.ini b/Data/Sys/GameSettings/G2TE52.ini similarity index 100% rename from Data/User/GameConfig/G2TE52.ini rename to Data/Sys/GameSettings/G2TE52.ini diff --git a/Data/User/GameConfig/G2VE08.ini b/Data/Sys/GameSettings/G2VE08.ini similarity index 100% rename from Data/User/GameConfig/G2VE08.ini rename to Data/Sys/GameSettings/G2VE08.ini diff --git a/Data/User/GameConfig/G2VP08.ini b/Data/Sys/GameSettings/G2VP08.ini similarity index 100% rename from Data/User/GameConfig/G2VP08.ini rename to Data/Sys/GameSettings/G2VP08.ini diff --git a/Data/User/GameConfig/G2XE8P.ini b/Data/Sys/GameSettings/G2XE8P.ini similarity index 100% rename from Data/User/GameConfig/G2XE8P.ini rename to Data/Sys/GameSettings/G2XE8P.ini diff --git a/Data/User/GameConfig/G2XP8P.ini b/Data/Sys/GameSettings/G2XP8P.ini similarity index 100% rename from Data/User/GameConfig/G2XP8P.ini rename to Data/Sys/GameSettings/G2XP8P.ini diff --git a/Data/User/GameConfig/G3AD69.ini b/Data/Sys/GameSettings/G3AD69.ini similarity index 100% rename from Data/User/GameConfig/G3AD69.ini rename to Data/Sys/GameSettings/G3AD69.ini diff --git a/Data/User/GameConfig/G3AE69.ini b/Data/Sys/GameSettings/G3AE69.ini similarity index 100% rename from Data/User/GameConfig/G3AE69.ini rename to Data/Sys/GameSettings/G3AE69.ini diff --git a/Data/User/GameConfig/G3AF69.ini b/Data/Sys/GameSettings/G3AF69.ini similarity index 100% rename from Data/User/GameConfig/G3AF69.ini rename to Data/Sys/GameSettings/G3AF69.ini diff --git a/Data/User/GameConfig/G3AP69.ini b/Data/Sys/GameSettings/G3AP69.ini similarity index 100% rename from Data/User/GameConfig/G3AP69.ini rename to Data/Sys/GameSettings/G3AP69.ini diff --git a/Data/User/GameConfig/G3DE6L.ini b/Data/Sys/GameSettings/G3DE6L.ini similarity index 96% rename from Data/User/GameConfig/G3DE6L.ini rename to Data/Sys/GameSettings/G3DE6L.ini index 724b3dcee9..71859b9a83 100644 --- a/Data/User/GameConfig/G3DE6L.ini +++ b/Data/Sys/GameSettings/G3DE6L.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/GXME52.ini b/Data/Sys/GameSettings/G3DP6L.ini similarity index 89% rename from Data/User/GameConfig/GXME52.ini rename to Data/Sys/GameSettings/G3DP6L.ini index 9a2b0d3620..7cf3b37cdf 100644 --- a/Data/User/GameConfig/GXME52.ini +++ b/Data/Sys/GameSettings/G3DP6L.ini @@ -1,12 +1,12 @@ -# GXME52 - X-Men3 V6 +# G3DP6L - Carmen Sandiego [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GQCS52.ini b/Data/Sys/GameSettings/G3DX6L.ini similarity index 89% rename from Data/User/GameConfig/GQCS52.ini rename to Data/Sys/GameSettings/G3DX6L.ini index 6f13ad7dbb..3c8f04b0d3 100644 --- a/Data/User/GameConfig/GQCS52.ini +++ b/Data/Sys/GameSettings/G3DX6L.ini @@ -1,7 +1,8 @@ -# GQCS52 - Call of Duty 2: Big Red One +# G3DX6L - Carmen Sandiego [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/G3EE51.ini b/Data/Sys/GameSettings/G3EE51.ini similarity index 80% rename from Data/User/GameConfig/G3EE51.ini rename to Data/Sys/GameSettings/G3EE51.ini index e0cf383a4c..35bfeae250 100644 --- a/Data/User/GameConfig/G3EE51.ini +++ b/Data/Sys/GameSettings/G3EE51.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Black screen. Use an older rev for the game to work like r4727 (r6521 tested) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/G3FE69.ini b/Data/Sys/GameSettings/G3FE69.ini similarity index 100% rename from Data/User/GameConfig/G3FE69.ini rename to Data/Sys/GameSettings/G3FE69.ini diff --git a/Data/User/GameConfig/G3FF69.ini b/Data/Sys/GameSettings/G3FF69.ini similarity index 100% rename from Data/User/GameConfig/G3FF69.ini rename to Data/Sys/GameSettings/G3FF69.ini diff --git a/Data/User/GameConfig/G3FP69.ini b/Data/Sys/GameSettings/G3FP69.ini similarity index 100% rename from Data/User/GameConfig/G3FP69.ini rename to Data/Sys/GameSettings/G3FP69.ini diff --git a/Data/User/GameConfig/G3JEAF.ini b/Data/Sys/GameSettings/G3JEAF.ini similarity index 100% rename from Data/User/GameConfig/G3JEAF.ini rename to Data/Sys/GameSettings/G3JEAF.ini diff --git a/Data/User/GameConfig/G3LE8P.ini b/Data/Sys/GameSettings/G3LE8P.ini similarity index 100% rename from Data/User/GameConfig/G3LE8P.ini rename to Data/Sys/GameSettings/G3LE8P.ini diff --git a/Data/User/GameConfig/G3NJDA.ini b/Data/Sys/GameSettings/G3NJDA.ini similarity index 100% rename from Data/User/GameConfig/G3NJDA.ini rename to Data/Sys/GameSettings/G3NJDA.ini diff --git a/Data/User/GameConfig/G3QEA4.ini b/Data/Sys/GameSettings/G3QEA4.ini similarity index 100% rename from Data/User/GameConfig/G3QEA4.ini rename to Data/Sys/GameSettings/G3QEA4.ini diff --git a/Data/User/GameConfig/G3RD52.ini b/Data/Sys/GameSettings/G3RD52.ini similarity index 75% rename from Data/User/GameConfig/G3RD52.ini rename to Data/Sys/GameSettings/G3RD52.ini index 2e41000378..d0e8dc2a5b 100644 --- a/Data/User/GameConfig/G3RD52.ini +++ b/Data/Sys/GameSettings/G3RD52.ini @@ -19,10 +19,13 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/G3RE52.ini b/Data/Sys/GameSettings/G3RE52.ini similarity index 75% rename from Data/User/GameConfig/G3RE52.ini rename to Data/Sys/GameSettings/G3RE52.ini index ee31713e62..b0243deb6e 100644 --- a/Data/User/GameConfig/G3RE52.ini +++ b/Data/Sys/GameSettings/G3RE52.ini @@ -19,10 +19,13 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/G3RF52.ini b/Data/Sys/GameSettings/G3RF52.ini similarity index 75% rename from Data/User/GameConfig/G3RF52.ini rename to Data/Sys/GameSettings/G3RF52.ini index c1da8b1690..b93c834149 100644 --- a/Data/User/GameConfig/G3RF52.ini +++ b/Data/Sys/GameSettings/G3RF52.ini @@ -19,10 +19,13 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/G3RP52.ini b/Data/Sys/GameSettings/G3RP52.ini similarity index 75% rename from Data/User/GameConfig/G3RP52.ini rename to Data/Sys/GameSettings/G3RP52.ini index 64782dcdb7..b57bcca357 100644 --- a/Data/User/GameConfig/G3RP52.ini +++ b/Data/Sys/GameSettings/G3RP52.ini @@ -19,10 +19,13 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/G3SE41.ini b/Data/Sys/GameSettings/G3SE41.ini similarity index 100% rename from Data/User/GameConfig/G3SE41.ini rename to Data/Sys/GameSettings/G3SE41.ini diff --git a/Data/User/GameConfig/G3VE69.ini b/Data/Sys/GameSettings/G3VE69.ini similarity index 100% rename from Data/User/GameConfig/G3VE69.ini rename to Data/Sys/GameSettings/G3VE69.ini diff --git a/Data/User/GameConfig/G3XE52.ini b/Data/Sys/GameSettings/G3XE52.ini similarity index 100% rename from Data/User/GameConfig/G3XE52.ini rename to Data/Sys/GameSettings/G3XE52.ini diff --git a/Data/User/GameConfig/G3XP52.ini b/Data/Sys/GameSettings/G3XP52.ini similarity index 100% rename from Data/User/GameConfig/G3XP52.ini rename to Data/Sys/GameSettings/G3XP52.ini diff --git a/Data/User/GameConfig/G4AEE9.ini b/Data/Sys/GameSettings/G4AEE9.ini similarity index 100% rename from Data/User/GameConfig/G4AEE9.ini rename to Data/Sys/GameSettings/G4AEE9.ini diff --git a/Data/User/GameConfig/G4BE08.ini b/Data/Sys/GameSettings/G4BE08.ini similarity index 100% rename from Data/User/GameConfig/G4BE08.ini rename to Data/Sys/GameSettings/G4BE08.ini diff --git a/Data/User/GameConfig/G4BP08.ini b/Data/Sys/GameSettings/G4BP08.ini similarity index 100% rename from Data/User/GameConfig/G4BP08.ini rename to Data/Sys/GameSettings/G4BP08.ini diff --git a/Data/User/GameConfig/G4CE54.ini b/Data/Sys/GameSettings/G4CE54.ini similarity index 100% rename from Data/User/GameConfig/G4CE54.ini rename to Data/Sys/GameSettings/G4CE54.ini diff --git a/Data/User/GameConfig/G4FD69.ini b/Data/Sys/GameSettings/G4FD69.ini similarity index 100% rename from Data/User/GameConfig/G4FD69.ini rename to Data/Sys/GameSettings/G4FD69.ini diff --git a/Data/User/GameConfig/G4FE69.ini b/Data/Sys/GameSettings/G4FE69.ini similarity index 100% rename from Data/User/GameConfig/G4FE69.ini rename to Data/Sys/GameSettings/G4FE69.ini diff --git a/Data/User/GameConfig/G4FF69.ini b/Data/Sys/GameSettings/G4FF69.ini similarity index 100% rename from Data/User/GameConfig/G4FF69.ini rename to Data/Sys/GameSettings/G4FF69.ini diff --git a/Data/User/GameConfig/G4FP69.ini b/Data/Sys/GameSettings/G4FP69.ini similarity index 100% rename from Data/User/GameConfig/G4FP69.ini rename to Data/Sys/GameSettings/G4FP69.ini diff --git a/Data/User/GameConfig/G4GEE9.ini b/Data/Sys/GameSettings/G4GEE9.ini similarity index 100% rename from Data/User/GameConfig/G4GEE9.ini rename to Data/Sys/GameSettings/G4GEE9.ini diff --git a/Data/User/GameConfig/G4ME69.ini b/Data/Sys/GameSettings/G4ME69.ini similarity index 100% rename from Data/User/GameConfig/G4ME69.ini rename to Data/Sys/GameSettings/G4ME69.ini diff --git a/Data/User/GameConfig/G4MP69.ini b/Data/Sys/GameSettings/G4MP69.ini similarity index 100% rename from Data/User/GameConfig/G4MP69.ini rename to Data/Sys/GameSettings/G4MP69.ini diff --git a/Data/User/GameConfig/G4NJDA.ini b/Data/Sys/GameSettings/G4NJDA.ini similarity index 100% rename from Data/User/GameConfig/G4NJDA.ini rename to Data/Sys/GameSettings/G4NJDA.ini diff --git a/Data/User/GameConfig/G4QE01.ini b/Data/Sys/GameSettings/G4QE01.ini similarity index 100% rename from Data/User/GameConfig/G4QE01.ini rename to Data/Sys/GameSettings/G4QE01.ini diff --git a/Data/User/GameConfig/R3RE8P.ini b/Data/Sys/GameSettings/G4QJ01.ini similarity index 85% rename from Data/User/GameConfig/R3RE8P.ini rename to Data/Sys/GameSettings/G4QJ01.ini index 9aad9d2413..ae95535e08 100644 --- a/Data/User/GameConfig/R3RE8P.ini +++ b/Data/Sys/GameSettings/G4QJ01.ini @@ -1,12 +1,13 @@ -# R3RE8P - Sonic & Sega All-Stars Racing +# G4QJ01 - Super Mario Strikers [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/G4QP01.ini b/Data/Sys/GameSettings/G4QP01.ini similarity index 100% rename from Data/User/GameConfig/G4QP01.ini rename to Data/Sys/GameSettings/G4QP01.ini diff --git a/Data/User/GameConfig/G4SE01.ini b/Data/Sys/GameSettings/G4SE01.ini similarity index 100% rename from Data/User/GameConfig/G4SE01.ini rename to Data/Sys/GameSettings/G4SE01.ini diff --git a/Data/User/GameConfig/G4SP01.ini b/Data/Sys/GameSettings/G4SP01.ini similarity index 100% rename from Data/User/GameConfig/G4SP01.ini rename to Data/Sys/GameSettings/G4SP01.ini diff --git a/Data/Sys/GameSettings/G4ZE69.ini b/Data/Sys/GameSettings/G4ZE69.ini new file mode 100644 index 0000000000..5bc646db5b --- /dev/null +++ b/Data/Sys/GameSettings/G4ZE69.ini @@ -0,0 +1,20 @@ +# G4ZE69 - The Sims 2 GameCube +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/G4ZP69.ini b/Data/Sys/GameSettings/G4ZP69.ini new file mode 100644 index 0000000000..43b31ae338 --- /dev/null +++ b/Data/Sys/GameSettings/G4ZP69.ini @@ -0,0 +1,20 @@ +# G4ZP69 - The Sims 2 GameCube +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/User/GameConfig/G5DE78.ini b/Data/Sys/GameSettings/G5DE78.ini similarity index 100% rename from Data/User/GameConfig/G5DE78.ini rename to Data/Sys/GameSettings/G5DE78.ini diff --git a/Data/User/GameConfig/G5DP78.ini b/Data/Sys/GameSettings/G5DP78.ini similarity index 100% rename from Data/User/GameConfig/G5DP78.ini rename to Data/Sys/GameSettings/G5DP78.ini diff --git a/Data/Sys/GameSettings/G5NEAF.ini b/Data/Sys/GameSettings/G5NEAF.ini new file mode 100644 index 0000000000..b8c392bcd9 --- /dev/null +++ b/Data/Sys/GameSettings/G5NEAF.ini @@ -0,0 +1,31 @@ +# G5NEAF - Namco Museum 50th Anniversary + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/G5NP69.ini b/Data/Sys/GameSettings/G5NP69.ini new file mode 100644 index 0000000000..775070cc3f --- /dev/null +++ b/Data/Sys/GameSettings/G5NP69.ini @@ -0,0 +1,31 @@ +# G5NP69 - Namco Museum 50th Anniversary + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/G5SE7D.ini b/Data/Sys/GameSettings/G5SE7D.ini similarity index 100% rename from Data/User/GameConfig/G5SE7D.ini rename to Data/Sys/GameSettings/G5SE7D.ini diff --git a/Data/User/GameConfig/G5SP7D.ini b/Data/Sys/GameSettings/G5SP7D.ini similarity index 100% rename from Data/User/GameConfig/G5SP7D.ini rename to Data/Sys/GameSettings/G5SP7D.ini diff --git a/Data/User/GameConfig/RM3P01.ini b/Data/Sys/GameSettings/G5TE69.ini similarity index 77% rename from Data/User/GameConfig/RM3P01.ini rename to Data/Sys/GameSettings/G5TE69.ini index b2ef0382d8..58b5724821 100644 --- a/Data/User/GameConfig/RM3P01.ini +++ b/Data/Sys/GameSettings/G5TE69.ini @@ -1,12 +1,13 @@ -# RM3P01 - Metroid Prime 3: Corruption +# G5TE69 - Tiger Woods PGA TOUR 2005 [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = EmulationStateId = 4 -EmulationIssues = minor coloring problems [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,12 +26,9 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False + [Video_Settings] SafeTextureCacheColorSamples = 512 - -[Video_Hacks] -EFBEmulateFormatChanges = True - -[Speedhacks] -0x804e8b20=600 - diff --git a/Data/Sys/GameSettings/G5TP69.ini b/Data/Sys/GameSettings/G5TP69.ini new file mode 100644 index 0000000000..0f6c6542f5 --- /dev/null +++ b/Data/Sys/GameSettings/G5TP69.ini @@ -0,0 +1,34 @@ +# G5TP69 - Tiger Woods PGA TOUR 2005 + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False + +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/G63E41.ini b/Data/Sys/GameSettings/G63E41.ini similarity index 100% rename from Data/User/GameConfig/G63E41.ini rename to Data/Sys/GameSettings/G63E41.ini diff --git a/Data/User/GameConfig/G63P41.ini b/Data/Sys/GameSettings/G63P41.ini similarity index 100% rename from Data/User/GameConfig/G63P41.ini rename to Data/Sys/GameSettings/G63P41.ini diff --git a/Data/User/GameConfig/G6FE69.ini b/Data/Sys/GameSettings/G6FE69.ini similarity index 100% rename from Data/User/GameConfig/G6FE69.ini rename to Data/Sys/GameSettings/G6FE69.ini diff --git a/Data/User/GameConfig/G6NE69.ini b/Data/Sys/GameSettings/G6NE69.ini similarity index 100% rename from Data/User/GameConfig/G6NE69.ini rename to Data/Sys/GameSettings/G6NE69.ini diff --git a/Data/User/GameConfig/G6NP69.ini b/Data/Sys/GameSettings/G6NP69.ini similarity index 100% rename from Data/User/GameConfig/G6NP69.ini rename to Data/Sys/GameSettings/G6NP69.ini diff --git a/Data/User/GameConfig/G6QE08.ini b/Data/Sys/GameSettings/G6QE08.ini similarity index 100% rename from Data/User/GameConfig/G6QE08.ini rename to Data/Sys/GameSettings/G6QE08.ini diff --git a/Data/User/GameConfig/G6TE5G.ini b/Data/Sys/GameSettings/G6TE5G.ini similarity index 100% rename from Data/User/GameConfig/G6TE5G.ini rename to Data/Sys/GameSettings/G6TE5G.ini diff --git a/Data/User/GameConfig/G6TP5G.ini b/Data/Sys/GameSettings/G6TP5G.ini similarity index 100% rename from Data/User/GameConfig/G6TP5G.ini rename to Data/Sys/GameSettings/G6TP5G.ini diff --git a/Data/Sys/GameSettings/G6WE69.ini b/Data/Sys/GameSettings/G6WE69.ini new file mode 100644 index 0000000000..f621c8367f --- /dev/null +++ b/Data/Sys/GameSettings/G6WE69.ini @@ -0,0 +1,31 @@ +# G6WE69 - Tiger Woods PGA TOUR 06 + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/G6WP69.ini b/Data/Sys/GameSettings/G6WP69.ini new file mode 100644 index 0000000000..179f8cdd0d --- /dev/null +++ b/Data/Sys/GameSettings/G6WP69.ini @@ -0,0 +1,31 @@ +# G6WP69 - Tiger Woods PGA TOUR 06 + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/G89EAF.ini b/Data/Sys/GameSettings/G89EAF.ini similarity index 100% rename from Data/User/GameConfig/G89EAF.ini rename to Data/Sys/GameSettings/G89EAF.ini diff --git a/Data/User/GameConfig/G8FE8P.ini b/Data/Sys/GameSettings/G8FE8P.ini similarity index 100% rename from Data/User/GameConfig/G8FE8P.ini rename to Data/Sys/GameSettings/G8FE8P.ini diff --git a/Data/User/GameConfig/G8ME01.ini b/Data/Sys/GameSettings/G8ME01.ini similarity index 100% rename from Data/User/GameConfig/G8ME01.ini rename to Data/Sys/GameSettings/G8ME01.ini diff --git a/Data/User/GameConfig/G8MJ01.ini b/Data/Sys/GameSettings/G8MJ01.ini similarity index 100% rename from Data/User/GameConfig/G8MJ01.ini rename to Data/Sys/GameSettings/G8MJ01.ini diff --git a/Data/User/GameConfig/G8MP01.ini b/Data/Sys/GameSettings/G8MP01.ini similarity index 100% rename from Data/User/GameConfig/G8MP01.ini rename to Data/Sys/GameSettings/G8MP01.ini diff --git a/Data/User/GameConfig/G8OJ18.ini b/Data/Sys/GameSettings/G8OJ18.ini similarity index 100% rename from Data/User/GameConfig/G8OJ18.ini rename to Data/Sys/GameSettings/G8OJ18.ini diff --git a/Data/User/GameConfig/G8SJAF.ini b/Data/Sys/GameSettings/G8SJAF.ini similarity index 100% rename from Data/User/GameConfig/G8SJAF.ini rename to Data/Sys/GameSettings/G8SJAF.ini diff --git a/Data/Sys/GameSettings/G8WE01.ini b/Data/Sys/GameSettings/G8WE01.ini new file mode 100644 index 0000000000..26566ee6fb --- /dev/null +++ b/Data/Sys/GameSettings/G8WE01.ini @@ -0,0 +1,27 @@ +# G8WE01 - Battalion Wars + +[Core] +# Values set here will override the main dolphin settings. +SkipIdle = False + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Idle skipping slows down the game. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/G8WP01.ini b/Data/Sys/GameSettings/G8WP01.ini new file mode 100644 index 0000000000..c8701e66c6 --- /dev/null +++ b/Data/Sys/GameSettings/G8WP01.ini @@ -0,0 +1,32 @@ +# G8WP01 - Battalion Wars + +[Core] +# Values set here will override the main dolphin settings. +SkipIdle = False + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Idle skipping slows down the game. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. +$Invincible +0752E977 08000000 +04338650 00000001 +$Infinite Time +0752E978 08000000 + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/G9BEE9.ini b/Data/Sys/GameSettings/G9BEE9.ini similarity index 100% rename from Data/User/GameConfig/G9BEE9.ini rename to Data/Sys/GameSettings/G9BEE9.ini diff --git a/Data/User/GameConfig/G9RE7D.ini b/Data/Sys/GameSettings/G9RE7D.ini similarity index 100% rename from Data/User/GameConfig/G9RE7D.ini rename to Data/Sys/GameSettings/G9RE7D.ini diff --git a/Data/User/GameConfig/G9SE8P.ini b/Data/Sys/GameSettings/G9SE8P.ini similarity index 100% rename from Data/User/GameConfig/G9SE8P.ini rename to Data/Sys/GameSettings/G9SE8P.ini diff --git a/Data/User/GameConfig/G9SJ8P.ini b/Data/Sys/GameSettings/G9SJ8P.ini similarity index 100% rename from Data/User/GameConfig/G9SJ8P.ini rename to Data/Sys/GameSettings/G9SJ8P.ini diff --git a/Data/User/GameConfig/G9SP8P.ini b/Data/Sys/GameSettings/G9SP8P.ini similarity index 100% rename from Data/User/GameConfig/G9SP8P.ini rename to Data/Sys/GameSettings/G9SP8P.ini diff --git a/Data/User/GameConfig/G9TD52.ini b/Data/Sys/GameSettings/G9TD52.ini similarity index 100% rename from Data/User/GameConfig/G9TD52.ini rename to Data/Sys/GameSettings/G9TD52.ini diff --git a/Data/User/GameConfig/G9TE52.ini b/Data/Sys/GameSettings/G9TE52.ini similarity index 100% rename from Data/User/GameConfig/G9TE52.ini rename to Data/Sys/GameSettings/G9TE52.ini diff --git a/Data/User/GameConfig/G9TF52.ini b/Data/Sys/GameSettings/G9TF52.ini similarity index 100% rename from Data/User/GameConfig/G9TF52.ini rename to Data/Sys/GameSettings/G9TF52.ini diff --git a/Data/User/GameConfig/G9TI52.ini b/Data/Sys/GameSettings/G9TI52.ini similarity index 100% rename from Data/User/GameConfig/G9TI52.ini rename to Data/Sys/GameSettings/G9TI52.ini diff --git a/Data/User/GameConfig/G9TP52.ini b/Data/Sys/GameSettings/G9TP52.ini similarity index 100% rename from Data/User/GameConfig/G9TP52.ini rename to Data/Sys/GameSettings/G9TP52.ini diff --git a/Data/User/GameConfig/GA2E51.ini b/Data/Sys/GameSettings/GA2E51.ini similarity index 100% rename from Data/User/GameConfig/GA2E51.ini rename to Data/Sys/GameSettings/GA2E51.ini diff --git a/Data/User/GameConfig/GA3E51.ini b/Data/Sys/GameSettings/GA3E51.ini similarity index 100% rename from Data/User/GameConfig/GA3E51.ini rename to Data/Sys/GameSettings/GA3E51.ini diff --git a/Data/User/GameConfig/GA4E51.ini b/Data/Sys/GameSettings/GA4E51.ini similarity index 100% rename from Data/User/GameConfig/GA4E51.ini rename to Data/Sys/GameSettings/GA4E51.ini diff --git a/Data/User/GameConfig/GA7E70.ini b/Data/Sys/GameSettings/GA7E70.ini similarity index 100% rename from Data/User/GameConfig/GA7E70.ini rename to Data/Sys/GameSettings/GA7E70.ini diff --git a/Data/User/GameConfig/GABEAF.ini b/Data/Sys/GameSettings/GABEAF.ini similarity index 100% rename from Data/User/GameConfig/GABEAF.ini rename to Data/Sys/GameSettings/GABEAF.ini diff --git a/Data/User/GameConfig/GACE5H.ini b/Data/Sys/GameSettings/GACE5H.ini similarity index 100% rename from Data/User/GameConfig/GACE5H.ini rename to Data/Sys/GameSettings/GACE5H.ini diff --git a/Data/User/GameConfig/GAFE01.ini b/Data/Sys/GameSettings/GAFE01.ini similarity index 100% rename from Data/User/GameConfig/GAFE01.ini rename to Data/Sys/GameSettings/GAFE01.ini diff --git a/Data/User/GameConfig/GAFJ01.ini b/Data/Sys/GameSettings/GAFJ01.ini similarity index 100% rename from Data/User/GameConfig/GAFJ01.ini rename to Data/Sys/GameSettings/GAFJ01.ini diff --git a/Data/User/GameConfig/GAFP01.ini b/Data/Sys/GameSettings/GAFP01.ini similarity index 100% rename from Data/User/GameConfig/GAFP01.ini rename to Data/Sys/GameSettings/GAFP01.ini diff --git a/Data/User/GameConfig/GAFU01.ini b/Data/Sys/GameSettings/GAFU01.ini similarity index 100% rename from Data/User/GameConfig/GAFU01.ini rename to Data/Sys/GameSettings/GAFU01.ini diff --git a/Data/User/GameConfig/GAGP70.ini b/Data/Sys/GameSettings/GAGP70.ini similarity index 100% rename from Data/User/GameConfig/GAGP70.ini rename to Data/Sys/GameSettings/GAGP70.ini diff --git a/Data/User/GameConfig/GAHEGG.ini b/Data/Sys/GameSettings/GAHEGG.ini similarity index 89% rename from Data/User/GameConfig/GAHEGG.ini rename to Data/Sys/GameSettings/GAHEGG.ini index d9a68ec612..b45dd0fb0b 100644 --- a/Data/User/GameConfig/GAHEGG.ini +++ b/Data/Sys/GameSettings/GAHEGG.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use direct3d11 or opengl (r7473). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/Sys/GameSettings/GAKE5D.ini b/Data/Sys/GameSettings/GAKE5D.ini new file mode 100644 index 0000000000..cb4e4fe176 --- /dev/null +++ b/Data/Sys/GameSettings/GAKE5D.ini @@ -0,0 +1,23 @@ +# GAKE5D - Midway Arcade Treasures + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +SafeTextureCacheColorSamples = 0 + diff --git a/Data/Sys/GameSettings/GALE01.ini b/Data/Sys/GameSettings/GALE01.ini new file mode 100644 index 0000000000..0792d7b99c --- /dev/null +++ b/Data/Sys/GameSettings/GALE01.ini @@ -0,0 +1,27 @@ +# GALE01 - Super Smash Bros Melee + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +EFBScale = -1 + diff --git a/Data/User/GameConfig/GALE01.ini b/Data/Sys/GameSettings/GALE01r0.ini similarity index 90% rename from Data/User/GameConfig/GALE01.ini rename to Data/Sys/GameSettings/GALE01r0.ini index 6125386d86..98e9fd62b8 100644 --- a/Data/User/GameConfig/GALE01.ini +++ b/Data/Sys/GameSettings/GALE01r0.ini @@ -1,19 +1,3 @@ -# GALE01 - Super Smash Bros Melee - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 -EmulationIssues = - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] # Add action replay cheats here. $All 293 trophies @@ -215,14 +199,3 @@ $player 3 gets two AI clones. $player 4 gets two AI clones. 04002F0C 00000002 -[Video] -ProjectionHack = 0 -PH_SZNear = 0 -PH_SZFar = 0 -PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - -[Video_Settings] -EFBScale = -1 - diff --git a/Data/Sys/GameSettings/GALE01r2.ini b/Data/Sys/GameSettings/GALE01r2.ini new file mode 100644 index 0000000000..23ac9d8928 --- /dev/null +++ b/Data/Sys/GameSettings/GALE01r2.ini @@ -0,0 +1,183 @@ +[ActionReplay] +$Global Melee Netplay Settings +0445BF28 FFFFFFFF +0445BF2C FFFFFFFF +0045C370 000000FF +0045BF12 00000001 +0045BF18 00000008 +0045BF14 00000004 +0045BF18 00000008 +041A45A0 3C000202 +041A45A4 901E0000 +0422D638 38000006 +0416B480 60000000 +0445C388 470000B0 +0445C20C 39400000 +0245C390 00030000 +0445C0D4 01010100 +0045C110 00000001 +0445C230 10000000 +0045C114 00000027 +0445C228 80000000 +0045C22C 00001111 +$Items Off +0045C370 000000FF +$Game Mode Stock +0045BF12 00000001 +$4 Stocks +0045BF14 00000004 +$Stock Match Time Limit 8 Mins +0045BF18 00000008 +$Boot to Character Select [Internet Explorer] +041A45A0 3C000202 +041A45A4 901E0000 +$Debug Menu +0422D638 38000006 +$C-Stick in Single Player [Zauron] +0416B480 60000000 +$Disable Peach's Castle Bullets [Zauron] +041CD8A8 4E800020 +$Disable Brinstar's Rising Lava [Zauron] +041D99E0 4E800020 +$Disable Dreamland's Wind [Zauron] +04211444 60000000 +$Disable Platforms on FoD [Zauron] +041CC8AC FC000028 +041CC8B4 4800013C +$Disable Corneria's Arwings [Zauron] +041DDA48 60000000 +$No Great Fox Guns [Zauron] +041E1390 40800430 +$Disable Green Greens Blocks [Zauron] +042146EC 60000000 +04216B24 60000000 +$Disable Green Greens Tree Stuff [Zauron] +04213C10 4E800020 +$Disable Pokemon Stadium Transformations [Zauron] +041D1548 60000000 +$Disable Yoshi's Story Shyguys [Zauron] +041E3348 60000000 +$DisableSpecialMessages [NMN] +04173EEC 4E800020 +0415D8E0 4E800020 +04005778 4E800020 +0415D934 38000000 +0415D9BC 38600000 +04005780 48000014 +042FE918 4E800020 +$Flash on L Cancel [Internet Explorer] +0408D6A0 48519A60 +045A7100 C00600E8 +045A7104 39E000D4 +045A7108 99E30564 +045A710C 4BAE6598 +040C0148 484E6FC8 +045A7110 387F0488 +045A7114 89FE0564 +045A7118 2C0F00D4 +045A711C 41820008 +045A7120 4BB1902C +045A7124 39E00091 +045A7128 99FE0564 +045A712C 3DE0C200 +045A7130 91FE0518 +045A7134 91FE051C +045A7138 91FE0520 +045A713C 91FE0524 +045A7140 3DE0C280 +045A7144 91FE0534 +045A7148 4BB19008 +$Input Delay Tester [Internet Explorer] +3C608047 60639C3C +80630000 3C80805A +60847D00 3CA080BD +60A5A4A0 80050000 +2C000000 418200DC +80A50000 546007BD +408200B4 54600739 +408200B8 80040000 +2C000000 418200BC +38C00000 90C50564 +80E40004 2C070000 +41820054 48000004 +5460077B 40820008 +48000024 7CE83B78 +2C080014 41800008 +39000000 3CC08045 +60C630E0 B1060000 +48000004 38E70001 +2C07001E 4080000C +90E40004 48000064 +38E00000 90E40004 +48000058 3CC0437F +90C50518 90C50524 +38C00000 90C5051C +90C50520 90C50528 +90C5052C 90C50530 +90C50534 3CC08000 +60C60091 90C50564 +4BFFFF80 38000001 +90040000 4BFFFF5C +38000000 90040000 +90040004 48000004 +7C0802A6 00000000 +$Widescreen Support v1.2 [Internet Explorer] +04BDC5E4 3FCFC217 +$Netplay Safe Kill Music [JMC47] +024D3886 00000000 +$Tournament Stages Only for Random +0445C388 47000090 +$Tournament Stages Only for Random Full +0445C388 47000030 +$TrueSpecialMessageDelete [JMC47] +0445C20C 39400000 +0245C390 00030000 +0445C0D4 01010100 +0045C110 00000001 +0445C230 10000000 +0045C114 00000027 +0445C228 80000000 +0045C22C 00001111 +[Gecko] +$InputDelayTester [Internet Explorer] +C2390CFC 00000021 +3C608047 60639C3C +80630000 3C80805A +60847D00 3CA080BD +60A5A4A0 80050000 +2C000000 418200DC +80A50000 546007BD +408200B4 54600739 +408200B8 80040000 +2C000000 418200BC +38C00000 90C50564 +80E40004 2C070000 +41820054 48000004 +5460077B 40820008 +48000024 7CE83B78 +2C080014 41800008 +39000000 3CC08045 +60C630E0 B1060000 +48000004 38E70001 +2C07001E 4080000C +90E40004 48000064 +38E00000 90E40004 +48000058 3CC0437F +90C50518 90C50524 +38C00000 90C5051C +90C50520 90C50528 +90C5052C 90C50530 +90C50534 3CC08000 +60C60091 90C50564 +4BFFFF80 38000001 +90040000 4BFFFF5C +38000000 90040000 +90040004 48000004 +7C0802A6 00000000 +$True Widescreen Support [Internet Explorer] +C236A4A8 00000005 +C03F0034 3C004080 +90010030 3C004040 +90010034 C0010030 +EC210032 C0010034 + diff --git a/Data/User/GameConfig/GALJ01.ini b/Data/Sys/GameSettings/GALJ01.ini similarity index 100% rename from Data/User/GameConfig/GALJ01.ini rename to Data/Sys/GameSettings/GALJ01.ini diff --git a/Data/User/GameConfig/GALP01.ini b/Data/Sys/GameSettings/GALP01.ini similarity index 100% rename from Data/User/GameConfig/GALP01.ini rename to Data/Sys/GameSettings/GALP01.ini diff --git a/Data/User/GameConfig/GAME5H.ini b/Data/Sys/GameSettings/GAME5H.ini similarity index 100% rename from Data/User/GameConfig/GAME5H.ini rename to Data/Sys/GameSettings/GAME5H.ini diff --git a/Data/User/GameConfig/GANE7U.ini b/Data/Sys/GameSettings/GANE7U.ini similarity index 100% rename from Data/User/GameConfig/GANE7U.ini rename to Data/Sys/GameSettings/GANE7U.ini diff --git a/Data/User/GameConfig/GAPE52.ini b/Data/Sys/GameSettings/GAPE52.ini similarity index 77% rename from Data/User/GameConfig/GAPE52.ini rename to Data/Sys/GameSettings/GAPE52.ini index 335256cdb8..57a072f564 100644 --- a/Data/User/GameConfig/GAPE52.ini +++ b/Data/Sys/GameSettings/GAPE52.ini @@ -6,8 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues="Graphics Glitches" -EmulationIssues = Stuck at loading screen +EmulationIssues = Needs real xfb for the videos to show up. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -18,3 +17,6 @@ EmulationIssues = Stuck at loading screen [ActionReplay] # Add action replay cheats here. +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GAQE6S.ini b/Data/Sys/GameSettings/GAQE6S.ini similarity index 100% rename from Data/User/GameConfig/GAQE6S.ini rename to Data/Sys/GameSettings/GAQE6S.ini diff --git a/Data/User/GameConfig/GARE5H.ini b/Data/Sys/GameSettings/GARE5H.ini similarity index 100% rename from Data/User/GameConfig/GARE5H.ini rename to Data/Sys/GameSettings/GARE5H.ini diff --git a/Data/User/GameConfig/GATE51.ini b/Data/Sys/GameSettings/GATE51.ini similarity index 100% rename from Data/User/GameConfig/GATE51.ini rename to Data/Sys/GameSettings/GATE51.ini diff --git a/Data/User/GameConfig/GATP51.ini b/Data/Sys/GameSettings/GATP51.ini similarity index 100% rename from Data/User/GameConfig/GATP51.ini rename to Data/Sys/GameSettings/GATP51.ini diff --git a/Data/User/GameConfig/GAUE08.ini b/Data/Sys/GameSettings/GAUE08.ini similarity index 100% rename from Data/User/GameConfig/GAUE08.ini rename to Data/Sys/GameSettings/GAUE08.ini diff --git a/Data/User/GameConfig/GAUJ08.ini b/Data/Sys/GameSettings/GAUJ08.ini similarity index 100% rename from Data/User/GameConfig/GAUJ08.ini rename to Data/Sys/GameSettings/GAUJ08.ini diff --git a/Data/User/GameConfig/GAVE78.ini b/Data/Sys/GameSettings/GAVE78.ini similarity index 100% rename from Data/User/GameConfig/GAVE78.ini rename to Data/Sys/GameSettings/GAVE78.ini diff --git a/Data/User/GameConfig/GAVP78.ini b/Data/Sys/GameSettings/GAVP78.ini similarity index 100% rename from Data/User/GameConfig/GAVP78.ini rename to Data/Sys/GameSettings/GAVP78.ini diff --git a/Data/User/GameConfig/GAVY78.ini b/Data/Sys/GameSettings/GAVY78.ini similarity index 100% rename from Data/User/GameConfig/GAVY78.ini rename to Data/Sys/GameSettings/GAVY78.ini diff --git a/Data/User/GameConfig/GAXE5D.ini b/Data/Sys/GameSettings/GAXE5D.ini similarity index 100% rename from Data/User/GameConfig/GAXE5D.ini rename to Data/Sys/GameSettings/GAXE5D.ini diff --git a/Data/Sys/GameSettings/GAYE5D.ini b/Data/Sys/GameSettings/GAYE5D.ini new file mode 100644 index 0000000000..2574e01f7c --- /dev/null +++ b/Data/Sys/GameSettings/GAYE5D.ini @@ -0,0 +1,24 @@ +# GAYE5D - Midway Arcade Treasures 2 + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +SafeTextureCacheColorSamples = 0 +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GAZD69.ini b/Data/Sys/GameSettings/GAZD69.ini similarity index 100% rename from Data/User/GameConfig/GAZD69.ini rename to Data/Sys/GameSettings/GAZD69.ini diff --git a/Data/User/GameConfig/GAZE69.ini b/Data/Sys/GameSettings/GAZE69.ini similarity index 100% rename from Data/User/GameConfig/GAZE69.ini rename to Data/Sys/GameSettings/GAZE69.ini diff --git a/Data/User/GameConfig/GAZF69.ini b/Data/Sys/GameSettings/GAZF69.ini similarity index 100% rename from Data/User/GameConfig/GAZF69.ini rename to Data/Sys/GameSettings/GAZF69.ini diff --git a/Data/User/GameConfig/GAZH69.ini b/Data/Sys/GameSettings/GAZH69.ini similarity index 100% rename from Data/User/GameConfig/GAZH69.ini rename to Data/Sys/GameSettings/GAZH69.ini diff --git a/Data/User/GameConfig/GAZI69.ini b/Data/Sys/GameSettings/GAZI69.ini similarity index 100% rename from Data/User/GameConfig/GAZI69.ini rename to Data/Sys/GameSettings/GAZI69.ini diff --git a/Data/User/GameConfig/GAZJ69.ini b/Data/Sys/GameSettings/GAZJ69.ini similarity index 100% rename from Data/User/GameConfig/GAZJ69.ini rename to Data/Sys/GameSettings/GAZJ69.ini diff --git a/Data/User/GameConfig/GAZM69.ini b/Data/Sys/GameSettings/GAZM69.ini similarity index 100% rename from Data/User/GameConfig/GAZM69.ini rename to Data/Sys/GameSettings/GAZM69.ini diff --git a/Data/User/GameConfig/GAZP69.ini b/Data/Sys/GameSettings/GAZP69.ini similarity index 100% rename from Data/User/GameConfig/GAZP69.ini rename to Data/Sys/GameSettings/GAZP69.ini diff --git a/Data/User/GameConfig/GAZS69.ini b/Data/Sys/GameSettings/GAZS69.ini similarity index 100% rename from Data/User/GameConfig/GAZS69.ini rename to Data/Sys/GameSettings/GAZS69.ini diff --git a/Data/User/GameConfig/GB3E51.ini b/Data/Sys/GameSettings/GB3E51.ini similarity index 100% rename from Data/User/GameConfig/GB3E51.ini rename to Data/Sys/GameSettings/GB3E51.ini diff --git a/Data/User/GameConfig/GB4E51.ini b/Data/Sys/GameSettings/GB4E51.ini similarity index 100% rename from Data/User/GameConfig/GB4E51.ini rename to Data/Sys/GameSettings/GB4E51.ini diff --git a/Data/User/GameConfig/GB4P51.ini b/Data/Sys/GameSettings/GB4P51.ini similarity index 100% rename from Data/User/GameConfig/GB4P51.ini rename to Data/Sys/GameSettings/GB4P51.ini diff --git a/Data/User/GameConfig/GBDE5G.ini b/Data/Sys/GameSettings/GBDE5G.ini similarity index 100% rename from Data/User/GameConfig/GBDE5G.ini rename to Data/Sys/GameSettings/GBDE5G.ini diff --git a/Data/User/GameConfig/GBDS7D.ini b/Data/Sys/GameSettings/GBDS7D.ini similarity index 100% rename from Data/User/GameConfig/GBDS7D.ini rename to Data/Sys/GameSettings/GBDS7D.ini diff --git a/Data/User/GameConfig/GBFE70.ini b/Data/Sys/GameSettings/GBFE70.ini similarity index 100% rename from Data/User/GameConfig/GBFE70.ini rename to Data/Sys/GameSettings/GBFE70.ini diff --git a/Data/User/GameConfig/GBGE5G.ini b/Data/Sys/GameSettings/GBGE5G.ini similarity index 100% rename from Data/User/GameConfig/GBGE5G.ini rename to Data/Sys/GameSettings/GBGE5G.ini diff --git a/Data/User/GameConfig/GBGP7D.ini b/Data/Sys/GameSettings/GBGP7D.ini similarity index 100% rename from Data/User/GameConfig/GBGP7D.ini rename to Data/Sys/GameSettings/GBGP7D.ini diff --git a/Data/User/GameConfig/GBHDC8.ini b/Data/Sys/GameSettings/GBHDC8.ini similarity index 100% rename from Data/User/GameConfig/GBHDC8.ini rename to Data/Sys/GameSettings/GBHDC8.ini diff --git a/Data/User/GameConfig/GBHEC8.ini b/Data/Sys/GameSettings/GBHEC8.ini similarity index 100% rename from Data/User/GameConfig/GBHEC8.ini rename to Data/Sys/GameSettings/GBHEC8.ini diff --git a/Data/User/GameConfig/GBHFC8.ini b/Data/Sys/GameSettings/GBHFC8.ini similarity index 100% rename from Data/User/GameConfig/GBHFC8.ini rename to Data/Sys/GameSettings/GBHFC8.ini diff --git a/Data/User/GameConfig/GBHPC8.ini b/Data/Sys/GameSettings/GBHPC8.ini similarity index 100% rename from Data/User/GameConfig/GBHPC8.ini rename to Data/Sys/GameSettings/GBHPC8.ini diff --git a/Data/User/GameConfig/GBIE08.ini b/Data/Sys/GameSettings/GBIE08.ini similarity index 100% rename from Data/User/GameConfig/GBIE08.ini rename to Data/Sys/GameSettings/GBIE08.ini diff --git a/Data/User/GameConfig/GBIP08.ini b/Data/Sys/GameSettings/GBIP08.ini similarity index 100% rename from Data/User/GameConfig/GBIP08.ini rename to Data/Sys/GameSettings/GBIP08.ini diff --git a/Data/User/GameConfig/GBKE70.ini b/Data/Sys/GameSettings/GBKE70.ini similarity index 100% rename from Data/User/GameConfig/GBKE70.ini rename to Data/Sys/GameSettings/GBKE70.ini diff --git a/Data/User/GameConfig/GBLE52.ini b/Data/Sys/GameSettings/GBLE52.ini similarity index 100% rename from Data/User/GameConfig/GBLE52.ini rename to Data/Sys/GameSettings/GBLE52.ini diff --git a/Data/User/GameConfig/GBLP52.ini b/Data/Sys/GameSettings/GBLP52.ini similarity index 100% rename from Data/User/GameConfig/GBLP52.ini rename to Data/Sys/GameSettings/GBLP52.ini diff --git a/Data/User/GameConfig/GBLPGL.ini b/Data/Sys/GameSettings/GBLPGL.ini similarity index 100% rename from Data/User/GameConfig/GBLPGL.ini rename to Data/Sys/GameSettings/GBLPGL.ini diff --git a/Data/User/GameConfig/GBME7F.ini b/Data/Sys/GameSettings/GBME7F.ini similarity index 97% rename from Data/User/GameConfig/GBME7F.ini rename to Data/Sys/GameSettings/GBME7F.ini index 77aa5998d6..2ceb9e6650 100644 --- a/Data/User/GameConfig/GBME7F.ini +++ b/Data/Sys/GameSettings/GBME7F.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/Sys/GameSettings/GBMJ28.ini b/Data/Sys/GameSettings/GBMJ28.ini new file mode 100644 index 0000000000..e9464090c4 --- /dev/null +++ b/Data/Sys/GameSettings/GBMJ28.ini @@ -0,0 +1,31 @@ +# GBMJ28 - BATMAN: DARK TOMORROW + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GBMP7F.ini b/Data/Sys/GameSettings/GBMP7F.ini similarity index 97% rename from Data/User/GameConfig/GBMP7F.ini rename to Data/Sys/GameSettings/GBMP7F.ini index e2eb90fe8d..bd5c9bfe5e 100644 --- a/Data/User/GameConfig/GBMP7F.ini +++ b/Data/Sys/GameSettings/GBMP7F.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/GBOP51.ini b/Data/Sys/GameSettings/GBOP51.ini similarity index 100% rename from Data/User/GameConfig/GBOP51.ini rename to Data/Sys/GameSettings/GBOP51.ini diff --git a/Data/User/GameConfig/GBQE78.ini b/Data/Sys/GameSettings/GBQE78.ini similarity index 100% rename from Data/User/GameConfig/GBQE78.ini rename to Data/Sys/GameSettings/GBQE78.ini diff --git a/Data/User/GameConfig/GBSE8P.ini b/Data/Sys/GameSettings/GBSE8P.ini similarity index 100% rename from Data/User/GameConfig/GBSE8P.ini rename to Data/Sys/GameSettings/GBSE8P.ini diff --git a/Data/User/GameConfig/GBSP8P.ini b/Data/Sys/GameSettings/GBSP8P.ini similarity index 100% rename from Data/User/GameConfig/GBSP8P.ini rename to Data/Sys/GameSettings/GBSP8P.ini diff --git a/Data/User/GameConfig/GBTE70.ini b/Data/Sys/GameSettings/GBTE70.ini similarity index 100% rename from Data/User/GameConfig/GBTE70.ini rename to Data/Sys/GameSettings/GBTE70.ini diff --git a/Data/User/GameConfig/GBVE41.ini b/Data/Sys/GameSettings/GBVE41.ini similarity index 100% rename from Data/User/GameConfig/GBVE41.ini rename to Data/Sys/GameSettings/GBVE41.ini diff --git a/Data/User/GameConfig/GBVP41.ini b/Data/Sys/GameSettings/GBVP41.ini similarity index 100% rename from Data/User/GameConfig/GBVP41.ini rename to Data/Sys/GameSettings/GBVP41.ini diff --git a/Data/User/GameConfig/GBWD64.ini b/Data/Sys/GameSettings/GBWD64.ini similarity index 100% rename from Data/User/GameConfig/GBWD64.ini rename to Data/Sys/GameSettings/GBWD64.ini diff --git a/Data/User/GameConfig/GBWE64.ini b/Data/Sys/GameSettings/GBWE64.ini similarity index 100% rename from Data/User/GameConfig/GBWE64.ini rename to Data/Sys/GameSettings/GBWE64.ini diff --git a/Data/User/GameConfig/GBWF64.ini b/Data/Sys/GameSettings/GBWF64.ini similarity index 100% rename from Data/User/GameConfig/GBWF64.ini rename to Data/Sys/GameSettings/GBWF64.ini diff --git a/Data/User/GameConfig/GBWP64.ini b/Data/Sys/GameSettings/GBWP64.ini similarity index 100% rename from Data/User/GameConfig/GBWP64.ini rename to Data/Sys/GameSettings/GBWP64.ini diff --git a/Data/User/GameConfig/GBXE51.ini b/Data/Sys/GameSettings/GBXE51.ini similarity index 100% rename from Data/User/GameConfig/GBXE51.ini rename to Data/Sys/GameSettings/GBXE51.ini diff --git a/Data/User/GameConfig/GBYE0A.ini b/Data/Sys/GameSettings/GBYE0A.ini similarity index 100% rename from Data/User/GameConfig/GBYE0A.ini rename to Data/Sys/GameSettings/GBYE0A.ini diff --git a/Data/User/GameConfig/GBZE08.ini b/Data/Sys/GameSettings/GBZE08.ini similarity index 100% rename from Data/User/GameConfig/GBZE08.ini rename to Data/Sys/GameSettings/GBZE08.ini diff --git a/Data/User/GameConfig/GBZP08.ini b/Data/Sys/GameSettings/GBZP08.ini similarity index 100% rename from Data/User/GameConfig/GBZP08.ini rename to Data/Sys/GameSettings/GBZP08.ini diff --git a/Data/User/GameConfig/GC2E9G.ini b/Data/Sys/GameSettings/GC2E9G.ini similarity index 100% rename from Data/User/GameConfig/GC2E9G.ini rename to Data/Sys/GameSettings/GC2E9G.ini diff --git a/Data/User/GameConfig/GC3D78.ini b/Data/Sys/GameSettings/GC3D78.ini similarity index 100% rename from Data/User/GameConfig/GC3D78.ini rename to Data/Sys/GameSettings/GC3D78.ini diff --git a/Data/User/GameConfig/GC3E78.ini b/Data/Sys/GameSettings/GC3E78.ini similarity index 100% rename from Data/User/GameConfig/GC3E78.ini rename to Data/Sys/GameSettings/GC3E78.ini diff --git a/Data/User/GameConfig/GC3F78.ini b/Data/Sys/GameSettings/GC3F78.ini similarity index 100% rename from Data/User/GameConfig/GC3F78.ini rename to Data/Sys/GameSettings/GC3F78.ini diff --git a/Data/User/GameConfig/GC3P78.ini b/Data/Sys/GameSettings/GC3P78.ini similarity index 100% rename from Data/User/GameConfig/GC3P78.ini rename to Data/Sys/GameSettings/GC3P78.ini diff --git a/Data/User/GameConfig/GC4JBN.ini b/Data/Sys/GameSettings/GC4JBN.ini similarity index 100% rename from Data/User/GameConfig/GC4JBN.ini rename to Data/Sys/GameSettings/GC4JBN.ini diff --git a/Data/User/GameConfig/GC5PNK.ini b/Data/Sys/GameSettings/GC5PNK.ini similarity index 100% rename from Data/User/GameConfig/GC5PNK.ini rename to Data/Sys/GameSettings/GC5PNK.ini diff --git a/Data/User/GameConfig/GC6E01.ini b/Data/Sys/GameSettings/GC6E01.ini similarity index 100% rename from Data/User/GameConfig/GC6E01.ini rename to Data/Sys/GameSettings/GC6E01.ini diff --git a/Data/User/GameConfig/GC6P01.ini b/Data/Sys/GameSettings/GC6P01.ini similarity index 100% rename from Data/User/GameConfig/GC6P01.ini rename to Data/Sys/GameSettings/GC6P01.ini diff --git a/Data/User/GameConfig/GC7PNK.ini b/Data/Sys/GameSettings/GC7PNK.ini similarity index 100% rename from Data/User/GameConfig/GC7PNK.ini rename to Data/Sys/GameSettings/GC7PNK.ini diff --git a/Data/User/GameConfig/GC9P6S.ini b/Data/Sys/GameSettings/GC9P6S.ini similarity index 100% rename from Data/User/GameConfig/GC9P6S.ini rename to Data/Sys/GameSettings/GC9P6S.ini diff --git a/Data/User/GameConfig/GCAE5H.ini b/Data/Sys/GameSettings/GCAE5H.ini similarity index 100% rename from Data/User/GameConfig/GCAE5H.ini rename to Data/Sys/GameSettings/GCAE5H.ini diff --git a/Data/User/GameConfig/GCBE7D.ini b/Data/Sys/GameSettings/GCBE7D.ini similarity index 100% rename from Data/User/GameConfig/GCBE7D.ini rename to Data/Sys/GameSettings/GCBE7D.ini diff --git a/Data/User/GameConfig/GCBP7D.ini b/Data/Sys/GameSettings/GCBP7D.ini similarity index 100% rename from Data/User/GameConfig/GCBP7D.ini rename to Data/Sys/GameSettings/GCBP7D.ini diff --git a/Data/User/GameConfig/GCCE01.ini b/Data/Sys/GameSettings/GCCE01.ini similarity index 100% rename from Data/User/GameConfig/GCCE01.ini rename to Data/Sys/GameSettings/GCCE01.ini diff --git a/Data/User/GameConfig/RM3E01.ini b/Data/Sys/GameSettings/GCCJ01.ini similarity index 92% rename from Data/User/GameConfig/RM3E01.ini rename to Data/Sys/GameSettings/GCCJ01.ini index 17e1a38619..b755e51275 100644 --- a/Data/User/GameConfig/RM3E01.ini +++ b/Data/Sys/GameSettings/GCCJ01.ini @@ -1,4 +1,4 @@ -# RM3E01 - Metroid Prime 3: Corruption +# GCCJ01 - FINAL FANTASY Crystal Chronicles [Core] # Values set here will override the main dolphin settings. diff --git a/Data/User/GameConfig/RM3J01.ini b/Data/Sys/GameSettings/GCCJGC.ini similarity index 92% rename from Data/User/GameConfig/RM3J01.ini rename to Data/Sys/GameSettings/GCCJGC.ini index e8abfbb96c..99b8a2ee9d 100644 --- a/Data/User/GameConfig/RM3J01.ini +++ b/Data/Sys/GameSettings/GCCJGC.ini @@ -1,4 +1,4 @@ -# RM3J01 - Metroid Prime 3: Corruption +# GCCJGC - FINAL FANTASY Crystal Chronicles [Core] # Values set here will override the main dolphin settings. @@ -30,4 +30,3 @@ SafeTextureCacheColorSamples = 512 [Video_Hacks] EFBEmulateFormatChanges = True - diff --git a/Data/User/GameConfig/GCCP01.ini b/Data/Sys/GameSettings/GCCP01.ini similarity index 100% rename from Data/User/GameConfig/GCCP01.ini rename to Data/Sys/GameSettings/GCCP01.ini diff --git a/Data/Sys/GameSettings/GCDE08.ini b/Data/Sys/GameSettings/GCDE08.ini new file mode 100644 index 0000000000..a4a19a33f1 --- /dev/null +++ b/Data/Sys/GameSettings/GCDE08.ini @@ -0,0 +1,26 @@ +# GCDE08 - RESIDENT EVIL CVX + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Per pixel lighting creates some lighting issues. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +SafeTextureCacheColorSamples = 512 +EnablePixelLighting = False diff --git a/Data/Sys/GameSettings/GCDJ08.ini b/Data/Sys/GameSettings/GCDJ08.ini new file mode 100644 index 0000000000..2c5909a40a --- /dev/null +++ b/Data/Sys/GameSettings/GCDJ08.ini @@ -0,0 +1,26 @@ +# GCDJ08 - Biohazard: Code Veronica + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Per pixel lighting creates some lighting issues. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +SafeTextureCacheColorSamples = 512 +EnablePixelLighting = False diff --git a/Data/User/GameConfig/GCDP08.ini b/Data/Sys/GameSettings/GCDP08.ini similarity index 63% rename from Data/User/GameConfig/GCDP08.ini rename to Data/Sys/GameSettings/GCDP08.ini index 19004249fc..c5ce39cdd5 100644 --- a/Data/User/GameConfig/GCDP08.ini +++ b/Data/Sys/GameSettings/GCDP08.ini @@ -6,6 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 +EmulationIssues = Per pixel lighting creates some lighting issues. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -16,3 +17,10 @@ EmulationStateId = 3 [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +SafeTextureCacheColorSamples = 512 +EnablePixelLighting = False diff --git a/Data/User/GameConfig/GCEE41.ini b/Data/Sys/GameSettings/GCEE41.ini similarity index 97% rename from Data/User/GameConfig/GCEE41.ini rename to Data/Sys/GameSettings/GCEE41.ini index a9e3e13ca3..37e171c52a 100644 --- a/Data/User/GameConfig/GCEE41.ini +++ b/Data/Sys/GameSettings/GCEE41.ini @@ -16,4 +16,3 @@ PH_ZFar = [Video_Settings] UseXFB = True UseRealXFB = True -[Gecko] diff --git a/Data/User/GameConfig/GCEP41.ini b/Data/Sys/GameSettings/GCEP41.ini similarity index 97% rename from Data/User/GameConfig/GCEP41.ini rename to Data/Sys/GameSettings/GCEP41.ini index 5385275894..e049fe69ba 100644 --- a/Data/User/GameConfig/GCEP41.ini +++ b/Data/Sys/GameSettings/GCEP41.ini @@ -16,4 +16,3 @@ PH_ZFar = [Video_Settings] UseXFB = True UseRealXFB = True -[Gecko] diff --git a/Data/User/GameConfig/GCFE9G.ini b/Data/Sys/GameSettings/GCFE9G.ini similarity index 100% rename from Data/User/GameConfig/GCFE9G.ini rename to Data/Sys/GameSettings/GCFE9G.ini diff --git a/Data/User/GameConfig/GCGE41.ini b/Data/Sys/GameSettings/GCGE41.ini similarity index 100% rename from Data/User/GameConfig/GCGE41.ini rename to Data/Sys/GameSettings/GCGE41.ini diff --git a/Data/User/GameConfig/GCHE78.ini b/Data/Sys/GameSettings/GCHE78.ini similarity index 100% rename from Data/User/GameConfig/GCHE78.ini rename to Data/Sys/GameSettings/GCHE78.ini diff --git a/Data/Sys/GameSettings/GCIE69.ini b/Data/Sys/GameSettings/GCIE69.ini new file mode 100644 index 0000000000..f2ac2b7cfc --- /dev/null +++ b/Data/Sys/GameSettings/GCIE69.ini @@ -0,0 +1,17 @@ +# GCIE69 - The Sims +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/Sys/GameSettings/GCIP69.ini b/Data/Sys/GameSettings/GCIP69.ini new file mode 100644 index 0000000000..0f69c3638e --- /dev/null +++ b/Data/Sys/GameSettings/GCIP69.ini @@ -0,0 +1,17 @@ +# GCIP69 - The Sims +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/GCJE41.ini b/Data/Sys/GameSettings/GCJE41.ini similarity index 100% rename from Data/User/GameConfig/GCJE41.ini rename to Data/Sys/GameSettings/GCJE41.ini diff --git a/Data/User/GameConfig/GCJP41.ini b/Data/Sys/GameSettings/GCJP41.ini similarity index 100% rename from Data/User/GameConfig/GCJP41.ini rename to Data/Sys/GameSettings/GCJP41.ini diff --git a/Data/User/GameConfig/GCLP69.ini b/Data/Sys/GameSettings/GCLP69.ini similarity index 100% rename from Data/User/GameConfig/GCLP69.ini rename to Data/Sys/GameSettings/GCLP69.ini diff --git a/Data/User/GameConfig/GCNE7D.ini b/Data/Sys/GameSettings/GCNE7D.ini similarity index 100% rename from Data/User/GameConfig/GCNE7D.ini rename to Data/Sys/GameSettings/GCNE7D.ini diff --git a/Data/User/GameConfig/GCNP7D.ini b/Data/Sys/GameSettings/GCNP7D.ini similarity index 100% rename from Data/User/GameConfig/GCNP7D.ini rename to Data/Sys/GameSettings/GCNP7D.ini diff --git a/Data/User/GameConfig/GCOE52.ini b/Data/Sys/GameSettings/GCOE52.ini similarity index 100% rename from Data/User/GameConfig/GCOE52.ini rename to Data/Sys/GameSettings/GCOE52.ini diff --git a/Data/User/GameConfig/GCOPDV.ini b/Data/Sys/GameSettings/GCOPDV.ini similarity index 100% rename from Data/User/GameConfig/GCOPDV.ini rename to Data/Sys/GameSettings/GCOPDV.ini diff --git a/Data/User/GameConfig/GCPE6S.ini b/Data/Sys/GameSettings/GCPE6S.ini similarity index 100% rename from Data/User/GameConfig/GCPE6S.ini rename to Data/Sys/GameSettings/GCPE6S.ini diff --git a/Data/User/GameConfig/GCPP6S.ini b/Data/Sys/GameSettings/GCPP6S.ini similarity index 100% rename from Data/User/GameConfig/GCPP6S.ini rename to Data/Sys/GameSettings/GCPP6S.ini diff --git a/Data/User/GameConfig/GCQE7D.ini b/Data/Sys/GameSettings/GCQE7D.ini similarity index 100% rename from Data/User/GameConfig/GCQE7D.ini rename to Data/Sys/GameSettings/GCQE7D.ini diff --git a/Data/User/GameConfig/GCQP7D.ini b/Data/Sys/GameSettings/GCQP7D.ini similarity index 100% rename from Data/User/GameConfig/GCQP7D.ini rename to Data/Sys/GameSettings/GCQP7D.ini diff --git a/Data/User/GameConfig/GCSEAF.ini b/Data/Sys/GameSettings/GCSEAF.ini similarity index 100% rename from Data/User/GameConfig/GCSEAF.ini rename to Data/Sys/GameSettings/GCSEAF.ini diff --git a/Data/User/GameConfig/GCTE51.ini b/Data/Sys/GameSettings/GCTE51.ini similarity index 100% rename from Data/User/GameConfig/GCTE51.ini rename to Data/Sys/GameSettings/GCTE51.ini diff --git a/Data/User/GameConfig/GCTP51.ini b/Data/Sys/GameSettings/GCTP51.ini similarity index 100% rename from Data/User/GameConfig/GCTP51.ini rename to Data/Sys/GameSettings/GCTP51.ini diff --git a/Data/User/GameConfig/GCVEEB.ini b/Data/Sys/GameSettings/GCVEEB.ini similarity index 100% rename from Data/User/GameConfig/GCVEEB.ini rename to Data/Sys/GameSettings/GCVEEB.ini diff --git a/Data/User/GameConfig/GCZE69.ini b/Data/Sys/GameSettings/GCZE69.ini similarity index 100% rename from Data/User/GameConfig/GCZE69.ini rename to Data/Sys/GameSettings/GCZE69.ini diff --git a/Data/User/GameConfig/GCZP69.ini b/Data/Sys/GameSettings/GCZP69.ini similarity index 100% rename from Data/User/GameConfig/GCZP69.ini rename to Data/Sys/GameSettings/GCZP69.ini diff --git a/Data/User/GameConfig/GD4E6S.ini b/Data/Sys/GameSettings/GD4E6S.ini similarity index 100% rename from Data/User/GameConfig/GD4E6S.ini rename to Data/Sys/GameSettings/GD4E6S.ini diff --git a/Data/User/GameConfig/GD6EB2.ini b/Data/Sys/GameSettings/GD6EB2.ini similarity index 100% rename from Data/User/GameConfig/GD6EB2.ini rename to Data/Sys/GameSettings/GD6EB2.ini diff --git a/Data/User/GameConfig/GD6P70.ini b/Data/Sys/GameSettings/GD6P70.ini similarity index 100% rename from Data/User/GameConfig/GD6P70.ini rename to Data/Sys/GameSettings/GD6P70.ini diff --git a/Data/User/GameConfig/GD7PB2.ini b/Data/Sys/GameSettings/GD7PB2.ini similarity index 100% rename from Data/User/GameConfig/GD7PB2.ini rename to Data/Sys/GameSettings/GD7PB2.ini diff --git a/Data/User/GameConfig/GD9E69.ini b/Data/Sys/GameSettings/GD9E69.ini similarity index 100% rename from Data/User/GameConfig/GD9E69.ini rename to Data/Sys/GameSettings/GD9E69.ini diff --git a/Data/User/GameConfig/GD9P69.ini b/Data/Sys/GameSettings/GD9P69.ini similarity index 100% rename from Data/User/GameConfig/GD9P69.ini rename to Data/Sys/GameSettings/GD9P69.ini diff --git a/Data/User/GameConfig/GDDE41.ini b/Data/Sys/GameSettings/GDDE41.ini similarity index 100% rename from Data/User/GameConfig/GDDE41.ini rename to Data/Sys/GameSettings/GDDE41.ini diff --git a/Data/User/GameConfig/GDEE71.ini b/Data/Sys/GameSettings/GDEE71.ini similarity index 100% rename from Data/User/GameConfig/GDEE71.ini rename to Data/Sys/GameSettings/GDEE71.ini diff --git a/Data/User/GameConfig/GDFE5D.ini b/Data/Sys/GameSettings/GDFE5D.ini similarity index 100% rename from Data/User/GameConfig/GDFE5D.ini rename to Data/Sys/GameSettings/GDFE5D.ini diff --git a/Data/User/GameConfig/GDFP5D.ini b/Data/Sys/GameSettings/GDFP5D.ini similarity index 100% rename from Data/User/GameConfig/GDFP5D.ini rename to Data/Sys/GameSettings/GDFP5D.ini diff --git a/Data/User/GameConfig/GDGE7H.ini b/Data/Sys/GameSettings/GDGE7H.ini similarity index 100% rename from Data/User/GameConfig/GDGE7H.ini rename to Data/Sys/GameSettings/GDGE7H.ini diff --git a/Data/User/GameConfig/GDGP78.ini b/Data/Sys/GameSettings/GDGP78.ini similarity index 100% rename from Data/User/GameConfig/GDGP78.ini rename to Data/Sys/GameSettings/GDGP78.ini diff --git a/Data/User/GameConfig/GDIE7D.ini b/Data/Sys/GameSettings/GDIE7D.ini similarity index 94% rename from Data/User/GameConfig/GDIE7D.ini rename to Data/Sys/GameSettings/GDIE7D.ini index f3b13a5944..ec7059a0bd 100644 --- a/Data/User/GameConfig/GDIE7D.ini +++ b/Data/Sys/GameSettings/GDIE7D.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/GDIP7D.ini b/Data/Sys/GameSettings/GDIP7D.ini similarity index 94% rename from Data/User/GameConfig/GDIP7D.ini rename to Data/Sys/GameSettings/GDIP7D.ini index fa48b8952f..8bf3c76095 100644 --- a/Data/User/GameConfig/GDIP7D.ini +++ b/Data/Sys/GameSettings/GDIP7D.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/GDJEB2.ini b/Data/Sys/GameSettings/GDJEB2.ini similarity index 100% rename from Data/User/GameConfig/GDJEB2.ini rename to Data/Sys/GameSettings/GDJEB2.ini diff --git a/Data/User/GameConfig/GDKEA4.ini b/Data/Sys/GameSettings/GDKEA4.ini similarity index 100% rename from Data/User/GameConfig/GDKEA4.ini rename to Data/Sys/GameSettings/GDKEA4.ini diff --git a/Data/User/GameConfig/GDLEA4.ini b/Data/Sys/GameSettings/GDLEA4.ini similarity index 100% rename from Data/User/GameConfig/GDLEA4.ini rename to Data/Sys/GameSettings/GDLEA4.ini diff --git a/Data/User/GameConfig/GDME01.ini b/Data/Sys/GameSettings/GDME01.ini similarity index 100% rename from Data/User/GameConfig/GDME01.ini rename to Data/Sys/GameSettings/GDME01.ini diff --git a/Data/User/GameConfig/GDQP6S.ini b/Data/Sys/GameSettings/GDQP6S.ini similarity index 100% rename from Data/User/GameConfig/GDQP6S.ini rename to Data/Sys/GameSettings/GDQP6S.ini diff --git a/Data/User/GameConfig/GDREAF.ini b/Data/Sys/GameSettings/GDREAF.ini similarity index 100% rename from Data/User/GameConfig/GDREAF.ini rename to Data/Sys/GameSettings/GDREAF.ini diff --git a/Data/User/GameConfig/GDSE78.ini b/Data/Sys/GameSettings/GDSE78.ini similarity index 100% rename from Data/User/GameConfig/GDSE78.ini rename to Data/Sys/GameSettings/GDSE78.ini diff --git a/Data/User/GameConfig/GDSP78.ini b/Data/Sys/GameSettings/GDSP78.ini similarity index 100% rename from Data/User/GameConfig/GDSP78.ini rename to Data/Sys/GameSettings/GDSP78.ini diff --git a/Data/User/GameConfig/GDTE69.ini b/Data/Sys/GameSettings/GDTE69.ini similarity index 100% rename from Data/User/GameConfig/GDTE69.ini rename to Data/Sys/GameSettings/GDTE69.ini diff --git a/Data/User/GameConfig/GDVE6L.ini b/Data/Sys/GameSettings/GDVE6L.ini similarity index 100% rename from Data/User/GameConfig/GDVE6L.ini rename to Data/Sys/GameSettings/GDVE6L.ini diff --git a/Data/User/GameConfig/GDVP6L.ini b/Data/Sys/GameSettings/GDVP6L.ini similarity index 100% rename from Data/User/GameConfig/GDVP6L.ini rename to Data/Sys/GameSettings/GDVP6L.ini diff --git a/Data/User/GameConfig/GDWEA4.ini b/Data/Sys/GameSettings/GDWEA4.ini similarity index 100% rename from Data/User/GameConfig/GDWEA4.ini rename to Data/Sys/GameSettings/GDWEA4.ini diff --git a/Data/Sys/GameSettings/GE3E5D.ini b/Data/Sys/GameSettings/GE3E5D.ini new file mode 100644 index 0000000000..f518a0b5af --- /dev/null +++ b/Data/Sys/GameSettings/GE3E5D.ini @@ -0,0 +1,31 @@ +# GE3E5D - Midway Arcade Treasures 3 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/GE4E7D.ini b/Data/Sys/GameSettings/GE4E7D.ini similarity index 100% rename from Data/User/GameConfig/GE4E7D.ini rename to Data/Sys/GameSettings/GE4E7D.ini diff --git a/Data/User/GameConfig/GE5EA4.ini b/Data/Sys/GameSettings/GE5EA4.ini similarity index 100% rename from Data/User/GameConfig/GE5EA4.ini rename to Data/Sys/GameSettings/GE5EA4.ini diff --git a/Data/User/GameConfig/GE9E5D.ini b/Data/Sys/GameSettings/GE9E5D.ini similarity index 88% rename from Data/User/GameConfig/GE9E5D.ini rename to Data/Sys/GameSettings/GE9E5D.ini index 82a11b476d..041e10157e 100644 --- a/Data/User/GameConfig/GE9E5D.ini +++ b/Data/Sys/GameSettings/GE9E5D.ini @@ -18,3 +18,6 @@ EmulationIssues = [ActionReplay] # Add action replay cheats here. +[Video_Settings] +SafeTextureCacheColorSamples = 512 + diff --git a/Data/User/GameConfig/GEAE8P.ini b/Data/Sys/GameSettings/GEAE8P.ini similarity index 86% rename from Data/User/GameConfig/GEAE8P.ini rename to Data/Sys/GameSettings/GEAE8P.ini index d8dc51fb1a..327d9974ac 100644 --- a/Data/User/GameConfig/GEAE8P.ini +++ b/Data/Sys/GameSettings/GEAE8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 -EmulationIssues = Gfx glitches. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -18,12 +18,12 @@ EmulationIssues = Gfx glitches. # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 1.99998 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GEAP8P.ini b/Data/Sys/GameSettings/GEAP8P.ini similarity index 86% rename from Data/User/GameConfig/GEAP8P.ini rename to Data/Sys/GameSettings/GEAP8P.ini index cb8347ffd4..3ad9bc241e 100644 --- a/Data/User/GameConfig/GEAP8P.ini +++ b/Data/Sys/GameSettings/GEAP8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 -EmulationIssues = Gfx glitches. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -18,12 +18,12 @@ EmulationIssues = Gfx glitches. # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 1.99998 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GEBEA4.ini b/Data/Sys/GameSettings/GEBEA4.ini similarity index 100% rename from Data/User/GameConfig/GEBEA4.ini rename to Data/Sys/GameSettings/GEBEA4.ini diff --git a/Data/User/GameConfig/GEDE01.ini b/Data/Sys/GameSettings/GEDE01.ini similarity index 91% rename from Data/User/GameConfig/GEDE01.ini rename to Data/Sys/GameSettings/GEDE01.ini index a5282053cd..752ec4c63d 100644 --- a/Data/User/GameConfig/GEDE01.ini +++ b/Data/Sys/GameSettings/GEDE01.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 5 -PH_ZFar = 0.15 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GEDP01.ini b/Data/Sys/GameSettings/GEDP01.ini similarity index 91% rename from Data/User/GameConfig/GEDP01.ini rename to Data/Sys/GameSettings/GEDP01.ini index caad9d1df8..6b7e9f15ac 100644 --- a/Data/User/GameConfig/GEDP01.ini +++ b/Data/Sys/GameSettings/GEDP01.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 5 -PH_ZFar = 0.15 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GEME7F.ini b/Data/Sys/GameSettings/GEME7F.ini similarity index 100% rename from Data/User/GameConfig/GEME7F.ini rename to Data/Sys/GameSettings/GEME7F.ini diff --git a/Data/User/GameConfig/GEND69.ini b/Data/Sys/GameSettings/GEND69.ini similarity index 100% rename from Data/User/GameConfig/GEND69.ini rename to Data/Sys/GameSettings/GEND69.ini diff --git a/Data/User/GameConfig/GENE69.ini b/Data/Sys/GameSettings/GENE69.ini similarity index 100% rename from Data/User/GameConfig/GENE69.ini rename to Data/Sys/GameSettings/GENE69.ini diff --git a/Data/User/GameConfig/GENP69.ini b/Data/Sys/GameSettings/GENP69.ini similarity index 100% rename from Data/User/GameConfig/GENP69.ini rename to Data/Sys/GameSettings/GENP69.ini diff --git a/Data/User/GameConfig/GENS69.ini b/Data/Sys/GameSettings/GENS69.ini similarity index 100% rename from Data/User/GameConfig/GENS69.ini rename to Data/Sys/GameSettings/GENS69.ini diff --git a/Data/User/GameConfig/GEOE08.ini b/Data/Sys/GameSettings/GEOE08.ini similarity index 100% rename from Data/User/GameConfig/GEOE08.ini rename to Data/Sys/GameSettings/GEOE08.ini diff --git a/Data/User/GameConfig/GEOP08.ini b/Data/Sys/GameSettings/GEOP08.ini similarity index 100% rename from Data/User/GameConfig/GEOP08.ini rename to Data/Sys/GameSettings/GEOP08.ini diff --git a/Data/User/GameConfig/GESEA4.ini b/Data/Sys/GameSettings/GESEA4.ini similarity index 100% rename from Data/User/GameConfig/GESEA4.ini rename to Data/Sys/GameSettings/GESEA4.ini diff --git a/Data/User/GameConfig/GEWE41.ini b/Data/Sys/GameSettings/GEWE41.ini similarity index 100% rename from Data/User/GameConfig/GEWE41.ini rename to Data/Sys/GameSettings/GEWE41.ini diff --git a/Data/User/GameConfig/GEXE52.ini b/Data/Sys/GameSettings/GEXE52.ini similarity index 100% rename from Data/User/GameConfig/GEXE52.ini rename to Data/Sys/GameSettings/GEXE52.ini diff --git a/Data/User/GameConfig/GEYE69.ini b/Data/Sys/GameSettings/GEYE69.ini similarity index 100% rename from Data/User/GameConfig/GEYE69.ini rename to Data/Sys/GameSettings/GEYE69.ini diff --git a/Data/User/GameConfig/GEZE8P.ini b/Data/Sys/GameSettings/GEZE8P.ini similarity index 100% rename from Data/User/GameConfig/GEZE8P.ini rename to Data/Sys/GameSettings/GEZE8P.ini diff --git a/Data/User/GameConfig/GEZP8P.ini b/Data/Sys/GameSettings/GEZP8P.ini similarity index 100% rename from Data/User/GameConfig/GEZP8P.ini rename to Data/Sys/GameSettings/GEZP8P.ini diff --git a/Data/User/GameConfig/GF2E69.ini b/Data/Sys/GameSettings/GF2E69.ini similarity index 100% rename from Data/User/GameConfig/GF2E69.ini rename to Data/Sys/GameSettings/GF2E69.ini diff --git a/Data/User/GameConfig/GF4E52.ini b/Data/Sys/GameSettings/GF4E52.ini similarity index 100% rename from Data/User/GameConfig/GF4E52.ini rename to Data/Sys/GameSettings/GF4E52.ini diff --git a/Data/User/GameConfig/GF4F52.ini b/Data/Sys/GameSettings/GF4F52.ini similarity index 100% rename from Data/User/GameConfig/GF4F52.ini rename to Data/Sys/GameSettings/GF4F52.ini diff --git a/Data/User/GameConfig/GF4P52.ini b/Data/Sys/GameSettings/GF4P52.ini similarity index 100% rename from Data/User/GameConfig/GF4P52.ini rename to Data/Sys/GameSettings/GF4P52.ini diff --git a/Data/User/GameConfig/GF5E69.ini b/Data/Sys/GameSettings/GF5E69.ini similarity index 100% rename from Data/User/GameConfig/GF5E69.ini rename to Data/Sys/GameSettings/GF5E69.ini diff --git a/Data/User/GameConfig/GF6E69.ini b/Data/Sys/GameSettings/GF6E69.ini similarity index 100% rename from Data/User/GameConfig/GF6E69.ini rename to Data/Sys/GameSettings/GF6E69.ini diff --git a/Data/User/GameConfig/GF6F69.ini b/Data/Sys/GameSettings/GF6F69.ini similarity index 100% rename from Data/User/GameConfig/GF6F69.ini rename to Data/Sys/GameSettings/GF6F69.ini diff --git a/Data/User/GameConfig/GF7E01.ini b/Data/Sys/GameSettings/GF7E01.ini similarity index 99% rename from Data/User/GameConfig/GF7E01.ini rename to Data/Sys/GameSettings/GF7E01.ini index b2cb1b820c..6a4e1e7dcc 100644 --- a/Data/User/GameConfig/GF7E01.ini +++ b/Data/Sys/GameSettings/GF7E01.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +EnableFPRF = True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/GF7P01.ini b/Data/Sys/GameSettings/GF7P01.ini similarity index 98% rename from Data/User/GameConfig/GF7P01.ini rename to Data/Sys/GameSettings/GF7P01.ini index edf4831056..5da4d712e3 100644 --- a/Data/User/GameConfig/GF7P01.ini +++ b/Data/Sys/GameSettings/GF7P01.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +EnableFPRF = True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/GF8E69.ini b/Data/Sys/GameSettings/GF8E69.ini similarity index 100% rename from Data/User/GameConfig/GF8E69.ini rename to Data/Sys/GameSettings/GF8E69.ini diff --git a/Data/User/GameConfig/GF8P69.ini b/Data/Sys/GameSettings/GF8P69.ini similarity index 100% rename from Data/User/GameConfig/GF8P69.ini rename to Data/Sys/GameSettings/GF8P69.ini diff --git a/Data/User/GameConfig/GFAD69.ini b/Data/Sys/GameSettings/GFAD69.ini similarity index 100% rename from Data/User/GameConfig/GFAD69.ini rename to Data/Sys/GameSettings/GFAD69.ini diff --git a/Data/User/GameConfig/GFAE69.ini b/Data/Sys/GameSettings/GFAE69.ini similarity index 100% rename from Data/User/GameConfig/GFAE69.ini rename to Data/Sys/GameSettings/GFAE69.ini diff --git a/Data/User/GameConfig/GFAP69.ini b/Data/Sys/GameSettings/GFAP69.ini similarity index 100% rename from Data/User/GameConfig/GFAP69.ini rename to Data/Sys/GameSettings/GFAP69.ini diff --git a/Data/User/GameConfig/GFAS69.ini b/Data/Sys/GameSettings/GFAS69.ini similarity index 100% rename from Data/User/GameConfig/GFAS69.ini rename to Data/Sys/GameSettings/GFAS69.ini diff --git a/Data/User/GameConfig/GFBE5D.ini b/Data/Sys/GameSettings/GFBE5D.ini similarity index 100% rename from Data/User/GameConfig/GFBE5D.ini rename to Data/Sys/GameSettings/GFBE5D.ini diff --git a/Data/User/GameConfig/GFCP69.ini b/Data/Sys/GameSettings/GFCP69.ini similarity index 100% rename from Data/User/GameConfig/GFCP69.ini rename to Data/Sys/GameSettings/GFCP69.ini diff --git a/Data/User/GameConfig/GFDD69.ini b/Data/Sys/GameSettings/GFDD69.ini similarity index 100% rename from Data/User/GameConfig/GFDD69.ini rename to Data/Sys/GameSettings/GFDD69.ini diff --git a/Data/User/GameConfig/GFDE69.ini b/Data/Sys/GameSettings/GFDE69.ini similarity index 100% rename from Data/User/GameConfig/GFDE69.ini rename to Data/Sys/GameSettings/GFDE69.ini diff --git a/Data/User/GameConfig/GFEE01.ini b/Data/Sys/GameSettings/GFEE01.ini similarity index 100% rename from Data/User/GameConfig/GFEE01.ini rename to Data/Sys/GameSettings/GFEE01.ini diff --git a/Data/User/GameConfig/GFEJ01.ini b/Data/Sys/GameSettings/GFEJ01.ini similarity index 100% rename from Data/User/GameConfig/GFEJ01.ini rename to Data/Sys/GameSettings/GFEJ01.ini diff --git a/Data/User/GameConfig/GFEP01.ini b/Data/Sys/GameSettings/GFEP01.ini similarity index 100% rename from Data/User/GameConfig/GFEP01.ini rename to Data/Sys/GameSettings/GFEP01.ini diff --git a/Data/User/GameConfig/GFFE5D.ini b/Data/Sys/GameSettings/GFFE5D.ini similarity index 100% rename from Data/User/GameConfig/GFFE5D.ini rename to Data/Sys/GameSettings/GFFE5D.ini diff --git a/Data/User/GameConfig/GFGEA4.ini b/Data/Sys/GameSettings/GFGEA4.ini similarity index 100% rename from Data/User/GameConfig/GFGEA4.ini rename to Data/Sys/GameSettings/GFGEA4.ini diff --git a/Data/User/GameConfig/GFHP6V.ini b/Data/Sys/GameSettings/GFHP6V.ini similarity index 100% rename from Data/User/GameConfig/GFHP6V.ini rename to Data/Sys/GameSettings/GFHP6V.ini diff --git a/Data/User/GameConfig/GFKE69.ini b/Data/Sys/GameSettings/GFKE69.ini similarity index 100% rename from Data/User/GameConfig/GFKE69.ini rename to Data/Sys/GameSettings/GFKE69.ini diff --git a/Data/User/GameConfig/GFPEA4.ini b/Data/Sys/GameSettings/GFPEA4.ini similarity index 100% rename from Data/User/GameConfig/GFPEA4.ini rename to Data/Sys/GameSettings/GFPEA4.ini diff --git a/Data/User/GameConfig/GFQEA4.ini b/Data/Sys/GameSettings/GFQEA4.ini similarity index 100% rename from Data/User/GameConfig/GFQEA4.ini rename to Data/Sys/GameSettings/GFQEA4.ini diff --git a/Data/User/GameConfig/GFTE01.ini b/Data/Sys/GameSettings/GFTE01.ini similarity index 100% rename from Data/User/GameConfig/GFTE01.ini rename to Data/Sys/GameSettings/GFTE01.ini diff --git a/Data/User/GameConfig/GFTP01.ini b/Data/Sys/GameSettings/GFTP01.ini similarity index 100% rename from Data/User/GameConfig/GFTP01.ini rename to Data/Sys/GameSettings/GFTP01.ini diff --git a/Data/User/GameConfig/GFUE4Z.ini b/Data/Sys/GameSettings/GFUE4Z.ini similarity index 100% rename from Data/User/GameConfig/GFUE4Z.ini rename to Data/Sys/GameSettings/GFUE4Z.ini diff --git a/Data/User/GameConfig/GYQP01.ini b/Data/Sys/GameSettings/GFUP6V.ini similarity index 90% rename from Data/User/GameConfig/GYQP01.ini rename to Data/Sys/GameSettings/GFUP6V.ini index 89f76c202c..314dba0bd6 100644 --- a/Data/User/GameConfig/GYQP01.ini +++ b/Data/Sys/GameSettings/GFUP6V.ini @@ -1,7 +1,8 @@ -# GYQP01 - MARIO SUPERSTAR BASEBALL +# GFUP6V - FutureTactics [Core] # Values set here will override the main dolphin settings. +TLBHack=1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/Sys/GameSettings/GFXE5D.ini b/Data/Sys/GameSettings/GFXE5D.ini new file mode 100644 index 0000000000..5a00719935 --- /dev/null +++ b/Data/Sys/GameSettings/GFXE5D.ini @@ -0,0 +1,19 @@ +# GFXE5D - Freestyle Metal X + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + diff --git a/Data/User/GameConfig/GFYE69.ini b/Data/Sys/GameSettings/GFYE69.ini similarity index 100% rename from Data/User/GameConfig/GFYE69.ini rename to Data/Sys/GameSettings/GFYE69.ini diff --git a/Data/User/GameConfig/GFYP69.ini b/Data/Sys/GameSettings/GFYP69.ini similarity index 100% rename from Data/User/GameConfig/GFYP69.ini rename to Data/Sys/GameSettings/GFYP69.ini diff --git a/Data/User/GameConfig/GFZE01.ini b/Data/Sys/GameSettings/GFZE01.ini similarity index 91% rename from Data/User/GameConfig/GFZE01.ini rename to Data/Sys/GameSettings/GFZE01.ini index dbdf33b12a..243b56928d 100644 --- a/Data/User/GameConfig/GFZE01.ini +++ b/Data/Sys/GameSettings/GFZE01.ini @@ -4,7 +4,6 @@ # Values set here will override the main dolphin settings. EnableFPRF = True TLBHack = 1 -SyncGPU = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -44,10 +43,9 @@ $All Vehicles Unlocked 840030C8 FFDC6F00 [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.7555555 - +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GFZJ01.ini b/Data/Sys/GameSettings/GFZJ01.ini similarity index 86% rename from Data/User/GameConfig/GFZJ01.ini rename to Data/Sys/GameSettings/GFZJ01.ini index 22a0191407..133fc21739 100644 --- a/Data/User/GameConfig/GFZJ01.ini +++ b/Data/Sys/GameSettings/GFZJ01.ini @@ -4,7 +4,6 @@ # Values set here will override the main dolphin settings. EnableFPRF = True TLBHack = 1 -SyncGPU = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -28,10 +27,10 @@ $Make Save Copyable 04C3110C 4B400410 [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.7555555 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GFZP01.ini b/Data/Sys/GameSettings/GFZP01.ini similarity index 86% rename from Data/User/GameConfig/GFZP01.ini rename to Data/Sys/GameSettings/GFZP01.ini index d14cc8a11d..0a8f8c1628 100644 --- a/Data/User/GameConfig/GFZP01.ini +++ b/Data/Sys/GameSettings/GFZP01.ini @@ -4,7 +4,6 @@ # Values set here will override the main dolphin settings. EnableFPRF = True TLBHack = 1 -SyncGPU = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -28,10 +27,10 @@ $Make Save Copyable 04C3110C 4B400410 [Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.7555555 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GG4E08.ini b/Data/Sys/GameSettings/GG4E08.ini similarity index 100% rename from Data/User/GameConfig/GG4E08.ini rename to Data/Sys/GameSettings/GG4E08.ini diff --git a/Data/User/GameConfig/GG4P08.ini b/Data/Sys/GameSettings/GG4P08.ini similarity index 100% rename from Data/User/GameConfig/GG4P08.ini rename to Data/Sys/GameSettings/GG4P08.ini diff --git a/Data/User/GameConfig/GG5E52.ini b/Data/Sys/GameSettings/GG5E52.ini similarity index 100% rename from Data/User/GameConfig/GG5E52.ini rename to Data/Sys/GameSettings/GG5E52.ini diff --git a/Data/User/GameConfig/GGAJB2.ini b/Data/Sys/GameSettings/GGAJB2.ini similarity index 100% rename from Data/User/GameConfig/GGAJB2.ini rename to Data/Sys/GameSettings/GGAJB2.ini diff --git a/Data/User/GameConfig/GGCE0A.ini b/Data/Sys/GameSettings/GGCE0A.ini similarity index 100% rename from Data/User/GameConfig/GGCE0A.ini rename to Data/Sys/GameSettings/GGCE0A.ini diff --git a/Data/User/GameConfig/GGCOSD.ini b/Data/Sys/GameSettings/GGCOSD.ini similarity index 100% rename from Data/User/GameConfig/GGCOSD.ini rename to Data/Sys/GameSettings/GGCOSD.ini diff --git a/Data/User/GameConfig/GGEE41.ini b/Data/Sys/GameSettings/GGEE41.ini similarity index 94% rename from Data/User/GameConfig/GGEE41.ini rename to Data/Sys/GameSettings/GGEE41.ini index 4f3fe0e90a..313ae3cdf3 100644 --- a/Data/User/GameConfig/GGEE41.ini +++ b/Data/Sys/GameSettings/GGEE41.ini @@ -26,7 +26,8 @@ PH_ZNear = PH_ZFar = [Video_Settings] -VSync = False +UseXFB = True +UseRealXFB = False [Video_Hacks] DlistCachingEnable = False diff --git a/Data/User/GameConfig/GGEP41.ini b/Data/Sys/GameSettings/GGEP41.ini similarity index 94% rename from Data/User/GameConfig/GGEP41.ini rename to Data/Sys/GameSettings/GGEP41.ini index c00f5cc92a..6ef2027d2a 100644 --- a/Data/User/GameConfig/GGEP41.ini +++ b/Data/Sys/GameSettings/GGEP41.ini @@ -26,7 +26,8 @@ PH_ZNear = PH_ZFar = [Video_Settings] -VSync = False +UseXFB = True +UseRealXFB = False [Video_Hacks] DlistCachingEnable = False diff --git a/Data/User/GameConfig/GGEY41.ini b/Data/Sys/GameSettings/GGEY41.ini similarity index 94% rename from Data/User/GameConfig/GGEY41.ini rename to Data/Sys/GameSettings/GGEY41.ini index 550c18e832..4f46c1c19d 100644 --- a/Data/User/GameConfig/GGEY41.ini +++ b/Data/Sys/GameSettings/GGEY41.ini @@ -26,7 +26,8 @@ PH_ZNear = PH_ZFar = [Video_Settings] -VSync = False +UseXFB = True +UseRealXFB = False [Video_Hacks] DlistCachingEnable = False diff --git a/Data/User/GameConfig/GGME00.ini b/Data/Sys/GameSettings/GGME00.ini similarity index 100% rename from Data/User/GameConfig/GGME00.ini rename to Data/Sys/GameSettings/GGME00.ini diff --git a/Data/Sys/GameSettings/GGNE5D.ini b/Data/Sys/GameSettings/GGNE5D.ini new file mode 100644 index 0000000000..6f147c3c03 --- /dev/null +++ b/Data/Sys/GameSettings/GGNE5D.ini @@ -0,0 +1,26 @@ +# GGNE5D - The Grim Adventures of Billy & Mandy + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GGPJB2.ini b/Data/Sys/GameSettings/GGPJB2.ini similarity index 100% rename from Data/User/GameConfig/GGPJB2.ini rename to Data/Sys/GameSettings/GGPJB2.ini diff --git a/Data/User/GameConfig/GGRE41.ini b/Data/Sys/GameSettings/GGRE41.ini similarity index 100% rename from Data/User/GameConfig/GGRE41.ini rename to Data/Sys/GameSettings/GGRE41.ini diff --git a/Data/User/GameConfig/GGSEA4.ini b/Data/Sys/GameSettings/GGSEA4.ini similarity index 100% rename from Data/User/GameConfig/GGSEA4.ini rename to Data/Sys/GameSettings/GGSEA4.ini diff --git a/Data/User/GameConfig/GGSJA4.ini b/Data/Sys/GameSettings/GGSJA4.ini similarity index 100% rename from Data/User/GameConfig/GGSJA4.ini rename to Data/Sys/GameSettings/GGSJA4.ini diff --git a/Data/User/GameConfig/GGSPA4.ini b/Data/Sys/GameSettings/GGSPA4.ini similarity index 100% rename from Data/User/GameConfig/GGSPA4.ini rename to Data/Sys/GameSettings/GGSPA4.ini diff --git a/Data/User/GameConfig/GGTE01.ini b/Data/Sys/GameSettings/GGTE01.ini similarity index 100% rename from Data/User/GameConfig/GGTE01.ini rename to Data/Sys/GameSettings/GGTE01.ini diff --git a/Data/User/GameConfig/GGTP01.ini b/Data/Sys/GameSettings/GGTP01.ini similarity index 100% rename from Data/User/GameConfig/GGTP01.ini rename to Data/Sys/GameSettings/GGTP01.ini diff --git a/Data/Sys/GameSettings/GGVD78.ini b/Data/Sys/GameSettings/GGVD78.ini new file mode 100644 index 0000000000..afa39b5ff4 --- /dev/null +++ b/Data/Sys/GameSettings/GGVD78.ini @@ -0,0 +1,18 @@ +# GGVD78 - The SpongeBob SquarePants Movie +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GGVE78.ini b/Data/Sys/GameSettings/GGVE78.ini new file mode 100644 index 0000000000..116dd30fe5 --- /dev/null +++ b/Data/Sys/GameSettings/GGVE78.ini @@ -0,0 +1,18 @@ +# GGVE78 - The SpongeBob SquarePants Movie +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GGVP78.ini b/Data/Sys/GameSettings/GGVP78.ini new file mode 100644 index 0000000000..13b6e320c6 --- /dev/null +++ b/Data/Sys/GameSettings/GGVP78.ini @@ -0,0 +1,18 @@ +# GGVP78 - The SpongeBob SquarePants Movie +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GGVX78.ini b/Data/Sys/GameSettings/GGVX78.ini new file mode 100644 index 0000000000..0c04afc3ac --- /dev/null +++ b/Data/Sys/GameSettings/GGVX78.ini @@ -0,0 +1,18 @@ +# GGVX78 - The SpongeBob SquarePants Movie +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GGYE41.ini b/Data/Sys/GameSettings/GGYE41.ini similarity index 100% rename from Data/User/GameConfig/GGYE41.ini rename to Data/Sys/GameSettings/GGYE41.ini diff --git a/Data/User/GameConfig/GGYP41.ini b/Data/Sys/GameSettings/GGYP41.ini similarity index 100% rename from Data/User/GameConfig/GGYP41.ini rename to Data/Sys/GameSettings/GGYP41.ini diff --git a/Data/User/GameConfig/GGZE52.ini b/Data/Sys/GameSettings/GGZE52.ini similarity index 100% rename from Data/User/GameConfig/GGZE52.ini rename to Data/Sys/GameSettings/GGZE52.ini diff --git a/Data/User/GameConfig/GGZX52.ini b/Data/Sys/GameSettings/GGZX52.ini similarity index 100% rename from Data/User/GameConfig/GGZX52.ini rename to Data/Sys/GameSettings/GGZX52.ini diff --git a/Data/User/GameConfig/GH2E69.ini b/Data/Sys/GameSettings/GH2E69.ini similarity index 100% rename from Data/User/GameConfig/GH2E69.ini rename to Data/Sys/GameSettings/GH2E69.ini diff --git a/Data/User/GameConfig/GH2P69.ini b/Data/Sys/GameSettings/GH2P69.ini similarity index 100% rename from Data/User/GameConfig/GH2P69.ini rename to Data/Sys/GameSettings/GH2P69.ini diff --git a/Data/User/GameConfig/GH4D69.ini b/Data/Sys/GameSettings/GH4D69.ini similarity index 100% rename from Data/User/GameConfig/GH4D69.ini rename to Data/Sys/GameSettings/GH4D69.ini diff --git a/Data/User/GameConfig/GH4E69.ini b/Data/Sys/GameSettings/GH4E69.ini similarity index 100% rename from Data/User/GameConfig/GH4E69.ini rename to Data/Sys/GameSettings/GH4E69.ini diff --git a/Data/User/GameConfig/GH4F69.ini b/Data/Sys/GameSettings/GH4F69.ini similarity index 100% rename from Data/User/GameConfig/GH4F69.ini rename to Data/Sys/GameSettings/GH4F69.ini diff --git a/Data/User/GameConfig/GH4H69.ini b/Data/Sys/GameSettings/GH4H69.ini similarity index 100% rename from Data/User/GameConfig/GH4H69.ini rename to Data/Sys/GameSettings/GH4H69.ini diff --git a/Data/User/GameConfig/GH4I69.ini b/Data/Sys/GameSettings/GH4I69.ini similarity index 100% rename from Data/User/GameConfig/GH4I69.ini rename to Data/Sys/GameSettings/GH4I69.ini diff --git a/Data/User/GameConfig/GH4J69.ini b/Data/Sys/GameSettings/GH4J69.ini similarity index 100% rename from Data/User/GameConfig/GH4J69.ini rename to Data/Sys/GameSettings/GH4J69.ini diff --git a/Data/User/GameConfig/GH4M69.ini b/Data/Sys/GameSettings/GH4M69.ini similarity index 100% rename from Data/User/GameConfig/GH4M69.ini rename to Data/Sys/GameSettings/GH4M69.ini diff --git a/Data/User/GameConfig/GH4P69.ini b/Data/Sys/GameSettings/GH4P69.ini similarity index 100% rename from Data/User/GameConfig/GH4P69.ini rename to Data/Sys/GameSettings/GH4P69.ini diff --git a/Data/User/GameConfig/GH4S69.ini b/Data/Sys/GameSettings/GH4S69.ini similarity index 100% rename from Data/User/GameConfig/GH4S69.ini rename to Data/Sys/GameSettings/GH4S69.ini diff --git a/Data/Sys/GameSettings/GH5D52.ini b/Data/Sys/GameSettings/GH5D52.ini new file mode 100644 index 0000000000..040418b60f --- /dev/null +++ b/Data/Sys/GameSettings/GH5D52.ini @@ -0,0 +1,19 @@ +# GH5D52 - Over The Hedge +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GH5E52.ini b/Data/Sys/GameSettings/GH5E52.ini similarity index 68% rename from Data/User/GameConfig/GH5E52.ini rename to Data/Sys/GameSettings/GH5E52.ini index fe65a456f9..8cecf42e83 100644 --- a/Data/User/GameConfig/GH5E52.ini +++ b/Data/Sys/GameSettings/GH5E52.ini @@ -1,19 +1,19 @@ # GH5E52 - Over The Hedge - [Core] # Values set here will override the main dolphin settings. - +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 -EmulationIssues = Black screen - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GH5F52.ini b/Data/Sys/GameSettings/GH5F52.ini new file mode 100644 index 0000000000..e7ccf2c149 --- /dev/null +++ b/Data/Sys/GameSettings/GH5F52.ini @@ -0,0 +1,19 @@ +# GH5F52 - Over The Hedge +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GH5P52.ini b/Data/Sys/GameSettings/GH5P52.ini new file mode 100644 index 0000000000..0bf2929baa --- /dev/null +++ b/Data/Sys/GameSettings/GH5P52.ini @@ -0,0 +1,19 @@ +# GH5P52 - Over The Hedge +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GH6EAF.ini b/Data/Sys/GameSettings/GH6EAF.ini similarity index 100% rename from Data/User/GameConfig/GH6EAF.ini rename to Data/Sys/GameSettings/GH6EAF.ini diff --git a/Data/User/GameConfig/GH7E5D.ini b/Data/Sys/GameSettings/GH7E5D.ini similarity index 100% rename from Data/User/GameConfig/GH7E5D.ini rename to Data/Sys/GameSettings/GH7E5D.ini diff --git a/Data/User/GameConfig/GHAE08.ini b/Data/Sys/GameSettings/GHAE08.ini similarity index 100% rename from Data/User/GameConfig/GHAE08.ini rename to Data/Sys/GameSettings/GHAE08.ini diff --git a/Data/User/GameConfig/GHAP08.ini b/Data/Sys/GameSettings/GHAP08.ini similarity index 100% rename from Data/User/GameConfig/GHAP08.ini rename to Data/Sys/GameSettings/GHAP08.ini diff --git a/Data/User/GameConfig/GHBE7D.ini b/Data/Sys/GameSettings/GHBE7D.ini similarity index 100% rename from Data/User/GameConfig/GHBE7D.ini rename to Data/Sys/GameSettings/GHBE7D.ini diff --git a/Data/User/GameConfig/GHBP7D.ini b/Data/Sys/GameSettings/GHBP7D.ini similarity index 100% rename from Data/User/GameConfig/GHBP7D.ini rename to Data/Sys/GameSettings/GHBP7D.ini diff --git a/Data/User/GameConfig/GHCE4Q.ini b/Data/Sys/GameSettings/GHCE4Q.ini similarity index 100% rename from Data/User/GameConfig/GHCE4Q.ini rename to Data/Sys/GameSettings/GHCE4Q.ini diff --git a/Data/User/GameConfig/GHCF4Q.ini b/Data/Sys/GameSettings/GHCF4Q.ini similarity index 100% rename from Data/User/GameConfig/GHCF4Q.ini rename to Data/Sys/GameSettings/GHCF4Q.ini diff --git a/Data/User/GameConfig/GHGEEB.ini b/Data/Sys/GameSettings/GHGEEB.ini similarity index 100% rename from Data/User/GameConfig/GHGEEB.ini rename to Data/Sys/GameSettings/GHGEEB.ini diff --git a/Data/Sys/GameSettings/GHKD7D.ini b/Data/Sys/GameSettings/GHKD7D.ini new file mode 100644 index 0000000000..a06d428aeb --- /dev/null +++ b/Data/Sys/GameSettings/GHKD7D.ini @@ -0,0 +1,21 @@ +# GHKD7D - The Hulk +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +SkipIdle = 0 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GHKE7D.ini b/Data/Sys/GameSettings/GHKE7D.ini new file mode 100644 index 0000000000..e0104edd44 --- /dev/null +++ b/Data/Sys/GameSettings/GHKE7D.ini @@ -0,0 +1,21 @@ +# GHKE7D - The Hulk +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +SkipIdle = 0 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GHKF7D.ini b/Data/Sys/GameSettings/GHKF7D.ini new file mode 100644 index 0000000000..f53526e33b --- /dev/null +++ b/Data/Sys/GameSettings/GHKF7D.ini @@ -0,0 +1,21 @@ +# GHKF7D - The Hulk +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +SkipIdle = 0 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GHKP7D.ini b/Data/Sys/GameSettings/GHKP7D.ini new file mode 100644 index 0000000000..cfd6bcc727 --- /dev/null +++ b/Data/Sys/GameSettings/GHKP7D.ini @@ -0,0 +1,21 @@ +# GHKP7D - The Hulk +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +SkipIdle = 0 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GHKS7D.ini b/Data/Sys/GameSettings/GHKS7D.ini new file mode 100644 index 0000000000..ef821e27c1 --- /dev/null +++ b/Data/Sys/GameSettings/GHKS7D.ini @@ -0,0 +1,21 @@ +# GHKS7D - The Hulk +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +SkipIdle = 0 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/User/GameConfig/GHLE69.ini b/Data/Sys/GameSettings/GHLE69.ini similarity index 87% rename from Data/User/GameConfig/GHLE69.ini rename to Data/Sys/GameSettings/GHLE69.ini index f64469b700..6265417b35 100644 --- a/Data/User/GameConfig/GHLE69.ini +++ b/Data/Sys/GameSettings/GHLE69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHLJ69.ini b/Data/Sys/GameSettings/GHLJ69.ini similarity index 87% rename from Data/User/GameConfig/GHLJ69.ini rename to Data/Sys/GameSettings/GHLJ69.ini index b74ef9db02..de62759d43 100644 --- a/Data/User/GameConfig/GHLJ69.ini +++ b/Data/Sys/GameSettings/GHLJ69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHLP69.ini b/Data/Sys/GameSettings/GHLP69.ini similarity index 87% rename from Data/User/GameConfig/GHLP69.ini rename to Data/Sys/GameSettings/GHLP69.ini index 9dd6640474..07acdfdd57 100644 --- a/Data/User/GameConfig/GHLP69.ini +++ b/Data/Sys/GameSettings/GHLP69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHLX69.ini b/Data/Sys/GameSettings/GHLX69.ini similarity index 87% rename from Data/User/GameConfig/GHLX69.ini rename to Data/Sys/GameSettings/GHLX69.ini index 9f033af91a..d42b9c4e82 100644 --- a/Data/User/GameConfig/GHLX69.ini +++ b/Data/Sys/GameSettings/GHLX69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHLY69.ini b/Data/Sys/GameSettings/GHLY69.ini similarity index 87% rename from Data/User/GameConfig/GHLY69.ini rename to Data/Sys/GameSettings/GHLY69.ini index 441ad422f7..aaa4958f75 100644 --- a/Data/User/GameConfig/GHLY69.ini +++ b/Data/Sys/GameSettings/GHLY69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHLZ69.ini b/Data/Sys/GameSettings/GHLZ69.ini similarity index 87% rename from Data/User/GameConfig/GHLZ69.ini rename to Data/Sys/GameSettings/GHLZ69.ini index 7c5fa31990..ecc778690d 100644 --- a/Data/User/GameConfig/GHLZ69.ini +++ b/Data/Sys/GameSettings/GHLZ69.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Text missing in D3D9, use D3D11 or Opengl instead. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GHMD4F.ini b/Data/Sys/GameSettings/GHMD4F.ini similarity index 100% rename from Data/User/GameConfig/GHMD4F.ini rename to Data/Sys/GameSettings/GHMD4F.ini diff --git a/Data/User/GameConfig/GHME4F.ini b/Data/Sys/GameSettings/GHME4F.ini similarity index 100% rename from Data/User/GameConfig/GHME4F.ini rename to Data/Sys/GameSettings/GHME4F.ini diff --git a/Data/User/GameConfig/GHMF4F.ini b/Data/Sys/GameSettings/GHMF4F.ini similarity index 100% rename from Data/User/GameConfig/GHMF4F.ini rename to Data/Sys/GameSettings/GHMF4F.ini diff --git a/Data/User/GameConfig/GHMP4F.ini b/Data/Sys/GameSettings/GHMP4F.ini similarity index 100% rename from Data/User/GameConfig/GHMP4F.ini rename to Data/Sys/GameSettings/GHMP4F.ini diff --git a/Data/User/GameConfig/GHNE71.ini b/Data/Sys/GameSettings/GHNE71.ini similarity index 77% rename from Data/User/GameConfig/GHNE71.ini rename to Data/Sys/GameSettings/GHNE71.ini index 1901f25d2c..fa603507dd 100644 --- a/Data/User/GameConfig/GHNE71.ini +++ b/Data/Sys/GameSettings/GHNE71.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Slow and cutscenes are black +EmulationIssues = Needs real xfb for the videos to show up. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -17,3 +17,6 @@ EmulationIssues = Slow and cutscenes are black [ActionReplay] # Add action replay cheats here. +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GHNX71.ini b/Data/Sys/GameSettings/GHNX71.ini new file mode 100644 index 0000000000..33084f79e9 --- /dev/null +++ b/Data/Sys/GameSettings/GHNX71.ini @@ -0,0 +1,22 @@ +# GHNX71 - Hunter: The Reckoning + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GHQE7D.ini b/Data/Sys/GameSettings/GHQE7D.ini similarity index 100% rename from Data/User/GameConfig/GHQE7D.ini rename to Data/Sys/GameSettings/GHQE7D.ini diff --git a/Data/User/GameConfig/GHQP7D.ini b/Data/Sys/GameSettings/GHQP7D.ini similarity index 100% rename from Data/User/GameConfig/GHQP7D.ini rename to Data/Sys/GameSettings/GHQP7D.ini diff --git a/Data/User/GameConfig/GHRE78.ini b/Data/Sys/GameSettings/GHRE78.ini similarity index 100% rename from Data/User/GameConfig/GHRE78.ini rename to Data/Sys/GameSettings/GHRE78.ini diff --git a/Data/User/GameConfig/GHSE69.ini b/Data/Sys/GameSettings/GHSE69.ini similarity index 100% rename from Data/User/GameConfig/GHSE69.ini rename to Data/Sys/GameSettings/GHSE69.ini diff --git a/Data/User/GameConfig/GHSJ69.ini b/Data/Sys/GameSettings/GHSJ69.ini similarity index 100% rename from Data/User/GameConfig/GHSJ69.ini rename to Data/Sys/GameSettings/GHSJ69.ini diff --git a/Data/User/GameConfig/GHSP69.ini b/Data/Sys/GameSettings/GHSP69.ini similarity index 100% rename from Data/User/GameConfig/GHSP69.ini rename to Data/Sys/GameSettings/GHSP69.ini diff --git a/Data/User/GameConfig/GHSX69.ini b/Data/Sys/GameSettings/GHSX69.ini similarity index 100% rename from Data/User/GameConfig/GHSX69.ini rename to Data/Sys/GameSettings/GHSX69.ini diff --git a/Data/User/GameConfig/GHSY69.ini b/Data/Sys/GameSettings/GHSY69.ini similarity index 100% rename from Data/User/GameConfig/GHSY69.ini rename to Data/Sys/GameSettings/GHSY69.ini diff --git a/Data/User/GameConfig/GHUE7D.ini b/Data/Sys/GameSettings/GHUE7D.ini similarity index 92% rename from Data/User/GameConfig/GHUE7D.ini rename to Data/Sys/GameSettings/GHUE7D.ini index c592871f43..87084b93f1 100644 --- a/Data/User/GameConfig/GHUE7D.ini +++ b/Data/Sys/GameSettings/GHUE7D.ini @@ -7,7 +7,7 @@ TLBHack=1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues="dcbtst Not Implemented" +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/G4ZE69.ini b/Data/Sys/GameSettings/GHUF7D.ini similarity index 80% rename from Data/User/GameConfig/G4ZE69.ini rename to Data/Sys/GameSettings/GHUF7D.ini index 293140eae8..201ee5eb35 100644 --- a/Data/User/GameConfig/G4ZE69.ini +++ b/Data/Sys/GameSettings/GHUF7D.ini @@ -1,4 +1,4 @@ -# G4ZE69 - The Sims 2 GameCube +# GHUF7D - The Incredible Hulk:Ultimate Destruction [Core] # Values set here will override the main dolphin settings. @@ -7,7 +7,7 @@ TLBHack=1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues="Go to menu and select options, then hangs" +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/Sys/GameSettings/GHUP7D.ini b/Data/Sys/GameSettings/GHUP7D.ini new file mode 100644 index 0000000000..2f77818a44 --- /dev/null +++ b/Data/Sys/GameSettings/GHUP7D.ini @@ -0,0 +1,20 @@ +# GHUP7D - The Incredible Hulk:Ultimate Destruction + +[Core] +# Values set here will override the main dolphin settings. +TLBHack=1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + diff --git a/Data/User/GameConfig/GHVE08.ini b/Data/Sys/GameSettings/GHVE08.ini similarity index 100% rename from Data/User/GameConfig/GHVE08.ini rename to Data/Sys/GameSettings/GHVE08.ini diff --git a/Data/User/GameConfig/GHWE78.ini b/Data/Sys/GameSettings/GHWE78.ini similarity index 100% rename from Data/User/GameConfig/GHWE78.ini rename to Data/Sys/GameSettings/GHWE78.ini diff --git a/Data/User/GameConfig/GHYE6S.ini b/Data/Sys/GameSettings/GHYE6S.ini similarity index 100% rename from Data/User/GameConfig/GHYE6S.ini rename to Data/Sys/GameSettings/GHYE6S.ini diff --git a/Data/User/GameConfig/GIAE7D.ini b/Data/Sys/GameSettings/GIAE7D.ini similarity index 82% rename from Data/User/GameConfig/GIAE7D.ini rename to Data/Sys/GameSettings/GIAE7D.ini index 1670fc2d1b..51bef32bf8 100644 --- a/Data/User/GameConfig/GIAE7D.ini +++ b/Data/Sys/GameSettings/GIAE7D.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Little shadow bug +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -17,3 +17,6 @@ EmulationIssues = Little shadow bug [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GIAP7D.ini b/Data/Sys/GameSettings/GIAP7D.ini new file mode 100644 index 0000000000..286780ac44 --- /dev/null +++ b/Data/Sys/GameSettings/GIAP7D.ini @@ -0,0 +1,22 @@ +# GIAP7D - Ice Age 2 The Meltdown + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/GIBE4F.ini b/Data/Sys/GameSettings/GIBE4F.ini similarity index 100% rename from Data/User/GameConfig/GIBE4F.ini rename to Data/Sys/GameSettings/GIBE4F.ini diff --git a/Data/User/GameConfig/GCDE08.ini b/Data/Sys/GameSettings/GICD78.ini similarity index 76% rename from Data/User/GameConfig/GCDE08.ini rename to Data/Sys/GameSettings/GICD78.ini index 1ea9ba9209..a1347dcee2 100644 --- a/Data/User/GameConfig/GCDE08.ini +++ b/Data/Sys/GameSettings/GICD78.ini @@ -1,11 +1,11 @@ -# GCDE08 - RESIDENT EVIL CVX +# GICD78 - The Incredibles [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 EmulationIssues = [OnLoad] @@ -17,3 +17,6 @@ EmulationIssues = [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/GICE78.ini b/Data/Sys/GameSettings/GICE78.ini similarity index 86% rename from Data/User/GameConfig/GICE78.ini rename to Data/Sys/GameSettings/GICE78.ini index 664aa5edee..a11e448d6b 100644 --- a/Data/User/GameConfig/GICE78.ini +++ b/Data/Sys/GameSettings/GICE78.ini @@ -19,3 +19,6 @@ EmulationIssues = $Infinite Health 04097DB8 38000064 +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GICF78.ini b/Data/Sys/GameSettings/GICF78.ini new file mode 100644 index 0000000000..24f0475783 --- /dev/null +++ b/Data/Sys/GameSettings/GICF78.ini @@ -0,0 +1,22 @@ +# GICF78 - The Incredibles + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GICH78.ini b/Data/Sys/GameSettings/GICH78.ini new file mode 100644 index 0000000000..dfed38cdbf --- /dev/null +++ b/Data/Sys/GameSettings/GICH78.ini @@ -0,0 +1,22 @@ +# GICH78 - The Incredibles + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GICJG9.ini b/Data/Sys/GameSettings/GICJG9.ini new file mode 100644 index 0000000000..9a90f61620 --- /dev/null +++ b/Data/Sys/GameSettings/GICJG9.ini @@ -0,0 +1,22 @@ +# GICJG9 - The Incredibles + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GICP78.ini b/Data/Sys/GameSettings/GICP78.ini new file mode 100644 index 0000000000..341670cf1f --- /dev/null +++ b/Data/Sys/GameSettings/GICP78.ini @@ -0,0 +1,22 @@ +# GICP78 - The Incredibles + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/GIGJ8P.ini b/Data/Sys/GameSettings/GIGJ8P.ini similarity index 100% rename from Data/User/GameConfig/GIGJ8P.ini rename to Data/Sys/GameSettings/GIGJ8P.ini diff --git a/Data/User/GameConfig/GIKE70.ini b/Data/Sys/GameSettings/GIKE70.ini similarity index 100% rename from Data/User/GameConfig/GIKE70.ini rename to Data/Sys/GameSettings/GIKE70.ini diff --git a/Data/User/GameConfig/GIKP70.ini b/Data/Sys/GameSettings/GIKP70.ini similarity index 100% rename from Data/User/GameConfig/GIKP70.ini rename to Data/Sys/GameSettings/GIKP70.ini diff --git a/Data/User/GameConfig/GILE51.ini b/Data/Sys/GameSettings/GILE51.ini similarity index 100% rename from Data/User/GameConfig/GILE51.ini rename to Data/Sys/GameSettings/GILE51.ini diff --git a/Data/User/GameConfig/GILP51.ini b/Data/Sys/GameSettings/GILP51.ini similarity index 100% rename from Data/User/GameConfig/GILP51.ini rename to Data/Sys/GameSettings/GILP51.ini diff --git a/Data/User/GameConfig/GINE69.ini b/Data/Sys/GameSettings/GINE69.ini similarity index 100% rename from Data/User/GameConfig/GINE69.ini rename to Data/Sys/GameSettings/GINE69.ini diff --git a/Data/User/GameConfig/GINX69.ini b/Data/Sys/GameSettings/GINX69.ini similarity index 100% rename from Data/User/GameConfig/GINX69.ini rename to Data/Sys/GameSettings/GINX69.ini diff --git a/Data/User/GameConfig/GIPEAF.ini b/Data/Sys/GameSettings/GIPEAF.ini similarity index 100% rename from Data/User/GameConfig/GIPEAF.ini rename to Data/Sys/GameSettings/GIPEAF.ini diff --git a/Data/User/GameConfig/GIQE78.ini b/Data/Sys/GameSettings/GIQE78.ini similarity index 100% rename from Data/User/GameConfig/GIQE78.ini rename to Data/Sys/GameSettings/GIQE78.ini diff --git a/Data/User/GameConfig/GISE36.ini b/Data/Sys/GameSettings/GISE36.ini similarity index 100% rename from Data/User/GameConfig/GISE36.ini rename to Data/Sys/GameSettings/GISE36.ini diff --git a/Data/User/GameConfig/GISP36.ini b/Data/Sys/GameSettings/GISP36.ini similarity index 100% rename from Data/User/GameConfig/GISP36.ini rename to Data/Sys/GameSettings/GISP36.ini diff --git a/Data/User/GameConfig/GITE01.ini b/Data/Sys/GameSettings/GITE01.ini similarity index 100% rename from Data/User/GameConfig/GITE01.ini rename to Data/Sys/GameSettings/GITE01.ini diff --git a/Data/User/GameConfig/GITP01.ini b/Data/Sys/GameSettings/GITP01.ini similarity index 100% rename from Data/User/GameConfig/GITP01.ini rename to Data/Sys/GameSettings/GITP01.ini diff --git a/Data/User/GameConfig/GIVE4Z.ini b/Data/Sys/GameSettings/GIVE4Z.ini similarity index 100% rename from Data/User/GameConfig/GIVE4Z.ini rename to Data/Sys/GameSettings/GIVE4Z.ini diff --git a/Data/User/GameConfig/GIZE52.ini b/Data/Sys/GameSettings/GIZE52.ini similarity index 100% rename from Data/User/GameConfig/GIZE52.ini rename to Data/Sys/GameSettings/GIZE52.ini diff --git a/Data/User/GameConfig/GJ3PA4.ini b/Data/Sys/GameSettings/GJ3PA4.ini similarity index 100% rename from Data/User/GameConfig/GJ3PA4.ini rename to Data/Sys/GameSettings/GJ3PA4.ini diff --git a/Data/User/GameConfig/GJBE5G.ini b/Data/Sys/GameSettings/GJBE5G.ini similarity index 73% rename from Data/User/GameConfig/GJBE5G.ini rename to Data/Sys/GameSettings/GJBE5G.ini index 74773458de..582c27fd28 100644 --- a/Data/User/GameConfig/GJBE5G.ini +++ b/Data/Sys/GameSettings/GJBE5G.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 5 -EmulationIssues = Use D3D9 for less problems. Videos need Real XFB to show up. Graphic glitches / unstable during videos. +EmulationIssues = Videos need Real XFB to show up. Graphic glitches / unstable during videos. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -18,12 +18,12 @@ EmulationIssues = Use D3D9 for less problems. Videos need Real XFB to show up. G # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GJCE8P.ini b/Data/Sys/GameSettings/GJCE8P.ini similarity index 100% rename from Data/User/GameConfig/GJCE8P.ini rename to Data/Sys/GameSettings/GJCE8P.ini diff --git a/Data/User/GameConfig/GJDE5S.ini b/Data/Sys/GameSettings/GJDE5S.ini similarity index 100% rename from Data/User/GameConfig/GJDE5S.ini rename to Data/Sys/GameSettings/GJDE5S.ini diff --git a/Data/User/GameConfig/GQCE52.ini b/Data/Sys/GameSettings/GJKD52.ini similarity index 78% rename from Data/User/GameConfig/GQCE52.ini rename to Data/Sys/GameSettings/GJKD52.ini index c43660dae8..0007f5b1c3 100644 --- a/Data/User/GameConfig/GQCE52.ini +++ b/Data/Sys/GameSettings/GJKD52.ini @@ -1,12 +1,10 @@ -# GQCE52 - Call of Duty 2: Big Red One +# GJKD52 - Jedi Knight II: Jedi Outcast [Core] # Values set here will override the main dolphin settings. -TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = Black screen EmulationStateId = 4 [OnLoad] @@ -18,3 +16,5 @@ EmulationStateId = 4 [ActionReplay] # Add action replay cheats here. +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GJKE52.ini b/Data/Sys/GameSettings/GJKE52.ini similarity index 87% rename from Data/User/GameConfig/GJKE52.ini rename to Data/Sys/GameSettings/GJKE52.ini index 38599b2f3c..ecabf3348d 100644 --- a/Data/User/GameConfig/GJKE52.ini +++ b/Data/Sys/GameSettings/GJKE52.ini @@ -6,7 +6,6 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues="Darkening" [OnLoad] # Add memory patches to be loaded once on boot here. @@ -17,3 +16,5 @@ Issues="Darkening" [ActionReplay] # Add action replay cheats here. +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/GJKF52.ini b/Data/Sys/GameSettings/GJKF52.ini new file mode 100644 index 0000000000..021607d303 --- /dev/null +++ b/Data/Sys/GameSettings/GJKF52.ini @@ -0,0 +1,20 @@ +# GJKF52 - Jedi Knight II: Jedi Outcast + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/GJKP52.ini b/Data/Sys/GameSettings/GJKP52.ini new file mode 100644 index 0000000000..42e8bd5fef --- /dev/null +++ b/Data/Sys/GameSettings/GJKP52.ini @@ -0,0 +1,20 @@ +# GJKP52 - Jedi Knight II: Jedi Outcast + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GJNE78.ini b/Data/Sys/GameSettings/GJNE78.ini similarity index 100% rename from Data/User/GameConfig/GJNE78.ini rename to Data/Sys/GameSettings/GJNE78.ini diff --git a/Data/User/GameConfig/GJSJ18.ini b/Data/Sys/GameSettings/GJSJ18.ini similarity index 100% rename from Data/User/GameConfig/GJSJ18.ini rename to Data/Sys/GameSettings/GJSJ18.ini diff --git a/Data/User/GameConfig/GJUD78.ini b/Data/Sys/GameSettings/GJUD78.ini similarity index 95% rename from Data/User/GameConfig/GJUD78.ini rename to Data/Sys/GameSettings/GJUD78.ini index d93c274449..71c381085a 100644 --- a/Data/User/GameConfig/GJUD78.ini +++ b/Data/Sys/GameSettings/GJUD78.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationIssues = -EmulationStateId = 4 +EmulationStateId = 5 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GJUE78.ini b/Data/Sys/GameSettings/GJUE78.ini similarity index 97% rename from Data/User/GameConfig/GJUE78.ini rename to Data/Sys/GameSettings/GJUE78.ini index 2e9b394820..6137cedc34 100644 --- a/Data/User/GameConfig/GJUE78.ini +++ b/Data/Sys/GameSettings/GJUE78.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationIssues = -EmulationStateId = 4 +EmulationStateId = 5 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GJUF78.ini b/Data/Sys/GameSettings/GJUF78.ini similarity index 95% rename from Data/User/GameConfig/GJUF78.ini rename to Data/Sys/GameSettings/GJUF78.ini index bc0b5dcede..449145b2ae 100644 --- a/Data/User/GameConfig/GJUF78.ini +++ b/Data/Sys/GameSettings/GJUF78.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationIssues = -EmulationStateId = 4 +EmulationStateId = 5 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GJWE78.ini b/Data/Sys/GameSettings/GJWE78.ini similarity index 100% rename from Data/User/GameConfig/GJWE78.ini rename to Data/Sys/GameSettings/GJWE78.ini diff --git a/Data/User/GameConfig/GJXE51.ini b/Data/Sys/GameSettings/GJXE51.ini similarity index 100% rename from Data/User/GameConfig/GJXE51.ini rename to Data/Sys/GameSettings/GJXE51.ini diff --git a/Data/User/GameConfig/GJXP51.ini b/Data/Sys/GameSettings/GJXP51.ini similarity index 100% rename from Data/User/GameConfig/GJXP51.ini rename to Data/Sys/GameSettings/GJXP51.ini diff --git a/Data/User/GameConfig/GJZE52.ini b/Data/Sys/GameSettings/GJZE52.ini similarity index 100% rename from Data/User/GameConfig/GJZE52.ini rename to Data/Sys/GameSettings/GJZE52.ini diff --git a/Data/Sys/GameSettings/GK2D52.ini b/Data/Sys/GameSettings/GK2D52.ini new file mode 100644 index 0000000000..d8267fbc92 --- /dev/null +++ b/Data/Sys/GameSettings/GK2D52.ini @@ -0,0 +1,18 @@ +# GK2D52 - Spider-Man 2 +[Core] +MMU = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = Slow because it needs mmu to run. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GK2E52.ini b/Data/Sys/GameSettings/GK2E52.ini new file mode 100644 index 0000000000..23d53c182b --- /dev/null +++ b/Data/Sys/GameSettings/GK2E52.ini @@ -0,0 +1,18 @@ +# GK2E52 - Spider-Man 2 +[Core] +MMU = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = Slow because it needs mmu to run. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GK2F52.ini b/Data/Sys/GameSettings/GK2F52.ini new file mode 100644 index 0000000000..0b05c6d201 --- /dev/null +++ b/Data/Sys/GameSettings/GK2F52.ini @@ -0,0 +1,18 @@ +# GK2F52 - Spider-Man 2 +[Core] +MMU = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = Slow because it needs mmu to run. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GK2I52.ini b/Data/Sys/GameSettings/GK2I52.ini new file mode 100644 index 0000000000..0f733aac78 --- /dev/null +++ b/Data/Sys/GameSettings/GK2I52.ini @@ -0,0 +1,18 @@ +# GK2I52 - Spider-Man 2 +[Core] +MMU = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = Slow because it needs mmu to run. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GK2P52.ini b/Data/Sys/GameSettings/GK2P52.ini new file mode 100644 index 0000000000..32d0de3b03 --- /dev/null +++ b/Data/Sys/GameSettings/GK2P52.ini @@ -0,0 +1,18 @@ +# GK2P52 - Spider-Man 2 +[Core] +MMU = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = Slow because it needs mmu to run. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/GK4E01.ini b/Data/Sys/GameSettings/GK4E01.ini similarity index 100% rename from Data/User/GameConfig/GK4E01.ini rename to Data/Sys/GameSettings/GK4E01.ini diff --git a/Data/User/GameConfig/GK5E78.ini b/Data/Sys/GameSettings/GK5E78.ini similarity index 100% rename from Data/User/GameConfig/GK5E78.ini rename to Data/Sys/GameSettings/GK5E78.ini diff --git a/Data/User/GameConfig/GK5X78.ini b/Data/Sys/GameSettings/GK5X78.ini similarity index 100% rename from Data/User/GameConfig/GK5X78.ini rename to Data/Sys/GameSettings/GK5X78.ini diff --git a/Data/User/GameConfig/GK6JA4.ini b/Data/Sys/GameSettings/GK6JA4.ini similarity index 100% rename from Data/User/GameConfig/GK6JA4.ini rename to Data/Sys/GameSettings/GK6JA4.ini diff --git a/Data/User/GameConfig/GK7E08.ini b/Data/Sys/GameSettings/GK7E08.ini similarity index 100% rename from Data/User/GameConfig/GK7E08.ini rename to Data/Sys/GameSettings/GK7E08.ini diff --git a/Data/User/GameConfig/GK7P08.ini b/Data/Sys/GameSettings/GK7P08.ini similarity index 100% rename from Data/User/GameConfig/GK7P08.ini rename to Data/Sys/GameSettings/GK7P08.ini diff --git a/Data/User/GameConfig/GK9EA4.ini b/Data/Sys/GameSettings/GK9EA4.ini similarity index 100% rename from Data/User/GameConfig/GK9EA4.ini rename to Data/Sys/GameSettings/GK9EA4.ini diff --git a/Data/User/GameConfig/GKAE8P.ini b/Data/Sys/GameSettings/GKAE8P.ini similarity index 100% rename from Data/User/GameConfig/GKAE8P.ini rename to Data/Sys/GameSettings/GKAE8P.ini diff --git a/Data/User/GameConfig/GKBEAF.ini b/Data/Sys/GameSettings/GKBEAF.ini similarity index 100% rename from Data/User/GameConfig/GKBEAF.ini rename to Data/Sys/GameSettings/GKBEAF.ini diff --git a/Data/User/GameConfig/GKBPAF.ini b/Data/Sys/GameSettings/GKBPAF.ini similarity index 100% rename from Data/User/GameConfig/GKBPAF.ini rename to Data/Sys/GameSettings/GKBPAF.ini diff --git a/Data/User/GameConfig/GKDP01.ini b/Data/Sys/GameSettings/GKDP01.ini similarity index 100% rename from Data/User/GameConfig/GKDP01.ini rename to Data/Sys/GameSettings/GKDP01.ini diff --git a/Data/User/GameConfig/GKFEGG.ini b/Data/Sys/GameSettings/GKFEGG.ini similarity index 100% rename from Data/User/GameConfig/GKFEGG.ini rename to Data/Sys/GameSettings/GKFEGG.ini diff --git a/Data/User/GameConfig/GKGE01.ini b/Data/Sys/GameSettings/GKGE01.ini similarity index 100% rename from Data/User/GameConfig/GKGE01.ini rename to Data/Sys/GameSettings/GKGE01.ini diff --git a/Data/User/GameConfig/GKHEA4.ini b/Data/Sys/GameSettings/GKHEA4.ini similarity index 100% rename from Data/User/GameConfig/GKHEA4.ini rename to Data/Sys/GameSettings/GKHEA4.ini diff --git a/Data/User/GameConfig/GKHPA4.ini b/Data/Sys/GameSettings/GKHPA4.ini similarity index 100% rename from Data/User/GameConfig/GKHPA4.ini rename to Data/Sys/GameSettings/GKHPA4.ini diff --git a/Data/User/GameConfig/GKJE78.ini b/Data/Sys/GameSettings/GKJE78.ini similarity index 100% rename from Data/User/GameConfig/GKJE78.ini rename to Data/Sys/GameSettings/GKJE78.ini diff --git a/Data/User/GameConfig/GKKE69.ini b/Data/Sys/GameSettings/GKKE69.ini similarity index 100% rename from Data/User/GameConfig/GKKE69.ini rename to Data/Sys/GameSettings/GKKE69.ini diff --git a/Data/User/GameConfig/GKLD69.ini b/Data/Sys/GameSettings/GKLD69.ini similarity index 100% rename from Data/User/GameConfig/GKLD69.ini rename to Data/Sys/GameSettings/GKLD69.ini diff --git a/Data/User/GameConfig/GKLE69.ini b/Data/Sys/GameSettings/GKLE69.ini similarity index 100% rename from Data/User/GameConfig/GKLE69.ini rename to Data/Sys/GameSettings/GKLE69.ini diff --git a/Data/User/GameConfig/GKLF69.ini b/Data/Sys/GameSettings/GKLF69.ini similarity index 100% rename from Data/User/GameConfig/GKLF69.ini rename to Data/Sys/GameSettings/GKLF69.ini diff --git a/Data/User/GameConfig/GKLI69.ini b/Data/Sys/GameSettings/GKLI69.ini similarity index 100% rename from Data/User/GameConfig/GKLI69.ini rename to Data/Sys/GameSettings/GKLI69.ini diff --git a/Data/User/GameConfig/GKLJ69.ini b/Data/Sys/GameSettings/GKLJ69.ini similarity index 100% rename from Data/User/GameConfig/GKLJ69.ini rename to Data/Sys/GameSettings/GKLJ69.ini diff --git a/Data/User/GameConfig/GKLP69.ini b/Data/Sys/GameSettings/GKLP69.ini similarity index 100% rename from Data/User/GameConfig/GKLP69.ini rename to Data/Sys/GameSettings/GKLP69.ini diff --git a/Data/User/GameConfig/GKLS69.ini b/Data/Sys/GameSettings/GKLS69.ini similarity index 100% rename from Data/User/GameConfig/GKLS69.ini rename to Data/Sys/GameSettings/GKLS69.ini diff --git a/Data/User/GameConfig/GKME41.ini b/Data/Sys/GameSettings/GKME41.ini similarity index 100% rename from Data/User/GameConfig/GKME41.ini rename to Data/Sys/GameSettings/GKME41.ini diff --git a/Data/User/GameConfig/GKMP41.ini b/Data/Sys/GameSettings/GKMP41.ini similarity index 100% rename from Data/User/GameConfig/GKMP41.ini rename to Data/Sys/GameSettings/GKMP41.ini diff --git a/Data/User/GameConfig/GKNEB2.ini b/Data/Sys/GameSettings/GKNEB2.ini similarity index 100% rename from Data/User/GameConfig/GKNEB2.ini rename to Data/Sys/GameSettings/GKNEB2.ini diff --git a/Data/User/GameConfig/GKOE70.ini b/Data/Sys/GameSettings/GKOE70.ini similarity index 100% rename from Data/User/GameConfig/GKOE70.ini rename to Data/Sys/GameSettings/GKOE70.ini diff --git a/Data/User/GameConfig/GKOP6V.ini b/Data/Sys/GameSettings/GKOP6V.ini similarity index 100% rename from Data/User/GameConfig/GKOP6V.ini rename to Data/Sys/GameSettings/GKOP6V.ini diff --git a/Data/User/GameConfig/GKOP70.ini b/Data/Sys/GameSettings/GKOP70.ini similarity index 100% rename from Data/User/GameConfig/GKOP70.ini rename to Data/Sys/GameSettings/GKOP70.ini diff --git a/Data/User/GameConfig/GKQJ01.ini b/Data/Sys/GameSettings/GKQJ01.ini similarity index 100% rename from Data/User/GameConfig/GKQJ01.ini rename to Data/Sys/GameSettings/GKQJ01.ini diff --git a/Data/User/GameConfig/GKSE52.ini b/Data/Sys/GameSettings/GKSE52.ini similarity index 100% rename from Data/User/GameConfig/GKSE52.ini rename to Data/Sys/GameSettings/GKSE52.ini diff --git a/Data/User/GameConfig/GKTJA4.ini b/Data/Sys/GameSettings/GKTJA4.ini similarity index 100% rename from Data/User/GameConfig/GKTJA4.ini rename to Data/Sys/GameSettings/GKTJA4.ini diff --git a/Data/User/GameConfig/GKUE9G.ini b/Data/Sys/GameSettings/GKUE9G.ini similarity index 100% rename from Data/User/GameConfig/GKUE9G.ini rename to Data/Sys/GameSettings/GKUE9G.ini diff --git a/Data/User/GameConfig/GKYE01.ini b/Data/Sys/GameSettings/GKYE01.ini similarity index 100% rename from Data/User/GameConfig/GKYE01.ini rename to Data/Sys/GameSettings/GKYE01.ini diff --git a/Data/User/GameConfig/GKYJ01.ini b/Data/Sys/GameSettings/GKYJ01.ini similarity index 100% rename from Data/User/GameConfig/GKYJ01.ini rename to Data/Sys/GameSettings/GKYJ01.ini diff --git a/Data/User/GameConfig/GKYP01.ini b/Data/Sys/GameSettings/GKYP01.ini similarity index 100% rename from Data/User/GameConfig/GKYP01.ini rename to Data/Sys/GameSettings/GKYP01.ini diff --git a/Data/User/GameConfig/GKZE9G.ini b/Data/Sys/GameSettings/GKZE9G.ini similarity index 100% rename from Data/User/GameConfig/GKZE9G.ini rename to Data/Sys/GameSettings/GKZE9G.ini diff --git a/Data/User/GameConfig/GL5E4F.ini b/Data/Sys/GameSettings/GL5E4F.ini similarity index 100% rename from Data/User/GameConfig/GL5E4F.ini rename to Data/Sys/GameSettings/GL5E4F.ini diff --git a/Data/User/GameConfig/GL7E64.ini b/Data/Sys/GameSettings/GL7E64.ini similarity index 100% rename from Data/User/GameConfig/GL7E64.ini rename to Data/Sys/GameSettings/GL7E64.ini diff --git a/Data/User/GameConfig/GL7P64.ini b/Data/Sys/GameSettings/GL7P64.ini similarity index 100% rename from Data/User/GameConfig/GL7P64.ini rename to Data/Sys/GameSettings/GL7P64.ini diff --git a/Data/User/GameConfig/GL8E4F.ini b/Data/Sys/GameSettings/GL8E4F.ini similarity index 100% rename from Data/User/GameConfig/GL8E4F.ini rename to Data/Sys/GameSettings/GL8E4F.ini diff --git a/Data/User/GameConfig/GL8F4F.ini b/Data/Sys/GameSettings/GL8F4F.ini similarity index 100% rename from Data/User/GameConfig/GL8F4F.ini rename to Data/Sys/GameSettings/GL8F4F.ini diff --git a/Data/User/GameConfig/GLBE8P.ini b/Data/Sys/GameSettings/GLBE8P.ini similarity index 100% rename from Data/User/GameConfig/GLBE8P.ini rename to Data/Sys/GameSettings/GLBE8P.ini diff --git a/Data/User/GameConfig/GLCE52.ini b/Data/Sys/GameSettings/GLCE52.ini similarity index 100% rename from Data/User/GameConfig/GLCE52.ini rename to Data/Sys/GameSettings/GLCE52.ini diff --git a/Data/User/GameConfig/GLCF52.ini b/Data/Sys/GameSettings/GLCF52.ini similarity index 100% rename from Data/User/GameConfig/GLCF52.ini rename to Data/Sys/GameSettings/GLCF52.ini diff --git a/Data/User/GameConfig/GLEE08.ini b/Data/Sys/GameSettings/GLEE08.ini similarity index 100% rename from Data/User/GameConfig/GLEE08.ini rename to Data/Sys/GameSettings/GLEE08.ini diff --git a/Data/User/GameConfig/GLEP08.ini b/Data/Sys/GameSettings/GLEP08.ini similarity index 100% rename from Data/User/GameConfig/GLEP08.ini rename to Data/Sys/GameSettings/GLEP08.ini diff --git a/Data/User/GameConfig/GLLE78.ini b/Data/Sys/GameSettings/GLLE78.ini similarity index 100% rename from Data/User/GameConfig/GLLE78.ini rename to Data/Sys/GameSettings/GLLE78.ini diff --git a/Data/User/GameConfig/GLME01.ini b/Data/Sys/GameSettings/GLME01.ini similarity index 100% rename from Data/User/GameConfig/GLME01.ini rename to Data/Sys/GameSettings/GLME01.ini diff --git a/Data/User/GameConfig/G8WE01.ini b/Data/Sys/GameSettings/GLMJ01.ini similarity index 93% rename from Data/User/GameConfig/G8WE01.ini rename to Data/Sys/GameSettings/GLMJ01.ini index 5c001e2c52..ad6d9bf5ab 100644 --- a/Data/User/GameConfig/G8WE01.ini +++ b/Data/Sys/GameSettings/GLMJ01.ini @@ -1,4 +1,4 @@ -# G8WE01 - Battalion Wars +# GLMJ01 - LUIGI'S MANSION [Core] # Values set here will override the main dolphin settings. @@ -19,4 +19,3 @@ EmulationIssues = [Video] ProjectionHack = 0 - diff --git a/Data/User/GameConfig/GLMP01.ini b/Data/Sys/GameSettings/GLMP01.ini similarity index 100% rename from Data/User/GameConfig/GLMP01.ini rename to Data/Sys/GameSettings/GLMP01.ini diff --git a/Data/User/GameConfig/GLNE69.ini b/Data/Sys/GameSettings/GLNE69.ini similarity index 100% rename from Data/User/GameConfig/GLNE69.ini rename to Data/Sys/GameSettings/GLNE69.ini diff --git a/Data/User/GameConfig/GLNP69.ini b/Data/Sys/GameSettings/GLNP69.ini similarity index 100% rename from Data/User/GameConfig/GLNP69.ini rename to Data/Sys/GameSettings/GLNP69.ini diff --git a/Data/User/GameConfig/GLOE69.ini b/Data/Sys/GameSettings/GLOE69.ini similarity index 100% rename from Data/User/GameConfig/GLOE69.ini rename to Data/Sys/GameSettings/GLOE69.ini diff --git a/Data/User/GameConfig/GLOP69.ini b/Data/Sys/GameSettings/GLOP69.ini similarity index 100% rename from Data/User/GameConfig/GLOP69.ini rename to Data/Sys/GameSettings/GLOP69.ini diff --git a/Data/User/GameConfig/GLQE41.ini b/Data/Sys/GameSettings/GLQE41.ini similarity index 100% rename from Data/User/GameConfig/GLQE41.ini rename to Data/Sys/GameSettings/GLQE41.ini diff --git a/Data/User/GameConfig/GLRE64.ini b/Data/Sys/GameSettings/GLRE64.ini similarity index 100% rename from Data/User/GameConfig/GLRE64.ini rename to Data/Sys/GameSettings/GLRE64.ini diff --git a/Data/User/GameConfig/GLSD64.ini b/Data/Sys/GameSettings/GLSD64.ini similarity index 100% rename from Data/User/GameConfig/GLSD64.ini rename to Data/Sys/GameSettings/GLSD64.ini diff --git a/Data/User/GameConfig/GLSE64.ini b/Data/Sys/GameSettings/GLSE64.ini similarity index 100% rename from Data/User/GameConfig/GLSE64.ini rename to Data/Sys/GameSettings/GLSE64.ini diff --git a/Data/User/GameConfig/GLSF64.ini b/Data/Sys/GameSettings/GLSF64.ini similarity index 100% rename from Data/User/GameConfig/GLSF64.ini rename to Data/Sys/GameSettings/GLSF64.ini diff --git a/Data/User/GameConfig/GLSP64.ini b/Data/Sys/GameSettings/GLSP64.ini similarity index 100% rename from Data/User/GameConfig/GLSP64.ini rename to Data/Sys/GameSettings/GLSP64.ini diff --git a/Data/User/GameConfig/GLUE7U.ini b/Data/Sys/GameSettings/GLUE7U.ini similarity index 100% rename from Data/User/GameConfig/GLUE7U.ini rename to Data/Sys/GameSettings/GLUE7U.ini diff --git a/Data/User/GameConfig/GLWE51.ini b/Data/Sys/GameSettings/GLWE51.ini similarity index 100% rename from Data/User/GameConfig/GLWE51.ini rename to Data/Sys/GameSettings/GLWE51.ini diff --git a/Data/User/GameConfig/GLYE69.ini b/Data/Sys/GameSettings/GLYE69.ini similarity index 100% rename from Data/User/GameConfig/GLYE69.ini rename to Data/Sys/GameSettings/GLYE69.ini diff --git a/Data/User/GameConfig/GLYP69.ini b/Data/Sys/GameSettings/GLYP69.ini similarity index 100% rename from Data/User/GameConfig/GLYP69.ini rename to Data/Sys/GameSettings/GLYP69.ini diff --git a/Data/User/GameConfig/GLZE69.ini b/Data/Sys/GameSettings/GLZE69.ini similarity index 100% rename from Data/User/GameConfig/GLZE69.ini rename to Data/Sys/GameSettings/GLZE69.ini diff --git a/Data/User/GameConfig/GLZF69.ini b/Data/Sys/GameSettings/GLZF69.ini similarity index 100% rename from Data/User/GameConfig/GLZF69.ini rename to Data/Sys/GameSettings/GLZF69.ini diff --git a/Data/User/GameConfig/GM2E8P.ini b/Data/Sys/GameSettings/GM2E8P.ini similarity index 87% rename from Data/User/GameConfig/GM2E8P.ini rename to Data/Sys/GameSettings/GM2E8P.ini index 67db02875d..409d2e00c7 100644 --- a/Data/User/GameConfig/GM2E8P.ini +++ b/Data/Sys/GameSettings/GM2E8P.ini @@ -7,7 +7,7 @@ EnableFPRF=True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Sound issues (that can't be fixed by lle audio). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/SJDY41.ini b/Data/Sys/GameSettings/GM2J8P.ini similarity index 80% rename from Data/User/GameConfig/SJDY41.ini rename to Data/Sys/GameSettings/GM2J8P.ini index c90a989c21..d5f546e193 100644 --- a/Data/User/GameConfig/SJDY41.ini +++ b/Data/Sys/GameSettings/GM2J8P.ini @@ -1,12 +1,13 @@ -# SJDY41 - Just Dance 3 +# GM2J8P - SUPER MONKEY BALL 2 [Core] # Values set here will override the main dolphin settings. +EnableFPRF=True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 -EmulationIssues = Suffers from random ingame lock ups. +EmulationStateId = 4 +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -24,4 +25,3 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = - diff --git a/Data/User/GameConfig/GM2P8P.ini b/Data/Sys/GameSettings/GM2P8P.ini similarity index 87% rename from Data/User/GameConfig/GM2P8P.ini rename to Data/Sys/GameSettings/GM2P8P.ini index e2d07f7bba..89548e472a 100644 --- a/Data/User/GameConfig/GM2P8P.ini +++ b/Data/Sys/GameSettings/GM2P8P.ini @@ -7,7 +7,7 @@ EnableFPRF=True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Sound issues (that can't be fixed by lle audio). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,4 +25,3 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = - diff --git a/Data/User/GameConfig/GM3E69.ini b/Data/Sys/GameSettings/GM3E69.ini similarity index 100% rename from Data/User/GameConfig/GM3E69.ini rename to Data/Sys/GameSettings/GM3E69.ini diff --git a/Data/User/GameConfig/GM4E01.ini b/Data/Sys/GameSettings/GM4E01.ini similarity index 95% rename from Data/User/GameConfig/GM4E01.ini rename to Data/Sys/GameSettings/GM4E01.ini index 01f46994b5..512db9762e 100644 --- a/Data/User/GameConfig/GM4E01.ini +++ b/Data/Sys/GameSettings/GM4E01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs LLE audio to prevent BGM from stopping. Disable "emulate format changes" to increase the game speed. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -139,3 +140,5 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GM4J01.ini b/Data/Sys/GameSettings/GM4J01.ini similarity index 78% rename from Data/User/GameConfig/GM4J01.ini rename to Data/Sys/GameSettings/GM4J01.ini index c34d916d90..b57cc9a1c8 100644 --- a/Data/User/GameConfig/GM4J01.ini +++ b/Data/Sys/GameSettings/GM4J01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs LLE audio to prevent BGM from stopping. Disable "emulate format changes" to increase the game speed. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,3 +26,5 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GM4P01.ini b/Data/Sys/GameSettings/GM4P01.ini similarity index 95% rename from Data/User/GameConfig/GM4P01.ini rename to Data/Sys/GameSettings/GM4P01.ini index 639879b279..945a6cd07b 100644 --- a/Data/User/GameConfig/GM4P01.ini +++ b/Data/Sys/GameSettings/GM4P01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs LLE audio to prevent BGM from stopping. Disable "emulate format changes" to increase the game speed. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -151,3 +152,5 @@ $Goraud Shading [Video] ProjectionHack = 0 +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GM5E7D.ini b/Data/Sys/GameSettings/GM5E7D.ini similarity index 100% rename from Data/User/GameConfig/GM5E7D.ini rename to Data/Sys/GameSettings/GM5E7D.ini diff --git a/Data/User/GameConfig/GM5F7D.ini b/Data/Sys/GameSettings/GM5F7D.ini similarity index 100% rename from Data/User/GameConfig/GM5F7D.ini rename to Data/Sys/GameSettings/GM5F7D.ini diff --git a/Data/User/GameConfig/GM5P7D.ini b/Data/Sys/GameSettings/GM5P7D.ini similarity index 100% rename from Data/User/GameConfig/GM5P7D.ini rename to Data/Sys/GameSettings/GM5P7D.ini diff --git a/Data/User/GameConfig/GM6EE9.ini b/Data/Sys/GameSettings/GM6EE9.ini similarity index 100% rename from Data/User/GameConfig/GM6EE9.ini rename to Data/Sys/GameSettings/GM6EE9.ini diff --git a/Data/User/GameConfig/GM6PE9.ini b/Data/Sys/GameSettings/GM6PE9.ini similarity index 100% rename from Data/User/GameConfig/GM6PE9.ini rename to Data/Sys/GameSettings/GM6PE9.ini diff --git a/Data/User/GameConfig/GM8E01.ini b/Data/Sys/GameSettings/GM8E01.ini similarity index 100% rename from Data/User/GameConfig/GM8E01.ini rename to Data/Sys/GameSettings/GM8E01.ini diff --git a/Data/User/GameConfig/GM8J01.ini b/Data/Sys/GameSettings/GM8J01.ini similarity index 100% rename from Data/User/GameConfig/GM8J01.ini rename to Data/Sys/GameSettings/GM8J01.ini diff --git a/Data/User/GameConfig/GM8P01.ini b/Data/Sys/GameSettings/GM8P01.ini similarity index 100% rename from Data/User/GameConfig/GM8P01.ini rename to Data/Sys/GameSettings/GM8P01.ini diff --git a/Data/User/GameConfig/GMBE8P.ini b/Data/Sys/GameSettings/GMBE8P.ini similarity index 100% rename from Data/User/GameConfig/GMBE8P.ini rename to Data/Sys/GameSettings/GMBE8P.ini diff --git a/Data/Sys/GameSettings/GMBJ8P.ini b/Data/Sys/GameSettings/GMBJ8P.ini new file mode 100644 index 0000000000..90c7c8eb00 --- /dev/null +++ b/Data/Sys/GameSettings/GMBJ8P.ini @@ -0,0 +1,23 @@ +# GMBJ8P - Super Monkey Ball + +[Core] +# Values set here will override the main dolphin settings. +EnableFPRF=True +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 diff --git a/Data/User/GameConfig/GMBP8P.ini b/Data/Sys/GameSettings/GMBP8P.ini similarity index 100% rename from Data/User/GameConfig/GMBP8P.ini rename to Data/Sys/GameSettings/GMBP8P.ini diff --git a/Data/User/GameConfig/GMFS69.ini b/Data/Sys/GameSettings/GMFS69.ini similarity index 94% rename from Data/User/GameConfig/GMFS69.ini rename to Data/Sys/GameSettings/GMFS69.ini index a0eda03ad6..df3367edb7 100644 --- a/Data/User/GameConfig/GMFS69.ini +++ b/Data/Sys/GameSettings/GMFS69.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 +EmulationStateId = 4 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GMHE52.ini b/Data/Sys/GameSettings/GMHE52.ini similarity index 100% rename from Data/User/GameConfig/GMHE52.ini rename to Data/Sys/GameSettings/GMHE52.ini diff --git a/Data/User/GameConfig/GMHF52.ini b/Data/Sys/GameSettings/GMHF52.ini similarity index 100% rename from Data/User/GameConfig/GMHF52.ini rename to Data/Sys/GameSettings/GMHF52.ini diff --git a/Data/User/GameConfig/GMHP52.ini b/Data/Sys/GameSettings/GMHP52.ini similarity index 100% rename from Data/User/GameConfig/GMHP52.ini rename to Data/Sys/GameSettings/GMHP52.ini diff --git a/Data/User/GameConfig/GMIE70.ini b/Data/Sys/GameSettings/GMIE70.ini similarity index 100% rename from Data/User/GameConfig/GMIE70.ini rename to Data/Sys/GameSettings/GMIE70.ini diff --git a/Data/User/GameConfig/GMIP70.ini b/Data/Sys/GameSettings/GMIP70.ini similarity index 100% rename from Data/User/GameConfig/GMIP70.ini rename to Data/Sys/GameSettings/GMIP70.ini diff --git a/Data/User/GameConfig/GMKD5D.ini b/Data/Sys/GameSettings/GMKD5D.ini similarity index 100% rename from Data/User/GameConfig/GMKD5D.ini rename to Data/Sys/GameSettings/GMKD5D.ini diff --git a/Data/User/GameConfig/GMLEA4.ini b/Data/Sys/GameSettings/GMLEA4.ini similarity index 100% rename from Data/User/GameConfig/GMLEA4.ini rename to Data/Sys/GameSettings/GMLEA4.ini diff --git a/Data/User/GameConfig/GMNE78.ini b/Data/Sys/GameSettings/GMNE78.ini similarity index 100% rename from Data/User/GameConfig/GMNE78.ini rename to Data/Sys/GameSettings/GMNE78.ini diff --git a/Data/User/GameConfig/GMPE01.ini b/Data/Sys/GameSettings/GMPE01.ini similarity index 100% rename from Data/User/GameConfig/GMPE01.ini rename to Data/Sys/GameSettings/GMPE01.ini diff --git a/Data/User/GameConfig/WGSP08.ini b/Data/Sys/GameSettings/GMPJ01.ini similarity index 93% rename from Data/User/GameConfig/WGSP08.ini rename to Data/Sys/GameSettings/GMPJ01.ini index ec1116fa21..60afbffeff 100644 --- a/Data/User/GameConfig/WGSP08.ini +++ b/Data/Sys/GameSettings/GMPJ01.ini @@ -1,4 +1,4 @@ -# WGSP08 - +# GMPJ01 - Mario Party 4 [Core] # Values set here will override the main dolphin settings. @@ -19,4 +19,3 @@ EmulationIssues = [Video] ProjectionHack = 0 - diff --git a/Data/User/GameConfig/GMPP01.ini b/Data/Sys/GameSettings/GMPP01.ini similarity index 100% rename from Data/User/GameConfig/GMPP01.ini rename to Data/Sys/GameSettings/GMPP01.ini diff --git a/Data/User/GameConfig/GMSE01.ini b/Data/Sys/GameSettings/GMSE01.ini similarity index 99% rename from Data/User/GameConfig/GMSE01.ini rename to Data/Sys/GameSettings/GMSE01.ini index e37c4ec387..1442509fc2 100644 --- a/Data/User/GameConfig/GMSE01.ini +++ b/Data/Sys/GameSettings/GMSE01.ini @@ -152,7 +152,7 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -PerformanceQueriesEnable = True +PerfQueriesEnable = True [Video_Settings] wideScreenHack = False diff --git a/Data/User/GameConfig/GMSJ01.ini b/Data/Sys/GameSettings/GMSJ01.ini similarity index 95% rename from Data/User/GameConfig/GMSJ01.ini rename to Data/Sys/GameSettings/GMSJ01.ini index d7de859d4d..d5ab074e47 100644 --- a/Data/User/GameConfig/GMSJ01.ini +++ b/Data/Sys/GameSettings/GMSJ01.ini @@ -24,7 +24,7 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -PerformanceQueriesEnable = True +PerfQueriesEnable = True [Video_Settings] wideScreenHack = False diff --git a/Data/User/GameConfig/GMSP01.ini b/Data/Sys/GameSettings/GMSP01.ini similarity index 97% rename from Data/User/GameConfig/GMSP01.ini rename to Data/Sys/GameSettings/GMSP01.ini index fdac93eb91..b44c75d55a 100644 --- a/Data/User/GameConfig/GMSP01.ini +++ b/Data/Sys/GameSettings/GMSP01.ini @@ -74,7 +74,7 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -PerformanceQueriesEnable = True +PerfQueriesEnable = True [Video_Settings] wideScreenHack = False diff --git a/Data/User/GameConfig/GMTP69.ini b/Data/Sys/GameSettings/GMTP69.ini similarity index 100% rename from Data/User/GameConfig/GMTP69.ini rename to Data/Sys/GameSettings/GMTP69.ini diff --git a/Data/User/GameConfig/GMUE5D.ini b/Data/Sys/GameSettings/GMUE5D.ini similarity index 100% rename from Data/User/GameConfig/GMUE5D.ini rename to Data/Sys/GameSettings/GMUE5D.ini diff --git a/Data/User/GameConfig/GMXE70.ini b/Data/Sys/GameSettings/GMXE70.ini similarity index 86% rename from Data/User/GameConfig/GMXE70.ini rename to Data/Sys/GameSettings/GMXE70.ini index 214760e887..648fae2495 100644 --- a/Data/User/GameConfig/GMXE70.ini +++ b/Data/Sys/GameSettings/GMXE70.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = Needs real xfb for the videos to display. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -44,3 +44,10 @@ $Have Test And Multiplayer Fighting Levels(Save Game In Hacking Menu To Enable) [Video] ProjectionHack = 0 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GMXJB2.ini b/Data/Sys/GameSettings/GMXJB2.ini new file mode 100644 index 0000000000..9804d5f19a --- /dev/null +++ b/Data/Sys/GameSettings/GMXJB2.ini @@ -0,0 +1,30 @@ +# GMXJB2 - Enter The Matrix + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GMXP70.ini b/Data/Sys/GameSettings/GMXP70.ini new file mode 100644 index 0000000000..7d959b8fb5 --- /dev/null +++ b/Data/Sys/GameSettings/GMXP70.ini @@ -0,0 +1,30 @@ +# GMXP70 - Enter The Matrix + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GN4E69.ini b/Data/Sys/GameSettings/GN4E69.ini new file mode 100644 index 0000000000..61afa2e480 --- /dev/null +++ b/Data/Sys/GameSettings/GN4E69.ini @@ -0,0 +1,31 @@ +# GN4E69 - NASCAR 2005 + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GN6E69.ini b/Data/Sys/GameSettings/GN6E69.ini similarity index 100% rename from Data/User/GameConfig/GN6E69.ini rename to Data/Sys/GameSettings/GN6E69.ini diff --git a/Data/User/GameConfig/GN8E69.ini b/Data/Sys/GameSettings/GN8E69.ini similarity index 100% rename from Data/User/GameConfig/GN8E69.ini rename to Data/Sys/GameSettings/GN8E69.ini diff --git a/Data/User/GameConfig/GN8P69.ini b/Data/Sys/GameSettings/GN8P69.ini similarity index 100% rename from Data/User/GameConfig/GN8P69.ini rename to Data/Sys/GameSettings/GN8P69.ini diff --git a/Data/User/GameConfig/GNDE69.ini b/Data/Sys/GameSettings/GNDE69.ini similarity index 100% rename from Data/User/GameConfig/GNDE69.ini rename to Data/Sys/GameSettings/GNDE69.ini diff --git a/Data/Sys/GameSettings/GNED78.ini b/Data/Sys/GameSettings/GNED78.ini new file mode 100644 index 0000000000..317761c127 --- /dev/null +++ b/Data/Sys/GameSettings/GNED78.ini @@ -0,0 +1,22 @@ +# GNED78 - Finding Nemo + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GNEE78.ini b/Data/Sys/GameSettings/GNEE78.ini new file mode 100644 index 0000000000..af49d7e664 --- /dev/null +++ b/Data/Sys/GameSettings/GNEE78.ini @@ -0,0 +1,22 @@ +# GNEE78 - Finding Nemo + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GNEF78.ini b/Data/Sys/GameSettings/GNEF78.ini new file mode 100644 index 0000000000..b0303ea9cf --- /dev/null +++ b/Data/Sys/GameSettings/GNEF78.ini @@ -0,0 +1,22 @@ +# GNEF78 - Finding Nemo + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GNEP78.ini b/Data/Sys/GameSettings/GNEP78.ini new file mode 100644 index 0000000000..5bf28ebd07 --- /dev/null +++ b/Data/Sys/GameSettings/GNEP78.ini @@ -0,0 +1,22 @@ +# GNEP78 - Finding Nemo + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GNES78.ini b/Data/Sys/GameSettings/GNES78.ini new file mode 100644 index 0000000000..b29379ab2e --- /dev/null +++ b/Data/Sys/GameSettings/GNES78.ini @@ -0,0 +1,22 @@ +# GNES78 - Finding Nemo + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GNHE5d.ini b/Data/Sys/GameSettings/GNHE5d.ini similarity index 97% rename from Data/User/GameConfig/GNHE5d.ini rename to Data/Sys/GameSettings/GNHE5d.ini index 17ee4b8008..8c54af0a1e 100644 --- a/Data/User/GameConfig/GNHE5d.ini +++ b/Data/Sys/GameSettings/GNHE5d.ini @@ -13,7 +13,7 @@ EmulationIssues = Enable the GameCube BIOS to allow the game to boot. [OnFrame] # Add memory patches to be applied every frame here. -+$Nop Hack +$Nop Hack 0x80025BA0:dword:0x60000000 [ActionReplay] diff --git a/Data/Sys/GameSettings/GNIEA4.ini b/Data/Sys/GameSettings/GNIEA4.ini new file mode 100644 index 0000000000..bb20d2ad9e --- /dev/null +++ b/Data/Sys/GameSettings/GNIEA4.ini @@ -0,0 +1,16 @@ +# GNIEA4 - TMNT2 +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GNIPA4.ini b/Data/Sys/GameSettings/GNIPA4.ini new file mode 100644 index 0000000000..38808a2ee6 --- /dev/null +++ b/Data/Sys/GameSettings/GNIPA4.ini @@ -0,0 +1,16 @@ +# GNIPA4 - TMNT2 +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/User/GameConfig/GNJEAF.ini b/Data/Sys/GameSettings/GNJEAF.ini similarity index 100% rename from Data/User/GameConfig/GNJEAF.ini rename to Data/Sys/GameSettings/GNJEAF.ini diff --git a/Data/User/GameConfig/GNLE69.ini b/Data/Sys/GameSettings/GNLE69.ini similarity index 100% rename from Data/User/GameConfig/GNLE69.ini rename to Data/Sys/GameSettings/GNLE69.ini diff --git a/Data/User/GameConfig/RMKP01.ini b/Data/Sys/GameSettings/GNMEAF.ini similarity index 82% rename from Data/User/GameConfig/RMKP01.ini rename to Data/Sys/GameSettings/GNMEAF.ini index d153ea1f57..fc88ba0709 100644 --- a/Data/User/GameConfig/RMKP01.ini +++ b/Data/Sys/GameSettings/GNMEAF.ini @@ -1,4 +1,4 @@ -# RMKP01 - MARIO SPORTS MIX +# GNMEAF - NAMCO MUSEUM [Core] # Values set here will override the main dolphin settings. @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3D11 plugin for less glitches (r6932) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,3 +25,6 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 + diff --git a/Data/User/GameConfig/GNNE69.ini b/Data/Sys/GameSettings/GNNE69.ini similarity index 100% rename from Data/User/GameConfig/GNNE69.ini rename to Data/Sys/GameSettings/GNNE69.ini diff --git a/Data/User/GameConfig/GNOE78.ini b/Data/Sys/GameSettings/GNOE78.ini similarity index 100% rename from Data/User/GameConfig/GNOE78.ini rename to Data/Sys/GameSettings/GNOE78.ini diff --git a/Data/User/GameConfig/GNQE69.ini b/Data/Sys/GameSettings/GNQE69.ini similarity index 100% rename from Data/User/GameConfig/GNQE69.ini rename to Data/Sys/GameSettings/GNQE69.ini diff --git a/Data/User/GameConfig/GNRJDA.ini b/Data/Sys/GameSettings/GNRJDA.ini similarity index 100% rename from Data/User/GameConfig/GNRJDA.ini rename to Data/Sys/GameSettings/GNRJDA.ini diff --git a/Data/User/GameConfig/GNUEDA.ini b/Data/Sys/GameSettings/GNUEDA.ini similarity index 100% rename from Data/User/GameConfig/GNUEDA.ini rename to Data/Sys/GameSettings/GNUEDA.ini diff --git a/Data/User/GameConfig/GNWE69.ini b/Data/Sys/GameSettings/GNWE69.ini similarity index 100% rename from Data/User/GameConfig/GNWE69.ini rename to Data/Sys/GameSettings/GNWE69.ini diff --git a/Data/User/GameConfig/GNWP69.ini b/Data/Sys/GameSettings/GNWP69.ini similarity index 100% rename from Data/User/GameConfig/GNWP69.ini rename to Data/Sys/GameSettings/GNWP69.ini diff --git a/Data/User/GameConfig/GO2E4F.ini b/Data/Sys/GameSettings/GO2E4F.ini similarity index 100% rename from Data/User/GameConfig/GO2E4F.ini rename to Data/Sys/GameSettings/GO2E4F.ini diff --git a/Data/User/GameConfig/GO7E69.ini b/Data/Sys/GameSettings/GO7E69.ini similarity index 100% rename from Data/User/GameConfig/GO7E69.ini rename to Data/Sys/GameSettings/GO7E69.ini diff --git a/Data/User/GameConfig/GO7F69.ini b/Data/Sys/GameSettings/GO7F69.ini similarity index 100% rename from Data/User/GameConfig/GO7F69.ini rename to Data/Sys/GameSettings/GO7F69.ini diff --git a/Data/User/GameConfig/GO7P69.ini b/Data/Sys/GameSettings/GO7P69.ini similarity index 100% rename from Data/User/GameConfig/GO7P69.ini rename to Data/Sys/GameSettings/GO7P69.ini diff --git a/Data/User/GameConfig/GOAE52.ini b/Data/Sys/GameSettings/GOAE52.ini similarity index 100% rename from Data/User/GameConfig/GOAE52.ini rename to Data/Sys/GameSettings/GOAE52.ini diff --git a/Data/User/GameConfig/GOBE4Z.ini b/Data/Sys/GameSettings/GOBE4Z.ini similarity index 100% rename from Data/User/GameConfig/GOBE4Z.ini rename to Data/Sys/GameSettings/GOBE4Z.ini diff --git a/Data/User/GameConfig/GOCE5D.ini b/Data/Sys/GameSettings/GOCE5D.ini similarity index 100% rename from Data/User/GameConfig/GOCE5D.ini rename to Data/Sys/GameSettings/GOCE5D.ini diff --git a/Data/User/GameConfig/GOGJB2.ini b/Data/Sys/GameSettings/GOGJB2.ini similarity index 100% rename from Data/User/GameConfig/GOGJB2.ini rename to Data/Sys/GameSettings/GOGJB2.ini diff --git a/Data/User/GameConfig/GOME01.ini b/Data/Sys/GameSettings/GOME01.ini similarity index 100% rename from Data/User/GameConfig/GOME01.ini rename to Data/Sys/GameSettings/GOME01.ini diff --git a/Data/User/GameConfig/GOMP01.ini b/Data/Sys/GameSettings/GOMP01.ini similarity index 100% rename from Data/User/GameConfig/GOMP01.ini rename to Data/Sys/GameSettings/GOMP01.ini diff --git a/Data/User/GameConfig/GONE69.ini b/Data/Sys/GameSettings/GONE69.ini similarity index 100% rename from Data/User/GameConfig/GONE69.ini rename to Data/Sys/GameSettings/GONE69.ini diff --git a/Data/User/GameConfig/GOOE01.ini b/Data/Sys/GameSettings/GOOE01.ini similarity index 100% rename from Data/User/GameConfig/GOOE01.ini rename to Data/Sys/GameSettings/GOOE01.ini diff --git a/Data/User/GameConfig/GOPEB2.ini b/Data/Sys/GameSettings/GOPEB2.ini similarity index 100% rename from Data/User/GameConfig/GOPEB2.ini rename to Data/Sys/GameSettings/GOPEB2.ini diff --git a/Data/User/GameConfig/GOPJB2.ini b/Data/Sys/GameSettings/GOPJB2.ini similarity index 100% rename from Data/User/GameConfig/GOPJB2.ini rename to Data/Sys/GameSettings/GOPJB2.ini diff --git a/Data/User/GameConfig/GOQEAF.ini b/Data/Sys/GameSettings/GOQEAF.ini similarity index 92% rename from Data/User/GameConfig/GOQEAF.ini rename to Data/Sys/GameSettings/GOQEAF.ini index 56c790c605..f69223c109 100644 --- a/Data/User/GameConfig/GOQEAF.ini +++ b/Data/Sys/GameSettings/GOQEAF.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = bad texture +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GOSE41.ini b/Data/Sys/GameSettings/GOSE41.ini similarity index 100% rename from Data/User/GameConfig/GOSE41.ini rename to Data/Sys/GameSettings/GOSE41.ini diff --git a/Data/User/GameConfig/GOSP41.ini b/Data/Sys/GameSettings/GOSP41.ini similarity index 100% rename from Data/User/GameConfig/GOSP41.ini rename to Data/Sys/GameSettings/GOSP41.ini diff --git a/Data/User/GameConfig/GOSX41.ini b/Data/Sys/GameSettings/GOSX41.ini similarity index 100% rename from Data/User/GameConfig/GOSX41.ini rename to Data/Sys/GameSettings/GOSX41.ini diff --git a/Data/User/GameConfig/GOWD69.ini b/Data/Sys/GameSettings/GOWD69.ini similarity index 100% rename from Data/User/GameConfig/GOWD69.ini rename to Data/Sys/GameSettings/GOWD69.ini diff --git a/Data/User/GameConfig/GOWE69.ini b/Data/Sys/GameSettings/GOWE69.ini similarity index 100% rename from Data/User/GameConfig/GOWE69.ini rename to Data/Sys/GameSettings/GOWE69.ini diff --git a/Data/User/GameConfig/GOWF69.ini b/Data/Sys/GameSettings/GOWF69.ini similarity index 100% rename from Data/User/GameConfig/GOWF69.ini rename to Data/Sys/GameSettings/GOWF69.ini diff --git a/Data/User/GameConfig/GOWJ69.ini b/Data/Sys/GameSettings/GOWJ69.ini similarity index 100% rename from Data/User/GameConfig/GOWJ69.ini rename to Data/Sys/GameSettings/GOWJ69.ini diff --git a/Data/User/GameConfig/GOWP69.ini b/Data/Sys/GameSettings/GOWP69.ini similarity index 100% rename from Data/User/GameConfig/GOWP69.ini rename to Data/Sys/GameSettings/GOWP69.ini diff --git a/Data/User/GameConfig/GOYD69.ini b/Data/Sys/GameSettings/GOYD69.ini similarity index 100% rename from Data/User/GameConfig/GOYD69.ini rename to Data/Sys/GameSettings/GOYD69.ini diff --git a/Data/User/GameConfig/GOYE69.ini b/Data/Sys/GameSettings/GOYE69.ini similarity index 100% rename from Data/User/GameConfig/GOYE69.ini rename to Data/Sys/GameSettings/GOYE69.ini diff --git a/Data/User/GameConfig/GOYF69.ini b/Data/Sys/GameSettings/GOYF69.ini similarity index 100% rename from Data/User/GameConfig/GOYF69.ini rename to Data/Sys/GameSettings/GOYF69.ini diff --git a/Data/Sys/GameSettings/GOYP69.ini b/Data/Sys/GameSettings/GOYP69.ini new file mode 100644 index 0000000000..3128181698 --- /dev/null +++ b/Data/Sys/GameSettings/GOYP69.ini @@ -0,0 +1,31 @@ +# GOYP69 - GoldenEye Rogue Agent + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Videos are messed up, skip them. +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 512 + diff --git a/Data/Sys/GameSettings/GOYS69.ini b/Data/Sys/GameSettings/GOYS69.ini new file mode 100644 index 0000000000..0c54f77e43 --- /dev/null +++ b/Data/Sys/GameSettings/GOYS69.ini @@ -0,0 +1,31 @@ +# GOYS69 - GoldenEye Rogue Agent + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Videos are messed up, skip them. +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 512 + diff --git a/Data/User/GameConfig/GP2E82.ini b/Data/Sys/GameSettings/GP2E82.ini similarity index 100% rename from Data/User/GameConfig/GP2E82.ini rename to Data/Sys/GameSettings/GP2E82.ini diff --git a/Data/User/GameConfig/GP2EAF.ini b/Data/Sys/GameSettings/GP2EAF.ini similarity index 100% rename from Data/User/GameConfig/GP2EAF.ini rename to Data/Sys/GameSettings/GP2EAF.ini diff --git a/Data/User/GameConfig/GP4J18.ini b/Data/Sys/GameSettings/GP4J18.ini similarity index 100% rename from Data/User/GameConfig/GP4J18.ini rename to Data/Sys/GameSettings/GP4J18.ini diff --git a/Data/User/GameConfig/GP5E01.ini b/Data/Sys/GameSettings/GP5E01.ini similarity index 100% rename from Data/User/GameConfig/GP5E01.ini rename to Data/Sys/GameSettings/GP5E01.ini diff --git a/Data/User/GameConfig/GP5J01.ini b/Data/Sys/GameSettings/GP5J01.ini similarity index 100% rename from Data/User/GameConfig/GP5J01.ini rename to Data/Sys/GameSettings/GP5J01.ini diff --git a/Data/User/GameConfig/GP5P01.ini b/Data/Sys/GameSettings/GP5P01.ini similarity index 100% rename from Data/User/GameConfig/GP5P01.ini rename to Data/Sys/GameSettings/GP5P01.ini diff --git a/Data/User/GameConfig/GP6E01.ini b/Data/Sys/GameSettings/GP6E01.ini similarity index 100% rename from Data/User/GameConfig/GP6E01.ini rename to Data/Sys/GameSettings/GP6E01.ini diff --git a/Data/User/GameConfig/GP6J01.ini b/Data/Sys/GameSettings/GP6J01.ini similarity index 100% rename from Data/User/GameConfig/GP6J01.ini rename to Data/Sys/GameSettings/GP6J01.ini diff --git a/Data/User/GameConfig/GP6P01.ini b/Data/Sys/GameSettings/GP6P01.ini similarity index 100% rename from Data/User/GameConfig/GP6P01.ini rename to Data/Sys/GameSettings/GP6P01.ini diff --git a/Data/User/GameConfig/GP7E01.ini b/Data/Sys/GameSettings/GP7E01.ini similarity index 100% rename from Data/User/GameConfig/GP7E01.ini rename to Data/Sys/GameSettings/GP7E01.ini diff --git a/Data/User/GameConfig/GP7J01.ini b/Data/Sys/GameSettings/GP7J01.ini similarity index 100% rename from Data/User/GameConfig/GP7J01.ini rename to Data/Sys/GameSettings/GP7J01.ini diff --git a/Data/User/GameConfig/GP7P01.ini b/Data/Sys/GameSettings/GP7P01.ini similarity index 100% rename from Data/User/GameConfig/GP7P01.ini rename to Data/Sys/GameSettings/GP7P01.ini diff --git a/Data/User/GameConfig/GP8EAF.ini b/Data/Sys/GameSettings/GP8EAF.ini similarity index 100% rename from Data/User/GameConfig/GP8EAF.ini rename to Data/Sys/GameSettings/GP8EAF.ini diff --git a/Data/User/GameConfig/GPAE01.ini b/Data/Sys/GameSettings/GPAE01.ini similarity index 100% rename from Data/User/GameConfig/GPAE01.ini rename to Data/Sys/GameSettings/GPAE01.ini diff --git a/Data/User/GameConfig/GPAJ01.ini b/Data/Sys/GameSettings/GPAJ01.ini similarity index 100% rename from Data/User/GameConfig/GPAJ01.ini rename to Data/Sys/GameSettings/GPAJ01.ini diff --git a/Data/User/GameConfig/GPAP01.ini b/Data/Sys/GameSettings/GPAP01.ini similarity index 100% rename from Data/User/GameConfig/GPAP01.ini rename to Data/Sys/GameSettings/GPAP01.ini diff --git a/Data/User/GameConfig/GPAU01.ini b/Data/Sys/GameSettings/GPAU01.ini similarity index 100% rename from Data/User/GameConfig/GPAU01.ini rename to Data/Sys/GameSettings/GPAU01.ini diff --git a/Data/User/GameConfig/GPDE51.ini b/Data/Sys/GameSettings/GPDE51.ini similarity index 100% rename from Data/User/GameConfig/GPDE51.ini rename to Data/Sys/GameSettings/GPDE51.ini diff --git a/Data/User/GameConfig/GPEJ2Q.ini b/Data/Sys/GameSettings/GPEJ2Q.ini similarity index 100% rename from Data/User/GameConfig/GPEJ2Q.ini rename to Data/Sys/GameSettings/GPEJ2Q.ini diff --git a/Data/User/GameConfig/GPHD52.ini b/Data/Sys/GameSettings/GPHD52.ini similarity index 100% rename from Data/User/GameConfig/GPHD52.ini rename to Data/Sys/GameSettings/GPHD52.ini diff --git a/Data/User/GameConfig/GPHE52.ini b/Data/Sys/GameSettings/GPHE52.ini similarity index 100% rename from Data/User/GameConfig/GPHE52.ini rename to Data/Sys/GameSettings/GPHE52.ini diff --git a/Data/User/GameConfig/GPHP52.ini b/Data/Sys/GameSettings/GPHP52.ini similarity index 100% rename from Data/User/GameConfig/GPHP52.ini rename to Data/Sys/GameSettings/GPHP52.ini diff --git a/Data/User/GameConfig/GPIE01.ini b/Data/Sys/GameSettings/GPIE01.ini similarity index 98% rename from Data/User/GameConfig/GPIE01.ini rename to Data/Sys/GameSettings/GPIE01.ini index d62466cfc7..767fb0b5de 100644 --- a/Data/User/GameConfig/GPIE01.ini +++ b/Data/Sys/GameSettings/GPIE01.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -161,9 +162,6 @@ $Random Colors-Every Blue Pikmin 803D1E18 00000001 803D1E19 FFFFFFFF 803D1E1A 0000007F - -[Video] -ProjectionHack = 0 $Stop Time From Advancing (Story Mode) [Link Master] 040518DC 60000000 $Stop/Return Flow of Time (L+D-pad Left/Right) (Story Mode) [Link Master] @@ -174,3 +172,8 @@ E2000001 80008000 040518DC D0030014 E2000001 80008000 +[Video] +ProjectionHack = 0 + +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/JADE01.ini b/Data/Sys/GameSettings/GPIJ01.ini similarity index 82% rename from Data/User/GameConfig/JADE01.ini rename to Data/Sys/GameSettings/GPIJ01.ini index 3d6627c176..e4ad40cc0c 100644 --- a/Data/User/GameConfig/JADE01.ini +++ b/Data/Sys/GameSettings/GPIJ01.ini @@ -1,11 +1,12 @@ -# JADE01 - The Legend of Zelda A Link to the Past +# GPIJ01 - Pikmin [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = +EmulationIssues = EmulationStateId = 4 [OnLoad] @@ -20,3 +21,5 @@ EmulationStateId = 4 [Video] ProjectionHack = 0 +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GPIP01.ini b/Data/Sys/GameSettings/GPIP01.ini similarity index 97% rename from Data/User/GameConfig/GPIP01.ini rename to Data/Sys/GameSettings/GPIP01.ini index 3cb5a2eb2e..8287ed6205 100644 --- a/Data/User/GameConfig/GPIP01.ini +++ b/Data/Sys/GameSettings/GPIP01.ini @@ -2,10 +2,11 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = sound is sometimes glitchy though +EmulationIssues = EmulationStateId = 4 [OnLoad] @@ -96,3 +97,5 @@ $Gfx Debug [Video] ProjectionHack = 0 +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GPKE41.ini b/Data/Sys/GameSettings/GPKE41.ini similarity index 100% rename from Data/User/GameConfig/GPKE41.ini rename to Data/Sys/GameSettings/GPKE41.ini diff --git a/Data/User/GameConfig/GPNE08.ini b/Data/Sys/GameSettings/GPNE08.ini similarity index 100% rename from Data/User/GameConfig/GPNE08.ini rename to Data/Sys/GameSettings/GPNE08.ini diff --git a/Data/User/GameConfig/GPNP08.ini b/Data/Sys/GameSettings/GPNP08.ini similarity index 100% rename from Data/User/GameConfig/GPNP08.ini rename to Data/Sys/GameSettings/GPNP08.ini diff --git a/Data/User/GameConfig/GPOE8P.ini b/Data/Sys/GameSettings/GPOE8P.ini similarity index 100% rename from Data/User/GameConfig/GPOE8P.ini rename to Data/Sys/GameSettings/GPOE8P.ini diff --git a/Data/Sys/GameSettings/GPOJ8P.ini b/Data/Sys/GameSettings/GPOJ8P.ini new file mode 100644 index 0000000000..a7dc099f11 --- /dev/null +++ b/Data/Sys/GameSettings/GPOJ8P.ini @@ -0,0 +1,30 @@ +# GPOJ8P - PHANTASY STAR ONLINE EPISODE I&II + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 512 + diff --git a/Data/User/GameConfig/GPOP8P.ini b/Data/Sys/GameSettings/GPOP8P.ini similarity index 100% rename from Data/User/GameConfig/GPOP8P.ini rename to Data/Sys/GameSettings/GPOP8P.ini diff --git a/Data/User/GameConfig/GPSE8P.ini b/Data/Sys/GameSettings/GPSE8P.ini similarity index 100% rename from Data/User/GameConfig/GPSE8P.ini rename to Data/Sys/GameSettings/GPSE8P.ini diff --git a/Data/User/GameConfig/GPSP8P.ini b/Data/Sys/GameSettings/GPSP8P.ini similarity index 100% rename from Data/User/GameConfig/GPSP8P.ini rename to Data/Sys/GameSettings/GPSP8P.ini diff --git a/Data/User/GameConfig/GPTE41.ini b/Data/Sys/GameSettings/GPTE41.ini similarity index 100% rename from Data/User/GameConfig/GPTE41.ini rename to Data/Sys/GameSettings/GPTE41.ini diff --git a/Data/User/GameConfig/GPTP41.ini b/Data/Sys/GameSettings/GPTP41.ini similarity index 100% rename from Data/User/GameConfig/GPTP41.ini rename to Data/Sys/GameSettings/GPTP41.ini diff --git a/Data/User/GameConfig/GPVE01.ini b/Data/Sys/GameSettings/GPVE01.ini similarity index 97% rename from Data/User/GameConfig/GPVE01.ini rename to Data/Sys/GameSettings/GPVE01.ini index 4480c1a5c8..215e6d5c94 100644 --- a/Data/User/GameConfig/GPVE01.ini +++ b/Data/Sys/GameSettings/GPVE01.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -92,3 +93,5 @@ $999 White Flower Pikmin 0292F9AC 00030000 0492F9B4 000003E7 +[DSP] +EnableJIT = True diff --git a/Data/Sys/GameSettings/GPVJ01.ini b/Data/Sys/GameSettings/GPVJ01.ini new file mode 100644 index 0000000000..bf849ae382 --- /dev/null +++ b/Data/Sys/GameSettings/GPVJ01.ini @@ -0,0 +1,30 @@ +# GPVJ01 - PIKMIN2 for GAMECUBE + +[Core] +# Values set here will override the main dolphin settings. +DSPHLE = False + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GPVP01.ini b/Data/Sys/GameSettings/GPVP01.ini similarity index 92% rename from Data/User/GameConfig/GPVP01.ini rename to Data/Sys/GameSettings/GPVP01.ini index 1c30d85597..e6ec3a3d9b 100644 --- a/Data/User/GameConfig/GPVP01.ini +++ b/Data/Sys/GameSettings/GPVP01.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +DSPHLE = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -25,3 +26,5 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True diff --git a/Data/User/GameConfig/GR8E69.ini b/Data/Sys/GameSettings/GPXJ01.ini similarity index 84% rename from Data/User/GameConfig/GR8E69.ini rename to Data/Sys/GameSettings/GPXJ01.ini index c2879a4b0c..ab4233ccb2 100644 --- a/Data/User/GameConfig/GR8E69.ini +++ b/Data/Sys/GameSettings/GPXJ01.ini @@ -1,11 +1,11 @@ -# GR8E69 - Medal of Honor Rising Sun +# GPXJ01 - POKeMON BOX RUBY&SAPPHIRE [Core] # Values set here will override the main dolphin settings. [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 +EmulationStateId = 2 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GPXP01.ini b/Data/Sys/GameSettings/GPXP01.ini similarity index 100% rename from Data/User/GameConfig/GPXP01.ini rename to Data/Sys/GameSettings/GPXP01.ini diff --git a/Data/User/GameConfig/GPZJ01.ini b/Data/Sys/GameSettings/GPZJ01.ini similarity index 100% rename from Data/User/GameConfig/GPZJ01.ini rename to Data/Sys/GameSettings/GPZJ01.ini diff --git a/Data/User/GameConfig/GQ8E69.ini b/Data/Sys/GameSettings/GQ8E69.ini similarity index 100% rename from Data/User/GameConfig/GQ8E69.ini rename to Data/Sys/GameSettings/GQ8E69.ini diff --git a/Data/Sys/GameSettings/GQCD52.ini b/Data/Sys/GameSettings/GQCD52.ini new file mode 100644 index 0000000000..e69adf6d19 --- /dev/null +++ b/Data/Sys/GameSettings/GQCD52.ini @@ -0,0 +1,19 @@ +# GQCD52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GQCE52.ini b/Data/Sys/GameSettings/GQCE52.ini new file mode 100644 index 0000000000..8f3452a597 --- /dev/null +++ b/Data/Sys/GameSettings/GQCE52.ini @@ -0,0 +1,19 @@ +# GQCE52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GQCF52.ini b/Data/Sys/GameSettings/GQCF52.ini new file mode 100644 index 0000000000..da55f72b96 --- /dev/null +++ b/Data/Sys/GameSettings/GQCF52.ini @@ -0,0 +1,19 @@ +# GQCF52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GQCI52.ini b/Data/Sys/GameSettings/GQCI52.ini new file mode 100644 index 0000000000..5c4a86a220 --- /dev/null +++ b/Data/Sys/GameSettings/GQCI52.ini @@ -0,0 +1,20 @@ +# GQCI52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Geck \ No newline at end of file diff --git a/Data/Sys/GameSettings/GQCP52.ini b/Data/Sys/GameSettings/GQCP52.ini new file mode 100644 index 0000000000..6c8850c4f1 --- /dev/null +++ b/Data/Sys/GameSettings/GQCP52.ini @@ -0,0 +1,19 @@ +# GQCP52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GQCS52.ini b/Data/Sys/GameSettings/GQCS52.ini new file mode 100644 index 0000000000..1da24daea4 --- /dev/null +++ b/Data/Sys/GameSettings/GQCS52.ini @@ -0,0 +1,19 @@ +# GQCS52 - Call of Duty 2: Big Red One +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Slow because it needs mmu to run. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GQLE9G.ini b/Data/Sys/GameSettings/GQLE9G.ini similarity index 100% rename from Data/User/GameConfig/GQLE9G.ini rename to Data/Sys/GameSettings/GQLE9G.ini diff --git a/Data/User/GameConfig/GQNE5D.ini b/Data/Sys/GameSettings/GQNE5D.ini similarity index 100% rename from Data/User/GameConfig/GQNE5D.ini rename to Data/Sys/GameSettings/GQNE5D.ini diff --git a/Data/Sys/GameSettings/GQQD78.ini b/Data/Sys/GameSettings/GQQD78.ini new file mode 100644 index 0000000000..e786ce46f8 --- /dev/null +++ b/Data/Sys/GameSettings/GQQD78.ini @@ -0,0 +1,16 @@ +# GQQD78 - SpongeBob Lights, Camera, PANTS +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GQQE78.ini b/Data/Sys/GameSettings/GQQE78.ini new file mode 100644 index 0000000000..442c5ad1d4 --- /dev/null +++ b/Data/Sys/GameSettings/GQQE78.ini @@ -0,0 +1,16 @@ +# GQQE78 - SpongeBob Lights, Camera, PANTS +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GQQF78.ini b/Data/Sys/GameSettings/GQQF78.ini new file mode 100644 index 0000000000..c4297e90ea --- /dev/null +++ b/Data/Sys/GameSettings/GQQF78.ini @@ -0,0 +1,16 @@ +# GQQF78 - SpongeBob Lights, Camera, PANTS +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GQQH78.ini b/Data/Sys/GameSettings/GQQH78.ini new file mode 100644 index 0000000000..c725e3fd79 --- /dev/null +++ b/Data/Sys/GameSettings/GQQH78.ini @@ -0,0 +1,16 @@ +# GQQH78 - SpongeBob Lights, Camera, PANTS +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/Sys/GameSettings/GQQP78.ini b/Data/Sys/GameSettings/GQQP78.ini new file mode 100644 index 0000000000..88a0e6c1a7 --- /dev/null +++ b/Data/Sys/GameSettings/GQQP78.ini @@ -0,0 +1,16 @@ +# GQQP78 - SpongeBob Lights, Camera, PANTS +[Core] +TLBHack = 1 +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] diff --git a/Data/User/GameConfig/GQSDAF.ini b/Data/Sys/GameSettings/GQSDAF.ini similarity index 96% rename from Data/User/GameConfig/GQSDAF.ini rename to Data/Sys/GameSettings/GQSDAF.ini index 933b8eeae1..d5a88fd3c5 100644 --- a/Data/User/GameConfig/GQSDAF.ini +++ b/Data/Sys/GameSettings/GQSDAF.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/GQSEAF.ini b/Data/Sys/GameSettings/GQSEAF.ini similarity index 99% rename from Data/User/GameConfig/GQSEAF.ini rename to Data/Sys/GameSettings/GQSEAF.ini index 157c0cac65..2f9393b87d 100644 --- a/Data/User/GameConfig/GQSEAF.ini +++ b/Data/Sys/GameSettings/GQSEAF.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 # Action Replay Notes # * * * * * NOTES ON EQUIPMENT MODIFIERS BEFORE USING THOSE CODES * * * * diff --git a/Data/User/GameConfig/GQSFAF.ini b/Data/Sys/GameSettings/GQSFAF.ini similarity index 96% rename from Data/User/GameConfig/GQSFAF.ini rename to Data/Sys/GameSettings/GQSFAF.ini index a613603ef3..211493d604 100644 --- a/Data/User/GameConfig/GQSFAF.ini +++ b/Data/Sys/GameSettings/GQSFAF.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/GQSPAF.ini b/Data/Sys/GameSettings/GQSPAF.ini similarity index 96% rename from Data/User/GameConfig/GQSPAF.ini rename to Data/Sys/GameSettings/GQSPAF.ini index 7ae944b7ed..a7e8da41e6 100644 --- a/Data/User/GameConfig/GQSPAF.ini +++ b/Data/Sys/GameSettings/GQSPAF.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/GQTE4Q.ini b/Data/Sys/GameSettings/GQTE4Q.ini similarity index 100% rename from Data/User/GameConfig/GQTE4Q.ini rename to Data/Sys/GameSettings/GQTE4Q.ini diff --git a/Data/User/GameConfig/GQWE69.ini b/Data/Sys/GameSettings/GQWE69.ini similarity index 100% rename from Data/User/GameConfig/GQWE69.ini rename to Data/Sys/GameSettings/GQWE69.ini diff --git a/Data/User/GameConfig/GQWJ69.ini b/Data/Sys/GameSettings/GQWJ69.ini similarity index 100% rename from Data/User/GameConfig/GQWJ69.ini rename to Data/Sys/GameSettings/GQWJ69.ini diff --git a/Data/User/GameConfig/GQWP69.ini b/Data/Sys/GameSettings/GQWP69.ini similarity index 100% rename from Data/User/GameConfig/GQWP69.ini rename to Data/Sys/GameSettings/GQWP69.ini diff --git a/Data/User/GameConfig/GQWX69.ini b/Data/Sys/GameSettings/GQWX69.ini similarity index 100% rename from Data/User/GameConfig/GQWX69.ini rename to Data/Sys/GameSettings/GQWX69.ini diff --git a/Data/User/GameConfig/GQXE69.ini b/Data/Sys/GameSettings/GQXE69.ini similarity index 100% rename from Data/User/GameConfig/GQXE69.ini rename to Data/Sys/GameSettings/GQXE69.ini diff --git a/Data/User/GameConfig/GR2E52.ini b/Data/Sys/GameSettings/GR2E52.ini similarity index 100% rename from Data/User/GameConfig/GR2E52.ini rename to Data/Sys/GameSettings/GR2E52.ini diff --git a/Data/User/GameConfig/GR6E78.ini b/Data/Sys/GameSettings/GR6E78.ini similarity index 100% rename from Data/User/GameConfig/GR6E78.ini rename to Data/Sys/GameSettings/GR6E78.ini diff --git a/Data/Sys/GameSettings/GR8D69.ini b/Data/Sys/GameSettings/GR8D69.ini new file mode 100644 index 0000000000..9137bd8be8 --- /dev/null +++ b/Data/Sys/GameSettings/GR8D69.ini @@ -0,0 +1,19 @@ +# GR8D69 - Medal of Honor Rising Sun +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Videos are messed up, skip them. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GR8E69.ini b/Data/Sys/GameSettings/GR8E69.ini new file mode 100644 index 0000000000..616f8db8c0 --- /dev/null +++ b/Data/Sys/GameSettings/GR8E69.ini @@ -0,0 +1,19 @@ +# GR8E69 - Medal of Honor Rising Sun +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Videos are messed up, skip them. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GR8F69.ini b/Data/Sys/GameSettings/GR8F69.ini new file mode 100644 index 0000000000..738cd33de7 --- /dev/null +++ b/Data/Sys/GameSettings/GR8F69.ini @@ -0,0 +1,19 @@ +# GR8F69 - Medal of Honor Rising Sun +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Videos are messed up, skip them. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GR8J69.ini b/Data/Sys/GameSettings/GR8J69.ini new file mode 100644 index 0000000000..c66e915d6f --- /dev/null +++ b/Data/Sys/GameSettings/GR8J69.ini @@ -0,0 +1,19 @@ +# GR8J69 - Medal of Honor Rising Sun +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Videos are messed up, skip them. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/GR8P69.ini b/Data/Sys/GameSettings/GR8P69.ini new file mode 100644 index 0000000000..f9845f3af2 --- /dev/null +++ b/Data/Sys/GameSettings/GR8P69.ini @@ -0,0 +1,19 @@ +# GR8P69 - Medal of Honor Rising Sun +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Videos are messed up, skip them. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GRAE5Z.ini b/Data/Sys/GameSettings/GRAE5Z.ini similarity index 100% rename from Data/User/GameConfig/GRAE5Z.ini rename to Data/Sys/GameSettings/GRAE5Z.ini diff --git a/Data/User/GameConfig/GRBE6S.ini b/Data/Sys/GameSettings/GRBE6S.ini similarity index 100% rename from Data/User/GameConfig/GRBE6S.ini rename to Data/Sys/GameSettings/GRBE6S.ini diff --git a/Data/User/GameConfig/GRBP6S.ini b/Data/Sys/GameSettings/GRBP6S.ini similarity index 100% rename from Data/User/GameConfig/GRBP6S.ini rename to Data/Sys/GameSettings/GRBP6S.ini diff --git a/Data/User/GameConfig/GREE08.ini b/Data/Sys/GameSettings/GREE08.ini similarity index 100% rename from Data/User/GameConfig/GREE08.ini rename to Data/Sys/GameSettings/GREE08.ini diff --git a/Data/User/GameConfig/GREP08.ini b/Data/Sys/GameSettings/GREP08.ini similarity index 100% rename from Data/User/GameConfig/GREP08.ini rename to Data/Sys/GameSettings/GREP08.ini diff --git a/Data/User/GameConfig/GRFE78.ini b/Data/Sys/GameSettings/GRFE78.ini similarity index 100% rename from Data/User/GameConfig/GRFE78.ini rename to Data/Sys/GameSettings/GRFE78.ini diff --git a/Data/User/GameConfig/GRHE41.ini b/Data/Sys/GameSettings/GRHE41.ini similarity index 100% rename from Data/User/GameConfig/GRHE41.ini rename to Data/Sys/GameSettings/GRHE41.ini diff --git a/Data/User/GameConfig/GRHP41.ini b/Data/Sys/GameSettings/GRHP41.ini similarity index 100% rename from Data/User/GameConfig/GRHP41.ini rename to Data/Sys/GameSettings/GRHP41.ini diff --git a/Data/User/GameConfig/GRJEAF.ini b/Data/Sys/GameSettings/GRJEAF.ini similarity index 100% rename from Data/User/GameConfig/GRJEAF.ini rename to Data/Sys/GameSettings/GRJEAF.ini diff --git a/Data/User/GameConfig/GRKE41.ini b/Data/Sys/GameSettings/GRKE41.ini similarity index 100% rename from Data/User/GameConfig/GRKE41.ini rename to Data/Sys/GameSettings/GRKE41.ini diff --git a/Data/User/GameConfig/GRKP7G.ini b/Data/Sys/GameSettings/GRKP7G.ini similarity index 100% rename from Data/User/GameConfig/GRKP7G.ini rename to Data/Sys/GameSettings/GRKP7G.ini diff --git a/Data/User/GameConfig/GRLE41.ini b/Data/Sys/GameSettings/GRLE41.ini similarity index 100% rename from Data/User/GameConfig/GRLE41.ini rename to Data/Sys/GameSettings/GRLE41.ini diff --git a/Data/User/GameConfig/GRNE52.ini b/Data/Sys/GameSettings/GRNE52.ini similarity index 100% rename from Data/User/GameConfig/GRNE52.ini rename to Data/Sys/GameSettings/GRNE52.ini diff --git a/Data/User/GameConfig/GROP7J.ini b/Data/Sys/GameSettings/GROP7J.ini similarity index 100% rename from Data/User/GameConfig/GROP7J.ini rename to Data/Sys/GameSettings/GROP7J.ini diff --git a/Data/User/GameConfig/GRQE41.ini b/Data/Sys/GameSettings/GRQE41.ini similarity index 100% rename from Data/User/GameConfig/GRQE41.ini rename to Data/Sys/GameSettings/GRQE41.ini diff --git a/Data/User/GameConfig/GRSEAF.ini b/Data/Sys/GameSettings/GRSEAF.ini similarity index 100% rename from Data/User/GameConfig/GRSEAF.ini rename to Data/Sys/GameSettings/GRSEAF.ini diff --git a/Data/User/GameConfig/GRSPAF.ini b/Data/Sys/GameSettings/GRSPAF.ini similarity index 100% rename from Data/User/GameConfig/GRSPAF.ini rename to Data/Sys/GameSettings/GRSPAF.ini diff --git a/Data/User/GameConfig/GRUE78.ini b/Data/Sys/GameSettings/GRUE78.ini similarity index 100% rename from Data/User/GameConfig/GRUE78.ini rename to Data/Sys/GameSettings/GRUE78.ini diff --git a/Data/User/GameConfig/GRVEA4.ini b/Data/Sys/GameSettings/GRVEA4.ini similarity index 100% rename from Data/User/GameConfig/GRVEA4.ini rename to Data/Sys/GameSettings/GRVEA4.ini diff --git a/Data/User/GameConfig/RUUP01.ini b/Data/Sys/GameSettings/GRVJA4.ini similarity index 91% rename from Data/User/GameConfig/RUUP01.ini rename to Data/Sys/GameSettings/GRVJA4.ini index 673d8ad463..f776bec5f3 100644 --- a/Data/User/GameConfig/RUUP01.ini +++ b/Data/Sys/GameSettings/GRVJA4.ini @@ -1,4 +1,4 @@ -# RUUP01 - Animal Crossing Wii +# GRVJA4 - GROOVE ADVENTURE RAVE [Core] # Values set here will override the main dolphin settings. diff --git a/Data/User/GameConfig/GRYE41.ini b/Data/Sys/GameSettings/GRYE41.ini similarity index 100% rename from Data/User/GameConfig/GRYE41.ini rename to Data/Sys/GameSettings/GRYE41.ini diff --git a/Data/User/GameConfig/GS2D78.ini b/Data/Sys/GameSettings/GS2D78.ini similarity index 100% rename from Data/User/GameConfig/GS2D78.ini rename to Data/Sys/GameSettings/GS2D78.ini diff --git a/Data/User/GameConfig/GS2E78.ini b/Data/Sys/GameSettings/GS2E78.ini similarity index 100% rename from Data/User/GameConfig/GS2E78.ini rename to Data/Sys/GameSettings/GS2E78.ini diff --git a/Data/User/GameConfig/GS2F78.ini b/Data/Sys/GameSettings/GS2F78.ini similarity index 100% rename from Data/User/GameConfig/GS2F78.ini rename to Data/Sys/GameSettings/GS2F78.ini diff --git a/Data/User/GameConfig/GS2P78.ini b/Data/Sys/GameSettings/GS2P78.ini similarity index 100% rename from Data/User/GameConfig/GS2P78.ini rename to Data/Sys/GameSettings/GS2P78.ini diff --git a/Data/User/GameConfig/GS8P7D.ini b/Data/Sys/GameSettings/GS8P7D.ini similarity index 100% rename from Data/User/GameConfig/GS8P7D.ini rename to Data/Sys/GameSettings/GS8P7D.ini diff --git a/Data/User/GameConfig/GSAE01.ini b/Data/Sys/GameSettings/GSAE01.ini similarity index 100% rename from Data/User/GameConfig/GSAE01.ini rename to Data/Sys/GameSettings/GSAE01.ini diff --git a/Data/User/GameConfig/SJDP41.ini b/Data/Sys/GameSettings/GSAJ01.ini similarity index 80% rename from Data/User/GameConfig/SJDP41.ini rename to Data/Sys/GameSettings/GSAJ01.ini index 0de2883f39..aa18628e45 100644 --- a/Data/User/GameConfig/SJDP41.ini +++ b/Data/Sys/GameSettings/GSAJ01.ini @@ -1,12 +1,12 @@ -# SJDP41 - Just Dance 3 +# GSAJ01 - Star Fox Adventures [Core] # Values set here will override the main dolphin settings. [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 -EmulationIssues = Suffers from random ingame lock ups. +EmulationIssues = Use dx11 plugin(r6477) +EmulationStateId = 4 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GSAP01.ini b/Data/Sys/GameSettings/GSAP01.ini similarity index 100% rename from Data/User/GameConfig/GSAP01.ini rename to Data/Sys/GameSettings/GSAP01.ini diff --git a/Data/User/GameConfig/GSCE51.ini b/Data/Sys/GameSettings/GSCE51.ini similarity index 100% rename from Data/User/GameConfig/GSCE51.ini rename to Data/Sys/GameSettings/GSCE51.ini diff --git a/Data/User/GameConfig/GSEJB2.ini b/Data/Sys/GameSettings/GSEJB2.ini similarity index 100% rename from Data/User/GameConfig/GSEJB2.ini rename to Data/Sys/GameSettings/GSEJB2.ini diff --git a/Data/User/GameConfig/GSMP52.ini b/Data/Sys/GameSettings/GSMP52.ini similarity index 100% rename from Data/User/GameConfig/GSMP52.ini rename to Data/Sys/GameSettings/GSMP52.ini diff --git a/Data/User/GameConfig/GSNE8P.ini b/Data/Sys/GameSettings/GSNE8P.ini similarity index 100% rename from Data/User/GameConfig/GSNE8P.ini rename to Data/Sys/GameSettings/GSNE8P.ini diff --git a/Data/User/GameConfig/GSNP8P.ini b/Data/Sys/GameSettings/GSNP8P.ini similarity index 100% rename from Data/User/GameConfig/GSNP8P.ini rename to Data/Sys/GameSettings/GSNP8P.ini diff --git a/Data/User/GameConfig/GSOE8P.ini b/Data/Sys/GameSettings/GSOE8P.ini similarity index 100% rename from Data/User/GameConfig/GSOE8P.ini rename to Data/Sys/GameSettings/GSOE8P.ini diff --git a/Data/Sys/GameSettings/GSOJ8P.ini b/Data/Sys/GameSettings/GSOJ8P.ini new file mode 100644 index 0000000000..b8f6e66fe0 --- /dev/null +++ b/Data/Sys/GameSettings/GSOJ8P.ini @@ -0,0 +1,31 @@ +# GSOJ8P - Sonic Mega Collection + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GSOP8P.ini b/Data/Sys/GameSettings/GSOP8P.ini similarity index 100% rename from Data/User/GameConfig/GSOP8P.ini rename to Data/Sys/GameSettings/GSOP8P.ini diff --git a/Data/User/GameConfig/GSPE69.ini b/Data/Sys/GameSettings/GSPE69.ini similarity index 100% rename from Data/User/GameConfig/GSPE69.ini rename to Data/Sys/GameSettings/GSPE69.ini diff --git a/Data/Sys/GameSettings/GSQE78.ini b/Data/Sys/GameSettings/GSQE78.ini new file mode 100644 index 0000000000..69c2a8722c --- /dev/null +++ b/Data/Sys/GameSettings/GSQE78.ini @@ -0,0 +1,18 @@ +# GSQE78 - SpongeBob SquarePants ROTFD +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GSQP78.ini b/Data/Sys/GameSettings/GSQP78.ini new file mode 100644 index 0000000000..cc74ae9793 --- /dev/null +++ b/Data/Sys/GameSettings/GSQP78.ini @@ -0,0 +1,18 @@ +# GSQP78 - SpongeBob SquarePants ROTFD +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GSSE8P.ini b/Data/Sys/GameSettings/GSSE8P.ini similarity index 100% rename from Data/User/GameConfig/GSSE8P.ini rename to Data/Sys/GameSettings/GSSE8P.ini diff --git a/Data/User/GameConfig/GSSJ8P.ini b/Data/Sys/GameSettings/GSSJ8P.ini similarity index 100% rename from Data/User/GameConfig/GSSJ8P.ini rename to Data/Sys/GameSettings/GSSJ8P.ini diff --git a/Data/User/GameConfig/GSSP70.ini b/Data/Sys/GameSettings/GSSP70.ini similarity index 100% rename from Data/User/GameConfig/GSSP70.ini rename to Data/Sys/GameSettings/GSSP70.ini diff --git a/Data/User/GameConfig/GSSP8P.ini b/Data/Sys/GameSettings/GSSP8P.ini similarity index 100% rename from Data/User/GameConfig/GSSP8P.ini rename to Data/Sys/GameSettings/GSSP8P.ini diff --git a/Data/User/GameConfig/GSTE69.ini b/Data/Sys/GameSettings/GSTE69.ini similarity index 100% rename from Data/User/GameConfig/GSTE69.ini rename to Data/Sys/GameSettings/GSTE69.ini diff --git a/Data/User/GameConfig/GSTP69.ini b/Data/Sys/GameSettings/GSTP69.ini similarity index 100% rename from Data/User/GameConfig/GSTP69.ini rename to Data/Sys/GameSettings/GSTP69.ini diff --git a/Data/User/GameConfig/GSWE64.ini b/Data/Sys/GameSettings/GSWE64.ini similarity index 98% rename from Data/User/GameConfig/GSWE64.ini rename to Data/Sys/GameSettings/GSWE64.ini index 8a3d604694..59418ec3f3 100644 --- a/Data/User/GameConfig/GSWE64.ini +++ b/Data/Sys/GameSettings/GSWE64.ini @@ -3,7 +3,6 @@ [Core] # Values set here will override the main dolphin settings. MMU = 1 -BAT = 1 FastDiscSpeed = 1 [EmuState] @@ -34,4 +33,3 @@ UseRealXFB = False [Video_Hacks] EFBEmulateFormatChanges = True - diff --git a/Data/Sys/GameSettings/GSWI64.ini b/Data/Sys/GameSettings/GSWI64.ini new file mode 100644 index 0000000000..23f04559af --- /dev/null +++ b/Data/Sys/GameSettings/GSWI64.ini @@ -0,0 +1,36 @@ +# GSWI64 - Star Wars: Rogue Leader + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 +FastDiscSpeed = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 3 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False + +[Video_Hacks] +EFBEmulateFormatChanges = True + diff --git a/Data/User/GameConfig/GSWP64.ini b/Data/Sys/GameSettings/GSWP64.ini similarity index 98% rename from Data/User/GameConfig/GSWP64.ini rename to Data/Sys/GameSettings/GSWP64.ini index 3f864e2d5d..27ac0fb2b1 100644 --- a/Data/User/GameConfig/GSWP64.ini +++ b/Data/Sys/GameSettings/GSWP64.ini @@ -3,7 +3,6 @@ [Core] # Values set here will override the main dolphin settings. MMU = 1 -BAT = 1 FastDiscSpeed = 1 [EmuState] diff --git a/Data/User/GameConfig/GSWS64.ini b/Data/Sys/GameSettings/GSWS64.ini similarity index 98% rename from Data/User/GameConfig/GSWS64.ini rename to Data/Sys/GameSettings/GSWS64.ini index 98617ef317..a820aec1bd 100644 --- a/Data/User/GameConfig/GSWS64.ini +++ b/Data/Sys/GameSettings/GSWS64.ini @@ -3,7 +3,6 @@ [Core] # Values set here will override the main dolphin settings. MMU = 1 -BAT = 1 FastDiscSpeed = 1 [EmuState] diff --git a/Data/User/GameConfig/GSZP41.ini b/Data/Sys/GameSettings/GSZP41.ini similarity index 100% rename from Data/User/GameConfig/GSZP41.ini rename to Data/Sys/GameSettings/GSZP41.ini diff --git a/Data/User/GameConfig/GT3D52.ini b/Data/Sys/GameSettings/GT3D52.ini similarity index 96% rename from Data/User/GameConfig/GT3D52.ini rename to Data/Sys/GameSettings/GT3D52.ini index a62f31171d..906554193b 100644 --- a/Data/User/GameConfig/GT3D52.ini +++ b/Data/Sys/GameSettings/GT3D52.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = Needs real xfb for videos to display. [OnLoad] diff --git a/Data/User/GameConfig/GT3E52.ini b/Data/Sys/GameSettings/GT3E52.ini similarity index 96% rename from Data/User/GameConfig/GT3E52.ini rename to Data/Sys/GameSettings/GT3E52.ini index cdc563be6d..c002087035 100644 --- a/Data/User/GameConfig/GT3E52.ini +++ b/Data/Sys/GameSettings/GT3E52.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = Needs real xfb for videos to display. [OnLoad] diff --git a/Data/User/GameConfig/GT3F52.ini b/Data/Sys/GameSettings/GT3F52.ini similarity index 96% rename from Data/User/GameConfig/GT3F52.ini rename to Data/Sys/GameSettings/GT3F52.ini index 80865ad41f..7ea73148e6 100644 --- a/Data/User/GameConfig/GT3F52.ini +++ b/Data/Sys/GameSettings/GT3F52.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = Needs real xfb for videos to display. [OnLoad] diff --git a/Data/User/GameConfig/GT3P52.ini b/Data/Sys/GameSettings/GT3P52.ini similarity index 96% rename from Data/User/GameConfig/GT3P52.ini rename to Data/Sys/GameSettings/GT3P52.ini index d75ac6dc54..c2d4525c27 100644 --- a/Data/User/GameConfig/GT3P52.ini +++ b/Data/Sys/GameSettings/GT3P52.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = Needs real xfb for videos to display. [OnLoad] diff --git a/Data/Sys/GameSettings/GT4D52.ini b/Data/Sys/GameSettings/GT4D52.ini new file mode 100644 index 0000000000..25e55b1d98 --- /dev/null +++ b/Data/Sys/GameSettings/GT4D52.ini @@ -0,0 +1,22 @@ +# GT4D52 - Tony Hawk's Pro Skater 4 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GT4E52.ini b/Data/Sys/GameSettings/GT4E52.ini new file mode 100644 index 0000000000..4c3d483359 --- /dev/null +++ b/Data/Sys/GameSettings/GT4E52.ini @@ -0,0 +1,22 @@ +# GT4E52 - Tony Hawk's Pro Skater 4 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GT4F52.ini b/Data/Sys/GameSettings/GT4F52.ini new file mode 100644 index 0000000000..c30970c8f6 --- /dev/null +++ b/Data/Sys/GameSettings/GT4F52.ini @@ -0,0 +1,22 @@ +# GT4F52 - Tony Hawk's Pro Skater 4 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/Sys/GameSettings/GT4P52.ini b/Data/Sys/GameSettings/GT4P52.ini new file mode 100644 index 0000000000..2a7e1958f1 --- /dev/null +++ b/Data/Sys/GameSettings/GT4P52.ini @@ -0,0 +1,22 @@ +# GT4P52 - Tony Hawk's Pro Skater 4 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/GT6E70.ini b/Data/Sys/GameSettings/GT6E70.ini similarity index 100% rename from Data/User/GameConfig/GT6E70.ini rename to Data/Sys/GameSettings/GT6E70.ini diff --git a/Data/User/GameConfig/GT7E41.ini b/Data/Sys/GameSettings/GT7E41.ini similarity index 100% rename from Data/User/GameConfig/GT7E41.ini rename to Data/Sys/GameSettings/GT7E41.ini diff --git a/Data/User/GameConfig/GT7P41.ini b/Data/Sys/GameSettings/GT7P41.ini similarity index 100% rename from Data/User/GameConfig/GT7P41.ini rename to Data/Sys/GameSettings/GT7P41.ini diff --git a/Data/User/GameConfig/GT7X41.ini b/Data/Sys/GameSettings/GT7X41.ini similarity index 100% rename from Data/User/GameConfig/GT7X41.ini rename to Data/Sys/GameSettings/GT7X41.ini diff --git a/Data/User/GameConfig/GT8E78.ini b/Data/Sys/GameSettings/GT8E78.ini similarity index 100% rename from Data/User/GameConfig/GT8E78.ini rename to Data/Sys/GameSettings/GT8E78.ini diff --git a/Data/User/GameConfig/GTCJBL.ini b/Data/Sys/GameSettings/GTCJBL.ini similarity index 100% rename from Data/User/GameConfig/GTCJBL.ini rename to Data/Sys/GameSettings/GTCJBL.ini diff --git a/Data/User/GameConfig/GTEE01.ini b/Data/Sys/GameSettings/GTEE01.ini similarity index 100% rename from Data/User/GameConfig/GTEE01.ini rename to Data/Sys/GameSettings/GTEE01.ini diff --git a/Data/User/GameConfig/GTEP01.ini b/Data/Sys/GameSettings/GTEP01.ini similarity index 100% rename from Data/User/GameConfig/GTEP01.ini rename to Data/Sys/GameSettings/GTEP01.ini diff --git a/Data/User/GameConfig/GTFEA4.ini b/Data/Sys/GameSettings/GTFEA4.ini similarity index 100% rename from Data/User/GameConfig/GTFEA4.ini rename to Data/Sys/GameSettings/GTFEA4.ini diff --git a/Data/User/GameConfig/GTKE51.ini b/Data/Sys/GameSettings/GTKE51.ini similarity index 100% rename from Data/User/GameConfig/GTKE51.ini rename to Data/Sys/GameSettings/GTKE51.ini diff --git a/Data/User/GameConfig/GTKP51.ini b/Data/Sys/GameSettings/GTKP51.ini similarity index 100% rename from Data/User/GameConfig/GTKP51.ini rename to Data/Sys/GameSettings/GTKP51.ini diff --git a/Data/Sys/GameSettings/GTLE52.ini b/Data/Sys/GameSettings/GTLE52.ini new file mode 100644 index 0000000000..a1285ab300 --- /dev/null +++ b/Data/Sys/GameSettings/GTLE52.ini @@ -0,0 +1,28 @@ +# GTLE52 - True Crime + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + diff --git a/Data/Sys/GameSettings/GTLP52.ini b/Data/Sys/GameSettings/GTLP52.ini new file mode 100644 index 0000000000..fe24debe70 --- /dev/null +++ b/Data/Sys/GameSettings/GTLP52.ini @@ -0,0 +1,28 @@ +# GTLP52 - True Crime + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + diff --git a/Data/Sys/GameSettings/GTLX52.ini b/Data/Sys/GameSettings/GTLX52.ini new file mode 100644 index 0000000000..d6901ad874 --- /dev/null +++ b/Data/Sys/GameSettings/GTLX52.ini @@ -0,0 +1,28 @@ +# GTLX52 - True Crime + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + diff --git a/Data/Sys/GameSettings/GTOJAF.ini b/Data/Sys/GameSettings/GTOJAF.ini new file mode 100644 index 0000000000..0b50ff4f50 --- /dev/null +++ b/Data/Sys/GameSettings/GTOJAF.ini @@ -0,0 +1,32 @@ +# GTOJAF - TALES OF SYMPHONIA + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = 0.5 +PH_ZFar = 1 + +[Video_Settings] +SafeTextureCacheColorSamples = 512 + +[Video_Hacks] +DlistCachingEnable = False diff --git a/Data/Sys/GameSettings/GTRE78.ini b/Data/Sys/GameSettings/GTRE78.ini new file mode 100644 index 0000000000..e9b1cb2591 --- /dev/null +++ b/Data/Sys/GameSettings/GTRE78.ini @@ -0,0 +1,18 @@ +# GTRE78 - Tetris Worlds +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = True +[Gecko] diff --git a/Data/Sys/GameSettings/GTRP78.ini b/Data/Sys/GameSettings/GTRP78.ini new file mode 100644 index 0000000000..1722710375 --- /dev/null +++ b/Data/Sys/GameSettings/GTRP78.ini @@ -0,0 +1,18 @@ +# GTRP78 - Tetris Worlds +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = True +[Gecko] diff --git a/Data/User/GameConfig/GTSE4F.ini b/Data/Sys/GameSettings/GTSE4F.ini similarity index 100% rename from Data/User/GameConfig/GTSE4F.ini rename to Data/Sys/GameSettings/GTSE4F.ini diff --git a/Data/User/GameConfig/GTSP4F.ini b/Data/Sys/GameSettings/GTSP4F.ini similarity index 100% rename from Data/User/GameConfig/GTSP4F.ini rename to Data/Sys/GameSettings/GTSP4F.ini diff --git a/Data/User/GameConfig/GTUE8G.ini b/Data/Sys/GameSettings/GTUE8G.ini similarity index 100% rename from Data/User/GameConfig/GTUE8G.ini rename to Data/Sys/GameSettings/GTUE8G.ini diff --git a/Data/User/GameConfig/GTWE70.ini b/Data/Sys/GameSettings/GTWE70.ini similarity index 100% rename from Data/User/GameConfig/GTWE70.ini rename to Data/Sys/GameSettings/GTWE70.ini diff --git a/Data/User/GameConfig/GTWP70.ini b/Data/Sys/GameSettings/GTWP70.ini similarity index 100% rename from Data/User/GameConfig/GTWP70.ini rename to Data/Sys/GameSettings/GTWP70.ini diff --git a/Data/User/GameConfig/GTYE69.ini b/Data/Sys/GameSettings/GTYE69.ini similarity index 100% rename from Data/User/GameConfig/GTYE69.ini rename to Data/Sys/GameSettings/GTYE69.ini diff --git a/Data/User/GameConfig/GTYP69.ini b/Data/Sys/GameSettings/GTYP69.ini similarity index 100% rename from Data/User/GameConfig/GTYP69.ini rename to Data/Sys/GameSettings/GTYP69.ini diff --git a/Data/User/GameConfig/GTZE41.ini b/Data/Sys/GameSettings/GTZE41.ini similarity index 100% rename from Data/User/GameConfig/GTZE41.ini rename to Data/Sys/GameSettings/GTZE41.ini diff --git a/Data/User/GameConfig/GTZP41.ini b/Data/Sys/GameSettings/GTZP41.ini similarity index 100% rename from Data/User/GameConfig/GTZP41.ini rename to Data/Sys/GameSettings/GTZP41.ini diff --git a/Data/User/GameConfig/GUBE69.ini b/Data/Sys/GameSettings/GUBE69.ini similarity index 100% rename from Data/User/GameConfig/GUBE69.ini rename to Data/Sys/GameSettings/GUBE69.ini diff --git a/Data/User/GameConfig/GUBP69.ini b/Data/Sys/GameSettings/GUBP69.ini similarity index 100% rename from Data/User/GameConfig/GUBP69.ini rename to Data/Sys/GameSettings/GUBP69.ini diff --git a/Data/User/GameConfig/GUCP69.ini b/Data/Sys/GameSettings/GUCP69.ini similarity index 100% rename from Data/User/GameConfig/GUCP69.ini rename to Data/Sys/GameSettings/GUCP69.ini diff --git a/Data/User/GameConfig/GUFE4Z.ini b/Data/Sys/GameSettings/GUFE4Z.ini similarity index 100% rename from Data/User/GameConfig/GUFE4Z.ini rename to Data/Sys/GameSettings/GUFE4Z.ini diff --git a/Data/User/GameConfig/GUGE69.ini b/Data/Sys/GameSettings/GUGE69.ini similarity index 100% rename from Data/User/GameConfig/GUGE69.ini rename to Data/Sys/GameSettings/GUGE69.ini diff --git a/Data/User/GameConfig/GUME52.ini b/Data/Sys/GameSettings/GUME52.ini similarity index 100% rename from Data/User/GameConfig/GUME52.ini rename to Data/Sys/GameSettings/GUME52.ini diff --git a/Data/User/GameConfig/GUMP52.ini b/Data/Sys/GameSettings/GUMP52.ini similarity index 100% rename from Data/User/GameConfig/GUMP52.ini rename to Data/Sys/GameSettings/GUMP52.ini diff --git a/Data/User/GameConfig/GUNE5D.ini b/Data/Sys/GameSettings/GUNE5D.ini similarity index 100% rename from Data/User/GameConfig/GUNE5D.ini rename to Data/Sys/GameSettings/GUNE5D.ini diff --git a/Data/User/GameConfig/GUPE8P.ini b/Data/Sys/GameSettings/GUPE8P.ini similarity index 100% rename from Data/User/GameConfig/GUPE8P.ini rename to Data/Sys/GameSettings/GUPE8P.ini diff --git a/Data/User/GameConfig/GUPP8P.ini b/Data/Sys/GameSettings/GUPP8P.ini similarity index 100% rename from Data/User/GameConfig/GUPP8P.ini rename to Data/Sys/GameSettings/GUPP8P.ini diff --git a/Data/Sys/GameSettings/GUTD52.ini b/Data/Sys/GameSettings/GUTD52.ini new file mode 100644 index 0000000000..3f5dedc272 --- /dev/null +++ b/Data/Sys/GameSettings/GUTD52.ini @@ -0,0 +1,31 @@ +# GUTD52 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GUTE52.ini b/Data/Sys/GameSettings/GUTE52.ini similarity index 96% rename from Data/User/GameConfig/GUTE52.ini rename to Data/Sys/GameSettings/GUTE52.ini index 1271e44bb5..685738f72e 100644 --- a/Data/User/GameConfig/GUTE52.ini +++ b/Data/Sys/GameSettings/GUTE52.ini @@ -3,7 +3,6 @@ [Core] # Values set here will override the main dolphin settings. MMU = 1 -BAT = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. @@ -29,4 +28,5 @@ PH_ZFar = [Video_Settings] UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GUTF52.ini b/Data/Sys/GameSettings/GUTF52.ini new file mode 100644 index 0000000000..360b02e515 --- /dev/null +++ b/Data/Sys/GameSettings/GUTF52.ini @@ -0,0 +1,31 @@ +# GUTF52 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GUTI52.ini b/Data/Sys/GameSettings/GUTI52.ini new file mode 100644 index 0000000000..db1860968f --- /dev/null +++ b/Data/Sys/GameSettings/GUTI52.ini @@ -0,0 +1,31 @@ +# GUTI52 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GUTJC0.ini b/Data/Sys/GameSettings/GUTJC0.ini new file mode 100644 index 0000000000..c863b6928a --- /dev/null +++ b/Data/Sys/GameSettings/GUTJC0.ini @@ -0,0 +1,31 @@ +# GUTJC0 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GUTP52.ini b/Data/Sys/GameSettings/GUTP52.ini new file mode 100644 index 0000000000..b4fc80fc0f --- /dev/null +++ b/Data/Sys/GameSettings/GUTP52.ini @@ -0,0 +1,31 @@ +# GUTP52 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GUTS52.ini b/Data/Sys/GameSettings/GUTS52.ini new file mode 100644 index 0000000000..ee3bcdab69 --- /dev/null +++ b/Data/Sys/GameSettings/GUTS52.ini @@ -0,0 +1,31 @@ +# GUTS52 - Ultimate Spider-Man + +[Core] +# Values set here will override the main dolphin settings. +MMU = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GUVE51.ini b/Data/Sys/GameSettings/GUVE51.ini similarity index 100% rename from Data/User/GameConfig/GUVE51.ini rename to Data/Sys/GameSettings/GUVE51.ini diff --git a/Data/User/GameConfig/GUZE41.ini b/Data/Sys/GameSettings/GUZE41.ini similarity index 100% rename from Data/User/GameConfig/GUZE41.ini rename to Data/Sys/GameSettings/GUZE41.ini diff --git a/Data/User/GameConfig/GUZP41.ini b/Data/Sys/GameSettings/GUZP41.ini similarity index 100% rename from Data/User/GameConfig/GUZP41.ini rename to Data/Sys/GameSettings/GUZP41.ini diff --git a/Data/User/GameConfig/GV3E70.ini b/Data/Sys/GameSettings/GV3E70.ini similarity index 100% rename from Data/User/GameConfig/GV3E70.ini rename to Data/Sys/GameSettings/GV3E70.ini diff --git a/Data/User/GameConfig/GV3P70.ini b/Data/Sys/GameSettings/GV3P70.ini similarity index 100% rename from Data/User/GameConfig/GV3P70.ini rename to Data/Sys/GameSettings/GV3P70.ini diff --git a/Data/User/GameConfig/SJDZ41.ini b/Data/Sys/GameSettings/GV4E69.ini similarity index 77% rename from Data/User/GameConfig/SJDZ41.ini rename to Data/Sys/GameSettings/GV4E69.ini index 0de2883f39..2f67ffdfb6 100644 --- a/Data/User/GameConfig/SJDZ41.ini +++ b/Data/Sys/GameSettings/GV4E69.ini @@ -1,12 +1,13 @@ -# SJDP41 - Just Dance 3 +# GV4E69 - MVP Baseball 2005 [Core] # Values set here will override the main dolphin settings. +TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Videos are messed up, skip them. 2d graphics are also messed up. EmulationStateId = 3 -EmulationIssues = Suffers from random ingame lock ups. [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GVCE08.ini b/Data/Sys/GameSettings/GVCE08.ini similarity index 100% rename from Data/User/GameConfig/GVCE08.ini rename to Data/Sys/GameSettings/GVCE08.ini diff --git a/Data/User/GameConfig/GVCP08.ini b/Data/Sys/GameSettings/GVCP08.ini similarity index 100% rename from Data/User/GameConfig/GVCP08.ini rename to Data/Sys/GameSettings/GVCP08.ini diff --git a/Data/User/GameConfig/GVDE78.ini b/Data/Sys/GameSettings/GVDE78.ini similarity index 100% rename from Data/User/GameConfig/GVDE78.ini rename to Data/Sys/GameSettings/GVDE78.ini diff --git a/Data/User/GameConfig/GVHE4F.ini b/Data/Sys/GameSettings/GVHE4F.ini similarity index 100% rename from Data/User/GameConfig/GVHE4F.ini rename to Data/Sys/GameSettings/GVHE4F.ini diff --git a/Data/User/GameConfig/GVJE08.ini b/Data/Sys/GameSettings/GVJE08.ini similarity index 100% rename from Data/User/GameConfig/GVJE08.ini rename to Data/Sys/GameSettings/GVJE08.ini diff --git a/Data/User/GameConfig/GVJJ08.ini b/Data/Sys/GameSettings/GVJJ08.ini similarity index 100% rename from Data/User/GameConfig/GVJJ08.ini rename to Data/Sys/GameSettings/GVJJ08.ini diff --git a/Data/User/GameConfig/GVJP08.ini b/Data/Sys/GameSettings/GVJP08.ini similarity index 100% rename from Data/User/GameConfig/GVJP08.ini rename to Data/Sys/GameSettings/GVJP08.ini diff --git a/Data/User/GameConfig/GVKE52.ini b/Data/Sys/GameSettings/GVKE52.ini similarity index 100% rename from Data/User/GameConfig/GVKE52.ini rename to Data/Sys/GameSettings/GVKE52.ini diff --git a/Data/User/GameConfig/GVLD69.ini b/Data/Sys/GameSettings/GVLD69.ini similarity index 100% rename from Data/User/GameConfig/GVLD69.ini rename to Data/Sys/GameSettings/GVLD69.ini diff --git a/Data/User/GameConfig/GVLE69.ini b/Data/Sys/GameSettings/GVLE69.ini similarity index 100% rename from Data/User/GameConfig/GVLE69.ini rename to Data/Sys/GameSettings/GVLE69.ini diff --git a/Data/User/GameConfig/GVLF69.ini b/Data/Sys/GameSettings/GVLF69.ini similarity index 100% rename from Data/User/GameConfig/GVLF69.ini rename to Data/Sys/GameSettings/GVLF69.ini diff --git a/Data/User/GameConfig/GVLP69.ini b/Data/Sys/GameSettings/GVLP69.ini similarity index 100% rename from Data/User/GameConfig/GVLP69.ini rename to Data/Sys/GameSettings/GVLP69.ini diff --git a/Data/Sys/GameSettings/GVOE69.ini b/Data/Sys/GameSettings/GVOE69.ini new file mode 100644 index 0000000000..c766865799 --- /dev/null +++ b/Data/Sys/GameSettings/GVOE69.ini @@ -0,0 +1,31 @@ +# GVOE69 - BIONICLE + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GVOP69.ini b/Data/Sys/GameSettings/GVOP69.ini new file mode 100644 index 0000000000..6be9ec6c68 --- /dev/null +++ b/Data/Sys/GameSettings/GVOP69.ini @@ -0,0 +1,31 @@ +# GVOP69 - BIONICLE + +[Core] +# Values set here will override the main dolphin settings. +TLBHack = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for videos to show up. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GVRE7H.ini b/Data/Sys/GameSettings/GVRE7H.ini similarity index 100% rename from Data/User/GameConfig/GVRE7H.ini rename to Data/Sys/GameSettings/GVRE7H.ini diff --git a/Data/User/GameConfig/GVSE8P.ini b/Data/Sys/GameSettings/GVSE8P.ini similarity index 100% rename from Data/User/GameConfig/GVSE8P.ini rename to Data/Sys/GameSettings/GVSE8P.ini diff --git a/Data/User/GameConfig/GVSP8P.ini b/Data/Sys/GameSettings/GVSP8P.ini similarity index 100% rename from Data/User/GameConfig/GVSP8P.ini rename to Data/Sys/GameSettings/GVSP8P.ini diff --git a/Data/User/GameConfig/GW2E78.ini b/Data/Sys/GameSettings/GW2E78.ini similarity index 100% rename from Data/User/GameConfig/GW2E78.ini rename to Data/Sys/GameSettings/GW2E78.ini diff --git a/Data/User/GameConfig/GW2P78.ini b/Data/Sys/GameSettings/GW2P78.ini similarity index 100% rename from Data/User/GameConfig/GW2P78.ini rename to Data/Sys/GameSettings/GW2P78.ini diff --git a/Data/User/GameConfig/GW3E78.ini b/Data/Sys/GameSettings/GW3E78.ini similarity index 100% rename from Data/User/GameConfig/GW3E78.ini rename to Data/Sys/GameSettings/GW3E78.ini diff --git a/Data/User/GameConfig/GW3P78.ini b/Data/Sys/GameSettings/GW3P78.ini similarity index 100% rename from Data/User/GameConfig/GW3P78.ini rename to Data/Sys/GameSettings/GW3P78.ini diff --git a/Data/User/GameConfig/GW5E69.ini b/Data/Sys/GameSettings/GW5E69.ini similarity index 100% rename from Data/User/GameConfig/GW5E69.ini rename to Data/Sys/GameSettings/GW5E69.ini diff --git a/Data/User/GameConfig/GW7E69.ini b/Data/Sys/GameSettings/GW7E69.ini similarity index 100% rename from Data/User/GameConfig/GW7E69.ini rename to Data/Sys/GameSettings/GW7E69.ini diff --git a/Data/User/GameConfig/GW7P69.ini b/Data/Sys/GameSettings/GW7P69.ini similarity index 100% rename from Data/User/GameConfig/GW7P69.ini rename to Data/Sys/GameSettings/GW7P69.ini diff --git a/Data/User/GameConfig/GW8E52.ini b/Data/Sys/GameSettings/GW8E52.ini similarity index 100% rename from Data/User/GameConfig/GW8E52.ini rename to Data/Sys/GameSettings/GW8E52.ini diff --git a/Data/User/GameConfig/GW9E78.ini b/Data/Sys/GameSettings/GW9E78.ini similarity index 100% rename from Data/User/GameConfig/GW9E78.ini rename to Data/Sys/GameSettings/GW9E78.ini diff --git a/Data/User/GameConfig/GWAE8P.ini b/Data/Sys/GameSettings/GWAE8P.ini similarity index 100% rename from Data/User/GameConfig/GWAE8P.ini rename to Data/Sys/GameSettings/GWAE8P.ini diff --git a/Data/User/GameConfig/GWAF8P.ini b/Data/Sys/GameSettings/GWAF8P.ini similarity index 100% rename from Data/User/GameConfig/GWAF8P.ini rename to Data/Sys/GameSettings/GWAF8P.ini diff --git a/Data/User/GameConfig/GWAP8P.ini b/Data/Sys/GameSettings/GWAP8P.ini similarity index 100% rename from Data/User/GameConfig/GWAP8P.ini rename to Data/Sys/GameSettings/GWAP8P.ini diff --git a/Data/User/GameConfig/GWBP41.ini b/Data/Sys/GameSettings/GWBP41.ini similarity index 100% rename from Data/User/GameConfig/GWBP41.ini rename to Data/Sys/GameSettings/GWBP41.ini diff --git a/Data/User/GameConfig/GWEE51.ini b/Data/Sys/GameSettings/GWEE51.ini similarity index 100% rename from Data/User/GameConfig/GWEE51.ini rename to Data/Sys/GameSettings/GWEE51.ini diff --git a/Data/User/GameConfig/GWEJB0.ini b/Data/Sys/GameSettings/GWEJB0.ini similarity index 100% rename from Data/User/GameConfig/GWEJB0.ini rename to Data/Sys/GameSettings/GWEJB0.ini diff --git a/Data/User/GameConfig/GWEP8P.ini b/Data/Sys/GameSettings/GWEP8P.ini similarity index 100% rename from Data/User/GameConfig/GWEP8P.ini rename to Data/Sys/GameSettings/GWEP8P.ini diff --git a/Data/User/GameConfig/GWGP4F.ini b/Data/Sys/GameSettings/GWGP4F.ini similarity index 100% rename from Data/User/GameConfig/GWGP4F.ini rename to Data/Sys/GameSettings/GWGP4F.ini diff --git a/Data/User/GameConfig/GWJE52.ini b/Data/Sys/GameSettings/GWJE52.ini similarity index 67% rename from Data/User/GameConfig/GWJE52.ini rename to Data/Sys/GameSettings/GWJE52.ini index 9617e3876c..a00c124b47 100644 --- a/Data/User/GameConfig/GWJE52.ini +++ b/Data/Sys/GameSettings/GWJE52.ini @@ -1,20 +1,20 @@ # GWJE52 - Tony Hawk's American Wasteland - [Core] # Values set here will override the main dolphin settings. -TLBHack=1 - +MMU = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 Issues="Error to compile...DC error?" - +EmulationIssues = Slow because it needs mmu to run. [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/GWKE41.ini b/Data/Sys/GameSettings/GWKE41.ini similarity index 100% rename from Data/User/GameConfig/GWKE41.ini rename to Data/Sys/GameSettings/GWKE41.ini diff --git a/Data/User/GameConfig/GWKP41.ini b/Data/Sys/GameSettings/GWKP41.ini similarity index 100% rename from Data/User/GameConfig/GWKP41.ini rename to Data/Sys/GameSettings/GWKP41.ini diff --git a/Data/User/GameConfig/GWLE6L.ini b/Data/Sys/GameSettings/GWLE6L.ini similarity index 96% rename from Data/User/GameConfig/GWLE6L.ini rename to Data/Sys/GameSettings/GWLE6L.ini index 9b7610a605..1c0d8321e2 100644 --- a/Data/User/GameConfig/GWLE6L.ini +++ b/Data/Sys/GameSettings/GWLE6L.ini @@ -14,7 +14,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$Bypass FIFO reset +$Bypass FIFO reset 0x8028EF00:dword:0x48000638 [ActionReplay] diff --git a/Data/User/GameConfig/GWLX6L.ini b/Data/Sys/GameSettings/GWLX6L.ini similarity index 95% rename from Data/User/GameConfig/GWLX6L.ini rename to Data/Sys/GameSettings/GWLX6L.ini index 835182b36f..45f0910d95 100644 --- a/Data/User/GameConfig/GWLX6L.ini +++ b/Data/Sys/GameSettings/GWLX6L.ini @@ -14,7 +14,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$Bypass FIFO reset +$Bypass FIFO reset 0x8028EE80:dword:0x48000638 [ActionReplay] diff --git a/Data/User/GameConfig/GWME51.ini b/Data/Sys/GameSettings/GWME51.ini similarity index 100% rename from Data/User/GameConfig/GWME51.ini rename to Data/Sys/GameSettings/GWME51.ini diff --git a/Data/User/GameConfig/GWOE5G.ini b/Data/Sys/GameSettings/GWOE5G.ini similarity index 100% rename from Data/User/GameConfig/GWOE5G.ini rename to Data/Sys/GameSettings/GWOE5G.ini diff --git a/Data/User/GameConfig/GWPE78.ini b/Data/Sys/GameSettings/GWPE78.ini similarity index 100% rename from Data/User/GameConfig/GWPE78.ini rename to Data/Sys/GameSettings/GWPE78.ini diff --git a/Data/User/GameConfig/GWPJG2.ini b/Data/Sys/GameSettings/GWPJG2.ini similarity index 100% rename from Data/User/GameConfig/GWPJG2.ini rename to Data/Sys/GameSettings/GWPJG2.ini diff --git a/Data/User/GameConfig/GWPP78.ini b/Data/Sys/GameSettings/GWPP78.ini similarity index 100% rename from Data/User/GameConfig/GWPP78.ini rename to Data/Sys/GameSettings/GWPP78.ini diff --git a/Data/User/GameConfig/GWQE52.ini b/Data/Sys/GameSettings/GWQE52.ini similarity index 100% rename from Data/User/GameConfig/GWQE52.ini rename to Data/Sys/GameSettings/GWQE52.ini diff --git a/Data/User/GameConfig/GWRE01.ini b/Data/Sys/GameSettings/GWRE01.ini similarity index 100% rename from Data/User/GameConfig/GWRE01.ini rename to Data/Sys/GameSettings/GWRE01.ini diff --git a/Data/User/GameConfig/GWRP01.ini b/Data/Sys/GameSettings/GWRP01.ini similarity index 100% rename from Data/User/GameConfig/GWRP01.ini rename to Data/Sys/GameSettings/GWRP01.ini diff --git a/Data/User/GameConfig/GWSEA4.ini b/Data/Sys/GameSettings/GWSEA4.ini similarity index 100% rename from Data/User/GameConfig/GWSEA4.ini rename to Data/Sys/GameSettings/GWSEA4.ini diff --git a/Data/User/GameConfig/GWTEA4.ini b/Data/Sys/GameSettings/GWTEA4.ini similarity index 100% rename from Data/User/GameConfig/GWTEA4.ini rename to Data/Sys/GameSettings/GWTEA4.ini diff --git a/Data/User/GameConfig/GWVE52.ini b/Data/Sys/GameSettings/GWVE52.ini similarity index 100% rename from Data/User/GameConfig/GWVE52.ini rename to Data/Sys/GameSettings/GWVE52.ini diff --git a/Data/User/GameConfig/GWWE01.ini b/Data/Sys/GameSettings/GWWE01.ini similarity index 100% rename from Data/User/GameConfig/GWWE01.ini rename to Data/Sys/GameSettings/GWWE01.ini diff --git a/Data/User/GameConfig/GWWP01.ini b/Data/Sys/GameSettings/GWWP01.ini similarity index 100% rename from Data/User/GameConfig/GWWP01.ini rename to Data/Sys/GameSettings/GWWP01.ini diff --git a/Data/User/GameConfig/GWYE41.ini b/Data/Sys/GameSettings/GWYE41.ini similarity index 100% rename from Data/User/GameConfig/GWYE41.ini rename to Data/Sys/GameSettings/GWYE41.ini diff --git a/Data/User/GameConfig/GWYX41.ini b/Data/Sys/GameSettings/GWYX41.ini similarity index 100% rename from Data/User/GameConfig/GWYX41.ini rename to Data/Sys/GameSettings/GWYX41.ini diff --git a/Data/User/GameConfig/GWZE01.ini b/Data/Sys/GameSettings/GWZE01.ini similarity index 100% rename from Data/User/GameConfig/GWZE01.ini rename to Data/Sys/GameSettings/GWZE01.ini diff --git a/Data/User/GameConfig/GWZP01.ini b/Data/Sys/GameSettings/GWZP01.ini similarity index 100% rename from Data/User/GameConfig/GWZP01.ini rename to Data/Sys/GameSettings/GWZP01.ini diff --git a/Data/User/GameConfig/GX2E52.ini b/Data/Sys/GameSettings/GX2E52.ini similarity index 100% rename from Data/User/GameConfig/GX2E52.ini rename to Data/Sys/GameSettings/GX2E52.ini diff --git a/Data/User/GameConfig/GX2P52.ini b/Data/Sys/GameSettings/GX2P52.ini similarity index 100% rename from Data/User/GameConfig/GX2P52.ini rename to Data/Sys/GameSettings/GX2P52.ini diff --git a/Data/User/GameConfig/GX3E41.ini b/Data/Sys/GameSettings/GX3E41.ini similarity index 100% rename from Data/User/GameConfig/GX3E41.ini rename to Data/Sys/GameSettings/GX3E41.ini diff --git a/Data/User/GameConfig/GX3P41.ini b/Data/Sys/GameSettings/GX3P41.ini similarity index 100% rename from Data/User/GameConfig/GX3P41.ini rename to Data/Sys/GameSettings/GX3P41.ini diff --git a/Data/User/GameConfig/GX3X41.ini b/Data/Sys/GameSettings/GX3X41.ini similarity index 100% rename from Data/User/GameConfig/GX3X41.ini rename to Data/Sys/GameSettings/GX3X41.ini diff --git a/Data/User/GameConfig/GXBE69.ini b/Data/Sys/GameSettings/GXBE69.ini similarity index 100% rename from Data/User/GameConfig/GXBE69.ini rename to Data/Sys/GameSettings/GXBE69.ini diff --git a/Data/User/GameConfig/GXBP69.ini b/Data/Sys/GameSettings/GXBP69.ini similarity index 100% rename from Data/User/GameConfig/GXBP69.ini rename to Data/Sys/GameSettings/GXBP69.ini diff --git a/Data/User/GameConfig/GXCE01.ini b/Data/Sys/GameSettings/GXCE01.ini similarity index 89% rename from Data/User/GameConfig/GXCE01.ini rename to Data/Sys/GameSettings/GXCE01.ini index f2e7de7645..1b40bda6d7 100644 --- a/Data/User/GameConfig/GXCE01.ini +++ b/Data/Sys/GameSettings/GXCE01.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use direct 3d 11 for less glitches. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/SJDE41.ini b/Data/Sys/GameSettings/GXCJ01.ini similarity index 80% rename from Data/User/GameConfig/SJDE41.ini rename to Data/Sys/GameSettings/GXCJ01.ini index f9ed9f80f4..c251b14f5e 100644 --- a/Data/User/GameConfig/SJDE41.ini +++ b/Data/Sys/GameSettings/GXCJ01.ini @@ -1,12 +1,12 @@ -# SJDE41 - Just Dance 3 +# GXCJ01 - CustomRobo [Core] # Values set here will override the main dolphin settings. [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 -EmulationIssues = Suffers from random ingame lock ups. +EmulationStateId = 4 +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GXEE8P.ini b/Data/Sys/GameSettings/GXEE8P.ini similarity index 100% rename from Data/User/GameConfig/GXEE8P.ini rename to Data/Sys/GameSettings/GXEE8P.ini diff --git a/Data/User/GameConfig/GXEP8P.ini b/Data/Sys/GameSettings/GXEP8P.ini similarity index 100% rename from Data/User/GameConfig/GXEP8P.ini rename to Data/Sys/GameSettings/GXEP8P.ini diff --git a/Data/User/GameConfig/GXFE69.ini b/Data/Sys/GameSettings/GXFE69.ini similarity index 100% rename from Data/User/GameConfig/GXFE69.ini rename to Data/Sys/GameSettings/GXFE69.ini diff --git a/Data/User/GameConfig/GXFF69.ini b/Data/Sys/GameSettings/GXFF69.ini similarity index 100% rename from Data/User/GameConfig/GXFF69.ini rename to Data/Sys/GameSettings/GXFF69.ini diff --git a/Data/User/GameConfig/GXFP69.ini b/Data/Sys/GameSettings/GXFP69.ini similarity index 100% rename from Data/User/GameConfig/GXFP69.ini rename to Data/Sys/GameSettings/GXFP69.ini diff --git a/Data/Sys/GameSettings/GXGE08.ini b/Data/Sys/GameSettings/GXGE08.ini new file mode 100644 index 0000000000..b5d46d19f4 --- /dev/null +++ b/Data/Sys/GameSettings/GXGE08.ini @@ -0,0 +1,20 @@ +# GXGE08 - MEGAMAN X COLLECTION +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/GXLE52.ini b/Data/Sys/GameSettings/GXLE52.ini similarity index 100% rename from Data/User/GameConfig/GXLE52.ini rename to Data/Sys/GameSettings/GXLE52.ini diff --git a/Data/User/GameConfig/GXLP52.ini b/Data/Sys/GameSettings/GXLP52.ini similarity index 100% rename from Data/User/GameConfig/GXLP52.ini rename to Data/Sys/GameSettings/GXLP52.ini diff --git a/Data/Sys/GameSettings/GXME52.ini b/Data/Sys/GameSettings/GXME52.ini new file mode 100644 index 0000000000..bdeecff7be --- /dev/null +++ b/Data/Sys/GameSettings/GXME52.ini @@ -0,0 +1,30 @@ +# GXME52 - X-Men Next Dimension + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GXMF52.ini b/Data/Sys/GameSettings/GXMF52.ini new file mode 100644 index 0000000000..1a5e3185b5 --- /dev/null +++ b/Data/Sys/GameSettings/GXMF52.ini @@ -0,0 +1,30 @@ +# GXMF52 - X-Men Next Dimension + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/Sys/GameSettings/GXMP52.ini b/Data/Sys/GameSettings/GXMP52.ini new file mode 100644 index 0000000000..c7b4b99e36 --- /dev/null +++ b/Data/Sys/GameSettings/GXMP52.ini @@ -0,0 +1,30 @@ +# GXMP52 - X-Men Next Dimension + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real xfb for the videos to display. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = True diff --git a/Data/User/GameConfig/GXNE5D.ini b/Data/Sys/GameSettings/GXNE5D.ini similarity index 100% rename from Data/User/GameConfig/GXNE5D.ini rename to Data/Sys/GameSettings/GXNE5D.ini diff --git a/Data/User/GameConfig/GXOE69.ini b/Data/Sys/GameSettings/GXOE69.ini similarity index 100% rename from Data/User/GameConfig/GXOE69.ini rename to Data/Sys/GameSettings/GXOE69.ini diff --git a/Data/User/GameConfig/GXOX69.ini b/Data/Sys/GameSettings/GXOX69.ini similarity index 100% rename from Data/User/GameConfig/GXOX69.ini rename to Data/Sys/GameSettings/GXOX69.ini diff --git a/Data/User/GameConfig/GXRE08.ini b/Data/Sys/GameSettings/GXRE08.ini similarity index 100% rename from Data/User/GameConfig/GXRE08.ini rename to Data/Sys/GameSettings/GXRE08.ini diff --git a/Data/User/GameConfig/GXSE8P.ini b/Data/Sys/GameSettings/GXSE8P.ini similarity index 100% rename from Data/User/GameConfig/GXSE8P.ini rename to Data/Sys/GameSettings/GXSE8P.ini diff --git a/Data/User/GameConfig/GXSP8P.ini b/Data/Sys/GameSettings/GXSP8P.ini similarity index 100% rename from Data/User/GameConfig/GXSP8P.ini rename to Data/Sys/GameSettings/GXSP8P.ini diff --git a/Data/User/GameConfig/GXXE01.ini b/Data/Sys/GameSettings/GXXE01.ini similarity index 100% rename from Data/User/GameConfig/GXXE01.ini rename to Data/Sys/GameSettings/GXXE01.ini diff --git a/Data/User/GameConfig/GXXP01.ini b/Data/Sys/GameSettings/GXXP01.ini similarity index 100% rename from Data/User/GameConfig/GXXP01.ini rename to Data/Sys/GameSettings/GXXP01.ini diff --git a/Data/User/GameConfig/GY2E01.ini b/Data/Sys/GameSettings/GY2E01.ini similarity index 100% rename from Data/User/GameConfig/GY2E01.ini rename to Data/Sys/GameSettings/GY2E01.ini diff --git a/Data/User/GameConfig/GYAE78.ini b/Data/Sys/GameSettings/GYAE78.ini similarity index 100% rename from Data/User/GameConfig/GYAE78.ini rename to Data/Sys/GameSettings/GYAE78.ini diff --git a/Data/User/GameConfig/GYBP01.ini b/Data/Sys/GameSettings/GYBP01.ini similarity index 100% rename from Data/User/GameConfig/GYBP01.ini rename to Data/Sys/GameSettings/GYBP01.ini diff --git a/Data/User/GameConfig/GYFEA4.ini b/Data/Sys/GameSettings/GYFEA4.ini similarity index 100% rename from Data/User/GameConfig/GYFEA4.ini rename to Data/Sys/GameSettings/GYFEA4.ini diff --git a/Data/User/GameConfig/GYKEB2.ini b/Data/Sys/GameSettings/GYKEB2.ini similarity index 100% rename from Data/User/GameConfig/GYKEB2.ini rename to Data/Sys/GameSettings/GYKEB2.ini diff --git a/Data/Sys/GameSettings/GYQE01.ini b/Data/Sys/GameSettings/GYQE01.ini new file mode 100644 index 0000000000..f2eeac9819 --- /dev/null +++ b/Data/Sys/GameSettings/GYQE01.ini @@ -0,0 +1,33 @@ +# GYQE01 - Mario Superstar Baseball + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Player's shadow needs efb to ram and texture cache set to safe to appear properly. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GYQJ01.ini b/Data/Sys/GameSettings/GYQJ01.ini new file mode 100644 index 0000000000..2241ed691f --- /dev/null +++ b/Data/Sys/GameSettings/GYQJ01.ini @@ -0,0 +1,33 @@ +# GYQJ01 - Super Mario Stadium for JP + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Player's shadow needs efb to ram and texture cache set to safe to appear properly. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GYQP01.ini b/Data/Sys/GameSettings/GYQP01.ini new file mode 100644 index 0000000000..bbbe591b09 --- /dev/null +++ b/Data/Sys/GameSettings/GYQP01.ini @@ -0,0 +1,33 @@ +# GYQP01 - MARIO SUPERSTAR BASEBALL + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Player's shadow needs efb to ram and texture cache set to safe to appear properly. + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 0 + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/GYRE41.ini b/Data/Sys/GameSettings/GYRE41.ini similarity index 88% rename from Data/User/GameConfig/GYRE41.ini rename to Data/Sys/GameSettings/GYRE41.ini index 23227a05e6..0ec814be54 100644 --- a/Data/User/GameConfig/GYRE41.ini +++ b/Data/Sys/GameSettings/GYRE41.ini @@ -7,7 +7,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Need Projection Before R945 +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/Sys/GameSettings/GYTE69.ini b/Data/Sys/GameSettings/GYTE69.ini new file mode 100644 index 0000000000..8026ddead7 --- /dev/null +++ b/Data/Sys/GameSettings/GYTE69.ini @@ -0,0 +1,30 @@ +# GYTE69 - TY the Tasmanian Tiger 2 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/GYTP69.ini b/Data/Sys/GameSettings/GYTP69.ini new file mode 100644 index 0000000000..07653f90f2 --- /dev/null +++ b/Data/Sys/GameSettings/GYTP69.ini @@ -0,0 +1,30 @@ +# GYTP69 - TY the Tasmanian Tiger 2 + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/GYWD41.ini b/Data/Sys/GameSettings/GYWD41.ini similarity index 100% rename from Data/User/GameConfig/GYWD41.ini rename to Data/Sys/GameSettings/GYWD41.ini diff --git a/Data/User/GameConfig/GYWEE9.ini b/Data/Sys/GameSettings/GYWEE9.ini similarity index 100% rename from Data/User/GameConfig/GYWEE9.ini rename to Data/Sys/GameSettings/GYWEE9.ini diff --git a/Data/User/GameConfig/GYWP41.ini b/Data/Sys/GameSettings/GYWP41.ini similarity index 100% rename from Data/User/GameConfig/GYWP41.ini rename to Data/Sys/GameSettings/GYWP41.ini diff --git a/Data/User/GameConfig/GZ2E01.ini b/Data/Sys/GameSettings/GZ2E01.ini similarity index 99% rename from Data/User/GameConfig/GZ2E01.ini rename to Data/Sys/GameSettings/GZ2E01.ini index 7036618cf3..0362ac0a33 100644 --- a/Data/User/GameConfig/GZ2E01.ini +++ b/Data/Sys/GameSettings/GZ2E01.ini @@ -1495,7 +1495,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/GZ2J01.ini b/Data/Sys/GameSettings/GZ2J01.ini similarity index 96% rename from Data/User/GameConfig/GZ2J01.ini rename to Data/Sys/GameSettings/GZ2J01.ini index b7b062efd7..a3df9a2634 100644 --- a/Data/User/GameConfig/GZ2J01.ini +++ b/Data/Sys/GameSettings/GZ2J01.ini @@ -28,7 +28,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/GZ2P01.ini b/Data/Sys/GameSettings/GZ2P01.ini similarity index 98% rename from Data/User/GameConfig/GZ2P01.ini rename to Data/Sys/GameSettings/GZ2P01.ini index 6461db4da3..61aa9ffc2a 100644 --- a/Data/User/GameConfig/GZ2P01.ini +++ b/Data/Sys/GameSettings/GZ2P01.ini @@ -90,7 +90,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/GZ3E70.ini b/Data/Sys/GameSettings/GZ3E70.ini similarity index 100% rename from Data/User/GameConfig/GZ3E70.ini rename to Data/Sys/GameSettings/GZ3E70.ini diff --git a/Data/User/GameConfig/GZ3PB2.ini b/Data/Sys/GameSettings/GZ3PB2.ini similarity index 100% rename from Data/User/GameConfig/GZ3PB2.ini rename to Data/Sys/GameSettings/GZ3PB2.ini diff --git a/Data/Sys/GameSettings/GZDE70.ini b/Data/Sys/GameSettings/GZDE70.ini new file mode 100644 index 0000000000..5fa7e9a21f --- /dev/null +++ b/Data/Sys/GameSettings/GZDE70.ini @@ -0,0 +1,17 @@ +# GZDE70 - Godzilla +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/Sys/GameSettings/GZDJ70.ini b/Data/Sys/GameSettings/GZDJ70.ini new file mode 100644 index 0000000000..c2498a8930 --- /dev/null +++ b/Data/Sys/GameSettings/GZDJ70.ini @@ -0,0 +1,17 @@ +# GZDJ70 - Godzilla: Kaijuu Dairantou +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/Sys/GameSettings/GZDP70.ini b/Data/Sys/GameSettings/GZDP70.ini new file mode 100644 index 0000000000..4408fe60f4 --- /dev/null +++ b/Data/Sys/GameSettings/GZDP70.ini @@ -0,0 +1,17 @@ +# GZDP70 - Godzilla +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/GZEE70.ini b/Data/Sys/GameSettings/GZEE70.ini similarity index 100% rename from Data/User/GameConfig/GZEE70.ini rename to Data/Sys/GameSettings/GZEE70.ini diff --git a/Data/User/GameConfig/GZLE01.ini b/Data/Sys/GameSettings/GZLE01.ini similarity index 99% rename from Data/User/GameConfig/GZLE01.ini rename to Data/Sys/GameSettings/GZLE01.ini index 86edfa67fb..84001ac4f7 100644 --- a/Data/User/GameConfig/GZLE01.ini +++ b/Data/Sys/GameSettings/GZLE01.ini @@ -365,8 +365,13 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True + [Video_Hacks] EFBAccessEnable = True EFBToTextureEnable = False EFBCopyEnable = True +[Video_Settings] +FastDepthCalc = False diff --git a/Data/User/GameConfig/GZLJ01.ini b/Data/Sys/GameSettings/GZLJ01.ini similarity index 93% rename from Data/User/GameConfig/GZLJ01.ini rename to Data/Sys/GameSettings/GZLJ01.ini index 8da6a1b970..55e2d60a0e 100644 --- a/Data/User/GameConfig/GZLJ01.ini +++ b/Data/Sys/GameSettings/GZLJ01.ini @@ -41,8 +41,13 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True + [Video_Hacks] EFBAccessEnable = True EFBToTextureEnable = False EFBCopyEnable = True +[Video_Settings] +FastDepthCalc = False diff --git a/Data/User/GameConfig/GZLP01.ini b/Data/Sys/GameSettings/GZLP01.ini similarity index 98% rename from Data/User/GameConfig/GZLP01.ini rename to Data/Sys/GameSettings/GZLP01.ini index 5eb8d7a8c7..c5a11c20be 100644 --- a/Data/User/GameConfig/GZLP01.ini +++ b/Data/Sys/GameSettings/GZLP01.ini @@ -244,8 +244,13 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +[DSP] +EnableJIT = True + [Video_Hacks] EFBAccessEnable = True EFBToTextureEnable = False EFBCopyEnable = True +[Video_Settings] +FastDepthCalc = False diff --git a/Data/User/GameConfig/GZMP7D.ini b/Data/Sys/GameSettings/GZMP7D.ini similarity index 100% rename from Data/User/GameConfig/GZMP7D.ini rename to Data/Sys/GameSettings/GZMP7D.ini diff --git a/Data/User/GameConfig/GZPE70.ini b/Data/Sys/GameSettings/GZPE70.ini similarity index 100% rename from Data/User/GameConfig/GZPE70.ini rename to Data/Sys/GameSettings/GZPE70.ini diff --git a/Data/User/GameConfig/GZPP70.ini b/Data/Sys/GameSettings/GZPP70.ini similarity index 100% rename from Data/User/GameConfig/GZPP70.ini rename to Data/Sys/GameSettings/GZPP70.ini diff --git a/Data/User/GameConfig/GZSE70.ini b/Data/Sys/GameSettings/GZSE70.ini similarity index 100% rename from Data/User/GameConfig/GZSE70.ini rename to Data/Sys/GameSettings/GZSE70.ini diff --git a/Data/User/GameConfig/GZWE01.ini b/Data/Sys/GameSettings/GZWE01.ini similarity index 100% rename from Data/User/GameConfig/GZWE01.ini rename to Data/Sys/GameSettings/GZWE01.ini diff --git a/Data/Sys/GameSettings/GZWJ01.ini b/Data/Sys/GameSettings/GZWJ01.ini new file mode 100644 index 0000000000..0ac9697525 --- /dev/null +++ b/Data/Sys/GameSettings/GZWJ01.ini @@ -0,0 +1,29 @@ +# GZWJ01 - Atumare!! made in wario + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 3 +EmulationIssues = Need Save texture cache,graphic glitches + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/GZWP01.ini b/Data/Sys/GameSettings/GZWP01.ini similarity index 100% rename from Data/User/GameConfig/GZWP01.ini rename to Data/Sys/GameSettings/GZWP01.ini diff --git a/Data/User/GameConfig/HAAA01.ini b/Data/Sys/GameSettings/HAAA01.ini similarity index 100% rename from Data/User/GameConfig/HAAA01.ini rename to Data/Sys/GameSettings/HAAA01.ini diff --git a/Data/User/GameConfig/HACA01.ini b/Data/Sys/GameSettings/HACA01.ini similarity index 100% rename from Data/User/GameConfig/HACA01.ini rename to Data/Sys/GameSettings/HACA01.ini diff --git a/Data/User/GameConfig/HADE01.ini b/Data/Sys/GameSettings/HADE01.ini similarity index 100% rename from Data/User/GameConfig/HADE01.ini rename to Data/Sys/GameSettings/HADE01.ini diff --git a/Data/User/GameConfig/HAXXHB.ini b/Data/Sys/GameSettings/HAXXHB.ini similarity index 100% rename from Data/User/GameConfig/HAXXHB.ini rename to Data/Sys/GameSettings/HAXXHB.ini diff --git a/Data/User/GameConfig/HAYA01.ini b/Data/Sys/GameSettings/HAYA01.ini similarity index 100% rename from Data/User/GameConfig/HAYA01.ini rename to Data/Sys/GameSettings/HAYA01.ini diff --git a/Data/User/GameConfig/HCFE01.ini b/Data/Sys/GameSettings/HCFE01.ini similarity index 100% rename from Data/User/GameConfig/HCFE01.ini rename to Data/Sys/GameSettings/HCFE01.ini diff --git a/Data/User/GameConfig/JAAE01.ini b/Data/Sys/GameSettings/JAAE01.ini similarity index 100% rename from Data/User/GameConfig/JAAE01.ini rename to Data/Sys/GameSettings/JAAE01.ini diff --git a/Data/User/GameConfig/JACP01.ini b/Data/Sys/GameSettings/JACP01.ini similarity index 100% rename from Data/User/GameConfig/JACP01.ini rename to Data/Sys/GameSettings/JACP01.ini diff --git a/Data/Sys/GameSettings/JADE01.ini b/Data/Sys/GameSettings/JADE01.ini new file mode 100644 index 0000000000..0725e57fe3 --- /dev/null +++ b/Data/Sys/GameSettings/JADE01.ini @@ -0,0 +1,20 @@ +# JADE01 - The Legend of Zelda A Link to the Past +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Enable progressive scan for proper speed. +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/Sys/GameSettings/JAEE01.ini b/Data/Sys/GameSettings/JAEE01.ini new file mode 100644 index 0000000000..405011ff35 --- /dev/null +++ b/Data/Sys/GameSettings/JAEE01.ini @@ -0,0 +1,20 @@ +# JAEE01 - Donkey Kong Country +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs progressive scan for proper speed. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/JAHE01.ini b/Data/Sys/GameSettings/JAHE01.ini new file mode 100644 index 0000000000..17347ff4fa --- /dev/null +++ b/Data/Sys/GameSettings/JAHE01.ini @@ -0,0 +1,17 @@ +# JAHE01 - R・TYPE Ⅲ +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs progressive scan for proper speed. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 +[Gecko] diff --git a/Data/Sys/GameSettings/JBKE01.ini b/Data/Sys/GameSettings/JBKE01.ini new file mode 100644 index 0000000000..17841b583d --- /dev/null +++ b/Data/Sys/GameSettings/JBKE01.ini @@ -0,0 +1,19 @@ +# JBKE01 - Breath of Fire II +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs progressive scan for proper speed. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/JBKP01.ini b/Data/Sys/GameSettings/JBKP01.ini similarity index 100% rename from Data/User/GameConfig/JBKP01.ini rename to Data/Sys/GameSettings/JBKP01.ini diff --git a/Data/Sys/GameSettings/JCBE01.ini b/Data/Sys/GameSettings/JCBE01.ini new file mode 100644 index 0000000000..fefd63b950 --- /dev/null +++ b/Data/Sys/GameSettings/JCBE01.ini @@ -0,0 +1,16 @@ +# JCBE01 - Super Mario RPG +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Needs progressive scan for proper speed. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/JCWE01.ini b/Data/Sys/GameSettings/JCWE01.ini new file mode 100644 index 0000000000..cf0410c0be --- /dev/null +++ b/Data/Sys/GameSettings/JCWE01.ini @@ -0,0 +1,14 @@ +# JCWE01 - Super Mario Kart +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = Enable progressive scan for proper speed. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/JODIHB.ini b/Data/Sys/GameSettings/JODIHB.ini similarity index 100% rename from Data/User/GameConfig/JODIHB.ini rename to Data/Sys/GameSettings/JODIHB.ini diff --git a/Data/User/GameConfig/NAAE01.ini b/Data/Sys/GameSettings/NAAE01.ini similarity index 94% rename from Data/User/GameConfig/NAAE01.ini rename to Data/Sys/GameSettings/NAAE01.ini index c43331853c..9e8f4f0e9e 100644 --- a/Data/User/GameConfig/NAAE01.ini +++ b/Data/Sys/GameSettings/NAAE01.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationIssues = -EmulationStateId = 4 +EmulationStateId = 5 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/NAAP01.ini b/Data/Sys/GameSettings/NAAP01.ini similarity index 94% rename from Data/User/GameConfig/NAAP01.ini rename to Data/Sys/GameSettings/NAAP01.ini index a5d903ce22..f06df82356 100644 --- a/Data/User/GameConfig/NAAP01.ini +++ b/Data/Sys/GameSettings/NAAP01.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 5 EmulationIssues = Slow and no sound [OnLoad] diff --git a/Data/Sys/GameSettings/NABE01.ini b/Data/Sys/GameSettings/NABE01.ini new file mode 100644 index 0000000000..400b022798 --- /dev/null +++ b/Data/Sys/GameSettings/NABE01.ini @@ -0,0 +1,22 @@ +# NABE01 - Mario Kart 64 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +Hack = -1 +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/NACE01.ini b/Data/Sys/GameSettings/NACE01.ini similarity index 100% rename from Data/User/GameConfig/NACE01.ini rename to Data/Sys/GameSettings/NACE01.ini diff --git a/Data/User/GameConfig/NAEE01.ini b/Data/Sys/GameSettings/NAEE01.ini similarity index 100% rename from Data/User/GameConfig/NAEE01.ini rename to Data/Sys/GameSettings/NAEE01.ini diff --git a/Data/User/GameConfig/NAFP01.ini b/Data/Sys/GameSettings/NAFP01.ini similarity index 100% rename from Data/User/GameConfig/NAFP01.ini rename to Data/Sys/GameSettings/NAFP01.ini diff --git a/Data/Sys/GameSettings/NAHE01.ini b/Data/Sys/GameSettings/NAHE01.ini new file mode 100644 index 0000000000..cb50d481dd --- /dev/null +++ b/Data/Sys/GameSettings/NAHE01.ini @@ -0,0 +1,16 @@ +# NAHE01 - Yoshi's Story +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/Sys/GameSettings/NAKE01.ini b/Data/Sys/GameSettings/NAKE01.ini new file mode 100644 index 0000000000..7ce4540355 --- /dev/null +++ b/Data/Sys/GameSettings/NAKE01.ini @@ -0,0 +1,17 @@ +# NAKE01 - Pokémon Snap +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/NAKP01.ini b/Data/Sys/GameSettings/NAKP01.ini similarity index 100% rename from Data/User/GameConfig/NAKP01.ini rename to Data/Sys/GameSettings/NAKP01.ini diff --git a/Data/User/GameConfig/NANE01.ini b/Data/Sys/GameSettings/NANE01.ini similarity index 100% rename from Data/User/GameConfig/NANE01.ini rename to Data/Sys/GameSettings/NANE01.ini diff --git a/Data/User/GameConfig/NARP01.ini b/Data/Sys/GameSettings/NARP01.ini similarity index 100% rename from Data/User/GameConfig/NARP01.ini rename to Data/Sys/GameSettings/NARP01.ini diff --git a/Data/User/GameConfig/PC6E01.ini b/Data/Sys/GameSettings/PC6E01.ini similarity index 100% rename from Data/User/GameConfig/PC6E01.ini rename to Data/Sys/GameSettings/PC6E01.ini diff --git a/Data/User/GameConfig/PH_PRESETS.ini b/Data/Sys/GameSettings/PH_PRESETS.ini similarity index 100% rename from Data/User/GameConfig/PH_PRESETS.ini rename to Data/Sys/GameSettings/PH_PRESETS.ini diff --git a/Data/User/GameConfig/PM4E01.ini b/Data/Sys/GameSettings/PM4E01.ini similarity index 100% rename from Data/User/GameConfig/PM4E01.ini rename to Data/Sys/GameSettings/PM4E01.ini diff --git a/Data/User/GameConfig/PRJE01.ini b/Data/Sys/GameSettings/PRJE01.ini similarity index 100% rename from Data/User/GameConfig/PRJE01.ini rename to Data/Sys/GameSettings/PRJE01.ini diff --git a/Data/User/GameConfig/PZLE01.ini b/Data/Sys/GameSettings/PZLE01.ini similarity index 100% rename from Data/User/GameConfig/PZLE01.ini rename to Data/Sys/GameSettings/PZLE01.ini diff --git a/Data/User/GameConfig/PZLJ01.ini b/Data/Sys/GameSettings/PZLJ01.ini similarity index 100% rename from Data/User/GameConfig/PZLJ01.ini rename to Data/Sys/GameSettings/PZLJ01.ini diff --git a/Data/User/GameConfig/PZLP01.ini b/Data/Sys/GameSettings/PZLP01.ini similarity index 100% rename from Data/User/GameConfig/PZLP01.ini rename to Data/Sys/GameSettings/PZLP01.ini diff --git a/Data/Sys/GameSettings/QAFP18.ini b/Data/Sys/GameSettings/QAFP18.ini new file mode 100644 index 0000000000..7d800f89ff --- /dev/null +++ b/Data/Sys/GameSettings/QAFP18.ini @@ -0,0 +1,16 @@ +# QAFP18 - The Dynastic Hero +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/R22E01.ini b/Data/Sys/GameSettings/R22E01.ini similarity index 100% rename from Data/User/GameConfig/R22E01.ini rename to Data/Sys/GameSettings/R22E01.ini diff --git a/Data/User/GameConfig/R22J01.ini b/Data/Sys/GameSettings/R22J01.ini similarity index 100% rename from Data/User/GameConfig/R22J01.ini rename to Data/Sys/GameSettings/R22J01.ini diff --git a/Data/User/GameConfig/R22P01.ini b/Data/Sys/GameSettings/R22P01.ini similarity index 100% rename from Data/User/GameConfig/R22P01.ini rename to Data/Sys/GameSettings/R22P01.ini diff --git a/Data/User/GameConfig/R29P52.ini b/Data/Sys/GameSettings/R29P52.ini similarity index 100% rename from Data/User/GameConfig/R29P52.ini rename to Data/Sys/GameSettings/R29P52.ini diff --git a/Data/User/GameConfig/R2GEXJ.ini b/Data/Sys/GameSettings/R2GEXJ.ini similarity index 100% rename from Data/User/GameConfig/R2GEXJ.ini rename to Data/Sys/GameSettings/R2GEXJ.ini diff --git a/Data/User/GameConfig/R2GJAF.ini b/Data/Sys/GameSettings/R2GJAF.ini similarity index 100% rename from Data/User/GameConfig/R2GJAF.ini rename to Data/Sys/GameSettings/R2GJAF.ini diff --git a/Data/User/GameConfig/R2GP99.ini b/Data/Sys/GameSettings/R2GP99.ini similarity index 100% rename from Data/User/GameConfig/R2GP99.ini rename to Data/Sys/GameSettings/R2GP99.ini diff --git a/Data/User/GameConfig/R2JJAF.ini b/Data/Sys/GameSettings/R2JJAF.ini similarity index 100% rename from Data/User/GameConfig/R2JJAF.ini rename to Data/Sys/GameSettings/R2JJAF.ini diff --git a/Data/User/GameConfig/R2KP54.ini b/Data/Sys/GameSettings/R2KP54.ini similarity index 95% rename from Data/User/GameConfig/R2KP54.ini rename to Data/Sys/GameSettings/R2KP54.ini index e7db763b7f..25fc319487 100644 --- a/Data/User/GameConfig/R2KP54.ini +++ b/Data/Sys/GameSettings/R2KP54.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/R2TE41.ini b/Data/Sys/GameSettings/R2TE41.ini similarity index 100% rename from Data/User/GameConfig/R2TE41.ini rename to Data/Sys/GameSettings/R2TE41.ini diff --git a/Data/User/GameConfig/R2UE8P.ini b/Data/Sys/GameSettings/R2UE8P.ini similarity index 100% rename from Data/User/GameConfig/R2UE8P.ini rename to Data/Sys/GameSettings/R2UE8P.ini diff --git a/Data/User/GameConfig/R2VJ01.ini b/Data/Sys/GameSettings/R2VJ01.ini similarity index 100% rename from Data/User/GameConfig/R2VJ01.ini rename to Data/Sys/GameSettings/R2VJ01.ini diff --git a/Data/User/GameConfig/R2VP01.ini b/Data/Sys/GameSettings/R2VP01.ini similarity index 100% rename from Data/User/GameConfig/R2VP01.ini rename to Data/Sys/GameSettings/R2VP01.ini diff --git a/Data/User/GameConfig/R3BE8P.ini b/Data/Sys/GameSettings/R3BE8P.ini similarity index 91% rename from Data/User/GameConfig/R3BE8P.ini rename to Data/Sys/GameSettings/R3BE8P.ini index e1c4357439..f4d21c6642 100644 --- a/Data/User/GameConfig/R3BE8P.ini +++ b/Data/Sys/GameSettings/R3BE8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use direct x 11 plugin (r6898). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R3BJ8P.ini b/Data/Sys/GameSettings/R3BJ8P.ini similarity index 91% rename from Data/User/GameConfig/R3BJ8P.ini rename to Data/Sys/GameSettings/R3BJ8P.ini index 25feaf3cc0..b339e0c3fa 100644 --- a/Data/User/GameConfig/R3BJ8P.ini +++ b/Data/Sys/GameSettings/R3BJ8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use direct x 11 plugin (r6898). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R3BP8P.ini b/Data/Sys/GameSettings/R3BP8P.ini similarity index 91% rename from Data/User/GameConfig/R3BP8P.ini rename to Data/Sys/GameSettings/R3BP8P.ini index 462fee827a..1907b2e975 100644 --- a/Data/User/GameConfig/R3BP8P.ini +++ b/Data/Sys/GameSettings/R3BP8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use direct x 11 plugin (r6898). +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R3CE20.ini b/Data/Sys/GameSettings/R3CE20.ini similarity index 100% rename from Data/User/GameConfig/R3CE20.ini rename to Data/Sys/GameSettings/R3CE20.ini diff --git a/Data/User/GameConfig/R3DES5.ini b/Data/Sys/GameSettings/R3DES5.ini similarity index 100% rename from Data/User/GameConfig/R3DES5.ini rename to Data/Sys/GameSettings/R3DES5.ini diff --git a/Data/User/GameConfig/R3DPS5.ini b/Data/Sys/GameSettings/R3DPS5.ini similarity index 100% rename from Data/User/GameConfig/R3DPS5.ini rename to Data/Sys/GameSettings/R3DPS5.ini diff --git a/Data/User/GameConfig/R3GXUG.ini b/Data/Sys/GameSettings/R3GXUG.ini similarity index 100% rename from Data/User/GameConfig/R3GXUG.ini rename to Data/Sys/GameSettings/R3GXUG.ini diff --git a/Data/User/GameConfig/R3ME01.ini b/Data/Sys/GameSettings/R3ME01.ini similarity index 100% rename from Data/User/GameConfig/R3ME01.ini rename to Data/Sys/GameSettings/R3ME01.ini diff --git a/Data/User/GameConfig/R3MP01.ini b/Data/Sys/GameSettings/R3MP01.ini similarity index 100% rename from Data/User/GameConfig/R3MP01.ini rename to Data/Sys/GameSettings/R3MP01.ini diff --git a/Data/User/GameConfig/R3NEXS.ini b/Data/Sys/GameSettings/R3NEXS.ini similarity index 100% rename from Data/User/GameConfig/R3NEXS.ini rename to Data/Sys/GameSettings/R3NEXS.ini diff --git a/Data/User/GameConfig/R3NPH3.ini b/Data/Sys/GameSettings/R3NPH3.ini similarity index 100% rename from Data/User/GameConfig/R3NPH3.ini rename to Data/Sys/GameSettings/R3NPH3.ini diff --git a/Data/User/GameConfig/R3OE01.ini b/Data/Sys/GameSettings/R3OE01.ini similarity index 88% rename from Data/User/GameConfig/R3OE01.ini rename to Data/Sys/GameSettings/R3OE01.ini index 935f38795a..787db9386d 100644 --- a/Data/User/GameConfig/R3OE01.ini +++ b/Data/Sys/GameSettings/R3OE01.ini @@ -18,7 +18,7 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 1 @@ -28,3 +28,5 @@ PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/R3OJ01.ini b/Data/Sys/GameSettings/R3OJ01.ini similarity index 88% rename from Data/User/GameConfig/R3OJ01.ini rename to Data/Sys/GameSettings/R3OJ01.ini index 27e0275b2b..9e0e571385 100644 --- a/Data/User/GameConfig/R3OJ01.ini +++ b/Data/Sys/GameSettings/R3OJ01.ini @@ -18,7 +18,7 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 1 @@ -28,3 +28,5 @@ PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/R3OP01.ini b/Data/Sys/GameSettings/R3OP01.ini similarity index 88% rename from Data/User/GameConfig/R3OP01.ini rename to Data/Sys/GameSettings/R3OP01.ini index 7d2d9995f1..b5039bdb24 100644 --- a/Data/User/GameConfig/R3OP01.ini +++ b/Data/Sys/GameSettings/R3OP01.ini @@ -18,7 +18,7 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 1 @@ -28,3 +28,5 @@ PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/Sys/GameSettings/R3RE8P.ini b/Data/Sys/GameSettings/R3RE8P.ini new file mode 100644 index 0000000000..422735babf --- /dev/null +++ b/Data/Sys/GameSettings/R3RE8P.ini @@ -0,0 +1,21 @@ +# R3RE8P - Sonic & Sega All-Stars Racing +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Use direct 3d 11 for less graphic glitches. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/R3RP8P.ini b/Data/Sys/GameSettings/R3RP8P.ini new file mode 100644 index 0000000000..b49762b0f4 --- /dev/null +++ b/Data/Sys/GameSettings/R3RP8P.ini @@ -0,0 +1,21 @@ +# R3RP8P - Sonic & Sega All-Stars Racing +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Use direct 3d 11 for less graphic glitches. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/R3SP52.ini b/Data/Sys/GameSettings/R3SP52.ini similarity index 100% rename from Data/User/GameConfig/R3SP52.ini rename to Data/Sys/GameSettings/R3SP52.ini diff --git a/Data/User/GameConfig/R3TP54.ini b/Data/Sys/GameSettings/R3TP54.ini similarity index 100% rename from Data/User/GameConfig/R3TP54.ini rename to Data/Sys/GameSettings/R3TP54.ini diff --git a/Data/User/GameConfig/R46ENS.ini b/Data/Sys/GameSettings/R46ENS.ini similarity index 100% rename from Data/User/GameConfig/R46ENS.ini rename to Data/Sys/GameSettings/R46ENS.ini diff --git a/Data/User/GameConfig/R49P01.ini b/Data/Sys/GameSettings/R49P01.ini similarity index 100% rename from Data/User/GameConfig/R49P01.ini rename to Data/Sys/GameSettings/R49P01.ini diff --git a/Data/User/GameConfig/R4BPGT.ini b/Data/Sys/GameSettings/R4BPGT.ini similarity index 100% rename from Data/User/GameConfig/R4BPGT.ini rename to Data/Sys/GameSettings/R4BPGT.ini diff --git a/Data/User/GameConfig/R4EE01.ini b/Data/Sys/GameSettings/R4EE01.ini similarity index 100% rename from Data/User/GameConfig/R4EE01.ini rename to Data/Sys/GameSettings/R4EE01.ini diff --git a/Data/User/GameConfig/R4EJ01.ini b/Data/Sys/GameSettings/R4EJ01.ini similarity index 100% rename from Data/User/GameConfig/R4EJ01.ini rename to Data/Sys/GameSettings/R4EJ01.ini diff --git a/Data/User/GameConfig/R4EP01.ini b/Data/Sys/GameSettings/R4EP01.ini similarity index 100% rename from Data/User/GameConfig/R4EP01.ini rename to Data/Sys/GameSettings/R4EP01.ini diff --git a/Data/User/GameConfig/R4QE01.ini b/Data/Sys/GameSettings/R4QE01.ini similarity index 100% rename from Data/User/GameConfig/R4QE01.ini rename to Data/Sys/GameSettings/R4QE01.ini diff --git a/Data/User/GameConfig/R4QJ01.ini b/Data/Sys/GameSettings/R4QJ01.ini similarity index 100% rename from Data/User/GameConfig/R4QJ01.ini rename to Data/Sys/GameSettings/R4QJ01.ini diff --git a/Data/User/GameConfig/R4QK01.ini b/Data/Sys/GameSettings/R4QK01.ini similarity index 100% rename from Data/User/GameConfig/R4QK01.ini rename to Data/Sys/GameSettings/R4QK01.ini diff --git a/Data/User/GameConfig/R4QP01.ini b/Data/Sys/GameSettings/R4QP01.ini similarity index 100% rename from Data/User/GameConfig/R4QP01.ini rename to Data/Sys/GameSettings/R4QP01.ini diff --git a/Data/User/GameConfig/R4RP69.ini b/Data/Sys/GameSettings/R4RP69.ini similarity index 100% rename from Data/User/GameConfig/R4RP69.ini rename to Data/Sys/GameSettings/R4RP69.ini diff --git a/Data/User/GameConfig/R4ZJ01.ini b/Data/Sys/GameSettings/R4ZJ01.ini similarity index 91% rename from Data/User/GameConfig/R4ZJ01.ini rename to Data/Sys/GameSettings/R4ZJ01.ini index 78ba97cb8a..4ebc4c2a85 100644 --- a/Data/User/GameConfig/R4ZJ01.ini +++ b/Data/Sys/GameSettings/R4ZJ01.ini @@ -27,4 +27,5 @@ PH_ZFar = [Video_Hacks] EFBAccessEnable = True - +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/R5DE5G.ini b/Data/Sys/GameSettings/R5DE5G.ini similarity index 100% rename from Data/User/GameConfig/R5DE5G.ini rename to Data/Sys/GameSettings/R5DE5G.ini diff --git a/Data/User/GameConfig/R5IE4Q.ini b/Data/Sys/GameSettings/R5IE4Q.ini similarity index 100% rename from Data/User/GameConfig/R5IE4Q.ini rename to Data/Sys/GameSettings/R5IE4Q.ini diff --git a/Data/User/GameConfig/R5IP4Q.ini b/Data/Sys/GameSettings/R5IP4Q.ini similarity index 100% rename from Data/User/GameConfig/R5IP4Q.ini rename to Data/Sys/GameSettings/R5IP4Q.ini diff --git a/Data/User/GameConfig/R5IX4Q.ini b/Data/Sys/GameSettings/R5IX4Q.ini similarity index 100% rename from Data/User/GameConfig/R5IX4Q.ini rename to Data/Sys/GameSettings/R5IX4Q.ini diff --git a/Data/User/GameConfig/R5VE41.ini b/Data/Sys/GameSettings/R5VE41.ini similarity index 100% rename from Data/User/GameConfig/R5VE41.ini rename to Data/Sys/GameSettings/R5VE41.ini diff --git a/Data/User/GameConfig/R5VP41.ini b/Data/Sys/GameSettings/R5VP41.ini similarity index 100% rename from Data/User/GameConfig/R5VP41.ini rename to Data/Sys/GameSettings/R5VP41.ini diff --git a/Data/User/GameConfig/R5VX41.ini b/Data/Sys/GameSettings/R5VX41.ini similarity index 100% rename from Data/User/GameConfig/R5VX41.ini rename to Data/Sys/GameSettings/R5VX41.ini diff --git a/Data/User/GameConfig/R5WEA4.ini b/Data/Sys/GameSettings/R5WEA4.ini similarity index 100% rename from Data/User/GameConfig/R5WEA4.ini rename to Data/Sys/GameSettings/R5WEA4.ini diff --git a/Data/User/GameConfig/R5WJA4.ini b/Data/Sys/GameSettings/R5WJA4.ini similarity index 100% rename from Data/User/GameConfig/R5WJA4.ini rename to Data/Sys/GameSettings/R5WJA4.ini diff --git a/Data/User/GameConfig/R64E01.ini b/Data/Sys/GameSettings/R64E01.ini similarity index 100% rename from Data/User/GameConfig/R64E01.ini rename to Data/Sys/GameSettings/R64E01.ini diff --git a/Data/User/GameConfig/R64J01.ini b/Data/Sys/GameSettings/R64J01.ini similarity index 100% rename from Data/User/GameConfig/R64J01.ini rename to Data/Sys/GameSettings/R64J01.ini diff --git a/Data/User/GameConfig/R64K01.ini b/Data/Sys/GameSettings/R64K01.ini similarity index 100% rename from Data/User/GameConfig/R64K01.ini rename to Data/Sys/GameSettings/R64K01.ini diff --git a/Data/User/GameConfig/R64P01.ini b/Data/Sys/GameSettings/R64P01.ini similarity index 100% rename from Data/User/GameConfig/R64P01.ini rename to Data/Sys/GameSettings/R64P01.ini diff --git a/Data/User/GameConfig/R69E36.ini b/Data/Sys/GameSettings/R69E36.ini similarity index 100% rename from Data/User/GameConfig/R69E36.ini rename to Data/Sys/GameSettings/R69E36.ini diff --git a/Data/User/GameConfig/R6BE78.ini b/Data/Sys/GameSettings/R6BE78.ini similarity index 100% rename from Data/User/GameConfig/R6BE78.ini rename to Data/Sys/GameSettings/R6BE78.ini diff --git a/Data/User/GameConfig/R6BJ78.ini b/Data/Sys/GameSettings/R6BJ78.ini similarity index 100% rename from Data/User/GameConfig/R6BJ78.ini rename to Data/Sys/GameSettings/R6BJ78.ini diff --git a/Data/User/GameConfig/R6BK78.ini b/Data/Sys/GameSettings/R6BK78.ini similarity index 100% rename from Data/User/GameConfig/R6BK78.ini rename to Data/Sys/GameSettings/R6BK78.ini diff --git a/Data/User/GameConfig/R6BP78.ini b/Data/Sys/GameSettings/R6BP78.ini similarity index 100% rename from Data/User/GameConfig/R6BP78.ini rename to Data/Sys/GameSettings/R6BP78.ini diff --git a/Data/User/GameConfig/R6BX78.ini b/Data/Sys/GameSettings/R6BX78.ini similarity index 100% rename from Data/User/GameConfig/R6BX78.ini rename to Data/Sys/GameSettings/R6BX78.ini diff --git a/Data/User/GameConfig/R6NY41.ini b/Data/Sys/GameSettings/R6NY41.ini similarity index 100% rename from Data/User/GameConfig/R6NY41.ini rename to Data/Sys/GameSettings/R6NY41.ini diff --git a/Data/User/GameConfig/R6TEA4.ini b/Data/Sys/GameSettings/R6TEA4.ini similarity index 100% rename from Data/User/GameConfig/R6TEA4.ini rename to Data/Sys/GameSettings/R6TEA4.ini diff --git a/Data/User/GameConfig/R6YEXS.ini b/Data/Sys/GameSettings/R6YEXS.ini similarity index 95% rename from Data/User/GameConfig/R6YEXS.ini rename to Data/Sys/GameSettings/R6YEXS.ini index 4f5c7fa17b..6001933724 100644 --- a/Data/User/GameConfig/R6YEXS.ini +++ b/Data/Sys/GameSettings/R6YEXS.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationIssues = -EmulationStateId = 0 +EmulationStateId = 4 [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R6YPH3.ini b/Data/Sys/GameSettings/R6YPH3.ini similarity index 100% rename from Data/User/GameConfig/R6YPH3.ini rename to Data/Sys/GameSettings/R6YPH3.ini diff --git a/Data/User/GameConfig/R7EE8P.ini b/Data/Sys/GameSettings/R7EE8P.ini similarity index 89% rename from Data/User/GameConfig/R7EE8P.ini rename to Data/Sys/GameSettings/R7EE8P.ini index af2e35a5e2..a28a1b5afe 100644 --- a/Data/User/GameConfig/R7EE8P.ini +++ b/Data/Sys/GameSettings/R7EE8P.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/R7EJ8P.ini b/Data/Sys/GameSettings/R7EJ8P.ini similarity index 89% rename from Data/User/GameConfig/R7EJ8P.ini rename to Data/Sys/GameSettings/R7EJ8P.ini index f7ee320eb5..ea4abcb094 100644 --- a/Data/User/GameConfig/R7EJ8P.ini +++ b/Data/Sys/GameSettings/R7EJ8P.ini @@ -19,12 +19,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/R7EP8P.ini b/Data/Sys/GameSettings/R7EP8P.ini similarity index 89% rename from Data/User/GameConfig/R7EP8P.ini rename to Data/Sys/GameSettings/R7EP8P.ini index 04ee74ddea..3f58cc31b0 100644 --- a/Data/User/GameConfig/R7EP8P.ini +++ b/Data/Sys/GameSettings/R7EP8P.ini @@ -19,12 +19,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/R7FEGD.ini b/Data/Sys/GameSettings/R7FEGD.ini similarity index 77% rename from Data/User/GameConfig/R7FEGD.ini rename to Data/Sys/GameSettings/R7FEGD.ini index 051abc228e..9f5e6bd2b2 100644 --- a/Data/User/GameConfig/R7FEGD.ini +++ b/Data/Sys/GameSettings/R7FEGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct 3d 11 or OpenGL backend for less issues. Map is a bit broken. +EmulationIssues = Map is a bit broken. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,6 +25,3 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -[Video_Settings] -EnablePerPixelDepth = False - diff --git a/Data/User/GameConfig/R7FJGD.ini b/Data/Sys/GameSettings/R7FJGD.ini similarity index 77% rename from Data/User/GameConfig/R7FJGD.ini rename to Data/Sys/GameSettings/R7FJGD.ini index b59657c327..4f28c85e51 100644 --- a/Data/User/GameConfig/R7FJGD.ini +++ b/Data/Sys/GameSettings/R7FJGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct 3d 11 or OpenGL backend for less issues. Map is a bit broken. +EmulationIssues = Map is a bit broken. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,6 +25,3 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -[Video_Settings] -EnablePerPixelDepth = False - diff --git a/Data/User/GameConfig/R7FPGD.ini b/Data/Sys/GameSettings/R7FPGD.ini similarity index 77% rename from Data/User/GameConfig/R7FPGD.ini rename to Data/Sys/GameSettings/R7FPGD.ini index 889862ae41..38300c534f 100644 --- a/Data/User/GameConfig/R7FPGD.ini +++ b/Data/Sys/GameSettings/R7FPGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct 3d 11 or OpenGL backend for less issues. Map is a bit broken. +EmulationIssues = Map is a bit broken. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -25,6 +25,3 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -[Video_Settings] -EnablePerPixelDepth = False - diff --git a/Data/User/GameConfig/R7GEAF.ini b/Data/Sys/GameSettings/R7GEAF.ini similarity index 100% rename from Data/User/GameConfig/R7GEAF.ini rename to Data/Sys/GameSettings/R7GEAF.ini diff --git a/Data/User/GameConfig/R7GJAF.ini b/Data/Sys/GameSettings/R7GJAF.ini similarity index 100% rename from Data/User/GameConfig/R7GJAF.ini rename to Data/Sys/GameSettings/R7GJAF.ini diff --git a/Data/User/GameConfig/R7GPAF.ini b/Data/Sys/GameSettings/R7GPAF.ini similarity index 100% rename from Data/User/GameConfig/R7GPAF.ini rename to Data/Sys/GameSettings/R7GPAF.ini diff --git a/Data/User/GameConfig/R7PE01.ini b/Data/Sys/GameSettings/R7PE01.ini similarity index 98% rename from Data/User/GameConfig/R7PE01.ini rename to Data/Sys/GameSettings/R7PE01.ini index 61af3f2c24..55e049a612 100644 --- a/Data/User/GameConfig/R7PE01.ini +++ b/Data/Sys/GameSettings/R7PE01.ini @@ -13,7 +13,7 @@ EmulationIssues = Disable "Use EuRGB60 (PAL60) mode" in the wii configuration ta [OnFrame] # Add memory patches to be applied every frame here. -+$Patch +$Patch 0x8011E0F8:dword:0x4E800020 [ActionReplay] diff --git a/Data/User/GameConfig/R7PP01.ini b/Data/Sys/GameSettings/R7PP01.ini similarity index 98% rename from Data/User/GameConfig/R7PP01.ini rename to Data/Sys/GameSettings/R7PP01.ini index dcd66b20f5..ee000f624d 100644 --- a/Data/User/GameConfig/R7PP01.ini +++ b/Data/Sys/GameSettings/R7PP01.ini @@ -13,7 +13,7 @@ EmulationStateId = 4 [OnFrame] # Add memory patches to be applied every frame here. -+$Patch +$Patch 0x8011F1CC:dword:0x4E800020 [ActionReplay] diff --git a/Data/User/GameConfig/R7XE69.ini b/Data/Sys/GameSettings/R7XE69.ini similarity index 100% rename from Data/User/GameConfig/R7XE69.ini rename to Data/Sys/GameSettings/R7XE69.ini diff --git a/Data/User/GameConfig/R7XJ13.ini b/Data/Sys/GameSettings/R7XJ13.ini similarity index 100% rename from Data/User/GameConfig/R7XJ13.ini rename to Data/Sys/GameSettings/R7XJ13.ini diff --git a/Data/User/GameConfig/R7XP69.ini b/Data/Sys/GameSettings/R7XP69.ini similarity index 100% rename from Data/User/GameConfig/R7XP69.ini rename to Data/Sys/GameSettings/R7XP69.ini diff --git a/Data/User/GameConfig/R84EE9.ini b/Data/Sys/GameSettings/R84EE9.ini similarity index 100% rename from Data/User/GameConfig/R84EE9.ini rename to Data/Sys/GameSettings/R84EE9.ini diff --git a/Data/User/GameConfig/R84J99.ini b/Data/Sys/GameSettings/R84J99.ini similarity index 100% rename from Data/User/GameConfig/R84J99.ini rename to Data/Sys/GameSettings/R84J99.ini diff --git a/Data/User/GameConfig/R84P99.ini b/Data/Sys/GameSettings/R84P99.ini similarity index 100% rename from Data/User/GameConfig/R84P99.ini rename to Data/Sys/GameSettings/R84P99.ini diff --git a/Data/User/GameConfig/R8AE01.ini b/Data/Sys/GameSettings/R8AE01.ini similarity index 100% rename from Data/User/GameConfig/R8AE01.ini rename to Data/Sys/GameSettings/R8AE01.ini diff --git a/Data/User/GameConfig/R8AJ01.ini b/Data/Sys/GameSettings/R8AJ01.ini similarity index 100% rename from Data/User/GameConfig/R8AJ01.ini rename to Data/Sys/GameSettings/R8AJ01.ini diff --git a/Data/User/GameConfig/R8AP01.ini b/Data/Sys/GameSettings/R8AP01.ini similarity index 100% rename from Data/User/GameConfig/R8AP01.ini rename to Data/Sys/GameSettings/R8AP01.ini diff --git a/Data/User/GameConfig/R8DEA4.ini b/Data/Sys/GameSettings/R8DEA4.ini similarity index 100% rename from Data/User/GameConfig/R8DEA4.ini rename to Data/Sys/GameSettings/R8DEA4.ini diff --git a/Data/User/GameConfig/R8DJA4.ini b/Data/Sys/GameSettings/R8DJA4.ini similarity index 100% rename from Data/User/GameConfig/R8DJA4.ini rename to Data/Sys/GameSettings/R8DJA4.ini diff --git a/Data/User/GameConfig/R8DPA4.ini b/Data/Sys/GameSettings/R8DPA4.ini similarity index 100% rename from Data/User/GameConfig/R8DPA4.ini rename to Data/Sys/GameSettings/R8DPA4.ini diff --git a/Data/User/GameConfig/R8JEWR.ini b/Data/Sys/GameSettings/R8JEWR.ini similarity index 88% rename from Data/User/GameConfig/R8JEWR.ini rename to Data/Sys/GameSettings/R8JEWR.ini index 22821c3bf6..25b3008faa 100644 --- a/Data/User/GameConfig/R8JEWR.ini +++ b/Data/Sys/GameSettings/R8JEWR.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +SkipIdle = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 -EmulationIssues = +EmulationIssues = Idle skipping slows down the game [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R8JPWR.ini b/Data/Sys/GameSettings/R8JPWR.ini similarity index 88% rename from Data/User/GameConfig/R8JPWR.ini rename to Data/Sys/GameSettings/R8JPWR.ini index 23acf7690d..a2f0cbde14 100644 --- a/Data/User/GameConfig/R8JPWR.ini +++ b/Data/Sys/GameSettings/R8JPWR.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +SkipIdle = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 -EmulationIssues = +EmulationIssues = Idle skipping slows down the game [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/R8LE20.ini b/Data/Sys/GameSettings/R8LE20.ini similarity index 100% rename from Data/User/GameConfig/R8LE20.ini rename to Data/Sys/GameSettings/R8LE20.ini diff --git a/Data/User/GameConfig/R8LP7J.ini b/Data/Sys/GameSettings/R8LP7J.ini similarity index 100% rename from Data/User/GameConfig/R8LP7J.ini rename to Data/Sys/GameSettings/R8LP7J.ini diff --git a/Data/User/GameConfig/R8PE01.ini b/Data/Sys/GameSettings/R8PE01.ini similarity index 100% rename from Data/User/GameConfig/R8PE01.ini rename to Data/Sys/GameSettings/R8PE01.ini diff --git a/Data/User/GameConfig/R8PJ01.ini b/Data/Sys/GameSettings/R8PJ01.ini similarity index 100% rename from Data/User/GameConfig/R8PJ01.ini rename to Data/Sys/GameSettings/R8PJ01.ini diff --git a/Data/User/GameConfig/R8PK01.ini b/Data/Sys/GameSettings/R8PK01.ini similarity index 100% rename from Data/User/GameConfig/R8PK01.ini rename to Data/Sys/GameSettings/R8PK01.ini diff --git a/Data/User/GameConfig/R8PP01.ini b/Data/Sys/GameSettings/R8PP01.ini similarity index 100% rename from Data/User/GameConfig/R8PP01.ini rename to Data/Sys/GameSettings/R8PP01.ini diff --git a/Data/User/GameConfig/R8XE52.ini b/Data/Sys/GameSettings/R8XE52.ini similarity index 100% rename from Data/User/GameConfig/R8XE52.ini rename to Data/Sys/GameSettings/R8XE52.ini diff --git a/Data/User/GameConfig/R96EAF.ini b/Data/Sys/GameSettings/R96EAF.ini similarity index 100% rename from Data/User/GameConfig/R96EAF.ini rename to Data/Sys/GameSettings/R96EAF.ini diff --git a/Data/User/GameConfig/R9FP36.ini b/Data/Sys/GameSettings/R9FP36.ini similarity index 100% rename from Data/User/GameConfig/R9FP36.ini rename to Data/Sys/GameSettings/R9FP36.ini diff --git a/Data/User/GameConfig/R9IE01.ini b/Data/Sys/GameSettings/R9IE01.ini similarity index 100% rename from Data/User/GameConfig/R9IE01.ini rename to Data/Sys/GameSettings/R9IE01.ini diff --git a/Data/User/GameConfig/RB4E08.ini b/Data/Sys/GameSettings/RB4E08.ini similarity index 100% rename from Data/User/GameConfig/RB4E08.ini rename to Data/Sys/GameSettings/RB4E08.ini diff --git a/Data/User/GameConfig/RB4P08.ini b/Data/Sys/GameSettings/RB4P08.ini similarity index 100% rename from Data/User/GameConfig/RB4P08.ini rename to Data/Sys/GameSettings/RB4P08.ini diff --git a/Data/User/GameConfig/RBBE18.ini b/Data/Sys/GameSettings/RBBE18.ini similarity index 100% rename from Data/User/GameConfig/RBBE18.ini rename to Data/Sys/GameSettings/RBBE18.ini diff --git a/Data/User/GameConfig/RBBJ18.ini b/Data/Sys/GameSettings/RBBJ18.ini similarity index 100% rename from Data/User/GameConfig/RBBJ18.ini rename to Data/Sys/GameSettings/RBBJ18.ini diff --git a/Data/User/GameConfig/RBBP99.ini b/Data/Sys/GameSettings/RBBP99.ini similarity index 100% rename from Data/User/GameConfig/RBBP99.ini rename to Data/Sys/GameSettings/RBBP99.ini diff --git a/Data/User/GameConfig/RBHE08.ini b/Data/Sys/GameSettings/RBHE08.ini similarity index 97% rename from Data/User/GameConfig/RBHE08.ini rename to Data/Sys/GameSettings/RBHE08.ini index f77361be1a..2dd2773425 100644 --- a/Data/User/GameConfig/RBHE08.ini +++ b/Data/Sys/GameSettings/RBHE08.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/RBHJ08.ini b/Data/Sys/GameSettings/RBHJ08.ini similarity index 97% rename from Data/User/GameConfig/RBHJ08.ini rename to Data/Sys/GameSettings/RBHJ08.ini index 6daba6c41f..537d3b8444 100644 --- a/Data/User/GameConfig/RBHJ08.ini +++ b/Data/Sys/GameSettings/RBHJ08.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/RBHP08.ini b/Data/Sys/GameSettings/RBHP08.ini similarity index 97% rename from Data/User/GameConfig/RBHP08.ini rename to Data/Sys/GameSettings/RBHP08.ini index a91968a64d..f17ffee900 100644 --- a/Data/User/GameConfig/RBHP08.ini +++ b/Data/Sys/GameSettings/RBHP08.ini @@ -2,6 +2,7 @@ [Core] # Values set here will override the main dolphin settings. +BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/RBIEE9.ini b/Data/Sys/GameSettings/RBIEE9.ini similarity index 100% rename from Data/User/GameConfig/RBIEE9.ini rename to Data/Sys/GameSettings/RBIEE9.ini diff --git a/Data/User/GameConfig/RBIJ99.ini b/Data/Sys/GameSettings/RBIJ99.ini similarity index 100% rename from Data/User/GameConfig/RBIJ99.ini rename to Data/Sys/GameSettings/RBIJ99.ini diff --git a/Data/User/GameConfig/RBIP99.ini b/Data/Sys/GameSettings/RBIP99.ini similarity index 100% rename from Data/User/GameConfig/RBIP99.ini rename to Data/Sys/GameSettings/RBIP99.ini diff --git a/Data/User/GameConfig/RBKE69.ini b/Data/Sys/GameSettings/RBKE69.ini similarity index 100% rename from Data/User/GameConfig/RBKE69.ini rename to Data/Sys/GameSettings/RBKE69.ini diff --git a/Data/User/GameConfig/RBME5G.ini b/Data/Sys/GameSettings/RBME5G.ini similarity index 100% rename from Data/User/GameConfig/RBME5G.ini rename to Data/Sys/GameSettings/RBME5G.ini diff --git a/Data/User/GameConfig/RBQPUG.ini b/Data/Sys/GameSettings/RBQPUG.ini similarity index 100% rename from Data/User/GameConfig/RBQPUG.ini rename to Data/Sys/GameSettings/RBQPUG.ini diff --git a/Data/Sys/GameSettings/RBRE5G.ini b/Data/Sys/GameSettings/RBRE5G.ini new file mode 100644 index 0000000000..d5eb264492 --- /dev/null +++ b/Data/Sys/GameSettings/RBRE5G.ini @@ -0,0 +1,30 @@ +# RBRE5G - Blast Works Build, Trade, Destroy + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/RBRP5G.ini b/Data/Sys/GameSettings/RBRP5G.ini new file mode 100644 index 0000000000..6086448137 --- /dev/null +++ b/Data/Sys/GameSettings/RBRP5G.ini @@ -0,0 +1,30 @@ +# RBRP5G - Blast Works Build, Trade, Destroy + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/RBRX5G.ini b/Data/Sys/GameSettings/RBRX5G.ini new file mode 100644 index 0000000000..213439f6e8 --- /dev/null +++ b/Data/Sys/GameSettings/RBRX5G.ini @@ -0,0 +1,30 @@ +# RBRX5G - Blast Works Build, Trade, Destroy + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/RBTP8P.ini b/Data/Sys/GameSettings/RBTP8P.ini similarity index 100% rename from Data/User/GameConfig/RBTP8P.ini rename to Data/Sys/GameSettings/RBTP8P.ini diff --git a/Data/User/GameConfig/RBUE08.ini b/Data/Sys/GameSettings/RBUE08.ini similarity index 100% rename from Data/User/GameConfig/RBUE08.ini rename to Data/Sys/GameSettings/RBUE08.ini diff --git a/Data/User/GameConfig/RBUP08.ini b/Data/Sys/GameSettings/RBUP08.ini similarity index 100% rename from Data/User/GameConfig/RBUP08.ini rename to Data/Sys/GameSettings/RBUP08.ini diff --git a/Data/User/GameConfig/RBWE01.ini b/Data/Sys/GameSettings/RBWE01.ini similarity index 86% rename from Data/User/GameConfig/RBWE01.ini rename to Data/Sys/GameSettings/RBWE01.ini index e39aab676c..fbe5ebfbfe 100644 --- a/Data/User/GameConfig/RBWE01.ini +++ b/Data/Sys/GameSettings/RBWE01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +SkipIdle = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = Idle skipping slows down the game. [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/RBWJ01.ini b/Data/Sys/GameSettings/RBWJ01.ini similarity index 86% rename from Data/User/GameConfig/RBWJ01.ini rename to Data/Sys/GameSettings/RBWJ01.ini index 6c916e617a..c048d63778 100644 --- a/Data/User/GameConfig/RBWJ01.ini +++ b/Data/Sys/GameSettings/RBWJ01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +SkipIdle = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = Idle skipping slows down the game. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -24,4 +25,3 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = - diff --git a/Data/User/GameConfig/RBWP01.ini b/Data/Sys/GameSettings/RBWP01.ini similarity index 86% rename from Data/User/GameConfig/RBWP01.ini rename to Data/Sys/GameSettings/RBWP01.ini index 9544d9869d..6f0ad1828d 100644 --- a/Data/User/GameConfig/RBWP01.ini +++ b/Data/Sys/GameSettings/RBWP01.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. +SkipIdle = False [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = Idle skipping slows down the game. [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/RBXJ8P.ini b/Data/Sys/GameSettings/RBXJ8P.ini similarity index 100% rename from Data/User/GameConfig/RBXJ8P.ini rename to Data/Sys/GameSettings/RBXJ8P.ini diff --git a/Data/User/GameConfig/RBZXUG.ini b/Data/Sys/GameSettings/RBZXUG.ini similarity index 100% rename from Data/User/GameConfig/RBZXUG.ini rename to Data/Sys/GameSettings/RBZXUG.ini diff --git a/Data/User/GameConfig/RCJE8P.ini b/Data/Sys/GameSettings/RCJE8P.ini similarity index 100% rename from Data/User/GameConfig/RCJE8P.ini rename to Data/Sys/GameSettings/RCJE8P.ini diff --git a/Data/User/GameConfig/RCJP8P.ini b/Data/Sys/GameSettings/RCJP8P.ini similarity index 100% rename from Data/User/GameConfig/RCJP8P.ini rename to Data/Sys/GameSettings/RCJP8P.ini diff --git a/Data/User/GameConfig/RCKPGN.ini b/Data/Sys/GameSettings/RCKPGN.ini similarity index 94% rename from Data/User/GameConfig/RCKPGN.ini rename to Data/Sys/GameSettings/RCKPGN.ini index ac664e308a..03354b7c8f 100644 --- a/Data/User/GameConfig/RCKPGN.ini +++ b/Data/Sys/GameSettings/RCKPGN.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RCPE18.ini b/Data/Sys/GameSettings/RCPE18.ini similarity index 100% rename from Data/User/GameConfig/RCPE18.ini rename to Data/Sys/GameSettings/RCPE18.ini diff --git a/Data/User/GameConfig/RD2E41.ini b/Data/Sys/GameSettings/RD2E41.ini similarity index 100% rename from Data/User/GameConfig/RD2E41.ini rename to Data/Sys/GameSettings/RD2E41.ini diff --git a/Data/User/GameConfig/RD2J41.ini b/Data/Sys/GameSettings/RD2J41.ini similarity index 100% rename from Data/User/GameConfig/RD2J41.ini rename to Data/Sys/GameSettings/RD2J41.ini diff --git a/Data/User/GameConfig/RD2K41.ini b/Data/Sys/GameSettings/RD2K41.ini similarity index 100% rename from Data/User/GameConfig/RD2K41.ini rename to Data/Sys/GameSettings/RD2K41.ini diff --git a/Data/User/GameConfig/RD2P41.ini b/Data/Sys/GameSettings/RD2P41.ini similarity index 100% rename from Data/User/GameConfig/RD2P41.ini rename to Data/Sys/GameSettings/RD2P41.ini diff --git a/Data/User/GameConfig/RD2X41.ini b/Data/Sys/GameSettings/RD2X41.ini similarity index 100% rename from Data/User/GameConfig/RD2X41.ini rename to Data/Sys/GameSettings/RD2X41.ini diff --git a/Data/User/GameConfig/RDBPAF.ini b/Data/Sys/GameSettings/RDBPAF.ini similarity index 100% rename from Data/User/GameConfig/RDBPAF.ini rename to Data/Sys/GameSettings/RDBPAF.ini diff --git a/Data/User/GameConfig/G8WP01.ini b/Data/Sys/GameSettings/RDFE41.ini similarity index 75% rename from Data/User/GameConfig/G8WP01.ini rename to Data/Sys/GameSettings/RDFE41.ini index f870aa3b52..5f3e0370e9 100644 --- a/Data/User/GameConfig/G8WP01.ini +++ b/Data/Sys/GameSettings/RDFE41.ini @@ -1,4 +1,4 @@ -# G8WP01 - Battalion Wars +# RDFE41 - Shaun White Snowboarding: Road Trip [Core] # Values set here will override the main dolphin settings. @@ -15,9 +15,7 @@ EmulationStateId = 4 [ActionReplay] # Add action replay cheats here. -$Invincible -0752E977 08000000 -04338650 00000001 -$Infinite Time -0752E978 08000000 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RDFP41.ini b/Data/Sys/GameSettings/RDFP41.ini similarity index 83% rename from Data/User/GameConfig/RDFP41.ini rename to Data/Sys/GameSettings/RDFP41.ini index 94b21ba568..831f22452a 100644 --- a/Data/User/GameConfig/RDFP41.ini +++ b/Data/Sys/GameSettings/RDFP41.ini @@ -6,7 +6,6 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues="It's Playable. But few problems in graphics and control.Full Sound" [OnLoad] # Add memory patches to be loaded once on boot here. @@ -17,3 +16,6 @@ Issues="It's Playable. But few problems in graphics and control.Full Sound" [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RDGPA4.ini b/Data/Sys/GameSettings/RDGPA4.ini similarity index 100% rename from Data/User/GameConfig/RDGPA4.ini rename to Data/Sys/GameSettings/RDGPA4.ini diff --git a/Data/User/GameConfig/RDHP78.ini b/Data/Sys/GameSettings/RDHP78.ini similarity index 100% rename from Data/User/GameConfig/RDHP78.ini rename to Data/Sys/GameSettings/RDHP78.ini diff --git a/Data/User/GameConfig/RDIE41.ini b/Data/Sys/GameSettings/RDIE41.ini similarity index 100% rename from Data/User/GameConfig/RDIE41.ini rename to Data/Sys/GameSettings/RDIE41.ini diff --git a/Data/User/GameConfig/RDKE01.ini b/Data/Sys/GameSettings/RDKE01.ini similarity index 100% rename from Data/User/GameConfig/RDKE01.ini rename to Data/Sys/GameSettings/RDKE01.ini diff --git a/Data/User/GameConfig/RDQEGD.ini b/Data/Sys/GameSettings/RDQEGD.ini similarity index 100% rename from Data/User/GameConfig/RDQEGD.ini rename to Data/Sys/GameSettings/RDQEGD.ini diff --git a/Data/Sys/GameSettings/RDQJGD.ini b/Data/Sys/GameSettings/RDQJGD.ini new file mode 100644 index 0000000000..7ce8f0d78d --- /dev/null +++ b/Data/Sys/GameSettings/RDQJGD.ini @@ -0,0 +1,26 @@ +# RDQJGD - DRAGON QUEST SWORDS + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/RDSE70.ini b/Data/Sys/GameSettings/RDSE70.ini similarity index 100% rename from Data/User/GameConfig/RDSE70.ini rename to Data/Sys/GameSettings/RDSE70.ini diff --git a/Data/User/GameConfig/RDSJAF.ini b/Data/Sys/GameSettings/RDSJAF.ini similarity index 100% rename from Data/User/GameConfig/RDSJAF.ini rename to Data/Sys/GameSettings/RDSJAF.ini diff --git a/Data/User/GameConfig/RDSPAF.ini b/Data/Sys/GameSettings/RDSPAF.ini similarity index 100% rename from Data/User/GameConfig/RDSPAF.ini rename to Data/Sys/GameSettings/RDSPAF.ini diff --git a/Data/User/GameConfig/RDVE41.ini b/Data/Sys/GameSettings/RDVE41.ini similarity index 100% rename from Data/User/GameConfig/RDVE41.ini rename to Data/Sys/GameSettings/RDVE41.ini diff --git a/Data/User/GameConfig/RDXP18.ini b/Data/Sys/GameSettings/RDXP18.ini similarity index 100% rename from Data/User/GameConfig/RDXP18.ini rename to Data/Sys/GameSettings/RDXP18.ini diff --git a/Data/User/GameConfig/RDZJ01.ini b/Data/Sys/GameSettings/RDZJ01.ini similarity index 100% rename from Data/User/GameConfig/RDZJ01.ini rename to Data/Sys/GameSettings/RDZJ01.ini diff --git a/Data/User/GameConfig/RDZP01.ini b/Data/Sys/GameSettings/RDZP01.ini similarity index 100% rename from Data/User/GameConfig/RDZP01.ini rename to Data/Sys/GameSettings/RDZP01.ini diff --git a/Data/User/GameConfig/RE4E08.ini b/Data/Sys/GameSettings/RE4E08.ini similarity index 100% rename from Data/User/GameConfig/RE4E08.ini rename to Data/Sys/GameSettings/RE4E08.ini diff --git a/Data/User/GameConfig/RE4J08.ini b/Data/Sys/GameSettings/RE4J08.ini similarity index 100% rename from Data/User/GameConfig/RE4J08.ini rename to Data/Sys/GameSettings/RE4J08.ini diff --git a/Data/User/GameConfig/RE4P08.ini b/Data/Sys/GameSettings/RE4P08.ini similarity index 100% rename from Data/User/GameConfig/RE4P08.ini rename to Data/Sys/GameSettings/RE4P08.ini diff --git a/Data/User/GameConfig/REDE41.ini b/Data/Sys/GameSettings/REDE41.ini similarity index 100% rename from Data/User/GameConfig/REDE41.ini rename to Data/Sys/GameSettings/REDE41.ini diff --git a/Data/User/GameConfig/REDJ41.ini b/Data/Sys/GameSettings/REDJ41.ini similarity index 100% rename from Data/User/GameConfig/REDJ41.ini rename to Data/Sys/GameSettings/REDJ41.ini diff --git a/Data/User/GameConfig/REDP41.ini b/Data/Sys/GameSettings/REDP41.ini similarity index 100% rename from Data/User/GameConfig/REDP41.ini rename to Data/Sys/GameSettings/REDP41.ini diff --git a/Data/User/GameConfig/RELJAB.ini b/Data/Sys/GameSettings/RELJAB.ini similarity index 96% rename from Data/User/GameConfig/RELJAB.ini rename to Data/Sys/GameSettings/RELJAB.ini index d8ad85b990..08e0560eb5 100644 --- a/Data/User/GameConfig/RELJAB.ini +++ b/Data/Sys/GameSettings/RELJAB.ini @@ -12,7 +12,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$DI Seed Blanker +$DI Seed Blanker 0x80000000:dword:0x00000000 0x80000004:dword:0x00000000 0x80000008:dword:0x00000000 diff --git a/Data/User/GameConfig/RELS01.ini b/Data/Sys/GameSettings/RELS01.ini similarity index 97% rename from Data/User/GameConfig/RELS01.ini rename to Data/Sys/GameSettings/RELS01.ini index 43ee5a4c01..32d3a27c07 100644 --- a/Data/User/GameConfig/RELS01.ini +++ b/Data/Sys/GameSettings/RELS01.ini @@ -14,7 +14,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$loophack_ZOOT +$loophack_ZOOT 0x80683804:word:0x60000000 $loophack_ZMM 0x8068C324:word:0x60000000 diff --git a/Data/User/GameConfig/RENE8P.ini b/Data/Sys/GameSettings/RENE8P.ini similarity index 88% rename from Data/User/GameConfig/RENE8P.ini rename to Data/Sys/GameSettings/RENE8P.ini index 35086950ad..91122bff40 100644 --- a/Data/User/GameConfig/RENE8P.ini +++ b/Data/Sys/GameSettings/RENE8P.ini @@ -18,10 +18,10 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/RENJ8P.ini b/Data/Sys/GameSettings/RENJ8P.ini similarity index 88% rename from Data/User/GameConfig/RENJ8P.ini rename to Data/Sys/GameSettings/RENJ8P.ini index 4c51634ee0..56b7619a4e 100644 --- a/Data/User/GameConfig/RENJ8P.ini +++ b/Data/Sys/GameSettings/RENJ8P.ini @@ -18,10 +18,10 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/RENP8P.ini b/Data/Sys/GameSettings/RENP8P.ini similarity index 88% rename from Data/User/GameConfig/RENP8P.ini rename to Data/Sys/GameSettings/RENP8P.ini index 7f92fa8505..f6c5802ecd 100644 --- a/Data/User/GameConfig/RENP8P.ini +++ b/Data/Sys/GameSettings/RENP8P.ini @@ -18,10 +18,10 @@ EmulationIssues = Very Darkness ingame # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.1 +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/REXP01.ini b/Data/Sys/GameSettings/REXP01.ini similarity index 100% rename from Data/User/GameConfig/REXP01.ini rename to Data/Sys/GameSettings/REXP01.ini diff --git a/Data/User/GameConfig/RF4P6M.ini b/Data/Sys/GameSettings/RF4P6M.ini similarity index 100% rename from Data/User/GameConfig/RF4P6M.ini rename to Data/Sys/GameSettings/RF4P6M.ini diff --git a/Data/User/GameConfig/RF7J08.ini b/Data/Sys/GameSettings/RF7J08.ini similarity index 94% rename from Data/User/GameConfig/RF7J08.ini rename to Data/Sys/GameSettings/RF7J08.ini index 64297e6f54..0e23a0ed09 100644 --- a/Data/User/GameConfig/RF7J08.ini +++ b/Data/Sys/GameSettings/RF7J08.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RFBE01.ini b/Data/Sys/GameSettings/RFBE01.ini similarity index 100% rename from Data/User/GameConfig/RFBE01.ini rename to Data/Sys/GameSettings/RFBE01.ini diff --git a/Data/User/GameConfig/RFBJ01.ini b/Data/Sys/GameSettings/RFBJ01.ini similarity index 100% rename from Data/User/GameConfig/RFBJ01.ini rename to Data/Sys/GameSettings/RFBJ01.ini diff --git a/Data/User/GameConfig/RFBP01.ini b/Data/Sys/GameSettings/RFBP01.ini similarity index 100% rename from Data/User/GameConfig/RFBP01.ini rename to Data/Sys/GameSettings/RFBP01.ini diff --git a/Data/User/GameConfig/RFCEGD.ini b/Data/Sys/GameSettings/RFCEGD.ini similarity index 78% rename from Data/User/GameConfig/RFCEGD.ini rename to Data/Sys/GameSettings/RFCEGD.ini index 85763baee1..12bf95800e 100644 --- a/Data/User/GameConfig/RFCEGD.ini +++ b/Data/Sys/GameSettings/RFCEGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Turn off "use panic handlers". Water glitches (r6521) +EmulationIssues = Turn off "use panic handlers". Water glitches. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -23,3 +23,6 @@ ProjectionHack = 0 [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RFCJGD.ini b/Data/Sys/GameSettings/RFCJGD.ini similarity index 78% rename from Data/User/GameConfig/RFCJGD.ini rename to Data/Sys/GameSettings/RFCJGD.ini index 6d42d954a5..9426d843bb 100644 --- a/Data/User/GameConfig/RFCJGD.ini +++ b/Data/Sys/GameSettings/RFCJGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Turn off "use panic handlers". Water glitches (r6521) +EmulationIssues = Turn off "use panic handlers". Water glitches. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -23,3 +23,6 @@ ProjectionHack = 0 [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RFCPGD.ini b/Data/Sys/GameSettings/RFCPGD.ini similarity index 73% rename from Data/User/GameConfig/RFCPGD.ini rename to Data/Sys/GameSettings/RFCPGD.ini index 39598d6f26..0905224f19 100644 --- a/Data/User/GameConfig/RFCPGD.ini +++ b/Data/Sys/GameSettings/RFCPGD.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Turn off "use panic handlers". Water glitches (r6521) +EmulationIssues = Turn off "use panic handlers". Water glitches. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -17,6 +17,12 @@ EmulationIssues = Turn off "use panic handlers". Water glitches (r6521) [ActionReplay] # Add action replay cheats here. +[Video] +ProjectionHack = 0 + [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RFEE01.ini b/Data/Sys/GameSettings/RFEE01.ini similarity index 100% rename from Data/User/GameConfig/RFEE01.ini rename to Data/Sys/GameSettings/RFEE01.ini diff --git a/Data/User/GameConfig/RFEJ01.ini b/Data/Sys/GameSettings/RFEJ01.ini similarity index 100% rename from Data/User/GameConfig/RFEJ01.ini rename to Data/Sys/GameSettings/RFEJ01.ini diff --git a/Data/User/GameConfig/RFEP01.ini b/Data/Sys/GameSettings/RFEP01.ini similarity index 100% rename from Data/User/GameConfig/RFEP01.ini rename to Data/Sys/GameSettings/RFEP01.ini diff --git a/Data/User/GameConfig/RFFEGD.ini b/Data/Sys/GameSettings/RFFEGD.ini similarity index 97% rename from Data/User/GameConfig/RFFEGD.ini rename to Data/Sys/GameSettings/RFFEGD.ini index 2378cad4b9..1a01e6afce 100644 --- a/Data/User/GameConfig/RFFEGD.ini +++ b/Data/Sys/GameSettings/RFFEGD.ini @@ -26,6 +26,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 +EFBScale = -1 SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/RFFJGD.ini b/Data/Sys/GameSettings/RFFJGD.ini similarity index 97% rename from Data/User/GameConfig/RFFJGD.ini rename to Data/Sys/GameSettings/RFFJGD.ini index 257906f1ed..76c522738f 100644 --- a/Data/User/GameConfig/RFFJGD.ini +++ b/Data/Sys/GameSettings/RFFJGD.ini @@ -26,6 +26,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 +EFBScale = -1 SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/RFFPGD.ini b/Data/Sys/GameSettings/RFFPGD.ini similarity index 97% rename from Data/User/GameConfig/RFFPGD.ini rename to Data/Sys/GameSettings/RFFPGD.ini index 359352c77d..1227196af0 100644 --- a/Data/User/GameConfig/RFFPGD.ini +++ b/Data/Sys/GameSettings/RFFPGD.ini @@ -26,6 +26,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 +EFBScale = -1 SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/RFQP69.ini b/Data/Sys/GameSettings/RFQP69.ini similarity index 100% rename from Data/User/GameConfig/RFQP69.ini rename to Data/Sys/GameSettings/RFQP69.ini diff --git a/Data/User/GameConfig/RFSEEB.ini b/Data/Sys/GameSettings/RFSEEB.ini similarity index 100% rename from Data/User/GameConfig/RFSEEB.ini rename to Data/Sys/GameSettings/RFSEEB.ini diff --git a/Data/User/GameConfig/RFSJ8P.ini b/Data/Sys/GameSettings/RFSJ8P.ini similarity index 100% rename from Data/User/GameConfig/RFSJ8P.ini rename to Data/Sys/GameSettings/RFSJ8P.ini diff --git a/Data/User/GameConfig/RG5PWR.ini b/Data/Sys/GameSettings/RG5PWR.ini similarity index 95% rename from Data/User/GameConfig/RG5PWR.ini rename to Data/Sys/GameSettings/RG5PWR.ini index 8d725f8c7f..be25d1340a 100644 --- a/Data/User/GameConfig/RG5PWR.ini +++ b/Data/Sys/GameSettings/RG5PWR.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 Issues="Need Projection before 945 - be activated" [OnLoad] diff --git a/Data/User/GameConfig/RGAE8P.ini b/Data/Sys/GameSettings/RGAE8P.ini similarity index 100% rename from Data/User/GameConfig/RGAE8P.ini rename to Data/Sys/GameSettings/RGAE8P.ini diff --git a/Data/User/GameConfig/RGHE52.ini b/Data/Sys/GameSettings/RGHE52.ini similarity index 100% rename from Data/User/GameConfig/RGHE52.ini rename to Data/Sys/GameSettings/RGHE52.ini diff --git a/Data/User/GameConfig/RGLE7D.ini b/Data/Sys/GameSettings/RGLE7D.ini similarity index 100% rename from Data/User/GameConfig/RGLE7D.ini rename to Data/Sys/GameSettings/RGLE7D.ini diff --git a/Data/User/GameConfig/RGQE70.ini b/Data/Sys/GameSettings/RGQE70.ini similarity index 97% rename from Data/User/GameConfig/RGQE70.ini rename to Data/Sys/GameSettings/RGQE70.ini index 1a0fa42946..15954f207f 100644 --- a/Data/User/GameConfig/RGQE70.ini +++ b/Data/Sys/GameSettings/RGQE70.ini @@ -13,7 +13,7 @@ EmulationStateId = 4 [OnFrame] # Add memory patches to be applied every frame here. -+$crashfix +$crashfix 0x8006935C:dword:0x60000000 [ActionReplay] diff --git a/Data/User/GameConfig/RGVP52.ini b/Data/Sys/GameSettings/RGVP52.ini similarity index 100% rename from Data/User/GameConfig/RGVP52.ini rename to Data/Sys/GameSettings/RGVP52.ini diff --git a/Data/User/GameConfig/RH2P41.ini b/Data/Sys/GameSettings/RH2P41.ini similarity index 94% rename from Data/User/GameConfig/RH2P41.ini rename to Data/Sys/GameSettings/RH2P41.ini index 4dd22011be..ad1ff1c09d 100644 --- a/Data/User/GameConfig/RH2P41.ini +++ b/Data/Sys/GameSettings/RH2P41.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RH8E4F.ini b/Data/Sys/GameSettings/RH8E4F.ini similarity index 100% rename from Data/User/GameConfig/RH8E4F.ini rename to Data/Sys/GameSettings/RH8E4F.ini diff --git a/Data/User/GameConfig/RH8JEL.ini b/Data/Sys/GameSettings/RH8JEL.ini similarity index 100% rename from Data/User/GameConfig/RH8JEL.ini rename to Data/Sys/GameSettings/RH8JEL.ini diff --git a/Data/User/GameConfig/RH8P4F.ini b/Data/Sys/GameSettings/RH8P4F.ini similarity index 100% rename from Data/User/GameConfig/RH8P4F.ini rename to Data/Sys/GameSettings/RH8P4F.ini diff --git a/Data/User/GameConfig/RH8X4F.ini b/Data/Sys/GameSettings/RH8X4F.ini similarity index 100% rename from Data/User/GameConfig/RH8X4F.ini rename to Data/Sys/GameSettings/RH8X4F.ini diff --git a/Data/User/GameConfig/RHAE01.ini b/Data/Sys/GameSettings/RHAE01.ini similarity index 100% rename from Data/User/GameConfig/RHAE01.ini rename to Data/Sys/GameSettings/RHAE01.ini diff --git a/Data/User/GameConfig/RHAJ01.ini b/Data/Sys/GameSettings/RHAJ01.ini similarity index 100% rename from Data/User/GameConfig/RHAJ01.ini rename to Data/Sys/GameSettings/RHAJ01.ini diff --git a/Data/User/GameConfig/RHAK01.ini b/Data/Sys/GameSettings/RHAK01.ini similarity index 100% rename from Data/User/GameConfig/RHAK01.ini rename to Data/Sys/GameSettings/RHAK01.ini diff --git a/Data/User/GameConfig/RHAP01.ini b/Data/Sys/GameSettings/RHAP01.ini similarity index 100% rename from Data/User/GameConfig/RHAP01.ini rename to Data/Sys/GameSettings/RHAP01.ini diff --git a/Data/User/GameConfig/RHAW01.ini b/Data/Sys/GameSettings/RHAW01.ini similarity index 100% rename from Data/User/GameConfig/RHAW01.ini rename to Data/Sys/GameSettings/RHAW01.ini diff --git a/Data/User/GameConfig/RHDE8P.ini b/Data/Sys/GameSettings/RHDE8P.ini similarity index 100% rename from Data/User/GameConfig/RHDE8P.ini rename to Data/Sys/GameSettings/RHDE8P.ini diff --git a/Data/User/GameConfig/RHDJ8P.ini b/Data/Sys/GameSettings/RHDJ8P.ini similarity index 100% rename from Data/User/GameConfig/RHDJ8P.ini rename to Data/Sys/GameSettings/RHDJ8P.ini diff --git a/Data/User/GameConfig/RHDP8P.ini b/Data/Sys/GameSettings/RHDP8P.ini similarity index 100% rename from Data/User/GameConfig/RHDP8P.ini rename to Data/Sys/GameSettings/RHDP8P.ini diff --git a/Data/User/GameConfig/RHMEE9.ini b/Data/Sys/GameSettings/RHMEE9.ini similarity index 100% rename from Data/User/GameConfig/RHMEE9.ini rename to Data/Sys/GameSettings/RHMEE9.ini diff --git a/Data/User/GameConfig/RHMP99.ini b/Data/Sys/GameSettings/RHMP99.ini similarity index 100% rename from Data/User/GameConfig/RHMP99.ini rename to Data/Sys/GameSettings/RHMP99.ini diff --git a/Data/Sys/GameSettings/RHOE8P.ini b/Data/Sys/GameSettings/RHOE8P.ini new file mode 100644 index 0000000000..8d8190877a --- /dev/null +++ b/Data/Sys/GameSettings/RHOE8P.ini @@ -0,0 +1,20 @@ +# RHOE8P - House Of The Dead: OVERKILL +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RHOJ8P.ini b/Data/Sys/GameSettings/RHOJ8P.ini similarity index 69% rename from Data/User/GameConfig/RHOJ8P.ini rename to Data/Sys/GameSettings/RHOJ8P.ini index 549574908c..bdef300ddf 100644 --- a/Data/User/GameConfig/RHOJ8P.ini +++ b/Data/Sys/GameSettings/RHOJ8P.ini @@ -1,22 +1,20 @@ # RHOJ8P - House Of The Dead: OVERKILL - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 5 -EmulationIssues = Use dx11 plugin (r6945) - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 - +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RHOP8P.ini b/Data/Sys/GameSettings/RHOP8P.ini similarity index 69% rename from Data/User/GameConfig/RHOP8P.ini rename to Data/Sys/GameSettings/RHOP8P.ini index 79a3206066..fa314e84e4 100644 --- a/Data/User/GameConfig/RHOP8P.ini +++ b/Data/Sys/GameSettings/RHOP8P.ini @@ -1,22 +1,20 @@ # RHOP8P - House Of The Dead: OVERKILL - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 5 -EmulationIssues = Use dx11 plugin (r6945) - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 - +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RHTP54.ini b/Data/Sys/GameSettings/RHTP54.ini similarity index 100% rename from Data/User/GameConfig/RHTP54.ini rename to Data/Sys/GameSettings/RHTP54.ini diff --git a/Data/User/GameConfig/RHUP7J.ini b/Data/Sys/GameSettings/RHUP7J.ini similarity index 100% rename from Data/User/GameConfig/RHUP7J.ini rename to Data/Sys/GameSettings/RHUP7J.ini diff --git a/Data/User/GameConfig/RIBPKM.ini b/Data/Sys/GameSettings/RIBPKM.ini similarity index 100% rename from Data/User/GameConfig/RIBPKM.ini rename to Data/Sys/GameSettings/RIBPKM.ini diff --git a/Data/User/GameConfig/RIHP8P.ini b/Data/Sys/GameSettings/RIHP8P.ini similarity index 100% rename from Data/User/GameConfig/RIHP8P.ini rename to Data/Sys/GameSettings/RIHP8P.ini diff --git a/Data/User/GameConfig/RIJE69.ini b/Data/Sys/GameSettings/RIJE69.ini similarity index 100% rename from Data/User/GameConfig/RIJE69.ini rename to Data/Sys/GameSettings/RIJE69.ini diff --git a/Data/User/GameConfig/RINE08.ini b/Data/Sys/GameSettings/RINE08.ini similarity index 100% rename from Data/User/GameConfig/RINE08.ini rename to Data/Sys/GameSettings/RINE08.ini diff --git a/Data/User/GameConfig/RINP08.ini b/Data/Sys/GameSettings/RINP08.ini similarity index 100% rename from Data/User/GameConfig/RINP08.ini rename to Data/Sys/GameSettings/RINP08.ini diff --git a/Data/User/GameConfig/RIPEAF.ini b/Data/Sys/GameSettings/RIPEAF.ini similarity index 100% rename from Data/User/GameConfig/RIPEAF.ini rename to Data/Sys/GameSettings/RIPEAF.ini diff --git a/Data/User/GameConfig/RIPJAF.ini b/Data/Sys/GameSettings/RIPJAF.ini similarity index 100% rename from Data/User/GameConfig/RIPJAF.ini rename to Data/Sys/GameSettings/RIPJAF.ini diff --git a/Data/User/GameConfig/RIPPAF.ini b/Data/Sys/GameSettings/RIPPAF.ini similarity index 100% rename from Data/User/GameConfig/RIPPAF.ini rename to Data/Sys/GameSettings/RIPPAF.ini diff --git a/Data/User/GameConfig/RIUJAF.ini b/Data/Sys/GameSettings/RIUJAF.ini similarity index 100% rename from Data/User/GameConfig/RIUJAF.ini rename to Data/Sys/GameSettings/RIUJAF.ini diff --git a/Data/User/GameConfig/RIUPAF.ini b/Data/Sys/GameSettings/RIUPAF.ini similarity index 100% rename from Data/User/GameConfig/RIUPAF.ini rename to Data/Sys/GameSettings/RIUPAF.ini diff --git a/Data/User/GameConfig/RIVEXJ.ini b/Data/Sys/GameSettings/RIVEXJ.ini similarity index 100% rename from Data/User/GameConfig/RIVEXJ.ini rename to Data/Sys/GameSettings/RIVEXJ.ini diff --git a/Data/User/GameConfig/RJ3P7J.ini b/Data/Sys/GameSettings/RJ3P7J.ini similarity index 100% rename from Data/User/GameConfig/RJ3P7J.ini rename to Data/Sys/GameSettings/RJ3P7J.ini diff --git a/Data/User/GameConfig/RJAP52.ini b/Data/Sys/GameSettings/RJAP52.ini similarity index 100% rename from Data/User/GameConfig/RJAP52.ini rename to Data/Sys/GameSettings/RJAP52.ini diff --git a/Data/User/GameConfig/RJCP52.ini b/Data/Sys/GameSettings/RJCP52.ini similarity index 100% rename from Data/User/GameConfig/RJCP52.ini rename to Data/Sys/GameSettings/RJCP52.ini diff --git a/Data/User/GameConfig/RJSXUG.ini b/Data/Sys/GameSettings/RJSXUG.ini similarity index 100% rename from Data/User/GameConfig/RJSXUG.ini rename to Data/Sys/GameSettings/RJSXUG.ini diff --git a/Data/User/GameConfig/RK2EEB.ini b/Data/Sys/GameSettings/RK2EEB.ini similarity index 100% rename from Data/User/GameConfig/RK2EEB.ini rename to Data/Sys/GameSettings/RK2EEB.ini diff --git a/Data/User/GameConfig/RK2JEB.ini b/Data/Sys/GameSettings/RK2JEB.ini similarity index 100% rename from Data/User/GameConfig/RK2JEB.ini rename to Data/Sys/GameSettings/RK2JEB.ini diff --git a/Data/User/GameConfig/RK2P01.ini b/Data/Sys/GameSettings/RK2P01.ini similarity index 100% rename from Data/User/GameConfig/RK2P01.ini rename to Data/Sys/GameSettings/RK2P01.ini diff --git a/Data/User/GameConfig/RK5E01.ini b/Data/Sys/GameSettings/RK5E01.ini similarity index 100% rename from Data/User/GameConfig/RK5E01.ini rename to Data/Sys/GameSettings/RK5E01.ini diff --git a/Data/User/GameConfig/RKDEEB.ini b/Data/Sys/GameSettings/RKDEEB.ini similarity index 100% rename from Data/User/GameConfig/RKDEEB.ini rename to Data/Sys/GameSettings/RKDEEB.ini diff --git a/Data/User/GameConfig/RKDJEB.ini b/Data/Sys/GameSettings/RKDJEB.ini similarity index 100% rename from Data/User/GameConfig/RKDJEB.ini rename to Data/Sys/GameSettings/RKDJEB.ini diff --git a/Data/User/GameConfig/RKDP01.ini b/Data/Sys/GameSettings/RKDP01.ini similarity index 100% rename from Data/User/GameConfig/RKDP01.ini rename to Data/Sys/GameSettings/RKDP01.ini diff --git a/Data/User/GameConfig/RKDPEB.ini b/Data/Sys/GameSettings/RKDPEB.ini similarity index 100% rename from Data/User/GameConfig/RKDPEB.ini rename to Data/Sys/GameSettings/RKDPEB.ini diff --git a/Data/User/GameConfig/RKIPUG.ini b/Data/Sys/GameSettings/RKIPUG.ini similarity index 100% rename from Data/User/GameConfig/RKIPUG.ini rename to Data/Sys/GameSettings/RKIPUG.ini diff --git a/Data/User/GameConfig/RKMP5D.ini b/Data/Sys/GameSettings/RKMP5D.ini similarity index 100% rename from Data/User/GameConfig/RKMP5D.ini rename to Data/Sys/GameSettings/RKMP5D.ini diff --git a/Data/User/GameConfig/RKSPUG.ini b/Data/Sys/GameSettings/RKSPUG.ini similarity index 100% rename from Data/User/GameConfig/RKSPUG.ini rename to Data/Sys/GameSettings/RKSPUG.ini diff --git a/Data/User/GameConfig/RLBEWR.ini b/Data/Sys/GameSettings/RLBEWR.ini similarity index 100% rename from Data/User/GameConfig/RLBEWR.ini rename to Data/Sys/GameSettings/RLBEWR.ini diff --git a/Data/User/GameConfig/RLEEFS.ini b/Data/Sys/GameSettings/RLEEFS.ini similarity index 100% rename from Data/User/GameConfig/RLEEFS.ini rename to Data/Sys/GameSettings/RLEEFS.ini diff --git a/Data/User/GameConfig/RLGE64.ini b/Data/Sys/GameSettings/RLGE64.ini similarity index 100% rename from Data/User/GameConfig/RLGE64.ini rename to Data/Sys/GameSettings/RLGE64.ini diff --git a/Data/User/GameConfig/RLGJ52.ini b/Data/Sys/GameSettings/RLGJ52.ini similarity index 100% rename from Data/User/GameConfig/RLGJ52.ini rename to Data/Sys/GameSettings/RLGJ52.ini diff --git a/Data/User/GameConfig/RLGP64.ini b/Data/Sys/GameSettings/RLGP64.ini similarity index 100% rename from Data/User/GameConfig/RLGP64.ini rename to Data/Sys/GameSettings/RLGP64.ini diff --git a/Data/User/GameConfig/RLJPKM.ini b/Data/Sys/GameSettings/RLJPKM.ini similarity index 100% rename from Data/User/GameConfig/RLJPKM.ini rename to Data/Sys/GameSettings/RLJPKM.ini diff --git a/Data/User/GameConfig/RLXEMJ.ini b/Data/Sys/GameSettings/RLXEMJ.ini similarity index 94% rename from Data/User/GameConfig/RLXEMJ.ini rename to Data/Sys/GameSettings/RLXEMJ.ini index f2220596ca..fbfeda997a 100644 --- a/Data/User/GameConfig/RLXEMJ.ini +++ b/Data/Sys/GameSettings/RLXEMJ.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RM2E69.ini b/Data/Sys/GameSettings/RM2E69.ini similarity index 100% rename from Data/User/GameConfig/RM2E69.ini rename to Data/Sys/GameSettings/RM2E69.ini diff --git a/Data/Sys/GameSettings/RM3E01.ini b/Data/Sys/GameSettings/RM3E01.ini new file mode 100644 index 0000000000..c95b3d00d4 --- /dev/null +++ b/Data/Sys/GameSettings/RM3E01.ini @@ -0,0 +1,23 @@ +# RM3E01 - Metroid Prime 3: Corruption +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/RM3J01.ini b/Data/Sys/GameSettings/RM3J01.ini new file mode 100644 index 0000000000..2e06a5b0bf --- /dev/null +++ b/Data/Sys/GameSettings/RM3J01.ini @@ -0,0 +1,23 @@ +# RM3J01 - Metroid Prime 3: Corruption +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/RM3P01.ini b/Data/Sys/GameSettings/RM3P01.ini new file mode 100644 index 0000000000..bcee374ed1 --- /dev/null +++ b/Data/Sys/GameSettings/RM3P01.ini @@ -0,0 +1,27 @@ +# RM3P01 - Metroid Prime 3: Corruption + +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True +[Speedhacks] +0x804e8b20=600 + diff --git a/Data/User/GameConfig/RM6EEB.ini b/Data/Sys/GameSettings/RM6EEB.ini similarity index 100% rename from Data/User/GameConfig/RM6EEB.ini rename to Data/Sys/GameSettings/RM6EEB.ini diff --git a/Data/User/GameConfig/RM8E01.ini b/Data/Sys/GameSettings/RM8E01.ini similarity index 75% rename from Data/User/GameConfig/RM8E01.ini rename to Data/Sys/GameSettings/RM8E01.ini index ad0b0ae81d..534dfa7e0a 100644 --- a/Data/User/GameConfig/RM8E01.ini +++ b/Data/Sys/GameSettings/RM8E01.ini @@ -1,34 +1,24 @@ # RM8E01 - Mario Party 8 - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -Issues= -EmulationIssues = - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = [Video_Enhancements] ForceFiltering = False - [Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True DlistCachingEnable = False - diff --git a/Data/Sys/GameSettings/RM8J01.ini b/Data/Sys/GameSettings/RM8J01.ini new file mode 100644 index 0000000000..5dcd287241 --- /dev/null +++ b/Data/Sys/GameSettings/RM8J01.ini @@ -0,0 +1,24 @@ +# RM8J01 - Mario Party 8 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +ForceFiltering = False +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True +DlistCachingEnable = False diff --git a/Data/Sys/GameSettings/RM8K01.ini b/Data/Sys/GameSettings/RM8K01.ini new file mode 100644 index 0000000000..ef60f0363e --- /dev/null +++ b/Data/Sys/GameSettings/RM8K01.ini @@ -0,0 +1,24 @@ +# RM8K01 - Mario Party 8 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +ForceFiltering = False +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True +DlistCachingEnable = False diff --git a/Data/User/GameConfig/RM8P01.ini b/Data/Sys/GameSettings/RM8P01.ini similarity index 76% rename from Data/User/GameConfig/RM8P01.ini rename to Data/Sys/GameSettings/RM8P01.ini index af6b663910..a42774aa79 100644 --- a/Data/User/GameConfig/RM8P01.ini +++ b/Data/Sys/GameSettings/RM8P01.ini @@ -1,33 +1,24 @@ # RM8P01 - Mario Party 8 - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = [Video_Enhancements] ForceFiltering = False - [Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True DlistCachingEnable = False - diff --git a/Data/User/GameConfig/RMAE01.ini b/Data/Sys/GameSettings/RMAE01.ini similarity index 100% rename from Data/User/GameConfig/RMAE01.ini rename to Data/Sys/GameSettings/RMAE01.ini diff --git a/Data/User/GameConfig/RMAP01.ini b/Data/Sys/GameSettings/RMAP01.ini similarity index 100% rename from Data/User/GameConfig/RMAP01.ini rename to Data/Sys/GameSettings/RMAP01.ini diff --git a/Data/User/GameConfig/RMCE01.ini b/Data/Sys/GameSettings/RMCE01.ini similarity index 100% rename from Data/User/GameConfig/RMCE01.ini rename to Data/Sys/GameSettings/RMCE01.ini diff --git a/Data/User/GameConfig/RMCJ01.ini b/Data/Sys/GameSettings/RMCJ01.ini similarity index 100% rename from Data/User/GameConfig/RMCJ01.ini rename to Data/Sys/GameSettings/RMCJ01.ini diff --git a/Data/User/GameConfig/RMCK01.ini b/Data/Sys/GameSettings/RMCK01.ini similarity index 100% rename from Data/User/GameConfig/RMCK01.ini rename to Data/Sys/GameSettings/RMCK01.ini diff --git a/Data/User/GameConfig/RMCP01.ini b/Data/Sys/GameSettings/RMCP01.ini similarity index 100% rename from Data/User/GameConfig/RMCP01.ini rename to Data/Sys/GameSettings/RMCP01.ini diff --git a/Data/User/GameConfig/RMGE01.ini b/Data/Sys/GameSettings/RMGE01.ini similarity index 100% rename from Data/User/GameConfig/RMGE01.ini rename to Data/Sys/GameSettings/RMGE01.ini diff --git a/Data/User/GameConfig/RMGJ01.ini b/Data/Sys/GameSettings/RMGJ01.ini similarity index 100% rename from Data/User/GameConfig/RMGJ01.ini rename to Data/Sys/GameSettings/RMGJ01.ini diff --git a/Data/User/GameConfig/RMGK01.ini b/Data/Sys/GameSettings/RMGK01.ini similarity index 100% rename from Data/User/GameConfig/RMGK01.ini rename to Data/Sys/GameSettings/RMGK01.ini diff --git a/Data/User/GameConfig/RMGP01.ini b/Data/Sys/GameSettings/RMGP01.ini similarity index 100% rename from Data/User/GameConfig/RMGP01.ini rename to Data/Sys/GameSettings/RMGP01.ini diff --git a/Data/User/GameConfig/RMHE08.ini b/Data/Sys/GameSettings/RMHE08.ini similarity index 92% rename from Data/User/GameConfig/RMHE08.ini rename to Data/Sys/GameSettings/RMHE08.ini index 98bbab0d30..963ca152c8 100644 --- a/Data/User/GameConfig/RMHE08.ini +++ b/Data/Sys/GameSettings/RMHE08.ini @@ -6,7 +6,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d 9 & 11 to have playable speeds. +EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d to have playable speeds. EmulationStateId = 4 [OnLoad] @@ -14,7 +14,7 @@ EmulationStateId = 4 [OnFrame] # Add memory patches to be applied every frame here. -+$Bloom OFF +$Bloom OFF 0x04056FF4:dword:0xC022FFE4 0x0479DA84:dword:0x3F800000 diff --git a/Data/User/GameConfig/RMHJ08.ini b/Data/Sys/GameSettings/RMHJ08.ini similarity index 94% rename from Data/User/GameConfig/RMHJ08.ini rename to Data/Sys/GameSettings/RMHJ08.ini index f3ac91846e..0c61d73d9b 100644 --- a/Data/User/GameConfig/RMHJ08.ini +++ b/Data/Sys/GameSettings/RMHJ08.ini @@ -6,7 +6,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d 9 & 11 to have playable speeds. +EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d to have playable speeds. EmulationStateId = 4 [OnLoad] diff --git a/Data/User/GameConfig/RMHP08.ini b/Data/Sys/GameSettings/RMHP08.ini similarity index 93% rename from Data/User/GameConfig/RMHP08.ini rename to Data/Sys/GameSettings/RMHP08.ini index d8952d1742..ea9bbaa1e4 100644 --- a/Data/User/GameConfig/RMHP08.ini +++ b/Data/Sys/GameSettings/RMHP08.ini @@ -6,7 +6,7 @@ TLBHack = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d 9 & 11 to have playable speeds. +EmulationIssues = Skip efb access from cpu needs to be enabled for direct 3d to have playable speeds. EmulationStateId = 4 [OnLoad] diff --git a/Data/User/GameConfig/RMKE01.ini b/Data/Sys/GameSettings/RMKE01.ini similarity index 85% rename from Data/User/GameConfig/RMKE01.ini rename to Data/Sys/GameSettings/RMKE01.ini index 4b26f6dbc3..7486ccb7e9 100644 --- a/Data/User/GameConfig/RMKE01.ini +++ b/Data/Sys/GameSettings/RMKE01.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3D11 plugin for less glitches (r6932) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -20,3 +20,5 @@ EmulationIssues = Use Direct3D11 plugin for less glitches (r6932) [Video] ProjectionHack = 0 +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RMKJ01.ini b/Data/Sys/GameSettings/RMKJ01.ini similarity index 85% rename from Data/User/GameConfig/RMKJ01.ini rename to Data/Sys/GameSettings/RMKJ01.ini index ff7399298a..0780e20b32 100644 --- a/Data/User/GameConfig/RMKJ01.ini +++ b/Data/Sys/GameSettings/RMKJ01.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3D11 plugin for less glitches (r6932) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -20,3 +20,5 @@ EmulationIssues = Use Direct3D11 plugin for less glitches (r6932) [Video] ProjectionHack = 0 +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/Sys/GameSettings/RMKP01.ini b/Data/Sys/GameSettings/RMKP01.ini new file mode 100644 index 0000000000..1eee5258db --- /dev/null +++ b/Data/Sys/GameSettings/RMKP01.ini @@ -0,0 +1,24 @@ +# RMKP01 - MARIO SPORTS MIX + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 + +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RMLEH4.ini b/Data/Sys/GameSettings/RMLEH4.ini similarity index 100% rename from Data/User/GameConfig/RMLEH4.ini rename to Data/Sys/GameSettings/RMLEH4.ini diff --git a/Data/User/GameConfig/RMLJH4.ini b/Data/Sys/GameSettings/RMLJH4.ini similarity index 100% rename from Data/User/GameConfig/RMLJH4.ini rename to Data/Sys/GameSettings/RMLJH4.ini diff --git a/Data/User/GameConfig/RMLK52.ini b/Data/Sys/GameSettings/RMLK52.ini similarity index 100% rename from Data/User/GameConfig/RMLK52.ini rename to Data/Sys/GameSettings/RMLK52.ini diff --git a/Data/User/GameConfig/RMLP7U.ini b/Data/Sys/GameSettings/RMLP7U.ini similarity index 100% rename from Data/User/GameConfig/RMLP7U.ini rename to Data/Sys/GameSettings/RMLP7U.ini diff --git a/Data/User/GameConfig/RMLPH4.ini b/Data/Sys/GameSettings/RMLPH4.ini similarity index 100% rename from Data/User/GameConfig/RMLPH4.ini rename to Data/Sys/GameSettings/RMLPH4.ini diff --git a/Data/User/GameConfig/RMSE52.ini b/Data/Sys/GameSettings/RMSE52.ini similarity index 100% rename from Data/User/GameConfig/RMSE52.ini rename to Data/Sys/GameSettings/RMSE52.ini diff --git a/Data/User/GameConfig/RNEEDA.ini b/Data/Sys/GameSettings/RNEEDA.ini similarity index 100% rename from Data/User/GameConfig/RNEEDA.ini rename to Data/Sys/GameSettings/RNEEDA.ini diff --git a/Data/User/GameConfig/RNEJDA.ini b/Data/Sys/GameSettings/RNEJDA.ini similarity index 100% rename from Data/User/GameConfig/RNEJDA.ini rename to Data/Sys/GameSettings/RNEJDA.ini diff --git a/Data/User/GameConfig/RNEPDA.ini b/Data/Sys/GameSettings/RNEPDA.ini similarity index 100% rename from Data/User/GameConfig/RNEPDA.ini rename to Data/Sys/GameSettings/RNEPDA.ini diff --git a/Data/User/GameConfig/RNHE41.ini b/Data/Sys/GameSettings/RNHE41.ini similarity index 100% rename from Data/User/GameConfig/RNHE41.ini rename to Data/Sys/GameSettings/RNHE41.ini diff --git a/Data/User/GameConfig/RNMXUG.ini b/Data/Sys/GameSettings/RNMXUG.ini similarity index 100% rename from Data/User/GameConfig/RNMXUG.ini rename to Data/Sys/GameSettings/RNMXUG.ini diff --git a/Data/User/GameConfig/RNOJ01.ini b/Data/Sys/GameSettings/RNOJ01.ini similarity index 100% rename from Data/User/GameConfig/RNOJ01.ini rename to Data/Sys/GameSettings/RNOJ01.ini diff --git a/Data/User/GameConfig/RNOP01.ini b/Data/Sys/GameSettings/RNOP01.ini similarity index 100% rename from Data/User/GameConfig/RNOP01.ini rename to Data/Sys/GameSettings/RNOP01.ini diff --git a/Data/User/GameConfig/RO2P7N.ini b/Data/Sys/GameSettings/RO2P7N.ini similarity index 97% rename from Data/User/GameConfig/RO2P7N.ini rename to Data/Sys/GameSettings/RO2P7N.ini index 5f84ef165b..2f26d6a6e3 100644 --- a/Data/User/GameConfig/RO2P7N.ini +++ b/Data/Sys/GameSettings/RO2P7N.ini @@ -13,7 +13,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$Hangfix +$Hangfix 0x8007D340:byte:0x00000090 0x8007D344:byte:0x00000090 0x8007D348:byte:0x00000090 diff --git a/Data/User/GameConfig/RO3EXJ.ini b/Data/Sys/GameSettings/RO3EXJ.ini similarity index 100% rename from Data/User/GameConfig/RO3EXJ.ini rename to Data/Sys/GameSettings/RO3EXJ.ini diff --git a/Data/User/GameConfig/RO3J99.ini b/Data/Sys/GameSettings/RO3J99.ini similarity index 100% rename from Data/User/GameConfig/RO3J99.ini rename to Data/Sys/GameSettings/RO3J99.ini diff --git a/Data/User/GameConfig/RO3P99.ini b/Data/Sys/GameSettings/RO3P99.ini similarity index 100% rename from Data/User/GameConfig/RO3P99.ini rename to Data/Sys/GameSettings/RO3P99.ini diff --git a/Data/User/GameConfig/RO7P7D.ini b/Data/Sys/GameSettings/RO7P7D.ini similarity index 100% rename from Data/User/GameConfig/RO7P7D.ini rename to Data/Sys/GameSettings/RO7P7D.ini diff --git a/Data/User/GameConfig/RO8E7D.ini b/Data/Sys/GameSettings/RO8E7D.ini similarity index 100% rename from Data/User/GameConfig/RO8E7D.ini rename to Data/Sys/GameSettings/RO8E7D.ini diff --git a/Data/User/GameConfig/RO9EFS.ini b/Data/Sys/GameSettings/RO9EFS.ini similarity index 100% rename from Data/User/GameConfig/RO9EFS.ini rename to Data/Sys/GameSettings/RO9EFS.ini diff --git a/Data/User/GameConfig/RO9PNK.ini b/Data/Sys/GameSettings/RO9PNK.ini similarity index 100% rename from Data/User/GameConfig/RO9PNK.ini rename to Data/Sys/GameSettings/RO9PNK.ini diff --git a/Data/User/GameConfig/ROAE36.ini b/Data/Sys/GameSettings/ROAE36.ini similarity index 100% rename from Data/User/GameConfig/ROAE36.ini rename to Data/Sys/GameSettings/ROAE36.ini diff --git a/Data/User/GameConfig/ROAP36.ini b/Data/Sys/GameSettings/ROAP36.ini similarity index 100% rename from Data/User/GameConfig/ROAP36.ini rename to Data/Sys/GameSettings/ROAP36.ini diff --git a/Data/User/GameConfig/ROCPNK.ini b/Data/Sys/GameSettings/ROCPNK.ini similarity index 100% rename from Data/User/GameConfig/ROCPNK.ini rename to Data/Sys/GameSettings/ROCPNK.ini diff --git a/Data/User/GameConfig/RODE01.ini b/Data/Sys/GameSettings/RODE01.ini similarity index 100% rename from Data/User/GameConfig/RODE01.ini rename to Data/Sys/GameSettings/RODE01.ini diff --git a/Data/User/GameConfig/RODJ01.ini b/Data/Sys/GameSettings/RODJ01.ini similarity index 100% rename from Data/User/GameConfig/RODJ01.ini rename to Data/Sys/GameSettings/RODJ01.ini diff --git a/Data/User/GameConfig/RODK01.ini b/Data/Sys/GameSettings/RODK01.ini similarity index 100% rename from Data/User/GameConfig/RODK01.ini rename to Data/Sys/GameSettings/RODK01.ini diff --git a/Data/User/GameConfig/RODP01.ini b/Data/Sys/GameSettings/RODP01.ini similarity index 100% rename from Data/User/GameConfig/RODP01.ini rename to Data/Sys/GameSettings/RODP01.ini diff --git a/Data/User/GameConfig/ROLE8P.ini b/Data/Sys/GameSettings/ROLE8P.ini similarity index 91% rename from Data/User/GameConfig/ROLE8P.ini rename to Data/Sys/GameSettings/ROLE8P.ini index 48870b45a4..0c31b04899 100644 --- a/Data/User/GameConfig/ROLE8P.ini +++ b/Data/Sys/GameSettings/ROLE8P.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/ROLJ01.ini b/Data/Sys/GameSettings/ROLJ01.ini similarity index 91% rename from Data/User/GameConfig/ROLJ01.ini rename to Data/Sys/GameSettings/ROLJ01.ini index 3a287f4bee..c35e8e8a92 100644 --- a/Data/User/GameConfig/ROLJ01.ini +++ b/Data/Sys/GameSettings/ROLJ01.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/ROLK01.ini b/Data/Sys/GameSettings/ROLK01.ini similarity index 91% rename from Data/User/GameConfig/ROLK01.ini rename to Data/Sys/GameSettings/ROLK01.ini index 595e3bbdfe..f8755bbcde 100644 --- a/Data/User/GameConfig/ROLK01.ini +++ b/Data/Sys/GameSettings/ROLK01.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/ROLP8P.ini b/Data/Sys/GameSettings/ROLP8P.ini similarity index 91% rename from Data/User/GameConfig/ROLP8P.ini rename to Data/Sys/GameSettings/ROLP8P.ini index 1d715901d0..abffb166bb 100644 --- a/Data/User/GameConfig/ROLP8P.ini +++ b/Data/Sys/GameSettings/ROLP8P.ini @@ -18,12 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/RONEG9.ini b/Data/Sys/GameSettings/RONEG9.ini similarity index 100% rename from Data/User/GameConfig/RONEG9.ini rename to Data/Sys/GameSettings/RONEG9.ini diff --git a/Data/User/GameConfig/RONJG9.ini b/Data/Sys/GameSettings/RONJG9.ini similarity index 100% rename from Data/User/GameConfig/RONJG9.ini rename to Data/Sys/GameSettings/RONJG9.ini diff --git a/Data/User/GameConfig/RONPG9.ini b/Data/Sys/GameSettings/RONPG9.ini similarity index 100% rename from Data/User/GameConfig/RONPG9.ini rename to Data/Sys/GameSettings/RONPG9.ini diff --git a/Data/User/GameConfig/ROUJAF.ini b/Data/Sys/GameSettings/ROUJAF.ini similarity index 100% rename from Data/User/GameConfig/ROUJAF.ini rename to Data/Sys/GameSettings/ROUJAF.ini diff --git a/Data/User/GameConfig/ROUPAF.ini b/Data/Sys/GameSettings/ROUPAF.ini similarity index 100% rename from Data/User/GameConfig/ROUPAF.ini rename to Data/Sys/GameSettings/ROUPAF.ini diff --git a/Data/User/GameConfig/ROWE08.ini b/Data/Sys/GameSettings/ROWE08.ini similarity index 100% rename from Data/User/GameConfig/ROWE08.ini rename to Data/Sys/GameSettings/ROWE08.ini diff --git a/Data/User/GameConfig/ROWJ08.ini b/Data/Sys/GameSettings/ROWJ08.ini similarity index 100% rename from Data/User/GameConfig/ROWJ08.ini rename to Data/Sys/GameSettings/ROWJ08.ini diff --git a/Data/User/GameConfig/ROWP08.ini b/Data/Sys/GameSettings/ROWP08.ini similarity index 100% rename from Data/User/GameConfig/ROWP08.ini rename to Data/Sys/GameSettings/ROWP08.ini diff --git a/Data/User/GameConfig/RP7P52.ini b/Data/Sys/GameSettings/RP7P52.ini similarity index 94% rename from Data/User/GameConfig/RP7P52.ini rename to Data/Sys/GameSettings/RP7P52.ini index f134514dc2..0cf53a3d30 100644 --- a/Data/User/GameConfig/RP7P52.ini +++ b/Data/Sys/GameSettings/RP7P52.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 2 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RPBE01.ini b/Data/Sys/GameSettings/RPBE01.ini similarity index 100% rename from Data/User/GameConfig/RPBE01.ini rename to Data/Sys/GameSettings/RPBE01.ini diff --git a/Data/User/GameConfig/RPBJ01.ini b/Data/Sys/GameSettings/RPBJ01.ini similarity index 100% rename from Data/User/GameConfig/RPBJ01.ini rename to Data/Sys/GameSettings/RPBJ01.ini diff --git a/Data/User/GameConfig/RPBP01.ini b/Data/Sys/GameSettings/RPBP01.ini similarity index 100% rename from Data/User/GameConfig/RPBP01.ini rename to Data/Sys/GameSettings/RPBP01.ini diff --git a/Data/User/GameConfig/RPDPGN.ini b/Data/Sys/GameSettings/RPDPGN.ini similarity index 100% rename from Data/User/GameConfig/RPDPGN.ini rename to Data/Sys/GameSettings/RPDPGN.ini diff --git a/Data/User/GameConfig/RPJE7U.ini b/Data/Sys/GameSettings/RPJE7U.ini similarity index 100% rename from Data/User/GameConfig/RPJE7U.ini rename to Data/Sys/GameSettings/RPJE7U.ini diff --git a/Data/User/GameConfig/RPJJ99.ini b/Data/Sys/GameSettings/RPJJ99.ini similarity index 100% rename from Data/User/GameConfig/RPJJ99.ini rename to Data/Sys/GameSettings/RPJJ99.ini diff --git a/Data/User/GameConfig/RPPE41.ini b/Data/Sys/GameSettings/RPPE41.ini similarity index 100% rename from Data/User/GameConfig/RPPE41.ini rename to Data/Sys/GameSettings/RPPE41.ini diff --git a/Data/User/GameConfig/RPWZ41.ini b/Data/Sys/GameSettings/RPWZ41.ini similarity index 100% rename from Data/User/GameConfig/RPWZ41.ini rename to Data/Sys/GameSettings/RPWZ41.ini diff --git a/Data/User/GameConfig/RPYP9B.ini b/Data/Sys/GameSettings/RPYP9B.ini similarity index 100% rename from Data/User/GameConfig/RPYP9B.ini rename to Data/Sys/GameSettings/RPYP9B.ini diff --git a/Data/User/GameConfig/RQ6EJJ.ini b/Data/Sys/GameSettings/RQ6EJJ.ini similarity index 100% rename from Data/User/GameConfig/RQ6EJJ.ini rename to Data/Sys/GameSettings/RQ6EJJ.ini diff --git a/Data/User/GameConfig/RQ6PKM.ini b/Data/Sys/GameSettings/RQ6PKM.ini similarity index 100% rename from Data/User/GameConfig/RQ6PKM.ini rename to Data/Sys/GameSettings/RQ6PKM.ini diff --git a/Data/User/GameConfig/RQ6XKM.ini b/Data/Sys/GameSettings/RQ6XKM.ini similarity index 100% rename from Data/User/GameConfig/RQ6XKM.ini rename to Data/Sys/GameSettings/RQ6XKM.ini diff --git a/Data/User/GameConfig/RQBENR.ini b/Data/Sys/GameSettings/RQBENR.ini similarity index 100% rename from Data/User/GameConfig/RQBENR.ini rename to Data/Sys/GameSettings/RQBENR.ini diff --git a/Data/User/GameConfig/RQLE64.ini b/Data/Sys/GameSettings/RQLE64.ini similarity index 100% rename from Data/User/GameConfig/RQLE64.ini rename to Data/Sys/GameSettings/RQLE64.ini diff --git a/Data/User/GameConfig/RQOP69.ini b/Data/Sys/GameSettings/RQOP69.ini similarity index 100% rename from Data/User/GameConfig/RQOP69.ini rename to Data/Sys/GameSettings/RQOP69.ini diff --git a/Data/User/GameConfig/RQREXJ.ini b/Data/Sys/GameSettings/RQREXJ.ini similarity index 100% rename from Data/User/GameConfig/RQREXJ.ini rename to Data/Sys/GameSettings/RQREXJ.ini diff --git a/Data/User/GameConfig/RQRJAF.ini b/Data/Sys/GameSettings/RQRJAF.ini similarity index 100% rename from Data/User/GameConfig/RQRJAF.ini rename to Data/Sys/GameSettings/RQRJAF.ini diff --git a/Data/User/GameConfig/RQRPAF.ini b/Data/Sys/GameSettings/RQRPAF.ini similarity index 100% rename from Data/User/GameConfig/RQRPAF.ini rename to Data/Sys/GameSettings/RQRPAF.ini diff --git a/Data/User/GameConfig/RR2PUG.ini b/Data/Sys/GameSettings/RR2PUG.ini similarity index 100% rename from Data/User/GameConfig/RR2PUG.ini rename to Data/Sys/GameSettings/RR2PUG.ini diff --git a/Data/User/GameConfig/RR5P70.ini b/Data/Sys/GameSettings/RR5P70.ini similarity index 100% rename from Data/User/GameConfig/RR5P70.ini rename to Data/Sys/GameSettings/RR5P70.ini diff --git a/Data/User/GameConfig/RRAXUG.ini b/Data/Sys/GameSettings/RRAXUG.ini similarity index 100% rename from Data/User/GameConfig/RRAXUG.ini rename to Data/Sys/GameSettings/RRAXUG.ini diff --git a/Data/User/GameConfig/RRBE41.ini b/Data/Sys/GameSettings/RRBE41.ini similarity index 100% rename from Data/User/GameConfig/RRBE41.ini rename to Data/Sys/GameSettings/RRBE41.ini diff --git a/Data/User/GameConfig/RRBJ41.ini b/Data/Sys/GameSettings/RRBJ41.ini similarity index 100% rename from Data/User/GameConfig/RRBJ41.ini rename to Data/Sys/GameSettings/RRBJ41.ini diff --git a/Data/User/GameConfig/RRBP41.ini b/Data/Sys/GameSettings/RRBP41.ini similarity index 100% rename from Data/User/GameConfig/RRBP41.ini rename to Data/Sys/GameSettings/RRBP41.ini diff --git a/Data/User/GameConfig/RRKE70.ini b/Data/Sys/GameSettings/RRKE70.ini similarity index 100% rename from Data/User/GameConfig/RRKE70.ini rename to Data/Sys/GameSettings/RRKE70.ini diff --git a/Data/User/GameConfig/RRKP70.ini b/Data/Sys/GameSettings/RRKP70.ini similarity index 100% rename from Data/User/GameConfig/RRKP70.ini rename to Data/Sys/GameSettings/RRKP70.ini diff --git a/Data/User/GameConfig/RRMX69.ini b/Data/Sys/GameSettings/RRMX69.ini similarity index 100% rename from Data/User/GameConfig/RRMX69.ini rename to Data/Sys/GameSettings/RRMX69.ini diff --git a/Data/User/GameConfig/RRXXUG.ini b/Data/Sys/GameSettings/RRXXUG.ini similarity index 100% rename from Data/User/GameConfig/RRXXUG.ini rename to Data/Sys/GameSettings/RRXXUG.ini diff --git a/Data/User/GameConfig/RRYPHY.ini b/Data/Sys/GameSettings/RRYPHY.ini similarity index 100% rename from Data/User/GameConfig/RRYPHY.ini rename to Data/Sys/GameSettings/RRYPHY.ini diff --git a/Data/User/GameConfig/RRZEGY.ini b/Data/Sys/GameSettings/RRZEGY.ini similarity index 100% rename from Data/User/GameConfig/RRZEGY.ini rename to Data/Sys/GameSettings/RRZEGY.ini diff --git a/Data/User/GameConfig/RRZPGY.ini b/Data/Sys/GameSettings/RRZPGY.ini similarity index 100% rename from Data/User/GameConfig/RRZPGY.ini rename to Data/Sys/GameSettings/RRZPGY.ini diff --git a/Data/User/GameConfig/RS5EC8.ini b/Data/Sys/GameSettings/RS5EC8.ini similarity index 100% rename from Data/User/GameConfig/RS5EC8.ini rename to Data/Sys/GameSettings/RS5EC8.ini diff --git a/Data/User/GameConfig/RS5JC8.ini b/Data/Sys/GameSettings/RS5JC8.ini similarity index 100% rename from Data/User/GameConfig/RS5JC8.ini rename to Data/Sys/GameSettings/RS5JC8.ini diff --git a/Data/User/GameConfig/RS5PC8.ini b/Data/Sys/GameSettings/RS5PC8.ini similarity index 100% rename from Data/User/GameConfig/RS5PC8.ini rename to Data/Sys/GameSettings/RS5PC8.ini diff --git a/Data/User/GameConfig/RS8J8N.ini b/Data/Sys/GameSettings/RS8J8N.ini similarity index 95% rename from Data/User/GameConfig/RS8J8N.ini rename to Data/Sys/GameSettings/RS8J8N.ini index 526b238dfb..0f0712d348 100644 --- a/Data/User/GameConfig/RS8J8N.ini +++ b/Data/Sys/GameSettings/RS8J8N.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RS9E8P.ini b/Data/Sys/GameSettings/RS9E8P.ini similarity index 100% rename from Data/User/GameConfig/RS9E8P.ini rename to Data/Sys/GameSettings/RS9E8P.ini diff --git a/Data/User/GameConfig/RS9P8P.ini b/Data/Sys/GameSettings/RS9P8P.ini similarity index 100% rename from Data/User/GameConfig/RS9P8P.ini rename to Data/Sys/GameSettings/RS9P8P.ini diff --git a/Data/User/GameConfig/RSBE01.ini b/Data/Sys/GameSettings/RSBE01.ini similarity index 100% rename from Data/User/GameConfig/RSBE01.ini rename to Data/Sys/GameSettings/RSBE01.ini diff --git a/Data/User/GameConfig/RSBJ01.ini b/Data/Sys/GameSettings/RSBJ01.ini similarity index 100% rename from Data/User/GameConfig/RSBJ01.ini rename to Data/Sys/GameSettings/RSBJ01.ini diff --git a/Data/User/GameConfig/RSBP01.ini b/Data/Sys/GameSettings/RSBP01.ini similarity index 100% rename from Data/User/GameConfig/RSBP01.ini rename to Data/Sys/GameSettings/RSBP01.ini diff --git a/Data/User/GameConfig/RSFE7U.ini b/Data/Sys/GameSettings/RSFE7U.ini similarity index 100% rename from Data/User/GameConfig/RSFE7U.ini rename to Data/Sys/GameSettings/RSFE7U.ini diff --git a/Data/User/GameConfig/RSFJ99.ini b/Data/Sys/GameSettings/RSFJ99.ini similarity index 100% rename from Data/User/GameConfig/RSFJ99.ini rename to Data/Sys/GameSettings/RSFJ99.ini diff --git a/Data/User/GameConfig/RSFP99.ini b/Data/Sys/GameSettings/RSFP99.ini similarity index 100% rename from Data/User/GameConfig/RSFP99.ini rename to Data/Sys/GameSettings/RSFP99.ini diff --git a/Data/User/GameConfig/RSIE69.ini b/Data/Sys/GameSettings/RSIE69.ini similarity index 100% rename from Data/User/GameConfig/RSIE69.ini rename to Data/Sys/GameSettings/RSIE69.ini diff --git a/Data/User/GameConfig/RSIJ13.ini b/Data/Sys/GameSettings/RSIJ13.ini similarity index 100% rename from Data/User/GameConfig/RSIJ13.ini rename to Data/Sys/GameSettings/RSIJ13.ini diff --git a/Data/User/GameConfig/RSIP69.ini b/Data/Sys/GameSettings/RSIP69.ini similarity index 100% rename from Data/User/GameConfig/RSIP69.ini rename to Data/Sys/GameSettings/RSIP69.ini diff --git a/Data/User/GameConfig/RSLEAF.ini b/Data/Sys/GameSettings/RSLEAF.ini similarity index 100% rename from Data/User/GameConfig/RSLEAF.ini rename to Data/Sys/GameSettings/RSLEAF.ini diff --git a/Data/User/GameConfig/RSLJAF.ini b/Data/Sys/GameSettings/RSLJAF.ini similarity index 100% rename from Data/User/GameConfig/RSLJAF.ini rename to Data/Sys/GameSettings/RSLJAF.ini diff --git a/Data/User/GameConfig/RSLKAF.ini b/Data/Sys/GameSettings/RSLKAF.ini similarity index 100% rename from Data/User/GameConfig/RSLKAF.ini rename to Data/Sys/GameSettings/RSLKAF.ini diff --git a/Data/User/GameConfig/RSLPAF.ini b/Data/Sys/GameSettings/RSLPAF.ini similarity index 100% rename from Data/User/GameConfig/RSLPAF.ini rename to Data/Sys/GameSettings/RSLPAF.ini diff --git a/Data/User/GameConfig/RSME8P.ini b/Data/Sys/GameSettings/RSME8P.ini similarity index 91% rename from Data/User/GameConfig/RSME8P.ini rename to Data/Sys/GameSettings/RSME8P.ini index 4c64924d85..9d09dbf381 100644 --- a/Data/User/GameConfig/RSME8P.ini +++ b/Data/Sys/GameSettings/RSME8P.ini @@ -2,11 +2,12 @@ [Core] # Values set here will override the main dolphin settings. -EnableFPRF=True +EnableFPRF = True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 3 +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/GXGE08.ini b/Data/Sys/GameSettings/RSMJ8P.ini similarity index 85% rename from Data/User/GameConfig/GXGE08.ini rename to Data/Sys/GameSettings/RSMJ8P.ini index dd56ca6c1a..8b0a49e473 100644 --- a/Data/User/GameConfig/GXGE08.ini +++ b/Data/Sys/GameSettings/RSMJ8P.ini @@ -1,7 +1,8 @@ -# GXGE08 - MEGAMAN X COLLECTION +# RSMJ8P - SUPER MONKEY BALL BANANA BLITZ [Core] # Values set here will override the main dolphin settings. +EnableFPRF = True [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. diff --git a/Data/User/GameConfig/RSMP8P.ini b/Data/Sys/GameSettings/RSMP8P.ini similarity index 100% rename from Data/User/GameConfig/RSMP8P.ini rename to Data/Sys/GameSettings/RSMP8P.ini diff --git a/Data/User/GameConfig/RSPE01.ini b/Data/Sys/GameSettings/RSPE01.ini similarity index 100% rename from Data/User/GameConfig/RSPE01.ini rename to Data/Sys/GameSettings/RSPE01.ini diff --git a/Data/User/GameConfig/WPCE01.ini b/Data/Sys/GameSettings/RSPJ01.ini similarity index 85% rename from Data/User/GameConfig/WPCE01.ini rename to Data/Sys/GameSettings/RSPJ01.ini index 142c51d931..c365686121 100644 --- a/Data/User/GameConfig/WPCE01.ini +++ b/Data/Sys/GameSettings/RSPJ01.ini @@ -1,11 +1,11 @@ -# WPCE01 - Doc's Punch-Out!! +# RSPJ01 - SPORTS PACK for REVOLUTION [Core] # Values set here will override the main dolphin settings. [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 5 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RSPP01.ini b/Data/Sys/GameSettings/RSPP01.ini similarity index 100% rename from Data/User/GameConfig/RSPP01.ini rename to Data/Sys/GameSettings/RSPP01.ini diff --git a/Data/User/GameConfig/RSRE8P.ini b/Data/Sys/GameSettings/RSRE8P.ini similarity index 100% rename from Data/User/GameConfig/RSRE8P.ini rename to Data/Sys/GameSettings/RSRE8P.ini diff --git a/Data/User/GameConfig/RSRP8P.ini b/Data/Sys/GameSettings/RSRP8P.ini similarity index 100% rename from Data/User/GameConfig/RSRP8P.ini rename to Data/Sys/GameSettings/RSRP8P.ini diff --git a/Data/User/GameConfig/RSTP64.ini b/Data/Sys/GameSettings/RSTP64.ini similarity index 100% rename from Data/User/GameConfig/RSTP64.ini rename to Data/Sys/GameSettings/RSTP64.ini diff --git a/Data/User/GameConfig/RSUP41.ini b/Data/Sys/GameSettings/RSUP41.ini similarity index 100% rename from Data/User/GameConfig/RSUP41.ini rename to Data/Sys/GameSettings/RSUP41.ini diff --git a/Data/User/GameConfig/RSVE8P.ini b/Data/Sys/GameSettings/RSVE8P.ini similarity index 79% rename from Data/User/GameConfig/RSVE8P.ini rename to Data/Sys/GameSettings/RSVE8P.ini index f6bfeb9758..c16e3d8e99 100644 --- a/Data/User/GameConfig/RSVE8P.ini +++ b/Data/Sys/GameSettings/RSVE8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3d 11 or Opengl backends. Direct 3d9 needs "Sonic and the Black Knight" projection hack (r7379) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/RSVJ8P.ini b/Data/Sys/GameSettings/RSVJ8P.ini similarity index 76% rename from Data/User/GameConfig/RSVJ8P.ini rename to Data/Sys/GameSettings/RSVJ8P.ini index 4afaf675b7..93f8a0ecd0 100644 --- a/Data/User/GameConfig/RSVJ8P.ini +++ b/Data/Sys/GameSettings/RSVJ8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3d 11 or Opengl backends. Direct 3d9 needs "Sonic and the Black Knight" projection hack (r7379) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/RSVP8P.ini b/Data/Sys/GameSettings/RSVP8P.ini similarity index 75% rename from Data/User/GameConfig/RSVP8P.ini rename to Data/Sys/GameSettings/RSVP8P.ini index 93526470ac..6ecae0d662 100644 --- a/Data/User/GameConfig/RSVP8P.ini +++ b/Data/Sys/GameSettings/RSVP8P.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Use Direct3d 11 or Opengl backends. Direct 3d9 needs "Sonic and the Black Knight" projection hack (r7379) +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/RSWP08.ini b/Data/Sys/GameSettings/RSWP08.ini similarity index 100% rename from Data/User/GameConfig/RSWP08.ini rename to Data/Sys/GameSettings/RSWP08.ini diff --git a/Data/User/GameConfig/RSXE69.ini b/Data/Sys/GameSettings/RSXE69.ini similarity index 100% rename from Data/User/GameConfig/RSXE69.ini rename to Data/Sys/GameSettings/RSXE69.ini diff --git a/Data/User/GameConfig/RSXJ13.ini b/Data/Sys/GameSettings/RSXJ13.ini similarity index 100% rename from Data/User/GameConfig/RSXJ13.ini rename to Data/Sys/GameSettings/RSXJ13.ini diff --git a/Data/User/GameConfig/RSXK69.ini b/Data/Sys/GameSettings/RSXK69.ini similarity index 100% rename from Data/User/GameConfig/RSXK69.ini rename to Data/Sys/GameSettings/RSXK69.ini diff --git a/Data/User/GameConfig/RSXP69.ini b/Data/Sys/GameSettings/RSXP69.ini similarity index 100% rename from Data/User/GameConfig/RSXP69.ini rename to Data/Sys/GameSettings/RSXP69.ini diff --git a/Data/User/GameConfig/RSZPGT.ini b/Data/Sys/GameSettings/RSZPGT.ini similarity index 100% rename from Data/User/GameConfig/RSZPGT.ini rename to Data/Sys/GameSettings/RSZPGT.ini diff --git a/Data/Sys/GameSettings/RT3E54.ini b/Data/Sys/GameSettings/RT3E54.ini new file mode 100644 index 0000000000..8311ae7234 --- /dev/null +++ b/Data/Sys/GameSettings/RT3E54.ini @@ -0,0 +1,17 @@ +# RT3E54 - Rockstar Games presents Table Tennis +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/RT3JEL.ini b/Data/Sys/GameSettings/RT3JEL.ini new file mode 100644 index 0000000000..63007e740a --- /dev/null +++ b/Data/Sys/GameSettings/RT3JEL.ini @@ -0,0 +1,17 @@ +# RT3JEL - Rockstar Games presents Table Tennis +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/RT3P54.ini b/Data/Sys/GameSettings/RT3P54.ini new file mode 100644 index 0000000000..9a4a5c9402 --- /dev/null +++ b/Data/Sys/GameSettings/RT3P54.ini @@ -0,0 +1,17 @@ +# RT3P54 - Rockstar Games presents Table Tennis +[Core] +[EmuState] +EmulationStateId = 3 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/RT4EAF.ini b/Data/Sys/GameSettings/RT4EAF.ini similarity index 100% rename from Data/User/GameConfig/RT4EAF.ini rename to Data/Sys/GameSettings/RT4EAF.ini diff --git a/Data/User/GameConfig/RT4JAF.ini b/Data/Sys/GameSettings/RT4JAF.ini similarity index 100% rename from Data/User/GameConfig/RT4JAF.ini rename to Data/Sys/GameSettings/RT4JAF.ini diff --git a/Data/User/GameConfig/RT4PAF.ini b/Data/Sys/GameSettings/RT4PAF.ini similarity index 100% rename from Data/User/GameConfig/RT4PAF.ini rename to Data/Sys/GameSettings/RT4PAF.ini diff --git a/Data/User/GameConfig/RT5E8P.ini b/Data/Sys/GameSettings/RT5E8P.ini similarity index 100% rename from Data/User/GameConfig/RT5E8P.ini rename to Data/Sys/GameSettings/RT5E8P.ini diff --git a/Data/User/GameConfig/RT5P8P.ini b/Data/Sys/GameSettings/RT5P8P.ini similarity index 100% rename from Data/User/GameConfig/RT5P8P.ini rename to Data/Sys/GameSettings/RT5P8P.ini diff --git a/Data/User/GameConfig/RT9E52.ini b/Data/Sys/GameSettings/RT9E52.ini similarity index 100% rename from Data/User/GameConfig/RT9E52.ini rename to Data/Sys/GameSettings/RT9E52.ini diff --git a/Data/User/GameConfig/RTBP52.ini b/Data/Sys/GameSettings/RTBP52.ini similarity index 100% rename from Data/User/GameConfig/RTBP52.ini rename to Data/Sys/GameSettings/RTBP52.ini diff --git a/Data/User/GameConfig/RTCP41.ini b/Data/Sys/GameSettings/RTCP41.ini similarity index 100% rename from Data/User/GameConfig/RTCP41.ini rename to Data/Sys/GameSettings/RTCP41.ini diff --git a/Data/User/GameConfig/RTHE52.ini b/Data/Sys/GameSettings/RTHE52.ini similarity index 100% rename from Data/User/GameConfig/RTHE52.ini rename to Data/Sys/GameSettings/RTHE52.ini diff --git a/Data/User/GameConfig/RTME41.ini b/Data/Sys/GameSettings/RTME41.ini similarity index 100% rename from Data/User/GameConfig/RTME41.ini rename to Data/Sys/GameSettings/RTME41.ini diff --git a/Data/User/GameConfig/RTMP41.ini b/Data/Sys/GameSettings/RTMP41.ini similarity index 100% rename from Data/User/GameConfig/RTMP41.ini rename to Data/Sys/GameSettings/RTMP41.ini diff --git a/Data/User/GameConfig/RTNE41.ini b/Data/Sys/GameSettings/RTNE41.ini similarity index 100% rename from Data/User/GameConfig/RTNE41.ini rename to Data/Sys/GameSettings/RTNE41.ini diff --git a/Data/User/GameConfig/RTNJCQ.ini b/Data/Sys/GameSettings/RTNJCQ.ini similarity index 100% rename from Data/User/GameConfig/RTNJCQ.ini rename to Data/Sys/GameSettings/RTNJCQ.ini diff --git a/Data/User/GameConfig/RTNP41.ini b/Data/Sys/GameSettings/RTNP41.ini similarity index 100% rename from Data/User/GameConfig/RTNP41.ini rename to Data/Sys/GameSettings/RTNP41.ini diff --git a/Data/User/GameConfig/RTZE08.ini b/Data/Sys/GameSettings/RTZE08.ini similarity index 100% rename from Data/User/GameConfig/RTZE08.ini rename to Data/Sys/GameSettings/RTZE08.ini diff --git a/Data/User/GameConfig/RTZJ08.ini b/Data/Sys/GameSettings/RTZJ08.ini similarity index 100% rename from Data/User/GameConfig/RTZJ08.ini rename to Data/Sys/GameSettings/RTZJ08.ini diff --git a/Data/User/GameConfig/RTZK08.ini b/Data/Sys/GameSettings/RTZK08.ini similarity index 100% rename from Data/User/GameConfig/RTZK08.ini rename to Data/Sys/GameSettings/RTZK08.ini diff --git a/Data/User/GameConfig/RTZP08.ini b/Data/Sys/GameSettings/RTZP08.ini similarity index 100% rename from Data/User/GameConfig/RTZP08.ini rename to Data/Sys/GameSettings/RTZP08.ini diff --git a/Data/User/GameConfig/RUCXRT.ini b/Data/Sys/GameSettings/RUCXRT.ini similarity index 100% rename from Data/User/GameConfig/RUCXRT.ini rename to Data/Sys/GameSettings/RUCXRT.ini diff --git a/Data/User/GameConfig/RUUE01.ini b/Data/Sys/GameSettings/RUUE01.ini similarity index 61% rename from Data/User/GameConfig/RUUE01.ini rename to Data/Sys/GameSettings/RUUE01.ini index 1e127bd511..1625ea981e 100644 --- a/Data/User/GameConfig/RUUE01.ini +++ b/Data/Sys/GameSettings/RUUE01.ini @@ -1,19 +1,21 @@ # RUUE01 - Animal Crossing Wii - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/RUUJ01.ini b/Data/Sys/GameSettings/RUUJ01.ini new file mode 100644 index 0000000000..294412f3d2 --- /dev/null +++ b/Data/Sys/GameSettings/RUUJ01.ini @@ -0,0 +1,21 @@ +# RUUJ01 - Animal Crossing Wii +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/RUUK01.ini b/Data/Sys/GameSettings/RUUK01.ini new file mode 100644 index 0000000000..b12b52cfd2 --- /dev/null +++ b/Data/Sys/GameSettings/RUUK01.ini @@ -0,0 +1,21 @@ +# RUUK01 - Animal Crossing Wii +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/RUUP01.ini b/Data/Sys/GameSettings/RUUP01.ini new file mode 100644 index 0000000000..b1c4cb4cde --- /dev/null +++ b/Data/Sys/GameSettings/RUUP01.ini @@ -0,0 +1,21 @@ +# RUUP01 - Animal Crossing Wii +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/RUYE41.ini b/Data/Sys/GameSettings/RUYE41.ini similarity index 100% rename from Data/User/GameConfig/RUYE41.ini rename to Data/Sys/GameSettings/RUYE41.ini diff --git a/Data/User/GameConfig/RVKEXJ.ini b/Data/Sys/GameSettings/RVKEXJ.ini similarity index 100% rename from Data/User/GameConfig/RVKEXJ.ini rename to Data/Sys/GameSettings/RVKEXJ.ini diff --git a/Data/User/GameConfig/RVKP99.ini b/Data/Sys/GameSettings/RVKP99.ini similarity index 100% rename from Data/User/GameConfig/RVKP99.ini rename to Data/Sys/GameSettings/RVKP99.ini diff --git a/Data/User/GameConfig/RVOPPL.ini b/Data/Sys/GameSettings/RVOPPL.ini similarity index 100% rename from Data/User/GameConfig/RVOPPL.ini rename to Data/Sys/GameSettings/RVOPPL.ini diff --git a/Data/User/GameConfig/RVQP41.ini b/Data/Sys/GameSettings/RVQP41.ini similarity index 100% rename from Data/User/GameConfig/RVQP41.ini rename to Data/Sys/GameSettings/RVQP41.ini diff --git a/Data/User/GameConfig/RVSE69.ini b/Data/Sys/GameSettings/RVSE69.ini similarity index 100% rename from Data/User/GameConfig/RVSE69.ini rename to Data/Sys/GameSettings/RVSE69.ini diff --git a/Data/User/GameConfig/RVSP69.ini b/Data/Sys/GameSettings/RVSP69.ini similarity index 100% rename from Data/User/GameConfig/RVSP69.ini rename to Data/Sys/GameSettings/RVSP69.ini diff --git a/Data/User/GameConfig/RVUP8P.ini b/Data/Sys/GameSettings/RVUP8P.ini similarity index 100% rename from Data/User/GameConfig/RVUP8P.ini rename to Data/Sys/GameSettings/RVUP8P.ini diff --git a/Data/User/GameConfig/RVVP78.ini b/Data/Sys/GameSettings/RVVP78.ini similarity index 100% rename from Data/User/GameConfig/RVVP78.ini rename to Data/Sys/GameSettings/RVVP78.ini diff --git a/Data/User/GameConfig/RVZP52.ini b/Data/Sys/GameSettings/RVZP52.ini similarity index 100% rename from Data/User/GameConfig/RVZP52.ini rename to Data/Sys/GameSettings/RVZP52.ini diff --git a/Data/User/GameConfig/RW9X78.ini b/Data/Sys/GameSettings/RW9X78.ini similarity index 100% rename from Data/User/GameConfig/RW9X78.ini rename to Data/Sys/GameSettings/RW9X78.ini diff --git a/Data/User/GameConfig/RWBXUG.ini b/Data/Sys/GameSettings/RWBXUG.ini similarity index 100% rename from Data/User/GameConfig/RWBXUG.ini rename to Data/Sys/GameSettings/RWBXUG.ini diff --git a/Data/User/GameConfig/RWEPA4.ini b/Data/Sys/GameSettings/RWEPA4.ini similarity index 100% rename from Data/User/GameConfig/RWEPA4.ini rename to Data/Sys/GameSettings/RWEPA4.ini diff --git a/Data/User/GameConfig/RWLE01.ini b/Data/Sys/GameSettings/RWLE01.ini similarity index 100% rename from Data/User/GameConfig/RWLE01.ini rename to Data/Sys/GameSettings/RWLE01.ini diff --git a/Data/User/GameConfig/RWRE4F.ini b/Data/Sys/GameSettings/RWRE4F.ini similarity index 100% rename from Data/User/GameConfig/RWRE4F.ini rename to Data/Sys/GameSettings/RWRE4F.ini diff --git a/Data/User/GameConfig/RWRP4F.ini b/Data/Sys/GameSettings/RWRP4F.ini similarity index 100% rename from Data/User/GameConfig/RWRP4F.ini rename to Data/Sys/GameSettings/RWRP4F.ini diff --git a/Data/User/GameConfig/RWSE8P.ini b/Data/Sys/GameSettings/RWSE8P.ini similarity index 100% rename from Data/User/GameConfig/RWSE8P.ini rename to Data/Sys/GameSettings/RWSE8P.ini diff --git a/Data/User/GameConfig/RWSJ01.ini b/Data/Sys/GameSettings/RWSJ01.ini similarity index 100% rename from Data/User/GameConfig/RWSJ01.ini rename to Data/Sys/GameSettings/RWSJ01.ini diff --git a/Data/User/GameConfig/RWSK01.ini b/Data/Sys/GameSettings/RWSK01.ini similarity index 100% rename from Data/User/GameConfig/RWSK01.ini rename to Data/Sys/GameSettings/RWSK01.ini diff --git a/Data/User/GameConfig/RWSP8P.ini b/Data/Sys/GameSettings/RWSP8P.ini similarity index 100% rename from Data/User/GameConfig/RWSP8P.ini rename to Data/Sys/GameSettings/RWSP8P.ini diff --git a/Data/User/GameConfig/RWUX52.ini b/Data/Sys/GameSettings/RWUX52.ini similarity index 100% rename from Data/User/GameConfig/RWUX52.ini rename to Data/Sys/GameSettings/RWUX52.ini diff --git a/Data/User/GameConfig/RX3E01.ini b/Data/Sys/GameSettings/RX3E01.ini similarity index 100% rename from Data/User/GameConfig/RX3E01.ini rename to Data/Sys/GameSettings/RX3E01.ini diff --git a/Data/User/GameConfig/RX9P69.ini b/Data/Sys/GameSettings/RX9P69.ini similarity index 100% rename from Data/User/GameConfig/RX9P69.ini rename to Data/Sys/GameSettings/RX9P69.ini diff --git a/Data/User/GameConfig/RX9Y69.ini b/Data/Sys/GameSettings/RX9Y69.ini similarity index 100% rename from Data/User/GameConfig/RX9Y69.ini rename to Data/Sys/GameSettings/RX9Y69.ini diff --git a/Data/User/GameConfig/RXXE4Q.ini b/Data/Sys/GameSettings/RXXE4Q.ini similarity index 100% rename from Data/User/GameConfig/RXXE4Q.ini rename to Data/Sys/GameSettings/RXXE4Q.ini diff --git a/Data/User/GameConfig/RXXJ4Q.ini b/Data/Sys/GameSettings/RXXJ4Q.ini similarity index 100% rename from Data/User/GameConfig/RXXJ4Q.ini rename to Data/Sys/GameSettings/RXXJ4Q.ini diff --git a/Data/User/GameConfig/RXXP4Q.ini b/Data/Sys/GameSettings/RXXP4Q.ini similarity index 100% rename from Data/User/GameConfig/RXXP4Q.ini rename to Data/Sys/GameSettings/RXXP4Q.ini diff --git a/Data/User/GameConfig/RYBE69.ini b/Data/Sys/GameSettings/RYBE69.ini similarity index 94% rename from Data/User/GameConfig/RYBE69.ini rename to Data/Sys/GameSettings/RYBE69.ini index 0bfb0965a9..62fced03d9 100644 --- a/Data/User/GameConfig/RYBE69.ini +++ b/Data/Sys/GameSettings/RYBE69.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/RYOEA4.ini b/Data/Sys/GameSettings/RYOEA4.ini similarity index 100% rename from Data/User/GameConfig/RYOEA4.ini rename to Data/Sys/GameSettings/RYOEA4.ini diff --git a/Data/User/GameConfig/RYQP69.ini b/Data/Sys/GameSettings/RYQP69.ini similarity index 100% rename from Data/User/GameConfig/RYQP69.ini rename to Data/Sys/GameSettings/RYQP69.ini diff --git a/Data/User/GameConfig/RYXP7J.ini b/Data/Sys/GameSettings/RYXP7J.ini similarity index 100% rename from Data/User/GameConfig/RYXP7J.ini rename to Data/Sys/GameSettings/RYXP7J.ini diff --git a/Data/User/GameConfig/RZ9PG9.ini b/Data/Sys/GameSettings/RZ9PG9.ini similarity index 100% rename from Data/User/GameConfig/RZ9PG9.ini rename to Data/Sys/GameSettings/RZ9PG9.ini diff --git a/Data/User/GameConfig/RZDE01.ini b/Data/Sys/GameSettings/RZDE01.ini similarity index 96% rename from Data/User/GameConfig/RZDE01.ini rename to Data/Sys/GameSettings/RZDE01.ini index bfab28fbf6..f4648ff55a 100644 --- a/Data/User/GameConfig/RZDE01.ini +++ b/Data/Sys/GameSettings/RZDE01.ini @@ -27,7 +27,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/RZDJ01.ini b/Data/Sys/GameSettings/RZDJ01.ini similarity index 96% rename from Data/User/GameConfig/RZDJ01.ini rename to Data/Sys/GameSettings/RZDJ01.ini index 992de703ba..02ddc95f30 100644 --- a/Data/User/GameConfig/RZDJ01.ini +++ b/Data/Sys/GameSettings/RZDJ01.ini @@ -27,7 +27,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/RZDK01.ini b/Data/Sys/GameSettings/RZDK01.ini similarity index 96% rename from Data/User/GameConfig/RZDK01.ini rename to Data/Sys/GameSettings/RZDK01.ini index 21f5560c64..ffacaf28d4 100644 --- a/Data/User/GameConfig/RZDK01.ini +++ b/Data/Sys/GameSettings/RZDK01.ini @@ -27,7 +27,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/RZDP01.ini b/Data/Sys/GameSettings/RZDP01.ini similarity index 96% rename from Data/User/GameConfig/RZDP01.ini rename to Data/Sys/GameSettings/RZDP01.ini index d6f76dc587..23c141d6ef 100644 --- a/Data/User/GameConfig/RZDP01.ini +++ b/Data/Sys/GameSettings/RZDP01.ini @@ -27,7 +27,6 @@ PH_ZNear = PH_ZFar = [Video_Settings] -SafeTextureCache = False SafeTextureCacheColorSamples = 512 [Video_Hacks] diff --git a/Data/User/GameConfig/RZJD69.ini b/Data/Sys/GameSettings/RZJD69.ini similarity index 100% rename from Data/User/GameConfig/RZJD69.ini rename to Data/Sys/GameSettings/RZJD69.ini diff --git a/Data/User/GameConfig/RZJE69.ini b/Data/Sys/GameSettings/RZJE69.ini similarity index 100% rename from Data/User/GameConfig/RZJE69.ini rename to Data/Sys/GameSettings/RZJE69.ini diff --git a/Data/User/GameConfig/RZJJ13.ini b/Data/Sys/GameSettings/RZJJ13.ini similarity index 100% rename from Data/User/GameConfig/RZJJ13.ini rename to Data/Sys/GameSettings/RZJJ13.ini diff --git a/Data/User/GameConfig/RZJP69.ini b/Data/Sys/GameSettings/RZJP69.ini similarity index 100% rename from Data/User/GameConfig/RZJP69.ini rename to Data/Sys/GameSettings/RZJP69.ini diff --git a/Data/User/GameConfig/RZPE01.ini b/Data/Sys/GameSettings/RZPE01.ini similarity index 100% rename from Data/User/GameConfig/RZPE01.ini rename to Data/Sys/GameSettings/RZPE01.ini diff --git a/Data/User/GameConfig/NABE01.ini b/Data/Sys/GameSettings/RZPJ01.ini similarity index 86% rename from Data/User/GameConfig/NABE01.ini rename to Data/Sys/GameSettings/RZPJ01.ini index a4ae6a39c0..26fd150008 100644 --- a/Data/User/GameConfig/NABE01.ini +++ b/Data/Sys/GameSettings/RZPJ01.ini @@ -1,12 +1,12 @@ -# NABE01 - Mario Kart 64 +# RZPJ01 - LINKS CROSSBOW TRAINING [Core] # Values set here will override the main dolphin settings. [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 EmulationIssues = -EmulationStateId = 4 [OnLoad] # Add memory patches to be loaded once on boot here. @@ -18,6 +18,5 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -Hack = -1 ProjectionHack = 0 diff --git a/Data/User/GameConfig/RZTE01.ini b/Data/Sys/GameSettings/RZTE01.ini similarity index 77% rename from Data/User/GameConfig/RZTE01.ini rename to Data/Sys/GameSettings/RZTE01.ini index c9f914d7cb..195c944cf4 100644 --- a/Data/User/GameConfig/RZTE01.ini +++ b/Data/Sys/GameSettings/RZTE01.ini @@ -1,27 +1,20 @@ # RZTE01 - Wii Sports Resort - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Needs real wiimote and motion plus. - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RZTJ01.ini b/Data/Sys/GameSettings/RZTJ01.ini similarity index 77% rename from Data/User/GameConfig/RZTJ01.ini rename to Data/Sys/GameSettings/RZTJ01.ini index 20a6eec5d6..5ac0a14309 100644 --- a/Data/User/GameConfig/RZTJ01.ini +++ b/Data/Sys/GameSettings/RZTJ01.ini @@ -1,27 +1,20 @@ # RZTJ01 - Wii Sports Resort - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Needs real wiimote and motion plus. - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RZTK01.ini b/Data/Sys/GameSettings/RZTK01.ini similarity index 77% rename from Data/User/GameConfig/RZTK01.ini rename to Data/Sys/GameSettings/RZTK01.ini index 4a009c4294..3a0d0e664f 100644 --- a/Data/User/GameConfig/RZTK01.ini +++ b/Data/Sys/GameSettings/RZTK01.ini @@ -1,27 +1,20 @@ # RZTK01 - Wii Sports Resort - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Needs real wiimote and motion plus. - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RZTP01.ini b/Data/Sys/GameSettings/RZTP01.ini similarity index 77% rename from Data/User/GameConfig/RZTP01.ini rename to Data/Sys/GameSettings/RZTP01.ini index 947ab0e61f..461edb24e7 100644 --- a/Data/User/GameConfig/RZTP01.ini +++ b/Data/Sys/GameSettings/RZTP01.ini @@ -1,27 +1,20 @@ # RZTP01 - Wii Sports Resort - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Needs real wiimote and motion plus. - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RZTW01.ini b/Data/Sys/GameSettings/RZTW01.ini similarity index 77% rename from Data/User/GameConfig/RZTW01.ini rename to Data/Sys/GameSettings/RZTW01.ini index 73af0701dd..d62c8f1919 100644 --- a/Data/User/GameConfig/RZTW01.ini +++ b/Data/Sys/GameSettings/RZTW01.ini @@ -1,27 +1,20 @@ # RZTW01 - Wii Sports Resort - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Needs real wiimote and motion plus. - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/RZZE8P.ini b/Data/Sys/GameSettings/RZZE8P.ini similarity index 100% rename from Data/User/GameConfig/RZZE8P.ini rename to Data/Sys/GameSettings/RZZE8P.ini diff --git a/Data/User/GameConfig/RZZJEL.ini b/Data/Sys/GameSettings/RZZJEL.ini similarity index 100% rename from Data/User/GameConfig/RZZJEL.ini rename to Data/Sys/GameSettings/RZZJEL.ini diff --git a/Data/User/GameConfig/RZZP8P.ini b/Data/Sys/GameSettings/RZZP8P.ini similarity index 100% rename from Data/User/GameConfig/RZZP8P.ini rename to Data/Sys/GameSettings/RZZP8P.ini diff --git a/Data/User/GameConfig/S2IP8P.ini b/Data/Sys/GameSettings/S2IP8P.ini similarity index 100% rename from Data/User/GameConfig/S2IP8P.ini rename to Data/Sys/GameSettings/S2IP8P.ini diff --git a/Data/User/GameConfig/S2LE01.ini b/Data/Sys/GameSettings/S2LE01.ini similarity index 100% rename from Data/User/GameConfig/S2LE01.ini rename to Data/Sys/GameSettings/S2LE01.ini diff --git a/Data/User/GameConfig/S2LJ01.ini b/Data/Sys/GameSettings/S2LJ01.ini similarity index 100% rename from Data/User/GameConfig/S2LJ01.ini rename to Data/Sys/GameSettings/S2LJ01.ini diff --git a/Data/User/GameConfig/S2LP01.ini b/Data/Sys/GameSettings/S2LP01.ini similarity index 100% rename from Data/User/GameConfig/S2LP01.ini rename to Data/Sys/GameSettings/S2LP01.ini diff --git a/Data/User/GameConfig/S2TJAF.ini b/Data/Sys/GameSettings/S2TJAF.ini similarity index 100% rename from Data/User/GameConfig/S2TJAF.ini rename to Data/Sys/GameSettings/S2TJAF.ini diff --git a/Data/User/GameConfig/S2WE78.ini b/Data/Sys/GameSettings/S2WE78.ini similarity index 100% rename from Data/User/GameConfig/S2WE78.ini rename to Data/Sys/GameSettings/S2WE78.ini diff --git a/Data/User/GameConfig/S2WP78.ini b/Data/Sys/GameSettings/S2WP78.ini similarity index 100% rename from Data/User/GameConfig/S2WP78.ini rename to Data/Sys/GameSettings/S2WP78.ini diff --git a/Data/User/GameConfig/S3BEWR.ini b/Data/Sys/GameSettings/S3BEWR.ini similarity index 100% rename from Data/User/GameConfig/S3BEWR.ini rename to Data/Sys/GameSettings/S3BEWR.ini diff --git a/Data/User/GameConfig/S3BPWR.ini b/Data/Sys/GameSettings/S3BPWR.ini similarity index 100% rename from Data/User/GameConfig/S3BPWR.ini rename to Data/Sys/GameSettings/S3BPWR.ini diff --git a/Data/User/GameConfig/S59E01.ini b/Data/Sys/GameSettings/S59E01.ini similarity index 95% rename from Data/User/GameConfig/S59E01.ini rename to Data/Sys/GameSettings/S59E01.ini index 1ac5ee0870..99aa08fb7e 100644 --- a/Data/User/GameConfig/S59E01.ini +++ b/Data/Sys/GameSettings/S59E01.ini @@ -22,4 +22,5 @@ ProjectionHack = 0 [Video_Settings] SafeTextureCacheColorSamples = 512 +FastDepthCalc = False diff --git a/Data/User/GameConfig/S59JC8.ini b/Data/Sys/GameSettings/S59JC8.ini similarity index 95% rename from Data/User/GameConfig/S59JC8.ini rename to Data/Sys/GameSettings/S59JC8.ini index 07c251a79e..a6817bcee3 100644 --- a/Data/User/GameConfig/S59JC8.ini +++ b/Data/Sys/GameSettings/S59JC8.ini @@ -22,4 +22,5 @@ ProjectionHack = 0 [Video_Settings] SafeTextureCacheColorSamples = 512 +FastDepthCalc = False diff --git a/Data/User/GameConfig/S59P01.ini b/Data/Sys/GameSettings/S59P01.ini similarity index 95% rename from Data/User/GameConfig/S59P01.ini rename to Data/Sys/GameSettings/S59P01.ini index 59abc778bf..69880a289a 100644 --- a/Data/User/GameConfig/S59P01.ini +++ b/Data/Sys/GameSettings/S59P01.ini @@ -22,4 +22,5 @@ ProjectionHack = 0 [Video_Settings] SafeTextureCacheColorSamples = 512 +FastDepthCalc = False diff --git a/Data/User/GameConfig/S72E01.ini b/Data/Sys/GameSettings/S72E01.ini similarity index 100% rename from Data/User/GameConfig/S72E01.ini rename to Data/Sys/GameSettings/S72E01.ini diff --git a/Data/User/GameConfig/S72J01.ini b/Data/Sys/GameSettings/S72J01.ini similarity index 100% rename from Data/User/GameConfig/S72J01.ini rename to Data/Sys/GameSettings/S72J01.ini diff --git a/Data/User/GameConfig/S75E69.ini b/Data/Sys/GameSettings/S75E69.ini similarity index 100% rename from Data/User/GameConfig/S75E69.ini rename to Data/Sys/GameSettings/S75E69.ini diff --git a/Data/User/GameConfig/S75P69.ini b/Data/Sys/GameSettings/S75P69.ini similarity index 100% rename from Data/User/GameConfig/S75P69.ini rename to Data/Sys/GameSettings/S75P69.ini diff --git a/Data/User/GameConfig/SAKENS.ini b/Data/Sys/GameSettings/SAKENS.ini similarity index 100% rename from Data/User/GameConfig/SAKENS.ini rename to Data/Sys/GameSettings/SAKENS.ini diff --git a/Data/User/GameConfig/SAKPNS.ini b/Data/Sys/GameSettings/SAKPNS.ini similarity index 100% rename from Data/User/GameConfig/SAKPNS.ini rename to Data/Sys/GameSettings/SAKPNS.ini diff --git a/Data/User/GameConfig/SB3E08.ini b/Data/Sys/GameSettings/SB3E08.ini similarity index 89% rename from Data/User/GameConfig/SB3E08.ini rename to Data/Sys/GameSettings/SB3E08.ini index 97d608bc45..12279b1bc9 100644 --- a/Data/User/GameConfig/SB3E08.ini +++ b/Data/Sys/GameSettings/SB3E08.ini @@ -1,4 +1,4 @@ -# SB3E08 - BASARA +# SB3E08 - Sengoku BASARA [Core] # Values set here will override the main dolphin settings. @@ -28,4 +28,4 @@ PH_ZFar = [Video_Hacks] EFBToTextureEnable = False EFBCopyEnable = True - +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SB3J08.ini b/Data/Sys/GameSettings/SB3J08.ini similarity index 89% rename from Data/User/GameConfig/SB3J08.ini rename to Data/Sys/GameSettings/SB3J08.ini index 9ac6d03cc4..8e42713fff 100644 --- a/Data/User/GameConfig/SB3J08.ini +++ b/Data/Sys/GameSettings/SB3J08.ini @@ -1,4 +1,4 @@ -# SB3J08 - BASARA +# SB3J08 - Sengoku BASARA [Core] # Values set here will override the main dolphin settings. @@ -28,4 +28,4 @@ PH_ZFar = [Video_Hacks] EFBToTextureEnable = False EFBCopyEnable = True - +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SB3P08.ini b/Data/Sys/GameSettings/SB3P08.ini similarity index 89% rename from Data/User/GameConfig/SB3P08.ini rename to Data/Sys/GameSettings/SB3P08.ini index 7eaadfdb03..b03062b44d 100644 --- a/Data/User/GameConfig/SB3P08.ini +++ b/Data/Sys/GameSettings/SB3P08.ini @@ -1,4 +1,4 @@ -# SB3P08 - BASARA +# SB3P08 - Sengoku BASARA [Core] # Values set here will override the main dolphin settings. @@ -28,4 +28,4 @@ PH_ZFar = [Video_Hacks] EFBToTextureEnable = False EFBCopyEnable = True - +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SB4E01.ini b/Data/Sys/GameSettings/SB4E01.ini similarity index 100% rename from Data/User/GameConfig/SB4E01.ini rename to Data/Sys/GameSettings/SB4E01.ini diff --git a/Data/User/GameConfig/SB4J01.ini b/Data/Sys/GameSettings/SB4J01.ini similarity index 100% rename from Data/User/GameConfig/SB4J01.ini rename to Data/Sys/GameSettings/SB4J01.ini diff --git a/Data/User/GameConfig/SB4P01.ini b/Data/Sys/GameSettings/SB4P01.ini similarity index 100% rename from Data/User/GameConfig/SB4P01.ini rename to Data/Sys/GameSettings/SB4P01.ini diff --git a/Data/User/GameConfig/SBDE08.ini b/Data/Sys/GameSettings/SBDE08.ini similarity index 82% rename from Data/User/GameConfig/SBDE08.ini rename to Data/Sys/GameSettings/SBDE08.ini index 42ee97c2a8..de02823475 100644 --- a/Data/User/GameConfig/SBDE08.ini +++ b/Data/Sys/GameSettings/SBDE08.ini @@ -18,13 +18,17 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 0.5 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + diff --git a/Data/User/GameConfig/SBDJ08.ini b/Data/Sys/GameSettings/SBDJ08.ini similarity index 82% rename from Data/User/GameConfig/SBDJ08.ini rename to Data/Sys/GameSettings/SBDJ08.ini index e78ea3b084..d9de80600b 100644 --- a/Data/User/GameConfig/SBDJ08.ini +++ b/Data/Sys/GameSettings/SBDJ08.ini @@ -18,13 +18,17 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 0.5 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + diff --git a/Data/User/GameConfig/SBDK08.ini b/Data/Sys/GameSettings/SBDK08.ini similarity index 82% rename from Data/User/GameConfig/SBDK08.ini rename to Data/Sys/GameSettings/SBDK08.ini index 7c163e4bd5..df94feca04 100644 --- a/Data/User/GameConfig/SBDK08.ini +++ b/Data/Sys/GameSettings/SBDK08.ini @@ -18,13 +18,17 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 0.5 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True + diff --git a/Data/User/GameConfig/SBDP08.ini b/Data/Sys/GameSettings/SBDP08.ini similarity index 83% rename from Data/User/GameConfig/SBDP08.ini rename to Data/Sys/GameSettings/SBDP08.ini index ed7588029c..0caee3e971 100644 --- a/Data/User/GameConfig/SBDP08.ini +++ b/Data/Sys/GameSettings/SBDP08.ini @@ -18,13 +18,16 @@ EmulationStateId = 4 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 -PH_SZFar = 1 +PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = -PH_ZFar = 0.5 +PH_ZFar = [Video_Settings] SafeTextureCacheColorSamples = 512 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/SBLE5G.ini b/Data/Sys/GameSettings/SBLE5G.ini similarity index 100% rename from Data/User/GameConfig/SBLE5G.ini rename to Data/Sys/GameSettings/SBLE5G.ini diff --git a/Data/User/GameConfig/SBNEG9.ini b/Data/Sys/GameSettings/SBNEG9.ini similarity index 100% rename from Data/User/GameConfig/SBNEG9.ini rename to Data/Sys/GameSettings/SBNEG9.ini diff --git a/Data/User/GameConfig/SBVE78.ini b/Data/Sys/GameSettings/SBVE78.ini similarity index 100% rename from Data/User/GameConfig/SBVE78.ini rename to Data/Sys/GameSettings/SBVE78.ini diff --git a/Data/User/GameConfig/SC2E8P.ini b/Data/Sys/GameSettings/SC2E8P.ini similarity index 100% rename from Data/User/GameConfig/SC2E8P.ini rename to Data/Sys/GameSettings/SC2E8P.ini diff --git a/Data/User/GameConfig/SC2P8P.ini b/Data/Sys/GameSettings/SC2P8P.ini similarity index 100% rename from Data/User/GameConfig/SC2P8P.ini rename to Data/Sys/GameSettings/SC2P8P.ini diff --git a/Data/User/GameConfig/SC4E64.ini b/Data/Sys/GameSettings/SC4E64.ini similarity index 100% rename from Data/User/GameConfig/SC4E64.ini rename to Data/Sys/GameSettings/SC4E64.ini diff --git a/Data/User/GameConfig/SC4P64.ini b/Data/Sys/GameSettings/SC4P64.ini similarity index 100% rename from Data/User/GameConfig/SC4P64.ini rename to Data/Sys/GameSettings/SC4P64.ini diff --git a/Data/User/GameConfig/SC7D52.ini b/Data/Sys/GameSettings/SC7D52.ini similarity index 90% rename from Data/User/GameConfig/SC7D52.ini rename to Data/Sys/GameSettings/SC7D52.ini index 0950049491..28edc95fdf 100644 --- a/Data/User/GameConfig/SC7D52.ini +++ b/Data/Sys/GameSettings/SC7D52.ini @@ -18,13 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] MaxAnisotropy = 0 - diff --git a/Data/User/GameConfig/SC7E52.ini b/Data/Sys/GameSettings/SC7E52.ini similarity index 90% rename from Data/User/GameConfig/SC7E52.ini rename to Data/Sys/GameSettings/SC7E52.ini index a7dba018dc..e652918c6f 100644 --- a/Data/User/GameConfig/SC7E52.ini +++ b/Data/Sys/GameSettings/SC7E52.ini @@ -18,11 +18,11 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] diff --git a/Data/User/GameConfig/SC7F52.ini b/Data/Sys/GameSettings/SC7F52.ini similarity index 90% rename from Data/User/GameConfig/SC7F52.ini rename to Data/Sys/GameSettings/SC7F52.ini index 0b05a4af42..3238a95509 100644 --- a/Data/User/GameConfig/SC7F52.ini +++ b/Data/Sys/GameSettings/SC7F52.ini @@ -18,13 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] MaxAnisotropy = 0 - diff --git a/Data/User/GameConfig/SC7I52.ini b/Data/Sys/GameSettings/SC7I52.ini similarity index 90% rename from Data/User/GameConfig/SC7I52.ini rename to Data/Sys/GameSettings/SC7I52.ini index 3179aebde4..9d26a71555 100644 --- a/Data/User/GameConfig/SC7I52.ini +++ b/Data/Sys/GameSettings/SC7I52.ini @@ -18,13 +18,14 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] MaxAnisotropy = 0 + diff --git a/Data/User/GameConfig/SC7P52.ini b/Data/Sys/GameSettings/SC7P52.ini similarity index 90% rename from Data/User/GameConfig/SC7P52.ini rename to Data/Sys/GameSettings/SC7P52.ini index 2f126dc40f..e3c422d7f0 100644 --- a/Data/User/GameConfig/SC7P52.ini +++ b/Data/Sys/GameSettings/SC7P52.ini @@ -18,13 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] MaxAnisotropy = 0 - diff --git a/Data/User/GameConfig/SC7S52.ini b/Data/Sys/GameSettings/SC7S52.ini similarity index 90% rename from Data/User/GameConfig/SC7S52.ini rename to Data/Sys/GameSettings/SC7S52.ini index b12713dd8e..75da198439 100644 --- a/Data/User/GameConfig/SC7S52.ini +++ b/Data/Sys/GameSettings/SC7S52.ini @@ -18,13 +18,12 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = 0. 01 +PH_ZNear = PH_ZFar = [Video_Enhancements] MaxAnisotropy = 0 - diff --git a/Data/User/GameConfig/SC8E01.ini b/Data/Sys/GameSettings/SC8E01.ini similarity index 100% rename from Data/User/GameConfig/SC8E01.ini rename to Data/Sys/GameSettings/SC8E01.ini diff --git a/Data/User/GameConfig/SC8J01.ini b/Data/Sys/GameSettings/SC8J01.ini similarity index 100% rename from Data/User/GameConfig/SC8J01.ini rename to Data/Sys/GameSettings/SC8J01.ini diff --git a/Data/User/GameConfig/SC8P01.ini b/Data/Sys/GameSettings/SC8P01.ini similarity index 100% rename from Data/User/GameConfig/SC8P01.ini rename to Data/Sys/GameSettings/SC8P01.ini diff --git a/Data/User/GameConfig/SCAE18.ini b/Data/Sys/GameSettings/SCAE18.ini similarity index 100% rename from Data/User/GameConfig/SCAE18.ini rename to Data/Sys/GameSettings/SCAE18.ini diff --git a/Data/User/GameConfig/SCAJ18.ini b/Data/Sys/GameSettings/SCAJ18.ini similarity index 100% rename from Data/User/GameConfig/SCAJ18.ini rename to Data/Sys/GameSettings/SCAJ18.ini diff --git a/Data/User/GameConfig/SCAP18.ini b/Data/Sys/GameSettings/SCAP18.ini similarity index 100% rename from Data/User/GameConfig/SCAP18.ini rename to Data/Sys/GameSettings/SCAP18.ini diff --git a/Data/User/GameConfig/SCYE4Q.ini b/Data/Sys/GameSettings/SCYE4Q.ini similarity index 100% rename from Data/User/GameConfig/SCYE4Q.ini rename to Data/Sys/GameSettings/SCYE4Q.ini diff --git a/Data/User/GameConfig/SCYP4Q.ini b/Data/Sys/GameSettings/SCYP4Q.ini similarity index 100% rename from Data/User/GameConfig/SCYP4Q.ini rename to Data/Sys/GameSettings/SCYP4Q.ini diff --git a/Data/User/GameConfig/SCYX4Q.ini b/Data/Sys/GameSettings/SCYX4Q.ini similarity index 100% rename from Data/User/GameConfig/SCYX4Q.ini rename to Data/Sys/GameSettings/SCYX4Q.ini diff --git a/Data/User/GameConfig/SCYY4Q.ini b/Data/Sys/GameSettings/SCYY4Q.ini similarity index 100% rename from Data/User/GameConfig/SCYY4Q.ini rename to Data/Sys/GameSettings/SCYY4Q.ini diff --git a/Data/User/GameConfig/SCYZ4Q.ini b/Data/Sys/GameSettings/SCYZ4Q.ini similarity index 100% rename from Data/User/GameConfig/SCYZ4Q.ini rename to Data/Sys/GameSettings/SCYZ4Q.ini diff --git a/Data/User/GameConfig/SD2E41.ini b/Data/Sys/GameSettings/SD2E41.ini similarity index 100% rename from Data/User/GameConfig/SD2E41.ini rename to Data/Sys/GameSettings/SD2E41.ini diff --git a/Data/User/GameConfig/SD2J01.ini b/Data/Sys/GameSettings/SD2J01.ini similarity index 100% rename from Data/User/GameConfig/SD2J01.ini rename to Data/Sys/GameSettings/SD2J01.ini diff --git a/Data/User/GameConfig/SD2P41.ini b/Data/Sys/GameSettings/SD2P41.ini similarity index 100% rename from Data/User/GameConfig/SD2P41.ini rename to Data/Sys/GameSettings/SD2P41.ini diff --git a/Data/User/GameConfig/SD2Y41.ini b/Data/Sys/GameSettings/SD2Y41.ini similarity index 100% rename from Data/User/GameConfig/SD2Y41.ini rename to Data/Sys/GameSettings/SD2Y41.ini diff --git a/Data/User/GameConfig/SDBE78.ini b/Data/Sys/GameSettings/SDBE78.ini similarity index 100% rename from Data/User/GameConfig/SDBE78.ini rename to Data/Sys/GameSettings/SDBE78.ini diff --git a/Data/User/GameConfig/SDBP78.ini b/Data/Sys/GameSettings/SDBP78.ini similarity index 100% rename from Data/User/GameConfig/SDBP78.ini rename to Data/Sys/GameSettings/SDBP78.ini diff --git a/Data/User/GameConfig/SDFE4Q.ini b/Data/Sys/GameSettings/SDFE4Q.ini similarity index 100% rename from Data/User/GameConfig/SDFE4Q.ini rename to Data/Sys/GameSettings/SDFE4Q.ini diff --git a/Data/User/GameConfig/SDNE41.ini b/Data/Sys/GameSettings/SDNE41.ini similarity index 93% rename from Data/User/GameConfig/SDNE41.ini rename to Data/Sys/GameSettings/SDNE41.ini index 4456ae4425..500f76a985 100644 --- a/Data/User/GameConfig/SDNE41.ini +++ b/Data/Sys/GameSettings/SDNE41.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 5 EmulationIssues = [OnLoad] @@ -26,7 +26,7 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 +EFBScale = -1 [Video_Enhancements] MaxAnisotropy = 0 diff --git a/Data/User/GameConfig/SDNP41.ini b/Data/Sys/GameSettings/SDNP41.ini similarity index 93% rename from Data/User/GameConfig/SDNP41.ini rename to Data/Sys/GameSettings/SDNP41.ini index f47f5d769b..8d143dc9c8 100644 --- a/Data/User/GameConfig/SDNP41.ini +++ b/Data/Sys/GameSettings/SDNP41.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 5 EmulationIssues = [OnLoad] @@ -26,7 +26,7 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 +EFBScale = -1 [Video_Enhancements] MaxAnisotropy = 0 diff --git a/Data/User/GameConfig/SDWE18.ini b/Data/Sys/GameSettings/SDWE18.ini similarity index 100% rename from Data/User/GameConfig/SDWE18.ini rename to Data/Sys/GameSettings/SDWE18.ini diff --git a/Data/User/GameConfig/SDWJ18.ini b/Data/Sys/GameSettings/SDWJ18.ini similarity index 100% rename from Data/User/GameConfig/SDWJ18.ini rename to Data/Sys/GameSettings/SDWJ18.ini diff --git a/Data/User/GameConfig/SDWP18.ini b/Data/Sys/GameSettings/SDWP18.ini similarity index 100% rename from Data/User/GameConfig/SDWP18.ini rename to Data/Sys/GameSettings/SDWP18.ini diff --git a/Data/User/GameConfig/SE2P69.ini b/Data/Sys/GameSettings/SE2P69.ini similarity index 95% rename from Data/User/GameConfig/SE2P69.ini rename to Data/Sys/GameSettings/SE2P69.ini index 48f4bd8973..50ac7050a1 100644 --- a/Data/User/GameConfig/SE2P69.ini +++ b/Data/Sys/GameSettings/SE2P69.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/SEAE69.ini b/Data/Sys/GameSettings/SEAE69.ini similarity index 95% rename from Data/User/GameConfig/SEAE69.ini rename to Data/Sys/GameSettings/SEAE69.ini index 84889555f0..e8ec4c4a39 100644 --- a/Data/User/GameConfig/SEAE69.ini +++ b/Data/Sys/GameSettings/SEAE69.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/SEAJ13.ini b/Data/Sys/GameSettings/SEAJ13.ini similarity index 100% rename from Data/User/GameConfig/SEAJ13.ini rename to Data/Sys/GameSettings/SEAJ13.ini diff --git a/Data/User/GameConfig/SEAP69.ini b/Data/Sys/GameSettings/SEAP69.ini similarity index 95% rename from Data/User/GameConfig/SEAP69.ini rename to Data/Sys/GameSettings/SEAP69.ini index ef8416cc24..918b2cd492 100644 --- a/Data/User/GameConfig/SEAP69.ini +++ b/Data/Sys/GameSettings/SEAP69.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 +EmulationStateId = 3 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/SEME4Q.ini b/Data/Sys/GameSettings/SEME4Q.ini similarity index 97% rename from Data/User/GameConfig/SEME4Q.ini rename to Data/Sys/GameSettings/SEME4Q.ini index 3f87aed72c..487e5571df 100644 --- a/Data/User/GameConfig/SEME4Q.ini +++ b/Data/Sys/GameSettings/SEME4Q.ini @@ -26,8 +26,7 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 - +EFBScale = -1 SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SEMJ01.ini b/Data/Sys/GameSettings/SEMJ01.ini similarity index 99% rename from Data/User/GameConfig/SEMJ01.ini rename to Data/Sys/GameSettings/SEMJ01.ini index 1585dfd342..73106463f3 100644 --- a/Data/User/GameConfig/SEMJ01.ini +++ b/Data/Sys/GameSettings/SEMJ01.ini @@ -27,7 +27,6 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SEMP4Q.ini b/Data/Sys/GameSettings/SEMP4Q.ini similarity index 97% rename from Data/User/GameConfig/SEMP4Q.ini rename to Data/Sys/GameSettings/SEMP4Q.ini index 475f6fb8c4..3eef876fda 100644 --- a/Data/User/GameConfig/SEMP4Q.ini +++ b/Data/Sys/GameSettings/SEMP4Q.ini @@ -26,8 +26,7 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 - +EFBScale = -1 SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SEMX4Q.ini b/Data/Sys/GameSettings/SEMX4Q.ini similarity index 97% rename from Data/User/GameConfig/SEMX4Q.ini rename to Data/Sys/GameSettings/SEMX4Q.ini index f69c2f9af7..1efd288b23 100644 --- a/Data/User/GameConfig/SEMX4Q.ini +++ b/Data/Sys/GameSettings/SEMX4Q.ini @@ -26,8 +26,7 @@ PH_ZNear = PH_ZFar = [Video_Settings] -EFBScale = 1 - +EFBScale = -1 SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SEMY4Q.ini b/Data/Sys/GameSettings/SEMY4Q.ini similarity index 99% rename from Data/User/GameConfig/SEMY4Q.ini rename to Data/Sys/GameSettings/SEMY4Q.ini index 41405dcc76..5234e9cc99 100644 --- a/Data/User/GameConfig/SEMY4Q.ini +++ b/Data/Sys/GameSettings/SEMY4Q.ini @@ -27,7 +27,6 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SEMZ4Q.ini b/Data/Sys/GameSettings/SEMZ4Q.ini similarity index 99% rename from Data/User/GameConfig/SEMZ4Q.ini rename to Data/Sys/GameSettings/SEMZ4Q.ini index af954e2994..bbcf9b1db1 100644 --- a/Data/User/GameConfig/SEMZ4Q.ini +++ b/Data/Sys/GameSettings/SEMZ4Q.ini @@ -27,7 +27,6 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 [Video_Enhancements] diff --git a/Data/User/GameConfig/SERE4Q.ini b/Data/Sys/GameSettings/SERE4Q.ini similarity index 99% rename from Data/User/GameConfig/SERE4Q.ini rename to Data/Sys/GameSettings/SERE4Q.ini index 36867efe99..527c7f4e46 100644 --- a/Data/User/GameConfig/SERE4Q.ini +++ b/Data/Sys/GameSettings/SERE4Q.ini @@ -27,6 +27,5 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/SERF4Q.ini b/Data/Sys/GameSettings/SERF4Q.ini similarity index 99% rename from Data/User/GameConfig/SERF4Q.ini rename to Data/Sys/GameSettings/SERF4Q.ini index 4cc68e3026..35aecc502f 100644 --- a/Data/User/GameConfig/SERF4Q.ini +++ b/Data/Sys/GameSettings/SERF4Q.ini @@ -27,6 +27,5 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/SERP4Q.ini b/Data/Sys/GameSettings/SERP4Q.ini similarity index 99% rename from Data/User/GameConfig/SERP4Q.ini rename to Data/Sys/GameSettings/SERP4Q.ini index e3c34c0832..9cf8859ec3 100644 --- a/Data/User/GameConfig/SERP4Q.ini +++ b/Data/Sys/GameSettings/SERP4Q.ini @@ -27,6 +27,5 @@ PH_ZFar = [Video_Settings] EFBScale = -1 - SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/SF8E01.ini b/Data/Sys/GameSettings/SF8E01.ini similarity index 100% rename from Data/User/GameConfig/SF8E01.ini rename to Data/Sys/GameSettings/SF8E01.ini diff --git a/Data/User/GameConfig/SF8J01.ini b/Data/Sys/GameSettings/SF8J01.ini similarity index 100% rename from Data/User/GameConfig/SF8J01.ini rename to Data/Sys/GameSettings/SF8J01.ini diff --git a/Data/User/GameConfig/SF8P01.ini b/Data/Sys/GameSettings/SF8P01.ini similarity index 100% rename from Data/User/GameConfig/SF8P01.ini rename to Data/Sys/GameSettings/SF8P01.ini diff --git a/Data/User/GameConfig/SFIE01.ini b/Data/Sys/GameSettings/SFIE01.ini similarity index 100% rename from Data/User/GameConfig/SFIE01.ini rename to Data/Sys/GameSettings/SFIE01.ini diff --git a/Data/User/GameConfig/SFIP01.ini b/Data/Sys/GameSettings/SFIP01.ini similarity index 100% rename from Data/User/GameConfig/SFIP01.ini rename to Data/Sys/GameSettings/SFIP01.ini diff --git a/Data/User/GameConfig/SFWE69.ini b/Data/Sys/GameSettings/SFWE69.ini similarity index 100% rename from Data/User/GameConfig/SFWE69.ini rename to Data/Sys/GameSettings/SFWE69.ini diff --git a/Data/User/GameConfig/SFWP69.ini b/Data/Sys/GameSettings/SFWP69.ini similarity index 100% rename from Data/User/GameConfig/SFWP69.ini rename to Data/Sys/GameSettings/SFWP69.ini diff --git a/Data/Sys/GameSettings/SG8EG9.ini b/Data/Sys/GameSettings/SG8EG9.ini new file mode 100644 index 0000000000..53dc722915 --- /dev/null +++ b/Data/Sys/GameSettings/SG8EG9.ini @@ -0,0 +1,34 @@ +# SG8EG9 - Yogi Bear + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/SG8PAF.ini b/Data/Sys/GameSettings/SG8PAF.ini new file mode 100644 index 0000000000..93f5bd5f52 --- /dev/null +++ b/Data/Sys/GameSettings/SG8PAF.ini @@ -0,0 +1,34 @@ +# SG8PAF - Yogi Bear + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False + +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/SGAP8P.ini b/Data/Sys/GameSettings/SGAP8P.ini similarity index 100% rename from Data/User/GameConfig/SGAP8P.ini rename to Data/Sys/GameSettings/SGAP8P.ini diff --git a/Data/User/GameConfig/SH6E52.ini b/Data/Sys/GameSettings/SH6E52.ini similarity index 100% rename from Data/User/GameConfig/SH6E52.ini rename to Data/Sys/GameSettings/SH6E52.ini diff --git a/Data/User/GameConfig/SHDE52.ini b/Data/Sys/GameSettings/SHDE52.ini similarity index 100% rename from Data/User/GameConfig/SHDE52.ini rename to Data/Sys/GameSettings/SHDE52.ini diff --git a/Data/User/GameConfig/SHLPA4.ini b/Data/Sys/GameSettings/SHLPA4.ini similarity index 100% rename from Data/User/GameConfig/SHLPA4.ini rename to Data/Sys/GameSettings/SHLPA4.ini diff --git a/Data/User/GameConfig/SILE78.ini b/Data/Sys/GameSettings/SILE78.ini similarity index 100% rename from Data/User/GameConfig/SILE78.ini rename to Data/Sys/GameSettings/SILE78.ini diff --git a/Data/User/GameConfig/SILP78.ini b/Data/Sys/GameSettings/SILP78.ini similarity index 100% rename from Data/User/GameConfig/SILP78.ini rename to Data/Sys/GameSettings/SILP78.ini diff --git a/Data/User/GameConfig/SJBE52.ini b/Data/Sys/GameSettings/SJBE52.ini similarity index 96% rename from Data/User/GameConfig/SJBE52.ini rename to Data/Sys/GameSettings/SJBE52.ini index ce124b2e96..28e5acc253 100644 --- a/Data/User/GameConfig/SJBE52.ini +++ b/Data/Sys/GameSettings/SJBE52.ini @@ -1,4 +1,4 @@ -# SJBE52 - BondX +# SJBE52 - GoldenEye007 [Core] # Values set here will override the main dolphin settings. diff --git a/Data/Sys/GameSettings/SJBJ01.ini b/Data/Sys/GameSettings/SJBJ01.ini new file mode 100644 index 0000000000..4fe057a604 --- /dev/null +++ b/Data/Sys/GameSettings/SJBJ01.ini @@ -0,0 +1,31 @@ +# SJBJ01 - GoldenEye007 + +[Core] +# Values set here will override the main dolphin settings. +BlockMerging = 1 + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationIssues = Disable the gamecube controller or the wiimote to not have conflicts (r6480) +EmulationStateId = 4 + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Hacks] +EFBCopyEnable = True +EFBToTextureEnable = False diff --git a/Data/User/GameConfig/SJBP52.ini b/Data/Sys/GameSettings/SJBP52.ini similarity index 96% rename from Data/User/GameConfig/SJBP52.ini rename to Data/Sys/GameSettings/SJBP52.ini index 426fc4a0e9..da58fb081a 100644 --- a/Data/User/GameConfig/SJBP52.ini +++ b/Data/Sys/GameSettings/SJBP52.ini @@ -1,4 +1,4 @@ -# SJBP52 - BondX +# SJBP52 - GoldenEye007 [Core] # Values set here will override the main dolphin settings. diff --git a/Data/Sys/GameSettings/SJDE41.ini b/Data/Sys/GameSettings/SJDE41.ini new file mode 100644 index 0000000000..569690830e --- /dev/null +++ b/Data/Sys/GameSettings/SJDE41.ini @@ -0,0 +1,20 @@ +# SJDE41 - Just Dance 3 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/Sys/GameSettings/SJDP41.ini b/Data/Sys/GameSettings/SJDP41.ini new file mode 100644 index 0000000000..cfe8d58c98 --- /dev/null +++ b/Data/Sys/GameSettings/SJDP41.ini @@ -0,0 +1,21 @@ +# SJDP41 - Just Dance 3 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 + diff --git a/Data/Sys/GameSettings/SJDY41.ini b/Data/Sys/GameSettings/SJDY41.ini new file mode 100644 index 0000000000..df5b7b8fc4 --- /dev/null +++ b/Data/Sys/GameSettings/SJDY41.ini @@ -0,0 +1,20 @@ +# SJDY41 - Just Dance 3 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/Sys/GameSettings/SJDZ41.ini b/Data/Sys/GameSettings/SJDZ41.ini new file mode 100644 index 0000000000..2c36d68645 --- /dev/null +++ b/Data/Sys/GameSettings/SJDZ41.ini @@ -0,0 +1,20 @@ +# SJDP41 - Just Dance 3 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/Sys/GameSettings/SJXD41.ini b/Data/Sys/GameSettings/SJXD41.ini new file mode 100644 index 0000000000..31586b5e5d --- /dev/null +++ b/Data/Sys/GameSettings/SJXD41.ini @@ -0,0 +1,20 @@ +# SJXD41 - Just Dance 4 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/Sys/GameSettings/SJXE41.ini b/Data/Sys/GameSettings/SJXE41.ini new file mode 100644 index 0000000000..5834e3e951 --- /dev/null +++ b/Data/Sys/GameSettings/SJXE41.ini @@ -0,0 +1,20 @@ +# SJXE41 - Just Dance 4 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/Sys/GameSettings/SJXP41.ini b/Data/Sys/GameSettings/SJXP41.ini new file mode 100644 index 0000000000..abf0264ef6 --- /dev/null +++ b/Data/Sys/GameSettings/SJXP41.ini @@ -0,0 +1,20 @@ +# SJXP41 - Just Dance 4 +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 5 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Enhancements] +MaxAnisotropy = 0 diff --git a/Data/User/GameConfig/SK3EEB.ini b/Data/Sys/GameSettings/SK3EEB.ini similarity index 100% rename from Data/User/GameConfig/SK3EEB.ini rename to Data/Sys/GameSettings/SK3EEB.ini diff --git a/Data/User/GameConfig/SK4E52.ini b/Data/Sys/GameSettings/SK4E52.ini similarity index 100% rename from Data/User/GameConfig/SK4E52.ini rename to Data/Sys/GameSettings/SK4E52.ini diff --git a/Data/User/GameConfig/SKJE78.ini b/Data/Sys/GameSettings/SKJE78.ini similarity index 96% rename from Data/User/GameConfig/SKJE78.ini rename to Data/Sys/GameSettings/SKJE78.ini index a1207608c2..af151003cb 100644 --- a/Data/User/GameConfig/SKJE78.ini +++ b/Data/Sys/GameSettings/SKJE78.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 +EmulationStateId = 5 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/SKVE20.ini b/Data/Sys/GameSettings/SKVE20.ini similarity index 100% rename from Data/User/GameConfig/SKVE20.ini rename to Data/Sys/GameSettings/SKVE20.ini diff --git a/Data/Sys/GameSettings/SL2J01.ini b/Data/Sys/GameSettings/SL2J01.ini new file mode 100644 index 0000000000..c11d5e7298 --- /dev/null +++ b/Data/Sys/GameSettings/SL2J01.ini @@ -0,0 +1,18 @@ +# SL2J01 - Zero: Shinku no Chou +[Core] Values set here will override the main dolphin settings. +[EmuState] The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnFrame] Add memory patches to be applied every frame here. +[ActionReplay] Add action replay cheats here. +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/SL2P01.ini b/Data/Sys/GameSettings/SL2P01.ini new file mode 100644 index 0000000000..30b25b51d9 --- /dev/null +++ b/Data/Sys/GameSettings/SL2P01.ini @@ -0,0 +1,18 @@ +# SL2P01 - Project Zero 2 +[Core] Values set here will override the main dolphin settings. +[EmuState] The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnFrame] Add memory patches to be applied every frame here. +[ActionReplay] Add action replay cheats here. +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/SLSEXJ.ini b/Data/Sys/GameSettings/SLSEXJ.ini similarity index 100% rename from Data/User/GameConfig/SLSEXJ.ini rename to Data/Sys/GameSettings/SLSEXJ.ini diff --git a/Data/User/GameConfig/SLSJ01.ini b/Data/Sys/GameSettings/SLSJ01.ini similarity index 100% rename from Data/User/GameConfig/SLSJ01.ini rename to Data/Sys/GameSettings/SLSJ01.ini diff --git a/Data/User/GameConfig/SLSP01.ini b/Data/Sys/GameSettings/SLSP01.ini similarity index 100% rename from Data/User/GameConfig/SLSP01.ini rename to Data/Sys/GameSettings/SLSP01.ini diff --git a/Data/User/GameConfig/SLWE41.ini b/Data/Sys/GameSettings/SLWE41.ini similarity index 100% rename from Data/User/GameConfig/SLWE41.ini rename to Data/Sys/GameSettings/SLWE41.ini diff --git a/Data/User/GameConfig/SMBE8P.ini b/Data/Sys/GameSettings/SMBE8P.ini similarity index 100% rename from Data/User/GameConfig/SMBE8P.ini rename to Data/Sys/GameSettings/SMBE8P.ini diff --git a/Data/User/GameConfig/SMBP8P.ini b/Data/Sys/GameSettings/SMBP8P.ini similarity index 100% rename from Data/User/GameConfig/SMBP8P.ini rename to Data/Sys/GameSettings/SMBP8P.ini diff --git a/Data/User/GameConfig/SMFE4Q.ini b/Data/Sys/GameSettings/SMFE4Q.ini similarity index 92% rename from Data/User/GameConfig/SMFE4Q.ini rename to Data/Sys/GameSettings/SMFE4Q.ini index 6878659384..69e1270a0e 100644 --- a/Data/User/GameConfig/SMFE4Q.ini +++ b/Data/Sys/GameSettings/SMFE4Q.ini @@ -30,6 +30,4 @@ SafeTextureCacheColorSamples = 0 UseXFB = True UseRealXFB = False -[Video_Hacks] -EFBEmulateFormatChanges = False diff --git a/Data/User/GameConfig/SMFP4Q.ini b/Data/Sys/GameSettings/SMFP4Q.ini similarity index 92% rename from Data/User/GameConfig/SMFP4Q.ini rename to Data/Sys/GameSettings/SMFP4Q.ini index cc788a1cf1..cc350b1440 100644 --- a/Data/User/GameConfig/SMFP4Q.ini +++ b/Data/Sys/GameSettings/SMFP4Q.ini @@ -30,6 +30,3 @@ SafeTextureCacheColorSamples = 0 UseXFB = True UseRealXFB = False -[Video_Hacks] -EFBEmulateFormatChanges = False - diff --git a/Data/User/GameConfig/SMNE01.ini b/Data/Sys/GameSettings/SMNE01.ini similarity index 100% rename from Data/User/GameConfig/SMNE01.ini rename to Data/Sys/GameSettings/SMNE01.ini diff --git a/Data/User/GameConfig/SMNJ01.ini b/Data/Sys/GameSettings/SMNJ01.ini similarity index 100% rename from Data/User/GameConfig/SMNJ01.ini rename to Data/Sys/GameSettings/SMNJ01.ini diff --git a/Data/User/GameConfig/SMNK01.ini b/Data/Sys/GameSettings/SMNK01.ini similarity index 100% rename from Data/User/GameConfig/SMNK01.ini rename to Data/Sys/GameSettings/SMNK01.ini diff --git a/Data/User/GameConfig/SMNP01.ini b/Data/Sys/GameSettings/SMNP01.ini similarity index 98% rename from Data/User/GameConfig/SMNP01.ini rename to Data/Sys/GameSettings/SMNP01.ini index de60c36282..fa82d55841 100644 --- a/Data/User/GameConfig/SMNP01.ini +++ b/Data/Sys/GameSettings/SMNP01.ini @@ -13,7 +13,7 @@ EmulationStateId = 4 [OnFrame] # Add memory patches to be applied every frame here. -+$Speed hack +$Speed hack 0x801D5B10:dword:0x60000000 0x801D5B14:dword:0x60000000 diff --git a/Data/User/GameConfig/SMNW01.ini b/Data/Sys/GameSettings/SMNW01.ini similarity index 100% rename from Data/User/GameConfig/SMNW01.ini rename to Data/Sys/GameSettings/SMNW01.ini diff --git a/Data/User/GameConfig/SMOE41.ini b/Data/Sys/GameSettings/SMOE41.ini similarity index 100% rename from Data/User/GameConfig/SMOE41.ini rename to Data/Sys/GameSettings/SMOE41.ini diff --git a/Data/User/GameConfig/SMOP41.ini b/Data/Sys/GameSettings/SMOP41.ini similarity index 100% rename from Data/User/GameConfig/SMOP41.ini rename to Data/Sys/GameSettings/SMOP41.ini diff --git a/Data/User/GameConfig/SMOX41.ini b/Data/Sys/GameSettings/SMOX41.ini similarity index 100% rename from Data/User/GameConfig/SMOX41.ini rename to Data/Sys/GameSettings/SMOX41.ini diff --git a/Data/User/GameConfig/SN4EDA.ini b/Data/Sys/GameSettings/SN4EDA.ini similarity index 100% rename from Data/User/GameConfig/SN4EDA.ini rename to Data/Sys/GameSettings/SN4EDA.ini diff --git a/Data/User/GameConfig/SN4JDA.ini b/Data/Sys/GameSettings/SN4JDA.ini similarity index 100% rename from Data/User/GameConfig/SN4JDA.ini rename to Data/Sys/GameSettings/SN4JDA.ini diff --git a/Data/User/GameConfig/SN4XGT.ini b/Data/Sys/GameSettings/SN4XGT.ini similarity index 100% rename from Data/User/GameConfig/SN4XGT.ini rename to Data/Sys/GameSettings/SN4XGT.ini diff --git a/Data/User/GameConfig/SNCE8P.ini b/Data/Sys/GameSettings/SNCE8P.ini similarity index 89% rename from Data/User/GameConfig/SNCE8P.ini rename to Data/Sys/GameSettings/SNCE8P.ini index a37dd6c71f..9bcc3be420 100644 --- a/Data/User/GameConfig/SNCE8P.ini +++ b/Data/Sys/GameSettings/SNCE8P.ini @@ -1,4 +1,4 @@ -# SNCE8P - Sonic2010 +# SNCE8P - SONIC COLOURS [Core] # Values set here will override the main dolphin settings. @@ -18,12 +18,12 @@ EmulationStateId = 5 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] EFBScale = -1 diff --git a/Data/User/GameConfig/SNCJ8P.ini b/Data/Sys/GameSettings/SNCJ8P.ini similarity index 89% rename from Data/User/GameConfig/SNCJ8P.ini rename to Data/Sys/GameSettings/SNCJ8P.ini index 2ace912eb4..30516fd356 100644 --- a/Data/User/GameConfig/SNCJ8P.ini +++ b/Data/Sys/GameSettings/SNCJ8P.ini @@ -1,4 +1,4 @@ -# SNCJ8P - Sonic2010 +# SNCJ8P - SONIC COLOURS [Core] # Values set here will override the main dolphin settings. @@ -18,12 +18,12 @@ EmulationStateId = 5 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] EFBScale = -1 diff --git a/Data/User/GameConfig/SNCP8P.ini b/Data/Sys/GameSettings/SNCP8P.ini similarity index 89% rename from Data/User/GameConfig/SNCP8P.ini rename to Data/Sys/GameSettings/SNCP8P.ini index 3997bf19ce..1f54a916e0 100644 --- a/Data/User/GameConfig/SNCP8P.ini +++ b/Data/Sys/GameSettings/SNCP8P.ini @@ -1,4 +1,4 @@ -# SNCP8P - Sonic2010 +# SNCP8P - SONIC COLOURS [Core] # Values set here will override the main dolphin settings. @@ -18,12 +18,12 @@ EmulationStateId = 5 # Add action replay cheats here. [Video] -ProjectionHack = 1 +ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = 0.01 +PH_ZNear = +PH_ZFar = [Video_Settings] EFBScale = -1 diff --git a/Data/User/GameConfig/SNDE20.ini b/Data/Sys/GameSettings/SNDE20.ini similarity index 100% rename from Data/User/GameConfig/SNDE20.ini rename to Data/Sys/GameSettings/SNDE20.ini diff --git a/Data/User/GameConfig/SNJE69.ini b/Data/Sys/GameSettings/SNJE69.ini similarity index 100% rename from Data/User/GameConfig/SNJE69.ini rename to Data/Sys/GameSettings/SNJE69.ini diff --git a/Data/User/GameConfig/SNJP69.ini b/Data/Sys/GameSettings/SNJP69.ini similarity index 100% rename from Data/User/GameConfig/SNJP69.ini rename to Data/Sys/GameSettings/SNJP69.ini diff --git a/Data/User/GameConfig/SO3EE9.ini b/Data/Sys/GameSettings/SO3EE9.ini similarity index 89% rename from Data/User/GameConfig/SO3EE9.ini rename to Data/Sys/GameSettings/SO3EE9.ini index dfedc63ea2..ba4e63e1c2 100644 --- a/Data/User/GameConfig/SO3EE9.ini +++ b/Data/Sys/GameSettings/SO3EE9.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 5 -EmulationIssues = Direct 3d 11 fixes some texture glitches. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/SO3J99.ini b/Data/Sys/GameSettings/SO3J99.ini similarity index 89% rename from Data/User/GameConfig/SO3J99.ini rename to Data/Sys/GameSettings/SO3J99.ini index a35dbc93da..00a38f1488 100644 --- a/Data/User/GameConfig/SO3J99.ini +++ b/Data/Sys/GameSettings/SO3J99.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 5 -EmulationIssues = Direct 3d 11 fixes some texture glitches. +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. diff --git a/Data/User/GameConfig/SOJE41.ini b/Data/Sys/GameSettings/SOJE41.ini similarity index 88% rename from Data/User/GameConfig/SOJE41.ini rename to Data/Sys/GameSettings/SOJE41.ini index 2d382d8cbe..26569bc65a 100644 --- a/Data/User/GameConfig/SOJE41.ini +++ b/Data/Sys/GameSettings/SOJE41.ini @@ -18,10 +18,10 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = +PH_ZNear = +PH_ZFar = diff --git a/Data/User/GameConfig/SOJP41.ini b/Data/Sys/GameSettings/SOJP41.ini similarity index 88% rename from Data/User/GameConfig/SOJP41.ini rename to Data/Sys/GameSettings/SOJP41.ini index def064a140..1182d621b3 100644 --- a/Data/User/GameConfig/SOJP41.ini +++ b/Data/Sys/GameSettings/SOJP41.ini @@ -18,10 +18,10 @@ EmulationIssues = # Add action replay cheats here. [Video] -ProjectionHack = 1 -PH_SZNear = 1 +ProjectionHack = 0 +PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/SOUE01.ini b/Data/Sys/GameSettings/SOUE01.ini new file mode 100644 index 0000000000..21b2932d3e --- /dev/null +++ b/Data/Sys/GameSettings/SOUE01.ini @@ -0,0 +1,22 @@ +# SOUE01 - The Legend of Zelda Skyward Sword +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Needs real wiimote and motion plus. +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBAccessEnable = True +DlistCachingEnable = False +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SOUJ01.ini b/Data/Sys/GameSettings/SOUJ01.ini similarity index 66% rename from Data/User/GameConfig/SOUJ01.ini rename to Data/Sys/GameSettings/SOUJ01.ini index 9be2cefa22..cda850cfb3 100644 --- a/Data/User/GameConfig/SOUJ01.ini +++ b/Data/Sys/GameSettings/SOUJ01.ini @@ -1,31 +1,23 @@ # SOUJ01 - The Legend of Zelda Skyward Sword - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs real wiimote and motion plus. Use direct 3d9 backend for less graphic issues. - +EmulationIssues = Needs real wiimote and motion plus. [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = [Video_Hacks] EFBAccessEnable = True DlistCachingEnable = False +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SOUK01.ini b/Data/Sys/GameSettings/SOUK01.ini similarity index 66% rename from Data/User/GameConfig/SOUK01.ini rename to Data/Sys/GameSettings/SOUK01.ini index 8d332015c3..ddaf1883a9 100644 --- a/Data/User/GameConfig/SOUK01.ini +++ b/Data/Sys/GameSettings/SOUK01.ini @@ -1,31 +1,23 @@ # SOUK01 - The Legend of Zelda Skyward Sword - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs real wiimote and motion plus. Use direct 3d9 backend for less graphic issues. - +EmulationIssues = Needs real wiimote and motion plus. [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = [Video_Hacks] EFBAccessEnable = True DlistCachingEnable = False +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SOUP01.ini b/Data/Sys/GameSettings/SOUP01.ini similarity index 66% rename from Data/User/GameConfig/SOUP01.ini rename to Data/Sys/GameSettings/SOUP01.ini index c0db560999..bc3ade6a7b 100644 --- a/Data/User/GameConfig/SOUP01.ini +++ b/Data/Sys/GameSettings/SOUP01.ini @@ -1,31 +1,23 @@ # SOUP01 - The Legend of Zelda Skyward Sword - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs real wiimote and motion plus. Use direct 3d9 backend for less graphic issues. - +EmulationIssues = Needs real wiimote and motion plus. [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 PH_SZNear = 0 PH_SZFar = 0 PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = - +PH_ZNear = +PH_ZFar = [Video_Hacks] EFBAccessEnable = True DlistCachingEnable = False +EFBEmulateFormatChanges = True diff --git a/Data/User/GameConfig/SPDE52.ini b/Data/Sys/GameSettings/SPDE52.ini similarity index 100% rename from Data/User/GameConfig/SPDE52.ini rename to Data/Sys/GameSettings/SPDE52.ini diff --git a/Data/User/GameConfig/SPDP52.ini b/Data/Sys/GameSettings/SPDP52.ini similarity index 100% rename from Data/User/GameConfig/SPDP52.ini rename to Data/Sys/GameSettings/SPDP52.ini diff --git a/Data/User/GameConfig/SPPEFS.ini b/Data/Sys/GameSettings/SPPEFS.ini similarity index 100% rename from Data/User/GameConfig/SPPEFS.ini rename to Data/Sys/GameSettings/SPPEFS.ini diff --git a/Data/User/GameConfig/SPTJEB.ini b/Data/Sys/GameSettings/SPTJEB.ini similarity index 100% rename from Data/User/GameConfig/SPTJEB.ini rename to Data/Sys/GameSettings/SPTJEB.ini diff --git a/Data/User/GameConfig/SPVEA4.ini b/Data/Sys/GameSettings/SPVEA4.ini similarity index 100% rename from Data/User/GameConfig/SPVEA4.ini rename to Data/Sys/GameSettings/SPVEA4.ini diff --git a/Data/User/GameConfig/SPVPA4.ini b/Data/Sys/GameSettings/SPVPA4.ini similarity index 100% rename from Data/User/GameConfig/SPVPA4.ini rename to Data/Sys/GameSettings/SPVPA4.ini diff --git a/Data/User/GameConfig/SPVXA4.ini b/Data/Sys/GameSettings/SPVXA4.ini similarity index 100% rename from Data/User/GameConfig/SPVXA4.ini rename to Data/Sys/GameSettings/SPVXA4.ini diff --git a/Data/User/GameConfig/SPVYA4.ini b/Data/Sys/GameSettings/SPVYA4.ini similarity index 100% rename from Data/User/GameConfig/SPVYA4.ini rename to Data/Sys/GameSettings/SPVYA4.ini diff --git a/Data/User/GameConfig/SQME52.ini b/Data/Sys/GameSettings/SQME52.ini similarity index 100% rename from Data/User/GameConfig/SQME52.ini rename to Data/Sys/GameSettings/SQME52.ini diff --git a/Data/User/GameConfig/SQMP52.ini b/Data/Sys/GameSettings/SQMP52.ini similarity index 100% rename from Data/User/GameConfig/SQMP52.ini rename to Data/Sys/GameSettings/SQMP52.ini diff --git a/Data/User/GameConfig/SR5E41.ini b/Data/Sys/GameSettings/SR5E41.ini similarity index 100% rename from Data/User/GameConfig/SR5E41.ini rename to Data/Sys/GameSettings/SR5E41.ini diff --git a/Data/User/GameConfig/SRQE41.ini b/Data/Sys/GameSettings/SRQE41.ini similarity index 100% rename from Data/User/GameConfig/SRQE41.ini rename to Data/Sys/GameSettings/SRQE41.ini diff --git a/Data/User/GameConfig/SRQP41.ini b/Data/Sys/GameSettings/SRQP41.ini similarity index 100% rename from Data/User/GameConfig/SRQP41.ini rename to Data/Sys/GameSettings/SRQP41.ini diff --git a/Data/User/GameConfig/SS3EWR.ini b/Data/Sys/GameSettings/SS3EWR.ini similarity index 95% rename from Data/User/GameConfig/SS3EWR.ini rename to Data/Sys/GameSettings/SS3EWR.ini index 4a382202b3..cf68da8a67 100644 --- a/Data/User/GameConfig/SS3EWR.ini +++ b/Data/Sys/GameSettings/SS3EWR.ini @@ -5,7 +5,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 +EmulationStateId = 4 EmulationIssues = [OnLoad] diff --git a/Data/User/GameConfig/SSQE01.ini b/Data/Sys/GameSettings/SSQE01.ini similarity index 100% rename from Data/User/GameConfig/SSQE01.ini rename to Data/Sys/GameSettings/SSQE01.ini diff --git a/Data/User/GameConfig/SSQJ01.ini b/Data/Sys/GameSettings/SSQJ01.ini similarity index 100% rename from Data/User/GameConfig/SSQJ01.ini rename to Data/Sys/GameSettings/SSQJ01.ini diff --git a/Data/User/GameConfig/SSQP01.ini b/Data/Sys/GameSettings/SSQP01.ini similarity index 100% rename from Data/User/GameConfig/SSQP01.ini rename to Data/Sys/GameSettings/SSQP01.ini diff --git a/Data/User/GameConfig/SSRE20.ini b/Data/Sys/GameSettings/SSRE20.ini similarity index 100% rename from Data/User/GameConfig/SSRE20.ini rename to Data/Sys/GameSettings/SSRE20.ini diff --git a/Data/User/GameConfig/SSRPXT.ini b/Data/Sys/GameSettings/SSRPXT.ini similarity index 100% rename from Data/User/GameConfig/SSRPXT.ini rename to Data/Sys/GameSettings/SSRPXT.ini diff --git a/Data/User/GameConfig/SSZE5G.ini b/Data/Sys/GameSettings/SSZE5G.ini similarity index 100% rename from Data/User/GameConfig/SSZE5G.ini rename to Data/Sys/GameSettings/SSZE5G.ini diff --git a/Data/User/GameConfig/STEETR.ini b/Data/Sys/GameSettings/STEETR.ini similarity index 100% rename from Data/User/GameConfig/STEETR.ini rename to Data/Sys/GameSettings/STEETR.ini diff --git a/Data/User/GameConfig/STHP8P.ini b/Data/Sys/GameSettings/STHP8P.ini similarity index 100% rename from Data/User/GameConfig/STHP8P.ini rename to Data/Sys/GameSettings/STHP8P.ini diff --git a/Data/User/GameConfig/STKE08.ini b/Data/Sys/GameSettings/STKE08.ini similarity index 100% rename from Data/User/GameConfig/STKE08.ini rename to Data/Sys/GameSettings/STKE08.ini diff --git a/Data/User/GameConfig/STKJ08.ini b/Data/Sys/GameSettings/STKJ08.ini similarity index 100% rename from Data/User/GameConfig/STKJ08.ini rename to Data/Sys/GameSettings/STKJ08.ini diff --git a/Data/User/GameConfig/STKP08.ini b/Data/Sys/GameSettings/STKP08.ini similarity index 100% rename from Data/User/GameConfig/STKP08.ini rename to Data/Sys/GameSettings/STKP08.ini diff --git a/Data/Sys/GameSettings/SU7EG9.ini b/Data/Sys/GameSettings/SU7EG9.ini new file mode 100644 index 0000000000..3c376bc0fd --- /dev/null +++ b/Data/Sys/GameSettings/SU7EG9.ini @@ -0,0 +1,17 @@ +# SU7EG9 - RISE OF THE GUARDIANS +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/SU7PAF.ini b/Data/Sys/GameSettings/SU7PAF.ini new file mode 100644 index 0000000000..d5186e8391 --- /dev/null +++ b/Data/Sys/GameSettings/SU7PAF.ini @@ -0,0 +1,17 @@ +# SU7PAF - RISE OF THE GUARDIANS +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/SUKE01.ini b/Data/Sys/GameSettings/SUKE01.ini similarity index 100% rename from Data/User/GameConfig/SUKE01.ini rename to Data/Sys/GameSettings/SUKE01.ini diff --git a/Data/User/GameConfig/SUKJ01.ini b/Data/Sys/GameSettings/SUKJ01.ini similarity index 100% rename from Data/User/GameConfig/SUKJ01.ini rename to Data/Sys/GameSettings/SUKJ01.ini diff --git a/Data/User/GameConfig/SUKP01.ini b/Data/Sys/GameSettings/SUKP01.ini similarity index 100% rename from Data/User/GameConfig/SUKP01.ini rename to Data/Sys/GameSettings/SUKP01.ini diff --git a/Data/User/GameConfig/SVBE52.ini b/Data/Sys/GameSettings/SVBE52.ini similarity index 100% rename from Data/User/GameConfig/SVBE52.ini rename to Data/Sys/GameSettings/SVBE52.ini diff --git a/Data/User/GameConfig/SVBP52.ini b/Data/Sys/GameSettings/SVBP52.ini similarity index 100% rename from Data/User/GameConfig/SVBP52.ini rename to Data/Sys/GameSettings/SVBP52.ini diff --git a/Data/User/GameConfig/SVME01.ini b/Data/Sys/GameSettings/SVME01.ini similarity index 100% rename from Data/User/GameConfig/SVME01.ini rename to Data/Sys/GameSettings/SVME01.ini diff --git a/Data/User/GameConfig/SVMJ01.ini b/Data/Sys/GameSettings/SVMJ01.ini similarity index 100% rename from Data/User/GameConfig/SVMJ01.ini rename to Data/Sys/GameSettings/SVMJ01.ini diff --git a/Data/User/GameConfig/SVMP01.ini b/Data/Sys/GameSettings/SVMP01.ini similarity index 100% rename from Data/User/GameConfig/SVMP01.ini rename to Data/Sys/GameSettings/SVMP01.ini diff --git a/Data/Sys/GameSettings/SVVEG9.ini b/Data/Sys/GameSettings/SVVEG9.ini new file mode 100644 index 0000000000..38f6ecaed7 --- /dev/null +++ b/Data/Sys/GameSettings/SVVEG9.ini @@ -0,0 +1,30 @@ +# SVVEG9 - The Croods Prehistoric Party + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/SVVPAF.ini b/Data/Sys/GameSettings/SVVPAF.ini new file mode 100644 index 0000000000..1b3f553997 --- /dev/null +++ b/Data/Sys/GameSettings/SVVPAF.ini @@ -0,0 +1,31 @@ +# SVVPAF - The Croods Prehistoric Party + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False + diff --git a/Data/User/GameConfig/SWAE52.ini b/Data/Sys/GameSettings/SWAE52.ini similarity index 100% rename from Data/User/GameConfig/SWAE52.ini rename to Data/Sys/GameSettings/SWAE52.ini diff --git a/Data/User/GameConfig/SX3J01.ini b/Data/Sys/GameSettings/SX3J01.ini similarity index 100% rename from Data/User/GameConfig/SX3J01.ini rename to Data/Sys/GameSettings/SX3J01.ini diff --git a/Data/User/GameConfig/SX3P01.ini b/Data/Sys/GameSettings/SX3P01.ini similarity index 100% rename from Data/User/GameConfig/SX3P01.ini rename to Data/Sys/GameSettings/SX3P01.ini diff --git a/Data/User/GameConfig/SOUE01.ini b/Data/Sys/GameSettings/SX4E01.ini similarity index 73% rename from Data/User/GameConfig/SOUE01.ini rename to Data/Sys/GameSettings/SX4E01.ini index d34b216b4e..bc96ee2cc5 100644 --- a/Data/User/GameConfig/SOUE01.ini +++ b/Data/Sys/GameSettings/SX4E01.ini @@ -1,12 +1,13 @@ -# SOUE01 - The Legend of Zelda Skyward Sword +# SX4E01 - Xenoblade Chronicles [Core] # Values set here will override the main dolphin settings. +BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = Needs real wiimote and motion plus. Use direct 3d9 backend for less graphic issues. +EmulationIssues = The game randomly freezes. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -26,6 +27,4 @@ PH_ZNear = PH_ZFar = [Video_Hacks] -EFBAccessEnable = True DlistCachingEnable = False - diff --git a/Data/User/GameConfig/SX4J01.ini b/Data/Sys/GameSettings/SX4J01.ini similarity index 76% rename from Data/User/GameConfig/SX4J01.ini rename to Data/Sys/GameSettings/SX4J01.ini index 271b8e8585..4df1e41460 100644 --- a/Data/User/GameConfig/SX4J01.ini +++ b/Data/Sys/GameSettings/SX4J01.ini @@ -7,7 +7,7 @@ BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = The game randomly freezes. Per pixel lighting creates a glitch in ether cave with direct 3d 9. +EmulationIssues = The game randomly freezes. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -26,9 +26,6 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -[Video_Settings] -EnablePixelLighting = False - [Video_Hacks] DlistCachingEnable = False diff --git a/Data/User/GameConfig/SX4P01.ini b/Data/Sys/GameSettings/SX4P01.ini similarity index 76% rename from Data/User/GameConfig/SX4P01.ini rename to Data/Sys/GameSettings/SX4P01.ini index b0de31d8ad..c03cda0a94 100644 --- a/Data/User/GameConfig/SX4P01.ini +++ b/Data/Sys/GameSettings/SX4P01.ini @@ -7,7 +7,7 @@ BlockMerging = 1 [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = The game randomly freezes. Per pixel lighting creates a glitch in ether cave with direct 3d 9. +EmulationIssues = The game randomly freezes. [OnLoad] # Add memory patches to be loaded once on boot here. @@ -26,9 +26,6 @@ PH_ExtraParam = 0 PH_ZNear = PH_ZFar = -[Video_Settings] -EnablePixelLighting = False - [Video_Hacks] DlistCachingEnable = False diff --git a/Data/User/GameConfig/SX8E52.ini b/Data/Sys/GameSettings/SX8E52.ini similarity index 100% rename from Data/User/GameConfig/SX8E52.ini rename to Data/Sys/GameSettings/SX8E52.ini diff --git a/Data/User/GameConfig/SXBP52.ini b/Data/Sys/GameSettings/SXBP52.ini similarity index 100% rename from Data/User/GameConfig/SXBP52.ini rename to Data/Sys/GameSettings/SXBP52.ini diff --git a/Data/User/GameConfig/SXCE52.ini b/Data/Sys/GameSettings/SXCE52.ini similarity index 100% rename from Data/User/GameConfig/SXCE52.ini rename to Data/Sys/GameSettings/SXCE52.ini diff --git a/Data/User/GameConfig/SXCP52.ini b/Data/Sys/GameSettings/SXCP52.ini similarity index 100% rename from Data/User/GameConfig/SXCP52.ini rename to Data/Sys/GameSettings/SXCP52.ini diff --git a/Data/User/GameConfig/SXDE52.ini b/Data/Sys/GameSettings/SXDE52.ini similarity index 100% rename from Data/User/GameConfig/SXDE52.ini rename to Data/Sys/GameSettings/SXDE52.ini diff --git a/Data/User/GameConfig/SXEE52.ini b/Data/Sys/GameSettings/SXEE52.ini similarity index 96% rename from Data/User/GameConfig/SXEE52.ini rename to Data/Sys/GameSettings/SXEE52.ini index 4d4975dfc4..05445fa6d8 100644 --- a/Data/User/GameConfig/SXEE52.ini +++ b/Data/Sys/GameSettings/SXEE52.ini @@ -13,7 +13,7 @@ EmulationIssues = [OnFrame] # Add memory patches to be applied every frame here. -+$Get ingame +$Get ingame 0x801822D0:dword:0x60000000 [ActionReplay] diff --git a/Data/User/GameConfig/SZAE69.ini b/Data/Sys/GameSettings/SZAE69.ini similarity index 100% rename from Data/User/GameConfig/SZAE69.ini rename to Data/Sys/GameSettings/SZAE69.ini diff --git a/Data/User/GameConfig/SZAP69.ini b/Data/Sys/GameSettings/SZAP69.ini similarity index 100% rename from Data/User/GameConfig/SZAP69.ini rename to Data/Sys/GameSettings/SZAP69.ini diff --git a/Data/User/GameConfig/SZBE69.ini b/Data/Sys/GameSettings/SZBE69.ini similarity index 100% rename from Data/User/GameConfig/SZBE69.ini rename to Data/Sys/GameSettings/SZBE69.ini diff --git a/Data/User/GameConfig/SZBP69.ini b/Data/Sys/GameSettings/SZBP69.ini similarity index 100% rename from Data/User/GameConfig/SZBP69.ini rename to Data/Sys/GameSettings/SZBP69.ini diff --git a/Data/User/GameConfig/UGPE01.ini b/Data/Sys/GameSettings/UGPE01.ini similarity index 100% rename from Data/User/GameConfig/UGPE01.ini rename to Data/Sys/GameSettings/UGPE01.ini diff --git a/Data/User/GameConfig/UGPP01.ini b/Data/Sys/GameSettings/UGPP01.ini similarity index 100% rename from Data/User/GameConfig/UGPP01.ini rename to Data/Sys/GameSettings/UGPP01.ini diff --git a/Data/Sys/GameSettings/W2GE08.ini b/Data/Sys/GameSettings/W2GE08.ini new file mode 100644 index 0000000000..0e5cae1f0d --- /dev/null +++ b/Data/Sys/GameSettings/W2GE08.ini @@ -0,0 +1,18 @@ +# W2GE08 - Phoenix Wright Ace Attorney Justice For All +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/W2GP08.ini b/Data/Sys/GameSettings/W2GP08.ini new file mode 100644 index 0000000000..56990dee85 --- /dev/null +++ b/Data/Sys/GameSettings/W2GP08.ini @@ -0,0 +1,18 @@ +# W2GP08 - Phoenix Wright Ace Attorney Justice For All +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/W2MEBB.ini b/Data/Sys/GameSettings/W2MEBB.ini similarity index 100% rename from Data/User/GameConfig/W2MEBB.ini rename to Data/Sys/GameSettings/W2MEBB.ini diff --git a/Data/Sys/GameSettings/W3GE08.ini b/Data/Sys/GameSettings/W3GE08.ini new file mode 100644 index 0000000000..24dc6f7548 --- /dev/null +++ b/Data/Sys/GameSettings/W3GE08.ini @@ -0,0 +1,18 @@ +# W3GE08 - Phoenix Wright Ace Attorney Trials and Tribulations +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/W3GP08.ini b/Data/Sys/GameSettings/W3GP08.ini new file mode 100644 index 0000000000..72b60de292 --- /dev/null +++ b/Data/Sys/GameSettings/W3GP08.ini @@ -0,0 +1,18 @@ +# W3GP08 - Phoenix Wright Ace Attorney Trials and Tribulations +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/W8CEXS.ini b/Data/Sys/GameSettings/W8CEXS.ini similarity index 100% rename from Data/User/GameConfig/W8CEXS.ini rename to Data/Sys/GameSettings/W8CEXS.ini diff --git a/Data/User/GameConfig/W8CPXS.ini b/Data/Sys/GameSettings/W8CPXS.ini similarity index 100% rename from Data/User/GameConfig/W8CPXS.ini rename to Data/Sys/GameSettings/W8CPXS.ini diff --git a/Data/User/GameConfig/WA4P01.ini b/Data/Sys/GameSettings/WA4P01.ini similarity index 100% rename from Data/User/GameConfig/WA4P01.ini rename to Data/Sys/GameSettings/WA4P01.ini diff --git a/Data/User/GameConfig/WALE01.ini b/Data/Sys/GameSettings/WALE01.ini similarity index 100% rename from Data/User/GameConfig/WALE01.ini rename to Data/Sys/GameSettings/WALE01.ini diff --git a/Data/User/GameConfig/WAYETJ.ini b/Data/Sys/GameSettings/WAYETJ.ini similarity index 100% rename from Data/User/GameConfig/WAYETJ.ini rename to Data/Sys/GameSettings/WAYETJ.ini diff --git a/Data/Sys/GameSettings/WB2ETL.ini b/Data/Sys/GameSettings/WB2ETL.ini new file mode 100644 index 0000000000..5ea90f06c8 --- /dev/null +++ b/Data/Sys/GameSettings/WB2ETL.ini @@ -0,0 +1,17 @@ +# WB2ETL - Dangeresque 3 +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WB3ETL.ini b/Data/Sys/GameSettings/WB3ETL.ini new file mode 100644 index 0000000000..fb6c0cbd62 --- /dev/null +++ b/Data/Sys/GameSettings/WB3ETL.ini @@ -0,0 +1,17 @@ +# WB3ETL - 8-Bit Is Enough +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WB4EGL.ini b/Data/Sys/GameSettings/WB4EGL.ini new file mode 100644 index 0000000000..08a673b9ac --- /dev/null +++ b/Data/Sys/GameSettings/WB4EGL.ini @@ -0,0 +1,17 @@ +# WB4EGL - Wild West Guns +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Hacks] +EFBAccessEnable = True diff --git a/Data/Sys/GameSettings/WB6EGL.ini b/Data/Sys/GameSettings/WB6EGL.ini new file mode 100644 index 0000000000..1af5dfc320 --- /dev/null +++ b/Data/Sys/GameSettings/WB6EGL.ini @@ -0,0 +1,17 @@ +# WB6EGL - TV Show King +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WBLPGD.ini b/Data/Sys/GameSettings/WBLPGD.ini similarity index 100% rename from Data/User/GameConfig/WBLPGD.ini rename to Data/Sys/GameSettings/WBLPGD.ini diff --git a/Data/User/GameConfig/WBME01.ini b/Data/Sys/GameSettings/WBME01.ini similarity index 100% rename from Data/User/GameConfig/WBME01.ini rename to Data/Sys/GameSettings/WBME01.ini diff --git a/Data/User/GameConfig/WBQE18.ini b/Data/Sys/GameSettings/WBQE18.ini similarity index 100% rename from Data/User/GameConfig/WBQE18.ini rename to Data/Sys/GameSettings/WBQE18.ini diff --git a/Data/Sys/GameSettings/WBXETL.ini b/Data/Sys/GameSettings/WBXETL.ini new file mode 100644 index 0000000000..c8b46841c8 --- /dev/null +++ b/Data/Sys/GameSettings/WBXETL.ini @@ -0,0 +1,17 @@ +# WBXETL - Homestar Ruiner +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WBYETL.ini b/Data/Sys/GameSettings/WBYETL.ini new file mode 100644 index 0000000000..cade2f4991 --- /dev/null +++ b/Data/Sys/GameSettings/WBYETL.ini @@ -0,0 +1,17 @@ +# WBYETL - StrongBadia the Free +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WBZETL.ini b/Data/Sys/GameSettings/WBZETL.ini new file mode 100644 index 0000000000..1529c395fd --- /dev/null +++ b/Data/Sys/GameSettings/WBZETL.ini @@ -0,0 +1,17 @@ +# WBZETL - Baddest of the Bands +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WC6EUP.ini b/Data/Sys/GameSettings/WC6EUP.ini similarity index 74% rename from Data/User/GameConfig/WC6EUP.ini rename to Data/Sys/GameSettings/WC6EUP.ini index 366afca831..62567fa8d1 100644 --- a/Data/User/GameConfig/WC6EUP.ini +++ b/Data/Sys/GameSettings/WC6EUP.ini @@ -1,22 +1,21 @@ # WC6EUP - Chronos Twins DX - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 EmulationIssues = Disable EuRGB60 mode - [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 - +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WCHEJS.ini b/Data/Sys/GameSettings/WCHEJS.ini new file mode 100644 index 0000000000..2d36a7ca61 --- /dev/null +++ b/Data/Sys/GameSettings/WCHEJS.ini @@ -0,0 +1,21 @@ +# WCHEJS - Chess Challenge! +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +EFBToTextureEnable = False +EFBCopyEnable = True +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WCVENV.ini b/Data/Sys/GameSettings/WCVENV.ini similarity index 100% rename from Data/User/GameConfig/WCVENV.ini rename to Data/Sys/GameSettings/WCVENV.ini diff --git a/Data/User/GameConfig/WD9EA4.ini b/Data/Sys/GameSettings/WD9EA4.ini similarity index 100% rename from Data/User/GameConfig/WD9EA4.ini rename to Data/Sys/GameSettings/WD9EA4.ini diff --git a/Data/User/GameConfig/WDME01.ini b/Data/Sys/GameSettings/WDME01.ini similarity index 100% rename from Data/User/GameConfig/WDME01.ini rename to Data/Sys/GameSettings/WDME01.ini diff --git a/Data/User/GameConfig/WDMP01.ini b/Data/Sys/GameSettings/WDMP01.ini similarity index 100% rename from Data/User/GameConfig/WDMP01.ini rename to Data/Sys/GameSettings/WDMP01.ini diff --git a/Data/User/GameConfig/WERP18.ini b/Data/Sys/GameSettings/WERP18.ini similarity index 100% rename from Data/User/GameConfig/WERP18.ini rename to Data/Sys/GameSettings/WERP18.ini diff --git a/Data/User/GameConfig/WF4EGD.ini b/Data/Sys/GameSettings/WF4EGD.ini similarity index 100% rename from Data/User/GameConfig/WF4EGD.ini rename to Data/Sys/GameSettings/WF4EGD.ini diff --git a/Data/Sys/GameSettings/WFLE01.ini b/Data/Sys/GameSettings/WFLE01.ini new file mode 100644 index 0000000000..b5e7489086 --- /dev/null +++ b/Data/Sys/GameSettings/WFLE01.ini @@ -0,0 +1,16 @@ +# WFLE01 - Fluidity +[Core] +[EmuState] +EmulationStateId = 5 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/Sys/GameSettings/WFUEQQ.ini b/Data/Sys/GameSettings/WFUEQQ.ini new file mode 100644 index 0000000000..f86db23cda --- /dev/null +++ b/Data/Sys/GameSettings/WFUEQQ.ini @@ -0,0 +1,17 @@ +# WFUEQQ - Furry Legends +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WGDEA4.ini b/Data/Sys/GameSettings/WGDEA4.ini similarity index 100% rename from Data/User/GameConfig/WGDEA4.ini rename to Data/Sys/GameSettings/WGDEA4.ini diff --git a/Data/User/GameConfig/WGDPA4.ini b/Data/Sys/GameSettings/WGDPA4.ini similarity index 100% rename from Data/User/GameConfig/WGDPA4.ini rename to Data/Sys/GameSettings/WGDPA4.ini diff --git a/Data/User/GameConfig/WGOEWG.ini b/Data/Sys/GameSettings/WGOEWG.ini similarity index 100% rename from Data/User/GameConfig/WGOEWG.ini rename to Data/Sys/GameSettings/WGOEWG.ini diff --git a/Data/User/GameConfig/WGOPWG.ini b/Data/Sys/GameSettings/WGOPWG.ini similarity index 100% rename from Data/User/GameConfig/WGOPWG.ini rename to Data/Sys/GameSettings/WGOPWG.ini diff --git a/Data/Sys/GameSettings/WGSE08.ini b/Data/Sys/GameSettings/WGSE08.ini new file mode 100644 index 0000000000..e6e02e3c44 --- /dev/null +++ b/Data/Sys/GameSettings/WGSE08.ini @@ -0,0 +1,22 @@ +# WGSE08 - PWAA Ace Attorney +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/Sys/GameSettings/WGSP08.ini b/Data/Sys/GameSettings/WGSP08.ini new file mode 100644 index 0000000000..8bf5201a6b --- /dev/null +++ b/Data/Sys/GameSettings/WGSP08.ini @@ -0,0 +1,22 @@ +# WGSP08 - PWAA Ace Attorney +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBEmulateFormatChanges = True +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/WGYEHN.ini b/Data/Sys/GameSettings/WGYEHN.ini similarity index 100% rename from Data/User/GameConfig/WGYEHN.ini rename to Data/Sys/GameSettings/WGYEHN.ini diff --git a/Data/User/GameConfig/WHFETY.ini b/Data/Sys/GameSettings/WHFETY.ini similarity index 85% rename from Data/User/GameConfig/WHFETY.ini rename to Data/Sys/GameSettings/WHFETY.ini index 242d398951..bc351b7767 100644 --- a/Data/User/GameConfig/WHFETY.ini +++ b/Data/Sys/GameSettings/WHFETY.ini @@ -6,7 +6,7 @@ [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. @@ -20,3 +20,6 @@ EmulationIssues = [Video] ProjectionHack = 0 +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WHUEGL.ini b/Data/Sys/GameSettings/WHUEGL.ini new file mode 100644 index 0000000000..5422ff12a6 --- /dev/null +++ b/Data/Sys/GameSettings/WHUEGL.ini @@ -0,0 +1,30 @@ +# WHUEGL - Ghost Mansion Party + +[Core] +# Values set here will override the main dolphin settings. + +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = + +[OnLoad] +# Add memory patches to be loaded once on boot here. + +[OnFrame] +# Add memory patches to be applied every frame here. + +[ActionReplay] +# Add action replay cheats here. + +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = + +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WHWEFJ.ini b/Data/Sys/GameSettings/WHWEFJ.ini new file mode 100644 index 0000000000..f281b7133f --- /dev/null +++ b/Data/Sys/GameSettings/WHWEFJ.ini @@ -0,0 +1,19 @@ +# WHWEFJ - HoopWorld +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/Sys/GameSettings/WHWPFJ.ini b/Data/Sys/GameSettings/WHWPFJ.ini new file mode 100644 index 0000000000..afaf2267c4 --- /dev/null +++ b/Data/Sys/GameSettings/WHWPFJ.ini @@ -0,0 +1,19 @@ +# WHWPFJ - HoopWorld +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/WICPKQ.ini b/Data/Sys/GameSettings/WICPKQ.ini similarity index 100% rename from Data/User/GameConfig/WICPKQ.ini rename to Data/Sys/GameSettings/WICPKQ.ini diff --git a/Data/User/GameConfig/WIDEUN.ini b/Data/Sys/GameSettings/WIDEUN.ini similarity index 100% rename from Data/User/GameConfig/WIDEUN.ini rename to Data/Sys/GameSettings/WIDEUN.ini diff --git a/Data/User/GameConfig/WILETL.ini b/Data/Sys/GameSettings/WILETL.ini similarity index 100% rename from Data/User/GameConfig/WILETL.ini rename to Data/Sys/GameSettings/WILETL.ini diff --git a/Data/User/GameConfig/WIYETL.ini b/Data/Sys/GameSettings/WIYETL.ini similarity index 100% rename from Data/User/GameConfig/WIYETL.ini rename to Data/Sys/GameSettings/WIYETL.ini diff --git a/Data/User/GameConfig/WJEEJX.ini b/Data/Sys/GameSettings/WJEEJX.ini similarity index 100% rename from Data/User/GameConfig/WJEEJX.ini rename to Data/Sys/GameSettings/WJEEJX.ini diff --git a/Data/User/GameConfig/WKTJA4.ini b/Data/Sys/GameSettings/WKTJA4.ini similarity index 100% rename from Data/User/GameConfig/WKTJA4.ini rename to Data/Sys/GameSettings/WKTJA4.ini diff --git a/Data/User/GameConfig/WKTPA4.ini b/Data/Sys/GameSettings/WKTPA4.ini similarity index 100% rename from Data/User/GameConfig/WKTPA4.ini rename to Data/Sys/GameSettings/WKTPA4.ini diff --git a/Data/Sys/GameSettings/WLEELU.ini b/Data/Sys/GameSettings/WLEELU.ini new file mode 100644 index 0000000000..b09fbbb3bf --- /dev/null +++ b/Data/Sys/GameSettings/WLEELU.ini @@ -0,0 +1,17 @@ +# WLEELU - PooYoos Episode 1 +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WLNELU.ini b/Data/Sys/GameSettings/WLNELU.ini new file mode 100644 index 0000000000..dc755d3671 --- /dev/null +++ b/Data/Sys/GameSettings/WLNELU.ini @@ -0,0 +1,17 @@ +# WLNELU - PooYoos Episode 2 +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WLOEHL.ini b/Data/Sys/GameSettings/WLOEHL.ini similarity index 100% rename from Data/User/GameConfig/WLOEHL.ini rename to Data/Sys/GameSettings/WLOEHL.ini diff --git a/Data/User/GameConfig/WLWEHL.ini b/Data/Sys/GameSettings/WLWEHL.ini similarity index 100% rename from Data/User/GameConfig/WLWEHL.ini rename to Data/Sys/GameSettings/WLWEHL.ini diff --git a/Data/User/GameConfig/WM8E18.ini b/Data/Sys/GameSettings/WM8E18.ini similarity index 100% rename from Data/User/GameConfig/WM8E18.ini rename to Data/Sys/GameSettings/WM8E18.ini diff --git a/Data/User/GameConfig/WMBP01.ini b/Data/Sys/GameSettings/WMBP01.ini similarity index 100% rename from Data/User/GameConfig/WMBP01.ini rename to Data/Sys/GameSettings/WMBP01.ini diff --git a/Data/User/GameConfig/WMMEAF.ini b/Data/Sys/GameSettings/WMMEAF.ini similarity index 100% rename from Data/User/GameConfig/WMMEAF.ini rename to Data/Sys/GameSettings/WMMEAF.ini diff --git a/Data/User/GameConfig/WOTEM0.ini b/Data/Sys/GameSettings/WOTEM0.ini similarity index 100% rename from Data/User/GameConfig/WOTEM0.ini rename to Data/Sys/GameSettings/WOTEM0.ini diff --git a/Data/Sys/GameSettings/WOYEPS.ini b/Data/Sys/GameSettings/WOYEPS.ini new file mode 100644 index 0000000000..a47a61a5fa --- /dev/null +++ b/Data/Sys/GameSettings/WOYEPS.ini @@ -0,0 +1,18 @@ +# WOYEPS - Bit Boy!! +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Gecko] +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/Sys/GameSettings/WPCE01.ini b/Data/Sys/GameSettings/WPCE01.ini new file mode 100644 index 0000000000..632a6849a1 --- /dev/null +++ b/Data/Sys/GameSettings/WPCE01.ini @@ -0,0 +1,18 @@ +# WPCE01 - Doc's Punch-Out!! +[Core] +# Values set here will override the main dolphin settings. +[EmuState] +# The Emulation State. 1 is worst, 5 is best, 0 is not set. +EmulationStateId = 4 +EmulationIssues = Disable EuRGB60 mode +[OnLoad] +# Add memory patches to be loaded once on boot here. +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = diff --git a/Data/Sys/GameSettings/WPJEJW.ini b/Data/Sys/GameSettings/WPJEJW.ini new file mode 100644 index 0000000000..4c2ad883b7 --- /dev/null +++ b/Data/Sys/GameSettings/WPJEJW.ini @@ -0,0 +1,16 @@ +# WPJEJW - Pucca's kisses game +[Core] +[EmuState] +EmulationStateId = 5 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/WPPEXS.ini b/Data/Sys/GameSettings/WPPEXS.ini similarity index 100% rename from Data/User/GameConfig/WPPEXS.ini rename to Data/Sys/GameSettings/WPPEXS.ini diff --git a/Data/User/GameConfig/WPPJJF.ini b/Data/Sys/GameSettings/WPPJJF.ini similarity index 100% rename from Data/User/GameConfig/WPPJJF.ini rename to Data/Sys/GameSettings/WPPJJF.ini diff --git a/Data/User/GameConfig/WPSE01.ini b/Data/Sys/GameSettings/WPSE01.ini similarity index 100% rename from Data/User/GameConfig/WPSE01.ini rename to Data/Sys/GameSettings/WPSE01.ini diff --git a/Data/Sys/GameSettings/WPUEGD.ini b/Data/Sys/GameSettings/WPUEGD.ini new file mode 100644 index 0000000000..4b14ae7d37 --- /dev/null +++ b/Data/Sys/GameSettings/WPUEGD.ini @@ -0,0 +1,17 @@ +# WPUEGD - Bust A Move Plus +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False diff --git a/Data/User/GameConfig/WPYPPY.ini b/Data/Sys/GameSettings/WPYPPY.ini similarity index 100% rename from Data/User/GameConfig/WPYPPY.ini rename to Data/Sys/GameSettings/WPYPPY.ini diff --git a/Data/User/GameConfig/WR9E08.ini b/Data/Sys/GameSettings/WR9E08.ini similarity index 100% rename from Data/User/GameConfig/WR9E08.ini rename to Data/Sys/GameSettings/WR9E08.ini diff --git a/Data/User/GameConfig/WR9P08.ini b/Data/Sys/GameSettings/WR9P08.ini similarity index 100% rename from Data/User/GameConfig/WR9P08.ini rename to Data/Sys/GameSettings/WR9P08.ini diff --git a/Data/User/GameConfig/WRGEHU.ini b/Data/Sys/GameSettings/WRGEHU.ini similarity index 100% rename from Data/User/GameConfig/WRGEHU.ini rename to Data/Sys/GameSettings/WRGEHU.ini diff --git a/Data/Sys/GameSettings/WRIEGD.ini b/Data/Sys/GameSettings/WRIEGD.ini new file mode 100644 index 0000000000..58b8b25bfd --- /dev/null +++ b/Data/Sys/GameSettings/WRIEGD.ini @@ -0,0 +1,17 @@ +# WRIEGD - RAINBOW ISLANDS T.A. +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/WRIPGD.ini b/Data/Sys/GameSettings/WRIPGD.ini similarity index 87% rename from Data/User/GameConfig/WRIPGD.ini rename to Data/Sys/GameSettings/WRIPGD.ini index 0441b63e2e..932e440ba4 100644 --- a/Data/User/GameConfig/WRIPGD.ini +++ b/Data/Sys/GameSettings/WRIPGD.ini @@ -20,3 +20,6 @@ EmulationIssues = [Video] ProjectionHack = 0 +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/WRUPXS.ini b/Data/Sys/GameSettings/WRUPXS.ini similarity index 100% rename from Data/User/GameConfig/WRUPXS.ini rename to Data/Sys/GameSettings/WRUPXS.ini diff --git a/Data/User/GameConfig/WRXE08.ini b/Data/Sys/GameSettings/WRXE08.ini similarity index 100% rename from Data/User/GameConfig/WRXE08.ini rename to Data/Sys/GameSettings/WRXE08.ini diff --git a/Data/User/GameConfig/WSNE8P.ini b/Data/Sys/GameSettings/WSNE8P.ini similarity index 100% rename from Data/User/GameConfig/WSNE8P.ini rename to Data/Sys/GameSettings/WSNE8P.ini diff --git a/Data/Sys/GameSettings/WTEELU.ini b/Data/Sys/GameSettings/WTEELU.ini new file mode 100644 index 0000000000..289c72bd9d --- /dev/null +++ b/Data/Sys/GameSettings/WTEELU.ini @@ -0,0 +1,20 @@ +# WTEELU - Tales of Elastic Boy Mission 1 +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +UseXFB = True +UseRealXFB = False +[Video_Hacks] +EFBToTextureEnable = False +EFBCopyEnable = True diff --git a/Data/User/GameConfig/WTKEGL.ini b/Data/Sys/GameSettings/WTKEGL.ini similarity index 68% rename from Data/User/GameConfig/WTKEGL.ini rename to Data/Sys/GameSettings/WTKEGL.ini index 532b1b5f75..fffe3a11c2 100644 --- a/Data/User/GameConfig/WTKEGL.ini +++ b/Data/Sys/GameSettings/WTKEGL.ini @@ -1,22 +1,20 @@ # WTKEGL - TV Show King 2 - [Core] # Values set here will override the main dolphin settings. - [EmuState] # The Emulation State. 1 is worst, 5 is best, 0 is not set. EmulationStateId = 4 -EmulationIssues = - +EmulationIssues = [OnLoad] # Add memory patches to be loaded once on boot here. - [OnFrame] -# Add memory patches to be applied every frame here. - [ActionReplay] -# Add action replay cheats here. - [Video] ProjectionHack = 0 - +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 512 diff --git a/Data/User/GameConfig/WTRPXS.ini b/Data/Sys/GameSettings/WTRPXS.ini similarity index 100% rename from Data/User/GameConfig/WTRPXS.ini rename to Data/Sys/GameSettings/WTRPXS.ini diff --git a/Data/User/GameConfig/WTTPTW.ini b/Data/Sys/GameSettings/WTTPTW.ini similarity index 100% rename from Data/User/GameConfig/WTTPTW.ini rename to Data/Sys/GameSettings/WTTPTW.ini diff --git a/Data/User/GameConfig/WTXPJS.ini b/Data/Sys/GameSettings/WTXPJS.ini similarity index 100% rename from Data/User/GameConfig/WTXPJS.ini rename to Data/Sys/GameSettings/WTXPJS.ini diff --git a/Data/User/GameConfig/WWRE01.ini b/Data/Sys/GameSettings/WWRE01.ini similarity index 100% rename from Data/User/GameConfig/WWRE01.ini rename to Data/Sys/GameSettings/WWRE01.ini diff --git a/Data/Sys/GameSettings/WXBEA4.ini b/Data/Sys/GameSettings/WXBEA4.ini new file mode 100644 index 0000000000..6db7604fba --- /dev/null +++ b/Data/Sys/GameSettings/WXBEA4.ini @@ -0,0 +1,16 @@ +# WXBEA4 - Ben 10 Alien Force +[Core] +[EmuState] +EmulationStateId = 4 +EmulationIssues = +[OnFrame] +[ActionReplay] +[Video] +ProjectionHack = 0 +PH_SZNear = 0 +PH_SZFar = 0 +PH_ExtraParam = 0 +PH_ZNear = +PH_ZFar = +[Video_Settings] +SafeTextureCacheColorSamples = 0 diff --git a/Data/User/GameConfig/WZIPTW.ini b/Data/Sys/GameSettings/WZIPTW.ini similarity index 100% rename from Data/User/GameConfig/WZIPTW.ini rename to Data/Sys/GameSettings/WZIPTW.ini diff --git a/Data/User/GameConfig/WZPPRZ.ini b/Data/Sys/GameSettings/WZPPRZ.ini similarity index 100% rename from Data/User/GameConfig/WZPPRZ.ini rename to Data/Sys/GameSettings/WZPPRZ.ini diff --git a/Data/User/Maps/GFZE01.map b/Data/Sys/Maps/GFZE01.map similarity index 100% rename from Data/User/Maps/GFZE01.map rename to Data/Sys/Maps/GFZE01.map diff --git a/Data/User/Maps/GMBE8P.map b/Data/Sys/Maps/GMBE8P.map similarity index 100% rename from Data/User/Maps/GMBE8P.map rename to Data/Sys/Maps/GMBE8P.map diff --git a/Data/User/OpenCL/TextureDecoder.cl b/Data/Sys/OpenCL/TextureDecoder.cl similarity index 100% rename from Data/User/OpenCL/TextureDecoder.cl rename to Data/Sys/OpenCL/TextureDecoder.cl diff --git a/Data/User/Shaders/16bit.txt b/Data/Sys/Shaders/16bit.glsl similarity index 100% rename from Data/User/Shaders/16bit.txt rename to Data/Sys/Shaders/16bit.glsl diff --git a/Data/User/Shaders/32bit.txt b/Data/Sys/Shaders/32bit.glsl similarity index 100% rename from Data/User/Shaders/32bit.txt rename to Data/Sys/Shaders/32bit.glsl diff --git a/Data/Sys/Shaders/FXAA.glsl b/Data/Sys/Shaders/FXAA.glsl new file mode 100644 index 0000000000..99caff7d03 --- /dev/null +++ b/Data/Sys/Shaders/FXAA.glsl @@ -0,0 +1,75 @@ +/* + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2013 mudlord + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. +*/ + +uniform sampler2D samp9; + +out vec4 ocol0; +in vec2 uv0; + +uniform vec4 resolution; +#define FXAA_REDUCE_MIN (1.0/ 128.0) +#define FXAA_REDUCE_MUL (1.0 / 8.0) +#define FXAA_SPAN_MAX 8.0 + +vec4 applyFXAA(vec2 fragCoord, sampler2D tex) +{ + vec4 color; + vec2 inverseVP = resolution.zw; + vec3 rgbNW = texture(tex, (fragCoord + vec2(-1.0, -1.0)) * inverseVP).xyz; + vec3 rgbNE = texture(tex, (fragCoord + vec2(1.0, -1.0)) * inverseVP).xyz; + vec3 rgbSW = texture(tex, (fragCoord + vec2(-1.0, 1.0)) * inverseVP).xyz; + vec3 rgbSE = texture(tex, (fragCoord + vec2(1.0, 1.0)) * inverseVP).xyz; + vec3 rgbM = texture(tex, fragCoord * inverseVP).xyz; + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); + + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); + + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * + (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); + + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), + dir * rcpDirMin)) * inverseVP; + + vec3 rgbA = 0.5 * ( + texture(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz + + texture(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz); + vec3 rgbB = rgbA * 0.5 + 0.25 * ( + texture(tex, fragCoord * inverseVP + dir * -0.5).xyz + + texture(tex, fragCoord * inverseVP + dir * 0.5).xyz); + + float lumaB = dot(rgbB, luma); + if ((lumaB < lumaMin) || (lumaB > lumaMax)) + color = vec4(rgbA, 1.0); + else + color = vec4(rgbB, 1.0); + return color; +} + +void main() +{ + ocol0 = applyFXAA(uv0 * resolution.xy, samp9); +} diff --git a/Data/User/Shaders/README.txt b/Data/Sys/Shaders/README.txt similarity index 100% rename from Data/User/Shaders/README.txt rename to Data/Sys/Shaders/README.txt diff --git a/Data/User/Shaders/acidmetal.txt b/Data/Sys/Shaders/acidmetal.glsl similarity index 100% rename from Data/User/Shaders/acidmetal.txt rename to Data/Sys/Shaders/acidmetal.glsl diff --git a/Data/User/Shaders/acidtrip.txt b/Data/Sys/Shaders/acidtrip.glsl similarity index 100% rename from Data/User/Shaders/acidtrip.txt rename to Data/Sys/Shaders/acidtrip.glsl diff --git a/Data/User/Shaders/acidtrip2.txt b/Data/Sys/Shaders/acidtrip2.glsl similarity index 100% rename from Data/User/Shaders/acidtrip2.txt rename to Data/Sys/Shaders/acidtrip2.glsl diff --git a/Data/User/Shaders/asciiart.txt b/Data/Sys/Shaders/asciiart.glsl similarity index 100% rename from Data/User/Shaders/asciiart.txt rename to Data/Sys/Shaders/asciiart.glsl diff --git a/Data/User/Shaders/auto_toon.txt b/Data/Sys/Shaders/auto_toon.glsl similarity index 100% rename from Data/User/Shaders/auto_toon.txt rename to Data/Sys/Shaders/auto_toon.glsl diff --git a/Data/User/Shaders/auto_toon2.txt b/Data/Sys/Shaders/auto_toon2.glsl similarity index 100% rename from Data/User/Shaders/auto_toon2.txt rename to Data/Sys/Shaders/auto_toon2.glsl diff --git a/Data/User/Shaders/bad_bloom.txt b/Data/Sys/Shaders/bad_bloom.glsl similarity index 100% rename from Data/User/Shaders/bad_bloom.txt rename to Data/Sys/Shaders/bad_bloom.glsl diff --git a/Data/User/Shaders/brighten.txt b/Data/Sys/Shaders/brighten.glsl similarity index 100% rename from Data/User/Shaders/brighten.txt rename to Data/Sys/Shaders/brighten.glsl diff --git a/Data/User/Shaders/chrismas.txt b/Data/Sys/Shaders/chrismas.glsl similarity index 100% rename from Data/User/Shaders/chrismas.txt rename to Data/Sys/Shaders/chrismas.glsl diff --git a/Data/User/Shaders/cool1.txt b/Data/Sys/Shaders/cool1.glsl similarity index 100% rename from Data/User/Shaders/cool1.txt rename to Data/Sys/Shaders/cool1.glsl diff --git a/Data/User/Shaders/darkerbrighter.txt b/Data/Sys/Shaders/darkerbrighter.glsl similarity index 100% rename from Data/User/Shaders/darkerbrighter.txt rename to Data/Sys/Shaders/darkerbrighter.glsl diff --git a/Data/User/Shaders/emboss.txt b/Data/Sys/Shaders/emboss.glsl similarity index 100% rename from Data/User/Shaders/emboss.txt rename to Data/Sys/Shaders/emboss.glsl diff --git a/Data/User/Shaders/fire.txt b/Data/Sys/Shaders/fire.glsl similarity index 100% rename from Data/User/Shaders/fire.txt rename to Data/Sys/Shaders/fire.glsl diff --git a/Data/User/Shaders/fire2.txt b/Data/Sys/Shaders/fire2.glsl similarity index 100% rename from Data/User/Shaders/fire2.txt rename to Data/Sys/Shaders/fire2.glsl diff --git a/Data/User/Shaders/firewater.txt b/Data/Sys/Shaders/firewater.glsl similarity index 100% rename from Data/User/Shaders/firewater.txt rename to Data/Sys/Shaders/firewater.glsl diff --git a/Data/User/Shaders/grayscale.txt b/Data/Sys/Shaders/grayscale.glsl similarity index 100% rename from Data/User/Shaders/grayscale.txt rename to Data/Sys/Shaders/grayscale.glsl diff --git a/Data/User/Shaders/grayscale2.txt b/Data/Sys/Shaders/grayscale2.glsl similarity index 100% rename from Data/User/Shaders/grayscale2.txt rename to Data/Sys/Shaders/grayscale2.glsl diff --git a/Data/User/Shaders/invert.txt b/Data/Sys/Shaders/invert.glsl similarity index 100% rename from Data/User/Shaders/invert.txt rename to Data/Sys/Shaders/invert.glsl diff --git a/Data/User/Shaders/invert_blue.txt b/Data/Sys/Shaders/invert_blue.glsl similarity index 100% rename from Data/User/Shaders/invert_blue.txt rename to Data/Sys/Shaders/invert_blue.glsl diff --git a/Data/User/Shaders/invertedoutline.txt b/Data/Sys/Shaders/invertedoutline.glsl similarity index 100% rename from Data/User/Shaders/invertedoutline.txt rename to Data/Sys/Shaders/invertedoutline.glsl diff --git a/Data/User/Shaders/mad_world.txt b/Data/Sys/Shaders/mad_world.glsl similarity index 100% rename from Data/User/Shaders/mad_world.txt rename to Data/Sys/Shaders/mad_world.glsl diff --git a/Data/User/Shaders/nightvision.txt b/Data/Sys/Shaders/nightvision.glsl similarity index 100% rename from Data/User/Shaders/nightvision.txt rename to Data/Sys/Shaders/nightvision.glsl diff --git a/Data/User/Shaders/nightvision2.txt b/Data/Sys/Shaders/nightvision2.glsl similarity index 100% rename from Data/User/Shaders/nightvision2.txt rename to Data/Sys/Shaders/nightvision2.glsl diff --git a/Data/User/Shaders/nightvision2scanlines.txt b/Data/Sys/Shaders/nightvision2scanlines.glsl similarity index 100% rename from Data/User/Shaders/nightvision2scanlines.txt rename to Data/Sys/Shaders/nightvision2scanlines.glsl diff --git a/Data/User/Shaders/posterize.txt b/Data/Sys/Shaders/posterize.glsl similarity index 100% rename from Data/User/Shaders/posterize.txt rename to Data/Sys/Shaders/posterize.glsl diff --git a/Data/User/Shaders/posterize2.txt b/Data/Sys/Shaders/posterize2.glsl similarity index 100% rename from Data/User/Shaders/posterize2.txt rename to Data/Sys/Shaders/posterize2.glsl diff --git a/Data/User/Shaders/primarycolors.txt b/Data/Sys/Shaders/primarycolors.glsl similarity index 100% rename from Data/User/Shaders/primarycolors.txt rename to Data/Sys/Shaders/primarycolors.glsl diff --git a/Data/User/Shaders/sepia.txt b/Data/Sys/Shaders/sepia.glsl similarity index 100% rename from Data/User/Shaders/sepia.txt rename to Data/Sys/Shaders/sepia.glsl diff --git a/Data/User/Shaders/sketchy.txt b/Data/Sys/Shaders/sketchy.glsl similarity index 100% rename from Data/User/Shaders/sketchy.txt rename to Data/Sys/Shaders/sketchy.glsl diff --git a/Data/User/Shaders/spookey1.txt b/Data/Sys/Shaders/spookey1.glsl similarity index 100% rename from Data/User/Shaders/spookey1.txt rename to Data/Sys/Shaders/spookey1.glsl diff --git a/Data/User/Shaders/spookey2.txt b/Data/Sys/Shaders/spookey2.glsl similarity index 100% rename from Data/User/Shaders/spookey2.txt rename to Data/Sys/Shaders/spookey2.glsl diff --git a/Data/User/Shaders/stereoscopic.txt b/Data/Sys/Shaders/stereoscopic.glsl similarity index 100% rename from Data/User/Shaders/stereoscopic.txt rename to Data/Sys/Shaders/stereoscopic.glsl diff --git a/Data/User/Shaders/stereoscopic2.txt b/Data/Sys/Shaders/stereoscopic2.glsl similarity index 100% rename from Data/User/Shaders/stereoscopic2.txt rename to Data/Sys/Shaders/stereoscopic2.glsl diff --git a/Data/User/Shaders/sunset.txt b/Data/Sys/Shaders/sunset.glsl similarity index 100% rename from Data/User/Shaders/sunset.txt rename to Data/Sys/Shaders/sunset.glsl diff --git a/Data/User/Shaders/swap_RGB_BGR.txt b/Data/Sys/Shaders/swap_RGB_BGR.glsl similarity index 100% rename from Data/User/Shaders/swap_RGB_BGR.txt rename to Data/Sys/Shaders/swap_RGB_BGR.glsl diff --git a/Data/User/Shaders/swap_RGB_BRG.txt b/Data/Sys/Shaders/swap_RGB_BRG.glsl similarity index 100% rename from Data/User/Shaders/swap_RGB_BRG.txt rename to Data/Sys/Shaders/swap_RGB_BRG.glsl diff --git a/Data/User/Shaders/swap_RGB_GBR.txt b/Data/Sys/Shaders/swap_RGB_GBR.glsl similarity index 100% rename from Data/User/Shaders/swap_RGB_GBR.txt rename to Data/Sys/Shaders/swap_RGB_GBR.glsl diff --git a/Data/User/Shaders/swap_RGB_GRB.txt b/Data/Sys/Shaders/swap_RGB_GRB.glsl similarity index 100% rename from Data/User/Shaders/swap_RGB_GRB.txt rename to Data/Sys/Shaders/swap_RGB_GRB.glsl diff --git a/Data/User/Shaders/swap_RGB_RBG.txt b/Data/Sys/Shaders/swap_RGB_RBG.glsl similarity index 100% rename from Data/User/Shaders/swap_RGB_RBG.txt rename to Data/Sys/Shaders/swap_RGB_RBG.glsl diff --git a/Data/User/Shaders/toxic.txt b/Data/Sys/Shaders/toxic.glsl similarity index 100% rename from Data/User/Shaders/toxic.txt rename to Data/Sys/Shaders/toxic.glsl diff --git a/Data/User/Themes/Boomy/README.txt b/Data/Sys/Themes/Boomy/README.txt similarity index 100% rename from Data/User/Themes/Boomy/README.txt rename to Data/Sys/Themes/Boomy/README.txt diff --git a/Data/User/Themes/Boomy/browse.png b/Data/Sys/Themes/Boomy/browse.png similarity index 100% rename from Data/User/Themes/Boomy/browse.png rename to Data/Sys/Themes/Boomy/browse.png diff --git a/Data/User/Themes/Boomy/config.png b/Data/Sys/Themes/Boomy/config.png similarity index 100% rename from Data/User/Themes/Boomy/config.png rename to Data/Sys/Themes/Boomy/config.png diff --git a/Data/User/Themes/Boomy/dsp.png b/Data/Sys/Themes/Boomy/dsp.png similarity index 100% rename from Data/User/Themes/Boomy/dsp.png rename to Data/Sys/Themes/Boomy/dsp.png diff --git a/Data/User/Themes/Boomy/fullscreen.png b/Data/Sys/Themes/Boomy/fullscreen.png similarity index 100% rename from Data/User/Themes/Boomy/fullscreen.png rename to Data/Sys/Themes/Boomy/fullscreen.png diff --git a/Data/User/Themes/Boomy/gcpad.png b/Data/Sys/Themes/Boomy/gcpad.png similarity index 100% rename from Data/User/Themes/Boomy/gcpad.png rename to Data/Sys/Themes/Boomy/gcpad.png diff --git a/Data/User/Themes/Boomy/graphics.png b/Data/Sys/Themes/Boomy/graphics.png similarity index 100% rename from Data/User/Themes/Boomy/graphics.png rename to Data/Sys/Themes/Boomy/graphics.png diff --git a/Data/User/Themes/Boomy/help.png b/Data/Sys/Themes/Boomy/help.png similarity index 100% rename from Data/User/Themes/Boomy/help.png rename to Data/Sys/Themes/Boomy/help.png diff --git a/Data/User/Themes/Boomy/nobanner.png b/Data/Sys/Themes/Boomy/nobanner.png similarity index 100% rename from Data/User/Themes/Boomy/nobanner.png rename to Data/Sys/Themes/Boomy/nobanner.png diff --git a/Data/User/Themes/Boomy/open.png b/Data/Sys/Themes/Boomy/open.png similarity index 100% rename from Data/User/Themes/Boomy/open.png rename to Data/Sys/Themes/Boomy/open.png diff --git a/Data/User/Themes/Boomy/pause.png b/Data/Sys/Themes/Boomy/pause.png similarity index 100% rename from Data/User/Themes/Boomy/pause.png rename to Data/Sys/Themes/Boomy/pause.png diff --git a/Data/User/Themes/Boomy/play.png b/Data/Sys/Themes/Boomy/play.png similarity index 100% rename from Data/User/Themes/Boomy/play.png rename to Data/Sys/Themes/Boomy/play.png diff --git a/Data/User/Themes/Boomy/refresh.png b/Data/Sys/Themes/Boomy/refresh.png similarity index 100% rename from Data/User/Themes/Boomy/refresh.png rename to Data/Sys/Themes/Boomy/refresh.png diff --git a/Data/User/Themes/Boomy/screenshot.png b/Data/Sys/Themes/Boomy/screenshot.png similarity index 100% rename from Data/User/Themes/Boomy/screenshot.png rename to Data/Sys/Themes/Boomy/screenshot.png diff --git a/Data/User/Themes/Boomy/stop.png b/Data/Sys/Themes/Boomy/stop.png similarity index 100% rename from Data/User/Themes/Boomy/stop.png rename to Data/Sys/Themes/Boomy/stop.png diff --git a/Data/User/Themes/Boomy/wiimote.png b/Data/Sys/Themes/Boomy/wiimote.png similarity index 100% rename from Data/User/Themes/Boomy/wiimote.png rename to Data/Sys/Themes/Boomy/wiimote.png diff --git a/Data/Sys/Themes/Clean Blue/README.txt b/Data/Sys/Themes/Clean Blue/README.txt new file mode 100644 index 0000000000..a878862e20 --- /dev/null +++ b/Data/Sys/Themes/Clean Blue/README.txt @@ -0,0 +1,3 @@ +By Michael "MaJoR" Roesch of the Dolphin team + +dolphin-emu.org \ No newline at end of file diff --git a/Data/Sys/Themes/Clean Blue/browse.png b/Data/Sys/Themes/Clean Blue/browse.png new file mode 100644 index 0000000000..2a56c14340 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/browse.png differ diff --git a/Data/Sys/Themes/Clean Blue/browse@2x.png b/Data/Sys/Themes/Clean Blue/browse@2x.png new file mode 100644 index 0000000000..d7827bd8c2 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/browse@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/config.png b/Data/Sys/Themes/Clean Blue/config.png new file mode 100644 index 0000000000..487d479e08 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/config.png differ diff --git a/Data/Sys/Themes/Clean Blue/config@2x.png b/Data/Sys/Themes/Clean Blue/config@2x.png new file mode 100644 index 0000000000..5817b14120 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/config@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/dsp.png b/Data/Sys/Themes/Clean Blue/dsp.png new file mode 100644 index 0000000000..7dd741e2ab Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/dsp.png differ diff --git a/Data/Sys/Themes/Clean Blue/dsp@2x.png b/Data/Sys/Themes/Clean Blue/dsp@2x.png new file mode 100644 index 0000000000..ecf700d548 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/dsp@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/fullscreen.png b/Data/Sys/Themes/Clean Blue/fullscreen.png new file mode 100644 index 0000000000..841066905e Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/fullscreen.png differ diff --git a/Data/Sys/Themes/Clean Blue/fullscreen@2x.png b/Data/Sys/Themes/Clean Blue/fullscreen@2x.png new file mode 100644 index 0000000000..58398564d1 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/fullscreen@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/gcpad.png b/Data/Sys/Themes/Clean Blue/gcpad.png new file mode 100644 index 0000000000..5df7494c6a Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/gcpad.png differ diff --git a/Data/Sys/Themes/Clean Blue/gcpad@2x.png b/Data/Sys/Themes/Clean Blue/gcpad@2x.png new file mode 100644 index 0000000000..e76d316bb5 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/gcpad@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/graphics.png b/Data/Sys/Themes/Clean Blue/graphics.png new file mode 100644 index 0000000000..f0b30dbccf Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/graphics.png differ diff --git a/Data/Sys/Themes/Clean Blue/graphics@2x.png b/Data/Sys/Themes/Clean Blue/graphics@2x.png new file mode 100644 index 0000000000..5b2b940b88 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/graphics@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/nobanner.png b/Data/Sys/Themes/Clean Blue/nobanner.png new file mode 100644 index 0000000000..08a3088431 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/nobanner.png differ diff --git a/Data/Sys/Themes/Clean Blue/nobanner@2x.png b/Data/Sys/Themes/Clean Blue/nobanner@2x.png new file mode 100644 index 0000000000..8ad3b2c843 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/nobanner@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/open.png b/Data/Sys/Themes/Clean Blue/open.png new file mode 100644 index 0000000000..c541bf50d3 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/open.png differ diff --git a/Data/Sys/Themes/Clean Blue/open@2x.png b/Data/Sys/Themes/Clean Blue/open@2x.png new file mode 100644 index 0000000000..61ebd2dbd1 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/open@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/pause.png b/Data/Sys/Themes/Clean Blue/pause.png new file mode 100644 index 0000000000..49d7a76347 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/pause.png differ diff --git a/Data/Sys/Themes/Clean Blue/pause@2x.png b/Data/Sys/Themes/Clean Blue/pause@2x.png new file mode 100644 index 0000000000..43bd3efe1e Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/pause@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/play.png b/Data/Sys/Themes/Clean Blue/play.png new file mode 100644 index 0000000000..1291f9a100 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/play.png differ diff --git a/Data/Sys/Themes/Clean Blue/play@2x.png b/Data/Sys/Themes/Clean Blue/play@2x.png new file mode 100644 index 0000000000..3d235ed1a8 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/play@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/refresh.png b/Data/Sys/Themes/Clean Blue/refresh.png new file mode 100644 index 0000000000..da87dba760 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/refresh.png differ diff --git a/Data/Sys/Themes/Clean Blue/refresh@2x.png b/Data/Sys/Themes/Clean Blue/refresh@2x.png new file mode 100644 index 0000000000..7c72f9179e Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/refresh@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/screenshot.png b/Data/Sys/Themes/Clean Blue/screenshot.png new file mode 100644 index 0000000000..82c7599c1f Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/screenshot.png differ diff --git a/Data/Sys/Themes/Clean Blue/screenshot@2x.png b/Data/Sys/Themes/Clean Blue/screenshot@2x.png new file mode 100644 index 0000000000..ad951fe53e Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/screenshot@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/stop.png b/Data/Sys/Themes/Clean Blue/stop.png new file mode 100644 index 0000000000..a95666b191 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/stop.png differ diff --git a/Data/Sys/Themes/Clean Blue/stop@2x.png b/Data/Sys/Themes/Clean Blue/stop@2x.png new file mode 100644 index 0000000000..013e41296f Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/stop@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/wiimote.png b/Data/Sys/Themes/Clean Blue/wiimote.png new file mode 100644 index 0000000000..fcc6106425 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/wiimote.png differ diff --git a/Data/Sys/Themes/Clean Blue/wiimote@2x.png b/Data/Sys/Themes/Clean Blue/wiimote@2x.png new file mode 100644 index 0000000000..24e3cbea9c Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/wiimote@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/README.txt b/Data/Sys/Themes/Clean Lite/README.txt new file mode 100644 index 0000000000..a878862e20 --- /dev/null +++ b/Data/Sys/Themes/Clean Lite/README.txt @@ -0,0 +1,3 @@ +By Michael "MaJoR" Roesch of the Dolphin team + +dolphin-emu.org \ No newline at end of file diff --git a/Data/Sys/Themes/Clean Lite/browse.png b/Data/Sys/Themes/Clean Lite/browse.png new file mode 100644 index 0000000000..1d47b81cff Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/browse.png differ diff --git a/Data/Sys/Themes/Clean Lite/browse@2x.png b/Data/Sys/Themes/Clean Lite/browse@2x.png new file mode 100644 index 0000000000..6e809f66f8 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/browse@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/config.png b/Data/Sys/Themes/Clean Lite/config.png new file mode 100644 index 0000000000..3bb655cb1c Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/config.png differ diff --git a/Data/Sys/Themes/Clean Lite/config@2x.png b/Data/Sys/Themes/Clean Lite/config@2x.png new file mode 100644 index 0000000000..6ac1e5f6e4 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/config@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/dsp.png b/Data/Sys/Themes/Clean Lite/dsp.png new file mode 100644 index 0000000000..4685ab5e93 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/dsp.png differ diff --git a/Data/Sys/Themes/Clean Lite/dsp@2x.png b/Data/Sys/Themes/Clean Lite/dsp@2x.png new file mode 100644 index 0000000000..a7171f1bf4 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/dsp@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/fullscreen.png b/Data/Sys/Themes/Clean Lite/fullscreen.png new file mode 100644 index 0000000000..071ae37073 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/fullscreen.png differ diff --git a/Data/Sys/Themes/Clean Lite/fullscreen@2x.png b/Data/Sys/Themes/Clean Lite/fullscreen@2x.png new file mode 100644 index 0000000000..25e3c9c6a2 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/fullscreen@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/gcpad.png b/Data/Sys/Themes/Clean Lite/gcpad.png new file mode 100644 index 0000000000..03066ac511 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/gcpad.png differ diff --git a/Data/Sys/Themes/Clean Lite/gcpad@2x.png b/Data/Sys/Themes/Clean Lite/gcpad@2x.png new file mode 100644 index 0000000000..ae0fa0cf12 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/gcpad@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/graphics.png b/Data/Sys/Themes/Clean Lite/graphics.png new file mode 100644 index 0000000000..7b7b42573c Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/graphics.png differ diff --git a/Data/Sys/Themes/Clean Lite/graphics@2x.png b/Data/Sys/Themes/Clean Lite/graphics@2x.png new file mode 100644 index 0000000000..e57cafcf50 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/graphics@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/nobanner.png b/Data/Sys/Themes/Clean Lite/nobanner.png new file mode 100644 index 0000000000..08a3088431 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/nobanner.png differ diff --git a/Data/Sys/Themes/Clean Lite/nobanner@2x.png b/Data/Sys/Themes/Clean Lite/nobanner@2x.png new file mode 100644 index 0000000000..8ad3b2c843 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/nobanner@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/open.png b/Data/Sys/Themes/Clean Lite/open.png new file mode 100644 index 0000000000..dd4cdb576d Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/open.png differ diff --git a/Data/Sys/Themes/Clean Lite/open@2x.png b/Data/Sys/Themes/Clean Lite/open@2x.png new file mode 100644 index 0000000000..9cfde1a3ef Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/open@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/pause.png b/Data/Sys/Themes/Clean Lite/pause.png new file mode 100644 index 0000000000..5e69f38f28 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/pause.png differ diff --git a/Data/Sys/Themes/Clean Lite/pause@2x.png b/Data/Sys/Themes/Clean Lite/pause@2x.png new file mode 100644 index 0000000000..8028110534 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/pause@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/play.png b/Data/Sys/Themes/Clean Lite/play.png new file mode 100644 index 0000000000..afb0702c9d Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/play.png differ diff --git a/Data/Sys/Themes/Clean Lite/play@2x.png b/Data/Sys/Themes/Clean Lite/play@2x.png new file mode 100644 index 0000000000..56f4e95921 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/play@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/refresh.png b/Data/Sys/Themes/Clean Lite/refresh.png new file mode 100644 index 0000000000..995326f4bd Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/refresh.png differ diff --git a/Data/Sys/Themes/Clean Lite/refresh@2x.png b/Data/Sys/Themes/Clean Lite/refresh@2x.png new file mode 100644 index 0000000000..e8db968f36 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/refresh@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/screenshot.png b/Data/Sys/Themes/Clean Lite/screenshot.png new file mode 100644 index 0000000000..5198a8d5dc Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/screenshot.png differ diff --git a/Data/Sys/Themes/Clean Lite/screenshot@2x.png b/Data/Sys/Themes/Clean Lite/screenshot@2x.png new file mode 100644 index 0000000000..3dae998c78 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/screenshot@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/stop.png b/Data/Sys/Themes/Clean Lite/stop.png new file mode 100644 index 0000000000..8ae7b8443d Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/stop.png differ diff --git a/Data/Sys/Themes/Clean Lite/stop@2x.png b/Data/Sys/Themes/Clean Lite/stop@2x.png new file mode 100644 index 0000000000..5a3423d24e Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/stop@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/wiimote.png b/Data/Sys/Themes/Clean Lite/wiimote.png new file mode 100644 index 0000000000..5aa75d1d25 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/wiimote.png differ diff --git a/Data/Sys/Themes/Clean Lite/wiimote@2x.png b/Data/Sys/Themes/Clean Lite/wiimote@2x.png new file mode 100644 index 0000000000..026ec54cd0 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/wiimote@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/README.txt b/Data/Sys/Themes/Clean Pink/README.txt new file mode 100644 index 0000000000..a878862e20 --- /dev/null +++ b/Data/Sys/Themes/Clean Pink/README.txt @@ -0,0 +1,3 @@ +By Michael "MaJoR" Roesch of the Dolphin team + +dolphin-emu.org \ No newline at end of file diff --git a/Data/Sys/Themes/Clean Pink/browse.png b/Data/Sys/Themes/Clean Pink/browse.png new file mode 100644 index 0000000000..64c4546127 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/browse.png differ diff --git a/Data/Sys/Themes/Clean Pink/browse@2x.png b/Data/Sys/Themes/Clean Pink/browse@2x.png new file mode 100644 index 0000000000..0e6e3b752c Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/browse@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/config.png b/Data/Sys/Themes/Clean Pink/config.png new file mode 100644 index 0000000000..380640ab27 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/config.png differ diff --git a/Data/Sys/Themes/Clean Pink/config@2x.png b/Data/Sys/Themes/Clean Pink/config@2x.png new file mode 100644 index 0000000000..327f7c5141 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/config@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/dsp.png b/Data/Sys/Themes/Clean Pink/dsp.png new file mode 100644 index 0000000000..85a20e332f Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/dsp.png differ diff --git a/Data/Sys/Themes/Clean Pink/dsp@2x.png b/Data/Sys/Themes/Clean Pink/dsp@2x.png new file mode 100644 index 0000000000..b0f04f0dbc Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/dsp@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/fullscreen.png b/Data/Sys/Themes/Clean Pink/fullscreen.png new file mode 100644 index 0000000000..97e8af4425 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/fullscreen.png differ diff --git a/Data/Sys/Themes/Clean Pink/fullscreen@2x.png b/Data/Sys/Themes/Clean Pink/fullscreen@2x.png new file mode 100644 index 0000000000..50d14a08dd Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/fullscreen@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/gcpad.png b/Data/Sys/Themes/Clean Pink/gcpad.png new file mode 100644 index 0000000000..98697446a5 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/gcpad.png differ diff --git a/Data/Sys/Themes/Clean Pink/gcpad@2x.png b/Data/Sys/Themes/Clean Pink/gcpad@2x.png new file mode 100644 index 0000000000..ebc1416f62 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/gcpad@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/graphics.png b/Data/Sys/Themes/Clean Pink/graphics.png new file mode 100644 index 0000000000..a82403b952 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/graphics.png differ diff --git a/Data/Sys/Themes/Clean Pink/graphics@2x.png b/Data/Sys/Themes/Clean Pink/graphics@2x.png new file mode 100644 index 0000000000..86aa09dccc Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/graphics@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/nobanner.png b/Data/Sys/Themes/Clean Pink/nobanner.png new file mode 100644 index 0000000000..08a3088431 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/nobanner.png differ diff --git a/Data/Sys/Themes/Clean Pink/nobanner@2x.png b/Data/Sys/Themes/Clean Pink/nobanner@2x.png new file mode 100644 index 0000000000..8ad3b2c843 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/nobanner@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/open.png b/Data/Sys/Themes/Clean Pink/open.png new file mode 100644 index 0000000000..cc26643975 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/open.png differ diff --git a/Data/Sys/Themes/Clean Pink/open@2x.png b/Data/Sys/Themes/Clean Pink/open@2x.png new file mode 100644 index 0000000000..f27d6f55b4 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/open@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/pause.png b/Data/Sys/Themes/Clean Pink/pause.png new file mode 100644 index 0000000000..8849bc81ee Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/pause.png differ diff --git a/Data/Sys/Themes/Clean Pink/pause@2x.png b/Data/Sys/Themes/Clean Pink/pause@2x.png new file mode 100644 index 0000000000..ba6a4d3e52 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/pause@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/play.png b/Data/Sys/Themes/Clean Pink/play.png new file mode 100644 index 0000000000..29f858118b Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/play.png differ diff --git a/Data/Sys/Themes/Clean Pink/play@2x.png b/Data/Sys/Themes/Clean Pink/play@2x.png new file mode 100644 index 0000000000..7260241f1c Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/play@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/refresh.png b/Data/Sys/Themes/Clean Pink/refresh.png new file mode 100644 index 0000000000..1f8b6a8b52 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/refresh.png differ diff --git a/Data/Sys/Themes/Clean Pink/refresh@2x.png b/Data/Sys/Themes/Clean Pink/refresh@2x.png new file mode 100644 index 0000000000..e0a42e8cc4 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/refresh@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/screenshot.png b/Data/Sys/Themes/Clean Pink/screenshot.png new file mode 100644 index 0000000000..46a8b6056b Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/screenshot.png differ diff --git a/Data/Sys/Themes/Clean Pink/screenshot@2x.png b/Data/Sys/Themes/Clean Pink/screenshot@2x.png new file mode 100644 index 0000000000..2eadc2a4bf Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/screenshot@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/stop.png b/Data/Sys/Themes/Clean Pink/stop.png new file mode 100644 index 0000000000..9c142fb36d Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/stop.png differ diff --git a/Data/Sys/Themes/Clean Pink/stop@2x.png b/Data/Sys/Themes/Clean Pink/stop@2x.png new file mode 100644 index 0000000000..4735cc12db Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/stop@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/wiimote.png b/Data/Sys/Themes/Clean Pink/wiimote.png new file mode 100644 index 0000000000..2f07897e60 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/wiimote.png differ diff --git a/Data/Sys/Themes/Clean Pink/wiimote@2x.png b/Data/Sys/Themes/Clean Pink/wiimote@2x.png new file mode 100644 index 0000000000..18303af4a4 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/wiimote@2x.png differ diff --git a/Data/Sys/Themes/Clean/README.txt b/Data/Sys/Themes/Clean/README.txt new file mode 100644 index 0000000000..a878862e20 --- /dev/null +++ b/Data/Sys/Themes/Clean/README.txt @@ -0,0 +1,3 @@ +By Michael "MaJoR" Roesch of the Dolphin team + +dolphin-emu.org \ No newline at end of file diff --git a/Data/Sys/Themes/Clean/browse.png b/Data/Sys/Themes/Clean/browse.png new file mode 100644 index 0000000000..fb88269afe Binary files /dev/null and b/Data/Sys/Themes/Clean/browse.png differ diff --git a/Data/Sys/Themes/Clean/browse@2x.png b/Data/Sys/Themes/Clean/browse@2x.png new file mode 100644 index 0000000000..d5461a4011 Binary files /dev/null and b/Data/Sys/Themes/Clean/browse@2x.png differ diff --git a/Data/Sys/Themes/Clean/config.png b/Data/Sys/Themes/Clean/config.png new file mode 100644 index 0000000000..b412f7184b Binary files /dev/null and b/Data/Sys/Themes/Clean/config.png differ diff --git a/Data/Sys/Themes/Clean/config@2x.png b/Data/Sys/Themes/Clean/config@2x.png new file mode 100644 index 0000000000..3fab801417 Binary files /dev/null and b/Data/Sys/Themes/Clean/config@2x.png differ diff --git a/Data/Sys/Themes/Clean/dsp.png b/Data/Sys/Themes/Clean/dsp.png new file mode 100644 index 0000000000..5da533c5b0 Binary files /dev/null and b/Data/Sys/Themes/Clean/dsp.png differ diff --git a/Data/Sys/Themes/Clean/dsp@2x.png b/Data/Sys/Themes/Clean/dsp@2x.png new file mode 100644 index 0000000000..3b5614cc5a Binary files /dev/null and b/Data/Sys/Themes/Clean/dsp@2x.png differ diff --git a/Data/Sys/Themes/Clean/fullscreen.png b/Data/Sys/Themes/Clean/fullscreen.png new file mode 100644 index 0000000000..f7d469cf55 Binary files /dev/null and b/Data/Sys/Themes/Clean/fullscreen.png differ diff --git a/Data/Sys/Themes/Clean/fullscreen@2x.png b/Data/Sys/Themes/Clean/fullscreen@2x.png new file mode 100644 index 0000000000..7bfeec8f66 Binary files /dev/null and b/Data/Sys/Themes/Clean/fullscreen@2x.png differ diff --git a/Data/Sys/Themes/Clean/gcpad.png b/Data/Sys/Themes/Clean/gcpad.png new file mode 100644 index 0000000000..cbe6c95856 Binary files /dev/null and b/Data/Sys/Themes/Clean/gcpad.png differ diff --git a/Data/Sys/Themes/Clean/gcpad@2x.png b/Data/Sys/Themes/Clean/gcpad@2x.png new file mode 100644 index 0000000000..1025bc823a Binary files /dev/null and b/Data/Sys/Themes/Clean/gcpad@2x.png differ diff --git a/Data/Sys/Themes/Clean/graphics.png b/Data/Sys/Themes/Clean/graphics.png new file mode 100644 index 0000000000..59e419de40 Binary files /dev/null and b/Data/Sys/Themes/Clean/graphics.png differ diff --git a/Data/Sys/Themes/Clean/graphics@2x.png b/Data/Sys/Themes/Clean/graphics@2x.png new file mode 100644 index 0000000000..9c7ab61f59 Binary files /dev/null and b/Data/Sys/Themes/Clean/graphics@2x.png differ diff --git a/Data/Sys/Themes/Clean/nobanner.png b/Data/Sys/Themes/Clean/nobanner.png new file mode 100644 index 0000000000..08a3088431 Binary files /dev/null and b/Data/Sys/Themes/Clean/nobanner.png differ diff --git a/Data/Sys/Themes/Clean/nobanner@2x.png b/Data/Sys/Themes/Clean/nobanner@2x.png new file mode 100644 index 0000000000..8ad3b2c843 Binary files /dev/null and b/Data/Sys/Themes/Clean/nobanner@2x.png differ diff --git a/Data/Sys/Themes/Clean/open.png b/Data/Sys/Themes/Clean/open.png new file mode 100644 index 0000000000..f8acbcefaa Binary files /dev/null and b/Data/Sys/Themes/Clean/open.png differ diff --git a/Data/Sys/Themes/Clean/open@2x.png b/Data/Sys/Themes/Clean/open@2x.png new file mode 100644 index 0000000000..e06e076ac3 Binary files /dev/null and b/Data/Sys/Themes/Clean/open@2x.png differ diff --git a/Data/Sys/Themes/Clean/pause.png b/Data/Sys/Themes/Clean/pause.png new file mode 100644 index 0000000000..1eeda4f5c5 Binary files /dev/null and b/Data/Sys/Themes/Clean/pause.png differ diff --git a/Data/Sys/Themes/Clean/pause@2x.png b/Data/Sys/Themes/Clean/pause@2x.png new file mode 100644 index 0000000000..e971acd11c Binary files /dev/null and b/Data/Sys/Themes/Clean/pause@2x.png differ diff --git a/Data/Sys/Themes/Clean/play.png b/Data/Sys/Themes/Clean/play.png new file mode 100644 index 0000000000..0fb30540dc Binary files /dev/null and b/Data/Sys/Themes/Clean/play.png differ diff --git a/Data/Sys/Themes/Clean/play@2x.png b/Data/Sys/Themes/Clean/play@2x.png new file mode 100644 index 0000000000..87668c73a8 Binary files /dev/null and b/Data/Sys/Themes/Clean/play@2x.png differ diff --git a/Data/Sys/Themes/Clean/refresh.png b/Data/Sys/Themes/Clean/refresh.png new file mode 100644 index 0000000000..068d4976f0 Binary files /dev/null and b/Data/Sys/Themes/Clean/refresh.png differ diff --git a/Data/Sys/Themes/Clean/refresh@2x.png b/Data/Sys/Themes/Clean/refresh@2x.png new file mode 100644 index 0000000000..e2c7a2ed0c Binary files /dev/null and b/Data/Sys/Themes/Clean/refresh@2x.png differ diff --git a/Data/Sys/Themes/Clean/screenshot.png b/Data/Sys/Themes/Clean/screenshot.png new file mode 100644 index 0000000000..e02153f366 Binary files /dev/null and b/Data/Sys/Themes/Clean/screenshot.png differ diff --git a/Data/Sys/Themes/Clean/screenshot@2x.png b/Data/Sys/Themes/Clean/screenshot@2x.png new file mode 100644 index 0000000000..f7c243967f Binary files /dev/null and b/Data/Sys/Themes/Clean/screenshot@2x.png differ diff --git a/Data/Sys/Themes/Clean/stop.png b/Data/Sys/Themes/Clean/stop.png new file mode 100644 index 0000000000..4a640260d6 Binary files /dev/null and b/Data/Sys/Themes/Clean/stop.png differ diff --git a/Data/Sys/Themes/Clean/stop@2x.png b/Data/Sys/Themes/Clean/stop@2x.png new file mode 100644 index 0000000000..d5c14257a9 Binary files /dev/null and b/Data/Sys/Themes/Clean/stop@2x.png differ diff --git a/Data/Sys/Themes/Clean/wiimote.png b/Data/Sys/Themes/Clean/wiimote.png new file mode 100644 index 0000000000..07d63ab841 Binary files /dev/null and b/Data/Sys/Themes/Clean/wiimote.png differ diff --git a/Data/Sys/Themes/Clean/wiimote@2x.png b/Data/Sys/Themes/Clean/wiimote@2x.png new file mode 100644 index 0000000000..6d492cf6c8 Binary files /dev/null and b/Data/Sys/Themes/Clean/wiimote@2x.png differ diff --git a/Data/Sys/Wii/setting-eur.txt b/Data/Sys/Wii/setting-eur.txt deleted file mode 100644 index 693d7411eb..0000000000 Binary files a/Data/Sys/Wii/setting-eur.txt and /dev/null differ diff --git a/Data/Sys/Wii/setting-jpn.txt b/Data/Sys/Wii/setting-jpn.txt deleted file mode 100644 index db15646b46..0000000000 Binary files a/Data/Sys/Wii/setting-jpn.txt and /dev/null differ diff --git a/Data/Sys/Wii/setting-kor.txt b/Data/Sys/Wii/setting-kor.txt deleted file mode 100644 index 8c04855554..0000000000 Binary files a/Data/Sys/Wii/setting-kor.txt and /dev/null differ diff --git a/Data/Sys/Wii/setting-usa.txt b/Data/Sys/Wii/setting-usa.txt deleted file mode 100644 index 38ca5d91db..0000000000 Binary files a/Data/Sys/Wii/setting-usa.txt and /dev/null differ diff --git a/Data/User/Wii/shared2/ec/shopsetu.log b/Data/Sys/Wii/shared2/ec/shopsetu.log similarity index 100% rename from Data/User/Wii/shared2/ec/shopsetu.log rename to Data/Sys/Wii/shared2/ec/shopsetu.log diff --git a/Data/User/Wii/shared2/succession/shop.log b/Data/Sys/Wii/shared2/succession/shop.log similarity index 100% rename from Data/User/Wii/shared2/succession/shop.log rename to Data/Sys/Wii/shared2/succession/shop.log diff --git a/Data/User/Wii/shared2/sys/SYSCONF b/Data/Sys/Wii/shared2/sys/SYSCONF similarity index 100% rename from Data/User/Wii/shared2/sys/SYSCONF rename to Data/Sys/Wii/shared2/sys/SYSCONF diff --git a/Data/User/Wii/shared2/wc24/mbox/Readme.txt b/Data/Sys/Wii/shared2/wc24/mbox/Readme.txt similarity index 100% rename from Data/User/Wii/shared2/wc24/mbox/Readme.txt rename to Data/Sys/Wii/shared2/wc24/mbox/Readme.txt diff --git a/Data/User/Wii/shared2/wc24/mbox/wc24recv.ctl b/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl similarity index 100% rename from Data/User/Wii/shared2/wc24/mbox/wc24recv.ctl rename to Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl diff --git a/Data/User/Wii/shared2/wc24/mbox/wc24recv.mbx b/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.mbx similarity index 100% rename from Data/User/Wii/shared2/wc24/mbox/wc24recv.mbx rename to Data/Sys/Wii/shared2/wc24/mbox/wc24recv.mbx diff --git a/Data/User/Wii/shared2/wc24/mbox/wc24send.ctl b/Data/Sys/Wii/shared2/wc24/mbox/wc24send.ctl similarity index 100% rename from Data/User/Wii/shared2/wc24/mbox/wc24send.ctl rename to Data/Sys/Wii/shared2/wc24/mbox/wc24send.ctl diff --git a/Data/User/Wii/shared2/wc24/mbox/wc24send.mbx b/Data/Sys/Wii/shared2/wc24/mbox/wc24send.mbx similarity index 100% rename from Data/User/Wii/shared2/wc24/mbox/wc24send.mbx rename to Data/Sys/Wii/shared2/wc24/mbox/wc24send.mbx diff --git a/Data/User/Wii/shared2/wc24/misc.bin b/Data/Sys/Wii/shared2/wc24/misc.bin similarity index 100% rename from Data/User/Wii/shared2/wc24/misc.bin rename to Data/Sys/Wii/shared2/wc24/misc.bin diff --git a/Data/User/Wii/shared2/wc24/nwc24dl.bin b/Data/Sys/Wii/shared2/wc24/nwc24dl.bin similarity index 100% rename from Data/User/Wii/shared2/wc24/nwc24dl.bin rename to Data/Sys/Wii/shared2/wc24/nwc24dl.bin diff --git a/Data/User/Wii/shared2/wc24/nwc24fl.bin b/Data/Sys/Wii/shared2/wc24/nwc24fl.bin similarity index 100% rename from Data/User/Wii/shared2/wc24/nwc24fl.bin rename to Data/Sys/Wii/shared2/wc24/nwc24fl.bin diff --git a/Data/User/Wii/shared2/wc24/nwc24fls.bin b/Data/Sys/Wii/shared2/wc24/nwc24fls.bin similarity index 100% rename from Data/User/Wii/shared2/wc24/nwc24fls.bin rename to Data/Sys/Wii/shared2/wc24/nwc24fls.bin diff --git a/Data/User/Wii/shared2/wc24/nwc24msg.cbk b/Data/Sys/Wii/shared2/wc24/nwc24msg.cbk similarity index 100% rename from Data/User/Wii/shared2/wc24/nwc24msg.cbk rename to Data/Sys/Wii/shared2/wc24/nwc24msg.cbk diff --git a/Data/User/Wii/shared2/wc24/nwc24msg.cfg b/Data/Sys/Wii/shared2/wc24/nwc24msg.cfg similarity index 100% rename from Data/User/Wii/shared2/wc24/nwc24msg.cfg rename to Data/Sys/Wii/shared2/wc24/nwc24msg.cfg diff --git a/Data/User/GameConfig/GHKE7D.ini b/Data/User/GameConfig/GHKE7D.ini deleted file mode 100644 index e8b1d1c632..0000000000 --- a/Data/User/GameConfig/GHKE7D.ini +++ /dev/null @@ -1,19 +0,0 @@ -# GHKE7D - The Hulk - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 3 -EmulationIssues = Slow and GFX Glitches/Bugs - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - diff --git a/Data/User/GameConfig/GTLE52.ini b/Data/User/GameConfig/GTLE52.ini deleted file mode 100644 index 5b8060066d..0000000000 --- a/Data/User/GameConfig/GTLE52.ini +++ /dev/null @@ -1,28 +0,0 @@ -# GTLE52 - True Crime - -[Core] -# Values set here will override the main dolphin settings. -TLBHack = 1 - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 -EmulationIssues = Menus require projection hack, minor glitches ingame - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - -[Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 -PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 - diff --git a/Data/User/GameConfig/GTLP52.ini b/Data/User/GameConfig/GTLP52.ini deleted file mode 100644 index cc8c40c526..0000000000 --- a/Data/User/GameConfig/GTLP52.ini +++ /dev/null @@ -1,28 +0,0 @@ -# GTLP52 - True Crime - -[Core] -# Values set here will override the main dolphin settings. -TLBHack = 1 - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 -EmulationIssues = Menus require projection hack, minor glitches ingame - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - -[Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 -PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 - diff --git a/Data/User/GameConfig/GTLX52.ini b/Data/User/GameConfig/GTLX52.ini deleted file mode 100644 index 797e1988b6..0000000000 --- a/Data/User/GameConfig/GTLX52.ini +++ /dev/null @@ -1,28 +0,0 @@ -# GTLX52 - True Crime - -[Core] -# Values set here will override the main dolphin settings. -TLBHack = 1 - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 -EmulationIssues = Menus require projection hack, minor glitches ingame - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - -[Video] -ProjectionHack = 1 -PH_SZNear = 1 -PH_SZFar = 1 -PH_ExtraParam = 0 -PH_ZNear = 20 -PH_ZFar = 1.99998 - diff --git a/Data/User/GameConfig/JAEE01.ini b/Data/User/GameConfig/JAEE01.ini deleted file mode 100644 index 37fd1a4007..0000000000 --- a/Data/User/GameConfig/JAEE01.ini +++ /dev/null @@ -1,19 +0,0 @@ -# JAEE01 - Donkey Kong Country - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 0 -EmulationIssues = - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - diff --git a/Data/User/GameConfig/R3RP8P.ini b/Data/User/GameConfig/R3RP8P.ini deleted file mode 100644 index c4d8670718..0000000000 --- a/Data/User/GameConfig/R3RP8P.ini +++ /dev/null @@ -1,19 +0,0 @@ -# R3RP8P - Sonic & Sega All-Stars Racing - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 -EmulationIssues = - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - diff --git a/Data/User/GameConfig/RHOE8P.ini b/Data/User/GameConfig/RHOE8P.ini deleted file mode 100644 index 82ff52fdad..0000000000 --- a/Data/User/GameConfig/RHOE8P.ini +++ /dev/null @@ -1,49 +0,0 @@ -# RHOE8P - House Of The Dead: OVERKILL - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 5 -EmulationIssues = Use dx11 plugin (r6945) - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - -[Video] -ProjectionHack = 0 -PH_SZNear = 0 -PH_SZFar = 0 -PH_ExtraParam = 0 -PH_ZNear = -PH_ZFar = -$Infinte Bomb Usage after Getting 1 [g6flavor] -04159D1C 60000000 -$If Score Increase, MAX [ZiT] -C2142134 00000002 -3CA03B9B 38A5C9FF -90A60178 00000000 -$Infinite LIFE [ZiT] -04130ED4 60000000 -$Infinite Bullet [ZiT] -04159FAC 907D0720 -$CASH MAX [ZiT] -C214B118 00000002 -3CA03B9B 38A5C9FF -90A300D8 00000000 -$CASH MAX [ZiT] -C214B110 00000002 -3CA03B9B 38A5C9FF -90A300DC 00000000 -$If Score Increase, MAX [ZiT] -C2152674 00000002 -3CA03B9B 38A5C9FF -90B60178 00000000 - diff --git a/Data/User/GameConfig/WGSE08.ini b/Data/User/GameConfig/WGSE08.ini deleted file mode 100644 index 373710b074..0000000000 --- a/Data/User/GameConfig/WGSE08.ini +++ /dev/null @@ -1,19 +0,0 @@ -# WGSE08 - PWAA Ace Attorney - -[Core] -# Values set here will override the main dolphin settings. - -[EmuState] -# The Emulation State. 1 is worst, 5 is best, 0 is not set. -EmulationStateId = 4 -EmulationIssues = - -[OnLoad] -# Add memory patches to be loaded once on boot here. - -[OnFrame] -# Add memory patches to be applied every frame here. - -[ActionReplay] -# Add action replay cheats here. - diff --git a/Externals/Bochs_disasm/Bochs_disasm.vcxproj b/Externals/Bochs_disasm/Bochs_disasm.vcxproj index 50f62f70f6..660dbdc7c5 100644 --- a/Externals/Bochs_disasm/Bochs_disasm.vcxproj +++ b/Externals/Bochs_disasm/Bochs_disasm.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,129 +19,45 @@ - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6} - Bochs_disasm + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B} - + + StaticLibrary + v120 + Unicode + + true - StaticLibrary - Unicode - - true - StaticLibrary - Unicode - - + false - StaticLibrary - Unicode - - - false - StaticLibrary - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - + + + - - - diff --git a/Externals/Bochs_disasm/PowerPCDisasm.cpp b/Externals/Bochs_disasm/PowerPCDisasm.cpp index 56719ff662..f6de85d845 100644 --- a/Externals/Bochs_disasm/PowerPCDisasm.cpp +++ b/Externals/Bochs_disasm/PowerPCDisasm.cpp @@ -39,11 +39,6 @@ #include "PowerPCDisasm.h" -#ifndef _MSC_VER -// Pull in rotate functions for non-msvc -#include "Common.h" -#endif - namespace PPCDisasm { @@ -580,7 +575,8 @@ typedef unsigned int ppc_word; if (me < mb) mask = ~mask; //rotate the mask so it can be applied to source reg - return _rotl(mask, 32 - r); + //return _rotl(mask, 32 - r); + return (mask << (32 - r)) | (mask >> r); } diff --git a/Externals/CLRun/clrun/CLRun.vcxproj b/Externals/CLRun/clrun/CLRun.vcxproj index c6a4cb2e6d..473e5c532a 100644 --- a/Externals/CLRun/clrun/CLRun.vcxproj +++ b/Externals/CLRun/clrun/CLRun.vcxproj @@ -1,14 +1,6 @@  - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -28,129 +20,27 @@ {AA862E5E-A993-497A-B6A0-0E8E94B10050} - CLRun - + + StaticLibrary + v120 + Unicode + + true - StaticLibrary - Unicode - - true - StaticLibrary - Unicode - - + false - StaticLibrary - Unicode - - - false - StaticLibrary - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\include;%(AdditionalIncludeDirectories) - - - true - - - - - ..\include;%(AdditionalIncludeDirectories) - - - true - - - - - ..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\include - - - - - ..\include - - diff --git a/Externals/GLES3/GLES3/gl3.h b/Externals/GLES3/GLES3/gl3.h index e5bf8f5bfc..01cbeaacf7 100644 --- a/Externals/GLES3/GLES3/gl3.h +++ b/Externals/GLES3/GLES3/gl3.h @@ -965,7 +965,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsi GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +//GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array); diff --git a/Externals/GLew/glew.vcxproj b/Externals/GLew/glew.vcxproj new file mode 100644 index 0000000000..7f2df6f775 --- /dev/null +++ b/Externals/GLew/glew.vcxproj @@ -0,0 +1,59 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + GLEW_STATIC;%(PreprocessorDefinitions) + + + + + + \ No newline at end of file diff --git a/Externals/GLew/glew.vcxproj.filters b/Externals/GLew/glew.vcxproj.filters new file mode 100644 index 0000000000..a7c7e3975c --- /dev/null +++ b/Externals/GLew/glew.vcxproj.filters @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Externals/GLew/glew32s.lib b/Externals/GLew/glew32s.lib deleted file mode 100755 index 589a5bb914..0000000000 Binary files a/Externals/GLew/glew32s.lib and /dev/null differ diff --git a/Externals/GLew/glew64s.lib b/Externals/GLew/glew64s.lib deleted file mode 100755 index 4316171d4c..0000000000 Binary files a/Externals/GLew/glew64s.lib and /dev/null differ diff --git a/Externals/GLew/include/GL/glew.h b/Externals/GLew/include/GL/glew.h index 8dec85bf77..c9d3203437 100644 --- a/Externals/GLew/include/GL/glew.h +++ b/Externals/GLew/include/GL/glew.h @@ -83,6 +83,12 @@ #if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H) #error gl.h included before glew.h #endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif #if defined(__REGAL_H__) #error Regal.h included before glew.h #endif @@ -94,7 +100,9 @@ #endif #define __gl_h_ +#define __gl2_h_ #define __GL_H__ +#define __gltypes_h_ #define __REGAL_H__ #define __X_GL_H #define __glext_h_ @@ -1224,7 +1232,6 @@ GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei heigh #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E @@ -2049,8 +2056,6 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei #define GL_CONTEXT_FLAGS 0x821E #define GL_DEPTH_BUFFER 0x8223 #define GL_STENCIL_BUFFER 0x8224 -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A @@ -2357,11 +2362,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *) #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_RGB10_A2UI 0x906F typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); @@ -2377,13 +2377,8 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint d #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F @@ -2446,6 +2441,17 @@ typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); #endif /* GL_VERSION_4_3 */ +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + /* -------------------------- GL_3DFX_multisample -------------------------- */ #ifndef GL_3DFX_multisample @@ -2528,7 +2534,7 @@ typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); @@ -2573,13 +2579,36 @@ typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GL #endif /* GL_AMD_draw_buffers_blend */ +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + /* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) #define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) @@ -2629,7 +2658,7 @@ typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* m typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); -typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); @@ -2711,6 +2740,40 @@ typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint i #endif /* GL_AMD_shader_stencil_export */ +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + /* ------------------- GL_AMD_stencil_operation_extended ------------------- */ #ifndef GL_AMD_stencil_operation_extended @@ -2788,6 +2851,200 @@ typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #endif /* GL_AMD_vertex_shader_viewport_index */ +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + /* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ #ifndef GL_APPLE_aux_depth_stencil @@ -2821,7 +3078,7 @@ typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); @@ -3046,9 +3303,9 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF -typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); #define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) @@ -3127,6 +3384,8 @@ typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuin #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +typedef int GLfixed; + typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); @@ -3148,6 +3407,7 @@ typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B @@ -3181,8 +3441,8 @@ typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* #define GL_ARB_base_instance 1 typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLuint baseinstance); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); #define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) #define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) @@ -3192,6 +3452,51 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) #endif /* GL_ARB_base_instance */ +/* ------------------------ GL_ARB_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + /* ----------------------- GL_ARB_blend_func_extended ---------------------- */ #ifndef GL_ARB_blend_func_extended @@ -3212,6 +3517,31 @@ typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GL #endif /* GL_ARB_blend_func_extended */ +/* ------------------------- GL_ARB_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid* data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + /* ---------------------------- GL_ARB_cl_event ---------------------------- */ #ifndef GL_ARB_cl_event @@ -3250,6 +3580,23 @@ typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, #endif /* GL_ARB_clear_buffer_object */ +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + /* ----------------------- GL_ARB_color_buffer_float ----------------------- */ #ifndef GL_ARB_color_buffer_float @@ -3330,6 +3677,24 @@ typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect) #endif /* GL_ARB_compute_shader */ +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + /* ----------------------- GL_ARB_conservative_depth ----------------------- */ #ifndef GL_ARB_conservative_depth @@ -3398,7 +3763,7 @@ typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum sr typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); @@ -3506,10 +3871,10 @@ typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLen #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const GLvoid* const *indices, GLsizei primcount, const GLint *basevertex); #define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) #define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) @@ -3528,8 +3893,8 @@ typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, G #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect); -typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); #define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) #define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) @@ -3547,6 +3912,19 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum t #endif /* GL_ARB_draw_instanced */ +/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + /* -------------------- GL_ARB_explicit_attrib_location -------------------- */ #ifndef GL_ARB_explicit_attrib_location @@ -3848,7 +4226,7 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenu #define GL_PROGRAM_BINARY_FORMATS 0x87FF typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary); -typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); #define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) @@ -4110,6 +4488,24 @@ typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum in #endif /* GL_ARB_imaging */ +/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 + +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + /* ------------------------ GL_ARB_instanced_arrays ------------------------ */ #ifndef GL_ARB_instanced_arrays @@ -4149,10 +4545,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_3D 0x806F -#define GL_SAMPLES 0x80A9 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 @@ -4252,15 +4644,6 @@ typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_RENDERBUFFER 0x8D41 -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_NUM_SAMPLE_COUNTS 0x9380 typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); @@ -4358,13 +4741,36 @@ typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *in #endif /* GL_ARB_matrix_palette */ +/* --------------------------- GL_ARB_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + /* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 -typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); #define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) #define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) @@ -4690,6 +5096,20 @@ typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); #endif /* GL_ARB_provoking_vertex */ +/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + /* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ #ifndef GL_ARB_robust_buffer_access_behavior @@ -4844,6 +5264,17 @@ typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum #endif /* GL_ARB_seamless_cube_map */ +/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + /* --------------------- GL_ARB_separate_shader_objects -------------------- */ #ifndef GL_ARB_separate_shader_objects @@ -5037,6 +5468,24 @@ typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint prog #endif /* GL_ARB_shader_bit_encoding */ +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + /* --------------------- GL_ARB_shader_image_load_store -------------------- */ #ifndef GL_ARB_shader_image_load_store @@ -5376,7 +5825,7 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, G #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA -typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar ** path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); @@ -5427,6 +5876,33 @@ typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, #endif /* GL_ARB_shadow_ambient */ +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + /* ------------------------ GL_ARB_stencil_texturing ----------------------- */ #ifndef GL_ARB_stencil_texturing @@ -5602,13 +6078,13 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLen #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLvoid *img); #define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) #define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) @@ -5794,6 +6270,17 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL #endif /* GL_ARB_texture_gather */ +/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + /* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ #ifndef GL_ARB_texture_mirrored_repeat @@ -5934,6 +6421,18 @@ typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsiz #endif /* GL_ARB_texture_rgb10_a2ui */ +/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + /* ------------------------- GL_ARB_texture_storage ------------------------ */ #ifndef GL_ARB_texture_storage @@ -6225,13 +6724,6 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE - typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); @@ -6404,13 +6896,13 @@ typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); -typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); @@ -6525,7 +7017,7 @@ typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); @@ -6540,7 +7032,7 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); -typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); @@ -6577,7 +7069,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLs typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); #define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) #define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) @@ -6671,6 +7163,17 @@ typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programO #endif /* GL_ARB_vertex_shader */ +/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + /* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev @@ -6944,7 +7447,7 @@ typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bu typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); #define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) #define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) @@ -7250,8 +7753,8 @@ typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); -typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); #define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) @@ -7595,7 +8098,7 @@ typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 -typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) @@ -7649,19 +8152,19 @@ typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); -typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); -typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); #define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) @@ -7701,8 +8204,8 @@ typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 -typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); -typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *pointer); #define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) #define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) @@ -7796,18 +8299,18 @@ typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zma typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); -typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); @@ -7832,8 +8335,8 @@ typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuff typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img); -typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLvoid *img); typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); @@ -7844,7 +8347,7 @@ typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); @@ -7853,18 +8356,18 @@ typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); -typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params); typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params); -typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); @@ -7897,7 +8400,7 @@ typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); @@ -7908,9 +8411,9 @@ typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coo typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); @@ -7918,11 +8421,11 @@ typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLe typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage); -typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); @@ -7942,65 +8445,48 @@ typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); -typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); -typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); @@ -8008,9 +8494,9 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLen typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); @@ -8177,55 +8663,38 @@ typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, G #define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) #define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) #define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) -#define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT) -#define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT) #define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) #define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) #define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) #define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) #define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) #define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) -#define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT) -#define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT) #define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) #define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) #define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) #define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) #define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) #define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) -#define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT) -#define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT) #define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) #define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) #define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) #define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) #define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) #define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) -#define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT) -#define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT) #define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) #define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) #define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) #define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) #define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) #define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) -#define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT) #define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) -#define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT) #define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) -#define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT) #define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) -#define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT) #define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) -#define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT) #define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) -#define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT) #define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) -#define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT) #define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) -#define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT) #define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) -#define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT) #define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) #define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) #define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) @@ -8739,10 +9208,10 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLin #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 -typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); @@ -8851,7 +9320,7 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mod #define GL_EXT_multi_draw_arrays 1 typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); -typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid * const *indices, GLsizei primcount); #define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) #define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) @@ -8962,8 +9431,8 @@ typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); @@ -9334,9 +9803,9 @@ typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); #define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) #define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) @@ -9413,7 +9882,7 @@ typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint leve #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); #define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) @@ -9551,18 +10020,6 @@ typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum interna #ifndef GL_EXT_texture_env #define GL_EXT_texture_env 1 -#define GL_TEXTURE_ENV0_EXT 0 -#define GL_ENV_BLEND_EXT 0 -#define GL_TEXTURE_ENV_SHIFT_EXT 0 -#define GL_ENV_REPLACE_EXT 0 -#define GL_ENV_ADD_EXT 0 -#define GL_ENV_SUBTRACT_EXT 0 -#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 -#define GL_ENV_REVERSE_SUBTRACT_EXT 0 -#define GL_ENV_REVERSE_BLEND_EXT 0 -#define GL_ENV_COPY_EXT 0 -#define GL_ENV_MODULATE_EXT 0 - #define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) #endif /* GL_EXT_texture_env */ @@ -9933,7 +10390,7 @@ typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); #define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) #define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) @@ -9987,13 +10444,13 @@ typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint progra #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); -typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); -typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); #define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) #define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) @@ -10047,7 +10504,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) #define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) @@ -10290,7 +10747,7 @@ typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); @@ -10335,7 +10792,7 @@ typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 -typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); #define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) @@ -10380,9 +10837,6 @@ typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 - #define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) #endif /* GL_HP_occlusion_test */ @@ -10529,6 +10983,28 @@ typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum ty #endif /* GL_INGR_interlace_read */ +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef GLvoid * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + /* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ #ifndef GL_INTEL_parallel_arrays @@ -10617,15 +11093,15 @@ typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tl typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); -typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const GLvoid *userParam); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); -typedef void (GLAPIENTRY * PFNGLGETPOINTERVPROC) (GLenum pname, void** params); typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); #define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) @@ -10634,9 +11110,9 @@ typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, G #define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) #define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) #define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) -#define glGetPointerv GLEW_GET_FUN(__glewGetPointerv) #define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) #define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) #define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) #define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) @@ -10819,6 +11295,21 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #endif /* GL_MESA_ycbcr_texture */ +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + /* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ #ifndef GL_NVX_gpu_memory_info @@ -10834,6 +11325,21 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); #endif /* GL_NVX_gpu_memory_info */ +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const GLvoid *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + /* ------------------------- GL_NV_bindless_texture ------------------------ */ #ifndef GL_NV_bindless_texture @@ -10871,6 +11377,77 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsiz #endif /* GL_NV_bindless_texture */ +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + /* --------------------------- GL_NV_blend_square -------------------------- */ #ifndef GL_NV_blend_square @@ -10880,6 +11457,18 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsiz #endif /* GL_NV_blend_square */ +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 + +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + /* ------------------------ GL_NV_conditional_render ----------------------- */ #ifndef GL_NV_conditional_render @@ -10925,6 +11514,18 @@ typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum #endif /* GL_NV_copy_image */ +/* -------------------------- GL_NV_deep_texture3D ------------------------- */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 + +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + /* ------------------------ GL_NV_depth_buffer_float ----------------------- */ #ifndef GL_NV_depth_buffer_float @@ -10973,6 +11574,19 @@ typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFa #endif /* GL_NV_depth_range_unclamped */ +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + /* ---------------------------- GL_NV_evaluators --------------------------- */ #ifndef GL_NV_evaluators @@ -11006,10 +11620,10 @@ typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFa typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); @@ -11289,6 +11903,15 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum targe #endif /* GL_NV_gpu_program5 */ +/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + /* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ #ifndef GL_NV_gpu_program_fp64 @@ -11530,7 +12153,6 @@ typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 -#define GL_COVERAGE_SAMPLES_NV 0x80A9 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) @@ -11672,8 +12294,6 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D #define GL_PRIMARY_COLOR 0x8577 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 @@ -11875,7 +12495,7 @@ typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei n #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); #define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) #define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) @@ -12057,6 +12677,15 @@ typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage #endif /* GL_NV_register_combiners2 */ +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + /* ----------------------- GL_NV_shader_atomic_float ----------------------- */ #ifndef GL_NV_shader_atomic_float @@ -12107,6 +12736,15 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei cou #endif /* GL_NV_shader_buffer_load */ +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 @@ -12522,7 +13160,7 @@ typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, GLvoid *pointer); #define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) #define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) @@ -12794,7 +13432,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); -typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); @@ -13000,8 +13638,6 @@ typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint vid #ifndef GL_OES_byte_coordinates #define GL_OES_byte_coordinates 1 -#define GL_BYTE 0x1400 - #define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) #endif /* GL_OES_byte_coordinates */ @@ -13163,6 +13799,138 @@ typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, #endif /* GL_PGI_vertex_hints */ +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const GLvoid* pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + /* ------------------------- GL_REGAL_error_string ------------------------- */ #ifndef GL_REGAL_error_string @@ -13206,6 +13974,12 @@ typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); #define GL_LOG_STATUS_REGAL 0x9320 #define GL_LOG_HTTP_REGAL 0x9321 +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, GLvoid *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + #define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) #endif /* GL_REGAL_log */ @@ -13378,8 +14152,8 @@ typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 -typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); -typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const GLvoid *pixels); #define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) #define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) @@ -13954,11 +14728,11 @@ typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); -typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); -typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); #define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) #define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) @@ -14100,7 +14874,7 @@ typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsiz #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); @@ -14572,6 +15346,8 @@ GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSepa GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; @@ -14593,11 +15369,36 @@ GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCou GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; +GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; @@ -14650,9 +15451,29 @@ GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstanc GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; @@ -14660,11 +15481,16 @@ GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; @@ -14776,6 +15602,9 @@ GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; @@ -14800,6 +15629,13 @@ GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; @@ -15023,6 +15859,9 @@ GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; @@ -15583,55 +16422,38 @@ GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; -GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT; GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; @@ -15966,6 +16788,10 @@ GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointe GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; +GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; @@ -15980,9 +16806,9 @@ GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; -GLEW_FUN_EXPORT PFNGLGETPOINTERVPROC __glewGetPointerv; GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; @@ -16018,6 +16844,12 @@ GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; @@ -16032,6 +16864,9 @@ GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleu GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; @@ -16041,6 +16876,8 @@ GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; @@ -16439,11 +17276,59 @@ GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; @@ -16597,6 +17482,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; @@ -16605,6 +17491,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; @@ -16613,12 +17500,26 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; @@ -16640,13 +17541,17 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; @@ -16659,6 +17564,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; @@ -16676,6 +17582,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; @@ -16683,6 +17590,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; @@ -16693,6 +17601,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; @@ -16700,9 +17609,12 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; @@ -16717,6 +17629,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; @@ -16735,6 +17648,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; @@ -16743,6 +17657,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; @@ -16761,6 +17676,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; @@ -16899,6 +17815,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; @@ -16909,15 +17826,22 @@ GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; @@ -16932,6 +17856,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; @@ -16949,8 +17874,10 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; @@ -16986,6 +17913,9 @@ GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; diff --git a/Externals/GLew/include/GL/glxew.h b/Externals/GLew/include/GL/glxew.h index 0b66bde33a..015cc32f49 100644 --- a/Externals/GLew/include/GL/glxew.h +++ b/Externals/GLew/include/GL/glxew.h @@ -362,6 +362,26 @@ extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); #define GLX_GPU_NUM_RB_AMD 0x21A7 #define GLX_GPU_NUM_SPI_AMD 0x21A8 +typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); +typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); +typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); +typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); +typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); +typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); + +#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) +#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) +#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) +#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) +#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) +#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) +#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) +#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) +#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) + #define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) #endif /* GLX_AMD_gpu_association */ @@ -555,6 +575,17 @@ typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, i #endif /* GLX_ATI_render_texture */ +/* --------------------------- GLX_EXT_buffer_age -------------------------- */ + +#ifndef GLX_EXT_buffer_age +#define GLX_EXT_buffer_age 1 + +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 + +#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) + +#endif /* GLX_EXT_buffer_age */ + /* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ #ifndef GLX_EXT_create_context_es2_profile @@ -962,10 +993,10 @@ typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoC #endif /* GLX_NV_video_capture */ -/* ---------------------------- GLX_NV_video_out --------------------------- */ +/* -------------------------- GLX_NV_video_output -------------------------- */ -#ifndef GLX_NV_video_out -#define GLX_NV_video_out 1 +#ifndef GLX_NV_video_output +#define GLX_NV_video_output 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 @@ -992,9 +1023,9 @@ typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) -#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) +#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output) -#endif /* GLX_NV_video_out */ +#endif /* GLX_NV_video_output */ /* -------------------------- GLX_OML_swap_method -------------------------- */ @@ -1047,16 +1078,6 @@ typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, i #ifndef GLX_SGIS_color_range #define GLX_SGIS_color_range 1 -#define GLX_MIN_RED_SGIS 0 -#define GLX_MAX_GREEN_SGIS 0 -#define GLX_MIN_BLUE_SGIS 0 -#define GLX_MAX_ALPHA_SGIS 0 -#define GLX_MIN_GREEN_SGIS 0 -#define GLX_MIN_ALPHA_SGIS 0 -#define GLX_MAX_RED_SGIS 0 -#define GLX_EXTENDED_RANGE_SGIS 0 -#define GLX_MAX_BLUE_SGIS 0 - #define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) #endif /* GLX_SGIS_color_range */ @@ -1393,7 +1414,7 @@ typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX -#define GLXEW_FUN_EXPORT +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT #define GLXEW_VAR_EXPORT #else #define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT @@ -1420,6 +1441,16 @@ GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; +GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; +GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; +GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; + GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; @@ -1555,6 +1586,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; @@ -1580,7 +1612,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_output; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; diff --git a/Externals/GLew/include/GL/wglew.h b/Externals/GLew/include/GL/wglew.h index 6dc08cdeee..1e77920c6c 100644 --- a/Externals/GLew/include/GL/wglew.h +++ b/Externals/GLew/include/GL/wglew.h @@ -446,6 +446,28 @@ typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, con #endif /* WGL_ARB_render_texture */ +/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float @@ -1323,6 +1345,8 @@ WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; diff --git a/Externals/GLew/src/glew.c b/Externals/GLew/src/glew.c index 3703d9d306..5e5b904ae6 100644 --- a/Externals/GLew/src/glew.c +++ b/Externals/GLew/src/glew.c @@ -33,7 +33,7 @@ #if defined(_WIN32) # include -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) # include #endif @@ -166,6 +166,8 @@ void* NSGLGetProcAddress (const GLubyte *name) # define glewGetProcAddress(name) dlGetProcAddress(name) #elif defined(__ANDROID__) # define glewGetProcAddress(name) NULL /* TODO */ +#elif defined(__native_client__) +# define glewGetProcAddress(name) NULL /* TODO */ #else /* __linux */ # define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) #endif @@ -585,6 +587,8 @@ PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; +PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; + PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; @@ -606,11 +610,36 @@ PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; +PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; +PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; + PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; +PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; + +PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; +PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; +PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; + +PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; +PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; +PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; +PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; +PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; +PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; +PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; +PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; +PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; +PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; +PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; + +PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; + PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; @@ -663,9 +692,29 @@ PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; +PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; +PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; +PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; +PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; +PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; +PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; +PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; +PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; +PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; +PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; + PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; +PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; + PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; @@ -673,11 +722,16 @@ PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; +PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; + PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; +PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; + PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; @@ -789,6 +843,9 @@ PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; + PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; @@ -813,6 +870,13 @@ PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; +PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; +PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; +PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; +PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; +PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; + PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; @@ -1036,6 +1100,9 @@ PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; +PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; + PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; PFNGLDELETESYNCPROC __glewDeleteSync = NULL; PFNGLFENCESYNCPROC __glewFenceSync = NULL; @@ -1596,55 +1663,38 @@ PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; -PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT = NULL; -PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT = NULL; PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; -PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT = NULL; -PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT = NULL; PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; -PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT = NULL; -PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT = NULL; PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; -PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT = NULL; -PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT = NULL; PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; -PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; @@ -1979,6 +2029,10 @@ PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; +PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; +PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; +PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; + PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; @@ -1993,9 +2047,9 @@ PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; -PFNGLGETPOINTERVPROC __glewGetPointerv = NULL; PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; +PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; @@ -2031,6 +2085,12 @@ PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; +PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; + PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; @@ -2045,6 +2105,9 @@ PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; +PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; +PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; + PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; @@ -2054,6 +2117,8 @@ PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; +PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; + PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; @@ -2452,11 +2517,59 @@ PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; PFNGLORTHOFOESPROC __glewOrthofOES = NULL; +PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; +PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; +PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; +PFNGLCOLOR4XPROC __glewColor4x = NULL; +PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; +PFNGLFOGXPROC __glewFogx = NULL; +PFNGLFOGXVPROC __glewFogxv = NULL; +PFNGLFRUSTUMFPROC __glewFrustumf = NULL; +PFNGLFRUSTUMXPROC __glewFrustumx = NULL; +PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; +PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; +PFNGLLIGHTXPROC __glewLightx = NULL; +PFNGLLIGHTXVPROC __glewLightxv = NULL; +PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; +PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; +PFNGLMATERIALXPROC __glewMaterialx = NULL; +PFNGLMATERIALXVPROC __glewMaterialxv = NULL; +PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; +PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; +PFNGLNORMAL3XPROC __glewNormal3x = NULL; +PFNGLORTHOFPROC __glewOrthof = NULL; +PFNGLORTHOXPROC __glewOrthox = NULL; +PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; +PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; +PFNGLROTATEXPROC __glewRotatex = NULL; +PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; +PFNGLSCALEXPROC __glewScalex = NULL; +PFNGLTEXENVXPROC __glewTexEnvx = NULL; +PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; +PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; +PFNGLTRANSLATEXPROC __glewTranslatex = NULL; + +PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; +PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; +PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; +PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; +PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; +PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; +PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; +PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; +PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; +PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; +PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; +PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; +PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; + PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; +PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; + PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; @@ -2609,6 +2722,7 @@ GLboolean __GLEW_VERSION_4_0 = GL_FALSE; GLboolean __GLEW_VERSION_4_1 = GL_FALSE; GLboolean __GLEW_VERSION_4_2 = GL_FALSE; GLboolean __GLEW_VERSION_4_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_4 = GL_FALSE; GLboolean __GLEW_3DFX_multisample = GL_FALSE; GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; @@ -2617,6 +2731,7 @@ GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; GLboolean __GLEW_AMD_debug_output = GL_FALSE; GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; @@ -2625,12 +2740,26 @@ GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; GLboolean __GLEW_AMD_sample_positions = GL_FALSE; GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; +GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; +GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; +GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; +GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; GLboolean __GLEW_APPLE_client_storage = GL_FALSE; GLboolean __GLEW_APPLE_element_array = GL_FALSE; @@ -2652,13 +2781,17 @@ GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; GLboolean __GLEW_ARB_base_instance = GL_FALSE; +GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; +GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; GLboolean __GLEW_ARB_cl_event = GL_FALSE; GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_clear_texture = GL_FALSE; GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; GLboolean __GLEW_ARB_compatibility = GL_FALSE; GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; GLboolean __GLEW_ARB_compute_shader = GL_FALSE; +GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; GLboolean __GLEW_ARB_copy_image = GL_FALSE; @@ -2671,6 +2804,7 @@ GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; +GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; @@ -2688,6 +2822,7 @@ GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; GLboolean __GLEW_ARB_imaging = GL_FALSE; +GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; @@ -2695,6 +2830,7 @@ GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; +GLboolean __GLEW_ARB_multi_bind = GL_FALSE; GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_ARB_multisample = GL_FALSE; GLboolean __GLEW_ARB_multitexture = GL_FALSE; @@ -2705,6 +2841,7 @@ GLboolean __GLEW_ARB_point_parameters = GL_FALSE; GLboolean __GLEW_ARB_point_sprite = GL_FALSE; GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; +GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; GLboolean __GLEW_ARB_robustness = GL_FALSE; GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; @@ -2712,9 +2849,12 @@ GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLEW_ARB_sample_shading = GL_FALSE; GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; +GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; +GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; GLboolean __GLEW_ARB_shader_objects = GL_FALSE; @@ -2729,6 +2869,7 @@ GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; GLboolean __GLEW_ARB_shadow = GL_FALSE; GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; GLboolean __GLEW_ARB_sync = GL_FALSE; GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; @@ -2747,6 +2888,7 @@ GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; GLboolean __GLEW_ARB_texture_float = GL_FALSE; GLboolean __GLEW_ARB_texture_gather = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; @@ -2755,6 +2897,7 @@ GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; GLboolean __GLEW_ARB_texture_rg = GL_FALSE; GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; +GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; GLboolean __GLEW_ARB_texture_storage = GL_FALSE; GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; @@ -2773,6 +2916,7 @@ GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLEW_ARB_vertex_program = GL_FALSE; GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; GLboolean __GLEW_ARB_viewport_array = GL_FALSE; GLboolean __GLEW_ARB_window_pos = GL_FALSE; @@ -2911,6 +3055,7 @@ GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; GLboolean __GLEW_INGR_color_clamp = GL_FALSE; GLboolean __GLEW_INGR_interlace_read = GL_FALSE; +GLboolean __GLEW_INTEL_map_texture = GL_FALSE; GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; GLboolean __GLEW_KHR_debug = GL_FALSE; @@ -2921,15 +3066,22 @@ GLboolean __GLEW_MESA_pack_invert = GL_FALSE; GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; GLboolean __GLEW_MESA_window_pos = GL_FALSE; GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; +GLboolean __GLEW_NVX_conditional_render = GL_FALSE; GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; GLboolean __GLEW_NV_bindless_texture = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; GLboolean __GLEW_NV_blend_square = GL_FALSE; +GLboolean __GLEW_NV_compute_program5 = GL_FALSE; GLboolean __GLEW_NV_conditional_render = GL_FALSE; GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; GLboolean __GLEW_NV_copy_image = GL_FALSE; +GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; GLboolean __GLEW_NV_depth_clamp = GL_FALSE; GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; +GLboolean __GLEW_NV_draw_texture = GL_FALSE; GLboolean __GLEW_NV_evaluators = GL_FALSE; GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; GLboolean __GLEW_NV_fence = GL_FALSE; @@ -2944,6 +3096,7 @@ GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; GLboolean __GLEW_NV_half_float = GL_FALSE; @@ -2961,8 +3114,10 @@ GLboolean __GLEW_NV_present_video = GL_FALSE; GLboolean __GLEW_NV_primitive_restart = GL_FALSE; GLboolean __GLEW_NV_register_combiners = GL_FALSE; GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; +GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; @@ -2998,6 +3153,9 @@ GLboolean __GLEW_OML_resample = GL_FALSE; GLboolean __GLEW_OML_subsample = GL_FALSE; GLboolean __GLEW_PGI_misc_hints = GL_FALSE; GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_enable = GL_FALSE; GLboolean __GLEW_REGAL_error_string = GL_FALSE; GLboolean __GLEW_REGAL_extension_query = GL_FALSE; GLboolean __GLEW_REGAL_log = GL_FALSE; @@ -3497,6 +3655,10 @@ static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 + +#endif /* GL_VERSION_4_4 */ + #ifdef GL_3DFX_multisample #endif /* GL_3DFX_multisample */ @@ -3562,6 +3724,19 @@ static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + +static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_interleaved_elements */ + #ifdef GL_AMD_multi_draw_indirect static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3643,6 +3818,24 @@ static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifdef GL_AMD_sparse_texture + +static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; + r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sparse_texture */ + #ifdef GL_AMD_stencil_operation_extended static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3686,6 +3879,111 @@ static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DE #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + +#endif /* GL_ANGLE_depth_texture */ + +#ifdef GL_ANGLE_framebuffer_blit + +static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifdef GL_ANGLE_framebuffer_multisample + +static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifdef GL_ANGLE_instanced_arrays + +static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; + r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; + r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_instanced_arrays */ + +#ifdef GL_ANGLE_pack_reverse_row_order + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +#ifdef GL_ANGLE_program_binary + +#endif /* GL_ANGLE_program_binary */ + +#ifdef GL_ANGLE_texture_compression_dxt1 + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +#ifdef GL_ANGLE_texture_compression_dxt3 + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +#ifdef GL_ANGLE_texture_compression_dxt5 + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +#ifdef GL_ANGLE_texture_usage + +#endif /* GL_ANGLE_texture_usage */ + +#ifdef GL_ANGLE_timer_query + +static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; + r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; + r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; + r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; + r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; + r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; + r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; + r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; + r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_timer_query */ + +#ifdef GL_ANGLE_translated_shader_source + +static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_translated_shader_source */ + #ifdef GL_APPLE_aux_depth_stencil #endif /* GL_APPLE_aux_depth_stencil */ @@ -3892,6 +4190,34 @@ static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + +static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; + r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; + r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; + r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; + r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; + r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; + r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; + r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; + r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; + r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; + r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; + r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; + r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; + r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_bindless_texture */ + #ifdef GL_ARB_blend_func_extended static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3906,6 +4232,20 @@ static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + +static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; + r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_buffer_storage */ + #ifdef GL_ARB_cl_event static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3935,6 +4275,20 @@ static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + +static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; + r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_texture */ + #ifdef GL_ARB_color_buffer_float static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) @@ -3970,6 +4324,19 @@ static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + +static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_variable_group_size */ + #ifdef GL_ARB_conservative_depth #endif /* GL_ARB_conservative_depth */ @@ -4091,6 +4458,10 @@ static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + +#endif /* GL_ARB_enhanced_layouts */ + #ifdef GL_ARB_explicit_attrib_location #endif /* GL_ARB_explicit_attrib_location */ @@ -4289,6 +4660,20 @@ static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + +static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; + r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_indirect_parameters */ + #ifdef GL_ARB_instanced_arrays static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4383,6 +4768,24 @@ static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + +static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; + r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; + r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; + r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; + r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; + r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_bind */ + #ifdef GL_ARB_multi_draw_indirect static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4533,6 +4936,10 @@ static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + +#endif /* GL_ARB_query_buffer_object */ + #ifdef GL_ARB_robust_buffer_access_behavior #endif /* GL_ARB_robust_buffer_access_behavior */ @@ -4620,6 +5027,10 @@ static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + #ifdef GL_ARB_separate_shader_objects static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4709,6 +5120,14 @@ static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_I #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + +#endif /* GL_ARB_shader_draw_parameters */ + +#ifdef GL_ARB_shader_group_vote + +#endif /* GL_ARB_shader_group_vote */ + #ifdef GL_ARB_shader_image_load_store static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) @@ -4861,6 +5280,20 @@ static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + +static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; + r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_texture */ + #ifdef GL_ARB_stencil_texturing #endif /* GL_ARB_stencil_texturing */ @@ -4992,6 +5425,10 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + #ifdef GL_ARB_texture_mirrored_repeat #endif /* GL_ARB_texture_mirrored_repeat */ @@ -5036,6 +5473,10 @@ static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + +#endif /* GL_ARB_texture_stencil8 */ + #ifdef GL_ARB_texture_storage static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) @@ -5383,6 +5824,10 @@ static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + #ifdef GL_ARB_vertex_type_2_10_10_10_rev static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) @@ -6119,55 +6564,38 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; - r = ((glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dEXT")) == NULL) || r; - r = ((glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dvEXT")) == NULL) || r; r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; - r = ((glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dEXT")) == NULL) || r; - r = ((glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dvEXT")) == NULL) || r; r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; - r = ((glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dEXT")) == NULL) || r; - r = ((glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dvEXT")) == NULL) || r; r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; - r = ((glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dEXT")) == NULL) || r; - r = ((glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dvEXT")) == NULL) || r; r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; - r = ((glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dvEXT")) == NULL) || r; r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; @@ -7197,6 +7625,21 @@ static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + +static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; + r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; + r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_map_texture */ + #ifdef GL_INTEL_parallel_arrays static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7239,9 +7682,9 @@ static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; - r = ((glGetPointerv = (PFNGLGETPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetPointerv")) == NULL) || r; r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; + r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; return r; @@ -7331,10 +7774,38 @@ static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + +static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; + r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; + + return r; +} + +#endif /* GL_NVX_conditional_render */ + #ifdef GL_NVX_gpu_memory_info #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect */ + #ifdef GL_NV_bindless_texture static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7360,10 +7831,32 @@ static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + +static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; + r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_blend_equation_advanced */ + +#ifdef GL_NV_blend_equation_advanced_coherent + +#endif /* GL_NV_blend_equation_advanced_coherent */ + #ifdef GL_NV_blend_square #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + +#endif /* GL_NV_compute_program5 */ + #ifdef GL_NV_conditional_render static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7395,6 +7888,10 @@ static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + +#endif /* GL_NV_deep_texture3D */ + #ifdef GL_NV_depth_buffer_float static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7418,6 +7915,19 @@ static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + +static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_texture */ + #ifdef GL_NV_evaluators static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) @@ -7569,6 +8079,10 @@ static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + +#endif /* GL_NV_gpu_program5_mem_extended */ + #ifdef GL_NV_gpu_program_fp64 #endif /* GL_NV_gpu_program_fp64 */ @@ -7891,6 +8405,10 @@ static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + +#endif /* GL_NV_shader_atomic_counters */ + #ifdef GL_NV_shader_atomic_float #endif /* GL_NV_shader_atomic_float */ @@ -7920,6 +8438,10 @@ static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + +#endif /* GL_NV_shader_storage_buffer_object */ + #ifdef GL_NV_tessellation_program5 #endif /* GL_NV_tessellation_program5 */ @@ -8298,6 +8820,78 @@ static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; + r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; + r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; + r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; + r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; + r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; + r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; + r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; + r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; + r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; + r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; + r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; + r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; + r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; + r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; + r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; + r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; + r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; + r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; + r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; + r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; + r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; + r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; + r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; + r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; + r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; + r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; + r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; + r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; + r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; + r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_0_compatibility */ + +#ifdef GL_REGAL_ES1_1_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; + r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; + r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; + r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; + r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; + r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; + r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; + r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; + r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; + r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; + r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; + r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; + r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_1_compatibility */ + +#ifdef GL_REGAL_enable + +#endif /* GL_REGAL_enable */ + #ifdef GL_REGAL_error_string static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) @@ -8327,6 +8921,15 @@ static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) #ifdef GL_REGAL_log +static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; + + return r; +} + #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates @@ -8909,7 +9512,8 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) } else { - CONST_CAST(GLEW_VERSION_4_3) = ( major > 4 ) || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_4_4) = ( major > 4 ) || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + CONST_CAST(GLEW_VERSION_4_3) = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_2) = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_1) = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_4_0) = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; @@ -8975,6 +9579,8 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #endif /* GL_VERSION_4_2 */ #ifdef GL_VERSION_4_3 #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 +#endif /* GL_VERSION_4_4 */ #ifdef GL_3DFX_multisample CONST_CAST(GLEW_3DFX_multisample) = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); #endif /* GL_3DFX_multisample */ @@ -9002,6 +9608,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_AMD_draw_buffers_blend) = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); if (glewExperimental || GLEW_AMD_draw_buffers_blend) CONST_CAST(GLEW_AMD_draw_buffers_blend) = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + CONST_CAST(GLEW_AMD_interleaved_elements) = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd); + if (glewExperimental || GLEW_AMD_interleaved_elements) CONST_CAST(GLEW_AMD_interleaved_elements) = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect CONST_CAST(GLEW_AMD_multi_draw_indirect) = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_AMD_multi_draw_indirect) CONST_CAST(GLEW_AMD_multi_draw_indirect) = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9030,6 +9640,13 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_AMD_shader_stencil_export CONST_CAST(GLEW_AMD_shader_stencil_export) = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + CONST_CAST(GLEW_AMD_shader_trinary_minmax) = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd); +#endif /* GL_AMD_shader_trinary_minmax */ +#ifdef GL_AMD_sparse_texture + CONST_CAST(GLEW_AMD_sparse_texture) = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_AMD_sparse_texture) CONST_CAST(GLEW_AMD_sparse_texture) = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended CONST_CAST(GLEW_AMD_stencil_operation_extended) = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); if (glewExperimental || GLEW_AMD_stencil_operation_extended) CONST_CAST(GLEW_AMD_stencil_operation_extended) = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9050,6 +9667,47 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_AMD_vertex_shader_viewport_index CONST_CAST(GLEW_AMD_vertex_shader_viewport_index) = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + CONST_CAST(GLEW_ANGLE_depth_texture) = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd); +#endif /* GL_ANGLE_depth_texture */ +#ifdef GL_ANGLE_framebuffer_blit + CONST_CAST(GLEW_ANGLE_framebuffer_blit) = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_blit) CONST_CAST(GLEW_ANGLE_framebuffer_blit) = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_blit */ +#ifdef GL_ANGLE_framebuffer_multisample + CONST_CAST(GLEW_ANGLE_framebuffer_multisample) = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) CONST_CAST(GLEW_ANGLE_framebuffer_multisample) = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_multisample */ +#ifdef GL_ANGLE_instanced_arrays + CONST_CAST(GLEW_ANGLE_instanced_arrays) = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_instanced_arrays) CONST_CAST(GLEW_ANGLE_instanced_arrays) = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_instanced_arrays */ +#ifdef GL_ANGLE_pack_reverse_row_order + CONST_CAST(GLEW_ANGLE_pack_reverse_row_order) = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd); +#endif /* GL_ANGLE_pack_reverse_row_order */ +#ifdef GL_ANGLE_program_binary + CONST_CAST(GLEW_ANGLE_program_binary) = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd); +#endif /* GL_ANGLE_program_binary */ +#ifdef GL_ANGLE_texture_compression_dxt1 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt1) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt1 */ +#ifdef GL_ANGLE_texture_compression_dxt3 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt3) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt3 */ +#ifdef GL_ANGLE_texture_compression_dxt5 + CONST_CAST(GLEW_ANGLE_texture_compression_dxt5) = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt5 */ +#ifdef GL_ANGLE_texture_usage + CONST_CAST(GLEW_ANGLE_texture_usage) = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd); +#endif /* GL_ANGLE_texture_usage */ +#ifdef GL_ANGLE_timer_query + CONST_CAST(GLEW_ANGLE_timer_query) = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_timer_query) CONST_CAST(GLEW_ANGLE_timer_query) = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_timer_query */ +#ifdef GL_ANGLE_translated_shader_source + CONST_CAST(GLEW_ANGLE_translated_shader_source) = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_translated_shader_source) CONST_CAST(GLEW_ANGLE_translated_shader_source) = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_aux_depth_stencil CONST_CAST(GLEW_APPLE_aux_depth_stencil) = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); #endif /* GL_APPLE_aux_depth_stencil */ @@ -9123,10 +9781,18 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_base_instance) = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); if (glewExperimental || GLEW_ARB_base_instance) CONST_CAST(GLEW_ARB_base_instance) = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + CONST_CAST(GLEW_ARB_bindless_texture) = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_bindless_texture) CONST_CAST(GLEW_ARB_bindless_texture) = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended CONST_CAST(GLEW_ARB_blend_func_extended) = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); if (glewExperimental || GLEW_ARB_blend_func_extended) CONST_CAST(GLEW_ARB_blend_func_extended) = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + CONST_CAST(GLEW_ARB_buffer_storage) = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd); + if (glewExperimental || GLEW_ARB_buffer_storage) CONST_CAST(GLEW_ARB_buffer_storage) = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event CONST_CAST(GLEW_ARB_cl_event) = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); if (glewExperimental || GLEW_ARB_cl_event) CONST_CAST(GLEW_ARB_cl_event) = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9135,6 +9801,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_clear_buffer_object) = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); if (glewExperimental || GLEW_ARB_clear_buffer_object) CONST_CAST(GLEW_ARB_clear_buffer_object) = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + CONST_CAST(GLEW_ARB_clear_texture) = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_clear_texture) CONST_CAST(GLEW_ARB_clear_texture) = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_color_buffer_float CONST_CAST(GLEW_ARB_color_buffer_float) = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9149,6 +9819,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_compute_shader) = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_compute_shader) CONST_CAST(GLEW_ARB_compute_shader) = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + CONST_CAST(GLEW_ARB_compute_variable_group_size) = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd); + if (glewExperimental || GLEW_ARB_compute_variable_group_size) CONST_CAST(GLEW_ARB_compute_variable_group_size) = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_conservative_depth CONST_CAST(GLEW_ARB_conservative_depth) = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); #endif /* GL_ARB_conservative_depth */ @@ -9192,6 +9866,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_draw_instanced CONST_CAST(GLEW_ARB_draw_instanced) = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + CONST_CAST(GLEW_ARB_enhanced_layouts) = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd); +#endif /* GL_ARB_enhanced_layouts */ #ifdef GL_ARB_explicit_attrib_location CONST_CAST(GLEW_ARB_explicit_attrib_location) = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); #endif /* GL_ARB_explicit_attrib_location */ @@ -9249,6 +9926,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_imaging) = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); if (glewExperimental || GLEW_ARB_imaging) CONST_CAST(GLEW_ARB_imaging) = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + CONST_CAST(GLEW_ARB_indirect_parameters) = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd); + if (glewExperimental || GLEW_ARB_indirect_parameters) CONST_CAST(GLEW_ARB_indirect_parameters) = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays CONST_CAST(GLEW_ARB_instanced_arrays) = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); if (glewExperimental || GLEW_ARB_instanced_arrays) CONST_CAST(GLEW_ARB_instanced_arrays) = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9276,6 +9957,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_matrix_palette) = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); if (glewExperimental || GLEW_ARB_matrix_palette) CONST_CAST(GLEW_ARB_matrix_palette) = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + CONST_CAST(GLEW_ARB_multi_bind) = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multi_bind) CONST_CAST(GLEW_ARB_multi_bind) = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect CONST_CAST(GLEW_ARB_multi_draw_indirect) = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); if (glewExperimental || GLEW_ARB_multi_draw_indirect) CONST_CAST(GLEW_ARB_multi_draw_indirect) = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9313,6 +9998,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_provoking_vertex) = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); if (glewExperimental || GLEW_ARB_provoking_vertex) CONST_CAST(GLEW_ARB_provoking_vertex) = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + CONST_CAST(GLEW_ARB_query_buffer_object) = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd); +#endif /* GL_ARB_query_buffer_object */ #ifdef GL_ARB_robust_buffer_access_behavior CONST_CAST(GLEW_ARB_robust_buffer_access_behavior) = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); #endif /* GL_ARB_robust_buffer_access_behavior */ @@ -9337,6 +10025,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_seamless_cube_map CONST_CAST(GLEW_ARB_seamless_cube_map) = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + CONST_CAST(GLEW_ARB_seamless_cubemap_per_texture) = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd); +#endif /* GL_ARB_seamless_cubemap_per_texture */ #ifdef GL_ARB_separate_shader_objects CONST_CAST(GLEW_ARB_separate_shader_objects) = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); if (glewExperimental || GLEW_ARB_separate_shader_objects) CONST_CAST(GLEW_ARB_separate_shader_objects) = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9348,6 +10039,12 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_shader_bit_encoding CONST_CAST(GLEW_ARB_shader_bit_encoding) = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + CONST_CAST(GLEW_ARB_shader_draw_parameters) = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd); +#endif /* GL_ARB_shader_draw_parameters */ +#ifdef GL_ARB_shader_group_vote + CONST_CAST(GLEW_ARB_shader_group_vote) = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd); +#endif /* GL_ARB_shader_group_vote */ #ifdef GL_ARB_shader_image_load_store CONST_CAST(GLEW_ARB_shader_image_load_store) = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); if (glewExperimental || GLEW_ARB_shader_image_load_store) CONST_CAST(GLEW_ARB_shader_image_load_store) = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9395,6 +10092,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_shadow_ambient CONST_CAST(GLEW_ARB_shadow_ambient) = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + CONST_CAST(GLEW_ARB_sparse_texture) = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sparse_texture) CONST_CAST(GLEW_ARB_sparse_texture) = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_stencil_texturing CONST_CAST(GLEW_ARB_stencil_texturing) = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); #endif /* GL_ARB_stencil_texturing */ @@ -9454,6 +10155,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_texture_gather CONST_CAST(GLEW_ARB_texture_gather) = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + CONST_CAST(GLEW_ARB_texture_mirror_clamp_to_edge) = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd); +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifdef GL_ARB_texture_mirrored_repeat CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); #endif /* GL_ARB_texture_mirrored_repeat */ @@ -9479,6 +10183,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_ARB_texture_rgb10_a2ui CONST_CAST(GLEW_ARB_texture_rgb10_a2ui) = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + CONST_CAST(GLEW_ARB_texture_stencil8) = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd); +#endif /* GL_ARB_texture_stencil8 */ #ifdef GL_ARB_texture_storage CONST_CAST(GLEW_ARB_texture_storage) = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); if (glewExperimental || GLEW_ARB_texture_storage) CONST_CAST(GLEW_ARB_texture_storage) = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); @@ -9549,6 +10256,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_ARB_vertex_shader) = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + CONST_CAST(GLEW_ARB_vertex_type_10f_11f_11f_rev) = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd); +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10036,6 +10746,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_INGR_interlace_read CONST_CAST(GLEW_INGR_interlace_read) = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + CONST_CAST(GLEW_INTEL_map_texture) = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_map_texture) CONST_CAST(GLEW_INTEL_map_texture) = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays CONST_CAST(GLEW_INTEL_parallel_arrays) = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); if (glewExperimental || GLEW_INTEL_parallel_arrays) CONST_CAST(GLEW_INTEL_parallel_arrays) = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10072,16 +10786,34 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_MESA_ycbcr_texture CONST_CAST(GLEW_MESA_ycbcr_texture) = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + CONST_CAST(GLEW_NVX_conditional_render) = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd); + if (glewExperimental || GLEW_NVX_conditional_render) CONST_CAST(GLEW_NVX_conditional_render) = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_gpu_memory_info CONST_CAST(GLEW_NVX_gpu_memory_info) = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + CONST_CAST(GLEW_NV_bindless_multi_draw_indirect) = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) CONST_CAST(GLEW_NV_bindless_multi_draw_indirect) = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_texture CONST_CAST(GLEW_NV_bindless_texture) = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); if (glewExperimental || GLEW_NV_bindless_texture) CONST_CAST(GLEW_NV_bindless_texture) = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + CONST_CAST(GLEW_NV_blend_equation_advanced) = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd); + if (glewExperimental || GLEW_NV_blend_equation_advanced) CONST_CAST(GLEW_NV_blend_equation_advanced) = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_blend_equation_advanced */ +#ifdef GL_NV_blend_equation_advanced_coherent + CONST_CAST(GLEW_NV_blend_equation_advanced_coherent) = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd); +#endif /* GL_NV_blend_equation_advanced_coherent */ #ifdef GL_NV_blend_square CONST_CAST(GLEW_NV_blend_square) = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + CONST_CAST(GLEW_NV_compute_program5) = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd); +#endif /* GL_NV_compute_program5 */ #ifdef GL_NV_conditional_render CONST_CAST(GLEW_NV_conditional_render) = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); if (glewExperimental || GLEW_NV_conditional_render) CONST_CAST(GLEW_NV_conditional_render) = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10093,6 +10825,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_copy_image) = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); if (glewExperimental || GLEW_NV_copy_image) CONST_CAST(GLEW_NV_copy_image) = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + CONST_CAST(GLEW_NV_deep_texture3D) = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd); +#endif /* GL_NV_deep_texture3D */ #ifdef GL_NV_depth_buffer_float CONST_CAST(GLEW_NV_depth_buffer_float) = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10103,6 +10838,10 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_NV_depth_range_unclamped CONST_CAST(GLEW_NV_depth_range_unclamped) = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + CONST_CAST(GLEW_NV_draw_texture) = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd); + if (glewExperimental || GLEW_NV_draw_texture) CONST_CAST(GLEW_NV_draw_texture) = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_draw_texture */ #ifdef GL_NV_evaluators CONST_CAST(GLEW_NV_evaluators) = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); if (glewExperimental || GLEW_NV_evaluators) CONST_CAST(GLEW_NV_evaluators) = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10152,6 +10891,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_NV_gpu_program5 CONST_CAST(GLEW_NV_gpu_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + CONST_CAST(GLEW_NV_gpu_program5_mem_extended) = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd); +#endif /* GL_NV_gpu_program5_mem_extended */ #ifdef GL_NV_gpu_program_fp64 CONST_CAST(GLEW_NV_gpu_program_fp64) = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); #endif /* GL_NV_gpu_program_fp64 */ @@ -10214,6 +10956,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_register_combiners2) = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + CONST_CAST(GLEW_NV_shader_atomic_counters) = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd); +#endif /* GL_NV_shader_atomic_counters */ #ifdef GL_NV_shader_atomic_float CONST_CAST(GLEW_NV_shader_atomic_float) = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); #endif /* GL_NV_shader_atomic_float */ @@ -10221,6 +10966,9 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLEW_NV_shader_buffer_load) = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); if (glewExperimental || GLEW_NV_shader_buffer_load) CONST_CAST(GLEW_NV_shader_buffer_load) = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + CONST_CAST(GLEW_NV_shader_storage_buffer_object) = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd); +#endif /* GL_NV_shader_storage_buffer_object */ #ifdef GL_NV_tessellation_program5 CONST_CAST(GLEW_NV_tessellation_program5) = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); #endif /* GL_NV_tessellation_program5 */ @@ -10337,6 +11085,17 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #ifdef GL_PGI_vertex_hints CONST_CAST(GLEW_PGI_vertex_hints) = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + CONST_CAST(GLEW_REGAL_ES1_0_compatibility) = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) CONST_CAST(GLEW_REGAL_ES1_0_compatibility) = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_0_compatibility */ +#ifdef GL_REGAL_ES1_1_compatibility + CONST_CAST(GLEW_REGAL_ES1_1_compatibility) = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) CONST_CAST(GLEW_REGAL_ES1_1_compatibility) = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_1_compatibility */ +#ifdef GL_REGAL_enable + CONST_CAST(GLEW_REGAL_enable) = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd); +#endif /* GL_REGAL_enable */ #ifdef GL_REGAL_error_string CONST_CAST(GLEW_REGAL_error_string) = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); if (glewExperimental || GLEW_REGAL_error_string) CONST_CAST(GLEW_REGAL_error_string) = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); @@ -10347,6 +11106,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) #endif /* GL_REGAL_extension_query */ #ifdef GL_REGAL_log CONST_CAST(GLEW_REGAL_log) = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_log) CONST_CAST(GLEW_REGAL_log) = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GL_REGAL_log */ #ifdef GL_REND_screen_coordinates CONST_CAST(GLEW_REND_screen_coordinates) = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); @@ -10727,6 +11487,8 @@ GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ARB_render_texture = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; @@ -10926,6 +11688,14 @@ static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + +#endif /* WGL_ARB_robustness_application_isolation */ + +#ifdef WGL_ARB_robustness_share_group_isolation + +#endif /* WGL_ARB_robustness_share_group_isolation */ + #ifdef WGL_ATI_pixel_format_float #endif /* WGL_ATI_pixel_format_float */ @@ -11418,6 +12188,12 @@ GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(WGLEW_ARB_render_texture) = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); if (glewExperimental || WGLEW_ARB_render_texture|| crippled) CONST_CAST(WGLEW_ARB_render_texture)= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + CONST_CAST(WGLEW_ARB_robustness_application_isolation) = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_application_isolation */ +#ifdef WGL_ARB_robustness_share_group_isolation + CONST_CAST(WGLEW_ARB_robustness_share_group_isolation) = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_share_group_isolation */ #ifdef WGL_ATI_pixel_format_float CONST_CAST(WGLEW_ATI_pixel_format_float) = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); #endif /* WGL_ATI_pixel_format_float */ @@ -11548,7 +12324,7 @@ GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) return GLEW_OK; } -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; @@ -11570,6 +12346,16 @@ PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; +PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; +PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; +PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; +PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; +PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; +PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; +PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; + PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; @@ -11702,6 +12488,7 @@ GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; GLboolean __GLXEW_ATI_render_texture = GL_FALSE; +GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; @@ -11727,7 +12514,7 @@ GLboolean __GLXEW_NV_present_video = GL_FALSE; GLboolean __GLXEW_NV_swap_group = GL_FALSE; GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; GLboolean __GLXEW_NV_video_capture = GL_FALSE; -GLboolean __GLXEW_NV_video_out = GL_FALSE; +GLboolean __GLXEW_NV_video_output = GL_FALSE; GLboolean __GLXEW_OML_swap_method = GL_FALSE; GLboolean __GLXEW_OML_sync_control = GL_FALSE; GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; @@ -11802,6 +12589,23 @@ static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) #ifdef GLX_AMD_gpu_association +static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; + r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; + r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; + r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; + r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context @@ -11872,6 +12676,10 @@ static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + +#endif /* GLX_EXT_buffer_age */ + #ifdef GLX_EXT_create_context_es2_profile #endif /* GLX_EXT_create_context_es2_profile */ @@ -12114,9 +12922,9 @@ static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out +#ifdef GLX_NV_video_output -static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) +static GLboolean _glewInit_GLX_NV_video_output (GLXEW_CONTEXT_ARG_DEF_INIT) { GLboolean r = GL_FALSE; @@ -12130,7 +12938,7 @@ static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) return r; } -#endif /* GLX_NV_video_out */ +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method @@ -12414,6 +13222,7 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) #endif /* GLX_3DFX_multisample */ #ifdef GLX_AMD_gpu_association CONST_CAST(GLXEW_AMD_gpu_association) = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || GLXEW_AMD_gpu_association) CONST_CAST(GLXEW_AMD_gpu_association) = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_AMD_gpu_association */ #ifdef GLX_ARB_create_context CONST_CAST(GLXEW_ARB_create_context) = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); @@ -12453,6 +13262,9 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLXEW_ATI_render_texture) = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + CONST_CAST(GLXEW_EXT_buffer_age) = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); +#endif /* GLX_EXT_buffer_age */ #ifdef GLX_EXT_create_context_es2_profile CONST_CAST(GLXEW_EXT_create_context_es2_profile) = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); #endif /* GLX_EXT_create_context_es2_profile */ @@ -12542,10 +13354,10 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) CONST_CAST(GLXEW_NV_video_capture) = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); if (glewExperimental || GLXEW_NV_video_capture) CONST_CAST(GLXEW_NV_video_capture) = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - CONST_CAST(GLXEW_NV_video_out) = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); - if (glewExperimental || GLXEW_NV_video_out) CONST_CAST(GLXEW_NV_video_out) = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_video_out */ +#ifdef GLX_NV_video_output + CONST_CAST(GLXEW_NV_video_output) = _glewSearchExtension("GLX_NV_video_output", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_output) CONST_CAST(GLXEW_NV_video_output) = !_glewInit_GLX_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method CONST_CAST(GLXEW_OML_swap_method) = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); #endif /* GLX_OML_swap_method */ @@ -12620,7 +13432,7 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) return GLEW_OK; } -#endif /* !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ +#endif /* !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ /* ------------------------------------------------------------------------ */ @@ -12643,9 +13455,9 @@ const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) static const GLubyte* _glewString[] = { (const GLubyte*)NULL, - (const GLubyte*)"1.9.0", + (const GLubyte*)"1.10.0", (const GLubyte*)"1", - (const GLubyte*)"9", + (const GLubyte*)"10", (const GLubyte*)"0" }; const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; @@ -12660,7 +13472,7 @@ GLboolean glewExperimental = GL_FALSE; #if defined(_WIN32) extern GLenum GLEWAPIENTRY wglewContextInit (void); -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) extern GLenum GLEWAPIENTRY glxewContextInit (void); #endif /* _WIN32 */ @@ -12671,7 +13483,7 @@ GLenum GLEWAPIENTRY glewInit (void) if ( r != 0 ) return r; #if defined(_WIN32) return wglewContextInit(); -#elif !defined(__ANDROID__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ +#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ return glxewContextInit(); #else return r; @@ -12798,6 +13610,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) ret = GLEW_VERSION_4_3; continue; } +#endif +#ifdef GL_VERSION_4_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) + { + ret = GLEW_VERSION_4_4; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) @@ -12861,6 +13680,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_AMD_interleaved_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) + { + ret = GLEW_AMD_interleaved_elements; + continue; + } +#endif #ifdef GL_AMD_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { @@ -12917,6 +13743,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_AMD_shader_trinary_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) + { + ret = GLEW_AMD_shader_trinary_minmax; + continue; + } +#endif +#ifdef GL_AMD_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_AMD_sparse_texture; + continue; + } +#endif #ifdef GL_AMD_stencil_operation_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) { @@ -12958,6 +13798,93 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) ret = GLEW_AMD_vertex_shader_viewport_index; continue; } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) + { +#ifdef GL_ANGLE_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ANGLE_depth_texture; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_ANGLE_framebuffer_blit; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_ANGLE_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_ANGLE_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ANGLE_instanced_arrays; + continue; + } +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) + { + ret = GLEW_ANGLE_pack_reverse_row_order; + continue; + } +#endif +#ifdef GL_ANGLE_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) + { + ret = GLEW_ANGLE_program_binary; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt3; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt5; + continue; + } +#endif +#ifdef GL_ANGLE_texture_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) + { + ret = GLEW_ANGLE_texture_usage; + continue; + } +#endif +#ifdef GL_ANGLE_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ANGLE_timer_query; + continue; + } +#endif +#ifdef GL_ANGLE_translated_shader_source + if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) + { + ret = GLEW_ANGLE_translated_shader_source; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) @@ -13112,6 +14039,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_ARB_bindless_texture; + continue; + } +#endif #ifdef GL_ARB_blend_func_extended if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) { @@ -13119,6 +14053,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_buffer_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) + { + ret = GLEW_ARB_buffer_storage; + continue; + } +#endif #ifdef GL_ARB_cl_event if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) { @@ -13133,6 +14074,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_clear_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) + { + ret = GLEW_ARB_clear_texture; + continue; + } +#endif #ifdef GL_ARB_color_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) { @@ -13161,6 +14109,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_compute_variable_group_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) + { + ret = GLEW_ARB_compute_variable_group_size; + continue; + } +#endif #ifdef GL_ARB_conservative_depth if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) { @@ -13245,6 +14200,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_enhanced_layouts + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) + { + ret = GLEW_ARB_enhanced_layouts; + continue; + } +#endif #ifdef GL_ARB_explicit_attrib_location if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) { @@ -13364,6 +14326,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_indirect_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) + { + ret = GLEW_ARB_indirect_parameters; + continue; + } +#endif #ifdef GL_ARB_instanced_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) { @@ -13413,6 +14382,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_multi_bind + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) + { + ret = GLEW_ARB_multi_bind; + continue; + } +#endif #ifdef GL_ARB_multi_draw_indirect if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) { @@ -13483,6 +14459,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_ARB_query_buffer_object; + continue; + } +#endif #ifdef GL_ARB_robust_buffer_access_behavior if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) { @@ -13532,6 +14515,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_ARB_seamless_cubemap_per_texture; + continue; + } +#endif #ifdef GL_ARB_separate_shader_objects if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) { @@ -13553,6 +14543,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_shader_draw_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) + { + ret = GLEW_ARB_shader_draw_parameters; + continue; + } +#endif +#ifdef GL_ARB_shader_group_vote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) + { + ret = GLEW_ARB_shader_group_vote; + continue; + } +#endif #ifdef GL_ARB_shader_image_load_store if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) { @@ -13651,6 +14655,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_ARB_sparse_texture; + continue; + } +#endif #ifdef GL_ARB_stencil_texturing if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) { @@ -13777,6 +14788,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) + { + ret = GLEW_ARB_texture_mirror_clamp_to_edge; + continue; + } +#endif #ifdef GL_ARB_texture_mirrored_repeat if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) { @@ -13833,6 +14851,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_texture_stencil8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) + { + ret = GLEW_ARB_texture_stencil8; + continue; + } +#endif #ifdef GL_ARB_texture_storage if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) { @@ -13959,6 +14984,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) + { + ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; + continue; + } +#endif #ifdef GL_ARB_vertex_type_2_10_10_10_rev if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) { @@ -14949,6 +15981,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) { +#ifdef GL_INTEL_map_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) + { + ret = GLEW_INTEL_map_texture; + continue; + } +#endif #ifdef GL_INTEL_parallel_arrays if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) { @@ -15034,6 +16073,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) { +#ifdef GL_NVX_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NVX_conditional_render; + continue; + } +#endif #ifdef GL_NVX_gpu_memory_info if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) { @@ -15044,6 +16090,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) { +#ifdef GL_NV_bindless_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) + { + ret = GLEW_NV_bindless_multi_draw_indirect; + continue; + } +#endif #ifdef GL_NV_bindless_texture if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) { @@ -15051,6 +16104,20 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_NV_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_NV_blend_equation_advanced_coherent; + continue; + } +#endif #ifdef GL_NV_blend_square if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) { @@ -15058,6 +16125,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_compute_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) + { + ret = GLEW_NV_compute_program5; + continue; + } +#endif #ifdef GL_NV_conditional_render if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) { @@ -15079,6 +16153,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_deep_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) + { + ret = GLEW_NV_deep_texture3D; + continue; + } +#endif #ifdef GL_NV_depth_buffer_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) { @@ -15100,6 +16181,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_draw_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) + { + ret = GLEW_NV_draw_texture; + continue; + } +#endif #ifdef GL_NV_evaluators if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) { @@ -15198,6 +16286,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_gpu_program5_mem_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) + { + ret = GLEW_NV_gpu_program5_mem_extended; + continue; + } +#endif #ifdef GL_NV_gpu_program_fp64 if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) { @@ -15317,6 +16412,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_NV_shader_atomic_counters; + continue; + } +#endif #ifdef GL_NV_shader_atomic_float if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) { @@ -15331,6 +16433,13 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) continue; } #endif +#ifdef GL_NV_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_NV_shader_storage_buffer_object; + continue; + } +#endif #ifdef GL_NV_tessellation_program5 if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) { @@ -15588,6 +16697,27 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) { +#ifdef GL_REGAL_ES1_0_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_0_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_ES1_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_1_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_enable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) + { + ret = GLEW_REGAL_enable; + continue; + } +#endif #ifdef GL_REGAL_error_string if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) { @@ -16204,6 +17334,20 @@ GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) ret = WGLEW_ARB_render_texture; continue; } +#endif +#ifdef WGL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = WGLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef WGL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = WGLEW_ARB_robustness_share_group_isolation; + continue; + } #endif } if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) @@ -16472,7 +17616,7 @@ GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) return ret; } -#elif !defined(__ANDROID__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) #if defined(GLEW_MX) GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) @@ -16623,6 +17767,13 @@ GLboolean glxewIsSupported (const char* name) } if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) { +#ifdef GLX_EXT_buffer_age + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) + { + ret = GLXEW_EXT_buffer_age; + continue; + } +#endif #ifdef GLX_EXT_create_context_es2_profile if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) { @@ -16807,10 +17958,10 @@ GLboolean glxewIsSupported (const char* name) continue; } #endif -#ifdef GLX_NV_video_out - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) +#ifdef GLX_NV_video_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) { - ret = GLXEW_NV_video_out; + ret = GLXEW_NV_video_output; continue; } #endif diff --git a/Externals/GLew/src/glewinfo.c b/Externals/GLew/src/glewinfo.c index ac0434bc95..7634a3ff0a 100644 --- a/Externals/GLew/src/glewinfo.c +++ b/Externals/GLew/src/glewinfo.c @@ -539,6 +539,15 @@ static void _glewInfo_GL_VERSION_4_3 (void) #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 + +static void _glewInfo_GL_VERSION_4_4 (void) +{ + glewPrintExt("GL_VERSION_4_4", GLEW_VERSION_4_4, GLEW_VERSION_4_4, GLEW_VERSION_4_4); +} + +#endif /* GL_VERSION_4_4 */ + #ifdef GL_3DFX_multisample static void _glewInfo_GL_3DFX_multisample (void) @@ -623,6 +632,17 @@ static void _glewInfo_GL_AMD_draw_buffers_blend (void) #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + +static void _glewInfo_GL_AMD_interleaved_elements (void) +{ + glewPrintExt("GL_AMD_interleaved_elements", GLEW_AMD_interleaved_elements, glewIsSupported("GL_AMD_interleaved_elements"), glewGetExtension("GL_AMD_interleaved_elements")); + + glewInfoFunc("glVertexAttribParameteriAMD", glVertexAttribParameteriAMD == NULL); +} + +#endif /* GL_AMD_interleaved_elements */ + #ifdef GL_AMD_multi_draw_indirect static void _glewInfo_GL_AMD_multi_draw_indirect (void) @@ -716,6 +736,27 @@ static void _glewInfo_GL_AMD_shader_stencil_export (void) #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + +static void _glewInfo_GL_AMD_shader_trinary_minmax (void) +{ + glewPrintExt("GL_AMD_shader_trinary_minmax", GLEW_AMD_shader_trinary_minmax, glewIsSupported("GL_AMD_shader_trinary_minmax"), glewGetExtension("GL_AMD_shader_trinary_minmax")); +} + +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifdef GL_AMD_sparse_texture + +static void _glewInfo_GL_AMD_sparse_texture (void) +{ + glewPrintExt("GL_AMD_sparse_texture", GLEW_AMD_sparse_texture, glewIsSupported("GL_AMD_sparse_texture"), glewGetExtension("GL_AMD_sparse_texture")); + + glewInfoFunc("glTexStorageSparseAMD", glTexStorageSparseAMD == NULL); + glewInfoFunc("glTextureStorageSparseAMD", glTextureStorageSparseAMD == NULL); +} + +#endif /* GL_AMD_sparse_texture */ + #ifdef GL_AMD_stencil_operation_extended static void _glewInfo_GL_AMD_stencil_operation_extended (void) @@ -775,6 +816,136 @@ static void _glewInfo_GL_AMD_vertex_shader_viewport_index (void) #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + +static void _glewInfo_GL_ANGLE_depth_texture (void) +{ + glewPrintExt("GL_ANGLE_depth_texture", GLEW_ANGLE_depth_texture, glewIsSupported("GL_ANGLE_depth_texture"), glewGetExtension("GL_ANGLE_depth_texture")); +} + +#endif /* GL_ANGLE_depth_texture */ + +#ifdef GL_ANGLE_framebuffer_blit + +static void _glewInfo_GL_ANGLE_framebuffer_blit (void) +{ + glewPrintExt("GL_ANGLE_framebuffer_blit", GLEW_ANGLE_framebuffer_blit, glewIsSupported("GL_ANGLE_framebuffer_blit"), glewGetExtension("GL_ANGLE_framebuffer_blit")); + + glewInfoFunc("glBlitFramebufferANGLE", glBlitFramebufferANGLE == NULL); +} + +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifdef GL_ANGLE_framebuffer_multisample + +static void _glewInfo_GL_ANGLE_framebuffer_multisample (void) +{ + glewPrintExt("GL_ANGLE_framebuffer_multisample", GLEW_ANGLE_framebuffer_multisample, glewIsSupported("GL_ANGLE_framebuffer_multisample"), glewGetExtension("GL_ANGLE_framebuffer_multisample")); + + glewInfoFunc("glRenderbufferStorageMultisampleANGLE", glRenderbufferStorageMultisampleANGLE == NULL); +} + +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifdef GL_ANGLE_instanced_arrays + +static void _glewInfo_GL_ANGLE_instanced_arrays (void) +{ + glewPrintExt("GL_ANGLE_instanced_arrays", GLEW_ANGLE_instanced_arrays, glewIsSupported("GL_ANGLE_instanced_arrays"), glewGetExtension("GL_ANGLE_instanced_arrays")); + + glewInfoFunc("glDrawArraysInstancedANGLE", glDrawArraysInstancedANGLE == NULL); + glewInfoFunc("glDrawElementsInstancedANGLE", glDrawElementsInstancedANGLE == NULL); + glewInfoFunc("glVertexAttribDivisorANGLE", glVertexAttribDivisorANGLE == NULL); +} + +#endif /* GL_ANGLE_instanced_arrays */ + +#ifdef GL_ANGLE_pack_reverse_row_order + +static void _glewInfo_GL_ANGLE_pack_reverse_row_order (void) +{ + glewPrintExt("GL_ANGLE_pack_reverse_row_order", GLEW_ANGLE_pack_reverse_row_order, glewIsSupported("GL_ANGLE_pack_reverse_row_order"), glewGetExtension("GL_ANGLE_pack_reverse_row_order")); +} + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +#ifdef GL_ANGLE_program_binary + +static void _glewInfo_GL_ANGLE_program_binary (void) +{ + glewPrintExt("GL_ANGLE_program_binary", GLEW_ANGLE_program_binary, glewIsSupported("GL_ANGLE_program_binary"), glewGetExtension("GL_ANGLE_program_binary")); +} + +#endif /* GL_ANGLE_program_binary */ + +#ifdef GL_ANGLE_texture_compression_dxt1 + +static void _glewInfo_GL_ANGLE_texture_compression_dxt1 (void) +{ + glewPrintExt("GL_ANGLE_texture_compression_dxt1", GLEW_ANGLE_texture_compression_dxt1, glewIsSupported("GL_ANGLE_texture_compression_dxt1"), glewGetExtension("GL_ANGLE_texture_compression_dxt1")); +} + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +#ifdef GL_ANGLE_texture_compression_dxt3 + +static void _glewInfo_GL_ANGLE_texture_compression_dxt3 (void) +{ + glewPrintExt("GL_ANGLE_texture_compression_dxt3", GLEW_ANGLE_texture_compression_dxt3, glewIsSupported("GL_ANGLE_texture_compression_dxt3"), glewGetExtension("GL_ANGLE_texture_compression_dxt3")); +} + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +#ifdef GL_ANGLE_texture_compression_dxt5 + +static void _glewInfo_GL_ANGLE_texture_compression_dxt5 (void) +{ + glewPrintExt("GL_ANGLE_texture_compression_dxt5", GLEW_ANGLE_texture_compression_dxt5, glewIsSupported("GL_ANGLE_texture_compression_dxt5"), glewGetExtension("GL_ANGLE_texture_compression_dxt5")); +} + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +#ifdef GL_ANGLE_texture_usage + +static void _glewInfo_GL_ANGLE_texture_usage (void) +{ + glewPrintExt("GL_ANGLE_texture_usage", GLEW_ANGLE_texture_usage, glewIsSupported("GL_ANGLE_texture_usage"), glewGetExtension("GL_ANGLE_texture_usage")); +} + +#endif /* GL_ANGLE_texture_usage */ + +#ifdef GL_ANGLE_timer_query + +static void _glewInfo_GL_ANGLE_timer_query (void) +{ + glewPrintExt("GL_ANGLE_timer_query", GLEW_ANGLE_timer_query, glewIsSupported("GL_ANGLE_timer_query"), glewGetExtension("GL_ANGLE_timer_query")); + + glewInfoFunc("glBeginQueryANGLE", glBeginQueryANGLE == NULL); + glewInfoFunc("glDeleteQueriesANGLE", glDeleteQueriesANGLE == NULL); + glewInfoFunc("glEndQueryANGLE", glEndQueryANGLE == NULL); + glewInfoFunc("glGenQueriesANGLE", glGenQueriesANGLE == NULL); + glewInfoFunc("glGetQueryObjecti64vANGLE", glGetQueryObjecti64vANGLE == NULL); + glewInfoFunc("glGetQueryObjectivANGLE", glGetQueryObjectivANGLE == NULL); + glewInfoFunc("glGetQueryObjectui64vANGLE", glGetQueryObjectui64vANGLE == NULL); + glewInfoFunc("glGetQueryObjectuivANGLE", glGetQueryObjectuivANGLE == NULL); + glewInfoFunc("glGetQueryivANGLE", glGetQueryivANGLE == NULL); + glewInfoFunc("glIsQueryANGLE", glIsQueryANGLE == NULL); + glewInfoFunc("glQueryCounterANGLE", glQueryCounterANGLE == NULL); +} + +#endif /* GL_ANGLE_timer_query */ + +#ifdef GL_ANGLE_translated_shader_source + +static void _glewInfo_GL_ANGLE_translated_shader_source (void) +{ + glewPrintExt("GL_ANGLE_translated_shader_source", GLEW_ANGLE_translated_shader_source, glewIsSupported("GL_ANGLE_translated_shader_source"), glewGetExtension("GL_ANGLE_translated_shader_source")); + + glewInfoFunc("glGetTranslatedShaderSourceANGLE", glGetTranslatedShaderSourceANGLE == NULL); +} + +#endif /* GL_ANGLE_translated_shader_source */ + #ifdef GL_APPLE_aux_depth_stencil static void _glewInfo_GL_APPLE_aux_depth_stencil (void) @@ -1016,6 +1187,32 @@ static void _glewInfo_GL_ARB_base_instance (void) #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + +static void _glewInfo_GL_ARB_bindless_texture (void) +{ + glewPrintExt("GL_ARB_bindless_texture", GLEW_ARB_bindless_texture, glewIsSupported("GL_ARB_bindless_texture"), glewGetExtension("GL_ARB_bindless_texture")); + + glewInfoFunc("glGetImageHandleARB", glGetImageHandleARB == NULL); + glewInfoFunc("glGetTextureHandleARB", glGetTextureHandleARB == NULL); + glewInfoFunc("glGetTextureSamplerHandleARB", glGetTextureSamplerHandleARB == NULL); + glewInfoFunc("glGetVertexAttribLui64vARB", glGetVertexAttribLui64vARB == NULL); + glewInfoFunc("glIsImageHandleResidentARB", glIsImageHandleResidentARB == NULL); + glewInfoFunc("glIsTextureHandleResidentARB", glIsTextureHandleResidentARB == NULL); + glewInfoFunc("glMakeImageHandleNonResidentARB", glMakeImageHandleNonResidentARB == NULL); + glewInfoFunc("glMakeImageHandleResidentARB", glMakeImageHandleResidentARB == NULL); + glewInfoFunc("glMakeTextureHandleNonResidentARB", glMakeTextureHandleNonResidentARB == NULL); + glewInfoFunc("glMakeTextureHandleResidentARB", glMakeTextureHandleResidentARB == NULL); + glewInfoFunc("glProgramUniformHandleui64ARB", glProgramUniformHandleui64ARB == NULL); + glewInfoFunc("glProgramUniformHandleui64vARB", glProgramUniformHandleui64vARB == NULL); + glewInfoFunc("glUniformHandleui64ARB", glUniformHandleui64ARB == NULL); + glewInfoFunc("glUniformHandleui64vARB", glUniformHandleui64vARB == NULL); + glewInfoFunc("glVertexAttribL1ui64ARB", glVertexAttribL1ui64ARB == NULL); + glewInfoFunc("glVertexAttribL1ui64vARB", glVertexAttribL1ui64vARB == NULL); +} + +#endif /* GL_ARB_bindless_texture */ + #ifdef GL_ARB_blend_func_extended static void _glewInfo_GL_ARB_blend_func_extended (void) @@ -1028,6 +1225,18 @@ static void _glewInfo_GL_ARB_blend_func_extended (void) #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + +static void _glewInfo_GL_ARB_buffer_storage (void) +{ + glewPrintExt("GL_ARB_buffer_storage", GLEW_ARB_buffer_storage, glewIsSupported("GL_ARB_buffer_storage"), glewGetExtension("GL_ARB_buffer_storage")); + + glewInfoFunc("glBufferStorage", glBufferStorage == NULL); + glewInfoFunc("glNamedBufferStorageEXT", glNamedBufferStorageEXT == NULL); +} + +#endif /* GL_ARB_buffer_storage */ + #ifdef GL_ARB_cl_event static void _glewInfo_GL_ARB_cl_event (void) @@ -1053,6 +1262,18 @@ static void _glewInfo_GL_ARB_clear_buffer_object (void) #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + +static void _glewInfo_GL_ARB_clear_texture (void) +{ + glewPrintExt("GL_ARB_clear_texture", GLEW_ARB_clear_texture, glewIsSupported("GL_ARB_clear_texture"), glewGetExtension("GL_ARB_clear_texture")); + + glewInfoFunc("glClearTexImage", glClearTexImage == NULL); + glewInfoFunc("glClearTexSubImage", glClearTexSubImage == NULL); +} + +#endif /* GL_ARB_clear_texture */ + #ifdef GL_ARB_color_buffer_float static void _glewInfo_GL_ARB_color_buffer_float (void) @@ -1094,6 +1315,17 @@ static void _glewInfo_GL_ARB_compute_shader (void) #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + +static void _glewInfo_GL_ARB_compute_variable_group_size (void) +{ + glewPrintExt("GL_ARB_compute_variable_group_size", GLEW_ARB_compute_variable_group_size, glewIsSupported("GL_ARB_compute_variable_group_size"), glewGetExtension("GL_ARB_compute_variable_group_size")); + + glewInfoFunc("glDispatchComputeGroupSizeARB", glDispatchComputeGroupSizeARB == NULL); +} + +#endif /* GL_ARB_compute_variable_group_size */ + #ifdef GL_ARB_conservative_depth static void _glewInfo_GL_ARB_conservative_depth (void) @@ -1226,6 +1458,15 @@ static void _glewInfo_GL_ARB_draw_instanced (void) #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + +static void _glewInfo_GL_ARB_enhanced_layouts (void) +{ + glewPrintExt("GL_ARB_enhanced_layouts", GLEW_ARB_enhanced_layouts, glewIsSupported("GL_ARB_enhanced_layouts"), glewGetExtension("GL_ARB_enhanced_layouts")); +} + +#endif /* GL_ARB_enhanced_layouts */ + #ifdef GL_ARB_explicit_attrib_location static void _glewInfo_GL_ARB_explicit_attrib_location (void) @@ -1467,6 +1708,18 @@ static void _glewInfo_GL_ARB_imaging (void) #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + +static void _glewInfo_GL_ARB_indirect_parameters (void) +{ + glewPrintExt("GL_ARB_indirect_parameters", GLEW_ARB_indirect_parameters, glewIsSupported("GL_ARB_indirect_parameters"), glewGetExtension("GL_ARB_indirect_parameters")); + + glewInfoFunc("glMultiDrawArraysIndirectCountARB", glMultiDrawArraysIndirectCountARB == NULL); + glewInfoFunc("glMultiDrawElementsIndirectCountARB", glMultiDrawElementsIndirectCountARB == NULL); +} + +#endif /* GL_ARB_indirect_parameters */ + #ifdef GL_ARB_instanced_arrays static void _glewInfo_GL_ARB_instanced_arrays (void) @@ -1554,6 +1807,22 @@ static void _glewInfo_GL_ARB_matrix_palette (void) #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + +static void _glewInfo_GL_ARB_multi_bind (void) +{ + glewPrintExt("GL_ARB_multi_bind", GLEW_ARB_multi_bind, glewIsSupported("GL_ARB_multi_bind"), glewGetExtension("GL_ARB_multi_bind")); + + glewInfoFunc("glBindBuffersBase", glBindBuffersBase == NULL); + glewInfoFunc("glBindBuffersRange", glBindBuffersRange == NULL); + glewInfoFunc("glBindImageTextures", glBindImageTextures == NULL); + glewInfoFunc("glBindSamplers", glBindSamplers == NULL); + glewInfoFunc("glBindTextures", glBindTextures == NULL); + glewInfoFunc("glBindVertexBuffers", glBindVertexBuffers == NULL); +} + +#endif /* GL_ARB_multi_bind */ + #ifdef GL_ARB_multi_draw_indirect static void _glewInfo_GL_ARB_multi_draw_indirect (void) @@ -1705,6 +1974,15 @@ static void _glewInfo_GL_ARB_provoking_vertex (void) #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + +static void _glewInfo_GL_ARB_query_buffer_object (void) +{ + glewPrintExt("GL_ARB_query_buffer_object", GLEW_ARB_query_buffer_object, glewIsSupported("GL_ARB_query_buffer_object"), glewGetExtension("GL_ARB_query_buffer_object")); +} + +#endif /* GL_ARB_query_buffer_object */ + #ifdef GL_ARB_robust_buffer_access_behavior static void _glewInfo_GL_ARB_robust_buffer_access_behavior (void) @@ -1806,6 +2084,15 @@ static void _glewInfo_GL_ARB_seamless_cube_map (void) #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + +static void _glewInfo_GL_ARB_seamless_cubemap_per_texture (void) +{ + glewPrintExt("GL_ARB_seamless_cubemap_per_texture", GLEW_ARB_seamless_cubemap_per_texture, glewIsSupported("GL_ARB_seamless_cubemap_per_texture"), glewGetExtension("GL_ARB_seamless_cubemap_per_texture")); +} + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + #ifdef GL_ARB_separate_shader_objects static void _glewInfo_GL_ARB_separate_shader_objects (void) @@ -1896,6 +2183,24 @@ static void _glewInfo_GL_ARB_shader_bit_encoding (void) #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + +static void _glewInfo_GL_ARB_shader_draw_parameters (void) +{ + glewPrintExt("GL_ARB_shader_draw_parameters", GLEW_ARB_shader_draw_parameters, glewIsSupported("GL_ARB_shader_draw_parameters"), glewGetExtension("GL_ARB_shader_draw_parameters")); +} + +#endif /* GL_ARB_shader_draw_parameters */ + +#ifdef GL_ARB_shader_group_vote + +static void _glewInfo_GL_ARB_shader_group_vote (void) +{ + glewPrintExt("GL_ARB_shader_group_vote", GLEW_ARB_shader_group_vote, glewIsSupported("GL_ARB_shader_group_vote"), glewGetExtension("GL_ARB_shader_group_vote")); +} + +#endif /* GL_ARB_shader_group_vote */ + #ifdef GL_ARB_shader_image_load_store static void _glewInfo_GL_ARB_shader_image_load_store (void) @@ -2083,6 +2388,18 @@ static void _glewInfo_GL_ARB_shadow_ambient (void) #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + +static void _glewInfo_GL_ARB_sparse_texture (void) +{ + glewPrintExt("GL_ARB_sparse_texture", GLEW_ARB_sparse_texture, glewIsSupported("GL_ARB_sparse_texture"), glewGetExtension("GL_ARB_sparse_texture")); + + glewInfoFunc("glTexPageCommitmentARB", glTexPageCommitmentARB == NULL); + glewInfoFunc("glTexturePageCommitmentEXT", glTexturePageCommitmentEXT == NULL); +} + +#endif /* GL_ARB_sparse_texture */ + #ifdef GL_ARB_stencil_texturing static void _glewInfo_GL_ARB_stencil_texturing (void) @@ -2269,6 +2586,15 @@ static void _glewInfo_GL_ARB_texture_gather (void) #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + +static void _glewInfo_GL_ARB_texture_mirror_clamp_to_edge (void) +{ + glewPrintExt("GL_ARB_texture_mirror_clamp_to_edge", GLEW_ARB_texture_mirror_clamp_to_edge, glewIsSupported("GL_ARB_texture_mirror_clamp_to_edge"), glewGetExtension("GL_ARB_texture_mirror_clamp_to_edge")); +} + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + #ifdef GL_ARB_texture_mirrored_repeat static void _glewInfo_GL_ARB_texture_mirrored_repeat (void) @@ -2346,6 +2672,15 @@ static void _glewInfo_GL_ARB_texture_rgb10_a2ui (void) #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + +static void _glewInfo_GL_ARB_texture_stencil8 (void) +{ + glewPrintExt("GL_ARB_texture_stencil8", GLEW_ARB_texture_stencil8, glewIsSupported("GL_ARB_texture_stencil8"), glewGetExtension("GL_ARB_texture_stencil8")); +} + +#endif /* GL_ARB_texture_stencil8 */ + #ifdef GL_ARB_texture_storage static void _glewInfo_GL_ARB_texture_storage (void) @@ -2671,6 +3006,15 @@ static void _glewInfo_GL_ARB_vertex_shader (void) #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + +static void _glewInfo_GL_ARB_vertex_type_10f_11f_11f_rev (void) +{ + glewPrintExt("GL_ARB_vertex_type_10f_11f_11f_rev", GLEW_ARB_vertex_type_10f_11f_11f_rev, glewIsSupported("GL_ARB_vertex_type_10f_11f_11f_rev"), glewGetExtension("GL_ARB_vertex_type_10f_11f_11f_rev")); +} + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + #ifdef GL_ARB_vertex_type_2_10_10_10_rev static void _glewInfo_GL_ARB_vertex_type_2_10_10_10_rev (void) @@ -3450,55 +3794,38 @@ static void _glewInfo_GL_EXT_direct_state_access (void) glewInfoFunc("glNamedRenderbufferStorageEXT", glNamedRenderbufferStorageEXT == NULL); glewInfoFunc("glNamedRenderbufferStorageMultisampleCoverageEXT", glNamedRenderbufferStorageMultisampleCoverageEXT == NULL); glewInfoFunc("glNamedRenderbufferStorageMultisampleEXT", glNamedRenderbufferStorageMultisampleEXT == NULL); - glewInfoFunc("glProgramUniform1dEXT", glProgramUniform1dEXT == NULL); - glewInfoFunc("glProgramUniform1dvEXT", glProgramUniform1dvEXT == NULL); glewInfoFunc("glProgramUniform1fEXT", glProgramUniform1fEXT == NULL); glewInfoFunc("glProgramUniform1fvEXT", glProgramUniform1fvEXT == NULL); glewInfoFunc("glProgramUniform1iEXT", glProgramUniform1iEXT == NULL); glewInfoFunc("glProgramUniform1ivEXT", glProgramUniform1ivEXT == NULL); glewInfoFunc("glProgramUniform1uiEXT", glProgramUniform1uiEXT == NULL); glewInfoFunc("glProgramUniform1uivEXT", glProgramUniform1uivEXT == NULL); - glewInfoFunc("glProgramUniform2dEXT", glProgramUniform2dEXT == NULL); - glewInfoFunc("glProgramUniform2dvEXT", glProgramUniform2dvEXT == NULL); glewInfoFunc("glProgramUniform2fEXT", glProgramUniform2fEXT == NULL); glewInfoFunc("glProgramUniform2fvEXT", glProgramUniform2fvEXT == NULL); glewInfoFunc("glProgramUniform2iEXT", glProgramUniform2iEXT == NULL); glewInfoFunc("glProgramUniform2ivEXT", glProgramUniform2ivEXT == NULL); glewInfoFunc("glProgramUniform2uiEXT", glProgramUniform2uiEXT == NULL); glewInfoFunc("glProgramUniform2uivEXT", glProgramUniform2uivEXT == NULL); - glewInfoFunc("glProgramUniform3dEXT", glProgramUniform3dEXT == NULL); - glewInfoFunc("glProgramUniform3dvEXT", glProgramUniform3dvEXT == NULL); glewInfoFunc("glProgramUniform3fEXT", glProgramUniform3fEXT == NULL); glewInfoFunc("glProgramUniform3fvEXT", glProgramUniform3fvEXT == NULL); glewInfoFunc("glProgramUniform3iEXT", glProgramUniform3iEXT == NULL); glewInfoFunc("glProgramUniform3ivEXT", glProgramUniform3ivEXT == NULL); glewInfoFunc("glProgramUniform3uiEXT", glProgramUniform3uiEXT == NULL); glewInfoFunc("glProgramUniform3uivEXT", glProgramUniform3uivEXT == NULL); - glewInfoFunc("glProgramUniform4dEXT", glProgramUniform4dEXT == NULL); - glewInfoFunc("glProgramUniform4dvEXT", glProgramUniform4dvEXT == NULL); glewInfoFunc("glProgramUniform4fEXT", glProgramUniform4fEXT == NULL); glewInfoFunc("glProgramUniform4fvEXT", glProgramUniform4fvEXT == NULL); glewInfoFunc("glProgramUniform4iEXT", glProgramUniform4iEXT == NULL); glewInfoFunc("glProgramUniform4ivEXT", glProgramUniform4ivEXT == NULL); glewInfoFunc("glProgramUniform4uiEXT", glProgramUniform4uiEXT == NULL); glewInfoFunc("glProgramUniform4uivEXT", glProgramUniform4uivEXT == NULL); - glewInfoFunc("glProgramUniformMatrix2dvEXT", glProgramUniformMatrix2dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix2fvEXT", glProgramUniformMatrix2fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix2x3dvEXT", glProgramUniformMatrix2x3dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix2x3fvEXT", glProgramUniformMatrix2x3fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix2x4dvEXT", glProgramUniformMatrix2x4dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix2x4fvEXT", glProgramUniformMatrix2x4fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix3dvEXT", glProgramUniformMatrix3dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix3fvEXT", glProgramUniformMatrix3fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix3x2dvEXT", glProgramUniformMatrix3x2dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix3x2fvEXT", glProgramUniformMatrix3x2fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix3x4dvEXT", glProgramUniformMatrix3x4dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix3x4fvEXT", glProgramUniformMatrix3x4fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix4dvEXT", glProgramUniformMatrix4dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix4fvEXT", glProgramUniformMatrix4fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix4x2dvEXT", glProgramUniformMatrix4x2dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix4x2fvEXT", glProgramUniformMatrix4x2fvEXT == NULL); - glewInfoFunc("glProgramUniformMatrix4x3dvEXT", glProgramUniformMatrix4x3dvEXT == NULL); glewInfoFunc("glProgramUniformMatrix4x3fvEXT", glProgramUniformMatrix4x3fvEXT == NULL); glewInfoFunc("glPushClientAttribDefaultEXT", glPushClientAttribDefaultEXT == NULL); glewInfoFunc("glTextureBufferEXT", glTextureBufferEXT == NULL); @@ -4664,6 +4991,19 @@ static void _glewInfo_GL_INGR_interlace_read (void) #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + +static void _glewInfo_GL_INTEL_map_texture (void) +{ + glewPrintExt("GL_INTEL_map_texture", GLEW_INTEL_map_texture, glewIsSupported("GL_INTEL_map_texture"), glewGetExtension("GL_INTEL_map_texture")); + + glewInfoFunc("glMapTexture2DINTEL", glMapTexture2DINTEL == NULL); + glewInfoFunc("glSyncTextureINTEL", glSyncTextureINTEL == NULL); + glewInfoFunc("glUnmapTexture2DINTEL", glUnmapTexture2DINTEL == NULL); +} + +#endif /* GL_INTEL_map_texture */ + #ifdef GL_INTEL_parallel_arrays static void _glewInfo_GL_INTEL_parallel_arrays (void) @@ -4702,9 +5042,9 @@ static void _glewInfo_GL_KHR_debug (void) glewInfoFunc("glGetDebugMessageLog", glGetDebugMessageLog == NULL); glewInfoFunc("glGetObjectLabel", glGetObjectLabel == NULL); glewInfoFunc("glGetObjectPtrLabel", glGetObjectPtrLabel == NULL); - glewInfoFunc("glGetPointerv", glGetPointerv == NULL); glewInfoFunc("glObjectLabel", glObjectLabel == NULL); glewInfoFunc("glObjectPtrLabel", glObjectPtrLabel == NULL); + glewInfoFunc("glPopDebugGroup", glPopDebugGroup == NULL); glewInfoFunc("glPushDebugGroup", glPushDebugGroup == NULL); } @@ -4806,6 +5146,18 @@ static void _glewInfo_GL_MESA_ycbcr_texture (void) #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + +static void _glewInfo_GL_NVX_conditional_render (void) +{ + glewPrintExt("GL_NVX_conditional_render", GLEW_NVX_conditional_render, glewIsSupported("GL_NVX_conditional_render"), glewGetExtension("GL_NVX_conditional_render")); + + glewInfoFunc("glBeginConditionalRenderNVX", glBeginConditionalRenderNVX == NULL); + glewInfoFunc("glEndConditionalRenderNVX", glEndConditionalRenderNVX == NULL); +} + +#endif /* GL_NVX_conditional_render */ + #ifdef GL_NVX_gpu_memory_info static void _glewInfo_GL_NVX_gpu_memory_info (void) @@ -4815,6 +5167,18 @@ static void _glewInfo_GL_NVX_gpu_memory_info (void) #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + +static void _glewInfo_GL_NV_bindless_multi_draw_indirect (void) +{ + glewPrintExt("GL_NV_bindless_multi_draw_indirect", GLEW_NV_bindless_multi_draw_indirect, glewIsSupported("GL_NV_bindless_multi_draw_indirect"), glewGetExtension("GL_NV_bindless_multi_draw_indirect")); + + glewInfoFunc("glMultiDrawArraysIndirectBindlessNV", glMultiDrawArraysIndirectBindlessNV == NULL); + glewInfoFunc("glMultiDrawElementsIndirectBindlessNV", glMultiDrawElementsIndirectBindlessNV == NULL); +} + +#endif /* GL_NV_bindless_multi_draw_indirect */ + #ifdef GL_NV_bindless_texture static void _glewInfo_GL_NV_bindless_texture (void) @@ -4838,6 +5202,27 @@ static void _glewInfo_GL_NV_bindless_texture (void) #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + +static void _glewInfo_GL_NV_blend_equation_advanced (void) +{ + glewPrintExt("GL_NV_blend_equation_advanced", GLEW_NV_blend_equation_advanced, glewIsSupported("GL_NV_blend_equation_advanced"), glewGetExtension("GL_NV_blend_equation_advanced")); + + glewInfoFunc("glBlendBarrierNV", glBlendBarrierNV == NULL); + glewInfoFunc("glBlendParameteriNV", glBlendParameteriNV == NULL); +} + +#endif /* GL_NV_blend_equation_advanced */ + +#ifdef GL_NV_blend_equation_advanced_coherent + +static void _glewInfo_GL_NV_blend_equation_advanced_coherent (void) +{ + glewPrintExt("GL_NV_blend_equation_advanced_coherent", GLEW_NV_blend_equation_advanced_coherent, glewIsSupported("GL_NV_blend_equation_advanced_coherent"), glewGetExtension("GL_NV_blend_equation_advanced_coherent")); +} + +#endif /* GL_NV_blend_equation_advanced_coherent */ + #ifdef GL_NV_blend_square static void _glewInfo_GL_NV_blend_square (void) @@ -4847,6 +5232,15 @@ static void _glewInfo_GL_NV_blend_square (void) #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + +static void _glewInfo_GL_NV_compute_program5 (void) +{ + glewPrintExt("GL_NV_compute_program5", GLEW_NV_compute_program5, glewIsSupported("GL_NV_compute_program5"), glewGetExtension("GL_NV_compute_program5")); +} + +#endif /* GL_NV_compute_program5 */ + #ifdef GL_NV_conditional_render static void _glewInfo_GL_NV_conditional_render (void) @@ -4879,6 +5273,15 @@ static void _glewInfo_GL_NV_copy_image (void) #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + +static void _glewInfo_GL_NV_deep_texture3D (void) +{ + glewPrintExt("GL_NV_deep_texture3D", GLEW_NV_deep_texture3D, glewIsSupported("GL_NV_deep_texture3D"), glewGetExtension("GL_NV_deep_texture3D")); +} + +#endif /* GL_NV_deep_texture3D */ + #ifdef GL_NV_depth_buffer_float static void _glewInfo_GL_NV_depth_buffer_float (void) @@ -4910,6 +5313,17 @@ static void _glewInfo_GL_NV_depth_range_unclamped (void) #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + +static void _glewInfo_GL_NV_draw_texture (void) +{ + glewPrintExt("GL_NV_draw_texture", GLEW_NV_draw_texture, glewIsSupported("GL_NV_draw_texture"), glewGetExtension("GL_NV_draw_texture")); + + glewInfoFunc("glDrawTextureNV", glDrawTextureNV == NULL); +} + +#endif /* GL_NV_draw_texture */ + #ifdef GL_NV_evaluators static void _glewInfo_GL_NV_evaluators (void) @@ -5082,6 +5496,15 @@ static void _glewInfo_GL_NV_gpu_program5 (void) #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + +static void _glewInfo_GL_NV_gpu_program5_mem_extended (void) +{ + glewPrintExt("GL_NV_gpu_program5_mem_extended", GLEW_NV_gpu_program5_mem_extended, glewIsSupported("GL_NV_gpu_program5_mem_extended"), glewGetExtension("GL_NV_gpu_program5_mem_extended")); +} + +#endif /* GL_NV_gpu_program5_mem_extended */ + #ifdef GL_NV_gpu_program_fp64 static void _glewInfo_GL_NV_gpu_program_fp64 (void) @@ -5412,6 +5835,15 @@ static void _glewInfo_GL_NV_register_combiners2 (void) #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + +static void _glewInfo_GL_NV_shader_atomic_counters (void) +{ + glewPrintExt("GL_NV_shader_atomic_counters", GLEW_NV_shader_atomic_counters, glewIsSupported("GL_NV_shader_atomic_counters"), glewGetExtension("GL_NV_shader_atomic_counters")); +} + +#endif /* GL_NV_shader_atomic_counters */ + #ifdef GL_NV_shader_atomic_float static void _glewInfo_GL_NV_shader_atomic_float (void) @@ -5444,6 +5876,15 @@ static void _glewInfo_GL_NV_shader_buffer_load (void) #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + +static void _glewInfo_GL_NV_shader_storage_buffer_object (void) +{ + glewPrintExt("GL_NV_shader_storage_buffer_object", GLEW_NV_shader_storage_buffer_object, glewIsSupported("GL_NV_shader_storage_buffer_object"), glewGetExtension("GL_NV_shader_storage_buffer_object")); +} + +#endif /* GL_NV_shader_storage_buffer_object */ + #ifdef GL_NV_tessellation_program5 static void _glewInfo_GL_NV_tessellation_program5 (void) @@ -5920,6 +6361,79 @@ static void _glewInfo_GL_PGI_vertex_hints (void) #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + +static void _glewInfo_GL_REGAL_ES1_0_compatibility (void) +{ + glewPrintExt("GL_REGAL_ES1_0_compatibility", GLEW_REGAL_ES1_0_compatibility, glewIsSupported("GL_REGAL_ES1_0_compatibility"), glewGetExtension("GL_REGAL_ES1_0_compatibility")); + + glewInfoFunc("glAlphaFuncx", glAlphaFuncx == NULL); + glewInfoFunc("glClearColorx", glClearColorx == NULL); + glewInfoFunc("glClearDepthx", glClearDepthx == NULL); + glewInfoFunc("glColor4x", glColor4x == NULL); + glewInfoFunc("glDepthRangex", glDepthRangex == NULL); + glewInfoFunc("glFogx", glFogx == NULL); + glewInfoFunc("glFogxv", glFogxv == NULL); + glewInfoFunc("glFrustumf", glFrustumf == NULL); + glewInfoFunc("glFrustumx", glFrustumx == NULL); + glewInfoFunc("glLightModelx", glLightModelx == NULL); + glewInfoFunc("glLightModelxv", glLightModelxv == NULL); + glewInfoFunc("glLightx", glLightx == NULL); + glewInfoFunc("glLightxv", glLightxv == NULL); + glewInfoFunc("glLineWidthx", glLineWidthx == NULL); + glewInfoFunc("glLoadMatrixx", glLoadMatrixx == NULL); + glewInfoFunc("glMaterialx", glMaterialx == NULL); + glewInfoFunc("glMaterialxv", glMaterialxv == NULL); + glewInfoFunc("glMultMatrixx", glMultMatrixx == NULL); + glewInfoFunc("glMultiTexCoord4x", glMultiTexCoord4x == NULL); + glewInfoFunc("glNormal3x", glNormal3x == NULL); + glewInfoFunc("glOrthof", glOrthof == NULL); + glewInfoFunc("glOrthox", glOrthox == NULL); + glewInfoFunc("glPointSizex", glPointSizex == NULL); + glewInfoFunc("glPolygonOffsetx", glPolygonOffsetx == NULL); + glewInfoFunc("glRotatex", glRotatex == NULL); + glewInfoFunc("glSampleCoveragex", glSampleCoveragex == NULL); + glewInfoFunc("glScalex", glScalex == NULL); + glewInfoFunc("glTexEnvx", glTexEnvx == NULL); + glewInfoFunc("glTexEnvxv", glTexEnvxv == NULL); + glewInfoFunc("glTexParameterx", glTexParameterx == NULL); + glewInfoFunc("glTranslatex", glTranslatex == NULL); +} + +#endif /* GL_REGAL_ES1_0_compatibility */ + +#ifdef GL_REGAL_ES1_1_compatibility + +static void _glewInfo_GL_REGAL_ES1_1_compatibility (void) +{ + glewPrintExt("GL_REGAL_ES1_1_compatibility", GLEW_REGAL_ES1_1_compatibility, glewIsSupported("GL_REGAL_ES1_1_compatibility"), glewGetExtension("GL_REGAL_ES1_1_compatibility")); + + glewInfoFunc("glClipPlanef", glClipPlanef == NULL); + glewInfoFunc("glClipPlanex", glClipPlanex == NULL); + glewInfoFunc("glGetClipPlanef", glGetClipPlanef == NULL); + glewInfoFunc("glGetClipPlanex", glGetClipPlanex == NULL); + glewInfoFunc("glGetFixedv", glGetFixedv == NULL); + glewInfoFunc("glGetLightxv", glGetLightxv == NULL); + glewInfoFunc("glGetMaterialxv", glGetMaterialxv == NULL); + glewInfoFunc("glGetTexEnvxv", glGetTexEnvxv == NULL); + glewInfoFunc("glGetTexParameterxv", glGetTexParameterxv == NULL); + glewInfoFunc("glPointParameterx", glPointParameterx == NULL); + glewInfoFunc("glPointParameterxv", glPointParameterxv == NULL); + glewInfoFunc("glPointSizePointerOES", glPointSizePointerOES == NULL); + glewInfoFunc("glTexParameterxv", glTexParameterxv == NULL); +} + +#endif /* GL_REGAL_ES1_1_compatibility */ + +#ifdef GL_REGAL_enable + +static void _glewInfo_GL_REGAL_enable (void) +{ + glewPrintExt("GL_REGAL_enable", GLEW_REGAL_enable, glewIsSupported("GL_REGAL_enable"), glewGetExtension("GL_REGAL_enable")); +} + +#endif /* GL_REGAL_enable */ + #ifdef GL_REGAL_error_string static void _glewInfo_GL_REGAL_error_string (void) @@ -5948,6 +6462,8 @@ static void _glewInfo_GL_REGAL_extension_query (void) static void _glewInfo_GL_REGAL_log (void) { glewPrintExt("GL_REGAL_log", GLEW_REGAL_log, glewIsSupported("GL_REGAL_log"), glewGetExtension("GL_REGAL_log")); + + glewInfoFunc("glLogMessageCallbackREGAL", glLogMessageCallbackREGAL == NULL); } #endif /* GL_REGAL_log */ @@ -6817,6 +7333,24 @@ static void _glewInfo_WGL_ARB_render_texture (void) #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + +static void _glewInfo_WGL_ARB_robustness_application_isolation (void) +{ + glewPrintExt("WGL_ARB_robustness_application_isolation", WGLEW_ARB_robustness_application_isolation, wglewIsSupported("WGL_ARB_robustness_application_isolation"), wglewGetExtension("WGL_ARB_robustness_application_isolation")); +} + +#endif /* WGL_ARB_robustness_application_isolation */ + +#ifdef WGL_ARB_robustness_share_group_isolation + +static void _glewInfo_WGL_ARB_robustness_share_group_isolation (void) +{ + glewPrintExt("WGL_ARB_robustness_share_group_isolation", WGLEW_ARB_robustness_share_group_isolation, wglewIsSupported("WGL_ARB_robustness_share_group_isolation"), wglewGetExtension("WGL_ARB_robustness_share_group_isolation")); +} + +#endif /* WGL_ARB_robustness_share_group_isolation */ + #ifdef WGL_ATI_pixel_format_float static void _glewInfo_WGL_ATI_pixel_format_float (void) @@ -7305,6 +7839,16 @@ static void _glewInfo_GLX_3DFX_multisample (void) static void _glewInfo_GLX_AMD_gpu_association (void) { glewPrintExt("GLX_AMD_gpu_association", GLXEW_AMD_gpu_association, glxewIsSupported("GLX_AMD_gpu_association"), glxewGetExtension("GLX_AMD_gpu_association")); + + glewInfoFunc("glXBlitContextFramebufferAMD", glXBlitContextFramebufferAMD == NULL); + glewInfoFunc("glXCreateAssociatedContextAMD", glXCreateAssociatedContextAMD == NULL); + glewInfoFunc("glXCreateAssociatedContextAttribsAMD", glXCreateAssociatedContextAttribsAMD == NULL); + glewInfoFunc("glXDeleteAssociatedContextAMD", glXDeleteAssociatedContextAMD == NULL); + glewInfoFunc("glXGetContextGPUIDAMD", glXGetContextGPUIDAMD == NULL); + glewInfoFunc("glXGetCurrentAssociatedContextAMD", glXGetCurrentAssociatedContextAMD == NULL); + glewInfoFunc("glXGetGPUIDsAMD", glXGetGPUIDsAMD == NULL); + glewInfoFunc("glXGetGPUInfoAMD", glXGetGPUInfoAMD == NULL); + glewInfoFunc("glXMakeAssociatedContextCurrentAMD", glXMakeAssociatedContextCurrentAMD == NULL); } #endif /* GLX_AMD_gpu_association */ @@ -7423,6 +7967,15 @@ static void _glewInfo_GLX_ATI_render_texture (void) #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + +static void _glewInfo_GLX_EXT_buffer_age (void) +{ + glewPrintExt("GLX_EXT_buffer_age", GLXEW_EXT_buffer_age, glxewIsSupported("GLX_EXT_buffer_age"), glxewGetExtension("GLX_EXT_buffer_age")); +} + +#endif /* GLX_EXT_buffer_age */ + #ifdef GLX_EXT_create_context_es2_profile static void _glewInfo_GLX_EXT_create_context_es2_profile (void) @@ -7692,11 +8245,11 @@ static void _glewInfo_GLX_NV_video_capture (void) #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out +#ifdef GLX_NV_video_output -static void _glewInfo_GLX_NV_video_out (void) +static void _glewInfo_GLX_NV_video_output (void) { - glewPrintExt("GLX_NV_video_out", GLXEW_NV_video_out, glxewIsSupported("GLX_NV_video_out"), glxewGetExtension("GLX_NV_video_out")); + glewPrintExt("GLX_NV_video_output", GLXEW_NV_video_output, glxewIsSupported("GLX_NV_video_output"), glxewGetExtension("GLX_NV_video_output")); glewInfoFunc("glXBindVideoImageNV", glXBindVideoImageNV == NULL); glewInfoFunc("glXGetVideoDeviceNV", glXGetVideoDeviceNV == NULL); @@ -7706,7 +8259,7 @@ static void _glewInfo_GLX_NV_video_out (void) glewInfoFunc("glXSendPbufferToVideoNV", glXSendPbufferToVideoNV == NULL); } -#endif /* GLX_NV_video_out */ +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method @@ -7987,6 +8540,9 @@ static void glewInfo (void) #ifdef GL_VERSION_4_3 _glewInfo_GL_VERSION_4_3(); #endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 + _glewInfo_GL_VERSION_4_4(); +#endif /* GL_VERSION_4_4 */ #ifdef GL_3DFX_multisample _glewInfo_GL_3DFX_multisample(); #endif /* GL_3DFX_multisample */ @@ -8011,6 +8567,9 @@ static void glewInfo (void) #ifdef GL_AMD_draw_buffers_blend _glewInfo_GL_AMD_draw_buffers_blend(); #endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_interleaved_elements + _glewInfo_GL_AMD_interleaved_elements(); +#endif /* GL_AMD_interleaved_elements */ #ifdef GL_AMD_multi_draw_indirect _glewInfo_GL_AMD_multi_draw_indirect(); #endif /* GL_AMD_multi_draw_indirect */ @@ -8035,6 +8594,12 @@ static void glewInfo (void) #ifdef GL_AMD_shader_stencil_export _glewInfo_GL_AMD_shader_stencil_export(); #endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_trinary_minmax + _glewInfo_GL_AMD_shader_trinary_minmax(); +#endif /* GL_AMD_shader_trinary_minmax */ +#ifdef GL_AMD_sparse_texture + _glewInfo_GL_AMD_sparse_texture(); +#endif /* GL_AMD_sparse_texture */ #ifdef GL_AMD_stencil_operation_extended _glewInfo_GL_AMD_stencil_operation_extended(); #endif /* GL_AMD_stencil_operation_extended */ @@ -8053,6 +8618,42 @@ static void glewInfo (void) #ifdef GL_AMD_vertex_shader_viewport_index _glewInfo_GL_AMD_vertex_shader_viewport_index(); #endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + _glewInfo_GL_ANGLE_depth_texture(); +#endif /* GL_ANGLE_depth_texture */ +#ifdef GL_ANGLE_framebuffer_blit + _glewInfo_GL_ANGLE_framebuffer_blit(); +#endif /* GL_ANGLE_framebuffer_blit */ +#ifdef GL_ANGLE_framebuffer_multisample + _glewInfo_GL_ANGLE_framebuffer_multisample(); +#endif /* GL_ANGLE_framebuffer_multisample */ +#ifdef GL_ANGLE_instanced_arrays + _glewInfo_GL_ANGLE_instanced_arrays(); +#endif /* GL_ANGLE_instanced_arrays */ +#ifdef GL_ANGLE_pack_reverse_row_order + _glewInfo_GL_ANGLE_pack_reverse_row_order(); +#endif /* GL_ANGLE_pack_reverse_row_order */ +#ifdef GL_ANGLE_program_binary + _glewInfo_GL_ANGLE_program_binary(); +#endif /* GL_ANGLE_program_binary */ +#ifdef GL_ANGLE_texture_compression_dxt1 + _glewInfo_GL_ANGLE_texture_compression_dxt1(); +#endif /* GL_ANGLE_texture_compression_dxt1 */ +#ifdef GL_ANGLE_texture_compression_dxt3 + _glewInfo_GL_ANGLE_texture_compression_dxt3(); +#endif /* GL_ANGLE_texture_compression_dxt3 */ +#ifdef GL_ANGLE_texture_compression_dxt5 + _glewInfo_GL_ANGLE_texture_compression_dxt5(); +#endif /* GL_ANGLE_texture_compression_dxt5 */ +#ifdef GL_ANGLE_texture_usage + _glewInfo_GL_ANGLE_texture_usage(); +#endif /* GL_ANGLE_texture_usage */ +#ifdef GL_ANGLE_timer_query + _glewInfo_GL_ANGLE_timer_query(); +#endif /* GL_ANGLE_timer_query */ +#ifdef GL_ANGLE_translated_shader_source + _glewInfo_GL_ANGLE_translated_shader_source(); +#endif /* GL_ANGLE_translated_shader_source */ #ifdef GL_APPLE_aux_depth_stencil _glewInfo_GL_APPLE_aux_depth_stencil(); #endif /* GL_APPLE_aux_depth_stencil */ @@ -8116,15 +8717,24 @@ static void glewInfo (void) #ifdef GL_ARB_base_instance _glewInfo_GL_ARB_base_instance(); #endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + _glewInfo_GL_ARB_bindless_texture(); +#endif /* GL_ARB_bindless_texture */ #ifdef GL_ARB_blend_func_extended _glewInfo_GL_ARB_blend_func_extended(); #endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + _glewInfo_GL_ARB_buffer_storage(); +#endif /* GL_ARB_buffer_storage */ #ifdef GL_ARB_cl_event _glewInfo_GL_ARB_cl_event(); #endif /* GL_ARB_cl_event */ #ifdef GL_ARB_clear_buffer_object _glewInfo_GL_ARB_clear_buffer_object(); #endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + _glewInfo_GL_ARB_clear_texture(); +#endif /* GL_ARB_clear_texture */ #ifdef GL_ARB_color_buffer_float _glewInfo_GL_ARB_color_buffer_float(); #endif /* GL_ARB_color_buffer_float */ @@ -8137,6 +8747,9 @@ static void glewInfo (void) #ifdef GL_ARB_compute_shader _glewInfo_GL_ARB_compute_shader(); #endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + _glewInfo_GL_ARB_compute_variable_group_size(); +#endif /* GL_ARB_compute_variable_group_size */ #ifdef GL_ARB_conservative_depth _glewInfo_GL_ARB_conservative_depth(); #endif /* GL_ARB_conservative_depth */ @@ -8173,6 +8786,9 @@ static void glewInfo (void) #ifdef GL_ARB_draw_instanced _glewInfo_GL_ARB_draw_instanced(); #endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + _glewInfo_GL_ARB_enhanced_layouts(); +#endif /* GL_ARB_enhanced_layouts */ #ifdef GL_ARB_explicit_attrib_location _glewInfo_GL_ARB_explicit_attrib_location(); #endif /* GL_ARB_explicit_attrib_location */ @@ -8224,6 +8840,9 @@ static void glewInfo (void) #ifdef GL_ARB_imaging _glewInfo_GL_ARB_imaging(); #endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + _glewInfo_GL_ARB_indirect_parameters(); +#endif /* GL_ARB_indirect_parameters */ #ifdef GL_ARB_instanced_arrays _glewInfo_GL_ARB_instanced_arrays(); #endif /* GL_ARB_instanced_arrays */ @@ -8245,6 +8864,9 @@ static void glewInfo (void) #ifdef GL_ARB_matrix_palette _glewInfo_GL_ARB_matrix_palette(); #endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + _glewInfo_GL_ARB_multi_bind(); +#endif /* GL_ARB_multi_bind */ #ifdef GL_ARB_multi_draw_indirect _glewInfo_GL_ARB_multi_draw_indirect(); #endif /* GL_ARB_multi_draw_indirect */ @@ -8275,6 +8897,9 @@ static void glewInfo (void) #ifdef GL_ARB_provoking_vertex _glewInfo_GL_ARB_provoking_vertex(); #endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + _glewInfo_GL_ARB_query_buffer_object(); +#endif /* GL_ARB_query_buffer_object */ #ifdef GL_ARB_robust_buffer_access_behavior _glewInfo_GL_ARB_robust_buffer_access_behavior(); #endif /* GL_ARB_robust_buffer_access_behavior */ @@ -8296,6 +8921,9 @@ static void glewInfo (void) #ifdef GL_ARB_seamless_cube_map _glewInfo_GL_ARB_seamless_cube_map(); #endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + _glewInfo_GL_ARB_seamless_cubemap_per_texture(); +#endif /* GL_ARB_seamless_cubemap_per_texture */ #ifdef GL_ARB_separate_shader_objects _glewInfo_GL_ARB_separate_shader_objects(); #endif /* GL_ARB_separate_shader_objects */ @@ -8305,6 +8933,12 @@ static void glewInfo (void) #ifdef GL_ARB_shader_bit_encoding _glewInfo_GL_ARB_shader_bit_encoding(); #endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_draw_parameters + _glewInfo_GL_ARB_shader_draw_parameters(); +#endif /* GL_ARB_shader_draw_parameters */ +#ifdef GL_ARB_shader_group_vote + _glewInfo_GL_ARB_shader_group_vote(); +#endif /* GL_ARB_shader_group_vote */ #ifdef GL_ARB_shader_image_load_store _glewInfo_GL_ARB_shader_image_load_store(); #endif /* GL_ARB_shader_image_load_store */ @@ -8347,6 +8981,9 @@ static void glewInfo (void) #ifdef GL_ARB_shadow_ambient _glewInfo_GL_ARB_shadow_ambient(); #endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_texture + _glewInfo_GL_ARB_sparse_texture(); +#endif /* GL_ARB_sparse_texture */ #ifdef GL_ARB_stencil_texturing _glewInfo_GL_ARB_stencil_texturing(); #endif /* GL_ARB_stencil_texturing */ @@ -8401,6 +9038,9 @@ static void glewInfo (void) #ifdef GL_ARB_texture_gather _glewInfo_GL_ARB_texture_gather(); #endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + _glewInfo_GL_ARB_texture_mirror_clamp_to_edge(); +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifdef GL_ARB_texture_mirrored_repeat _glewInfo_GL_ARB_texture_mirrored_repeat(); #endif /* GL_ARB_texture_mirrored_repeat */ @@ -8425,6 +9065,9 @@ static void glewInfo (void) #ifdef GL_ARB_texture_rgb10_a2ui _glewInfo_GL_ARB_texture_rgb10_a2ui(); #endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + _glewInfo_GL_ARB_texture_stencil8(); +#endif /* GL_ARB_texture_stencil8 */ #ifdef GL_ARB_texture_storage _glewInfo_GL_ARB_texture_storage(); #endif /* GL_ARB_texture_storage */ @@ -8479,6 +9122,9 @@ static void glewInfo (void) #ifdef GL_ARB_vertex_shader _glewInfo_GL_ARB_vertex_shader(); #endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + _glewInfo_GL_ARB_vertex_type_10f_11f_11f_rev(); +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifdef GL_ARB_vertex_type_2_10_10_10_rev _glewInfo_GL_ARB_vertex_type_2_10_10_10_rev(); #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ @@ -8893,6 +9539,9 @@ static void glewInfo (void) #ifdef GL_INGR_interlace_read _glewInfo_GL_INGR_interlace_read(); #endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_map_texture + _glewInfo_GL_INTEL_map_texture(); +#endif /* GL_INTEL_map_texture */ #ifdef GL_INTEL_parallel_arrays _glewInfo_GL_INTEL_parallel_arrays(); #endif /* GL_INTEL_parallel_arrays */ @@ -8923,15 +9572,30 @@ static void glewInfo (void) #ifdef GL_MESA_ycbcr_texture _glewInfo_GL_MESA_ycbcr_texture(); #endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + _glewInfo_GL_NVX_conditional_render(); +#endif /* GL_NVX_conditional_render */ #ifdef GL_NVX_gpu_memory_info _glewInfo_GL_NVX_gpu_memory_info(); #endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + _glewInfo_GL_NV_bindless_multi_draw_indirect(); +#endif /* GL_NV_bindless_multi_draw_indirect */ #ifdef GL_NV_bindless_texture _glewInfo_GL_NV_bindless_texture(); #endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + _glewInfo_GL_NV_blend_equation_advanced(); +#endif /* GL_NV_blend_equation_advanced */ +#ifdef GL_NV_blend_equation_advanced_coherent + _glewInfo_GL_NV_blend_equation_advanced_coherent(); +#endif /* GL_NV_blend_equation_advanced_coherent */ #ifdef GL_NV_blend_square _glewInfo_GL_NV_blend_square(); #endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + _glewInfo_GL_NV_compute_program5(); +#endif /* GL_NV_compute_program5 */ #ifdef GL_NV_conditional_render _glewInfo_GL_NV_conditional_render(); #endif /* GL_NV_conditional_render */ @@ -8941,6 +9605,9 @@ static void glewInfo (void) #ifdef GL_NV_copy_image _glewInfo_GL_NV_copy_image(); #endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + _glewInfo_GL_NV_deep_texture3D(); +#endif /* GL_NV_deep_texture3D */ #ifdef GL_NV_depth_buffer_float _glewInfo_GL_NV_depth_buffer_float(); #endif /* GL_NV_depth_buffer_float */ @@ -8950,6 +9617,9 @@ static void glewInfo (void) #ifdef GL_NV_depth_range_unclamped _glewInfo_GL_NV_depth_range_unclamped(); #endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + _glewInfo_GL_NV_draw_texture(); +#endif /* GL_NV_draw_texture */ #ifdef GL_NV_evaluators _glewInfo_GL_NV_evaluators(); #endif /* GL_NV_evaluators */ @@ -8992,6 +9662,9 @@ static void glewInfo (void) #ifdef GL_NV_gpu_program5 _glewInfo_GL_NV_gpu_program5(); #endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + _glewInfo_GL_NV_gpu_program5_mem_extended(); +#endif /* GL_NV_gpu_program5_mem_extended */ #ifdef GL_NV_gpu_program_fp64 _glewInfo_GL_NV_gpu_program_fp64(); #endif /* GL_NV_gpu_program_fp64 */ @@ -9043,12 +9716,18 @@ static void glewInfo (void) #ifdef GL_NV_register_combiners2 _glewInfo_GL_NV_register_combiners2(); #endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_shader_atomic_counters + _glewInfo_GL_NV_shader_atomic_counters(); +#endif /* GL_NV_shader_atomic_counters */ #ifdef GL_NV_shader_atomic_float _glewInfo_GL_NV_shader_atomic_float(); #endif /* GL_NV_shader_atomic_float */ #ifdef GL_NV_shader_buffer_load _glewInfo_GL_NV_shader_buffer_load(); #endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + _glewInfo_GL_NV_shader_storage_buffer_object(); +#endif /* GL_NV_shader_storage_buffer_object */ #ifdef GL_NV_tessellation_program5 _glewInfo_GL_NV_tessellation_program5(); #endif /* GL_NV_tessellation_program5 */ @@ -9154,6 +9833,15 @@ static void glewInfo (void) #ifdef GL_PGI_vertex_hints _glewInfo_GL_PGI_vertex_hints(); #endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + _glewInfo_GL_REGAL_ES1_0_compatibility(); +#endif /* GL_REGAL_ES1_0_compatibility */ +#ifdef GL_REGAL_ES1_1_compatibility + _glewInfo_GL_REGAL_ES1_1_compatibility(); +#endif /* GL_REGAL_ES1_1_compatibility */ +#ifdef GL_REGAL_enable + _glewInfo_GL_REGAL_enable(); +#endif /* GL_REGAL_enable */ #ifdef GL_REGAL_error_string _glewInfo_GL_REGAL_error_string(); #endif /* GL_REGAL_error_string */ @@ -9402,6 +10090,12 @@ static void wglewInfo () #ifdef WGL_ARB_render_texture _glewInfo_WGL_ARB_render_texture(); #endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + _glewInfo_WGL_ARB_robustness_application_isolation(); +#endif /* WGL_ARB_robustness_application_isolation */ +#ifdef WGL_ARB_robustness_share_group_isolation + _glewInfo_WGL_ARB_robustness_share_group_isolation(); +#endif /* WGL_ARB_robustness_share_group_isolation */ #ifdef WGL_ATI_pixel_format_float _glewInfo_WGL_ATI_pixel_format_float(); #endif /* WGL_ATI_pixel_format_float */ @@ -9564,6 +10258,9 @@ static void glxewInfo () #ifdef GLX_ATI_render_texture _glewInfo_GLX_ATI_render_texture(); #endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + _glewInfo_GLX_EXT_buffer_age(); +#endif /* GLX_EXT_buffer_age */ #ifdef GLX_EXT_create_context_es2_profile _glewInfo_GLX_EXT_create_context_es2_profile(); #endif /* GLX_EXT_create_context_es2_profile */ @@ -9639,9 +10336,9 @@ static void glxewInfo () #ifdef GLX_NV_video_capture _glewInfo_GLX_NV_video_capture(); #endif /* GLX_NV_video_capture */ -#ifdef GLX_NV_video_out - _glewInfo_GLX_NV_video_out(); -#endif /* GLX_NV_video_out */ +#ifdef GLX_NV_video_output + _glewInfo_GLX_NV_video_output(); +#endif /* GLX_NV_video_output */ #ifdef GLX_OML_swap_method _glewInfo_GLX_OML_swap_method(); #endif /* GLX_OML_swap_method */ diff --git a/Externals/LZO/LZO.vcxproj b/Externals/LZO/LZO.vcxproj index 76b75cdc4c..e8e92795f0 100644 --- a/Externals/LZO/LZO.vcxproj +++ b/Externals/LZO/LZO.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,122 +19,41 @@ - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20} - LZO + {AB993F38-C31D-4897-B139-A620C42BC565} - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - + + + - + diff --git a/Externals/LZO/LZO.vcxproj.filters b/Externals/LZO/LZO.vcxproj.filters deleted file mode 100644 index 889fdb14a0..0000000000 --- a/Externals/LZO/LZO.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Header Files - - - Header Files - - - Header Files - - - - - {a40ddc0f-650c-440f-9a85-52fd8dc26122} - - - {65dbafef-bdb1-4bbc-8ebc-08f69f8f5f3a} - - - - - Source Files - - - - - - \ No newline at end of file diff --git a/Externals/OpenAL/Win32/OpenAL32.dll b/Externals/OpenAL/Win32/OpenAL32.dll index b63bb2f301..71ced6a21f 100644 Binary files a/Externals/OpenAL/Win32/OpenAL32.dll and b/Externals/OpenAL/Win32/OpenAL32.dll differ diff --git a/Externals/OpenAL/Win32/soft_oal.dll b/Externals/OpenAL/Win32/soft_oal.dll deleted file mode 100644 index 71ced6a21f..0000000000 Binary files a/Externals/OpenAL/Win32/soft_oal.dll and /dev/null differ diff --git a/Externals/OpenAL/Win32/wrap_oal.dll b/Externals/OpenAL/Win32/wrap_oal.dll deleted file mode 100644 index 9752892aab..0000000000 Binary files a/Externals/OpenAL/Win32/wrap_oal.dll and /dev/null differ diff --git a/Externals/OpenAL/Win64/OpenAL32.dll b/Externals/OpenAL/Win64/OpenAL32.dll deleted file mode 100644 index f36943df40..0000000000 Binary files a/Externals/OpenAL/Win64/OpenAL32.dll and /dev/null differ diff --git a/Externals/OpenAL/Win64/wrap_oal.dll b/Externals/OpenAL/Win64/wrap_oal.dll deleted file mode 100644 index 1ab0365711..0000000000 Binary files a/Externals/OpenAL/Win64/wrap_oal.dll and /dev/null differ diff --git a/Externals/OpenAL/Win64/EFX-Util.lib b/Externals/OpenAL/x64/EFX-Util.lib similarity index 100% rename from Externals/OpenAL/Win64/EFX-Util.lib rename to Externals/OpenAL/x64/EFX-Util.lib diff --git a/Externals/OpenAL/Win64/soft_oal.dll b/Externals/OpenAL/x64/OpenAL32.dll similarity index 100% rename from Externals/OpenAL/Win64/soft_oal.dll rename to Externals/OpenAL/x64/OpenAL32.dll diff --git a/Externals/OpenAL/Win64/OpenAL32.lib b/Externals/OpenAL/x64/OpenAL32.lib similarity index 100% rename from Externals/OpenAL/Win64/OpenAL32.lib rename to Externals/OpenAL/x64/OpenAL32.lib diff --git a/Externals/SDL/Include_1.2/SDL.h b/Externals/SDL/Include_1.2/SDL.h deleted file mode 100644 index 60ac26ce4b..0000000000 --- a/Externals/SDL/Include_1.2/SDL.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Main include header for the SDL library */ - -#ifndef _SDL_H -#define _SDL_H - -#include "SDL_main.h" -#include "SDL_stdinc.h" -#include "SDL_audio.h" -#include "SDL_cdrom.h" -#include "SDL_cpuinfo.h" -#include "SDL_endian.h" -#include "SDL_error.h" -#include "SDL_events.h" -#include "SDL_loadso.h" -#include "SDL_mutex.h" -#include "SDL_rwops.h" -#include "SDL_thread.h" -#include "SDL_timer.h" -#include "SDL_video.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* As of version 0.5, SDL is loaded dynamically into the application */ - -/* These are the flags which may be passed to SDL_Init() -- you should - specify the subsystems which you will be using in your application. -*/ -#define SDL_INIT_TIMER 0x00000001 -#define SDL_INIT_AUDIO 0x00000010 -#define SDL_INIT_VIDEO 0x00000020 -#define SDL_INIT_CDROM 0x00000100 -#define SDL_INIT_JOYSTICK 0x00000200 -#define SDL_INIT_NOPARACHUTE 0x00100000 /* Don't catch fatal signals */ -#define SDL_INIT_EVENTTHREAD 0x01000000 /* Not supported on all OS's */ -#define SDL_INIT_EVERYTHING 0x0000FFFF - -/* This function loads the SDL dynamically linked library and initializes - * the subsystems specified by 'flags' (and those satisfying dependencies) - * Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup - * signal handlers for some commonly ignored fatal signals (like SIGSEGV) - */ -extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); - -/* This function initializes specific SDL subsystems */ -extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); - -/* This function cleans up specific SDL subsystems */ -extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); - -/* This function returns mask of the specified subsystems which have - been initialized. - If 'flags' is 0, it returns a mask of all initialized subsystems. -*/ -extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); - -/* This function cleans up all initialized subsystems and unloads the - * dynamically linked library. You should call it upon all exit conditions. - */ -extern DECLSPEC void SDLCALL SDL_Quit(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_H */ diff --git a/Externals/SDL/Include_1.2/SDL_active.h b/Externals/SDL/Include_1.2/SDL_active.h deleted file mode 100644 index 2cf474c5a3..0000000000 --- a/Externals/SDL/Include_1.2/SDL_active.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL application focus event handling */ - -#ifndef _SDL_active_h -#define _SDL_active_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* The available application states */ -#define SDL_APPMOUSEFOCUS 0x01 /* The app has mouse coverage */ -#define SDL_APPINPUTFOCUS 0x02 /* The app has input focus */ -#define SDL_APPACTIVE 0x04 /* The application is active */ - -/* Function prototypes */ -/* - * This function returns the current state of the application, which is a - * bitwise combination of SDL_APPMOUSEFOCUS, SDL_APPINPUTFOCUS, and - * SDL_APPACTIVE. If SDL_APPACTIVE is set, then the user is able to - * see your application, otherwise it has been iconified or disabled. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetAppState(void); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_active_h */ diff --git a/Externals/SDL/Include_1.2/SDL_audio.h b/Externals/SDL/Include_1.2/SDL_audio.h deleted file mode 100644 index 68ec4759d8..0000000000 --- a/Externals/SDL/Include_1.2/SDL_audio.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Access to the raw audio mixing buffer for the SDL library */ - -#ifndef _SDL_audio_h -#define _SDL_audio_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_endian.h" -#include "SDL_mutex.h" -#include "SDL_thread.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* The calculated values in this structure are calculated by SDL_OpenAudio() */ -typedef struct SDL_AudioSpec { - int freq; /* DSP frequency -- samples per second */ - Uint16 format; /* Audio data format */ - Uint8 channels; /* Number of channels: 1 mono, 2 stereo */ - Uint8 silence; /* Audio buffer silence value (calculated) */ - Uint16 samples; /* Audio buffer size in samples (power of 2) */ - Uint16 padding; /* Necessary for some compile environments */ - Uint32 size; /* Audio buffer size in bytes (calculated) */ - /* This function is called when the audio device needs more data. - 'stream' is a pointer to the audio data buffer - 'len' is the length of that buffer in bytes. - Once the callback returns, the buffer will no longer be valid. - Stereo samples are stored in a LRLRLR ordering. - */ - void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); - void *userdata; -} SDL_AudioSpec; - -/* Audio format flags (defaults to LSB byte order) */ -#define AUDIO_U8 0x0008 /* Unsigned 8-bit samples */ -#define AUDIO_S8 0x8008 /* Signed 8-bit samples */ -#define AUDIO_U16LSB 0x0010 /* Unsigned 16-bit samples */ -#define AUDIO_S16LSB 0x8010 /* Signed 16-bit samples */ -#define AUDIO_U16MSB 0x1010 /* As above, but big-endian byte order */ -#define AUDIO_S16MSB 0x9010 /* As above, but big-endian byte order */ -#define AUDIO_U16 AUDIO_U16LSB -#define AUDIO_S16 AUDIO_S16LSB - -/* Native audio byte ordering */ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define AUDIO_U16SYS AUDIO_U16LSB -#define AUDIO_S16SYS AUDIO_S16LSB -#else -#define AUDIO_U16SYS AUDIO_U16MSB -#define AUDIO_S16SYS AUDIO_S16MSB -#endif - - -/* A structure to hold a set of audio conversion filters and buffers */ -typedef struct SDL_AudioCVT { - int needed; /* Set to 1 if conversion possible */ - Uint16 src_format; /* Source audio format */ - Uint16 dst_format; /* Target audio format */ - double rate_incr; /* Rate conversion increment */ - Uint8 *buf; /* Buffer to hold entire audio data */ - int len; /* Length of original audio buffer */ - int len_cvt; /* Length of converted audio buffer */ - int len_mult; /* buffer must be len*len_mult big */ - double len_ratio; /* Given len, final size is len*len_ratio */ - void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); - int filter_index; /* Current audio conversion function */ -} SDL_AudioCVT; - - -/* Function prototypes */ - -/* These functions are used internally, and should not be used unless you - * have a specific need to specify the audio driver you want to use. - * You should normally use SDL_Init() or SDL_InitSubSystem(). - */ -extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); -extern DECLSPEC void SDLCALL SDL_AudioQuit(void); - -/* This function fills the given character buffer with the name of the - * current audio driver, and returns a pointer to it if the audio driver has - * been initialized. It returns NULL if no driver has been initialized. - */ -extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); - -/* - * This function opens the audio device with the desired parameters, and - * returns 0 if successful, placing the actual hardware parameters in the - * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio - * data passed to the callback function will be guaranteed to be in the - * requested format, and will be automatically converted to the hardware - * audio format if necessary. This function returns -1 if it failed - * to open the audio device, or couldn't set up the audio thread. - * - * When filling in the desired audio spec structure, - * 'desired->freq' should be the desired audio frequency in samples-per-second. - * 'desired->format' should be the desired audio format. - * 'desired->samples' is the desired size of the audio buffer, in samples. - * This number should be a power of two, and may be adjusted by the audio - * driver to a value more suitable for the hardware. Good values seem to - * range between 512 and 8096 inclusive, depending on the application and - * CPU speed. Smaller values yield faster response time, but can lead - * to underflow if the application is doing heavy processing and cannot - * fill the audio buffer in time. A stereo sample consists of both right - * and left channels in LR ordering. - * Note that the number of samples is directly related to time by the - * following formula: ms = (samples*1000)/freq - * 'desired->size' is the size in bytes of the audio buffer, and is - * calculated by SDL_OpenAudio(). - * 'desired->silence' is the value used to set the buffer to silence, - * and is calculated by SDL_OpenAudio(). - * 'desired->callback' should be set to a function that will be called - * when the audio device is ready for more data. It is passed a pointer - * to the audio buffer, and the length in bytes of the audio buffer. - * This function usually runs in a separate thread, and so you should - * protect data structures that it accesses by calling SDL_LockAudio() - * and SDL_UnlockAudio() in your code. - * 'desired->userdata' is passed as the first parameter to your callback - * function. - * - * The audio device starts out playing silence when it's opened, and should - * be enabled for playing by calling SDL_PauseAudio(0) when you are ready - * for your audio callback function to be called. Since the audio driver - * may modify the requested size of the audio buffer, you should allocate - * any local mixing buffers after you open the audio device. - */ -extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); - -/* - * Get the current audio state: - */ -typedef enum { - SDL_AUDIO_STOPPED = 0, - SDL_AUDIO_PLAYING, - SDL_AUDIO_PAUSED -} SDL_audiostatus; -extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); - -/* - * This function pauses and unpauses the audio callback processing. - * It should be called with a parameter of 0 after opening the audio - * device to start playing sound. This is so you can safely initialize - * data for your callback function after opening the audio device. - * Silence will be written to the audio device during the pause. - */ -extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); - -/* - * This function loads a WAVE from the data source, automatically freeing - * that source if 'freesrc' is non-zero. For example, to load a WAVE file, - * you could do: - * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); - * - * If this function succeeds, it returns the given SDL_AudioSpec, - * filled with the audio data format of the wave data, and sets - * 'audio_buf' to a malloc()'d buffer containing the audio data, - * and sets 'audio_len' to the length of that audio buffer, in bytes. - * You need to free the audio buffer with SDL_FreeWAV() when you are - * done with it. - * - * This function returns NULL and sets the SDL error message if the - * wave file cannot be opened, uses an unknown data format, or is - * corrupt. Currently raw and MS-ADPCM WAVE files are supported. - */ -extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); - -/* Compatibility convenience function -- loads a WAV from a file */ -#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ - SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) - -/* - * This function frees data previously allocated with SDL_LoadWAV_RW() - */ -extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); - -/* - * This function takes a source format and rate and a destination format - * and rate, and initializes the 'cvt' structure with information needed - * by SDL_ConvertAudio() to convert a buffer of audio data from one format - * to the other. - * This function returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, - Uint16 src_format, Uint8 src_channels, int src_rate, - Uint16 dst_format, Uint8 dst_channels, int dst_rate); - -/* Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), - * created an audio buffer cvt->buf, and filled it with cvt->len bytes of - * audio data in the source format, this function will convert it in-place - * to the desired format. - * The data conversion may expand the size of the audio data, so the buffer - * cvt->buf should be allocated after the cvt structure is initialized by - * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. - */ -extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); - -/* - * This takes two audio buffers of the playing audio format and mixes - * them, performing addition, volume adjustment, and overflow clipping. - * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME - * for full audio volume. Note this does not change hardware volume. - * This is provided for convenience -- you can mix your own audio data. - */ -#define SDL_MIX_MAXVOLUME 128 -extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); - -/* - * The lock manipulated by these functions protects the callback function. - * During a LockAudio/UnlockAudio pair, you can be guaranteed that the - * callback function is not running. Do not call these from the callback - * function or you will cause deadlock. - */ -extern DECLSPEC void SDLCALL SDL_LockAudio(void); -extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); - -/* - * This function shuts down audio processing and closes the audio device. - */ -extern DECLSPEC void SDLCALL SDL_CloseAudio(void); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_audio_h */ diff --git a/Externals/SDL/Include_1.2/SDL_byteorder.h b/Externals/SDL/Include_1.2/SDL_byteorder.h deleted file mode 100644 index 3871cfed56..0000000000 --- a/Externals/SDL/Include_1.2/SDL_byteorder.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* DEPRECATED */ -#include "SDL_endian.h" diff --git a/Externals/SDL/Include_1.2/SDL_cdrom.h b/Externals/SDL/Include_1.2/SDL_cdrom.h deleted file mode 100644 index 5f8f0c62a0..0000000000 --- a/Externals/SDL/Include_1.2/SDL_cdrom.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This is the CD-audio control API for Simple DirectMedia Layer */ - -#ifndef _SDL_cdrom_h -#define _SDL_cdrom_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* In order to use these functions, SDL_Init() must have been called - with the SDL_INIT_CDROM flag. This causes SDL to scan the system - for CD-ROM drives, and load appropriate drivers. -*/ - -/* The maximum number of CD-ROM tracks on a disk */ -#define SDL_MAX_TRACKS 99 - -/* The types of CD-ROM track possible */ -#define SDL_AUDIO_TRACK 0x00 -#define SDL_DATA_TRACK 0x04 - -/* The possible states which a CD-ROM drive can be in. */ -typedef enum { - CD_TRAYEMPTY, - CD_STOPPED, - CD_PLAYING, - CD_PAUSED, - CD_ERROR = -1 -} CDstatus; - -/* Given a status, returns true if there's a disk in the drive */ -#define CD_INDRIVE(status) ((int)(status) > 0) - -typedef struct SDL_CDtrack { - Uint8 id; /* Track number */ - Uint8 type; /* Data or audio track */ - Uint16 unused; - Uint32 length; /* Length, in frames, of this track */ - Uint32 offset; /* Offset, in frames, from start of disk */ -} SDL_CDtrack; - -/* This structure is only current as of the last call to SDL_CDStatus() */ -typedef struct SDL_CD { - int id; /* Private drive identifier */ - CDstatus status; /* Current drive status */ - - /* The rest of this structure is only valid if there's a CD in drive */ - int numtracks; /* Number of tracks on disk */ - int cur_track; /* Current track position */ - int cur_frame; /* Current frame offset within current track */ - SDL_CDtrack track[SDL_MAX_TRACKS+1]; -} SDL_CD; - -/* Conversion functions from frames to Minute/Second/Frames and vice versa */ -#define CD_FPS 75 -#define FRAMES_TO_MSF(f, M,S,F) { \ - int value = f; \ - *(F) = value%CD_FPS; \ - value /= CD_FPS; \ - *(S) = value%60; \ - value /= 60; \ - *(M) = value; \ -} -#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) - -/* CD-audio API functions: */ - -/* Returns the number of CD-ROM drives on the system, or -1 if - SDL_Init() has not been called with the SDL_INIT_CDROM flag. - */ -extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); - -/* Returns a human-readable, system-dependent identifier for the CD-ROM. - Example: - "/dev/cdrom" - "E:" - "/dev/disk/ide/1/master" -*/ -extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); - -/* Opens a CD-ROM drive for access. It returns a drive handle on success, - or NULL if the drive was invalid or busy. This newly opened CD-ROM - becomes the default CD used when other CD functions are passed a NULL - CD-ROM handle. - Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. -*/ -extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); - -/* This function returns the current status of the given drive. - If the drive has a CD in it, the table of contents of the CD and current - play position of the CD will be stored in the SDL_CD structure. -*/ -extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); - -/* Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' - tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play - until the end of the CD. This function will skip data tracks. - This function should only be called after calling SDL_CDStatus() to - get track information about the CD. - For example: - // Play entire CD: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); - // Play last track: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { - SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); - } - // Play first and second track and 10 seconds of third track: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); - - This function returns 0, or -1 if there was an error. -*/ -extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, - int start_track, int start_frame, int ntracks, int nframes); - -/* Play the given CD starting at 'start' frame for 'length' frames. - It returns 0, or -1 if there was an error. -*/ -extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); - -/* Pause play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); - -/* Resume play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); - -/* Stop play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); - -/* Eject CD-ROM -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); - -/* Closes the handle for the CD-ROM drive */ -extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config.h b/Externals/SDL/Include_1.2/SDL_config.h deleted file mode 100644 index c82f42adf0..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -#include "SDL_platform.h" - -/* Add any platform that doesn't build using the configure system */ -#if defined(__DREAMCAST__) -#include "SDL_config_dreamcast.h" -#elif defined(__MACOS__) -#include "SDL_config_macos.h" -#elif defined(__MACOSX__) -#include "SDL_config_macosx.h" -#elif defined(__SYMBIAN32__) -#include "SDL_config_symbian.h" /* must be before win32! */ -#elif defined(__WIN32__) -#include "SDL_config_win32.h" -#elif defined(__OS2__) -#include "SDL_config_os2.h" -#else -#include "SDL_config_minimal.h" -#endif /* platform config */ - -#endif /* _SDL_config_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config.h.in b/Externals/SDL/Include_1.2/SDL_config.h.in deleted file mode 100644 index fb49c0e2fa..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config.h.in +++ /dev/null @@ -1,306 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -/* This is a set of defines to configure the SDL features */ - -/* General platform specific identifiers */ -#include "SDL_platform.h" - -/* Make sure that this isn't included by Visual C++ */ -#ifdef _MSC_VER -#error You should copy include/SDL_config.h.default to include/SDL_config.h -#endif - -/* C language features */ -#undef const -#undef inline -#undef volatile - -/* C datatypes */ -#undef size_t -#undef int8_t -#undef uint8_t -#undef int16_t -#undef uint16_t -#undef int32_t -#undef uint32_t -#undef int64_t -#undef uint64_t -#undef uintptr_t -#undef SDL_HAS_64BIT_TYPE - -/* Endianness */ -#undef SDL_BYTEORDER - -/* Comment this if you want to build without any C library requirements */ -#undef HAVE_LIBC -#if HAVE_LIBC - -/* Useful headers */ -#undef HAVE_ALLOCA_H -#undef HAVE_SYS_TYPES_H -#undef HAVE_STDIO_H -#undef STDC_HEADERS -#undef HAVE_STDLIB_H -#undef HAVE_STDARG_H -#undef HAVE_MALLOC_H -#undef HAVE_MEMORY_H -#undef HAVE_STRING_H -#undef HAVE_STRINGS_H -#undef HAVE_INTTYPES_H -#undef HAVE_STDINT_H -#undef HAVE_CTYPE_H -#undef HAVE_MATH_H -#undef HAVE_ICONV_H -#undef HAVE_SIGNAL_H -#undef HAVE_ALTIVEC_H - -/* C library functions */ -#undef HAVE_MALLOC -#undef HAVE_CALLOC -#undef HAVE_REALLOC -#undef HAVE_FREE -#undef HAVE_ALLOCA -#ifndef _WIN32 /* Don't use C runtime versions of these on Windows */ -#undef HAVE_GETENV -#undef HAVE_PUTENV -#undef HAVE_UNSETENV -#endif -#undef HAVE_QSORT -#undef HAVE_ABS -#undef HAVE_BCOPY -#undef HAVE_MEMSET -#undef HAVE_MEMCPY -#undef HAVE_MEMMOVE -#undef HAVE_MEMCMP -#undef HAVE_STRLEN -#undef HAVE_STRLCPY -#undef HAVE_STRLCAT -#undef HAVE_STRDUP -#undef HAVE__STRREV -#undef HAVE__STRUPR -#undef HAVE__STRLWR -#undef HAVE_INDEX -#undef HAVE_RINDEX -#undef HAVE_STRCHR -#undef HAVE_STRRCHR -#undef HAVE_STRSTR -#undef HAVE_ITOA -#undef HAVE__LTOA -#undef HAVE__UITOA -#undef HAVE__ULTOA -#undef HAVE_STRTOL -#undef HAVE_STRTOUL -#undef HAVE__I64TOA -#undef HAVE__UI64TOA -#undef HAVE_STRTOLL -#undef HAVE_STRTOULL -#undef HAVE_STRTOD -#undef HAVE_ATOI -#undef HAVE_ATOF -#undef HAVE_STRCMP -#undef HAVE_STRNCMP -#undef HAVE__STRICMP -#undef HAVE_STRCASECMP -#undef HAVE__STRNICMP -#undef HAVE_STRNCASECMP -#undef HAVE_SSCANF -#undef HAVE_SNPRINTF -#undef HAVE_VSNPRINTF -#undef HAVE_ICONV -#undef HAVE_SIGACTION -#undef HAVE_SETJMP -#undef HAVE_NANOSLEEP -#undef HAVE_CLOCK_GETTIME -#undef HAVE_DLVSYM -#undef HAVE_GETPAGESIZE -#undef HAVE_MPROTECT - -#else -/* We may need some replacement for stdarg.h here */ -#include -#endif /* HAVE_LIBC */ - -/* Allow disabling of core subsystems */ -#undef SDL_AUDIO_DISABLED -#undef SDL_CDROM_DISABLED -#undef SDL_CPUINFO_DISABLED -#undef SDL_EVENTS_DISABLED -#undef SDL_FILE_DISABLED -#undef SDL_JOYSTICK_DISABLED -#undef SDL_LOADSO_DISABLED -#undef SDL_THREADS_DISABLED -#undef SDL_TIMERS_DISABLED -#undef SDL_VIDEO_DISABLED - -/* Enable various audio drivers */ -#undef SDL_AUDIO_DRIVER_ALSA -#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC -#undef SDL_AUDIO_DRIVER_ARTS -#undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC -#undef SDL_AUDIO_DRIVER_BAUDIO -#undef SDL_AUDIO_DRIVER_BSD -#undef SDL_AUDIO_DRIVER_COREAUDIO -#undef SDL_AUDIO_DRIVER_DART -#undef SDL_AUDIO_DRIVER_DC -#undef SDL_AUDIO_DRIVER_DISK -#undef SDL_AUDIO_DRIVER_DUMMY -#undef SDL_AUDIO_DRIVER_DMEDIA -#undef SDL_AUDIO_DRIVER_DSOUND -#undef SDL_AUDIO_DRIVER_PULSE -#undef SDL_AUDIO_DRIVER_PULSE_DYNAMIC -#undef SDL_AUDIO_DRIVER_ESD -#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC -#undef SDL_AUDIO_DRIVER_MINT -#undef SDL_AUDIO_DRIVER_MMEAUDIO -#undef SDL_AUDIO_DRIVER_NAS -#undef SDL_AUDIO_DRIVER_OSS -#undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H -#undef SDL_AUDIO_DRIVER_PAUD -#undef SDL_AUDIO_DRIVER_QNXNTO -#undef SDL_AUDIO_DRIVER_SNDMGR -#undef SDL_AUDIO_DRIVER_SUNAUDIO -#undef SDL_AUDIO_DRIVER_WAVEOUT - -/* Enable various cdrom drivers */ -#undef SDL_CDROM_AIX -#undef SDL_CDROM_BEOS -#undef SDL_CDROM_BSDI -#undef SDL_CDROM_DC -#undef SDL_CDROM_DUMMY -#undef SDL_CDROM_FREEBSD -#undef SDL_CDROM_LINUX -#undef SDL_CDROM_MACOS -#undef SDL_CDROM_MACOSX -#undef SDL_CDROM_MINT -#undef SDL_CDROM_OPENBSD -#undef SDL_CDROM_OS2 -#undef SDL_CDROM_OSF -#undef SDL_CDROM_QNX -#undef SDL_CDROM_WIN32 - -/* Enable various input drivers */ -#undef SDL_INPUT_LINUXEV -#undef SDL_INPUT_TSLIB -#undef SDL_JOYSTICK_BEOS -#undef SDL_JOYSTICK_DC -#undef SDL_JOYSTICK_DUMMY -#undef SDL_JOYSTICK_IOKIT -#undef SDL_JOYSTICK_LINUX -#undef SDL_JOYSTICK_MACOS -#undef SDL_JOYSTICK_MINT -#undef SDL_JOYSTICK_OS2 -#undef SDL_JOYSTICK_RISCOS -#undef SDL_JOYSTICK_WINMM -#undef SDL_JOYSTICK_USBHID -#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H - -/* Enable various shared object loading systems */ -#undef SDL_LOADSO_BEOS -#undef SDL_LOADSO_DLCOMPAT -#undef SDL_LOADSO_DLOPEN -#undef SDL_LOADSO_DUMMY -#undef SDL_LOADSO_LDG -#undef SDL_LOADSO_MACOS -#undef SDL_LOADSO_OS2 -#undef SDL_LOADSO_WIN32 - -/* Enable various threading systems */ -#undef SDL_THREAD_BEOS -#undef SDL_THREAD_DC -#undef SDL_THREAD_OS2 -#undef SDL_THREAD_PTH -#undef SDL_THREAD_PTHREAD -#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX -#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP -#undef SDL_THREAD_SPROC -#undef SDL_THREAD_WIN32 - -/* Enable various timer systems */ -#undef SDL_TIMER_BEOS -#undef SDL_TIMER_DC -#undef SDL_TIMER_DUMMY -#undef SDL_TIMER_MACOS -#undef SDL_TIMER_MINT -#undef SDL_TIMER_OS2 -#undef SDL_TIMER_RISCOS -#undef SDL_TIMER_UNIX -#undef SDL_TIMER_WIN32 -#undef SDL_TIMER_WINCE - -/* Enable various video drivers */ -#undef SDL_VIDEO_DRIVER_AALIB -#undef SDL_VIDEO_DRIVER_BWINDOW -#undef SDL_VIDEO_DRIVER_DC -#undef SDL_VIDEO_DRIVER_DDRAW -#undef SDL_VIDEO_DRIVER_DGA -#undef SDL_VIDEO_DRIVER_DIRECTFB -#undef SDL_VIDEO_DRIVER_DRAWSPROCKET -#undef SDL_VIDEO_DRIVER_DUMMY -#undef SDL_VIDEO_DRIVER_FBCON -#undef SDL_VIDEO_DRIVER_GAPI -#undef SDL_VIDEO_DRIVER_GEM -#undef SDL_VIDEO_DRIVER_GGI -#undef SDL_VIDEO_DRIVER_IPOD -#undef SDL_VIDEO_DRIVER_NANOX -#undef SDL_VIDEO_DRIVER_OS2FS -#undef SDL_VIDEO_DRIVER_PHOTON -#undef SDL_VIDEO_DRIVER_PICOGUI -#undef SDL_VIDEO_DRIVER_PS2GS -#undef SDL_VIDEO_DRIVER_QTOPIA -#undef SDL_VIDEO_DRIVER_QUARTZ -#undef SDL_VIDEO_DRIVER_RISCOS -#undef SDL_VIDEO_DRIVER_SVGALIB -#undef SDL_VIDEO_DRIVER_TOOLBOX -#undef SDL_VIDEO_DRIVER_VGL -#undef SDL_VIDEO_DRIVER_WINDIB -#undef SDL_VIDEO_DRIVER_WSCONS -#undef SDL_VIDEO_DRIVER_X11 -#undef SDL_VIDEO_DRIVER_X11_DGAMOUSE -#undef SDL_VIDEO_DRIVER_X11_DPMS -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER -#undef SDL_VIDEO_DRIVER_X11_VIDMODE -#undef SDL_VIDEO_DRIVER_X11_XINERAMA -#undef SDL_VIDEO_DRIVER_X11_XME -#undef SDL_VIDEO_DRIVER_X11_XRANDR -#undef SDL_VIDEO_DRIVER_X11_XV -#undef SDL_VIDEO_DRIVER_XBIOS - -/* Enable OpenGL support */ -#undef SDL_VIDEO_OPENGL -#undef SDL_VIDEO_OPENGL_GLX -#undef SDL_VIDEO_OPENGL_WGL -#undef SDL_VIDEO_OPENGL_OSMESA -#undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC - -/* Enable assembly routines */ -#undef SDL_ASSEMBLY_ROUTINES -#undef SDL_HERMES_BLITTERS -#undef SDL_ALTIVEC_BLITTERS - -#endif /* _SDL_config_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_dreamcast.h b/Externals/SDL/Include_1.2/SDL_config_dreamcast.h deleted file mode 100644 index 9cbeea3166..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_dreamcast.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_dreamcast_h -#define _SDL_config_dreamcast_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; -typedef unsigned long uintptr_t; -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_CTYPE_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRDUP 1 -#define HAVE_INDEX 1 -#define HAVE_RINDEX 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_DC 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_DC 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_DC 1 - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_DUMMY 1 - -/* Enable various threading systems */ -#define SDL_THREAD_DC 1 - -/* Enable various timer systems */ -#define SDL_TIMER_DC 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DC 1 -#define SDL_VIDEO_DRIVER_DUMMY 1 - -#endif /* _SDL_config_dreamcast_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_macos.h b/Externals/SDL/Include_1.2/SDL_config_macos.h deleted file mode 100644 index c4a1c59804..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_macos.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_macos_h -#define _SDL_config_macos_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -#include - -typedef SInt8 int8_t; -typedef UInt8 uint8_t; -typedef SInt16 int16_t; -typedef UInt16 uint16_t; -typedef SInt32 int32_t; -typedef UInt32 uint32_t; -typedef SInt64 int64_t; -typedef UInt64 uint64_t; -typedef unsigned long uintptr_t; - -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_ABS 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_ITOA 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_SSCANF 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_SNDMGR 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#if TARGET_API_MAC_CARBON -#define SDL_CDROM_DUMMY 1 -#else -#define SDL_CDROM_MACOS 1 -#endif - -/* Enable various input drivers */ -#if TARGET_API_MAC_CARBON -#define SDL_JOYSTICK_DUMMY 1 -#else -#define SDL_JOYSTICK_MACOS 1 -#endif - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_MACOS 1 - -/* Enable various threading systems */ -#define SDL_THREADS_DISABLED 1 - -/* Enable various timer systems */ -#define SDL_TIMER_MACOS 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -#define SDL_VIDEO_DRIVER_DRAWSPROCKET 1 -#define SDL_VIDEO_DRIVER_TOOLBOX 1 - -/* Enable OpenGL support */ -#define SDL_VIDEO_OPENGL 1 - -#endif /* _SDL_config_macos_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_macosx.h b/Externals/SDL/Include_1.2/SDL_config_macosx.h deleted file mode 100644 index 481c22edc3..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_macosx.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_macosx_h -#define _SDL_config_macosx_h - -#include "SDL_platform.h" - -/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ -#include - -/* This is a set of defines to configure the SDL features */ - -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -/* If we specified an SDK or have a post-PowerPC chip, then alloca.h exists. */ -#if ( (MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (!defined(__POWERPC__)) ) -#define HAVE_ALLOCA_H 1 -#endif -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOULL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SIGACTION 1 -#define HAVE_SETJMP 1 -#define HAVE_NANOSLEEP 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_COREAUDIO 1 -#define SDL_AUDIO_DRIVER_SNDMGR 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_MACOSX 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_IOKIT 1 - -/* Enable various shared object loading systems */ -#ifdef __ppc__ -/* For Mac OS X 10.2 compatibility */ -#define SDL_LOADSO_DLCOMPAT 1 -#else -#define SDL_LOADSO_DLOPEN 1 -#endif - -/* Enable various threading systems */ -#define SDL_THREAD_PTHREAD 1 -#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 - -/* Enable various timer systems */ -#define SDL_TIMER_UNIX 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -#if ((defined TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON)) -#define SDL_VIDEO_DRIVER_TOOLBOX 1 -#else -#define SDL_VIDEO_DRIVER_QUARTZ 1 -#endif - -/* Enable OpenGL support */ -#define SDL_VIDEO_OPENGL 1 - -/* Enable assembly routines */ -#define SDL_ASSEMBLY_ROUTINES 1 -#ifdef __ppc__ -#define SDL_ALTIVEC_BLITTERS 1 -#endif - -#endif /* _SDL_config_macosx_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_minimal.h b/Externals/SDL/Include_1.2/SDL_config_minimal.h deleted file mode 100644 index 78b6148ca9..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_minimal.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_minimal_h -#define _SDL_config_minimal_h - -#include "SDL_platform.h" - -/* This is the minimal configuration that can be used to build SDL */ - -#include - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef unsigned int size_t; -typedef unsigned long uintptr_t; - -/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ -#define SDL_CDROM_DISABLED 1 - -/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ -#define SDL_JOYSTICK_DISABLED 1 - -/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ -#define SDL_LOADSO_DISABLED 1 - -/* Enable the stub thread support (src/thread/generic/\*.c) */ -#define SDL_THREADS_DISABLED 1 - -/* Enable the stub timer support (src/timer/dummy/\*.c) */ -#define SDL_TIMERS_DISABLED 1 - -/* Enable the dummy video driver (src/video/dummy/\*.c) */ -#define SDL_VIDEO_DRIVER_DUMMY 1 - -#endif /* _SDL_config_minimal_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_nds.h b/Externals/SDL/Include_1.2/SDL_config_nds.h deleted file mode 100644 index 20b789c85a..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_nds.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_nds_h -#define _SDL_config_nds_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -/* General platform specific identifiers */ -#include "SDL_platform.h" - -/* C datatypes */ -#define SDL_HAS_64BIT_TYPE 1 - -/* Endianness */ -#define SDL_BYTEORDER 1234 - -/* Useful headers */ -#define HAVE_ALLOCA_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STDARG_H 1 -#define HAVE_MALLOC_H 1 -#define HAVE_STRING_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_ICONV_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOULL 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SETJMP 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_NDS 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ -#define SDL_CDROM_DISABLED 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_NDS 1 - -/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ -#define SDL_LOADSO_DISABLED 1 - -/* Enable the stub thread support (src/thread/generic/\*.c) */ -#define SDL_THREADS_DISABLED 1 - -/* Enable various timer systems */ -#define SDL_TIMER_NDS 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_NDS 1 -#define SDL_VIDEO_DRIVER_DUMMY 1 - -#endif /* _SDL_config_nds_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_os2.h b/Externals/SDL/Include_1.2/SDL_config_os2.h deleted file mode 100644 index 8cdea9ff2b..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_os2.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_os2_h -#define _SDL_config_os2_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef unsigned int size_t; -typedef unsigned long uintptr_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; - -#define SDL_HAS_64BIT_TYPE 1 - -/* Use Watcom's LIBC */ -#define HAVE_LIBC 1 - -/* Useful headers */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STDARG_H 1 -#define HAVE_MALLOC_H 1 -#define HAVE_MEMORY_H 1 -#define HAVE_STRING_H 1 -#define HAVE_STRINGS_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE__STRREV 1 -#define HAVE__STRUPR 1 -#define HAVE__STRLWR 1 -#define HAVE_INDEX 1 -#define HAVE_RINDEX 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_ITOA 1 -#define HAVE__LTOA 1 -#define HAVE__UITOA 1 -#define HAVE__ULTOA 1 -#define HAVE_STRTOL 1 -#define HAVE__I64TOA 1 -#define HAVE__UI64TOA 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SETJMP 1 -#define HAVE_CLOCK_GETTIME 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_DART 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_OS2 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_OS2 1 - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_OS2 1 - -/* Enable various threading systems */ -#define SDL_THREAD_OS2 1 - -/* Enable various timer systems */ -#define SDL_TIMER_OS2 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -#define SDL_VIDEO_DRIVER_OS2FS 1 - -/* Enable OpenGL support */ -/* Nothing here yet for OS/2... :( */ - -/* Enable assembly routines where available */ -#define SDL_ASSEMBLY_ROUTINES 1 - -#endif /* _SDL_config_os2_h */ diff --git a/Externals/SDL/Include_1.2/SDL_config_win32.h b/Externals/SDL/Include_1.2/SDL_config_win32.h deleted file mode 100644 index cfb44d2a07..0000000000 --- a/Externals/SDL/Include_1.2/SDL_config_win32.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_win32_h -#define _SDL_config_win32_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -#if defined(__GNUC__) || defined(__DMC__) -#define HAVE_STDINT_H 1 -#elif defined(_MSC_VER) -typedef signed __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef signed __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef signed __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; -#ifndef _UINTPTR_T_DEFINED -#ifdef _WIN64 -typedef unsigned __int64 uintptr_t; -#else -typedef unsigned int uintptr_t; -#endif -#define _UINTPTR_T_DEFINED -#endif -/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ -#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) -#define DWORD_PTR DWORD -#endif -#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) -#define LONG_PTR LONG -#endif -#else /* !__GNUC__ && !_MSC_VER */ -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; -#ifndef _SIZE_T_DEFINED_ -#define _SIZE_T_DEFINED_ -typedef unsigned int size_t; -#endif -typedef unsigned int uintptr_t; -#endif /* __GNUC__ || _MSC_VER */ -#define SDL_HAS_64BIT_TYPE 1 - -/* Enabled for SDL 1.2 (binary compatibility) */ -#define HAVE_LIBC 1 -#ifdef HAVE_LIBC -/* Useful headers */ -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#ifndef _WIN32_WCE -#define HAVE_SIGNAL_H 1 -#endif - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE__STRREV 1 -#define HAVE__STRUPR 1 -#define HAVE__STRLWR 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_ITOA 1 -#define HAVE__LTOA 1 -#define HAVE__ULTOA 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE__STRICMP 1 -#define HAVE__STRNICMP 1 -#define HAVE_SSCANF 1 -#else -#define HAVE_STDARG_H 1 -#define HAVE_STDDEF_H 1 -#endif - -/* Enable various audio drivers */ -#ifndef _WIN32_WCE -#define SDL_AUDIO_DRIVER_DSOUND 1 -#endif -#define SDL_AUDIO_DRIVER_WAVEOUT 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#ifdef _WIN32_WCE -#define SDL_CDROM_DISABLED 1 -#else -#define SDL_CDROM_WIN32 1 -#endif - -/* Enable various input drivers */ -#ifdef _WIN32_WCE -#define SDL_JOYSTICK_DISABLED 1 -#else -#define SDL_JOYSTICK_WINMM 1 -#endif - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_WIN32 1 - -/* Enable various threading systems */ -#define SDL_THREAD_WIN32 1 - -/* Enable various timer systems */ -#ifdef _WIN32_WCE -#define SDL_TIMER_WINCE 1 -#else -#define SDL_TIMER_WIN32 1 -#endif - -/* Enable various video drivers */ -#ifdef _WIN32_WCE -#define SDL_VIDEO_DRIVER_GAPI 1 -#endif -#ifndef _WIN32_WCE -#define SDL_VIDEO_DRIVER_DDRAW 1 -#endif -#define SDL_VIDEO_DRIVER_DUMMY 1 -#define SDL_VIDEO_DRIVER_WINDIB 1 - -/* Enable OpenGL support */ -#ifndef _WIN32_WCE -#define SDL_VIDEO_OPENGL 1 -#define SDL_VIDEO_OPENGL_WGL 1 -#endif - -/* Enable assembly routines (Win64 doesn't have inline asm) */ -#ifndef _WIN64 -#define SDL_ASSEMBLY_ROUTINES 1 -#endif - -#endif /* _SDL_config_win32_h */ diff --git a/Externals/SDL/Include_1.2/SDL_copying.h b/Externals/SDL/Include_1.2/SDL_copying.h deleted file mode 100644 index 39e122db73..0000000000 --- a/Externals/SDL/Include_1.2/SDL_copying.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - diff --git a/Externals/SDL/Include_1.2/SDL_cpuinfo.h b/Externals/SDL/Include_1.2/SDL_cpuinfo.h deleted file mode 100644 index 72acbdd8ba..0000000000 --- a/Externals/SDL/Include_1.2/SDL_cpuinfo.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* CPU feature detection for SDL */ - -#ifndef _SDL_cpuinfo_h -#define _SDL_cpuinfo_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* This function returns true if the CPU has the RDTSC instruction - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); - -/* This function returns true if the CPU has MMX features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); - -/* This function returns true if the CPU has MMX Ext. features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); - -/* This function returns true if the CPU has 3DNow features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); - -/* This function returns true if the CPU has 3DNow! Ext. features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); - -/* This function returns true if the CPU has SSE features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); - -/* This function returns true if the CPU has SSE2 features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); - -/* This function returns true if the CPU has AltiVec features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_cpuinfo_h */ diff --git a/Externals/SDL/Include_1.2/SDL_endian.h b/Externals/SDL/Include_1.2/SDL_endian.h deleted file mode 100644 index 8f8db4ccae..0000000000 --- a/Externals/SDL/Include_1.2/SDL_endian.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Functions for reading and writing endian-specific values */ - -#ifndef _SDL_endian_h -#define _SDL_endian_h - -#include "SDL_stdinc.h" - -/* The two types of endianness */ -#define SDL_LIL_ENDIAN 1234 -#define SDL_BIG_ENDIAN 4321 - -#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ -#if defined(__hppa__) || \ - defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ - (defined(__MIPS__) && defined(__MISPEB__)) || \ - defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ - defined(__sparc__) -#define SDL_BYTEORDER SDL_BIG_ENDIAN -#else -#define SDL_BYTEORDER SDL_LIL_ENDIAN -#endif -#endif /* !SDL_BYTEORDER */ - - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Use inline functions for compilers that support them, and static - functions for those that do not. Because these functions become - static for compilers that do not support inline functions, this - header should only be included in files that actually use them. -*/ -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - Uint16 result; - - __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); - return result; -} -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); - return x; -} -#else -static __inline__ Uint16 SDL_Swap16(Uint16 x) { - return((x<<8)|(x>>8)); -} -#endif - -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("bswap %0" : "=r" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("bswapl %0" : "=r" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - Uint32 result; - - __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); - __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); - __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); - return result; -} -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); - return x; -} -#else -static __inline__ Uint32 SDL_Swap32(Uint32 x) { - return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24)); -} -#endif - -#ifdef SDL_HAS_64BIT_TYPE -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - union { - struct { Uint32 a,b; } s; - Uint64 u; - } v; - v.u = x; - __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" - : "=r" (v.s.a), "=r" (v.s.b) - : "0" (v.s.a), "1" (v.s.b)); - return v.u; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - __asm__("bswapq %0" : "=r" (x) : "0" (x)); - return x; -} -#else -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - Uint32 hi, lo; - - /* Separate into high and low 32-bit values and swap them */ - lo = (Uint32)(x&0xFFFFFFFF); - x >>= 32; - hi = (Uint32)(x&0xFFFFFFFF); - x = SDL_Swap32(lo); - x <<= 32; - x |= SDL_Swap32(hi); - return(x); -} -#endif -#else -/* This is mainly to keep compilers from complaining in SDL code. - If there is no real 64-bit datatype, then compilers will complain about - the fake 64-bit datatype that SDL provides when it compiles user code. -*/ -#define SDL_Swap64(X) (X) -#endif /* SDL_HAS_64BIT_TYPE */ - - -/* Byteswap item from the specified endianness to the native endianness */ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SDL_SwapLE16(X) (X) -#define SDL_SwapLE32(X) (X) -#define SDL_SwapLE64(X) (X) -#define SDL_SwapBE16(X) SDL_Swap16(X) -#define SDL_SwapBE32(X) SDL_Swap32(X) -#define SDL_SwapBE64(X) SDL_Swap64(X) -#else -#define SDL_SwapLE16(X) SDL_Swap16(X) -#define SDL_SwapLE32(X) SDL_Swap32(X) -#define SDL_SwapLE64(X) SDL_Swap64(X) -#define SDL_SwapBE16(X) (X) -#define SDL_SwapBE32(X) (X) -#define SDL_SwapBE64(X) (X) -#endif - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_endian_h */ diff --git a/Externals/SDL/Include_1.2/SDL_error.h b/Externals/SDL/Include_1.2/SDL_error.h deleted file mode 100644 index 26d6bfaef1..0000000000 --- a/Externals/SDL/Include_1.2/SDL_error.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Simple error message routines for SDL */ - -#ifndef _SDL_error_h -#define _SDL_error_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Public functions */ -extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); -extern DECLSPEC char * SDLCALL SDL_GetError(void); -extern DECLSPEC void SDLCALL SDL_ClearError(void); - -/* Private error message function - used internally */ -#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) -#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) -typedef enum { - SDL_ENOMEM, - SDL_EFREAD, - SDL_EFWRITE, - SDL_EFSEEK, - SDL_UNSUPPORTED, - SDL_LASTERROR -} SDL_errorcode; -extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_error_h */ diff --git a/Externals/SDL/Include_1.2/SDL_events.h b/Externals/SDL/Include_1.2/SDL_events.h deleted file mode 100644 index 9fe918c7be..0000000000 --- a/Externals/SDL/Include_1.2/SDL_events.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL event handling */ - -#ifndef _SDL_events_h -#define _SDL_events_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_active.h" -#include "SDL_keyboard.h" -#include "SDL_mouse.h" -#include "SDL_joystick.h" -#include "SDL_quit.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* General keyboard/mouse state definitions */ -#define SDL_RELEASED 0 -#define SDL_PRESSED 1 - -/* Event enumerations */ -typedef enum { - SDL_NOEVENT = 0, /* Unused (do not remove) */ - SDL_ACTIVEEVENT, /* Application loses/gains visibility */ - SDL_KEYDOWN, /* Keys pressed */ - SDL_KEYUP, /* Keys released */ - SDL_MOUSEMOTION, /* Mouse moved */ - SDL_MOUSEBUTTONDOWN, /* Mouse button pressed */ - SDL_MOUSEBUTTONUP, /* Mouse button released */ - SDL_JOYAXISMOTION, /* Joystick axis motion */ - SDL_JOYBALLMOTION, /* Joystick trackball motion */ - SDL_JOYHATMOTION, /* Joystick hat position change */ - SDL_JOYBUTTONDOWN, /* Joystick button pressed */ - SDL_JOYBUTTONUP, /* Joystick button released */ - SDL_QUIT, /* User-requested quit */ - SDL_SYSWMEVENT, /* System specific event */ - SDL_EVENT_RESERVEDA, /* Reserved for future use.. */ - SDL_EVENT_RESERVEDB, /* Reserved for future use.. */ - SDL_VIDEORESIZE, /* User resized video mode */ - SDL_VIDEOEXPOSE, /* Screen needs to be redrawn */ - SDL_EVENT_RESERVED2, /* Reserved for future use.. */ - SDL_EVENT_RESERVED3, /* Reserved for future use.. */ - SDL_EVENT_RESERVED4, /* Reserved for future use.. */ - SDL_EVENT_RESERVED5, /* Reserved for future use.. */ - SDL_EVENT_RESERVED6, /* Reserved for future use.. */ - SDL_EVENT_RESERVED7, /* Reserved for future use.. */ - /* Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ - SDL_USEREVENT = 24, - /* This last event is only for bounding internal arrays - It is the number of bits in the event mask datatype -- Uint32 - */ - SDL_NUMEVENTS = 32 -} SDL_EventType; - -/* Predefined event masks */ -#define SDL_EVENTMASK(X) (1<<(X)) -typedef enum { - SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), - SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), - SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), - SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| - SDL_EVENTMASK(SDL_KEYUP), - SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), - SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), - SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| - SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| - SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), - SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), - SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), - SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), - SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| - SDL_EVENTMASK(SDL_JOYBALLMOTION)| - SDL_EVENTMASK(SDL_JOYHATMOTION)| - SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| - SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), - SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), - SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), - SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) -} SDL_EventMask ; -#define SDL_ALLEVENTS 0xFFFFFFFF - -/* Application visibility event structure */ -typedef struct SDL_ActiveEvent { - Uint8 type; /* SDL_ACTIVEEVENT */ - Uint8 gain; /* Whether given states were gained or lost (1/0) */ - Uint8 state; /* A mask of the focus states */ -} SDL_ActiveEvent; - -/* Keyboard event structure */ -typedef struct SDL_KeyboardEvent { - Uint8 type; /* SDL_KEYDOWN or SDL_KEYUP */ - Uint8 which; /* The keyboard device index */ - Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ - SDL_keysym keysym; -} SDL_KeyboardEvent; - -/* Mouse motion event structure */ -typedef struct SDL_MouseMotionEvent { - Uint8 type; /* SDL_MOUSEMOTION */ - Uint8 which; /* The mouse device index */ - Uint8 state; /* The current button state */ - Uint16 x, y; /* The X/Y coordinates of the mouse */ - Sint16 xrel; /* The relative motion in the X direction */ - Sint16 yrel; /* The relative motion in the Y direction */ -} SDL_MouseMotionEvent; - -/* Mouse button event structure */ -typedef struct SDL_MouseButtonEvent { - Uint8 type; /* SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ - Uint8 which; /* The mouse device index */ - Uint8 button; /* The mouse button index */ - Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ - Uint16 x, y; /* The X/Y coordinates of the mouse at press time */ -} SDL_MouseButtonEvent; - -/* Joystick axis motion event structure */ -typedef struct SDL_JoyAxisEvent { - Uint8 type; /* SDL_JOYAXISMOTION */ - Uint8 which; /* The joystick device index */ - Uint8 axis; /* The joystick axis index */ - Sint16 value; /* The axis value (range: -32768 to 32767) */ -} SDL_JoyAxisEvent; - -/* Joystick trackball motion event structure */ -typedef struct SDL_JoyBallEvent { - Uint8 type; /* SDL_JOYBALLMOTION */ - Uint8 which; /* The joystick device index */ - Uint8 ball; /* The joystick trackball index */ - Sint16 xrel; /* The relative motion in the X direction */ - Sint16 yrel; /* The relative motion in the Y direction */ -} SDL_JoyBallEvent; - -/* Joystick hat position change event structure */ -typedef struct SDL_JoyHatEvent { - Uint8 type; /* SDL_JOYHATMOTION */ - Uint8 which; /* The joystick device index */ - Uint8 hat; /* The joystick hat index */ - Uint8 value; /* The hat position value: - SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP - SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT - SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN - Note that zero means the POV is centered. - */ -} SDL_JoyHatEvent; - -/* Joystick button event structure */ -typedef struct SDL_JoyButtonEvent { - Uint8 type; /* SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ - Uint8 which; /* The joystick device index */ - Uint8 button; /* The joystick button index */ - Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ -} SDL_JoyButtonEvent; - -/* The "window resized" event - When you get this event, you are responsible for setting a new video - mode with the new width and height. - */ -typedef struct SDL_ResizeEvent { - Uint8 type; /* SDL_VIDEORESIZE */ - int w; /* New width */ - int h; /* New height */ -} SDL_ResizeEvent; - -/* The "screen redraw" event */ -typedef struct SDL_ExposeEvent { - Uint8 type; /* SDL_VIDEOEXPOSE */ -} SDL_ExposeEvent; - -/* The "quit requested" event */ -typedef struct SDL_QuitEvent { - Uint8 type; /* SDL_QUIT */ -} SDL_QuitEvent; - -/* A user-defined event type */ -typedef struct SDL_UserEvent { - Uint8 type; /* SDL_USEREVENT through SDL_NUMEVENTS-1 */ - int code; /* User defined event code */ - void *data1; /* User defined data pointer */ - void *data2; /* User defined data pointer */ -} SDL_UserEvent; - -/* If you want to use this event, you should include SDL_syswm.h */ -struct SDL_SysWMmsg; -typedef struct SDL_SysWMmsg SDL_SysWMmsg; -typedef struct SDL_SysWMEvent { - Uint8 type; - SDL_SysWMmsg *msg; -} SDL_SysWMEvent; - -/* General event structure */ -typedef union SDL_Event { - Uint8 type; - SDL_ActiveEvent active; - SDL_KeyboardEvent key; - SDL_MouseMotionEvent motion; - SDL_MouseButtonEvent button; - SDL_JoyAxisEvent jaxis; - SDL_JoyBallEvent jball; - SDL_JoyHatEvent jhat; - SDL_JoyButtonEvent jbutton; - SDL_ResizeEvent resize; - SDL_ExposeEvent expose; - SDL_QuitEvent quit; - SDL_UserEvent user; - SDL_SysWMEvent syswm; -} SDL_Event; - - -/* Function prototypes */ - -/* Pumps the event loop, gathering events from the input devices. - This function updates the event queue and internal input device state. - This should only be run in the thread that sets the video mode. -*/ -extern DECLSPEC void SDLCALL SDL_PumpEvents(void); - -/* Checks the event queue for messages and optionally returns them. - If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to - the back of the event queue. - If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front - of the event queue, matching 'mask', will be returned and will not - be removed from the queue. - If 'action' is SDL_GETEVENT, up to 'numevents' events at the front - of the event queue, matching 'mask', will be returned and will be - removed from the queue. - This function returns the number of events actually stored, or -1 - if there was an error. This function is thread-safe. -*/ -typedef enum { - SDL_ADDEVENT, - SDL_PEEKEVENT, - SDL_GETEVENT -} SDL_eventaction; -/* */ -extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, - SDL_eventaction action, Uint32 mask); - -/* Polls for currently pending events, and returns 1 if there are any pending - events, or 0 if there are none available. If 'event' is not NULL, the next - event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); - -/* Waits indefinitely for the next available event, returning 1, or 0 if there - was an error while waiting for events. If 'event' is not NULL, the next - event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); - -/* Add an event to the event queue. - This function returns 0 on success, or -1 if the event queue was full - or there was some other error. - */ -extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); - -/* - This function sets up a filter to process all events before they - change internal state and are posted to the internal event queue. - - The filter is protypted as: -*/ -typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); -/* - If the filter returns 1, then the event will be added to the internal queue. - If it returns 0, then the event will be dropped from the queue, but the - internal state will still be updated. This allows selective filtering of - dynamically arriving events. - - WARNING: Be very careful of what you do in the event filter function, as - it may run in a different thread! - - There is one caveat when dealing with the SDL_QUITEVENT event type. The - event filter is only called when the window manager desires to close the - application window. If the event filter returns 1, then the window will - be closed, otherwise the window will remain open if possible. - If the quit event is generated by an interrupt signal, it will bypass the - internal queue and be delivered to the application at the next event poll. -*/ -extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); - -/* - Return the current event filter - can be used to "chain" filters. - If there is no event filter set, this function returns NULL. -*/ -extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); - -/* - This function allows you to set the state of processing certain events. - If 'state' is set to SDL_IGNORE, that event will be automatically dropped - from the event queue and will not event be filtered. - If 'state' is set to SDL_ENABLE, that event will be processed normally. - If 'state' is set to SDL_QUERY, SDL_EventState() will return the - current processing state of the specified event. -*/ -#define SDL_QUERY -1 -#define SDL_IGNORE 0 -#define SDL_DISABLE 0 -#define SDL_ENABLE 1 -extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_events_h */ diff --git a/Externals/SDL/Include_1.2/SDL_getenv.h b/Externals/SDL/Include_1.2/SDL_getenv.h deleted file mode 100644 index 853b9ce454..0000000000 --- a/Externals/SDL/Include_1.2/SDL_getenv.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* DEPRECATED */ -#include "SDL_stdinc.h" diff --git a/Externals/SDL/Include_1.2/SDL_joystick.h b/Externals/SDL/Include_1.2/SDL_joystick.h deleted file mode 100644 index e4f72f1a41..0000000000 --- a/Externals/SDL/Include_1.2/SDL_joystick.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL joystick event handling */ - -#ifndef _SDL_joystick_h -#define _SDL_joystick_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* In order to use these functions, SDL_Init() must have been called - with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system - for joysticks, and load appropriate drivers. -*/ - -/* The joystick structure used to identify an SDL joystick */ -struct _SDL_Joystick; -typedef struct _SDL_Joystick SDL_Joystick; - - -/* Function prototypes */ -/* - * Count the number of joysticks attached to the system - */ -extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); - -/* - * Get the implementation dependent name of a joystick. - * This can be called before any joysticks are opened. - * If no name can be found, this function returns NULL. - */ -extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); - -/* - * Open a joystick for use - the index passed as an argument refers to - * the N'th joystick on the system. This index is the value which will - * identify this joystick in future joystick events. - * - * This function returns a joystick identifier, or NULL if an error occurred. - */ -extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); - -/* - * Returns 1 if the joystick has been opened, or 0 if it has not. - */ -extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); - -/* - * Get the device index of an opened joystick. - */ -extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); - -/* - * Get the number of general axis controls on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); - -/* - * Get the number of trackballs on a joystick - * Joystick trackballs have only relative motion events associated - * with them and their state cannot be polled. - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); - -/* - * Get the number of POV hats on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); - -/* - * Get the number of buttons on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); - -/* - * Update the current state of the open joysticks. - * This is called automatically by the event loop if any joystick - * events are enabled. - */ -extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); - -/* - * Enable/disable joystick event polling. - * If joystick events are disabled, you must call SDL_JoystickUpdate() - * yourself and check the state of the joystick when you want joystick - * information. - * The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. - */ -extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); - -/* - * Get the current state of an axis control on a joystick - * The state is a value ranging from -32768 to 32767. - * The axis indices start at index 0. - */ -extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); - -/* - * Get the current state of a POV hat on a joystick - * The return value is one of the following positions: - */ -#define SDL_HAT_CENTERED 0x00 -#define SDL_HAT_UP 0x01 -#define SDL_HAT_RIGHT 0x02 -#define SDL_HAT_DOWN 0x04 -#define SDL_HAT_LEFT 0x08 -#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) -#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) -#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) -#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) -/* - * The hat indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); - -/* - * Get the ball axis change since the last poll - * This returns 0, or -1 if you passed it invalid parameters. - * The ball indices start at index 0. - */ -extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); - -/* - * Get the current state of a button on a joystick - * The button indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); - -/* - * Close a joystick previously opened with SDL_JoystickOpen() - */ -extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_joystick_h */ diff --git a/Externals/SDL/Include_1.2/SDL_keyboard.h b/Externals/SDL/Include_1.2/SDL_keyboard.h deleted file mode 100644 index 1ad7dcaa44..0000000000 --- a/Externals/SDL/Include_1.2/SDL_keyboard.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL keyboard event handling */ - -#ifndef _SDL_keyboard_h -#define _SDL_keyboard_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_keysym.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Keysym structure - - The scancode is hardware dependent, and should not be used by general - applications. If no hardware scancode is available, it will be 0. - - - The 'unicode' translated character is only available when character - translation is enabled by the SDL_EnableUNICODE() API. If non-zero, - this is a UNICODE character corresponding to the keypress. If the - high 9 bits of the character are 0, then this maps to the equivalent - ASCII character: - char ch; - if ( (keysym.unicode & 0xFF80) == 0 ) { - ch = keysym.unicode & 0x7F; - } else { - An international character.. - } - */ -typedef struct SDL_keysym { - Uint8 scancode; /* hardware specific scancode */ - SDLKey sym; /* SDL virtual keysym */ - SDLMod mod; /* current key modifiers */ - Uint16 unicode; /* translated character */ -} SDL_keysym; - -/* This is the mask which refers to all hotkey bindings */ -#define SDL_ALL_HOTKEYS 0xFFFFFFFF - -/* Function prototypes */ -/* - * Enable/Disable UNICODE translation of keyboard input. - * This translation has some overhead, so translation defaults off. - * If 'enable' is 1, translation is enabled. - * If 'enable' is 0, translation is disabled. - * If 'enable' is -1, the translation state is not changed. - * It returns the previous state of keyboard translation. - */ -extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); - -/* - * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. - * 'delay' is the initial delay in ms between the time when a key is - * pressed, and keyboard repeat begins. - * 'interval' is the time in ms between keyboard repeat events. - */ -#define SDL_DEFAULT_REPEAT_DELAY 500 -#define SDL_DEFAULT_REPEAT_INTERVAL 30 -/* - * If 'delay' is set to 0, keyboard repeat is disabled. - */ -extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); -extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); - -/* - * Get a snapshot of the current state of the keyboard. - * Returns an array of keystates, indexed by the SDLK_* syms. - * Used: - * Uint8 *keystate = SDL_GetKeyState(NULL); - * if ( keystate[SDLK_RETURN] ) ... is pressed. - */ -extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); - -/* - * Get the current key modifier state - */ -extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); - -/* - * Set the current key modifier state - * This does not change the keyboard state, only the key modifier flags. - */ -extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); - -/* - * Get the name of an SDL virtual keysym - */ -extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_keyboard_h */ diff --git a/Externals/SDL/Include_1.2/SDL_keysym.h b/Externals/SDL/Include_1.2/SDL_keysym.h deleted file mode 100644 index ff44a035f9..0000000000 --- a/Externals/SDL/Include_1.2/SDL_keysym.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_keysym_h -#define _SDL_keysym_h - -/* What we really want is a mapping of every raw key on the keyboard. - To support international keyboards, we use the range 0xA1 - 0xFF - as international virtual keycodes. We'll follow in the footsteps of X11... - The names of the keys - */ - -typedef enum { - /* The keyboard syms have been cleverly chosen to map to ASCII */ - SDLK_UNKNOWN = 0, - SDLK_FIRST = 0, - SDLK_BACKSPACE = 8, - SDLK_TAB = 9, - SDLK_CLEAR = 12, - SDLK_RETURN = 13, - SDLK_PAUSE = 19, - SDLK_ESCAPE = 27, - SDLK_SPACE = 32, - SDLK_EXCLAIM = 33, - SDLK_QUOTEDBL = 34, - SDLK_HASH = 35, - SDLK_DOLLAR = 36, - SDLK_AMPERSAND = 38, - SDLK_QUOTE = 39, - SDLK_LEFTPAREN = 40, - SDLK_RIGHTPAREN = 41, - SDLK_ASTERISK = 42, - SDLK_PLUS = 43, - SDLK_COMMA = 44, - SDLK_MINUS = 45, - SDLK_PERIOD = 46, - SDLK_SLASH = 47, - SDLK_0 = 48, - SDLK_1 = 49, - SDLK_2 = 50, - SDLK_3 = 51, - SDLK_4 = 52, - SDLK_5 = 53, - SDLK_6 = 54, - SDLK_7 = 55, - SDLK_8 = 56, - SDLK_9 = 57, - SDLK_COLON = 58, - SDLK_SEMICOLON = 59, - SDLK_LESS = 60, - SDLK_EQUALS = 61, - SDLK_GREATER = 62, - SDLK_QUESTION = 63, - SDLK_AT = 64, - /* - Skip uppercase letters - */ - SDLK_LEFTBRACKET = 91, - SDLK_BACKSLASH = 92, - SDLK_RIGHTBRACKET = 93, - SDLK_CARET = 94, - SDLK_UNDERSCORE = 95, - SDLK_BACKQUOTE = 96, - SDLK_a = 97, - SDLK_b = 98, - SDLK_c = 99, - SDLK_d = 100, - SDLK_e = 101, - SDLK_f = 102, - SDLK_g = 103, - SDLK_h = 104, - SDLK_i = 105, - SDLK_j = 106, - SDLK_k = 107, - SDLK_l = 108, - SDLK_m = 109, - SDLK_n = 110, - SDLK_o = 111, - SDLK_p = 112, - SDLK_q = 113, - SDLK_r = 114, - SDLK_s = 115, - SDLK_t = 116, - SDLK_u = 117, - SDLK_v = 118, - SDLK_w = 119, - SDLK_x = 120, - SDLK_y = 121, - SDLK_z = 122, - SDLK_DELETE = 127, - /* End of ASCII mapped keysyms */ - - /* International keyboard syms */ - SDLK_WORLD_0 = 160, /* 0xA0 */ - SDLK_WORLD_1 = 161, - SDLK_WORLD_2 = 162, - SDLK_WORLD_3 = 163, - SDLK_WORLD_4 = 164, - SDLK_WORLD_5 = 165, - SDLK_WORLD_6 = 166, - SDLK_WORLD_7 = 167, - SDLK_WORLD_8 = 168, - SDLK_WORLD_9 = 169, - SDLK_WORLD_10 = 170, - SDLK_WORLD_11 = 171, - SDLK_WORLD_12 = 172, - SDLK_WORLD_13 = 173, - SDLK_WORLD_14 = 174, - SDLK_WORLD_15 = 175, - SDLK_WORLD_16 = 176, - SDLK_WORLD_17 = 177, - SDLK_WORLD_18 = 178, - SDLK_WORLD_19 = 179, - SDLK_WORLD_20 = 180, - SDLK_WORLD_21 = 181, - SDLK_WORLD_22 = 182, - SDLK_WORLD_23 = 183, - SDLK_WORLD_24 = 184, - SDLK_WORLD_25 = 185, - SDLK_WORLD_26 = 186, - SDLK_WORLD_27 = 187, - SDLK_WORLD_28 = 188, - SDLK_WORLD_29 = 189, - SDLK_WORLD_30 = 190, - SDLK_WORLD_31 = 191, - SDLK_WORLD_32 = 192, - SDLK_WORLD_33 = 193, - SDLK_WORLD_34 = 194, - SDLK_WORLD_35 = 195, - SDLK_WORLD_36 = 196, - SDLK_WORLD_37 = 197, - SDLK_WORLD_38 = 198, - SDLK_WORLD_39 = 199, - SDLK_WORLD_40 = 200, - SDLK_WORLD_41 = 201, - SDLK_WORLD_42 = 202, - SDLK_WORLD_43 = 203, - SDLK_WORLD_44 = 204, - SDLK_WORLD_45 = 205, - SDLK_WORLD_46 = 206, - SDLK_WORLD_47 = 207, - SDLK_WORLD_48 = 208, - SDLK_WORLD_49 = 209, - SDLK_WORLD_50 = 210, - SDLK_WORLD_51 = 211, - SDLK_WORLD_52 = 212, - SDLK_WORLD_53 = 213, - SDLK_WORLD_54 = 214, - SDLK_WORLD_55 = 215, - SDLK_WORLD_56 = 216, - SDLK_WORLD_57 = 217, - SDLK_WORLD_58 = 218, - SDLK_WORLD_59 = 219, - SDLK_WORLD_60 = 220, - SDLK_WORLD_61 = 221, - SDLK_WORLD_62 = 222, - SDLK_WORLD_63 = 223, - SDLK_WORLD_64 = 224, - SDLK_WORLD_65 = 225, - SDLK_WORLD_66 = 226, - SDLK_WORLD_67 = 227, - SDLK_WORLD_68 = 228, - SDLK_WORLD_69 = 229, - SDLK_WORLD_70 = 230, - SDLK_WORLD_71 = 231, - SDLK_WORLD_72 = 232, - SDLK_WORLD_73 = 233, - SDLK_WORLD_74 = 234, - SDLK_WORLD_75 = 235, - SDLK_WORLD_76 = 236, - SDLK_WORLD_77 = 237, - SDLK_WORLD_78 = 238, - SDLK_WORLD_79 = 239, - SDLK_WORLD_80 = 240, - SDLK_WORLD_81 = 241, - SDLK_WORLD_82 = 242, - SDLK_WORLD_83 = 243, - SDLK_WORLD_84 = 244, - SDLK_WORLD_85 = 245, - SDLK_WORLD_86 = 246, - SDLK_WORLD_87 = 247, - SDLK_WORLD_88 = 248, - SDLK_WORLD_89 = 249, - SDLK_WORLD_90 = 250, - SDLK_WORLD_91 = 251, - SDLK_WORLD_92 = 252, - SDLK_WORLD_93 = 253, - SDLK_WORLD_94 = 254, - SDLK_WORLD_95 = 255, /* 0xFF */ - - /* Numeric keypad */ - SDLK_KP0 = 256, - SDLK_KP1 = 257, - SDLK_KP2 = 258, - SDLK_KP3 = 259, - SDLK_KP4 = 260, - SDLK_KP5 = 261, - SDLK_KP6 = 262, - SDLK_KP7 = 263, - SDLK_KP8 = 264, - SDLK_KP9 = 265, - SDLK_KP_PERIOD = 266, - SDLK_KP_DIVIDE = 267, - SDLK_KP_MULTIPLY = 268, - SDLK_KP_MINUS = 269, - SDLK_KP_PLUS = 270, - SDLK_KP_ENTER = 271, - SDLK_KP_EQUALS = 272, - - /* Arrows + Home/End pad */ - SDLK_UP = 273, - SDLK_DOWN = 274, - SDLK_RIGHT = 275, - SDLK_LEFT = 276, - SDLK_INSERT = 277, - SDLK_HOME = 278, - SDLK_END = 279, - SDLK_PAGEUP = 280, - SDLK_PAGEDOWN = 281, - - /* Function keys */ - SDLK_F1 = 282, - SDLK_F2 = 283, - SDLK_F3 = 284, - SDLK_F4 = 285, - SDLK_F5 = 286, - SDLK_F6 = 287, - SDLK_F7 = 288, - SDLK_F8 = 289, - SDLK_F9 = 290, - SDLK_F10 = 291, - SDLK_F11 = 292, - SDLK_F12 = 293, - SDLK_F13 = 294, - SDLK_F14 = 295, - SDLK_F15 = 296, - - /* Key state modifier keys */ - SDLK_NUMLOCK = 300, - SDLK_CAPSLOCK = 301, - SDLK_SCROLLOCK = 302, - SDLK_RSHIFT = 303, - SDLK_LSHIFT = 304, - SDLK_RCTRL = 305, - SDLK_LCTRL = 306, - SDLK_RALT = 307, - SDLK_LALT = 308, - SDLK_RMETA = 309, - SDLK_LMETA = 310, - SDLK_LSUPER = 311, /* Left "Windows" key */ - SDLK_RSUPER = 312, /* Right "Windows" key */ - SDLK_MODE = 313, /* "Alt Gr" key */ - SDLK_COMPOSE = 314, /* Multi-key compose key */ - - /* Miscellaneous function keys */ - SDLK_HELP = 315, - SDLK_PRINT = 316, - SDLK_SYSREQ = 317, - SDLK_BREAK = 318, - SDLK_MENU = 319, - SDLK_POWER = 320, /* Power Macintosh power key */ - SDLK_EURO = 321, /* Some european keyboards */ - SDLK_UNDO = 322, /* Atari keyboard has Undo */ - - /* Add any other keys here */ - - SDLK_LAST -} SDLKey; - -/* Enumeration of valid key mods (possibly OR'd together) */ -typedef enum { - KMOD_NONE = 0x0000, - KMOD_LSHIFT= 0x0001, - KMOD_RSHIFT= 0x0002, - KMOD_LCTRL = 0x0040, - KMOD_RCTRL = 0x0080, - KMOD_LALT = 0x0100, - KMOD_RALT = 0x0200, - KMOD_LMETA = 0x0400, - KMOD_RMETA = 0x0800, - KMOD_NUM = 0x1000, - KMOD_CAPS = 0x2000, - KMOD_MODE = 0x4000, - KMOD_RESERVED = 0x8000 -} SDLMod; - -#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) -#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) -#define KMOD_ALT (KMOD_LALT|KMOD_RALT) -#define KMOD_META (KMOD_LMETA|KMOD_RMETA) - -#endif /* _SDL_keysym_h */ diff --git a/Externals/SDL/Include_1.2/SDL_loadso.h b/Externals/SDL/Include_1.2/SDL_loadso.h deleted file mode 100644 index ce96449494..0000000000 --- a/Externals/SDL/Include_1.2/SDL_loadso.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* System dependent library loading routines */ - -/* Some things to keep in mind: - - These functions only work on C function names. Other languages may - have name mangling and intrinsic language support that varies from - compiler to compiler. - - Make sure you declare your function pointers with the same calling - convention as the actual library function. Your code will crash - mysteriously if you do not do this. - - Avoid namespace collisions. If you load a symbol from the library, - it is not defined whether or not it goes into the global symbol - namespace for the application. If it does and it conflicts with - symbols in your code or other shared libraries, you will not get - the results you expect. :) -*/ - - -#ifndef _SDL_loadso_h -#define _SDL_loadso_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* This function dynamically loads a shared object and returns a pointer - * to the object handle (or NULL if there was an error). - * The 'sofile' parameter is a system dependent name of the object file. - */ -extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); - -/* Given an object handle, this function looks up the address of the - * named function in the shared object and returns it. This address - * is no longer valid after calling SDL_UnloadObject(). - */ -extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); - -/* Unload a shared object from memory */ -extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_loadso_h */ diff --git a/Externals/SDL/Include_1.2/SDL_main.h b/Externals/SDL/Include_1.2/SDL_main.h deleted file mode 100644 index cf8b728dc3..0000000000 --- a/Externals/SDL/Include_1.2/SDL_main.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_main_h -#define _SDL_main_h - -#include "SDL_stdinc.h" - -/* Redefine main() on Win32 and MacOS so that it is called by winmain.c */ - -#if defined(__WIN32__) || \ - (defined(__MWERKS__) && !defined(__BEOS__)) || \ - defined(__MACOS__) || defined(__MACOSX__) || \ - defined(__SYMBIAN32__) || defined(QWS) - -#ifdef __cplusplus -#define C_LINKAGE "C" -#else -#define C_LINKAGE -#endif /* __cplusplus */ - -/* The application's main() function must be called with C linkage, - and should be declared like this: -#ifdef __cplusplus -extern "C" -#endif - int main(int argc, char *argv[]) - { - } - */ -#define main SDL_main - -/* The prototype for the application's main() function */ -extern C_LINKAGE int SDL_main(int argc, char *argv[]); - - -/* From the SDL library code -- needed for registering the app on Win32 */ -#ifdef __WIN32__ - -#include "begin_code.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* This should be called from your WinMain() function, if any */ -extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); -/* This can also be called, but is no longer necessary */ -extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); -/* This can also be called, but is no longer necessary (SDL_Quit calls it) */ -extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); -#ifdef __cplusplus -} -#endif -#include "close_code.h" -#endif - -/* From the SDL library code -- needed for registering QuickDraw on MacOS */ -#if defined(__MACOS__) - -#include "begin_code.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Forward declaration so we don't need to include QuickDraw.h */ -struct QDGlobals; - -/* This should be called from your main() function, if any */ -extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); - -#ifdef __cplusplus -} -#endif -#include "close_code.h" -#endif - -#endif /* Need to redefine main()? */ - -#endif /* _SDL_main_h */ diff --git a/Externals/SDL/Include_1.2/SDL_mouse.h b/Externals/SDL/Include_1.2/SDL_mouse.h deleted file mode 100644 index 019497fbb1..0000000000 --- a/Externals/SDL/Include_1.2/SDL_mouse.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL mouse event handling */ - -#ifndef _SDL_mouse_h -#define _SDL_mouse_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_video.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct WMcursor WMcursor; /* Implementation dependent */ -typedef struct SDL_Cursor { - SDL_Rect area; /* The area of the mouse cursor */ - Sint16 hot_x, hot_y; /* The "tip" of the cursor */ - Uint8 *data; /* B/W cursor data */ - Uint8 *mask; /* B/W cursor mask */ - Uint8 *save[2]; /* Place to save cursor area */ - WMcursor *wm_cursor; /* Window-manager cursor */ -} SDL_Cursor; - -/* Function prototypes */ -/* - * Retrieve the current state of the mouse. - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * current mouse cursor position. You can pass NULL for either x or y. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); - -/* - * Retrieve the current state of the mouse. - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * mouse deltas since the last call to SDL_GetRelativeMouseState(). - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); - -/* - * Set the position of the mouse cursor (generates a mouse motion event) - */ -extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); - -/* - * Create a cursor using the specified data and mask (in MSB format). - * The cursor width must be a multiple of 8 bits. - * - * The cursor is created in black and white according to the following: - * data mask resulting pixel on screen - * 0 1 White - * 1 1 Black - * 0 0 Transparent - * 1 0 Inverted color if possible, black if not. - * - * Cursors created with this function must be freed with SDL_FreeCursor(). - */ -extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor - (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); - -/* - * Set the currently active cursor to the specified one. - * If the cursor is currently visible, the change will be immediately - * represented on the display. - */ -extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); - -/* - * Returns the currently active cursor. - */ -extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); - -/* - * Deallocates a cursor created with SDL_CreateCursor(). - */ -extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); - -/* - * Toggle whether or not the cursor is shown on the screen. - * The cursor start off displayed, but can be turned off. - * SDL_ShowCursor() returns 1 if the cursor was being displayed - * before the call, or 0 if it was not. You can query the current - * state by passing a 'toggle' value of -1. - */ -extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); - -/* Used as a mask when testing buttons in buttonstate - Button 1: Left mouse button - Button 2: Middle mouse button - Button 3: Right mouse button - Button 4: Mouse wheel up (may also be a real button) - Button 5: Mouse wheel down (may also be a real button) - */ -#define SDL_BUTTON(X) (1 << ((X)-1)) -#define SDL_BUTTON_LEFT 1 -#define SDL_BUTTON_MIDDLE 2 -#define SDL_BUTTON_RIGHT 3 -#define SDL_BUTTON_WHEELUP 4 -#define SDL_BUTTON_WHEELDOWN 5 -#define SDL_BUTTON_X1 6 -#define SDL_BUTTON_X2 7 -#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) -#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) -#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) -#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) -#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_mouse_h */ diff --git a/Externals/SDL/Include_1.2/SDL_mutex.h b/Externals/SDL/Include_1.2/SDL_mutex.h deleted file mode 100644 index 00165281de..0000000000 --- a/Externals/SDL/Include_1.2/SDL_mutex.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_mutex_h -#define _SDL_mutex_h - -/* Functions to provide thread synchronization primitives - - These are independent of the other SDL routines. -*/ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Synchronization functions which can time out return this value - if they time out. -*/ -#define SDL_MUTEX_TIMEDOUT 1 - -/* This is the timeout value which corresponds to never time out */ -#define SDL_MUTEX_MAXWAIT (~(Uint32)0) - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Mutex functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL mutex structure, defined in SDL_mutex.c */ -struct SDL_mutex; -typedef struct SDL_mutex SDL_mutex; - -/* Create a mutex, initialized unlocked */ -extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); - -/* Lock the mutex (Returns 0, or -1 on error) */ -#define SDL_LockMutex(m) SDL_mutexP(m) -extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); - -/* Unlock the mutex (Returns 0, or -1 on error) - It is an error to unlock a mutex that has not been locked by - the current thread, and doing so results in undefined behavior. - */ -#define SDL_UnlockMutex(m) SDL_mutexV(m) -extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); - -/* Destroy a mutex */ -extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Semaphore functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL semaphore structure, defined in SDL_sem.c */ -struct SDL_semaphore; -typedef struct SDL_semaphore SDL_sem; - -/* Create a semaphore, initialized with value, returns NULL on failure. */ -extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); - -/* Destroy a semaphore */ -extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); - -/* This function suspends the calling thread until the semaphore pointed - * to by sem has a positive count. It then atomically decreases the semaphore - * count. - */ -extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); - -/* Non-blocking variant of SDL_SemWait(), returns 0 if the wait succeeds, - SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. -*/ -extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); - -/* Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if - the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in - the allotted time, and -1 on error. - On some platforms this function is implemented by looping with a delay - of 1 ms, and so should be avoided if possible. -*/ -extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); - -/* Atomically increases the semaphore's count (not blocking), returns 0, - or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); - -/* Returns the current count of the semaphore */ -extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Condition variable functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL condition variable structure, defined in SDL_cond.c */ -struct SDL_cond; -typedef struct SDL_cond SDL_cond; - -/* Create a condition variable */ -extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); - -/* Destroy a condition variable */ -extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); - -/* Restart one of the threads that are waiting on the condition variable, - returns 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); - -/* Restart all threads that are waiting on the condition variable, - returns 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); - -/* Wait on the condition variable, unlocking the provided mutex. - The mutex must be locked before entering this function! - The mutex is re-locked once the condition variable is signaled. - Returns 0 when it is signaled, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); - -/* Waits for at most 'ms' milliseconds, and returns 0 if the condition - variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not - signaled in the allotted time, and -1 on error. - On some platforms this function is implemented by looping with a delay - of 1 ms, and so should be avoided if possible. -*/ -extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_mutex_h */ diff --git a/Externals/SDL/Include_1.2/SDL_opengl.h b/Externals/SDL/Include_1.2/SDL_opengl.h deleted file mode 100644 index 36c0a3099e..0000000000 --- a/Externals/SDL/Include_1.2/SDL_opengl.h +++ /dev/null @@ -1,6551 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This is a simple file to encapsulate the OpenGL API headers */ - -#include "SDL_config.h" - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX -#define NOMINMAX /* Don't defined min() and max() */ -#endif -#include -#endif -#ifndef NO_SDL_GLEXT -#define __glext_h_ /* Don't let gl.h include glext.h */ -#endif -#if defined(__MACOSX__) -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#elif defined(__MACOS__) -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#else -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#endif -#ifndef NO_SDL_GLEXT -#undef __glext_h_ -#endif - -/* This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. - It is included here because glext.h is not available on some systems. - If you don't want this version included, simply define "NO_SDL_GLEXT" - */ -#ifndef NO_SDL_GLEXT -#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) -#define __glext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/*************************************************************/ - -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated 2005/06/20 */ -/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ -#define GL_GLEXT_VERSION 29 - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif - -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#endif - -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#endif - -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#endif - -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_env_add -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -#ifndef GL_ARB_window_pos -#endif - -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif - -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif - -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#endif - -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer -#endif - -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif - -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif - -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif - -#ifndef GL_NV_texture_compression_vtc -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif - -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif - -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif - -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif - -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif - -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#endif - -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#endif - -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif - -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif - -#ifndef GL_NV_vertex_program1_1 -#endif - -#ifndef GL_EXT_shadow_funcs -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A -#endif - -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif - -#ifndef GL_NV_float_buffer -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif - -#ifndef GL_NV_fragment_program -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#endif - -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif - -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -#ifndef GL_NV_vertex_program2 -#endif - -#ifndef GL_ATI_map_object_buffer -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#endif - -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif - -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -#ifndef GL_NV_fragment_program_option -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif - -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif - -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif - -#ifndef GL_GREMEDY_string_marker -#endif - - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; /* native character */ -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for handling shader object handles and program/shader text */ -typedef char GLcharARB; /* native character */ -typedef unsigned int GLhandleARB; /* shader object handle */ -#endif - -/* GL types for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -GLAPI void APIENTRY glBlendEquation (GLenum); -GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogram (GLenum); -GLAPI void APIENTRY glResetMinmax (GLenum); -GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum); -GLAPI void APIENTRY glClientActiveTexture (GLenum); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glFogCoordf (GLfloat); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *); -GLAPI void APIENTRY glFogCoordd (GLdouble); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); -GLAPI void APIENTRY glPointParameteri (GLenum, GLint); -GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); -GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos2i (GLint, GLint); -GLAPI void APIENTRY glWindowPos2iv (const GLint *); -GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *); -GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3iv (const GLint *); -GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQuery (GLuint); -GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); -GLAPI void APIENTRY glEndQuery (GLenum); -GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); -GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint); -GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); -GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); -GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); -GLAPI void APIENTRY glAttachShader (GLuint, GLuint); -GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); -GLAPI void APIENTRY glCompileShader (GLuint); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum); -GLAPI void APIENTRY glDeleteProgram (GLuint); -GLAPI void APIENTRY glDeleteShader (GLuint); -GLAPI void APIENTRY glDetachShader (GLuint, GLuint); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); -GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgram (GLuint); -GLAPI GLboolean APIENTRY glIsShader (GLuint); -GLAPI void APIENTRY glLinkProgram (GLuint); -GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); -GLAPI void APIENTRY glUseProgram (GLuint); -GLAPI void APIENTRY glUniform1f (GLint, GLfloat); -GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1i (GLint, GLint); -GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glValidateProgram (GLuint); -GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); -GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); -GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); -GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); -GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); -GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexBlendARB (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); -GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); -GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); -GLAPI void APIENTRY glEndQueryARB (GLenum); -GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); -GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); -GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1iARB (GLint, GLint); -GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogramEXT (GLenum); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint); -GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -GLAPI void APIENTRY glDeformSGIX (GLbitfield); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum); -GLAPI void APIENTRY glTextureLightEXT (GLenum); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); -GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); -GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); -GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *); -GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); -GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); -GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); -GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); -GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFinishFenceNV (GLuint); -GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); -GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); -GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); -GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); -GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); -GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); -GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); -GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); -GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); -GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); -GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); -GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); -GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif -#endif /* NO_SDL_GLEXT */ diff --git a/Externals/SDL/Include_1.2/SDL_platform.h b/Externals/SDL/Include_1.2/SDL_platform.h deleted file mode 100644 index 1bfee29ec0..0000000000 --- a/Externals/SDL/Include_1.2/SDL_platform.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Try to get a standard set of platform defines */ - -#ifndef _SDL_platform_h -#define _SDL_platform_h - -#if defined(_AIX) -#undef __AIX__ -#define __AIX__ 1 -#endif -#if defined(__BEOS__) -#undef __BEOS__ -#define __BEOS__ 1 -#endif -#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) -#undef __BSDI__ -#define __BSDI__ 1 -#endif -#if defined(_arch_dreamcast) -#undef __DREAMCAST__ -#define __DREAMCAST__ 1 -#endif -#if defined(__FreeBSD__) || defined(__DragonFly__) -#undef __FREEBSD__ -#define __FREEBSD__ 1 -#endif -#if defined(hpux) || defined(__hpux) || defined(__hpux__) -#undef __HPUX__ -#define __HPUX__ 1 -#endif -#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) -#undef __IRIX__ -#define __IRIX__ 1 -#endif -#if defined(linux) || defined(__linux) || defined(__linux__) -#undef __LINUX__ -#define __LINUX__ 1 -#endif -#if defined(__APPLE__) -#undef __MACOSX__ -#define __MACOSX__ 1 -#elif defined(macintosh) -#undef __MACOS__ -#define __MACOS__ 1 -#endif -#if defined(__NetBSD__) -#undef __NETBSD__ -#define __NETBSD__ 1 -#endif -#if defined(__OpenBSD__) -#undef __OPENBSD__ -#define __OPENBSD__ 1 -#endif -#if defined(__OS2__) -#undef __OS2__ -#define __OS2__ 1 -#endif -#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) -#undef __OSF__ -#define __OSF__ 1 -#endif -#if defined(__QNXNTO__) -#undef __QNXNTO__ -#define __QNXNTO__ 1 -#endif -#if defined(riscos) || defined(__riscos) || defined(__riscos__) -#undef __RISCOS__ -#define __RISCOS__ 1 -#endif -#if defined(__SVR4) -#undef __SOLARIS__ -#define __SOLARIS__ 1 -#endif -#if defined(WIN32) || defined(_WIN32) -#undef __WIN32__ -#define __WIN32__ 1 -#endif - -#endif /* _SDL_platform_h */ diff --git a/Externals/SDL/Include_1.2/SDL_quit.h b/Externals/SDL/Include_1.2/SDL_quit.h deleted file mode 100644 index fcf40fbdda..0000000000 --- a/Externals/SDL/Include_1.2/SDL_quit.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL quit event handling */ - -#ifndef _SDL_quit_h -#define _SDL_quit_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/* - An SDL_QUITEVENT is generated when the user tries to close the application - window. If it is ignored or filtered out, the window will remain open. - If it is not ignored or filtered, it is queued normally and the window - is allowed to close. When the window is closed, screen updates will - complete, but have no effect. - - SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) - and SIGTERM (system termination request), if handlers do not already - exist, that generate SDL_QUITEVENT events as well. There is no way - to determine the cause of an SDL_QUITEVENT, but setting a signal - handler in your application will override the default generation of - quit events for that signal. -*/ - -/* There are no functions directly affecting the quit event */ -#define SDL_QuitRequested() \ - (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) - -#endif /* _SDL_quit_h */ diff --git a/Externals/SDL/Include_1.2/SDL_rwops.h b/Externals/SDL/Include_1.2/SDL_rwops.h deleted file mode 100644 index 8c177017f5..0000000000 --- a/Externals/SDL/Include_1.2/SDL_rwops.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file provides a general interface for SDL to read and write - data sources. It can easily be extended to files, memory, etc. -*/ - -#ifndef _SDL_rwops_h -#define _SDL_rwops_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* This is the read/write operation structure -- very basic */ - -typedef struct SDL_RWops { - /* Seek to 'offset' relative to whence, one of stdio's whence values: - SEEK_SET, SEEK_CUR, SEEK_END - Returns the final offset in the data source. - */ - int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); - - /* Read up to 'num' objects each of size 'objsize' from the data - source to the area pointed at by 'ptr'. - Returns the number of objects read, or -1 if the read failed. - */ - int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); - - /* Write exactly 'num' objects each of size 'objsize' from the area - pointed at by 'ptr' to data source. - Returns 'num', or -1 if the write failed. - */ - int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); - - /* Close and free an allocated SDL_FSops structure */ - int (SDLCALL *close)(struct SDL_RWops *context); - - Uint32 type; - union { -#if defined(__WIN32__) && !defined(__SYMBIAN32__) - struct { - int append; - void *h; - struct { - void *data; - int size; - int left; - } buffer; - } win32io; -#endif -#ifdef HAVE_STDIO_H - struct { - int autoclose; - FILE *fp; - } stdio; -#endif - struct { - Uint8 *base; - Uint8 *here; - Uint8 *stop; - } mem; - struct { - void *data1; - } unknown; - } hidden; - -} SDL_RWops; - - -/* Functions to create SDL_RWops structures from various data sources */ - -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); - -#ifdef HAVE_STDIO_H -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); -#endif - -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); - -extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); -extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); - -#define RW_SEEK_SET 0 /* Seek from the beginning of data */ -#define RW_SEEK_CUR 1 /* Seek relative to current read point */ -#define RW_SEEK_END 2 /* Seek relative to the end of data */ - -/* Macros to easily read and write from an SDL_RWops structure */ -#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) -#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) -#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) -#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) -#define SDL_RWclose(ctx) (ctx)->close(ctx) - - -/* Read an item of the specified endianness and return in native format */ -extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); -extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); - -/* Write an item of native format to the specified endianness */ -extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); -extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_rwops_h */ diff --git a/Externals/SDL/Include_1.2/SDL_stdinc.h b/Externals/SDL/Include_1.2/SDL_stdinc.h deleted file mode 100644 index e47c21daff..0000000000 --- a/Externals/SDL/Include_1.2/SDL_stdinc.h +++ /dev/null @@ -1,596 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This is a general header that includes C language support */ - -#ifndef _SDL_stdinc_h -#define _SDL_stdinc_h - -#include "SDL_config.h" - - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#if defined(STDC_HEADERS) -# include -# include -# include -#else -# if defined(HAVE_STDLIB_H) -# include -# elif defined(HAVE_MALLOC_H) -# include -# endif -# if defined(HAVE_STDDEF_H) -# include -# endif -# if defined(HAVE_STDARG_H) -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#if defined(HAVE_INTTYPES_H) -# include -#elif defined(HAVE_STDINT_H) -# include -#endif -#ifdef HAVE_CTYPE_H -# include -#endif -#ifdef HAVE_ICONV_H -# include -#endif - -/* The number of elements in an array */ -#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) -#define SDL_TABLESIZE(table) SDL_arraysize(table) - -/* Basic data types */ -typedef enum SDL_bool { - SDL_FALSE = 0, - SDL_TRUE = 1 -} SDL_bool; - -typedef int8_t Sint8; -typedef uint8_t Uint8; -typedef int16_t Sint16; -typedef uint16_t Uint16; -typedef int32_t Sint32; -typedef uint32_t Uint32; - -#ifdef SDL_HAS_64BIT_TYPE -typedef int64_t Sint64; -#ifndef SYMBIAN32_GCCE -typedef uint64_t Uint64; -#endif -#else -/* This is really just a hack to prevent the compiler from complaining */ -typedef struct { - Uint32 hi; - Uint32 lo; -} Uint64, Sint64; -#endif - -/* Make sure the types really have the right sizes */ -#define SDL_COMPILE_TIME_ASSERT(name, x) \ - typedef int SDL_dummy_ ## name[(x) * 2 - 1] - -SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); -SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); -SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); -SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); -SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); -SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); -SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); -SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); - -/* Check to make sure enums are the size of ints, for structure packing. - For both Watcom C/C++ and Borland C/C++ the compiler option that makes - enums having the size of an int must be enabled. - This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). -*/ -/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ -#ifdef __MWERKS__ -#pragma enumsalwaysint on -#endif - -typedef enum { - DUMMY_ENUM_VALUE -} SDL_DUMMY_ENUM; - -#ifndef __NDS__ -SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); -#endif - - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_MALLOC -#define SDL_malloc malloc -#else -extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); -#endif - -#ifdef HAVE_CALLOC -#define SDL_calloc calloc -#else -extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); -#endif - -#ifdef HAVE_REALLOC -#define SDL_realloc realloc -#else -extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); -#endif - -#ifdef HAVE_FREE -#define SDL_free free -#else -extern DECLSPEC void SDLCALL SDL_free(void *mem); -#endif - -#if defined(HAVE_ALLOCA) && !defined(alloca) -# if defined(HAVE_ALLOCA_H) -# include -# elif defined(__GNUC__) -# define alloca __builtin_alloca -# elif defined(_MSC_VER) -# include -# define alloca _alloca -# elif defined(__WATCOMC__) -# include -# elif defined(__BORLANDC__) -# include -# elif defined(__DMC__) -# include -# elif defined(__AIX__) - #pragma alloca -# elif defined(__MRC__) - void *alloca (unsigned); -# else - char *alloca (); -# endif -#endif -#ifdef HAVE_ALLOCA -#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) -#define SDL_stack_free(data) -#else -#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) -#define SDL_stack_free(data) SDL_free(data) -#endif - -#ifdef HAVE_GETENV -#define SDL_getenv getenv -#else -extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); -#endif - -#ifdef HAVE_PUTENV -#define SDL_putenv putenv -#else -extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); -#endif - -#ifdef HAVE_QSORT -#define SDL_qsort qsort -#else -extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, - int (*compare)(const void *, const void *)); -#endif - -#ifdef HAVE_ABS -#define SDL_abs abs -#else -#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) -#endif - -#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) -#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) - -#ifdef HAVE_CTYPE_H -#define SDL_isdigit(X) isdigit(X) -#define SDL_isspace(X) isspace(X) -#define SDL_toupper(X) toupper(X) -#define SDL_tolower(X) tolower(X) -#else -#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) -#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) -#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) -#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) -#endif - -#ifdef HAVE_MEMSET -#define SDL_memset memset -#else -extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); -#endif - -#if defined(__GNUC__) && defined(i386) -#define SDL_memset4(dst, val, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; stosl\n\t" \ - : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ - : "0" (dst), "1" (val), "2" ((Uint32)(len)) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memset4 -#define SDL_memset4(dst, val, len) \ -do { \ - unsigned _count = (len); \ - unsigned _n = (_count + 3) / 4; \ - Uint32 *_p = (Uint32 *)(dst); \ - Uint32 _val = (val); \ - switch (_count % 4) { \ - case 0: do { *_p++ = _val; \ - case 3: *_p++ = _val; \ - case 2: *_p++ = _val; \ - case 1: *_p++ = _val; \ - } while ( --_n ); \ - } \ -} while(0) -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl\n\t" \ - "testb $2,%b4\n\t" \ - "je 1f\n\t" \ - "movsw\n" \ - "1:\ttestb $1,%b4\n\t" \ - "je 2f\n\t" \ - "movsb\n" \ - "2:" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy -#ifdef HAVE_MEMCPY -#define SDL_memcpy memcpy -#elif defined(HAVE_BCOPY) -#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) -#else -extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); -#endif -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy4(dst, src, len) \ -do { \ - int ecx, edi, esi; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl" \ - : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ - : "0" ((unsigned)(len)), "1" (dst), "2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy4 -#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) -#endif - -#if defined(__GNUC__) && defined(i386) -#define SDL_revcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - char *dstp = (char *)(dst); \ - char *srcp = (char *)(src); \ - int n = (len); \ - if ( n >= 4 ) { \ - __asm__ __volatile__ ( \ - "std\n\t" \ - "rep ; movsl\n\t" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" (n >> 2), \ - "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ - : "memory" ); \ - } \ - switch (n & 3) { \ - case 3: dstp[2] = srcp[2]; \ - case 2: dstp[1] = srcp[1]; \ - case 1: dstp[0] = srcp[0]; \ - break; \ - default: \ - break; \ - } \ -} while(0) -#endif -#ifndef SDL_revcpy -extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); -#endif - -#ifdef HAVE_MEMMOVE -#define SDL_memmove memmove -#elif defined(HAVE_BCOPY) -#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) -#else -#define SDL_memmove(dst, src, len) \ -do { \ - if ( dst < src ) { \ - SDL_memcpy(dst, src, len); \ - } else { \ - SDL_revcpy(dst, src, len); \ - } \ -} while(0) -#endif - -#ifdef HAVE_MEMCMP -#define SDL_memcmp memcmp -#else -extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); -#endif - -#ifdef HAVE_STRLEN -#define SDL_strlen strlen -#else -extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); -#endif - -#ifdef HAVE_STRLCPY -#define SDL_strlcpy strlcpy -#else -extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); -#endif - -#ifdef HAVE_STRLCAT -#define SDL_strlcat strlcat -#else -extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); -#endif - -#ifdef HAVE_STRDUP -#define SDL_strdup strdup -#else -extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); -#endif - -#ifdef HAVE__STRREV -#define SDL_strrev _strrev -#else -extern DECLSPEC char * SDLCALL SDL_strrev(char *string); -#endif - -#ifdef HAVE__STRUPR -#define SDL_strupr _strupr -#else -extern DECLSPEC char * SDLCALL SDL_strupr(char *string); -#endif - -#ifdef HAVE__STRLWR -#define SDL_strlwr _strlwr -#else -extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); -#endif - -#ifdef HAVE_STRCHR -#define SDL_strchr strchr -#elif defined(HAVE_INDEX) -#define SDL_strchr index -#else -extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); -#endif - -#ifdef HAVE_STRRCHR -#define SDL_strrchr strrchr -#elif defined(HAVE_RINDEX) -#define SDL_strrchr rindex -#else -extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); -#endif - -#ifdef HAVE_STRSTR -#define SDL_strstr strstr -#else -extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); -#endif - -#ifdef HAVE_ITOA -#define SDL_itoa itoa -#else -#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) -#endif - -#ifdef HAVE__LTOA -#define SDL_ltoa _ltoa -#else -extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); -#endif - -#ifdef HAVE__UITOA -#define SDL_uitoa _uitoa -#else -#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) -#endif - -#ifdef HAVE__ULTOA -#define SDL_ultoa _ultoa -#else -extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); -#endif - -#ifdef HAVE_STRTOL -#define SDL_strtol strtol -#else -extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); -#endif - -#ifdef HAVE_STRTOUL -#define SDL_strtoul strtoul -#else -extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); -#endif - -#ifdef SDL_HAS_64BIT_TYPE - -#ifdef HAVE__I64TOA -#define SDL_lltoa _i64toa -#else -extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); -#endif - -#ifdef HAVE__UI64TOA -#define SDL_ulltoa _ui64toa -#else -extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); -#endif - -#ifdef HAVE_STRTOLL -#define SDL_strtoll strtoll -#else -extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); -#endif - -#ifdef HAVE_STRTOULL -#define SDL_strtoull strtoull -#else -extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); -#endif - -#endif /* SDL_HAS_64BIT_TYPE */ - -#ifdef HAVE_STRTOD -#define SDL_strtod strtod -#else -extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); -#endif - -#ifdef HAVE_ATOI -#define SDL_atoi atoi -#else -#define SDL_atoi(X) SDL_strtol(X, NULL, 0) -#endif - -#ifdef HAVE_ATOF -#define SDL_atof atof -#else -#define SDL_atof(X) SDL_strtod(X, NULL) -#endif - -#ifdef HAVE_STRCMP -#define SDL_strcmp strcmp -#else -extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); -#endif - -#ifdef HAVE_STRNCMP -#define SDL_strncmp strncmp -#else -extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); -#endif - -#ifdef HAVE_STRCASECMP -#define SDL_strcasecmp strcasecmp -#elif defined(HAVE__STRICMP) -#define SDL_strcasecmp _stricmp -#else -extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); -#endif - -#ifdef HAVE_STRNCASECMP -#define SDL_strncasecmp strncasecmp -#elif defined(HAVE__STRNICMP) -#define SDL_strncasecmp _strnicmp -#else -extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); -#endif - -#ifdef HAVE_SSCANF -#define SDL_sscanf sscanf -#else -extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); -#endif - -#ifdef HAVE_SNPRINTF -#define SDL_snprintf snprintf -#else -extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); -#endif - -#ifdef HAVE_VSNPRINTF -#define SDL_vsnprintf vsnprintf -#else -extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); -#endif - -/* The SDL implementation of iconv() returns these error codes */ -#define SDL_ICONV_ERROR (size_t)-1 -#define SDL_ICONV_E2BIG (size_t)-2 -#define SDL_ICONV_EILSEQ (size_t)-3 -#define SDL_ICONV_EINVAL (size_t)-4 - -#ifdef HAVE_ICONV -#define SDL_iconv_t iconv_t -#define SDL_iconv_open iconv_open -#define SDL_iconv_close iconv_close -#else -typedef struct _SDL_iconv_t *SDL_iconv_t; -extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); -extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); -#endif -extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); -/* This function converts a string between encodings in one pass, returning a - string that must be freed with SDL_free() or NULL on error. -*/ -extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); -#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_stdinc_h */ diff --git a/Externals/SDL/Include_1.2/SDL_syswm.h b/Externals/SDL/Include_1.2/SDL_syswm.h deleted file mode 100644 index 010dd1bcc6..0000000000 --- a/Externals/SDL/Include_1.2/SDL_syswm.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Include file for SDL custom system window manager hooks */ - -#ifndef _SDL_syswm_h -#define _SDL_syswm_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Your application has access to a special type of event 'SDL_SYSWMEVENT', - which contains window-manager specific information and arrives whenever - an unhandled window event occurs. This event is ignored by default, but - you can enable it with SDL_EventState() -*/ -#ifdef SDL_PROTOTYPES_ONLY -struct SDL_SysWMinfo; -typedef struct SDL_SysWMinfo SDL_SysWMinfo; -#else - -/* This is the structure for custom window manager events */ -#if defined(SDL_VIDEO_DRIVER_X11) -#if defined(__APPLE__) && defined(__MACH__) -/* conflicts with Quickdraw.h */ -#define Cursor X11Cursor -#endif - -#include -#include - -#if defined(__APPLE__) && defined(__MACH__) -/* matches the re-define above */ -#undef Cursor -#endif - -/* These are the various supported subsystems under UNIX */ -typedef enum { - SDL_SYSWM_X11 -} SDL_SYSWM_TYPE; - -/* The UNIX custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union { - XEvent xevent; - } event; -}; - -/* The UNIX custom window manager information structure. - When this structure is returned, it holds information about which - low level system it is using, and will be one of SDL_SYSWM_TYPE. - */ -typedef struct SDL_SysWMinfo { - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union { - struct { - Display *display; /* The X11 display */ - Window window; /* The X11 display window */ - /* These locking functions should be called around - any X11 functions using the display variable, - but not the gfxdisplay variable. - They lock the event thread, so should not be - called around event functions or from event filters. - */ - void (*lock_func)(void); - void (*unlock_func)(void); - - /* Introduced in SDL 1.0.2 */ - Window fswindow; /* The X11 fullscreen window */ - Window wmwindow; /* The X11 managed input window */ - - /* Introduced in SDL 1.2.12 */ - Display *gfxdisplay; /* The X11 display to which rendering is done */ - } x11; - } info; -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_NANOX) -#include - -/* The generic custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/* The windows custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version ; - GR_WINDOW_ID window ; /* The display window */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) -#define WIN32_LEAN_AND_MEAN -#include - -/* The windows custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - HWND hwnd; /* The window for the message */ - UINT msg; /* The type of message */ - WPARAM wParam; /* WORD message parameter */ - LPARAM lParam; /* LONG message parameter */ -}; - -/* The windows custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - HWND window; /* The Win32 display window */ - HGLRC hglrc; /* The OpenGL context, if any */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_RISCOS) - -/* RISC OS custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int eventCode; /* The window for the message */ - int pollBlock[64]; -}; - -/* The RISC OS custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int wimpVersion; /* Wimp version running under */ - int taskHandle; /* The RISC OS task handle */ - int window; /* The RISC OS display window */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_PHOTON) -#include -#include - -/* The QNX custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/* The QNX custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int data; -} SDL_SysWMinfo; - -#else - -/* The generic custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/* The generic custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int data; -} SDL_SysWMinfo; - -#endif /* video driver type */ - -#endif /* SDL_PROTOTYPES_ONLY */ - -/* Function prototypes */ -/* - * This function gives you custom hooks into the window manager information. - * It fills the structure pointed to by 'info' with custom information and - * returns 1 if the function is implemented. If it's not implemented, or - * the version member of the 'info' structure is invalid, it returns 0. - * - * You typically use this function like this: - * SDL_SysWMInfo info; - * SDL_VERSION(&info.version); - * if ( SDL_GetWMInfo(&info) ) { ... } - */ -extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_syswm_h */ diff --git a/Externals/SDL/Include_1.2/SDL_thread.h b/Externals/SDL/Include_1.2/SDL_thread.h deleted file mode 100644 index 403ee46209..0000000000 --- a/Externals/SDL/Include_1.2/SDL_thread.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_thread_h -#define _SDL_thread_h - -/* Header for the SDL thread management routines - - These are independent of the other SDL routines. -*/ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/* Thread synchronization primitives */ -#include "SDL_mutex.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* The SDL thread structure, defined in SDL_thread.c */ -struct SDL_Thread; -typedef struct SDL_Thread SDL_Thread; - -/* Create a thread */ -#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) -/* - We compile SDL into a DLL on OS/2. This means, that it's the DLL which - creates a new thread for the calling process with the SDL_CreateThread() - API. There is a problem with this, that only the RTL of the SDL.DLL will - be initialized for those threads, and not the RTL of the calling application! - To solve this, we make a little hack here. - We'll always use the caller's _beginthread() and _endthread() APIs to - start a new thread. This way, if it's the SDL.DLL which uses this API, - then the RTL of SDL.DLL will be used to create the new thread, and if it's - the application, then the RTL of the application will be used. - So, in short: - Always use the _beginthread() and _endthread() of the calling runtime library! -*/ -#define SDL_PASSED_BEGINTHREAD_ENDTHREAD -#ifndef _WIN32_WCE -#include /* This has _beginthread() and _endthread() defined! */ -#endif - -#ifdef __OS2__ -typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); -typedef void (*pfnSDL_CurrentEndThread)(void); -#elif __GNUC__ -typedef unsigned long (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned (__stdcall *func)(void *), void *arg, - unsigned, unsigned *threadID); -typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); -#else -typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned (__stdcall *func)(void *), void *arg, - unsigned, unsigned *threadID); -typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); -#endif - -extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); - -#ifdef __OS2__ -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) -#elif defined(_WIN32_WCE) -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) -#else -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) -#endif -#else -extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); -#endif - -/* Get the 32-bit thread identifier for the current thread */ -extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); - -/* Get the 32-bit thread identifier for the specified thread, - equivalent to SDL_ThreadID() if the specified thread is NULL. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); - -/* Wait for a thread to finish. - The return code for the thread function is placed in the area - pointed to by 'status', if 'status' is not NULL. - */ -extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); - -/* Forcefully kill a thread without worrying about its state */ -extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_thread_h */ diff --git a/Externals/SDL/Include_1.2/SDL_timer.h b/Externals/SDL/Include_1.2/SDL_timer.h deleted file mode 100644 index d21159fed2..0000000000 --- a/Externals/SDL/Include_1.2/SDL_timer.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_timer_h -#define _SDL_timer_h - -/* Header for the SDL time management routines */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* This is the OS scheduler timeslice, in milliseconds */ -#define SDL_TIMESLICE 10 - -/* This is the maximum resolution of the SDL timer on all platforms */ -#define TIMER_RESOLUTION 10 /* Experimentally determined */ - -/* Get the number of milliseconds since the SDL library initialization. - * Note that this value wraps if the program runs for more than ~49 days. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); - -/* Wait a specified number of milliseconds before returning */ -extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); - -/* Function prototype for the timer callback function */ -typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); - -/* Set a callback to run after the specified number of milliseconds has - * elapsed. The callback function is passed the current timer interval - * and returns the next timer interval. If the returned value is the - * same as the one passed in, the periodic alarm continues, otherwise a - * new alarm is scheduled. If the callback returns 0, the periodic alarm - * is cancelled. - * - * To cancel a currently running timer, call SDL_SetTimer(0, NULL); - * - * The timer callback function may run in a different thread than your - * main code, and so shouldn't call any functions from within itself. - * - * The maximum resolution of this timer is 10 ms, which means that if - * you request a 16 ms timer, your callback will run approximately 20 ms - * later on an unloaded system. If you wanted to set a flag signaling - * a frame update at 30 frames per second (every 33 ms), you might set a - * timer for 30 ms: - * SDL_SetTimer((33/10)*10, flag_update); - * - * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). - * - * Under UNIX, you should not use raise or use SIGALRM and this function - * in the same program, as it is implemented using setitimer(). You also - * should not use this function in multi-threaded applications as signals - * to multi-threaded apps have undefined behavior in some implementations. - * - * This function returns 0 if successful, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); - -/* New timer API, supports multiple timers - * Written by Stephane Peter - */ - -/* Function prototype for the new timer callback function. - * The callback function is passed the current timer interval and returns - * the next timer interval. If the returned value is the same as the one - * passed in, the periodic alarm continues, otherwise a new alarm is - * scheduled. If the callback returns 0, the periodic alarm is cancelled. - */ -typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); - -/* Definition of the timer ID type */ -typedef struct _SDL_TimerID *SDL_TimerID; - -/* Add a new timer to the pool of timers already running. - Returns a timer ID, or NULL when an error occurs. - */ -extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); - -/* Remove one of the multiple timers knowing its ID. - * Returns a boolean value indicating success. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_timer_h */ diff --git a/Externals/SDL/Include_1.2/SDL_types.h b/Externals/SDL/Include_1.2/SDL_types.h deleted file mode 100644 index 853b9ce454..0000000000 --- a/Externals/SDL/Include_1.2/SDL_types.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* DEPRECATED */ -#include "SDL_stdinc.h" diff --git a/Externals/SDL/Include_1.2/SDL_version.h b/Externals/SDL/Include_1.2/SDL_version.h deleted file mode 100644 index 9ff0fa8a7f..0000000000 --- a/Externals/SDL/Include_1.2/SDL_version.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This header defines the current SDL version */ - -#ifndef _SDL_version_h -#define _SDL_version_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL -*/ -#define SDL_MAJOR_VERSION 1 -#define SDL_MINOR_VERSION 2 -#define SDL_PATCHLEVEL 13 - -typedef struct SDL_version { - Uint8 major; - Uint8 minor; - Uint8 patch; -} SDL_version; - -/* This macro can be used to fill a version structure with the compile-time - * version of the SDL library. - */ -#define SDL_VERSION(X) \ -{ \ - (X)->major = SDL_MAJOR_VERSION; \ - (X)->minor = SDL_MINOR_VERSION; \ - (X)->patch = SDL_PATCHLEVEL; \ -} - -/* This macro turns the version numbers into a numeric value: - (1,2,3) -> (1203) - This assumes that there will never be more than 100 patchlevels -*/ -#define SDL_VERSIONNUM(X, Y, Z) \ - ((X)*1000 + (Y)*100 + (Z)) - -/* This is the version number macro for the current SDL version */ -#define SDL_COMPILEDVERSION \ - SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) - -/* This macro will evaluate to true if compiled with SDL at least X.Y.Z */ -#define SDL_VERSION_ATLEAST(X, Y, Z) \ - (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) - -/* This function gets the version of the dynamically linked SDL library. - it should NOT be used to fill a version structure, instead you should - use the SDL_Version() macro. - */ -extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_version_h */ diff --git a/Externals/SDL/Include_1.2/SDL_video.h b/Externals/SDL/Include_1.2/SDL_video.h deleted file mode 100644 index f6baccee7f..0000000000 --- a/Externals/SDL/Include_1.2/SDL_video.h +++ /dev/null @@ -1,891 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Header file for access to the SDL raw framebuffer window */ - -#ifndef _SDL_video_h -#define _SDL_video_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Transparency definitions: These define alpha as the opacity of a surface */ -#define SDL_ALPHA_OPAQUE 255 -#define SDL_ALPHA_TRANSPARENT 0 - -/* Useful data types */ -typedef struct SDL_Rect { - Sint16 x, y; - Uint16 w, h; -} SDL_Rect; - -typedef struct SDL_Color { - Uint8 r; - Uint8 g; - Uint8 b; - Uint8 unused; -} SDL_Color; -#define SDL_Colour SDL_Color - -typedef struct SDL_Palette { - int ncolors; - SDL_Color *colors; -} SDL_Palette; - -/* Everything in the pixel format structure is read-only */ -typedef struct SDL_PixelFormat { - SDL_Palette *palette; - Uint8 BitsPerPixel; - Uint8 BytesPerPixel; - Uint8 Rloss; - Uint8 Gloss; - Uint8 Bloss; - Uint8 Aloss; - Uint8 Rshift; - Uint8 Gshift; - Uint8 Bshift; - Uint8 Ashift; - Uint32 Rmask; - Uint32 Gmask; - Uint32 Bmask; - Uint32 Amask; - - /* RGB color key information */ - Uint32 colorkey; - /* Alpha value information (per-surface alpha) */ - Uint8 alpha; -} SDL_PixelFormat; - -/* This structure should be treated as read-only, except for 'pixels', - which, if not NULL, contains the raw pixel data for the surface. -*/ -typedef struct SDL_Surface { - Uint32 flags; /* Read-only */ - SDL_PixelFormat *format; /* Read-only */ - int w, h; /* Read-only */ - Uint16 pitch; /* Read-only */ - void *pixels; /* Read-write */ - int offset; /* Private */ - - /* Hardware-specific surface info */ - struct private_hwdata *hwdata; - - /* clipping information */ - SDL_Rect clip_rect; /* Read-only */ - Uint32 unused1; /* for binary compatibility */ - - /* Allow recursive locks */ - Uint32 locked; /* Private */ - - /* info for fast blit mapping to other surfaces */ - struct SDL_BlitMap *map; /* Private */ - - /* format version, bumped at every change to invalidate blit maps */ - unsigned int format_version; /* Private */ - - /* Reference count -- used when freeing surface */ - int refcount; /* Read-mostly */ -} SDL_Surface; - -/* These are the currently supported flags for the SDL_surface */ -/* Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ -#define SDL_SWSURFACE 0x00000000 /* Surface is in system memory */ -#define SDL_HWSURFACE 0x00000001 /* Surface is in video memory */ -#define SDL_ASYNCBLIT 0x00000004 /* Use asynchronous blits if possible */ -/* Available for SDL_SetVideoMode() */ -#define SDL_ANYFORMAT 0x10000000 /* Allow any video depth/pixel-format */ -#define SDL_HWPALETTE 0x20000000 /* Surface has exclusive palette */ -#define SDL_DOUBLEBUF 0x40000000 /* Set up double-buffered video mode */ -#define SDL_FULLSCREEN 0x80000000 /* Surface is a full screen display */ -#define SDL_OPENGL 0x00000002 /* Create an OpenGL rendering context */ -#define SDL_OPENGLBLIT 0x0000000A /* Create an OpenGL rendering context and use it for blitting */ -#define SDL_RESIZABLE 0x00000010 /* This video mode may be resized */ -#define SDL_NOFRAME 0x00000020 /* No window caption or edge frame */ -/* Used internally (read-only) */ -#define SDL_HWACCEL 0x00000100 /* Blit uses hardware acceleration */ -#define SDL_SRCCOLORKEY 0x00001000 /* Blit uses a source color key */ -#define SDL_RLEACCELOK 0x00002000 /* Private flag */ -#define SDL_RLEACCEL 0x00004000 /* Surface is RLE encoded */ -#define SDL_SRCALPHA 0x00010000 /* Blit uses source alpha blending */ -#define SDL_PREALLOC 0x01000000 /* Surface uses preallocated memory */ - -/* Evaluates to true if the surface needs to be locked before access */ -#define SDL_MUSTLOCK(surface) \ - (surface->offset || \ - ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) - -/* typedef for private surface blitting functions */ -typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, - struct SDL_Surface *dst, SDL_Rect *dstrect); - - -/* Useful for determining the video hardware capabilities */ -typedef struct SDL_VideoInfo { - Uint32 hw_available :1; /* Flag: Can you create hardware surfaces? */ - Uint32 wm_available :1; /* Flag: Can you talk to a window manager? */ - Uint32 UnusedBits1 :6; - Uint32 UnusedBits2 :1; - Uint32 blit_hw :1; /* Flag: Accelerated blits HW --> HW */ - Uint32 blit_hw_CC :1; /* Flag: Accelerated blits with Colorkey */ - Uint32 blit_hw_A :1; /* Flag: Accelerated blits with Alpha */ - Uint32 blit_sw :1; /* Flag: Accelerated blits SW --> HW */ - Uint32 blit_sw_CC :1; /* Flag: Accelerated blits with Colorkey */ - Uint32 blit_sw_A :1; /* Flag: Accelerated blits with Alpha */ - Uint32 blit_fill :1; /* Flag: Accelerated color fill */ - Uint32 UnusedBits3 :16; - Uint32 video_mem; /* The total amount of video memory (in K) */ - SDL_PixelFormat *vfmt; /* Value: The format of the video surface */ - int current_w; /* Value: The current video mode width */ - int current_h; /* Value: The current video mode height */ -} SDL_VideoInfo; - - -/* The most common video overlay formats. - For an explanation of these pixel formats, see: - http://www.webartz.com/fourcc/indexyuv.htm - - For information on the relationship between color spaces, see: - http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html - */ -#define SDL_YV12_OVERLAY 0x32315659 /* Planar mode: Y + V + U (3 planes) */ -#define SDL_IYUV_OVERLAY 0x56555949 /* Planar mode: Y + U + V (3 planes) */ -#define SDL_YUY2_OVERLAY 0x32595559 /* Packed mode: Y0+U0+Y1+V0 (1 plane) */ -#define SDL_UYVY_OVERLAY 0x59565955 /* Packed mode: U0+Y0+V0+Y1 (1 plane) */ -#define SDL_YVYU_OVERLAY 0x55595659 /* Packed mode: Y0+V0+Y1+U0 (1 plane) */ - -/* The YUV hardware video overlay */ -typedef struct SDL_Overlay { - Uint32 format; /* Read-only */ - int w, h; /* Read-only */ - int planes; /* Read-only */ - Uint16 *pitches; /* Read-only */ - Uint8 **pixels; /* Read-write */ - - /* Hardware-specific surface info */ - struct private_yuvhwfuncs *hwfuncs; - struct private_yuvhwdata *hwdata; - - /* Special flags */ - Uint32 hw_overlay :1; /* Flag: This overlay hardware accelerated? */ - Uint32 UnusedBits :31; -} SDL_Overlay; - - -/* Public enumeration for setting the OpenGL window attributes. */ -typedef enum { - SDL_GL_RED_SIZE, - SDL_GL_GREEN_SIZE, - SDL_GL_BLUE_SIZE, - SDL_GL_ALPHA_SIZE, - SDL_GL_BUFFER_SIZE, - SDL_GL_DOUBLEBUFFER, - SDL_GL_DEPTH_SIZE, - SDL_GL_STENCIL_SIZE, - SDL_GL_ACCUM_RED_SIZE, - SDL_GL_ACCUM_GREEN_SIZE, - SDL_GL_ACCUM_BLUE_SIZE, - SDL_GL_ACCUM_ALPHA_SIZE, - SDL_GL_STEREO, - SDL_GL_MULTISAMPLEBUFFERS, - SDL_GL_MULTISAMPLESAMPLES, - SDL_GL_ACCELERATED_VISUAL, - SDL_GL_SWAP_CONTROL -} SDL_GLattr; - -/* flags for SDL_SetPalette() */ -#define SDL_LOGPAL 0x01 -#define SDL_PHYSPAL 0x02 - -/* Function prototypes */ - -/* These functions are used internally, and should not be used unless you - * have a specific need to specify the video driver you want to use. - * You should normally use SDL_Init() or SDL_InitSubSystem(). - * - * SDL_VideoInit() initializes the video subsystem -- sets up a connection - * to the window manager, etc, and determines the current video mode and - * pixel format, but does not initialize a window or graphics mode. - * Note that event handling is activated by this routine. - * - * If you use both sound and video in your application, you need to call - * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, - * you won't be able to set full-screen display modes. - */ -extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); -extern DECLSPEC void SDLCALL SDL_VideoQuit(void); - -/* This function fills the given character buffer with the name of the - * video driver, and returns a pointer to it if the video driver has - * been initialized. It returns NULL if no driver has been initialized. - */ -extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); - -/* - * This function returns a pointer to the current display surface. - * If SDL is doing format conversion on the display surface, this - * function returns the publicly visible surface, not the real video - * surface. - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); - -/* - * This function returns a read-only pointer to information about the - * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' - * member of the returned structure will contain the pixel format of the - * "best" video mode. - */ -extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); - -/* - * Check to see if a particular video mode is supported. - * It returns 0 if the requested mode is not supported under any bit depth, - * or returns the bits-per-pixel of the closest available mode with the - * given width and height. If this bits-per-pixel is different from the - * one used when setting the video mode, SDL_SetVideoMode() will succeed, - * but will emulate the requested bits-per-pixel with a shadow surface. - * - * The arguments to SDL_VideoModeOK() are the same ones you would pass to - * SDL_SetVideoMode() - */ -extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); - -/* - * Return a pointer to an array of available screen dimensions for the - * given format and video flags, sorted largest to smallest. Returns - * NULL if there are no dimensions available for a particular format, - * or (SDL_Rect **)-1 if any dimension is okay for the given format. - * - * If 'format' is NULL, the mode list will be for the format given - * by SDL_GetVideoInfo()->vfmt - */ -extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); - -/* - * Set up a video mode with the specified width, height and bits-per-pixel. - * - * If 'bpp' is 0, it is treated as the current display bits per pixel. - * - * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the - * requested bits-per-pixel, but will return whatever video pixel format is - * available. The default is to emulate the requested pixel format if it - * is not natively available. - * - * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in - * video memory, if possible, and you may have to call SDL_LockSurface() - * in order to access the raw framebuffer. Otherwise, the video surface - * will be created in system memory. - * - * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle - * updates asynchronously, but you must always lock before accessing pixels. - * SDL will wait for updates to complete before returning from the lock. - * - * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee - * that the colors set by SDL_SetColors() will be the colors you get. - * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all - * of the colors exactly the way they are requested, and you should look - * at the video surface structure to determine the actual palette. - * If SDL cannot guarantee that the colors you request can be set, - * i.e. if the colormap is shared, then the video surface may be created - * under emulation in system memory, overriding the SDL_HWSURFACE flag. - * - * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set - * a fullscreen video mode. The default is to create a windowed mode - * if the current graphics system has a window manager. - * If the SDL library is able to set a fullscreen video mode, this flag - * will be set in the surface that is returned. - * - * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up - * two surfaces in video memory and swap between them when you call - * SDL_Flip(). This is usually slower than the normal single-buffering - * scheme, but prevents "tearing" artifacts caused by modifying video - * memory while the monitor is refreshing. It should only be used by - * applications that redraw the entire screen on every update. - * - * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the - * window manager, if any, to resize the window at runtime. When this - * occurs, SDL will send a SDL_VIDEORESIZE event to you application, - * and you must respond to the event by re-calling SDL_SetVideoMode() - * with the requested size (or another size that suits the application). - * - * If SDL_NOFRAME is set in 'flags', the SDL library will create a window - * without any title bar or frame decoration. Fullscreen video modes have - * this flag set automatically. - * - * This function returns the video framebuffer surface, or NULL if it fails. - * - * If you rely on functionality provided by certain video flags, check the - * flags of the returned surface to make sure that functionality is available. - * SDL will fall back to reduced functionality if the exact flags you wanted - * are not available. - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode - (int width, int height, int bpp, Uint32 flags); - -/* - * Makes sure the given list of rectangles is updated on the given screen. - * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire - * screen. - * These functions should not be called while 'screen' is locked. - */ -extern DECLSPEC void SDLCALL SDL_UpdateRects - (SDL_Surface *screen, int numrects, SDL_Rect *rects); -extern DECLSPEC void SDLCALL SDL_UpdateRect - (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); - -/* - * On hardware that supports double-buffering, this function sets up a flip - * and returns. The hardware will wait for vertical retrace, and then swap - * video buffers before the next video surface blit or lock will return. - * On hardware that doesn not support double-buffering, this is equivalent - * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); - * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when - * setting the video mode for this function to perform hardware flipping. - * This function returns 0 if successful, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); - -/* - * Set the gamma correction for each of the color channels. - * The gamma values range (approximately) between 0.1 and 10.0 - * - * If this function isn't supported directly by the hardware, it will - * be emulated using gamma ramps, if available. If successful, this - * function returns 0, otherwise it returns -1. - */ -extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); - -/* - * Set the gamma translation table for the red, green, and blue channels - * of the video hardware. Each table is an array of 256 16-bit quantities, - * representing a mapping between the input and output for that channel. - * The input is the index into the array, and the output is the 16-bit - * gamma value at that index, scaled to the output color precision. - * - * You may pass NULL for any of the channels to leave it unchanged. - * If the call succeeds, it will return 0. If the display driver or - * hardware does not support gamma translation, or otherwise fails, - * this function will return -1. - */ -extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); - -/* - * Retrieve the current values of the gamma translation tables. - * - * You must pass in valid pointers to arrays of 256 16-bit quantities. - * Any of the pointers may be NULL to ignore that channel. - * If the call succeeds, it will return 0. If the display driver or - * hardware does not support gamma translation, or otherwise fails, - * this function will return -1. - */ -extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); - -/* - * Sets a portion of the colormap for the given 8-bit surface. If 'surface' - * is not a palettized surface, this function does nothing, returning 0. - * If all of the colors were set as passed to SDL_SetColors(), it will - * return 1. If not all the color entries were set exactly as given, - * it will return 0, and you should look at the surface palette to - * determine the actual color palette. - * - * When 'surface' is the surface associated with the current display, the - * display colormap will be updated with the requested colors. If - * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() - * will always return 1, and the palette is guaranteed to be set the way - * you desire, even if the window colormap has to be warped or run under - * emulation. - */ -extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, - SDL_Color *colors, int firstcolor, int ncolors); - -/* - * Sets a portion of the colormap for a given 8-bit surface. - * 'flags' is one or both of: - * SDL_LOGPAL -- set logical palette, which controls how blits are mapped - * to/from the surface, - * SDL_PHYSPAL -- set physical palette, which controls how pixels look on - * the screen - * Only screens have physical palettes. Separate change of physical/logical - * palettes is only possible if the screen has SDL_HWPALETTE set. - * - * The return value is 1 if all colours could be set as requested, and 0 - * otherwise. - * - * SDL_SetColors() is equivalent to calling this function with - * flags = (SDL_LOGPAL|SDL_PHYSPAL). - */ -extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, - SDL_Color *colors, int firstcolor, - int ncolors); - -/* - * Maps an RGB triple to an opaque pixel value for a given pixel format - */ -extern DECLSPEC Uint32 SDLCALL SDL_MapRGB -(const SDL_PixelFormat * const format, - const Uint8 r, const Uint8 g, const Uint8 b); - -/* - * Maps an RGBA quadruple to a pixel value for a given pixel format - */ -extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA -(const SDL_PixelFormat * const format, - const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); - -/* - * Maps a pixel value into the RGB components for a given pixel format - */ -extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, - Uint8 *r, Uint8 *g, Uint8 *b); - -/* - * Maps a pixel value into the RGBA components for a given pixel format - */ -extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, - Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); - -/* - * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) - * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. - * If the depth is greater than 8 bits, the pixel format is set using the - * flags '[RGB]mask'. - * If the function runs out of memory, it will return NULL. - * - * The 'flags' tell what kind of surface to create. - * SDL_SWSURFACE means that the surface should be created in system memory. - * SDL_HWSURFACE means that the surface should be created in video memory, - * with the same format as the display surface. This is useful for surfaces - * that will not change much, to take advantage of hardware acceleration - * when being blitted to the display surface. - * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with - * this surface, but you must always lock it before accessing the pixels. - * SDL will wait for current blits to finish before returning from the lock. - * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. - * If the hardware supports acceleration of colorkey blits between - * two surfaces in video memory, SDL will try to place the surface in - * video memory. If this isn't possible or if there is no hardware - * acceleration available, the surface will be placed in system memory. - * SDL_SRCALPHA means that the surface will be used for alpha blits and - * if the hardware supports hardware acceleration of alpha blits between - * two surfaces in video memory, to place the surface in video memory - * if possible, otherwise it will be placed in system memory. - * If the surface is created in video memory, blits will be _much_ faster, - * but the surface format must be identical to the video surface format, - * and the only way to access the pixels member of the surface is to use - * the SDL_LockSurface() and SDL_UnlockSurface() calls. - * If the requested surface actually resides in video memory, SDL_HWSURFACE - * will be set in the flags member of the returned surface. If for some - * reason the surface could not be placed in video memory, it will not have - * the SDL_HWSURFACE flag set, and will be created in system memory instead. - */ -#define SDL_AllocSurface SDL_CreateRGBSurface -extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface - (Uint32 flags, int width, int height, int depth, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); -extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, - int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); -extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); - -/* - * SDL_LockSurface() sets up a surface for directly accessing the pixels. - * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write - * to and read from 'surface->pixels', using the pixel format stored in - * 'surface->format'. Once you are done accessing the surface, you should - * use SDL_UnlockSurface() to release it. - * - * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates - * to 0, then you can read and write to the surface at any time, and the - * pixel format of the surface will not change. In particular, if the - * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you - * will not need to lock the display surface before accessing it. - * - * No operating system or library calls should be made between lock/unlock - * pairs, as critical system locks may be held during this time. - * - * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. - */ -extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); -extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); - -/* - * Load a surface from a seekable SDL data source (memory or file.) - * If 'freesrc' is non-zero, the source will be closed after being read. - * Returns the new surface, or NULL if there was an error. - * The new surface should be freed with SDL_FreeSurface(). - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); - -/* Convenience macro -- load a surface from a file */ -#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) - -/* - * Save a surface to a seekable SDL data source (memory or file.) - * If 'freedst' is non-zero, the source will be closed after being written. - * Returns 0 if successful or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SaveBMP_RW - (SDL_Surface *surface, SDL_RWops *dst, int freedst); - -/* Convenience macro -- save a surface to a file */ -#define SDL_SaveBMP(surface, file) \ - SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) - -/* - * Sets the color key (transparent pixel) in a blittable surface. - * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), - * 'key' will be the transparent pixel in the source image of a blit. - * SDL_RLEACCEL requests RLE acceleration for the surface if present, - * and removes RLE acceleration if absent. - * If 'flag' is 0, this function clears any current color key. - * This function returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SetColorKey - (SDL_Surface *surface, Uint32 flag, Uint32 key); - -/* - * This function sets the alpha value for the entire surface, as opposed to - * using the alpha component of each pixel. This value measures the range - * of transparency of the surface, 0 being completely transparent to 255 - * being completely opaque. An 'alpha' value of 255 causes blits to be - * opaque, the source pixels copied to the destination (the default). Note - * that per-surface alpha can be combined with colorkey transparency. - * - * If 'flag' is 0, alpha blending is disabled for the surface. - * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. - * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the - * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. - * - * The 'alpha' parameter is ignored for surfaces that have an alpha channel. - */ -extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); - -/* - * Sets the clipping rectangle for the destination surface in a blit. - * - * If the clip rectangle is NULL, clipping will be disabled. - * If the clip rectangle doesn't intersect the surface, the function will - * return SDL_FALSE and blits will be completely clipped. Otherwise the - * function returns SDL_TRUE and blits to the surface will be clipped to - * the intersection of the surface area and the clipping rectangle. - * - * Note that blits are automatically clipped to the edges of the source - * and destination surfaces. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); - -/* - * Gets the clipping rectangle for the destination surface in a blit. - * 'rect' must be a pointer to a valid rectangle which will be filled - * with the correct values. - */ -extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); - -/* - * Creates a new surface of the specified format, and then copies and maps - * the given surface to it so the blit of the converted surface will be as - * fast as possible. If this function fails, it returns NULL. - * - * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those - * semantics. You can also pass SDL_RLEACCEL in the flags parameter and - * SDL will try to RLE accelerate colorkey and alpha blits in the resulting - * surface. - * - * This function is used internally by SDL_DisplayFormat(). - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface - (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); - -/* - * This performs a fast blit from the source surface to the destination - * surface. It assumes that the source and destination rectangles are - * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire - * surface (src or dst) is copied. The final blit rectangles are saved - * in 'srcrect' and 'dstrect' after all clipping is performed. - * If the blit is successful, it returns 0, otherwise it returns -1. - * - * The blit function should not be called on a locked surface. - * - * The blit semantics for surfaces with and without alpha and colorkey - * are defined as follows: - * - * RGBA->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using alpha-channel). - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy RGB. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value); - * set destination alpha to opaque. - * SDL_SRCALPHA not set: - * copy RGB, set destination alpha to source per-surface alpha value. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * RGBA->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source alpha channel) the RGB values; - * leave destination alpha untouched. [Note: is this correct?] - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy all of RGBA to the destination. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value). - * SDL_SRCALPHA not set: - * copy RGB. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * If either of the surfaces were in video memory, and the blit returns -2, - * the video memory was lost, so it should be reloaded with artwork and - * re-blitted: - while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { - while ( SDL_LockSurface(image) < 0 ) - Sleep(10); - -- Write image pixels to image->pixels -- - SDL_UnlockSurface(image); - } - * This happens under DirectX 5.0 when the system switches away from your - * fullscreen application. The lock will also fail until you have access - * to the video memory again. - */ -/* You should call SDL_BlitSurface() unless you know exactly how SDL - blitting works internally and how to use the other blit functions. -*/ -#define SDL_BlitSurface SDL_UpperBlit - -/* This is the public blit function, SDL_BlitSurface(), and it performs - rectangle validation and clipping before passing it to SDL_LowerBlit() -*/ -extern DECLSPEC int SDLCALL SDL_UpperBlit - (SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); -/* This is a semi-private blit function and it performs low-level surface - blitting only. -*/ -extern DECLSPEC int SDLCALL SDL_LowerBlit - (SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); - -/* - * This function performs a fast fill of the given rectangle with 'color' - * The given rectangle is clipped to the destination surface clip area - * and the final fill rectangle is saved in the passed in pointer. - * If 'dstrect' is NULL, the whole surface will be filled with 'color' - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_FillRect - (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); - -/* - * This function takes a surface and copies it to a new surface of the - * pixel format and colors of the video framebuffer, suitable for fast - * blitting onto the display surface. It calls SDL_ConvertSurface() - * - * If you want to take advantage of hardware colorkey or alpha blit - * acceleration, you should set the colorkey and alpha value before - * calling this function. - * - * If the conversion fails or runs out of memory, it returns NULL - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); - -/* - * This function takes a surface and copies it to a new surface of the - * pixel format and colors of the video framebuffer (if possible), - * suitable for fast alpha blitting onto the display surface. - * The new surface will always have an alpha channel. - * - * If you want to take advantage of hardware colorkey or alpha blit - * acceleration, you should set the colorkey and alpha value before - * calling this function. - * - * If the conversion fails or runs out of memory, it returns NULL - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* YUV video surface overlay functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* This function creates a video output overlay - Calling the returned surface an overlay is something of a misnomer because - the contents of the display surface underneath the area where the overlay - is shown is undefined - it may be overwritten with the converted YUV data. -*/ -extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, - Uint32 format, SDL_Surface *display); - -/* Lock an overlay for direct access, and unlock it when you are done */ -extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); -extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); - -/* Blit a video overlay to the display surface. - The contents of the video surface underneath the blit destination are - not defined. - The width and height of the destination rectangle may be different from - that of the overlay, but currently only 2x scaling is supported. -*/ -extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); - -/* Free a video overlay */ -extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* OpenGL support functions. */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Dynamically load an OpenGL library, or the default one if path is NULL - * - * If you do this, you need to retrieve all of the GL functions used in - * your program from the dynamic library using SDL_GL_GetProcAddress(). - */ -extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); - -/* - * Get the address of a GL function - */ -extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); - -/* - * Set an attribute of the OpenGL subsystem before intialization. - */ -extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); - -/* - * Get an attribute of the OpenGL subsystem from the windowing - * interface, such as glX. This is of course different from getting - * the values from SDL's internal OpenGL subsystem, which only - * stores the values you request before initialization. - * - * Developers should track the values they pass into SDL_GL_SetAttribute - * themselves if they want to retrieve these values. - */ -extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); - -/* - * Swap the OpenGL buffers, if double-buffering is supported. - */ -extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); - -/* - * Internal functions that should not be called unless you have read - * and understood the source code for these functions. - */ -extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); -extern DECLSPEC void SDLCALL SDL_GL_Lock(void); -extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* These functions allow interaction with the window manager, if any. */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Sets/Gets the title and icon text of the display window (UTF-8 encoded) - */ -extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); -extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); - -/* - * Sets the icon for the display window. - * This function must be called before the first call to SDL_SetVideoMode(). - * It takes an icon surface, and a mask in MSB format. - * If 'mask' is NULL, the entire icon surface will be used as the icon. - */ -extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); - -/* - * This function iconifies the window, and returns 1 if it succeeded. - * If the function succeeds, it generates an SDL_APPACTIVE loss event. - * This function is a noop and returns 0 in non-windowed environments. - */ -extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); - -/* - * Toggle fullscreen mode without changing the contents of the screen. - * If the display surface does not require locking before accessing - * the pixel information, then the memory pointers will not change. - * - * If this function was able to toggle fullscreen mode (change from - * running in a window to fullscreen, or vice-versa), it will return 1. - * If it is not implemented, or fails, it returns 0. - * - * The next call to SDL_SetVideoMode() will set the mode fullscreen - * attribute based on the flags parameter - if SDL_FULLSCREEN is not - * set, then the display will be windowed by default where supported. - * - * This is currently only implemented in the X11 video driver. - */ -extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); - -/* - * This function allows you to set and query the input grab state of - * the application. It returns the new input grab state. - */ -typedef enum { - SDL_GRAB_QUERY = -1, - SDL_GRAB_OFF = 0, - SDL_GRAB_ON = 1, - SDL_GRAB_FULLSCREEN /* Used internally */ -} SDL_GrabMode; -/* - * Grabbing means that the mouse is confined to the application window, - * and nearly all keyboard input is passed directly to the application, - * and not interpreted by a window manager, if any. - */ -extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); - -/* Not in public API at the moment - do not use! */ -extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ diff --git a/Externals/SDL/Include_1.2/begin_code.h b/Externals/SDL/Include_1.2/begin_code.h deleted file mode 100644 index d1ddaa6ac2..0000000000 --- a/Externals/SDL/Include_1.2/begin_code.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2004 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file sets things up for C dynamic library function definitions, - static inlined functions, and structures aligned at 4-byte alignment. - If you don't like ugly C preprocessor code, don't look at this file. :) -*/ - -/* This shouldn't be nested -- included it around code only. */ -#ifdef _begin_code_h -#error Nested inclusion of begin_code.h -#endif -#define _begin_code_h - -/* Some compilers use a special export keyword */ -#ifndef DECLSPEC -# if defined(__BEOS__) -# if defined(__GNUC__) -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC __declspec(export) -# endif -# elif defined(__WIN32__) -# ifdef __BORLANDC__ -# ifdef BUILD_SDL -# define DECLSPEC -# else -# define DECLSPEC __declspec(dllimport) -# endif -# else -# define DECLSPEC __declspec(dllexport) -# endif -# elif defined(__OS2__) -# ifdef __WATCOMC__ -# ifdef BUILD_SDL -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC -# endif -# else -# define DECLSPEC -# endif -# else -# if defined(__GNUC__) && __GNUC__ >= 4 -# define DECLSPEC __attribute__ ((visibility("default"))) -# else -# define DECLSPEC -# endif -# endif -#endif - -/* By default SDL uses the C calling convention */ -#ifndef SDLCALL -#if defined(__WIN32__) && !defined(__GNUC__) -#define SDLCALL __cdecl -#else -#ifdef __OS2__ -/* But on OS/2, we use the _System calling convention */ -/* to be compatible with every compiler */ -#define SDLCALL _System -#else -#define SDLCALL -#endif -#endif -#endif /* SDLCALL */ - -#ifdef __SYMBIAN32__ -#ifndef EKA2 -#undef DECLSPEC -#define DECLSPEC -#elif !defined(__WINS__) -#undef DECLSPEC -#define DECLSPEC __declspec(dllexport) -#endif /* !EKA2 */ -#endif /* __SYMBIAN32__ */ - -/* Force structure packing at 4 byte alignment. - This is necessary if the header is included in code which has structure - packing set to an alternate value, say for loading structures from disk. - The packing is reset to the previous value in close_code.h - */ -#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) -#ifdef _MSC_VER -#pragma warning(disable: 4103) -#endif -#ifdef __BORLANDC__ -#pragma nopackwarning -#endif -#pragma pack(push,4) -#elif (defined(__MWERKS__) && defined(__MACOS__)) -#pragma options align=mac68k4byte -#pragma enumsalwaysint on -#endif /* Compiler needs structure packing set */ - -/* Set up compiler-specific options for inlining functions */ -#ifndef SDL_INLINE_OKAY -#ifdef __GNUC__ -#define SDL_INLINE_OKAY -#else -/* Add any special compiler-specific cases here */ -#if defined(_MSC_VER) || defined(__BORLANDC__) || \ - defined(__DMC__) || defined(__SC__) || \ - defined(__WATCOMC__) || defined(__LCC__) || \ - defined(__DECC) || defined(__EABI__) -#ifndef __inline__ -#define __inline__ __inline -#endif -#define SDL_INLINE_OKAY -#else -#if !defined(__MRC__) && !defined(_SGI_SOURCE) -#ifndef __inline__ -#define __inline__ inline -#endif -#define SDL_INLINE_OKAY -#endif /* Not a funky compiler */ -#endif /* Visual C++ */ -#endif /* GNU C */ -#endif /* SDL_INLINE_OKAY */ - -/* If inlining isn't supported, remove "__inline__", turning static - inlined functions into static functions (resulting in code bloat - in all files which include the offending header files) -*/ -#ifndef SDL_INLINE_OKAY -#define __inline__ -#endif - -/* Apparently this is needed by several Windows compilers */ -#if !defined(__MACH__) -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif /* NULL */ -#endif /* ! Mac OS X - breaks precompiled headers */ diff --git a/Externals/SDL/Include_1.2/close_code.h b/Externals/SDL/Include_1.2/close_code.h deleted file mode 100644 index afbb65047c..0000000000 --- a/Externals/SDL/Include_1.2/close_code.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2004 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file reverses the effects of begin_code.h and should be included - after you finish any function and structure declarations in your headers -*/ - -#undef _begin_code_h - -/* Reset structure packing at previous byte alignment */ -#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) -#ifdef __BORLANDC__ -#pragma nopackwarning -#endif -#if (defined(__MWERKS__) && defined(__MACOS__)) -#pragma options align=reset -#pragma enumsalwaysint reset -#else -#pragma pack(pop) -#endif -#endif /* Compiler needs structure packing set */ - diff --git a/Externals/SDL/Include_1.3/SDL.h b/Externals/SDL/Include_1.3/SDL.h deleted file mode 100644 index f1078304de..0000000000 --- a/Externals/SDL/Include_1.3/SDL.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL.h - * - * Main include header for the SDL library - */ -/** - * \mainpage Simple DirectMedia Layer (SDL) - -http://www.libsdl.org/ - -* \section intro_sec Introduction - -This is the Simple DirectMedia Layer, a general API that provides low -level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, -and 2D framebuffer across multiple platforms. - -The current version supports Linux, Windows, Windows CE, BeOS, MacOS, -Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. -The code contains support for Dreamcast, Atari, AIX, OSF/Tru64, -RISC OS, SymbianOS, and OS/2, but these are not officially supported. - -SDL is written in C, but works with C++ natively, and has bindings to -several other languages, including Ada, C#, Eiffel, Erlang, Euphoria, -Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, -Pike, Pliant, Python, Ruby, and Smalltalk. - -This library is distributed under GNU LGPL version 2, which can be -found in the file "COPYING". This license allows you to use SDL -freely in commercial programs as long as you link with the dynamic -library. - -The best way to learn how to use SDL is to check out the header files in -the "include" subdirectory and the programs in the "test" subdirectory. -The header files and test programs are well commented and always up to date. -More documentation is available in HTML format in "docs/index.html", and -a documentation wiki is available online at: - http://www.libsdl.org/cgi/docwiki.cgi - -The test programs in the "test" subdirectory are in the public domain. - -Frequently asked questions are answered online: - http://www.libsdl.org/faq.php - -If you need help with the library, or just want to discuss SDL related -issues, you can join the developers mailing list: - http://www.libsdl.org/mailing-list.php - -Enjoy! - Sam Lantinga (slouken@libsdl.org) - */ - -#ifndef _SDL_H -#define _SDL_H - -#include "SDL_main.h" -#include "SDL_stdinc.h" -#include "SDL_audio.h" -#include "SDL_cdrom.h" -#include "SDL_cpuinfo.h" -#include "SDL_endian.h" -#include "SDL_error.h" -#include "SDL_events.h" -#include "SDL_loadso.h" -#include "SDL_mutex.h" -#include "SDL_rwops.h" -#include "SDL_thread.h" -#include "SDL_timer.h" -#include "SDL_video.h" -#include "SDL_version.h" -#include "SDL_compat.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* As of version 0.5, SDL is loaded dynamically into the application */ - -/* These are the flags which may be passed to SDL_Init() -- you should - specify the subsystems which you will be using in your application. -*/ -#define SDL_INIT_TIMER 0x00000001 -#define SDL_INIT_AUDIO 0x00000010 -#define SDL_INIT_VIDEO 0x00000020 -#define SDL_INIT_CDROM 0x00000100 -#define SDL_INIT_JOYSTICK 0x00000200 -#define SDL_INIT_HAPTIC 0x00001000 -#define SDL_INIT_NOPARACHUTE 0x00100000 /* Don't catch fatal signals */ -#define SDL_INIT_EVENTTHREAD 0x01000000 /* Not supported on all OS's */ -#define SDL_INIT_EVERYTHING 0x0000FFFF - -/* This function loads the SDL dynamically linked library and initializes - * the subsystems specified by 'flags' (and those satisfying dependencies) - * Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup - * signal handlers for some commonly ignored fatal signals (like SIGSEGV) - */ -extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); - -/* This function initializes specific SDL subsystems */ -extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); - -/* This function cleans up specific SDL subsystems */ -extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); - -/* This function returns mask of the specified subsystems which have - been initialized. - If 'flags' is 0, it returns a mask of all initialized subsystems. -*/ -extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); - -/* This function cleans up all initialized subsystems and unloads the - * dynamically linked library. You should call it upon all exit conditions. - */ -extern DECLSPEC void SDLCALL SDL_Quit(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_H */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_audio.h b/Externals/SDL/Include_1.3/SDL_audio.h deleted file mode 100644 index eeac3f5774..0000000000 --- a/Externals/SDL/Include_1.3/SDL_audio.h +++ /dev/null @@ -1,423 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_audio.h - * - * Access to the raw audio mixing buffer for the SDL library - */ - -#ifndef _SDL_audio_h -#define _SDL_audio_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_endian.h" -#include "SDL_mutex.h" -#include "SDL_thread.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -typedef Uint16 SDL_AudioFormat; - -/* The calculated values in this structure are calculated by SDL_OpenAudio() */ -typedef struct SDL_AudioSpec -{ - int freq; /* DSP frequency -- samples per second */ - SDL_AudioFormat format; /* Audio data format */ - Uint8 channels; /* Number of channels: 1 mono, 2 stereo */ - Uint8 silence; /* Audio buffer silence value (calculated) */ - Uint16 samples; /* Audio buffer size in samples (power of 2) */ - Uint16 padding; /* Necessary for some compile environments */ - Uint32 size; /* Audio buffer size in bytes (calculated) */ - /* This function is called when the audio device needs more data. - 'stream' is a pointer to the audio data buffer - 'len' is the length of that buffer in bytes. - Once the callback returns, the buffer will no longer be valid. - Stereo samples are stored in a LRLRLR ordering. - */ - void (SDLCALL * callback) (void *userdata, Uint8 * stream, int len); - void *userdata; -} SDL_AudioSpec; - - -/* - These are what the 16 bits in SDL_AudioFormat currently mean... - (Unspecified bits are always zero.) - - ++-----------------------sample is signed if set - || - || ++-----------sample is bigendian if set - || || - || || ++---sample is float if set - || || || - || || || +---sample bit size---+ - || || || | | - 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 - - There are macros in SDL 1.3 and later to query these bits. -*/ - -#define SDL_AUDIO_MASK_BITSIZE (0xFF) -#define SDL_AUDIO_MASK_DATATYPE (1<<8) -#define SDL_AUDIO_MASK_ENDIAN (1<<12) -#define SDL_AUDIO_MASK_SIGNED (1<<15) -#define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE) -#define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE) -#define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN) -#define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED) -#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) -#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) -#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) - -/* Audio format flags (defaults to LSB byte order) */ -#define AUDIO_U8 0x0008 /* Unsigned 8-bit samples */ -#define AUDIO_S8 0x8008 /* Signed 8-bit samples */ -#define AUDIO_U16LSB 0x0010 /* Unsigned 16-bit samples */ -#define AUDIO_S16LSB 0x8010 /* Signed 16-bit samples */ -#define AUDIO_U16MSB 0x1010 /* As above, but big-endian byte order */ -#define AUDIO_S16MSB 0x9010 /* As above, but big-endian byte order */ -#define AUDIO_U16 AUDIO_U16LSB -#define AUDIO_S16 AUDIO_S16LSB - -/* int32 support new to SDL 1.3 */ -#define AUDIO_S32LSB 0x8020 /* 32-bit integer samples */ -#define AUDIO_S32MSB 0x9020 /* As above, but big-endian byte order */ -#define AUDIO_S32 AUDIO_S32LSB - -/* float32 support new to SDL 1.3 */ -#define AUDIO_F32LSB 0x8120 /* 32-bit floating point samples */ -#define AUDIO_F32MSB 0x9120 /* As above, but big-endian byte order */ -#define AUDIO_F32 AUDIO_F32LSB - -/* Native audio byte ordering */ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define AUDIO_U16SYS AUDIO_U16LSB -#define AUDIO_S16SYS AUDIO_S16LSB -#define AUDIO_S32SYS AUDIO_S32LSB -#define AUDIO_F32SYS AUDIO_F32LSB -#else -#define AUDIO_U16SYS AUDIO_U16MSB -#define AUDIO_S16SYS AUDIO_S16MSB -#define AUDIO_S32SYS AUDIO_S32MSB -#define AUDIO_F32SYS AUDIO_F32MSB -#endif - -/* Which audio format changes are allowed when opening a device */ -#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001 -#define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002 -#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004 -#define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE) - -/* A structure to hold a set of audio conversion filters and buffers */ -struct SDL_AudioCVT; -typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt, - SDL_AudioFormat format); - -typedef struct SDL_AudioCVT -{ - int needed; /* Set to 1 if conversion possible */ - SDL_AudioFormat src_format; /* Source audio format */ - SDL_AudioFormat dst_format; /* Target audio format */ - double rate_incr; /* Rate conversion increment */ - Uint8 *buf; /* Buffer to hold entire audio data */ - int len; /* Length of original audio buffer */ - int len_cvt; /* Length of converted audio buffer */ - int len_mult; /* buffer must be len*len_mult big */ - double len_ratio; /* Given len, final size is len*len_ratio */ - SDL_AudioFilter filters[10]; /* Filter list */ - int filter_index; /* Current audio conversion function */ -} SDL_AudioCVT; - - -/* Function prototypes */ - -/* These functions return the list of built in audio drivers, in the - * order that they are normally initialized by default. - */ -extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); -extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index); - -/* These functions are used internally, and should not be used unless you - * have a specific need to specify the audio driver you want to use. - * You should normally use SDL_Init() or SDL_InitSubSystem(). - */ -extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); -extern DECLSPEC void SDLCALL SDL_AudioQuit(void); - -/* This function returns the name of the current audio driver, or NULL - * if no driver has been initialized. - */ -extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); - -/* - * This function opens the audio device with the desired parameters, and - * returns 0 if successful, placing the actual hardware parameters in the - * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio - * data passed to the callback function will be guaranteed to be in the - * requested format, and will be automatically converted to the hardware - * audio format if necessary. This function returns -1 if it failed - * to open the audio device, or couldn't set up the audio thread. - * - * When filling in the desired audio spec structure, - * 'desired->freq' should be the desired audio frequency in samples-per-second. - * 'desired->format' should be the desired audio format. - * 'desired->samples' is the desired size of the audio buffer, in samples. - * This number should be a power of two, and may be adjusted by the audio - * driver to a value more suitable for the hardware. Good values seem to - * range between 512 and 8096 inclusive, depending on the application and - * CPU speed. Smaller values yield faster response time, but can lead - * to underflow if the application is doing heavy processing and cannot - * fill the audio buffer in time. A stereo sample consists of both right - * and left channels in LR ordering. - * Note that the number of samples is directly related to time by the - * following formula: ms = (samples*1000)/freq - * 'desired->size' is the size in bytes of the audio buffer, and is - * calculated by SDL_OpenAudio(). - * 'desired->silence' is the value used to set the buffer to silence, - * and is calculated by SDL_OpenAudio(). - * 'desired->callback' should be set to a function that will be called - * when the audio device is ready for more data. It is passed a pointer - * to the audio buffer, and the length in bytes of the audio buffer. - * This function usually runs in a separate thread, and so you should - * protect data structures that it accesses by calling SDL_LockAudio() - * and SDL_UnlockAudio() in your code. - * 'desired->userdata' is passed as the first parameter to your callback - * function. - * - * The audio device starts out playing silence when it's opened, and should - * be enabled for playing by calling SDL_PauseAudio(0) when you are ready - * for your audio callback function to be called. Since the audio driver - * may modify the requested size of the audio buffer, you should allocate - * any local mixing buffers after you open the audio device. - */ -extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, - SDL_AudioSpec * obtained); - -/* - * SDL Audio Device IDs. - * A successful call to SDL_OpenAudio() is always device id 1, and legacy - * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls - * always returns devices >= 2 on success. The legacy calls are good both - * for backwards compatibility and when you don't care about multiple, - * specific, or capture devices. - */ -typedef Uint32 SDL_AudioDeviceID; - -/* - * Get the number of available devices exposed by the current driver. - * Only valid after a successfully initializing the audio subsystem. - * Returns -1 if an explicit list of devices can't be determined; this is - * not an error. For example, if SDL is set up to talk to a remote audio - * server, it can't list every one available on the Internet, but it will - * still allow a specific host to be specified to SDL_OpenAudioDevice(). - * In many common cases, when this function returns a value <= 0, it can still - * successfully open the default device (NULL for first argument of - * SDL_OpenAudioDevice()). - */ -extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); - -/* - * Get the human-readable name of a specific audio device. - * Must be a value between 0 and (number of audio devices-1). - * Only valid after a successfully initializing the audio subsystem. - * The values returned by this function reflect the latest call to - * SDL_GetNumAudioDevices(); recall that function to redetect available - * hardware. - * - * The string returned by this function is UTF-8 encoded, read-only, and - * managed internally. You are not to free it. If you need to keep the - * string for any length of time, you should make your own copy of it, as it - * will be invalid next time any of several other SDL functions is called. - */ -extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, - int iscapture); - - -/* - * Open a specific audio device. Passing in a device name of NULL requests - * the most reasonable default (and is equivalent to calling SDL_OpenAudio()). - * The device name is a UTF-8 string reported by SDL_GetAudioDevice(), but - * some drivers allow arbitrary and driver-specific strings, such as a - * hostname/IP address for a remote audio server, or a filename in the - * diskaudio driver. - * Returns 0 on error, a valid device ID that is >= 2 on success. - * SDL_OpenAudio(), unlike this function, always acts on device ID 1. - */ -extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char - *device, - int iscapture, - const - SDL_AudioSpec * - desired, - SDL_AudioSpec * - obtained, - int - allowed_changes); - - - -/* - * Get the current audio state: - */ -typedef enum -{ - SDL_AUDIO_STOPPED = 0, - SDL_AUDIO_PLAYING, - SDL_AUDIO_PAUSED -} SDL_audiostatus; -extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); - -extern DECLSPEC SDL_audiostatus SDLCALL -SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev); - -/* - * This function pauses and unpauses the audio callback processing. - * It should be called with a parameter of 0 after opening the audio - * device to start playing sound. This is so you can safely initialize - * data for your callback function after opening the audio device. - * Silence will be written to the audio device during the pause. - */ -extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); -extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev, - int pause_on); - -/* - * This function loads a WAVE from the data source, automatically freeing - * that source if 'freesrc' is non-zero. For example, to load a WAVE file, - * you could do: - * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); - * - * If this function succeeds, it returns the given SDL_AudioSpec, - * filled with the audio data format of the wave data, and sets - * 'audio_buf' to a malloc()'d buffer containing the audio data, - * and sets 'audio_len' to the length of that audio buffer, in bytes. - * You need to free the audio buffer with SDL_FreeWAV() when you are - * done with it. - * - * This function returns NULL and sets the SDL error message if the - * wave file cannot be opened, uses an unknown data format, or is - * corrupt. Currently raw and MS-ADPCM WAVE files are supported. - */ -extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, - int freesrc, - SDL_AudioSpec * spec, - Uint8 ** audio_buf, - Uint32 * audio_len); - -/* Compatibility convenience function -- loads a WAV from a file */ -#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ - SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) - -/* - * This function frees data previously allocated with SDL_LoadWAV_RW() - */ -extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); - -/* - * This function takes a source format and rate and a destination format - * and rate, and initializes the 'cvt' structure with information needed - * by SDL_ConvertAudio() to convert a buffer of audio data from one format - * to the other. - * Returns -1 if the format conversion is not supported, 0 if there's - * no conversion needed, or 1 if the audio filter is set up. - */ -extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, - SDL_AudioFormat src_format, - Uint8 src_channels, - int src_rate, - SDL_AudioFormat dst_format, - Uint8 dst_channels, - int dst_rate); - -/* Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), - * created an audio buffer cvt->buf, and filled it with cvt->len bytes of - * audio data in the source format, this function will convert it in-place - * to the desired format. - * The data conversion may expand the size of the audio data, so the buffer - * cvt->buf should be allocated after the cvt structure is initialized by - * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. - */ -extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); - -/* - * This takes two audio buffers of the playing audio format and mixes - * them, performing addition, volume adjustment, and overflow clipping. - * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME - * for full audio volume. Note this does not change hardware volume. - * This is provided for convenience -- you can mix your own audio data. - */ -#define SDL_MIX_MAXVOLUME 128 -extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, - Uint32 len, int volume); - -/* - * This works like SDL_MixAudio, but you specify the audio format instead of - * using the format of audio device 1. Thus it can be used when no audio - * device is open at all. - */ -extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, - const Uint8 * src, - SDL_AudioFormat format, - Uint32 len, int volume); - -/* - * The lock manipulated by these functions protects the callback function. - * During a LockAudio/UnlockAudio pair, you can be guaranteed that the - * callback function is not running. Do not call these from the callback - * function or you will cause deadlock. - */ -extern DECLSPEC void SDLCALL SDL_LockAudio(void); -extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev); -extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); -extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev); - -/* - * This function shuts down audio processing and closes the audio device. - */ -extern DECLSPEC void SDLCALL SDL_CloseAudio(void); -extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); - -/* - * Returns 1 if audio device is still functioning, zero if not, -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_AudioDeviceConnected(SDL_AudioDeviceID dev); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_audio_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_cdrom.h b/Externals/SDL/Include_1.3/SDL_cdrom.h deleted file mode 100644 index f90dfda7c9..0000000000 --- a/Externals/SDL/Include_1.3/SDL_cdrom.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_cdrom.h - * - * This is the CD-audio control API for Simple DirectMedia Layer - */ - -#ifndef _SDL_cdrom_h -#define _SDL_cdrom_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* In order to use these functions, SDL_Init() must have been called - with the SDL_INIT_CDROM flag. This causes SDL to scan the system - for CD-ROM drives, and load appropriate drivers. -*/ - -/* The maximum number of CD-ROM tracks on a disk */ -#define SDL_MAX_TRACKS 99 - -/* The types of CD-ROM track possible */ -#define SDL_AUDIO_TRACK 0x00 -#define SDL_DATA_TRACK 0x04 - -/* The possible states which a CD-ROM drive can be in. */ -typedef enum -{ - CD_TRAYEMPTY, - CD_STOPPED, - CD_PLAYING, - CD_PAUSED, - CD_ERROR = -1 -} CDstatus; - -/* Given a status, returns true if there's a disk in the drive */ -#define CD_INDRIVE(status) ((int)(status) > 0) - -typedef struct SDL_CDtrack -{ - Uint8 id; /* Track number */ - Uint8 type; /* Data or audio track */ - Uint16 unused; - Uint32 length; /* Length, in frames, of this track */ - Uint32 offset; /* Offset, in frames, from start of disk */ -} SDL_CDtrack; - -/* This structure is only current as of the last call to SDL_CDStatus() */ -typedef struct SDL_CD -{ - int id; /* Private drive identifier */ - CDstatus status; /* Current drive status */ - - /* The rest of this structure is only valid if there's a CD in drive */ - int numtracks; /* Number of tracks on disk */ - int cur_track; /* Current track position */ - int cur_frame; /* Current frame offset within current track */ - SDL_CDtrack track[SDL_MAX_TRACKS + 1]; -} SDL_CD; - -/* Conversion functions from frames to Minute/Second/Frames and vice versa */ -#define CD_FPS 75 -#define FRAMES_TO_MSF(f, M,S,F) { \ - int value = f; \ - *(F) = value%CD_FPS; \ - value /= CD_FPS; \ - *(S) = value%60; \ - value /= 60; \ - *(M) = value; \ -} -#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) - -/* CD-audio API functions: */ - -/* Returns the number of CD-ROM drives on the system, or -1 if - SDL_Init() has not been called with the SDL_INIT_CDROM flag. - */ -extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); - -/* Returns a human-readable, system-dependent identifier for the CD-ROM. - Example: - "/dev/cdrom" - "E:" - "/dev/disk/ide/1/master" -*/ -extern DECLSPEC const char *SDLCALL SDL_CDName(int drive); - -/* Opens a CD-ROM drive for access. It returns a drive handle on success, - or NULL if the drive was invalid or busy. This newly opened CD-ROM - becomes the default CD used when other CD functions are passed a NULL - CD-ROM handle. - Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. -*/ -extern DECLSPEC SDL_CD *SDLCALL SDL_CDOpen(int drive); - -/* This function returns the current status of the given drive. - If the drive has a CD in it, the table of contents of the CD and current - play position of the CD will be stored in the SDL_CD structure. -*/ -extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD * cdrom); - -/* Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' - tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play - until the end of the CD. This function will skip data tracks. - This function should only be called after calling SDL_CDStatus() to - get track information about the CD. - For example: - // Play entire CD: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); - // Play last track: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { - SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); - } - // Play first and second track and 10 seconds of third track: - if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); - - This function returns 0, or -1 if there was an error. -*/ -extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD * cdrom, - int start_track, - int start_frame, int ntracks, - int nframes); - -/* Play the given CD starting at 'start' frame for 'length' frames. - It returns 0, or -1 if there was an error. -*/ -extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD * cdrom, int start, int length); - -/* Pause play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD * cdrom); - -/* Resume play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD * cdrom); - -/* Stop play -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD * cdrom); - -/* Eject CD-ROM -- returns 0, or -1 on error */ -extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD * cdrom); - -/* Closes the handle for the CD-ROM drive */ -extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD * cdrom); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_compat.h b/Externals/SDL/Include_1.3/SDL_compat.h deleted file mode 100644 index 109dfb374e..0000000000 --- a/Externals/SDL/Include_1.3/SDL_compat.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file contains functions for backwards compatibility with SDL 1.2 */ - -#ifndef _SDL_compat_h -#define _SDL_compat_h - -#include "SDL_video.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -#define SDL_SWSURFACE 0x00000000 /* Not used */ -#define SDL_SRCALPHA 0x00010000 -#define SDL_SRCCOLORKEY 0x00020000 -#define SDL_ANYFORMAT 0x00100000 -#define SDL_HWPALETTE 0x00200000 -#define SDL_DOUBLEBUF 0x00400000 -#define SDL_FULLSCREEN 0x00800000 -#define SDL_RESIZABLE 0x01000000 -#define SDL_NOFRAME 0x02000000 -#define SDL_OPENGL 0x04000000 -#define SDL_HWSURFACE 0x08000001 /* Not used */ -#define SDL_ASYNCBLIT 0x08000000 /* Not used */ -#define SDL_RLEACCELOK 0x08000000 /* Not used */ -#define SDL_HWACCEL 0x08000000 /* Not used */ - -#define SDL_APPMOUSEFOCUS 0x01 -#define SDL_APPINPUTFOCUS 0x02 -#define SDL_APPACTIVE 0x04 - -#define SDL_LOGPAL 0x01 -#define SDL_PHYSPAL 0x02 - -#define SDL_ACTIVEEVENT SDL_EVENT_RESERVED1 -#define SDL_VIDEORESIZE SDL_EVENT_RESERVED2 -#define SDL_VIDEOEXPOSE SDL_EVENT_RESERVED3 -#define SDL_ACTIVEEVENTMASK SDL_EVENTMASK(SDL_ACTIVEEVENT) -#define SDL_VIDEORESIZEMASK SDL_EVENTMASK(SDL_VIDEORESIZE) -#define SDL_VIDEOEXPOSEMASK SDL_EVENTMASK(SDL_VIDEOEXPOSE) - -#define SDL_BUTTON_WHEELUP 4 -#define SDL_BUTTON_WHEELDOWN 5 - -#define SDL_DEFAULT_REPEAT_DELAY 500 -#define SDL_DEFAULT_REPEAT_INTERVAL 30 - -typedef struct SDL_VideoInfo -{ - Uint32 hw_available:1; - Uint32 wm_available:1; - Uint32 UnusedBits1:6; - Uint32 UnusedBits2:1; - Uint32 blit_hw:1; - Uint32 blit_hw_CC:1; - Uint32 blit_hw_A:1; - Uint32 blit_sw:1; - Uint32 blit_sw_CC:1; - Uint32 blit_sw_A:1; - Uint32 blit_fill:1; - Uint32 UnusedBits3:16; - Uint32 video_mem; - - SDL_PixelFormat *vfmt; - - int current_w; - int current_h; -} SDL_VideoInfo; - -/* The most common video overlay formats. - For an explanation of these pixel formats, see: - http://www.webartz.com/fourcc/indexyuv.htm - - For information on the relationship between color spaces, see: - http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html - */ -#define SDL_YV12_OVERLAY 0x32315659 /* Planar mode: Y + V + U (3 planes) */ -#define SDL_IYUV_OVERLAY 0x56555949 /* Planar mode: Y + U + V (3 planes) */ -#define SDL_YUY2_OVERLAY 0x32595559 /* Packed mode: Y0+U0+Y1+V0 (1 plane) */ -#define SDL_UYVY_OVERLAY 0x59565955 /* Packed mode: U0+Y0+V0+Y1 (1 plane) */ -#define SDL_YVYU_OVERLAY 0x55595659 /* Packed mode: Y0+V0+Y1+U0 (1 plane) */ - -/* The YUV hardware video overlay */ -typedef struct SDL_Overlay -{ - Uint32 format; /* Read-only */ - int w, h; /* Read-only */ - int planes; /* Read-only */ - Uint16 *pitches; /* Read-only */ - Uint8 **pixels; /* Read-write */ - - /* Hardware-specific surface info */ - struct private_yuvhwfuncs *hwfuncs; - struct private_yuvhwdata *hwdata; - - /* Special flags */ - Uint32 hw_overlay:1; /* Flag: This overlay hardware accelerated? */ - Uint32 UnusedBits:31; -} SDL_Overlay; - -typedef enum -{ - SDL_GRAB_QUERY = -1, - SDL_GRAB_OFF = 0, - SDL_GRAB_ON = 1 -} SDL_GrabMode; - -struct SDL_SysWMinfo; - -/* Obsolete or renamed key codes */ - -/* These key constants were renamed for clarity or consistency. */ -#define SDLK_0 '0' -#define SDLK_1 '1' -#define SDLK_2 '2' -#define SDLK_3 '3' -#define SDLK_4 '4' -#define SDLK_5 '5' -#define SDLK_6 '6' -#define SDLK_7 '7' -#define SDLK_8 '8' -#define SDLK_9 '9' -#define SDLK_a 'a' -#define SDLK_b 'b' -#define SDLK_c 'c' -#define SDLK_d 'd' -#define SDLK_e 'e' -#define SDLK_f 'f' -#define SDLK_g 'g' -#define SDLK_h 'h' -#define SDLK_i 'i' -#define SDLK_j 'j' -#define SDLK_k 'k' -#define SDLK_l 'l' -#define SDLK_m 'm' -#define SDLK_n 'n' -#define SDLK_o 'o' -#define SDLK_p 'p' -#define SDLK_q 'q' -#define SDLK_r 'r' -#define SDLK_s 's' -#define SDLK_t 't' -#define SDLK_u 'u' -#define SDLK_v 'v' -#define SDLK_w 'w' -#define SDLK_x 'x' -#define SDLK_y 'y' -#define SDLK_z 'z' -#define SDLK_QUOTE '\'' -#define SDLK_MINUS '-' -#define SDLK_BACKQUOTE '`' -#define SDLK_EXCLAIM '!' -#define SDLK_QUOTEDBL '"' -#define SDLK_HASH '#' -#define SDLK_DOLLAR '$' -#define SDLK_AMPERSAND '&' -#define SDLK_LEFTPAREN '(' -#define SDLK_RIGHTPAREN ')' -#define SDLK_ASTERISK '*' -#define SDLK_PLUS '+' -#define SDLK_COLON ':' -#define SDLK_LESS '<' -#define SDLK_GREATER '>' -#define SDLK_QUESTION '?' -#define SDLK_AT '@' -#define SDLK_CARET '^' -#define SDLK_UNDERSCORE '_' -#define SDLK_KP0 SDLK_KP_0 -#define SDLK_KP1 SDLK_KP_1 -#define SDLK_KP2 SDLK_KP_2 -#define SDLK_KP3 SDLK_KP_3 -#define SDLK_KP4 SDLK_KP_4 -#define SDLK_KP5 SDLK_KP_5 -#define SDLK_KP6 SDLK_KP_6 -#define SDLK_KP7 SDLK_KP_7 -#define SDLK_KP8 SDLK_KP_8 -#define SDLK_KP9 SDLK_KP_9 -#define SDLK_NUMLOCK SDLK_NUMLOCKCLEAR -#define SDLK_SCROLLOCK SDLK_SCROLLLOCK -#define SDLK_PRINT SDLK_PRINTSCREEN - -/* The META modifier is equivalent to the GUI modifier from the USB standard */ -#define KMOD_LMETA KMOD_LGUI -#define KMOD_RMETA KMOD_RGUI -#define KMOD_META KMOD_GUI - -/* These keys don't appear in the USB specification (or at least not under those names). I'm unsure if the following assignments make sense or if these codes should be defined as actual additional SDLK_ constants. */ -#define SDLK_LSUPER SDLK_LMETA -#define SDLK_RSUPER SDLK_RMETA -#define SDLK_COMPOSE SDLK_APPLICATION -#define SDLK_BREAK SDLK_STOP -#define SDLK_EURO SDLK_2 - - -#define SDL_SetModuleHandle(x) -#define SDL_AllocSurface SDL_CreateRGBSurface - -extern DECLSPEC const SDL_version *SDLCALL SDL_Linked_Version(void); -extern DECLSPEC char *SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); -extern DECLSPEC char *SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); -extern DECLSPEC const SDL_VideoInfo *SDLCALL SDL_GetVideoInfo(void); -extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, - int height, - int bpp, Uint32 flags); -extern DECLSPEC SDL_Rect **SDLCALL SDL_ListModes(const SDL_PixelFormat * - format, Uint32 flags); -extern DECLSPEC SDL_Surface *SDLCALL SDL_SetVideoMode(int width, int height, - int bpp, Uint32 flags); -extern DECLSPEC SDL_Surface *SDLCALL SDL_GetVideoSurface(void); -extern DECLSPEC void SDLCALL SDL_UpdateRects(SDL_Surface * screen, - int numrects, SDL_Rect * rects); -extern DECLSPEC void SDLCALL SDL_UpdateRect(SDL_Surface * screen, - Sint32 x, - Sint32 y, Uint32 w, Uint32 h); -extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface * screen); -extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface * surface, - Uint32 flag, Uint8 alpha); -extern DECLSPEC SDL_Surface *SDLCALL SDL_DisplayFormat(SDL_Surface * surface); -extern DECLSPEC SDL_Surface *SDLCALL SDL_DisplayFormatAlpha(SDL_Surface * - surface); -extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, - const char *icon); -extern DECLSPEC void SDLCALL SDL_WM_GetCaption(const char **title, - const char **icon); -extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask); -extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); -extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface * surface); -extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); -extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface * surface, - int flags, - const SDL_Color * colors, - int firstcolor, int ncolors); -extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface * surface, - const SDL_Color * colors, - int firstcolor, int ncolors); -extern DECLSPEC int SDLCALL SDL_GetWMInfo(struct SDL_SysWMinfo *info); -extern DECLSPEC Uint8 SDLCALL SDL_GetAppState(void); -extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); -extern DECLSPEC SDL_Overlay *SDLCALL SDL_CreateYUVOverlay(int width, - int height, - Uint32 format, - SDL_Surface * - display); -extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay * overlay); -extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay * overlay); -extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay * overlay, - SDL_Rect * dstrect); -extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay * overlay); -extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); -extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); -extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); -extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_compat_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_config.h b/Externals/SDL/Include_1.3/SDL_config.h deleted file mode 100644 index d72d7e585e..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -#include "SDL_platform.h" - -/* Add any platform that doesn't build using the configure system */ -#if defined(__NINTENDODS__) -#include "SDL_config_nintendods.h" -#elif defined(__DREAMCAST__) -#include "SDL_config_dreamcast.h" -#elif defined(__IPHONEOS__) -#include "SDL_config_iphoneos.h" -#elif defined(__MACOSX__) -#include "SDL_config_macosx.h" -#elif defined(__WIN32__) -#include "SDL_config_win32.h" -#elif defined(__OS2__) -#include "SDL_config_os2.h" -#else -#include "SDL_config_minimal.h" -#endif /* platform config */ - -#endif /* _SDL_config_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config.h.default b/Externals/SDL/Include_1.3/SDL_config.h.default deleted file mode 100644 index d72d7e585e..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config.h.default +++ /dev/null @@ -1,45 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -#include "SDL_platform.h" - -/* Add any platform that doesn't build using the configure system */ -#if defined(__NINTENDODS__) -#include "SDL_config_nintendods.h" -#elif defined(__DREAMCAST__) -#include "SDL_config_dreamcast.h" -#elif defined(__IPHONEOS__) -#include "SDL_config_iphoneos.h" -#elif defined(__MACOSX__) -#include "SDL_config_macosx.h" -#elif defined(__WIN32__) -#include "SDL_config_win32.h" -#elif defined(__OS2__) -#include "SDL_config_os2.h" -#else -#include "SDL_config_minimal.h" -#endif /* platform config */ - -#endif /* _SDL_config_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config.h.in b/Externals/SDL/Include_1.3/SDL_config.h.in deleted file mode 100644 index 88a1f11c8c..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config.h.in +++ /dev/null @@ -1,327 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -/* This is a set of defines to configure the SDL features */ - -/* General platform specific identifiers */ -#include "SDL_platform.h" - -/* Make sure that this isn't included by Visual C++ */ -#ifdef _MSC_VER -#error You should copy include/SDL_config.h.default to include/SDL_config.h -#endif - -/* C language features */ -#undef const -#undef inline -#undef volatile - -/* C datatypes */ -#undef size_t -#undef int8_t -#undef uint8_t -#undef int16_t -#undef uint16_t -#undef int32_t -#undef uint32_t -#undef int64_t -#undef uint64_t -#undef uintptr_t -#undef SDL_HAS_64BIT_TYPE - -/* Endianness */ -#undef SDL_BYTEORDER - -/* Comment this if you want to build without any C library requirements */ -#undef HAVE_LIBC -#if HAVE_LIBC - -/* Useful headers */ -#undef HAVE_ALLOCA_H -#undef HAVE_SYS_TYPES_H -#undef HAVE_STDIO_H -#undef STDC_HEADERS -#undef HAVE_STDLIB_H -#undef HAVE_STDARG_H -#undef HAVE_MALLOC_H -#undef HAVE_MEMORY_H -#undef HAVE_STRING_H -#undef HAVE_STRINGS_H -#undef HAVE_INTTYPES_H -#undef HAVE_STDINT_H -#undef HAVE_CTYPE_H -#undef HAVE_MATH_H -#undef HAVE_ICONV_H -#undef HAVE_SIGNAL_H -#undef HAVE_ALTIVEC_H - -/* C library functions */ -#undef HAVE_MALLOC -#undef HAVE_CALLOC -#undef HAVE_REALLOC -#undef HAVE_FREE -#undef HAVE_ALLOCA -#ifndef _WIN32 /* Don't use C runtime versions of these on Windows */ -#undef HAVE_GETENV -#undef HAVE_PUTENV -#undef HAVE_UNSETENV -#endif -#undef HAVE_QSORT -#undef HAVE_ABS -#undef HAVE_BCOPY -#undef HAVE_MEMSET -#undef HAVE_MEMCPY -#undef HAVE_MEMMOVE -#undef HAVE_MEMCMP -#undef HAVE_STRLEN -#undef HAVE_STRLCPY -#undef HAVE_STRLCAT -#undef HAVE_STRDUP -#undef HAVE__STRREV -#undef HAVE__STRUPR -#undef HAVE__STRLWR -#undef HAVE_INDEX -#undef HAVE_RINDEX -#undef HAVE_STRCHR -#undef HAVE_STRRCHR -#undef HAVE_STRSTR -#undef HAVE_ITOA -#undef HAVE__LTOA -#undef HAVE__UITOA -#undef HAVE__ULTOA -#undef HAVE_STRTOL -#undef HAVE_STRTOUL -#undef HAVE__I64TOA -#undef HAVE__UI64TOA -#undef HAVE_STRTOLL -#undef HAVE_STRTOULL -#undef HAVE_STRTOD -#undef HAVE_ATOI -#undef HAVE_ATOF -#undef HAVE_STRCMP -#undef HAVE_STRNCMP -#undef HAVE__STRICMP -#undef HAVE_STRCASECMP -#undef HAVE__STRNICMP -#undef HAVE_STRNCASECMP -#undef HAVE_SSCANF -#undef HAVE_SNPRINTF -#undef HAVE_VSNPRINTF -#undef HAVE_M_PI -#undef HAVE_CEIL -#undef HAVE_COPYSIGN -#undef HAVE_COS -#undef HAVE_COSF -#undef HAVE_FABS -#undef HAVE_FLOOR -#undef HAVE_LOG -#undef HAVE_POW -#undef HAVE_SCALBN -#undef HAVE_SIN -#undef HAVE_SINF -#undef HAVE_SQRT -#undef HAVE_SIGACTION -#undef HAVE_SETJMP -#undef HAVE_NANOSLEEP -#undef HAVE_CLOCK_GETTIME -#undef HAVE_DLVSYM -#undef HAVE_GETPAGESIZE - -#else -/* We may need some replacement for stdarg.h here */ -#include -#endif /* HAVE_LIBC */ - -/* Allow disabling of core subsystems */ -#undef SDL_AUDIO_DISABLED -#undef SDL_CDROM_DISABLED -#undef SDL_CPUINFO_DISABLED -#undef SDL_EVENTS_DISABLED -#undef SDL_FILE_DISABLED -#undef SDL_JOYSTICK_DISABLED -#undef SDL_HAPTIC_DISABLED -#undef SDL_LOADSO_DISABLED -#undef SDL_THREADS_DISABLED -#undef SDL_TIMERS_DISABLED -#undef SDL_VIDEO_DISABLED - -/* Enable various audio drivers */ -#undef SDL_AUDIO_DRIVER_ALSA -#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC -#undef SDL_AUDIO_DRIVER_ARTS -#undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC -#undef SDL_AUDIO_DRIVER_PULSEAUDIO -#undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC -#undef SDL_AUDIO_DRIVER_BEOSAUDIO -#undef SDL_AUDIO_DRIVER_BSD -#undef SDL_AUDIO_DRIVER_COREAUDIO -#undef SDL_AUDIO_DRIVER_DART -#undef SDL_AUDIO_DRIVER_DC -#undef SDL_AUDIO_DRIVER_DISK -#undef SDL_AUDIO_DRIVER_DUMMY -#undef SDL_AUDIO_DRIVER_DMEDIA -#undef SDL_AUDIO_DRIVER_DSOUND -#undef SDL_AUDIO_DRIVER_ESD -#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC -#undef SDL_AUDIO_DRIVER_MINT -#undef SDL_AUDIO_DRIVER_MMEAUDIO -#undef SDL_AUDIO_DRIVER_NAS -#undef SDL_AUDIO_DRIVER_NAS_DYNAMIC -#undef SDL_AUDIO_DRIVER_NDS -#undef SDL_AUDIO_DRIVER_OSS -#undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H -#undef SDL_AUDIO_DRIVER_PAUDIO -#undef SDL_AUDIO_DRIVER_QNXNTO -#undef SDL_AUDIO_DRIVER_SNDMGR -#undef SDL_AUDIO_DRIVER_SUNAUDIO -#undef SDL_AUDIO_DRIVER_WINWAVEOUT -#undef SDL_AUDIO_DRIVER_FUSIONSOUND -#undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC - -/* Enable various cdrom drivers */ -#undef SDL_CDROM_AIX -#undef SDL_CDROM_BEOS -#undef SDL_CDROM_BSDI -#undef SDL_CDROM_DC -#undef SDL_CDROM_DUMMY -#undef SDL_CDROM_FREEBSD -#undef SDL_CDROM_LINUX -#undef SDL_CDROM_MACOSX -#undef SDL_CDROM_MINT -#undef SDL_CDROM_OPENBSD -#undef SDL_CDROM_OS2 -#undef SDL_CDROM_OSF -#undef SDL_CDROM_QNX -#undef SDL_CDROM_WIN32 - -/* Enable various input drivers */ -#undef SDL_INPUT_LINUXEV -#undef SDL_INPUT_TSLIB -#undef SDL_JOYSTICK_BEOS -#undef SDL_JOYSTICK_DC -#undef SDL_JOYSTICK_DINPUT -#undef SDL_JOYSTICK_DUMMY -#undef SDL_JOYSTICK_IOKIT -#undef SDL_JOYSTICK_LINUX -#undef SDL_JOYSTICK_MINT -#undef SDL_JOYSTICK_NDS -#undef SDL_JOYSTICK_OS2 -#undef SDL_JOYSTICK_RISCOS -#undef SDL_JOYSTICK_WINMM -#undef SDL_JOYSTICK_USBHID -#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H -#undef SDL_HAPTIC_DUMMY -#undef SDL_HAPTIC_LINUX -#undef SDL_HAPTIC_IOKIT -#undef SDL_HAPTIC_DINPUT - -/* Enable various shared object loading systems */ -#undef SDL_LOADSO_BEOS -#undef SDL_LOADSO_DLCOMPAT -#undef SDL_LOADSO_DLOPEN -#undef SDL_LOADSO_DUMMY -#undef SDL_LOADSO_LDG -#undef SDL_LOADSO_OS2 -#undef SDL_LOADSO_WIN32 - -/* Enable various threading systems */ -#undef SDL_THREAD_BEOS -#undef SDL_THREAD_DC -#undef SDL_THREAD_NDS -#undef SDL_THREAD_OS2 -#undef SDL_THREAD_PTH -#undef SDL_THREAD_PTHREAD -#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX -#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP -#undef SDL_THREAD_SPROC -#undef SDL_THREAD_WIN32 - -/* Enable various timer systems */ -#undef SDL_TIMER_BEOS -#undef SDL_TIMER_DC -#undef SDL_TIMER_DUMMY -#undef SDL_TIMER_MINT -#undef SDL_TIMER_NDS -#undef SDL_TIMER_OS2 -#undef SDL_TIMER_RISCOS -#undef SDL_TIMER_UNIX -#undef SDL_TIMER_WIN32 -#undef SDL_TIMER_WINCE - -/* Enable various video drivers */ -#undef SDL_VIDEO_DRIVER_BWINDOW -#undef SDL_VIDEO_DRIVER_COCOA -#undef SDL_VIDEO_DRIVER_DC -#undef SDL_VIDEO_DRIVER_DIRECTFB -#undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC -#undef SDL_VIDEO_DRIVER_DUMMY -#undef SDL_VIDEO_DRIVER_FBCON -#undef SDL_VIDEO_DRIVER_GAPI -#undef SDL_VIDEO_DRIVER_GEM -#undef SDL_VIDEO_DRIVER_IPOD -#undef SDL_VIDEO_DRIVER_NANOX -#undef SDL_VIDEO_DRIVER_NDS -#undef SDL_VIDEO_DRIVER_OS2FS -#undef SDL_VIDEO_DRIVER_PHOTON -#undef SDL_VIDEO_DRIVER_PS2GS -#undef SDL_VIDEO_DRIVER_RISCOS -#undef SDL_VIDEO_DRIVER_SVGALIB -#undef SDL_VIDEO_DRIVER_VGL -#undef SDL_VIDEO_DRIVER_WIN32 -#undef SDL_VIDEO_DRIVER_WSCONS -#undef SDL_VIDEO_DRIVER_X11 -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT -#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS -#undef SDL_VIDEO_DRIVER_X11_VIDMODE -#undef SDL_VIDEO_DRIVER_X11_XINERAMA -#undef SDL_VIDEO_DRIVER_X11_XRANDR -#undef SDL_VIDEO_DRIVER_X11_XINPUT -#undef SDL_VIDEO_DRIVER_X11_SCRNSAVER -#undef SDL_VIDEO_DRIVER_X11_XV -#undef SDL_VIDEO_DRIVER_XBIOS - -#undef SDL_VIDEO_RENDER_D3D -#undef SDL_VIDEO_RENDER_GDI -#undef SDL_VIDEO_RENDER_OGL -#undef SDL_VIDEO_RENDER_X11 - -/* Enable OpenGL support */ -#undef SDL_VIDEO_OPENGL -#undef SDL_VIDEO_OPENGL_BGL -#undef SDL_VIDEO_OPENGL_CGL -#undef SDL_VIDEO_OPENGL_GLX -#undef SDL_VIDEO_OPENGL_WGL -#undef SDL_VIDEO_OPENGL_OSMESA -#undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC - -/* Enable assembly routines */ -#undef SDL_ASSEMBLY_ROUTINES -#undef SDL_ALTIVEC_BLITTERS - -#endif /* _SDL_config_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_dreamcast.h b/Externals/SDL/Include_1.3/SDL_config_dreamcast.h deleted file mode 100644 index 5b8175c8a7..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_dreamcast.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_dreamcast_h -#define _SDL_config_dreamcast_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; -typedef unsigned long uintptr_t; -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_CTYPE_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRDUP 1 -#define HAVE_INDEX 1 -#define HAVE_RINDEX 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_DC 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_DC 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_DC 1 -#define SDL_HAPTIC_DUMMY 1 - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_DUMMY 1 - -/* Enable various threading systems */ -#define SDL_THREAD_DC 1 - -/* Enable various timer systems */ -#define SDL_TIMER_DC 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DC 1 -#define SDL_VIDEO_DRIVER_DUMMY 1 - -#endif /* _SDL_config_dreamcast_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_iphoneos.h b/Externals/SDL/Include_1.3/SDL_config_iphoneos.h deleted file mode 100644 index 928976ac93..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_iphoneos.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_iphoneos_h -#define _SDL_config_iphoneos_h - -#include "SDL_platform.h" - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef unsigned long uintptr_t; -#define SDL_HAS_64BIT_TYPE 1 - -#define HAVE_ALLOCA_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOULL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SIGACTION 1 -#define HAVE_SETJMP 1 -#define HAVE_NANOSLEEP 1 - -/* enable iPhone version of Core Audio driver */ -#define SDL_AUDIO_DRIVER_COREAUDIOIPHONE 1 -/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ -#define SDL_CDROM_DISABLED 1 - -/* Enable the stub haptic driver (src/haptic/dummy/\*.c) */ -#define SDL_HAPTIC_DISABLED 1 - -/* Enable Unix style SO loading */ -/* Technically this works, but it violates the iPhone developer agreement */ -/* #define SDL_LOADSO_DLOPEN 1 */ - -/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ -#define SDL_LOADSO_DISABLED 1 - -/* Enable various threading systems */ -#define SDL_THREAD_PTHREAD 1 -#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 - -/* Enable various timer systems */ -#define SDL_TIMER_UNIX 1 - -/* Supported video drivers */ -#define SDL_VIDEO_DRIVER_UIKIT 1 -#define SDL_VIDEO_DRIVER_DUMMY 1 - -/* enable OpenGL ES */ -#define SDL_VIDEO_OPENGL_ES 1 -#define SDL_VIDEO_RENDER_OGL_ES 1 - -/* enable iPhone keyboard support */ -#define SDL_IPHONE_KEYBOARD 1 - -/* Enable emulation of multiple mice through multi-touch */ -#define SDL_IPHONE_MULTIPLE_MICE 1 - -/* Set max recognized G-force from acceleromter - See src/joystick/uikit/SDLUIAccelerationDelegate.m for notes on why this is needed - */ -#define SDL_IPHONE_MAX_GFORCE 5.0 - -#endif /* _SDL_config_iphoneos_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_macosx.h b/Externals/SDL/Include_1.3/SDL_config_macosx.h deleted file mode 100644 index c23274e15e..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_macosx.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_macosx_h -#define _SDL_config_macosx_h - -#include "SDL_platform.h" - -/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ -#include - -/* This is a set of defines to configure the SDL features */ - -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -/* If we specified an SDK or have a post-PowerPC chip, then alloca.h exists. */ -#if ( (MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) || (!defined(__POWERPC__)) ) -#define HAVE_ALLOCA_H 1 -#endif -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOULL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SIGACTION 1 -#define HAVE_SETJMP 1 -#define HAVE_NANOSLEEP 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_COREAUDIO 1 -#define SDL_AUDIO_DRIVER_SNDMGR 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_MACOSX 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_IOKIT 1 -#define SDL_HAPTIC_IOKIT 1 - -/* Enable various shared object loading systems */ -#ifdef __ppc__ -/* For Mac OS X 10.2 compatibility */ -#define SDL_LOADSO_DLCOMPAT 1 -#else -#define SDL_LOADSO_DLOPEN 1 -#endif - -/* Enable various threading systems */ -#define SDL_THREAD_PTHREAD 1 -#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 - -/* Enable various timer systems */ -#define SDL_TIMER_UNIX 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_COCOA 1 -#define SDL_VIDEO_DRIVER_DUMMY 1 - -/* Enable OpenGL support */ -#define SDL_VIDEO_OPENGL 1 -#define SDL_VIDEO_OPENGL_CGL 1 -#define SDL_VIDEO_RENDER_OGL 1 - -/* Enable assembly routines */ -#define SDL_ASSEMBLY_ROUTINES 1 -#ifdef __ppc__ -#define SDL_ALTIVEC_BLITTERS 1 -#endif - -#endif /* _SDL_config_macosx_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_minimal.h b/Externals/SDL/Include_1.3/SDL_config_minimal.h deleted file mode 100644 index 1a85667484..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_minimal.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_minimal_h -#define _SDL_config_minimal_h - -#include "SDL_platform.h" - -/* This is the minimal configuration that can be used to build SDL */ - -#include - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef unsigned int size_t; -typedef unsigned long uintptr_t; - -/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable the stub cdrom driver (src/cdrom/dummy/\*.c) */ -#define SDL_CDROM_DISABLED 1 - -/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ -#define SDL_JOYSTICK_DISABLED 1 - -/* Enable the stub haptic driver (src/haptic/dummy/\*.c) */ -#define SDL_HAPTIC_DISABLED 1 - -/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ -#define SDL_LOADSO_DISABLED 1 - -/* Enable the stub thread support (src/thread/generic/\*.c) */ -#define SDL_THREADS_DISABLED 1 - -/* Enable the stub timer support (src/timer/dummy/\*.c) */ -#define SDL_TIMERS_DISABLED 1 - -/* Enable the dummy video driver (src/video/dummy/\*.c) */ -#define SDL_VIDEO_DRIVER_DUMMY 1 - -#endif /* _SDL_config_minimal_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_nintendods.h b/Externals/SDL/Include_1.3/SDL_config_nintendods.h deleted file mode 100644 index 043ad08efa..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_nintendods.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_nintendods_h -#define _SDL_config_nintendods_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; - -/* LiF: __PTRDIFF_TYPE__ was causing errors of conflicting typedefs with the - shipping with devkitARM. copied a similar ifdef from it. */ -#ifndef __PTRDIFF_TYPE__ -typedef unsigned long uintptr_t; -#else -typedef unsigned __PTRDIFF_TYPE__ uintptr_t; -#endif - - -#define SDL_HAS_64BIT_TYPE 1 - -/* Useful headers */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STRING_H 1 -#define HAVE_CTYPE_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRDUP 1 -#define HAVE_INDEX 1 -#define HAVE_RINDEX 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 - -/* DS isn't that sophisticated */ -#define LACKS_SYS_MMAN_H 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_NDS 1 -/*#define SDL_AUDIO_DRIVER_DUMMY 1 TODO: uncomment this later*/ - -/* DS doesn't have optical media */ -#define SDL_CDROM_DISABLED 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_NDS 1 -/*#define SDL_JOYSTICK_DUMMY 1 TODO: uncomment this later*/ - -/* DS has no dynamic linking afaik */ -#define SDL_LOADSO_DISABLED 1 - -/* Enable various threading systems */ -/*#define SDL_THREAD_NDS 1*/ -#define SDL_THREADS_DISABLED 1 - -/* Enable various timer systems */ -#define SDL_TIMER_NDS 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_NDS 1 -/*#define SDL_VIDEO_DRIVER_DUMMY 1 TODO: uncomment this later*/ - -#endif /* _SDL_config_nintendods_h */ diff --git a/Externals/SDL/Include_1.3/SDL_config_os2.h b/Externals/SDL/Include_1.3/SDL_config_os2.h deleted file mode 100644 index b80c85a13a..0000000000 --- a/Externals/SDL/Include_1.3/SDL_config_os2.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_os2_h -#define _SDL_config_os2_h - -#include "SDL_platform.h" - -/* This is a set of defines to configure the SDL features */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef unsigned int size_t; -typedef unsigned long uintptr_t; -typedef signed long long int64_t; -typedef unsigned long long uint64_t; - -#define SDL_HAS_64BIT_TYPE 1 - -/* Use Watcom's LIBC */ -#define HAVE_LIBC 1 - -/* Useful headers */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STDARG_H 1 -#define HAVE_MALLOC_H 1 -#define HAVE_MEMORY_H 1 -#define HAVE_STRING_H 1 -#define HAVE_STRINGS_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -#define HAVE_SIGNAL_H 1 - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -#define HAVE_ALLOCA 1 -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -#define HAVE_UNSETENV 1 -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -#define HAVE_BCOPY 1 -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMCMP 1 -#define HAVE_STRLEN 1 -#define HAVE_STRLCPY 1 -#define HAVE_STRLCAT 1 -#define HAVE_STRDUP 1 -#define HAVE__STRREV 1 -#define HAVE__STRUPR 1 -#define HAVE__STRLWR 1 -#define HAVE_INDEX 1 -#define HAVE_RINDEX 1 -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_ITOA 1 -#define HAVE__LTOA 1 -#define HAVE__UITOA 1 -#define HAVE__ULTOA 1 -#define HAVE_STRTOL 1 -#define HAVE__I64TOA 1 -#define HAVE__UI64TOA 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOD 1 -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_SETJMP 1 -#define HAVE_CLOCK_GETTIME 1 - -/* Enable various audio drivers */ -#define SDL_AUDIO_DRIVER_DART 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#define SDL_CDROM_OS2 1 - -/* Enable various input drivers */ -#define SDL_JOYSTICK_OS2 1 -#define SDL_HAPTIC_DUMMY 1 - -/* Enable various shared object loading systems */ -#define SDL_LOADSO_OS2 1 - -/* Enable various threading systems */ -#define SDL_THREAD_OS2 1 - -/* Enable various timer systems */ -#define SDL_TIMER_OS2 1 - -/* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -#define SDL_VIDEO_DRIVER_OS2FS 1 - -/* Enable OpenGL support */ -/* Nothing here yet for OS/2... :( */ - -/* Enable assembly routines where available */ -#define SDL_ASSEMBLY_ROUTINES 1 - -#endif /* _SDL_config_os2_h */ diff --git a/Externals/SDL/Include_1.3/SDL_copying.h b/Externals/SDL/Include_1.3/SDL_copying.h deleted file mode 100644 index 419598f7e3..0000000000 --- a/Externals/SDL/Include_1.3/SDL_copying.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ diff --git a/Externals/SDL/Include_1.3/SDL_cpuinfo.h b/Externals/SDL/Include_1.3/SDL_cpuinfo.h deleted file mode 100644 index fe4193eba9..0000000000 --- a/Externals/SDL/Include_1.3/SDL_cpuinfo.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_cpuinfo.h - * - * CPU feature detection for SDL - */ - -#ifndef _SDL_cpuinfo_h -#define _SDL_cpuinfo_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* This function returns true if the CPU has the RDTSC instruction - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); - -/* This function returns true if the CPU has MMX features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); - -/* This function returns true if the CPU has MMX Ext. features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); - -/* This function returns true if the CPU has 3DNow features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); - -/* This function returns true if the CPU has 3DNow! Ext. features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); - -/* This function returns true if the CPU has SSE features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); - -/* This function returns true if the CPU has SSE2 features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); - -/* This function returns true if the CPU has AltiVec features - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_cpuinfo_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_error.h b/Externals/SDL/Include_1.3/SDL_error.h deleted file mode 100644 index 5d54726e22..0000000000 --- a/Externals/SDL/Include_1.3/SDL_error.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_error.h - * Simple error message routines for SDL - */ - -#ifndef _SDL_error_h -#define _SDL_error_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* Public functions */ -extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); -extern DECLSPEC char *SDLCALL SDL_GetError(void); -extern DECLSPEC void SDLCALL SDL_ClearError(void); - -/* Private error message function - used internally */ -#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) -#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) -typedef enum -{ - SDL_ENOMEM, - SDL_EFREAD, - SDL_EFWRITE, - SDL_EFSEEK, - SDL_UNSUPPORTED, - SDL_LASTERROR -} SDL_errorcode; -extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_error_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_events.h b/Externals/SDL/Include_1.3/SDL_events.h deleted file mode 100644 index 13672f2e4a..0000000000 --- a/Externals/SDL/Include_1.3/SDL_events.h +++ /dev/null @@ -1,486 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_events.h - * - * Include file for SDL event handling - */ - -#ifndef _SDL_events_h -#define _SDL_events_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_video.h" -#include "SDL_keyboard.h" -#include "SDL_mouse.h" -#include "SDL_joystick.h" -#include "SDL_quit.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* General keyboard/mouse state definitions */ -#define SDL_RELEASED 0 -#define SDL_PRESSED 1 - -/** - * \enum SDL_EventType - * - * \brief The types of events that can be delivered - */ -typedef enum -{ - SDL_NOEVENT = 0, /**< Unused (do not remove) */ - SDL_WINDOWEVENT, /**< Window state change */ - SDL_KEYDOWN, /**< Keys pressed */ - SDL_KEYUP, /**< Keys released */ - SDL_TEXTINPUT, /**< Keyboard text input */ - SDL_MOUSEMOTION, /**< Mouse moved */ - SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ - SDL_MOUSEBUTTONUP, /**< Mouse button released */ - SDL_MOUSEWHEEL, /**< Mouse wheel motion */ - SDL_JOYAXISMOTION, /**< Joystick axis motion */ - SDL_JOYBALLMOTION, /**< Joystick trackball motion */ - SDL_JOYHATMOTION, /**< Joystick hat position change */ - SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ - SDL_JOYBUTTONUP, /**< Joystick button released */ - SDL_QUIT, /**< User-requested quit */ - SDL_SYSWMEVENT, /**< System specific event */ - SDL_PROXIMITYIN, /**< Proximity In event */ - SDL_PROXIMITYOUT, /**< Proximity Out event */ - SDL_EVENT_RESERVED1, /**< Reserved for future use... */ - SDL_EVENT_RESERVED2, - SDL_EVENT_RESERVED3, - /* Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ - SDL_USEREVENT = 24, - /* This last event is only for bounding internal arrays - It is the number of bits in the event mask datatype -- Uint32 - */ - SDL_NUMEVENTS = 32 -} SDL_EventType; - -/** - * \enum SDL_EventMask - * - * \brief Predefined event masks - */ -#define SDL_EVENTMASK(X) (1<<(X)) -typedef enum -{ - SDL_WINDOWEVENTMASK = SDL_EVENTMASK(SDL_WINDOWEVENT), - SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), - SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), - SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN) | SDL_EVENTMASK(SDL_KEYUP), - SDL_TEXTINPUTMASK = SDL_EVENTMASK(SDL_TEXTINPUT), - SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), - SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), - SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_MOUSEWHEELMASK = SDL_EVENTMASK(SDL_MOUSEWHEEL), - SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION) | - SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN) | SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), - SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), - SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), - SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), - SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION) | - SDL_EVENTMASK(SDL_JOYBALLMOTION) | - SDL_EVENTMASK(SDL_JOYHATMOTION) | - SDL_EVENTMASK(SDL_JOYBUTTONDOWN) | SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), - SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT), - SDL_PROXIMITYINMASK = SDL_EVENTMASK(SDL_PROXIMITYIN), - SDL_PROXIMITYOUTMASK = SDL_EVENTMASK(SDL_PROXIMITYOUT) -} SDL_EventMask; -#define SDL_ALLEVENTS 0xFFFFFFFF - -/** - * \struct SDL_WindowEvent - * - * \brief Window state change event data (event.window.*) - */ -typedef struct SDL_WindowEvent -{ - Uint8 type; /**< SDL_WINDOWEVENT */ - Uint8 event; /**< SDL_WindowEventID */ - int data1; /**< event dependent data */ - int data2; /**< event dependent data */ - SDL_WindowID windowID; /**< The associated window */ -} SDL_WindowEvent; - -/** - * \struct SDL_KeyboardEvent - * - * \brief Keyboard button event structure (event.key.*) - */ -typedef struct SDL_KeyboardEvent -{ - Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ - Uint8 which; /**< The keyboard device index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - SDL_keysym keysym; /**< The key that was pressed or released */ - SDL_WindowID windowID; /**< The window with keyboard focus, if any */ -} SDL_KeyboardEvent; - -/** - * \struct SDL_TextInputEvent - * - * \brief Keyboard text input event structure (event.text.*) - */ -#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) -typedef struct SDL_TextInputEvent -{ - Uint8 type; /**< SDL_TEXTINPUT */ - Uint8 which; /**< The keyboard device index */ - char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ - SDL_WindowID windowID; /**< The window with keyboard focus, if any */ -} SDL_TextInputEvent; - -/** - * \struct SDL_MouseMotionEvent - * - * \brief Mouse motion event structure (event.motion.*) - */ -typedef struct SDL_MouseMotionEvent -{ - Uint8 type; /**< SDL_MOUSEMOTION */ - Uint8 which; /**< The mouse device index */ - Uint8 state; /**< The current button state */ - int x; /**< X coordinate, relative to window */ - int y; /**< Y coordinate, relative to window */ - int z; /**< Z coordinate, for future use */ - int pressure; /**< Pressure reported by tablets */ - int pressure_max; /**< Maximum value of the pressure reported by the device */ - int pressure_min; /**< Minimum value of the pressure reported by the device */ - int rotation; /**< For future use */ - int tilt; /**< For future use */ - int cursor; /**< The cursor being used in the event */ - int xrel; /**< The relative motion in the X direction */ - int yrel; /**< The relative motion in the Y direction */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ -} SDL_MouseMotionEvent; - -/** - * \struct SDL_MouseButtonEvent - * - * \brief Mouse button event structure (event.button.*) - */ -typedef struct SDL_MouseButtonEvent -{ - Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ - Uint8 which; /**< The mouse device index */ - Uint8 button; /**< The mouse button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - int x; /**< X coordinate, relative to window */ - int y; /**< Y coordinate, relative to window */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ -} SDL_MouseButtonEvent; - -/** - * \struct SDL_MouseWheelEvent - * - * \brief Mouse wheel event structure (event.wheel.*) - */ -typedef struct SDL_MouseWheelEvent -{ - Uint8 type; /**< SDL_MOUSEWHEEL */ - Uint8 which; /**< The mouse device index */ - int x; /**< The amount scrolled horizontally */ - int y; /**< The amount scrolled vertically */ - SDL_WindowID windowID; /**< The window with mouse focus, if any */ -} SDL_MouseWheelEvent; - -/** - * \struct SDL_JoyAxisEvent - * - * \brief Joystick axis motion event structure (event.jaxis.*) - */ -typedef struct SDL_JoyAxisEvent -{ - Uint8 type; /**< SDL_JOYAXISMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 axis; /**< The joystick axis index */ - int value; /**< The axis value (range: -32768 to 32767) */ -} SDL_JoyAxisEvent; - -/** - * \struct SDL_JoyBallEvent - * - * \brief Joystick trackball motion event structure (event.jball.*) - */ -typedef struct SDL_JoyBallEvent -{ - Uint8 type; /**< SDL_JOYBALLMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 ball; /**< The joystick trackball index */ - int xrel; /**< The relative motion in the X direction */ - int yrel; /**< The relative motion in the Y direction */ -} SDL_JoyBallEvent; - -/** - * \struct SDL_JoyHatEvent - * - * \brief Joystick hat position change event structure (event.jhat.*) - */ -typedef struct SDL_JoyHatEvent -{ - Uint8 type; /**< SDL_JOYHATMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 hat; /**< The joystick hat index */ - Uint8 value; /**< The hat position value: - SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP - SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT - SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN - Note that zero means the POV is centered. - */ -} SDL_JoyHatEvent; - -/** - * \struct SDL_JoyButtonEvent - * - * \brief Joystick button event structure (event.jbutton.*) - */ -typedef struct SDL_JoyButtonEvent -{ - Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ - Uint8 which; /**< The joystick device index */ - Uint8 button; /**< The joystick button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ -} SDL_JoyButtonEvent; - -/** - * \struct SDL_QuitEvent - * - * \brief The "quit requested" event - */ -typedef struct SDL_QuitEvent -{ - Uint8 type; /**< SDL_QUIT */ -} SDL_QuitEvent; - -/** - * \struct SDL_UserEvent - * - * \brief A user-defined event type (event.user.*) - */ -typedef struct SDL_UserEvent -{ - Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ - int code; /**< User defined event code */ - void *data1; /**< User defined data pointer */ - void *data2; /**< User defined data pointer */ - SDL_WindowID windowID; /**< The associated window if any*/ -} SDL_UserEvent; - -/** - * \struct SDL_SysWMEvent - * - * \brief A video driver dependent system event (event.syswm.*) - * - * \note If you want to use this event, you should include SDL_syswm.h - */ -struct SDL_SysWMmsg; -typedef struct SDL_SysWMmsg SDL_SysWMmsg; -typedef struct SDL_SysWMEvent -{ - Uint8 type; /**< SDL_SYSWMEVENT */ - SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ -} SDL_SysWMEvent; - -/* Typedefs for backwards compatibility */ -typedef struct SDL_ActiveEvent -{ - Uint8 type; - Uint8 gain; - Uint8 state; -} SDL_ActiveEvent; -typedef struct SDL_ResizeEvent -{ - Uint8 type; - int w; - int h; -} SDL_ResizeEvent; - -typedef struct SDL_ProximityEvent -{ - Uint8 type; - Uint8 which; - int cursor; - int x; - int y; -} SDL_ProximityEvent; - -/** - * \union SDL_Event - * - * \brief General event structure - */ -typedef union SDL_Event -{ - Uint8 type; /**< Event type, shared with all events */ - SDL_WindowEvent window; /**< Window event data */ - SDL_KeyboardEvent key; /**< Keyboard event data */ - SDL_TextInputEvent text; /**< Text input event data */ - SDL_MouseMotionEvent motion; /**< Mouse motion event data */ - SDL_MouseButtonEvent button; /**< Mouse button event data */ - SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ - SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ - SDL_JoyBallEvent jball; /**< Joystick ball event data */ - SDL_JoyHatEvent jhat; /**< Joystick hat event data */ - SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ - SDL_QuitEvent quit; /**< Quit request event data */ - SDL_UserEvent user; /**< Custom event data */ - SDL_SysWMEvent syswm; /**< System dependent window event data */ - SDL_ProximityEvent proximity; /**< Proximity In or Out event */ - - /* Temporarily here for backwards compatibility */ - SDL_ActiveEvent active; - SDL_ResizeEvent resize; -} SDL_Event; - - -/* Function prototypes */ - -/* Pumps the event loop, gathering events from the input devices. - This function updates the event queue and internal input device state. - This should only be run in the thread that sets the video mode. -*/ -extern DECLSPEC void SDLCALL SDL_PumpEvents(void); - -/* Checks the event queue for messages and optionally returns them. - If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to - the back of the event queue. - If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front - of the event queue, matching 'mask', will be returned and will not - be removed from the queue. - If 'action' is SDL_GETEVENT, up to 'numevents' events at the front - of the event queue, matching 'mask', will be returned and will be - removed from the queue. - This function returns the number of events actually stored, or -1 - if there was an error. This function is thread-safe. -*/ -typedef enum -{ - SDL_ADDEVENT, - SDL_PEEKEVENT, - SDL_GETEVENT -} SDL_eventaction; -/* */ -extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, - SDL_eventaction action, - Uint32 mask); - -/* Checks to see if certain event types are in the event queue. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 mask); - -/* Polls for currently pending events, and returns 1 if there are any pending - events, or 0 if there are none available. If 'event' is not NULL, the next - event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); - -/* Waits indefinitely for the next available event, returning 1, or 0 if there - was an error while waiting for events. If 'event' is not NULL, the next - event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); - -/* Add an event to the event queue. - This function returns 1 on success, 0 if the event was filtered, - or -1 if the event queue was full or there was some other error. - */ -extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); - -/* - This function sets up a filter to process all events before they - change internal state and are posted to the internal event queue. - - The filter is protypted as: -*/ -typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); -/* - If the filter returns 1, then the event will be added to the internal queue. - If it returns 0, then the event will be dropped from the queue, but the - internal state will still be updated. This allows selective filtering of - dynamically arriving events. - - WARNING: Be very careful of what you do in the event filter function, as - it may run in a different thread! - - There is one caveat when dealing with the SDL_QUITEVENT event type. The - event filter is only called when the window manager desires to close the - application window. If the event filter returns 1, then the window will - be closed, otherwise the window will remain open if possible. - If the quit event is generated by an interrupt signal, it will bypass the - internal queue and be delivered to the application at the next event poll. -*/ -extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, - void *userdata); - -/* - Return the current event filter - can be used to "chain" filters. - If there is no event filter set, this function returns SDL_FALSE. -*/ -extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, - void **userdata); - -/* - Run the filter function on the current event queue, removing any - events for which the filter returns 0. -*/ -extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, - void *userdata); - -/* - This function allows you to set the state of processing certain events. - If 'state' is set to SDL_IGNORE, that event will be automatically dropped - from the event queue and will not event be filtered. - If 'state' is set to SDL_ENABLE, that event will be processed normally. - If 'state' is set to SDL_QUERY, SDL_EventState() will return the - current processing state of the specified event. -*/ -#define SDL_QUERY -1 -#define SDL_IGNORE 0 -#define SDL_DISABLE 0 -#define SDL_ENABLE 1 -extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_events_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_haptic.h b/Externals/SDL/Include_1.3/SDL_haptic.h deleted file mode 100644 index 6d748c2d0d..0000000000 --- a/Externals/SDL/Include_1.3/SDL_haptic.h +++ /dev/null @@ -1,1154 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 2008 Edgar Simo - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_haptic.h - * - * \brief The SDL Haptic subsystem allows you to control haptic (force feedback) - * devices. - * - * The basic usage is as follows: - * - Initialize the Subsystem (SDL_INIT_HAPTIC). - * - Open a Haptic Device. - * - SDL_HapticOpen(...) to open from index. - * - SDL_HapticOpenFromJoystick(...) to open from an existing joystick. - * - Create an effect (SDL_HapticEffect). - * - Upload the effect with SDL_HapticNewEffect(...). - * - Run the effect with SDL_HapticRunEffect(...). - * - (optional) Free the effect with SDL_HapticDestroyEffect(...). - * - Close the haptic device with SDL_HapticClose(...). - * - * Example: - * - * \code - * int test_haptic( SDL_Joystick * joystick ) { - * SDL_Haptic *haptic; - * SDL_HapticEffect effect; - * int effect_id; - * - * // Open the device - * haptic = SDL_HapticOpenFromJoystick( joystick ); - * if (haptic == NULL) return -1; // Most likely joystick isn't haptic - * - * // See if it can do sine waves - * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) { - * SDL_HapticClose(haptic); // No sine effect - * return -1; - * } - * - * // Create the effect - * memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default - * effect.type = SDL_HAPTIC_SINE; - * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates - * effect.periodic.direction.dir[0] = 18000; // Force comes from south - * effect.periodic.period = 1000; // 1000 ms - * effect.periodic.magnitude = 20000; // 20000/32767 strength - * effect.periodic.length = 5000; // 5 seconds long - * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength - * effect.periodic.fade_length = 1000; // Takes 1 second to fade away - * - * // Upload the effect - * effect_id = SDL_HapticNewEffect( haptic, &effect ); - * - * // Test the effect - * SDL_HapticRunEffect( haptic, effect_id, 1 ); - * SDL_Delay( 5000); // Wait for the effect to finish - * - * // We destroy the effect, although closing the device also does this - * SDL_HapticDestroyEffect( haptic, effect_id ); - * - * // Close the device - * SDL_HapticClose(haptic); - * - * return 0; // Success - * } - * \endcode - * - * \author Edgar Simo Serra - */ - -#ifndef _SDL_haptic_h -#define _SDL_haptic_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_joystick.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { - /* *INDENT-ON* */ -#endif /* __cplusplus */ - -/** - * \typedef SDL_Haptic - * - * \brief The haptic structure used to identify an SDL haptic. - * - * \sa SDL_HapticOpen - * \sa SDL_HapticOpenFromJoystick - * \sa SDL_HapticClose - */ -struct _SDL_Haptic; -typedef struct _SDL_Haptic SDL_Haptic; - - -/* - * Different haptic features a device can have. - */ -/** - * \def SDL_HAPTIC_CONSTANT - * - * \brief Constant haptic effect. - * - * \sa SDL_HapticCondition - */ -#define SDL_HAPTIC_CONSTANT (1<<0) /* Constant effect supported */ -/** - * \def SDL_HAPTIC_SINE - * - * \brief Periodic haptic effect that simulates sine waves. - * - * \sa SDL_HapticPeriodic - */ -#define SDL_HAPTIC_SINE (1<<1) /* Sine wave effect supported */ -/** - * \def SDL_HAPTIC_SQUARE - * - * \brief Periodic haptic effect that simulates square waves. - * - * \sa SDL_HapticPeriodic - */ -#define SDL_HAPTIC_SQUARE (1<<2) /* Square wave effect supported */ -/** - * \def SDL_HAPTIC_TRIANGLE - * - * \brief Periodic haptic effect that simulates triangular waves. - * - * \sa SDL_HapticPeriodic - */ -#define SDL_HAPTIC_TRIANGLE (1<<3) /* Triangle wave effect supported */ -/** - * \def SDL_HAPTIC_SAWTOOTHUP - * - * \brief Periodic haptic effect that simulates saw tooth up waves. - * - * \sa SDL_HapticPeriodic - */ -#define SDL_HAPTIC_SAWTOOTHUP (1<<4) /* Sawtoothup wave effect supported */ -/** - * \def SDL_HAPTIC_SAWTOOTHDOWN - * - * \brief Periodic haptic effect that simulates saw tooth down waves. - * - * \sa SDL_HapticPeriodic - */ -#define SDL_HAPTIC_SAWTOOTHDOWN (1<<5) /* Sawtoothdown wave effect supported */ -/** - * \def SDL_HAPTIC_RAMP - * - * \brief Ramp haptic effect. - * - * \sa SDL_HapticRamp - */ -#define SDL_HAPTIC_RAMP (1<<6) /* Ramp effect supported */ -/** - * \def SDL_HAPTIC_SPRING - * - * \brief Condition haptic effect that simulates a spring. Effect is based on the - * axes position. - * - * \sa SDL_HapticCondition - */ -#define SDL_HAPTIC_SPRING (1<<7) /* Spring effect supported - uses axes position */ -/** - * \def SDL_HAPTIC_DAMPER - * - * \brief Condition haptic effect that simulates dampening. Effect is based on the - * axes velocity. - * - * \sa SDL_HapticCondition - */ -#define SDL_HAPTIC_DAMPER (1<<8) /* Damper effect supported - uses axes velocity */ -/** - * \def SDL_HAPTIC_INERTIA - * - * \brief Condition haptic effect that simulates inertia. Effect is based on the axes - * acceleration. - * - * \sa SDL_HapticCondition - */ -#define SDL_HAPTIC_INERTIA (1<<9) /* Inertia effect supported - uses axes acceleration */ -/** - * \def SDL_HAPTIC_FRICTION - * - * \brief Condition haptic effect that simulates friction. Effect is based on the axes - * movement. - * - * \sa SDL_HapticCondition - */ -#define SDL_HAPTIC_FRICTION (1<<10) /* Friction effect supported - uses axes movement */ -/** - * \def SDL_HAPTIC_CUSTOM - * - * \brief User defined custom haptic effect. - */ -#define SDL_HAPTIC_CUSTOM (1<<11) /* Custom effect is supported */ -/* These last two are features the device has, not effects */ -/** - * \def SDL_HAPTIC_GAIN - * - * \brief Device supports setting the global gain. - * - * \sa SDL_HapticSetGain - */ -#define SDL_HAPTIC_GAIN (1<<12) /* Device can set global gain */ -/** - * \def SDL_HAPTIC_AUTOCENTER - * - * \brief Device supports setting autocenter. - * - * \sa SDL_HapticSetAutocenter - */ -#define SDL_HAPTIC_AUTOCENTER (1<<13) /* Device can set autocenter */ -/** - * \def SDL_HAPTIC_STATUS - * - * \brief Device can be queried for effect status. - * - * \sa SDL_HapticGetEffectStatus - */ -#define SDL_HAPTIC_STATUS (1<<14) /* Device can be queried for effect status */ -/** - * \def SDL_HAPTIC_PAUSE - * - * \brief Device can be paused. - * - * \sa SDL_HapticPause - * \sa SDL_HapticUnpause - */ -#define SDL_HAPTIC_PAUSE (1<<15) /* Device can be paused. */ - - -/* - * Direction encodings - */ -/** - * \def SDL_HAPTIC_POLAR - * - * \brief Uses polar coordinates for the direction. - * - * \sa SDL_HapticDirection - */ -#define SDL_HAPTIC_POLAR 0 -/** - * \def SDL_HAPTIC_CARTESIAN - * - * \brief Uses cartesian coordinates for the direction. - * - * \sa SDL_HapticDirection - */ -#define SDL_HAPTIC_CARTESIAN 1 -/** - * \def SDL_HAPTIC_SPHERICAL - * - * \brief Uses spherical coordinates for the direction. - * - * \sa SDL_HapticDirection - */ -#define SDL_HAPTIC_SPHERICAL 2 - - -/* - * Misc defines. - */ -/** - * \def SDL_HAPTIC_INFINITY - * - * \brief Used to play a device an infinite number of times. - * - * \sa SDL_HapticRunEffect - */ -#define SDL_HAPTIC_INFINITY 4294967295U - - -/** - * \struct SDL_HapticDirection - * - * \brief Structure that represents a haptic direction. - * - * Directions can be specified by: - * - SDL_HAPTIC_POLAR : Specified by polar coordinates. - * - SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. - * - SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. - * - * Cardinal directions of the haptic device are relative to the positioning - * of the device. North is considered to be away from the user. - * - * The following diagram represents the cardinal directions: - * \code - * .--. - * |__| .-------. - * |=.| |.-----.| - * |--| || || - * | | |'-----'| - * |__|~')_____(' - * [ COMPUTER ] - * - * - * North (0,-1) - * ^ - * | - * | - * (1,0) West <----[ HAPTIC ]----> East (-1,0) - * | - * | - * v - * South (0,1) - * - * - * [ USER ] - * \|||/ - * (o o) - * ---ooO-(_)-Ooo--- - * \endcode - * - * If type is SDL_HAPTIC_POLAR, direction is encoded by hundredths of a - * degree starting north and turning clockwise. SDL_HAPTIC_POLAR only uses - * the first dir parameter. The cardinal directions would be: - * - North: 0 (0 degrees) - * - East: 9000 (90 degrees) - * - South: 18000 (180 degrees) - * - West: 27000 (270 degrees) - * - * If type is SDL_HAPTIC_CARTESIAN, direction is encoded by three positions - * (X axis, Y axis and Z axis (with 3 axes)). SDL_HAPTIC_CARTESIAN uses - * the first three dir parameters. The cardinal directions would be: - * - North: 0,-1, 0 - * - East: -1, 0, 0 - * - South: 0, 1, 0 - * - West: 1, 0, 0 - * The Z axis represents the height of the effect if supported, otherwise - * it's unused. In cartesian encoding (1,2) would be the same as (2,4), you - * can use any multiple you want, only the direction matters. - * - * If type is SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. - * The first two dir parameters are used. The dir parameters are as follows - * (all values are in hundredths of degrees): - * 1) Degrees from (1, 0) rotated towards (0, 1). - * 2) Degrees towards (0, 0, 1) (device needs at least 3 axes). - * - * - * Example of force coming from the south with all encodings (force coming - * from the south means the user will have to pull the stick to counteract): - * \code - * SDL_HapticDirection direction; - * - * // Cartesian directions - * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. - * direction.dir[0] = 0; // X position - * direction.dir[1] = 1; // Y position - * // Assuming the device has 2 axes, we don't need to specify third parameter. - * - * // Polar directions - * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. - * direction.dir[0] = 18000; // Polar only uses first parameter - * - * // Spherical coordinates - * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding - * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. - * \endcode - * - * \sa SDL_HAPTIC_POLAR - * \sa SDL_HAPTIC_CARTESIAN - * \sa SDL_HAPTIC_SPHERICAL - * \sa SDL_HapticEffect - * \sa SDL_HapticNumAxes - */ -typedef struct SDL_HapticDirection -{ - Uint8 type; /**< The type of encoding. */ - Uint16 dir[3]; /**< The encoded direction. */ -} SDL_HapticDirection; - - -/** - * \struct SDL_HapticConstant - * - * \brief A structure containing a template for a Constant effect. - * - * The struct is exclusive to the SDL_HAPTIC_CONSTANT effect. - * - * A constant effect applies a constant force in the specified direction - * to the joystick. - * - * \sa SDL_HAPTIC_CONSTANT - * \sa SDL_HapticEffect - */ -typedef struct SDL_HapticConstant -{ - /* Header */ - Uint16 type; /**< SDL_HAPTIC_CONSTANT */ - SDL_HapticDirection direction; /**< Direction of the effect. */ - - /* Replay */ - Uint32 length; /**< Duration of the effect. */ - Uint16 delay; /**< Delay before starting the effect. */ - - /* Trigger */ - Uint16 button; /**< Button that triggers the effect. */ - Uint16 interval; /**< How soon it can be triggered again after button. */ - - /* Constant */ - Sint16 level; /**< Strength of the constant effect. */ - - /* Envelope */ - Uint16 attack_length; /**< Duration of the attack. */ - Uint16 attack_level; /**< Level at the start of the attack. */ - Uint16 fade_length; /**< Duration of the fade. */ - Uint16 fade_level; /**< Level at the end of the fade. */ -} SDL_HapticConstant; -/** - * \struct SDL_HapticPeriodic - * - * \brief A structure containing a template for a Periodic effect. - * - * The struct handles the following effects: - * - SDL_HAPTIC_SINE - * - SDL_HAPTIC_SQUARE - * - SDL_HAPTIC_TRIANGLE - * - SDL_HAPTIC_SAWTOOTHUP - * - SDL_HAPTIC_SAWTOOTHDOWN - * - * A periodic effect consists in a wave-shaped effect that repeats itself - * over time. The type determines the shape of the wave and the parameters - * determine the dimensions of the wave. - * - * Phase is given by hundredth of a cyle meaning that giving the phase a value - * of 9000 will displace it 25% of it's period. Here are sample values: - * - 0: No phase displacement. - * - 9000: Displaced 25% of it's period. - * - 18000: Displaced 50% of it's period. - * - 27000: Displaced 75% of it's period. - * - 36000: Displaced 100% of it's period, same as 0, but 0 is preffered. - * - * Examples: - * \code - * SDL_HAPTIC_SINE - * __ __ __ __ - * / \ / \ / \ / - * / \__/ \__/ \__/ - * - * SDL_HAPTIC_SQUARE - * __ __ __ __ __ - * | | | | | | | | | | - * | |__| |__| |__| |__| | - * - * SDL_HAPTIC_TRIANGLE - * /\ /\ /\ /\ /\ - * / \ / \ / \ / \ / - * / \/ \/ \/ \/ - * - * SDL_HAPTIC_SAWTOOTHUP - * /| /| /| /| /| /| /| - * / | / | / | / | / | / | / | - * / |/ |/ |/ |/ |/ |/ | - * - * SDL_HAPTIC_SAWTOOTHDOWN - * \ |\ |\ |\ |\ |\ |\ | - * \ | \ | \ | \ | \ | \ | \ | - * \| \| \| \| \| \| \| - * \endcode - * - * \sa SDL_HAPTIC_SINE - * \sa SDL_HAPTIC_SQUARE - * \sa SDL_HAPTIC_TRIANGLE - * \sa SDL_HAPTIC_SAWTOOTHUP - * \sa SDL_HAPTIC_SAWTOOTHDOWN - * \sa SDL_HapticEffect - */ -typedef struct SDL_HapticPeriodic -{ - /* Header */ - Uint16 type; /**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE, - SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or - SDL_HAPTIC_SAWTOOTHDOWN */ - SDL_HapticDirection direction; /**< Direction of the effect. */ - - /* Replay */ - Uint32 length; /**< Duration of the effect. */ - Uint16 delay; /**< Delay before starting the effect. */ - - /* Trigger */ - Uint16 button; /**< Button that triggers the effect. */ - Uint16 interval; /**< How soon it can be triggered again after button. */ - - /* Periodic */ - Uint16 period; /**< Period of the wave. */ - Sint16 magnitude; /**< Peak value. */ - Sint16 offset; /**< Mean value of the wave. */ - Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */ - - /* Envelope */ - Uint16 attack_length; /**< Duration of the attack. */ - Uint16 attack_level; /**< Level at the start of the attack. */ - Uint16 fade_length; /**< Duration of the fade. */ - Uint16 fade_level; /**< Level at the end of the fade. */ -} SDL_HapticPeriodic; -/** - * \struct SDL_HapticCondition - * - * \brief A structure containing a template for a Condition effect. - * - * The struct handles the following effects: - * - SDL_HAPTIC_SPRING: Effect based on axes position. - * - SDL_HAPTIC_DAMPER: Effect based on axes velocity. - * - SDL_HAPTIC_INERTIA: Effect based on axes acceleration. - * - SDL_HAPTIC_FRICTION: Effect based on axes movement. - * - * Direction is handled by condition internals instead of a direction member. - * The condition effect specific members have three parameters. The first - * refers to the X axis, the second refers to the Y axis and the third - * refers to the Z axis. The right terms refer to the positive side of the - * axis and the left terms refer to the negative side of the axis. Please - * refer to the SDL_HapticDirection diagram for which side is positive and - * which is negative. - * - * \sa SDL_HapticDirection - * \sa SDL_HAPTIC_SPRING - * \sa SDL_HAPTIC_DAMPER - * \sa SDL_HAPTIC_INERTIA - * \sa SDL_HAPTIC_FRICTION - * \sa SDL_HapticEffect - */ -typedef struct SDL_HapticCondition -{ - /* Header */ - Uint16 type; /**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, - SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION */ - SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ - - /* Replay */ - Uint32 length; /**< Duration of the effect. */ - Uint16 delay; /**< Delay before starting the effect. */ - - /* Trigger */ - Uint16 button; /**< Button that triggers the effect. */ - Uint16 interval; /**< How soon it can be triggered again after button. */ - - /* Condition */ - Uint16 right_sat[3]; /**< Level when joystick is to the positive side. */ - Uint16 left_sat[3]; /**< Level when joystick is to the negative side. */ - Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ - Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ - Uint16 deadband[3]; /**< Size of the dead zone. */ - Sint16 center[3]; /**< Position of the dead zone. */ -} SDL_HapticCondition; -/** - * \struct SDL_HapticRamp - * - * \brief A structure containing a template for a Ramp effect. - * - * This struct is exclusively for the SDL_HAPTIC_RAMP effect. - * - * The ramp effect starts at start strength and ends at end strength. - * It augments in linear fashion. If you use attack and fade with a ramp - * they effects get added to the ramp effect making the effect become - * quadratic instead of linear. - * - * \sa SDL_HAPTIC_RAMP - * \sa SDL_HapticEffect - */ -typedef struct SDL_HapticRamp -{ - /* Header */ - Uint16 type; /**< SDL_HAPTIC_RAMP */ - SDL_HapticDirection direction; /**< Direction of the effect. */ - - /* Replay */ - Uint32 length; /**< Duration of the effect. */ - Uint16 delay; /**< Delay before starting the effect. */ - - /* Trigger */ - Uint16 button; /**< Button that triggers the effect. */ - Uint16 interval; /**< How soon it can be triggered again after button. */ - - /* Ramp */ - Sint16 start; /**< Beginning strength level. */ - Sint16 end; /**< Ending strength level. */ - - /* Envelope */ - Uint16 attack_length; /**< Duration of the attack. */ - Uint16 attack_level; /**< Level at the start of the attack. */ - Uint16 fade_length; /**< Duration of the fade. */ - Uint16 fade_level; /**< Level at the end of the fade. */ -} SDL_HapticRamp; -/** - * \struct SDL_HapticCustom - * - * \brief A structure containing a template for the SDL_HAPTIC_CUSTOM effect. - * - * A custom force feedback effect is much like a periodic effect, where the - * application can define it's exact shape. You will have to allocate the - * data yourself. Data should consist of channels * samples Uint16 samples. - * - * If channels is one, the effect is rotated using the defined direction. - * Otherwise it uses the samples in data for the different axes. - * - * \sa SDL_HAPTIC_CUSTOM - * \sa SDL_HapticEffect - */ -typedef struct SDL_HapticCustom -{ - /* Header */ - Uint16 type; /**< SDL_HAPTIC_CUSTOM */ - SDL_HapticDirection direction; /**< Direction of the effect. */ - - /* Replay */ - Uint32 length; /**< Duration of the effect. */ - Uint16 delay; /**< Delay before starting the effect. */ - - /* Trigger */ - Uint16 button; /**< Button that triggers the effect. */ - Uint16 interval; /**< How soon it can be triggered again after button. */ - - /* Custom */ - Uint8 channels; /**< Axes to use, minimum of one. */ - Uint16 period; /**< Sample periods. */ - Uint16 samples; /**< Amount of samples. */ - Uint16 *data; /**< Should contain channels*samples items. */ - - /* Envelope */ - Uint16 attack_length; /**< Duration of the attack. */ - Uint16 attack_level; /**< Level at the start of the attack. */ - Uint16 fade_length; /**< Duration of the fade. */ - Uint16 fade_level; /**< Level at the end of the fade. */ -} SDL_HapticCustom; -/** - * \union SDL_HapticEffect - * - * \brief The generic template for any haptic effect. - * - * All values max at 32767 (0x7FFF). Signed values also can be negative. - * Time values unless specified otherwise are in milliseconds. - * - * You can also pass SDL_HAPTIC_INFINITY to length instead of a 0-32767 value. - * Neither delay, interval, attack_length nor fade_length support - * SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. - * - * Additionally, the SDL_HAPTIC_RAMP effect does not support a duration of - * SDL_HAPTIC_INFINITY. - * - * Button triggers may not be supported on all devices, it is advised to not - * use them if possible. Buttons start at index 1 instead of index 0 like - * they joystick. - * - * If both attack_length and fade_level are 0, the envelope is not used, - * otherwise both values are used. - * - * Common parts: - * \code - * // Replay - All effects have this - * Uint32 length; // Duration of effect (ms). - * Uint16 delay; // Delay before starting effect. - * - * // Trigger - All effects have this - * Uint16 button; // Button that triggers effect. - * Uint16 interval; // How soon before effect can be triggered again. - * - * // Envelope - All effects except condition effects have this - * Uint16 attack_length; // Duration of the attack (ms). - * Uint16 attack_level; // Level at the start of the attack. - * Uint16 fade_length; // Duration of the fade out (ms). - * Uint16 fade_level; // Level at the end of the fade. - * \endcode - * - * - * Here we have an example of a constant effect evolution in time: - * - * \code - * Strength - * ^ - * | - * | effect level --> _________________ - * | / \ - * | / \ - * | / \ - * | / \ - * | attack_level --> | \ - * | | | <--- fade_level - * | - * +--------------------------------------------------> Time - * [--] [---] - * attack_length fade_length - * - * [------------------][-----------------------] - * delay length - * \endcode - * - * Note either the attack_level or the fade_level may be above the actual - * effect level. - * - * \sa SDL_HapticConstant - * \sa SDL_HapticPeriodic - * \sa SDL_HapticCondition - * \sa SDL_HapticRamp - * \sa SDL_HapticCustom - */ -typedef union SDL_HapticEffect -{ - /* Common for all force feedback effects */ - Uint16 type; /**< Effect type. */ - SDL_HapticConstant constant; /**< Constant effect. */ - SDL_HapticPeriodic periodic; /**< Periodic effect. */ - SDL_HapticCondition condition; /**< Condition effect. */ - SDL_HapticRamp ramp; /**< Ramp effect. */ - SDL_HapticCustom custom; /**< Custom effect. */ -} SDL_HapticEffect; - - -/* Function prototypes */ -/** - * \fn int SDL_NumHaptics(void) - * - * \brief Count the number of joysticks attached to the system. - * - * \return Number of haptic devices detected on the system. - */ -extern DECLSPEC int SDLCALL SDL_NumHaptics(void); - -/** - * \fn const char * SDL_HapticName(int device_index) - * - * \brief Get the implementation dependent name of a Haptic device. - * This can be called before any joysticks are opened. - * If no name can be found, this function returns NULL. - * - * \param device_index Index of the device to get it's name. - * \return Name of the device or NULL on error. - * - * \sa SDL_NumHaptics - */ -extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); - -/** - * \fn SDL_Haptic * SDL_HapticOpen(int device_index) - * - * \brief Opens a Haptic device for usage - the index passed as an - * argument refers to the N'th Haptic device on this system. - * - * When opening a haptic device, it's gain will be set to maximum and - * autocenter will be disabled. To modify these values use - * SDL_HapticSetGain and SDL_HapticSetAutocenter - * - * \param device_index Index of the device to open. - * \return Device identifier or NULL on error. - * - * \sa SDL_HapticIndex - * \sa SDL_HapticOpenFromMouse - * \sa SDL_HapticOpenFromJoystick - * \sa SDL_HapticClose - * \sa SDL_HapticSetGain - * \sa SDL_HapticSetAutocenter - * \sa SDL_HapticPause - * \sa SDL_HapticStopAll - */ -extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); - -/** - * \fn int SDL_HapticOpened(int device_index) - * - * \brief Checks if the haptic device at index has been opened. - * - * \param device_index Index to check to see if it has been opened. - * \return 1 if it has been opened or 0 if it hasn't. - * - * \sa SDL_HapticOpen - * \sa SDL_HapticIndex - */ -extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); - -/** - * \fn int SDL_HapticIndex(SDL_Haptic * haptic) - * - * \brief Gets the index of a haptic device. - * - * \param haptic Haptic device to get the index of. - * \return The index of the haptic device or -1 on error. - * - * \sa SDL_HapticOpen - * \sa SDL_HapticOpened - */ -extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); - -/** - * \fn int SDL_MouseIsHaptic(void) - * - * \brief Gets whether or not the current mouse has haptic capabilities. - * - * \return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't. - * - * \sa SDL_HapticOpenFromMouse - */ -extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); - -/** - * \fn SDL_Haptic * SDL_HapticOpenFromMouse(void) - * - * \brief Tries to open a haptic device from the current mouse. - * - * \return The haptic device identifier or NULL on error. - * - * \sa SDL_MouseIsHaptic - * \sa SDL_HapticOpen - */ -extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); - -/** - * \fn int SDL_JoystickIsHaptic(SDL_Joystick * joystick) - * - * \brief Checks to see if a joystick has haptic features. - * - * \param joystick Joystick to test for haptic capabilities. - * \return SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't - * or -1 if an error ocurred. - * - * \sa SDL_HapticOpenFromJoystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); - -/** - * \fn SDL_Haptic * SDL_HapticOpenFromJoystick(SDL_Joystick * joystick) - * - * \brief Opens a Haptic device for usage from a Joystick device. Still has - * to be closed seperately to the joystick. - * - * When opening from a joystick you should first close the haptic device before - * closing the joystick device. If not, on some implementations the haptic - * device will also get unallocated and you'll be unable to use force feedback - * on that device. - * - * \param joystick Joystick to create a haptic device from. - * \return A valid haptic device identifier on success or NULL on error. - * - * \sa SDL_HapticOpen - * \sa SDL_HapticClose - */ -extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * - joystick); - -/** - * \fn void SDL_HapticClose(SDL_Haptic * haptic) - * - * \brief Closes a Haptic device previously opened with SDL_HapticOpen. - * - * \param haptic Haptic device to close. - */ -extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); - -/** - * \fn int SDL_HapticNumEffects(SDL_Haptic * haptic) - * - * \brief Returns the number of effects a haptic device can store. - * - * On some platforms this isn't fully supported, and therefore is an - * aproximation. Always check to see if your created effect was actually - * created and do not rely solely on HapticNumEffects. - * - * \param haptic The haptic device to query effect max. - * \return The number of effects the haptic device can store or - * -1 on error. - * - * \sa SDL_HapticNumEffectsPlaying - * \sa SDL_HapticQuery - */ -extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); - -/** - * \fn int SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic) - * - * \brief Returns the number of effects a haptic device can play at the same time. - * - * This is not supported on all platforms, but will always return a value. Added - * here for the sake of completness. - * - * \param haptic The haptic device to query maximum playing effect.s - * \return The number of effects the haptic device can play at the same time - * or -1 on error. - * - * \sa SDL_HapticNumEffects - * \sa SDL_HapticQuery - */ -extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); - -/** - * \fn unsigned int SDL_HapticQuery(SDL_Haptic * haptic) - * - * \brief Gets the haptic devices supported features in bitwise matter. - * - * Example: - * \code - * if (SDL_HapticQueryEffects(haptic) & SDL_HAPTIC_CONSTANT) { - * printf("We have constant haptic effect!"); - * } - * \endcode - * - * - * \param haptic The haptic device to query. - * \return Haptic features in bitwise manner (OR'd). - * - * \sa SDL_HapticNumEffects - * \sa SDL_HapticEffectSupported - */ -extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); - - -/** - * \fn int SDL_HapticNumAxes(SDL_Haptic * haptic) - * - * \brief Gets the number of haptic axes the device has. - * - * \sa SDL_HapticDirection - */ -extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); - -/** - * \fn int SDL_HapticEffectSupported(SDL_Haptic * haptic, SDL_HapticEffect * effect) - * - * \brief Checks to see if effect is supported by haptic. - * - * \param haptic Haptic device to check on. - * \param effect Effect to check to see if it is supported. - * \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or - * -1 on error. - * - * \sa SDL_HapticQuery - * \sa SDL_HapticNewEffect - */ -extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, - SDL_HapticEffect * - effect); - -/** - * \fn int SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect) - * - * \brief Creates a new haptic effect on the device. - * - * \param haptic Haptic device to create the effect on. - * \param effect Properties of the effect to create. - * \return The id of the effect on success or -1 on error. - * - * \sa SDL_HapticUpdateEffect - * \sa SDL_HapticRunEffect - * \sa SDL_HapticDestroyEffect - */ -extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, - SDL_HapticEffect * effect); - -/** - * \fn int SDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect, SDL_HapticEffect * data) - * - * \brief Updates the properties of an effect. - * - * Can be used dynamically, although behaviour when dynamically changing - * direction may be strange. Specifically the effect may reupload itself - * and start playing from the start. You cannot change the type either when - * running UpdateEffect. - * - * \param haptic Haptic device that has the effect. - * \param effect Effect to update. - * \param data New effect properties to use. - * \return The id of the effect on success or -1 on error. - * - * \sa SDL_HapticNewEffect - * \sa SDL_HapticRunEffect - * \sa SDL_HapticDestroyEffect - */ -extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, - int effect, - SDL_HapticEffect * data); - -/** - * \fn int SDL_HapticRunEffect(SDL_Haptic * haptic, int effect, Uint32 iterations) - * - * \brief Runs the haptic effect on it's assosciated haptic device. - * - * If iterations are SDL_HAPTIC_INFINITY, it'll run the effect over and over - * repeating the envelope (attack and fade) every time. If you only want the - * effect to last forever, set SDL_HAPTIC_INFINITY in the effect's length - * parameter. - * - * \param haptic Haptic device to run the effect on. - * \param effect Identifier of the haptic effect to run. - * \param iterations Number of iterations to run the effect. Use - * SDL_HAPTIC_INFINITY for infinity. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticStopEffect - * \sa SDL_HapticDestroyEffect - * \sa SDL_HapticGetEffectStatus - */ -extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, - int effect, - Uint32 iterations); - -/** - * \fn int SDL_HapticStopEffect(SDL_Haptic * haptic, int effect) - * - * \brief Stops the haptic effect on it's assosciated haptic device. - * - * \param haptic Haptic device to stop the effect on. - * \param effect Identifier of the effect to stop. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticRunEffect - * \sa SDL_HapticDestroyEffect - */ -extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, - int effect); - -/** - * \fn void SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect) - * - * \brief Destroys a haptic effect on the device. This will stop the effect - * if it's running. Effects are automatically destroyed when the device is - * closed. - * - * \param haptic Device to destroy the effect on. - * \param effect Identifier of the effect to destroy. - * - * \sa SDL_HapticNewEffect - */ -extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic, - int effect); - -/** - * \fn int SDL_HapticGetEffectStatus(SDL_Haptic *haptic, int effect) - * - * \brief Gets the status of the current effect on the haptic device. - * - * Device must support the SDL_HAPTIC_STATUS feature. - * - * \param haptic Haptic device to query the effect status on. - * \param effect Identifier of the effect to query it's status. - * \return 0 if it isn't playing, SDL_HAPTIC_PLAYING if it is playing - * or -1 on error. - * - * \sa SDL_HapticRunEffect - * \sa SDL_HapticStopEffect - */ -extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic, - int effect); - -/** - * \fn int SDL_HapticSetGain(SDL_Haptic * haptic, int gain) - * - * \brief Sets the global gain of the device. Gain should be between 0 and 100. - * - * Device must support the SDL_HAPTIC_GAIN feature. - * - * The user may specify the maxmimum gain by setting the environment variable - * SDL_HAPTIC_GAIN_MAX which should be between 0 and 100. All calls to - * SDL_HapticSetGain will scale linearly using SDL_HAPTIC_GAIN_MAX as the - * maximum. - * - * \param haptic Haptic device to set the gain on. - * \param gain Value to set the gain to, should be between 0 and 100. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticQuery - */ -extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); - -/** - * \fn int SDL_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter) - * - * \brief Sets the global autocenter of the device. Autocenter should be between - * 0 and 100. Setting it to 0 will disable autocentering. - * - * Device must support the SDL_HAPTIC_AUTOCENTER feature. - * - * \param haptic Haptic device to set autocentering on. - * \param autocenter Value to set autocenter to, 0 disables autocentering. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticQuery - */ -extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic, - int autocenter); - -/** - * \fn extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic) - * - * \brief Pauses a haptic device. - * - * Device must support the SDL_HAPTIC_PAUSE feature. Call SDL_HapticUnpause - * to resume playback. - * - * Do not modify the effects nor add new ones while the device is paused. - * That can cause all sorts of weird errors. - * - * \param haptic Haptic device to pause. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticUnpause - */ -extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); - -/** - * \fn extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic) - * - * \brief Unpauses a haptic device. - * - * Call to unpause after SDL_HapticPause. - * - * \param haptic Haptic device to pause. - * \return 0 on success or -1 on error. - * - * \sa SDL_HapticPause - */ -extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); - -/** - * \fn extern DECSLPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic) - * - * \brief Stops all the currently playing effects on a haptic device. - * - * \param haptic Haptic device to stop. - * \return 0 on success or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_haptic_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_joystick.h b/Externals/SDL/Include_1.3/SDL_joystick.h deleted file mode 100644 index 44aa3fbe23..0000000000 --- a/Externals/SDL/Include_1.3/SDL_joystick.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_joystick.h - * - * Include file for SDL joystick event handling - */ - -#ifndef _SDL_joystick_h -#define _SDL_joystick_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* In order to use these functions, SDL_Init() must have been called - with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system - for joysticks, and load appropriate drivers. -*/ - -/* The joystick structure used to identify an SDL joystick */ -struct _SDL_Joystick; -typedef struct _SDL_Joystick SDL_Joystick; - - -/* Function prototypes */ -/* - * Count the number of joysticks attached to the system - */ -extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); - -/* - * Get the implementation dependent name of a joystick. - * This can be called before any joysticks are opened. - * If no name can be found, this function returns NULL. - */ -extern DECLSPEC const char *SDLCALL SDL_JoystickName(int device_index); - -/* - * Open a joystick for use - the index passed as an argument refers to - * the N'th joystick on the system. This index is the value which will - * identify this joystick in future joystick events. - * - * This function returns a joystick identifier, or NULL if an error occurred. - */ -extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); - -/* - * Returns 1 if the joystick has been opened, or 0 if it has not. - */ -extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); - -/* - * Get the device index of an opened joystick. - */ -extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick * joystick); - -/* - * Get the number of general axis controls on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick * joystick); - -/* - * Get the number of trackballs on a joystick - * Joystick trackballs have only relative motion events associated - * with them and their state cannot be polled. - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick * joystick); - -/* - * Get the number of POV hats on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick * joystick); - -/* - * Get the number of buttons on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick * joystick); - -/* - * Update the current state of the open joysticks. - * This is called automatically by the event loop if any joystick - * events are enabled. - */ -extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); - -/* - * Enable/disable joystick event polling. - * If joystick events are disabled, you must call SDL_JoystickUpdate() - * yourself and check the state of the joystick when you want joystick - * information. - * The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. - */ -extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); - -/* - * Get the current state of an axis control on a joystick - * The state is a value ranging from -32768 to 32767. - * The axis indices start at index 0. - */ -extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, - int axis); - -/* - * Get the current state of a POV hat on a joystick - * The return value is one of the following positions: - */ -#define SDL_HAT_CENTERED 0x00 -#define SDL_HAT_UP 0x01 -#define SDL_HAT_RIGHT 0x02 -#define SDL_HAT_DOWN 0x04 -#define SDL_HAT_LEFT 0x08 -#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) -#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) -#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) -#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) -/* - * The hat indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick * joystick, - int hat); - -/* - * Get the ball axis change since the last poll - * This returns 0, or -1 if you passed it invalid parameters. - * The ball indices start at index 0. - */ -extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick * joystick, - int ball, int *dx, int *dy); - -/* - * Get the current state of a button on a joystick - * The button indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick, - int button); - -/* - * Close a joystick previously opened with SDL_JoystickOpen() - */ -extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_joystick_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_keyboard.h b/Externals/SDL/Include_1.3/SDL_keyboard.h deleted file mode 100644 index 28737ee0e2..0000000000 --- a/Externals/SDL/Include_1.3/SDL_keyboard.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_keyboard.h - * - * Include file for SDL keyboard event handling - */ - -#ifndef _SDL_keyboard_h -#define _SDL_keyboard_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_keysym.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/** - * \struct SDL_keysym - * - * \brief The SDL keysym structure, used in key events. - */ -typedef struct SDL_keysym -{ - SDL_scancode scancode; /**< SDL physical key code - see ::SDL_scancode for details */ - SDLKey sym; /**< SDL virtual key code - see ::SDLKey for details */ - Uint16 mod; /**< current key modifiers */ - Uint32 unicode; /**< OBSOLETE, use SDL_TextInputEvent instead */ -} SDL_keysym; - -/* Function prototypes */ - -/** - * \fn int SDL_GetNumKeyboards(void) - * - * \brief Get the number of keyboard input devices available. - * - * \sa SDL_SelectKeyboard() - */ -extern DECLSPEC int SDLCALL SDL_GetNumKeyboards(void); - -/** - * \fn int SDL_SelectKeyboard(int index) - * - * \brief Set the index of the currently selected keyboard. - * - * \return The index of the previously selected keyboard. - * - * \note You can query the currently selected keyboard by passing an index of -1. - * - * \sa SDL_GetNumKeyboards() - */ -extern DECLSPEC int SDLCALL SDL_SelectKeyboard(int index); - -/** - * \fn Uint8 *SDL_GetKeyboardState(int *numkeys) - * - * \brief Get a snapshot of the current state of the selected keyboard. - * - * \param numkeys if non-NULL, receives the length of the returned array. - * - * \return An array of key states. Indexes into this array are obtained by using ::SDL_scancode values. - * - * Example: - * Uint8 *state = SDL_GetKeyboardState(NULL); - * if ( state[SDL_SCANCODE_RETURN)] ) ... is pressed. - */ -extern DECLSPEC Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); - -/** - * \fn SDLMod SDL_GetModState(void) - * - * \brief Get the current key modifier state for the selected keyboard. - */ -extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); - -/** - * \fn void SDL_SetModState(SDLMod modstate) - * - * \brief Set the current key modifier state for the selected keyboard. - * - * \note This does not change the keyboard state, only the key modifier flags. - */ -extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); - -/** - * \fn SDLKey SDL_GetKeyFromScancode(SDL_scancode scancode) - * - * \brief Get the key code corresponding to the given scancode according to the current keyboard layout. - * - * See ::SDLKey for details. - * - * \sa SDL_GetKeyName() - */ -extern DECLSPEC SDLKey SDLCALL SDL_GetKeyFromScancode(SDL_scancode scancode); - -/** - * \fn SDL_scancode SDL_GetScancodeFromKey(SDLKey key) - * - * \brief Get the scancode corresponding to the given key code according to the current keyboard layout. - * - * See ::SDL_scancode for details. - * - * \sa SDL_GetScancodeName() - */ -extern DECLSPEC SDL_scancode SDLCALL SDL_GetScancodeFromKey(SDLKey key); - -/** - * \fn const char *SDL_GetScancodeName(SDL_scancode scancode) - * - * \brief Get a human-readable name for a scancode. - * - * \return A pointer to a UTF-8 string that stays valid at least until the next call to this function. If you need it around any longer, you must copy it. If the scancode doesn't have a name, this function returns "". - * - * \sa SDL_scancode - */ -extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_scancode - scancode); - -/** - * \fn const char *SDL_GetKeyName(SDLKey key) - * - * \brief Get a human-readable name for a key. - * - * \return A pointer to a UTF-8 string that stays valid at least until the next call to this function. If you need it around any longer, you must copy it. If the key doesn't have a name, this function returns "". - * - * \sa SDLKey - */ -extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDLKey key); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_keyboard_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_loadso.h b/Externals/SDL/Include_1.3/SDL_loadso.h deleted file mode 100644 index be3ea3228b..0000000000 --- a/Externals/SDL/Include_1.3/SDL_loadso.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_loadso.h - * - * System dependent library loading routines - * - * Some things to keep in mind: - * - These functions only work on C function names. Other languages may - * have name mangling and intrinsic language support that varies from - * compiler to compiler. - * - Make sure you declare your function pointers with the same calling - * convention as the actual library function. Your code will crash - * mysteriously if you do not do this. - * - Avoid namespace collisions. If you load a symbol from the library, - * it is not defined whether or not it goes into the global symbol - * namespace for the application. If it does and it conflicts with - * symbols in your code or other shared libraries, you will not get - * the results you expect. :) - */ - -#ifndef _SDL_loadso_h -#define _SDL_loadso_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* This function dynamically loads a shared object and returns a pointer - * to the object handle (or NULL if there was an error). - * The 'sofile' parameter is a system dependent name of the object file. - */ -extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); - -/* Given an object handle, this function looks up the address of the - * named function in the shared object and returns it. This address - * is no longer valid after calling SDL_UnloadObject(). - */ -extern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, - const char *name); - -/* Unload a shared object from memory */ -extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_loadso_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_main.h b/Externals/SDL/Include_1.3/SDL_main.h deleted file mode 100644 index d4d902de82..0000000000 --- a/Externals/SDL/Include_1.3/SDL_main.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_main_h -#define _SDL_main_h - -#include "SDL_stdinc.h" - -/* Redefine main() on some platforms so that it is called by SDL */ - -#if defined(__WIN32__) || \ - (defined(__MWERKS__) && !defined(__BEOS__)) || \ - defined(__SYMBIAN32__) || defined(__IPHONEOS__) - -#ifdef __cplusplus -#define C_LINKAGE "C" -#else -#define C_LINKAGE -#endif /* __cplusplus */ - -/* The application's main() function must be called with C linkage, - and should be declared like this: -#ifdef __cplusplus -extern "C" -#endif - int main(int argc, char *argv[]) - { - } - */ -#define main SDL_main - -/* The prototype for the application's main() function */ -extern C_LINKAGE int SDL_main(int argc, char *argv[]); - - -/* From the SDL library code -- needed for registering the app on Win32 */ -#ifdef __WIN32__ - -#include "begin_code.h" -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* This can be called to set the application class at startup */ -extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, - void *hInst); -extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); - -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" -#endif - -#endif /* Need to redefine main()? */ - -#endif /* _SDL_main_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_mouse.h b/Externals/SDL/Include_1.3/SDL_mouse.h deleted file mode 100644 index b57c371ca5..0000000000 --- a/Externals/SDL/Include_1.3/SDL_mouse.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_mouse.h - * - * Include file for SDL mouse event handling - */ - -#ifndef _SDL_mouse_h -#define _SDL_mouse_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_video.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -typedef struct SDL_Cursor SDL_Cursor; /* Implementation dependent */ - -/* Function prototypes */ - -/** - * \fn int SDL_GetNumMice(void) - * - * \brief Get the number of mouse input devices available. - * - * \sa SDL_SelectMouse() - */ -extern DECLSPEC int SDLCALL SDL_GetNumMice(void); - -/** - * \fn char* SDL_GetMouseName(int index) - * - * \brief Gets the name of a mouse with the given index. - * - * \param index is the index of the mouse, which name is to be returned. - * - * \return the name of the mouse with the specified index - */ -extern DECLSPEC char *SDLCALL SDL_GetMouseName(int index); - -/** - * \fn int SDL_SelectMouse(int index) - * - * \brief Set the index of the currently selected mouse. - * - * \return The index of the previously selected mouse. - * - * \note You can query the currently selected mouse by passing an index of -1. - * - * \sa SDL_GetNumMice() - */ -extern DECLSPEC int SDLCALL SDL_SelectMouse(int index); - -/** - * \fn SDL_WindowID SDL_GetMouseFocusWindow(int index) - * - * \brief Get the window which currently has focus for the currently selected mouse. - */ -extern DECLSPEC SDL_WindowID SDLCALL SDL_GetMouseFocusWindow(int index); - -/** - * \fn int SDL_SetRelativeMouseMode(int index, SDL_bool enabled) - * - * \brief Set relative mouse mode for the currently selected mouse. - * - * \param enabled Whether or not to enable relative mode - * - * \return 0 on success, or -1 if relative mode is not supported. - * - * While the mouse is in relative mode, the cursor is hidden, and the - * driver will try to report continuous motion in the current window. - * Only relative motion events will be delivered, the mouse position - * will not change. - * - * \note This function will flush any pending mouse motion. - * - * \sa SDL_GetRelativeMouseMode() - */ -extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(int index, - SDL_bool enabled); - -/** - * \fn SDL_bool SDL_GetRelativeMouseMode(int index) - * - * \brief Query whether relative mouse mode is enabled for the currently selected mouse. - * - * \sa SDL_SetRelativeMouseMode() - */ -extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(int index); - -/** - * \fn Uint8 SDL_GetMouseState(int index, int *x, int *y) - * - * \brief Retrieve the current state of the currently selected mouse. - * - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * mouse cursor position relative to the focus window for the currently - * selected mouse. You can pass NULL for either x or y. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int index, int *x, int *y); - -/** - * \fn Uint8 SDL_GetRelativeMouseState(int index, int *x, int *y) - * - * \brief Retrieve the state of the currently selected mouse. - * - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * mouse deltas since the last call to SDL_GetRelativeMouseState(). - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int index, int *x, - int *y); - -/** - * \fn void SDL_WarpMouseInWindow(SDL_WindowID windowID, int x, int y) - * - * \brief Moves the currently selected mouse to the given position within the window. - * - * \param windowID The window to move the mouse into, or 0 for the current mouse focus - * \param x The x coordinate within the window - * \param y The y coordinate within the window - * - * \note This function generates a mouse motion event - */ -extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_WindowID windowID, - int x, int y); - -/** - * \fn SDL_Cursor *SDL_CreateCursor (const Uint8 * data, const Uint8 * mask, int w, int h, int hot_x, int hot_y) - * - * \brief Create a cursor for the currently selected mouse, using the - * specified bitmap data and mask (in MSB format). - * - * The cursor width must be a multiple of 8 bits. - * - * The cursor is created in black and white according to the following: - * data mask resulting pixel on screen - * 0 1 White - * 1 1 Black - * 0 0 Transparent - * 1 0 Inverted color if possible, black if not. - * - * \sa SDL_FreeCursor() - */ -extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data, - const Uint8 * mask, - int w, int h, int hot_x, - int hot_y); - -/** - * \fn void SDL_SetCursor(SDL_Cursor * cursor) - * - * \brief Set the active cursor for the currently selected mouse. - * - * \note The cursor must have been created for the selected mouse. - */ -extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor); - -/** - * \fn SDL_Cursor *SDL_GetCursor(void) - * - * \brief Return the active cursor for the currently selected mouse. - */ -extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void); - -/** - * \fn void SDL_FreeCursor(SDL_Cursor * cursor) - * - * \brief Frees a cursor created with SDL_CreateCursor(). - * - * \sa SDL_CreateCursor() - */ -extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); - -/** - * \fn int SDL_ShowCursor(int toggle) - * - * \brief Toggle whether or not the cursor is shown for the currently selected mouse. - * - * \param toggle 1 to show the cursor, 0 to hide it, -1 to query the current state. - * - * \return 1 if the cursor is shown, or 0 if the cursor is hidden. - */ -extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); - -/* Used as a mask when testing buttons in buttonstate - Button 1: Left mouse button - Button 2: Middle mouse button - Button 3: Right mouse button - */ - -/** - * \fn int SDL_GetCursorsNumber(int index) - * - * \brief Gets the number of cursors a pointing device supports. - * Useful for tablet users. Useful only under Windows. - * - * \param index is the index of the pointing device, which number of cursors we - * want to receive. - * - * \return the number of cursors supported by the pointing device. On Windows - * if a device is a tablet it returns a number >=1. Normal mice always return 1. - * On Linux every device reports one cursor. - */ -extern DECLSPEC int SDLCALL SDL_GetCursorsNumber(int index); - -/** - * \fn int SDL_GetCurrentCursor(int index) - * - * \brief Returns the index of the current cursor used by a specific pointing - * device. Useful only under Windows. - * - * \param index is the index of the pointing device, which cursor index we want - * to receive. - * - * \return the index of the cursor currently used by a specific pointing device. - * Always 0 under Linux. On Windows if the device isn't a tablet it returns 0. - * If the device is the tablet it returns the cursor index. - * 0 - stylus, 1 - eraser, 2 - cursor. - */ -extern DECLSPEC int SDLCALL SDL_GetCurrentCursor(int index); - -#define SDL_BUTTON(X) (1 << ((X)-1)) -#define SDL_BUTTON_LEFT 1 -#define SDL_BUTTON_MIDDLE 2 -#define SDL_BUTTON_RIGHT 3 -#define SDL_BUTTON_X1 4 -#define SDL_BUTTON_X2 5 -#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) -#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) -#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) -#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) -#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_mouse_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_mutex.h b/Externals/SDL/Include_1.3/SDL_mutex.h deleted file mode 100644 index 98f98a098a..0000000000 --- a/Externals/SDL/Include_1.3/SDL_mutex.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_mutex_h -#define _SDL_mutex_h - -/** - * \file SDL_mutex.h - * - * Functions to provide thread synchronization primitives - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* Synchronization functions which can time out return this value - if they time out. -*/ -#define SDL_MUTEX_TIMEDOUT 1 - -/* This is the timeout value which corresponds to never time out */ -#define SDL_MUTEX_MAXWAIT (~(Uint32)0) - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Mutex functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL mutex structure, defined in SDL_mutex.c */ -struct SDL_mutex; -typedef struct SDL_mutex SDL_mutex; - -/* Create a mutex, initialized unlocked */ -extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void); - -/* Lock the mutex (Returns 0, or -1 on error) */ -#define SDL_LockMutex(m) SDL_mutexP(m) -extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex * mutex); - -/* Unlock the mutex (Returns 0, or -1 on error) - It is an error to unlock a mutex that has not been locked by - the current thread, and doing so results in undefined behavior. - */ -#define SDL_UnlockMutex(m) SDL_mutexV(m) -extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex * mutex); - -/* Destroy a mutex */ -extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Semaphore functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL semaphore structure, defined in SDL_sem.c */ -struct SDL_semaphore; -typedef struct SDL_semaphore SDL_sem; - -/* Create a semaphore, initialized with value, returns NULL on failure. */ -extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value); - -/* Destroy a semaphore */ -extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem); - -/* This function suspends the calling thread until the semaphore pointed - * to by sem has a positive count. It then atomically decreases the semaphore - * count. - */ -extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem); - -/* Non-blocking variant of SDL_SemWait(), returns 0 if the wait succeeds, - SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. -*/ -extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem); - -/* Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if - the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in - the allotted time, and -1 on error. - On some platforms this function is implemented by looping with a delay - of 1 ms, and so should be avoided if possible. -*/ -extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms); - -/* Atomically increases the semaphore's count (not blocking), returns 0, - or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem); - -/* Returns the current count of the semaphore */ -extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Condition variable functions */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* The SDL condition variable structure, defined in SDL_cond.c */ -struct SDL_cond; -typedef struct SDL_cond SDL_cond; - -/* Create a condition variable */ -extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void); - -/* Destroy a condition variable */ -extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond); - -/* Restart one of the threads that are waiting on the condition variable, - returns 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond); - -/* Restart all threads that are waiting on the condition variable, - returns 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond); - -/* Wait on the condition variable, unlocking the provided mutex. - The mutex must be locked before entering this function! - The mutex is re-locked once the condition variable is signaled. - Returns 0 when it is signaled, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mut); - -/* Waits for at most 'ms' milliseconds, and returns 0 if the condition - variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not - signaled in the allotted time, and -1 on error. - On some platforms this function is implemented by looping with a delay - of 1 ms, and so should be avoided if possible. -*/ -extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond, - SDL_mutex * mutex, Uint32 ms); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_mutex_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_name.h b/Externals/SDL/Include_1.3/SDL_name.h deleted file mode 100644 index 511619af56..0000000000 --- a/Externals/SDL/Include_1.3/SDL_name.h +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef _SDLname_h_ -#define _SDLname_h_ - -#if defined(__STDC__) || defined(__cplusplus) -#define NeedFunctionPrototypes 1 -#endif - -#define SDL_NAME(X) SDL_##X - -#endif /* _SDLname_h_ */ diff --git a/Externals/SDL/Include_1.3/SDL_opengles.h b/Externals/SDL/Include_1.3/SDL_opengles.h deleted file mode 100644 index 814eb07159..0000000000 --- a/Externals/SDL/Include_1.3/SDL_opengles.h +++ /dev/null @@ -1,948 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org - */ - -/* - This is a simple file to encapsulate the OpenGL ES API headers. - Headers copied from The Kronos Group website. - http://www.khronos.org/opengles/ - */ - -#ifndef __gles_h_ -#define __gles_h_ - -/* $Id: gl.h 4533 2007-11-26 11:19:35Z markc $ */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifdef __IPHONEOS__ -#include /* Header File For The OpenGL ES Library */ -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - -#ifndef GL_APIENTRY -#define GL_APIENTRY -#endif - - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.0 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: The application programming interfaces -** established by SGI in conjunction with the Original Code are The -** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released -** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version -** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X -** Window System(R) (Version 1.3), released October 19, 1998. This software -** was created using the OpenGL(R) version 1.2.1 Sample Implementation -** published by SGI, but has not been independently verified as being -** compliant with the OpenGL(R) version 1.2.1 Specification. -*/ - - typedef unsigned int GLenum; - typedef unsigned char GLboolean; - typedef unsigned int GLbitfield; - typedef signed char GLbyte; - typedef short GLshort; - typedef int GLint; - typedef int GLsizei; - typedef unsigned char GLubyte; - typedef unsigned short GLushort; - typedef unsigned int GLuint; - typedef float GLfloat; - typedef float GLclampf; - typedef void GLvoid; - typedef int GLfixed; - typedef int GLclampx; - - typedef int GLintptr; - typedef int GLsizeiptr; - - -/*************************************************************/ - -/* OpenGL ES core versions */ -#define GL_VERSION_ES_CM_1_0 1 -#define GL_VERSION_ES_CL_1_0 1 -#define GL_VERSION_ES_CM_1_1 1 -#define GL_VERSION_ES_CL_1_1 1 - -/* ClearBufferMask */ -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 - -/* Boolean */ -#define GL_FALSE 0 -#define GL_TRUE 1 - -/* BeginMode */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 - -/* AlphaFunction */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 - -/* BlendingFactorDest */ -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 - -/* BlendingFactorSrc */ -/* GL_ZERO */ -/* GL_ONE */ -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -/* GL_SRC_ALPHA */ -/* GL_ONE_MINUS_SRC_ALPHA */ -/* GL_DST_ALPHA */ -/* GL_ONE_MINUS_DST_ALPHA */ - -/* ClipPlaneName */ -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 - -/* ColorMaterialFace */ -/* GL_FRONT_AND_BACK */ - -/* ColorMaterialParameter */ -/* GL_AMBIENT_AND_DIFFUSE */ - -/* ColorPointerType */ -/* GL_UNSIGNED_BYTE */ -/* GL_FLOAT */ -/* GL_FIXED */ - -/* CullFaceMode */ -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 - -/* DepthFunction */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* EnableCap */ -#define GL_FOG 0x0B60 -#define GL_LIGHTING 0x0B50 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_BLEND 0x0BE2 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -/* GL_LIGHT0 */ -/* GL_LIGHT1 */ -/* GL_LIGHT2 */ -/* GL_LIGHT3 */ -/* GL_LIGHT4 */ -/* GL_LIGHT5 */ -/* GL_LIGHT6 */ -/* GL_LIGHT7 */ -#define GL_POINT_SMOOTH 0x0B10 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_NORMALIZE 0x0BA1 -#define GL_RESCALE_NORMAL 0x803A -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 - -/* ErrorCode */ -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 - -/* FogMode */ -/* GL_LINEAR */ -#define GL_EXP 0x0800 -#define GL_EXP2 0x0801 - -/* FogParameter */ -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 - -/* FrontFaceDirection */ -#define GL_CW 0x0900 -#define GL_CCW 0x0901 - -/* GetPName */ -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_LINE_WIDTH 0x0B21 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_SHADE_MODEL 0x0B54 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB - -/* GetTextureParameter */ -/* GL_TEXTURE_MAG_FILTER */ -/* GL_TEXTURE_MIN_FILTER */ -/* GL_TEXTURE_WRAP_S */ -/* GL_TEXTURE_WRAP_T */ - -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 - -/* HintMode */ -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 - -/* HintTarget */ -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_FOG_HINT 0x0C54 -#define GL_GENERATE_MIPMAP_HINT 0x8192 - -/* LightModelParameter */ -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 - -/* LightParameter */ -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 - -/* DataType */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C - -/* LogicOp */ -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F - -/* MaterialFace */ -/* GL_FRONT_AND_BACK */ - -/* MaterialParameter */ -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -/* GL_AMBIENT */ -/* GL_DIFFUSE */ -/* GL_SPECULAR */ - -/* MatrixMode */ -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 - -/* NormalPointerType */ -/* GL_BYTE */ -/* GL_SHORT */ -/* GL_FLOAT */ -/* GL_FIXED */ - -/* PixelFormat */ -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A - -/* PixelStoreParameter */ -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 - -/* PixelType */ -/* GL_UNSIGNED_BYTE */ -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 - -/* ShadingModel */ -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 - -/* StencilFunction */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* StencilOp */ -/* GL_ZERO */ -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -/* GL_INVERT */ - -/* StringName */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 - -/* TexCoordPointerType */ -/* GL_SHORT */ -/* GL_FLOAT */ -/* GL_FIXED */ -/* GL_BYTE */ - -/* TextureEnvMode */ -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -/* GL_BLEND */ -#define GL_ADD 0x0104 -/* GL_REPLACE */ - -/* TextureEnvParameter */ -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 - -/* TextureEnvTarget */ -#define GL_TEXTURE_ENV 0x2300 - -/* TextureMagFilter */ -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 - -/* TextureMinFilter */ -/* GL_NEAREST */ -/* GL_LINEAR */ -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 - -/* TextureParameterName */ -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_GENERATE_MIPMAP 0x8191 - -/* TextureTarget */ -/* GL_TEXTURE_2D */ - -/* TextureUnit */ -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 - -/* TextureWrapMode */ -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F - -/* VertexPointerType */ -/* GL_SHORT */ -/* GL_FLOAT */ -/* GL_FIXED */ -/* GL_BYTE */ - -/* LightName */ -#define GL_LIGHT0 0x4000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 - -/* Buffer Objects */ -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 - -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A - -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 - -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 - -/* Texture combine + dot3 */ -#define GL_SUBTRACT 0x84E7 -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A - -#define GL_ALPHA_SCALE 0x0D1C - -#define GL_SRC0_RGB 0x8580 -#define GL_SRC1_RGB 0x8581 -#define GL_SRC2_RGB 0x8582 -#define GL_SRC0_ALPHA 0x8588 -#define GL_SRC1_ALPHA 0x8589 -#define GL_SRC2_ALPHA 0x858A - -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF - -/*------------------------------------------------------------------------* - * required OES extension tokens - *------------------------------------------------------------------------*/ - -/* OES_read_format */ -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -/* GL_OES_compressed_paletted_texture */ -#ifndef GL_OES_compressed_paletted_texture -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -/* OES_point_size_array */ -#ifndef GL_OES_point_size_array -#define GL_POINT_SIZE_ARRAY_OES 0x8B9C -#define GL_POINT_SIZE_ARRAY_TYPE_OES 0x898A -#define GL_POINT_SIZE_ARRAY_STRIDE_OES 0x898B -#define GL_POINT_SIZE_ARRAY_POINTER_OES 0x898C -#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F -#endif - -/* GL_OES_point_sprite */ -#ifndef GL_OES_point_sprite -#define GL_POINT_SPRITE_OES 0x8861 -#define GL_COORD_REPLACE_OES 0x8862 -#endif - -/*************************************************************/ - -/* Available only in Common profile */ - GL_API void GL_APIENTRY glAlphaFunc(GLenum func, GLclampf ref); - GL_API void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, - GLclampf blue, GLclampf alpha); - GL_API void GL_APIENTRY glClearDepthf(GLclampf depth); - GL_API void GL_APIENTRY glClipPlanef(GLenum plane, - const GLfloat * equation); - GL_API void GL_APIENTRY glColor4f(GLfloat red, GLfloat green, - GLfloat blue, GLfloat alpha); - GL_API void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar); - GL_API void GL_APIENTRY glFogf(GLenum pname, GLfloat param); - GL_API void GL_APIENTRY glFogfv(GLenum pname, const GLfloat * params); - GL_API void GL_APIENTRY glFrustumf(GLfloat left, GLfloat right, - GLfloat bottom, GLfloat top, - GLfloat zNear, GLfloat zFar); - GL_API void GL_APIENTRY glGetClipPlanef(GLenum pname, GLfloat eqn[4]); - GL_API void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat * params); - GL_API void GL_APIENTRY glGetLightfv(GLenum light, GLenum pname, - GLfloat * params); - GL_API void GL_APIENTRY glGetMaterialfv(GLenum face, GLenum pname, - GLfloat * params); - GL_API void GL_APIENTRY glGetTexEnvfv(GLenum env, GLenum pname, - GLfloat * params); - GL_API void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, - GLfloat * params); - GL_API void GL_APIENTRY glLightModelf(GLenum pname, GLfloat param); - GL_API void GL_APIENTRY glLightModelfv(GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glLightf(GLenum light, GLenum pname, - GLfloat param); - GL_API void GL_APIENTRY glLightfv(GLenum light, GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glLineWidth(GLfloat width); - GL_API void GL_APIENTRY glLoadMatrixf(const GLfloat * m); - GL_API void GL_APIENTRY glMaterialf(GLenum face, GLenum pname, - GLfloat param); - GL_API void GL_APIENTRY glMaterialfv(GLenum face, GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glMultMatrixf(const GLfloat * m); - GL_API void GL_APIENTRY glMultiTexCoord4f(GLenum target, GLfloat s, - GLfloat t, GLfloat r, - GLfloat q); - GL_API void GL_APIENTRY glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz); - GL_API void GL_APIENTRY glOrthof(GLfloat left, GLfloat right, - GLfloat bottom, GLfloat top, - GLfloat zNear, GLfloat zFar); - GL_API void GL_APIENTRY glPointParameterf(GLenum pname, GLfloat param); - GL_API void GL_APIENTRY glPointParameterfv(GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glPointSize(GLfloat size); - GL_API void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units); - GL_API void GL_APIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, - GLfloat z); - GL_API void GL_APIENTRY glScalef(GLfloat x, GLfloat y, GLfloat z); - GL_API void GL_APIENTRY glTexEnvf(GLenum target, GLenum pname, - GLfloat param); - GL_API void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, - GLfloat param); - GL_API void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, - const GLfloat * params); - GL_API void GL_APIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z); - -/* Available in both Common and Common-Lite profiles */ - GL_API void GL_APIENTRY glActiveTexture(GLenum texture); - GL_API void GL_APIENTRY glAlphaFuncx(GLenum func, GLclampx ref); - GL_API void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer); - GL_API void GL_APIENTRY glBindTexture(GLenum target, GLuint texture); - GL_API void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor); - GL_API void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, - const GLvoid * data, GLenum usage); - GL_API void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, - GLsizeiptr size, - const GLvoid * data); - GL_API void GL_APIENTRY glClear(GLbitfield mask); - GL_API void GL_APIENTRY glClearColorx(GLclampx red, GLclampx green, - GLclampx blue, GLclampx alpha); - GL_API void GL_APIENTRY glClearDepthx(GLclampx depth); - GL_API void GL_APIENTRY glClearStencil(GLint s); - GL_API void GL_APIENTRY glClientActiveTexture(GLenum texture); - GL_API void GL_APIENTRY glClipPlanex(GLenum plane, - const GLfixed * equation); - GL_API void GL_APIENTRY glColor4ub(GLubyte red, GLubyte green, - GLubyte blue, GLubyte alpha); - GL_API void GL_APIENTRY glColor4x(GLfixed red, GLfixed green, - GLfixed blue, GLfixed alpha); - GL_API void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, - GLboolean blue, GLboolean alpha); - GL_API void GL_APIENTRY glColorPointer(GLint size, GLenum type, - GLsizei stride, - const GLvoid * pointer); - GL_API void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, - GLenum internalformat, - GLsizei width, - GLsizei height, - GLint border, - GLsizei imageSize, - const GLvoid * data); - GL_API void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, - GLint level, - GLint xoffset, - GLint yoffset, - GLsizei width, - GLsizei height, - GLenum format, - GLsizei imageSize, - const GLvoid * data); - GL_API void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, - GLenum internalformat, GLint x, - GLint y, GLsizei width, - GLsizei height, GLint border); - GL_API void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLint x, GLint y, - GLsizei width, - GLsizei height); - GL_API void GL_APIENTRY glCullFace(GLenum mode); - GL_API void GL_APIENTRY glDeleteBuffers(GLsizei n, - const GLuint * buffers); - GL_API void GL_APIENTRY glDeleteTextures(GLsizei n, - const GLuint * textures); - GL_API void GL_APIENTRY glDepthFunc(GLenum func); - GL_API void GL_APIENTRY glDepthMask(GLboolean flag); - GL_API void GL_APIENTRY glDepthRangex(GLclampx zNear, GLclampx zFar); - GL_API void GL_APIENTRY glDisable(GLenum cap); - GL_API void GL_APIENTRY glDisableClientState(GLenum array); - GL_API void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, - GLsizei count); - GL_API void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, - GLenum type, - const GLvoid * indices); - GL_API void GL_APIENTRY glEnable(GLenum cap); - GL_API void GL_APIENTRY glEnableClientState(GLenum array); - GL_API void GL_APIENTRY glFinish(void); - GL_API void GL_APIENTRY glFlush(void); - GL_API void GL_APIENTRY glFogx(GLenum pname, GLfixed param); - GL_API void GL_APIENTRY glFogxv(GLenum pname, const GLfixed * params); - GL_API void GL_APIENTRY glFrontFace(GLenum mode); - GL_API void GL_APIENTRY glFrustumx(GLfixed left, GLfixed right, - GLfixed bottom, GLfixed top, - GLfixed zNear, GLfixed zFar); - GL_API void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean * params); - GL_API void GL_APIENTRY glGetBufferParameteriv(GLenum target, - GLenum pname, - GLint * params); - GL_API void GL_APIENTRY glGetClipPlanex(GLenum pname, GLfixed eqn[4]); - GL_API void GL_APIENTRY glGenBuffers(GLsizei n, GLuint * buffers); - GL_API void GL_APIENTRY glGenTextures(GLsizei n, GLuint * textures); - GL_API GLenum GL_APIENTRY glGetError(void); - GL_API void GL_APIENTRY glGetFixedv(GLenum pname, GLfixed * params); - GL_API void GL_APIENTRY glGetIntegerv(GLenum pname, GLint * params); - GL_API void GL_APIENTRY glGetLightxv(GLenum light, GLenum pname, - GLfixed * params); - GL_API void GL_APIENTRY glGetMaterialxv(GLenum face, GLenum pname, - GLfixed * params); - GL_API void GL_APIENTRY glGetPointerv(GLenum pname, void **params); - GL_API const GLubyte *GL_APIENTRY glGetString(GLenum name); - GL_API void GL_APIENTRY glGetTexEnviv(GLenum env, GLenum pname, - GLint * params); - GL_API void GL_APIENTRY glGetTexEnvxv(GLenum env, GLenum pname, - GLfixed * params); - GL_API void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, - GLint * params); - GL_API void GL_APIENTRY glGetTexParameterxv(GLenum target, GLenum pname, - GLfixed * params); - GL_API void GL_APIENTRY glHint(GLenum target, GLenum mode); - GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer); - GL_API GLboolean GL_APIENTRY glIsEnabled(GLenum cap); - GL_API GLboolean GL_APIENTRY glIsTexture(GLuint texture); - GL_API void GL_APIENTRY glLightModelx(GLenum pname, GLfixed param); - GL_API void GL_APIENTRY glLightModelxv(GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glLightx(GLenum light, GLenum pname, - GLfixed param); - GL_API void GL_APIENTRY glLightxv(GLenum light, GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glLineWidthx(GLfixed width); - GL_API void GL_APIENTRY glLoadIdentity(void); - GL_API void GL_APIENTRY glLoadMatrixx(const GLfixed * m); - GL_API void GL_APIENTRY glLogicOp(GLenum opcode); - GL_API void GL_APIENTRY glMaterialx(GLenum face, GLenum pname, - GLfixed param); - GL_API void GL_APIENTRY glMaterialxv(GLenum face, GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glMatrixMode(GLenum mode); - GL_API void GL_APIENTRY glMultMatrixx(const GLfixed * m); - GL_API void GL_APIENTRY glMultiTexCoord4x(GLenum target, GLfixed s, - GLfixed t, GLfixed r, - GLfixed q); - GL_API void GL_APIENTRY glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz); - GL_API void GL_APIENTRY glNormalPointer(GLenum type, GLsizei stride, - const GLvoid * pointer); - GL_API void GL_APIENTRY glOrthox(GLfixed left, GLfixed right, - GLfixed bottom, GLfixed top, - GLfixed zNear, GLfixed zFar); - GL_API void GL_APIENTRY glPixelStorei(GLenum pname, GLint param); - GL_API void GL_APIENTRY glPointParameterx(GLenum pname, GLfixed param); - GL_API void GL_APIENTRY glPointParameterxv(GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glPointSizex(GLfixed size); - GL_API void GL_APIENTRY glPolygonOffsetx(GLfixed factor, GLfixed units); - GL_API void GL_APIENTRY glPopMatrix(void); - GL_API void GL_APIENTRY glPushMatrix(void); - GL_API void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, - GLsizei height, GLenum format, - GLenum type, GLvoid * pixels); - GL_API void GL_APIENTRY glRotatex(GLfixed angle, GLfixed x, GLfixed y, - GLfixed z); - GL_API void GL_APIENTRY glSampleCoverage(GLclampf value, - GLboolean invert); - GL_API void GL_APIENTRY glSampleCoveragex(GLclampx value, - GLboolean invert); - GL_API void GL_APIENTRY glScalex(GLfixed x, GLfixed y, GLfixed z); - GL_API void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, - GLsizei height); - GL_API void GL_APIENTRY glShadeModel(GLenum mode); - GL_API void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, - GLuint mask); - GL_API void GL_APIENTRY glStencilMask(GLuint mask); - GL_API void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, - GLenum zpass); - GL_API void GL_APIENTRY glTexCoordPointer(GLint size, GLenum type, - GLsizei stride, - const GLvoid * pointer); - GL_API void GL_APIENTRY glTexEnvi(GLenum target, GLenum pname, - GLint param); - GL_API void GL_APIENTRY glTexEnvx(GLenum target, GLenum pname, - GLfixed param); - GL_API void GL_APIENTRY glTexEnviv(GLenum target, GLenum pname, - const GLint * params); - GL_API void GL_APIENTRY glTexEnvxv(GLenum target, GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glTexImage2D(GLenum target, GLint level, - GLint internalformat, GLsizei width, - GLsizei height, GLint border, - GLenum format, GLenum type, - const GLvoid * pixels); - GL_API void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, - GLint param); - GL_API void GL_APIENTRY glTexParameterx(GLenum target, GLenum pname, - GLfixed param); - GL_API void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, - const GLint * params); - GL_API void GL_APIENTRY glTexParameterxv(GLenum target, GLenum pname, - const GLfixed * params); - GL_API void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const GLvoid * pixels); - GL_API void GL_APIENTRY glTranslatex(GLfixed x, GLfixed y, GLfixed z); - GL_API void GL_APIENTRY glVertexPointer(GLint size, GLenum type, - GLsizei stride, - const GLvoid * pointer); - GL_API void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, - GLsizei height); - -/*------------------------------------------------------------------------* - * Required OES extension functions - *------------------------------------------------------------------------*/ - -/* GL_OES_read_format */ -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -/* GL_OES_compressed_paletted_texture */ -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#endif - -/* GL_OES_point_size_array */ -#ifndef GL_OES_point_size_array -#define GL_OES_point_size_array 1 - GL_API void GL_APIENTRY glPointSizePointerOES(GLenum type, GLsizei stride, - const GLvoid * pointer); -#endif - -/* GL_OES_point_sprite */ -#ifndef GL_OES_point_sprite -#define GL_OES_point_sprite 1 -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __gles_h_ */ diff --git a/Externals/SDL/Include_1.3/SDL_platform.h b/Externals/SDL/Include_1.3/SDL_platform.h deleted file mode 100644 index cc2e67fa49..0000000000 --- a/Externals/SDL/Include_1.3/SDL_platform.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* Try to get a standard set of platform defines */ - -#ifndef _SDL_platform_h -#define _SDL_platform_h - -#if defined(_AIX) -#undef __AIX__ -#define __AIX__ 1 -#endif -#if defined(__BEOS__) -#undef __BEOS__ -#define __BEOS__ 1 -#endif -#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) -#undef __BSDI__ -#define __BSDI__ 1 -#endif -#if defined(_arch_dreamcast) -#undef __DREAMCAST__ -#define __DREAMCAST__ 1 -#endif -#if defined(__FreeBSD__) || defined(__DragonFly__) -#undef __FREEBSD__ -#define __FREEBSD__ 1 -#endif -#if defined(hpux) || defined(__hpux) || defined(__hpux__) -#undef __HPUX__ -#define __HPUX__ 1 -#endif -#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) -#undef __IRIX__ -#define __IRIX__ 1 -#endif -#if defined(linux) || defined(__linux) || defined(__linux__) -#undef __LINUX__ -#define __LINUX__ 1 -#endif - -#if defined(__APPLE__) -/* lets us know what version of Mac OS X we're compiling on */ -#include "AvailabilityMacros.h" -#ifdef MAC_OS_X_VERSION_10_3 -#include "TargetConditionals.h" /* this header is in 10.3 or later */ -#if TARGET_OS_IPHONE -/* if compiling for iPhone */ -#undef __IPHONEOS__ -#define __IPHONEOS__ 1 -#undef __MACOSX__ -#else -/* if not compiling for iPhone */ -#undef __MACOSX__ -#define __MACOSX__ 1 -#endif /* TARGET_OS_IPHONE */ -#else -/* if earlier verion of Mac OS X than version 10.3 */ -#undef __MACOSX__ -#define __MACOSX__ 1 -#endif - -#endif /* defined(__APPLE__) */ - -#if defined(__NetBSD__) -#undef __NETBSD__ -#define __NETBSD__ 1 -#endif -#if defined(__OpenBSD__) -#undef __OPENBSD__ -#define __OPENBSD__ 1 -#endif -#if defined(__OS2__) -#undef __OS2__ -#define __OS2__ 1 -#endif -#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) -#undef __OSF__ -#define __OSF__ 1 -#endif -#if defined(__QNXNTO__) -#undef __QNXNTO__ -#define __QNXNTO__ 1 -#endif -#if defined(riscos) || defined(__riscos) || defined(__riscos__) -#undef __RISCOS__ -#define __RISCOS__ 1 -#endif -#if defined(__SVR4) -#undef __SOLARIS__ -#define __SOLARIS__ 1 -#endif -#if defined(WIN32) || defined(_WIN32) -#undef __WIN32__ -#define __WIN32__ 1 -#endif - -#if defined(__NDS__) -#undef __NINTENDODS__ -#define __NINTENDODS__ 1 -#endif - -#endif /* _SDL_platform_h */ diff --git a/Externals/SDL/Include_1.3/SDL_quit.h b/Externals/SDL/Include_1.3/SDL_quit.h deleted file mode 100644 index bcf6e3c457..0000000000 --- a/Externals/SDL/Include_1.3/SDL_quit.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_quit.h - * - * Include file for SDL quit event handling - */ - -#ifndef _SDL_quit_h -#define _SDL_quit_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/* - An SDL_QUITEVENT is generated when the user tries to close the application - window. If it is ignored or filtered out, the window will remain open. - If it is not ignored or filtered, it is queued normally and the window - is allowed to close. When the window is closed, screen updates will - complete, but have no effect. - - SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) - and SIGTERM (system termination request), if handlers do not already - exist, that generate SDL_QUITEVENT events as well. There is no way - to determine the cause of an SDL_QUITEVENT, but setting a signal - handler in your application will override the default generation of - quit events for that signal. -*/ - -/* There are no functions directly affecting the quit event */ -#define SDL_QuitRequested() \ - (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) - -#endif /* _SDL_quit_h */ diff --git a/Externals/SDL/Include_1.3/SDL_rect.h b/Externals/SDL/Include_1.3/SDL_rect.h deleted file mode 100644 index c3394468e0..0000000000 --- a/Externals/SDL/Include_1.3/SDL_rect.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_rect.h - * - * Header file for SDL_rect definition and management functions - */ - -#ifndef _SDL_rect_h -#define _SDL_rect_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_pixels.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/** - * \struct SDL_Rect - * - * \brief A rectangle, with the origin at the upper left. - * - * \sa SDL_RectEmpty - * \sa SDL_RectEquals - * \sa SDL_HasIntersection - * \sa SDL_IntersectRect - * \sa SDL_UnionRect - */ -typedef struct SDL_Rect -{ - int x, y; - int w, h; -} SDL_Rect; - -/** - * \def SDL_RectEmpty() - * - * \brief Returns true if the rectangle has no area. - */ -#define SDL_RectEmpty(X) (((X)->w <= 0) || ((X)->h <= 0)) - -/** - * \def SDL_RectEquals() - * - * \brief Returns true if the two rectangles are equal. - */ -#define SDL_RectEquals(A, B) (((A)->x == (B)->x) && ((A)->y == (B)->y) && \ - ((A)->w == (B)->w) && ((A)->h == (B)->h)) - -/** - * \fn SDL_bool SDL_HasIntersection(const SDL_Rect * A, const SDL_Rect * B); - * - * \brief Determine whether two rectangles intersect. - * - * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A, - const SDL_Rect * B); - -/** - * \fn SDL_bool SDL_IntersectRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result) - * - * \brief Calculate the intersection of two rectangles. - * - * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A, - const SDL_Rect * B, - SDL_Rect * result); - -/** - * \fn void SDL_UnionRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result) - * - * \brief Calculate the union of two rectangles - */ -extern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A, - const SDL_Rect * B, - SDL_Rect * result); - -/** - * \fn SDL_bool SDL_IntersectRectAndLine(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2) - * - * \brief Calculate the intersection of a rectangle and line segment. - * - * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect * - rect, int *X1, - int *Y1, int *X2, - int *Y2); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_rect_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_revision.h b/Externals/SDL/Include_1.3/SDL_revision.h deleted file mode 100644 index a7851a2f4d..0000000000 --- a/Externals/SDL/Include_1.3/SDL_revision.h +++ /dev/null @@ -1 +0,0 @@ -#define SDL_REVISION 4404 diff --git a/Externals/SDL/Include_1.3/SDL_rwops.h b/Externals/SDL/Include_1.3/SDL_rwops.h deleted file mode 100644 index 957ce2edff..0000000000 --- a/Externals/SDL/Include_1.3/SDL_rwops.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_rwops.h - * - * This file provides a general interface for SDL to read and write - * data sources. It can easily be extended to files, memory, etc. - */ - -#ifndef _SDL_rwops_h -#define _SDL_rwops_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* This is the read/write operation structure -- very basic */ - -typedef struct SDL_RWops -{ - /* Seek to 'offset' relative to whence, one of stdio's whence values: - RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END - Returns the final offset in the data source. - */ - long (SDLCALL * seek) (struct SDL_RWops * context, long offset, - int whence); - - /* Read up to 'num' objects each of size 'objsize' from the data - source to the area pointed at by 'ptr'. - Returns the number of objects read, or 0 at error or end of file. - */ - size_t(SDLCALL * read) (struct SDL_RWops * context, void *ptr, - size_t size, size_t maxnum); - - /* Write exactly 'num' objects each of size 'objsize' from the area - pointed at by 'ptr' to data source. - Returns the number of objects written, or 0 at error or end of file. - */ - size_t(SDLCALL * write) (struct SDL_RWops * context, const void *ptr, - size_t size, size_t num); - - /* Close and free an allocated SDL_RWops structure. - Returns 0 if successful or -1 on write error when flushing data. - */ - int (SDLCALL * close) (struct SDL_RWops * context); - - Uint32 type; - union - { -#ifdef __WIN32__ - struct - { - SDL_bool append; - void *h; - struct - { - void *data; - int size; - int left; - } buffer; - } win32io; -#endif -#ifdef HAVE_STDIO_H - struct - { - SDL_bool autoclose; - FILE *fp; - } stdio; -#endif - struct - { - Uint8 *base; - Uint8 *here; - Uint8 *stop; - } mem; - struct - { - void *data1; - } unknown; - } hidden; - -} SDL_RWops; - - -/* Functions to create SDL_RWops structures from various data sources */ - -extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, - const char *mode); - -#ifdef HAVE_STDIO_H -extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, - SDL_bool autoclose); -#endif - -extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); -extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, - int size); - -extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); -extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); - -#define RW_SEEK_SET 0 /* Seek from the beginning of data */ -#define RW_SEEK_CUR 1 /* Seek relative to current read point */ -#define RW_SEEK_END 2 /* Seek relative to the end of data */ - -/* Macros to easily read and write from an SDL_RWops structure */ -#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) -#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) -#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) -#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) -#define SDL_RWclose(ctx) (ctx)->close(ctx) - - -/* Read an item of the specified endianness and return in native format */ -extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); -extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); - -/* Write an item of native format to the specified endianness */ -extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); -extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_rwops_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_stdinc.h b/Externals/SDL/Include_1.3/SDL_stdinc.h deleted file mode 100644 index 1792759cc7..0000000000 --- a/Externals/SDL/Include_1.3/SDL_stdinc.h +++ /dev/null @@ -1,761 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_stdinc.h - * - * This is a general header that includes C language support - */ - -#ifndef _SDL_stdinc_h -#define _SDL_stdinc_h - -#include "SDL_config.h" - - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#if defined(STDC_HEADERS) -# include -# include -# include -#else -# if defined(HAVE_STDLIB_H) -# include -# elif defined(HAVE_MALLOC_H) -# include -# endif -# if defined(HAVE_STDDEF_H) -# include -# endif -# if defined(HAVE_STDARG_H) -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#if defined(HAVE_INTTYPES_H) -# include -#elif defined(HAVE_STDINT_H) -# include -#endif -#ifdef HAVE_CTYPE_H -# include -#endif -#ifdef HAVE_MATH_H -# include -#endif -#ifdef HAVE_ICONV_H -# include -#endif - -/* The number of elements in an array */ -#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) -#define SDL_TABLESIZE(table) SDL_arraysize(table) - -/* Basic data types */ -typedef enum SDL_bool -{ - SDL_FALSE = 0, - SDL_TRUE = 1 -} SDL_bool; - -/** - * \typedef Sint8 - * \brief A signed 8-bit integer type. - */ -typedef int8_t Sint8; -/** - * \typedef Uint8 - * \brief An unsigned 8-bit integer type. - */ -typedef uint8_t Uint8; -/** - * \typedef Sint16 - * \brief A signed 16-bit integer type. - */ -typedef int16_t Sint16; -/** - * \typedef Uint16 - * \brief An unsigned 16-bit integer type. - */ -typedef uint16_t Uint16; -/** - * \typedef Sint32 - * \brief A signed 32-bit integer type. - */ -typedef int32_t Sint32; -/** - * \typedef Uint32 - * \brief An unsigned 32-bit integer type. - */ -typedef uint32_t Uint32; - -#ifdef SDL_HAS_64BIT_TYPE -/** - * \typedef Sint64 - * \brief A signed 64-bit integer type. - * \warning On platforms without any sort of 64-bit datatype, this is equivalent to Sint32! - */ -typedef int64_t Sint64; -/** - * \typedef Uint64 - * \brief An unsigned 64-bit integer type. - * \warning On platforms without any sort of 64-bit datatype, this is equivalent to Uint32! - */ -typedef uint64_t Uint64; -#else -/* This is really just a hack to prevent the compiler from complaining */ -typedef Sint32 Sint64; -typedef Uint32 Uint64; -#endif - -/* Make sure the types really have the right sizes */ -#define SDL_COMPILE_TIME_ASSERT(name, x) \ - typedef int SDL_dummy_ ## name[(x) * 2 - 1] -#ifndef DOXYGEN_SHOULD_IGNORE_THIS -SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); -SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); -SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); -SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); -SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); -SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); -#ifndef __NINTENDODS__ /* TODO: figure out why the following happens: - include/SDL_stdinc.h:150: error: size of array 'SDL_dummy_uint64' is negative - include/SDL_stdinc.h:151: error: size of array 'SDL_dummy_sint64' is negative */ -SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); -SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); -#endif -#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ - -/* Check to make sure enums are the size of ints, for structure packing. - For both Watcom C/C++ and Borland C/C++ the compiler option that makes - enums having the size of an int must be enabled. - This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). -*/ -/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ -#ifdef __MWERKS__ -#pragma enumsalwaysint on -#endif - -#ifndef DOXYGEN_SHOULD_IGNORE_THIS -#ifndef __NINTENDODS__ /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ -typedef enum -{ - DUMMY_ENUM_VALUE -} SDL_DUMMY_ENUM; - -SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); -#endif -#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -#ifdef HAVE_MALLOC -#define SDL_malloc malloc -#else -extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); -#endif - -#ifdef HAVE_CALLOC -#define SDL_calloc calloc -#else -extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); -#endif - -#ifdef HAVE_REALLOC -#define SDL_realloc realloc -#else -extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); -#endif - -#ifdef HAVE_FREE -#define SDL_free free -#else -extern DECLSPEC void SDLCALL SDL_free(void *mem); -#endif - -#if defined(HAVE_ALLOCA) && !defined(alloca) -# if defined(HAVE_ALLOCA_H) -# include -# elif defined(__GNUC__) -# define alloca __builtin_alloca -# elif defined(_MSC_VER) -# include -# define alloca _alloca -# elif defined(__WATCOMC__) -# include -# elif defined(__BORLANDC__) -# include -# elif defined(__DMC__) -# include -# elif defined(__AIX__) -#pragma alloca -# elif defined(__MRC__) -void *alloca(unsigned); -# else -char *alloca(); -# endif -#endif -#ifdef HAVE_ALLOCA -#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) -#define SDL_stack_free(data) -#else -#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) -#define SDL_stack_free(data) SDL_free(data) -#endif - -#ifdef HAVE_GETENV -#define SDL_getenv getenv -#else -extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); -#endif - -#ifdef HAVE_PUTENV -#define SDL_putenv putenv -#else -extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); -#endif - -#ifdef HAVE_QSORT -#define SDL_qsort qsort -#else -extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, - int (*compare) (const void *, - const void *)); -#endif - -#ifdef HAVE_ABS -#define SDL_abs abs -#else -#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) -#endif - -#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) -#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) - -#ifdef HAVE_CTYPE_H -#define SDL_isdigit(X) isdigit(X) -#define SDL_isspace(X) isspace(X) -#define SDL_toupper(X) toupper(X) -#define SDL_tolower(X) tolower(X) -#else -#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) -#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) -#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) -#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) -#endif - -#ifdef HAVE_MEMSET -#define SDL_memset memset -#else -extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len); -#endif -#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) -#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) - -#if defined(__GNUC__) && defined(i386) -#define SDL_memset4(dst, val, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; stosl\n\t" \ - : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ - : "0" (dst), "1" (val), "2" ((Uint32)(len)) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memset4 -#define SDL_memset4(dst, val, len) \ -do { \ - unsigned _count = (len); \ - unsigned _n = (_count + 3) / 4; \ - Uint32 *_p = (Uint32 *)(dst); \ - Uint32 _val = (val); \ - switch (_count % 4) { \ - case 0: do { *_p++ = _val; \ - case 3: *_p++ = _val; \ - case 2: *_p++ = _val; \ - case 1: *_p++ = _val; \ - } while ( --_n ); \ - } \ -} while(0) -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl\n\t" \ - "testb $2,%b4\n\t" \ - "je 1f\n\t" \ - "movsw\n" \ - "1:\ttestb $1,%b4\n\t" \ - "je 2f\n\t" \ - "movsb\n" \ - "2:" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy -#ifdef HAVE_MEMCPY -#define SDL_memcpy memcpy -#elif defined(HAVE_BCOPY) -#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) -#else -extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, - size_t len); -#endif -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy4(dst, src, len) \ -do { \ - int ecx, edi, esi; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl" \ - : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ - : "0" ((unsigned)(len)), "1" (dst), "2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy4 -#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) -#endif - -#if defined(__GNUC__) && defined(i386) -#define SDL_revcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - char *dstp = (char *)(dst); \ - char *srcp = (char *)(src); \ - int n = (len); \ - if ( n >= 4 ) { \ - __asm__ __volatile__ ( \ - "std\n\t" \ - "rep ; movsl\n\t" \ - "cld\n\t" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" (n >> 2), \ - "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ - : "memory" ); \ - } \ - switch (n & 3) { \ - case 3: dstp[2] = srcp[2]; \ - case 2: dstp[1] = srcp[1]; \ - case 1: dstp[0] = srcp[0]; \ - break; \ - default: \ - break; \ - } \ -} while(0) -#endif -#ifndef SDL_revcpy -extern DECLSPEC void *SDLCALL SDL_revcpy(void *dst, const void *src, - size_t len); -#endif - -#ifdef HAVE_MEMMOVE -#define SDL_memmove memmove -#elif defined(HAVE_BCOPY) -#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) -#else -#define SDL_memmove(dst, src, len) \ -do { \ - if ( dst < src ) { \ - SDL_memcpy(dst, src, len); \ - } else { \ - SDL_revcpy(dst, src, len); \ - } \ -} while(0) -#endif - -#ifdef HAVE_MEMCMP -#define SDL_memcmp memcmp -#else -extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, - size_t len); -#endif - -#ifdef HAVE_STRLEN -#define SDL_strlen strlen -#else -extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); -#endif - -#ifdef HAVE_WCSLEN -#define SDL_wcslen wcslen -#else -#if !defined(wchar_t) && defined(__NINTENDODS__) -#define wchar_t short /* TODO: figure out why libnds doesn't have this */ -#endif -extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t * string); -#endif - -#ifdef HAVE_STRLCPY -#define SDL_strlcpy strlcpy -#else -extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, - size_t maxlen); -#endif - -#ifdef HAVE_STRLCAT -#define SDL_strlcat strlcat -#else -extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, - size_t maxlen); -#endif - -#ifdef HAVE_STRDUP -#define SDL_strdup strdup -#else -extern DECLSPEC char *SDLCALL SDL_strdup(const char *string); -#endif - -#ifdef HAVE__STRREV -#define SDL_strrev _strrev -#else -extern DECLSPEC char *SDLCALL SDL_strrev(char *string); -#endif - -#ifdef HAVE__STRUPR -#define SDL_strupr _strupr -#else -extern DECLSPEC char *SDLCALL SDL_strupr(char *string); -#endif - -#ifdef HAVE__STRLWR -#define SDL_strlwr _strlwr -#else -extern DECLSPEC char *SDLCALL SDL_strlwr(char *string); -#endif - -#ifdef HAVE_STRCHR -#define SDL_strchr strchr -#elif defined(HAVE_INDEX) -#define SDL_strchr index -#else -extern DECLSPEC char *SDLCALL SDL_strchr(const char *string, int c); -#endif - -#ifdef HAVE_STRRCHR -#define SDL_strrchr strrchr -#elif defined(HAVE_RINDEX) -#define SDL_strrchr rindex -#else -extern DECLSPEC char *SDLCALL SDL_strrchr(const char *string, int c); -#endif - -#ifdef HAVE_STRSTR -#define SDL_strstr strstr -#else -extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, - const char *needle); -#endif - -#ifdef HAVE_ITOA -#define SDL_itoa itoa -#else -#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) -#endif - -#ifdef HAVE__LTOA -#define SDL_ltoa _ltoa -#else -extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *string, int radix); -#endif - -#ifdef HAVE__UITOA -#define SDL_uitoa _uitoa -#else -#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) -#endif - -#ifdef HAVE__ULTOA -#define SDL_ultoa _ultoa -#else -extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *string, - int radix); -#endif - -#ifdef HAVE_STRTOL -#define SDL_strtol strtol -#else -extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, - int base); -#endif - -#ifdef HAVE_STRTOUL -#define SDL_strtoul strtoul -#else -extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, - char **endp, int base); -#endif - -#ifdef SDL_HAS_64BIT_TYPE - -#ifdef HAVE__I64TOA -#define SDL_lltoa _i64toa -#else -extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *string, - int radix); -#endif - -#ifdef HAVE__UI64TOA -#define SDL_ulltoa _ui64toa -#else -extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *string, - int radix); -#endif - -#ifdef HAVE_STRTOLL -#define SDL_strtoll strtoll -#else -extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, - int base); -#endif - -#ifdef HAVE_STRTOULL -#define SDL_strtoull strtoull -#else -extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, - int base); -#endif - -#endif /* SDL_HAS_64BIT_TYPE */ - -#ifdef HAVE_STRTOD -#define SDL_strtod strtod -#else -extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); -#endif - -#ifdef HAVE_ATOI -#define SDL_atoi atoi -#else -#define SDL_atoi(X) SDL_strtol(X, NULL, 0) -#endif - -#ifdef HAVE_ATOF -#define SDL_atof atof -#else -#define SDL_atof(X) SDL_strtod(X, NULL) -#endif - -#ifdef HAVE_STRCMP -#define SDL_strcmp strcmp -#else -extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); -#endif - -#ifdef HAVE_STRNCMP -#define SDL_strncmp strncmp -#else -extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, - size_t maxlen); -#endif - -#ifdef HAVE_STRCASECMP -#define SDL_strcasecmp strcasecmp -#elif defined(HAVE__STRICMP) -#define SDL_strcasecmp _stricmp -#else -extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, - const char *str2); -#endif - -#ifdef HAVE_STRNCASECMP -#define SDL_strncasecmp strncasecmp -#elif defined(HAVE__STRNICMP) -#define SDL_strncasecmp _strnicmp -#else -extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, - const char *str2, size_t maxlen); -#endif - -#ifdef HAVE_SSCANF -#define SDL_sscanf sscanf -#else -extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, - ...); -#endif - -#ifdef HAVE_SNPRINTF -#define SDL_snprintf snprintf -#else -extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, - const char *fmt, ...); -#endif - -#ifdef HAVE_VSNPRINTF -#define SDL_vsnprintf vsnprintf -#else -extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, - const char *fmt, va_list ap); -#endif - -#ifndef M_PI -#define M_PI 3.14159265358979323846264338327950288 /* pi */ -#endif - -#ifdef HAVE_CEIL -#define SDL_ceil ceil -#else -#define SDL_ceil(x) ((double)(int)((x)+0.5)) -#endif - -#ifdef HAVE_COPYSIGN -#define SDL_copysign copysign -#else -extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); -#endif - -#ifdef HAVE_COS -#define SDL_cos cos -#else -extern DECLSPEC double SDLCALL SDL_cos(double x); -#endif - -#ifdef HAVE_COSF -#define SDL_cosf cosf -#else -#define SDL_cosf(x) (float)SDL_cos((double)x) -#endif - -#ifdef HAVE_FABS -#define SDL_fabs fabs -#else -extern DECLSPEC double SDLCALL SDL_fabs(double x); -#endif - -#ifdef HAVE_FLOOR -#define SDL_floor floor -#else -extern DECLSPEC double SDLCALL SDL_floor(double x); -#endif - -#ifdef HAVE_LOG -#define SDL_log log -#else -extern DECLSPEC double SDLCALL SDL_log(double x); -#endif - -#ifdef HAVE_POW -#define SDL_pow pow -#else -extern DECLSPEC double SDLCALL SDL_pow(double x, double y); -#endif - -#ifdef HAVE_SCALBN -#define SDL_scalbn scalbn -#else -extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); -#endif - -#ifdef HAVE_SIN -#define SDL_sin sin -#else -extern DECLSPEC double SDLCALL SDL_sin(double x); -#endif - -#ifdef HAVE_SINF -#define SDL_sinf sinf -#else -#define SDL_sinf(x) (float)SDL_sin((double)x) -#endif - -#ifdef HAVE_SQRT -#define SDL_sqrt sqrt -#else -extern DECLSPEC double SDLCALL SDL_sqrt(double x); -#endif - -/* The SDL implementation of iconv() returns these error codes */ -#define SDL_ICONV_ERROR (size_t)-1 -#define SDL_ICONV_E2BIG (size_t)-2 -#define SDL_ICONV_EILSEQ (size_t)-3 -#define SDL_ICONV_EINVAL (size_t)-4 - -#ifdef HAVE_ICONV -#define SDL_iconv_t iconv_t -#define SDL_iconv_open iconv_open -#define SDL_iconv_close iconv_close -#else -typedef struct _SDL_iconv_t *SDL_iconv_t; -extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, - const char *fromcode); -extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); -#endif -extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, - size_t * inbytesleft, char **outbuf, - size_t * outbytesleft); -/* This function converts a string between encodings in one pass, returning a - string that must be freed with SDL_free() or NULL on error. -*/ -extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, - const char *fromcode, - const char *inbuf, - size_t inbytesleft); -#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_stdinc_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_surface.h b/Externals/SDL/Include_1.3/SDL_surface.h deleted file mode 100644 index 3a4abba939..0000000000 --- a/Externals/SDL/Include_1.3/SDL_surface.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_surface.h - * - * Header file for SDL_surface definition and management functions - */ - -#ifndef _SDL_surface_h -#define _SDL_surface_h - -#include "SDL_stdinc.h" -#include "SDL_pixels.h" -#include "SDL_rect.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* These are the currently supported flags for the SDL_surface */ -/* Used internally (read-only) */ -#define SDL_PREALLOC 0x00000001 /* Surface uses preallocated memory */ -#define SDL_RLEACCEL 0x00000002 /* Surface is RLE encoded */ - -/* Evaluates to true if the surface needs to be locked before access */ -#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0) - -/** - * \struct SDL_Surface - * - * \brief A collection of pixels used in software blitting - * - * \note This structure should be treated as read-only, except for 'pixels', - * which, if not NULL, contains the raw pixel data for the surface. - */ -typedef struct SDL_Surface -{ - Uint32 flags; /**< Read-only */ - SDL_PixelFormat *format; /**< Read-only */ - int w, h; /**< Read-only */ - int pitch; /**< Read-only */ - void *pixels; /**< Read-write */ - - /* Application data associated with the surfade */ - void *userdata; /**< Read-write */ - - /* information needed for surfaces requiring locks */ - int locked; /**< Read-only */ - void *lock_data; /**< Read-only */ - - /* clipping information */ - SDL_Rect clip_rect; /**< Read-only */ - - /* info for fast blit mapping to other surfaces */ - struct SDL_BlitMap *map; /**< Private */ - - /* format version, bumped at every change to invalidate blit maps */ - unsigned int format_version; /**< Private */ - - /* Reference count -- used when freeing surface */ - int refcount; /**< Read-mostly */ -} SDL_Surface; - -/** - * \typedef SDL_blit - * - * \brief The type of function used for surface blitting functions - */ -typedef int (*SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, - struct SDL_Surface * dst, SDL_Rect * dstrect); - -/* - * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) - * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. - * If the depth is greater than 8 bits, the pixel format is set using the - * flags '[RGB]mask'. - * If the function runs out of memory, it will return NULL. - * - * The 'flags' are obsolete and should be set to 0. - */ -extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface - (Uint32 flags, int width, int height, int depth, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); -extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, - int width, - int height, - int depth, - int pitch, - Uint32 Rmask, - Uint32 Gmask, - Uint32 Bmask, - Uint32 Amask); -extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface); - -/** - * \fn int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette) - * - * \brief Set the palette used by a surface. - * - * \return 0, or -1 if the surface format doesn't use a palette. - * - * \note A single palette can be shared with many surfaces. - */ -extern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface, - SDL_Palette * palette); - -/* - * SDL_LockSurface() sets up a surface for directly accessing the pixels. - * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write - * to and read from 'surface->pixels', using the pixel format stored in - * 'surface->format'. Once you are done accessing the surface, you should - * use SDL_UnlockSurface() to release it. - * - * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates - * to 0, then you can read and write to the surface at any time, and the - * pixel format of the surface will not change. - * - * No operating system or library calls should be made between lock/unlock - * pairs, as critical system locks may be held during this time. - * - * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. - */ -extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface); -extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface); - -/* - * Load a surface from a seekable SDL data source (memory or file.) - * If 'freesrc' is non-zero, the source will be closed after being read. - * Returns the new surface, or NULL if there was an error. - * The new surface should be freed with SDL_FreeSurface(). - */ -extern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src, - int freesrc); - -/* Convenience macro -- load a surface from a file */ -#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) - -/* - * Save a surface to a seekable SDL data source (memory or file.) - * If 'freedst' is non-zero, the source will be closed after being written. - * Returns 0 if successful or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SaveBMP_RW - (SDL_Surface * surface, SDL_RWops * dst, int freedst); - -/* Convenience macro -- save a surface to a file */ -#define SDL_SaveBMP(surface, file) \ - SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) - -/* - * \fn int SDL_SetSurfaceRLE(SDL_Surface *surface, int flag) - * - * \brief Sets the RLE acceleration hint for a surface. - * - * \return 0 on success, or -1 if the surface is not valid - * - * \note If RLE is enabled, colorkey and alpha blending blits are much faster, - * but the surface must be locked before directly accessing the pixels. - */ -extern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface, - int flag); - -/* - * \fn int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key) - * - * \brief Sets the color key (transparent pixel) in a blittable surface. - * - * \param surface The surface to update - * \param flag Non-zero to enable colorkey and 0 to disable colorkey - * \param key The transparent pixel in the native surface format - * - * \return 0 on success, or -1 if the surface is not valid - */ -extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface, - Uint32 flag, Uint32 key); - -/** - * \fn int SDL_SetSurfaceColorMod(SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b) - * - * \brief Set an additional color value used in blit operations - * - * \param surface The surface to update - * \param r The red source color value multiplied into blit operations - * \param g The green source color value multiplied into blit operations - * \param b The blue source color value multiplied into blit operations - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_GetSurfaceColorMod() - */ -extern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface, - Uint8 r, Uint8 g, Uint8 b); - - -/** - * \fn int SDL_GetSurfaceColorMod(SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b) - * - * \brief Get the additional color value used in blit operations - * - * \param surface The surface to query - * \param r A pointer filled in with the source red color value - * \param g A pointer filled in with the source green color value - * \param b A pointer filled in with the source blue color value - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_SetSurfaceColorMod() - */ -extern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface, - Uint8 * r, Uint8 * g, - Uint8 * b); - -/** - * \fn int SDL_SetSurfaceAlphaMod(SDL_Surface *surface, Uint8 alpha) - * - * \brief Set an additional alpha value used in blit operations - * - * \param surface The surface to update - * \param alpha The source alpha value multiplied into blit operations. - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_GetSurfaceAlphaMod() - */ -extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface, - Uint8 alpha); - -/** - * \fn int SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Uint8 *alpha) - * - * \brief Get the additional alpha value used in blit operations - * - * \param surface The surface to query - * \param alpha A pointer filled in with the source alpha value - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_SetSurfaceAlphaMod() - */ -extern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface, - Uint8 * alpha); - -/** - * \fn int SDL_SetSurfaceBlendMode(SDL_Surface *surface, int blendMode) - * - * \brief Set the blend mode used for blit operations - * - * \param surface The surface to update - * \param blendMode SDL_TextureBlendMode to use for blit blending - * - * \return 0 on success, or -1 if the parameters are not valid - * - * \sa SDL_GetSurfaceBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface, - int blendMode); - -/** - * \fn int SDL_GetSurfaceBlendMode(SDL_Surface *surface, int *blendMode) - * - * \brief Get the blend mode used for blit operations - * - * \param surface The surface to query - * \param blendMode A pointer filled in with the current blend mode - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_SetSurfaceBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface, - int *blendMode); - -/** - * \fn int SDL_SetSurfaceScaleMode(SDL_Surface *surface, int scaleMode) - * - * \brief Set the scale mode used for blit operations - * - * \param surface The surface to update - * \param scaleMode SDL_TextureScaleMode to use for blit scaling - * - * \return 0 on success, or -1 if the surface is not valid or the scale mode is not supported - * - * \note If the scale mode is not supported, the closest supported mode is chosen. Currently only SDL_TEXTURESCALEMODE_FAST is supported on surfaces. - * - * \sa SDL_GetSurfaceScaleMode() - */ -extern DECLSPEC int SDLCALL SDL_SetSurfaceScaleMode(SDL_Surface * surface, - int scaleMode); - -/** - * \fn int SDL_GetSurfaceScaleMode(SDL_Surface *surface, int *scaleMode) - * - * \brief Get the scale mode used for blit operations - * - * \param surface The surface to query - * \param scaleMode A pointer filled in with the current scale mode - * - * \return 0 on success, or -1 if the surface is not valid - * - * \sa SDL_SetSurfaceScaleMode() - */ -extern DECLSPEC int SDLCALL SDL_GetSurfaceScaleMode(SDL_Surface * surface, - int *scaleMode); - -/* - * Sets the clipping rectangle for the destination surface in a blit. - * - * If the clip rectangle is NULL, clipping will be disabled. - * If the clip rectangle doesn't intersect the surface, the function will - * return SDL_FALSE and blits will be completely clipped. Otherwise the - * function returns SDL_TRUE and blits to the surface will be clipped to - * the intersection of the surface area and the clipping rectangle. - * - * Note that blits are automatically clipped to the edges of the source - * and destination surfaces. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, - const SDL_Rect * rect); - -/* - * Gets the clipping rectangle for the destination surface in a blit. - * 'rect' must be a pointer to a valid rectangle which will be filled - * with the correct values. - */ -extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, - SDL_Rect * rect); - -/* - * Creates a new surface of the specified format, and then copies and maps - * the given surface to it so the blit of the converted surface will be as - * fast as possible. If this function fails, it returns NULL. - * - * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those - * semantics. You can also pass SDL_RLEACCEL in the flags parameter and - * SDL will try to RLE accelerate colorkey and alpha blits in the resulting - * surface. - * - * This function is used internally by SDL_DisplayFormat(). - */ -extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface - (SDL_Surface * src, SDL_PixelFormat * fmt, Uint32 flags); - -/* - * This function draws a point with 'color' - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_DrawPoint - (SDL_Surface * dst, int x, int y, Uint32 color); - -/* - * This function blends a point with an RGBA value - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_BlendPoint - (SDL_Surface * dst, int x, int y, int blendMode, - Uint8 r, Uint8 g, Uint8 b, Uint8 a); - -/* - * This function draws a line with 'color' - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_DrawLine - (SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color); - -/* - * This function blends an RGBA value along a line - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_BlendLine - (SDL_Surface * dst, int x1, int y1, int x2, int y2, int blendMode, - Uint8 r, Uint8 g, Uint8 b, Uint8 a); - -/* - * This function performs a fast fill of the given rectangle with 'color' - * The given rectangle is clipped to the destination surface clip area - * and the final fill rectangle is saved in the passed in pointer. - * If 'dstrect' is NULL, the whole surface will be filled with 'color' - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_FillRect - (SDL_Surface * dst, SDL_Rect * dstrect, Uint32 color); - -/* - * This function blends an RGBA value into the given rectangle. - * The given rectangle is clipped to the destination surface clip area - * and the final fill rectangle is saved in the passed in pointer. - * If 'dstrect' is NULL, the whole surface will be filled with 'color' - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_BlendRect - (SDL_Surface * dst, SDL_Rect * dstrect, int blendMode, Uint8 r, Uint8 g, - Uint8 b, Uint8 a); - -/* - * This performs a fast blit from the source surface to the destination - * surface. It assumes that the source and destination rectangles are - * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire - * surface (src or dst) is copied. The final blit rectangles are saved - * in 'srcrect' and 'dstrect' after all clipping is performed. - * If the blit is successful, it returns 0, otherwise it returns -1. - * - * The blit function should not be called on a locked surface. - * - * The blit semantics for surfaces with and without alpha and colorkey - * are defined as follows: - * - * RGBA->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using alpha-channel). - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy RGB. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value); - * set destination alpha to opaque. - * SDL_SRCALPHA not set: - * copy RGB, set destination alpha to source per-surface alpha value. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * RGBA->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source alpha channel) the RGB values; - * leave destination alpha untouched. [Note: is this correct?] - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy all of RGBA to the destination. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value). - * SDL_SRCALPHA not set: - * copy RGB. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * If either of the surfaces were in video memory, and the blit returns -2, - * the video memory was lost, so it should be reloaded with artwork and - * re-blitted: - while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { - while ( SDL_LockSurface(image) < 0 ) - Sleep(10); - -- Write image pixels to image->pixels -- - SDL_UnlockSurface(image); - } - * This happens under DirectX 5.0 when the system switches away from your - * fullscreen application. The lock will also fail until you have access - * to the video memory again. - */ -/* You should call SDL_BlitSurface() unless you know exactly how SDL - blitting works internally and how to use the other blit functions. -*/ -#define SDL_BlitSurface SDL_UpperBlit - -/* This is the public blit function, SDL_BlitSurface(), and it performs - rectangle validation and clipping before passing it to SDL_LowerBlit() -*/ -extern DECLSPEC int SDLCALL SDL_UpperBlit - (SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect); -/* This is a semi-private blit function and it performs low-level surface - blitting only. -*/ -extern DECLSPEC int SDLCALL SDL_LowerBlit - (SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect); - -/** - * \fn int SDL_SoftStretch(SDL_Surface * src, const SDL_Rect * srcrect, SDL_Surface * dst, const SDL_Rect * dstrect) - * - * \brief Perform a fast, low quality, stretch blit between two surfaces of the same pixel format. - * - * \note This function uses a static buffer, and is not thread-safe. - */ -extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src, - const SDL_Rect * srcrect, - SDL_Surface * dst, - const SDL_Rect * dstrect); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_surface_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_syswm.h b/Externals/SDL/Include_1.3/SDL_syswm.h deleted file mode 100644 index 483118cf86..0000000000 --- a/Externals/SDL/Include_1.3/SDL_syswm.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_syswm.h - * - * Include file for SDL custom system window manager hooks - */ - -#ifndef _SDL_syswm_h -#define _SDL_syswm_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_video.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* Your application has access to a special type of event 'SDL_SYSWMEVENT', - which contains window-manager specific information and arrives whenever - an unhandled window event occurs. This event is ignored by default, but - you can enable it with SDL_EventState() -*/ -#ifdef SDL_PROTOTYPES_ONLY -struct SDL_SysWMinfo; -#else - -/* This is the structure for custom window manager events */ -#if defined(SDL_VIDEO_DRIVER_X11) -#if defined(__APPLE__) && defined(__MACH__) -/* conflicts with Quickdraw.h */ -#define Cursor X11Cursor -#endif - -#include -#include - -#if defined(__APPLE__) && defined(__MACH__) -/* matches the re-define above */ -#undef Cursor -#endif - -/* These are the various supported subsystems under UNIX */ -typedef enum -{ - SDL_SYSWM_X11 -} SDL_SYSWM_TYPE; - -/* The UNIX custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union - { - XEvent xevent; - } event; -}; - -/* The UNIX custom window manager information structure. - When this structure is returned, it holds information about which - low level system it is using, and will be one of SDL_SYSWM_TYPE. - */ -struct SDL_SysWMinfo -{ - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union - { - struct - { - Display *display; /* The X11 display */ - Window window; /* The X11 display window */ - /* These locking functions should be called around - any X11 functions using the display variable. - They lock the event thread, so should not be - called around event functions or from event filters. - */ - void (*lock_func) (void); - void (*unlock_func) (void); - - /* Introduced in SDL 1.0.2 */ - Window fswindow; /* The X11 fullscreen window */ - Window wmwindow; /* The X11 managed input window */ - } x11; - } info; -}; - -#elif defined(SDL_VIDEO_DRIVER_NANOX) -#include - -/* The generic custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - int data; -}; - -/* The windows custom window manager information structure */ -struct SDL_SysWMinfo -{ - SDL_version version; - GR_WINDOW_ID window; /* The display window */ -}; - -#elif defined(SDL_VIDEO_DRIVER_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - -/* The windows custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - HWND hwnd; /* The window for the message */ - UINT msg; /* The type of message */ - WPARAM wParam; /* WORD message parameter */ - LPARAM lParam; /* LONG message parameter */ -}; - -/* The windows custom window manager information structure */ -struct SDL_SysWMinfo -{ - SDL_version version; - HWND window; /* The Win32 display window */ -}; - -#elif defined(SDL_VIDEO_DRIVER_RISCOS) - -/* RISC OS custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - int eventCode; /* The window for the message */ - int pollBlock[64]; -}; - -/* The RISC OS custom window manager information structure */ -struct SDL_SysWMinfo -{ - SDL_version version; - int wimpVersion; /* Wimp version running under */ - int taskHandle; /* The RISC OS task handle */ - int window; /* The RISC OS display window */ -}; - -#elif defined(SDL_VIDEO_DRIVER_PHOTON) -#include -#include - -/* The QNX custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - int data; -}; - -/* The QNX custom window manager information structure */ -struct SDL_SysWMinfo -{ - SDL_version version; - int data; -}; - -#else - -/* The generic custom event structure */ -struct SDL_SysWMmsg -{ - SDL_version version; - int data; -}; - -/* The generic custom window manager information structure */ -struct SDL_SysWMinfo -{ - SDL_version version; - int data; -}; - -#endif /* video driver type */ - -#endif /* SDL_PROTOTYPES_ONLY */ - -typedef struct SDL_SysWMinfo SDL_SysWMinfo; - -/* Function prototypes */ -/** - * \fn SDL_bool SDL_GetWindowWMInfo (SDL_WindowID windowID, SDL_SysWMinfo * info) - * - * \brief This function allows access to driver-dependent window information. - * - * \param windowID The window about which information is being requested - * \param info This structure must be initialized with the SDL version, and is then filled in with information about the given window. - * - * \return SDL_TRUE if the function is implemented and the version member of the 'info' struct is valid, SDL_FALSE otherwise. - * - * You typically use this function like this: - * \code - * SDL_SysWMInfo info; - * SDL_VERSION(&info.version); - * if ( SDL_GetWindowWMInfo(&info) ) { ... } - * \endcode - */ -extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_WindowID windowID, - SDL_SysWMinfo * info); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_syswm_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_thread.h b/Externals/SDL/Include_1.3/SDL_thread.h deleted file mode 100644 index 1a8b13f2e8..0000000000 --- a/Externals/SDL/Include_1.3/SDL_thread.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_thread_h -#define _SDL_thread_h - -/** - * \file SDL_thread.h - * - * Header for the SDL thread management routines - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/* Thread synchronization primitives */ -#include "SDL_mutex.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* The SDL thread structure, defined in SDL_thread.c */ -struct SDL_Thread; -typedef struct SDL_Thread SDL_Thread; - -/* Create a thread */ -#if (defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__) -/* - We compile SDL into a DLL on OS/2. This means, that it's the DLL which - creates a new thread for the calling process with the SDL_CreateThread() - API. There is a problem with this, that only the RTL of the SDL.DLL will - be initialized for those threads, and not the RTL of the calling application! - To solve this, we make a little hack here. - We'll always use the caller's _beginthread() and _endthread() APIs to - start a new thread. This way, if it's the SDL.DLL which uses this API, - then the RTL of SDL.DLL will be used to create the new thread, and if it's - the application, then the RTL of the application will be used. - So, in short: - Always use the _beginthread() and _endthread() of the calling runtime library! -*/ -#define SDL_PASSED_BEGINTHREAD_ENDTHREAD -#ifndef _WIN32_WCE -#include /* This has _beginthread() and _endthread() defined! */ -#endif - -#ifdef __OS2__ -typedef int (*pfnSDL_CurrentBeginThread) (void (*func) (void *), void *, - unsigned, void *arg); -typedef void (*pfnSDL_CurrentEndThread) (void); -#elif __GNUC__ -typedef unsigned long (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned - (__stdcall * - func) (void *), - void *arg, - unsigned, - unsigned - *threadID); -typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); -#else -typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned (__stdcall * - func) (void - *), - void *arg, unsigned, - unsigned *threadID); -typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); -#endif - -extern DECLSPEC SDL_Thread *SDLCALL -SDL_CreateThread(int (SDLCALL * f) (void *), void *data, - pfnSDL_CurrentBeginThread pfnBeginThread, - pfnSDL_CurrentEndThread pfnEndThread); - -#ifdef __OS2__ -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) -#elif defined(_WIN32_WCE) -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) -#else -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) -#endif -#else -extern DECLSPEC SDL_Thread *SDLCALL -SDL_CreateThread(int (SDLCALL * fn) (void *), void *data); -#endif - -/* Get the 32-bit thread identifier for the current thread */ -extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); - -/* Get the 32-bit thread identifier for the specified thread, - equivalent to SDL_ThreadID() if the specified thread is NULL. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread * thread); - -/* Wait for a thread to finish. - The return code for the thread function is placed in the area - pointed to by 'status', if 'status' is not NULL. - */ -extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); - -/* This function is here for binary compatibility with legacy apps, but - in SDL 1.3 and later, it's a no-op. You cannot forcibly kill a thread - in a safe manner on many platforms. You should instead find a way to - alert your thread that it is time to terminate, and then have it gracefully - exit on its own. Do not ever call this function! - */ -extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread * thread); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_thread_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_timer.h b/Externals/SDL/Include_1.3/SDL_timer.h deleted file mode 100644 index 75901d7311..0000000000 --- a/Externals/SDL/Include_1.3/SDL_timer.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_timer_h -#define _SDL_timer_h - -/** - * \file SDL_timer.h - * - * Header for the SDL time management routines - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* This is the OS scheduler timeslice, in milliseconds */ -#define SDL_TIMESLICE 10 - -/* This is the maximum resolution of the SDL timer on all platforms */ -#define TIMER_RESOLUTION 10 /* Experimentally determined */ - -/* Get the number of milliseconds since the SDL library initialization. - * Note that this value wraps if the program runs for more than ~49 days. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); - -/* Wait a specified number of milliseconds before returning */ -extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); - -/* Function prototype for the timer callback function */ -typedef Uint32(SDLCALL * SDL_TimerCallback) (Uint32 interval); - -/* Set a callback to run after the specified number of milliseconds has - * elapsed. The callback function is passed the current timer interval - * and returns the next timer interval. If the returned value is the - * same as the one passed in, the periodic alarm continues, otherwise a - * new alarm is scheduled. If the callback returns 0, the periodic alarm - * is cancelled. - * - * To cancel a currently running timer, call SDL_SetTimer(0, NULL); - * - * The timer callback function may run in a different thread than your - * main code, and so shouldn't call any functions from within itself. - * - * The maximum resolution of this timer is 10 ms, which means that if - * you request a 16 ms timer, your callback will run approximately 20 ms - * later on an unloaded system. If you wanted to set a flag signaling - * a frame update at 30 frames per second (every 33 ms), you might set a - * timer for 30 ms: - * SDL_SetTimer((33/10)*10, flag_update); - * - * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). - * - * Under UNIX, you should not use raise or use SIGALRM and this function - * in the same program, as it is implemented using setitimer(). You also - * should not use this function in multi-threaded applications as signals - * to multi-threaded apps have undefined behavior in some implementations. - * - * This function returns 0 if successful, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, - SDL_TimerCallback callback); - -/* New timer API, supports multiple timers - * Written by Stephane Peter - */ - -/* Function prototype for the new timer callback function. - * The callback function is passed the current timer interval and returns - * the next timer interval. If the returned value is the same as the one - * passed in, the periodic alarm continues, otherwise a new alarm is - * scheduled. If the callback returns 0, the periodic alarm is cancelled. - */ -typedef Uint32(SDLCALL * SDL_NewTimerCallback) (Uint32 interval, void *param); - -/* Definition of the timer ID type */ -typedef struct _SDL_TimerID *SDL_TimerID; - -/* Add a new timer to the pool of timers already running. - Returns a timer ID, or NULL when an error occurs. - */ -extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, - SDL_NewTimerCallback - callback, void *param); - -/* Remove one of the multiple timers knowing its ID. - * Returns a boolean value indicating success. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_timer_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_types.h b/Externals/SDL/Include_1.3/SDL_types.h deleted file mode 100644 index 942732d0a0..0000000000 --- a/Externals/SDL/Include_1.3/SDL_types.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* DEPRECATED */ -#include "SDL_stdinc.h" diff --git a/Externals/SDL/Include_1.3/SDL_version.h b/Externals/SDL/Include_1.3/SDL_version.h deleted file mode 100644 index 702386ba4a..0000000000 --- a/Externals/SDL/Include_1.3/SDL_version.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_version.h - * - * This header defines the current SDL version - */ - -#ifndef _SDL_version_h -#define _SDL_version_h - -#include "SDL_stdinc.h" -#include "SDL_revision.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/** - * \struct SDL_version - * \brief Information the version of SDL in use. - * - * Represents the library's version as three levels: major revision - * (increments with massive changes, additions, and enhancements), - * minor revision (increments with backwards-compatible changes to the - * major revision), and patchlevel (increments with fixes to the minor - * revision). - * - * \sa SDL_VERSION - * \sa SDL_GetVersion - */ -typedef struct SDL_version -{ - Uint8 major; /**< major version */ - Uint8 minor; /**< minor version */ - Uint8 patch; /**< update version */ -} SDL_version; - -/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL -*/ -#define SDL_MAJOR_VERSION 1 -#define SDL_MINOR_VERSION 3 -#define SDL_PATCHLEVEL 0 - -/** - * \def SDL_VERSION(x) - * \brief Macro to determine SDL version program was compiled against. - * - * This macro fills in a SDL_version structure with the version of the - * library you compiled against. This is determined by what header the - * compiler uses. Note that if you dynamically linked the library, you might - * have a slightly newer or older version at runtime. That version can be - * determined with SDL_GetVersion(), which, unlike SDL_VERSION, - * is not a macro. - * - * \param x A pointer to a SDL_version struct to initialize. - * - * \sa SDL_version - * \sa SDL_GetVersion - */ -#define SDL_VERSION(x) \ -{ \ - (x)->major = SDL_MAJOR_VERSION; \ - (x)->minor = SDL_MINOR_VERSION; \ - (x)->patch = SDL_PATCHLEVEL; \ -} - -/* This macro turns the version numbers into a numeric value: - (1,2,3) -> (1203) - This assumes that there will never be more than 100 patchlevels -*/ -#define SDL_VERSIONNUM(X, Y, Z) \ - ((X)*1000 + (Y)*100 + (Z)) - -/* This is the version number macro for the current SDL version */ -#define SDL_COMPILEDVERSION \ - SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) - -/* This macro will evaluate to true if compiled with SDL at least X.Y.Z */ -#define SDL_VERSION_ATLEAST(X, Y, Z) \ - (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) - -/** - * \fn void SDL_GetVersion(SDL_version *ver) - * \brief Get the version of SDL that is linked against your program. - * - * If you are using a shared library (DLL) version of SDL, then it is - * possible that it will be different than the version you compiled against. - * - * This is a real function; the macro SDL_VERSION tells you what version - * of SDL you compiled against: - * - * \code - * SDL_version compiled; - * SDL_version linked; - * - * SDL_VERSION(&compiled); - * SDL_GetVersion(&linked); - * printf("We compiled against SDL version %d.%d.%d ...\n", - * compiled.major, compiled.minor, compiled.patch); - * printf("But we linked against SDL version %d.%d.%d.\n", - * linked.major, linked.minor, linked.patch); - * \endcode - * - * This function may be called safely at any time, even before SDL_Init(). - * - * \sa SDL_VERSION - */ -extern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver); - -/** - * \fn int SDL_GetRevision(void) - * \brief Get the code revision of SDL that is linked against your program. - */ -extern DECLSPEC int SDLCALL SDL_GetRevision(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_version_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_video.h b/Externals/SDL/Include_1.3/SDL_video.h deleted file mode 100644 index 02aec68642..0000000000 --- a/Externals/SDL/Include_1.3/SDL_video.h +++ /dev/null @@ -1,1469 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_video.h - * - * Header file for SDL video functions. - */ - -#ifndef _SDL_video_h -#define _SDL_video_h - -#include "SDL_stdinc.h" -#include "SDL_pixels.h" -#include "SDL_rect.h" -#include "SDL_surface.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/** - * \struct SDL_DisplayMode - * - * \brief The structure that defines a display mode - * - * \sa SDL_GetNumDisplayModes() - * \sa SDL_GetDisplayMode() - * \sa SDL_GetDesktopDisplayMode() - * \sa SDL_GetCurrentDisplayMode() - * \sa SDL_GetClosestDisplayMode() - * \sa SDL_SetDisplayMode() - */ -typedef struct -{ - Uint32 format; /**< pixel format */ - int w; /**< width */ - int h; /**< height */ - int refresh_rate; /**< refresh rate (or zero for unspecified) */ - void *driverdata; /**< driver-specific data, initialize to 0 */ -} SDL_DisplayMode; - -/** - * \typedef SDL_WindowID - * - * \brief The type used to identify a window - * - * \sa SDL_CreateWindow() - * \sa SDL_CreateWindowFrom() - * \sa SDL_DestroyWindow() - * \sa SDL_GetWindowData() - * \sa SDL_GetWindowFlags() - * \sa SDL_GetWindowGrab() - * \sa SDL_GetWindowPosition() - * \sa SDL_GetWindowSize() - * \sa SDL_GetWindowTitle() - * \sa SDL_HideWindow() - * \sa SDL_MaximizeWindow() - * \sa SDL_MinimizeWindow() - * \sa SDL_RaiseWindow() - * \sa SDL_RestoreWindow() - * \sa SDL_SetWindowData() - * \sa SDL_SetWindowFullscreen() - * \sa SDL_SetWindowGrab() - * \sa SDL_SetWindowIcon() - * \sa SDL_SetWindowPosition() - * \sa SDL_SetWindowSize() - * \sa SDL_SetWindowTitle() - * \sa SDL_ShowWindow() - */ -typedef Uint32 SDL_WindowID; - -/** - * \enum SDL_WindowFlags - * - * \brief The flags on a window - * - * \sa SDL_GetWindowFlags() - */ -typedef enum -{ - SDL_WINDOW_FULLSCREEN = 0x00000001, /**< fullscreen window, implies borderless */ - SDL_WINDOW_OPENGL = 0x00000002, /**< window usable with OpenGL context */ - SDL_WINDOW_SHOWN = 0x00000004, /**< window is visible */ - SDL_WINDOW_BORDERLESS = 0x00000008, /**< no window decoration */ - SDL_WINDOW_RESIZABLE = 0x00000010, /**< window can be resized */ - SDL_WINDOW_MINIMIZED = 0x00000020, /**< minimized */ - SDL_WINDOW_MAXIMIZED = 0x00000040, /**< maximized */ - SDL_WINDOW_INPUT_GRABBED = 0x00000100, /**< window has grabbed input focus */ - SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */ - SDL_WINDOW_MOUSE_FOCUS = 0x00000400 /**< window has mouse focus */ -} SDL_WindowFlags; - -/** - * \def SDL_WINDOWPOS_UNDEFINED - * \brief Used to indicate that you don't care what the window position is. - */ -#define SDL_WINDOWPOS_UNDEFINED 0x7FFFFFF -/** - * \def SDL_WINDOWPOS_CENTERED - * \brief Used to indicate that the window position should be centered. - */ -#define SDL_WINDOWPOS_CENTERED 0x7FFFFFE - -/** - * \enum SDL_WindowEventID - * - * \brief Event subtype for window events - */ -typedef enum -{ - SDL_WINDOWEVENT_NONE, /**< Never used */ - SDL_WINDOWEVENT_SHOWN, /**< Window has been shown */ - SDL_WINDOWEVENT_HIDDEN, /**< Window has been hidden */ - SDL_WINDOWEVENT_EXPOSED, /**< Window has been exposed and should be redrawn */ - SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1,data2 */ - SDL_WINDOWEVENT_RESIZED, /**< Window size changed to data1xdata2 */ - SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ - SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ - SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size and position */ - SDL_WINDOWEVENT_ENTER, /**< The window has gained mouse focus */ - SDL_WINDOWEVENT_LEAVE, /**< The window has lost mouse focus */ - SDL_WINDOWEVENT_FOCUS_GAINED, /**< The window has gained keyboard focus */ - SDL_WINDOWEVENT_FOCUS_LOST, /**< The window has lost keyboard focus */ - SDL_WINDOWEVENT_CLOSE /**< The window manager requests that the window be closed */ -} SDL_WindowEventID; - -/** - * \enum SDL_RendererFlags - * - * \brief Flags used when creating a rendering context - */ -typedef enum -{ - SDL_RENDERER_SINGLEBUFFER = 0x00000001, /**< Render directly to the window, if possible */ - SDL_RENDERER_PRESENTCOPY = 0x00000002, /**< Present uses a copy from back buffer to the front buffer */ - SDL_RENDERER_PRESENTFLIP2 = 0x00000004, /**< Present uses a flip, swapping back buffer and front buffer */ - SDL_RENDERER_PRESENTFLIP3 = 0x00000008, /**< Present uses a flip, rotating between two back buffers and a front buffer */ - SDL_RENDERER_PRESENTDISCARD = 0x00000010, /**< Present leaves the contents of the backbuffer undefined */ - SDL_RENDERER_PRESENTVSYNC = 0x00000020, /**< Present is synchronized with the refresh rate */ - SDL_RENDERER_ACCELERATED = 0x00000040 /**< The renderer uses hardware acceleration */ -} SDL_RendererFlags; - -/** - * \struct SDL_RendererInfo - * - * \brief Information on the capabilities of a render driver or context - */ -typedef struct SDL_RendererInfo -{ - const char *name; /**< The name of the renderer */ - Uint32 flags; /**< Supported SDL_RendererFlags */ - Uint32 mod_modes; /**< A mask of supported channel modulation */ - Uint32 blend_modes; /**< A mask of supported blend modes */ - Uint32 scale_modes; /**< A mask of supported scale modes */ - Uint32 num_texture_formats; /**< The number of available texture formats */ - Uint32 texture_formats[20]; /**< The available texture formats */ - int max_texture_width; /**< The maximimum texture width */ - int max_texture_height; /**< The maximimum texture height */ -} SDL_RendererInfo; - -/** - * \enum SDL_TextureAccess - * - * \brief The access pattern allowed for a texture - */ -typedef enum -{ - SDL_TEXTUREACCESS_STATIC, /**< Changes rarely, not lockable */ - SDL_TEXTUREACCESS_STREAMING /**< Changes frequently, lockable */ -} SDL_TextureAccess; - -/** - * \enum SDL_TextureModulate - * - * \brief The texture channel modulation used in SDL_RenderCopy() - */ -typedef enum -{ - SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */ - SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */ - SDL_TEXTUREMODULATE_ALPHA = 0x00000002 /**< srcA = srcA * alpha */ -} SDL_TextureModulate; - -/** - * \enum SDL_BlendMode - * - * \brief The blend mode used in SDL_RenderCopy() and drawing operations - */ -typedef enum -{ - SDL_BLENDMODE_NONE = 0x00000000, /**< No blending */ - SDL_BLENDMODE_MASK = 0x00000001, /**< dst = A ? src : dst (alpha is mask) */ - SDL_BLENDMODE_BLEND = 0x00000002, /**< dst = (src * A) + (dst * (1-A)) */ - SDL_BLENDMODE_ADD = 0x00000004, /**< dst = (src * A) + dst */ - SDL_BLENDMODE_MOD = 0x00000008 /**< dst = src * dst */ -} SDL_BlendMode; - -/** - * \enum SDL_TextureScaleMode - * - * \brief The texture scale mode used in SDL_RenderCopy() - */ -typedef enum -{ - SDL_TEXTURESCALEMODE_NONE = 0x00000000, /**< No scaling, rectangles must match dimensions */ - SDL_TEXTURESCALEMODE_FAST = 0x00000001, /**< Point sampling or equivalent algorithm */ - SDL_TEXTURESCALEMODE_SLOW = 0x00000002, /**< Linear filtering or equivalent algorithm */ - SDL_TEXTURESCALEMODE_BEST = 0x00000004 /**< Bicubic filtering or equivalent algorithm */ -} SDL_TextureScaleMode; - -/** - * \typedef SDL_TextureID - * - * \brief An efficient driver-specific representation of pixel data - */ -typedef Uint32 SDL_TextureID; - -/** - * \typedef SDL_GLContext - * - * \brief An opaque handle to an OpenGL context. - */ -typedef void *SDL_GLContext; - -/** - * \enum SDL_GLattr - * - * \brief OpenGL configuration attributes - */ -typedef enum -{ - SDL_GL_RED_SIZE, - SDL_GL_GREEN_SIZE, - SDL_GL_BLUE_SIZE, - SDL_GL_ALPHA_SIZE, - SDL_GL_BUFFER_SIZE, - SDL_GL_DOUBLEBUFFER, - SDL_GL_DEPTH_SIZE, - SDL_GL_STENCIL_SIZE, - SDL_GL_ACCUM_RED_SIZE, - SDL_GL_ACCUM_GREEN_SIZE, - SDL_GL_ACCUM_BLUE_SIZE, - SDL_GL_ACCUM_ALPHA_SIZE, - SDL_GL_STEREO, - SDL_GL_MULTISAMPLEBUFFERS, - SDL_GL_MULTISAMPLESAMPLES, - SDL_GL_ACCELERATED_VISUAL, - SDL_GL_RETAINED_BACKING -} SDL_GLattr; - - -/* Function prototypes */ - -/** - * \fn int SDL_GetNumVideoDrivers(void) - * - * \brief Get the number of video drivers compiled into SDL - * - * \sa SDL_GetVideoDriver() - */ -extern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); - -/** - * \fn const char *SDL_GetVideoDriver(int index) - * - * \brief Get the name of a built in video driver. - * - * \note The video drivers are presented in the order in which they are - * normally checked during initialization. - * - * \sa SDL_GetNumVideoDrivers() - */ -extern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index); - -/** - * \fn int SDL_VideoInit(const char *driver_name, Uint32 flags) - * - * \brief Initialize the video subsystem, optionally specifying a video driver. - * - * \param driver_name Initialize a specific driver by name, or NULL for the default video driver. - * \param flags FIXME: Still needed? - * - * \return 0 on success, -1 on error - * - * This function initializes the video subsystem; setting up a connection - * to the window manager, etc, and determines the available display modes - * and pixel formats, but does not initialize a window or graphics mode. - * - * \sa SDL_VideoQuit() - */ -extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, - Uint32 flags); - -/** - * \fn void SDL_VideoQuit(void) - * - * \brief Shuts down the video subsystem. - * - * This function closes all windows, and restores the original video mode. - * - * \sa SDL_VideoInit() - */ -extern DECLSPEC void SDLCALL SDL_VideoQuit(void); - -/** - * \fn const char *SDL_GetCurrentVideoDriver(void) - * - * \brief Returns the name of the currently initialized video driver. - * - * \return The name of the current video driver or NULL if no driver - * has been initialized - * - * \sa SDL_GetNumVideoDrivers() - * \sa SDL_GetVideoDriver() - */ -extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); - -/** - * \fn int SDL_GetNumVideoDisplays(void) - * - * \brief Returns the number of available video displays. - * - * \sa SDL_SelectVideoDisplay() - */ -extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); - -/** - * \fn int SDL_SelectVideoDisplay(int index) - * - * \brief Set the index of the currently selected display. - * - * \return 0 on success, or -1 if the index is out of range. - * - * \sa SDL_GetNumVideoDisplays() - * \sa SDL_GetCurrentVideoDisplay() - */ -extern DECLSPEC int SDLCALL SDL_SelectVideoDisplay(int index); - -/** - * \fn int SDL_GetCurrentVideoDisplay(void) - * - * \brief Get the index of the currently selected display. - * - * \return The index of the currently selected display. - * - * \sa SDL_GetNumVideoDisplays() - * \sa SDL_SelectVideoDisplay() - */ -extern DECLSPEC int SDLCALL SDL_GetCurrentVideoDisplay(void); - -/** - * \fn int SDL_GetNumDisplayModes(void) - * - * \brief Returns the number of available display modes for the current display. - * - * \sa SDL_GetDisplayMode() - */ -extern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(void); - -/** - * \fn int SDL_GetDisplayMode(int index, SDL_DisplayMode *mode) - * - * \brief Fill in information about a specific display mode. - * - * \note The display modes are sorted in this priority: - * \li bits per pixel -> more colors to fewer colors - * \li width -> largest to smallest - * \li height -> largest to smallest - * \li refresh rate -> highest to lowest - * - * \sa SDL_GetNumDisplayModes() - */ -extern DECLSPEC int SDLCALL SDL_GetDisplayMode(int index, - SDL_DisplayMode * mode); - -/** - * \fn int SDL_GetDesktopDisplayMode(SDL_DisplayMode *mode) - * - * \brief Fill in information about the desktop display mode for the current display. - */ -extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(SDL_DisplayMode * mode); - -/** - * \fn int SDL_GetCurrentDisplayMode(SDL_DisplayMode *mode) - * - * \brief Fill in information about the current display mode. - */ -extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(SDL_DisplayMode * mode); - -/** - * \fn SDL_DisplayMode *SDL_GetClosestDisplayMode(const SDL_DisplayMode *mode, SDL_DisplayMode *closest) - * - * \brief Get the closest match to the requested display mode. - * - * \param mode The desired display mode - * \param closest A pointer to a display mode to be filled in with the closest match of the available display modes. - * - * \return The passed in value 'closest', or NULL if no matching video mode was available. - * - * The available display modes are scanned, and 'closest' is filled in with the closest mode matching the requested mode and returned. The mode format and refresh_rate default to the desktop mode if they are 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh_rate. If all the available modes are too small, then NULL is returned. - * - * \sa SDL_GetNumDisplayModes() - * \sa SDL_GetDisplayMode() - */ -extern DECLSPEC SDL_DisplayMode *SDLCALL SDL_GetClosestDisplayMode(const - SDL_DisplayMode - * mode, - SDL_DisplayMode - * closest); - -/** - * \fn int SDL_SetFullscreenDisplayMode(const SDL_DisplayMode *mode) - * - * \brief Set the display mode used when a fullscreen window is visible - * on the currently selected display. - * - * \param mode The mode to use, or NULL for the desktop mode. - * - * \return 0 on success, or -1 if setting the display mode failed. - * - * \sa SDL_SetWindowFullscreen() - */ -extern DECLSPEC int SDLCALL SDL_SetFullscreenDisplayMode(const SDL_DisplayMode - * mode); - -/** - * \fn int SDL_GetFullscreenDisplayMode(SDL_DisplayMode *mode) - * - * \brief Fill in information about the display mode used when a fullscreen - * window is visible on the currently selected display. - */ -extern DECLSPEC int SDLCALL SDL_GetFullscreenDisplayMode(SDL_DisplayMode * - mode); - -/** - * \fn int SDL_SetDisplayPalette(const SDL_Color *colors, int firstcolor, int ncolors) - * - * \brief Set the palette entries for indexed display modes. - * - * \return 0 on success, or -1 if the display mode isn't palettized or the colors couldn't be set. - */ -extern DECLSPEC int SDLCALL SDL_SetDisplayPalette(const SDL_Color * colors, - int firstcolor, - int ncolors); - -/** - * \fn int SDL_GetDisplayPalette(SDL_Color *colors, int firstcolor, int ncolors) - * - * \brief Gets the palette entries for indexed display modes. - * - * \return 0 on success, or -1 if the display mode isn't palettized - */ -extern DECLSPEC int SDLCALL SDL_GetDisplayPalette(SDL_Color * colors, - int firstcolor, - int ncolors); - -/** - * \fn int SDL_SetGamma(float red, float green, float blue) - * - * \brief Set the gamma correction for each of the color channels on the currently selected display. - * - * \return 0 on success, or -1 if setting the gamma isn't supported. - * - * \sa SDL_SetGammaRamp() - */ -extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); - -/** - * \fn int SDL_SetGammaRamp(const Uint16 * red, const Uint16 * green, const Uint16 * blue) - * - * \brief Set the gamma ramp for the currently selected display. - * - * \param red The translation table for the red channel, or NULL - * \param green The translation table for the green channel, or NULL - * \param blue The translation table for the blue channel, or NULL - * - * \return 0 on success, or -1 if gamma ramps are unsupported. - * - * Set the gamma translation table for the red, green, and blue channels - * of the video hardware. Each table is an array of 256 16-bit quantities, - * representing a mapping between the input and output for that channel. - * The input is the index into the array, and the output is the 16-bit - * gamma value at that index, scaled to the output color precision. - * - * \sa SDL_GetGammaRamp() - */ -extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 * red, - const Uint16 * green, - const Uint16 * blue); - -/** - * \fn int SDL_GetGammaRamp(Uint16 * red, Uint16 * green, Uint16 * blue) - * - * \brief Get the gamma ramp for the currently selected display. - * - * \param red A pointer to a 256 element array of 16-bit quantities to hold the translation table for the red channel, or NULL. - * \param green A pointer to a 256 element array of 16-bit quantities to hold the translation table for the green channel, or NULL. - * \param blue A pointer to a 256 element array of 16-bit quantities to hold the translation table for the blue channel, or NULL. - * - * \return 0 on success, or -1 if gamma ramps are unsupported. - * - * \sa SDL_SetGammaRamp() - */ -extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 * red, Uint16 * green, - Uint16 * blue); - - -/** - * \fn SDL_WindowID SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) - * - * \brief Create a window with the specified position, dimensions, and flags. - * - * \param title The title of the window, in UTF-8 encoding - * \param x The x position of the window, SDL_WINDOWPOS_CENTERED, or SDL_WINDOWPOS_UNDEFINED - * \param y The y position of the window, SDL_WINDOWPOS_CENTERED, or SDL_WINDOWPOS_UNDEFINED - * \param w The width of the window - * \param h The height of the window - * \param flags The flags for the window, a mask of any of the following: SDL_WINDOW_FULLSCREEN, SDL_WINDOW_OPENGL, SDL_WINDOW_SHOWN, SDL_WINDOW_BORDERLESS, SDL_WINDOW_RESIZABLE, SDL_WINDOW_MAXIMIZED, SDL_WINDOW_MINIMIZED, SDL_WINDOW_INPUT_GRABBED - * - * \return The id of the window created, or zero if window creation failed. - * - * \sa SDL_DestroyWindow() - */ -extern DECLSPEC SDL_WindowID SDLCALL SDL_CreateWindow(const char *title, - int x, int y, int w, - int h, Uint32 flags); - -/** - * \fn SDL_WindowID SDL_CreateWindowFrom(void *data) - * - * \brief Create an SDL window struct from an existing native window. - * - * \param data A pointer to driver-dependent window creation data - * - * \return The id of the window created, or zero if window creation failed. - * - * \warning This function is NOT SUPPORTED, use at your own risk! - * - * \sa SDL_DestroyWindow() - */ -extern DECLSPEC SDL_WindowID SDLCALL SDL_CreateWindowFrom(const void *data); - -/** - * \fn Uint32 SDL_GetWindowFlags(SDL_WindowID windowID) - * - * \brief Get the window flags. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_WindowID windowID); - -/** - * \fn void SDL_SetWindowTitle(SDL_WindowID windowID, const char *title) - * - * \brief Set the title of the window, in UTF-8 format. - * - * \sa SDL_GetWindowTitle() - */ -extern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_WindowID windowID, - const char *title); - -/** - * \fn const char *SDL_GetWindowTitle(SDL_WindowID windowID) - * - * \brief Get the title of the window, in UTF-8 format. - * - * \sa SDL_SetWindowTitle() - */ -extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_WindowID windowID); - -/** - * \fn void SDL_SetWindowIcon(SDL_WindowID windowID, SDL_Surface *icon) - * - * \brief Set the icon of the window. - * - * \param icon The icon for the window - */ -extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_WindowID windowID, - SDL_Surface * icon); - -/** - * \fn void SDL_SetWindowData(SDL_WindowID windowID, void *userdata) - * - * \brief Associate an arbitrary pointer with the window. - * - * \sa SDL_GetWindowData() - */ -extern DECLSPEC void SDLCALL SDL_SetWindowData(SDL_WindowID windowID, - void *userdata); - -/** - * \fn void *SDL_GetWindowData(SDL_WindowID windowID) - * - * \brief Retrieve the data pointer associated with the window. - * - * \sa SDL_SetWindowData() - */ -extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_WindowID windowID); - -/** - * \fn void SDL_SetWindowPosition(SDL_WindowID windowID, int x, int y) - * - * \brief Set the position of the window. - * - * \param windowID The window to reposition - * \param x The x coordinate of the window, SDL_WINDOWPOS_CENTERED, or SDL_WINDOWPOS_UNDEFINED - * \param y The y coordinate of the window, SDL_WINDOWPOS_CENTERED, or SDL_WINDOWPOS_UNDEFINED - * - * \note The window coordinate origin is the upper left of the display. - * - * \sa SDL_GetWindowPosition() - */ -extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_WindowID windowID, - int x, int y); - -/** - * \fn void SDL_GetWindowPosition(SDL_WindowID windowID, int *x, int *y) - * - * \brief Get the position of the window. - * - * \sa SDL_SetWindowPosition() - */ -extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_WindowID windowID, - int *x, int *y); - -/** - * \fn void SDL_SetWindowSize(SDL_WindowID windowID, int w, int w) - * - * \brief Set the size of the window's client area. - * - * \note You can't change the size of a fullscreen window, it automatically - * matches the size of the display mode. - * - * \sa SDL_GetWindowSize() - */ -extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_WindowID windowID, int w, - int h); - -/** - * \fn void SDL_GetWindowSize(SDL_WindowID windowID, int *w, int *h) - * - * \brief Get the size of the window's client area. - * - * \sa SDL_SetWindowSize() - */ -extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_WindowID windowID, int *w, - int *h); - -/** - * \fn void SDL_ShowWindow(SDL_WindowID windowID) - * - * \brief Show the window - * - * \sa SDL_HideWindow() - */ -extern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_HideWindow(SDL_WindowID windowID) - * - * \brief Hide the window - * - * \sa SDL_ShowWindow() - */ -extern DECLSPEC void SDLCALL SDL_HideWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_RaiseWindow(SDL_WindowID windowID) - * - * \brief Raise the window above other windows and set the input focus. - */ -extern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_MaximizeWindow(SDL_WindowID windowID) - * - * \brief Make the window as large as possible. - * - * \sa SDL_RestoreWindow() - */ -extern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_MinimizeWindow(SDL_WindowID windowID) - * - * \brief Minimize the window to an iconic representation. - * - * \sa SDL_RestoreWindow() - */ -extern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_RestoreWindow(SDL_WindowID windowID) - * - * \brief Restore the size and position of a minimized or maximized window. - * - * \sa SDL_MaximizeWindow() - * \sa SDL_MinimizeWindow() - */ -extern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_WindowID windowID); - -/** - * \fn int SDL_SetWindowFullscreen(SDL_WindowID windowID, int fullscreen) - * - * \brief Set the window's fullscreen state. - * - * \return 0 on success, or -1 if setting the display mode failed. - * - * \sa SDL_SetFullscreenDisplayMode() - */ -extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_WindowID windowID, - int fullscreen); - -/** - * \fn void SDL_SetWindowGrab(SDL_WindowID windowID, int mode) - * - * \brief Set the window's input grab mode. - * - * \param mode This is 1 to grab input, and 0 to release input. - * - * \sa SDL_GetWindowGrab() - */ -extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_WindowID windowID, - int mode); - -/** - * \fn int SDL_GetWindowGrab(SDL_WindowID windowID) - * - * \brief Get the window's input grab mode. - * - * \return This returns 1 if input is grabbed, and 0 otherwise. - * - * \sa SDL_SetWindowGrab() - */ -extern DECLSPEC int SDLCALL SDL_GetWindowGrab(SDL_WindowID windowID); - -/** - * \fn SDL_bool SDL_GetWindowWMInfo(SDL_WindowID windowID, struct SDL_SysWMinfo * info) - * - * \brief Get driver specific information about a window. - * - * \note Include SDL_syswm.h for the declaration of SDL_SysWMinfo. - */ -struct SDL_SysWMinfo; -extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_WindowID windowID, - struct SDL_SysWMinfo - *info); - -/** - * \fn void SDL_DestroyWindow(SDL_WindowID windowID) - * - * \brief Destroy a window. - */ -extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_WindowID windowID); - -/** - * \fn int SDL_GetNumRenderDrivers(void) - * - * \brief Get the number of 2D rendering drivers available for the current display. - * - * A render driver is a set of code that handles rendering and texture - * management on a particular display. Normally there is only one, but - * some drivers may have several available with different capabilities. - * - * \sa SDL_GetRenderDriverInfo() - * \sa SDL_CreateRenderer() - */ -extern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); - -/** - * \fn int SDL_GetRenderDriverInfo(int index, SDL_RendererInfo *info) - * - * \brief Get information about a specific 2D rendering driver for the current display. - * - * \param index The index of the driver to query information about. - * \param info A pointer to an SDL_RendererInfo struct to be filled with information on the rendering driver. - * - * \return 0 on success, -1 if the index was out of range - * - * \sa SDL_CreateRenderer() - */ -extern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index, - SDL_RendererInfo * info); - -/** - * \fn int SDL_CreateRenderer(SDL_WindowID window, int index, Uint32 flags) - * - * \brief Create and make active a 2D rendering context for a window. - * - * \param windowID The window used for rendering - * \param index The index of the rendering driver to initialize, or -1 to initialize the first one supporting the requested flags. - * \param flags SDL_RendererFlags - * - * \return 0 on success, -1 if the flags were not supported, or -2 if - * there isn't enough memory to support the requested flags - * - * \sa SDL_SelectRenderer() - * \sa SDL_GetRendererInfo() - * \sa SDL_DestroyRenderer() - */ -extern DECLSPEC int SDLCALL SDL_CreateRenderer(SDL_WindowID windowID, - int index, Uint32 flags); - -/** - * \fn int SDL_SelectRenderer(SDL_WindowID windowID) - * - * \brief Select the rendering context for a particular window. - * - * \return 0 on success, -1 if the selected window doesn't have a - * rendering context. - */ -extern DECLSPEC int SDLCALL SDL_SelectRenderer(SDL_WindowID windowID); - -/** - * \fn int SDL_GetRendererInfo(SDL_RendererInfo *info) - * - * \brief Get information about the current rendering context. - */ -extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_RendererInfo * info); - -/** - * \fn SDL_TextureID SDL_CreateTexture(Uint32 format, int access, int w, int h) - * - * \brief Create a texture for the current rendering context. - * - * \param format The format of the texture - * \param access One of the enumerated values in SDL_TextureAccess - * \param w The width of the texture in pixels - * \param h The height of the texture in pixels - * - * \return The created texture is returned, or 0 if no rendering context was active, the format was unsupported, or the width or height were out of range. - * - * \sa SDL_QueryTexture() - * \sa SDL_DestroyTexture() - */ -extern DECLSPEC SDL_TextureID SDLCALL SDL_CreateTexture(Uint32 format, - int access, int w, - int h); - -/** - * \fn SDL_TextureID SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface *surface) - * - * \brief Create a texture from an existing surface. - * - * \param format The format of the texture, or 0 to pick an appropriate format - * \param surface The surface containing pixel data used to fill the texture - * - * \return The created texture is returned, or 0 if no rendering context was active, the format was unsupported, or the surface width or height were out of range. - * - * \note The surface is not modified or freed by this function. - * - * \sa SDL_QueryTexture() - * \sa SDL_DestroyTexture() - */ -extern DECLSPEC SDL_TextureID SDLCALL SDL_CreateTextureFromSurface(Uint32 - format, - SDL_Surface - * surface); - -/** - * \fn int SDL_QueryTexture(SDL_TextureID textureID, Uint32 *format, int *access, int *w, int *h) - * - * \brief Query the attributes of a texture - * - * \param texture A texture to be queried - * \param format A pointer filled in with the raw format of the texture. The actual format may differ, but pixel transfers will use this format. - * \param access A pointer filled in with the actual access to the texture. - * \param w A pointer filled in with the width of the texture in pixels - * \param h A pointer filled in with the height of the texture in pixels - * - * \return 0 on success, or -1 if the texture is not valid - */ -extern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_TextureID textureID, - Uint32 * format, int *access, - int *w, int *h); - -/** - * \fn int SDL_QueryTexturePixels(SDL_TextureID textureID, void **pixels, int pitch) - * - * \brief Query the pixels of a texture, if the texture does not need to be locked for pixel access. - * - * \param texture A texture to be queried, which was created with SDL_TEXTUREACCESS_STREAMING - * \param pixels A pointer filled with a pointer to the pixels for the texture - * \param pitch A pointer filled in with the pitch of the pixel data - * - * \return 0 on success, or -1 if the texture is not valid, or must be locked for pixel access. - */ -extern DECLSPEC int SDLCALL SDL_QueryTexturePixels(SDL_TextureID textureID, - void **pixels, int *pitch); - -/** - * \fn int SDL_SetTexturePalette(SDL_TextureID textureID, const SDL_Color * colors, int firstcolor, int ncolors) - * - * \brief Update an indexed texture with a color palette - * - * \param texture The texture to update - * \param colors The array of RGB color data - * \param firstcolor The first index to update - * \param ncolors The number of palette entries to fill with the color data - * - * \return 0 on success, or -1 if the texture is not valid or not an indexed texture - */ -extern DECLSPEC int SDLCALL SDL_SetTexturePalette(SDL_TextureID textureID, - const SDL_Color * colors, - int firstcolor, - int ncolors); - -/** - * \fn int SDL_GetTexturePalette(SDL_TextureID textureID, SDL_Color * colors, int firstcolor, int ncolors) - * - * \brief Update an indexed texture with a color palette - * - * \param texture The texture to update - * \param colors The array to fill with RGB color data - * \param firstcolor The first index to retrieve - * \param ncolors The number of palette entries to retrieve - * - * \return 0 on success, or -1 if the texture is not valid or not an indexed texture - */ -extern DECLSPEC int SDLCALL SDL_GetTexturePalette(SDL_TextureID textureID, - SDL_Color * colors, - int firstcolor, - int ncolors); - -/** - * \fn int SDL_SetTextureColorMod(SDL_TextureID textureID, Uint8 r, Uint8 g, Uint8 b) - * - * \brief Set an additional color value used in render copy operations - * - * \param texture The texture to update - * \param r The red source color value multiplied into copy operations - * \param g The green source color value multiplied into copy operations - * \param b The blue source color value multiplied into copy operations - * - * \return 0 on success, or -1 if the texture is not valid or color modulation is not supported - * - * \sa SDL_GetTextureColorMod() - */ -extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_TextureID textureID, - Uint8 r, Uint8 g, Uint8 b); - - -/** - * \fn int SDL_GetTextureColorMod(SDL_TextureID textureID, Uint8 *r, Uint8 *g, Uint8 *b) - * - * \brief Get the additional color value used in render copy operations - * - * \param texture The texture to query - * \param r A pointer filled in with the source red color value - * \param g A pointer filled in with the source green color value - * \param b A pointer filled in with the source blue color value - * - * \return 0 on success, or -1 if the texture is not valid - * - * \sa SDL_SetTextureColorMod() - */ -extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_TextureID textureID, - Uint8 * r, Uint8 * g, - Uint8 * b); - -/** - * \fn int SDL_SetTextureAlphaMod(SDL_TextureID textureID, Uint8 alpha) - * - * \brief Set an additional alpha value used in render copy operations - * - * \param texture The texture to update - * \param alpha The source alpha value multiplied into copy operations. - * - * \return 0 on success, or -1 if the texture is not valid or alpha modulation is not supported - * - * \sa SDL_GetTextureAlphaMod() - */ -extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_TextureID textureID, - Uint8 alpha); - -/** - * \fn int SDL_GetTextureAlphaMod(SDL_TextureID textureID, Uint8 *alpha) - * - * \brief Get the additional alpha value used in render copy operations - * - * \param texture The texture to query - * \param alpha A pointer filled in with the source alpha value - * - * \return 0 on success, or -1 if the texture is not valid - * - * \sa SDL_SetTextureAlphaMod() - */ -extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_TextureID textureID, - Uint8 * alpha); - -/** - * \fn int SDL_SetTextureBlendMode(SDL_TextureID textureID, int blendMode) - * - * \brief Set the blend mode used for texture copy operations - * - * \param texture The texture to update - * \param blendMode SDL_TextureBlendMode to use for texture blending - * - * \return 0 on success, or -1 if the texture is not valid or the blend mode is not supported - * - * \note If the blend mode is not supported, the closest supported mode is chosen. - * - * \sa SDL_GetTextureBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_TextureID textureID, - int blendMode); - -/** - * \fn int SDL_GetTextureBlendMode(SDL_TextureID textureID, int *blendMode) - * - * \brief Get the blend mode used for texture copy operations - * - * \param texture The texture to query - * \param blendMode A pointer filled in with the current blend mode - * - * \return 0 on success, or -1 if the texture is not valid - * - * \sa SDL_SetTextureBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_TextureID textureID, - int *blendMode); - -/** - * \fn int SDL_SetTextureScaleMode(SDL_TextureID textureID, int scaleMode) - * - * \brief Set the scale mode used for texture copy operations - * - * \param texture The texture to update - * \param scaleMode SDL_TextureScaleMode to use for texture scaling - * - * \return 0 on success, or -1 if the texture is not valid or the scale mode is not supported - * - * \note If the scale mode is not supported, the closest supported mode is chosen. - * - * \sa SDL_GetTextureScaleMode() - */ -extern DECLSPEC int SDLCALL SDL_SetTextureScaleMode(SDL_TextureID textureID, - int scaleMode); - -/** - * \fn int SDL_GetTextureScaleMode(SDL_TextureID textureID, int *scaleMode) - * - * \brief Get the scale mode used for texture copy operations - * - * \param texture The texture to query - * \param scaleMode A pointer filled in with the current scale mode - * - * \return 0 on success, or -1 if the texture is not valid - * - * \sa SDL_SetTextureScaleMode() - */ -extern DECLSPEC int SDLCALL SDL_GetTextureScaleMode(SDL_TextureID textureID, - int *scaleMode); - -/** - * \fn int SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect *rect, const void *pixels, int pitch) - * - * \brief Update the given texture rectangle with new pixel data. - * - * \param texture The texture to update - * \param rect A pointer to the rectangle of pixels to update, or NULL to update the entire texture. - * \param pixels The raw pixel data - * \param pitch The number of bytes between rows of pixel data - * - * \return 0 on success, or -1 if the texture is not valid - * - * \note This is a fairly slow function. - */ -extern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_TextureID textureID, - const SDL_Rect * rect, - const void *pixels, int pitch); - -/** - * \fn void SDL_LockTexture(SDL_TextureID textureID, const SDL_Rect *rect, int markDirty, void **pixels, int *pitch) - * - * \brief Lock a portion of the texture for pixel access. - * - * \param textureID The texture to lock for access, which was created with SDL_TEXTUREACCESS_STREAMING. - * \param rect A pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked. - * \param markDirty If this is nonzero, the locked area will be marked dirty when the texture is unlocked. - * \param pixels This is filled in with a pointer to the locked pixels, appropriately offset by the locked area. - * \param pitch This is filled in with the pitch of the locked pixels. - * - * \return 0 on success, or -1 if the texture is not valid or was created with SDL_TEXTUREACCESS_STATIC - * - * \sa SDL_DirtyTexture() - * \sa SDL_UnlockTexture() - */ -extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_TextureID textureID, - const SDL_Rect * rect, - int markDirty, void **pixels, - int *pitch); - -/** - * \fn void SDL_UnlockTexture(SDL_TextureID textureID) - * - * \brief Unlock a texture, uploading the changes to video memory, if needed. - * - * \sa SDL_LockTexture() - * \sa SDL_DirtyTexture() - */ -extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_TextureID textureID); - -/** - * \fn void SDL_DirtyTexture(SDL_TextureID textureID, int numrects, const SDL_Rect * rects) - * - * \brief Mark the specified rectangles of the texture as dirty. - * - * \param textureID The texture to mark dirty, which was created with SDL_TEXTUREACCESS_STREAMING. - * \param numrects The number of rectangles pointed to by rects. - * \param rects The pointer to an array of dirty rectangles. - * - * \sa SDL_LockTexture() - * \sa SDL_UnlockTexture() - */ -extern DECLSPEC void SDLCALL SDL_DirtyTexture(SDL_TextureID textureID, - int numrects, - const SDL_Rect * rects); - -/** - * \fn void SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) - * - * \brief Set the color used for drawing operations (Fill and Line). - * - * \param r The red value used to draw on the rendering target - * \param g The green value used to draw on the rendering target - * \param b The blue value used to draw on the rendering target - * \param a The alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255) - * \return 0 on success, or -1 if there is no rendering context current - */ -extern DECLSPEC int SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, - Uint8 a); - -/** - * \fn void SDL_GetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) - * - * \brief Get the color used for drawing operations (Fill and Line). - * - * \param r A pointer to the red value used to draw on the rendering target - * \param g A pointer to the green value used to draw on the rendering target - * \param b A pointer to the blue value used to draw on the rendering target - * \param a A pointer to the alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255) - * \return 0 on success, or -1 if there is no rendering context current - */ -extern DECLSPEC int SDL_GetRenderDrawColor(Uint8 * r, Uint8 * g, Uint8 * b, - Uint8 * a); - -/** - * \fn int SDL_SetRenderDrawBlendMode(int blendMode) - * - * \brief Set the blend mode used for drawing operations (Fill and Line). - * - * \param blendMode SDL_BlendMode to use for blending - * - * \return 0 on success, or -1 if there is no rendering context current - * - * \note If the blend mode is not supported, the closest supported mode is chosen. - * - * \sa SDL_SetRenderDrawBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(int blendMode); - -/** - * \fn int SDL_GetRenderDrawBlendMode(int *blendMode) - * - * \brief Get the blend mode used for drawing operations - * - * \param blendMode A pointer filled in with the current blend mode - * - * \return 0 on success, or -1 if there is no rendering context current - * - * \sa SDL_SetRenderDrawBlendMode() - */ -extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(int *blendMode); - -/** - * \fn int SDL_RenderPoint(int x, int y) - * - * \brief Draw a point on the current rendering target. - * - * \param x The x coordinate of the point - * \param y The y coordinate of the point - * - * \return 0 on success, or -1 if there is no rendering context current - */ -extern DECLSPEC int SDLCALL SDL_RenderPoint(int x, int y); - -/** - * \fn int SDL_RenderLine(int x1, int y1, int x2, int y2) - * - * \brief Draw a line on the current rendering target. - * - * \param x1 The x coordinate of the start point - * \param y1 The y coordinate of the start point - * \param x2 The x coordinate of the end point - * \param y2 The y coordinate of the end point - * - * \return 0 on success, or -1 if there is no rendering context current - */ -extern DECLSPEC int SDLCALL SDL_RenderLine(int x1, int y1, int x2, int y2); - -/** - * \fn void SDL_RenderFill(const SDL_Rect *rect) - * - * \brief Fill the current rendering target with the drawing color. - * - * \param r The red value used to fill the rendering target - * \param g The green value used to fill the rendering target - * \param b The blue value used to fill the rendering target - * \param a The alpha value used to fill the rendering target, usually SDL_ALPHA_OPAQUE (255) - * \param rect A pointer to the destination rectangle, or NULL for the entire rendering target. - * - * \return 0 on success, or -1 if there is no rendering context current - */ -extern DECLSPEC int SDLCALL SDL_RenderFill(const SDL_Rect * rect); - -/** - * \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect) - * - * \brief Copy a portion of the texture to the current rendering target. - * - * \param texture The source texture. - * \param srcrect A pointer to the source rectangle, or NULL for the entire texture. - * \param dstrect A pointer to the destination rectangle, or NULL for the entire rendering target. - * - * \return 0 on success, or -1 if there is no rendering context current, or the driver doesn't support the requested operation. - */ -extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_TextureID textureID, - const SDL_Rect * srcrect, - const SDL_Rect * dstrect); - -/** - * \fn int SDL_RenderReadPixels(const SDL_Rect *rect, void *pixels, int pitch) - * - * \brief Read pixels from the current rendering target. - * - * \param rect A pointer to the rectangle to read, or NULL for the entire render target - * \param pixels A pointer to be filled in with the pixel data - * \param pitch The pitch of the pixels parameter - * - * \return 0 on success, or -1 if pixel reading is not supported. - * - * \warning This is a very slow operation, and should not be used frequently. - */ -extern DECLSPEC int SDLCALL SDL_RenderReadPixels(const SDL_Rect * rect, - void *pixels, int pitch); - -/** - * \fn int SDL_RenderWritePixels(const SDL_Rect *rect, const void *pixels, int pitch) - * - * \brief Write pixels to the current rendering target. - * - * \param rect A pointer to the rectangle to write, or NULL for the entire render target - * \param pixels A pointer to the pixel data to write - * \param pitch The pitch of the pixels parameter - * - * \return 0 on success, or -1 if pixel writing is not supported. - * - * \warning This is a very slow operation, and should not be used frequently. - */ -extern DECLSPEC int SDLCALL SDL_RenderWritePixels(const SDL_Rect * rect, - const void *pixels, - int pitch); - -/** - * \fn void SDL_RenderPresent(void) - * - * \brief Update the screen with rendering performed. - */ -extern DECLSPEC void SDLCALL SDL_RenderPresent(void); - -/** - * \fn void SDL_DestroyTexture(SDL_TextureID textureID); - * - * \brief Destroy the specified texture. - * - * \sa SDL_CreateTexture() - * \sa SDL_CreateTextureFromSurface() - */ -extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_TextureID textureID); - -/** - * \fn void SDL_DestroyRenderer(SDL_WindowID windowID); - * - * \brief Destroy the rendering context for a window and free associated - * textures. - * - * \sa SDL_CreateRenderer() - */ -extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_WindowID windowID); - -/** - * \fn SDL_bool SDL_IsScreenSaverEnabled(); - * - * \brief Returns whether the screensaver is currently enabled (default off). - * - * \sa SDL_EnableScreenSaver() - * \sa SDL_DisableScreenSaver() - */ -extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void); - -/** - * \fn void SDL_EnableScreenSaver(); - * - * \brief Allow the screen to be blanked by a screensaver - * - * \sa SDL_IsScreenSaverEnabled() - * \sa SDL_DisableScreenSaver() - */ -extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void); - -/** - * \fn void SDL_DisableScreenSaver(); - * - * \brief Prevent the screen from being blanked by a screensaver - * - * \sa SDL_IsScreenSaverEnabled() - * \sa SDL_EnableScreenSaver() - */ -extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* OpenGL support functions. */ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** - * \fn int SDL_GL_LoadLibrary(const char *path) - * - * \brief Dynamically load an OpenGL library. - * - * \param path The platform dependent OpenGL library name, or NULL to open the default OpenGL library - * - * \return 0 on success, or -1 if the library couldn't be loaded - * - * This should be done after initializing the video driver, but before - * creating any OpenGL windows. If no OpenGL library is loaded, the default - * library will be loaded upon creation of the first OpenGL window. - * - * \note If you do this, you need to retrieve all of the GL functions used in - * your program from the dynamic library using SDL_GL_GetProcAddress(). - * - * \sa SDL_GL_GetProcAddress() - */ -extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); - -/** - * \fn void *SDL_GL_GetProcAddress(const char *proc) - * - * \brief Get the address of an OpenGL function. - */ -extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc); - -/** - * \fn SDL_bool SDL_GL_ExtensionSupported(const char *extension) - * - * \brief Return true if an OpenGL extension is supported for the current context. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char - *extension); - -/** - * \fn int SDL_GL_SetAttribute(SDL_GLattr attr, int value) - * - * \brief Set an OpenGL window attribute before window creation. - */ -extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); - -/** - * \fn int SDL_GL_GetWindowAttribute(SDL_WindowID windowID, SDL_GLattr attr, int *value) - * - * \brief Get the actual value for an attribute from the current context. - */ -extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); - -/** - * \fn SDL_GLContext SDL_GL_CreateContext(SDL_WindowID windowID) - * - * \brief Create an OpenGL context for use with an OpenGL window, and make it current. - * - * \sa SDL_GL_DeleteContext() - */ -extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_WindowID - windowID); - -/** - * \fn int SDL_GL_MakeCurrent(SDL_WindowID windowID, SDL_GLContext context) - * - * \brief Set up an OpenGL context for rendering into an OpenGL window. - * - * \note The context must have been created with a compatible window. - */ -extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_WindowID windowID, - SDL_GLContext context); - -/** - * \fn int SDL_GL_SetSwapInterval(int interval) - * - * \brief Set the swap interval for the current OpenGL context. - * - * \param interval 0 for immediate updates, 1 for updates synchronized with the vertical retrace - * - * \return 0 on success, or -1 if setting the swap interval is not supported. - * - * \sa SDL_GL_GetSwapInterval() - */ -extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval); - -/** - * \fn int SDL_GL_GetSwapInterval(void) - * - * \brief Get the swap interval for the current OpenGL context. - * - * \return 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if getting the swap interval is not supported. - * - * \sa SDL_GL_SetSwapInterval() - */ -extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void); - -/** - * \fn void SDL_GL_SwapWindow(SDL_WindowID windowID) - * - * \brief Swap the OpenGL buffers for the window, if double-buffering is supported. - */ -extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_WindowID windowID); - -/** - * \fn void SDL_GL_DeleteContext(SDL_GLContext context) - * - * \brief Delete an OpenGL context. - * - * \sa SDL_GL_CreateContext() - */ -extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/begin_code.h b/Externals/SDL/Include_1.3/begin_code.h deleted file mode 100644 index 33e8e53484..0000000000 --- a/Externals/SDL/Include_1.3/begin_code.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file sets things up for C dynamic library function definitions, - static inlined functions, and structures aligned at 4-byte alignment. - If you don't like ugly C preprocessor code, don't look at this file. :) -*/ - -/* This shouldn't be nested -- included it around code only. */ -#ifdef _begin_code_h -#error Nested inclusion of begin_code.h -#endif -#define _begin_code_h - -/* Some compilers use a special export keyword */ -#ifndef DECLSPEC -# if defined(__BEOS__) -# if defined(__GNUC__) -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC __declspec(export) -# endif -# elif defined(__WIN32__) -# ifdef __BORLANDC__ -# ifdef BUILD_SDL -# define DECLSPEC -# else -# define DECLSPEC __declspec(dllimport) -# endif -# else -# define DECLSPEC __declspec(dllexport) -# endif -# elif defined(__OS2__) -# ifdef __WATCOMC__ -# ifdef BUILD_SDL -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC -# endif -# else -# define DECLSPEC -# endif -# else -# if defined(__GNUC__) && __GNUC__ >= 4 -# define DECLSPEC __attribute__ ((visibility("default"))) -# else -# define DECLSPEC -# endif -# endif -#endif - -/* By default SDL uses the C calling convention */ -#ifndef SDLCALL -#if defined(__WIN32__) && !defined(__GNUC__) -#define SDLCALL __cdecl -#else -#ifdef __OS2__ -/* But on OS/2, we use the _System calling convention */ -/* to be compatible with every compiler */ -#define SDLCALL _System -#else -#define SDLCALL -#endif -#endif -#endif /* SDLCALL */ - -/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ -#ifdef __SYMBIAN32__ -#undef DECLSPEC -#define DECLSPEC -#endif /* __SYMBIAN32__ */ - -/* Force structure packing at 4 byte alignment. - This is necessary if the header is included in code which has structure - packing set to an alternate value, say for loading structures from disk. - The packing is reset to the previous value in close_code.h - */ -#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) -#ifdef _MSC_VER -#pragma warning(disable: 4103) -#endif -#ifdef __BORLANDC__ -#pragma nopackwarning -#endif -#pragma pack(push,4) -#endif /* Compiler needs structure packing set */ - -/* Set up compiler-specific options for inlining functions */ -#ifndef SDL_INLINE_OKAY -#ifdef __GNUC__ -#define SDL_INLINE_OKAY -#else -/* Add any special compiler-specific cases here */ -#if defined(_MSC_VER) || defined(__BORLANDC__) || \ - defined(__DMC__) || defined(__SC__) || \ - defined(__WATCOMC__) || defined(__LCC__) || \ - defined(__DECC) -#ifndef __inline__ -#define __inline__ __inline -#endif -#define SDL_INLINE_OKAY -#else -#if !defined(__MRC__) && !defined(_SGI_SOURCE) -#ifndef __inline__ -#define __inline__ inline -#endif -#define SDL_INLINE_OKAY -#endif /* Not a funky compiler */ -#endif /* Visual C++ */ -#endif /* GNU C */ -#endif /* SDL_INLINE_OKAY */ - -/* If inlining isn't supported, remove "__inline__", turning static - inlined functions into static functions (resulting in code bloat - in all files which include the offending header files) -*/ -#ifndef SDL_INLINE_OKAY -#define __inline__ -#endif - -/* Apparently this is needed by several Windows compilers */ -#if !defined(__MACH__) -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif /* NULL */ -#endif /* ! Mac OS X - breaks precompiled headers */ diff --git a/Externals/SDL/Include_1.3/close_code.h b/Externals/SDL/Include_1.3/close_code.h deleted file mode 100644 index 660933d5f5..0000000000 --- a/Externals/SDL/Include_1.3/close_code.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/* This file reverses the effects of begin_code.h and should be included - after you finish any function and structure declarations in your headers -*/ - -#undef _begin_code_h - -/* Reset structure packing at previous byte alignment */ -#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) -#ifdef __BORLANDC__ -#pragma nopackwarning -#endif -#pragma pack(pop) -#endif /* Compiler needs structure packing set */ diff --git a/Externals/SDL/Include_1.3/doxyfile b/Externals/SDL/Include_1.3/doxyfile deleted file mode 100644 index e53097f4bd..0000000000 --- a/Externals/SDL/Include_1.3/doxyfile +++ /dev/null @@ -1,1229 +0,0 @@ -# Doxyfile 1.4.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = SDL - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 1.3.0 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = docs - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, -# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, -# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is YES. - -SHOW_DIRECTORIES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = YES - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = DOXYGEN_SHOULD_IGNORE_THIS=1 \ - DECLSPEC= SDLCALL= - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = NO - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/Externals/SDL/src/joystick/darwin/SDL_sysjoystick.c b/Externals/SDL/src/joystick/darwin/SDL_sysjoystick.c index 32d82f6df3..8592a00a80 100644 --- a/Externals/SDL/src/joystick/darwin/SDL_sysjoystick.c +++ b/Externals/SDL/src/joystick/darwin/SDL_sysjoystick.c @@ -186,7 +186,7 @@ static IOReturn HIDCreateOpenDeviceInterface (io_object_t hidDevice, recDevice * plugInResult = (*ppPlugInInterface)->QueryInterface (ppPlugInInterface, CFUUIDGetUUIDBytes (kIOHIDDeviceInterfaceID), (void *) &(pDevice->interface)); if (S_OK != plugInResult) - HIDReportErrorNum ("CouldnÕt query HID class device interface from plugInInterface", plugInResult); + HIDReportErrorNum ("Couldn't query HID class device interface from plugInInterface", plugInResult); (*ppPlugInInterface)->Release (ppPlugInInterface); } else diff --git a/Externals/SDL/win32/SDL.1.3.dll b/Externals/SDL/win32/SDL.1.3.dll deleted file mode 100644 index 2e09512bee..0000000000 Binary files a/Externals/SDL/win32/SDL.1.3.dll and /dev/null differ diff --git a/Externals/SDL/win32/SDL.1.3.lib b/Externals/SDL/win32/SDL.1.3.lib deleted file mode 100644 index 0b64b9aea9..0000000000 Binary files a/Externals/SDL/win32/SDL.1.3.lib and /dev/null differ diff --git a/Externals/SDL/win32/SDL.dll b/Externals/SDL/win32/SDL.dll deleted file mode 100644 index ec6d2d845a..0000000000 Binary files a/Externals/SDL/win32/SDL.dll and /dev/null differ diff --git a/Externals/SDL/win32/SDL.lib b/Externals/SDL/win32/SDL.lib deleted file mode 100644 index eea0c81b21..0000000000 Binary files a/Externals/SDL/win32/SDL.lib and /dev/null differ diff --git a/Externals/SDL/x64/SDL.dll b/Externals/SDL/x64/SDL.dll deleted file mode 100644 index 0ee6467b6d..0000000000 Binary files a/Externals/SDL/x64/SDL.dll and /dev/null differ diff --git a/Externals/SDL/x64/SDL.lib b/Externals/SDL/x64/SDL.lib deleted file mode 100644 index 628ed345c1..0000000000 Binary files a/Externals/SDL/x64/SDL.lib and /dev/null differ diff --git a/Externals/SDL2-2.0.1/BUGS.txt b/Externals/SDL2-2.0.1/BUGS.txt new file mode 100644 index 0000000000..c5ed3af237 --- /dev/null +++ b/Externals/SDL2-2.0.1/BUGS.txt @@ -0,0 +1,16 @@ + +Bugs are now managed in the SDL bug tracker, here: + + http://bugzilla.libsdl.org/ + +You may report bugs there, and search to see if a given issue has already + been reported, discussed, and maybe even fixed. + + +You may also find help on the SDL mailing list. Subscription information: + + http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org + +Bug reports are welcome here, but we really appreciate if you use Bugzilla, as + bugs discussed on the mailing list may be forgotten or missed. + diff --git a/Externals/SDL2-2.0.1/COPYING.txt b/Externals/SDL2-2.0.1/COPYING.txt new file mode 100644 index 0000000000..397e7b45d6 --- /dev/null +++ b/Externals/SDL2-2.0.1/COPYING.txt @@ -0,0 +1,20 @@ + +Simple DirectMedia Layer +Copyright (C) 1997-2013 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/Externals/SDL2-2.0.1/README-SDL.txt b/Externals/SDL2-2.0.1/README-SDL.txt new file mode 100644 index 0000000000..fade0b9583 --- /dev/null +++ b/Externals/SDL2-2.0.1/README-SDL.txt @@ -0,0 +1,13 @@ + +Please distribute this file with the SDL runtime environment: + +The Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games and +emulators. + +The Simple DirectMedia Layer library source code is available from: +http://www.libsdl.org/ + +This library is distributed under the terms of the zlib license: +http://www.zlib.net/zlib_license.html + diff --git a/Externals/SDL2-2.0.1/README.txt b/Externals/SDL2-2.0.1/README.txt new file mode 100644 index 0000000000..0dcc6905ae --- /dev/null +++ b/Externals/SDL2-2.0.1/README.txt @@ -0,0 +1,38 @@ + + Simple DirectMedia Layer + + (SDL) + + Version 2.0 + +--- +http://www.libsdl.org/ + +Simple DirectMedia Layer is a cross-platform development library designed +to provide low level access to audio, keyboard, mouse, joystick, and graphics +hardware via OpenGL and Direct3D. It is used by video playback software, +emulators, and popular games including Valve's award winning catalog +and many Humble Bundle games. + +SDL officially supports Windows, Mac OS X, Linux, iOS, and Android. +Support for other platforms may be found in the source code. + +SDL is written in C, works natively with C++, and there are bindings +available for several other languages, including C# and Python. + +This library is distributed under the zlib license, which can be found +in the file "COPYING.txt". + +The best way to learn how to use SDL is to check out the header files in +the "include" subdirectory and the programs in the "test" subdirectory. +The header files and test programs are well commented and always up to date. +More documentation and FAQs are available online at: + http://wiki.libsdl.org/ + +If you need help with the library, or just want to discuss SDL related +issues, you can join the developers mailing list: + http://www.libsdl.org/mailing-list.php + +Enjoy! + Sam Lantinga (slouken@libsdl.org) + diff --git a/Externals/SDL2-2.0.1/WhatsNew.txt b/Externals/SDL2-2.0.1/WhatsNew.txt new file mode 100644 index 0000000000..00836d8632 --- /dev/null +++ b/Externals/SDL2-2.0.1/WhatsNew.txt @@ -0,0 +1,57 @@ + +This is a list of major changes in SDL's version history. + +--------------------------------------------------------------------------- +2.0.1: +--------------------------------------------------------------------------- + +General: +* Added an API to get common filesystem paths in SDL_filesystem.h: + SDL_GetBasePath(), SDL_GetPrefPath() +* Added an API to do optimized YV12 and IYUV texture updates: + SDL_UpdateYUVTexture() +* Added an API to get the amount of RAM on the system: + SDL_GetSystemRAM() +* Added a macro to perform timestamp comparisons with SDL_GetTicks(): + SDL_TICKS_PASSED() +* Dramatically improved OpenGL ES 2.0 rendering performance +* Added OpenGL attribute SDL_GL_FRAMEBUFFER_SRGB_CAPABLE + +Windows: +* Created a static library configuration for the Visual Studio 2010 project +* Added a hint to create the Direct3D device with support for multi-threading: + SDL_HINT_RENDER_DIRECT3D_THREADSAFE +* Added a function to get the D3D9 adapter index for a display: + SDL_Direct3D9GetAdapterIndex() +* Added a function to get the D3D9 device for a D3D9 renderer: + SDL_RenderGetD3D9Device() +* Fixed building SDL with the mingw32 toolchain (mingw-w64 is preferred) +* Fixed crash when using two XInput controllers at the same time +* Fixed detecting a mixture of XInput and DirectInput controllers +* Fixed clearing a D3D render target larger than the window +* Improved support for format specifiers in SDL_snprintf() + +Mac OS X: +* Added support for retina displays: + Create your window with the SDL_WINDOW_ALLOW_HIGHDPI flag, and then use SDL_GL_GetDrawableSize() to find the actual drawable size. You are responsible for scaling mouse and drawing coordinates appropriately. +* Fixed mouse warping in fullscreen mode +* Right mouse click is emulated by holding the Ctrl key while left clicking + +Linux: +* Fixed float audio support with the PulseAudio driver +* Fixed missing line endpoints in the OpenGL renderer on some drivers +* X11 symbols are no longer defined to avoid collisions when linking statically + +iOS: +* Fixed status bar visibility on iOS 7 +* Flipped the accelerometer Y axis to match expected values + +Android: +IMPORTANT: You MUST get the updated SDLActivity.java to match C code +* Moved EGL initialization to native code +* Fixed the accelerometer axis rotation relative to the device rotation +* Fixed race conditions when handling the EGL context on pause/resume +* Touch devices are available for enumeration immediately after init + +Raspberry Pi: +* Added support for the Raspberry Pi, see README-raspberrypi.txt for details diff --git a/Externals/SDL2-2.0.1/include/SDL.h b/Externals/SDL2-2.0.1/include/SDL.h new file mode 100644 index 0000000000..c0c067ca58 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL.h @@ -0,0 +1,163 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL.h + * + * Main include header for the SDL library + */ + +/** + * \mainpage Simple DirectMedia Layer (SDL) + * + * http://www.libsdl.org/ + * + * \section intro_sec Introduction + * + * Simple DirectMedia Layer is a cross-platform development library designed + * to provide low level access to audio, keyboard, mouse, joystick, and + * graphics hardware via OpenGL and Direct3D. It is used by video playback + * software, emulators, and popular games including Valve's award winning + * catalog and many Humble Bundle games. + * + * SDL officially supports Windows, Mac OS X, Linux, iOS, and Android. + * Support for other platforms may be found in the source code. + * + * SDL is written in C, works natively with C++, and there are bindings + * available for several other languages, including C# and Python. + * + * This library is distributed under the zlib license, which can be found + * in the file "COPYING.txt". + * + * The best way to learn how to use SDL is to check out the header files in + * the "include" subdirectory and the programs in the "test" subdirectory. + * The header files and test programs are well commented and always up to date. + * More documentation and FAQs are available online at: + * http://wiki.libsdl.org/ + * + * If you need help with the library, or just want to discuss SDL related + * issues, you can join the developers mailing list: + * http://www.libsdl.org/mailing-list.php + * + * Enjoy! + * Sam Lantinga (slouken@libsdl.org) + */ + +#ifndef _SDL_H +#define _SDL_H + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_assert.h" +#include "SDL_atomic.h" +#include "SDL_audio.h" +#include "SDL_clipboard.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_filesystem.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_haptic.h" +#include "SDL_hints.h" +#include "SDL_loadso.h" +#include "SDL_log.h" +#include "SDL_messagebox.h" +#include "SDL_mutex.h" +#include "SDL_power.h" +#include "SDL_render.h" +#include "SDL_rwops.h" +#include "SDL_system.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_version.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* As of version 0.5, SDL is loaded dynamically into the application */ + +/** + * \name SDL_INIT_* + * + * These are the flags which may be passed to SDL_Init(). You should + * specify the subsystems which you will be using in your application. + */ +/* @{ */ +#define SDL_INIT_TIMER 0x00000001 +#define SDL_INIT_AUDIO 0x00000010 +#define SDL_INIT_VIDEO 0x00000020 /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ +#define SDL_INIT_JOYSTICK 0x00000200 /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ +#define SDL_INIT_HAPTIC 0x00001000 +#define SDL_INIT_GAMECONTROLLER 0x00002000 /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ +#define SDL_INIT_EVENTS 0x00004000 +#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ +#define SDL_INIT_EVERYTHING ( \ + SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ + SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \ + ) +/* @} */ + +/** + * This function initializes the subsystems specified by \c flags + * Unless the ::SDL_INIT_NOPARACHUTE flag is set, it will install cleanup + * signal handlers for some commonly ignored fatal signals (like SIGSEGV). + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** + * This function initializes specific SDL subsystems + */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** + * This function cleans up specific SDL subsystems + */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** + * This function returns a mask of the specified subsystems which have + * previously been initialized. + * + * If \c flags is 0, it returns a mask of all initialized subsystems. + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** + * This function cleans up all initialized subsystems. You should + * call it upon all exit conditions. + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_H */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_assert.h b/Externals/SDL2-2.0.1/include/SDL_assert.h new file mode 100644 index 0000000000..4329434064 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_assert.h @@ -0,0 +1,246 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_assert_h +#define _SDL_assert_h + +#include "SDL_config.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDL_ASSERT_LEVEL +#ifdef SDL_DEFAULT_ASSERT_LEVEL +#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL +#elif defined(_DEBUG) || defined(DEBUG) || \ + (defined(__GNUC__) && !defined(__OPTIMIZE__)) +#define SDL_ASSERT_LEVEL 2 +#else +#define SDL_ASSERT_LEVEL 1 +#endif +#endif /* SDL_ASSERT_LEVEL */ + +/* +These are macros and not first class functions so that the debugger breaks +on the assertion line and not in some random guts of SDL, and so each +assert can have unique static variables associated with it. +*/ + +#if defined(_MSC_VER) +/* Don't include intrin.h here because it contains C++ code */ + extern void __cdecl __debugbreak(void); + #define SDL_TriggerBreakpoint() __debugbreak() +#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) +#elif defined(HAVE_SIGNAL_H) + #include + #define SDL_TriggerBreakpoint() raise(SIGTRAP) +#else + /* How do we trigger breakpoints on this platform? */ + #define SDL_TriggerBreakpoint() +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +# define SDL_FUNCTION __func__ +#elif ((__GNUC__ >= 2) || defined(_MSC_VER)) +# define SDL_FUNCTION __FUNCTION__ +#else +# define SDL_FUNCTION "???" +#endif +#define SDL_FILE __FILE__ +#define SDL_LINE __LINE__ + +/* +sizeof (x) makes the compiler still parse the expression even without +assertions enabled, so the code is always checked at compile time, but +doesn't actually generate code for it, so there are no side effects or +expensive checks at run time, just the constant size of what x WOULD be, +which presumably gets optimized out as unused. +This also solves the problem of... + + int somevalue = blah(); + SDL_assert(somevalue == 1); + +...which would cause compiles to complain that somevalue is unused if we +disable assertions. +*/ + +#ifdef _MSC_VER /* stupid /W4 warnings. */ +#define SDL_NULL_WHILE_LOOP_CONDITION (-1 == __LINE__) +#else +#define SDL_NULL_WHILE_LOOP_CONDITION (0) +#endif + +#define SDL_disabled_assert(condition) \ + do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) + +typedef enum +{ + SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ + SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ + SDL_ASSERTION_ABORT, /**< Terminate the program. */ + SDL_ASSERTION_IGNORE, /**< Ignore the assert. */ + SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */ +} SDL_assert_state; + +typedef struct SDL_assert_data +{ + int always_ignore; + unsigned int trigger_count; + const char *condition; + const char *filename; + int linenum; + const char *function; + const struct SDL_assert_data *next; +} SDL_assert_data; + +#if (SDL_ASSERT_LEVEL > 0) + +/* Never call this directly. Use the SDL_assert* macros. */ +extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, + const char *, + const char *, int); + +/* the do {} while(0) avoids dangling else problems: + if (x) SDL_assert(y); else blah(); + ... without the do/while, the "else" could attach to this macro's "if". + We try to handle just the minimum we need here in a macro...the loop, + the static vars, and break points. The heavy lifting is handled in + SDL_ReportAssertion(), in SDL_assert.c. +*/ +#define SDL_enabled_assert(condition) \ + do { \ + while ( !(condition) ) { \ + static struct SDL_assert_data assert_data = { \ + 0, 0, #condition, 0, 0, 0, 0 \ + }; \ + const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \ + SDL_FUNCTION, \ + SDL_FILE, \ + SDL_LINE); \ + if (state == SDL_ASSERTION_RETRY) { \ + continue; /* go again. */ \ + } else if (state == SDL_ASSERTION_BREAK) { \ + SDL_TriggerBreakpoint(); \ + } \ + break; /* not retrying. */ \ + } \ + } while (SDL_NULL_WHILE_LOOP_CONDITION) + +#endif /* enabled assertions support code */ + +/* Enable various levels of assertions. */ +#if SDL_ASSERT_LEVEL == 0 /* assertions disabled */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_disabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 1 /* release settings. */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 2 /* normal settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) +#else +# error Unknown assertion level. +#endif + +/* this assertion is never disabled at any level. */ +#define SDL_assert_always(condition) SDL_enabled_assert(condition) + + +typedef SDL_assert_state (SDLCALL *SDL_AssertionHandler)( + const SDL_assert_data* data, void* userdata); + +/** + * \brief Set an application-defined assertion handler. + * + * This allows an app to show its own assertion UI and/or force the + * response to an assertion failure. If the app doesn't provide this, SDL + * will try to do the right thing, popping up a system-specific GUI dialog, + * and probably minimizing any fullscreen windows. + * + * This callback may fire from any thread, but it runs wrapped in a mutex, so + * it will only fire from one thread at a time. + * + * Setting the callback to NULL restores SDL's original internal handler. + * + * This callback is NOT reset to SDL's internal handler upon SDL_Quit()! + * + * \return SDL_assert_state value of how to handle the assertion failure. + * + * \param handler Callback function, called when an assertion fails. + * \param userdata A pointer passed to the callback as-is. + */ +extern DECLSPEC void SDLCALL SDL_SetAssertionHandler( + SDL_AssertionHandler handler, + void *userdata); + +/** + * \brief Get a list of all assertion failures. + * + * Get all assertions triggered since last call to SDL_ResetAssertionReport(), + * or the start of the program. + * + * The proper way to examine this data looks something like this: + * + * + * const SDL_assert_data *item = SDL_GetAssertionReport(); + * while (item) { + * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\n", + * item->condition, item->function, item->filename, + * item->linenum, item->trigger_count, + * item->always_ignore ? "yes" : "no"); + * item = item->next; + * } + * + * + * \return List of all assertions. + * \sa SDL_ResetAssertionReport + */ +extern DECLSPEC const SDL_assert_data * SDLCALL SDL_GetAssertionReport(void); + +/** + * \brief Reset the list of all assertion failures. + * + * Reset list of all assertions triggered. + * + * \sa SDL_GetAssertionReport + */ +extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_assert_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_atomic.h b/Externals/SDL2-2.0.1/include/SDL_atomic.h new file mode 100644 index 0000000000..48b0053a0f --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_atomic.h @@ -0,0 +1,359 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_atomic.h + * + * Atomic operations. + * + * IMPORTANT: + * If you are not an expert in concurrent lockless programming, you should + * only be using the atomic lock and reference counting functions in this + * file. In all other cases you should be protecting your data structures + * with full mutexes. + * + * The list of "safe" functions to use are: + * SDL_AtomicLock() + * SDL_AtomicUnlock() + * SDL_AtomicIncRef() + * SDL_AtomicDecRef() + * + * Seriously, here be dragons! + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * + * You can find out a little more about lockless programming and the + * subtle issues that can arise here: + * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx + * + * There's also lots of good information here: + * http://www.1024cores.net/home/lock-free-algorithms + * http://preshing.com/ + * + * These operations may or may not actually be implemented using + * processor specific atomic operations. When possible they are + * implemented as true processor specific atomic operations. When that + * is not possible the are implemented using locks that *do* use the + * available atomic operations. + * + * All of the atomic operations that modify memory are full memory barriers. + */ + +#ifndef _SDL_atomic_h_ +#define _SDL_atomic_h_ + +#include "SDL_stdinc.h" +#include "SDL_platform.h" + +#include "begin_code.h" + +/* Need to do this here because intrin.h has C++ code in it */ +/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) +#include +#define HAVE_MSC_ATOMICS 1 +#endif + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name SDL AtomicLock + * + * The atomic locks are efficient spinlocks using CPU instructions, + * but are vulnerable to starvation and can spin forever if a thread + * holding a lock has been terminated. For this reason you should + * minimize the code executed inside an atomic lock and never do + * expensive things like API or system calls while holding them. + * + * The atomic locks are not safe to lock recursively. + * + * Porting Note: + * The spin lock functions and type are required and can not be + * emulated because they are used in the atomic emulation code. + */ +/* @{ */ + +typedef int SDL_SpinLock; + +/** + * \brief Try to lock a spin lock by setting it to a non-zero value. + * + * \param lock Points to the lock. + * + * \return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); + +/** + * \brief Lock a spin lock by setting it to a non-zero value. + * + * \param lock Points to the lock. + */ +extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); + +/** + * \brief Unlock a spin lock by setting it to 0. Always returns immediately + * + * \param lock Points to the lock. + */ +extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); + +/* @} *//* SDL AtomicLock */ + + +/** + * The compiler barrier prevents the compiler from reordering + * reads and writes to globally visible variables across the call. + */ +#if defined(_MSC_VER) && (_MSC_VER > 1200) +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) +#define SDL_CompilerBarrier() _ReadWriteBarrier() +#elif defined(__GNUC__) +#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") +#else +#define SDL_CompilerBarrier() \ +{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } +#endif + +/** + * Memory barriers are designed to prevent reads and writes from being + * reordered by the compiler and being seen out of order on multi-core CPUs. + * + * A typical pattern would be for thread A to write some data and a flag, + * and for thread B to read the flag and get the data. In this case you + * would insert a release barrier between writing the data and the flag, + * guaranteeing that the data write completes no later than the flag is + * written, and you would insert an acquire barrier between reading the + * flag and reading the data, to ensure that all the reads associated + * with the flag have completed. + * + * In this pattern you should always see a release barrier paired with + * an acquire barrier and you should gate the data reads/writes with a + * single flag variable. + * + * For more information on these semantics, take a look at the blog post: + * http://preshing.com/20120913/acquire-and-release-semantics + */ +#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory") +#elif defined(__GNUC__) && defined(__arm__) +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) +#ifdef __thumb__ +/* The mcr instruction isn't available in thumb mode, use real functions */ +extern DECLSPEC void SDLCALL SDL_MemoryBarrierRelease(); +extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquire(); +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#endif /* __thumb__ */ +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory") +#endif /* __GNUC__ && __arm__ */ +#else +/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */ +#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier() +#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier() +#endif + + +/* Platform specific optimized versions of the atomic functions, + * you can disable these by defining SDL_DISABLE_ATOMIC_INLINE + */ +#if defined(SDL_ATOMIC_DISABLED) && SDL_ATOMIC_DISABLED +#define SDL_DISABLE_ATOMIC_INLINE +#endif +#ifndef SDL_DISABLE_ATOMIC_INLINE + +#ifdef HAVE_MSC_ATOMICS + +#define SDL_AtomicSet(a, v) _InterlockedExchange((long*)&(a)->value, (v)) +#define SDL_AtomicAdd(a, v) _InterlockedExchangeAdd((long*)&(a)->value, (v)) +#define SDL_AtomicCAS(a, oldval, newval) (_InterlockedCompareExchange((long*)&(a)->value, (newval), (oldval)) == (oldval)) +#define SDL_AtomicSetPtr(a, v) _InterlockedExchangePointer((a), (v)) +#if _M_IX86 +#define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchange((long*)(a), (long)(newval), (long)(oldval)) == (long)(oldval)) +#else +#define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchangePointer((a), (newval), (oldval)) == (oldval)) +#endif + +#elif defined(__MACOSX__) +#include + +#define SDL_AtomicCAS(a, oldval, newval) OSAtomicCompareAndSwap32Barrier((oldval), (newval), &(a)->value) +#ifdef __LP64__ +#define SDL_AtomicCASPtr(a, oldval, newval) OSAtomicCompareAndSwap64Barrier((int64_t)(oldval), (int64_t)(newval), (int64_t*)(a)) +#else +#define SDL_AtomicCASPtr(a, oldval, newval) OSAtomicCompareAndSwap32Barrier((int32_t)(oldval), (int32_t)(newval), (int32_t*)(a)) +#endif + +#elif defined(HAVE_GCC_ATOMICS) + +#define SDL_AtomicSet(a, v) __sync_lock_test_and_set(&(a)->value, v) +#define SDL_AtomicAdd(a, v) __sync_fetch_and_add(&(a)->value, v) +#define SDL_AtomicSetPtr(a, v) __sync_lock_test_and_set(a, v) +#define SDL_AtomicCAS(a, oldval, newval) __sync_bool_compare_and_swap(&(a)->value, oldval, newval) +#define SDL_AtomicCASPtr(a, oldval, newval) __sync_bool_compare_and_swap(a, oldval, newval) + +#endif + +#endif /* !SDL_DISABLE_ATOMIC_INLINE */ + + +/** + * \brief A type representing an atomic integer value. It is a struct + * so people don't accidentally use numeric operations on it. + */ +#ifndef SDL_atomic_t_defined +typedef struct { int value; } SDL_atomic_t; +#endif + +/** + * \brief Set an atomic variable to a new value if it is currently an old value. + * + * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. + * + * \note If you don't know what this function is for, you shouldn't use it! +*/ +#ifndef SDL_AtomicCAS +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval); +#endif + +/** + * \brief Set an atomic variable to a value. + * + * \return The previous value of the atomic variable. + */ +#ifndef SDL_AtomicSet +SDL_FORCE_INLINE int SDL_AtomicSet(SDL_atomic_t *a, int v) +{ + int value; + do { + value = a->value; + } while (!SDL_AtomicCAS(a, value, v)); + return value; +} +#endif + +/** + * \brief Get the value of an atomic variable + */ +#ifndef SDL_AtomicGet +SDL_FORCE_INLINE int SDL_AtomicGet(SDL_atomic_t *a) +{ + int value = a->value; + SDL_CompilerBarrier(); + return value; +} +#endif + +/** + * \brief Add to an atomic variable. + * + * \return The previous value of the atomic variable. + * + * \note This same style can be used for any number operation + */ +#ifndef SDL_AtomicAdd +SDL_FORCE_INLINE int SDL_AtomicAdd(SDL_atomic_t *a, int v) +{ + int value; + do { + value = a->value; + } while (!SDL_AtomicCAS(a, value, (value + v))); + return value; +} +#endif + +/** + * \brief Increment an atomic variable used as a reference count. + */ +#ifndef SDL_AtomicIncRef +#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#endif + +/** + * \brief Decrement an atomic variable used as a reference count. + * + * \return SDL_TRUE if the variable reached zero after decrementing, + * SDL_FALSE otherwise + */ +#ifndef SDL_AtomicDecRef +#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#endif + +/** + * \brief Set a pointer to a new value if it is currently an old value. + * + * \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise. + * + * \note If you don't know what this function is for, you shouldn't use it! +*/ +#ifndef SDL_AtomicCASPtr +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void* *a, void *oldval, void *newval); +#endif + +/** + * \brief Set a pointer to a value atomically. + * + * \return The previous value of the pointer. + */ +#ifndef SDL_AtomicSetPtr +SDL_FORCE_INLINE void* SDL_AtomicSetPtr(void* *a, void* v) +{ + void* value; + do { + value = *a; + } while (!SDL_AtomicCASPtr(a, value, v)); + return value; +} +#endif + +/** + * \brief Get the value of a pointer atomically. + */ +#ifndef SDL_AtomicGetPtr +SDL_FORCE_INLINE void* SDL_AtomicGetPtr(void* *a) +{ + void* value = *a; + SDL_CompilerBarrier(); + return value; +} +#endif + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif + +#include "close_code.h" + +#endif /* _SDL_atomic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_audio.h b/Externals/SDL2-2.0.1/include/SDL_audio.h new file mode 100644 index 0000000000..b9da236fc5 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_audio.h @@ -0,0 +1,506 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_audio.h + * + * Access to the raw audio mixing buffer for the SDL library. + */ + +#ifndef _SDL_audio_h +#define _SDL_audio_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Audio format flags. + * + * These are what the 16 bits in SDL_AudioFormat currently mean... + * (Unspecified bits are always zero). + * + * \verbatim + ++-----------------------sample is signed if set + || + || ++-----------sample is bigendian if set + || || + || || ++---sample is float if set + || || || + || || || +---sample bit size---+ + || || || | | + 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + \endverbatim + * + * There are macros in SDL 2.0 and later to query these bits. + */ +typedef Uint16 SDL_AudioFormat; + +/** + * \name Audio flags + */ +/* @{ */ + +#define SDL_AUDIO_MASK_BITSIZE (0xFF) +#define SDL_AUDIO_MASK_DATATYPE (1<<8) +#define SDL_AUDIO_MASK_ENDIAN (1<<12) +#define SDL_AUDIO_MASK_SIGNED (1<<15) +#define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE) +#define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE) +#define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN) +#define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED) +#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) +#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) +#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) + +/** + * \name Audio format flags + * + * Defaults to LSB byte order. + */ +/* @{ */ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB +/* @} */ + +/** + * \name int32 support + */ +/* @{ */ +#define AUDIO_S32LSB 0x8020 /**< 32-bit integer samples */ +#define AUDIO_S32MSB 0x9020 /**< As above, but big-endian byte order */ +#define AUDIO_S32 AUDIO_S32LSB +/* @} */ + +/** + * \name float32 support + */ +/* @{ */ +#define AUDIO_F32LSB 0x8120 /**< 32-bit floating point samples */ +#define AUDIO_F32MSB 0x9120 /**< As above, but big-endian byte order */ +#define AUDIO_F32 AUDIO_F32LSB +/* @} */ + +/** + * \name Native audio byte ordering + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#define AUDIO_S32SYS AUDIO_S32LSB +#define AUDIO_F32SYS AUDIO_F32LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#define AUDIO_S32SYS AUDIO_S32MSB +#define AUDIO_F32SYS AUDIO_F32MSB +#endif +/* @} */ + +/** + * \name Allow change flags + * + * Which audio format changes are allowed when opening a device. + */ +/* @{ */ +#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001 +#define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002 +#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004 +#define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE) +/* @} */ + +/* @} *//* Audio flags */ + +/** + * This function is called when the audio device needs more data. + * + * \param userdata An application-specific parameter saved in + * the SDL_AudioSpec structure + * \param stream A pointer to the audio data buffer. + * \param len The length of that buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + */ +typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, + int len); + +/** + * The calculated values in this structure are calculated by SDL_OpenAudio(). + */ +typedef struct SDL_AudioSpec +{ + int freq; /**< DSP frequency -- samples per second */ + SDL_AudioFormat format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in samples (power of 2) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + SDL_AudioCallback callback; + void *userdata; +} SDL_AudioSpec; + + +struct SDL_AudioCVT; +typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt, + SDL_AudioFormat format); + +/** + * A structure to hold a set of audio conversion filters and buffers. + */ +#ifdef __GNUC__ +/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't + pad it out to 88 bytes to guarantee ABI compatibility between compilers. + vvv + The next time we rev the ABI, make sure to size the ints and add padding. +*/ +#define SDL_AUDIOCVT_PACKED __attribute__((packed)) +#else +#define SDL_AUDIOCVT_PACKED +#endif +/* */ +typedef struct SDL_AudioCVT +{ + int needed; /**< Set to 1 if conversion possible */ + SDL_AudioFormat src_format; /**< Source audio format */ + SDL_AudioFormat dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + SDL_AudioFilter filters[10]; /**< Filter list */ + int filter_index; /**< Current audio conversion function */ +} SDL_AUDIOCVT_PACKED SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * \name Driver discovery functions + * + * These functions return the list of built in audio drivers, in the + * order that they are normally initialized by default. + */ +/* @{ */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); +extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index); +/* @} */ + +/** + * \name Initialization and cleanup + * + * \internal These functions are used internally, and should not be used unless + * you have a specific need to specify the audio driver you want to + * use. You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/* @{ */ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/* @} */ + +/** + * This function returns the name of the current audio driver, or NULL + * if no driver has been initialized. + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); + +/** + * This function opens the audio device with the desired parameters, and + * returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by \c obtained. If \c obtained is NULL, the audio + * data passed to the callback function will be guaranteed to be in the + * requested format, and will be automatically converted to the hardware + * audio format if necessary. This function returns -1 if it failed + * to open the audio device, or couldn't set up the audio thread. + * + * When filling in the desired audio spec structure, + * - \c desired->freq should be the desired audio frequency in samples-per- + * second. + * - \c desired->format should be the desired audio format. + * - \c desired->samples is the desired size of the audio buffer, in + * samples. This number should be a power of two, and may be adjusted by + * the audio driver to a value more suitable for the hardware. Good values + * seem to range between 512 and 8096 inclusive, depending on the + * application and CPU speed. Smaller values yield faster response time, + * but can lead to underflow if the application is doing heavy processing + * and cannot fill the audio buffer in time. A stereo sample consists of + * both right and left channels in LR ordering. + * Note that the number of samples is directly related to time by the + * following formula: \code ms = (samples*1000)/freq \endcode + * - \c desired->size is the size in bytes of the audio buffer, and is + * calculated by SDL_OpenAudio(). + * - \c desired->silence is the value used to set the buffer to silence, + * and is calculated by SDL_OpenAudio(). + * - \c desired->callback should be set to a function that will be called + * when the audio device is ready for more data. It is passed a pointer + * to the audio buffer, and the length in bytes of the audio buffer. + * This function usually runs in a separate thread, and so you should + * protect data structures that it accesses by calling SDL_LockAudio() + * and SDL_UnlockAudio() in your code. + * - \c desired->userdata is passed as the first parameter to your callback + * function. + * + * The audio device starts out playing silence when it's opened, and should + * be enabled for playing by calling \c SDL_PauseAudio(0) when you are ready + * for your audio callback function to be called. Since the audio driver + * may modify the requested size of the audio buffer, you should allocate + * any local mixing buffers after you open the audio device. + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, + SDL_AudioSpec * obtained); + +/** + * SDL Audio Device IDs. + * + * A successful call to SDL_OpenAudio() is always device id 1, and legacy + * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls + * always returns devices >= 2 on success. The legacy calls are good both + * for backwards compatibility and when you don't care about multiple, + * specific, or capture devices. + */ +typedef Uint32 SDL_AudioDeviceID; + +/** + * Get the number of available devices exposed by the current driver. + * Only valid after a successfully initializing the audio subsystem. + * Returns -1 if an explicit list of devices can't be determined; this is + * not an error. For example, if SDL is set up to talk to a remote audio + * server, it can't list every one available on the Internet, but it will + * still allow a specific host to be specified to SDL_OpenAudioDevice(). + * + * In many common cases, when this function returns a value <= 0, it can still + * successfully open the default device (NULL for first argument of + * SDL_OpenAudioDevice()). + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); + +/** + * Get the human-readable name of a specific audio device. + * Must be a value between 0 and (number of audio devices-1). + * Only valid after a successfully initializing the audio subsystem. + * The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); recall that function to redetect available + * hardware. + * + * The string returned by this function is UTF-8 encoded, read-only, and + * managed internally. You are not to free it. If you need to keep the + * string for any length of time, you should make your own copy of it, as it + * will be invalid next time any of several other SDL functions is called. + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, + int iscapture); + + +/** + * Open a specific audio device. Passing in a device name of NULL requests + * the most reasonable default (and is equivalent to calling SDL_OpenAudio()). + * + * The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but + * some drivers allow arbitrary and driver-specific strings, such as a + * hostname/IP address for a remote audio server, or a filename in the + * diskaudio driver. + * + * \return 0 on error, a valid device ID that is >= 2 on success. + * + * SDL_OpenAudio(), unlike this function, always acts on device ID 1. + */ +extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char + *device, + int iscapture, + const + SDL_AudioSpec * + desired, + SDL_AudioSpec * + obtained, + int + allowed_changes); + + + +/** + * \name Audio state + * + * Get the current audio state. + */ +/* @{ */ +typedef enum +{ + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_AudioStatus; +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void); + +extern DECLSPEC SDL_AudioStatus SDLCALL +SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev); +/* @} *//* Audio State */ + +/** + * \name Pause audio functions + * + * These functions pause and unpause the audio callback processing. + * They should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +/* @{ */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); +extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev, + int pause_on); +/* @} *//* Pause audio functions */ + +/** + * This function loads a WAVE from the data source, automatically freeing + * that source if \c freesrc is non-zero. For example, to load a WAVE file, + * you could do: + * \code + * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); + * \endcode + * + * If this function succeeds, it returns the given SDL_AudioSpec, + * filled with the audio data format of the wave data, and sets + * \c *audio_buf to a malloc()'d buffer containing the audio data, + * and sets \c *audio_len to the length of that audio buffer, in bytes. + * You need to free the audio buffer with SDL_FreeWAV() when you are + * done with it. + * + * This function returns NULL and sets the SDL error message if the + * wave file cannot be opened, uses an unknown data format, or is + * corrupt. Currently raw and MS-ADPCM WAVE files are supported. + */ +extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, + int freesrc, + SDL_AudioSpec * spec, + Uint8 ** audio_buf, + Uint32 * audio_len); + +/** + * Loads a WAV from a file. + * Compatibility convenience function. + */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * This function frees data previously allocated with SDL_LoadWAV_RW() + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); + +/** + * This function takes a source format and rate and a destination format + * and rate, and initializes the \c cvt structure with information needed + * by SDL_ConvertAudio() to convert a buffer of audio data from one format + * to the other. + * + * \return -1 if the format conversion is not supported, 0 if there's + * no conversion needed, or 1 if the audio filter is set up. + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, + SDL_AudioFormat src_format, + Uint8 src_channels, + int src_rate, + SDL_AudioFormat dst_format, + Uint8 dst_channels, + int dst_rate); + +/** + * Once you have initialized the \c cvt structure using SDL_BuildAudioCVT(), + * created an audio buffer \c cvt->buf, and filled it with \c cvt->len bytes of + * audio data in the source format, this function will convert it in-place + * to the desired format. + * + * The data conversion may expand the size of the audio data, so the buffer + * \c cvt->buf should be allocated after the \c cvt structure is initialized by + * SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long. + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); + +#define SDL_MIX_MAXVOLUME 128 +/** + * This takes two audio buffers of the playing audio format and mixes + * them, performing addition, volume adjustment, and overflow clipping. + * The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME + * for full audio volume. Note this does not change hardware volume. + * This is provided for convenience -- you can mix your own audio data. + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, + Uint32 len, int volume); + +/** + * This works like SDL_MixAudio(), but you specify the audio format instead of + * using the format of audio device 1. Thus it can be used when no audio + * device is open at all. + */ +extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, + const Uint8 * src, + SDL_AudioFormat format, + Uint32 len, int volume); + +/** + * \name Audio lock functions + * + * The lock manipulated by these functions protects the callback function. + * During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that + * the callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/* @{ */ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); +extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev); +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); +extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev); +/* @} *//* Audio lock functions */ + +/** + * This function shuts down audio processing and closes the audio device. + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); +extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_audio_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_bits.h b/Externals/SDL2-2.0.1/include/SDL_bits.h new file mode 100644 index 0000000000..b1ed20bf72 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_bits.h @@ -0,0 +1,97 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_bits.h + * + * Functions for fiddling with bits and bitmasks. + */ + +#ifndef _SDL_bits_h +#define _SDL_bits_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_bits.h + */ + +/** + * Get the index of the most significant bit. Result is undefined when called + * with 0. This operation can also be stated as "count leading zeroes" and + * "log base 2". + * + * \return Index of the most significant bit, or -1 if the value is 0. + */ +SDL_FORCE_INLINE int +SDL_MostSignificantBitIndex32(Uint32 x) +{ +#if defined(__GNUC__) && __GNUC__ >= 4 + /* Count Leading Zeroes builtin in GCC. + * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html + */ + if (x == 0) { + return -1; + } + return 31 - __builtin_clz(x); +#else + /* Based off of Bit Twiddling Hacks by Sean Eron Anderson + * , released in the public domain. + * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog + */ + const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const int S[] = {1, 2, 4, 8, 16}; + + int msbIndex = 0; + int i; + + if (x == 0) { + return -1; + } + + for (i = 4; i >= 0; i--) + { + if (x & b[i]) + { + x >>= S[i]; + msbIndex |= S[i]; + } + } + + return msbIndex; +#endif +} + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_bits_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_blendmode.h b/Externals/SDL2-2.0.1/include/SDL_blendmode.h new file mode 100644 index 0000000000..85aa474595 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_blendmode.h @@ -0,0 +1,63 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_blendmode.h + * + * Header file declaring the SDL_BlendMode enumeration + */ + +#ifndef _SDL_blendmode_h +#define _SDL_blendmode_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The blend mode used in SDL_RenderCopy() and drawing operations. + */ +typedef enum +{ + SDL_BLENDMODE_NONE = 0x00000000, /**< no blending + dstRGBA = srcRGBA */ + SDL_BLENDMODE_BLEND = 0x00000001, /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = srcA + (dstA * (1-srcA)) */ + SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending + dstRGB = (srcRGB * srcA) + dstRGB + dstA = dstA */ + SDL_BLENDMODE_MOD = 0x00000004 /**< color modulate + dstRGB = srcRGB * dstRGB + dstA = dstA */ +} SDL_BlendMode; + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_clipboard.h b/Externals/SDL2-2.0.1/include/SDL_clipboard.h new file mode 100644 index 0000000000..1f5742d167 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_clipboard.h @@ -0,0 +1,71 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_clipboard.h + * + * Include file for SDL clipboard handling + */ + +#ifndef _SDL_clipboard_h +#define _SDL_clipboard_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Put UTF-8 text into the clipboard + * + * \sa SDL_GetClipboardText() + */ +extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); + +/** + * \brief Get UTF-8 text from the clipboard, which must be freed with SDL_free() + * + * \sa SDL_SetClipboardText() + */ +extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); + +/** + * \brief Returns a flag indicating whether the clipboard exists and contains a text string that is non-empty + * + * \sa SDL_GetClipboardText() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_clipboard_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_config_win32.h b/Externals/SDL2-2.0.1/include/SDL_config.h similarity index 54% rename from Externals/SDL/Include_1.3/SDL_config_win32.h rename to Externals/SDL2-2.0.1/include/SDL_config.h index 9d0da4dcd8..4d5c7c293f 100644 --- a/Externals/SDL/Include_1.3/SDL_config_win32.h +++ b/Externals/SDL2-2.0.1/include/SDL_config.h @@ -1,34 +1,34 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ -#ifndef _SDL_config_win32_h -#define _SDL_config_win32_h +#ifndef _SDL_config_windows_h +#define _SDL_config_windows_h #include "SDL_platform.h" /* This is a set of defines to configure the SDL features */ -#if defined(__GNUC__) || defined(__DMC__) -#define HAVE_STDINT_H 1 +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 #elif defined(_MSC_VER) typedef signed __int8 int8_t; typedef unsigned __int8 uint8_t; @@ -68,10 +68,15 @@ typedef unsigned int size_t; #endif typedef unsigned int uintptr_t; #endif /* __GNUC__ || _MSC_VER */ -#define SDL_HAS_64BIT_TYPE 1 +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ -/* Enabled for SDL 1.2 (binary compatibility) */ -//#define HAVE_LIBC 1 +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ #ifdef HAVE_LIBC /* Useful headers */ #define HAVE_STDIO_H 1 @@ -79,9 +84,7 @@ typedef unsigned int uintptr_t; #define HAVE_STRING_H 1 #define HAVE_CTYPE_H 1 #define HAVE_MATH_H 1 -#ifndef _WIN32_WCE #define HAVE_SIGNAL_H 1 -#endif /* C library functions */ #define HAVE_MALLOC 1 @@ -102,12 +105,10 @@ typedef unsigned int uintptr_t; #define HAVE_STRCHR 1 #define HAVE_STRRCHR 1 #define HAVE_STRSTR 1 -#define HAVE_ITOA 1 #define HAVE__LTOA 1 #define HAVE__ULTOA 1 #define HAVE_STRTOL 1 #define HAVE_STRTOUL 1 -#define HAVE_STRTOLL 1 #define HAVE_STRTOD 1 #define HAVE_ATOI 1 #define HAVE_ATOF 1 @@ -115,79 +116,80 @@ typedef unsigned int uintptr_t; #define HAVE_STRNCMP 1 #define HAVE__STRICMP 1 #define HAVE__STRNICMP 1 -#define HAVE_SSCANF 1 -#define HAVE_M_PI 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 #define HAVE_CEIL 1 -#define HAVE_COPYSIGN 1 #define HAVE_COS 1 #define HAVE_COSF 1 #define HAVE_FABS 1 #define HAVE_FLOOR 1 #define HAVE_LOG 1 #define HAVE_POW 1 -#define HAVE_SCALBN 1 #define HAVE_SIN 1 #define HAVE_SINF 1 #define HAVE_SQRT 1 +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_SSCANF 1 +#define HAVE_COPYSIGN 1 +#define HAVE_SCALBN 1 +#endif +#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES) +#define HAVE_M_PI 1 +#endif #else -#define HAVE_STDARG_H 1 -#define HAVE_STDDEF_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 #endif /* Enable various audio drivers */ -#ifndef _WIN32_WCE -#define SDL_AUDIO_DRIVER_DSOUND 1 -#endif -#define SDL_AUDIO_DRIVER_WINWAVEOUT 1 -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 - -/* Enable various cdrom drivers */ -#ifdef _WIN32_WCE -#define SDL_CDROM_DISABLED 1 -#else -#define SDL_CDROM_WIN32 1 -#endif +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_XAUDIO2 1 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 /* Enable various input drivers */ -#ifdef _WIN32_WCE -#define SDL_JOYSTICK_DISABLED 1 -#define SDL_HAPTIC_DUMMY 1 -#else -#define SDL_JOYSTICK_DINPUT 1 -#define SDL_HAPTIC_DINPUT 1 -#endif +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_HAPTIC_DINPUT 1 /* Enable various shared object loading systems */ -#define SDL_LOADSO_WIN32 1 +#define SDL_LOADSO_WINDOWS 1 /* Enable various threading systems */ -#define SDL_THREAD_WIN32 1 +#define SDL_THREAD_WINDOWS 1 /* Enable various timer systems */ -#ifdef _WIN32_WCE -#define SDL_TIMER_WINCE 1 -#else -#define SDL_TIMER_WIN32 1 -#endif +#define SDL_TIMER_WINDOWS 1 /* Enable various video drivers */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -#define SDL_VIDEO_DRIVER_WIN32 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 -#define SDL_VIDEO_RENDER_D3D 1 -#define SDL_VIDEO_RENDER_GDI 1 +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif /* Enable OpenGL support */ -#ifndef _WIN32_WCE -#define SDL_VIDEO_OPENGL 1 -#define SDL_VIDEO_OPENGL_WGL 1 -#define SDL_VIDEO_RENDER_OGL 1 +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 #endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 /* Enable assembly routines (Win64 doesn't have inline asm) */ #ifndef _WIN64 -#define SDL_ASSEMBLY_ROUTINES 1 +#define SDL_ASSEMBLY_ROUTINES 1 #endif -#endif /* _SDL_config_win32_h */ +#endif /* _SDL_config_windows_h */ diff --git a/Externals/SDL2-2.0.1/include/SDL_cpuinfo.h b/Externals/SDL2-2.0.1/include/SDL_cpuinfo.h new file mode 100644 index 0000000000..6d72bbb81c --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_cpuinfo.h @@ -0,0 +1,151 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_cpuinfo.h + * + * CPU feature detection for SDL. + */ + +#ifndef _SDL_cpuinfo_h +#define _SDL_cpuinfo_h + +#include "SDL_stdinc.h" + +/* Need to do this here because intrin.h has C++ code in it */ +/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) +#include +#ifndef _WIN64 +#define __MMX__ +#define __3dNOW__ +#endif +#define __SSE__ +#define __SSE2__ +#elif defined(__MINGW64_VERSION_MAJOR) +#include +#else +#ifdef __ALTIVEC__ +#if HAVE_ALTIVEC_H && !defined(__APPLE_ALTIVEC__) +#include +#undef pixel +#endif +#endif +#ifdef __MMX__ +#include +#endif +#ifdef __3dNOW__ +#include +#endif +#ifdef __SSE__ +#include +#endif +#ifdef __SSE2__ +#include +#endif +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* This is a guess for the cacheline size used for padding. + * Most x86 processors have a 64 byte cache line. + * The 64-bit PowerPC processors have a 128 byte cache line. + * We'll use the larger value to be generally safe. + */ +#define SDL_CACHELINE_SIZE 128 + +/** + * This function returns the number of CPU cores available. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); + +/** + * This function returns the L1 cache line size of the CPU + * + * This is useful for determining multi-threaded structure padding + * or SIMD prefetch sizes. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); + +/** + * This function returns true if the CPU has the RDTSC instruction. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** + * This function returns true if the CPU has AltiVec features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/** + * This function returns true if the CPU has MMX features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** + * This function returns true if the CPU has 3DNow! features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** + * This function returns true if the CPU has SSE features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** + * This function returns true if the CPU has SSE2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** + * This function returns true if the CPU has SSE3 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); + +/** + * This function returns true if the CPU has SSE4.1 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); + +/** + * This function returns true if the CPU has SSE4.2 features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); + +/** + * This function returns the amount of RAM configured in the system, in MB. + */ +extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_cpuinfo_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_endian.h b/Externals/SDL2-2.0.1/include/SDL_endian.h similarity index 51% rename from Externals/SDL/Include_1.3/SDL_endian.h rename to Externals/SDL2-2.0.1/include/SDL_endian.h index db06dafd8f..3450316c0a 100644 --- a/Externals/SDL/Include_1.3/SDL_endian.h +++ b/Externals/SDL2-2.0.1/include/SDL_endian.h @@ -1,29 +1,28 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /** - * \file SDL_endian.h + * \file SDL_endian.h * - * Functions for reading and writing endian-specific values + * Functions for reading and writing endian-specific values */ #ifndef _SDL_endian_h @@ -31,91 +30,96 @@ #include "SDL_stdinc.h" -/* The two types of endianness */ -#define SDL_LIL_ENDIAN 1234 -#define SDL_BIG_ENDIAN 4321 +/** + * \name The two types of endianness + */ +/* @{ */ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/* @} */ #ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#else /* __linux __ */ #if defined(__hppa__) || \ defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ (defined(__MIPS__) && defined(__MISPEB__)) || \ defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ defined(__sparc__) -#define SDL_BYTEORDER SDL_BIG_ENDIAN +#define SDL_BYTEORDER SDL_BIG_ENDIAN #else -#define SDL_BYTEORDER SDL_LIL_ENDIAN +#define SDL_BYTEORDER SDL_LIL_ENDIAN #endif +#endif /* __linux __ */ #endif /* !SDL_BYTEORDER */ #include "begin_code.h" /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus -/* *INDENT-OFF* */ extern "C" { -/* *INDENT-ON* */ #endif -/* Use inline functions for compilers that support them, and static - functions for those that do not. Because these functions become - static for compilers that do not support inline functions, this - header should only be included in files that actually use them. -*/ +/** + * \file SDL_endian.h + */ #if defined(__GNUC__) && defined(__i386__) && \ !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */) -static __inline__ Uint16 +SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); return x; } #elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint16 +SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); return x; } #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint16 +SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { - Uint16 result; + int result; __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); - return result; + return (Uint16)result; } -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint16 +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); return x; } #else -static __inline__ Uint16 +SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { - return ((x << 8) | (x >> 8)); + return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); } #endif #if defined(__GNUC__) && defined(__i386__) -static __inline__ Uint32 +SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { __asm__("bswap %0": "=r"(x):"0"(x)); return x; } #elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint32 +SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { __asm__("bswapl %0": "=r"(x):"0"(x)); return x; } #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint32 +SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { Uint32 result; @@ -125,25 +129,24 @@ SDL_Swap32(Uint32 x) __asm__("rlwimi %0,%2,24,0,7": "=&r"(result):"0"(result), "r"(x)); return result; } -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint32 +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); return x; } #else -static __inline__ Uint32 +SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { - return ((x << 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | - (x >> 24)); + return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) | + ((x >> 8) & 0x0000FF00) | (x >> 24))); } #endif -#ifdef SDL_HAS_64BIT_TYPE #if defined(__GNUC__) && defined(__i386__) -static __inline__ Uint64 +SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) { union @@ -161,38 +164,31 @@ SDL_Swap64(Uint64 x) return v.u; } #elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint64 +SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) { __asm__("bswapq %0": "=r"(x):"0"(x)); return x; } #else -static __inline__ Uint64 +SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) { Uint32 hi, lo; /* Separate into high and low 32-bit values and swap them */ - lo = (Uint32) (x & 0xFFFFFFFF); + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); x >>= 32; - hi = (Uint32) (x & 0xFFFFFFFF); + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); x = SDL_Swap32(lo); x <<= 32; x |= SDL_Swap32(hi); return (x); } #endif -#else -/* This is mainly to keep compilers from complaining in SDL code. - If there is no real 64-bit datatype, then compilers will complain about - the fake 64-bit datatype that SDL provides when it compiles user code. -*/ -#define SDL_Swap64(X) (X) -#endif /* SDL_HAS_64BIT_TYPE */ -static __inline__ float +SDL_FORCE_INLINE float SDL_SwapFloat(float x) { union @@ -206,32 +202,35 @@ SDL_SwapFloat(float x) } -/* Byteswap item from the specified endianness to the native endianness */ +/** + * \name Swap to native + * Byteswap item from the specified endianness to the native endianness. + */ +/* @{ */ #if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SDL_SwapLE16(X) (X) -#define SDL_SwapLE32(X) (X) -#define SDL_SwapLE64(X) (X) -#define SDL_SwapFloatLE(X) (X) -#define SDL_SwapBE16(X) SDL_Swap16(X) -#define SDL_SwapBE32(X) SDL_Swap32(X) -#define SDL_SwapBE64(X) SDL_Swap64(X) -#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapFloatLE(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) #else -#define SDL_SwapLE16(X) SDL_Swap16(X) -#define SDL_SwapLE32(X) SDL_Swap32(X) -#define SDL_SwapLE64(X) SDL_Swap64(X) -#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) -#define SDL_SwapBE16(X) (X) -#define SDL_SwapBE32(X) (X) -#define SDL_SwapBE64(X) (X) -#define SDL_SwapFloatBE(X) (X) +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#define SDL_SwapFloatBE(X) (X) #endif +/* @} *//* Swap to native */ /* Ends C function definitions when using C++ */ #ifdef __cplusplus -/* *INDENT-OFF* */ } -/* *INDENT-ON* */ #endif #include "close_code.h" diff --git a/Externals/SDL2-2.0.1/include/SDL_error.h b/Externals/SDL2-2.0.1/include/SDL_error.h new file mode 100644 index 0000000000..2b8bb4165f --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_error.h @@ -0,0 +1,76 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_error.h + * + * Simple error message routines for SDL. + */ + +#ifndef _SDL_error_h +#define _SDL_error_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Public functions */ +/* SDL_SetError() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_SetError(const char *fmt, ...); +extern DECLSPEC const char *SDLCALL SDL_GetError(void); +extern DECLSPEC void SDLCALL SDL_ClearError(void); + +/** + * \name Internal error functions + * + * \internal + * Private error reporting function - used internally. + */ +/* @{ */ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) +typedef enum +{ + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +/* SDL_Error() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code); +/* @} *//* Internal error functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_error_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_events.h b/Externals/SDL2-2.0.1/include/SDL_events.h new file mode 100644 index 0000000000..c08903073a --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_events.h @@ -0,0 +1,720 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_events.h + * + * Include file for SDL event handling. + */ + +#ifndef _SDL_events_h +#define _SDL_events_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_quit.h" +#include "SDL_gesture.h" +#include "SDL_touch.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* General keyboard/mouse state definitions */ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 + +/** + * \brief The types of events that can be delivered. + */ +typedef enum +{ + SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */ + + /* Application events */ + SDL_QUIT = 0x100, /**< User-requested quit */ + + /* These application events have special meaning on iOS, see README-ios.txt for details */ + SDL_APP_TERMINATING, /**< The application is being terminated by the OS + Called on iOS in applicationWillTerminate() + Called on Android in onDestroy() + */ + SDL_APP_LOWMEMORY, /**< The application is low on memory, free memory if possible. + Called on iOS in applicationDidReceiveMemoryWarning() + Called on Android in onLowMemory() + */ + SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background + Called on iOS in applicationWillResignActive() + Called on Android in onPause() + */ + SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time + Called on iOS in applicationDidEnterBackground() + Called on Android in onPause() + */ + SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground + Called on iOS in applicationWillEnterForeground() + Called on Android in onResume() + */ + SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive + Called on iOS in applicationDidBecomeActive() + Called on Android in onResume() + */ + + /* Window events */ + SDL_WINDOWEVENT = 0x200, /**< Window state change */ + SDL_SYSWMEVENT, /**< System specific event */ + + /* Keyboard events */ + SDL_KEYDOWN = 0x300, /**< Key pressed */ + SDL_KEYUP, /**< Key released */ + SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ + SDL_TEXTINPUT, /**< Keyboard text input */ + + /* Mouse events */ + SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_MOUSEWHEEL, /**< Mouse wheel motion */ + + /* Joystick events */ + SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */ + SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */ + + /* Game controller events */ + SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */ + SDL_CONTROLLERBUTTONDOWN, /**< Game controller button pressed */ + SDL_CONTROLLERBUTTONUP, /**< Game controller button released */ + SDL_CONTROLLERDEVICEADDED, /**< A new Game controller has been inserted into the system */ + SDL_CONTROLLERDEVICEREMOVED, /**< An opened Game controller has been removed */ + SDL_CONTROLLERDEVICEREMAPPED, /**< The controller mapping was updated */ + + /* Touch events */ + SDL_FINGERDOWN = 0x700, + SDL_FINGERUP, + SDL_FINGERMOTION, + + /* Gesture events */ + SDL_DOLLARGESTURE = 0x800, + SDL_DOLLARRECORD, + SDL_MULTIGESTURE, + + /* Clipboard events */ + SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */ + + /* Drag and drop events */ + SDL_DROPFILE = 0x1000, /**< The system requests a file open */ + + /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, + * and should be allocated with SDL_RegisterEvents() + */ + SDL_USEREVENT = 0x8000, + + /** + * This last event is only for bounding internal arrays + */ + SDL_LASTEVENT = 0xFFFF +} SDL_EventType; + +/** + * \brief Fields shared by every event + */ +typedef struct SDL_CommonEvent +{ + Uint32 type; + Uint32 timestamp; +} SDL_CommonEvent; + +/** + * \brief Window state change event data (event.window.*) + */ +typedef struct SDL_WindowEvent +{ + Uint32 type; /**< ::SDL_WINDOWEVENT */ + Uint32 timestamp; + Uint32 windowID; /**< The associated window */ + Uint8 event; /**< ::SDL_WindowEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ + Sint32 data2; /**< event dependent data */ +} SDL_WindowEvent; + +/** + * \brief Keyboard button event structure (event.key.*) + */ +typedef struct SDL_KeyboardEvent +{ + Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 repeat; /**< Non-zero if this is a key repeat */ + Uint8 padding2; + Uint8 padding3; + SDL_Keysym keysym; /**< The key that was pressed or released */ +} SDL_KeyboardEvent; + +#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text editing event structure (event.edit.*) + */ +typedef struct SDL_TextEditingEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingEvent; + + +#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text input event structure (event.text.*) + */ +typedef struct SDL_TextInputEvent +{ + Uint32 type; /**< ::SDL_TEXTINPUT */ + Uint32 timestamp; + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ +} SDL_TextInputEvent; + +/** + * \brief Mouse motion event structure (event.motion.*) + */ +typedef struct SDL_MouseMotionEvent +{ + Uint32 type; /**< ::SDL_MOUSEMOTION */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint32 state; /**< The current button state */ + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ + Sint32 xrel; /**< The relative motion in the X direction */ + Sint32 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** + * \brief Mouse button event structure (event.button.*) + */ +typedef struct SDL_MouseButtonEvent +{ + Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ +} SDL_MouseButtonEvent; + +/** + * \brief Mouse wheel event structure (event.wheel.*) + */ +typedef struct SDL_MouseWheelEvent +{ + Uint32 type; /**< ::SDL_MOUSEWHEEL */ + Uint32 timestamp; + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Sint32 x; /**< The amount scrolled horizontally */ + Sint32 y; /**< The amount scrolled vertically */ +} SDL_MouseWheelEvent; + +/** + * \brief Joystick axis motion event structure (event.jaxis.*) + */ +typedef struct SDL_JoyAxisEvent +{ + Uint32 type; /**< ::SDL_JOYAXISMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The joystick axis index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_JoyAxisEvent; + +/** + * \brief Joystick trackball motion event structure (event.jball.*) + */ +typedef struct SDL_JoyBallEvent +{ + Uint32 type; /**< ::SDL_JOYBALLMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 ball; /**< The joystick trackball index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** + * \brief Joystick hat position change event structure (event.jhat.*) + */ +typedef struct SDL_JoyHatEvent +{ + Uint32 type; /**< ::SDL_JOYHATMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value. + * \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP + * \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT + * \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN + * + * Note that zero means the POV is centered. + */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyHatEvent; + +/** + * \brief Joystick button event structure (event.jbutton.*) + */ +typedef struct SDL_JoyButtonEvent +{ + Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyButtonEvent; + +/** + * \brief Joystick device event structure (event.jdevice.*) + */ +typedef struct SDL_JoyDeviceEvent +{ + Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */ + Uint32 timestamp; + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */ +} SDL_JoyDeviceEvent; + + +/** + * \brief Game controller axis motion event structure (event.caxis.*) + */ +typedef struct SDL_ControllerAxisEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_ControllerAxisEvent; + + +/** + * \brief Game controller button event structure (event.cbutton.*) + */ +typedef struct SDL_ControllerButtonEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */ + Uint32 timestamp; + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The controller button (SDL_GameControllerButton) */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_ControllerButtonEvent; + + +/** + * \brief Controller device event structure (event.cdevice.*) + */ +typedef struct SDL_ControllerDeviceEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */ + Uint32 timestamp; + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ +} SDL_ControllerDeviceEvent; + + +/** + * \brief Touch finger event structure (event.tfinger.*) + */ +typedef struct SDL_TouchFingerEvent +{ + Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device id */ + SDL_FingerID fingerId; + float x; /**< Normalized in the range 0...1 */ + float y; /**< Normalized in the range 0...1 */ + float dx; /**< Normalized in the range 0...1 */ + float dy; /**< Normalized in the range 0...1 */ + float pressure; /**< Normalized in the range 0...1 */ +} SDL_TouchFingerEvent; + + +/** + * \brief Multiple Finger Gesture Event (event.mgesture.*) + */ +typedef struct SDL_MultiGestureEvent +{ + Uint32 type; /**< ::SDL_MULTIGESTURE */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device index */ + float dTheta; + float dDist; + float x; + float y; + Uint16 numFingers; + Uint16 padding; +} SDL_MultiGestureEvent; + + +/** + * \brief Dollar Gesture Event (event.dgesture.*) + */ +typedef struct SDL_DollarGestureEvent +{ + Uint32 type; /**< ::SDL_DOLLARGESTURE */ + Uint32 timestamp; + SDL_TouchID touchId; /**< The touch device id */ + SDL_GestureID gestureId; + Uint32 numFingers; + float error; + float x; /**< Normalized center of gesture */ + float y; /**< Normalized center of gesture */ +} SDL_DollarGestureEvent; + + +/** + * \brief An event used to request a file open by the system (event.drop.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * \note If you enable this event, you must free the filename in the event. + */ +typedef struct SDL_DropEvent +{ + Uint32 type; /**< ::SDL_DROPFILE */ + Uint32 timestamp; + char *file; /**< The file name, which should be freed with SDL_free() */ +} SDL_DropEvent; + + +/** + * \brief The "quit requested" event + */ +typedef struct SDL_QuitEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; +} SDL_QuitEvent; + +/** + * \brief OS Specific event + */ +typedef struct SDL_OSEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; +} SDL_OSEvent; + +/** + * \brief A user-defined event type (event.user.*) + */ +typedef struct SDL_UserEvent +{ + Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */ + Uint32 timestamp; + Uint32 windowID; /**< The associated window if any */ + Sint32 code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; + +/** + * \brief A video driver dependent system event (event.syswm.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * + * \note If you want to use this event, you should include SDL_syswm.h. + */ +typedef struct SDL_SysWMEvent +{ + Uint32 type; /**< ::SDL_SYSWMEVENT */ + Uint32 timestamp; + SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ +} SDL_SysWMEvent; + +/** + * \brief General event structure + */ +typedef union SDL_Event +{ + Uint32 type; /**< Event type, shared with all events */ + SDL_CommonEvent common; /**< Common event data */ + SDL_WindowEvent window; /**< Window event data */ + SDL_KeyboardEvent key; /**< Keyboard event data */ + SDL_TextEditingEvent edit; /**< Text editing event data */ + SDL_TextInputEvent text; /**< Text input event data */ + SDL_MouseMotionEvent motion; /**< Mouse motion event data */ + SDL_MouseButtonEvent button; /**< Mouse button event data */ + SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ + SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ + SDL_JoyBallEvent jball; /**< Joystick ball event data */ + SDL_JoyHatEvent jhat; /**< Joystick hat event data */ + SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ + SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */ + SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ + SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ + SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ + SDL_QuitEvent quit; /**< Quit request event data */ + SDL_UserEvent user; /**< Custom event data */ + SDL_SysWMEvent syswm; /**< System dependent window event data */ + SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_MultiGestureEvent mgesture; /**< Gesture event data */ + SDL_DollarGestureEvent dgesture; /**< Gesture event data */ + SDL_DropEvent drop; /**< Drag and drop event data */ + + /* This is necessary for ABI compatibility between Visual C++ and GCC + Visual C++ will respect the push pack pragma and use 52 bytes for + this structure, and GCC will use the alignment of the largest datatype + within the union, which is 8 bytes. + + So... we'll add padding to force the size to be 56 bytes for both. + */ + Uint8 padding[56]; +} SDL_Event; + + +/* Function prototypes */ + +/** + * Pumps the event loop, gathering events from the input devices. + * + * This function updates the event queue and internal input device state. + * + * This should only be run in the thread that sets the video mode. + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +/* @{ */ +typedef enum +{ + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Checks the event queue for messages and optionally returns them. + * + * If \c action is ::SDL_ADDEVENT, up to \c numevents events will be added to + * the back of the event queue. + * + * If \c action is ::SDL_PEEKEVENT, up to \c numevents events at the front + * of the event queue, within the specified minimum and maximum type, + * will be returned and will not be removed from the queue. + * + * If \c action is ::SDL_GETEVENT, up to \c numevents events at the front + * of the event queue, within the specified minimum and maximum type, + * will be returned and will be removed from the queue. + * + * \return The number of events actually stored, or -1 if there was an error. + * + * This function is thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, + SDL_eventaction action, + Uint32 minType, Uint32 maxType); +/* @} */ + +/** + * Checks to see if certain event types are in the event queue. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); + +/** + * This function clears events from the event queue + */ +extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); +extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); + +/** + * \brief Polls for currently pending events. + * + * \return 1 if there are any pending events, or 0 if there are none available. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); + +/** + * \brief Waits indefinitely for the next available event. + * + * \return 1, or 0 if there was an error while waiting for events. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); + +/** + * \brief Waits until the specified timeout (in milliseconds) for the next + * available event. + * + * \return 1, or 0 if there was an error while waiting for events. + * + * \param event If not NULL, the next event is removed from the queue and + * stored in that area. + * \param timeout The timeout (in milliseconds) to wait for next event. + */ +extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, + int timeout); + +/** + * \brief Add an event to the event queue. + * + * \return 1 on success, 0 if the event was filtered, or -1 if the event queue + * was full or there was some other error. + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); + +typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); + +/** + * Sets up a filter to process all events before they change internal state and + * are posted to the internal event queue. + * + * The filter is prototyped as: + * \code + * int SDL_EventFilter(void *userdata, SDL_Event * event); + * \endcode + * + * If the filter returns 1, then the event will be added to the internal queue. + * If it returns 0, then the event will be dropped from the queue, but the + * internal state will still be updated. This allows selective filtering of + * dynamically arriving events. + * + * \warning Be very careful of what you do in the event filter function, as + * it may run in a different thread! + * + * There is one caveat when dealing with the ::SDL_QuitEvent event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will + * be closed, otherwise the window will remain open if possible. + * + * If the quit event is generated by an interrupt signal, it will bypass the + * internal queue and be delivered to the application at the next event poll. + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, + void *userdata); + +/** + * Return the current event filter - can be used to "chain" filters. + * If there is no event filter set, this function returns SDL_FALSE. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, + void **userdata); + +/** + * Add a function which is called when an event is added to the queue. + */ +extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Remove an event watch function added with SDL_AddEventWatch() + */ +extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Run the filter function on the current event queue, removing any + * events for which the filter returns 0. + */ +extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, + void *userdata); + +/* @{ */ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 + +/** + * This function allows you to set the state of processing certain events. + * - If \c state is set to ::SDL_IGNORE, that event will be automatically + * dropped from the event queue and will not event be filtered. + * - If \c state is set to ::SDL_ENABLE, that event will be processed + * normally. + * - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the + * current processing state of the specified event. + */ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); +/* @} */ +#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) + +/** + * This function allocates a set of user-defined events, and returns + * the beginning event number for that set of events. + * + * If there aren't enough user-defined events left, this function + * returns (Uint32)-1 + */ +extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_events_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_filesystem.h b/Externals/SDL2-2.0.1/include/SDL_filesystem.h new file mode 100644 index 0000000000..ea8a1b56f9 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_filesystem.h @@ -0,0 +1,136 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_filesystem.h + * + * \brief Include file for filesystem SDL API functions + */ + +#ifndef _SDL_filesystem_h +#define _SDL_filesystem_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Get the path where the application resides. + * + * Get the "base path". This is the directory where the application was run + * from, which is probably the installation directory, and may or may not + * be the process's current working directory. + * + * This returns an absolute path in UTF-8 encoding, and is guaranteed to + * end with a path separator ('\\' on Windows, '/' most other places). + * + * The pointer returned by this function is owned by you. Please call + * SDL_free() on the pointer when you are done with it, or it will be a + * memory leak. This is not necessarily a fast call, though, so you should + * call this once near startup and save the string if you need it. + * + * Some platforms can't determine the application's path, and on other + * platforms, this might be meaningless. In such cases, this function will + * return NULL. + * + * \return String of base dir in UTF-8 encoding, or NULL on error. + * + * \sa SDL_GetPrefPath + */ +extern DECLSPEC char *SDLCALL SDL_GetBasePath(void); + +/** + * \brief Get the user-and-app-specific path where files can be written. + * + * Get the "pref dir". This is meant to be where users can write personal + * files (preferences and save games, etc) that are specific to your + * application. This directory is unique per user, per application. + * + * This function will decide the appropriate location in the native filesystem, + * create the directory if necessary, and return a string of the absolute + * path to the directory in UTF-8 encoding. + * + * On Windows, the string might look like: + * "C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\" + * + * On Linux, the string might look like: + * "/home/bob/.local/share/My Program Name/" + * + * On Mac OS X, the string might look like: + * "/Users/bob/Library/Application Support/My Program Name/" + * + * (etc.) + * + * You specify the name of your organization (if it's not a real organization, + * your name or an Internet domain you own might do) and the name of your + * application. These should be untranslated proper names. + * + * Both the org and app strings may become part of a directory name, so + * please follow these rules: + * + * - Try to use the same org string (including case-sensitivity) for + * all your applications that use this function. + * - Always use a unique app string for each one, and make sure it never + * changes for an app once you've decided on it. + * - Unicode characters are legal, as long as it's UTF-8 encoded, but... + * - ...only use letters, numbers, and spaces. Avoid punctuation like + * "Game Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. + * + * This returns an absolute path in UTF-8 encoding, and is guaranteed to + * end with a path separator ('\\' on Windows, '/' most other places). + * + * The pointer returned by this function is owned by you. Please call + * SDL_free() on the pointer when you are done with it, or it will be a + * memory leak. This is not necessarily a fast call, though, so you should + * call this once near startup and save the string if you need it. + * + * You should assume the path returned by this function is the only safe + * place to write files (and that SDL_GetBasePath(), while it might be + * writable, or even the parent of the returned path, aren't where you + * should be writing things). + * + * Some platforms can't determine the pref path, and on other + * platforms, this might be meaningless. In such cases, this function will + * return NULL. + * + * \param org The name of your organization. + * \param app The name of your application. + * \return UTF-8 string of user dir in platform-dependent notation. NULL + * if there's a problem (creating directory failed, etc). + * + * \sa SDL_GetBasePath + */ +extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_system_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_gamecontroller.h b/Externals/SDL2-2.0.1/include/SDL_gamecontroller.h new file mode 100644 index 0000000000..e55749ce35 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_gamecontroller.h @@ -0,0 +1,298 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gamecontroller.h + * + * Include file for SDL game controller event handling + */ + +#ifndef _SDL_gamecontroller_h +#define _SDL_gamecontroller_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_gamecontroller.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for game controllers, and load appropriate drivers. + * + * If you would like to receive controller updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/* The gamecontroller structure used to identify an SDL game controller */ +struct _SDL_GameController; +typedef struct _SDL_GameController SDL_GameController; + + +typedef enum +{ + SDL_CONTROLLER_BINDTYPE_NONE = 0, + SDL_CONTROLLER_BINDTYPE_BUTTON, + SDL_CONTROLLER_BINDTYPE_AXIS, + SDL_CONTROLLER_BINDTYPE_HAT +} SDL_GameControllerBindType; + +/** + * Get the SDL joystick layer binding for this controller button/axis mapping + */ +typedef struct SDL_GameControllerButtonBind +{ + SDL_GameControllerBindType bindType; + union + { + int button; + int axis; + struct { + int hat; + int hat_mask; + } hat; + } value; + +} SDL_GameControllerButtonBind; + + +/** + * To count the number of game controllers in the system for the following: + * int nJoysticks = SDL_NumJoysticks(); + * int nGameControllers = 0; + * for ( int i = 0; i < nJoysticks; i++ ) { + * if ( SDL_IsGameController(i) ) { + * nGameControllers++; + * } + * } + * + * Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: + * guid,name,mappings + * + * Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones. + * Under Windows there is a reserved GUID of "xinput" that covers any XInput devices. + * The mapping format for joystick is: + * bX - a joystick button, index X + * hX.Y - hat X with value Y + * aX - axis X of the joystick + * Buttons can be used as a controller axis and vice versa. + * + * This string shows an example of a valid mapping for a controller + * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7", + * + */ + +/** + * Add or update an existing mapping configuration + * + * \return 1 if mapping is added, 0 if updated, -1 on error + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping( const char* mappingString ); + +/** + * Get a mapping string for a GUID + * + * \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID( SDL_JoystickGUID guid ); + +/** + * Get a mapping string for an open GameController + * + * \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMapping( SDL_GameController * gamecontroller ); + +/** + * Is the joystick on this index supported by the game controller interface? + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index); + + +/** + * Get the implementation dependent name of a game controller. + * This can be called before any controllers are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index); + +/** + * Open a game controller for use. + * The index passed as an argument refers to the N'th game controller on the system. + * This index is the value which will identify this controller in future controller + * events. + * + * \return A controller identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); + +/** + * Return the name for this currently opened controller + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); + +/** + * Returns SDL_TRUE if the controller has been opened and currently connected, + * or SDL_FALSE if it has not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller); + +/** + * Get the underlying joystick object used by a controller + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller); + +/** + * Enable/disable controller event polling. + * + * If controller events are disabled, you must call SDL_GameControllerUpdate() + * yourself and check the state of the controller when you want controller + * information. + * + * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state); + +/** + * Update the current state of the open game controllers. + * + * This is called automatically by the event loop if any game controller + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void); + + +/** + * The list of axes available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_AXIS_INVALID = -1, + SDL_CONTROLLER_AXIS_LEFTX, + SDL_CONTROLLER_AXIS_LEFTY, + SDL_CONTROLLER_AXIS_RIGHTX, + SDL_CONTROLLER_AXIS_RIGHTY, + SDL_CONTROLLER_AXIS_TRIGGERLEFT, + SDL_CONTROLLER_AXIS_TRIGGERRIGHT, + SDL_CONTROLLER_AXIS_MAX +} SDL_GameControllerAxis; + +/** + * turn this string into a axis mapping + */ +extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *pchString); + +/** + * turn this axis enum into a string mapping + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis); + +/** + * Get the SDL joystick layer binding for this controller button mapping + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * Get the current state of an axis control on a game controller. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + */ +extern DECLSPEC Sint16 SDLCALL +SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * The list of buttons available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_BUTTON_INVALID = -1, + SDL_CONTROLLER_BUTTON_A, + SDL_CONTROLLER_BUTTON_B, + SDL_CONTROLLER_BUTTON_X, + SDL_CONTROLLER_BUTTON_Y, + SDL_CONTROLLER_BUTTON_BACK, + SDL_CONTROLLER_BUTTON_GUIDE, + SDL_CONTROLLER_BUTTON_START, + SDL_CONTROLLER_BUTTON_LEFTSTICK, + SDL_CONTROLLER_BUTTON_RIGHTSTICK, + SDL_CONTROLLER_BUTTON_LEFTSHOULDER, + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, + SDL_CONTROLLER_BUTTON_DPAD_UP, + SDL_CONTROLLER_BUTTON_DPAD_DOWN, + SDL_CONTROLLER_BUTTON_DPAD_LEFT, + SDL_CONTROLLER_BUTTON_DPAD_RIGHT, + SDL_CONTROLLER_BUTTON_MAX +} SDL_GameControllerButton; + +/** + * turn this string into a button mapping + */ +extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *pchString); + +/** + * turn this button enum into a string mapping + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button); + +/** + * Get the SDL joystick layer binding for this controller button mapping + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + + +/** + * Get the current state of a button on a game controller. + * + * The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Close a controller previously opened with SDL_GameControllerOpen(). + */ +extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_gamecontroller_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_gesture.h b/Externals/SDL2-2.0.1/include/SDL_gesture.h new file mode 100644 index 0000000000..21f10ead73 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_gesture.h @@ -0,0 +1,87 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gesture.h + * + * Include file for SDL gesture event handling. + */ + +#ifndef _SDL_gesture_h +#define _SDL_gesture_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "SDL_touch.h" + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_GestureID; + +/* Function prototypes */ + +/** + * \brief Begin Recording a gesture on the specified touch, or all touches (-1) + * + * + */ +extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId); + + +/** + * \brief Save all currently loaded Dollar Gesture templates + * + * + */ +extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *src); + +/** + * \brief Save a currently loaded Dollar Gesture template + * + * + */ +extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *src); + + +/** + * \brief Load Dollar Gesture templates from a file + * + * + */ +extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_gesture_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_haptic.h b/Externals/SDL2-2.0.1/include/SDL_haptic.h new file mode 100644 index 0000000000..a029eb9969 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_haptic.h @@ -0,0 +1,1225 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_haptic.h + * + * \brief The SDL Haptic subsystem allows you to control haptic (force feedback) + * devices. + * + * The basic usage is as follows: + * - Initialize the Subsystem (::SDL_INIT_HAPTIC). + * - Open a Haptic Device. + * - SDL_HapticOpen() to open from index. + * - SDL_HapticOpenFromJoystick() to open from an existing joystick. + * - Create an effect (::SDL_HapticEffect). + * - Upload the effect with SDL_HapticNewEffect(). + * - Run the effect with SDL_HapticRunEffect(). + * - (optional) Free the effect with SDL_HapticDestroyEffect(). + * - Close the haptic device with SDL_HapticClose(). + * + * \par Simple rumble example: + * \code + * SDL_Haptic *haptic; + * + * // Open the device + * haptic = SDL_HapticOpen( 0 ); + * if (haptic == NULL) + * return -1; + * + * // Initialize simple rumble + * if (SDL_HapticRumbleInit( haptic ) != 0) + * return -1; + * + * // Play effect at 50% strength for 2 seconds + * if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0) + * return -1; + * SDL_Delay( 2000 ); + * + * // Clean up + * SDL_HapticClose( haptic ); + * \endcode + * + * \par Complete example: + * \code + * int test_haptic( SDL_Joystick * joystick ) { + * SDL_Haptic *haptic; + * SDL_HapticEffect effect; + * int effect_id; + * + * // Open the device + * haptic = SDL_HapticOpenFromJoystick( joystick ); + * if (haptic == NULL) return -1; // Most likely joystick isn't haptic + * + * // See if it can do sine waves + * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) { + * SDL_HapticClose(haptic); // No sine effect + * return -1; + * } + * + * // Create the effect + * memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default + * effect.type = SDL_HAPTIC_SINE; + * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates + * effect.periodic.direction.dir[0] = 18000; // Force comes from south + * effect.periodic.period = 1000; // 1000 ms + * effect.periodic.magnitude = 20000; // 20000/32767 strength + * effect.periodic.length = 5000; // 5 seconds long + * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength + * effect.periodic.fade_length = 1000; // Takes 1 second to fade away + * + * // Upload the effect + * effect_id = SDL_HapticNewEffect( haptic, &effect ); + * + * // Test the effect + * SDL_HapticRunEffect( haptic, effect_id, 1 ); + * SDL_Delay( 5000); // Wait for the effect to finish + * + * // We destroy the effect, although closing the device also does this + * SDL_HapticDestroyEffect( haptic, effect_id ); + * + * // Close the device + * SDL_HapticClose(haptic); + * + * return 0; // Success + * } + * \endcode + * + * You can also find out more information on my blog: + * http://bobbens.dyndns.org/journal/2010/sdl_haptic/ + * + * \author Edgar Simo Serra + */ + +#ifndef _SDL_haptic_h +#define _SDL_haptic_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * \typedef SDL_Haptic + * + * \brief The haptic structure used to identify an SDL haptic. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + */ +struct _SDL_Haptic; +typedef struct _SDL_Haptic SDL_Haptic; + + +/** + * \name Haptic features + * + * Different haptic features a device can have. + */ +/* @{ */ + +/** + * \name Haptic effects + */ +/* @{ */ + +/** + * \brief Constant effect supported. + * + * Constant haptic effect. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_CONSTANT (1<<0) + +/** + * \brief Sine wave effect supported. + * + * Periodic haptic effect that simulates sine waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SINE (1<<1) + +/** + * \brief Left/Right effect supported. + * + * Haptic effect for direct control over high/low frequency motors. + * + * \sa SDL_HapticLeftRight + * \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry, + * we ran out of bits, and this is important for XInput devices. + */ +#define SDL_HAPTIC_LEFTRIGHT (1<<2) + +/* !!! FIXME: put this back when we have more bits in 2.1 */ +/* #define SDL_HAPTIC_SQUARE (1<<2) */ + +/** + * \brief Triangle wave effect supported. + * + * Periodic haptic effect that simulates triangular waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_TRIANGLE (1<<3) + +/** + * \brief Sawtoothup wave effect supported. + * + * Periodic haptic effect that simulates saw tooth up waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHUP (1<<4) + +/** + * \brief Sawtoothdown wave effect supported. + * + * Periodic haptic effect that simulates saw tooth down waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHDOWN (1<<5) + +/** + * \brief Ramp effect supported. + * + * Ramp haptic effect. + * + * \sa SDL_HapticRamp + */ +#define SDL_HAPTIC_RAMP (1<<6) + +/** + * \brief Spring effect supported - uses axes position. + * + * Condition haptic effect that simulates a spring. Effect is based on the + * axes position. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_SPRING (1<<7) + +/** + * \brief Damper effect supported - uses axes velocity. + * + * Condition haptic effect that simulates dampening. Effect is based on the + * axes velocity. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_DAMPER (1<<8) + +/** + * \brief Inertia effect supported - uses axes acceleration. + * + * Condition haptic effect that simulates inertia. Effect is based on the axes + * acceleration. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_INERTIA (1<<9) + +/** + * \brief Friction effect supported - uses axes movement. + * + * Condition haptic effect that simulates friction. Effect is based on the + * axes movement. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_FRICTION (1<<10) + +/** + * \brief Custom effect is supported. + * + * User defined custom haptic effect. + */ +#define SDL_HAPTIC_CUSTOM (1<<11) + +/* @} *//* Haptic effects */ + +/* These last few are features the device has, not effects */ + +/** + * \brief Device can set global gain. + * + * Device supports setting the global gain. + * + * \sa SDL_HapticSetGain + */ +#define SDL_HAPTIC_GAIN (1<<12) + +/** + * \brief Device can set autocenter. + * + * Device supports setting autocenter. + * + * \sa SDL_HapticSetAutocenter + */ +#define SDL_HAPTIC_AUTOCENTER (1<<13) + +/** + * \brief Device can be queried for effect status. + * + * Device can be queried for effect status. + * + * \sa SDL_HapticGetEffectStatus + */ +#define SDL_HAPTIC_STATUS (1<<14) + +/** + * \brief Device can be paused. + * + * \sa SDL_HapticPause + * \sa SDL_HapticUnpause + */ +#define SDL_HAPTIC_PAUSE (1<<15) + + +/** + * \name Direction encodings + */ +/* @{ */ + +/** + * \brief Uses polar coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_POLAR 0 + +/** + * \brief Uses cartesian coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_CARTESIAN 1 + +/** + * \brief Uses spherical coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_SPHERICAL 2 + +/* @} *//* Direction encodings */ + +/* @} *//* Haptic features */ + +/* + * Misc defines. + */ + +/** + * \brief Used to play a device an infinite number of times. + * + * \sa SDL_HapticRunEffect + */ +#define SDL_HAPTIC_INFINITY 4294967295U + + +/** + * \brief Structure that represents a haptic direction. + * + * Directions can be specified by: + * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates. + * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. + * - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. + * + * Cardinal directions of the haptic device are relative to the positioning + * of the device. North is considered to be away from the user. + * + * The following diagram represents the cardinal directions: + * \verbatim + .--. + |__| .-------. + |=.| |.-----.| + |--| || || + | | |'-----'| + |__|~')_____(' + [ COMPUTER ] + + + North (0,-1) + ^ + | + | + (1,0) West <----[ HAPTIC ]----> East (-1,0) + | + | + v + South (0,1) + + + [ USER ] + \|||/ + (o o) + ---ooO-(_)-Ooo--- + \endverbatim + * + * If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a + * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses + * the first \c dir parameter. The cardinal directions would be: + * - North: 0 (0 degrees) + * - East: 9000 (90 degrees) + * - South: 18000 (180 degrees) + * - West: 27000 (270 degrees) + * + * If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions + * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses + * the first three \c dir parameters. The cardinal directions would be: + * - North: 0,-1, 0 + * - East: -1, 0, 0 + * - South: 0, 1, 0 + * - West: 1, 0, 0 + * + * The Z axis represents the height of the effect if supported, otherwise + * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you + * can use any multiple you want, only the direction matters. + * + * If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. + * The first two \c dir parameters are used. The \c dir parameters are as + * follows (all values are in hundredths of degrees): + * - Degrees from (1, 0) rotated towards (0, 1). + * - Degrees towards (0, 0, 1) (device needs at least 3 axes). + * + * + * Example of force coming from the south with all encodings (force coming + * from the south means the user will have to pull the stick to counteract): + * \code + * SDL_HapticDirection direction; + * + * // Cartesian directions + * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. + * direction.dir[0] = 0; // X position + * direction.dir[1] = 1; // Y position + * // Assuming the device has 2 axes, we don't need to specify third parameter. + * + * // Polar directions + * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. + * direction.dir[0] = 18000; // Polar only uses first parameter + * + * // Spherical coordinates + * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding + * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. + * \endcode + * + * \sa SDL_HAPTIC_POLAR + * \sa SDL_HAPTIC_CARTESIAN + * \sa SDL_HAPTIC_SPHERICAL + * \sa SDL_HapticEffect + * \sa SDL_HapticNumAxes + */ +typedef struct SDL_HapticDirection +{ + Uint8 type; /**< The type of encoding. */ + Sint32 dir[3]; /**< The encoded direction. */ +} SDL_HapticDirection; + + +/** + * \brief A structure containing a template for a Constant effect. + * + * The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect. + * + * A constant effect applies a constant force in the specified direction + * to the joystick. + * + * \sa SDL_HAPTIC_CONSTANT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticConstant +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CONSTANT */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Constant */ + Sint16 level; /**< Strength of the constant effect. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticConstant; + +/** + * \brief A structure containing a template for a Periodic effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SINE + * - ::SDL_HAPTIC_LEFTRIGHT + * - ::SDL_HAPTIC_TRIANGLE + * - ::SDL_HAPTIC_SAWTOOTHUP + * - ::SDL_HAPTIC_SAWTOOTHDOWN + * + * A periodic effect consists in a wave-shaped effect that repeats itself + * over time. The type determines the shape of the wave and the parameters + * determine the dimensions of the wave. + * + * Phase is given by hundredth of a cycle meaning that giving the phase a value + * of 9000 will displace it 25% of its period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of its period. + * - 18000: Displaced 50% of its period. + * - 27000: Displaced 75% of its period. + * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred. + * + * Examples: + * \verbatim + SDL_HAPTIC_SINE + __ __ __ __ + / \ / \ / \ / + / \__/ \__/ \__/ + + SDL_HAPTIC_SQUARE + __ __ __ __ __ + | | | | | | | | | | + | |__| |__| |__| |__| | + + SDL_HAPTIC_TRIANGLE + /\ /\ /\ /\ /\ + / \ / \ / \ / \ / + / \/ \/ \/ \/ + + SDL_HAPTIC_SAWTOOTHUP + /| /| /| /| /| /| /| + / | / | / | / | / | / | / | + / |/ |/ |/ |/ |/ |/ | + + SDL_HAPTIC_SAWTOOTHDOWN + \ |\ |\ |\ |\ |\ |\ | + \ | \ | \ | \ | \ | \ | \ | + \| \| \| \| \| \| \| + \endverbatim + * + * \sa SDL_HAPTIC_SINE + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HAPTIC_TRIANGLE + * \sa SDL_HAPTIC_SAWTOOTHUP + * \sa SDL_HAPTIC_SAWTOOTHDOWN + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticPeriodic +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_LEFTRIGHT, + ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or + ::SDL_HAPTIC_SAWTOOTHDOWN */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Periodic */ + Uint16 period; /**< Period of the wave. */ + Sint16 magnitude; /**< Peak value. */ + Sint16 offset; /**< Mean value of the wave. */ + Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticPeriodic; + +/** + * \brief A structure containing a template for a Condition effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SPRING: Effect based on axes position. + * - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity. + * - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration. + * - ::SDL_HAPTIC_FRICTION: Effect based on axes movement. + * + * Direction is handled by condition internals instead of a direction member. + * The condition effect specific members have three parameters. The first + * refers to the X axis, the second refers to the Y axis and the third + * refers to the Z axis. The right terms refer to the positive side of the + * axis and the left terms refer to the negative side of the axis. Please + * refer to the ::SDL_HapticDirection diagram for which side is positive and + * which is negative. + * + * \sa SDL_HapticDirection + * \sa SDL_HAPTIC_SPRING + * \sa SDL_HAPTIC_DAMPER + * \sa SDL_HAPTIC_INERTIA + * \sa SDL_HAPTIC_FRICTION + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCondition +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER, + ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */ + SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Condition */ + Uint16 right_sat[3]; /**< Level when joystick is to the positive side. */ + Uint16 left_sat[3]; /**< Level when joystick is to the negative side. */ + Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ + Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ + Uint16 deadband[3]; /**< Size of the dead zone. */ + Sint16 center[3]; /**< Position of the dead zone. */ +} SDL_HapticCondition; + +/** + * \brief A structure containing a template for a Ramp effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect. + * + * The ramp effect starts at start strength and ends at end strength. + * It augments in linear fashion. If you use attack and fade with a ramp + * the effects get added to the ramp effect making the effect become + * quadratic instead of linear. + * + * \sa SDL_HAPTIC_RAMP + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticRamp +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_RAMP */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Ramp */ + Sint16 start; /**< Beginning strength level. */ + Sint16 end; /**< Ending strength level. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticRamp; + +/** + * \brief A structure containing a template for a Left/Right effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_LEFTRIGHT effect. + * + * The Left/Right effect is used to explicitly control the large and small + * motors, commonly found in modern game controllers. One motor is high + * frequency, the other is low frequency. + * + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticLeftRight +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_LEFTRIGHT */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + + /* Rumble */ + Uint16 large_magnitude; /**< Control of the large controller motor. */ + Uint16 small_magnitude; /**< Control of the small controller motor. */ +} SDL_HapticLeftRight; + +/** + * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. + * + * A custom force feedback effect is much like a periodic effect, where the + * application can define its exact shape. You will have to allocate the + * data yourself. Data should consist of channels * samples Uint16 samples. + * + * If channels is one, the effect is rotated using the defined direction. + * Otherwise it uses the samples in data for the different axes. + * + * \sa SDL_HAPTIC_CUSTOM + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCustom +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CUSTOM */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Custom */ + Uint8 channels; /**< Axes to use, minimum of one. */ + Uint16 period; /**< Sample periods. */ + Uint16 samples; /**< Amount of samples. */ + Uint16 *data; /**< Should contain channels*samples items. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticCustom; + +/** + * \brief The generic template for any haptic effect. + * + * All values max at 32767 (0x7FFF). Signed values also can be negative. + * Time values unless specified otherwise are in milliseconds. + * + * You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767 + * value. Neither delay, interval, attack_length nor fade_length support + * ::SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. + * + * Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of + * ::SDL_HAPTIC_INFINITY. + * + * Button triggers may not be supported on all devices, it is advised to not + * use them if possible. Buttons start at index 1 instead of index 0 like + * the joystick. + * + * If both attack_length and fade_level are 0, the envelope is not used, + * otherwise both values are used. + * + * Common parts: + * \code + * // Replay - All effects have this + * Uint32 length; // Duration of effect (ms). + * Uint16 delay; // Delay before starting effect. + * + * // Trigger - All effects have this + * Uint16 button; // Button that triggers effect. + * Uint16 interval; // How soon before effect can be triggered again. + * + * // Envelope - All effects except condition effects have this + * Uint16 attack_length; // Duration of the attack (ms). + * Uint16 attack_level; // Level at the start of the attack. + * Uint16 fade_length; // Duration of the fade out (ms). + * Uint16 fade_level; // Level at the end of the fade. + * \endcode + * + * + * Here we have an example of a constant effect evolution in time: + * \verbatim + Strength + ^ + | + | effect level --> _________________ + | / \ + | / \ + | / \ + | / \ + | attack_level --> | \ + | | | <--- fade_level + | + +--------------------------------------------------> Time + [--] [---] + attack_length fade_length + + [------------------][-----------------------] + delay length + \endverbatim + * + * Note either the attack_level or the fade_level may be above the actual + * effect level. + * + * \sa SDL_HapticConstant + * \sa SDL_HapticPeriodic + * \sa SDL_HapticCondition + * \sa SDL_HapticRamp + * \sa SDL_HapticLeftRight + * \sa SDL_HapticCustom + */ +typedef union SDL_HapticEffect +{ + /* Common for all force feedback effects */ + Uint16 type; /**< Effect type. */ + SDL_HapticConstant constant; /**< Constant effect. */ + SDL_HapticPeriodic periodic; /**< Periodic effect. */ + SDL_HapticCondition condition; /**< Condition effect. */ + SDL_HapticRamp ramp; /**< Ramp effect. */ + SDL_HapticLeftRight leftright; /**< Left/Right effect. */ + SDL_HapticCustom custom; /**< Custom effect. */ +} SDL_HapticEffect; + + +/* Function prototypes */ +/** + * \brief Count the number of haptic devices attached to the system. + * + * \return Number of haptic devices detected on the system. + */ +extern DECLSPEC int SDLCALL SDL_NumHaptics(void); + +/** + * \brief Get the implementation dependent name of a Haptic device. + * + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + * + * \param device_index Index of the device to get its name. + * \return Name of the device or NULL on error. + * + * \sa SDL_NumHaptics + */ +extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); + +/** + * \brief Opens a Haptic device for usage. + * + * The index passed as an argument refers to the N'th Haptic device on this + * system. + * + * When opening a haptic device, its gain will be set to maximum and + * autocenter will be disabled. To modify these values use + * SDL_HapticSetGain() and SDL_HapticSetAutocenter(). + * + * \param device_index Index of the device to open. + * \return Device identifier or NULL on error. + * + * \sa SDL_HapticIndex + * \sa SDL_HapticOpenFromMouse + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + * \sa SDL_HapticSetGain + * \sa SDL_HapticSetAutocenter + * \sa SDL_HapticPause + * \sa SDL_HapticStopAll + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); + +/** + * \brief Checks if the haptic device at index has been opened. + * + * \param device_index Index to check to see if it has been opened. + * \return 1 if it has been opened or 0 if it hasn't. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticIndex + */ +extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); + +/** + * \brief Gets the index of a haptic device. + * + * \param haptic Haptic device to get the index of. + * \return The index of the haptic device or -1 on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpened + */ +extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); + +/** + * \brief Gets whether or not the current mouse has haptic capabilities. + * + * \return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't. + * + * \sa SDL_HapticOpenFromMouse + */ +extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); + +/** + * \brief Tries to open a haptic device from the current mouse. + * + * \return The haptic device identifier or NULL on error. + * + * \sa SDL_MouseIsHaptic + * \sa SDL_HapticOpen + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); + +/** + * \brief Checks to see if a joystick has haptic features. + * + * \param joystick Joystick to test for haptic capabilities. + * \return 1 if the joystick is haptic, 0 if it isn't + * or -1 if an error ocurred. + * + * \sa SDL_HapticOpenFromJoystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); + +/** + * \brief Opens a Haptic device for usage from a Joystick device. + * + * You must still close the haptic device seperately. It will not be closed + * with the joystick. + * + * When opening from a joystick you should first close the haptic device before + * closing the joystick device. If not, on some implementations the haptic + * device will also get unallocated and you'll be unable to use force feedback + * on that device. + * + * \param joystick Joystick to create a haptic device from. + * \return A valid haptic device identifier on success or NULL on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticClose + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * + joystick); + +/** + * \brief Closes a Haptic device previously opened with SDL_HapticOpen(). + * + * \param haptic Haptic device to close. + */ +extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); + +/** + * \brief Returns the number of effects a haptic device can store. + * + * On some platforms this isn't fully supported, and therefore is an + * approximation. Always check to see if your created effect was actually + * created and do not rely solely on SDL_HapticNumEffects(). + * + * \param haptic The haptic device to query effect max. + * \return The number of effects the haptic device can store or + * -1 on error. + * + * \sa SDL_HapticNumEffectsPlaying + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); + +/** + * \brief Returns the number of effects a haptic device can play at the same + * time. + * + * This is not supported on all platforms, but will always return a value. + * Added here for the sake of completeness. + * + * \param haptic The haptic device to query maximum playing effects. + * \return The number of effects the haptic device can play at the same time + * or -1 on error. + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); + +/** + * \brief Gets the haptic devices supported features in bitwise matter. + * + * Example: + * \code + * if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) { + * printf("We have constant haptic effect!"); + * } + * \endcode + * + * \param haptic The haptic device to query. + * \return Haptic features in bitwise manner (OR'd). + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticEffectSupported + */ +extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); + + +/** + * \brief Gets the number of haptic axes the device has. + * + * \sa SDL_HapticDirection + */ +extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); + +/** + * \brief Checks to see if effect is supported by haptic. + * + * \param haptic Haptic device to check on. + * \param effect Effect to check to see if it is supported. + * \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * \sa SDL_HapticQuery + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, + SDL_HapticEffect * + effect); + +/** + * \brief Creates a new haptic effect on the device. + * + * \param haptic Haptic device to create the effect on. + * \param effect Properties of the effect to create. + * \return The id of the effect on success or -1 on error. + * + * \sa SDL_HapticUpdateEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, + SDL_HapticEffect * effect); + +/** + * \brief Updates the properties of an effect. + * + * Can be used dynamically, although behaviour when dynamically changing + * direction may be strange. Specifically the effect may reupload itself + * and start playing from the start. You cannot change the type either when + * running SDL_HapticUpdateEffect(). + * + * \param haptic Haptic device that has the effect. + * \param effect Effect to update. + * \param data New effect properties to use. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticNewEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, + int effect, + SDL_HapticEffect * data); + +/** + * \brief Runs the haptic effect on its associated haptic device. + * + * If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over + * repeating the envelope (attack and fade) every time. If you only want the + * effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length + * parameter. + * + * \param haptic Haptic device to run the effect on. + * \param effect Identifier of the haptic effect to run. + * \param iterations Number of iterations to run the effect. Use + * ::SDL_HAPTIC_INFINITY for infinity. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticStopEffect + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticGetEffectStatus + */ +extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, + int effect, + Uint32 iterations); + +/** + * \brief Stops the haptic effect on its associated haptic device. + * + * \param haptic Haptic device to stop the effect on. + * \param effect Identifier of the effect to stop. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticDestroyEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, + int effect); + +/** + * \brief Destroys a haptic effect on the device. + * + * This will stop the effect if it's running. Effects are automatically + * destroyed when the device is closed. + * + * \param haptic Device to destroy the effect on. + * \param effect Identifier of the effect to destroy. + * + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic, + int effect); + +/** + * \brief Gets the status of the current effect on the haptic device. + * + * Device must support the ::SDL_HAPTIC_STATUS feature. + * + * \param haptic Haptic device to query the effect status on. + * \param effect Identifier of the effect to query its status. + * \return 0 if it isn't playing, 1 if it is playing or -1 on error. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic, + int effect); + +/** + * \brief Sets the global gain of the device. + * + * Device must support the ::SDL_HAPTIC_GAIN feature. + * + * The user may specify the maximum gain by setting the environment variable + * SDL_HAPTIC_GAIN_MAX which should be between 0 and 100. All calls to + * SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the + * maximum. + * + * \param haptic Haptic device to set the gain on. + * \param gain Value to set the gain to, should be between 0 and 100. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); + +/** + * \brief Sets the global autocenter of the device. + * + * Autocenter should be between 0 and 100. Setting it to 0 will disable + * autocentering. + * + * Device must support the ::SDL_HAPTIC_AUTOCENTER feature. + * + * \param haptic Haptic device to set autocentering on. + * \param autocenter Value to set autocenter to, 0 disables autocentering. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic, + int autocenter); + +/** + * \brief Pauses a haptic device. + * + * Device must support the ::SDL_HAPTIC_PAUSE feature. Call + * SDL_HapticUnpause() to resume playback. + * + * Do not modify the effects nor add new ones while the device is paused. + * That can cause all sorts of weird errors. + * + * \param haptic Haptic device to pause. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticUnpause + */ +extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); + +/** + * \brief Unpauses a haptic device. + * + * Call to unpause after SDL_HapticPause(). + * + * \param haptic Haptic device to pause. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticPause + */ +extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); + +/** + * \brief Stops all the currently playing effects on a haptic device. + * + * \param haptic Haptic device to stop. + * \return 0 on success or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); + +/** + * \brief Checks to see if rumble is supported on a haptic device. + * + * \param haptic Haptic device to check to see if it supports rumble. + * \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic); + +/** + * \brief Initializes the haptic device for simple rumble playback. + * + * \param haptic Haptic device to initialize for simple rumble playback. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic); + +/** + * \brief Runs simple rumble on a haptic device + * + * \param haptic Haptic device to play rumble effect on. + * \param strength Strength of the rumble to play as a 0-1 float value. + * \param length Length of the rumble to play in milliseconds. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length ); + +/** + * \brief Stops the simple rumble on a haptic device. + * + * \param haptic Haptic to stop the rumble on. + * \return 0 on success or -1 on error. + * + * \sa SDL_HapticRumbleSupported + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_haptic_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_hints.h b/Externals/SDL2-2.0.1/include/SDL_hints.h new file mode 100644 index 0000000000..dac928e075 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_hints.h @@ -0,0 +1,355 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_hints.h + * + * Official documentation for SDL configuration variables + * + * This file contains functions to set and get configuration hints, + * as well as listing each of them alphabetically. + * + * The convention for naming hints is SDL_HINT_X, where "SDL_X" is + * the environment variable that can be used to override the default. + * + * In general these hints are just that - they may or may not be + * supported or applicable on any given platform, but they provide + * a way for an application or user to give the library a hint as + * to how they would like the library to work. + */ + +#ifndef _SDL_hints_h +#define _SDL_hints_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. + * + * SDL can try to accelerate the SDL screen surface by using streaming + * textures with a 3D rendering engine. This variable controls whether and + * how this is done. + * + * This variable can be set to the following values: + * "0" - Disable 3D acceleration + * "1" - Enable 3D acceleration, using the default renderer. + * "X" - Enable 3D acceleration, using X where X is one of the valid rendering drivers. (e.g. "direct3d", "opengl", etc.) + * + * By default SDL tries to make a best guess for each platform whether + * to use acceleration or not. + */ +#define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" + +/** + * \brief A variable specifying which render driver to use. + * + * If the application doesn't pick a specific renderer to use, this variable + * specifies the name of the preferred renderer. If the preferred renderer + * can't be initialized, the normal default renderer is used. + * + * This variable is case insensitive and can be set to the following values: + * "direct3d" + * "opengl" + * "opengles2" + * "opengles" + * "software" + * + * The default varies by platform, but it's the first one in the list that + * is available on the current platform. + */ +#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" + +/** + * \brief A variable controlling whether the OpenGL render driver uses shaders if they are available. + * + * This variable can be set to the following values: + * "0" - Disable shaders + * "1" - Enable shaders + * + * By default shaders are used if OpenGL supports them. + */ +#define SDL_HINT_RENDER_OPENGL_SHADERS "SDL_RENDER_OPENGL_SHADERS" + +/** + * \brief A variable controlling whether the Direct3D device is initialized for thread-safe operations. + * + * This variable can be set to the following values: + * "0" - Thread-safety is not enabled (faster) + * "1" - Thread-safety is enabled + * + * By default the Direct3D device is created with thread-safety disabled. + */ +#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" + +/** + * \brief A variable controlling the scaling quality + * + * This variable can be set to the following values: + * "0" or "nearest" - Nearest pixel sampling + * "1" or "linear" - Linear filtering (supported by OpenGL and Direct3D) + * "2" or "best" - Currently this is the same as "linear" + * + * By default nearest pixel sampling is used + */ +#define SDL_HINT_RENDER_SCALE_QUALITY "SDL_RENDER_SCALE_QUALITY" + +/** + * \brief A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing. + * + * This variable can be set to the following values: + * "0" - Disable vsync + * "1" - Enable vsync + * + * By default SDL does not sync screen surface updates with vertical refresh. + */ +#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" + +/** + * \brief A variable controlling whether the X11 VidMode extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XVidMode + * "1" - Enable XVidMode + * + * By default SDL will use XVidMode if it is available. + */ +#define SDL_HINT_VIDEO_X11_XVIDMODE "SDL_VIDEO_X11_XVIDMODE" + +/** + * \brief A variable controlling whether the X11 Xinerama extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable Xinerama + * "1" - Enable Xinerama + * + * By default SDL will use Xinerama if it is available. + */ +#define SDL_HINT_VIDEO_X11_XINERAMA "SDL_VIDEO_X11_XINERAMA" + +/** + * \brief A variable controlling whether the X11 XRandR extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XRandR + * "1" - Enable XRandR + * + * By default SDL will not use XRandR because of window manager issues. + */ +#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" + +/** + * \brief A variable controlling whether grabbing input grabs the keyboard + * + * This variable can be set to the following values: + * "0" - Grab will affect only the mouse + * "1" - Grab will affect mouse and keyboard + * + * By default SDL will not grab the keyboard so system shortcuts still work. + */ +#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD" + +/** + * \brief Minimize your SDL_Window if it loses key focus when in Fullscreen mode. Defaults to true. + * + */ +#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" + + +/** + * \brief A variable controlling whether the idle timer is disabled on iOS. + * + * When an iOS app does not receive touches for some time, the screen is + * dimmed automatically. For games where the accelerometer is the only input + * this is problematic. This functionality can be disabled by setting this + * hint. + * + * This variable can be set to the following values: + * "0" - Enable idle timer + * "1" - Disable idle timer + */ +#define SDL_HINT_IDLE_TIMER_DISABLED "SDL_IOS_IDLE_TIMER_DISABLED" + +/** + * \brief A variable controlling which orientations are allowed on iOS. + * + * In some circumstances it is necessary to be able to explicitly control + * which UI orientations are allowed. + * + * This variable is a space delimited list of the following values: + * "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown" + */ +#define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" + + +/** + * \brief A variable that lets you disable the detection and use of Xinput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable XInput timer (only uses direct input) + * "1" - Enable XInput timer (the default) + */ +#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" + + +/** + * \brief A variable that lets you manually hint extra gamecontroller db entries + * + * The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" + + +/** + * \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background. + * + * The variable can be set to the following values: + * "0" - Disable joystick & gamecontroller input events when the + * application is in the background. + * "1" - Enable joystick & gamecontroller input events when the + * application is in the backgroumd. + * + * The default value is "0". This hint may be set at any time. + */ +#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" + + +/** + * \brief If set to 0 then never set the top most bit on a SDL Window, even if the video mode expects it. + * This is a debugging aid for developers and not expected to be used by end users. The default is "1" + * + * This variable can be set to the following values: + * "0" - don't allow topmost + * "1" - allow topmost + */ +#define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST" + + +/** + * \brief A variable that controls the timer resolution, in milliseconds. + * + * The higher resolution the timer, the more frequently the CPU services + * timer interrupts, and the more precise delays are, but this takes up + * power and CPU time. This hint is only used on Windows 7 and earlier. + * + * See this blog post for more information: + * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/ + * + * If this variable is set to "0", the system timer resolution is not set. + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" + + +/** + * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac) + */ +#define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" + + +/** + * \brief An enumeration of hint priorities + */ +typedef enum +{ + SDL_HINT_DEFAULT, + SDL_HINT_NORMAL, + SDL_HINT_OVERRIDE +} SDL_HintPriority; + + +/** + * \brief Set a hint with a specific priority + * + * The priority controls the behavior when setting a hint that already + * has a value. Hints will replace existing hints of their priority and + * lower. Environment variables are considered to have override priority. + * + * \return SDL_TRUE if the hint was set, SDL_FALSE otherwise + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, + const char *value, + SDL_HintPriority priority); + +/** + * \brief Set a hint with normal priority + * + * \return SDL_TRUE if the hint was set, SDL_FALSE otherwise + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, + const char *value); + +/** + * \brief Get a hint + * + * \return The string value of a hint variable. + */ +extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); + +/** + * \brief Add a function to watch a particular hint + * + * \param name The hint to watch + * \param callback The function to call when the hint value changes + * \param userdata A pointer to pass to the callback function + */ +typedef void (*SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue); +extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * \brief Remove a function watching a particular hint + * + * \param name The hint being watched + * \param callback The function being called when the hint value changes + * \param userdata A pointer being passed to the callback function + */ +extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * \brief Clear all hints + * + * This function is called during SDL_Quit() to free stored hints. + */ +extern DECLSPEC void SDLCALL SDL_ClearHints(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_hints_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_joystick.h b/Externals/SDL2-2.0.1/include/SDL_joystick.h new file mode 100644 index 0000000000..b0e4b5dab8 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_joystick.h @@ -0,0 +1,253 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_joystick.h + * + * Include file for SDL joystick event handling + * + * The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks, with the exact joystick + * behind a device_index changing as joysticks are plugged and unplugged. + * + * The term "instance_id" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted + * then it will get a new instance_id, instance_id's are monotonically increasing identifiers of a joystick plugged in. + * + * The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of + * the device (a X360 wired controller for example). This identifier is platform dependent. + * + * + */ + +#ifndef _SDL_joystick_h +#define _SDL_joystick_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_joystick.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + * + * If you would like to receive joystick updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/* The joystick structure used to identify an SDL joystick */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* A structure that encodes the stable unique id for a joystick device */ +typedef struct { + Uint8 data[16]; +} SDL_JoystickGUID; + +typedef Sint32 SDL_JoystickID; + + +/* Function prototypes */ +/** + * Count the number of joysticks attached to the system right now + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * This can be called before any joysticks are opened. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); + +/** + * Open a joystick for use. + * The index passed as an argument refers tothe N'th joystick on the system. + * This index is the value which will identify this joystick in future joystick + * events. + * + * \return A joystick identifier, or NULL if an error occurred. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Return the name for this currently opened joystick. + * If no name can be found, this function returns NULL. + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick * joystick); + +/** + * Return the GUID for the joystick at this index + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index); + +/** + * Return the GUID for this opened joystick + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick * joystick); + +/** + * Return a string representation for this guid. pszGUID must point to at least 33 bytes + * (32 for the string plus a NULL terminator). + */ +extern DECLSPEC void SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID); + +/** + * convert a string into a joystick formatted guid + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); + +/** + * Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick * joystick); + +/** + * Get the instance ID of an opened joystick or -1 if the joystick is invalid. + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick * joystick); + +/** + * Get the number of general axis controls on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick * joystick); + +/** + * Get the number of trackballs on a joystick. + * + * Joystick trackballs have only relative motion events associated + * with them and their state cannot be polled. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick * joystick); + +/** + * Get the number of POV hats on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick * joystick); + +/** + * Get the number of buttons on a joystick. + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick * joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick + * events are enabled. + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and check the state of the joystick when you want joystick + * information. + * + * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +/** + * Get the current state of an axis control on a joystick. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, + int axis); + +/** + * \name Hat positions + */ +/* @{ */ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/* @} */ + +/** + * Get the current state of a POV hat on a joystick. + * + * The hat indices start at index 0. + * + * \return The return value is one of the following positions: + * - ::SDL_HAT_CENTERED + * - ::SDL_HAT_UP + * - ::SDL_HAT_RIGHT + * - ::SDL_HAT_DOWN + * - ::SDL_HAT_LEFT + * - ::SDL_HAT_RIGHTUP + * - ::SDL_HAT_RIGHTDOWN + * - ::SDL_HAT_LEFTUP + * - ::SDL_HAT_LEFTDOWN + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick * joystick, + int hat); + +/** + * Get the ball axis change since the last poll. + * + * \return 0, or -1 if you passed it invalid parameters. + * + * The ball indices start at index 0. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick * joystick, + int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick. + * + * The button indices start at index 0. + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick, + int button); + +/** + * Close a joystick previously opened with SDL_JoystickOpen(). + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_joystick_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_keyboard.h b/Externals/SDL2-2.0.1/include/SDL_keyboard.h new file mode 100644 index 0000000000..e10f9fd15a --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_keyboard.h @@ -0,0 +1,217 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_keyboard.h + * + * Include file for SDL keyboard event handling + */ + +#ifndef _SDL_keyboard_h +#define _SDL_keyboard_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keycode.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The SDL keysym structure, used in key events. + * + * \note If you are looking for translated character input, see the ::SDL_TEXTINPUT event. + */ +typedef struct SDL_Keysym +{ + SDL_Scancode scancode; /**< SDL physical key code - see ::SDL_Scancode for details */ + SDL_Keycode sym; /**< SDL virtual key code - see ::SDL_Keycode for details */ + Uint16 mod; /**< current key modifiers */ + Uint32 unused; +} SDL_Keysym; + +/* Function prototypes */ + +/** + * \brief Get the window which currently has keyboard focus. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); + +/** + * \brief Get a snapshot of the current state of the keyboard. + * + * \param numkeys if non-NULL, receives the length of the returned array. + * + * \return An array of key states. Indexes into this array are obtained by using ::SDL_Scancode values. + * + * \b Example: + * \code + * const Uint8 *state = SDL_GetKeyboardState(NULL); + * if ( state[SDL_SCANCODE_RETURN] ) { + * printf(" is pressed.\n"); + * } + * \endcode + */ +extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); + +/** + * \brief Get the current key modifier state for the keyboard. + */ +extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); + +/** + * \brief Set the current key modifier state for the keyboard. + * + * \note This does not change the keyboard state, only the key modifier flags. + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); + +/** + * \brief Get the key code corresponding to the given scancode according + * to the current keyboard layout. + * + * See ::SDL_Keycode for details. + * + * \sa SDL_GetKeyName() + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode); + +/** + * \brief Get the scancode corresponding to the given key code according to the + * current keyboard layout. + * + * See ::SDL_Scancode for details. + * + * \sa SDL_GetScancodeName() + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key); + +/** + * \brief Get a human-readable name for a scancode. + * + * \return A pointer to the name for the scancode. + * If the scancode doesn't have a name, this function returns + * an empty string (""). + * + * \sa SDL_Scancode + */ +extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); + +/** + * \brief Get a scancode from a human-readable name + * + * \return scancode, or SDL_SCANCODE_UNKNOWN if the name wasn't recognized + * + * \sa SDL_Scancode + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name); + +/** + * \brief Get a human-readable name for a key. + * + * \return A pointer to a UTF-8 string that stays valid at least until the next + * call to this function. If you need it around any longer, you must + * copy it. If the key doesn't have a name, this function returns an + * empty string (""). + * + * \sa SDL_Key + */ +extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); + +/** + * \brief Get a key code from a human-readable name + * + * \return key code, or SDLK_UNKNOWN if the name wasn't recognized + * + * \sa SDL_Keycode + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); + +/** + * \brief Start accepting Unicode text input events. + * This function will show the on-screen keyboard if supported. + * + * \sa SDL_StopTextInput() + * \sa SDL_SetTextInputRect() + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC void SDLCALL SDL_StartTextInput(void); + +/** + * \brief Return whether or not Unicode text input events are enabled. + * + * \sa SDL_StartTextInput() + * \sa SDL_StopTextInput() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void); + +/** + * \brief Stop receiving any text input events. + * This function will hide the on-screen keyboard if supported. + * + * \sa SDL_StartTextInput() + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC void SDLCALL SDL_StopTextInput(void); + +/** + * \brief Set the rectangle used to type Unicode text inputs. + * This is used as a hint for IME and on-screen keyboard placement. + * + * \sa SDL_StartTextInput() + */ +extern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect); + +/** + * \brief Returns whether the platform has some screen keyboard support. + * + * \return SDL_TRUE if some keyboard support is available else SDL_FALSE. + * + * \note Not all screen keyboard functions are supported on all platforms. + * + * \sa SDL_IsScreenKeyboardShown() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); + +/** + * \brief Returns whether the screen keyboard is shown for given window. + * + * \param window The window for which screen keyboard should be queried. + * + * \return SDL_TRUE if screen keyboard is shown else SDL_FALSE. + * + * \sa SDL_HasScreenKeyboardSupport() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_keyboard_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_keysym.h b/Externals/SDL2-2.0.1/include/SDL_keycode.h similarity index 79% rename from Externals/SDL/Include_1.3/SDL_keysym.h rename to Externals/SDL2-2.0.1/include/SDL_keycode.h index 72b2c35fb3..de584e126b 100644 --- a/Externals/SDL/Include_1.3/SDL_keysym.h +++ b/Externals/SDL2-2.0.1/include/SDL_keycode.h @@ -1,49 +1,48 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /** - * \file SDL_keysym.h + * \file SDL_keycode.h + * + * Defines constants which identify keyboard keys and modifiers. */ -#ifndef _SDL_keysym_h -#define _SDL_keysym_h +#ifndef _SDL_keycode_h +#define _SDL_keycode_h #include "SDL_stdinc.h" #include "SDL_scancode.h" /** - * \typedef SDLKey + * \brief The SDL virtual key representation. * - * \brief The SDL virtual key representation. - * - * Values of this type are used to represent keyboard keys using the current - * layout of the keyboard. These values include Unicode values representing - * the unmodified character that would be generated by pressing the key, or - * an SDLK_* constant for those keys that do not generate characters. + * Values of this type are used to represent keyboard keys using the current + * layout of the keyboard. These values include Unicode values representing + * the unmodified character that would be generated by pressing the key, or + * an SDLK_* constant for those keys that do not generate characters. */ -typedef Sint32 SDLKey; +typedef Sint32 SDL_Keycode; #define SDLK_SCANCODE_MASK (1<<30) -#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) +#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) enum { @@ -54,6 +53,73 @@ enum SDLK_BACKSPACE = '\b', SDLK_TAB = '\t', SDLK_SPACE = ' ', + SDLK_EXCLAIM = '!', + SDLK_QUOTEDBL = '"', + SDLK_HASH = '#', + SDLK_PERCENT = '%', + SDLK_DOLLAR = '$', + SDLK_AMPERSAND = '&', + SDLK_QUOTE = '\'', + SDLK_LEFTPAREN = '(', + SDLK_RIGHTPAREN = ')', + SDLK_ASTERISK = '*', + SDLK_PLUS = '+', + SDLK_COMMA = ',', + SDLK_MINUS = '-', + SDLK_PERIOD = '.', + SDLK_SLASH = '/', + SDLK_0 = '0', + SDLK_1 = '1', + SDLK_2 = '2', + SDLK_3 = '3', + SDLK_4 = '4', + SDLK_5 = '5', + SDLK_6 = '6', + SDLK_7 = '7', + SDLK_8 = '8', + SDLK_9 = '9', + SDLK_COLON = ':', + SDLK_SEMICOLON = ';', + SDLK_LESS = '<', + SDLK_EQUALS = '=', + SDLK_GREATER = '>', + SDLK_QUESTION = '?', + SDLK_AT = '@', + /* + Skip uppercase letters + */ + SDLK_LEFTBRACKET = '[', + SDLK_BACKSLASH = '\\', + SDLK_RIGHTBRACKET = ']', + SDLK_CARET = '^', + SDLK_UNDERSCORE = '_', + SDLK_BACKQUOTE = '`', + SDLK_a = 'a', + SDLK_b = 'b', + SDLK_c = 'c', + SDLK_d = 'd', + SDLK_e = 'e', + SDLK_f = 'f', + SDLK_g = 'g', + SDLK_h = 'h', + SDLK_i = 'i', + SDLK_j = 'j', + SDLK_k = 'k', + SDLK_l = 'l', + SDLK_m = 'm', + SDLK_n = 'n', + SDLK_o = 'o', + SDLK_p = 'p', + SDLK_q = 'q', + SDLK_r = 'r', + SDLK_s = 's', + SDLK_t = 't', + SDLK_u = 'u', + SDLK_v = 'v', + SDLK_w = 'w', + SDLK_x = 'x', + SDLK_y = 'y', + SDLK_z = 'z', SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK), @@ -246,9 +312,7 @@ enum }; /** - * \enum SDLMod - * - * \brief Enumeration of valid key mods (possibly OR'd together) + * \brief Enumeration of valid key mods (possibly OR'd together). */ typedef enum { @@ -265,13 +329,13 @@ typedef enum KMOD_CAPS = 0x2000, KMOD_MODE = 0x4000, KMOD_RESERVED = 0x8000 -} SDLMod; +} SDL_Keymod; -#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) -#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) -#define KMOD_ALT (KMOD_LALT|KMOD_RALT) -#define KMOD_GUI (KMOD_LGUI|KMOD_RGUI) +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_GUI (KMOD_LGUI|KMOD_RGUI) -#endif /* _SDL_keysym_h */ +#endif /* _SDL_keycode_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_loadso.h b/Externals/SDL2-2.0.1/include/SDL_loadso.h new file mode 100644 index 0000000000..790d0a724c --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_loadso.h @@ -0,0 +1,81 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_loadso.h + * + * System dependent library loading routines + * + * Some things to keep in mind: + * \li These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * \li Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * \li Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + +#ifndef _SDL_loadso_h +#define _SDL_loadso_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This function dynamically loads a shared object and returns a pointer + * to the object handle (or NULL if there was an error). + * The 'sofile' parameter is a system dependent name of the object file. + */ +extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Given an object handle, this function looks up the address of the + * named function in the shared object and returns it. This address + * is no longer valid after calling SDL_UnloadObject(). + */ +extern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, + const char *name); + +/** + * Unload a shared object from memory. + */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_loadso_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_log.h b/Externals/SDL2-2.0.1/include/SDL_log.h new file mode 100644 index 0000000000..79ae4cde43 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_log.h @@ -0,0 +1,211 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_log.h + * + * Simple log messages with categories and priorities. + * + * By default logs are quiet, but if you're debugging SDL you might want: + * + * SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN); + * + * Here's where the messages go on different platforms: + * Windows: debug output stream + * Android: log output + * Others: standard error output (stderr) + */ + +#ifndef _SDL_log_h +#define _SDL_log_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief The maximum size of a log message + * + * Messages longer than the maximum size will be truncated + */ +#define SDL_MAX_LOG_MESSAGE 4096 + +/** + * \brief The predefined log categories + * + * By default the application category is enabled at the INFO level, + * the assert category is enabled at the WARN level, test is enabled + * at the VERBOSE level and all other categories are enabled at the + * CRITICAL level. + */ +enum +{ + SDL_LOG_CATEGORY_APPLICATION, + SDL_LOG_CATEGORY_ERROR, + SDL_LOG_CATEGORY_ASSERT, + SDL_LOG_CATEGORY_SYSTEM, + SDL_LOG_CATEGORY_AUDIO, + SDL_LOG_CATEGORY_VIDEO, + SDL_LOG_CATEGORY_RENDER, + SDL_LOG_CATEGORY_INPUT, + SDL_LOG_CATEGORY_TEST, + + /* Reserved for future SDL library use */ + SDL_LOG_CATEGORY_RESERVED1, + SDL_LOG_CATEGORY_RESERVED2, + SDL_LOG_CATEGORY_RESERVED3, + SDL_LOG_CATEGORY_RESERVED4, + SDL_LOG_CATEGORY_RESERVED5, + SDL_LOG_CATEGORY_RESERVED6, + SDL_LOG_CATEGORY_RESERVED7, + SDL_LOG_CATEGORY_RESERVED8, + SDL_LOG_CATEGORY_RESERVED9, + SDL_LOG_CATEGORY_RESERVED10, + + /* Beyond this point is reserved for application use, e.g. + enum { + MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM, + MYAPP_CATEGORY_AWESOME2, + MYAPP_CATEGORY_AWESOME3, + ... + }; + */ + SDL_LOG_CATEGORY_CUSTOM +}; + +/** + * \brief The predefined log priorities + */ +typedef enum +{ + SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_DEBUG, + SDL_LOG_PRIORITY_INFO, + SDL_LOG_PRIORITY_WARN, + SDL_LOG_PRIORITY_ERROR, + SDL_LOG_PRIORITY_CRITICAL, + SDL_NUM_LOG_PRIORITIES +} SDL_LogPriority; + + +/** + * \brief Set the priority of all log categories + */ +extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority); + +/** + * \brief Set the priority of a particular log category + */ +extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category, + SDL_LogPriority priority); + +/** + * \brief Get the priority of a particular log category + */ +extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category); + +/** + * \brief Reset all priorities to default. + * + * \note This is called in SDL_Quit(). + */ +extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); + +/** + * \brief Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO + */ +extern DECLSPEC void SDLCALL SDL_Log(const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_VERBOSE + */ +extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_DEBUG + */ +extern DECLSPEC void SDLCALL SDL_LogDebug(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_INFO + */ +extern DECLSPEC void SDLCALL SDL_LogInfo(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_WARN + */ +extern DECLSPEC void SDLCALL SDL_LogWarn(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_ERROR + */ +extern DECLSPEC void SDLCALL SDL_LogError(int category, const char *fmt, ...); + +/** + * \brief Log a message with SDL_LOG_PRIORITY_CRITICAL + */ +extern DECLSPEC void SDLCALL SDL_LogCritical(int category, const char *fmt, ...); + +/** + * \brief Log a message with the specified category and priority. + */ +extern DECLSPEC void SDLCALL SDL_LogMessage(int category, + SDL_LogPriority priority, + const char *fmt, ...); + +/** + * \brief Log a message with the specified category and priority. + */ +extern DECLSPEC void SDLCALL SDL_LogMessageV(int category, + SDL_LogPriority priority, + const char *fmt, va_list ap); + +/** + * \brief The prototype for the log output function + */ +typedef void (*SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); + +/** + * \brief Get the current log output function. + */ +extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata); + +/** + * \brief This function allows you to replace the default log output + * function with one of your own. + */ +extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_log_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_main.h b/Externals/SDL2-2.0.1/include/SDL_main.h new file mode 100644 index 0000000000..b7e4a10e5e --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_main.h @@ -0,0 +1,125 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_main_h +#define _SDL_main_h + +#include "SDL_stdinc.h" + +/** + * \file SDL_main.h + * + * Redefine main() on some platforms so that it is called by SDL. + */ + +#ifndef SDL_MAIN_HANDLED +#if defined(__WIN32__) +/* On Windows SDL provides WinMain(), which parses the command line and passes + the arguments to your main function. + + If you provide your own WinMain(), you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__IPHONEOS__) +/* On iOS SDL provides a main function that creates an application delegate + and starts the iOS application run loop. + + See src/video/uikit/SDL_uikitappdelegate.m for more details. + */ +#define SDL_MAIN_NEEDED + +#elif defined(__ANDROID__) +/* On Android SDL provides a Java class in SDLActivity.java that is the + main activity entry point. + + See README-android.txt for more details on extending that class. + */ +#define SDL_MAIN_NEEDED + +#endif +#endif /* SDL_MAIN_HANDLED */ + +#ifdef __cplusplus +#define C_LINKAGE "C" +#else +#define C_LINKAGE +#endif /* __cplusplus */ + +/** + * \file SDL_main.h + * + * The application's main() function must be called with C linkage, + * and should be declared like this: + * \code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * \endcode + */ + +#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) +#define main SDL_main +#endif + +/** + * The prototype for the application's main() function + */ +extern C_LINKAGE int SDL_main(int argc, char *argv[]); + + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This is called by the real SDL main function to let the rest of the + * library know that initialization was done properly. + * + * Calling this yourself without knowing what you're doing can cause + * crashes and hard to diagnose problems with your application. + */ +extern DECLSPEC void SDL_SetMainReady(void); + +#ifdef __WIN32__ + +/** + * This can be called to set the application class at startup + */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, + void *hInst); +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); + +#endif /* __WIN32__ */ + + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_main_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_messagebox.h b/Externals/SDL2-2.0.1/include/SDL_messagebox.h new file mode 100644 index 0000000000..cb1a1ccff0 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_messagebox.h @@ -0,0 +1,144 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_messagebox_h +#define _SDL_messagebox_h + +#include "SDL_stdinc.h" +#include "SDL_video.h" /* For SDL_Window */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SDL_MessageBox flags. If supported will display warning icon, etc. + */ +typedef enum +{ + SDL_MESSAGEBOX_ERROR = 0x00000010, /**< error dialog */ + SDL_MESSAGEBOX_WARNING = 0x00000020, /**< warning dialog */ + SDL_MESSAGEBOX_INFORMATION = 0x00000040 /**< informational dialog */ +} SDL_MessageBoxFlags; + +/** + * \brief Flags for SDL_MessageBoxButtonData. + */ +typedef enum +{ + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001, /**< Marks the default button when return is hit */ + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002 /**< Marks the default button when escape is hit */ +} SDL_MessageBoxButtonFlags; + +/** + * \brief Individual button data. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxButtonFlags */ + int buttonid; /**< User defined button id (value returned via SDL_ShowMessageBox) */ + const char * text; /**< The UTF-8 button text */ +} SDL_MessageBoxButtonData; + +/** + * \brief RGB value used in a message box color scheme + */ +typedef struct +{ + Uint8 r, g, b; +} SDL_MessageBoxColor; + +typedef enum +{ + SDL_MESSAGEBOX_COLOR_BACKGROUND, + SDL_MESSAGEBOX_COLOR_TEXT, + SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, + SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, + SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, + SDL_MESSAGEBOX_COLOR_MAX +} SDL_MessageBoxColorType; + +/** + * \brief A set of colors to use for message box dialogs + */ +typedef struct +{ + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; +} SDL_MessageBoxColorScheme; + +/** + * \brief MessageBox structure containing title, text, window, etc. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxFlags */ + SDL_Window *window; /**< Parent window, can be NULL */ + const char *title; /**< UTF-8 title */ + const char *message; /**< UTF-8 message text */ + + int numbuttons; + const SDL_MessageBoxButtonData *buttons; + + const SDL_MessageBoxColorScheme *colorScheme; /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */ +} SDL_MessageBoxData; + +/** + * \brief Create a modal message box. + * + * \param messageboxdata The SDL_MessageBoxData structure with title, text, etc. + * \param buttonid The pointer to which user id of hit button should be copied. + * + * \return -1 on error, otherwise 0 and buttonid contains user id of button + * hit or -1 if dialog was closed. + * + * \note This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or + * closes the messagebox. + */ +extern DECLSPEC int SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +/** + * \brief Create a simple modal message box + * + * \param flags ::SDL_MessageBoxFlags + * \param title UTF-8 title text + * \param message UTF-8 message text + * \param window The parent window, or NULL for no parent + * + * \return 0 on success, -1 on error + * + * \sa SDL_ShowMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_messagebox_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_mouse.h b/Externals/SDL2-2.0.1/include/SDL_mouse.h new file mode 100644 index 0000000000..36c29e90a7 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_mouse.h @@ -0,0 +1,224 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_mouse.h + * + * Include file for SDL mouse event handling. + */ + +#ifndef _SDL_mouse_h +#define _SDL_mouse_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SDL_Cursor SDL_Cursor; /* Implementation dependent */ + +/** + * \brief Cursor types for SDL_CreateSystemCursor. + */ +typedef enum +{ + SDL_SYSTEM_CURSOR_ARROW, /**< Arrow */ + SDL_SYSTEM_CURSOR_IBEAM, /**< I-beam */ + SDL_SYSTEM_CURSOR_WAIT, /**< Wait */ + SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair */ + SDL_SYSTEM_CURSOR_WAITARROW, /**< Small wait cursor (or Wait if not available) */ + SDL_SYSTEM_CURSOR_SIZENWSE, /**< Double arrow pointing northwest and southeast */ + SDL_SYSTEM_CURSOR_SIZENESW, /**< Double arrow pointing northeast and southwest */ + SDL_SYSTEM_CURSOR_SIZEWE, /**< Double arrow pointing west and east */ + SDL_SYSTEM_CURSOR_SIZENS, /**< Double arrow pointing north and south */ + SDL_SYSTEM_CURSOR_SIZEALL, /**< Four pointed arrow pointing north, south, east, and west */ + SDL_SYSTEM_CURSOR_NO, /**< Slashed circle or crossbones */ + SDL_SYSTEM_CURSOR_HAND, /**< Hand */ + SDL_NUM_SYSTEM_CURSORS +} SDL_SystemCursor; + +/* Function prototypes */ + +/** + * \brief Get the window which currently has mouse focus. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); + +/** + * \brief Retrieve the current state of the mouse. + * + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse cursor position relative to the focus window for the currently + * selected mouse. You can pass NULL for either x or y. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * \brief Retrieve the relative state of the mouse. + * + * The current button state is returned as a button bitmask, which can + * be tested using the SDL_BUTTON(X) macros, and x and y are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState(). + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * \brief Moves the mouse to the given position within the window. + * + * \param window The window to move the mouse into, or NULL for the current mouse focus + * \param x The x coordinate within the window + * \param y The y coordinate within the window + * + * \note This function generates a mouse motion event + */ +extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, + int x, int y); + +/** + * \brief Set relative mouse mode. + * + * \param enabled Whether or not to enable relative mode + * + * \return 0 on success, or -1 if relative mode is not supported. + * + * While the mouse is in relative mode, the cursor is hidden, and the + * driver will try to report continuous motion in the current window. + * Only relative motion events will be delivered, the mouse position + * will not change. + * + * \note This function will flush any pending mouse motion. + * + * \sa SDL_GetRelativeMouseMode() + */ +extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); + +/** + * \brief Query whether relative mouse mode is enabled. + * + * \sa SDL_SetRelativeMouseMode() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void); + +/** + * \brief Create a cursor, using the specified bitmap data and + * mask (in MSB format). + * + * The cursor width must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * + * + * + * + * + * + *
data mask resulting pixel on screen
0 1 White
1 1 Black
0 0 Transparent
1 0 Inverted color if possible, black + * if not.
+ * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data, + const Uint8 * mask, + int w, int h, int hot_x, + int hot_y); + +/** + * \brief Create a color cursor. + * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateColorCursor(SDL_Surface *surface, + int hot_x, + int hot_y); + +/** + * \brief Create a system cursor. + * + * \sa SDL_FreeCursor() + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id); + +/** + * \brief Set the active cursor. + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor); + +/** + * \brief Return the active cursor. + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void); + +/** + * \brief Return the default cursor. + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void); + +/** + * \brief Frees a cursor created with SDL_CreateCursor(). + * + * \sa SDL_CreateCursor() + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); + +/** + * \brief Toggle whether or not the cursor is shown. + * + * \param toggle 1 to show the cursor, 0 to hide it, -1 to query the current + * state. + * + * \return 1 if the cursor is shown, or 0 if the cursor is hidden. + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/** + * Used as a mask when testing buttons in buttonstate. + * - Button 1: Left mouse button + * - Button 2: Middle mouse button + * - Button 3: Right mouse button + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_X1 4 +#define SDL_BUTTON_X2 5 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mouse_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_mutex.h b/Externals/SDL2-2.0.1/include/SDL_mutex.h new file mode 100644 index 0000000000..2b5df0ec33 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_mutex.h @@ -0,0 +1,251 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_mutex_h +#define _SDL_mutex_h + +/** + * \file SDL_mutex.h + * + * Functions to provide thread synchronization primitives. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** + * This is the timeout value which corresponds to never time out. + */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/** + * \name Mutex functions + */ +/* @{ */ + +/* The SDL mutex structure, defined in SDL_sysmutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** + * Create a mutex, initialized unlocked. + */ +extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void); + +/** + * Lock the mutex. + * + * \return 0, or -1 on error. + */ +#define SDL_mutexP(m) SDL_LockMutex(m) +extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex); + +/** + * Try to lock the mutex + * + * \return 0, SDL_MUTEX_TIMEDOUT, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex); + +/** + * Unlock the mutex. + * + * \return 0, or -1 on error. + * + * \warning It is an error to unlock a mutex that has not been locked by + * the current thread, and doing so results in undefined behavior. + */ +#define SDL_mutexV(m) SDL_UnlockMutex(m) +extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex); + +/** + * Destroy a mutex. + */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex); + +/* @} *//* Mutex functions */ + + +/** + * \name Semaphore functions + */ +/* @{ */ + +/* The SDL semaphore structure, defined in SDL_syssem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** + * Create a semaphore, initialized with value, returns NULL on failure. + */ +extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** + * Destroy a semaphore. + */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem); + +/** + * This function suspends the calling thread until the semaphore pointed + * to by \c sem has a positive count. It then atomically decreases the + * semaphore count. + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem); + +/** + * Non-blocking variant of SDL_SemWait(). + * + * \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait would + * block, and -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem); + +/** + * Variant of SDL_SemWait() with a timeout in milliseconds. + * + * \return 0 if the wait succeeds, ::SDL_MUTEX_TIMEDOUT if the wait does not + * succeed in the allotted time, and -1 on error. + * + * \warning On some platforms this function is implemented by looping with a + * delay of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms); + +/** + * Atomically increases the semaphore's count (not blocking). + * + * \return 0, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem); + +/** + * Returns the current count of the semaphore. + */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem); + +/* @} *//* Semaphore functions */ + + +/** + * \name Condition variable functions + */ +/* @{ */ + +/* The SDL condition variable structure, defined in SDL_syscond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; + +/** + * Create a condition variable. + * + * Typical use of condition variables: + * + * Thread A: + * SDL_LockMutex(lock); + * while ( ! condition ) { + * SDL_CondWait(cond, lock); + * } + * SDL_UnlockMutex(lock); + * + * Thread B: + * SDL_LockMutex(lock); + * ... + * condition = true; + * ... + * SDL_CondSignal(cond); + * SDL_UnlockMutex(lock); + * + * There is some discussion whether to signal the condition variable + * with the mutex locked or not. There is some potential performance + * benefit to unlocking first on some platforms, but there are some + * potential race conditions depending on how your code is structured. + * + * In general it's safer to signal the condition variable while the + * mutex is locked. + */ +extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void); + +/** + * Destroy a condition variable. + */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond); + +/** + * Restart one of the threads that are waiting on the condition variable. + * + * \return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond); + +/** + * Restart all threads that are waiting on the condition variable. + * + * \return 0 or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond); + +/** + * Wait on the condition variable, unlocking the provided mutex. + * + * \warning The mutex must be locked before entering this function! + * + * The mutex is re-locked once the condition variable is signaled. + * + * \return 0 when it is signaled, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex); + +/** + * Waits for at most \c ms milliseconds, and returns 0 if the condition + * variable is signaled, ::SDL_MUTEX_TIMEDOUT if the condition is not + * signaled in the allotted time, and -1 on error. + * + * \warning On some platforms this function is implemented by looping with a + * delay of 1 ms, and so should be avoided if possible. + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond, + SDL_mutex * mutex, Uint32 ms); + +/* @} *//* Condition variable functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_mutex_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.2/SDL_name.h b/Externals/SDL2-2.0.1/include/SDL_name.h similarity index 84% rename from Externals/SDL/Include_1.2/SDL_name.h rename to Externals/SDL2-2.0.1/include/SDL_name.h index 511619af56..d0469e1f29 100644 --- a/Externals/SDL/Include_1.2/SDL_name.h +++ b/Externals/SDL2-2.0.1/include/SDL_name.h @@ -6,6 +6,6 @@ #define NeedFunctionPrototypes 1 #endif -#define SDL_NAME(X) SDL_##X +#define SDL_NAME(X) SDL_##X #endif /* _SDLname_h_ */ diff --git a/Externals/SDL/Include_1.3/SDL_opengl.h b/Externals/SDL2-2.0.1/include/SDL_opengl.h similarity index 55% rename from Externals/SDL/Include_1.3/SDL_opengl.h rename to Externals/SDL2-2.0.1/include/SDL_opengl.h index 2a2ebb47ee..2f120aa95a 100644 --- a/Externals/SDL/Include_1.3/SDL_opengl.h +++ b/Externals/SDL2-2.0.1/include/SDL_opengl.h @@ -1,29 +1,37 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ -/* This is a simple file to encapsulate the OpenGL API headers */ +/** + * \file SDL_opengl.h + * + * This is a simple file to encapsulate the OpenGL API headers. + */ + +#ifndef _SDL_opengl_h +#define _SDL_opengl_h #include "SDL_config.h" +#ifndef __IPHONEOS__ + #ifdef __WIN32__ #define WIN32_LEAN_AND_MEAN #ifndef NOMINMAX @@ -31,27 +39,42 @@ #endif #include #endif + +#ifdef __glext_h_ +/* Someone has already included glext.h */ +#define NO_SDL_GLEXT +#endif #ifndef NO_SDL_GLEXT #define __glext_h_ /* Don't let gl.h include glext.h */ #endif #if defined(__MACOSX__) #include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ +#define __X_GL_H #else #include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ #endif #ifndef NO_SDL_GLEXT #undef __glext_h_ #endif -/* This file is included because glext.h is not available on some systems. - If you don't want this version included, simply define "NO_SDL_GLEXT" - The latest version is available from: - http://oss.sgi.com/projects/ogl-sample/registry/ +/** + * \file SDL_opengl.h + * + * This file is included because glext.h is not available on some systems. + * If you don't want this version included, simply define ::NO_SDL_GLEXT. + * + * The latest version is available from: + * http://www.opengl.org/registry/ */ + +/** + * \def NO_SDL_GLEXT + * + * Define this if you have your own version of glext.h and want to disable the + * version included in SDL_opengl.h. + */ + #if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) -/* *INDENT-OFF* */ #ifndef __glext_h_ #define __glext_h_ @@ -60,8 +83,8 @@ extern "C" { #endif /* -** Copyright (c) 2007 The Khronos Group Inc. -** +** Copyright (c) 2007-2010 The Khronos Group Inc. +** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including @@ -69,10 +92,10 @@ extern "C" { ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: -** +** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. -** +** ** THE MATERIALS ARE 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 AND NONINFRINGEMENT. @@ -82,6 +105,12 @@ extern "C" { ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */ +/* Current version at http://www.opengl.org/registry/ */ +#define GL_GLEXT_VERSION 64 +/* Function declaration macros - to move into glplatform.h */ + #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #define WIN32_LEAN_AND_MEAN 1 #include @@ -99,18 +128,12 @@ extern "C" { /*************************************************************/ -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated 2008/11/14 */ -/* Current version at http://www.opengl.org/registry/ */ -#define GL_GLEXT_VERSION 44 - #ifndef GL_VERSION_1_2 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C @@ -137,17 +160,21 @@ extern "C" { #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E #endif +#ifndef GL_VERSION_1_2_DEPRECATED +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#endif + #ifndef GL_ARB_imaging #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 @@ -160,6 +187,9 @@ extern "C" { #define GL_BLEND_EQUATION 0x8009 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B +#endif + +#ifndef GL_ARB_imaging_DEPRECATED #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 @@ -260,12 +290,6 @@ extern "C" { #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F @@ -274,9 +298,6 @@ extern "C" { #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 @@ -287,10 +308,6 @@ extern "C" { #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF @@ -299,6 +316,22 @@ extern "C" { #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_CLAMP_TO_BORDER 0x812D +#endif + +#ifndef GL_VERSION_1_3_DEPRECATED +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 @@ -330,16 +363,26 @@ extern "C" { #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#endif + +#ifndef GL_VERSION_1_4_DEPRECATED +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 @@ -355,15 +398,8 @@ extern "C" { #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E #endif @@ -378,15 +414,6 @@ extern "C" { #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 @@ -404,31 +431,42 @@ extern "C" { #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_1_5_DEPRECATED +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC2_ALPHA 0x858A #endif #ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_RGB 0x8009 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 @@ -452,11 +490,8 @@ extern "C" { #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 @@ -507,8 +542,14 @@ extern "C" { #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 #endif +#ifndef GL_VERSION_2_0_DEPRECATED +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +#endif + #ifndef GL_VERSION_2_1 -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED @@ -523,25 +564,31 @@ extern "C" { #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#endif + +#ifndef GL_VERSION_2_1_DEPRECATED +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE 0x8C46 #define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B #endif #ifndef GL_VERSION_3_0 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D @@ -559,19 +606,9 @@ extern "C" { #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_MAX_VARYING_COMPONENTS 0x8B4B #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A @@ -613,7 +650,6 @@ extern "C" { #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 -#define GL_ALPHA_INTEGER 0x8D97 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A @@ -642,6 +678,9 @@ extern "C" { #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 /* Reuse tokens from ARB_depth_buffer_float */ /* reuse GL_DEPTH_COMPONENT32F */ /* reuse GL_DEPTH32F_STENCIL8 */ @@ -669,8 +708,6 @@ extern "C" { /* reuse GL_TEXTURE_GREEN_TYPE */ /* reuse GL_TEXTURE_BLUE_TYPE */ /* reuse GL_TEXTURE_ALPHA_TYPE */ -/* reuse GL_TEXTURE_LUMINANCE_TYPE */ -/* reuse GL_TEXTURE_INTENSITY_TYPE */ /* reuse GL_TEXTURE_DEPTH_TYPE */ /* reuse GL_UNSIGNED_NORMALIZED */ /* reuse GL_FRAMEBUFFER_BINDING */ @@ -770,6 +807,323 @@ extern "C" { /* reuse GL_VERTEX_ARRAY_BINDING */ #endif +#ifndef GL_VERSION_3_0_DEPRECATED +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +/* Reuse tokens from ARB_framebuffer_object */ +/* reuse GL_TEXTURE_LUMINANCE_TYPE */ +/* reuse GL_TEXTURE_INTENSITY_TYPE */ +#endif + +#ifndef GL_VERSION_3_1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +/* Reuse tokens from ARB_copy_buffer */ +/* reuse GL_COPY_READ_BUFFER */ +/* reuse GL_COPY_WRITE_BUFFER */ +/* Reuse tokens from ARB_draw_instanced (none) */ +/* Reuse tokens from ARB_uniform_buffer_object */ +/* reuse GL_UNIFORM_BUFFER */ +/* reuse GL_UNIFORM_BUFFER_BINDING */ +/* reuse GL_UNIFORM_BUFFER_START */ +/* reuse GL_UNIFORM_BUFFER_SIZE */ +/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ +/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ +/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ +/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ +/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ +/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ +/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ +/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ +/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ +/* reuse GL_UNIFORM_TYPE */ +/* reuse GL_UNIFORM_SIZE */ +/* reuse GL_UNIFORM_NAME_LENGTH */ +/* reuse GL_UNIFORM_BLOCK_INDEX */ +/* reuse GL_UNIFORM_OFFSET */ +/* reuse GL_UNIFORM_ARRAY_STRIDE */ +/* reuse GL_UNIFORM_MATRIX_STRIDE */ +/* reuse GL_UNIFORM_IS_ROW_MAJOR */ +/* reuse GL_UNIFORM_BLOCK_BINDING */ +/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ +/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ +/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ +/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ +/* reuse GL_INVALID_INDEX */ +#endif + +#ifndef GL_VERSION_3_2 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +/* reuse GL_MAX_VARYING_COMPONENTS */ +/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ +/* Reuse tokens from ARB_depth_clamp */ +/* reuse GL_DEPTH_CLAMP */ +/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ +/* Reuse tokens from ARB_fragment_coord_conventions (none) */ +/* Reuse tokens from ARB_provoking_vertex */ +/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ +/* reuse GL_FIRST_VERTEX_CONVENTION */ +/* reuse GL_LAST_VERTEX_CONVENTION */ +/* reuse GL_PROVOKING_VERTEX */ +/* Reuse tokens from ARB_seamless_cube_map */ +/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ +/* Reuse tokens from ARB_sync */ +/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ +/* reuse GL_OBJECT_TYPE */ +/* reuse GL_SYNC_CONDITION */ +/* reuse GL_SYNC_STATUS */ +/* reuse GL_SYNC_FLAGS */ +/* reuse GL_SYNC_FENCE */ +/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ +/* reuse GL_UNSIGNALED */ +/* reuse GL_SIGNALED */ +/* reuse GL_ALREADY_SIGNALED */ +/* reuse GL_TIMEOUT_EXPIRED */ +/* reuse GL_CONDITION_SATISFIED */ +/* reuse GL_WAIT_FAILED */ +/* reuse GL_TIMEOUT_IGNORED */ +/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ +/* reuse GL_TIMEOUT_IGNORED */ +/* Reuse tokens from ARB_texture_multisample */ +/* reuse GL_SAMPLE_POSITION */ +/* reuse GL_SAMPLE_MASK */ +/* reuse GL_SAMPLE_MASK_VALUE */ +/* reuse GL_MAX_SAMPLE_MASK_WORDS */ +/* reuse GL_TEXTURE_2D_MULTISAMPLE */ +/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ +/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ +/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_TEXTURE_SAMPLES */ +/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ +/* reuse GL_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ +/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ +/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ +/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ +/* reuse GL_MAX_INTEGER_SAMPLES */ +/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ +#endif + +#ifndef GL_VERSION_3_3 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +/* Reuse tokens from ARB_blend_func_extended */ +/* reuse GL_SRC1_COLOR */ +/* reuse GL_ONE_MINUS_SRC1_COLOR */ +/* reuse GL_ONE_MINUS_SRC1_ALPHA */ +/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ +/* Reuse tokens from ARB_explicit_attrib_location (none) */ +/* Reuse tokens from ARB_occlusion_query2 */ +/* reuse GL_ANY_SAMPLES_PASSED */ +/* Reuse tokens from ARB_sampler_objects */ +/* reuse GL_SAMPLER_BINDING */ +/* Reuse tokens from ARB_shader_bit_encoding (none) */ +/* Reuse tokens from ARB_texture_rgb10_a2ui */ +/* reuse GL_RGB10_A2UI */ +/* Reuse tokens from ARB_texture_swizzle */ +/* reuse GL_TEXTURE_SWIZZLE_R */ +/* reuse GL_TEXTURE_SWIZZLE_G */ +/* reuse GL_TEXTURE_SWIZZLE_B */ +/* reuse GL_TEXTURE_SWIZZLE_A */ +/* reuse GL_TEXTURE_SWIZZLE_RGBA */ +/* Reuse tokens from ARB_timer_query */ +/* reuse GL_TIME_ELAPSED */ +/* reuse GL_TIMESTAMP */ +/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ +/* reuse GL_INT_2_10_10_10_REV */ +#endif + +#ifndef GL_VERSION_4_0 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +/* Reuse tokens from ARB_texture_query_lod (none) */ +/* Reuse tokens from ARB_draw_buffers_blend (none) */ +/* Reuse tokens from ARB_draw_indirect */ +/* reuse GL_DRAW_INDIRECT_BUFFER */ +/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ +/* Reuse tokens from ARB_gpu_shader5 */ +/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ +/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ +/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ +/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ +/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ +/* reuse GL_MAX_VERTEX_STREAMS */ +/* Reuse tokens from ARB_gpu_shader_fp64 */ +/* reuse GL_DOUBLE_VEC2 */ +/* reuse GL_DOUBLE_VEC3 */ +/* reuse GL_DOUBLE_VEC4 */ +/* reuse GL_DOUBLE_MAT2 */ +/* reuse GL_DOUBLE_MAT3 */ +/* reuse GL_DOUBLE_MAT4 */ +/* reuse GL_DOUBLE_MAT2x3 */ +/* reuse GL_DOUBLE_MAT2x4 */ +/* reuse GL_DOUBLE_MAT3x2 */ +/* reuse GL_DOUBLE_MAT3x4 */ +/* reuse GL_DOUBLE_MAT4x2 */ +/* reuse GL_DOUBLE_MAT4x3 */ +/* Reuse tokens from ARB_shader_subroutine */ +/* reuse GL_ACTIVE_SUBROUTINES */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ +/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ +/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ +/* reuse GL_MAX_SUBROUTINES */ +/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ +/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ +/* reuse GL_COMPATIBLE_SUBROUTINES */ +/* Reuse tokens from ARB_tessellation_shader */ +/* reuse GL_PATCHES */ +/* reuse GL_PATCH_VERTICES */ +/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ +/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ +/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ +/* reuse GL_TESS_GEN_MODE */ +/* reuse GL_TESS_GEN_SPACING */ +/* reuse GL_TESS_GEN_VERTEX_ORDER */ +/* reuse GL_TESS_GEN_POINT_MODE */ +/* reuse GL_ISOLINES */ +/* reuse GL_FRACTIONAL_ODD */ +/* reuse GL_FRACTIONAL_EVEN */ +/* reuse GL_MAX_PATCH_VERTICES */ +/* reuse GL_MAX_TESS_GEN_LEVEL */ +/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ +/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ +/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ +/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ +/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ +/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ +/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ +/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ +/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ +/* reuse GL_TESS_EVALUATION_SHADER */ +/* reuse GL_TESS_CONTROL_SHADER */ +/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ +/* Reuse tokens from ARB_transform_feedback2 */ +/* reuse GL_TRANSFORM_FEEDBACK */ +/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ +/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ +/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ +/* Reuse tokens from ARB_transform_feedback3 */ +/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ +/* reuse GL_MAX_VERTEX_STREAMS */ +#endif + +#ifndef GL_VERSION_4_1 +/* Reuse tokens from ARB_ES2_compatibility */ +/* reuse GL_FIXED */ +/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ +/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ +/* reuse GL_LOW_FLOAT */ +/* reuse GL_MEDIUM_FLOAT */ +/* reuse GL_HIGH_FLOAT */ +/* reuse GL_LOW_INT */ +/* reuse GL_MEDIUM_INT */ +/* reuse GL_HIGH_INT */ +/* reuse GL_SHADER_COMPILER */ +/* reuse GL_NUM_SHADER_BINARY_FORMATS */ +/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ +/* reuse GL_MAX_VARYING_VECTORS */ +/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ +/* Reuse tokens from ARB_get_program_binary */ +/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ +/* reuse GL_PROGRAM_BINARY_LENGTH */ +/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ +/* reuse GL_PROGRAM_BINARY_FORMATS */ +/* Reuse tokens from ARB_separate_shader_objects */ +/* reuse GL_VERTEX_SHADER_BIT */ +/* reuse GL_FRAGMENT_SHADER_BIT */ +/* reuse GL_GEOMETRY_SHADER_BIT */ +/* reuse GL_TESS_CONTROL_SHADER_BIT */ +/* reuse GL_TESS_EVALUATION_SHADER_BIT */ +/* reuse GL_ALL_SHADER_BITS */ +/* reuse GL_PROGRAM_SEPARABLE */ +/* reuse GL_ACTIVE_PROGRAM */ +/* reuse GL_PROGRAM_PIPELINE_BINDING */ +/* Reuse tokens from ARB_shader_precision (none) */ +/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ +/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ +/* reuse GL_MAX_VIEWPORTS */ +/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ +/* reuse GL_VIEWPORT_BOUNDS_RANGE */ +/* reuse GL_LAYER_PROVOKING_VERTEX */ +/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ +/* reuse GL_UNDEFINED_VERTEX */ +#endif + #ifndef GL_ARB_multitexture #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 @@ -1287,12 +1641,17 @@ extern "C" { #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_INDEX 0x8222 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING #define GL_RENDERBUFFER_BINDING 0x8CA7 @@ -1349,6 +1708,12 @@ extern "C" { #define GL_MAX_SAMPLES 0x8D57 #endif +#ifndef GL_ARB_framebuffer_object_DEPRECATED +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#endif + #ifndef GL_ARB_framebuffer_sRGB #define GL_FRAMEBUFFER_SRGB 0x8DB9 #endif @@ -1381,6 +1746,7 @@ extern "C" { #endif #ifndef GL_ARB_instanced_arrays +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE #endif #ifndef GL_ARB_map_buffer_range @@ -1436,6 +1802,421 @@ extern "C" { #define GL_VERTEX_ARRAY_BINDING 0x85B5 #endif +#ifndef GL_ARB_uniform_buffer_object +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +#endif + +#ifndef GL_ARB_compatibility +/* ARB_compatibility just defines tokens from core 3.0 */ +#endif + +#ifndef GL_ARB_copy_buffer +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#endif + +#ifndef GL_ARB_shader_texture_lod +#endif + +#ifndef GL_ARB_depth_clamp +#define GL_DEPTH_CLAMP 0x864F +#endif + +#ifndef GL_ARB_draw_elements_base_vertex +#endif + +#ifndef GL_ARB_fragment_coord_conventions +#endif + +#ifndef GL_ARB_provoking_vertex +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#endif + +#ifndef GL_ARB_seamless_cube_map +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#endif + +#ifndef GL_ARB_sync +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#endif + +#ifndef GL_ARB_texture_multisample +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#endif + +#ifndef GL_ARB_vertex_array_bgra +/* reuse GL_BGRA */ +#endif + +#ifndef GL_ARB_draw_buffers_blend +#endif + +#ifndef GL_ARB_sample_shading +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +#endif + +#ifndef GL_ARB_texture_cube_map_array +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif + +#ifndef GL_ARB_texture_gather +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#endif + +#ifndef GL_ARB_texture_query_lod +#endif + +#ifndef GL_ARB_shading_language_include +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +#endif + +#ifndef GL_ARB_texture_compression_bptc +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif + +#ifndef GL_ARB_blend_func_extended +#define GL_SRC1_COLOR 0x88F9 +/* reuse GL_SRC1_ALPHA */ +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#endif + +#ifndef GL_ARB_explicit_attrib_location +#endif + +#ifndef GL_ARB_occlusion_query2 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#endif + +#ifndef GL_ARB_sampler_objects +#define GL_SAMPLER_BINDING 0x8919 +#endif + +#ifndef GL_ARB_shader_bit_encoding +#endif + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_RGB10_A2UI 0x906F +#endif + +#ifndef GL_ARB_texture_swizzle +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#endif + +#ifndef GL_ARB_timer_query +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#endif + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ +#define GL_INT_2_10_10_10_REV 0x8D9F +#endif + +#ifndef GL_ARB_draw_indirect +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#endif + +#ifndef GL_ARB_gpu_shader5 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +/* reuse GL_MAX_VERTEX_STREAMS */ +#endif + +#ifndef GL_ARB_gpu_shader_fp64 +/* reuse GL_DOUBLE */ +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#endif + +#ifndef GL_ARB_shader_subroutine +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +/* reuse GL_UNIFORM_SIZE */ +/* reuse GL_UNIFORM_NAME_LENGTH */ +#endif + +#ifndef GL_ARB_tessellation_shader +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +/* reuse GL_TRIANGLES */ +/* reuse GL_QUADS */ +#define GL_ISOLINES 0x8E7A +/* reuse GL_EQUAL */ +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +/* reuse GL_CCW */ +/* reuse GL_CW */ +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#endif + +#ifndef GL_ARB_texture_buffer_object_rgb32 +/* reuse GL_RGB32F */ +/* reuse GL_RGB32UI */ +/* reuse GL_RGB32I */ +#endif + +#ifndef GL_ARB_transform_feedback2 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#endif + +#ifndef GL_ARB_transform_feedback3 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#endif + +#ifndef GL_ARB_ES2_compatibility +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#endif + +#ifndef GL_ARB_get_program_binary +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#endif + +#ifndef GL_ARB_separate_shader_objects +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#endif + +#ifndef GL_ARB_shader_precision +#endif + +#ifndef GL_ARB_vertex_attrib_64bit +/* reuse GL_RGB32I */ +/* reuse GL_DOUBLE_VEC2 */ +/* reuse GL_DOUBLE_VEC3 */ +/* reuse GL_DOUBLE_VEC4 */ +/* reuse GL_DOUBLE_MAT2 */ +/* reuse GL_DOUBLE_MAT3 */ +/* reuse GL_DOUBLE_MAT4 */ +/* reuse GL_DOUBLE_MAT2x3 */ +/* reuse GL_DOUBLE_MAT2x4 */ +/* reuse GL_DOUBLE_MAT3x2 */ +/* reuse GL_DOUBLE_MAT3x4 */ +/* reuse GL_DOUBLE_MAT4x2 */ +/* reuse GL_DOUBLE_MAT4x3 */ +#endif + +#ifndef GL_ARB_viewport_array +/* reuse GL_SCISSOR_BOX */ +/* reuse GL_VIEWPORT */ +/* reuse GL_DEPTH_RANGE */ +/* reuse GL_SCISSOR_TEST */ +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +/* reuse GL_FIRST_VERTEX_CONVENTION */ +/* reuse GL_LAST_VERTEX_CONVENTION */ +/* reuse GL_PROVOKING_VERTEX */ +#endif + +#ifndef GL_ARB_cl_event +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +#endif + +#ifndef GL_ARB_debug_output +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +#endif + +#ifndef GL_ARB_robustness +/* reuse GL_NO_ERROR */ +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +#endif + +#ifndef GL_ARB_shader_stencil_export +#endif + #ifndef GL_EXT_abgr #define GL_ABGR_EXT 0x8000 #endif @@ -3257,9 +4038,9 @@ extern "C" { #endif #ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E #endif #ifndef GL_APPLE_fence @@ -3276,6 +4057,7 @@ extern "C" { #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF #endif @@ -3421,7 +4203,7 @@ extern "C" { #endif #ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D #endif @@ -3780,6 +4562,12 @@ extern "C" { #define GL_SEPARATE_ATTRIBS_NV 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 #endif #ifndef GL_EXT_bindable_uniform @@ -3902,11 +4690,11 @@ extern "C" { #define GL_SAMPLE_MASK_VALUE_NV 0x8E52 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 #endif #ifndef GL_NV_transform_feedback2 @@ -3916,34 +4704,440 @@ extern "C" { #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 #endif +#ifndef GL_ATI_meminfo +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif + +#ifndef GL_AMD_performance_monitor +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +#endif + +#ifndef GL_AMD_texture_texture4 +#endif + +#ifndef GL_AMD_vertex_shader_tesselator +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +#endif + +#ifndef GL_EXT_provoking_vertex +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +#endif + +#ifndef GL_EXT_texture_snorm +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +/* reuse GL_RED_SNORM */ +/* reuse GL_RG_SNORM */ +/* reuse GL_RGB_SNORM */ +/* reuse GL_RGBA_SNORM */ +/* reuse GL_R8_SNORM */ +/* reuse GL_RG8_SNORM */ +/* reuse GL_RGB8_SNORM */ +/* reuse GL_RGBA8_SNORM */ +/* reuse GL_R16_SNORM */ +/* reuse GL_RG16_SNORM */ +/* reuse GL_RGB16_SNORM */ +/* reuse GL_RGBA16_SNORM */ +/* reuse GL_SIGNED_NORMALIZED */ +#endif + +#ifndef GL_AMD_draw_buffers_blend +#endif + +#ifndef GL_APPLE_texture_range +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +/* reuse GL_STORAGE_CACHED_APPLE */ +/* reuse GL_STORAGE_SHARED_APPLE */ +#endif + +#ifndef GL_APPLE_float_pixels +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +#endif + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif + +#ifndef GL_APPLE_object_purgeable +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +#endif + +#ifndef GL_APPLE_row_bytes +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif + +#ifndef GL_APPLE_rgb_422 +#define GL_RGB_422_APPLE 0x8A1F +/* reuse GL_UNSIGNED_SHORT_8_8_APPLE */ +/* reuse GL_UNSIGNED_SHORT_8_8_REV_APPLE */ +#endif + +#ifndef GL_NV_video_capture +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +#endif + +#ifndef GL_NV_copy_image +#endif + +#ifndef GL_EXT_separate_shader_objects +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +#endif + +#ifndef GL_NV_parameter_buffer_object2 +#endif + +#ifndef GL_NV_shader_buffer_load +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +#endif + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +#endif + +#ifndef GL_NV_texture_barrier +#endif + +#ifndef GL_AMD_shader_stencil_export +#endif + +#ifndef GL_AMD_seamless_cubemap_per_texture +/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */ +#endif + +#ifndef GL_AMD_conservative_depth +#endif + +#ifndef GL_EXT_shader_image_load_store +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +#endif + +#ifndef GL_EXT_vertex_attrib_64bit +/* reuse GL_DOUBLE */ +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#endif + +#ifndef GL_NV_gpu_program5 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +#endif + +#ifndef GL_NV_gpu_shader5 +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +/* reuse GL_PATCHES */ +#endif + +#ifndef GL_NV_shader_buffer_store +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +/* reuse GL_READ_WRITE */ +/* reuse GL_WRITE_ONLY */ +#endif + +#ifndef GL_NV_tessellation_program5 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif + +#ifndef GL_NV_vertex_attrib_integer_64bit +/* reuse GL_INT64_NV */ +/* reuse GL_UNSIGNED_INT64_NV */ +#endif + +#ifndef GL_NV_multisample_coverage +#define GL_COVERAGE_SAMPLES_NV 0x80A9 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#endif + +#ifndef GL_AMD_name_gen_delete +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +#endif + +#ifndef GL_AMD_debug_output +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +#endif + +#ifndef GL_NV_vdpau_interop +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +#endif + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#endif + /*************************************************************/ #include #ifndef GL_VERSION_2_0 /* GL type for program/shader text */ -typedef char GLchar; /* native character */ +typedef char GLchar; #endif #ifndef GL_VERSION_1_5 /* GL types for handling large vertex buffer objects */ +#if defined(__APPLE__) +typedef long GLintptr; +typedef long GLsizeiptr; +#else typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; #endif +#endif #ifndef GL_ARB_vertex_buffer_object /* GL types for handling large vertex buffer objects */ +#if defined(__APPLE__) +typedef long GLintptrARB; +typedef long GLsizeiptrARB; +#else typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; #endif - -#ifndef GL_ARB_shader_objects -/* GL types for handling shader object handles and program/shader text */ -typedef char GLcharARB; /* native character */ -typedef unsigned int GLhandleARB; /* shader object handle */ #endif -/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_shader_objects +/* GL types for program/shader text and shader object handles */ +typedef char GLcharARB; +#if defined(__APPLE__) +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +#endif + +/* GL type for "half" precision (s10e5) float data in host memory */ #ifndef GL_ARB_half_float_pixel typedef unsigned short GLhalfARB; #endif @@ -3985,7 +5179,8 @@ typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else -#include /* Fallback option */ +/* Fallback if nothing above works */ +#include #endif #endif @@ -3994,51 +5189,84 @@ typedef int64_t GLint64EXT; typedef uint64_t GLuint64EXT; #endif +#ifndef GL_ARB_sync +typedef int64_t GLint64; +typedef uint64_t GLuint64; +typedef struct __GLsync *GLsync; +#endif + +#ifndef GL_ARB_cl_event +/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ +struct _cl_context; +struct _cl_event; +#endif + +#ifndef GL_ARB_debug_output +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); +#endif + +#ifndef GL_AMD_debug_output +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); +#endif + +#ifndef GL_NV_vdpau_interop +typedef GLintptr GLvdpauSurfaceNV; +#endif + #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -GLAPI void APIENTRY glBlendEquation (GLenum); -GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogram (GLenum); -GLAPI void APIENTRY glResetMinmax (GLenum); -GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_2_DEPRECATED +#define GL_VERSION_1_2_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); @@ -4071,62 +5299,73 @@ typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenu typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum); -GLAPI void APIENTRY glClientActiveTexture (GLenum); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_3_DEPRECATED +#define GL_VERSION_1_3_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); @@ -4164,77 +5403,75 @@ typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); #endif #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glFogCoordf (GLfloat); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *); -GLAPI void APIENTRY glFogCoordd (GLdouble); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); -GLAPI void APIENTRY glPointParameteri (GLenum, GLint); -GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); -GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos2i (GLint, GLint); -GLAPI void APIENTRY glWindowPos2iv (const GLint *); -GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *); -GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3iv (const GLint *); -GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_VERSION_1_4_DEPRECATED +#define GL_VERSION_1_4_DEPRECATED 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); @@ -4273,25 +5510,25 @@ typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQuery (GLuint); -GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); -GLAPI void APIENTRY glEndQuery (GLenum); -GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); -GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint); -GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); @@ -4317,104 +5554,104 @@ typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); -GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); -GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); -GLAPI void APIENTRY glAttachShader (GLuint, GLuint); -GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); -GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum); -GLAPI void APIENTRY glDeleteProgram (GLuint); -GLAPI void APIENTRY glDeleteShader (GLuint); -GLAPI void APIENTRY glDetachShader (GLuint, GLuint); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); -GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgram (GLuint); -GLAPI GLboolean APIENTRY glIsShader (GLuint); -GLAPI void APIENTRY glLinkProgram (GLuint); -GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); -GLAPI void APIENTRY glUseProgram (GLuint); -GLAPI void APIENTRY glUniform1f (GLint, GLfloat); -GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1i (GLint, GLint); -GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glValidateProgram (GLuint); -GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); @@ -4509,12 +5746,12 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); @@ -4531,64 +5768,64 @@ typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei co /* ARB_map_buffer_range */ /* ARB_vertex_array_object */ #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); -GLAPI void APIENTRY glGetBooleani_v (GLenum, GLuint, GLboolean *); -GLAPI void APIENTRY glGetIntegeri_v (GLenum, GLuint, GLint *); -GLAPI void APIENTRY glEnablei (GLenum, GLuint); -GLAPI void APIENTRY glDisablei (GLenum, GLuint); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum, GLuint); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum); +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); -GLAPI void APIENTRY glBindBufferBase (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint, GLsizei, const GLint *, GLenum); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint, GLuint, GLint *); -GLAPI void APIENTRY glClampColor (GLenum, GLenum); -GLAPI void APIENTRY glBeginConditionalRender (GLuint, GLenum); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribI1i (GLuint, GLint); -GLAPI void APIENTRY glVertexAttribI2i (GLuint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI3i (GLuint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI4i (GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint, GLenum, GLuint *); -GLAPI void APIENTRY glGetUniformuiv (GLuint, GLint, GLuint *); -GLAPI void APIENTRY glBindFragDataLocation (GLuint, GLuint, const GLchar *); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glUniform1ui (GLint, GLuint); -GLAPI void APIENTRY glUniform2ui (GLint, GLuint, GLuint); -GLAPI void APIENTRY glUniform3ui (GLint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glUniform4ui (GLint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glUniform1uiv (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform2uiv (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform3uiv (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform4uiv (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glTexParameterIiv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glTexParameterIuiv (GLenum, GLenum, const GLuint *); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum, GLenum, GLuint *); -GLAPI void APIENTRY glClearBufferiv (GLenum, GLint, const GLint *); -GLAPI void APIENTRY glClearBufferuiv (GLenum, GLint, const GLuint *); -GLAPI void APIENTRY glClearBufferfv (GLenum, GLint, const GLfloat *); -GLAPI void APIENTRY glClearBufferfi (GLenum, GLint, GLfloat, GLint); -GLAPI const GLubyte * APIENTRY glGetStringi (GLenum, GLuint); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); @@ -4600,11 +5837,14 @@ typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); @@ -4625,9 +5865,6 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte * typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); @@ -4650,43 +5887,134 @@ typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); #endif +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +/* OpenGL 3.1 also reuses entry points from these extensions: */ +/* ARB_copy_buffer */ +/* ARB_uniform_buffer_object */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +#endif + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +/* OpenGL 3.2 also reuses entry points from these extensions: */ +/* ARB_draw_elements_base_vertex */ +/* ARB_provoking_vertex */ +/* ARB_sync */ +/* ARB_texture_multisample */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +/* OpenGL 3.3 also reuses entry points from these extensions: */ +/* ARB_blend_func_extended */ +/* ARB_sampler_objects */ +/* ARB_explicit_attrib_location, but it has none */ +/* ARB_occlusion_query2 (no entry points) */ +/* ARB_shader_bit_encoding (no entry points) */ +/* ARB_texture_rgb10_a2ui (no entry points) */ +/* ARB_texture_swizzle (no entry points) */ +/* ARB_timer_query */ +/* ARB_vertex_type_2_10_10_10_rev */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +#endif + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +/* OpenGL 4.0 also reuses entry points from these extensions: */ +/* ARB_texture_query_lod (no entry points) */ +/* ARB_draw_indirect */ +/* ARB_gpu_shader5 (no entry points) */ +/* ARB_gpu_shader_fp64 */ +/* ARB_shader_subroutine */ +/* ARB_tessellation_shader */ +/* ARB_texture_buffer_object_rgb32 (no entry points) */ +/* ARB_texture_cube_map_array (no entry points) */ +/* ARB_texture_gather (no entry points) */ +/* ARB_transform_feedback2 */ +/* ARB_transform_feedback3 */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLclampf value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLclampf value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +/* OpenGL 4.1 also reuses entry points from these extensions: */ +/* ARB_ES2_compatibility */ +/* ARB_get_program_binary */ +/* ARB_separate_shader_objects */ +/* ARB_shader_precision (no entry points) */ +/* ARB_vertex_attrib_64bit */ +/* ARB_viewport_array */ +#endif + #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); @@ -4727,10 +6055,10 @@ typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLsh #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); @@ -4741,7 +6069,7 @@ typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +GLAPI void APIENTRY glSampleCoverageARB (GLclampf value, GLboolean invert); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); #endif @@ -4757,13 +6085,13 @@ typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean i #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); @@ -4781,8 +6109,8 @@ typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); @@ -4791,16 +6119,16 @@ typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLflo #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); -GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); -GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); -GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); -GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); -GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexBlendARB (GLint); +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); @@ -4817,11 +6145,11 @@ typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); @@ -4861,22 +6189,22 @@ typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); @@ -4899,68 +6227,68 @@ typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); @@ -5034,17 +6362,17 @@ typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); -GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); @@ -5062,14 +6390,14 @@ typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pn #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); -GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); -GLAPI void APIENTRY glEndQueryARB (GLenum); -GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); @@ -5084,45 +6412,45 @@ typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); -GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); -GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1iARB (GLint, GLint); -GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); @@ -5168,9 +6496,9 @@ typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei m #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); @@ -5200,7 +6528,7 @@ typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); #endif @@ -5212,7 +6540,7 @@ typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs) #ifndef GL_ARB_color_buffer_float #define GL_ARB_color_buffer_float 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #endif @@ -5236,8 +6564,8 @@ typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #ifndef GL_ARB_draw_instanced #define GL_ARB_draw_instanced 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum, GLsizei, GLenum, const GLvoid *, GLsizei); +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); @@ -5246,26 +6574,26 @@ typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint); -GLAPI void APIENTRY glBindRenderbuffer (GLenum, GLuint); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei, GLuint *); -GLAPI void APIENTRY glRenderbufferStorage (GLenum, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum, GLenum, GLint *); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint); -GLAPI void APIENTRY glBindFramebuffer (GLenum, GLuint); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFramebuffers (GLsizei, GLuint *); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGenerateMipmap (GLenum); -GLAPI void APIENTRY glBlitFramebuffer (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum, GLsizei, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum, GLenum, GLuint, GLint, GLint); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); @@ -5296,10 +6624,10 @@ typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum #ifndef GL_ARB_geometry_shader4 #define GL_ARB_geometry_shader4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint, GLenum, GLint); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum, GLenum, GLuint, GLint, GLenum); +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); @@ -5314,25 +6642,25 @@ typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLen #ifndef GL_ARB_instanced_arrays #define GL_ARB_instanced_arrays 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisor (GLuint, GLuint); +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); #endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); #endif #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapBufferRange (GLenum, GLintptr, GLsizeiptr, GLbitfield); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum, GLintptr, GLsizeiptr); +GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); #endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); #endif #ifndef GL_ARB_texture_buffer_object #define GL_ARB_texture_buffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum, GLenum, GLuint); +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); #endif @@ -5348,10 +6676,10 @@ typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalfo #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArray (GLuint); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenVertexArrays (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); @@ -5359,6 +6687,728 @@ typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); #endif +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex); +#endif + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +#endif + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +#endif + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +#endif + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLclampf value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); +#endif + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#endif + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#endif + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#endif + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +#endif + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +#endif + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +#endif + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); +#endif + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +#endif + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +#endif + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +#endif + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +#endif + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLclampf n, GLclampf f); +GLAPI void APIENTRY glClearDepthf (GLclampf d); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLclampf d); +#endif + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +#endif + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* *strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* *strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +#endif + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +#endif + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLclampd *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLclampd n, GLclampd f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#endif + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); +#endif + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +#endif + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif + #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #endif @@ -5366,7 +7416,7 @@ typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #endif @@ -5374,7 +7424,7 @@ typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, G #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #endif @@ -5386,8 +7436,8 @@ typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); @@ -5396,8 +7446,8 @@ typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); @@ -5406,8 +7456,8 @@ typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filte #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); @@ -5416,11 +7466,11 @@ typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); @@ -5432,16 +7482,16 @@ typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint lev #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogramEXT (GLenum); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); @@ -5458,19 +7508,19 @@ typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); @@ -5494,13 +7544,13 @@ typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum in #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); @@ -5514,7 +7564,7 @@ typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GL #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #endif @@ -5522,12 +7572,12 @@ typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); @@ -5540,8 +7590,8 @@ typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, G #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); @@ -5558,12 +7608,12 @@ typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); @@ -5576,8 +7626,8 @@ typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); @@ -5586,8 +7636,8 @@ typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat * #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); @@ -5604,8 +7654,8 @@ typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); @@ -5618,15 +7668,15 @@ typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint); -GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, GLvoid* *params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); @@ -5666,7 +7716,7 @@ typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLs #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum); +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #endif @@ -5694,10 +7744,10 @@ typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); @@ -5712,8 +7762,8 @@ typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLi #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); @@ -5722,8 +7772,8 @@ typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLflo #ifndef GL_SGIS_point_parameters #define GL_SGIS_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); @@ -5733,11 +7783,11 @@ typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfl #define GL_SGIX_instruments 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); @@ -5754,7 +7804,7 @@ typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint); +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #endif @@ -5770,10 +7820,10 @@ typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #ifndef GL_SGIX_polynomial_ffd #define GL_SGIX_polynomial_ffd 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -GLAPI void APIENTRY glDeformSGIX (GLbitfield); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); @@ -5784,7 +7834,7 @@ typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mas #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #endif @@ -5804,8 +7854,8 @@ typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); @@ -5818,12 +7868,12 @@ typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); @@ -5844,8 +7894,8 @@ typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); @@ -5858,7 +7908,7 @@ typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei s #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum, GLint); +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); #endif @@ -5866,10 +7916,10 @@ typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); @@ -5884,12 +7934,12 @@ typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GL #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); @@ -5922,7 +7972,7 @@ typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #endif @@ -5930,7 +7980,7 @@ typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); #endif @@ -5942,7 +7992,7 @@ typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); GLAPI void APIENTRY glUnlockArraysEXT (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); @@ -5952,8 +8002,8 @@ typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); @@ -5966,24 +8016,24 @@ typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *par #ifndef GL_SGIX_fragment_lighting #define GL_SGIX_fragment_lighting 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); @@ -6016,7 +8066,7 @@ typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); #endif @@ -6032,9 +8082,9 @@ typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint star #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum); -GLAPI void APIENTRY glTextureLightEXT (GLenum); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); @@ -6052,12 +8102,12 @@ typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #ifndef GL_SGIX_async #define GL_SGIX_async 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); @@ -6078,10 +8128,10 @@ typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); @@ -6096,10 +8146,10 @@ typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); @@ -6122,23 +8172,23 @@ typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, G #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); @@ -6162,7 +8212,7 @@ typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum t #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum); +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #endif @@ -6170,21 +8220,21 @@ typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); #endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); #endif #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); @@ -6200,28 +8250,28 @@ typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei strid #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); -GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); -GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); -GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *); -GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); -GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); -GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); -GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); @@ -6274,14 +8324,14 @@ typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); @@ -6296,13 +8346,13 @@ typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); @@ -6316,46 +8366,46 @@ typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsize #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); @@ -6402,7 +8452,7 @@ typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FV #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif @@ -6410,7 +8460,7 @@ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenu #ifndef GL_INGR_blend_func_separate #define GL_INGR_blend_func_separate 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif @@ -6454,9 +8504,9 @@ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLen #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); @@ -6471,7 +8521,7 @@ typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum t #define GL_NV_vertex_array_range 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const GLvoid *pointer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); @@ -6480,19 +8530,19 @@ typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvo #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); @@ -6536,30 +8586,30 @@ typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); @@ -6594,8 +8644,8 @@ typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); @@ -6604,14 +8654,14 @@ typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); @@ -6650,7 +8700,7 @@ typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #endif @@ -6658,8 +8708,8 @@ typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternEXT (GLenum); +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); @@ -6684,7 +8734,7 @@ typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #ifndef GL_SGIS_texture_color_mask #define GL_SGIS_texture_color_mask 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif @@ -6692,7 +8742,7 @@ typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean #ifndef GL_SGIX_igloo_interface #define GL_SGIX_igloo_interface 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const GLvoid *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); #endif @@ -6708,13 +8758,13 @@ typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid #ifndef GL_NV_fence #define GL_NV_fence 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); -GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFinishFenceNV (GLuint); -GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); @@ -6728,15 +8778,15 @@ typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); -GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); @@ -6756,8 +8806,8 @@ typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); @@ -6786,70 +8836,70 @@ typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, G #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); -GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); @@ -6944,10 +8994,10 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei cou #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); @@ -6958,20 +9008,20 @@ typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloa #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); GLAPI void APIENTRY glBeginFragmentShaderATI (void); GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); @@ -6992,8 +9042,8 @@ typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, cons #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); @@ -7002,18 +9052,18 @@ typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); -GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); @@ -7034,46 +9084,46 @@ typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginVertexShaderEXT (void); GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); -GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); -GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); -GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); -GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); -GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); -GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); -GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); @@ -7122,51 +9172,51 @@ typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum v #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); -GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); -GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); @@ -7218,9 +9268,9 @@ typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat para #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +GLAPI void APIENTRY glElementPointerATI (GLenum type, const GLvoid *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); @@ -7230,7 +9280,7 @@ typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif @@ -7250,13 +9300,13 @@ typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, G #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); @@ -7270,8 +9320,8 @@ typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pnam #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); @@ -7292,7 +9342,7 @@ typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #endif @@ -7308,11 +9358,11 @@ typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const GLvoid *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); @@ -7324,14 +9374,14 @@ typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); @@ -7346,10 +9396,10 @@ typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); @@ -7360,9 +9410,9 @@ typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); @@ -7380,7 +9430,7 @@ typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLin #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); #endif @@ -7408,12 +9458,12 @@ typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs) #define GL_NV_fragment_program 1 /* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); @@ -7426,52 +9476,52 @@ typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsiz #ifndef GL_NV_half_float #define GL_NV_half_float 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); @@ -7524,8 +9574,8 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, c #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, GLvoid *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); @@ -7535,7 +9585,7 @@ typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); #define GL_NV_primitive_restart 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); @@ -7552,8 +9602,8 @@ typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); @@ -7562,8 +9612,8 @@ typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); @@ -7572,9 +9622,9 @@ typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLen #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); @@ -7588,7 +9638,7 @@ typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #endif @@ -7600,7 +9650,7 @@ typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #endif @@ -7636,23 +9686,23 @@ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLen #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); @@ -7676,7 +9726,7 @@ typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const GLvoid *string); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); #endif @@ -7688,7 +9738,7 @@ typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid #ifndef GL_EXT_stencil_clear_tag #define GL_EXT_stencil_clear_tag 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilClearTagEXT (GLsizei, GLuint); +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); #endif @@ -7700,7 +9750,7 @@ typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GL #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlitFramebufferEXT (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #endif @@ -7708,7 +9758,7 @@ typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #endif @@ -7720,8 +9770,8 @@ typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum targ #ifndef GL_EXT_timer_query #define GL_EXT_timer_query 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint, GLenum, GLint64EXT *); -GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint, GLenum, GLuint64EXT *); +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); @@ -7730,8 +9780,8 @@ typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pnam #ifndef GL_EXT_gpu_program_parameters #define GL_EXT_gpu_program_parameters 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum, GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum, GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); @@ -7740,8 +9790,8 @@ typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, G #ifndef GL_APPLE_flush_buffer_range #define GL_APPLE_flush_buffer_range 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum, GLintptr, GLsizeiptr); +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); @@ -7750,22 +9800,22 @@ typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GL #ifndef GL_NV_gpu_program4 #define GL_NV_gpu_program4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum, GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum, GLuint, const GLint *); -GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum, GLuint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum, GLuint, const GLuint *); -GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum, GLuint, GLsizei, const GLuint *); -GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum, GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum, GLuint, const GLint *); -GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum, GLuint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum, GLuint, const GLuint *); -GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum, GLuint, GLsizei, const GLuint *); -GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum, GLuint, GLint *); -GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum, GLuint, GLuint *); -GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum, GLuint, GLint *); -GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum, GLuint, GLuint *); +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); @@ -7788,10 +9838,10 @@ typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, G #ifndef GL_NV_geometry_program4 #define GL_NV_geometry_program4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramVertexLimitNV (GLenum, GLint); -GLAPI void APIENTRY glFramebufferTextureEXT (GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum, GLenum, GLuint, GLint, GLenum); +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); @@ -7802,7 +9852,7 @@ typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLen #ifndef GL_EXT_geometry_shader4 #define GL_EXT_geometry_shader4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriEXT (GLuint, GLenum, GLint); +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); #endif @@ -7810,29 +9860,29 @@ typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum p #ifndef GL_NV_vertex_program4 #define GL_NV_vertex_program4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint, GLint); -GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); @@ -7862,17 +9912,17 @@ typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum p #ifndef GL_EXT_gpu_shader4 #define GL_EXT_gpu_shader4 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformuivEXT (GLuint, GLint, GLuint *); -GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint, GLuint, const GLchar *); -GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint, const GLchar *); -GLAPI void APIENTRY glUniform1uiEXT (GLint, GLuint); -GLAPI void APIENTRY glUniform2uiEXT (GLint, GLuint, GLuint); -GLAPI void APIENTRY glUniform3uiEXT (GLint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glUniform4uiEXT (GLint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glUniform1uivEXT (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform2uivEXT (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform3uivEXT (GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glUniform4uivEXT (GLint, GLsizei, const GLuint *); +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); @@ -7890,8 +9940,8 @@ typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, #ifndef GL_EXT_draw_instanced #define GL_EXT_draw_instanced 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum, GLsizei, GLenum, const GLvoid *, GLsizei); +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); @@ -7908,7 +9958,7 @@ typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei #ifndef GL_EXT_texture_buffer_object #define GL_EXT_texture_buffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferEXT (GLenum, GLenum, GLuint); +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); #endif @@ -7928,9 +9978,9 @@ typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalfo #ifndef GL_NV_depth_buffer_float #define GL_NV_depth_buffer_float 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangedNV (GLdouble, GLdouble); -GLAPI void APIENTRY glClearDepthdNV (GLdouble); -GLAPI void APIENTRY glDepthBoundsdNV (GLdouble, GLdouble); +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); @@ -7944,7 +9994,7 @@ typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); #ifndef GL_NV_framebuffer_multisample_coverage #define GL_NV_framebuffer_multisample_coverage 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum, GLsizei, GLsizei, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #endif @@ -7960,9 +10010,9 @@ typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLen #ifndef GL_NV_parameter_buffer_object #define GL_NV_parameter_buffer_object 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum, GLuint, GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum, GLuint, GLuint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum, GLuint, GLuint, GLsizei, const GLuint *); +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); @@ -7972,12 +10022,12 @@ typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, #ifndef GL_EXT_draw_buffers2 #define GL_EXT_draw_buffers2 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum, GLuint, GLboolean *); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum, GLuint, GLint *); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum, GLuint); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum, GLuint); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum, GLuint); +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); @@ -7990,17 +10040,18 @@ typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuin #ifndef GL_NV_transform_feedback #define GL_NV_transform_feedback 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum); +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedbackNV (void); -GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint, const GLint *, GLenum); -GLAPI void APIENTRY glBindBufferRangeNV (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); -GLAPI void APIENTRY glBindBufferOffsetNV (GLenum, GLuint, GLuint, GLintptr); -GLAPI void APIENTRY glBindBufferBaseNV (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint, GLsizei, const GLint *, GLenum); -GLAPI void APIENTRY glActiveVaryingNV (GLuint, const GLchar *); -GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint, const GLchar *); -GLAPI void APIENTRY glGetActiveVaryingNV (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint, GLuint, GLint *); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); @@ -8013,14 +10064,15 @@ typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); #endif #ifndef GL_EXT_bindable_uniform #define GL_EXT_bindable_uniform 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformBufferEXT (GLuint, GLint, GLuint); -GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint, GLint); -GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint, GLint); +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); @@ -8030,12 +10082,12 @@ typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint #ifndef GL_EXT_texture_integer #define GL_EXT_texture_integer 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexParameterIivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glTexParameterIuivEXT (GLenum, GLenum, const GLuint *); -GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum, GLenum, GLuint *); -GLAPI void APIENTRY glClearColorIiEXT (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glClearColorIuiEXT (GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); @@ -8056,7 +10108,7 @@ typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint, GLenum); +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); GLAPI void APIENTRY glEndConditionalRenderNV (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); @@ -8065,217 +10117,251 @@ typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); #ifndef GL_NV_present_video #define GL_NV_present_video 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); #endif #ifndef GL_EXT_transform_feedback #define GL_EXT_transform_feedback 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum); +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedbackEXT (void); -GLAPI void APIENTRY glBindBufferRangeEXT (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); -GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum, GLuint, GLuint, GLintptr); -GLAPI void APIENTRY glBindBufferBaseEXT (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint, GLsizei, const GLint *, GLenum); -GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint, GLuint, GLint *); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #endif #ifndef GL_EXT_direct_state_access #define GL_EXT_direct_state_access 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield); -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum, const GLfloat *); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum, const GLdouble *); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum, const GLfloat *); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum, const GLdouble *); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMatrixPopEXT (GLenum); -GLAPI void APIENTRY glMatrixPushEXT (GLenum); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum, const GLfloat *); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum, const GLdouble *); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum, const GLfloat *); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum, const GLdouble *); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint, GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint, GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint, GLenum, GLenum, GLint); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint, GLenum, GLint, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint, GLenum, GLint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint, GLenum, GLint, GLenum, GLint *); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum, GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum, GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum, GLenum, GLenum, GLint); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum, GLenum, GLint, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum, GLenum, GLint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum, GLenum, GLint, GLenum, GLint *); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum, GLenum, GLuint); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum, GLuint); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum, GLuint); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum, GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum, GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum, GLenum, GLenum, GLint); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum, GLenum, GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum, GLenum, GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum, GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum, GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum, GLenum, GLenum, GLint); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum, GLenum, GLenum, GLdouble *); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum, GLuint, GLvoid* *); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint, GLenum, GLint, GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum, GLenum, GLint, GLvoid *); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint, GLenum, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint, GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint, GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint, GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint, GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint, GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint, GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint, GLenum, GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint, GLenum, GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint, GLenum, GLuint, const GLint *); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint, GLenum, GLuint, GLsizei, const GLint *); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint, GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint, GLenum, GLuint, const GLuint *); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint, GLenum, GLuint, GLsizei, const GLuint *); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint, GLenum, GLuint, GLint *); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint, GLenum, GLuint, GLuint *); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint, GLenum, GLenum, const GLuint *); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint, GLenum, GLenum, GLuint *); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum, GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum, GLenum, GLenum, const GLuint *); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum, GLenum, GLenum, GLuint *); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint, GLint, GLfloat); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint, GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint, GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint, GLint, GLint); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint, GLint, GLint, GLint); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint, GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint, GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint, GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint, GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint, GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint, GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint, GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint, GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint, GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint, GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint, GLint, GLuint); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint, GLint, GLuint, GLuint); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint, GLint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint, GLint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint, GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint, GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint, GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint, GLint, GLsizei, const GLuint *); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint, GLsizeiptr, const GLvoid *, GLenum); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint, GLintptr, GLsizeiptr, const GLvoid *); -GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint, GLenum); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint, GLenum, GLvoid* *); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint, GLintptr, GLsizeiptr, GLvoid *); -GLAPI void APIENTRY glTextureBufferEXT (GLuint, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint, GLenum, GLint *); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint, GLenum); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint, GLenum); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum, GLenum); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint, GLenum); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint, GLsizei, const GLenum *); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint, GLenum); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint, GLsizei, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint, GLsizei, GLsizei, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint, GLenum, GLuint, GLint); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint, GLenum, GLuint, GLint, GLenum); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint, GLenum, GLuint); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum, GLenum, GLuint); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid* *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, GLvoid *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, GLvoid *img); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, GLvoid *string); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI GLvoid* APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, GLvoid* *params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); @@ -8437,6 +10523,9 @@ typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); @@ -8463,6 +10552,23 @@ typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint frameb typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); #endif #ifndef GL_EXT_vertex_array_bgra @@ -8476,9 +10582,9 @@ typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenu #ifndef GL_NV_explicit_multisample #define GL_NV_explicit_multisample 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMultisamplefvNV (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint, GLbitfield); -GLAPI void APIENTRY glTexRenderbufferNV (GLenum, GLuint); +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); @@ -8488,13 +10594,13 @@ typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint rende #ifndef GL_NV_transform_feedback2 #define GL_NV_transform_feedback2 1 #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum, GLuint); -GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint); +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); GLAPI void APIENTRY glPauseTransformFeedbackNV (void); GLAPI void APIENTRY glResumeTransformFeedbackNV (void); -GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum, GLuint); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); @@ -8505,11 +10611,516 @@ typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); #endif +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#endif + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif + +#ifndef GL_AMD_vertex_shader_tesselator +#define GL_AMD_vertex_shader_tesselator 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#endif + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const GLvoid *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid* *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#endif + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#endif + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#endif + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#endif + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#endif + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#endif + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#endif + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#endif + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +#endif + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#endif + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#endif + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#endif + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#endif + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, GLvoid *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const GLvoid *vdpDevice, const GLvoid *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI void APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const GLvoid *vdpDevice, const GLvoid *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif + #ifdef __cplusplus } #endif #endif -/* *INDENT-ON* */ #endif /* NO_SDL_GLEXT */ + +#endif /* !__IPHONEOS__ */ + +#endif /* _SDL_opengl_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_opengles.h b/Externals/SDL2-2.0.1/include/SDL_opengles.h new file mode 100644 index 0000000000..00e60f5c17 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_opengles.h @@ -0,0 +1,38 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 1.X API headers. + */ + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif diff --git a/Externals/SDL2-2.0.1/include/SDL_opengles2.h b/Externals/SDL2-2.0.1/include/SDL_opengles2.h new file mode 100644 index 0000000000..7697626f4a --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_opengles2.h @@ -0,0 +1,38 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 2.0 API headers. + */ + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif diff --git a/Externals/SDL/Include_1.3/SDL_pixels.h b/Externals/SDL2-2.0.1/include/SDL_pixels.h similarity index 53% rename from Externals/SDL/Include_1.3/SDL_pixels.h rename to Externals/SDL2-2.0.1/include/SDL_pixels.h index f4523fa8e6..99fcd9aac1 100644 --- a/Externals/SDL/Include_1.3/SDL_pixels.h +++ b/Externals/SDL2-2.0.1/include/SDL_pixels.h @@ -1,29 +1,28 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /** - * \file SDL_pixels.h + * \file SDL_pixels.h * - * Header for the enumerated pixel format definitions + * Header for the enumerated pixel format definitions. */ #ifndef _SDL_pixels_h @@ -32,17 +31,22 @@ #include "begin_code.h" /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus -/* *INDENT-OFF* */ extern "C" { -/* *INDENT-ON* */ #endif -/* Transparency definitions: These define alpha as the opacity of a surface */ +/** + * \name Transparency definitions + * + * These define alpha as the opacity of a surface. + */ +/* @{ */ #define SDL_ALPHA_OPAQUE 255 #define SDL_ALPHA_TRANSPARENT 0 +/* @} */ +/** Pixel type. */ enum -{ /* Pixel type */ +{ SDL_PIXELTYPE_UNKNOWN, SDL_PIXELTYPE_INDEX1, SDL_PIXELTYPE_INDEX4, @@ -57,14 +61,17 @@ enum SDL_PIXELTYPE_ARRAYF32 }; +/** Bitmap pixel order, high bit -> low bit. */ enum -{ /* bitmap pixel order, high bit -> low bit */ +{ SDL_BITMAPORDER_NONE, SDL_BITMAPORDER_4321, SDL_BITMAPORDER_1234 }; + +/** Packed component order, high bit -> low bit. */ enum -{ /* packed component order, high bit -> low bit */ +{ SDL_PACKEDORDER_NONE, SDL_PACKEDORDER_XRGB, SDL_PACKEDORDER_RGBX, @@ -75,8 +82,10 @@ enum SDL_PACKEDORDER_ABGR, SDL_PACKEDORDER_BGRA }; + +/** Array component order, low byte -> high byte. */ enum -{ /* array component order, low byte -> high byte */ +{ SDL_ARRAYORDER_NONE, SDL_ARRAYORDER_RGB, SDL_ARRAYORDER_RGBA, @@ -86,8 +95,9 @@ enum SDL_ARRAYORDER_ABGR }; +/** Packed component layout. */ enum -{ /* Packed component layout */ +{ SDL_PACKEDLAYOUT_NONE, SDL_PACKEDLAYOUT_332, SDL_PACKEDLAYOUT_4444, @@ -99,42 +109,56 @@ enum SDL_PACKEDLAYOUT_1010102 }; -#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) \ - ((A) | ((B) << 8) | ((C) << 16) | ((D) << 24)) +#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) #define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ - ((1 << 31) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ + ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ ((bits) << 8) | ((bytes) << 0)) -#define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) -#define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) -#define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) -#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) -#define SDL_BYTESPERPIXEL(X) (((X) >> 0) & 0xFF) +#define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F) +#define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) +#define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) +#define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) +#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) +#define SDL_BYTESPERPIXEL(X) \ + (SDL_ISPIXELFORMAT_FOURCC(X) ? \ + ((((X) == SDL_PIXELFORMAT_YUY2) || \ + ((X) == SDL_PIXELFORMAT_UYVY) || \ + ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF)) #define SDL_ISPIXELFORMAT_INDEXED(format) \ - ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ - (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ - (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8)) + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) +#define SDL_ISPIXELFORMAT_ALPHA(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) + +/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ #define SDL_ISPIXELFORMAT_FOURCC(format) \ - ((format) && !((format) & 0x80000000)) + ((format) && (SDL_PIXELFLAG(format) != 1)) +/* Note: If you modify this list, update SDL_GetPixelFormatName() */ enum { SDL_PIXELFORMAT_UNKNOWN, SDL_PIXELFORMAT_INDEX1LSB = - SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, - 1, 0), - SDL_PIXELFORMAT_INDEX1MSB = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, 1, 0), + SDL_PIXELFORMAT_INDEX1MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, + 1, 0), SDL_PIXELFORMAT_INDEX4LSB = - SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, - 2, 0), - SDL_PIXELFORMAT_INDEX4MSB = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, - 2, 0), + 4, 0), + SDL_PIXELFORMAT_INDEX4MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, + 4, 0), SDL_PIXELFORMAT_INDEX8 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), SDL_PIXELFORMAT_RGB332 = @@ -152,15 +176,33 @@ enum SDL_PIXELFORMAT_ARGB4444 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_RGBA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ABGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_BGRA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_4444, 16, 2), SDL_PIXELFORMAT_ARGB1555 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_RGBA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_5551, 16, 2), SDL_PIXELFORMAT_ABGR1555 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_BGRA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_5551, 16, 2), SDL_PIXELFORMAT_RGB565 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_BGR565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_565, 16, 2), SDL_PIXELFORMAT_RGB24 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, 24, 3), @@ -170,9 +212,15 @@ enum SDL_PIXELFORMAT_RGB888 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_RGBX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, + SDL_PACKEDLAYOUT_8888, 24, 4), SDL_PIXELFORMAT_BGR888 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_BGRX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, + SDL_PACKEDLAYOUT_8888, 24, 4), SDL_PIXELFORMAT_ARGB8888 = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_8888, 32, 4), @@ -189,15 +237,15 @@ enum SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_2101010, 32, 4), - SDL_PIXELFORMAT_YV12 = /* Planar mode: Y + V + U (3 planes) */ + SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), - SDL_PIXELFORMAT_IYUV = /* Planar mode: Y + U + V (3 planes) */ + SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), - SDL_PIXELFORMAT_YUY2 = /* Packed mode: Y0+U0+Y1+V0 (1 plane) */ + SDL_PIXELFORMAT_YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), - SDL_PIXELFORMAT_UYVY = /* Packed mode: U0+Y0+V0+Y1 (1 plane) */ + SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), - SDL_PIXELFORMAT_YVYU = /* Packed mode: Y0+V0+Y1+U0 (1 plane) */ + SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U') }; @@ -206,35 +254,32 @@ typedef struct SDL_Color Uint8 r; Uint8 g; Uint8 b; - Uint8 unused; + Uint8 a; } SDL_Color; #define SDL_Colour SDL_Color -typedef struct SDL_Palette SDL_Palette; -typedef int (*SDL_PaletteChangedFunc) (void *userdata, SDL_Palette * palette); - -typedef struct SDL_PaletteWatch -{ - SDL_PaletteChangedFunc callback; - void *userdata; - struct SDL_PaletteWatch *next; -} SDL_PaletteWatch; - -struct SDL_Palette +typedef struct SDL_Palette { int ncolors; SDL_Color *colors; - + Uint32 version; int refcount; - SDL_PaletteWatch *watch; -}; +} SDL_Palette; -/* Everything in the pixel format structure is read-only */ +/** + * \note Everything in the pixel format structure is read-only. + */ typedef struct SDL_PixelFormat { + Uint32 format; SDL_Palette *palette; Uint8 BitsPerPixel; Uint8 BytesPerPixel; + Uint8 padding[2]; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; Uint8 Rloss; Uint8 Gloss; Uint8 Bloss; @@ -243,20 +288,21 @@ typedef struct SDL_PixelFormat Uint8 Gshift; Uint8 Bshift; Uint8 Ashift; - Uint32 Rmask; - Uint32 Gmask; - Uint32 Bmask; - Uint32 Amask; + int refcount; + struct SDL_PixelFormat *next; } SDL_PixelFormat; /** - * \fn SDL_bool SDL_PixelFormatEnumToMasks(Uint32 format, int *bpp, Uint32 * Rmask, Uint32 * Gmask, Uint32 * Bmask, Uint32 * Amask) + * \brief Get the human readable name of a pixel format + */ +extern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format); + +/** + * \brief Convert one of the enumerated pixel formats to a bpp and RGBA masks. * - * \brief Convert one of the enumerated pixel formats to a bpp and RGBA masks. + * \return SDL_TRUE, or SDL_FALSE if the conversion wasn't possible. * - * \return SDL_TRUE, or SDL_FALSE if the conversion wasn't possible. - * - * \sa SDL_MasksToPixelFormatEnum() + * \sa SDL_MasksToPixelFormatEnum() */ extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, int *bpp, @@ -266,13 +312,12 @@ extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, Uint32 * Amask); /** - * \fn Uint32 SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) + * \brief Convert a bpp and RGBA masks to an enumerated pixel format. * - * \brief Convert a bpp and RGBA masks to an enumerated pixel format. + * \return The pixel format, or ::SDL_PIXELFORMAT_UNKNOWN if the conversion + * wasn't possible. * - * \return The pixel format, or SDL_PixelFormat_Unknown if the conversion wasn't possible. - * - * \sa SDL_PixelFormatEnumToMasks() + * \sa SDL_PixelFormatEnumToMasks() */ extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, @@ -281,118 +326,99 @@ extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, Uint32 Amask); /** - * \fn SDL_Palette *SDL_AllocPalette(int ncolors) + * \brief Create an SDL_PixelFormat structure from a pixel format enum. + */ +extern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format); + +/** + * \brief Free an SDL_PixelFormat structure. + */ +extern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format); + +/** + * \brief Create a palette structure with the specified number of color + * entries. * - * \brief Create a palette structure with the specified number of color entries. + * \return A new palette, or NULL if there wasn't enough memory. * - * \return A new palette, or NULL if there wasn't enough memory + * \note The palette entries are initialized to white. * - * \note The palette entries are initialized to white. - * - * \sa SDL_FreePalette() + * \sa SDL_FreePalette() */ extern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors); /** - * \fn int SDL_AddPaletteWatch(SDL_Palette *palette, SDL_PaletteChangedFunc callback, void *userdata) - * - * \brief Add a callback function which is called when the palette changes. - * - * \sa SDL_DelPaletteWatch() + * \brief Set the palette for a pixel format structure. */ -extern DECLSPEC int SDLCALL SDL_AddPaletteWatch(SDL_Palette * palette, - SDL_PaletteChangedFunc - callback, void *userdata); +extern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format, + SDL_Palette *palette); /** - * \fn void SDL_DelPaletteWatch(SDL_Palette *palette, SDL_PaletteChangedFunc callback, void *userdata) + * \brief Set a range of colors in a palette. * - * \brief Remove a callback function previously added with SDL_AddPaletteWatch() + * \param palette The palette to modify. + * \param colors An array of colors to copy into the palette. + * \param firstcolor The index of the first palette entry to modify. + * \param ncolors The number of entries to modify. * - * \sa SDL_AddPaletteWatch() - */ -extern DECLSPEC void SDLCALL SDL_DelPaletteWatch(SDL_Palette * palette, - SDL_PaletteChangedFunc - callback, void *userdata); - -/** - * \fn int SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Colors *colors, int firstcolor, int numcolors) - * - * \brief Set a range of colors in a palette. - * - * \param palette The palette to modify - * \param colors An array of colors to copy into the palette - * \param firstcolor The index of the first palette entry to modify - * \param ncolors The number of entries to modify - * - * \return 0 on success, or -1 if not all of the colors could be set + * \return 0 on success, or -1 if not all of the colors could be set. */ extern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette, const SDL_Color * colors, int firstcolor, int ncolors); /** - * \fn void SDL_FreePalette(SDL_Palette *palette) + * \brief Free a palette created with SDL_AllocPalette(). * - * \brief Free a palette created with SDL_AllocPalette() - * - * \sa SDL_AllocPalette() + * \sa SDL_AllocPalette() */ extern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette); /** - * \fn Uint32 SDL_MapRGB(const SDL_PixelFormat *format, - * Uint8 r, Uint8 g, Uint8 b) + * \brief Maps an RGB triple to an opaque pixel value for a given pixel format. * - * \brief Maps an RGB triple to an opaque pixel value for a given pixel format - * - * \sa SDL_MapRGBA + * \sa SDL_MapRGBA */ extern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b); /** - * \fn Uint32 SDL_MapRGBA(const SDL_PixelFormat *fmt, - * Uint8 r, Uint8 g, Uint8 b, Uint8 a) + * \brief Maps an RGBA quadruple to a pixel value for a given pixel format. * - * \brief Maps an RGBA quadruple to a pixel value for a given pixel format - * - * \sa SDL_MapRGB + * \sa SDL_MapRGB */ extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format, Uint8 r, Uint8 g, Uint8 b, Uint8 a); /** - * \fn void SDL_GetRGB(Uint32 pixel, const SDL_PixelFormat * format, - * Uint8 * r, Uint8 * g, Uint8 * b) + * \brief Get the RGB components from a pixel of the specified format. * - * \brief Maps a pixel value into the RGB components for a given pixel format - * - * \sa SDL_GetRGBA + * \sa SDL_GetRGBA */ extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormat * format, Uint8 * r, Uint8 * g, Uint8 * b); /** - * \fn void SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormat * format, - * Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a) + * \brief Get the RGBA components from a pixel of the specified format. * - * \brief Maps a pixel value into the RGBA components for a given pixel format - * - * \sa SDL_GetRGB + * \sa SDL_GetRGB */ extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormat * format, Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a); +/** + * \brief Calculate a 256 entry gamma ramp for a gamma value. + */ +extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp); + + /* Ends C function definitions when using C++ */ #ifdef __cplusplus -/* *INDENT-OFF* */ } -/* *INDENT-ON* */ #endif #include "close_code.h" diff --git a/Externals/SDL2-2.0.1/include/SDL_platform.h b/Externals/SDL2-2.0.1/include/SDL_platform.h new file mode 100644 index 0000000000..a40c41e265 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_platform.h @@ -0,0 +1,155 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_platform.h + * + * Try to get a standard set of platform defines. + */ + +#ifndef _SDL_platform_h +#define _SDL_platform_h + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__BEOS__) +#undef __BEOS__ +#define __BEOS__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(ANDROID) +#undef __ANDROID__ +#undef __LINUX__ /* do we need to do this? */ +#define __ANDROID__ 1 +#endif + +#if defined(__APPLE__) +/* lets us know what version of Mac OS X we're compiling on */ +#include "AvailabilityMacros.h" +#include "TargetConditionals.h" +#if TARGET_OS_IPHONE +/* if compiling for iPhone */ +#undef __IPHONEOS__ +#define __IPHONEOS__ 1 +#undef __MACOSX__ +#else +/* if not compiling for iPhone */ +#undef __MACOSX__ +#define __MACOSX__ 1 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050 +# error SDL for Mac OS X only supports deploying on 10.5 and above. +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1050 */ +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 +# error SDL for Mac OS X must be built with a 10.6 SDK or above. +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED < 1060 */ +#endif /* TARGET_OS_IPHONE */ +#endif /* defined(__APPLE__) */ + +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) +#undef __WINDOWS__ +#define __WINDOWS__ 1 +#endif +#if defined(__WINDOWS__) +#undef __WIN32__ +#define __WIN32__ 1 +#endif +#if defined(__PSP__) +#undef __PSP__ +#define __PSP__ 1 +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Gets the name of the platform. + */ +extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_platform_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_power.h b/Externals/SDL2-2.0.1/include/SDL_power.h new file mode 100644 index 0000000000..4f70c5bb16 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_power.h @@ -0,0 +1,75 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_power_h +#define _SDL_power_h + +/** + * \file SDL_power.h + * + * Header for the SDL power management routines. + */ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The basic state for the system's power supply. + */ +typedef enum +{ + SDL_POWERSTATE_UNKNOWN, /**< cannot determine power status */ + SDL_POWERSTATE_ON_BATTERY, /**< Not plugged in, running on the battery */ + SDL_POWERSTATE_NO_BATTERY, /**< Plugged in, no battery available */ + SDL_POWERSTATE_CHARGING, /**< Plugged in, charging battery */ + SDL_POWERSTATE_CHARGED /**< Plugged in, battery charged */ +} SDL_PowerState; + + +/** + * \brief Get the current power supply details. + * + * \param secs Seconds of battery life left. You can pass a NULL here if + * you don't care. Will return -1 if we can't determine a + * value, or we're not running on a battery. + * + * \param pct Percentage of battery life left, between 0 and 100. You can + * pass a NULL here if you don't care. Will return -1 if we + * can't determine a value, or we're not running on a battery. + * + * \return The state of the battery (if any). + */ +extern DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *secs, int *pct); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_power_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_quit.h b/Externals/SDL2-2.0.1/include/SDL_quit.h new file mode 100644 index 0000000000..485e42db04 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_quit.h @@ -0,0 +1,58 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_quit.h + * + * Include file for SDL quit event handling. + */ + +#ifndef _SDL_quit_h +#define _SDL_quit_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** + * \file SDL_quit.h + * + * An ::SDL_QUIT event is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate ::SDL_QUIT events as well. There is no way + * to determine the cause of an ::SDL_QUIT event, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + * + * \sa SDL_Quit() + */ + +/* There are no functions directly affecting the quit event */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT) > 0)) + +#endif /* _SDL_quit_h */ diff --git a/Externals/SDL2-2.0.1/include/SDL_rect.h b/Externals/SDL2-2.0.1/include/SDL_rect.h new file mode 100644 index 0000000000..7132e1b440 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_rect.h @@ -0,0 +1,138 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rect.h + * + * Header file for SDL_rect definition and management functions. + */ + +#ifndef _SDL_rect_h +#define _SDL_rect_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a point + * + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Point +{ + int x; + int y; +} SDL_Point; + +/** + * \brief A rectangle, with the origin at the upper left. + * + * \sa SDL_RectEmpty + * \sa SDL_RectEquals + * \sa SDL_HasIntersection + * \sa SDL_IntersectRect + * \sa SDL_UnionRect + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Rect +{ + int x, y; + int w, h; +} SDL_Rect; + +/** + * \brief Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +{ + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * \brief Returns true if the two rectangles are equal. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b) +{ + return (a && b && (a->x == b->x) && (a->y == b->y) && + (a->w == b->w) && (a->h == b->h)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * \brief Determine whether two rectangles intersect. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A, + const SDL_Rect * B); + +/** + * \brief Calculate the intersection of two rectangles. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * \brief Calculate the union of two rectangles. + */ +extern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * \brief Calculate a minimal rectangle enclosing a set of points + * + * \return SDL_TRUE if any points were within the clipping rect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EnclosePoints(const SDL_Point * points, + int count, + const SDL_Rect * clip, + SDL_Rect * result); + +/** + * \brief Calculate the intersection of a rectangle and line segment. + * + * \return SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect * + rect, int *X1, + int *Y1, int *X2, + int *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rect_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_render.h b/Externals/SDL2-2.0.1/include/SDL_render.h new file mode 100644 index 0000000000..a765dc79f0 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_render.h @@ -0,0 +1,870 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_render.h + * + * Header file for SDL 2D rendering functions. + * + * This API supports the following features: + * * single pixel points + * * single pixel lines + * * filled rectangles + * * texture images + * + * The primitives may be drawn in opaque, blended, or additive modes. + * + * The texture images may be drawn in opaque, blended, or additive modes. + * They can have an additional color tint or alpha modulation applied to + * them, and may also be stretched with linear interpolation. + * + * This API is designed to accelerate simple 2D operations. You may + * want more functionality such as polygons and particle effects and + * in that case you should use SDL's OpenGL/Direct3D support or one + * of the many good 3D engines. + * + * These functions must be called from the main thread. + * See this bug for details: http://bugzilla.libsdl.org/show_bug.cgi?id=1995 + */ + +#ifndef _SDL_render_h +#define _SDL_render_h + +#include "SDL_stdinc.h" +#include "SDL_rect.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Flags used when creating a rendering context + */ +typedef enum +{ + SDL_RENDERER_SOFTWARE = 0x00000001, /**< The renderer is a software fallback */ + SDL_RENDERER_ACCELERATED = 0x00000002, /**< The renderer uses hardware + acceleration */ + SDL_RENDERER_PRESENTVSYNC = 0x00000004, /**< Present is synchronized + with the refresh rate */ + SDL_RENDERER_TARGETTEXTURE = 0x00000008 /**< The renderer supports + rendering to texture */ +} SDL_RendererFlags; + +/** + * \brief Information on the capabilities of a render driver or context. + */ +typedef struct SDL_RendererInfo +{ + const char *name; /**< The name of the renderer */ + Uint32 flags; /**< Supported ::SDL_RendererFlags */ + Uint32 num_texture_formats; /**< The number of available texture formats */ + Uint32 texture_formats[16]; /**< The available texture formats */ + int max_texture_width; /**< The maximimum texture width */ + int max_texture_height; /**< The maximimum texture height */ +} SDL_RendererInfo; + +/** + * \brief The access pattern allowed for a texture. + */ +typedef enum +{ + SDL_TEXTUREACCESS_STATIC, /**< Changes rarely, not lockable */ + SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */ + SDL_TEXTUREACCESS_TARGET /**< Texture can be used as a render target */ +} SDL_TextureAccess; + +/** + * \brief The texture channel modulation used in SDL_RenderCopy(). + */ +typedef enum +{ + SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */ + SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */ + SDL_TEXTUREMODULATE_ALPHA = 0x00000002 /**< srcA = srcA * alpha */ +} SDL_TextureModulate; + +/** + * \brief Flip constants for SDL_RenderCopyEx + */ +typedef enum +{ + SDL_FLIP_NONE = 0x00000000, /**< Do not flip */ + SDL_FLIP_HORIZONTAL = 0x00000001, /**< flip horizontally */ + SDL_FLIP_VERTICAL = 0x00000002 /**< flip vertically */ +} SDL_RendererFlip; + +/** + * \brief A structure representing rendering state + */ +struct SDL_Renderer; +typedef struct SDL_Renderer SDL_Renderer; + +/** + * \brief An efficient driver-specific representation of pixel data + */ +struct SDL_Texture; +typedef struct SDL_Texture SDL_Texture; + + +/* Function prototypes */ + +/** + * \brief Get the number of 2D rendering drivers available for the current + * display. + * + * A render driver is a set of code that handles rendering and texture + * management on a particular display. Normally there is only one, but + * some drivers may have several available with different capabilities. + * + * \sa SDL_GetRenderDriverInfo() + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); + +/** + * \brief Get information about a specific 2D rendering driver for the current + * display. + * + * \param index The index of the driver to query information about. + * \param info A pointer to an SDL_RendererInfo struct to be filled with + * information on the rendering driver. + * + * \return 0 on success, -1 if the index was out of range. + * + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index, + SDL_RendererInfo * info); + +/** + * \brief Create a window and default renderer + * + * \param width The width of the window + * \param height The height of the window + * \param window_flags The flags used to create the window + * \param window A pointer filled with the window, or NULL on error + * \param renderer A pointer filled with the renderer, or NULL on error + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer( + int width, int height, Uint32 window_flags, + SDL_Window **window, SDL_Renderer **renderer); + + +/** + * \brief Create a 2D rendering context for a window. + * + * \param window The window where rendering is displayed. + * \param index The index of the rendering driver to initialize, or -1 to + * initialize the first one supporting the requested flags. + * \param flags ::SDL_RendererFlags. + * + * \return A valid rendering context or NULL if there was an error. + * + * \sa SDL_CreateSoftwareRenderer() + * \sa SDL_GetRendererInfo() + * \sa SDL_DestroyRenderer() + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window, + int index, Uint32 flags); + +/** + * \brief Create a 2D software rendering context for a surface. + * + * \param surface The surface where rendering is done. + * + * \return A valid rendering context or NULL if there was an error. + * + * \sa SDL_CreateRenderer() + * \sa SDL_DestroyRenderer() + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface); + +/** + * \brief Get the renderer associated with a window. + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window); + +/** + * \brief Get information about a rendering context. + */ +extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer, + SDL_RendererInfo * info); + +/** + * \brief Get the output size of a rendering context. + */ +extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, + int *w, int *h); + +/** + * \brief Create a texture for a rendering context. + * + * \param renderer The renderer. + * \param format The format of the texture. + * \param access One of the enumerated values in ::SDL_TextureAccess. + * \param w The width of the texture in pixels. + * \param h The height of the texture in pixels. + * + * \return The created texture is returned, or 0 if no rendering context was + * active, the format was unsupported, or the width or height were out + * of range. + * + * \sa SDL_QueryTexture() + * \sa SDL_UpdateTexture() + * \sa SDL_DestroyTexture() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer, + Uint32 format, + int access, int w, + int h); + +/** + * \brief Create a texture from an existing surface. + * + * \param renderer The renderer. + * \param surface The surface containing pixel data used to fill the texture. + * + * \return The created texture is returned, or 0 on error. + * + * \note The surface is not modified or freed by this function. + * + * \sa SDL_QueryTexture() + * \sa SDL_DestroyTexture() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface); + +/** + * \brief Query the attributes of a texture + * + * \param texture A texture to be queried. + * \param format A pointer filled in with the raw format of the texture. The + * actual format may differ, but pixel transfers will use this + * format. + * \param access A pointer filled in with the actual access to the texture. + * \param w A pointer filled in with the width of the texture in pixels. + * \param h A pointer filled in with the height of the texture in pixels. + * + * \return 0 on success, or -1 if the texture is not valid. + */ +extern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_Texture * texture, + Uint32 * format, int *access, + int *w, int *h); + +/** + * \brief Set an additional color value used in render copy operations. + * + * \param texture The texture to update. + * \param r The red color value multiplied into copy operations. + * \param g The green color value multiplied into copy operations. + * \param b The blue color value multiplied into copy operations. + * + * \return 0 on success, or -1 if the texture is not valid or color modulation + * is not supported. + * + * \sa SDL_GetTextureColorMod() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_Texture * texture, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * \brief Get the additional color value used in render copy operations. + * + * \param texture The texture to query. + * \param r A pointer filled in with the current red color value. + * \param g A pointer filled in with the current green color value. + * \param b A pointer filled in with the current blue color value. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureColorMod() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_Texture * texture, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * \brief Set an additional alpha value used in render copy operations. + * + * \param texture The texture to update. + * \param alpha The alpha value multiplied into copy operations. + * + * \return 0 on success, or -1 if the texture is not valid or alpha modulation + * is not supported. + * + * \sa SDL_GetTextureAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture, + Uint8 alpha); + +/** + * \brief Get the additional alpha value used in render copy operations. + * + * \param texture The texture to query. + * \param alpha A pointer filled in with the current alpha value. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_Texture * texture, + Uint8 * alpha); + +/** + * \brief Set the blend mode used for texture copy operations. + * + * \param texture The texture to update. + * \param blendMode ::SDL_BlendMode to use for texture blending. + * + * \return 0 on success, or -1 if the texture is not valid or the blend mode is + * not supported. + * + * \note If the blend mode is not supported, the closest supported mode is + * chosen. + * + * \sa SDL_GetTextureBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for texture copy operations. + * + * \param texture The texture to query. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \sa SDL_SetTextureBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode *blendMode); + +/** + * \brief Update the given texture rectangle with new pixel data. + * + * \param texture The texture to update + * \param rect A pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param pixels The raw pixel data. + * \param pitch The number of bytes between rows of pixel data. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \note This is a fairly slow function. + */ +extern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const void *pixels, int pitch); + +/** + * \brief Update a rectangle within a planar YV12 or IYUV texture with new pixel data. + * + * \param texture The texture to update + * \param rect A pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param Yplane The raw pixel data for the Y plane. + * \param Ypitch The number of bytes between rows of pixel data for the Y plane. + * \param Uplane The raw pixel data for the U plane. + * \param Upitch The number of bytes between rows of pixel data for the U plane. + * \param Vplane The raw pixel data for the V plane. + * \param Vpitch The number of bytes between rows of pixel data for the V plane. + * + * \return 0 on success, or -1 if the texture is not valid. + * + * \note You can use SDL_UpdateTexture() as long as your pixel data is + * a contiguous block of Y and U/V planes in the proper order, but + * this function is available if your pixel data is not contiguous. + */ +extern DECLSPEC int SDLCALL SDL_UpdateYUVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *Uplane, int Upitch, + const Uint8 *Vplane, int Vpitch); + +/** + * \brief Lock a portion of the texture for write-only pixel access. + * + * \param texture The texture to lock for access, which was created with + * ::SDL_TEXTUREACCESS_STREAMING. + * \param rect A pointer to the rectangle to lock for access. If the rect + * is NULL, the entire texture will be locked. + * \param pixels This is filled in with a pointer to the locked pixels, + * appropriately offset by the locked area. + * \param pitch This is filled in with the pitch of the locked pixels. + * + * \return 0 on success, or -1 if the texture is not valid or was not created with ::SDL_TEXTUREACCESS_STREAMING. + * + * \sa SDL_UnlockTexture() + */ +extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture, + const SDL_Rect * rect, + void **pixels, int *pitch); + +/** + * \brief Unlock a texture, uploading the changes to video memory, if needed. + * + * \sa SDL_LockTexture() + */ +extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture); + +/** + * \brief Determines whether a window supports the use of render targets + * + * \param renderer The renderer that will be checked + * + * \return SDL_TRUE if supported, SDL_FALSE if not. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderTargetSupported(SDL_Renderer *renderer); + +/** + * \brief Set a texture as the current rendering target. + * + * \param renderer The renderer. + * \param texture The targeted texture, which must be created with the SDL_TEXTUREACCESS_TARGET flag, or NULL for the default render target + * + * \return 0 on success, or -1 on error + * + * \sa SDL_GetRenderTarget() + */ +extern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, + SDL_Texture *texture); + +/** + * \brief Get the current render target or NULL for the default render target. + * + * \return The current render target + * + * \sa SDL_SetRenderTarget() + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer); + +/** + * \brief Set device independent resolution for rendering + * + * \param renderer The renderer for which resolution should be set. + * \param w The width of the logical resolution + * \param h The height of the logical resolution + * + * This function uses the viewport and scaling functionality to allow a fixed logical + * resolution for rendering, regardless of the actual output resolution. If the actual + * output resolution doesn't have the same aspect ratio the output rendering will be + * centered within the output display. + * + * If the output display is a window, mouse events in the window will be filtered + * and scaled so they seem to arrive within the logical resolution. + * + * \note If this function results in scaling or subpixel drawing by the + * rendering backend, it will be handled using the appropriate + * quality hints. + * + * \sa SDL_RenderGetLogicalSize() + * \sa SDL_RenderSetScale() + * \sa SDL_RenderSetViewport() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h); + +/** + * \brief Get device independent resolution for rendering + * + * \param renderer The renderer from which resolution should be queried. + * \param w A pointer filled with the width of the logical resolution + * \param h A pointer filled with the height of the logical resolution + * + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h); + +/** + * \brief Set the drawing area for rendering on the current target. + * + * \param renderer The renderer for which the drawing area should be set. + * \param rect The rectangle representing the drawing area, or NULL to set the viewport to the entire target. + * + * The x,y of the viewport rect represents the origin for rendering. + * + * \return 0 on success, or -1 on error + * + * \note If the window associated with the renderer is resized, the viewport is automatically reset. + * + * \sa SDL_RenderGetViewport() + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Get the drawing area for the current target. + * + * \sa SDL_RenderSetViewport() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * \brief Set the clip rectangle for the current target. + * + * \param renderer The renderer for which clip rectangle should be set. + * \param rect A pointer to the rectangle to set as the clip rectangle, or + * NULL to disable clipping. + * + * \return 0 on success, or -1 on error + * + * \sa SDL_RenderGetClipRect() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Get the clip rectangle for the current target. + * + * \param renderer The renderer from which clip rectangle should be queried. + * \param rect A pointer filled in with the current clip rectangle, or + * an empty rectangle if clipping is disabled. + * + * \sa SDL_RenderSetClipRect() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * \brief Set the drawing scale for rendering on the current target. + * + * \param renderer The renderer for which the drawing scale should be set. + * \param scaleX The horizontal scaling factor + * \param scaleY The vertical scaling factor + * + * The drawing coordinates are scaled by the x/y scaling factors + * before they are used by the renderer. This allows resolution + * independent drawing with a single coordinate system. + * + * \note If this results in scaling or subpixel drawing by the + * rendering backend, it will be handled using the appropriate + * quality hints. For best results use integer scaling factors. + * + * \sa SDL_RenderGetScale() + * \sa SDL_RenderSetLogicalSize() + */ +extern DECLSPEC int SDLCALL SDL_RenderSetScale(SDL_Renderer * renderer, + float scaleX, float scaleY); + +/** + * \brief Get the drawing scale for the current target. + * + * \param renderer The renderer from which drawing scale should be queried. + * \param scaleX A pointer filled in with the horizontal scaling factor + * \param scaleY A pointer filled in with the vertical scaling factor + * + * \sa SDL_RenderSetScale() + */ +extern DECLSPEC void SDLCALL SDL_RenderGetScale(SDL_Renderer * renderer, + float *scaleX, float *scaleY); + +/** + * \brief Set the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer The renderer for which drawing color should be set. + * \param r The red value used to draw on the rendering target. + * \param g The green value used to draw on the rendering target. + * \param b The blue value used to draw on the rendering target. + * \param a The alpha value used to draw on the rendering target, usually + * ::SDL_ALPHA_OPAQUE (255). + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDL_SetRenderDrawColor(SDL_Renderer * renderer, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * \brief Get the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer The renderer from which drawing color should be queried. + * \param r A pointer to the red value used to draw on the rendering target. + * \param g A pointer to the green value used to draw on the rendering target. + * \param b A pointer to the blue value used to draw on the rendering target. + * \param a A pointer to the alpha value used to draw on the rendering target, + * usually ::SDL_ALPHA_OPAQUE (255). + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDL_GetRenderDrawColor(SDL_Renderer * renderer, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * \brief Set the blend mode used for drawing operations (Fill and Line). + * + * \param renderer The renderer for which blend mode should be set. + * \param blendMode ::SDL_BlendMode to use for blending. + * + * \return 0 on success, or -1 on error + * + * \note If the blend mode is not supported, the closest supported mode is + * chosen. + * + * \sa SDL_GetRenderDrawBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for drawing operations. + * + * \param renderer The renderer from which blend mode should be queried. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 on error + * + * \sa SDL_SetRenderDrawBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode *blendMode); + +/** + * \brief Clear the current rendering target with the drawing color + * + * This function clears the entire rendering target, ignoring the viewport. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer); + +/** + * \brief Draw a point on the current rendering target. + * + * \param renderer The renderer which should draw a point. + * \param x The x coordinate of the point. + * \param y The y coordinate of the point. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoint(SDL_Renderer * renderer, + int x, int y); + +/** + * \brief Draw multiple points on the current rendering target. + * + * \param renderer The renderer which should draw multiple points. + * \param points The points to draw + * \param count The number of points to draw + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * \brief Draw a line on the current rendering target. + * + * \param renderer The renderer which should draw a line. + * \param x1 The x coordinate of the start point. + * \param y1 The y coordinate of the start point. + * \param x2 The x coordinate of the end point. + * \param y2 The y coordinate of the end point. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLine(SDL_Renderer * renderer, + int x1, int y1, int x2, int y2); + +/** + * \brief Draw a series of connected lines on the current rendering target. + * + * \param renderer The renderer which should draw multiple lines. + * \param points The points along the lines + * \param count The number of points, drawing count-1 lines + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * \brief Draw a rectangle on the current rendering target. + * + * \param renderer The renderer which should draw a rectangle. + * \param rect A pointer to the destination rectangle, or NULL to outline the entire rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Draw some number of rectangles on the current rendering target. + * + * \param renderer The renderer which should draw multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * \brief Fill a rectangle on the current rendering target with the drawing color. + * + * \param renderer The renderer which should fill a rectangle. + * \param rect A pointer to the destination rectangle, or NULL for the entire + * rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * \brief Fill some number of rectangles on the current rendering target with the drawing color. + * + * \param renderer The renderer which should fill multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * \brief Copy a portion of the texture to the current rendering target. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect); + +/** + * \brief Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \param angle An angle in degrees that indicates the rotation that will be applied to dstrect + * \param center A pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done aroud dstrect.w/2, dstrect.h/2) + * \param flip An SDL_RendererFlip value stating which flipping actions should be performed on the texture + * + * \return 0 on success, or -1 on error + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyEx(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect, + const double angle, + const SDL_Point *center, + const SDL_RendererFlip flip); + +/** + * \brief Read pixels from the current rendering target. + * + * \param renderer The renderer from which pixels should be read. + * \param rect A pointer to the rectangle to read, or NULL for the entire + * render target. + * \param format The desired format of the pixel data, or 0 to use the format + * of the rendering target + * \param pixels A pointer to be filled in with the pixel data + * \param pitch The pitch of the pixels parameter. + * + * \return 0 on success, or -1 if pixel reading is not supported. + * + * \warning This is a very slow operation, and should not be used frequently. + */ +extern DECLSPEC int SDLCALL SDL_RenderReadPixels(SDL_Renderer * renderer, + const SDL_Rect * rect, + Uint32 format, + void *pixels, int pitch); + +/** + * \brief Update the screen with rendering performed. + */ +extern DECLSPEC void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer); + +/** + * \brief Destroy the specified texture. + * + * \sa SDL_CreateTexture() + * \sa SDL_CreateTextureFromSurface() + */ +extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); + +/** + * \brief Destroy the rendering context for a window and free associated + * textures. + * + * \sa SDL_CreateRenderer() + */ +extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer); + + +/** + * \brief Bind the texture to the current OpenGL/ES/ES2 context for use with + * OpenGL instructions. + * + * \param texture The SDL texture to bind + * \param texw A pointer to a float that will be filled with the texture width + * \param texh A pointer to a float that will be filled with the texture height + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh); + +/** + * \brief Unbind a texture from the current OpenGL/ES/ES2 context. + * + * \param texture The SDL texture to unbind + * + * \return 0 on success, or -1 if the operation is not supported + */ +extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_render_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_revision.h b/Externals/SDL2-2.0.1/include/SDL_revision.h new file mode 100644 index 0000000000..fe3a9fc8c0 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_revision.h @@ -0,0 +1,2 @@ +#define SDL_REVISION "hg-7890:c031abe0b287" +#define SDL_REVISION_NUMBER 7890 diff --git a/Externals/SDL2-2.0.1/include/SDL_rwops.h b/Externals/SDL2-2.0.1/include/SDL_rwops.h new file mode 100644 index 0000000000..d257442382 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_rwops.h @@ -0,0 +1,232 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rwops.h + * + * This file provides a general interface for SDL to read and write + * data streams. It can easily be extended to files, memory, etc. + */ + +#ifndef _SDL_rwops_h +#define _SDL_rwops_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* RWops Types */ +#define SDL_RWOPS_UNKNOWN 0 /* Unknown stream type */ +#define SDL_RWOPS_WINFILE 1 /* Win32 file */ +#define SDL_RWOPS_STDFILE 2 /* Stdio file */ +#define SDL_RWOPS_JNIFILE 3 /* Android asset */ +#define SDL_RWOPS_MEMORY 4 /* Memory stream */ +#define SDL_RWOPS_MEMORY_RO 5 /* Read-Only memory stream */ + +/** + * This is the read/write operation structure -- very basic. + */ +typedef struct SDL_RWops +{ + /** + * Return the size of the file in this rwops, or -1 if unknown + */ + Sint64 (SDLCALL * size) (struct SDL_RWops * context); + + /** + * Seek to \c offset relative to \c whence, one of stdio's whence values: + * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END + * + * \return the final offset in the data stream, or -1 on error. + */ + Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, + int whence); + + /** + * Read up to \c maxnum objects each of size \c size from the data + * stream to the area pointed at by \c ptr. + * + * \return the number of objects read, or 0 at error or end of file. + */ + size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, + size_t size, size_t maxnum); + + /** + * Write exactly \c num objects each of size \c size from the area + * pointed at by \c ptr to data stream. + * + * \return the number of objects written, or 0 at error or end of file. + */ + size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, + size_t size, size_t num); + + /** + * Close and free an allocated SDL_RWops structure. + * + * \return 0 if successful or -1 on write error when flushing data. + */ + int (SDLCALL * close) (struct SDL_RWops * context); + + Uint32 type; + union + { +#if defined(ANDROID) + struct + { + void *fileNameRef; + void *inputStreamRef; + void *readableByteChannelRef; + void *readMethod; + void *assetFileDescriptorRef; + long position; + long size; + long offset; + int fd; + } androidio; +#elif defined(__WIN32__) + struct + { + SDL_bool append; + void *h; + struct + { + void *data; + size_t size; + size_t left; + } buffer; + } windowsio; +#endif + +#ifdef HAVE_STDIO_H + struct + { + SDL_bool autoclose; + FILE *fp; + } stdio; +#endif + struct + { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct + { + void *data1; + void *data2; + } unknown; + } hidden; + +} SDL_RWops; + + +/** + * \name RWFrom functions + * + * Functions to create SDL_RWops structures from various data streams. + */ +/* @{ */ + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, + const char *mode); + +#ifdef HAVE_STDIO_H +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, + SDL_bool autoclose); +#else +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, + SDL_bool autoclose); +#endif + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, + int size); + +/* @} *//* RWFrom functions */ + + +extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); + +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ + +/** + * \name Read/write macros + * + * Macros to easily read and write from an SDL_RWops structure. + */ +/* @{ */ +#define SDL_RWsize(ctx) (ctx)->size(ctx) +#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) +#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) +#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) +#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) +#define SDL_RWclose(ctx) (ctx)->close(ctx) +/* @} *//* Read/write macros */ + + +/** + * \name Read endian functions + * + * Read an item of the specified endianness and return in native format. + */ +/* @{ */ +extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); +/* @} *//* Read endian functions */ + +/** + * \name Write endian functions + * + * Write an item of native format to the specified endianness. + */ +/* @{ */ +extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); +extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); +extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); +/* @} *//* Write endian functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_rwops_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL/Include_1.3/SDL_scancode.h b/Externals/SDL2-2.0.1/include/SDL_scancode.h similarity index 56% rename from Externals/SDL/Include_1.3/SDL_scancode.h rename to Externals/SDL2-2.0.1/include/SDL_scancode.h index 8cbfa08b93..00b47a3b80 100644 --- a/Externals/SDL/Include_1.3/SDL_scancode.h +++ b/Externals/SDL2-2.0.1/include/SDL_scancode.h @@ -1,27 +1,28 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /** - * \file SDL_scancode.h + * \file SDL_scancode.h + * + * Defines keyboard scancodes. */ #ifndef _SDL_scancode_h @@ -30,22 +31,25 @@ #include "SDL_stdinc.h" /** - * \enum SDL_scancode + * \brief The SDL keyboard scancode representation. * - * \brief The SDL keyboard scancode representation. + * Values of this type are used to represent keyboard keys, among other places + * in the \link SDL_Keysym::scancode key.keysym.scancode \endlink field of the + * SDL_Event structure. * - * Values of this type are used to represent keyboard keys, among other places - * in the \link SDL_keysym::scancode key.keysym.scancode \endlink field of the - * SDL_Event structure. - * - * The values in this enumeration are based on the USB usage page standard: - * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf + * The values in this enumeration are based on the USB usage page standard: + * http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf */ typedef enum { SDL_SCANCODE_UNKNOWN = 0, - /* These values are from usage page 0x07 (USB keyboard page) */ + /** + * \name Usage page 0x07 + * + * These values are from usage page 0x07 (USB keyboard page). + */ + /* @{ */ SDL_SCANCODE_A = 4, SDL_SCANCODE_B = 5, @@ -95,11 +99,51 @@ typedef enum SDL_SCANCODE_EQUALS = 46, SDL_SCANCODE_LEFTBRACKET = 47, SDL_SCANCODE_RIGHTBRACKET = 48, - SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return key on ISO keyboards and at the right end of the QWERTY row on ANSI keyboards. Produces REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US layout, REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR SIGN and POUND SIGN in a Swiss German layout, NUMBER SIGN and APOSTROPHE in a German layout, GRAVE ACCENT and POUND SIGN in a French Mac layout, and ASTERISK and MICRO SIGN in a French Windows layout. */ - SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code instead of 49 for the same key, but all OSes I've seen treat the two codes identically. So, as an implementor, unless your keyboard generates both of those codes and your OS treats them differently, you should generate SDL_SCANCODE_BACKSLASH instead of this code. As a user, you should not rely on this code because SDL will never generate it with most (all?) keyboards. */ + SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + * key on ISO keyboards and at the right end + * of the QWERTY row on ANSI keyboards. + * Produces REVERSE SOLIDUS (backslash) and + * VERTICAL LINE in a US layout, REVERSE + * SOLIDUS and VERTICAL LINE in a UK Mac + * layout, NUMBER SIGN and TILDE in a UK + * Windows layout, DOLLAR SIGN and POUND SIGN + * in a Swiss German layout, NUMBER SIGN and + * APOSTROPHE in a German layout, GRAVE + * ACCENT and POUND SIGN in a French Mac + * layout, and ASTERISK and MICRO SIGN in a + * French Windows layout. + */ + SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code + * instead of 49 for the same key, but all + * OSes I've seen treat the two codes + * identically. So, as an implementor, unless + * your keyboard generates both of those + * codes and your OS treats them differently, + * you should generate SDL_SCANCODE_BACKSLASH + * instead of this code. As a user, you + * should not rely on this code because SDL + * will never generate it with most (all?) + * keyboards. + */ SDL_SCANCODE_SEMICOLON = 51, SDL_SCANCODE_APOSTROPHE = 52, - SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI and ISO keyboards). Produces GRAVE ACCENT and TILDE in a US Windows layout and in US and UK Mac layouts on ANSI keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows layout, SECTION SIGN and PLUS-MINUS SIGN in US and UK Mac layouts on ISO keyboards, SECTION SIGN and DEGREE SIGN in a Swiss German layout (Mac: only on ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN in a German layout (Mac: only on ISO keyboards), SUPERSCRIPT TWO and TILDE in a French Windows layout, COMMERCIAL AT and NUMBER SIGN in a French Mac layout on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French Mac layout on ANSI keyboards. */ + SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + * and ISO keyboards). Produces GRAVE ACCENT and + * TILDE in a US Windows layout and in US and UK + * Mac layouts on ANSI keyboards, GRAVE ACCENT + * and NOT SIGN in a UK Windows layout, SECTION + * SIGN and PLUS-MINUS SIGN in US and UK Mac + * layouts on ISO keyboards, SECTION SIGN and + * DEGREE SIGN in a Swiss German layout (Mac: + * only on ISO keyboards), CIRCUMFLEX ACCENT and + * DEGREE SIGN in a German layout (Mac: only on + * ISO keyboards), SUPERSCRIPT TWO and TILDE in a + * French Windows layout, COMMERCIAL AT and + * NUMBER SIGN in a French Mac layout on ISO + * keyboards, and LESS-THAN SIGN and GREATER-THAN + * SIGN in a Swiss German, German, or French Mac + * layout on ANSI keyboards. + */ SDL_SCANCODE_COMMA = 54, SDL_SCANCODE_PERIOD = 55, SDL_SCANCODE_SLASH = 56, @@ -122,7 +166,8 @@ typedef enum SDL_SCANCODE_PRINTSCREEN = 70, SDL_SCANCODE_SCROLLLOCK = 71, SDL_SCANCODE_PAUSE = 72, - SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but does send code 73, not 117) */ + SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + does send code 73, not 117) */ SDL_SCANCODE_HOME = 74, SDL_SCANCODE_PAGEUP = 75, SDL_SCANCODE_DELETE = 76, @@ -133,7 +178,8 @@ typedef enum SDL_SCANCODE_DOWN = 81, SDL_SCANCODE_UP = 82, - SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards */ + SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards + */ SDL_SCANCODE_KP_DIVIDE = 84, SDL_SCANCODE_KP_MULTIPLY = 85, SDL_SCANCODE_KP_MINUS = 86, @@ -151,9 +197,20 @@ typedef enum SDL_SCANCODE_KP_0 = 98, SDL_SCANCODE_KP_PERIOD = 99, - SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO keyboards have over ANSI ones, located between left shift and Y. Produces GRAVE ACCENT and TILDE in a US or UK Mac layout, REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US or UK Windows layout, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French layout. */ + SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO + * keyboards have over ANSI ones, + * located between left shift and Y. + * Produces GRAVE ACCENT and TILDE in a + * US or UK Mac layout, REVERSE SOLIDUS + * (backslash) and VERTICAL LINE in a + * US or UK Windows layout, and + * LESS-THAN SIGN and GREATER-THAN SIGN + * in a Swiss German, German, or French + * layout. */ SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ - SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, not a physical key - but some Mac keyboards do have a power key. */ + SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + * not a physical key - but some Mac keyboards + * do have a power key. */ SDL_SCANCODE_KP_EQUALS = 103, SDL_SCANCODE_F13 = 104, SDL_SCANCODE_F14 = 105, @@ -172,7 +229,7 @@ typedef enum SDL_SCANCODE_MENU = 118, SDL_SCANCODE_SELECT = 119, SDL_SCANCODE_STOP = 120, - SDL_SCANCODE_AGAIN = 121, /*!< redo */ + SDL_SCANCODE_AGAIN = 121, /**< redo */ SDL_SCANCODE_UNDO = 122, SDL_SCANCODE_CUT = 123, SDL_SCANCODE_COPY = 124, @@ -188,7 +245,8 @@ typedef enum SDL_SCANCODE_KP_COMMA = 133, SDL_SCANCODE_KP_EQUALSAS400 = 134, - SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see footnotes in USB doc */ + SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + footnotes in USB doc */ SDL_SCANCODE_INTERNATIONAL2 = 136, SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ SDL_SCANCODE_INTERNATIONAL4 = 138, @@ -276,9 +334,19 @@ typedef enum SDL_SCANCODE_RALT = 230, /**< alt gr, option */ SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ - SDL_SCANCODE_MODE = 257, /* I'm not sure if this is really not covered by any of the above, but since there's a special KMOD_MODE for it I'm adding it here */ + SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered + * by any of the above, but since there's a + * special KMOD_MODE for it I'm adding it here + */ - /* These values are mapped from usage page 0x0C (USB consumer page) */ + /* @} *//* Usage page 0x07 */ + + /** + * \name Usage page 0x0C + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ SDL_SCANCODE_AUDIONEXT = 258, SDL_SCANCODE_AUDIOPREV = 259, @@ -298,21 +366,35 @@ typedef enum SDL_SCANCODE_AC_REFRESH = 273, SDL_SCANCODE_AC_BOOKMARKS = 274, - /* These are values that Christian Walther added (for mac keyboard?) */ + /* @} *//* Usage page 0x0C */ + + /** + * \name Walther keys + * + * These are values that Christian Walther added (for mac keyboard?). + */ + /* @{ */ SDL_SCANCODE_BRIGHTNESSDOWN = 275, SDL_SCANCODE_BRIGHTNESSUP = 276, - SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display switch, video mode switch */ + SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display + switch, video mode switch */ SDL_SCANCODE_KBDILLUMTOGGLE = 278, SDL_SCANCODE_KBDILLUMDOWN = 279, SDL_SCANCODE_KBDILLUMUP = 280, SDL_SCANCODE_EJECT = 281, SDL_SCANCODE_SLEEP = 282, - /* Add any other keys here */ + SDL_SCANCODE_APP1 = 283, + SDL_SCANCODE_APP2 = 284, - SDL_NUM_SCANCODES = 512 /**< (not a key, just marks the number of scancodes for array bounds) */ -} SDL_scancode; + /* @} *//* Walther keys */ + + /* Add any other keys here. */ + + SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes + for array bounds */ +} SDL_Scancode; #endif /* _SDL_scancode_h */ diff --git a/Externals/SDL2-2.0.1/include/SDL_shape.h b/Externals/SDL2-2.0.1/include/SDL_shape.h new file mode 100644 index 0000000000..63f850c942 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_shape.h @@ -0,0 +1,143 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_shape_h +#define _SDL_shape_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** \file SDL_shape.h + * + * Header file for the shaped window API. + */ + +#define SDL_NONSHAPEABLE_WINDOW -1 +#define SDL_INVALID_SHAPE_ARGUMENT -2 +#define SDL_WINDOW_LACKS_SHAPE -3 + +/** + * \brief Create a window that can be shaped with the specified position, dimensions, and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with any of the following: + * ::SDL_WINDOW_OPENGL, ::SDL_WINDOW_INPUT_GRABBED, + * ::SDL_WINDOW_HIDDEN, ::SDL_WINDOW_RESIZABLE, + * ::SDL_WINDOW_MAXIMIZED, ::SDL_WINDOW_MINIMIZED, + * ::SDL_WINDOW_BORDERLESS is always set, and ::SDL_WINDOW_FULLSCREEN is always unset. + * + * \return The window created, or NULL if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); + +/** + * \brief Return whether the given window is a shaped window. + * + * \param window The window to query for being shaped. + * + * \return SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if the window is unshaped or NULL. + * \sa SDL_CreateShapedWindow + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsShapedWindow(const SDL_Window *window); + +/** \brief An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. */ +typedef enum { + /** \brief The default mode, a binarized alpha cutoff of 1. */ + ShapeModeDefault, + /** \brief A binarized alpha cutoff with a given integer value. */ + ShapeModeBinarizeAlpha, + /** \brief A binarized alpha cutoff with a given integer value, but with the opposite comparison. */ + ShapeModeReverseBinarizeAlpha, + /** \brief A color key is applied. */ + ShapeModeColorKey +} WindowShapeMode; + +#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha) + +/** \brief A union containing parameters for shaped windows. */ +typedef union { + /** \brief a cutoff alpha value for binarization of the window shape's alpha channel. */ + Uint8 binarizationCutoff; + SDL_Color colorKey; +} SDL_WindowShapeParams; + +/** \brief A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. */ +typedef struct SDL_WindowShapeMode { + /** \brief The mode of these window-shape parameters. */ + WindowShapeMode mode; + /** \brief Window-shape parameters. */ + SDL_WindowShapeParams parameters; +} SDL_WindowShapeMode; + +/** + * \brief Set the shape and parameters of a shaped window. + * + * \param window The shaped window whose parameters should be set. + * \param shape A surface encoding the desired shape for the window. + * \param shape_mode The parameters to set for the shaped window. + * + * \return 0 on success, SDL_INVALID_SHAPE_ARGUMENT on invalid an invalid shape argument, or SDL_NONSHAPEABLE_WINDOW + * if the SDL_Window* given does not reference a valid shaped window. + * + * \sa SDL_WindowShapeMode + * \sa SDL_GetShapedWindowMode. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); + +/** + * \brief Get the shape parameters of a shaped window. + * + * \param window The shaped window whose parameters should be retrieved. + * \param shape_mode An empty shape-mode structure to fill, or NULL to check whether the window has a shape. + * + * \return 0 if the window has a shape and, provided shape_mode was not NULL, shape_mode has been filled with the mode + * data, SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped window, or SDL_WINDOW_LACKS_SHAPE if + * the SDL_Window* given is a shapeable window currently lacking a shape. + * + * \sa SDL_WindowShapeMode + * \sa SDL_SetWindowShape + */ +extern DECLSPEC int SDLCALL SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_shape_h */ diff --git a/Externals/SDL2-2.0.1/include/SDL_stdinc.h b/Externals/SDL2-2.0.1/include/SDL_stdinc.h new file mode 100644 index 0000000000..8f17d5519a --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_stdinc.h @@ -0,0 +1,392 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_stdinc.h + * + * This is a general header that includes C language support. + */ + +#ifndef _SDL_stdinc_h +#define _SDL_stdinc_h + +#include "SDL_config.h" + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#ifdef HAVE_MATH_H +# include +#endif +#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) +# include +#endif + +/** + * The number of elements in an array. + */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/** + * \name Cast operators + * + * Use proper C++ casts when compiled as C++ to be compatible with the option + * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). + */ +/* @{ */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#define SDL_const_cast(type, expression) const_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#define SDL_const_cast(type, expression) ((type)(expression)) +#endif +/* @} *//* Cast operators */ + +/* Define a four character code as a Uint32 */ +#define SDL_FOURCC(A, B, C, D) \ + ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) + +/** + * \name Basic data types + */ +/* @{ */ + +typedef enum +{ + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; + +/** + * \brief A signed 8-bit integer type. + */ +typedef int8_t Sint8; +/** + * \brief An unsigned 8-bit integer type. + */ +typedef uint8_t Uint8; +/** + * \brief A signed 16-bit integer type. + */ +typedef int16_t Sint16; +/** + * \brief An unsigned 16-bit integer type. + */ +typedef uint16_t Uint16; +/** + * \brief A signed 32-bit integer type. + */ +typedef int32_t Sint32; +/** + * \brief An unsigned 32-bit integer type. + */ +typedef uint32_t Uint32; + +/** + * \brief A signed 64-bit integer type. + */ +typedef int64_t Sint64; +/** + * \brief An unsigned 64-bit integer type. + */ +typedef uint64_t Uint64; + +/* @} *//* Basic data types */ + + +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_dummy_ ## name[(x) * 2 - 1] +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +/* Check to make sure enums are the size of ints, for structure packing. + For both Watcom C/C++ and Borland C/C++ the compiler option that makes + enums having the size of an int must be enabled. + This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). +*/ + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +#if !defined(__ANDROID__) + /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ +typedef enum +{ + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) +#pragma alloca +# elif defined(__MRC__) +void *alloca(unsigned); +# else +char *alloca(); +# endif +#endif +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); +extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); +extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); +extern DECLSPEC void SDLCALL SDL_free(void *mem); + +extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); +extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); + +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *)); + +extern DECLSPEC int SDLCALL SDL_abs(int x); + +/* !!! FIXME: these have side effects. You probably shouldn't use them. */ +/* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */ +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) + +extern DECLSPEC int SDLCALL SDL_isdigit(int x); +extern DECLSPEC int SDLCALL SDL_isspace(int x); +extern DECLSPEC int SDLCALL SDL_toupper(int x); +extern DECLSPEC int SDLCALL SDL_tolower(int x); + +extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len); + +#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) +#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) + +/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ +SDL_FORCE_INLINE void SDL_memset4(void *dst, int val, size_t dwords) +{ +#if defined(__GNUC__) && defined(i386) + int u0, u1, u2; + __asm__ __volatile__ ( + "cld \n\t" + "rep ; stosl \n\t" + : "=&D" (u0), "=&a" (u1), "=&c" (u2) + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) + : "memory" + ); +#else + size_t _n = (dwords + 3) / 4; + Uint32 *_p = SDL_static_cast(Uint32 *, dst); + Uint32 _val = (val); + if (dwords == 0) + return; + switch (dwords % 4) + { + case 0: do { *_p++ = _val; + case 3: *_p++ = _val; + case 2: *_p++ = _val; + case 1: *_p++ = _val; + } while ( --_n ); + } +#endif +} + + +extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); + +SDL_FORCE_INLINE void *SDL_memcpy4(void *dst, const void *src, size_t dwords) +{ + return SDL_memcpy(dst, src, dwords * 4); +} + +extern DECLSPEC void *SDLCALL SDL_memmove(void *dst, const void *src, size_t len); +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); +extern DECLSPEC size_t SDLCALL SDL_wcslcpy(wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcat(wchar_t *dst, const wchar_t *src, size_t maxlen); + +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(char *dst, const char *src, size_t dst_bytes); +extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); +extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); +extern DECLSPEC char *SDLCALL SDL_strrev(char *str); +extern DECLSPEC char *SDLCALL SDL_strupr(char *str); +extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); +extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); + +extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); + +extern DECLSPEC int SDLCALL SDL_atoi(const char *str); +extern DECLSPEC double SDLCALL SDL_atof(const char *str); +extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); +extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); + +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); + +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); +extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); + +#ifndef HAVE_M_PI +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 /* pi */ +#endif +#endif + +extern DECLSPEC double SDLCALL SDL_atan(double x); +extern DECLSPEC double SDLCALL SDL_atan2(double x, double y); +extern DECLSPEC double SDLCALL SDL_ceil(double x); +extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); +extern DECLSPEC double SDLCALL SDL_cos(double x); +extern DECLSPEC float SDLCALL SDL_cosf(float x); +extern DECLSPEC double SDLCALL SDL_fabs(double x); +extern DECLSPEC double SDLCALL SDL_floor(double x); +extern DECLSPEC double SDLCALL SDL_log(double x); +extern DECLSPEC double SDLCALL SDL_pow(double x, double y); +extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); +extern DECLSPEC double SDLCALL SDL_sin(double x); +extern DECLSPEC float SDLCALL SDL_sinf(float x); +extern DECLSPEC double SDLCALL SDL_sqrt(double x); + +/* The SDL implementation of iconv() returns these error codes */ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 + +/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, + const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, + size_t * inbytesleft, char **outbuf, + size_t * outbytesleft); +/** + * This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + */ +extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, + const char *fromcode, + const char *inbuf, + size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_stdinc_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_surface.h b/Externals/SDL2-2.0.1/include/SDL_surface.h new file mode 100644 index 0000000000..e18153a694 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_surface.h @@ -0,0 +1,503 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_surface.h + * + * Header file for ::SDL_Surface definition and management functions. + */ + +#ifndef _SDL_surface_h +#define _SDL_surface_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_blendmode.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Surface flags + * + * These are the currently supported flags for the ::SDL_Surface. + * + * \internal + * Used internally (read-only). + */ +/* @{ */ +#define SDL_SWSURFACE 0 /**< Just here for compatibility */ +#define SDL_PREALLOC 0x00000001 /**< Surface uses preallocated memory */ +#define SDL_RLEACCEL 0x00000002 /**< Surface is RLE encoded */ +#define SDL_DONTFREE 0x00000004 /**< Surface is referenced internally */ +/* @} *//* Surface flags */ + +/** + * Evaluates to true if the surface needs to be locked before access. + */ +#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0) + +/** + * \brief A collection of pixels used in software blitting. + * + * \note This structure should be treated as read-only, except for \c pixels, + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface +{ + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + int pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + + /** Application data associated with the surface */ + void *userdata; /**< Read-write */ + + /** information needed for surfaces requiring locks */ + int locked; /**< Read-only */ + void *lock_data; /**< Read-only */ + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + + /** info for fast blit mapping to other surfaces */ + struct SDL_BlitMap *map; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** + * \brief The type of function used for surface blitting functions. + */ +typedef int (*SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, + struct SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Allocate and free an RGB surface. + * + * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. + * If the depth is greater than 8 bits, the pixel format is set using the + * flags '[RGB]mask'. + * + * If the function runs out of memory, it will return NULL. + * + * \param flags The \c flags are obsolete and should be set to 0. + * \param width The width in pixels of the surface to create. + * \param height The height in pixels of the surface to create. + * \param depth The depth in bits of the surface to create. + * \param Rmask The red mask of the surface to create. + * \param Gmask The green mask of the surface to create. + * \param Bmask The blue mask of the surface to create. + * \param Amask The alpha mask of the surface to create. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, + int height, + int depth, + int pitch, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface); + +/** + * \brief Set the palette used by a surface. + * + * \return 0, or -1 if the surface format doesn't use a palette. + * + * \note A single palette can be shared with many surfaces. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface, + SDL_Palette * palette); + +/** + * \brief Sets up a surface for directly accessing the pixels. + * + * Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write + * to and read from \c surface->pixels, using the pixel format stored in + * \c surface->format. Once you are done accessing the surface, you should + * use SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates + * to 0, then you can read and write to the surface at any time, and the + * pixel format of the surface will not change. + * + * No operating system or library calls should be made between lock/unlock + * pairs, as critical system locks may be held during this time. + * + * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. + * + * \sa SDL_UnlockSurface() + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface); +/** \sa SDL_LockSurface() */ +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface); + +/** + * Load a surface from a seekable SDL data stream (memory or file). + * + * If \c freesrc is non-zero, the stream will be closed after being read. + * + * The new surface should be freed with SDL_FreeSurface(). + * + * \return the new surface, or NULL if there was an error. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src, + int freesrc); + +/** + * Load a surface from a file. + * + * Convenience macro. + */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data stream (memory or file). + * + * If \c freedst is non-zero, the stream will be closed after being written. + * + * \return 0 if successful or -1 if there was an error. + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface * surface, SDL_RWops * dst, int freedst); + +/** + * Save a surface to a file. + * + * Convenience macro. + */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * \brief Sets the RLE acceleration hint for a surface. + * + * \return 0 on success, or -1 if the surface is not valid + * + * \note If RLE is enabled, colorkey and alpha blending blits are much faster, + * but the surface must be locked before directly accessing the pixels. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface, + int flag); + +/** + * \brief Sets the color key (transparent pixel) in a blittable surface. + * + * \param surface The surface to update + * \param flag Non-zero to enable colorkey and 0 to disable colorkey + * \param key The transparent pixel in the native surface format + * + * \return 0 on success, or -1 if the surface is not valid + * + * You can pass SDL_RLEACCEL to enable RLE accelerated blits. + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface, + int flag, Uint32 key); + +/** + * \brief Gets the color key (transparent pixel) in a blittable surface. + * + * \param surface The surface to update + * \param key A pointer filled in with the transparent pixel in the native + * surface format + * + * \return 0 on success, or -1 if the surface is not valid or colorkey is not + * enabled. + */ +extern DECLSPEC int SDLCALL SDL_GetColorKey(SDL_Surface * surface, + Uint32 * key); + +/** + * \brief Set an additional color value used in blit operations. + * + * \param surface The surface to update. + * \param r The red color value multiplied into blit operations. + * \param g The green color value multiplied into blit operations. + * \param b The blue color value multiplied into blit operations. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_GetSurfaceColorMod() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * \brief Get the additional color value used in blit operations. + * + * \param surface The surface to query. + * \param r A pointer filled in with the current red color value. + * \param g A pointer filled in with the current green color value. + * \param b A pointer filled in with the current blue color value. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceColorMod() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * \brief Set an additional alpha value used in blit operations. + * + * \param surface The surface to update. + * \param alpha The alpha value multiplied into blit operations. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_GetSurfaceAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 alpha); + +/** + * \brief Get the additional alpha value used in blit operations. + * + * \param surface The surface to query. + * \param alpha A pointer filled in with the current alpha value. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceAlphaMod() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 * alpha); + +/** + * \brief Set the blend mode used for blit operations. + * + * \param surface The surface to update. + * \param blendMode ::SDL_BlendMode to use for blit blending. + * + * \return 0 on success, or -1 if the parameters are not valid. + * + * \sa SDL_GetSurfaceBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode blendMode); + +/** + * \brief Get the blend mode used for blit operations. + * + * \param surface The surface to query. + * \param blendMode A pointer filled in with the current blend mode. + * + * \return 0 on success, or -1 if the surface is not valid. + * + * \sa SDL_SetSurfaceBlendMode() + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode *blendMode); + +/** + * Sets the clipping rectangle for the destination surface in a blit. + * + * If the clip rectangle is NULL, clipping will be disabled. + * + * If the clip rectangle doesn't intersect the surface, the function will + * return SDL_FALSE and blits will be completely clipped. Otherwise the + * function returns SDL_TRUE and blits to the surface will be clipped to + * the intersection of the surface area and the clipping rectangle. + * + * Note that blits are automatically clipped to the edges of the source + * and destination surfaces. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, + const SDL_Rect * rect); + +/** + * Gets the clipping rectangle for the destination surface in a blit. + * + * \c rect must be a pointer to a valid rectangle which will be filled + * with the correct values. + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, + SDL_Rect * rect); + +/** + * Creates a new surface of the specified format, and then copies and maps + * the given surface to it so the blit of the converted surface will be as + * fast as possible. If this function fails, it returns NULL. + * + * The \c flags parameter is passed to SDL_CreateRGBSurface() and has those + * semantics. You can also pass ::SDL_RLEACCEL in the flags parameter and + * SDL will try to RLE accelerate colorkey and alpha blits in the resulting + * surface. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface + (SDL_Surface * src, const SDL_PixelFormat * fmt, Uint32 flags); +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurfaceFormat + (SDL_Surface * src, Uint32 pixel_format, Uint32 flags); + +/** + * \brief Copy a block of pixels of one format to another format + * + * \return 0 on success, or -1 if there was an error + */ +extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Performs a fast fill of the given rectangle with \c color. + * + * If \c rect is NULL, the whole surface will be filled with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color); +extern DECLSPEC int SDLCALL SDL_FillRects + (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color); + +/** + * Performs a fast blit from the source surface to the destination surface. + * + * This assumes that the source and destination rectangles are + * the same size. If either \c srcrect or \c dstrect are NULL, the entire + * surface (\c src or \c dst) is copied. The final blit rectangles are saved + * in \c srcrect and \c dstrect after all clipping is performed. + * + * \return If the blit is successful, it returns 0, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without blending and colorkey + * are defined as follows: + * \verbatim + RGBA->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB, set destination alpha to source per-surface alpha value. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + + RGBA->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy all of RGBA to the destination. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + \endverbatim + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** + * This is the public blit function, SDL_BlitSurface(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlit() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * This is a semi-private blit function and it performs low-level surface + * blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * \brief Perform a fast, low quality, stretch blit between two surfaces of the + * same pixel format. + * + * \note This function uses a static buffer, and is not thread-safe. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + +#define SDL_BlitScaled SDL_UpperBlitScaled + +/** + * This is the public scaled blit function, SDL_BlitScaled(), and it performs + * rectangle validation and clipping before passing it to SDL_LowerBlitScaled() + */ +extern DECLSPEC int SDLCALL SDL_UpperBlitScaled + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * This is a semi-private blit function and it performs low-level surface + * scaled blitting only. + */ +extern DECLSPEC int SDLCALL SDL_LowerBlitScaled + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_surface_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_system.h b/Externals/SDL2-2.0.1/include/SDL_system.h new file mode 100644 index 0000000000..9af2a4c2ce --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_system.h @@ -0,0 +1,121 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_system.h + * + * Include file for platform specific SDL API functions + */ + +#ifndef _SDL_system_h +#define _SDL_system_h + +#include "SDL_stdinc.h" +#include "SDL_keyboard.h" +#include "SDL_render.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* Platform specific functions for Windows */ +#ifdef __WIN32__ + +/* Returns the D3D9 adapter index that matches the specified display index. + This adapter index can be passed to IDirect3D9::CreateDevice and controls + on which monitor a full screen application will appear. +*/ +extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); + +/* Returns the D3D device associated with a renderer, or NULL if it's not a D3D renderer. + Once you are done using the device, you should release it to avoid a resource leak. + */ +typedef struct IDirect3DDevice9 IDirect3DDevice9; +extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); + +#endif /* __WIN32__ */ + + +/* Platform specific functions for iOS */ +#if defined(__IPHONEOS__) && __IPHONEOS__ + +extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); +extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); + +#endif /* __IPHONEOS__ */ + + +/* Platform specific functions for Android */ +#if defined(__ANDROID__) && __ANDROID__ + +/* Get the JNI environment for the current thread + This returns JNIEnv*, but the prototype is void* so we don't need jni.h + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(); + +/* Get the SDL Activity object for the application + This returns jobject, but the prototype is void* so we don't need jni.h + The jobject returned by SDL_AndroidGetActivity is a local reference. + It is the caller's responsibility to properly release it + (using env->Push/PopLocalFrame or manually with env->DeleteLocalRef) + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetActivity(); + +/* See the official Android developer guide for more information: + http://developer.android.com/guide/topics/data/data-storage.html +*/ +#define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 +#define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 + +/* Get the path used for internal storage for this application. + This path is unique to your application and cannot be written to + by other applications. + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath(); + +/* Get the current state of external storage, a bitmask of these values: + SDL_ANDROID_EXTERNAL_STORAGE_READ + SDL_ANDROID_EXTERNAL_STORAGE_WRITE + If external storage is currently unavailable, this will return 0. +*/ +extern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState(); + +/* Get the path used for external storage for this application. + This path is unique to your application, but is public and can be + written to by other applications. + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath(); + +#endif /* __ANDROID__ */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_system_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_syswm.h b/Externals/SDL2-2.0.1/include/SDL_syswm.h new file mode 100644 index 0000000000..5e4454f86e --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_syswm.h @@ -0,0 +1,237 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_syswm.h + * + * Include file for SDL custom system window manager hooks. + */ + +#ifndef _SDL_syswm_h +#define _SDL_syswm_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_version.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_syswm.h + * + * Your application has access to a special type of event ::SDL_SYSWMEVENT, + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState(). + */ +#ifdef SDL_PROTOTYPES_ONLY +struct SDL_SysWMinfo; +#else + +#if defined(SDL_VIDEO_DRIVER_WINDOWS) +#define WIN32_LEAN_AND_MEAN +#include +#endif + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +#endif /* defined(SDL_VIDEO_DRIVER_X11) */ + +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_COCOA) +#ifdef __OBJC__ +#include +#else +typedef struct _NSWindow NSWindow; +#endif +#endif + +#if defined(SDL_VIDEO_DRIVER_UIKIT) +#ifdef __OBJC__ +#include +#else +typedef struct _UIWindow UIWindow; +#endif +#endif + +/** + * These are the various supported windowing subsystems + */ +typedef enum +{ + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, + SDL_SYSWM_X11, + SDL_SYSWM_DIRECTFB, + SDL_SYSWM_COCOA, + SDL_SYSWM_UIKIT, +} SDL_SYSWM_TYPE; + +/** + * The custom event structure. + */ +struct SDL_SysWMmsg +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct { + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct { + XEvent event; + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct { + DFBEvent event; + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + /* No Cocoa window events yet */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + /* No UIKit window events yet */ + } uikit; +#endif + /* Can't have an empty union */ + int dummy; + } msg; +}; + +/** + * The custom window manager information structure. + * + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +struct SDL_SysWMinfo +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct + { + HWND window; /**< The window handle */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct + { + Display *display; /**< The X11 display */ + Window window; /**< The X11 window */ + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct + { + IDirectFB *dfb; /**< The directfb main interface */ + IDirectFBWindow *window; /**< The directfb window handle */ + IDirectFBSurface *surface; /**< The directfb client surface */ + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + NSWindow *window; /* The Cocoa window */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + UIWindow *window; /* The UIKit window */ + } uikit; +#endif + /* Can't have an empty union */ + int dummy; + } info; +}; + +#endif /* SDL_PROTOTYPES_ONLY */ + +typedef struct SDL_SysWMinfo SDL_SysWMinfo; + +/* Function prototypes */ +/** + * \brief This function allows access to driver-dependent window information. + * + * \param window The window about which information is being requested + * \param info This structure must be initialized with the SDL version, and is + * then filled in with information about the given window. + * + * \return SDL_TRUE if the function is implemented and the version member of + * the \c info struct is valid, SDL_FALSE otherwise. + * + * You typically use this function like this: + * \code + * SDL_SysWMinfo info; + * SDL_VERSION(&info.version); + * if ( SDL_GetWindowWMInfo(window, &info) ) { ... } + * \endcode + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, + SDL_SysWMinfo * info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_syswm_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test.h b/Externals/SDL2-2.0.1/include/SDL_test.h new file mode 100644 index 0000000000..7e0de08948 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test.h @@ -0,0 +1,68 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef _SDL_test_h +#define _SDL_test_h + +#include "SDL.h" +#include "SDL_test_common.h" +#include "SDL_test_font.h" +#include "SDL_test_random.h" +#include "SDL_test_fuzzer.h" +#include "SDL_test_crc32.h" +#include "SDL_test_md5.h" +#include "SDL_test_log.h" +#include "SDL_test_assert.h" +#include "SDL_test_harness.h" +#include "SDL_test_images.h" +#include "SDL_test_compare.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Global definitions */ + +/* + * Note: Maximum size of SDLTest log message is less than SDLs limit + * to ensure we can fit additional information such as the timestamp. + */ +#define SDLTEST_MAX_LOGMESSAGE_LENGTH 3584 + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_assert.h b/Externals/SDL2-2.0.1/include/SDL_test_assert.h new file mode 100644 index 0000000000..beba16f5ed --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_assert.h @@ -0,0 +1,105 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_assert.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Assert API for test code and test cases + * + */ + +#ifndef _SDL_test_assert_h +#define _SDL_test_assert_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Fails the assert. + */ +#define ASSERT_FAIL 0 + +/** + * \brief Passes the assert. + */ +#define ASSERT_PASS 1 + +/** + * \brief Assert that logs and break execution flow on failures. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_Assert(int assertCondition, const char *assertDescription, ...); + +/** + * \brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + * + * \returns Returns the assertCondition so it can be used to externally to break execution flow if desired. + */ +int SDLTest_AssertCheck(int assertCondition, const char *assertDescription, ...); + +/** + * \brief Explicitely pass without checking an assertion condition. Updates assertion counter. + * + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_AssertPass(const char *assertDescription, ...); + +/** + * \brief Resets the assert summary counters to zero. + */ +void SDLTest_ResetAssertSummary(); + +/** + * \brief Logs summary of all assertions (total, pass, fail) since last reset as INFO or ERROR. + */ +void SDLTest_LogAssertSummary(); + + +/** + * \brief Converts the current assert summary state to a test result. + * + * \returns TEST_RESULT_PASSED, TEST_RESULT_FAILED, or TEST_RESULT_NO_ASSERT + */ +int SDLTest_AssertSummaryToTestResult(); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_assert_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_common.h b/Externals/SDL2-2.0.1/include/SDL_test_common.h new file mode 100644 index 0000000000..57f31146e5 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_common.h @@ -0,0 +1,187 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_common.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* Ported from original test\common.h file. */ + +#ifndef _SDL_test_common_h +#define _SDL_test_common_h + +#include "SDL.h" + +#if defined(__PSP__) +#define DEFAULT_WINDOW_WIDTH 480 +#define DEFAULT_WINDOW_HEIGHT 272 +#else +#define DEFAULT_WINDOW_WIDTH 640 +#define DEFAULT_WINDOW_HEIGHT 480 +#endif + +#define VERBOSE_VIDEO 0x00000001 +#define VERBOSE_MODES 0x00000002 +#define VERBOSE_RENDER 0x00000004 +#define VERBOSE_EVENT 0x00000008 +#define VERBOSE_AUDIO 0x00000010 + +typedef struct +{ + /* SDL init flags */ + char **argv; + Uint32 flags; + Uint32 verbose; + + /* Video info */ + const char *videodriver; + int display; + const char *window_title; + const char *window_icon; + Uint32 window_flags; + int window_x; + int window_y; + int window_w; + int window_h; + int window_minW; + int window_minH; + int window_maxW; + int window_maxH; + int logical_w; + int logical_h; + float scale; + int depth; + int refresh_rate; + int num_windows; + SDL_Window **windows; + + /* Renderer info */ + const char *renderdriver; + Uint32 render_flags; + SDL_bool skip_renderer; + SDL_Renderer **renderers; + + /* Audio info */ + const char *audiodriver; + SDL_AudioSpec audiospec; + + /* GL settings */ + int gl_red_size; + int gl_green_size; + int gl_blue_size; + int gl_alpha_size; + int gl_buffer_size; + int gl_depth_size; + int gl_stencil_size; + int gl_double_buffer; + int gl_accum_red_size; + int gl_accum_green_size; + int gl_accum_blue_size; + int gl_accum_alpha_size; + int gl_stereo; + int gl_multisamplebuffers; + int gl_multisamplesamples; + int gl_retained_backing; + int gl_accelerated; + int gl_major_version; + int gl_minor_version; + int gl_debug; + int gl_profile_mask; +} SDLTest_CommonState; + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Parse command line parameters and create common state. + * + * \param argv Array of command line parameters + * \param flags Flags indicating which subsystem to initialize (i.e. SDL_INIT_VIDEO | SDL_INIT_AUDIO) + * + * \returns Returns a newly allocated common state object. + */ +SDLTest_CommonState *SDLTest_CommonCreateState(char **argv, Uint32 flags); + +/** + * \brief Process one common argument. + * + * \param state The common state describing the test window to create. + * \param index The index of the argument to process in argv[]. + * + * \returns The number of arguments processed (i.e. 1 for --fullscreen, 2 for --video [videodriver], or -1 on error. + */ +int SDLTest_CommonArg(SDLTest_CommonState * state, int index); + +/** + * \brief Returns common usage information + * + * \param state The common state describing the test window to create. + * + * \returns String with usage information + */ +const char *SDLTest_CommonUsage(SDLTest_CommonState * state); + +/** + * \brief Open test window. + * + * \param state The common state describing the test window to create. + * + * \returns True if initialization succeeded, false otherwise + */ +SDL_bool SDLTest_CommonInit(SDLTest_CommonState * state); + +/** + * \brief Common event handler for test windows. + * + * \param state The common state used to create test window. + * \param event The event to handle. + * \param done Flag indicating we are done. + * + */ +void SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done); + +/** + * \brief Close test window. + * + * \param state The common state used to create test window. + * + */ +void SDLTest_CommonQuit(SDLTest_CommonState * state); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_common_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_compare.h b/Externals/SDL2-2.0.1/include/SDL_test_compare.h new file mode 100644 index 0000000000..98ca8ce81e --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_compare.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_compare.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines comparison functions (i.e. for surfaces). + +*/ + +#ifndef _SDL_test_compare_h +#define _SDL_test_compare_h + +#include "SDL.h" + +#include "SDL_test_images.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Compares a surface and with reference image data for equality + * + * \param surface Surface used in comparison + * \param referenceSurface Test Surface used in comparison + * \param allowable_error Allowable difference (squared) in blending accuracy. + * + * \returns 0 if comparison succeeded, >0 (=number of pixels where comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. + */ +int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_compare_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_crc32.h b/Externals/SDL2-2.0.1/include/SDL_test_crc32.h new file mode 100644 index 0000000000..f0a84a48c2 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_crc32.h @@ -0,0 +1,124 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_crc32.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Implements CRC32 calculations (default output is Perl String::CRC32 compatible). + +*/ + +#ifndef _SDL_test_crc32_h +#define _SDL_test_crc32_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ------------ Definitions --------- */ + +/* Definition shared by all CRC routines */ + +#ifndef CrcUint32 + #define CrcUint32 unsigned int +#endif +#ifndef CrcUint8 + #define CrcUint8 unsigned char +#endif + +#ifdef ORIGINAL_METHOD + #define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */ +#else + #define CRC32_POLY 0xEDB88320 /* Perl String::CRC32 compatible */ +#endif + +/** + * Data structure for CRC32 (checksum) computation + */ + typedef struct { + CrcUint32 crc32_table[256]; /* CRC table */ + } SDLTest_Crc32Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * /brief Initialize the CRC context + * + * Note: The function initializes the crc table required for all crc calculations. + * + * /param crcContext pointer to context variable + * + * /returns 0 for OK, -1 on error + * + */ + int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext); + + +/** + * /brief calculate a crc32 from a data block + * + * /param crcContext pointer to context variable + * /param inBuf input buffer to checksum + * /param inLen length of input buffer + * /param crc32 pointer to Uint32 to store the final CRC into + * + * /returns 0 for OK, -1 on error + * + */ +int SDLTest_crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + +/* Same routine broken down into three steps */ +int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + + +/** + * /brief clean up CRC context + * + * /param crcContext pointer to context variable + * + * /returns 0 for OK, -1 on error + * +*/ + +int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_crc32_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_font.h b/Externals/SDL2-2.0.1/include/SDL_test_font.h new file mode 100644 index 0000000000..aa9286b4aa --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_font.h @@ -0,0 +1,62 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_font.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef _SDL_test_font_h +#define _SDL_test_font_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Draw a string in the currently set font. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the string. + * \param y The Y coordinate of the upper left corner of the string. + * \param s The string to draw. + * + * \returns Returns 0 on success, -1 on failure. + */ +int SDLTest_DrawString(SDL_Renderer * renderer, int x, int y, const char *s); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_font_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_fuzzer.h b/Externals/SDL2-2.0.1/include/SDL_test_fuzzer.h new file mode 100644 index 0000000000..a528ddc5e2 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_fuzzer.h @@ -0,0 +1,384 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_fuzzer.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Data generators for fuzzing test data in a reproducible way. + +*/ + +#ifndef _SDL_test_fuzzer_h +#define _SDL_test_fuzzer_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* + Based on GSOC code by Markus Kauppila +*/ + + +/** + * \file + * Note: The fuzzer implementation uses a static instance of random context + * internally which makes it thread-UNsafe. + */ + +/** + * Initializes the fuzzer for a test + * + * /param execKey Execution "Key" that initializes the random number generator uniquely for the test. + * + */ +void SDLTest_FuzzerInit(Uint64 execKey); + + +/** + * Returns a random Uint8 + * + * \returns Generated integer + */ +Uint8 SDLTest_RandomUint8(); + +/** + * Returns a random Sint8 + * + * \returns Generated signed integer + */ +Sint8 SDLTest_RandomSint8(); + + +/** + * Returns a random Uint16 + * + * \returns Generated integer + */ +Uint16 SDLTest_RandomUint16(); + +/** + * Returns a random Sint16 + * + * \returns Generated signed integer + */ +Sint16 SDLTest_RandomSint16(); + + +/** + * Returns a random integer + * + * \returns Generated integer + */ +Sint32 SDLTest_RandomSint32(); + + +/** + * Returns a random positive integer + * + * \returns Generated integer + */ +Uint32 SDLTest_RandomUint32(); + +/** + * Returns random Uint64. + * + * \returns Generated integer + */ +Uint64 SDLTest_RandomUint64(); + + +/** + * Returns random Sint64. + * + * \returns Generated signed integer + */ +Sint64 SDLTest_RandomSint64(); + +/** + * \returns random float in range [0.0 - 1.0[ + */ +float SDLTest_RandomUnitFloat(); + +/** + * \returns random double in range [0.0 - 1.0[ + */ +double SDLTest_RandomUnitDouble(); + +/** + * \returns random float. + * + */ +float SDLTest_RandomFloat(); + +/** + * \returns random double. + * + */ +double SDLTest_RandomDouble(); + +/** + * Returns a random boundary value for Uint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or 0 with error set + */ +Uint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100 + * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT8_MIN with error set + */ +Sint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain); + + +/** + * Returns a random boundary value for Sint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100 + * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT16_MIN with error set + */ +Sint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100 + * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT32_MIN with error set + */ +Sint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100 + * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns Random boundary value for the given range and domain or SINT64_MIN with error set + */ +Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain); + + +/** + * Returns integer in range [min, max] (inclusive). + * Min and max values can be negative values. + * If Max in smaller tham min, then the values are swapped. + * Min and max are the same value, that value will be returned. + * + * \param min Minimum inclusive value of returned random number + * \param max Maximum inclusive value of returned random number + * + * \returns Generated random integer in range + */ +Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max); + + +/** + * Generates random null-terminated string. The minimum length for + * the string is 1 character, maximum length for the string is 255 + * characters and it can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \returns Newly allocated random string; or NULL if length was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiString(); + + +/** + * Generates random null-terminated string. The maximum length for + * the string is defined by the maxLength parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param maxLength The maximum length of the generated string. + * + * \returns Newly allocated random string; or NULL if maxLength was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength); + + +/** + * Generates random null-terminated string. The length for + * the string is defined by the size parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param size The length of the generated string + * + * \returns Newly allocated random string; or NULL if size was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringOfSize(int size); + +/** + * Returns the invocation count for the fuzzer since last ...FuzzerInit. + */ +int SDLTest_GetFuzzerInvocationCount(); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_fuzzer_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_harness.h b/Externals/SDL2-2.0.1/include/SDL_test_harness.h new file mode 100644 index 0000000000..935038e904 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_harness.h @@ -0,0 +1,123 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_harness.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + Defines types for test case definitions and the test execution harness API. + + Based on original GSOC code by Markus Kauppila +*/ + +#ifndef _SDL_test_harness_h +#define _SDL_test_harness_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ! Definitions for test case structures */ +#define TEST_ENABLED 1 +#define TEST_DISABLED 0 + +/* ! Definition of all the possible test return values of the test case method */ +#define TEST_ABORTED -1 +#define TEST_STARTED 0 +#define TEST_COMPLETED 1 +#define TEST_SKIPPED 2 + +/* ! Definition of all the possible test results for the harness */ +#define TEST_RESULT_PASSED 0 +#define TEST_RESULT_FAILED 1 +#define TEST_RESULT_NO_ASSERT 2 +#define TEST_RESULT_SKIPPED 3 +#define TEST_RESULT_SETUP_FAILURE 4 + +/* !< Function pointer to a test case setup function (run before every test) */ +typedef void (*SDLTest_TestCaseSetUpFp)(void *arg); + +/* !< Function pointer to a test case function */ +typedef int (*SDLTest_TestCaseFp)(void *arg); + +/* !< Function pointer to a test case teardown function (run after every test) */ +typedef void (*SDLTest_TestCaseTearDownFp)(void *arg); + +/** + * Holds information about a single test case. + */ +typedef struct SDLTest_TestCaseReference { + /* !< Func2Stress */ + SDLTest_TestCaseFp testCase; + /* !< Short name (or function name) "Func2Stress" */ + char *name; + /* !< Long name or full description "This test pushes func2() to the limit." */ + char *description; + /* !< Set to TEST_ENABLED or TEST_DISABLED (test won't be run) */ + int enabled; +} SDLTest_TestCaseReference; + +/** + * Holds information about a test suite (multiple test cases). + */ +typedef struct SDLTest_TestSuiteReference { + /* !< "PlatformSuite" */ + char *name; + /* !< The function that is run before each test. NULL skips. */ + SDLTest_TestCaseSetUpFp testSetUp; + /* !< The test cases that are run as part of the suite. Last item should be NULL. */ + const SDLTest_TestCaseReference **testCases; + /* !< The function that is run after each test. NULL skips. */ + SDLTest_TestCaseTearDownFp testTearDown; +} SDLTest_TestSuiteReference; + + +/** + * \brief Execute a test suite using the given run seed and execution key. + * + * \param testSuites Suites containing the test case. + * \param userRunSeed Custom run seed provided by user, or NULL to autogenerate one. + * \param userExecKey Custom execution key provided by user, or 0 to autogenerate one. + * \param filter Filter specification. NULL disables. Case sensitive. + * \param testIterations Number of iterations to run each test case. + * + * \returns Test run result; 0 when all tests passed, 1 if any tests failed. + */ +int SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_harness_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_images.h b/Externals/SDL2-2.0.1/include/SDL_test_images.h new file mode 100644 index 0000000000..21cf39ff7f --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_images.h @@ -0,0 +1,78 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_images.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines some images for tests. + +*/ + +#ifndef _SDL_test_images_h +#define _SDL_test_images_h + +#include "SDL.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + *Type for test images. + */ +typedef struct SDLTest_SurfaceImage_s { + int width; + int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + const char *pixel_data; +} SDLTest_SurfaceImage_t; + +/* Test images */ +SDL_Surface *SDLTest_ImageBlit(); +SDL_Surface *SDLTest_ImageBlitColor(); +SDL_Surface *SDLTest_ImageBlitAlpha(); +SDL_Surface *SDLTest_ImageBlitBlendAdd(); +SDL_Surface *SDLTest_ImageBlitBlend(); +SDL_Surface *SDLTest_ImageBlitBlendMod(); +SDL_Surface *SDLTest_ImageBlitBlendNone(); +SDL_Surface *SDLTest_ImageBlitBlendAll(); +SDL_Surface *SDLTest_ImageFace(); +SDL_Surface *SDLTest_ImagePrimitives(); +SDL_Surface *SDLTest_ImagePrimitivesBlend(); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_images_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_log.h b/Externals/SDL2-2.0.1/include/SDL_test_log.h new file mode 100644 index 0000000000..a581d2e754 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_log.h @@ -0,0 +1,67 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_log.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Wrapper to log in the TEST category + * + */ + +#ifndef _SDL_test_log_h +#define _SDL_test_log_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Prints given message with a timestamp in the TEST category and INFO priority. + * + * \param fmt Message to be logged + */ +void SDLTest_Log(const char *fmt, ...); + +/** + * \brief Prints given message with a timestamp in the TEST category and the ERROR priority. + * + * \param fmt Message to be logged + */ +void SDLTest_LogError(const char *fmt, ...); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_log_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_md5.h b/Externals/SDL2-2.0.1/include/SDL_test_md5.h new file mode 100644 index 0000000000..b0d4b7b041 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_md5.h @@ -0,0 +1,129 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_md5.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + *********************************************************************** + ** Header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + *********************************************************************** +*/ + +/* + *********************************************************************** + ** Message-digest routines: ** + ** To form the message digest for a message M ** + ** (1) Initialize a context buffer mdContext using MD5Init ** + ** (2) Call MD5Update on mdContext and M ** + ** (3) Call MD5Final on mdContext ** + ** The message digest is now in mdContext->digest[0...15] ** + *********************************************************************** +*/ + +#ifndef _SDL_test_md5_h +#define _SDL_test_md5_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------ Definitions --------- */ + +/* typedef a 32-bit type */ + typedef unsigned long int MD5UINT4; + +/* Data structure for MD5 (Message-Digest) computation */ + typedef struct { + MD5UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ + MD5UINT4 buf[4]; /* scratch buffer */ + unsigned char in[64]; /* input buffer */ + unsigned char digest[16]; /* actual digest after Md5Final call */ + } SDLTest_Md5Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * /brief initialize the context + * + * /param mdContext pointer to context variable + * + * Note: The function initializes the message-digest context + * mdContext. Call before each new use of the context - + * all fields are set to zero. + */ + void SDLTest_Md5Init(SDLTest_Md5Context * mdContext); + + +/** + * /brief update digest from variable length data + * + * /param mdContext pointer to context variable + * /param inBuf pointer to data array/string + * /param inLen length of data array/string + * + * Note: The function updates the message-digest context to account + * for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. +*/ + + void SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf, + unsigned int inLen); + + +/* + * /brief complete digest computation + * + * /param mdContext pointer to context variable + * + * Note: The function terminates the message-digest computation and + * ends with the desired message digest in mdContext.digest[0..15]. + * Always call before using the digest[] variable. +*/ + + void SDLTest_Md5Final(SDLTest_Md5Context * mdContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_md5_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_test_random.h b/Externals/SDL2-2.0.1/include/SDL_test_random.h new file mode 100644 index 0000000000..ce6192c257 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_test_random.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_random.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + A "32-bit Multiply with carry random number generator. Very fast. + Includes a list of recommended multipliers. + + multiply-with-carry generator: x(n) = a*x(n-1) + carry mod 2^32. + period: (a*2^31)-1 + +*/ + +#ifndef _SDL_test_random_h +#define _SDL_test_random_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Definitions */ + +/* + * Macros that return a random number in a specific format. + */ +#define SDLTest_RandomInt(c) ((int)SDLTest_Random(c)) + +/* + * Context structure for the random number generator state. + */ + typedef struct { + unsigned int a; + unsigned int x; + unsigned int c; + unsigned int ah; + unsigned int al; + } SDLTest_RandomContext; + + +/* --- Function prototypes */ + +/** + * \brief Initialize random number generator with two integers. + * + * Note: The random sequence of numbers returned by ...Random() is the + * same for the same two integers and has a period of 2^31. + * + * \param rndContext pointer to context structure + * \param xi integer that defines the random sequence + * \param ci integer that defines the random sequence + * + */ + void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, + unsigned int ci); + +/** + * \brief Initialize random number generator based on current system time. + * + * \param rndContext pointer to context structure + * + */ + void SDLTest_RandomInitTime(SDLTest_RandomContext *rndContext); + + +/** + * \brief Initialize random number generator based on current system time. + * + * Note: ...RandomInit() or ...RandomInitTime() must have been called + * before using this function. + * + * \param rndContext pointer to context structure + * + * \returns A random number (32bit unsigned integer) + * + */ + unsigned int SDLTest_Random(SDLTest_RandomContext *rndContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_test_random_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_thread.h b/Externals/SDL2-2.0.1/include/SDL_thread.h new file mode 100644 index 0000000000..f248c3d69c --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_thread.h @@ -0,0 +1,242 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_thread_h +#define _SDL_thread_h + +/** + * \file SDL_thread.h + * + * Header for the SDL thread management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_atomic.h" +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/* The SDL thread ID */ +typedef unsigned long SDL_threadID; + +/* Thread local storage ID, 0 is the invalid ID */ +typedef unsigned int SDL_TLSID; + +/** + * The SDL thread priority. + * + * \note On many systems you require special privileges to set high priority. + */ +typedef enum { + SDL_THREAD_PRIORITY_LOW, + SDL_THREAD_PRIORITY_NORMAL, + SDL_THREAD_PRIORITY_HIGH +} SDL_ThreadPriority; + +/** + * The function passed to SDL_CreateThread(). + * It is passed a void* user context parameter and returns an int. + */ +typedef int (SDLCALL * SDL_ThreadFunction) (void *data); + +#if defined(__WIN32__) && !defined(HAVE_LIBC) +/** + * \file SDL_thread.h + * + * We compile SDL into a DLL. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL.DLL will + * be initialized for those threads, and not the RTL of the calling + * application! + * + * To solve this, we make a little hack here. + * + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL.DLL which uses this API, + * then the RTL of SDL.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime + * library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD +#include /* This has _beginthread() and _endthread() defined! */ + +typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, + unsigned (__stdcall * + func) (void + *), + void *arg, unsigned, + unsigned *threadID); +typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); + +/** + * Create a thread. + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +/** + * Create a thread. + */ +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) + +#else + +/** + * Create a thread. + * + * Thread naming is a little complicated: Most systems have very small + * limits for the string length (BeOS has 32 bytes, Linux currently has 16, + * Visual C++ 6.0 has nine!), and possibly other arbitrary rules. You'll + * have to see what happens with your system's debugger. The name should be + * UTF-8 (but using the naming limits of C identifiers is a better bet). + * There are no requirements for thread naming conventions, so long as the + * string is null-terminated UTF-8, but these guidelines are helpful in + * choosing a name: + * + * http://stackoverflow.com/questions/149932/naming-conventions-for-threads + * + * If a system imposes requirements, SDL will try to munge the string for + * it (truncate, etc), but the original string contents will be available + * from SDL_GetThreadName(). + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); + +#endif + +/** + * Get the thread name, as it was specified in SDL_CreateThread(). + * This function returns a pointer to a UTF-8 string that names the + * specified thread, or NULL if it doesn't have a name. This is internal + * memory, not to be free()'d by the caller, and remains valid until the + * specified thread is cleaned up by SDL_WaitThread(). + */ +extern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread); + +/** + * Get the thread identifier for the current thread. + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); + +/** + * Get the thread identifier for the specified thread. + * + * Equivalent to SDL_ThreadID() if the specified thread is NULL. + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); + +/** + * Set the priority for the current thread + */ +extern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); + +/** + * Wait for a thread to finish. + * + * The return code for the thread function is placed in the area + * pointed to by \c status, if \c status is not NULL. + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); + +/** + * \brief Create an identifier that is globally visible to all threads but refers to data that is thread-specific. + * + * \return The newly created thread local storage identifier, or 0 on error + * + * \code + * static SDL_SpinLock tls_lock; + * static SDL_TLSID thread_local_storage; + * + * void SetMyThreadData(void *value) + * { + * if (!thread_local_storage) { + * SDL_AtomicLock(&tls_lock); + * if (!thread_local_storage) { + * thread_local_storage = SDL_TLSCreate(); + * } + * SDL_AtomicUnLock(&tls_lock); + * } + * SDL_TLSSet(thread_local_storage, value); + * } + * + * void *GetMyThreadData(void) + * { + * return SDL_TLSGet(thread_local_storage); + * } + * \endcode + * + * \sa SDL_TLSGet() + * \sa SDL_TLSSet() + */ +extern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void); + +/** + * \brief Get the value associated with a thread local storage ID for the current thread. + * + * \param id The thread local storage ID + * + * \return The value associated with the ID for the current thread, or NULL if no value has been set. + * + * \sa SDL_TLSCreate() + * \sa SDL_TLSSet() + */ +extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); + +/** + * \brief Set the value associated with a thread local storage ID for the current thread. + * + * \param id The thread local storage ID + * \param value The value to associate with the ID for the current thread + * \param destructor A function called when the thread exits, to free the value. + * + * \return 0 on success, -1 on error + * + * \sa SDL_TLSCreate() + * \sa SDL_TLSGet() + */ +extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (*destructor)(void*)); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_thread_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_timer.h b/Externals/SDL2-2.0.1/include/SDL_timer.h new file mode 100644 index 0000000000..28ab415b40 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_timer.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef _SDL_timer_h +#define _SDL_timer_h + +/** + * \file SDL_timer.h + * + * Header for the SDL time management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Get the number of milliseconds since the SDL library initialization. + * + * \note This value wraps if the program runs for more than ~49 days. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** + * \brief Compare SDL ticks values, and return true if A has passed B + * + * e.g. if you want to wait 100 ms, you could do this: + * Uint32 timeout = SDL_GetTicks() + 100; + * while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + * ... do work until timeout has elapsed + * } + */ +#define SDL_TICKS_PASSED(A, B) ((Sint32)((B) - (A)) <= 0) + +/** + * \brief Get the current value of the high resolution counter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); + +/** + * \brief Get the count per second of the high resolution counter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); + +/** + * \brief Wait a specified number of milliseconds before returning. + */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** + * Function prototype for the timer callback function. + * + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param); + +/** + * Definition of the timer ID type. + */ +typedef int SDL_TimerID; + +/** + * \brief Add a new timer to the pool of timers already running. + * + * \return A timer ID, or NULL when an error occurs. + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, + SDL_TimerCallback callback, + void *param); + +/** + * \brief Remove a timer knowing its ID. + * + * \return A boolean value indicating success or failure. + * + * \warning It is not safe to remove a timer multiple times. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_timer_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_touch.h b/Externals/SDL2-2.0.1/include/SDL_touch.h new file mode 100644 index 0000000000..9e6d7c65fb --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_touch.h @@ -0,0 +1,86 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_touch.h + * + * Include file for SDL touch event handling. + */ + +#ifndef _SDL_touch_h +#define _SDL_touch_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_TouchID; +typedef Sint64 SDL_FingerID; + +typedef struct SDL_Finger +{ + SDL_FingerID id; + float x; + float y; + float pressure; +} SDL_Finger; + +/* Used as the device ID for mouse events simulated with touch input */ +#define SDL_TOUCH_MOUSEID ((Uint32)-1) + + +/* Function prototypes */ + +/** + * \brief Get the number of registered touch devices. + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchDevices(void); + +/** + * \brief Get the touch ID with the given index, or 0 if the index is invalid. + */ +extern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index); + +/** + * \brief Get the number of active fingers for a given touch device. + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchFingers(SDL_TouchID touchID); + +/** + * \brief Get the finger object of the given touch, with the given index. + */ +extern DECLSPEC SDL_Finger * SDLCALL SDL_GetTouchFinger(SDL_TouchID touchID, int index); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_touch_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_types.h b/Externals/SDL2-2.0.1/include/SDL_types.h new file mode 100644 index 0000000000..bb485cdb0e --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_types.h @@ -0,0 +1,29 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_types.h + * + * \deprecated + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/Externals/SDL2-2.0.1/include/SDL_version.h b/Externals/SDL2-2.0.1/include/SDL_version.h new file mode 100644 index 0000000000..dc52c85c0a --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_version.h @@ -0,0 +1,162 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_version.h + * + * This header defines the current SDL version. + */ + +#ifndef _SDL_version_h +#define _SDL_version_h + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Information the version of SDL in use. + * + * Represents the library's version as three levels: major revision + * (increments with massive changes, additions, and enhancements), + * minor revision (increments with backwards-compatible changes to the + * major revision), and patchlevel (increments with fixes to the minor + * revision). + * + * \sa SDL_VERSION + * \sa SDL_GetVersion + */ +typedef struct SDL_version +{ + Uint8 major; /**< major version */ + Uint8 minor; /**< minor version */ + Uint8 patch; /**< update version */ +} SDL_version; + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_MAJOR_VERSION 2 +#define SDL_MINOR_VERSION 0 +#define SDL_PATCHLEVEL 1 + +/** + * \brief Macro to determine SDL version program was compiled against. + * + * This macro fills in a SDL_version structure with the version of the + * library you compiled against. This is determined by what header the + * compiler uses. Note that if you dynamically linked the library, you might + * have a slightly newer or older version at runtime. That version can be + * determined with SDL_GetVersion(), which, unlike SDL_VERSION(), + * is not a macro. + * + * \param x A pointer to a SDL_version struct to initialize. + * + * \sa SDL_version + * \sa SDL_GetVersion + */ +#define SDL_VERSION(x) \ +{ \ + (x)->major = SDL_MAJOR_VERSION; \ + (x)->minor = SDL_MINOR_VERSION; \ + (x)->patch = SDL_PATCHLEVEL; \ +} + +/** + * This macro turns the version numbers into a numeric value: + * \verbatim + (1,2,3) -> (1203) + \endverbatim + * + * This assumes that there will never be more than 100 patchlevels. + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** + * This is the version number macro for the current SDL version. + */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) + +/** + * This macro will evaluate to true if compiled with SDL at least X.Y.Z. + */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) + +/** + * \brief Get the version of SDL that is linked against your program. + * + * If you are linking to SDL dynamically, then it is possible that the + * current version will be different than the version you compiled against. + * This function returns the current version, while SDL_VERSION() is a + * macro that tells you what version you compiled with. + * + * \code + * SDL_version compiled; + * SDL_version linked; + * + * SDL_VERSION(&compiled); + * SDL_GetVersion(&linked); + * printf("We compiled against SDL version %d.%d.%d ...\n", + * compiled.major, compiled.minor, compiled.patch); + * printf("But we linked against SDL version %d.%d.%d.\n", + * linked.major, linked.minor, linked.patch); + * \endcode + * + * This function may be called safely at any time, even before SDL_Init(). + * + * \sa SDL_VERSION + */ +extern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver); + +/** + * \brief Get the code revision of SDL that is linked against your program. + * + * Returns an arbitrary string (a hash value) uniquely identifying the + * exact revision of the SDL library in use, and is only useful in comparing + * against other revisions. It is NOT an incrementing number. + */ +extern DECLSPEC const char *SDLCALL SDL_GetRevision(void); + +/** + * \brief Get the revision number of SDL that is linked against your program. + * + * Returns a number uniquely identifying the exact revision of the SDL + * library in use. It is an incrementing number based on commits to + * hg.libsdl.org. + */ +extern DECLSPEC int SDLCALL SDL_GetRevisionNumber(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_version_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/SDL_video.h b/Externals/SDL2-2.0.1/include/SDL_video.h new file mode 100644 index 0000000000..4a53f9b340 --- /dev/null +++ b/Externals/SDL2-2.0.1/include/SDL_video.h @@ -0,0 +1,974 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_video.h + * + * Header file for SDL video functions. + */ + +#ifndef _SDL_video_h +#define _SDL_video_h + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a display mode + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + * \sa SDL_GetDesktopDisplayMode() + * \sa SDL_GetCurrentDisplayMode() + * \sa SDL_GetClosestDisplayMode() + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +typedef struct +{ + Uint32 format; /**< pixel format */ + int w; /**< width */ + int h; /**< height */ + int refresh_rate; /**< refresh rate (or zero for unspecified) */ + void *driverdata; /**< driver-specific data, initialize to 0 */ +} SDL_DisplayMode; + +/** + * \brief The type used to identify a window + * + * \sa SDL_CreateWindow() + * \sa SDL_CreateWindowFrom() + * \sa SDL_DestroyWindow() + * \sa SDL_GetWindowData() + * \sa SDL_GetWindowFlags() + * \sa SDL_GetWindowGrab() + * \sa SDL_GetWindowPosition() + * \sa SDL_GetWindowSize() + * \sa SDL_GetWindowTitle() + * \sa SDL_HideWindow() + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + * \sa SDL_RaiseWindow() + * \sa SDL_RestoreWindow() + * \sa SDL_SetWindowData() + * \sa SDL_SetWindowFullscreen() + * \sa SDL_SetWindowGrab() + * \sa SDL_SetWindowIcon() + * \sa SDL_SetWindowPosition() + * \sa SDL_SetWindowSize() + * \sa SDL_SetWindowBordered() + * \sa SDL_SetWindowTitle() + * \sa SDL_ShowWindow() + */ +typedef struct SDL_Window SDL_Window; + +/** + * \brief The flags on a window + * + * \sa SDL_GetWindowFlags() + */ +typedef enum +{ + SDL_WINDOW_FULLSCREEN = 0x00000001, /**< fullscreen window */ + SDL_WINDOW_OPENGL = 0x00000002, /**< window usable with OpenGL context */ + SDL_WINDOW_SHOWN = 0x00000004, /**< window is visible */ + SDL_WINDOW_HIDDEN = 0x00000008, /**< window is not visible */ + SDL_WINDOW_BORDERLESS = 0x00000010, /**< no window decoration */ + SDL_WINDOW_RESIZABLE = 0x00000020, /**< window can be resized */ + SDL_WINDOW_MINIMIZED = 0x00000040, /**< window is minimized */ + SDL_WINDOW_MAXIMIZED = 0x00000080, /**< window is maximized */ + SDL_WINDOW_INPUT_GRABBED = 0x00000100, /**< window has grabbed input focus */ + SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */ + SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ + SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), + SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000 /**< window should be created in high-DPI mode if supported */ +} SDL_WindowFlags; + +/** + * \brief Used to indicate that you don't care what the window position is. + */ +#define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000 +#define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) +#define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) +#define SDL_WINDOWPOS_ISUNDEFINED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * \brief Used to indicate that the window position should be centered. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000 +#define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) +#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) +#define SDL_WINDOWPOS_ISCENTERED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + +/** + * \brief Event subtype for window events + */ +typedef enum +{ + SDL_WINDOWEVENT_NONE, /**< Never used */ + SDL_WINDOWEVENT_SHOWN, /**< Window has been shown */ + SDL_WINDOWEVENT_HIDDEN, /**< Window has been hidden */ + SDL_WINDOWEVENT_EXPOSED, /**< Window has been exposed and should be + redrawn */ + SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 + */ + SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as a result of an API call or through the system or user changing the window size. */ + SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ + SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ + SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size + and position */ + SDL_WINDOWEVENT_ENTER, /**< Window has gained mouse focus */ + SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ + SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ + SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ + SDL_WINDOWEVENT_CLOSE /**< The window manager requests that the + window be closed */ +} SDL_WindowEventID; + +/** + * \brief An opaque handle to an OpenGL context. + */ +typedef void *SDL_GLContext; + +/** + * \brief OpenGL configuration attributes + */ +typedef enum +{ + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION, + SDL_GL_CONTEXT_EGL, + SDL_GL_CONTEXT_FLAGS, + SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_SHARE_WITH_CURRENT_CONTEXT, + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE +} SDL_GLattr; + +typedef enum +{ + SDL_GL_CONTEXT_PROFILE_CORE = 0x0001, + SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002, + SDL_GL_CONTEXT_PROFILE_ES = 0x0004 /* GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ +} SDL_GLprofile; + +typedef enum +{ + SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001, + SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002, + SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004, + SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008 +} SDL_GLcontextFlag; + + +/* Function prototypes */ + +/** + * \brief Get the number of video drivers compiled into SDL + * + * \sa SDL_GetVideoDriver() + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); + +/** + * \brief Get the name of a built in video driver. + * + * \note The video drivers are presented in the order in which they are + * normally checked during initialization. + * + * \sa SDL_GetNumVideoDrivers() + */ +extern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index); + +/** + * \brief Initialize the video subsystem, optionally specifying a video driver. + * + * \param driver_name Initialize a specific driver by name, or NULL for the + * default video driver. + * + * \return 0 on success, -1 on error + * + * This function initializes the video subsystem; setting up a connection + * to the window manager, etc, and determines the available display modes + * and pixel formats, but does not initialize a window or graphics mode. + * + * \sa SDL_VideoQuit() + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name); + +/** + * \brief Shuts down the video subsystem. + * + * This function closes all windows, and restores the original video mode. + * + * \sa SDL_VideoInit() + */ +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); + +/** + * \brief Returns the name of the currently initialized video driver. + * + * \return The name of the current video driver or NULL if no driver + * has been initialized + * + * \sa SDL_GetNumVideoDrivers() + * \sa SDL_GetVideoDriver() + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); + +/** + * \brief Returns the number of available video displays. + * + * \sa SDL_GetDisplayBounds() + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); + +/** + * \brief Get the name of a display in UTF-8 encoding + * + * \return The name of a display, or NULL for an invalid display index. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); + +/** + * \brief Get the desktop area represented by a display, with the primary + * display located at 0,0 + * + * \return 0 on success, or -1 if the index is out of range. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect); + +/** + * \brief Returns the number of available display modes. + * + * \sa SDL_GetDisplayMode() + */ +extern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(int displayIndex); + +/** + * \brief Fill in information about a specific display mode. + * + * \note The display modes are sorted in this priority: + * \li bits per pixel -> more colors to fewer colors + * \li width -> largest to smallest + * \li height -> largest to smallest + * \li refresh rate -> highest to lowest + * + * \sa SDL_GetNumDisplayModes() + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayMode(int displayIndex, int modeIndex, + SDL_DisplayMode * mode); + +/** + * \brief Fill in information about the desktop display mode. + */ +extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode); + +/** + * \brief Fill in information about the current display mode. + */ +extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode); + + +/** + * \brief Get the closest match to the requested display mode. + * + * \param displayIndex The index of display from which mode should be queried. + * \param mode The desired display mode + * \param closest A pointer to a display mode to be filled in with the closest + * match of the available display modes. + * + * \return The passed in value \c closest, or NULL if no matching video mode + * was available. + * + * The available display modes are scanned, and \c closest is filled in with the + * closest mode matching the requested mode and returned. The mode format and + * refresh_rate default to the desktop mode if they are 0. The modes are + * scanned with size being first priority, format being second priority, and + * finally checking the refresh_rate. If all the available modes are too + * small, then NULL is returned. + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + */ +extern DECLSPEC SDL_DisplayMode * SDLCALL SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode * mode, SDL_DisplayMode * closest); + +/** + * \brief Get the display index associated with a window. + * + * \return the display index of the display containing the center of the + * window, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayIndex(SDL_Window * window); + +/** + * \brief Set the display mode used when a fullscreen window is visible. + * + * By default the window's dimensions and the desktop format and refresh rate + * are used. + * + * \param window The window for which the display mode should be set. + * \param mode The mode to use, or NULL for the default mode. + * + * \return 0 on success, or -1 if setting the display mode failed. + * + * \sa SDL_GetWindowDisplayMode() + * \sa SDL_SetWindowFullscreen() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowDisplayMode(SDL_Window * window, + const SDL_DisplayMode + * mode); + +/** + * \brief Fill in information about the display mode used when a fullscreen + * window is visible. + * + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_SetWindowFullscreen() + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayMode(SDL_Window * window, + SDL_DisplayMode * mode); + +/** + * \brief Get the pixel format associated with the window. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); + +/** + * \brief Create a window with the specified position, dimensions, and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of any of the following: + * ::SDL_WINDOW_FULLSCREEN, ::SDL_WINDOW_OPENGL, + * ::SDL_WINDOW_HIDDEN, ::SDL_WINDOW_BORDERLESS, + * ::SDL_WINDOW_RESIZABLE, ::SDL_WINDOW_MAXIMIZED, + * ::SDL_WINDOW_MINIMIZED, ::SDL_WINDOW_INPUT_GRABBED, + * ::SDL_WINDOW_ALLOW_HIGHDPI. + * + * \return The id of the window created, or zero if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, + int x, int y, int w, + int h, Uint32 flags); + +/** + * \brief Create an SDL window from an existing native window. + * + * \param data A pointer to driver-dependent window creation data + * + * \return The id of the window created, or zero if window creation failed. + * + * \sa SDL_DestroyWindow() + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowFrom(const void *data); + +/** + * \brief Get the numeric ID of a window, for logging purposes. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowID(SDL_Window * window); + +/** + * \brief Get a window from a stored ID, or NULL if it doesn't exist. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(Uint32 id); + +/** + * \brief Get the window flags. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window * window); + +/** + * \brief Set the title of a window, in UTF-8 format. + * + * \sa SDL_GetWindowTitle() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_Window * window, + const char *title); + +/** + * \brief Get the title of a window, in UTF-8 format. + * + * \sa SDL_SetWindowTitle() + */ +extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window); + +/** + * \brief Set the icon for a window. + * + * \param window The window for which the icon should be set. + * \param icon The icon for the window. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window, + SDL_Surface * icon); + +/** + * \brief Associate an arbitrary named pointer with a window. + * + * \param window The window to associate with the pointer. + * \param name The name of the pointer. + * \param userdata The associated pointer. + * + * \return The previous value associated with 'name' + * + * \note The name is case-sensitive. + * + * \sa SDL_GetWindowData() + */ +extern DECLSPEC void* SDLCALL SDL_SetWindowData(SDL_Window * window, + const char *name, + void *userdata); + +/** + * \brief Retrieve the data pointer associated with a window. + * + * \param window The window to query. + * \param name The name of the pointer. + * + * \return The value associated with 'name' + * + * \sa SDL_SetWindowData() + */ +extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window, + const char *name); + +/** + * \brief Set the position of a window. + * + * \param window The window to reposition. + * \param x The x coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or + ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y coordinate of the window, ::SDL_WINDOWPOS_CENTERED, or + ::SDL_WINDOWPOS_UNDEFINED. + * + * \note The window coordinate origin is the upper left of the display. + * + * \sa SDL_GetWindowPosition() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window, + int x, int y); + +/** + * \brief Get the position of a window. + * + * \param window The window to query. + * \param x Pointer to variable for storing the x position, may be NULL + * \param y Pointer to variable for storing the y position, may be NULL + * + * \sa SDL_SetWindowPosition() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window, + int *x, int *y); + +/** + * \brief Set the size of a window's client area. + * + * \param window The window to resize. + * \param w The width of the window, must be >0 + * \param h The height of the window, must be >0 + * + * \note You can't change the size of a fullscreen window, it automatically + * matches the size of the display mode. + * + * \sa SDL_GetWindowSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, + int h); + +/** + * \brief Get the size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the width, may be NULL + * \param h Pointer to variable for storing the height, may be NULL + * + * \sa SDL_SetWindowSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w, + int *h); + +/** + * \brief Set the minimum size of a window's client area. + * + * \param window The window to set a new minimum size. + * \param min_w The minimum width of the window, must be >0 + * \param min_h The minimum height of the window, must be >0 + * + * \note You can't change the minimum size of a fullscreen window, it + * automatically matches the size of the display mode. + * + * \sa SDL_GetWindowMinimumSize() + * \sa SDL_SetWindowMaximumSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window, + int min_w, int min_h); + +/** + * \brief Get the minimum size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the minimum width, may be NULL + * \param h Pointer to variable for storing the minimum height, may be NULL + * + * \sa SDL_GetWindowMaximumSize() + * \sa SDL_SetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window, + int *w, int *h); + +/** + * \brief Set the maximum size of a window's client area. + * + * \param window The window to set a new maximum size. + * \param max_w The maximum width of the window, must be >0 + * \param max_h The maximum height of the window, must be >0 + * + * \note You can't change the maximum size of a fullscreen window, it + * automatically matches the size of the display mode. + * + * \sa SDL_GetWindowMaximumSize() + * \sa SDL_SetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMaximumSize(SDL_Window * window, + int max_w, int max_h); + +/** + * \brief Get the maximum size of a window's client area. + * + * \param window The window to query. + * \param w Pointer to variable for storing the maximum width, may be NULL + * \param h Pointer to variable for storing the maximum height, may be NULL + * + * \sa SDL_GetWindowMinimumSize() + * \sa SDL_SetWindowMaximumSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMaximumSize(SDL_Window * window, + int *w, int *h); + +/** + * \brief Set the border state of a window. + * + * This will add or remove the window's SDL_WINDOW_BORDERLESS flag and + * add or remove the border from the actual window. This is a no-op if the + * window's border already matches the requested state. + * + * \param window The window of which to change the border state. + * \param bordered SDL_FALSE to remove border, SDL_TRUE to add border. + * + * \note You can't change the border state of a fullscreen window. + * + * \sa SDL_GetWindowFlags() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowBordered(SDL_Window * window, + SDL_bool bordered); + +/** + * \brief Show a window. + * + * \sa SDL_HideWindow() + */ +extern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_Window * window); + +/** + * \brief Hide a window. + * + * \sa SDL_ShowWindow() + */ +extern DECLSPEC void SDLCALL SDL_HideWindow(SDL_Window * window); + +/** + * \brief Raise a window above other windows and set the input focus. + */ +extern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_Window * window); + +/** + * \brief Make a window as large as possible. + * + * \sa SDL_RestoreWindow() + */ +extern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_Window * window); + +/** + * \brief Minimize a window to an iconic representation. + * + * \sa SDL_RestoreWindow() + */ +extern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_Window * window); + +/** + * \brief Restore the size and position of a minimized or maximized window. + * + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + */ +extern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_Window * window); + +/** + * \brief Set a window's fullscreen state. + * + * \return 0 on success, or -1 if setting the display mode failed. + * + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window, + Uint32 flags); + +/** + * \brief Get the SDL surface associated with the window. + * + * \return The window's framebuffer surface, or NULL on error. + * + * A new surface will be created with the optimal format for the window, + * if necessary. This surface will be freed when the window is destroyed. + * + * \note You may not combine this with 3D or the rendering API on this window. + * + * \sa SDL_UpdateWindowSurface() + * \sa SDL_UpdateWindowSurfaceRects() + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window); + +/** + * \brief Copy the window surface to the screen. + * + * \return 0 on success, or -1 on error. + * + * \sa SDL_GetWindowSurface() + * \sa SDL_UpdateWindowSurfaceRects() + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window); + +/** + * \brief Copy a number of rectangles on the window surface to the screen. + * + * \return 0 on success, or -1 on error. + * + * \sa SDL_GetWindowSurface() + * \sa SDL_UpdateWindowSurfaceRect() + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, + const SDL_Rect * rects, + int numrects); + +/** + * \brief Set a window's input grab mode. + * + * \param window The window for which the input grab mode should be set. + * \param grabbed This is SDL_TRUE to grab input, and SDL_FALSE to release input. + * + * \sa SDL_GetWindowGrab() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * \brief Get a window's input grab mode. + * + * \return This returns SDL_TRUE if input is grabbed, and SDL_FALSE otherwise. + * + * \sa SDL_SetWindowGrab() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window); + +/** + * \brief Set the brightness (gamma correction) for a window. + * + * \return 0 on success, or -1 if setting the brightness isn't supported. + * + * \sa SDL_GetWindowBrightness() + * \sa SDL_SetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowBrightness(SDL_Window * window, float brightness); + +/** + * \brief Get the brightness (gamma correction) for a window. + * + * \return The last brightness value passed to SDL_SetWindowBrightness() + * + * \sa SDL_SetWindowBrightness() + */ +extern DECLSPEC float SDLCALL SDL_GetWindowBrightness(SDL_Window * window); + +/** + * \brief Set the gamma ramp for a window. + * + * \param window The window for which the gamma ramp should be set. + * \param red The translation table for the red channel, or NULL. + * \param green The translation table for the green channel, or NULL. + * \param blue The translation table for the blue channel, or NULL. + * + * \return 0 on success, or -1 if gamma ramps are unsupported. + * + * Set the gamma translation table for the red, green, and blue channels + * of the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. + * The input is the index into the array, and the output is the 16-bit + * gamma value at that index, scaled to the output color precision. + * + * \sa SDL_GetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window, + const Uint16 * red, + const Uint16 * green, + const Uint16 * blue); + +/** + * \brief Get the gamma ramp for a window. + * + * \param window The window from which the gamma ramp should be queried. + * \param red A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the red channel, or NULL. + * \param green A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the green channel, or NULL. + * \param blue A pointer to a 256 element array of 16-bit quantities to hold + * the translation table for the blue channel, or NULL. + * + * \return 0 on success, or -1 if gamma ramps are unsupported. + * + * \sa SDL_SetWindowGammaRamp() + */ +extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window, + Uint16 * red, + Uint16 * green, + Uint16 * blue); + +/** + * \brief Destroy a window. + */ +extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window); + + +/** + * \brief Returns whether the screensaver is currently enabled (default on). + * + * \sa SDL_EnableScreenSaver() + * \sa SDL_DisableScreenSaver() + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void); + +/** + * \brief Allow the screen to be blanked by a screensaver + * + * \sa SDL_IsScreenSaverEnabled() + * \sa SDL_DisableScreenSaver() + */ +extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void); + +/** + * \brief Prevent the screen from being blanked by a screensaver + * + * \sa SDL_IsScreenSaverEnabled() + * \sa SDL_EnableScreenSaver() + */ +extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void); + + +/** + * \name OpenGL support functions + */ +/* @{ */ + +/** + * \brief Dynamically load an OpenGL library. + * + * \param path The platform dependent OpenGL library name, or NULL to open the + * default OpenGL library. + * + * \return 0 on success, or -1 if the library couldn't be loaded. + * + * This should be done after initializing the video driver, but before + * creating any OpenGL windows. If no OpenGL library is loaded, the default + * library will be loaded upon creation of the first OpenGL window. + * + * \note If you do this, you need to retrieve all of the GL functions used in + * your program from the dynamic library using SDL_GL_GetProcAddress(). + * + * \sa SDL_GL_GetProcAddress() + * \sa SDL_GL_UnloadLibrary() + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * \brief Get the address of an OpenGL function. + */ +extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc); + +/** + * \brief Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). + * + * \sa SDL_GL_LoadLibrary() + */ +extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); + +/** + * \brief Return true if an OpenGL extension is supported for the current + * context. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char + *extension); + +/** + * \brief Set an OpenGL window attribute before window creation. + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * \brief Get the actual value for an attribute from the current context. + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); + +/** + * \brief Create an OpenGL context for use with an OpenGL window, and make it + * current. + * + * \sa SDL_GL_DeleteContext() + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window * + window); + +/** + * \brief Set up an OpenGL context for rendering into an OpenGL window. + * + * \note The context must have been created with a compatible window. + */ +extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window, + SDL_GLContext context); + +/** + * \brief Get the currently active OpenGL window. + */ +extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void); + +/** + * \brief Get the currently active OpenGL context. + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); + +/** + * \brief Get the size of a window's underlying drawable (for use with glViewport). + * + * \param window Window from which the drawable size should be queried + * \param w Pointer to variable for storing the width, may be NULL + * \param h Pointer to variable for storing the height, may be NULL + * + * This may differ from SDL_GetWindowSize if we're rendering to a high-DPI + * drawable, i.e. the window was created with SDL_WINDOW_ALLOW_HIGHDPI on a + * platform with high-DPI support (Apple calls this "Retina"), and not disabled + * by the SDL_HINT_VIDEO_HIGHDPI_DISABLED hint. + * + * \sa SDL_GetWindowSize() + * \sa SDL_CreateWindow() + */ +extern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w, + int *h); + +/** + * \brief Set the swap interval for the current OpenGL context. + * + * \param interval 0 for immediate updates, 1 for updates synchronized with the + * vertical retrace. If the system supports it, you may + * specify -1 to allow late swaps to happen immediately + * instead of waiting for the next retrace. + * + * \return 0 on success, or -1 if setting the swap interval is not supported. + * + * \sa SDL_GL_GetSwapInterval() + */ +extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval); + +/** + * \brief Get the swap interval for the current OpenGL context. + * + * \return 0 if there is no vertical retrace synchronization, 1 if the buffer + * swap is synchronized with the vertical retrace, and -1 if late + * swaps happen immediately instead of waiting for the next retrace. + * If the system can't determine the swap interval, or there isn't a + * valid current context, this will return 0 as a safe default. + * + * \sa SDL_GL_SetSwapInterval() + */ +extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void); + +/** + * \brief Swap the OpenGL buffers for a window, if double-buffering is + * supported. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window); + +/** + * \brief Delete an OpenGL context. + * + * \sa SDL_GL_CreateContext() + */ +extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context); + +/* @} *//* OpenGL support functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_video_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Externals/SDL2-2.0.1/include/begin_code.h b/Externals/SDL2-2.0.1/include/begin_code.h new file mode 100644 index 0000000000..968a540a4d --- /dev/null +++ b/Externals/SDL2-2.0.1/include/begin_code.h @@ -0,0 +1,140 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file begin_code.h + * + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/* This shouldn't be nested -- included it around code only. */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +#ifndef SDL_DEPRECATED +# if (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ +# define SDL_DEPRECATED __attribute__((deprecated)) +# else +# define SDL_DEPRECATED +# endif +#endif + +/* Some compilers use a special export keyword */ +#ifndef DECLSPEC +# if defined(__WIN32__) +# ifdef __BORLANDC__ +# ifdef BUILD_SDL +# define DECLSPEC +# else +# define DECLSPEC __declspec(dllimport) +# endif +# else +# define DECLSPEC __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && __GNUC__ >= 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# elif defined(__GNUC__) && __GNUC__ >= 2 +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# endif +#endif + +/* By default SDL uses the C calling convention */ +#ifndef SDLCALL +#if defined(__WIN32__) && !defined(__GNUC__) +#define SDLCALL __cdecl +#else +#define SDLCALL +#endif +#endif /* SDLCALL */ + +/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ +#ifdef __SYMBIAN32__ +#undef DECLSPEC +#define DECLSPEC +#endif /* __SYMBIAN32__ */ + +/* Force structure packing at 4 byte alignment. + This is necessary if the header is included in code which has structure + packing set to an alternate value, say for loading structures from disk. + The packing is reset to the previous value in close_code.h + */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef _MSC_VER +#pragma warning(disable: 4103) +#endif +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#ifdef _M_X64 +/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */ +#pragma pack(push,8) +#else +#pragma pack(push,4) +#endif +#endif /* Compiler needs structure packing set */ + +#ifndef SDL_INLINE +#if defined(__GNUC__) +#define SDL_INLINE __inline__ +#elif defined(_MSC_VER) || defined(__BORLANDC__) || \ + defined(__DMC__) || defined(__SC__) || \ + defined(__WATCOMC__) || defined(__LCC__) || \ + defined(__DECC) +#define SDL_INLINE __inline +#ifndef __inline__ +#define __inline__ __inline +#endif +#else +#define SDL_INLINE inline +#ifndef __inline__ +#define __inline__ inline +#endif +#endif +#endif /* SDL_INLINE not defined */ + +#ifndef SDL_FORCE_INLINE +#if defined(_MSC_VER) +#define SDL_FORCE_INLINE __forceinline +#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) ) +#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__ +#else +#define SDL_FORCE_INLINE static SDL_INLINE +#endif +#endif /* SDL_FORCE_INLINE not defined */ + +/* Apparently this is needed by several Windows compilers */ +#if !defined(__MACH__) +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif /* NULL */ +#endif /* ! Mac OS X - breaks precompiled headers */ diff --git a/Externals/SDL2-2.0.1/include/close_code.h b/Externals/SDL2-2.0.1/include/close_code.h new file mode 100644 index 0000000000..4901482d5c --- /dev/null +++ b/Externals/SDL2-2.0.1/include/close_code.h @@ -0,0 +1,37 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2013 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file close_code.h + * + * This file reverses the effects of begin_code.h and should be included + * after you finish any function and structure declarations in your headers + */ + +#undef _begin_code_h + +/* Reset structure packing at previous byte alignment */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__) +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#pragma pack(pop) +#endif /* Compiler needs structure packing set */ diff --git a/Externals/SDL2-2.0.1/lib/Win32/SDL2.dll b/Externals/SDL2-2.0.1/lib/Win32/SDL2.dll new file mode 100644 index 0000000000..c86aba1c52 Binary files /dev/null and b/Externals/SDL2-2.0.1/lib/Win32/SDL2.dll differ diff --git a/Externals/SDL2-2.0.1/lib/Win32/SDL2.lib b/Externals/SDL2-2.0.1/lib/Win32/SDL2.lib new file mode 100644 index 0000000000..cc099800b2 Binary files /dev/null and b/Externals/SDL2-2.0.1/lib/Win32/SDL2.lib differ diff --git a/Externals/SDL2-2.0.1/lib/x64/SDL2.dll b/Externals/SDL2-2.0.1/lib/x64/SDL2.dll new file mode 100644 index 0000000000..1a156df58c Binary files /dev/null and b/Externals/SDL2-2.0.1/lib/x64/SDL2.dll differ diff --git a/Externals/SDL2-2.0.1/lib/x64/SDL2.lib b/Externals/SDL2-2.0.1/lib/x64/SDL2.lib new file mode 100644 index 0000000000..abeab3bc8a Binary files /dev/null and b/Externals/SDL2-2.0.1/lib/x64/SDL2.lib differ diff --git a/Externals/SFML/build/vc2010/SFML_Network.vcxproj b/Externals/SFML/build/vc2010/SFML_Network.vcxproj index aeb2df601f..c67b8c323f 100644 --- a/Externals/SFML/build/vc2010/SFML_Network.vcxproj +++ b/Externals/SFML/build/vc2010/SFML_Network.vcxproj @@ -1,14 +1,6 @@  - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -28,142 +20,27 @@ {93D73454-2512-424E-9CDA-4BB357FE13DD} - SFML_Network - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\..\include;%(AdditionalIncludeDirectories) - - - true - true - true - - diff --git a/Externals/SFML/src/SFML/Network/SocketTCP.cpp b/Externals/SFML/src/SFML/Network/SocketTCP.cpp index 8e9aa33f81..6cbd158aa8 100644 --- a/Externals/SFML/src/SFML/Network/SocketTCP.cpp +++ b/Externals/SFML/src/SFML/Network/SocketTCP.cpp @@ -488,18 +488,22 @@ void SocketTCP::Create(SocketHelper::SocketType Descriptor) // Setup default options if (IsValid()) { - /* We must disable this in order to detect if ports are being used by other apps, or - other instances of dolphin. This is also disabled in SFML 2.0, see - http://www.sfml-dev.org/forum/viewtopic.php?t=3388 + int Yes = 1; +#ifndef SFML_SYSTEM_WINDOWS + /* We must disable this in order to detect if ports are being used by other apps, or + other instances of dolphin. This is also disabled in SFML 2.0, see +http://www.sfml-dev.org/forum/viewtopic.php?t=3388 + ...In fact, SO_REUSEADDR is only unsafe on Windows. See: + http://stackoverflow.com/questions/14388706 + */ // To avoid the "Address already in use" error message when trying to bind to the same port if (setsockopt(mySocket, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&Yes), sizeof(Yes)) == -1) { std::cerr << "Failed to set socket option \"SO_REUSEADDR\" ; " << "binding to a same port may fail if too fast" << std::endl; } - */ +#endif - int Yes = 1; // Disable the Nagle algorithm (ie. removes buffering of TCP packets) if (setsockopt(mySocket, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&Yes), sizeof(Yes)) == -1) { diff --git a/Externals/SOIL/SOIL.vcxproj b/Externals/SOIL/SOIL.vcxproj index 33f75bbaf9..9c4bb491da 100644 --- a/Externals/SOIL/SOIL.vcxproj +++ b/Externals/SOIL/SOIL.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,113 +19,31 @@ - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181} - SOIL + {B441CC62-877E-4B3F-93E0-0DE80544F705} - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - + + + @@ -148,9 +58,6 @@ - - - diff --git a/Externals/libiconv-1.14/.gitattributes b/Externals/libiconv-1.14/.gitattributes new file mode 100644 index 0000000000..ca4ea2772a --- /dev/null +++ b/Externals/libiconv-1.14/.gitattributes @@ -0,0 +1 @@ +ChangeLog merge=merge-changelog diff --git a/Externals/libiconv-1.14/CMakeLists.txt b/Externals/libiconv-1.14/CMakeLists.txt new file mode 100644 index 0000000000..9a0660b254 --- /dev/null +++ b/Externals/libiconv-1.14/CMakeLists.txt @@ -0,0 +1,9 @@ +include_directories(include) +include_directories(libcharset/include) + +set(SRCS lib/iconv.c + lib/relocatable.c + libcharset/lib/localcharset.c +) + +add_library(iconv STATIC ${SRCS}) diff --git a/Externals/libiconv-1.14/config.h b/Externals/libiconv-1.14/config.h new file mode 100644 index 0000000000..259357b1db --- /dev/null +++ b/Externals/libiconv-1.14/config.h @@ -0,0 +1,927 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to the number of bits in type 'ptrdiff_t'. */ +/* #undef BITSIZEOF_PTRDIFF_T */ + +/* Define to the number of bits in type 'sig_atomic_t'. */ +/* #undef BITSIZEOF_SIG_ATOMIC_T */ + +/* Define to the number of bits in type 'size_t'. */ +/* #undef BITSIZEOF_SIZE_T */ + +/* Define to the number of bits in type 'wchar_t'. */ +/* #undef BITSIZEOF_WCHAR_T */ + +/* Define to the number of bits in type 'wint_t'. */ +/* #undef BITSIZEOF_WINT_T */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to 1 if // is a file system root distinct from /. */ +/* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */ + +/* Define as good substitute value for EILSEQ. */ +/* #undef EILSEQ */ + +/* Define to 1 to enable a few rarely used encodings. */ +/* #undef ENABLE_EXTRA */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#define ENABLE_NLS 1 + +/* Define to 1 if the package shall run at any location in the file system. */ +/* #undef ENABLE_RELOCATABLE */ + +/* Define to 1 if realpath() can malloc memory, always gives an absolute path, + and handles trailing slash correctly. */ +#define FUNC_REALPATH_WORKS 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module canonicalize-lgpl shall be considered present. */ +#define GNULIB_CANONICALIZE_LGPL 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module sigpipe shall be considered present. */ +#define GNULIB_SIGPIPE 1 + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module strerror shall be considered present. */ +#define GNULIB_STRERROR 1 + +/* Define to 1 when the gnulib module canonicalize_file_name should be tested. + */ +#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1 + +/* Define to 1 when the gnulib module environ should be tested. */ +#define GNULIB_TEST_ENVIRON 1 + +/* Define to 1 when the gnulib module lstat should be tested. */ +#define GNULIB_TEST_LSTAT 1 + +/* Define to 1 when the gnulib module read should be tested. */ +#define GNULIB_TEST_READ 1 + +/* Define to 1 when the gnulib module readlink should be tested. */ +#define GNULIB_TEST_READLINK 1 + +/* Define to 1 when the gnulib module realpath should be tested. */ +#define GNULIB_TEST_REALPATH 1 + +/* Define to 1 when the gnulib module sigprocmask should be tested. */ +#define GNULIB_TEST_SIGPROCMASK 1 + +/* Define to 1 when the gnulib module stat should be tested. */ +#define GNULIB_TEST_STAT 1 + +/* Define to 1 when the gnulib module strerror should be tested. */ +#define GNULIB_TEST_STRERROR 1 + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the `canonicalize_file_name' function. */ +#define HAVE_CANONICALIZE_FILE_NAME 1 + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_CLEARERR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_FEOF_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FERROR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FFLUSH_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FGETS_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FPUTC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FPUTS_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FREAD_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FWRITE_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_GETCHAR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_GETC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `program_invocation_name', and + to 0 if you don't. */ +#define HAVE_DECL_PROGRAM_INVOCATION_NAME 1 + +/* Define to 1 if you have the declaration of `program_invocation_short_name', + and to 0 if you don't. */ +#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1 + +/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_PUTCHAR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_PUTC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't. + */ +#define HAVE_DECL_SETENV 1 + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#define HAVE_DECL_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if you have the declaration of environ. */ +#define HAVE_ENVIRON_DECL 1 + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `getc_unlocked' function. */ +#define HAVE_GETC_UNLOCKED 1 + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define if you have the iconv() function and it works. */ +#define HAVE_ICONV 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have and nl_langinfo(CODESET). */ +#define HAVE_LANGINFO_CODESET 1 + +/* Define to 1 if the system has the type `long long int'. */ +#define HAVE_LONG_LONG_INT 1 + +/* Define to 1 if you have the `lstat' function. */ +#define HAVE_LSTAT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_O_DYLD_H */ + +/* Define to 1 if you have the `mbrtowc' function. */ +#define HAVE_MBRTOWC 1 + +/* Define to 1 if you have the `mbsinit' function. */ +#define HAVE_MBSINIT 1 + +/* Define to 1 if declares mbstate_t. */ +#define HAVE_MBSTATE_T 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if atoll is declared even after undefining macros. */ +#define HAVE_RAW_DECL_ATOLL 1 + +/* Define to 1 if canonicalize_file_name is declared even after undefining + macros. */ +#define HAVE_RAW_DECL_CANONICALIZE_FILE_NAME 1 + +/* Define to 1 if chown is declared even after undefining macros. */ +#define HAVE_RAW_DECL_CHOWN 1 + +/* Define to 1 if dprintf is declared even after undefining macros. */ +#define HAVE_RAW_DECL_DPRINTF 1 + +/* Define to 1 if dup2 is declared even after undefining macros. */ +#define HAVE_RAW_DECL_DUP2 1 + +/* Define to 1 if dup3 is declared even after undefining macros. */ +#define HAVE_RAW_DECL_DUP3 1 + +/* Define to 1 if endusershell is declared even after undefining macros. */ +#define HAVE_RAW_DECL_ENDUSERSHELL 1 + +/* Define to 1 if environ is declared even after undefining macros. */ +#define HAVE_RAW_DECL_ENVIRON 1 + +/* Define to 1 if euidaccess is declared even after undefining macros. */ +#define HAVE_RAW_DECL_EUIDACCESS 1 + +/* Define to 1 if faccessat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FACCESSAT 1 + +/* Define to 1 if fchdir is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FCHDIR 1 + +/* Define to 1 if fchmodat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FCHMODAT 1 + +/* Define to 1 if fchownat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FCHOWNAT 1 + +/* Define to 1 if fcntl is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FCNTL 1 + +/* Define to 1 if ffsl is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FFSL 1 + +/* Define to 1 if ffsll is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FFSLL 1 + +/* Define to 1 if fpurge is declared even after undefining macros. */ +/* #undef HAVE_RAW_DECL_FPURGE */ + +/* Define to 1 if fseeko is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FSEEKO 1 + +/* Define to 1 if fstatat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FSTATAT 1 + +/* Define to 1 if fsync is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FSYNC 1 + +/* Define to 1 if ftello is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FTELLO 1 + +/* Define to 1 if ftruncate is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FTRUNCATE 1 + +/* Define to 1 if futimens is declared even after undefining macros. */ +#define HAVE_RAW_DECL_FUTIMENS 1 + +/* Define to 1 if getcwd is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETCWD 1 + +/* Define to 1 if getdelim is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETDELIM 1 + +/* Define to 1 if getdomainname is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETDOMAINNAME 1 + +/* Define to 1 if getdtablesize is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETDTABLESIZE 1 + +/* Define to 1 if getgroups is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETGROUPS 1 + +/* Define to 1 if gethostname is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETHOSTNAME 1 + +/* Define to 1 if getline is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETLINE 1 + +/* Define to 1 if getloadavg is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETLOADAVG 1 + +/* Define to 1 if getlogin is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETLOGIN 1 + +/* Define to 1 if getlogin_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETLOGIN_R 1 + +/* Define to 1 if getpagesize is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETPAGESIZE 1 + +/* Define to 1 if getsubopt is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETSUBOPT 1 + +/* Define to 1 if getusershell is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GETUSERSHELL 1 + +/* Define to 1 if grantpt is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GRANTPT 1 + +/* Define to 1 if group_member is declared even after undefining macros. */ +#define HAVE_RAW_DECL_GROUP_MEMBER 1 + +/* Define to 1 if initstat_r is declared even after undefining macros. */ +/* #undef HAVE_RAW_DECL_INITSTAT_R */ + +/* Define to 1 if lchmod is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LCHMOD 1 + +/* Define to 1 if lchown is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LCHOWN 1 + +/* Define to 1 if link is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LINK 1 + +/* Define to 1 if linkat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LINKAT 1 + +/* Define to 1 if lseek is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LSEEK 1 + +/* Define to 1 if lstat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_LSTAT 1 + +/* Define to 1 if memmem is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MEMMEM 1 + +/* Define to 1 if mempcpy is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MEMPCPY 1 + +/* Define to 1 if memrchr is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MEMRCHR 1 + +/* Define to 1 if mkdirat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKDIRAT 1 + +/* Define to 1 if mkdtemp is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKDTEMP 1 + +/* Define to 1 if mkfifo is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKFIFO 1 + +/* Define to 1 if mkfifoat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKFIFOAT 1 + +/* Define to 1 if mknod is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKNOD 1 + +/* Define to 1 if mknodat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKNODAT 1 + +/* Define to 1 if mkostemp is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKOSTEMP 1 + +/* Define to 1 if mkostemps is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKOSTEMPS 1 + +/* Define to 1 if mkstemp is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKSTEMP 1 + +/* Define to 1 if mkstemps is declared even after undefining macros. */ +#define HAVE_RAW_DECL_MKSTEMPS 1 + +/* Define to 1 if openat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_OPENAT 1 + +/* Define to 1 if pipe is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PIPE 1 + +/* Define to 1 if pipe2 is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PIPE2 1 + +/* Define to 1 if popen is declared even after undefining macros. */ +#define HAVE_RAW_DECL_POPEN 1 + +/* Define to 1 if pread is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PREAD 1 + +/* Define to 1 if pthread_sigmask is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PTHREAD_SIGMASK 1 + +/* Define to 1 if ptsname is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PTSNAME 1 + +/* Define to 1 if pwrite is declared even after undefining macros. */ +#define HAVE_RAW_DECL_PWRITE 1 + +/* Define to 1 if random_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_RANDOM_R 1 + +/* Define to 1 if rawmemchr is declared even after undefining macros. */ +#define HAVE_RAW_DECL_RAWMEMCHR 1 + +/* Define to 1 if readlink is declared even after undefining macros. */ +#define HAVE_RAW_DECL_READLINK 1 + +/* Define to 1 if readlinkat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_READLINKAT 1 + +/* Define to 1 if realpath is declared even after undefining macros. */ +#define HAVE_RAW_DECL_REALPATH 1 + +/* Define to 1 if renameat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_RENAMEAT 1 + +/* Define to 1 if rmdir is declared even after undefining macros. */ +#define HAVE_RAW_DECL_RMDIR 1 + +/* Define to 1 if rpmatch is declared even after undefining macros. */ +#define HAVE_RAW_DECL_RPMATCH 1 + +/* Define to 1 if setenv is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SETENV 1 + +/* Define to 1 if setstate_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SETSTATE_R 1 + +/* Define to 1 if setusershell is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SETUSERSHELL 1 + +/* Define to 1 if sigaction is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGACTION 1 + +/* Define to 1 if sigaddset is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGADDSET 1 + +/* Define to 1 if sigdelset is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGDELSET 1 + +/* Define to 1 if sigemptyset is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGEMPTYSET 1 + +/* Define to 1 if sigfillset is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGFILLSET 1 + +/* Define to 1 if sigismember is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGISMEMBER 1 + +/* Define to 1 if sigpending is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGPENDING 1 + +/* Define to 1 if sigprocmask is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SIGPROCMASK 1 + +/* Define to 1 if sleep is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SLEEP 1 + +/* Define to 1 if snprintf is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SNPRINTF 1 + +/* Define to 1 if srandom_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SRANDOM_R 1 + +/* Define to 1 if stat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STAT 1 + +/* Define to 1 if stpcpy is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STPCPY 1 + +/* Define to 1 if stpncpy is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STPNCPY 1 + +/* Define to 1 if strcasestr is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRCASESTR 1 + +/* Define to 1 if strchrnul is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRCHRNUL 1 + +/* Define to 1 if strdup is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRDUP 1 + +/* Define to 1 if strerror_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRERROR_R 1 + +/* Define to 1 if strncat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRNCAT 1 + +/* Define to 1 if strndup is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRNDUP 1 + +/* Define to 1 if strnlen is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRNLEN 1 + +/* Define to 1 if strpbrk is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRPBRK 1 + +/* Define to 1 if strsep is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRSEP 1 + +/* Define to 1 if strsignal is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRSIGNAL 1 + +/* Define to 1 if strtod is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRTOD 1 + +/* Define to 1 if strtok_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRTOK_R 1 + +/* Define to 1 if strtoll is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRTOLL 1 + +/* Define to 1 if strtoull is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRTOULL 1 + +/* Define to 1 if strverscmp is declared even after undefining macros. */ +#define HAVE_RAW_DECL_STRVERSCMP 1 + +/* Define to 1 if symlink is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SYMLINK 1 + +/* Define to 1 if symlinkat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_SYMLINKAT 1 + +/* Define to 1 if tmpfile is declared even after undefining macros. */ +#define HAVE_RAW_DECL_TMPFILE 1 + +/* Define to 1 if ttyname_r is declared even after undefining macros. */ +#define HAVE_RAW_DECL_TTYNAME_R 1 + +/* Define to 1 if unlink is declared even after undefining macros. */ +#define HAVE_RAW_DECL_UNLINK 1 + +/* Define to 1 if unlinkat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_UNLINKAT 1 + +/* Define to 1 if unlockpt is declared even after undefining macros. */ +#define HAVE_RAW_DECL_UNLOCKPT 1 + +/* Define to 1 if unsetenv is declared even after undefining macros. */ +#define HAVE_RAW_DECL_UNSETENV 1 + +/* Define to 1 if usleep is declared even after undefining macros. */ +#define HAVE_RAW_DECL_USLEEP 1 + +/* Define to 1 if utimensat is declared even after undefining macros. */ +#define HAVE_RAW_DECL_UTIMENSAT 1 + +/* Define to 1 if vdprintf is declared even after undefining macros. */ +#define HAVE_RAW_DECL_VDPRINTF 1 + +/* Define to 1 if vsnprintf is declared even after undefining macros. */ +#define HAVE_RAW_DECL_VSNPRINTF 1 + +/* Define to 1 if _Exit is declared even after undefining macros. */ +#define HAVE_RAW_DECL__EXIT 1 + +/* Define to 1 if you have the `readlink' function. */ +#define HAVE_READLINK 1 + +/* Define to 1 if you have the `readlinkat' function. */ +#define HAVE_READLINKAT 1 + +/* Define to 1 if you have the `realpath' function. */ +#define HAVE_REALPATH 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEARCH_H 1 + +/* Define to 1 if you have the `setenv' function. */ +#define HAVE_SETENV 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if 'sig_atomic_t' is a signed integer type. */ +/* #undef HAVE_SIGNED_SIG_ATOMIC_T */ + +/* Define to 1 if 'wchar_t' is a signed integer type. */ +/* #undef HAVE_SIGNED_WCHAR_T */ + +/* Define to 1 if 'wint_t' is a signed integer type. */ +/* #undef HAVE_SIGNED_WINT_T */ + +/* Define to 1 if the system has the type `sigset_t'. */ +#define HAVE_SIGSET_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_BITYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the `tsearch' function. */ +#define HAVE_TSEARCH 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#define HAVE_UNSIGNED_LONG_LONG_INT 1 + +/* Define to 1 or 0, depending whether the compiler supports simple visibility + declarations. */ +#define HAVE_VISIBILITY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WCHAR_H 1 + +/* Define if you have the 'wchar_t' type. */ +#define HAVE_WCHAR_T 1 + +/* Define to 1 if you have the `wcrtomb' function. */ +#define HAVE_WCRTOMB 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if O_NOATIME works. */ +#define HAVE_WORKING_O_NOATIME 1 + +/* Define to 1 if O_NOFOLLOW works. */ +#define HAVE_WORKING_O_NOFOLLOW 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Define to 1 if you have the `_NSGetExecutablePath' function. */ +/* #undef HAVE__NSGETEXECUTABLEPATH */ + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to the value of ${prefix}, as a string. */ +#define INSTALLPREFIX "/usr/local" + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */ +#define MALLOC_0_IS_NONNULL 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libiconv" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'ptrdiff_t'. */ +/* #undef PTRDIFF_T_SUFFIX */ + +/* Define to 1 if readlink fails to recognize a trailing slash. */ +/* #undef READLINK_TRAILING_SLASH_BUG */ + +/* Define to 1 if stat needs help when passed a directory name with a trailing + slash */ +/* #undef REPLACE_FUNC_STAT_DIR */ + +/* Define to 1 if stat needs help when passed a file name with a trailing + slash */ +/* #undef REPLACE_FUNC_STAT_FILE */ + +/* Define to 1 if strerror(0) does not return a message implying success. */ +/* #undef REPLACE_STRERROR_0 */ + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'sig_atomic_t'. */ +/* #undef SIG_ATOMIC_T_SUFFIX */ + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'size_t'. */ +/* #undef SIZE_T_SUFFIX */ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +/* #undef STAT_MACROS_BROKEN */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +#define STRERROR_R_CHAR_P 1 + +/* Define to the prefix of C symbols at the assembler and linker level, either + an underscore or empty. */ +#define USER_LABEL_PREFIX + +/* Define to 1 if you want getc etc. to use unlocked I/O if available. + Unlocked I/O can improve performance in unithreaded apps, but it is not + safe for multithreaded apps. */ +#define USE_UNLOCKED_IO 1 + +/* Version number of package */ +#define VERSION "1.14" + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'wchar_t'. */ +/* #undef WCHAR_T_SUFFIX */ + +/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type + 'wint_t'. */ +/* #undef WINT_T_SUFFIX */ + +/* Define if the machine's byte ordering is little endian. */ +#define WORDS_LITTLEENDIAN 1 + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* The _Noreturn keyword of draft C1X. */ +#ifndef _Noreturn +# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ + || 0x5110 <= __SUNPRO_C) +# define _Noreturn __attribute__ ((__noreturn__)) +# elif 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn +# endif +#endif + + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to 500 only on HP-UX. */ +/* #undef _XOPEN_SOURCE */ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable general extensions on MacOS X. */ +#ifndef _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports + the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of + earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. + __APPLE__ && __MACH__ test for MacOS X. + __APPLE_CC__ tests for the Apple compiler and its version. + __STDC_VERSION__ tests for the C99 mode. */ +#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ +# define __GNUC_STDC_INLINE__ 1 +#endif + +/* Define to a type if does not define. */ +/* #undef mbstate_t */ + +/* Define to the type of st_nlink in struct stat, or a supertype. */ +/* #undef nlink_t */ + +/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#define restrict __restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define as a signed type of the same size as size_t. */ +/* #undef ssize_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define as a marker that can be attached to declarations that might not + be used. This helps to reduce warnings, such as from + GCC -Wunused-parameter. */ +#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +# define _GL_UNUSED __attribute__ ((__unused__)) +#else +# define _GL_UNUSED +#endif +/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name + is a misnomer outside of parameter lists. */ +#define _UNUSED_PARAMETER_ _GL_UNUSED + +/* The __pure__ attribute was added in gcc 2.96. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) +#else +# define _GL_ATTRIBUTE_PURE /* empty */ +#endif + +/* The __const__ attribute was added in gcc 2.95. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) +#else +# define _GL_ATTRIBUTE_CONST /* empty */ +#endif + + + +/* On Windows, variables that may be in a DLL must be marked specially. */ +#if defined _MSC_VER && defined _DLL +# define DLL_VARIABLE __declspec (dllimport) +#else +# define DLL_VARIABLE +#endif + diff --git a/Externals/libiconv-1.14/include/export.h b/Externals/libiconv-1.14/include/export.h new file mode 100644 index 0000000000..62fb77b3c6 --- /dev/null +++ b/Externals/libiconv-1.14/include/export.h @@ -0,0 +1,6 @@ + +#if @HAVE_VISIBILITY@ && BUILDING_LIBICONV +#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default"))) +#else +#define LIBICONV_DLL_EXPORTED +#endif diff --git a/Externals/libiconv-1.14/include/iconv.h b/Externals/libiconv-1.14/include/iconv.h new file mode 100644 index 0000000000..987a11ec8f --- /dev/null +++ b/Externals/libiconv-1.14/include/iconv.h @@ -0,0 +1,248 @@ +/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* When installed, this file is called "iconv.h". */ + +#ifndef _LIBICONV_H +#define _LIBICONV_H + +#define _LIBICONV_VERSION 0x010E /* version number: (major<<8) + minor */ + +#if 1 && BUILDING_LIBICONV +#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default"))) +#else +#define LIBICONV_DLL_EXPORTED +#endif +extern LIBICONV_DLL_EXPORTED int _libiconv_version; /* Likewise */ + +/* We would like to #include any system header file which could define + iconv_t, 1. in order to eliminate the risk that the user gets compilation + errors because some other system header file includes /usr/include/iconv.h + which defines iconv_t or declares iconv after this file, 2. when compiling + for LIBICONV_PLUG, we need the proper iconv_t type in order to produce + binary compatible code. + But gcc's #include_next is not portable. Thus, once libiconv's iconv.h + has been installed in /usr/local/include, there is no way any more to + include the original /usr/include/iconv.h. We simply have to get away + without it. + Ad 1. The risk that a system header file does + #include "iconv.h" or #include_next "iconv.h" + is small. They all do #include . + Ad 2. The iconv_t type is a pointer type in all cases I have seen. (It + has to be a scalar type because (iconv_t)(-1) is a possible return value + from iconv_open().) */ + +/* Define iconv_t ourselves. */ +#undef iconv_t +#define iconv_t libiconv_t +typedef void* iconv_t; + +/* Get size_t declaration. + Get wchar_t declaration if it exists. */ +#include + +/* Get errno declaration and values. */ +#include +/* Some systems, like SunOS 4, don't have EILSEQ. Some systems, like BSD/OS, + have EILSEQ in a different header. On these systems, define EILSEQ + ourselves. */ +#ifndef EILSEQ +#define EILSEQ +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Allocates descriptor for code conversion from encoding ‘fromcode’ to + encoding ‘tocode’. */ +#ifndef LIBICONV_PLUG +#define iconv_open libiconv_open +#endif +extern LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode); + +/* Converts, using conversion descriptor ‘cd’, at most ‘*inbytesleft’ bytes + starting at ‘*inbuf’, writing at most ‘*outbytesleft’ bytes starting at + ‘*outbuf’. + Decrements ‘*inbytesleft’ and increments ‘*inbuf’ by the same amount. + Decrements ‘*outbytesleft’ and increments ‘*outbuf’ by the same amount. */ +#ifndef LIBICONV_PLUG +#define iconv libiconv +#endif +extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); + +/* Frees resources allocated for conversion descriptor ‘cd’. */ +#ifndef LIBICONV_PLUG +#define iconv_close libiconv_close +#endif +extern LIBICONV_DLL_EXPORTED int iconv_close (iconv_t cd); + + +#ifdef __cplusplus +} +#endif + + +#ifndef LIBICONV_PLUG + +/* Nonstandard extensions. */ + +#if 1 +#if 0 +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +#include +#include +#include +#endif +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* A type that holds all memory needed by a conversion descriptor. + A pointer to such an object can be used as an iconv_t. */ +typedef struct { + void* dummy1[28]; +#if 1 + mbstate_t dummy2; +#endif +} iconv_allocation_t; + +/* Allocates descriptor for code conversion from encoding ‘fromcode’ to + encoding ‘tocode’ into preallocated memory. Returns an error indicator + (0 or -1 with errno set). */ +#define iconv_open_into libiconv_open_into +extern LIBICONV_DLL_EXPORTED int iconv_open_into (const char* tocode, const char* fromcode, + iconv_allocation_t* resultp); + +/* Control of attributes. */ +#define iconvctl libiconvctl +extern LIBICONV_DLL_EXPORTED int iconvctl (iconv_t cd, int request, void* argument); + +/* Hook performed after every successful conversion of a Unicode character. */ +typedef void (*iconv_unicode_char_hook) (unsigned int uc, void* data); +/* Hook performed after every successful conversion of a wide character. */ +typedef void (*iconv_wide_char_hook) (wchar_t wc, void* data); +/* Set of hooks. */ +struct iconv_hooks { + iconv_unicode_char_hook uc_hook; + iconv_wide_char_hook wc_hook; + void* data; +}; + +/* Fallback function. Invoked when a small number of bytes could not be + converted to a Unicode character. This function should process all + bytes from inbuf and may produce replacement Unicode characters by calling + the write_replacement callback repeatedly. */ +typedef void (*iconv_unicode_mb_to_uc_fallback) + (const char* inbuf, size_t inbufsize, + void (*write_replacement) (const unsigned int *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data); +/* Fallback function. Invoked when a Unicode character could not be converted + to the target encoding. This function should process the character and + may produce replacement bytes (in the target encoding) by calling the + write_replacement callback repeatedly. */ +typedef void (*iconv_unicode_uc_to_mb_fallback) + (unsigned int code, + void (*write_replacement) (const char *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data); +#if 1 +/* Fallback function. Invoked when a number of bytes could not be converted to + a wide character. This function should process all bytes from inbuf and may + produce replacement wide characters by calling the write_replacement + callback repeatedly. */ +typedef void (*iconv_wchar_mb_to_wc_fallback) + (const char* inbuf, size_t inbufsize, + void (*write_replacement) (const wchar_t *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data); +/* Fallback function. Invoked when a wide character could not be converted to + the target encoding. This function should process the character and may + produce replacement bytes (in the target encoding) by calling the + write_replacement callback repeatedly. */ +typedef void (*iconv_wchar_wc_to_mb_fallback) + (wchar_t code, + void (*write_replacement) (const char *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data); +#else +/* If the wchar_t type does not exist, these two fallback functions are never + invoked. Their argument list therefore does not matter. */ +typedef void (*iconv_wchar_mb_to_wc_fallback) (); +typedef void (*iconv_wchar_wc_to_mb_fallback) (); +#endif +/* Set of fallbacks. */ +struct iconv_fallbacks { + iconv_unicode_mb_to_uc_fallback mb_to_uc_fallback; + iconv_unicode_uc_to_mb_fallback uc_to_mb_fallback; + iconv_wchar_mb_to_wc_fallback mb_to_wc_fallback; + iconv_wchar_wc_to_mb_fallback wc_to_mb_fallback; + void* data; +}; + +/* Requests for iconvctl. */ +#define ICONV_TRIVIALP 0 /* int *argument */ +#define ICONV_GET_TRANSLITERATE 1 /* int *argument */ +#define ICONV_SET_TRANSLITERATE 2 /* const int *argument */ +#define ICONV_GET_DISCARD_ILSEQ 3 /* int *argument */ +#define ICONV_SET_DISCARD_ILSEQ 4 /* const int *argument */ +#define ICONV_SET_HOOKS 5 /* const struct iconv_hooks *argument */ +#define ICONV_SET_FALLBACKS 6 /* const struct iconv_fallbacks *argument */ + +/* Listing of locale independent encodings. */ +#define iconvlist libiconvlist +extern LIBICONV_DLL_EXPORTED void iconvlist (int (*do_one) (unsigned int namescount, + const char * const * names, + void* data), + void* data); + +/* Canonicalize an encoding name. + The result is either a canonical encoding name, or name itself. */ +extern LIBICONV_DLL_EXPORTED const char * iconv_canonicalize (const char * name); + +/* Support for relocatable packages. */ + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +extern LIBICONV_DLL_EXPORTED void libiconv_set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + +#ifdef __cplusplus +} +#endif + +#endif + + +#endif /* _LIBICONV_H */ diff --git a/Externals/libiconv-1.14/lib/aliases.h b/Externals/libiconv-1.14/lib/aliases.h new file mode 100644 index 0000000000..b68ea2d19a --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases.h @@ -0,0 +1,1719 @@ +/* ANSI-C code produced by gperf version 3.0.4 */ +/* Command-line: gperf -m 10 lib/aliases.gperf */ +/* Computed positions: -k'1,3-11,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "lib/aliases.gperf" +struct alias { int name; unsigned int encoding_index; }; + +#define TOTAL_KEYWORDS 347 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 45 +#define MIN_HASH_VALUE 7 +#define MAX_HASH_VALUE 935 +/* maximum key range = 929, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +aliases_hash (register const char *str, register unsigned int len) +{ + static const unsigned short asso_values[] = + { + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 16, 62, 936, 73, 0, + 5, 2, 47, 4, 1, 168, 8, 12, 357, 936, + 936, 936, 936, 936, 936, 112, 123, 3, 14, 34, + 71, 142, 147, 0, 258, 79, 39, 122, 4, 0, + 109, 936, 76, 1, 54, 147, 114, 180, 102, 3, + 10, 936, 936, 936, 936, 34, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +struct stringpool_t + { + char stringpool_str7[sizeof("SJIS")]; + char stringpool_str9[sizeof("CN")]; + char stringpool_str11[sizeof("CP1131")]; + char stringpool_str12[sizeof("CP1361")]; + char stringpool_str13[sizeof("866")]; + char stringpool_str15[sizeof("CP1133")]; + char stringpool_str18[sizeof("CP1251")]; + char stringpool_str19[sizeof("CP866")]; + char stringpool_str20[sizeof("CP1256")]; + char stringpool_str21[sizeof("862")]; + char stringpool_str22[sizeof("CP1253")]; + char stringpool_str24[sizeof("CP936")]; + char stringpool_str26[sizeof("CP1255")]; + char stringpool_str27[sizeof("CP862")]; + char stringpool_str28[sizeof("CP1252")]; + char stringpool_str30[sizeof("C99")]; + char stringpool_str32[sizeof("CP932")]; + char stringpool_str34[sizeof("CP1258")]; + char stringpool_str40[sizeof("CP819")]; + char stringpool_str41[sizeof("L1")]; + char stringpool_str42[sizeof("L6")]; + char stringpool_str43[sizeof("L3")]; + char stringpool_str45[sizeof("L5")]; + char stringpool_str46[sizeof("L2")]; + char stringpool_str49[sizeof("L8")]; + char stringpool_str53[sizeof("EUCCN")]; + char stringpool_str57[sizeof("ISO8859-1")]; + char stringpool_str58[sizeof("ISO8859-11")]; + char stringpool_str59[sizeof("ISO8859-6")]; + char stringpool_str60[sizeof("ISO8859-16")]; + char stringpool_str61[sizeof("ISO8859-3")]; + char stringpool_str62[sizeof("ISO8859-13")]; + char stringpool_str65[sizeof("ISO8859-5")]; + char stringpool_str66[sizeof("ISO8859-15")]; + char stringpool_str67[sizeof("ISO8859-2")]; + char stringpool_str70[sizeof("EUC-CN")]; + char stringpool_str73[sizeof("ISO8859-8")]; + char stringpool_str74[sizeof("ISO-8859-1")]; + char stringpool_str75[sizeof("ISO-8859-11")]; + char stringpool_str76[sizeof("ISO-8859-6")]; + char stringpool_str77[sizeof("ISO-8859-16")]; + char stringpool_str78[sizeof("ISO-8859-3")]; + char stringpool_str79[sizeof("ISO-8859-13")]; + char stringpool_str81[sizeof("ISO8859-9")]; + char stringpool_str82[sizeof("ISO-8859-5")]; + char stringpool_str83[sizeof("ISO-8859-15")]; + char stringpool_str84[sizeof("ISO-8859-2")]; + char stringpool_str85[sizeof("ISO646-CN")]; + char stringpool_str86[sizeof("R8")]; + char stringpool_str88[sizeof("L4")]; + char stringpool_str90[sizeof("ISO-8859-8")]; + char stringpool_str91[sizeof("CP949")]; + char stringpool_str92[sizeof("ISO_8859-1")]; + char stringpool_str93[sizeof("ISO_8859-11")]; + char stringpool_str94[sizeof("ISO_8859-6")]; + char stringpool_str95[sizeof("ISO_8859-16")]; + char stringpool_str96[sizeof("ISO_8859-3")]; + char stringpool_str97[sizeof("ISO_8859-13")]; + char stringpool_str98[sizeof("ISO-8859-9")]; + char stringpool_str99[sizeof("ISO_8859-16:2001")]; + char stringpool_str100[sizeof("ISO_8859-5")]; + char stringpool_str101[sizeof("ISO_8859-15")]; + char stringpool_str102[sizeof("ISO_8859-2")]; + char stringpool_str103[sizeof("LATIN1")]; + char stringpool_str105[sizeof("LATIN6")]; + char stringpool_str106[sizeof("CP154")]; + char stringpool_str107[sizeof("LATIN3")]; + char stringpool_str108[sizeof("ISO_8859-8")]; + char stringpool_str110[sizeof("ISO_8859-15:1998")]; + char stringpool_str111[sizeof("LATIN5")]; + char stringpool_str112[sizeof("CP1254")]; + char stringpool_str113[sizeof("LATIN2")]; + char stringpool_str114[sizeof("CSISO2022CN")]; + char stringpool_str116[sizeof("ISO_8859-9")]; + char stringpool_str117[sizeof("CHINESE")]; + char stringpool_str118[sizeof("ISO-IR-6")]; + char stringpool_str119[sizeof("LATIN8")]; + char stringpool_str120[sizeof("ASCII")]; + char stringpool_str121[sizeof("ISO-IR-166")]; + char stringpool_str122[sizeof("X0212")]; + char stringpool_str124[sizeof("VISCII")]; + char stringpool_str125[sizeof("ISO-IR-126")]; + char stringpool_str126[sizeof("CSASCII")]; + char stringpool_str127[sizeof("ISO-IR-165")]; + char stringpool_str129[sizeof("CSVISCII")]; + char stringpool_str130[sizeof("ISO-IR-226")]; + char stringpool_str131[sizeof("MAC")]; + char stringpool_str136[sizeof("ISO-IR-138")]; + char stringpool_str137[sizeof("ISO-IR-58")]; + char stringpool_str139[sizeof("IBM866")]; + char stringpool_str142[sizeof("ISO-2022-CN")]; + char stringpool_str143[sizeof("MS936")]; + char stringpool_str144[sizeof("LATIN-9")]; + char stringpool_str146[sizeof("ISO-IR-159")]; + char stringpool_str147[sizeof("IBM862")]; + char stringpool_str150[sizeof("US")]; + char stringpool_str151[sizeof("ISO8859-4")]; + char stringpool_str152[sizeof("ISO8859-14")]; + char stringpool_str153[sizeof("ISO_8859-14:1998")]; + char stringpool_str154[sizeof("ISO-IR-199")]; + char stringpool_str156[sizeof("UHC")]; + char stringpool_str157[sizeof("850")]; + char stringpool_str159[sizeof("HZ")]; + char stringpool_str160[sizeof("IBM819")]; + char stringpool_str162[sizeof("ISO-CELTIC")]; + char stringpool_str163[sizeof("ELOT_928")]; + char stringpool_str164[sizeof("CP1250")]; + char stringpool_str165[sizeof("GB2312")]; + char stringpool_str166[sizeof("CP850")]; + char stringpool_str168[sizeof("ISO-8859-4")]; + char stringpool_str169[sizeof("ISO-8859-14")]; + char stringpool_str170[sizeof("CP950")]; + char stringpool_str171[sizeof("CYRILLIC")]; + char stringpool_str176[sizeof("ISO_8859-10:1992")]; + char stringpool_str179[sizeof("UCS-2")]; + char stringpool_str180[sizeof("TCVN")]; + char stringpool_str181[sizeof("ISO-IR-148")]; + char stringpool_str185[sizeof("X0201")]; + char stringpool_str186[sizeof("ISO_8859-4")]; + char stringpool_str187[sizeof("ISO_8859-14")]; + char stringpool_str188[sizeof("L10")]; + char stringpool_str189[sizeof("ISO-IR-149")]; + char stringpool_str191[sizeof("ISO-IR-101")]; + char stringpool_str196[sizeof("ISO-2022-CN-EXT")]; + char stringpool_str197[sizeof("LATIN4")]; + char stringpool_str200[sizeof("ISO-IR-203")]; + char stringpool_str201[sizeof("X0208")]; + char stringpool_str202[sizeof("KSC_5601")]; + char stringpool_str204[sizeof("ISO8859-10")]; + char stringpool_str207[sizeof("VISCII1.1-1")]; + char stringpool_str209[sizeof("L7")]; + char stringpool_str211[sizeof("ISO-IR-14")]; + char stringpool_str212[sizeof("PT154")]; + char stringpool_str213[sizeof("TIS620")]; + char stringpool_str215[sizeof("ISO-IR-109")]; + char stringpool_str216[sizeof("CSUNICODE11")]; + char stringpool_str217[sizeof("KOI8-T")]; + char stringpool_str218[sizeof("RK1048")]; + char stringpool_str221[sizeof("ISO-8859-10")]; + char stringpool_str222[sizeof("TIS620.2533-1")]; + char stringpool_str223[sizeof("ISO646-US")]; + char stringpool_str224[sizeof("CSISOLATIN1")]; + char stringpool_str226[sizeof("CSISOLATIN6")]; + char stringpool_str228[sizeof("CSISOLATIN3")]; + char stringpool_str230[sizeof("TIS-620")]; + char stringpool_str232[sizeof("CSISOLATIN5")]; + char stringpool_str234[sizeof("CSISOLATIN2")]; + char stringpool_str235[sizeof("TIS620.2529-1")]; + char stringpool_str236[sizeof("CSKZ1048")]; + char stringpool_str237[sizeof("CSISOLATINCYRILLIC")]; + char stringpool_str238[sizeof("KZ-1048")]; + char stringpool_str239[sizeof("ISO_8859-10")]; + char stringpool_str241[sizeof("UNICODE-1-1")]; + char stringpool_str242[sizeof("UTF-16")]; + char stringpool_str245[sizeof("MS-EE")]; + char stringpool_str248[sizeof("CSUNICODE")]; + char stringpool_str249[sizeof("CSKOI8R")]; + char stringpool_str250[sizeof("LATIN10")]; + char stringpool_str252[sizeof("UTF-32")]; + char stringpool_str254[sizeof("CSUCS4")]; + char stringpool_str255[sizeof("UTF-8")]; + char stringpool_str259[sizeof("ISO-IR-144")]; + char stringpool_str261[sizeof("KOI8-R")]; + char stringpool_str262[sizeof("MS-ANSI")]; + char stringpool_str263[sizeof("UCS-4")]; + char stringpool_str264[sizeof("ISO-IR-110")]; + char stringpool_str266[sizeof("IBM-CP1133")]; + char stringpool_str267[sizeof("CSIBM866")]; + char stringpool_str270[sizeof("KS_C_5601-1989")]; + char stringpool_str271[sizeof("CHAR")]; + char stringpool_str273[sizeof("EUCKR")]; + char stringpool_str277[sizeof("BIG5")]; + char stringpool_str278[sizeof("CP874")]; + char stringpool_str279[sizeof("ARMSCII-8")]; + char stringpool_str282[sizeof("CSBIG5")]; + char stringpool_str283[sizeof("UCS-2LE")]; + char stringpool_str286[sizeof("IBM850")]; + char stringpool_str287[sizeof("US-ASCII")]; + char stringpool_str290[sizeof("EUC-KR")]; + char stringpool_str293[sizeof("CSGB2312")]; + char stringpool_str294[sizeof("BIG-5")]; + char stringpool_str295[sizeof("TIS620.2533-0")]; + char stringpool_str299[sizeof("CN-BIG5")]; + char stringpool_str302[sizeof("MACCYRILLIC")]; + char stringpool_str303[sizeof("GBK")]; + char stringpool_str304[sizeof("TIS620-0")]; + char stringpool_str305[sizeof("MS-CYRL")]; + char stringpool_str307[sizeof("CYRILLIC-ASIAN")]; + char stringpool_str308[sizeof("ECMA-118")]; + char stringpool_str310[sizeof("ISO-IR-179")]; + char stringpool_str311[sizeof("GREEK8")]; + char stringpool_str315[sizeof("KOREAN")]; + char stringpool_str318[sizeof("CSISOLATIN4")]; + char stringpool_str321[sizeof("ISO-10646-UCS-2")]; + char stringpool_str325[sizeof("UCS-4LE")]; + char stringpool_str326[sizeof("PTCP154")]; + char stringpool_str330[sizeof("CSISO14JISC6220RO")]; + char stringpool_str334[sizeof("CSISO2022KR")]; + char stringpool_str336[sizeof("ROMAN8")]; + char stringpool_str337[sizeof("ISO-IR-100")]; + char stringpool_str340[sizeof("JIS_C6226-1983")]; + char stringpool_str344[sizeof("CSISOLATINARABIC")]; + char stringpool_str347[sizeof("CP367")]; + char stringpool_str350[sizeof("UTF-16LE")]; + char stringpool_str351[sizeof("ISO_646.IRV:1991")]; + char stringpool_str354[sizeof("CP1257")]; + char stringpool_str355[sizeof("MACICELAND")]; + char stringpool_str356[sizeof("UTF-32LE")]; + char stringpool_str357[sizeof("CSKSC56011987")]; + char stringpool_str359[sizeof("ARABIC")]; + char stringpool_str362[sizeof("ISO-2022-KR")]; + char stringpool_str363[sizeof("ISO-10646-UCS-4")]; + char stringpool_str367[sizeof("UCS-2BE")]; + char stringpool_str368[sizeof("GB_2312-80")]; + char stringpool_str369[sizeof("JP")]; + char stringpool_str371[sizeof("MULELAO-1")]; + char stringpool_str372[sizeof("CSISO159JISX02121990")]; + char stringpool_str373[sizeof("GREEK")]; + char stringpool_str375[sizeof("TCVN5712-1")]; + char stringpool_str376[sizeof("CSISO58GB231280")]; + char stringpool_str378[sizeof("GB18030")]; + char stringpool_str379[sizeof("TCVN-5712")]; + char stringpool_str384[sizeof("GB_1988-80")]; + char stringpool_str385[sizeof("CSPTCP154")]; + char stringpool_str386[sizeof("ECMA-114")]; + char stringpool_str388[sizeof("CSUNICODE11UTF7")]; + char stringpool_str391[sizeof("ANSI_X3.4-1986")]; + char stringpool_str392[sizeof("UNICODELITTLE")]; + char stringpool_str393[sizeof("ISO8859-7")]; + char stringpool_str395[sizeof("CN-GB-ISOIR165")]; + char stringpool_str396[sizeof("STRK1048-2002")]; + char stringpool_str398[sizeof("ANSI_X3.4-1968")]; + char stringpool_str403[sizeof("KOI8-U")]; + char stringpool_str406[sizeof("UCS-2-INTERNAL")]; + char stringpool_str409[sizeof("UCS-4BE")]; + char stringpool_str410[sizeof("ISO-8859-7")]; + char stringpool_str411[sizeof("SHIFT-JIS")]; + char stringpool_str412[sizeof("CN-GB")]; + char stringpool_str413[sizeof("JIS_C6220-1969-RO")]; + char stringpool_str415[sizeof("UNICODE-1-1-UTF-7")]; + char stringpool_str416[sizeof("WINDOWS-1251")]; + char stringpool_str417[sizeof("WINDOWS-1256")]; + char stringpool_str418[sizeof("WINDOWS-1253")]; + char stringpool_str420[sizeof("WINDOWS-1255")]; + char stringpool_str421[sizeof("WINDOWS-1252")]; + char stringpool_str422[sizeof("WINDOWS-936")]; + char stringpool_str424[sizeof("WINDOWS-1258")]; + char stringpool_str425[sizeof("CSEUCKR")]; + char stringpool_str426[sizeof("KS_C_5601-1987")]; + char stringpool_str428[sizeof("ISO_8859-7")]; + char stringpool_str429[sizeof("SHIFT_JIS")]; + char stringpool_str433[sizeof("JIS0208")]; + char stringpool_str434[sizeof("UTF-16BE")]; + char stringpool_str439[sizeof("LATIN7")]; + char stringpool_str440[sizeof("UTF-32BE")]; + char stringpool_str445[sizeof("MACTHAI")]; + char stringpool_str448[sizeof("UCS-4-INTERNAL")]; + char stringpool_str449[sizeof("CSISOLATINGREEK")]; + char stringpool_str451[sizeof("MACROMAN")]; + char stringpool_str452[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; + char stringpool_str456[sizeof("EUCTW")]; + char stringpool_str457[sizeof("ISO-IR-57")]; + char stringpool_str458[sizeof("ISO-IR-157")]; + char stringpool_str459[sizeof("ISO-IR-127")]; + char stringpool_str461[sizeof("ISO-IR-87")]; + char stringpool_str463[sizeof("WINDOWS-1254")]; + char stringpool_str464[sizeof("ISO_8859-3:1988")]; + char stringpool_str466[sizeof("ISO_8859-5:1988")]; + char stringpool_str467[sizeof("IBM367")]; + char stringpool_str470[sizeof("ISO_8859-8:1988")]; + char stringpool_str471[sizeof("HZ-GB-2312")]; + char stringpool_str473[sizeof("EUC-TW")]; + char stringpool_str474[sizeof("CSISO57GB1988")]; + char stringpool_str475[sizeof("NEXTSTEP")]; + char stringpool_str476[sizeof("CSISO2022JP2")]; + char stringpool_str478[sizeof("ISO_8859-9:1989")]; + char stringpool_str480[sizeof("KOI8-RU")]; + char stringpool_str487[sizeof("MACINTOSH")]; + char stringpool_str489[sizeof("WINDOWS-1250")]; + char stringpool_str492[sizeof("JIS_X0212")]; + char stringpool_str500[sizeof("ISO-2022-JP-1")]; + char stringpool_str501[sizeof("MACCROATIAN")]; + char stringpool_str502[sizeof("HP-ROMAN8")]; + char stringpool_str505[sizeof("ISO-2022-JP-2")]; + char stringpool_str509[sizeof("ISO_8859-4:1988")]; + char stringpool_str510[sizeof("BIG5HKSCS")]; + char stringpool_str515[sizeof("ASMO-708")]; + char stringpool_str518[sizeof("EUCJP")]; + char stringpool_str525[sizeof("BIGFIVE")]; + char stringpool_str527[sizeof("BIG5-HKSCS")]; + char stringpool_str531[sizeof("MACCENTRALEUROPE")]; + char stringpool_str532[sizeof("CSPC862LATINHEBREW")]; + char stringpool_str535[sizeof("EUC-JP")]; + char stringpool_str542[sizeof("BIG-FIVE")]; + char stringpool_str546[sizeof("CSSHIFTJIS")]; + char stringpool_str550[sizeof("ISO646-JP")]; + char stringpool_str554[sizeof("JISX0201-1976")]; + char stringpool_str555[sizeof("JIS_X0201")]; + char stringpool_str556[sizeof("CSISOLATINHEBREW")]; + char stringpool_str563[sizeof("MACARABIC")]; + char stringpool_str564[sizeof("CSISO87JISX0208")]; + char stringpool_str571[sizeof("JIS_X0208")]; + char stringpool_str575[sizeof("UTF-7")]; + char stringpool_str577[sizeof("MACGREEK")]; + char stringpool_str579[sizeof("CSISO2022JP")]; + char stringpool_str580[sizeof("MS-TURK")]; + char stringpool_str581[sizeof("JIS_X0212-1990")]; + char stringpool_str584[sizeof("WINDOWS-1257")]; + char stringpool_str586[sizeof("JIS_X0208-1983")]; + char stringpool_str590[sizeof("MS-GREEK")]; + char stringpool_str599[sizeof("CSHPROMAN8")]; + char stringpool_str600[sizeof("JAVA")]; + char stringpool_str601[sizeof("MS-HEBR")]; + char stringpool_str604[sizeof("CSMACINTOSH")]; + char stringpool_str607[sizeof("ISO-2022-JP")]; + char stringpool_str608[sizeof("CSEUCTW")]; + char stringpool_str614[sizeof("GEORGIAN-PS")]; + char stringpool_str615[sizeof("UNICODEBIG")]; + char stringpool_str617[sizeof("MS_KANJI")]; + char stringpool_str620[sizeof("CSPC850MULTILINGUAL")]; + char stringpool_str621[sizeof("MACUKRAINE")]; + char stringpool_str622[sizeof("ISO_8859-1:1987")]; + char stringpool_str623[sizeof("ISO_8859-6:1987")]; + char stringpool_str624[sizeof("ISO_8859-7:2003")]; + char stringpool_str626[sizeof("GEORGIAN-ACADEMY")]; + char stringpool_str627[sizeof("ISO_8859-2:1987")]; + char stringpool_str629[sizeof("JIS_X0212.1990-0")]; + char stringpool_str657[sizeof("JIS_X0208-1990")]; + char stringpool_str664[sizeof("WCHAR_T")]; + char stringpool_str673[sizeof("MACROMANIA")]; + char stringpool_str676[sizeof("WINDOWS-874")]; + char stringpool_str689[sizeof("CSEUCPKDFMTJAPANESE")]; + char stringpool_str691[sizeof("MS-ARAB")]; + char stringpool_str723[sizeof("UCS-2-SWAPPED")]; + char stringpool_str739[sizeof("TCVN5712-1:1993")]; + char stringpool_str746[sizeof("HEBREW")]; + char stringpool_str765[sizeof("UCS-4-SWAPPED")]; + char stringpool_str768[sizeof("JOHAB")]; + char stringpool_str786[sizeof("MACTURKISH")]; + char stringpool_str790[sizeof("ISO_8859-7:1987")]; + char stringpool_str842[sizeof("WINBALTRIM")]; + char stringpool_str888[sizeof("BIG5-HKSCS:2001")]; + char stringpool_str896[sizeof("BIG5-HKSCS:2008")]; + char stringpool_str898[sizeof("CSHALFWIDTHKATAKANA")]; + char stringpool_str900[sizeof("BIG5-HKSCS:1999")]; + char stringpool_str908[sizeof("MACHEBREW")]; + char stringpool_str935[sizeof("BIG5-HKSCS:2004")]; + }; +static const struct stringpool_t stringpool_contents = + { + "SJIS", + "CN", + "CP1131", + "CP1361", + "866", + "CP1133", + "CP1251", + "CP866", + "CP1256", + "862", + "CP1253", + "CP936", + "CP1255", + "CP862", + "CP1252", + "C99", + "CP932", + "CP1258", + "CP819", + "L1", + "L6", + "L3", + "L5", + "L2", + "L8", + "EUCCN", + "ISO8859-1", + "ISO8859-11", + "ISO8859-6", + "ISO8859-16", + "ISO8859-3", + "ISO8859-13", + "ISO8859-5", + "ISO8859-15", + "ISO8859-2", + "EUC-CN", + "ISO8859-8", + "ISO-8859-1", + "ISO-8859-11", + "ISO-8859-6", + "ISO-8859-16", + "ISO-8859-3", + "ISO-8859-13", + "ISO8859-9", + "ISO-8859-5", + "ISO-8859-15", + "ISO-8859-2", + "ISO646-CN", + "R8", + "L4", + "ISO-8859-8", + "CP949", + "ISO_8859-1", + "ISO_8859-11", + "ISO_8859-6", + "ISO_8859-16", + "ISO_8859-3", + "ISO_8859-13", + "ISO-8859-9", + "ISO_8859-16:2001", + "ISO_8859-5", + "ISO_8859-15", + "ISO_8859-2", + "LATIN1", + "LATIN6", + "CP154", + "LATIN3", + "ISO_8859-8", + "ISO_8859-15:1998", + "LATIN5", + "CP1254", + "LATIN2", + "CSISO2022CN", + "ISO_8859-9", + "CHINESE", + "ISO-IR-6", + "LATIN8", + "ASCII", + "ISO-IR-166", + "X0212", + "VISCII", + "ISO-IR-126", + "CSASCII", + "ISO-IR-165", + "CSVISCII", + "ISO-IR-226", + "MAC", + "ISO-IR-138", + "ISO-IR-58", + "IBM866", + "ISO-2022-CN", + "MS936", + "LATIN-9", + "ISO-IR-159", + "IBM862", + "US", + "ISO8859-4", + "ISO8859-14", + "ISO_8859-14:1998", + "ISO-IR-199", + "UHC", + "850", + "HZ", + "IBM819", + "ISO-CELTIC", + "ELOT_928", + "CP1250", + "GB2312", + "CP850", + "ISO-8859-4", + "ISO-8859-14", + "CP950", + "CYRILLIC", + "ISO_8859-10:1992", + "UCS-2", + "TCVN", + "ISO-IR-148", + "X0201", + "ISO_8859-4", + "ISO_8859-14", + "L10", + "ISO-IR-149", + "ISO-IR-101", + "ISO-2022-CN-EXT", + "LATIN4", + "ISO-IR-203", + "X0208", + "KSC_5601", + "ISO8859-10", + "VISCII1.1-1", + "L7", + "ISO-IR-14", + "PT154", + "TIS620", + "ISO-IR-109", + "CSUNICODE11", + "KOI8-T", + "RK1048", + "ISO-8859-10", + "TIS620.2533-1", + "ISO646-US", + "CSISOLATIN1", + "CSISOLATIN6", + "CSISOLATIN3", + "TIS-620", + "CSISOLATIN5", + "CSISOLATIN2", + "TIS620.2529-1", + "CSKZ1048", + "CSISOLATINCYRILLIC", + "KZ-1048", + "ISO_8859-10", + "UNICODE-1-1", + "UTF-16", + "MS-EE", + "CSUNICODE", + "CSKOI8R", + "LATIN10", + "UTF-32", + "CSUCS4", + "UTF-8", + "ISO-IR-144", + "KOI8-R", + "MS-ANSI", + "UCS-4", + "ISO-IR-110", + "IBM-CP1133", + "CSIBM866", + "KS_C_5601-1989", + "CHAR", + "EUCKR", + "BIG5", + "CP874", + "ARMSCII-8", + "CSBIG5", + "UCS-2LE", + "IBM850", + "US-ASCII", + "EUC-KR", + "CSGB2312", + "BIG-5", + "TIS620.2533-0", + "CN-BIG5", + "MACCYRILLIC", + "GBK", + "TIS620-0", + "MS-CYRL", + "CYRILLIC-ASIAN", + "ECMA-118", + "ISO-IR-179", + "GREEK8", + "KOREAN", + "CSISOLATIN4", + "ISO-10646-UCS-2", + "UCS-4LE", + "PTCP154", + "CSISO14JISC6220RO", + "CSISO2022KR", + "ROMAN8", + "ISO-IR-100", + "JIS_C6226-1983", + "CSISOLATINARABIC", + "CP367", + "UTF-16LE", + "ISO_646.IRV:1991", + "CP1257", + "MACICELAND", + "UTF-32LE", + "CSKSC56011987", + "ARABIC", + "ISO-2022-KR", + "ISO-10646-UCS-4", + "UCS-2BE", + "GB_2312-80", + "JP", + "MULELAO-1", + "CSISO159JISX02121990", + "GREEK", + "TCVN5712-1", + "CSISO58GB231280", + "GB18030", + "TCVN-5712", + "GB_1988-80", + "CSPTCP154", + "ECMA-114", + "CSUNICODE11UTF7", + "ANSI_X3.4-1986", + "UNICODELITTLE", + "ISO8859-7", + "CN-GB-ISOIR165", + "STRK1048-2002", + "ANSI_X3.4-1968", + "KOI8-U", + "UCS-2-INTERNAL", + "UCS-4BE", + "ISO-8859-7", + "SHIFT-JIS", + "CN-GB", + "JIS_C6220-1969-RO", + "UNICODE-1-1-UTF-7", + "WINDOWS-1251", + "WINDOWS-1256", + "WINDOWS-1253", + "WINDOWS-1255", + "WINDOWS-1252", + "WINDOWS-936", + "WINDOWS-1258", + "CSEUCKR", + "KS_C_5601-1987", + "ISO_8859-7", + "SHIFT_JIS", + "JIS0208", + "UTF-16BE", + "LATIN7", + "UTF-32BE", + "MACTHAI", + "UCS-4-INTERNAL", + "CSISOLATINGREEK", + "MACROMAN", + "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", + "EUCTW", + "ISO-IR-57", + "ISO-IR-157", + "ISO-IR-127", + "ISO-IR-87", + "WINDOWS-1254", + "ISO_8859-3:1988", + "ISO_8859-5:1988", + "IBM367", + "ISO_8859-8:1988", + "HZ-GB-2312", + "EUC-TW", + "CSISO57GB1988", + "NEXTSTEP", + "CSISO2022JP2", + "ISO_8859-9:1989", + "KOI8-RU", + "MACINTOSH", + "WINDOWS-1250", + "JIS_X0212", + "ISO-2022-JP-1", + "MACCROATIAN", + "HP-ROMAN8", + "ISO-2022-JP-2", + "ISO_8859-4:1988", + "BIG5HKSCS", + "ASMO-708", + "EUCJP", + "BIGFIVE", + "BIG5-HKSCS", + "MACCENTRALEUROPE", + "CSPC862LATINHEBREW", + "EUC-JP", + "BIG-FIVE", + "CSSHIFTJIS", + "ISO646-JP", + "JISX0201-1976", + "JIS_X0201", + "CSISOLATINHEBREW", + "MACARABIC", + "CSISO87JISX0208", + "JIS_X0208", + "UTF-7", + "MACGREEK", + "CSISO2022JP", + "MS-TURK", + "JIS_X0212-1990", + "WINDOWS-1257", + "JIS_X0208-1983", + "MS-GREEK", + "CSHPROMAN8", + "JAVA", + "MS-HEBR", + "CSMACINTOSH", + "ISO-2022-JP", + "CSEUCTW", + "GEORGIAN-PS", + "UNICODEBIG", + "MS_KANJI", + "CSPC850MULTILINGUAL", + "MACUKRAINE", + "ISO_8859-1:1987", + "ISO_8859-6:1987", + "ISO_8859-7:2003", + "GEORGIAN-ACADEMY", + "ISO_8859-2:1987", + "JIS_X0212.1990-0", + "JIS_X0208-1990", + "WCHAR_T", + "MACROMANIA", + "WINDOWS-874", + "CSEUCPKDFMTJAPANESE", + "MS-ARAB", + "UCS-2-SWAPPED", + "TCVN5712-1:1993", + "HEBREW", + "UCS-4-SWAPPED", + "JOHAB", + "MACTURKISH", + "ISO_8859-7:1987", + "WINBALTRIM", + "BIG5-HKSCS:2001", + "BIG5-HKSCS:2008", + "CSHALFWIDTHKATAKANA", + "BIG5-HKSCS:1999", + "MACHEBREW", + "BIG5-HKSCS:2004" + }; +#define stringpool ((const char *) &stringpool_contents) + +static const struct alias aliases[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 308 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str7, ei_sjis}, + {-1}, +#line 288 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str9, ei_iso646_cn}, + {-1}, +#line 209 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str11, ei_cp1131}, +#line 354 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str12, ei_johab}, +#line 207 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_cp866}, + {-1}, +#line 244 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_cp1133}, + {-1}, {-1}, +#line 174 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str18, ei_cp1251}, +#line 205 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_cp866}, +#line 189 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str20, ei_cp1256}, +#line 203 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str21, ei_cp862}, +#line 180 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_cp1253}, + {-1}, +#line 323 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_cp936}, + {-1}, +#line 186 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str26, ei_cp1255}, +#line 201 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, +#line 177 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_cp1252}, + {-1}, +#line 51 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_c99}, + {-1}, +#line 311 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp932}, + {-1}, +#line 195 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp1258}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 57 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str40, ei_iso8859_1}, +#line 60 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_iso8859_1}, +#line 134 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_iso8859_10}, +#line 76 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_iso8859_3}, + {-1}, +#line 126 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_iso8859_9}, +#line 68 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str46, ei_iso8859_2}, + {-1}, {-1}, +#line 151 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_iso8859_14}, + {-1}, {-1}, {-1}, +#line 318 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_euc_cn}, + {-1}, {-1}, {-1}, +#line 62 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str57, ei_iso8859_1}, +#line 139 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_iso8859_11}, +#line 102 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str59, ei_iso8859_6}, +#line 166 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_iso8859_16}, +#line 78 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str61, ei_iso8859_3}, +#line 145 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_iso8859_13}, + {-1}, {-1}, +#line 93 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str65, ei_iso8859_5}, +#line 159 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_15}, +#line 70 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_iso8859_2}, + {-1}, {-1}, +#line 317 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_euc_cn}, + {-1}, {-1}, +#line 120 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str73, ei_iso8859_8}, +#line 53 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_1}, +#line 137 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str75, ei_iso8859_11}, +#line 94 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_6}, +#line 160 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str77, ei_iso8859_16}, +#line 71 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str78, ei_iso8859_3}, +#line 140 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_iso8859_13}, + {-1}, +#line 128 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_iso8859_9}, +#line 87 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str82, ei_iso8859_5}, +#line 154 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str83, ei_iso8859_15}, +#line 63 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str84, ei_iso8859_2}, +#line 286 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str85, ei_iso646_cn}, +#line 227 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_hp_roman8}, + {-1}, +#line 84 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_iso8859_4}, + {-1}, +#line 114 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str90, ei_iso8859_8}, +#line 351 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_cp949}, +#line 54 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_iso8859_1}, +#line 138 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_11}, +#line 95 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_6}, +#line 161 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_16}, +#line 72 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_3}, +#line 141 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_13}, +#line 121 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_9}, +#line 162 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_iso8859_16}, +#line 88 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str100, ei_iso8859_5}, +#line 155 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_15}, +#line 64 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_2}, +#line 59 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, + {-1}, +#line 133 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_10}, +#line 236 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str106, ei_pt154}, +#line 75 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, +#line 115 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_8}, + {-1}, +#line 156 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_15}, +#line 125 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_9}, +#line 183 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_cp1254}, +#line 67 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str113, ei_iso8859_2}, +#line 328 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str114, ei_iso2022_cn}, + {-1}, +#line 122 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_9}, +#line 293 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_gb2312}, +#line 16 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_ascii}, +#line 150 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_14}, +#line 13 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_ascii}, +#line 252 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_tis620}, +#line 282 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_jisx0212}, + {-1}, +#line 255 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_viscii}, +#line 107 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_7}, +#line 22 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_ascii}, +#line 294 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_isoir165}, + {-1}, +#line 257 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_viscii}, +#line 163 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_16}, +#line 212 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_mac_roman}, + {-1}, {-1}, {-1}, {-1}, +#line 117 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_iso8859_8}, +#line 291 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_gb2312}, + {-1}, +#line 206 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp866}, + {-1}, {-1}, +#line 327 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso2022_cn}, +#line 324 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_cp936}, +#line 158 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_iso8859_15}, + {-1}, +#line 283 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_jisx0212}, +#line 202 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_cp862}, + {-1}, {-1}, +#line 21 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_ascii}, +#line 86 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_iso8859_4}, +#line 153 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_iso8859_14}, +#line 148 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_iso8859_14}, +#line 149 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_14}, + {-1}, +#line 352 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_cp949}, +#line 199 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_cp850}, + {-1}, +#line 330 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_hz}, +#line 58 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_iso8859_1}, + {-1}, +#line 152 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_14}, +#line 109 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_iso8859_7}, +#line 171 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_cp1250}, +#line 319 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_euc_cn}, +#line 197 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_cp850}, + {-1}, +#line 79 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_iso8859_4}, +#line 146 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_iso8859_14}, +#line 341 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_cp950}, +#line 91 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_iso8859_5}, + {-1}, {-1}, {-1}, {-1}, +#line 131 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, + {-1}, {-1}, +#line 24 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_ucs2}, +#line 258 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_tcvn}, +#line 124 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_iso8859_9}, + {-1}, {-1}, {-1}, +#line 269 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_jisx0201}, +#line 80 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_iso8859_4}, +#line 147 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_iso8859_14}, +#line 165 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_iso8859_16}, +#line 299 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_ksc5601}, + {-1}, +#line 66 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_2}, + {-1}, {-1}, {-1}, {-1}, +#line 329 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso2022_cn_ext}, +#line 83 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_4}, + {-1}, {-1}, +#line 157 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_iso8859_15}, +#line 275 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_jisx0208}, +#line 296 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_ksc5601}, + {-1}, +#line 136 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_10}, + {-1}, {-1}, +#line 256 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_viscii}, + {-1}, +#line 144 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_13}, + {-1}, +#line 264 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso646_jp}, +#line 234 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_pt154}, +#line 247 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_tis620}, + {-1}, +#line 74 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_iso8859_3}, +#line 30 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_ucs2be}, +#line 233 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_koi8_t}, +#line 239 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str218, ei_rk1048}, + {-1}, {-1}, +#line 129 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_iso8859_10}, +#line 251 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_tis620}, +#line 14 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_ascii}, +#line 61 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_1}, + {-1}, +#line 135 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str226, ei_iso8859_10}, + {-1}, +#line 77 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_iso8859_3}, + {-1}, +#line 246 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_tis620}, + {-1}, +#line 127 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_9}, + {-1}, +#line 69 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_iso8859_2}, +#line 249 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_tis620}, +#line 242 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_rk1048}, +#line 92 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso8859_5}, +#line 241 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_rk1048}, +#line 130 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_10}, + {-1}, +#line 29 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_ucs2be}, +#line 38 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_utf16}, + {-1}, {-1}, +#line 173 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str245, ei_cp1250}, + {-1}, {-1}, +#line 26 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_ucs2}, +#line 168 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str249, ei_koi8_r}, +#line 164 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_16}, + {-1}, +#line 41 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_utf32}, + {-1}, +#line 35 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_ucs4}, +#line 23 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_utf8}, + {-1}, {-1}, {-1}, +#line 90 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_iso8859_5}, + {-1}, +#line 167 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_koi8_r}, +#line 179 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_cp1252}, +#line 33 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_ucs4}, +#line 82 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_4}, + {-1}, +#line 245 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_cp1133}, +#line 208 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_cp866}, + {-1}, {-1}, +#line 298 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_ksc5601}, +#line 357 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_local_char}, + {-1}, +#line 349 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_euc_kr}, + {-1}, {-1}, {-1}, +#line 335 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_ces_big5}, +#line 253 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_cp874}, +#line 230 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_armscii_8}, + {-1}, {-1}, +#line 340 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str282, ei_ces_big5}, +#line 31 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_ucs2le}, + {-1}, {-1}, +#line 198 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str286, ei_cp850}, +#line 12 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_ascii}, + {-1}, {-1}, +#line 348 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str290, ei_euc_kr}, + {-1}, {-1}, +#line 321 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_euc_cn}, +#line 336 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_ces_big5}, +#line 250 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_tis620}, + {-1}, {-1}, {-1}, +#line 339 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_ces_big5}, + {-1}, {-1}, +#line 218 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str302, ei_mac_cyrillic}, +#line 322 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str303, ei_ces_gbk}, +#line 248 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_tis620}, +#line 176 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str305, ei_cp1251}, + {-1}, +#line 237 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_pt154}, +#line 108 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_iso8859_7}, + {-1}, +#line 142 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_iso8859_13}, +#line 110 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_iso8859_7}, + {-1}, {-1}, {-1}, +#line 301 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_ksc5601}, + {-1}, {-1}, +#line 85 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_iso8859_4}, + {-1}, {-1}, +#line 25 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str321, ei_ucs2}, + {-1}, {-1}, {-1}, +#line 37 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str325, ei_ucs4le}, +#line 235 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str326, ei_pt154}, + {-1}, {-1}, {-1}, +#line 266 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_iso646_jp}, + {-1}, {-1}, {-1}, +#line 356 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str334, ei_iso2022_kr}, + {-1}, +#line 226 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_hp_roman8}, +#line 56 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_1}, + {-1}, {-1}, +#line 277 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str340, ei_jisx0208}, + {-1}, {-1}, {-1}, +#line 101 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str344, ei_iso8859_6}, + {-1}, {-1}, +#line 19 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_ascii}, + {-1}, {-1}, +#line 40 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_utf16le}, +#line 15 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str351, ei_ascii}, + {-1}, {-1}, +#line 192 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_cp1257}, +#line 215 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_mac_iceland}, +#line 43 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_utf32le}, +#line 300 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str357, ei_ksc5601}, + {-1}, +#line 100 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_iso8859_6}, + {-1}, {-1}, +#line 355 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_iso2022_kr}, +#line 34 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_ucs4}, + {-1}, {-1}, {-1}, +#line 27 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_ucs2be}, +#line 290 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_gb2312}, +#line 265 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_iso646_jp}, + {-1}, +#line 243 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str371, ei_mulelao}, +#line 284 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_jisx0212}, +#line 111 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_iso8859_7}, + {-1}, +#line 260 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str375, ei_tcvn}, +#line 292 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str376, ei_gb2312}, + {-1}, +#line 326 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_gb18030}, +#line 259 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str379, ei_tcvn}, + {-1}, {-1}, {-1}, {-1}, +#line 285 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso646_cn}, +#line 238 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_pt154}, +#line 98 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_iso8859_6}, + {-1}, +#line 46 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str388, ei_utf7}, + {-1}, {-1}, +#line 18 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_ascii}, +#line 32 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_ucs2le}, +#line 113 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_iso8859_7}, + {-1}, +#line 295 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_isoir165}, +#line 240 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_rk1048}, + {-1}, +#line 17 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ascii}, + {-1}, {-1}, {-1}, {-1}, +#line 169 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_koi8_u}, + {-1}, {-1}, +#line 47 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_ucs2internal}, + {-1}, {-1}, +#line 36 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_ucs4be}, +#line 103 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_iso8859_7}, +#line 307 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_sjis}, +#line 320 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_euc_cn}, +#line 262 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_iso646_jp}, + {-1}, +#line 45 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_utf7}, +#line 175 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_cp1251}, +#line 190 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_cp1256}, +#line 181 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str418, ei_cp1253}, + {-1}, +#line 187 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_cp1255}, +#line 178 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_cp1252}, +#line 325 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str422, ei_cp936}, + {-1}, +#line 196 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str424, ei_cp1258}, +#line 350 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str425, ei_euc_kr}, +#line 297 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str426, ei_ksc5601}, + {-1}, +#line 104 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_iso8859_7}, +#line 306 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_sjis}, + {-1}, {-1}, {-1}, +#line 274 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_jisx0208}, +#line 39 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str434, ei_utf16be}, + {-1}, {-1}, {-1}, {-1}, +#line 143 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_iso8859_13}, +#line 42 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_utf32be}, + {-1}, {-1}, {-1}, {-1}, +#line 224 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_mac_thai}, + {-1}, {-1}, +#line 49 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_ucs4internal}, +#line 112 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_iso8859_7}, + {-1}, +#line 210 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_mac_roman}, +#line 304 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str452, ei_euc_jp}, + {-1}, {-1}, {-1}, +#line 333 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str456, ei_euc_tw}, +#line 287 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str457, ei_iso646_cn}, +#line 132 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str458, ei_iso8859_10}, +#line 97 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str459, ei_iso8859_6}, + {-1}, +#line 276 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_jisx0208}, + {-1}, +#line 184 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str463, ei_cp1254}, +#line 73 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_iso8859_3}, + {-1}, +#line 89 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_iso8859_5}, +#line 20 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_ascii}, + {-1}, {-1}, +#line 116 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_iso8859_8}, +#line 331 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str471, ei_hz}, + {-1}, +#line 332 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_euc_tw}, +#line 289 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_iso646_cn}, +#line 229 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_nextstep}, +#line 316 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_iso2022_jp2}, + {-1}, +#line 123 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_iso8859_9}, + {-1}, +#line 170 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str480, ei_koi8_ru}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 211 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_mac_roman}, + {-1}, +#line 172 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str489, ei_cp1250}, + {-1}, {-1}, +#line 279 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 314 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_iso2022_jp1}, +#line 216 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_mac_croatian}, +#line 225 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str502, ei_hp_roman8}, + {-1}, {-1}, +#line 315 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, +#line 81 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str509, ei_iso8859_4}, +#line 346 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_big5hkscs2008}, + {-1}, {-1}, {-1}, {-1}, +#line 99 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_iso8859_6}, + {-1}, {-1}, +#line 303 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 338 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_ces_big5}, + {-1}, +#line 345 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str527, ei_big5hkscs2008}, + {-1}, {-1}, {-1}, +#line 214 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_mac_centraleurope}, +#line 204 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_cp862}, + {-1}, {-1}, +#line 302 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str535, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 337 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_ces_big5}, + {-1}, {-1}, {-1}, +#line 310 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_sjis}, + {-1}, {-1}, {-1}, +#line 263 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str550, ei_iso646_jp}, + {-1}, {-1}, {-1}, +#line 268 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_jisx0201}, +#line 267 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str555, ei_jisx0201}, +#line 119 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_iso8859_8}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 223 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_mac_arabic}, +#line 278 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str564, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 271 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str571, ei_jisx0208}, + {-1}, {-1}, {-1}, +#line 44 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str575, ei_utf7}, + {-1}, +#line 220 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str577, ei_mac_greek}, + {-1}, +#line 313 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_iso2022_jp}, +#line 185 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str580, ei_cp1254}, +#line 281 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_jisx0212}, + {-1}, {-1}, +#line 193 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_cp1257}, + {-1}, +#line 272 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_jisx0208}, + {-1}, {-1}, {-1}, +#line 182 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str590, ei_cp1253}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 228 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str599, ei_hp_roman8}, +#line 52 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str600, ei_java}, +#line 188 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str601, ei_cp1255}, + {-1}, {-1}, +#line 213 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str604, ei_mac_roman}, + {-1}, {-1}, +#line 312 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str607, ei_iso2022_jp}, +#line 334 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_euc_tw}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 232 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str614, ei_georgian_ps}, +#line 28 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str615, ei_ucs2be}, + {-1}, +#line 309 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str617, ei_sjis}, + {-1}, {-1}, +#line 200 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str620, ei_cp850}, +#line 219 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str621, ei_mac_ukraine}, +#line 55 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_iso8859_1}, +#line 96 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str623, ei_iso8859_6}, +#line 106 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_iso8859_7}, + {-1}, +#line 231 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str626, ei_georgian_academy}, +#line 65 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str627, ei_iso8859_2}, + {-1}, +#line 280 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str629, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 273 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str657, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 358 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str664, ei_local_wchar_t}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 217 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str673, ei_mac_romania}, + {-1}, {-1}, +#line 254 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str676, ei_cp874}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 305 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_euc_jp}, + {-1}, +#line 191 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str691, ei_cp1256}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 48 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str723, ei_ucs2swapped}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 261 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str739, ei_tcvn}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 118 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str746, ei_iso8859_8}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 50 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str765, ei_ucs4swapped}, + {-1}, {-1}, +#line 353 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_johab}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 221 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str786, ei_mac_turkish}, + {-1}, {-1}, {-1}, +#line 105 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str790, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 194 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 343 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str888, ei_big5hkscs2001}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 347 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str896, ei_big5hkscs2008}, + {-1}, +#line 270 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str898, ei_jisx0201}, + {-1}, +#line 342 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str900, ei_big5hkscs1999}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 222 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str908, ei_mac_hebrew}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 344 "lib/aliases.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str935, ei_big5hkscs2004} + }; + +#ifdef __GNUC__ +__inline +#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#endif +const struct alias * +aliases_lookup (register const char *str, register unsigned int len) +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = aliases_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = aliases[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &aliases[key]; + } + } + } + return 0; +} diff --git a/Externals/libiconv-1.14/lib/aliases2.h b/Externals/libiconv-1.14/lib/aliases2.h new file mode 100644 index 0000000000..7f2dc449bf --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases2.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 1999-2003, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifdef USE_AIX +# if defined _AIX +# include "aliases_aix_sysaix.h" +# else +# include "aliases_aix.h" +# endif +#endif +#ifdef USE_OSF1 +# if defined __osf__ +# include "aliases_osf1_sysosf1.h" +# else +# include "aliases_osf1.h" +# endif +#endif +#ifdef USE_DOS +# include "aliases_dos.h" +#endif +#ifdef USE_EXTRA +# include "aliases_extra.h" +#endif diff --git a/Externals/libiconv-1.14/lib/aliases_aix.h b/Externals/libiconv-1.14/lib/aliases_aix.h new file mode 100644 index 0000000000..5cbc77fdf6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_aix.h @@ -0,0 +1,18 @@ + S(aix_0, "CP856", ei_cp856 ) + S(aix_1, "CP922", ei_cp922 ) + S(aix_2, "CP943", ei_cp943 ) + S(aix_3, "CP1046", ei_cp1046 ) + S(aix_4, "CP1124", ei_cp1124 ) + S(aix_5, "CP1129", ei_cp1129 ) + S(aix_6, "CP1161", ei_cp1161 ) + S(aix_7, "IBM1161", ei_cp1161 ) + S(aix_8, "IBM-1161", ei_cp1161 ) + S(aix_9, "CSIBM1161", ei_cp1161 ) + S(aix_10, "CP1162", ei_cp1162 ) + S(aix_11, "IBM1162", ei_cp1162 ) + S(aix_12, "IBM-1162", ei_cp1162 ) + S(aix_13, "CSIBM1162", ei_cp1162 ) + S(aix_14, "CP1163", ei_cp1163 ) + S(aix_15, "IBM1163", ei_cp1163 ) + S(aix_16, "IBM-1163", ei_cp1163 ) + S(aix_17, "CSIBM1163", ei_cp1163 ) diff --git a/Externals/libiconv-1.14/lib/aliases_aix_sysaix.h b/Externals/libiconv-1.14/lib/aliases_aix_sysaix.h new file mode 100644 index 0000000000..b7dc5841eb --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_aix_sysaix.h @@ -0,0 +1,24 @@ + S(aix_0, "CP856", ei_cp856 ) + S(aix_1, "IBM-856", ei_cp856 ) + S(aix_2, "CP922", ei_cp922 ) + S(aix_3, "IBM-922", ei_cp922 ) + S(aix_4, "CP943", ei_cp943 ) + S(aix_5, "IBM-943", ei_cp943 ) + S(aix_6, "CP1046", ei_cp1046 ) + S(aix_7, "IBM-1046", ei_cp1046 ) + S(aix_8, "CP1124", ei_cp1124 ) + S(aix_9, "IBM-1124", ei_cp1124 ) + S(aix_10, "CP1129", ei_cp1129 ) + S(aix_11, "IBM-1129", ei_cp1129 ) + S(aix_12, "CP1161", ei_cp1161 ) + S(aix_13, "IBM1161", ei_cp1161 ) + S(aix_14, "IBM-1161", ei_cp1161 ) + S(aix_15, "CSIBM1161", ei_cp1161 ) + S(aix_16, "CP1162", ei_cp1162 ) + S(aix_17, "IBM1162", ei_cp1162 ) + S(aix_18, "IBM-1162", ei_cp1162 ) + S(aix_19, "CSIBM1162", ei_cp1162 ) + S(aix_20, "CP1163", ei_cp1163 ) + S(aix_21, "IBM1163", ei_cp1163 ) + S(aix_22, "IBM-1163", ei_cp1163 ) + S(aix_23, "CSIBM1163", ei_cp1163 ) diff --git a/Externals/libiconv-1.14/lib/aliases_dos.h b/Externals/libiconv-1.14/lib/aliases_dos.h new file mode 100644 index 0000000000..1dd4fcba01 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_dos.h @@ -0,0 +1,48 @@ + S(dos_0, "CP437", ei_cp437 ) + S(dos_1, "IBM437", ei_cp437 ) + S(dos_2, "437", ei_cp437 ) + S(dos_3, "CSPC8CODEPAGE437", ei_cp437 ) + S(dos_4, "CP737", ei_cp737 ) + S(dos_5, "CP775", ei_cp775 ) + S(dos_6, "IBM775", ei_cp775 ) + S(dos_7, "CSPC775BALTIC", ei_cp775 ) + S(dos_8, "CP852", ei_cp852 ) + S(dos_9, "IBM852", ei_cp852 ) + S(dos_10, "852", ei_cp852 ) + S(dos_11, "CSPCP852", ei_cp852 ) + S(dos_12, "CP853", ei_cp853 ) + S(dos_13, "CP855", ei_cp855 ) + S(dos_14, "IBM855", ei_cp855 ) + S(dos_15, "855", ei_cp855 ) + S(dos_16, "CSIBM855", ei_cp855 ) + S(dos_17, "CP857", ei_cp857 ) + S(dos_18, "IBM857", ei_cp857 ) + S(dos_19, "857", ei_cp857 ) + S(dos_20, "CSIBM857", ei_cp857 ) + S(dos_21, "CP858", ei_cp858 ) + S(dos_22, "CP860", ei_cp860 ) + S(dos_23, "IBM860", ei_cp860 ) + S(dos_24, "860", ei_cp860 ) + S(dos_25, "CSIBM860", ei_cp860 ) + S(dos_26, "CP861", ei_cp861 ) + S(dos_27, "IBM861", ei_cp861 ) + S(dos_28, "861", ei_cp861 ) + S(dos_29, "CP-IS", ei_cp861 ) + S(dos_30, "CSIBM861", ei_cp861 ) + S(dos_31, "CP863", ei_cp863 ) + S(dos_32, "IBM863", ei_cp863 ) + S(dos_33, "863", ei_cp863 ) + S(dos_34, "CSIBM863", ei_cp863 ) + S(dos_35, "CP864", ei_cp864 ) + S(dos_36, "IBM864", ei_cp864 ) + S(dos_37, "CSIBM864", ei_cp864 ) + S(dos_38, "CP865", ei_cp865 ) + S(dos_39, "IBM865", ei_cp865 ) + S(dos_40, "865", ei_cp865 ) + S(dos_41, "CSIBM865", ei_cp865 ) + S(dos_42, "CP869", ei_cp869 ) + S(dos_43, "IBM869", ei_cp869 ) + S(dos_44, "869", ei_cp869 ) + S(dos_45, "CP-GR", ei_cp869 ) + S(dos_46, "CSIBM869", ei_cp869 ) + S(dos_47, "CP1125", ei_cp1125 ) diff --git a/Externals/libiconv-1.14/lib/aliases_extra.h b/Externals/libiconv-1.14/lib/aliases_extra.h new file mode 100644 index 0000000000..9a54e16a07 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_extra.h @@ -0,0 +1,12 @@ + S(extra_0, "EUC-JISX0213", ei_euc_jisx0213 ) + S(extra_1, "EUC-JIS-2004", ei_euc_jisx0213 ) + S(extra_2, "SHIFT_JISX0213", ei_shift_jisx0213 ) + S(extra_3, "SHIFT_JIS-2004", ei_shift_jisx0213 ) + S(extra_4, "ISO-2022-JP-3", ei_iso2022_jp3 ) + S(extra_5, "ISO-2022-JP-2004", ei_iso2022_jp3 ) + S(extra_6, "BIG5-2003", ei_big5_2003 ) + S(extra_7, "TDS565", ei_tds565 ) + S(extra_8, "ISO-IR-230", ei_tds565 ) + S(extra_9, "ATARIST", ei_atarist ) + S(extra_10, "ATARI", ei_atarist ) + S(extra_11, "RISCOS-LATIN1", ei_riscos1 ) diff --git a/Externals/libiconv-1.14/lib/aliases_osf1.h b/Externals/libiconv-1.14/lib/aliases_osf1.h new file mode 100644 index 0000000000..9e4f6854eb --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_osf1.h @@ -0,0 +1,2 @@ + S(osf1_0, "DEC-KANJI", ei_dec_kanji ) + S(osf1_1, "DEC-HANYU", ei_dec_hanyu ) diff --git a/Externals/libiconv-1.14/lib/aliases_osf1_sysosf1.h b/Externals/libiconv-1.14/lib/aliases_osf1_sysosf1.h new file mode 100644 index 0000000000..b1f802d284 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_osf1_sysosf1.h @@ -0,0 +1,4 @@ + S(osf1_0, "DEC-KANJI", ei_dec_kanji ) + S(osf1_1, "DECKANJI", ei_dec_kanji ) + S(osf1_2, "DEC-HANYU", ei_dec_hanyu ) + S(osf1_3, "DECHANYU", ei_dec_hanyu ) diff --git a/Externals/libiconv-1.14/lib/aliases_sysaix.h b/Externals/libiconv-1.14/lib/aliases_sysaix.h new file mode 100644 index 0000000000..a5bfa89881 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_sysaix.h @@ -0,0 +1,1769 @@ +/* ANSI-C code produced by gperf version 3.0.4 */ +/* Command-line: gperf -m 10 lib/aliases_sysaix.gperf */ +/* Computed positions: -k'1,3-11,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "lib/aliases_sysaix.gperf" +struct alias { int name; unsigned int encoding_index; }; + +#define TOTAL_KEYWORDS 356 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 45 +#define MIN_HASH_VALUE 13 +#define MAX_HASH_VALUE 989 +/* maximum key range = 977, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +aliases_hash (register const char *str, register unsigned int len) +{ + static const unsigned short asso_values[] = + { + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 13, 112, 990, 73, 4, + 7, 6, 55, 8, 5, 171, 10, 23, 255, 990, + 990, 990, 990, 990, 990, 147, 128, 4, 9, 125, + 130, 5, 75, 4, 402, 69, 7, 125, 18, 4, + 44, 990, 76, 4, 25, 195, 191, 161, 120, 22, + 15, 990, 990, 990, 990, 27, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +struct stringpool_t + { + char stringpool_str13[sizeof("L1")]; + char stringpool_str14[sizeof("L6")]; + char stringpool_str15[sizeof("L3")]; + char stringpool_str16[sizeof("L2")]; + char stringpool_str17[sizeof("L5")]; + char stringpool_str19[sizeof("L8")]; + char stringpool_str20[sizeof("SJIS")]; + char stringpool_str23[sizeof("866")]; + char stringpool_str24[sizeof("CN")]; + char stringpool_str27[sizeof("862")]; + char stringpool_str32[sizeof("CP1131")]; + char stringpool_str33[sizeof("CP1361")]; + char stringpool_str34[sizeof("CP866")]; + char stringpool_str36[sizeof("CP1133")]; + char stringpool_str37[sizeof("CP1251")]; + char stringpool_str38[sizeof("CP862")]; + char stringpool_str39[sizeof("CP1256")]; + char stringpool_str41[sizeof("CP1253")]; + char stringpool_str42[sizeof("GB2312")]; + char stringpool_str43[sizeof("CP1252")]; + char stringpool_str45[sizeof("CP1255")]; + char stringpool_str48[sizeof("CP936")]; + char stringpool_str49[sizeof("CP1258")]; + char stringpool_str52[sizeof("CP932")]; + char stringpool_str53[sizeof("C99")]; + char stringpool_str64[sizeof("L4")]; + char stringpool_str68[sizeof("LATIN1")]; + char stringpool_str69[sizeof("CP819")]; + char stringpool_str70[sizeof("LATIN6")]; + char stringpool_str72[sizeof("LATIN3")]; + char stringpool_str74[sizeof("LATIN2")]; + char stringpool_str76[sizeof("LATIN5")]; + char stringpool_str80[sizeof("LATIN8")]; + char stringpool_str88[sizeof("R8")]; + char stringpool_str89[sizeof("ISO8859-1")]; + char stringpool_str91[sizeof("ISO8859-6")]; + char stringpool_str92[sizeof("HZ")]; + char stringpool_str93[sizeof("ISO8859-3")]; + char stringpool_str94[sizeof("ISO8859-11")]; + char stringpool_str95[sizeof("ISO8859-2")]; + char stringpool_str96[sizeof("ISO8859-16")]; + char stringpool_str97[sizeof("ISO8859-5")]; + char stringpool_str98[sizeof("ISO8859-13")]; + char stringpool_str101[sizeof("ISO8859-8")]; + char stringpool_str102[sizeof("ISO8859-15")]; + char stringpool_str103[sizeof("ISO-8859-1")]; + char stringpool_str105[sizeof("ISO-8859-6")]; + char stringpool_str107[sizeof("ISO-8859-3")]; + char stringpool_str108[sizeof("ISO-8859-11")]; + char stringpool_str109[sizeof("ISO-8859-2")]; + char stringpool_str110[sizeof("ISO-8859-16")]; + char stringpool_str111[sizeof("ISO-8859-5")]; + char stringpool_str112[sizeof("ISO-8859-13")]; + char stringpool_str115[sizeof("ISO-8859-8")]; + char stringpool_str116[sizeof("ISO-8859-15")]; + char stringpool_str117[sizeof("ISO_8859-1")]; + char stringpool_str118[sizeof("CYRILLIC")]; + char stringpool_str119[sizeof("ISO_8859-6")]; + char stringpool_str120[sizeof("LATIN-9")]; + char stringpool_str121[sizeof("ISO_8859-3")]; + char stringpool_str122[sizeof("ISO_8859-11")]; + char stringpool_str123[sizeof("ISO_8859-2")]; + char stringpool_str124[sizeof("ISO_8859-16")]; + char stringpool_str125[sizeof("ISO_8859-5")]; + char stringpool_str126[sizeof("ISO_8859-13")]; + char stringpool_str127[sizeof("ISO8859-9")]; + char stringpool_str128[sizeof("ISO_8859-16:2001")]; + char stringpool_str129[sizeof("ISO_8859-8")]; + char stringpool_str130[sizeof("ISO_8859-15")]; + char stringpool_str131[sizeof("CP154")]; + char stringpool_str132[sizeof("ISO-IR-6")]; + char stringpool_str133[sizeof("CP949")]; + char stringpool_str135[sizeof("ISO646-CN")]; + char stringpool_str136[sizeof("MAC")]; + char stringpool_str137[sizeof("ISO_8859-15:1998")]; + char stringpool_str139[sizeof("CP1254")]; + char stringpool_str141[sizeof("ISO-8859-9")]; + char stringpool_str143[sizeof("ISO-IR-166")]; + char stringpool_str145[sizeof("ISO-IR-126")]; + char stringpool_str146[sizeof("GBK")]; + char stringpool_str148[sizeof("ISO-IR-226")]; + char stringpool_str149[sizeof("ISO-IR-165")]; + char stringpool_str150[sizeof("X0212")]; + char stringpool_str151[sizeof("ISO-IR-58")]; + char stringpool_str152[sizeof("KOI8-T")]; + char stringpool_str153[sizeof("BIG5")]; + char stringpool_str154[sizeof("ISO-IR-138")]; + char stringpool_str155[sizeof("ISO_8859-9")]; + char stringpool_str156[sizeof("L10")]; + char stringpool_str159[sizeof("850")]; + char stringpool_str160[sizeof("IBM866")]; + char stringpool_str161[sizeof("CSISO2022CN")]; + char stringpool_str163[sizeof("CSBIG5")]; + char stringpool_str164[sizeof("IBM862")]; + char stringpool_str167[sizeof("BIG-5")]; + char stringpool_str168[sizeof("ASCII")]; + char stringpool_str169[sizeof("MS936")]; + char stringpool_str170[sizeof("LATIN4")]; + char stringpool_str171[sizeof("PT154")]; + char stringpool_str172[sizeof("IBM-1131")]; + char stringpool_str173[sizeof("CP850")]; + char stringpool_str174[sizeof("EUCCN")]; + char stringpool_str175[sizeof("CP1250")]; + char stringpool_str176[sizeof("CSGB2312")]; + char stringpool_str177[sizeof("CN-BIG5")]; + char stringpool_str178[sizeof("CSASCII")]; + char stringpool_str179[sizeof("ISO-2022-CN")]; + char stringpool_str180[sizeof("L7")]; + char stringpool_str182[sizeof("ISO-IR-159")]; + char stringpool_str183[sizeof("IBM-1252")]; + char stringpool_str184[sizeof("ISO_8859-14:1998")]; + char stringpool_str186[sizeof("CP950")]; + char stringpool_str187[sizeof("IBM-921")]; + char stringpool_str188[sizeof("EUC-CN")]; + char stringpool_str190[sizeof("ISO-2022-CN-EXT")]; + char stringpool_str191[sizeof("ISO8859-4")]; + char stringpool_str192[sizeof("IBM-932")]; + char stringpool_str193[sizeof("TIS620")]; + char stringpool_str195[sizeof("IBM819")]; + char stringpool_str196[sizeof("ISO8859-14")]; + char stringpool_str197[sizeof("ISO-IR-199")]; + char stringpool_str199[sizeof("ISO_8859-10:1992")]; + char stringpool_str201[sizeof("US")]; + char stringpool_str202[sizeof("KSC_5601")]; + char stringpool_str203[sizeof("ISO-IR-148")]; + char stringpool_str204[sizeof("ISO-CELTIC")]; + char stringpool_str205[sizeof("ISO-8859-4")]; + char stringpool_str206[sizeof("UHC")]; + char stringpool_str207[sizeof("TIS-620")]; + char stringpool_str209[sizeof("ISO-IR-101")]; + char stringpool_str210[sizeof("ISO-8859-14")]; + char stringpool_str211[sizeof("LATIN10")]; + char stringpool_str213[sizeof("X0201")]; + char stringpool_str216[sizeof("ISO-IR-203")]; + char stringpool_str217[sizeof("VISCII")]; + char stringpool_str219[sizeof("ISO_8859-4")]; + char stringpool_str221[sizeof("PTCP154")]; + char stringpool_str224[sizeof("ISO_8859-14")]; + char stringpool_str225[sizeof("X0208")]; + char stringpool_str226[sizeof("IBM-CP1133")]; + char stringpool_str227[sizeof("CSVISCII")]; + char stringpool_str229[sizeof("ISO-IR-149")]; + char stringpool_str231[sizeof("UCS-2")]; + char stringpool_str232[sizeof("ISO8859-10")]; + char stringpool_str234[sizeof("RK1048")]; + char stringpool_str235[sizeof("GB_2312-80")]; + char stringpool_str236[sizeof("CSISOLATIN1")]; + char stringpool_str237[sizeof("ISO-IR-14")]; + char stringpool_str238[sizeof("CSISOLATIN6")]; + char stringpool_str239[sizeof("ELOT_928")]; + char stringpool_str240[sizeof("CSISOLATIN3")]; + char stringpool_str241[sizeof("KZ-1048")]; + char stringpool_str242[sizeof("CSISOLATIN2")]; + char stringpool_str243[sizeof("CSISOLATINCYRILLIC")]; + char stringpool_str244[sizeof("CSISOLATIN5")]; + char stringpool_str246[sizeof("ISO-8859-10")]; + char stringpool_str247[sizeof("ISO-IR-109")]; + char stringpool_str248[sizeof("CSKZ1048")]; + char stringpool_str250[sizeof("CSKOI8R")]; + char stringpool_str251[sizeof("GB18030")]; + char stringpool_str252[sizeof("CSPTCP154")]; + char stringpool_str254[sizeof("KOI8-R")]; + char stringpool_str256[sizeof("TCVN")]; + char stringpool_str258[sizeof("GB_1988-80")]; + char stringpool_str260[sizeof("ISO_8859-10")]; + char stringpool_str261[sizeof("MS-CYRL")]; + char stringpool_str268[sizeof("CSISO58GB231280")]; + char stringpool_str270[sizeof("TIS620.2533-1")]; + char stringpool_str271[sizeof("KS_C_5601-1989")]; + char stringpool_str272[sizeof("MACCYRILLIC")]; + char stringpool_str275[sizeof("HZ-GB-2312")]; + char stringpool_str277[sizeof("CN-GB-ISOIR165")]; + char stringpool_str278[sizeof("ISO-IR-110")]; + char stringpool_str281[sizeof("TIS620-0")]; + char stringpool_str283[sizeof("CN-GB")]; + char stringpool_str288[sizeof("TIS620.2529-1")]; + char stringpool_str293[sizeof("ISO-IR-144")]; + char stringpool_str294[sizeof("CSIBM866")]; + char stringpool_str298[sizeof("ISO646-US")]; + char stringpool_str299[sizeof("IBM850")]; + char stringpool_str300[sizeof("CP874")]; + char stringpool_str302[sizeof("CYRILLIC-ASIAN")]; + char stringpool_str306[sizeof("CSISOLATINGREEK")]; + char stringpool_str307[sizeof("CHAR")]; + char stringpool_str310[sizeof("BIG5HKSCS")]; + char stringpool_str313[sizeof("IBM-850")]; + char stringpool_str322[sizeof("MS-ANSI")]; + char stringpool_str323[sizeof("CSUCS4")]; + char stringpool_str324[sizeof("BIG5-HKSCS")]; + char stringpool_str327[sizeof("UCS-4")]; + char stringpool_str330[sizeof("ARMSCII-8")]; + char stringpool_str335[sizeof("GEORGIAN-PS")]; + char stringpool_str338[sizeof("CSISOLATIN4")]; + char stringpool_str339[sizeof("TIS620.2533-0")]; + char stringpool_str342[sizeof("CSISO2022KR")]; + char stringpool_str343[sizeof("MACINTOSH")]; + char stringpool_str345[sizeof("ISO-IR-179")]; + char stringpool_str347[sizeof("ISO-IR-100")]; + char stringpool_str350[sizeof("GREEK8")]; + char stringpool_str355[sizeof("EUCKR")]; + char stringpool_str358[sizeof("UTF-16")]; + char stringpool_str359[sizeof("VISCII1.1-1")]; + char stringpool_str360[sizeof("ISO-2022-KR")]; + char stringpool_str362[sizeof("CP367")]; + char stringpool_str363[sizeof("UTF-8")]; + char stringpool_str364[sizeof("UTF-32")]; + char stringpool_str369[sizeof("EUC-KR")]; + char stringpool_str371[sizeof("CP1257")]; + char stringpool_str378[sizeof("CSISO57GB1988")]; + char stringpool_str382[sizeof("CSKSC56011987")]; + char stringpool_str383[sizeof("US-ASCII")]; + char stringpool_str384[sizeof("CSISOLATINARABIC")]; + char stringpool_str385[sizeof("ISO_8859-3:1988")]; + char stringpool_str386[sizeof("CSUNICODE11")]; + char stringpool_str387[sizeof("ISO_8859-5:1988")]; + char stringpool_str389[sizeof("ISO_8859-8:1988")]; + char stringpool_str390[sizeof("UNICODE-1-1")]; + char stringpool_str391[sizeof("MACTHAI")]; + char stringpool_str392[sizeof("ROMAN8")]; + char stringpool_str393[sizeof("ISO-10646-UCS-2")]; + char stringpool_str398[sizeof("GREEK")]; + char stringpool_str402[sizeof("LATIN7")]; + char stringpool_str404[sizeof("STRK1048-2002")]; + char stringpool_str405[sizeof("WINDOWS-1251")]; + char stringpool_str406[sizeof("WINDOWS-1256")]; + char stringpool_str407[sizeof("WINDOWS-1253")]; + char stringpool_str408[sizeof("WINDOWS-1252")]; + char stringpool_str409[sizeof("WINDOWS-1255")]; + char stringpool_str411[sizeof("WINDOWS-1258")]; + char stringpool_str412[sizeof("CHINESE")]; + char stringpool_str413[sizeof("NEXTSTEP")]; + char stringpool_str415[sizeof("ISO_8859-9:1989")]; + char stringpool_str419[sizeof("KS_C_5601-1987")]; + char stringpool_str420[sizeof("WINDOWS-936")]; + char stringpool_str423[sizeof("ISO8859-7")]; + char stringpool_str434[sizeof("ISO_8859-4:1988")]; + char stringpool_str436[sizeof("CSPC862LATINHEBREW")]; + char stringpool_str437[sizeof("ISO-8859-7")]; + char stringpool_str440[sizeof("ARABIC")]; + char stringpool_str441[sizeof("ISO-10646-UCS-4")]; + char stringpool_str445[sizeof("MULELAO-1")]; + char stringpool_str446[sizeof("ECMA-118")]; + char stringpool_str448[sizeof("JP")]; + char stringpool_str451[sizeof("ISO_8859-7")]; + char stringpool_str453[sizeof("TCVN-5712")]; + char stringpool_str455[sizeof("TCVN5712-1")]; + char stringpool_str456[sizeof("WINDOWS-1254")]; + char stringpool_str459[sizeof("KOREAN")]; + char stringpool_str461[sizeof("GEORGIAN-ACADEMY")]; + char stringpool_str462[sizeof("MACICELAND")]; + char stringpool_str469[sizeof("CSISOLATINHEBREW")]; + char stringpool_str473[sizeof("ISO-IR-57")]; + char stringpool_str474[sizeof("WINDOWS-1250")]; + char stringpool_str475[sizeof("ISO-IR-87")]; + char stringpool_str477[sizeof("ISO-IR-127")]; + char stringpool_str478[sizeof("ISO-IR-157")]; + char stringpool_str481[sizeof("EUCTW")]; + char stringpool_str483[sizeof("UCS-2LE")]; + char stringpool_str487[sizeof("HP-ROMAN8")]; + char stringpool_str488[sizeof("IBM367")]; + char stringpool_str492[sizeof("KOI8-U")]; + char stringpool_str493[sizeof("UNICODEBIG")]; + char stringpool_str495[sizeof("EUC-TW")]; + char stringpool_str496[sizeof("CSMACINTOSH")]; + char stringpool_str497[sizeof("CSUNICODE")]; + char stringpool_str498[sizeof("JIS_C6226-1983")]; + char stringpool_str501[sizeof("UCS-2-INTERNAL")]; + char stringpool_str503[sizeof("ISO_646.IRV:1991")]; + char stringpool_str510[sizeof("CSISO14JISC6220RO")]; + char stringpool_str511[sizeof("ANSI_X3.4-1986")]; + char stringpool_str515[sizeof("IBM-EUCCN")]; + char stringpool_str516[sizeof("ANSI_X3.4-1968")]; + char stringpool_str518[sizeof("MS-EE")]; + char stringpool_str521[sizeof("CSPC850MULTILINGUAL")]; + char stringpool_str523[sizeof("CSHPROMAN8")]; + char stringpool_str525[sizeof("MACROMAN")]; + char stringpool_str531[sizeof("UCS-4LE")]; + char stringpool_str536[sizeof("ECMA-114")]; + char stringpool_str540[sizeof("UNICODELITTLE")]; + char stringpool_str543[sizeof("WCHAR_T")]; + char stringpool_str544[sizeof("ISO_8859-1:1987")]; + char stringpool_str545[sizeof("ISO_8859-6:1987")]; + char stringpool_str546[sizeof("ISO_8859-7:2003")]; + char stringpool_str547[sizeof("ISO_8859-2:1987")]; + char stringpool_str549[sizeof("UCS-4-INTERNAL")]; + char stringpool_str554[sizeof("CSISO159JISX02121990")]; + char stringpool_str556[sizeof("CSEUCKR")]; + char stringpool_str557[sizeof("CSUNICODE11UTF7")]; + char stringpool_str561[sizeof("ASMO-708")]; + char stringpool_str563[sizeof("UNICODE-1-1-UTF-7")]; + char stringpool_str567[sizeof("JIS_C6220-1969-RO")]; + char stringpool_str569[sizeof("KOI8-RU")]; + char stringpool_str572[sizeof("WINDOWS-1257")]; + char stringpool_str575[sizeof("CSISO2022JP2")]; + char stringpool_str579[sizeof("MS-TURK")]; + char stringpool_str583[sizeof("MACCROATIAN")]; + char stringpool_str584[sizeof("BIG5-HKSCS:2001")]; + char stringpool_str585[sizeof("ISO646-JP")]; + char stringpool_str586[sizeof("JIS0208")]; + char stringpool_str590[sizeof("BIG5-HKSCS:2008")]; + char stringpool_str591[sizeof("ISO-2022-JP-1")]; + char stringpool_str594[sizeof("ISO-2022-JP-2")]; + char stringpool_str599[sizeof("SHIFT-JIS")]; + char stringpool_str603[sizeof("BIG5-HKSCS:1999")]; + char stringpool_str604[sizeof("UCS-2BE")]; + char stringpool_str606[sizeof("MACGREEK")]; + char stringpool_str611[sizeof("CSISO2022JP")]; + char stringpool_str612[sizeof("UTF-16LE")]; + char stringpool_str613[sizeof("SHIFT_JIS")]; + char stringpool_str615[sizeof("MS-GREEK")]; + char stringpool_str616[sizeof("UTF-32LE")]; + char stringpool_str624[sizeof("EUCJP")]; + char stringpool_str625[sizeof("MS-HEBR")]; + char stringpool_str629[sizeof("ISO-2022-JP")]; + char stringpool_str635[sizeof("BIG5-HKSCS:2004")]; + char stringpool_str638[sizeof("EUC-JP")]; + char stringpool_str648[sizeof("MACARABIC")]; + char stringpool_str652[sizeof("UCS-4BE")]; + char stringpool_str654[sizeof("UCS-2-SWAPPED")]; + char stringpool_str660[sizeof("JIS_X0212")]; + char stringpool_str662[sizeof("MACTURKISH")]; + char stringpool_str666[sizeof("CSSHIFTJIS")]; + char stringpool_str672[sizeof("WINDOWS-874")]; + char stringpool_str682[sizeof("CSEUCTW")]; + char stringpool_str685[sizeof("UTF-7")]; + char stringpool_str696[sizeof("IBM-EUCKR")]; + char stringpool_str702[sizeof("UCS-4-SWAPPED")]; + char stringpool_str711[sizeof("ISO_8859-7:1987")]; + char stringpool_str715[sizeof("BIGFIVE")]; + char stringpool_str717[sizeof("TCVN5712-1:1993")]; + char stringpool_str723[sizeof("JIS_X0201")]; + char stringpool_str729[sizeof("BIG-FIVE")]; + char stringpool_str732[sizeof("HEBREW")]; + char stringpool_str733[sizeof("UTF-16BE")]; + char stringpool_str735[sizeof("JIS_X0208")]; + char stringpool_str737[sizeof("UTF-32BE")]; + char stringpool_str741[sizeof("JISX0201-1976")]; + char stringpool_str748[sizeof("JIS_X0212-1990")]; + char stringpool_str752[sizeof("CSISO87JISX0208")]; + char stringpool_str753[sizeof("JIS_X0208-1983")]; + char stringpool_str771[sizeof("MS-ARAB")]; + char stringpool_str797[sizeof("MACCENTRALEUROPE")]; + char stringpool_str803[sizeof("CSHALFWIDTHKATAKANA")]; + char stringpool_str804[sizeof("MS_KANJI")]; + char stringpool_str807[sizeof("MACROMANIA")]; + char stringpool_str820[sizeof("JIS_X0208-1990")]; + char stringpool_str822[sizeof("IBM-EUCTW")]; + char stringpool_str826[sizeof("WINBALTRIM")]; + char stringpool_str846[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; + char stringpool_str849[sizeof("JIS_X0212.1990-0")]; + char stringpool_str874[sizeof("CSEUCPKDFMTJAPANESE")]; + char stringpool_str885[sizeof("JOHAB")]; + char stringpool_str891[sizeof("JAVA")]; + char stringpool_str898[sizeof("MACUKRAINE")]; + char stringpool_str965[sizeof("IBM-EUCJP")]; + char stringpool_str989[sizeof("MACHEBREW")]; + }; +static const struct stringpool_t stringpool_contents = + { + "L1", + "L6", + "L3", + "L2", + "L5", + "L8", + "SJIS", + "866", + "CN", + "862", + "CP1131", + "CP1361", + "CP866", + "CP1133", + "CP1251", + "CP862", + "CP1256", + "CP1253", + "GB2312", + "CP1252", + "CP1255", + "CP936", + "CP1258", + "CP932", + "C99", + "L4", + "LATIN1", + "CP819", + "LATIN6", + "LATIN3", + "LATIN2", + "LATIN5", + "LATIN8", + "R8", + "ISO8859-1", + "ISO8859-6", + "HZ", + "ISO8859-3", + "ISO8859-11", + "ISO8859-2", + "ISO8859-16", + "ISO8859-5", + "ISO8859-13", + "ISO8859-8", + "ISO8859-15", + "ISO-8859-1", + "ISO-8859-6", + "ISO-8859-3", + "ISO-8859-11", + "ISO-8859-2", + "ISO-8859-16", + "ISO-8859-5", + "ISO-8859-13", + "ISO-8859-8", + "ISO-8859-15", + "ISO_8859-1", + "CYRILLIC", + "ISO_8859-6", + "LATIN-9", + "ISO_8859-3", + "ISO_8859-11", + "ISO_8859-2", + "ISO_8859-16", + "ISO_8859-5", + "ISO_8859-13", + "ISO8859-9", + "ISO_8859-16:2001", + "ISO_8859-8", + "ISO_8859-15", + "CP154", + "ISO-IR-6", + "CP949", + "ISO646-CN", + "MAC", + "ISO_8859-15:1998", + "CP1254", + "ISO-8859-9", + "ISO-IR-166", + "ISO-IR-126", + "GBK", + "ISO-IR-226", + "ISO-IR-165", + "X0212", + "ISO-IR-58", + "KOI8-T", + "BIG5", + "ISO-IR-138", + "ISO_8859-9", + "L10", + "850", + "IBM866", + "CSISO2022CN", + "CSBIG5", + "IBM862", + "BIG-5", + "ASCII", + "MS936", + "LATIN4", + "PT154", + "IBM-1131", + "CP850", + "EUCCN", + "CP1250", + "CSGB2312", + "CN-BIG5", + "CSASCII", + "ISO-2022-CN", + "L7", + "ISO-IR-159", + "IBM-1252", + "ISO_8859-14:1998", + "CP950", + "IBM-921", + "EUC-CN", + "ISO-2022-CN-EXT", + "ISO8859-4", + "IBM-932", + "TIS620", + "IBM819", + "ISO8859-14", + "ISO-IR-199", + "ISO_8859-10:1992", + "US", + "KSC_5601", + "ISO-IR-148", + "ISO-CELTIC", + "ISO-8859-4", + "UHC", + "TIS-620", + "ISO-IR-101", + "ISO-8859-14", + "LATIN10", + "X0201", + "ISO-IR-203", + "VISCII", + "ISO_8859-4", + "PTCP154", + "ISO_8859-14", + "X0208", + "IBM-CP1133", + "CSVISCII", + "ISO-IR-149", + "UCS-2", + "ISO8859-10", + "RK1048", + "GB_2312-80", + "CSISOLATIN1", + "ISO-IR-14", + "CSISOLATIN6", + "ELOT_928", + "CSISOLATIN3", + "KZ-1048", + "CSISOLATIN2", + "CSISOLATINCYRILLIC", + "CSISOLATIN5", + "ISO-8859-10", + "ISO-IR-109", + "CSKZ1048", + "CSKOI8R", + "GB18030", + "CSPTCP154", + "KOI8-R", + "TCVN", + "GB_1988-80", + "ISO_8859-10", + "MS-CYRL", + "CSISO58GB231280", + "TIS620.2533-1", + "KS_C_5601-1989", + "MACCYRILLIC", + "HZ-GB-2312", + "CN-GB-ISOIR165", + "ISO-IR-110", + "TIS620-0", + "CN-GB", + "TIS620.2529-1", + "ISO-IR-144", + "CSIBM866", + "ISO646-US", + "IBM850", + "CP874", + "CYRILLIC-ASIAN", + "CSISOLATINGREEK", + "CHAR", + "BIG5HKSCS", + "IBM-850", + "MS-ANSI", + "CSUCS4", + "BIG5-HKSCS", + "UCS-4", + "ARMSCII-8", + "GEORGIAN-PS", + "CSISOLATIN4", + "TIS620.2533-0", + "CSISO2022KR", + "MACINTOSH", + "ISO-IR-179", + "ISO-IR-100", + "GREEK8", + "EUCKR", + "UTF-16", + "VISCII1.1-1", + "ISO-2022-KR", + "CP367", + "UTF-8", + "UTF-32", + "EUC-KR", + "CP1257", + "CSISO57GB1988", + "CSKSC56011987", + "US-ASCII", + "CSISOLATINARABIC", + "ISO_8859-3:1988", + "CSUNICODE11", + "ISO_8859-5:1988", + "ISO_8859-8:1988", + "UNICODE-1-1", + "MACTHAI", + "ROMAN8", + "ISO-10646-UCS-2", + "GREEK", + "LATIN7", + "STRK1048-2002", + "WINDOWS-1251", + "WINDOWS-1256", + "WINDOWS-1253", + "WINDOWS-1252", + "WINDOWS-1255", + "WINDOWS-1258", + "CHINESE", + "NEXTSTEP", + "ISO_8859-9:1989", + "KS_C_5601-1987", + "WINDOWS-936", + "ISO8859-7", + "ISO_8859-4:1988", + "CSPC862LATINHEBREW", + "ISO-8859-7", + "ARABIC", + "ISO-10646-UCS-4", + "MULELAO-1", + "ECMA-118", + "JP", + "ISO_8859-7", + "TCVN-5712", + "TCVN5712-1", + "WINDOWS-1254", + "KOREAN", + "GEORGIAN-ACADEMY", + "MACICELAND", + "CSISOLATINHEBREW", + "ISO-IR-57", + "WINDOWS-1250", + "ISO-IR-87", + "ISO-IR-127", + "ISO-IR-157", + "EUCTW", + "UCS-2LE", + "HP-ROMAN8", + "IBM367", + "KOI8-U", + "UNICODEBIG", + "EUC-TW", + "CSMACINTOSH", + "CSUNICODE", + "JIS_C6226-1983", + "UCS-2-INTERNAL", + "ISO_646.IRV:1991", + "CSISO14JISC6220RO", + "ANSI_X3.4-1986", + "IBM-EUCCN", + "ANSI_X3.4-1968", + "MS-EE", + "CSPC850MULTILINGUAL", + "CSHPROMAN8", + "MACROMAN", + "UCS-4LE", + "ECMA-114", + "UNICODELITTLE", + "WCHAR_T", + "ISO_8859-1:1987", + "ISO_8859-6:1987", + "ISO_8859-7:2003", + "ISO_8859-2:1987", + "UCS-4-INTERNAL", + "CSISO159JISX02121990", + "CSEUCKR", + "CSUNICODE11UTF7", + "ASMO-708", + "UNICODE-1-1-UTF-7", + "JIS_C6220-1969-RO", + "KOI8-RU", + "WINDOWS-1257", + "CSISO2022JP2", + "MS-TURK", + "MACCROATIAN", + "BIG5-HKSCS:2001", + "ISO646-JP", + "JIS0208", + "BIG5-HKSCS:2008", + "ISO-2022-JP-1", + "ISO-2022-JP-2", + "SHIFT-JIS", + "BIG5-HKSCS:1999", + "UCS-2BE", + "MACGREEK", + "CSISO2022JP", + "UTF-16LE", + "SHIFT_JIS", + "MS-GREEK", + "UTF-32LE", + "EUCJP", + "MS-HEBR", + "ISO-2022-JP", + "BIG5-HKSCS:2004", + "EUC-JP", + "MACARABIC", + "UCS-4BE", + "UCS-2-SWAPPED", + "JIS_X0212", + "MACTURKISH", + "CSSHIFTJIS", + "WINDOWS-874", + "CSEUCTW", + "UTF-7", + "IBM-EUCKR", + "UCS-4-SWAPPED", + "ISO_8859-7:1987", + "BIGFIVE", + "TCVN5712-1:1993", + "JIS_X0201", + "BIG-FIVE", + "HEBREW", + "UTF-16BE", + "JIS_X0208", + "UTF-32BE", + "JISX0201-1976", + "JIS_X0212-1990", + "CSISO87JISX0208", + "JIS_X0208-1983", + "MS-ARAB", + "MACCENTRALEUROPE", + "CSHALFWIDTHKATAKANA", + "MS_KANJI", + "MACROMANIA", + "JIS_X0208-1990", + "IBM-EUCTW", + "WINBALTRIM", + "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", + "JIS_X0212.1990-0", + "CSEUCPKDFMTJAPANESE", + "JOHAB", + "JAVA", + "MACUKRAINE", + "IBM-EUCJP", + "MACHEBREW" + }; +#define stringpool ((const char *) &stringpool_contents) + +static const struct alias aliases[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 60 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso8859_1}, +#line 134 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_10}, +#line 76 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_3}, +#line 68 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_iso8859_2}, +#line 126 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_iso8859_9}, + {-1}, +#line 152 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_iso8859_14}, +#line 313 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str20, ei_sjis}, + {-1}, {-1}, +#line 210 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str23, ei_cp866}, +#line 292 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_iso646_cn}, + {-1}, {-1}, +#line 206 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, + {-1}, {-1}, {-1}, {-1}, +#line 212 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp1131}, +#line 363 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_johab}, +#line 208 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, + {-1}, +#line 248 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_cp1133}, +#line 175 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str37, ei_cp1251}, +#line 204 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_cp862}, +#line 191 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_cp1256}, + {-1}, +#line 182 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_cp1253}, +#line 325 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_euc_cn}, +#line 178 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1252}, + {-1}, +#line 188 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_cp1255}, + {-1}, {-1}, +#line 330 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp936}, +#line 197 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_cp1258}, + {-1}, {-1}, +#line 316 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp932}, +#line 51 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_c99}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 84 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_4}, + {-1}, {-1}, {-1}, +#line 59 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_1}, +#line 57 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_1}, +#line 133 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_10}, + {-1}, +#line 75 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_3}, + {-1}, +#line 67 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_2}, + {-1}, +#line 125 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_9}, + {-1}, {-1}, {-1}, +#line 151 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str80, ei_iso8859_14}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 231 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_hp_roman8}, +#line 62 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str89, ei_iso8859_1}, + {-1}, +#line 102 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_6}, +#line 337 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_hz}, +#line 78 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_3}, +#line 139 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_11}, +#line 70 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_2}, +#line 167 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_16}, +#line 93 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_5}, +#line 145 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_13}, + {-1}, {-1}, +#line 120 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_8}, +#line 160 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_15}, +#line 53 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, + {-1}, +#line 94 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_6}, + {-1}, +#line 71 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, +#line 137 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_11}, +#line 63 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_2}, +#line 161 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_16}, +#line 87 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_5}, +#line 140 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_iso8859_13}, + {-1}, {-1}, +#line 114 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_iso8859_8}, +#line 155 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_15}, +#line 54 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_iso8859_1}, +#line 91 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_iso8859_5}, +#line 95 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_6}, +#line 159 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_15}, +#line 72 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_3}, +#line 138 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_11}, +#line 64 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_2}, +#line 162 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_16}, +#line 88 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_5}, +#line 141 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_13}, +#line 128 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_iso8859_9}, +#line 163 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso8859_16}, +#line 115 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_8}, +#line 156 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_15}, +#line 240 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_pt154}, +#line 16 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str132, ei_ascii}, +#line 360 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_cp949}, + {-1}, +#line 290 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso646_cn}, +#line 216 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_mac_roman}, +#line 157 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_15}, + {-1}, +#line 185 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp1254}, + {-1}, +#line 121 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_iso8859_9}, + {-1}, +#line 256 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_tis620}, + {-1}, +#line 107 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_7}, +#line 329 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_ces_gbk}, + {-1}, +#line 164 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_16}, +#line 298 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_isoir165}, +#line 286 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_jisx0212}, +#line 295 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_gb2312}, +#line 237 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_koi8_t}, +#line 343 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_ces_big5}, +#line 117 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_8}, +#line 122 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str155, ei_iso8859_9}, +#line 166 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_16}, + {-1}, {-1}, +#line 201 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_cp850}, +#line 209 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_cp866}, +#line 335 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso2022_cn}, + {-1}, +#line 348 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_ces_big5}, +#line 205 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_cp862}, + {-1}, {-1}, +#line 344 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_ces_big5}, +#line 13 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_ascii}, +#line 331 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_cp936}, +#line 83 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_iso8859_4}, +#line 238 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_pt154}, +#line 213 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_cp1131}, +#line 199 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str173, ei_cp850}, +#line 324 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str174, ei_euc_cn}, +#line 172 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_cp1250}, +#line 327 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_euc_cn}, +#line 347 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_ces_big5}, +#line 22 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_ascii}, +#line 334 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso2022_cn}, +#line 144 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_iso8859_13}, + {-1}, +#line 287 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_jisx0212}, +#line 181 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_cp1252}, +#line 149 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_14}, + {-1}, +#line 349 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_cp950}, +#line 146 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_iso8859_13}, +#line 323 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_euc_cn}, + {-1}, +#line 336 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_iso2022_cn_ext}, +#line 86 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_4}, +#line 317 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_cp932}, +#line 251 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_tis620}, + {-1}, +#line 58 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_iso8859_1}, +#line 154 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_14}, +#line 150 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_14}, + {-1}, +#line 131 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_10}, + {-1}, +#line 21 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_ascii}, +#line 300 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_ksc5601}, +#line 124 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_9}, +#line 153 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_14}, +#line 79 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, +#line 361 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_cp949}, +#line 250 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_tis620}, + {-1}, +#line 66 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_2}, +#line 147 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_14}, +#line 165 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_16}, + {-1}, +#line 273 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_jisx0201}, + {-1}, {-1}, +#line 158 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_iso8859_15}, +#line 259 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_viscii}, + {-1}, +#line 80 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_iso8859_4}, + {-1}, +#line 239 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_pt154}, + {-1}, {-1}, +#line 148 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_14}, +#line 279 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_jisx0208}, +#line 249 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str226, ei_cp1133}, +#line 261 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_viscii}, + {-1}, +#line 303 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_ksc5601}, + {-1}, +#line 24 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_ucs2}, +#line 136 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_10}, + {-1}, +#line 243 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_rk1048}, +#line 294 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_gb2312}, +#line 61 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_iso8859_1}, +#line 268 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso646_jp}, +#line 135 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_iso8859_10}, +#line 109 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_7}, +#line 77 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str240, ei_iso8859_3}, +#line 245 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_rk1048}, +#line 69 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_iso8859_2}, +#line 92 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_iso8859_5}, +#line 127 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str244, ei_iso8859_9}, + {-1}, +#line 129 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_iso8859_10}, +#line 74 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_iso8859_3}, +#line 246 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_rk1048}, + {-1}, +#line 169 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_koi8_r}, +#line 333 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_gb18030}, +#line 242 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_pt154}, + {-1}, +#line 168 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_koi8_r}, + {-1}, +#line 262 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str256, ei_tcvn}, + {-1}, +#line 289 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_iso646_cn}, + {-1}, +#line 130 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso8859_10}, +#line 177 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_cp1251}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 296 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str268, ei_gb2312}, + {-1}, +#line 255 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_tis620}, +#line 302 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_ksc5601}, +#line 222 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_mac_cyrillic}, + {-1}, {-1}, +#line 338 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str275, ei_hz}, + {-1}, +#line 299 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_isoir165}, +#line 82 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_iso8859_4}, + {-1}, {-1}, +#line 252 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_tis620}, + {-1}, +#line 326 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_euc_cn}, + {-1}, {-1}, {-1}, {-1}, +#line 253 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_tis620}, + {-1}, {-1}, {-1}, {-1}, +#line 90 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_iso8859_5}, +#line 211 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_cp866}, + {-1}, {-1}, {-1}, +#line 14 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str298, ei_ascii}, +#line 200 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_cp850}, +#line 257 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str300, ei_cp874}, + {-1}, +#line 241 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str302, ei_pt154}, + {-1}, {-1}, {-1}, +#line 112 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str306, ei_iso8859_7}, +#line 366 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_local_char}, + {-1}, {-1}, +#line 354 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_big5hkscs2008}, + {-1}, {-1}, +#line 203 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str313, ei_cp850}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 180 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str322, ei_cp1252}, +#line 35 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str323, ei_ucs4}, +#line 353 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_big5hkscs2008}, + {-1}, {-1}, +#line 33 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_ucs4}, + {-1}, {-1}, +#line 234 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_armscii_8}, + {-1}, {-1}, {-1}, {-1}, +#line 236 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_georgian_ps}, + {-1}, {-1}, +#line 85 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str338, ei_iso8859_4}, +#line 254 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str339, ei_tis620}, + {-1}, {-1}, +#line 365 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso2022_kr}, +#line 215 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_mac_roman}, + {-1}, +#line 142 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str345, ei_iso8859_13}, + {-1}, +#line 56 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_iso8859_1}, + {-1}, {-1}, +#line 110 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, +#line 357 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_euc_kr}, + {-1}, {-1}, +#line 38 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str358, ei_utf16}, +#line 260 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_viscii}, +#line 364 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_iso2022_kr}, + {-1}, +#line 19 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_ascii}, +#line 23 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_utf8}, +#line 41 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_utf32}, + {-1}, {-1}, {-1}, {-1}, +#line 356 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_euc_kr}, + {-1}, +#line 194 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str371, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 293 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_iso646_cn}, + {-1}, {-1}, {-1}, +#line 304 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str382, ei_ksc5601}, +#line 12 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str383, ei_ascii}, +#line 101 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso8859_6}, +#line 73 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_iso8859_3}, +#line 30 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_ucs2be}, +#line 89 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_iso8859_5}, + {-1}, +#line 116 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_iso8859_8}, +#line 29 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str390, ei_ucs2be}, +#line 228 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_mac_thai}, +#line 230 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_hp_roman8}, +#line 25 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_ucs2}, + {-1}, {-1}, {-1}, {-1}, +#line 111 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_iso8859_7}, + {-1}, {-1}, {-1}, +#line 143 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_iso8859_13}, + {-1}, +#line 244 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_rk1048}, +#line 176 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_cp1251}, +#line 192 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_cp1256}, +#line 183 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str407, ei_cp1253}, +#line 179 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_cp1252}, +#line 189 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_cp1255}, + {-1}, +#line 198 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_cp1258}, +#line 297 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_gb2312}, +#line 233 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_nextstep}, + {-1}, +#line 123 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_iso8859_9}, + {-1}, {-1}, {-1}, +#line 301 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_ksc5601}, +#line 332 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_cp936}, + {-1}, {-1}, +#line 113 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str423, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 81 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str434, ei_iso8859_4}, + {-1}, +#line 207 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str436, ei_cp862}, +#line 103 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_iso8859_7}, + {-1}, {-1}, +#line 100 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_iso8859_6}, +#line 34 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_ucs4}, + {-1}, {-1}, {-1}, +#line 247 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_mulelao}, +#line 108 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str446, ei_iso8859_7}, + {-1}, +#line 269 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso646_jp}, + {-1}, {-1}, +#line 104 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_iso8859_7}, + {-1}, +#line 263 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str453, ei_tcvn}, + {-1}, +#line 264 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_tcvn}, +#line 186 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str456, ei_cp1254}, + {-1}, {-1}, +#line 305 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str459, ei_ksc5601}, + {-1}, +#line 235 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_georgian_academy}, +#line 219 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str462, ei_mac_iceland}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 119 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str469, ei_iso8859_8}, + {-1}, {-1}, {-1}, +#line 291 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_iso646_cn}, +#line 173 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_cp1250}, +#line 280 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_jisx0208}, + {-1}, +#line 97 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str477, ei_iso8859_6}, +#line 132 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_iso8859_10}, + {-1}, {-1}, +#line 340 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_euc_tw}, + {-1}, +#line 31 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_ucs2le}, + {-1}, {-1}, {-1}, +#line 229 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_hp_roman8}, +#line 20 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str488, ei_ascii}, + {-1}, {-1}, {-1}, +#line 170 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_koi8_u}, +#line 28 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_ucs2be}, + {-1}, +#line 339 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str495, ei_euc_tw}, +#line 217 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str496, ei_mac_roman}, +#line 26 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_ucs2}, +#line 281 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str498, ei_jisx0208}, + {-1}, {-1}, +#line 47 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_ucs2internal}, + {-1}, +#line 15 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_ascii}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 270 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_iso646_jp}, +#line 18 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_ascii}, + {-1}, {-1}, {-1}, +#line 328 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_euc_cn}, +#line 17 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str516, ei_ascii}, + {-1}, +#line 174 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_cp1250}, + {-1}, {-1}, +#line 202 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_cp850}, + {-1}, +#line 232 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_hp_roman8}, + {-1}, +#line 214 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_mac_roman}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 37 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ucs4le}, + {-1}, {-1}, {-1}, {-1}, +#line 98 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str536, ei_iso8859_6}, + {-1}, {-1}, {-1}, +#line 32 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str540, ei_ucs2le}, + {-1}, {-1}, +#line 367 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_local_wchar_t}, +#line 55 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_iso8859_1}, +#line 96 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str545, ei_iso8859_6}, +#line 106 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_iso8859_7}, +#line 65 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str547, ei_iso8859_2}, + {-1}, +#line 49 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_ucs4internal}, + {-1}, {-1}, {-1}, {-1}, +#line 288 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_jisx0212}, + {-1}, +#line 358 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_euc_kr}, +#line 46 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str557, ei_utf7}, + {-1}, {-1}, {-1}, +#line 99 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str561, ei_iso8859_6}, + {-1}, +#line 45 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_utf7}, + {-1}, {-1}, {-1}, +#line 266 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str567, ei_iso646_jp}, + {-1}, +#line 171 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_koi8_ru}, + {-1}, {-1}, +#line 195 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_cp1257}, + {-1}, {-1}, +#line 322 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str575, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, +#line 187 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_cp1254}, + {-1}, {-1}, {-1}, +#line 220 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_mac_croatian}, +#line 351 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_big5hkscs2001}, +#line 267 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str585, ei_iso646_jp}, +#line 278 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_jisx0208}, + {-1}, {-1}, {-1}, +#line 355 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str590, ei_big5hkscs2008}, +#line 320 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str591, ei_iso2022_jp1}, + {-1}, {-1}, +#line 321 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str594, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, {-1}, +#line 312 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str599, ei_sjis}, + {-1}, {-1}, {-1}, +#line 350 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str603, ei_big5hkscs1999}, +#line 27 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str604, ei_ucs2be}, + {-1}, +#line 224 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str606, ei_mac_greek}, + {-1}, {-1}, {-1}, {-1}, +#line 319 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str611, ei_iso2022_jp}, +#line 40 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str612, ei_utf16le}, +#line 311 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str613, ei_sjis}, + {-1}, +#line 184 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str615, ei_cp1253}, +#line 43 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str616, ei_utf32le}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 307 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_euc_jp}, +#line 190 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str625, ei_cp1255}, + {-1}, {-1}, {-1}, +#line 318 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str629, ei_iso2022_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 352 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str635, ei_big5hkscs2004}, + {-1}, {-1}, +#line 306 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str638, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 227 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str648, ei_mac_arabic}, + {-1}, {-1}, {-1}, +#line 36 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_ucs4be}, + {-1}, +#line 48 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str654, ei_ucs2swapped}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 283 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str660, ei_jisx0212}, + {-1}, +#line 225 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str662, ei_mac_turkish}, + {-1}, {-1}, {-1}, +#line 315 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str666, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 258 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str672, ei_cp874}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 341 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str682, ei_euc_tw}, + {-1}, {-1}, +#line 44 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_utf7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 359 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str696, ei_euc_kr}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 50 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_ucs4swapped}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 105 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str711, ei_iso8859_7}, + {-1}, {-1}, {-1}, +#line 346 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str715, ei_ces_big5}, + {-1}, +#line 265 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str717, ei_tcvn}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 271 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str723, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 345 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str729, ei_ces_big5}, + {-1}, {-1}, +#line 118 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str732, ei_iso8859_8}, +#line 39 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str733, ei_utf16be}, + {-1}, +#line 275 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str735, ei_jisx0208}, + {-1}, +#line 42 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str737, ei_utf32be}, + {-1}, {-1}, {-1}, +#line 272 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str741, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 285 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str748, ei_jisx0212}, + {-1}, {-1}, {-1}, +#line 282 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str752, ei_jisx0208}, +#line 276 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str753, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 193 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_cp1256}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 218 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str797, ei_mac_centraleurope}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 274 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str803, ei_jisx0201}, +#line 314 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str804, ei_sjis}, + {-1}, {-1}, +#line 221 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str807, ei_mac_romania}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 277 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str820, ei_jisx0208}, + {-1}, +#line 342 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str822, ei_euc_tw}, + {-1}, {-1}, {-1}, +#line 196 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str826, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 308 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str846, ei_euc_jp}, + {-1}, {-1}, +#line 284 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str849, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 309 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str874, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 362 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str885, ei_johab}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 52 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str891, ei_java}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 223 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str898, ei_mac_ukraine}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 310 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str965, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 226 "lib/aliases_sysaix.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str989, ei_mac_hebrew} + }; + +#ifdef __GNUC__ +__inline +#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#endif +const struct alias * +aliases_lookup (register const char *str, register unsigned int len) +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = aliases_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = aliases[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &aliases[key]; + } + } + } + return 0; +} diff --git a/Externals/libiconv-1.14/lib/aliases_syshpux.h b/Externals/libiconv-1.14/lib/aliases_syshpux.h new file mode 100644 index 0000000000..57545efa25 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_syshpux.h @@ -0,0 +1,1773 @@ +/* ANSI-C code produced by gperf version 3.0.4 */ +/* Command-line: gperf -m 10 lib/aliases_syshpux.gperf */ +/* Computed positions: -k'1,3-11,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "lib/aliases_syshpux.gperf" +struct alias { int name; unsigned int encoding_index; }; + +#define TOTAL_KEYWORDS 357 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 45 +#define MIN_HASH_VALUE 9 +#define MAX_HASH_VALUE 1038 +/* maximum key range = 1030, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +aliases_hash (register const char *str, register unsigned int len) +{ + static const unsigned short asso_values[] = + { + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 0, 112, 1039, 57, 2, + 0, 20, 51, 8, 5, 49, 13, 16, 335, 1039, + 1039, 1039, 1039, 1039, 1039, 13, 149, 1, 6, 10, + 55, 139, 10, 0, 328, 86, 210, 147, 6, 0, + 73, 1039, 120, 6, 17, 282, 238, 172, 274, 2, + 0, 1039, 1039, 1039, 1039, 34, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, + 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +struct stringpool_t + { + char stringpool_str9[sizeof("CN")]; + char stringpool_str12[sizeof("HZ")]; + char stringpool_str16[sizeof("862")]; + char stringpool_str17[sizeof("CP1252")]; + char stringpool_str19[sizeof("ASCII")]; + char stringpool_str21[sizeof("CP1251")]; + char stringpool_str22[sizeof("SJIS")]; + char stringpool_str24[sizeof("CP862")]; + char stringpool_str26[sizeof("866")]; + char stringpool_str27[sizeof("CP1256")]; + char stringpool_str28[sizeof("CSASCII")]; + char stringpool_str29[sizeof("EUCCN")]; + char stringpool_str30[sizeof("EUC-CN")]; + char stringpool_str33[sizeof("CP1255")]; + char stringpool_str34[sizeof("CP866")]; + char stringpool_str35[sizeof("CP1131")]; + char stringpool_str36[sizeof("C99")]; + char stringpool_str38[sizeof("CP1361")]; + char stringpool_str39[sizeof("HP15CN")]; + char stringpool_str42[sizeof("CP932")]; + char stringpool_str43[sizeof("CP1258")]; + char stringpool_str50[sizeof("CHINESE")]; + char stringpool_str52[sizeof("CP936")]; + char stringpool_str53[sizeof("CP819")]; + char stringpool_str57[sizeof("CP1253")]; + char stringpool_str58[sizeof("ISO88592")]; + char stringpool_str59[sizeof("ISO8859-2")]; + char stringpool_str60[sizeof("ISO-8859-2")]; + char stringpool_str62[sizeof("ISO88591")]; + char stringpool_str63[sizeof("ISO8859-1")]; + char stringpool_str64[sizeof("ISO-8859-1")]; + char stringpool_str66[sizeof("ISO8859-11")]; + char stringpool_str67[sizeof("ISO-8859-11")]; + char stringpool_str68[sizeof("ISO88596")]; + char stringpool_str69[sizeof("ISO8859-6")]; + char stringpool_str70[sizeof("ISO-8859-6")]; + char stringpool_str71[sizeof("CP1133")]; + char stringpool_str72[sizeof("ISO8859-16")]; + char stringpool_str73[sizeof("ISO-8859-16")]; + char stringpool_str74[sizeof("ISO88595")]; + char stringpool_str75[sizeof("ISO8859-5")]; + char stringpool_str76[sizeof("ISO-8859-5")]; + char stringpool_str77[sizeof("ISO885915")]; + char stringpool_str78[sizeof("ISO8859-15")]; + char stringpool_str79[sizeof("ISO-8859-15")]; + char stringpool_str81[sizeof("ISO-2022-CN")]; + char stringpool_str83[sizeof("ISO646-CN")]; + char stringpool_str84[sizeof("ISO88598")]; + char stringpool_str85[sizeof("ISO8859-8")]; + char stringpool_str86[sizeof("ISO-8859-8")]; + char stringpool_str88[sizeof("CSISO2022CN")]; + char stringpool_str90[sizeof("ISO88599")]; + char stringpool_str91[sizeof("ISO8859-9")]; + char stringpool_str92[sizeof("ISO-8859-9")]; + char stringpool_str94[sizeof("ISO_8859-2")]; + char stringpool_str96[sizeof("ISO-2022-CN-EXT")]; + char stringpool_str98[sizeof("ISO_8859-1")]; + char stringpool_str99[sizeof("ISO8859-3")]; + char stringpool_str100[sizeof("ISO-8859-3")]; + char stringpool_str101[sizeof("ISO_8859-11")]; + char stringpool_str102[sizeof("ISO8859-13")]; + char stringpool_str103[sizeof("ISO-8859-13")]; + char stringpool_str104[sizeof("ISO_8859-6")]; + char stringpool_str105[sizeof("CP949")]; + char stringpool_str107[sizeof("ISO_8859-16")]; + char stringpool_str109[sizeof("ISO_8859-16:2001")]; + char stringpool_str110[sizeof("ISO_8859-5")]; + char stringpool_str111[sizeof("ELOT_928")]; + char stringpool_str113[sizeof("ISO_8859-15")]; + char stringpool_str115[sizeof("CP1257")]; + char stringpool_str118[sizeof("CP154")]; + char stringpool_str119[sizeof("CP1254")]; + char stringpool_str120[sizeof("ISO_8859-8")]; + char stringpool_str123[sizeof("ISO_8859-15:1998")]; + char stringpool_str126[sizeof("ISO_8859-9")]; + char stringpool_str129[sizeof("CP367")]; + char stringpool_str130[sizeof("850")]; + char stringpool_str131[sizeof("CP1250")]; + char stringpool_str134[sizeof("ISO_8859-3")]; + char stringpool_str135[sizeof("R8")]; + char stringpool_str137[sizeof("ISO_8859-13")]; + char stringpool_str138[sizeof("ISO-IR-6")]; + char stringpool_str139[sizeof("KOI8-T")]; + char stringpool_str140[sizeof("ISO-IR-226")]; + char stringpool_str141[sizeof("CP850")]; + char stringpool_str142[sizeof("ISO-IR-126")]; + char stringpool_str144[sizeof("CP950")]; + char stringpool_str147[sizeof("ISO-IR-166")]; + char stringpool_str148[sizeof("TIS620")]; + char stringpool_str149[sizeof("TIS-620")]; + char stringpool_str152[sizeof("MAC")]; + char stringpool_str153[sizeof("ISO-IR-165")]; + char stringpool_str156[sizeof("ISO88597")]; + char stringpool_str157[sizeof("ISO8859-7")]; + char stringpool_str158[sizeof("ISO-8859-7")]; + char stringpool_str159[sizeof("ISO_8859-10:1992")]; + char stringpool_str161[sizeof("ISO8859-4")]; + char stringpool_str162[sizeof("ISO-8859-4")]; + char stringpool_str163[sizeof("ISO-IR-58")]; + char stringpool_str164[sizeof("ISO8859-14")]; + char stringpool_str165[sizeof("ISO-8859-14")]; + char stringpool_str166[sizeof("ISO_8859-14:1998")]; + char stringpool_str167[sizeof("GB2312")]; + char stringpool_str170[sizeof("CP874")]; + char stringpool_str171[sizeof("IBM862")]; + char stringpool_str172[sizeof("ISO-IR-159")]; + char stringpool_str176[sizeof("ISO8859-10")]; + char stringpool_str177[sizeof("ISO-8859-10")]; + char stringpool_str178[sizeof("ISO-IR-138")]; + char stringpool_str179[sizeof("MS-ANSI")]; + char stringpool_str180[sizeof("ISO-IR-199")]; + char stringpool_str181[sizeof("IBM866")]; + char stringpool_str182[sizeof("MS-EE")]; + char stringpool_str183[sizeof("ARABIC")]; + char stringpool_str190[sizeof("PT154")]; + char stringpool_str192[sizeof("ISO_8859-7")]; + char stringpool_str193[sizeof("ISO-IR-101")]; + char stringpool_str195[sizeof("MACTHAI")]; + char stringpool_str196[sizeof("ISO_8859-4")]; + char stringpool_str198[sizeof("MS936")]; + char stringpool_str199[sizeof("ISO_8859-14")]; + char stringpool_str200[sizeof("IBM819")]; + char stringpool_str202[sizeof("ARMSCII-8")]; + char stringpool_str203[sizeof("KSC_5601")]; + char stringpool_str206[sizeof("MACINTOSH")]; + char stringpool_str207[sizeof("TIS620-0")]; + char stringpool_str208[sizeof("ECMA-118")]; + char stringpool_str209[sizeof("ISO-IR-148")]; + char stringpool_str211[sizeof("ISO_8859-10")]; + char stringpool_str212[sizeof("L2")]; + char stringpool_str213[sizeof("ISO-IR-179")]; + char stringpool_str214[sizeof("L1")]; + char stringpool_str215[sizeof("ISO-IR-149")]; + char stringpool_str217[sizeof("L6")]; + char stringpool_str220[sizeof("L5")]; + char stringpool_str221[sizeof("ISO-IR-109")]; + char stringpool_str222[sizeof("CSMACINTOSH")]; + char stringpool_str225[sizeof("L8")]; + char stringpool_str227[sizeof("ISO-IR-203")]; + char stringpool_str229[sizeof("KZ-1048")]; + char stringpool_str230[sizeof("ISO-IR-127")]; + char stringpool_str231[sizeof("CSKZ1048")]; + char stringpool_str232[sizeof("L3")]; + char stringpool_str233[sizeof("ISO-IR-14")]; + char stringpool_str235[sizeof("ISO-IR-57")]; + char stringpool_str236[sizeof("TIS620.2529-1")]; + char stringpool_str238[sizeof("ISO-IR-157")]; + char stringpool_str239[sizeof("LATIN2")]; + char stringpool_str240[sizeof("ISO-IR-87")]; + char stringpool_str243[sizeof("LATIN1")]; + char stringpool_str246[sizeof("CSKSC56011987")]; + char stringpool_str247[sizeof("KOREAN")]; + char stringpool_str248[sizeof("ISO-IR-110")]; + char stringpool_str249[sizeof("LATIN6")]; + char stringpool_str250[sizeof("ISO-CELTIC")]; + char stringpool_str251[sizeof("VISCII")]; + char stringpool_str254[sizeof("CSVISCII")]; + char stringpool_str255[sizeof("LATIN5")]; + char stringpool_str258[sizeof("CHAR")]; + char stringpool_str259[sizeof("KS_C_5601-1989")]; + char stringpool_str260[sizeof("TIS620.2533-1")]; + char stringpool_str261[sizeof("L7")]; + char stringpool_str262[sizeof("RK1048")]; + char stringpool_str263[sizeof("L4")]; + char stringpool_str264[sizeof("CSISOLATIN2")]; + char stringpool_str265[sizeof("LATIN8")]; + char stringpool_str266[sizeof("PTCP154")]; + char stringpool_str268[sizeof("CSISOLATIN1")]; + char stringpool_str271[sizeof("TCVN")]; + char stringpool_str272[sizeof("LATIN-9")]; + char stringpool_str273[sizeof("CSISOLATINCYRILLIC")]; + char stringpool_str274[sizeof("CSISOLATIN6")]; + char stringpool_str276[sizeof("IBM367")]; + char stringpool_str277[sizeof("GREEK8")]; + char stringpool_str279[sizeof("LATIN3")]; + char stringpool_str280[sizeof("CSISOLATIN5")]; + char stringpool_str281[sizeof("X0212")]; + char stringpool_str283[sizeof("CSISOLATINARABIC")]; + char stringpool_str284[sizeof("ECMA-114")]; + char stringpool_str285[sizeof("ISO-IR-144")]; + char stringpool_str286[sizeof("CSPTCP154")]; + char stringpool_str287[sizeof("UHC")]; + char stringpool_str288[sizeof("IBM850")]; + char stringpool_str290[sizeof("US")]; + char stringpool_str292[sizeof("KS_C_5601-1987")]; + char stringpool_str293[sizeof("UCS-2")]; + char stringpool_str295[sizeof("IBM-CP1133")]; + char stringpool_str300[sizeof("ASMO-708")]; + char stringpool_str303[sizeof("ISO-IR-100")]; + char stringpool_str304[sizeof("CSISOLATIN3")]; + char stringpool_str308[sizeof("BIG5")]; + char stringpool_str309[sizeof("BIG-5")]; + char stringpool_str310[sizeof("US-ASCII")]; + char stringpool_str311[sizeof("CSBIG5")]; + char stringpool_str312[sizeof("CN-BIG5")]; + char stringpool_str314[sizeof("GBK")]; + char stringpool_str315[sizeof("TIS620.2533-0")]; + char stringpool_str316[sizeof("UNICODE-1-1")]; + char stringpool_str318[sizeof("ROMAN8")]; + char stringpool_str319[sizeof("CSGB2312")]; + char stringpool_str323[sizeof("CSUNICODE11")]; + char stringpool_str325[sizeof("CSUNICODE")]; + char stringpool_str327[sizeof("L10")]; + char stringpool_str329[sizeof("TCVN-5712")]; + char stringpool_str330[sizeof("HZ-GB-2312")]; + char stringpool_str331[sizeof("HP-ROMAN8")]; + char stringpool_str332[sizeof("GB_2312-80")]; + char stringpool_str333[sizeof("CSIBM866")]; + char stringpool_str334[sizeof("TCVN5712-1")]; + char stringpool_str335[sizeof("MACCROATIAN")]; + char stringpool_str336[sizeof("GREEK")]; + char stringpool_str337[sizeof("LATIN7")]; + char stringpool_str340[sizeof("X0201")]; + char stringpool_str341[sizeof("LATIN4")]; + char stringpool_str342[sizeof("EUCKR")]; + char stringpool_str343[sizeof("EUC-KR")]; + char stringpool_str345[sizeof("KOI8-R")]; + char stringpool_str347[sizeof("CSKOI8R")]; + char stringpool_str352[sizeof("GB18030")]; + char stringpool_str354[sizeof("GB_1988-80")]; + char stringpool_str355[sizeof("UTF-16")]; + char stringpool_str356[sizeof("LATIN10")]; + char stringpool_str362[sizeof("X0208")]; + char stringpool_str363[sizeof("UTF-32")]; + char stringpool_str364[sizeof("ISO646-US")]; + char stringpool_str366[sizeof("CSISOLATIN4")]; + char stringpool_str367[sizeof("UTF8")]; + char stringpool_str368[sizeof("UTF-8")]; + char stringpool_str369[sizeof("UNICODE-1-1-UTF-7")]; + char stringpool_str374[sizeof("CSUNICODE11UTF7")]; + char stringpool_str376[sizeof("VISCII1.1-1")]; + char stringpool_str377[sizeof("EUCTW")]; + char stringpool_str378[sizeof("EUC-TW")]; + char stringpool_str384[sizeof("WINDOWS-1252")]; + char stringpool_str386[sizeof("WINDOWS-1251")]; + char stringpool_str389[sizeof("WINDOWS-1256")]; + char stringpool_str390[sizeof("WCHAR_T")]; + char stringpool_str392[sizeof("WINDOWS-1255")]; + char stringpool_str394[sizeof("ISO-2022-KR")]; + char stringpool_str395[sizeof("UCS-4")]; + char stringpool_str396[sizeof("CSISO57GB1988")]; + char stringpool_str397[sizeof("WINDOWS-1258")]; + char stringpool_str398[sizeof("CSUCS4")]; + char stringpool_str401[sizeof("CSISO2022KR")]; + char stringpool_str403[sizeof("JP")]; + char stringpool_str404[sizeof("WINDOWS-1253")]; + char stringpool_str405[sizeof("STRK1048-2002")]; + char stringpool_str406[sizeof("CSHPROMAN8")]; + char stringpool_str408[sizeof("CSISO58GB231280")]; + char stringpool_str410[sizeof("MACICELAND")]; + char stringpool_str412[sizeof("CSISO14JISC6220RO")]; + char stringpool_str415[sizeof("JIS_C6226-1983")]; + char stringpool_str417[sizeof("ISO-10646-UCS-2")]; + char stringpool_str419[sizeof("WINDOWS-936")]; + char stringpool_str420[sizeof("BIG5HKSCS")]; + char stringpool_str421[sizeof("BIG5-HKSCS")]; + char stringpool_str427[sizeof("SHIFT-JIS")]; + char stringpool_str433[sizeof("WINDOWS-1257")]; + char stringpool_str435[sizeof("WINDOWS-1254")]; + char stringpool_str437[sizeof("CN-GB-ISOIR165")]; + char stringpool_str439[sizeof("CSSHIFTJIS")]; + char stringpool_str440[sizeof("UTF-7")]; + char stringpool_str441[sizeof("WINDOWS-1250")]; + char stringpool_str442[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; + char stringpool_str443[sizeof("CN-GB")]; + char stringpool_str444[sizeof("CSISO159JISX02121990")]; + char stringpool_str448[sizeof("MACROMAN")]; + char stringpool_str449[sizeof("GEORGIAN-ACADEMY")]; + char stringpool_str450[sizeof("JIS_C6220-1969-RO")]; + char stringpool_str451[sizeof("CSISOLATINHEBREW")]; + char stringpool_str454[sizeof("MACARABIC")]; + char stringpool_str455[sizeof("ISO_8859-5:1988")]; + char stringpool_str460[sizeof("ISO_8859-8:1988")]; + char stringpool_str461[sizeof("SHIFT_JIS")]; + char stringpool_str464[sizeof("UCS-2BE")]; + char stringpool_str466[sizeof("ISO_8859-9:1989")]; + char stringpool_str467[sizeof("ISO_8859-3:1988")]; + char stringpool_str468[sizeof("ISO-10646-UCS-4")]; + char stringpool_str470[sizeof("MACROMANIA")]; + char stringpool_str471[sizeof("ISO-2022-JP-2")]; + char stringpool_str473[sizeof("ISO-2022-JP-1")]; + char stringpool_str477[sizeof("CSISO2022JP2")]; + char stringpool_str481[sizeof("JIS0208")]; + char stringpool_str483[sizeof("ISO_8859-2:1987")]; + char stringpool_str484[sizeof("NEXTSTEP")]; + char stringpool_str485[sizeof("ISO_8859-1:1987")]; + char stringpool_str488[sizeof("ISO_8859-6:1987")]; + char stringpool_str490[sizeof("EUCJP")]; + char stringpool_str491[sizeof("EUC-JP")]; + char stringpool_str493[sizeof("CSISOLATINGREEK")]; + char stringpool_str498[sizeof("ISO_8859-4:1988")]; + char stringpool_str503[sizeof("ISO_8859-7:2003")]; + char stringpool_str513[sizeof("GEORGIAN-PS")]; + char stringpool_str515[sizeof("UCS-4BE")]; + char stringpool_str521[sizeof("UTF-16BE")]; + char stringpool_str523[sizeof("CSPC862LATINHEBREW")]; + char stringpool_str525[sizeof("UCS-2LE")]; + char stringpool_str526[sizeof("CSHALFWIDTHKATAKANA")]; + char stringpool_str531[sizeof("ANSI_X3.4-1986")]; + char stringpool_str532[sizeof("ISO_8859-7:1987")]; + char stringpool_str534[sizeof("UTF-32BE")]; + char stringpool_str537[sizeof("WINDOWS-874")]; + char stringpool_str539[sizeof("ANSI_X3.4-1968")]; + char stringpool_str542[sizeof("ISO-2022-JP")]; + char stringpool_str544[sizeof("ISO646-JP")]; + char stringpool_str549[sizeof("CSISO2022JP")]; + char stringpool_str551[sizeof("CYRILLIC")]; + char stringpool_str561[sizeof("MACCENTRALEUROPE")]; + char stringpool_str563[sizeof("MS-HEBR")]; + char stringpool_str566[sizeof("UNICODELITTLE")]; + char stringpool_str576[sizeof("UCS-4LE")]; + char stringpool_str581[sizeof("CYRILLIC-ASIAN")]; + char stringpool_str582[sizeof("UTF-16LE")]; + char stringpool_str583[sizeof("ISO_646.IRV:1991")]; + char stringpool_str595[sizeof("UTF-32LE")]; + char stringpool_str596[sizeof("JAVA")]; + char stringpool_str598[sizeof("MS-ARAB")]; + char stringpool_str603[sizeof("MULELAO-1")]; + char stringpool_str606[sizeof("MS-GREEK")]; + char stringpool_str607[sizeof("MACGREEK")]; + char stringpool_str608[sizeof("BIGFIVE")]; + char stringpool_str609[sizeof("BIG-FIVE")]; + char stringpool_str622[sizeof("MS_KANJI")]; + char stringpool_str627[sizeof("CSEUCKR")]; + char stringpool_str639[sizeof("HEBREW")]; + char stringpool_str644[sizeof("UCS-2-SWAPPED")]; + char stringpool_str654[sizeof("JOHAB")]; + char stringpool_str662[sizeof("CSEUCTW")]; + char stringpool_str665[sizeof("UCS-2-INTERNAL")]; + char stringpool_str669[sizeof("KOI8-U")]; + char stringpool_str685[sizeof("MACUKRAINE")]; + char stringpool_str689[sizeof("MACTURKISH")]; + char stringpool_str692[sizeof("TCVN5712-1:1993")]; + char stringpool_str695[sizeof("UCS-4-SWAPPED")]; + char stringpool_str697[sizeof("MS-CYRL")]; + char stringpool_str704[sizeof("MACCYRILLIC")]; + char stringpool_str705[sizeof("CSISO87JISX0208")]; + char stringpool_str707[sizeof("CSEUCPKDFMTJAPANESE")]; + char stringpool_str710[sizeof("JIS_X0212")]; + char stringpool_str716[sizeof("UCS-4-INTERNAL")]; + char stringpool_str736[sizeof("UNICODEBIG")]; + char stringpool_str745[sizeof("MS-TURK")]; + char stringpool_str757[sizeof("BIG5-HKSCS:2001")]; + char stringpool_str760[sizeof("JISX0201-1976")]; + char stringpool_str768[sizeof("BIG5-HKSCS:2008")]; + char stringpool_str769[sizeof("JIS_X0201")]; + char stringpool_str771[sizeof("BIG5-HKSCS:1999")]; + char stringpool_str774[sizeof("JIS_X0212-1990")]; + char stringpool_str790[sizeof("KOI8-RU")]; + char stringpool_str791[sizeof("JIS_X0208")]; + char stringpool_str800[sizeof("MACHEBREW")]; + char stringpool_str805[sizeof("JIS_X0208-1983")]; + char stringpool_str806[sizeof("BIG5-HKSCS:2004")]; + char stringpool_str842[sizeof("JIS_X0208-1990")]; + char stringpool_str888[sizeof("JIS_X0212.1990-0")]; + char stringpool_str991[sizeof("WINBALTRIM")]; + char stringpool_str1038[sizeof("CSPC850MULTILINGUAL")]; + }; +static const struct stringpool_t stringpool_contents = + { + "CN", + "HZ", + "862", + "CP1252", + "ASCII", + "CP1251", + "SJIS", + "CP862", + "866", + "CP1256", + "CSASCII", + "EUCCN", + "EUC-CN", + "CP1255", + "CP866", + "CP1131", + "C99", + "CP1361", + "HP15CN", + "CP932", + "CP1258", + "CHINESE", + "CP936", + "CP819", + "CP1253", + "ISO88592", + "ISO8859-2", + "ISO-8859-2", + "ISO88591", + "ISO8859-1", + "ISO-8859-1", + "ISO8859-11", + "ISO-8859-11", + "ISO88596", + "ISO8859-6", + "ISO-8859-6", + "CP1133", + "ISO8859-16", + "ISO-8859-16", + "ISO88595", + "ISO8859-5", + "ISO-8859-5", + "ISO885915", + "ISO8859-15", + "ISO-8859-15", + "ISO-2022-CN", + "ISO646-CN", + "ISO88598", + "ISO8859-8", + "ISO-8859-8", + "CSISO2022CN", + "ISO88599", + "ISO8859-9", + "ISO-8859-9", + "ISO_8859-2", + "ISO-2022-CN-EXT", + "ISO_8859-1", + "ISO8859-3", + "ISO-8859-3", + "ISO_8859-11", + "ISO8859-13", + "ISO-8859-13", + "ISO_8859-6", + "CP949", + "ISO_8859-16", + "ISO_8859-16:2001", + "ISO_8859-5", + "ELOT_928", + "ISO_8859-15", + "CP1257", + "CP154", + "CP1254", + "ISO_8859-8", + "ISO_8859-15:1998", + "ISO_8859-9", + "CP367", + "850", + "CP1250", + "ISO_8859-3", + "R8", + "ISO_8859-13", + "ISO-IR-6", + "KOI8-T", + "ISO-IR-226", + "CP850", + "ISO-IR-126", + "CP950", + "ISO-IR-166", + "TIS620", + "TIS-620", + "MAC", + "ISO-IR-165", + "ISO88597", + "ISO8859-7", + "ISO-8859-7", + "ISO_8859-10:1992", + "ISO8859-4", + "ISO-8859-4", + "ISO-IR-58", + "ISO8859-14", + "ISO-8859-14", + "ISO_8859-14:1998", + "GB2312", + "CP874", + "IBM862", + "ISO-IR-159", + "ISO8859-10", + "ISO-8859-10", + "ISO-IR-138", + "MS-ANSI", + "ISO-IR-199", + "IBM866", + "MS-EE", + "ARABIC", + "PT154", + "ISO_8859-7", + "ISO-IR-101", + "MACTHAI", + "ISO_8859-4", + "MS936", + "ISO_8859-14", + "IBM819", + "ARMSCII-8", + "KSC_5601", + "MACINTOSH", + "TIS620-0", + "ECMA-118", + "ISO-IR-148", + "ISO_8859-10", + "L2", + "ISO-IR-179", + "L1", + "ISO-IR-149", + "L6", + "L5", + "ISO-IR-109", + "CSMACINTOSH", + "L8", + "ISO-IR-203", + "KZ-1048", + "ISO-IR-127", + "CSKZ1048", + "L3", + "ISO-IR-14", + "ISO-IR-57", + "TIS620.2529-1", + "ISO-IR-157", + "LATIN2", + "ISO-IR-87", + "LATIN1", + "CSKSC56011987", + "KOREAN", + "ISO-IR-110", + "LATIN6", + "ISO-CELTIC", + "VISCII", + "CSVISCII", + "LATIN5", + "CHAR", + "KS_C_5601-1989", + "TIS620.2533-1", + "L7", + "RK1048", + "L4", + "CSISOLATIN2", + "LATIN8", + "PTCP154", + "CSISOLATIN1", + "TCVN", + "LATIN-9", + "CSISOLATINCYRILLIC", + "CSISOLATIN6", + "IBM367", + "GREEK8", + "LATIN3", + "CSISOLATIN5", + "X0212", + "CSISOLATINARABIC", + "ECMA-114", + "ISO-IR-144", + "CSPTCP154", + "UHC", + "IBM850", + "US", + "KS_C_5601-1987", + "UCS-2", + "IBM-CP1133", + "ASMO-708", + "ISO-IR-100", + "CSISOLATIN3", + "BIG5", + "BIG-5", + "US-ASCII", + "CSBIG5", + "CN-BIG5", + "GBK", + "TIS620.2533-0", + "UNICODE-1-1", + "ROMAN8", + "CSGB2312", + "CSUNICODE11", + "CSUNICODE", + "L10", + "TCVN-5712", + "HZ-GB-2312", + "HP-ROMAN8", + "GB_2312-80", + "CSIBM866", + "TCVN5712-1", + "MACCROATIAN", + "GREEK", + "LATIN7", + "X0201", + "LATIN4", + "EUCKR", + "EUC-KR", + "KOI8-R", + "CSKOI8R", + "GB18030", + "GB_1988-80", + "UTF-16", + "LATIN10", + "X0208", + "UTF-32", + "ISO646-US", + "CSISOLATIN4", + "UTF8", + "UTF-8", + "UNICODE-1-1-UTF-7", + "CSUNICODE11UTF7", + "VISCII1.1-1", + "EUCTW", + "EUC-TW", + "WINDOWS-1252", + "WINDOWS-1251", + "WINDOWS-1256", + "WCHAR_T", + "WINDOWS-1255", + "ISO-2022-KR", + "UCS-4", + "CSISO57GB1988", + "WINDOWS-1258", + "CSUCS4", + "CSISO2022KR", + "JP", + "WINDOWS-1253", + "STRK1048-2002", + "CSHPROMAN8", + "CSISO58GB231280", + "MACICELAND", + "CSISO14JISC6220RO", + "JIS_C6226-1983", + "ISO-10646-UCS-2", + "WINDOWS-936", + "BIG5HKSCS", + "BIG5-HKSCS", + "SHIFT-JIS", + "WINDOWS-1257", + "WINDOWS-1254", + "CN-GB-ISOIR165", + "CSSHIFTJIS", + "UTF-7", + "WINDOWS-1250", + "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", + "CN-GB", + "CSISO159JISX02121990", + "MACROMAN", + "GEORGIAN-ACADEMY", + "JIS_C6220-1969-RO", + "CSISOLATINHEBREW", + "MACARABIC", + "ISO_8859-5:1988", + "ISO_8859-8:1988", + "SHIFT_JIS", + "UCS-2BE", + "ISO_8859-9:1989", + "ISO_8859-3:1988", + "ISO-10646-UCS-4", + "MACROMANIA", + "ISO-2022-JP-2", + "ISO-2022-JP-1", + "CSISO2022JP2", + "JIS0208", + "ISO_8859-2:1987", + "NEXTSTEP", + "ISO_8859-1:1987", + "ISO_8859-6:1987", + "EUCJP", + "EUC-JP", + "CSISOLATINGREEK", + "ISO_8859-4:1988", + "ISO_8859-7:2003", + "GEORGIAN-PS", + "UCS-4BE", + "UTF-16BE", + "CSPC862LATINHEBREW", + "UCS-2LE", + "CSHALFWIDTHKATAKANA", + "ANSI_X3.4-1986", + "ISO_8859-7:1987", + "UTF-32BE", + "WINDOWS-874", + "ANSI_X3.4-1968", + "ISO-2022-JP", + "ISO646-JP", + "CSISO2022JP", + "CYRILLIC", + "MACCENTRALEUROPE", + "MS-HEBR", + "UNICODELITTLE", + "UCS-4LE", + "CYRILLIC-ASIAN", + "UTF-16LE", + "ISO_646.IRV:1991", + "UTF-32LE", + "JAVA", + "MS-ARAB", + "MULELAO-1", + "MS-GREEK", + "MACGREEK", + "BIGFIVE", + "BIG-FIVE", + "MS_KANJI", + "CSEUCKR", + "HEBREW", + "UCS-2-SWAPPED", + "JOHAB", + "CSEUCTW", + "UCS-2-INTERNAL", + "KOI8-U", + "MACUKRAINE", + "MACTURKISH", + "TCVN5712-1:1993", + "UCS-4-SWAPPED", + "MS-CYRL", + "MACCYRILLIC", + "CSISO87JISX0208", + "CSEUCPKDFMTJAPANESE", + "JIS_X0212", + "UCS-4-INTERNAL", + "UNICODEBIG", + "MS-TURK", + "BIG5-HKSCS:2001", + "JISX0201-1976", + "BIG5-HKSCS:2008", + "JIS_X0201", + "BIG5-HKSCS:1999", + "JIS_X0212-1990", + "KOI8-RU", + "JIS_X0208", + "MACHEBREW", + "JIS_X0208-1983", + "BIG5-HKSCS:2004", + "JIS_X0208-1990", + "JIS_X0212.1990-0", + "WINBALTRIM", + "CSPC850MULTILINGUAL" + }; +#define stringpool ((const char *) &stringpool_contents) + +static const struct alias aliases[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 297 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str9, ei_iso646_cn}, + {-1}, {-1}, +#line 340 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str12, ei_hz}, + {-1}, {-1}, {-1}, +#line 212 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_cp862}, +#line 186 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_cp1252}, + {-1}, +#line 13 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_ascii}, + {-1}, +#line 183 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str21, ei_cp1251}, +#line 317 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_sjis}, + {-1}, +#line 210 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_cp862}, + {-1}, +#line 216 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str26, ei_cp866}, +#line 198 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp1256}, +#line 22 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_ascii}, +#line 327 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str29, ei_euc_cn}, +#line 326 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_euc_cn}, + {-1}, {-1}, +#line 195 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_cp1255}, +#line 214 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, +#line 218 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str35, ei_cp1131}, +#line 52 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_c99}, + {-1}, +#line 364 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_johab}, +#line 331 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_euc_cn}, + {-1}, {-1}, +#line 320 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_cp932}, +#line 204 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1258}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 302 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str50, ei_gb2312}, + {-1}, +#line 333 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp936}, +#line 58 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_iso8859_1}, + {-1}, {-1}, {-1}, +#line 189 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str57, ei_cp1253}, +#line 73 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_iso8859_2}, +#line 72 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str59, ei_iso8859_2}, +#line 65 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_iso8859_2}, + {-1}, +#line 64 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_iso8859_1}, +#line 63 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str63, ei_iso8859_1}, +#line 54 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_1}, + {-1}, +#line 147 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_11}, +#line 145 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_iso8859_11}, +#line 107 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_6}, +#line 106 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_6}, +#line 98 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_6}, +#line 253 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str71, ei_cp1133}, +#line 175 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_16}, +#line 169 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str73, ei_iso8859_16}, +#line 97 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_5}, +#line 96 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str75, ei_iso8859_5}, +#line 90 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_5}, +#line 168 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str77, ei_iso8859_15}, +#line 167 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str78, ei_iso8859_15}, +#line 162 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_iso8859_15}, + {-1}, +#line 337 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_iso2022_cn}, + {-1}, +#line 295 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str83, ei_iso646_cn}, +#line 127 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str84, ei_iso8859_8}, +#line 126 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str85, ei_iso8859_8}, +#line 120 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_iso8859_8}, + {-1}, +#line 338 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_iso2022_cn}, + {-1}, +#line 136 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str90, ei_iso8859_9}, +#line 135 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_9}, +#line 128 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_iso8859_9}, + {-1}, +#line 66 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_2}, + {-1}, +#line 339 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso2022_cn_ext}, + {-1}, +#line 55 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_1}, +#line 81 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_iso8859_3}, +#line 74 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str100, ei_iso8859_3}, +#line 146 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_11}, +#line 153 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_13}, +#line 148 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_13}, +#line 99 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str104, ei_iso8859_6}, +#line 361 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_cp949}, + {-1}, +#line 170 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_16}, + {-1}, +#line 171 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_16}, +#line 91 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_5}, +#line 114 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_7}, + {-1}, +#line 163 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str113, ei_iso8859_15}, + {-1}, +#line 201 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_cp1257}, + {-1}, {-1}, +#line 245 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_pt154}, +#line 192 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_cp1254}, +#line 121 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_8}, + {-1}, {-1}, +#line 164 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_15}, + {-1}, {-1}, +#line 129 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_9}, + {-1}, {-1}, +#line 19 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_ascii}, +#line 208 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_cp850}, +#line 180 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_cp1250}, + {-1}, {-1}, +#line 75 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str134, ei_iso8859_3}, +#line 236 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_hp_roman8}, + {-1}, +#line 149 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_13}, +#line 16 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str138, ei_ascii}, +#line 242 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_koi8_t}, +#line 172 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str140, ei_iso8859_16}, +#line 206 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_cp850}, +#line 112 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso8859_7}, + {-1}, +#line 351 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_cp950}, + {-1}, {-1}, +#line 261 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_tis620}, +#line 256 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_tis620}, +#line 255 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_tis620}, + {-1}, {-1}, +#line 221 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_mac_roman}, +#line 303 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_isoir165}, + {-1}, {-1}, +#line 119 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_7}, +#line 118 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_iso8859_7}, +#line 108 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str158, ei_iso8859_7}, +#line 139 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_iso8859_10}, + {-1}, +#line 89 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso8859_4}, +#line 82 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_4}, +#line 300 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_gb2312}, +#line 161 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_iso8859_14}, +#line 154 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_14}, +#line 156 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_iso8859_14}, +#line 328 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_euc_cn}, + {-1}, {-1}, +#line 262 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_cp874}, +#line 211 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_cp862}, +#line 292 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_jisx0212}, + {-1}, {-1}, {-1}, +#line 144 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, +#line 137 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_iso8859_10}, +#line 123 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_iso8859_8}, +#line 188 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_cp1252}, +#line 157 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_iso8859_14}, +#line 215 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_cp866}, +#line 182 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_cp1250}, +#line 104 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_iso8859_6}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 243 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_pt154}, + {-1}, +#line 109 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_iso8859_7}, +#line 68 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_iso8859_2}, + {-1}, +#line 233 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_mac_thai}, +#line 83 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_4}, + {-1}, +#line 334 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_cp936}, +#line 155 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_14}, +#line 59 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_iso8859_1}, + {-1}, +#line 239 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_armscii_8}, +#line 305 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_ksc5601}, + {-1}, {-1}, +#line 220 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_mac_roman}, +#line 257 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_tis620}, +#line 113 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_iso8859_7}, +#line 131 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_9}, + {-1}, +#line 138 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_10}, +#line 70 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_iso8859_2}, +#line 150 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_iso8859_13}, +#line 61 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str214, ei_iso8859_1}, +#line 308 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_ksc5601}, + {-1}, +#line 142 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_iso8859_10}, + {-1}, {-1}, +#line 133 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str220, ei_iso8859_9}, +#line 77 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_iso8859_3}, +#line 222 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_mac_roman}, + {-1}, {-1}, +#line 159 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_iso8859_14}, + {-1}, +#line 165 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_iso8859_15}, + {-1}, +#line 250 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_rk1048}, +#line 101 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_iso8859_6}, +#line 251 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_rk1048}, +#line 79 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_3}, +#line 273 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str233, ei_iso646_jp}, + {-1}, +#line 296 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_iso646_cn}, +#line 258 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_tis620}, + {-1}, +#line 140 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_iso8859_10}, +#line 69 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_2}, +#line 285 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str240, ei_jisx0208}, + {-1}, {-1}, +#line 60 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_iso8859_1}, + {-1}, {-1}, +#line 309 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_ksc5601}, +#line 310 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_ksc5601}, +#line 85 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_iso8859_4}, +#line 141 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str249, ei_iso8859_10}, +#line 160 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_14}, +#line 264 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_viscii}, + {-1}, {-1}, +#line 266 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_viscii}, +#line 132 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_iso8859_9}, + {-1}, {-1}, +#line 367 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_local_char}, +#line 307 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_ksc5601}, +#line 260 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_tis620}, +#line 152 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_iso8859_13}, +#line 248 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_rk1048}, +#line 87 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_iso8859_4}, +#line 71 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_2}, +#line 158 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str265, ei_iso8859_14}, +#line 244 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_pt154}, + {-1}, +#line 62 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str268, ei_iso8859_1}, + {-1}, {-1}, +#line 267 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_tcvn}, +#line 166 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_iso8859_15}, +#line 95 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_iso8859_5}, +#line 143 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str274, ei_iso8859_10}, + {-1}, +#line 20 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_ascii}, +#line 115 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_iso8859_7}, + {-1}, +#line 78 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_iso8859_3}, +#line 134 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str280, ei_iso8859_9}, +#line 291 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_jisx0212}, + {-1}, +#line 105 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_iso8859_6}, +#line 102 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str284, ei_iso8859_6}, +#line 93 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str285, ei_iso8859_5}, +#line 247 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str286, ei_pt154}, +#line 362 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_cp949}, +#line 207 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_cp850}, + {-1}, +#line 21 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str290, ei_ascii}, + {-1}, +#line 306 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str292, ei_ksc5601}, +#line 25 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_ucs2}, + {-1}, +#line 254 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_cp1133}, + {-1}, {-1}, {-1}, {-1}, +#line 103 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str300, ei_iso8859_6}, + {-1}, {-1}, +#line 57 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str303, ei_iso8859_1}, +#line 80 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_iso8859_3}, + {-1}, {-1}, {-1}, +#line 345 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_ces_big5}, +#line 346 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str309, ei_ces_big5}, +#line 12 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_ascii}, +#line 350 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_ces_big5}, +#line 349 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str312, ei_ces_big5}, + {-1}, +#line 332 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_ces_gbk}, +#line 259 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_tis620}, +#line 30 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_ucs2be}, + {-1}, +#line 235 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_hp_roman8}, +#line 330 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_euc_cn}, + {-1}, {-1}, {-1}, +#line 31 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str323, ei_ucs2be}, + {-1}, +#line 27 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str325, ei_ucs2}, + {-1}, +#line 174 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_iso8859_16}, + {-1}, +#line 268 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str329, ei_tcvn}, +#line 341 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_hz}, +#line 234 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str331, ei_hp_roman8}, +#line 299 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str332, ei_gb2312}, +#line 217 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str333, ei_cp866}, +#line 269 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str334, ei_tcvn}, +#line 225 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_mac_croatian}, +#line 116 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_iso8859_7}, +#line 151 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_13}, + {-1}, {-1}, +#line 278 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str340, ei_jisx0201}, +#line 86 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str341, ei_iso8859_4}, +#line 359 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_euc_kr}, +#line 358 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_euc_kr}, + {-1}, +#line 176 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str345, ei_koi8_r}, + {-1}, +#line 177 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_koi8_r}, + {-1}, {-1}, {-1}, {-1}, +#line 336 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str352, ei_gb18030}, + {-1}, +#line 294 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_iso646_cn}, +#line 39 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_utf16}, +#line 173 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_iso8859_16}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 284 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_jisx0208}, +#line 42 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_utf32}, +#line 14 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_ascii}, + {-1}, +#line 88 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str366, ei_iso8859_4}, +#line 24 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_utf8}, +#line 23 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_utf8}, +#line 46 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_utf7}, + {-1}, {-1}, {-1}, {-1}, +#line 47 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str374, ei_utf7}, + {-1}, +#line 265 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str376, ei_viscii}, +#line 343 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str377, ei_euc_tw}, +#line 342 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_euc_tw}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 187 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_cp1252}, + {-1}, +#line 184 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_cp1251}, + {-1}, {-1}, +#line 199 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_cp1256}, +#line 368 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str390, ei_local_wchar_t}, + {-1}, +#line 196 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_cp1255}, + {-1}, +#line 365 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str394, ei_iso2022_kr}, +#line 34 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_ucs4}, +#line 298 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_iso646_cn}, +#line 205 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_cp1258}, +#line 36 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ucs4}, + {-1}, {-1}, +#line 366 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_iso2022_kr}, + {-1}, +#line 274 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_iso646_jp}, +#line 190 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_cp1253}, +#line 249 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_rk1048}, +#line 237 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_hp_roman8}, + {-1}, +#line 301 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_gb2312}, + {-1}, +#line 224 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_mac_iceland}, + {-1}, +#line 275 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_iso646_jp}, + {-1}, {-1}, +#line 286 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_jisx0208}, + {-1}, +#line 26 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_ucs2}, + {-1}, +#line 335 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_cp936}, +#line 356 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_big5hkscs2008}, +#line 355 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_big5hkscs2008}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 316 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str427, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 202 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_cp1257}, + {-1}, +#line 193 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str435, ei_cp1254}, + {-1}, +#line 304 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_isoir165}, + {-1}, +#line 319 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_sjis}, +#line 45 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_utf7}, +#line 181 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_cp1250}, +#line 313 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str442, ei_euc_jp}, +#line 329 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str443, ei_euc_cn}, +#line 293 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str444, ei_jisx0212}, + {-1}, {-1}, {-1}, +#line 219 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_mac_roman}, +#line 240 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_georgian_academy}, +#line 271 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str450, ei_iso646_jp}, +#line 125 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_iso8859_8}, + {-1}, {-1}, +#line 232 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str454, ei_mac_arabic}, +#line 92 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_iso8859_5}, + {-1}, {-1}, {-1}, {-1}, +#line 122 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str460, ei_iso8859_8}, +#line 315 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_sjis}, + {-1}, {-1}, +#line 28 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_ucs2be}, + {-1}, +#line 130 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_iso8859_9}, +#line 76 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_iso8859_3}, +#line 35 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str468, ei_ucs4}, + {-1}, +#line 226 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_mac_romania}, +#line 324 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str471, ei_iso2022_jp2}, + {-1}, +#line 323 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_iso2022_jp1}, + {-1}, {-1}, {-1}, +#line 325 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str477, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, +#line 283 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_jisx0208}, + {-1}, +#line 67 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_iso8859_2}, +#line 238 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str484, ei_nextstep}, +#line 56 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str485, ei_iso8859_1}, + {-1}, {-1}, +#line 100 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str488, ei_iso8859_6}, + {-1}, +#line 312 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str490, ei_euc_jp}, +#line 311 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str491, ei_euc_jp}, + {-1}, +#line 117 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, +#line 84 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str498, ei_iso8859_4}, + {-1}, {-1}, {-1}, {-1}, +#line 111 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 241 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_georgian_ps}, + {-1}, +#line 37 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_ucs4be}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 40 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_utf16be}, + {-1}, +#line 213 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_cp862}, + {-1}, +#line 32 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_ucs2le}, +#line 279 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str526, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, +#line 18 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ascii}, +#line 110 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_iso8859_7}, + {-1}, +#line 43 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str534, ei_utf32be}, + {-1}, {-1}, +#line 263 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str537, ei_cp874}, + {-1}, +#line 17 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str539, ei_ascii}, + {-1}, {-1}, +#line 321 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_iso2022_jp}, + {-1}, +#line 272 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_iso646_jp}, + {-1}, {-1}, {-1}, {-1}, +#line 322 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_iso2022_jp}, + {-1}, +#line 94 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str551, ei_iso8859_5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 223 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str561, ei_mac_centraleurope}, + {-1}, +#line 197 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_cp1255}, + {-1}, {-1}, +#line 33 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str566, ei_ucs2le}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 38 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str576, ei_ucs4le}, + {-1}, {-1}, {-1}, {-1}, +#line 246 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_pt154}, +#line 41 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str582, ei_utf16le}, +#line 15 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_ascii}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 44 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str595, ei_utf32le}, +#line 53 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str596, ei_java}, + {-1}, +#line 200 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str598, ei_cp1256}, + {-1}, {-1}, {-1}, {-1}, +#line 252 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str603, ei_mulelao}, + {-1}, {-1}, +#line 191 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str606, ei_cp1253}, +#line 229 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str607, ei_mac_greek}, +#line 348 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_ces_big5}, +#line 347 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str609, ei_ces_big5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 318 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, +#line 360 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str627, ei_euc_kr}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 124 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str639, ei_iso8859_8}, + {-1}, {-1}, {-1}, {-1}, +#line 49 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str644, ei_ucs2swapped}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 363 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str654, ei_johab}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 344 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str662, ei_euc_tw}, + {-1}, {-1}, +#line 48 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str665, ei_ucs2internal}, + {-1}, {-1}, {-1}, +#line 178 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_koi8_u}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 228 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_mac_ukraine}, + {-1}, {-1}, {-1}, +#line 230 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_mac_turkish}, + {-1}, {-1}, +#line 270 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str692, ei_tcvn}, + {-1}, {-1}, +#line 51 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str695, ei_ucs4swapped}, + {-1}, +#line 185 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str697, ei_cp1251}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 227 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str704, ei_mac_cyrillic}, +#line 287 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str705, ei_jisx0208}, + {-1}, +#line 314 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str707, ei_euc_jp}, + {-1}, {-1}, +#line 288 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str710, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 50 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str716, ei_ucs4internal}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 29 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str736, ei_ucs2be}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 194 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str745, ei_cp1254}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 353 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str757, ei_big5hkscs2001}, + {-1}, {-1}, +#line 277 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str760, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 357 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_big5hkscs2008}, +#line 276 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str769, ei_jisx0201}, + {-1}, +#line 352 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_big5hkscs1999}, + {-1}, {-1}, +#line 290 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str774, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 179 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str790, ei_koi8_ru}, +#line 280 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str791, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 231 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str800, ei_mac_hebrew}, + {-1}, {-1}, {-1}, {-1}, +#line 281 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str805, ei_jisx0208}, +#line 354 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str806, ei_big5hkscs2004}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 282 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 289 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str888, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 203 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str991, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 209 "lib/aliases_syshpux.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str1038, ei_cp850} + }; + +#ifdef __GNUC__ +__inline +#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#endif +const struct alias * +aliases_lookup (register const char *str, register unsigned int len) +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = aliases_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = aliases[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &aliases[key]; + } + } + } + return 0; +} diff --git a/Externals/libiconv-1.14/lib/aliases_sysosf1.h b/Externals/libiconv-1.14/lib/aliases_sysosf1.h new file mode 100644 index 0000000000..18bbb031f5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_sysosf1.h @@ -0,0 +1,1745 @@ +/* ANSI-C code produced by gperf version 3.0.4 */ +/* Command-line: gperf -m 10 lib/aliases_sysosf1.gperf */ +/* Computed positions: -k'1,3-11,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "lib/aliases_sysosf1.gperf" +struct alias { int name; unsigned int encoding_index; }; + +#define TOTAL_KEYWORDS 352 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 45 +#define MIN_HASH_VALUE 13 +#define MAX_HASH_VALUE 939 +/* maximum key range = 927, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +aliases_hash (register const char *str, register unsigned int len) +{ + static const unsigned short asso_values[] = + { + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 13, 100, 940, 73, 4, + 7, 6, 55, 8, 5, 156, 10, 23, 295, 940, + 940, 940, 940, 940, 940, 115, 165, 4, 6, 104, + 115, 13, 53, 4, 304, 95, 7, 150, 18, 4, + 75, 940, 76, 50, 25, 141, 173, 137, 120, 6, + 5, 940, 940, 940, 940, 27, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, + 940, 940, 940, 940, 940, 940, 940, 940 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +struct stringpool_t + { + char stringpool_str13[sizeof("L1")]; + char stringpool_str14[sizeof("L6")]; + char stringpool_str15[sizeof("L3")]; + char stringpool_str16[sizeof("L2")]; + char stringpool_str17[sizeof("L5")]; + char stringpool_str19[sizeof("L8")]; + char stringpool_str23[sizeof("866")]; + char stringpool_str24[sizeof("CN")]; + char stringpool_str27[sizeof("862")]; + char stringpool_str32[sizeof("CP1131")]; + char stringpool_str33[sizeof("CP1361")]; + char stringpool_str34[sizeof("CP866")]; + char stringpool_str36[sizeof("CP1133")]; + char stringpool_str37[sizeof("CP1251")]; + char stringpool_str38[sizeof("CP862")]; + char stringpool_str39[sizeof("CP1256")]; + char stringpool_str41[sizeof("CP1253")]; + char stringpool_str43[sizeof("CP1252")]; + char stringpool_str45[sizeof("CP1255")]; + char stringpool_str48[sizeof("CP936")]; + char stringpool_str49[sizeof("CP1258")]; + char stringpool_str50[sizeof("GB2312")]; + char stringpool_str52[sizeof("CP932")]; + char stringpool_str53[sizeof("C99")]; + char stringpool_str60[sizeof("HZ")]; + char stringpool_str64[sizeof("L4")]; + char stringpool_str68[sizeof("LATIN1")]; + char stringpool_str69[sizeof("CP819")]; + char stringpool_str70[sizeof("LATIN6")]; + char stringpool_str72[sizeof("LATIN3")]; + char stringpool_str74[sizeof("LATIN2")]; + char stringpool_str76[sizeof("LATIN5")]; + char stringpool_str80[sizeof("LATIN8")]; + char stringpool_str88[sizeof("R8")]; + char stringpool_str89[sizeof("ISO8859-1")]; + char stringpool_str91[sizeof("ISO8859-6")]; + char stringpool_str93[sizeof("ISO8859-3")]; + char stringpool_str94[sizeof("ISO8859-11")]; + char stringpool_str95[sizeof("ISO8859-2")]; + char stringpool_str96[sizeof("ISO8859-16")]; + char stringpool_str97[sizeof("ISO8859-5")]; + char stringpool_str98[sizeof("ISO8859-13")]; + char stringpool_str101[sizeof("ISO8859-8")]; + char stringpool_str102[sizeof("ISO8859-15")]; + char stringpool_str103[sizeof("ISO-8859-1")]; + char stringpool_str105[sizeof("ISO-8859-6")]; + char stringpool_str107[sizeof("ISO-8859-3")]; + char stringpool_str108[sizeof("ISO-8859-11")]; + char stringpool_str109[sizeof("ISO-8859-2")]; + char stringpool_str110[sizeof("ISO-8859-16")]; + char stringpool_str111[sizeof("ISO-8859-5")]; + char stringpool_str112[sizeof("ISO-8859-13")]; + char stringpool_str115[sizeof("ISO-8859-8")]; + char stringpool_str116[sizeof("ISO-8859-15")]; + char stringpool_str117[sizeof("ISO_8859-1")]; + char stringpool_str118[sizeof("CYRILLIC")]; + char stringpool_str119[sizeof("ISO_8859-6")]; + char stringpool_str120[sizeof("LATIN-9")]; + char stringpool_str121[sizeof("ISO_8859-3")]; + char stringpool_str122[sizeof("ISO_8859-11")]; + char stringpool_str123[sizeof("ISO_8859-2")]; + char stringpool_str124[sizeof("ISO_8859-16")]; + char stringpool_str125[sizeof("ISO_8859-5")]; + char stringpool_str126[sizeof("ISO_8859-13")]; + char stringpool_str127[sizeof("ISO8859-9")]; + char stringpool_str128[sizeof("ISO_8859-16:2001")]; + char stringpool_str129[sizeof("ISO_8859-8")]; + char stringpool_str130[sizeof("ISO_8859-15")]; + char stringpool_str131[sizeof("CP154")]; + char stringpool_str132[sizeof("ISO-IR-6")]; + char stringpool_str133[sizeof("CP949")]; + char stringpool_str135[sizeof("ISO646-CN")]; + char stringpool_str136[sizeof("ASCII")]; + char stringpool_str137[sizeof("ISO_8859-15:1998")]; + char stringpool_str139[sizeof("CP1254")]; + char stringpool_str141[sizeof("ISO-8859-9")]; + char stringpool_str143[sizeof("ISO-IR-166")]; + char stringpool_str145[sizeof("ISO-IR-126")]; + char stringpool_str148[sizeof("ISO-IR-226")]; + char stringpool_str149[sizeof("ISO-IR-165")]; + char stringpool_str150[sizeof("X0212")]; + char stringpool_str151[sizeof("ISO-IR-58")]; + char stringpool_str152[sizeof("UHC")]; + char stringpool_str153[sizeof("EUCCN")]; + char stringpool_str154[sizeof("ISO-IR-138")]; + char stringpool_str155[sizeof("ISO_8859-9")]; + char stringpool_str156[sizeof("L10")]; + char stringpool_str158[sizeof("SJIS")]; + char stringpool_str159[sizeof("850")]; + char stringpool_str161[sizeof("MAC")]; + char stringpool_str164[sizeof("TACTIS")]; + char stringpool_str165[sizeof("L7")]; + char stringpool_str167[sizeof("EUC-CN")]; + char stringpool_str170[sizeof("LATIN4")]; + char stringpool_str173[sizeof("CP850")]; + char stringpool_str175[sizeof("CP1250")]; + char stringpool_str178[sizeof("KOI8-T")]; + char stringpool_str179[sizeof("ISO-2022-CN")]; + char stringpool_str182[sizeof("ISO-IR-159")]; + char stringpool_str183[sizeof("ISO-CELTIC")]; + char stringpool_str184[sizeof("ISO_8859-14:1998")]; + char stringpool_str185[sizeof("IBM866")]; + char stringpool_str186[sizeof("CP950")]; + char stringpool_str189[sizeof("IBM862")]; + char stringpool_str190[sizeof("ISO-2022-CN-EXT")]; + char stringpool_str191[sizeof("ISO8859-4")]; + char stringpool_str192[sizeof("CSASCII")]; + char stringpool_str193[sizeof("US")]; + char stringpool_str194[sizeof("MS936")]; + char stringpool_str196[sizeof("ISO8859-14")]; + char stringpool_str197[sizeof("ISO-IR-199")]; + char stringpool_str198[sizeof("BIG5")]; + char stringpool_str199[sizeof("ISO_8859-10:1992")]; + char stringpool_str200[sizeof("KSC5601")]; + char stringpool_str202[sizeof("PT154")]; + char stringpool_str203[sizeof("ISO-IR-148")]; + char stringpool_str205[sizeof("ISO-8859-4")]; + char stringpool_str206[sizeof("GBK")]; + char stringpool_str207[sizeof("CSISO2022CN")]; + char stringpool_str208[sizeof("CSBIG5")]; + char stringpool_str209[sizeof("ISO-IR-101")]; + char stringpool_str210[sizeof("ISO-8859-14")]; + char stringpool_str211[sizeof("LATIN10")]; + char stringpool_str212[sizeof("BIG-5")]; + char stringpool_str213[sizeof("X0201")]; + char stringpool_str216[sizeof("ISO-IR-203")]; + char stringpool_str217[sizeof("DECHANZI")]; + char stringpool_str218[sizeof("ELOT_928")]; + char stringpool_str219[sizeof("ISO_8859-4")]; + char stringpool_str220[sizeof("IBM819")]; + char stringpool_str221[sizeof("CSGB2312")]; + char stringpool_str222[sizeof("CN-BIG5")]; + char stringpool_str223[sizeof("UCS-2")]; + char stringpool_str224[sizeof("ISO_8859-14")]; + char stringpool_str225[sizeof("X0208")]; + char stringpool_str228[sizeof("KSC_5601")]; + char stringpool_str229[sizeof("ISO-IR-149")]; + char stringpool_str232[sizeof("ISO8859-10")]; + char stringpool_str234[sizeof("RK1048")]; + char stringpool_str237[sizeof("ISO-IR-14")]; + char stringpool_str238[sizeof("TCVN")]; + char stringpool_str239[sizeof("TIS620")]; + char stringpool_str243[sizeof("GB_2312-80")]; + char stringpool_str245[sizeof("VISCII")]; + char stringpool_str246[sizeof("ISO-8859-10")]; + char stringpool_str247[sizeof("ISO-IR-109")]; + char stringpool_str250[sizeof("CSISOLATIN1")]; + char stringpool_str252[sizeof("CSISOLATIN6")]; + char stringpool_str253[sizeof("TIS-620")]; + char stringpool_str254[sizeof("CSISOLATIN3")]; + char stringpool_str255[sizeof("CSVISCII")]; + char stringpool_str256[sizeof("CSISOLATIN2")]; + char stringpool_str257[sizeof("CSISOLATINCYRILLIC")]; + char stringpool_str258[sizeof("CSISOLATIN5")]; + char stringpool_str259[sizeof("GB18030")]; + char stringpool_str260[sizeof("ISO_8859-10")]; + char stringpool_str264[sizeof("CSKZ1048")]; + char stringpool_str266[sizeof("GB_1988-80")]; + char stringpool_str267[sizeof("KZ-1048")]; + char stringpool_str270[sizeof("MS-CYRL")]; + char stringpool_str275[sizeof("CHAR")]; + char stringpool_str276[sizeof("CSKOI8R")]; + char stringpool_str278[sizeof("ISO-IR-110")]; + char stringpool_str280[sizeof("KOI8-R")]; + char stringpool_str281[sizeof("MACCYRILLIC")]; + char stringpool_str282[sizeof("IBM-CP1133")]; + char stringpool_str283[sizeof("PTCP154")]; + char stringpool_str285[sizeof("CP874")]; + char stringpool_str289[sizeof("UTF-16")]; + char stringpool_str293[sizeof("ISO-IR-144")]; + char stringpool_str294[sizeof("UTF-8")]; + char stringpool_str295[sizeof("UTF-32")]; + char stringpool_str297[sizeof("KS_C_5601-1989")]; + char stringpool_str298[sizeof("HZ-GB-2312")]; + char stringpool_str304[sizeof("TIS620.2533-1")]; + char stringpool_str308[sizeof("CSUNICODE11")]; + char stringpool_str312[sizeof("UNICODE-1-1")]; + char stringpool_str314[sizeof("CSPTCP154")]; + char stringpool_str315[sizeof("CSUCS4")]; + char stringpool_str316[sizeof("CYRILLIC-ASIAN")]; + char stringpool_str319[sizeof("UCS-4")]; + char stringpool_str322[sizeof("TIS620.2529-1")]; + char stringpool_str324[sizeof("IBM850")]; + char stringpool_str327[sizeof("TIS620-0")]; + char stringpool_str330[sizeof("ISO-IR-179")]; + char stringpool_str332[sizeof("CP367")]; + char stringpool_str336[sizeof("ISO646-US")]; + char stringpool_str339[sizeof("ISO-10646-UCS-2")]; + char stringpool_str341[sizeof("CP1257")]; + char stringpool_str342[sizeof("GREEK8")]; + char stringpool_str343[sizeof("US-ASCII")]; + char stringpool_str347[sizeof("ISO-IR-100")]; + char stringpool_str352[sizeof("CSISOLATIN4")]; + char stringpool_str354[sizeof("CSISOLATINGREEK")]; + char stringpool_str356[sizeof("CSIBM866")]; + char stringpool_str359[sizeof("CSISO58GB231280")]; + char stringpool_str360[sizeof("EUCKR")]; + char stringpool_str361[sizeof("MS-ANSI")]; + char stringpool_str362[sizeof("MACTHAI")]; + char stringpool_str365[sizeof("CN-GB")]; + char stringpool_str366[sizeof("CSISOLATINARABIC")]; + char stringpool_str368[sizeof("CN-GB-ISOIR165")]; + char stringpool_str369[sizeof("ARMSCII-8")]; + char stringpool_str370[sizeof("MACINTOSH")]; + char stringpool_str372[sizeof("LATIN7")]; + char stringpool_str373[sizeof("TIS620.2533-0")]; + char stringpool_str374[sizeof("EUC-KR")]; + char stringpool_str375[sizeof("VISCII1.1-1")]; + char stringpool_str381[sizeof("JP")]; + char stringpool_str385[sizeof("ROMAN8")]; + char stringpool_str386[sizeof("ISO-2022-KR")]; + char stringpool_str387[sizeof("ISO-10646-UCS-4")]; + char stringpool_str393[sizeof("ISO8859-7")]; + char stringpool_str395[sizeof("CHINESE")]; + char stringpool_str397[sizeof("GEORGIAN-ACADEMY")]; + char stringpool_str398[sizeof("CSUNICODE")]; + char stringpool_str400[sizeof("WINDOWS-1251")]; + char stringpool_str401[sizeof("WINDOWS-1256")]; + char stringpool_str402[sizeof("WINDOWS-1253")]; + char stringpool_str403[sizeof("WINDOWS-1252")]; + char stringpool_str404[sizeof("WINDOWS-1255")]; + char stringpool_str406[sizeof("WINDOWS-1258")]; + char stringpool_str407[sizeof("ISO-8859-7")]; + char stringpool_str410[sizeof("KOI8-U")]; + char stringpool_str411[sizeof("CSPC862LATINHEBREW")]; + char stringpool_str412[sizeof("EUCTW")]; + char stringpool_str413[sizeof("ARABIC")]; + char stringpool_str414[sizeof("CSISO2022KR")]; + char stringpool_str415[sizeof("WINDOWS-936")]; + char stringpool_str416[sizeof("GREEK")]; + char stringpool_str417[sizeof("MULELAO-1")]; + char stringpool_str418[sizeof("ECMA-118")]; + char stringpool_str420[sizeof("TCVN-5712")]; + char stringpool_str421[sizeof("ISO_8859-7")]; + char stringpool_str422[sizeof("TCVN5712-1")]; + char stringpool_str425[sizeof("ISO_8859-3:1988")]; + char stringpool_str426[sizeof("EUC-TW")]; + char stringpool_str427[sizeof("ISO_8859-5:1988")]; + char stringpool_str428[sizeof("MACICELAND")]; + char stringpool_str429[sizeof("ISO_8859-8:1988")]; + char stringpool_str430[sizeof("KS_C_5601-1987")]; + char stringpool_str432[sizeof("KOREAN")]; + char stringpool_str433[sizeof("UCS-2LE")]; + char stringpool_str437[sizeof("CSISOLATINHEBREW")]; + char stringpool_str439[sizeof("CSKSC56011987")]; + char stringpool_str441[sizeof("UNICODELITTLE")]; + char stringpool_str442[sizeof("GEORGIAN-PS")]; + char stringpool_str443[sizeof("ISO-IR-57")]; + char stringpool_str445[sizeof("ISO-IR-87")]; + char stringpool_str446[sizeof("JIS_C6226-1983")]; + char stringpool_str447[sizeof("ISO-IR-127")]; + char stringpool_str448[sizeof("ISO-IR-157")]; + char stringpool_str449[sizeof("DECKOREAN")]; + char stringpool_str451[sizeof("WINDOWS-1254")]; + char stringpool_str454[sizeof("CSISO57GB1988")]; + char stringpool_str455[sizeof("ISO_8859-9:1989")]; + char stringpool_str458[sizeof("HP-ROMAN8")]; + char stringpool_str464[sizeof("CSUNICODE11UTF7")]; + char stringpool_str465[sizeof("WCHAR_T")]; + char stringpool_str468[sizeof("UNICODEBIG")]; + char stringpool_str469[sizeof("WINDOWS-1250")]; + char stringpool_str470[sizeof("UNICODE-1-1-UTF-7")]; + char stringpool_str472[sizeof("UCS-2-INTERNAL")]; + char stringpool_str473[sizeof("ISO_646.IRV:1991")]; + char stringpool_str474[sizeof("ISO_8859-4:1988")]; + char stringpool_str476[sizeof("STRK1048-2002")]; + char stringpool_str480[sizeof("MS-EE")]; + char stringpool_str481[sizeof("UCS-4LE")]; + char stringpool_str483[sizeof("IBM367")]; + char stringpool_str487[sizeof("KOI8-RU")]; + char stringpool_str491[sizeof("CSMACINTOSH")]; + char stringpool_str497[sizeof("BIG5HKSCS")]; + char stringpool_str500[sizeof("NEXTSTEP")]; + char stringpool_str501[sizeof("UTF-16LE")]; + char stringpool_str504[sizeof("CSISO14JISC6220RO")]; + char stringpool_str505[sizeof("UTF-32LE")]; + char stringpool_str507[sizeof("CSEUCKR")]; + char stringpool_str508[sizeof("ECMA-114")]; + char stringpool_str511[sizeof("BIG5-HKSCS")]; + char stringpool_str513[sizeof("ANSI_X3.4-1986")]; + char stringpool_str515[sizeof("JIS_C6220-1969-RO")]; + char stringpool_str518[sizeof("ANSI_X3.4-1968")]; + char stringpool_str520[sizeof("UCS-4-INTERNAL")]; + char stringpool_str523[sizeof("CSPC850MULTILINGUAL")]; + char stringpool_str524[sizeof("ISO-2022-JP-1")]; + char stringpool_str525[sizeof("CSHPROMAN8")]; + char stringpool_str527[sizeof("ISO-2022-JP-2")]; + char stringpool_str534[sizeof("JIS0208")]; + char stringpool_str539[sizeof("ASMO-708")]; + char stringpool_str543[sizeof("MACROMAN")]; + char stringpool_str544[sizeof("MACCROATIAN")]; + char stringpool_str548[sizeof("CSISO159JISX02121990")]; + char stringpool_str549[sizeof("ISO646-JP")]; + char stringpool_str552[sizeof("WINDOWS-1257")]; + char stringpool_str554[sizeof("CSISO2022JP2")]; + char stringpool_str559[sizeof("CSEUCTW")]; + char stringpool_str567[sizeof("EUCJP")]; + char stringpool_str569[sizeof("ISO_8859-1:1987")]; + char stringpool_str570[sizeof("ISO_8859-6:1987")]; + char stringpool_str571[sizeof("ISO_8859-7:2003")]; + char stringpool_str572[sizeof("ISO_8859-2:1987")]; + char stringpool_str581[sizeof("EUC-JP")]; + char stringpool_str586[sizeof("UTF-7")]; + char stringpool_str591[sizeof("UCS-2BE")]; + char stringpool_str593[sizeof("ISO-2022-JP")]; + char stringpool_str602[sizeof("MS-TURK")]; + char stringpool_str608[sizeof("JIS_X0212")]; + char stringpool_str621[sizeof("CSISO2022JP")]; + char stringpool_str624[sizeof("SHIFT-JIS")]; + char stringpool_str638[sizeof("SHIFT_JIS")]; + char stringpool_str639[sizeof("UCS-4BE")]; + char stringpool_str644[sizeof("MS-HEBR")]; + char stringpool_str646[sizeof("MACARABIC")]; + char stringpool_str649[sizeof("MACGREEK")]; + char stringpool_str652[sizeof("WINDOWS-874")]; + char stringpool_str653[sizeof("CSHALFWIDTHKATAKANA")]; + char stringpool_str658[sizeof("MS-GREEK")]; + char stringpool_str659[sizeof("UTF-16BE")]; + char stringpool_str661[sizeof("MACTURKISH")]; + char stringpool_str663[sizeof("UTF-32BE")]; + char stringpool_str669[sizeof("CSSHIFTJIS")]; + char stringpool_str671[sizeof("JIS_X0201")]; + char stringpool_str678[sizeof("HEBREW")]; + char stringpool_str683[sizeof("JIS_X0208")]; + char stringpool_str685[sizeof("BIGFIVE")]; + char stringpool_str689[sizeof("JISX0201-1976")]; + char stringpool_str695[sizeof("UCS-2-SWAPPED")]; + char stringpool_str696[sizeof("JIS_X0212-1990")]; + char stringpool_str699[sizeof("BIG-FIVE")]; + char stringpool_str701[sizeof("JIS_X0208-1983")]; + char stringpool_str702[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; + char stringpool_str707[sizeof("SDECKANJI")]; + char stringpool_str711[sizeof("JAVA")]; + char stringpool_str721[sizeof("ISO_8859-7:1987")]; + char stringpool_str724[sizeof("TCVN5712-1:1993")]; + char stringpool_str725[sizeof("MS_KANJI")]; + char stringpool_str727[sizeof("MACCENTRALEUROPE")]; + char stringpool_str731[sizeof("CSISO87JISX0208")]; + char stringpool_str743[sizeof("UCS-4-SWAPPED")]; + char stringpool_str761[sizeof("MACROMANIA")]; + char stringpool_str765[sizeof("BIG5-HKSCS:2001")]; + char stringpool_str768[sizeof("JIS_X0208-1990")]; + char stringpool_str771[sizeof("BIG5-HKSCS:2008")]; + char stringpool_str784[sizeof("BIG5-HKSCS:1999")]; + char stringpool_str785[sizeof("JIS_X0212.1990-0")]; + char stringpool_str806[sizeof("MS-ARAB")]; + char stringpool_str807[sizeof("JOHAB")]; + char stringpool_str816[sizeof("BIG5-HKSCS:2004")]; + char stringpool_str821[sizeof("MACUKRAINE")]; + char stringpool_str842[sizeof("CSEUCPKDFMTJAPANESE")]; + char stringpool_str857[sizeof("WINBALTRIM")]; + char stringpool_str939[sizeof("MACHEBREW")]; + }; +static const struct stringpool_t stringpool_contents = + { + "L1", + "L6", + "L3", + "L2", + "L5", + "L8", + "866", + "CN", + "862", + "CP1131", + "CP1361", + "CP866", + "CP1133", + "CP1251", + "CP862", + "CP1256", + "CP1253", + "CP1252", + "CP1255", + "CP936", + "CP1258", + "GB2312", + "CP932", + "C99", + "HZ", + "L4", + "LATIN1", + "CP819", + "LATIN6", + "LATIN3", + "LATIN2", + "LATIN5", + "LATIN8", + "R8", + "ISO8859-1", + "ISO8859-6", + "ISO8859-3", + "ISO8859-11", + "ISO8859-2", + "ISO8859-16", + "ISO8859-5", + "ISO8859-13", + "ISO8859-8", + "ISO8859-15", + "ISO-8859-1", + "ISO-8859-6", + "ISO-8859-3", + "ISO-8859-11", + "ISO-8859-2", + "ISO-8859-16", + "ISO-8859-5", + "ISO-8859-13", + "ISO-8859-8", + "ISO-8859-15", + "ISO_8859-1", + "CYRILLIC", + "ISO_8859-6", + "LATIN-9", + "ISO_8859-3", + "ISO_8859-11", + "ISO_8859-2", + "ISO_8859-16", + "ISO_8859-5", + "ISO_8859-13", + "ISO8859-9", + "ISO_8859-16:2001", + "ISO_8859-8", + "ISO_8859-15", + "CP154", + "ISO-IR-6", + "CP949", + "ISO646-CN", + "ASCII", + "ISO_8859-15:1998", + "CP1254", + "ISO-8859-9", + "ISO-IR-166", + "ISO-IR-126", + "ISO-IR-226", + "ISO-IR-165", + "X0212", + "ISO-IR-58", + "UHC", + "EUCCN", + "ISO-IR-138", + "ISO_8859-9", + "L10", + "SJIS", + "850", + "MAC", + "TACTIS", + "L7", + "EUC-CN", + "LATIN4", + "CP850", + "CP1250", + "KOI8-T", + "ISO-2022-CN", + "ISO-IR-159", + "ISO-CELTIC", + "ISO_8859-14:1998", + "IBM866", + "CP950", + "IBM862", + "ISO-2022-CN-EXT", + "ISO8859-4", + "CSASCII", + "US", + "MS936", + "ISO8859-14", + "ISO-IR-199", + "BIG5", + "ISO_8859-10:1992", + "KSC5601", + "PT154", + "ISO-IR-148", + "ISO-8859-4", + "GBK", + "CSISO2022CN", + "CSBIG5", + "ISO-IR-101", + "ISO-8859-14", + "LATIN10", + "BIG-5", + "X0201", + "ISO-IR-203", + "DECHANZI", + "ELOT_928", + "ISO_8859-4", + "IBM819", + "CSGB2312", + "CN-BIG5", + "UCS-2", + "ISO_8859-14", + "X0208", + "KSC_5601", + "ISO-IR-149", + "ISO8859-10", + "RK1048", + "ISO-IR-14", + "TCVN", + "TIS620", + "GB_2312-80", + "VISCII", + "ISO-8859-10", + "ISO-IR-109", + "CSISOLATIN1", + "CSISOLATIN6", + "TIS-620", + "CSISOLATIN3", + "CSVISCII", + "CSISOLATIN2", + "CSISOLATINCYRILLIC", + "CSISOLATIN5", + "GB18030", + "ISO_8859-10", + "CSKZ1048", + "GB_1988-80", + "KZ-1048", + "MS-CYRL", + "CHAR", + "CSKOI8R", + "ISO-IR-110", + "KOI8-R", + "MACCYRILLIC", + "IBM-CP1133", + "PTCP154", + "CP874", + "UTF-16", + "ISO-IR-144", + "UTF-8", + "UTF-32", + "KS_C_5601-1989", + "HZ-GB-2312", + "TIS620.2533-1", + "CSUNICODE11", + "UNICODE-1-1", + "CSPTCP154", + "CSUCS4", + "CYRILLIC-ASIAN", + "UCS-4", + "TIS620.2529-1", + "IBM850", + "TIS620-0", + "ISO-IR-179", + "CP367", + "ISO646-US", + "ISO-10646-UCS-2", + "CP1257", + "GREEK8", + "US-ASCII", + "ISO-IR-100", + "CSISOLATIN4", + "CSISOLATINGREEK", + "CSIBM866", + "CSISO58GB231280", + "EUCKR", + "MS-ANSI", + "MACTHAI", + "CN-GB", + "CSISOLATINARABIC", + "CN-GB-ISOIR165", + "ARMSCII-8", + "MACINTOSH", + "LATIN7", + "TIS620.2533-0", + "EUC-KR", + "VISCII1.1-1", + "JP", + "ROMAN8", + "ISO-2022-KR", + "ISO-10646-UCS-4", + "ISO8859-7", + "CHINESE", + "GEORGIAN-ACADEMY", + "CSUNICODE", + "WINDOWS-1251", + "WINDOWS-1256", + "WINDOWS-1253", + "WINDOWS-1252", + "WINDOWS-1255", + "WINDOWS-1258", + "ISO-8859-7", + "KOI8-U", + "CSPC862LATINHEBREW", + "EUCTW", + "ARABIC", + "CSISO2022KR", + "WINDOWS-936", + "GREEK", + "MULELAO-1", + "ECMA-118", + "TCVN-5712", + "ISO_8859-7", + "TCVN5712-1", + "ISO_8859-3:1988", + "EUC-TW", + "ISO_8859-5:1988", + "MACICELAND", + "ISO_8859-8:1988", + "KS_C_5601-1987", + "KOREAN", + "UCS-2LE", + "CSISOLATINHEBREW", + "CSKSC56011987", + "UNICODELITTLE", + "GEORGIAN-PS", + "ISO-IR-57", + "ISO-IR-87", + "JIS_C6226-1983", + "ISO-IR-127", + "ISO-IR-157", + "DECKOREAN", + "WINDOWS-1254", + "CSISO57GB1988", + "ISO_8859-9:1989", + "HP-ROMAN8", + "CSUNICODE11UTF7", + "WCHAR_T", + "UNICODEBIG", + "WINDOWS-1250", + "UNICODE-1-1-UTF-7", + "UCS-2-INTERNAL", + "ISO_646.IRV:1991", + "ISO_8859-4:1988", + "STRK1048-2002", + "MS-EE", + "UCS-4LE", + "IBM367", + "KOI8-RU", + "CSMACINTOSH", + "BIG5HKSCS", + "NEXTSTEP", + "UTF-16LE", + "CSISO14JISC6220RO", + "UTF-32LE", + "CSEUCKR", + "ECMA-114", + "BIG5-HKSCS", + "ANSI_X3.4-1986", + "JIS_C6220-1969-RO", + "ANSI_X3.4-1968", + "UCS-4-INTERNAL", + "CSPC850MULTILINGUAL", + "ISO-2022-JP-1", + "CSHPROMAN8", + "ISO-2022-JP-2", + "JIS0208", + "ASMO-708", + "MACROMAN", + "MACCROATIAN", + "CSISO159JISX02121990", + "ISO646-JP", + "WINDOWS-1257", + "CSISO2022JP2", + "CSEUCTW", + "EUCJP", + "ISO_8859-1:1987", + "ISO_8859-6:1987", + "ISO_8859-7:2003", + "ISO_8859-2:1987", + "EUC-JP", + "UTF-7", + "UCS-2BE", + "ISO-2022-JP", + "MS-TURK", + "JIS_X0212", + "CSISO2022JP", + "SHIFT-JIS", + "SHIFT_JIS", + "UCS-4BE", + "MS-HEBR", + "MACARABIC", + "MACGREEK", + "WINDOWS-874", + "CSHALFWIDTHKATAKANA", + "MS-GREEK", + "UTF-16BE", + "MACTURKISH", + "UTF-32BE", + "CSSHIFTJIS", + "JIS_X0201", + "HEBREW", + "JIS_X0208", + "BIGFIVE", + "JISX0201-1976", + "UCS-2-SWAPPED", + "JIS_X0212-1990", + "BIG-FIVE", + "JIS_X0208-1983", + "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", + "SDECKANJI", + "JAVA", + "ISO_8859-7:1987", + "TCVN5712-1:1993", + "MS_KANJI", + "MACCENTRALEUROPE", + "CSISO87JISX0208", + "UCS-4-SWAPPED", + "MACROMANIA", + "BIG5-HKSCS:2001", + "JIS_X0208-1990", + "BIG5-HKSCS:2008", + "BIG5-HKSCS:1999", + "JIS_X0212.1990-0", + "MS-ARAB", + "JOHAB", + "BIG5-HKSCS:2004", + "MACUKRAINE", + "CSEUCPKDFMTJAPANESE", + "WINBALTRIM", + "MACHEBREW" + }; +#define stringpool ((const char *) &stringpool_contents) + +static const struct alias aliases[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 60 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso8859_1}, +#line 134 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_10}, +#line 76 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_3}, +#line 68 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_iso8859_2}, +#line 126 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_iso8859_9}, + {-1}, +#line 151 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_iso8859_14}, + {-1}, {-1}, {-1}, +#line 207 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str23, ei_cp866}, +#line 289 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_iso646_cn}, + {-1}, {-1}, +#line 203 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, + {-1}, {-1}, {-1}, {-1}, +#line 209 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp1131}, +#line 359 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_johab}, +#line 205 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, + {-1}, +#line 244 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_cp1133}, +#line 174 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str37, ei_cp1251}, +#line 201 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_cp862}, +#line 189 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_cp1256}, + {-1}, +#line 180 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_cp1253}, + {-1}, +#line 177 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1252}, + {-1}, +#line 186 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_cp1255}, + {-1}, {-1}, +#line 326 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp936}, +#line 195 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_cp1258}, +#line 321 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str50, ei_euc_cn}, + {-1}, +#line 313 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp932}, +#line 51 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_c99}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 333 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_hz}, + {-1}, {-1}, {-1}, +#line 84 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_4}, + {-1}, {-1}, {-1}, +#line 59 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_1}, +#line 57 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_1}, +#line 133 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_10}, + {-1}, +#line 75 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_3}, + {-1}, +#line 67 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_2}, + {-1}, +#line 125 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_9}, + {-1}, {-1}, {-1}, +#line 150 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str80, ei_iso8859_14}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 227 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_hp_roman8}, +#line 62 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str89, ei_iso8859_1}, + {-1}, +#line 102 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_6}, + {-1}, +#line 78 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_3}, +#line 139 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_11}, +#line 70 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_2}, +#line 166 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_16}, +#line 93 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_5}, +#line 145 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_13}, + {-1}, {-1}, +#line 120 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_8}, +#line 159 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_15}, +#line 53 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, + {-1}, +#line 94 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_6}, + {-1}, +#line 71 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, +#line 137 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_11}, +#line 63 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_2}, +#line 160 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_16}, +#line 87 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_5}, +#line 140 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_iso8859_13}, + {-1}, {-1}, +#line 114 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_iso8859_8}, +#line 154 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_15}, +#line 54 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_iso8859_1}, +#line 91 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_iso8859_5}, +#line 95 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_6}, +#line 158 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_15}, +#line 72 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_3}, +#line 138 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_11}, +#line 64 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_2}, +#line 161 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_16}, +#line 88 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_5}, +#line 141 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_13}, +#line 128 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_iso8859_9}, +#line 162 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso8859_16}, +#line 115 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_8}, +#line 155 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_15}, +#line 236 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_pt154}, +#line 16 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str132, ei_ascii}, +#line 355 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_cp949}, + {-1}, +#line 287 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso646_cn}, +#line 13 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_ascii}, +#line 156 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_15}, + {-1}, +#line 183 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp1254}, + {-1}, +#line 121 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_iso8859_9}, + {-1}, +#line 252 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_tis620}, + {-1}, +#line 107 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_7}, + {-1}, {-1}, +#line 163 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_16}, +#line 295 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_isoir165}, +#line 283 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_jisx0212}, +#line 292 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_gb2312}, +#line 356 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_cp949}, +#line 320 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_euc_cn}, +#line 117 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_8}, +#line 122 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str155, ei_iso8859_9}, +#line 165 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_16}, + {-1}, +#line 310 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str158, ei_sjis}, +#line 199 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_cp850}, + {-1}, +#line 212 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_mac_roman}, + {-1}, {-1}, +#line 253 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_tis620}, +#line 144 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_13}, + {-1}, +#line 319 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_euc_cn}, + {-1}, {-1}, +#line 83 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_iso8859_4}, + {-1}, {-1}, +#line 197 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str173, ei_cp850}, + {-1}, +#line 171 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_cp1250}, + {-1}, {-1}, +#line 233 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_koi8_t}, +#line 330 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso2022_cn}, + {-1}, {-1}, +#line 284 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_jisx0212}, +#line 152 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_iso8859_14}, +#line 148 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_14}, +#line 206 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_cp866}, +#line 344 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_cp950}, + {-1}, {-1}, +#line 202 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_cp862}, +#line 332 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_iso2022_cn_ext}, +#line 86 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_4}, +#line 22 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_ascii}, +#line 21 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_ascii}, +#line 327 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str194, ei_cp936}, + {-1}, +#line 153 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_14}, +#line 149 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_14}, +#line 338 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_ces_big5}, +#line 131 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_10}, +#line 357 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_cp949}, + {-1}, +#line 234 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_pt154}, +#line 124 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_9}, + {-1}, +#line 79 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, +#line 325 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_ces_gbk}, +#line 331 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_iso2022_cn}, +#line 343 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_ces_big5}, +#line 66 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_2}, +#line 146 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_14}, +#line 164 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_16}, +#line 339 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_ces_big5}, +#line 270 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_jisx0201}, + {-1}, {-1}, +#line 157 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_iso8859_15}, +#line 324 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_euc_cn}, +#line 109 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str218, ei_iso8859_7}, +#line 80 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_iso8859_4}, +#line 58 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str220, ei_iso8859_1}, +#line 323 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_euc_cn}, +#line 342 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_ces_big5}, +#line 24 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_ucs2}, +#line 147 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_14}, +#line 276 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_jisx0208}, + {-1}, {-1}, +#line 297 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_ksc5601}, +#line 300 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_ksc5601}, + {-1}, {-1}, +#line 136 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_10}, + {-1}, +#line 239 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_rk1048}, + {-1}, {-1}, +#line 265 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso646_jp}, +#line 259 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_tcvn}, +#line 247 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_tis620}, + {-1}, {-1}, {-1}, +#line 291 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_gb2312}, + {-1}, +#line 256 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str245, ei_viscii}, +#line 129 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_iso8859_10}, +#line 74 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_iso8859_3}, + {-1}, {-1}, +#line 61 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_1}, + {-1}, +#line 135 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_iso8859_10}, +#line 246 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str253, ei_tis620}, +#line 77 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_iso8859_3}, +#line 258 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_viscii}, +#line 69 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str256, ei_iso8859_2}, +#line 92 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str257, ei_iso8859_5}, +#line 127 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_iso8859_9}, +#line 329 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_gb18030}, +#line 130 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso8859_10}, + {-1}, {-1}, {-1}, +#line 242 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_rk1048}, + {-1}, +#line 286 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_iso646_cn}, +#line 241 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_rk1048}, + {-1}, {-1}, +#line 176 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_cp1251}, + {-1}, {-1}, {-1}, {-1}, +#line 362 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str275, ei_local_char}, +#line 168 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_koi8_r}, + {-1}, +#line 82 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_iso8859_4}, + {-1}, +#line 167 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str280, ei_koi8_r}, +#line 218 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_mac_cyrillic}, +#line 245 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str282, ei_cp1133}, +#line 235 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_pt154}, + {-1}, +#line 254 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str285, ei_cp874}, + {-1}, {-1}, {-1}, +#line 38 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str289, ei_utf16}, + {-1}, {-1}, {-1}, +#line 90 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_iso8859_5}, +#line 23 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_utf8}, +#line 41 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_utf32}, + {-1}, +#line 299 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str297, ei_ksc5601}, +#line 334 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str298, ei_hz}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 251 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_tis620}, + {-1}, {-1}, {-1}, +#line 30 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_ucs2be}, + {-1}, {-1}, {-1}, +#line 29 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str312, ei_ucs2be}, + {-1}, +#line 238 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_pt154}, +#line 35 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_ucs4}, +#line 237 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_pt154}, + {-1}, {-1}, +#line 33 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_ucs4}, + {-1}, {-1}, +#line 249 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str322, ei_tis620}, + {-1}, +#line 198 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_cp850}, + {-1}, {-1}, +#line 248 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_tis620}, + {-1}, {-1}, +#line 142 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_iso8859_13}, + {-1}, +#line 19 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str332, ei_ascii}, + {-1}, {-1}, {-1}, +#line 14 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_ascii}, + {-1}, {-1}, +#line 25 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str339, ei_ucs2}, + {-1}, +#line 192 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str341, ei_cp1257}, +#line 110 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso8859_7}, +#line 12 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_ascii}, + {-1}, {-1}, {-1}, +#line 56 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_iso8859_1}, + {-1}, {-1}, {-1}, {-1}, +#line 85 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str352, ei_iso8859_4}, + {-1}, +#line 112 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_iso8859_7}, + {-1}, +#line 208 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_cp866}, + {-1}, {-1}, +#line 293 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_gb2312}, +#line 352 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_euc_kr}, +#line 179 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str361, ei_cp1252}, +#line 224 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_mac_thai}, + {-1}, {-1}, +#line 322 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str365, ei_euc_cn}, +#line 101 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str366, ei_iso8859_6}, + {-1}, +#line 296 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_isoir165}, +#line 230 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_armscii_8}, +#line 211 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str370, ei_mac_roman}, + {-1}, +#line 143 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_iso8859_13}, +#line 250 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_tis620}, +#line 351 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str374, ei_euc_kr}, +#line 257 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str375, ei_viscii}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 266 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str381, ei_iso646_jp}, + {-1}, {-1}, {-1}, +#line 226 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_hp_roman8}, +#line 360 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_iso2022_kr}, +#line 34 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_ucs4}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 113 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_iso8859_7}, + {-1}, +#line 294 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_gb2312}, + {-1}, +#line 231 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_georgian_academy}, +#line 26 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ucs2}, + {-1}, +#line 175 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str400, ei_cp1251}, +#line 190 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_cp1256}, +#line 181 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_cp1253}, +#line 178 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_cp1252}, +#line 187 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_cp1255}, + {-1}, +#line 196 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_cp1258}, +#line 103 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str407, ei_iso8859_7}, + {-1}, {-1}, +#line 169 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_koi8_u}, +#line 204 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_cp862}, +#line 336 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_euc_tw}, +#line 100 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_iso8859_6}, +#line 361 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str414, ei_iso2022_kr}, +#line 328 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_cp936}, +#line 111 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_iso8859_7}, +#line 243 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_mulelao}, +#line 108 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str418, ei_iso8859_7}, + {-1}, +#line 260 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_tcvn}, +#line 104 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_iso8859_7}, +#line 261 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str422, ei_tcvn}, + {-1}, {-1}, +#line 73 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str425, ei_iso8859_3}, +#line 335 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str426, ei_euc_tw}, +#line 89 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str427, ei_iso8859_5}, +#line 215 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_mac_iceland}, +#line 116 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_iso8859_8}, +#line 298 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str430, ei_ksc5601}, + {-1}, +#line 302 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str432, ei_ksc5601}, +#line 31 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_ucs2le}, + {-1}, {-1}, {-1}, +#line 119 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_iso8859_8}, + {-1}, +#line 301 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_ksc5601}, + {-1}, +#line 32 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_ucs2le}, +#line 232 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str442, ei_georgian_ps}, +#line 288 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str443, ei_iso646_cn}, + {-1}, +#line 277 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_jisx0208}, +#line 278 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str446, ei_jisx0208}, +#line 97 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str447, ei_iso8859_6}, +#line 132 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso8859_10}, +#line 354 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_euc_kr}, + {-1}, +#line 184 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_cp1254}, + {-1}, {-1}, +#line 290 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str454, ei_iso646_cn}, +#line 123 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_iso8859_9}, + {-1}, {-1}, +#line 225 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str458, ei_hp_roman8}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 46 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_utf7}, +#line 363 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str465, ei_local_wchar_t}, + {-1}, {-1}, +#line 28 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str468, ei_ucs2be}, +#line 172 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str469, ei_cp1250}, +#line 45 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_utf7}, + {-1}, +#line 47 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str472, ei_ucs2internal}, +#line 15 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_ascii}, +#line 81 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_iso8859_4}, + {-1}, +#line 240 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_rk1048}, + {-1}, {-1}, {-1}, +#line 173 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str480, ei_cp1250}, +#line 37 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_ucs4le}, + {-1}, +#line 20 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_ascii}, + {-1}, {-1}, {-1}, +#line 170 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_koi8_ru}, + {-1}, {-1}, {-1}, +#line 213 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str491, ei_mac_roman}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 349 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_big5hkscs2008}, + {-1}, {-1}, +#line 229 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_nextstep}, +#line 40 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_utf16le}, + {-1}, {-1}, +#line 267 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str504, ei_iso646_jp}, +#line 43 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_utf32le}, + {-1}, +#line 353 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str507, ei_euc_kr}, +#line 98 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str508, ei_iso8859_6}, + {-1}, {-1}, +#line 348 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_big5hkscs2008}, + {-1}, +#line 18 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_ascii}, + {-1}, +#line 263 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_iso646_jp}, + {-1}, {-1}, +#line 17 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_ascii}, + {-1}, +#line 49 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str520, ei_ucs4internal}, + {-1}, {-1}, +#line 200 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_cp850}, +#line 316 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str524, ei_iso2022_jp1}, +#line 228 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_hp_roman8}, + {-1}, +#line 317 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str527, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 275 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str534, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, +#line 99 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str539, ei_iso8859_6}, + {-1}, {-1}, {-1}, +#line 210 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_mac_roman}, +#line 216 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_mac_croatian}, + {-1}, {-1}, {-1}, +#line 285 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str548, ei_jisx0212}, +#line 264 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_iso646_jp}, + {-1}, {-1}, +#line 193 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str552, ei_cp1257}, + {-1}, +#line 318 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, {-1}, +#line 337 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str559, ei_euc_tw}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 304 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str567, ei_euc_jp}, + {-1}, +#line 55 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_iso8859_1}, +#line 96 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str570, ei_iso8859_6}, +#line 106 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str571, ei_iso8859_7}, +#line 65 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_iso8859_2}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 303 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, +#line 44 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_utf7}, + {-1}, {-1}, {-1}, {-1}, +#line 27 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str591, ei_ucs2be}, + {-1}, +#line 314 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str593, ei_iso2022_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 185 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str602, ei_cp1254}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 280 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 315 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str621, ei_iso2022_jp}, + {-1}, {-1}, +#line 309 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 308 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str638, ei_sjis}, +#line 36 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str639, ei_ucs4be}, + {-1}, {-1}, {-1}, {-1}, +#line 188 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str644, ei_cp1255}, + {-1}, +#line 223 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str646, ei_mac_arabic}, + {-1}, {-1}, +#line 220 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str649, ei_mac_greek}, + {-1}, {-1}, +#line 255 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_cp874}, +#line 271 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str653, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, +#line 182 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str658, ei_cp1253}, +#line 39 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str659, ei_utf16be}, + {-1}, +#line 221 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str661, ei_mac_turkish}, + {-1}, +#line 42 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str663, ei_utf32be}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 312 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_sjis}, + {-1}, +#line 268 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str671, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 118 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str678, ei_iso8859_8}, + {-1}, {-1}, {-1}, {-1}, +#line 272 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str683, ei_jisx0208}, + {-1}, +#line 341 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_ces_big5}, + {-1}, {-1}, {-1}, +#line 269 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 48 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str695, ei_ucs2swapped}, +#line 282 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str696, ei_jisx0212}, + {-1}, {-1}, +#line 340 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str699, ei_ces_big5}, + {-1}, +#line 273 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str701, ei_jisx0208}, +#line 305 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, +#line 307 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str707, ei_euc_jp}, + {-1}, {-1}, {-1}, +#line 52 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str711, ei_java}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 105 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str721, ei_iso8859_7}, + {-1}, {-1}, +#line 262 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str724, ei_tcvn}, +#line 311 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str725, ei_sjis}, + {-1}, +#line 214 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str727, ei_mac_centraleurope}, + {-1}, {-1}, {-1}, +#line 279 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str731, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 50 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str743, ei_ucs4swapped}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 217 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str761, ei_mac_romania}, + {-1}, {-1}, {-1}, +#line 346 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str765, ei_big5hkscs2001}, + {-1}, {-1}, +#line 274 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_jisx0208}, + {-1}, {-1}, +#line 350 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_big5hkscs2008}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 345 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str784, ei_big5hkscs1999}, +#line 281 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str785, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 191 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str806, ei_cp1256}, +#line 358 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str807, ei_johab}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 347 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str816, ei_big5hkscs2004}, + {-1}, {-1}, {-1}, {-1}, +#line 219 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str821, ei_mac_ukraine}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 306 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 194 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str857, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 222 "lib/aliases_sysosf1.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str939, ei_mac_hebrew} + }; + +#ifdef __GNUC__ +__inline +#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#endif +const struct alias * +aliases_lookup (register const char *str, register unsigned int len) +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = aliases_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = aliases[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &aliases[key]; + } + } + } + return 0; +} diff --git a/Externals/libiconv-1.14/lib/aliases_syssolaris.h b/Externals/libiconv-1.14/lib/aliases_syssolaris.h new file mode 100644 index 0000000000..c35d4f9bf0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/aliases_syssolaris.h @@ -0,0 +1,1756 @@ +/* ANSI-C code produced by gperf version 3.0.4 */ +/* Command-line: gperf -m 10 lib/aliases_syssolaris.gperf */ +/* Computed positions: -k'1,3-11,$' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "lib/aliases_syssolaris.gperf" +struct alias { int name; unsigned int encoding_index; }; + +#define TOTAL_KEYWORDS 354 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 45 +#define MIN_HASH_VALUE 8 +#define MAX_HASH_VALUE 1003 +/* maximum key range = 996, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +aliases_hash (register const char *str, register unsigned int len) +{ + static const unsigned short asso_values[] = + { + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 2, 112, 1004, 27, 4, + 34, 57, 16, 22, 11, 168, 3, 10, 254, 1004, + 1004, 1004, 1004, 1004, 1004, 21, 126, 7, 10, 37, + 40, 119, 81, 62, 332, 197, 9, 169, 4, 2, + 8, 1004, 3, 34, 104, 205, 191, 192, 195, 36, + 16, 1004, 1004, 1004, 1004, 3, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +struct stringpool_t + { + char stringpool_str8[sizeof("R8")]; + char stringpool_str13[sizeof("CN")]; + char stringpool_str14[sizeof("L8")]; + char stringpool_str15[sizeof("L1")]; + char stringpool_str22[sizeof("L6")]; + char stringpool_str27[sizeof("L4")]; + char stringpool_str28[sizeof("866")]; + char stringpool_str30[sizeof("C99")]; + char stringpool_str33[sizeof("L5")]; + char stringpool_str36[sizeof("646")]; + char stringpool_str38[sizeof("CHAR")]; + char stringpool_str39[sizeof("CP819")]; + char stringpool_str45[sizeof("L2")]; + char stringpool_str48[sizeof("CP866")]; + char stringpool_str58[sizeof("CP949")]; + char stringpool_str60[sizeof("850")]; + char stringpool_str61[sizeof("5601")]; + char stringpool_str62[sizeof("RK1048")]; + char stringpool_str64[sizeof("EUCCN")]; + char stringpool_str66[sizeof("L10")]; + char stringpool_str67[sizeof("EUC-CN")]; + char stringpool_str68[sizeof("L3")]; + char stringpool_str70[sizeof("CP154")]; + char stringpool_str71[sizeof("PT154")]; + char stringpool_str74[sizeof("862")]; + char stringpool_str79[sizeof("CP1258")]; + char stringpool_str81[sizeof("CP1251")]; + char stringpool_str86[sizeof("CP1131")]; + char stringpool_str88[sizeof("PTCP154")]; + char stringpool_str91[sizeof("CP850")]; + char stringpool_str93[sizeof("CP1361")]; + char stringpool_str94[sizeof("CP862")]; + char stringpool_str95[sizeof("CP1256")]; + char stringpool_str98[sizeof("CP950")]; + char stringpool_str99[sizeof("HZ")]; + char stringpool_str101[sizeof("CP936")]; + char stringpool_str105[sizeof("CP1254")]; + char stringpool_str117[sizeof("CP1255")]; + char stringpool_str119[sizeof("ISO8859-8")]; + char stringpool_str121[sizeof("ISO8859-1")]; + char stringpool_str122[sizeof("ISO-8859-8")]; + char stringpool_str123[sizeof("ISO_8859-8")]; + char stringpool_str124[sizeof("ISO-8859-1")]; + char stringpool_str125[sizeof("ISO_8859-1")]; + char stringpool_str126[sizeof("ISO8859-11")]; + char stringpool_str127[sizeof("CP1250")]; + char stringpool_str128[sizeof("ISO646-CN")]; + char stringpool_str129[sizeof("ISO-8859-11")]; + char stringpool_str130[sizeof("ISO_8859-11")]; + char stringpool_str133[sizeof("ISO8859-9")]; + char stringpool_str135[sizeof("ISO8859-6")]; + char stringpool_str136[sizeof("ISO-8859-9")]; + char stringpool_str137[sizeof("ISO_8859-9")]; + char stringpool_str138[sizeof("ISO-8859-6")]; + char stringpool_str139[sizeof("ISO_8859-6")]; + char stringpool_str140[sizeof("ISO8859-16")]; + char stringpool_str141[sizeof("CP1252")]; + char stringpool_str142[sizeof("ISO_8859-16:2001")]; + char stringpool_str143[sizeof("ISO-8859-16")]; + char stringpool_str144[sizeof("ISO_8859-16")]; + char stringpool_str145[sizeof("ISO8859-4")]; + char stringpool_str146[sizeof("ISO_8859-14:1998")]; + char stringpool_str147[sizeof("CP932")]; + char stringpool_str148[sizeof("ISO-8859-4")]; + char stringpool_str149[sizeof("ISO_8859-4")]; + char stringpool_str150[sizeof("ISO8859-14")]; + char stringpool_str152[sizeof("ISO_8859-15:1998")]; + char stringpool_str153[sizeof("ISO-8859-14")]; + char stringpool_str154[sizeof("ISO_8859-14")]; + char stringpool_str157[sizeof("ISO8859-5")]; + char stringpool_str160[sizeof("ISO-8859-5")]; + char stringpool_str161[sizeof("ISO_8859-5")]; + char stringpool_str162[sizeof("ISO8859-15")]; + char stringpool_str163[sizeof("ISO-IR-6")]; + char stringpool_str165[sizeof("ISO-8859-15")]; + char stringpool_str166[sizeof("ISO_8859-15")]; + char stringpool_str168[sizeof("SJIS")]; + char stringpool_str169[sizeof("ISO-IR-148")]; + char stringpool_str170[sizeof("ISO-IR-58")]; + char stringpool_str172[sizeof("ISO8859-10")]; + char stringpool_str174[sizeof("CYRILLIC")]; + char stringpool_str175[sizeof("ISO-8859-10")]; + char stringpool_str176[sizeof("ISO_8859-10")]; + char stringpool_str177[sizeof("ISO-IR-199")]; + char stringpool_str178[sizeof("ISO-IR-14")]; + char stringpool_str179[sizeof("L7")]; + char stringpool_str180[sizeof("ISO-IR-166")]; + char stringpool_str181[sizeof("ISO8859-2")]; + char stringpool_str182[sizeof("ISO-IR-101")]; + char stringpool_str183[sizeof("ISO-IR-149")]; + char stringpool_str184[sizeof("ISO-8859-2")]; + char stringpool_str185[sizeof("ISO_8859-2")]; + char stringpool_str186[sizeof("MAC")]; + char stringpool_str187[sizeof("CP1253")]; + char stringpool_str188[sizeof("ISO_8859-10:1992")]; + char stringpool_str189[sizeof("ISO-IR-159")]; + char stringpool_str191[sizeof("LATIN8")]; + char stringpool_str192[sizeof("CP1133")]; + char stringpool_str193[sizeof("LATIN1")]; + char stringpool_str194[sizeof("ISO-IR-109")]; + char stringpool_str195[sizeof("ISO-IR-144")]; + char stringpool_str196[sizeof("ANSI-1251")]; + char stringpool_str198[sizeof("CNS11643")]; + char stringpool_str201[sizeof("CSPTCP154")]; + char stringpool_str202[sizeof("ISO-IR-165")]; + char stringpool_str203[sizeof("ISO-IR-126")]; + char stringpool_str204[sizeof("ELOT_928")]; + char stringpool_str205[sizeof("ISO-IR-110")]; + char stringpool_str207[sizeof("LATIN6")]; + char stringpool_str208[sizeof("LATIN-9")]; + char stringpool_str209[sizeof("ROMAN8")]; + char stringpool_str210[sizeof("ISO-IR-138")]; + char stringpool_str211[sizeof("GB_1988-80")]; + char stringpool_str215[sizeof("CP874")]; + char stringpool_str217[sizeof("LATIN4")]; + char stringpool_str219[sizeof("ASCII")]; + char stringpool_str222[sizeof("UHC")]; + char stringpool_str223[sizeof("ISO-2022-CN")]; + char stringpool_str225[sizeof("CHINESE")]; + char stringpool_str227[sizeof("ISO8859-3")]; + char stringpool_str228[sizeof("ISO-IR-100")]; + char stringpool_str229[sizeof("LATIN5")]; + char stringpool_str230[sizeof("ISO-8859-3")]; + char stringpool_str231[sizeof("ISO_8859-3")]; + char stringpool_str232[sizeof("ISO8859-13")]; + char stringpool_str233[sizeof("ISO-IR-226")]; + char stringpool_str234[sizeof("CYRILLIC-ASIAN")]; + char stringpool_str235[sizeof("ISO-8859-13")]; + char stringpool_str236[sizeof("ISO_8859-13")]; + char stringpool_str241[sizeof("US")]; + char stringpool_str242[sizeof("MS-CYRL")]; + char stringpool_str243[sizeof("TIS620")]; + char stringpool_str244[sizeof("LATIN10")]; + char stringpool_str246[sizeof("TIS-620")]; + char stringpool_str250[sizeof("ARABIC")]; + char stringpool_str251[sizeof("ECMA-118")]; + char stringpool_str252[sizeof("EUCKR")]; + char stringpool_str253[sizeof("LATIN2")]; + char stringpool_str255[sizeof("EUC-KR")]; + char stringpool_str258[sizeof("UTF-8")]; + char stringpool_str259[sizeof("KZ-1048")]; + char stringpool_str260[sizeof("CSISO2022CN")]; + char stringpool_str262[sizeof("CSASCII")]; + char stringpool_str263[sizeof("MS936")]; + char stringpool_str264[sizeof("IBM819")]; + char stringpool_str266[sizeof("MULELAO-1")]; + char stringpool_str267[sizeof("X0208")]; + char stringpool_str269[sizeof("X0201")]; + char stringpool_str271[sizeof("GB18030")]; + char stringpool_str272[sizeof("KOREAN")]; + char stringpool_str273[sizeof("IBM866")]; + char stringpool_str274[sizeof("TIS620-0")]; + char stringpool_str276[sizeof("KOI8-R")]; + char stringpool_str277[sizeof("ECMA-114")]; + char stringpool_str278[sizeof("UCS-4")]; + char stringpool_str279[sizeof("UTF-16")]; + char stringpool_str281[sizeof("CSKZ1048")]; + char stringpool_str283[sizeof("KSC_5601")]; + char stringpool_str284[sizeof("CSKOI8R")]; + char stringpool_str287[sizeof("MS-EE")]; + char stringpool_str288[sizeof("GB2312")]; + char stringpool_str291[sizeof("CSUCS4")]; + char stringpool_str293[sizeof("BIG5")]; + char stringpool_str296[sizeof("BIG-5")]; + char stringpool_str297[sizeof("HP-ROMAN8")]; + char stringpool_str299[sizeof("LATIN3")]; + char stringpool_str304[sizeof("KS_C_5601-1989")]; + char stringpool_str306[sizeof("X0212")]; + char stringpool_str307[sizeof("TCVN")]; + char stringpool_str309[sizeof("ISO-CELTIC")]; + char stringpool_str311[sizeof("CSHPROMAN8")]; + char stringpool_str314[sizeof("UCS-2")]; + char stringpool_str316[sizeof("IBM850")]; + char stringpool_str318[sizeof("ISO-IR-203")]; + char stringpool_str319[sizeof("IBM862")]; + char stringpool_str320[sizeof("GB_2312-80")]; + char stringpool_str324[sizeof("CSISOLATIN1")]; + char stringpool_str327[sizeof("ISO-2022-CN-EXT")]; + char stringpool_str335[sizeof("ISO-IR-179")]; + char stringpool_str337[sizeof("CSISOLATINCYRILLIC")]; + char stringpool_str338[sizeof("CSISOLATIN6")]; + char stringpool_str342[sizeof("JP")]; + char stringpool_str346[sizeof("MACICELAND")]; + char stringpool_str347[sizeof("UCS-4LE")]; + char stringpool_str348[sizeof("CSISOLATIN4")]; + char stringpool_str349[sizeof("CSISOLATINARABIC")]; + char stringpool_str350[sizeof("UNICODE-1-1")]; + char stringpool_str353[sizeof("UTF-16LE")]; + char stringpool_str357[sizeof("CSUNICODE11")]; + char stringpool_str360[sizeof("CSISOLATIN5")]; + char stringpool_str361[sizeof("MS-ANSI")]; + char stringpool_str364[sizeof("CSBIG5")]; + char stringpool_str365[sizeof("UCS-2LE")]; + char stringpool_str367[sizeof("CN-BIG5")]; + char stringpool_str372[sizeof("ARMSCII-8")]; + char stringpool_str373[sizeof("ISO-10646-UCS-4")]; + char stringpool_str378[sizeof("UTF-32")]; + char stringpool_str380[sizeof("CSUNICODE")]; + char stringpool_str382[sizeof("ISO_8859-8:1988")]; + char stringpool_str384[sizeof("CSISOLATIN2")]; + char stringpool_str385[sizeof("CN-GB")]; + char stringpool_str386[sizeof("ISO646-US")]; + char stringpool_str387[sizeof("MACROMAN")]; + char stringpool_str389[sizeof("MACCYRILLIC")]; + char stringpool_str391[sizeof("ISO-10646-UCS-2")]; + char stringpool_str394[sizeof("STRK1048-2002")]; + char stringpool_str395[sizeof("ISO_8859-4:1988")]; + char stringpool_str396[sizeof("ISO_8859-9:1989")]; + char stringpool_str397[sizeof("EUCJP")]; + char stringpool_str400[sizeof("EUC-JP")]; + char stringpool_str401[sizeof("ISO_8859-5:1988")]; + char stringpool_str402[sizeof("GREEK8")]; + char stringpool_str403[sizeof("ASMO-708")]; + char stringpool_str405[sizeof("PCK")]; + char stringpool_str408[sizeof("CSIBM866")]; + char stringpool_str409[sizeof("CP1257")]; + char stringpool_str411[sizeof("ISO-2022-KR")]; + char stringpool_str412[sizeof("GEORGIAN-ACADEMY")]; + char stringpool_str415[sizeof("MACCROATIAN")]; + char stringpool_str416[sizeof("CP367")]; + char stringpool_str419[sizeof("GEORGIAN-PS")]; + char stringpool_str423[sizeof("CSGB2312")]; + char stringpool_str424[sizeof("VISCII")]; + char stringpool_str428[sizeof("MS-HEBR")]; + char stringpool_str429[sizeof("UTF-32LE")]; + char stringpool_str430[sizeof("CSISOLATIN3")]; + char stringpool_str432[sizeof("MACARABIC")]; + char stringpool_str436[sizeof("ISO_8859-3:1988")]; + char stringpool_str437[sizeof("IBM-CP1133")]; + char stringpool_str439[sizeof("TIS620.2529-1")]; + char stringpool_str448[sizeof("CSISO2022KR")]; + char stringpool_str449[sizeof("ISO8859-7")]; + char stringpool_str451[sizeof("MACCENTRALEUROPE")]; + char stringpool_str452[sizeof("ISO-8859-7")]; + char stringpool_str453[sizeof("ISO_8859-7")]; + char stringpool_str455[sizeof("CN-GB-ISOIR165")]; + char stringpool_str461[sizeof("ISO646-JP")]; + char stringpool_str462[sizeof("KS_C_5601-1987")]; + char stringpool_str463[sizeof("US-ASCII")]; + char stringpool_str464[sizeof("UCS-4BE")]; + char stringpool_str466[sizeof("CSEUCKR")]; + char stringpool_str467[sizeof("JIS0208")]; + char stringpool_str470[sizeof("UTF-16BE")]; + char stringpool_str475[sizeof("MS-ARAB")]; + char stringpool_str476[sizeof("CSPC862LATINHEBREW")]; + char stringpool_str478[sizeof("KOI8-T")]; + char stringpool_str481[sizeof("ISO-IR-87")]; + char stringpool_str482[sizeof("UCS-2BE")]; + char stringpool_str489[sizeof("MACROMANIA")]; + char stringpool_str492[sizeof("UCS-4-INTERNAL")]; + char stringpool_str493[sizeof("ISO_646.IRV:1991")]; + char stringpool_str495[sizeof("CSVISCII")]; + char stringpool_str497[sizeof("VISCII1.1-1")]; + char stringpool_str500[sizeof("ISO-IR-57")]; + char stringpool_str502[sizeof("NEXTSTEP")]; + char stringpool_str503[sizeof("HZ-GB-2312")]; + char stringpool_str504[sizeof("CSKSC56011987")]; + char stringpool_str505[sizeof("ISO-IR-157")]; + char stringpool_str507[sizeof("JIS_C6220-1969-RO")]; + char stringpool_str508[sizeof("CSISO58GB231280")]; + char stringpool_str509[sizeof("TIS620.2533-1")]; + char stringpool_str510[sizeof("UCS-2-INTERNAL")]; + char stringpool_str511[sizeof("WINDOWS-1258")]; + char stringpool_str512[sizeof("WINDOWS-1251")]; + char stringpool_str513[sizeof("MACTHAI")]; + char stringpool_str515[sizeof("WCHAR_T")]; + char stringpool_str516[sizeof("GBK")]; + char stringpool_str517[sizeof("ISO-IR-127")]; + char stringpool_str519[sizeof("WINDOWS-1256")]; + char stringpool_str520[sizeof("UNICODE-1-1-UTF-7")]; + char stringpool_str521[sizeof("LATIN7")]; + char stringpool_str523[sizeof("ANSI_X3.4-1968")]; + char stringpool_str524[sizeof("WINDOWS-1254")]; + char stringpool_str525[sizeof("CSUNICODE11UTF7")]; + char stringpool_str530[sizeof("WINDOWS-1255")]; + char stringpool_str531[sizeof("ANSI_X3.4-1986")]; + char stringpool_str532[sizeof("TIS620.2533-0")]; + char stringpool_str533[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; + char stringpool_str535[sizeof("WINDOWS-1250")]; + char stringpool_str536[sizeof("WINDOWS-936")]; + char stringpool_str537[sizeof("EUCTW")]; + char stringpool_str540[sizeof("EUC-TW")]; + char stringpool_str542[sizeof("WINDOWS-1252")]; + char stringpool_str543[sizeof("JIS_C6226-1983")]; + char stringpool_str545[sizeof("UCS-4-SWAPPED")]; + char stringpool_str546[sizeof("UTF-32BE")]; + char stringpool_str547[sizeof("TCVN5712-1")]; + char stringpool_str548[sizeof("ISO_8859-1:1987")]; + char stringpool_str553[sizeof("MACINTOSH")]; + char stringpool_str554[sizeof("ISO-2022-JP-1")]; + char stringpool_str555[sizeof("ISO_8859-6:1987")]; + char stringpool_str556[sizeof("ISO-2022-JP")]; + char stringpool_str560[sizeof("TIS620.2533")]; + char stringpool_str563[sizeof("UCS-2-SWAPPED")]; + char stringpool_str565[sizeof("WINDOWS-1253")]; + char stringpool_str569[sizeof("JAVA")]; + char stringpool_str570[sizeof("CSISO57GB1988")]; + char stringpool_str572[sizeof("TCVN-5712")]; + char stringpool_str578[sizeof("ISO_8859-2:1987")]; + char stringpool_str579[sizeof("CSISO14JISC6220RO")]; + char stringpool_str583[sizeof("CSMACINTOSH")]; + char stringpool_str584[sizeof("ISO-2022-JP-2")]; + char stringpool_str588[sizeof("UTF-7")]; + char stringpool_str589[sizeof("CSPC850MULTILINGUAL")]; + char stringpool_str592[sizeof("GREEK")]; + char stringpool_str593[sizeof("CSISO2022JP")]; + char stringpool_str594[sizeof("CSISOLATINHEBREW")]; + char stringpool_str601[sizeof("ISO_8859-7:2003")]; + char stringpool_str616[sizeof("CSISO159JISX02121990")]; + char stringpool_str619[sizeof("BIGFIVE")]; + char stringpool_str620[sizeof("CSISO2022JP2")]; + char stringpool_str622[sizeof("BIG-FIVE")]; + char stringpool_str636[sizeof("CSISOLATINGREEK")]; + char stringpool_str637[sizeof("HEBREW")]; + char stringpool_str641[sizeof("IBM367")]; + char stringpool_str647[sizeof("CSHALFWIDTHKATAKANA")]; + char stringpool_str650[sizeof("WINDOWS-874")]; + char stringpool_str652[sizeof("UNICODELITTLE")]; + char stringpool_str663[sizeof("BIG5HKSCS")]; + char stringpool_str666[sizeof("BIG5-HKSCS")]; + char stringpool_str667[sizeof("JIS_X0208")]; + char stringpool_str669[sizeof("JIS_X0201")]; + char stringpool_str676[sizeof("WINDOWS-1257")]; + char stringpool_str680[sizeof("KOI8-U")]; + char stringpool_str684[sizeof("KOI8-RU")]; + char stringpool_str691[sizeof("JOHAB")]; + char stringpool_str693[sizeof("JISX0201-1976")]; + char stringpool_str702[sizeof("JIS_X0208-1990")]; + char stringpool_str706[sizeof("JIS_X0212")]; + char stringpool_str710[sizeof("JIS_X0212-1990")]; + char stringpool_str712[sizeof("ISO_8859-7:1987")]; + char stringpool_str713[sizeof("SHIFT-JIS")]; + char stringpool_str714[sizeof("SHIFT_JIS")]; + char stringpool_str732[sizeof("JIS_X0208-1983")]; + char stringpool_str751[sizeof("CSEUCTW")]; + char stringpool_str752[sizeof("MACUKRAINE")]; + char stringpool_str759[sizeof("UNICODEBIG")]; + char stringpool_str769[sizeof("MS-GREEK")]; + char stringpool_str774[sizeof("MACGREEK")]; + char stringpool_str800[sizeof("CSSHIFTJIS")]; + char stringpool_str822[sizeof("JIS_X0212.1990-0")]; + char stringpool_str840[sizeof("CSEUCPKDFMTJAPANESE")]; + char stringpool_str853[sizeof("MACHEBREW")]; + char stringpool_str858[sizeof("MS_KANJI")]; + char stringpool_str859[sizeof("TCVN5712-1:1993")]; + char stringpool_str869[sizeof("WINBALTRIM")]; + char stringpool_str884[sizeof("MS-TURK")]; + char stringpool_str894[sizeof("BIG5-HKSCS:2008")]; + char stringpool_str895[sizeof("BIG5-HKSCS:2001")]; + char stringpool_str901[sizeof("BIG5-HKSCS:1999")]; + char stringpool_str907[sizeof("BIG5-HKSCS:2004")]; + char stringpool_str917[sizeof("CSISO87JISX0208")]; + char stringpool_str953[sizeof("MACTURKISH")]; + char stringpool_str1003[sizeof("KO_KR.JOHAP92")]; + }; +static const struct stringpool_t stringpool_contents = + { + "R8", + "CN", + "L8", + "L1", + "L6", + "L4", + "866", + "C99", + "L5", + "646", + "CHAR", + "CP819", + "L2", + "CP866", + "CP949", + "850", + "5601", + "RK1048", + "EUCCN", + "L10", + "EUC-CN", + "L3", + "CP154", + "PT154", + "862", + "CP1258", + "CP1251", + "CP1131", + "PTCP154", + "CP850", + "CP1361", + "CP862", + "CP1256", + "CP950", + "HZ", + "CP936", + "CP1254", + "CP1255", + "ISO8859-8", + "ISO8859-1", + "ISO-8859-8", + "ISO_8859-8", + "ISO-8859-1", + "ISO_8859-1", + "ISO8859-11", + "CP1250", + "ISO646-CN", + "ISO-8859-11", + "ISO_8859-11", + "ISO8859-9", + "ISO8859-6", + "ISO-8859-9", + "ISO_8859-9", + "ISO-8859-6", + "ISO_8859-6", + "ISO8859-16", + "CP1252", + "ISO_8859-16:2001", + "ISO-8859-16", + "ISO_8859-16", + "ISO8859-4", + "ISO_8859-14:1998", + "CP932", + "ISO-8859-4", + "ISO_8859-4", + "ISO8859-14", + "ISO_8859-15:1998", + "ISO-8859-14", + "ISO_8859-14", + "ISO8859-5", + "ISO-8859-5", + "ISO_8859-5", + "ISO8859-15", + "ISO-IR-6", + "ISO-8859-15", + "ISO_8859-15", + "SJIS", + "ISO-IR-148", + "ISO-IR-58", + "ISO8859-10", + "CYRILLIC", + "ISO-8859-10", + "ISO_8859-10", + "ISO-IR-199", + "ISO-IR-14", + "L7", + "ISO-IR-166", + "ISO8859-2", + "ISO-IR-101", + "ISO-IR-149", + "ISO-8859-2", + "ISO_8859-2", + "MAC", + "CP1253", + "ISO_8859-10:1992", + "ISO-IR-159", + "LATIN8", + "CP1133", + "LATIN1", + "ISO-IR-109", + "ISO-IR-144", + "ANSI-1251", + "CNS11643", + "CSPTCP154", + "ISO-IR-165", + "ISO-IR-126", + "ELOT_928", + "ISO-IR-110", + "LATIN6", + "LATIN-9", + "ROMAN8", + "ISO-IR-138", + "GB_1988-80", + "CP874", + "LATIN4", + "ASCII", + "UHC", + "ISO-2022-CN", + "CHINESE", + "ISO8859-3", + "ISO-IR-100", + "LATIN5", + "ISO-8859-3", + "ISO_8859-3", + "ISO8859-13", + "ISO-IR-226", + "CYRILLIC-ASIAN", + "ISO-8859-13", + "ISO_8859-13", + "US", + "MS-CYRL", + "TIS620", + "LATIN10", + "TIS-620", + "ARABIC", + "ECMA-118", + "EUCKR", + "LATIN2", + "EUC-KR", + "UTF-8", + "KZ-1048", + "CSISO2022CN", + "CSASCII", + "MS936", + "IBM819", + "MULELAO-1", + "X0208", + "X0201", + "GB18030", + "KOREAN", + "IBM866", + "TIS620-0", + "KOI8-R", + "ECMA-114", + "UCS-4", + "UTF-16", + "CSKZ1048", + "KSC_5601", + "CSKOI8R", + "MS-EE", + "GB2312", + "CSUCS4", + "BIG5", + "BIG-5", + "HP-ROMAN8", + "LATIN3", + "KS_C_5601-1989", + "X0212", + "TCVN", + "ISO-CELTIC", + "CSHPROMAN8", + "UCS-2", + "IBM850", + "ISO-IR-203", + "IBM862", + "GB_2312-80", + "CSISOLATIN1", + "ISO-2022-CN-EXT", + "ISO-IR-179", + "CSISOLATINCYRILLIC", + "CSISOLATIN6", + "JP", + "MACICELAND", + "UCS-4LE", + "CSISOLATIN4", + "CSISOLATINARABIC", + "UNICODE-1-1", + "UTF-16LE", + "CSUNICODE11", + "CSISOLATIN5", + "MS-ANSI", + "CSBIG5", + "UCS-2LE", + "CN-BIG5", + "ARMSCII-8", + "ISO-10646-UCS-4", + "UTF-32", + "CSUNICODE", + "ISO_8859-8:1988", + "CSISOLATIN2", + "CN-GB", + "ISO646-US", + "MACROMAN", + "MACCYRILLIC", + "ISO-10646-UCS-2", + "STRK1048-2002", + "ISO_8859-4:1988", + "ISO_8859-9:1989", + "EUCJP", + "EUC-JP", + "ISO_8859-5:1988", + "GREEK8", + "ASMO-708", + "PCK", + "CSIBM866", + "CP1257", + "ISO-2022-KR", + "GEORGIAN-ACADEMY", + "MACCROATIAN", + "CP367", + "GEORGIAN-PS", + "CSGB2312", + "VISCII", + "MS-HEBR", + "UTF-32LE", + "CSISOLATIN3", + "MACARABIC", + "ISO_8859-3:1988", + "IBM-CP1133", + "TIS620.2529-1", + "CSISO2022KR", + "ISO8859-7", + "MACCENTRALEUROPE", + "ISO-8859-7", + "ISO_8859-7", + "CN-GB-ISOIR165", + "ISO646-JP", + "KS_C_5601-1987", + "US-ASCII", + "UCS-4BE", + "CSEUCKR", + "JIS0208", + "UTF-16BE", + "MS-ARAB", + "CSPC862LATINHEBREW", + "KOI8-T", + "ISO-IR-87", + "UCS-2BE", + "MACROMANIA", + "UCS-4-INTERNAL", + "ISO_646.IRV:1991", + "CSVISCII", + "VISCII1.1-1", + "ISO-IR-57", + "NEXTSTEP", + "HZ-GB-2312", + "CSKSC56011987", + "ISO-IR-157", + "JIS_C6220-1969-RO", + "CSISO58GB231280", + "TIS620.2533-1", + "UCS-2-INTERNAL", + "WINDOWS-1258", + "WINDOWS-1251", + "MACTHAI", + "WCHAR_T", + "GBK", + "ISO-IR-127", + "WINDOWS-1256", + "UNICODE-1-1-UTF-7", + "LATIN7", + "ANSI_X3.4-1968", + "WINDOWS-1254", + "CSUNICODE11UTF7", + "WINDOWS-1255", + "ANSI_X3.4-1986", + "TIS620.2533-0", + "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", + "WINDOWS-1250", + "WINDOWS-936", + "EUCTW", + "EUC-TW", + "WINDOWS-1252", + "JIS_C6226-1983", + "UCS-4-SWAPPED", + "UTF-32BE", + "TCVN5712-1", + "ISO_8859-1:1987", + "MACINTOSH", + "ISO-2022-JP-1", + "ISO_8859-6:1987", + "ISO-2022-JP", + "TIS620.2533", + "UCS-2-SWAPPED", + "WINDOWS-1253", + "JAVA", + "CSISO57GB1988", + "TCVN-5712", + "ISO_8859-2:1987", + "CSISO14JISC6220RO", + "CSMACINTOSH", + "ISO-2022-JP-2", + "UTF-7", + "CSPC850MULTILINGUAL", + "GREEK", + "CSISO2022JP", + "CSISOLATINHEBREW", + "ISO_8859-7:2003", + "CSISO159JISX02121990", + "BIGFIVE", + "CSISO2022JP2", + "BIG-FIVE", + "CSISOLATINGREEK", + "HEBREW", + "IBM367", + "CSHALFWIDTHKATAKANA", + "WINDOWS-874", + "UNICODELITTLE", + "BIG5HKSCS", + "BIG5-HKSCS", + "JIS_X0208", + "JIS_X0201", + "WINDOWS-1257", + "KOI8-U", + "KOI8-RU", + "JOHAB", + "JISX0201-1976", + "JIS_X0208-1990", + "JIS_X0212", + "JIS_X0212-1990", + "ISO_8859-7:1987", + "SHIFT-JIS", + "SHIFT_JIS", + "JIS_X0208-1983", + "CSEUCTW", + "MACUKRAINE", + "UNICODEBIG", + "MS-GREEK", + "MACGREEK", + "CSSHIFTJIS", + "JIS_X0212.1990-0", + "CSEUCPKDFMTJAPANESE", + "MACHEBREW", + "MS_KANJI", + "TCVN5712-1:1993", + "WINBALTRIM", + "MS-TURK", + "BIG5-HKSCS:2008", + "BIG5-HKSCS:2001", + "BIG5-HKSCS:1999", + "BIG5-HKSCS:2004", + "CSISO87JISX0208", + "MACTURKISH", + "KO_KR.JOHAP92" + }; +#define stringpool ((const char *) &stringpool_contents) + +static const struct alias aliases[] = + { + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 229 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str8, ei_hp_roman8}, + {-1}, {-1}, {-1}, {-1}, +#line 291 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso646_cn}, +#line 152 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_14}, +#line 61 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 135 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_iso8859_10}, + {-1}, {-1}, {-1}, {-1}, +#line 85 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_iso8859_4}, +#line 209 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_cp866}, + {-1}, +#line 52 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_c99}, + {-1}, {-1}, +#line 127 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_iso8859_9}, + {-1}, {-1}, +#line 23 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_ascii}, + {-1}, +#line 364 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_local_char}, +#line 58 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_iso8859_1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 69 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_iso8859_2}, + {-1}, {-1}, +#line 207 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp866}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 357 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_cp949}, + {-1}, +#line 201 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_cp850}, +#line 356 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str61, ei_euc_kr}, +#line 241 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_rk1048}, + {-1}, +#line 322 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_euc_cn}, + {-1}, +#line 166 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_16}, +#line 321 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_euc_cn}, +#line 77 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_3}, + {-1}, +#line 238 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_pt154}, +#line 236 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str71, ei_pt154}, + {-1}, {-1}, +#line 205 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_cp862}, + {-1}, {-1}, {-1}, {-1}, +#line 197 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_cp1258}, + {-1}, +#line 175 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_cp1251}, + {-1}, {-1}, {-1}, {-1}, +#line 211 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_cp1131}, + {-1}, +#line 237 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_pt154}, + {-1}, {-1}, +#line 199 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_cp850}, + {-1}, +#line 360 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_johab}, +#line 203 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_cp862}, +#line 191 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_cp1256}, + {-1}, {-1}, +#line 346 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_cp950}, +#line 334 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_hz}, + {-1}, +#line 327 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_cp936}, + {-1}, {-1}, {-1}, +#line 185 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_cp1254}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, +#line 188 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_cp1255}, + {-1}, +#line 121 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_8}, + {-1}, +#line 63 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_1}, +#line 115 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_8}, +#line 116 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_8}, +#line 54 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_1}, +#line 55 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_1}, +#line 140 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_11}, +#line 172 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_cp1250}, +#line 289 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso646_cn}, +#line 138 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_11}, +#line 139 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_11}, + {-1}, {-1}, +#line 129 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_iso8859_9}, + {-1}, +#line 103 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso8859_6}, +#line 122 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_iso8859_9}, +#line 123 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_9}, +#line 95 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str138, ei_iso8859_6}, +#line 96 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_iso8859_6}, +#line 167 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str140, ei_iso8859_16}, +#line 179 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_cp1252}, +#line 163 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso8859_16}, +#line 161 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_iso8859_16}, +#line 162 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_iso8859_16}, +#line 87 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_4}, +#line 149 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_iso8859_14}, +#line 315 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_cp932}, +#line 80 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_4}, +#line 81 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_iso8859_4}, +#line 154 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_iso8859_14}, + {-1}, +#line 157 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_iso8859_15}, +#line 147 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_iso8859_14}, +#line 148 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_14}, + {-1}, {-1}, +#line 94 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_iso8859_5}, + {-1}, {-1}, +#line 88 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_iso8859_5}, +#line 89 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso8859_5}, +#line 160 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_15}, +#line 16 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_ascii}, + {-1}, +#line 155 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_15}, +#line 156 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_iso8859_15}, + {-1}, +#line 311 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_sjis}, +#line 125 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_iso8859_9}, +#line 294 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_gb2312}, + {-1}, +#line 137 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_iso8859_10}, + {-1}, +#line 92 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str174, ei_iso8859_5}, +#line 130 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_iso8859_10}, +#line 131 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, +#line 150 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_iso8859_14}, +#line 267 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_iso646_jp}, +#line 145 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso8859_13}, +#line 254 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_tis620}, +#line 71 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_iso8859_2}, +#line 67 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_iso8859_2}, +#line 302 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_ksc5601}, +#line 64 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_2}, +#line 65 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_iso8859_2}, +#line 214 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_mac_roman}, +#line 182 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_cp1253}, +#line 132 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_iso8859_10}, +#line 286 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_jisx0212}, + {-1}, +#line 151 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_14}, +#line 246 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_cp1133}, +#line 60 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_iso8859_1}, +#line 75 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str194, ei_iso8859_3}, +#line 91 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_iso8859_5}, +#line 178 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_cp1251}, + {-1}, +#line 339 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_euc_tw}, + {-1}, {-1}, +#line 240 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_pt154}, +#line 297 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_isoir165}, +#line 108 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_7}, +#line 110 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_7}, +#line 83 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, + {-1}, +#line 134 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_iso8859_10}, +#line 159 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_iso8859_15}, +#line 228 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_hp_roman8}, +#line 118 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_8}, +#line 288 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso646_cn}, + {-1}, {-1}, {-1}, +#line 256 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_cp874}, + {-1}, +#line 84 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_iso8859_4}, + {-1}, +#line 13 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_ascii}, + {-1}, {-1}, +#line 358 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_cp949}, +#line 331 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_iso2022_cn}, + {-1}, +#line 296 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_gb2312}, + {-1}, +#line 79 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_iso8859_3}, +#line 57 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_iso8859_1}, +#line 126 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_iso8859_9}, +#line 72 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_iso8859_3}, +#line 73 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_iso8859_3}, +#line 146 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_13}, +#line 164 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str233, ei_iso8859_16}, +#line 239 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_pt154}, +#line 141 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_iso8859_13}, +#line 142 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_iso8859_13}, + {-1}, {-1}, {-1}, {-1}, +#line 21 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_ascii}, +#line 177 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_cp1251}, +#line 249 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_tis620}, +#line 165 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str244, ei_iso8859_16}, + {-1}, +#line 248 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_tis620}, + {-1}, {-1}, {-1}, +#line 101 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_6}, +#line 109 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_iso8859_7}, +#line 354 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_euc_kr}, +#line 68 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str253, ei_iso8859_2}, + {-1}, +#line 353 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_euc_kr}, + {-1}, {-1}, +#line 24 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_utf8}, +#line 243 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_rk1048}, +#line 332 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso2022_cn}, + {-1}, +#line 22 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_ascii}, +#line 328 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_cp936}, +#line 59 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_1}, + {-1}, +#line 245 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_mulelao}, +#line 278 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_jisx0208}, + {-1}, +#line 272 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str269, ei_jisx0201}, + {-1}, +#line 330 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_gb18030}, +#line 304 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_ksc5601}, +#line 208 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_cp866}, +#line 250 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str274, ei_tis620}, + {-1}, +#line 168 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_koi8_r}, +#line 99 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_iso8859_6}, +#line 34 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_ucs4}, +#line 39 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_utf16}, + {-1}, +#line 244 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_rk1048}, + {-1}, +#line 299 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_ksc5601}, +#line 169 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str284, ei_koi8_r}, + {-1}, {-1}, +#line 174 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_cp1250}, +#line 323 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_euc_cn}, + {-1}, {-1}, +#line 36 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str291, ei_ucs4}, + {-1}, +#line 340 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_ces_big5}, + {-1}, {-1}, +#line 341 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str296, ei_ces_big5}, +#line 227 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str297, ei_hp_roman8}, + {-1}, +#line 76 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_iso8859_3}, + {-1}, {-1}, {-1}, {-1}, +#line 301 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_ksc5601}, + {-1}, +#line 285 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str306, ei_jisx0212}, +#line 261 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_tcvn}, + {-1}, +#line 153 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str309, ei_iso8859_14}, + {-1}, +#line 230 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_hp_roman8}, + {-1}, {-1}, +#line 25 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_ucs2}, + {-1}, +#line 200 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_cp850}, + {-1}, +#line 158 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_iso8859_15}, +#line 204 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_cp862}, +#line 293 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str320, ei_gb2312}, + {-1}, {-1}, {-1}, +#line 62 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_iso8859_1}, + {-1}, {-1}, +#line 333 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_iso2022_cn_ext}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 143 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_iso8859_13}, + {-1}, +#line 93 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_5}, +#line 136 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str338, ei_iso8859_10}, + {-1}, {-1}, {-1}, +#line 268 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso646_jp}, + {-1}, {-1}, {-1}, +#line 217 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str346, ei_mac_iceland}, +#line 38 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_ucs4le}, +#line 86 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str348, ei_iso8859_4}, +#line 102 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str349, ei_iso8859_6}, +#line 30 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_ucs2be}, + {-1}, {-1}, +#line 41 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str353, ei_utf16le}, + {-1}, {-1}, {-1}, +#line 31 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str357, ei_ucs2be}, + {-1}, {-1}, +#line 128 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_iso8859_9}, +#line 181 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str361, ei_cp1252}, + {-1}, {-1}, +#line 345 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_ces_big5}, +#line 32 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str365, ei_ucs2le}, + {-1}, +#line 344 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_ces_big5}, + {-1}, {-1}, {-1}, {-1}, +#line 232 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_armscii_8}, +#line 35 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_ucs4}, + {-1}, {-1}, {-1}, {-1}, +#line 42 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_utf32}, + {-1}, +#line 27 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str380, ei_ucs2}, + {-1}, +#line 117 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str382, ei_iso8859_8}, + {-1}, +#line 70 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso8859_2}, +#line 324 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_euc_cn}, +#line 14 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_ascii}, +#line 212 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_mac_roman}, + {-1}, +#line 220 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_mac_cyrillic}, + {-1}, +#line 26 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_ucs2}, + {-1}, {-1}, +#line 242 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str394, ei_rk1048}, +#line 82 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_iso8859_4}, +#line 124 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_iso8859_9}, +#line 306 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_euc_jp}, + {-1}, {-1}, +#line 305 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str400, ei_euc_jp}, +#line 90 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_iso8859_5}, +#line 111 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_iso8859_7}, +#line 100 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_iso8859_6}, + {-1}, +#line 314 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_sjis}, + {-1}, {-1}, +#line 210 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_cp866}, +#line 194 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_cp1257}, + {-1}, +#line 362 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_iso2022_kr}, +#line 233 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_georgian_academy}, + {-1}, {-1}, +#line 218 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_mac_croatian}, +#line 19 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_ascii}, + {-1}, {-1}, +#line 234 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_georgian_ps}, + {-1}, {-1}, {-1}, +#line 325 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str423, ei_euc_cn}, +#line 258 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str424, ei_viscii}, + {-1}, {-1}, {-1}, +#line 190 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_cp1255}, +#line 44 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_utf32le}, +#line 78 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str430, ei_iso8859_3}, + {-1}, +#line 225 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str432, ei_mac_arabic}, + {-1}, {-1}, {-1}, +#line 74 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str436, ei_iso8859_3}, +#line 247 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_cp1133}, + {-1}, +#line 251 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_tis620}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 363 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso2022_kr}, +#line 114 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_iso8859_7}, + {-1}, +#line 216 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_mac_centraleurope}, +#line 104 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str452, ei_iso8859_7}, +#line 105 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str453, ei_iso8859_7}, + {-1}, +#line 298 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_isoir165}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 266 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_iso646_jp}, +#line 300 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str462, ei_ksc5601}, +#line 12 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str463, ei_ascii}, +#line 37 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_ucs4be}, + {-1}, +#line 355 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_euc_kr}, +#line 277 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_jisx0208}, + {-1}, {-1}, +#line 40 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_utf16be}, + {-1}, {-1}, {-1}, {-1}, +#line 193 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_cp1256}, +#line 206 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_cp862}, + {-1}, +#line 235 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_koi8_t}, + {-1}, {-1}, +#line 279 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_jisx0208}, +#line 28 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str482, ei_ucs2be}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 219 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str489, ei_mac_romania}, + {-1}, {-1}, +#line 50 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_ucs4internal}, +#line 15 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_ascii}, + {-1}, +#line 260 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str495, ei_viscii}, + {-1}, +#line 259 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_viscii}, + {-1}, {-1}, +#line 290 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_iso646_cn}, + {-1}, +#line 231 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str502, ei_nextstep}, +#line 335 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_hz}, +#line 303 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str504, ei_ksc5601}, +#line 133 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_iso8859_10}, + {-1}, +#line 265 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str507, ei_iso646_jp}, +#line 295 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str508, ei_gb2312}, +#line 253 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str509, ei_tis620}, +#line 48 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_ucs2internal}, +#line 198 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_cp1258}, +#line 176 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str512, ei_cp1251}, +#line 226 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_mac_thai}, + {-1}, +#line 365 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_local_wchar_t}, +#line 326 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str516, ei_ces_gbk}, +#line 98 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str517, ei_iso8859_6}, + {-1}, +#line 192 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str519, ei_cp1256}, +#line 46 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str520, ei_utf7}, +#line 144 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_iso8859_13}, + {-1}, +#line 17 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_ascii}, +#line 186 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str524, ei_cp1254}, +#line 47 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_utf7}, + {-1}, {-1}, {-1}, {-1}, +#line 189 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str530, ei_cp1255}, +#line 18 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ascii}, +#line 252 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_tis620}, +#line 307 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str533, ei_euc_jp}, + {-1}, +#line 173 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str535, ei_cp1250}, +#line 329 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str536, ei_cp936}, +#line 337 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str537, ei_euc_tw}, + {-1}, {-1}, +#line 336 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str540, ei_euc_tw}, + {-1}, +#line 180 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_cp1252}, +#line 280 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_jisx0208}, + {-1}, +#line 51 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str545, ei_ucs4swapped}, +#line 43 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_utf32be}, +#line 263 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str547, ei_tcvn}, +#line 56 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str548, ei_iso8859_1}, + {-1}, {-1}, {-1}, {-1}, +#line 213 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str553, ei_mac_roman}, +#line 318 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_iso2022_jp1}, +#line 97 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str555, ei_iso8859_6}, +#line 316 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_iso2022_jp}, + {-1}, {-1}, {-1}, +#line 255 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str560, ei_tis620}, + {-1}, {-1}, +#line 49 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_ucs2swapped}, + {-1}, +#line 183 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str565, ei_cp1253}, + {-1}, {-1}, {-1}, +#line 53 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_java}, +#line 292 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str570, ei_iso646_cn}, + {-1}, +#line 262 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_tcvn}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 66 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str578, ei_iso8859_2}, +#line 269 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_iso646_jp}, + {-1}, {-1}, {-1}, +#line 215 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_mac_roman}, +#line 319 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_iso2022_jp2}, + {-1}, {-1}, {-1}, +#line 45 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str588, ei_utf7}, +#line 202 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str589, ei_cp850}, + {-1}, {-1}, +#line 112 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str592, ei_iso8859_7}, +#line 317 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str593, ei_iso2022_jp}, +#line 120 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str594, ei_iso8859_8}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 107 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str601, ei_iso8859_7}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 287 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str616, ei_jisx0212}, + {-1}, {-1}, +#line 343 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str619, ei_ces_big5}, +#line 320 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str620, ei_iso2022_jp2}, + {-1}, +#line 342 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_ces_big5}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 113 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str636, ei_iso8859_7}, +#line 119 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str637, ei_iso8859_8}, + {-1}, {-1}, {-1}, +#line 20 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str641, ei_ascii}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 273 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str647, ei_jisx0201}, + {-1}, {-1}, +#line 257 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str650, ei_cp874}, + {-1}, +#line 33 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_ucs2le}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, +#line 351 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str663, ei_big5hkscs2008}, + {-1}, {-1}, +#line 350 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str666, ei_big5hkscs2008}, +#line 274 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str667, ei_jisx0208}, + {-1}, +#line 270 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 195 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str676, ei_cp1257}, + {-1}, {-1}, {-1}, +#line 170 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str680, ei_koi8_u}, + {-1}, {-1}, {-1}, +#line 171 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str684, ei_koi8_ru}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 359 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str691, ei_johab}, + {-1}, +#line 271 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str693, ei_jisx0201}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 276 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_jisx0208}, + {-1}, {-1}, {-1}, +#line 282 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str706, ei_jisx0212}, + {-1}, {-1}, {-1}, +#line 284 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str710, ei_jisx0212}, + {-1}, +#line 106 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str712, ei_iso8859_7}, +#line 310 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str713, ei_sjis}, +#line 309 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str714, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 275 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str732, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 338 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str751, ei_euc_tw}, +#line 221 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str752, ei_mac_ukraine}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 29 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str759, ei_ucs2be}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 184 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str769, ei_cp1253}, + {-1}, {-1}, {-1}, {-1}, +#line 222 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str774, ei_mac_greek}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 313 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str800, ei_sjis}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 283 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str822, ei_jisx0212}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 308 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str840, ei_euc_jp}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, +#line 224 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str853, ei_mac_hebrew}, + {-1}, {-1}, {-1}, {-1}, +#line 312 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str858, ei_sjis}, +#line 264 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str859, ei_tcvn}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 196 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str869, ei_cp1257}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 187 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str884, ei_cp1254}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 352 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str894, ei_big5hkscs2008}, +#line 348 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str895, ei_big5hkscs2001}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 347 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str901, ei_big5hkscs1999}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 349 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str907, ei_big5hkscs2004}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 281 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str917, ei_jisx0208}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 223 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str953, ei_mac_turkish}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 361 "lib/aliases_syssolaris.gperf" + {(int)(long)&((struct stringpool_t *)0)->stringpool_str1003, ei_johab} + }; + +#ifdef __GNUC__ +__inline +#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#endif +const struct alias * +aliases_lookup (register const char *str, register unsigned int len) +{ + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = aliases_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = aliases[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &aliases[key]; + } + } + } + return 0; +} diff --git a/Externals/libiconv-1.14/lib/armscii_8.h b/Externals/libiconv-1.14/lib/armscii_8.h new file mode 100644 index 0000000000..8d1613ff98 --- /dev/null +++ b/Externals/libiconv-1.14/lib/armscii_8.h @@ -0,0 +1,116 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ARMSCII-8 + */ + +static const unsigned short armscii_8_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0xfffd, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, + 0x2014, 0x002e, 0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c, + /* 0xb0 */ + 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, + 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, + /* 0xc0 */ + 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, + 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, + /* 0xd0 */ + 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, + 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, + /* 0xe0 */ + 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, + 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, + /* 0xf0 */ + 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, + 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0xfffd, +}; + +static int +armscii_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = armscii_8_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char armscii_8_page00[8] = { + 0xa5, 0xa4, 0x2a, 0x2b, 0xab, 0xac, 0xa9, 0x2f, /* 0x28-0x2f */ +}; +static const unsigned char armscii_8_page00_1[32] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char armscii_8_page05[96] = { + 0x00, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 0x30-0x37 */ + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, /* 0x38-0x3f */ + 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 0x40-0x47 */ + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, /* 0x48-0x4f */ + 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0xfe, 0xb0, 0xaf, 0xaa, 0xb1, 0x00, /* 0x58-0x5f */ + 0x00, 0xb3, 0xb5, 0xb7, 0xb9, 0xbb, 0xbd, 0xbf, /* 0x60-0x67 */ + 0xc1, 0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf, /* 0x68-0x6f */ + 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, /* 0x70-0x77 */ + 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, /* 0x78-0x7f */ + 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xa2, /* 0x80-0x87 */ + 0x00, 0xa3, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ +}; +static const unsigned char armscii_8_page20[24] = { + 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x20-0x27 */ +}; + +static int +armscii_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0028) { + *r = wc; + return 1; + } + else if (wc >= 0x0028 && wc < 0x0030) + c = armscii_8_page00[wc-0x0028]; + else if (wc >= 0x0030 && wc < 0x00a0) + c = wc; + else if (wc >= 0x00a0 && wc < 0x00c0) + c = armscii_8_page00_1[wc-0x00a0]; + else if (wc >= 0x0530 && wc < 0x0590) + c = armscii_8_page05[wc-0x0530]; + else if (wc >= 0x2010 && wc < 0x2028) + c = armscii_8_page20[wc-0x2010]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ascii.h b/Externals/libiconv-1.14/lib/ascii.h new file mode 100644 index 0000000000..fa49e3bf94 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ascii.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ASCII + */ + +static int +ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + return RET_ILSEQ; +} + +static int +ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0080) { + *r = wc; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/atarist.h b/Externals/libiconv-1.14/lib/atarist.h new file mode 100644 index 0000000000..90f18cc147 --- /dev/null +++ b/Externals/libiconv-1.14/lib/atarist.h @@ -0,0 +1,158 @@ +/* + * Copyright (C) 1999-2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * Atari ST + */ + +static const unsigned short atarist_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x00df, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x00e3, 0x00f5, 0x00d8, 0x00f8, 0x0153, 0x0152, 0x00c0, 0x00c3, + 0x00d5, 0x00a8, 0x00b4, 0x2020, 0x00b6, 0x00a9, 0x00ae, 0x2122, + /* 0xc0 */ + 0x0133, 0x0132, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, + 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05db, 0x05dc, 0x05de, 0x05e0, + /* 0xd0 */ + 0x05e1, 0x05e2, 0x05e4, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, + 0x05df, 0x05da, 0x05dd, 0x05e3, 0x05e5, 0x00a7, 0x2227, 0x221e, + /* 0xe0 */ + 0x03b1, 0x03b2, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x222e, 0x03c6, 0x2208, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x00b3, 0x00af, +}; + +static int +atarist_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) atarist_2uni[c-0x80]; + return 1; +} + +static const unsigned char atarist_page00[96] = { + 0x00, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0xdd, /* 0xa0-0xa7 */ + 0xb9, 0xbd, 0xa6, 0xae, 0xaa, 0x00, 0xbe, 0xff, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xfe, 0xba, 0xe6, 0xbc, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0xb6, 0x00, 0x00, 0xb7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0xa5, 0x00, 0x00, 0x00, 0xb8, 0x99, 0x00, /* 0xd0-0xd7 */ + 0xb2, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x9e, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0xb0, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0xb1, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0xb3, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ +}; +static const unsigned char atarist_page01[104] = { + 0x00, 0x00, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xb5, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char atarist_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0xe1, 0x00, 0xeb, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char atarist_page05[32] = { + 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, /* 0xd0-0xd7 */ + 0xca, 0xcb, 0xd9, 0xcc, 0xcd, 0xda, 0xce, 0xd8, /* 0xd8-0xdf */ + 0xcf, 0xd0, 0xd1, 0xdb, 0xd2, 0xdc, 0xd3, 0xd4, /* 0xe0-0xe7 */ + 0xd5, 0xd6, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char atarist_page22[96] = { + 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xdf, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char atarist_page23[24] = { + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; + +static int +atarist_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = atarist_page00[wc-0x00a0]; + else if (wc >= 0x0130 && wc < 0x0198) + c = atarist_page01[wc-0x0130]; + else if (wc >= 0x0390 && wc < 0x03c8) + c = atarist_page03[wc-0x0390]; + else if (wc >= 0x05d0 && wc < 0x05f0) + c = atarist_page05[wc-0x05d0]; + else if (wc == 0x2020) + c = 0xbb; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x2122) + c = 0xbf; + else if (wc >= 0x2208 && wc < 0x2268) + c = atarist_page22[wc-0x2208]; + else if (wc >= 0x2310 && wc < 0x2328) + c = atarist_page23[wc-0x2310]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/big5.h b/Externals/libiconv-1.14/lib/big5.h new file mode 100644 index 0000000000..de10a99ae9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5.h @@ -0,0 +1,4160 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5 + */ + +static const unsigned short big5_2uni_pagea1[6121] = { + /* 0xa1 */ + 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, + 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, + 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, + 0x2014, 0xfe33, 0xfffd, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, + 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, + 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, + 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, + 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, + 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, + 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, + 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, + 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, + 0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, + 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, + 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, + 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, + 0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, + 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, + 0x2199, 0x2198, 0x2225, 0x2223, 0xfffd, + /* 0xa2 */ + 0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, + 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, + 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, + 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, + 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, + 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, + 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, + 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, + 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, + 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, + 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, + 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, 0xff21, 0xff22, 0xff23, + 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, + 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, + 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, + 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, + 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, + 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, + /* 0xa3 */ + 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, + 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, + 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, + 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, + 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, + 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, + 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, + 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, + 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, + 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, + 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, + 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa4 */ + 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, + 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, + 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, + 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, + 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, + 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, + 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, + 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, + 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, + 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, + 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, + 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, + 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, + 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, + 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, + 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, + 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, + 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, + 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, + 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, + /* 0xa5 */ + 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, + 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, + 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, + 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, + 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, + 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, + 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, + 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e, + 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, + 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, + 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, + 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, + 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, + 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, + 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, + 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, + 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, + 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, + 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, + 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, + /* 0xa6 */ + 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, + 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, + 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, + 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, + 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, + 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, + 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, + 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f, + 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, + 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, + 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, + 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, + 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, + 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, + 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, + 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, + 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, + 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, + 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, + 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, + /* 0xa7 */ + 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, + 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, + 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, + 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, + 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, + 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, + 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, + 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747, + 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, + 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, + 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, + 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, + 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, + 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, + 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, + 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, + 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, + 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, + 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, + 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, + /* 0xa8 */ + 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, + 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, + 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, + 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, + 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, + 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, + 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, + 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b, + 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, + 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, + 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, + 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, + 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, + 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, + 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, + 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, + 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, + 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, + 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, + 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, + /* 0xa9 */ + 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, + 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, + 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, + 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, + 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46, + 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, + 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, + 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, + 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, + 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, + 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, + 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, + 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, + 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, + 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, + 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, + 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, + /* 0xaa */ + 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, + 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, + 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, + 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, + 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, + 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, + 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, + 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095, + 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, + 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, + 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, + 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, + 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, + 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, + 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, + 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, + 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, + 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, + 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, + 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, + /* 0xab */ + 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, + 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, + 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, + 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, + 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, + 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, + 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, + 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4, + 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, + 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, + 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, + 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, + 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, + 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, + 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, + 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, + 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, + 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, + 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, + 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, + /* 0xac */ + 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, + 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, + 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, + 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, + 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, + 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, + 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, + 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, + 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, + 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, + 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, + 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, + 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, + 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, + 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, + 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, + 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, + 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, + 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, + 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, + /* 0xad */ + 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, + 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, + 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, + 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, + 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, + 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, + 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, + 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed, + 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, + 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, + 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, + 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, + 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, + 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, + 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, + 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, + 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, + 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, + 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, + 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, + /* 0xae */ + 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, + 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, + 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, + 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, + 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, + 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, + 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, + 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063, + 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, + 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, + 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, + 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, + 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, + 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, + 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, + 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, + 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, + 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, + 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, + 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, + /* 0xaf */ + 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, + 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, + 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, + 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, + 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, + 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, + 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, + 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825, + 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, + 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, + 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, + 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, + 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, + 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, + 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, + 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, + 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, + 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, + 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, + 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, + /* 0xb0 */ + 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, + 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, + 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, + 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, + 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, + 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, + 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, + 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b, + 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, + 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, + 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, + 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, + 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, + 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, + 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, + 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, + 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, + 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, + 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, + 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, + /* 0xb1 */ + 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, + 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, + 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, + 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, + 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, + 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, + 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, + 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, + 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, + 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, + 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, + 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, + 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, + 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, + 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, + 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, + 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, + 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, + 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, + 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, + /* 0xb2 */ + 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, + 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, + 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, + 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, + 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, + 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, + 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, + 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, + 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, + 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, + 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, + 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, + 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, + 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, + 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, + 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, + 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, + 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, + 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, + 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, + /* 0xb3 */ + 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, + 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, + 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, + 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, + 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, + 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, + 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, + 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, + 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, + 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, + 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, + 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, + 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, + 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, + 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, + 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, + 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, + 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, + 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, + 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, + /* 0xb4 */ + 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, + 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, + 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, + 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, + 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, + 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, + 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, + 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, + 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, + 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, + 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, + 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, + 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, + 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, + 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, + 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, + 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, + 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, + 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, + 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, + /* 0xb5 */ + 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, + 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, + 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, + 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, + 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, + 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, + 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, + 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, + 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, + 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, + 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, + 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, + 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, + 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, + 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, + 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, + 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, + 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, + 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, + 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, + /* 0xb6 */ + 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, + 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, + 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, + 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, + 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, + 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, + 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, + 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, + 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, + 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, + 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, + 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, + 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, + 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, + 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, + 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, + 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, + 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, + 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, + 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, + /* 0xb7 */ + 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, + 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, + 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, + 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, + 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, + 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, + 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, + 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, + 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, + 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, + 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, + 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, + 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, + 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, + 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, + 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, + 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, + 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, + 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, + 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, + /* 0xb8 */ + 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, + 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, + 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, + 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, + 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, + 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, + 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, + 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, + 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, + 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, + 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, + 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, + 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, + 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, + 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, + 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, + 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, + 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, + 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, + 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, + /* 0xb9 */ + 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, + 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, + 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, + 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, + 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, + 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, + 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, + 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, + 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, + 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, + 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, + 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, + 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, + 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, + 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, + 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, + 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, + /* 0xba */ + 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, + 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, + 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, + 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, + 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, + 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, + 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, + 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, + 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, + 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, + 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, + 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, + 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, + 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, + 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, + 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, + 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, + 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, + 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, + 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, + /* 0xbb */ + 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, + 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, + 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, + 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, + 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, + 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, + 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, + 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa, + 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, + 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, + 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, + 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, + 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, + 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, + 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, + 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, + 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, + 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, + 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, + 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, + /* 0xbc */ + 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, + 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, + 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, + 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, + 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, + 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, + 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, + 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c, + 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, + 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, + 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, + 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, + 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, + 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, + 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, + 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, + 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, + 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, + 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, + 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, + /* 0xbd */ + 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, + 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, + 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, + 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, + 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, + 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, + 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9, + 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, + 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, + 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, + 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, + 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, + 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, + 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, + 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, + 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, + 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, + 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, + 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, + /* 0xbe */ + 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, + 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, + 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, + 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, + 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, + 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, + 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, + 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03, + 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, + 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, + 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, + 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, + 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, + 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, + 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, + 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, + 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, + 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, + 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, + 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, + /* 0xbf */ + 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, + 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, + 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, + 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, + 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, + 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, + 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, + 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11, + 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, + 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, + 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, + 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, + 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, + 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, + 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, + 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, + 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, + 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, + 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, + 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, + /* 0xc0 */ + 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, + 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, + 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, + 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, + 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, + 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, + 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, + 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f, + 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, + 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, + 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, + 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, + 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, + 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, + 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, + 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, + 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, + 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, + 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, + 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, + /* 0xc1 */ + 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, + 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, + 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, + 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, + 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, + 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, + 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, + 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, + 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, + 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, + 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, + 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, + 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, + 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, + 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, + 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, + 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, + 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, + 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, + 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, + /* 0xc2 */ + 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, + 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, + 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, + 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, + 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, + 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, + 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, + 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652, + 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, + 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, + 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, + 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, + 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, + 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, + 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, + 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, + 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, + 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, + 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, + 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, + /* 0xc3 */ + 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, + 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, + 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, + 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, + 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, + 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, + 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, + 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a, + 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, + 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, + 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, + 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, + 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, + 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, + 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, + 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, + 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, + 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, + 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, + 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, + /* 0xc4 */ + 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, + 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, + 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, + 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, + 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, + 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, + 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, + 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, + 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, + 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, + 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, + 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, + 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, + 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, + 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, + 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, + 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, + 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, + 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, + 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, + /* 0xc5 */ + 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, + 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, + 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, + 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, + 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, + 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, + 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, + 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3, + 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, + 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, + 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, + 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, + 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, + 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, + 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, + 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, + 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, + 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, + 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, + 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, + /* 0xc6 */ + 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, + 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, + 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, + 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, + 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, + 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, + 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, + 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x30fe, + 0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, + 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, + 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, + 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, + 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, + 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, + 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, + 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, + 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, + 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, + 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, + 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, + /* 0xc7 */ + 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, + 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, + 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, + 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, + 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, + 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, + 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, + 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, + 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, + 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0414, + 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, + 0x041c, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, + 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, + 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, + 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, + 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, + 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2460, + 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, + 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, + 0x247b, 0x247c, 0x247d, +}; +static const unsigned short big5_2uni_pagec9[7652] = { + /* 0xc9 */ + 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, + 0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, + 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, + 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, + 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, + 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, + 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, + 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, + 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, + 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, + 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, + 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, + 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, + 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, + 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, + 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, + 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, + 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, + 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, + 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, + /* 0xca */ + 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, + 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, + 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, + 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, + 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, + 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, + 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, + 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d, + 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, + 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, + 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, + 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, + 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, + 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, + 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, + 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, + 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, + 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, + 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, + 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, + /* 0xcb */ + 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, + 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, + 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, + 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, + 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, + 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, + 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, + 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a, + 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, + 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, + 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, + 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, + 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, + 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, + 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, + 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, + 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, + 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, + 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, + 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, + /* 0xcc */ + 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, + 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, + 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, + 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, + 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, + 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, + 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, + 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, + 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, + 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, + 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, + 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, + 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, + 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, + 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, + 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, + 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, + 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, + 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, + 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, + /* 0xcd */ + 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, + 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, + 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, + 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, + 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, + 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, + 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, + 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7, + 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, + 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, + 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, + 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, + 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, + 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, + 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, + 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, + 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, + 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, + 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, + 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, + /* 0xce */ + 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, + 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, + 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, + 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, + 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, + 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, + 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, + 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde, + 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, + 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, + 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, + 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, + 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, + 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, + 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, + 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, + 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, + 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, + 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, + 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, + /* 0xcf */ + 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, + 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, + 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, + 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, + 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, + 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, + 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, + 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01, + 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, + 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, + 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, + 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, + 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, + 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, + 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, + 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, + 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, + 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, + 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, + 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, + /* 0xd0 */ + 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, + 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, + 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, + 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, + 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, + 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, + 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, + 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4, + 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, + 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, + 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, + 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, + 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, + 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, + 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, + 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, + 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, + 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, + 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, + 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, + /* 0xd1 */ + 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, + 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, + 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, + 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, + 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, + 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, + 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, + 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041, + 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, + 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, + 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, + 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, + 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, + 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, + 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, + 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, + 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, + 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, + 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, + 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, + /* 0xd2 */ + 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, + 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, + 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, + 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, + 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, + 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, + 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, + 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277, + 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, + 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, + 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, + 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, + 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, + 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, + 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, + 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, + 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, + 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, + 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, + 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, + /* 0xd3 */ + 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, + 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, + 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, + 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, + 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, + 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, + 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, + 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342, + 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, + 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, + 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, + 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, + 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, + 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, + 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, + 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, + 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, + 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, + 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, + 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, + /* 0xd4 */ + 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, + 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, + 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, + 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, + 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, + 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, + 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, + 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c, + 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, + 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, + 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, + 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, + 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, + 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, + 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, + 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, + 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, + 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, + 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, + 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, + /* 0xd5 */ + 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, + 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, + 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, + 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, + 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, + 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, + 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, + 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378, + 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, + 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, + 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, + 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, + 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, + 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, + 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, + 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, + 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, + 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, + 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, + 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, + /* 0xd6 */ + 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, + 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, + 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, + 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, + 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, + 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, + 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, + 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb, + 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, + 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, + 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, + 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, + 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, + 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, + 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, + 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, + 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, + 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, + 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, + 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, + /* 0xd7 */ + 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, + 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, + 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, + 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, + 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, + 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, + 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, + 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2, + 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, + 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, + 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, + 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, + 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, + 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, + 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, + 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, + 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, + 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, + 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, + 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, + /* 0xd8 */ + 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, + 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, + 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, + 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, + 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, + 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, + 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, + 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819, + 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, + 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, + 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, + 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, + 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, + 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, + 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, + 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, + 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, + 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, + 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, + 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, + /* 0xd9 */ + 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, + 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, + 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, + 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, + 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, + 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, + 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, + 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c, + 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, + 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, + 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, + 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, + 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, + 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, + 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, + 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, + 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, + 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, + 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, + 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, + /* 0xda */ + 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, + 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, + 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, + 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, + 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, + 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, + 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, + 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, + 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, + 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, + 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, + 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, + 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, + 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, + 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, + 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, + 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, + 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, + 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, + 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, + /* 0xdb */ + 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, + 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, + 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, + 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, + 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, + 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, + 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, + 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5, + 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, + 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, + 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, + 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, + 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, + 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, + 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, + 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, + 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, + 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, + 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, + 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, + /* 0xdc */ + 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, + 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, + 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, + 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, + 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, + 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, + 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, + 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, + 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, + 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, + 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, + 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, + 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, + 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, + 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, + 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, + 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, + 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, + 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, + 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, + /* 0xdd */ + 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, + 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, + 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, + 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, + 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, + 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, + 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, + 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, + 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, + 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, + 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, + 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, + 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, + 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, + 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, + 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, + 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, + 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, + 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, + 0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc, + /* 0xde */ + 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, + 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, + 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, + 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, + 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, + 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, + 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, + 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, + 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, + 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, + 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, + 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, + 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, + 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, + 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, + 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, + 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, + 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, + 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, + 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, + /* 0xdf */ + 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, + 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, + 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, + 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, + 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, + 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, + 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, + 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, + 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, + 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, + 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, + 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, + 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, + 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, + 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, + 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, + 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, + 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, + 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, + 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, + /* 0xe0 */ + 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, + 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, + 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, + 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, + 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, + 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, + 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, + 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, + 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, + 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, + 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, + 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, + 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, + 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, + 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, + 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, + 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, + 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, + 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, + 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, + /* 0xe1 */ + 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, + 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, + 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, + 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, + 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, + 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, + 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, + 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, + 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, + 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, + 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, + 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, + 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, + 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, + 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, + 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, + 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, + 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, + 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, + /* 0xe2 */ + 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, + 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, + 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, + 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, + 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, + 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, + 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, + 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, + 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, + 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, + 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, + 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, + 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, + 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, + 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, + 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, + 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, + 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, + 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, + 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, + /* 0xe3 */ + 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, + 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, + 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, + 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, + 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, + 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, + 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, + 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, + 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, + 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, + 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, + 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, + 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, + 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, + 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, + 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, + 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, + 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, + 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, + 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, + /* 0xe4 */ + 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, + 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, + 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, + 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, + 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, + 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, + 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, + 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, + 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, + 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, + 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, + 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, + 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, + 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, + 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, + 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, + 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, + 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, + 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, + 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, + /* 0xe5 */ + 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, + 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, + 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, + 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, + 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, + 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, + 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, + 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, + 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, + 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, + 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, + 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, + 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, + 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, + 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, + 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, + 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, + 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, + 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, + 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, + /* 0xe6 */ + 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, + 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, + 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, + 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, + 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, + 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, + 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, + 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362, + 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, + 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, + 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, + 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, + 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, + 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, + 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, + 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, + 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, + 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, + 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, + 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, + /* 0xe7 */ + 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, + 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, + 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, + 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, + 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, + 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, + 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, + 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, + 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, + 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, + 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, + 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, + 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, + 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, + 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, + 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, + 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, + 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, + 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, + 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, + /* 0xe8 */ + 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, + 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, + 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, + 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, + 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, + 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, + 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, + 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5, + 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, + 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, + 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, + 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, + 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, + 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, + 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, + 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, + 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, + 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, + 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, + 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, + /* 0xe9 */ + 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, + 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, + 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, + 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, + 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, + 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, + 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, + 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf, + 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, + 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, + 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, + 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, + 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, + 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, + 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, + 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, + 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, + 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, + 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, + 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, + /* 0xea */ + 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, + 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, + 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, + 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, + 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, + 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, + 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, + 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797, + 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, + 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, + 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, + 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, + 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, + 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, + 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, + 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, + 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, + 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, + 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, + 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, + /* 0xeb */ + 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, + 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, + 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, + 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, + 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, + 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, + 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, + 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, + 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, + 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, + 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, + 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, + 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, + 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, + 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, + 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, + 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, + 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, + 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, + 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, + /* 0xec */ + 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, + 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, + 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, + 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, + 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, + 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, + 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, + 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, + 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, + 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, + 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, + 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, + 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, + 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, + 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, + 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, + 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, + 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, + 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, + 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, + /* 0xed */ + 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, + 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, + 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, + 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, + 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, + 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, + 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, + 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4, + 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, + 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, + 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, + 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, + 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, + 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, + 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, + 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, + 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, + 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, + 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, + 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, + /* 0xee */ + 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, + 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, + 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, + 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, + 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, + 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, + 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, + 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, + 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, + 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, + 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, + 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, + 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, + 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, + 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, + 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, + 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, + 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, + 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, + 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, + /* 0xef */ + 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, + 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, + 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, + 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, + 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, + 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, + 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, + 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, + 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, + 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, + 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, + 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, + 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, + 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, + 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, + 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, + 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, + 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, + 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, + 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, + /* 0xf0 */ + 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, + 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, + 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, + 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, + 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, + 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, + 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, + 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0, + 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, + 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, + 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, + 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, + 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, + 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, + 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, + 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, + 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, + 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, + 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, + 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, + /* 0xf1 */ + 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, + 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, + 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, + 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, + 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, + 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, + 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, + 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2, + 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, + 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, + 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, + 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, + 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, + 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, + 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, + 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, + 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, + 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, + 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, + 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, + /* 0xf2 */ + 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, + 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, + 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, + 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, + 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, + 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, + 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, + 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921, + 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, + 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, + 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, + 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, + 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, + 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, + 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, + 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, + 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, + 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, + 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, + 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, + /* 0xf3 */ + 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, + 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, + 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, + 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, + 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, + 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, + 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, + 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, + 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, + 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, + 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, + 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, + 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, + 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, + 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, + 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, + 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, + 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, + 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, + 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, + /* 0xf4 */ + 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, + 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, + 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, + 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, + 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, + 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, + 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, + 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, + 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, + 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, + 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, + 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, + 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, + 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, + 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, + 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, + 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, + 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, + 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, + 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, + /* 0xf5 */ + 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, + 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, + 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, + 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, + 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, + 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, + 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, + 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, + 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, + 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, + 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, + 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, + 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, + 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, + 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, + 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, + 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, + 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, + 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, + 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, + /* 0xf6 */ + 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, + 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, + 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, + 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, + 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, + 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, + 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, + 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, + 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, + 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, + 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, + 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, + 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, + 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, + 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, + 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, + 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, + 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, + 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, + 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, + /* 0xf7 */ + 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, + 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, + 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, + 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, + 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, + 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, + 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, + 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, + 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, + 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, + 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, + 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, + 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, + 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, + 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, + 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, + 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, + 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, + 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, + 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, + /* 0xf8 */ + 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, + 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, + 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, + 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, + 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, + 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, + 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, + 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, + 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, + 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, + 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, + 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, + 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, + 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, + 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, + 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, + 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, + 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, + 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, + 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, + /* 0xf9 */ + 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, + 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, + 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, + 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, + 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, + 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, + 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, + 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, + 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, + 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, + 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, + 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, + 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, + 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, +}; + +static int +big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + unsigned short wc = 0xfffd; + if (i < 6280) { + if (i < 6121) + wc = big5_2uni_pagea1[i]; + } else { + if (i < 13932) + wc = big5_2uni_pagec9[i-6280]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short big5_2charset[13703] = { + 0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1, + 0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345, + 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, + 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, + 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, + 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, + 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, + 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1, + 0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, + 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, + 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, + 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, + 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, + 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, + 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158, + 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac, + 0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba, + 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, + 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa, + 0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5, + 0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd, + 0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, + 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, + 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, + 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274, + 0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e, + 0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263, + 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, + 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd, + 0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, + 0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, + 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2, + 0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, + 0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa, + 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, + 0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, + 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, + 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, + 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, + 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, + 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, + 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, + 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, + 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, + 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, + 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9, + 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, + 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, + 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, + 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, + 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, + 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, + 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, + 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, + 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, + 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, + 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376, + 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, + 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, + 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, + 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, + 0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, + 0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442, + 0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, + 0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, + 0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5, + 0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940, + 0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546, + 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e, + 0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2, + 0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac, + 0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460, + 0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46, + 0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952, + 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6, + 0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, + 0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, + 0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, + 0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5, + 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab, + 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac, + 0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67, + 0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, + 0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd, + 0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, + 0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, + 0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, + 0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, + 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, + 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, + 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2, + 0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, + 0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56, + 0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec, + 0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, + 0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57, + 0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, + 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef, + 0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5, + 0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc, + 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, + 0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, + 0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, + 0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, + 0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463, + 0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459, + 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba, + 0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450, + 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d, + 0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc, + 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857, + 0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d, + 0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, + 0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd, + 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb, + 0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc, + 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, + 0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2, + 0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, + 0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, + 0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, + 0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, + 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa, + 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7, + 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9, + 0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f, + 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, + 0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc, + 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df, + 0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, + 0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, + 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3, + 0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a, + 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd, + 0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc, + 0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3, + 0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468, + 0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a, + 0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, + 0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be, + 0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647, + 0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753, + 0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0, + 0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0, + 0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, + 0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9, + 0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, + 0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, + 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, + 0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, + 0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f, + 0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757, + 0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, + 0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d, + 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5, + 0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, + 0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956, + 0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, + 0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, + 0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, + 0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa, + 0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, + 0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, + 0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452, + 0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566, + 0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, + 0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75, + 0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470, + 0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd, + 0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce, + 0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb, + 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, + 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, + 0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655, + 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, + 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767, + 0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f, + 0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, + 0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a, + 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763, + 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79, + 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, + 0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd, + 0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949, + 0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948, + 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde, + 0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b, + 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, + 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42, + 0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73, + 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2, + 0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1, + 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb, + 0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7, + 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd, + 0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145, + 0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0, + 0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db, + 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5, + 0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, + 0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, + 0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2, + 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471, + 0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, + 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db, + 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d, + 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7, + 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867, + 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5, + 0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, + 0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, + 0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, + 0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4, + 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4, + 0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2, + 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb, + 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f, + 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca, + 0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a, + 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48, + 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd, + 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe, + 0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba, + 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, + 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946, + 0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, + 0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1, + 0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb, + 0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, + 0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457, + 0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8, + 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1, + 0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7, + 0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7, + 0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45, + 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, + 0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947, + 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9, + 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6, + 0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae, + 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959, + 0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, + 0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, + 0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac, + 0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, + 0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae, + 0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e, + 0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155, + 0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, + 0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, + 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be, + 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2, + 0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed, + 0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, + 0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, + 0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d, + 0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b, + 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3, + 0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, + 0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee, + 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0, + 0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d, + 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, + 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160, + 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161, + 0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, + 0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550, + 0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1, + 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b, + 0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, + 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363, + 0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, + 0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a, + 0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469, + 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db, + 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, + 0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961, + 0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7, + 0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd, + 0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, + 0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1, + 0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, + 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6, + 0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae, + 0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, + 0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970, + 0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, + 0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52, + 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968, + 0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8, + 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1, + 0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d, + 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a, + 0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162, + 0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51, + 0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a, + 0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3, + 0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, + 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6, + 0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142, + 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db, + 0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8, + 0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6, + 0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443, + 0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf, + 0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf, + 0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, + 0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, + 0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3, + 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2, + 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, + 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b, + 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555, + 0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554, + 0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60, + 0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952, + 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8, + 0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6, + 0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, + 0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc, + 0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, + 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55, + 0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145, + 0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, + 0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675, + 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58, + 0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5, + 0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63, + 0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a, + 0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5, + 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a, + 0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8, + 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66, + 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9, + 0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e, + 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, + 0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471, + 0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, + 0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf, + 0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce, + 0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69, + 0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2, + 0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8, + 0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8, + 0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, + 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, + 0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, + 0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, + 0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, + 0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, + 0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c, + 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e, + 0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170, + 0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, + 0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541, + 0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4, + 0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d, + 0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, + 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6, + 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb, + 0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, + 0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743, + 0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7, + 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1, + 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567, + 0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, + 0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965, + 0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a, + 0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172, + 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de, + 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da, + 0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, + 0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf, + 0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb, + 0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9, + 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1, + 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162, + 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3, + 0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, + 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, + 0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, + 0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, + 0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, + 0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc, + 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7, + 0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7, + 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77, + 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, + 0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b, + 0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60, + 0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, + 0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, + 0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, + 0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, + 0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb, + 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d, + 0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, + 0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, + 0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, + 0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca, + 0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4, + 0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, + 0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df, + 0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb, + 0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2, + 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f, + 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173, + 0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, + 0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde, + 0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2, + 0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, + 0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be, + 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9, + 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7, + 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e, + 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac, + 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, + 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b, + 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, + 0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca, + 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7, + 0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, + 0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, + 0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, + 0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6, + 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551, + 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf, + 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2, + 0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465, + 0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, + 0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, + 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, + 0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, + 0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d, + 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65, + 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473, + 0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941, + 0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, + 0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, + 0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e, + 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71, + 0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67, + 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce, + 0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45, + 0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3, + 0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, + 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc, + 0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, + 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1, + 0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd, + 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b, + 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1, + 0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5, + 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7, + 0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2, + 0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb, + 0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241, + 0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db, + 0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8, + 0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae, + 0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7, + 0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257, + 0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3, + 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2, + 0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, + 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, + 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, + 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, + 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7, + 0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, + 0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc, + 0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, + 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0, + 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6, + 0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, + 0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec, + 0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41, + 0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, + 0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, + 0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc, + 0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2, + 0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf, + 0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7, + 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, + 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, + 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, + 0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, + 0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572, + 0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc, + 0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, + 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571, + 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8, + 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4, + 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9, + 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b, + 0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b, + 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479, + 0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, + 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2, + 0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6, + 0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, + 0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, + 0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, + 0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, + 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, + 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1, + 0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee, + 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51, + 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc, + 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba, + 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df, + 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50, + 0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, + 0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9, + 0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, + 0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, + 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, + 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab, + 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba, + 0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae, + 0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced, + 0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259, + 0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3, + 0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242, + 0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464, + 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1, + 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc, + 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af, + 0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, + 0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3, + 0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0, + 0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, + 0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3, + 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, + 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979, + 0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6, + 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2, + 0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c, + 0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8, + 0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, + 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d, + 0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249, + 0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, + 0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, + 0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca, + 0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, + 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, + 0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1, + 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8, + 0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7, + 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3, + 0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, + 0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2, + 0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8, + 0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, + 0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, + 0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778, + 0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a, + 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca, + 0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, + 0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, + 0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6, + 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452, + 0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea, + 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2, + 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb, + 0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8, + 0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8, + 0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd, + 0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1, + 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd, + 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, + 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40, + 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4, + 0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, + 0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, + 0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, + 0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6, + 0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, + 0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62, + 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44, + 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f, + 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61, + 0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, + 0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, + 0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, + 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, + 0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, + 0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5, + 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0, + 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda, + 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7, + 0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1, + 0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4, + 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1, + 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7, + 0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4, + 0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, + 0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, + 0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, + 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, + 0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1, + 0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, + 0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, + 0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, + 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, + 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, + 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc, + 0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9, + 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae, + 0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb, + 0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3, + 0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc, + 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6, + 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3, + 0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, + 0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5, + 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6, + 0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f, + 0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240, + 0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, + 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, + 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245, + 0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262, + 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69, + 0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, + 0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, + 0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, + 0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed, + 0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc, + 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf, + 0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, + 0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, + 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5, + 0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, + 0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, + 0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1, + 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf, + 0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, + 0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, + 0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8, + 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42, + 0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4, + 0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd, + 0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f, + 0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252, + 0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468, + 0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7, + 0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6, + 0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, + 0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, + 0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, + 0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, + 0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5, + 0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, + 0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3, + 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, + 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b, + 0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66, + 0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, + 0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, + 0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, + 0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, + 0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, + 0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, + 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, + 0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a, + 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241, + 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd, + 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, + 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7, + 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7, + 0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0, + 0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3, + 0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4, + 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc, + 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd, + 0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, + 0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, + 0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, + 0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847, + 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849, + 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853, + 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b, + 0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62, + 0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, + 0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, + 0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49, + 0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, + 0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e, + 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0, + 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61, + 0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa, + 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, + 0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, + 0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d, + 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48, + 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9, + 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6, + 0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257, + 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f, + 0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44, + 0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, + 0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49, + 0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, + 0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258, + 0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3, + 0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7, + 0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, + 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, + 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, + 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, + 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, + 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, + 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, + 0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a, + 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, + 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4, + 0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, + 0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, + 0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, + 0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b, + 0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4, + 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, + 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46, + 0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540, + 0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, + 0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, + 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, + 0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, + 0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a, + 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, + 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, + 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, + 0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e, + 0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273, + 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f, + 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac, + 0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278, + 0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270, + 0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, + 0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272, + 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6, + 0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659, + 0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0, + 0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657, + 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec, + 0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0, + 0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5, + 0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658, + 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49, + 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5, + 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46, + 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9, + 0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, + 0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, + 0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59, + 0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56, + 0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de, + 0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6, + 0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb, + 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272, + 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373, + 0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, + 0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a, + 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, + 0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461, + 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9, + 0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4, + 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, + 0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41, + 0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a, + 0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53, + 0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3, + 0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2, + 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0, + 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b, + 0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f, + 0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e, + 0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269, + 0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f, + 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651, + 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62, + 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c, + 0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77, + 0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2, + 0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf, + 0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72, + 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75, + 0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd, + 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5, + 0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664, + 0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b, + 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6, + 0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b, + 0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, + 0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, + 0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, + 0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, + 0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f, + 0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa, + 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269, + 0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da, + 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6, + 0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, + 0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5, + 0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, + 0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9, + 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab, + 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb, + 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c, + 0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69, + 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, + 0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, + 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, + 0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44, + 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, + 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0, + 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63, + 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0, + 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57, + 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3, + 0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663, + 0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, + 0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556, + 0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, + 0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab, + 0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, + 0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b, + 0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c, + 0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65, + 0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1, + 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7, + 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7, + 0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69, + 0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, + 0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce, + 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2, + 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9, + 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae, + 0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, + 0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, + 0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674, + 0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277, + 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, + 0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, + 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, + 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, + 0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1, + 0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5, + 0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, + 0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf, + 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1, + 0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe, + 0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69, + 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c, + 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6, + 0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67, + 0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044, + 0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273, + 0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0, + 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d, + 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8, + 0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0, + 0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e, + 0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, + 0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0, + 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, + 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b, + 0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda, + 0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63, + 0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, + 0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5, + 0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6, + 0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f, + 0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd, + 0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab, + 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, + 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac, + 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d, + 0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3, + 0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, + 0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, + 0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, + 0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7, + 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, + 0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, + 0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, + 0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d, + 0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e, + 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d, + 0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, + 0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df, + 0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1, + 0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, + 0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, + 0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, + 0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5, + 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74, + 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, + 0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af, + 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, + 0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, + 0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, + 0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, + 0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, + 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce, + 0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77, + 0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, + 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, + 0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, + 0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1, + 0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, + 0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, + 0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9, + 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, + 0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, + 0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, + 0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, + 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, + 0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, + 0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477, + 0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, + 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f, + 0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, + 0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, + 0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1, + 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3, + 0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1, + 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, + 0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, + 0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8, + 0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5, + 0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, + 0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e, + 0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4, + 0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9, + 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4, + 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3, + 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed, + 0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53, + 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2, + 0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, + 0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69, + 0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145, + 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056, + 0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b, + 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2, + 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b, + 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2, + 0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1, + 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7, + 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, + 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac, + 0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, + 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3, + 0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4, + 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342, + 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0, + 0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0, + 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1, + 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3, + 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3, + 0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc, + 0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf, + 0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, + 0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8, + 0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41, + 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9, + 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349, + 0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2, + 0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1, + 0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3, + 0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8, + 0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, + 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5, + 0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6, + 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca, + 0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, + 0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, + 0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, + 0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9, + 0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8, + 0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc, + 0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, + 0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, + 0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3, + 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd, + 0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, + 0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, + 0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1, + 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8, + 0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53, + 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f, + 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51, + 0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, + 0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353, + 0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, + 0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6, + 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67, + 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5, + 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151, + 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe, + 0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, + 0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd, + 0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, + 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063, + 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1, + 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, + 0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9, + 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7, + 0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa, + 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, + 0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659, + 0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3, + 0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b, + 0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca, + 0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9, + 0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361, + 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b, + 0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c, + 0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152, + 0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b, + 0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9, + 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, + 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, + 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, + 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, + 0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, + 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, + 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, + 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, + 0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, + 0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8, + 0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, + 0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, + 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, + 0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b, + 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78, + 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377, + 0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, + 0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, + 0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, + 0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc, + 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0, + 0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, + 0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, + 0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7, + 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1, + 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3, + 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4, + 0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169, + 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c, + 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168, + 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9, + 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, + 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6, + 0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8, + 0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, + 0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, + 0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7, + 0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee, + 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce, + 0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a, + 0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8, + 0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d, + 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a, + 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870, + 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, + 0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, + 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362, + 0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, + 0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872, + 0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079, + 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, + 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd, + 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc, + 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70, + 0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9, + 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, + 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, + 0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, + 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41, + 0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366, + 0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71, + 0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5, + 0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5, + 0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45, + 0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb, + 0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, + 0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb, + 0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, + 0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, + 0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace, + 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c, + 0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d, + 0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, + 0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, + 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, + 0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a, + 0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, + 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf, + 0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c, + 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7, + 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f, + 0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb, + 0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, + 0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72, + 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879, + 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1, + 0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a, + 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744, + 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, + 0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed, + 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, + 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177, + 0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179, + 0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2, + 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6, + 0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, + 0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50, + 0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, + 0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, + 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, + 0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1, + 0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371, + 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee, + 0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, + 0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, + 0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, + 0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6, + 0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2, + 0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e, + 0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, + 0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, + 0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, + 0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2, + 0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, + 0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, + 0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61, + 0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, + 0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, + 0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078, + 0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c, + 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e, + 0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3, + 0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5, + 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc, + 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8, + 0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe, + 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, + 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, + 0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, + 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340, + 0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, + 0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773, + 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3, + 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d, + 0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7, + 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77, + 0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1, + 0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, + 0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, + 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd, + 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, + 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, + 0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, + 0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f, + 0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5, + 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0, + 0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc, + 0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, + 0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8, + 0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0, + 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, + 0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, + 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5, + 0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb, + 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1, + 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4, + 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, + 0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, + 0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, + 0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, + 0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, + 0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770, + 0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, + 0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, + 0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, + 0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b, + 0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, + 0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, + 0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43, + 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, + 0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, + 0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44, + 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe, + 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40, + 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d, + 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42, + 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4, + 0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, + 0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, + 0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, + 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, + 0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, + 0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, + 0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, + 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, + 0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, + 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7, + 0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf, + 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8, + 0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4, + 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8, + 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749, + 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, + 0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7, + 0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342, + 0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, + 0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, + 0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6, + 0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, + 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce, + 0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc, + 0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba, + 0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348, + 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, + 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, + 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf, + 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, + 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3, + 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee, + 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed, + 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, + 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, + 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc, + 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, + 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, + 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, + 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, + 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, + 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, + 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, + 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, + 0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, + 0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, + 0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f, + 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d, + 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1, + 0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a, + 0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, + 0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b, + 0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af, + 0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1, + 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, + 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc, + 0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6, + 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7, + 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5, + 0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642, + 0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, + 0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9, + 0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be, + 0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5, + 0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, + 0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, + 0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae, + 0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db, + 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7, + 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2, + 0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, + 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5, + 0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd, + 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8, + 0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, + 0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, + 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, + 0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, + 0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9, + 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9, + 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb, + 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8, + 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71, + 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a, + 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9, + 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6, + 0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, + 0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, + 0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb, + 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752, + 0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a, + 0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2, + 0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, + 0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, + 0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4, + 0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4, + 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, + 0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, + 0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, + 0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, + 0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, + 0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, + 0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc, + 0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d, + 0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, + 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0, + 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf, + 0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc, + 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2, + 0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, + 0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047, + 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, + 0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f, + 0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e, + 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2, + 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, + 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd, + 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, + 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2, + 0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, + 0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, + 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, + 0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, + 0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc, + 0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, + 0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, + 0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3, + 0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd, + 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, + 0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7, + 0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, + 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, + 0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, + 0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe, + 0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b, + 0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842, + 0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d, + 0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce, + 0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, + 0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, + 0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362, + 0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057, + 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2, + 0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c, + 0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a, + 0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1, + 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347, + 0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, + 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a, + 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655, + 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650, + 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9, + 0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea, + 0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, + 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3, + 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb, + 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5, + 0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba, + 0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845, + 0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9, + 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3, + 0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed, + 0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, + 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, + 0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd, + 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, + 0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, + 0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b, + 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7, + 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, + 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070, + 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067, + 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461, + 0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e, + 0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843, + 0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9, + 0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, + 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6, + 0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3, + 0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1, + 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, + 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141, + 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8, + 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de, + 0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df, + 0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc, + 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761, + 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846, + 0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950, + 0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa, + 0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, + 0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db, + 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43, + 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc, + 0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, + 0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, + 0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, + 0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, + 0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, + 0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, + 0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce, + 0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0, + 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1, + 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, + 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657, + 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664, + 0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0, + 0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, + 0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, + 0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, + 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a, + 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0, + 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, + 0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4, + 0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, + 0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, + 0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a, + 0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, + 0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949, + 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf, + 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43, + 0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f, + 0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2, + 0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, + 0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, + 0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51, + 0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9, + 0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, + 0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, + 0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee, + 0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, + 0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, + 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea, + 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57, + 0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c, + 0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5, + 0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952, + 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c, + 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a, + 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46, + 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd, + 0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b, + 0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, + 0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2, + 0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f, + 0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, + 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472, + 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a, + 0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4, + 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9, + 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152, + 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5, + 0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8, + 0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6, + 0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, + 0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, + 0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab, + 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8, + 0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62, + 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63, + 0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673, + 0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73, + 0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc, + 0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a, + 0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, + 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, + 0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd, + 0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba, + 0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, + 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9, + 0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, + 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3, + 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, + 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, + 0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f, + 0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, + 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, + 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b, + 0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876, + 0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869, + 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8, + 0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40, + 0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, + 0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, + 0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, + 0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9, + 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea, + 0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3, + 0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4, + 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9, + 0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4, + 0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9, + 0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163, + 0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2, + 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd, + 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a, + 0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec, + 0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361, + 0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9, + 0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364, + 0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, + 0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5, + 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe, + 0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, + 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, + 0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666, + 0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b, + 0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, + 0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, + 0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b, + 0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb, + 0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, + 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672, + 0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8, + 0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845, + 0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b, + 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf, + 0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7, + 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3, + 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef, + 0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, + 0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, + 0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4, + 0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9, + 0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, + 0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, + 0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae, + 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2, + 0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c, + 0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, + 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, + 0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, + 0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3, + 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda, + 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f, + 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5, + 0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, + 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, + 0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, + 0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, + 0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, + 0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8, + 0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d, + 0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, + 0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, + 0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc, + 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, + 0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f, + 0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, + 0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051, + 0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2, + 0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976, + 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, + 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1, + 0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, + 0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, + 0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340, + 0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7, + 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4, + 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5, + 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671, + 0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58, + 0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6, + 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a, + 0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979, + 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb, + 0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059, + 0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, + 0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47, + 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, + 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551, + 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773, + 0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7, + 0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, + 0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab, + 0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0, + 0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9, + 0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0, + 0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, + 0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, + 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e, + 0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e, + 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50, + 0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac, + 0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555, + 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557, + 0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba, + 0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56, + 0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, + 0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4, + 0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc, + 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73, + 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70, + 0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69, + 0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, + 0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, + 0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, + 0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4, + 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, + 0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560, + 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a, + 0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679, + 0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, + 0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, + 0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853, + 0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b, + 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9, + 0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065, + 0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1, + 0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc, + 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6, + 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77, + 0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067, + 0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, + 0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569, + 0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854, + 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069, + 0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf, + 0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee, + 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, + 0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, + 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, + 0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db, + 0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, + 0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a, + 0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f, + 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244, + 0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6, + 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355, + 0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, + 0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, + 0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c, + 0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a, + 0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa, + 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac, + 0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae, + 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, + 0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, + 0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e, + 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a, + 0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674, + 0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, + 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, + 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef, + 0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7, + 0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae, + 0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9, + 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d, + 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3, + 0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0, + 0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, + 0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f, + 0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, + 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de, + 0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, + 0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5, + 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, + 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9, + 0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6, + 0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, + 0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6, + 0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, + 0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, + 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, + 0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, + 0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, + 0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd, + 0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, + 0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961, + 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf, + 0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, + 0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247, + 0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452, + 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963, + 0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454, + 0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874, + 0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2, + 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a, + 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, + 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877, + 0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, + 0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e, + 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf, + 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3, + 0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, + 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, + 0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, + 0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, + 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa, + 0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4, + 0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6, + 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb, + 0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3, + 0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074, + 0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159, + 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b, + 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b, + 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c, + 0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e, + 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, + 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149, + 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, + 0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, + 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, + 0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, + 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, + 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, + 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242, + 0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, + 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, + 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340, + 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e, +}; + +static const Summary16 big5_uni2indx_page00[16] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x00ac }, { 4, 0x0083 }, + { 7, 0x0000 }, { 7, 0x0080 }, { 8, 0x0000 }, { 8, 0x0080 }, +}; +static const Summary16 big5_uni2indx_page02[38] = { + /* 0x0200 */ + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0e80 }, { 13, 0x0200 }, { 14, 0x0000 }, { 14, 0x0000 }, + /* 0x0300 */ + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0xfffe }, { 29, 0x03fb }, { 38, 0xfffe }, + { 53, 0x03fb }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, + /* 0x0400 */ + { 62, 0x0002 }, { 63, 0x1ff0 }, { 72, 0xfff8 }, { 85, 0xffff }, + { 101, 0xffff }, { 117, 0x0002 }, +}; +static const Summary16 big5_uni2indx_page20[44] = { + /* 0x2000 */ + { 118, 0x0000 }, { 118, 0x3318 }, { 124, 0x0064 }, { 127, 0x4824 }, + { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, + { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, + { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, + /* 0x2100 */ + { 131, 0x0228 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, + { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x03ff }, { 144, 0x0000 }, + { 144, 0x0000 }, { 144, 0x03cf }, { 152, 0x0000 }, { 152, 0x0000 }, + { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, + /* 0x2200 */ + { 152, 0x0000 }, { 152, 0xc400 }, { 155, 0x4e29 }, { 162, 0x1030 }, + { 165, 0x0000 }, { 165, 0x0004 }, { 166, 0x00c3 }, { 170, 0x0000 }, + { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0020 }, { 171, 0x8000 }, +}; +static const Summary16 big5_uni2indx_page24[37] = { + /* 0x2400 */ + { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, + { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x03ff }, { 182, 0x3ff0 }, + { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, + { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, + /* 0x2500 */ + { 192, 0x1005 }, { 195, 0x1111 }, { 199, 0x1010 }, { 201, 0x1010 }, + { 203, 0x0000 }, { 203, 0x4001 }, { 205, 0xe402 }, { 210, 0x000f }, + { 214, 0xfffe }, { 229, 0x0030 }, { 231, 0x0003 }, { 233, 0x300c }, + { 237, 0xc8c0 }, { 242, 0x0000 }, { 242, 0x003c }, { 246, 0x0000 }, + /* 0x2600 */ + { 246, 0x0260 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, + { 249, 0x0007 }, +}; +static const Summary16 big5_uni2indx_page30[62] = { + /* 0x3000 */ + { 252, 0xff2f }, { 265, 0x6037 }, { 272, 0x03fe }, { 281, 0x0000 }, + { 281, 0xfffe }, { 296, 0xffff }, { 312, 0xffff }, { 328, 0xffff }, + { 344, 0xffff }, { 360, 0x600f }, { 366, 0xfffe }, { 381, 0xffff }, + { 397, 0xffff }, { 413, 0xffff }, { 429, 0xffff }, { 445, 0x407f }, + /* 0x3100 */ + { 453, 0xffe0 }, { 464, 0xffff }, { 480, 0x03ff }, { 490, 0x0000 }, + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, + /* 0x3200 */ + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, + { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0008 }, { 491, 0x0000 }, + { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, + /* 0x3300 */ + { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, + { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, + { 491, 0xc000 }, { 493, 0x7000 }, { 496, 0x0002 }, { 497, 0x0000 }, + { 497, 0x4010 }, { 499, 0x0026 }, +}; +static const Summary16 big5_uni2indx_page4e[1307] = { + /* 0x4e00 */ + { 502, 0xff8b }, { 514, 0xc373 }, { 523, 0x6840 }, { 527, 0x1b0f }, + { 535, 0xe9ac }, { 544, 0xf34c }, { 553, 0x0200 }, { 554, 0xc008 }, + { 557, 0x795c }, { 566, 0xca3e }, { 575, 0x7976 }, { 585, 0x0648 }, + { 589, 0x2fdf }, { 601, 0xf7f0 }, { 612, 0x033a }, { 618, 0xa8ff }, + /* 0x4f00 */ + { 629, 0xef37 }, { 641, 0x233f }, { 650, 0xb004 }, { 654, 0xfd59 }, + { 665, 0xf3ca }, { 675, 0xffff }, { 691, 0xde9f }, { 703, 0xfff9 }, + { 717, 0xabff }, { 730, 0x7df7 }, { 743, 0xc000 }, { 745, 0x8eec }, + { 754, 0xeebf }, { 767, 0xffdb }, { 781, 0xd003 }, { 786, 0x45fa }, + /* 0x5000 */ + { 795, 0xfae1 }, { 805, 0xdffe }, { 819, 0xbfef }, { 833, 0x10ab }, + { 839, 0xffeb }, { 853, 0xfcaa }, { 863, 0xef3f }, { 876, 0x24fd }, + { 885, 0x78ad }, { 894, 0x7f76 }, { 906, 0xf00c }, { 912, 0xedff }, + { 926, 0xcff6 }, { 938, 0x2cfa }, { 947, 0xf7f9 }, { 960, 0xeb6b }, + /* 0x5100 */ + { 971, 0x1ffd }, { 983, 0x95bf }, { 994, 0x6677 }, { 1004, 0xbfbf }, + { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 }, + { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 }, + { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b }, + /* 0x5200 */ + { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def }, + { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 }, + { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 }, + { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb }, + /* 0x5300 */ + { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 }, + { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf }, + { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 }, + { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f }, + /* 0x5400 */ + { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb }, + { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff }, + { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb }, + { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e }, + /* 0x5500 */ + { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff }, + { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 }, + { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e }, + { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 }, + /* 0x5600 */ + { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d }, + { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df }, + { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc }, + { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 }, + /* 0x5700 */ + { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 }, + { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff }, + { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 }, + { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff }, + /* 0x5800 */ + { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff }, + { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 }, + { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a }, + { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 }, + /* 0x5900 */ + { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 }, + { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf }, + { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e }, + { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe }, + /* 0x5a00 */ + { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 }, + { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 }, + { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff }, + { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 }, + /* 0x5b00 */ + { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 }, + { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf }, + { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 }, + { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 }, + /* 0x5c00 */ + { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b }, + { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a }, + { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb }, + { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 }, + /* 0x5d00 */ + { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff }, + { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 }, + { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 }, + { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f }, + /* 0x5e00 */ + { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 }, + { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d }, + { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff }, + { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce }, + /* 0x5f00 */ + { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb }, + { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db }, + { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 }, + { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba }, + /* 0x6000 */ + { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc }, + { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 }, + { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 }, + { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff }, + /* 0x6100 */ + { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 }, + { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff }, + { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f }, + { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 }, + /* 0x6200 */ + { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d }, + { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf }, + { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b }, + { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff }, + /* 0x6300 */ + { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c }, + { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 }, + { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 }, + { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f }, + /* 0x6400 */ + { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 }, + { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd }, + { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f }, + { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f }, + /* 0x6500 */ + { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc }, + { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc }, + { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd }, + { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f }, + /* 0x6600 */ + { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e }, + { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 }, + { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 }, + { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd }, + /* 0x6700 */ + { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a }, + { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff }, + { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd }, + { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff }, + /* 0x6800 */ + { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e }, + { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 }, + { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f }, + { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff }, + /* 0x6900 */ + { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd }, + { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 }, + { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb }, + { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de }, + /* 0x6a00 */ + { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 }, + { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 }, + { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 }, + { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b }, + /* 0x6b00 */ + { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde }, + { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 }, + { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed }, + { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d }, + /* 0x6c00 */ + { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 }, + { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f }, + { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb }, + { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f }, + /* 0x6d00 */ + { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff }, + { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 }, + { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc }, + { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff }, + /* 0x6e00 */ + { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f }, + { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e }, + { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df }, + { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 }, + /* 0x6f00 */ + { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef }, + { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd }, + { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f }, + { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 }, + /* 0x7000 */ + { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf }, + { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 }, + { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb }, + { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 }, + /* 0x7100 */ + { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 }, + { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 }, + { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f }, + { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 }, + /* 0x7200 */ + { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 }, + { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd }, + { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 }, + { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 }, + /* 0x7300 */ + { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff }, + { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded }, + { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc }, + { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 }, + /* 0x7400 */ + { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f }, + { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f }, + { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 }, + { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 }, + /* 0x7500 */ + { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f }, + { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 }, + { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d }, + { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff }, + /* 0x7600 */ + { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f }, + { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 }, + { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 }, + { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf }, + /* 0x7700 */ + { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe }, + { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 }, + { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff }, + { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f }, + /* 0x7800 */ + { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf }, + { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 }, + { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d }, + { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c }, + /* 0x7900 */ + { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 }, + { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d }, + { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf }, + { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 }, + /* 0x7a00 */ + { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 }, + { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 }, + { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe }, + { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 }, + /* 0x7b00 */ + { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f }, + { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff }, + { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 }, + { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f }, + /* 0x7c00 */ + { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 }, + { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c }, + { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e }, + { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 }, + /* 0x7d00 */ + { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f }, + { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f }, + { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 }, + { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf }, + /* 0x7e00 */ + { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff }, + { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd }, + { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 }, + { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, + /* 0x7f00 */ + { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 }, + { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed }, + { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef }, + { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf }, + /* 0x8000 */ + { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 }, + { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef }, + { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 }, + { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f }, + /* 0x8100 */ + { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 }, + { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df }, + { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf }, + { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c }, + /* 0x8200 */ + { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc }, + { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 }, + { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb }, + { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f }, + /* 0x8300 */ + { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe }, + { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 }, + { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 }, + { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f }, + /* 0x8400 */ + { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff }, + { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 }, + { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 }, + { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf }, + /* 0x8500 */ + { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 }, + { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 }, + { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb }, + { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 }, + /* 0x8600 */ + { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e }, + { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b }, + { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb }, + { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 }, + /* 0x8700 */ + { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf }, + { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 }, + { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd }, + { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc }, + /* 0x8800 */ + { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef }, + { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 }, + { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 }, + { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf }, + /* 0x8900 */ + { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef }, + { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e }, + { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 }, + { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf }, + /* 0x8a00 */ + { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 }, + { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff }, + { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 }, + { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff }, + /* 0x8b00 */ + { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb }, + { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 }, + { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 }, + { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, + /* 0x8c00 */ + { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 }, + { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef }, + { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd }, + { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b }, + /* 0x8d00 */ + { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 }, + { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd }, + { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc }, + { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f }, + /* 0x8e00 */ + { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b }, + { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c }, + { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 }, + { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 }, + /* 0x8f00 */ + { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc }, + { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 }, + { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 }, + { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 }, + /* 0x9000 */ + { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 }, + { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd }, + { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f }, + { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f }, + /* 0x9100 */ + { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f }, + { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc }, + { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf }, + { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba }, + /* 0x9200 */ + { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df }, + { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 }, + { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc }, + { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 }, + /* 0x9300 */ + { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 }, + { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 }, + { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf }, + { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 }, + /* 0x9400 */ + { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef }, + { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff }, + { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, + { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, + /* 0x9500 */ + { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, + { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 }, + { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 }, + { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 }, + /* 0x9600 */ + { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 }, + { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff }, + { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b }, + { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 }, + /* 0x9700 */ + { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 }, + { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd }, + { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 }, + { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b }, + /* 0x9800 */ + { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 }, + { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f }, + { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e }, + { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 }, + /* 0x9900 */ + { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f }, + { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 }, + { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f }, + { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 }, + /* 0x9a00 */ + { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 }, + { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 }, + { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b }, + { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece }, + /* 0x9b00 */ + { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae }, + { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 }, + { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 }, + { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 }, + /* 0x9c00 */ + { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade }, + { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba }, + { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, + { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe }, + /* 0x9d00 */ + { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb }, + { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf }, + { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe }, + { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd }, + /* 0x9e00 */ + { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 }, + { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 }, + { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 }, + { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd }, + /* 0x9f00 */ + { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff }, + { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 }, + { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 }, +}; +static const Summary16 big5_uni2indx_pagefa[1] = { + /* 0xfa00 */ + { 13563, 0x3000 }, +}; +static const Summary16 big5_uni2indx_pagefe[23] = { + /* 0xfe00 */ + { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb }, + { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 }, + { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, + { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, + /* 0xff00 */ + { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff }, + { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 }, +}; + +static int +big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0100) + summary = &big5_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x0200 && wc < 0x0460) + summary = &big5_uni2indx_page02[(wc>>4)-0x020]; + else if (wc >= 0x2000 && wc < 0x22c0) + summary = &big5_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x2400 && wc < 0x2650) + summary = &big5_uni2indx_page24[(wc>>4)-0x240]; + else if (wc >= 0x3000 && wc < 0x33e0) + summary = &big5_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x4e00 && wc < 0x9fb0) + summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xfa00 && wc < 0xfa10) + summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0]; + else if (wc >= 0xfe00 && wc < 0xff70) + summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = big5_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/big5_2003.h b/Externals/libiconv-1.14/lib/big5_2003.h new file mode 100644 index 0000000000..b532ce6ee8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5_2003.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5-2003 + */ + +/* + * BIG5-2003 is a slightly extended and slightly modified version of BIG5. + * It is actually nearer to Microsoft CP950 than to BIG5. The differences + * between EASTASIA/OTHER/BIG5.TXT found on ftp.unicode.org and BIG5-2003.TXT + * are as follows: + * + * 1. Some characters in the symbols area (0xA140..0xA2CE) are defined + * differently: + * + * code BIG5.TXT BIG5-2003.TXT + * 0xA145 0x2022 # BULLET 0x2027 # HYPHENATION POINT + * 0xA14E 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA + * 0xFE51 # SMALL IDEOGRAPHIC COMMA + * 0xA156 0x2013 # EN DASH 0x2015 # HORIZONTAL BAR + * 0xA15A --- 0x2574 # BOX DRAWINGS LIGHT LEFT + * 0xA1C3 --- 0xFFE3 # FULLWIDTH MACRON + * 0xA1C5 --- 0x02CD # MODIFIER LETTER LOW MACRON + * 0xA1E3 0x223C # TILDE OPERATOR 0xFF5E # FULLWIDTH TILDE + * 0xA1F2 0x2641 # EARTH 0x2295 # CIRCLED PLUS + * 0xA1F3 0x2609 # SUN 0x2299 # CIRCLED DOT OPERATOR + * 0xA1FE --- 0xFF0F # FULLWIDTH SOLIDUS + * 0xA240 --- 0xFF3C # FULLWIDTH REVERSE SOLIDUS + * 0xA241 0xFF0F # FULLWIDTH SOLIDUS 0x2215 # DIVISION SLASH + * 0xA242 0xFF3C # FULLWIDTH REVERSE SOLIDUS + * 0xFE68 # SMALL REVERSE SOLIDUS + * 0xA244 0x00A5 # YEN SIGN 0xFFE5 # FULLWIDTH YEN SIGN + * 0xA246 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN + * 0xA247 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN + * 0xA2A4 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL + * 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL + * 0xA2A5 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + * 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + * 0xA2A6 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + * 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + * 0xA2A7 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + * 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + * 0xA2CC --- 0x3038 # HANGZHOU NUMERAL TEN + * 0xA2CD 0x5344 0x3039 # HANGZHOU NUMERAL TWENTY + * 0xA2CE --- 0x303A # HANGZHOU NUMERAL THIRTY + * + * 2. A control symbols area is added: + * + * code + * 0xA3C0..0xA3E0 U+2400..U+2421 + * + * 3. The Euro sign is added: + * + * code + * 0xA3E1 0x20AC # EURO SIGN + * + * 4. Some characters in the main area are defined differently: + * + * code BIG5.TXT BIG5-2003.TXT + * 0xC255 0x5F5D 0x5F5E + * + * 5. The area 0xC6A1..0xC7FE is organized differently: + * + * code + * 0xC6A1..0xC6BE numerals (was in BIG5.TXT at 0xC7E9..0xC7FC) + * 0xC6BF..0xC6D7 radicals + * 0xC6D8..0xC6E6 rarely used symbols + * 0xC6E7..0xC77A hiragana (U+3041..U+3093, was in BIG5.TXT at 0xC6A5..0xC6F7) + * 0xC77B..0xC7F2 katakana (U+30A1..U+30F6, was in BIG5.TXT at 0xC6F8..0xC7B0) + * + * 6. Some characters are added at 0xF9D6..0xF9DC. + * + * 7. Box drawing characters are added at 0xF9DD..0xF9FE. + * + * Note: 4 of these characters are mapped in a non-inversible way, because + * Unicode does not yet include the corresponding characters: + * + * code Unicode approximation + * 0xF9FA BOX DRAWINGS DOUBLE ARC DOWN AND RIGHT 0x2554 + * 0xF9FB BOX DRAWINGS DOUBLE ARC DOWN AND LEFT 0x2557 + * 0xF9FC BOX DRAWINGS DOUBLE ARC UP AND RIGHT 0x255A + * 0xF9FD BOX DRAWINGS DOUBLE ARC UP AND LEFT 0x255D + * + * 8. Private area mappings are added: + * + * code Unicode + * 0x{81..8D}{40..7E,A1..FE} U+EEB8..U+F6B0 + * 0x{8E..A0}{40..7E,A1..FE} U+E311..U+EEB7 + * 0x{FA..FE}{40..7E,A1..FE} U+E000..U+E310 + * + * These mappings are not contained in the BSMI Big5-2003 standard. However, + * they were contained in a draft of it. + */ + +static const unsigned short big5_2003_2uni_pagea1[314] = { + /* 0xa1 */ + 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a, + 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, + 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2015, 0xfe31, + 0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, + 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, + 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, + 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, + 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, + 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, + 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, + 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, + 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, + 0x203e, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, + 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, + 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, + 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, + 0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, + 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, + 0x2199, 0x2198, 0x2225, 0x2223, 0xff0f, + /* 0xa2 */ + 0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1, + 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, + 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, + 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, + 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, + 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, + 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, + 0x2570, 0x256f, 0x2501, 0x251d, 0x253f, 0x2525, 0x25e2, 0x25e3, + 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, + 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, + 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, + 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x3038, 0x3039, 0x303a, 0xff21, 0xff22, 0xff23, + 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, + 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, + 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, + 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, + 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, + 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, +}; + +static const unsigned short big5_2003_2uni_pagec6[70] = { + /* 0xc6a1 */ + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247a, 0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173, + 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2f02, 0x2f03, + 0x2f05, 0x2f07, 0x2f0c, 0x2f0d, 0x2f0e, 0x2f13, 0x2f16, 0x2f19, + 0x2f1b, 0x2f22, 0x2f27, 0x2f2e, 0x2f33, 0x2f34, 0x2f35, 0x2f39, + 0x2f3a, 0x2f41, 0x2f46, 0x2f67, 0x2f68, 0x2fa1, 0x2faa, 0x00a8, + 0xff3e, 0x30fd, 0x30fe, 0x309d, 0x309e, 0xfffd, 0xfffd, 0x3005, + 0x3006, 0x3007, 0x30fc, 0xff3b, 0xff3d, 0x273d, +}; + +static const unsigned short big5_2003_2uni_pagef9[41] = { + /* 0xf9d6 */ + 0x7881, 0x92b9, 0x88cf, 0x58bb, 0x6052, 0x7ca7, 0x5afa, + /* 0xf9dd */ + 0x2554, 0x2566, 0x2557, 0x2560, 0x256c, 0x2563, 0x255a, 0x2569, + 0x255d, 0x2552, 0x2564, 0x2555, 0x255e, 0x256a, 0x2561, 0x2558, + 0x2567, 0x255b, 0x2553, 0x2565, 0x2556, 0x255f, 0x256b, 0x2562, + 0x2559, 0x2568, 0x255c, 0x2551, 0x2550, + 0x2554, 0x2557, 0x255a, 0x255d, /* not invertible */ + 0x2593, +}; + +static int +big5_2003_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0x81 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (c >= 0xa1) { + if (c < 0xa3) { + unsigned int i = 157 * (c - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + unsigned short wc = big5_2003_2uni_pagea1[i]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + if (!(c == 0xc2 && c2 == 0x55)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + if (c == 0xa3) { + if (c2 >= 0xc0 && c2 <= 0xe1) { + *pwc = (c2 == 0xe1 ? 0x20ac : c2 == 0xe0 ? 0x2421 : 0x2340 + c2); + return 2; + } + } else if (c == 0xf9) { + if (c2 >= 0xd6) { + *pwc = big5_2003_2uni_pagef9[c2-0xd6]; + return 2; + } + } else if (c >= 0xfa) { + *pwc = 0xe000 + 157 * (c - 0xfa) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + return 2; + } + } else { + /* c == 0xc2 && c2 == 0x55. */ + *pwc = 0x5f5e; + return 2; + } + } else { + /* (c == 0xc6 && c2 >= 0xa1) || c == 0xc7. */ + unsigned int i = 157 * (c - 0xc6) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + if (i < 133) { + /* 63 <= i < 133. */ + unsigned short wc = big5_2003_2uni_pagec6[i-63]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } else if (i < 216) { + /* 133 <= i < 216. Hiragana. */ + *pwc = 0x3041 - 133 + i; + return 2; + } else if (i < 302) { + /* 216 <= i < 302. Katakana. */ + *pwc = 0x30a1 - 216 + i; + return 2; + } + } + } else { + /* 0x81 <= c < 0xa1. */ + *pwc = (c >= 0x8e ? 0xdb18 : 0xeeb8) + 157 * (c - 0x81) + + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + return 2; + } + } + } + } + return RET_ILSEQ; +} + +static const unsigned char big5_2003_2charset_page25[29] = { + /* 0x2550 */ + 0xf9, 0xf8, 0xe6, 0xef, 0xdd, 0xe8, 0xf1, 0xdf, + 0xec, 0xf5, 0xe3, 0xee, 0xf7, 0xe5, 0xe9, 0xf2, + 0xe0, 0xeb, 0xf4, 0xe2, 0xe7, 0xf0, 0xde, 0xed, + 0xf6, 0xe4, 0xea, 0xf3, 0xe1, +}; + +static int +big5_2003_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (BIG5 extended) */ + switch (wc >> 8) { + case 0x00: + if (wc == 0x00a8) { buf[0] = 0xc6; buf[1] = 0xd8; ret = 2; break; } + if (wc == 0x00a2 || wc == 0x00a3 || wc == 0x00a5) + return RET_ILUNI; + break; + case 0x02: + if (wc == 0x02cd) { buf[0] = 0xa1; buf[1] = 0xc5; ret = 2; break; } + break; + case 0x04: + return RET_ILUNI; + case 0x20: + if (wc == 0x2015) { buf[0] = 0xa1; buf[1] = 0x56; ret = 2; break; } + if (wc == 0x2027) { buf[0] = 0xa1; buf[1] = 0x45; ret = 2; break; } + if (wc == 0x20ac) { buf[0] = 0xa3; buf[1] = 0xe1; ret = 2; break; } + if (wc == 0x2013 || wc == 0x2022) + return RET_ILUNI; + break; + case 0x21: + if (wc >= 0x2170 && wc <= 0x2179) { + buf[0] = 0xc6; buf[1] = wc - 0x20bb; ret = 2; + break; + } + break; + case 0x22: + if (wc == 0x2215) { buf[0] = 0xa2; buf[1] = 0x41; ret = 2; break; } + if (wc == 0x2295) { buf[0] = 0xa1; buf[1] = 0xf2; ret = 2; break; } + if (wc == 0x2299) { buf[0] = 0xa1; buf[1] = 0xf3; ret = 2; break; } + if (wc == 0x223c) + return RET_ILUNI; + break; + case 0x24: + if (wc <= 0x241f) { buf[0] = 0xa3; buf[1] = wc - 0x2340; ret = 2; break; } + if (wc == 0x2421) { buf[0] = 0xa3; buf[1] = 0xe0; ret = 2; break; } + if (wc >= 0x2460 && wc <= 0x2469) { + buf[0] = 0xc6; buf[1] = wc - 0x23bf; ret = 2; + break; + } + if (wc >= 0x2474 && wc <= 0x247d) { + buf[0] = 0xc6; buf[1] = wc - 0x23c9; ret = 2; + break; + } + break; + case 0x25: + if (wc == 0x2501) { buf[0] = 0xa2; buf[1] = 0xa4; ret = 2; break; } + if (wc == 0x251d) { buf[0] = 0xa2; buf[1] = 0xa5; ret = 2; break; } + if (wc == 0x2525) { buf[0] = 0xa2; buf[1] = 0xa7; ret = 2; break; } + if (wc == 0x253f) { buf[0] = 0xa2; buf[1] = 0xa6; ret = 2; break; } + if (wc >= 0x2550 && wc <= 0x256c) { + buf[0] = 0xf9; buf[1] = big5_2003_2charset_page25[wc-0x2550]; ret = 2; + break; + } + if (wc == 0x2574) { buf[0] = 0xa1; buf[1] = 0x5a; ret = 2; break; } + if (wc == 0x2593) { buf[0] = 0xf9; buf[1] = 0xfe; ret = 2; break; } + break; + case 0x26: + if (wc == 0x2609 || wc == 0x2641) + return RET_ILUNI; + break; + case 0x27: + if (wc == 0x273d) { buf[0] = 0xc6; buf[1] = 0xe6; ret = 2; break; } + break; + case 0x2f: + if (wc == 0x2f02) { buf[0] = 0xc6; buf[1] = 0xbf; ret = 2; break; } + if (wc == 0x2f03) { buf[0] = 0xc6; buf[1] = 0xc0; ret = 2; break; } + if (wc == 0x2f05) { buf[0] = 0xc6; buf[1] = 0xc1; ret = 2; break; } + if (wc == 0x2f07) { buf[0] = 0xc6; buf[1] = 0xc2; ret = 2; break; } + if (wc == 0x2f0c) { buf[0] = 0xc6; buf[1] = 0xc3; ret = 2; break; } + if (wc == 0x2f0d) { buf[0] = 0xc6; buf[1] = 0xc4; ret = 2; break; } + if (wc == 0x2f0e) { buf[0] = 0xc6; buf[1] = 0xc5; ret = 2; break; } + if (wc == 0x2f13) { buf[0] = 0xc6; buf[1] = 0xc6; ret = 2; break; } + if (wc == 0x2f16) { buf[0] = 0xc6; buf[1] = 0xc7; ret = 2; break; } + if (wc == 0x2f19) { buf[0] = 0xc6; buf[1] = 0xc8; ret = 2; break; } + if (wc == 0x2f1b) { buf[0] = 0xc6; buf[1] = 0xc9; ret = 2; break; } + if (wc == 0x2f22) { buf[0] = 0xc6; buf[1] = 0xca; ret = 2; break; } + if (wc == 0x2f27) { buf[0] = 0xc6; buf[1] = 0xcb; ret = 2; break; } + if (wc == 0x2f2e) { buf[0] = 0xc6; buf[1] = 0xcc; ret = 2; break; } + if (wc == 0x2f33) { buf[0] = 0xc6; buf[1] = 0xcd; ret = 2; break; } + if (wc == 0x2f34) { buf[0] = 0xc6; buf[1] = 0xce; ret = 2; break; } + if (wc == 0x2f35) { buf[0] = 0xc6; buf[1] = 0xcf; ret = 2; break; } + if (wc == 0x2f39) { buf[0] = 0xc6; buf[1] = 0xd0; ret = 2; break; } + if (wc == 0x2f3a) { buf[0] = 0xc6; buf[1] = 0xd1; ret = 2; break; } + if (wc == 0x2f41) { buf[0] = 0xc6; buf[1] = 0xd2; ret = 2; break; } + if (wc == 0x2f46) { buf[0] = 0xc6; buf[1] = 0xd3; ret = 2; break; } + if (wc == 0x2f67) { buf[0] = 0xc6; buf[1] = 0xd4; ret = 2; break; } + if (wc == 0x2f68) { buf[0] = 0xc6; buf[1] = 0xd5; ret = 2; break; } + if (wc == 0x2fa1) { buf[0] = 0xc6; buf[1] = 0xd6; ret = 2; break; } + if (wc == 0x2faa) { buf[0] = 0xc6; buf[1] = 0xd7; ret = 2; break; } + break; + case 0x30: + if (wc >= 0x3005 && wc <= 0x3007) { + buf[0] = 0xc6; buf[1] = wc - 0x2f25; ret = 2; + break; + } + if (wc >= 0x3038 && wc <= 0x303a) { + buf[0] = 0xa2; buf[1] = wc - 0x2f6c; ret = 2; + break; + } + if (wc >= 0x3041 && wc <= 0x3093) { + if (wc < 0x3059) { + buf[0] = 0xc6; buf[1] = wc - 0x2f5a; + } else { + buf[0] = 0xc7; buf[1] = wc - 0x3019; + } + ret = 2; + break; + } + if (wc == 0x309d) { buf[0] = 0xc6; buf[1] = 0xdc; ret = 2; break; } + if (wc == 0x309e) { buf[0] = 0xc6; buf[1] = 0xdd; ret = 2; break; } + if (wc >= 0x30a1 && wc <= 0x30f6) { + buf[0] = 0xc7; buf[1] = wc - (wc < 0x30a5 ? 0x3026 : 0x3004); ret = 2; + break; + } + if (wc == 0x30fc) { buf[0] = 0xc6; buf[1] = 0xe3; ret = 2; break; } + if (wc == 0x30fd) { buf[0] = 0xc6; buf[1] = 0xda; ret = 2; break; } + if (wc == 0x30fe) { buf[0] = 0xc6; buf[1] = 0xdb; ret = 2; break; } + break; + case 0x53: + if (wc == 0x5344) + return RET_ILUNI; + break; + case 0x58: + if (wc == 0x58bb) { buf[0] = 0xf9; buf[1] = 0xd9; ret = 2; break; } + break; + case 0x5a: + if (wc == 0x5afa) { buf[0] = 0xf9; buf[1] = 0xdc; ret = 2; break; } + break; + case 0x5f: + if (wc == 0x5f5e) { buf[0] = 0xc2; buf[1] = 0x55; ret = 2; break; } + if (wc == 0x5f5d) + return RET_ILUNI; + break; + case 0x60: + if (wc == 0x6052) { buf[0] = 0xf9; buf[1] = 0xda; ret = 2; break; } + break; + case 0x78: + if (wc == 0x7881) { buf[0] = 0xf9; buf[1] = 0xd6; ret = 2; break; } + break; + case 0x7c: + if (wc == 0x7ca7) { buf[0] = 0xf9; buf[1] = 0xdb; ret = 2; break; } + break; + case 0x88: + if (wc == 0x88cf) { buf[0] = 0xf9; buf[1] = 0xd8; ret = 2; break; } + break; + case 0x92: + if (wc == 0x92b9) { buf[0] = 0xf9; buf[1] = 0xd7; ret = 2; break; } + break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: + case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: + case 0xec: case 0xed: case 0xee: case 0xef: case 0xf0: case 0xf1: + case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: + { + unsigned int i = wc - 0xe000; + if (i < 5809) { + unsigned int c1 = i / 157; + unsigned int c2 = i % 157; + buf[0] = c1 + (c1 < 5 ? 0xfa : c1 < 24 ? 0x89 : 0x69); + buf[1] = c2 + (c2 < 0x3f ? 0x40 : 0x62); + ret = 2; + break; + } + } + break; + case 0xfe: + if (wc == 0xfe51) { buf[0] = 0xa1; buf[1] = 0x4e; ret = 2; break; } + if (wc == 0xfe68) { buf[0] = 0xa2; buf[1] = 0x42; ret = 2; break; } + break; + case 0xff: + if (wc == 0xff0f) { buf[0] = 0xa1; buf[1] = 0xfe; ret = 2; break; } + if (wc == 0xff3b) { buf[0] = 0xc6; buf[1] = 0xe4; ret = 2; break; } + if (wc == 0xff3c) { buf[0] = 0xa2; buf[1] = 0x40; ret = 2; break; } + if (wc == 0xff3d) { buf[0] = 0xc6; buf[1] = 0xe5; ret = 2; break; } + if (wc == 0xff3e) { buf[0] = 0xc6; buf[1] = 0xd9; ret = 2; break; } + if (wc == 0xff5e) { buf[0] = 0xa1; buf[1] = 0xe3; ret = 2; break; } + if (wc == 0xffe0) { buf[0] = 0xa2; buf[1] = 0x46; ret = 2; break; } + if (wc == 0xffe1) { buf[0] = 0xa2; buf[1] = 0x47; ret = 2; break; } + if (wc == 0xffe3) { buf[0] = 0xa1; buf[1] = 0xc3; ret = 2; break; } + if (wc == 0xffe5) { buf[0] = 0xa2; buf[1] = 0x44; ret = 2; break; } + if (wc == 0xff64) + return RET_ILUNI; + break; + } + if (ret == RET_ILUNI) + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/big5hkscs1999.h b/Externals/libiconv-1.14/lib/big5hkscs1999.h new file mode 100644 index 0000000000..9e0d1b0c4e --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5hkscs1999.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5-HKSCS:1999 + */ + +/* + * BIG5-HKSCS:1999 can be downloaded from + * http://www.info.gov.hk/digital21/eng/hkscs/download.html + * http://www.info.gov.hk/digital21/eng/hkscs/index.html + * + * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges + * + * 0x{88..8D}{40..7E,A1..FE} 641 characters + * 0x{8E..A0}{40..7E,A1..FE} 2898 characters + * 0x{C6..C8}{40..7E,A1..FE} 359 characters + * 0xF9{D6..FE} 41 characters + * 0x{FA..FE}{40..7E,A1..FE} 763 characters + * + * Note that some HKSCS characters are not contained in Unicode 3.2 + * and are therefore best represented as sequences of Unicode characters: + * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON + * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON + */ + +#include "hkscs1999.h" +#include "flushwc.h" + +static int +big5hkscs1999_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + } + } + } + { + int ret = hkscs1999_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + if (c == 0x88) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { + /* It's a composed character. */ + ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ + ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + return 2; + } + } + } + return RET_ILSEQ; + } +} + +#define big5hkscs1999_flushwc normal_flushwc + +static int +big5hkscs1999_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned char last = conv->ostate; + + if (last) { + /* last is = 0x66 or = 0xa7. */ + if (wc == 0x0304 || wc == 0x030c) { + /* Output the combined character. */ + if (n >= 2) { + r[0] = 0x88; + r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + r += 2; + count = 2; + } + + /* Code set 0 (ASCII) */ + if (wc < 0x0080) { + /* Plain ASCII character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else { + unsigned char buf[2]; + int ret; + + /* Code set 1 (BIG5 extended) */ + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + } + ret = hkscs1999_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if ((wc & ~0x0020) == 0x00ca) { + /* A possible first character of a multi-character sequence. We have to + buffer it. */ + if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); + conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ + return count+0; + } + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; + } +} + +static int +big5hkscs1999_reset (conv_t conv, unsigned char *r, int n) +{ + unsigned char last = conv->ostate; + + if (last) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/big5hkscs2001.h b/Externals/libiconv-1.14/lib/big5hkscs2001.h new file mode 100644 index 0000000000..2d378c4806 --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5hkscs2001.h @@ -0,0 +1,215 @@ +/* + * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5-HKSCS:2001 + */ + +/* + * BIG5-HKSCS:2001 can be downloaded from + * http://www.info.gov.hk/digital21/eng/hkscs/download.html + * http://www.info.gov.hk/digital21/eng/hkscs/index.html + * + * It extends BIG5-HKSCS:1999 through 116 characters. + * + * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges + * + * 0x{88..8D}{40..7E,A1..FE} 757 characters + * 0x{8E..A0}{40..7E,A1..FE} 2898 characters + * 0x{C6..C8}{40..7E,A1..FE} 359 characters + * 0xF9{D6..FE} 41 characters + * 0x{FA..FE}{40..7E,A1..FE} 763 characters + * + * Note that some HKSCS characters are not contained in Unicode 3.2 + * and are therefore best represented as sequences of Unicode characters: + * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON + * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON + */ + +#include "hkscs2001.h" +#include "flushwc.h" + +static int +big5hkscs2001_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + } + } + } + { + int ret = hkscs1999_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2001_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + if (c == 0x88) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { + /* It's a composed character. */ + ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ + ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + return 2; + } + } + } + return RET_ILSEQ; + } +} + +#define big5hkscs2001_flushwc normal_flushwc + +static int +big5hkscs2001_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned char last = conv->ostate; + + if (last) { + /* last is = 0x66 or = 0xa7. */ + if (wc == 0x0304 || wc == 0x030c) { + /* Output the combined character. */ + if (n >= 2) { + r[0] = 0x88; + r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + r += 2; + count = 2; + } + + /* Code set 0 (ASCII) */ + if (wc < 0x0080) { + /* Plain ASCII character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else { + unsigned char buf[2]; + int ret; + + /* Code set 1 (BIG5 extended) */ + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + } + ret = hkscs1999_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if ((wc & ~0x0020) == 0x00ca) { + /* A possible first character of a multi-character sequence. We have to + buffer it. */ + if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); + conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ + return count+0; + } + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2001_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; + } +} + +static int +big5hkscs2001_reset (conv_t conv, unsigned char *r, int n) +{ + unsigned char last = conv->ostate; + + if (last) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/big5hkscs2004.h b/Externals/libiconv-1.14/lib/big5hkscs2004.h new file mode 100644 index 0000000000..3c57f66b18 --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5hkscs2004.h @@ -0,0 +1,231 @@ +/* + * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5-HKSCS:2004 + */ + +/* + * BIG5-HKSCS:2004 can be downloaded from + * http://www.info.gov.hk/digital21/eng/hkscs/download.html + * http://www.info.gov.hk/digital21/eng/hkscs/index.html + * + * It extends BIG5-HKSCS:2001 through 123 characters. + * + * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges + * + * 0x{87..8D}{40..7E,A1..FE} 880 characters + * 0x{8E..A0}{40..7E,A1..FE} 2898 characters + * 0x{C6..C8}{40..7E,A1..FE} 359 characters + * 0xF9{D6..FE} 41 characters + * 0x{FA..FE}{40..7E,A1..FE} 763 characters + * + * Note that some HKSCS characters are not contained in Unicode 3.2 + * and are therefore best represented as sequences of Unicode characters: + * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON + * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON + */ + +#include "hkscs2004.h" +#include "flushwc.h" + +static int +big5hkscs2004_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + } + } + } + { + int ret = hkscs1999_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2001_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2004_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + if (c == 0x88) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { + /* It's a composed character. */ + ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ + ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + return 2; + } + } + } + return RET_ILSEQ; + } +} + +#define big5hkscs2004_flushwc normal_flushwc + +static int +big5hkscs2004_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned char last = conv->ostate; + + if (last) { + /* last is = 0x66 or = 0xa7. */ + if (wc == 0x0304 || wc == 0x030c) { + /* Output the combined character. */ + if (n >= 2) { + r[0] = 0x88; + r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + r += 2; + count = 2; + } + + /* Code set 0 (ASCII) */ + if (wc < 0x0080) { + /* Plain ASCII character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else { + unsigned char buf[2]; + int ret; + + /* Code set 1 (BIG5 extended) */ + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + } + ret = hkscs1999_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if ((wc & ~0x0020) == 0x00ca) { + /* A possible first character of a multi-character sequence. We have to + buffer it. */ + if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); + conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ + return count+0; + } + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2001_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2004_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; + } +} + +static int +big5hkscs2004_reset (conv_t conv, unsigned char *r, int n) +{ + unsigned char last = conv->ostate; + + if (last) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/big5hkscs2008.h b/Externals/libiconv-1.14/lib/big5hkscs2008.h new file mode 100644 index 0000000000..8759f4d040 --- /dev/null +++ b/Externals/libiconv-1.14/lib/big5hkscs2008.h @@ -0,0 +1,247 @@ +/* + * Copyright (C) 1999-2002, 2006, 2010 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG5-HKSCS:2008 + */ + +/* + * BIG5-HKSCS:2008 can be downloaded from + * http://www.ogcio.gov.hk/ccli/eng/hkscs/download.html + * http://www.ogcio.gov.hk/ccli/eng/hkscs/introduction.html + * + * It extends BIG5-HKSCS:2004 through 68 characters. + * + * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges + * + * 0x{87..8D}{40..7E,A1..FE} 880 characters + * 0x{8E..A0}{40..7E,A1..FE} 2898 characters + * 0x{C6..C8}{40..7E,A1..FE} 359 characters + * 0xF9{D6..FE} 41 characters + * 0x{FA..FE}{40..7E,A1..FE} 763 characters + * + * Note that some HKSCS characters are not contained in Unicode 3.2 + * and are therefore best represented as sequences of Unicode characters: + * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON + * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON + * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON + */ + +#include "hkscs2008.h" +#include "flushwc.h" + +static int +big5hkscs2008_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + } + } + } + { + int ret = hkscs1999_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2001_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2004_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + { + int ret = hkscs2008_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + if (c == 0x88) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { + /* It's a composed character. */ + ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ + ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + return 2; + } + } + } + return RET_ILSEQ; + } +} + +#define big5hkscs2008_flushwc normal_flushwc + +static int +big5hkscs2008_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned char last = conv->ostate; + + if (last) { + /* last is = 0x66 or = 0xa7. */ + if (wc == 0x0304 || wc == 0x030c) { + /* Output the combined character. */ + if (n >= 2) { + r[0] = 0x88; + r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + r += 2; + count = 2; + } + + /* Code set 0 (ASCII) */ + if (wc < 0x0080) { + /* Plain ASCII character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else { + unsigned char buf[2]; + int ret; + + /* Code set 1 (BIG5 extended) */ + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + } + ret = hkscs1999_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if ((wc & ~0x0020) == 0x00ca) { + /* A possible first character of a multi-character sequence. We have to + buffer it. */ + if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); + conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ + return count+0; + } + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2001_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2004_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + ret = hkscs2008_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n >= count+2) { + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; + } +} + +static int +big5hkscs2008_reset (conv_t conv, unsigned char *r, int n) +{ + unsigned char last = conv->ostate; + + if (last) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x88; + r[1] = last; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/c99.h b/Externals/libiconv-1.14/lib/c99.h new file mode 100644 index 0000000000..52a73c354d --- /dev/null +++ b/Externals/libiconv-1.14/lib/c99.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * C99 + * This is ASCII with \uXXXX and \UXXXXXXXX escape sequences, denoting Unicode + * characters. See ISO/IEC 9899:1999, section 6.4.3. + * The treatment of control characters in the range U+0080..U+009F is not + * specified; we pass them through unmodified. + */ + +static int +c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c; + ucs4_t wc; + int i; + + c = s[0]; + if (c < 0xa0) { + if (c != '\\') { + *pwc = c; + return 1; + } + if (n < 2) + return RET_TOOFEW(0); + c = s[1]; + if (c == 'u') { + wc = 0; + for (i = 2; i < 6; i++) { + if (n <= i) + return RET_TOOFEW(0); + c = s[i]; + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A'-10; + else if (c >= 'a' && c <= 'z') + c -= 'a'-10; + else + goto simply_backslash; + wc |= (ucs4_t) c << (4 * (5-i)); + } + if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000)) + || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) { + *pwc = wc; + return 6; + } + } else if (c == 'U') { + wc = 0; + for (i = 2; i < 10; i++) { + if (n <= i) + return RET_TOOFEW(0); + c = s[i]; + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A'-10; + else if (c >= 'a' && c <= 'z') + c -= 'a'-10; + else + goto simply_backslash; + wc |= (ucs4_t) c << (4 * (9-i)); + } + if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000)) + || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) { + *pwc = wc; + return 10; + } + } else + goto simply_backslash; + } + return RET_ILSEQ; +simply_backslash: + *pwc = '\\'; + return 1; +} + +static int +c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0xa0) { + *r = wc; + return 1; + } else { + int result; + unsigned char u; + if (wc < 0x10000) { + result = 6; + u = 'u'; + } else { + result = 10; + u = 'U'; + } + if (n >= result) { + int count; + r[0] = '\\'; + r[1] = u; + r += 2; + for (count = result-3; count >= 0; count--) { + unsigned int i = (wc >> (4*count)) & 0x0f; + *r++ = (i < 10 ? '0'+i : 'a'-10+i); + } + return result; + } else + return RET_TOOSMALL; + } +} diff --git a/Externals/libiconv-1.14/lib/canonical.h b/Externals/libiconv-1.14/lib/canonical.h new file mode 100644 index 0000000000..550cc64f99 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical.h @@ -0,0 +1,110 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str287, + (int)(long)&((struct stringpool_t *)0)->stringpool_str255, + (int)(long)&((struct stringpool_t *)0)->stringpool_str179, + (int)(long)&((struct stringpool_t *)0)->stringpool_str367, + (int)(long)&((struct stringpool_t *)0)->stringpool_str283, + (int)(long)&((struct stringpool_t *)0)->stringpool_str263, + (int)(long)&((struct stringpool_t *)0)->stringpool_str409, + (int)(long)&((struct stringpool_t *)0)->stringpool_str325, + (int)(long)&((struct stringpool_t *)0)->stringpool_str242, + (int)(long)&((struct stringpool_t *)0)->stringpool_str434, + (int)(long)&((struct stringpool_t *)0)->stringpool_str350, + (int)(long)&((struct stringpool_t *)0)->stringpool_str252, + (int)(long)&((struct stringpool_t *)0)->stringpool_str440, + (int)(long)&((struct stringpool_t *)0)->stringpool_str356, + (int)(long)&((struct stringpool_t *)0)->stringpool_str575, + (int)(long)&((struct stringpool_t *)0)->stringpool_str406, + (int)(long)&((struct stringpool_t *)0)->stringpool_str723, + (int)(long)&((struct stringpool_t *)0)->stringpool_str448, + (int)(long)&((struct stringpool_t *)0)->stringpool_str765, + (int)(long)&((struct stringpool_t *)0)->stringpool_str30, + (int)(long)&((struct stringpool_t *)0)->stringpool_str600, + (int)(long)&((struct stringpool_t *)0)->stringpool_str74, + (int)(long)&((struct stringpool_t *)0)->stringpool_str84, + (int)(long)&((struct stringpool_t *)0)->stringpool_str78, + (int)(long)&((struct stringpool_t *)0)->stringpool_str168, + (int)(long)&((struct stringpool_t *)0)->stringpool_str82, + (int)(long)&((struct stringpool_t *)0)->stringpool_str76, + (int)(long)&((struct stringpool_t *)0)->stringpool_str410, + (int)(long)&((struct stringpool_t *)0)->stringpool_str90, + (int)(long)&((struct stringpool_t *)0)->stringpool_str98, + (int)(long)&((struct stringpool_t *)0)->stringpool_str221, + (int)(long)&((struct stringpool_t *)0)->stringpool_str75, + (int)(long)&((struct stringpool_t *)0)->stringpool_str79, + (int)(long)&((struct stringpool_t *)0)->stringpool_str169, + (int)(long)&((struct stringpool_t *)0)->stringpool_str83, + (int)(long)&((struct stringpool_t *)0)->stringpool_str77, + (int)(long)&((struct stringpool_t *)0)->stringpool_str261, + (int)(long)&((struct stringpool_t *)0)->stringpool_str403, + (int)(long)&((struct stringpool_t *)0)->stringpool_str480, + (int)(long)&((struct stringpool_t *)0)->stringpool_str164, + (int)(long)&((struct stringpool_t *)0)->stringpool_str18, + (int)(long)&((struct stringpool_t *)0)->stringpool_str28, + (int)(long)&((struct stringpool_t *)0)->stringpool_str22, + (int)(long)&((struct stringpool_t *)0)->stringpool_str112, + (int)(long)&((struct stringpool_t *)0)->stringpool_str26, + (int)(long)&((struct stringpool_t *)0)->stringpool_str20, + (int)(long)&((struct stringpool_t *)0)->stringpool_str354, + (int)(long)&((struct stringpool_t *)0)->stringpool_str34, + (int)(long)&((struct stringpool_t *)0)->stringpool_str166, + (int)(long)&((struct stringpool_t *)0)->stringpool_str27, + (int)(long)&((struct stringpool_t *)0)->stringpool_str19, + (int)(long)&((struct stringpool_t *)0)->stringpool_str11, + (int)(long)&((struct stringpool_t *)0)->stringpool_str451, + (int)(long)&((struct stringpool_t *)0)->stringpool_str531, + (int)(long)&((struct stringpool_t *)0)->stringpool_str355, + (int)(long)&((struct stringpool_t *)0)->stringpool_str501, + (int)(long)&((struct stringpool_t *)0)->stringpool_str673, + (int)(long)&((struct stringpool_t *)0)->stringpool_str302, + (int)(long)&((struct stringpool_t *)0)->stringpool_str621, + (int)(long)&((struct stringpool_t *)0)->stringpool_str577, + (int)(long)&((struct stringpool_t *)0)->stringpool_str786, + (int)(long)&((struct stringpool_t *)0)->stringpool_str908, + (int)(long)&((struct stringpool_t *)0)->stringpool_str563, + (int)(long)&((struct stringpool_t *)0)->stringpool_str445, + (int)(long)&((struct stringpool_t *)0)->stringpool_str502, + (int)(long)&((struct stringpool_t *)0)->stringpool_str475, + (int)(long)&((struct stringpool_t *)0)->stringpool_str279, + (int)(long)&((struct stringpool_t *)0)->stringpool_str626, + (int)(long)&((struct stringpool_t *)0)->stringpool_str614, + (int)(long)&((struct stringpool_t *)0)->stringpool_str217, + (int)(long)&((struct stringpool_t *)0)->stringpool_str212, + (int)(long)&((struct stringpool_t *)0)->stringpool_str218, + (int)(long)&((struct stringpool_t *)0)->stringpool_str371, + (int)(long)&((struct stringpool_t *)0)->stringpool_str15, + (int)(long)&((struct stringpool_t *)0)->stringpool_str230, + (int)(long)&((struct stringpool_t *)0)->stringpool_str278, + (int)(long)&((struct stringpool_t *)0)->stringpool_str124, + (int)(long)&((struct stringpool_t *)0)->stringpool_str180, + (int)(long)&((struct stringpool_t *)0)->stringpool_str413, + (int)(long)&((struct stringpool_t *)0)->stringpool_str555, + (int)(long)&((struct stringpool_t *)0)->stringpool_str571, + (int)(long)&((struct stringpool_t *)0)->stringpool_str492, + (int)(long)&((struct stringpool_t *)0)->stringpool_str384, + (int)(long)&((struct stringpool_t *)0)->stringpool_str368, + (int)(long)&((struct stringpool_t *)0)->stringpool_str127, + (int)(long)&((struct stringpool_t *)0)->stringpool_str202, + (int)(long)&((struct stringpool_t *)0)->stringpool_str535, + (int)(long)&((struct stringpool_t *)0)->stringpool_str429, + (int)(long)&((struct stringpool_t *)0)->stringpool_str32, + (int)(long)&((struct stringpool_t *)0)->stringpool_str607, + (int)(long)&((struct stringpool_t *)0)->stringpool_str500, + (int)(long)&((struct stringpool_t *)0)->stringpool_str505, + (int)(long)&((struct stringpool_t *)0)->stringpool_str70, + (int)(long)&((struct stringpool_t *)0)->stringpool_str303, + (int)(long)&((struct stringpool_t *)0)->stringpool_str24, + (int)(long)&((struct stringpool_t *)0)->stringpool_str378, + (int)(long)&((struct stringpool_t *)0)->stringpool_str142, + (int)(long)&((struct stringpool_t *)0)->stringpool_str196, + (int)(long)&((struct stringpool_t *)0)->stringpool_str159, + (int)(long)&((struct stringpool_t *)0)->stringpool_str473, + (int)(long)&((struct stringpool_t *)0)->stringpool_str277, + (int)(long)&((struct stringpool_t *)0)->stringpool_str170, + (int)(long)&((struct stringpool_t *)0)->stringpool_str900, + (int)(long)&((struct stringpool_t *)0)->stringpool_str888, + (int)(long)&((struct stringpool_t *)0)->stringpool_str935, + (int)(long)&((struct stringpool_t *)0)->stringpool_str527, + (int)(long)&((struct stringpool_t *)0)->stringpool_str290, + (int)(long)&((struct stringpool_t *)0)->stringpool_str91, + (int)(long)&((struct stringpool_t *)0)->stringpool_str768, + (int)(long)&((struct stringpool_t *)0)->stringpool_str362, diff --git a/Externals/libiconv-1.14/lib/canonical_aix.h b/Externals/libiconv-1.14/lib/canonical_aix.h new file mode 100644 index 0000000000..6149bc1bf5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_aix.h @@ -0,0 +1,9 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_1, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_2, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_3, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_4, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_5, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_6, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_10, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_14, diff --git a/Externals/libiconv-1.14/lib/canonical_aix_sysaix.h b/Externals/libiconv-1.14/lib/canonical_aix_sysaix.h new file mode 100644 index 0000000000..8b58d1fa8c --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_aix_sysaix.h @@ -0,0 +1,9 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_2, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_4, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_6, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_8, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_10, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_12, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_16, + (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_20, diff --git a/Externals/libiconv-1.14/lib/canonical_dos.h b/Externals/libiconv-1.14/lib/canonical_dos.h new file mode 100644 index 0000000000..aa82651cd4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_dos.h @@ -0,0 +1,15 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_4, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_5, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_8, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_12, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_13, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_17, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_21, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_22, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_26, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_31, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_35, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_38, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_42, + (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_47, diff --git a/Externals/libiconv-1.14/lib/canonical_extra.h b/Externals/libiconv-1.14/lib/canonical_extra.h new file mode 100644 index 0000000000..29678a084e --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_extra.h @@ -0,0 +1,7 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_2, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_4, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_6, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_7, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_9, + (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_11, diff --git a/Externals/libiconv-1.14/lib/canonical_local.h b/Externals/libiconv-1.14/lib/canonical_local.h new file mode 100644 index 0000000000..a2209a820c --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_local.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str271, + (int)(long)&((struct stringpool_t *)0)->stringpool_str664, diff --git a/Externals/libiconv-1.14/lib/canonical_local_sysaix.h b/Externals/libiconv-1.14/lib/canonical_local_sysaix.h new file mode 100644 index 0000000000..0d4b27ba57 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_local_sysaix.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str307, + (int)(long)&((struct stringpool_t *)0)->stringpool_str543, diff --git a/Externals/libiconv-1.14/lib/canonical_local_syshpux.h b/Externals/libiconv-1.14/lib/canonical_local_syshpux.h new file mode 100644 index 0000000000..8e969231a6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_local_syshpux.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str258, + (int)(long)&((struct stringpool_t *)0)->stringpool_str390, diff --git a/Externals/libiconv-1.14/lib/canonical_local_sysosf1.h b/Externals/libiconv-1.14/lib/canonical_local_sysosf1.h new file mode 100644 index 0000000000..e1f886c0d9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_local_sysosf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str275, + (int)(long)&((struct stringpool_t *)0)->stringpool_str465, diff --git a/Externals/libiconv-1.14/lib/canonical_local_syssolaris.h b/Externals/libiconv-1.14/lib/canonical_local_syssolaris.h new file mode 100644 index 0000000000..ce73d70655 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_local_syssolaris.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str38, + (int)(long)&((struct stringpool_t *)0)->stringpool_str515, diff --git a/Externals/libiconv-1.14/lib/canonical_osf1.h b/Externals/libiconv-1.14/lib/canonical_osf1.h new file mode 100644 index 0000000000..0e134ac317 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_osf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_1, diff --git a/Externals/libiconv-1.14/lib/canonical_osf1_sysosf1.h b/Externals/libiconv-1.14/lib/canonical_osf1_sysosf1.h new file mode 100644 index 0000000000..15c2769089 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_osf1_sysosf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_2, diff --git a/Externals/libiconv-1.14/lib/canonical_sysaix.h b/Externals/libiconv-1.14/lib/canonical_sysaix.h new file mode 100644 index 0000000000..00a71f6bd9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_sysaix.h @@ -0,0 +1,110 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str383, + (int)(long)&((struct stringpool_t *)0)->stringpool_str363, + (int)(long)&((struct stringpool_t *)0)->stringpool_str231, + (int)(long)&((struct stringpool_t *)0)->stringpool_str604, + (int)(long)&((struct stringpool_t *)0)->stringpool_str483, + (int)(long)&((struct stringpool_t *)0)->stringpool_str327, + (int)(long)&((struct stringpool_t *)0)->stringpool_str652, + (int)(long)&((struct stringpool_t *)0)->stringpool_str531, + (int)(long)&((struct stringpool_t *)0)->stringpool_str358, + (int)(long)&((struct stringpool_t *)0)->stringpool_str733, + (int)(long)&((struct stringpool_t *)0)->stringpool_str612, + (int)(long)&((struct stringpool_t *)0)->stringpool_str364, + (int)(long)&((struct stringpool_t *)0)->stringpool_str737, + (int)(long)&((struct stringpool_t *)0)->stringpool_str616, + (int)(long)&((struct stringpool_t *)0)->stringpool_str685, + (int)(long)&((struct stringpool_t *)0)->stringpool_str501, + (int)(long)&((struct stringpool_t *)0)->stringpool_str654, + (int)(long)&((struct stringpool_t *)0)->stringpool_str549, + (int)(long)&((struct stringpool_t *)0)->stringpool_str702, + (int)(long)&((struct stringpool_t *)0)->stringpool_str53, + (int)(long)&((struct stringpool_t *)0)->stringpool_str891, + (int)(long)&((struct stringpool_t *)0)->stringpool_str103, + (int)(long)&((struct stringpool_t *)0)->stringpool_str109, + (int)(long)&((struct stringpool_t *)0)->stringpool_str107, + (int)(long)&((struct stringpool_t *)0)->stringpool_str205, + (int)(long)&((struct stringpool_t *)0)->stringpool_str111, + (int)(long)&((struct stringpool_t *)0)->stringpool_str105, + (int)(long)&((struct stringpool_t *)0)->stringpool_str437, + (int)(long)&((struct stringpool_t *)0)->stringpool_str115, + (int)(long)&((struct stringpool_t *)0)->stringpool_str141, + (int)(long)&((struct stringpool_t *)0)->stringpool_str246, + (int)(long)&((struct stringpool_t *)0)->stringpool_str108, + (int)(long)&((struct stringpool_t *)0)->stringpool_str112, + (int)(long)&((struct stringpool_t *)0)->stringpool_str210, + (int)(long)&((struct stringpool_t *)0)->stringpool_str116, + (int)(long)&((struct stringpool_t *)0)->stringpool_str110, + (int)(long)&((struct stringpool_t *)0)->stringpool_str254, + (int)(long)&((struct stringpool_t *)0)->stringpool_str492, + (int)(long)&((struct stringpool_t *)0)->stringpool_str569, + (int)(long)&((struct stringpool_t *)0)->stringpool_str175, + (int)(long)&((struct stringpool_t *)0)->stringpool_str37, + (int)(long)&((struct stringpool_t *)0)->stringpool_str43, + (int)(long)&((struct stringpool_t *)0)->stringpool_str41, + (int)(long)&((struct stringpool_t *)0)->stringpool_str139, + (int)(long)&((struct stringpool_t *)0)->stringpool_str45, + (int)(long)&((struct stringpool_t *)0)->stringpool_str39, + (int)(long)&((struct stringpool_t *)0)->stringpool_str371, + (int)(long)&((struct stringpool_t *)0)->stringpool_str49, + (int)(long)&((struct stringpool_t *)0)->stringpool_str173, + (int)(long)&((struct stringpool_t *)0)->stringpool_str38, + (int)(long)&((struct stringpool_t *)0)->stringpool_str34, + (int)(long)&((struct stringpool_t *)0)->stringpool_str32, + (int)(long)&((struct stringpool_t *)0)->stringpool_str525, + (int)(long)&((struct stringpool_t *)0)->stringpool_str797, + (int)(long)&((struct stringpool_t *)0)->stringpool_str462, + (int)(long)&((struct stringpool_t *)0)->stringpool_str583, + (int)(long)&((struct stringpool_t *)0)->stringpool_str807, + (int)(long)&((struct stringpool_t *)0)->stringpool_str272, + (int)(long)&((struct stringpool_t *)0)->stringpool_str898, + (int)(long)&((struct stringpool_t *)0)->stringpool_str606, + (int)(long)&((struct stringpool_t *)0)->stringpool_str662, + (int)(long)&((struct stringpool_t *)0)->stringpool_str989, + (int)(long)&((struct stringpool_t *)0)->stringpool_str648, + (int)(long)&((struct stringpool_t *)0)->stringpool_str391, + (int)(long)&((struct stringpool_t *)0)->stringpool_str487, + (int)(long)&((struct stringpool_t *)0)->stringpool_str413, + (int)(long)&((struct stringpool_t *)0)->stringpool_str330, + (int)(long)&((struct stringpool_t *)0)->stringpool_str461, + (int)(long)&((struct stringpool_t *)0)->stringpool_str335, + (int)(long)&((struct stringpool_t *)0)->stringpool_str152, + (int)(long)&((struct stringpool_t *)0)->stringpool_str171, + (int)(long)&((struct stringpool_t *)0)->stringpool_str234, + (int)(long)&((struct stringpool_t *)0)->stringpool_str445, + (int)(long)&((struct stringpool_t *)0)->stringpool_str36, + (int)(long)&((struct stringpool_t *)0)->stringpool_str207, + (int)(long)&((struct stringpool_t *)0)->stringpool_str300, + (int)(long)&((struct stringpool_t *)0)->stringpool_str217, + (int)(long)&((struct stringpool_t *)0)->stringpool_str256, + (int)(long)&((struct stringpool_t *)0)->stringpool_str567, + (int)(long)&((struct stringpool_t *)0)->stringpool_str723, + (int)(long)&((struct stringpool_t *)0)->stringpool_str735, + (int)(long)&((struct stringpool_t *)0)->stringpool_str660, + (int)(long)&((struct stringpool_t *)0)->stringpool_str258, + (int)(long)&((struct stringpool_t *)0)->stringpool_str235, + (int)(long)&((struct stringpool_t *)0)->stringpool_str149, + (int)(long)&((struct stringpool_t *)0)->stringpool_str202, + (int)(long)&((struct stringpool_t *)0)->stringpool_str638, + (int)(long)&((struct stringpool_t *)0)->stringpool_str613, + (int)(long)&((struct stringpool_t *)0)->stringpool_str52, + (int)(long)&((struct stringpool_t *)0)->stringpool_str629, + (int)(long)&((struct stringpool_t *)0)->stringpool_str591, + (int)(long)&((struct stringpool_t *)0)->stringpool_str594, + (int)(long)&((struct stringpool_t *)0)->stringpool_str188, + (int)(long)&((struct stringpool_t *)0)->stringpool_str146, + (int)(long)&((struct stringpool_t *)0)->stringpool_str48, + (int)(long)&((struct stringpool_t *)0)->stringpool_str251, + (int)(long)&((struct stringpool_t *)0)->stringpool_str179, + (int)(long)&((struct stringpool_t *)0)->stringpool_str190, + (int)(long)&((struct stringpool_t *)0)->stringpool_str92, + (int)(long)&((struct stringpool_t *)0)->stringpool_str495, + (int)(long)&((struct stringpool_t *)0)->stringpool_str153, + (int)(long)&((struct stringpool_t *)0)->stringpool_str186, + (int)(long)&((struct stringpool_t *)0)->stringpool_str603, + (int)(long)&((struct stringpool_t *)0)->stringpool_str584, + (int)(long)&((struct stringpool_t *)0)->stringpool_str635, + (int)(long)&((struct stringpool_t *)0)->stringpool_str324, + (int)(long)&((struct stringpool_t *)0)->stringpool_str369, + (int)(long)&((struct stringpool_t *)0)->stringpool_str133, + (int)(long)&((struct stringpool_t *)0)->stringpool_str885, + (int)(long)&((struct stringpool_t *)0)->stringpool_str360, diff --git a/Externals/libiconv-1.14/lib/canonical_syshpux.h b/Externals/libiconv-1.14/lib/canonical_syshpux.h new file mode 100644 index 0000000000..390355b73f --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_syshpux.h @@ -0,0 +1,110 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str310, + (int)(long)&((struct stringpool_t *)0)->stringpool_str368, + (int)(long)&((struct stringpool_t *)0)->stringpool_str293, + (int)(long)&((struct stringpool_t *)0)->stringpool_str464, + (int)(long)&((struct stringpool_t *)0)->stringpool_str525, + (int)(long)&((struct stringpool_t *)0)->stringpool_str395, + (int)(long)&((struct stringpool_t *)0)->stringpool_str515, + (int)(long)&((struct stringpool_t *)0)->stringpool_str576, + (int)(long)&((struct stringpool_t *)0)->stringpool_str355, + (int)(long)&((struct stringpool_t *)0)->stringpool_str521, + (int)(long)&((struct stringpool_t *)0)->stringpool_str582, + (int)(long)&((struct stringpool_t *)0)->stringpool_str363, + (int)(long)&((struct stringpool_t *)0)->stringpool_str534, + (int)(long)&((struct stringpool_t *)0)->stringpool_str595, + (int)(long)&((struct stringpool_t *)0)->stringpool_str440, + (int)(long)&((struct stringpool_t *)0)->stringpool_str665, + (int)(long)&((struct stringpool_t *)0)->stringpool_str644, + (int)(long)&((struct stringpool_t *)0)->stringpool_str716, + (int)(long)&((struct stringpool_t *)0)->stringpool_str695, + (int)(long)&((struct stringpool_t *)0)->stringpool_str36, + (int)(long)&((struct stringpool_t *)0)->stringpool_str596, + (int)(long)&((struct stringpool_t *)0)->stringpool_str64, + (int)(long)&((struct stringpool_t *)0)->stringpool_str60, + (int)(long)&((struct stringpool_t *)0)->stringpool_str100, + (int)(long)&((struct stringpool_t *)0)->stringpool_str162, + (int)(long)&((struct stringpool_t *)0)->stringpool_str76, + (int)(long)&((struct stringpool_t *)0)->stringpool_str70, + (int)(long)&((struct stringpool_t *)0)->stringpool_str158, + (int)(long)&((struct stringpool_t *)0)->stringpool_str86, + (int)(long)&((struct stringpool_t *)0)->stringpool_str92, + (int)(long)&((struct stringpool_t *)0)->stringpool_str177, + (int)(long)&((struct stringpool_t *)0)->stringpool_str67, + (int)(long)&((struct stringpool_t *)0)->stringpool_str103, + (int)(long)&((struct stringpool_t *)0)->stringpool_str165, + (int)(long)&((struct stringpool_t *)0)->stringpool_str79, + (int)(long)&((struct stringpool_t *)0)->stringpool_str73, + (int)(long)&((struct stringpool_t *)0)->stringpool_str345, + (int)(long)&((struct stringpool_t *)0)->stringpool_str669, + (int)(long)&((struct stringpool_t *)0)->stringpool_str790, + (int)(long)&((struct stringpool_t *)0)->stringpool_str131, + (int)(long)&((struct stringpool_t *)0)->stringpool_str21, + (int)(long)&((struct stringpool_t *)0)->stringpool_str17, + (int)(long)&((struct stringpool_t *)0)->stringpool_str57, + (int)(long)&((struct stringpool_t *)0)->stringpool_str119, + (int)(long)&((struct stringpool_t *)0)->stringpool_str33, + (int)(long)&((struct stringpool_t *)0)->stringpool_str27, + (int)(long)&((struct stringpool_t *)0)->stringpool_str115, + (int)(long)&((struct stringpool_t *)0)->stringpool_str43, + (int)(long)&((struct stringpool_t *)0)->stringpool_str141, + (int)(long)&((struct stringpool_t *)0)->stringpool_str24, + (int)(long)&((struct stringpool_t *)0)->stringpool_str34, + (int)(long)&((struct stringpool_t *)0)->stringpool_str35, + (int)(long)&((struct stringpool_t *)0)->stringpool_str448, + (int)(long)&((struct stringpool_t *)0)->stringpool_str561, + (int)(long)&((struct stringpool_t *)0)->stringpool_str410, + (int)(long)&((struct stringpool_t *)0)->stringpool_str335, + (int)(long)&((struct stringpool_t *)0)->stringpool_str470, + (int)(long)&((struct stringpool_t *)0)->stringpool_str704, + (int)(long)&((struct stringpool_t *)0)->stringpool_str685, + (int)(long)&((struct stringpool_t *)0)->stringpool_str607, + (int)(long)&((struct stringpool_t *)0)->stringpool_str689, + (int)(long)&((struct stringpool_t *)0)->stringpool_str800, + (int)(long)&((struct stringpool_t *)0)->stringpool_str454, + (int)(long)&((struct stringpool_t *)0)->stringpool_str195, + (int)(long)&((struct stringpool_t *)0)->stringpool_str331, + (int)(long)&((struct stringpool_t *)0)->stringpool_str484, + (int)(long)&((struct stringpool_t *)0)->stringpool_str202, + (int)(long)&((struct stringpool_t *)0)->stringpool_str449, + (int)(long)&((struct stringpool_t *)0)->stringpool_str513, + (int)(long)&((struct stringpool_t *)0)->stringpool_str139, + (int)(long)&((struct stringpool_t *)0)->stringpool_str190, + (int)(long)&((struct stringpool_t *)0)->stringpool_str262, + (int)(long)&((struct stringpool_t *)0)->stringpool_str603, + (int)(long)&((struct stringpool_t *)0)->stringpool_str71, + (int)(long)&((struct stringpool_t *)0)->stringpool_str149, + (int)(long)&((struct stringpool_t *)0)->stringpool_str170, + (int)(long)&((struct stringpool_t *)0)->stringpool_str251, + (int)(long)&((struct stringpool_t *)0)->stringpool_str271, + (int)(long)&((struct stringpool_t *)0)->stringpool_str450, + (int)(long)&((struct stringpool_t *)0)->stringpool_str769, + (int)(long)&((struct stringpool_t *)0)->stringpool_str791, + (int)(long)&((struct stringpool_t *)0)->stringpool_str710, + (int)(long)&((struct stringpool_t *)0)->stringpool_str354, + (int)(long)&((struct stringpool_t *)0)->stringpool_str332, + (int)(long)&((struct stringpool_t *)0)->stringpool_str153, + (int)(long)&((struct stringpool_t *)0)->stringpool_str203, + (int)(long)&((struct stringpool_t *)0)->stringpool_str491, + (int)(long)&((struct stringpool_t *)0)->stringpool_str461, + (int)(long)&((struct stringpool_t *)0)->stringpool_str42, + (int)(long)&((struct stringpool_t *)0)->stringpool_str542, + (int)(long)&((struct stringpool_t *)0)->stringpool_str473, + (int)(long)&((struct stringpool_t *)0)->stringpool_str471, + (int)(long)&((struct stringpool_t *)0)->stringpool_str30, + (int)(long)&((struct stringpool_t *)0)->stringpool_str314, + (int)(long)&((struct stringpool_t *)0)->stringpool_str52, + (int)(long)&((struct stringpool_t *)0)->stringpool_str352, + (int)(long)&((struct stringpool_t *)0)->stringpool_str81, + (int)(long)&((struct stringpool_t *)0)->stringpool_str96, + (int)(long)&((struct stringpool_t *)0)->stringpool_str12, + (int)(long)&((struct stringpool_t *)0)->stringpool_str378, + (int)(long)&((struct stringpool_t *)0)->stringpool_str308, + (int)(long)&((struct stringpool_t *)0)->stringpool_str144, + (int)(long)&((struct stringpool_t *)0)->stringpool_str771, + (int)(long)&((struct stringpool_t *)0)->stringpool_str757, + (int)(long)&((struct stringpool_t *)0)->stringpool_str806, + (int)(long)&((struct stringpool_t *)0)->stringpool_str421, + (int)(long)&((struct stringpool_t *)0)->stringpool_str343, + (int)(long)&((struct stringpool_t *)0)->stringpool_str105, + (int)(long)&((struct stringpool_t *)0)->stringpool_str654, + (int)(long)&((struct stringpool_t *)0)->stringpool_str394, diff --git a/Externals/libiconv-1.14/lib/canonical_sysosf1.h b/Externals/libiconv-1.14/lib/canonical_sysosf1.h new file mode 100644 index 0000000000..659a516aa2 --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_sysosf1.h @@ -0,0 +1,110 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str343, + (int)(long)&((struct stringpool_t *)0)->stringpool_str294, + (int)(long)&((struct stringpool_t *)0)->stringpool_str223, + (int)(long)&((struct stringpool_t *)0)->stringpool_str591, + (int)(long)&((struct stringpool_t *)0)->stringpool_str433, + (int)(long)&((struct stringpool_t *)0)->stringpool_str319, + (int)(long)&((struct stringpool_t *)0)->stringpool_str639, + (int)(long)&((struct stringpool_t *)0)->stringpool_str481, + (int)(long)&((struct stringpool_t *)0)->stringpool_str289, + (int)(long)&((struct stringpool_t *)0)->stringpool_str659, + (int)(long)&((struct stringpool_t *)0)->stringpool_str501, + (int)(long)&((struct stringpool_t *)0)->stringpool_str295, + (int)(long)&((struct stringpool_t *)0)->stringpool_str663, + (int)(long)&((struct stringpool_t *)0)->stringpool_str505, + (int)(long)&((struct stringpool_t *)0)->stringpool_str586, + (int)(long)&((struct stringpool_t *)0)->stringpool_str472, + (int)(long)&((struct stringpool_t *)0)->stringpool_str695, + (int)(long)&((struct stringpool_t *)0)->stringpool_str520, + (int)(long)&((struct stringpool_t *)0)->stringpool_str743, + (int)(long)&((struct stringpool_t *)0)->stringpool_str53, + (int)(long)&((struct stringpool_t *)0)->stringpool_str711, + (int)(long)&((struct stringpool_t *)0)->stringpool_str103, + (int)(long)&((struct stringpool_t *)0)->stringpool_str109, + (int)(long)&((struct stringpool_t *)0)->stringpool_str107, + (int)(long)&((struct stringpool_t *)0)->stringpool_str205, + (int)(long)&((struct stringpool_t *)0)->stringpool_str111, + (int)(long)&((struct stringpool_t *)0)->stringpool_str105, + (int)(long)&((struct stringpool_t *)0)->stringpool_str407, + (int)(long)&((struct stringpool_t *)0)->stringpool_str115, + (int)(long)&((struct stringpool_t *)0)->stringpool_str141, + (int)(long)&((struct stringpool_t *)0)->stringpool_str246, + (int)(long)&((struct stringpool_t *)0)->stringpool_str108, + (int)(long)&((struct stringpool_t *)0)->stringpool_str112, + (int)(long)&((struct stringpool_t *)0)->stringpool_str210, + (int)(long)&((struct stringpool_t *)0)->stringpool_str116, + (int)(long)&((struct stringpool_t *)0)->stringpool_str110, + (int)(long)&((struct stringpool_t *)0)->stringpool_str280, + (int)(long)&((struct stringpool_t *)0)->stringpool_str410, + (int)(long)&((struct stringpool_t *)0)->stringpool_str487, + (int)(long)&((struct stringpool_t *)0)->stringpool_str175, + (int)(long)&((struct stringpool_t *)0)->stringpool_str37, + (int)(long)&((struct stringpool_t *)0)->stringpool_str43, + (int)(long)&((struct stringpool_t *)0)->stringpool_str41, + (int)(long)&((struct stringpool_t *)0)->stringpool_str139, + (int)(long)&((struct stringpool_t *)0)->stringpool_str45, + (int)(long)&((struct stringpool_t *)0)->stringpool_str39, + (int)(long)&((struct stringpool_t *)0)->stringpool_str341, + (int)(long)&((struct stringpool_t *)0)->stringpool_str49, + (int)(long)&((struct stringpool_t *)0)->stringpool_str173, + (int)(long)&((struct stringpool_t *)0)->stringpool_str38, + (int)(long)&((struct stringpool_t *)0)->stringpool_str34, + (int)(long)&((struct stringpool_t *)0)->stringpool_str32, + (int)(long)&((struct stringpool_t *)0)->stringpool_str543, + (int)(long)&((struct stringpool_t *)0)->stringpool_str727, + (int)(long)&((struct stringpool_t *)0)->stringpool_str428, + (int)(long)&((struct stringpool_t *)0)->stringpool_str544, + (int)(long)&((struct stringpool_t *)0)->stringpool_str761, + (int)(long)&((struct stringpool_t *)0)->stringpool_str281, + (int)(long)&((struct stringpool_t *)0)->stringpool_str821, + (int)(long)&((struct stringpool_t *)0)->stringpool_str649, + (int)(long)&((struct stringpool_t *)0)->stringpool_str661, + (int)(long)&((struct stringpool_t *)0)->stringpool_str939, + (int)(long)&((struct stringpool_t *)0)->stringpool_str646, + (int)(long)&((struct stringpool_t *)0)->stringpool_str362, + (int)(long)&((struct stringpool_t *)0)->stringpool_str458, + (int)(long)&((struct stringpool_t *)0)->stringpool_str500, + (int)(long)&((struct stringpool_t *)0)->stringpool_str369, + (int)(long)&((struct stringpool_t *)0)->stringpool_str397, + (int)(long)&((struct stringpool_t *)0)->stringpool_str442, + (int)(long)&((struct stringpool_t *)0)->stringpool_str178, + (int)(long)&((struct stringpool_t *)0)->stringpool_str202, + (int)(long)&((struct stringpool_t *)0)->stringpool_str234, + (int)(long)&((struct stringpool_t *)0)->stringpool_str417, + (int)(long)&((struct stringpool_t *)0)->stringpool_str36, + (int)(long)&((struct stringpool_t *)0)->stringpool_str253, + (int)(long)&((struct stringpool_t *)0)->stringpool_str285, + (int)(long)&((struct stringpool_t *)0)->stringpool_str245, + (int)(long)&((struct stringpool_t *)0)->stringpool_str238, + (int)(long)&((struct stringpool_t *)0)->stringpool_str515, + (int)(long)&((struct stringpool_t *)0)->stringpool_str671, + (int)(long)&((struct stringpool_t *)0)->stringpool_str683, + (int)(long)&((struct stringpool_t *)0)->stringpool_str608, + (int)(long)&((struct stringpool_t *)0)->stringpool_str266, + (int)(long)&((struct stringpool_t *)0)->stringpool_str243, + (int)(long)&((struct stringpool_t *)0)->stringpool_str149, + (int)(long)&((struct stringpool_t *)0)->stringpool_str228, + (int)(long)&((struct stringpool_t *)0)->stringpool_str581, + (int)(long)&((struct stringpool_t *)0)->stringpool_str638, + (int)(long)&((struct stringpool_t *)0)->stringpool_str52, + (int)(long)&((struct stringpool_t *)0)->stringpool_str593, + (int)(long)&((struct stringpool_t *)0)->stringpool_str524, + (int)(long)&((struct stringpool_t *)0)->stringpool_str527, + (int)(long)&((struct stringpool_t *)0)->stringpool_str167, + (int)(long)&((struct stringpool_t *)0)->stringpool_str206, + (int)(long)&((struct stringpool_t *)0)->stringpool_str48, + (int)(long)&((struct stringpool_t *)0)->stringpool_str259, + (int)(long)&((struct stringpool_t *)0)->stringpool_str179, + (int)(long)&((struct stringpool_t *)0)->stringpool_str190, + (int)(long)&((struct stringpool_t *)0)->stringpool_str60, + (int)(long)&((struct stringpool_t *)0)->stringpool_str426, + (int)(long)&((struct stringpool_t *)0)->stringpool_str198, + (int)(long)&((struct stringpool_t *)0)->stringpool_str186, + (int)(long)&((struct stringpool_t *)0)->stringpool_str784, + (int)(long)&((struct stringpool_t *)0)->stringpool_str765, + (int)(long)&((struct stringpool_t *)0)->stringpool_str816, + (int)(long)&((struct stringpool_t *)0)->stringpool_str511, + (int)(long)&((struct stringpool_t *)0)->stringpool_str374, + (int)(long)&((struct stringpool_t *)0)->stringpool_str133, + (int)(long)&((struct stringpool_t *)0)->stringpool_str807, + (int)(long)&((struct stringpool_t *)0)->stringpool_str386, diff --git a/Externals/libiconv-1.14/lib/canonical_syssolaris.h b/Externals/libiconv-1.14/lib/canonical_syssolaris.h new file mode 100644 index 0000000000..72ad33a50e --- /dev/null +++ b/Externals/libiconv-1.14/lib/canonical_syssolaris.h @@ -0,0 +1,110 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str463, + (int)(long)&((struct stringpool_t *)0)->stringpool_str258, + (int)(long)&((struct stringpool_t *)0)->stringpool_str314, + (int)(long)&((struct stringpool_t *)0)->stringpool_str482, + (int)(long)&((struct stringpool_t *)0)->stringpool_str365, + (int)(long)&((struct stringpool_t *)0)->stringpool_str278, + (int)(long)&((struct stringpool_t *)0)->stringpool_str464, + (int)(long)&((struct stringpool_t *)0)->stringpool_str347, + (int)(long)&((struct stringpool_t *)0)->stringpool_str279, + (int)(long)&((struct stringpool_t *)0)->stringpool_str470, + (int)(long)&((struct stringpool_t *)0)->stringpool_str353, + (int)(long)&((struct stringpool_t *)0)->stringpool_str378, + (int)(long)&((struct stringpool_t *)0)->stringpool_str546, + (int)(long)&((struct stringpool_t *)0)->stringpool_str429, + (int)(long)&((struct stringpool_t *)0)->stringpool_str588, + (int)(long)&((struct stringpool_t *)0)->stringpool_str510, + (int)(long)&((struct stringpool_t *)0)->stringpool_str563, + (int)(long)&((struct stringpool_t *)0)->stringpool_str492, + (int)(long)&((struct stringpool_t *)0)->stringpool_str545, + (int)(long)&((struct stringpool_t *)0)->stringpool_str30, + (int)(long)&((struct stringpool_t *)0)->stringpool_str569, + (int)(long)&((struct stringpool_t *)0)->stringpool_str124, + (int)(long)&((struct stringpool_t *)0)->stringpool_str184, + (int)(long)&((struct stringpool_t *)0)->stringpool_str230, + (int)(long)&((struct stringpool_t *)0)->stringpool_str148, + (int)(long)&((struct stringpool_t *)0)->stringpool_str160, + (int)(long)&((struct stringpool_t *)0)->stringpool_str138, + (int)(long)&((struct stringpool_t *)0)->stringpool_str452, + (int)(long)&((struct stringpool_t *)0)->stringpool_str122, + (int)(long)&((struct stringpool_t *)0)->stringpool_str136, + (int)(long)&((struct stringpool_t *)0)->stringpool_str175, + (int)(long)&((struct stringpool_t *)0)->stringpool_str129, + (int)(long)&((struct stringpool_t *)0)->stringpool_str235, + (int)(long)&((struct stringpool_t *)0)->stringpool_str153, + (int)(long)&((struct stringpool_t *)0)->stringpool_str165, + (int)(long)&((struct stringpool_t *)0)->stringpool_str143, + (int)(long)&((struct stringpool_t *)0)->stringpool_str276, + (int)(long)&((struct stringpool_t *)0)->stringpool_str680, + (int)(long)&((struct stringpool_t *)0)->stringpool_str684, + (int)(long)&((struct stringpool_t *)0)->stringpool_str127, + (int)(long)&((struct stringpool_t *)0)->stringpool_str81, + (int)(long)&((struct stringpool_t *)0)->stringpool_str141, + (int)(long)&((struct stringpool_t *)0)->stringpool_str187, + (int)(long)&((struct stringpool_t *)0)->stringpool_str105, + (int)(long)&((struct stringpool_t *)0)->stringpool_str117, + (int)(long)&((struct stringpool_t *)0)->stringpool_str95, + (int)(long)&((struct stringpool_t *)0)->stringpool_str409, + (int)(long)&((struct stringpool_t *)0)->stringpool_str79, + (int)(long)&((struct stringpool_t *)0)->stringpool_str91, + (int)(long)&((struct stringpool_t *)0)->stringpool_str94, + (int)(long)&((struct stringpool_t *)0)->stringpool_str48, + (int)(long)&((struct stringpool_t *)0)->stringpool_str86, + (int)(long)&((struct stringpool_t *)0)->stringpool_str387, + (int)(long)&((struct stringpool_t *)0)->stringpool_str451, + (int)(long)&((struct stringpool_t *)0)->stringpool_str346, + (int)(long)&((struct stringpool_t *)0)->stringpool_str415, + (int)(long)&((struct stringpool_t *)0)->stringpool_str489, + (int)(long)&((struct stringpool_t *)0)->stringpool_str389, + (int)(long)&((struct stringpool_t *)0)->stringpool_str752, + (int)(long)&((struct stringpool_t *)0)->stringpool_str774, + (int)(long)&((struct stringpool_t *)0)->stringpool_str953, + (int)(long)&((struct stringpool_t *)0)->stringpool_str853, + (int)(long)&((struct stringpool_t *)0)->stringpool_str432, + (int)(long)&((struct stringpool_t *)0)->stringpool_str513, + (int)(long)&((struct stringpool_t *)0)->stringpool_str297, + (int)(long)&((struct stringpool_t *)0)->stringpool_str502, + (int)(long)&((struct stringpool_t *)0)->stringpool_str372, + (int)(long)&((struct stringpool_t *)0)->stringpool_str412, + (int)(long)&((struct stringpool_t *)0)->stringpool_str419, + (int)(long)&((struct stringpool_t *)0)->stringpool_str478, + (int)(long)&((struct stringpool_t *)0)->stringpool_str71, + (int)(long)&((struct stringpool_t *)0)->stringpool_str62, + (int)(long)&((struct stringpool_t *)0)->stringpool_str266, + (int)(long)&((struct stringpool_t *)0)->stringpool_str192, + (int)(long)&((struct stringpool_t *)0)->stringpool_str246, + (int)(long)&((struct stringpool_t *)0)->stringpool_str215, + (int)(long)&((struct stringpool_t *)0)->stringpool_str424, + (int)(long)&((struct stringpool_t *)0)->stringpool_str307, + (int)(long)&((struct stringpool_t *)0)->stringpool_str507, + (int)(long)&((struct stringpool_t *)0)->stringpool_str669, + (int)(long)&((struct stringpool_t *)0)->stringpool_str667, + (int)(long)&((struct stringpool_t *)0)->stringpool_str706, + (int)(long)&((struct stringpool_t *)0)->stringpool_str211, + (int)(long)&((struct stringpool_t *)0)->stringpool_str320, + (int)(long)&((struct stringpool_t *)0)->stringpool_str202, + (int)(long)&((struct stringpool_t *)0)->stringpool_str283, + (int)(long)&((struct stringpool_t *)0)->stringpool_str400, + (int)(long)&((struct stringpool_t *)0)->stringpool_str714, + (int)(long)&((struct stringpool_t *)0)->stringpool_str147, + (int)(long)&((struct stringpool_t *)0)->stringpool_str556, + (int)(long)&((struct stringpool_t *)0)->stringpool_str554, + (int)(long)&((struct stringpool_t *)0)->stringpool_str584, + (int)(long)&((struct stringpool_t *)0)->stringpool_str67, + (int)(long)&((struct stringpool_t *)0)->stringpool_str516, + (int)(long)&((struct stringpool_t *)0)->stringpool_str101, + (int)(long)&((struct stringpool_t *)0)->stringpool_str271, + (int)(long)&((struct stringpool_t *)0)->stringpool_str223, + (int)(long)&((struct stringpool_t *)0)->stringpool_str327, + (int)(long)&((struct stringpool_t *)0)->stringpool_str99, + (int)(long)&((struct stringpool_t *)0)->stringpool_str540, + (int)(long)&((struct stringpool_t *)0)->stringpool_str293, + (int)(long)&((struct stringpool_t *)0)->stringpool_str98, + (int)(long)&((struct stringpool_t *)0)->stringpool_str901, + (int)(long)&((struct stringpool_t *)0)->stringpool_str895, + (int)(long)&((struct stringpool_t *)0)->stringpool_str907, + (int)(long)&((struct stringpool_t *)0)->stringpool_str666, + (int)(long)&((struct stringpool_t *)0)->stringpool_str255, + (int)(long)&((struct stringpool_t *)0)->stringpool_str58, + (int)(long)&((struct stringpool_t *)0)->stringpool_str691, + (int)(long)&((struct stringpool_t *)0)->stringpool_str411, diff --git a/Externals/libiconv-1.14/lib/ces_big5.h b/Externals/libiconv-1.14/lib/ces_big5.h new file mode 100644 index 0000000000..2f87735bcd --- /dev/null +++ b/Externals/libiconv-1.14/lib/ces_big5.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * BIG-5 + */ + +static int +ces_big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) + return big5_mbtowc(conv,pwc,s,2); + else + return RET_ILSEQ; + } + } + return RET_ILSEQ; +} + +static int +ces_big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (BIG5) */ + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ces_gbk.h b/Externals/libiconv-1.14/lib/ces_gbk.h new file mode 100644 index 0000000000..69e61f7dc5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ces_gbk.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GBK + */ + +static int +ces_gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + + /* Code set 0 (ASCII or GB 1988-89) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (GBK) */ + if (c >= 0x81 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + return gbk_mbtowc(conv,pwc,s,2); + } + return RET_ILSEQ; +} + +static int +ces_gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or GB 1988-89) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (GBK) */ + ret = gbk_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cjk_variants.h b/Externals/libiconv-1.14/lib/cjk_variants.h new file mode 100644 index 0000000000..23cb4b3263 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cjk_variants.h @@ -0,0 +1,4241 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CJK variants table + */ + +static const unsigned short cjk_variants[12038] = { + 0x9e44, 0x1e2a, 0x200b, 0xcb87, 0xaf0c, 0x9e0a, 0x9e0b, 0xd42c, + 0x23c1, 0xaf0e, 0x9e04, 0x9e05, 0xa176, 0xd207, 0x2303, 0xa304, + 0x1e12, 0x619c, 0xeb57, 0x9e11, 0x2c02, 0xac08, 0x1e17, 0xa34b, + 0x1e16, 0xa34b, 0x1e20, 0xa775, 0xb96d, 0x23e2, 0x3a37, 0x3b09, + 0xd5c2, 0xb771, 0x4cf8, 0xcd72, 0x1e22, 0xa3be, 0x1e18, 0xa775, + 0x1e24, 0xa169, 0x1e1f, 0xa3be, 0xe149, 0x1e21, 0xa169, 0x23b3, + 0xa6b4, 0x20a1, 0x2e76, 0xcadd, 0xa5aa, 0x00f6, 0x200b, 0xcb87, + 0x3792, 0x3860, 0xb90f, 0xc23f, 0x5c4a, 0x5c50, 0x673b, 0x674a, + 0x68a8, 0xe8ce, 0x9e33, 0x9e32, 0xd1e8, 0x40ba, 0xc232, 0x2a6f, + 0xee97, 0x3319, 0x34e7, 0xd209, 0xa3ca, 0x2208, 0xd2c5, 0x2efc, + 0xdffa, 0x0006, 0x9e94, 0x1e46, 0xe579, 0x1e45, 0xe579, 0x2c1b, + 0x2e7a, 0x2e85, 0x6ebc, 0xeebd, 0xcfa9, 0xc0cf, 0x397d, 0xba02, + 0x1f17, 0x3500, 0x473e, 0xd846, 0xa5ac, 0x564e, 0xd65d, 0x1e58, + 0xb909, 0x1e57, 0xb909, 0x6690, 0x66a0, 0xe6b1, 0xcfd2, 0x60f7, + 0x6109, 0x610a, 0xe115, 0xb6f8, 0x2158, 0xa9cb, 0xdcb7, 0x1e82, + 0xe1e0, 0x1e7e, 0x1e81, 0xbf27, 0x1e79, 0x1e81, 0x2e72, 0xbf27, + 0x6f9c, 0xef9f, 0x1e79, 0x1e7e, 0xbf27, 0x1e71, 0xe1e0, 0x36b8, + 0xc7ad, 0xdc6b, 0xc22d, 0x1e8b, 0xa3d3, 0x1e8a, 0xa3d3, 0xaf0d, + 0x1e8f, 0x1e90, 0xb5bc, 0x1e8e, 0x1e90, 0x35bc, 0xd667, 0x1e8e, + 0x9e8f, 0x1f1d, 0xe6f2, 0x9e44, 0xa6db, 0x2c81, 0x2d57, 0x3b72, + 0xbb73, 0x9e99, 0x9e98, 0x1e9c, 0x9e9e, 0x1e9a, 0x9e9e, 0x3589, + 0x358a, 0x6f4a, 0xef50, 0x1e9a, 0x9e9c, 0xc10f, 0x1ebe, 0xa166, + 0x4522, 0xc523, 0x4546, 0x4552, 0x455d, 0xc55e, 0x9eaf, 0x9eb0, + 0x9eab, 0x9eac, 0xa91c, 0xd9aa, 0xd93b, 0xa6b2, 0x9ebb, 0x9eba, + 0x1ea1, 0xa166, 0xa104, 0xafce, 0x20cd, 0x22a8, 0xa2d5, 0x1ed8, + 0xa0c5, 0xa0d5, 0xdb8e, 0xa0df, 0x21ab, 0x21b0, 0xbc37, 0x2f93, + 0xaf9e, 0x9f5b, 0x1f1e, 0xa098, 0x1f96, 0x2d18, 0xad19, 0x1efa, + 0xa009, 0x9ec5, 0x20ca, 0xa0f2, 0xa40c, 0x9eed, 0xaf74, 0x214f, + 0x6577, 0x6578, 0xe57f, 0xa100, 0xa011, 0x9ede, 0x2047, 0xa3cd, + 0x1fa1, 0xa0f9, 0x1ed3, 0xa009, 0x9fc7, 0x2f6c, 0xb58c, 0x9f4e, + 0x2023, 0x2f77, 0x2fac, 0x4706, 0xeae3, 0x20a0, 0xc26b, 0xae11, + 0x1e51, 0x473e, 0xd846, 0xa12a, 0xa925, 0xb703, 0xa0b4, 0xa005, + 0x1e91, 0x1f20, 0xa0b3, 0x1ed0, 0x2098, 0xce56, 0xa049, 0x1f1d, + 0xa0b3, 0x9fe5, 0x9fd4, 0xa0b7, 0xa000, 0xa02b, 0xa096, 0x207d, + 0xa0de, 0x1f47, 0xcada, 0xa2aa, 0x1f32, 0x1f60, 0xa11e, 0x1f31, + 0x1f60, 0xa11e, 0x9f90, 0xd0c4, 0x9f40, 0x9f3c, 0xb014, 0x9f2b, + 0xae03, 0x9efe, 0x4b28, 0x5eb0, 0x5ec6, 0x6ab5, 0xead4, 0xa360, + 0x6918, 0xe980, 0x1ecf, 0x2f7f, 0xeaf4, 0xa05a, 0x9fab, 0x1f31, + 0x1f32, 0x211e, 0xa9b3, 0xa0ad, 0xa0c9, 0xaf8a, 0x3cd5, 0xc04b, + 0x2002, 0xae76, 0xaf88, 0xa058, 0x29b7, 0xa9ea, 0xb765, 0x6625, + 0x6634, 0x6670, 0xe682, 0xb549, 0x9f35, 0x9ed1, 0x5350, 0xd5a6, + 0x9fe0, 0x1ef7, 0xa0f9, 0x9fb6, 0xa0e5, 0x2075, 0xe049, 0xa074, + 0xa0d1, 0xa108, 0xa115, 0x9f5e, 0xa102, 0x2118, 0xac3d, 0xc7e6, + 0x9fa3, 0xac40, 0xc537, 0x9fe3, 0xccfb, 0x9efc, 0xa101, 0xdf14, + 0xc23c, 0x1f23, 0xb093, 0xa16a, 0xcae2, 0x9fa0, 0xda2b, 0x9fee, + 0x9fc1, 0x9f21, 0xa114, 0xa13c, 0xa006, 0xa137, 0xa008, 0x2039, + 0xa109, 0x1fe2, 0xd129, 0xa036, 0x209a, 0xb548, 0x2079, 0x2099, + 0x20c3, 0xa907, 0x4ca5, 0xeb3b, 0x30de, 0xbb23, 0x9f25, 0x1f75, + 0xae76, 0x207a, 0x24b1, 0xa592, 0x9f1c, 0x9fe9, 0x9feb, 0x1ed3, + 0x9efa, 0xa06c, 0x00f6, 0x1e2a, 0xcb87, 0xd146, 0xa010, 0xa00f, + 0x9eec, 0xae78, 0xa0b9, 0x2fa3, 0xd5c9, 0x1eff, 0xc706, 0xa03c, + 0x22b5, 0xa2cc, 0x9f26, 0xa25a, 0x9ff1, 0x1fed, 0xa109, 0xa0b5, + 0xa024, 0xa0be, 0xd2f1, 0xdcf0, 0x9eee, 0x9f1f, 0x5d0b, 0x5d17, + 0xdd5d, 0x9f83, 0xa0c0, 0x9f5c, 0xafa4, 0xe03c, 0x200a, 0xa0af, + 0x9fa7, 0x1fa6, 0xe049, 0xa078, 0xa077, 0x1ffb, 0x2099, 0x20c3, + 0xa907, 0x2003, 0x24b1, 0xa592, 0xa0c2, 0x1f2a, 0xa0de, 0xa0e8, + 0xa11f, 0x4f75, 0x69e1, 0xea82, 0xafac, 0xb770, 0x9f27, 0x1ed0, + 0x1f1e, 0xce56, 0x1ffb, 0x2079, 0x20c3, 0xa907, 0x1ff2, 0xb548, + 0xafad, 0x1f10, 0xc26b, 0x1e26, 0x2e76, 0xcadd, 0xabb6, 0xa10e, + 0xa13b, 0xa110, 0xa132, 0xa13a, 0x9f63, 0xa06c, 0x1f1d, 0x9f20, + 0x9f1b, 0xa03a, 0x9f24, 0xa01e, 0xa03e, 0xa059, 0xa07b, 0x1ffb, + 0x2079, 0x2099, 0xa907, 0xafb1, 0x9ec5, 0x9f65, 0x9ed9, 0x1ec2, + 0x22a8, 0xa2d5, 0x9fa8, 0x9ec6, 0xb55e, 0xc67b, 0x1f2a, 0xa07d, + 0x9ec9, 0xa0ed, 0x9fa5, 0xa07e, 0xa0f4, 0x3076, 0x30aa, 0xb0e1, + 0xa0e3, 0xe6c7, 0x9ed9, 0xa0e9, 0x1ef7, 0x9fa1, 0x9eea, 0x9fca, + 0x9fac, 0x9ebf, 0x9fa9, 0x1fed, 0xa039, 0xa0a4, 0xa0a7, 0x9fe6, + 0x9faa, 0x1fad, 0xac3d, 0x1f31, 0x1f32, 0x9f60, 0xa07f, 0xa139, + 0x9f18, 0xa0a8, 0x9fea, 0xa127, 0xa0a9, 0xa0a5, 0x9fe8, 0x2150, + 0xa152, 0xcc2a, 0xa1f6, 0x406e, 0xc097, 0x214c, 0xa151, 0x224b, + 0x22ca, 0xac05, 0x214a, 0xa151, 0xa154, 0x1ee7, 0x6577, 0x6578, + 0xe57f, 0x213f, 0xa152, 0x214a, 0xa14c, 0x213f, 0xa150, 0xa14e, + 0xa157, 0xa156, 0x1e68, 0xa9cb, 0xeee8, 0xa160, 0xa15c, 0xb5f7, + 0x1ea1, 0x9ebe, 0xa185, 0x1e21, 0x9e24, 0x9fde, 0xd62d, 0x2929, + 0x6754, 0xe75d, 0x24b2, 0x4b11, 0x65a2, 0x65d7, 0xe5dc, 0xd208, + 0x9e0c, 0x530a, 0xd332, 0x4faa, 0xe90a, 0x4363, 0xc378, 0xa180, + 0xa17e, 0xa6c5, 0xa18b, 0xae3d, 0xa189, 0xa167, 0x2706, 0x270e, + 0xa713, 0xaca1, 0xa184, 0x218c, 0xcb27, 0xa182, 0x218a, 0xcb27, + 0x226e, 0xa3e7, 0xa6e7, 0xa192, 0xd0c4, 0xa190, 0xab82, 0x21a9, + 0xabeb, 0xdecd, 0xdfb2, 0x2b90, 0xab9c, 0xa85a, 0xb700, 0xabc3, + 0x2bbc, 0xabc7, 0xabcc, 0x2199, 0xabeb, 0x2e42, 0xcf83, 0x1ecc, + 0x21b0, 0xbc37, 0x3638, 0xef15, 0xe9ae, 0x1ecc, 0x21ab, 0xbc37, + 0xa1b4, 0x3c96, 0xd85d, 0xbc7a, 0xa1b1, 0xbcc1, 0xbcef, 0xa1cd, + 0xbd0c, 0x21c8, 0xbde8, 0xbd7c, 0xbd82, 0x3053, 0x30bd, 0xbdd2, + 0xbdb8, 0x21d6, 0xbe96, 0xa1c0, 0xbdbc, 0xa1bb, 0xbe1b, 0xbe4a, + 0xc69a, 0xb817, 0x21c6, 0xbe96, 0x21dc, 0xbf9f, 0x21db, 0xbf9f, + 0x4108, 0x4155, 0x4188, 0xc199, 0x2e7e, 0xb73a, 0x21e2, 0xa1e3, + 0x21e1, 0xa1e3, 0x21e1, 0xa1e2, 0xecf3, 0xac45, 0x2904, 0xd655, + 0x21ec, 0x21ee, 0x68a8, 0x68cc, 0xe8ce, 0xece7, 0x21e8, 0x21ee, + 0x68a8, 0x68cc, 0xe8ce, 0x21f4, 0x317f, 0xb191, 0x21e8, 0x21ec, + 0x68a8, 0x68cc, 0xe8ce, 0xa1f1, 0xa1ef, 0x2c32, 0x2c34, 0x2c36, + 0x2c37, 0xeb50, 0xbac8, 0x21ed, 0x317f, 0xb191, 0xa147, 0x2757, + 0x284a, 0xa8a4, 0x2c80, 0xef63, 0x3483, 0xb4ca, 0xa1fe, 0xa1fd, + 0xe47f, 0x2202, 0xe1d6, 0x2200, 0xe1d6, 0xa204, 0xa203, 0x221b, + 0xa275, 0x1e42, 0xd2c5, 0xb81e, 0xd2bb, 0x2283, 0x2290, 0xc53b, + 0xa6ed, 0xb289, 0xa289, 0xa247, 0xa25b, 0x2205, 0x2231, 0x224f, + 0x2259, 0xa275, 0xa22a, 0xa22b, 0x2227, 0x223c, 0xa2ab, 0x2226, + 0x223c, 0xa2ab, 0x624b, 0x6464, 0xe4c7, 0xa220, 0x2225, 0xaf46, + 0x2257, 0x2277, 0x63df, 0xe4f2, 0xa244, 0xe8b3, 0x221b, 0x224f, + 0x2259, 0xa275, 0xa241, 0xd8fd, 0xa24e, 0xa23e, 0x2226, 0x2227, + 0xa2ab, 0xa28a, 0xa23a, 0xa28c, 0xa274, 0xa234, 0x2264, 0xa291, + 0xeb00, 0xa22d, 0xa219, 0x214b, 0x22ca, 0xac05, 0xbe82, 0xbb6c, + 0xa239, 0x221b, 0x2231, 0x2259, 0xa275, 0x226e, 0xa3e7, 0x2263, + 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0x222c, + 0x2277, 0x63df, 0xe4f2, 0x221b, 0x2231, 0x224f, 0xa275, 0xa033, + 0xa21a, 0xa265, 0x2251, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, + 0x61f0, 0xe1fc, 0x2242, 0xa291, 0xa25d, 0x65b9, 0xe609, 0xa287, + 0xa270, 0x218e, 0x2250, 0xa3e7, 0xa269, 0x2251, 0x2263, 0x228d, + 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0xb72d, 0xa240, 0x2205, + 0x221b, 0x2231, 0x224f, 0xa259, 0x222c, 0x2257, 0x63df, 0xe4f2, + 0xb22e, 0xa2e6, 0x2212, 0x2290, 0xc53b, 0xcb9a, 0xa267, 0xa218, + 0xa23d, 0xa23f, 0x2251, 0x2263, 0x2271, 0x228e, 0x2292, 0x2294, + 0x61f0, 0xe1fc, 0x2251, 0x2263, 0x2271, 0x228d, 0x2292, 0x2294, + 0x61f0, 0xe1fc, 0x2212, 0x2283, 0xc53b, 0x2242, 0xa264, 0x2251, + 0x2263, 0x2271, 0x228d, 0x228e, 0x2294, 0x61f0, 0xe1fc, 0x2251, + 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x61f0, 0xe1fc, 0x5cad, + 0xdcea, 0x22e7, 0xa2f8, 0xdfa6, 0x4cfc, 0xccff, 0xa2d9, 0xa2f1, + 0x1ec2, 0x20cd, 0xa2d5, 0x9f2e, 0x2226, 0x2227, 0xa23c, 0xa2f5, + 0xa2c1, 0x22b4, 0x22de, 0xb1a5, 0x22b3, 0x22de, 0xb1a5, 0x2026, + 0xa2cc, 0xb548, 0xa2e2, 0xa2b2, 0xb54f, 0x22d1, 0xb555, 0xa2c8, + 0xa2c7, 0x214b, 0x224b, 0xac05, 0x22db, 0x22f2, 0xa2f3, 0x2026, + 0xa2b5, 0x22c5, 0x2f95, 0x2fa0, 0xb555, 0x1ec2, 0x20cd, 0xa2a8, + 0x22d7, 0xb702, 0x22d6, 0xb702, 0xa2a1, 0xa2e9, 0x22cb, 0x22f2, + 0xa2f3, 0xd0dc, 0x22b3, 0x22b4, 0xb1a5, 0xb22e, 0xa2bf, 0xb1c3, + 0xa27f, 0x229d, 0xa2f8, 0xa2da, 0xa2a2, 0x22cb, 0x22db, 0xa2f3, + 0x22cb, 0x22db, 0xa2f2, 0xa2b1, 0x229d, 0xa2e7, 0xa300, 0xa2fb, + 0x1e10, 0xa304, 0x1e10, 0xa303, 0xeead, 0x2fe9, 0x3031, 0xb0a4, + 0xb3ac, 0x5133, 0xd166, 0xa338, 0x37e9, 0xb7fe, 0x2e00, 0xdfca, + 0xa320, 0xa31e, 0xa329, 0xa32d, 0xcbcb, 0x5535, 0xd5cf, 0xa321, + 0xa326, 0xa331, 0x3c47, 0xbed9, 0xa32e, 0x2333, 0x2941, 0xa969, + 0x2332, 0x2941, 0xa969, 0xa31a, 0xa340, 0x3bc9, 0xe1ab, 0xa33a, + 0xe7c6, 0xa352, 0x3607, 0x36fb, 0x6629, 0xe65e, 0xd294, 0x1e16, + 0x9e17, 0xa350, 0x2d0b, 0x53ef, 0xd550, 0x2354, 0x23f6, 0xb5ea, + 0xa34d, 0xa346, 0x384c, 0xb9d5, 0x234f, 0x23f6, 0xb5ea, 0x2358, + 0xa5ae, 0x28f2, 0xdce3, 0x2355, 0xa5ae, 0xb13d, 0xc387, 0x53d4, + 0xd514, 0x9f54, 0xc6e7, 0x2365, 0x2877, 0x3ef7, 0x3f9b, 0x4002, + 0x597f, 0xee75, 0x2364, 0xd97f, 0xd1e5, 0x585b, 0xd85e, 0xadf5, + 0x2918, 0xb23c, 0xae01, 0x237d, 0xc68d, 0xa37b, 0x2dfb, 0xb372, + 0xcf37, 0x3064, 0xdcc9, 0xa374, 0x2373, 0xc68d, 0x2388, 0x23b0, + 0xaee0, 0xb239, 0x2ef0, 0xaef3, 0x23a4, 0x23af, 0x36a6, 0x36c6, + 0x3b74, 0xbb77, 0xc8d4, 0xa382, 0xa3b2, 0x2727, 0xa8d3, 0xa3ad, + 0xa399, 0xc825, 0xef8e, 0xad16, 0x23a0, 0xaec1, 0x28e5, 0x2edb, + 0x613d, 0xe1d0, 0xa38d, 0xa795, 0xaef3, 0xa3a1, 0x2395, 0xaec1, + 0xa39f, 0xaec2, 0xa3b4, 0x2386, 0xb6c6, 0xaec8, 0xaeda, 0x2ecf, + 0xaed0, 0xa38c, 0xaedd, 0x2386, 0x36a6, 0x36c6, 0x3b74, 0xbb77, + 0x2382, 0xaee0, 0xa389, 0x1e25, 0xa6b4, 0xa3a3, 0xbe90, 0xc9c1, + 0xd0b1, 0x60bb, 0x6130, 0xe6a3, 0xa3bb, 0xa3ba, 0x1e1f, 0x9e22, + 0x470c, 0xce23, 0x1e09, 0xaf0e, 0x23c3, 0x23c4, 0xa3c5, 0x23c2, + 0x23c4, 0xa3c5, 0x23c2, 0x23c3, 0xa3c5, 0x23c2, 0x23c3, 0xa3c4, + 0xe749, 0xe746, 0xa3f9, 0xb268, 0x9e41, 0xe6d9, 0x1eee, 0x23db, + 0xc08d, 0xb536, 0xa92c, 0xc2ae, 0x467a, 0x467c, 0x6aea, 0xeaee, + 0x1e8a, 0x9e8b, 0xcdb4, 0x2909, 0xdb8a, 0x354d, 0xb558, 0x23cd, + 0xc08d, 0xac09, 0x4573, 0x4582, 0x4589, 0xc58a, 0x28e1, 0xc77f, + 0x1e1b, 0x3a37, 0x3b09, 0xd5c2, 0x218e, 0x2250, 0xa26e, 0x49d6, + 0x5879, 0xe6bb, 0xa44c, 0x276e, 0x37b1, 0x3aaf, 0x51fa, 0xe8b1, + 0x234f, 0x2354, 0x35ea, 0xd449, 0xd65f, 0x23c8, 0x2606, 0xbb4e, + 0xa630, 0x24a9, 0xa4f6, 0x4c72, 0xefa5, 0x25ab, 0xa644, 0xe5a4, + 0xaf14, 0x1edd, 0xd855, 0xaf8c, 0x26ae, 0xb6cf, 0xa687, 0xa442, + 0xa5ce, 0xb061, 0xa451, 0x252b, 0x2656, 0xda21, 0xa678, 0x5074, + 0xd07d, 0x2518, 0x2553, 0x2554, 0x255f, 0x5aec, 0xe5d9, 0x2434, + 0xa449, 0x2433, 0xa449, 0xa450, 0xd117, 0xa44d, 0xa44a, 0xa415, + 0x3282, 0xc2c2, 0x2433, 0xa434, 0xa43f, 0xa3eb, 0xa43d, 0xa436, + 0xa41e, 0xa638, 0xa6c8, 0xa614, 0xa6a6, 0xa504, 0x24e1, 0x5c9f, + 0xdd20, 0x24bc, 0xa58e, 0xa4fa, 0xa5c6, 0xa5da, 0xda46, 0xe031, + 0xa5dc, 0x2492, 0xda4b, 0xda4d, 0x2611, 0x5656, 0xdb3c, 0xa4e3, + 0x248c, 0x30d2, 0xefa2, 0x248a, 0x30d2, 0xefa2, 0xda60, 0x246a, + 0xda4b, 0xa6a8, 0xa680, 0xa4a4, 0xa65d, 0xa49c, 0x2400, 0xa4f6, + 0xef69, 0x2580, 0xd849, 0x2003, 0x207a, 0xa592, 0x2173, 0xcb11, + 0x618e, 0xee79, 0x2459, 0xa58e, 0xa6a5, 0x65a7, 0xeb28, 0xe7ff, + 0x2516, 0x255e, 0x45d6, 0xc602, 0xa660, 0xa635, 0xa5f6, 0xa666, + 0x2629, 0xdb41, 0xa672, 0xa68c, 0xa665, 0xa5b2, 0x2458, 0x5c9f, + 0xdd20, 0xa485, 0xda36, 0x2560, 0x2586, 0x269e, 0x27d1, 0xb08a, + 0x2400, 0xa4a9, 0xa45a, 0x5a98, 0xdbf1, 0xa457, 0xd123, 0xd39e, + 0xa57a, 0xa523, 0x24d1, 0x255e, 0x45d6, 0xc602, 0x242f, 0x2553, + 0x2554, 0x255f, 0x5aec, 0xe5d9, 0xa61c, 0xa5ca, 0xa62e, 0xa5e9, + 0xa515, 0xa59a, 0xa59e, 0xa41f, 0xdaaf, 0xaff5, 0xa60a, 0xdb2a, + 0xe5ee, 0x242f, 0x2518, 0x2554, 0x255f, 0x5aec, 0xe5d9, 0x242f, + 0x2518, 0x2553, 0x255f, 0x5aec, 0xe5d9, 0xa649, 0xa649, 0x24d1, + 0x2516, 0x45d6, 0xc602, 0x242f, 0x2518, 0x2553, 0x2554, 0x5aec, + 0xe5d9, 0x24f2, 0x2586, 0x269e, 0x27d1, 0xb08a, 0x5854, 0x5858, + 0xe29c, 0xa616, 0xa5c7, 0xa6c0, 0x265b, 0x2699, 0x26d3, 0xef67, + 0xa613, 0x26c9, 0xcf57, 0xa63d, 0xa62f, 0xa510, 0x24af, 0xd849, + 0x6927, 0xe935, 0xdb71, 0x24f2, 0x2560, 0x269e, 0x27d1, 0xb08a, + 0x2459, 0xa4bc, 0x267e, 0xc616, 0x2003, 0x207a, 0xa4b1, 0xa524, + 0x3198, 0x3199, 0xbb56, 0xa527, 0xa5bb, 0x9e27, 0x2403, 0xa644, + 0x9e54, 0x2355, 0xa358, 0x25b7, 0xa674, 0x68df, 0x68e0, 0xe963, + 0xa4df, 0x41df, 0xd425, 0x25af, 0xa674, 0xa5a9, 0xa60d, 0xa6b3, + 0xef45, 0xa45b, 0xa56c, 0xa51d, 0xa417, 0xa45c, 0xa469, 0xe16a, + 0xab60, 0xa637, 0xa522, 0xa6c1, 0xa66f, 0xa4d4, 0xdb30, 0x23f9, + 0xbb4e, 0xa540, 0xa5bd, 0x247c, 0xdb3c, 0xa56f, 0xa455, 0xa567, + 0x2690, 0x2c1d, 0xc51e, 0xa653, 0xa51b, 0xa6b6, 0xa62f, 0x24d7, + 0xdb41, 0xa520, 0x2578, 0xa628, 0xa3fd, 0xa6d1, 0xa4d3, 0xa5e5, + 0xa452, 0xa574, 0xb076, 0xdb50, 0x2403, 0xa5ab, 0xa655, 0x2556, + 0xa557, 0xa668, 0xa618, 0xa645, 0x241f, 0xda21, 0x256e, 0xa699, + 0xa695, 0xa49d, 0xa4d2, 0xdb6b, 0xa4dd, 0xa4d5, 0xa650, 0xdb5f, + 0xa5f3, 0xa4d9, 0x25af, 0xa5b7, 0x585c, 0x585f, 0xe053, 0xa428, + 0xaf53, 0xa591, 0xa49b, 0xa413, 0xa4dc, 0xa694, 0x2617, 0x2c1d, + 0xc51e, 0xa68f, 0xa65c, 0x256e, 0x265b, 0x26d3, 0xef67, 0x24f2, + 0x2560, 0x2586, 0x27d1, 0xb08a, 0xbd4f, 0xa6ca, 0xa6c2, 0xa4bd, + 0xa456, 0xa499, 0xa411, 0x9eb8, 0xa5be, 0x1e25, 0xa3b3, 0xa624, + 0xa6c2, 0xa56d, 0xa5eb, 0x26a3, 0xa6bb, 0xa181, 0xa453, 0x2570, + 0xcf57, 0xa6a2, 0xd2cf, 0xd271, 0xa631, 0x256e, 0x2699, 0xef67, + 0x26f2, 0x26f4, 0xa70d, 0x26de, 0x26ec, 0x2efb, 0x2efd, 0x5ff4, + 0xe025, 0xa6e0, 0x9e96, 0x26d8, 0x26ec, 0x2efb, 0x2efd, 0x5ff4, + 0xe025, 0xe856, 0xa6d9, 0x26e3, 0x2718, 0xccf0, 0x26e2, 0x2718, + 0xccf0, 0x3df5, 0x3e0a, 0xbe15, 0xa18f, 0xa6f1, 0x26d8, 0x26de, + 0x2efb, 0x2efd, 0x5ff4, 0xe025, 0x2213, 0x2712, 0xd597, 0x26f6, + 0x26fb, 0x26fd, 0x2700, 0xa70b, 0xc74f, 0xa6ea, 0x26d7, 0x26f4, + 0xa70d, 0x26fe, 0x2716, 0xa717, 0x26d7, 0x26f2, 0xa70d, 0xa707, + 0x26ef, 0x26fb, 0x26fd, 0x2700, 0xa70b, 0xb5e5, 0x26ef, 0x26f6, + 0x26fd, 0x2700, 0xa70b, 0x26ef, 0x26f6, 0x26fb, 0x2700, 0xa70b, + 0x26f3, 0x2716, 0xa717, 0x26ef, 0x26f6, 0x26fb, 0x26fd, 0xa70b, + 0xa711, 0x2186, 0x270e, 0xa713, 0xa6f5, 0xa70f, 0x26ef, 0x26f6, + 0x26fb, 0x26fd, 0xa700, 0x26d7, 0x26f2, 0xa6f4, 0x2186, 0x2706, + 0xa713, 0xa708, 0xa703, 0x26ed, 0xd597, 0x2186, 0x2706, 0xa70e, + 0x26f3, 0x26fe, 0xa717, 0x26f3, 0x26fe, 0xa716, 0x26e2, 0xa6e3, + 0x383e, 0xbb12, 0xa721, 0xa71f, 0x453a, 0xc53c, 0xd056, 0x238b, + 0xa8d3, 0xb257, 0xb747, 0xc3ea, 0x2754, 0x27ca, 0xadb3, 0xa8d9, + 0x2834, 0xa872, 0x3b7e, 0x3b7f, 0x3b81, 0xbca1, 0xe62f, 0x2c85, + 0xe62a, 0x276f, 0x28ca, 0x28de, 0xe62b, 0xaea7, 0xe62c, 0xa78b, + 0x2730, 0x27ca, 0xadb3, 0x21f7, 0x284a, 0xa8a4, 0xade0, 0xa805, + 0x28b0, 0x28b5, 0x28c7, 0x28dc, 0x4f48, 0xcf4e, 0xa8e2, 0x27bb, + 0xa8e9, 0x2862, 0xe696, 0x28b3, 0xe6ab, 0x289c, 0xc908, 0xa802, + 0xa803, 0xb1bb, 0xa88c, 0x6640, 0xe641, 0xbce5, 0x23f0, 0xd1fa, + 0x274f, 0xe62b, 0xa7a7, 0xa787, 0x1e18, 0x9e20, 0xa7a2, 0xa8a2, + 0xa7c0, 0xa8df, 0xa8e0, 0xa8da, 0xa773, 0xa753, 0x2841, 0xa8d8, + 0xc561, 0xe67b, 0xa39a, 0xa806, 0x282f, 0x2c27, 0xac2d, 0xa79c, + 0xa79b, 0xa8a2, 0xa778, 0xa8be, 0xa770, 0xab88, 0x280a, 0xd056, + 0xa88a, 0xa7e1, 0xa8b6, 0xa8cb, 0xa84f, 0xa816, 0x275d, 0xa8e9, + 0xa782, 0xc86e, 0xe656, 0x2730, 0x2754, 0xadb3, 0x24f2, 0x2560, + 0x2586, 0x269e, 0xb08a, 0xa7d3, 0xa7d2, 0xa852, 0x2864, 0xa8ce, + 0xa81d, 0x28c4, 0xe1ce, 0x2824, 0xe684, 0xa7ad, 0xc897, 0xb267, + 0x2d0e, 0x2d5c, 0xc895, 0xb383, 0xa763, 0xa764, 0xa75a, 0xa796, + 0xd3eb, 0xa7a9, 0xa879, 0x28ae, 0xa8af, 0xa7b4, 0xe67b, 0xa7da, + 0x27de, 0xe684, 0x6636, 0xe68e, 0x279a, 0x2c27, 0xac2d, 0x2895, + 0xe681, 0xb2a5, 0x273a, 0xa872, 0x454c, 0xc54d, 0x2792, 0xa8d8, + 0xa8ea, 0x21f7, 0x2757, 0xa8a4, 0xd314, 0xc57b, 0xa7b2, 0xa851, + 0xa850, 0xa7d8, 0xa896, 0xbd82, 0xa8a7, 0xa1a2, 0xd46c, 0xa86b, + 0xa75e, 0x27d9, 0xa8ce, 0xe663, 0x46d0, 0xee7d, 0xa861, 0x273a, + 0xa834, 0xac18, 0x2364, 0xee75, 0x2811, 0xa8cd, 0x450e, 0x4816, + 0xc8da, 0xc245, 0xa7ab, 0xa767, 0x2830, 0xe681, 0xa854, 0xa89e, + 0x28bb, 0xc246, 0x2760, 0xc908, 0xa897, 0x277a, 0xa7a1, 0x21f7, + 0x2757, 0xa84a, 0xa859, 0x2815, 0xa8af, 0x2815, 0xa8ae, 0x275b, + 0x28b5, 0x28dc, 0x4f48, 0xcf4e, 0x275f, 0xe6ab, 0x275b, 0x28b0, + 0x28dc, 0x4f48, 0xcf4e, 0xa7af, 0xde87, 0xa899, 0xa7a6, 0x27dc, + 0xe1ce, 0xa75b, 0x274f, 0xa8de, 0xa7b1, 0xa8e4, 0xa879, 0x27d9, + 0xa864, 0xc4bd, 0x238b, 0xa727, 0x2792, 0xa841, 0xa739, 0xa786, + 0x275b, 0x28b0, 0x28b5, 0x4f48, 0xcf4e, 0x274f, 0xa8ca, 0xa784, + 0xa785, 0x23e1, 0xc77f, 0xa75c, 0xa8cc, 0x2398, 0x2edb, 0xe13d, + 0x275d, 0xa7bb, 0xa846, 0x28ef, 0xa8f5, 0x28ee, 0xa8f5, 0xd072, + 0xa8f9, 0x2356, 0xdce3, 0x3bbb, 0xbbbc, 0x28ee, 0xa8ef, 0x28f7, + 0xa8fa, 0x28f6, 0xa8fa, 0xa8fc, 0xa8f1, 0x28f6, 0xa8f7, 0x2a7f, + 0xd05f, 0xa8f8, 0x2900, 0xabff, 0x28fd, 0xabff, 0xa90a, 0x21e6, + 0xd655, 0xe64d, 0x1ffb, 0x2079, 0x2099, 0xa0c3, 0x23d8, 0xdb8a, + 0xa902, 0x2fa9, 0x5907, 0xd986, 0xa913, 0xa90f, 0xd641, 0x236f, + 0xb23c, 0xa91b, 0xa91a, 0x9eb1, 0xa920, 0xa91f, 0x2923, 0xb8a6, + 0x2922, 0xb8a6, 0x9f19, 0x2172, 0x6754, 0xe75d, 0xa3cf, 0xbb80, + 0x372c, 0xb94d, 0xbcf0, 0xe82d, 0xbbd4, 0xda87, 0xa93e, 0xa96a, + 0xa939, 0x2332, 0x2333, 0xa969, 0xa950, 0xcad2, 0xb7f0, 0xa96e, + 0xeede, 0xa942, 0x4287, 0xe029, 0x2968, 0x296c, 0xc34e, 0xaf09, + 0xc55a, 0x2967, 0xadb4, 0x2965, 0xadb4, 0x2956, 0x296c, 0xc34e, + 0x2332, 0x2333, 0xa941, 0xa93a, 0x2956, 0x2968, 0xc34e, 0xa94b, + 0x29b3, 0xab2d, 0x29e6, 0xa9e7, 0x299d, 0x2a24, 0x4ca7, 0xccda, + 0x2a66, 0xaa8d, 0xaabd, 0xa9d9, 0x29f8, 0xd505, 0xa9ac, 0xc945, + 0xc385, 0xaab8, 0x2986, 0x2a24, 0x4ca7, 0xccda, 0xaaf5, 0xaad7, + 0x2aaf, 0xab00, 0xa992, 0x1f60, 0x2976, 0xab2d, 0x1f84, 0xa9ea, + 0x2a3f, 0xaa40, 0xaa12, 0xa9ca, 0xa9c9, 0x1e68, 0xa158, 0xa9d7, + 0xaa8e, 0xaa30, 0xa9cd, 0xa98a, 0xd591, 0xaa1f, 0x2978, 0xa9e7, + 0x2978, 0xa9e6, 0x1f84, 0xa9b7, 0xa9ec, 0xa9eb, 0xaae6, 0x298d, + 0xd505, 0xaa63, 0xaa41, 0xaa6d, 0xab08, 0xab0c, 0xab4c, 0xa9c6, + 0x2b22, 0xab43, 0x2a2f, 0xaa31, 0xa9e2, 0x2986, 0x299d, 0x4ca7, + 0xccda, 0xab2a, 0xab09, 0x2a1b, 0xaa31, 0xa9d2, 0x2a1b, 0xaa2f, + 0xaaa7, 0x2afa, 0xaafb, 0x29b8, 0xaa40, 0x29b8, 0x2a3f, 0xaa50, + 0xaa04, 0xaa40, 0xa9fb, 0x2987, 0xaa8d, 0xbdeb, 0xaa05, 0x1e3d, + 0xee97, 0xaaff, 0x2b30, 0x2b46, 0xab7e, 0xab0b, 0xab38, 0x28fb, + 0xd05f, 0x2987, 0xaa66, 0xa9d0, 0xaa32, 0xaabc, 0xab03, 0x29ab, + 0xab00, 0xa99b, 0xaaaa, 0xa988, 0x3127, 0xd06d, 0x2b1d, 0xd885, + 0xab32, 0xab21, 0xab2a, 0xa9aa, 0xa9ee, 0xab19, 0xa9a9, 0x3194, + 0xc644, 0x2a34, 0xaafb, 0x2a34, 0xaafa, 0xaa73, 0x29ab, 0xaaaf, + 0xaaad, 0xaa06, 0xaa2d, 0xaa75, 0xaa07, 0xaaf1, 0x2acb, 0xd885, + 0xaad2, 0x2a18, 0xab43, 0xab37, 0x2a26, 0xaad4, 0x2976, 0xa9b3, + 0x2a74, 0x2b46, 0xab7e, 0xaad0, 0xab24, 0xaa76, 0xb1d2, 0x2a18, + 0xab22, 0x2a74, 0x2b30, 0xab7e, 0xaa08, 0xab53, 0xab52, 0xab6b, + 0xa5e3, 0x2b78, 0x3569, 0x3585, 0x3586, 0xb588, 0xab7f, 0xab59, + 0x2b66, 0x3569, 0x3585, 0x3586, 0xb588, 0xab7d, 0xab7c, 0x2a74, + 0x2b30, 0xab46, 0xab6a, 0x2bcd, 0x2bd5, 0x2bd7, 0x2bdc, 0x2be7, + 0xc52f, 0xa197, 0x4260, 0x5675, 0xd6c7, 0xca79, 0xa7a8, 0xca81, + 0xd089, 0x219d, 0xab9c, 0x219d, 0xab90, 0x2bda, 0x2bf3, 0x2bf6, + 0xc3e4, 0x2b9f, 0xabe6, 0x2b9e, 0xabe6, 0xabf5, 0x2bb7, 0xabe9, + 0xac4e, 0xb1b2, 0xabae, 0xabab, 0x5b8c, 0xe1bc, 0xa0a2, 0x2ba1, + 0xabe9, 0xabc6, 0x21a6, 0xabc7, 0x2bdb, 0xabec, 0x5cd3, 0xdcd4, + 0xe1c7, 0xa1a4, 0xabbb, 0x21a6, 0xabbc, 0x6751, 0xe752, 0x66ba, + 0x674d, 0x674e, 0x674f, 0x6db4, 0x6e16, 0xee64, 0xa1a8, 0x2b81, + 0x2bd5, 0x2bd7, 0x2bdc, 0x2be7, 0xc52f, 0xaebd, 0x2b81, 0x2bcd, + 0x2bd7, 0x2bdc, 0x2be7, 0xc52f, 0x2b81, 0x2bcd, 0x2bd5, 0x2bdc, + 0x2be7, 0xc52f, 0x2b9d, 0x2bf3, 0x2bf6, 0xc3e4, 0x2bbd, 0xabec, + 0x2b81, 0x2bcd, 0x2bd5, 0x2bd7, 0x2be7, 0xc52f, 0xabe2, 0xda67, + 0x4aad, 0xcab6, 0xabdd, 0x2b9e, 0xab9f, 0x2b81, 0x2bcd, 0x2bd5, + 0x2bd7, 0x2bdc, 0xc52f, 0x2ba1, 0xabb7, 0x2199, 0xa1a9, 0x2bbd, + 0xabdb, 0x2b9d, 0x2bda, 0x2bf6, 0xc3e4, 0xaba0, 0x2b9d, 0x2bda, + 0x2bf3, 0xc3e4, 0x2bfe, 0xac0d, 0xac0b, 0xac0e, 0x2bf9, 0xac0d, + 0x28fd, 0xa900, 0x1e13, 0xac08, 0x214b, 0x224b, 0xa2ca, 0xac07, + 0xac06, 0x1e13, 0xac02, 0xa3de, 0xabfb, 0x2bf9, 0xabfe, 0xabfc, + 0x2c13, 0x2c14, 0xc23e, 0x2c12, 0x2c14, 0xc23e, 0x2c12, 0x2c13, + 0xc23e, 0xa875, 0xac1a, 0xac19, 0x1e48, 0x2e85, 0x6ebc, 0xeebd, + 0x2617, 0x2690, 0xc51e, 0xc1ce, 0x2c20, 0x5d7b, 0x6bae, 0x6c7b, + 0xec9c, 0x2c1f, 0x5d7b, 0x6bae, 0x6c7b, 0xec9c, 0x2c23, 0x2c24, + 0xb023, 0xac22, 0x2c22, 0xb023, 0xac26, 0xac25, 0x279a, 0x282f, + 0xac2d, 0xac2b, 0xac29, 0xeb40, 0x279a, 0x282f, 0xac27, 0x21f2, + 0x2c34, 0x2c36, 0x2c37, 0xeb50, 0x21f2, 0x2c32, 0x2c36, 0x2c37, + 0xeb50, 0x21f2, 0x2c32, 0x2c34, 0x2c37, 0xeb50, 0x21f2, 0x2c32, + 0x2c34, 0x2c36, 0xeb50, 0xac4d, 0x1fad, 0x2118, 0xc6e1, 0x1fb7, + 0xddfc, 0xac64, 0xac53, 0xa1e5, 0xac4a, 0xac46, 0x6ce5, 0xee1f, + 0xac38, 0xaba9, 0x2c5b, 0xae48, 0xac43, 0x2c4f, 0xae48, 0xac6c, + 0xac62, 0xac61, 0xac42, 0xac68, 0xac66, 0xac5e, 0xadbc, 0xa1fa, + 0x1e97, 0x2d57, 0x3b72, 0xbb73, 0xdc48, 0x2742, 0xe62a, 0xdc3a, + 0xad87, 0xad17, 0xacf4, 0xad50, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, + 0x6666, 0x669d, 0xe6af, 0xa188, 0x2d52, 0x2d53, 0x2dcc, 0x2dd6, + 0x2dd7, 0xc89e, 0xadba, 0xadbd, 0xad87, 0xad2c, 0xadcb, 0xada8, + 0xada7, 0xacdd, 0xacd2, 0xacfd, 0xada2, 0xada0, 0xad22, 0xadd2, + 0xace9, 0xace8, 0xacf0, 0xacef, 0xac98, 0x2d58, 0x2db8, 0xadc6, + 0x2c9b, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0x669d, 0xe6af, 0xace1, + 0xad97, 0xad0d, 0xadae, 0xad08, 0xad07, 0x234e, 0xd3ef, 0xad03, + 0x27fc, 0x2d5c, 0xc895, 0xa393, 0xac97, 0x1ed1, 0xad19, 0x1ed1, + 0xad18, 0xace5, 0xacbd, 0x2d83, 0xad84, 0xcbcf, 0xac9a, 0x2ca9, + 0x2d53, 0xc89e, 0x2ca9, 0x2d52, 0xc89e, 0x1e97, 0x2c81, 0x3b72, + 0xbb73, 0x2cf5, 0x2db8, 0xadc6, 0xad94, 0x27fc, 0x2d0e, 0xc895, + 0xad81, 0x3e13, 0xbeaa, 0xad73, 0xad6f, 0xad5d, 0xad2d, 0xad2d, + 0x2c96, 0xacb4, 0x2c9b, 0x2cf6, 0x2d8c, 0x2db9, 0x6666, 0x669d, + 0xe6af, 0x2c9b, 0x2cf6, 0x2d8b, 0x2db9, 0x6666, 0x669d, 0xe6af, + 0xad5a, 0xad02, 0xace4, 0xace3, 0xacc4, 0xacc3, 0xad04, 0xe6df, + 0x2730, 0x2754, 0xa7ca, 0x2965, 0xa967, 0x2cf5, 0x2d58, 0xadc6, + 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x6666, 0x669d, 0xe6af, 0xacad, + 0xac7f, 0xacb3, 0x2dd3, 0xadd4, 0x2cf5, 0x2d58, 0xadb8, 0xacbf, + 0x2ca9, 0x2dd6, 0xadd7, 0xace6, 0xadc5, 0xadc5, 0x2ca9, 0x2dcc, + 0xadd7, 0x2ca9, 0x2dcc, 0xadd6, 0xaddd, 0xaddb, 0xa759, 0xade3, + 0xade2, 0xe78f, 0xadf0, 0xadef, 0xa36e, 0xd856, 0xadfd, 0x2377, + 0xb372, 0xadfa, 0x67cd, 0xe7e8, 0x231d, 0xdfca, 0x2370, 0x2e63, + 0xae64, 0x9f48, 0xae25, 0xae2b, 0xcd19, 0xae43, 0xae33, 0x9f16, + 0xd88b, 0xcd48, 0xcc3e, 0xcb92, 0x2e5f, 0xb5d8, 0xae05, 0x2e2f, + 0xae36, 0xae40, 0xae08, 0xd4c6, 0x2e47, 0x2e5a, 0xae6b, 0x2e26, + 0xae36, 0x2f52, 0x3b78, 0xc688, 0xae6c, 0xae10, 0x2e26, 0xae2f, + 0xae58, 0xae57, 0xa183, 0xae27, 0x21aa, 0xcf83, 0xae0f, 0x2e2e, + 0x2e5a, 0xae6b, 0x2c4f, 0xac5b, 0xce28, 0xae3c, 0xae3b, 0x2e2e, + 0x2e47, 0xae6b, 0x2e1c, 0xb5d8, 0xb5d9, 0x2e01, 0xae64, 0x2e01, + 0xae63, 0x2e2e, 0x2e47, 0xae5a, 0xae31, 0x1e7e, 0x2e79, 0xb9a6, + 0xc9ca, 0x1e26, 0x1f75, 0x2002, 0x20a1, 0x2e77, 0xcadd, 0xae76, + 0xa016, 0x2e72, 0xb9a6, 0x9e48, 0xa1e0, 0x2e83, 0x2eb5, 0xaee3, + 0x2ef0, 0xaef3, 0x2e7f, 0xaee3, 0x5358, 0xd38a, 0x1e48, 0x2c1b, + 0x6ebc, 0xeebd, 0xb176, 0xc240, 0xaeec, 0xaee1, 0xaeab, 0x2fdc, + 0xb1c9, 0xaedf, 0xef90, 0x2ec3, 0xaee2, 0xa750, 0xae93, 0x2e7f, + 0x53f4, 0x544a, 0xd4ed, 0xaebb, 0x377e, 0x3780, 0x37a9, 0x37d7, + 0xb8a5, 0xaeb6, 0xaece, 0xabd3, 0xaedf, 0x2395, 0xa3a0, 0xa3a2, + 0x2e9f, 0xaee2, 0xa3a6, 0xaebc, 0x23a9, 0xaed0, 0x23a9, 0xaecf, + 0xa3a8, 0x2398, 0x28e5, 0xe13d, 0xa3ae, 0x2e99, 0xaebf, 0x2382, + 0xa3b0, 0xae91, 0x2e9f, 0xaec3, 0x2e7f, 0xae83, 0xaeea, 0xaee9, + 0xae90, 0x2385, 0x2e81, 0xaef3, 0x2385, 0x239b, 0x2e81, 0xaef0, + 0xdfea, 0x26d8, 0x26de, 0x26ec, 0x2efd, 0x5ff4, 0xe025, 0x1e43, + 0xdffa, 0x26d8, 0x26de, 0x26ec, 0x2efb, 0x5ff4, 0xe025, 0xe58b, + 0x44e3, 0x598d, 0x5fa1, 0x5fa7, 0x5fa8, 0x5fa9, 0xdfaf, 0xc570, + 0xb8c4, 0x330a, 0xb335, 0xa958, 0x9e00, 0x9e8c, 0x1e09, 0xa3c1, + 0x5cae, 0x5cb3, 0xdd30, 0xaf12, 0xaf11, 0xa40a, 0xaf35, 0x2f4c, + 0xc030, 0xcd43, 0xaf33, 0xaf4e, 0xaf2a, 0xaf20, 0xaf3a, 0x2f3e, + 0xaf48, 0xaf37, 0xaf3c, 0xaf3b, 0x2f39, 0xaf48, 0xa22b, 0x2f39, + 0xaf3e, 0xaf25, 0xaf2f, 0xaf51, 0xaf50, 0x2e30, 0x3b78, 0xc688, + 0x2679, 0xc576, 0xaf55, 0x2f54, 0x6304, 0xe332, 0xcbf2, 0x2f5a, + 0xbc47, 0x2f59, 0xbc47, 0x2f5c, 0x2f5d, 0xaf5e, 0x2f5b, 0x2f5d, + 0xaf5e, 0x2f5b, 0x2f5c, 0xaf5e, 0x2f5b, 0x2f5c, 0xaf5d, 0xaf60, + 0x2f5f, 0xd4a6, 0xaf66, 0xaf65, 0xaf72, 0xcdb5, 0xe6d5, 0x1efd, + 0xb58c, 0xaf68, 0x9ee2, 0x1eff, 0x2fac, 0xeae3, 0xafb9, 0x1f5b, + 0xeaf4, 0x2f83, 0xdfec, 0x2fb0, 0x2fb4, 0xafb5, 0xaf80, 0x2f91, + 0x5ff3, 0xe015, 0xc2e5, 0x9f77, 0x9f6a, 0xa40e, 0xe65f, 0x2f84, + 0x5ff3, 0xe015, 0x1ece, 0xaf9e, 0x22d1, 0xafa0, 0x1ece, 0xaf93, + 0x22d1, 0xaf95, 0xc9a6, 0x201f, 0xd5c9, 0xa065, 0x290d, 0xd986, + 0x1eff, 0x208d, 0xaf77, 0xa09c, 0xaf81, 0xa0c4, 0x2fb7, 0x3074, + 0xb0b3, 0x2f81, 0xafb5, 0x2f81, 0xafb4, 0x2fb3, 0x3074, 0xb0b3, + 0xaf7b, 0xafc4, 0xafc3, 0xb1b6, 0x9ec1, 0x31f4, 0xb1fa, 0xda8c, + 0xb07e, 0x2e94, 0xb1c9, 0xb09f, 0xb025, 0xb182, 0x2306, 0x3031, + 0xb0a4, 0xb0b4, 0xa538, 0xb13e, 0x31d0, 0xb1f7, 0xb14b, 0xb16b, + 0xb1ae, 0xb16a, 0xb0b5, 0xb134, 0x9f42, 0xb091, 0xb190, 0xb056, + 0x2c22, 0xac24, 0xafe3, 0xb060, 0x2306, 0x2fe9, 0xb0a4, 0x30e3, + 0x3374, 0x4dcf, 0x4deb, 0xce3d, 0xb1df, 0xb1cc, 0xb052, 0xb200, + 0xb046, 0x21c4, 0xb0bd, 0xb01d, 0xb02a, 0x241d, 0xb08b, 0x2379, + 0xdcc9, 0xd03b, 0xb119, 0x3085, 0xb0a6, 0xb1c7, 0x2fb3, 0x2fb7, + 0xb0b3, 0xb0e0, 0x20eb, 0x2641, 0x30aa, 0xb0e1, 0xb15f, 0xb1e8, + 0xb137, 0xb0fb, 0x30a9, 0xb0f1, 0xb0f2, 0xafd9, 0x30e5, 0xb142, + 0x3111, 0xb139, 0x3071, 0xb0a6, 0x24f2, 0x2560, 0x2586, 0x269e, + 0xa7d1, 0xb061, 0xc302, 0xb016, 0x9fd4, 0x3102, 0xda96, 0xdbef, + 0xafe2, 0xb0ca, 0x2306, 0x2fe9, 0xb031, 0x3071, 0xb085, 0x307c, + 0xb0f1, 0x20eb, 0x3076, 0xb0e1, 0xb164, 0xb1f8, 0xb173, 0xb1ab, + 0x2fb3, 0x2fb7, 0xb074, 0xaff0, 0xb005, 0xe5f7, 0x21c4, 0xb053, + 0x30a2, 0xea5a, 0x248a, 0x248c, 0xefa2, 0x1ffd, 0xbb23, 0xb075, + 0x20eb, 0x3076, 0xb0aa, 0xb03b, 0x307f, 0xb142, 0xb1fc, 0xb158, + 0xb1f2, 0xb18a, 0xb11c, 0x3159, 0xb15a, 0xb19a, 0xb163, 0x307c, + 0xb0a9, 0xb07d, 0xd822, 0xb07b, 0xd90a, 0x3096, 0xda96, 0x4609, + 0xc652, 0x3080, 0xb139, 0xb06a, 0xc231, 0xb0ec, 0xb14d, 0xb181, + 0xb1a4, 0xb192, 0x2abf, 0xd06d, 0xb1fc, 0xb006, 0xb07a, 0x3080, + 0xb111, 0xb14e, 0xa35a, 0xaffe, 0xe858, 0x307f, 0xb0e5, 0xb817, + 0xbbb7, 0xb001, 0xb120, 0x313c, 0x361a, 0xc718, 0x3174, 0xb1fe, + 0xb0e8, 0x30ed, 0xb15a, 0x30ed, 0xb159, 0x3078, 0xb185, 0xb0ef, + 0xb0ab, 0xb004, 0xb002, 0xb196, 0xd651, 0xb0ad, 0xb151, 0xae86, + 0x317d, 0xb21a, 0x317c, 0xb21a, 0xbb32, 0x21ed, 0x21f4, 0xb191, + 0xb121, 0xafe7, 0xb15f, 0xb1a9, 0xb0eb, 0xb01c, 0x21ed, 0x21f4, + 0xb17f, 0xb126, 0x2af6, 0xc644, 0x316d, 0xb197, 0xb196, 0x259c, + 0x3199, 0xbb56, 0x259c, 0x3198, 0xbb56, 0xb0ee, 0xb124, 0x22b3, + 0x22b4, 0xa2de, 0xb187, 0xb0af, 0xb003, 0xabaa, 0xafc6, 0xa766, + 0xa2e4, 0xb073, 0x2e94, 0xafdc, 0xb03f, 0xb1d4, 0x3000, 0xb1f7, + 0xb1e3, 0x2b3e, 0xb1f6, 0xb1cd, 0xb1f5, 0xd499, 0xb03c, 0xb1d1, + 0xb1e7, 0xb1e6, 0xb079, 0xb0e9, 0x2fcf, 0xb1ff, 0xb1dc, 0xb1d2, + 0x3000, 0xb1d0, 0xb0ac, 0xafcf, 0x30e7, 0xb133, 0xbb22, 0xb151, + 0xb1f4, 0xb04b, 0xb207, 0xb206, 0xb214, 0x322f, 0xb232, 0xb20b, + 0xb227, 0x3226, 0xb230, 0x317c, 0xb17d, 0xb21e, 0x5ca1, 0xdd22, + 0xb21b, 0x3218, 0xb230, 0xb217, 0xb22c, 0xb229, 0x2279, 0xa2e0, + 0x320f, 0xb232, 0x3218, 0xb226, 0x320f, 0xb22f, 0x3237, 0xb238, + 0x3236, 0xb238, 0x3236, 0xb237, 0xa384, 0xb23e, 0x236f, 0xa918, + 0xb23b, 0xb24c, 0xb24b, 0xce94, 0x33e0, 0xcd2e, 0x34b2, 0xb4c8, + 0xb2c2, 0xa728, 0x5a17, 0xdbac, 0xb34d, 0xb268, 0xe1e6, 0xa7f7, + 0x23c9, 0xb260, 0x32e1, 0xb4f4, 0xb36b, 0xb383, 0xb3da, 0xb4a6, + 0xb4fe, 0xb5bc, 0x2448, 0xc2c2, 0xa214, 0xb4ab, 0xb2cb, 0xb2d4, + 0xb2d7, 0x32e9, 0xb4c7, 0xb476, 0xb473, 0xb384, 0xb436, 0xdb77, + 0xa831, 0xb4e1, 0x32de, 0x4274, 0xd9dd, 0xb255, 0xb4d4, 0xb49a, + 0xb29b, 0xb2ff, 0x37b4, 0xb7fa, 0xb428, 0xb29c, 0xb2d6, 0xb2d5, + 0xb29d, 0xb2dd, 0xb2dc, 0xb2b5, 0xb4ec, 0x336e, 0xb4da, 0x3269, + 0x3304, 0xb4f4, 0xb50f, 0xb3c0, 0xb4c1, 0xb514, 0xb4f0, 0x34a5, + 0xc67a, 0x329e, 0xb4c7, 0xb2cf, 0xb39b, 0x32e1, 0xb4f4, 0x2f04, + 0xb335, 0x1e3e, 0x34e7, 0xd209, 0xb46f, 0xb523, 0xb397, 0xb4be, + 0xb4bb, 0xb33e, 0xb493, 0xb4cb, 0xb49f, 0xb399, 0xb4e0, 0xb3ee, + 0xb48f, 0x2f04, 0xb30a, 0xb412, 0xdf13, 0xb31f, 0xb3d2, 0x3405, + 0x34b9, 0xb52a, 0x38b1, 0x4975, 0xcd91, 0xb25e, 0xb3d1, 0xd379, + 0xb41c, 0xb488, 0xb40d, 0xb4bf, 0xb3db, 0x3417, 0xb4e3, 0xd20d, + 0xb26a, 0x32e0, 0xb4da, 0x2377, 0xadfb, 0xb03b, 0x3816, 0xb8f2, + 0x27fd, 0xb26b, 0xb2a1, 0xb31c, 0xb323, 0xb302, 0xe1c7, 0xb4d1, + 0xa30a, 0xb3ed, 0xb4c4, 0xb451, 0xb4f2, 0xb4a3, 0xb47b, 0xb414, + 0xb45c, 0xc8b0, 0xb2e3, 0xb34f, 0xb33f, 0xb26c, 0xb362, 0xb24e, + 0xb3b2, 0xb325, 0xd0cc, 0x3416, 0xb447, 0xb52c, 0xb4b3, 0xb519, + 0xb4f1, 0xb45f, 0xce3d, 0x3341, 0x34b9, 0xb52a, 0xb784, 0xb35f, + 0xb337, 0xb3bb, 0x33fa, 0xb447, 0xb363, 0x335c, 0xd490, 0xb2d3, + 0xb498, 0xb528, 0xb2a2, 0x34d5, 0xb51c, 0xb9a8, 0x3444, 0xb51d, + 0x3442, 0xb51d, 0xb504, 0x34fa, 0xd96c, 0x33fa, 0xb416, 0xb4ef, + 0xb524, 0xb3b4, 0xb3bc, 0xb402, 0x4dcf, 0x4deb, 0xce3d, 0xb4f5, + 0xb31a, 0xb2a0, 0xb29f, 0xb3ba, 0x21fb, 0xb4ca, 0xb516, 0xb35e, + 0xb326, 0xb491, 0xb490, 0xb320, 0xb42d, 0xb2c8, 0xb322, 0xb4cd, + 0xb3b8, 0x32e8, 0xc67a, 0xb26f, 0x4d55, 0x4d76, 0xcedd, 0xb29a, + 0x3251, 0xb4c8, 0xb3ff, 0xb506, 0xb4f7, 0xb4fc, 0x3341, 0x3405, + 0xb52a, 0xb51b, 0xb31e, 0xb31d, 0xb361, 0xb2e5, 0xb3b3, 0x329e, + 0xb2e9, 0x3251, 0xb4b2, 0x21fb, 0xb483, 0xb321, 0xb4a1, 0xb3a5, + 0xb2c5, 0x343a, 0xb51c, 0x32e0, 0xb36e, 0xb4fb, 0xb324, 0xb2ac, + 0xb363, 0xb52c, 0x1e3e, 0x3319, 0xd209, 0xb2df, 0xb448, 0xb2e7, + 0xb401, 0xb3b7, 0x3269, 0x32e1, 0xb304, 0xb469, 0x34b7, 0xd96d, + 0xb446, 0xb4de, 0xb4b8, 0xb50a, 0xb270, 0x9e51, 0xb445, 0xb522, + 0xb4b5, 0xb51f, 0xb4fd, 0xb2e2, 0xb522, 0xb2e6, 0xb484, 0xb400, + 0xb4ba, 0x343a, 0xb4d5, 0x3442, 0xb444, 0xb508, 0x3505, 0xb512, + 0xb31b, 0xb44a, 0xb432, 0x3341, 0x3405, 0xb4b9, 0xc234, 0x33fd, + 0xb4e5, 0xb535, 0xb534, 0xa3ce, 0xd003, 0x4b27, 0x4b56, 0x4b5e, + 0xcba3, 0x1ff2, 0x209a, 0xa2b9, 0x9f8e, 0xb575, 0x23d9, 0xb558, + 0xb559, 0xa2c4, 0x22c5, 0xa2d1, 0x5d01, 0xdd25, 0x23d9, 0xb54d, + 0xb54e, 0x3582, 0xbb5b, 0xa0d8, 0x2b66, 0x2b78, 0x3585, 0x3586, + 0xb588, 0xb578, 0xb54c, 0xb5c9, 0xb570, 0x69c6, 0x69c8, 0x6a45, + 0xea71, 0xbb5d, 0x355b, 0xbb5b, 0xbbd9, 0x2b66, 0x2b78, 0x3569, + 0x3586, 0xb588, 0x2b66, 0x2b78, 0x3569, 0x3585, 0xb588, 0x2b66, + 0x2b78, 0x3569, 0x3585, 0xb586, 0x1e9d, 0x358a, 0x6f4a, 0xef50, + 0x1e9d, 0x3589, 0x6f4a, 0xef50, 0x358e, 0xef4b, 0x1efd, 0xaf6c, + 0xd9ba, 0x358b, 0xef4b, 0xb595, 0x359e, 0xd7a4, 0xb593, 0x65d8, + 0x6b25, 0x6b26, 0x6b2a, 0xeb2d, 0x3594, 0xd7a4, 0xe159, 0xb5ac, + 0xb5a9, 0xb5b7, 0xb5b5, 0xb5b2, 0xb5ad, 0x1e8e, 0x1e8f, 0xb275, + 0xb5d2, 0xb577, 0xb5c8, 0x4c31, 0xcc4f, 0x2e1c, 0xae5f, 0x2e61, + 0xb5db, 0xb5d9, 0xc121, 0xa6f8, 0xd20a, 0x234f, 0x2354, 0xa3f6, + 0x35f9, 0xb642, 0x2164, 0x363f, 0xb6e0, 0xb698, 0x35f6, 0xb642, + 0xb680, 0xb625, 0xb664, 0xb63b, 0x2347, 0xb6fb, 0xb626, 0xb719, + 0xb62c, 0xb6c7, 0xb14e, 0xc6a8, 0xb5fe, 0xb60a, 0xb60f, 0xc0a4, + 0xb630, 0xb62f, 0xa1ac, 0xb602, 0x365d, 0xb6f8, 0xb6e8, 0x6855, + 0xe86f, 0x35f7, 0xb6e0, 0x35f6, 0xb5f9, 0xb644, 0xb643, 0xb64b, + 0xb649, 0xb6ec, 0x3681, 0xb6c9, 0xb6c4, 0xb688, 0xb689, 0xb669, + 0x363c, 0xb6f8, 0xb660, 0xb65f, 0xb5ff, 0xb6df, 0xb65a, 0xb69c, + 0x3692, 0xc520, 0xb697, 0xb5fa, 0x3653, 0xb6c9, 0xb6ab, 0x4f6a, + 0xdfa0, 0xb655, 0xb656, 0xb674, 0x4156, 0xc157, 0x367b, 0x5af3, + 0x5c19, 0x65c7, 0xe68c, 0xb5f8, 0xb66e, 0xc545, 0x36ad, 0x36cd, + 0xc6a5, 0x2386, 0x23af, 0xb6c6, 0xb6d6, 0xb6c1, 0xb682, 0x36a4, + 0xc6a5, 0x1e86, 0xc7ad, 0xb6a8, 0xb654, 0x2386, 0x23a4, 0x23af, + 0xb6a6, 0xb619, 0x3653, 0xb681, 0x40a4, 0x4167, 0x41f3, 0xc7be, + 0xb6a4, 0xa411, 0xb6a7, 0xb668, 0x35f7, 0xb63f, 0xb63d, 0xb652, + 0x3d40, 0x4cac, 0x6eaf, 0x6eb4, 0xeeb9, 0xb6f5, 0xb6f3, 0x1e66, + 0x363c, 0xb65d, 0xb6fa, 0xb6f9, 0x2347, 0xb607, 0xb6fe, 0xb6fd, + 0xa1a3, 0x22d6, 0xa2d7, 0x9f1a, 0xd8e8, 0xb717, 0xb716, 0xb60e, + 0xb722, 0xb71f, 0xb71e, 0xb71b, 0xd0e7, 0x2932, 0xb94d, 0xa273, + 0xb72f, 0x372e, 0xd853, 0xc843, 0x3a38, 0xba8f, 0xb736, 0xb735, + 0x21e0, 0xba5f, 0xbbba, 0x594d, 0x66d1, 0xe6dc, 0x3a29, 0xbb0a, + 0xb87f, 0xa72c, 0x3766, 0x3919, 0xba86, 0xe0a8, 0xb9d3, 0xb89d, + 0xb803, 0x9f86, 0xb749, 0xb94a, 0xb9aa, 0x386e, 0xc6c3, 0xa091, + 0x9e1c, 0x2eba, 0x3780, 0x37a9, 0x37d7, 0x38a5, 0xeb06, 0xe5c6, + 0x2eba, 0x377e, 0x37a9, 0x37d7, 0xb8a5, 0xb975, 0x3406, 0xb9cb, + 0xb960, 0x1e2b, 0x3860, 0x390f, 0xb930, 0x5edb, 0x5ef6, 0xdf6d, + 0xd3d3, 0xba05, 0xb85d, 0xba1e, 0xb8d7, 0xbaea, 0xb80c, 0xb898, + 0xb8d6, 0x2eba, 0x377e, 0x3780, 0x37d7, 0xb8a5, 0x39cd, 0x6397, + 0xe453, 0xb953, 0xb89f, 0x23f0, 0x3aaf, 0xd01c, 0x32d0, 0xb7fa, + 0xb827, 0xd235, 0xb822, 0xb959, 0x2eba, 0x377e, 0x3780, 0x37a9, + 0xb8a5, 0xbac3, 0xbab8, 0xb7fb, 0x231b, 0xb7fe, 0xa948, 0x3801, + 0x387a, 0xba6e, 0xb805, 0xb7ff, 0x32d0, 0xb7b4, 0xb7e5, 0xba89, + 0x231b, 0xb7e9, 0xb7f9, 0xb894, 0x37f3, 0x387a, 0xba6e, 0x3764, + 0xbad4, 0x39ae, 0xd363, 0xb7f5, 0xba19, 0x385f, 0xb8e7, 0xbadb, + 0x39de, 0xbaf3, 0xb8df, 0x37a6, 0xbae8, 0x3aaa, 0xbadf, 0x3b04, + 0xbb17, 0xba39, 0x337f, 0xb8f2, 0x21d3, 0xb144, 0xa20a, 0xb7cf, + 0xb7bb, 0x3a43, 0xcb4f, 0x39d8, 0xba23, 0xd988, 0x271d, 0xbb12, + 0xb97f, 0x2353, 0xb9d5, 0xb852, 0xb851, 0xb90e, 0x3a31, 0xbafb, + 0xb7a1, 0x3808, 0xb8e7, 0x1e2b, 0x3792, 0xb90f, 0xba48, 0xb968, + 0xba94, 0xb9bf, 0x39d7, 0xba4b, 0xba3a, 0xba9c, 0xb9f3, 0xba01, + 0xba33, 0x376f, 0xc6c3, 0xba03, 0x37f3, 0x3801, 0xba6e, 0xbf06, + 0xb746, 0x3a11, 0xcc17, 0xb9f1, 0x3973, 0xb9d1, 0x4681, 0xc682, + 0xb800, 0xb7a7, 0xb761, 0xb7ad, 0x2eba, 0x377e, 0x3780, 0x37a9, + 0xb7d7, 0x2922, 0xa923, 0x3346, 0xcd91, 0xbaae, 0xb8f6, 0xb9e4, + 0x391c, 0xbaa2, 0xbb1e, 0xaf03, 0x38cb, 0x3ab1, 0x3ac0, 0xc881, + 0x38ca, 0x3ab1, 0x3ac0, 0xc881, 0xb936, 0xb7a8, 0xb7a3, 0xb80b, + 0xba0a, 0x3808, 0xb85f, 0xca1c, 0x337f, 0xb816, 0xb8be, 0xbac2, + 0xc897, 0xb9e8, 0x1e57, 0x9e58, 0xb858, 0x1e2b, 0x3792, 0xb860, + 0x47f4, 0xc887, 0xb95a, 0xb749, 0x38c0, 0xbaa2, 0xbadd, 0xb9e7, + 0xb9f6, 0xbb0f, 0xba3f, 0xba62, 0xb792, 0xd46e, 0xb8d5, 0xd45a, + 0xb768, 0x2932, 0xb72c, 0xb7ab, 0xba62, 0xb7d5, 0xb918, 0xb78f, + 0xb986, 0xb966, 0xb965, 0xb862, 0xc243, 0xba9d, 0x9e1a, 0x3885, + 0xb9d1, 0xb781, 0xba13, 0x1e50, 0xba02, 0xb842, 0xbb16, 0xb9b2, + 0xb961, 0xbaec, 0xbada, 0x3af8, 0xbb05, 0xc253, 0x2e72, 0xae79, + 0xb43e, 0xb769, 0x3804, 0xd363, 0xb985, 0xba4a, 0xe198, 0xb864, + 0xb9d9, 0x5028, 0xe392, 0xb784, 0xb7aa, 0x3885, 0xb973, 0xb760, + 0x39f9, 0xba70, 0x2353, 0xb84c, 0x3865, 0xba4b, 0x3837, 0xba23, + 0xb9c7, 0xba9f, 0x3abb, 0xce7f, 0xb80a, 0xbab3, 0xbae7, 0xb8bf, + 0xb920, 0xb901, 0xb884, 0xb868, 0xb922, 0xb9d4, 0xb869, 0x1e50, + 0xb97d, 0xb879, 0xb79e, 0xb8e5, 0xbad3, 0x3881, 0xcc17, 0xbac1, + 0xb97c, 0xb807, 0xb7a2, 0x3837, 0xb9d8, 0x3743, 0xbb0a, 0x3a6b, + 0xbace, 0x3aa3, 0xd262, 0x385c, 0xbafb, 0xb86a, 0x1e1b, 0x23e2, + 0x3b09, 0xd5c2, 0x3734, 0xba8f, 0xb811, 0xb866, 0xcf47, 0xb92b, + 0x3830, 0xcb4f, 0xb861, 0xb9b4, 0x3865, 0xb9d7, 0xb73a, 0x392d, + 0xb955, 0x3a2a, 0xbace, 0x37f3, 0x3801, 0xb87a, 0xb9d4, 0xbae5, + 0x3ad3, 0x5263, 0xd26a, 0xbade, 0xbaa9, 0xbafd, 0xb749, 0xb7fd, + 0x3734, 0xba38, 0xcc37, 0xb863, 0x3a98, 0xd617, 0xba97, 0xb867, + 0xb96b, 0xb9da, 0x38c0, 0xb91c, 0xba2f, 0xba81, 0x380e, 0xbadf, + 0xb8bc, 0x23f0, 0xb7b1, 0x38ca, 0x38cb, 0x3ac0, 0xc881, 0xb9df, + 0xb7e0, 0xb9db, 0x38ca, 0x38cb, 0x3ab1, 0xc881, 0xba12, 0xb8f9, + 0xb7dc, 0xa1f3, 0xd030, 0x3a2a, 0xba6b, 0x3a10, 0xba79, 0xb803, + 0xbb11, 0xb988, 0xb809, 0xb91f, 0xba7c, 0x380e, 0xbaaa, 0xba71, + 0xb9e0, 0xb80c, 0xb7a5, 0xb987, 0xb80a, 0xb989, 0xbb1e, 0x385c, + 0xba31, 0xba83, 0x380f, 0xbb17, 0xb989, 0x1e1b, 0x23e2, 0x3a37, + 0xd5c2, 0x3743, 0xba29, 0xb924, 0xbad5, 0x271d, 0xb83e, 0xb984, + 0x380f, 0xbb04, 0x60c1, 0x6b30, 0xeb31, 0x38c2, 0xbafa, 0x4f3a, + 0xcf3c, 0x31fd, 0x3b53, 0x3b61, 0xea69, 0x1ffd, 0x30de, 0xda22, + 0xbb5f, 0xbb50, 0xb17e, 0xbb3e, 0xbb58, 0xe4a6, 0xbb35, 0xdb0c, + 0x23f9, 0xa606, 0xbb27, 0x3b22, 0xbb61, 0x259c, 0x3198, 0xb199, + 0xbb3b, 0x355b, 0xb582, 0xb581, 0xbb24, 0x3b22, 0xbb53, 0x3b68, + 0xbb69, 0x3b65, 0xbb69, 0x3b65, 0xbb68, 0xa24d, 0x3e0b, 0x3f80, + 0xbf81, 0x6f52, 0xef7f, 0x1e97, 0x2c81, 0x2d57, 0xbb73, 0x1e97, + 0x2c81, 0x2d57, 0xbb72, 0x2386, 0x23af, 0xbb77, 0x2386, 0x23af, + 0xbb74, 0x2e30, 0x2f52, 0xc688, 0xbb7a, 0xbb79, 0x3bb1, 0xbbb2, + 0x273d, 0x3b7f, 0x3b81, 0xbca1, 0x273d, 0x3b7e, 0x3b81, 0xbca1, + 0xa92d, 0x273d, 0x3b7e, 0x3b7f, 0xbca1, 0xbba4, 0xbb98, 0xbb9e, + 0xbbae, 0xbb8b, 0xbbab, 0xbb92, 0xbbaf, 0xbb87, 0xbb9a, 0xbb93, + 0xbba1, 0x3b7c, 0xbbb2, 0x3b7c, 0xbbb1, 0xbbc6, 0xb147, 0xb740, + 0x28f3, 0xbbbc, 0x28f3, 0xbbbb, 0xbbc1, 0x3bc0, 0x41ec, 0xdb6d, + 0xdf42, 0xbbb4, 0x233b, 0xe1ab, 0xbbcf, 0xbbce, 0x50b2, 0xd8ac, + 0xa936, 0xc562, 0xbbd8, 0xbbd7, 0xb583, 0xbbee, 0xbc08, 0xc403, + 0xbbdf, 0xbbff, 0xbbf5, 0x4266, 0xc29b, 0xbc0c, 0x3be1, 0xbc0a, + 0xbc08, 0xbc07, 0x3c17, 0x3c23, 0xc081, 0x3c14, 0x3c23, 0xc081, + 0xe6f0, 0xbc2b, 0x3c14, 0x3c17, 0xc081, 0xbc2c, 0xbc22, 0xbc29, + 0xbc33, 0xbc32, 0x3c35, 0xbc3a, 0x3c34, 0xbc3a, 0x1ecc, 0x21ab, + 0xa1b0, 0x3c34, 0xbc35, 0x232f, 0x2f59, 0x2f5a, 0xbed9, 0xbf22, + 0xbcdb, 0x3c5a, 0xbc61, 0x3c59, 0xbc61, 0x3c59, 0xbc5a, 0xbe6f, + 0xbc74, 0xbc73, 0xbd36, 0xa1b3, 0xbef8, 0x3c89, 0xc00b, 0xbc88, + 0xbca1, 0xa1b2, 0xbdfb, 0xbe9d, 0x273d, 0x3b7e, 0x3b7f, 0x3b81, + 0xbc92, 0x3cfd, 0xbfa4, 0xc043, 0xbf1a, 0xc01d, 0xbdea, 0xbec4, + 0xbe22, 0xbf59, 0x3eec, 0xcc04, 0xe63b, 0xbcb2, 0xbcb1, 0xbfd4, + 0xe711, 0xa1b5, 0x1f71, 0xc04b, 0xbc4e, 0xbeaf, 0xbfd8, 0xa76d, + 0xda3b, 0x3d99, 0xbdda, 0xa1ba, 0xa933, 0xbfa9, 0x3edd, 0xc027, + 0xc018, 0xbffc, 0xc009, 0x3e8c, 0x3f51, 0xc67a, 0x3ca2, 0xbfa4, + 0xbd87, 0xbf54, 0xa1bd, 0xc051, 0xbf54, 0xbc79, 0xcaaa, 0xb6f2, + 0xbd79, 0xbde8, 0xbdfa, 0xbf3f, 0xbf86, 0xbe5e, 0xbeae, 0xbfc1, + 0xbe2c, 0xbfae, 0x3e08, 0xbfdf, 0x26a0, 0xc00f, 0xbefb, 0xbe3e, + 0xbef8, 0xbfc3, 0xbf6f, 0xbfdc, 0x3ee8, 0x3ff1, 0xbff5, 0xbfa3, + 0x3f82, 0x3f84, 0xc013, 0xbf94, 0xbd43, 0xa1c2, 0x21c3, 0xa857, + 0xbe7c, 0xbcfe, 0xbe09, 0xbe67, 0x5385, 0xd49e, 0x3cea, 0xbdda, + 0xbfe4, 0x3e0e, 0xc006, 0xbf87, 0xbdf6, 0xbf23, 0xbf7f, 0xbe26, + 0xbeb3, 0xbe19, 0xbecc, 0xbf64, 0x3f97, 0xc900, 0xbf32, 0x3e0b, + 0x3f80, 0x3f81, 0xbfc7, 0xbf04, 0xa1c5, 0xa1c9, 0xbfb1, 0xbe7d, + 0xc5f3, 0xa1c4, 0x3cea, 0xbd99, 0xbe0c, 0x21c0, 0xbd44, 0xbca6, + 0x2a6c, 0xbedb, 0xbe7b, 0x26e6, 0x3e0a, 0xbe15, 0xbd9e, 0xbe05, + 0xbd45, 0xbc97, 0xbdf8, 0xbe34, 0x3d4e, 0xbfdf, 0xbd89, 0x26e6, + 0x3df5, 0xbe15, 0x3b6e, 0x3da9, 0x3f80, 0xbf81, 0xbde5, 0xbf2c, + 0x3d9c, 0xc006, 0xbf38, 0xbfa0, 0x2d60, 0x3eaa, 0x5c3f, 0xdc40, + 0xbf01, 0x26e6, 0x3df5, 0xbe0a, 0xc00b, 0xbef2, 0xbda3, 0xa1cf, + 0xbca8, 0xbda1, 0xbeab, 0xbd4b, 0xbe07, 0x6030, 0xe04a, 0xbd51, + 0xa1d1, 0xbd48, 0xbd8c, 0xbc64, 0xbdf3, 0xbd85, 0xbdc4, 0xc063, + 0x3ebc, 0xbfd5, 0x3ee1, 0xbeff, 0xbfda, 0xa24c, 0xbf70, 0xbffa, + 0xbf0a, 0xbf11, 0x3cfc, 0x3f51, 0xc67a, 0xa3b5, 0x3fdb, 0xd499, + 0x21c6, 0xa1d6, 0xbf91, 0xbc9f, 0x2d60, 0x3e13, 0x5c3f, 0xdc40, + 0xbe29, 0xbd49, 0x3cdd, 0xe061, 0xbda2, 0x4194, 0xe394, 0x3e7f, + 0xbfd5, 0xbca7, 0xc06d, 0xbda4, 0xd365, 0xbf77, 0x232f, 0xbc47, + 0xbefe, 0xbdeb, 0x3cf7, 0xc027, 0xbeef, 0x404e, 0x4054, 0xc067, + 0xc044, 0x3e80, 0xbeff, 0xc005, 0xbffe, 0xbfeb, 0xc064, 0x3d5c, + 0x3ff1, 0xbff5, 0xc058, 0xbfa6, 0x3caa, 0xcc04, 0xbede, 0xbe17, + 0x2364, 0x3f9b, 0xc002, 0x3c7b, 0xbd52, 0xbd50, 0xbeda, 0x3e80, + 0xbee1, 0xbe14, 0xbdaf, 0xb87c, 0xbe87, 0xbe89, 0xc055, 0xbca4, + 0xbc49, 0xbd9f, 0x1e79, 0x1e7e, 0x9e81, 0xc1b3, 0xbe0d, 0xbf44, + 0xbda8, 0xbe10, 0xbd46, 0xe88d, 0xbf31, 0xc04c, 0xc020, 0xc01f, + 0xc032, 0xbff0, 0x3cfc, 0x3e8c, 0xc67a, 0x3d01, 0xbd2f, 0xbca9, + 0x3f5c, 0xbff3, 0x3f5b, 0xbff3, 0xbda6, 0xbd54, 0xbe83, 0xc026, + 0xbed7, 0xbda0, 0x3b6e, 0x3da9, 0x3e0b, 0xbf81, 0x3b6e, 0x3da9, + 0x3e0b, 0xbf80, 0x3d67, 0x3f84, 0xc013, 0x3d67, 0x3f82, 0xc013, + 0xbd47, 0xbd9d, 0xbe9c, 0xbd69, 0xbda7, 0xbfb3, 0x2364, 0x3ef7, + 0xc002, 0xc03e, 0x21db, 0xa1dc, 0xbe11, 0xbd63, 0x3ca2, 0xbcfd, + 0xbeea, 0xbcf6, 0xbd4d, 0xc032, 0xbdc0, 0xbf9a, 0xbd4a, 0xbd53, + 0xbda9, 0x4028, 0xc02c, 0xc015, 0xbcb5, 0x3e7f, 0xbebc, 0xbcde, + 0x3e81, 0xc02f, 0x3e95, 0xd499, 0xbd55, 0x3d4e, 0xbe08, 0xbd9b, + 0xbee5, 0xbf4d, 0x3d5c, 0x3ee8, 0xbff5, 0x3f5b, 0xbf5c, 0x3d5c, + 0x3ee8, 0xbff1, 0x65ca, 0xe614, 0xbe85, 0xbcfa, 0xbee4, 0x2364, + 0x3ef7, 0xbf9b, 0xbee2, 0x3d9c, 0xbe0e, 0xbcfb, 0x3c88, 0xbe16, + 0xbd4f, 0x3d67, 0x3f82, 0xbf84, 0xbfd2, 0xbcf8, 0xbca5, 0xbf47, + 0xbf46, 0xbf74, 0x3cf7, 0xbedd, 0x3fd1, 0xc02c, 0x3fd1, 0xc028, + 0xbfda, 0xaf25, 0x3f4b, 0xbfb0, 0xbf9c, 0xbca3, 0xbee0, 0x1f71, + 0xbcd5, 0xbf45, 0x3edf, 0xc054, 0xc05d, 0xbd12, 0x3edf, 0xc04e, + 0xbf13, 0xbee9, 0xc04f, 0xbe7e, 0xbee6, 0xbedf, 0xbec5, 0x2149, + 0xc097, 0xc1c8, 0x670a, 0x671b, 0xe748, 0x4ac3, 0xcac8, 0x40fe, + 0xdd64, 0x407e, 0xc0d6, 0x407d, 0xc0d6, 0xc1e6, 0xc16c, 0x3c14, + 0x3c17, 0xbc23, 0x4210, 0x6229, 0xe46a, 0x23cd, 0xa3db, 0xc08f, + 0xc08e, 0x2149, 0xc06e, 0xc152, 0xc197, 0x362d, 0x36cc, 0x4167, + 0x41f3, 0xc7be, 0x4832, 0x491f, 0xc92e, 0xc0f1, 0xcf39, 0xeede, + 0x1e3a, 0xc232, 0x4149, 0x632c, 0xe34a, 0xc1be, 0xc20d, 0x41d7, + 0x421b, 0xc224, 0xc0f4, 0xc16c, 0x9e4c, 0x407d, 0xc07e, 0xc1ed, + 0xc159, 0xc169, 0x413c, 0xc1d2, 0x41c1, 0xc217, 0xc1f4, 0xc1d9, + 0xc1fc, 0xc1b1, 0xc0af, 0xc0c3, 0xc1a2, 0x407b, 0xdd64, 0xe2b7, + 0x21de, 0x4155, 0x4188, 0xc199, 0xe2b2, 0x9e9f, 0x4130, 0xc1c4, + 0xc165, 0xc1dc, 0xc1fe, 0x41cc, 0xc1d3, 0xb5e0, 0xc133, 0xc162, + 0x4114, 0xc1c4, 0xc126, 0x40e7, 0xc1d2, 0xe35b, 0x40bc, 0x632c, + 0xe34a, 0xc16e, 0xc09c, 0x21de, 0x4108, 0x4188, 0xc199, 0xb696, + 0xb696, 0xc0df, 0x412d, 0xd315, 0xc115, 0x36cc, 0x40a4, 0x41f3, + 0xc7be, 0xc0e6, 0x4080, 0xc0ca, 0xc151, 0x417e, 0xc185, 0x4174, + 0xc185, 0x4174, 0xc17e, 0x21de, 0x4108, 0x4155, 0xc199, 0xc1fb, + 0xd367, 0x3eb6, 0xe394, 0xc09d, 0x21de, 0x4108, 0x4155, 0xc188, + 0xc0fd, 0xc0ed, 0xe88e, 0xbf2b, 0xc1ba, 0xc1b9, 0xc0bd, 0x40e8, + 0xc217, 0x4114, 0xc130, 0xc06f, 0x411a, 0xc1d3, 0xac1e, 0x48f7, + 0xcca6, 0x40e7, 0xc13c, 0x411a, 0xc1cc, 0xedf0, 0x40c2, 0x421b, + 0xc224, 0xc0eb, 0xc116, 0x25b6, 0xd425, 0xc07f, 0xbbc1, 0xc0db, + 0x36cc, 0x40a4, 0x4167, 0xc7be, 0xc0e9, 0xc18f, 0xc0ec, 0xc118, + 0xd000, 0xc0c1, 0xc089, 0x40e8, 0xc1c1, 0x40c2, 0x41d7, 0xc224, + 0x40c2, 0x41d7, 0xc21b, 0x9e89, 0xb11b, 0x1e3a, 0xc0ba, 0xb52b, + 0xc23a, 0xc237, 0x9fce, 0x2c12, 0x2c13, 0xac14, 0x9e2c, 0xae8a, + 0xb96a, 0xa889, 0xa899, 0xcb3a, 0xc258, 0x4255, 0x4a93, 0x4a97, + 0xcabb, 0xb99c, 0x424e, 0x4a93, 0x4a97, 0xcabb, 0xc24d, 0xc25c, + 0xc25b, 0xab83, 0x3c02, 0xc29b, 0x1f10, 0xa0a0, 0xb2b5, 0xc27d, + 0x42a0, 0xc2a7, 0xc275, 0xc282, 0xc281, 0xa954, 0xc2a2, 0xd366, + 0x3c02, 0xc266, 0x427a, 0xc2a7, 0xc28a, 0x427a, 0xc2a0, 0xc2ad, + 0xc2ac, 0xa3d0, 0xdc7a, 0x5c7b, 0xdc8b, 0xc2c0, 0xc377, 0xc341, + 0xc336, 0xc2b6, 0x2448, 0xb282, 0xc2fd, 0xdc7e, 0xc329, 0xc36e, + 0xc370, 0xdc89, 0xaf87, 0xc368, 0xc2f9, 0xc345, 0xc36a, 0xc319, + 0xc344, 0xc33b, 0x430d, 0xdc8d, 0xc2ed, 0xc2c8, 0xc318, 0xb08d, + 0xc36b, 0xd653, 0xdc8e, 0x42f8, 0xdc8d, 0x431f, 0xc375, 0xc37c, + 0xc2fe, 0xc2f0, 0x430e, 0xc375, 0xc380, 0xc33f, 0xc2cc, 0xdc6c, + 0xdc93, 0xd75f, 0xc37b, 0xdc92, 0xc366, 0xc371, 0xc2b9, 0xc2f2, + 0x4328, 0xd76f, 0xc2b8, 0xc2f1, 0xc2ee, 0xe3e1, 0x2956, 0x2968, + 0xa96c, 0xdc98, 0xee9e, 0xc359, 0xc358, 0x217d, 0xc378, 0xc332, + 0xc2ec, 0xc2ef, 0x4303, 0xc381, 0xc37a, 0xc2dd, 0xc2de, 0xc335, + 0xd3b7, 0x430e, 0xc31f, 0xc2b7, 0x217d, 0xc363, 0xc36d, 0xc32e, + 0xc315, 0xdc9b, 0xc321, 0xc36b, 0x583c, 0xdc9c, 0xa999, 0xa35b, + 0xc4a3, 0xc4b5, 0xc452, 0xc46a, 0x43cf, 0xc474, 0xcfeb, 0xc44b, + 0xc4b0, 0xc3fe, 0xc472, 0xc447, 0xc4bd, 0x4409, 0x4460, 0xc4a2, + 0xc3ce, 0xc3cd, 0x43a8, 0xc474, 0xc43a, 0xc4cf, 0x4434, 0xc439, + 0x2b9d, 0x2bda, 0x2bf3, 0xabf6, 0xa72d, 0xc4ab, 0x448e, 0xc4d4, + 0xc43f, 0xc894, 0xc3b0, 0xbbec, 0xc46f, 0x43cb, 0x4460, 0xc4a2, + 0x4483, 0xc4c8, 0xc4a1, 0xc489, 0x4411, 0xc463, 0x4410, 0xc463, + 0xe6d5, 0x43e1, 0xc439, 0x43e1, 0xc434, 0xc3d0, 0xc4ca, 0xc3f2, + 0xc3b3, 0xc3ae, 0xc39a, 0xc8af, 0x43cb, 0x4409, 0xc4a2, 0x4410, + 0xc411, 0xc476, 0xc4a1, 0xd3b9, 0xc39b, 0xc405, 0xc4cc, 0xc3b1, + 0x43a8, 0xc3cf, 0xc464, 0xc4a6, 0xc4b8, 0x440d, 0xc4c8, 0xc4bf, + 0xc40f, 0x43f1, 0xc4d4, 0x440e, 0xc468, 0x43cb, 0x4409, 0xc460, + 0xc391, 0xc477, 0xc3f0, 0xc3af, 0xc399, 0xc478, 0x28d0, 0xc3ba, + 0xc487, 0x440d, 0xc483, 0xc4da, 0xc43c, 0xc470, 0xc3d1, 0xc4da, + 0x43f1, 0xc48e, 0x44c9, 0xc4d2, 0xaf01, 0xcf38, 0xc515, 0xc50c, + 0x4501, 0xcf3e, 0xc506, 0x44f6, 0xcf3e, 0xc4f7, 0xc4ef, 0x287c, + 0x4816, 0xc8da, 0xc4ee, 0x4f42, 0xcf4c, 0x2617, 0x2690, 0xac1d, + 0xb674, 0x1ea7, 0xc523, 0x1ea7, 0xc522, 0x4a4c, 0x52cf, 0xd607, + 0x2b81, 0x2bcd, 0x2bd5, 0x2bd7, 0x2bdc, 0xabe7, 0xe6fb, 0x9fbd, + 0x2722, 0xc53c, 0x2212, 0x2283, 0x2290, 0x456b, 0xc575, 0x2722, + 0xc53a, 0xc54e, 0xc55d, 0x4559, 0xc571, 0xb6a2, 0x1ea9, 0x4552, + 0x455d, 0xc55e, 0xd015, 0x283a, 0xc54d, 0x283a, 0xc54c, 0xc53d, + 0xc560, 0x1ea9, 0x4546, 0x455d, 0xc55e, 0x4544, 0xc571, 0xa959, + 0x1ea9, 0x4542, 0x4546, 0x4552, 0xc55e, 0x1ea9, 0x4546, 0x4552, + 0xc55d, 0xc551, 0xa793, 0xbbd5, 0xc567, 0xc565, 0xc56a, 0xc568, + 0x453b, 0xc575, 0xaf02, 0x4544, 0xc559, 0x23e0, 0x4582, 0x4589, + 0xc58a, 0xc587, 0x453b, 0xc56b, 0xaf53, 0xc585, 0xa84d, 0x23e0, + 0x4573, 0x4589, 0xc58a, 0x457a, 0xc586, 0xc585, 0xc574, 0x23e0, + 0x4573, 0x4582, 0xc58a, 0x23e0, 0x4573, 0x4582, 0xc589, 0x458f, + 0xde08, 0x458e, 0xde08, 0xc664, 0xc642, 0xc627, 0xc658, 0xc60d, + 0xd0ac, 0xc667, 0xc632, 0xc621, 0xc60b, 0x46b0, 0xe764, 0xc5fe, + 0xc665, 0xc670, 0xc5d9, 0xc662, 0x24d1, 0x2516, 0x255e, 0xc602, + 0xc5c9, 0xc646, 0xc626, 0xc613, 0xc647, 0xd139, 0x45f3, 0xeebb, + 0x3dcb, 0x45f2, 0xeebb, 0xc661, 0xc5fa, 0xc5f9, 0xc5b4, 0x24d1, + 0x2516, 0x255e, 0xc5d6, 0xc649, 0xc62e, 0x3108, 0xc652, 0xc5af, + 0xc5a1, 0xc5ea, 0xa591, 0xc61e, 0xc63b, 0xc617, 0xc5ae, 0xc645, + 0xc5e9, 0xc59f, 0xc65f, 0xc671, 0xc606, 0xc5ad, 0xc63b, 0x4618, + 0xc63a, 0xc66e, 0xc66d, 0xc597, 0x2af6, 0xb194, 0xc624, 0xc5e8, + 0xc5eb, 0xc605, 0x3108, 0xc609, 0x4670, 0xd1c3, 0xc5a0, 0xc669, + 0xc62a, 0xc5f4, 0xc5d2, 0xc66c, 0xc596, 0xc5c7, 0xc5ac, 0xc65e, + 0xc672, 0xc663, 0xc63f, 0xc63e, 0xd1de, 0x45c8, 0x4655, 0xd1c3, + 0xc62b, 0xc66b, 0xc675, 0xc674, 0x23d1, 0x32e8, 0x34a5, 0x3cfc, + 0x3e8c, 0x3f51, 0x467c, 0x6166, 0x6197, 0xe1b1, 0xa0dc, 0x23d1, + 0xc67a, 0x388d, 0xc682, 0x388d, 0xc681, 0xdc8c, 0x2e30, 0x2f52, + 0xbb78, 0xc690, 0x2373, 0xa37d, 0xdccb, 0xc68b, 0xc69a, 0x21d2, + 0xc691, 0xc6a1, 0xc69e, 0x36a4, 0xb6ad, 0xb61f, 0x45b1, 0xe764, + 0xc6ba, 0x46b8, 0xc6b9, 0xef13, 0x46b2, 0xc6b9, 0x46b2, 0xc6b8, + 0xc6b1, 0xef13, 0xc6c8, 0x376f, 0xb86e, 0xc6cd, 0xc6c1, 0x4f3d, + 0x6262, 0xe4b5, 0xc897, 0xc6c7, 0xc6de, 0x2869, 0xee7d, 0x46e3, + 0xdb7c, 0x5462, 0xd4cb, 0xc6dc, 0xc6e4, 0xcc20, 0xc6d7, 0xc6cf, + 0xac3d, 0x46d1, 0xdb7c, 0xc6d8, 0xa362, 0x5361, 0xd62f, 0x1eff, + 0xa023, 0xc742, 0x23bf, 0xce23, 0xc798, 0x5996, 0xd9c6, 0xb14e, + 0xc71f, 0xc71e, 0xc726, 0xc725, 0xc72f, 0xc7d3, 0x472b, 0xc787, + 0xc760, 0x1e51, 0x1f17, 0xd846, 0xd457, 0xc75c, 0xc709, 0xa6f0, + 0xc75e, 0xc7bc, 0xc741, 0xc750, 0xc737, 0xc765, 0xc764, 0xd9a9, + 0x23e1, 0xa8e1, 0xc7c1, 0xc7b6, 0xc72f, 0xc79e, 0xcff3, 0xc70d, + 0xc792, 0xc7aa, 0xc7d2, 0xc7da, 0xc7a0, 0x1e86, 0xb6b8, 0xc7d9, + 0xc786, 0xc751, 0x36cc, 0x40a4, 0x4167, 0xc1f3, 0xc785, 0xd499, + 0xc7a2, 0xc72c, 0xc7b0, 0xc7a9, 0xcb36, 0x47e7, 0xda20, 0x9faf, + 0x47e4, 0xda20, 0xc7ef, 0xc7eb, 0x3917, 0x4887, 0xc8f8, 0xc8ef, + 0xc92c, 0x483f, 0x4926, 0x6271, 0x62db, 0xe45b, 0xc8ad, 0xc8bc, + 0xc8c7, 0xc88e, 0x287c, 0x450e, 0xc8da, 0xc868, 0xc86f, 0xc8b8, + 0xa38e, 0xc8aa, 0xc8d6, 0x40ae, 0x491f, 0xc92e, 0xc92a, 0xc931, + 0xc92b, 0x47ff, 0x4926, 0x6271, 0x62db, 0xe45b, 0xc90e, 0xc85c, + 0xb731, 0xc8a9, 0xc864, 0xc8fd, 0xc8d1, 0xc904, 0xc841, 0xc856, + 0xc817, 0xc912, 0x27c6, 0x48ba, 0xc8bb, 0xc81a, 0xc8e0, 0x6e78, + 0x6e7b, 0xee7c, 0x38ca, 0x38cb, 0x3ab1, 0xbac0, 0x3917, 0xc7f4, + 0xc919, 0xc815, 0xc3f7, 0x27fc, 0x2d0e, 0xad5c, 0x27e6, 0x3900, + 0xc6cc, 0xc8e7, 0xc8e3, 0x2ca9, 0x2d52, 0xad53, 0xe7a8, 0xc855, + 0xc827, 0xc800, 0xc459, 0x33bd, 0xde2b, 0x6e78, 0xee7c, 0xc81c, + 0x486e, 0xc8bb, 0x486e, 0xc8ba, 0xc801, 0xc920, 0xc812, 0xc859, + 0xe695, 0xa387, 0xc82c, 0x287c, 0x450e, 0xc816, 0xc875, 0xc89c, + 0xc89b, 0xc7f6, 0xc1d0, 0xc7f4, 0xeec4, 0xc857, 0xbda7, 0xc85a, + 0x6669, 0x667a, 0xe6aa, 0x2760, 0xa89c, 0xc840, 0xc86a, 0xc88d, + 0x40ae, 0x4832, 0xc92e, 0xc8c1, 0x47ff, 0x483f, 0x6271, 0x62db, + 0xe45b, 0xc83a, 0xc83e, 0xc7fe, 0x40ae, 0x4832, 0xc91f, 0xc83b, + 0xc93b, 0xc93a, 0xc9ae, 0xc9b4, 0xc9a9, 0xc9a1, 0xa996, 0xc995, + 0xc9d8, 0xc9b0, 0xc98e, 0xb346, 0xc9b1, 0xc98d, 0xc984, 0xca1f, + 0xc97f, 0xc9aa, 0xc978, 0xc96f, 0xc94e, 0xc943, 0xafa1, 0xc940, + 0xc985, 0xc93c, 0xc962, 0xc977, 0xc93f, 0xe6e2, 0xc9c3, 0xa3b6, + 0xc9bf, 0xca08, 0x527a, 0x52b8, 0x541f, 0x54fa, 0xd5dd, 0xcc7c, + 0xae74, 0x49cc, 0x4a50, 0x67a6, 0x67a7, 0xef9d, 0x49cb, 0x4a50, + 0xef9d, 0xca2e, 0xd018, 0x4a09, 0xccb3, 0xcc83, 0xa3ea, 0xe8eb, + 0xc955, 0xca4d, 0x4a31, 0xca6a, 0xca2d, 0xca62, 0xca60, 0x4a3e, + 0x4a3f, 0x55c1, 0xd5f3, 0xca0e, 0x4a5e, 0xca6d, 0xc9c6, 0x49d4, + 0xccb3, 0xca05, 0x4cba, 0xd5ad, 0x4a3a, 0xca49, 0xb8f1, 0xc980, + 0xca4c, 0xc9f8, 0xc9cd, 0x49f0, 0xca6a, 0xca3b, 0x4a4f, 0xca69, + 0x4a1a, 0xca49, 0xca32, 0x4a01, 0x4a3f, 0x55c1, 0xd5f3, 0x4a01, + 0x4a3e, 0x55c1, 0xd5f3, 0x4cd3, 0xdc37, 0xca57, 0x4c87, 0xcce0, + 0x4a1a, 0xca3a, 0x4526, 0x4a23, 0x52cf, 0xd607, 0xc9ef, 0x6834, + 0xe896, 0x4a33, 0xca69, 0x49cb, 0x49cc, 0xef9d, 0xca61, 0xca42, + 0x4a06, 0xca6d, 0xc9fe, 0xca51, 0xc9fd, 0xca70, 0x6839, 0x683a, + 0x683d, 0xe893, 0x4a33, 0xca4f, 0x49f0, 0xca31, 0xd3b7, 0x4a06, + 0xca5e, 0xca63, 0x4aae, 0xcac6, 0xab86, 0xe631, 0xab8a, 0xcaca, + 0xcab3, 0xcac5, 0xcab5, 0x4aaf, 0xcab0, 0x424e, 0x4255, 0x4a97, + 0xcabb, 0x424e, 0x4255, 0x4a93, 0xcabb, 0xcac4, 0xcaa9, 0xcaba, + 0xcac7, 0xca9d, 0xbd3c, 0xde30, 0x2be0, 0xcab6, 0x4a77, 0xcac6, + 0x4a91, 0xcab0, 0x4a91, 0xcaaf, 0xca8a, 0xca8e, 0x2be0, 0xcaad, + 0xcaa5, 0x424e, 0x4255, 0x4a93, 0xca97, 0x4076, 0xcac8, 0xca9c, + 0xca8d, 0x4a77, 0xcaae, 0xcaa6, 0x4076, 0xcac3, 0xca83, 0xa947, + 0x4aea, 0xdc4e, 0x9f2b, 0x6f8d, 0xef92, 0x1e26, 0x20a1, 0xae76, + 0x4af6, 0xcaf8, 0x9fdf, 0x5abc, 0xdc0a, 0x4ad6, 0xdc4e, 0x4ade, + 0xcaf8, 0x4ade, 0xcaf6, 0xcbea, 0xcbe4, 0x4b4d, 0xcbb0, 0x2173, + 0xa4b2, 0xcb46, 0xcb67, 0xcb8d, 0x218a, 0x218c, 0x3547, 0x4b56, + 0x4b5e, 0xcba3, 0x9f53, 0x4bc4, 0xd303, 0xc7e2, 0x424b, 0xcb8b, + 0x4bed, 0xcc60, 0xcc69, 0xcbb2, 0xcb14, 0xd9d4, 0x4b0b, 0xcbb0, + 0x3830, 0xba43, 0xcb7a, 0xcbc9, 0x3547, 0x4b27, 0x4b5e, 0xcba3, + 0xcc06, 0xcb82, 0xcbf3, 0xcbe9, 0xcc39, 0xcb8f, 0x3547, 0x4b27, + 0x4b56, 0xcba3, 0xcb15, 0xcbe0, 0xcc4c, 0xcb50, 0xcbd4, 0x4c3d, + 0x4c56, 0xcc64, 0xcbe0, 0xcc21, 0xcb59, 0xcbe6, 0x00f6, 0x1e2a, + 0xa00b, 0xcb3a, 0xcb1f, 0xcb5d, 0xae1a, 0xcc59, 0xa284, 0x3547, + 0x4b27, 0x4b56, 0xcb5e, 0x4c00, 0xd536, 0xcbcb, 0xcc5c, 0xcc6e, + 0xcc1e, 0xcc2b, 0xcbdb, 0x4b0b, 0xcb4d, 0xcb45, 0xd282, 0x4b35, + 0xd303, 0xd483, 0xcb51, 0x2327, 0xcba7, 0xad4c, 0xcc23, 0xcc0d, + 0xcb7c, 0xcc46, 0xcbac, 0x4b71, 0xcb7f, 0xcc12, 0xcb03, 0xcb86, + 0x4b5b, 0x4c01, 0xcc6d, 0xcafe, 0x4b3c, 0xcc60, 0xcc43, 0xcc5b, + 0xcc6c, 0xaf57, 0xcb5a, 0x4ba6, 0xd536, 0x4be9, 0xcc6d, 0x3caa, + 0xbeec, 0xcb58, 0xcbd3, 0x4c14, 0xd4d1, 0xcbe1, 0x4c11, 0xd4d1, + 0xcc6a, 0x3881, 0xba11, 0xcc2b, 0xcbaa, 0xc6d9, 0xcb80, 0xcbd1, + 0xa142, 0x4bab, 0xcc18, 0x35d7, 0xcc4f, 0xba90, 0xcb5c, 0xcb7e, + 0xae18, 0x4c52, 0xcc55, 0xcc5f, 0xcbee, 0xcbd7, 0xcb79, 0x35d7, + 0xcc31, 0xcc58, 0xcc40, 0x55ae, 0xd5ea, 0xcc40, 0x4b7e, 0xcc64, + 0x4c50, 0xd5e4, 0xcb93, 0xcbef, 0xcba8, 0xcc41, 0x4b3c, 0xcbed, + 0x4b7e, 0xcc56, 0xcb3e, 0xcc16, 0xcbf1, 0x4be9, 0xcc01, 0xcba9, + 0x2401, 0xefa5, 0xccf4, 0xe85e, 0xc9c8, 0xc9d5, 0x4a45, 0xcce0, + 0xccb9, 0xeea4, 0xeecf, 0x5083, 0xd085, 0xccf6, 0xccf2, 0xccb5, + 0x1ffc, 0xeb3b, 0xc1d0, 0x2986, 0x299d, 0x2a24, 0xccda, 0xccde, + 0x36f2, 0x6eaf, 0x6eb4, 0xeeb9, 0xcce7, 0x49d4, 0xca09, 0xcca4, + 0xcc8b, 0xca17, 0xccc9, 0xccdd, 0x6762, 0x6eaa, 0x6eab, 0x6eb5, + 0xeeba, 0xe931, 0xccbd, 0xe92c, 0x4a40, 0xdc37, 0xe93b, 0x2986, + 0x299d, 0x2a24, 0xcca7, 0xccc1, 0xccaa, 0x4a45, 0xcc87, 0xe94e, + 0xccae, 0x26e2, 0xa6e3, 0xcc9d, 0xcc74, 0xcc9c, 0x1e1d, 0x4cf9, + 0x4d72, 0xce9f, 0x4cf8, 0xce9f, 0xccfe, 0x1fc2, 0x4e18, 0x4e4b, + 0xce6b, 0x229f, 0xccff, 0x4cfa, 0xcea0, 0x229f, 0xccfc, 0xceaa, + 0xcea3, 0xcea6, 0xcea2, 0xcea1, 0xcea5, 0xcea8, 0xceab, 0xceb9, + 0xceb3, 0xcebd, 0xcebe, 0xceaf, 0xceb0, 0xcebc, 0xceb1, 0x4d8b, + 0xceae, 0x2e0b, 0xceb8, 0xcea7, 0xceb7, 0xcead, 0x4d4d, 0xceb4, + 0xceba, 0xcdb7, 0xcd2e, 0xcdca, 0x4da2, 0xcef8, 0x324e, 0xcd25, + 0x4e32, 0x4e8d, 0x4e9d, 0xcf27, 0xcec6, 0xcec2, 0xcec1, 0xcec5, + 0xcebb, 0xcecd, 0xcec0, 0xcecb, 0xced0, 0xcecc, 0xcec8, 0xaf26, + 0xcec4, 0xcd97, 0x4eca, 0xe77d, 0xae15, 0xcea9, 0x4d93, 0xcecf, + 0xcd1d, 0xced7, 0xcec1, 0xced3, 0x34a7, 0x4d76, 0xcedd, 0xce8a, + 0xcdea, 0x4e27, 0xcee6, 0x4ed4, 0xd8b4, 0xcede, 0xcedc, 0xceda, + 0x4dab, 0x4dda, 0x4ebf, 0xcf10, 0xd32f, 0xced9, 0xced2, 0xced6, + 0x4d82, 0xcedf, 0x1e1d, 0xccf8, 0xcedb, 0x4e6a, 0xced8, 0x34a7, + 0x4d55, 0xcedd, 0xce36, 0x4e6d, 0xd812, 0xcee2, 0xced1, 0x4d71, + 0xcedf, 0xcee1, 0xcee0, 0xcee8, 0xcee3, 0xcd18, 0xcee4, 0xcee5, + 0x3346, 0xb8b1, 0x4d4c, 0xcecf, 0xcd45, 0x4e7c, 0xcee7, 0x4e8c, + 0x4eed, 0xdce1, 0xcefc, 0xcf0d, 0x4dd1, 0xceff, 0x4d2c, 0xcef8, + 0xcefb, 0x4d64, 0x4dda, 0x4ebf, 0xcf10, 0xcef6, 0xcef4, 0xcef9, + 0xcefe, 0xceb2, 0xcf51, 0x4e43, 0xcef7, 0x23d5, 0xcf00, 0xaf69, + 0xcd23, 0xceb6, 0xcefa, 0xceee, 0xcefd, 0x4e5b, 0xcef0, 0xceeb, + 0xcef5, 0xcef2, 0xcf01, 0xcd27, 0xceef, 0xcde1, 0x303b, 0x3460, + 0x4deb, 0xce3d, 0xce41, 0x4da0, 0xceff, 0x4dd6, 0xceea, 0xcef1, + 0xce83, 0x4dd2, 0xceea, 0xcf03, 0xcf04, 0xcf02, 0x4d64, 0x4dab, + 0x4ebf, 0xcf10, 0xcef5, 0xcf09, 0xcf0e, 0xcf14, 0x4dcd, 0xcf17, + 0x4e01, 0xcf18, 0xd913, 0xcf0c, 0xcf16, 0xcf13, 0xcd5a, 0x303b, + 0x3460, 0x4dcf, 0xce3d, 0xcf05, 0xceac, 0xcf11, 0xcf08, 0xcec3, + 0xcf0f, 0xcf07, 0xd1f4, 0x4e15, 0xcf0a, 0x4de3, 0xcf18, 0x4e69, + 0xcef3, 0xd426, 0xcf19, 0xcf22, 0xcf12, 0xcec9, 0xcf23, 0x4dfc, + 0xcf0a, 0xcf1e, 0x4cfb, 0x4e4b, 0xce6b, 0xcf1a, 0xcf1c, 0xcf1f, + 0xcf1b, 0x23bf, 0xc70c, 0x4e31, 0xceb5, 0x4d5b, 0xcee6, 0xae4c, + 0xcf1d, 0xcf21, 0xcf29, 0x4e26, 0xceb5, 0x4d2f, 0x4e9d, 0xcf27, + 0xcea4, 0xcf26, 0x4d77, 0xe9bd, 0xcf15, 0xcf25, 0x303b, 0x3403, + 0x3460, 0x4dcf, 0xcdeb, 0xcee9, 0xcdd0, 0x4db3, 0xcef7, 0x4e70, + 0xcf2b, 0xcf2a, 0xce66, 0x4e8e, 0x4e96, 0xcea4, 0x4cfb, 0x4e18, + 0xce6b, 0x4e61, 0xcee3, 0xcf2f, 0xcec7, 0xcf2e, 0x1f1e, 0xa098, + 0xcffb, 0xcf2d, 0xcdbd, 0xced5, 0x4e4d, 0xcee3, 0xcf0b, 0xce82, + 0xce48, 0x4e04, 0xcef3, 0x4d75, 0xced8, 0x4cfb, 0x4e18, 0xce4b, + 0x4d78, 0x5327, 0xd812, 0x4f30, 0xe7c1, 0xcf33, 0x4e45, 0x4f2b, + 0xcf32, 0xcf34, 0xcece, 0x4d99, 0xcee7, 0xcf24, 0xcf31, 0xb9db, + 0xce64, 0xcdd5, 0xe8a3, 0xcf2c, 0x4e98, 0xcf35, 0x4d56, 0xcea9, + 0x4d9a, 0x4eed, 0xdce1, 0xcd2f, 0x4e4a, 0x4e96, 0xcea4, 0x4e92, + 0xcf20, 0x4e8f, 0xcf20, 0xcf28, 0xb24d, 0x4e4a, 0x4e8e, 0xcea4, + 0x4e89, 0xcf35, 0xcf06, 0x4d2f, 0x4e32, 0xcf27, 0x4cf8, 0xccf9, + 0xccfe, 0xcd06, 0xcd05, 0xcd02, 0x4e34, 0x4e4a, 0x4e8e, 0xce96, + 0xcd07, 0xcd04, 0xcd1a, 0xcd08, 0x4d4b, 0xce8a, 0xcd00, 0xcd09, + 0xcdef, 0xcd1c, 0xcd18, 0xcd14, 0xcd15, 0xcd17, 0xcdb1, 0xcd0d, + 0xcd1d, 0x4e26, 0xce31, 0xcdb8, 0xcd1b, 0xcd19, 0xcd0b, 0xcd21, + 0xcd35, 0xcd16, 0xcd10, 0xcd13, 0x4d64, 0x4dab, 0x4dda, 0xcf10, + 0xcd3a, 0x4d32, 0xcd4f, 0xcd31, 0xcdf4, 0xcd44, 0xcd33, 0xcd30, + 0xce54, 0xcd42, 0xce10, 0xcd46, 0xcd3c, 0xcd40, 0xcd39, 0xce79, + 0x4d4c, 0xcd93, 0xcd3f, 0xcd81, 0xcd68, 0xcd50, 0xcd5d, 0x4e5e, + 0xe076, 0xcd70, 0xcd4e, 0x4d75, 0xce6a, 0xcd66, 0xcd62, 0xcd73, + 0xcd61, 0x34a7, 0x4d55, 0xcd76, 0xcd5e, 0x4d71, 0xcd82, 0xcd86, + 0xcd83, 0xcd79, 0x4d89, 0x4e4d, 0xce61, 0xcd8c, 0xcd8f, 0x4d5b, + 0xce27, 0x4d99, 0xce7c, 0xcd88, 0xce3e, 0x4dd2, 0xcdd6, 0xcdbe, + 0x4d9a, 0xce8c, 0xcdba, 0xcdcb, 0xcdbd, 0xcdd4, 0xcdc4, 0x4e04, + 0xce69, 0xcdad, 0x4dbf, 0xcddc, 0xcdac, 0x4db3, 0xce43, 0x4d2c, + 0xcda2, 0xcdaf, 0xcdb9, 0xcda3, 0xcd9c, 0xcdbb, 0xcdb0, 0x4da0, + 0xcdd1, 0xcdb4, 0xcdc7, 0xcdd9, 0xcdd7, 0xcdd8, 0xcdec, 0xce9c, + 0xcdf9, 0xcdf2, 0xcddd, 0x4dfc, 0xce15, 0xce62, 0xcde6, 0xcd9e, + 0xcdde, 0xcdf6, 0x4d64, 0x4dab, 0x4dda, 0xcebf, 0xcdf1, 0xce0b, + 0xcde9, 0xcde0, 0xce37, 0xcde8, 0xcde1, 0x4de3, 0xce01, 0xce09, + 0xce1b, 0xce1f, 0xce1d, 0xce2b, 0xce17, 0xce1e, 0x4e8f, 0xce92, + 0xce2d, 0xce0a, 0xce11, 0xce7d, 0xce39, 0xce35, 0x4d2f, 0x4e32, + 0xce9d, 0xce93, 0xce2e, 0xce46, 0x4e45, 0xce70, 0xce88, 0xce5a, + 0xce55, 0xce52, 0x4e6e, 0xe7c1, 0xce7e, 0xce70, 0xce6f, 0xce73, + 0x4e89, 0xce98, 0x4f3b, 0x4f50, 0xe475, 0xa378, 0xc4e8, 0xc0b0, + 0x3b20, 0xcf3c, 0xcf36, 0x3b20, 0xcf3a, 0x46cb, 0x6262, 0xe4b5, + 0x44f6, 0xc501, 0x4516, 0xcf4c, 0xba3d, 0x275b, 0x28b0, 0x28b5, + 0x28dc, 0xcf4e, 0x4516, 0xcf42, 0x275b, 0x28b0, 0x28b5, 0x28dc, + 0xcf48, 0x4f36, 0xe475, 0x4db2, 0x4f52, 0xcf53, 0x4f51, 0xcf53, + 0x4f51, 0xcf52, 0x2570, 0x26c9, 0xcf85, 0x4f70, 0xcf78, 0xcf77, + 0x3683, 0xdfa0, 0x4f5a, 0xcf78, 0xcf86, 0x208c, 0x69e1, 0xea82, + 0xcf80, 0xcf62, 0x4f5a, 0xcf70, 0xcf76, 0x4f88, 0xd98a, 0x21aa, + 0xae42, 0xcf57, 0xcf74, 0x4f88, 0x5989, 0xd98a, 0x4f81, 0x4f87, + 0x5989, 0xd98a, 0xd288, 0xd288, 0xcf97, 0xcf91, 0xcf90, 0xcf8c, + 0xcfa5, 0xcfa8, 0xcfa4, 0xcfa3, 0xcf9f, 0xcfa1, 0x9e49, 0x217b, + 0xe90a, 0xcfb9, 0x4fb6, 0xd1bb, 0x4fb4, 0xd1bb, 0xcfae, 0x4fc5, + 0xcfe4, 0x4fc4, 0xcfe4, 0xcfe0, 0x9e60, 0xcff9, 0xcffd, 0xcfec, + 0xcfc6, 0x4fc4, 0xcfc5, 0xc3a9, 0xcfda, 0xcffa, 0xc796, 0xcfd8, + 0xcff1, 0x4e59, 0xe8dc, 0xcfd9, 0xc1ff, 0xb537, 0xd008, 0xd007, + 0xd00b, 0xd00a, 0xc54a, 0xc9d0, 0xb7b1, 0xe504, 0xd02e, 0xd5c9, + 0xd02c, 0x39c8, 0xe392, 0xd027, 0xd022, 0xbacc, 0xd073, 0xb065, + 0xd043, 0xdead, 0x504c, 0x5077, 0xdec4, 0xd076, 0xd03c, 0xd07e, + 0x5040, 0x5077, 0xdec4, 0xd079, 0x5068, 0xd06f, 0x2723, 0xa7a9, + 0xe5fb, 0x28fb, 0xaa7f, 0x5066, 0x506a, 0xd070, 0x5061, 0x506a, + 0xd070, 0x5054, 0xd06f, 0xd075, 0x5061, 0x5066, 0xd070, 0xd06f, + 0x2abf, 0xb127, 0xd06f, 0x5054, 0x5068, 0x506b, 0xd06e, 0x5061, + 0x5066, 0xd06a, 0xa8f0, 0xd038, 0x242c, 0xd07d, 0xd069, 0xd042, + 0x5040, 0x504c, 0xdec4, 0xd04d, 0x242c, 0xd074, 0xd04b, 0x4c9b, + 0xd085, 0x4c9b, 0xd083, 0xd088, 0xd087, 0xab8d, 0xd0af, 0x5178, + 0xd193, 0xd135, 0xd19a, 0xd0da, 0xc5a3, 0xeaaf, 0x508e, 0xd0bb, + 0xa3b7, 0x3bd3, 0xd8ac, 0xe91a, 0xd0af, 0xd14e, 0xd16b, 0xd139, + 0x5105, 0x5107, 0xd10b, 0x1f37, 0xa191, 0x51bb, 0xd1bd, 0xb3f9, + 0xd0a7, 0xa2dd, 0x585a, 0xeb0d, 0xb727, 0xd156, 0xd1da, 0x511b, + 0xde01, 0xd1d9, 0xd1a0, 0x5106, 0xd13a, 0x50c1, 0xd10b, 0x5103, + 0xd13a, 0xd0c1, 0xd109, 0xd108, 0x50c1, 0xd105, 0xd1be, 0x51d3, + 0x51df, 0xead2, 0xd1cd, 0x5133, 0xd166, 0xd1bf, 0xd1e0, 0xa43b, + 0x5173, 0xde0b, 0x50eb, 0xde01, 0xa507, 0x9fee, 0xd131, 0xd12b, + 0x2318, 0x5111, 0xd166, 0xd0a1, 0xd161, 0xd1c9, 0x45ee, 0xd0c0, + 0x5103, 0xd106, 0xd157, 0xa00e, 0x51c8, 0xd1d8, 0xe183, 0xd0be, + 0xd0e8, 0xd13e, 0xd195, 0xd1a3, 0xd136, 0x2318, 0x5111, 0xd133, + 0xd0bf, 0xef76, 0xe84b, 0x511a, 0xde0b, 0x50a0, 0xd193, 0xd1a9, + 0xd183, 0xea30, 0xeac8, 0xd190, 0xd17d, 0xd182, 0xd1cf, 0x50a0, + 0xd178, 0xd158, 0xd0a4, 0xd0f6, 0xd15f, 0xecd5, 0xd17b, 0xe94d, + 0x6ac4, 0xead3, 0x4fb4, 0x4fb6, 0x50c6, 0xd1bd, 0x50c6, 0xd1bb, + 0xd10d, 0xd113, 0xd1cb, 0x4655, 0xc670, 0x514a, 0xd1d8, 0xd138, + 0xd1c0, 0xd110, 0x5191, 0xead5, 0x510f, 0xd1df, 0x514a, 0xd1c8, + 0xd0ed, 0xd0ea, 0xd1e2, 0xc66f, 0x510f, 0xd1d3, 0xd114, 0xd1dc, + 0xa367, 0x9e34, 0xd1f0, 0xd1ed, 0xcdfb, 0x23f0, 0xa76e, 0xdf3f, + 0x9e0e, 0xa174, 0x1e3e, 0x3319, 0xb4e7, 0xb5e7, 0x3368, 0xd20e, + 0xd20d, 0xd213, 0xd210, 0x5217, 0x62ea, 0xe4fa, 0x5216, 0x62ea, + 0xe4fa, 0xe928, 0xd264, 0xd239, 0x523b, 0xd26b, 0xd266, 0xd259, + 0xb7c1, 0xd24a, 0xd229, 0x522e, 0xd26b, 0xd236, 0xd231, 0xba2f, + 0x3a79, 0xd26a, 0xd223, 0xd230, 0x3a79, 0xd263, 0x522e, 0xd23b, + 0xd271, 0x26cf, 0xd270, 0x5276, 0x5277, 0x5c53, 0xdc54, 0x5273, + 0x5277, 0x5c53, 0xdc54, 0x5273, 0x5276, 0x5c53, 0xdc54, 0xd279, + 0xd278, 0x49c7, 0x52b8, 0x541f, 0x54fa, 0xd5dd, 0xcbc0, 0x4f8a, + 0xcf8b, 0xd28c, 0xd28b, 0xa349, 0xd58c, 0xd56a, 0xd606, 0xd2b2, + 0xd2b1, 0x49c7, 0x527a, 0x541f, 0x54b7, 0x54fa, 0x5553, 0xd5dd, + 0xa20d, 0xd4ef, 0x1e42, 0xa208, 0xd466, 0xd5f6, 0xd3a7, 0xd407, + 0xd4bc, 0xd2e7, 0x26cc, 0x4526, 0x4a4c, 0x5607, 0xd613, 0xd351, + 0xd2e2, 0xd2e1, 0xd2ce, 0xa040, 0x55b2, 0xd60b, 0xd393, 0xd3f0, + 0x4b35, 0xcbc4, 0x2179, 0xd332, 0xd396, 0xd622, 0xd526, 0xa84b, + 0xc162, 0xd354, 0x4e6d, 0xd812, 0xcd65, 0xd438, 0x2179, 0xd30a, + 0xd34a, 0xd395, 0xd346, 0x1f9f, 0xd5a6, 0xd2d0, 0xd318, 0x2e84, + 0xd38a, 0xd598, 0xd3a2, 0xd558, 0xd4fd, 0xd434, 0xd54e, 0xd588, + 0x5415, 0xd5ba, 0x46ea, 0x5569, 0xd62f, 0x3804, 0xb9ae, 0xd477, + 0xbece, 0xc296, 0xc192, 0xd541, 0xd5ce, 0xd4c0, 0xd52d, 0xd552, + 0xd452, 0xd464, 0x546f, 0x55ac, 0xd5e5, 0xdc46, 0xb357, 0xd510, + 0x3d96, 0xd49e, 0x2e84, 0xd358, 0xd2fa, 0xd347, 0xd30e, 0xa50d, + 0xd35a, 0xd2cb, 0xd40a, 0xd4ee, 0xd494, 0xd435, 0xd3df, 0xd59f, + 0x4372, 0xca6b, 0xd555, 0xc469, 0x6d2c, 0x6daf, 0xee0e, 0x5493, + 0xd4f4, 0xd3be, 0xd3bd, 0xd458, 0xb79c, 0x235c, 0xd514, 0xd3b5, + 0xa807, 0x234e, 0x2d0b, 0xd550, 0xd2fd, 0xd506, 0x2eb5, 0x544a, + 0xd4ed, 0xd445, 0xd2cc, 0xd3b1, 0xd420, 0xd4f1, 0x5360, 0xd5ba, + 0xd600, 0xd63f, 0x49c7, 0x527a, 0x52b8, 0x54fa, 0xd5dd, 0xd40c, + 0x56cd, 0xd7a2, 0x25b6, 0xc1df, 0xce08, 0xd56d, 0xd5a9, 0x9e07, + 0x557f, 0x55fc, 0xd610, 0xd35d, 0xd3b4, 0xd330, 0xd55a, 0xd3f9, + 0xa3f6, 0x2eb5, 0x53f4, 0xd4ed, 0xd36d, 0xc740, 0xd3d1, 0xb939, + 0xd593, 0x46d6, 0xd4cb, 0xd36e, 0xd2c7, 0xd58a, 0xa85f, 0xb934, + 0xd36f, 0xd525, 0xd364, 0xd515, 0xcbc6, 0xd546, 0xd562, 0xd523, + 0xd51e, 0xb41c, 0x53bc, 0xd4f4, 0xd3b3, 0x31de, 0x3e95, 0x3fdb, + 0xc7c7, 0x3d96, 0xd385, 0xaf60, 0xd533, 0xd2b8, 0xd2cd, 0xd36a, + 0xae2d, 0x46d6, 0xd462, 0x4c11, 0xcc14, 0xd5cd, 0xd58a, 0xd63a, + 0xd577, 0xe3a3, 0xea40, 0x2eb5, 0x53f4, 0xd44a, 0xd3b2, 0xd2c1, + 0xd40d, 0x53bc, 0xd493, 0x49c7, 0x527a, 0x52b8, 0x541f, 0xd5dd, + 0xd35c, 0x298d, 0xa9f8, 0xd3f1, 0xd37b, 0xd84a, 0x235c, 0xd3d4, + 0xd482, 0xd48c, 0xd48b, 0xd471, 0xd311, 0xd36b, 0xd5bc, 0xd53b, + 0xd4a8, 0xeebb, 0x2328, 0xd5cf, 0x4ba6, 0xcc00, 0xd594, 0xd61e, + 0xd5fa, 0xd532, 0x55f9, 0xdb6a, 0xd368, 0xd487, 0x554b, 0xd602, + 0x554a, 0xd602, 0xd35e, 0x234e, 0xd3ef, 0xd36c, 0xd2b8, 0xd3b8, + 0xd35b, 0xd43c, 0xd489, 0xd361, 0xd29c, 0xd427, 0xd580, 0xd604, + 0x55f4, 0xd60a, 0xd4e3, 0x5431, 0x55fc, 0xd610, 0xd570, 0xd35f, + 0x546a, 0xd4df, 0xd297, 0xa9dc, 0xd460, 0xd537, 0x26ed, 0xa712, + 0xd359, 0xd3b6, 0x1f9f, 0xd350, 0xd428, 0x55b0, 0xd60d, 0x536f, + 0xd5e5, 0xca17, 0x4c54, 0xd5ea, 0xd5f7, 0x55ab, 0xd60d, 0x52f9, + 0xd60b, 0x5360, 0xd415, 0xd52f, 0x4a01, 0x4a3e, 0x4a3f, 0xd5f3, + 0x1e1b, 0x23e2, 0x3a37, 0xbb09, 0x201f, 0x2fa3, 0xd024, 0xd4dd, + 0xd369, 0x2328, 0xd535, 0xd61a, 0x49c7, 0x527a, 0x52b8, 0x541f, + 0xd4fa, 0x563d, 0xd646, 0xcc58, 0x536f, 0xd5ac, 0x4c54, 0xd5ae, + 0x4a01, 0x4a3e, 0x4a3f, 0xd5c1, 0x5574, 0xd60a, 0xd2c8, 0xd5af, + 0x553c, 0xdb6a, 0xd53a, 0x5431, 0x557f, 0xd610, 0xd41a, 0x554a, + 0xd54b, 0xd572, 0xd2a6, 0x4526, 0x4a4c, 0x52cf, 0xd613, 0x5574, + 0xd5f4, 0x52f9, 0xd5b2, 0x55ab, 0xd5b0, 0x6a65, 0xeaa5, 0x5431, + 0x557f, 0xd5fc, 0x52cf, 0xd607, 0xba97, 0xd5d3, 0xd539, 0xd30f, + 0xa170, 0x46ea, 0xd361, 0xd4e0, 0x55df, 0xd646, 0xd41d, 0xa914, + 0x55df, 0xd63d, 0x1e55, 0xd65d, 0xd65c, 0xb16e, 0xc307, 0x21e6, + 0xa904, 0xa47c, 0x565a, 0xd65b, 0x5657, 0xd65b, 0x5657, 0xd65a, + 0xd64f, 0x1e55, 0xd64e, 0xa3f7, 0xd666, 0xd665, 0x9e8f, 0x567a, + 0xd7f2, 0xd66f, 0xd7e3, 0xd66c, 0xd768, 0x2b83, 0xd6c7, 0xd66b, + 0xd771, 0xe6d6, 0xd766, 0xd806, 0xd755, 0xd7fb, 0xd79e, 0xd801, + 0x57a1, 0xd7c1, 0xd739, 0xd72f, 0x5745, 0x5836, 0xd83a, 0xd788, + 0xd6d4, 0xd814, 0xd6ba, 0xec8d, 0xd706, 0xd6d4, 0xd6a6, 0x2b83, + 0xd675, 0xd831, 0x5424, 0xd7a2, 0x5807, 0xd823, 0xd7f6, 0x5698, + 0x56b4, 0xd716, 0xef03, 0xd83b, 0xd7a7, 0xd7c4, 0xd6fa, 0xd7ef, + 0xd784, 0xd810, 0xd6f1, 0xd715, 0x5c9d, 0xdd1d, 0xd82d, 0xd6ac, + 0xd782, 0xd6fb, 0xd6d4, 0xd778, 0x574b, 0xd81f, 0xd68c, 0xd68b, + 0xeb4e, 0x5695, 0x5836, 0xd83a, 0x577f, 0xd805, 0xd7c8, 0xd7ec, + 0x5721, 0xd81f, 0xd80d, 0xd680, 0xc32c, 0xd815, 0xd67e, 0xd671, + 0xc33f, 0xd67b, 0xd717, 0xd7bb, 0xd811, 0x5747, 0xd805, 0xd7bf, + 0xd70b, 0xd6f3, 0xd696, 0xd78e, 0xd78d, 0xd7fb, 0x5827, 0xd839, + 0xd682, 0xd68a, 0x5424, 0xd6cd, 0x3594, 0xb59e, 0xd6ef, 0xd7ce, + 0xd77c, 0xd780, 0xd68a, 0xd6f0, 0xd7c7, 0xd7c6, 0xd748, 0xd7a8, + 0xd828, 0xd80e, 0xd66e, 0xd749, 0xd6f2, 0xd66b, 0xd6cf, 0xd821, + 0xd80f, 0x5681, 0xd798, 0xd683, 0x5747, 0xd77f, 0xd67f, 0x56ce, + 0xd823, 0xd74e, 0xd7d2, 0xd7f9, 0xd6f4, 0xd77e, 0x4d78, 0x4e6d, + 0xd327, 0xd69d, 0xd761, 0x5721, 0xd74b, 0xd7f8, 0xb0f7, 0x56ce, + 0xd807, 0x5799, 0xd839, 0xd7cf, 0xd702, 0xd6ca, 0x5695, 0x5745, + 0xd83a, 0x5799, 0xd827, 0x5695, 0x5745, 0xd836, 0xd6ee, 0x4383, + 0xdc9c, 0xd844, 0xd842, 0xe1c1, 0x1e51, 0x1f17, 0xc73e, 0x24af, + 0xa580, 0xd511, 0xb72f, 0x2563, 0x5858, 0xe29c, 0xa40c, 0xadf7, + 0x2563, 0x5854, 0xe29c, 0xd0e1, 0x236b, 0xd85e, 0x2675, 0x585f, + 0xe053, 0xa1b2, 0x236b, 0xd85b, 0x2675, 0x585c, 0xe053, 0xd864, + 0xd863, 0xd8dc, 0xe336, 0xd96f, 0xd89e, 0xa3ea, 0xd8b5, 0xd956, + 0x2acb, 0x2b1d, 0xd8ca, 0xd918, 0xae12, 0x596a, 0x67c8, 0xe7e4, + 0xd86e, 0x3bd3, 0xd0b2, 0xd972, 0xeef9, 0xd94f, 0x4d5d, 0xd8e4, + 0xd87d, 0xd8cc, 0xd8dd, 0xd960, 0xd90c, 0xd885, 0xd8b7, 0x58e1, + 0xe1cc, 0xd8e0, 0xd865, 0xd8c5, 0xd8d9, 0x58cf, 0xe1cc, 0xd933, + 0xd95d, 0x58b4, 0xd932, 0xd947, 0x5912, 0xd943, 0xb707, 0xd92b, + 0xd8f5, 0xd8f4, 0xa236, 0xa90d, 0xb0fc, 0xd8c8, 0xd90f, 0xd90e, + 0x58e6, 0xd943, 0xcde5, 0xd886, 0xd938, 0xd94c, 0xd8ed, 0xd8e4, + 0xd8e2, 0xd964, 0xd91b, 0x9eb5, 0x58e6, 0xd912, 0xd8e5, 0xd91d, + 0xb742, 0xd8af, 0xd974, 0xd884, 0xd8e3, 0xd8c6, 0xd934, 0xd89c, + 0xb446, 0xb4f7, 0xd86c, 0xd8ad, 0x5955, 0xd97d, 0xd974, 0x2364, + 0xa365, 0x290d, 0xafa9, 0xe738, 0xb838, 0x4f87, 0x4f88, 0xd98a, + 0x4f81, 0x4f87, 0x4f88, 0xd989, 0xd9c1, 0xaf01, 0xd9c3, 0xd9c4, + 0x599a, 0x59ba, 0xd9c9, 0x5994, 0xd9c5, 0x5993, 0xd9c5, 0x470e, + 0xd9c6, 0xd9c7, 0x5990, 0x59ba, 0xd9c9, 0xd9cb, 0xd9cd, 0xd9ce, + 0x59bd, 0xd9c8, 0xc779, 0x9eb2, 0xd9ca, 0xd9cf, 0xd9b7, 0xd9d0, + 0x59c0, 0xd9c2, 0xd9bc, 0x59b0, 0xd9d1, 0x358d, 0x5990, 0x599a, + 0xd9c9, 0xd9b6, 0x59a7, 0xd9c8, 0xd9cc, 0x59b3, 0xd9c2, 0xd98b, + 0x59b3, 0xd9c0, 0xd98e, 0xd98f, 0x5993, 0xd994, 0x470e, 0xd996, + 0xd998, 0x59a7, 0xd9bd, 0x5990, 0x599a, 0xd9ba, 0xd9ac, 0xd9a1, + 0xd9bf, 0xd9a5, 0xd9a6, 0xd9af, 0xd9b2, 0xd9b7, 0xcb4b, 0x59ef, + 0xd9f6, 0xb2b5, 0xd9f4, 0xd9e7, 0xd9f8, 0xd9e3, 0x59d7, 0xd9f6, + 0xd9de, 0x59d7, 0xd9ef, 0xd9e6, 0x59fd, 0xd9ff, 0x59f9, 0xd9ff, + 0x59f9, 0xd9fd, 0x5a01, 0xdba0, 0x5a00, 0xdba0, 0xdba2, 0xdba3, + 0xdba1, 0xdbaf, 0xdba7, 0xdba8, 0xdba6, 0xdbb1, 0xdbad, 0xdbaa, + 0xdbab, 0x3258, 0xdbac, 0xdbb0, 0xdabe, 0xdbb9, 0xdbb6, 0xdbbc, + 0x47e4, 0xc7e7, 0x241f, 0xa656, 0xbb23, 0xdbc0, 0xdbb7, 0xdbbb, + 0xdbbf, 0x9fe1, 0xdbbe, 0xdbb8, 0x5b6f, 0xdbd1, 0xdbc9, 0x24ec, + 0xdbc3, 0xdbca, 0xbce8, 0x5b49, 0xdbc1, 0xda6c, 0xdbc2, 0x2467, + 0xdbcb, 0x246a, 0xa492, 0xa46d, 0xdbb5, 0xdbc8, 0xdbd2, 0xdbcf, + 0xdbc4, 0xdbd0, 0xdbc7, 0xdbce, 0xdbc5, 0xdbcd, 0xdb8b, 0xa48f, + 0xdbe9, 0xdbe2, 0xdbe3, 0xdbd5, 0xabdf, 0xdbd7, 0xdbe7, 0x5a3d, + 0xdbdf, 0xdbe1, 0xdbe0, 0xdbd8, 0x5b6e, 0xdbdd, 0xdbe5, 0xdbe6, + 0xdbdc, 0xdbd9, 0xdbd6, 0xdbd4, 0xdbdb, 0xdbd3, 0xa938, 0xdb7d, + 0xdb04, 0xafd7, 0xdba4, 0xdbf3, 0xdbf6, 0xdbde, 0x3096, 0xb102, + 0x2500, 0xdbf1, 0xdbee, 0xdbed, 0xdbda, 0xdbeb, 0xdbec, 0xdbef, + 0xdbf0, 0xdbf5, 0xdbf2, 0x5aac, 0xdbf4, 0x5aaa, 0xdbf4, 0x5b80, + 0xdbfb, 0xa531, 0xdc01, 0xdbfe, 0xdc07, 0xdbfd, 0x4ae9, 0xdc0a, + 0xda1a, 0xdc03, 0xdc04, 0xdc06, 0xdc08, 0xdbff, 0xdbf7, 0x5aeb, + 0xdc0f, 0xdbe4, 0xdbf9, 0xdbfc, 0xdc05, 0xdbba, 0xdc02, 0xdc00, + 0xdc0d, 0xdc1e, 0xdc1d, 0x5afc, 0xdc16, 0x5b1a, 0xdc25, 0xdbe8, + 0x5b8d, 0xdc14, 0xdc1b, 0xdc10, 0xdb5c, 0x5acc, 0xdc0f, 0x242f, + 0x2518, 0x2553, 0x2554, 0x255f, 0xe5d9, 0xdc15, 0xdc18, 0xdbb3, + 0x3697, 0xdc19, 0xdc0c, 0x5bbd, 0xe8a8, 0xdbf8, 0xdc1a, 0x5ae0, + 0xdc16, 0xdbfa, 0xdc0b, 0xdc12, 0xdc13, 0xda8a, 0xdbcc, 0xdc0e, + 0xbb4c, 0xdc1c, 0xdc27, 0xdc11, 0xdc21, 0xdc24, 0xdc26, 0x5ae1, + 0xdc25, 0xdbb2, 0xdc22, 0x5b21, 0xdc23, 0x5b20, 0xdc23, 0xdc1f, + 0xa546, 0x5b81, 0xdc2a, 0xdc2c, 0x5b7e, 0xdc2b, 0xa5f9, 0xdbb4, + 0xdc28, 0x247c, 0xa611, 0xdc29, 0x24d7, 0xa629, 0x5a3c, 0xdbc1, + 0xdbb9, 0xdc32, 0xdba5, 0xa642, 0x5b5b, 0xdc2e, 0xdbc6, 0xdc2f, + 0xdc2d, 0x5b56, 0xdc2e, 0x5ae9, 0xdc31, 0xa66a, 0x553c, 0xd5f9, + 0x2661, 0xdc35, 0xbbc1, 0x5a71, 0xdbdd, 0x5a33, 0xdbd1, 0xdbae, + 0xa584, 0x5b93, 0xdba9, 0xdc34, 0xb2a4, 0xdbea, 0x46d1, 0xc6e3, + 0xda89, 0x5b2d, 0xdc2b, 0x5aad, 0xdbfb, 0x5b2b, 0xdc2a, 0x5b9a, + 0xdd5e, 0xdc09, 0x23d8, 0xa909, 0xda5f, 0x2bb4, 0xe1bc, 0x5ae4, + 0xdc14, 0x1ec7, 0x5b90, 0xe6e0, 0x5b8e, 0xe6e0, 0xdc17, 0x5b72, + 0xdba9, 0xdc30, 0xdc36, 0x5b83, 0xdd5e, 0xdc20, 0xdc33, 0x5a00, + 0xda01, 0xda08, 0xda02, 0xda03, 0xda8d, 0xdb4f, 0xda10, 0xda0c, + 0xda0e, 0x5b72, 0xdb93, 0xda15, 0xda16, 0x3258, 0xda17, 0xda13, + 0xdb70, 0xda0a, 0xda18, 0xda12, 0xdb1b, 0xdaf1, 0xdb33, 0xda4e, + 0xda1d, 0xda25, 0xda31, 0x5a1b, 0xdb4c, 0xdad6, 0xda29, 0xda1f, + 0x5af7, 0xe8a8, 0xda2d, 0xda2a, 0xda23, 0x5a3c, 0xdb49, 0xda41, + 0xda36, 0xda55, 0xda5b, 0xdb58, 0xda57, 0xda50, 0xda34, 0xda3a, + 0xda46, 0xdb05, 0xda5e, 0xda58, 0xda54, 0xda56, 0x5a33, 0xdb6f, + 0xda52, 0xda86, 0xda84, 0xda66, 0xda7f, 0xda69, 0xda70, 0xda7c, + 0xdaa0, 0xda85, 0xda75, 0x5a71, 0xdb6e, 0xda95, 0xda6c, 0xda6e, + 0xda6d, 0xda62, 0xda63, 0xdacd, 0xda72, 0xda73, 0xda6b, 0xdae2, + 0xda61, 0xdb78, 0xdaa1, 0xdaa3, 0xda9e, 0xda9a, 0x309e, 0xdaa4, + 0xdaa5, 0x2500, 0xda98, 0xdaa8, 0xda91, 0x5aaa, 0xdaac, 0xdaa6, + 0xda92, 0xdacb, 0xdaf8, 0xdacf, 0xdafe, 0x5aad, 0xdb80, 0xdad1, + 0xdab9, 0xdab2, 0xdac9, 0xdadb, 0xdab0, 0xdad7, 0xdabf, 0xdac2, + 0xdad2, 0xdac4, 0xdab6, 0xdac7, 0xdb85, 0x4ae9, 0xdabc, 0xdb00, + 0xdaf6, 0xdadc, 0xdb0a, 0x5acc, 0xdaeb, 0xdae7, 0xdb14, 0xdb01, + 0xdb02, 0x5ae4, 0xdb8d, 0xdaed, 0x5ae0, 0xdafc, 0xdb92, 0xdaee, + 0x3697, 0xdaf3, 0xdafa, 0xdae6, 0xdb0e, 0xdade, 0xdadd, 0xdb28, + 0xdb9c, 0xdb16, 0xdb1d, 0x5b20, 0xdb21, 0xdb17, 0x5ae1, 0xdb1a, + 0xdb19, 0xdb10, 0xdb39, 0xdb3e, 0x5b2b, 0xdb81, 0x5b2d, 0xdb7e, + 0xdb2c, 0xdb5a, 0x5b56, 0xdb5b, 0xdb59, 0xdb95, 0xdb5c, 0xdb4e, + 0xdb9e, 0xdb74, 0xdb6b, 0xdb96, 0x4a40, 0xccd3, 0xac88, 0x3e13, + 0x3eaa, 0xdc40, 0x3e13, 0x3eaa, 0xdc3f, 0xd373, 0xac82, 0x1e30, + 0x5c50, 0x673b, 0xe74a, 0x4ad6, 0xcaea, 0x1e30, 0x5c4a, 0x673b, + 0xe74a, 0x5273, 0x5276, 0x5277, 0xdc54, 0x5273, 0x5276, 0x5277, + 0xdc53, 0xdc5a, 0xdc58, 0xdc87, 0x9e88, 0xc32a, 0xdc76, 0xdc6e, + 0xc2b2, 0xc2b4, 0xdc94, 0xc2c9, 0xef26, 0xdc64, 0xc2e2, 0xc2b4, + 0xc683, 0x42f8, 0xc30d, 0xc30a, 0xc32f, 0xc32b, 0xdc7c, 0xc34f, + 0xc37e, 0x4383, 0xd83c, 0x56fd, 0xdd1d, 0xdd1e, 0x2458, 0x24e1, + 0xdd20, 0xdd1f, 0x321d, 0xdd22, 0xdd21, 0xdd2b, 0xdd27, 0xdd29, + 0xdd2a, 0xdd2f, 0xdd23, 0x2295, 0x5cea, 0xdd28, 0x2f10, 0x5cb3, + 0xdd30, 0xdd2e, 0xdd33, 0xdd40, 0x2f10, 0x5cae, 0xdd30, 0xdd35, + 0xdd2c, 0x9e70, 0xdd37, 0xdd36, 0xdd39, 0xdd34, 0xdd3b, 0xdd38, + 0xdd3a, 0xdd32, 0xdd42, 0xdd41, 0xdd3f, 0xdd45, 0xdd44, 0xdd3e, + 0x2379, 0xb064, 0xdd3c, 0xc68e, 0x5d13, 0xdd43, 0x5ce4, 0xdd31, + 0xdd48, 0xdd4a, 0x2bbe, 0xdcd4, 0x2bbe, 0xdcd3, 0xdd47, 0xdd4a, + 0xdd52, 0xdd49, 0x5d0a, 0xdd5e, 0xdd50, 0xdd4f, 0xdd54, 0x4d9a, + 0x4e8c, 0xdd53, 0x5d12, 0xdd24, 0x2356, 0xa8f2, 0x5cce, 0xdd31, + 0xdd4b, 0xdd55, 0x2295, 0x5cad, 0xdd28, 0xdd4d, 0xdd26, 0xdd4c, + 0xa046, 0x5d56, 0xe83c, 0xdd57, 0x5d4d, 0xef4e, 0xdd5a, 0xdd59, + 0xdd2d, 0xdd5b, 0xdd5c, 0x3557, 0xdd25, 0xdd3d, 0xdd58, 0xdd5f, + 0xdd60, 0x5cdb, 0xdd5e, 0x2050, 0x5d17, 0xdd5d, 0xdd61, 0xdd62, + 0xdd46, 0x5ce2, 0xdd24, 0x5ccd, 0xdd43, 0xdd51, 0xdd4e, 0x2050, + 0x5d0b, 0xdd5d, 0xdd63, 0xdd43, 0x56fd, 0xdc9d, 0xdc9e, 0xdca0, + 0x2458, 0x24e1, 0xdc9f, 0xdca2, 0x321d, 0xdca1, 0xdcac, 0x5ce2, + 0xdd12, 0x3557, 0xdd01, 0xdcec, 0xdca8, 0x5cad, 0xdcea, 0xdca9, + 0xdcaa, 0xdca7, 0xdcb6, 0xdcfc, 0xdcaf, 0xdcab, 0x2f10, 0x5cae, + 0xdcb3, 0x5cce, 0xdce4, 0xdcc1, 0xdcb0, 0xdcbc, 0xdcb4, 0xdcba, + 0xdcb8, 0xdcbf, 0xdcbb, 0xdcc0, 0xdcbd, 0xdcca, 0xdd04, 0xdcc8, + 0xdcc4, 0xdcb2, 0xdcc3, 0xdcc2, 0x5ccd, 0x5d13, 0xdd1c, 0xdcc7, + 0xdcc5, 0xdd10, 0xdcd5, 0xdcd1, 0xdcda, 0x5cd2, 0xdcd6, 0xdce6, + 0xdced, 0x5ceb, 0x5cf7, 0xef4e, 0xdd16, 0xdcde, 0xdcdc, 0xdd14, + 0xdcd9, 0xdce1, 0xdce0, 0xdce7, 0x5cf4, 0xe83c, 0xdcf5, 0xdd05, + 0xdcfb, 0xdcfa, 0xdcfd, 0xdcfe, 0x2050, 0x5d0b, 0xdd17, 0x5b83, + 0x5b9a, 0x5cdb, 0xdd0a, 0xdd07, 0xdd08, 0xdd0d, 0xdd0f, 0xdd1b, + 0x407b, 0xc0fe, 0xdd6c, 0xdd6a, 0xdd71, 0xdd70, 0xdd99, 0xdd95, + 0x2c1f, 0x2c20, 0x6bae, 0x6c7b, 0xec9c, 0xdfdf, 0xdd82, 0xdd81, + 0xdda8, 0xdda6, 0xdd76, 0xdd75, 0xdd91, 0xdd8b, 0xde7a, 0x5dc3, + 0xde8d, 0xddb2, 0xddb1, 0xde89, 0xde38, 0x5daf, 0xde8d, 0xde4c, + 0xde92, 0xdff9, 0xddfa, 0xde29, 0xde10, 0xde82, 0xde7a, 0xde55, + 0xde9a, 0xdde5, 0xde8b, 0xac40, 0x50eb, 0xd11b, 0x458e, 0xc58f, + 0xde34, 0x511a, 0xd173, 0xde8a, 0xddf5, 0xde64, 0xddf4, 0xde64, + 0xc8b0, 0xde93, 0xde91, 0xcaac, 0xde0a, 0xddbb, 0xde4f, 0x5e79, + 0xdea2, 0xddc4, 0xde44, 0xdea1, 0xde63, 0xddf8, 0xdff9, 0xde52, + 0x5e28, 0xde2a, 0x5e8a, 0xde95, 0x5e4b, 0xdea2, 0x5dac, 0xddf7, + 0xdea5, 0xddf6, 0xde84, 0xde83, 0xa8b8, 0xddb8, 0x5e0c, 0x5e70, + 0xde95, 0x5dfb, 0xe6ae, 0x5daf, 0xddc3, 0xdeaa, 0xde2f, 0xddde, + 0xde2c, 0x5e70, 0xde8a, 0xdeaa, 0xddf9, 0xdea6, 0xde51, 0x5e4b, + 0xde79, 0xde7f, 0xde9c, 0x5e8f, 0xde99, 0xdeb3, 0xd03d, 0xdec0, + 0x1f53, 0x5ec6, 0x6ab5, 0xead4, 0xdeb2, 0xdeb1, 0xdeac, 0xdeaf, + 0x5040, 0x504c, 0xd077, 0x1f53, 0x5eb0, 0x6ab5, 0xead4, 0xdf66, + 0xdf67, 0xdf68, 0xa19b, 0xdf6a, 0xdf69, 0xdf6b, 0x3799, 0x5ef6, + 0xdf6d, 0xdf6f, 0x5f49, 0xdf6c, 0x5f5f, 0xdf70, 0xdf77, 0xdf78, + 0x5f29, 0xdf88, 0xdf71, 0x3799, 0x5edb, 0xdf6d, 0xdf74, 0xdf75, + 0xdf7a, 0xdf72, 0xdf76, 0x5f15, 0xdf7b, 0xdf7c, 0xdf5c, 0xdf83, + 0xdf82, 0xdf81, 0xdf80, 0xdf7d, 0xdf7e, 0x5f1b, 0xdf86, 0xdf36, + 0x5f19, 0xdf84, 0xb33d, 0x1fcc, 0xdf85, 0x5efd, 0xdf7b, 0x5f12, + 0xdf84, 0x5f0c, 0xdf86, 0x5f3a, 0xdf8e, 0xdf89, 0xdf8b, 0xdf8d, + 0xdf57, 0xdf8a, 0xdf87, 0x5ef0, 0xdf88, 0xdf6e, 0xdf8c, 0xdf6f, + 0xdf91, 0xdf8f, 0xdf0f, 0xdf93, 0x5f1c, 0xdf8e, 0xdf90, 0xdf92, + 0xdf97, 0xd206, 0x67b1, 0x67dc, 0xe7ec, 0xbbc2, 0x5f96, 0xe38b, + 0xdf95, 0xdf98, 0x5ee2, 0xdf6c, 0xdf99, 0xdf7f, 0xdf9a, 0xdf21, + 0xdf00, 0x5ee3, 0xdf70, 0xdf94, 0xdf79, 0xdf73, 0xdeca, 0xdecb, + 0xdecc, 0xded2, 0xded1, 0xded4, 0x5ee2, 0xdf49, 0x3799, 0x5edb, + 0xdef6, 0xdf2a, 0x5edf, 0xdf2d, 0x5ee3, 0xdf5f, 0xdef2, 0xdefb, + 0xdf64, 0xdef8, 0xdef9, 0xdefc, 0xdee4, 0xdeeb, 0xdf62, 0xdefa, + 0x5efd, 0xdf15, 0xdefe, 0xdf09, 0xdf0a, 0xdf4e, 0xdf08, 0xdf07, + 0xdf05, 0xdf03, 0x5f12, 0xdf19, 0xdf14, 0x5f0c, 0xdf1b, 0xdf26, + 0x5ef0, 0xdf29, 0xdf1d, 0xdf25, 0xdf1e, 0xdf2c, 0xdf1f, 0x5f1c, + 0xdf3a, 0xdf33, 0xdf3b, 0xdf2f, 0xdf3c, 0xdf38, 0xdf61, 0xdf45, + 0xdf44, 0xdf3e, 0xdf46, 0xdf4d, 0xdf54, 0x5f9e, 0x5fa4, 0xdfad, + 0x5f9d, 0x5fa4, 0xdfad, 0xe5e2, 0x3683, 0xcf6a, 0x2f01, 0x5fa9, + 0xdfaf, 0x5f9d, 0x5f9e, 0xdfad, 0xa29e, 0x2f01, 0xdfa8, 0x2f01, + 0xdfa7, 0x2f01, 0x5fa1, 0xdfaf, 0xdfae, 0x5f9d, 0x5f9e, 0xdfa4, + 0xdfab, 0x2f01, 0x5fa1, 0xdfa9, 0xa19c, 0xdfb6, 0xdfb5, 0x5fba, + 0x6089, 0xe08a, 0x5fb9, 0x6089, 0xe08a, 0xe07c, 0x6039, 0xe054, + 0xe077, 0xdfc3, 0xdfc2, 0xdfe4, 0xe04e, 0xe081, 0x231d, 0xae00, + 0xe04b, 0xe084, 0xe019, 0xe032, 0xe060, 0xe055, 0xe023, 0x5d7f, + 0x6045, 0xe072, 0xdfc6, 0xe008, 0xe087, 0xaef8, 0xaf80, 0xe003, + 0x2f84, 0x2f91, 0xe015, 0x26d8, 0x26de, 0x26ec, 0x2efb, 0x2efd, + 0xe025, 0x5de1, 0xde5f, 0x1e43, 0xaefc, 0xe069, 0xdfef, 0xdfe5, + 0xe078, 0xe05c, 0xe052, 0x6013, 0xe05e, 0x6012, 0xe05e, 0x2f84, + 0x2f91, 0xdff3, 0xdfd9, 0xdfde, 0x26d8, 0x26de, 0x26ec, 0x2efb, + 0x2efd, 0xdff4, 0xe090, 0xa954, 0x3e38, 0xe04a, 0xa468, 0xdfdb, + 0x5fbe, 0xe054, 0xe060, 0xe08f, 0xa06a, 0xe06f, 0x5fdf, 0xe072, + 0x1fa6, 0xa075, 0x3e38, 0xe030, 0xdfd0, 0xdfc7, 0xe00e, 0x2675, + 0x585c, 0xd85f, 0x5fbe, 0xe039, 0xdfdd, 0xe07a, 0xe065, 0xe00a, + 0x6012, 0xe013, 0x5fdc, 0xe03a, 0xbeaf, 0xe059, 0xe002, 0xe041, + 0x5fdf, 0xe045, 0xced5, 0xdfc1, 0xe009, 0xe057, 0xdfbd, 0xdfc8, + 0xdfd8, 0xdfe9, 0x5fb9, 0x5fba, 0xe08a, 0x5fb9, 0x5fba, 0xe089, + 0xe03b, 0xe026, 0xe61d, 0xe127, 0xe13a, 0xe0ab, 0xb751, 0xe0a6, + 0xe114, 0xe0f5, 0xe112, 0xe134, 0x23b8, 0x6130, 0xe6a3, 0xe0cc, + 0x3b1d, 0x6b30, 0xeb31, 0xe0bd, 0x60d2, 0xe0de, 0xe0df, 0xe136, + 0xe12d, 0x60ce, 0xe0de, 0xe106, 0x60ce, 0xe0d2, 0xe0cf, 0xe148, + 0xe116, 0xe0f6, 0xe0ae, 0xe0e8, 0x1e61, 0x6109, 0x610a, 0xe115, + 0xe132, 0xe0d3, 0x1e61, 0x60f7, 0x610a, 0xe115, 0x1e61, 0x60f7, + 0x6109, 0xe115, 0xe0b9, 0xe0ac, 0x1e61, 0x60f7, 0x6109, 0xe10a, + 0xe0e7, 0xe093, 0xe0d1, 0x23b8, 0x60bb, 0xe6a3, 0xe0f8, 0xe0ba, + 0xe0d0, 0xe146, 0xe09d, 0xe147, 0x2398, 0x28e5, 0xaedb, 0xe147, + 0xe137, 0x613c, 0xe142, 0xe0e6, 0x9e23, 0xe194, 0xe189, 0xb59f, + 0x6196, 0xe19e, 0xe18b, 0x467a, 0x6197, 0xe1b1, 0x616c, 0xe1bb, + 0xa5e0, 0x6167, 0xe1bb, 0x61a4, 0xe1ac, 0xe1c5, 0xe1c3, 0x61b8, + 0xe1c0, 0xd14c, 0xe195, 0xe154, 0xe91f, 0xe162, 0x24b8, 0xee79, + 0xe14b, 0xe187, 0x615d, 0xe19e, 0x467a, 0x6166, 0xe1b1, 0xb9bc, + 0x1e11, 0xeb57, 0x615d, 0xe196, 0x6171, 0xe1ac, 0x233b, 0xbbc9, + 0x6171, 0xe1a4, 0x467a, 0x6166, 0xe197, 0x617f, 0xe1c0, 0x6167, + 0xe16c, 0x2bb4, 0xdb8c, 0x617f, 0xe1b8, 0xd845, 0xe17e, 0xe17d, + 0x2bc0, 0xb3a1, 0x61ca, 0xe1cb, 0x61c8, 0xe1cb, 0x61c8, 0xe1ca, + 0x58cf, 0xd8e1, 0x27dc, 0xa8c4, 0xa398, 0x61d2, 0xe485, 0x61d1, + 0xe485, 0x61da, 0x61fb, 0xe486, 0xe487, 0xe48c, 0x2200, 0xa202, + 0xe48a, 0xe489, 0xe48b, 0x61d3, 0xe1fb, 0xe1e1, 0xe488, 0x1e71, + 0x9e82, 0xe1dc, 0x621f, 0xe493, 0xe490, 0xb263, 0xe48f, 0xe492, + 0xe2e9, 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, + 0xe1fc, 0xe497, 0xe48d, 0xe495, 0xe48e, 0x61d3, 0x61da, 0xe486, + 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0xe1f0, + 0xe4af, 0xe4ab, 0xe498, 0xe4ad, 0xe4a5, 0x625b, 0xe4c5, 0xe49a, + 0xe4a0, 0xe49d, 0x6264, 0xe4a9, 0xe4a4, 0xe4a3, 0xe491, 0xe49e, + 0xe4ae, 0x629e, 0xe4a7, 0xe1e3, 0xe49f, 0xe499, 0xe4ac, 0xe49b, + 0xe4aa, 0xe3ba, 0x4089, 0xe46a, 0x6438, 0xe4ce, 0x6268, 0xe4cc, + 0xe4c8, 0xe4b6, 0xe4c3, 0xe4b4, 0xe4b9, 0xe4cd, 0xe4b0, 0xe4b8, + 0xe4c0, 0xe4bf, 0xe4be, 0x6295, 0x62e8, 0x6421, 0x6435, 0xe4c1, + 0xe49c, 0xe4bb, 0xe4ca, 0xe4ca, 0xe4c9, 0x2228, 0xe4c7, 0xe4cb, + 0xe4c2, 0xe4b7, 0xe4b3, 0xe4c6, 0x6206, 0xe4c5, 0xe4ba, 0xe348, + 0x46cb, 0x4f3d, 0xe4b5, 0x620e, 0xe4a9, 0xe4b2, 0x622e, 0xe4cc, + 0xe4bc, 0xe4bd, 0x47ff, 0x483f, 0x4926, 0x62db, 0xe45b, 0x6373, + 0x6451, 0x6452, 0xe46c, 0xe4cf, 0xe4f0, 0xe4d2, 0xe4ec, 0xe4ea, + 0xe4f6, 0xe4f3, 0xe4dc, 0xe4da, 0xe4e3, 0xe4e8, 0x6244, 0x62e8, + 0x6421, 0xe435, 0xe4e2, 0xe4ed, 0x6443, 0xe4eb, 0x62bd, 0xe4e6, + 0x2563, 0x5854, 0xd858, 0xe21e, 0xe4d1, 0xe4f7, 0xe4f1, 0xe4df, + 0xe4f5, 0xe4e5, 0xe4d5, 0xe4ef, 0xe4d0, 0x6322, 0xe4b1, 0xe47e, + 0xe4de, 0xc10a, 0x62ed, 0xe510, 0x4107, 0xe500, 0xe508, 0xe511, + 0xe509, 0xe29b, 0xe4dd, 0xe512, 0xe50c, 0xe4a1, 0xe4e4, 0xe4d7, + 0xe50b, 0xe4fb, 0x47ff, 0x483f, 0x4926, 0x6271, 0xe45b, 0xe50a, + 0x646f, 0xe513, 0x6381, 0xe4d8, 0xe504, 0xe503, 0xe514, 0x6244, + 0x6295, 0x6421, 0x6435, 0xe507, 0x61ef, 0xe4d3, 0x5216, 0x5217, + 0xe4fa, 0x62b3, 0xe510, 0xe4d6, 0xe506, 0xe502, 0xe4fd, 0x6444, + 0xe4f8, 0xe50d, 0xe52f, 0xe4a2, 0xe51e, 0x2f55, 0xe332, 0xe516, + 0xe52b, 0xe529, 0x641a, 0xe4d4, 0xe525, 0xe515, 0xe51f, 0xe524, + 0x637f, 0xe531, 0xe4ee, 0xe51b, 0xe52c, 0xe52d, 0xe51c, 0x62ad, + 0xe4b1, 0xe526, 0xe51a, 0xe520, 0xe521, 0x40bc, 0x4149, 0xe34a, + 0xe522, 0xe519, 0x2f55, 0xe304, 0xe530, 0xd868, 0xe486, 0xe4fc, + 0xe3e8, 0xe51d, 0xe528, 0xe52a, 0xe494, 0xe534, 0x6260, 0xe533, + 0x40bc, 0x4149, 0xe32c, 0xe505, 0xe540, 0xe537, 0xe4e1, 0xe496, + 0x4145, 0xe53b, 0xe4ff, 0x6445, 0xe53d, 0xe538, 0xe532, 0xe518, + 0xe539, 0x63d3, 0xe52a, 0xe53e, 0x6274, 0x6451, 0x6452, 0xe46c, + 0xe52e, 0xe536, 0xe517, 0x649f, 0xe53a, 0xe319, 0xe2e3, 0xe541, + 0xe53f, 0xe545, 0xe551, 0xdf44, 0x642e, 0xe570, 0x39c8, 0xd028, + 0x3eb6, 0xc194, 0x63c1, 0xe501, 0xb7aa, 0xe549, 0xe524, 0xe548, + 0x6543, 0xef12, 0xe4a8, 0xd4e5, 0x6402, 0xe54f, 0xe4e0, 0xe4e9, + 0xe53c, 0xe550, 0x63ae, 0xe547, 0x63ad, 0xe547, 0xe552, 0xe54d, + 0xe553, 0xe54c, 0xe228, 0xe54e, 0xe396, 0xe55e, 0xe55f, 0xe4fe, + 0xe546, 0xe559, 0xe560, 0xe55d, 0xe36f, 0xe4ff, 0xe535, 0xe557, + 0xe558, 0xe55b, 0x222c, 0x2257, 0x2277, 0xe4f2, 0x434d, 0xe55c, + 0xe556, 0xe542, 0x63fd, 0xe508, 0xe33e, 0xe55a, 0xe4e7, 0xe564, + 0xe56a, 0x63e5, 0xe508, 0x63a6, 0xe54f, 0xe4d9, 0xe4f4, 0xe563, + 0xe4f9, 0xe566, 0xe561, 0xe50f, 0xe49f, 0xe56b, 0x630f, 0xe4d4, + 0x6481, 0xe562, 0xe568, 0x6244, 0x6295, 0x62e8, 0x6435, 0xe4c1, + 0xe50e, 0xe50f, 0xe544, 0xe54c, 0x638c, 0xe570, 0xe56f, 0xe56d, + 0x6244, 0x6295, 0x62e8, 0x6421, 0xe4c1, 0xe56e, 0x622c, 0xe4ce, + 0xe4db, 0xe571, 0x629a, 0xe4eb, 0x62f3, 0xe4f8, 0xe360, 0xe56c, + 0xe554, 0x6274, 0x6373, 0x6452, 0xe46c, 0x6274, 0x6373, 0x6451, + 0xe46c, 0xb7aa, 0xe572, 0xe527, 0x647d, 0xe4bb, 0x47ff, 0x483f, + 0x4926, 0x6271, 0xe2db, 0x6909, 0xe95f, 0xe574, 0xe4c4, 0xe573, + 0xa228, 0xe565, 0x4089, 0xe229, 0x6274, 0x6373, 0x6451, 0xe452, + 0xe567, 0xe2df, 0xe4a5, 0xe575, 0xe576, 0x4f36, 0xcf50, 0xe54a, + 0xe569, 0xe523, 0x645a, 0xe4bb, 0xe2ae, 0xa1ff, 0x641d, 0xe562, + 0xe54b, 0x61d1, 0xe1d2, 0x61d3, 0x61fb, 0xe337, 0xe1d4, 0xe1dd, + 0xe1d8, 0xe1d7, 0xe1d9, 0xe1d5, 0xe1f7, 0xe1fa, 0xe1e7, 0xe1e4, + 0xe212, 0xe1e9, 0xe1e3, 0xe346, 0xe1f9, 0xe35a, 0xe1f5, 0xe203, + 0xe223, 0xe208, 0xe226, 0xe245, 0xe20d, 0xe214, 0x6221, 0x637e, + 0x6418, 0xe53a, 0xe209, 0xe2c7, 0xe2fc, 0xe211, 0xe210, 0x6205, + 0xe470, 0xbb3d, 0xe21e, 0xe3a2, 0x620e, 0xe264, 0xe227, 0xe201, + 0xe225, 0xe204, 0xe215, 0xe200, 0xe23a, 0x62ad, 0xe322, 0xe266, + 0xe257, 0xe237, 0x46cb, 0x4f3d, 0xe262, 0xe233, 0xe255, 0xe23d, + 0xe238, 0xe25e, 0x6246, 0x645a, 0xe47d, 0xe26c, 0xe26d, 0xe240, + 0xe23f, 0xe23e, 0x6244, 0x6421, 0xe435, 0xe251, 0xe234, 0xe460, + 0x6206, 0xe25b, 0xe25a, 0x2228, 0xe24b, 0xe230, 0xe249, 0x6247, + 0xe248, 0xe24d, 0x622e, 0xe268, 0xe239, 0x622c, 0xe438, 0xe276, + 0xe2ac, 0xe2a0, 0xe27a, 0xe2e9, 0x630f, 0xe41a, 0xe2aa, 0xe2ee, + 0xe2cf, 0xe2e3, 0xe403, 0xe28d, 0xe43a, 0xe285, 0xe2c1, 0xe2b1, + 0xe2a6, 0xe3a7, 0xe358, 0xe296, 0xe291, 0xe2cc, 0xe2a9, 0xe29b, + 0xe3f5, 0xe293, 0xe3a9, 0xe27f, 0x629a, 0xe443, 0xe27b, 0xe298, + 0xe31a, 0xe2ab, 0xe278, 0xe2a5, 0x222c, 0x2257, 0x2277, 0xe3df, + 0xe283, 0xe40b, 0xe2a8, 0xe280, 0xe2a3, 0x62f3, 0xe444, 0xe412, + 0x5216, 0x5217, 0xe2ea, 0xe2d9, 0xe338, 0xe2f1, 0xe3c8, 0x635e, + 0xe3d7, 0xe2b7, 0xe396, 0xe2f0, 0xe2e5, 0x5021, 0xe2e4, 0xe34b, + 0xe2ef, 0xe2e8, 0x62b9, 0x63e5, 0xe3fd, 0xe2bc, 0xe2dd, 0xe2d2, + 0xe2c5, 0xe2f6, 0xe426, 0x6417, 0xe427, 0x62b3, 0xe2ed, 0xe2bb, + 0xe2c3, 0xe2df, 0xe2e6, 0xe312, 0xe306, 0xe37a, 0xe369, 0xe32f, + 0xe328, 0xe31b, 0xe321, 0xe340, 0xe301, 0xe315, 0xe329, 0xe32b, + 0xe32e, 0xe47c, 0x6318, 0xe39a, 0xe310, 0xe326, 0xe455, 0xe341, + 0xe308, 0x6343, 0xe36f, 0xe307, 0xe31f, 0xe320, 0xe375, 0xe2f8, + 0xe333, 0xe319, 0xe365, 0xe348, 0xe347, 0xe3d8, 0xe376, 0xe354, + 0xe364, 0xe36c, 0x637e, 0xe49f, 0xe35b, 0xe3aa, 0xe360, 0xe370, + 0xe384, 0xe34d, 0xe382, 0xe3e4, 0xe3a1, 0xe428, 0xe387, 0xe3cc, + 0x63ad, 0xe3ae, 0xe39b, 0xe398, 0xe477, 0xe482, 0x63b8, 0xe42b, + 0xe3b3, 0xe3bf, 0x63a6, 0xe402, 0xe3ac, 0xe38a, 0xe3b0, 0xe3b5, + 0xe44c, 0xe3e2, 0xe3dc, 0xe3dd, 0xe3cd, 0xe3f0, 0xe3de, 0xe3e1, + 0xe3d1, 0xe3c3, 0xe3c7, 0xe3d0, 0xe414, 0x641d, 0xe481, 0xe410, + 0xe3f7, 0xe465, 0xe413, 0xe46d, 0xe420, 0xe479, 0xe3f9, 0xe419, + 0xe44a, 0xe433, 0xe436, 0xe432, 0x638c, 0xe42e, 0xe43f, 0xe454, + 0xe463, 0xe45e, 0xe471, 0xe472, 0x1ee7, 0x214f, 0x6578, 0xe57f, + 0x1ee7, 0x214f, 0x6577, 0xe57f, 0x1e45, 0x9e46, 0x1ee7, 0x214f, + 0x6577, 0xe578, 0xe5e8, 0xe5e9, 0xe5ea, 0xe5eb, 0x6589, 0xe5ed, + 0xe5ec, 0x6587, 0xe5ed, 0xaf00, 0xe5f6, 0xe5f3, 0x65a0, 0xe5f0, + 0x6592, 0xe5f2, 0x6591, 0xe5f2, 0xe5f4, 0xe5f5, 0xe5f8, 0x65f9, + 0xeb27, 0x658f, 0xe5f0, 0xe602, 0x2173, 0x65d7, 0xe5dc, 0xe601, + 0xa408, 0xe600, 0xa4c4, 0xe5fa, 0xe5fd, 0xe603, 0xe606, 0xe5fe, + 0x65b2, 0xe605, 0x65b1, 0xe605, 0x65c3, 0xe612, 0xe60a, 0x2266, + 0xe609, 0xe60e, 0xe60f, 0xe60d, 0xe608, 0xe60c, 0x65b4, 0xe612, + 0xb77f, 0xb697, 0xe5f1, 0x3ff6, 0xe614, 0xe615, 0xe611, 0xe607, + 0xe617, 0xe618, 0xe5ff, 0xe616, 0xe619, 0xe5ef, 0x2173, 0x65a2, + 0xe5dc, 0x3597, 0x6b25, 0x6b26, 0x6b2a, 0xeb2d, 0x242f, 0x2518, + 0x2553, 0x2554, 0x255f, 0xdaec, 0x2173, 0x65a2, 0xe5d7, 0xe61a, + 0xe613, 0xe610, 0xdf9f, 0xe61b, 0xe5fc, 0xe580, 0xe582, 0xe583, + 0xe586, 0xe588, 0x6587, 0xe589, 0xa54f, 0xe5d6, 0x658f, 0xe5a0, + 0xe5c8, 0x6591, 0xe592, 0xe58e, 0xe593, 0xe594, 0xe58c, 0xb0b6, + 0xe598, 0x6599, 0xeb27, 0xe5a8, 0xd05e, 0xe5e5, 0xe5a9, 0xe5ad, + 0xe5d3, 0xe5a5, 0xe5a3, 0xe5a1, 0xe5ab, 0xeb2e, 0x65b1, 0xe5b2, + 0xe5ac, 0xe5cd, 0xe5be, 0x2266, 0xe5b9, 0xe5b6, 0xeb29, 0xe5bf, + 0xe5bd, 0xe5bb, 0xe5bc, 0xe5e1, 0xe5cc, 0x65b4, 0xe5c3, 0xe5e0, + 0x3ff6, 0xe5ca, 0xe5cb, 0xe5d4, 0xe5d0, 0xe5d2, 0xe5d5, 0x65de, + 0xeb2b, 0xe5e4, 0xe61d, 0x6091, 0xe61c, 0xe68a, 0x1f8c, 0x6634, + 0x6670, 0xe682, 0x6633, 0xe67d, 0xe638, 0x2347, 0xe65e, 0x2742, + 0xac85, 0x274f, 0xa76f, 0xa751, 0xa740, 0xca7d, 0x6626, 0xe67d, + 0x1f8c, 0x6625, 0x6670, 0xe682, 0xe663, 0x2826, 0xe68e, 0xe628, + 0xbcae, 0x2768, 0xe641, 0x2768, 0xe640, 0xe69b, 0xe678, 0xe6b4, + 0xe673, 0xe658, 0xa905, 0x665c, 0x665d, 0xe67f, 0xa7c8, 0xe649, + 0x6655, 0xe67f, 0xe655, 0x2347, 0xe629, 0xaf8f, 0x2866, 0xe635, + 0xe677, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x669d, 0xe6af, + 0xe695, 0x4906, 0x667a, 0xe6aa, 0x1f8c, 0x6625, 0x6634, 0xe682, + 0xe648, 0xe665, 0xe646, 0x4906, 0x6669, 0xe6aa, 0x2794, 0xa819, + 0x6626, 0xe633, 0x6655, 0xe65c, 0x2830, 0xa895, 0x1f8c, 0x6625, + 0x6634, 0xe670, 0x27de, 0xa824, 0xe61f, 0xb697, 0x2826, 0xe636, + 0xe6a8, 0x1e5a, 0x66a0, 0xe6b1, 0x48d2, 0xe668, 0xa75e, 0xe69f, + 0xe645, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0xe6af, + 0xe699, 0x1e5a, 0x6690, 0xe6b1, 0x23b8, 0x60bb, 0xe130, 0xe68f, + 0x4906, 0x6669, 0xe67a, 0x275f, 0xa8b3, 0xde8b, 0x2c9b, 0x2cf6, + 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0xe69d, 0x1e5a, 0x6690, 0xe6a0, + 0xea98, 0xe647, 0x66b7, 0xe6b8, 0x66b6, 0xe6b8, 0x66b6, 0xe6b7, + 0x2bc9, 0x674d, 0x674e, 0x674f, 0x6db4, 0x6e16, 0xee64, 0xa3ea, + 0xe6cb, 0xe6e3, 0x6ceb, 0xed08, 0x20f1, 0xecf8, 0xe6bd, 0xe6dd, + 0xe6db, 0x3742, 0xe6dc, 0x2f6b, 0x4431, 0xed70, 0xd67d, 0xa3cc, + 0xee1b, 0x66cf, 0xedb5, 0x3742, 0xe6d1, 0xe6cd, 0x6d8f, 0x6dc4, + 0xee21, 0xadb2, 0x5b8e, 0xdb90, 0xc9bb, 0xe6be, 0xbc1b, 0x9e91, + 0xe742, 0xe717, 0xe741, 0x671a, 0xe727, 0xc535, 0x671a, 0xe727, + 0xe73d, 0xeef4, 0x4075, 0x671b, 0xe748, 0xbcbe, 0xe6f6, 0x66fa, + 0x66fe, 0xe727, 0x4075, 0x670a, 0xe748, 0xe722, 0xe721, 0x66fa, + 0x66fe, 0xe71a, 0xe744, 0xd987, 0x1e30, 0x5c4a, 0x5c50, 0xe74a, + 0xe701, 0xe6f7, 0xe6f3, 0xe72d, 0xa3c7, 0x4075, 0x670a, 0xe71b, + 0xa3c6, 0x1e30, 0x5c4a, 0x5c50, 0xe73b, 0x2bc9, 0x66ba, 0x674e, + 0x674f, 0x6db4, 0x6e16, 0xee64, 0x2bc9, 0x66ba, 0x674d, 0x674f, + 0x6db4, 0x6e16, 0xee64, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x6db4, + 0x6e16, 0xee64, 0x2bc8, 0xe752, 0x2bc8, 0xe751, 0xe75a, 0x2172, + 0x2929, 0xe75d, 0xe75c, 0xe753, 0xe759, 0x2172, 0x2929, 0xe754, + 0x4cc6, 0x6763, 0x6eaa, 0x6eab, 0x6eb5, 0xeeba, 0xe762, 0x45b1, + 0xc6b0, 0xe768, 0xe82e, 0xe765, 0x676d, 0xe771, 0x676b, 0x6771, + 0xe7e7, 0x676b, 0x676d, 0xe7e7, 0xe7be, 0xcd46, 0x6789, 0xef17, + 0x6780, 0xef17, 0xe7b5, 0xe78d, 0xe78c, 0xade9, 0xe7c3, 0xe7bd, + 0xe7b9, 0x49cb, 0xe7a7, 0x49cb, 0xe7a6, 0xc89f, 0xe7c9, 0x5f41, + 0xe7dc, 0xe7dd, 0xe78b, 0xe79f, 0xe792, 0xe774, 0x4e6e, 0xcf30, + 0xe791, 0xa343, 0x589c, 0xe7e4, 0xe7af, 0xe7e6, 0xe7e7, 0x2dff, + 0xe7e8, 0xe7e9, 0xe7ea, 0x5f41, 0x67b1, 0xe7ec, 0xe7b2, 0xe7eb, + 0x589c, 0xe7c8, 0xe7cb, 0x676d, 0x6771, 0xe7cc, 0x2dff, 0xe7cd, + 0xe7d3, 0xe7d9, 0xe7de, 0x5f41, 0xe7dc, 0xe7ee, 0xe7ed, 0xe7f1, + 0xe7ef, 0x6f4f, 0xef51, 0xe7fb, 0xe7f5, 0xa4cd, 0xe875, 0xe876, + 0xe877, 0xe879, 0xe87a, 0xe878, 0xe87b, 0xe87c, 0xe882, 0xe880, + 0xe883, 0xe884, 0xe87d, 0xe881, 0xe87f, 0xe887, 0xe886, 0x6838, + 0xe888, 0xe88c, 0xe889, 0x6825, 0xe890, 0x6824, 0xe890, 0xe88f, + 0x6830, 0xe88a, 0xa934, 0x6767, 0xe892, 0x682c, 0xe88a, 0xe88b, + 0x4a4e, 0xe896, 0xe894, 0x681a, 0xe888, 0x4a68, 0x683a, 0x683d, + 0xe893, 0x4a68, 0x6839, 0x683d, 0xe893, 0xe891, 0x5cf4, 0xdd56, + 0x4a68, 0x6839, 0x683a, 0xe893, 0xeaed, 0xe897, 0xd16e, 0xe898, + 0xe89d, 0xe89a, 0x6854, 0xe89c, 0xe899, 0xe89b, 0x684f, 0xe89c, + 0x363e, 0xe86f, 0xa6df, 0xb13f, 0xe8a1, 0x685b, 0xe8a0, 0x685a, + 0xe8a0, 0xcc7b, 0xe89f, 0xe8a2, 0xe87e, 0xe8a4, 0xe8a5, 0x363e, + 0xe855, 0xe8a6, 0x6885, 0x6ad7, 0xee15, 0xe89e, 0xe8a7, 0xe801, + 0xe802, 0xe803, 0xe807, 0xe805, 0xe806, 0x6808, 0xeb1a, 0xe80a, + 0xe811, 0xe867, 0xe813, 0xe80e, 0xe812, 0xe80c, 0xe80f, 0xe810, + 0x6871, 0xead7, 0xe818, 0xe817, 0x681a, 0xe838, 0xe821, 0x682c, + 0xe830, 0xe832, 0xe81c, 0xbf41, 0xc1b2, 0xe826, 0x6824, 0xe825, + 0xe83b, 0xe82e, 0x4a68, 0x6839, 0x683a, 0xe83d, 0xe837, 0x4a4e, + 0xe834, 0xe846, 0xe84c, 0xe852, 0xe84e, 0xe853, 0x684f, 0xe854, + 0xe84d, 0xe873, 0xe862, 0x685a, 0xe85b, 0xe859, 0xe865, 0xce87, + 0xe86b, 0xe86c, 0xe870, 0xe874, 0x1e30, 0x21e8, 0x21ec, 0x21ee, + 0x5af7, 0x5bbd, 0x68cc, 0xe8ce, 0xe8d0, 0x68b7, 0x68c6, 0x68c8, + 0xe8d1, 0xe8d2, 0xa3f0, 0xa22e, 0xe8d3, 0x68ae, 0x68c6, 0xe8c8, + 0xe8d4, 0xe8cf, 0xe8d6, 0xe8d5, 0xe8d7, 0x68c4, 0xe8d8, 0x68c3, + 0xe8d8, 0x68ae, 0x68b7, 0x68c7, 0x68c8, 0xe8d9, 0xe8c6, 0x68ae, + 0x68b7, 0x68c6, 0xe8da, 0x21e8, 0x21ec, 0x21ee, 0x68a8, 0xe8ce, + 0x1e30, 0x21e8, 0x21ec, 0x21ee, 0x68a8, 0xe8cc, 0xe8ba, 0xe8ad, + 0xe8ae, 0xe8af, 0xe8b6, 0xe8b8, 0xe8bc, 0xe8bb, 0xe8c0, 0x68c3, + 0xe8c4, 0xe8c6, 0xe8c8, 0xe8de, 0xcffb, 0xe8db, 0x25b0, 0x68e0, + 0xe963, 0x25b0, 0x68df, 0xe963, 0xe910, 0xe965, 0xe964, 0xe966, + 0xe957, 0xe968, 0xe96a, 0x49d7, 0xe96b, 0xe90a, 0xe96c, 0x68f2, + 0xe96e, 0x68f0, 0xe96d, 0xe8ef, 0x68ee, 0xe96e, 0xe974, 0xe99d, + 0xe972, 0xe971, 0xe970, 0xe973, 0xe97a, 0xe978, 0x6920, 0xe97c, + 0x645c, 0x695f, 0xe977, 0x217b, 0x4faa, 0xe8ec, 0xe975, 0xe95c, + 0xe979, 0xe97b, 0xe8e1, 0xe97d, 0x6927, 0xe981, 0xe97f, 0xe982, + 0xe97e, 0x1f59, 0xe980, 0xd0b4, 0xe984, 0xe983, 0xe96f, 0xe18a, + 0x6905, 0xe97c, 0xe985, 0x2582, 0x6912, 0x6935, 0xe981, 0x5218, + 0xe986, 0xccca, 0xccc7, 0xe967, 0xe959, 0x2582, 0xe927, 0xe989, + 0xe987, 0xe967, 0xe98e, 0xccd5, 0xe969, 0xe988, 0xe98f, 0xe98a, + 0xe98c, 0xe98d, 0xe992, 0xe990, 0xe991, 0xe993, 0xe988, 0xe994, + 0xd1b3, 0xcce6, 0xe965, 0xe976, 0xe8e8, 0xe934, 0xe90d, 0xe98b, + 0x645c, 0x6909, 0xe977, 0xe995, 0x25b0, 0x68df, 0xe8e0, 0xe8e3, + 0x68e2, 0xe951, 0xe8e5, 0x6933, 0xe939, 0xe8e9, 0xe93c, 0xe8ea, + 0xe8eb, 0xe8ed, 0xe8ef, 0x68ee, 0xe8f2, 0xe91e, 0xe8fe, 0xe8fd, + 0xe8fc, 0xe8ff, 0xe8f4, 0xe90c, 0xe952, 0x6909, 0xe95f, 0xe904, + 0xe90e, 0xe903, 0xe90f, 0x6905, 0xe920, 0xe911, 0xe916, 0xe913, + 0x1f59, 0xe918, 0x6912, 0xe927, 0xe915, 0xe91c, 0xe91b, 0xe921, + 0xe928, 0xe937, 0x693d, 0xe94b, 0xe936, 0xe93f, 0xe95e, 0xe941, + 0xe943, 0xe93a, 0xe93e, 0xe948, 0xe949, 0xe945, 0xe94a, 0xe94c, + 0xe962, 0xe8f6, 0xe99f, 0xe99e, 0xea6c, 0xea6d, 0xa1af, 0x69c4, + 0xea6e, 0xea5d, 0xea70, 0xea6f, 0xea72, 0xce36, 0x6a62, 0xea74, + 0xea73, 0x69b1, 0xea6e, 0x6a5b, 0xea7f, 0x357a, 0x69c8, 0x6a45, + 0xea71, 0x357a, 0x69c6, 0x6a45, 0xea71, 0xea7b, 0xea7d, 0xea79, + 0xea75, 0xea7e, 0xea80, 0xea78, 0xea76, 0x69de, 0xea7c, 0x69dd, + 0xea7c, 0xea77, 0x208c, 0x4f75, 0xea82, 0xea88, 0xea87, 0xea73, + 0xea83, 0xea86, 0x6a2e, 0xea51, 0xea8e, 0xea8f, 0xea8b, 0xea8d, + 0xea93, 0xea92, 0xea91, 0xea90, 0x6a13, 0x6a57, 0xea8c, 0x6a37, + 0xea9a, 0x6a10, 0x6a57, 0xea8c, 0xea9b, 0xea97, 0xea99, 0xea52, + 0xea9e, 0xea98, 0x69f5, 0x6a51, 0xea9d, 0xd17e, 0xea7a, 0x6a12, + 0xea9a, 0xea9f, 0xea47, 0xeaa1, 0xd4e6, 0xea9c, 0xea96, 0xeaa0, + 0xeaa2, 0x357a, 0x69c6, 0x69c8, 0xea71, 0xea3a, 0xea85, 0xea95, + 0xea81, 0xeaa3, 0x69f5, 0x6a2e, 0xea9d, 0xea28, 0xea84, 0x6a10, + 0x6a13, 0xea8c, 0xb0ca, 0x69c5, 0xea7f, 0xe9b2, 0xeaa4, 0x69bf, + 0xea74, 0xeaa7, 0x560e, 0xeaa5, 0xeaa6, 0xbb22, 0xea8a, 0xea89, + 0xe9ac, 0xe9ad, 0x69b1, 0xe9c4, 0xe9b4, 0xe9b3, 0x357a, 0x69c6, + 0x69c8, 0xea45, 0xe9b9, 0x69c1, 0xe9ee, 0x69bf, 0xea62, 0xe9d4, + 0xe9db, 0xe9df, 0xe9d9, 0xe9d2, 0xea36, 0xe9d0, 0x69dd, 0xe9de, + 0xe9d1, 0xe9d5, 0x69c5, 0xea5b, 0xe9d8, 0xea4d, 0x208c, 0x4f75, + 0xe9e1, 0xe9f0, 0xea55, 0xea4a, 0xe9f1, 0xe9ed, 0xe9e2, 0xea6b, + 0xea6a, 0xea01, 0x6a10, 0x6a13, 0xea57, 0xea02, 0xe9f8, 0xe9ff, + 0xea0f, 0xea0e, 0xea0d, 0xea05, 0xea4c, 0xea42, 0xea19, 0x66b2, + 0xea2d, 0xea24, 0x6a12, 0xea37, 0xea16, 0xea41, 0x6a2e, 0xea51, + 0xea2b, 0xea38, 0xea43, 0xea3e, 0xea44, 0xea4f, 0xea5f, 0x560e, + 0xea65, 0xea66, 0xea64, 0xd0ae, 0x1f53, 0x5eb0, 0x5ec6, 0xead4, + 0xeca0, 0x51b8, 0xead3, 0xeacf, 0xd180, 0xead6, 0xead5, 0xeac5, + 0xd10f, 0x51b8, 0xeac4, 0x1f53, 0x5eb0, 0x5ec6, 0xeab5, 0x51cf, + 0xeacc, 0xeacb, 0x6871, 0x6885, 0xee15, 0xead9, 0xead8, 0x1eff, + 0xaf77, 0xeaf9, 0xeaef, 0x6b02, 0xeb22, 0x23d1, 0xeaee, 0xe83e, + 0x23d1, 0xeaea, 0xeae5, 0x1f5b, 0xaf7f, 0xeae4, 0xa243, 0x6ae9, + 0x6b13, 0xeb22, 0xb77e, 0xd0e1, 0x6b02, 0xeb22, 0xe87b, 0xeb23, + 0x6ae9, 0x6b02, 0xeb13, 0xeb1b, 0x3597, 0x65d8, 0x6b26, 0x6b2a, + 0xeb2d, 0x3597, 0x65d8, 0x6b25, 0x6b2a, 0xeb2d, 0x6599, 0xe5f9, + 0xa4c4, 0xe60b, 0x3597, 0x65d8, 0x6b25, 0x6b26, 0xeb2d, 0xe61a, + 0x3597, 0x65d8, 0x6b25, 0x6b26, 0xeb2a, 0xe604, 0x3b1d, 0x60c1, + 0xeb31, 0x3b1d, 0x60c1, 0xeb30, 0xeb39, 0xeb36, 0x1ffc, 0xcca5, + 0xac2c, 0xeb58, 0xeb4e, 0x573d, 0xeb49, 0x21f2, 0x2c32, 0x2c34, + 0x2c36, 0xac37, 0x1e11, 0xe19c, 0xeb47, 0xec7c, 0xec7d, 0xec7e, + 0xec6e, 0xebbb, 0xec80, 0xeeff, 0xec81, 0x6c78, 0xec88, 0xec24, + 0xec82, 0xec7f, 0xec84, 0xec85, 0xec86, 0x6bdb, 0xecb7, 0xec8c, + 0xec89, 0xec8f, 0xec87, 0xebf9, 0xec90, 0xec8d, 0xec8b, 0xec8a, + 0xec92, 0xec98, 0x6bd7, 0x6c76, 0xec9e, 0xec95, 0xec96, 0x6bb7, + 0xebf7, 0xec94, 0xec9b, 0xec91, 0x2c1f, 0x2c20, 0x5d7b, 0x6c7b, + 0xec9c, 0xec93, 0xecaa, 0x6ba7, 0xebf7, 0xec9d, 0xeb66, 0xebd8, + 0xeca7, 0xeca0, 0x6c00, 0xeca9, 0xeca4, 0x6bcb, 0xeca8, 0xebca, + 0xecac, 0xecbb, 0xecaf, 0xecad, 0x6b9d, 0xec76, 0xebbe, 0x6b89, + 0xecb7, 0xecb4, 0xecb1, 0xecb5, 0xecb2, 0xecb3, 0xecb8, 0xecae, + 0xecb0, 0xecb6, 0xecba, 0xec3a, 0x6ba7, 0x6bb7, 0xecc0, 0xeb8f, + 0xecab, 0xecca, 0x6bc7, 0xeca9, 0xecc8, 0xec97, 0xecc2, 0x6c28, + 0xecbd, 0xecc7, 0x6c0d, 0xecc5, 0x6c0c, 0xecc5, 0xecbe, 0x6c77, + 0xecc4, 0xecc6, 0xecc3, 0x6c2e, 0xecc1, 0xecd2, 0xecd1, 0xeccb, + 0xeca5, 0xeb73, 0x6c5e, 0xeccf, 0x6c08, 0xecce, 0xecd0, 0xeccd, + 0xec1b, 0xeca2, 0x6ccc, 0xef07, 0xecd3, 0xecd8, 0xeca6, 0xeca3, + 0x6bf5, 0xecb9, 0xecd7, 0xecdb, 0xecd4, 0xecc9, 0xecd9, 0xecd5, + 0x6cd6, 0x6f08, 0xef9e, 0xecdf, 0xecdd, 0xecdd, 0xecdc, 0xecde, + 0xec9f, 0xecbc, 0xec25, 0xec8e, 0xec99, 0xece3, 0xece1, 0xece2, + 0xecbf, 0xec9a, 0xeb63, 0xece0, 0x6b9d, 0x6bd7, 0xec9e, 0x6c10, + 0xecc4, 0x6b72, 0xec88, 0xeca1, 0x2c1f, 0x2c20, 0x5d7b, 0x6bae, + 0xec9c, 0xeb5a, 0xeb5b, 0xeb62, 0xeb77, 0xeb68, 0xeb6f, 0xeb74, + 0xeb7a, 0xeb81, 0xeb83, 0xeb8e, 0x6b72, 0xec78, 0xeb8b, 0xeb93, + 0xeb92, 0xeb8a, 0x56ab, 0xeb91, 0xec5f, 0xeb8d, 0xeb90, 0xebad, + 0xeb9a, 0xebb3, 0xebaa, 0xeb9e, 0xeba6, 0xec02, 0xeb9c, 0xec60, + 0xec6d, 0xebab, 0x2c1f, 0x2c20, 0x5d7b, 0x6bae, 0xec7b, 0xebba, + 0x6b9d, 0xec76, 0xec58, 0x6abe, 0xebc1, 0xec7a, 0xec31, 0xec39, + 0xebc9, 0xec23, 0xec37, 0xebc0, 0xebca, 0x6bc7, 0xec00, 0xebb6, + 0xebfd, 0xebd2, 0xebd6, 0xebea, 0xebd5, 0xebeb, 0xebe1, 0xebe4, + 0xebe7, 0xebdd, 0xebe2, 0xebf0, 0x6b89, 0xebdb, 0xebe8, 0xec3a, + 0xebf4, 0xebd4, 0xec5d, 0xec08, 0xec0f, 0xec68, 0xebf7, 0xec1b, + 0xec03, 0xec13, 0x6c10, 0xec77, 0x6c0c, 0xec0d, 0xec12, 0xec09, + 0xec01, 0xec42, 0xebff, 0xec20, 0x6c32, 0xef07, 0xec2d, 0xec28, + 0xec25, 0xec29, 0xec1f, 0xec1c, 0xec33, 0xec3e, 0x51a4, 0xec48, + 0x6c49, 0xef08, 0xec3b, 0xec35, 0xec45, 0xec3c, 0xec56, 0x6c53, + 0xec54, 0xec57, 0xec52, 0xec6f, 0xec64, 0xec67, 0xec63, 0x2c4c, + 0xee1f, 0x21eb, 0xecec, 0xee20, 0x66c1, 0xed08, 0xece7, 0xee24, + 0xa1e4, 0xee23, 0xee22, 0xe6c7, 0xee29, 0xee28, 0x66c1, 0xeceb, + 0x6d76, 0xee26, 0x6dd7, 0xee25, 0xee30, 0xee35, 0xee33, 0x6e1c, + 0xee32, 0xee2e, 0x6d44, 0xee31, 0xee2a, 0xee2f, 0xee2d, 0x53ba, + 0xedaf, 0xee38, 0xee39, 0xedc3, 0xee3b, 0xee3f, 0xedfa, 0xee3d, + 0xee3a, 0xee3c, 0xed1f, 0xee40, 0xee43, 0xee46, 0xee41, 0xedaa, + 0xee48, 0x6d5e, 0xee45, 0x6d5d, 0xee45, 0xee44, 0xee49, 0xee4c, + 0xee4f, 0xee50, 0xee4e, 0xe6d5, 0xee4a, 0x6d09, 0xee26, 0xee53, + 0x6da4, 0xee4d, 0x6dab, 0xee2b, 0xee51, 0xee52, 0x66de, 0x6dc4, + 0xee21, 0xee4b, 0xee59, 0xee55, 0xee57, 0xee56, 0xed7e, 0xee5b, + 0xee5c, 0xed59, 0x6d87, 0xee2b, 0xee27, 0x53ba, 0xed2c, 0xee5f, + 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x674f, 0x6e16, 0xee64, 0xe6db, + 0xee60, 0xee61, 0xee58, 0xee63, 0xee5a, 0xee5a, 0xee62, 0xee5e, + 0xed33, 0x66de, 0x6d8f, 0xee21, 0xedcf, 0xedc9, 0xedc8, 0xee5d, + 0xedc6, 0xee67, 0xee65, 0x6d0e, 0xee25, 0xee37, 0xee68, 0xee36, + 0xee6a, 0xee54, 0xee69, 0xc1d5, 0xee6b, 0x6df4, 0xee47, 0x6df3, + 0xee47, 0xee6c, 0xee70, 0x6d3c, 0xee6d, 0xee34, 0xee0a, 0xee6f, + 0xedff, 0xee71, 0xd3ba, 0xee72, 0x6871, 0x6ad7, 0xee2c, 0x2bc9, + 0x66ba, 0x674d, 0x674e, 0x674f, 0x6db4, 0xee64, 0xee74, 0xee66, + 0x66da, 0xee73, 0xed1d, 0xee42, 0xee3e, 0x2c4c, 0xece5, 0xece9, + 0x66de, 0x6d8f, 0xedc4, 0xecf6, 0xecf4, 0xecf2, 0x6d0e, 0xedd7, + 0x6d09, 0xed76, 0xedac, 0xed07, 0xed06, 0xed23, 0x6d87, 0xedab, + 0xee15, 0xed28, 0xed1e, 0xed26, 0xed12, 0xed1f, 0xed1d, 0xed1b, + 0xedfd, 0xed15, 0xede5, 0xedd9, 0xed2f, 0xed30, 0xed42, 0xed34, + 0xed43, 0xed3f, 0xee1e, 0xed3b, 0xed50, 0xed53, 0xee1d, 0xed51, + 0xed60, 0x6d5d, 0xed5e, 0xed52, 0x6df3, 0xedf4, 0xed5c, 0xed61, + 0xed72, 0xed93, 0xed6a, 0xed7e, 0xed6f, 0xed6c, 0xed6e, 0xed89, + 0xed8a, 0xed77, 0xedeb, 0xed98, 0xeda1, 0xed9a, 0xedbb, 0xed96, + 0x6dbf, 0xedc0, 0xeda5, 0xeda9, 0xedca, 0xedc2, 0xedb2, 0xedb9, + 0xedba, 0xedc1, 0xedbc, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x674f, + 0x6db4, 0xee16, 0xedd6, 0xee1a, 0xedd3, 0xedda, 0xedef, 0xede6, + 0xedf2, 0xedf8, 0xedfa, 0xee07, 0xedf9, 0xee0c, 0xee0f, 0xee1b, + 0xee18, 0x2364, 0xa877, 0x4877, 0x48b1, 0xee7c, 0x24b8, 0xe18e, + 0xee7e, 0xc877, 0x4877, 0x48b1, 0xee78, 0x2869, 0xc6d0, 0xee7a, + 0xee85, 0xeea4, 0xee83, 0xee8f, 0xee87, 0x1e3d, 0xaa6f, 0xc350, + 0x4c97, 0xee84, 0xeea6, 0xeea5, 0x6eac, 0xeeb8, 0x4cc6, 0x6762, + 0x6eab, 0x6eb5, 0xeeba, 0x4cc6, 0x6762, 0x6eaa, 0x6eb5, 0xeeba, + 0x6ea9, 0xeeb8, 0xa305, 0x36f2, 0x4cac, 0x6eb4, 0xeeb9, 0x36f2, + 0x4cac, 0x6eaf, 0xeeb9, 0x4cc6, 0x6762, 0x6eaa, 0x6eab, 0xeeba, + 0x6ea9, 0xeeac, 0x36f2, 0x4cac, 0x6eaf, 0xeeb4, 0x4cc6, 0x6762, + 0x6eaa, 0x6eab, 0xeeb5, 0x45f2, 0x45f3, 0xd534, 0x1e48, 0x2c1b, + 0x2e85, 0xeebd, 0x1e48, 0x2c1b, 0x2e85, 0xeebc, 0xeec4, 0x48fa, + 0xeec3, 0xeecc, 0xeec9, 0xcc98, 0xeed2, 0xeed1, 0xeed9, 0xeed8, + 0xeef1, 0x294c, 0xc0b9, 0xeef6, 0xeeed, 0xa15a, 0xeef7, 0xeef2, + 0xeee4, 0xeedb, 0xeeea, 0xe709, 0xeee1, 0xeee9, 0xd8ae, 0xeefe, + 0xeefd, 0x6b6d, 0xef0b, 0xef0c, 0xd6d9, 0x6c32, 0xeccc, 0x6c49, + 0x6cd6, 0xef9e, 0xef0d, 0xeeff, 0xef02, 0xef09, 0xef11, 0xef0e, + 0xe3a1, 0x46b7, 0xc6bc, 0xa1ac, 0x6780, 0xe789, 0xef21, 0xef20, + 0xdc82, 0xef39, 0xef34, 0xa5c5, 0x1e9d, 0x3589, 0x358a, 0xef50, + 0x358b, 0xb58e, 0x5cf7, 0xdd4d, 0x67f2, 0xef51, 0x1e9d, 0x3589, + 0x358a, 0xef4a, 0x67f2, 0xef4f, 0x3b6f, 0xef7f, 0xef54, 0x6f53, + 0xef80, 0xef81, 0xef82, 0xef85, 0xef70, 0xef87, 0xef83, 0xef86, + 0x6f62, 0xef84, 0x6f61, 0xef84, 0xa1fa, 0xef88, 0x256e, 0x2699, + 0xa6d3, 0xa4ac, 0x6f71, 0xef8a, 0xef89, 0xef5a, 0xef6a, 0xef8b, + 0xd16d, 0xef8c, 0x3b6f, 0xef52, 0xef54, 0xef55, 0xef57, 0xef5f, + 0x6f61, 0xef62, 0xef59, 0xef60, 0xef5c, 0xef66, 0xef6c, 0xef6a, + 0xef72, 0xef77, 0x4adc, 0x6f92, 0xef99, 0xa390, 0xae9e, 0x4adc, + 0x6f8d, 0xef99, 0xef9a, 0xef9b, 0x6f8d, 0xef92, 0xef94, 0xef95, + 0x1e80, 0xef9f, 0x49cb, 0x49cc, 0xca50, 0x6c49, 0xef08, 0x1e80, + 0xef9c, 0x248a, 0x248c, 0xb0d2, 0x2401, 0xcc72, +}; + +static const short cjk_variants_indx[0x5200] = { + /* 0x4e00 */ + 4, -1, -1, -1, 5, 6, -1, 7, + -1, 8, 10, 11, 12, -1, 13, -1, + 14, 16, 19, 20, -1, -1, 22, 24, + 26, -1, 28, 29, 33, 34, -1, 36, + 38, 40, 42, 44, 45, 47, 49, 52, + -1, -1, 53, 56, 59, -1, -1, -1, + 60, -1, 66, 67, 68, -1, -1, -1, + -1, -1, 69, -1, -1, 71, 73, -1, + -1, 76, 77, 79, 81, 83, 85, -1, + 87, 92, -1, -1, 93, -1, -1, -1, + 94, 96, -1, -1, 100, 101, -1, 103, + 105, -1, 107, -1, -1, -1, -1, -1, + 110, 111, -1, -1, -1, -1, 115, -1, + 116, -1, -1, -1, -1, -1, -1, -1, + 118, 119, -1, -1, -1, -1, -1, -1, + -1, 121, -1, -1, -1, -1, 124, -1, + 128, 130, 133, -1, -1, -1, 135, -1, + 137, 138, 139, 141, 143, -1, 144, 147, + 151, 153, -1, -1, 155, -1, 156, 157, + 161, 162, 163, -1, 165, 167, 171, 173, + -1, 174, -1, -1, -1, -1, -1, 176, + -1, 178, -1, 182, 183, -1, -1, 184, + 185, 186, 187, -1, -1, 188, -1, -1, + 189, -1, 190, 191, -1, -1, 192, 194, + -1, 195, 196, -1, -1, 199, 201, 202, + -1, 203, -1, -1, 204, -1, 207, 209, + 210, 212, -1, 215, -1, -1, -1, -1, + 217, 218, -1, -1, -1, 220, 221, -1, + -1, -1, 222, -1, -1, -1, -1, 223, + -1, -1, 227, -1, 228, 229, 230, -1, + -1, -1, -1, -1, -1, -1, -1, 232, + -1, -1, 234, -1, 236, 237, 239, 240, + /* 0x4f00 */ + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 245, -1, -1, -1, -1, -1, 247, 248, + 251, 252, 253, 254, 255, 256, 259, 262, + 263, 265, -1, 266, 267, 268, 269, 270, + -1, -1, 271, 273, -1, -1, 275, -1, + -1, 276, 279, -1, -1, 282, -1, 283, + -1, -1, -1, -1, 284, -1, -1, -1, + 285, -1, 286, -1, -1, -1, -1, 287, + 288, -1, -1, -1, -1, -1, 289, -1, + -1, -1, -1, 290, 295, -1, -1, -1, + -1, 296, -1, 298, 301, -1, 302, -1, + 303, -1, -1, 307, -1, 308, -1, -1, + -1, -1, 309, -1, -1, -1, -1, -1, + -1, 310, -1, -1, -1, 312, -1, 314, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, -1, + -1, -1, -1, -1, 319, -1, 323, -1, + 324, -1, -1, -1, -1, -1, 325, -1, + -1, -1, -1, -1, -1, -1, -1, 326, + 328, 329, -1, 331, -1, 332, 333, 335, + 336, 337, 338, 339, 340, 341, -1, 343, + -1, -1, -1, -1, -1, -1, 344, 345, + -1, -1, -1, -1, -1, 346, -1, -1, + -1, 347, 348, -1, -1, -1, -1, 349, + -1, -1, 350, -1, 351, -1, 352, -1, + -1, -1, -1, -1, 353, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, + 357, 358, 359, 360, -1, 361, 362, -1, + 363, 364, 365, 366, -1, 367, 369, -1, + -1, 371, 372, -1, -1, -1, -1, -1, + -1, -1, -1, 374, 378, 380, -1, -1, + /* 0x5000 */ + 382, -1, 383, 385, -1, 388, 389, -1, + 390, 391, 393, 394, -1, -1, 397, 398, + 399, 400, -1, -1, -1, -1, 401, -1, + -1, -1, -1, -1, -1, -1, 402, 403, + -1, -1, -1, 405, 407, -1, 408, -1, + -1, -1, -1, 410, -1, -1, -1, -1, + -1, -1, -1, 411, -1, -1, 412, -1, + -1, 413, 415, -1, 416, -1, 417, -1, + 418, -1, -1, -1, -1, -1, 419, 420, + -1, 421, -1, -1, -1, -1, -1, -1, + 422, -1, -1, -1, -1, -1, -1, -1, + 425, 426, 427, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 428, -1, -1, + -1, -1, 429, -1, 430, -1, -1, -1, + -1, -1, -1, -1, 432, 433, -1, 435, + 436, 437, 441, 444, -1, 445, 447, 448, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 449, 452, -1, -1, + -1, 453, -1, -1, -1, -1, 454, -1, + 455, 458, 462, -1, 464, -1, -1, -1, + 465, 467, 470, -1, 471, 472, -1, 473, + 474, 475, -1, -1, -1, 476, -1, 477, + -1, -1, -1, 478, 480, 481, -1, 482, + -1, 483, -1, -1, -1, -1, 484, -1, + 485, -1, 486, 487, 491, 492, -1, -1, + -1, 493, 494, -1, -1, 495, -1, -1, + -1, 498, -1, -1, -1, 499, -1, -1, + 500, -1, -1, -1, 501, -1, 502, 504, + -1, -1, -1, 505, -1, 506, -1, -1, + 507, 508, -1, 509, -1, 512, -1, -1, + -1, 513, 514, -1, 515, -1, -1, -1, + -1, 516, -1, -1, -1, -1, -1, -1, + /* 0x5100 */ + 518, 519, 520, -1, 521, -1, -1, -1, + 522, 523, -1, -1, -1, -1, 525, -1, + 526, -1, -1, -1, 527, 528, -1, -1, + 529, -1, -1, -1, -1, -1, 531, 534, + -1, -1, -1, -1, -1, -1, -1, 535, + -1, -1, 536, -1, -1, -1, -1, -1, + -1, -1, 537, -1, -1, -1, -1, 538, + -1, 539, 540, 541, 542, -1, -1, 543, + -1, -1, 545, -1, -1, -1, -1, 546, + -1, 547, 549, 551, 554, -1, 556, 557, + 561, 563, 565, -1, 567, -1, 568, 569, + 570, -1, 572, -1, 573, -1, -1, -1, + 574, -1, -1, -1, 575, -1, 576, 578, + -1, 579, 581, -1, -1, -1, -1, -1, + 582, -1, 583, 586, 591, -1, 592, -1, + -1, 593, -1, 595, -1, 597, 599, -1, + 600, 601, 602, 603, 604, 605, 606, -1, + 609, 610, 611, 613, 614, -1, 616, 618, + 619, 620, 621, -1, -1, -1, -1, 622, + -1, 623, -1, 625, 626, 627, -1, -1, + -1, -1, 629, 630, 631, -1, 632, -1, + 634, 635, 637, 639, 642, -1, -1, 644, + 645, 648, 649, 651, 652, 653, -1, -1, + -1, -1, 654, 655, -1, 656, -1, -1, + 657, -1, 659, 660, 661, 664, 665, -1, + 667, 668, -1, -1, -1, 669, -1, 670, + -1, 671, 672, 673, -1, -1, 674, -1, + -1, -1, -1, 676, 678, -1, 680, -1, + 684, 686, 688, 690, 692, 693, 694, -1, + 696, -1, -1, 701, 702, 707, 710, 715, + -1, 716, 717, 722, 723, -1, 726, 727, + -1, -1, 730, 732, -1, 734, 735, 736, + /* 0x5200 */ + 737, -1, 739, 741, 742, 743, -1, -1, + 745, -1, 747, -1, -1, 748, -1, -1, + -1, -1, 749, 752, 753, -1, -1, -1, + 754, 755, 756, 757, -1, -1, -1, -1, + 762, -1, -1, -1, -1, 763, 764, 767, + 770, -1, 773, 774, 776, 780, 781, -1, + -1, 782, -1, -1, 786, -1, 787, -1, + -1, 788, 789, -1, 790, 793, 794, 795, + 796, 797, 798, 800, 801, -1, -1, 802, + -1, -1, -1, 803, 806, 807, 808, 809, + 813, 815, -1, -1, -1, -1, -1, 823, + -1, 827, 831, 832, -1, 833, -1, -1, + -1, -1, -1, 834, 842, 844, 845, 847, + -1, 848, -1, -1, -1, -1, 849, -1, + 852, 853, -1, 861, 862, 863, -1, 868, + -1, 872, -1, -1, -1, -1, -1, 873, + -1, -1, -1, 874, 877, -1, -1, 878, + -1, 879, 880, -1, 881, 882, 890, -1, + 898, 901, 903, -1, 911, 919, -1, -1, + -1, -1, -1, -1, -1, 921, 923, 924, + -1, 926, 927, -1, -1, -1, -1, -1, + 928, -1, 931, 932, -1, -1, -1, -1, + -1, 935, 936, 937, 940, 943, -1, -1, + -1, 945, -1, -1, -1, -1, -1, 946, + -1, 947, -1, -1, 948, 949, -1, 951, + 952, -1, 953, 956, 959, -1, -1, -1, + -1, 961, -1, -1, -1, 965, 968, 970, + -1, 972, 973, 974, -1, 977, 978, -1, + 981, -1, 982, -1, 983, -1, 984, 985, + -1, 987, -1, -1, -1, -1, -1, -1, + -1, 988, 989, 992, -1, 995, -1, -1, + 996, -1, -1, 998, -1, -1, -1, -1, + /* 0x5300 */ + 999, -1, -1, 1000, 1002, 1004, 1005, -1, + -1, -1, 1008, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 1009, -1, 1011, 1012, -1, 1014, 1016, -1, + 1017, 1018, -1, -1, -1, -1, 1019, 1020, + 1021, 1023, -1, -1, -1, 1024, 1025, 1026, + -1, 1028, 1029, 1032, -1, -1, -1, -1, + 1035, -1, 1036, 1037, -1, -1, -1, -1, + 1039, -1, -1, 1040, -1, -1, 1041, 1042, + -1, 1046, -1, 1047, -1, 1049, 1050, 1053, + 1056, -1, 1057, 1058, 1060, 1063, 1065, -1, + 1067, -1, 1069, 1070, 1071, -1, -1, -1, + 1073, -1, 1074, -1, 1075, 1082, -1, 1084, + -1, -1, -1, 1085, -1, -1, 1087, 1088, + 1090, -1, -1, 1091, 1093, -1, -1, 1094, + 1096, 1097, -1, 1099, -1, 1100, -1, -1, + -1, -1, 1102, -1, 1105, 1106, 1108, 1114, + 1115, 1116, -1, 1117, 1119, 1120, 1121, -1, + 1122, -1, -1, 1123, -1, 1124, -1, -1, + 1126, 1130, 1131, 1132, -1, -1, -1, 1133, + 1134, 1136, 1137, 1138, 1139, -1, 1141, -1, + 1142, 1143, -1, -1, -1, 1145, 1146, 1147, + 1152, -1, 1154, 1155, 1157, 1158, 1159, 1160, + 1161, -1, 1164, 1165, -1, -1, 1166, 1168, + -1, 1170, 1172, 1175, 1178, 1181, 1184, 1185, + 1186, 1187, 1188, -1, 1189, 1190, 1193, 1194, + 1195, 1196, -1, 1200, -1, 1202, -1, -1, + 1203, 1205, -1, 1207, -1, -1, 1209, -1, + 1210, 1214, 1216, -1, -1, -1, -1, 1220, + -1, -1, 1223, 1226, -1, -1, -1, -1, + 1227, -1, -1, -1, -1, -1, 1232, 1236, + -1, 1237, -1, -1, -1, 1240, -1, -1, + /* 0x5400 */ + 1241, 1243, -1, 1245, -1, -1, -1, -1, + 1247, -1, 1248, -1, 1249, -1, 1251, -1, + -1, 1252, -1, 1254, -1, 1255, -1, 1256, + -1, -1, -1, -1, -1, 1257, 1258, 1259, + -1, -1, -1, -1, -1, -1, -1, -1, + 1262, -1, -1, -1, 1263, -1, -1, 1265, + -1, -1, -1, 1271, 1273, -1, 1275, -1, + -1, -1, -1, 1276, -1, 1277, -1, 1278, + -1, -1, 1279, -1, -1, -1, -1, -1, + 1280, 1282, 1284, -1, 1285, 1286, -1, -1, + 1287, 1288, 1289, 1290, -1, 1291, 1292, 1293, + 1294, 1297, 1299, 1300, 1301, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1302, + 1303, 1304, 1305, -1, -1, 1307, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1308, -1, -1, -1, + -1, -1, -1, -1, -1, 1311, -1, -1, + -1, -1, 1312, -1, 1315, -1, -1, 1318, + -1, -1, 1319, -1, -1, -1, -1, -1, + -1, 1321, -1, 1322, 1323, 1324, -1, -1, + -1, -1, -1, -1, 1325, -1, -1, -1, + -1, 1326, -1, -1, 1328, -1, -1, 1329, + -1, 1331, 1334, -1, -1, -1, -1, -1, + 1336, -1, -1, -1, 1338, 1340, -1, -1, + -1, -1, -1, -1, 1341, -1, -1, -1, + -1, -1, -1, -1, -1, 1343, -1, -1, + -1, 1344, 1348, 1349, 1350, 1351, -1, 1352, + -1, 1354, -1, -1, 1355, 1356, -1, 1357, + -1, 1358, -1, 1361, -1, -1, -1, -1, + -1, -1, -1, -1, 1362, -1, -1, -1, + -1, -1, 1363, -1, -1, -1, 1368, -1, + -1, -1, 1370, -1, -1, -1, -1, -1, + /* 0x5500 */ + 1371, -1, -1, -1, 1373, -1, -1, 1374, + -1, -1, -1, -1, -1, 1375, -1, -1, + 1376, -1, -1, -1, -1, 1377, 1378, -1, + 1382, -1, -1, 1388, -1, 1389, -1, -1, + 1390, -1, 1391, 1392, 1393, -1, -1, 1394, + -1, -1, -1, 1395, -1, -1, -1, -1, + -1, 1396, -1, -1, -1, -1, -1, -1, + 1397, -1, -1, -1, -1, -1, -1, -1, + 1398, -1, -1, -1, -1, -1, 1399, -1, + -1, -1, -1, -1, -1, -1, -1, 1400, + -1, -1, -1, 1401, 1407, -1, 1413, 1414, + -1, -1, -1, -1, -1, -1, 1415, 1419, + 1425, -1, -1, 1430, -1, -1, -1, 1433, + -1, -1, -1, -1, 1434, 1435, 1436, 1440, + 1441, -1, -1, -1, 1443, -1, -1, -1, + 1444, -1, 1445, -1, -1, -1, -1, -1, + 1446, -1, 1448, -1, 1450, -1, 1451, -1, + -1, -1, -1, -1, -1, -1, 1456, -1, + -1, 1458, 1460, -1, -1, -1, -1, -1, + -1, -1, 1463, -1, 1464, -1, 1467, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1468, 1469, 1470, 1472, -1, 1473, 1475, + 1477, -1, 1480, -1, -1, -1, 1481, 1483, + -1, -1, -1, 1485, -1, 1486, 1487, -1, + -1, -1, -1, -1, -1, 1488, 1489, 1490, + -1, -1, 1491, -1, -1, -1, 1492, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1493, -1, 1494, -1, -1, -1, + 1495, -1, -1, 1496, -1, 1497, -1, -1, + -1, 1498, -1, 1499, -1, -1, -1, -1, + -1, -1, -1, 1500, -1, -1, 1501, -1, + -1, 1502, -1, -1, -1, -1, -1, -1, + /* 0x5600 */ + -1, -1, -1, -1, -1, -1, 1503, -1, + -1, -1, 1505, -1, -1, 1506, -1, -1, + -1, 1507, -1, 1509, 1510, -1, 1511, 1512, + 1515, -1, -1, -1, 1516, -1, -1, -1, + -1, -1, -1, -1, 1517, -1, -1, -1, + 1518, 1519, -1, -1, -1, -1, 1521, 1522, + 1524, 1525, -1, -1, -1, 1526, -1, 1527, + 1528, -1, -1, -1, -1, 1529, -1, -1, + -1, 1530, 1531, -1, 1532, 1534, -1, -1, + -1, 1535, -1, -1, -1, -1, -1, -1, + 1537, -1, -1, 1538, -1, 1539, 1540, -1, + -1, -1, -1, 1542, 1544, 1545, -1, -1, + 1546, 1547, -1, -1, -1, 1548, 1549, -1, + 1550, -1, 1551, -1, -1, -1, -1, 1552, + -1, -1, 1553, -1, 1554, 1556, -1, -1, + 1559, 1560, -1, -1, -1, -1, 1561, -1, + 1562, -1, -1, -1, -1, -1, -1, 1563, + -1, -1, -1, -1, 1564, -1, -1, 1565, + 1566, -1, -1, -1, 1569, 1570, -1, -1, + -1, 1571, -1, -1, -1, -1, 1575, -1, + 1580, -1, 1581, 1582, -1, 1583, 1584, -1, + 1585, -1, -1, -1, -1, -1, 1586, -1, + -1, -1, 1587, 1588, 1589, -1, 1591, -1, + -1, -1, -1, 1592, -1, -1, -1, -1, + 1593, 1594, 1595, -1, -1, 1597, -1, -1, + 1598, 1599, 1601, -1, 1602, -1, -1, 1603, + -1, 1604, -1, 1605, -1, -1, -1, 1608, + 1611, 1617, -1, 1618, -1, -1, 1619, 1625, + 1626, -1, 1627, 1630, -1, -1, 1633, 1636, + -1, -1, 1637, -1, 1638, 1644, -1, 1647, + 1652, 1653, 1654, 1657, 1660, 1663, 1664, -1, + 1669, -1, -1, 1670, -1, 1675, 1680, -1, + /* 0x5700 */ + 1683, -1, -1, 1688, -1, -1, 1689, 1692, + 1693, -1, -1, 1694, -1, 1699, 1702, 1705, + -1, 1706, 1707, 1709, -1, -1, 1712, 1715, + 1718, -1, -1, -1, -1, 1720, -1, 1722, + -1, 1723, 1724, 1726, -1, -1, -1, 1727, + 1729, -1, -1, -1, 1730, 1731, -1, -1, + 1732, -1, -1, -1, -1, -1, -1, -1, + -1, 1735, 1736, -1, -1, 1738, -1, -1, + 1742, -1, 1743, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1745, + 1749, 1750, -1, 1751, 1752, -1, -1, 1755, + -1, 1758, 1759, 1760, 1766, 1767, 1769, 1771, + 1773, -1, -1, 1775, 1776, -1, 1777, 1778, + 1779, -1, -1, -1, -1, 1781, 1782, 1784, + 1786, -1, -1, 1787, -1, 1788, -1, -1, + 1790, -1, 1791, -1, -1, -1, -1, -1, + -1, -1, 1792, -1, 1793, 1794, 1795, 1796, + -1, -1, -1, 1797, -1, -1, -1, -1, + -1, -1, 1798, 1800, 1801, 1802, 1803, -1, + -1, -1, 1804, 1807, 1808, -1, -1, -1, + -1, 1809, 1810, -1, -1, -1, 1811, 1812, + 1813, 1814, -1, 1816, -1, 1817, -1, 1818, + -1, 1819, 1820, -1, 1821, -1, -1, -1, + -1, -1, -1, 1822, -1, -1, -1, -1, + 1824, -1, -1, -1, -1, -1, 1825, -1, + 1826, -1, 1827, -1, -1, -1, -1, -1, + -1, 1830, 1835, 1836, -1, -1, -1, -1, + 1837, 1838, 1840, -1, 1841, -1, 1843, -1, + -1, 1845, -1, -1, -1, -1, 1846, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1847, + -1, -1, -1, -1, 1848, 1851, -1, -1, + /* 0x5800 */ + -1, -1, 1852, 1853, -1, 1854, 1855, 1856, + -1, -1, 1857, -1, -1, -1, -1, -1, + -1, 1858, -1, -1, -1, 1859, 1861, -1, + -1, 1862, -1, -1, -1, 1863, -1, -1, + -1, -1, -1, -1, 1864, -1, 1866, -1, + -1, -1, -1, -1, -1, -1, -1, 1868, + 1871, 1873, -1, -1, 1874, -1, -1, -1, + -1, -1, 1876, -1, -1, -1, -1, -1, + -1, 1878, -1, -1, -1, -1, 1880, -1, + -1, -1, 1881, 1884, -1, 1885, -1, 1886, + 1887, 1888, 1889, -1, 1890, -1, -1, 1891, + -1, 1892, 1893, -1, -1, -1, -1, 1894, + -1, 1895, 1896, -1, 1897, -1, 1899, -1, + -1, 1900, -1, 1902, -1, -1, -1, -1, + -1, -1, 1903, -1, -1, 1905, -1, 1906, + -1, 1908, -1, -1, 1910, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1913, 1914, -1, 1915, -1, -1, -1, + -1, -1, -1, -1, -1, 1916, 1918, 1919, + -1, 1920, -1, -1, 1922, -1, 1924, -1, + -1, -1, 1925, -1, 1927, -1, -1, 1930, + -1, -1, -1, -1, -1, -1, 1931, 1933, + 1935, -1, -1, 1940, -1, 1942, 1947, -1, + 1948, -1, -1, 1949, -1, -1, 1950, -1, + -1, -1, -1, -1, 1951, -1, -1, 1953, + -1, -1, 1954, 1956, 1957, 1958, 1959, -1, + 1961, -1, -1, 1962, -1, -1, -1, -1, + 1964, 1966, 1967, -1, 1968, -1, 1973, 1975, + 1976, 1977, 1979, -1, 1980, 1981, -1, -1, + -1, 1984, 1986, -1, -1, -1, 1987, 1989, + 1991, 1992, 1993, 1995, -1, 1997, 1999, 2001, + 2003, 2004, 2005, 2007, 2009, 2010, -1, -1, + /* 0x5900 */ + 2012, -1, 2014, -1, 2015, 2017, -1, 2018, + -1, 2022, 2024, -1, -1, 2025, -1, 2028, + -1, -1, -1, 2029, 2030, -1, -1, -1, + 2031, -1, 2033, 2034, 2035, -1, -1, 2036, + 2037, -1, 2038, 2040, -1, 2042, -1, -1, + -1, 2043, -1, -1, 2046, 2047, -1, -1, + -1, -1, 2048, 2050, 2051, -1, 2052, -1, + 2053, 2054, 2055, -1, -1, -1, 2056, -1, + -1, 2057, 2060, -1, -1, -1, -1, 2061, + 2062, -1, -1, 2063, 2064, -1, -1, -1, + 2065, -1, -1, -1, 2066, -1, 2068, -1, + 2071, 2072, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2073, -1, 2075, + 2077, 2080, 2083, -1, 2084, -1, 2087, -1, + -1, -1, -1, -1, -1, -1, 2088, -1, + 2090, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2092, 2096, + 2098, -1, 2099, -1, -1, 2100, -1, -1, + -1, -1, 2102, -1, -1, -1, 2103, -1, + -1, 2104, -1, 2105, -1, 2106, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2110, 2111, 2112, 2114, -1, -1, -1, + -1, -1, -1, 2115, -1, -1, -1, 2118, + 2120, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2122, -1, + -1, 2123, 2124, 2125, -1, 2127, -1, -1, + 2128, -1, 2129, -1, -1, -1, -1, 2130, + -1, 2131, -1, -1, 2132, -1, -1, -1, + -1, -1, 2133, -1, -1, -1, 2134, 2136, + -1, -1, 2138, 2140, 2141, -1, 2142, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2143, -1, -1, 2145, -1, -1, -1, -1, + /* 0x5a00 */ + -1, -1, -1, -1, 2146, 2147, 2148, 2149, + 2150, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2151, -1, -1, -1, -1, -1, + 2152, -1, -1, 2154, -1, -1, -1, 2156, + -1, -1, -1, -1, 2157, -1, 2161, -1, + -1, -1, -1, -1, -1, 2162, -1, 2163, + 2165, 2166, 2168, -1, 2169, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2171, + 2173, 2176, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2177, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2178, -1, -1, 2179, -1, + -1, -1, -1, -1, 2181, 2182, -1, 2183, + -1, -1, -1, 2185, 2186, 2189, 2190, -1, + -1, -1, -1, -1, -1, -1, -1, 2191, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2193, 2195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2196, + -1, -1, 2197, -1, -1, 2198, -1, 2199, + -1, -1, -1, -1, -1, -1, -1, -1, + 2201, -1, -1, -1, 2202, 2203, -1, 2204, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2206, -1, -1, -1, -1, + 2208, -1, 2209, -1, 2210, -1, -1, 2211, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2212, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2213, -1, -1, -1, 2214, 2215, -1, + -1, -1, 2217, 2219, -1, -1, -1, 2221, + /* 0x5b00 */ + 2222, -1, -1, 2224, -1, -1, -1, -1, + 2225, 2226, -1, 2227, 2228, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2229, -1, -1, -1, 2230, -1, -1, + -1, 2232, 2233, -1, 2235, -1, -1, -1, + -1, -1, 2236, -1, -1, 2238, -1, -1, + 2240, -1, 2243, -1, -1, -1, -1, 2244, + 2245, -1, -1, -1, -1, -1, 2246, -1, + -1, -1, -1, 2247, -1, -1, 2249, -1, + -1, -1, -1, -1, 2252, -1, -1, -1, + -1, -1, 2253, 2254, -1, -1, -1, -1, + -1, 2255, -1, -1, -1, -1, -1, -1, + 2256, -1, -1, -1, -1, -1, 2257, -1, + -1, -1, 2262, 2263, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2264, -1, -1, -1, 2269, 2270, 2271, 2274, + -1, 2275, 2281, 2282, -1, -1, 2285, -1, + 2286, -1, 2287, -1, -1, 2288, -1, -1, + 2289, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2291, 2293, 2297, 2299, + 2301, 2302, -1, -1, -1, -1, -1, -1, + -1, 2304, 2305, 2306, -1, -1, 2307, -1, + -1, -1, -1, -1, 2308, -1, 2310, 2311, + -1, -1, -1, 2313, 2314, 2316, 2318, -1, + 2320, -1, -1, 2321, -1, -1, 2322, 2323, + 2325, 2327, -1, -1, 2334, 2335, -1, -1, + -1, -1, -1, 2341, -1, 2342, -1, 2348, + -1, -1, 2354, 2358, 2360, 2366, -1, 2367, + 2368, -1, 2370, -1, -1, -1, 2371, 2373, + -1, 2379, -1, 2381, 2383, -1, -1, -1, + -1, -1, -1, 2385, -1, 2389, 2390, -1, + -1, 2394, -1, 2396, 2397, -1, 2398, 2400, + /* 0x5c00 */ + -1, -1, 2402, -1, -1, 2404, 2407, 2408, + 2409, 2411, -1, 2412, -1, 2413, 2415, -1, + -1, -1, 2416, 2419, 2422, -1, -1, -1, + 2425, 2426, 2427, 2428, -1, 2432, 2435, 2436, + 2441, -1, 2446, 2449, 2450, 2452, 2453, 2454, + -1, 2457, -1, 2458, 2459, 2460, -1, -1, + -1, -1, 2463, -1, 2468, -1, 2473, 2478, + 2483, -1, -1, -1, -1, 2484, -1, -1, + 2487, -1, 2489, 2490, -1, 2491, 2492, -1, + -1, -1, 2493, -1, 2494, 2496, 2497, 2498, + -1, -1, -1, 2500, -1, -1, -1, -1, + -1, -1, -1, 2501, -1, -1, 2503, -1, + -1, 2504, 2505, -1, 2506, -1, 2507, -1, + 2508, -1, -1, -1, 2509, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2510, + 2511, 2512, 2516, -1, -1, 2517, -1, -1, + 2519, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2520, 2521, + 2522, -1, 2523, 2524, -1, -1, -1, -1, + -1, 2531, -1, -1, -1, -1, -1, -1, + -1, 2532, -1, -1, -1, 2538, -1, -1, + -1, -1, -1, 2539, 2540, -1, -1, -1, + -1, -1, -1, -1, -1, 2541, -1, 2542, + -1, -1, -1, 2543, 2544, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2545, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2546, -1, -1, + -1, 2547, -1, 2548, 2549, 2550, 2551, -1, + 2552, 2553, -1, -1, -1, -1, -1, 2554, + 2555, -1, -1, -1, 2556, 2557, 2560, -1, + -1, -1, -1, -1, -1, 2567, -1, -1, + /* 0x5d00 */ + -1, -1, 2568, 2569, 2570, -1, -1, 2571, + 2572, -1, -1, 2573, -1, 2575, 2576, -1, + -1, -1, -1, -1, -1, -1, 2579, 2580, + 2581, 2583, -1, -1, -1, -1, -1, -1, + -1, -1, 2585, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2586, 2587, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2589, -1, -1, -1, + 2590, -1, 2591, 2594, -1, -1, -1, 2597, + 2601, -1, 2604, -1, 2605, 2608, -1, -1, + 2609, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2611, + -1, -1, -1, 2612, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2613, -1, 2614, 2615, -1, -1, 2616, + -1, -1, -1, 2618, 2625, -1, -1, -1, + -1, -1, -1, -1, 2632, -1, -1, 2633, + -1, -1, -1, -1, -1, -1, -1, -1, + 2634, -1, 2635, -1, -1, -1, -1, 2636, + 2637, -1, -1, -1, -1, -1, 2638, -1, + -1, -1, 2639, 2640, 2643, -1, -1, -1, + 2645, 2648, 2655, -1, 2656, 2657, -1, -1, + -1, -1, -1, -1, -1, 2658, 2660, -1, + -1, -1, -1, 2663, 2664, -1, -1, -1, + -1, -1, 2667, 2668, 2669, -1, 2670, 2673, + -1, -1, -1, 2676, -1, 2677, -1, -1, + 2678, -1, 2679, 2680, -1, -1, -1, -1, + -1, 2681, -1, -1, -1, -1, -1, 2682, + 2683, -1, -1, -1, -1, 2684, -1, 2685, + -1, -1, 2686, 2687, -1, 2689, -1, 2690, + /* 0x5e00 */ + 2692, 2694, -1, 2697, -1, 2698, -1, -1, + 2699, -1, -1, 2700, -1, -1, -1, 2701, + 2702, 2703, 2704, -1, -1, 2705, -1, -1, + 2706, -1, 2707, -1, 2708, -1, -1, -1, + -1, -1, -1, -1, -1, 2710, 2711, 2713, + -1, -1, -1, 2714, -1, 2715, 2716, 2719, + 2721, 2724, -1, 2725, -1, -1, 2726, -1, + -1, -1, -1, 2728, 2729, 2730, -1, -1, + 2731, -1, 2732, 2734, -1, -1, -1, 2735, + 2738, -1, -1, -1, 2740, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2741, + 2742, -1, 2743, -1, -1, -1, -1, 2746, + -1, 2748, -1, 2749, 2751, -1, -1, -1, + -1, -1, -1, 2753, 2756, -1, -1, -1, + -1, -1, 2757, -1, 2760, -1, 2761, 2767, + 2768, 2769, 2771, -1, -1, -1, 2772, 2773, + -1, 2776, -1, 2778, 2780, 2782, 2786, -1, + -1, -1, 2787, -1, -1, -1, -1, -1, + 2788, 2789, -1, 2790, 2791, -1, -1, -1, + -1, 2793, -1, -1, -1, -1, 2794, 2795, + -1, -1, -1, -1, -1, -1, -1, 2797, + -1, -1, -1, 2798, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2799, 2803, -1, + -1, -1, 2804, 2809, 2810, 2811, -1, 2812, + -1, 2813, 2815, 2816, -1, -1, -1, -1, + 2818, -1, -1, -1, -1, -1, 2819, 2820, + 2822, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2824, 2825, -1, 2828, -1, 2829, + 2831, 2833, 2834, 2836, -1, -1, -1, -1, + -1, 2838, 2839, -1, 2840, -1, -1, -1, + 2841, -1, -1, 2844, -1, -1, -1, -1, + 2848, -1, -1, 2849, 2855, 2857, -1, -1, + /* 0x5f00 */ + 2863, 2864, 2871, 2872, 2873, -1, -1, -1, + -1, 2875, -1, -1, 2876, 2877, 2878, -1, + 2880, 2883, 2884, -1, 2885, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2886, -1, -1, -1, -1, 2887, 2889, -1, + -1, -1, 2890, -1, -1, -1, -1, 2891, + -1, -1, -1, 2892, -1, 2893, -1, 2894, + -1, 2895, 2897, 2898, 2899, -1, 2900, -1, + -1, -1, -1, -1, -1, -1, 2902, -1, + 2903, -1, -1, -1, 2905, -1, 2906, -1, + 2907, 2908, 2909, 2912, 2914, 2915, -1, 2918, + -1, 2919, 2921, 2923, 2926, 2929, 2932, 2935, + 2936, -1, -1, -1, -1, 2938, 2939, -1, + 2940, 2941, -1, 2942, 2943, -1, -1, -1, + -1, -1, 2945, -1, 2946, -1, -1, 2947, + -1, -1, -1, 2950, -1, -1, -1, 2951, + 2953, 2955, -1, 2958, 2959, -1, -1, 2962, + 2963, -1, 2964, -1, 2965, -1, -1, 2966, + -1, 2967, -1, 2970, -1, 2972, -1, -1, + -1, -1, -1, -1, -1, -1, 2974, -1, + 2976, 2978, -1, 2979, 2981, -1, -1, -1, + -1, 2982, -1, -1, 2984, 2987, -1, -1, + 2988, 2989, -1, 2990, 2993, 2995, -1, 2997, + -1, 3000, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3001, 3002, -1, 3003, -1, + -1, -1, -1, -1, -1, -1, 3004, 3005, + -1, -1, -1, -1, -1, -1, -1, 3007, + -1, 3008, -1, -1, 3009, -1, -1, -1, + -1, -1, 3011, 3012, -1, -1, -1, 3013, + -1, 3014, -1, -1, -1, -1, -1, -1, + 3017, -1, -1, -1, -1, 3018, -1, -1, + -1, -1, -1, -1, -1, -1, 3019, -1, + /* 0x6000 */ + 3020, 3022, 3023, 3024, 3025, 3026, 3027, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3028, -1, 3029, -1, + -1, -1, -1, -1, 3030, 3031, -1, -1, + -1, -1, -1, 3032, -1, 3034, -1, -1, + -1, -1, 3035, -1, -1, -1, -1, -1, + -1, 3036, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3039, 3044, -1, -1, 3045, + -1, -1, -1, -1, -1, -1, 3046, -1, + -1, -1, -1, 3047, -1, -1, -1, -1, + -1, -1, 3048, 3049, -1, -1, 3051, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3052, 3053, -1, -1, 3055, 3057, -1, -1, + -1, -1, 3058, -1, -1, -1, -1, -1, + -1, 3059, -1, 3061, 3062, 3065, 3066, -1, + 3070, 3071, 3072, 3073, 3074, 3076, 3077, 3078, + 3080, -1, -1, -1, -1, 3082, -1, -1, + -1, -1, 3084, 3089, -1, 3090, -1, -1, + -1, 3091, -1, 3092, -1, -1, 3093, -1, + -1, -1, -1, -1, -1, -1, 3095, 3096, + -1, -1, 3097, -1, 3098, -1, 3101, -1, + -1, 3103, 3105, 3108, 3109, 3110, -1, 3111, + -1, -1, -1, 3112, 3115, 3116, 3117, -1, + -1, -1, -1, -1, -1, 3118, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3120, -1, -1, -1, -1, -1, + -1, -1, 3122, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3125, -1, + 3127, 3128, -1, 3131, -1, 3132, -1, 3134, + 3135, 3136, -1, 3137, 3138, 3139, 3141, 3142, + -1, 3143, 3145, -1, -1, -1, -1, 3146, + -1, -1, -1, 3147, 3148, -1, -1, -1, + /* 0x6100 */ + -1, -1, 3149, -1, -1, -1, -1, -1, + 3151, -1, -1, -1, -1, -1, -1, -1, + -1, 3153, -1, -1, -1, -1, -1, -1, + -1, 3155, -1, 3156, 3157, -1, -1, -1, + 3158, 3159, -1, -1, 3160, -1, 3161, 3162, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3164, 3165, -1, -1, 3166, + -1, 3167, -1, -1, 3169, 3170, 3171, 3172, + -1, -1, 3173, -1, 3175, -1, -1, 3176, + -1, -1, -1, 3177, -1, 3178, 3179, -1, + -1, 3182, -1, -1, -1, -1, -1, -1, + 3184, 3185, 3187, -1, -1, -1, -1, 3189, + -1, -1, -1, 3191, 3192, -1, -1, -1, + -1, -1, 3193, 3194, -1, 3195, 3196, -1, + -1, -1, -1, 3197, 3198, -1, 3199, -1, + -1, -1, -1, -1, 3200, 3202, 3204, 3205, + -1, 3208, 3209, -1, -1, 3210, -1, 3211, + -1, -1, 3212, -1, -1, -1, -1, -1, + 3213, 3214, 3217, -1, 3218, -1, 3220, 3222, + 3223, 3226, 3229, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3230, 3231, -1, -1, + -1, 3234, -1, 3235, -1, -1, 3236, -1, + -1, -1, 3237, -1, -1, -1, 3238, -1, + -1, -1, -1, 3239, -1, -1, -1, -1, + -1, -1, -1, 3240, -1, -1, -1, 3241, + -1, 3242, -1, -1, 3244, 3245, -1, -1, + 3246, 3248, 3249, -1, 3251, -1, -1, -1, + -1, -1, -1, -1, 3252, -1, 3253, 3254, + -1, -1, -1, 3255, -1, -1, 3256, 3257, + 3258, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3259, -1, 3260, 3262, 3263, 3264, + 3266, -1, 3267, -1, 3268, 3270, 3271, 3272, + /* 0x6200 */ + 3273, -1, -1, -1, -1, -1, 3274, 3275, + -1, -1, -1, 3276, -1, -1, -1, 3277, + -1, -1, -1, -1, 3279, -1, -1, 3280, + 3281, -1, 3283, 3285, -1, 3286, 3288, -1, + -1, -1, -1, -1, -1, -1, 3289, 3291, + -1, 3292, -1, -1, 3293, -1, 3294, 3296, + 3298, -1, 3300, -1, -1, -1, 3302, 3304, + 3306, 3308, -1, 3309, 3310, -1, 3312, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3313, 3314, 3315, 3316, -1, + -1, 3318, -1, -1, -1, 3320, -1, 3321, + 3322, -1, -1, -1, -1, -1, 3324, -1, + 3325, -1, -1, 3326, -1, -1, -1, 3327, + 3328, 3330, 3332, 3333, 3334, -1, -1, 3335, + 3336, -1, -1, -1, -1, 3337, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3338, -1, -1, -1, -1, -1, + -1, 3340, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3341, 3342, 3343, 3344, 3345, 3347, + 3348, 3349, 3350, -1, 3351, 3352, -1, -1, + -1, -1, -1, -1, 3353, -1, -1, -1, + -1, -1, -1, -1, -1, 3354, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3357, -1, -1, 3358, -1, -1, + 3359, -1, -1, 3360, -1, -1, -1, 3361, + 3362, -1, -1, 3364, 3365, 3366, 3367, 3368, + -1, -1, -1, -1, 3369, 3370, 3371, 3372, + 3373, 3375, 3378, 3379, -1, 3380, 3381, 3382, + 3383, 3385, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3387, + /* 0x6300 */ + -1, -1, 3388, -1, 3389, -1, -1, -1, + -1, -1, 3391, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3393, 3396, 3397, 3398, 3399, 3400, 3401, + 3402, 3403, 3404, 3405, 3406, 3407, 3408, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3409, -1, 3411, + -1, -1, -1, -1, -1, 3412, 3413, 3414, + -1, 3415, -1, -1, -1, -1, 3418, -1, + -1, -1, -1, -1, -1, 3421, -1, 3422, + -1, -1, -1, -1, -1, -1, -1, 3423, + -1, -1, -1, -1, 3424, -1, 3425, 3426, + -1, 3427, 3428, 3429, -1, -1, -1, -1, + 3431, -1, -1, 3432, -1, -1, 3433, -1, + -1, -1, 3435, -1, 3437, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3438, + -1, -1, -1, 3440, 3442, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3443, + -1, 3444, -1, 3445, -1, -1, -1, -1, + -1, 3446, -1, -1, -1, 3447, -1, -1, + -1, -1, -1, -1, 3448, -1, -1, -1, + -1, -1, 3449, 3450, 3451, -1, -1, 3452, + 3453, -1, 3454, 3455, 3456, 3457, -1, -1, + 3458, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3459, 3460, -1, -1, -1, -1, -1, + -1, -1, 3461, 3462, -1, -1, -1, -1, + 3463, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3464, 3465, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3466, 3467, -1, -1, 3469, -1, 3470, + /* 0x6400 */ + 3471, 3472, 3473, 3474, -1, 3475, 3478, -1, + -1, -1, -1, -1, -1, 3479, -1, -1, + -1, -1, 3480, -1, 3481, -1, 3482, 3484, + -1, -1, -1, -1, 3485, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3487, -1, -1, -1, -1, 3488, -1, -1, + -1, -1, 3489, -1, -1, -1, 3490, -1, + -1, -1, 3491, -1, -1, -1, 3493, -1, + -1, -1, 3494, -1, 3496, 3498, 3499, 3501, + 3503, -1, 3504, -1, -1, -1, -1, -1, + -1, 3505, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3506, -1, -1, 3507, + 3508, -1, -1, -1, -1, -1, -1, -1, + -1, 3511, -1, -1, -1, -1, -1, 3512, + -1, -1, -1, 3513, -1, -1, 3514, -1, + -1, -1, -1, 3515, -1, -1, -1, -1, + -1, -1, -1, 3516, 3518, -1, -1, -1, + 3519, -1, -1, -1, -1, -1, -1, 3520, + 3521, 3522, -1, 3523, -1, -1, -1, -1, + 3524, -1, 3525, -1, -1, -1, -1, 3526, + -1, 3527, -1, 3528, -1, 3529, 3531, 3532, + -1, -1, -1, 3535, -1, -1, -1, -1, + -1, -1, 3536, 3538, -1, 3539, -1, 3540, + 3541, 3542, 3545, 3546, -1, -1, 3547, 3548, + -1, 3549, -1, -1, 3550, -1, -1, 3551, + 3553, -1, 3555, 3557, -1, 3558, -1, -1, + -1, 3559, -1, -1, 3560, 3561, -1, -1, + -1, -1, 3563, -1, -1, -1, 3565, -1, + 3566, 3567, -1, 3568, -1, 3569, -1, 3570, + -1, -1, -1, -1, 3573, -1, -1, 3574, + 3575, 3576, 3577, -1, 3578, 3581, -1, 3582, + -1, -1, 3584, 3585, 3586, 3587, 3588, -1, + /* 0x6500 */ + 3589, -1, -1, -1, 3590, 3591, 3592, -1, + 3593, -1, 3594, -1, -1, -1, -1, 3595, + -1, -1, 3596, -1, 3597, -1, 3598, -1, + -1, 3599, -1, 3600, 3601, 3603, -1, 3605, + -1, -1, 3606, 3608, 3609, -1, -1, -1, + 3610, -1, 3611, 3614, 3615, -1, -1, -1, + -1, -1, -1, -1, 3617, 3618, 3619, 3620, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3621, + 3625, 3628, -1, -1, 3629, 3630, 3632, 3633, + -1, -1, -1, -1, -1, 3634, -1, 3636, + 3638, 3640, -1, 3641, -1, -1, 3643, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3644, -1, -1, -1, -1, -1, -1, + 3649, -1, -1, -1, -1, 3650, -1, 3651, + 3652, -1, 3653, -1, -1, -1, -1, -1, + -1, 3657, 3658, 3660, -1, 3661, 3666, -1, + 3671, 3676, 3680, 3684, 3686, 3688, 3689, -1, + -1, -1, -1, 3691, 3692, 3694, -1, 3695, + -1, -1, -1, -1, -1, -1, 3700, 3702, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3703, -1, -1, 3704, 3705, -1, -1, + -1, -1, 3706, -1, -1, 3707, -1, 3708, + -1, -1, -1, -1, 3709, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3712, 3713, -1, -1, -1, -1, -1, -1, + -1, -1, 3714, -1, -1, -1, -1, 3715, + 3717, 3719, -1, 3721, -1, -1, -1, -1, + 3722, -1, -1, -1, -1, 3723, -1, 3724, + -1, -1, 3725, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3728, 3730, + 3733, 3734, 3736, -1, -1, -1, 3737, 3738, + /* 0x6600 */ + -1, -1, 3739, -1, -1, -1, -1, 3740, + -1, -1, 3742, -1, -1, -1, 3743, 3744, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3745, 3746, -1, -1, -1, -1, 3747, + -1, -1, -1, -1, -1, 3748, 3749, -1, + -1, -1, -1, -1, 3750, 3751, -1, 3752, + 3753, -1, -1, -1, -1, -1, -1, -1, + 3754, -1, -1, 3755, 3756, 3758, 3759, 3761, + -1, -1, 3763, 3765, 3766, -1, -1, -1, + -1, 3767, -1, 3768, -1, -1, -1, -1, + -1, -1, 3769, 3770, 3772, 3773, 3774, -1, + -1, -1, 3775, -1, -1, 3776, -1, 3778, + 3779, -1, -1, -1, 3780, -1, -1, -1, + 3781, 3782, -1, -1, -1, -1, 3783, -1, + -1, -1, -1, -1, 3784, -1, -1, -1, + -1, -1, -1, 3786, -1, -1, -1, -1, + 3787, 3788, 3790, 3791, -1, -1, -1, -1, + 3793, 3794, -1, -1, -1, -1, -1, -1, + -1, -1, 3795, -1, -1, -1, 3796, 3798, + 3803, -1, -1, -1, 3804, -1, -1, -1, + -1, -1, 3805, -1, 3806, -1, 3809, 3812, + 3813, -1, -1, 3814, -1, 3815, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3817, -1, -1, -1, -1, -1, -1, -1, + -1, 3819, -1, -1, 3820, -1, 3821, 3825, + -1, 3826, -1, -1, 3828, 3832, -1, 3833, + -1, -1, -1, -1, -1, -1, 3834, -1, + -1, -1, -1, -1, -1, -1, -1, 3835, + 3836, -1, -1, -1, -1, -1, -1, -1, + 3838, -1, -1, -1, 3839, -1, -1, -1, + -1, -1, 3840, 3845, -1, 3846, -1, -1, + 3847, 3850, 3851, 3852, -1, 3854, 3855, -1, + /* 0x6700 */ + 3856, -1, 3857, 3859, -1, -1, -1, 3860, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3861, 3862, + -1, 3863, -1, 3864, -1, -1, 3865, 3866, + -1, -1, 3867, -1, -1, -1, -1, 3868, + -1, -1, -1, -1, 3869, 3871, 3872, 3873, + -1, 3875, -1, -1, 3876, 3878, 3879, -1, + -1, -1, 3880, -1, -1, -1, -1, -1, + 3882, -1, 3883, 3886, -1, -1, 3888, 3889, + -1, 3890, -1, -1, -1, -1, -1, -1, + -1, 3893, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3894, 3895, -1, -1, 3896, 3897, 3898, -1, + 3899, 3900, -1, -1, -1, -1, -1, 3901, + 3903, 3904, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3905, 3911, + 3912, 3917, -1, -1, 3918, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3920, + -1, -1, 3921, -1, -1, -1, -1, -1, + -1, 3925, -1, -1, 3928, -1, 3929, -1, + -1, 3930, 3931, 3932, -1, 3933, 3934, 3935, + 3936, 3937, 3942, 3945, -1, 3946, -1, -1, + -1, 3947, -1, -1, 3950, -1, -1, -1, + -1, -1, -1, 3952, -1, -1, -1, -1, + -1, 3953, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3954, + -1, -1, -1, -1, -1, 3955, -1, 3956, + -1, -1, -1, -1, 3961, -1, -1, -1, + 3962, -1, -1, -1, -1, 3963, -1, -1, + -1, 3964, -1, -1, -1, -1, -1, -1, + 3966, -1, -1, 3967, -1, 3970, -1, -1, + -1, 3971, 3972, 3974, -1, 3975, 3976, 3978, + /* 0x6800 */ + 3979, 3980, -1, 3983, 3985, 3987, -1, 3988, + 3989, 3991, 3992, 3994, 3995, -1, 3997, 3999, + -1, 4001, -1, -1, -1, -1, 4002, 4004, + -1, -1, -1, -1, -1, -1, 4006, -1, + -1, -1, 4007, -1, -1, -1, -1, 4008, + -1, -1, -1, -1, -1, -1, -1, -1, + 4009, -1, -1, -1, -1, -1, -1, 4011, + 4013, -1, -1, -1, -1, -1, 4014, -1, + -1, -1, 4016, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4017, -1, -1, -1, + -1, 4019, 4020, -1, -1, -1, -1, -1, + 4021, -1, -1, -1, 4022, 4024, -1, 4025, + 4027, 4030, 4031, 4032, 4033, 4034, 4036, 4037, + 4038, 4039, 4040, -1, -1, -1, 4041, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4043, 4044, -1, 4047, -1, -1, 4048, + -1, 4049, -1, -1, 4051, 4052, -1, -1, + -1, -1, -1, -1, -1, 4054, -1, -1, + -1, -1, -1, -1, 4056, -1, -1, -1, + 4057, -1, -1, -1, -1, 4058, -1, 4059, + -1, -1, -1, -1, -1, 4060, 4065, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4067, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4069, -1, 4070, 4071, + 4072, -1, 4074, -1, 4075, -1, -1, -1, + -1, -1, 4076, 4080, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4084, 4085, 4086, + -1, -1, -1, -1, -1, -1, -1, 4087, + -1, -1, -1, -1, -1, 4088, -1, 4089, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4091, 4092, -1, -1, -1, 4094, -1, + -1, 4095, -1, -1, -1, -1, -1, -1, + /* 0x6900 */ + 4096, 4097, -1, -1, -1, -1, -1, -1, + -1, 4098, -1, -1, -1, -1, 4100, 4101, + -1, -1, -1, -1, -1, -1, -1, 4104, + 4106, 4107, -1, -1, 4108, -1, -1, 4110, + 4111, -1, 4112, -1, 4113, -1, -1, -1, + -1, -1, -1, 4114, -1, 4115, -1, -1, + 4116, -1, -1, -1, 4117, -1, 4118, -1, + -1, 4119, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4120, -1, -1, 4121, -1, -1, + -1, -1, -1, 4123, -1, 4124, -1, -1, + -1, 4125, 4126, -1, -1, -1, -1, -1, + 4127, 4128, -1, -1, -1, 4129, 4130, -1, + 4131, -1, 4132, 4133, -1, 4134, -1, -1, + -1, -1, -1, 4135, -1, 4137, -1, -1, + -1, -1, -1, -1, 4138, 4139, -1, 4141, + -1, -1, -1, -1, 4142, 4143, 4144, 4145, + 4146, 4147, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4149, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4150, -1, + 4152, -1, 4153, -1, -1, -1, 4154, -1, + -1, -1, 4156, -1, 4157, -1, -1, -1, + -1, -1, -1, -1, 4158, -1, -1, 4159, + -1, -1, -1, -1, -1, -1, -1, 4160, + 4161, -1, -1, 4163, -1, 4164, -1, -1, + -1, 4165, -1, 4167, 4168, 4170, -1, 4172, + 4174, 4176, 4177, 4178, -1, -1, 4180, 4181, + 4182, -1, -1, -1, 4183, -1, -1, 4184, + 4185, -1, -1, -1, -1, -1, -1, -1, + -1, 4186, -1, 4187, -1, -1, 4188, -1, + -1, 4189, -1, -1, -1, -1, -1, -1, + /* 0x6a00 */ + -1, 4190, 4191, 4193, -1, 4194, -1, -1, + -1, -1, 4195, -1, -1, -1, -1, -1, + 4196, 4197, 4199, 4200, -1, -1, -1, -1, + -1, 4201, -1, -1, -1, -1, 4202, -1, + -1, -1, -1, 4203, -1, -1, -1, -1, + -1, 4205, 4207, -1, -1, -1, -1, 4209, + -1, 4211, -1, 4213, -1, -1, -1, 4214, + 4218, 4220, 4221, -1, -1, 4222, -1, 4223, + -1, -1, -1, 4224, -1, -1, -1, -1, + 4226, -1, 4227, 4228, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4230, + -1, -1, 4231, -1, -1, -1, -1, -1, + -1, -1, -1, 4233, -1, -1, 4235, -1, + 4238, 4239, -1, -1, -1, -1, -1, -1, + -1, 4240, -1, -1, 4243, -1, -1, -1, + -1, 4244, -1, 4245, -1, -1, 4246, -1, + -1, 4247, -1, -1, -1, -1, -1, 4248, + 4250, -1, -1, -1, 4251, -1, -1, 4252, + 4254, -1, -1, -1, 4255, 4256, -1, 4257, + -1, -1, 4258, 4260, -1, -1, -1, -1, + -1, 4261, 4262, -1, -1, -1, 4264, 4265, + -1, 4267, -1, 4271, -1, -1, -1, -1, + 4272, -1, -1, 4273, -1, -1, -1, -1, + 4274, 4278, 4279, 4280, -1, -1, -1, -1, + 4281, -1, -1, -1, 4282, -1, 4283, -1, + -1, -1, -1, 4285, 4287, 4288, -1, -1, + -1, -1, 4289, 4290, -1, 4291, 4292, 4293, + -1, -1, -1, -1, -1, 4295, -1, 4296, + 4297, -1, 4298, -1, 4299, -1, -1, -1, + -1, -1, -1, 4300, -1, -1, -1, -1, + 4301, -1, 4302, 4303, -1, 4305, -1, -1, + /* 0x6b00 */ + -1, -1, -1, -1, 4306, 4308, -1, -1, + -1, 4309, 4313, -1, -1, -1, -1, 4315, + -1, 4316, 4317, -1, -1, -1, 4319, 4320, + -1, -1, -1, -1, -1, 4322, 4325, -1, + 4327, -1, 4329, 4333, 4336, -1, -1, 4337, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4338, -1, -1, 4339, -1, -1, + -1, -1, -1, 4340, -1, 4341, 4342, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4343, -1, 4344, -1, + 4346, -1, -1, 4347, -1, -1, 4349, -1, + 4352, -1, -1, 4353, -1, 4355, -1, 4356, + -1, 4357, -1, -1, -1, 4359, -1, -1, + 4361, 4363, -1, -1, 4365, -1, 4366, 4369, + -1, -1, 4371, 4375, 4379, -1, -1, 4382, + 4385, 4388, 4389, -1, 4390, -1, 4392, 4396, + 4400, 4401, -1, -1, -1, -1, -1, 4405, + -1, -1, -1, 4406, -1, -1, -1, -1, + -1, -1, 4407, 4408, -1, -1, -1, -1, + 4409, -1, 4410, -1, -1, -1, 4411, -1, + -1, 4412, -1, -1, 4413, -1, -1, -1, + -1, -1, -1, 4414, -1, -1, 4415, 4416, + -1, 4417, 4419, -1, 4421, -1, -1, 4422, + -1, -1, 4423, 4424, 4426, -1, -1, -1, + 4428, 4429, 4432, -1, -1, -1, 4433, -1, + -1, 4434, -1, -1, -1, -1, 4436, 4437, + -1, -1, -1, 4438, 4440, 4441, -1, 4442, + 4443, 4444, -1, -1, -1, -1, -1, 4445, + -1, 4446, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4447, -1, 4448, -1, + -1, -1, -1, -1, -1, 4449, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4450, + /* 0x6c00 */ + -1, -1, 4451, -1, -1, -1, -1, 4453, + 4454, -1, 4456, -1, 4457, -1, -1, -1, + -1, -1, -1, -1, 4458, -1, -1, 4461, + -1, -1, -1, 4464, -1, -1, -1, -1, + -1, -1, 4465, 4466, -1, -1, -1, -1, + -1, 4469, -1, 4470, 4471, -1, -1, -1, + -1, -1, 4472, 4473, 4474, 4476, -1, 4478, + -1, -1, 4481, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4483, + -1, 4487, -1, -1, -1, -1, 4488, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4489, 4491, -1, -1, -1, -1, -1, + -1, 4493, -1, -1, 4495, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4496, 4497, -1, -1, -1, + -1, 4498, 4499, 4500, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 4501, 4503, -1, -1, -1, -1, -1, -1, + -1, -1, 4504, -1, -1, -1, 4505, 4506, + -1, -1, -1, -1, -1, -1, -1, 4507, + -1, 4508, 4513, 4515, 4516, 4517, 4518, 4519, + 4520, 4521, 4522, -1, -1, -1, 4524, -1, + -1, 4525, 4526, -1, -1, 4527, -1, -1, + -1, -1, -1, -1, -1, -1, 4528, -1, + -1, 4529, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4530, -1, -1, + -1, -1, -1, 4532, -1, 4533, 4534, -1, + -1, -1, -1, -1, -1, 4535, -1, -1, + 4536, -1, 4537, -1, -1, -1, -1, 4539, + 4540, -1, -1, -1, -1, -1, 4541, 4542, + 4544, -1, 4545, 4546, 4547, 4550, 4552, -1, + /* 0x6d00 */ + -1, 4553, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4554, -1, -1, -1, + -1, -1, 4555, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4556, + -1, -1, -1, -1, -1, -1, 4557, -1, + -1, -1, -1, -1, 4558, -1, -1, -1, + 4559, -1, -1, 4560, 4561, 4562, 4563, 4564, + 4565, 4566, 4567, 4568, -1, 4569, 4570, 4572, + 4574, 4575, 4576, 4577, 4578, 4579, -1, -1, + -1, -1, -1, -1, 4580, -1, -1, -1, + -1, -1, -1, 4583, -1, -1, -1, 4584, + -1, 4587, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4588, -1, -1, 4589, -1, -1, -1, + -1, -1, 4590, -1, -1, 4592, -1, 4593, + -1, 4594, -1, -1, 4595, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4596, -1, + -1, 4598, -1, 4600, 4601, 4603, 4604, 4605, + 4606, 4607, 4608, 4609, 4610, -1, 4611, 4612, + 4614, 4615, -1, -1, -1, -1, -1, 4619, + -1, -1, -1, -1, -1, -1, -1, -1, + 4620, -1, -1, -1, 4621, -1, -1, -1, + 4622, -1, -1, -1, 4623, -1, -1, -1, + -1, -1, -1, 4624, -1, -1, -1, -1, + -1, -1, 4625, -1, -1, -1, -1, -1, + -1, -1, 4626, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4628, -1, -1, + 4629, -1, 4631, 4632, -1, -1, -1, -1, + -1, -1, -1, 4634, -1, 4635, 4638, -1, + 4639, -1, 4640, 4641, -1, -1, -1, -1, + /* 0x6e00 */ + -1, -1, -1, -1, -1, 4642, -1, 4643, + 4644, 4646, 4647, 4650, 4654, 4655, 4656, -1, + 4658, 4659, -1, 4660, 4664, 4665, 4668, 4669, + -1, 4670, -1, 4671, -1, -1, -1, -1, + -1, -1, 4672, -1, -1, -1, 4673, -1, + -1, 4674, -1, -1, 4675, -1, -1, -1, + -1, -1, -1, -1, 4676, -1, -1, -1, + 4677, -1, -1, -1, -1, -1, 4679, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4680, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4681, -1, + -1, -1, -1, -1, -1, -1, -1, 4682, + -1, -1, -1, -1, -1, -1, -1, 4683, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4684, 4685, 4686, 4687, 4688, + 4690, 4692, 4693, 4694, -1, 4695, -1, 4696, + -1, 4697, -1, -1, 4698, -1, -1, -1, + 4701, -1, -1, -1, -1, 4702, 4704, -1, + -1, -1, -1, -1, 4706, 4707, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4708, 4712, -1, -1, 4713, 4714, + -1, -1, -1, 4716, -1, -1, 4717, -1, + -1, -1, -1, -1, 4719, -1, -1, -1, + -1, -1, -1, -1, 4721, 4722, -1, -1, + -1, -1, -1, -1, 4723, -1, 4724, -1, + -1, -1, -1, -1, -1, -1, -1, 4725, + -1, 4726, 4728, 4729, -1, 4730, 4732, 4733, + 4736, 4737, 4739, -1, 4740, 4741, 4742, -1, + 4743, 4746, 4747, -1, 4748, -1, -1, 4750, + -1, -1, 4751, -1, -1, -1, -1, 4752, + 4755, -1, -1, 4757, -1, -1, 4758, 4759, + /* 0x6f00 */ + -1, 4761, -1, -1, 4762, -1, 4763, -1, + -1, -1, 4764, -1, -1, -1, -1, -1, + -1, 4765, -1, 4766, -1, -1, -1, -1, + -1, -1, 4767, -1, -1, -1, -1, -1, + -1, -1, 4768, 4769, -1, -1, -1, 4770, + -1, -1, -1, 4773, 4774, -1, -1, -1, + -1, 4775, 4776, -1, -1, -1, -1, -1, + 4777, -1, -1, -1, -1, -1, -1, 4778, + -1, 4779, -1, -1, 4780, 4781, 4782, 4783, + -1, -1, -1, 4784, -1, 4785, -1, -1, + -1, 4786, -1, -1, 4789, -1, -1, -1, + -1, 4791, -1, 4792, 4794, -1, -1, -1, + -1, -1, -1, -1, 4796, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4797, + 4798, -1, -1, -1, 4799, -1, -1, 4800, + -1, -1, -1, -1, -1, -1, -1, 4801, + 4802, 4806, 4810, -1, 4813, -1, 4816, 4817, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4818, -1, -1, 4819, -1, -1, 4820, + -1, -1, 4821, 4822, 4825, -1, -1, 4826, + 4828, -1, -1, 4829, 4830, -1, 4832, -1, + -1, 4833, -1, -1, -1, -1, 4834, -1, + 4835, 4836, -1, 4837, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4838, -1, 4839, -1, -1, -1, 4840, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4841, 4843, -1, 4844, 4845, -1, -1, + 4847, -1, 4848, 4850, 4852, -1, -1, 4853, + -1, -1, -1, -1, 4855, -1, -1, -1, + -1, -1, -1, 4856, -1, -1, -1, -1, + 4857, 4858, -1, 4861, -1, 4863, 4866, -1, + -1, -1, 4868, -1, 4869, -1, 4870, -1, + /* 0x7000 */ + -1, -1, 4871, -1, -1, 4874, 4875, -1, + -1, 4877, -1, 4878, -1, -1, -1, 4880, + -1, -1, -1, 4881, -1, 4884, -1, -1, + 4885, -1, -1, -1, -1, 4886, -1, 4887, + 4888, -1, -1, -1, -1, -1, 4889, 4890, + 4892, -1, -1, -1, 4894, -1, -1, 4896, + 4897, -1, 4898, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4900, -1, + -1, -1, -1, 4901, 4902, -1, -1, -1, + -1, -1, -1, 4903, 4905, -1, 4906, 4908, + -1, 4909, -1, -1, 4910, 4912, -1, -1, + 4913, -1, -1, -1, -1, 4914, -1, -1, + -1, -1, -1, 4915, 4916, -1, -1, 4917, + -1, -1, -1, -1, -1, 4918, 4919, 4921, + -1, -1, -1, -1, -1, 4922, 4925, -1, + -1, -1, -1, 4927, -1, 4929, 4931, 4933, + 4934, 4935, -1, -1, -1, -1, -1, -1, + -1, 4938, -1, -1, -1, 4941, 4943, 4944, + -1, -1, -1, -1, -1, -1, -1, 4945, + -1, -1, -1, -1, 4947, 4948, -1, -1, + -1, -1, -1, -1, 4949, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4954, 4957, + 4958, -1, -1, -1, -1, -1, -1, -1, + -1, 4959, 4960, -1, 4962, 4965, -1, -1, + -1, 4966, 4967, 4970, -1, -1, -1, -1, + -1, -1, 4971, -1, -1, -1, -1, 4972, + -1, -1, -1, -1, -1, -1, 4973, -1, + -1, -1, -1, 4975, -1, -1, -1, 4976, + -1, -1, -1, -1, -1, -1, 4977, 4978, + 4980, 4982, -1, 4983, 4984, 4985, -1, -1, + -1, 4986, -1, -1, 4987, -1, -1, -1, + -1, -1, -1, -1, -1, 4988, 4989, -1, + /* 0x7100 */ + -1, -1, -1, -1, -1, -1, -1, 4991, + 4992, -1, 4996, -1, -1, -1, -1, 4997, + -1, -1, -1, -1, 4998, 5000, 5001, -1, + 5002, -1, 5003, -1, -1, -1, -1, -1, + -1, 5005, -1, -1, -1, -1, 5006, -1, + -1, -1, -1, -1, -1, 5007, -1, -1, + 5008, -1, -1, 5010, -1, -1, -1, -1, + -1, -1, -1, -1, 5011, -1, -1, -1, + -1, -1, -1, -1, -1, 5013, -1, -1, + -1, 5014, -1, -1, -1, -1, -1, -1, + -1, 5017, 5018, -1, -1, 5019, 5023, 5024, + -1, 5025, -1, -1, -1, -1, -1, -1, + -1, -1, 5026, -1, -1, 5028, -1, 5029, + -1, 5033, -1, -1, 5034, -1, 5036, -1, + -1, -1, -1, -1, 5037, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5039, -1, + -1, -1, -1, -1, -1, 5041, -1, -1, + 5043, -1, -1, -1, -1, -1, -1, 5047, + -1, -1, 5048, -1, 5049, -1, -1, 5051, + -1, 5052, -1, -1, -1, -1, -1, -1, + -1, -1, 5056, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5057, 5058, 5059, -1, -1, -1, -1, + -1, 5060, 5061, -1, -1, -1, 5062, -1, + -1, 5063, -1, -1, 5065, -1, -1, -1, + 5067, -1, -1, -1, 5068, -1, 5070, -1, + 5071, -1, 5073, 5075, -1, 5077, -1, 5078, + -1, 5081, -1, -1, 5082, -1, -1, 5083, + -1, -1, -1, -1, -1, -1, 5085, -1, + -1, -1, -1, -1, 5086, 5087, -1, -1, + -1, -1, -1, 5088, 5092, -1, -1, -1, + -1, -1, -1, 5093, 5094, -1, 5095, 5096, + /* 0x7200 */ + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5097, -1, -1, + 5098, -1, -1, -1, -1, -1, -1, 5099, + -1, -1, -1, 5101, -1, -1, -1, -1, + -1, -1, -1, -1, 5104, -1, -1, -1, + -1, -1, -1, -1, -1, 5107, -1, -1, + -1, 5108, 5109, -1, 5111, -1, -1, 5112, + -1, -1, 5113, -1, 5114, -1, 5115, 5118, + 5119, -1, -1, 5120, -1, 5121, 5122, -1, + -1, -1, -1, 5123, -1, 5124, 5125, -1, + -1, -1, -1, 5129, -1, 5130, -1, -1, + 5134, -1, -1, 5135, 5136, -1, -1, -1, + 5137, -1, -1, -1, -1, -1, 5138, -1, + -1, -1, -1, 5140, -1, -1, -1, -1, + -1, -1, -1, -1, 5142, 5143, -1, -1, + -1, -1, 5144, -1, -1, 5146, -1, -1, + -1, 5147, 5148, -1, -1, -1, -1, 5149, + -1, -1, 5150, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5151, -1, + -1, -1, -1, 5152, -1, -1, -1, -1, + 5154, -1, 5156, -1, -1, -1, -1, 5157, + -1, -1, -1, -1, 5159, 5160, 5161, -1, + -1, -1, 5162, -1, 5163, -1, 5165, 5166, + 5167, 5168, -1, -1, -1, -1, -1, -1, + 5169, -1, 5170, -1, -1, -1, -1, -1, + 5172, 5173, -1, -1, 5174, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5175, 5176, -1, + -1, -1, 5177, -1, -1, 5178, -1, -1, + -1, -1, -1, -1, 5179, 5180, 5181, 5182, + 5183, 5184, 5185, -1, -1, -1, -1, -1, + 5186, 5188, -1, -1, -1, 5189, 5190, -1, + /* 0x7300 */ + -1, -1, 5191, 5192, -1, -1, -1, 5193, + -1, -1, 5194, -1, -1, 5195, 5197, -1, + -1, -1, -1, -1, -1, 5199, -1, -1, + 5200, 5201, -1, -1, -1, -1, -1, 5202, + -1, 5204, -1, -1, -1, -1, -1, -1, + 5205, 5206, 5207, 5208, 5209, -1, 5210, 5211, + -1, -1, 5212, -1, -1, 5213, 5214, -1, + -1, -1, -1, 5215, -1, -1, -1, 5216, + -1, 5218, -1, -1, 5219, 5220, -1, -1, + -1, -1, -1, -1, -1, 5221, 5222, 5225, + 5226, -1, -1, -1, -1, -1, -1, -1, + 5227, 5228, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5229, -1, -1, 5231, -1, + 5232, -1, 5233, 5234, -1, 5236, 5237, -1, + 5238, 5239, 5240, -1, -1, 5241, -1, 5243, + 5244, -1, 5246, 5247, 5248, -1, 5249, -1, + 5250, 5251, -1, 5252, -1, 5254, -1, 5255, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5256, -1, -1, -1, -1, -1, -1, + -1, 5257, 5258, 5259, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 5260, 5262, -1, -1, -1, -1, 5263, 5264, + 5265, 5266, -1, 5267, -1, -1, -1, -1, + -1, -1, 5268, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5269, -1, 5272, 5273, 5274, + 5276, 5277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5278, -1, -1, 5280, -1, -1, -1, + -1, -1, 5284, -1, -1, -1, -1, -1, + 5285, 5286, 5288, -1, -1, -1, -1, 5289, + -1, -1, -1, -1, -1, -1, 5290, -1, + /* 0x7400 */ + -1, -1, -1, 5291, -1, 5292, -1, -1, + -1, 5293, -1, -1, -1, 5296, 5298, 5299, + 5300, 5302, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5304, -1, -1, 5305, -1, -1, -1, + -1, 5307, 5309, -1, 5310, -1, -1, 5311, + -1, -1, -1, -1, -1, -1, -1, 5312, + -1, -1, -1, 5313, -1, -1, -1, -1, + -1, -1, 5314, -1, -1, -1, -1, -1, + -1, 5315, -1, -1, -1, -1, -1, -1, + 5316, -1, -1, 5319, 5321, -1, -1, -1, + 5322, 5323, 5324, -1, -1, -1, -1, 5325, + 5326, -1, 5327, -1, 5328, -1, 5330, 5331, + 5332, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5333, -1, -1, -1, 5335, + -1, 5336, -1, -1, -1, -1, 5337, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5339, 5341, 5344, -1, -1, 5345, -1, + -1, -1, -1, 5346, -1, -1, -1, -1, + 5347, -1, -1, -1, -1, 5348, -1, -1, + 5349, -1, -1, -1, -1, 5350, -1, 5352, + -1, -1, -1, -1, -1, -1, -1, -1, + 5353, 5355, 5356, -1, 5357, -1, -1, 5358, + -1, -1, 5359, -1, 5360, -1, -1, -1, + -1, -1, 5362, -1, -1, -1, -1, -1, + -1, -1, -1, 5364, -1, -1, -1, -1, + 5365, -1, -1, -1, -1, -1, 5366, 5367, + -1, -1, -1, -1, -1, -1, 5368, 5370, + -1, -1, -1, -1, -1, -1, -1, -1, + /* 0x7500 */ + -1, 5371, -1, -1, -1, -1, 5373, -1, + -1, -1, -1, -1, 5374, -1, 5375, -1, + -1, -1, -1, -1, -1, 5378, 5379, -1, + -1, -1, -1, -1, -1, -1, 5381, -1, + 5384, -1, 5385, 5387, -1, -1, 5389, -1, + -1, -1, -1, -1, -1, -1, -1, 5392, + -1, -1, -1, -1, -1, 5398, -1, 5399, + -1, -1, 5400, 5402, 5407, 5409, -1, -1, + -1, -1, 5410, -1, 5411, 5413, 5414, -1, + -1, -1, 5418, -1, 5419, 5421, 5423, -1, + -1, 5424, 5425, -1, -1, -1, -1, -1, + -1, 5429, 5431, -1, -1, 5432, 5437, -1, + 5441, 5442, 5443, -1, -1, 5444, -1, 5445, + 5446, -1, 5447, 5448, -1, -1, -1, -1, + 5450, 5451, -1, 5453, 5457, 5458, 5460, -1, + -1, -1, 5461, 5462, -1, -1, -1, -1, + -1, -1, 5463, -1, -1, 5467, 5469, 5470, + -1, 5471, 5475, -1, -1, -1, 5479, 5481, + -1, -1, -1, -1, -1, -1, 5483, 5484, + -1, -1, -1, -1, -1, -1, -1, 5485, + 5486, 5487, -1, 5488, -1, -1, -1, -1, + -1, -1, -1, -1, 5489, 5490, 5491, 5492, + -1, 5493, -1, -1, 5495, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5496, + 5497, 5498, -1, -1, -1, -1, -1, -1, + -1, -1, 5499, -1, -1, -1, 5500, -1, + -1, 5504, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 5505, 5506, 5507, 5508, -1, -1, 5509, -1, + -1, -1, 5510, 5512, 5515, -1, -1, -1, + -1, 5516, 5517, -1, -1, -1, 5518, -1, + /* 0x7600 */ + -1, -1, 5519, -1, -1, 5523, 5524, -1, + -1, 5525, -1, 5527, -1, 5528, -1, -1, + -1, -1, -1, 5529, -1, -1, 5530, 5531, + 5532, -1, -1, -1, -1, -1, 5533, -1, + -1, 5534, -1, -1, 5535, -1, 5536, 5537, + -1, -1, 5538, 5539, -1, -1, 5540, -1, + -1, -1, 5541, -1, -1, -1, -1, -1, + -1, -1, 5542, 5543, -1, -1, 5545, 5546, + -1, -1, 5547, -1, 5548, 5550, 5551, 5552, + -1, 5553, -1, -1, -1, -1, -1, -1, + -1, -1, 5554, -1, -1, 5556, -1, -1, + 5558, -1, -1, -1, -1, -1, 5559, 5560, + -1, 5561, 5562, 5563, 5564, 5565, -1, 5566, + -1, 5567, -1, 5568, 5569, 5570, 5571, 5572, + 5573, 5576, 5577, -1, 5578, 5579, -1, -1, + -1, -1, 5580, 5590, 5591, -1, -1, -1, + -1, 5593, 5595, 5597, -1, -1, -1, -1, + 5598, -1, -1, 5601, -1, 5602, 5604, -1, + 5605, 5606, -1, -1, -1, -1, -1, -1, + -1, -1, 5607, -1, -1, -1, 5609, -1, + -1, 5610, -1, -1, -1, 5611, -1, -1, + 5613, -1, -1, -1, -1, -1, -1, -1, + 5614, 5616, 5617, -1, -1, -1, -1, 5619, + 5620, 5622, 5624, -1, 5625, -1, -1, -1, + -1, 5626, -1, 5627, -1, -1, -1, 5629, + 5630, -1, -1, 5631, 5634, 5635, -1, 5636, + 5637, 5639, -1, -1, -1, -1, 5641, 5643, + 5644, 5645, -1, -1, 5646, -1, 5647, -1, + -1, 5648, -1, 5649, 5651, -1, -1, 5652, + -1, -1, 5653, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + /* 0x7700 */ + -1, -1, -1, -1, -1, -1, 5655, -1, + -1, 5657, -1, -1, 5658, 5660, 5661, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 5663, -1, -1, -1, -1, -1, 5664, 5665, + -1, -1, -1, -1, -1, 5666, 5667, -1, + -1, -1, -1, 5668, 5669, -1, -1, 5670, + -1, -1, -1, -1, -1, -1, -1, 5672, + -1, -1, -1, -1, -1, -1, 5673, -1, + 5676, 5677, 5678, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5679, + 5680, 5681, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5682, -1, 5683, -1, + 5684, -1, -1, -1, 5685, 5686, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5687, -1, -1, -1, -1, -1, 5688, + -1, -1, -1, -1, -1, 5690, 5691, 5692, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5693, -1, -1, -1, 5694, -1, + 5695, -1, -1, -1, -1, -1, 5696, -1, + 5697, -1, 5698, -1, -1, -1, -1, -1, + -1, 5699, 5700, -1, -1, 5701, -1, -1, + 5703, -1, -1, -1, -1, -1, 5704, -1, + -1, -1, -1, -1, 5705, -1, 5706, -1, + -1, 5710, -1, -1, -1, -1, -1, 5711, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5712, 5713, -1, -1, -1, -1, + -1, 5714, 5715, -1, -1, -1, -1, -1, + -1, -1, 5716, -1, 5717, -1, 5719, 5720, + -1, -1, -1, 5722, -1, -1, -1, 5723, + -1, -1, -1, -1, 5724, -1, 5727, -1, + -1, -1, -1, -1, -1, -1, 5728, 5729, + /* 0x7800 */ + 5734, 5735, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5736, -1, -1, 5737, 5738, 5741, + -1, -1, 5742, -1, 5743, -1, -1, -1, + -1, -1, -1, -1, -1, 5744, -1, 5745, + -1, -1, -1, -1, 5746, -1, -1, -1, + -1, -1, 5747, -1, -1, -1, -1, -1, + -1, -1, 5750, 5751, -1, -1, 5752, 5753, + 5758, 5759, -1, 5760, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5761, 5762, 5763, + -1, 5764, 5765, -1, 5766, -1, -1, -1, + -1, -1, -1, -1, 5767, -1, -1, -1, + 5768, -1, 5769, -1, -1, -1, 5770, 5773, + -1, -1, -1, -1, -1, 5774, -1, 5775, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5778, -1, -1, -1, -1, -1, 5782, + -1, -1, -1, -1, -1, 5784, 5785, -1, + -1, -1, -1, -1, 5786, 5787, -1, 5790, + -1, -1, -1, 5793, 5794, -1, 5795, 5798, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5799, 5800, -1, -1, 5801, -1, 5802, + 5803, 5805, -1, -1, -1, -1, -1, -1, + 5807, -1, 5808, 5810, 5812, -1, -1, -1, + -1, 5813, -1, -1, -1, -1, -1, 5814, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5815, 5816, -1, 5817, -1, 5818, -1, + -1, -1, 5819, -1, -1, -1, -1, -1, + 5822, -1, -1, 5823, -1, -1, -1, 5824, + -1, -1, -1, -1, -1, -1, -1, 5825, + -1, -1, -1, -1, -1, -1, -1, 5826, + 5827, -1, 5828, -1, -1, 5829, -1, -1, + /* 0x7900 */ + 5830, -1, -1, -1, 5831, -1, 5832, -1, + 5835, -1, -1, -1, -1, -1, 5837, -1, + -1, -1, 5838, -1, -1, -1, -1, -1, + -1, 5839, -1, -1, -1, -1, -1, 5840, + 5843, -1, -1, -1, -1, -1, 5844, -1, + -1, -1, 5849, 5850, 5851, -1, 5852, -1, + -1, 5855, -1, -1, -1, -1, -1, -1, + -1, -1, 5856, 5857, 5858, -1, -1, 5859, + 5860, -1, -1, 5861, -1, 5862, -1, -1, + -1, -1, -1, -1, -1, -1, 5863, -1, + -1, -1, -1, -1, -1, 5864, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5865, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5866, + -1, -1, -1, -1, -1, 5867, -1, 5868, + 5869, -1, -1, -1, -1, -1, -1, 5870, + 5871, -1, -1, -1, 5872, 5873, -1, -1, + -1, -1, -1, -1, -1, 5874, 5875, -1, + -1, -1, -1, -1, -1, 5876, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5877, -1, -1, -1, -1, 5878, -1, + -1, 5879, 5880, -1, -1, -1, 5881, -1, + 5882, 5883, -1, -1, 5884, -1, -1, -1, + -1, -1, -1, 5885, -1, -1, -1, 5886, + -1, 5887, -1, 5888, -1, -1, 5889, 5890, + 5895, -1, 5896, 5897, 5902, 5905, -1, -1, + 5906, -1, -1, -1, 5907, 5909, 5910, 5911, + 5912, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5913, + 5914, -1, -1, -1, -1, -1, -1, -1, + 5916, -1, -1, -1, -1, 5917, 5918, -1, + /* 0x7a00 */ + -1, 5919, -1, -1, -1, 5923, 5924, -1, + 5926, 5927, -1, -1, -1, -1, 5929, -1, + -1, -1, -1, -1, -1, -1, -1, 5930, + -1, -1, 5932, -1, 5934, -1, -1, 5935, + -1, -1, -1, 5936, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5937, 5938, -1, + -1, 5939, 5941, 5942, -1, -1, -1, -1, + -1, -1, 5944, 5946, -1, -1, 5947, 5951, + 5955, -1, 5957, -1, -1, 5958, -1, -1, + -1, 5960, -1, -1, 5962, 5966, 5967, 5969, + 5971, 5974, -1, -1, -1, -1, -1, 5975, + -1, -1, -1, -1, -1, -1, 5976, -1, + 5978, 5979, 5980, 5981, -1, -1, -1, -1, + 5982, 5986, 5988, 5990, -1, 5991, -1, -1, + 5993, -1, -1, -1, -1, -1, -1, 5994, + -1, 5996, -1, -1, -1, 5997, -1, -1, + -1, 5998, -1, 5999, -1, -1, -1, -1, + -1, -1, 6000, -1, -1, 6001, 6002, -1, + -1, 6003, -1, 6005, -1, -1, -1, 6009, + -1, -1, -1, -1, 6013, 6014, -1, -1, + -1, -1, -1, -1, -1, 6015, 6016, -1, + -1, 6017, 6018, -1, 6019, 6020, 6022, 6024, + 6026, -1, -1, 6028, -1, 6029, 6030, -1, + -1, -1, 6032, 6033, -1, -1, -1, -1, + -1, -1, -1, 6037, 6039, 6040, 6041, 6043, + 6044, -1, 6046, -1, -1, -1, -1, -1, + -1, -1, 6047, -1, -1, -1, 6048, -1, + -1, -1, 6050, -1, 6051, 6053, 6056, -1, + -1, -1, 6058, -1, -1, -1, -1, -1, + -1, 6059, 6061, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6063, -1, + 6065, -1, -1, -1, -1, -1, 6067, -1, + /* 0x7b00 */ + -1, -1, -1, 6068, -1, -1, -1, -1, + -1, -1, -1, 6069, -1, -1, -1, -1, + -1, 6071, -1, -1, 6073, 6074, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6075, + -1, -1, -1, -1, -1, -1, -1, 6076, + 6082, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6083, 6085, -1, + -1, -1, 6086, -1, 6088, -1, 6090, -1, + -1, -1, -1, -1, -1, 6091, 6092, -1, + -1, -1, -1, 6093, -1, 6094, -1, 6096, + 6098, 6099, -1, -1, -1, -1, 6100, -1, + 6104, 6105, 6106, 6107, 6108, 6109, 6110, -1, + -1, -1, -1, -1, -1, -1, -1, 6114, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 6115, -1, -1, -1, -1, -1, -1, + -1, 6116, 6117, -1, 6118, -1, 6119, 6122, + 6123, -1, 6124, -1, -1, -1, 6125, 6126, + -1, -1, -1, 6129, -1, 6130, -1, 6131, + -1, -1, 6132, 6133, -1, -1, -1, -1, + -1, -1, 6134, -1, -1, -1, -1, -1, + -1, -1, -1, 6135, -1, -1, 6139, 6141, + 6142, 6143, 6144, 6145, 6146, -1, -1, -1, + 6147, -1, 6149, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 6150, -1, -1, -1, 6151, -1, 6153, -1, + -1, 6154, -1, 6155, -1, -1, -1, 6157, + -1, 6158, -1, 6159, 6160, -1, -1, 6161, + -1, -1, -1, 6162, -1, -1, -1, -1, + 6163, 6165, -1, -1, 6166, -1, 6167, -1, + -1, 6168, 6171, -1, -1, 6172, 6174, 6175, + -1, 6176, 6177, 6178, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + /* 0x7c00 */ + 6179, 6181, -1, -1, 6183, -1, 6185, -1, + -1, -1, -1, -1, -1, 6186, -1, -1, + -1, 6187, 6189, -1, 6190, -1, 6192, 6193, + 6195, -1, -1, -1, -1, -1, 6196, -1, + 6197, 6198, -1, 6199, -1, -1, -1, -1, + -1, -1, 6200, 6201, -1, -1, -1, -1, + -1, 6203, -1, -1, -1, -1, -1, 6205, + -1, 6206, -1, -1, -1, 6207, 6208, -1, + 6209, 6211, -1, 6212, -1, -1, 6213, -1, + -1, -1, -1, -1, 6214, -1, -1, 6215, + 6217, -1, 6218, -1, 6219, 6221, 6222, -1, + 6224, 6226, -1, 6227, 6228, -1, -1, 6229, + 6230, -1, -1, -1, 6232, -1, -1, -1, + -1, 6234, 6235, -1, 6236, 6237, 6239, -1, + -1, -1, 6240, -1, 6242, -1, -1, -1, + -1, -1, -1, 6243, 6244, -1, -1, -1, + -1, -1, -1, 6245, -1, -1, -1, 6246, + -1, -1, -1, 6248, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6249, + 6250, -1, -1, 6251, 6253, 6254, -1, -1, + -1, -1, -1, -1, 6255, 6256, 6258, 6259, + -1, -1, 6263, -1, 6264, -1, 6268, -1, + -1, -1, -1, 6269, -1, 6271, -1, -1, + -1, 6272, 6273, -1, -1, 6274, -1, -1, + -1, 6275, -1, -1, -1, -1, 6276, 6281, + -1, 6282, 6283, -1, -1, -1, -1, -1, + -1, -1, -1, 6284, -1, 6286, -1, -1, + -1, -1, 6287, -1, -1, 6291, 6292, -1, + 6293, -1, -1, -1, -1, -1, 6295, 6296, + -1, -1, -1, -1, -1, -1, -1, -1, + 6297, -1, 6299, -1, 6300, -1, 6301, -1, + 6302, 6306, 6308, 6309, 6313, -1, 6315, 6317, + /* 0x7d00 */ + 6319, -1, 6320, -1, 6321, 6322, 6323, 6324, + 6325, 6326, -1, 6327, -1, 6328, -1, -1, + 6329, -1, -1, 6330, 6331, 6332, 6333, 6334, + 6335, 6337, 6339, 6340, 6341, 6342, -1, -1, + -1, 6344, -1, 6345, -1, 6346, -1, 6347, + -1, -1, -1, -1, 6348, -1, 6350, 6352, + 6356, 6357, 6358, 6359, -1, 6360, -1, -1, + -1, 6361, 6362, -1, 6363, -1, -1, 6364, + 6365, -1, 6366, 6367, 6368, 6369, 6370, -1, + 6372, -1, -1, 6373, 6374, 6376, 6377, 6378, + 6379, -1, -1, -1, -1, 6380, 6383, -1, + -1, -1, 6384, 6385, -1, 6387, 6389, -1, + -1, 6390, 6391, -1, 6392, 6396, 6397, -1, + 6398, -1, -1, -1, -1, -1, -1, -1, + 6399, 6400, 6402, 6404, -1, 6405, 6407, 6410, + 6411, 6413, -1, -1, -1, -1, -1, -1, + -1, 6414, 6415, 6417, -1, -1, 6418, -1, + 6419, 6420, -1, 6421, 6422, -1, -1, 6423, + -1, 6424, -1, 6426, -1, -1, -1, 6428, + -1, 6429, 6431, -1, 6434, -1, 6435, -1, + 6436, -1, 6438, 6440, -1, -1, -1, -1, + -1, -1, -1, 6441, 6445, 6446, -1, 6447, + 6448, 6449, 6450, 6451, 6453, 6455, -1, 6456, + 6457, 6458, 6459, 6460, -1, 6461, 6463, 6464, + -1, -1, -1, -1, 6465, -1, -1, 6466, + -1, -1, 6467, 6468, -1, 6469, -1, 6470, + 6474, 6475, 6477, -1, 6479, 6480, 6481, 6483, + 6484, 6485, 6486, -1, 6490, 6491, 6492, -1, + 6493, 6494, -1, 6496, -1, 6498, 6499, -1, + 6500, 6501, 6502, 6503, 6507, -1, -1, 6508, + -1, 6509, 6510, -1, 6511, -1, 6512, -1, + -1, 6513, -1, 6514, 6515, -1, -1, -1, + /* 0x7e00 */ + -1, 6517, -1, -1, 6519, -1, -1, -1, + 6521, 6522, 6523, 6524, -1, -1, -1, -1, + 6525, 6526, -1, -1, -1, 6527, -1, 6529, + 6530, -1, -1, 6533, -1, 6534, 6535, 6536, + -1, -1, -1, 6537, -1, -1, 6539, 6541, + 6543, -1, -1, 6544, -1, 6545, 6546, -1, + -1, 6547, 6549, -1, 6552, 6553, 6554, 6556, + -1, 6557, -1, -1, -1, 6558, 6563, -1, + -1, 6564, -1, 6565, -1, 6567, 6569, -1, + 6570, -1, 6571, 6574, -1, 6577, -1, -1, + -1, -1, 6579, -1, 6580, 6581, 6582, -1, + -1, 6584, 6585, 6586, -1, -1, 6587, -1, + -1, 6588, 6590, -1, 6591, -1, 6592, -1, + -1, 6593, 6595, 6597, -1, 6600, 6603, 6605, + 6606, -1, -1, 6609, -1, -1, -1, -1, + -1, 6610, -1, -1, 6611, 6613, 6614, 6615, + -1, -1, 6616, 6617, -1, -1, -1, 6618, + 6619, 6620, 6622, -1, 6624, 6627, 6628, 6631, + -1, -1, 6633, 6635, 6636, -1, 6637, -1, + 6640, -1, -1, -1, 6642, 6643, -1, 6646, + 6648, 6649, 6650, 6651, 6652, 6656, 6657, 6658, + 6659, 6660, 6662, 6663, 6664, 6665, 6666, 6667, + 6668, 6669, 6670, 6671, 6672, 6673, 6675, 6676, + 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, + 6688, 6689, 6691, 6692, 6693, 6694, 6695, 6696, + 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, + 6706, 6707, 6708, 6709, 6710, 6711, 6713, 6714, + 6715, 6717, 6718, 6719, 6720, 6721, 6724, 6725, + 6727, 6728, 6729, 6730, 6733, 6734, 6735, 6737, + 6739, 6740, 6741, 6743, -1, 6744, 6746, 6747, + 6748, 6749, 6750, 6751, 6753, 6754, 6756, 6757, + 6759, 6761, 6762, 6763, 6764, 6765, 6766, 6767, + /* 0x7f00 */ + 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, + 6777, 6778, 6779, 6781, 6782, 6783, 6784, 6785, + 6786, 6790, 6791, 6792, 6793, 6794, 6795, 6796, + 6797, 6799, 6800, 6801, 6802, 6803, 6804, 6805, + 6806, 6808, 6809, 6810, 6811, 6812, 6813, 6814, + 6817, 6818, 6819, 6820, 6822, 6823, 6824, 6825, + 6826, 6828, 6829, 6830, 6831, 6832, 6834, 6837, + 6838, 6839, 6840, 6842, 6843, 6845, 6848, -1, + -1, -1, 6850, -1, -1, -1, -1, 6852, + 6853, -1, -1, -1, 6858, -1, 6860, -1, + 6865, 6867, 6870, 6872, -1, -1, -1, 6874, + -1, -1, 6877, -1, -1, -1, -1, -1, + -1, -1, 6879, -1, -1, -1, -1, -1, + -1, -1, 6880, -1, -1, -1, -1, -1, + 6882, -1, -1, -1, 6884, 6885, 6888, 6889, + 6890, -1, -1, -1, -1, -1, -1, -1, + 6892, 6893, -1, 6895, -1, 6897, 6898, 6899, + 6902, -1, 6906, 6907, 6908, -1, -1, -1, + 6909, 6910, -1, -1, -1, -1, -1, 6911, + -1, -1, -1, -1, -1, -1, -1, 6912, + -1, 6913, -1, 6914, 6915, 6916, -1, -1, + 6917, 6918, 6919, -1, -1, -1, 6921, -1, + -1, -1, -1, -1, 6922, -1, 6924, -1, + -1, 6926, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6927, 6929, 6931, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6932, -1, -1, -1, -1, -1, + 6933, 6934, 6935, -1, -1, -1, -1, -1, + 6936, -1, -1, -1, 6937, -1, -1, -1, + -1, -1, -1, 6939, 6940, -1, -1, -1, + -1, 6941, -1, 6942, -1, -1, -1, -1, + -1, 6943, 6944, 6945, -1, 6947, -1, -1, + /* 0x8000 */ + 6948, -1, -1, 6949, -1, -1, -1, 6950, + 6951, -1, 6952, 6953, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6954, -1, -1, + 6955, -1, -1, -1, 6956, -1, -1, -1, + -1, 6957, 6958, -1, 6959, -1, -1, 6960, + 6961, -1, -1, -1, 6963, -1, 6964, -1, + 6965, -1, -1, -1, -1, -1, -1, -1, + 6966, -1, -1, 6967, 6968, 6969, -1, -1, + 6970, -1, 6973, 6974, -1, -1, -1, -1, + -1, -1, -1, 6975, 6976, 6979, -1, -1, + -1, -1, -1, -1, 6980, -1, 6982, -1, + -1, -1, -1, -1, -1, -1, 6984, 6985, + -1, 6987, -1, -1, -1, -1, 6990, -1, + 6993, 6995, 6996, 6999, -1, 7000, 7002, 7003, + 7007, -1, 7010, 7011, 7012, 7014, 7015, 7016, + -1, 7019, -1, -1, -1, 7020, 7022, -1, + -1, -1, -1, 7023, -1, 7025, -1, 7027, + 7028, 7029, -1, -1, -1, -1, 7030, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7031, 7033, -1, -1, 7034, -1, -1, 7035, + -1, -1, -1, -1, 7036, -1, 7037, 7038, + -1, 7040, 7041, -1, 7043, -1, -1, -1, + -1, -1, -1, 7044, -1, -1, 7045, 7046, + 7047, 7048, -1, -1, 7051, -1, 7053, -1, + -1, -1, -1, -1, 7055, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7056, -1, 7057, -1, -1, -1, + -1, 7058, -1, -1, -1, -1, -1, 7060, + 7061, -1, 7062, 7063, -1, 7065, -1, -1, + -1, -1, -1, -1, -1, -1, 7066, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + /* 0x8100 */ + -1, -1, -1, 7067, -1, 7069, 7071, 7073, + 7074, 7075, -1, 7076, -1, 7078, -1, 7079, + 7082, 7083, -1, 7085, 7086, -1, -1, 7087, + -1, -1, 7088, 7090, -1, -1, -1, -1, + -1, -1, -1, 7092, -1, -1, -1, -1, + -1, 7093, -1, 7094, -1, -1, -1, -1, + -1, 7095, -1, 7096, -1, 7099, 7100, -1, + 7101, 7102, 7104, -1, -1, -1, 7106, -1, + -1, -1, -1, -1, -1, -1, 7107, -1, + -1, -1, 7108, -1, 7110, -1, 7111, -1, + -1, -1, -1, -1, -1, -1, 7112, 7113, + 7114, -1, -1, -1, -1, -1, -1, 7115, + -1, 7116, -1, -1, -1, -1, 7117, -1, + -1, -1, -1, 7120, -1, 7121, 7122, -1, + -1, -1, -1, 7123, -1, -1, -1, -1, + 7125, -1, -1, 7127, -1, 7128, 7129, -1, + 7130, -1, 7131, 7132, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7133, 7134, -1, 7135, -1, 7137, -1, -1, + -1, -1, 7138, -1, -1, -1, -1, -1, + 7139, -1, -1, 7140, 7141, -1, -1, -1, + -1, 7142, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7143, -1, -1, -1, -1, + 7144, -1, -1, 7146, -1, 7150, 7152, 7153, + 7154, -1, -1, 7155, -1, -1, -1, -1, + 7157, 7159, -1, 7160, -1, 7161, -1, 7162, + -1, -1, -1, 7164, -1, -1, -1, -1, + 7166, 7168, 7169, -1, 7170, -1, 7171, 7172, + 7174, -1, 7175, -1, -1, 7176, -1, -1, + 7177, -1, -1, -1, -1, 7178, -1, -1, + 7179, -1, -1, -1, 7180, -1, -1, -1, + -1, -1, 7181, -1, -1, -1, -1, -1, + /* 0x8200 */ + -1, -1, -1, -1, -1, -1, 7183, 7184, + 7185, 7186, 7189, -1, -1, 7190, 7192, -1, + 7193, -1, -1, 7194, -1, -1, 7195, 7198, + 7201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7202, -1, -1, -1, -1, + -1, 7203, -1, -1, -1, -1, 7204, -1, + 7206, 7207, -1, -1, -1, 7208, 7209, -1, + -1, 7210, -1, 7211, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7213, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7214, -1, -1, -1, -1, -1, -1, + -1, -1, 7215, 7216, 7218, -1, 7219, -1, + -1, -1, 7220, 7222, -1, -1, -1, -1, + 7224, 7225, -1, 7227, -1, -1, 7231, 7235, + 7239, 7240, 7241, -1, -1, -1, -1, -1, + -1, -1, 7246, -1, -1, -1, -1, -1, + 7247, -1, -1, 7249, 7250, -1, -1, -1, + -1, -1, -1, -1, 7251, -1, -1, 7252, + -1, -1, -1, -1, 7253, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7254, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7255, 7256, -1, -1, -1, -1, -1, + 7257, -1, -1, 7264, -1, -1, -1, -1, + -1, 7265, -1, -1, -1, 7266, -1, 7268, + 7269, -1, -1, 7270, 7271, 7272, 7273, 7274, + 7279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7280, 7281, -1, -1, -1, -1, 7282, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7283, -1, -1, -1, -1, -1, -1, + -1, 7284, 7286, -1, -1, 7287, -1, -1, + /* 0x8300 */ + -1, -1, -1, 7288, -1, -1, -1, -1, + -1, -1, 7290, -1, -1, -1, 7292, 7293, + -1, 7294, -1, -1, 7295, 7296, -1, -1, + 7297, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7298, + -1, -1, -1, -1, -1, -1, -1, 7300, + 7301, -1, 7302, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7304, 7305, + -1, -1, 7306, -1, -1, -1, -1, -1, + 7307, 7309, -1, -1, 7310, -1, -1, -1, + 7311, 7313, 7314, 7315, 7316, 7317, 7318, 7319, + 7320, 7322, -1, 7325, 7327, 7328, 7329, 7330, + 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, + -1, -1, -1, 7341, -1, -1, -1, -1, + -1, 7342, -1, 7343, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7344, -1, -1, + -1, -1, 7346, -1, -1, -1, -1, -1, + -1, -1, -1, 7348, -1, 7349, 7350, -1, + -1, -1, -1, -1, -1, -1, 7351, -1, + -1, -1, 7352, -1, -1, -1, -1, 7353, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7354, 7355, 7356, 7357, 7358, 7359, 7360, + 7362, 7363, 7364, -1, 7367, 7369, 7370, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7371, -1, 7372, 7373, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7375, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7376, -1, -1, -1, 7377, + 7380, 7381, -1, -1, 7382, -1, -1, -1, + -1, 7385, -1, -1, -1, -1, -1, -1, + /* 0x8400 */ + -1, -1, -1, -1, -1, -1, -1, 7386, + -1, -1, 7387, -1, 7388, 7389, -1, -1, + -1, -1, -1, -1, -1, 7390, -1, -1, + -1, -1, 7392, -1, -1, 7393, -1, 7394, + 7399, -1, -1, -1, 7400, 7402, 7404, 7405, + 7406, -1, -1, -1, 7407, -1, -1, -1, + -1, 7408, -1, -1, 7411, 7412, -1, -1, + 7413, -1, -1, -1, 7414, -1, -1, -1, + -1, -1, -1, -1, -1, 7415, -1, -1, + -1, 7416, 7417, -1, -1, -1, -1, -1, + -1, -1, 7420, -1, -1, -1, -1, 7421, + 7422, -1, 7423, -1, -1, -1, -1, -1, + 7424, -1, 7425, -1, 7427, -1, 7428, -1, + -1, -1, 7429, -1, 7430, -1, 7431, 7432, + -1, 7433, -1, -1, -1, -1, -1, 7434, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7435, 7436, -1, -1, -1, 7437, + -1, 7438, -1, 7439, 7440, -1, -1, -1, + 7441, -1, -1, 7442, 7444, -1, -1, -1, + -1, 7445, -1, -1, -1, -1, 7449, -1, + -1, -1, -1, -1, -1, -1, 7451, -1, + 7452, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7453, + -1, -1, -1, -1, 7454, -1, -1, -1, + 7455, -1, -1, -1, -1, -1, 7456, -1, + -1, -1, -1, 7457, -1, -1, -1, -1, + -1, 7459, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7461, -1, 7462, + 7463, -1, -1, 7464, -1, 7465, 7466, -1, + -1, -1, -1, -1, -1, 7467, 7470, 7471, + -1, 7472, -1, -1, 7473, -1, -1, -1, + -1, -1, 7475, -1, -1, 7480, -1, -1, + /* 0x8500 */ + -1, -1, -1, -1, -1, 7481, 7483, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7484, 7485, -1, -1, 7486, 7488, -1, -1, + -1, -1, -1, -1, -1, -1, 7489, -1, + -1, -1, -1, 7490, -1, 7491, 7492, -1, + -1, -1, -1, -1, -1, 7493, -1, 7494, + -1, -1, 7495, 7496, 7497, 7498, 7500, 7502, + -1, 7503, 7504, 7505, 7506, -1, -1, -1, + -1, 7508, -1, -1, -1, -1, 7509, -1, + -1, -1, 7510, 7512, -1, -1, 7514, -1, + 7515, -1, 7517, 7518, -1, 7519, -1, -1, + 7520, -1, 7521, -1, -1, -1, -1, -1, + -1, -1, 7522, -1, -1, -1, -1, -1, + -1, 7523, 7524, -1, -1, 7525, -1, -1, + 7526, -1, 7527, -1, 7528, -1, -1, 7530, + -1, -1, -1, -1, -1, -1, -1, 7531, + 7534, -1, -1, -1, -1, -1, -1, -1, + 7535, -1, 7536, -1, 7538, -1, -1, -1, + -1, 7539, -1, 7540, 7541, -1, -1, 7542, + 7544, -1, -1, -1, -1, -1, -1, 7545, + -1, -1, -1, -1, -1, -1, 7546, -1, + -1, 7548, -1, 7549, 7551, 7553, 7554, 7556, + 7557, -1, 7559, -1, -1, -1, -1, -1, + -1, -1, 7561, -1, 7563, -1, -1, -1, + -1, 7564, 7568, -1, -1, -1, -1, -1, + -1, 7572, -1, -1, -1, 7575, 7576, 7577, + -1, -1, -1, 7579, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7580, -1, 7585, + -1, -1, -1, -1, 7587, 7588, -1, -1, + -1, -1, 7590, -1, -1, -1, -1, -1, + -1, -1, -1, 7592, 7596, -1, 7598, 7599, + -1, 7600, 7602, -1, 7603, -1, -1, -1, + /* 0x8600 */ + 7606, -1, 7607, -1, 7609, -1, 7610, 7611, + -1, -1, 7615, 7617, -1, 7619, 7621, -1, + 7623, -1, -1, 7626, -1, -1, -1, 7628, + -1, -1, 7629, -1, -1, -1, 7630, -1, + -1, -1, 7631, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7632, -1, 7633, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7635, -1, -1, 7636, -1, 7638, + -1, 7639, -1, -1, -1, -1, 7640, -1, + -1, -1, -1, -1, -1, -1, 7642, 7644, + -1, 7645, -1, 7646, -1, 7647, 7649, 7650, + -1, -1, 7652, 7654, 7656, 7657, -1, 7659, + -1, -1, -1, -1, -1, 7660, 7661, 7662, + -1, -1, -1, 7663, 7665, -1, 7666, 7667, + -1, 7668, -1, -1, -1, 7669, -1, -1, + -1, -1, 7671, 7672, -1, 7673, 7674, 7675, + 7676, 7677, 7678, 7679, -1, -1, -1, -1, + -1, -1, 7680, 7682, 7683, -1, -1, -1, + -1, -1, -1, -1, -1, 7684, 7687, -1, + 7688, -1, -1, -1, -1, 7689, -1, -1, + -1, -1, -1, -1, -1, -1, 7690, -1, + -1, -1, -1, 7691, 7692, -1, -1, -1, + -1, -1, -1, -1, 7693, -1, -1, -1, + -1, -1, 7694, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7695, + -1, -1, 7697, -1, -1, 7698, 7700, 7702, + -1, -1, -1, -1, 7703, -1, -1, -1, + -1, 7706, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7707, 7708, + 7709, 7710, 7711, 7712, 7713, -1, -1, -1, + -1, -1, 7714, 7715, -1, 7716, -1, -1, + /* 0x8700 */ + -1, -1, 7718, -1, -1, -1, 7719, -1, + -1, -1, -1, 7720, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7721, 7722, 7723, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7724, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7726, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7727, -1, -1, -1, 7728, -1, -1, + -1, -1, -1, -1, -1, 7729, -1, 7732, + 7734, 7735, -1, 7736, -1, -1, 7738, -1, + -1, -1, -1, -1, -1, 7739, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7740, + -1, 7741, -1, -1, -1, -1, 7742, -1, + 7743, -1, -1, -1, -1, -1, -1, 7744, + -1, 7745, -1, -1, -1, -1, -1, -1, + 7746, -1, -1, -1, 7747, -1, 7748, 7749, + 7751, -1, 7752, -1, 7753, -1, -1, -1, + 7754, -1, -1, -1, -1, 7755, 7756, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7757, 7758, -1, -1, -1, -1, 7760, -1, + -1, 7761, 7762, -1, 7764, -1, -1, 7766, + 7767, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7768, -1, -1, -1, 7769, + -1, 7770, -1, -1, 7771, -1, 7772, 7773, + 7774, -1, -1, -1, -1, -1, 7775, 7776, + -1, -1, 7777, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7778, -1, -1, -1, -1, + -1, -1, -1, -1, 7779, -1, -1, 7780, + -1, -1, 7781, -1, -1, -1, 7782, -1, + 7783, 7784, -1, 7785, -1, -1, -1, -1, + /* 0x8800 */ + -1, 7787, -1, -1, -1, 7788, 7790, 7791, + -1, -1, -1, -1, -1, 7793, 7794, 7795, + 7796, 7797, 7798, -1, 7801, 7802, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7803, + -1, 7805, 7806, 7807, -1, -1, -1, 7809, + 7811, -1, -1, -1, -1, 7812, -1, -1, + -1, 7813, -1, -1, -1, -1, 7814, -1, + -1, 7817, 7819, 7822, 7823, -1, -1, -1, + -1, -1, 7825, -1, 7826, 7827, 7828, -1, + -1, 7831, 7833, -1, -1, -1, -1, -1, + -1, -1, -1, 7834, 7835, 7838, 7839, -1, + 7840, -1, 7843, 7844, 7846, 7849, 7850, 7852, + -1, -1, -1, 7855, 7856, 7857, -1, -1, + 7858, -1, -1, -1, 7859, -1, 7860, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7861, -1, -1, -1, 7862, -1, -1, + -1, -1, -1, -1, 7863, 7864, 7867, -1, + -1, -1, -1, 7868, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7869, -1, 7872, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7873, 7875, 7876, 7877, + -1, -1, -1, -1, 7878, 7880, -1, 7881, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7882, 7883, -1, + 7884, -1, 7885, -1, 7886, -1, -1, 7887, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7889, -1, -1, 7890, 7891, -1, -1, + 7892, 7893, 7895, 7896, 7897, 7899, 7900, -1, + 7902, -1, -1, -1, -1, 7903, -1, -1, + -1, -1, -1, -1, 7904, 7905, -1, -1, + -1, -1, -1, -1, -1, 7906, -1, -1, + /* 0x8900 */ + -1, -1, -1, -1, -1, -1, -1, 7907, + -1, -1, 7908, -1, 7909, -1, 7910, 7911, + -1, -1, 7912, 7914, -1, -1, -1, -1, + 7915, -1, -1, 7916, -1, 7917, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7918, -1, -1, -1, -1, + -1, -1, 7919, 7920, 7921, -1, -1, -1, + 7922, -1, -1, 7923, -1, -1, -1, -1, + -1, -1, -1, 7924, -1, -1, -1, 7926, + -1, -1, -1, -1, 7927, 7928, -1, 7929, + -1, -1, -1, -1, -1, 7930, 7931, -1, + -1, -1, -1, -1, -1, 7932, -1, -1, + 7933, -1, -1, -1, 7934, -1, -1, -1, + -1, -1, 7935, -1, 7936, 7937, -1, 7938, + -1, -1, 7939, -1, 7940, -1, -1, -1, + -1, -1, -1, -1, -1, 7942, -1, 7943, + -1, -1, -1, -1, -1, -1, 7945, 7947, + 7948, 7949, 7952, 7956, -1, 7957, 7958, 7959, + 7960, -1, -1, 7963, 7965, -1, 7967, -1, + 7969, -1, 7970, -1, -1, -1, -1, -1, + -1, 7973, -1, -1, -1, 7974, 7975, 7976, + -1, 7978, 7979, -1, 7980, -1, -1, 7981, + 7982, -1, 7983, 7984, -1, -1, 7986, 7987, + -1, -1, 7989, -1, 7993, 7994, -1, 7996, + 7997, 7999, 8000, 8002, 8003, 8004, 8006, 8008, + 8009, 8011, 8014, 8015, 8016, 8017, 8018, 8019, + 8020, 8021, -1, -1, 8022, -1, -1, 8023, + -1, -1, -1, -1, -1, 8025, 8026, -1, + -1, -1, -1, 8027, -1, -1, 8028, 8029, + -1, -1, -1, -1, -1, -1, -1, 8030, + -1, -1, -1, -1, 8032, -1, 8033, -1, + 8035, 8036, -1, -1, -1, 8038, -1, 8040, + /* 0x8a00 */ + 8042, 8044, 8046, 8047, -1, -1, -1, -1, + 8048, -1, 8049, -1, 8050, -1, 8051, -1, + 8052, -1, 8053, 8054, -1, 8055, 8056, 8057, + 8059, -1, 8060, 8061, -1, 8062, -1, 8063, + 8064, 8066, 8068, 8069, -1, 8070, -1, -1, + -1, 8071, 8072, 8073, -1, 8074, -1, -1, + -1, 8075, -1, 8076, 8078, -1, 8079, -1, + -1, -1, 8081, 8082, 8083, 8085, -1, -1, + -1, 8086, -1, -1, -1, -1, 8087, -1, + -1, -1, -1, 8089, -1, 8091, 8092, -1, + 8093, -1, 8094, -1, 8095, 8096, 8097, 8098, + 8099, -1, -1, 8100, -1, -1, 8101, 8102, + 8103, 8104, 8105, 8106, -1, -1, 8107, 8108, + -1, 8109, -1, 8110, 8111, 8113, 8114, -1, + 8115, 8116, 8118, 8119, -1, 8120, -1, -1, + -1, -1, -1, -1, 8121, -1, -1, 8122, + -1, -1, -1, -1, 8123, 8124, 8125, 8126, + -1, 8127, 8128, -1, 8129, 8130, -1, -1, + -1, 8131, 8132, -1, -1, 8133, 8134, -1, + 8136, -1, 8138, -1, -1, -1, 8139, -1, + 8140, 8141, -1, 8142, 8143, 8144, 8145, -1, + 8146, -1, 8147, -1, 8149, 8151, -1, 8153, + 8154, -1, 8155, -1, -1, -1, 8156, -1, + -1, 8157, -1, -1, 8158, -1, 8160, 8161, + -1, -1, 8162, -1, 8163, -1, -1, 8164, + -1, 8165, -1, 8166, 8167, 8169, -1, 8170, + -1, 8171, 8172, -1, -1, -1, 8173, 8174, + -1, -1, -1, 8175, 8176, 8177, 8178, -1, + 8179, 8181, 8183, -1, 8184, -1, 8186, 8187, + -1, 8188, -1, 8189, 8191, 8197, 8198, -1, + -1, 8199, -1, 8200, -1, -1, 8202, 8203, + 8205, -1, 8206, -1, 8207, -1, 8209, -1, + /* 0x8b00 */ + 8210, 8211, 8212, -1, 8213, 8214, -1, -1, + -1, -1, 8215, -1, 8216, -1, 8217, -1, + 8218, -1, -1, -1, 8219, -1, 8220, 8221, + -1, 8222, 8223, 8225, -1, 8226, -1, -1, + 8227, 8229, -1, -1, -1, -1, -1, -1, + 8231, -1, 8232, 8233, 8235, 8236, -1, -1, + 8238, -1, -1, 8239, -1, -1, -1, -1, + -1, 8240, -1, -1, 8241, -1, 8243, -1, + -1, 8244, -1, -1, -1, -1, -1, -1, + -1, 8246, -1, -1, 8248, -1, 8249, 8250, + 8251, -1, -1, -1, -1, -1, 8252, -1, + 8254, 8255, 8256, 8257, 8259, -1, -1, 8261, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8262, 8264, -1, 8266, 8267, 8269, + 8271, 8272, 8273, -1, 8275, -1, -1, 8276, + 8277, -1, -1, -1, 8278, 8280, 8281, -1, + 8283, 8285, -1, 8287, -1, 8289, -1, -1, + -1, -1, 8290, 8292, 8293, 8295, 8297, -1, + 8300, -1, 8302, 8303, -1, 8305, 8306, -1, + -1, -1, 8307, -1, 8309, -1, 8310, -1, + 8311, 8313, 8314, 8315, 8316, 8317, 8318, 8319, + 8320, 8321, 8323, 8324, 8325, 8327, 8328, 8329, + 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, + 8338, 8339, 8341, 8342, 8343, 8344, 8346, 8347, + 8348, 8349, 8351, 8352, 8353, 8354, 8355, 8356, + 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, + 8365, 8366, 8368, 8369, 8370, 8371, 8372, 8373, + 8374, 8375, 8376, 8377, 8378, 8379, 8381, 8382, + 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, + 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, + 8400, 8401, 8403, 8404, 8405, 8407, 8408, 8409, + 8410, 8411, 8412, 8413, 8415, 8416, 8417, 8418, + /* 0x8c00 */ + 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, + 8427, 8428, 8429, 8431, 8432, 8433, 8434, 8435, + 8437, 8438, 8439, 8440, 8441, 8443, 8444, 8446, + 8447, 8448, 8450, 8451, 8452, 8453, 8454, 8455, + 8456, 8457, 8458, 8459, 8461, 8462, 8464, 8465, + 8466, 8467, 8468, 8470, 8472, 8473, 8474, 8476, + 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, + -1, -1, 8486, -1, -1, -1, -1, 8487, + 8490, -1, -1, -1, -1, -1, 8493, -1, + 8494, -1, 8495, -1, -1, -1, 8499, -1, + 8501, -1, -1, 8505, 8509, -1, -1, -1, + 8513, -1, 8514, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8515, -1, -1, -1, + -1, -1, -1, 8516, 8517, -1, 8518, -1, + -1, -1, -1, -1, -1, -1, 8519, -1, + -1, -1, 8520, 8521, 8522, -1, 8523, -1, + -1, -1, 8524, -1, -1, -1, -1, 8525, + -1, 8526, -1, 8527, 8528, 8529, 8531, -1, + -1, -1, 8532, 8533, 8534, -1, -1, -1, + 8535, -1, -1, 8536, 8537, 8539, 8541, 8542, + 8545, 8546, 8548, -1, -1, -1, -1, 8549, + 8550, 8551, 8552, 8553, 8554, 8555, 8558, 8561, + 8562, -1, 8563, 8564, 8567, -1, 8568, 8569, + 8570, -1, 8571, 8572, 8573, 8574, -1, 8575, + 8576, 8577, 8578, 8579, 8580, 8581, -1, 8582, + 8583, 8584, 8586, 8587, -1, 8588, 8590, -1, + -1, 8592, 8593, 8594, 8596, 8598, 8599, -1, + -1, 8600, 8601, 8602, 8604, -1, 8605, -1, + 8606, 8607, 8610, 8612, 8614, -1, 8616, 8617, + -1, -1, 8618, 8621, 8622, 8623, -1, -1, + 8624, -1, -1, -1, 8625, 8627, -1, 8628, + -1, -1, 8630, 8631, 8632, 8633, 8634, -1, + /* 0x8d00 */ + -1, 8635, -1, -1, 8637, 8638, -1, 8639, + 8640, -1, 8641, 8643, -1, 8646, -1, 8647, + 8648, -1, 8649, 8651, 8653, -1, 8654, 8655, + -1, -1, -1, 8658, 8659, 8660, 8662, 8663, + 8664, 8667, 8668, 8670, 8671, 8673, 8675, 8676, + 8677, 8679, 8680, 8681, 8682, 8683, 8684, 8685, + 8686, 8689, 8691, 8692, 8693, 8694, 8695, 8696, + 8697, 8698, 8699, 8700, 8701, 8702, 8703, 8704, + 8705, 8706, 8707, 8708, 8711, 8712, 8713, 8714, + 8715, 8716, 8717, 8719, 8720, 8721, 8724, 8725, + 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8734, + 8735, 8736, 8737, 8738, 8739, 8740, 8743, 8747, + 8748, 8749, 8750, 8751, 8752, -1, -1, -1, + -1, -1, 8754, -1, 8755, -1, -1, -1, + 8756, 8757, -1, -1, -1, 8758, 8759, -1, + -1, -1, -1, 8760, -1, -1, -1, 8765, + -1, 8766, 8767, -1, -1, -1, -1, -1, + -1, -1, -1, 8768, -1, -1, -1, -1, + -1, 8769, -1, -1, -1, 8770, -1, -1, + -1, 8771, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8772, -1, + 8773, -1, -1, -1, 8774, -1, -1, 8775, + -1, 8777, 8778, -1, -1, -1, -1, -1, + 8779, -1, -1, 8780, -1, -1, -1, -1, + -1, -1, -1, 8781, 8783, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8784, -1, + -1, 8785, -1, -1, -1, 8786, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8787, 8788, 8789, 8790, + 8791, 8792, 8793, 8794, 8795, -1, -1, -1, + /* 0x8e00 */ + -1, 8796, -1, -1, -1, -1, -1, -1, + 8798, -1, 8800, 8801, 8803, -1, -1, -1, + 8804, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8805, 8806, 8807, 8808, 8809, -1, -1, 8810, + 8811, -1, -1, -1, 8812, -1, -1, -1, + 8813, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8814, -1, -1, -1, + -1, -1, -1, 8815, 8817, -1, -1, 8818, + -1, 8819, 8820, -1, -1, 8821, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8822, + -1, -1, -1, 8823, 8824, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8826, -1, -1, -1, -1, -1, -1, -1, + -1, 8828, 8830, -1, -1, -1, -1, 8832, + -1, -1, 8833, 8834, 8835, -1, -1, 8836, + -1, 8837, 8838, 8841, -1, 8843, -1, 8845, + -1, 8846, 8847, 8848, -1, 8849, -1, -1, + -1, 8851, 8852, -1, 8853, -1, -1, -1, + -1, 8854, 8855, -1, -1, 8857, 8858, -1, + -1, -1, 8859, -1, 8861, 8862, -1, 8863, + 8864, 8868, 8869, 8870, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8871, -1, -1, -1, 8872, -1, 8875, -1, + -1, -1, 8879, 8880, 8881, 8882, -1, -1, + -1, 8883, 8884, -1, 8885, -1, -1, -1, + -1, -1, -1, 8886, -1, -1, -1, 8889, + -1, -1, 8890, 8892, 8894, -1, -1, -1, + -1, -1, -1, 8895, -1, -1, -1, -1, + 8896, -1, 8898, -1, -1, -1, 8899, -1, + 8902, 8903, 8904, 8905, 8906, 8907, 8909, -1, + /* 0x8f00 */ + 8910, -1, -1, 8911, -1, 8912, -1, 8913, + 8914, 8915, 8916, -1, 8917, -1, -1, 8919, + -1, -1, 8920, 8922, 8923, 8925, -1, -1, + -1, 8927, -1, 8929, 8931, 8933, 8934, 8935, + -1, 8936, -1, -1, -1, 8937, 8938, -1, + -1, 8939, 8941, -1, 8942, 8943, -1, 8944, + -1, -1, -1, 8945, -1, -1, 8946, -1, + 8947, -1, 8948, 8950, 8951, -1, 8952, 8953, + -1, 8954, 8957, -1, 8958, 8960, 8961, -1, + -1, 8962, -1, -1, -1, 8964, 8965, -1, + -1, -1, -1, -1, 8966, -1, -1, 8967, + -1, -1, -1, -1, 8968, -1, -1, 8969, + -1, 8971, 8972, -1, 8973, -1, 8974, 8975, + 8976, 8977, 8978, 8979, 8980, 8982, 8985, 8986, + 8988, 8990, 8991, 8992, 8993, 8994, 8995, 8996, + 8997, 8998, 8999, 9000, 9002, 9003, 9004, 9005, + 9006, 9007, 9008, 9009, 9010, 9012, 9013, 9015, + 9016, 9018, 9019, 9020, 9021, 9022, 9023, 9025, + 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, + 9034, 9035, 9036, -1, -1, 9037, 9040, 9043, + 9044, 9046, -1, -1, 9049, -1, 9052, 9053, + 9055, 9057, -1, 9060, -1, 9061, 9064, 9065, + -1, -1, 9068, -1, -1, 9069, 9070, -1, + -1, 9071, 9074, -1, -1, 9077, 9078, -1, + -1, 9080, 9081, 9082, -1, -1, 9083, 9084, + 9085, -1, 9086, -1, -1, -1, -1, -1, + 9088, -1, -1, -1, -1, -1, -1, -1, + 9089, 9090, -1, 9091, 9092, 9093, 9094, 9095, + -1, -1, -1, -1, 9098, 9099, -1, -1, + -1, 9100, 9101, -1, 9102, -1, -1, 9103, + -1, -1, -1, 9104, 9107, -1, -1, -1, + -1, 9113, 9115, -1, -1, -1, -1, -1, + /* 0x9000 */ + -1, -1, 9117, 9118, -1, -1, -1, -1, + 9119, 9120, 9121, -1, -1, -1, 9122, -1, + -1, -1, 9123, 9125, -1, 9127, -1, -1, + -1, 9130, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 9131, -1, 9132, 9138, -1, + -1, 9139, -1, -1, -1, -1, -1, -1, + 9140, 9142, 9143, -1, -1, -1, -1, -1, + -1, 9144, 9146, 9147, 9148, -1, -1, -1, + -1, 9149, -1, -1, -1, 9150, -1, -1, + -1, 9152, 9154, 9156, -1, -1, 9157, -1, + -1, -1, 9158, 9159, 9162, 9164, -1, 9165, + -1, 9166, -1, -1, 9167, -1, 9168, -1, + 9170, 9172, -1, -1, -1, 9173, -1, -1, + -1, 9174, -1, -1, -1, -1, -1, 9175, + -1, -1, 9176, -1, -1, -1, 9178, 9179, + 9180, -1, 9181, -1, 9182, -1, -1, -1, + -1, 9183, -1, -1, 9184, -1, -1, 9185, + -1, 9186, 9189, -1, -1, -1, -1, 9192, + 9193, 9194, -1, 9195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 9196, -1, -1, + -1, -1, -1, -1, -1, -1, 9197, -1, + 9198, -1, -1, 9199, 9200, -1, 9201, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 9202, 9203, 9204, -1, 9207, -1, -1, + -1, 9208, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 9211, -1, 9212, 9214, + 9215, 9216, 9217, 9219, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 9220, 9222, + -1, -1, -1, -1, -1, -1, 9223, 9224, + 9225, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 9226, 9227, 9228, + 9232, -1, -1, -1, -1, -1, -1, -1, + /* 0x9100 */ + -1, -1, -1, -1, -1, -1, 9233, -1, + -1, 9234, 9238, -1, -1, -1, -1, -1, + -1, -1, 9242, -1, 9243, 9244, 9248, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 9249, + -1, -1, -1, -1, -1, 9250, -1, -1, + 9251, -1, 9254, -1, 9255, -1, 9256, 9257, + -1, -1, 9258, -1, 9259, 9260, -1, -1, + -1, -1, 9263, -1, -1, -1, 9264, 9265, + 9267, 9268, -1, 9269, -1, -1, -1, -1, + -1, -1, -1, -1, 9270, -1, -1, -1, + -1, 9271, -1, -1, -1, 9272, -1, -1, + -1, -1, 9274, -1, -1, -1, 9275, 9278, + -1, -1, 9280, -1, 9281, -1, -1, -1, + -1, 9283, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 9285, 9286, 9287, + -1, -1, -1, 9289, -1, -1, -1, 9290, + -1, 9291, 9292, 9293, -1, -1, 9294, -1, + -1, -1, -1, -1, 9296, 9297, 9298, 9300, + 9303, -1, -1, -1, 9304, -1, 9306, -1, + -1, -1, -1, -1, 9308, -1, -1, -1, + -1, -1, -1, 9310, 9312, -1, -1, -1, + -1, 9314, -1, -1, -1, -1, -1, -1, + 9317, -1, -1, 9319, 9321, -1, -1, -1, + 9323, 9325, -1, 9326, -1, 9327, -1, 9328, + 9330, -1, 9332, 9334, 9336, -1, 9338, -1, + 9340, 9341, 9343, 9345, 9348, 9349, 9350, 9352, + 9353, 9354, 9355, -1, 9357, 9358, -1, -1, + 9359, 9361, -1, 9362, 9364, -1, 9365, 9366, + -1, 9367, -1, -1, -1, -1, -1, 9368, + 9369, -1, -1, -1, -1, 9377, -1, 9378, + -1, 9379, 9380, 9381, 9384, -1, -1, -1, + /* 0x9200 */ + 9392, 9393, -1, 9394, 9395, 9396, 9397, -1, + 9399, 9400, -1, -1, -1, 9401, 9402, -1, + 9404, 9405, 9406, -1, 9407, 9408, -1, -1, + -1, -1, -1, -1, -1, -1, 9409, 9411, + -1, 9412, -1, 9413, -1, 9414, 9415, 9416, + 9417, 9418, -1, -1, 9420, -1, 9422, -1, + 9424, -1, -1, 9425, 9426, -1, -1, 9427, + 9428, 9429, 9430, -1, -1, 9431, 9432, 9433, + 9434, -1, -1, -1, 9435, 9440, 9441, 9442, + 9443, 9444, -1, 9445, -1, 9447, -1, -1, + -1, 9448, -1, -1, -1, 9449, -1, 9450, + -1, -1, 9451, 9452, -1, -1, 9454, -1, + 9455, -1, 9456, -1, 9459, -1, 9461, -1, + 9462, -1, -1, -1, 9464, 9465, -1, -1, + -1, 9466, -1, -1, 9471, -1, 9475, -1, + 9476, -1, 9477, 9478, -1, -1, -1, 9479, + 9480, -1, -1, 9481, -1, 9482, -1, -1, + -1, -1, -1, -1, -1, 9483, -1, -1, + -1, 9484, -1, 9485, -1, 9486, 9490, -1, + 9491, -1, 9492, 9494, 9496, -1, 9499, -1, + 9500, -1, -1, 9501, -1, 9502, 9503, -1, + 9504, 9505, 9506, 9507, 9508, 9509, 9511, -1, + -1, 9512, 9513, 9514, -1, -1, -1, 9516, + -1, 9518, -1, 9519, 9520, 9521, -1, -1, + -1, 9522, -1, 9523, -1, 9524, -1, 9525, + -1, -1, -1, -1, 9526, -1, -1, 9527, + -1, -1, 9528, -1, -1, -1, -1, -1, + -1, 9529, -1, 9530, -1, 9535, -1, 9536, + -1, -1, -1, 9538, 9540, 9541, 9542, -1, + 9543, 9548, 9550, -1, -1, 9553, 9555, 9556, + 9557, 9558, -1, 9559, -1, -1, 9561, -1, + 9562, -1, -1, -1, 9563, -1, -1, -1, + /* 0x9300 */ + -1, 9564, -1, -1, 9565, -1, 9567, 9568, + 9569, -1, -1, -1, -1, -1, -1, 9570, + 9572, -1, 9573, -1, -1, 9574, -1, -1, + 9575, 9576, 9578, 9579, -1, -1, -1, 9580, + 9581, 9582, 9583, -1, -1, -1, 9585, -1, + 9586, 9587, -1, 9588, 9589, -1, 9592, 9593, + -1, -1, 9594, 9596, -1, -1, 9597, 9598, + 9599, -1, -1, -1, -1, -1, 9600, -1, + 9601, 9602, -1, 9603, -1, -1, 9604, 9605, + 9606, -1, 9608, 9611, -1, 9612, -1, -1, + -1, -1, -1, -1, 9613, -1, -1, -1, + 9614, -1, 9615, 9616, -1, -1, 9618, -1, + 9619, -1, -1, -1, 9621, 9622, -1, -1, + -1, 9623, -1, -1, 9624, -1, -1, 9625, + 9627, -1, -1, 9628, -1, 9632, 9633, -1, + -1, -1, 9634, -1, -1, -1, 9635, 9637, + -1, 9638, 9639, -1, 9640, -1, -1, 9641, + -1, -1, 9642, 9643, 9644, -1, -1, -1, + -1, -1, 9646, -1, 9648, -1, 9650, 9652, + 9653, -1, 9654, 9655, -1, -1, -1, -1, + -1, 9656, 9658, 9659, -1, -1, 9660, 9662, + -1, 9663, 9664, -1, 9665, 9666, 9668, -1, + 9670, -1, -1, 9671, -1, 9672, -1, -1, + 9673, -1, 9674, -1, -1, -1, -1, 9675, + -1, 9676, -1, 9677, -1, -1, -1, 9678, + 9679, -1, -1, -1, 9680, 9681, -1, -1, + 9682, 9683, -1, 9684, -1, -1, -1, 9685, + 9686, -1, -1, -1, 9687, 9688, 9689, 9690, + -1, 9694, 9696, -1, 9697, 9698, -1, -1, + 9700, -1, -1, -1, -1, -1, -1, -1, + 9701, -1, -1, -1, -1, 9702, -1, 9703, + -1, 9704, -1, -1, -1, 9705, -1, -1, + /* 0x9400 */ + -1, -1, 9707, 9709, -1, -1, -1, -1, + -1, -1, -1, 9710, -1, -1, -1, -1, + 9711, -1, 9712, 9713, 9714, -1, -1, 9715, + 9716, 9717, 9718, -1, -1, 9720, -1, -1, + 9722, 9723, -1, -1, -1, -1, 9728, 9729, + 9730, -1, -1, 9731, -1, -1, 9732, -1, + -1, -1, 9734, 9735, -1, 9736, 9741, -1, + 9742, -1, 9744, -1, -1, -1, -1, 9745, + -1, -1, -1, 9746, 9748, 9750, -1, -1, + -1, -1, 9751, -1, 9752, -1, -1, -1, + -1, 9753, 9757, 9761, 9762, 9763, -1, -1, + -1, -1, 9764, 9766, 9771, -1, 9773, -1, + 9774, -1, -1, 9775, 9776, 9777, -1, -1, + -1, -1, 9778, -1, 9780, 9784, -1, 9785, + 9786, 9787, 9788, -1, -1, 9789, -1, 9791, + -1, 9792, -1, -1, 9793, 9794, 9796, 9797, + -1, 9798, 9800, -1, -1, 9801, 9803, 9806, + 9807, 9808, 9809, 9810, 9811, 9812, 9813, 9814, + 9815, 9816, 9817, 9818, 9819, 9820, 9821, 9822, + 9823, 9824, 9825, 9826, 9827, 9828, 9829, 9830, + 9834, 9835, 9836, 9837, 9838, 9839, 9841, 9842, + 9843, 9844, 9846, 9847, 9848, 9849, 9850, 9851, + 9852, 9853, 9855, 9856, 9857, 9858, 9861, 9862, + 9863, 9864, 9865, 9866, 9869, 9870, 9871, 9872, + 9873, 9874, 9877, 9878, 9879, 9880, 9882, 9883, + 9885, 9886, 9887, 9889, 9890, 9892, 9893, 9895, + 9896, 9897, 9898, 9899, 9900, 9902, 9903, 9904, + 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, + 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, + 9921, 9922, 9923, 9924, 9926, 9927, 9928, 9929, + 9930, 9931, 9932, 9936, 9937, 9938, 9939, 9940, + 9941, 9943, 9944, 9947, 9948, 9949, 9950, 9951, + /* 0x9500 */ + 9953, 9954, 9955, 9956, 9957, 9959, 9960, 9961, + 9962, 9965, 9966, 9967, 9968, 9969, 9970, 9971, + 9973, 9975, 9976, 9977, 9978, 9979, 9980, 9981, + 9982, 9983, 9984, 9985, 9986, 9987, 9988, 9989, + 9990, 9991, 9992, 9993, 9994, 9996, 9997, 9998, + 9999, 10000, 10001, 10003, 10004, 10005, 10006, 10007, + 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, + 10016, 10017, 10018, 10020, 10021, 10022, 10023, 10024, + 10025, 10026, 10027, 10028, 10029, 10030, 10031, 10032, + 10034, 10035, 10036, 10037, 10038, 10040, 10041, 10042, + 10044, 10045, 10046, 10047, 10048, -1, 10049, 10050, + 10051, 10052, 10053, 10054, 10055, 10056, 10057, 10058, + 10059, 10060, 10061, 10063, 10064, 10065, 10066, 10067, + 10068, 10069, 10070, 10071, 10072, 10073, 10074, 10075, + 10076, 10078, 10079, 10080, 10081, 10082, 10083, 10084, + 10088, 10092, -1, -1, -1, -1, -1, 10094, + 10098, -1, 10099, 10100, -1, -1, 10101, 10102, + 10104, 10105, -1, 10107, 10108, -1, 10109, 10110, + -1, 10112, 10114, 10116, 10117, -1, -1, -1, + 10118, 10119, -1, -1, -1, -1, -1, -1, + 10121, 10123, 10124, 10127, 10128, 10129, -1, 10130, + 10131, 10132, -1, 10133, 10134, 10135, -1, -1, + -1, 10136, 10138, -1, 10140, -1, 10142, -1, + -1, 10143, -1, 10145, 10146, 10147, 10148, 10149, + -1, -1, -1, 10150, -1, -1, 10152, 10153, + 10154, -1, 10155, 10157, 10158, 10159, -1, -1, + 10160, -1, 10161, 10162, 10163, 10164, 10165, 10166, + 10169, 10174, -1, -1, 10180, -1, 10183, -1, + 10184, 10185, 10186, -1, 10187, 10188, -1, -1, + 10189, 10190, 10191, 10192, 10193, 10194, 10196, 10197, + 10198, 10200, 10201, 10203, 10204, 10205, 10206, 10207, + 10208, 10209, 10211, 10212, 10213, 10214, 10215, 10216, + /* 0x9600 */ + 10217, 10218, 10219, 10220, 10221, 10222, 10224, 10225, + 10226, 10227, 10229, 10230, 10231, 10232, 10233, 10234, + 10235, 10236, 10237, 10239, 10240, 10242, 10243, 10244, + 10245, 10246, 10247, 10249, 10250, 10251, -1, 10253, + -1, -1, -1, -1, -1, 10254, 10258, -1, + 10260, 10261, 10263, 10265, 10267, -1, -1, 10268, + -1, 10269, -1, 10270, 10272, 10276, 10277, -1, + 10279, -1, -1, 10280, -1, -1, -1, -1, + 10281, 10283, -1, -1, -1, 10285, 10286, 10287, + 10288, 10289, -1, -1, -1, 10290, -1, -1, + -1, -1, -1, -1, -1, 10291, 10294, -1, + 10295, -1, -1, -1, 10296, 10298, 10299, 10301, + -1, -1, -1, 10302, -1, 10304, 10305, -1, + 10312, 10313, -1, -1, -1, -1, -1, -1, + 10316, -1, -1, 10320, -1, -1, -1, 10321, + 10322, -1, 10323, 10326, -1, 10328, -1, 10330, + -1, 10332, 10334, -1, 10338, -1, -1, -1, + -1, -1, 10340, -1, 10341, -1, 10342, 10344, + 10345, -1, -1, -1, -1, 10348, 10350, -1, + -1, 10351, -1, 10352, -1, 10353, -1, 10360, + 10361, -1, -1, 10364, -1, -1, -1, -1, + 10367, -1, 10368, 10371, -1, -1, 10373, 10374, + -1, 10381, 10384, -1, 10385, -1, 10386, 10388, + 10390, -1, 10392, 10399, -1, 10400, 10401, -1, + -1, 10402, -1, -1, -1, -1, -1, 10404, + -1, -1, -1, 10406, -1, 10407, -1, 10408, + -1, 10409, -1, -1, -1, 10411, 10414, -1, + -1, 10415, 10416, 10417, 10419, 10421, 10422, 10425, + 10426, -1, 10428, 10429, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 10430, -1, 10431, 10432, -1, -1, 10433, 10434, + -1, -1, 10435, 10437, -1, -1, 10438, -1, + /* 0x9700 */ + -1, 10440, -1, -1, -1, -1, -1, -1, + -1, 10441, 10442, -1, -1, -1, -1, -1, + -1, 10445, -1, -1, -1, -1, -1, 10446, + -1, -1, 10447, 10450, -1, -1, -1, -1, + -1, 10453, 10454, -1, -1, -1, -1, 10455, + -1, -1, -1, -1, -1, 10458, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 10459, -1, -1, 10460, -1, 10464, -1, -1, + -1, 10465, 10466, -1, 10467, -1, 10468, -1, + 10469, 10472, 10473, -1, -1, 10477, 10484, 10491, + -1, 10498, 10500, 10502, 10503, -1, -1, -1, + -1, 10506, 10507, -1, 10508, 10509, -1, -1, + -1, -1, 10512, 10518, 10519, 10521, -1, 10522, + 10523, -1, -1, 10524, -1, 10526, -1, -1, + -1, 10529, -1, -1, 10532, -1, -1, -1, + -1, -1, -1, -1, -1, 10533, -1, -1, + 10534, -1, -1, -1, -1, -1, -1, -1, + -1, 10536, -1, 10538, 10539, 10540, -1, 10541, + -1, 10542, 10543, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 10544, + -1, -1, -1, -1, -1, -1, 10545, 10547, + 10549, -1, -1, -1, -1, -1, -1, 10550, + -1, 10551, 10553, -1, -1, 10554, -1, -1, + -1, 10555, -1, -1, -1, 10556, 10557, -1, + -1, 10558, -1, 10560, -1, -1, 10561, -1, + 10562, 10564, -1, 10565, 10566, 10567, -1, -1, + -1, -1, -1, 10569, -1, -1, -1, -1, + -1, 10570, -1, -1, 10571, 10574, 10575, -1, + -1, -1, -1, -1, 10576, -1, 10578, 10579, + 10582, 10584, 10585, 10586, 10587, 10589, 10590, 10591, + -1, 10592, 10593, -1, -1, 10595, -1, -1, + -1, -1, -1, 10596, -1, -1, -1, 10597, + /* 0x9800 */ + -1, 10598, 10599, 10600, -1, 10601, 10602, 10603, + 10604, -1, 10605, -1, 10606, -1, 10607, 10608, + 10609, 10610, 10611, 10612, -1, -1, -1, 10613, + 10614, -1, 10615, -1, 10617, -1, -1, -1, + -1, 10618, -1, -1, 10619, 10621, 10623, -1, + -1, -1, -1, -1, 10624, 10626, 10627, -1, + 10629, -1, 10631, -1, 10632, -1, -1, 10634, + 10635, 10637, 10641, 10645, 10646, 10648, 10652, -1, + -1, -1, -1, -1, -1, -1, 10653, -1, + -1, -1, -1, 10654, 10655, 10656, 10657, 10658, + -1, -1, 10660, 10661, 10662, 10664, 10666, -1, + 10667, 10668, 10669, 10671, -1, -1, 10673, -1, + -1, -1, 10674, -1, -1, 10675, -1, 10676, + -1, -1, -1, 10677, 10678, -1, -1, 10679, + 10681, 10682, -1, 10685, 10686, 10687, 10688, 10689, + 10690, 10691, 10692, 10693, 10695, 10696, 10697, 10698, + 10699, 10700, 10701, 10702, 10703, 10704, 10706, 10707, + 10708, 10710, 10711, 10713, 10714, 10715, 10716, 10717, + 10718, 10720, 10721, 10722, 10726, -1, 10727, 10729, + 10730, 10731, 10732, 10733, 10734, 10736, 10737, 10738, + 10739, 10741, 10742, 10743, 10744, 10745, 10746, 10747, + 10748, -1, -1, -1, -1, 10756, 10757, 10761, + -1, 10762, -1, 10763, -1, -1, 10764, 10765, + 10768, -1, 10769, 10770, 10771, -1, -1, -1, + 10772, -1, -1, 10773, 10775, -1, 10777, 10782, + 10783, -1, -1, -1, 10787, -1, 10792, 10798, + 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, + 10807, 10809, 10810, 10811, 10812, -1, 10813, 10814, + 10817, 10820, 10821, 10822, -1, 10823, -1, -1, + 10824, 10825, 10826, 10827, 10829, 10830, 10831, 10833, + 10835, -1, 10836, -1, 10838, -1, 10839, -1, + -1, -1, -1, -1, 10840, 10841, 10842, 10843, + /* 0x9900 */ + -1, -1, -1, 10844, 10845, 10846, -1, -1, + -1, 10848, 10851, -1, 10854, 10855, 10856, 10857, + 10858, 10859, 10860, 10862, -1, 10863, 10864, -1, + 10865, -1, 10867, 10868, 10869, -1, 10870, 10871, + 10872, 10874, -1, -1, -1, -1, -1, 10875, + 10879, -1, -1, -1, 10881, -1, -1, -1, + -1, 10882, -1, 10883, 10884, 10885, 10887, 10888, + -1, 10889, 10890, 10891, 10892, 10893, 10894, 10895, + -1, 10896, -1, 10897, -1, 10898, -1, -1, + 10899, 10900, 10901, 10902, 10903, 10904, 10905, -1, + -1, 10906, 10907, -1, -1, -1, -1, 10908, + -1, 10909, -1, -1, 10910, -1, 10911, 10912, + -1, -1, 10915, 10916, 10919, 10920, 10922, 10923, + 10925, 10926, 10927, 10928, 10929, 10930, 10931, 10933, + 10934, 10935, 10936, 10937, 10938, 10939, 10940, 10941, + 10943, 10944, 10945, 10946, 10947, 10949, 10950, 10951, + 10952, 10954, 10956, 10957, 10958, 10959, 10960, 10961, + 10962, 10964, 10965, 10966, 10967, 10968, 10969, 10970, + 10971, 10972, 10973, 10974, 10975, 10976, -1, -1, + -1, -1, -1, -1, -1, 10977, 10978, 10979, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 10980, 10981, 10982, -1, + -1, 10983, 10985, 10986, 10987, -1, -1, -1, + -1, 10988, -1, -1, -1, 10989, -1, 10990, + -1, 10992, -1, -1, 10993, 10995, 10997, -1, + 11001, -1, -1, -1, -1, -1, -1, -1, + 11005, 11006, 11007, -1, 11008, 11009, -1, -1, + 11010, 11011, -1, 11012, -1, 11013, 11015, 11017, + -1, 11018, 11021, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 11022, 11023, -1, + 11024, 11025, -1, -1, -1, 11026, -1, -1, + 11028, -1, -1, -1, -1, -1, -1, 11029, + /* 0x9a00 */ + -1, 11030, 11031, -1, -1, 11032, -1, -1, + -1, -1, -1, -1, -1, 11033, 11034, 11035, + 11036, -1, 11039, 11041, -1, -1, 11044, -1, + -1, 11045, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 11046, -1, -1, -1, + 11047, -1, -1, 11048, -1, 11049, 11050, -1, + 11053, -1, -1, -1, -1, -1, 11054, 11055, + 11057, -1, 11058, -1, -1, -1, 11059, -1, + 11060, 11061, 11062, 11063, 11064, 11065, -1, 11069, + -1, -1, 11070, -1, 11071, 11072, -1, 11073, + -1, 11074, 11077, -1, -1, 11078, -1, 11079, + -1, -1, 11082, 11083, -1, 11085, -1, 11086, + -1, -1, 11087, -1, 11089, 11090, 11092, -1, + -1, 11093, 11094, 11095, 11096, 11097, 11098, 11100, + 11101, 11102, 11106, 11107, 11109, 11111, 11112, 11113, + 11114, 11115, 11116, 11117, 11118, 11120, 11121, 11122, + 11124, 11125, 11126, 11129, 11130, 11131, 11132, 11133, + 11134, 11135, 11136, 11137, 11138, 11141, 11142, 11143, + 11144, 11145, 11146, 11147, -1, 11148, 11149, 11150, + 11151, 11153, 11154, 11156, 11157, 11158, 11160, 11161, + 11162, 11163, 11164, 11165, 11166, 11167, 11169, 11170, + -1, -1, -1, -1, -1, -1, -1, 11171, + -1, -1, -1, -1, -1, 11172, -1, -1, + -1, -1, -1, -1, -1, -1, 11176, -1, + -1, -1, -1, -1, 11177, 11179, -1, -1, + 11180, -1, -1, 11181, 11182, -1, -1, 11183, + -1, -1, 11184, 11185, 11187, 11191, 11193, 11194, + 11197, 11198, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 11199, 11201, 11202, -1, -1, + -1, 11203, 11205, -1, -1, 11207, 11208, 11210, + -1, -1, -1, -1, 11211, -1, -1, -1, + -1, 11213, -1, -1, -1, -1, -1, -1, + /* 0x9b00 */ + 11214, -1, 11215, -1, -1, -1, 11218, -1, + -1, -1, -1, -1, -1, 11219, -1, -1, + -1, -1, -1, 11220, -1, -1, -1, -1, + -1, -1, 11222, 11223, -1, -1, -1, -1, + -1, -1, 11224, 11227, -1, 11228, 11233, 11238, + 11240, 11241, 11242, 11247, -1, 11248, 11253, -1, + 11254, 11257, -1, -1, -1, -1, 11260, -1, + -1, 11261, -1, 11262, -1, -1, -1, -1, + 11264, -1, -1, -1, -1, -1, -1, 11265, + -1, 11266, -1, -1, -1, -1, 11267, -1, + 11269, -1, -1, -1, -1, -1, -1, 11274, + 11276, -1, 11277, 11278, -1, -1, -1, -1, + -1, -1, 11279, 11280, -1, -1, 11281, -1, + 11282, -1, -1, -1, -1, 11283, -1, 11284, + -1, -1, 11285, 11287, 11288, -1, -1, 11289, + -1, -1, 11290, -1, -1, -1, -1, -1, + -1, 11291, -1, 11292, -1, -1, -1, -1, + -1, 11293, 11295, 11296, -1, 11297, 11298, 11299, + 11300, 11301, 11302, 11303, -1, -1, -1, -1, + -1, -1, 11304, -1, 11305, 11306, 11309, -1, + -1, -1, -1, -1, -1, -1, 11310, 11311, + -1, -1, 11313, 11314, -1, 11315, 11316, -1, + -1, -1, -1, 11321, -1, -1, 11322, 11323, + -1, -1, 11325, 11326, -1, -1, 11327, -1, + 11328, 11329, -1, -1, -1, -1, -1, 11330, + -1, 11332, 11333, 11335, -1, -1, -1, -1, + -1, -1, 11336, -1, 11337, 11338, 11339, 11340, + 11342, -1, -1, 11343, -1, 11345, -1, -1, + -1, 11346, 11347, -1, 11348, -1, -1, 11349, + 11350, -1, 11351, 11352, -1, -1, -1, -1, + 11353, -1, -1, -1, 11354, 11355, -1, 11356, + -1, 11359, -1, -1, -1, 11360, -1, 11361, + /* 0x9c00 */ + 11362, 11364, 11365, 11366, -1, -1, -1, -1, + 11367, 11369, -1, -1, 11370, 11372, -1, 11374, + 11375, -1, 11377, 11378, -1, -1, -1, -1, + -1, -1, -1, 11379, 11381, -1, -1, 11382, + 11383, -1, -1, 11384, 11385, 11386, -1, -1, + 11388, 11390, -1, -1, -1, 11391, 11392, -1, + -1, 11393, 11394, 11396, -1, 11397, -1, 11398, + -1, 11399, 11400, 11402, 11403, -1, 11404, -1, + -1, -1, 11405, -1, -1, 11406, -1, -1, + 11407, 11408, -1, -1, -1, -1, -1, -1, + -1, -1, 11411, 11412, 11413, -1, 11414, 11415, + 11416, -1, -1, -1, -1, 11417, 11418, 11419, + 11420, -1, -1, 11421, 11422, -1, -1, 11423, + 11424, -1, -1, -1, -1, 11425, 11426, 11427, + -1, -1, -1, -1, -1, -1, 11428, 11431, + 11433, -1, 11435, 11436, 11441, 11442, 11443, 11444, + 11445, 11446, 11447, -1, 11448, 11449, 11450, 11451, + 11452, 11454, 11455, 11456, 11457, 11458, 11460, 11461, + 11462, 11463, 11464, 11465, 11466, 11467, 11468, 11469, + 11470, 11471, 11472, 11473, 11474, 11479, 11480, 11482, + 11483, 11485, 11486, 11487, 11488, 11489, 11490, 11491, + 11492, 11493, 11495, 11496, 11497, 11498, 11499, 11500, + 11501, 11502, 11503, 11504, 11505, 11506, 11507, 11508, + 11510, 11511, 11512, 11513, 11514, 11515, 11516, 11517, + 11518, 11519, 11520, 11521, 11522, 11524, 11526, 11527, + 11528, 11529, 11530, 11531, 11532, 11534, 11535, 11536, + 11537, 11538, 11539, 11540, 11541, 11542, 11544, 11546, + 11547, 11548, -1, 11549, 11550, 11551, 11553, 11554, + 11555, 11556, 11557, 11558, -1, 11559, -1, 11561, + -1, 11563, -1, 11564, 11566, -1, -1, -1, + -1, -1, 11567, 11568, 11569, -1, 11570, -1, + 11571, -1, -1, -1, -1, -1, -1, -1, + /* 0x9d00 */ + -1, -1, -1, -1, -1, -1, 11572, 11573, + 11574, 11576, -1, -1, -1, -1, 11578, -1, + -1, -1, 11580, -1, -1, 11581, -1, -1, + -1, -1, -1, 11582, -1, 11583, 11585, 11586, + -1, -1, -1, 11588, -1, -1, 11589, -1, + 11590, -1, -1, -1, 11591, -1, -1, 11593, + 11594, -1, -1, 11595, 11596, -1, -1, -1, + -1, -1, -1, 11597, 11598, -1, -1, 11599, + -1, -1, 11600, 11601, 11602, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 11603, 11604, 11605, 11606, -1, -1, -1, -1, + -1, 11607, -1, -1, 11608, 11609, 11611, -1, + 11613, 11614, -1, -1, -1, -1, -1, -1, + -1, -1, 11615, -1, 11616, -1, 11617, 11618, + 11619, -1, 11620, -1, -1, -1, 11621, 11623, + -1, -1, -1, -1, -1, -1, 11624, -1, + -1, -1, -1, -1, -1, -1, -1, 11626, + -1, 11628, 11629, -1, -1, -1, -1, 11630, + -1, -1, -1, 11633, -1, -1, 11634, -1, + 11635, -1, 11636, -1, -1, -1, -1, -1, + -1, 11637, -1, -1, 11638, 11639, -1, -1, + -1, 11640, 11641, 11642, 11644, -1, -1, 11645, + -1, -1, 11647, -1, 11648, 11655, -1, -1, + -1, 11656, 11657, 11658, 11659, -1, -1, 11660, + 11661, 11662, 11663, 11664, 11665, -1, 11668, -1, + 11669, 11670, 11671, -1, -1, -1, -1, 11672, + -1, -1, -1, 11673, -1, -1, 11674, 11675, + -1, 11677, 11678, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 11679, 11680, -1, + -1, -1, -1, 11681, -1, -1, -1, 11682, + 11683, -1, 11684, 11685, 11687, -1, -1, -1, + 11689, 11690, 11691, -1, -1, 11693, -1, 11694, + /* 0x9e00 */ + -1, -1, -1, -1, -1, -1, -1, 11695, + -1, -1, 11696, -1, 11697, -1, 11698, 11699, + -1, -1, -1, -1, -1, 11700, 11703, -1, + 11710, -1, 11711, 11712, 11714, 11715, 11716, 11717, + 11719, 11720, 11723, 11724, 11725, 11726, 11728, 11730, + 11731, 11732, 11733, 11734, 11736, 11737, 11738, 11739, + 11740, 11741, 11742, 11743, 11744, 11745, 11746, 11747, + 11748, 11749, 11750, 11751, 11752, 11753, 11754, 11755, + 11756, 11757, 11758, 11759, 11760, 11761, 11763, 11764, + 11766, 11767, 11768, 11769, 11770, 11771, 11772, 11773, + 11774, 11775, 11776, 11777, 11778, 11779, 11780, 11781, + 11782, 11783, 11784, 11786, 11787, 11788, 11789, 11790, + 11791, 11792, 11793, 11794, 11795, 11802, 11803, 11804, + 11805, 11806, 11807, 11808, 11809, 11810, -1, 11811, + 11812, 11813, 11814, 11815, 11816, 11817, -1, -1, + 11819, 11822, 11824, 11825, 11826, 11829, 11831, -1, + -1, -1, -1, 11832, 11833, 11834, -1, 11835, + -1, -1, -1, -1, -1, -1, -1, 11836, + -1, -1, -1, -1, -1, -1, -1, 11837, + -1, -1, -1, -1, -1, -1, 11839, -1, + -1, -1, -1, -1, 11840, 11842, 11843, -1, + -1, 11844, 11846, 11851, 11856, 11858, -1, 11859, + -1, -1, -1, -1, 11863, 11867, -1, -1, + 11872, 11874, 11878, 11883, 11886, 11890, -1, -1, + -1, -1, -1, 11894, 11895, -1, -1, -1, + -1, 11897, -1, -1, 11898, -1, -1, 11899, + -1, 11900, 11901, -1, -1, -1, -1, -1, + 11902, 11903, -1, 11904, -1, -1, 11905, -1, + -1, 11907, -1, -1, 11908, -1, -1, -1, + 11909, 11910, 11911, -1, -1, 11912, -1, -1, + -1, 11913, 11914, -1, 11915, -1, 11916, 11917, + -1, 11918, -1, -1, -1, 11919, 11920, 11921, + /* 0x9f00 */ + -1, -1, 11923, 11924, -1, -1, -1, 11925, + 11927, 11930, -1, 11931, 11932, 11933, 11934, -1, + -1, 11935, 11936, 11937, -1, 11939, -1, 11940, + -1, -1, -1, -1, -1, -1, -1, -1, + 11942, 11943, -1, -1, -1, -1, 11944, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 11945, -1, -1, -1, + -1, 11946, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 11947, -1, -1, + -1, -1, 11948, 11952, -1, -1, 11954, 11956, + 11958, 11962, 11964, 11966, 11967, 11969, -1, 11970, + -1, 11971, 11972, -1, 11973, -1, -1, 11974, + 11975, 11976, 11978, 11980, -1, -1, 11981, 11982, + -1, 11985, 11986, -1, 11988, -1, -1, -1, + 11989, 11990, 11991, -1, -1, -1, 11992, 11993, + -1, -1, -1, -1, -1, -1, -1, 11994, + 11996, 11997, 11998, 11999, 12000, 12002, 12003, 12004, + 12005, 12006, 12007, 12008, 12009, 12010, 12013, -1, + 12014, -1, 12015, -1, 12018, 12019, -1, -1, + -1, 12020, 12022, 12023, 12024, 12026, 12029, 12031, + -1, -1, 12033, -1, -1, 12036, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, +}; + diff --git a/Externals/libiconv-1.14/lib/cns11643.h b/Externals/libiconv-1.14/lib/cns11643.h new file mode 100644 index 0000000000..5b16641254 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 + */ + +/* ISO-2022-CN and EUC-TW use CNS 11643-1992 planes 1 to 7. We also + * have a table for the older plane 15. We use a trick to keep the + * Unicode -> CNS 11643 table as small as possible (see cns11643_inv.h). + */ + +#include "cns11643_1.h" +#include "cns11643_2.h" +#include "cns11643_3.h" +#include "cns11643_4.h" +#include "cns11643_5.h" +#include "cns11643_6.h" +#include "cns11643_7.h" +#include "cns11643_15.h" +#include "cns11643_inv.h" + +/* Returns the plane number (1,...,7,15) in r[0], the two bytes in r[1],r[2]. */ +#define cns11643_wctomb cns11643_inv_wctomb diff --git a/Externals/libiconv-1.14/lib/cns11643_1.h b/Externals/libiconv-1.14/lib/cns11643_1.h new file mode 100644 index 0000000000..24abb5ccbd --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_1.h @@ -0,0 +1,893 @@ +/* + * Copyright (C) 1999-2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 1 + */ + +static const unsigned short cns11643_1_2uni_page21[500] = { + /* 0x21 */ + 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x30fb, 0xff1b, 0xff1a, + 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, + 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe31, 0x2014, 0xfe32, + 0x2013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff08, 0xff09, 0xfe35, + 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, + 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, + 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, + 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, + 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, + 0x301e, 0x2032, 0x2035, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, + 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, + 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, + /* 0x22 */ + 0x32a3, 0x2105, 0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, + 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, + 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, + 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, + 0xfe64, 0xfe66, 0xfe65, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, + 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, + 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2192, 0x2190, + 0x2196, 0x2197, 0x2199, 0x2198, 0x2016, 0xff5c, 0xff0f, 0xff3c, + 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1, 0xff05, + 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, + 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, + 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, + /* 0x23 */ + 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, + 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, + 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, + 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, + 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, + 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x24 */ + 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, + 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, + 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, + 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, + 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, + 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, + 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, + 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, + 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, + 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, + 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, + /* 0x25 */ + 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, + 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, + 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, + 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, + 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, + 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, + 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x26 */ + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247a, 0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173, + 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, +}; +static const unsigned short cns11643_1_2uni_page42[34] = { + /* 0x42 */ + 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, + 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, + 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, + 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, + 0x2421, 0x20ac, +}; +static const unsigned short cns11643_1_2uni_page44[5401] = { + /* 0x44 */ + 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, + 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, + 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, + 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, + 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, + 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, + 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, + 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, + 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, + 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, + 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, + 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, + /* 0x45 */ + 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, + 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, + 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, + 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, + 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, + 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, + 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, + 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, 0x4e16, + 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, + 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, + 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, + 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, + /* 0x46 */ + 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, + 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, + 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, + 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, + 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, + 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, + 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, + 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, + 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, + 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, + 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, + 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, + /* 0x47 */ + 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, + 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, + 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, + 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, + 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, + 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, + 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, + 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, + 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, + 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, + 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, + 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, + /* 0x48 */ + 0x5e74, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, + 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, + 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, + 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, + 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, + 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, + 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, + 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, + 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, + 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, + 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, + 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, + /* 0x49 */ + 0x4f63, 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, + 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, + 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, + 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, + 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, + 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, + 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, + 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, + 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, + 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, + 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, + 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, + /* 0x4a */ + 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, + 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, + 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, + 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, + 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, + 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, + 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, + 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, + 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, + 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, + 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, + 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, + /* 0x4b */ + 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, + 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, + 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, + 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, + 0x8292, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, + 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, + 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, + 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, + 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, + 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, + 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, + 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, + /* 0x4c */ + 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, + 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, + 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, + 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, + 0x5475, 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, + 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, + 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, + 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, + 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, + 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, + 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, + 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, + /* 0x4d */ + 0x5c48, 0x5c45, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, + 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, + 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, + 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, + 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, + 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, + 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, + 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, + 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, + 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, + 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, + 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, + /* 0x4e */ + 0x6615, 0x660a, 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, + 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, + 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, + 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, + 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, + 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, + 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, + 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, + 0x6ce0, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, + 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, + 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, + 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, + /* 0x4f */ + 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, + 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, + 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, + 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, + 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, + 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, + 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, + 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, + 0x9644, 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, + 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, + 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, + 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, + /* 0x50 */ + 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, + 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, + 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, + 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, + 0x54aa, 0x54c1, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, + 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, + 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, + 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, + 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, + 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, + 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, + 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, + /* 0x51 */ + 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, + 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, + 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, + 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, + 0x62f1, 0x62f7, 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, + 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, + 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, + 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, + 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, + 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, + 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, + 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, + /* 0x52 */ + 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, + 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, + 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, + 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, + 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, + 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, + 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, + 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, + 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, + 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, + 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, + 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, + /* 0x53 */ + 0x7f8e, 0x7fbf, 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, + 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, + 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, + 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, + 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, + 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, + 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, + 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, + 0x8fe5, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, + 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, + 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, + 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, + /* 0x54 */ + 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, + 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, + 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, + 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, + 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, + 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, + 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, + 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, + 0x54ea, 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, + 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, + 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, + 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, + /* 0x55 */ + 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, + 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, + 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, + 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, + 0x5f90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, + 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, + 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, + 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, + 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, + 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, + 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, + 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, + /* 0x56 */ + 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, + 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, + 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, + 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, + 0x6d59, 0x6d93, 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, + 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, + 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, + 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, + 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, + 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, + 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, + 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, + /* 0x57 */ + 0x781d, 0x7834, 0x7837, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, + 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, + 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, + 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, + 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, + 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, + 0x7fc1, 0x8006, 0x8004, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, + 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, + 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, + 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, + 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, + 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, + /* 0x58 */ + 0x8340, 0x8331, 0x8328, 0x8343, 0x8654, 0x868a, 0x86aa, 0x8693, + 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, + 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, + 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, + 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, + 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, + 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, + 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, + 0x9662, 0x9663, 0x9661, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, + 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, + 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, + 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, + /* 0x59 */ + 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, + 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, + 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, + 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, + 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, + 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, + 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, + 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, + 0x5a66, 0x5a6a, 0x5a40, 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, + 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, + 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, + 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, + /* 0x5a */ + 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, + 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, + 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, + 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, + 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, 0x60bb, 0x60b5, 0x60dc, + 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, + 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, + 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, + 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, + 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, + 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, + 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, + /* 0x5b */ + 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, + 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, + 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, + 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, + 0x68a1, 0x6882, 0x6b32, 0x6bba, 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, + 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, + 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, + 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, + 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, + 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, + 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, + 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, + /* 0x5c */ + 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, 0x751c, 0x7522, + 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, + 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, + 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, + 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, + 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, + 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, + 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, + 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, + 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, + 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, + 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, + /* 0x5d */ + 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, 0x8386, 0x83a7, 0x8655, + 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, + 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, + 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, + 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, + 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, + 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, + 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, + 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, 0x90ed, 0x90fd, 0x9157, + 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, + 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, + 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, + /* 0x5e */ + 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, + 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, + 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, + 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, + 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, + 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, + 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, + 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, + 0x5820, 0x58f9, 0x58fa, 0x5960, 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, + 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, + 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, + 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, + /* 0x5f */ + 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, + 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, + 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, + 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, + 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, 0x63e3, 0x63d0, + 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, + 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, + 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, + 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, + 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, + 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, + 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, + /* 0x60 */ + 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, + 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, + 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, + 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, + 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, 0x6e89, 0x6e19, 0x6e4e, + 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, + 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, + 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, + 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, + 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, + 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, + 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, + /* 0x61 */ + 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, 0x7a96, + 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, + 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, + 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, + 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, + 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, + 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, + 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, + 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, + 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, + 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, + 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, + /* 0x62 */ + 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, 0x8a54, 0x8a5b, + 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, + 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, + 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, + 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, + 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, + 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, + 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, + 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, 0x9592, 0x958e, + 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, + 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, + 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, + /* 0x63 */ + 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, + 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, + 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, + 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, + 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, + 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, + 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, + 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, + 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, 0x5ab3, 0x5ac2, 0x5ab2, + 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, + 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, + 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, + /* 0x64 */ + 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, + 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, + 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, + 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, + 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, 0x6977, + 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, + 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, + 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, + 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, + 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, + 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, + 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, + /* 0x65 */ + 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, + 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, + 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, + 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, + 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, 0x7779, 0x776a, + 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, + 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, + 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, + 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, + 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, + 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, + 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, + /* 0x66 */ + 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, + 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, + 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, + 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, + 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, + 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, + 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, + 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, + 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, + 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, + 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, + 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, + /* 0x67 */ + 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, 0x8f9f, + 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, + 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, + 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, + 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, + 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, + 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, + 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, + 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, 0x98fe, + 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, + 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, + 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, + /* 0x68 */ + 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, + 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, + 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, + 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, + 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, + 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, + 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, + 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, + 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, 0x613f, 0x614b, + 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, + 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, + 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, + /* 0x69 */ + 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, + 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, + 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, + 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, + 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, + 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, + 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, + 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, + 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, + 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, + 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, + 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, + /* 0x6a */ + 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, + 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, + 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, + 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, + 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, 0x7f70, + 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, + 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, + 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, + 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, + 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, + 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, + 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, + /* 0x6b */ + 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, + 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, + 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, + 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, + 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, + 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x92ac, + 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, + 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, + 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, + 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, + 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, + 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, + /* 0x6c */ + 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, + 0x51dc, 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, + 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, + 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, + 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, + 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, + 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, + 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, + 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, + 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, + 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, + 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, + /* 0x6d */ + 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, + 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, + 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, + 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, + 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, + 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, + 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, + 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, + 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, + 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, + 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, + /* 0x6e */ + 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, + 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, + 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, + 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, + 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, + 0x7faf, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, + 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, + 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, + 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, + 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, + 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, + 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, + /* 0x6f */ + 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, + 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, + 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, + 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, + 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, + 0x8f1e, 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, + 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, + 0x92bb, 0x92b7, 0x92ea, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, + 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, + 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, + 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, + 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, + /* 0x70 */ + 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, + 0x9d09, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, + 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, + 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, + 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, + 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, + 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, + 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, + 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, + 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, + 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, + 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, + /* 0x71 */ + 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, + 0x6fa1, 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, + 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, + 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, + 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, + 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, + 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, + 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, + 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, + 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, + 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, + 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, + /* 0x72 */ + 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, + 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, + 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, + 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, + 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, + 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, + 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, + 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, + 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, + 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, + 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, + 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, + /* 0x73 */ + 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, + 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, + 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, + 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, + 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, + 0x5687, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, + 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, + 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, + 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, + 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, + 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, + 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, + /* 0x74 */ + 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, + 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, + 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, + 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, + 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, + 0x77ac, 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, + 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, + 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, + 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, + 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, + 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, + 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, + /* 0x75 */ + 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, + 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, + 0x859b, 0x8587, 0x85a8, 0x858a, 0x85a6, 0x8667, 0x87c0, 0x87d1, + 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, + 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, + 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, + 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, + 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, + 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, + 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, + 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, + 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, + /* 0x76 */ + 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, + 0x98b6, 0x9935, 0x9a01, 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, + 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, + 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, + 0x5f5e, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, + 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, + 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, + 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, + 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, + 0x7656, 0x7658, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, + 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, + 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, + /* 0x77 */ + 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, + 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, + 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x87ef, 0x87ec, + 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, + 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, + 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, + 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, + 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, + 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, + 0x97a6, 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, + 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, + 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, + /* 0x78 */ + 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, + 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x56a8, 0x58de, 0x58df, 0x58e2, + 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, + 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, + 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, + 0x7258, 0x72a2, 0x7378, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, + 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, + 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, + 0x7e79, 0x7e69, 0x7e6a, 0x7e73, 0x7f85, 0x7fb6, 0x7fb9, 0x7fb8, + 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, + 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, + 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, + /* 0x79 */ + 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, + 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, + 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, + 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, + 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, + 0x97dc, 0x97fb, 0x985e, 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, + 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, + 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, + 0x52f8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, + 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, + 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, + 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, + /* 0x7a */ + 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, + 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, + 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, + 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, + 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, + 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, + 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, + 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, + 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, + 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, + 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, + 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, + /* 0x7b */ + 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, + 0x896c, 0x89bd, 0x8b74, 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, + 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, + 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, + 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, + 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, + 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, + 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, + 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, + 0x766e, 0x766c, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, + 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, + 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, + /* 0x7c */ + 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, + 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, + 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, + 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, + 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, + 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, + 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, + 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, + 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, + 0x8b93, 0x8b92, 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, + 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, + 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, + /* 0x7d */ + 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, + 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, + 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, + 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, + 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, + 0x9e1b, 0x9e1e, 0x7c72, +}; + +static int +cns11643_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x27) || (c1 == 0x42) || (c1 >= 0x44 && c1 <= 0x7d)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 3102) { + if (i < 500) + wc = cns11643_1_2uni_page21[i]; + else if (i == 571) + wc = 0x4ea0; + else if (i == 578) + wc = 0x51ab; + else if (i == 583) + wc = 0x52f9; + } else if (i < 3290) { + if (i < 3136) + wc = cns11643_1_2uni_page42[i-3102]; + } else { + if (i < 8691) + wc = cns11643_1_2uni_page44[i-3290]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_15.h b/Externals/libiconv-1.14/lib/cns11643_15.h new file mode 100644 index 0000000000..cfe0ba69bc --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_15.h @@ -0,0 +1,1083 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 15 + */ + +static const unsigned short cns11643_15_2uni_page21[7169] = { + /* 0x21 */ + 0x5302, 0x538c, 0x53d4, 0x54a5, 0x5392, 0x5393, 0x53d8, 0x53d9, + 0x54a7, 0x592b, 0x592c, 0x592d, 0x5930, 0x592e, 0x59ab, 0x1a01, + 0x5c2d, 0x5c6d, 0xfa34, 0x5d0f, 0x52fd, 0x5e9d, 0x64a2, 0x68d4, + 0x6e56, 0x6ec3, 0x7314, 0x52fd, 0x9a1a, 0x530f, 0x5310, 0x539a, + 0x539b, 0x52fd, 0x54ac, 0x0036, 0x5397, 0x5846, 0x0e4f, 0x5876, + 0x5877, 0x58ae, 0x593a, 0x597d, 0x6ec5, 0x5ea8, 0x52fd, 0x1afa, + 0x6541, 0x6542, 0x68d8, 0x68d9, 0x69aa, 0x69ab, 0x6c42, 0x6c41, + 0x5099, 0x6ec6, 0x52fd, 0x7035, 0x7036, 0x7037, 0xfa83, 0xb64d, + 0x52fd, 0x74b5, 0x7617, 0x7782, 0x86b6, 0x2d49, 0x8f72, 0x985c, + 0x98a8, 0x45b7, 0x68e3, 0x0006, 0x52fd, 0x53e6, 0x5444, 0x5445, + 0x1729, 0x003e, 0x54c4, 0x54c5, 0x54c6, 0x54c7, 0x54c8, 0x54c9, + 0x54ca, 0x54d4, 0x587d, 0xb572, 0x58b2, 0x58b4, + /* 0x22 */ + 0x5982, 0x59c7, 0x59c8, 0x52fd, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, + 0xfa24, 0x5bd3, 0x5447, 0x1a4e, 0x5d3d, 0x5de2, 0x5eb8, 0x5eb9, + 0x5ec2, 0x5eba, 0x5ec6, 0x5ebb, 0x64ad, 0x654c, 0x654d, 0x52fd, + 0x69b2, 0x69b3, 0x69b4, 0x69b5, 0x6cc3, 0x6cc4, 0x6cc5, 0x6cc6, + 0x6cc7, 0x52fd, 0x6ece, 0x6f30, 0x7047, 0x7048, 0x2281, 0x735c, + 0x52fd, 0x735f, 0x7618, 0x7619, 0x767e, 0x2410, 0x78b0, 0x7d75, + 0x2568, 0x7d76, 0x8341, 0x8442, 0x52fd, 0x86bd, 0x2842, 0x2840, + 0x18ea, 0x8e1e, 0x8e1f, 0x8f87, 0x2d62, 0x8f78, 0x9488, 0x9489, + 0x948a, 0x9917, 0x9915, 0x52fd, 0x52fd, 0x3291, 0xa3e5, 0xa909, + 0xaa3b, 0xaa4f, 0x52fd, 0xb92e, 0xb92f, 0xbdff, 0xbdfd, 0xbdfe, + 0x45bb, 0x45bc, 0x52fd, 0x5323, 0x53ea, 0x542a, 0x5449, 0x544a, + 0x544b, 0x54df, 0x54e0, 0x54e1, 0x54e2, 0x58c1, + /* 0x23 */ + 0x54e3, 0x54e4, 0x54e5, 0x58c0, 0x54e6, 0x54f7, 0x52fd, 0x54e7, + 0x54e8, 0x54e9, 0x54ea, 0x54eb, 0x580e, 0x5880, 0x5881, 0x58ba, + 0x58bb, 0x58bc, 0x58bd, 0x593f, 0x5940, 0x5988, 0xfa1f, 0x5b46, + 0x52fd, 0x5b47, 0x5b48, 0x5c36, 0x5c72, 0x5c96, 0x5d47, 0x5de7, + 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5ee3, 0x5ee4, 0x5ee5, 0x5eeb, + 0x0175, 0x5ee6, 0x5ee7, 0x5ee8, 0x52fd, 0x52fd, 0x64b9, 0x1de8, + 0x64ba, 0x1e5b, 0x6563, 0x6564, 0x52fd, 0x6565, 0x52fd, 0x6566, + 0x657c, 0x6567, 0xfa5a, 0x6859, 0x68e9, 0x68ea, 0x68eb, 0x68ec, + 0x68ed, 0x68ee, 0x68ef, 0x69bf, 0x69cb, 0x69c3, 0x69d5, 0x69c4, + 0x69c5, 0x69d3, 0x69c6, 0x69c7, 0x69c8, 0x69c9, 0x69ca, 0x6c4a, + 0x52fd, 0x6cd1, 0x6e61, 0x6f37, 0x52fd, 0x7064, 0x7066, 0x2299, + 0x7067, 0x7068, 0x7069, 0x2297, 0x7073, 0x706a, + /* 0x24 */ + 0x706b, 0x2862, 0x52fd, 0x7372, 0x043c, 0x74b9, 0x761c, 0x7636, + 0x76bc, 0x76be, 0x76bf, 0x76c0, 0x7787, 0x78dc, 0x78dd, 0x78f5, + 0x78de, 0x78df, 0xfa9e, 0x78e0, 0x78e1, 0x78e2, 0x7d2c, 0x7d2d, + 0x25a4, 0x7da9, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, + 0x7da2, 0x52fd, 0x7da3, 0x7da4, 0x7da7, 0x8342, 0x8393, 0x8451, + 0x52fd, 0x8452, 0x8444, 0x8453, 0x8622, 0x86c6, 0x86c7, 0x86c9, + 0xfadd, 0x86ca, 0x2866, 0x86c8, 0x8e24, 0x8e25, 0x8e26, 0x52fd, + 0x8e27, 0x8e28, 0x52fd, 0x8f58, 0xfafb, 0x8fa7, 0x8f88, 0x8f89, + 0x8fa5, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x2da3, + 0x8f79, 0x52fd, 0x9494, 0x9495, 0x9496, 0x09a5, 0x52fd, 0x9497, + 0x307f, 0x9498, 0x984e, 0x984f, 0x9919, 0x52fd, 0x9a41, 0xfb2a, + 0x9bf7, 0x9f04, 0x9f19, 0x9f17, 0xa340, 0xa3ec, + /* 0x25 */ + 0xa71b, 0xa71c, 0x36f6, 0xa90e, 0xaa52, 0xadd8, 0xb126, 0xb574, + 0x52fd, 0xb575, 0xbcc6, 0xbe0b, 0xbe0c, 0xbe0d, 0xbe0e, 0xbe0f, + 0xbe10, 0x45c8, 0xd759, 0xd75a, 0xd983, 0xd984, 0xd985, 0x52fd, + 0x4af5, 0xe120, 0xe121, 0xe122, 0xe123, 0xe124, 0xe129, 0x53f4, + 0x52fd, 0x688f, 0x5451, 0x17ab, 0x5517, 0x5518, 0x555b, 0x5519, + 0x551a, 0x0053, 0x551b, 0x551c, 0x551d, 0x551e, 0x551f, 0x5520, + 0x5521, 0x578b, 0x5788, 0x222d, 0x5885, 0xb587, 0x58c7, 0x594c, + 0x594d, 0x59fc, 0x59fd, 0x59fe, 0x59ff, 0x52fd, 0x52fd, 0x5b56, + 0x5b57, 0x5b58, 0x5b59, 0x5bdc, 0x5bdd, 0x5c73, 0x5c9d, 0x5ca1, + 0x5c9e, 0x5c9f, 0x5ca0, 0x5ce6, 0x5d51, 0x5d52, 0x5e3d, 0x5f22, + 0x1b9c, 0x5f23, 0x5f24, 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, + 0x5f2a, 0x5f2b, 0x52fd, 0x5f40, 0x5f2c, 0x5f2d, + /* 0x26 */ + 0x5f2e, 0x5f2f, 0x5f30, 0x64d0, 0x65a8, 0x6594, 0x6595, 0x6596, + 0x6597, 0x6598, 0x659c, 0x659b, 0x52fd, 0x65a1, 0x65a0, 0x6599, + 0x659a, 0x65a7, 0x1e88, 0x6864, 0x52fd, 0x6900, 0x6901, 0x52fd, + 0x52fd, 0x69e5, 0x69e9, 0x69fb, 0x69fc, 0x69ea, 0x69eb, 0x69ec, + 0x69ed, 0x69ee, 0x69ef, 0x69fa, 0x69f0, 0x69f1, 0x69f2, 0x69f3, + 0x69f4, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c58, 0x6c56, 0x52fd, + 0x6cdd, 0x6cde, 0x6ce3, 0x6cdf, 0x6ce0, 0x6e22, 0x6e23, 0x6e68, + 0x6edf, 0x00ac, 0x6f44, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, + 0x7099, 0xfa79, 0x709a, 0x709b, 0x709d, 0x709e, 0x709f, 0x70a0, + 0x72f3, 0x72f2, 0x731f, 0x7388, 0x748f, 0x7490, 0x52fd, 0x74fd, + 0x74fe, 0x74ff, 0x7500, 0x7501, 0x791a, 0x52fd, 0x78e3, 0x78e4, + 0x78e5, 0x78e6, 0x78e7, 0x78eb, 0x78e8, 0x78e9, + /* 0x27 */ + 0x78ea, 0x791d, 0x7ca4, 0x7ca3, 0x7dd4, 0x7dc6, 0x7dc7, 0x7dc8, + 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x05de, 0x7dce, 0x25c3, + 0x81b8, 0x81b9, 0x81ba, 0x836e, 0x83db, 0x83dc, 0x8468, 0x8469, + 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x2719, 0x8624, 0x8625, + 0x52fd, 0x8700, 0x86e5, 0x86f9, 0x86e7, 0x86e8, 0x86e9, 0x86fe, + 0x86ea, 0x86eb, 0x86ec, 0x0749, 0x86ed, 0x28a1, 0x86ee, 0x28a6, + 0x86ef, 0x52fd, 0x8717, 0x86f0, 0x86f1, 0x8b94, 0x8c5b, 0x8c5c, + 0x8c5d, 0x8e2f, 0x0891, 0x8e30, 0x8e31, 0x8e32, 0x8e33, 0x8fcc, + 0x8fcd, 0x8fce, 0x8fae, 0x8faf, 0x8fb0, 0x08d3, 0x8fcf, 0x8fd0, + 0x8fd1, 0x8fd2, 0x8fd3, 0x52fd, 0x8fd4, 0x09a9, 0x94a6, 0x94a7, + 0x94a8, 0x94b0, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x97fb, + 0x97fc, 0x52fd, 0x992d, 0x992e, 0x9950, 0x992f, + /* 0x28 */ + 0x9930, 0x9a65, 0x9be6, 0x9c0c, 0x9c02, 0x9c03, 0x9c04, 0x9c05, + 0x9c06, 0x52fd, 0x9ec0, 0x9f24, 0x9f25, 0xa016, 0xa032, 0xa720, + 0xa721, 0xa722, 0xa723, 0x36fe, 0xa725, 0xa919, 0xa924, 0xa91a, + 0xa91b, 0xa91c, 0xa91d, 0xfb52, 0xa91e, 0xaa5a, 0xaa5b, 0xaa5c, + 0xaa5d, 0xaa5e, 0xac31, 0x52fd, 0xb129, 0x52fd, 0xb288, 0xb289, + 0xb589, 0x3d57, 0xb656, 0xb7d1, 0xb7e6, 0xb832, 0xb833, 0xb952, + 0xb953, 0x0ed5, 0xb954, 0xb955, 0x52fd, 0x52fd, 0xbe29, 0xbe2a, + 0xbe2b, 0xbe2c, 0xbe2d, 0xfb92, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, + 0xbe32, 0xbe33, 0x3ec5, 0xbe34, 0xc49b, 0xc523, 0xc524, 0x52fd, + 0xc525, 0xc527, 0xc916, 0xcfa0, 0xd76f, 0x45df, 0xd770, 0xd771, + 0x45dc, 0x138c, 0xd772, 0xd773, 0xd774, 0xd99c, 0xd9aa, 0xd99d, + 0xd99e, 0x0c99, 0xd9ab, 0xd99f, 0xe135, 0xe138, + /* 0x29 */ + 0xf68d, 0x5335, 0x5336, 0xadee, 0x53b4, 0xf9c9, 0x5432, 0x5455, + 0x5544, 0x5545, 0x5546, 0x5547, 0x17e4, 0x5548, 0x5549, 0x52fd, + 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550, 0x5551, + 0xb599, 0x58d1, 0x52fd, 0x58d2, 0x58d3, 0x58d4, 0x58d5, 0x5a21, + 0x5a22, 0x5a23, 0x5b68, 0x5b69, 0x5b6a, 0x5be2, 0x5c45, 0x5cec, + 0x5ced, 0x5cee, 0x5cef, 0x52fd, 0x5d62, 0x5d63, 0x5df4, 0x536f, + 0x5e44, 0x5e45, 0x5f79, 0x1c1b, 0x5f7a, 0x5f7b, 0x5f7c, 0x5f7d, + 0x5f7e, 0x5f7f, 0x5f80, 0x0188, 0x52fd, 0x5f81, 0x5f82, 0x5f83, + 0x5f84, 0x5f85, 0x5f86, 0x5f87, 0x5f8f, 0x5f88, 0x5f89, 0x65c5, + 0x65c6, 0x1eaa, 0x65c7, 0x65c8, 0x65c9, 0x65ca, 0x65cb, 0x65cc, + 0x1eab, 0x65cd, 0x65ce, 0x65e3, 0x65cf, 0x65d0, 0x65d1, 0x65d2, + 0x65d3, 0x65c4, 0x65d4, 0x65d5, 0x65d6, 0x6820, + /* 0x2a */ + 0x6821, 0x691a, 0x6912, 0x6914, 0x6915, 0x6916, 0x6919, 0x6917, + 0x6918, 0x02c9, 0xfa61, 0x52fd, 0x6a12, 0x6a13, 0x6a14, 0x6a15, + 0x6a16, 0x6a17, 0x6a18, 0x6a19, 0x6c61, 0x6c62, 0x6c63, 0x6cf5, + 0x21a9, 0x6cf6, 0x6cf7, 0x6cf8, 0x6e29, 0x0517, 0x6f5d, 0x6f57, + 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x70bb, 0x70d1, 0x70bc, 0x70bd, + 0xbbdf, 0x70d0, 0x70be, 0x70bf, 0x70c0, 0x70c1, 0x70c2, 0x70c3, + 0x70c4, 0xbe6c, 0x73a1, 0x73a2, 0x73a3, 0x7493, 0x750d, 0x750f, + 0x750e, 0x7510, 0x7511, 0x7512, 0xfa95, 0x77e5, 0x792f, 0x52fd, + 0x7957, 0x7930, 0x7968, 0x792b, 0x7931, 0x7958, 0xfaa2, 0x7932, + 0x7959, 0x52fd, 0x795a, 0x7933, 0x795b, 0x795c, 0x795d, 0x791e, + 0x7cae, 0x7caf, 0x7d3b, 0x7d3c, 0x7d3d, 0x7e07, 0x7e08, 0x7e09, + 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, + /* 0x2b */ + 0x7e10, 0x7e22, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, + 0x7e17, 0x7e18, 0xfab8, 0x52fd, 0x8346, 0x8347, 0x8348, 0x83e1, + 0x8481, 0x8483, 0x5f75, 0x52fd, 0x8485, 0x8486, 0x862a, 0xfad1, + 0x862b, 0x866b, 0x8718, 0x8719, 0x871a, 0x52fd, 0x871b, 0x871c, + 0x871d, 0x871e, 0x871f, 0x8720, 0x8721, 0x8722, 0x8723, 0x2911, + 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872a, 0x8cef, + 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, + 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e5a, 0x8e55, 0x8f5f, 0x9002, + 0x9003, 0x9004, 0x9005, 0x8fd5, 0x9006, 0x9007, 0x8fd6, 0x9008, + 0x9009, 0x900a, 0x900b, 0x8fd7, 0x900c, 0x900d, 0x94c8, 0x94c9, + 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, + 0x94d2, 0x3451, 0x94d3, 0x94d4, 0x94d5, 0x94d6, + /* 0x2c */ + 0x94d7, 0x94e2, 0x94d8, 0x9804, 0x9805, 0x9806, 0x52fd, 0x9943, + 0x9944, 0x9a84, 0x9a8f, 0x9a85, 0x9a86, 0x9c2f, 0x9c1a, 0x9c1b, + 0x9c1c, 0x0abd, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, + 0xfb2c, 0x9c23, 0x9c24, 0x9c0e, 0x9c25, 0x9c2b, 0x9c2c, 0x9c0b, + 0x9dee, 0x52fd, 0x9ec3, 0x9ed8, 0x9ed9, 0x9f38, 0x9f39, 0x9f3a, + 0x9f3b, 0x3453, 0x9f3c, 0x9f3d, 0x9f3e, 0x9f3f, 0x9f40, 0xa048, + 0xa04c, 0xa228, 0xa251, 0xa252, 0xa34c, 0xa423, 0xfb45, 0xa424, + 0xa731, 0xa732, 0xa733, 0x3718, 0xa734, 0xa735, 0xa736, 0xa740, + 0xa737, 0x52fd, 0xa738, 0xa73d, 0xa938, 0xa939, 0xa93a, 0xa93b, + 0xa93c, 0xa94c, 0xaa73, 0xaa74, 0x0d33, 0xaa75, 0xaa76, 0xaa79, + 0xac41, 0xac42, 0xac43, 0xad5b, 0x52fd, 0x39d7, 0x8ba6, 0xad5c, + 0xade5, 0xade6, 0xade7, 0xade8, 0xaded, 0xb130, + /* 0x2d */ + 0x3b7e, 0xb131, 0xb294, 0xb651, 0xb6fd, 0xb6fe, 0xb7e9, 0x52fd, + 0xb9b3, 0xb984, 0xb994, 0x52fd, 0xb99c, 0x52fd, 0xb985, 0xbc00, + 0xbc37, 0xbc57, 0xbe54, 0xbe68, 0xbe55, 0xbe5c, 0xbe56, 0xbe57, + 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xc534, 0x407e, 0xc535, 0x52fd, + 0xc539, 0xc536, 0xc537, 0xc538, 0xc8e5, 0xc959, 0x52fd, 0xc93a, + 0xc93b, 0xd028, 0xd189, 0x52fd, 0xd18a, 0xd18b, 0xd18c, 0xd18d, + 0xd2bc, 0xd5a3, 0x1344, 0xd5a4, 0xd793, 0xd794, 0xd795, 0xd796, + 0xd797, 0xd9b9, 0xe14f, 0xe150, 0xe151, 0xe376, 0x52fd, 0x53fb, + 0x5383, 0x5438, 0x545d, 0x5571, 0x52fd, 0x5577, 0x5578, 0xfa07, + 0x55c3, 0x5579, 0x557a, 0x557b, 0x557c, 0x5572, 0x557d, 0x55a0, + 0x557e, 0x557f, 0x5580, 0x5581, 0x5582, 0x5583, 0x559e, 0x5584, + 0x5585, 0x5586, 0x5587, 0x5588, 0x5793, 0x5794, + /* 0x2e */ + 0x5795, 0x57ef, 0x57f0, 0x52fd, 0x588d, 0x588f, 0x5890, 0x5891, + 0x5892, 0x58de, 0x58e1, 0x5953, 0x1966, 0x5a4a, 0x5a4b, 0x5a4c, + 0x5a51, 0x5a4d, 0x5a48, 0x5b74, 0x5b75, 0x5c20, 0x5c21, 0x5ca5, + 0x5ca6, 0x5d73, 0x5d74, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5fdb, + 0x5fdc, 0x1c20, 0x5fdd, 0x5fde, 0x5fff, 0x52fd, 0x52fd, 0x5fdf, + 0x5fe0, 0x1c21, 0x5fe1, 0x5fe2, 0x5fe3, 0x5fe4, 0x5fe5, 0x5fe6, + 0x5fe7, 0x5fe8, 0x5fe9, 0x5fea, 0x6607, 0x6608, 0x6609, 0x660a, + 0x660b, 0x660c, 0x660d, 0x1ed7, 0x661a, 0x660e, 0x660f, 0x6610, + 0x661c, 0x6827, 0x6866, 0x6898, 0x6899, 0x6933, 0x6924, 0x6925, + 0x6926, 0x52fd, 0x02e1, 0x6a3e, 0xfa64, 0x6a3f, 0x6a57, 0x6a40, + 0x6a41, 0x6a58, 0x6a42, 0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x02e2, + 0x6a47, 0x6c6b, 0x6c6c, 0x6d10, 0x6d11, 0x21be, + /* 0x2f */ + 0x6e75, 0x6eef, 0x6f6a, 0x6f6b, 0x52fd, 0x6f6c, 0x6f6d, 0x6f6e, + 0x70ef, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70ff, + 0x70f6, 0x7102, 0x70f7, 0x7322, 0x73c4, 0x73c3, 0x7528, 0x047c, + 0x7620, 0x7625, 0x7622, 0x7623, 0x76eb, 0x04e3, 0x77f9, 0x77fa, + 0x7999, 0x799a, 0x799b, 0x7963, 0x52fd, 0x795e, 0x795f, 0x7960, + 0x799c, 0x7961, 0x799d, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, + 0x7e59, 0x7e5a, 0x7e19, 0x7e6a, 0x7e5b, 0x7e5c, 0x7e5d, 0x7e66, + 0x52fd, 0x7e5e, 0x7e5f, 0x7e1a, 0x7e60, 0x7e61, 0x52fd, 0x7e62, + 0x7e1b, 0x7e63, 0xb710, 0xb711, 0x834c, 0x839b, 0x83eb, 0x83ec, + 0x83ed, 0x83ee, 0x84a3, 0x84a8, 0x84a6, 0x06ec, 0x862f, 0x8630, + 0x8631, 0x8632, 0x8633, 0x874f, 0x8751, 0x8752, 0x877d, 0x8753, + 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, + /* 0x30 */ + 0x875a, 0x875b, 0x875c, 0x2957, 0x875d, 0x875e, 0x875f, 0x876f, + 0x8760, 0x8761, 0x8762, 0x8763, 0x8772, 0x8764, 0x52fd, 0x876e, + 0x8bb5, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, + 0x8e6c, 0x900e, 0x9043, 0x52fd, 0x900f, 0x9044, 0x9045, 0x9046, + 0x9047, 0x9048, 0x9049, 0x9010, 0x904a, 0x904b, 0x904c, 0x904d, + 0x08df, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, + 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x901d, 0x905b, + 0x905c, 0x905d, 0xfb06, 0x52fd, 0x94fe, 0x94ff, 0x9500, 0x9501, + 0x9502, 0x9503, 0x9504, 0x9505, 0x9506, 0x9507, 0x9518, 0x9508, + 0x9509, 0x94f3, 0x950a, 0x950b, 0x951b, 0x950c, 0x950d, 0x950e, + 0x950f, 0x9510, 0x980f, 0x9861, 0x9879, 0x9ac1, 0x9aac, 0x9aad, + 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, + /* 0x31 */ + 0x9c49, 0x9c64, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x0ac7, 0xfb2d, + 0x9e39, 0x9f57, 0x9f58, 0x9f59, 0x9f5f, 0x9f5a, 0xa06a, 0xa22b, + 0xa25d, 0xa25e, 0xa25f, 0x52fd, 0xa260, 0xa261, 0xa358, 0xa359, + 0xa44a, 0xa44b, 0xa44c, 0xa44d, 0xa44e, 0xa757, 0xa6b3, 0xa6b4, + 0xa76e, 0xa75b, 0xa75c, 0x52fd, 0xa75d, 0xa75e, 0x52fd, 0xa76c, + 0xa93d, 0xa954, 0xa93e, 0xa955, 0xa956, 0xa93f, 0xa957, 0xa958, + 0xa959, 0xa95a, 0xa95b, 0xa95c, 0xaa88, 0xaa89, 0x52fd, 0xac58, + 0xac59, 0xac5a, 0x52fd, 0xad67, 0xad68, 0xad69, 0xad6a, 0x52fd, + 0xad6b, 0xad6c, 0xadfe, 0xadff, 0xae00, 0xae01, 0xae02, 0xae03, + 0xae04, 0xae05, 0xb139, 0xb13a, 0xb13b, 0xb13c, 0x52fd, 0x52fd, + 0xb2b2, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0x3d3c, + 0xb5a2, 0xb661, 0xb662, 0xb714, 0x52fd, 0xb7eb, + /* 0x32 */ + 0xb842, 0xb848, 0x52fd, 0xb843, 0xb84e, 0xb844, 0xb845, 0xb9b4, + 0xb9b5, 0x52fd, 0x52fd, 0x52fd, 0xb9b6, 0x52fd, 0xbbe1, 0xbc05, + 0x52fd, 0x3e73, 0xbe9a, 0x52fd, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, + 0xbe9f, 0xfb9a, 0xbea0, 0xbea1, 0xbea2, 0xbeb5, 0xbea3, 0xbea4, + 0x52fd, 0xbea5, 0xbea6, 0xbea7, 0xbea8, 0xbeaf, 0xbea9, 0xbeaa, + 0xbeab, 0xbeac, 0xbead, 0xbeb3, 0x52fd, 0xc4a0, 0xc556, 0xc934, + 0x1127, 0xc93c, 0xcb0c, 0x52fd, 0xcf3e, 0xcfa3, 0xd030, 0xd031, + 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd5b2, 0xd5ab, 0xd5ac, + 0xd9fc, 0xd9e8, 0xd9e9, 0xd9ea, 0xdaf1, 0xdc3f, 0xdfce, 0xe16d, + 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0x4bbe, 0xe378, + 0xeb3a, 0x5467, 0x27fa, 0x5464, 0x5465, 0x5607, 0x55c4, 0x55c5, + 0x55c6, 0x55c7, 0x55c8, 0x55c9, 0x55e5, 0x55ca, + /* 0x33 */ + 0x55cb, 0x52fd, 0x55cc, 0x55cd, 0x55ce, 0x55cf, 0x55d0, 0x5797, + 0x579a, 0x579b, 0x58ea, 0x58ec, 0x58ed, 0x58f7, 0x58ee, 0x58ef, + 0x595b, 0x595c, 0x595d, 0x5a6d, 0x5a6e, 0x52fd, 0x5a6f, 0x5b81, + 0x5b82, 0x5c4f, 0x5cad, 0xda0a, 0x5d7e, 0x5e69, 0x6054, 0x6055, + 0x6056, 0x6057, 0x01ab, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, + 0x605d, 0x52fd, 0x52fd, 0x605e, 0x605f, 0x663b, 0x6636, 0x663c, + 0x663d, 0x663e, 0x663f, 0x6640, 0x6641, 0x6642, 0x024b, 0x6643, + 0x6644, 0x6645, 0x6637, 0x52fd, 0x52fd, 0x6646, 0x6647, 0x6648, + 0x6649, 0x682d, 0x68a5, 0x693d, 0x693f, 0x6c6e, 0x6ae7, 0x6a75, + 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a7c, 0x6a8e, + 0x6a7d, 0x6a7e, 0x2072, 0x6a7f, 0x6a80, 0x6a81, 0x6a82, 0x6a83, + 0x6a84, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, + /* 0x34 */ + 0x6a8a, 0x6a8b, 0x6a8c, 0x6c6f, 0x6c70, 0x6c71, 0x6c72, 0x6d2a, + 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30, 0x6d31, 0x6e83, + 0x6f84, 0x6f85, 0x6f93, 0x52fd, 0x6f86, 0x6f87, 0x6f88, 0x6f89, + 0x6f8a, 0x6f8b, 0x7136, 0x7138, 0x7139, 0x713a, 0x03e2, 0x713b, + 0x713c, 0x713d, 0x713e, 0x713f, 0x52fd, 0x7140, 0x7141, 0x7142, + 0x73de, 0x73df, 0x73e0, 0x73e1, 0x754a, 0x754b, 0x754c, 0x754d, + 0x754e, 0x754f, 0x7550, 0x7627, 0x76f9, 0x76fa, 0x76fb, 0x7798, + 0x7799, 0x779a, 0x52fd, 0x781e, 0x799e, 0x79f7, 0x799f, 0x79a0, + 0x79f0, 0x79f8, 0x79f9, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, + 0x79fa, 0x79fb, 0x79fc, 0x79fd, 0x79fe, 0x7a1f, 0x79ff, 0x7a00, + 0x7a8c, 0x7a01, 0x7cc2, 0x7cc3, 0x52fd, 0x7cd3, 0x7d4e, 0x7eaf, + 0x7eb0, 0x7eb1, 0x7eb2, 0x7eb3, 0x7ec6, 0x7eb4, + /* 0x35 */ + 0x52fd, 0x7eb5, 0x7eb6, 0x7eb7, 0x7eb8, 0x7eb9, 0x7eba, 0x7ebb, + 0x7ebc, 0x7ebd, 0x7ebe, 0x7ebf, 0x7ec1, 0x7ec0, 0x7ec2, 0x7ec3, + 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x835a, 0x8350, 0x8351, + 0x8378, 0x83f8, 0x83f9, 0x84c6, 0x84cb, 0x84cc, 0x84cd, 0x84ce, + 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x52fd, + 0x8637, 0x8638, 0x8673, 0x8790, 0x8791, 0x87bf, 0x8792, 0x8793, + 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x29bd, 0x879a, + 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, + 0x87a3, 0x87a4, 0x87a5, 0x52fd, 0x87a6, 0x87a7, 0x8bbf, 0x8bc0, + 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8c75, 0x8d43, + 0x8d12, 0x8d9f, 0x8d91, 0xfaf6, 0x8d92, 0x8d93, 0x8d94, 0x8e7e, + 0x8e7f, 0x8e80, 0x8e81, 0x8e82, 0x8f4c, 0x8f63, + /* 0x36 */ + 0x90c0, 0x90c1, 0x90c2, 0x953a, 0x90c3, 0x90c4, 0x90c5, 0x90c6, + 0x2e15, 0x90c7, 0x52fd, 0x90c8, 0x9073, 0x90c9, 0x90ca, 0x90cb, + 0x90cc, 0x90cd, 0x090e, 0x52fd, 0x52fd, 0x90ce, 0x90cf, 0x90d0, + 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x953b, 0x953c, 0x953d, + 0x953e, 0x52fd, 0x953f, 0x9540, 0x9541, 0x9542, 0x9543, 0x09c1, + 0x9544, 0x9545, 0x9559, 0x9546, 0x9547, 0x9548, 0x52fd, 0x9549, + 0x9813, 0x9882, 0x9883, 0x9966, 0x9967, 0x9c65, 0x3313, 0x9c66, + 0x0ad9, 0x9c75, 0x9c74, 0x9c67, 0x9c6d, 0x9c76, 0x9c68, 0x9c69, + 0x9c6a, 0x9c6b, 0x9c4f, 0x9c6c, 0x9df8, 0x9e45, 0x33f8, 0x9e46, + 0x9ee4, 0x9f85, 0x9f6f, 0x9f70, 0xa082, 0xa083, 0xa084, 0xa08b, + 0xa22d, 0xa268, 0xa269, 0xa277, 0xa264, 0xa26a, 0x52fd, 0xa2f2, + 0xa2e2, 0xa363, 0xa364, 0xa365, 0xa366, 0x3a3d, + /* 0x37 */ + 0xa367, 0xa368, 0x35d8, 0x52fd, 0xa472, 0xa47d, 0xa669, 0xa784, + 0xa786, 0xa787, 0xa788, 0xa79e, 0x52fd, 0xa789, 0xa78a, 0xa796, + 0xa78b, 0xa78c, 0xa78d, 0xa979, 0xa983, 0xa97a, 0xa95d, 0xa97b, + 0x52fd, 0xaa9f, 0x0d48, 0xaaa0, 0xaaa1, 0xaaa2, 0x38fc, 0xac6a, + 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xad78, 0x52fd, 0xad79, 0xad7c, + 0xae21, 0xae22, 0xae23, 0xae24, 0x3a39, 0xae25, 0xae26, 0xb151, + 0xb152, 0xb156, 0x52fd, 0x3c4b, 0xb2e1, 0x52fd, 0x52fd, 0xb2d6, + 0xb2d7, 0xb2d8, 0xb2d9, 0xb5b5, 0xb66c, 0xb66f, 0xb670, 0xb7bc, + 0xb7bd, 0xb7ed, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb986, 0xb987, + 0xb9ed, 0x52fd, 0xb9ee, 0x52fd, 0xbc0e, 0xbc0f, 0x52fd, 0xbd2d, + 0xbd2a, 0xbd2e, 0xbdcc, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0x3fb9, + 0xbefd, 0xbf1b, 0xbefe, 0xbeff, 0xbf00, 0xbf01, + /* 0x38 */ + 0xbf02, 0xbf03, 0xbf21, 0xbf04, 0xbf05, 0xbf06, 0xbf07, 0xbf08, + 0xbf09, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, + 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xc57b, 0xc57c, 0xc57d, + 0xc57e, 0x40cf, 0xc57f, 0xc580, 0xc566, 0xc581, 0xc582, 0xc583, + 0xc8b2, 0x52fd, 0xc97f, 0xc972, 0xc95a, 0xcaeb, 0xcb15, 0x52fd, + 0xcb16, 0xfbca, 0xcb17, 0x52fd, 0xcbc5, 0xcbc6, 0xcbc7, 0xcc88, + 0xcc89, 0x52fd, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcedf, 0x52fd, + 0xd03b, 0xd03c, 0xd03d, 0xd03e, 0xd03f, 0xd040, 0xd041, 0xd042, + 0xd15c, 0xd1af, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1b5, 0xd1ad, + 0xd1ae, 0xd2e2, 0xd524, 0x44ae, 0xd5c4, 0x52fd, 0xd7ea, 0xd7d3, + 0xd7d4, 0xd7d5, 0xd986, 0x52fd, 0xd987, 0xd9fd, 0xdb05, 0xdc49, + 0xdf5f, 0xdfd3, 0xdfd5, 0xe18a, 0xe18b, 0xe18c, + /* 0x39 */ + 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe37d, + 0xe37e, 0x4beb, 0x52fd, 0x52fd, 0xe4ec, 0xe55b, 0xef87, 0xef86, + 0x52fd, 0x5346, 0x5347, 0x5402, 0x546d, 0x546e, 0x546f, 0x560d, + 0x560e, 0x560f, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x579f, + 0x57a0, 0x57a1, 0x57a3, 0x5821, 0x5822, 0x867c, 0x5895, 0x5896, + 0x5961, 0x5967, 0x5a91, 0x5a92, 0x5a93, 0x5a94, 0x5b8a, 0x5b8b, + 0x5bf7, 0x5c24, 0x5cb0, 0x5cb1, 0x5d8e, 0x5e04, 0x5e6a, 0x5e6b, + 0x5e6c, 0x5e6d, 0x60e8, 0x610c, 0x60e9, 0x60ea, 0x610d, 0x52fd, + 0x60eb, 0x60ec, 0x60ed, 0x60ee, 0x60ef, 0x60f0, 0x60f1, 0x60f2, + 0x6116, 0x60f3, 0x6104, 0x611d, 0x60f4, 0x60f5, 0x60f6, 0x60f7, + 0x1cb0, 0x6502, 0x6503, 0x6504, 0x669a, 0x667c, 0x66c5, 0x667d, + 0x667e, 0x667f, 0x6680, 0x6681, 0x1f40, 0x1f42, + /* 0x3a */ + 0x6682, 0x6683, 0x6684, 0x6685, 0x6686, 0x6687, 0x68ae, 0x694d, + 0x6ab0, 0x6adc, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, + 0x6adb, 0x6abc, 0x6abd, 0x6abe, 0x52fd, 0x6abf, 0x6ac0, 0x6ac1, + 0x6ac2, 0x6ac3, 0x6ace, 0x0301, 0x6ad9, 0x6ac4, 0x6ac5, 0x6ada, + 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, 0x6c7e, 0x6c7b, 0x6d4e, + 0x6d4f, 0x6d50, 0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6e8f, + 0x6efc, 0x6fa6, 0x6fa7, 0x6fa8, 0x7023, 0x718b, 0x52fd, 0x718c, + 0x718d, 0x718e, 0x718f, 0x71a4, 0x5899, 0x7324, 0x7346, 0x7347, + 0x7348, 0x73fd, 0x73fe, 0x52fd, 0x756e, 0x757c, 0x756f, 0x7570, + 0x7571, 0x7572, 0x7629, 0x762a, 0x765f, 0x77a2, 0x7830, 0x782b, + 0x7a61, 0x7a02, 0x7a03, 0x7a04, 0x7a05, 0x7a06, 0x7a07, 0x52fd, + 0x7a08, 0x7a09, 0x7a62, 0x7a0a, 0x7a0b, 0x7a0c, + /* 0x3b */ + 0x7a0d, 0x7a0e, 0x7a63, 0x7a27, 0x7a0f, 0x52fd, 0x7a1b, 0x7a64, + 0x7a10, 0x7a11, 0x7a81, 0x7a12, 0x7a65, 0x7a13, 0x7cce, 0x7f29, + 0x7ec4, 0x7f2a, 0x52fd, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2e, 0x7f2f, + 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f34, 0x52fd, 0x7f35, 0x7f36, + 0x7ee3, 0x7f37, 0x7f38, 0x7f39, 0x7f3a, 0x7f3b, 0x7f4d, 0x7f3c, + 0x7f3d, 0x7f3e, 0x52fd, 0x81d0, 0x81d1, 0x8355, 0x8402, 0x8404, + 0x84fc, 0x8507, 0x84fd, 0x84fe, 0x52fd, 0x84ff, 0x8500, 0x8508, + 0x8501, 0x8502, 0x8535, 0x8503, 0x8504, 0x52fd, 0x863b, 0x8689, + 0x8681, 0x8682, 0xba33, 0x87eb, 0x87ec, 0x52fd, 0x87ed, 0x87ee, + 0x87ef, 0x52fd, 0x87f0, 0x87f1, 0x87f2, 0x2a2b, 0x87f3, 0x2a16, + 0x87f4, 0x87f5, 0x534b, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, + 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x87ff, 0x8800, + /* 0x3c */ + 0x2a1b, 0x8801, 0x8802, 0x8803, 0x8804, 0x8805, 0x8806, 0x8807, + 0x2a27, 0x8808, 0x8809, 0x880a, 0x880b, 0x880c, 0x880d, 0x8bd7, + 0x8bd8, 0x8d29, 0x8d9c, 0x8df8, 0x8e98, 0x8ea4, 0x8e99, 0x8e9a, + 0x8e9b, 0x8e97, 0x8e9c, 0x2cf5, 0x8e9d, 0x52fd, 0x8e9e, 0x8e9f, + 0x8f65, 0x90d6, 0x0920, 0x9132, 0x9133, 0x9134, 0x2e82, 0x9135, + 0x9136, 0x9137, 0x90d7, 0x52fd, 0x90d8, 0x9138, 0x9139, 0x913a, + 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x90d9, 0x9141, + 0x9142, 0x0921, 0x9143, 0x9144, 0x2e7a, 0x957c, 0x957d, 0x957e, + 0x957f, 0x9580, 0x9581, 0x9582, 0x52fd, 0x9583, 0x9584, 0x9585, + 0x9586, 0x95a5, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, + 0x958d, 0x958e, 0x52fd, 0x52fd, 0x958f, 0x52fd, 0x9590, 0x9591, + 0x9592, 0x9593, 0x9594, 0x9595, 0x52fd, 0x3129, + /* 0x3d */ + 0x9596, 0x9856, 0x9857, 0x98e1, 0x990e, 0x990f, 0x997a, 0x997b, + 0x998b, 0x9af2, 0x9af3, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, + 0x9cad, 0x9c98, 0x9cab, 0x9c7b, 0x9c99, 0x9c9a, 0x9c9b, 0x9c85, + 0x9c9c, 0x9c9d, 0x0ada, 0x52fd, 0x9cac, 0x9c79, 0x9c9e, 0x9ca4, + 0x9dfd, 0x9eeb, 0x9eea, 0x9f8f, 0x9f90, 0x9f86, 0x9f87, 0x9f88, + 0xa0ac, 0xa0ad, 0xa2ec, 0xa373, 0xa374, 0x52fd, 0xa4aa, 0xa4ab, + 0xa4ac, 0xa6d1, 0xa6d7, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa98e, + 0xa98f, 0xa990, 0xa97c, 0xa991, 0xa992, 0xa993, 0xa994, 0xfb54, + 0xa99a, 0xa995, 0xa996, 0xa997, 0xaabd, 0xaac7, 0xaabe, 0x52fd, + 0xaabf, 0x52fd, 0xac93, 0x6d5e, 0xad86, 0xad87, 0xad88, 0xad89, + 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae4a, 0xae47, + 0xae48, 0xae49, 0xb16b, 0xb166, 0x52fd, 0xb167, + /* 0x3e */ + 0x3bab, 0xb168, 0x3bac, 0x52fd, 0xb2fd, 0xb2fe, 0xb2ff, 0xb300, + 0xb301, 0xb302, 0xb303, 0xb304, 0xb305, 0xb306, 0xb533, 0xb5c2, + 0xb5d0, 0xfb74, 0xb695, 0xb696, 0xb735, 0xb736, 0xb867, 0xb868, + 0xb869, 0xb86a, 0xb872, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, + 0xba22, 0x52fd, 0x52fd, 0xba23, 0xba41, 0xba24, 0xba25, 0xba26, + 0xba27, 0xba28, 0xba29, 0xb9b7, 0x52fd, 0x52fd, 0x52fd, 0xbcda, + 0xbdcf, 0xbdda, 0xbf89, 0xbfb7, 0xbf8a, 0xbf8b, 0xc05e, 0xbf8c, + 0x52fd, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, + 0xbf94, 0xbfb6, 0xbf95, 0xbf96, 0xbf97, 0x3ff7, 0x52fd, 0xbf98, + 0xbf99, 0xbf9a, 0x0fea, 0x52fd, 0xbf9b, 0xbfbd, 0xbf9c, 0xbf9d, + 0xbf9e, 0xbf9f, 0xbfc0, 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, + 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, + /* 0x3f */ + 0x52fd, 0xc4b4, 0xc4b5, 0xc4b6, 0xc5b9, 0xc5ba, 0xc5bb, 0xc591, + 0xc5bc, 0xc8ee, 0xc8ef, 0xc996, 0xc997, 0xc973, 0xc998, 0xc999, + 0xcaed, 0xcaee, 0xcbde, 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb4, + 0xccb5, 0xccb6, 0xfbce, 0xccb7, 0xcee3, 0xcfb9, 0xd055, 0xd07e, + 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0x52fd, 0xd1c4, 0xd1c5, + 0xd1c6, 0xd1c7, 0xd1c8, 0xd1c9, 0xd1ee, 0xd1cf, 0xd1ca, 0xd1cb, + 0xd1cc, 0xd309, 0xfbda, 0xd303, 0xd52f, 0xd530, 0xd531, 0xd532, + 0xd80e, 0xd80f, 0xd810, 0xd811, 0xd812, 0x52fd, 0xd813, 0xd814, + 0xd815, 0xd7ff, 0xda1f, 0xda20, 0xda21, 0xda2d, 0x52fd, 0xdb1b, + 0xdb1c, 0xdb1d, 0xdb1e, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc64, + 0xdc59, 0xdc57, 0x52fd, 0xdc58, 0xdf6b, 0x1489, 0x52fd, 0xdfe7, + 0xdfe8, 0xdfe9, 0xdfea, 0xdfeb, 0xdfec, 0x4a96, + /* 0x40 */ + 0xdfed, 0xe1b1, 0xe1b4, 0x52fd, 0xe38a, 0xe38d, 0xe38c, 0xe4f2, + 0xe4f3, 0x52fd, 0x7408, 0xe717, 0x15b2, 0xe89f, 0xe9a0, 0x52fd, + 0xeb6d, 0x837d, 0xf290, 0xf8c4, 0x534c, 0x5474, 0x5475, 0x5476, + 0x5649, 0x564a, 0x564b, 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, + 0x5651, 0x5652, 0x5653, 0x5654, 0x5655, 0x5656, 0x57a4, 0x57a9, + 0x582a, 0x582b, 0x5ab3, 0x5ac1, 0x5b98, 0x5bfb, 0x5bfc, 0x5cbc, + 0x5d96, 0x5e0a, 0x52fd, 0x61a2, 0x52fd, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618b, + 0x618c, 0x1cf1, 0x618d, 0x61d1, 0x6514, 0x66c9, 0x66ca, 0x66cb, + 0xedfd, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, + 0x66d3, 0x66d4, 0x66d5, 0x6871, 0x534d, 0x6962, 0x6b0e, 0x6afe, + 0x6aff, 0x6b00, 0x52fd, 0x6b01, 0x6b02, 0x6b03, + /* 0x41 */ + 0x6b15, 0x6b04, 0x6b05, 0x52fd, 0x6c87, 0x6c89, 0x6d6e, 0x6d6f, + 0x6d70, 0x6d71, 0xfa6e, 0x6d72, 0x6d73, 0x6d74, 0x6e9d, 0x6fb8, + 0x6fb9, 0x6fba, 0x71c2, 0x71c3, 0x71d5, 0x71c4, 0x71c0, 0x71c5, + 0x71c6, 0x758a, 0x758b, 0x758c, 0x7664, 0xae8c, 0x2441, 0x770d, + 0x77a8, 0x783b, 0x783c, 0x783d, 0x783e, 0x783f, 0x7840, 0x7a66, + 0x7acb, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7a67, 0x7abb, 0x7a68, + 0x7a69, 0x7a6a, 0x7abc, 0x52fd, 0x7cdb, 0x7f81, 0x7f82, 0x7f83, + 0x7f84, 0x7f85, 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0xfabf, 0x7f8a, + 0x7f8b, 0x52fd, 0x7f8c, 0x7f8d, 0x7f8e, 0x7f8f, 0x7f90, 0x7fa1, + 0x7f91, 0x81d6, 0x829f, 0x8358, 0x8385, 0x840b, 0x840c, 0x8537, + 0x8538, 0xface, 0x8539, 0x853a, 0x853b, 0x853c, 0x853d, 0x853e, + 0x8540, 0x8541, 0x8542, 0x52fd, 0x8543, 0x868a, + /* 0x42 */ + 0x868b, 0x8890, 0x8859, 0x885b, 0x885c, 0x885d, 0x885e, 0x2a8a, + 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8893, 0x8865, + 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x8895, 0x886c, + 0x886d, 0x886e, 0x886f, 0x2a8c, 0x8870, 0x8871, 0x8872, 0x8873, + 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x2a80, 0x887a, + 0x2a7f, 0x887b, 0x88a9, 0x887c, 0x8bf1, 0x8beb, 0x8c8a, 0x8d3d, + 0x8da6, 0x8da7, 0x8eba, 0x52fd, 0x8ebb, 0x8ebc, 0x8ebd, 0x9191, + 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x90da, 0x9198, + 0x9199, 0x919a, 0x52fd, 0x52fd, 0x919b, 0x919c, 0x919d, 0x919e, + 0x919f, 0x91a0, 0x91bf, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, + 0x91a6, 0x91a7, 0x915b, 0xfb0d, 0x91a8, 0x95cb, 0x52fd, 0x09da, + 0x95cc, 0x964f, 0x95cd, 0x95ce, 0x95cf, 0x964e, + /* 0x43 */ + 0x95d0, 0x95d1, 0x95d2, 0x52fd, 0x95d3, 0x95d4, 0x95d5, 0x95d6, + 0x95d7, 0x95d8, 0x95d9, 0x95fa, 0x95da, 0x95db, 0xfb1c, 0x95dc, + 0x52fd, 0x52fd, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, + 0x95e3, 0x95e4, 0x95e5, 0x09db, 0x95e6, 0x95e7, 0x988e, 0x9998, + 0x9999, 0x52fd, 0x9b0a, 0x52fd, 0x9b26, 0x9b27, 0x9cbd, 0x9cdf, + 0x0ae2, 0x9cbe, 0x9cde, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9c9f, + 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x0ae3, 0x9cc8, 0x9cc9, + 0x9ce3, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, + 0x9cd1, 0x9cd2, 0x9cd3, 0xfb2f, 0x9cd4, 0x9e04, 0x9e65, 0x9eee, + 0x9fa0, 0x9fa1, 0xa0dd, 0xa0de, 0xa283, 0xa2fa, 0xa37f, 0xa380, + 0xa4e8, 0xa4e9, 0xa4ea, 0x88a6, 0xa6e1, 0x52fd, 0xa7db, 0xa7dc, + 0xa7dd, 0xa7de, 0xa7df, 0xa7e0, 0xa7e1, 0xa7e2, + /* 0x44 */ + 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0x379c, 0xa7e7, 0xa9b0, 0xa998, + 0xa9b1, 0xa999, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, + 0xa9b8, 0xa9b9, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7, + 0xaae8, 0xaae9, 0xacad, 0xaccf, 0xacae, 0xacaf, 0xacb0, 0xacb1, + 0xad92, 0xad93, 0xad94, 0xae79, 0x3a7b, 0xae7a, 0xae7b, 0xae7c, + 0xae7d, 0xae7e, 0xae7f, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, + 0xb197, 0xb184, 0xb185, 0xb189, 0xb186, 0xb187, 0xb32c, 0xb32d, + 0xb32e, 0xb32f, 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, + 0xb336, 0xb337, 0xb5d2, 0xb744, 0xb800, 0xb883, 0xb884, 0xfb86, + 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0x52fd, 0xba7f, 0xba87, + 0xba80, 0xbd43, 0xc034, 0x1249, 0xc035, 0xc036, 0xc037, 0xc038, + 0xc039, 0xc03a, 0xc03b, 0xc03c, 0xc03d, 0xc03e, + /* 0x45 */ + 0xc03f, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, + 0xc047, 0xc048, 0xc049, 0xc04a, 0x52fd, 0xc04b, 0xc04c, 0xc04d, + 0xc04e, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ec, 0xc5ed, + 0xc5ee, 0xc8f7, 0xc99a, 0xc9cd, 0xfbc8, 0xc9a3, 0xc9ce, 0xcb31, + 0xcb32, 0xcb33, 0xcce4, 0x52fd, 0xcce5, 0xcce6, 0xcfc8, 0xd074, + 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd161, 0xd1df, + 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0x12f3, + 0xd331, 0xd53d, 0xd53e, 0xd53f, 0xd5f4, 0xd5f5, 0xd5f6, 0x52fd, + 0xd717, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, + 0xd848, 0xd849, 0xd84a, 0xd84b, 0x46d2, 0xd9ba, 0xda44, 0xdc2a, + 0xdc6d, 0x4774, 0xfbe7, 0xdc7e, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, + 0xdc76, 0xdf79, 0x4aa0, 0x52fd, 0xe004, 0xdff8, + /* 0x46 */ + 0xe005, 0xe1da, 0xe1db, 0xe1dc, 0xe1dd, 0xe1de, 0xe1df, 0xe1e0, + 0xe1e1, 0xe3c5, 0xe39a, 0xe39b, 0xe39c, 0xe4d8, 0xe4d9, 0xe4da, + 0xe56e, 0x1557, 0xe76b, 0xd083, 0x52fd, 0xe9d6, 0xe9bd, 0x52fd, + 0x852e, 0xedfc, 0xf053, 0xf0b7, 0xf58c, 0xf68e, 0xf5ff, 0x5376, + 0x5406, 0x547e, 0x5684, 0x5685, 0x5686, 0x5687, 0x5688, 0x56a7, + 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x568e, 0x568f, 0x56a3, + 0x5690, 0x5691, 0x5692, 0x5693, 0x56ac, 0x5694, 0x5695, 0x5696, + 0x57aa, 0x57ab, 0x589e, 0x18a9, 0x5908, 0x5909, 0x5968, 0x5969, + 0x596a, 0x599a, 0x5ad9, 0x5ada, 0x5adb, 0x5ba8, 0x5c01, 0x5c28, + 0x5c77, 0x5cbd, 0x5cbe, 0x6260, 0x5da0, 0x5da2, 0x5e0f, 0x5e85, + 0x61fe, 0x61ff, 0x6200, 0x6201, 0x6216, 0x6202, 0x6203, 0x6204, + 0x6205, 0x6206, 0x6207, 0x6208, 0x6222, 0x6209, + /* 0x47 */ + 0x620a, 0x620b, 0x620c, 0x6214, 0x6229, 0x616e, 0x620d, 0x620e, + 0x620f, 0x6210, 0x6211, 0x6212, 0x6213, 0x651b, 0x651c, 0x651d, + 0x6713, 0x66ff, 0x6700, 0x6701, 0x6702, 0x6703, 0x6704, 0x670a, + 0x6705, 0x6706, 0x6707, 0x6708, 0x683a, 0x6873, 0x696f, 0x6970, + 0x6971, 0x5352, 0x52fd, 0x6d9a, 0x6b60, 0xfa69, 0x6b2b, 0x6b24, + 0x6b2c, 0x6b2d, 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, + 0x6b34, 0x6b35, 0x6b45, 0x6b36, 0x6c92, 0x6c93, 0x6d88, 0x6d89, + 0x6d8a, 0x6d8b, 0x6e3f, 0x52fd, 0x6fca, 0x71f6, 0x71f7, 0x71f8, + 0x71f9, 0x742b, 0x52fd, 0x74a4, 0x74ce, 0x52fd, 0x759e, 0x759f, + 0x75a0, 0x75a1, 0x75a2, 0x75a3, 0x75a4, 0x75a5, 0x75a6, 0x7718, + 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7abd, 0x7abe, 0x7b0b, + 0x7abf, 0x7ac0, 0x52fd, 0x7b0c, 0x7a8d, 0x7b0d, + /* 0x48 */ + 0x7b0e, 0x7b5e, 0x7b0f, 0x7b10, 0x7ac1, 0x7b11, 0x52fd, 0x7ac2, + 0x7cea, 0x7ceb, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7, 0x7f92, + 0x804a, 0x52fd, 0x7fe8, 0x7fe9, 0x7fea, 0x8001, 0x7feb, 0x7fec, + 0x7fef, 0x7fed, 0x7fee, 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, + 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffe, 0x7ffa, 0x7ffb, + 0x7ffc, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x890b, + 0x890d, 0x07bc, 0x890e, 0x890f, 0x07a4, 0x8914, 0x88d4, 0x88d5, + 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, + 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, + 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x89ec, + 0x88ed, 0x88ee, 0x88ef, 0x8900, 0x88f0, 0x8c04, 0x52fd, 0x8c05, + 0xfaf3, 0x8db5, 0xfaf9, 0x8ed6, 0x8ed7, 0x8ed8, + /* 0x49 */ + 0x8ed9, 0x91a9, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, + 0x9206, 0x923f, 0x9207, 0x9208, 0x9209, 0x920a, 0x91b6, 0x920b, + 0x920c, 0x52fd, 0x52fd, 0x920d, 0x52fd, 0x920e, 0x920f, 0x9210, + 0x9211, 0x9212, 0x9235, 0x9213, 0x9214, 0x91aa, 0x52fd, 0x92c1, + 0x9215, 0x9216, 0x9217, 0x961e, 0x961f, 0x9620, 0x9621, 0x52fd, + 0x9622, 0x9623, 0x3195, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, + 0x9629, 0x962a, 0x962b, 0x9607, 0x962c, 0x962d, 0x962e, 0x09e8, + 0x52fd, 0x962f, 0x9630, 0x9648, 0x9631, 0x9632, 0x3198, 0x9633, + 0x52fd, 0x9634, 0x9635, 0x9636, 0x9859, 0x9891, 0x98e7, 0x99b8, + 0x99b9, 0x99ba, 0x99bb, 0x99c8, 0x9b4d, 0x9b89, 0x9b50, 0x9b28, + 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x3378, 0x9d00, 0x9d01, + 0x9d02, 0x9ce4, 0x9ce5, 0x9d03, 0x9d04, 0x9d05, + /* 0x4a */ + 0x9d06, 0x9d07, 0x9d13, 0x9d08, 0x9d09, 0x9ce6, 0x9d0a, 0x9d0b, + 0x9d0c, 0x9e0b, 0x9ef4, 0x9f0a, 0x9fb1, 0xa11d, 0xfb3b, 0xa28b, + 0xa28c, 0xa28f, 0xa28d, 0xa28e, 0xa306, 0xa386, 0xa522, 0xa523, + 0xa524, 0xa525, 0xa526, 0xa527, 0xa528, 0xa6f1, 0x37b9, 0xa823, + 0xa812, 0x52fd, 0xa813, 0xa814, 0xa815, 0xa816, 0xa817, 0xa818, + 0xa819, 0xa84b, 0xa81a, 0xa81b, 0xa81c, 0x52fd, 0xa81d, 0xa81e, + 0xa81f, 0xa820, 0xa9ca, 0x75ac, 0xa9cb, 0xa9cc, 0xa9cd, 0xa9ce, + 0x52fd, 0xa9cf, 0xab10, 0xab11, 0xab12, 0xab13, 0xab14, 0xab0f, + 0xab15, 0xab16, 0xab17, 0x3933, 0xab18, 0xacc6, 0xad9f, 0xada0, + 0xada4, 0xada1, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, + 0xaed0, 0xaec6, 0xaebb, 0xaebc, 0xaebd, 0xaebe, 0xaebf, 0xaec0, + 0xaec1, 0xaec2, 0xfb60, 0xb1a7, 0xb1a8, 0xb1a9, + /* 0x4b */ + 0xb1aa, 0xb1ab, 0xb1ac, 0xb1bc, 0xb1ad, 0xb1ae, 0x3bc0, 0xb1af, + 0xb1b0, 0xb1b1, 0x3bc1, 0xb1b4, 0xb1b2, 0xb366, 0xb367, 0xb368, + 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0x52fd, + 0xb53e, 0xb53f, 0xb540, 0xb5e8, 0xb752, 0xb753, 0xb754, 0xb755, + 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, + 0x52fd, 0xb899, 0xb89a, 0xb89b, 0xbab7, 0xbab8, 0xbab9, 0x52fd, + 0xbaba, 0xbabb, 0xbabd, 0x52fd, 0xbabc, 0xfb88, 0xfb87, 0xbbeb, + 0xbbec, 0xbc16, 0xbc44, 0xbce3, 0xbd58, 0xbd53, 0xbd54, 0xbde0, + 0xc0b1, 0xc0b2, 0xc0b3, 0xc0ea, 0x52fd, 0xc0b4, 0xc0f0, 0xc0b5, + 0xc0b6, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0bc, 0xc0bd, + 0xc0be, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0x52fd, 0xc0c4, + 0xc0c5, 0xc0c6, 0xc0fc, 0xc0c7, 0xc0c8, 0xc0c9, + /* 0x4c */ + 0xc0ca, 0xc0cb, 0xc0cc, 0xc184, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d0, + 0xc0d1, 0xc0d2, 0xc4ca, 0xc4cb, 0xc636, 0xc637, 0xc69f, 0xc638, + 0xc639, 0xc63a, 0x4144, 0xc9be, 0xc9f0, 0xc9bf, 0xc9c0, 0xcaf7, + 0xcaf8, 0xcafa, 0xcb43, 0xcb44, 0xcd0f, 0xcd10, 0xcd11, 0xcd12, + 0x43ad, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0x52fd, 0x52fd, 0xcfd3, + 0xcfd7, 0x52fd, 0xd0b0, 0xd098, 0xd090, 0xd091, 0xd092, 0xd097, + 0xd093, 0xd164, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206, + 0xd207, 0xd35a, 0xd35b, 0xd54e, 0xd54f, 0xd550, 0xd619, 0xd61a, + 0xd61b, 0x52fd, 0xd61c, 0x52fd, 0xd719, 0xd71a, 0x1386, 0xdc8a, + 0xd86e, 0xd86f, 0x4664, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, + 0xd875, 0xd876, 0xdb3a, 0xdb3b, 0xdb3c, 0xdb5a, 0xdb3d, 0xdb42, + 0xdc8b, 0xdca0, 0xdc8c, 0xdc8d, 0xdc8e, 0xdcab, + /* 0x4d */ + 0xdc8f, 0x4777, 0xdc90, 0xdc91, 0xdc92, 0xdcaa, 0x47af, 0xdc93, + 0xdc94, 0xdc9e, 0xdca8, 0x52fd, 0x52fd, 0xe200, 0xe201, 0xe202, + 0xe203, 0xe204, 0xe205, 0xe2c4, 0xe2c5, 0x52fd, 0xe3ae, 0xe3b2, + 0x52fd, 0x52fd, 0xe4f7, 0xe513, 0xe69e, 0xe785, 0xa680, 0xe7c8, + 0xeb41, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xedc4, 0xedc5, 0xedc6, + 0xef95, 0xef96, 0xef97, 0xf058, 0xf059, 0x52fd, 0xf2a9, 0xf2aa, + 0xf2ab, 0xf58e, 0xf603, 0xf6b3, 0x5e82, 0x5353, 0x5483, 0x5484, + 0x5485, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x52fd, 0x56d1, + 0x56d2, 0x56da, 0x57b3, 0x57b4, 0x52fd, 0x5913, 0x590e, 0x596b, + 0x5c03, 0x5c61, 0x5cc1, 0x5cc2, 0x5db5, 0x5440, 0x6298, 0x6299, + 0x629a, 0x629b, 0x629c, 0x629d, 0x629e, 0x629f, 0x62ee, 0x62a0, + 0x62a1, 0x6286, 0x6525, 0x6734, 0x6735, 0x6751, + /* 0x4e */ + 0x672d, 0x9662, 0x6754, 0x6752, 0x026d, 0x6736, 0x6737, 0x6738, + 0x6739, 0x673a, 0x673b, 0x6768, 0x673c, 0x026e, 0x6877, 0x8596, + 0x697e, 0x697f, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, + 0x6b6f, 0x6b5d, 0x6b70, 0x6b85, 0x6b71, 0x6b72, 0x6b73, 0x6b74, + 0x6b75, 0x6b76, 0x6b84, 0x6b77, 0x6b83, 0x6c9a, 0x6da7, 0x6da8, + 0x6da9, 0x6daa, 0x6dab, 0x6dac, 0x6db7, 0x6dad, 0x6dae, 0x52fd, + 0x6e45, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x7226, 0x7227, + 0x7228, 0x52fd, 0x7229, 0x722a, 0x7305, 0x2364, 0x74d0, 0x75b7, + 0x52fd, 0x75b8, 0x75b9, 0x7722, 0x7723, 0x7873, 0x7874, 0x7b8f, + 0x7b12, 0x7b13, 0x7b14, 0x7b15, 0x7b16, 0x7b17, 0x7b18, 0x7b61, + 0x7b66, 0x7b67, 0x7b19, 0x7b68, 0x7b1a, 0x7b69, 0x7d04, 0x7d05, + 0x52fd, 0x7d06, 0x7cfd, 0x8050, 0x8051, 0x8052, + /* 0x4f */ + 0x8053, 0x8054, 0x8055, 0x8063, 0xfac4, 0x8056, 0x8057, 0x8058, + 0x8059, 0x805a, 0x805b, 0x52fd, 0x805c, 0x805d, 0x805e, 0x805f, + 0x82d7, 0x52fd, 0x8360, 0x8361, 0x8417, 0x8439, 0x858f, 0x85c8, + 0x8590, 0x8591, 0x8698, 0x8699, 0x8944, 0x8945, 0x8946, 0x8959, + 0x89ee, 0x2b2b, 0x8947, 0x8948, 0x52fd, 0x8949, 0x894a, 0x894b, + 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, + 0x8954, 0x8955, 0x8956, 0x8c15, 0x8c9a, 0x8d58, 0x8dfc, 0x8dfd, + 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x52fd, + 0x931f, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, + 0xfb11, 0x9294, 0x9295, 0x91ca, 0x9218, 0x52fd, 0x9296, 0x9297, + 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, + 0x2f46, 0x52fd, 0x92a0, 0x92a1, 0x2f9a, 0x92b7, + /* 0x50 */ + 0x52fd, 0x9696, 0x9668, 0x9669, 0x968c, 0x966a, 0x966b, 0x966c, + 0x966d, 0x966e, 0x966f, 0x967f, 0x9684, 0x9670, 0x9671, 0x9685, + 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x52fd, 0x9677, 0x9678, + 0x9679, 0x967a, 0x967b, 0x967c, 0xfb1e, 0x9894, 0x99d5, 0x9b29, + 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d3e, 0x9d31, + 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9e11, 0x0b53, 0x9fc0, 0xa142, + 0xa143, 0xa144, 0xa145, 0xa146, 0xa38c, 0xa38d, 0xa38e, 0xa38f, + 0xa390, 0xa391, 0xa563, 0xa564, 0xa565, 0x52fd, 0xfb4a, 0x52fd, + 0xa6f6, 0xa836, 0xa837, 0xa82c, 0xa838, 0xa839, 0x52fd, 0xa83a, + 0xa9e3, 0xa9e2, 0xa9f5, 0xab47, 0x52fd, 0xab48, 0xab49, 0xab4a, + 0xab4b, 0xab4c, 0xada8, 0xada9, 0xadaa, 0x52fd, 0xaf0b, 0xaf06, + 0xaf73, 0xaf0c, 0xaf0d, 0xaf0e, 0xaf0f, 0xaf10, + /* 0x51 */ + 0x52fd, 0xaf11, 0xfb62, 0xaf12, 0xaf14, 0xaf15, 0xaf16, 0x52fd, + 0xaf13, 0xaf17, 0xb1d9, 0xb1da, 0xb1db, 0x52fd, 0xb1dc, 0xb3a6, + 0xb3a7, 0xb3a8, 0xb3a9, 0xb3aa, 0xb3ab, 0x52fd, 0xfb6d, 0xb3ac, + 0xb3ad, 0xb3ae, 0x52fd, 0x52fd, 0xb3af, 0xb3b0, 0xb3b1, 0xb544, + 0xb545, 0xb5f7, 0xb5f8, 0xb76b, 0xb76c, 0xb761, 0xb812, 0xb8af, + 0xb8b0, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb922, + 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0x0f3d, 0xbbed, 0xbc1b, 0xbc47, + 0xbce8, 0xbdd0, 0xbde7, 0xbde8, 0xbde9, 0xc14e, 0xc14f, 0xc150, + 0xc172, 0xc151, 0xc152, 0xfba7, 0x1026, 0xc153, 0xc154, 0xc155, + 0xc156, 0xc157, 0xc177, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, + 0xc16e, 0xc15d, 0x1027, 0x52fd, 0xc15e, 0x1028, 0xc15f, 0x52fd, + 0xc4d7, 0xc689, 0xc68a, 0x52fd, 0xfbbe, 0xc68b, + /* 0x52 */ + 0xc68c, 0xc68d, 0xc68e, 0xfbbc, 0xc68f, 0x52fd, 0xc69a, 0xc690, + 0xc691, 0xc692, 0xc693, 0xca12, 0xc9f1, 0x52fd, 0xcafe, 0xcafb, + 0xcb57, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0x52fd, 0xcd4d, 0xcd59, + 0xcd4e, 0xcd4f, 0xcef4, 0xcf65, 0xd0a6, 0xd0a7, 0xd0a8, 0xd222, + 0xd223, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd558, 0x52fd, 0xd559, + 0xd63b, 0xd63c, 0xd63d, 0xd63e, 0xd748, 0xd894, 0xd895, 0xd896, + 0xd897, 0xd898, 0xda7d, 0xd9fe, 0xda7e, 0xda7f, 0x52fd, 0xdb5b, + 0xdb5c, 0xdce4, 0xdcc1, 0xdcfd, 0xdcc2, 0xdcd6, 0xdcc3, 0xdcc4, + 0x52fd, 0xdcdc, 0xdcc5, 0xdcc6, 0xdcc7, 0xdce1, 0xdcc8, 0xdcc9, + 0xdcca, 0xdccb, 0x47f2, 0xdccc, 0xdccd, 0xe035, 0xe036, 0xe047, + 0xe037, 0xe21b, 0xe21c, 0xe21d, 0xe21e, 0xe21f, 0xe220, 0xe27b, + 0xe27a, 0xe2fe, 0xe3c6, 0xe3c7, 0xe3c8, 0xe3c9, + /* 0x53 */ + 0xe3ca, 0x52fd, 0xe7a0, 0xe7a1, 0xe8cc, 0xe8cd, 0xe9f1, 0xe9d7, + 0xeb42, 0xeb46, 0xeba3, 0xeba5, 0xeba6, 0xedcb, 0xedcc, 0xee26, + 0xee27, 0xee28, 0xee29, 0xefae, 0xefaf, 0xefb0, 0xf073, 0x52fd, + 0xf07c, 0xf074, 0x52fd, 0xf280, 0xf075, 0x4c79, 0x52fd, 0xf2cf, + 0x52fd, 0xf68f, 0x5970, 0x5385, 0x5697, 0x56f6, 0x56f7, 0x56f8, + 0x56fa, 0x56fb, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x5834, 0x5835, + 0x58a2, 0x5914, 0x5911, 0x596e, 0x596f, 0x5b08, 0x5bb8, 0x5d09, + 0x5dbd, 0x5dbe, 0x5e88, 0x62fe, 0x1d7a, 0x62ff, 0x6300, 0x6301, + 0x6302, 0x6303, 0x6304, 0x6305, 0x6306, 0x52fd, 0x6307, 0x6308, + 0x6309, 0x630a, 0x630b, 0x630c, 0x630d, 0x630e, 0x630f, 0x52fd, + 0x52fd, 0x52fd, 0x652c, 0x676b, 0x52fd, 0x676c, 0x6787, 0x676d, + 0x6878, 0x698b, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, + /* 0x54 */ + 0x6bbe, 0x6ba8, 0x6ba9, 0x6baa, 0x6b8d, 0x6bab, 0x6bac, 0x6bbf, + 0x52fd, 0x032c, 0x6bad, 0x6bae, 0x6ca4, 0x6ca5, 0x6dc7, 0x6dc8, + 0x6dc9, 0xd0bc, 0x6dca, 0x6dcb, 0x6dcc, 0x6dcd, 0x6dce, 0x6f19, + 0x6fe6, 0x724c, 0x724d, 0x724e, 0x7306, 0x52fd, 0x75cd, 0x75ce, + 0x75cf, 0x75d0, 0x245c, 0x7881, 0x7882, 0x5833, 0x7b6a, 0x7b6b, + 0x7bb2, 0x7b6c, 0x7b6d, 0x7bcc, 0x7bae, 0x7bb3, 0x7b91, 0x52fd, + 0x7b6e, 0x7bb4, 0x7b6f, 0x80c9, 0x80a7, 0x80a8, 0x80a9, 0x80aa, + 0x80ab, 0x80ac, 0x80ad, 0x80ae, 0x80af, 0x80b0, 0x8060, 0x80b1, + 0x81e1, 0x82e3, 0x82f6, 0x26d9, 0x85af, 0x85b0, 0x85b1, 0x85ba, + 0x85b2, 0x85b3, 0x864c, 0x52fd, 0x86a0, 0x86a1, 0x89b0, 0x89b1, + 0x89b2, 0x89b3, 0x89b4, 0xfaeb, 0x89b5, 0x89b6, 0x89b7, 0x89b8, + 0x89b9, 0x89ba, 0x2b72, 0x89bb, 0x89bc, 0x89bd, + /* 0x55 */ + 0x89be, 0x89bf, 0x89df, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, + 0x2b78, 0x52fd, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, + 0x8a3c, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, + 0x2c5a, 0x8c1d, 0x8c1e, 0x8d64, 0x8d65, 0x8dc5, 0x8dc6, 0x8dc7, + 0x8dff, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x92f5, 0x935c, 0x92f6, + 0x92f7, 0x92b0, 0x92f8, 0x92f9, 0x935d, 0x9350, 0x92fa, 0x92fb, + 0x92a2, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0xfb13, 0x9300, 0xfb1f, + 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, + 0x96c9, 0x96ca, 0x96cb, 0xe3ef, 0x96d7, 0x96cc, 0x96cd, 0x96ce, + 0x9722, 0x96cf, 0x96d0, 0x52fd, 0x96d1, 0x96d2, 0x96e9, 0x96d3, + 0x96d4, 0x96d5, 0x9838, 0x633b, 0x9b7d, 0x586f, 0x9ba1, 0x9d53, + 0x9d54, 0x0afb, 0x9d55, 0x9d3c, 0x9d56, 0x52fd, + /* 0x56 */ + 0x9d66, 0x0afc, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d67, + 0x9d5c, 0x52fd, 0x52fd, 0x9d6a, 0x9d5d, 0x9d3d, 0x9d5e, 0x9d65, + 0x9fe1, 0x9fcd, 0xf311, 0xa16f, 0xa170, 0xa31a, 0xa39a, 0xa39b, + 0xa39c, 0xa39e, 0xa39f, 0xfb3f, 0xa58e, 0x52fd, 0xa6fd, 0x52fd, + 0xa85e, 0xa85f, 0xa860, 0xa865, 0xa867, 0xa868, 0xa869, 0x52fd, + 0xa86a, 0xa88f, 0xa86b, 0xa86c, 0xa86d, 0xa9f7, 0xa9f8, 0xa9f9, + 0xa9e4, 0xa9fa, 0xabb1, 0xab75, 0xab76, 0xacff, 0xad00, 0xad01, + 0xad02, 0xad03, 0xadae, 0xadad, 0xaf51, 0xaf52, 0x52fd, 0xaf53, + 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, + 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, + 0xaf64, 0xaf4c, 0xaf66, 0xb1f1, 0xb1f2, 0xb3f2, 0xb3f3, 0xb3f4, + 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, + /* 0x57 */ + 0xb54c, 0xb54b, 0xb61b, 0xb6ce, 0xb6b3, 0xb77f, 0xfb79, 0xfb7c, + 0xb81a, 0xb8c4, 0xb8c5, 0xb8c6, 0xb8c7, 0xb8c8, 0xb8c9, 0x52fd, + 0xbb19, 0xbb1c, 0xbb1a, 0xbc4c, 0xbc8e, 0xbd7e, 0xc1eb, 0xc1ec, + 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f0, 0xc1f1, 0xc1d8, 0xc1d9, 0xc1da, + 0xc1db, 0xc1f2, 0xc1f3, 0xc1f4, 0xc207, 0x52fd, 0xfbac, 0x52fd, + 0xc1f5, 0xc215, 0x52fd, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, + 0xc1fb, 0xc1fc, 0xc1fd, 0xc1fe, 0xc2a7, 0xc1ff, 0xc200, 0xc201, + 0xc202, 0xc203, 0xc204, 0xc205, 0xc4e9, 0xc4ea, 0xc4eb, 0xc6de, + 0xc6df, 0x52fd, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xca3e, 0xca3f, + 0xca40, 0xca41, 0xcb71, 0xcb72, 0xcb73, 0xcd88, 0xcd89, 0xcd8a, + 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, + 0x52fd, 0xcff1, 0xd0be, 0xd0bf, 0xd0c0, 0xd0c1, + /* 0x58 */ + 0xd0c2, 0xd0c3, 0xd16e, 0xd237, 0xd257, 0xd238, 0xd239, 0xd23a, + 0xd23b, 0xd23c, 0xd23d, 0xd23e, 0xd227, 0xd23f, 0x52fd, 0x52fd, + 0xd3c0, 0xd3c1, 0x44be, 0xd567, 0x52fd, 0xd568, 0xd658, 0xd665, + 0xd659, 0xd65a, 0xd724, 0xd8cd, 0xd8ce, 0xd8cf, 0xd8d2, 0xda9f, + 0xda22, 0xdb7d, 0xdb7e, 0xdcff, 0xdd25, 0xdd00, 0xdd01, 0x483b, + 0xdd02, 0xdd03, 0xdd04, 0x5128, 0xdd05, 0xdd06, 0xdd07, 0xdd16, + 0xdd08, 0xdd17, 0xdd09, 0xdd0a, 0x4840, 0xdd0b, 0xdd0c, 0xdd29, + 0x483a, 0xdd0d, 0x52fd, 0xdd0e, 0xdd10, 0xdd11, 0xdd1d, 0xdd12, + 0xdd13, 0x52fd, 0xdd14, 0xdd15, 0xdf8d, 0xe054, 0xe055, 0xe056, + 0xe233, 0xe234, 0xe235, 0xe236, 0xe2fa, 0xe3e3, 0xe3e6, 0xe3ed, + 0xe3e7, 0xe3e8, 0xe3e9, 0xe3ea, 0xe3eb, 0xe527, 0xe520, 0xfbf8, + 0xe72a, 0xe7c9, 0x52fd, 0xe7ca, 0xe7cb, 0xe7d9, + /* 0x59 */ + 0xe7cc, 0xe7cd, 0xe7ce, 0x52fd, 0xe8e1, 0xea1b, 0xea1c, 0xea1d, + 0xea1e, 0xeb47, 0xebd1, 0xebc9, 0xedd0, 0xedd1, 0xee3f, 0xee40, + 0xee41, 0xfc09, 0xee42, 0xefc4, 0xf09b, 0xf092, 0xf093, 0x4c96, + 0xf094, 0xf095, 0x52fd, 0x52fd, 0xf2f3, 0xf2f4, 0xf2f5, 0xf2f6, + 0xf560, 0xf59e, 0xf5a0, 0xf5a1, 0xf61c, 0xf69f, 0x5356, 0x5712, + 0x571f, 0x5715, 0x5716, 0x5717, 0xfa0c, 0x5718, 0x57c2, 0x57c3, + 0x57c4, 0x58a1, 0x591b, 0x591c, 0x5971, 0x5b13, 0x5e17, 0x5e8f, + 0x635f, 0x6360, 0x63ac, 0x52fd, 0x52fd, 0x6361, 0x6362, 0x6363, + 0x6364, 0x6365, 0x52fd, 0x6799, 0x679a, 0x679b, 0x679c, 0x679d, + 0x679e, 0x679f, 0x67a0, 0x6bda, 0x6bdb, 0x6bdc, 0x6bdd, 0x6bde, + 0x6bdf, 0x6dd5, 0x6dd6, 0x6dd7, 0x6dd8, 0x6de0, 0x6eb4, 0x52fd, + 0x726e, 0x726f, 0x7270, 0x7463, 0x52fd, 0x75d5, + /* 0x5a */ + 0x75d6, 0x75d7, 0x75d8, 0x7730, 0x7bb5, 0x7bb6, 0x7bc1, 0x7bf7, + 0x05a0, 0x7bcb, 0x7be8, 0x52fd, 0x7be9, 0x7bb7, 0x7d15, 0x80e6, + 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80eb, 0xfaca, 0x830b, 0x830c, + 0x8364, 0x85d4, 0x85d5, 0x85d6, 0x85d8, 0x86a5, 0x535b, 0x8a0f, + 0x8a10, 0x52fd, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, + 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a2f, 0x8a1b, 0x8a1c, 0x8a3f, + 0x8a1d, 0x8a1e, 0x8a2c, 0x8a1f, 0x8c24, 0x8ca4, 0x8ca5, 0xb551, + 0x8dfe, 0x8f11, 0x8f12, 0x8f13, 0x8f54, 0x935e, 0x9321, 0x933f, + 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9320, 0x9345, 0x52fd, + 0x9346, 0x93b0, 0x9347, 0x9357, 0x9301, 0x93b1, 0x935a, 0x9348, + 0x9704, 0x9705, 0x31f5, 0x974f, 0x9750, 0x9706, 0x9707, 0x9708, + 0x9709, 0x970a, 0x970b, 0x970c, 0x970d, 0x970e, + /* 0x5b */ + 0x970f, 0x9710, 0x9711, 0x9833, 0x9834, 0x9835, 0x98fc, 0x98fd, + 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x0b01, 0x9d7b, 0x9d7c, 0x9d7d, + 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9ef9, 0x9fda, 0xa1a1, + 0x52fd, 0x52fd, 0xa3ad, 0xa3ae, 0x52fd, 0xa5c8, 0xa5c9, 0xa5ca, + 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, + 0xa88a, 0x52fd, 0xaa07, 0xaa08, 0xaa01, 0xaa09, 0xaa02, 0xaa0a, + 0xaa0b, 0xaa0c, 0xaba7, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, + 0x3950, 0xab9d, 0xad1a, 0xadb2, 0xafb0, 0xafb1, 0x3b14, 0xafb2, + 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafc0, 0xafb7, 0xafb8, 0xafb9, + 0xafba, 0xb01d, 0xb20c, 0xb20d, 0xb20e, 0xb235, 0xb20f, 0xb210, + 0xb211, 0xb212, 0xb422, 0xb423, 0xb424, 0x52fd, 0xb425, 0xb426, + 0xb427, 0xb428, 0xb429, 0xb42a, 0xb42b, 0xb42c, + /* 0x5c */ + 0xb42d, 0xb42e, 0xb552, 0xb553, 0xb619, 0xb6bf, 0xb78b, 0xb78c, + 0xb823, 0xb824, 0xb8f1, 0xb8d8, 0xfb7f, 0xbb4e, 0xbb4f, 0xbb55, + 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb02, 0xbb54, 0xbbf1, 0xbc24, + 0xbdd1, 0xc27c, 0xc27d, 0xc27e, 0xc27f, 0xc280, 0xc29f, 0xc281, + 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc29b, + 0xc289, 0xc28a, 0xc28b, 0xc28c, 0x52fd, 0xc2a1, 0xc28d, 0xc28e, + 0xc4f3, 0xc4f4, 0xc4f5, 0xc724, 0xc725, 0xc726, 0xc727, 0xc728, + 0xc729, 0xc72a, 0x52fd, 0xc72b, 0xc8cd, 0xc901, 0x788d, 0xca70, + 0xcb80, 0xcb81, 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, + 0xcdc6, 0xcdc7, 0xcdc8, 0xcffe, 0x52fd, 0xd0d9, 0xd0dc, 0xd0da, + 0xd175, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd3ec, 0x131a, + 0xd3f3, 0xd572, 0xd573, 0xd682, 0xd683, 0xd72a, + /* 0x5d */ + 0xd72b, 0xd72c, 0xd72d, 0xd8f6, 0xd900, 0xd8f7, 0xd8f8, 0xd8f9, + 0x52fd, 0xdb94, 0xdb95, 0xdb96, 0xdc1b, 0xdd86, 0xdd4c, 0xdd4d, + 0xdd83, 0x52fd, 0xdd82, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd81, + 0x4887, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0x52fd, 0xdd56, 0xdd57, + 0x4885, 0xdd58, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, + 0xdd61, 0xdd7c, 0xdd62, 0x143c, 0x52fd, 0xdd63, 0xdd64, 0xe073, + 0xe245, 0xe246, 0xe247, 0xe24c, 0xe312, 0x52fd, 0xe313, 0xe439, + 0xe403, 0xe40d, 0xe530, 0xe5d5, 0xe6c0, 0xe7f2, 0xe7f3, 0xe7f4, + 0xe7f5, 0xe7f6, 0xe7f7, 0xe8fa, 0xe8fb, 0xea45, 0xea46, 0xeb49, + 0xebe7, 0xebe8, 0xedd8, 0xedd9, 0xee55, 0xee56, 0xee57, 0xefda, + 0xefdb, 0xefdc, 0xf0b8, 0xf0b9, 0xf0ba, 0x4cb1, 0xf0bb, 0xf289, + 0xf0bc, 0xf330, 0xf331, 0xf332, 0xf333, 0x52fd, + /* 0x5e */ + 0xf334, 0xf335, 0xf336, 0x4e47, 0xf337, 0xf5b2, 0xf690, 0xf626, + 0xf6a2, 0xf738, 0x52fd, 0x572e, 0x52fd, 0x572f, 0x5730, 0x572a, + 0x572b, 0x57c9, 0x5837, 0x5920, 0x5972, 0x5b1f, 0x5c65, 0x5cca, + 0x5dc0, 0x5dc1, 0x5dc2, 0x63b7, 0x63b8, 0x63b9, 0x63ba, 0x63bb, + 0x52fd, 0x52fd, 0x63bc, 0x63bd, 0x63be, 0x63f2, 0x67b5, 0x67b7, + 0x67b8, 0x63df, 0x67b9, 0x67d5, 0x67ba, 0x67bb, 0x684a, 0x6bf2, + 0x6bf3, 0x6bf4, 0x6bfa, 0x6bf5, 0x6c02, 0x6de2, 0x6de3, 0x728e, + 0x728b, 0x75e4, 0x75eb, 0x75e5, 0x7735, 0x7893, 0x7bea, 0x7beb, + 0x52fd, 0x7bec, 0x7bed, 0x7c17, 0x7bee, 0x7bef, 0x7bf0, 0x810e, + 0x810f, 0x8110, 0x8119, 0x8118, 0x8111, 0x8112, 0x8113, 0xfac7, + 0x8114, 0x8115, 0x066b, 0x8116, 0x8365, 0x85ea, 0x85eb, 0x85ec, + 0x85ed, 0x52fd, 0x85ee, 0x86ac, 0x8ac2, 0x8a69, + /* 0x5f */ + 0x8a81, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, + 0x07f4, 0x8a71, 0x8a72, 0x8a73, 0x8a8c, 0x8a74, 0x8a75, 0x8a76, + 0x8f24, 0x8f2a, 0x938e, 0x93af, 0x938f, 0x9390, 0x9391, 0x52fd, + 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, + 0x939a, 0x939b, 0x939c, 0x9739, 0x973b, 0x973a, 0x973c, 0x973d, + 0x973e, 0x973f, 0x9770, 0x9740, 0x9741, 0x9bc0, 0x9bc1, 0x9da4, + 0x9d97, 0x9da5, 0x9d98, 0x9d99, 0x9d9a, 0x52fd, 0x9d9b, 0x9da6, + 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0xddce, 0x9dc8, 0x9da0, 0x9e19, + 0x9f0d, 0xa3bf, 0xa5e9, 0xa5ea, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a5, + 0xa8a6, 0xaa15, 0xaa17, 0xabbf, 0xabc0, 0xabc1, 0xabc2, 0xabc3, + 0xabc4, 0xabc5, 0x6c0d, 0xad23, 0xadbe, 0xb003, 0xb004, 0xb005, + 0xb006, 0xb007, 0xb008, 0xb009, 0xb00a, 0xb00b, + /* 0x60 */ + 0xb00c, 0xb020, 0xb00d, 0xb00e, 0xb00f, 0x52fd, 0xb226, 0xb227, + 0xb228, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, + 0xb464, 0xb465, 0xb557, 0xb6cf, 0xb6d0, 0xb799, 0xb79a, 0xb8ea, + 0xb8eb, 0xb8ec, 0xbb7e, 0xbb7f, 0xbb80, 0x52fd, 0x52fd, 0xbb81, + 0xbb82, 0xbbf3, 0xbc25, 0xbc9f, 0xbca0, 0xbcf3, 0xbd00, 0xc2eb, + 0xc2ec, 0xc2ed, 0xc2ee, 0xc2ef, 0x52fd, 0x105c, 0xc2f0, 0xc2f1, + 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f9, 0xc2fa, 0xc2fb, 0xc2fc, + 0xc2fd, 0xc2fe, 0xc2ff, 0xc300, 0xfbae, 0xc301, 0xc302, 0xc503, + 0xc786, 0xc779, 0x52fd, 0xc77a, 0xc77b, 0xc77c, 0xc784, 0xc77d, + 0xc77e, 0xc77f, 0xca86, 0xca87, 0xcb00, 0xcb01, 0xcb88, 0xcb89, + 0xcb8a, 0xcdf5, 0x52fd, 0xce25, 0xcdf6, 0xd0eb, 0xd0ec, 0xd0ed, + 0xd0ee, 0x1287, 0xd0ef, 0xd0f0, 0xd26c, 0xd421, + /* 0x61 */ + 0xd422, 0xd423, 0xd424, 0xd425, 0xd426, 0xd57b, 0xd57c, 0xd691, + 0xd692, 0xd693, 0xd90e, 0xd90f, 0xd910, 0xdbb3, 0xdc36, 0xddc6, + 0xdda1, 0xdda2, 0x48b9, 0xdda3, 0xddcc, 0xdda4, 0xdda5, 0xdda6, + 0xddcb, 0xdda7, 0x52fd, 0xdda8, 0xdda9, 0xddaa, 0x52fd, 0xddab, + 0xddac, 0xddad, 0x48bf, 0xddae, 0xddaf, 0xddb0, 0xe08c, 0xe08d, + 0xe08e, 0xfbf1, 0xe092, 0xe08f, 0xe252, 0xe253, 0xe254, 0xe255, + 0xe429, 0x52fd, 0xe5f3, 0xe5f4, 0xe80d, 0xe80e, 0xe80f, 0xe810, + 0xe914, 0xea71, 0xea72, 0xec0f, 0xec04, 0xec06, 0x52fd, 0xec07, + 0xeddc, 0xeddd, 0xee6d, 0xee79, 0xee6e, 0x52fd, 0xefec, 0xf0dd, + 0xf0de, 0xf0df, 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf13a, + 0xf0e5, 0x4ccf, 0xf0e6, 0xf36b, 0xf36c, 0x974e, 0x4e64, 0xf5bd, + 0xf5be, 0xf5bf, 0xf634, 0x4fbf, 0xf812, 0x5740, + /* 0x62 */ + 0x5741, 0x6402, 0x6403, 0x6404, 0x6405, 0x6406, 0x67d7, 0x67cc, + 0x6998, 0x6c06, 0x6c07, 0x6caf, 0x6cb0, 0x6dea, 0x6df2, 0x72a2, + 0x72a3, 0x72a4, 0x7476, 0x75f5, 0x75f6, 0x75f7, 0x52fd, 0x7c3b, + 0x7c25, 0x7c3a, 0x7c3c, 0x7c3d, 0x7c3e, 0x8137, 0x8138, 0x8139, + 0x813a, 0x813b, 0x813c, 0x813d, 0x813e, 0x813f, 0x814b, 0x52fd, + 0x8140, 0x8322, 0x8367, 0x83d3, 0x85fa, 0x52fd, 0x8abc, 0x52fd, + 0x52fd, 0x8aa5, 0x0807, 0x8ab6, 0x52fd, 0x8aa6, 0x8abb, 0x8aa7, + 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8abf, 0x8aad, 0x8aae, + 0x8aaf, 0x8c2e, 0x8e00, 0x939d, 0x939e, 0x93cb, 0x93cc, 0x93cd, + 0x93ce, 0x93cf, 0x52fd, 0x939f, 0x93d0, 0x93d1, 0x93d2, 0x93d3, + 0x93d4, 0x52fd, 0x52fd, 0x975d, 0x975e, 0x975f, 0x9760, 0x0b05, + 0x9dba, 0x9dbc, 0x0b06, 0x9db5, 0x9dbd, 0x9db6, + /* 0x63 */ + 0x9db7, 0x9db8, 0x9da8, 0xfb32, 0x9efe, 0x9efc, 0xa1e1, 0xa3c4, + 0xa3c5, 0xa614, 0xa8ae, 0xa8af, 0xa8b0, 0xa8b1, 0xa8b9, 0xabe7, + 0xb046, 0x52fd, 0xb047, 0xb048, 0xb049, 0xb01e, 0xb01f, 0xb04a, + 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0x52fd, 0xb246, 0xb24b, 0xb490, + 0xb491, 0x52fd, 0xb492, 0xb493, 0xb494, 0xb55b, 0xb8f2, 0xb8f8, + 0xb8f9, 0xbb94, 0xbba4, 0xbb97, 0xbb98, 0xbc29, 0xbcae, 0xbdaf, + 0xc359, 0xc35a, 0x52fd, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, + 0xc360, 0xc361, 0xc2aa, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, + 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, + 0xc36f, 0x52fd, 0xc7b2, 0xc7b3, 0xc7b4, 0x10f9, 0xc7b5, 0xc7b6, + 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xca88, 0x42b8, 0xce19, + 0xce1a, 0xce1b, 0xcf16, 0xd10c, 0xd10d, 0xd10e, + /* 0x64 */ + 0xd10f, 0x52fd, 0xd283, 0xd284, 0xd285, 0xd583, 0xd584, 0xd6b0, + 0x52fd, 0xd926, 0xd927, 0xd936, 0xd928, 0xd929, 0x52fd, 0x52fd, + 0xdde7, 0xdde8, 0xdde9, 0x1453, 0xddea, 0xddeb, 0x52fd, 0xddec, + 0xdded, 0xddee, 0xddef, 0xddf0, 0xddf1, 0xde0c, 0xddf2, 0xddf3, + 0xddf4, 0xddf5, 0xddf6, 0xddf7, 0xddf8, 0xe0a3, 0xe0a4, 0xe0a5, + 0xe0a6, 0xe0a7, 0x52fd, 0xe25c, 0x52fd, 0xe44b, 0xe4e1, 0xe615, + 0x52fd, 0xe616, 0xe617, 0xe82c, 0xe82d, 0xe922, 0xe923, 0xea96, + 0xea97, 0x52fd, 0xec2e, 0xec30, 0xec31, 0x52fd, 0xeddf, 0xee8b, + 0xee8c, 0x52fd, 0xee8d, 0xeffc, 0xeffd, 0xeffe, 0xefff, 0xf117, + 0xf12d, 0xf118, 0x4cf3, 0xf119, 0x52fd, 0xf112, 0xf11a, 0xf11b, + 0xf11c, 0x1669, 0x52fd, 0xf397, 0x16e5, 0xf398, 0xf399, 0x52fd, + 0xf6c4, 0x574f, 0x57cd, 0x5dc7, 0x641c, 0x641d, + /* 0x65 */ + 0x641e, 0x67e7, 0x67e9, 0x67ea, 0x67eb, 0x6c15, 0x6ff1, 0x6ff2, + 0x72b6, 0x78a0, 0x7c4a, 0x7d20, 0x8160, 0x8161, 0x8141, 0x8162, + 0x8603, 0x8604, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x52fd, + 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x0812, 0x8ae3, 0x52fd, + 0x8f31, 0x9405, 0x9406, 0x9407, 0x9772, 0x978a, 0x978b, 0x9788, + 0x52fd, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9842, 0x9843, + 0x52fd, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0xa3cb, 0xa622, 0x52fd, + 0x52fd, 0xa8c3, 0xa8c4, 0xa8c5, 0xa8c6, 0xaa1e, 0xaa25, 0xabf3, + 0xabf4, 0x52fd, 0xabf5, 0xad38, 0xad48, 0xadca, 0x3b4f, 0xb07a, + 0xb07b, 0xb255, 0xb256, 0xb4b1, 0xb4b2, 0xb4b3, 0x52fd, 0xb4b4, + 0xb4b5, 0xb7a4, 0xb900, 0xb901, 0xb902, 0xbbac, 0x52fd, 0xbcb3, + 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, + /* 0x66 */ + 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c0, 0xc3c1, 0xc3c2, 0xc3c3, + 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, + 0xc7e7, 0x52fd, 0xcab5, 0xcaa1, 0xcb95, 0xce3b, 0xce3c, 0xce3d, + 0xce3e, 0xcf14, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd296, + 0xd297, 0xd298, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd58f, + 0xd590, 0xd6bc, 0xd73b, 0xd93d, 0x52fd, 0xdbdf, 0xdc1e, 0xde23, + 0xde24, 0xde49, 0xde25, 0xde26, 0xde27, 0xde28, 0x4925, 0xde29, + 0xde2a, 0xde2e, 0xde2f, 0xde4e, 0xde30, 0xfbeb, 0xde31, 0xde32, + 0xde33, 0xde34, 0xde35, 0xde36, 0x52fd, 0xde37, 0xde50, 0xde38, + 0x52fd, 0xde39, 0xde3a, 0xde3b, 0xde3c, 0xde3d, 0xde3e, 0xe0b8, + 0xe0b9, 0xe262, 0xe263, 0xe341, 0xe46d, 0x52fd, 0xe652, 0xe637, + 0xe6db, 0xe83f, 0xe934, 0xeb5b, 0xec46, 0xec5a, + /* 0x67 */ + 0xec5b, 0xede1, 0xede2, 0xede3, 0xede4, 0xeea7, 0xeea8, 0xeea9, + 0xf00f, 0xf02b, 0xf156, 0xf157, 0xf158, 0xf15e, 0xf159, 0xf15a, + 0xf15b, 0xf15c, 0x52fd, 0xf168, 0x52fd, 0xf42c, 0xf3e2, 0xf3f3, + 0xf5d2, 0xf656, 0xf6ce, 0xf761, 0xf99b, 0xf9b4, 0x575c, 0xfa10, + 0x57d2, 0x5871, 0x5973, 0x5b2c, 0x5e94, 0x52fd, 0x643f, 0x6440, + 0x67f9, 0x67fa, 0x67fd, 0x67fb, 0x6c1c, 0x6c1d, 0x6dff, 0x6e00, + 0x6ff7, 0x9ffe, 0x52fd, 0x77b6, 0x7c54, 0x8177, 0x8179, 0x817a, + 0x817b, 0x8369, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b07, + 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b35, 0x52fd, 0x8f39, 0x941e, + 0x941f, 0x9420, 0x9421, 0x52fd, 0x9422, 0x9423, 0x9424, 0x942c, + 0x97b3, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x9dd0, 0x9ffa, 0xa207, + 0xa2bd, 0xa3d7, 0xa3d2, 0xa8db, 0xa8d6, 0x575d, + /* 0x68 */ + 0xad43, 0xadcf, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0a8, + 0xb0a9, 0xb25d, 0xb25e, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb906, + 0xb907, 0x52fd, 0xbbc5, 0xbbf5, 0xbcb4, 0xbcb8, 0xbcb5, 0xc3fd, + 0x1077, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc409, + 0xc404, 0xc405, 0xc406, 0xc407, 0xc811, 0xc812, 0xc813, 0xc814, + 0xc815, 0x4277, 0xcb98, 0xcb99, 0xd13c, 0xd12d, 0xd12e, 0x52fd, + 0xd4bb, 0xd4bc, 0x1378, 0xd73d, 0xd947, 0xd948, 0xd949, 0xd94a, + 0xdae1, 0xdae7, 0xdbeb, 0xdc20, 0xdc38, 0xde62, 0xde67, 0xde68, + 0xde69, 0xde6a, 0xde6b, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, + 0xde72, 0xde8f, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xe0c9, + 0xe0ca, 0x4ae6, 0xe0cb, 0xe0cc, 0xe0cd, 0xe351, 0x52fd, 0x52fd, + 0xe545, 0xe859, 0xe85a, 0xe85b, 0xe940, 0xeacf, + /* 0x69 */ + 0xeb5e, 0xec7b, 0xed93, 0xeebc, 0xf016, 0xf030, 0x52fd, 0xf18d, + 0xf18e, 0x4d2f, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, + 0xf195, 0xf196, 0xf423, 0xf414, 0xf5db, 0xf70a, 0xf8ce, 0x5766, + 0x5768, 0x5767, 0x57d3, 0x6463, 0x6804, 0x699e, 0x6c26, 0x6c2a, + 0x7c6c, 0x7c64, 0x818f, 0x8190, 0x8334, 0x860e, 0x8b25, 0x8b26, + 0x8b27, 0x52fd, 0x8b28, 0x2c0c, 0x52fd, 0x8b29, 0x8b2a, 0x8b2b, + 0x8b2c, 0x8f3e, 0x9442, 0x9443, 0x9433, 0x97c1, 0x97c2, 0x97c3, + 0x9dd6, 0x9dd7, 0xa8e1, 0xa8e2, 0xaa2b, 0xadd1, 0xb0cc, 0xb0cd, + 0xb0ce, 0xb0cf, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1, 0xbbf6, 0xc42c, + 0x52fd, 0xc454, 0xc42d, 0xc42e, 0xc841, 0xc842, 0xcac7, 0xcba0, + 0xcba1, 0xce70, 0xce71, 0xce72, 0x52fd, 0xd134, 0xd135, 0xd136, + 0xd2a6, 0xd4cc, 0x52fd, 0xd599, 0xdbf4, 0xde9b, + /* 0x6a */ + 0xde9e, 0xde9f, 0xdea0, 0xdea1, 0xdea2, 0xdea3, 0xdea4, 0xdea5, + 0xdea6, 0xdea7, 0xdea8, 0xe0db, 0xe0dc, 0xe0dd, 0xe0d7, 0xe0de, + 0xe0df, 0xe359, 0xe746, 0xe865, 0xe949, 0x52fd, 0xeadd, 0xec95, + 0xec96, 0xec97, 0xeed4, 0xeed6, 0xf026, 0x4d47, 0x1688, 0xf1c8, + 0xf1c5, 0xf1c6, 0xf1c7, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, + 0xf5de, 0x52fd, 0x576d, 0x57d5, 0x6472, 0x74ae, 0x760f, 0x7c6b, + 0x7c6d, 0x7c6e, 0x7c78, 0x8198, 0x8199, 0x819a, 0x8b44, 0x8b5c, + 0x8b45, 0x8e01, 0x9458, 0x9459, 0x945a, 0x52fd, 0x97d9, 0x97d6, + 0x9dda, 0x9ddf, 0x9ddb, 0xa003, 0xa8ef, 0x3836, 0xaa33, 0xadd2, + 0xb0e1, 0xb26f, 0xb564, 0xb90e, 0xc450, 0xc451, 0xc452, 0xc856, + 0xc857, 0xc858, 0x52fd, 0xce81, 0xce82, 0xcf1d, 0xcf1e, 0xd143, + 0xd2aa, 0xdbfd, 0x52fd, 0xdec6, 0xdec7, 0xded9, + /* 0x6b */ + 0xded7, 0x52fd, 0xdec8, 0xdec9, 0xdeca, 0xdecb, 0xdeda, 0x52fd, + 0xdecc, 0xdecd, 0xdece, 0xdecf, 0xded0, 0xded1, 0xdebc, 0xe0e1, + 0xe0e2, 0xe0e3, 0xe4a9, 0xe54e, 0xe877, 0x52fd, 0x52fd, 0xecac, + 0xecad, 0xedb6, 0xeee5, 0xf1f8, 0xf1ea, 0xf28d, 0xf1eb, 0xf495, + 0x576e, 0x57d8, 0x6483, 0x69a3, 0x6c30, 0x6e0f, 0x7c79, 0x7c7a, + 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x8619, 0x8b50, 0x8b51, 0x8b52, + 0x2c15, 0x8b68, 0x8b53, 0x8b54, 0x9be2, 0x9ddc, 0xac15, 0xac16, + 0xad4f, 0xb0f5, 0xb0f6, 0xb0f7, 0xb4f4, 0xb7cc, 0xb90f, 0xc466, + 0xc467, 0x52fd, 0xc468, 0xcba4, 0xce8b, 0xce8c, 0xd4fa, 0xdee6, + 0xdeed, 0xdeee, 0xdeef, 0xdef0, 0xdefe, 0xe0e7, 0xe0e8, 0xe4b3, + 0xe4e4, 0xe883, 0xedec, 0x52fd, 0xf216, 0x52fd, 0x52fd, 0xf217, + 0xf4c3, 0xf4ac, 0xf5ed, 0x52fd, 0x52fd, 0xf8b4, + /* 0x6c */ + 0x52fd, 0x648a, 0x648b, 0x6c34, 0x6e14, 0x72df, 0x77bb, 0x7c7f, + 0x7c81, 0x81ad, 0x81ae, 0x8b62, 0x8b6e, 0x52fd, 0x946e, 0x52fd, + 0x9a17, 0x9de6, 0x9f10, 0xac19, 0x52fd, 0xb910, 0xbdf2, 0xc476, + 0xc477, 0xce95, 0xce96, 0xdf00, 0xdf01, 0xdf31, 0xfbed, 0xdf1c, + 0xe36d, 0xeef4, 0xeef5, 0xf03d, 0xf232, 0xf233, 0xf5f4, 0x52fd, + 0x5773, 0x6c37, 0x52fd, 0x8b71, 0xb10f, 0x52fd, 0xb10e, 0xb911, + 0xc485, 0xdf14, 0xdf15, 0xdf16, 0xdf17, 0xdf18, 0xdf19, 0xdf1a, + 0xe4c3, 0xf242, 0xf243, 0xf244, 0xf248, 0xf4fb, 0x69a5, 0x6cb8, + 0x81b2, 0x833d, 0x8b72, 0x97e7, 0x97e8, 0xa659, 0xaa3a, 0xb114, + 0xb4ff, 0xbcc0, 0xc48d, 0x1084, 0xc48e, 0x52fd, 0xdf22, 0x52fd, + 0x52fd, 0xef04, 0xef29, 0xf251, 0xf266, 0xf50e, 0xfc13, 0x52fd, + 0x649b, 0x649c, 0x7616, 0x7c86, 0x7c87, 0x52fd, + /* 0x6d */ + 0xdf2c, 0xdf30, 0xdf28, 0xe95f, 0x52fd, 0x947e, 0xb119, 0xd50a, + 0xdf36, 0xe0fc, 0xf26d, 0xf26e, 0xf9c6, 0x1ab5, 0x8b7b, 0xb506, + 0xc89f, 0xf532, 0xd50d, 0x7c8b, 0xdf3b, 0x52fd, 0xf53d, 0xdf3c, + 0xdf3d, +}; + +static const ucs4_t cns11643_15_2uni_upages[253] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04300, 0x04400, + 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04c00, 0x04f00, + 0x05100, 0x05200, 0x05300, 0x05400, 0x05500, 0x05600, 0x05700, 0x05800, + 0x05a00, 0x05b00, 0x05c00, 0x05e00, 0x05f00, 0x06200, 0x06500, 0x06600, + 0x06700, 0x06800, 0x06900, 0x06a00, 0x06b00, 0x06c00, 0x06e00, 0x06f00, + 0x07000, 0x07100, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, + 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07f00, 0x08200, 0x08300, + 0x08600, 0x08700, 0x08900, 0x08a00, 0x08e00, 0x08f00, 0x09000, 0x09200, + 0x09300, 0x09400, 0x09500, 0x09600, 0x09b00, 0x09c00, 0x09d00, 0x09e00, + 0x09f00, 0x0fa00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, + 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, + 0x20d00, 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, + 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, + 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, + 0x22500, 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, + 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, + 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, + 0x23d00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24200, 0x24300, 0x24400, + 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, + 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, + 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, + 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, + 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, + 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, + 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, + 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, + 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, + 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, + 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, + 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, + 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, +}; + +static int +cns11643_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x6d)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 7169) + swc = cns11643_15_2uni_page21[i], + wc = cns11643_15_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_2.h b/Externals/libiconv-1.14/lib/cns11643_2.h new file mode 100644 index 0000000000..7a73c60fa7 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_2.h @@ -0,0 +1,1112 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 2 + */ + +static const unsigned short cns11643_2_2uni_page21[7650] = { + /* 0x21 */ + 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, + 0x4e8d, 0x56d7, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, + 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, + 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, + 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, + 0x4edd, 0x4eda, 0x520c, 0x5209, 0x531c, 0x534c, 0x5722, 0x5723, + 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, + 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, + 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, + 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, + 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, + 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5210, 0x52a6, + /* 0x22 */ + 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, + 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, + 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, + 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, + 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, + 0x6259, 0x6260, 0x625a, 0x6265, 0x6537, 0x65ef, 0x65ee, 0x673e, + 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, + 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, 0x6c4c, + 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, + 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, + 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, + 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, + /* 0x23 */ + 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, + 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, + 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, + 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, + 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, + 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, + 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, + 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, + 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, + 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, + 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, + 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, + /* 0x24 */ + 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, + 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, + 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, + 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, 0x6759, + 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, + 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, + 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, + 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, + 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, + 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, + 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, + 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, + /* 0x25 */ + 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, + 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, + 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, + 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, + 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, + 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, + 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, + 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, + 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, + 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, + 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, + 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, + /* 0x26 */ + 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, + 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, + 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, + 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, + 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, + 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, + 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, + 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, + 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, + 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, + 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, + 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, + /* 0x27 */ + 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, + 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, + 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, + 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, + 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, + 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, + 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, + 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, 0x6cd2, + 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, + 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, + 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, + 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, + /* 0x28 */ + 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, + 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, + 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, + 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, + 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, + 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, + 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, + 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, + 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, + 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, + 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, + 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, + /* 0x29 */ + 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, + 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, + 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, + 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, + 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, + 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, + 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, + 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, + 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, + 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, + 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, + 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, + /* 0x2a */ + 0x5cdb, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, + 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, + 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, + 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, + 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, + 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, + 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, + 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, + 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, + 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, + 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, + 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, + /* 0x2b */ + 0x67ba, 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, + 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, + 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, + 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, + 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, + 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, + 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, + 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, + 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, + 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, + 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, + 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, + /* 0x2c */ + 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, + 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, + 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, + 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, + 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, + 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, + 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, + 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, + 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, + 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, + 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, + 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, + /* 0x2d */ + 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, + 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, + 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, + 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, + 0x82ea, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, + 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, + 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, + 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, + 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, + 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, + 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, + 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, + /* 0x2e */ + 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, + 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, + 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, + 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, + 0x54f1, 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, + 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, + 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, + 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, + 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, + 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, + 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, + 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, + /* 0x2f */ + 0x605a, 0x6067, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, + 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, + 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, + 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, + 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, + 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, + 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, + 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, + 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, + 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, + 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, + 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, + /* 0x30 */ + 0x6be6, 0x6be4, 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, + 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, + 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, + 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, + 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, + 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, + 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, + 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, + 0x7278, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, + 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, + 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, + 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, + /* 0x31 */ + 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, + 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, + 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, + 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, + 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, + 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, + 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, + 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, + 0x7b10, 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, + 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, + 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, + 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, + /* 0x32 */ + 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, + 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, + 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, + 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, + 0x831c, 0x8322, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, + 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, + 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, + 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, + 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, + 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, + 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, + 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, + /* 0x33 */ + 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, + 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, + 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, + 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, + 0x90e4, 0x9150, 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, + 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, + 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, + 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, + 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, + 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, + 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, + 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, + /* 0x34 */ + 0x5530, 0x5552, 0x5545, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, + 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, + 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, + 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, + 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, + 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, + 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, + 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, + 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, + 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, + 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, + 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, + /* 0x35 */ + 0x5d26, 0x5d25, 0x5d0f, 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, + 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, + 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, + 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, + 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, + 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, + 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, + 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, + 0x633b, 0x639f, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, + 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, + 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, + 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, + /* 0x36 */ + 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, + 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, + 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, + 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, + 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, + 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, + 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, + 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, + 0x6dcf, 0x6dc9, 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, + 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, + 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, + 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, + /* 0x37 */ + 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, + 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, + 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, + 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, + 0x75ce, 0x75d2, 0x75cf, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, + 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, + 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, + 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, + 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, + 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b3b, 0x7b34, + 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, + 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, + /* 0x38 */ + 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, + 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, + 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, + 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, + 0x7fcf, 0x7fc9, 0x801f, 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, + 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, + 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, + 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, + 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, + 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, + 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, + 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x8659, + /* 0x39 */ + 0x8656, 0x86bf, 0x86b7, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, + 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, + 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, + 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, + 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, + 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, + 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, + 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, + 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, + 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, + 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, + 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, + /* 0x3a */ + 0x91e4, 0x91f9, 0x91ea, 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, + 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, + 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, + 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, + 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, + 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, + 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, + 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, + 0x5829, 0x5837, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, + 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, + 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, + 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, + /* 0x3b */ + 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, + 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, + 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, + 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, + 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, + 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, + 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, + 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, + 0x60c4, 0x6114, 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, + 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, + 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, + 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, + /* 0x3c */ + 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, + 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, + 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, + 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, + 0x65ae, 0x65d0, 0x65d2, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, + 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, + 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, + 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, + 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, + 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, + 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, + 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, + /* 0x3d */ + 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, + 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, + 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, + 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, + 0x6e03, 0x6e2e, 0x6e5e, 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, + 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, + 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, + 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, + 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, + 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, + 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, + 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, + /* 0x3e */ + 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, 0x7421, 0x742d, 0x7431, + 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, + 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, + 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, + 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, + 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, + 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, + 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, + 0x7ae4, 0x7b4a, 0x7b47, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, + 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, + 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, + 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, + /* 0x3f */ + 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, + 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, + 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, + 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, + 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, + 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, + 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, + 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, + 0x8406, 0x83c2, 0x83f3, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, + 0x8413, 0x839a, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, + 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, + 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, + /* 0x40 */ + 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, + 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, + 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, + 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, + 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, + 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, + 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, + 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, + 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, + 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, + 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, + 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, + /* 0x41 */ + 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, + 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, + 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, + 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, + 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, 0x9683, 0x9680, + 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, + 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, + 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, + 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, + 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, + 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, + 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, + /* 0x42 */ + 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, + 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, + 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, + 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, + 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, 0x5ab7, 0x5ac0, 0x5aca, + 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, + 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, + 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, + 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, + 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, + 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, + 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, + /* 0x43 */ + 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, + 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, + 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, + 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, + 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, + 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, + 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, + 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, + 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, + 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, + 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, + 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, + /* 0x44 */ + 0x6b48, 0x6b41, 0x6b9b, 0x6bfb, 0x6bfc, 0x6bf9, 0x6bf7, 0x6bf8, + 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, + 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, + 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, + 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, + 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, + 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, + 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, + 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, 0x714d, 0x715a, 0x724f, + 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, + 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, + 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, + /* 0x45 */ + 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, + 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, + 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, + 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, + 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, + 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, + 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, + 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, + 0x7a17, 0x7a15, 0x7a22, 0x7a13, 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, + 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, + 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, + 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, + /* 0x46 */ + 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, + 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, + 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, + 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, + 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, 0x8161, 0x821d, + 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, + 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, + 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, + 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, + 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, + 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, + 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, + /* 0x47 */ + 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, + 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, + 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, + 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, + 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, 0x89e1, 0x89e0, 0x89e2, + 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, + 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, + 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, + 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, + 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, + 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, + 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, + /* 0x48 */ + 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, 0x9049, + 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, + 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, + 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, + 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, + 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, + 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, + 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, + 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, + 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, + 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, + 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, + /* 0x49 */ + 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, 0x51d8, 0x5280, + 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, + 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, + 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, + 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, + 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, + 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, + 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, + 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, 0x5c63, 0x5d82, + 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, + 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, + 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, + /* 0x4a */ + 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, + 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, + 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, + 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, + 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, + 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, + 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, + 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, + 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, 0x69a0, 0x69ce, 0x6996, + 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, + 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, + 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, + /* 0x4b */ + 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, + 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, + 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, + 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, + 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, 0x6f73, + 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, + 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, + 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, + 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, + 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, + 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, + 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, + /* 0x4c */ + 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, + 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, + 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, + 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, + 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, + 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, + 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, + 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, + 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, + 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, + 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, + 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, + /* 0x4d */ + 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, + 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, + 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, + 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, + 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, + 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, + 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, + 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, + 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, + 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, + 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, + 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, + /* 0x4e */ + 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, 0x88f0, + 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, + 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, + 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, + 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, + 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, + 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, + 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, + 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, 0x929a, + 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, + 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, + 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, + /* 0x4f */ + 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, + 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, + 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, + 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, + 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, + 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, + 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, + 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, + 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, 0x565a, 0x5640, + 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, + 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, + 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, + /* 0x50 */ + 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, + 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, + 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, + 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, + 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, + 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, + 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, + 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, + 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, + 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, + 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, + 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, + /* 0x51 */ + 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, + 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, + 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, + 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, + 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, 0x6f8d, + 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, + 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, + 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, + 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, + 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, + 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, + 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, + /* 0x52 */ + 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, + 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, + 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, + 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, + 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, + 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, + 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, + 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, + 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, + 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, + 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, + 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, + /* 0x53 */ + 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, + 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, + 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, + 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, + 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, + 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, + 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, + 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, + 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, + 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, + 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, + 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, + /* 0x54 */ + 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, + 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, + 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, + 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, + 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, + 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, + 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, + 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, + 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, 0x8e14, + 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, + 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, + 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, + /* 0x55 */ + 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, + 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, + 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, + 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, + 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, + 0x92b5, 0x92e1, 0x9325, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, + 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, + 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, + 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, + 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, + 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, + 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, + /* 0x56 */ + 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, + 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, + 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, + 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, + 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, + 0x566e, 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, + 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, + 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, + 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, + 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, + 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, + 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, + /* 0x57 */ + 0x5fbc, 0x5fbb, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, + 0x61c1, 0x61cc, 0x61ba, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, + 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, + 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, + 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, + 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, + 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, + 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, + 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, + 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, + 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, + 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, + /* 0x58 */ + 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, + 0x6fcf, 0x6fbf, 0x6fb8, 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, + 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, + 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, + 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, + 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, + 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, + 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, + 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, + 0x7795, 0x7799, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, + 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, + 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, + /* 0x59 */ + 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, + 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, + 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, + 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, + 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, + 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, + 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, + 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, + 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, + 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, + 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, + 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, + /* 0x5a */ + 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x87a4, + 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, + 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, + 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, + 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, + 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, + 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, + 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, + 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, + 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, + 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, + 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, + /* 0x5b */ + 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, + 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, + 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, + 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9313, 0x92f9, + 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, + 0x932a, 0x9314, 0x930c, 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, + 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, + 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, + 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, + 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, + 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, + 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, + /* 0x5c */ + 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, + 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, + 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, + 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, + 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, + 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, + 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, + 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, + 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, + 0x5fbe, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, + 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, + 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, + /* 0x5d */ + 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, + 0x6a87, 0x6a93, 0x6a8e, 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, + 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, + 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, + 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, + 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, + 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, + 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, + 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, + 0x77b7, 0x77b6, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, + 0x7902, 0x78fb, 0x78fc, 0x78ff, 0x78f2, 0x7905, 0x78f9, 0x78fe, + 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, + /* 0x5e */ + 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, + 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, + 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, + 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, + 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, + 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, + 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, + 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, + 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, + 0x85a4, 0x859a, 0x859e, 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, + 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, + 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, + /* 0x5f */ + 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, + 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, + 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, + 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, + 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, + 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, 0x8b16, 0x8b11, 0x8b05, + 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, + 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, + 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, + 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, + 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, + 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, + /* 0x60 */ + 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, + 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, + 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, + 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, + 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, + 0x979a, 0x97a1, 0x979c, 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, + 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, + 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, + 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, + 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, + 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, + 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, + /* 0x61 */ + 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, + 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, + 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, + 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, + 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, + 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, + 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, + 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, + 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, + 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, + 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, + 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, + /* 0x62 */ + 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, + 0x71f9, 0x7203, 0x71fd, 0x7376, 0x74b8, 0x74c0, 0x74b5, 0x74c1, + 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, + 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, + 0x77c2, 0x77ba, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, + 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, + 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, + 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, + 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, + 0x81d1, 0x81d2, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, + 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, + 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, + /* 0x63 */ + 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, + 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, + 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87d7, 0x87d9, + 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, + 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, + 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, + 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, + 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, + 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, + 0x8e67, 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, + 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, + 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, + /* 0x64 */ + 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, + 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x9380, 0x938d, + 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x95d2, + 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, + 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, + 0x97a4, 0x97aa, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, + 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, + 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, + 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, + 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, + 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, + 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, + /* 0x65 */ + 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, + 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, + 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, + 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, + 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, + 0x5dc3, 0x5e70, 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, + 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, + 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, + 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, + 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, + 0x7024, 0x701c, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, + 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, + /* 0x66 */ + 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, + 0x791d, 0x791b, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, + 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, + 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, + 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, + 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x820b, 0x8264, 0x8261, 0x8263, + 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, + 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, + 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, + 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, + 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, + 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, + /* 0x67 */ + 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, + 0x8b54, 0x8b4b, 0x8b55, 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, + 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, + 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, + 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, + 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, + 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, + 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, + 0x93a5, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, + 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, + 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, + 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, + /* 0x68 */ + 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, + 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, + 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, + 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, + 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, + 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, + 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, + 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, + 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, + 0x9f58, 0x5337, 0x56b2, 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, + 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, + 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, + /* 0x69 */ + 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, + 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, + 0x703f, 0x703a, 0x7039, 0x702a, 0x7040, 0x703b, 0x7033, 0x7041, + 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, + 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, + 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, 0x7a6e, 0x7a6c, + 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, + 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, + 0x81d9, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, + 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, + 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, + 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, + /* 0x6a */ + 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, + 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, + 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, + 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, + 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, + 0x9409, 0x93f8, 0x943c, 0x940a, 0x93ff, 0x93fc, 0x940c, 0x93f6, + 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, + 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, + 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, + 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, + 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, + 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, + /* 0x6b */ + 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, + 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, 0x9d94, + 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, + 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, + 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, + 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, + 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, + 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, + 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, + 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, + 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, + 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, + /* 0x6c */ + 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, + 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, 0x8829, 0x881d, + 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, + 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, + 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, + 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, + 0x943d, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, + 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, + 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, + 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, + 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, + 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, + /* 0x6d */ + 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, + 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, + 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, + 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, + 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, + 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, + 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, + 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, + 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, + 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, + 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, + 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, + /* 0x6e */ + 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, + 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, + 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, + 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, + 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, + 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, 0x9a52, 0x9a50, + 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, + 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, + 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, + 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, + 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, + 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, + /* 0x6f */ + 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, + 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, + 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, + 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, + 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, + 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, 0x8b8c, 0x8b8e, 0x8b8b, + 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, + 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, + 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, + 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, + 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, + 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, + /* 0x70 */ + 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, + 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, 0x9f70, + 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, + 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, + 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, + 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, + 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, + 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, + 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, + 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, + 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, + 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, + /* 0x71 */ + 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, + 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, 0x7e98, 0x7e9b, + 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, + 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, + 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, + 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, + 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, + 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, + 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9b2e, 0x9c74, 0x9c73, + 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, + 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, + 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, + /* 0x72 */ + 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, + 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, + 0x9481, 0x9a69, 0x9a68, 0x9e19, 0x864b, 0x8b9f, 0x9483, 0x9c79, + 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x7229, + 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, +}; + +static int +cns11643_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x72)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + { + if (i < 7650) + wc = cns11643_2_2uni_page21[i]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_3.h b/Externals/libiconv-1.14/lib/cns11643_3.h new file mode 100644 index 0000000000..e2630131bb --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_3.h @@ -0,0 +1,974 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 3 + */ + +static const unsigned short cns11643_3_2uni_page21[6148] = { + /* 0x21 */ + 0x1a28, 0x1a36, 0x1a3f, 0x1a85, 0x1a05, 0x1a04, 0x1d82, 0x1d96, + 0x1f38, 0x1f69, 0x1fb6, 0x1a2a, 0x1a87, 0x1a49, 0x1de2, 0x1a46, + 0x1a8f, 0x1abc, 0x1abe, 0x1d66, 0x1de3, 0x1e04, 0x1e9c, 0x1f44, + 0x2502, 0x250a, 0x2780, 0x29db, 0x2a7a, 0x2a7f, 0x2af4, 0x2b50, + 0x2b51, 0x2b61, 0x621d, 0x6d0b, 0x1a63, 0x1a62, 0x1aa3, 0x1d85, + 0x1ac5, 0x1acf, 0x1ace, 0x1acc, 0x1d84, 0x1d86, 0x8517, 0x00c5, + 0x1de4, 0x1e05, 0x1e9e, 0x1e9d, 0x1efd, 0x1f00, 0x1f3a, 0x0139, + 0x1f46, 0x1f5d, 0x1f86, 0x1fb7, 0x0155, 0x1fcc, 0x015b, 0x1fce, + 0x2321, 0x03a2, 0x2a00, 0x2b0c, 0x2e37, 0x2e38, 0x3134, 0x3135, + 0x31e0, 0x0a26, 0x3f8d, 0x1a97, 0x1ae0, 0x0032, 0x6ea9, 0x1ae7, + 0x0033, 0x1ae6, 0x0034, 0x02a2, 0x0031, 0x00b0, 0x22d8, 0x1d8b, + 0x1d8c, 0x1d99, 0x1de5, 0x8550, 0x1e0b, 0x00dc, + /* 0x22 */ + 0x021e, 0x1f04, 0x1f03, 0x1f07, 0x852a, 0x1f1e, 0x1f5f, 0x1f6d, + 0x1f89, 0x1fba, 0x1fd0, 0x0165, 0x1ff6, 0x1ff7, 0x1ff9, 0x0164, + 0x1ff4, 0x021d, 0x0226, 0x2324, 0x2504, 0x2518, 0x2532, 0x2530, + 0x2534, 0x028e, 0x2575, 0x034a, 0x2782, 0x27f9, 0x2814, 0x038b, + 0x03a6, 0x03a4, 0x03a5, 0x03a7, 0x042f, 0x0432, 0x2a81, 0x2a83, + 0x2b0d, 0x2b52, 0x04d4, 0x2bca, 0x2bc7, 0x2e39, 0x05c5, 0x2e4f, + 0x31e7, 0x332f, 0x377a, 0x3839, 0x08ba, 0x08b9, 0x3837, 0x3844, + 0x3845, 0x3f8c, 0x4192, 0x4276, 0x5c93, 0x5c92, 0x14b3, 0x15ba, + 0x1a21, 0x1a20, 0x1a22, 0x1a68, 0x1a89, 0x1a98, 0x1af9, 0x1aef, + 0x003b, 0x003c, 0x1af8, 0x1b06, 0x1b03, 0x1afc, 0x1aee, 0x1b16, + 0x0039, 0x1b28, 0x1b1c, 0x1b07, 0x1b1a, 0x1afa, 0x1b17, 0x1d4a, + 0x00b2, 0x1d72, 0x8515, 0x1db4, 0x1db3, 0x1db2, + /* 0x23 */ + 0x00c7, 0x1de8, 0x002b, 0x1e14, 0x1e0f, 0x1e15, 0x1e18, 0x1ea8, + 0x852c, 0x1f4b, 0x1f4f, 0x013b, 0x1f50, 0x0144, 0x1f8b, 0x0142, + 0x1fbe, 0x015c, 0x1fd2, 0x2016, 0x1fff, 0x0167, 0x2000, 0x0166, + 0x2005, 0x2013, 0x2015, 0x853b, 0x021f, 0x22e3, 0x2335, 0x2336, + 0x2331, 0x2332, 0x24ee, 0x2505, 0x1a54, 0x028f, 0x2536, 0x0290, + 0x02a8, 0x02a4, 0x257a, 0x02a3, 0x2586, 0x033d, 0x034c, 0x2786, + 0x2b53, 0x2818, 0x038c, 0x283d, 0x2878, 0x03a8, 0x03ad, 0x03af, + 0x7746, 0x2880, 0x0429, 0x2a08, 0x0436, 0x0471, 0x0470, 0x046f, + 0x2af5, 0x2b0e, 0x04a9, 0x04aa, 0x04fb, 0x2bd3, 0x2bda, 0x04fc, + 0x2bdb, 0x05ae, 0x2e0f, 0x2e5d, 0x2e5f, 0x2e67, 0x2e57, 0x6b50, + 0x06c3, 0x31eb, 0x31ea, 0x0730, 0x3337, 0x0741, 0x3332, 0x3336, + 0x3722, 0x37ce, 0x088c, 0x3858, 0x3851, 0x3877, + /* 0x24 */ + 0x383c, 0x08bb, 0x385a, 0x7c86, 0x3853, 0x3c6f, 0x3c72, 0x3c6e, + 0x8535, 0x09a1, 0x3c73, 0x3eb1, 0x3eb2, 0x0aa8, 0x3f8f, 0x0aaa, + 0x0aab, 0x0c96, 0x453c, 0x0dc2, 0x4c8d, 0x4c8e, 0x1093, 0x4e7b, + 0x1094, 0x5971, 0x5bb9, 0x5c96, 0x5c9a, 0x15bb, 0x1a24, 0x1a71, + 0x851b, 0x1a9c, 0x1b45, 0x1b4a, 0x1b39, 0x1b37, 0x0043, 0x1b32, + 0x1b42, 0x0042, 0x1b44, 0x1b4b, 0x0044, 0x1b40, 0x1b35, 0x1b31, + 0x1d51, 0x850e, 0x1d50, 0x1d4e, 0x00b3, 0x00b7, 0x1d9d, 0x00c8, + 0x1db5, 0x1db8, 0x1dec, 0x1e23, 0x1e27, 0x1e26, 0x1e1f, 0x1e2b, + 0x1e20, 0x1eb4, 0x1eb3, 0x0118, 0x1f25, 0x1f3b, 0x1f74, 0x0147, + 0x0146, 0x0145, 0x016b, 0x0169, 0x204d, 0x0172, 0x0171, 0x203a, + 0x016c, 0x016f, 0x2044, 0x204c, 0x2023, 0x201a, 0x2032, 0x204b, + 0x2021, 0x0173, 0x2034, 0x2049, 0x2050, 0x2022, + /* 0x25 */ + 0x203f, 0x2051, 0x205a, 0x202f, 0x0176, 0x22e9, 0x22f2, 0x22f3, + 0x22ef, 0x22ed, 0x22ec, 0x22e6, 0x2348, 0x0227, 0x2344, 0x233f, + 0x233c, 0x2353, 0x2356, 0x0230, 0x235f, 0x2343, 0x2358, 0x2357, + 0x0229, 0x022a, 0x022f, 0x2346, 0x022c, 0x233d, 0x022d, 0x2342, + 0x2354, 0x2355, 0x24f1, 0x24f2, 0x24f0, 0x250b, 0x6aa6, 0x22f1, + 0x253d, 0x0293, 0x2594, 0x258c, 0x02ad, 0x259c, 0x02ac, 0x02ab, + 0x259f, 0x02a9, 0x259b, 0x02ae, 0x2589, 0x259a, 0x02aa, 0x3188, + 0x034e, 0x278d, 0x0350, 0x27fe, 0x27ff, 0x27fd, 0x282b, 0x03b2, + 0x2884, 0x288e, 0x289c, 0x03b5, 0x03b6, 0x2885, 0x29f5, 0x2a09, + 0x0439, 0x043b, 0x2a0b, 0x0472, 0x2a92, 0x2a90, 0x2b03, 0x04ac, + 0x2b1e, 0x2b63, 0x0508, 0x2be7, 0x2bfe, 0x2be6, 0x2bdc, 0x2bce, + 0x0503, 0x2bfc, 0x2bdf, 0x2bec, 0x2bf6, 0x79d7, + /* 0x26 */ + 0x2bf2, 0x2bf0, 0x2bf9, 0x050b, 0x2e13, 0x05af, 0x85b2, 0x2e3b, + 0x2e3c, 0x2e82, 0x05ce, 0x05cb, 0x05cc, 0x2e78, 0x2e8b, 0x05cd, + 0x2e9e, 0x2ea5, 0x2e9b, 0x2e9c, 0x2e99, 0x2e8d, 0x2e85, 0x2e9d, + 0x2e75, 0x0680, 0x06af, 0x06d3, 0x31f6, 0x06d5, 0x06d4, 0x06d7, + 0x32f5, 0x335b, 0x0742, 0x3354, 0x3352, 0x0744, 0x3358, 0x3344, + 0x334a, 0x3361, 0x08c6, 0x387f, 0x3891, 0x389e, 0x08c0, 0x386e, + 0x387c, 0x389f, 0x3875, 0x08be, 0x3856, 0x38a2, 0x3879, 0x08ca, + 0x38a1, 0x08c4, 0x38aa, 0x38a0, 0x08c2, 0x3c79, 0x3c77, 0x3c7e, + 0x09a4, 0x3c75, 0x3c7b, 0x3e64, 0x0a29, 0x3ebb, 0x3ebc, 0x3ec7, + 0x3eb9, 0x3ebe, 0x3eb6, 0x0a60, 0x0a5e, 0x3f98, 0x0aad, 0x0aae, + 0x0aac, 0x0b57, 0x4193, 0x4280, 0x0bdd, 0x4283, 0x42c0, 0x42c1, + 0x0c0e, 0x0c97, 0x43f4, 0x43f5, 0x0d27, 0x46cc, + /* 0x27 */ + 0x46cd, 0x48fa, 0x4c9f, 0x4c91, 0x4c97, 0x4c94, 0x1095, 0x4e86, + 0x4e8c, 0x868f, 0x4e95, 0x1098, 0x526c, 0x119d, 0x5bb5, 0x5bbe, + 0x5bc7, 0x148a, 0x5bc1, 0x5ca9, 0x5ca4, 0x14b5, 0x14b6, 0x14b7, + 0x5ca8, 0x6227, 0x6226, 0x622b, 0x6233, 0x6234, 0x6229, 0x1a3d, + 0x0028, 0x1a9d, 0x1b93, 0x1b8a, 0x004d, 0x0049, 0x1b6d, 0x1b8e, + 0x1ba0, 0x1ba2, 0x1ba1, 0x1b9f, 0x1ba3, 0x6f09, 0x1b72, 0x0051, + 0x1b8c, 0x1d56, 0x850f, 0x8511, 0x1d90, 0x00cb, 0x00ca, 0x00cc, + 0x1ded, 0x1dfe, 0x1e2f, 0x71ec, 0x1e3c, 0x1e34, 0x1e39, 0x1eb9, + 0x1eb5, 0x1ebf, 0x1f55, 0x013d, 0x1f76, 0x1f7a, 0x1f93, 0x0148, + 0x1fc1, 0x1fc2, 0x1fd5, 0x2085, 0x0178, 0x205f, 0x2093, 0x2089, + 0x2079, 0x6afe, 0x208f, 0x2069, 0x206d, 0x017a, 0x2094, 0x206a, + 0x208a, 0x0177, 0x22fd, 0x22fb, 0x22f8, 0x0221, + /* 0x28 */ + 0x22fc, 0x22f6, 0x2365, 0x2381, 0x2363, 0x2367, 0x0231, 0x236e, + 0x2378, 0x237f, 0x0233, 0x0234, 0x24f3, 0x254b, 0x254c, 0x02c1, + 0x02b0, 0x02b4, 0x25ad, 0x02b8, 0x25c4, 0x02bc, 0x25c2, 0x25b0, + 0x02bf, 0x02b5, 0x02b1, 0x02bd, 0x25bf, 0x02bb, 0x25c9, 0x25b8, + 0x25ac, 0x02b3, 0x02b6, 0x02ba, 0x25b7, 0x25d7, 0x02b7, 0x2760, + 0x0340, 0x2796, 0x279e, 0x2794, 0x279f, 0x279d, 0x0352, 0x2800, + 0x2819, 0x0390, 0x0391, 0x2849, 0x284a, 0x03be, 0x28bb, 0x28c1, + 0x03c0, 0x03c1, 0x03b9, 0x28b9, 0x289e, 0x28b4, 0x28ba, 0x29f6, + 0x2a13, 0x2a12, 0x2a77, 0x0479, 0x2a98, 0x047b, 0x2a99, 0x2a9d, + 0x2af8, 0x04a0, 0x2af9, 0x0029, 0x2b06, 0x2b21, 0x04ae, 0x2b25, + 0x2b55, 0x04cd, 0x04cb, 0x04d9, 0x2b84, 0x2b83, 0x2c30, 0x2c07, + 0x050c, 0x2c36, 0x0501, 0x0505, 0x0502, 0x2be9, + /* 0x29 */ + 0x2c3d, 0x2c08, 0x0513, 0x0511, 0x2eba, 0x2eb2, 0x05e4, 0x2eb7, + 0x2ee4, 0x2ea7, 0x05da, 0x05d5, 0x05d3, 0x2ed5, 0x2ee1, 0x2edd, + 0x2ea6, 0x2ec1, 0x2ec5, 0x2ec0, 0x2edf, 0x2ee0, 0x2ede, 0x05d6, + 0x3189, 0x06b4, 0x31a6, 0x31ba, 0x06d9, 0x31ff, 0x06d8, 0x3217, + 0x3218, 0x3201, 0x31fe, 0x0733, 0x330c, 0x0748, 0x336b, 0x3396, + 0x3382, 0x338a, 0x0747, 0x33a3, 0x074b, 0x33a2, 0x338f, 0x074a, + 0x33f9, 0x3380, 0x3726, 0x3727, 0x3768, 0x3769, 0x085a, 0x3781, + 0x37b4, 0x37d1, 0x088e, 0x08b4, 0x381c, 0x08cd, 0x08cc, 0x08cf, + 0x08cb, 0x08ce, 0x3897, 0x386c, 0x38df, 0x08d2, 0x38ea, 0x08d1, + 0x38e4, 0x38d8, 0x38b2, 0x38ce, 0x38c8, 0x09a6, 0x3c8b, 0x3c88, + 0x3c90, 0x3c8f, 0x09aa, 0x3c87, 0x3c89, 0x3c8d, 0x3c81, 0x09a8, + 0x3c8c, 0x0a13, 0x0a1a, 0x3e40, 0x0a1d, 0x0a1e, + /* 0x2a */ + 0x3e65, 0x3e66, 0x3e68, 0x0a65, 0x0a66, 0x3ecd, 0x3ed3, 0x3edb, + 0x0a64, 0x3ecf, 0x3fa7, 0x3fa3, 0x3f9e, 0x0ab0, 0x3faf, 0x0ab3, + 0x0ab5, 0x3faa, 0x3f9c, 0x0b19, 0x4142, 0x4144, 0x413b, 0x4141, + 0x783f, 0x419b, 0x419e, 0x0b75, 0x45c4, 0x45c3, 0x45c6, 0x0d2b, + 0x0d2c, 0x45c7, 0x0d2d, 0x45ca, 0x802e, 0x0dc3, 0x46cf, 0x4876, + 0x4874, 0x48ff, 0x48fc, 0x00ba, 0x0f50, 0x4b59, 0x4ca8, 0x0fd3, + 0x0fd0, 0x4cb0, 0x0fdc, 0x4cb3, 0x0fd2, 0x4ca4, 0x4cb6, 0x4ca7, + 0x4cac, 0x0fdb, 0x4ca6, 0x1f67, 0x4e0e, 0x4ec4, 0x4f3e, 0x4e9c, + 0x10a5, 0x109f, 0x109a, 0x109c, 0x10a2, 0x4eaa, 0x109b, 0x4ec9, + 0x10a3, 0x109d, 0x4ea6, 0x4eb2, 0x1188, 0x121a, 0x148d, 0x5bcc, + 0x5bd9, 0x5bca, 0x5bd8, 0x5bcf, 0x5cb7, 0x14b8, 0x5cad, 0x5cb9, + 0x6237, 0x15c3, 0x6241, 0x623e, 0x62b6, 0x6351, + /* 0x2b */ + 0x6363, 0x1a57, 0x1a79, 0x1ab2, 0x1ab0, 0x1aaf, 0x1ab1, 0x1bd2, + 0x1bd5, 0x005d, 0x1bbe, 0x1bb8, 0x1bb0, 0x1bb1, 0x1bc8, 0x005a, + 0x0057, 0x1bc6, 0x1bcc, 0x1be5, 0x1be3, 0x1bb4, 0x1d6a, 0x00b8, + 0x1d9f, 0x00c2, 0x1dc1, 0x00cf, 0x1dc2, 0x1dc3, 0x1e45, 0x1e48, + 0x00e7, 0x00e9, 0x1e4f, 0x1052, 0x00e8, 0x1ec5, 0x1eca, 0x1ec4, + 0x1f27, 0x1f58, 0x1f7d, 0x014a, 0x1fdd, 0x1fdc, 0x1fda, 0x1fd9, + 0x20b9, 0x0180, 0x20d0, 0x20b4, 0x20ca, 0x0187, 0x20a3, 0x20da, + 0x20a4, 0x0184, 0x20b2, 0x209e, 0x209f, 0x20b5, 0x0182, 0x0181, + 0x20cd, 0x0183, 0x20cc, 0x0222, 0x2300, 0x23ac, 0x2391, 0x238e, + 0x238d, 0x2392, 0x23a1, 0x2390, 0x23a6, 0x23a8, 0x023b, 0x239c, + 0x2396, 0x23a7, 0x023a, 0x0238, 0x0239, 0x0236, 0x24f5, 0x0285, + 0x2509, 0x2508, 0x0854, 0x2552, 0x029a, 0x02c4, + /* 0x2c */ + 0x25df, 0x02c5, 0x25eb, 0x25ef, 0x25f0, 0x25d5, 0x260d, 0x2604, + 0x25f9, 0x2602, 0x25f8, 0x25e2, 0x25d9, 0x25e7, 0x276a, 0x0354, + 0x0355, 0x27ab, 0x0356, 0x281b, 0x282f, 0x0396, 0x323c, 0x0395, + 0x0394, 0x03c4, 0x28d1, 0x28dc, 0x28e6, 0x28e1, 0x28cd, 0x857a, + 0x28e2, 0x28dd, 0x28e5, 0x29fb, 0x29fa, 0x2a1e, 0x0444, 0x2aa1, + 0x047d, 0x047e, 0x2afc, 0x2afb, 0x2b2f, 0x04b2, 0x04b6, 0x2b66, + 0x8599, 0x04dc, 0x04df, 0x2c5c, 0x0528, 0x2c4e, 0x2c51, 0x0519, + 0x0510, 0x2c23, 0x2c31, 0x2c7c, 0x2c52, 0x052c, 0x2c60, 0x2c4a, + 0x2c61, 0x051b, 0x2e18, 0x05c2, 0x05ef, 0x05e3, 0x05e5, 0x05ea, + 0x05e6, 0x05ee, 0x2f1f, 0x2f17, 0x2eea, 0x2f21, 0x2f04, 0x2f05, + 0x05e8, 0x3131, 0x3144, 0x3140, 0x0685, 0x3142, 0x31be, 0x06e0, + 0x3229, 0x321b, 0x06dd, 0x3223, 0x322c, 0x321a, + /* 0x2d */ + 0x3230, 0x323b, 0x321e, 0x3237, 0x3238, 0x06e1, 0x330e, 0x0751, + 0x0755, 0x33e8, 0x33d6, 0x0752, 0x33c7, 0x33bc, 0x3452, 0x33bf, + 0x33d5, 0x33fe, 0x4f63, 0x33fb, 0x85df, 0x33b1, 0x3401, 0x3405, + 0x3400, 0x33d7, 0x0c9e, 0x372a, 0x376b, 0x0852, 0x085e, 0x0860, + 0x085f, 0x37e1, 0x0892, 0x08d6, 0x3923, 0x38ff, 0x3914, 0x3905, + 0x3913, 0x3906, 0x3921, 0x08de, 0x3915, 0x38af, 0x38f4, 0x3902, + 0x3945, 0x85fe, 0x3926, 0x08d9, 0x3944, 0x08dd, 0x3924, 0x3ca5, + 0x09ac, 0x3ca3, 0x09b0, 0x3ca2, 0x3cbb, 0x3ca0, 0x3caa, 0x09af, + 0x09ae, 0x3ca8, 0x3cb6, 0x3cb2, 0x3ca7, 0x09ad, 0x09ab, 0x3cb9, + 0x3e2e, 0x0a16, 0x3e3c, 0x0a30, 0x3e6d, 0x0a33, 0x0a31, 0x3ee7, + 0x3eed, 0x0a6e, 0x3eec, 0x3ee5, 0x3ee2, 0x0ab1, 0x3fc4, 0x3fbd, + 0x3fcf, 0x3fc9, 0x3fc1, 0x3fd0, 0x0ab7, 0x3fce, + /* 0x2e */ + 0x40ed, 0x40eb, 0x0b1a, 0x40ef, 0x4149, 0x4150, 0x4146, 0x414a, + 0x0b59, 0x414d, 0x41a6, 0x0b7a, 0x0b78, 0x0b7b, 0x41a8, 0x0bde, + 0x0bec, 0x42c7, 0x42ff, 0x0c1e, 0x42fd, 0x43e6, 0x440a, 0x0c9b, + 0x4404, 0x440b, 0x4407, 0x0c9d, 0x4415, 0x4408, 0x0cfd, 0x45d3, + 0x45d4, 0x45d0, 0x45d7, 0x467c, 0x0d94, 0x0d93, 0x467d, 0x4683, + 0x4682, 0x0dc6, 0x46d4, 0x46d5, 0x46d3, 0x46d0, 0x46d2, 0x46fe, + 0x46fc, 0x4877, 0x487c, 0x487b, 0x0eb8, 0x866a, 0x0eb7, 0x0eb9, + 0x0f53, 0x7f33, 0x0f52, 0x0f51, 0x4b8f, 0x4cd3, 0x0fe3, 0x4ccb, + 0x4cd2, 0x0fe2, 0x4d09, 0x4ce2, 0x4cdf, 0x4cc6, 0x1063, 0x4e24, + 0x4ef7, 0x4ed8, 0x4edd, 0x10aa, 0x10a6, 0x4ef8, 0x4efc, 0x10a8, + 0x10a9, 0x4ee9, 0x10ab, 0x4eee, 0x10ac, 0x4ed0, 0x4f0e, 0x4ee2, + 0x4f0b, 0x4efd, 0x1d79, 0x5276, 0x119e, 0x5278, + /* 0x2f */ + 0x119f, 0x11a0, 0x5275, 0x527d, 0x120f, 0x5442, 0x5466, 0x121c, + 0x558c, 0x5605, 0x12ae, 0x5606, 0x12b0, 0x589f, 0x13d4, 0x5bf1, + 0x5be7, 0x5be9, 0x5bef, 0x5cc2, 0x5cbc, 0x14bb, 0x5cc6, 0x5cc0, + 0x14c1, 0x14c2, 0x5ccd, 0x5cc9, 0x14be, 0x5cc4, 0x14e5, 0x6181, + 0x15c6, 0x68ec, 0x1c32, 0x1bf9, 0x1c1d, 0x1bff, 0x1c04, 0x1bf0, + 0x1c03, 0x122e, 0x1c02, 0x1bfc, 0x1bf2, 0x1c24, 0x1c08, 0x1c36, + 0x1c2e, 0x0065, 0x1c10, 0x1c38, 0x1c39, 0x1bfd, 0x1c56, 0x1bfb, + 0x1da3, 0x1da6, 0x1da1, 0x00d1, 0x00d0, 0x1dc7, 0x1dc9, 0x1e60, + 0x1e64, 0x1e59, 0x1e65, 0x1e67, 0x1e57, 0x1e63, 0x00ee, 0x1e53, + 0x00ef, 0x1ecf, 0x011e, 0x1ece, 0x1ed0, 0x1ed1, 0x1ecc, 0x014b, + 0x014d, 0x0156, 0x210d, 0x20f4, 0x0192, 0x2113, 0x20ef, 0x20f5, + 0x20f9, 0x2102, 0x2100, 0x0193, 0x0190, 0x2118, + /* 0x30 */ + 0x20f0, 0x20f6, 0x8541, 0x0197, 0x2119, 0x0223, 0x2305, 0x23c9, + 0x023f, 0x23b7, 0x23cd, 0x0243, 0x0242, 0x0244, 0x23be, 0x23bb, + 0x0245, 0x23db, 0x23c8, 0x23c4, 0x23c5, 0x23d1, 0x23ca, 0x23c0, + 0x02d9, 0x02de, 0x2621, 0x262a, 0x02cf, 0x261d, 0x02cd, 0x260b, + 0x02dd, 0x02ce, 0x02d3, 0x02d6, 0x2622, 0x02dc, 0x02d1, 0x2624, + 0x02d0, 0x2614, 0x2631, 0x02d5, 0x262f, 0x261a, 0x2612, 0x02d4, + 0x02db, 0x2626, 0x762e, 0x0343, 0x27bc, 0x27bb, 0x27b7, 0x2805, + 0x2806, 0x2852, 0x2853, 0x03cd, 0x03d1, 0x28fa, 0x28eb, 0x03ca, + 0x28f3, 0x28f5, 0x28e9, 0x28ef, 0x03d4, 0x2a2a, 0x2a30, 0x2a2e, + 0x2a2c, 0x2a2f, 0x2aaf, 0x2aa9, 0x0486, 0x2afd, 0x2b32, 0x2b8e, + 0x2b93, 0x2b8f, 0x2c4f, 0x2c99, 0x0533, 0x2c7e, 0x0537, 0x2c74, + 0x2c4b, 0x2c73, 0x2c75, 0x052a, 0x051f, 0x2c56, + /* 0x31 */ + 0x2ca9, 0x2c8b, 0x2ca6, 0x0539, 0x2c93, 0x2cae, 0x2c9e, 0x2ca7, + 0x2e45, 0x05f2, 0x05f8, 0x2f2e, 0x05f7, 0x2f52, 0x2f30, 0x2f5b, + 0x05f4, 0x2f19, 0x2f1b, 0x05f1, 0x2f31, 0x2f5d, 0x2f37, 0x2f35, + 0x2f53, 0x05f5, 0x2f5c, 0x2f3f, 0x314b, 0x0687, 0x0f69, 0x318b, + 0x06b6, 0x319a, 0x3250, 0x3246, 0x324e, 0x3240, 0x06e9, 0x324b, + 0x3248, 0x06eb, 0x3260, 0x3244, 0x324d, 0x0734, 0x3437, 0x3424, + 0x0762, 0x075c, 0x341b, 0x3436, 0x0760, 0x342c, 0x3419, 0x3456, + 0x3447, 0x343e, 0x341e, 0x85e1, 0x3415, 0x3422, 0x3427, 0x3459, + 0x3458, 0x3455, 0x3430, 0x3423, 0x372e, 0x372b, 0x3730, 0x376c, + 0x0861, 0x378b, 0x087f, 0x37e9, 0x37ea, 0x37e5, 0x396b, 0x08e5, + 0x08e6, 0x3973, 0x3957, 0x08e9, 0x08f3, 0x395d, 0x3956, 0x398f, + 0x395b, 0x391c, 0x399a, 0x399b, 0x3999, 0x08ee, + /* 0x32 */ + 0x3981, 0x3971, 0x08ed, 0x08ec, 0x3972, 0x395c, 0x3996, 0x3cc4, + 0x3cdb, 0x3ccc, 0x3cd0, 0x3ce3, 0x3cdf, 0x09b3, 0x3cd6, 0x3cee, + 0x3cd5, 0x09b5, 0x0a27, 0x0a35, 0x0a36, 0x3e7a, 0x0a71, 0x3ef5, + 0x3f02, 0x0ab8, 0x0ac2, 0x3fe2, 0x3fec, 0x3fd5, 0x3ff9, 0x3fdf, + 0x3fe6, 0x0ac8, 0x0ac0, 0x0ac1, 0x0ac4, 0x3fe4, 0x3fe1, 0x40f3, + 0x0b1f, 0x0b1c, 0x0b1d, 0x0b4d, 0x4156, 0x4155, 0x4158, 0x4157, + 0x415e, 0x41c3, 0x0b87, 0x0b82, 0x41b4, 0x0b7d, 0x41b1, 0x0bdf, + 0x0c00, 0x42cb, 0x42cc, 0x432a, 0x0c20, 0x4316, 0x430f, 0x0c22, + 0x0c24, 0x433f, 0x432b, 0x430e, 0x4324, 0x0c21, 0x4321, 0x4318, + 0x43dd, 0x0ca4, 0x0ca5, 0x4424, 0x4436, 0x0d01, 0x4558, 0x4559, + 0x0d03, 0x4562, 0x45da, 0x45d9, 0x0d37, 0x45e1, 0x45e5, 0x45e8, + 0x45db, 0x0d38, 0x45e2, 0x45f0, 0x0d99, 0x0d98, + /* 0x33 */ + 0x0d97, 0x0dc9, 0x46da, 0x46dd, 0x0dc7, 0x46db, 0x46dc, 0x0dd9, + 0x0ddb, 0x470d, 0x470b, 0x4714, 0x488e, 0x4886, 0x0e7b, 0x4887, + 0x4883, 0x488b, 0x0e7c, 0x0ebd, 0x0ebc, 0x0ec3, 0x4924, 0x0ec1, + 0x0ebf, 0x0ec4, 0x4925, 0x4b62, 0x4b93, 0x4b99, 0x4b97, 0x0f7e, + 0x0f7f, 0x4bc4, 0x4bc6, 0x4c0a, 0x0fb4, 0x0fb3, 0x4c40, 0x4c3c, + 0x4c3b, 0x4cf6, 0x4cff, 0x4cee, 0x4d04, 0x4d03, 0x4d07, 0x8683, + 0x0fe6, 0x4cf7, 0x1059, 0x105a, 0x4e2d, 0x1064, 0x4e27, 0x4e29, + 0x4f1f, 0x4f57, 0x10b4, 0x10b9, 0x10b7, 0x10b5, 0x4f21, 0x10c1, + 0x10b1, 0x4f18, 0x4f58, 0x10b3, 0x10ba, 0x118c, 0x118b, 0x118d, + 0x5284, 0x529f, 0x529b, 0x5289, 0x52a6, 0x5292, 0x528f, 0x52a0, + 0x544f, 0x5478, 0x547a, 0x546e, 0x547b, 0x5484, 0x5473, 0x1278, + 0x1277, 0x560d, 0x560b, 0x5619, 0x12b2, 0x13d6, + /* 0x34 */ + 0x5ad0, 0x1445, 0x1492, 0x1495, 0x5bf9, 0x5c09, 0x5c08, 0x14c6, + 0x5cde, 0x5d51, 0x14e7, 0x14e8, 0x5ddb, 0x5ddf, 0x5dde, 0x5dd6, + 0x5de0, 0x6185, 0x6260, 0x6259, 0x15cb, 0x6256, 0x15cd, 0x15f1, + 0x62bd, 0x1722, 0x0021, 0x1c42, 0x1c59, 0x006f, 0x1c44, 0x1c66, + 0x1c52, 0x1c54, 0x1c71, 0x1c50, 0x1c7b, 0x1c7c, 0x1c58, 0x0070, + 0x0064, 0x1c79, 0x1c6c, 0x1c78, 0x1da8, 0x1dd1, 0x1dcf, 0x1e68, + 0x1e76, 0x1ed4, 0x012d, 0x1fa0, 0x1fc4, 0x0158, 0x2158, 0x214c, + 0x2168, 0x01a6, 0x2149, 0x01a4, 0x019f, 0x215d, 0x2129, 0x73ae, + 0x2154, 0x2153, 0x01a3, 0x215a, 0x01a0, 0x213a, 0x213f, 0x212b, + 0x23ea, 0x024a, 0x23ef, 0x0247, 0x0248, 0x23dd, 0x23fe, 0x8555, + 0x23de, 0x23e6, 0x0249, 0x23e8, 0x23ff, 0x2403, 0x24f7, 0x34a6, + 0x251f, 0x029e, 0x255b, 0x255d, 0x255e, 0x7537, + /* 0x35 */ + 0x02e8, 0x262b, 0x02ec, 0x263b, 0x02ed, 0x02e6, 0x2661, 0x263a, + 0x266e, 0x264b, 0x266b, 0x02eb, 0x02e7, 0x2645, 0x264e, 0x2668, + 0x263d, 0x2671, 0x263f, 0x266f, 0x2675, 0x02e9, 0x2673, 0x262c, + 0x2659, 0x2654, 0x264f, 0x2663, 0x035c, 0x035d, 0x27c8, 0x0360, + 0x27c3, 0x035b, 0x285b, 0x2861, 0x0399, 0x2921, 0x290a, 0x2909, + 0x03d8, 0x292c, 0x2908, 0x03da, 0x03dd, 0x292a, 0x2915, 0x03e0, + 0x2910, 0x2913, 0x03e5, 0x292f, 0x2918, 0x03d7, 0x29e3, 0x2a39, + 0x2a35, 0x2a3a, 0x2a32, 0x044e, 0x048c, 0x0488, 0x858d, 0x2abb, + 0x2aba, 0x2b34, 0x2b39, 0x04ce, 0x859c, 0x04e5, 0x04e6, 0x2c98, + 0x0532, 0x2cd0, 0x0540, 0x0547, 0x054c, 0x2cd7, 0x2caa, 0x0535, + 0x2ca1, 0x2ca4, 0x0530, 0x2cee, 0x0543, 0x2ce7, 0x054d, 0x2ce8, + 0x2cde, 0x05b7, 0x05f3, 0x2f7e, 0x2f8b, 0x0602, + /* 0x36 */ + 0x060b, 0x2f79, 0x2f86, 0x2f93, 0x0604, 0x2f73, 0x2f6a, 0x85ba, + 0x2f6c, 0x0608, 0x2f7f, 0x05fc, 0x2fb2, 0x2fba, 0x05ff, 0x0600, + 0x2f66, 0x2f74, 0x068b, 0x315a, 0x068d, 0x314e, 0x314d, 0x318d, + 0x318e, 0x31ad, 0x06ca, 0x31c7, 0x31ca, 0x06cb, 0x31c9, 0x85cb, + 0x31e3, 0x3257, 0x06f3, 0x3263, 0x3267, 0x331a, 0x3319, 0x3316, + 0x0736, 0x076a, 0x349e, 0x34b6, 0x3498, 0x3473, 0x076b, 0x349a, + 0x348e, 0x34b7, 0x34db, 0x34a5, 0x346c, 0x34c1, 0x3484, 0x0771, + 0x0768, 0x3495, 0x347a, 0x3499, 0x0772, 0x34b8, 0x34b9, 0x3470, + 0x082e, 0x3735, 0x0862, 0x3790, 0x37bb, 0x37ed, 0x0898, 0x08b5, + 0x08eb, 0x39c1, 0x39c3, 0x39ce, 0x08fb, 0x08f8, 0x39ad, 0x3a04, + 0x08f5, 0x39b9, 0x0908, 0x39e7, 0x8607, 0x3a08, 0x3a06, 0x090a, + 0x3a0a, 0x39b0, 0x0906, 0x39f8, 0x3a0c, 0x08fd, + /* 0x37 */ + 0x39b1, 0x08fa, 0x3a02, 0x3a07, 0x3a09, 0x3a01, 0x3a17, 0x39ff, + 0x3a12, 0x09ba, 0x09b9, 0x3d03, 0x3d07, 0x3d01, 0x3cf5, 0x3cf1, + 0x3d08, 0x3cf2, 0x3d0f, 0x09bb, 0x3cfe, 0x0a18, 0x0a40, 0x0a3d, + 0x3f1a, 0x3f10, 0x3f0e, 0x4002, 0x3ff3, 0x0acd, 0x0ac9, 0x3ffb, + 0x0acb, 0x0aca, 0x0ace, 0x411b, 0x4123, 0x4161, 0x4168, 0x0b5e, + 0x4167, 0x41d3, 0x0b91, 0x0b8c, 0x4290, 0x0be1, 0x0c02, 0x42d5, + 0x42d7, 0x42d6, 0x4330, 0x0c2b, 0x4326, 0x0c2a, 0x4340, 0x0a14, + 0x431e, 0x0cad, 0x0ca3, 0x0cab, 0x4447, 0x0caf, 0x444b, 0x4451, + 0x444f, 0x4442, 0x4446, 0x0d04, 0x456e, 0x456c, 0x45f2, 0x0d44, + 0x45f1, 0x45f5, 0x45f3, 0x45f9, 0x0d3d, 0x0d47, 0x0d9c, 0x469a, + 0x4693, 0x4691, 0x46e1, 0x0de0, 0x0de4, 0x4721, 0x471c, 0x4716, + 0x4717, 0x4736, 0x471f, 0x0e80, 0x4893, 0x4899, + /* 0x38 */ + 0x489a, 0x489c, 0x0eca, 0x4949, 0x0ed4, 0x4934, 0x4937, 0x0ed2, + 0x492d, 0x0ecb, 0x494c, 0x0ece, 0x0ed3, 0x4948, 0x0f44, 0x0f48, + 0x4b3b, 0x0f45, 0x0f81, 0x0f86, 0x0f85, 0x4c08, 0x4c1a, 0x0fa3, + 0x4c1d, 0x0fb5, 0x4c49, 0x4c45, 0x4c44, 0x489b, 0x0ffa, 0x0ff9, + 0x4d2a, 0x4d2e, 0x0ffb, 0x0ff2, 0x4d31, 0x0fef, 0x4d1a, 0x4d34, + 0x4d17, 0x105b, 0x1066, 0x10ce, 0x4f1d, 0x4f71, 0x4f84, 0x4f80, + 0x4f72, 0x4fa1, 0x01b4, 0x4f79, 0x4f91, 0x10c8, 0x4f9f, 0x4fad, + 0x10d1, 0x10c5, 0x4f23, 0x10d2, 0x4f85, 0x4f9c, 0x4fb7, 0x5258, + 0x525a, 0x118f, 0x5257, 0x52b2, 0x11a7, 0x52ae, 0x11a5, 0x11a4, + 0x1211, 0x5445, 0x549c, 0x5494, 0x54a3, 0x548f, 0x54a5, 0x54a9, + 0x54a6, 0x548a, 0x54a0, 0x5490, 0x5592, 0x5591, 0x5594, 0x12b5, + 0x5626, 0x5632, 0x5628, 0x12b4, 0x12bd, 0x561c, + /* 0x39 */ + 0x12bb, 0x562b, 0x5620, 0x12b9, 0x5629, 0x12c2, 0x12be, 0x12ba, + 0x5621, 0x583a, 0x06b7, 0x585b, 0x5858, 0x587c, 0x1358, 0x58a6, + 0x58ae, 0x58ad, 0x5965, 0x139b, 0x597e, 0x139c, 0x597c, 0x597f, + 0x597a, 0x59bd, 0x13da, 0x13de, 0x59c0, 0x59bb, 0x5aad, 0x5aaf, + 0x5ad6, 0x144d, 0x1446, 0x1447, 0x144b, 0x144c, 0x5ad9, 0x1448, + 0x1499, 0x5c12, 0x5c0e, 0x5c25, 0x149b, 0x5c13, 0x5cee, 0x14ce, + 0x5cab, 0x5cf7, 0x14eb, 0x5d59, 0x5d54, 0x5df2, 0x5df0, 0x5de5, + 0x5df6, 0x151c, 0x158c, 0x6187, 0x15d1, 0x625a, 0x15d6, 0x15d3, + 0x626e, 0x15d4, 0x15d0, 0x15d5, 0x6279, 0x160b, 0x64e1, 0x64e6, + 0x17c6, 0x6ac4, 0x6ad2, 0x1a80, 0x0024, 0x1a81, 0x1c8f, 0x1c97, + 0x1c88, 0x1c89, 0x0074, 0x007a, 0x1c81, 0x1d60, 0x7064, 0x00c3, + 0x2a42, 0x1dd3, 0x00d4, 0x00d5, 0x1dd2, 0x1dd6, + /* 0x3a */ + 0x1e73, 0x00fb, 0x1e70, 0x00f7, 0x0132, 0x8533, 0x1fa8, 0x1fa6, + 0x1fc5, 0x2197, 0x21de, 0x01ba, 0x01bf, 0x2196, 0x21b4, 0x01c7, + 0x2185, 0x01b7, 0x219b, 0x21a0, 0x01b9, 0x2159, 0x01c3, 0x2186, + 0x01bd, 0x01d0, 0x21af, 0x217a, 0x01c1, 0x01be, 0x01cd, 0x219e, + 0x01cb, 0x21a9, 0x230f, 0x230e, 0x241a, 0x024f, 0x241f, 0x0253, + 0x243c, 0x2418, 0x243e, 0x2426, 0x0255, 0x243a, 0x7464, 0x2422, + 0x0251, 0x24fb, 0x2563, 0x2564, 0x029f, 0x26a8, 0x26a3, 0x2682, + 0x2688, 0x26a1, 0x2685, 0x2698, 0x02fe, 0x2699, 0x02fb, 0x2689, + 0x2681, 0x2696, 0x2680, 0x02f1, 0x02f5, 0x2691, 0x02ef, 0x0304, + 0x0303, 0x02f4, 0x26cf, 0x02f3, 0x0302, 0x02f7, 0x02fa, 0x02fd, + 0x02ee, 0x2687, 0x26a0, 0x02f0, 0x2679, 0x02f2, 0x2686, 0x26ab, + 0x26aa, 0x26a4, 0x268d, 0x267e, 0x0344, 0x27d5, + /* 0x3b */ + 0x0362, 0x0377, 0x09c9, 0x281e, 0x285f, 0x285e, 0x2944, 0x293e, + 0x03e8, 0x2948, 0x291c, 0x03ef, 0x295b, 0x294d, 0x03e6, 0x03ed, + 0x2957, 0x03e7, 0x2953, 0x294f, 0x03eb, 0x293b, 0x2946, 0x042d, + 0x0455, 0x2a46, 0x2a47, 0x0453, 0x2a48, 0x2ac0, 0x2abd, 0x2abf, + 0x0490, 0x2b11, 0x04be, 0x2b3e, 0x2b3b, 0x04bd, 0x2b3a, 0x04cf, + 0x04d0, 0x04ec, 0x2ba7, 0x054b, 0x2cea, 0x0548, 0x2d07, 0x2d22, + 0x2d0c, 0x0555, 0x0551, 0x2cb3, 0x2cd6, 0x2cd2, 0x054e, 0x2ce3, + 0x2ce5, 0x2ce9, 0x056b, 0x055e, 0x2d11, 0x2cfd, 0x0560, 0x0567, + 0x2d1e, 0x2d20, 0x2d21, 0x2e1e, 0x05b8, 0x2fe2, 0x2fde, 0x2fe6, + 0x0614, 0x060f, 0x0607, 0x0613, 0x2ff8, 0x0617, 0x2ffe, 0x2fc1, + 0x2fbf, 0x2ff7, 0x2fd1, 0x315f, 0x3160, 0x3161, 0x069a, 0x06b8, + 0x31d1, 0x06f7, 0x06f8, 0x327d, 0x326b, 0x327f, + /* 0x3c */ + 0x06fd, 0x06f5, 0x3273, 0x3281, 0x326d, 0x3269, 0x06fa, 0x0738, + 0x331e, 0x34ed, 0x0787, 0x0780, 0x0788, 0x0779, 0x3503, 0x077c, + 0x34fe, 0x34e5, 0x351e, 0x3502, 0x0783, 0x0785, 0x3509, 0x34ca, + 0x3500, 0x85e5, 0x3501, 0x3518, 0x34e2, 0x34cf, 0x077b, 0x352e, + 0x34c5, 0x34ff, 0x0786, 0x351c, 0x34c3, 0x0834, 0x376f, 0x0855, + 0x376e, 0x0868, 0x37be, 0x089c, 0x37f4, 0x382d, 0x08fc, 0x39b6, + 0x3a75, 0x3a1e, 0x091a, 0x3a18, 0x0917, 0x3a48, 0x091b, 0x3a4f, + 0x0913, 0x3a42, 0x3a6a, 0x3a70, 0x39fe, 0x0905, 0x0907, 0x3a6d, + 0x091c, 0x3a7b, 0x3a7e, 0x3a59, 0x0911, 0x3a57, 0x0916, 0x3a80, + 0x3a50, 0x0915, 0x3a29, 0x3a76, 0x3a2a, 0x3a4c, 0x3d2a, 0x09cb, + 0x3d35, 0x3d2c, 0x3d37, 0x3d1d, 0x09c5, 0x09c2, 0x3d38, 0x09cd, + 0x3d34, 0x3d2b, 0x3d33, 0x3d27, 0x3d24, 0x09ca, + /* 0x3d */ + 0x3d2d, 0x3e32, 0x3e83, 0x3e82, 0x3e87, 0x3f06, 0x3f24, 0x3f38, + 0x3f2a, 0x3f2c, 0x3f2b, 0x0a83, 0x3f2f, 0x3f28, 0x4017, 0x0ad6, + 0x0ad5, 0x4019, 0x4038, 0x0ad1, 0x401f, 0x4014, 0x403c, 0x3ff7, + 0x401c, 0x4015, 0x4018, 0x4039, 0x40f9, 0x4124, 0x8634, 0x0b52, + 0x0b5f, 0x416e, 0x416d, 0x4171, 0x418e, 0x0b95, 0x41e5, 0x0b9d, + 0x0b98, 0x0b9e, 0x0b96, 0x4294, 0x42b3, 0x0c03, 0x42d9, 0x0c2f, + 0x4348, 0x4349, 0x4343, 0x0c31, 0x0c33, 0x4342, 0x43df, 0x0cb4, + 0x4463, 0x4476, 0x0cb0, 0x445f, 0x4466, 0x4566, 0x4571, 0x0d08, + 0x0d07, 0x4576, 0x4584, 0x4575, 0x45ff, 0x4607, 0x0d4e, 0x460e, + 0x4609, 0x0d50, 0x0d52, 0x0da1, 0x0da3, 0x0da5, 0x0dcc, 0x46e7, + 0x46e2, 0x4755, 0x0def, 0x0dea, 0x4743, 0x4757, 0x476c, 0x4742, + 0x4753, 0x0ded, 0x4741, 0x0e85, 0x0e84, 0x48a7, + /* 0x3e */ + 0x48a0, 0x48a6, 0x48a4, 0x4974, 0x0edb, 0x4959, 0x0ed9, 0x4960, + 0x4957, 0x496c, 0x497e, 0x4964, 0x0ed7, 0x495a, 0x495d, 0x0eda, + 0x0ede, 0x0ed8, 0x4976, 0x494d, 0x4975, 0x0ed5, 0x4bd3, 0x4bd6, + 0x0f9c, 0x0f9d, 0x4c60, 0x4c4e, 0x4d45, 0x4d3b, 0x0ffe, 0x4d48, + 0x4d42, 0x4d49, 0x4d40, 0x4d14, 0x4d41, 0x1007, 0x4def, 0x4df6, + 0x4e03, 0x106a, 0x4fed, 0x10e7, 0x4fda, 0x5018, 0x4fd2, 0x5008, + 0x10e2, 0x5000, 0x10df, 0x10e1, 0x10e5, 0x5017, 0x4f46, 0x5014, + 0x4fd3, 0x5005, 0x501f, 0x5002, 0x5016, 0x4fcd, 0x4fe6, 0x1191, + 0x525d, 0x52d5, 0x52e1, 0x11b4, 0x11b0, 0x11b5, 0x11ae, 0x52ee, + 0x5447, 0x5446, 0x122d, 0x122c, 0x54bb, 0x122b, 0x54bf, 0x54b4, + 0x1229, 0x54b5, 0x127f, 0x559a, 0x5643, 0x12c9, 0x12cb, 0x565a, + 0x12c5, 0x12c6, 0x12ca, 0x5635, 0x5638, 0x5642, + /* 0x3f */ + 0x5649, 0x565d, 0x564b, 0x563d, 0x12d2, 0x12d0, 0x132d, 0x1335, + 0x5860, 0x585e, 0x587f, 0x587e, 0x5883, 0x136c, 0x58b1, 0x5987, + 0x139d, 0x13a0, 0x5988, 0x5983, 0x13a2, 0x139f, 0x5986, 0x598b, + 0x5982, 0x59ca, 0x59d2, 0x13eb, 0x13e2, 0x59d4, 0x59c9, 0x5ab0, + 0x1436, 0x1432, 0x1450, 0x5af2, 0x5ae4, 0x5af3, 0x5aea, 0x144f, + 0x5afd, 0x1452, 0x5b9d, 0x5c2b, 0x5c2a, 0x149e, 0x5c28, 0x5c29, + 0x5c2c, 0x14a0, 0x149c, 0x5c3a, 0x5c30, 0x5c37, 0x5c3b, 0x14d1, + 0x5d0a, 0x14ef, 0x14f0, 0x14f1, 0x5dfe, 0x5e20, 0x151d, 0x5e0b, + 0x151f, 0x5e18, 0x5e22, 0x151e, 0x5e1b, 0x5e08, 0x1520, 0x5e0e, + 0x5e13, 0x158e, 0x1591, 0x6195, 0x83dd, 0x1590, 0x15d7, 0x628c, + 0x627b, 0x627f, 0x6281, 0x15d9, 0x6282, 0x15f4, 0x15f6, 0x0160, + 0x15f5, 0x15f3, 0x62ee, 0x62ed, 0x160c, 0x62ec, + /* 0x40 */ + 0x635f, 0x636f, 0x1651, 0x636d, 0x16a6, 0x16a7, 0x16a8, 0x1727, + 0x1724, 0x1725, 0x64f0, 0x172a, 0x1774, 0x17c7, 0x66a9, 0x17e7, + 0x17ed, 0x66e0, 0x1ab7, 0x002e, 0x007b, 0x1ccc, 0x1cbc, 0x007c, + 0x1caa, 0x1cb9, 0x007d, 0x1cab, 0x1cc3, 0x1ccd, 0x1d7e, 0x1e7e, + 0x1e79, 0x00fd, 0x8523, 0x1ee1, 0x1ee0, 0x1ee7, 0x1f80, 0x1fab, + 0x1faa, 0x1fa9, 0x1fe0, 0x21ea, 0x01da, 0x21d7, 0x01d6, 0x01db, + 0x21c1, 0x2315, 0x025b, 0x246c, 0x025c, 0x245c, 0x2450, 0x2461, + 0x246a, 0x2469, 0x2456, 0x2460, 0x2466, 0x245f, 0x2523, 0x2566, + 0x2568, 0x0306, 0x030b, 0x26ce, 0x030d, 0x26c5, 0x26c3, 0x030a, + 0x0313, 0x26d0, 0x0310, 0x0312, 0x0309, 0x0308, 0x0311, 0x030f, + 0x2774, 0x2776, 0x27dc, 0x27d7, 0x27da, 0x27db, 0x0367, 0x2820, + 0x296d, 0x2966, 0x03f6, 0x2964, 0x296e, 0x857e, + /* 0x41 */ + 0x2960, 0x2b42, 0x2b5a, 0x2b6e, 0x0564, 0x056c, 0x2d30, 0x2d3a, + 0x2d2a, 0x2d43, 0x2d19, 0x2d31, 0x056d, 0x2d3d, 0x057a, 0x0575, + 0x060d, 0x3008, 0x3032, 0x3038, 0x061e, 0x3031, 0x061b, 0x3019, + 0x062a, 0x3011, 0x061f, 0x0622, 0x3029, 0x301d, 0x0625, 0x0627, + 0x0629, 0x303c, 0x0624, 0x3046, 0x3047, 0x0628, 0x0626, 0x303a, + 0x3007, 0x0623, 0x316b, 0x069f, 0x3170, 0x316d, 0x06b1, 0x31e4, + 0x3293, 0x0703, 0x0707, 0x070c, 0x0706, 0x328f, 0x0704, 0x0709, + 0x3292, 0x0705, 0x328e, 0x0708, 0x3546, 0x0796, 0x079c, 0x079f, + 0x079b, 0x0798, 0x0799, 0x0794, 0x3531, 0x078d, 0x07a3, 0x353e, + 0x0793, 0x357c, 0x3543, 0x0792, 0x3573, 0x85e8, 0x3555, 0x078e, + 0x078c, 0x3585, 0x354d, 0x3550, 0x3547, 0x3567, 0x3536, 0x3564, + 0x3561, 0x079a, 0x357d, 0x3744, 0x3740, 0x3771, + /* 0x42 */ + 0x3773, 0x379c, 0x086a, 0x086d, 0x0884, 0x37c1, 0x08a0, 0x37fa, + 0x3831, 0x3832, 0x091d, 0x0926, 0x3ab8, 0x3aa8, 0x0933, 0x3a91, + 0x3abb, 0x0938, 0x3a9a, 0x0930, 0x0928, 0x3aa9, 0x0927, 0x092a, + 0x3ab5, 0x3a6c, 0x3ae8, 0x0931, 0x3add, 0x3ada, 0x3ae6, 0x3aac, + 0x0934, 0x092e, 0x093b, 0x3ad9, 0x3ae3, 0x3ae9, 0x3adb, 0x0929, + 0x3d6f, 0x09d2, 0x09d8, 0x3d48, 0x09cf, 0x3d4a, 0x3d6b, 0x09d9, + 0x3d4f, 0x3d57, 0x3d74, 0x09ce, 0x09d3, 0x09d0, 0x3d45, 0x3d51, + 0x3d6d, 0x07a1, 0x3e51, 0x3e50, 0x3e4e, 0x0a47, 0x3f41, 0x0a8b, + 0x3f2e, 0x3f46, 0x0ad4, 0x4027, 0x0ade, 0x4048, 0x4053, 0x403d, + 0x0adf, 0x405d, 0x4056, 0x0ad7, 0x401e, 0x4047, 0x4043, 0x4058, + 0x4049, 0x0ae1, 0x404c, 0x4045, 0x403e, 0x0b2f, 0x4101, 0x411e, + 0x0b62, 0x0b63, 0x417a, 0x41ee, 0x4202, 0x4297, + /* 0x43 */ + 0x4298, 0x0be2, 0x0c04, 0x0c43, 0x435d, 0x4364, 0x4353, 0x4358, + 0x4482, 0x4490, 0x448a, 0x0cbe, 0x447a, 0x447d, 0x0cba, 0x448b, + 0x4478, 0x0cbc, 0x864e, 0x448d, 0x4488, 0x4492, 0x4481, 0x457e, + 0x4583, 0x0d0d, 0x0d0e, 0x0d11, 0x4580, 0x0d0f, 0x0d12, 0x0d55, + 0x460f, 0x0d59, 0x0d5b, 0x461d, 0x0d57, 0x46a1, 0x46a4, 0x0dce, + 0x46e9, 0x46ea, 0x0dfe, 0x4762, 0x476b, 0x0dfc, 0x475e, 0x0df5, + 0x4779, 0x0df9, 0x0dfa, 0x476f, 0x4768, 0x0e88, 0x0e89, 0x48ae, + 0x0e8a, 0x0e87, 0x0e8b, 0x48b0, 0x0ee6, 0x4990, 0x0eed, 0x498a, + 0x0ee5, 0x498b, 0x4999, 0x4995, 0x0ee0, 0x4987, 0x4978, 0x4997, + 0x4989, 0x4998, 0x0ee1, 0x0f5b, 0x0f5c, 0x4ba3, 0x0f8f, 0x0f8b, + 0x0f8d, 0x4bdd, 0x4c57, 0x0fb9, 0x4d63, 0x4d6a, 0x4d6c, 0x100f, + 0x1019, 0x1013, 0x4d5d, 0x4d75, 0x1018, 0x4d5f, + /* 0x44 */ + 0x1016, 0x4d7d, 0x4d6d, 0x1053, 0x868d, 0x4e41, 0x504f, 0x5084, + 0x10f6, 0x507f, 0x10f5, 0x5048, 0x502a, 0x507b, 0x5072, 0x5064, + 0x502e, 0x505c, 0x5053, 0x10f7, 0x5041, 0x50c8, 0x10f0, 0x5062, + 0x5080, 0x503e, 0x5083, 0x5071, 0x10f9, 0x504a, 0x5055, 0x5058, + 0x1192, 0x1195, 0x1196, 0x52fc, 0x52fd, 0x5315, 0x11b9, 0x5316, + 0x52ff, 0x11bd, 0x11b8, 0x1212, 0x5458, 0x54cf, 0x54e0, 0x1280, + 0x1281, 0x129a, 0x1298, 0x55e7, 0x566a, 0x5680, 0x12d4, 0x566f, + 0x5665, 0x12da, 0x5678, 0x567d, 0x5688, 0x12d6, 0x12db, 0x5664, + 0x567e, 0x12dc, 0x5667, 0x5863, 0x5888, 0x1371, 0x58cd, 0x1372, + 0x58c9, 0x13a8, 0x59ed, 0x13f0, 0x86db, 0x13f1, 0x13fd, 0x1438, + 0x1437, 0x1439, 0x5ab1, 0x1455, 0x1453, 0x5b04, 0x5b9e, 0x5ba0, + 0x5c43, 0x5c46, 0x5c48, 0x5c45, 0x5c40, 0x5c4c, + /* 0x45 */ + 0x14d5, 0x14bd, 0x5d0c, 0x5d13, 0x5d15, 0x14f5, 0x5d6b, 0x5d67, + 0x5e5d, 0x5e55, 0x5e35, 0x1521, 0x5e59, 0x5e2f, 0x5e3c, 0x5e8f, + 0x5e5c, 0x5e6a, 0x5e62, 0x5e5f, 0x5e6b, 0x5e6e, 0x5e3b, 0x5e44, + 0x5e41, 0x619a, 0x1592, 0x6199, 0x15de, 0x15db, 0x15da, 0x628f, + 0x15df, 0x6296, 0x15f9, 0x15f8, 0x15fa, 0x62f4, 0x62fc, 0x160e, + 0x6355, 0x1643, 0x6379, 0x1656, 0x1653, 0x169e, 0x63ee, 0x63f5, + 0x16a9, 0x640b, 0x16fa, 0x64f3, 0x1731, 0x1730, 0x64f7, 0x64ff, + 0x64f5, 0x1732, 0x64ec, 0x64f1, 0x1729, 0x172e, 0x659a, 0x1776, + 0x66e2, 0x673d, 0x675d, 0x68e8, 0x18a5, 0x68eb, 0x68ef, 0x68ee, + 0x6a81, 0x6b14, 0x1cd0, 0x1cd9, 0x1cdc, 0x1cd8, 0x008c, 0x1ce1, + 0x1ceb, 0x008b, 0x0089, 0x1cf4, 0x1ce2, 0x1cde, 0x008d, 0x0086, + 0x00d7, 0x1df4, 0x0104, 0x0107, 0x0103, 0x1eed, + /* 0x46 */ + 0x1eea, 0x0122, 0x1f32, 0x0151, 0x1fae, 0x1fb0, 0x0161, 0x21fb, + 0x2203, 0x220b, 0x01e9, 0x2207, 0x01e5, 0x21f8, 0x01e4, 0x2228, + 0x221e, 0x01e3, 0x2218, 0x2211, 0x2251, 0x2205, 0x2317, 0x2492, + 0x0265, 0x248c, 0x0263, 0x2478, 0x2484, 0x2473, 0x24ad, 0x2497, + 0x2495, 0x2477, 0x2472, 0x2496, 0x248d, 0x2510, 0x028c, 0x256c, + 0x031a, 0x26e7, 0x0315, 0x26e4, 0x0320, 0x0321, 0x26ef, 0x2226, + 0x031c, 0x031b, 0x26f0, 0x297b, 0x03fe, 0x2983, 0x0404, 0x0401, + 0x298b, 0x298c, 0x0400, 0x2978, 0x2a52, 0x046d, 0x0493, 0x2ad0, + 0x2acf, 0x04a1, 0x2bb3, 0x2bb4, 0x0576, 0x0579, 0x0572, 0x2d7b, + 0x0583, 0x2d6f, 0x2d81, 0x2d3c, 0x2d42, 0x2d38, 0x2d33, 0x85a6, + 0x2d60, 0x2d69, 0x2d7d, 0x2d86, 0x2e2c, 0x2e28, 0x0638, 0x304c, + 0x0630, 0x3057, 0x307c, 0x0634, 0x063a, 0x3055, + /* 0x47 */ + 0x3062, 0x3071, 0x306a, 0x3056, 0x303b, 0x3081, 0x0635, 0x304f, + 0x307e, 0x3064, 0x063f, 0x0640, 0x0632, 0x0631, 0x0636, 0x3171, + 0x7aba, 0x070f, 0x32a5, 0x329a, 0x329c, 0x0710, 0x32a6, 0x070d, + 0x32a4, 0x358f, 0x35c5, 0x35c8, 0x3592, 0x35b2, 0x07a9, 0x07b4, + 0x07ac, 0x35e3, 0x35c0, 0x35d6, 0x35d1, 0x359f, 0x35a2, 0x35d2, + 0x07b8, 0x07ae, 0x7bf3, 0x35e1, 0x35d5, 0x359d, 0x07b3, 0x07ba, + 0x3598, 0x083f, 0x3774, 0x37a1, 0x093c, 0x3af0, 0x3af3, 0x0942, + 0x0940, 0x3b1b, 0x3b0c, 0x3b1d, 0x3b34, 0x3b28, 0x3b17, 0x093e, + 0x3b44, 0x3b42, 0x3b04, 0x3b11, 0x3afa, 0x3b4a, 0x3d91, 0x3d8e, + 0x09e1, 0x3d8b, 0x3d8d, 0x3d7f, 0x3d8c, 0x3d7e, 0x3d7c, 0x3d83, + 0x09e6, 0x3d88, 0x09e0, 0x0a15, 0x3e94, 0x0a93, 0x3f55, 0x3f53, + 0x3f4f, 0x3f54, 0x406c, 0x4065, 0x4066, 0x4061, + /* 0x48 */ + 0x406b, 0x4068, 0x4076, 0x0ae7, 0x4060, 0x7e0f, 0x4074, 0x4106, + 0x420e, 0x0bad, 0x4207, 0x0bae, 0x0be3, 0x42b9, 0x0bf5, 0x42b7, + 0x42e2, 0x0c06, 0x4374, 0x4377, 0x4376, 0x4375, 0x0c4f, 0x4378, + 0x4371, 0x0c54, 0x437a, 0x3d5b, 0x437b, 0x44a6, 0x44ae, 0x44b8, + 0x0ccb, 0x0ce3, 0x0cc9, 0x44b1, 0x44af, 0x0d13, 0x4589, 0x4587, + 0x0d15, 0x0d61, 0x4629, 0x0d66, 0x462a, 0x0d64, 0x462d, 0x462c, + 0x0d60, 0x4632, 0x0d63, 0x46ec, 0x46f0, 0x4781, 0x479e, 0x4783, + 0x0e0a, 0x4792, 0x0e04, 0x47a3, 0x479f, 0x4793, 0x0e07, 0x4786, + 0x48b8, 0x48b7, 0x0e8d, 0x0e8f, 0x0e90, 0x0e92, 0x0eec, 0x49c8, + 0x49b6, 0x866c, 0x49d1, 0x0ee7, 0x49a8, 0x49ab, 0x0ef2, 0x49b3, + 0x49cd, 0x0eee, 0x49cf, 0x49a4, 0x0eef, 0x0f4c, 0x4b41, 0x4b6f, + 0x4b71, 0x0f5e, 0x0f5f, 0x0f76, 0x0f74, 0x0f72, + /* 0x49 */ + 0x0f90, 0x4c23, 0x4c5b, 0x0fbe, 0x4c61, 0x4c5f, 0x4d81, 0x1026, + 0x1025, 0x4d84, 0x4e13, 0x1074, 0x4e4a, 0x4e4c, 0x10fd, 0x1105, + 0x1101, 0x50bd, 0x5095, 0x1109, 0x5092, 0x50c3, 0x110c, 0x5096, + 0x50a5, 0x50b5, 0x50b3, 0x50a3, 0x50e4, 0x50d8, 0x50d5, 0x110d, + 0x50b7, 0x50ad, 0x50da, 0x5093, 0x5336, 0x11c0, 0x11c5, 0x11c9, + 0x533d, 0x532b, 0x5347, 0x5339, 0x11d5, 0x5345, 0x531d, 0x1241, + 0x54ff, 0x54ea, 0x1233, 0x54f5, 0x123a, 0x5500, 0x54ed, 0x5503, + 0x54e9, 0x1240, 0x1242, 0x55ea, 0x12e8, 0x569b, 0x568e, 0x56a2, + 0x12e4, 0x569c, 0x5694, 0x5690, 0x56a9, 0x56ac, 0x12e7, 0x569f, + 0x12e6, 0x12e1, 0x569d, 0x1339, 0x5867, 0x135c, 0x1375, 0x58d0, + 0x58d6, 0x58d4, 0x5998, 0x599a, 0x5997, 0x13ae, 0x13b0, 0x13fa, + 0x5a0b, 0x5a08, 0x5a01, 0x5ab4, 0x5ab3, 0x145b, + /* 0x4a */ + 0x5ba1, 0x5ba2, 0x14a5, 0x5c5a, 0x14a2, 0x5c61, 0x5c5f, 0x14db, + 0x14da, 0x5d25, 0x5d7b, 0x5d76, 0x5d7c, 0x1524, 0x5e89, 0x5ef6, + 0x5eb1, 0x5ead, 0x5e92, 0x5e81, 0x5e84, 0x1526, 0x5eae, 0x5e90, + 0x5e9e, 0x1598, 0x1596, 0x159a, 0x61a2, 0x61a7, 0x1597, 0x15e1, + 0x15e0, 0x15e3, 0x15e2, 0x62a0, 0x629d, 0x629f, 0x62d0, 0x15fb, + 0x62d1, 0x1612, 0x1614, 0x6359, 0x1645, 0x6364, 0x165c, 0x165d, + 0x16b8, 0x6419, 0x16ba, 0x6414, 0x6415, 0x641a, 0x1703, 0x1735, + 0x1736, 0x1739, 0x6506, 0x172d, 0x64f8, 0x6501, 0x177a, 0x65be, + 0x65bc, 0x65b7, 0x65b6, 0x65c0, 0x1778, 0x65b8, 0x177b, 0x177c, + 0x177e, 0x65c4, 0x177d, 0x65bf, 0x17c9, 0x66da, 0x66e4, 0x66e9, + 0x66e8, 0x66ea, 0x66e5, 0x17f3, 0x6726, 0x181a, 0x1819, 0x6740, + 0x181f, 0x18a6, 0x18a7, 0x18a8, 0x18ab, 0x18a9, + /* 0x4b */ + 0x192e, 0x6abd, 0x195e, 0x0095, 0x0093, 0x0092, 0x1d0e, 0x0096, + 0x1cf7, 0x0097, 0x1cfc, 0x1d0d, 0x1d01, 0x1dda, 0x1dd9, 0x1ddb, + 0x1e86, 0x1e8e, 0x1eee, 0x1f33, 0x1fb1, 0x01f5, 0x2247, 0x222d, + 0x2254, 0x01ea, 0x224b, 0x2252, 0x2231, 0x2244, 0x2256, 0x2250, + 0x222b, 0x01f3, 0x224d, 0x2237, 0x224f, 0x24a2, 0x24b7, 0x0269, + 0x24b2, 0x026b, 0x24aa, 0x24b5, 0x24b0, 0x026c, 0x24b4, 0x24a4, + 0x24a7, 0x0268, 0x2526, 0x26fe, 0x0328, 0x2704, 0x0326, 0x26fc, + 0x0325, 0x2706, 0x270a, 0x26fa, 0x270d, 0x2700, 0x270e, 0x036b, + 0x040f, 0x0408, 0x2991, 0x040c, 0x298f, 0x2990, 0x2998, 0x29a4, + 0x299b, 0x29a3, 0x2996, 0x29e4, 0x2a5a, 0x0460, 0x0462, 0x2a5e, + 0x0498, 0x2bb8, 0x2d57, 0x2d5c, 0x2da6, 0x2d95, 0x2d88, 0x058a, + 0x2da3, 0x2d8f, 0x0584, 0x2d64, 0x057f, 0x2d59, + /* 0x4c */ + 0x2d78, 0x0582, 0x2d85, 0x2d87, 0x2d9e, 0x0596, 0x0589, 0x2d98, + 0x2d9c, 0x058d, 0x05bc, 0x2e2f, 0x3080, 0x309b, 0x308e, 0x308d, + 0x3094, 0x30c6, 0x0644, 0x30a8, 0x3083, 0x063c, 0x30b9, 0x3086, + 0x30b4, 0x30af, 0x3091, 0x064e, 0x30aa, 0x30a1, 0x30a7, 0x32b6, + 0x32b3, 0x0714, 0x32bc, 0x32ac, 0x0715, 0x32ad, 0x360e, 0x07ce, + 0x361c, 0x361a, 0x07e0, 0x07c2, 0x360b, 0x07bf, 0x35ef, 0x360c, + 0x35f0, 0x3622, 0x07c4, 0x35d8, 0x07cf, 0x3612, 0x35fa, 0x07c8, + 0x362a, 0x07cc, 0x3610, 0x07cd, 0x07c7, 0x3629, 0x35f9, 0x35ea, + 0x362c, 0x3624, 0x18b7, 0x35e9, 0x3752, 0x374f, 0x3753, 0x0843, + 0x08b6, 0x3b10, 0x3b65, 0x3b75, 0x0951, 0x094a, 0x094d, 0x0956, + 0x3bd0, 0x0953, 0x3b5c, 0x3b3d, 0x3b71, 0x0959, 0x3b91, 0x3b0b, + 0x3b79, 0x3b81, 0x3b8f, 0x094e, 0x3b59, 0x3b74, + /* 0x4d */ + 0x09ee, 0x3dae, 0x09ec, 0x3da3, 0x3dad, 0x09eb, 0x09ef, 0x3dab, + 0x3da6, 0x3da2, 0x09ed, 0x1ef2, 0x3e57, 0x3e55, 0x3e99, 0x3f4b, + 0x407a, 0x0af2, 0x0aef, 0x0af1, 0x408c, 0x4084, 0x0aed, 0x0af0, + 0x4082, 0x4093, 0x407b, 0x0aee, 0x4109, 0x181b, 0x0b50, 0x0b66, + 0x0284, 0x0bb8, 0x0bf6, 0x438a, 0x0c57, 0x4390, 0x0c5e, 0x44c6, + 0x44d3, 0x44c0, 0x44d2, 0x44c7, 0x44c2, 0x0d19, 0x459f, 0x459d, + 0x459e, 0x0d70, 0x4641, 0x0d6e, 0x4638, 0x463a, 0x4642, 0x0d72, + 0x0d76, 0x463e, 0x46b0, 0x47ae, 0x47b3, 0x0e12, 0x0e1f, 0x47bf, + 0x0e11, 0x0e16, 0x47cd, 0x0e19, 0x47b2, 0x0e24, 0x0e14, 0x0e25, + 0x0e95, 0x0e96, 0x0e93, 0x0e94, 0x48c4, 0x48cd, 0x48c2, 0x48c6, + 0x48c3, 0x48c9, 0x48c7, 0x0ea0, 0x49f8, 0x0efb, 0x49ed, 0x49e2, + 0x0efc, 0x0f00, 0x0ef8, 0x49dc, 0x4a02, 0x4a01, + /* 0x4e */ + 0x0ef9, 0x49d6, 0x0f04, 0x49e4, 0x49fe, 0x0f03, 0x4a00, 0x49fc, + 0x49fd, 0x0ef3, 0x49f5, 0x49ff, 0x0efa, 0x49eb, 0x49e5, 0x4b78, + 0x4bae, 0x4be7, 0x0fbf, 0x4c65, 0x4c6a, 0x4c66, 0x4c68, 0x4c6b, + 0x4d94, 0x4da1, 0x4d92, 0x4d96, 0x4d93, 0x1079, 0x1110, 0x5101, + 0x1114, 0x50f8, 0x110e, 0x50f5, 0x111a, 0x5104, 0x1119, 0x1121, + 0x1123, 0x111f, 0x511b, 0x5103, 0x5133, 0x5134, 0x50ed, 0x1125, + 0x112b, 0x5135, 0x1116, 0x5105, 0x1122, 0x111b, 0x11ce, 0x11cf, + 0x537d, 0x11cb, 0x11d1, 0x11cc, 0x5371, 0x1217, 0x545c, 0x54e6, + 0x550f, 0x551b, 0x1251, 0x55a9, 0x55a5, 0x55ee, 0x56b1, 0x12ed, + 0x56cc, 0x56ce, 0x12f4, 0x56b7, 0x12f1, 0x56b5, 0x56e9, 0x56b4, + 0x12f8, 0x56b3, 0x56c1, 0x56af, 0x56ca, 0x56d0, 0x132f, 0x135e, + 0x135d, 0x588e, 0x1376, 0x1377, 0x58e9, 0x58db, + /* 0x4f */ + 0x137e, 0x58eb, 0x59a4, 0x13b6, 0x59a2, 0x599d, 0x13b3, 0x13fc, + 0x1403, 0x1400, 0x5a2a, 0x5a28, 0x140a, 0x1402, 0x5ab8, 0x5ab6, + 0x5ab9, 0x5ab7, 0x5b22, 0x5b2b, 0x5b27, 0x5b19, 0x5ba4, 0x1487, + 0x5bb3, 0x14a6, 0x5c71, 0x5c6a, 0x14a9, 0x14de, 0x5d88, 0x5d8c, + 0x5ebf, 0x5eb8, 0x5ebe, 0x5edc, 0x5ee5, 0x152e, 0x152d, 0x5ed4, + 0x5ed6, 0x1530, 0x5eda, 0x5eed, 0x5ef3, 0x5edb, 0x152b, 0x5eb9, + 0x5ee2, 0x5eeb, 0x61af, 0x159e, 0x61b2, 0x61b3, 0x159f, 0x15e5, + 0x15e4, 0x62a3, 0x62a5, 0x15fd, 0x15fc, 0x1617, 0x1619, 0x630a, + 0x1618, 0x6387, 0x6389, 0x638c, 0x63ef, 0x642a, 0x6422, 0x16bf, + 0x641f, 0x173c, 0x6519, 0x176b, 0x65ca, 0x65da, 0x1783, 0x1781, + 0x1780, 0x65de, 0x65c8, 0x65e0, 0x17ca, 0x66b6, 0x66b5, 0x17ce, + 0x66f4, 0x17f6, 0x676b, 0x6769, 0x6772, 0x6763, + /* 0x50 */ + 0x1839, 0x690d, 0x18ae, 0x6901, 0x690c, 0x18b5, 0x68f8, 0x18b3, + 0x18b4, 0x68fe, 0x6902, 0x6a84, 0x1922, 0x6aab, 0x6aaa, 0x1d1d, + 0x1d16, 0x0099, 0x1d2b, 0x1d1e, 0x1d1b, 0x1e90, 0x1e94, 0x1f14, + 0x7289, 0x0202, 0x2267, 0x0201, 0x227b, 0x02a1, 0x225f, 0x2261, + 0x01fd, 0x0273, 0x0274, 0x0270, 0x0276, 0x0275, 0x0272, 0x24c3, + 0x24ca, 0x24bb, 0x24c0, 0x24c4, 0x2501, 0x271f, 0x2718, 0x2711, + 0x2715, 0x0329, 0x2712, 0x271c, 0x032a, 0x2722, 0x2779, 0x29a6, + 0x0416, 0x29b3, 0x29ab, 0x2aea, 0x0499, 0x2b5b, 0x04d3, 0x04f5, + 0x2db7, 0x2dce, 0x2db9, 0x2dbd, 0x2dcf, 0x2dc0, 0x2d99, 0x2d97, + 0x0594, 0x2dbb, 0x2dd0, 0x2dc4, 0x2e31, 0x0656, 0x30d3, 0x30c0, + 0x0659, 0x0658, 0x0655, 0x0652, 0x30dc, 0x30d1, 0x30c8, 0x0657, + 0x30d5, 0x32c3, 0x071b, 0x071c, 0x32bf, 0x32c5, + /* 0x51 */ + 0x0719, 0x32cd, 0x32c1, 0x3306, 0x073f, 0x3324, 0x3663, 0x3642, + 0x3652, 0x07db, 0x3643, 0x3633, 0x07e2, 0x366c, 0x3657, 0x07d7, + 0x364c, 0x366e, 0x07de, 0x07e5, 0x07e4, 0x07e6, 0x07d6, 0x3637, + 0x07df, 0x3671, 0x364a, 0x3636, 0x07dc, 0x3653, 0x07da, 0x3645, + 0x3670, 0x07d3, 0x07d0, 0x365c, 0x3758, 0x3757, 0x0886, 0x0887, + 0x08ad, 0x08b7, 0x0958, 0x096a, 0x3bbb, 0x0962, 0x0961, 0x3bbe, + 0x0969, 0x096c, 0x0965, 0x3bb5, 0x3bd3, 0x3b9f, 0x0966, 0x3bb7, + 0x3bf5, 0x3db7, 0x09f5, 0x3dbb, 0x09f4, 0x3dd1, 0x09f7, 0x3dba, + 0x09f8, 0x3db6, 0x3dcc, 0x09fb, 0x09fc, 0x3dd3, 0x409b, 0x0af5, + 0x0af8, 0x4096, 0x40a2, 0x409d, 0x410a, 0x410e, 0x0b3c, 0x4181, + 0x422c, 0x4237, 0x4236, 0x423b, 0x0bc5, 0x42a1, 0x0c62, 0x0c63, + 0x4398, 0x0c67, 0x4396, 0x0c66, 0x0cd9, 0x0cdb, + /* 0x52 */ + 0x44d6, 0x44eb, 0x0cd8, 0x44dc, 0x0d1b, 0x45a5, 0x45a9, 0x6434, + 0x4653, 0x4645, 0x0d79, 0x464f, 0x0d7d, 0x46bd, 0x46bb, 0x46f1, + 0x0e2c, 0x0e37, 0x47ec, 0x47ed, 0x0e30, 0x0e9a, 0x48d3, 0x1600, + 0x48e1, 0x0f05, 0x4a19, 0x0f07, 0x0f09, 0x0f0a, 0x4a27, 0x4a26, + 0x0f79, 0x0fc2, 0x4c6e, 0x4daf, 0x1038, 0x1037, 0x4dad, 0x1021, + 0x4daa, 0x4e18, 0x105e, 0x113d, 0x1137, 0x1140, 0x516f, 0x514c, + 0x111d, 0x5142, 0x1133, 0x515c, 0x5170, 0x515f, 0x1135, 0x515a, + 0x514b, 0x513f, 0x538a, 0x11d8, 0x538b, 0x53a1, 0x538e, 0x11dc, + 0x11de, 0x5399, 0x545e, 0x545f, 0x5524, 0x55a7, 0x56ea, 0x56fd, + 0x56f9, 0x56e3, 0x56e5, 0x12fa, 0x12fb, 0x56ec, 0x133d, 0x133b, + 0x133f, 0x135f, 0x58f2, 0x137f, 0x58ef, 0x1384, 0x59a6, 0x13bc, + 0x1414, 0x140f, 0x5a3b, 0x5a43, 0x140e, 0x5a32, + /* 0x53 */ + 0x5b31, 0x5b30, 0x1460, 0x5b2d, 0x5b3c, 0x5ba7, 0x5ba5, 0x14ab, + 0x14ac, 0x14aa, 0x5d37, 0x5d95, 0x5d8e, 0x1504, 0x5d96, 0x1508, + 0x5f45, 0x5f0a, 0x1533, 0x1534, 0x5efd, 0x5f17, 0x5f1c, 0x5f07, + 0x5f31, 0x5f32, 0x5f2c, 0x5f30, 0x5f03, 0x5f05, 0x15a2, 0x61c2, + 0x15a4, 0x61b8, 0x15a5, 0x61c1, 0x15a7, 0x15a6, 0x15e7, 0x62ab, + 0x62b7, 0x15ff, 0x15fe, 0x6315, 0x6314, 0x161d, 0x161c, 0x630c, + 0x6317, 0x1667, 0x6393, 0x1694, 0x63d2, 0x16c5, 0x16c8, 0x6436, + 0x6431, 0x6433, 0x643c, 0x642e, 0x643a, 0x16c9, 0x643d, 0x16c7, + 0x64b5, 0x6522, 0x6523, 0x6520, 0x651c, 0x651d, 0x176c, 0x65a0, + 0x178a, 0x65ef, 0x65e8, 0x65eb, 0x1788, 0x1787, 0x1786, 0x65e1, + 0x65e6, 0x17cf, 0x17d0, 0x66f8, 0x66f5, 0x181c, 0x1823, 0x6783, + 0x6794, 0x6784, 0x1849, 0x678b, 0x678f, 0x1843, + /* 0x54 */ + 0x678c, 0x1848, 0x6789, 0x1847, 0x678e, 0x1846, 0x183f, 0x1844, + 0x6924, 0x690f, 0x18be, 0x6913, 0x690a, 0x18c2, 0x18ba, 0x18bc, + 0x18c6, 0x692a, 0x691a, 0x18c8, 0x6927, 0x6916, 0x6921, 0x1923, + 0x6a85, 0x6aac, 0x6ac6, 0x6ac5, 0x6ad7, 0x6b53, 0x009d, 0x1d28, + 0x1d27, 0x1ddf, 0x0124, 0x1f35, 0x1fb3, 0x0207, 0x228a, 0x227d, + 0x2289, 0x0279, 0x24cd, 0x24d0, 0x0278, 0x272b, 0x2733, 0x2729, + 0x2735, 0x2731, 0x2737, 0x2836, 0x29be, 0x0419, 0x29b9, 0x041c, + 0x29bb, 0x0418, 0x2de2, 0x2ddb, 0x2ddd, 0x2ddc, 0x2dda, 0x85af, + 0x2dd9, 0x05bd, 0x065d, 0x30df, 0x065a, 0x065e, 0x30e1, 0x065c, + 0x30ee, 0x065b, 0x31b5, 0x32d4, 0x32d5, 0x0721, 0x32d0, 0x32d1, + 0x32ce, 0x32d7, 0x0720, 0x0732, 0x367d, 0x368a, 0x07f2, 0x36a7, + 0x07f5, 0x3699, 0x3682, 0x3688, 0x07ee, 0x07ec, + /* 0x55 */ + 0x3686, 0x07ea, 0x3698, 0x369d, 0x07ed, 0x07f3, 0x368f, 0x07f6, + 0x36aa, 0x0848, 0x375d, 0x0849, 0x380a, 0x0975, 0x3bd7, 0x3bd6, + 0x3be5, 0x096f, 0x097b, 0x0973, 0x3bd9, 0x3bda, 0x3bea, 0x0970, + 0x3bf6, 0x7d39, 0x0978, 0x3de3, 0x09fe, 0x3de9, 0x0a00, 0x3deb, + 0x3def, 0x3df3, 0x3dea, 0x0a01, 0x8621, 0x0a55, 0x0a56, 0x0a9d, + 0x3f71, 0x0af9, 0x40ae, 0x0aff, 0x40b3, 0x0afd, 0x40ac, 0x0b43, + 0x0b41, 0x4183, 0x4245, 0x424e, 0x4244, 0x42a3, 0x42a5, 0x43a6, + 0x43a4, 0x0c6f, 0x43a9, 0x43af, 0x0c8a, 0x0ce5, 0x0ce6, 0x44f0, + 0x44f8, 0x44f1, 0x0d7f, 0x4649, 0x0db5, 0x0db6, 0x0dbb, 0x46c2, + 0x46f2, 0x46f3, 0x47fa, 0x0e40, 0x47f6, 0x47fc, 0x4818, 0x4808, + 0x4812, 0x0e9d, 0x0e9c, 0x48db, 0x48da, 0x0f0f, 0x0f11, 0x0f0d, + 0x4a2c, 0x4a4d, 0x0f14, 0x0f13, 0x4b46, 0x4bf6, + /* 0x56 */ + 0x4c2b, 0x4c74, 0x4db8, 0x4dc8, 0x1082, 0x1083, 0x114d, 0x5192, + 0x5193, 0x114f, 0x517f, 0x51ab, 0x5197, 0x114c, 0x1151, 0x51ac, + 0x11ee, 0x11e8, 0x18cb, 0x53ce, 0x11eb, 0x53cd, 0x11e2, 0x11e6, + 0x53c1, 0x53b1, 0x53c7, 0x11ec, 0x5540, 0x1259, 0x553f, 0x5539, + 0x125d, 0x5543, 0x1257, 0x125b, 0x1256, 0x55ab, 0x12fe, 0x571f, + 0x5709, 0x570c, 0x1300, 0x1301, 0x5840, 0x1342, 0x5896, 0x1360, + 0x58f6, 0x58f7, 0x141d, 0x5a46, 0x5a4f, 0x143e, 0x1469, 0x1465, + 0x5b3d, 0x5b41, 0x5f66, 0x5f78, 0x5f5d, 0x5f69, 0x5f74, 0x5f7d, + 0x5f6e, 0x5f72, 0x5f73, 0x5f62, 0x5f48, 0x5f53, 0x5f5f, 0x5f68, + 0x1538, 0x5f7f, 0x5f6b, 0x15ae, 0x61c4, 0x15ad, 0x62af, 0x62ad, + 0x62b2, 0x1602, 0x161f, 0x631a, 0x631b, 0x1622, 0x1620, 0x86f5, + 0x166c, 0x639b, 0x639f, 0x1668, 0x166d, 0x166e, + /* 0x57 */ + 0x16a0, 0x16ce, 0x16d0, 0x16d1, 0x16cb, 0x6440, 0x16d2, 0x6447, + 0x16d3, 0x64b7, 0x1720, 0x174e, 0x174b, 0x1772, 0x1770, 0x65a2, + 0x1792, 0x178f, 0x6600, 0x65f3, 0x1790, 0x8437, 0x65f5, 0x17d9, + 0x17d5, 0x66bd, 0x6700, 0x6702, 0x17fa, 0x6734, 0x6749, 0x679f, + 0x184b, 0x67a3, 0x67cd, 0x6799, 0x679d, 0x18d0, 0x18ce, 0x6939, + 0x18cf, 0x6944, 0x18c4, 0x18cc, 0x6935, 0x18d2, 0x1935, 0x6aaf, + 0x0a03, 0x1d2f, 0x009e, 0x00af, 0x6b8e, 0x020c, 0x229f, 0x229b, + 0x229e, 0x2296, 0x2294, 0x22a0, 0x027c, 0x273b, 0x0330, 0x0331, + 0x273a, 0x29c1, 0x2b4d, 0x2b5d, 0x2df3, 0x05a1, 0x059e, 0x0668, + 0x0661, 0x30f6, 0x30e5, 0x30ea, 0x30e7, 0x3105, 0x0665, 0x30f9, + 0x0666, 0x066a, 0x06ab, 0x36ab, 0x36ed, 0x36b2, 0x36b0, 0x36b5, + 0x36be, 0x36c1, 0x36c8, 0x07f9, 0x36c0, 0x36bc, + /* 0x58 */ + 0x36b1, 0x36c4, 0x36bf, 0x0858, 0x088a, 0x3c08, 0x3c03, 0x3bfd, + 0x3c10, 0x3c02, 0x3c13, 0x0a04, 0x3dfa, 0x3e00, 0x40b9, 0x40bc, + 0x0b02, 0x425b, 0x4251, 0x424f, 0x42eb, 0x43b8, 0x0c79, 0x43b9, + 0x43c1, 0x43c0, 0x43be, 0x450b, 0x0ceb, 0x4507, 0x450a, 0x4508, + 0x0ce9, 0x450d, 0x4506, 0x4515, 0x45af, 0x0d20, 0x0d21, 0x0d81, + 0x46f5, 0x0e4d, 0x0e59, 0x482e, 0x0e58, 0x481b, 0x81d1, 0x481a, + 0x4824, 0x0ea5, 0x0ea9, 0x48e6, 0x48e3, 0x0f1a, 0x0f19, 0x4a5d, + 0x4a4f, 0x4a66, 0x4a5b, 0x4b47, 0x4bb4, 0x0f96, 0x0f98, 0x0f97, + 0x4bfa, 0x4c2e, 0x82df, 0x0fc8, 0x4dce, 0x1043, 0x1045, 0x4e19, + 0x1152, 0x1157, 0x51cc, 0x51b2, 0x1155, 0x51bb, 0x51c1, 0x1156, + 0x1158, 0x11f2, 0x53e9, 0x53ee, 0x53f0, 0x53d6, 0x540e, 0x53da, + 0x5548, 0x554a, 0x554e, 0x554d, 0x55b1, 0x55b0, + /* 0x59 */ + 0x55b3, 0x1307, 0x5738, 0x5732, 0x1308, 0x572d, 0x130a, 0x5734, + 0x0f1b, 0x5729, 0x5874, 0x1361, 0x1362, 0x5903, 0x13c2, 0x13c6, + 0x59a9, 0x5a58, 0x141e, 0x1425, 0x5abf, 0x5ac1, 0x5b4a, 0x5bac, + 0x14b0, 0x5c89, 0x5d3d, 0x5d3c, 0x5da9, 0x5fa0, 0x153d, 0x5f90, + 0x153e, 0x5f93, 0x5f8b, 0x5fad, 0x5fbb, 0x5fb8, 0x1546, 0x1545, + 0x5f9c, 0x61d8, 0x61d7, 0x1603, 0x1626, 0x1627, 0x635d, 0x63a9, + 0x63da, 0x1698, 0x16ad, 0x16d5, 0x16da, 0x6454, 0x16d9, 0x6455, + 0x644b, 0x16dd, 0x643f, 0x64b9, 0x1715, 0x1716, 0x1717, 0x1721, + 0x6538, 0x6536, 0x6540, 0x174c, 0x653b, 0x6539, 0x65a4, 0x1796, + 0x1798, 0x6608, 0x660c, 0x179b, 0x6610, 0x17ff, 0x6707, 0x1825, + 0x67d2, 0x184f, 0x67c2, 0x67bb, 0x67cc, 0x67cb, 0x1856, 0x1854, + 0x694d, 0x6963, 0x694e, 0x18d8, 0x6950, 0x6955, + /* 0x5a */ + 0x18d7, 0x695e, 0x1926, 0x6a90, 0x6ab2, 0x6ab1, 0x1938, 0x6aca, + 0x6b02, 0x6b27, 0x6b26, 0x198a, 0x22af, 0x24e0, 0x24dc, 0x0334, + 0x2739, 0x0335, 0x856a, 0x277c, 0x27f3, 0x8570, 0x03a1, 0x286b, + 0x29c4, 0x310b, 0x3108, 0x310a, 0x066c, 0x066d, 0x31dc, 0x0729, + 0x072a, 0x32e1, 0x32df, 0x36ce, 0x36d4, 0x36e3, 0x36d7, 0x36e2, + 0x0800, 0x0808, 0x0806, 0x0805, 0x36d8, 0x36d5, 0x36d2, 0x08b1, + 0x0988, 0x3c1e, 0x3c2c, 0x3c25, 0x3bf3, 0x3e04, 0x3e08, 0x3e15, + 0x0a09, 0x40c4, 0x40c9, 0x40c7, 0x40c8, 0x42a9, 0x43c6, 0x43c5, + 0x4518, 0x451a, 0x4520, 0x0d22, 0x4666, 0x4664, 0x466a, 0x0dd5, + 0x0e61, 0x0e5d, 0x0e62, 0x0e4f, 0x0e60, 0x4835, 0x4834, 0x0eaa, + 0x0f22, 0x4a6c, 0x0f21, 0x4a6e, 0x4a71, 0x1046, 0x4dd4, 0x4dd6, + 0x4e1a, 0x4e62, 0x4e65, 0x4e76, 0x51db, 0x51d6, + /* 0x5b */ + 0x1162, 0x51e7, 0x1160, 0x1164, 0x51f4, 0x86b6, 0x53fd, 0x53d5, + 0x5407, 0x11f6, 0x540f, 0x53f8, 0x86c1, 0x1219, 0x5587, 0x1291, + 0x55b5, 0x55f5, 0x130d, 0x573f, 0x5743, 0x574c, 0x1365, 0x590b, + 0x5a6b, 0x5a68, 0x5a70, 0x5a75, 0x5a77, 0x143f, 0x5ac3, 0x154b, + 0x5fe9, 0x5fea, 0x5fcb, 0x5fc5, 0x5fc6, 0x1548, 0x5fed, 0x5fd3, + 0x1552, 0x5fe5, 0x154a, 0x1551, 0x5fdb, 0x5feb, 0x5fe0, 0x5fc1, + 0x1550, 0x154c, 0x61dd, 0x15ee, 0x1604, 0x1606, 0x162d, 0x162e, + 0x162f, 0x167b, 0x1678, 0x1677, 0x63b2, 0x63b4, 0x63b1, 0x63b5, + 0x63f2, 0x16a2, 0x16a1, 0x16e3, 0x6456, 0x171a, 0x1719, 0x1757, + 0x6544, 0x179e, 0x6626, 0x661f, 0x6618, 0x6621, 0x6617, 0x17dd, + 0x6709, 0x1805, 0x1828, 0x67c5, 0x67df, 0x1860, 0x67e3, 0x1866, + 0x67e9, 0x67ee, 0x1867, 0x1868, 0x6966, 0x697a, + /* 0x5c */ + 0x18de, 0x696e, 0x6991, 0x6983, 0x6976, 0x697e, 0x696d, 0x18e1, + 0x6a95, 0x6ae3, 0x1969, 0x1977, 0x6b03, 0x6b04, 0x8719, 0x6b17, + 0x00a6, 0x1d36, 0x00a5, 0x1f36, 0x0214, 0x2742, 0x0336, 0x0338, + 0x2744, 0x2746, 0x277e, 0x29ca, 0x29c8, 0x29cc, 0x2af0, 0x0670, + 0x3185, 0x32e5, 0x32e7, 0x072b, 0x0811, 0x080a, 0x36f4, 0x080d, + 0x36e9, 0x0816, 0x0810, 0x0809, 0x080e, 0x087a, 0x3c3d, 0x098c, + 0x3c36, 0x0991, 0x3e16, 0x0a0a, 0x3e12, 0x3e0f, 0x3e17, 0x3e11, + 0x3e0b, 0x0a08, 0x0a0b, 0x40cd, 0x40d0, 0x40cc, 0x40ce, 0x40d1, + 0x0b07, 0x4189, 0x0cf2, 0x466f, 0x484b, 0x4844, 0x4855, 0x0eae, + 0x0f24, 0x0f26, 0x0f27, 0x4a7f, 0x5771, 0x0f99, 0x4c2f, 0x4c7a, + 0x4c7b, 0x4c7c, 0x115f, 0x116a, 0x1171, 0x51fc, 0x5210, 0x5202, + 0x116c, 0x116f, 0x51ee, 0x5203, 0x1168, 0x520d, + /* 0x5d */ + 0x5213, 0x5208, 0x520f, 0x5418, 0x5412, 0x1201, 0x1268, 0x5567, + 0x5565, 0x55bb, 0x5769, 0x5762, 0x1313, 0x576e, 0x1316, 0x5761, + 0x1318, 0x5764, 0x574d, 0x5851, 0x1389, 0x13c8, 0x5a83, 0x5ac6, + 0x1484, 0x601f, 0x1554, 0x6004, 0x6017, 0x6008, 0x6005, 0x1556, + 0x5ff3, 0x601e, 0x6002, 0x601a, 0x601b, 0x6027, 0x601c, 0x155a, + 0x62b5, 0x1605, 0x1607, 0x6333, 0x1631, 0x6334, 0x6331, 0x63b8, + 0x63ba, 0x16a3, 0x63fc, 0x16eb, 0x171c, 0x64c3, 0x175a, 0x654d, + 0x175b, 0x662f, 0x17a6, 0x17aa, 0x17a5, 0x66c9, 0x17e1, 0x66c8, + 0x66c4, 0x672a, 0x6738, 0x6750, 0x182a, 0x680a, 0x67fb, 0x6804, + 0x67fc, 0x67fe, 0x1872, 0x186f, 0x1873, 0x6802, 0x67f6, 0x681b, + 0x67f9, 0x6815, 0x6810, 0x67ff, 0x6800, 0x680c, 0x186b, 0x18e6, + 0x6995, 0x69a5, 0x18e9, 0x18ec, 0x18e8, 0x18f0, + /* 0x5e */ + 0x6a98, 0x6ac1, 0x198c, 0x6b5a, 0x1d64, 0x22bb, 0x0215, 0x24e6, + 0x2749, 0x27f7, 0x0371, 0x0426, 0x29d0, 0x04c6, 0x2bc2, 0x05a8, + 0x3111, 0x0673, 0x36ff, 0x36fe, 0x36fd, 0x0815, 0x3701, 0x0998, + 0x0997, 0x3c4b, 0x3c4d, 0x3c47, 0x40d3, 0x4268, 0x4267, 0x0bd7, + 0x0c80, 0x43d1, 0x4530, 0x4532, 0x452e, 0x0d88, 0x6b9d, 0x46c9, + 0x46c8, 0x0e69, 0x4856, 0x4851, 0x0e6b, 0x0f29, 0x0f28, 0x4a85, + 0x4a89, 0x4a8e, 0x4a84, 0x105f, 0x4e6a, 0x522b, 0x522f, 0x5228, + 0x1174, 0x5216, 0x5215, 0x521d, 0x541a, 0x1202, 0x126a, 0x1294, + 0x55bc, 0x5775, 0x577c, 0x138a, 0x5911, 0x5912, 0x5b5c, 0x5dbb, + 0x1564, 0x5ff4, 0x155e, 0x1561, 0x602d, 0x1565, 0x1566, 0x62e4, + 0x6337, 0x6336, 0x6367, 0x63be, 0x63bd, 0x63e2, 0x6468, 0x6466, + 0x64c8, 0x64ca, 0x64c7, 0x64dc, 0x175f, 0x654f, + /* 0x5f */ + 0x65a9, 0x663c, 0x17af, 0x663b, 0x66ce, 0x180d, 0x6714, 0x6753, + 0x187c, 0x682e, 0x187a, 0x681f, 0x1876, 0x1879, 0x187d, 0x1877, + 0x69b0, 0x69bd, 0x18f6, 0x18f1, 0x69ae, 0x69c4, 0x6a7b, 0x0c0b, + 0x1929, 0x6a9e, 0x196f, 0x6b05, 0x199a, 0x6b69, 0x6ba1, 0x22c7, + 0x231d, 0x274a, 0x29d3, 0x0469, 0x2b72, 0x2e02, 0x05ab, 0x2e35, + 0x3127, 0x311e, 0x311f, 0x072c, 0x072d, 0x3707, 0x3706, 0x0817, + 0x099a, 0x3c54, 0x3e1c, 0x3e20, 0x46f8, 0x0e6e, 0x485d, 0x4858, + 0x0f2c, 0x4a92, 0x4b4e, 0x0fca, 0x1178, 0x1206, 0x5427, 0x1207, + 0x5781, 0x5783, 0x1320, 0x5844, 0x1353, 0x13ce, 0x147a, 0x1479, + 0x6042, 0x604d, 0x6054, 0x604e, 0x156b, 0x6043, 0x1567, 0x156d, + 0x633c, 0x6340, 0x63c0, 0x1685, 0x16b0, 0x16f3, 0x1763, 0x655a, + 0x6651, 0x17b6, 0x66dd, 0x1882, 0x187f, 0x6838, + /* 0x60 */ + 0x1886, 0x6845, 0x683a, 0x1884, 0x6835, 0x18fc, 0x18fd, 0x18fa, + 0x6af1, 0x1987, 0x6b93, 0x1e9a, 0x021a, 0x0219, 0x5241, 0x29d7, + 0x0675, 0x3128, 0x081a, 0x081b, 0x0819, 0x3c53, 0x3c59, 0x099c, + 0x3e21, 0x0a10, 0x426f, 0x4537, 0x45b5, 0x4862, 0x485e, 0x48f5, + 0x117b, 0x117c, 0x523d, 0x1208, 0x542d, 0x5589, 0x578d, 0x5787, + 0x5790, 0x591a, 0x5a99, 0x1441, 0x14e3, 0x1572, 0x605f, 0x1573, + 0x1568, 0x6056, 0x6061, 0x605b, 0x605a, 0x605c, 0x6065, 0x1635, + 0x6341, 0x1688, 0x169d, 0x646e, 0x646c, 0x646d, 0x0e75, 0x65aa, + 0x665c, 0x6658, 0x66de, 0x188f, 0x684f, 0x6851, 0x188e, 0x6853, + 0x1905, 0x1904, 0x18ff, 0x69fc, 0x6b39, 0x199e, 0x1d3e, 0x0154, + 0x22d2, 0x0281, 0x274f, 0x3714, 0x0cfa, 0x4672, 0x4673, 0x0f32, + 0x1270, 0x126e, 0x5791, 0x86d6, 0x147c, 0x5dbf, + /* 0x61 */ + 0x1575, 0x606c, 0x1574, 0x1577, 0x62e6, 0x6345, 0x1637, 0x63c8, + 0x63e4, 0x655d, 0x17ba, 0x6721, 0x1811, 0x672c, 0x6757, 0x1892, + 0x1899, 0x685d, 0x6861, 0x6865, 0x6a08, 0x190a, 0x192a, 0x192b, + 0x1944, 0x1979, 0x6b45, 0x00aa, 0x0348, 0x2e05, 0x32ef, 0x371b, + 0x371d, 0x3e25, 0x3e24, 0x486d, 0x0eb4, 0x5242, 0x5249, 0x120d, + 0x5578, 0x558a, 0x5797, 0x1354, 0x589b, 0x591c, 0x1430, 0x5aa2, + 0x1609, 0x1638, 0x1636, 0x168b, 0x16f7, 0x1766, 0x17bd, 0x181e, + 0x686c, 0x1896, 0x686f, 0x190d, 0x6a0e, 0x1973, 0x6b08, 0x6b1d, + 0x6ba3, 0x033b, 0x033c, 0x2b60, 0x371c, 0x09a0, 0x0cfb, 0x6cfd, + 0x48f3, 0x1181, 0x579b, 0x5aa7, 0x5dc4, 0x1578, 0x607a, 0x168d, + 0x1773, 0x6661, 0x6663, 0x66d7, 0x6876, 0x19a6, 0x6ba5, 0x05ad, + 0x3c67, 0x0a11, 0x3eab, 0x524a, 0x557d, 0x579d, + /* 0x62 */ + 0x5853, 0x5b65, 0x607b, 0x1639, 0x64cd, 0x64dd, 0x17bf, 0x6730, + 0x6a16, 0x190f, 0x19a7, 0x19b5, 0x0bdc, 0x1431, 0x62e7, 0x6a18, + 0x6aa2, 0x19a8, 0x6b7c, 0x0d25, 0x4a9e, 0x6084, 0x17c1, 0x6a1c, + 0x0d90, 0x4871, 0x63ca, 0x1296, 0x147f, 0x1910, 0x6aa3, 0x160a, + 0x687b, 0x6b97, 0x1912, 0x163a, 0x6350, 0x163b, +}; +static const unsigned short cns11643_3_2uni_page64[292] = { + /* 0x64 */ + 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, + 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, + 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, + 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, + 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x1b66, + 0x1b68, 0x1be7, 0x1c3f, 0x6cfd, 0x1ca6, 0x1d0f, 0x1e3e, 0x1f24, + 0x1f65, 0x1f9b, 0x1d7f, 0x20cb, 0x2173, 0x2171, 0x216b, 0x21f4, + 0x2222, 0x2220, 0x2292, 0x22ba, 0x2291, 0x22b0, 0x2359, 0x238a, + 0x240f, 0x2412, 0x2413, 0x2447, 0x249b, 0x2500, 0x254d, 0x26d1, + 0x26d3, 0x2767, 0x2857, 0x2877, 0x28d5, 0x2975, 0x298e, 0x29a5, + 0x29b6, 0x29bf, 0x2a65, 0x2acd, 0x2aed, 0x2b94, 0x2b9a, 0x2bba, + 0x2d25, 0x2d50, 0x2ea3, 0x2f60, 0x2f64, 0x2fb6, + /* 0x65 */ + 0x3003, 0x30b6, 0x311a, 0x4625, 0x2821, 0x32e2, 0x3302, 0x33a4, + 0x33ac, 0x3410, 0x3406, 0x345e, 0x345a, 0x352c, 0x3529, 0x362d, + 0x3677, 0x367a, 0x36ca, 0x36e6, 0x36f5, 0x370d, 0x370e, 0x37dc, + 0x37dd, 0x37f6, 0x381e, 0x3863, 0x39a5, 0x3a0f, 0x3a8a, 0x3a84, + 0x3a8b, 0x3a7c, 0x3b4c, 0x3b48, 0x3b49, 0x3b9d, 0x3b99, 0x3bf8, + 0x3c2e, 0x3c2d, 0x3c5c, 0x45cc, 0x3cbf, 0x3cea, 0x3ce5, 0x3d11, + 0x3d12, 0x3d3f, 0x3d39, 0x3d3b, 0x3d3d, 0x3d77, 0x3d75, 0x3d76, + 0x3d71, 0x3d96, 0x3d93, 0x3db4, 0x3ddd, 0x3dde, 0x3e0e, 0x2511, + 0x3e18, 0x3f47, 0x3f48, 0x3fef, 0x4012, 0x403b, 0x40a4, 0x408d, + 0x40b4, 0x4273, 0x4277, 0x42bc, 0x4419, 0x441b, 0x443d, 0x4453, + 0x4454, 0x4458, 0x44b7, 0x44d8, 0x44ee, 0x4522, 0x454d, 0x4586, + 0x4599, 0x45a3, 0x45bc, 0x46a7, 0x4737, 0x4759, + /* 0x66 */ + 0x47d0, 0x482f, 0x4832, 0x4842, 0x484e, 0x4868, 0x48a9, 0x48ed, + 0x49d0, 0x4a07, 0x49d3, 0x4a64, 0x4b40, 0x6cfd, 0x4c41, 0x4c63, + 0x4cbb, 0x3311, 0x3325, 0x4e48, 0x4f10, 0x4f62, 0x4f12, 0x5021, + 0x501e, 0x50e2, 0x50de, 0x50e1, 0x5173, 0x51d4, 0x51f5, 0x5237, + 0x5245, 0x5272, 0x534a, 0x53a9, 0x53a5, 0x53f5, 0x5434, 0x5450, + 0x5487, 0x5554, 0x5584, 0x5703, 0x5852, 0x58d8, 0x590c, 0x5918, + 0x59b0, 0x5abc, 0x5ad5, 0x5baa, 0x5c9c, 0x6cfd, 0x5d5c, 0x5e2b, + 0x5e21, 0x5e73, 0x5ef4, 0x5ef5, 0x5f3f, 0x5f42, 0x5f86, 0x5fbe, + 0x5fbc, 0x5fbd, 0x5ff1, 0x5ff2, 0x5fef, 0x6022, 0x6023, 0x6024, + 0x6067, 0x6066, 0x6197, 0x61ce, 0x61e7, 0x633b, 0x634d, 0x64e4, + 0x6542, 0x671d, 0x6798, 0x6cfd, 0x6949, 0x3049, 0x2a71, 0x2a85, + 0x2dd3, 0x650e, 0x4c02, 0x441e, 0x6cfd, 0x6cfd, + /* 0x67 */ + 0x2128, 0x2172, 0x21ba, 0x21f0, 0x21ee, 0x22b8, 0x22b9, 0x22c4, + 0x4c53, 0x5eb0, +}; + +static const ucs4_t cns11643_3_2uni_upages[136] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x04c00, 0x04d00, 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05200, 0x05300, + 0x05400, 0x05500, 0x05600, 0x05700, 0x05800, 0x05900, 0x05a00, 0x05b00, + 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06000, 0x06100, 0x06200, 0x06300, + 0x06400, 0x06500, 0x06600, 0x06700, 0x06800, 0x06900, 0x06a00, 0x06b00, + 0x06c00, 0x06d00, 0x06e00, 0x06f00, 0x07000, 0x07100, 0x07200, 0x07300, + 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, 0x07a00, 0x07b00, + 0x07c00, 0x07d00, 0x07e00, 0x07f00, 0x08000, 0x08100, 0x08200, 0x08300, + 0x08400, 0x08500, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, 0x08b00, + 0x08c00, 0x08d00, 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, 0x09300, + 0x09400, 0x09500, 0x09600, 0x09700, 0x09800, 0x09900, 0x09a00, 0x09b00, + 0x09c00, 0x09d00, 0x09e00, 0x09f00, 0x0ff00, 0x20000, 0x20100, 0x20200, + 0x20500, 0x20600, 0x20b00, 0x20d00, 0x21300, 0x21600, 0x21700, 0x21d00, + 0x22300, 0x22500, 0x23000, 0x23500, 0x23c00, 0x24000, 0x24a00, 0x25100, + 0x25900, 0x25c00, 0x26500, 0x28c00, 0x29900, 0x2f800, 0x2f900, 0x2fa00, +}; + +static int +cns11643_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x62) || (c1 >= 0x64 && c1 <= 0x67)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + if (i < 6298) { + if (i < 6148) + swc = cns11643_3_2uni_page21[i], + wc = cns11643_3_2uni_upages[swc>>8] | (swc & 0xff); + } else { + if (i < 6590) + swc = cns11643_3_2uni_page64[i-6298], + wc = cns11643_3_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_4.h b/Externals/libiconv-1.14/lib/cns11643_4.h new file mode 100644 index 0000000000..e7259920b5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_4.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 4 + */ + +/* + * The table has been split into two parts. Each part's entries fit it 16 bits. + * But the combined table would need 17 bits per entry. + */ +#include "cns11643_4a.h" +#include "cns11643_4b.h" + +static int +cns11643_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x6e)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 2914) + swc = cns11643_4a_2uni_page21[i], + wc = cns11643_4a_2uni_upages[swc>>8] | (swc & 0xff); + else if (i < 7298) + swc = cns11643_4b_2uni_page40[i-2914], + wc = cns11643_4b_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} diff --git a/Externals/libiconv-1.14/lib/cns11643_4a.h b/Externals/libiconv-1.14/lib/cns11643_4a.h new file mode 100644 index 0000000000..ee81576a7a --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_4a.h @@ -0,0 +1,460 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 4 part a + */ + +static const unsigned short cns11643_4a_2uni_page21[2914] = { + /* 0x21 */ + 0x5a86, 0x1840, 0x1841, 0x185a, 0x75e8, 0x1802, 0x1829, 0x5b0e, + 0x6027, 0x1c02, 0x013e, 0x27dc, 0x5f3c, 0x6075, 0xd128, 0x1d42, + 0x1d6a, 0x2552, 0x6f3c, 0xd175, 0xd178, 0x29c4, 0x2c4c, 0x39ad, + 0x1812, 0x182f, 0x1896, 0x18d0, 0x1b42, 0x1b83, 0xd119, 0x60a5, + 0x60aa, 0x630f, 0x640e, 0x1d83, 0x1db8, 0x659c, 0x659b, 0x6a3c, + 0x2328, 0x71c2, 0x2623, 0x2801, 0x2900, 0x87b4, 0x08b8, 0x376c, + 0x392b, 0x1b88, 0x4879, 0x51b6, 0x1817, 0x5a65, 0x000c, 0x5bb2, + 0x0030, 0x18e2, 0x18db, 0x5e77, 0x5f42, 0x1bad, 0x6033, 0x1bf7, + 0x00da, 0x60af, 0x6236, 0x0113, 0x1d1b, 0x1d88, 0x1d87, 0x6522, + 0x1dcf, 0x1dfd, 0x0163, 0x1de7, 0x20dc, 0x69a3, 0x20d9, 0x2125, + 0x2127, 0x2333, 0x2613, 0x7225, 0x7224, 0x2675, 0x7652, 0x7789, + 0x7abf, 0x05c4, 0x05c3, 0x2ff1, 0x87b5, 0xa24c, + /* 0x22 */ + 0x4552, 0xc714, 0xc712, 0x0001, 0x5aa3, 0x5aa2, 0x1851, 0x186a, + 0x5bb6, 0x190c, 0x5bb5, 0x5bb4, 0x18fe, 0x191b, 0x5bc2, 0x5bb8, + 0x003a, 0x5e79, 0x00ab, 0x1b73, 0x5f08, 0x1b8e, 0x5f7a, 0x5fb6, + 0x60bd, 0x60b7, 0x60bc, 0x00dd, 0x60c4, 0x60c9, 0x1ca5, 0x0115, + 0x1ca7, 0x1ca4, 0x6330, 0x6383, 0x6385, 0x6412, 0x6434, 0x1dbd, + 0x64e4, 0x64de, 0x652a, 0x1e02, 0x65af, 0x65b4, 0x65b3, 0x65b1, + 0x212b, 0x231b, 0x2335, 0x6cde, 0x02a7, 0x02a5, 0x6db8, 0x6db0, + 0x02a6, 0x6fc2, 0x59fd, 0x2617, 0x037c, 0x722a, 0x2670, 0x267d, + 0x03a9, 0x75e9, 0x27e9, 0x7657, 0x0434, 0x0435, 0x77b6, 0x77d7, + 0x77de, 0x04a8, 0x2919, 0x291c, 0x2975, 0x7ac2, 0x7bab, 0x04ff, + 0x29c8, 0x7e8f, 0x05c7, 0x05c6, 0x05c8, 0x7f6d, 0x82b5, 0x06d0, + 0x06d1, 0x87c0, 0x87bf, 0x0859, 0x8bb9, 0x8d1c, + /* 0x23 */ + 0x3412, 0x08bd, 0x8e80, 0x9184, 0x9185, 0x0a28, 0x39b3, 0x9524, + 0x0aa9, 0x3a90, 0x3c36, 0xaa4c, 0x0fcc, 0xb1f6, 0x4881, 0x51b8, + 0xc370, 0x14b4, 0xc375, 0xc717, 0x1823, 0x0016, 0x002c, 0x5bf1, + 0x192e, 0x5bda, 0x1b4f, 0x5fb9, 0x1bba, 0x00df, 0x00e0, 0x1c22, + 0x60ce, 0x60d2, 0x60d0, 0x0117, 0x6243, 0x1caf, 0x1cb0, 0x1cb1, + 0x624d, 0x6334, 0x012f, 0x63d9, 0x1d64, 0x6418, 0x1dd3, 0x6538, + 0x016a, 0x65d7, 0x0170, 0x016d, 0x65dc, 0x65cb, 0x65d6, 0x65d8, + 0x016e, 0x65d1, 0xd13e, 0xd13c, 0x65d2, 0x022b, 0x0228, 0x6a59, + 0x59fd, 0x233f, 0x6ce5, 0x6ce6, 0x0292, 0x6ce8, 0x238b, 0x6dbd, + 0x2391, 0x2395, 0x6dbe, 0x6f49, 0x033f, 0x6fcd, 0x258a, 0x034f, + 0x0374, 0x715e, 0x71d0, 0x037d, 0x7306, 0x03b7, 0x03a3, 0x03b0, + 0x03b1, 0x2687, 0x03ab, 0x737c, 0x7371, 0x75ef, + /* 0x24 */ + 0x043a, 0x0437, 0x280d, 0x0438, 0x0440, 0x778d, 0x77b7, 0x288e, + 0x049f, 0x7933, 0x797f, 0x297a, 0x7bf2, 0x0504, 0x0509, 0x0506, + 0x04fd, 0x050a, 0x0507, 0x7f2a, 0x7f8b, 0x05ca, 0x7f83, 0x7f8a, + 0x2c90, 0x05c9, 0x7f8e, 0x2c9a, 0x82b6, 0x2e3c, 0x2e3a, 0x067f, + 0x2e98, 0x84d8, 0x06d2, 0x8556, 0x87d2, 0x3065, 0xd1db, 0x0743, + 0x87c2, 0x8a87, 0x8a81, 0x8bc2, 0x8bbc, 0x8d23, 0x08c1, 0x8e93, + 0x08c5, 0x09a3, 0x918d, 0x918e, 0x0a2a, 0x0a5f, 0x953b, 0x954d, + 0x0a5d, 0x9534, 0x9531, 0x96f2, 0x96f0, 0x0b17, 0x9a15, 0x9b28, + 0x0b71, 0x0b72, 0x9c25, 0x9de7, 0x0c0f, 0x9de9, 0xa017, 0x40c2, + 0x0d91, 0xa96c, 0xa980, 0xaa4b, 0x0fb2, 0x0fcf, 0x0fce, 0x469e, + 0xafde, 0xaffb, 0x47eb, 0xb051, 0x4889, 0x1096, 0xb201, 0xb202, + 0x4896, 0xb205, 0x4887, 0xb203, 0x1097, 0xc151, + /* 0x25 */ + 0x51c0, 0x148b, 0x51c3, 0xc153, 0xc37a, 0xc378, 0xc376, 0xc379, + 0xc38f, 0xc37c, 0x5578, 0xc71b, 0xc71c, 0x5625, 0x8f92, 0x1875, + 0x1874, 0x5b2e, 0x5b2c, 0x002d, 0x5c0c, 0x1999, 0x5c0b, 0x0050, + 0x004b, 0x5c05, 0x004f, 0x004c, 0xd105, 0x1971, 0x1b53, 0x1bbf, + 0x5fc2, 0x5fc3, 0x1bc0, 0x6048, 0x1bee, 0x6046, 0x00e4, 0x00e3, + 0x60ea, 0x00e1, 0x60eb, 0x00e2, 0x60ee, 0x1c3d, 0x0119, 0x1cbd, + 0x1d0c, 0x62d8, 0x9a1e, 0x63df, 0x63de, 0x0141, 0x4537, 0x644f, + 0x1dc0, 0x015e, 0x660d, 0x6608, 0x0179, 0x6609, 0x1e6e, 0x1e83, + 0x6612, 0x6665, 0x1e5e, 0x1e5d, 0x217e, 0x2179, 0x6a89, 0x217a, + 0x216c, 0x6a84, 0x6a9e, 0x6a8b, 0x0232, 0x2187, 0x6c62, 0x231d, + 0x0294, 0x2346, 0x0297, 0x6cf9, 0x2343, 0x6cf7, 0x0296, 0x0298, + 0x6d06, 0x6ddd, 0x02b2, 0x6dd9, 0x6ddf, 0x6de2, + /* 0x26 */ + 0x02b9, 0x2561, 0x2566, 0x5af1, 0x2590, 0x0375, 0x037f, 0x037e, + 0x2629, 0x038f, 0x723f, 0x723e, 0x730b, 0x03bd, 0x26b2, 0x7383, + 0x03bb, 0x03bc, 0x7386, 0x26c0, 0x767c, 0x043d, 0x043e, 0x0474, + 0x77f7, 0x047a, 0x0476, 0x0478, 0x0475, 0x77fb, 0x793b, 0x04af, + 0x04b0, 0x04c7, 0x04cc, 0x7bf9, 0x7bca, 0x0516, 0x7bff, 0x0512, + 0x051d, 0x7c09, 0x7c03, 0x0515, 0x050f, 0x0514, 0x2a1f, 0x29e2, + 0x7c10, 0x7e9a, 0x7e9f, 0x05b0, 0x05bf, 0x05c0, 0x7f87, 0x05d2, + 0x05d9, 0x82b7, 0x067a, 0x8308, 0x82f9, 0x0681, 0x0682, 0x82f4, + 0x2f16, 0x2ef9, 0x06da, 0xad57, 0x3088, 0x87d6, 0x309b, 0xd1de, + 0x306e, 0x309e, 0x87d4, 0x0822, 0x081f, 0x8a90, 0x8a8d, 0x0821, + 0x3324, 0x8b60, 0x8bce, 0x8bcf, 0x085c, 0x337d, 0x8bd1, 0x087d, + 0x088d, 0x088f, 0x34e6, 0x8eca, 0x34cb, 0x08d0, + /* 0x27 */ + 0x8eb7, 0x08d8, 0x8eb2, 0x8ebb, 0x8eb9, 0x34b5, 0x09a7, 0x919e, + 0x3797, 0x91b2, 0x379b, 0x0a12, 0x936f, 0x93ac, 0x0a2f, 0x9423, + 0x396b, 0x0a2e, 0x0a2c, 0x0a5c, 0x956c, 0x39d5, 0x9532, 0x955e, + 0x0a62, 0x0a67, 0x0ab4, 0x96fb, 0x9929, 0x99bd, 0x9a1f, 0x3c43, + 0x7941, 0x9a1d, 0x3c9c, 0x9b31, 0x9b2f, 0x0bea, 0x9d43, 0x0bfb, + 0x9d41, 0x0c14, 0x9df5, 0x0c13, 0x0c12, 0x0c10, 0x0c11, 0x9df2, + 0x0c86, 0x3ee4, 0x0c98, 0xa01e, 0xa254, 0x0d2a, 0xa256, 0xa329, + 0xa327, 0xa328, 0x41ce, 0x0eb5, 0xa979, 0xa97e, 0xabb6, 0xabb7, + 0x4613, 0x0fd6, 0x0fd8, 0x46b7, 0x0fd9, 0x0fd4, 0x0fd7, 0xd281, + 0x46b9, 0x59fd, 0xad4d, 0x47e4, 0x47fd, 0x480f, 0x1060, 0xb109, + 0xb108, 0x109e, 0x10a1, 0xb21e, 0xb21a, 0xb223, 0xb215, 0xb219, + 0xb216, 0x48bf, 0x48ca, 0xb214, 0xb218, 0x48c1, + /* 0x28 */ + 0x10a0, 0xb51f, 0xb6dd, 0xb6df, 0xc169, 0x51d0, 0x59fd, 0xc16c, + 0x14b9, 0xc393, 0x52ae, 0xc395, 0xc394, 0xc391, 0xc397, 0xc730, + 0x15c1, 0x15c2, 0x5638, 0xd318, 0x001c, 0x5c31, 0x005e, 0x19bc, + 0x0059, 0x005c, 0x5c36, 0x005f, 0x19e9, 0x19bd, 0x19e2, 0x1b58, + 0x5fc9, 0x5fca, 0x00ce, 0x6118, 0x6112, 0x6119, 0x6110, 0x6116, + 0x1cc6, 0x625f, 0x1cc8, 0x62df, 0x6317, 0x1d28, 0x633c, 0x1d29, + 0x63ea, 0x63e9, 0x641c, 0x6458, 0x6464, 0x64f3, 0x015f, 0x6697, + 0x0185, 0x665a, 0x6659, 0x0186, 0x668e, 0x21b4, 0x6abc, 0x21a9, + 0x0287, 0x6d0d, 0x6cfc, 0x6d0c, 0x6e07, 0x6e0a, 0x02ca, 0x6e02, + 0x02c3, 0x6e26, 0x6e08, 0x6e1d, 0x02c2, 0x2568, 0x6f4e, 0x0341, + 0x6fed, 0x6fee, 0x6fef, 0x0380, 0x0381, 0x7250, 0x724c, 0x0393, + 0x0392, 0x724f, 0x03c5, 0x73d4, 0x59fd, 0x73b0, + /* 0x29 */ + 0x0446, 0x0441, 0x0445, 0x0442, 0x043f, 0x76a5, 0x7809, 0x0482, + 0x0481, 0x047f, 0x04a5, 0x292b, 0x04b3, 0x04b5, 0x79f3, 0x79d7, + 0x298d, 0x04da, 0x7adc, 0x04db, 0x050d, 0x2a18, 0x050e, 0x7c0b, + 0x051e, 0x0525, 0x0526, 0x051c, 0x0521, 0x2a57, 0x2a48, 0x0527, + 0x051a, 0x7c3a, 0x7c0d, 0x7c11, 0x2a38, 0x7c20, 0x7c01, 0x0524, + 0x7c37, 0xd1a3, 0x2a71, 0x7eaa, 0x05c1, 0x05e1, 0x7fe7, 0x7fe8, + 0x2d12, 0x05eb, 0x7ff5, 0x05e2, 0x05d7, 0x05e9, 0x8035, 0x7fe6, + 0x2d0a, 0x7ff8, 0x2d23, 0x7ff1, 0x0684, 0x8314, 0x8315, 0x8309, + 0x06b5, 0x06bc, 0x06dc, 0x06de, 0x06df, 0x857b, 0x2f2a, 0x857e, + 0x8766, 0x8767, 0x880a, 0x0754, 0x30e0, 0x30be, 0x0753, 0x0824, + 0x0825, 0x3329, 0x0828, 0x0827, 0x8a9c, 0x8b62, 0x8be1, 0x8bde, + 0x8bdf, 0x8be9, 0x088b, 0x8ee4, 0x8ef7, 0x08dc, + /* 0x2a */ + 0x3543, 0x8eea, 0x8ef6, 0x8f12, 0xd201, 0x37a6, 0x09b2, 0x37c0, + 0x91d9, 0x392f, 0x935f, 0x0a1b, 0x9373, 0x0a32, 0x3971, 0x943f, + 0x9578, 0x0a6b, 0x957d, 0x0a6c, 0x0a6d, 0x9712, 0x0ab9, 0x0aba, + 0x0b09, 0x0b0a, 0x992f, 0x3bea, 0x0b1b, 0x9930, 0x99db, 0x3c20, + 0x0b58, 0x9a29, 0x0b5a, 0xd236, 0x9b40, 0x0b77, 0x9b3d, 0x9b3e, + 0x0b79, 0x3ca9, 0x9b38, 0x3d85, 0x9c48, 0x0beb, 0x9cd0, 0x0bfd, + 0x0bfc, 0x3e06, 0x0c15, 0x0c18, 0x3df6, 0x0c16, 0x0c17, 0x0c19, + 0x3e00, 0x0c1b, 0x9e0e, 0x9e09, 0x3e02, 0x9e07, 0x0c87, 0x9f5f, + 0x9f60, 0x0c9c, 0xa02a, 0x0c9a, 0xa029, 0x0cff, 0x0cfe, 0xa14d, + 0x0d31, 0x0d2e, 0x0d30, 0x0d32, 0xa26c, 0x59fd, 0x0d2f, 0xa267, + 0x0d95, 0x0d96, 0xa339, 0xa334, 0xa459, 0x0dc5, 0x0e7a, 0xa923, + 0x0f42, 0xa982, 0x0f54, 0xa983, 0xa9a8, 0xaa55, + /* 0x2b */ + 0xaaf9, 0xaaf8, 0xaafc, 0xaafa, 0x4609, 0xd27a, 0x0f9f, 0x0fa0, + 0x0fa2, 0x0fe0, 0xad74, 0x0fe1, 0xad6b, 0xad71, 0x0fdf, 0xad76, + 0xb10e, 0x1062, 0x1061, 0xb110, 0xb10f, 0x10a7, 0xb238, 0xb239, + 0xb23a, 0x48da, 0xb237, 0xb23e, 0x490a, 0x1189, 0xb49c, 0xb52a, + 0xb53a, 0xb52b, 0xb528, 0xb6aa, 0xb70f, 0x121d, 0xb710, 0xb8e6, + 0x132a, 0xbd25, 0xbe8e, 0x13d3, 0x1442, 0x1443, 0xc18b, 0x1491, + 0xc18c, 0xc19a, 0x1490, 0x14bf, 0xc3b3, 0x14bc, 0xc3b2, 0x14c0, + 0x15c7, 0x15c5, 0x5655, 0xc744, 0x5652, 0x1835, 0x5b58, 0x5ca7, + 0x1a34, 0x1a01, 0x5c63, 0x1a0a, 0x0066, 0x5c6a, 0x5c65, 0x5c6b, + 0x00ad, 0x5eed, 0x5fd9, 0x613b, 0x6132, 0x1c58, 0x6135, 0x6131, + 0x613e, 0x6143, 0x6136, 0x626d, 0x011d, 0x62e4, 0x0131, 0x1d2b, + 0x63f4, 0x014c, 0x6469, 0x646b, 0x0195, 0x0191, + /* 0x2c */ + 0x0194, 0x66bf, 0x66c3, 0x66ae, 0x018f, 0x1eec, 0x66b1, 0x1f15, + 0x1efe, 0x66bb, 0x66af, 0x66b0, 0x1ee3, 0x1f16, 0x0240, 0x6aef, + 0x0241, 0x6aed, 0x21d3, 0x6af0, 0x6c93, 0x6d34, 0x6d2b, 0x2359, + 0x2427, 0x02d8, 0x02d2, 0x02da, 0x2428, 0x2410, 0x02d7, 0x240e, + 0x0342, 0x0357, 0x7004, 0x7003, 0x7002, 0x25af, 0x7005, 0x25ba, + 0x25b1, 0x7000, 0x7174, 0x0378, 0x0382, 0x0397, 0x7265, 0x7263, + 0x03c9, 0x73d7, 0x03c8, 0x03d6, 0x03cc, 0x73e8, 0x03d0, 0x73db, + 0x73d8, 0x03ce, 0x03c7, 0x26fc, 0x7409, 0x03cf, 0x03cb, 0x26f2, + 0x26fe, 0x73e5, 0x73e7, 0x27f8, 0x763f, 0x0447, 0x76c0, 0x0448, + 0x76b9, 0x76ba, 0x0483, 0x0485, 0x0484, 0x7820, 0x794f, 0x292c, + 0x04b8, 0x04bc, 0x7a91, 0x7a90, 0x7aee, 0x7af3, 0x7aec, 0x7af1, + 0x7aeb, 0x7af2, 0x7af4, 0x7aed, 0x7c41, 0x7c48, + /* 0x2d */ + 0x7c45, 0x0531, 0x0534, 0x0536, 0x2a82, 0x7c7f, 0x7c8b, 0x0523, + 0x7c3b, 0x7c4e, 0x053a, 0x2a91, 0x2a8f, 0x7c7c, 0x05b4, 0x05b5, + 0x05ed, 0x05ec, 0x05d8, 0x7ff0, 0x8036, 0x803f, 0x8043, 0x8031, + 0x8034, 0x8046, 0x05f6, 0x05e7, 0x802f, 0x82c3, 0x067c, 0x067b, + 0x8336, 0x0688, 0x2e47, 0x2e4c, 0x8321, 0xd1c8, 0x2e8a, 0x8473, + 0x06be, 0x84e6, 0x06e7, 0x06e5, 0x06ee, 0x30e1, 0x314a, 0x883f, + 0x0759, 0x075e, 0x886b, 0x075a, 0x313f, 0x0761, 0x0758, 0x075b, + 0x30bd, 0x8871, 0x075f, 0xd1e2, 0x082a, 0x082d, 0x8ab0, 0x0823, + 0x082b, 0x082c, 0x8bf3, 0x087e, 0xd1f5, 0x0893, 0x0899, 0x8d61, + 0x8d5f, 0x08b3, 0x08e7, 0x08ea, 0x8f28, 0x8f1e, 0x8f29, 0xd202, + 0x8eeb, 0x8f66, 0x09b4, 0x91f6, 0x37c9, 0x0a17, 0x9360, 0x9377, + 0x93bb, 0x0a21, 0x93bc, 0x0a38, 0x0a37, 0x0a74, + /* 0x2e */ + 0x0a73, 0x0a75, 0x95a2, 0x95b2, 0x959e, 0x0a76, 0x0a78, 0x973a, + 0x9738, 0x3aba, 0x0b0c, 0x0b20, 0x0b1e, 0x9a4d, 0x0b5b, 0x9a5e, + 0x0b5c, 0x9b17, 0x0b83, 0x3cc6, 0x0b80, 0x0b81, 0x0b7e, 0x0b88, + 0x0b85, 0x0b89, 0x0b7f, 0x0b8e, 0x9b64, 0x9b67, 0x0b84, 0x3cb7, + 0x3d8c, 0x9c59, 0x3d8d, 0x9cda, 0x0bee, 0x0bed, 0x0bfe, 0x9d51, + 0x0bff, 0x9d55, 0x9e3b, 0x9e34, 0x0c23, 0x9e37, 0x3e17, 0x9e31, + 0x3e1c, 0x0c1f, 0x9e3f, 0x9e59, 0x3e14, 0x9f61, 0x0c8f, 0x0c90, + 0xa058, 0xa062, 0xa050, 0x0ca0, 0xa051, 0x0ca6, 0x0c9f, 0xa046, + 0x0ca7, 0x0ca1, 0xa12d, 0x0d02, 0x0d36, 0xa348, 0xa351, 0xa34a, + 0xa34f, 0xa350, 0xa349, 0xa463, 0x0dc8, 0xa466, 0xa460, 0x0dd8, + 0x420c, 0x0ddd, 0x0ddc, 0xa4f1, 0x0dd7, 0xa507, 0x0dda, 0x0eba, + 0xa79b, 0xa7a3, 0xa79d, 0x0ebe, 0x0ec2, 0x0ebb, + /* 0x2f */ + 0x0ec0, 0xa7a9, 0xa7a7, 0xa7a4, 0x4423, 0xa7ba, 0x77c1, 0xa926, + 0x0f43, 0x0f55, 0xa994, 0xa993, 0x0f57, 0x0f68, 0x4598, 0x4590, + 0xab07, 0xab0d, 0xab02, 0xab0c, 0xab09, 0xab08, 0xab13, 0x0fa1, + 0xabd2, 0x463a, 0xac3e, 0xac3c, 0xad67, 0xad9e, 0x0fea, 0xadad, + 0x0fe7, 0xadd9, 0xad42, 0xada3, 0xada0, 0x0fe8, 0x0fe9, 0xad7c, + 0xb004, 0x1054, 0xb058, 0xb060, 0xb0c9, 0xb0c8, 0x4826, 0x1065, + 0xb11c, 0xb11a, 0x108a, 0xb274, 0x10b0, 0xb26e, 0xb26f, 0xb279, + 0x10bc, 0x492e, 0xb277, 0x4955, 0x491a, 0x10b8, 0x493d, 0xb27c, + 0x10b2, 0xb270, 0x4930, 0x10bd, 0xb27a, 0xb282, 0x118a, 0x4b51, + 0x11a1, 0xb544, 0x11a2, 0xb543, 0x4b88, 0xb545, 0x1215, 0xb725, + 0xb71f, 0x1220, 0x1273, 0xb8e8, 0x4d8e, 0x4d8d, 0xb909, 0xb9b7, + 0xb9b9, 0xba64, 0xba63, 0x4e09, 0x4e14, 0x12b1, + /* 0x30 */ + 0xba62, 0xba65, 0x132b, 0xbbac, 0x1345, 0xbd2a, 0x1397, 0x1398, + 0xbe96, 0x13d5, 0xbfc2, 0xd2de, 0x1493, 0x1496, 0x5207, 0x1494, + 0xc1aa, 0xc1b0, 0x14c7, 0x14c5, 0xc3d4, 0xc3cd, 0xc3d6, 0x14c4, + 0xc4f0, 0x5579, 0x5584, 0x15ce, 0x15ca, 0x15cc, 0x5657, 0x15c9, + 0x56ba, 0x59fd, 0xd04b, 0x5b62, 0x006e, 0x5cb7, 0x1a67, 0x5cac, + 0x5cab, 0x0071, 0x5cc1, 0x00bb, 0x00d3, 0x5fe8, 0x6169, 0x615d, + 0x615f, 0x00f3, 0x00ed, 0x00f5, 0x6164, 0x6162, 0x00f1, 0x00f2, + 0x00f6, 0x0120, 0x62f9, 0x0128, 0x62ee, 0x1d18, 0x1d2c, 0x1d59, + 0x63ab, 0x63ac, 0x63aa, 0x1d68, 0x1d7e, 0x6486, 0x647a, 0x1da1, + 0x6728, 0x01a1, 0x1f5b, 0x01aa, 0x01a9, 0x6731, 0x01b5, 0x01a5, + 0x01a8, 0x1f42, 0x01a7, 0x1f47, 0x672d, 0xd143, 0x1f3d, 0x672b, + 0x6732, 0x1f60, 0x21eb, 0x6b29, 0x6b26, 0x6b53, + /* 0x31 */ + 0x024d, 0x6b33, 0x6b34, 0x6c9d, 0x029c, 0x235f, 0x6d41, 0x02ea, + 0x02e5, 0x6e91, 0x6e69, 0x256f, 0x7022, 0x035e, 0x7034, 0xd16d, + 0x712e, 0x0386, 0x0384, 0x71f4, 0x265a, 0x7428, 0x03d9, 0x741c, + 0x03de, 0x7411, 0x7424, 0x7415, 0x03db, 0x7416, 0x7454, 0x7423, + 0x75ff, 0x0431, 0x76cf, 0x76d0, 0x044b, 0x76ce, 0x0449, 0x044a, + 0x044c, 0x77c7, 0x785c, 0x048a, 0x7836, 0x0489, 0x048b, 0x7843, + 0x04bb, 0x29a2, 0x299d, 0x04e4, 0x7b2a, 0x7b01, 0x29a3, 0x7b0b, + 0x7b0f, 0x053b, 0x052e, 0x053e, 0x0546, 0x0553, 0x7cdf, 0x0544, + 0x7cd2, 0x053f, 0x0542, 0x054f, 0x7ccd, 0x0552, 0x054a, 0x2ac2, + 0x7cdb, 0x055a, 0x2aa5, 0x0549, 0x7ccf, 0x2c1c, 0x7ec0, 0x2c1d, + 0x0603, 0x8081, 0x8082, 0x808a, 0x80a8, 0x808c, 0x2d95, 0x2d9a, + 0x0601, 0x0606, 0x05fb, 0x05f9, 0x808e, 0x0605, + /* 0x32 */ + 0x05fa, 0x808b, 0x2da6, 0x8096, 0x05fe, 0x80cc, 0x067d, 0x068c, + 0x834f, 0x834a, 0x2e50, 0x068e, 0x834b, 0x833d, 0x2e52, 0x8344, + 0x8349, 0x849e, 0x84f3, 0x2ec8, 0x84f5, 0x06f0, 0x06f2, 0x85b3, + 0x2f58, 0x06f1, 0x06e6, 0x85e5, 0x85b6, 0xd1d8, 0x3188, 0x8886, + 0x076f, 0x076d, 0x0769, 0x88b6, 0x8885, 0x076e, 0x88ab, 0x082f, + 0x0830, 0x0863, 0x8c0d, 0x8c8b, 0x8c8c, 0x33b8, 0x0880, 0x33b9, + 0x089a, 0x0894, 0x0896, 0x0895, 0x0897, 0x8d72, 0x08f4, 0x08fe, + 0x8f8f, 0x0901, 0x8f79, 0x0902, 0x8f77, 0x08f9, 0x8f90, 0x8f88, + 0x8f80, 0x8f9e, 0x08f6, 0x08f7, 0x8f82, 0x8f34, 0x8f89, 0x08ff, + 0x8f85, 0x8f7e, 0x8f7a, 0x8fa6, 0x360b, 0x8fb5, 0x91f4, 0x09bf, + 0x09bc, 0x3805, 0x9229, 0x9226, 0x922a, 0x09be, 0x09c0, 0x937e, + 0x0a3b, 0x0a39, 0x945b, 0x9461, 0x9460, 0x0a3c, + /* 0x33 */ + 0x959b, 0x3a14, 0x3a04, 0x95c3, 0x0a7d, 0x95cd, 0x0a7f, 0x0a7a, + 0x0a7c, 0x3a05, 0x0a7e, 0x3a15, 0x3a0d, 0x0a80, 0x0abf, 0x0ac3, + 0x9754, 0x9759, 0x0acc, 0x0b0e, 0x0b0d, 0x98f5, 0x0b26, 0x0b24, + 0x0b25, 0x0b23, 0x0b21, 0x0b29, 0x9a69, 0x9a65, 0x0b8f, 0x0b8d, + 0x9b7c, 0x0b8b, 0x0b92, 0x9b80, 0x0b90, 0x9c65, 0x0bef, 0x0bf0, + 0x9cdf, 0x9d60, 0x0c01, 0x9d5e, 0x0c2e, 0x0c2d, 0x3e2e, 0x0c28, + 0x0c29, 0x0c2c, 0x9e8f, 0x9e61, 0x9e5a, 0x3e41, 0x0c88, 0x9f67, + 0x0c92, 0x0c91, 0x3eea, 0x9fbb, 0x3f44, 0x0ca9, 0x0cac, 0x0cae, + 0x0caa, 0x0d06, 0x0d05, 0x0d4a, 0x0d3e, 0x0d3c, 0x0d3b, 0xa29b, + 0x0d42, 0x0d41, 0x0d43, 0xa2a9, 0x0d45, 0xa366, 0x0d9a, 0x0d9b, + 0x0d9f, 0x0d9e, 0xa472, 0xa476, 0xa514, 0x0dde, 0x0de2, 0x0de6, + 0xa50f, 0x4229, 0x0de3, 0x4227, 0x0ddf, 0xa641, + /* 0x34 */ + 0xa646, 0x439d, 0xa64b, 0xa643, 0x0e7e, 0x0ec9, 0x0ecc, 0xa7c6, + 0x0ed1, 0xa7c7, 0x0ed0, 0xa7ce, 0x0ecf, 0x0ec8, 0xa7c9, 0x0ecd, + 0xa7cb, 0xa7c5, 0x0f49, 0x0f47, 0x0f58, 0x0f6b, 0x0f6c, 0x0f6a, + 0xaa69, 0x0f80, 0x0f82, 0x0f84, 0x45c8, 0x0f83, 0xab1e, 0xabba, + 0x0fb6, 0xac52, 0xac51, 0xac53, 0xad9f, 0xaddb, 0x4726, 0x0ff1, + 0xade3, 0x0ff6, 0x0ff3, 0x0ff0, 0x471c, 0xadd7, 0xade9, 0x4728, + 0x0ff5, 0x0ff4, 0x0ff7, 0xadde, 0xaddc, 0xb03c, 0xd28b, 0x1055, + 0xb122, 0xb132, 0xb123, 0x108b, 0x10cb, 0x10c2, 0xb2d4, 0xb2c8, + 0xb2bc, 0x10ca, 0x10cc, 0xb2cd, 0x10c7, 0x10c9, 0x4970, 0xb2be, + 0x10c6, 0xb340, 0xb2d6, 0x10c3, 0x4982, 0xb2bd, 0x49ac, 0xb2ba, + 0x10c4, 0xb2c0, 0xd29b, 0xd29d, 0xb2c1, 0xb4a6, 0xb4a5, 0xb4a8, + 0x11a9, 0x4bad, 0x11a8, 0x11a6, 0xb55f, 0xb570, + /* 0x35 */ + 0xb56a, 0xb565, 0xb567, 0xb56f, 0xb587, 0x4bca, 0x4c51, 0xb73d, + 0xb743, 0x1222, 0xb740, 0x1226, 0x1224, 0x1225, 0x4c9d, 0x122a, + 0x1274, 0xb918, 0x1279, 0x4d90, 0x127a, 0xb919, 0xb9c1, 0x4dd8, + 0x4dd7, 0x1297, 0xb9bc, 0xb9c8, 0x4e2e, 0xba71, 0x12bc, 0xba6e, + 0x12b3, 0xba78, 0x12bf, 0x12b7, 0xd2cd, 0xba7a, 0xbbb1, 0xbbaf, + 0xbbb0, 0x1334, 0x1346, 0x1348, 0x4f59, 0xbca8, 0xbca6, 0x1356, + 0x1367, 0xbd48, 0xbd45, 0x1368, 0x1399, 0x139a, 0xbea0, 0xbea4, + 0x13d8, 0xbfd4, 0x13db, 0x13dc, 0x13dd, 0x13d7, 0xbfd2, 0xc022, + 0x1449, 0x144a, 0x50da, 0xc0b7, 0xc0cc, 0x5233, 0xc1e6, 0x5218, + 0x149a, 0xc1c8, 0x14cd, 0x14ca, 0xc3f4, 0x14cb, 0xc3ed, 0x14cf, + 0xc37e, 0xd2e3, 0x14cc, 0x14ea, 0x14ed, 0xc4f9, 0xc4fd, 0x14e9, + 0xc507, 0x151a, 0x53ef, 0x158d, 0x15d2, 0xc778, + /* 0x36 */ + 0xc77a, 0xc779, 0xc88a, 0x15f2, 0xc97b, 0xcad5, 0xcae9, 0x163d, + 0xcaeb, 0x163e, 0x16f8, 0x1723, 0x58d9, 0x18b4, 0x5b6c, 0x1aa0, + 0x1a90, 0x0075, 0x1a86, 0x1a84, 0x5cfa, 0x1a8a, 0x0076, 0x0073, + 0x1a9f, 0x1aa1, 0x5d18, 0x1a93, 0x00bd, 0x5ff6, 0x1bd5, 0x618a, + 0x6189, 0x00f9, 0x617f, 0x6188, 0x00fa, 0x6183, 0x6184, 0x6198, + 0x6163, 0x6187, 0x0121, 0xd127, 0x0129, 0x62f5, 0x6350, 0x0138, + 0x014e, 0x6487, 0x648a, 0x6565, 0x67b7, 0x67c1, 0x67c7, 0x01c8, + 0x01bc, 0x67c5, 0x67cb, 0x1f90, 0x67d1, 0x01bb, 0x01c2, 0x01c0, + 0x67b8, 0x67ca, 0x01ca, 0x67de, 0x01c9, 0x67ce, 0x01b8, 0x2110, + 0x2217, 0x6b68, 0x024e, 0x6b6b, 0x2244, 0x0250, 0x222b, 0x6b6a, + 0x2245, 0x6b66, 0x6b77, 0x6b96, 0x6b6e, 0xd156, 0x028a, 0x6d57, + 0x2365, 0x6d56, 0x6e9c, 0x6e9e, 0x02fc, 0x02f9, + /* 0x37 */ + 0x6ea1, 0x0363, 0x7042, 0x25cf, 0x7046, 0x703e, 0x7133, 0x0387, + 0x0388, 0x71fa, 0x039a, 0x7297, 0x729b, 0x72aa, 0x2756, 0x7473, + 0x747c, 0x03e9, 0x7486, 0x03ea, 0x2754, 0x0450, 0x76f3, 0x76f0, + 0x0456, 0x0452, 0x044f, 0x0454, 0x0451, 0x76ec, 0x78af, 0x048e, + 0x048f, 0x7864, 0x7868, 0x795a, 0x293d, 0x7b1f, 0x7b25, 0x04ed, + 0x04eb, 0x29a4, 0x7cc6, 0x7cd6, 0x7cc3, 0x0562, 0x7d2c, 0x055d, + 0x7d2e, 0x7d5e, 0x7d33, 0x0561, 0x0565, 0x055c, 0x7d2d, 0x7d46, + 0x055f, 0x7cc1, 0x7d3a, 0x7ecc, 0x809d, 0x8083, 0x80f6, 0x2dec, + 0x0616, 0x060a, 0x80f8, 0x060e, 0x0612, 0x80fe, 0x80f3, 0x0611, + 0x80eb, 0x80fa, 0x0610, 0x8107, 0x80fc, 0x0609, 0x2dfa, 0x0615, + 0x2dd4, 0x8372, 0x8373, 0x8374, 0x0691, 0x0695, 0x0693, 0x0692, + 0x068f, 0x835f, 0x8360, 0x84aa, 0x8534, 0x06f6, + /* 0x38 */ + 0x85b4, 0x06fb, 0x85f0, 0x2f75, 0x06f9, 0x860d, 0x85f3, 0x860f, + 0x301c, 0x077d, 0x88c9, 0x077a, 0x077f, 0x88c5, 0x0778, 0x88d7, + 0x88cc, 0x31d9, 0x88e7, 0x0770, 0x0782, 0x88c1, 0x0784, 0x88e8, + 0x0833, 0x8acb, 0x0832, 0x0836, 0x8ac8, 0x8b7a, 0x0856, 0x8b79, + 0x8b7e, 0x0867, 0x8c1b, 0x0865, 0x0864, 0x0866, 0x8c1f, 0x8c19, + 0x0881, 0x0882, 0x0883, 0x089e, 0x8d89, 0x33f1, 0x089d, 0x8d8b, + 0x090f, 0x0912, 0x9009, 0x8ffe, 0x9000, 0x0910, 0x0918, 0x900b, + 0x0914, 0x0919, 0x3637, 0x59fd, 0x904a, 0x367d, 0x3686, 0x09c8, + 0x09c4, 0x09c6, 0x9279, 0x09c7, 0x09c3, 0x926c, 0x9299, 0xd21b, + 0x9262, 0x9314, 0x0a19, 0x0a1c, 0x93c8, 0x93d7, 0x940c, 0x0a41, + 0x9470, 0x0a42, 0x0a43, 0x9471, 0x95df, 0x95e4, 0x0a82, 0x95e7, + 0x0a81, 0x0a94, 0x0a84, 0x9790, 0x0ad2, 0x0b0f, + /* 0x39 */ + 0x0b22, 0x994c, 0x0b27, 0x0b2a, 0x3bfa, 0x0b28, 0x994f, 0x0b60, + 0x9a7d, 0x9a7e, 0x9a7c, 0x3c72, 0x9a8d, 0x9b19, 0x0b9b, 0x0b9c, + 0x9bc0, 0x0b93, 0x0b94, 0x3cdc, 0x0ba0, 0x0b99, 0x9bb6, 0x0ba1, + 0x9ba8, 0x0bf1, 0x9ceb, 0x9ce7, 0x9d6f, 0x9ec7, 0x0c36, 0x9e9f, + 0x0c37, 0x0c3f, 0x0c3c, 0x9ec4, 0x0c34, 0x0c39, 0x0c3b, 0x0c35, + 0x0c30, 0x0c32, 0x0c38, 0x0c3e, 0x0c3a, 0x9e9b, 0x9e97, 0x9ec5, + 0x9f6b, 0x9fce, 0x0cb6, 0x3f67, 0xa0b1, 0xa0ae, 0xa0b0, 0x0cb3, + 0x0d09, 0x4077, 0xa23e, 0xa2b5, 0xa2ba, 0x0d4c, 0xa2b2, 0xa2b4, + 0x0d53, 0x0d4d, 0x0d51, 0x0d4f, 0x419b, 0xa377, 0x0da2, 0xa386, + 0xa37b, 0x0dcd, 0xa47e, 0xa52e, 0x0de7, 0xa52f, 0x0df0, 0xa537, + 0x0de9, 0x0dec, 0xa532, 0x0de8, 0x0dee, 0x0e02, 0xa536, 0xa539, + 0xa535, 0xa65c, 0x0e82, 0x0e83, 0x0e86, 0xa67b, + /* 0x3a */ + 0xa661, 0xa7ee, 0xa7eb, 0xa7ef, 0xa820, 0x442a, 0x4465, 0x0f4a, + 0xa930, 0x0f5a, 0x4564, 0xa9be, 0x0f6e, 0xaa67, 0xaa7c, 0x0f70, + 0x0f6f, 0xab24, 0x0f8a, 0x0f87, 0x0f88, 0xab29, 0xabef, 0x4620, + 0x0fb7, 0x0ffd, 0x4720, 0xae0d, 0x1005, 0x473c, 0x1008, 0x1003, + 0x1002, 0x1004, 0x0739, 0x1009, 0x0fff, 0xae64, 0x473f, 0xae15, + 0x0ffc, 0x1001, 0x100a, 0x47f0, 0x47f5, 0x106b, 0x106c, 0xb135, + 0xb136, 0xb134, 0xb137, 0xb347, 0xb32b, 0x10de, 0xb341, 0xb343, + 0x10db, 0xb342, 0x10dd, 0x10e3, 0xb332, 0x10e0, 0x10d9, 0x10d8, + 0x10e4, 0xb344, 0xb34a, 0x10da, 0x10ef, 0xd2a0, 0x4a15, 0x49be, + 0xb354, 0xb36e, 0xb352, 0x10d7, 0x11b3, 0x11bb, 0x4be5, 0x11b2, + 0x4bd2, 0x11ad, 0xb592, 0x11af, 0xd2b8, 0x4be0, 0xb5bf, 0x1216, + 0x1228, 0x1223, 0x4cb3, 0xb741, 0xb769, 0xb765, + /* 0x3b */ + 0x1275, 0x127e, 0x127c, 0xb922, 0xb91d, 0xb9d2, 0xb9da, 0xb9db, + 0x12ce, 0x12cd, 0x12cf, 0x4e53, 0xbaa4, 0xba9e, 0x4e37, 0x4e47, + 0x4e5c, 0xba9d, 0x12c4, 0x12cc, 0x12c8, 0x12c7, 0xbaad, 0xbaa6, + 0xbaa7, 0xbbb3, 0xbbe0, 0xbc35, 0xbc37, 0x135a, 0x136a, 0xbd4a, + 0x136b, 0x136d, 0x136f, 0xbe5e, 0x139e, 0xbec0, 0x13a4, 0x13a3, + 0x13e4, 0x13e8, 0x13e9, 0x13e0, 0x13e3, 0xbff9, 0x13ea, 0x13e1, + 0x13ed, 0x1434, 0x1435, 0x1451, 0x50f0, 0xc1f0, 0x149d, 0xc1f3, + 0xc21b, 0xc1f2, 0xc1fb, 0xc41c, 0xc413, 0x14d0, 0xc40f, 0x14ee, + 0xc516, 0xc511, 0xc512, 0x14f2, 0xc50e, 0x541d, 0x1588, 0xc667, + 0xc6f2, 0xc6da, 0x158f, 0xc6dc, 0x15d8, 0xc894, 0xc89b, 0xc892, + 0xc89a, 0xc988, 0xc986, 0x163f, 0xcaef, 0x1652, 0x576b, 0xcb5e, + 0x1650, 0xcc58, 0x16b1, 0xcc56, 0xcc54, 0x16f9, + /* 0x3c */ + 0xcd9b, 0xce96, 0xcea4, 0x1726, 0x1728, 0xce9a, 0xcf12, 0x0080, + 0x1ac0, 0x0081, 0x5d6b, 0x007e, 0x007f, 0x5d37, 0x5d3c, 0xd10a, + 0x5ef7, 0x00be, 0x5f66, 0x00d6, 0x61a9, 0x61ae, 0x61ad, 0x61c8, + 0x61a5, 0x61b0, 0x6295, 0x1ce5, 0x6325, 0x0134, 0x6499, 0x1daf, + 0x6574, 0x6570, 0x656f, 0x6841, 0x6854, 0x01d5, 0x01d8, 0x6840, + 0x6838, 0x01d4, 0x1fd8, 0x01d9, 0x6852, 0x683a, 0x6857, 0xd14a, + 0x6859, 0x2111, 0x2267, 0x6bb4, 0x6bc0, 0x025d, 0x2243, 0x025e, + 0x0259, 0x6b75, 0x025a, 0x02a0, 0x6d60, 0x6d47, 0x0305, 0x6ef0, + 0x0307, 0x6eef, 0x030e, 0x030c, 0x6eec, 0x6f83, 0x0345, 0x6f84, + 0x6f8f, 0x0364, 0x7061, 0x0365, 0x7069, 0x25dd, 0x0366, 0x7062, + 0x0389, 0x03ec, 0x03f1, 0x2770, 0x276a, 0x03f0, 0x03f8, 0x2774, + 0x275f, 0x74ae, 0x2761, 0x2773, 0x74b2, 0x03f2, + /* 0x3d */ + 0x03f4, 0x770b, 0x0458, 0x7710, 0x770d, 0x045a, 0x0459, 0x0457, + 0x045b, 0x2850, 0x787f, 0x7881, 0x04a6, 0x04c2, 0x04c1, 0x293f, + 0x7a0b, 0x7b4e, 0x04ef, 0x29b0, 0x7dea, 0x7d45, 0x0568, 0x2b35, + 0x2b2d, 0x0573, 0x056e, 0x0574, 0x2b02, 0x0566, 0x7d28, 0x7d5d, + 0x7edc, 0x05b9, 0x2c26, 0x7ed4, 0x060c, 0x8164, 0x8168, 0x0620, + 0x8162, 0x061d, 0x8161, 0x061c, 0x8166, 0x0621, 0x061a, 0x0619, + 0x80f2, 0x8169, 0x8167, 0x067e, 0x839a, 0x839b, 0x8385, 0x839c, + 0x069d, 0x83a4, 0x069e, 0x069c, 0x2e6e, 0x8399, 0x8386, 0x8390, + 0x8481, 0x84ae, 0x2eb1, 0x2ed4, 0x06cd, 0x8538, 0x070b, 0x070a, + 0x2f85, 0x893b, 0x078f, 0x3272, 0x0795, 0x0790, 0x0791, 0x894c, + 0x323a, 0x07b9, 0x8947, 0x8935, 0x0797, 0x079e, 0x8933, 0x078b, + 0x8982, 0x8940, 0x083b, 0x083a, 0x083c, 0x083d, + /* 0x3e */ + 0x0839, 0x083e, 0x086b, 0x086c, 0x8c36, 0x8d0e, 0x08a2, 0x08a1, + 0x089f, 0x8dad, 0x8daa, 0x9017, 0x092d, 0x9067, 0x0936, 0x092b, + 0x9072, 0x0937, 0xd20a, 0x9061, 0x90b0, 0x36ad, 0x0925, 0x092f, + 0x092c, 0x906e, 0x9064, 0x0932, 0x908c, 0x9066, 0x3695, 0x906b, + 0x905f, 0x9074, 0x9065, 0x92bb, 0x92be, 0x09d5, 0x92b9, 0x09d4, + 0x09d6, 0x92ef, 0x09d1, 0x3943, 0x93da, 0x0a46, 0x398f, 0x9490, + 0x95e9, 0x0a8c, 0x0a8a, 0x0a88, 0x9611, 0x960d, 0x95ed, 0x9621, + 0x0add, 0x9781, 0x97b1, 0x9901, 0x0b2d, 0x995e, 0x9962, 0x0b2e, + 0x0b2c, 0x0b2b, 0x0b30, 0x995b, 0x0b4e, 0x9a96, 0x9a93, 0x0b64, + 0x0b61, 0x9a92, 0x3c75, 0xd239, 0x0b70, 0x0ba6, 0x0ba4, 0x9bc4, + 0x9bc7, 0x9bc3, 0x0ba8, 0x0ba2, 0x9bc8, 0x0ba7, 0x3cec, 0x0ba5, + 0x9bca, 0x0ba9, 0x9bc5, 0x9bcf, 0x9bdc, 0x9c7c, + /* 0x3f */ + 0x9d01, 0x0c3d, 0x9ed3, 0x9edc, 0x0c44, 0x0c45, 0x0c46, 0x9ed4, + 0x3e57, 0x9ecc, 0x0c47, 0x0c48, 0x0c42, 0x9ed6, 0x9edb, 0x0c41, + 0x9ed5, 0x9fd9, 0x0c94, 0x9fdd, 0x9fdc, 0x9fe0, 0xa0cc, 0x0cc0, + 0x0cb8, 0x0cc1, 0x0cc2, 0x0cbb, 0x0cbd, 0x0cbf, 0x0cb9, 0x0cb7, + 0xa0d2, 0x0cc7, 0xa0d3, 0x0d0c, 0x0d0b, 0x407b, 0x0d10, 0xa18d, + 0x0d5d, 0x4121, 0x0d5a, 0x0d58, 0x0d56, 0xa2d8, 0x0d54, 0x4116, + 0xa2bc, 0x0da8, 0x0da7, 0x0dcf, 0x0dd0, 0xa48a, 0x41e8, 0xa48b, + 0xa48d, 0x0dd1, 0x0deb, 0xa553, 0x0dfb, 0x426a, 0xa559, 0x0dfd, + 0x0df8, 0x0df7, 0x0e00, 0xa556, 0xa557, 0x0df6, 0x425f, 0xa673, + 0xa81b, 0x0edf, 0xa821, 0xa816, 0xa818, 0x0ee2, 0x0ee4, 0xa844, + 0x4482, 0xa826, 0x0ee3, 0xa936, 0x0f59, 0x0f71, 0x0f8e, 0x0f8c, + 0xab3a, 0x0fa4, 0xabf4, 0x4655, 0x1014, 0xae62, +}; + +static const ucs4_t cns11643_4a_2uni_upages[212] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05200, 0x05300, 0x05400, 0x05500, + 0x05600, 0x05700, 0x05800, 0x05900, 0x05a00, 0x05b00, 0x05c00, 0x05d00, + 0x05e00, 0x05f00, 0x06000, 0x06100, 0x06200, 0x06300, 0x06500, 0x06600, + 0x06700, 0x06800, 0x06900, 0x06b00, 0x06c00, 0x06d00, 0x06e00, 0x07000, + 0x07100, 0x07200, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, + 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07f00, 0x08000, 0x08100, + 0x08200, 0x08300, 0x08400, 0x08600, 0x08800, 0x08900, 0x08a00, 0x08c00, + 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, 0x09500, 0x09600, 0x09700, + 0x09a00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, 0x20500, + 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, 0x20d00, + 0x20e00, 0x21100, 0x21200, 0x21300, 0x21500, 0x21600, 0x21700, 0x21900, + 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, + 0x22200, 0x22300, 0x22400, 0x22500, 0x22600, 0x22700, 0x22900, 0x22a00, + 0x22b00, 0x22c00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, + 0x23400, 0x23500, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, + 0x23e00, 0x24100, 0x24200, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, + 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24f00, 0x25000, 0x25100, 0x25300, + 0x25400, 0x25600, 0x25700, 0x25900, 0x25a00, 0x25b00, 0x25e00, 0x25f00, + 0x26000, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, + 0x26900, 0x26a00, 0x26b00, 0x26c00, 0x27100, 0x27200, 0x27500, 0x27600, + 0x27700, 0x27800, 0x27900, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, + 0x28200, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28c00, 0x28e00, + 0x28f00, 0x29000, 0x29100, 0x29200, 0x29400, 0x29500, 0x29600, 0x29a00, + 0x29d00, 0x2f800, 0x2f900, 0x2fa00, +}; + diff --git a/Externals/libiconv-1.14/lib/cns11643_4b.h b/Externals/libiconv-1.14/lib/cns11643_4b.h new file mode 100644 index 0000000000..6a9823e1aa --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_4b.h @@ -0,0 +1,668 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 4 part b + */ + +static const unsigned short cns11643_4b_2uni_page40[4384] = { + /* 0x40 */ + 0xb65b, 0xb66a, 0x1011, 0xb668, 0x101b, 0x1012, 0x100e, 0x1015, + 0x3f68, 0x1010, 0xb681, 0x1017, 0x4046, 0x4043, 0x1070, 0x10ed, + 0xbae7, 0x10ee, 0xbae6, 0xbad1, 0xbb11, 0x4181, 0xbad0, 0xbad9, + 0xbb0a, 0x10f4, 0xbada, 0xbadd, 0xbac8, 0xbae2, 0xbae9, 0xbacb, + 0x417c, 0xbacc, 0xbac1, 0x416a, 0xbade, 0x4188, 0x10f2, 0x10f8, + 0x10f3, 0xbb51, 0xbb12, 0x10fa, 0xbae0, 0xbb2b, 0xf6b4, 0xc0d8, + 0xc0d1, 0x4410, 0xc0d2, 0xc0cd, 0x441f, 0x11b6, 0x11b7, 0xc13d, + 0x440f, 0xc0ca, 0x11ba, 0xc0cb, 0x11bc, 0xc0d7, 0xc3f4, 0x123b, + 0x45d3, 0x122f, 0xc487, 0xc48b, 0xc483, 0x1237, 0x1299, 0xc7c5, + 0xc7d2, 0xc7c6, 0xc7d3, 0x12d9, 0x12d8, 0x12d7, 0xc7f0, 0xc7cd, + 0xc7cc, 0xc7dc, 0xc7d6, 0x1336, 0xc9e6, 0xca41, 0xca3f, 0x4987, + 0xcac5, 0xcac0, 0xcac6, 0xcabe, 0xcabf, 0x49c6, + /* 0x41 */ + 0x1370, 0xcb63, 0xccd3, 0xccda, 0xccd5, 0x13a5, 0x13a6, 0x13a9, + 0x13ee, 0x1454, 0xd0ee, 0x1457, 0xd0fc, 0xd214, 0x14a1, 0xd323, + 0xd322, 0xd330, 0xd4b5, 0x14d3, 0xd538, 0x14d4, 0xd53f, 0x14d7, + 0x4dcc, 0x4e6d, 0x4e70, 0x14f7, 0x14f6, 0x14f9, 0x14f8, 0x4f58, + 0x4f42, 0x4f68, 0x4f69, 0xd768, 0xd767, 0x4f43, 0xd765, 0x4f47, + 0x158a, 0xda75, 0xdaf7, 0xdaf3, 0xdaf6, 0x1594, 0xdb00, 0x1593, + 0xdaff, 0xdaf5, 0x529d, 0x15dd, 0x15dc, 0x15f7, 0x53cf, 0xde92, + 0xe006, 0x1642, 0xe007, 0xe06b, 0x1654, 0xe06c, 0x1655, 0xe193, + 0x168f, 0xe194, 0x54f4, 0x16b4, 0x16b3, 0xe262, 0xe263, 0x5509, + 0xe25f, 0xe264, 0xe25b, 0xe259, 0x16fb, 0x16fd, 0xe3a4, 0xe3ac, + 0x55ab, 0x16fc, 0xe4b5, 0x172c, 0x172f, 0xe4ae, 0x172b, 0xe4c5, + 0x1733, 0x1734, 0x55fb, 0xe63b, 0x57ac, 0x57ae, + /* 0x42 */ + 0x57aa, 0x17e8, 0xe8bf, 0xea2b, 0xea84, 0xea80, 0xeb4d, 0xeb4f, + 0x585c, 0xeb4c, 0xed92, 0x195d, 0x1ad2, 0x0085, 0x0088, 0x5fae, + 0x5f79, 0x008e, 0x0084, 0x5f71, 0x1adf, 0x5fb3, 0x0083, 0x5f2c, + 0x5f77, 0x612f, 0x63c3, 0x0102, 0x63cd, 0x0106, 0x0105, 0x63c9, + 0x00fe, 0x0101, 0x0100, 0x63ce, 0x64a5, 0x64a0, 0x64fe, 0x6559, + 0x669a, 0x01e7, 0x1e19, 0x68e4, 0x68d7, 0x68dc, 0x01e6, 0x68e7, + 0x01ed, 0x01e2, 0x01eb, 0x68e5, 0x01e8, 0x01ec, 0x1e0a, 0x0224, + 0x1f9a, 0x6e14, 0x0262, 0x6df1, 0x0261, 0x0260, 0x0264, 0x028b, + 0x6fb6, 0x706e, 0x706c, 0x7081, 0x7142, 0x0319, 0x0316, 0x0318, + 0x0322, 0x711a, 0x031d, 0x0317, 0x031e, 0x7127, 0x7125, 0x7117, + 0x711c, 0x713d, 0x7120, 0x0369, 0x036a, 0x7381, 0x036c, 0x037a, + 0x038a, 0x7509, 0x75c6, 0x75c4, 0x039c, 0x75c5, + /* 0x43 */ + 0x03fd, 0x03f9, 0x76ef, 0x03ff, 0x76df, 0x76de, 0x76ee, 0x76f5, + 0x76ec, 0x03fc, 0x76dd, 0x2385, 0x03fb, 0x0402, 0x045f, 0x2456, + 0x045e, 0x045d, 0x045c, 0x7822, 0x2451, 0x0492, 0x7997, 0x7995, + 0x0494, 0x0495, 0x04d1, 0x7ba9, 0x04f1, 0x7c53, 0x25b1, 0x7c56, + 0x7c55, 0x0577, 0x056f, 0x7de3, 0x7de2, 0x0587, 0x057d, 0x057c, + 0x057e, 0x0585, 0x058b, 0x0586, 0x0580, 0x5dfd, 0x7da9, 0x0578, + 0xf5ab, 0x7e33, 0x7e0a, 0x05ba, 0x8059, 0x0633, 0x81bc, 0x062d, + 0x81c4, 0x81c7, 0x81c6, 0x0637, 0x275a, 0x2763, 0x81b8, 0x81da, + 0x062e, 0x81b7, 0x81c0, 0x063d, 0x81cd, 0x06a0, 0x84bc, 0x84ab, + 0x06a3, 0x8586, 0x299b, 0x875a, 0x29a3, 0x070e, 0x299e, 0x8843, + 0x07b6, 0x89ac, 0x07ab, 0x07ad, 0x07a6, 0x89be, 0x2ab8, 0x07aa, + 0x2aba, 0x07b1, 0x89ab, 0x07a8, 0x07af, 0x07b0, + /* 0x44 */ + 0x07a7, 0x07b2, 0x079d, 0x07a5, 0x07b5, 0x743e, 0x2ac7, 0x2ad7, + 0x8cf9, 0x0841, 0x8cf3, 0x8cf7, 0x2c70, 0x8e45, 0x8e48, 0x0872, + 0x2c9d, 0x086f, 0x0871, 0x8e44, 0x0885, 0x8eaf, 0x8eb1, 0x08a4, + 0x08a5, 0x08a6, 0x8fcf, 0x08a8, 0x8fcb, 0x8fcd, 0x08a3, 0x9050, + 0x91ec, 0x921a, 0x2d16, 0x2d24, 0x91d8, 0x0943, 0x91d0, 0x91d1, + 0x093d, 0x0945, 0x917b, 0x91d2, 0x0944, 0x91d4, 0x91e7, 0x91df, + 0x91de, 0x2d45, 0x91d9, 0x91cf, 0x950d, 0x09e3, 0x2f79, 0x5dfd, + 0x09df, 0x09e4, 0x2f7a, 0x09e5, 0x9538, 0x3054, 0x0a22, 0x0a4a, + 0x98a9, 0x0a49, 0x0a44, 0x0a4b, 0x0a87, 0x0a89, 0x0a92, 0x0a91, + 0x0a90, 0x0a8e, 0x993e, 0x9946, 0x9aed, 0xf630, 0x0b12, 0x0b10, + 0x0b11, 0x9c6c, 0x0b32, 0x0b34, 0x0b37, 0x0b33, 0x0b36, 0x0b35, + 0x0b65, 0x9dac, 0x337c, 0x337b, 0x9ec9, 0x3412, + /* 0x45 */ + 0x0bb0, 0x9f12, 0x0baf, 0x0baa, 0x9efd, 0x9f01, 0x9f11, 0x0bab, + 0x9f89, 0x9f05, 0x9efe, 0x9f0b, 0x9f20, 0x9f04, 0xa088, 0x0bf3, + 0xa102, 0x0bf4, 0xa103, 0x34b6, 0x34e0, 0x0c08, 0x0c4e, 0x0c55, + 0x0c4b, 0xa229, 0xa23b, 0x0c4d, 0x3573, 0xa206, 0x0c52, 0x3572, + 0x0c4c, 0x3570, 0x0c50, 0x0c53, 0xa203, 0x0c51, 0xa378, 0xa379, + 0xa37d, 0x0c89, 0xa37f, 0x0c95, 0x0ccc, 0x0cc8, 0x0cce, 0xa432, + 0x0cca, 0xa400, 0x369d, 0xa422, 0x0ccd, 0xa5a9, 0x0d5c, 0x0d67, + 0x0d69, 0x0d65, 0x0d62, 0xa704, 0x3827, 0x3835, 0xf659, 0x0daa, + 0xa8b8, 0xa99b, 0x0dd2, 0x39a2, 0x0e03, 0x0e0c, 0xaa92, 0x0e09, + 0x0e06, 0x0e05, 0x3989, 0xaa8f, 0x0e0b, 0x0e08, 0xaa98, 0x39a5, + 0xaaae, 0x0e8e, 0xad9d, 0x3ab6, 0x0ee8, 0xaf49, 0xaf50, 0xaf46, + 0x0eea, 0xaf4e, 0x3ba5, 0x3bc3, 0xaf55, 0x0ee9, + /* 0x46 */ + 0x0eeb, 0xaf64, 0x0ef0, 0xb138, 0x0f4b, 0x3dab, 0x0f73, 0x0f75, + 0x0f92, 0x0f91, 0x0f93, 0x3e25, 0x0fa7, 0x0fa6, 0x0fa8, 0x0faa, + 0xb3fe, 0x0fa9, 0x3e59, 0x0fbb, 0x0fbc, 0x0fba, 0x0fbd, 0x1027, + 0x3f85, 0xb6a6, 0x1024, 0x101e, 0x101f, 0x101d, 0x1020, 0x1023, + 0x1029, 0x1022, 0xb69c, 0xb699, 0x101c, 0x3f8e, 0x1028, 0xb6b5, + 0xb6a3, 0xb6a0, 0xb6a7, 0xb69b, 0xb8df, 0xb8e1, 0x1071, 0x1073, + 0x1072, 0xb94d, 0x1102, 0xbbf3, 0xbb6f, 0xbb69, 0x10fe, 0x41be, + 0xbb6b, 0xbb78, 0xbb87, 0x1108, 0xbb85, 0xbb82, 0xbb90, 0x1107, + 0x1104, 0xbb80, 0xbb67, 0x1100, 0x10fc, 0xbb61, 0x1144, 0xbb93, + 0x10f1, 0xbbf2, 0xbb86, 0x41a6, 0x1106, 0xbfcd, 0xbfc4, 0x11c6, + 0x11c3, 0x11c1, 0x11c2, 0xc10f, 0x11c4, 0x11c7, 0xc10d, 0x11bf, + 0x11d2, 0xc173, 0x11ca, 0xf6ba, 0xc10a, 0x442f, + /* 0x47 */ + 0xc108, 0xc113, 0x1213, 0xc3f8, 0x1230, 0x123e, 0x1239, 0xc4ab, + 0xc4a8, 0x123c, 0x123f, 0xc4a5, 0x1234, 0x123d, 0xc4c3, 0xc4a4, + 0x1238, 0xc4d4, 0xc4ba, 0xc5f1, 0x46a0, 0x1282, 0xc63f, 0x1283, + 0xc6ea, 0x129b, 0xc7f7, 0x12e0, 0x12dd, 0xc7fa, 0xc7f5, 0x12de, + 0xc7fe, 0x12e3, 0x12e5, 0xc800, 0x4797, 0x12e2, 0xc802, 0xc7fb, + 0xc807, 0x12df, 0xc81a, 0x132e, 0xc9b8, 0x1337, 0x1338, 0xc9e9, + 0xc9eb, 0xca50, 0xca4f, 0x498b, 0xcb86, 0x0162, 0xcb8e, 0x1394, + 0x1393, 0x13ab, 0x13ad, 0xccf0, 0xccfb, 0x13f5, 0x13f7, 0xce42, + 0x13f6, 0x13f8, 0xce85, 0x13fb, 0x13f9, 0x1458, 0x145a, 0xd105, + 0x1459, 0x4c0f, 0x1485, 0x14a4, 0x14d8, 0x14d9, 0xd54b, 0x14dd, + 0x14c8, 0xd563, 0x14fa, 0x14fb, 0x4f75, 0x1527, 0x4f9f, 0x152a, + 0x1525, 0xd799, 0x1528, 0xda81, 0xdb17, 0xdb10, + /* 0x48 */ + 0xdb12, 0x52a6, 0x1595, 0x539a, 0xdcfa, 0xdcf3, 0xdcf2, 0xdcf5, + 0xdcf6, 0xddbb, 0xddc2, 0xdea7, 0x160f, 0x1611, 0xdea8, 0xdea3, + 0x1610, 0xdeaa, 0x1615, 0x1613, 0x5457, 0xdfdc, 0x1647, 0x1646, + 0xe00f, 0x1659, 0x165b, 0xe079, 0x165e, 0xe07f, 0xe085, 0x165a, + 0x1691, 0x1692, 0x1690, 0x1693, 0xe21b, 0x54f7, 0x16be, 0xe277, + 0xe276, 0xe298, 0x16bc, 0x16bb, 0x16b7, 0x16b9, 0xe27a, 0x1701, + 0x16fe, 0xe3bc, 0xe3ba, 0x1702, 0xe3b6, 0x16ff, 0x55b0, 0xe3b4, + 0x1700, 0xe4cf, 0x1737, 0x173a, 0x176f, 0x1777, 0x1779, 0x56c6, + 0xe67b, 0x17c8, 0xe81c, 0xe821, 0xe81d, 0xe8c0, 0x17f2, 0xe8ff, + 0x17f1, 0x17f0, 0x5862, 0xeb56, 0x1834, 0xeda1, 0xeda2, 0xeda6, + 0xf056, 0xf057, 0x192c, 0x192d, 0xf101, 0xf1ed, 0xf71c, 0xf3f2, + 0x1afa, 0x5fb8, 0x0091, 0x5fc0, 0x0094, 0x5fb7, + /* 0x49 */ + 0x5fe1, 0x00c4, 0x010a, 0x63e8, 0x1c85, 0x64b2, 0x0152, 0x66ae, + 0x0159, 0x026f, 0x697e, 0x01f2, 0x01f4, 0x1e43, 0x6976, 0x01f1, + 0x1e3c, 0x6996, 0x026a, 0x6e20, 0x6e21, 0x6e23, 0x6e29, 0x7077, + 0x7151, 0x0324, 0x7156, 0x0323, 0x7188, 0x7159, 0x7155, 0x0327, + 0x7297, 0x7298, 0x036d, 0x21ed, 0x036e, 0x036f, 0x73a1, 0x73a3, + 0x2235, 0x039f, 0x040a, 0x0406, 0x040e, 0x770a, 0x040d, 0x0405, + 0x773d, 0x770c, 0x040b, 0x0410, 0x042e, 0x783d, 0x7839, 0x79b0, + 0x79b2, 0x79ae, 0x0496, 0x0497, 0x04c4, 0x2547, 0x04c5, 0x7b20, + 0x04d2, 0x7c6e, 0x7c6d, 0x7c6a, 0x0581, 0x7e32, 0x058e, 0x0590, + 0x058f, 0x7e39, 0x0591, 0x0595, 0x0593, 0x7da3, 0x266d, 0x7e7f, + 0x7e35, 0x7e3d, 0x7ff4, 0x7ff5, 0x063b, 0x0648, 0x8248, 0x8228, + 0x0646, 0x0647, 0x8227, 0x8232, 0x822c, 0x064c, + /* 0x4a */ + 0x822e, 0x064a, 0x0650, 0x0643, 0x8223, 0x8231, 0xf5c5, 0x0649, + 0x06a6, 0x06a5, 0x06a4, 0x84c9, 0x8589, 0x06b9, 0x85bb, 0x06ce, + 0x06cf, 0x0713, 0x8897, 0x8893, 0x8a28, 0x07c6, 0x07c5, 0x07ca, + 0x07d9, 0x07c1, 0x8a18, 0x8a3b, 0x2af5, 0x8a27, 0x8a24, 0x8a1b, + 0x8a31, 0x07cb, 0x8a26, 0x8aa3, 0x8a3f, 0x8a22, 0x8a19, 0x2b03, + 0x8a41, 0x8a2b, 0x2b65, 0x0842, 0x8d0c, 0x2c75, 0x0874, 0x0873, + 0x8e4e, 0x8eb9, 0x8efa, 0x8fe9, 0x8fe8, 0x8fe4, 0x2d8a, 0x2d56, + 0x0952, 0x925f, 0x925d, 0x9252, 0x0950, 0x9274, 0x094b, 0x9246, + 0x094c, 0x096d, 0x92aa, 0x2d98, 0x924a, 0x9259, 0x924b, 0x094f, + 0x2d68, 0x09f0, 0x9550, 0x3034, 0x3045, 0x0a4d, 0x0a4c, 0x98d0, + 0x0a4f, 0x0a4e, 0x0a50, 0x98cc, 0x315c, 0x0a96, 0x3156, 0x9964, + 0x9965, 0x0a97, 0x0a95, 0x0a98, 0x995c, 0x9b15, + /* 0x4b */ + 0x0aec, 0x0aeb, 0x0b13, 0x0b14, 0x0b38, 0x0b3a, 0x0b39, 0x9c79, + 0x0b68, 0x0b67, 0x9dc5, 0x9db8, 0x9f2c, 0x0bbe, 0x0bbc, 0x9f37, + 0x9f35, 0x9f31, 0x0bbb, 0x9f2f, 0x0bba, 0x9f2b, 0x0bb9, 0x0bb7, + 0x9f2d, 0x9f2a, 0x0bc1, 0xa095, 0x0bf7, 0xa23e, 0x0c60, 0xa247, + 0xa245, 0x0c59, 0x0c5c, 0x0c5a, 0x0c58, 0xa252, 0x0c5b, 0xa270, + 0xa250, 0xa258, 0xa251, 0xa23d, 0x0c5d, 0xa241, 0xa20c, 0xa23c, + 0xa386, 0xa383, 0xa389, 0xa3f3, 0x0cd4, 0x0cd3, 0x36bf, 0x0cd2, + 0x36bd, 0xa42d, 0x0cd7, 0x0cd1, 0x36e4, 0x0cd5, 0xa5c5, 0xf655, + 0x0d6d, 0x0d6f, 0x3834, 0x0d75, 0x0d6c, 0x0d74, 0xa743, 0x0d73, + 0xa737, 0xa745, 0x3836, 0x0dac, 0xa8e5, 0xa9a6, 0xaadb, 0x0e10, + 0xaada, 0xaae6, 0x39ba, 0x39bc, 0x0e0f, 0x39c8, 0x0e23, 0x39c3, + 0x0e1d, 0x39b6, 0x0e0e, 0xaaf8, 0xaae9, 0x0e15, + /* 0x4c */ + 0x39c2, 0x0e13, 0xaae8, 0xaaf6, 0x0e1b, 0x39c5, 0x0e22, 0x0e26, + 0xaae7, 0x39bd, 0x39b0, 0x0e21, 0x0e1c, 0x0e17, 0xaad5, 0x0e1a, + 0x39bb, 0xadd3, 0xadc7, 0xadd1, 0x0e99, 0xadc3, 0x0e97, 0xaf80, + 0xaf98, 0x0efd, 0xaf84, 0x0ef6, 0x0efe, 0x0ef5, 0x0eff, 0x0ef7, + 0xaf97, 0xaf83, 0xaf81, 0x0f01, 0x3c04, 0xaf8c, 0xb142, 0xb2ab, + 0x0f77, 0xb2a3, 0xb2a6, 0xb35c, 0xb369, 0xb367, 0x0fab, 0xb48b, + 0xb4a8, 0x0fc0, 0xb6d8, 0x1031, 0x102e, 0xf689, 0xb6dc, 0x102c, + 0xb6e0, 0xb6e5, 0x1032, 0x102f, 0x102b, 0x102d, 0x1033, 0xb818, + 0xb819, 0x3ff1, 0x1057, 0x105c, 0x107b, 0xb95f, 0xb95e, 0x107a, + 0xbc02, 0x4222, 0x1113, 0x111e, 0x1117, 0x1120, 0x112a, 0x1111, + 0x1115, 0x110f, 0x1118, 0x4238, 0xbc12, 0xbc36, 0x112c, 0x4232, + 0xf6a8, 0x4210, 0xbc23, 0xbc03, 0x111c, 0xbc00, + /* 0x4d */ + 0x1129, 0xbc46, 0xbc61, 0x1112, 0x424f, 0x1197, 0xc184, 0x4472, + 0xc16b, 0xc162, 0xc156, 0xc16a, 0xc152, 0xc155, 0x11d4, 0x11d0, + 0x447c, 0xc161, 0xf6bb, 0xc158, 0xc177, 0x11d3, 0x1214, 0xc4d7, + 0x1246, 0x1245, 0xc4de, 0x1243, 0xc4df, 0x460d, 0x1244, 0x1248, + 0xc4d1, 0x1247, 0xc4e2, 0xc4e1, 0xc4dd, 0x4608, 0x1249, 0x1285, + 0xc64b, 0x1284, 0xc64e, 0x129d, 0xc6fc, 0x129e, 0x12a0, 0xc6fa, + 0x129c, 0xc6fb, 0x129f, 0xc6fe, 0x12f7, 0x12ea, 0xc831, 0x12ef, + 0x12e9, 0x12f3, 0x12f0, 0x12eb, 0xc838, 0x12ec, 0x12f2, 0x12f5, + 0x12ee, 0xc83a, 0xc9bb, 0x133a, 0x134b, 0xca59, 0x134a, 0x134c, + 0xcadb, 0xcadf, 0xcae2, 0x1379, 0x137b, 0x1378, 0xcb9e, 0xcba1, + 0x13b5, 0xcd10, 0x13b4, 0x13b7, 0x4a9e, 0x1409, 0x13fe, 0x1408, + 0x1407, 0xce76, 0xce7f, 0xce7d, 0x1406, 0x1404, + /* 0x4e */ + 0x1405, 0x13ff, 0x140b, 0xce82, 0xd057, 0x143b, 0x145d, 0x145c, + 0x145f, 0x145e, 0x4c28, 0xd12e, 0x4c21, 0x1483, 0xd38b, 0xd38d, + 0x14a7, 0x4d66, 0x4d6c, 0xd390, 0x14a8, 0xd4ec, 0xd56f, 0xd56b, + 0xd571, 0xd578, 0x4df6, 0x14e0, 0x14df, 0x14fe, 0x14fc, 0x14ff, + 0x14fd, 0xd7ad, 0x152c, 0x4fec, 0x4fba, 0x4fe3, 0x4fbd, 0x159d, + 0xdb2f, 0x52b4, 0xdd78, 0x1640, 0xdff8, 0xe019, 0x165f, 0xe09b, + 0xe094, 0xe097, 0xe099, 0xe1a6, 0xe1a4, 0xe1a7, 0x54d1, 0xe295, + 0x16c0, 0x5523, 0xe290, 0x16c1, 0x16c6, 0xe29b, 0xe3c4, 0x1704, + 0x1705, 0xe3c6, 0x560b, 0x173e, 0x173d, 0x1740, 0x173f, 0xe4e3, + 0x1742, 0xe4df, 0xe4dd, 0xe4e7, 0x1784, 0x1782, 0x177f, 0x1785, + 0xe82d, 0xe82c, 0x17cc, 0x57b2, 0x17cb, 0x17cd, 0xe834, 0xe838, + 0x57db, 0xe91d, 0x17f5, 0xe91a, 0xe91b, 0xe914, + /* 0x4f */ + 0x57f0, 0xe917, 0xea21, 0x1820, 0x1821, 0xeaaa, 0xeaa1, 0x1837, + 0x183e, 0x5873, 0x183d, 0x586e, 0xeb63, 0xeb79, 0xeb60, 0x5865, + 0xeb62, 0x183c, 0xeb61, 0x1838, 0x586a, 0xeb70, 0x586d, 0xeb6a, + 0x183b, 0xedc8, 0x18b0, 0xedc5, 0xedbe, 0xedc2, 0x18ad, 0x18b2, + 0x18b8, 0x5a0b, 0xedc7, 0x18af, 0xedb0, 0xedca, 0x191a, 0x5b76, + 0x1920, 0x1921, 0x1930, 0x5ba8, 0x192f, 0xf10d, 0xf107, 0xf196, + 0xf1ef, 0x195f, 0x1960, 0xf21e, 0xf21d, 0x5c11, 0xf390, 0x5feb, + 0x008a, 0x1b19, 0x009c, 0x5fee, 0x009a, 0x5fef, 0x5fec, 0x63fa, + 0x010c, 0x010b, 0x010d, 0x1c92, 0x6504, 0x69d3, 0x01fe, 0x69d1, + 0x69fa, 0x01ff, 0x01fb, 0x01fc, 0x0209, 0x69c8, 0x0200, 0x69d5, + 0x1e75, 0x69cd, 0x69d2, 0x69fb, 0x6c2a, 0x6e88, 0x6e61, 0x0271, + 0x6e63, 0x6e62, 0x206f, 0x5e57, 0x71c8, 0x7198, + /* 0x50 */ + 0x032b, 0x73c1, 0x773f, 0x7741, 0x0414, 0x0411, 0x0412, 0x7852, + 0x0463, 0x785e, 0x046e, 0x049a, 0x79c7, 0x049b, 0x7a70, 0x7b27, + 0x04c8, 0x7b71, 0x7bb0, 0x04f6, 0x7e42, 0x7e43, 0x26a5, 0x058c, + 0x0597, 0x05a2, 0x26a0, 0x7e57, 0x7e9d, 0x8289, 0x828d, 0x828b, + 0x8280, 0x8292, 0x828a, 0x82c8, 0x0654, 0x828f, 0x8293, 0x8291, + 0x06a8, 0x84f2, 0x84de, 0x06a9, 0x85c8, 0x28b4, 0x28d8, 0x29c2, + 0x0718, 0x0717, 0x071d, 0x87a7, 0x87a1, 0x0731, 0x8a8c, 0x8a7f, + 0x07d8, 0x07d5, 0x8a7b, 0x8a95, 0x8a99, 0x07e1, 0x8a8e, 0x07d4, + 0x8ada, 0x8a8a, 0x8a9c, 0x07e3, 0x8a7e, 0x0844, 0x0845, 0x8d1a, + 0x8e55, 0x0876, 0x0875, 0x8e60, 0x2ca8, 0x0888, 0x08aa, 0x8ffb, + 0x08ab, 0x08ac, 0x8ffd, 0x0957, 0x2d83, 0x0960, 0x095d, 0x096b, + 0x92d0, 0x0963, 0x0967, 0x92c5, 0x095e, 0x92d2, + /* 0x51 */ + 0x9311, 0x2dc5, 0x2fcd, 0x09f9, 0x09f3, 0x95ad, 0x95a4, 0x95a9, + 0x95b0, 0x959d, 0x09f6, 0x9798, 0x309c, 0x0a51, 0x0a53, 0x0a52, + 0x9992, 0x0a9b, 0x998a, 0x0a9c, 0x998d, 0x9996, 0x0af7, 0x3299, + 0x328f, 0x3291, 0x9b45, 0x9b4b, 0x9c0f, 0x9c16, 0x0b3b, 0x9c8a, + 0x0b3e, 0x0b3d, 0x9dc9, 0x0b69, 0x9dc8, 0x9dca, 0x9f64, 0x0bc3, + 0x0bc4, 0x0bc7, 0x9f5d, 0x9f63, 0x3439, 0x0bc6, 0x342e, 0x0bc8, + 0x9f88, 0xa03a, 0xa039, 0x349f, 0x34a0, 0x0be6, 0x0bf8, 0xa117, + 0xa193, 0x0c07, 0xa195, 0x0c64, 0x0c68, 0xa276, 0x3594, 0x0c65, + 0x35ae, 0xa280, 0xa27b, 0x0c69, 0xa248, 0xa2a8, 0xa288, 0xa38b, + 0xa38a, 0xa38c, 0xa3fc, 0x0cda, 0x0ce0, 0x36e6, 0xa458, 0x0cde, + 0xa451, 0xa455, 0xa453, 0x0d1c, 0x0d1d, 0x0d1a, 0xa5dc, 0x0d7b, + 0x0d7a, 0x0d7c, 0xa75c, 0x0d78, 0x0d77, 0xa765, + /* 0x52 */ + 0xf65a, 0x0db1, 0xa8ee, 0x0db2, 0x0db0, 0xa8f0, 0x38bc, 0xa8f2, + 0x0e36, 0xab35, 0x0e2e, 0xab22, 0x39d6, 0xab20, 0x0e34, 0xab2d, + 0xab28, 0xab26, 0xab3c, 0x0e2a, 0xab38, 0x0e33, 0x0e2d, 0x0e2f, + 0x0e31, 0x0e2b, 0x0e32, 0xab2a, 0x0e35, 0xab1a, 0xab30, 0xaae3, + 0xab19, 0xade9, 0xade7, 0x3acf, 0xafd6, 0xafc4, 0x0f08, 0xaf87, + 0x0f06, 0xafc7, 0xafd9, 0x3c18, 0xafdf, 0x0f4d, 0x0f61, 0xb20a, + 0xb201, 0xb2b1, 0x0f78, 0xb2c1, 0x0f94, 0x0f95, 0xb376, 0xb40d, + 0xb40e, 0x0fc1, 0x0fc3, 0x3e6d, 0xb707, 0x1039, 0xb709, 0xb716, + 0x103a, 0x103b, 0x1035, 0x1036, 0xb70e, 0x103c, 0x3f90, 0xb706, + 0xb81e, 0xb84a, 0x1058, 0x107c, 0x107d, 0x108d, 0x108c, 0xbca6, + 0xbc91, 0x113b, 0x113f, 0xbcb8, 0xbc96, 0x1132, 0x112d, 0xbcc5, + 0x112f, 0x1139, 0x112e, 0x113a, 0xbd0a, 0x1136, + /* 0x53 */ + 0x1131, 0x113e, 0x1138, 0x4252, 0x1134, 0xbcb2, 0x1141, 0xbcb7, + 0xbcb4, 0xbc89, 0xbc8d, 0x1130, 0xbc87, 0xbcc2, 0xbc9c, 0xbc92, + 0x1143, 0xbcca, 0x4250, 0xbc8a, 0xbfe0, 0x1198, 0xbfe6, 0xbfe5, + 0x44a0, 0xc1a5, 0xc1b3, 0x4486, 0x11da, 0x11d7, 0xc1b5, 0xc1af, + 0x4495, 0xc1b0, 0xc1cc, 0x448c, 0xc1a2, 0xc1be, 0xc1c6, 0xc1ac, + 0xc1ae, 0x1218, 0x4560, 0xf6c3, 0xc508, 0xc505, 0x1252, 0x4628, + 0xc4fe, 0x124e, 0x4620, 0xc500, 0x124f, 0x1250, 0xc664, 0xc668, + 0x46a8, 0x1286, 0x1287, 0x1289, 0xc66a, 0xc669, 0xc70d, 0xc712, + 0x12a2, 0x12a3, 0xc70f, 0x12a1, 0xc867, 0xc879, 0xc872, 0xc866, + 0xc87c, 0x12f9, 0x12fd, 0xc868, 0xc885, 0xc876, 0xc874, 0xc871, + 0xc864, 0x133e, 0x133c, 0xc9f8, 0x134d, 0xca6c, 0x134e, 0xcaeb, + 0x1381, 0x1383, 0x1382, 0xcbb8, 0x1380, 0x1388, + /* 0x54 */ + 0xcd2d, 0xcd2e, 0xcd28, 0xcd29, 0xcd31, 0x13b9, 0xcd2f, 0xcd2a, + 0x4b3a, 0xcea4, 0xceb7, 0xcebf, 0x1411, 0x140d, 0x1410, 0x1413, + 0xd063, 0x143c, 0x1462, 0x1463, 0xd167, 0xd3be, 0xf6e0, 0xd595, + 0xd59c, 0x1503, 0x1506, 0x1502, 0x1501, 0xd671, 0xd672, 0x1505, + 0xd66f, 0x4e94, 0x5011, 0xd7f1, 0x5037, 0x1536, 0xd7e8, 0x1535, + 0x5043, 0xf6ea, 0x15a1, 0x15a3, 0xdb49, 0xdb64, 0x15a0, 0xdb48, + 0x15ea, 0x53a6, 0x15e8, 0xdd2c, 0xdde1, 0xddef, 0xdec0, 0x1621, + 0x161b, 0xded7, 0xded4, 0x1649, 0x1648, 0xe0ad, 0x5495, 0x1662, + 0x1661, 0x1664, 0x1660, 0x1663, 0xe0ae, 0xe0ac, 0x5496, 0x1666, + 0x16ac, 0x16ab, 0xe227, 0xe2ae, 0x16c3, 0xe2b0, 0x16c4, 0x5525, + 0xe2c0, 0xe2c4, 0x1708, 0x1709, 0x170a, 0x1706, 0x1707, 0x1741, + 0xe507, 0x1745, 0xe4fd, 0x1743, 0x1744, 0x5626, + /* 0x55 */ + 0x5634, 0x1747, 0xf704, 0xe61b, 0xe61c, 0x1771, 0xe6b2, 0xe6b4, + 0xe6b7, 0xe6b1, 0xe6b3, 0xe6ae, 0x178b, 0x17d4, 0x17d3, 0x17d1, + 0x57ba, 0x17d2, 0xe83f, 0xe936, 0x17f7, 0x17f8, 0xe931, 0xe93b, + 0xe935, 0xe93a, 0xe937, 0xea22, 0xea36, 0xea32, 0x1822, 0xeac0, + 0x1845, 0x1841, 0x5881, 0x1840, 0x588a, 0xeb85, 0x587f, 0x1842, + 0xeb89, 0x18c1, 0x18c5, 0xede1, 0x18bb, 0x18b9, 0x18bd, 0x18c9, + 0xee0a, 0x5a11, 0xee09, 0x18bf, 0x18c7, 0xede8, 0x18c3, 0x1924, + 0x1931, 0x1933, 0xf118, 0x1932, 0x1934, 0x1952, 0x1961, 0x5bd9, + 0x197a, 0x1982, 0x5c3c, 0xf3c5, 0x1b23, 0x600d, 0x600c, 0x6021, + 0x1b2c, 0x6216, 0x640e, 0x010f, 0x1c95, 0x6417, 0x0123, 0x0125, + 0x6a48, 0x0206, 0x0208, 0x1e88, 0x6a55, 0x6a49, 0x6a4c, 0x1e8b, + 0x6a4f, 0x6a3d, 0x027a, 0x0277, 0x6e8a, 0x6ea8, + /* 0x56 */ + 0x708a, 0x032e, 0x71cb, 0x032f, 0x71d5, 0x78d4, 0x041b, 0x0413, + 0x775c, 0x7775, 0x0466, 0x7861, 0x0465, 0x7096, 0x04f7, 0x7c8a, + 0x7ed0, 0x26e1, 0x26d7, 0x7e49, 0x7ecf, 0x059c, 0x82d6, 0x827f, + 0x0653, 0x82d2, 0x82cf, 0x8506, 0x8509, 0x06ba, 0x28a3, 0x0722, + 0x29d3, 0x8b06, 0x8af1, 0x8b04, 0x2b8b, 0x8afa, 0x8af4, 0x07eb, + 0x07dd, 0x8af9, 0x07ef, 0x8a8b, 0x8b03, 0x0847, 0x0846, 0x8da2, + 0x0878, 0x2cac, 0x0889, 0x900c, 0x900b, 0x0968, 0x0976, 0x0974, + 0x0979, 0x9324, 0x097a, 0x0977, 0xf614, 0x0971, 0x9325, 0x0972, + 0x95f6, 0x09ff, 0x95fb, 0x0a05, 0x9732, 0x97fb, 0x0a54, 0x98f2, + 0x98f3, 0x0a9e, 0x0a9f, 0x3174, 0x999c, 0x9b72, 0x0afa, 0x9b74, + 0x0b44, 0x0b3f, 0x0b40, 0x9c86, 0x0b42, 0x9c8e, 0x9c90, 0x0b51, + 0x9ccd, 0x9cf7, 0x9dd6, 0x9f84, 0x9f95, 0x9f8a, + /* 0x57 */ + 0x3440, 0x0bca, 0x9f97, 0x3441, 0x0bce, 0x0bc9, 0xa0a0, 0xa0a1, + 0xa122, 0xa1a6, 0xa1a4, 0x0c09, 0x34e8, 0x0c6c, 0x0c6e, 0x0c70, + 0x0c6d, 0x0c6b, 0x0c71, 0x0c72, 0xa2af, 0xa2b0, 0xa2bd, 0x0c8c, + 0x0ce4, 0xa476, 0x0ce1, 0xa47b, 0xa479, 0x36f6, 0x0ce7, 0x3700, + 0x0ce2, 0x0d1f, 0xa5ee, 0xa5f1, 0x0d7e, 0xa794, 0x0d80, 0x3859, + 0x3855, 0xa791, 0x0db9, 0x0db7, 0x0db8, 0xa910, 0x0dba, 0x38f4, + 0xa9af, 0x0dd3, 0x0e3f, 0x3a04, 0x0e45, 0x0e41, 0x3a15, 0x0e42, + 0x0e43, 0x0e3b, 0x0e38, 0xab7b, 0xab77, 0x0e3a, 0x39f5, 0xab80, + 0xabc6, 0x0e3c, 0xab7c, 0xab90, 0x0e3e, 0xaba3, 0xab7d, 0xabbd, + 0x0e9e, 0x0e9f, 0x0ea1, 0xae13, 0x0e9b, 0x0f12, 0xb011, 0xb044, + 0xb00d, 0x0f18, 0x0f0c, 0xb214, 0x0f62, 0xb2b8, 0x0f7a, 0xb2b7, + 0xb383, 0x0fae, 0x0faf, 0xb414, 0x0fad, 0xb41c, + /* 0x58 */ + 0x0fc4, 0x0fc7, 0x0fc6, 0x0fc5, 0xb4d4, 0xb4d5, 0x3fc1, 0x1040, + 0xb743, 0xb742, 0x103f, 0x1041, 0xf68a, 0xb741, 0xb84e, 0x107f, + 0xb987, 0x1086, 0x1081, 0x1080, 0x108e, 0x114a, 0xbd39, 0x1147, + 0xbd8f, 0xbd2a, 0x114b, 0x1146, 0x114e, 0x427d, 0xbd2b, 0x42a5, + 0xbd50, 0x1148, 0xbd6e, 0x1145, 0xbd3b, 0xbd53, 0xbd5f, 0xbd2f, + 0xbd30, 0xbd38, 0xbd4c, 0xbff1, 0x11db, 0x11e7, 0x11e4, 0xc207, + 0xc216, 0x11e1, 0xc214, 0x11e9, 0xc1fb, 0x11e5, 0x11e0, 0x11e3, + 0xc1f8, 0xc210, 0xc21d, 0xc1ff, 0xc20b, 0xc204, 0x11ea, 0xc1fe, + 0xc3ff, 0x463a, 0x1254, 0x1258, 0x125c, 0xc523, 0x1255, 0x128b, + 0x128c, 0x12a6, 0x12a5, 0xc72a, 0xc8a0, 0xc898, 0xc89c, 0x12ff, + 0xc89e, 0xc8a6, 0xc8b5, 0xc8b0, 0x1330, 0x1340, 0x1341, 0xcaf9, + 0xcaf5, 0x1386, 0xcbd2, 0x13bf, 0x13bd, 0xcd50, + /* 0x59 */ + 0xcd4e, 0xcd4b, 0xcd52, 0xcd4d, 0x13be, 0x1419, 0xcee4, 0x141c, + 0xceda, 0x141b, 0x1417, 0x1418, 0x4b51, 0xcedf, 0xcee8, 0x143d, + 0x146a, 0x1466, 0xd170, 0xd172, 0x1467, 0xd177, 0x1468, 0x14ad, + 0x14ae, 0xd3e6, 0xd5aa, 0x14d6, 0x1509, 0xd68c, 0x4e98, 0xd689, + 0x150c, 0x150a, 0xd832, 0x153b, 0x153a, 0x5084, 0x5081, 0xd87a, + 0x506f, 0xda9e, 0xdaa0, 0xdb70, 0x15af, 0x15aa, 0x15ab, 0xdb6e, + 0xdb66, 0x15b1, 0xdb65, 0x15ac, 0x15ec, 0xdd7f, 0xdde0, 0x1601, + 0xddff, 0xdef6, 0xdef7, 0xdef5, 0x1623, 0xdefc, 0x1624, 0x161e, + 0xdef9, 0x164a, 0x1665, 0x166a, 0xe0ca, 0xe0c3, 0xe0c6, 0x1669, + 0xe1b8, 0xe1bd, 0x1695, 0xe1bc, 0xe205, 0xe2e0, 0xe2e9, 0x5542, + 0xe2df, 0xe2ec, 0x16cc, 0xe2e5, 0xe2de, 0xf700, 0x16cf, 0xe2f0, + 0xe2e3, 0x170f, 0xe3ec, 0x170e, 0x170b, 0x1710, + /* 0x5a */ + 0x170d, 0x170c, 0xe3f2, 0xe3ef, 0xe3e9, 0xe4fb, 0x1746, 0x1748, + 0x5637, 0x1749, 0xe537, 0xe6de, 0x1791, 0x178e, 0xe6da, 0x17d8, + 0x17d6, 0xe84b, 0x17da, 0xe849, 0x17d7, 0xe8d5, 0x57ff, 0x17f9, + 0xe952, 0xe947, 0x17fc, 0xe948, 0xeacc, 0xead0, 0x58a9, 0x184a, + 0x58a7, 0x184e, 0x58b3, 0x58ac, 0x58b0, 0xeb86, 0xeba7, 0xeba3, + 0x589c, 0xebb6, 0xebad, 0xee13, 0x5a3c, 0x5a1c, 0x5a3a, 0x18d3, + 0x18cd, 0x18d1, 0xee17, 0xee22, 0x5a32, 0x5a34, 0xee49, 0xee26, + 0xf70c, 0xee3c, 0xee28, 0xf0a8, 0x5bc7, 0xf1fb, 0x1962, 0xf232, + 0xf2d6, 0xf348, 0x1983, 0x5c3f, 0xf3c6, 0x1992, 0x009f, 0x00a0, + 0x6025, 0x6026, 0x6024, 0x6033, 0x6170, 0x0127, 0x6790, 0x020b, + 0x6a95, 0x6aa1, 0x6a92, 0x6a8f, 0x6a9f, 0x6a96, 0x6a98, 0x6a9d, + 0x6aa0, 0x028d, 0x7097, 0x71eb, 0x0370, 0x7787, + /* 0x5b */ + 0x24eb, 0x7b32, 0x059a, 0x059f, 0x059d, 0x7ed8, 0x7efb, 0x7f06, + 0x059b, 0x7ed1, 0x26d5, 0xf5b0, 0x0660, 0x0664, 0x0669, 0x0663, + 0x0667, 0x0662, 0x82f6, 0x8304, 0x82fe, 0x2802, 0x82ff, 0x82f7, + 0x8518, 0x06ac, 0x8514, 0x85cd, 0x8620, 0x87de, 0x0726, 0x0723, + 0x0725, 0x8b45, 0x8b53, 0x07f8, 0x8b4b, 0x8b55, 0x8b41, 0x07f7, + 0x07fb, 0x07fa, 0x8b5c, 0x8b54, 0x8e71, 0x8ed0, 0x08b0, 0x08af, + 0x9053, 0x9329, 0x937e, 0x097e, 0x9379, 0x097d, 0x0980, 0x9370, + 0x936a, 0x097f, 0x0986, 0x9385, 0x9364, 0x2e12, 0x9378, 0x0981, + 0x9632, 0x9627, 0x962f, 0x0a24, 0x0a58, 0x0a57, 0x0aa0, 0x99ba, + 0x0afe, 0x9b71, 0x9b8c, 0x0b15, 0x9c1a, 0x0b47, 0x0b46, 0x9c98, + 0x9de4, 0x0b6b, 0x0b6c, 0x3385, 0x3454, 0x9fc2, 0x0bcc, 0x9fba, + 0x3455, 0x9fc8, 0x0bcb, 0x34a7, 0x34a8, 0x0bf9, + /* 0x5c */ + 0xa1b9, 0xa1b8, 0xa1a5, 0xa2e2, 0x0c78, 0x0c7a, 0x0c75, 0xa2d9, + 0x0c76, 0x0c77, 0xa2ac, 0xa2dd, 0x0cea, 0x0cee, 0x0ced, 0xa49d, + 0x0cec, 0x370f, 0xa611, 0xa603, 0x0d84, 0x0d85, 0x0d83, 0xa7ee, + 0x0dbc, 0x0dbd, 0x0dd4, 0xaba4, 0xabd8, 0xabdd, 0xabde, 0x0e55, + 0xabe7, 0x0e50, 0x0e4c, 0x0e48, 0xabd4, 0x0e53, 0xabce, 0x0e57, + 0x0e54, 0x0e4e, 0x0e4a, 0x0e51, 0xabf1, 0xabd3, 0x0e49, 0x0e4b, + 0x0e63, 0xabca, 0xabe9, 0x0ea7, 0x0ea6, 0x0ea4, 0xae1a, 0xae41, + 0xf668, 0x3ae4, 0x3ae5, 0xb03d, 0xb040, 0x3c65, 0x3c4e, 0x0f17, + 0xb043, 0x0f16, 0xb03f, 0xb03c, 0x0f63, 0xb221, 0xb220, 0x3d82, + 0xb2c6, 0x0f7b, 0x0f7c, 0xb2d1, 0xb2ca, 0xb38e, 0xb391, 0x0fb0, + 0x3e2d, 0xb4e3, 0xb788, 0x1042, 0xb770, 0x1044, 0xb89d, 0xb99d, + 0xb991, 0xb998, 0xb999, 0x1088, 0x108f, 0x1153, + /* 0x5d */ + 0x115b, 0xbdbf, 0x1159, 0xbdae, 0xbdb1, 0xbdcc, 0xbe04, 0x42ca, + 0xbe16, 0xbdcd, 0x1154, 0x42bc, 0xbde0, 0xbdcb, 0xbdd4, 0xbdc9, + 0xbfff, 0x1199, 0xbffd, 0xc257, 0xc252, 0xc250, 0xc245, 0xc24d, + 0x11f1, 0xc253, 0x11ef, 0xc282, 0xc244, 0xc3ce, 0xc3cf, 0xc3d2, + 0xc402, 0xc54f, 0xc558, 0x1262, 0xc543, 0x1263, 0xc552, 0x1260, + 0x1261, 0x125f, 0xc549, 0xc553, 0xc54d, 0x128d, 0xc684, 0x128e, + 0xc683, 0xc732, 0xc8e2, 0x1309, 0xc8e4, 0xc8d3, 0x1305, 0xc8d5, + 0xc8dd, 0x1303, 0x1306, 0xc8ec, 0xc8e6, 0xc8d2, 0xc8fa, 0xc8da, + 0x1331, 0xca06, 0xca04, 0x134f, 0xca7b, 0xcb04, 0xcb02, 0x1366, + 0x49ff, 0x13c4, 0xcd60, 0x13c3, 0x13c1, 0x13c5, 0xcf07, 0xcf05, + 0xcf0c, 0x1421, 0xcf5a, 0x141f, 0x1422, 0xcf1a, 0x1427, 0x1420, + 0xd18a, 0x146d, 0x146c, 0x146b, 0x146f, 0x1470, + /* 0x5e */ + 0xd18c, 0xd409, 0xd6a6, 0x4ea6, 0xd6ac, 0xd6a9, 0x1542, 0xd88b, + 0x50b6, 0xd88c, 0x1544, 0x1540, 0xd888, 0xd889, 0x153f, 0xd893, + 0x50ab, 0x158b, 0xdb83, 0xdd4f, 0x1625, 0x1628, 0xdf20, 0x5421, + 0xe036, 0xe0e2, 0x1675, 0x1672, 0xe0ee, 0x166f, 0xe0e7, 0xe0e9, + 0x1676, 0x1671, 0x54a7, 0xe0df, 0x1697, 0xe1c7, 0x16d7, 0xe309, + 0x16d6, 0xe301, 0x16d8, 0x16dc, 0x16db, 0x16d4, 0x553e, 0x1713, + 0x1711, 0x1714, 0xe405, 0xe40c, 0xe578, 0xe55d, 0x1751, 0x1750, + 0x1753, 0x1754, 0x1752, 0xe55e, 0xe560, 0xe567, 0x176d, 0xf705, + 0xe6f4, 0x1795, 0x1799, 0xe6f1, 0x179a, 0xe6fa, 0x1793, 0x1797, + 0xe6f8, 0xe6f9, 0xe709, 0xe6fd, 0xe6f7, 0x17dc, 0xe859, 0x17fd, + 0xe960, 0xe968, 0x17fe, 0x1800, 0x1802, 0x1801, 0x1803, 0xe96a, + 0xea14, 0xea3e, 0xeae4, 0x1827, 0x1826, 0x1824, + /* 0x5f */ + 0x184c, 0x58bc, 0x1850, 0x1855, 0x1853, 0x58b7, 0x1852, 0xebd2, + 0x1857, 0x58be, 0x1858, 0x18d6, 0xee58, 0xee50, 0x18d4, 0xee5c, + 0x18da, 0x18d9, 0xcf19, 0x5a62, 0x18d5, 0x18e4, 0xf70e, 0x18dc, + 0x191b, 0x5b8f, 0x1937, 0x1936, 0x194b, 0x5bcb, 0x1966, 0x1976, + 0xf2df, 0x197e, 0x197d, 0x197f, 0x1984, 0x198b, 0xf3d9, 0x1994, + 0x00a1, 0x0111, 0x6566, 0x0210, 0x1ea9, 0x6ae1, 0x6aef, 0x6ae8, + 0x6c33, 0x2013, 0x71fe, 0x0332, 0x21f4, 0x73ef, 0x73ec, 0x75ec, + 0x779c, 0x0420, 0x7799, 0x7870, 0x786e, 0x049d, 0x7b41, 0x26ec, + 0x26ef, 0x7f02, 0x7f01, 0x05a5, 0x801b, 0x8323, 0x8325, 0x8324, + 0x8326, 0x8333, 0x832f, 0x858f, 0x8856, 0x0802, 0x07fe, 0x0801, + 0x2bd6, 0x0803, 0x07ff, 0x8b99, 0x0804, 0xf5ed, 0x084a, 0x8ed9, + 0x0987, 0x93b7, 0x0984, 0x93b6, 0x0985, 0x3009, + /* 0x60 */ + 0x9654, 0x9657, 0x967a, 0x0a59, 0x3179, 0x9b8e, 0x32c6, 0x9b90, + 0x9bb9, 0x0b04, 0x0b49, 0x0b48, 0x9def, 0x0b6d, 0x0bd2, 0x0bd3, + 0x9fe2, 0x0bd1, 0x9fd6, 0x9fd8, 0x9fda, 0x9fde, 0x0be7, 0x0c0a, + 0x35c3, 0xa308, 0xa304, 0xa30a, 0xa30b, 0xa302, 0x0cf0, 0xa4aa, + 0xa4c1, 0x371f, 0xa7d7, 0xa7d9, 0x3865, 0xa7de, 0xa7da, 0x0dbe, + 0x0dbf, 0xa92a, 0x38c6, 0x3a3a, 0xac31, 0x3a36, 0xac2b, 0xac2c, + 0xac29, 0xac2e, 0x0e5e, 0xac27, 0xac28, 0x0e5b, 0xac5f, 0xac30, + 0xac24, 0x3aeb, 0x0eab, 0xae3a, 0x0eac, 0xae39, 0xae40, 0xb080, + 0xb084, 0x0f1f, 0x0f1d, 0xb075, 0xb076, 0x0f1c, 0xb07c, 0x0f1e, + 0xb078, 0xb09b, 0xb07e, 0xb15a, 0x0f64, 0xb22c, 0x3d84, 0xb39c, + 0xb747, 0xb78a, 0x1048, 0x1047, 0xb827, 0xbe4a, 0x115e, 0x1161, + 0xbe27, 0x42e0, 0x42f3, 0xbe2e, 0xbe26, 0xc008, + /* 0x61 */ + 0x11f7, 0xc2bd, 0xc296, 0x11f4, 0x11f8, 0x451e, 0xc2be, 0xc28e, + 0xc574, 0x1264, 0xc580, 0x1292, 0x128f, 0x1290, 0x46b4, 0x1293, + 0x12a8, 0xc73c, 0xc73d, 0x12a9, 0xc73a, 0xc742, 0x46f9, 0xc924, + 0xc906, 0x4844, 0x130e, 0xc915, 0x130f, 0xc902, 0xc90c, 0x130b, + 0xc908, 0xc90a, 0xc905, 0xc91c, 0x1310, 0x1351, 0xca82, 0x1350, + 0xca86, 0x1363, 0xcc03, 0xcd7b, 0x13c7, 0xcd7a, 0x4b71, 0x1424, + 0x1426, 0x4b6e, 0xcf80, 0x4b79, 0xcf58, 0x4bc4, 0x1474, 0x1473, + 0x1472, 0xd1aa, 0xd1ab, 0xd236, 0xd24a, 0x14b1, 0x4d8c, 0xd5d6, + 0x150e, 0x1511, 0x1510, 0x150f, 0x1512, 0x1549, 0x50c9, 0x154f, + 0x154d, 0xd903, 0xd8cf, 0x1555, 0xdb9f, 0xdba2, 0xde2a, 0xde2f, + 0xdf44, 0xdf40, 0x162c, 0x162b, 0xe111, 0xe10f, 0x1679, 0xe10d, + 0xe107, 0xe103, 0x167a, 0x54b0, 0x1699, 0x169a, + /* 0x62 */ + 0xe235, 0x16ae, 0x16af, 0xe304, 0x16e4, 0x16e1, 0x16de, 0x16e6, + 0x16df, 0xe326, 0x16e7, 0x16e2, 0x16e0, 0xe31e, 0x16e5, 0x555a, + 0xe40e, 0x1718, 0xe41d, 0xe41e, 0xe41f, 0x1756, 0xe588, 0x5646, + 0xe58d, 0xe591, 0xe580, 0x176e, 0xe654, 0xe655, 0x179d, 0x17a0, + 0x179c, 0xe725, 0xe71a, 0x17a1, 0x17a2, 0x179f, 0x17df, 0x17de, + 0x57c3, 0x17ea, 0xe988, 0x1806, 0xe97a, 0x1804, 0x580f, 0xe980, + 0xeb1e, 0xebfc, 0xec25, 0x185f, 0x58f4, 0x58fa, 0x185c, 0xec0b, + 0x185e, 0xec06, 0xec04, 0x58dd, 0x1859, 0xebf9, 0xec00, 0x1864, + 0x185d, 0x1862, 0xec02, 0x1865, 0xec07, 0x58ed, 0x185b, 0x58ef, + 0xeeb5, 0x18dd, 0xee87, 0x18df, 0xee93, 0xf70f, 0x18e2, 0xeebe, + 0xf066, 0x1927, 0xf0c7, 0xf0cf, 0x5b96, 0x193a, 0x193c, 0xf13d, + 0x1939, 0xf13c, 0xf147, 0x193d, 0x193b, 0x5bb3, + /* 0x63 */ + 0x194c, 0xf1c3, 0x1968, 0x5be2, 0xf31b, 0x1980, 0x1985, 0xf3c9, + 0x1995, 0xf3dd, 0x1996, 0xf493, 0x5c8f, 0x603d, 0x00a4, 0x0112, + 0x1eb1, 0x0225, 0x6ee6, 0x2141, 0x0337, 0x73f7, 0x77b0, 0x77ae, + 0x5dfd, 0x0468, 0x0467, 0x049e, 0x7c9f, 0x7c9e, 0x7f30, 0x05aa, + 0x7f4f, 0x05a9, 0x05a4, 0x7f27, 0x7f51, 0x0671, 0x066f, 0x8351, + 0x8354, 0x8356, 0x8527, 0x06ad, 0x8524, 0x2bf6, 0x080c, 0x2bf2, + 0x080b, 0x8bec, 0x8bc4, 0x080f, 0x0879, 0x93f8, 0x93f6, 0x93f7, + 0x93ed, 0x098d, 0x098f, 0x93f4, 0x93ef, 0x098e, 0x0a0c, 0x967f, + 0x96a2, 0x967e, 0x0aa6, 0x99c5, 0x0aa3, 0x0aa4, 0x0aa5, 0x3388, + 0x0b6e, 0x9ff1, 0x9ff2, 0x0bfa, 0xa12f, 0x0c7c, 0x0c7e, 0x0c7b, + 0x0c7d, 0xa323, 0xa329, 0x0c8d, 0x0cf4, 0x0cf3, 0xa61b, 0xa7eb, + 0x0d89, 0xa7ea, 0xa933, 0x0dc0, 0xac63, 0x0e65, + /* 0x64 */ + 0xac92, 0xac65, 0x0ead, 0x0f25, 0xb0a0, 0xf670, 0xb15e, 0x0fc9, + 0xb7aa, 0x104a, 0xb7a9, 0x4067, 0x1089, 0xbe9c, 0x1166, 0x1170, + 0xbe92, 0x116d, 0x1169, 0x1167, 0xbe86, 0x1172, 0x430e, 0x116e, + 0xbe83, 0x119c, 0x11fc, 0x11fd, 0x1204, 0x11ff, 0xf6c2, 0x11fe, + 0x1200, 0xc2ce, 0x1266, 0x1269, 0xc593, 0x12aa, 0x12ab, 0x1317, + 0xc92e, 0xc927, 0xc928, 0x1315, 0x485e, 0x1312, 0x4a0e, 0xcc18, + 0xcc16, 0xcd8d, 0x13ca, 0xcd8e, 0x13c9, 0x13cb, 0xcd90, 0xcd8f, + 0xcf81, 0x1429, 0x1428, 0xcf8a, 0xcf8c, 0xd08d, 0x1440, 0x1475, + 0x1476, 0xd1b2, 0x1488, 0xd5d9, 0x4eb6, 0x1557, 0x5101, 0xd90d, + 0x155f, 0xd913, 0x511d, 0x1558, 0x155b, 0xd91b, 0x512f, 0xdbac, + 0x15b3, 0xdbb3, 0x15ef, 0xdf5e, 0x1630, 0xdf60, 0xdf68, 0xdf63, + 0xdf69, 0xdf67, 0x1641, 0x164b, 0xe128, 0x167d, + /* 0x65 */ + 0xe12e, 0xe130, 0x167c, 0xe126, 0xe131, 0xe141, 0x54e0, 0xe1da, + 0x54db, 0xf6fa, 0xe20b, 0x5561, 0xe334, 0xe333, 0x16e8, 0x16ea, + 0x16e9, 0xe339, 0xe33b, 0xe340, 0xe430, 0x171b, 0xe432, 0xe437, + 0x1755, 0x564a, 0x1759, 0x1758, 0xe581, 0xe59f, 0xe5a7, 0x17a4, + 0x17a3, 0xe744, 0xe747, 0xe748, 0xe73d, 0x5733, 0x17a7, 0xe749, + 0x17e0, 0xe880, 0xe9a0, 0xe99d, 0x1808, 0x180a, 0x1809, 0xe99c, + 0xea47, 0xeb07, 0x1871, 0x590f, 0x186c, 0xec49, 0x5911, 0xec44, + 0x5903, 0x5901, 0x186e, 0xecdf, 0x5916, 0xec4c, 0x5dfd, 0xec4f, + 0x18e0, 0x18ee, 0xeec1, 0x18eb, 0xeeb9, 0xeecb, 0xeecf, 0xeec4, + 0x5a93, 0x18ea, 0x18ef, 0x18e7, 0xeeca, 0xeec3, 0xf0d0, 0xf151, + 0x1948, 0x1949, 0xf1a8, 0xf1c7, 0xf1c6, 0x194d, 0xf1ca, 0xf202, + 0x1955, 0xf25d, 0xf25a, 0x196a, 0x196c, 0xf259, + /* 0x66 */ + 0x196b, 0xf2cc, 0xf31c, 0xf3cc, 0x1998, 0x1999, 0x1997, 0xf3e8, + 0xf3ec, 0xf3ea, 0xf4ad, 0xf4b0, 0x605f, 0x6058, 0x6057, 0x1d5b, + 0x6793, 0x0216, 0x6b3b, 0x1ebf, 0x6b34, 0x6ef2, 0x0339, 0x73fd, + 0x751d, 0x0425, 0x23ce, 0x7a04, 0x7b48, 0x7f58, 0x834f, 0x0674, + 0x836e, 0x8372, 0x06ae, 0x852e, 0x8bfc, 0x8bf4, 0x9036, 0x940e, + 0x0992, 0x0994, 0x9414, 0x0995, 0x9419, 0x0a0d, 0x96a6, 0x0a25, + 0x9bc9, 0x9bc0, 0x9bcc, 0x9c1b, 0x9caa, 0x9ca8, 0xa003, 0x0bd5, + 0x0bd6, 0x34ac, 0x0be8, 0xa135, 0x0c7f, 0x35d2, 0x0cf5, 0x0cf6, + 0x0cf7, 0xa4d9, 0x0d24, 0x0d8d, 0x0d8a, 0xa93f, 0xa93d, 0x0e6c, + 0x0e66, 0x0e6a, 0xac8b, 0x0e67, 0x0e6d, 0x0e68, 0x3a52, 0xac68, + 0xac8a, 0xae58, 0xae57, 0xb0ce, 0xb0bc, 0xb0c0, 0xb0c1, 0xb0bf, + 0xb0ab, 0xb15f, 0x0f65, 0xb3a6, 0x0f9a, 0xb429, + /* 0x67 */ + 0x0fb1, 0x104b, 0x104d, 0x104c, 0x104e, 0xb7b8, 0x1173, 0x1175, + 0xbedd, 0xbed6, 0xf6b1, 0xbed5, 0xbee7, 0xbed8, 0xc2ec, 0x1203, + 0xc300, 0xc307, 0xc2fd, 0xc2f1, 0xc2ff, 0xc5aa, 0xc5b0, 0xc948, + 0x131e, 0xc953, 0x4873, 0xc94d, 0x1319, 0x131c, 0x131a, 0x131d, + 0x4876, 0xc943, 0xc950, 0x1343, 0x1352, 0xca8c, 0xcc27, 0x1395, + 0xcd99, 0x13cc, 0xcfb1, 0x142b, 0xcfb0, 0xcfaa, 0xcfac, 0x142a, + 0x4bc7, 0x1477, 0xd1c8, 0xd1ca, 0xd442, 0xd5e0, 0xd6e7, 0xd6e8, + 0xd6e6, 0x1513, 0x1514, 0x5134, 0xd95b, 0xd956, 0x155d, 0xd95a, + 0x1560, 0x513e, 0x1562, 0xdab8, 0xdbc5, 0x15b2, 0x15f0, 0xde48, + 0xdf7d, 0xdf7c, 0xdf81, 0xdf82, 0xdf62, 0x164c, 0xe145, 0x1682, + 0x54bc, 0x1681, 0x169b, 0xe1e3, 0x16a4, 0x16ee, 0x16ec, 0xe350, + 0x16ed, 0xe34f, 0x16f0, 0x16ef, 0xe439, 0x171d, + /* 0x68 */ + 0xe43a, 0x1760, 0x175e, 0x175d, 0xe5c1, 0xe74e, 0xe76e, 0x17b1, + 0x17ab, 0x17ac, 0x17ad, 0xe771, 0x17ae, 0xe88c, 0xe889, 0x17e2, + 0xe8e5, 0xe9b3, 0xe9b6, 0xe9b4, 0xea4d, 0x5839, 0xeb13, 0xec78, + 0x592a, 0x187b, 0x5926, 0x1878, 0x1875, 0x5927, 0xec72, 0x18f2, + 0x18f4, 0x18f3, 0x5ac0, 0x5ac9, 0xf075, 0xf0da, 0xf0d7, 0x193f, + 0x193e, 0x1940, 0x194e, 0x1957, 0x1959, 0x1958, 0xf716, 0xf269, + 0xf267, 0x196e, 0xf266, 0xf26f, 0xf271, 0x5bec, 0xf2cf, 0xf323, + 0x1981, 0x1986, 0xf3a5, 0x198f, 0xf3fe, 0xf3fb, 0xf3fd, 0x5c68, + 0x199b, 0x19b1, 0x19b3, 0x6b6d, 0x033a, 0x7405, 0x7520, 0x0427, + 0x77c8, 0x77c9, 0x046a, 0x05ac, 0x8627, 0x0818, 0x8c1e, 0x8d36, + 0x084c, 0x943d, 0x0996, 0x99d7, 0x0b4a, 0x9cad, 0x9e00, 0x0c81, + 0xa33a, 0x0c83, 0x0cf9, 0x0cf8, 0xa626, 0x0d8e, + /* 0x69 */ + 0x0d8f, 0x0dc1, 0xacb7, 0xacb6, 0xacc0, 0x0e70, 0xac9b, 0x0e71, + 0xb0d8, 0x0f2a, 0x0f2d, 0x0f7d, 0x3e32, 0x3e31, 0xb7c0, 0x104f, + 0xb7bf, 0xb9bf, 0x1090, 0xbf20, 0xbed0, 0xbf0e, 0x1179, 0xbf1d, + 0xbf1e, 0xbf15, 0xbf14, 0xc31e, 0xc32c, 0x1205, 0xc5b9, 0xc5b8, + 0xc5b6, 0xc69e, 0xc69c, 0xc74d, 0x46fd, 0xc96e, 0xc960, 0x1321, + 0xc964, 0xc962, 0xb0e5, 0x1332, 0xcda3, 0x13cd, 0x13cf, 0xd1d2, + 0xd1d5, 0x4d8e, 0x1516, 0x1515, 0x15b5, 0x1608, 0xde55, 0x1632, + 0xdf93, 0x1633, 0x1634, 0x163c, 0xe156, 0x54c2, 0xe1e9, 0x169c, + 0xe245, 0x16f4, 0x16f2, 0xe47c, 0x1762, 0xe5d3, 0x1761, 0x1764, + 0x17b5, 0x574b, 0x17b4, 0xe78e, 0xe897, 0x17e3, 0xe89b, 0xe899, + 0x581c, 0x180e, 0xe9cf, 0x581b, 0xea59, 0x182c, 0x182b, 0xeb20, + 0xeb23, 0xeb2a, 0x1885, 0x1881, 0x187e, 0x1883, + /* 0x6a */ + 0x1880, 0xecb0, 0x5942, 0xef2f, 0x5ad4, 0x18fb, 0x18f7, 0xef32, + 0xef43, 0xef3f, 0xef39, 0x18f8, 0xef30, 0xf0dd, 0xf1da, 0xf1db, + 0x195a, 0xf284, 0xf27f, 0xf272, 0xf280, 0xf2ee, 0x1978, 0xf32a, + 0xf322, 0xf371, 0xf3cd, 0x199d, 0x199c, 0xf40f, 0xf418, 0x606a, + 0x00a9, 0x00bf, 0x1ed0, 0x1ecf, 0x740c, 0x23da, 0x7ca6, 0x0677, + 0x0676, 0x8537, 0x06bb, 0x29ea, 0x8ee2, 0x099b, 0x96bc, 0x0a0f, + 0x0a5b, 0x9bd5, 0x0b4c, 0x0b6f, 0x0bd9, 0xa012, 0x0c82, 0xa34b, + 0xa341, 0xa3a1, 0xa4ec, 0x0e74, 0x0e72, 0xacd4, 0xacd8, 0xacd9, + 0x0e73, 0xacda, 0xae6c, 0xae6d, 0x0eb1, 0x0f2e, 0xb0e7, 0xb0eb, + 0xb0ec, 0xb162, 0x0f4e, 0xb42b, 0xb50d, 0xb7cd, 0xb9c3, 0xbf3f, + 0xbf3c, 0xbf3e, 0xbf3d, 0xbf3a, 0xbf38, 0xc344, 0xc345, 0x120b, + 0xc348, 0xc350, 0x126c, 0x4889, 0xc978, 0xc979, + /* 0x6b */ + 0x138b, 0xcc3e, 0x13d0, 0x142d, 0xd454, 0x14e4, 0x1571, 0xd9b9, + 0x5158, 0x156f, 0xde5f, 0x1687, 0x16a5, 0xe372, 0xe375, 0x171e, + 0x1765, 0x17b9, 0x17b7, 0x17b8, 0x17e4, 0xe8a3, 0xe8a5, 0xe9dc, + 0xe9dd, 0xea5a, 0x188c, 0x1889, 0x188a, 0xecdb, 0xecdc, 0x188b, + 0xefab, 0xef84, 0xef76, 0x1901, 0x18fe, 0x5ae7, 0x1903, 0x1906, + 0xef83, 0x5aea, 0x5af1, 0xf07f, 0x191d, 0x1943, 0xf173, 0xf1ad, + 0xf1b0, 0x194f, 0xf20f, 0xf20c, 0x195b, 0x1970, 0xf379, 0x1988, + 0xf377, 0xf37a, 0x1989, 0x5c44, 0xf432, 0xf427, 0xf42a, 0xf42c, + 0x5c6d, 0xf428, 0xf429, 0xf438, 0x642f, 0x6b7b, 0x740d, 0x23d9, + 0x77d6, 0x77d5, 0x83a1, 0x8c4c, 0x099e, 0x099f, 0x0aa7, 0x0b4b, + 0x0bdb, 0x0bda, 0xa0c0, 0x35d6, 0x0c8e, 0x0e76, 0xacf4, 0x0f30, + 0x0f2f, 0xb0f0, 0x0f66, 0xb23f, 0x117e, 0xc35d, + /* 0x6c */ + 0xc372, 0xc362, 0x453a, 0xc366, 0x4675, 0x126f, 0xc988, 0x13d1, + 0x142f, 0xcfe8, 0xcfe4, 0x14b2, 0x1518, 0x1517, 0xd6ff, 0x1576, + 0xdfaf, 0xdfae, 0x164f, 0x1689, 0xe1f2, 0xe248, 0xe381, 0xe37e, + 0x16f5, 0x171f, 0xe452, 0xe5ef, 0x575d, 0x17e5, 0xe8ad, 0xe9e6, + 0x1810, 0xe9ed, 0x180f, 0xe9e9, 0xea61, 0xea60, 0xeb33, 0x182f, + 0x1830, 0x5964, 0xed0b, 0xed08, 0x1893, 0x1894, 0xed07, 0x1907, + 0x1909, 0x1908, 0xefca, 0x190b, 0xefc6, 0x5b0a, 0xf084, 0xf0eb, + 0xf17d, 0x1950, 0x1971, 0xf29b, 0xf2a2, 0xf2a1, 0xf2a0, 0xf29c, + 0x197b, 0x197c, 0xf380, 0x5c73, 0xf440, 0x19a1, 0xf439, 0xf43c, + 0x19a0, 0x19a2, 0x64ca, 0x021b, 0x6b89, 0x0282, 0x853c, 0x8d40, + 0x9463, 0x9469, 0x0be9, 0xa353, 0x0c84, 0x35e1, 0xa817, 0xa81a, + 0xad00, 0x0eb3, 0x0f34, 0x0f33, 0x1180, 0xc36f, + /* 0x6d */ + 0xc6ab, 0x12ad, 0xc991, 0x1344, 0x1355, 0xcdb1, 0x13d2, 0xcfef, + 0xdbf1, 0xdbf2, 0xdfb7, 0xdfb5, 0x168a, 0xe386, 0xe45a, 0x1767, + 0xe7c6, 0xe7cb, 0x17e6, 0xe8b2, 0x1813, 0xe9f3, 0x582d, 0xed27, + 0x1897, 0x5b0c, 0xefd5, 0xefd8, 0x190c, 0xefec, 0xf087, 0xf0f2, + 0x1946, 0x195c, 0x1974, 0x1972, 0xf2ad, 0xf2b0, 0xf2fd, 0x5c1f, + 0xf387, 0xf44a, 0x19a4, 0x19a3, 0xf44e, 0xf449, 0xf451, 0xf44d, + 0x19b4, 0x6072, 0x0136, 0x7416, 0x8c6d, 0x8d41, 0x08b2, 0x9471, + 0x9474, 0x0b16, 0x3a70, 0x0e77, 0xae7c, 0x117f, 0xbf8a, 0xc756, + 0x147d, 0x5179, 0xd9fa, 0x544a, 0x168c, 0xe45b, 0x1768, 0x17be, + 0x1815, 0xeff5, 0xeff0, 0xf0f3, 0xf17f, 0xf213, 0x1975, 0x19a5, + 0x7419, 0x7f85, 0x83b0, 0x9477, 0xa4ff, 0x0e78, 0x0f35, 0x3c9d, + 0x1182, 0xbf87, 0x1183, 0xbf8b, 0x1271, 0xc99e, + /* 0x6e */ + 0x147e, 0x168e, 0xe38f, 0x5660, 0x1769, 0xe639, 0xe7d4, 0xe8f1, + 0xea02, 0xea6b, 0xeb40, 0x189a, 0x189b, 0xf010, 0xf2be, 0xf2b9, + 0x1990, 0xf464, 0x5c9e, 0x9be9, 0xbf90, 0x1186, 0x1185, 0xc01c, + 0x120e, 0xc392, 0xc6ae, 0xc9a3, 0x1519, 0xdfc9, 0x17c0, 0xe7d8, + 0xeb44, 0xf024, 0x5bf8, 0x5c3a, 0x5c7d, 0xf470, 0xf4d3, 0x0c0d, + 0x1816, 0xf2c3, 0x19a9, 0x19aa, 0x0c85, 0xad21, 0xb9ca, 0xc39c, + 0xea73, 0xf186, 0xf3c1, 0xea09, 0x5c96, 0xf4d5, 0x17c2, 0x1831, + 0x1911, 0x19ab, 0x189c, 0xdfd4, +}; + +static const ucs4_t cns11643_4b_2uni_upages[248] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x04c00, 0x04d00, 0x05000, 0x05100, 0x05200, 0x05300, 0x05600, 0x05800, + 0x05900, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06100, 0x06400, + 0x06500, 0x06600, 0x06900, 0x06a00, 0x06b00, 0x06f00, 0x07000, 0x07100, + 0x07200, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, + 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07e00, 0x07f00, 0x08000, 0x08100, + 0x08200, 0x08400, 0x08500, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, + 0x08b00, 0x08c00, 0x08d00, 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, + 0x09300, 0x09400, 0x09500, 0x09600, 0x09700, 0x09800, 0x09900, 0x09a00, + 0x09b00, 0x09c00, 0x09d00, 0x09e00, 0x09f00, 0x0ff00, 0x20000, 0x20300, + 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, + 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, + 0x21600, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21e00, 0x21f00, + 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22700, 0x22800, 0x22900, + 0x22a00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, + 0x23300, 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, + 0x23c00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24300, 0x24400, 0x24500, + 0x24600, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, + 0x24f00, 0x25000, 0x25200, 0x25300, 0x25500, 0x25600, 0x25700, 0x25800, + 0x25900, 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, + 0x26100, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, + 0x26900, 0x26a00, 0x26c00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, + 0x27200, 0x27300, 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, + 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, + 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, + 0x28a00, 0x28b00, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, + 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, + 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, + 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, +}; + diff --git a/Externals/libiconv-1.14/lib/cns11643_5.h b/Externals/libiconv-1.14/lib/cns11643_5.h new file mode 100644 index 0000000000..f0e5ebea91 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_5.h @@ -0,0 +1,1278 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 5 + */ + +static const unsigned short cns11643_5_2uni_page21[8603] = { + /* 0x21 */ + 0x3bd1, 0x3bcb, 0x3bc9, 0x3c0c, 0x3b00, 0x3b87, 0x3c0d, 0x3c0f, + 0xe21d, 0x5e98, 0x3bd2, 0x3c11, 0x3b7e, 0x45d3, 0x5052, 0x57fe, + 0x60a9, 0x7442, 0x3b09, 0x3bd6, 0x3fdd, 0x3fdc, 0x4002, 0x4073, + 0x4176, 0x41a7, 0x41a8, 0x4333, 0x43cc, 0x450d, 0x452c, 0x461b, + 0x015a, 0x461d, 0x4699, 0x4d3e, 0x582d, 0x582f, 0x5e99, 0x6eb3, + 0x74b6, 0x761b, 0x7fef, 0x83e9, 0x3b14, 0x3b94, 0x3be1, 0x4006, + 0x404a, 0x4044, 0x4131, 0x417a, 0x41ad, 0x41ae, 0x41b1, 0x4338, + 0x4337, 0x447d, 0x447e, 0x452d, 0x4532, 0x4623, 0x4626, 0xe23a, + 0x46a0, 0x51a8, 0x543f, 0x54bc, 0x56c4, 0x583b, 0x5b19, 0x5b18, + 0x5cb3, 0x5eaa, 0x5fbe, 0x60ac, 0x6525, 0x6566, 0x656b, 0x7443, + 0x74b5, 0x75ec, 0x7776, 0x08bc, 0x8114, 0x50dc, 0x821c, 0x821d, + 0x9fd0, 0xa112, 0xa5f3, 0xc169, 0x15b9, 0xc911, + /* 0x22 */ + 0xc915, 0xc910, 0xc913, 0x3ba4, 0x3ba5, 0x3cd0, 0x3cba, 0x3ccb, + 0x407b, 0x4186, 0x41bb, 0x41ba, 0x41c3, 0x41b9, 0x41c0, 0x00de, + 0x4339, 0x433b, 0x4341, 0x43d1, 0x43cf, 0x43d2, 0x442e, 0x446e, + 0x448c, 0x4488, 0x4535, 0x0143, 0x453a, 0x453b, 0x4538, 0x4539, + 0x462e, 0x462c, 0x46c8, 0x46b5, 0x46ad, 0x46b0, 0x46ab, 0x4cb3, + 0x4ca9, 0x51bb, 0x51b9, 0x565a, 0x56cd, 0x572b, 0x5805, 0x03ac, + 0x03aa, 0x5851, 0x584b, 0x5aea, 0x5aed, 0x5b36, 0x5b62, 0x5b56, + 0x5b55, 0x5b64, 0x5b58, 0x1c07, 0x5cda, 0x5cd8, 0x5ead, 0x5eab, + 0x5fc0, 0x5fc3, 0x60b3, 0x60b7, 0x60ba, 0x1dcb, 0x04fe, 0x60c7, + 0x60b5, 0x648e, 0x6573, 0x656c, 0x6574, 0xe2b4, 0x6572, 0x6571, + 0x6582, 0x6570, 0x6c3f, 0x6eba, 0x6eb8, 0x74b7, 0x8223, 0x8221, + 0x822b, 0x8226, 0x8222, 0x8825, 0x8be4, 0x8f15, + /* 0x23 */ + 0x9fe4, 0xa133, 0xa12a, 0xa132, 0xa129, 0xa5fb, 0xb45b, 0xb45c, + 0xb728, 0xc16f, 0xc16d, 0xc16b, 0xc16e, 0xc916, 0x3b22, 0x3c16, + 0x3c48, 0x3cd8, 0x3d00, 0x0041, 0x3f80, 0x3fe4, 0x00b4, 0x3fe7, + 0x400c, 0x4053, 0x40b7, 0x45e8, 0x41d1, 0x41e5, 0x41d8, 0x41d6, + 0x41da, 0x41d9, 0x41d5, 0x41e6, 0x41d4, 0x41d3, 0x4344, 0x43d6, + 0x43d7, 0x4413, 0x3afd, 0x4470, 0x4492, 0x44db, 0x44da, 0x4541, + 0x4543, 0x4633, 0x46f6, 0x46d4, 0x46dd, 0x46d0, 0x4704, 0x46d9, + 0x46db, 0x4705, 0x46d3, 0x46e1, 0x4d80, 0x4d77, 0x4d81, 0x4d82, + 0x4d83, 0xe25c, 0x5061, 0x5060, 0x51d8, 0x51d6, 0x51d7, 0x8105, + 0x544d, 0x5448, 0x56d6, 0x56cf, 0x56d9, 0x56d8, 0x573d, 0x03b3, + 0x5854, 0x585b, 0x585c, 0x03b4, 0x5859, 0x5858, 0x585a, 0x5855, + 0x5856, 0x5882, 0x5af0, 0x5b1c, 0x5b6a, 0x5b69, + /* 0x24 */ + 0x5b71, 0x5b67, 0x5b6c, 0x5b6e, 0x5b79, 0x5c8b, 0x5cb8, 0x5ce7, + 0x5ce8, 0x5ce4, 0x5ce6, 0x5ce5, 0x5cf0, 0x5e83, 0x5eb7, 0x5ebb, + 0x5eb9, 0x5ec5, 0x5f53, 0x5fc4, 0x5fc6, 0x5fcb, 0x60c8, 0xe29f, + 0x60c9, 0x60db, 0x6494, 0x6595, 0x6588, 0x658d, 0x69ec, 0x69ee, + 0x69f1, 0x6c2e, 0x6c49, 0x6e5f, 0x6ed1, 0x6ecb, 0x7385, 0x081d, + 0x744a, 0x7447, 0x744b, 0x74bb, 0x74c4, 0x087c, 0x7602, 0x7782, + 0x7791, 0x778f, 0x7792, 0x7c8f, 0x7c91, 0x7cb4, 0x7c92, 0x7ff4, + 0x80aa, 0x8235, 0x8237, 0x823d, 0x823c, 0x822f, 0x8230, 0x83f8, + 0x83ef, 0x8626, 0x0b55, 0x8826, 0x8827, 0x8a41, 0x8ac6, 0x8ac7, + 0x8beb, 0x8be8, 0x8bea, 0x8f1a, 0x8f19, 0x0d26, 0x9423, 0x9424, + 0x9925, 0xa135, 0xa134, 0xa507, 0xad1d, 0xb2e1, 0xb6ab, 0xbf60, + 0xc177, 0xc17d, 0x15bc, 0xc91e, 0xc91a, 0xc91d, + /* 0x25 */ + 0x3b6b, 0x3c2d, 0x3c4c, 0x3d2a, 0x004a, 0x3d15, 0x3d2c, 0x3d06, + 0x3d08, 0x3d0a, 0x004e, 0x4056, 0x4084, 0x00c9, 0x40c6, 0x41f5, + 0x4209, 0x41f8, 0x41e8, 0x41fb, 0x41e9, 0x41f6, 0x1ab7, 0x1ab8, + 0x4352, 0x1ab6, 0x1aba, 0x4354, 0x4351, 0x4439, 0x443a, 0x4498, + 0x454e, 0x017b, 0x4736, 0x470c, 0x4710, 0x4732, 0x4711, 0x4718, + 0x471c, 0x471a, 0x4719, 0x470b, 0x470f, 0x471d, 0x4721, 0x4713, + 0x471b, 0x4715, 0x0220, 0x4cd1, 0x4cc8, 0x4d8d, 0x4db5, 0x0289, + 0x0295, 0x50f8, 0x51e0, 0x51e1, 0x02be, 0x51de, 0x51fe, 0x51dc, + 0x5201, 0x51fd, 0x5200, 0x54d7, 0x54d6, 0x54d9, 0x5665, 0x56d2, + 0x56dc, 0x56e1, 0x56de, 0x5742, 0x574b, 0x03c3, 0x588e, 0x5891, + 0x588b, 0x5890, 0x5888, 0x5889, 0x5884, 0x58aa, 0x5b8d, 0x5b8f, + 0x5b7d, 0x5b7f, 0x5b7b, 0x5b80, 0x5b7e, 0x5b83, + /* 0x26 */ + 0x5b81, 0x5b86, 0x5b8a, 0x5cbd, 0x5cbe, 0x0477, 0x5cf4, 0x5cf3, + 0x5d02, 0x5cf6, 0x5cf5, 0x5cf2, 0x5d04, 0x5e3d, 0x5ec6, 0x5f89, + 0x5fd4, 0x5fd6, 0x5fd2, 0x60fa, 0x6106, 0x610c, 0x610a, 0x610f, + 0x652f, 0x05d4, 0x65b7, 0x65be, 0x65bc, 0x65e2, 0x6a06, 0x69f7, + 0x6a07, 0x69f6, 0x7635, 0x6c5f, 0x6c65, 0x6c64, 0x6c61, 0x6c5a, + 0x6c5d, 0xe2d7, 0x6ed7, 0x6ed5, 0x6ede, 0x6ee1, 0x6ee0, 0x6ed9, + 0x074c, 0x6eda, 0x6edf, 0x6ef6, 0x6f03, 0x0820, 0x7393, 0x738b, + 0x7391, 0x7392, 0x738a, 0x7389, 0x738f, 0x7456, 0x7459, 0x74ca, + 0x74cc, 0x085b, 0x74d0, 0x74cd, 0x74d6, 0x74cb, 0x7583, 0x7582, + 0x7606, 0x762a, 0x762c, 0x762b, 0x7629, 0x77bd, 0x77b3, 0x77be, + 0x77c0, 0x77b5, 0x77b6, 0x7c9d, 0x7c9f, 0x8120, 0x0a2d, 0x811e, + 0x811c, 0x8132, 0x811f, 0x812b, 0x8121, 0x8126, + /* 0x27 */ + 0x8124, 0x811d, 0x8127, 0x825b, 0x8259, 0x8280, 0x8255, 0x8250, + 0x825a, 0x8256, 0x8263, 0x8252, 0x8258, 0x0a63, 0x8239, 0x83f9, + 0x8628, 0x0b18, 0x86bc, 0x86d6, 0x8705, 0x8720, 0x0b74, 0x8833, + 0x8a46, 0x8a42, 0x8a43, 0x8a47, 0x8acb, 0x8b42, 0x8b45, 0x8bfd, + 0x8bf4, 0x8bf9, 0x8bfa, 0x8e5e, 0x8f1d, 0x0d28, 0x9258, 0x9255, + 0x9557, 0x9558, 0x95d9, 0x95dc, 0x95db, 0x9927, 0x9a85, 0x9a87, + 0x9a8a, 0x9d8b, 0x9e4f, 0xa030, 0xa02f, 0xa168, 0xa149, 0x0fda, + 0xa148, 0xa13f, 0xa14b, 0xa15c, 0xa146, 0xa140, 0xa50d, 0xa61b, + 0xa61d, 0xa617, 0x10a4, 0xa622, 0xb0a7, 0xb108, 0xb306, 0xbf7d, + 0x148e, 0xbf63, 0xbf64, 0xbf7f, 0xbf6b, 0xbf7c, 0xbf68, 0xbf65, + 0xbf6a, 0xc198, 0xc199, 0xc1ae, 0xc92b, 0xc92d, 0xc931, 0xc92e, + 0xc92f, 0x3b6d, 0x3c31, 0x3d2d, 0x3d39, 0x3d38, + /* 0x28 */ + 0x005b, 0x3d3a, 0x3d35, 0x3d62, 0x3fea, 0x3feb, 0x4015, 0x40cc, + 0x40c8, 0x40cd, 0x40db, 0x40cb, 0x4211, 0x4226, 0x4362, 0x435e, + 0x4361, 0x4441, 0x443f, 0x4475, 0x7465, 0x4649, 0x44eb, 0x451a, + 0x4557, 0x476b, 0x47a9, 0x4754, 0x4762, 0x47aa, 0x4758, 0x4772, + 0x4763, 0x4773, 0x478b, 0x478c, 0x475c, 0x4751, 0x4716, 0x4760, + 0x4761, 0x475e, 0x475d, 0x4764, 0x4753, 0x475f, 0x475b, 0x476e, + 0x4755, 0x4752, 0x4768, 0x4cd2, 0x4cd6, 0x4cd3, 0x4db8, 0x4dbb, + 0x4deb, 0x4de8, 0x4db6, 0x4dea, 0x4de7, 0x4de9, 0x5091, 0x5110, + 0x510e, 0x510f, 0x520b, 0x5203, 0x522b, 0x5209, 0x5228, 0x522c, + 0x5225, 0x5227, 0x520f, 0x54e9, 0x54ec, 0x0353, 0x5627, 0x5673, + 0x56e2, 0x56e6, 0xe276, 0x5761, 0x5751, 0x5812, 0x580e, 0x58ad, + 0x58af, 0x58b1, 0x58d3, 0x5b94, 0x5b92, 0x5b90, + /* 0x29 */ + 0x5b9d, 0x5b93, 0x5b95, 0x5b98, 0x5b97, 0x0480, 0xe28a, 0x5d07, + 0x5d0b, 0x5d08, 0x5ed9, 0x5ed5, 0x5fd7, 0x5fdf, 0x04dd, 0x5fde, + 0x5fe3, 0x5fe2, 0x04de, 0x6147, 0x0522, 0x613d, 0x6138, 0x6544, + 0x653a, 0x65b8, 0x662a, 0x6600, 0x65f3, 0x65f2, 0x65eb, 0x65fa, + 0x65ed, 0x65ec, 0x65ff, 0x65fb, 0x1f06, 0x664e, 0x65ef, 0x65f7, + 0x6a10, 0x6a11, 0x6a0c, 0x6a0b, 0x6bdd, 0x6c30, 0x06db, 0x6c7a, + 0x6c77, 0x6e28, 0x6e27, 0x6e65, 0x6f0e, 0x6f0b, 0x6f41, 0x6f13, + 0x6f0f, 0x6f12, 0x6f30, 0x73a0, 0x73a3, 0x739e, 0x7397, 0x73a1, + 0x739d, 0x739b, 0x7463, 0x74e3, 0x74e4, 0x74e6, 0x74e7, 0x74dd, + 0x2185, 0x74ec, 0x74e5, 0x74f1, 0x763b, 0x7639, 0x763a, 0x763c, + 0x763d, 0x7647, 0x763f, 0x7644, 0x7748, 0x7749, 0x7760, 0x77e3, + 0x77e9, 0x77f0, 0x08da, 0x08db, 0x77f2, 0x77ed, + /* 0x2a */ + 0x77ec, 0x77e6, 0x7816, 0x08d7, 0x7cbc, 0x7cbe, 0x7cc0, 0x7ce0, + 0x8000, 0x8002, 0x7ffe, 0x805e, 0x80b3, 0x80b7, 0x813a, 0x8139, + 0x813e, 0x8138, 0x813d, 0x814f, 0x826e, 0x825f, 0x8281, 0x8282, + 0x8271, 0x827b, 0x8279, 0x8277, 0x8273, 0x826f, 0x8297, 0x827e, + 0x83fc, 0x8411, 0x8432, 0x8431, 0x8410, 0x85ec, 0x85eb, 0x862c, + 0x862d, 0x86da, 0x872e, 0x872c, 0x872a, 0x8733, 0x874b, 0x8818, + 0x8842, 0x883b, 0x883f, 0x8841, 0x8843, 0x883c, 0x8a4c, 0x8a4a, + 0x8a49, 0x8a56, 0x8acf, 0x8b47, 0x8b48, 0x8b46, 0x8c1b, 0x8c11, + 0x8c14, 0x8c1d, 0x8c17, 0x8c1e, 0x8c0b, 0x8c1c, 0x8c12, 0x8c16, + 0x8c0d, 0x8c15, 0x8c13, 0x8c18, 0x0c1a, 0x8eac, 0x8f44, 0x8f2c, + 0x8f45, 0x9266, 0x926e, 0x9265, 0x9268, 0x9284, 0x9438, 0x943b, + 0x943a, 0x943f, 0x95df, 0x95dd, 0x95de, 0x95e2, + /* 0x2b */ + 0x0dd6, 0x992c, 0x992f, 0x9a8f, 0x9a90, 0x9a8c, 0x9a93, 0x9d25, + 0x9d88, 0x9da7, 0x9ef7, 0x9fbb, 0xa038, 0xa039, 0xa037, 0xa114, + 0xa16e, 0xa17b, 0x0fde, 0xa16c, 0xa17f, 0xa178, 0xa17a, 0xa16f, + 0x0fe5, 0xa3fe, 0xa648, 0xa64b, 0xa641, 0xa649, 0xa63b, 0xad2d, + 0xb0e3, 0xb11a, 0xb10d, 0xb113, 0xb111, 0xb11c, 0x1272, 0xb3b5, + 0x12af, 0xb729, 0xb7a1, 0xb824, 0xbabb, 0xbda1, 0xbf83, 0xbf8d, + 0xbf87, 0xbf85, 0xbf8a, 0xbfa3, 0xbf89, 0xbf84, 0xbfa2, 0xc1b1, + 0xc1b0, 0xc1af, 0xc1b6, 0xc1c9, 0xc1ca, 0xc1c8, 0xc1b4, 0xc759, + 0xc7c9, 0xc941, 0xc94c, 0x15c4, 0xc945, 0xc95a, 0x3bb9, 0x3d94, + 0x3d6e, 0x3da2, 0x3d67, 0x0063, 0x3da3, 0x3d76, 0x3d6c, 0x3d64, + 0x3da5, 0x3d30, 0x3da6, 0x3d69, 0x3da4, 0x3f90, 0x405f, 0x4060, + 0x40da, 0x40d8, 0x40dd, 0x00ec, 0x4259, 0x425b, + /* 0x2c */ + 0x425a, 0x4239, 0x4234, 0x4244, 0x4233, 0x423c, 0x4258, 0x426a, + 0x436f, 0x4372, 0x4370, 0x4371, 0x436e, 0x43f0, 0x43eb, 0x4449, + 0x444c, 0x44f5, 0x4520, 0x456a, 0x4572, 0x464b, 0x465d, 0x4750, + 0x47f9, 0x47fa, 0x47fb, 0x4823, 0x47b7, 0x4822, 0x47b5, 0x47c4, + 0x47b4, 0x47ef, 0x0198, 0x47cd, 0x47f0, 0x47b8, 0x47cb, 0x47f1, + 0x47ba, 0x4803, 0x47f8, 0x47b6, 0x47bc, 0x47b3, 0x4821, 0x47f7, + 0x47c2, 0x47be, 0x47c9, 0x47bd, 0x47ce, 0x47b9, 0x47c7, 0x47ca, + 0x47cc, 0x4826, 0x4ce4, 0x4ce0, 0x4cf0, 0x4dec, 0x4e24, 0x4e18, + 0x4e2f, 0x4e25, 0x5028, 0x5022, 0x506a, 0x3c57, 0x5094, 0x5092, + 0x509c, 0x5122, 0x5130, 0x511d, 0x5123, 0x5235, 0x5233, 0x522f, + 0x524d, 0x5231, 0x525b, 0x525a, 0x5232, 0x525c, 0x5259, 0x525d, + 0x5469, 0x546d, 0x5d32, 0x0358, 0x550a, 0x5520, + /* 0x2d */ + 0x551f, 0x550d, 0x56e8, 0x56ec, 0x5777, 0x5770, 0x5771, 0x58f8, + 0x58d6, 0x58d9, 0x58de, 0x58d5, 0x58e1, 0x03d3, 0x58e2, 0x58dd, + 0x58e0, 0x590e, 0x5908, 0x58dc, 0x590a, 0x590c, 0x5bb4, 0x5bb1, + 0x5bb6, 0x5bbc, 0x5d1d, 0x5d24, 0x5d19, 0x5d1b, 0x5d22, 0x5d1a, + 0x5d1c, 0x5d21, 0x5ee6, 0x5ee4, 0x5ee7, 0x5eea, 0x04e2, 0xe29b, + 0x5ff0, 0x5ff5, 0x5fef, 0x6142, 0x616e, 0x613c, 0x6197, 0x618c, + 0x6181, 0x6171, 0x61ce, 0x61ba, 0x617a, 0x617e, 0x0554, 0x6172, + 0x61bb, 0x052f, 0x6173, 0x6182, 0x05b6, 0x64ba, 0x64b8, 0x654b, + 0x6548, 0x662b, 0x65f4, 0x662c, 0x6642, 0x6648, 0x6644, 0x6645, + 0x663c, 0x6637, 0x6633, 0x6641, 0x6632, 0x6687, 0x6a27, 0x6a23, + 0x6a2d, 0x6a1f, 0x6a2c, 0x6a28, 0x6b75, 0x6b74, 0x6be7, 0x6c32, + 0x6c31, 0x6c99, 0x6c96, 0x6c98, 0x6c9d, 0x6c92, + /* 0x2e */ + 0x6c94, 0x6c95, 0x6c97, 0xa1b9, 0x0735, 0x6f11, 0x6f3b, 0x6f79, + 0x6f42, 0x6f43, 0x075d, 0x6f78, 0x73ac, 0x0829, 0x73b1, 0x73b4, + 0x73b3, 0x73af, 0x73aa, 0x73b2, 0x7468, 0x74f2, 0x74fe, 0x74f8, + 0x74f9, 0x74ff, 0x74f5, 0x74f7, 0x74fd, 0x7500, 0x7588, 0x766e, + 0x765d, 0x7663, 0x7660, 0x7761, 0x7837, 0x7871, 0x7823, 0x7822, + 0x781f, 0x7825, 0x7cfd, 0x7d11, 0x7d23, 0x7cf0, 0x7cef, 0x800e, + 0x800c, 0x80ba, 0x0a1f, 0x8152, 0x8155, 0x8153, 0x8154, 0x8151, + 0x8158, 0x82b0, 0x829f, 0x0a72, 0x82a1, 0x829a, 0x82be, 0x82a0, + 0x8437, 0x0b0b, 0x85f1, 0x85f2, 0x8634, 0x8637, 0x8635, 0x5e8c, + 0x86df, 0x874c, 0x874e, 0x8764, 0x8763, 0x8736, 0x8858, 0x8868, + 0x885b, 0x885f, 0x8859, 0x8865, 0x8860, 0x885e, 0x8ad5, 0x8ad6, + 0x8b4e, 0x8b52, 0x8c35, 0x8c39, 0x8c58, 0x8c41, + /* 0x2f */ + 0x8c57, 0x8c38, 0x8c3d, 0x8c32, 0x8c44, 0xe344, 0x8e63, 0x8e62, + 0x8eb8, 0x8eb0, 0x8eb1, 0x8f4d, 0x8f63, 0x8f70, 0x8f4b, 0x8f4f, + 0x8f4e, 0x8f53, 0x8f47, 0x0ca2, 0x8f54, 0x8f52, 0x8f59, 0x8f7e, + 0x912b, 0x912e, 0x927f, 0x927e, 0x9281, 0x9283, 0x9447, 0x9454, + 0x944d, 0x944c, 0x944b, 0x9457, 0x9565, 0x9564, 0x9561, 0x9562, + 0x95f0, 0x95f3, 0x95f9, 0x95f4, 0x95f5, 0x95ef, 0x95f8, 0x95fc, + 0x95f7, 0x95fd, 0x9617, 0x9934, 0x9936, 0x9938, 0x9aaf, 0x9aae, + 0x9aac, 0x9aa2, 0x9d28, 0x69c2, 0x9d9c, 0x9db3, 0x9d90, 0x9f06, + 0x9f04, 0x9f0b, 0x9f05, 0xa040, 0xa04f, 0xa1ab, 0xa19d, 0xa1b8, + 0xa1b2, 0xa1d2, 0xa1cf, 0xa1a2, 0x0fec, 0xa1a5, 0xa1a9, 0xa1a7, + 0xa1d0, 0xa402, 0xa4cf, 0xa4d0, 0xa516, 0xa519, 0xa675, 0xa671, + 0xa691, 0xa672, 0xa68e, 0xa66d, 0xa688, 0xa673, + /* 0x30 */ + 0x10bb, 0xa681, 0xa676, 0xa67b, 0xa67f, 0xa690, 0xa678, 0xad4b, + 0xad48, 0xad5b, 0xad51, 0xad3d, 0xad40, 0xad46, 0xad4d, 0xad3b, + 0xad4a, 0xad41, 0xad3e, 0xad4e, 0xb0ac, 0xb0e6, 0xb0e9, 0xb129, + 0x1221, 0xb133, 0xb12e, 0xb11e, 0x121f, 0xe3c5, 0xb122, 0xb127, + 0xb2e7, 0xb30b, 0xb466, 0xb6ad, 0xb6ae, 0x3038, 0xb72b, 0xb72a, + 0xb82c, 0xb82d, 0x1391, 0x1396, 0xb98f, 0xb993, 0xbac6, 0xbac5, + 0xbd15, 0xbd13, 0xbdb1, 0xbda9, 0x31ce, 0xbfa8, 0xbfab, 0xbfbe, + 0xbfac, 0xbfa9, 0xbfa6, 0xbfc1, 0xc1cc, 0xc1d1, 0xc1d3, 0xc1e4, + 0xc1cb, 0xc1e1, 0xc1d2, 0xc1e3, 0xc1cf, 0xc1d0, 0xc1e5, 0xc20e, + 0xc7cc, 0xc7ca, 0xc7cb, 0xc95c, 0xc961, 0xc95d, 0xc959, 0xcb77, + 0xd184, 0x3b41, 0x3bfd, 0x3c1a, 0x3c63, 0x3db6, 0x3db2, 0x3de9, + 0x3de7, 0x3dd6, 0x3e30, 0x3dec, 0x3ddd, 0x3de8, + /* 0x31 */ + 0x3db0, 0x3db5, 0x3de1, 0x3f98, 0x3f99, 0x00bc, 0x4093, 0x40e5, + 0x00d8, 0x4260, 0x425e, 0x00f4, 0x437b, 0x43f1, 0x43f3, 0x457f, + 0xe238, 0x4657, 0x4658, 0x4839, 0x48a7, 0x4835, 0x4860, 0x4851, + 0x4862, 0x4842, 0x483c, 0x4843, 0x48ab, 0x48a9, 0x48b4, 0x4879, + 0x486a, 0x483b, 0x48aa, 0x4833, 0x4837, 0x4827, 0x48a8, 0x4870, + 0x482f, 0x4836, 0x48b5, 0x4830, 0x483a, 0x4838, 0x48b1, 0x48ac, + 0x482e, 0x4875, 0x48b0, 0x4cf7, 0x4d00, 0x4cf1, 0x4cf3, 0x4e60, + 0x4e61, 0x4e32, 0x4e2d, 0x4e4a, 0x4e2a, 0x5067, 0x50a2, 0x50a3, + 0x509e, 0x50a4, 0x5144, 0x5132, 0x529b, 0x5298, 0x5299, 0x529a, + 0x5266, 0x5262, 0x526b, 0x8062, 0x5267, 0x553b, 0x5523, 0x5529, + 0x567e, 0x56f3, 0x0385, 0x56f5, 0x0383, 0x5780, 0x577e, 0x577c, + 0x577f, 0x577d, 0x5781, 0x5925, 0x5929, 0x5917, + /* 0x32 */ + 0x5963, 0x5967, 0x5965, 0x592a, 0x5968, 0x5926, 0x5964, 0x591b, + 0x5962, 0x5969, 0x5afe, 0x5b44, 0x5b42, 0x5bb7, 0x5bd2, 0x5bd4, + 0x5bd7, 0x5bdc, 0x5bd1, 0x5bd5, 0x5bcd, 0x5bd8, 0x5c9a, 0x5d42, + 0x5d35, 0x5d58, 0x5d34, 0x5d3c, 0x5d3b, 0x5d3e, 0x5d3d, 0x5d5a, + 0x5d41, 0x5d38, 0x5d45, 0x5d33, 0x5e26, 0x04ba, 0x5ef7, 0x5eef, + 0x5ef0, 0x5eee, 0x5f9d, 0x6006, 0x6011, 0x6008, 0x6002, 0x600a, + 0x6007, 0x6191, 0x618e, 0x6185, 0x61e8, 0x6217, 0x61d4, 0x0569, + 0x61c4, 0x61d5, 0x0545, 0x61d8, 0x6180, 0x61de, 0x6242, 0x64c7, + 0x64bf, 0x668d, 0x6689, 0x6690, 0x669a, 0x66c8, 0x6692, 0x66a1, + 0x6684, 0x6a57, 0x6a47, 0x6a77, 0x6a3a, 0x6a50, 0x6a42, 0x6a43, + 0x6aa3, 0x6b77, 0x6cb2, 0x6ce2, 0x6cbd, 0x6e74, 0x6f82, 0x6fb8, + 0x076c, 0x6fba, 0x6fb9, 0x6fbb, 0x6f87, 0xe2e4, + /* 0x33 */ + 0x6f83, 0x6fb7, 0x3b43, 0x73ce, 0x73ba, 0x7473, 0x7509, 0x750a, + 0x750b, 0x7507, 0x7505, 0x750e, 0x7597, 0x7677, 0x767b, 0x767a, + 0x7674, 0x7679, 0x7886, 0x78f5, 0x78a5, 0x789d, 0x78be, 0x7896, + 0x78e1, 0x78a4, 0x78a1, 0x78f6, 0x0904, 0x788d, 0x788b, 0x7878, + 0x7898, 0x790a, 0x7d5d, 0x7d27, 0x7d5f, 0x80c0, 0x80c1, 0x816d, + 0x815e, 0x818a, 0x8162, 0x8164, 0x0a3a, 0x82c0, 0x82ca, 0x82d1, + 0x0a79, 0x82c7, 0x82ce, 0x2309, 0x82c5, 0x8436, 0x8457, 0x8477, + 0x85f6, 0x85f7, 0x8655, 0x8644, 0x863e, 0x8642, 0x8652, 0x86e1, + 0x8708, 0x8768, 0x8767, 0x0b5d, 0xe337, 0x887e, 0x8893, 0x8879, + 0x8881, 0x887d, 0x887b, 0x8894, 0x0b8a, 0x8a66, 0x8ad9, 0x8ae0, + 0xe33e, 0x8b5f, 0x8c5f, 0x8c5e, 0x8c68, 0x0c27, 0x8c88, 0x8c6a, + 0x8c6c, 0x8c66, 0x8c67, 0x8c89, 0x8c60, 0x8c85, + /* 0x34 */ + 0x3e2a, 0x8e68, 0x8eb9, 0x8eba, 0x8ebe, 0x8f6f, 0x8f80, 0x8f74, + 0x8f81, 0x8f7a, 0x8f9c, 0x8f73, 0x8f82, 0x8f7f, 0x8fa7, 0x8f79, + 0x8f78, 0x8f7d, 0x8fa8, 0x8f7c, 0x9168, 0x914e, 0x929e, 0x0d46, + 0x0d40, 0x9298, 0x0d3f, 0x9285, 0x929c, 0x92c5, 0x929a, 0x9468, + 0x9465, 0x9467, 0x9461, 0x9460, 0x0d9d, 0x0dcb, 0x957b, 0x0de1, + 0x9619, 0x960e, 0x9631, 0x9612, 0x9610, 0x9615, 0x963f, 0x961d, + 0x961e, 0x994d, 0x9948, 0x9945, 0x9942, 0x9949, 0x994a, 0x9947, + 0x0e7f, 0x994c, 0x9acd, 0x9ad5, 0x9ac4, 0x9aca, 0x9ac3, 0x0f46, + 0x9d29, 0x9db4, 0x9e6d, 0x9e66, 0x9e6a, 0x9f15, 0x9fd3, 0x9fec, + 0xa055, 0x101a, 0xa1d6, 0xa1d8, 0xa251, 0xa1e0, 0xa203, 0xa204, + 0xa1da, 0xa1ea, 0xa202, 0xa1d3, 0xa1e4, 0xa1e5, 0xa43b, 0xa466, + 0xa52c, 0xa521, 0xa526, 0xa5d4, 0xa5d5, 0xa5d9, + /* 0x35 */ + 0xa6d5, 0xa6eb, 0xa6c5, 0x10d3, 0xa727, 0xa6f0, 0xa6b9, 0xa718, + 0xa6ee, 0x10d0, 0xa6b7, 0xa6bb, 0xa6ef, 0xa6b8, 0xa6df, 0xa6da, + 0xa6e3, 0xa6c9, 0xa6ec, 0xaca4, 0x118e, 0xaca3, 0xad5e, 0xad61, + 0xad62, 0xad63, 0xad8e, 0xad69, 0xad6b, 0xad85, 0xad8d, 0xad64, + 0xad6d, 0xb14c, 0xb149, 0xb147, 0xb148, 0xb142, 0xb145, 0xb15b, + 0xb15d, 0xb146, 0xb313, 0xb31a, 0xb30e, 0xb30f, 0xb31b, 0xb312, + 0xb3c3, 0xb3be, 0xb3bd, 0xb479, 0xb47c, 0x12c3, 0x12b6, 0xb480, + 0xb475, 0xb49b, 0x2f2f, 0xb474, 0x12c0, 0x12b8, 0x5b41, 0x5f94, + 0xb730, 0xb7a7, 0xb7a5, 0xb7a4, 0xb83a, 0xb95b, 0xb99f, 0xb9a8, + 0xb9b3, 0xb9a1, 0xb9a7, 0xb9b2, 0xb99d, 0xb9a3, 0xb9a2, 0xbaef, + 0xbad9, 0x13d9, 0xbad5, 0xbadd, 0xbada, 0xbaee, 0xbad7, 0xbd1a, + 0xbd19, 0xbd18, 0xbdb3, 0xbdbf, 0xbdbb, 0xbdc0, + /* 0x36 */ + 0xbdb9, 0xbdb8, 0xbdd5, 0xbf11, 0xbf10, 0xbfc3, 0xbfc2, 0xbfe9, + 0xbfcd, 0xbfe5, 0xbfca, 0xbfc7, 0xbfe8, 0xc1f1, 0xc20c, 0xc1ef, + 0xc1ee, 0xc1f3, 0xc20d, 0xc1f6, 0xc1f0, 0x14ec, 0xc2f5, 0xc2f4, + 0xc2f8, 0xc2fe, 0xc411, 0xc422, 0xc442, 0xc75c, 0xc75a, 0xc75d, + 0xc7d1, 0xc7d0, 0xc975, 0xc97b, 0xca89, 0xcf4d, 0xd189, 0xd192, + 0xd18c, 0xd188, 0xd367, 0xd368, 0x3e21, 0x3df2, 0x3e09, 0x3df8, + 0x3df0, 0x3df3, 0x3df5, 0x3dfb, 0x3df7, 0x3def, 0x3e0b, 0x3fa2, + 0x40f5, 0x40f3, 0x40f4, 0x40f2, 0x4198, 0x4268, 0x4280, 0x4285, + 0x428e, 0x428f, 0x3df4, 0x4286, 0x42a4, 0x4386, 0x4389, 0x4387, + 0x4385, 0x1adc, 0x4388, 0x45ff, 0x4666, 0x01cc, 0x48c3, 0x01a2, + 0x48c4, 0x493b, 0x48e7, 0x48f8, 0x48fb, 0x01b6, 0x48be, 0x48c6, + 0x01c5, 0x01c6, 0x48fc, 0x48c0, 0x4933, 0x48c9, + /* 0x37 */ + 0x48fe, 0x48da, 0x48cc, 0x48bb, 0x48fd, 0x48df, 0x48cd, 0x48c2, + 0x48c8, 0x4932, 0x492d, 0x48d2, 0x4931, 0x48d3, 0x492e, 0x48cf, + 0x4cff, 0x4d09, 0x4cfc, 0x4e72, 0x4eaa, 0x4eab, 0x4ea7, 0x4e7b, + 0x4e76, 0x4ea8, 0x4eac, 0x0283, 0x1b21, 0x50aa, 0x4503, 0x50ac, + 0x50ad, 0x50ab, 0x5150, 0x5158, 0x52dd, 0x02f8, 0x52ae, 0x52a2, + 0x52ab, 0x52e3, 0x52af, 0x52e0, 0x52e4, 0x02f6, 0x52a7, 0x52aa, + 0x52e2, 0x52e1, 0x52df, 0x52ad, 0x52e5, 0x52d1, 0x52ac, 0x52d5, + 0x52a3, 0x529f, 0x5479, 0x5476, 0x5543, 0x553d, 0x5547, 0x5544, + 0x553f, 0x555b, 0x567f, 0x579a, 0x579c, 0x039b, 0x581e, 0x5988, + 0x596a, 0x5976, 0x5972, 0x5970, 0x597e, 0x596c, 0x596f, 0x5975, + 0x5977, 0x5978, 0x598a, 0x5979, 0x5994, 0x5b01, 0x5c05, 0x5bf1, + 0x5bee, 0x5bef, 0x5c04, 0x1c3f, 0x5bfa, 0x5c07, + /* 0x38 */ + 0x5bf4, 0x5bf5, 0x5c9c, 0x5d6d, 0x5d69, 0x5d66, 0x5d62, 0x5d46, + 0x048d, 0x5d65, 0x5d5d, 0x5d5e, 0x5d5f, 0x5e8e, 0x5f02, 0x5f06, + 0x5f04, 0x5f03, 0x5f62, 0x6027, 0x6021, 0x6020, 0x6024, 0x6029, + 0x6031, 0x6023, 0x6022, 0x61dc, 0x624d, 0x61e5, 0x61d3, 0x61ee, + 0x61e6, 0x0556, 0x6236, 0x6240, 0x633f, 0x623d, 0x6244, 0x055b, + 0x625f, 0x6229, 0x6249, 0x628a, 0x622a, 0x6287, 0x624c, 0x6231, + 0x6248, 0x622b, 0x623b, 0x6241, 0x61c9, 0x6234, 0x6253, 0x6235, + 0x6247, 0x6238, 0x64d1, 0x64d2, 0x6551, 0x6555, 0x6552, 0x6553, + 0x668f, 0x66f4, 0x6747, 0x670d, 0x671c, 0x66fb, 0x6719, 0x66f7, + 0x66f9, 0x66f5, 0x66e9, 0x670a, 0x66ee, 0x670b, 0x66fd, 0x6706, + 0x6702, 0x6716, 0x6718, 0x66f0, 0x69d4, 0x6a66, 0x6a6a, 0x6a75, + 0x6a76, 0x6a80, 0x6a6d, 0x0696, 0x6a69, 0x6a67, + /* 0x39 */ + 0x6a68, 0x6a5d, 0x6ba4, 0x6bfe, 0x6bfd, 0x6cec, 0x6ce9, 0x6d21, + 0x6ceb, 0x6ce7, 0x6cf2, 0x6d20, 0x6e7a, 0x702d, 0x702e, 0x6fca, + 0x702f, 0x6fc8, 0x077e, 0x6fcb, 0x6fc3, 0x6f84, 0x6fd2, 0x6fc6, + 0x0781, 0x6fcf, 0x6fd5, 0x6fd4, 0x6fdd, 0x702b, 0x70a3, 0x6fdb, + 0x702c, 0x7013, 0x0835, 0x73d1, 0x73cc, 0x73d5, 0x73c9, 0x73cf, + 0x73d2, 0x747b, 0x747c, 0x7523, 0x751d, 0x751c, 0x751e, 0x7522, + 0x7524, 0x7520, 0x7518, 0x7521, 0x7688, 0x768a, 0x7694, 0x768f, + 0x768e, 0x7690, 0x089b, 0x76a7, 0x7764, 0x0900, 0x7918, 0x7914, + 0x791d, 0x7905, 0x78ff, 0x791b, 0x791a, 0x7919, 0x7903, 0x790e, + 0x7947, 0x7904, 0x795a, 0x7907, 0x7920, 0x7d6a, 0x7d66, 0x7d7a, + 0x7d65, 0x7daf, 0x80cd, 0x80cf, 0x80d1, 0x80ce, 0x815f, 0x8177, + 0x8174, 0x8188, 0x8175, 0x8189, 0x8172, 0x82c6, + /* 0x3a */ + 0x82ea, 0x82e0, 0x8307, 0x82e6, 0x82e5, 0x82dd, 0x82e3, 0x82da, + 0x84ae, 0x847e, 0x847d, 0x847f, 0x0ad3, 0x84d9, 0x85fa, 0x85fb, + 0x864d, 0x8654, 0x8651, 0x8650, 0x8898, 0x8895, 0x889d, 0x88c1, + 0x889a, 0x889b, 0x0b9f, 0x889c, 0x88d7, 0x88a4, 0x8896, 0x88a0, + 0x8a31, 0x8ae9, 0x8b6e, 0x8c9a, 0x8ca5, 0x8c94, 0x8ca6, 0x8c99, + 0x8c8b, 0x8c98, 0x8c91, 0x8c8c, 0x8ca1, 0x8ca3, 0x8cc6, 0x8e6f, + 0x8e6d, 0x8e6a, 0x8e6c, 0x8e71, 0x8e6e, 0x8edf, 0x8fac, 0x8faa, + 0x0cb1, 0x8fb5, 0x8fad, 0x8fb2, 0x8fb3, 0x8fab, 0x8fb6, 0x8fc7, + 0x8fc6, 0x916c, 0x9170, 0x92b3, 0x0d4b, 0x948c, 0x9481, 0x9483, + 0x947d, 0x9485, 0x9490, 0x94a2, 0x948d, 0x948f, 0x947e, 0x948a, + 0x947f, 0x9476, 0x9487, 0x9478, 0x9580, 0x9582, 0x9581, 0x9583, + 0x965a, 0x9634, 0x962c, 0x962a, 0x9640, 0x962d, + /* 0x3b */ + 0x9633, 0x962b, 0x964b, 0x283f, 0x963c, 0x995a, 0x9977, 0x9960, + 0x9afa, 0x9af9, 0x9afc, 0x0ed6, 0x9af5, 0x9ae8, 0x9b09, 0x9ae7, + 0x9ae6, 0x9ae9, 0x9d32, 0x9d2c, 0x9dbd, 0x9dbc, 0x9e7a, 0x9e7e, + 0x9e79, 0x0f89, 0x9f23, 0x9f30, 0x9f28, 0x9fd4, 0xa5ce, 0x9ff1, + 0x9ff0, 0xa060, 0xa065, 0xa1a8, 0xa20a, 0xa21b, 0xa212, 0xa207, + 0xa24f, 0xa20e, 0xa252, 0xa216, 0x1000, 0xa253, 0xa254, 0xe384, + 0xa256, 0xa46d, 0xa472, 0xa52f, 0xa72a, 0x10dc, 0xa763, 0xa784, + 0xa7af, 0xa745, 0xa770, 0xa756, 0xa716, 0xa73d, 0xa738, 0xa76f, + 0xa777, 0xa72e, 0xa731, 0xa74c, 0xa75f, 0xa775, 0xa739, 0xa73a, + 0xa72c, 0xa72d, 0xa73f, 0xa72f, 0xa730, 0xa73e, 0x2ad0, 0x1190, + 0xacb2, 0xadb7, 0xad8f, 0x11b1, 0xad96, 0xad9e, 0xad97, 0xad95, + 0xada5, 0xad98, 0x2be7, 0xada3, 0xad9a, 0xadad, + /* 0x3c */ + 0xada6, 0xadb6, 0xad99, 0xadaf, 0xadac, 0x11aa, 0xad9f, 0xad94, + 0xb0eb, 0xb16f, 0xb16d, 0xb17e, 0xb16c, 0xb161, 0xb163, 0xb16b, + 0xb15e, 0xb13e, 0xb164, 0xb1ad, 0x127d, 0xb320, 0xb3d1, 0xb3d5, + 0xb4ae, 0xb4af, 0xb49f, 0xb4a8, 0xb4ca, 0xb6e1, 0xb739, 0xb738, + 0xb73b, 0xb7ad, 0xb7b5, 0xb7af, 0xb7b1, 0xb7ae, 0xb7b4, 0xb7b0, + 0xb84b, 0xb851, 0xb84c, 0x1369, 0xb860, 0xb9be, 0xb9b9, 0xb9b7, + 0xb9b6, 0x13a1, 0xb9bd, 0xb9b8, 0xb9c1, 0xbaf7, 0xbaf3, 0xbaf4, + 0xbafb, 0xbafd, 0xbaf5, 0x13e7, 0xbafa, 0xbb14, 0x13ec, 0xbaf2, + 0xbafc, 0xbb00, 0x13df, 0xbd2b, 0xbd29, 0xbd2e, 0x1433, 0xbdd7, + 0xbddb, 0xbdd9, 0xbdd8, 0xbde6, 0xbdd6, 0xbdd1, 0xbde7, 0xbdd0, + 0xbddc, 0xbfed, 0xc01a, 0xc019, 0xc016, 0xbfec, 0xbfef, 0xbfee, + 0xbff4, 0xc02f, 0xc230, 0xc219, 0xc218, 0xc211, + /* 0x3d */ + 0xc216, 0xc212, 0xc210, 0xc214, 0xc30c, 0xc30d, 0xc410, 0xc429, + 0xc428, 0xc765, 0xc766, 0xc7de, 0xc7df, 0xc7e0, 0xc7d9, 0xc7db, + 0xc7d8, 0xc7e3, 0xc7d7, 0xc9a6, 0xc9a7, 0xc9bf, 0xc9a8, 0xc99f, + 0xc9a1, 0xc9a2, 0xc9ad, 0xc9a3, 0xc9a0, 0xcb83, 0xcb85, 0xcb82, + 0xcb84, 0xccee, 0xcd5d, 0xce92, 0xcf55, 0xcf53, 0xe3fc, 0xcf51, + 0xcf52, 0xcf50, 0xd09d, 0xd187, 0xd197, 0xd19b, 0xd19d, 0xd369, + 0xd511, 0x17ee, 0xd77a, 0x1832, 0x6d44, 0x3bc6, 0x3e40, 0x3e2e, + 0x3e68, 0x3e2d, 0x3e34, 0x3e32, 0x3e69, 0x3e31, 0x3e6a, 0x3e3e, + 0x3e6f, 0x3e75, 0x3ff6, 0x4020, 0x4028, 0x4067, 0x40fb, 0x40fe, + 0x40fc, 0x40fd, 0x40ff, 0x40fa, 0x42ac, 0x42af, 0x42b1, 0x00fc, + 0x42bf, 0x42be, 0x42a7, 0x42aa, 0x4394, 0x4393, 0x4399, 0x012a, + 0x43fa, 0x4456, 0x4522, 0x4591, 0x4592, 0x4608, + /* 0x3e */ + 0x4606, 0x48d6, 0x4937, 0x494b, 0x49ce, 0x49d0, 0x4939, 0x4964, + 0x49cf, 0x4946, 0x4966, 0x4956, 0x4943, 0x494a, 0x4958, 0x4965, + 0x495a, 0x495b, 0x4955, 0x4950, 0x494c, 0x49cd, 0x4951, 0x4947, + 0x01d3, 0x4953, 0x4962, 0x49cc, 0x01d7, 0x497f, 0x494d, 0x4d0a, + 0x4d0c, 0x4d0f, 0x4ebb, 0x4eb9, 0x4eeb, 0x4eae, 0x4ec1, 0x4eea, + 0x4ebe, 0x4ebf, 0x4eba, 0x4eb7, 0x4eb3, 0x4ee9, 0x506e, 0x50af, + 0x50b3, 0x50b2, 0x5168, 0x5169, 0x516a, 0x52de, 0x52eb, 0x5311, + 0x52ed, 0x52e9, 0x52f7, 0x52f4, 0x52ea, 0x5312, 0x52e8, 0x5313, + 0x548e, 0x5486, 0x5563, 0x5565, 0x5699, 0x57c2, 0x57ae, 0x57b0, + 0x57ad, 0x59b4, 0x59d1, 0x59ad, 0x03f3, 0x59bd, 0x59b7, 0x59ab, + 0x59af, 0x59c1, 0x59b5, 0x5c0f, 0x5c0e, 0x5c1c, 0x5c13, 0x5c0a, + 0x5c1e, 0x5c14, 0x5c1a, 0x5ccb, 0x5d87, 0x5d93, + /* 0x3f */ + 0x0491, 0x5d84, 0x5d85, 0x5d92, 0x5d80, 0x5e2b, 0x5e63, 0x5f0a, + 0x04c0, 0x5f66, 0x6034, 0x6033, 0x604d, 0x6289, 0x6257, 0x1e17, + 0x624a, 0x0563, 0x6239, 0x623f, 0x6290, 0x628f, 0x62b2, 0x629f, + 0x6295, 0x62a1, 0x629c, 0x628e, 0x62a0, 0x62ae, 0x6296, 0x62ca, + 0x62ac, 0x0570, 0x62a6, 0x6297, 0x6293, 0x3eb6, 0x64d6, 0x64e0, + 0x64d8, 0x6556, 0x676e, 0x677e, 0x6774, 0x6777, 0x6780, 0x677a, + 0x676b, 0x675f, 0x6776, 0x67b0, 0x6763, 0x6a92, 0x6a82, 0x6a9d, + 0x6a94, 0x6a83, 0x6a8b, 0x6a84, 0x6b57, 0x6b84, 0x6bb5, 0x6c09, + 0x6ce6, 0x0702, 0x6d25, 0x6d51, 0x6e3e, 0xe2da, 0x6e85, 0x703f, + 0x7042, 0x7038, 0x703a, 0x704e, 0x7045, 0x7039, 0x7037, 0x7044, + 0xe2e7, 0x70a4, 0x703d, 0x7041, 0x73df, 0x73de, 0x73ca, 0x73e9, + 0x73e2, 0x73e0, 0x7489, 0x7487, 0x7532, 0x7533, + /* 0x40 */ + 0x75ac, 0x75f9, 0x760d, 0x76b9, 0x795e, 0x796a, 0x0935, 0x7981, + 0x7969, 0x79ac, 0x7980, 0x7975, 0x7971, 0x7976, 0x796f, 0x7db6, + 0x7e03, 0x7dbf, 0x7e01, 0x7db2, 0x7dc4, 0x80db, 0x80dc, 0x80d8, + 0xd172, 0x81b5, 0x81a8, 0x818f, 0x819e, 0x818e, 0x82de, 0x82e2, + 0x8320, 0x831d, 0x831a, 0x8319, 0x832b, 0x8318, 0x8310, 0x830e, + 0x8324, 0x831f, 0x8313, 0x8335, 0x8483, 0x0ae0, 0x84d7, 0x8602, + 0x8603, 0x865c, 0x865f, 0x86c7, 0x879a, 0x8797, 0x87a3, 0x88f7, + 0x88c6, 0x88cc, 0x88d6, 0x88cd, 0x88f9, 0x88d9, 0x88d8, 0x0b9a, + 0x88d1, 0x88ce, 0x88d5, 0x0ba3, 0x88d4, 0x88f8, 0x8a7a, 0x8a79, + 0x8a7f, 0x8af3, 0x8af5, 0x8af6, 0x8af4, 0x8af7, 0x0c05, 0x8b79, + 0x8c9c, 0x8cdf, 0x8cf5, 0x8cff, 0x8cd1, 0x8cda, 0x8ccf, 0x8ccd, + 0x8cde, 0x8cd8, 0x75ad, 0x8ce0, 0x8cfe, 0x8c9e, + /* 0x41 */ + 0x8e75, 0x8e73, 0x8e72, 0x8ed8, 0x8fd0, 0x8fd6, 0x8fd7, 0x8fca, + 0x8fcd, 0x918a, 0x9189, 0x918b, 0x92d3, 0x92da, 0x92ce, 0x92d2, + 0x0d5e, 0x92d4, 0x92d7, 0x92d5, 0x92fb, 0x92cd, 0x92fa, 0x92d6, + 0x0da6, 0x949b, 0x949e, 0x949d, 0x94a4, 0x949f, 0x94a5, 0x94a8, + 0x958f, 0x958c, 0x9595, 0x9660, 0x9655, 0x965c, 0x966f, 0x9651, + 0x9661, 0x96a7, 0x965e, 0x9662, 0x9654, 0x966e, 0x9652, 0x9658, + 0x966d, 0x965f, 0x966c, 0x9650, 0x965d, 0x968e, 0x9972, 0x9978, + 0x9975, 0x9976, 0x997c, 0x997e, 0x997d, 0x9b15, 0x9b14, 0x9b1d, + 0x9b1c, 0x9b23, 0x9b57, 0x9dc8, 0x0f5d, 0x9dc9, 0x9dc5, 0x9e87, + 0x9e8a, 0x9e94, 0x9f39, 0x9f40, 0x9f3e, 0x9f38, 0x9fd6, 0x0fb8, + 0xa077, 0xa078, 0xa07d, 0xa1dd, 0xa25e, 0xa277, 0xa2d4, 0xa266, + 0xa25f, 0xa273, 0xa272, 0xa297, 0xa25a, 0xa296, + /* 0x42 */ + 0xa25d, 0xa265, 0xa270, 0xa275, 0xa274, 0xa25c, 0xa260, 0x1034, + 0xa26d, 0xa441, 0xa53c, 0xa53e, 0x106f, 0xa549, 0xa6e4, 0xa80c, + 0xa815, 0xa80e, 0xa7d4, 0xa7c7, 0xa814, 0xa7db, 0xa85f, 0xa7ed, + 0xa809, 0xa7cf, 0xa7ff, 0xa81a, 0xa7f5, 0xa7ee, 0xa7e5, 0xa80d, + 0xa7df, 0xa7ec, 0xa7d7, 0xa82c, 0xa7cd, 0xa7e3, 0xa800, 0xa7eb, + 0xa7fd, 0xa80f, 0xa82d, 0xa850, 0xa7fe, 0xa7c4, 0xa7e1, 0xa7f9, + 0xacbb, 0xacbc, 0x1194, 0x1193, 0xacba, 0xadd0, 0xadd6, 0xadce, + 0xade1, 0xadd5, 0xadcf, 0xadd3, 0x2c14, 0xadd4, 0xb0b5, 0xb190, + 0xb1a1, 0xb181, 0xb185, 0xb16e, 0xb188, 0xb182, 0xb186, 0xb18f, + 0xb189, 0xb180, 0xb184, 0x2dd1, 0xb329, 0xb32b, 0xb32a, 0xb330, + 0xb3e2, 0xb3e3, 0xb3e1, 0xb4d5, 0xb4c4, 0xb4c9, 0xb4e0, 0xb4df, + 0xb4cb, 0xb4dd, 0xb4e8, 0xb4d4, 0xb51c, 0xb6b5, + /* 0x43 */ + 0xb6b6, 0xb6e5, 0xb745, 0xb749, 0xb740, 0xb746, 0xb744, 0xb74a, + 0xb7c9, 0xb7c4, 0xb7c2, 0xb868, 0x30cb, 0xb882, 0xb86b, 0xb867, + 0xb86c, 0xb86d, 0xb871, 0x1392, 0xb9d7, 0xb9d2, 0xb9d9, 0x13aa, + 0xb9bc, 0xb9dd, 0xb9d6, 0x13a7, 0xb9d8, 0xbb20, 0xbb16, 0xbb18, + 0xbb15, 0xbb19, 0xbb27, 0xbb50, 0xbb1d, 0xbb2c, 0xbb1c, 0xbb29, + 0xbb2b, 0xbb24, 0x13ef, 0xbb28, 0xbd39, 0xbdf2, 0xbdf0, 0x31ed, + 0xbded, 0xbdef, 0xbdea, 0xbe01, 0xbfbc, 0xc05c, 0xc05b, 0xc05a, + 0xc026, 0xc243, 0xc233, 0xc23a, 0xc237, 0xc236, 0xc23c, 0xc234, + 0xc24a, 0xc23b, 0xc235, 0xc23d, 0xc240, 0xc23e, 0xc217, 0xc326, + 0xc324, 0xc310, 0xc336, 0xc325, 0x1522, 0xc466, 0xc77f, 0xc77a, + 0xc7fb, 0xc7fd, 0xc7fc, 0xc7fa, 0xc9d6, 0xc9d2, 0xc9c8, 0xc9c2, + 0xc9c7, 0xc9cd, 0xc9c1, 0xc9c6, 0xc9cc, 0xcaa1, + /* 0x44 */ + 0xcb95, 0xcb94, 0xcb97, 0xcb96, 0xcb93, 0xcba1, 0xcd09, 0xcd08, + 0xcd67, 0xcd65, 0xcd62, 0xcd61, 0xce97, 0xcf01, 0xcf19, 0xcf18, + 0xcf5c, 0xcf67, 0xcf6c, 0x16b5, 0xe3fd, 0xcf66, 0xcf61, 0xcf6e, + 0xcf5d, 0xcf5a, 0xd0a2, 0xd0a9, 0xd0a5, 0xd0a6, 0xd0b2, 0xd0a3, + 0xd1ac, 0xd1aa, 0xd1af, 0xd1ab, 0xd1b1, 0xd1c6, 0xd1ad, 0xd1b9, + 0xd370, 0x1775, 0xd70c, 0xd781, 0xd783, 0xd77e, 0xd851, 0xda99, + 0xda94, 0xda95, 0xddfe, 0xdf18, 0x3c05, 0x3e72, 0x0082, 0x3e99, + 0x3fad, 0x4106, 0x42c2, 0x42cb, 0x42d5, 0x42d2, 0x42cc, 0x42d7, + 0x42c5, 0x42ca, 0x1aec, 0x43a2, 0x43a3, 0x43a1, 0x1ae8, 0x43a6, + 0x43a4, 0x43ff, 0x4400, 0x0135, 0x4506, 0x4525, 0x459f, 0x467f, + 0x49ea, 0x49eb, 0x49de, 0x4a18, 0x49e0, 0x49e8, 0x49df, 0x49f1, + 0x49ec, 0x4a1a, 0x49e6, 0x49e1, 0x4a5d, 0x3b77, + /* 0x45 */ + 0x4a1e, 0x01f0, 0x4a80, 0x4d17, 0x4f1d, 0x4ef7, 0x4eef, 0x4eee, + 0x4eed, 0x4ef5, 0x4f1e, 0x50bd, 0x92ff, 0x50be, 0x516d, 0x5176, + 0x534c, 0x5319, 0x5348, 0x531e, 0x534a, 0x5349, 0x5326, 0x5495, + 0x5585, 0x557e, 0x5597, 0x557d, 0x5642, 0x569e, 0x570c, 0x570b, + 0x570e, 0x57cf, 0x59d8, 0x59e0, 0x59e8, 0x59e9, 0x59e2, 0x59e1, + 0x59da, 0x59e3, 0x59d9, 0x59f0, 0x59e7, 0x59e4, 0x5c23, 0x5c31, + 0x5c33, 0x5c0c, 0xa4e0, 0x5c26, 0x5c24, 0x5c32, 0x5c27, 0x5c21, + 0x5c30, 0x5ca2, 0x5ccc, 0x5d96, 0xe28f, 0x5d98, 0x5d9c, 0x5d9b, + 0x5e6b, 0x5f12, 0x5f14, 0x605a, 0x6054, 0x6051, 0x605e, 0x6058, + 0x04f0, 0x6059, 0x629a, 0x62f2, 0x62ad, 0x6320, 0x62f1, 0x62f0, + 0x62f3, 0x62f4, 0x62e9, 0x62fe, 0x632e, 0x62e8, 0x62e7, 0x62ff, + 0x62f5, 0x64e5, 0x64e7, 0x64e6, 0x64e9, 0x6558, + /* 0x46 */ + 0x676c, 0x67d9, 0x063e, 0x67cb, 0x0639, 0x67be, 0x67b5, 0x67d1, + 0x67c2, 0x67b6, 0x67d3, 0xe2c2, 0x69da, 0x06a2, 0x6aae, 0x06a1, + 0x6aac, 0x6aa9, 0x6aba, 0x6aa7, 0x6ab3, 0x6abd, 0x6ab1, 0x6c0e, + 0x6c11, 0x6c0f, 0x6d52, 0x6d6a, 0x6d54, 0x6d55, 0x6d53, 0x6d57, + 0xe2d0, 0x6d5b, 0x6d58, 0x6d59, 0x073b, 0x70b8, 0x70b5, 0x70bf, + 0x70c1, 0x70bb, 0x07b7, 0x70c3, 0x70ad, 0x70a8, 0x70ae, 0x70aa, + 0x70d0, 0x70b1, 0x70bc, 0x70b7, 0x70b0, 0x70fa, 0x70fb, 0x70b9, + 0x7407, 0x73fc, 0x73ff, 0x73f2, 0x73f8, 0x73f4, 0x0857, 0x0870, + 0x75ae, 0x760f, 0x7610, 0xd5c1, 0x76c7, 0x76c6, 0x76ce, 0x08a7, + 0x76dc, 0x79d5, 0x79d3, 0x7a20, 0x79e2, 0x79f1, 0x79db, 0x79ea, + 0x79eb, 0x79e1, 0x79ff, 0x79d6, 0x79e0, 0x79d7, 0x79e5, 0x0954, + 0x7e1b, 0x7e10, 0x7e0f, 0x7e0e, 0x7e39, 0x7e0a, + /* 0x47 */ + 0x7e14, 0x7e0c, 0x8023, 0x805a, 0x80e2, 0x8193, 0x81b0, 0x81ab, + 0x81bd, 0x81b1, 0x818d, 0x81ad, 0x81aa, 0x81ac, 0x81bc, 0x81c9, + 0x8347, 0x8362, 0x8340, 0x8344, 0x833f, 0x8343, 0x833d, 0x8360, + 0x835f, 0x833a, 0x8342, 0x835e, 0x835d, 0x84bc, 0x84e0, 0x84ee, + 0x84eb, 0x850d, 0x8609, 0x860c, 0x8669, 0x8674, 0x8667, 0x0b31, + 0x2427, 0x87ad, 0x88ff, 0x8916, 0x8908, 0x8909, 0x8900, 0x88fc, + 0x8913, 0x8914, 0x890a, 0xd33e, 0x8929, 0x8917, 0x893b, 0x88fb, + 0x0bbf, 0x890e, 0x0be4, 0x8b08, 0x8d1b, 0x8d1a, 0x8d19, 0x8d02, + 0x0c4a, 0x8d17, 0x8d07, 0x8d13, 0x8d09, 0x8d0a, 0x8d12, 0x8daa, + 0x8d38, 0x8e7b, 0x8e7c, 0x8e7a, 0x8eea, 0x8eeb, 0x8eef, 0x8ef0, + 0x9009, 0x9002, 0x9001, 0x902b, 0x9007, 0x0ccf, 0x9028, 0x8ffb, + 0x902a, 0x8ffe, 0x9004, 0x9029, 0x900a, 0x268c, + /* 0x48 */ + 0x91c2, 0x2691, 0x91a6, 0x0d14, 0x6ac6, 0x5707, 0x930a, 0x92fd, + 0x9306, 0x930d, 0x9309, 0x930b, 0x9300, 0x9305, 0x933d, 0x94d5, + 0x94bf, 0x94ba, 0x94c7, 0x9598, 0x959a, 0x0e0d, 0x96a4, 0x969c, + 0x969d, 0x96a2, 0x9696, 0x9695, 0x96a5, 0x96aa, 0x96ad, 0x969a, + 0x96a3, 0x9697, 0x9690, 0x96af, 0x968d, 0x0e01, 0x96a8, 0x96ee, + 0x99a3, 0x9999, 0x99a1, 0x999c, 0x99a4, 0x99cb, 0x9b56, 0x9b48, + 0x9b59, 0x9b4a, 0x9b5c, 0x0ef1, 0x9b4f, 0x9b4d, 0x9b5d, 0x9d3a, + 0x9de3, 0x9de1, 0x9dde, 0x9e97, 0x9e9a, 0x9f48, 0x9f4a, 0x9f4c, + 0x9f4e, 0x9f4f, 0x9f4b, 0x9f4d, 0x9f47, 0x9f51, 0x9fda, 0x9ff9, + 0x9ffc, 0x9ffb, 0x9ffd, 0x9ff8, 0x9ffa, 0xa08a, 0xa08e, 0xa088, + 0xa089, 0xa08d, 0xa090, 0xe37e, 0xa21c, 0xa2ab, 0xa2a4, 0xa2a8, + 0xa2ad, 0xa29f, 0xa29a, 0xa2b0, 0xa2a5, 0xa2d5, + /* 0x49 */ + 0xa2a2, 0xa2b2, 0xa29d, 0xa2a1, 0xa415, 0xa442, 0xa473, 0xa484, + 0xa4dd, 0xa55c, 0xa54c, 0x1076, 0xa54b, 0xa767, 0xa8a8, 0xa87f, + 0xa88d, 0xa88b, 0xa8f7, 0xa8a9, 0xa8f4, 0xa89a, 0xa88c, 0xa895, + 0xa87e, 0xa877, 0x110a, 0x1103, 0xa871, 0xa8fd, 0xa888, 0xa899, + 0xa86d, 0xa8d4, 0xa891, 0xa87d, 0xa863, 0xa875, 0xa8f9, 0xa88e, + 0xa874, 0xa8d9, 0xa866, 0xa8fa, 0xa8f5, 0x2b60, 0xacc1, 0xacc9, + 0xae03, 0xae2c, 0xae34, 0xae17, 0xae09, 0xae04, 0xae06, 0xae1a, + 0xae0e, 0xae27, 0xae05, 0xae07, 0xae19, 0xae14, 0xae0c, 0xae1d, + 0xae22, 0xae23, 0xb0bb, 0xb0bc, 0xb0ba, 0xb1a9, 0xb1b5, 0xb1ac, + 0xb1aa, 0xb1af, 0xb1b7, 0x1235, 0x1236, 0xb33d, 0xb345, 0xb348, + 0xb33c, 0xb33e, 0xb3ec, 0xb3ed, 0xb3e9, 0xb50a, 0xb50b, 0xb4f8, + 0xb504, 0xb4f6, 0xb4f9, 0xb753, 0xb752, 0xb760, + /* 0x4a */ + 0xb763, 0xb7ce, 0xb7cd, 0xb7d0, 0xb7cc, 0xb887, 0xb88d, 0xb89d, + 0x1373, 0xb963, 0xb9f4, 0xb9f1, 0xb9ff, 0xb9f5, 0xb9fc, 0xb9f2, + 0xb9f6, 0x13b1, 0xb9fa, 0x13af, 0xbb2e, 0xbb45, 0xbb43, 0xbb51, + 0xbb4c, 0xbb73, 0xbb47, 0xbb4b, 0xbb4f, 0x13f4, 0xbb44, 0xbb4d, + 0xbb4e, 0xbb4a, 0xbb41, 0xbb52, 0xbb9f, 0xbb54, 0xbb59, 0xbba2, + 0xbd4b, 0xbd48, 0xbe0d, 0xbe1f, 0xbe08, 0xbe0e, 0xbe1d, 0xbe04, + 0xbf18, 0xbf1b, 0xc066, 0xc062, 0xc083, 0xc067, 0xc262, 0xc24f, + 0xc24e, 0xc267, 0xc253, 0xc24d, 0xc24c, 0xc268, 0xc251, 0x14dc, + 0xc258, 0xc25b, 0xc250, 0xc26a, 0xc339, 0xc338, 0xc482, 0xc484, + 0xc486, 0xc780, 0xc786, 0xc825, 0xc811, 0x1599, 0xc80e, 0xc815, + 0xc80f, 0xc818, 0xc80d, 0xc813, 0xc816, 0xc819, 0xca08, 0xc9f7, + 0xc9fb, 0xc9fc, 0xcab4, 0xcabe, 0xcac1, 0xcba6, + /* 0x4b */ + 0xcba5, 0xcba2, 0xcba4, 0xcd12, 0xcd0e, 0xcd7a, 0xcd78, 0xcd7d, + 0xcd7e, 0xcd81, 0xcd83, 0xcd80, 0xcd82, 0xce9b, 0xce99, 0xce9c, + 0xce9a, 0xcea1, 0xcf1a, 0xcf1c, 0xcf8a, 0xcf79, 0xcf73, 0xcf75, + 0xcf7c, 0xcf78, 0xcf60, 0xcf83, 0xcf70, 0x16b6, 0x16bd, 0xcf87, + 0xcf84, 0xcf7b, 0xcf7e, 0xcf74, 0xd0b9, 0xd0b8, 0xd0b7, 0xd0b5, + 0xd1cc, 0xd1ce, 0xd1d1, 0x3504, 0xd1cb, 0x359b, 0xd37e, 0xd37a, + 0xd377, 0xd38c, 0xd3e1, 0xd520, 0xd51e, 0xd5c2, 0xd60f, 0xd600, + 0x17f4, 0xd610, 0xd70d, 0xd70e, 0xd78e, 0xd78d, 0xd78a, 0xd78b, + 0xd78c, 0xd78f, 0xd857, 0x1835, 0xd855, 0xd85b, 0xdaac, 0xdaa7, + 0xdaa0, 0xda9e, 0x18aa, 0xdd8d, 0x191f, 0xde93, 0xde94, 0xde92, + 0x3c81, 0x3ed6, 0x3ec3, 0x3ee4, 0x3ee2, 0x3f09, 0x3ebf, 0x3ec8, + 0x3ec7, 0x3fb5, 0x3fb2, 0x410c, 0x410b, 0x410a, + /* 0x4c */ + 0x4105, 0x42d3, 0x42e6, 0x42e9, 0x42f0, 0x42ea, 0x42e7, 0x43b1, + 0x43b3, 0x43b4, 0x43b0, 0x445c, 0x445d, 0x445e, 0x44c0, 0x45af, + 0x0150, 0x4686, 0x4683, 0x4684, 0x4a5c, 0x4a70, 0x4a8c, 0x4a7b, + 0x4a66, 0x4a79, 0x4a63, 0x4ac5, 0x4a6b, 0x4a6d, 0x4a72, 0x4a69, + 0x4a75, 0x4a89, 0x4ac6, 0x4aa5, 0x3ee7, 0x4a6a, 0x4a97, 0x4f5a, + 0x4f5c, 0x4f59, 0x4f24, 0x4f25, 0x4f30, 0x4f58, 0x4f31, 0x5076, + 0x50c1, 0x5185, 0x517d, 0x5365, 0x5387, 0x5352, 0x5354, 0x538a, + 0x5350, 0x5386, 0x534f, 0x5368, 0x549d, 0x55a0, 0x55ba, 0x55bd, + 0x55b8, 0x56a6, 0x037b, 0x57de, 0x57d8, 0x57d1, 0x5a13, 0x0409, + 0x5a0e, 0x5a1b, 0x5a3a, 0x0407, 0x5a1c, 0x5a12, 0x5a16, 0x5a1a, + 0x4f48, 0x5c4b, 0x5c37, 0x5c36, 0x5c38, 0x5c3a, 0x5c49, 0x5c3c, + 0x5c4a, 0x5db1, 0x5dc2, 0x5db5, 0x5dc4, 0x5db6, + /* 0x4d */ + 0x5f1e, 0x5f1f, 0x5faf, 0x606b, 0x606f, 0x6292, 0x62e4, 0x632c, + 0x62ef, 0x1e84, 0x634f, 0x6352, 0x6350, 0x633a, 0x6337, 0x6347, + 0x6364, 0x6340, 0x633c, 0x6345, 0x6341, 0x64f3, 0x05bb, 0x67c1, + 0x67b4, 0x064b, 0x682a, 0x6822, 0x6829, 0x064d, 0x683e, 0x683c, + 0x6830, 0x6ac7, 0x6ad5, 0x6ad6, 0x6ad3, 0x6ace, 0x6ac8, 0x6b5c, + 0x6b5f, 0x6b62, 0x06c2, 0x6bbd, 0x6bbf, 0x6d5c, 0x6db6, 0x071a, + 0x6d9d, 0x6d7f, 0x0712, 0x6d94, 0x6d81, 0x6e47, 0x6e46, 0x073c, + 0x6e94, 0x7175, 0x711a, 0x712a, 0x7132, 0x7117, 0x7123, 0x7174, + 0x07c3, 0x7176, 0x712e, 0x7125, 0x7120, 0x7171, 0x7116, 0x7170, + 0x712c, 0x712f, 0x711f, 0x7164, 0x07c0, 0x7408, 0x7414, 0x740a, + 0x740b, 0x754f, 0x7559, 0x7554, 0x7551, 0x75b6, 0x76ec, 0x76ed, + 0x76ea, 0x79ee, 0x7a5a, 0x7a73, 0x7a65, 0x7a61, + /* 0x4e */ + 0x7a55, 0x7a6b, 0x7a64, 0x7a5b, 0x7a4c, 0x7a6f, 0x7a84, 0x7a70, + 0x7e5d, 0x7e57, 0x7e66, 0x7e53, 0x7e98, 0x7e97, 0x8028, 0x80eb, + 0x80ea, 0x80e8, 0x80ec, 0x80ef, 0x81d1, 0x81ca, 0x229f, 0x81cf, + 0x81cd, 0x81ce, 0x8370, 0x8367, 0x8373, 0x836d, 0x8376, 0x8379, + 0x836a, 0x838b, 0x8372, 0x8371, 0x836e, 0x837a, 0x8516, 0x8539, + 0x853b, 0x8610, 0x8696, 0x867b, 0x867c, 0x867d, 0x87be, 0x895c, + 0x8938, 0x8939, 0x892e, 0x8934, 0x8932, 0x895b, 0x8933, 0x893c, + 0x0be5, 0x8b0e, 0x8b0f, 0x8b10, 0x8b87, 0x8d5b, 0x8d53, 0x0c5f, + 0x8d5c, 0x8d3f, 0x8d59, 0x8d4a, 0x8d44, 0x8d4c, 0x8d40, 0x8d5f, + 0x8d5e, 0x8d4e, 0x8d54, 0x8d43, 0x8d87, 0x8e82, 0x8e85, 0x9031, + 0x9047, 0x902e, 0x902f, 0x9048, 0x9034, 0x0d18, 0x409f, 0x9332, + 0x9336, 0x9333, 0x9331, 0x9340, 0x9341, 0x94dd, + /* 0x4f */ + 0x94d2, 0x94d9, 0x0dad, 0x94df, 0x94db, 0x94d8, 0x94d3, 0x94de, + 0x94e0, 0x94d4, 0x94d7, 0x94da, 0x95a7, 0x96fe, 0x96dd, 0x9740, + 0x96e2, 0x0e1e, 0x96d6, 0x96de, 0x96ef, 0x0e27, 0x96eb, 0x96ea, + 0x96e4, 0x96d1, 0x0e18, 0x96ec, 0x96fa, 0x96d9, 0x96f3, 0x96e1, + 0x96dc, 0x96e5, 0x96df, 0x96d4, 0x0e20, 0x9705, 0x99d6, 0x99d5, + 0x99d0, 0x99c8, 0x99c4, 0x99c9, 0x99cd, 0x99d2, 0x99cc, 0x99ca, + 0x9ba0, 0x9b92, 0x0ef4, 0x0f02, 0x9b8b, 0x9ba1, 0x9b95, 0x9b88, + 0x9b86, 0x9b8d, 0x9b85, 0x9b91, 0x9b89, 0x9ba2, 0x9df0, 0x9df3, + 0x9df4, 0x9def, 0x9e06, 0x9ea2, 0x9f5e, 0x9f63, 0x9f60, 0x9f5b, + 0x9f7b, 0x9f58, 0x9f59, 0x9f5d, 0xa005, 0xa006, 0xa002, 0xa003, + 0xa004, 0xa0a2, 0xa0a7, 0xa0a6, 0xa0a4, 0xa0ac, 0xa0a9, 0xa2e7, + 0xa301, 0xa2df, 0xa2d9, 0xa2e3, 0xa30f, 0xa41a, + /* 0x50 */ + 0xa445, 0xa448, 0xa47b, 0xa485, 0xa486, 0xa4fe, 0xa4ff, 0xa564, + 0xa571, 0xa572, 0xa561, 0xa562, 0xa56c, 0xa560, 0xa55d, 0xa563, + 0xa567, 0xa901, 0xa92a, 0xa930, 0xa906, 0xa97d, 0xa922, 0xa9b9, + 0xa90a, 0xa910, 0xa88f, 0xa980, 0xa913, 0xa92e, 0xa918, 0xa917, + 0xa91a, 0xa914, 0xa947, 0xa963, 0xa938, 0x1124, 0xa97f, 0xa921, + 0xa937, 0xa931, 0xa91b, 0xa9a5, 0xaa6c, 0xacd3, 0xae88, 0xae6e, + 0xae5c, 0xae74, 0xae54, 0xae83, 0x2c70, 0xae65, 0xae60, 0xae70, + 0xae6f, 0xae6d, 0xae72, 0xae6c, 0xae76, 0xae75, 0xae59, 0xaec7, + 0xb0c1, 0xb0f9, 0xb1e3, 0xb1e7, 0xb1d6, 0xb1cf, 0xb1da, 0xb1e9, + 0xb1d2, 0xb355, 0xb34f, 0xb34d, 0xb351, 0xb356, 0xb3f9, 0xb3f8, + 0xb406, 0xb403, 0xb409, 0xb3f7, 0xb3f5, 0xb547, 0xb545, 0xb53e, + 0xb546, 0xb529, 0xb534, 0xb53f, 0xb544, 0xb535, + /* 0x51 */ + 0xb55a, 0xb52a, 0xb533, 0xb537, 0xb543, 0xb539, 0xb530, 0xb55d, + 0xb532, 0xb527, 0xb6bd, 0xb6ba, 0xb6bc, 0xb6f1, 0xb6f0, 0xb761, + 0xb75c, 0xb758, 0xb75d, 0xb7da, 0xb7d9, 0xb7dd, 0xb7dc, 0xb7de, + 0x137d, 0xb8a0, 0xb8a2, 0xba0f, 0xba13, 0xba12, 0xba11, 0xba14, + 0xba19, 0xba0e, 0xba17, 0xba21, 0xba20, 0xba16, 0xbb78, 0x3137, + 0xbb87, 0xbb79, 0xbb80, 0xbb77, 0xbb81, 0xbb46, 0xbb7a, 0xbb9c, + 0xbb83, 0xbb84, 0xbbad, 0xbb9d, 0xbb9e, 0xbd55, 0xbe36, 0xbe2b, + 0xbe27, 0xbe46, 0xbe2c, 0xbe45, 0xbe33, 0xbe2d, 0xbe34, 0xbe22, + 0x1464, 0xbf1f, 0xc0b3, 0xc08c, 0xc08f, 0xc0af, 0xc0ad, 0xc08e, + 0xc0ac, 0xc0b0, 0xc0b1, 0xc0ae, 0xc099, 0xc1eb, 0xc274, 0xc275, + 0xc28e, 0xc26d, 0xc270, 0xc28c, 0xc34f, 0xc351, 0xc358, 0xc34c, + 0xc34e, 0xc415, 0xc4be, 0xc4db, 0xc4b3, 0xc4ae, + /* 0x52 */ + 0xc787, 0xc78a, 0xc788, 0xc78b, 0xc78c, 0xc844, 0xc82d, 0xc82a, + 0xc831, 0xc82c, 0xc845, 0xc830, 0xc829, 0xc846, 0xc9f4, 0xca14, + 0xca10, 0xca0f, 0xca12, 0xca0b, 0xca0c, 0xca0a, 0xca13, 0xca0e, + 0xcad9, 0xcad0, 0x3403, 0xcbc1, 0xcbbf, 0xcbbd, 0xcbbc, 0xcbba, + 0xcbbb, 0xcbd1, 0xcbbe, 0xcbd0, 0xcbb9, 0xcd1a, 0xcd1c, 0xcd1b, + 0xcd91, 0xcd96, 0xcd9f, 0xcd9c, 0xcd9a, 0xcd9d, 0xcead, 0xcea5, + 0xceae, 0xcf03, 0xcf26, 0xcf20, 0xcf23, 0xcf24, 0xcf21, 0xcf28, + 0xcf25, 0xcf1e, 0xcf94, 0xcf93, 0xcf8f, 0xcf9a, 0xcfad, 0x16c2, + 0xd0ca, 0xd0c5, 0xd1bb, 0xd1e1, 0xd1ea, 0xd1e4, 0xd1ed, 0xd1e6, + 0xd1e0, 0xd1e8, 0xd1e5, 0xd31a, 0xd394, 0xd396, 0xd39e, 0xd395, + 0xd3a1, 0xd38e, 0xd39b, 0xd392, 0xd397, 0xd399, 0xd393, 0xd532, + 0xd52f, 0xd52e, 0xd533, 0xd61c, 0xd61e, 0xd611, + /* 0x53 */ + 0xd620, 0xd61f, 0xd619, 0xd616, 0xd7ac, 0xd7b9, 0xd7b3, 0xd7a6, + 0xd7a2, 0xd7a9, 0xd7a7, 0xd86c, 0xd86d, 0xd869, 0xd880, 0xd866, + 0xd865, 0xd871, 0xd86b, 0xdabd, 0xdac1, 0xdad3, 0xdab6, 0x18ac, + 0xdab9, 0xdad4, 0xdab7, 0xdadb, 0xdab8, 0xdac0, 0xdabc, 0xdad5, + 0xdabf, 0xdac3, 0xdac9, 0xdd58, 0xdd90, 0xdd95, 0xdd97, 0xde09, + 0xde08, 0xde06, 0xde05, 0xde10, 0xde97, 0xde95, 0xdeee, 0xdf1f, + 0xe41a, 0x564b, 0x3c8e, 0x3ee8, 0x3ef0, 0x3ef4, 0x3f06, 0x3eed, + 0x009b, 0x3ee9, 0x3f00, 0x3fb8, 0x406d, 0x4304, 0x4301, 0x4303, + 0x4302, 0x1af6, 0x0126, 0x4462, 0x45ba, 0x4613, 0x4ade, 0x4ad7, + 0x4ae4, 0x4ace, 0x4ae3, 0x4add, 0x4b3a, 0x4adb, 0x4ad6, 0x4ae0, + 0x4ad4, 0x4acb, 0x4ae1, 0x4ac9, 0x4adf, 0x4b3c, 0x4afc, 0x4acf, + 0x4f79, 0x4f76, 0x4f78, 0x5187, 0x539c, 0x53b1, + /* 0x54 */ + 0x53c1, 0x539a, 0x5392, 0x0daf, 0x53c2, 0x5396, 0x53c0, 0x5391, + 0x5395, 0x54a2, 0x55c3, 0x55c0, 0x55c2, 0x468a, 0x56b0, 0x5716, + 0x5a46, 0x5a4a, 0x5a3e, 0x5a45, 0x5a42, 0x0415, 0x5a5b, 0x5a44, + 0x5b04, 0x7b22, 0x5c55, 0x5c57, 0x5c51, 0x5c4e, 0x5c5a, 0x5dc6, + 0x5dc3, 0x049c, 0x5dc5, 0x5dcc, 0x5e71, 0x5f26, 0x5fb2, 0x607a, + 0x6084, 0x607b, 0x6374, 0x638c, 0x6351, 0x6348, 0x638d, 0x6392, + 0x6398, 0x6393, 0x63b0, 0x634e, 0x6396, 0x6397, 0x639c, 0x63ca, + 0x6833, 0x6883, 0x6884, 0x689a, 0x688c, 0x20cc, 0x6899, 0x69e0, + 0x6ae4, 0x6af8, 0x6aed, 0x6af3, 0x6af4, 0x6af5, 0x6afd, 0x6c19, + 0x6d9e, 0x6dc4, 0x6d9f, 0x6e9b, 0x6e9f, 0x6e9a, 0x71aa, 0x719d, + 0x7192, 0x71a2, 0x71af, 0x71eb, 0x71a0, 0x71a1, 0x7194, 0x7198, + 0x718f, 0x7187, 0x7184, 0x71a9, 0x717c, 0x7418, + /* 0x55 */ + 0x755f, 0x7562, 0x7561, 0x75c0, 0x7615, 0x76fc, 0x76f9, 0x7ac8, + 0x7ac9, 0x7ade, 0x7aca, 0x7ae2, 0x0964, 0x096e, 0x7b04, 0x7acc, + 0x7add, 0x7ae4, 0x7ad3, 0x7ac7, 0x7ac6, 0x095f, 0x7b37, 0x7ed8, + 0x7eee, 0x7eb2, 0x7ea3, 0x7eb3, 0x7eed, 0x7ef8, 0x8031, 0x805b, + 0x8066, 0x8069, 0x8096, 0x809b, 0x80f7, 0x80f3, 0x80f4, 0x80f5, + 0x81e2, 0x81e7, 0x81e5, 0x81e9, 0x81e6, 0x81e3, 0x8374, 0x837f, + 0x838f, 0x8390, 0x8397, 0x83a3, 0x838e, 0x8398, 0x838c, 0x8542, + 0x8544, 0x8569, 0x8543, 0x8568, 0x0af6, 0x868d, 0x8688, 0x868b, + 0x8689, 0x87cc, 0x881f, 0x8980, 0x895e, 0x8967, 0x8968, 0x8965, + 0x254a, 0x8974, 0x8969, 0x8961, 0x8962, 0x896c, 0x8993, 0x8986, + 0x8a9d, 0x8a9b, 0x8b1b, 0x8b16, 0x8b19, 0x8b14, 0x8b18, 0x8b15, + 0x8b99, 0x8b98, 0x8d5d, 0x8d89, 0x8d7a, 0x8d7d, + /* 0x56 */ + 0x8d4b, 0x0c73, 0x8d78, 0x8d7f, 0x8d77, 0x8d7e, 0x8d79, 0x8dab, + 0x8d7c, 0x8d74, 0x8d75, 0x8da7, 0x8e8d, 0x904e, 0x9066, 0x9061, + 0x904d, 0x904f, 0x0cdd, 0x9054, 0x907c, 0x91da, 0x91de, 0x91d8, + 0x91dd, 0x91df, 0x9366, 0x9362, 0x935f, 0x9364, 0x9363, 0x9360, + 0x9388, 0x936a, 0x9367, 0x9387, 0x933f, 0x936c, 0x936e, 0x93ad, + 0x94f1, 0x94f4, 0x94f6, 0x94f5, 0x94f8, 0x94fb, 0x94ec, 0x94ef, + 0x94ed, 0x27b9, 0x94f7, 0x94f9, 0x94fd, 0x95b1, 0x9736, 0x971b, + 0x9732, 0x9742, 0x974d, 0x971f, 0x9721, 0x971c, 0x9731, 0x972e, + 0x9747, 0x973b, 0x9741, 0x9718, 0x9739, 0x971d, 0x9727, 0x9723, + 0x28d7, 0x99ee, 0x99e8, 0x99e5, 0x99ef, 0x99e4, 0x99ec, 0x99f0, + 0x9bd7, 0x9bd8, 0x9bd4, 0x9bca, 0x9bd2, 0x9bcb, 0x9bd3, 0x9be6, + 0x9be2, 0x9d49, 0x9d48, 0x9dff, 0x9e09, 0x9eb0, + /* 0x57 */ + 0x9eaf, 0x9f7c, 0x9f78, 0x9f7a, 0x9f72, 0x9f79, 0x9f7e, 0xa00c, + 0xa00b, 0xa0cd, 0xa0be, 0xa0bc, 0xa0bf, 0xa0c0, 0xa0bd, 0xa338, + 0xa308, 0xa305, 0xa33b, 0xa310, 0xa30c, 0xa30d, 0xa304, 0xa33a, + 0xa313, 0xa337, 0xa339, 0xa41f, 0xa44b, 0xa4ee, 0xa575, 0xa578, + 0xa57c, 0xa574, 0xa576, 0xa5ea, 0xa5eb, 0xa8fb, 0xa919, 0xa9a7, + 0xa98c, 0xa9dc, 0xa998, 0xa9be, 0xa99e, 0xaa0f, 0xa99f, 0xa9dd, + 0xa993, 0xa9bb, 0xa9b6, 0xa990, 0xa9a1, 0xa9bd, 0xa9de, 0xa93a, + 0xaa22, 0xa997, 0xa994, 0xa9c3, 0xa98e, 0xa9a8, 0xa999, 0xa9ad, + 0xa99b, 0xa9a2, 0xaa21, 0xa9ac, 0xaa0e, 0xaa31, 0xace1, 0xacde, + 0xacdf, 0xacdc, 0xacdd, 0xacec, 0xace7, 0xae69, 0xaeb8, 0xaea1, + 0xaea8, 0xaeba, 0xaec2, 0xaea6, 0xaea4, 0xaea3, 0xaeab, 0xaebc, + 0xaeb7, 0xaebf, 0xaead, 0xaeb1, 0xaeca, 0xaec4, + /* 0x58 */ + 0xaeb9, 0xb0c8, 0xb0c6, 0xb0c7, 0xb20a, 0xb20d, 0xb1fb, 0xb203, + 0xb202, 0xb1fc, 0xb1f9, 0xb1f8, 0xb36e, 0xb363, 0xb362, 0xb361, + 0xb36b, 0x1288, 0xb36f, 0xb366, 0xb36c, 0xb40e, 0xb415, 0xb416, + 0xb410, 0xb417, 0xb411, 0xb56e, 0xb56c, 0xb587, 0xb583, 0xb563, + 0xb5dc, 0xb6c0, 0xb6f7, 0xb6fa, 0xb770, 0xb76a, 0xb768, 0xb769, + 0xb784, 0xb7ec, 0xb7e7, 0xb7ee, 0xb8ba, 0xb8b2, 0xb8b5, 0xb8cb, + 0x430b, 0xb8d0, 0xb96d, 0xb96c, 0x13bb, 0xba45, 0xba46, 0xba34, + 0xba2c, 0xba35, 0xba44, 0x13ba, 0xba76, 0xbbb1, 0xbbaa, 0xbba1, + 0xbbb2, 0x1412, 0xbba6, 0xbbb5, 0xbbb4, 0xbbb8, 0xbbaf, 0xbbb0, + 0xbba3, 0xbd62, 0xbd64, 0xbe56, 0xbe51, 0xbe4f, 0xbe68, 0xbe4c, + 0xbe50, 0x1461, 0xbe48, 0xbe4a, 0xbf21, 0xc0e3, 0xc0b9, 0xc0de, + 0xc0b7, 0xc0e1, 0xc0b6, 0xc0b5, 0xc0df, 0x14e1, + /* 0x59 */ + 0xc297, 0xc29a, 0xc29b, 0xc298, 0xc292, 0xc293, 0xc2d7, 0xc273, + 0xc36b, 0xc374, 0xc378, 0xc36d, 0xc418, 0xc4e9, 0xc4f5, 0xc4ea, + 0xc52e, 0xc4e7, 0xc4fe, 0xc4e5, 0xc536, 0xc4f0, 0xc4e6, 0xc52c, + 0xc789, 0xc795, 0xc793, 0xc84d, 0xc84a, 0xc84f, 0xc850, 0xc84b, + 0xca2a, 0xca2b, 0xca2f, 0xca2e, 0xca7c, 0xcaed, 0xcae2, 0xcbe0, + 0xcbdc, 0xcbda, 0xcbd6, 0xcbf4, 0xcbd9, 0xcbd5, 0xcd22, 0xcd21, + 0xcd24, 0xcd25, 0xcd26, 0xcd23, 0xcdaa, 0xcdaf, 0xcdb0, 0xcdab, + 0xceaf, 0xceb7, 0xceb5, 0xceb2, 0xceb3, 0xcf2b, 0xcfd8, 0xcfc2, + 0xcfaf, 0xcfbc, 0xcfb8, 0xcfbe, 0xcfb7, 0xcfb4, 0xcfbf, 0xcfb3, + 0xcfb1, 0xcfbb, 0xcfbd, 0xcfd6, 0xcfdd, 0xd0d8, 0xd0d3, 0xd0d5, + 0xd0e3, 0xd0e2, 0xd0d9, 0xd0de, 0xd0df, 0xd0da, 0xd0d4, 0xd1f3, + 0xd1e2, 0xd20d, 0xd201, 0xd205, 0xd21a, 0xd203, + /* 0x5a */ + 0xd21f, 0xd216, 0xd1fa, 0xd1fc, 0xd20a, 0x359f, 0xd3bc, 0xd3ca, + 0xd3b6, 0xd3c7, 0xd3bf, 0x1789, 0xd3b9, 0x178c, 0xd3b0, 0xd3b8, + 0xd3bd, 0xd391, 0xd3bb, 0xd3be, 0xd53e, 0xd53d, 0xd638, 0xd63d, + 0xd639, 0xd633, 0xd733, 0xd7bb, 0xd7c6, 0xd7c5, 0xd7c7, 0xd7cb, + 0xd7a8, 0xd7c8, 0xd7be, 0xd7c1, 0xd7bd, 0xd882, 0xd89e, 0xd881, + 0xd884, 0x368d, 0xd896, 0xd88e, 0xd888, 0xd887, 0xdae0, 0xdb0d, + 0xdadf, 0xdae4, 0xdae2, 0xdadd, 0xdaec, 0xdade, 0xdae7, 0xdaea, + 0xdae3, 0xdd5c, 0x3977, 0xdd5d, 0xdd9c, 0xde1d, 0xde9d, 0xde9e, + 0xde9b, 0xdeb5, 0xdeb9, 0xdeb6, 0xdef3, 0xdef2, 0xdef4, 0xdf26, + 0xdf27, 0xdf25, 0xe006, 0xe00b, 0xe03a, 0xe03c, 0x3f0a, 0x3f0b, + 0x3fbf, 0x3ffd, 0x4118, 0xccdf, 0x8e90, 0x419e, 0x42fc, 0x4310, + 0x430f, 0x430d, 0x43b9, 0x43b7, 0x43ba, 0x440a, + /* 0x5b */ + 0x4b41, 0x4b8b, 0x4b46, 0x4b53, 0x4be2, 0x4b3f, 0x4a7c, 0x4b4b, + 0x4b4e, 0x4b8a, 0x4b47, 0x4f93, 0xb8ce, 0x4f8c, 0x4faf, 0x4fc9, + 0x50c6, 0x50c8, 0x5191, 0x53cf, 0x53d4, 0x53ce, 0x55dd, 0x55d4, + 0x5a49, 0x5a63, 0x5a5d, 0x041a, 0x5a67, 0x5abb, 0x5a60, 0x5a80, + 0x5c5f, 0x5c60, 0x5dda, 0x5dd2, 0x5ddd, 0x608e, 0x6088, 0x606c, + 0x639e, 0x63c9, 0x63a4, 0x0598, 0x63d9, 0x63d2, 0x63da, 0x63dd, + 0x63ce, 0x63fc, 0x6514, 0x6560, 0x68d7, 0x68cb, 0x68cd, 0x68d5, + 0x69e7, 0x6b00, 0x6b0a, 0x6b0f, 0x6b02, 0x6b01, 0x6c1d, 0x6dca, + 0x6dcb, 0x6dcd, 0x6e4f, 0x6e9c, 0x7180, 0x720d, 0x7202, 0x07f1, + 0x7207, 0x71f7, 0x71f8, 0x71fd, 0x7224, 0x71fb, 0x7239, 0x723a, + 0x7422, 0x21a9, 0x756a, 0x756d, 0x7574, 0x770e, 0x7adf, 0x7b2b, + 0x7ae3, 0x7b26, 0x7b2a, 0x7b23, 0x7b35, 0x7b4a, + /* 0x5c */ + 0x7efd, 0x7f00, 0x7f1e, 0x7eff, 0x809e, 0x80fa, 0x81f1, 0x8395, + 0x83a8, 0x83a6, 0x856e, 0x8583, 0x856d, 0x868f, 0x0b6a, 0x87df, + 0x87d5, 0x87e0, 0x87d3, 0x87d8, 0x898c, 0x254b, 0x8994, 0x8996, + 0x8985, 0x898f, 0x89a9, 0x898e, 0x8990, 0x89b8, 0x89c3, 0x89bb, + 0x8aa5, 0x8aa2, 0x25a2, 0x8aa3, 0x8bb5, 0x8bac, 0x8ba8, 0x8dad, + 0x8db8, 0x8db4, 0x8dae, 0x8db6, 0x1085, 0x8dc1, 0x8dbf, 0x8e92, + 0x8f00, 0x8f01, 0x9075, 0x9072, 0x9078, 0x9070, 0x907e, 0x907d, + 0x907f, 0x91ef, 0x936d, 0x938e, 0x938f, 0x938a, 0x938d, 0x9395, + 0x938b, 0x938c, 0x93b0, 0x9393, 0x94fc, 0x9515, 0x950e, 0x9518, + 0x9511, 0x950d, 0x95bb, 0x95b3, 0x0e39, 0x97a1, 0x979a, 0x9784, + 0x97a0, 0x9786, 0x979d, 0x97aa, 0x9778, 0x978d, 0x978a, 0x97a6, + 0x977a, 0x9797, 0x9788, 0x978e, 0x0e3d, 0x0e44, + /* 0x5d */ + 0x9776, 0x9781, 0x9785, 0x9775, 0x97a8, 0x978f, 0x9791, 0x97a2, + 0x979c, 0x9789, 0x977f, 0x9796, 0x9779, 0x979f, 0x97a7, 0x0e46, + 0x9787, 0x979b, 0x97a5, 0x978b, 0x97c9, 0x99ff, 0x9a03, 0x9a00, + 0x9a02, 0x9a04, 0x9a05, 0x99e6, 0x9a1f, 0x9c14, 0x0f0e, 0x9c0c, + 0x9c0f, 0x9c19, 0x9c0b, 0x9c13, 0x9bd5, 0x0f10, 0x9c1c, 0x9d50, + 0x9d4e, 0x9e12, 0x9eb9, 0x9f85, 0x9f88, 0x9f90, 0xa013, 0xa0d0, + 0xa0d1, 0xa0d2, 0xa0d7, 0xa0d6, 0xa0e5, 0xa346, 0xa36b, 0xa345, + 0xa33f, 0xa33e, 0x103e, 0xa36a, 0xa368, 0xa34c, 0xa423, 0xa422, + 0xa497, 0xa491, 0x95b5, 0xa498, 0xa49c, 0xa589, 0x1084, 0xa58b, + 0xa58a, 0xa58d, 0xa58e, 0xa588, 0xaa4e, 0xaa44, 0xaa37, 0xaa75, + 0xaa54, 0xaa76, 0xaa34, 0xaa6b, 0xaa32, 0xaa57, 0xaa52, 0xaa45, + 0x1149, 0xa9b1, 0xaa4b, 0xaa47, 0xaa33, 0xaa40, + /* 0x5e */ + 0xaa3c, 0xaa43, 0xaa4f, 0xaa55, 0xaa41, 0xaab2, 0xaac0, 0xaf34, + 0xaef9, 0xaf19, 0xaf0d, 0xaefa, 0xaf1e, 0xaf1f, 0xaf0e, 0xaf40, + 0xaf08, 0x11df, 0xaf13, 0xaf4c, 0x11f0, 0xb0cc, 0xb0cb, 0xb224, + 0xb225, 0xb23d, 0xb220, 0xb227, 0xb226, 0xb21d, 0xb21e, 0xb232, + 0xb26c, 0xb259, 0x128a, 0xb37a, 0xb379, 0xb41b, 0xb42e, 0xb423, + 0xb420, 0xb41f, 0xb5b6, 0xb5b9, 0xb5a1, 0xb5a3, 0xb5a8, 0xb5af, + 0xb59a, 0xb599, 0xb5a2, 0xb59d, 0x1302, 0xb5ab, 0xb6c9, 0xb6fe, + 0xb700, 0xb6fc, 0xb707, 0xb775, 0xb772, 0xb773, 0xb774, 0xb7fa, + 0xb7fc, 0xb7f8, 0xb7f6, 0xb7fb, 0xb8cd, 0xb8d1, 0xb8cf, 0xb974, + 0xb972, 0xb973, 0xba54, 0xba51, 0x13c0, 0xba53, 0xba49, 0xba4c, + 0xba4a, 0xba4f, 0xba56, 0xbc00, 0xbbd5, 0xbbd7, 0xbbff, 0xbbd9, + 0xbbe3, 0xbbd3, 0x1415, 0xbbd8, 0xbbd4, 0xbbde, + /* 0x5f */ + 0xbd71, 0xbe74, 0xbe88, 0xbe7f, 0xbe6b, 0xbe87, 0xbe79, 0xbe78, + 0xbe89, 0xbe80, 0xbe76, 0xbf29, 0xbf28, 0xbf2f, 0xc0e5, 0xc104, + 0xc103, 0xc0f0, 0xc0e8, 0xc0ea, 0xc0f1, 0xc101, 0xc102, 0xc2a9, + 0xc2ab, 0xc2b7, 0xc2b6, 0x14e2, 0xc3a0, 0xc38e, 0xc386, 0xc387, + 0xc385, 0xc38b, 0xc388, 0xc390, 0xc41a, 0xc434, 0xc537, 0xc52f, + 0xc530, 0xc539, 0xc534, 0xc533, 0xc585, 0xc584, 0xc53a, 0xc79f, + 0xc869, 0xc86c, 0xc86a, 0xc867, 0xc86b, 0xca3f, 0xca40, 0xcb0b, + 0xcbd2, 0xcbf8, 0xcc01, 0xcbfa, 0xcc16, 0xe3f6, 0xcd2c, 0xcd2d, + 0xcd2f, 0xcd2e, 0xcdc1, 0xcdf5, 0xcdc4, 0xcdde, 0xcdcc, 0xcdd2, + 0xcdc2, 0xcdcd, 0xcdcf, 0xcddd, 0xcdc8, 0xceba, 0xcebe, 0xcebf, + 0xcf2e, 0xcf30, 0xcfe7, 0xcfee, 0xcfe8, 0xcfe6, 0xcfe2, 0xcfe4, + 0xcffb, 0xcffc, 0xcfea, 0xd0ed, 0xd0f6, 0xd0f3, + /* 0x60 */ + 0xd0f4, 0xd0f1, 0xd0f7, 0xd0f5, 0xd0ea, 0xd0eb, 0xd200, 0xd22c, + 0xd212, 0xd23d, 0xd233, 0x174d, 0xd230, 0xd240, 0xd231, 0xd257, + 0x174a, 0xd235, 0xd232, 0xd22d, 0xd236, 0xd238, 0xd262, 0xd25f, + 0xd28a, 0xd3d6, 0xd3d8, 0xd3dd, 0xd3e4, 0xd3e3, 0xd54d, 0xd5d7, + 0xd64a, 0xd64c, 0xd650, 0xd64b, 0xd64e, 0xd64f, 0xd739, 0xd7d2, + 0xd7cd, 0xd7d3, 0xd7e1, 0xd7ce, 0xd7d5, 0xd7dd, 0xd7d4, 0xd7cf, + 0xd8cb, 0xd8a6, 0xd8c2, 0xd8a5, 0xd8a9, 0xd8a2, 0xd8a4, 0xd8b0, + 0xd8cc, 0xd8af, 0xd8bf, 0xdb24, 0xdb1a, 0xdb14, 0xdb3a, 0xdb20, + 0xdb1b, 0xdb21, 0xdb25, 0xdb1e, 0xdb3f, 0xdb40, 0xdb18, 0xdb2c, + 0xdb15, 0xdb2d, 0xdb1f, 0xdb29, 0xdb4b, 0xddb3, 0xdda5, 0xdda7, + 0xddab, 0xdda6, 0xddaa, 0xde22, 0xde23, 0xdea1, 0xdea3, 0xdea0, + 0xdebd, 0xdeba, 0xdefa, 0xdef8, 0xdefc, 0xdef6, + /* 0x61 */ + 0xdf34, 0xdf43, 0x1963, 0xdfd4, 0xe00d, 0xe043, 0xe041, 0xe03d, + 0xe040, 0xe03e, 0xe03f, 0xe046, 0x1993, 0xe0d4, 0x3f35, 0x3f36, + 0x3f32, 0x3f3a, 0x3fc8, 0x4036, 0x411e, 0x411d, 0x411f, 0x431c, + 0x431d, 0x4320, 0x010e, 0x43c0, 0x4b9a, 0x4b93, 0x4bdd, 0x020a, + 0x4ba3, 0x4ba9, 0x4b9c, 0x4b9b, 0x020d, 0x4b97, 0x4fb1, 0x4fca, + 0x4fb3, 0x4fcd, 0x53ea, 0x53ee, 0x53ef, 0x55df, 0x5650, 0x56bb, + 0x5a88, 0x5a89, 0x5a8c, 0x5a85, 0x5a5e, 0x5a94, 0x5a95, 0x5c6b, + 0x5c6a, 0x5c69, 0x5de3, 0x5df1, 0x5f37, 0x5f33, 0x6091, 0x608f, + 0x6097, 0x63d4, 0x63de, 0x63d3, 0x63e0, 0x6443, 0x640b, 0x63ff, + 0x6404, 0x6407, 0x68f9, 0x68fa, 0x68fb, 0x68f8, 0x6b12, 0x6b10, + 0x6c1f, 0x6ddf, 0x6de3, 0x6e52, 0x6ea9, 0x7265, 0x7287, 0x7242, + 0x7252, 0x724c, 0x719f, 0x7201, 0x7248, 0x724f, + /* 0x62 */ + 0x727e, 0x724d, 0x7258, 0x7247, 0x725e, 0x7249, 0x724e, 0x725d, + 0x725a, 0x7286, 0x7251, 0x7429, 0x74a6, 0x74a7, 0x7570, 0x756f, + 0x75d3, 0x75d2, 0x7728, 0x771b, 0x771a, 0x771c, 0x7721, 0x7b32, + 0x7b66, 0x7b7d, 0x7b73, 0x7b7f, 0x7b65, 0x7b80, 0x7b61, 0x7b75, + 0x7b6e, 0x7b67, 0x7b71, 0x7b6c, 0x7b63, 0x7b62, 0x7b83, 0x7bb2, + 0x7b81, 0x7b6f, 0x7b6b, 0x7b82, 0x7b8a, 0x7f29, 0x7f30, 0x7f31, + 0x8097, 0x8100, 0x80ff, 0x83b6, 0x83b5, 0x83c3, 0x858d, 0x8618, + 0x869c, 0x869a, 0x8699, 0x89b7, 0x89c4, 0x89c6, 0x89c7, 0x89bc, + 0x89c0, 0x89c5, 0x89cd, 0x89c1, 0x89be, 0x8aa7, 0x8ab8, 0x8b23, + 0x0c74, 0x8de8, 0x8dde, 0x8de3, 0x8def, 0x8ddc, 0x8de4, 0x8de1, + 0x8de5, 0x8e95, 0x8e94, 0x8e93, 0x8e8e, 0x9098, 0x909c, 0x9099, + 0x90a0, 0x909e, 0x9204, 0x93d3, 0x93b4, 0x93bb, + /* 0x63 */ + 0x93b7, 0x93b8, 0x93bd, 0x93b6, 0x93b9, 0x93b5, 0x9522, 0x9521, + 0x95c3, 0x95bc, 0x97ff, 0x97e5, 0x97f7, 0x97d2, 0x9800, 0x97db, + 0x97f0, 0x97e2, 0x97cd, 0x0e56, 0x97e1, 0x97f2, 0x97dc, 0x97cc, + 0x97d6, 0x97f3, 0x97fa, 0x97f6, 0x97ec, 0x97ea, 0x97e3, 0x97d0, + 0x0e5a, 0x9795, 0x97d5, 0x97f4, 0x97cb, 0x97da, 0x97c8, 0x97df, + 0x97f5, 0x97cf, 0x97c7, 0x97d7, 0x9a24, 0x0ea3, 0x9a1c, 0x9a21, + 0x9a1e, 0x9a18, 0x9a1b, 0x0ea8, 0x9c46, 0x9c4b, 0x9c48, 0x9c47, + 0x9c67, 0x9c54, 0x9e15, 0x9e22, 0x9ec5, 0x9e29, 0x9ec7, 0x9f8d, + 0xa01b, 0xa020, 0xa0e2, 0xa0e7, 0xa0e8, 0xa0e1, 0xa372, 0xa37b, + 0xa374, 0xa371, 0xa379, 0xa375, 0xa390, 0xa377, 0xa37d, 0xa44f, + 0xa450, 0xa4a3, 0xa4a2, 0xa4f4, 0xa594, 0xa59a, 0xa59b, 0xa5a7, + 0xa597, 0xa595, 0xa592, 0xa59c, 0xa596, 0xaab6, + /* 0x64 */ + 0xaab8, 0xaab0, 0xab18, 0xaac5, 0xaab5, 0xaac2, 0xab06, 0xab19, + 0xaab9, 0xab15, 0xaad6, 0xaaac, 0x113c, 0xaac6, 0xaab3, 0xaac3, + 0xaaca, 0xaacf, 0xaabd, 0xaace, 0xab14, 0xaaba, 0xab1a, 0xaac1, + 0xaabb, 0x119b, 0x119a, 0xad01, 0xacfc, 0xaf5a, 0xaf54, 0xaf61, + 0xaf5c, 0xaf55, 0xaf4a, 0xaf4b, 0xaf51, 0xaf69, 0xaf6b, 0x2cf1, + 0xaf66, 0xaf58, 0xaf5d, 0xaf67, 0xaf56, 0xaf88, 0xaf64, 0xaf4e, + 0xb257, 0xb25a, 0xb251, 0xb24a, 0xb24b, 0x125e, 0xb247, 0xb26f, + 0xb26a, 0xb26b, 0xb246, 0xb26d, 0xb254, 0xb26e, 0xb24c, 0xb378, + 0xb386, 0xb382, 0x12a7, 0xb5e1, 0xb5e5, 0xb5db, 0xb5de, 0xb5d7, + 0xb703, 0xb77c, 0xb77e, 0xb805, 0xb807, 0xb8e6, 0xb8e1, 0xb8fb, + 0xb8e5, 0xb8e7, 0xb8df, 0xb8ff, 0xb976, 0xba63, 0xba66, 0xba65, + 0xba5e, 0xba64, 0xba6b, 0xba5f, 0xba67, 0xba68, + /* 0x65 */ + 0xbc08, 0xbc09, 0xbc17, 0xbc15, 0xbc1b, 0xbc0b, 0xbc28, 0xbc0e, + 0xbc18, 0xbc53, 0xbc45, 0xbc0d, 0xbc0a, 0xbc13, 0xbc4a, 0xbd79, + 0xbea1, 0xbe8d, 0xbea2, 0xbe90, 0x146e, 0xbf31, 0xbf30, 0xc11f, + 0xc119, 0xc10c, 0xc11e, 0xc11d, 0xc107, 0xc266, 0xc2c5, 0xc2ba, + 0xc2bd, 0xc2c2, 0xc2c3, 0xc2bf, 0x150d, 0xc3a1, 0xc3a2, 0xc3a8, + 0xc3a3, 0xc3aa, 0xc3af, 0xc3b9, 0xc437, 0xc58f, 0x1543, 0xc58e, + 0xc587, 0xc58a, 0xc592, 0xc597, 0xc59f, 0xc605, 0xc7a9, 0xc7a7, + 0xc88a, 0xc882, 0xc885, 0xc88b, 0xc889, 0xc881, 0xc880, 0xc887, + 0xc886, 0xca4d, 0xcb1c, 0xcb1f, 0xcc21, 0xcc1d, 0xcc22, 0xcbfe, + 0xcc1b, 0xcc3a, 0xcc37, 0xcc17, 0xcc38, 0xcc26, 0xcc18, 0xcd34, + 0xcd35, 0xcd32, 0x1673, 0xcde1, 0xcdfd, 0xcde3, 0xcde8, 0xcdf9, + 0xcdff, 0xcdfe, 0x1674, 0xcde0, 0xce00, 0x1670, + /* 0x66 */ + 0xcdec, 0xcde4, 0xcdef, 0xcdfa, 0xceca, 0xcf31, 0xcf32, 0xcf34, + 0xcf41, 0xd000, 0xd006, 0xd008, 0xd005, 0xd003, 0xd00b, 0xd002, + 0xd00a, 0xd0f0, 0xd113, 0xd10a, 0xd10f, 0xd111, 0xd108, 0xd10b, + 0xd112, 0xd10d, 0xd25b, 0xd263, 0xd261, 0xd268, 0xd25a, 0xd34e, + 0xd34d, 0xd350, 0xd3fc, 0xd412, 0xd3f5, 0xd41e, 0xd3f0, 0xd3f3, + 0xd3f2, 0xd401, 0xd3ef, 0xd3ee, 0xd416, 0xd3f6, 0xd3fb, 0xd41c, + 0x17db, 0xd55d, 0xd560, 0xd566, 0xd55f, 0xd561, 0xd55b, 0xd562, + 0xd557, 0xd669, 0xd66b, 0xd661, 0xd677, 0xd65f, 0xd663, 0xd662, + 0xd665, 0xd7ef, 0xd7e2, 0xd800, 0xd7e8, 0xd7f2, 0xd7e7, 0x1829, + 0xd7e5, 0xd8d5, 0xd8d0, 0xd8da, 0xd8d3, 0x1851, 0xd8d9, 0xd8cf, + 0xd8d6, 0xd8d8, 0xd8f5, 0xd8ce, 0xd8d7, 0xd8f4, 0xd8cd, 0xd901, + 0x36ba, 0xdb52, 0xdb55, 0xdb5a, 0xdb4d, 0xdb54, + /* 0x67 */ + 0xdb53, 0xdb5e, 0xdb67, 0xdb65, 0xdb4e, 0x18db, 0xdb4f, 0xdb61, + 0xdb6e, 0xdb51, 0xdb5b, 0xdd63, 0xddb7, 0xddb6, 0xddc3, 0xddbb, + 0xddb5, 0xde2e, 0xde30, 0xde33, 0xde31, 0xdea4, 0xdec1, 0xdebb, + 0xdebe, 0xdf00, 0xdeff, 0xdf40, 0x1965, 0xdf3f, 0xdf44, 0x1964, + 0x1967, 0xdfdb, 0xe00f, 0xe011, 0xe04e, 0xe04d, 0xe04b, 0xe04c, + 0xe095, 0x3f3b, 0x3f45, 0x3f44, 0x3f3e, 0x3f3c, 0x3f3f, 0x3fcc, + 0x3fce, 0x4122, 0x4123, 0x419f, 0x43c5, 0x43c4, 0x4be9, 0x4b99, + 0x0211, 0x4be6, 0x4be7, 0x4bf7, 0x4fd2, 0x0333, 0x53fd, 0x540c, + 0x540b, 0x57ed, 0x0421, 0x0422, 0x5a9b, 0x5b0a, 0x5c6f, 0x5c75, + 0x5df2, 0x5df8, 0x5f3e, 0x6424, 0x640e, 0x6416, 0x6418, 0x6410, + 0x6431, 0x6444, 0x05a6, 0x6429, 0x642f, 0x644b, 0x6436, 0x05a3, + 0x6934, 0x6900, 0x692b, 0x6b20, 0x6b21, 0x6b1e, + /* 0x68 */ + 0x6b1d, 0x6df5, 0x6df2, 0x6df6, 0x7290, 0x729d, 0x729c, 0x7292, + 0x7294, 0x72d1, 0x7293, 0x72b7, 0x7297, 0x72b0, 0x729f, 0x72c9, + 0x742d, 0x742c, 0x7577, 0x772c, 0x7bc0, 0x7bb9, 0x7f53, 0x8040, + 0x8202, 0x81fb, 0x0aa1, 0x858b, 0x85ae, 0x85ab, 0x86a1, 0xddcd, + 0x87ea, 0x89dd, 0x89dc, 0x89d9, 0x8aab, 0x8aac, 0x8aad, 0x8ab2, + 0x8b2c, 0x8b2b, 0x8bc2, 0x8e00, 0x8e0d, 0x8e06, 0x8dff, 0x8e03, + 0x8e01, 0x8e10, 0x8e0f, 0x8e05, 0x8e98, 0x8e97, 0x8e96, 0x8e99, + 0x90ac, 0x90ab, 0x9212, 0x93d8, 0x93df, 0x93d6, 0x952d, 0x9532, + 0x983f, 0x982f, 0x9826, 0x983a, 0x9839, 0x0e5f, 0x983b, 0x9835, + 0x982a, 0x9821, 0x9838, 0x9837, 0x9834, 0x0e5c, 0x9822, 0x9836, + 0x9844, 0x9a45, 0x9a3b, 0x9a36, 0x9a42, 0x9c7a, 0x9c86, 0x9c8b, + 0x9c7f, 0x9c81, 0x9e2a, 0x9ed5, 0x9f9f, 0x9f9d, + /* 0x69 */ + 0xa026, 0xa0f4, 0xa0f5, 0xa315, 0xa38e, 0xa38f, 0xa426, 0xa4a7, + 0xa4af, 0xa5ad, 0xa5ac, 0xa5ab, 0xa5aa, 0xab2f, 0xab21, 0xab23, + 0xaba3, 0xab49, 0xab3a, 0xab48, 0xab2d, 0xab25, 0xab29, 0xab32, + 0xab34, 0xab24, 0xab2c, 0xab4b, 0xab3b, 0xab20, 0xab28, 0xaf98, + 0x11f5, 0xaf97, 0x2d04, 0xaf9d, 0xafa8, 0xb0d5, 0xb277, 0xb278, + 0xb272, 0xb273, 0xb302, 0xb43b, 0xb5fe, 0xb60b, 0xb5ff, 0xb607, + 0x1311, 0x130c, 0xb630, 0xb6cd, 0xb6cf, 0xb710, 0xb70a, 0xb783, + 0xb815, 0xb80e, 0xb80c, 0xb902, 0xb8fe, 0xb905, 0xb915, 0xb908, + 0xba7f, 0xba77, 0xba7c, 0xba82, 0xba7e, 0xba78, 0xba7d, 0xba79, + 0xba81, 0xbc4b, 0xbc63, 0xbc64, 0xbc56, 0xbc54, 0xbc4e, 0xbc10, + 0xbc4f, 0xbc57, 0xbc5e, 0xbc51, 0xbc6a, 0xbc69, 0xbead, 0xbea4, + 0xbeac, 0xbea9, 0xbeae, 0x3f4c, 0xc150, 0xc135, + /* 0x6a */ + 0xc132, 0xc2d8, 0xc2d1, 0xc2cf, 0xc2be, 0xc3d5, 0xc3c1, 0xc3c6, + 0xc3c3, 0xc3c2, 0xc3c0, 0xc3c5, 0xc3c7, 0xc3bf, 0xc3c4, 0xc3d4, + 0xc590, 0xc5d2, 0x154e, 0xc5d4, 0xc7af, 0xc7ae, 0xc7b2, 0xc7ad, + 0xc89c, 0xc8a0, 0xc8b6, 0xca3d, 0xca56, 0xca82, 0xcb28, 0xcb2b, + 0xcc3c, 0xcc3e, 0xcc3f, 0xcc42, 0xcc3d, 0xcc41, 0xcc3b, 0xcc49, + 0xcc43, 0xcd39, 0xcd38, 0xce22, 0xce08, 0xce0c, 0xce06, 0xce13, + 0xce04, 0xce20, 0xce1d, 0xce05, 0xce0a, 0xced6, 0xced7, 0xcf36, + 0xcf37, 0xd023, 0xd022, 0xd020, 0xd01a, 0xd01d, 0xd11c, 0xd120, + 0xd177, 0xd27f, 0xd28b, 0xd27d, 0xd299, 0xd284, 0xd289, 0xd285, + 0xd283, 0xd286, 0xd29e, 0xd353, 0xd417, 0x1794, 0xd419, 0xd420, + 0xd41f, 0xd423, 0xd418, 0xd421, 0xd429, 0xd424, 0xd426, 0xd55e, + 0xd56f, 0xd56e, 0xd574, 0xd572, 0xd573, 0xd67d, + /* 0x6b */ + 0xd67e, 0xd685, 0xd67f, 0xd684, 0xd744, 0xd7f5, 0xd7f8, 0xd803, + 0xd7f6, 0xd928, 0x1863, 0xd939, 0xd8fb, 0xd90e, 0xd8fd, 0xd91f, + 0x1861, 0xd903, 0x36d8, 0xd910, 0x185a, 0xd90d, 0xd927, 0xd941, + 0xdb72, 0xdb78, 0xdb80, 0x18e3, 0xdb85, 0xdb7b, 0x387c, 0xdb7d, + 0xdb91, 0xdb88, 0xdbaa, 0xdb8d, 0xdb89, 0xdb95, 0xdb9b, 0xdb8c, + 0xdb9e, 0xdb7c, 0xdb86, 0xdb84, 0xdd68, 0xddc5, 0xddc4, 0xddc9, + 0xddc6, 0xde42, 0xde45, 0xde41, 0xde44, 0xdea6, 0xdec2, 0xdf42, + 0xdf49, 0xdf48, 0xdf4a, 0xdf4c, 0xdf4b, 0xe017, 0xe018, 0xe015, + 0xe052, 0xe054, 0xe053, 0xe09a, 0xe09b, 0xe0dc, 0xe0e4, 0xe191, + 0x19af, 0xe1ba, 0x3f51, 0x3f5b, 0x3fcf, 0x6e05, 0x4c13, 0x4c15, + 0x4c14, 0x4c23, 0x0213, 0x4c11, 0x4c12, 0x0280, 0x4ff0, 0x519b, + 0x5412, 0x5416, 0x5417, 0x54b5, 0x57f4, 0x5ab1, + /* 0x6c */ + 0x5c79, 0x5dff, 0x5dfc, 0x5dfb, 0x5f3f, 0x5f44, 0x609d, 0x6432, + 0x644c, 0x642b, 0x645a, 0x651f, 0x6901, 0x692d, 0x6927, 0x6959, + 0x695a, 0x694d, 0x6958, 0x6b23, 0x6b25, 0x6b2b, 0x6dff, 0x6eae, + 0x72cb, 0x72ca, 0x72d0, 0x72ce, 0x72cc, 0x72d8, 0x72c6, 0x72d2, + 0x72cf, 0x72c8, 0x7617, 0x19b0, 0x7bc4, 0xcd40, 0x7be9, 0x7bf2, + 0x7bfc, 0x7bea, 0x7beb, 0x7bfd, 0x7f78, 0x7f77, 0x7f73, 0x7f9e, + 0x7f79, 0x80a2, 0x8103, 0x8204, 0x8205, 0x83ce, 0x85bf, 0x89f6, + 0x89f7, 0x8b31, 0x8b30, 0x8bc9, 0x8bc7, 0x8e1c, 0x8e28, 0x8e1a, + 0x8e1e, 0x8e1b, 0x8e1f, 0x90bf, 0x90bb, 0x90bc, 0x90c0, 0x921a, + 0x93ef, 0x93ec, 0x93e9, 0x93f0, 0x93fe, 0x9534, 0x986a, 0x9895, + 0x986c, 0x9872, 0x9867, 0x9860, 0x986b, 0x985e, 0x986f, 0x9866, + 0x2946, 0x9862, 0x985d, 0x985c, 0xe365, 0x9a50, + /* 0x6d */ + 0x9c9f, 0x0f23, 0x9c9e, 0x9ca6, 0x9e35, 0x9e38, 0x9e36, 0x9e3a, + 0x9edc, 0xa37c, 0xa3ab, 0x1049, 0xa3a8, 0xa3a7, 0xa42b, 0xa42c, + 0xa428, 0x442b, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4f8, 0xa5b1, 0xa5f0, + 0xa5ef, 0xaba8, 0xab8b, 0xab94, 0xab9e, 0xab8f, 0xab88, 0xab7e, + 0xab81, 0xab30, 0xab9b, 0xab82, 0xab90, 0xab85, 0xab7f, 0xaba9, + 0xabde, 0xad0d, 0x11fa, 0xafcf, 0xafcb, 0xafd8, 0xafdd, 0xafd3, + 0xafd0, 0xafd5, 0xafd6, 0xb0d6, 0xb292, 0xb295, 0xe0cb, 0xb28d, + 0xb29b, 0xb29d, 0xb28f, 0xb29e, 0xb2a6, 0xb396, 0xb392, 0xb616, + 0xb62a, 0xb629, 0xb62c, 0xb715, 0xb712, 0xb711, 0xb713, 0xb788, + 0xb78b, 0xb78a, 0xb787, 0xb817, 0xb816, 0xb81a, 0xb919, 0xb917, + 0xba91, 0xba94, 0xbc8b, 0xbc90, 0xbc8f, 0xbc86, 0xbc83, 0xbc8e, + 0xbc87, 0xbca8, 0xbc85, 0xbca6, 0xbc82, 0xbca7, + /* 0x6e */ + 0xbeb9, 0xbeb7, 0xbeb4, 0xbeb6, 0xbeb3, 0xbec6, 0xc13c, 0xc140, + 0xc138, 0xc291, 0xc2a6, 0xc2da, 0xc3da, 0xc3d8, 0xc3d9, 0xc3db, + 0xc3d7, 0xc616, 0xc612, 0xc61f, 0x1559, 0xc614, 0xc61a, 0xc610, + 0xc7b3, 0xc8ae, 0xc8c1, 0xc8b0, 0xc8af, 0xc8b1, 0xc8ad, 0xc8b2, + 0xc8c4, 0xcb3c, 0xcb3f, 0xcc61, 0xcc66, 0xcd3c, 0xcd3b, 0xce2c, + 0x167e, 0xce2a, 0xce3e, 0xce2f, 0xce32, 0xce27, 0xce29, 0xce40, + 0xcedf, 0xcede, 0xcf3c, 0xcf3b, 0xcf3e, 0xd021, 0xd046, 0xd03c, + 0xd036, 0xd038, 0xd035, 0xd131, 0xd136, 0xd12d, 0xd133, 0xd12f, + 0xd12e, 0xd135, 0xd2ac, 0xd2a9, 0xd2a6, 0x17a8, 0xd44c, 0xd443, + 0xd441, 0xd44f, 0xd442, 0xd451, 0x17a9, 0xd440, 0xd450, 0xd445, + 0xd44a, 0xd44b, 0xd583, 0xd582, 0xd581, 0xd5e0, 0xd698, 0xd69f, + 0xd69b, 0xd69a, 0xd699, 0xd696, 0xd6ae, 0xd69e, + /* 0x6f */ + 0xd809, 0xd80d, 0xd94e, 0xd94a, 0xd94d, 0xd940, 0xd93e, 0xd948, + 0xd942, 0xd962, 0xd945, 0xd951, 0xdbc6, 0xdbd0, 0xdbc0, 0xdbb7, + 0xdbc2, 0xdbbc, 0xdbc5, 0xdbdc, 0xdbdb, 0xdbd2, 0xdbc7, 0xdbb6, + 0xdbc9, 0xdbcc, 0xdbd1, 0xdbcd, 0xdbda, 0xdbba, 0xdbd3, 0xdbce, + 0xdbf6, 0xdbbd, 0xdbdd, 0xdbc8, 0xdc0d, 0xdc35, 0xdd71, 0xdd6e, + 0xdd6f, 0xddd6, 0xde4c, 0xde4f, 0xde54, 0xde53, 0xdec9, 0xdec8, + 0xdf03, 0x1954, 0xdf04, 0x1956, 0xdf57, 0xdf52, 0xdf53, 0x196d, + 0xdf56, 0xdf5c, 0xdf55, 0xe064, 0xe05d, 0xe05e, 0xe0a2, 0xe0a3, + 0x198e, 0xe0e7, 0xe0e6, 0xe198, 0xe1ac, 0xe1af, 0xe1ae, 0x3f59, + 0x40a9, 0x432a, 0x43c7, 0x4c41, 0x4c37, 0x4c35, 0x4c33, 0x4c39, + 0x4c32, 0x4fff, 0x5001, 0x4ff8, 0x541b, 0x5419, 0x56bf, 0x5abc, + 0x5abe, 0x5abd, 0x5c7d, 0x5f46, 0x5f47, 0x60a4, + /* 0x70 */ + 0x6521, 0x6562, 0x6986, 0x0672, 0x6b2f, 0x6b31, 0x0814, 0x72f8, + 0x72f5, 0x72f9, 0x72f2, 0x72fa, 0x72f3, 0x7314, 0x72fd, 0x730f, + 0x730e, 0x7301, 0x7437, 0x7435, 0x7434, 0x7431, 0x757a, 0x757b, + 0x7737, 0x7c2b, 0x7bfb, 0x7c16, 0x7c13, 0x0993, 0x7c11, 0x7c0f, + 0x7c1b, 0x7c38, 0x7fa4, 0x8209, 0x8207, 0x820b, 0x83d3, 0x83d1, + 0x83d8, 0x861d, 0x86a9, 0x86d0, 0xad15, 0x8a02, 0x8a05, 0x8a01, + 0x8a00, 0x8e2e, 0x8e30, 0x8e2f, 0x8e31, 0x90d2, 0x90d3, 0x9402, + 0x9540, 0x9542, 0x953b, 0x95ce, 0x9898, 0x988f, 0x9894, 0x9891, + 0x0e6f, 0x98ba, 0x9890, 0x9886, 0x989a, 0x988c, 0x9893, 0x9887, + 0x9888, 0x9897, 0x988d, 0x989c, 0x98bd, 0x9a3c, 0x9a59, 0x0eb0, + 0x9cd1, 0x9cbb, 0x9cbe, 0x9d5d, 0x9ee2, 0xa105, 0xa3ba, 0x012e, + 0xa3f4, 0xa4b2, 0xa4f9, 0xa5b7, 0xa5b6, 0xab89, + /* 0x71 */ + 0xabf9, 0xabd9, 0xabe8, 0xabd4, 0xabdb, 0xabe2, 0xabdf, 0xabd1, + 0xabe9, 0xabea, 0xad13, 0xad11, 0xaffa, 0xaff8, 0xaff4, 0xaffb, + 0xb00e, 0xb002, 0xb00f, 0xb290, 0xb2ad, 0xb2a9, 0xb448, 0xb65a, + 0xb64f, 0xb64e, 0xb655, 0xb654, 0xb64a, 0xb6d5, 0xb718, 0xb78d, + 0xb81d, 0xb819, 0xb926, 0xb928, 0xb92b, 0xb97d, 0xbaa0, 0xba9a, + 0xba9b, 0xbcb5, 0xbcad, 0xbcb2, 0xbd94, 0xbec9, 0xc14e, 0xc14f, + 0xc144, 0xc152, 0xc3e9, 0xc439, 0x1569, 0x337e, 0xc8c7, 0xc8d3, + 0xc8c6, 0xc8c3, 0x15b4, 0xc8d2, 0xca66, 0xcc7f, 0xcc80, 0xcc84, + 0xcc85, 0xcce3, 0x164d, 0xcd41, 0xcd44, 0xcd43, 0xce4e, 0xce4f, + 0x1683, 0xce49, 0xce4a, 0xce4b, 0xce43, 0xcee0, 0xcee5, 0xcee1, + 0xcee6, 0xcee2, 0xcf0c, 0xcf40, 0xd049, 0xd04a, 0xd054, 0xd04c, + 0xd055, 0xd056, 0xd13b, 0xd13d, 0xd2a4, 0xd2a8, + /* 0x72 */ + 0xd2c3, 0xd2bf, 0xd2c8, 0xd2c2, 0xd2ca, 0xd2cc, 0xd2c9, 0xd2be, + 0xd2cd, 0xd2c7, 0xd2c5, 0xd35d, 0x17b0, 0xd46c, 0xd46b, 0xd470, + 0xd46d, 0xd46f, 0xd489, 0xd484, 0xd58d, 0xd58a, 0xd58e, 0xd591, + 0xd6b5, 0xd6b1, 0xd6af, 0xd6b9, 0xd6b7, 0xd6b0, 0x180c, 0xd717, + 0x1818, 0xd74f, 0xd819, 0xd810, 0xd818, 0xd811, 0xd81c, 0xd812, + 0xd976, 0xd971, 0x3720, 0xd97a, 0xd97f, 0x3722, 0xd973, 0xd9ab, + 0x371e, 0xd977, 0xd974, 0xd97e, 0xd99b, 0xd984, 0xd97c, 0xdc29, + 0xdc2b, 0xdc0e, 0xdc00, 0xdc0b, 0xdbfe, 0xdbfa, 0xdc17, 0xdbff, + 0xdc0c, 0xdc0f, 0x18f5, 0xdc02, 0xdc01, 0xdbfc, 0xdc49, 0xdc06, + 0xdc12, 0xdc13, 0xdd78, 0xde5b, 0xde62, 0xde5f, 0xde5d, 0xdeab, + 0xded5, 0xded4, 0xded3, 0xdf07, 0xdf6c, 0xdf70, 0xdf6e, 0xdf68, + 0xdf6d, 0xdf77, 0xdf6a, 0xdfce, 0xdfec, 0xe069, + /* 0x73 */ + 0xe068, 0xe0a6, 0xe0a9, 0xe0aa, 0xe100, 0xe10d, 0xe0f8, 0xe0fc, + 0xe10a, 0xe0f7, 0xe101, 0xe1b6, 0xe1bb, 0xe1b7, 0xe1b9, 0xe1ca, + 0x3f69, 0x4125, 0x4c59, 0x5007, 0x5009, 0x5422, 0x5607, 0x5604, + 0x6e0f, 0x57f8, 0x5ac7, 0x5ad1, 0x5c7e, 0x5e08, 0x5f4a, 0xe298, + 0x5fb9, 0x6988, 0x6991, 0x6984, 0x6973, 0x6989, 0x6985, 0x6b33, + 0x6e13, 0x731d, 0x731f, 0x731c, 0x7320, 0x731a, 0x731b, 0x7439, + 0x74af, 0x75e5, 0x773c, 0x7c37, 0x7c3a, 0x7fbb, 0x0a0e, 0x8210, + 0x820d, 0x86af, 0x8711, 0x0bd8, 0x8a0d, 0x8a0c, 0x8a0b, 0x8bd4, + 0x8e3d, 0x8e3e, 0x8e3b, 0x8e43, 0x8e40, 0x8e46, 0x8f11, 0x90dd, + 0x90df, 0x90ea, 0x924a, 0x9406, 0x98c1, 0x98b9, 0x98c6, 0x98b8, + 0x98bb, 0x98c8, 0x98c5, 0x98bf, 0x98c7, 0x98c4, 0x9a65, 0x9a67, + 0x9cd7, 0x9cdb, 0x9cd4, 0x9cd6, 0x9ee8, 0xa10a, + /* 0x74 */ + 0xa5bd, 0xa5be, 0xac1a, 0xac0d, 0xac0f, 0xac1b, 0xac10, 0xac11, + 0xac13, 0xad18, 0xb020, 0xb01f, 0xb023, 0xb01d, 0xb037, 0xb025, + 0xb024, 0xb02a, 0xb027, 0xb033, 0xb028, 0xb034, 0xb2ba, 0x2e70, + 0xb39d, 0xb44c, 0xb65c, 0xb66a, 0xb65d, 0xb665, 0xb663, 0xb65e, + 0xb719, 0xb797, 0xb93f, 0xb933, 0xb932, 0xbaa1, 0xbaa5, 0xbaa4, + 0xbaa2, 0xbcc1, 0x142c, 0xbcc7, 0xbcc4, 0xbcc6, 0xbcc5, 0xbcd4, + 0xbcca, 0xc153, 0xc3f1, 0xc421, 0x156e, 0xc6b7, 0xc692, 0xc8d4, + 0xca44, 0xcc98, 0xcc9b, 0xcc91, 0xcc95, 0xcc9a, 0xcc92, 0xce53, + 0xce57, 0x1686, 0xce5c, 0xce5d, 0xce64, 0xceea, 0xceed, 0xcf42, + 0xcf43, 0xd064, 0xd061, 0xd060, 0xd17d, 0xd2d4, 0xd2d5, 0xd2d9, + 0xd487, 0xd499, 0xd48c, 0xd48a, 0xd48f, 0x17b3, 0xd48b, 0xd482, + 0xd49b, 0x17eb, 0xd6c8, 0xd6c4, 0xd6cc, 0xd6c7, + /* 0x75 */ + 0xd6c3, 0xd6c6, 0xd6cb, 0xd6ca, 0xd6c9, 0xd6cd, 0xd753, 0xd821, + 0xd829, 0xd81d, 0xd824, 0xd828, 0x3743, 0xd9b1, 0xd9b2, 0xd9b5, + 0xd9d6, 0xd9af, 0xd9ca, 0xd9b8, 0xe412, 0xe411, 0xdc45, 0xdc47, + 0xdc34, 0xdc6e, 0xdc42, 0xdc31, 0xdc2e, 0xdc56, 0xdc38, 0xdc37, + 0xdc4b, 0xdc2d, 0xdc33, 0xdc36, 0x38e0, 0xdc48, 0xdddc, 0x1942, + 0xde66, 0xde6d, 0xde63, 0xde64, 0x1941, 0xde67, 0xded9, 0xdf0b, + 0xdf7e, 0xdf8b, 0xe026, 0xe02c, 0xe029, 0xe06f, 0xe06b, 0xe06d, + 0xe06e, 0xe11c, 0xe111, 0xe110, 0xe124, 0xe112, 0xe115, 0xe117, + 0x19ac, 0x3f6f, 0x40ab, 0x432e, 0x43c9, 0x4696, 0x4c85, 0x51a0, + 0x542b, 0x5e0d, 0x6b36, 0x3afd, 0x072f, 0x072e, 0x6eb1, 0x734a, + 0x7337, 0x733c, 0x7338, 0x733a, 0x733e, 0x7349, 0x084d, 0x087b, + 0x7580, 0x757f, 0x75e3, 0x773f, 0x7c52, 0x7c4e, + /* 0x76 */ + 0x7c4a, 0x7c4b, 0x7fd5, 0x85d8, 0x8620, 0x86b3, 0x86b1, 0x86b0, + 0x8a17, 0x8bd9, 0x8e49, 0x8f13, 0x90ed, 0x90eb, 0x90ee, 0x940a, + 0x940b, 0x954a, 0x98d5, 0x98d7, 0x98de, 0x98dc, 0x98ee, 0x9a70, + 0x0eb2, 0x9cd9, 0x9ed7, 0xa3cb, 0xa3c7, 0xa4fc, 0xac3b, 0xac39, + 0xac4b, 0xac43, 0xac40, 0xac46, 0xb04d, 0xb043, 0xb047, 0xb04b, + 0xb055, 0xb052, 0xb65f, 0x1322, 0xb67c, 0xb67b, 0xbaa8, 0xbaa9, + 0xbcde, 0xbcd7, 0xbcdd, 0xbcd6, 0xbcd8, 0xbd9b, 0xbee0, 0xbee8, + 0xbee6, 0xc3f8, 0xc3fb, 0xc6bb, 0x3259, 0xc6b8, 0x1570, 0xc7c1, + 0xc7c0, 0xcca4, 0xccab, 0xcd4d, 0xce65, 0xce67, 0xce6a, 0xce66, + 0xce69, 0xd073, 0xd080, 0xd06f, 0xd071, 0xd2e4, 0xd2e6, 0xd2e7, + 0xd4a0, 0xd4a4, 0xd5a2, 0xd5a7, 0xd5a4, 0xd6de, 0xd6db, 0xd758, + 0xd75c, 0xd82f, 0xd82e, 0xd9dd, 0xd9e4, 0xd9d8, + /* 0x77 */ + 0xd9e7, 0xd9da, 0xd975, 0x1895, 0xdc79, 0xdc80, 0xdc7f, 0xdc7c, + 0xdc75, 0xdc7b, 0xdc82, 0x1900, 0xdc89, 0xdc74, 0xdc7d, 0xdc7a, + 0xdc86, 0xdca8, 0xdc72, 0x1902, 0xdc8b, 0xdc91, 0xdcb3, 0xdc81, + 0xdd82, 0xdde1, 0xdde3, 0xdde2, 0xde76, 0xde74, 0xde72, 0xde75, + 0xdf0e, 0xdf0d, 0xdf94, 0xdf92, 0xdf93, 0xdf91, 0xdf8f, 0xdf95, + 0xdfd0, 0xdff7, 0xe076, 0xe0af, 0x199f, 0xe126, 0xe125, 0xe12d, + 0xe1a0, 0xe1c3, 0x3fd7, 0x45cc, 0x4c79, 0x4c7a, 0x5015, 0x5adb, + 0x5c85, 0x6470, 0x647b, 0x69a5, 0x699f, 0x6e17, 0x6eb2, 0x7339, + 0x7340, 0x734e, 0x743e, 0x75e8, 0x75e7, 0x7c66, 0x7c61, 0x7fda, + 0x8214, 0x83df, 0x8a18, 0x8b39, 0x8b3a, 0x9230, 0x9232, 0x940e, + 0x954c, 0x98e8, 0x98f1, 0x98eb, 0x98ec, 0x9a74, 0x9a73, 0x9cf1, + 0x9e42, 0x9e3e, 0x9e41, 0xa02c, 0xa3d2, 0xa4bb, + /* 0x78 */ + 0xac58, 0xac57, 0xac56, 0xac5a, 0x117d, 0xb061, 0xb068, 0xb065, + 0xb05f, 0xb064, 0xb05e, 0xb05b, 0xb067, 0xb2c3, 0xb3a2, 0xb453, + 0xb67d, 0xb720, 0xbaae, 0xbaaf, 0xbab0, 0xbce7, 0xbce6, 0xbce9, + 0xbef1, 0xbeeb, 0xbeea, 0xbee9, 0xc163, 0xc402, 0xc3fe, 0xc6de, + 0xc7c2, 0xc8e6, 0xca5d, 0xccad, 0xce75, 0xce72, 0xce77, 0x16f6, + 0xd151, 0xd2e8, 0xd2ed, 0xd2ee, 0xd4b9, 0xd4a1, 0xd4b6, 0xd5ae, + 0xd6e8, 0x1812, 0xd71e, 0xd831, 0xd832, 0x1891, 0xda0e, 0xda12, + 0xda09, 0xda05, 0x1890, 0xda03, 0xda1f, 0xda0d, 0xda0c, 0xda04, + 0xda0a, 0xdcc2, 0xdcbf, 0xdcc9, 0xdcb2, 0xdcc1, 0xdcaf, 0xdcb4, + 0xdcb0, 0xdcb6, 0xdcb7, 0xdcbb, 0xdcb1, 0xddf0, 0xde78, 0xde7a, + 0xde79, 0xdee4, 0xdee6, 0xdf9f, 0xdf9d, 0xdf98, 0xdf99, 0xdff9, + 0xe030, 0xe082, 0xe081, 0xe0b3, 0xe07f, 0xe13a, + /* 0x79 */ + 0xe13e, 0xe148, 0x4c86, 0x5436, 0x5613, 0x5722, 0x5add, 0x60a7, + 0x647d, 0x0679, 0x6e1c, 0x7365, 0x7360, 0x7367, 0x084e, 0x761a, + 0x85e3, 0x9234, 0x9418, 0x9552, 0x98fc, 0x9a79, 0x9a78, 0x9a76, + 0x9cfa, 0x9cf8, 0xa02d, 0xa3d6, 0xa4bd, 0xa4bf, 0xa4be, 0xac44, + 0xac70, 0xac62, 0xac6e, 0xb06e, 0xb07c, 0xb074, 0xb078, 0xb070, + 0xb079, 0xb071, 0xb2cc, 0xb3a7, 0xb3a6, 0xb693, 0xb721, 0xb79c, + 0xbd9d, 0xbef4, 0xbef3, 0xc8f0, 0xccb8, 0xccb6, 0xccbd, 0xce73, + 0xce82, 0xd087, 0xd156, 0xd159, 0xd2f6, 0xd4c9, 0xd4c5, 0xd4c7, + 0xd4ca, 0xd4c2, 0xd4c4, 0xd6f2, 0xd6f0, 0xd83b, 0xd83a, 0xda26, + 0xda28, 0xda34, 0xda2d, 0xdcd7, 0xdcd2, 0xdcd6, 0xdcdc, 0xdcd3, + 0xdcd1, 0xdd86, 0x191e, 0xddef, 0xddee, 0xdee8, 0xdfac, 0xdfa9, + 0xdfaa, 0xdfab, 0xdffb, 0xe033, 0xe088, 0xe0b6, + /* 0x7a */ + 0xe0b7, 0xe0d0, 0xe0cf, 0xe14f, 0xe159, 0xe14c, 0x5618, 0x5ae0, + 0x7369, 0x7c73, 0x7c72, 0x85e8, 0x90fb, 0x941c, 0x9909, 0x990a, + 0x9908, 0x9a7d, 0x9a7f, 0x9d67, 0xac7a, 0xac7b, 0xb2d1, 0xe3cb, + 0xb69d, 0xb79d, 0xbcfc, 0xbcfb, 0xbcfd, 0xbef5, 0xbef6, 0xc70f, + 0xc71d, 0xccc7, 0xccc1, 0xccbf, 0xcd54, 0xce7f, 0xcef5, 0xd08a, + 0xd08c, 0xd15c, 0xd365, 0xd4cf, 0xd4d0, 0xd5b8, 0xd6fa, 0xd766, + 0xda40, 0xda41, 0x3772, 0xdcf7, 0xdcf3, 0xdcef, 0xdcf4, 0xdced, + 0xdcf2, 0xdcf1, 0xdcf9, 0xdfb4, 0xdffc, 0xe0bc, 0xe15e, 0xe15b, + 0xe15f, 0xe15d, 0xe1cf, 0xe1ce, 0x543a, 0x5ae1, 0x5e15, 0x5e14, + 0x7c78, 0x7c79, 0x7fe6, 0x86b8, 0x8a22, 0x90fe, 0xa3db, 0xa506, + 0xa5c8, 0xac89, 0xb086, 0xb3ad, 0xb699, 0xb6d8, 0xb723, 0xb823, + 0xbab5, 0xbef9, 0xc407, 0xc71e, 0xc8fb, 0xca72, + /* 0x7b */ + 0xca73, 0xce87, 0xcf49, 0xd15d, 0xd2f8, 0xd703, 0xda4e, 0xda4d, + 0xda50, 0xda55, 0xdd09, 0xdd07, 0xdd0c, 0xdd03, 0xdd06, 0xdd0b, + 0xdd0a, 0xdd89, 0xdfbb, 0xdfff, 0xe036, 0xe08b, 0xe166, 0xe169, + 0xe167, 0xe1c2, 0xe1d2, 0x5ae2, 0x0428, 0x6488, 0x6e5b, 0x7376, + 0x7c7d, 0x80a6, 0x8e5a, 0x9917, 0xa3dc, 0xac8f, 0xb094, 0xb095, + 0xbab6, 0xbd04, 0xc2ee, 0xce8a, 0xcef9, 0xd707, 0xd71f, 0xd72a, + 0xd845, 0xda5c, 0xda5b, 0xda61, 0xda5d, 0xdd18, 0xdd1f, 0xde83, + 0xdf16, 0xdf14, 0xdfbf, 0xdfc0, 0xe173, 0xe1c0, 0x5017, 0x6489, + 0x941e, 0x941f, 0x9554, 0x9918, 0x9d05, 0xac95, 0xb098, 0xb09b, + 0xb459, 0xbd08, 0xbf01, 0xccce, 0xcefa, 0xd5be, 0xd847, 0xda6a, + 0xda69, 0xda68, 0xda67, 0xdd25, 0xdd28, 0xdfc4, 0xe037, 0xe08d, + 0xe08c, 0x1991, 0xe320, 0x9922, 0x9a82, 0xb2d9, + /* 0x7c */ + 0xc738, 0xcefb, 0xd4e1, 0xd772, 0xd848, 0xda6c, 0xda70, 0xdd31, + 0xdd30, 0xe179, 0x9923, 0xa3f8, 0xd774, 0xda73, 0xdd34, 0xde87, + 0xdeb2, 0xe0c2, 0xe17d, 0x5ae5, 0xce8c, 0xda77, 0xda75, 0xdd38, + 0xdd3a, 0xe183, 0xe181, 0x7c80, 0xac99, 0x1187, 0xcf4a, 0xd84a, + 0xdd3c, 0xe1c8, 0x9104, 0xb3af, 0xe189, 0xddfa, 0xd161, 0xdd3f, + 0xac93, 0xdfc9, 0xb2de, 0xce91, 0xe18e, 0xe18d, 0xac98, 0xa4c5, + 0xe1a5, +}; + +static const ucs4_t cns11643_5_2uni_upages[229] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x04c00, 0x04d00, 0x05200, 0x05900, 0x05e00, 0x05f00, 0x06100, 0x06300, + 0x06400, 0x06b00, 0x07200, 0x07300, 0x07500, 0x07600, 0x07900, 0x07a00, + 0x07b00, 0x07c00, 0x08300, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, + 0x08c00, 0x08e00, 0x09400, 0x09500, 0x09700, 0x09900, 0x09b00, 0x09c00, + 0x09d00, 0x09e00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, + 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, + 0x20d00, 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, + 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, + 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, + 0x22500, 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, + 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, + 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, + 0x23d00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24200, 0x24300, 0x24400, + 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, + 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, + 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, + 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, + 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, + 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, + 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, + 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, + 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, + 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, + 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, + 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, + 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, +}; + +static int +cns11643_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x7c)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 8603) + swc = cns11643_5_2uni_page21[i], + wc = cns11643_5_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_6.h b/Externals/libiconv-1.14/lib/cns11643_6.h new file mode 100644 index 0000000000..8493984351 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_6.h @@ -0,0 +1,968 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 6 + */ + +static const unsigned short cns11643_6_2uni_page21[6388] = { + /* 0x21 */ + 0xc902, 0x3362, 0x0005, 0x3388, 0x33d0, 0x33cf, 0x341e, 0x341f, + 0x3420, 0x3c0e, 0x3c2c, 0x3361, 0x3304, 0x3305, 0x3303, 0x0004, + 0xc901, 0x337d, 0x338d, 0x34a3, 0x34a4, 0x37db, 0x3800, 0xc91e, + 0x39a3, 0x3b32, 0x013f, 0x3dd4, 0x3dd5, 0x4e23, 0x552c, 0x557a, + 0x3803, 0x3307, 0x3308, 0x338f, 0x339c, 0x33d5, 0x3412, 0x3413, + 0x3414, 0x3421, 0x34a8, 0x34a6, 0x3776, 0x3801, 0x383d, 0xc914, + 0x383e, 0x3929, 0x3977, 0x3978, 0x39a6, 0x39a9, 0x39ac, 0x3b34, + 0x3804, 0x3c7b, 0x3d10, 0x392f, 0x3dd7, 0x3e1c, 0x3e1f, 0x3e1a, + 0xc936, 0x3e1e, 0x3e9e, 0x3e9a, 0x43a0, 0x43a1, 0x47d2, 0x47d3, + 0x4bb9, 0x4d1d, 0x4d55, 0x4eff, 0x51e7, 0x042a, 0x5211, 0x5213, + 0x5212, 0x53af, 0x53b1, 0xc990, 0x552d, 0x557b, 0x559d, 0x559a, + 0x04a7, 0x559f, 0x55a0, 0x559c, 0x56bd, 0x04fa, + /* 0x22 */ + 0x57aa, 0x626c, 0x6291, 0x6d74, 0x756a, 0xca29, 0x8605, 0x8f6b, + 0x8f6a, 0x33e0, 0x3312, 0x0000, 0x337f, 0x33a0, 0x3399, 0x3395, + 0x339e, 0x33df, 0x33de, 0x34af, 0x34ad, 0x34b0, 0x37df, 0x3843, + 0x3841, 0x3848, 0x3875, 0xc91a, 0x3932, 0x397b, 0x3979, 0x39b3, + 0x00db, 0x3ea7, 0x39b2, 0x39b0, 0x39b4, 0xc929, 0x3bcd, 0x3bce, + 0xc92b, 0x3c10, 0x3c80, 0x3cd3, 0x3d30, 0x3398, 0x3d2f, 0x3d31, + 0x3dda, 0x3dd9, 0x3e27, 0x3e28, 0x3e21, 0x3e25, 0x3ea6, 0x3ea2, + 0x3ea1, 0x3ea4, 0xc939, 0x3eaa, 0x3ea5, 0x3ea3, 0x3364, 0x443f, + 0x4444, 0x471b, 0x4753, 0x4784, 0x4786, 0x47d5, 0xc960, 0x4b3e, + 0x4b40, 0x4dca, 0x4dc9, 0x4e26, 0x4f00, 0x4f31, 0x4f3c, 0x4f30, + 0x4f33, 0x4f32, 0x4f38, 0x5234, 0x5253, 0x5254, 0x53b4, 0x53b2, + 0x552f, 0x55a5, 0x55a7, 0x55a4, 0x55a8, 0x55a9, + /* 0x23 */ + 0x55a2, 0x55a3, 0x55a6, 0x5681, 0x5680, 0x57ad, 0x5c24, 0x5c65, + 0x5c68, 0x5c69, 0x633c, 0x633b, 0x655d, 0x6a44, 0x7182, 0x74f1, + 0x756b, 0x771b, 0x78eb, 0x7bba, 0x7bd3, 0x7d13, 0x8922, 0x97f4, + 0xab0f, 0xab10, 0x3807, 0xc10b, 0xc10a, 0x3319, 0x331a, 0x3318, + 0x3366, 0x3382, 0x33a8, 0x33e5, 0x33e7, 0x33e4, 0x3415, 0x3423, + 0x3424, 0x3443, 0x34c3, 0x34bc, 0x34bb, 0x0038, 0x34b7, 0x34b9, + 0x34cf, 0xc90d, 0x377a, 0x377b, 0x37e1, 0x37e0, 0x3809, 0x384d, + 0xc916, 0x384b, 0x3879, 0x38b1, 0x3936, 0x3935, 0x3937, 0x3938, + 0x397f, 0x3980, 0x3981, 0x9653, 0x397e, 0x39cd, 0x39bf, 0x39be, + 0x39c2, 0x39b8, 0x39c1, 0x2030, 0x3c31, 0x3c2f, 0x3c6f, 0x3c82, + 0x013a, 0x3c87, 0x3c86, 0x3c8d, 0x3c94, 0x3cd7, 0x3cd4, 0x3cd8, + 0x3d16, 0x3d14, 0x3d2e, 0x3d36, 0x3d37, 0x51ee, + /* 0x24 */ + 0x3de0, 0x3de5, 0x3ddf, 0x3e2b, 0x3e29, 0x3e2d, 0x3e2f, 0x3eb7, + 0x3ec9, 0x3ec1, 0x3eca, 0x3eb2, 0x3eac, 0x3eae, 0x43b2, 0x43a8, + 0x43b0, 0x43a7, 0xc951, 0x4452, 0x444a, 0x4756, 0x4755, 0x475f, + 0x475e, 0x4788, 0xc95d, 0x47dd, 0x47e2, 0x47e1, 0x47df, 0x47e0, + 0x48af, 0x48b1, 0x48ba, 0x4b45, 0x4b43, 0x4bbd, 0x4bc8, 0xc96c, + 0x4bbe, 0x4bbf, 0xc974, 0x4d59, 0x4e29, 0x4e2c, 0x4e2f, 0x4e2d, + 0x4e2e, 0x4f04, 0x4f02, 0x4f01, 0x4f40, 0x4f4a, 0x4f3f, 0x4f4f, + 0x4f41, 0x4f4e, 0x51eb, 0x51ec, 0x33ac, 0x525b, 0x5263, 0x525a, + 0x5259, 0x53dc, 0x53db, 0x53d9, 0x53e0, 0x53dd, 0x3320, 0x55b0, + 0x55b1, 0x55b2, 0x55b6, 0x5651, 0x5652, 0x5650, 0x5684, 0x04c9, + 0x5683, 0x57c3, 0x57b8, 0x57b9, 0x57b2, 0x5b90, 0x5c26, 0x5c29, + 0x5c6e, 0x6340, 0x633e, 0x6341, 0x655e, 0x65bb, + /* 0x25 */ + 0x65bc, 0x65b9, 0xc9ef, 0x6980, 0x084f, 0x6a45, 0x6aba, 0x6abd, + 0x6d56, 0x6d55, 0x6d75, 0x6d77, 0x6d81, 0xc9fa, 0x6d83, 0x6d8b, + 0x6d84, 0x7186, 0x7183, 0x718b, 0x756d, 0x7616, 0x7728, 0x78ea, + 0x7bd4, 0x7c03, 0x7d15, 0x7f3d, 0x7f3e, 0x8416, 0xca4c, 0x8606, + 0x874d, 0x8f22, 0x8f73, 0x8f6d, 0x8f6e, 0x91b1, 0x384e, 0x932d, + 0x0fcd, 0x95f9, 0x9652, 0x9800, 0x97fc, 0x97fa, 0x1092, 0x97f7, + 0x97f8, 0xca90, 0xcac4, 0xa627, 0xab11, 0x33ae, 0xad50, 0xad4f, + 0xad4d, 0xaf71, 0xcae2, 0xaf72, 0xb518, 0x3d44, 0x3321, 0x3367, + 0x33af, 0x33b0, 0x3329, 0x3417, 0x3422, 0xc903, 0x3325, 0x3428, + 0x34ff, 0x34d9, 0x34db, 0x34de, 0x34f2, 0x34fe, 0x34f4, 0x34dd, + 0x0045, 0xc904, 0x3501, 0x34dc, 0x377d, 0x3781, 0x377e, 0x377f, + 0x37e5, 0x380f, 0x00b5, 0x380a, 0x00b6, 0x380b, + /* 0x26 */ + 0x3851, 0x3852, 0x3850, 0x38b8, 0x393d, 0x393e, 0x393c, 0x3987, + 0x39d7, 0x39db, 0x39cf, 0x39e0, 0x3b4c, 0x3b42, 0x3bd4, 0x3c11, + 0x3c14, 0x3c15, 0x3c12, 0x3c33, 0x3c35, 0x0137, 0x3c71, 0x0130, + 0x3c91, 0x3c93, 0x3c95, 0x3cdc, 0x3d42, 0x3d40, 0x83a6, 0x3de6, + 0x448f, 0x3e32, 0xc937, 0x3e31, 0x3ef5, 0x3ecd, 0x3ede, 0x3ed5, + 0x3eda, 0x3eee, 0x3eec, 0x3ecf, 0x3ece, 0xc93d, 0x3ecc, 0x3ef3, + 0x43c1, 0x43c4, 0x43c6, 0x43b4, 0x43c3, 0x43b8, 0x43bb, 0x43b7, + 0x43bc, 0x43bf, 0x43c7, 0x43be, 0x4460, 0x445d, 0x4476, 0x446c, + 0x4475, 0x445b, 0x4471, 0x4473, 0x4461, 0x445a, 0x4462, 0x4472, + 0x445f, 0x4458, 0x471e, 0x4758, 0x478b, 0x478a, 0x47f4, 0x47f0, + 0x48d2, 0x48cd, 0x48ce, 0x48bc, 0x48d0, 0x4b46, 0x4b47, 0x033e, + 0x034d, 0x0351, 0x4bce, 0x4bcf, 0x4bcc, 0x4bcb, + /* 0x27 */ + 0xc972, 0x4d60, 0x4d5f, 0x4d5d, 0x4dd4, 0x4e3a, 0x4e38, 0x4e3c, + 0x4e36, 0x4f08, 0x4f7e, 0x4f5e, 0x4f6e, 0x4f53, 0x4f70, 0x4f57, + 0x4f5d, 0x4f63, 0x4f7a, 0x4f79, 0x4f93, 0xc981, 0x521d, 0x5268, + 0x5273, 0x5274, 0x5266, 0x526f, 0x5275, 0x527a, 0x5270, 0x526d, + 0x5265, 0x538a, 0x53ed, 0x53e9, 0x53e3, 0x53ef, 0x0473, 0x53ea, + 0x5531, 0xc991, 0x5538, 0x9820, 0x5535, 0x553a, 0x5581, 0x5580, + 0x55b8, 0x55c1, 0x55ba, 0x5688, 0x56cf, 0x56ca, 0x56c7, 0x56c5, + 0x56c8, 0x56d0, 0x56c9, 0x57bb, 0x57b6, 0x57bd, 0xc99d, 0x57b4, + 0x57c1, 0x57d1, 0x57d2, 0x57cc, 0x57d4, 0x57cb, 0x57ce, 0x57d5, + 0x57d8, 0x5b95, 0x5b93, 0x5b99, 0x5b96, 0x05be, 0x5c89, 0x5c94, + 0x5c91, 0x5c8f, 0x5c84, 0x5c97, 0x5c86, 0x5c85, 0x5c8c, 0x60f2, + 0x60ed, 0x60ef, 0x62d9, 0x6346, 0x6347, 0x634b, + /* 0x28 */ + 0x6350, 0x634a, 0x634e, 0x634c, 0x6348, 0x6563, 0x6561, 0x6562, + 0x6560, 0x65c3, 0x65c5, 0x65c1, 0x65d0, 0xc9dc, 0x6982, 0x081e, + 0x6986, 0x6984, 0x6a4c, 0x6a48, 0x6ab8, 0x6abf, 0x6ac1, 0x6ac6, + 0x6ac5, 0x6ac7, 0x6ac0, 0x6ac3, 0x6bed, 0x6c03, 0x6c22, 0x6c21, + 0x6d9f, 0x6d90, 0x6d9e, 0x08c8, 0x6da0, 0x6d94, 0x6d95, 0x6da1, + 0x08c3, 0x08c7, 0x719a, 0x7190, 0x74f2, 0x74f3, 0x756e, 0x75ab, + 0x75a9, 0x761a, 0x7618, 0x761b, 0x7760, 0x774c, 0x7742, 0x7733, + 0x773f, 0x773e, 0x7738, 0x7743, 0x7746, 0x7736, 0x78ee, 0x78f5, + 0x78f4, 0x0b56, 0x7c1b, 0x0140, 0x7d2b, 0x7d29, 0x7d2a, 0x7d2e, + 0x803f, 0x80e6, 0x83a7, 0x83a8, 0x8418, 0x8608, 0x8750, 0x8753, + 0x8a56, 0x8a55, 0x8f6f, 0x8f7f, 0x91b3, 0x933a, 0x9338, 0x9337, + 0x9336, 0x3854, 0xca80, 0x95dd, 0x95fc, 0x95fa, + /* 0x29 */ + 0x9633, 0x9804, 0x9807, 0x9808, 0x9806, 0x9809, 0xca91, 0xca93, + 0x9d1e, 0xcad2, 0xad0b, 0xad43, 0xad52, 0xad58, 0xad5e, 0xaf68, + 0xaf8d, 0xaf82, 0xaf7b, 0xb358, 0x15bd, 0xc900, 0x332c, 0x332e, + 0x480b, 0x332d, 0x3369, 0x33b2, 0x33b6, 0x33a9, 0x33ed, 0x3419, + 0x344f, 0x3516, 0x3503, 0x350e, 0x3504, 0x3507, 0x3510, 0x3527, + 0x3528, 0x350d, 0x3529, 0x350f, 0x3522, 0x3511, 0x3785, 0x3784, + 0x3783, 0x378a, 0x3786, 0x3810, 0x3858, 0x385a, 0x3a0c, 0x38c4, + 0x38c5, 0x3947, 0x3949, 0x394a, 0x394b, 0x53bb, 0x398d, 0x398b, + 0x3a07, 0x3a06, 0xc920, 0x39ef, 0x39f0, 0x39ed, 0x39f9, 0x3a02, + 0x39e7, 0x39f4, 0x39f7, 0x39f1, 0x3b53, 0x3b55, 0x011a, 0x3bda, + 0x3bd9, 0x012c, 0x3c38, 0x3c99, 0x3ca2, 0x3c9c, 0x3c9a, 0x3c9b, + 0x3ce5, 0x3ce3, 0x3ce1, 0x3ce0, 0x3ce2, 0x3ce4, + /* 0x2a */ + 0x32fd, 0x3ce8, 0xc92f, 0x3d13, 0x3d56, 0x3d4b, 0x3d4a, 0x3d4d, + 0x3d4c, 0x0149, 0x3dea, 0x3de9, 0x3deb, 0x3dec, 0x3e3a, 0x3e3c, + 0x3e39, 0x3e3b, 0x3f14, 0x3f0e, 0x3f35, 0x3f0a, 0x3f3f, 0x3f38, + 0x017c, 0x3f4e, 0x3f17, 0xc93f, 0x3f1e, 0x43b6, 0x43ce, 0x43ca, + 0x43cb, 0x43cc, 0x43c9, 0x44b4, 0x44ac, 0x4488, 0x4486, 0x448c, + 0x4493, 0x448a, 0x44a4, 0x4487, 0x44a5, 0x44a6, 0x4485, 0x44a3, + 0x448e, 0x471f, 0x4763, 0x478d, 0x47fa, 0x47fb, 0x4809, 0x47fe, + 0x47ff, 0x4802, 0x4804, 0x47fd, 0x4805, 0x48f9, 0x48f7, 0x48db, + 0x48da, 0x4b51, 0x4b50, 0x4b57, 0x4be2, 0x4bd8, 0x4bda, 0x4bdc, + 0x4d20, 0x4d1f, 0x4d69, 0x4ddd, 0x4e40, 0x4e41, 0x4e43, 0x4f0d, + 0x4f0c, 0x4f87, 0x4fa9, 0x4f92, 0x4f85, 0x03bf, 0x4f8c, 0x4fa2, + 0x4f8f, 0x4f8a, 0x03ba, 0x4f8d, 0x51f1, 0x5237, + /* 0x2b */ + 0x528b, 0x5287, 0x5282, 0x538e, 0x53bc, 0x53f8, 0x53fa, 0x53eb, + 0x53f9, 0x53fc, 0x5405, 0x551b, 0x551d, 0x551e, 0xc992, 0x553c, + 0x553e, 0x5584, 0x55c8, 0x55c9, 0x55d3, 0x55c7, 0x55d2, 0x5655, + 0xc996, 0x568c, 0x568a, 0x56d5, 0x56d3, 0x04d8, 0x56d8, 0x57d0, + 0x57ee, 0x57f1, 0x57fb, 0x57d3, 0x57ec, 0x57cd, 0x5815, 0x5826, + 0x580e, 0x5827, 0x582a, 0x5800, 0x5804, 0x5828, 0x5808, 0x5814, + 0x5b9b, 0x05b2, 0x5ba1, 0x5b9d, 0x5ba0, 0x5b9e, 0x5ba2, 0x5b9c, + 0x5c32, 0x5c34, 0x5c93, 0x5c96, 0x5c90, 0x5cb4, 0x5cb5, 0xc9b6, + 0x5cb6, 0x5cc2, 0xc9b5, 0x5cba, 0x5c92, 0x60fb, 0x6105, 0x60f3, + 0x60fe, 0x60fd, 0x755d, 0x60fa, 0x6243, 0x6295, 0x6294, 0x06c4, + 0x636f, 0x6373, 0x635c, 0x635b, 0x6366, 0x6374, 0x6363, 0x6367, + 0x6360, 0x6362, 0x6371, 0x6372, 0x635e, 0x6523, + /* 0x2c */ + 0x6526, 0x6564, 0xc9d6, 0x65f2, 0x6601, 0x65dd, 0x65dc, 0x65db, + 0x65f3, 0x65fd, 0x65d8, 0x65f8, 0x65fb, 0x6983, 0x698c, 0x698e, + 0x6a49, 0x6a54, 0x6a52, 0x6a4e, 0x6a58, 0x6a51, 0x6a55, 0x6a53, + 0x6a57, 0x6a50, 0x6a4f, 0x6a4d, 0x6ad2, 0x6ad3, 0x6ac9, 0x6ad4, + 0x6bef, 0xc9f8, 0x33b1, 0x6c05, 0x6c04, 0x6c2e, 0x6c2d, 0x6d45, + 0x6d5b, 0x6d5a, 0x6d59, 0x6d9d, 0x6d8e, 0x6dbc, 0x6ddd, 0x6dba, + 0xc9fd, 0x6dd8, 0x6dcb, 0x6dd9, 0x6dda, 0x6dc4, 0x6db8, 0x6dbf, + 0x6ddb, 0x6dc1, 0xc9fc, 0x6dc5, 0xca19, 0x71b1, 0x71af, 0xca18, + 0x74f7, 0x74f6, 0x74f8, 0x7550, 0x7551, 0x7571, 0x7570, 0x75b0, + 0x75af, 0x75ae, 0x75ad, 0x7625, 0x762c, 0x7622, 0x7633, 0x7634, + 0x0a2b, 0x773a, 0x7740, 0x7768, 0x0a61, 0x7764, 0x775c, 0x7757, + 0x7753, 0x774f, 0x7751, 0x7754, 0x7766, 0x23dd, + /* 0x2d */ + 0x0ab2, 0x790d, 0x7908, 0xca2b, 0x78fa, 0x7aea, 0x7b2a, 0x7bbb, + 0x7bd5, 0x7bd7, 0x4fa4, 0x33f0, 0x33b5, 0x7c06, 0x7c28, 0x7c22, + 0x7c21, 0x5656, 0x7c23, 0x43cd, 0x7d30, 0x7d34, 0x7fc9, 0x7fca, + 0x7fc8, 0xca3d, 0x8044, 0x80f3, 0xca41, 0x80f8, 0x80fc, 0x80f6, + 0x80fb, 0x80f7, 0x8100, 0x8102, 0xca40, 0xca4d, 0x8424, 0x860d, + 0x0d29, 0x8762, 0x8930, 0x892b, 0x892a, 0x0d92, 0x892d, 0x8ada, + 0x8c28, 0x8d86, 0x8f77, 0x8f7c, 0x9050, 0x904e, 0x90f2, 0x91b2, + 0x91ce, 0x91cf, 0x91e5, 0x6607, 0x9235, 0x9231, 0x9313, 0x932b, + 0x932c, 0x9345, 0x9360, 0x9341, 0x9358, 0x9347, 0x935b, 0x9350, + 0xca82, 0x935f, 0x934a, 0x9356, 0x9343, 0x9344, 0x9351, 0x95fd, + 0x9634, 0x9635, 0x9654, 0x9655, 0x970c, 0x970b, 0x970a, 0x97f9, + 0x9835, 0x9824, 0x9813, 0x981c, 0x9869, 0x9825, + /* 0x2e */ + 0x9821, 0xca95, 0xca96, 0xca98, 0x9d20, 0x9fa9, 0x9fa8, 0x9fde, + 0xa009, 0xa00a, 0xa00b, 0xa1e3, 0xa207, 0xa2b2, 0xa2b3, 0xa35d, + 0xa858, 0xa886, 0xa887, 0xa9b9, 0xa9b8, 0xad0c, 0xad44, 0xad66, + 0xad80, 0xad75, 0xad6d, 0xad7e, 0xad67, 0xad81, 0xad77, 0xafa8, + 0xafa2, 0xafa5, 0xaf9b, 0xb357, 0xb50f, 0xb532, 0xb52c, 0xb533, + 0xb8e7, 0x336e, 0x33b7, 0x33f6, 0x33f2, 0x33f3, 0x3817, 0x3430, + 0x3454, 0x3453, 0x3552, 0x353d, 0x353c, 0x3534, 0x3533, 0x3554, + 0x352f, 0x0058, 0x3555, 0x353f, 0x3537, 0x3556, 0x3561, 0x3558, + 0xc906, 0x353b, 0x3532, 0x352e, 0x353e, 0x333b, 0x378c, 0x378d, + 0x3813, 0x3816, 0x3812, 0x385b, 0x388a, 0x38d7, 0x38ce, 0x3950, + 0x3951, 0x394f, 0x398e, 0x398f, 0x39f2, 0xc921, 0x3a28, 0x3a1a, + 0x3a25, 0x3a1d, 0x3a14, 0x3a20, 0x3a1f, 0x3a1b, + /* 0x2f */ + 0x3a17, 0x3a15, 0x3a1c, 0x3a13, 0xc925, 0x3b60, 0x011c, 0x3b66, + 0x3be3, 0x3bde, 0x3be0, 0x3be1, 0x3c1a, 0x3c1b, 0x3c18, 0x3c1c, + 0x3c19, 0x3c42, 0x3c40, 0x3c3e, 0x3c44, 0x3c74, 0x3c43, 0xc92d, + 0x3cf2, 0x3d1b, 0x3d19, 0x3d1e, 0xc930, 0x3d5e, 0x3d66, 0x3d5d, + 0x3d5a, 0x3d5f, 0x3d60, 0x3d5b, 0x3d5c, 0x3d59, 0x3df0, 0x3df1, + 0x3e43, 0x3e40, 0x3e42, 0x3e41, 0x3e3f, 0x3f57, 0x3f69, 0x3f6f, + 0x3fab, 0x3f71, 0x3f93, 0x3f56, 0x3f90, 0x3f6d, 0x3f6c, 0x3f70, + 0x3f66, 0x3f67, 0x43d7, 0x43b5, 0x43db, 0x43d8, 0x43d5, 0x43d4, + 0x44ba, 0x44b7, 0x44be, 0x44b9, 0x0237, 0x44e0, 0x44dd, 0x44de, + 0x7918, 0x44d8, 0x44bd, 0x44db, 0x471d, 0x4725, 0x4921, 0x490c, + 0x4929, 0x492d, 0x491b, 0x490e, 0x491f, 0x4904, 0x491c, 0x4905, + 0x4906, 0x4920, 0x490d, 0x492a, 0x4923, 0x4911, + /* 0x30 */ + 0x4b5c, 0x4b66, 0x4b5b, 0x4b4f, 0x4b5e, 0x4b5d, 0x4bf1, 0x4bea, + 0x4bf4, 0x4beb, 0x4bf0, 0x4bfa, 0x4bfb, 0x4d28, 0x4d2c, 0x4d6b, + 0x4d2a, 0x4d6a, 0x4d6f, 0x4ddb, 0x4de0, 0x7fd1, 0x4de3, 0x4de5, + 0x4de7, 0x4e4d, 0x4e55, 0x4e54, 0x4e53, 0x4e52, 0x4e4e, 0x4e60, + 0x53c0, 0x4f0f, 0x4f11, 0x4f13, 0x4fc6, 0x4fb3, 0x4fc7, 0x4fd2, + 0x4fb8, 0x4fac, 0x4fae, 0x4fcf, 0x4fc5, 0xc97b, 0x4fcc, 0x4fab, + 0x4fc9, 0x4fb9, 0x51fb, 0x51f8, 0x51f7, 0x51f9, 0x5220, 0x523b, + 0x5239, 0x529e, 0x529a, 0x52aa, 0x52ab, 0x52af, 0x5296, 0x52a9, + 0x52a6, 0x5291, 0x0443, 0x52ae, 0x529f, 0x52ac, 0x52a0, 0x5392, + 0x5391, 0x53bf, 0x5417, 0x540a, 0x540c, 0x554a, 0x5546, 0x5534, + 0x5545, 0x5543, 0x5544, 0xc993, 0x5587, 0x5586, 0x558a, 0x55da, + 0x55d8, 0x04b4, 0x3818, 0x3434, 0x55d6, 0x55d4, + /* 0x31 */ + 0x5654, 0x5659, 0x565a, 0x5657, 0x04e0, 0x56dd, 0x56e9, 0x56e0, + 0x5805, 0x5812, 0x5813, 0x5807, 0x5816, 0x5823, 0x5802, 0xc9a1, + 0x584a, 0x5836, 0x5840, 0x5856, 0x5843, 0xc9a0, 0x584b, 0x5846, + 0x583e, 0x5849, 0x5ba7, 0x5bb6, 0x5ba6, 0x5ba8, 0x5bac, 0x5ba9, + 0x5bab, 0x5c38, 0x5c37, 0x5c39, 0x5c41, 0x5c3e, 0x5cc0, 0x5cbb, + 0x5cbf, 0x5cbd, 0x5cfe, 0x5d1e, 0x5cee, 0x5cfc, 0xc9b7, 0x5cf9, + 0x5d06, 0x5ce4, 0x5ce9, 0x5ce5, 0x5d03, 0x5cfd, 0x5d49, 0x60be, + 0x610a, 0x8626, 0x6118, 0x610d, 0x610f, 0x610e, 0x6120, 0x6271, + 0x6299, 0x62e2, 0x62df, 0x62de, 0x6378, 0x6379, 0x06e4, 0x637c, + 0x637d, 0x6384, 0x638b, 0x638a, 0xc9d2, 0x6389, 0x652c, 0x6529, + 0x656c, 0x2104, 0x6609, 0x6608, 0x660c, 0x660d, 0x6610, 0x0826, + 0x699f, 0x6998, 0x69a2, 0x699a, 0x6ad5, 0x6ae2, + /* 0x32 */ + 0x6af0, 0x6aea, 0x6aeb, 0x6aed, 0x6ae8, 0x6ae0, 0x6b85, 0x6b86, + 0x6bf0, 0x5046, 0x6c45, 0x6c38, 0x6c3e, 0x6c42, 0x6c40, 0x6d47, + 0x6d5c, 0x6d5e, 0x6db4, 0x6dc2, 0x6e14, 0x6de5, 0x6e15, 0x6e11, + 0xc9ff, 0x6dee, 0x6de7, 0x6df5, 0x6df4, 0x6de8, 0x6e01, 0x6def, + 0x6df1, 0xca00, 0x71db, 0x71bf, 0x71da, 0x71c7, 0x71dd, 0xca1a, + 0x71eb, 0x71e1, 0x71c1, 0x71bd, 0x7507, 0x74fd, 0x7501, 0x750a, + 0x7503, 0x7572, 0x7574, 0x7575, 0x75b2, 0x75b1, 0x75b4, 0x764c, + 0x7642, 0x7640, 0x7649, 0x763c, 0x764d, 0x764a, 0x763b, 0x7761, + 0x7774, 0xca26, 0x777f, 0x777a, 0x7788, 0x777c, 0x0a6f, 0x7770, + 0x790f, 0x7928, 0x7913, 0x792a, 0x7aed, 0x7aef, 0x7b2e, 0x7bc1, + 0x7bdd, 0x3e47, 0x7c2d, 0x7c2b, 0x7c35, 0x7c2f, 0x7c31, 0x7c34, + 0xca35, 0x7c30, 0x7d3a, 0x7d39, 0x7d37, 0x7d4b, + /* 0x33 */ + 0x7d54, 0x7d4d, 0x7d51, 0x7d47, 0x7f27, 0x7f50, 0x7f4d, 0x7f4e, + 0x7f54, 0x7fd2, 0x7fce, 0x804b, 0x8049, 0x8105, 0x810f, 0x8119, + 0xca43, 0x8106, 0x810c, 0x8129, 0x8104, 0x8108, 0x8125, 0x0c1c, + 0x8103, 0x8127, 0x8110, 0x810a, 0xca42, 0x985d, 0x83aa, 0x83ab, + 0x83a9, 0x8441, 0x843a, 0x843c, 0x842b, 0x8449, 0x8615, 0x0d00, + 0x8616, 0xca53, 0x8631, 0x6d4a, 0x873c, 0x877c, 0x876d, 0x876a, + 0x8763, 0x876b, 0x877b, 0x8764, 0x877a, 0x8769, 0x876f, 0x8937, + 0x8935, 0x893c, 0x8936, 0x893d, 0x893e, 0x8ae1, 0x8ae0, 0x8c2d, + 0x8c2b, 0x8d8d, 0x8d92, 0x0eb6, 0x8d8e, 0xca6b, 0x8d91, 0x8d96, + 0x8f7b, 0x8f78, 0x8f81, 0x8f96, 0x8fa3, 0x8f95, 0x8f97, 0x9054, + 0x9052, 0x90f5, 0x9100, 0x90fb, 0x90f4, 0x90f6, 0x91e8, 0x91ea, + 0x933e, 0x933d, 0x933b, 0x9380, 0x0fe4, 0x9388, + /* 0x34 */ + 0x9381, 0x9382, 0x93ce, 0x9383, 0x9377, 0x9379, 0x9373, 0x936d, + 0x9370, 0x938d, 0x9375, 0x938c, 0x936a, 0x9391, 0x9389, 0x938e, + 0x44dc, 0x95ff, 0x9659, 0x96c7, 0x9712, 0x9714, 0x9713, 0x97cb, + 0x9842, 0x10ad, 0x983d, 0x2aff, 0x9840, 0x9844, 0x9862, 0x9843, + 0x983f, 0x9845, 0x983c, 0xca97, 0x9846, 0x9847, 0xcab3, 0x9c9e, + 0x9c9d, 0x9d2c, 0x9d29, 0x9d2f, 0x9d2e, 0x9d30, 0x9fe1, 0x9fe2, + 0xa00e, 0xa019, 0xa012, 0xa2b4, 0xa5da, 0xa726, 0xa859, 0xa85a, + 0xa888, 0xa9c0, 0xa9ba, 0xaba0, 0xcadd, 0xaba2, 0xad86, 0x2fec, + 0xad9d, 0xad88, 0xad8f, 0xad8e, 0xad9b, 0xafc1, 0xafc3, 0xafc4, + 0xaf96, 0xafc7, 0xafc6, 0xafbf, 0x14c3, 0xb20f, 0xb555, 0xb542, + 0xb546, 0xb54b, 0xb543, 0xb553, 0xb548, 0xb549, 0xb54a, 0xb54e, + 0x7bde, 0x3991, 0xbb4b, 0xbd80, 0xbd81, 0xbd83, + /* 0x35 */ + 0x358a, 0xbd82, 0x5542, 0x3c22, 0x3370, 0x3371, 0x33bc, 0x4f18, + 0x33be, 0x33ba, 0x33f8, 0x3437, 0x3435, 0x3dfc, 0x3456, 0x3459, + 0x345e, 0x356d, 0x3591, 0x3592, 0x3568, 0x3566, 0x3573, 0x0067, + 0x3596, 0x358b, 0x358c, 0x3796, 0x37ee, 0x381c, 0x381a, 0x3819, + 0x381b, 0x385d, 0x385e, 0xc918, 0x38dc, 0x38e2, 0x3952, 0x3992, + 0x3a30, 0x3a52, 0x3a42, 0x3a41, 0x3a45, 0x3a37, 0x3a40, 0x3a3f, + 0x3a3d, 0x3a38, 0x3a3a, 0x3a49, 0x3b6b, 0x3b78, 0x3b79, 0xc926, + 0x3b6c, 0x3be9, 0x3be6, 0x3be5, 0x3bea, 0x3be7, 0x3be8, 0x3c1f, + 0x3c4b, 0x3c4a, 0x3c53, 0x3c76, 0x3ca3, 0x3ca4, 0x3cf6, 0x3cf3, + 0x3cf9, 0x3cf7, 0x3cfc, 0x3d1d, 0x3d6d, 0x3d71, 0x3d6c, 0x3d6e, + 0x3d70, 0x3d6f, 0x3d67, 0x3d68, 0x3dfa, 0x3df9, 0x3e4e, 0x19de, + 0x3e4d, 0x3e4f, 0x3e4a, 0x3e4c, 0x0196, 0xc942, + /* 0x36 */ + 0x3fee, 0x3fb2, 0x3fc0, 0x3fc1, 0x3ff4, 0x3fc8, 0x3fc5, 0x3fc6, + 0x3fad, 0x43e2, 0x43ea, 0x43e3, 0x43e1, 0x44f7, 0x4501, 0x4512, + 0x44f6, 0x44f1, 0x451f, 0x44ee, 0xc952, 0x44f3, 0x4515, 0x4516, + 0x4517, 0x44f8, 0x4519, 0x44f2, 0x44f4, 0x44f5, 0x4513, 0x4506, + 0x4726, 0x4724, 0x475a, 0x60c8, 0x4797, 0x4795, 0x479a, 0x481f, + 0x3dfb, 0x4829, 0x4820, 0xc962, 0xc963, 0x494c, 0x4930, 0x4938, + 0x493d, 0x4951, 0x494f, 0x494a, 0x4934, 0x4936, 0x1b30, 0x4b6a, + 0x4b68, 0x4c1c, 0x4c0e, 0x4c1e, 0x0359, 0x4c09, 0x4c08, 0x4c13, + 0x4c01, 0x4c0f, 0x4c14, 0x4c06, 0x4c07, 0x1cb2, 0xc973, 0x0376, + 0x4d79, 0x4dea, 0x4ded, 0x4de9, 0x4dee, 0x4e68, 0x4e64, 0x4e67, + 0x4e72, 0x4e62, 0x4e74, 0x4e79, 0x4f19, 0x4f17, 0x4f15, 0x4f16, + 0x4fe6, 0x8fa4, 0x4fee, 0x03d2, 0x4fdf, 0x4fe4, + /* 0x37 */ + 0x4fda, 0x4fea, 0x4fed, 0x4fe3, 0x4fe9, 0x51fd, 0x3957, 0x5221, + 0x52c6, 0x52b8, 0x52cb, 0xc985, 0x52bd, 0x52b5, 0x52bb, 0x52bf, + 0x52be, 0x52b2, 0x52c1, 0x52c2, 0x5399, 0x53c6, 0x542c, 0x542d, + 0x5425, 0x541e, 0x541f, 0x5423, 0x5550, 0x554e, 0x554d, 0x5552, + 0x55e9, 0x55ec, 0x55e8, 0x5658, 0x565c, 0x565b, 0x568f, 0x6a72, + 0x56f6, 0x5700, 0x56fc, 0x56f8, 0x56ea, 0x56fe, 0x56f7, 0x56fd, + 0x5870, 0x5862, 0x5844, 0x0520, 0x584d, 0x584c, 0x583f, 0x5866, + 0x5835, 0x0529, 0x5834, 0x588d, 0x5884, 0x0538, 0x5886, 0x5889, + 0x5887, 0x5883, 0x5875, 0x5879, 0x58af, 0x58b0, 0x5bb7, 0x5bbb, + 0x5bb9, 0x5c46, 0x5c47, 0x5c45, 0x5cea, 0x5cf6, 0x5d68, 0x5d39, + 0xc9b9, 0x5d3d, 0x5d3b, 0x5d4d, 0x5d30, 0x5d4a, 0x5d3e, 0x5d40, + 0x5d4c, 0x5d47, 0x5d38, 0x5d52, 0x5d3a, 0x5d53, + /* 0x38 */ + 0x60c4, 0x60c1, 0x611c, 0x611d, 0x612a, 0x611e, 0x612f, 0x6122, + 0x612e, 0x6125, 0x0689, 0x06b0, 0x624a, 0x624b, 0x6276, 0x06bf, + 0x62e8, 0x62ef, 0x62e9, 0x06c5, 0x62ea, 0xc9cc, 0x06ea, 0x639b, + 0x639e, 0x6393, 0x63a7, 0x639c, 0x63a0, 0x639a, 0x63ab, 0x63be, + 0x63a9, 0x652d, 0x656e, 0x6644, 0x663d, 0x663a, 0x6668, 0x663c, + 0x666a, 0xc9e0, 0x6638, 0x6665, 0x6639, 0x666d, 0x6636, 0xc9e3, + 0x663e, 0x667e, 0x6637, 0x6999, 0x69a9, 0x69ad, 0x69a7, 0x69a8, + 0x6a66, 0x6a69, 0x6a6d, 0x6a67, 0x6a6b, 0x6a6a, 0x6aee, 0x6b01, + 0x6b03, 0x6af4, 0x6afb, 0x0837, 0x6af6, 0x6afc, 0x6bf4, 0x6c08, + 0x6c0a, 0x6c09, 0x6c6d, 0x6c62, 0x6c41, 0x6c5e, 0x6c5c, 0x6df3, + 0x6e26, 0x08e4, 0x6e39, 0xca04, 0x6e6c, 0x6e2b, 0x6e2e, 0x6e3b, + 0x6e5e, 0x6efb, 0x6e27, 0x6e24, 0x6e69, 0x6e30, + /* 0x39 */ + 0xca05, 0x6e62, 0x6e38, 0x6e35, 0x6e2a, 0x6e2c, 0x6e68, 0x6e31, + 0x6e2f, 0x6e2d, 0x6e3a, 0x6e36, 0xca03, 0x6e21, 0x6e3c, 0x6e20, + 0x6e64, 0x6e3e, 0x08e8, 0x71f7, 0x7212, 0x71f1, 0x71f5, 0x7222, + 0x71f2, 0x71df, 0x7215, 0x7216, 0x757a, 0x7576, 0x75be, 0x0a20, + 0x75bd, 0x7609, 0x7608, 0x7657, 0x77a3, 0x77bf, 0x77b8, 0x77af, + 0x779c, 0x77a5, 0x7772, 0x7775, 0x779d, 0x7799, 0x77b9, 0x794e, + 0x7939, 0x793b, 0x7935, 0x793c, 0x7955, 0x7af0, 0x7af3, 0x7af4, + 0x7b3b, 0x7b3c, 0x7b3a, 0x7b36, 0x7c07, 0x3feb, 0x7c55, 0x7c50, + 0x7c4f, 0x7c52, 0x7c56, 0x33bd, 0x7c32, 0x7d63, 0x7d6b, 0x7d66, + 0x7d57, 0x7d5d, 0x0b86, 0x7d6d, 0x7d61, 0x7d69, 0x7d5a, 0x7d5c, + 0x7d62, 0x7f2a, 0x7f29, 0x7f58, 0x7f5a, 0x7fd7, 0x7fdb, 0x7fdc, + 0x7fdd, 0x7fd8, 0x8054, 0x805b, 0x805c, 0x8053, + /* 0x3a */ + 0x804f, 0x8056, 0x8050, 0x805a, 0x806b, 0x8136, 0x8153, 0x813a, + 0x813c, 0x813e, 0x8149, 0x8140, 0xca46, 0xca47, 0x8364, 0x8365, + 0x83b5, 0x83b6, 0x83b2, 0x8448, 0x844a, 0x8472, 0x8469, 0x845a, + 0x844c, 0x862c, 0x8630, 0x864b, 0x8649, 0x8642, 0x8644, 0x864a, + 0x864f, 0x8792, 0xca57, 0x8797, 0x8780, 0x8782, 0x8786, 0x8953, + 0x895e, 0x8952, 0x895b, 0x894e, 0x8a6d, 0x8a6e, 0x8afa, 0x8af6, + 0x8afb, 0x8c33, 0x8c3d, 0x8c37, 0x8c3e, 0x8c35, 0x8d9a, 0x8dab, + 0x8da6, 0x8db0, 0x8d99, 0x8da0, 0x8d9e, 0x8da8, 0x8da1, 0x8daa, + 0x8dad, 0x8dbb, 0x8d9c, 0x8da5, 0x33b3, 0x8f27, 0x8f8d, 0x8f8e, + 0x8f8f, 0x8f92, 0x0f56, 0x8f91, 0x8fad, 0x9057, 0x9058, 0x905e, + 0x905d, 0x905c, 0x905b, 0x0f67, 0x910a, 0x9103, 0x910e, 0x91b8, + 0x924d, 0x923f, 0x9247, 0x924b, 0x924a, 0x923d, + /* 0x3b */ + 0x2838, 0x9241, 0x924c, 0x2881, 0x9362, 0x9369, 0x9361, 0x0fd1, + 0x93aa, 0x93a6, 0x93ac, 0x93bd, 0x93bb, 0x93a4, 0x93ba, 0x939a, + 0x0feb, 0x93a1, 0x93c1, 0x95e0, 0x960a, 0x9603, 0x9606, 0x9639, + 0x963a, 0x9636, 0x965b, 0x965f, 0x965e, 0x9667, 0x9661, 0x9662, + 0x965d, 0x96ca, 0x96cc, 0x96ce, 0x9718, 0x971d, 0x971f, 0x9720, + 0x9717, 0x9715, 0x981f, 0x9827, 0x9826, 0x5010, 0x988b, 0x98ae, + 0x988a, 0xca99, 0x9892, 0x9889, 0x9887, 0x10b6, 0x988f, 0x9884, + 0x9883, 0x988c, 0x9893, 0x988d, 0x9898, 0x987d, 0x987e, 0x98d2, + 0x9880, 0x9899, 0x9cac, 0x9d50, 0x9d55, 0x9d42, 0x9d3f, 0x9d3c, + 0x11a3, 0x9d4c, 0x9d49, 0x9d57, 0x9d58, 0x9d4f, 0x9d5c, 0x9d47, + 0xcab7, 0x9fab, 0x1210, 0x9faf, 0x9fad, 0x9fe8, 0x9fe7, 0xa030, + 0xa026, 0xa02f, 0xa028, 0xa02b, 0xa01d, 0xa02d, + /* 0x3c */ + 0xa020, 0xa02a, 0xa02c, 0xa035, 0xa021, 0xa023, 0xa024, 0xa036, + 0xa037, 0xa1e9, 0xa2ba, 0xa2b8, 0xcacc, 0xa36d, 0xa36a, 0xa368, + 0xa369, 0xa36b, 0xa361, 0xa5dc, 0xa5db, 0xa62d, 0xa62c, 0xa6a2, + 0xa72b, 0xa732, 0xcad7, 0xa894, 0xa892, 0xa890, 0xa9c9, 0xa9c4, + 0xa9c1, 0xa9c3, 0xa9cd, 0xab14, 0xaba7, 0xabaf, 0xabaa, 0xad0d, + 0xad54, 0xad5b, 0xad61, 0xadae, 0xadb3, 0xadc0, 0xadc4, 0xadbf, + 0xadcb, 0xadad, 0xada7, 0xada4, 0xadbd, 0xadaf, 0xadb2, 0xada5, + 0xafe7, 0xafe0, 0xafce, 0xafde, 0xafd5, 0xafdf, 0xafd9, 0xb0f2, + 0xb223, 0xb240, 0x151b, 0xb23e, 0x1587, 0xb3cf, 0x3e54, 0xb55b, + 0xb558, 0xb562, 0xb55f, 0xb567, 0xb563, 0xb55e, 0xb560, 0xb685, + 0xb686, 0xb687, 0xb8e8, 0xb8e6, 0xbd71, 0xbd85, 0xcb02, 0xbd86, + 0xbe10, 0x3cf8, 0x33bf, 0x3e61, 0x33fe, 0x33fc, + /* 0x3d */ + 0x3439, 0x3461, 0x3460, 0x35e2, 0x35ea, 0x35e3, 0x35b4, 0x35ae, + 0x35be, 0x35b8, 0x35a8, 0x35aa, 0x35a9, 0x35b3, 0x35d5, 0x35ad, + 0x35b9, 0x35bb, 0x35b1, 0x35c2, 0xc908, 0x35eb, 0x35ba, 0x35d2, + 0x35d4, 0x37f1, 0x381d, 0xc912, 0x3862, 0x388c, 0x38e6, 0x38e7, + 0x395a, 0x3958, 0x3959, 0x3996, 0x3997, 0x3a61, 0x3a67, 0x3a71, + 0x3a65, 0x3a7d, 0x3a7e, 0x3b7d, 0x3b84, 0x3b7c, 0x3b7e, 0x3b7f, + 0x3b80, 0x3bef, 0x3bf4, 0x3c1e, 0x3c4e, 0x3cfb, 0x3cfa, 0x3cfd, + 0xc931, 0xc932, 0x3d79, 0x3d7c, 0x3d7d, 0x3d84, 0x3d7b, 0x3d78, + 0x0157, 0x3e5e, 0x3e5a, 0x3e5c, 0x3e59, 0x3e55, 0x3e63, 0x3e56, + 0x3e5f, 0x3e60, 0x3e5b, 0x404a, 0x4065, 0x40b3, 0x402c, 0x4077, + 0x403d, 0x4052, 0x4061, 0x402a, 0x403e, 0x4034, 0x4029, 0x40b2, + 0x40ad, 0x4040, 0x4053, 0xc944, 0x403f, 0x4041, + /* 0x3e */ + 0x4072, 0x43f6, 0x43f5, 0x43f4, 0x43f2, 0x43f9, 0x4527, 0x4554, + 0x4555, 0x452e, 0xc954, 0xc953, 0x452c, 0x4538, 0x4539, 0x4531, + 0x454f, 0x4573, 0x4530, 0x452b, 0x4551, 0x472c, 0x475b, 0x475c, + 0x4768, 0x476c, 0x476b, 0x4769, 0x479f, 0x4838, 0x483c, 0x483a, + 0x4835, 0x029d, 0x4839, 0x4836, 0x483b, 0x4960, 0x4961, 0x4963, + 0x4964, 0x4994, 0x4993, 0x495e, 0x4968, 0x496a, 0x4965, 0xc966, + 0x4990, 0x495f, 0x4972, 0xc965, 0x4c3c, 0x4c27, 0x4c24, 0x4c26, + 0x4c25, 0x035f, 0x4c28, 0x4c36, 0x4d31, 0x4d30, 0x4d34, 0x4d81, + 0x4d7d, 0x4d82, 0x4d80, 0x0379, 0x35d3, 0x4df2, 0x4e66, 0x4e8c, + 0x4e7b, 0x4e83, 0x0398, 0x4e8e, 0x4e7a, 0x4e92, 0x4e91, 0x4e82, + 0x4f1b, 0x4f1c, 0x5027, 0x5021, 0x03dc, 0x1d2b, 0x5043, 0x03df, + 0x5018, 0x507b, 0x501a, 0x504b, 0x504a, 0x504d, + /* 0x3f */ + 0x504f, 0x5019, 0x5035, 0x5013, 0x5052, 0x5014, 0x501e, 0x502c, + 0x5020, 0x5022, 0x5012, 0x501f, 0x5200, 0x5223, 0x5240, 0x5243, + 0x52e4, 0x52db, 0x52ea, 0x52dd, 0x52cc, 0x52d9, 0x52e8, 0x52f6, + 0x52e3, 0x52d3, 0x52da, 0x52d6, 0x52e7, 0x543a, 0x543f, 0x5440, + 0x5448, 0x5459, 0x5437, 0x5444, 0xc98c, 0xc98b, 0x5455, 0x5439, + 0x5554, 0x5555, 0x5556, 0x5557, 0x5558, 0x5559, 0x558d, 0x55f2, + 0x55f8, 0x55f5, 0x55f6, 0x55fc, 0x55fe, 0x55f1, 0x55fd, 0x565e, + 0x5696, 0x5697, 0x569c, 0x569b, 0x5695, 0xc99a, 0x571a, 0x5709, + 0x5704, 0x570e, 0x571c, 0x5718, 0x570d, 0x5710, 0x570c, 0x5703, + 0x587b, 0x58a6, 0x5877, 0x5888, 0x5874, 0x58da, 0x5876, 0x5878, + 0x588a, 0x588f, 0x587d, 0x5890, 0x58ed, 0x58d9, 0x58d0, 0x591a, + 0x58d7, 0x58e2, 0x58e1, 0x58c5, 0x58e0, 0x58ca, + /* 0x40 */ + 0x5925, 0x58cc, 0xc9b3, 0x5bc6, 0x5bc1, 0x5c4d, 0x5d4b, 0x5d64, + 0x5d95, 0x5d99, 0xc9bc, 0x5d94, 0x5da2, 0x5dae, 0x5d9e, 0x5da7, + 0x5d86, 0x05fd, 0x5da4, 0x5d91, 0x5d93, 0xc9bb, 0x5d88, 0x60cd, + 0x60ca, 0x613f, 0x6140, 0x6146, 0x6141, 0x6145, 0x6158, 0x613b, + 0x6148, 0x624e, 0x6252, 0x624f, 0x627b, 0x627a, 0x62a0, 0x629f, + 0x62fb, 0x62f7, 0x63b8, 0x63b9, 0x63bb, 0x63b7, 0x06f4, 0x63ba, + 0x06ef, 0x63da, 0x63b5, 0x63bf, 0x63bc, 0x63c0, 0xc9d3, 0xc9d9, + 0x6575, 0x6579, 0x6576, 0x6635, 0x6640, 0x66c0, 0x6681, 0x66ad, + 0x66af, 0x66ac, 0x668f, 0x66a8, 0x66aa, 0x66a9, 0x6688, 0x667f, + 0x6680, 0x66bc, 0x69ae, 0x69bb, 0x69bd, 0x0831, 0x6a78, 0x6a74, + 0x6b0c, 0x6b11, 0x6b08, 0x6b06, 0x6b10, 0x6b8f, 0x6b90, 0x6b8d, + 0x6b8e, 0x6b96, 0x6b95, 0x6c0b, 0x6c0c, 0x6c7c, + /* 0x41 */ + 0x6c73, 0x6c75, 0x6c76, 0x6c7d, 0x6c78, 0x6c71, 0x6d4b, 0x6d4e, + 0x6e33, 0x6e32, 0x0903, 0x6e91, 0x6ee7, 0x6ee9, 0x6ea2, 0x6e94, + 0x6e87, 0x6ea3, 0x6edd, 0x6e7b, 0x6e83, 0x6e81, 0x6edf, 0x6e7c, + 0x6ee4, 0x6ee2, 0x6e93, 0x6e7d, 0x6ebf, 0x6e9b, 0x6e8e, 0x6e9f, + 0x0909, 0x6e8c, 0x6e7f, 0x6e9c, 0x6e84, 0x6e42, 0x6ee6, 0x7251, + 0x724a, 0x7264, 0x7225, 0x722f, 0x722e, 0x722b, 0x7228, 0x7232, + 0x722d, 0x7231, 0x7239, 0x722c, 0x7261, 0x7511, 0x7510, 0x7512, + 0x7553, 0x7555, 0x757b, 0x7581, 0x757d, 0x757c, 0x75c2, 0x75c5, + 0xca22, 0x75c4, 0xca23, 0x766b, 0x7668, 0x0a3e, 0x765c, 0x765d, + 0x766a, 0xca24, 0x7c76, 0x7776, 0x0a77, 0x77c4, 0x77cb, 0x77c8, + 0x77d4, 0x77d5, 0x77c9, 0x77d7, 0x0a7b, 0x7978, 0x795a, 0x795b, + 0x795c, 0x7956, 0x7958, 0x7971, 0x96d4, 0x7b40, + /* 0x42 */ + 0xca33, 0x7b3f, 0x7b43, 0x7b41, 0x7be2, 0x7be0, 0x7be3, 0x7c66, + 0x7c73, 0x7c6c, 0x7c71, 0x7c6a, 0x7c6d, 0x7c6e, 0x7c6b, 0x7d8c, + 0x7d77, 0xca3a, 0x7d7f, 0x7d89, 0x7d7a, 0x7d85, 0x7d78, 0x7d8a, + 0x7d86, 0x7f2c, 0x7f67, 0x7f5b, 0x7fe5, 0x7fe1, 0x8061, 0x8069, + 0x806a, 0x8165, 0x816d, 0x8163, 0x8186, 0x815c, 0x8162, 0xca48, + 0x8179, 0x8169, 0x8170, 0x8176, 0x815d, 0x8187, 0x816e, 0x8171, + 0x817c, 0x8173, 0x815b, 0x816b, 0x83bf, 0x83c1, 0x83bd, 0x83c9, + 0x83bc, 0x83c2, 0x83c0, 0x8492, 0x84a9, 0x848f, 0x8476, 0x847b, + 0x8475, 0x84a4, 0x8664, 0x873d, 0x87af, 0x0d3a, 0xca58, 0x879d, + 0x8799, 0x87b1, 0x8963, 0x8962, 0x8964, 0x8969, 0x0da0, 0x8a75, + 0x8a73, 0x8a71, 0x8a74, 0x8b0c, 0x8b16, 0x0de5, 0x8b11, 0x8b1f, + 0x8b1a, 0x8b0d, 0x8b1b, 0x8b13, 0x8c4e, 0x8c55, + /* 0x43 */ + 0x8c50, 0x0e7d, 0x8dd2, 0x8dd3, 0x8dd1, 0x8df1, 0x8ddc, 0x8dc8, + 0x8dcc, 0x8dd0, 0x8dcf, 0x8ddf, 0x8f2b, 0x8f2e, 0x8f2d, 0x8f9d, + 0x8f9e, 0x8f9f, 0x8fa9, 0x8fa0, 0x8f98, 0x8fa1, 0x8fab, 0x8faf, + 0x906e, 0x905f, 0x905a, 0x0f6d, 0x9065, 0x9068, 0x9072, 0x9117, + 0x9116, 0x9118, 0x9119, 0x911a, 0x9122, 0x911b, 0x911c, 0x91be, + 0x91ee, 0x925a, 0x9250, 0x9258, 0x9254, 0x9257, 0x9256, 0x9315, + 0x939b, 0x9393, 0x9392, 0x9372, 0x9398, 0x9399, 0x93df, 0x0ff8, + 0x93d5, 0x2958, 0x93d4, 0x93f3, 0x93f4, 0x93e7, 0x93e1, 0x93e6, + 0x93eb, 0x93ec, 0x35db, 0x1050, 0x960d, 0x960c, 0x4d2f, 0x9668, + 0x9665, 0x966b, 0x9669, 0x96d1, 0x96d3, 0x9727, 0x9728, 0x1068, + 0x1067, 0x9724, 0x97d7, 0x98ca, 0x98c7, 0xca9e, 0x98d8, 0x98e1, + 0x98c6, 0x98f8, 0x98c3, 0x98f4, 0x9917, 0x98ea, + /* 0x44 */ + 0x98cb, 0x9886, 0x98c4, 0x98d9, 0x9919, 0x98c2, 0x98e2, 0x10cf, + 0x98de, 0x98ed, 0xca9c, 0x10cd, 0x991d, 0x98dd, 0x98db, 0x98e8, + 0x98e9, 0x98bf, 0x98e0, 0x98d1, 0x98dc, 0x98ce, 0x991e, 0x98cc, + 0x98f2, 0x98f3, 0xca9f, 0xcaa2, 0xcaa3, 0xcaa1, 0x9cab, 0x9caa, + 0x9ca7, 0x9ca9, 0x9d88, 0x9d75, 0x9d60, 0x9d6c, 0x9d73, 0x11ab, + 0x9d6e, 0x9d74, 0x9d76, 0x9d68, 0x9d77, 0x9d86, 0x9fea, 0xa051, + 0xa050, 0xa058, 0xa04d, 0xa04f, 0xa04e, 0xa05c, 0xa052, 0xa044, + 0xa04a, 0xa04b, 0xa1ea, 0xa210, 0xa211, 0xa2cd, 0xa2bf, 0xa2c4, + 0xa2d0, 0xa2ce, 0xa2c0, 0xa2c2, 0xa2cf, 0xa2c9, 0xa2bb, 0xa397, + 0xa392, 0xa36f, 0xa37e, 0xa39a, 0x12c1, 0xa386, 0xa373, 0x2d24, + 0xa377, 0xa38f, 0xa370, 0xa381, 0xa382, 0xa399, 0xa37d, 0xa37f, + 0xa37b, 0xa387, 0xa5b2, 0xa62f, 0xa634, 0xa62e, + /* 0x45 */ + 0xa632, 0x1347, 0xa6aa, 0x1357, 0xa6a9, 0xa738, 0xa736, 0xa737, + 0xa747, 0xa733, 0xa739, 0xa735, 0xa744, 0xa8a5, 0xa8a6, 0xa89e, + 0xa9e3, 0xa9df, 0xa9d3, 0xa9f1, 0xa9e4, 0xa9e0, 0xa9d6, 0x2ec3, + 0xa9e6, 0xa9d8, 0xa9de, 0xa9db, 0xa9dc, 0xab1b, 0xab1f, 0xab1d, + 0xab1c, 0xab1e, 0xab20, 0xab21, 0x144e, 0xabb6, 0xabbc, 0xabc6, + 0xabc7, 0xabba, 0xabbe, 0xabbd, 0xabb5, 0xabb4, 0xad0f, 0xad62, + 0xadeb, 0xadd9, 0xade4, 0xadd7, 0xadd8, 0xadd6, 0xadce, 0xaddd, + 0xade7, 0xadd2, 0xadc5, 0xadc9, 0xaddb, 0xaf92, 0xaf8a, 0xaf8b, + 0xaf89, 0xb008, 0xb003, 0xb006, 0xb005, 0xaff5, 0xb00b, 0xaffb, + 0xb0fc, 0xb101, 0xb102, 0xb0fa, 0xb108, 0xb0f7, 0xb100, 0xb0ff, + 0xb106, 0xb0f6, 0xb0fb, 0xb10a, 0xb225, 0xb243, 0xb244, 0xb364, + 0xb362, 0xb35e, 0xb35b, 0xb3d6, 0x3372, 0x33c2, + /* 0x46 */ + 0xb577, 0xb582, 0xb57c, 0xb57d, 0xb586, 0xb581, 0xb584, 0xb576, + 0xb583, 0xb57f, 0xb57e, 0xb688, 0xb68d, 0xb68b, 0xb691, 0xb68f, + 0xb77c, 0xb779, 0xb77a, 0xb8ea, 0xbb4c, 0xbc99, 0x35d1, 0xbd8b, + 0xbd8d, 0xbd8a, 0xbd8e, 0xbe11, 0x5456, 0xcb15, 0x3374, 0x33c3, + 0x33c4, 0x341b, 0x345f, 0x346a, 0x3469, 0x346b, 0x360c, 0x35f6, + 0x35ed, 0x3629, 0x35fe, 0x35f1, 0x3617, 0x35ff, 0x35ee, 0x35fd, + 0x361c, 0x35fc, 0x3600, 0x3620, 0x0077, 0x35f9, 0x3667, 0x3608, + 0x379e, 0x37f3, 0x3825, 0x3827, 0x381f, 0x3865, 0x3863, 0x3894, + 0x3897, 0x38f1, 0x395f, 0x3962, 0x18f2, 0x3960, 0xc922, 0x3a8c, + 0x3a82, 0x3a90, 0x3a8b, 0x3a8d, 0x3a81, 0x3a9d, 0x3b8e, 0x3b8f, + 0x3b92, 0x3c23, 0x3c52, 0xc92e, 0x3d00, 0x3d01, 0x3d02, 0x3d1f, + 0x3d8c, 0x3d89, 0x3d8b, 0x3d88, 0x3d8d, 0x3d8f, + /* 0x47 */ + 0x9085, 0x3e00, 0x3e05, 0x3e01, 0x3e68, 0x3e6e, 0x3e67, 0x3e75, + 0x1ab6, 0xc945, 0x40d7, 0xc946, 0x3348, 0x40d4, 0x40d8, 0xc947, + 0xc948, 0x40ba, 0xc949, 0x40db, 0x40bf, 0x4135, 0x40bc, 0x40d9, + 0x01c4, 0x40dd, 0x4100, 0x40d5, 0x4130, 0x40bd, 0x40dc, 0x43fd, + 0x43fe, 0x4407, 0x7517, 0x456f, 0x4569, 0x4570, 0x4567, 0x45a9, + 0x4595, 0x4590, 0x456c, 0x4597, 0x4571, 0x0252, 0x4574, 0x456d, + 0x458e, 0x472f, 0xc61b, 0x47a9, 0x484e, 0xc95f, 0x485a, 0x4848, + 0x4855, 0x484c, 0x4849, 0x484f, 0x484a, 0x49d6, 0x49a0, 0x49a9, + 0xc967, 0x499d, 0x49d4, 0x49a4, 0x49a8, 0x49a6, 0x49e6, 0x4b7d, + 0x4b77, 0x4b7a, 0x4c41, 0x4c49, 0x4c59, 0x4c45, 0x4c48, 0x4c40, + 0x4d8e, 0x4d95, 0x4d90, 0x4df7, 0x4df8, 0x4df6, 0x4dfb, 0x4e9e, + 0x4e9d, 0x4e99, 0xc977, 0x4ea3, 0x4ea9, 0x4e98, + /* 0x48 */ + 0x4ea0, 0x4e96, 0x4e94, 0x4e95, 0x4e9f, 0x4ea1, 0x4f21, 0x4f1d, + 0x4f1f, 0x506d, 0xc97c, 0x509a, 0x5092, 0x507a, 0x507d, 0x50a1, + 0x509d, 0x5099, 0x506b, 0x506e, 0xc97d, 0x5245, 0xc984, 0x52fb, + 0x52eb, 0x52f2, 0x52f9, 0xc986, 0x52f8, 0x52ed, 0x5301, 0x52f7, + 0x5306, 0x539b, 0x53ca, 0x046b, 0x1ec3, 0x546b, 0x546c, 0x5474, + 0x5467, 0x545b, 0x5460, 0x5476, 0x5463, 0x5461, 0x5528, 0x555b, + 0x555e, 0x5560, 0x555d, 0x555c, 0x55f4, 0x5600, 0x5608, 0x5607, + 0x5601, 0x5605, 0x5664, 0x5663, 0x569e, 0x56a0, 0x56a1, 0x569f, + 0x5726, 0x572d, 0x5728, 0x571d, 0x58ec, 0x58e3, 0x58eb, 0x5916, + 0x58c8, 0x931b, 0x58e9, 0x58e4, 0x5924, 0x58d1, 0x0541, 0x58dd, + 0x58c2, 0x58cb, 0x58c7, 0x58e7, 0x0550, 0x58ea, 0x594b, 0xc9a5, + 0x5960, 0x597d, 0x593e, 0xc9a4, 0x5952, 0x594e, + /* 0x49 */ + 0x593c, 0x5932, 0x5930, 0x5923, 0x5bca, 0x5bcb, 0x5bc9, 0x5bc8, + 0x5bcd, 0x5d98, 0x5da0, 0x5d9f, 0x5d9c, 0x5da3, 0x5d97, 0xc9be, + 0x5df1, 0x5e09, 0x5e03, 0x5dea, 0x5e45, 0x5ded, 0x5e05, 0x5e1a, + 0x5e15, 0x5e01, 0x5dec, 0x5e0e, 0x5e17, 0x5e42, 0x5e12, 0x5e10, + 0x5def, 0x5dff, 0x5e00, 0x5e0c, 0x5e0f, 0x5e04, 0x5e08, 0x5e14, + 0x5e43, 0xc9bd, 0x5e1b, 0x5e11, 0x5e13, 0x60cf, 0x60ce, 0x616f, + 0x616e, 0x617a, 0x6170, 0x6164, 0x615e, 0x616c, 0xc9c9, 0x615b, + 0x6161, 0x6165, 0x627f, 0x6280, 0x627c, 0x62a7, 0x62a6, 0x62a1, + 0x06c0, 0x62a8, 0x62a3, 0x62a2, 0x62ad, 0x62a5, 0x6301, 0x62ff, + 0x62fc, 0x6300, 0x6335, 0x63ee, 0x63ef, 0x63f6, 0x63e8, 0x63ea, + 0x63e3, 0x641f, 0x06fc, 0x63e4, 0x63fa, 0x63f1, 0x63fb, 0xc9d4, + 0x653d, 0x653c, 0x0079, 0x6578, 0x6577, 0x100b, + /* 0x4a */ + 0x66d1, 0x66c7, 0x66df, 0x66d0, 0x66e0, 0x66d6, 0x66d8, 0x6716, + 0x670e, 0x66d9, 0x670f, 0x6711, 0x66cd, 0x6689, 0x66ce, 0x6714, + 0x66da, 0x6712, 0x66d3, 0x66c2, 0x66e1, 0x66e9, 0x66ea, 0x66de, + 0x6715, 0x69d9, 0x69d6, 0x69cd, 0x69d0, 0x69d3, 0xc9f0, 0x6a82, + 0x6a85, 0x6a7f, 0x6a7d, 0x6a81, 0x6a83, 0x6a84, 0xada0, 0x6b28, + 0x6b0f, 0x6b17, 0x6b1a, 0x6b25, 0xc9f7, 0x6b9b, 0x6b99, 0x6c92, + 0x6c8c, 0x6c95, 0x6c8d, 0x6ca3, 0x6c93, 0x6c91, 0x6edb, 0x6e99, + 0x6e9a, 0x6f08, 0x6f4c, 0x6f0d, 0x6f01, 0x6f4e, 0x6f02, 0x6f4d, + 0x6f21, 0x6efc, 0xca09, 0x6e8a, 0xca08, 0x6e95, 0x6f11, 0x6f12, + 0x6f46, 0x6f1c, 0x6f49, 0x6f0c, 0x091e, 0x6f13, 0x6f16, 0x6efd, + 0x6f0f, 0x6f1f, 0x7230, 0x726e, 0x726b, 0x729b, 0x727b, 0x7263, + 0x7297, 0x726d, 0x729c, 0x7298, 0x726f, 0x7267, + /* 0x4b */ + 0x7269, 0x7515, 0x7563, 0x7586, 0x758a, 0x7587, 0x7588, 0x7585, + 0x7589, 0x75ca, 0x75c7, 0x75cb, 0x75cc, 0x75c9, 0x760d, 0x7683, + 0x7684, 0x7678, 0x7682, 0x7673, 0x7679, 0x768c, 0x77d0, 0x77cf, + 0x77d2, 0x77d9, 0x77cc, 0x77eb, 0x77fd, 0x77ec, 0x77e8, 0x77f8, + 0x77fa, 0xca27, 0x0a85, 0x77e1, 0x77fb, 0x78e7, 0xca2e, 0x79a5, + 0x7991, 0x79a6, 0x797c, 0x7992, 0x79a2, 0x79a0, 0x7afc, 0x7afe, + 0x7b57, 0x7b53, 0x7b58, 0x7be7, 0x7c8e, 0xca38, 0x7c83, 0x7c8b, + 0x7c84, 0x0b97, 0x7da2, 0x7db7, 0x7da9, 0x7da5, 0x7d9f, 0x7daa, + 0x7d97, 0x7da1, 0x7d9e, 0x7dab, 0x7d99, 0x7da3, 0x7f30, 0x7f32, + 0x7f2f, 0x7f70, 0x7f6c, 0x7f6f, 0x7fe8, 0x7fee, 0x7fea, 0x806d, + 0x8076, 0x8070, 0x8071, 0x806c, 0x81eb, 0x81b5, 0x8196, 0x8190, + 0x818d, 0xca49, 0x81a2, 0x81b0, 0x8192, 0x81a0, + /* 0x4c */ + 0x8193, 0x81c3, 0x818e, 0x81b6, 0x819d, 0x8195, 0x81b3, 0x81a4, + 0x8370, 0x83d4, 0x0c93, 0x83cf, 0x3470, 0x8494, 0x2561, 0x84c0, + 0x84b4, 0x84c1, 0x0cb2, 0x84bd, 0x84af, 0x8677, 0x8678, 0x866b, + 0x866d, 0x866e, 0x8672, 0x866f, 0x8671, 0x62ab, 0x868c, 0x873f, + 0x87b6, 0x87b7, 0x2606, 0x87bb, 0x87b8, 0x3a9c, 0x87b9, 0x2601, + 0x898b, 0x897a, 0x8984, 0x8988, 0x8991, 0x8979, 0x898e, 0x8980, + 0x8982, 0x897c, 0x0da4, 0x8a84, 0x8a7f, 0x0df2, 0x8b3b, 0x8b71, + 0x8b3d, 0x8b30, 0x0df1, 0x8b3e, 0x8b38, 0x8c5e, 0x8c64, 0x0e81, + 0x8c5d, 0x8c6d, 0x8c4f, 0x8c62, 0x8c5f, 0x8dec, 0x8df2, 0x8df4, + 0x8df7, 0x8df6, 0x8e07, 0x8ded, 0x8dea, 0x8df0, 0x8df8, 0x8df3, + 0x0edc, 0xca72, 0x8f31, 0x8f2f, 0x8fb6, 0x8fae, 0x8faa, 0x8fbf, + 0x8fcc, 0x8fc7, 0x9983, 0x9080, 0x907b, 0x907f, + /* 0x4d */ + 0x907d, 0x9083, 0xca78, 0x9146, 0x912d, 0x9125, 0x9126, 0x912c, + 0x9137, 0x9131, 0x9133, 0x9132, 0x9127, 0x912a, 0x912e, 0x912f, + 0x91c0, 0x9271, 0x9261, 0x9262, 0x9266, 0x9318, 0x93c5, 0x93c3, + 0x93c4, 0x93c2, 0x93ae, 0x9410, 0x9408, 0x941f, 0x943a, 0x943b, + 0x9436, 0x940c, 0x9406, 0x942a, 0x9457, 0x9450, 0x9420, 0xca85, + 0x942c, 0x9421, 0x940b, 0x9419, 0x9435, 0x9418, 0x940f, 0x9413, + 0x9455, 0x9439, 0x941a, 0x100c, 0x9417, 0x95e4, 0x95e9, 0x758b, + 0x9610, 0x9612, 0x963f, 0x966e, 0x7518, 0xca8c, 0x96d6, 0x96d5, + 0x96d7, 0x3e02, 0x106d, 0x9731, 0x9730, 0x973a, 0x9885, 0x986b, + 0x9948, 0x994b, 0x9937, 0x997b, 0x996c, 0x9985, 0x9965, 0x9936, + 0x9986, 0x9934, 0x9968, 0x995a, 0x9958, 0x9972, 0x996a, 0x98d3, + 0x993c, 0x9933, 0x993b, 0x994d, 0x994f, 0x997c, + /* 0x4e */ + 0x99b0, 0x995b, 0x9955, 0x9964, 0x996b, 0x9953, 0x10e6, 0x9957, + 0x995e, 0x996d, 0x9935, 0x9969, 0x9959, 0x9966, 0x9950, 0x9951, + 0x995c, 0x9a5d, 0x9987, 0x9978, 0x9949, 0x994e, 0x98f1, 0x9973, + 0x9988, 0x98cf, 0xcaa4, 0x9cb1, 0x9cb3, 0x9d9c, 0x9da4, 0x9d90, + 0x9db8, 0x9da0, 0x9d9d, 0x9da8, 0x9da9, 0xcab9, 0x9db1, 0x9d93, + 0x9d9b, 0x9da2, 0x9da1, 0x9db0, 0x9da7, 0x9fb3, 0x2b49, 0x9fb4, + 0x9ff1, 0x9fed, 0x9fec, 0xa068, 0xa075, 0xa06a, 0xa062, 0xa067, + 0xa060, 0xa077, 0xa05f, 0xa079, 0xa223, 0xa221, 0xa21c, 0x2c99, + 0xa21f, 0xa21e, 0xa2d6, 0xa2d3, 0xa2d9, 0xa2d7, 0xa2d4, 0xa2dc, + 0xa2d8, 0xa3a3, 0x12d1, 0xa3be, 0xa3a9, 0xa3a1, 0xa3a0, 0xa3ab, + 0xa3a2, 0xa3ba, 0xa3c2, 0xa39c, 0xa3bb, 0xa3aa, 0xa3ac, 0xa3a5, + 0xa3c1, 0x132c, 0xa5e2, 0xa636, 0xa63d, 0xa63a, + /* 0x4f */ + 0x5661, 0xa648, 0xa63c, 0xa6b7, 0xa6ac, 0xa6b3, 0xa6b6, 0xa6b2, + 0x136e, 0xa75d, 0xa749, 0xa74e, 0xa74f, 0xa74d, 0xa75c, 0xa85d, + 0xa8bb, 0xa8ce, 0xa8bf, 0xa8ba, 0xa8c3, 0x13e5, 0xaa06, 0xa9f8, + 0xa9fe, 0xaa13, 0xa9f6, 0x13e6, 0xab34, 0xab2d, 0xab2a, 0xab35, + 0xab2c, 0xabd4, 0xabda, 0xabd3, 0xabd2, 0xabce, 0xabcf, 0x149f, + 0xadfd, 0xae0b, 0xadfe, 0xadf8, 0xadf7, 0xae17, 0xadfa, 0xadf9, + 0xae00, 0xadf5, 0xadf1, 0xae03, 0xae05, 0xae1c, 0xafac, 0xaf9a, + 0xafad, 0xafa0, 0xb01b, 0xb025, 0xb024, 0xb026, 0xb027, 0xb028, + 0xb02a, 0xb01a, 0xb02e, 0xb015, 0xb115, 0xb114, 0xb117, 0xb118, + 0xb10f, 0xb113, 0xb10b, 0xb122, 0x457a, 0xb226, 0x301f, 0xb251, + 0xb24d, 0xb24e, 0xb24a, 0xb24b, 0xb24c, 0xb250, 0xb262, 0xb24f, + 0xb252, 0xb368, 0xb369, 0xb3e5, 0xb3f0, 0xb3e1, + /* 0x50 */ + 0xb3e2, 0xcaf2, 0xb5a5, 0xb5a9, 0xb5a4, 0xb5af, 0xb5ac, 0xb5ae, + 0xb5aa, 0xb695, 0xb699, 0xb693, 0xb69d, 0xb698, 0xb69c, 0xb697, + 0x160d, 0xb789, 0xb787, 0xb8d7, 0xb8ed, 0xb8f1, 0xb8f0, 0xb905, + 0xb903, 0xb904, 0xb95f, 0xbb57, 0xbc9c, 0xbca1, 0xbc9a, 0xbd8f, + 0xbd93, 0xbd9e, 0xbda3, 0xbd98, 0xbd99, 0xbd95, 0xbe6e, 0xbe6a, + 0xbff4, 0xbff7, 0xc179, 0xc38f, 0xc391, 0xc40b, 0xc802, 0x3384, + 0x3404, 0x3480, 0x362f, 0x363f, 0x363b, 0x3662, 0x3644, 0x3633, + 0x365f, 0x362b, 0xc909, 0x3639, 0x3636, 0x3648, 0x3635, 0x366c, + 0x3658, 0x363a, 0x37a8, 0x37f4, 0x3829, 0x389a, 0x3900, 0x3abb, + 0x3abd, 0x3ab7, 0x3ab2, 0x00f8, 0x3aa8, 0x3aab, 0x3aa6, 0x3abc, + 0x3b97, 0x3b96, 0x3bf8, 0x1913, 0x3c51, 0x0133, 0x3cb5, 0x3cb4, + 0x3cb6, 0x013c, 0x3cb7, 0x3d05, 0x3d23, 0x3d95, + /* 0x51 */ + 0x3d98, 0x014f, 0x3d94, 0x3d93, 0x3e07, 0x3e73, 0x3e71, 0x3e72, + 0x3e78, 0x415f, 0x416a, 0x4167, 0x416b, 0x4169, 0x418e, 0x4149, + 0x4180, 0x01dc, 0x4144, 0x418f, 0x4145, 0xc94c, 0x414f, 0x4163, + 0x4136, 0x4148, 0x415c, 0x4193, 0x4161, 0x4160, 0x414e, 0x415e, + 0x413f, 0x41a4, 0x1ae0, 0x4168, 0x440b, 0x4411, 0x440d, 0x440e, + 0x45c2, 0xc957, 0x45b0, 0x45c3, 0x45c8, 0x4565, 0x45d7, 0x45bd, + 0x45b8, 0x45b6, 0x45c7, 0x45bc, 0x45b1, 0x45af, 0xc95b, 0x4735, + 0x4730, 0x475d, 0x3e76, 0x476f, 0x47b0, 0xc95e, 0x47b4, 0x485c, + 0x485d, 0x4a08, 0x49ee, 0x4a0b, 0x49f2, 0x49fd, 0x49f1, 0x4a10, + 0xc968, 0x4a14, 0x4b8b, 0x4b8c, 0x4b85, 0x4c7a, 0x4c6c, 0x4c60, + 0x4c67, 0x4c66, 0x4c6a, 0x4c5f, 0x4c6d, 0x4c68, 0x4c64, 0x4d3a, + 0x4d3b, 0x4d39, 0x4e02, 0x4e04, 0x4e03, 0x4eb4, + /* 0x52 */ + 0x4eb3, 0x4ebb, 0x4eac, 0x4eb6, 0x4eb1, 0x4eaf, 0x4eb5, 0x4ebe, + 0x4eb2, 0x4f24, 0x50b6, 0x50b9, 0x50ac, 0x50b0, 0x50d7, 0x50bb, + 0x50fe, 0x50cb, 0xc97f, 0x03f5, 0x50b3, 0x50be, 0x50cd, 0x50bc, + 0x50ba, 0x50c7, 0x5316, 0x531b, 0x5317, 0x5315, 0x539f, 0xc98e, + 0x5482, 0x5483, 0x548e, 0x546a, 0x5489, 0x5494, 0x5486, 0x5490, + 0x5562, 0x5590, 0x560c, 0x560f, 0x04c3, 0x56a5, 0x56a7, 0x56a6, + 0x56a4, 0x5735, 0x5738, 0x5736, 0x5743, 0x5747, 0x5737, 0x5943, + 0x59a2, 0x5951, 0x5972, 0x596d, 0x592f, 0x5954, 0x596e, 0x5955, + 0x5937, 0x594f, 0x5950, 0x1f39, 0x599e, 0xc9a8, 0x59b3, 0x59a7, + 0x0571, 0x59f9, 0x5991, 0xc9a7, 0x59b6, 0x59dd, 0x5999, 0x5bdf, + 0x5bd5, 0x77f5, 0x5e28, 0x5e40, 0x5e71, 0x5e98, 0x5e95, 0x5e65, + 0x5e78, 0x5e7f, 0x5e60, 0x5e7c, 0x5e96, 0x5e6a, + /* 0x53 */ + 0x5e79, 0x5e73, 0x5e72, 0x5e7b, 0x5e70, 0x60d5, 0x60d7, 0x618f, + 0x6189, 0x619e, 0x6187, 0x61a0, 0x618d, 0x6188, 0x617f, 0x618c, + 0x6193, 0x6259, 0xbcb0, 0x62b1, 0x81f4, 0x62af, 0x62b2, 0x6308, + 0x630a, 0x6336, 0x6337, 0xc9cf, 0x0701, 0x6436, 0x6429, 0x644a, + 0x6426, 0x6428, 0x6424, 0x642a, 0x6448, 0x6544, 0x6584, 0x658c, + 0x66c4, 0x66dc, 0x6787, 0x6753, 0x677f, 0x6731, 0x6751, 0x674b, + 0x6752, 0x6780, 0x67a5, 0x6781, 0x6743, 0x6734, 0x6736, 0x6732, + 0x6748, 0x6749, 0x673c, 0x674d, 0x674a, 0xc9e6, 0x678a, 0x6746, + 0x673e, 0x6783, 0x6750, 0x67b4, 0x69f0, 0x69e4, 0x69e3, 0x69e5, + 0x69e6, 0x69e7, 0x69e1, 0x69ef, 0x69e8, 0x69dd, 0x6a03, 0x6a88, + 0x6b26, 0x6b16, 0x6b3b, 0x6b2f, 0x6b39, 0x6b34, 0xc9f4, 0x6b35, + 0x6b31, 0x6b38, 0x3e81, 0x6baa, 0x6ba3, 0x6ba4, + /* 0x54 */ + 0x6ba0, 0x6ba1, 0x6ba9, 0x6ba5, 0x6caf, 0x6cb1, 0x6cab, 0x6cae, + 0x6cb0, 0x6cb3, 0x6cac, 0x6ca9, 0x6cb2, 0x6ca8, 0x6cb4, 0x6cc2, + 0x6d4f, 0x6d66, 0x6f1e, 0x6f15, 0x6f10, 0x6f7f, 0x6f7e, 0x6f60, + 0x6fcc, 0x6fb2, 0x6f62, 0x6f8d, 0x6f8e, 0x6f77, 0x6f7c, 0x6f8f, + 0x6f5d, 0x6f6d, 0x6f63, 0x6faf, 0x6f90, 0x6f7d, 0x6f7a, 0x6f06, + 0xca0b, 0x6f68, 0x6fb4, 0x6f78, 0x6fb1, 0x22d7, 0xca0c, 0x0941, + 0x72e8, 0x72e9, 0x72c0, 0x09d7, 0x72ea, 0x72b7, 0x72ba, 0x72b5, + 0xca1d, 0x72b4, 0x72bc, 0x72c6, 0x72b8, 0x72bd, 0x72c2, 0x734d, + 0x72f0, 0x72c7, 0x72c1, 0x72c3, 0x72f1, 0x72ec, 0x09e2, 0x751c, + 0x7520, 0x7558, 0x7565, 0x7564, 0x758c, 0x758d, 0x75d9, 0x75e0, + 0x7610, 0x7694, 0x7692, 0x7696, 0x7695, 0x76bf, 0x76a0, 0x0a45, + 0x77f4, 0x77f6, 0x77dc, 0x243d, 0x7816, 0x7815, + /* 0x55 */ + 0x781c, 0x780f, 0x782c, 0x7814, 0x7825, 0x7817, 0x7812, 0x781e, + 0x7980, 0x79a8, 0x79af, 0x79d6, 0x79e2, 0x79b4, 0x79b3, 0x79b0, + 0x79b2, 0x79a1, 0x7b60, 0x7b66, 0x7b61, 0x7b4e, 0x7b5d, 0x7b63, + 0x7be6, 0x7bef, 0x7bec, 0x7c98, 0x7ca7, 0x7c94, 0x7c95, 0x7c91, + 0x7c9d, 0x7c99, 0x7c9b, 0x7c9c, 0x7d1d, 0x7d1c, 0x7dd0, 0x7de0, + 0x7dcb, 0x7ddb, 0x7dda, 0x7dc2, 0x7dd3, 0x7de5, 0x7f7d, 0x7f7b, + 0x7fff, 0x0bf2, 0x7ff9, 0x8077, 0x807c, 0x8078, 0x807b, 0x807a, + 0x81d2, 0x81cb, 0x81c9, 0x81ce, 0x81e4, 0x81ca, 0x81d0, 0x61a5, + 0x0c49, 0x81d9, 0x81ee, 0x81dd, 0x8200, 0x81e1, 0x83de, 0x83e2, + 0x83da, 0x84ce, 0xca4f, 0x84cf, 0x84da, 0x84d1, 0x84d4, 0x84ed, + 0x84cb, 0x84d5, 0x84f1, 0x869c, 0x8688, 0x8741, 0x87d0, 0x87f7, + 0x87cf, 0x87d1, 0x87db, 0x87de, 0x87f8, 0x87dc, + /* 0x56 */ + 0x87d9, 0x89a0, 0x89b2, 0x89a1, 0x89aa, 0x89a9, 0x0da9, 0x89a6, + 0x899c, 0x89b5, 0x89a7, 0x8a8e, 0x8a90, 0x8a91, 0x8b85, 0x8b5b, + 0x8b70, 0x8b64, 0x8b67, 0x8b63, 0x8b77, 0x8b68, 0x8b65, 0x8b6a, + 0x8b78, 0x8b66, 0x8c88, 0x8c9e, 0x8c74, 0x8c7a, 0x8c79, 0x8c8b, + 0x8c7f, 0x8e13, 0x8e1e, 0x8e17, 0x8e1a, 0x8e22, 0x8e43, 0x8e19, + 0x8e1f, 0x8e27, 0x8e12, 0x8e24, 0x8e25, 0x365e, 0x8f35, 0x8f34, + 0x8fd1, 0x8fc4, 0x8fca, 0x8fc6, 0x8fcb, 0x8fcd, 0x8fe2, 0x9089, + 0x908b, 0x9086, 0x9088, 0x908d, 0x913b, 0x913c, 0x913d, 0x91f5, + 0x9279, 0x9275, 0x9282, 0x927f, 0x9285, 0x9276, 0x927c, 0x927e, + 0x927b, 0x9280, 0x927a, 0x5748, 0x0fcb, 0x931d, 0x93f6, 0x93f7, + 0x93f9, 0x9463, 0x946c, 0x946e, 0x9414, 0x100d, 0x9467, 0x946f, + 0x9469, 0x9476, 0x9495, 0x9471, 0x9461, 0x9478, + /* 0x57 */ + 0x946b, 0x9485, 0x9484, 0x9614, 0x9676, 0x89b6, 0x9675, 0x9674, + 0x96e2, 0x973f, 0x9744, 0x973d, 0x9747, 0x9748, 0x97db, 0x97dc, + 0x97dd, 0x98e5, 0x98e6, 0x99c2, 0x9a2e, 0x9a1d, 0x99f8, 0x99f0, + 0x99f6, 0x99c5, 0x99c6, 0x99fc, 0x9a52, 0x9a2f, 0x9a10, 0x99f3, + 0x99d2, 0x99ea, 0x99dc, 0x9a1b, 0x99fb, 0x99c3, 0x9a16, 0x9a07, + 0x99c9, 0x99d8, 0x9a30, 0x9a13, 0x9a31, 0x99fa, 0x99f2, 0x9ae3, + 0x99d5, 0x9a01, 0x99f1, 0x9a1c, 0x99d6, 0x9a08, 0x9a0b, 0x9a17, + 0x9a20, 0x99ca, 0x9a32, 0x9a05, 0x99e4, 0x99ce, 0x9a33, 0x9a02, + 0x9a19, 0x9a1e, 0x99d3, 0x99f7, 0x99e8, 0x9a1f, 0x99f4, 0x9ad8, + 0x9cbf, 0x9cbe, 0x9cbd, 0x9ddc, 0x9ddd, 0x9dab, 0x9dc9, 0x9dc8, + 0x9ddf, 0x9dd9, 0x9ddb, 0x9dcc, 0x9de0, 0x9def, 0x9df3, 0x9dae, + 0x9e01, 0x9fb7, 0x9fb9, 0x9fb6, 0x9fb8, 0x9ff6, + /* 0x58 */ + 0x9ff3, 0x9ff5, 0x9ff2, 0xa091, 0xa09d, 0xa09b, 0xa092, 0xa08d, + 0xa09e, 0xa08c, 0x1231, 0xcac7, 0xa095, 0xcac6, 0xa08a, 0xa08e, + 0xa09c, 0xa1ef, 0xa22d, 0xa252, 0xa235, 0xa228, 0xa22e, 0xa2e5, + 0xa3ea, 0xa3f1, 0xa3eb, 0xa3d8, 0xa3d0, 0xa3f3, 0xa3db, 0xa3ce, + 0x12d5, 0xa3da, 0xa3d7, 0xa3e1, 0xa3f2, 0xa3c8, 0xa3d9, 0xa3de, + 0xa3d1, 0xa3e7, 0xa3cf, 0xa5b7, 0xa647, 0xa642, 0xa643, 0xcad3, + 0xa6c3, 0xa6c1, 0xa6c7, 0xa764, 0xa76a, 0xa766, 0xa750, 0xa76e, + 0xa765, 0x69ec, 0xa77f, 0xcad5, 0xa79a, 0xa769, 0xa772, 0xa76f, + 0xa77d, 0xa770, 0xa860, 0xa8c2, 0xa8e7, 0xa8d1, 0xa8eb, 0xa8d4, + 0xa8dc, 0xa8db, 0xaa37, 0xaa25, 0xaa1f, 0xaa1e, 0xaa21, 0xaa1b, + 0xaa17, 0xaa22, 0xaa2a, 0xaa1a, 0xaa2d, 0xaa23, 0xaa26, 0xaa36, + 0xa9ff, 0xab3a, 0xab40, 0xab42, 0xab38, 0xab3b, + /* 0x59 */ + 0xab3c, 0xab43, 0xabe8, 0x1456, 0xabf9, 0xabeb, 0xabf1, 0xabe9, + 0xabec, 0xad15, 0xad47, 0xad46, 0xad45, 0xae24, 0xae56, 0xae21, + 0xae27, 0xae4d, 0xae31, 0xae1e, 0xae2c, 0xae4f, 0xae2b, 0xae53, + 0xae51, 0xae54, 0xae29, 0xae50, 0xae1f, 0xae32, 0xae2a, 0xae1d, + 0xae28, 0xae2e, 0xae2d, 0xafbc, 0xafbb, 0xafbd, 0xcae4, 0xb047, + 0xb041, 0xcae5, 0xb049, 0x14f4, 0xb12e, 0xb127, 0xb26a, 0xb27b, + 0xb273, 0xb275, 0xb269, 0xb279, 0xb272, 0xb376, 0xb377, 0xb374, + 0xb373, 0xb402, 0xb3fe, 0xb401, 0xb3f9, 0xb3f4, 0xb5d3, 0xb5d5, + 0xb5d8, 0xb5c3, 0xb5ca, 0xb5d0, 0xb5cb, 0xb5ce, 0xb5c5, 0xb5e6, + 0xb5c4, 0xb5c0, 0xb5d4, 0xb5e8, 0xb676, 0xb6a2, 0xb6ae, 0xb6a8, + 0xb6a3, 0xb6a7, 0xb696, 0xb6a9, 0xb6a5, 0xb6af, 0xb6a4, 0xb6ab, + 0xb6aa, 0xb6a6, 0xb6a0, 0xb798, 0xb8db, 0xb8f6, + /* 0x5a */ + 0xb8f5, 0xb90c, 0xb90a, 0x3175, 0xb968, 0xb963, 0xb966, 0x1658, + 0xb964, 0xb96a, 0xb969, 0xba95, 0xbb02, 0xbb6a, 0xbb5e, 0xbb68, + 0xbb69, 0xbb65, 0xcafe, 0xbca7, 0xbcae, 0xbca8, 0xbcb3, 0xbd9c, + 0xbda9, 0xbdb6, 0xbdb3, 0xbdb2, 0xcb03, 0xbdb8, 0xbdc0, 0xbdbf, + 0xbdba, 0xbda8, 0xbe3c, 0xbe72, 0xbe71, 0xbe75, 0xbe73, 0xbf17, + 0xbf15, 0xbf16, 0xbf1b, 0xbffa, 0xbff9, 0xc12c, 0xc185, 0xc182, + 0xc17f, 0xc17d, 0xc188, 0x72f3, 0xc24e, 0xc250, 0xc393, 0xc397, + 0xc398, 0xc39b, 0xc39c, 0xc396, 0xc58b, 0xc5fd, 0xc5fc, 0xcb17, + 0x6a8b, 0x3408, 0x3407, 0x3673, 0x36a2, 0x36af, 0x3682, 0x367b, + 0x3674, 0x36b0, 0x3676, 0x36b9, 0x369e, 0x36b1, 0x36a1, 0x36b2, + 0x366e, 0xc90b, 0x0087, 0x3678, 0x367a, 0x3683, 0x369a, 0x37f8, + 0x3831, 0x3869, 0x3868, 0x389c, 0x3904, 0x3999, + /* 0x5b */ + 0x3ac7, 0x3ac6, 0x3adc, 0x3ac4, 0x3ad8, 0x3ad4, 0x3adf, 0x3ad1, + 0x3ad0, 0x3ad6, 0x3acf, 0x3bad, 0x3baf, 0x3ba7, 0x3bfd, 0x3c5b, + 0x3c5a, 0x3d07, 0x3d9d, 0x3d9b, 0x3dab, 0x3da4, 0x3d9c, 0x3d9e, + 0x3da5, 0x3daa, 0x3da6, 0x3e0e, 0x3e7e, 0x3e7c, 0x41ee, 0x41d5, + 0x41e9, 0x4142, 0x41e2, 0x4223, 0x41d9, 0x41d4, 0x41e3, 0x4215, + 0x41ef, 0x41f0, 0x41d6, 0x41dd, 0x41f6, 0x421c, 0x41d8, 0x41db, + 0x41da, 0x41ed, 0x4611, 0x4415, 0x4418, 0x441a, 0x441f, 0x4416, + 0xc94d, 0x4419, 0xc94b, 0x45f0, 0x4609, 0x461b, 0xa5e7, 0x45f6, + 0x45f4, 0x45b5, 0x4610, 0x45f2, 0x4615, 0x45f3, 0x45f8, 0x4739, + 0x473b, 0x4736, 0x460e, 0x4772, 0x4774, 0x47b9, 0x47b7, 0x47b8, + 0x4872, 0x486b, 0x4a1d, 0x4a37, 0x4a22, 0x4a43, 0x4a4d, 0x4a38, + 0x4a5b, 0x4a79, 0x4a1b, 0x49f3, 0x4b91, 0x4c7b, + /* 0x5c */ + 0x4c94, 0xc96f, 0x4c96, 0x4c7f, 0x4c8f, 0x4c84, 0x4c7c, 0x4c8e, + 0x4c90, 0x4c98, 0x4c83, 0x4c80, 0x4c93, 0x4c82, 0x32fd, 0x4d3d, + 0x4d41, 0x4da1, 0x4d9f, 0x4e0a, 0x4e0d, 0x4ec8, 0x4ec9, 0x4ec7, + 0x4ecd, 0x4f25, 0x50b1, 0x50dc, 0xc980, 0x50e5, 0x50f4, 0x50bf, + 0x50db, 0x50ea, 0x50f2, 0x03fa, 0x50f1, 0x50ed, 0x50e6, 0x5202, + 0xc982, 0x5325, 0x5318, 0x531f, 0x5320, 0x53cf, 0x549d, 0x5499, + 0x54a8, 0x5568, 0x5566, 0x5567, 0x5591, 0x5613, 0x5615, 0x561d, + 0x5616, 0x5619, 0x566b, 0x5668, 0x566a, 0x566d, 0x5669, 0x56aa, + 0x5757, 0x5752, 0x5750, 0x575f, 0x5767, 0x574f, 0x04f2, 0x575b, + 0x575c, 0x575d, 0x5a1f, 0x599d, 0x59b1, 0x59b0, 0x5994, 0x59c3, + 0x59af, 0x59a8, 0x59dc, 0x5998, 0x59c4, 0x59a4, 0x59ab, 0x59aa, + 0x59a5, 0x5a21, 0x59eb, 0x59e6, 0x59f7, 0x59f8, + /* 0x5d */ + 0x59fc, 0x59fa, 0x59e0, 0xc9aa, 0x59f6, 0xc9a9, 0x59e1, 0x5bec, + 0x5be2, 0x5be4, 0x5bf9, 0x5e6f, 0x6b4c, 0x5ebb, 0x5ee1, 0x5f00, + 0x5ed8, 0x062f, 0x5ed6, 0x5ee2, 0x5ec3, 0x5eb3, 0x5ed2, 0xc9c1, + 0x5ece, 0x5ed0, 0x5ed5, 0x5eb9, 0x5eba, 0x5ecf, 0x5ebd, 0x60db, + 0x61aa, 0x61ad, 0x61b8, 0x61b6, 0x61b5, 0x61af, 0x61b4, 0x61b7, + 0x61a8, 0x61b9, 0x61be, 0x6282, 0x62bc, 0x62b8, 0x62b6, 0x62b9, + 0x06c1, 0x6310, 0x6427, 0x6469, 0x6470, 0x6456, 0x646b, 0x647a, + 0x646c, 0x646d, 0xc9d5, 0x94c1, 0x658d, 0x6590, 0x67b6, 0x6810, + 0x6812, 0x67ba, 0x67bd, 0x6805, 0x67c2, 0x6807, 0x67f5, 0xc9e9, + 0x67af, 0x67f4, 0x67f7, 0x67f8, 0x6811, 0x69f6, 0x69f5, 0x69fb, + 0x6a01, 0x6a00, 0x6a02, 0x69fe, 0x69fa, 0x69fd, 0x0840, 0x6b37, + 0x6b49, 0x6b4b, 0x6b46, 0x6b47, 0x6bb3, 0x6bb2, + /* 0x5e */ + 0x6bb0, 0x6bb7, 0x6c11, 0x6ccc, 0x6cdf, 0x6cd3, 0x6cd5, 0x6cdb, + 0x6cc5, 0x6cc8, 0x6cc9, 0x6ce2, 0x6cca, 0x6cd1, 0x6cd2, 0x6cdd, + 0x6f6c, 0x6f73, 0x7021, 0x6ff0, 0x701f, 0x703b, 0x7022, 0x7023, + 0x6fe8, 0x6fdd, 0x093f, 0x701b, 0x6fed, 0xca0e, 0x6ff2, 0x0946, + 0x6fdc, 0x6fe9, 0x701d, 0x6fda, 0x6fe6, 0x7313, 0x7315, 0x7316, + 0x733c, 0x730b, 0x731c, 0x733a, 0x733d, 0x739a, 0x731d, 0x7309, + 0x7308, 0x733b, 0x7522, 0x7526, 0x7525, 0x7524, 0x369b, 0x758f, + 0x7590, 0x75e6, 0x75e3, 0x75e5, 0x7611, 0xca25, 0x76ae, 0x76be, + 0x76b4, 0x76b3, 0x76af, 0x7691, 0x76c2, 0x76b6, 0x76b2, 0x7857, + 0x783b, 0x7858, 0x7851, 0x7841, 0x7839, 0x0a8f, 0x7859, 0x7845, + 0x7861, 0x78e8, 0x79fa, 0x79ea, 0x79ef, 0x79f2, 0x79f0, 0x7b08, + 0x7b70, 0x7b6a, 0x7b73, 0x7b68, 0x7bc8, 0x7bf2, + /* 0x5f */ + 0x3e7b, 0x7cae, 0x7cab, 0x7cb5, 0x7caf, 0x7cb2, 0x7cb6, 0x7cb0, + 0x7d1e, 0x7e03, 0x7e06, 0x7e1f, 0x0bac, 0x7e0f, 0x7e02, 0x7e19, + 0x7e18, 0x7e22, 0x7e15, 0x7e07, 0x7e0d, 0x7e24, 0x7e0c, 0x7e1e, + 0x7f89, 0x7f8a, 0x800a, 0x800b, 0x8007, 0x8004, 0x8009, 0x8084, + 0x8083, 0x8218, 0x8214, 0x8205, 0x8216, 0x820e, 0x8211, 0x8208, + 0x820b, 0x8215, 0x8085, 0x8237, 0x822a, 0x820d, 0x820f, 0x837e, + 0x8376, 0x8377, 0x83ec, 0x84fc, 0x8508, 0x84ff, 0x8503, 0x8510, + 0x8505, 0x8506, 0x84fa, 0x86c7, 0x86c0, 0x86c3, 0x86a7, 0x86a8, + 0x86ab, 0x86c1, 0x86aa, 0x86c8, 0x8743, 0x8802, 0x880e, 0x8801, + 0x87fe, 0x8803, 0x0d68, 0x8822, 0x8821, 0x8807, 0x8808, 0x880c, + 0x89ca, 0x89bc, 0x89be, 0x89bd, 0xca5c, 0x89bb, 0x89b9, 0x0dab, + 0x89c5, 0x8a99, 0x8b6b, 0x8b93, 0x8b94, 0x8ba9, + /* 0x60 */ + 0x8ba0, 0x8ba6, 0xca61, 0x8bab, 0x8b9e, 0x8b9b, 0x8b91, 0x8b99, + 0x8cb6, 0x8cb8, 0x8c9a, 0x0e91, 0x8c98, 0x8c9b, 0x8cb3, 0x8ca2, + 0x54aa, 0x8ca0, 0x8c9f, 0x8e5b, 0x8e70, 0x8e54, 0x8e71, 0x8e65, + 0x8e51, 0x8e9d, 0x8e61, 0x8e5a, 0x8e74, 0x8e4c, 0x8e4b, 0x8e5e, + 0x8e58, 0x8e53, 0x8e52, 0x8f3b, 0x8f39, 0x8fd6, 0x8fe7, 0x8fd7, + 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fe0, 0x8fe4, 0x8fdd, + 0x8ff5, 0x8ff1, 0x9098, 0x909d, 0x9099, 0x9150, 0x9149, 0x27e4, + 0x9162, 0x91d7, 0x9201, 0x91f7, 0xca7d, 0x928c, 0x929c, 0x2888, + 0x931f, 0x931e, 0x943d, 0x943f, 0x9411, 0x9459, 0x943e, 0x9458, + 0x9500, 0x949e, 0x94b6, 0x94aa, 0x94af, 0x94ac, 0x1030, 0x94c0, + 0x94a9, 0x3e10, 0x95ee, 0x9677, 0x9679, 0x967a, 0x967d, 0x967f, + 0x9683, 0x9678, 0x967e, 0x96e4, 0x96e6, 0x96e5, + /* 0x61 */ + 0x105d, 0x974e, 0x9759, 0x1075, 0xca8e, 0x974f, 0x974a, 0x97e3, + 0x97de, 0x97e2, 0x9974, 0x99ac, 0x9961, 0x9962, 0x9976, 0x997a, + 0x9979, 0x9960, 0x9a64, 0x9b81, 0x9adf, 0x9a84, 0x9a8a, 0x9a92, + 0x9a79, 0x9ade, 0x9a98, 0x9a6c, 0x9ae1, 0xcaa5, 0x9a7c, 0x9a72, + 0x9a81, 0x9ae0, 0x9a65, 0x10ff, 0x9a6a, 0x9a97, 0x9aaa, 0x9ad3, + 0x9aab, 0x9a6e, 0x9aac, 0x9a76, 0x9a7b, 0x9aad, 0xcaa6, 0x9a94, + 0x9ad7, 0x9a70, 0x9ad5, 0x9af1, 0x9a7a, 0x9a68, 0x9a96, 0x110b, + 0x9a73, 0x9aae, 0x9add, 0x9ada, 0x9aaf, 0x9ab0, 0x9adb, 0x9a62, + 0x9af8, 0x9cc2, 0x9cc7, 0x9cc8, 0x9cc5, 0x9cc3, 0x9cc6, 0x9dde, + 0x11c8, 0x9e11, 0x9e15, 0x9e28, 0x9e21, 0x9e2d, 0x9e51, 0x9e2b, + 0x9e16, 0x9e24, 0x9e35, 0x9e1f, 0x9e12, 0x9e10, 0x9e80, 0x9e3b, + 0x9e29, 0x9e2a, 0x9e1b, 0x9e18, 0x9e20, 0x9e3f, + /* 0x62 */ + 0x9e1c, 0x9e26, 0x9e0b, 0x9fbe, 0x9fc4, 0x9fbd, 0x9ffa, 0x9ffb, + 0xa0b1, 0xa0b2, 0xa0b0, 0xa0b9, 0xa0a6, 0xa0bd, 0xa0b6, 0xa0b8, + 0xa0b4, 0xa0b3, 0xa0a7, 0xa0ae, 0xa0bc, 0xa1f2, 0xa1f3, 0xa1f4, + 0xa23b, 0xa240, 0xa246, 0xa2f0, 0xa2ee, 0xa2e8, 0xa2f1, 0xa2eb, + 0xa2ef, 0xa3fc, 0xa420, 0xa409, 0xa406, 0xa403, 0xcacf, 0xa419, + 0xa424, 0xa41b, 0xa41d, 0xa3fd, 0xa41e, 0xa3f4, 0xa401, 0xa408, + 0xa405, 0xa423, 0xa3ff, 0xa5ea, 0xa64d, 0xa64e, 0xa656, 0xa657, + 0xa651, 0xa655, 0xa654, 0xa6cb, 0xa6d4, 0xa6d1, 0xa6cf, 0xa6d2, + 0xa6ca, 0xa6d6, 0xa78b, 0xa788, 0xa785, 0xa789, 0x4c9b, 0xa7bb, + 0xa78c, 0x1374, 0xa799, 0xa78a, 0xa8ec, 0xa8ef, 0xa8f9, 0xa909, + 0xa8f8, 0xa8f3, 0xa900, 0xa91d, 0x13ac, 0xa8fd, 0xaa48, 0xaa5c, + 0xaa55, 0xaa5e, 0xaa49, 0xaa63, 0xaa60, 0xaa53, + /* 0x63 */ + 0xaa62, 0xaa40, 0xab49, 0xab4a, 0xab4c, 0xab4d, 0xac0a, 0xac06, + 0xac2f, 0xac21, 0xac07, 0xac09, 0xac02, 0xac16, 0xac03, 0xac0b, + 0xac0f, 0xae60, 0xae68, 0xae5e, 0xae5d, 0xae63, 0xae5f, 0xae64, + 0xae78, 0xae61, 0xae69, 0xae65, 0xafda, 0xafe6, 0xafdb, 0xafdc, + 0xb039, 0xb057, 0xb055, 0xb065, 0xb061, 0xb054, 0xb145, 0xb141, + 0xb13e, 0xb137, 0xb212, 0xb213, 0xb22c, 0xb296, 0xcae9, 0xb29c, + 0xb29d, 0xb285, 0xcae8, 0xb29f, 0xb2a3, 0xb382, 0xb383, 0xcaee, + 0xb41d, 0xb414, 0xb41f, 0xb420, 0xb547, 0xb580, 0xb5c9, 0xb5f9, + 0xb606, 0xb5f0, 0xb5f8, 0xb5ef, 0xb5fd, 0xb5f1, 0xb5fe, 0xb6b8, + 0xb6c0, 0xb6c3, 0xb6b5, 0xb6b6, 0xb6c9, 0xcaf3, 0xb6bd, 0xb6ba, + 0xb6bf, 0xb6b3, 0xb6c6, 0xb6b2, 0xb6bc, 0xb6b7, 0xb6b9, 0xb6c8, + 0xb7b5, 0xb7b3, 0x1616, 0xb7ac, 0xb7a9, 0xb7ad, + /* 0x64 */ + 0xb911, 0xb90d, 0xb916, 0xb989, 0xb97c, 0xb98b, 0xb97b, 0xb988, + 0xb984, 0xba9d, 0xba98, 0xbb88, 0xbb86, 0xbb82, 0xbb8b, 0xcaff, + 0xbb71, 0xbb72, 0xbb81, 0xbb8c, 0xbb80, 0xbb89, 0xbcbb, 0xbcc1, + 0xbcbe, 0xcb01, 0xbcbd, 0xbdc1, 0xbdb4, 0xbdb7, 0xbdc8, 0x173b, + 0xbdd3, 0xbdd0, 0xbdb0, 0xbdca, 0xbdcd, 0xbe15, 0xbe19, 0xbe17, + 0xbe3f, 0xbe40, 0xbe44, 0xbe7c, 0xbe78, 0xbe79, 0xbe88, 0xcb06, + 0xbe89, 0xbe7d, 0xbf23, 0xbf24, 0xbf26, 0xbf22, 0xbf27, 0xbf1f, + 0xbfc9, 0xbfc3, 0xc00a, 0xc00b, 0xc004, 0x17ef, 0xc003, 0xc001, + 0xc009, 0xc10f, 0xc12e, 0xc12d, 0xc191, 0xc199, 0xc19e, 0xc190, + 0xc194, 0xc19d, 0xc198, 0xc19b, 0xc19c, 0xc19a, 0xc254, 0xc39d, + 0xc39f, 0xc3a3, 0xc3a4, 0xc3a5, 0xc602, 0xc717, 0xc71b, 0xc719, + 0xc7d1, 0x4737, +}; + +static const ucs4_t cns11643_6_2uni_upages[204] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x05100, 0x05300, 0x05500, 0x05a00, 0x05b00, 0x05d00, 0x05e00, 0x06100, + 0x06500, 0x06800, 0x06e00, 0x07200, 0x07300, 0x07800, 0x07a00, 0x07f00, + 0x08000, 0x08100, 0x08200, 0x08800, 0x08900, 0x08a00, 0x08d00, 0x08f00, + 0x09200, 0x09700, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, + 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, + 0x20d00, 0x20e00, 0x20f00, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, + 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, + 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, + 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, + 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, 0x23500, + 0x23600, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, 0x23e00, + 0x23f00, 0x24100, 0x24200, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, + 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, + 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, + 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25e00, 0x25f00, 0x26000, 0x26200, + 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, + 0x26b00, 0x26c00, 0x26d00, 0x26e00, 0x27100, 0x27200, 0x27300, 0x27500, + 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, + 0x27e00, 0x27f00, 0x28000, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, + 0x28700, 0x28800, 0x28900, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, + 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29800, 0x29a00, + 0x29b00, 0x29c00, 0x29d00, 0x29f00, 0x2a000, 0x2a200, 0x2a300, 0x2a400, + 0x2a500, 0x2f800, 0x2f900, 0x2fa00, +}; + +static int +cns11643_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x64)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 6388) + swc = cns11643_6_2uni_page21[i], + wc = cns11643_6_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_7.h b/Externals/libiconv-1.14/lib/cns11643_7.h new file mode 100644 index 0000000000..44532bc4e1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_7.h @@ -0,0 +1,988 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 plane 7 + */ + +static const unsigned short cns11643_7_2uni_page21[6539] = { + /* 0x21 */ + 0x2b55, 0x2c82, 0x2c89, 0x2c87, 0x2dbe, 0x2dbd, 0x2dca, 0x2dd4, + 0x2dbc, 0x2dc4, 0x2dc1, 0x2dc2, 0x2dd7, 0x2d70, 0x2dba, 0x2de3, + 0x2dbb, 0x2eb1, 0x2eb6, 0x2eb0, 0x2f6c, 0x300d, 0x3007, 0x31f1, + 0x31f5, 0x31ed, 0x31ef, 0x31eb, 0x31ec, 0x31ee, 0x3207, 0x33c4, + 0x3408, 0x34b3, 0x34ad, 0x34b0, 0x3511, 0x2c8a, 0x3683, 0x367a, + 0x3682, 0x3668, 0x3671, 0x36b0, 0x36af, 0x01f6, 0x366c, 0x366f, + 0x3662, 0x3665, 0x3681, 0x367f, 0x3664, 0x3673, 0x366e, 0x3667, + 0x3674, 0x367d, 0x3678, 0x3685, 0x36aa, 0x3688, 0x36a6, 0xc34e, + 0x368a, 0x3684, 0x1a55, 0x3924, 0x3922, 0x3923, 0x3a32, 0x3a5b, + 0x3a4f, 0x0267, 0x3a26, 0x3a3e, 0x3a42, 0x3a47, 0x3a22, 0x309b, + 0x3a4a, 0x3a1f, 0x3a49, 0x3a2b, 0x3a33, 0xc358, 0x3a2a, 0x3a28, + 0x3b3d, 0x3b3c, 0x3bbf, 0x3c79, 0x3c80, 0x3c7c, + /* 0x22 */ + 0x3c7a, 0x3c78, 0x3d82, 0x3d5c, 0x3d5a, 0x3d4b, 0x3d7c, 0x3d7f, + 0x3d1f, 0x3d89, 0x3d8b, 0x3d57, 0x3d7e, 0x3d7d, 0x3d53, 0x3f9f, + 0x3fbc, 0x3fa5, 0x3f86, 0x3fdc, 0x3fa4, 0x3fb6, 0x3fa2, 0x3fb4, + 0x4048, 0x4046, 0x40a7, 0x4114, 0x4112, 0x4111, 0x41e1, 0x41d0, + 0x4226, 0x4228, 0x4229, 0x432f, 0x430d, 0x4325, 0x4314, 0x433c, + 0x430b, 0x4311, 0x4330, 0x4318, 0x4319, 0x4336, 0x4317, 0x4310, + 0x4315, 0x4403, 0x4429, 0x444c, 0x453f, 0x453e, 0x4534, 0x4542, + 0x4535, 0x31f3, 0x45cd, 0x45d1, 0x45d2, 0x46ad, 0x46ba, 0x46c1, + 0x46bb, 0x46b4, 0x46bc, 0x476c, 0x4792, 0x4821, 0x4824, 0x5f19, + 0x48ad, 0x48ae, 0x48ab, 0x48ac, 0x4970, 0x4976, 0x4971, 0x4977, + 0x1c7f, 0x4aec, 0x4b1c, 0x4afb, 0x4aee, 0x4be2, 0x4afd, 0x4b1e, + 0x4b3b, 0x4b4a, 0xc3ae, 0x0592, 0x4b7d, 0x4b56, + /* 0x23 */ + 0x4b44, 0x4b4b, 0x4cfa, 0x4ce8, 0x4cf8, 0x4cff, 0x4cf7, 0x4cf6, + 0x4cfe, 0x4d07, 0x4d5d, 0x4ed4, 0xc3c3, 0x4ec8, 0x4ec5, 0xc3c0, + 0x4ec9, 0x4f4d, 0x4f20, 0x4f36, 0x4f35, 0x4f88, 0x4f25, 0x4f21, + 0x4f26, 0x0645, 0x4f3f, 0x4f3b, 0x4f24, 0x4f43, 0x4f4e, 0x4f4f, + 0x4f44, 0x4f40, 0x4f41, 0x4f39, 0x4f2b, 0x50dd, 0x50de, 0x51cd, + 0x51cb, 0x51db, 0x51d8, 0x51d9, 0x51d2, 0x51ca, 0x51d1, 0x51d4, + 0x51f9, 0x51d0, 0x525e, 0x525d, 0x528a, 0x5314, 0x5483, 0x5484, + 0x549b, 0x5482, 0x547d, 0x547c, 0x5499, 0x547e, 0x549a, 0x5495, + 0x547b, 0x5486, 0x5548, 0x5592, 0x56b2, 0x5742, 0x5772, 0x5715, + 0x5730, 0x5743, 0x575b, 0x571d, 0x5773, 0x572d, 0x07c9, 0x5721, + 0x571c, 0xc3ea, 0x5729, 0x571e, 0x5733, 0x5a10, 0x5a0e, 0xc3f1, + 0x5a0d, 0x5a11, 0x5a12, 0x5a17, 0x5a09, 0x5a0f, + /* 0x24 */ + 0x5a98, 0x5a94, 0x5a96, 0x5a99, 0x5a95, 0x5a97, 0x5b50, 0x5b52, + 0x5b4d, 0x5b57, 0x5b53, 0x5b56, 0x5bb8, 0x5c12, 0x5cf1, 0x5cf0, + 0x5cee, 0x5cef, 0x5ce5, 0x5ceb, 0x5ce7, 0x5cf2, 0x5ce6, 0x5cf7, + 0x5d09, 0x5d6b, 0x5d6a, 0x5e79, 0x5ecd, 0x5eef, 0x5ee4, 0x5ee3, + 0x5f6c, 0x5f67, 0x5f62, 0x5f58, 0x5f69, 0x5fab, 0x5f57, 0x5fad, + 0x5f54, 0x5fae, 0x5f76, 0x5f49, 0x5f45, 0x5f4f, 0xc40f, 0x5f50, + 0x5f7d, 0x5f44, 0x5f66, 0x5f48, 0x5fa3, 0x5f51, 0x5f53, 0xc410, + 0x5f60, 0x5f47, 0x5f5e, 0x5f85, 0x5fac, 0x5f6d, 0x5f75, 0x5fa8, + 0x0955, 0x5f43, 0x5f4e, 0x5f5c, 0x5f56, 0x5f6e, 0x5f63, 0x5f6a, + 0x6256, 0x6212, 0x625c, 0x6258, 0x6255, 0x627e, 0x62a8, 0x6211, + 0x6259, 0x625a, 0x6267, 0x6254, 0x625b, 0x62f0, 0x6429, 0x642c, + 0x642a, 0x6427, 0x6467, 0x6468, 0x6493, 0x6495, + /* 0x25 */ + 0x649a, 0x64ee, 0x64f1, 0x64ed, 0x64e9, 0x65cb, 0x65df, 0x65db, + 0x673c, 0x674e, 0x676c, 0x677b, 0x677c, 0x6783, 0x676b, 0x6766, + 0x6763, 0x67a0, 0x6785, 0x6768, 0x67a2, 0x68ec, 0x0ae8, 0x68e7, + 0x6910, 0x6918, 0x693a, 0x691a, 0x6938, 0x6941, 0x691b, 0x6914, + 0x691c, 0x691d, 0x6a12, 0x6a0d, 0x6a07, 0x6a7e, 0x6a7f, 0x34b9, + 0x6a80, 0x6a7a, 0x6af3, 0x6bb9, 0x6bbb, 0x6bba, 0x6bbd, 0x6bb7, + 0x6bbf, 0x6c21, 0x6d3a, 0x6d3d, 0x6d36, 0x6d49, 0x6d81, 0x0bb6, + 0x6d3f, 0x6d4d, 0x6d3e, 0x0bbd, 0x6d30, 0x6d4f, 0x6e37, 0x6e98, + 0x6e99, 0x6f11, 0x6f0d, 0x6f88, 0x6f8a, 0x701c, 0x7055, 0x7056, + 0x7062, 0x7057, 0x7042, 0x7010, 0x704d, 0x705a, 0x7066, 0x7046, + 0x4b7e, 0x704f, 0x80f9, 0x7187, 0x7184, 0x71f4, 0x71f5, 0x71f2, + 0x71f7, 0x7345, 0xc450, 0x7349, 0x7335, 0x72fd, + /* 0x26 */ + 0x7330, 0x7343, 0x7346, 0x0cd6, 0x7333, 0x74c6, 0xc456, 0x74d4, + 0x8dd8, 0x74e0, 0x36a7, 0x7544, 0x2d98, 0x7654, 0x763e, 0x7635, + 0x763a, 0x0d71, 0x7634, 0x7639, 0x7646, 0x765a, 0x765b, 0x763c, + 0x77dc, 0x77d6, 0x77d0, 0xc45e, 0x78ac, 0xc45d, 0x78a5, 0x79f4, + 0x7a24, 0x79e0, 0x79fd, 0x79f2, 0x79fc, 0x7a02, 0x79f1, 0x79ff, + 0x79d2, 0x79d8, 0x79d3, 0x79f9, 0xc463, 0x79ed, 0x79f7, 0x79f0, + 0x79d7, 0x7a09, 0x79f5, 0x7cc2, 0x7cc5, 0x7ccf, 0x0e98, 0x7cc1, + 0x7cc6, 0x7cd4, 0x7cce, 0x7e9b, 0x7e99, 0x7e8f, 0x7eb7, 0x7e82, + 0x7e93, 0x7eb4, 0x7ec1, 0x7e90, 0x7e9a, 0x7e94, 0x7e9c, 0x7eb5, + 0xc46f, 0xc46e, 0x7e9f, 0x7e8e, 0x7e9e, 0x803c, 0x8047, 0x8041, + 0x80eb, 0x80ec, 0x80ed, 0x80ee, 0x80df, 0x80f2, 0x810d, 0x810e, + 0x2c86, 0x81a9, 0x81a4, 0x81a5, 0x825f, 0x825a, + /* 0x27 */ + 0x8266, 0x8268, 0x826a, 0x8264, 0x8265, 0x82c1, 0x82d8, 0xc47b, + 0x82d9, 0x8309, 0x83aa, 0x83a3, 0x83b9, 0x77e2, 0x83a5, 0x83ab, + 0x8420, 0x8589, 0x858b, 0x85db, 0x85e4, 0x85ef, 0x85e2, 0x85e9, + 0x85f0, 0x85f3, 0x85dd, 0x861e, 0x871d, 0x8746, 0x877c, 0x8780, + 0x8781, 0x8782, 0x8787, 0x8788, 0x878a, 0x878c, 0x87e7, 0x87eb, + 0x87ea, 0x8868, 0x886b, 0x8869, 0x8866, 0x886a, 0x8865, 0x88e5, + 0x88e4, 0x88e6, 0x8918, 0x8a24, 0x8a48, 0x8a2f, 0x8a7e, 0x8989, + 0x8a1e, 0x8a49, 0x8a26, 0x8a09, 0x8a34, 0x8a2d, 0x8a4a, 0x8a15, + 0xc4a9, 0x8a33, 0x8a28, 0x8a27, 0x8a20, 0x8a2b, 0x8a29, 0x8a6a, + 0x8a0b, 0x8a0e, 0x8a1c, 0x89ff, 0xc4aa, 0x8a35, 0x8a11, 0x8a4b, + 0x8a4c, 0x8a1f, 0x8a0f, 0x8a39, 0x8a68, 0x8a1d, 0x8a08, 0x8a0c, + 0x8a0d, 0x8a62, 0x8aaf, 0x8a32, 0x8a2c, 0x8a64, + /* 0x28 */ + 0x8a04, 0x8a16, 0x8a4d, 0x8a07, 0x8aae, 0x8dd4, 0x8dd1, 0x8dd5, + 0x8dd0, 0x8f71, 0x8f5d, 0x8f5b, 0x8f7a, 0xc4bd, 0x8f7f, 0x8f79, + 0x8f67, 0x8f9e, 0x8f94, 0x8f64, 0x8f5e, 0x8f81, 0x8f5a, 0x8f57, + 0x8f7c, 0x8f98, 0x8f66, 0x8f7e, 0x8f82, 0x8f68, 0x8f5f, 0x8f63, + 0x8f97, 0x11cd, 0x8f53, 0x8f7b, 0x8f7d, 0x8f78, 0x9006, 0x91c0, + 0x91c2, 0x91c3, 0x92dc, 0x92e6, 0x92ec, 0x92f2, 0x92e8, 0x92eb, + 0x92ea, 0x92e5, 0x92e0, 0x92d0, 0x92d8, 0x92d5, 0x92d3, 0x92e4, + 0x92f3, 0x92db, 0x932f, 0x93f9, 0x945d, 0x945b, 0x944c, 0x9458, + 0x9460, 0x9453, 0x9450, 0x9507, 0x9508, 0x94f4, 0x94f6, 0x9504, + 0x94fd, 0x9505, 0x9628, 0x9656, 0x9642, 0x965c, 0x963d, 0x962f, + 0x962b, 0x9658, 0x9661, 0x962c, 0x9651, 0x9650, 0x963c, 0x9636, + 0x12f6, 0x9660, 0x965b, 0x962e, 0x9640, 0x965f, + /* 0x29 */ + 0x9626, 0x962d, 0x965e, 0x963b, 0x97ef, 0x97f3, 0x97ee, 0x97ed, + 0x985a, 0x9862, 0x985b, 0x985f, 0x985e, 0x9864, 0x98e0, 0x98e1, + 0x98e5, 0x99a5, 0x999b, 0x999f, 0x999c, 0x137a, 0x99aa, 0x99a4, + 0x99a3, 0x9a67, 0x9b26, 0x9b1a, 0x13b8, 0x9b1c, 0x9b15, 0x9b1b, + 0x9b18, 0x9b1e, 0x9b25, 0xc4dc, 0x9c7b, 0x9c75, 0x9c93, 0x9c8f, + 0x9c7c, 0x9c9b, 0x9c88, 0x9c91, 0x9c7e, 0x1401, 0x9c86, 0x9e5b, + 0x9e54, 0x9f35, 0x9f40, 0x9f37, 0x9f29, 0x9f26, 0x9f23, 0x9f30, + 0x9f20, 0x9f28, 0x9f32, 0x9f2a, 0x9f31, 0x9f24, 0x9f41, 0x9f42, + 0x9f43, 0x9f25, 0x9f38, 0xa01c, 0xa01d, 0xa01e, 0xa0f6, 0xa1a5, + 0xa189, 0xa19d, 0xa18a, 0xa187, 0xa1ab, 0xa186, 0xa19e, 0xa193, + 0xa1a1, 0xa188, 0xa1a3, 0xa19f, 0xa1a0, 0xa2ff, 0xa300, 0xa302, + 0xa2f8, 0xa2f7, 0xa301, 0xa387, 0xa389, 0xa376, + /* 0x2a */ + 0xa36e, 0xa377, 0xa382, 0xa385, 0xa383, 0xa384, 0xa457, 0xa44b, + 0xa456, 0xa45d, 0xa460, 0xa44d, 0xa455, 0xa454, 0xa453, 0xa450, + 0xa463, 0xa462, 0xa517, 0xa516, 0xa52d, 0xa5d9, 0xa5bf, 0x152f, + 0xa5b2, 0xa5ac, 0xa5b0, 0xa5cf, 0xa5b8, 0x1531, 0xa5d3, 0xa5b1, + 0xa5af, 0xa5ce, 0xa5b4, 0xa5b7, 0xa5d5, 0x159c, 0xa938, 0xa928, + 0xa93f, 0xa940, 0xa941, 0xa933, 0xa92b, 0xa92e, 0xab11, 0xab18, + 0xab17, 0xab19, 0xab16, 0x15e6, 0xab0d, 0xab26, 0xab79, 0xabd8, + 0xabf3, 0xabd7, 0xabcc, 0xabcf, 0xabcb, 0xabd1, 0xabce, 0xabd4, + 0xabd5, 0xabd3, 0xabd6, 0xabcd, 0xabda, 0xabd2, 0xabde, 0xaccc, + 0xacb8, 0xacb7, 0xacc2, 0xacc3, 0xadfa, 0xadf9, 0xae1f, 0xae1d, + 0x6282, 0xaea6, 0xae90, 0xae9e, 0xae98, 0xae93, 0xae92, 0xaea5, + 0xae95, 0xafa9, 0xafa8, 0xafaa, 0xafab, 0xafac, + /* 0x2b */ + 0xb01f, 0xb022, 0xb0aa, 0xb096, 0xb091, 0xb0ab, 0xb0a2, 0xb0a4, + 0xb09d, 0xb097, 0xb07d, 0xb09f, 0xb09c, 0xb099, 0xb0a6, 0xb092, + 0xb0a7, 0xb1c9, 0xb1c8, 0xb1c7, 0xb1cb, 0xb274, 0xb2c9, 0x1738, + 0xb2d2, 0xb2db, 0xb2eb, 0xb2e9, 0xb2ef, 0xb2ee, 0xb2f9, 0xb2de, + 0xb416, 0xb445, 0xb47f, 0xb498, 0xb49f, 0xb486, 0xb490, 0xb49a, + 0xb49d, 0xb48d, 0xb49c, 0xb4a0, 0xb4a7, 0xb48f, 0xb641, 0xb635, + 0xb637, 0xb630, 0xb63a, 0xb636, 0xc508, 0xb6ca, 0xb712, 0xb715, + 0xb722, 0xb713, 0xb718, 0xb721, 0xb810, 0xb820, 0xb82f, 0xb8a5, + 0xb8a3, 0xb8b6, 0xb8ab, 0xb968, 0xb967, 0xb96f, 0xb977, 0xb964, + 0xb978, 0x183a, 0xb976, 0xb96e, 0x18b1, 0xbbd0, 0xbbb3, 0xbbcb, + 0xbbd6, 0xbbb1, 0xbbb4, 0xbbd7, 0xbbc6, 0xbbba, 0xbbd1, 0xbbd2, + 0xbbb5, 0xbbc4, 0xbbcc, 0xbbbb, 0xbbb2, 0xbe5b, + /* 0x2c */ + 0xbe5a, 0xbe59, 0xbe99, 0xbe94, 0xbe96, 0xbe93, 0xbe91, 0xbe8f, + 0xbe98, 0xbf0c, 0xbf0a, 0xbf0e, 0xbf12, 0xbf11, 0xbf0b, 0xbf9a, + 0x1947, 0xbfb4, 0x1951, 0xc01c, 0xc020, 0xc021, 0xc0d3, 0xc0d2, + 0xc138, 0x2afd, 0x6bcf, 0x2c1d, 0x2c92, 0x2c8f, 0x2c8c, 0x2dea, + 0x2eb9, 0x2f6e, 0x2fa0, 0xaddd, 0x3012, 0x3017, 0x306d, 0x3205, + 0x31fb, 0x31fd, 0x3206, 0x3200, 0x31ff, 0x31fe, 0x32b6, 0x3305, + 0x3307, 0x34bc, 0x34bb, 0x358b, 0x3587, 0x97fb, 0x36e7, 0x36e6, + 0x36e2, 0xa1d3, 0x36d9, 0x36ca, 0x3712, 0x3710, 0x36dc, 0x36d0, + 0x368b, 0x3713, 0x4d10, 0x36da, 0xc34f, 0x36fd, 0x36e5, 0x36cc, + 0x3739, 0x36c7, 0x36d8, 0x3a60, 0x3a64, 0x3a86, 0x3a5e, 0x3a66, + 0x3a5f, 0x3a77, 0x3a82, 0x3a96, 0x3b3e, 0x3b79, 0x3b7a, 0x3c88, + 0x3c89, 0x3c8c, 0x62e0, 0x3c7b, 0x3c86, 0x3d94, + /* 0x2d */ + 0x3d97, 0x3db7, 0x3db5, 0x3db8, 0x3d93, 0x3db2, 0x3db4, 0x3d99, + 0x3dc3, 0x3d9d, 0x3d9b, 0x3da3, 0x0347, 0x3e9f, 0x3e9e, 0x3ea3, + 0x3ea0, 0x3ea1, 0x3fc5, 0x3fc6, 0x3fbe, 0x3fc4, 0x3fbf, 0x404c, + 0x404a, 0x40b1, 0x4115, 0x4117, 0x4110, 0x4118, 0x41e0, 0x41df, + 0x4227, 0x4343, 0x4348, 0x431d, 0x4350, 0x4358, 0x4347, 0x4354, + 0x4353, 0x4340, 0x4355, 0x0417, 0x435a, 0x4870, 0x455b, 0x454d, + 0x4556, 0x454f, 0xc387, 0x4559, 0xc388, 0x4554, 0x4553, 0x4550, + 0x46b3, 0x476e, 0x04a3, 0x476f, 0x4793, 0x4829, 0x4825, 0x4828, + 0x486f, 0x54b8, 0xc397, 0x48b3, 0x4979, 0x497e, 0x497c, 0x4983, + 0xc3ac, 0x4b00, 0x4b34, 0x4b65, 0x4b36, 0x4ba7, 0x4b59, 0x4b58, + 0x4b31, 0x4b62, 0x4b38, 0x4b73, 0x4b3e, 0x4b55, 0x4b54, 0x4b95, + 0xc3ad, 0x4ba5, 0x4b94, 0x4b9a, 0x4b9b, 0x4b99, + /* 0x2e */ + 0x4b9f, 0x4b53, 0x4d12, 0x4d0a, 0x4d09, 0x4d0c, 0x4d0b, 0x4d0e, + 0x4d0d, 0x4d08, 0x4f38, 0x4f3a, 0x4f37, 0x4f3d, 0x4f2d, 0x4f82, + 0x4f95, 0x4f87, 0x4f9d, 0x4fb5, 0x4f81, 0x4fc7, 0x4f9b, 0x4f98, + 0x4f94, 0x4f86, 0x4f90, 0x4f34, 0x4f8e, 0x4f85, 0x4fa6, 0x4f96, + 0x51ea, 0x51df, 0x54bd, 0x51f7, 0x51eb, 0x51e0, 0x51e8, 0x51e1, + 0x51e9, 0x51ee, 0x51e5, 0x51ec, 0x5263, 0x52c6, 0x52c2, 0x52c1, + 0x52c0, 0x52c3, 0x5318, 0x54ae, 0x54a3, 0x54c5, 0x54a0, 0x54b4, + 0x54a5, 0x071e, 0x54a4, 0x54a8, 0x54a6, 0x57a8, 0x578d, 0x5782, + 0x579e, 0x5789, 0x5783, 0x5791, 0x57a6, 0x579a, 0x5790, 0x5785, + 0x577d, 0xc3ec, 0x579b, 0x57a5, 0x57f0, 0x5796, 0x5788, 0x57d6, + 0x57d8, 0x5786, 0x57a4, 0x5797, 0x5a1c, 0x5a19, 0x5a9e, 0x5a9f, + 0x5a9d, 0x5a9c, 0x5b5d, 0x5b5e, 0x5b73, 0x5b63, + /* 0x2f */ + 0x5bbe, 0x5bc1, 0x5bbc, 0x5bbf, 0x5bbb, 0x5bbd, 0x5c13, 0x5c14, + 0x5cf8, 0x5cfa, 0x5d06, 0x5cfe, 0x5d51, 0x600b, 0x5ff1, 0x5fa9, + 0x5fd5, 0x5fdc, 0x5fcb, 0x5ff2, 0x605f, 0x5fdb, 0x5fd6, 0x5fd9, + 0x5fd1, 0x5fcf, 0x5fd8, 0x5fe0, 0x5fd4, 0x5ff3, 0x6005, 0x5fce, + 0x5ff4, 0xc412, 0x5fda, 0x600e, 0x6006, 0x5fd7, 0x5fcd, 0x6007, + 0x5fe1, 0x6008, 0x62be, 0x62ef, 0x62d9, 0x62da, 0x1fd7, 0x62a0, + 0x62df, 0x629e, 0x62bf, 0x62af, 0x62a7, 0x62aa, 0x62f4, 0x62ae, + 0x62b5, 0x62b8, 0x62db, 0x62c0, 0x62b7, 0x62a2, 0x62dd, 0x62a1, + 0x62a5, 0x62b4, 0x62a6, 0x62ab, 0x62ac, 0x629f, 0x62b1, 0x62fc, + 0x642e, 0x6430, 0x6499, 0x64f8, 0x64f6, 0x65f4, 0x65eb, 0x65e1, + 0x65e4, 0x6775, 0x6769, 0x0a9a, 0x6799, 0x679e, 0x6794, 0x6793, + 0x6791, 0x6919, 0x6917, 0x6949, 0x6947, 0x6948, + /* 0x30 */ + 0x6952, 0x6940, 0x6963, 0x6946, 0x695f, 0x6a0e, 0x6a85, 0x6a87, + 0x6acb, 0x6acc, 0x6ac9, 0x6bcb, 0x41e7, 0x6c20, 0x6d5f, 0x6d60, + 0x6d6a, 0x6d76, 0x6d73, 0x6d71, 0x6d66, 0x0bc2, 0x6d6b, 0x6d79, + 0x6d7b, 0x6e3c, 0x6e9e, 0x6e9c, 0x6f1c, 0x6f1e, 0x6f21, 0x6f96, + 0x6fa1, 0x6fb6, 0x6fa0, 0x6f94, 0x6f97, 0x7081, 0x7086, 0x70c0, + 0x708a, 0xc44b, 0x7085, 0x7095, 0x7049, 0x7082, 0x7084, 0x4b78, + 0x7090, 0x70b1, 0x71fe, 0x71fb, 0x7350, 0x7356, 0x735a, 0x734c, + 0x0cdc, 0x7357, 0x74e1, 0x74d9, 0x74db, 0x74f4, 0x7545, 0x7547, + 0x7674, 0x766b, 0x7668, 0x7669, 0x7679, 0xc45b, 0x7680, 0x7681, + 0x7661, 0x7670, 0x766f, 0x7673, 0x765d, 0x77fa, 0x0db3, 0x77f3, + 0x780a, 0x7817, 0xc45f, 0x78b0, 0x7a3e, 0x7a46, 0x7a4f, 0x7a44, + 0x7a69, 0x7a33, 0x7a2f, 0x7a4e, 0x7a3a, 0x7a2b, + /* 0x31 */ + 0x7aa9, 0x7a50, 0x7a45, 0x7a37, 0x7a25, 0x7a2c, 0x7a3f, 0x7a34, + 0x7a29, 0x7a1e, 0x7a3d, 0x7ced, 0xc466, 0x7cf3, 0x7cea, 0x7ceb, + 0x7ecc, 0x7ece, 0x7ed0, 0x7ee3, 0x7ee0, 0x7ed1, 0x7edc, 0x7edd, + 0x7ef0, 0x7edb, 0x7ee5, 0x7ef1, 0x7ec9, 0x7ee8, 0x7ee7, 0x7ec8, + 0x7ede, 0x7ecd, 0x7ec5, 0x7ec6, 0x7ee4, 0x7ec3, 0x80fb, 0x80fc, + 0x80fe, 0x8103, 0x8100, 0x80fd, 0x8105, 0x8113, 0x81a7, 0x81b4, + 0x8270, 0x8274, 0x8271, 0x8275, 0x827d, 0x8273, 0x82c4, 0x82c3, + 0x82de, 0x82dd, 0x8311, 0x830f, 0x8310, 0x83c3, 0x83c2, 0x83ca, + 0x83c1, 0x8423, 0x85b1, 0x8624, 0x8611, 0x8625, 0x860a, 0x861f, + 0x8620, 0x8614, 0x8628, 0x8603, 0x8612, 0x860b, 0x8617, 0x4d11, + 0x8749, 0x8789, 0x8790, 0x878f, 0x8796, 0x8795, 0x8793, 0x87ed, + 0x87f0, 0x62de, 0x8885, 0x8877, 0x887a, 0x8884, + /* 0x32 */ + 0x8879, 0x887d, 0x887b, 0x88ed, 0x88ec, 0x89f6, 0x899b, 0x8a9d, + 0x8b11, 0x8ac4, 0x8ac8, 0x8adf, 0x8abf, 0x8ab3, 0x8aba, 0x8b10, + 0x8b06, 0x8a88, 0x8a9a, 0x8ae0, 0x8acc, 0x8ab5, 0x8ae1, 0x8abc, + 0x8ac6, 0x8b0b, 0x8aa4, 0x8a95, 0x8aa3, 0x8ae2, 0x8acd, 0x8ae3, + 0x8aab, 0x8acb, 0x8a8f, 0xc4ab, 0x8aa9, 0x8b24, 0x8ae4, 0x8b12, + 0x8ae5, 0x8b67, 0x8aaa, 0x8aa0, 0x8ae6, 0x8ac1, 0x8ae7, 0x8b0d, + 0x8a86, 0x8ab0, 0x8a8b, 0x8ae8, 0x8ac9, 0x8b19, 0x8ac0, 0x8b0c, + 0x8ae9, 0x8aea, 0x8ded, 0x8de3, 0x8de4, 0x8de8, 0x8dd2, 0x8de2, + 0x2466, 0x8fcf, 0x8fd1, 0x8fc3, 0x8fc9, 0x8fea, 0x8fb4, 0x8fdc, + 0x8fbd, 0x8fe6, 0x8fc8, 0x8fec, 0x8fb2, 0x8fa9, 0x8fd3, 0x8fc0, + 0x8fe9, 0x8fd5, 0x11d9, 0x8fc5, 0x11dd, 0x8fcb, 0x8fd0, 0x8fd2, + 0x8fe4, 0x8fe8, 0x8fcd, 0x8fb6, 0x8faa, 0x8fd4, + /* 0x33 */ + 0xa049, 0x8fc1, 0x8fdd, 0x8fce, 0x91c9, 0x91ca, 0x92fd, 0x92d9, + 0x92ff, 0x9304, 0x92fa, 0x9306, 0x9315, 0x9311, 0x9307, 0x930b, + 0x93fc, 0x93fd, 0x946d, 0x9465, 0x9514, 0x9513, 0x950c, 0x950b, + 0x9518, 0x9522, 0x967d, 0x966f, 0x9675, 0x967b, 0x9680, 0x967f, + 0x9696, 0x966d, 0x966b, 0x9686, 0x9673, 0x9662, 0x9677, 0x9681, + 0x9669, 0x9682, 0x9697, 0x9684, 0x12fc, 0x9678, 0xc4d0, 0x967a, + 0x966a, 0x9665, 0x967e, 0x9694, 0x97c2, 0x97c1, 0x97f9, 0x9871, + 0x986b, 0x986d, 0x986f, 0x986e, 0x98f2, 0x98e8, 0x98ef, 0x98e9, + 0x98ea, 0x98ed, 0x98f3, 0x98e6, 0x99c9, 0x99b4, 0x99b3, 0x99b9, + 0x99ca, 0x99b1, 0x99b6, 0x99c7, 0x99c4, 0x99b7, 0x9a6f, 0x9b33, + 0x9b32, 0x9b1f, 0xc4d9, 0x9b2b, 0x9b30, 0x9b36, 0x9b42, 0x9b41, + 0xc4d8, 0x9ca5, 0x9cab, 0x9ca9, 0x9cb3, 0x9ca7, + /* 0x34 */ + 0x9ca0, 0x9cd2, 0x9ca8, 0x9cb6, 0x9cac, 0x9cae, 0x9ce6, 0x9e65, + 0x9f47, 0x9f63, 0x9f4d, 0x9f5f, 0x9f4b, 0x9f60, 0x9f49, 0x9f53, + 0xc4df, 0x263a, 0x9f57, 0x9f4e, 0x9f52, 0x9f54, 0xa020, 0xa022, + 0xa1c1, 0xa1d7, 0xa1d5, 0xa1c4, 0xa1d0, 0xa1bb, 0xa1e2, 0xa1cb, + 0xa1b8, 0xa1bf, 0xa1d8, 0xa1c0, 0xa1ba, 0xa1b4, 0xa1bc, 0xa1d4, + 0xa1ed, 0xa1c2, 0xa1d9, 0xa1cc, 0xa32f, 0xa323, 0xa396, 0xa38d, + 0xa39e, 0xa399, 0xa483, 0x1507, 0xa46a, 0xa469, 0xa475, 0xa46c, + 0xa480, 0xa46e, 0xa481, 0xa477, 0xa476, 0xa473, 0xa470, 0xa484, + 0xa519, 0xa5f2, 0x273d, 0xa5ec, 0xa5eb, 0xa5f6, 0xa5ef, 0xa5f4, + 0xa5ee, 0xa5f3, 0xa5ed, 0xa89b, 0xa898, 0xa894, 0x3a7a, 0xa89a, + 0xc4f0, 0xa94c, 0x15a8, 0xa957, 0xa951, 0xa962, 0xa952, 0xa95c, + 0xa953, 0xc4ef, 0xaa85, 0xab2d, 0xab3e, 0xab30, + /* 0x35 */ + 0xab7d, 0xabe6, 0xabf6, 0xabe4, 0xabe9, 0xabec, 0xabf2, 0xabe8, + 0xabe3, 0xabeb, 0xabf0, 0xabea, 0xabe7, 0xabfd, 0xabe5, 0xabee, + 0xabf5, 0xabf9, 0xabf1, 0xabf4, 0xc4f4, 0xac11, 0xacde, 0xacd8, + 0xacdd, 0xacdb, 0xacd3, 0xace1, 0xadde, 0xadfc, 0xae28, 0xaeb7, + 0xaeb8, 0xaec7, 0xaeb2, 0xaea9, 0xaeb9, 0xaebc, 0xaeb3, 0xaed1, + 0xafb0, 0xafb1, 0xafb6, 0xb004, 0xb02c, 0xb0c1, 0xb09e, 0xb0ba, + 0x16ca, 0xb0d1, 0xb0d3, 0xb0d4, 0xb0d5, 0xb0c5, 0xb0b6, 0xb0b2, + 0xb0b5, 0xb0c3, 0xb0b9, 0xb0c6, 0xb1d6, 0xb1e0, 0xb1db, 0xb1d7, + 0xb1dd, 0xb315, 0xb30c, 0xb30f, 0xb30e, 0xb2fe, 0xb304, 0xb30b, + 0xb302, 0xb2ff, 0xb308, 0xb310, 0xb317, 0xb313, 0xb306, 0xb309, + 0xb424, 0xb426, 0xb425, 0xb448, 0xb4b5, 0xb4d2, 0xb4d5, 0xb4c4, + 0xb4af, 0xb4ad, 0xb4c1, 0xb4c0, 0xb4cc, 0xb4cd, + /* 0x36 */ + 0xb4c3, 0xb4c8, 0xb4c5, 0xb4ba, 0xb4d0, 0xb4c2, 0xb4ce, 0x178d, + 0xb643, 0xb642, 0xb640, 0xb631, 0xb6cf, 0xb6ce, 0xb730, 0xb734, + 0xb732, 0xb743, 0xb73c, 0xb811, 0xb835, 0xb834, 0xb837, 0xb831, + 0xb8bf, 0xb8bc, 0xb8c2, 0xb8c9, 0xb983, 0xb98b, 0xb9a0, 0xb98d, + 0xb98c, 0xb99a, 0xb98a, 0xb991, 0xbbf1, 0xbc0f, 0xbc01, 0xbc07, + 0xbc0c, 0x18c0, 0xbbdc, 0xbbee, 0xbbf7, 0xbbf2, 0xbbf8, 0xbbeb, + 0x18ca, 0xbbe6, 0xbbed, 0xbbe9, 0xbc08, 0xbc00, 0xbbe5, 0xbbfc, + 0xbe61, 0xbe5e, 0xbe5f, 0x1925, 0xbe9b, 0xbf16, 0xbf15, 0xbf20, + 0xbf14, 0xbf1a, 0xbf17, 0xbf9c, 0x194a, 0xbff1, 0x1953, 0xbff0, + 0xc028, 0xc024, 0xc02a, 0xc02b, 0xc0d5, 0xc104, 0xc105, 0xc191, + 0xc192, 0xc2a6, 0x2c09, 0x2e22, 0x2e1a, 0x2e0e, 0x2e1b, 0x2e08, + 0x6fb3, 0xc31c, 0x309d, 0x3212, 0x321e, 0x32bb, + /* 0x37 */ + 0x32bf, 0x32bc, 0x3308, 0x3309, 0x3363, 0x33c8, 0x5828, 0x358e, + 0x358d, 0x3743, 0x374d, 0x376d, 0x3742, 0x3752, 0x3751, 0x3769, + 0x3750, 0x3756, 0x376c, 0x3744, 0x3745, 0x376b, 0x0205, 0x3768, + 0x3757, 0x392e, 0x3931, 0x392d, 0x3a8b, 0x3ab2, 0x3a8d, 0x3aa3, + 0x3aa4, 0x3a90, 0x3a89, 0x3a8e, 0x3a92, 0x3b7b, 0x3c90, 0x3c8f, + 0x3de9, 0x3dcd, 0x3dc5, 0x3dd0, 0x3dc9, 0x3dd1, 0x3dc7, 0x3dd2, + 0x3d5f, 0x3de1, 0x3dcc, 0x3dc6, 0x3de4, 0x3ea9, 0x3fd3, 0x3fda, + 0x3fd2, 0x3fdb, 0x404d, 0x404e, 0x411c, 0x41e8, 0x436c, 0x435f, + 0x4366, 0x4364, 0x4378, 0x4365, 0x436d, 0x4361, 0x437a, 0x4407, + 0x4566, 0x4568, 0x4562, 0x46d3, 0x46d4, 0x46d1, 0x46dc, 0x4773, + 0x4772, 0x482d, 0x482c, 0x482f, 0x4872, 0x48b4, 0x4989, 0x4bcd, + 0x4ba6, 0x4ba2, 0x4ba0, 0x4b46, 0x4ba1, 0x8657, + /* 0x38 */ + 0x4ba3, 0x4bb1, 0x4bdb, 0x4bf6, 0x4bdc, 0x4bd6, 0x4d13, 0x4f9c, + 0x4f97, 0x4fd8, 0x4fe4, 0x4fd4, 0x4fe5, 0x4fdb, 0x4fd0, 0x4fda, + 0x4fcc, 0x4fdc, 0x4fed, 0x4fd3, 0x4fd1, 0x4fce, 0x4fd9, 0x4fdd, + 0xc3c6, 0x50e6, 0x50e5, 0x50e9, 0x51ff, 0x51fe, 0x520e, 0x528c, + 0x52ca, 0x52cb, 0x531a, 0x54d7, 0x54cf, 0x54d0, 0x54c9, 0x54cc, + 0x54d3, 0x55a4, 0x55a3, 0x5781, 0x5826, 0x57f3, 0x5827, 0x57f2, + 0x57ff, 0x57f5, 0x57fc, 0x580e, 0x07f0, 0x57f6, 0x5800, 0x5823, + 0x5805, 0x5825, 0x5808, 0x5850, 0x5a25, 0x5a20, 0x5a23, 0x5a21, + 0x5aa1, 0x5b69, 0x5b6c, 0x5b68, 0x5b6b, 0x5bcc, 0x5bcd, 0x5d10, + 0x5d0d, 0x5d0a, 0x5d16, 0x5d14, 0x5d52, 0x6028, 0x602e, 0x602c, + 0x604d, 0x6049, 0x6031, 0x6030, 0x6033, 0x602d, 0x6036, 0x603e, + 0x602f, 0x6027, 0x6034, 0x604c, 0x62fe, 0x6312, + /* 0x39 */ + 0x631f, 0x6317, 0x62f5, 0x6315, 0x62f7, 0x0a02, 0x437d, 0x62fa, + 0x62f9, 0x634b, 0x649c, 0x649d, 0x0a23, 0x65f0, 0x65f6, 0x65ef, + 0x679d, 0x679a, 0x67a7, 0x67af, 0x67aa, 0x6964, 0x6986, 0x6975, + 0x6970, 0x6984, 0x696b, 0x6985, 0x696c, 0x6a17, 0x6a94, 0x6a93, + 0x6bd2, 0x6bd7, 0x6bd4, 0x6da6, 0x6da7, 0x6d9c, 0x6d8b, 0x6d8d, + 0x6d98, 0x6db9, 0x6d9b, 0x6d9d, 0x6d99, 0x6da8, 0x6d91, 0x6d87, + 0x6d9a, 0x6ea6, 0x6f1f, 0x6fa7, 0x6fb1, 0x6fb2, 0x6fb7, 0x70d0, + 0x70b3, 0x70b5, 0x70c4, 0x70c3, 0x70bc, 0x70b2, 0x70ba, 0x70bb, + 0x70c2, 0x70cd, 0x70be, 0x70b7, 0x718f, 0x7203, 0x7204, 0x7371, + 0x7377, 0x7374, 0x738b, 0x737a, 0xc451, 0x738c, 0x7373, 0x74ff, + 0x74fb, 0x74fd, 0x74f0, 0x74f3, 0x74fc, 0x74f2, 0x7692, 0x769e, + 0x76ae, 0x7696, 0x7814, 0x7812, 0x7813, 0x7816, + /* 0x3a */ + 0x780f, 0x78b6, 0x78bd, 0x7a8c, 0x7aae, 0x7aac, 0x7aab, 0x7a99, + 0x7a92, 0x7abb, 0x7a9e, 0x7a7e, 0x7aaf, 0x7abc, 0x7a98, 0x7d01, + 0x7d09, 0x7d06, 0xc467, 0x7d07, 0x7d08, 0x7ecf, 0x7f0e, 0x7f32, + 0x0f15, 0x7f12, 0x7f16, 0x7f17, 0x7f1b, 0x7f15, 0x7f31, 0x7f18, + 0x7f1a, 0x7f10, 0x7f0a, 0x7f09, 0x804f, 0xc473, 0x810f, 0x8110, + 0xc475, 0x8128, 0x8111, 0x8116, 0x8117, 0x8102, 0x81bb, 0x81ba, + 0x81c3, 0x81bc, 0x828a, 0x8284, 0x8286, 0x82e0, 0x8317, 0x8318, + 0x831e, 0x8315, 0x83d3, 0x83da, 0x83d9, 0x85e6, 0x85f4, 0x85e1, + 0x8669, 0x8640, 0x8658, 0x866c, 0x864d, 0x8721, 0x8799, 0x87f1, + 0x5f68, 0x8886, 0x8b5b, 0x8b5c, 0x8b77, 0x8b2c, 0xc4ad, 0x8b58, + 0x8b64, 0x8b61, 0x8b48, 0x8b97, 0x8b59, 0x8b29, 0x8b62, 0x8b2e, + 0x8b68, 0x8b90, 0x8b3a, 0x8b3d, 0x8b5e, 0x8b46, + /* 0x3b */ + 0x8b69, 0x8b65, 0x8b3e, 0x8b49, 0x8b56, 0x8be1, 0x8b78, 0x8b79, + 0x8b66, 0x8b4a, 0x8b35, 0x8b7a, 0x8b92, 0x8b60, 0x8b36, 0x8b51, + 0x8b42, 0x115d, 0x8b3f, 0x8b7b, 0x8b5d, 0x8b94, 0x8b6a, 0xc4b5, + 0x8df2, 0x8fbb, 0x901b, 0x901a, 0x9033, 0x9017, 0x900a, 0x9015, + 0x9012, 0x9001, 0x902d, 0x8ffd, 0x9023, 0x9005, 0x9011, 0x9000, + 0x901c, 0x9035, 0x902e, 0x9036, 0x34bf, 0x902f, 0x900c, 0x9009, + 0x9031, 0x8ffc, 0x900f, 0x9018, 0x9002, 0x9200, 0x931f, 0x9337, + 0x125a, 0x9338, 0x932b, 0x932e, 0x9321, 0x9330, 0x9329, 0x9331, + 0xc4c9, 0x9301, 0x932c, 0x9322, 0x93ff, 0x9477, 0x9467, 0x947f, + 0x947d, 0x947b, 0x947e, 0x951e, 0x951c, 0x9521, 0x9526, 0x9527, + 0x9529, 0x952c, 0x951d, 0x952b, 0x96bf, 0x96a4, 0x96aa, 0x96ae, + 0x969f, 0x96d0, 0x96b1, 0x96ad, 0x969b, 0x96b2, + /* 0x3c */ + 0x96a9, 0x96b3, 0x96b4, 0x96ba, 0x96a5, 0x96b7, 0x96ac, 0x96cb, + 0x96cf, 0x97c6, 0x9801, 0x97ff, 0x97fd, 0x9877, 0x9878, 0x9876, + 0x98f7, 0x99cc, 0x1385, 0x99d4, 0x99d7, 0x99d5, 0x99d6, 0x99d3, + 0x9b5d, 0x9b55, 0x9ce0, 0x9d48, 0x9cee, 0x9cdb, 0x9ce7, 0x9cd6, + 0x9ce5, 0x9ce1, 0x9cdd, 0x9ce2, 0x9e70, 0x9e66, 0x9e6f, 0x9e6e, + 0x9f81, 0x9f69, 0x9f6e, 0x9f6d, 0x9f6c, 0x9f84, 0x9f85, 0x9f71, + 0x9f73, 0x9f6a, 0x9f6f, 0x9f7b, 0xa16a, 0xa17c, 0xa17d, 0xa181, + 0xa1fa, 0xa205, 0xa1eb, 0xa1fb, 0xa1e9, 0xa1ef, 0xa1fc, 0xa1e7, + 0xc4e1, 0xa1ee, 0xa1fd, 0xa332, 0xa3a7, 0xa3b5, 0xa3b1, 0xa3b9, + 0xa3a8, 0xa3b3, 0xc4e6, 0xa48a, 0xa491, 0xa48d, 0xa499, 0x150b, + 0xa49a, 0xa49b, 0xa492, 0xa48f, 0xa4ab, 0x6bdb, 0x1539, 0xa675, + 0xa631, 0xa638, 0x1537, 0xa635, 0xa669, 0xa63b, + /* 0x3d */ + 0xa63d, 0xa66c, 0xa679, 0xa63c, 0xa63e, 0xa897, 0xa8a5, 0xa8a2, + 0xa89d, 0xa8a1, 0xa968, 0xa96f, 0xa96d, 0xa972, 0xa975, 0xa977, + 0xa979, 0xaab5, 0xaaea, 0xaaab, 0xab43, 0xab41, 0xab42, 0xac09, + 0xac08, 0xac06, 0xac01, 0xac03, 0xac00, 0xac04, 0xac0a, 0xac0e, + 0xac0d, 0xac07, 0xac0f, 0xac14, 0xac02, 0xac15, 0xac0c, 0xac10, + 0xac05, 0xacfd, 0xacff, 0xad04, 0xad00, 0xad09, 0xae2b, 0xc4f7, + 0xae31, 0xaedb, 0xaec5, 0xaed3, 0xaece, 0x166b, 0xaec9, 0xaebf, + 0xaecb, 0xaec0, 0xaed0, 0xaed4, 0xafc1, 0xafb9, 0xafbb, 0xafc3, + 0xafc9, 0xb007, 0xb02d, 0xb0f8, 0xb0e1, 0xb0fa, 0xb0ef, 0xb0fd, + 0x16cd, 0xb0eb, 0xb0f1, 0xb0ed, 0xb0fe, 0xb1f8, 0xb203, 0xb1ee, + 0xb1e8, 0xb201, 0xb2ec, 0xb322, 0xb314, 0xb334, 0xb32f, 0xb339, + 0xb341, 0xb33c, 0xb349, 0xb358, 0xb33a, 0xb342, + /* 0x3e */ + 0xb33f, 0xb422, 0xb423, 0xb44a, 0xb4dc, 0xb4d9, 0xb4db, 0xb4e2, + 0xc507, 0xb4df, 0xb4e0, 0xb4d7, 0xb64f, 0xb646, 0xb653, 0xb655, + 0xb64e, 0xb64a, 0xb64c, 0xb663, 0xb751, 0xb753, 0xb758, 0xb74d, + 0xb75a, 0xb749, 0xb75d, 0xb812, 0xb83c, 0xb8d1, 0xb8df, 0xb8d6, + 0xb8d8, 0xb8e0, 0xb8d9, 0xb9b1, 0xb9ac, 0xb9aa, 0xb9ee, 0xb9bd, + 0x184d, 0xb9c3, 0xb9a8, 0xb9ae, 0xb9ab, 0xbc1d, 0xbc27, 0xbc38, + 0xbc12, 0xbc48, 0xbc2b, 0xbc16, 0xbc19, 0xbc3d, 0xbc23, 0xbc2a, + 0xbe64, 0xbead, 0xbeac, 0xc514, 0xbeb1, 0xbeaf, 0xbf2c, 0xbf24, + 0xbf25, 0xbf28, 0xbff9, 0xbff7, 0xbffd, 0xbffe, 0xc039, 0xc033, + 0xc0d7, 0xc0d8, 0xc0e4, 0x3aa1, 0xc10e, 0xc13b, 0xc144, 0xc142, + 0xc194, 0xc193, 0xc1d5, 0xc2a7, 0x2e31, 0x2e23, 0x2e28, 0x2e27, + 0x2ec6, 0x2fa3, 0x3021, 0x321b, 0x0110, 0x32c1, + /* 0x3f */ + 0x32c3, 0x332a, 0x3369, 0x3427, 0x37b6, 0x37a7, 0x37a4, 0x37a6, + 0x3790, 0x379e, 0x3794, 0x37a8, 0x37a5, 0x37a2, 0x3791, 0x027b, + 0x3abc, 0x3abd, 0x3ab4, 0x3ab0, 0x3ae4, 0x3b45, 0x3b4b, 0x3b7e, + 0x3b7f, 0x3b7d, 0x3bc3, 0x3dfc, 0x3df7, 0x3df0, 0x3ded, 0x3df1, + 0x3df8, 0x3fe9, 0x41eb, 0x041d, 0x4390, 0x438d, 0x4386, 0x4391, + 0x438a, 0x4408, 0x4450, 0x46ea, 0x46e6, 0x46e2, 0x46e7, 0x46ed, + 0x46e1, 0x4834, 0x4876, 0x4875, 0x4873, 0x48b5, 0x4990, 0x4992, + 0x4be1, 0x4bdf, 0x4bd5, 0x4bf2, 0x4bfe, 0x4c13, 0x4c2e, 0x4d19, + 0x5008, 0x1df5, 0x5005, 0x5009, 0x5006, 0x5003, 0x4ffd, 0x4ffc, + 0x5002, 0x5042, 0x521a, 0x5211, 0x5215, 0x5216, 0x52cc, 0x52cf, + 0x52d0, 0x5322, 0x531e, 0x5321, 0x54e5, 0x0727, 0x5554, 0x54ef, + 0x5553, 0x5551, 0x55ad, 0x5867, 0x5868, 0x58a4, + /* 0x40 */ + 0x5877, 0x5889, 0x5844, 0x588b, 0x5879, 0x585b, 0x5843, 0x5857, + 0x584a, 0x587c, 0x5846, 0x587b, 0x5856, 0x5aa8, 0x5b76, 0x5b72, + 0x5bd6, 0x5bd8, 0x5bd1, 0x5d22, 0x5d20, 0x5d23, 0x5d1e, 0x5d6e, + 0x60a3, 0x6077, 0x60a6, 0x606d, 0x60a2, 0x607c, 0x6084, 0x6068, + 0x6074, 0x6086, 0x60a5, 0x607b, 0x607a, 0x6069, 0x6072, 0x6076, + 0x634a, 0x6337, 0x632a, 0x632d, 0x6346, 0x6328, 0x6326, 0x6342, + 0x632c, 0x6338, 0x632b, 0x6333, 0x6345, 0x6439, 0x65f9, 0x65fa, + 0x67b8, 0x67b7, 0x67bb, 0x67b9, 0x67b4, 0x696f, 0x6987, 0x698f, + 0x69a2, 0x69a3, 0xc431, 0x6a9b, 0x6a9d, 0x6ace, 0x0bcf, 0x6dbd, + 0x6dbf, 0x6d92, 0x0bcd, 0x6def, 0x6dc9, 0x6ea4, 0x6ea8, 0x6eaa, + 0x6f28, 0x6f24, 0x6f25, 0x6f26, 0x6fa9, 0x6fba, 0x6fbe, 0x6fbc, + 0x6fc0, 0x70f0, 0x70df, 0x70e0, 0x70ed, 0x70db, + /* 0x41 */ + 0x70fb, 0x70b9, 0x70da, 0x70eb, 0x70ec, 0x739a, 0x739f, 0x739b, + 0x7397, 0x73a1, 0x750f, 0x7505, 0x7548, 0x0d82, 0x76bc, 0x76ba, + 0x78bf, 0x7b01, 0x7ae8, 0x7aef, 0x7ae4, 0x7ae6, 0x7b02, 0x7aeb, + 0x7ae0, 0x7aed, 0x7ad9, 0xc464, 0x7b14, 0x7aee, 0x0e52, 0x7b13, + 0x7af9, 0x7af8, 0x7d25, 0xc469, 0x7d19, 0x7d20, 0x7d43, 0x7d3f, + 0x7f45, 0x7f4c, 0x7f49, 0x7f4f, 0x7f41, 0x7f3e, 0x7f4d, 0x7f52, + 0x7f4a, 0x7f4e, 0x7f73, 0x7f42, 0x7f51, 0x7f55, 0x7f50, 0x7f6c, + 0x2afd, 0x7f6a, 0x7f53, 0x7f68, 0x8055, 0x8056, 0x811c, 0x811d, + 0x2280, 0x811e, 0x8123, 0x811f, 0x81e1, 0x81cd, 0x81cb, 0x81cc, + 0x81c8, 0x81c9, 0x829b, 0x8294, 0x8292, 0x8296, 0x8293, 0x8295, + 0x828f, 0x831d, 0x8322, 0x8321, 0x83e9, 0x83ef, 0x83e0, 0x83e6, + 0x83e4, 0x8629, 0x862c, 0x8676, 0x8683, 0x8678, + /* 0x42 */ + 0x863c, 0x6343, 0x867a, 0x1051, 0x86f2, 0x879e, 0x879b, 0x879a, + 0x87f6, 0x87f5, 0x88a5, 0x8893, 0x88a4, 0x8a82, 0x8ac7, 0x8bb7, + 0x8c1d, 0x8be2, 0x8bd7, 0x8be3, 0x8be4, 0x8bbc, 0x8bd3, 0x115a, + 0x8b5a, 0x8bd2, 0x8b2d, 0xc4af, 0x8bc4, 0x8bd0, 0x8be5, 0x8c05, + 0x8c07, 0x8be6, 0x8c1b, 0x8be7, 0x8bd8, 0x8bbe, 0x8c17, 0x8bb4, + 0x8bd9, 0x8be8, 0x8bad, 0x8baf, 0x8bc8, 0x8be9, 0x8bea, 0x8dfe, + 0x8dfb, 0x8e00, 0x9072, 0x9070, 0x9046, 0x9059, 0x905e, 0x9048, + 0x904f, 0x9071, 0x9060, 0x905f, 0x906e, 0x9073, 0xc4c0, 0xc4bf, + 0x9047, 0x906d, 0x906f, 0x9081, 0x906c, 0x9078, 0x9083, 0x9049, + 0x9068, 0x9074, 0x9063, 0x906a, 0x8685, 0x9065, 0x9062, 0x90c8, + 0x91d0, 0x91d4, 0x91d1, 0x9203, 0x9342, 0x9363, 0x9356, 0x935b, + 0x9355, 0x9350, 0x932d, 0x9344, 0x9348, 0x9345, + /* 0x43 */ + 0x9382, 0x1265, 0x9362, 0x9485, 0x948d, 0x9536, 0x952f, 0x9531, + 0x9537, 0x96a7, 0x96d9, 0x96f0, 0x96f2, 0x96fd, 0x96e8, 0x96eb, + 0x96ee, 0x96e0, 0x96e9, 0x96ed, 0x96d6, 0x96f8, 0x96d4, 0x96df, + 0x96e7, 0x96d8, 0x96e3, 0x96ef, 0x970f, 0x97ca, 0x3b46, 0x9805, + 0x980c, 0x980d, 0x987f, 0x9880, 0x9881, 0x9901, 0x9903, 0x99f2, + 0x99e2, 0x99e3, 0x99de, 0x99e9, 0x99e8, 0x99e0, 0x9a01, 0x99f5, + 0x99e4, 0x2501, 0x9a77, 0x9b74, 0x9b6f, 0x9b62, 0x9b61, 0x9b6d, + 0x9b73, 0x9b6a, 0x9b69, 0x9d12, 0x9d2d, 0x9d14, 0x9d0f, 0x9d29, + 0x9d16, 0x9d03, 0x9d46, 0x9d5c, 0x9d11, 0x9d06, 0x9cdc, 0x9d2b, + 0x9d2a, 0x9d2c, 0x9d27, 0x9e7a, 0x9f9c, 0x9f99, 0x9f95, 0x9f8b, + 0x9f98, 0x9f96, 0xa032, 0xa1a4, 0xa1aa, 0xa21b, 0x14af, 0xa20d, + 0xa21c, 0xa20a, 0xa220, 0xa208, 0xa21a, 0xa213, + /* 0x44 */ + 0xa211, 0xa35d, 0xa35f, 0xa35e, 0xa360, 0xa3bb, 0xa3bc, 0xa3c1, + 0xa3c0, 0xa3c8, 0xa3ce, 0xa4a7, 0xa4b2, 0xa4b6, 0xa4a5, 0xa4ba, + 0xa4b5, 0xa4ad, 0xa4a4, 0xa4d3, 0xa4b0, 0xa4b1, 0xa51d, 0xa68d, + 0x1541, 0xa691, 0xa6b6, 0xa6b7, 0xa6bd, 0xa6bc, 0xa696, 0xa694, + 0xa6a0, 0xa8a8, 0xa8a6, 0xa984, 0xa996, 0xa988, 0xa99a, 0xaad1, + 0xaacf, 0xab50, 0xab51, 0xab4e, 0xab80, 0xab81, 0xac1b, 0xac17, + 0xac20, 0xac19, 0xac1a, 0xac21, 0xac1e, 0xac18, 0xac1d, 0x1629, + 0xad2d, 0xad24, 0xad27, 0xad2e, 0xad25, 0xad1c, 0xad19, 0x162a, + 0xad23, 0xad1f, 0xad1a, 0xad2b, 0xad1e, 0xade0, 0xae33, 0xaee6, + 0xaefc, 0xaee5, 0xaef8, 0xaef6, 0xaeea, 0xaef2, 0xaeed, 0xaeeb, + 0xaef0, 0xaef1, 0xafc6, 0xafc8, 0xafce, 0xafc5, 0x1696, 0xafcb, + 0xb113, 0xb114, 0xb107, 0xb10c, 0xb21a, 0x1712, + /* 0x45 */ + 0xb217, 0xb206, 0xb216, 0xb207, 0xb210, 0xb209, 0xb219, 0xb215, + 0xb36e, 0xb33b, 0xb33e, 0xb36c, 0xb365, 0xb364, 0xb359, 0xb37c, + 0xb370, 0xb379, 0xb42c, 0xb452, 0xb451, 0xb44c, 0xb500, 0xb510, + 0xb513, 0xb4ff, 0xb4fe, 0xb4ed, 0xb65a, 0xb658, 0xb65c, 0xb6da, + 0xb778, 0xb75e, 0xb767, 0xb764, 0xb813, 0xb823, 0xb841, 0xb83f, + 0xb840, 0xb8ed, 0xb8e3, 0xb8ea, 0xb8f0, 0xb8e6, 0xb8e9, 0xb8f1, + 0xb8ee, 0xb9d4, 0xb9d1, 0xb9dc, 0xb9ec, 0xbc69, 0xbc6d, 0xbc57, + 0xbc66, 0xbcf9, 0xbc4a, 0xbc60, 0xbc56, 0xbc59, 0xbc4c, 0xbc6a, + 0xbc62, 0xbc63, 0xbc70, 0xbc5f, 0xc50d, 0xbc64, 0xbc5d, 0xbc68, + 0xbc9f, 0xbeba, 0xbeb8, 0xbebc, 0xbeb9, 0xbeb4, 0xbf3b, 0xbf2d, + 0xbf38, 0xbf2f, 0xbf32, 0xc041, 0xc0cb, 0xc0de, 0xc0dd, 0xc0da, + 0xc0dc, 0xc110, 0xc14f, 0xc149, 0xc198, 0xc196, + /* 0x46 */ + 0xc197, 0xc1c7, 0x2c9c, 0xc1da, 0xc1d8, 0xc2a8, 0x2c0a, 0x2c9d, + 0x2ecb, 0x2f38, 0x2f39, 0x2fa6, 0x3223, 0x3222, 0x3221, 0x33ce, + 0x3592, 0x3591, 0x37ec, 0x37e0, 0x37ed, 0x3808, 0x37e5, 0x37ee, + 0x37e4, 0x37eb, 0x37e3, 0x37ea, 0x380a, 0xc359, 0x3ad1, 0x3ae3, + 0x3ad4, 0x3ad0, 0x3ad9, 0x027e, 0x1be1, 0x3ada, 0x3ad3, 0x3b4c, + 0x3b4d, 0x3b7c, 0x3b80, 0x3bcc, 0x3dff, 0x3e08, 0xc108, 0x3e01, + 0xc36b, 0x3e00, 0x3fed, 0x3ff3, 0x3fee, 0x3ff1, 0x3ff0, 0x3fde, + 0x4051, 0x4382, 0x43a9, 0x4398, 0x439d, 0x439a, 0x439e, 0x439f, + 0x43a6, 0x43a7, 0x4409, 0x442f, 0x4571, 0x456d, 0x4572, 0x46ef, + 0x46f0, 0x483b, 0x4839, 0x483c, 0x4838, 0x6afd, 0x483a, 0x4878, + 0x4879, 0x4877, 0x4998, 0x499c, 0x4999, 0x499a, 0x4c11, 0x4c0a, + 0x4bfd, 0x4c0f, 0x4c19, 0x4c03, 0x4c15, 0x4c0c, + /* 0x47 */ + 0x4c09, 0x4c12, 0x4c34, 0x4c2a, 0x4c08, 0x4c2d, 0x4c28, 0xc3b1, + 0x4c2c, 0x4c26, 0x4c33, 0x05a7, 0x4d1a, 0x4d1e, 0x5007, 0x502c, + 0x5032, 0x5028, 0x5031, 0x5029, 0x5030, 0x502a, 0x5044, 0x502e, + 0x52d1, 0x5324, 0x54f7, 0x54f4, 0x54f3, 0x54f8, 0x58b5, 0x5896, + 0x5898, 0x5895, 0x5891, 0x58b2, 0x589e, 0x5859, 0x58a3, 0x589a, + 0x589b, 0x0f20, 0x7f83, 0x5bda, 0x5bdf, 0x5c16, 0x5d1f, 0x5d2d, + 0x5d2e, 0x5d2b, 0x60b8, 0x60bb, 0x60bf, 0x60ba, 0x60d5, 0x60e3, + 0x60c1, 0x60be, 0x60bd, 0x60b4, 0x60c2, 0x60a1, 0x6087, 0x60d7, + 0x60ca, 0x60b5, 0x60da, 0x60d9, 0x60b3, 0x60d8, 0x6367, 0x6371, + 0x6362, 0x635c, 0x6368, 0x6352, 0x6356, 0x3809, 0x2e42, 0x64a0, + 0x6600, 0x65fe, 0x65ff, 0x67cb, 0xc428, 0x67ca, 0x67a9, 0x67c8, + 0x69b4, 0x69ac, 0x69aa, 0x69a9, 0x6b0e, 0x6be9, + /* 0x48 */ + 0x6bed, 0x6bf2, 0x6beb, 0x6bee, 0x6de8, 0x6ddb, 0x6dd7, 0x6de3, + 0x6de5, 0x6dee, 0x6dd5, 0x6eb3, 0x6f2d, 0x6fc1, 0x6fc3, 0x710c, + 0x710e, 0x7107, 0x7117, 0x7109, 0x7116, 0x719a, 0x719c, 0x73b4, + 0x73b7, 0x73b3, 0x3b4e, 0x7513, 0x7514, 0x76e6, 0x76dc, 0x76e8, + 0x76e5, 0x782e, 0x782c, 0x782b, 0x78cd, 0x7b3d, 0x7b32, 0x7b2d, + 0x7b45, 0x7b3e, 0x7b50, 0x7b25, 0x7b53, 0x7b23, 0x7d37, 0x7d38, + 0x7d47, 0x7d3d, 0x7d3e, 0x7d49, 0x7d4a, 0x7d1d, 0x21e9, 0x7fa5, + 0x7f8c, 0x7f8d, 0x7f89, 0x7f96, 0x7f85, 0x7f8f, 0x7f77, 0x7f8e, + 0x7f82, 0x7f8a, 0x7f88, 0x7f7b, 0x7f97, 0x7f7d, 0x7f79, 0x8059, + 0x8124, 0x812d, 0x812e, 0x812b, 0xc476, 0x81da, 0x81d8, 0x81d6, + 0x8287, 0x82a0, 0x8328, 0x8325, 0x831f, 0x83f3, 0x83f7, 0x83f6, + 0x862b, 0x865b, 0x8648, 0x23cb, 0x865c, 0x866d, + /* 0x49 */ + 0x869d, 0x8699, 0x868c, 0x8691, 0x869b, 0x869a, 0x869c, 0x8695, + 0x868d, 0x8696, 0x86a5, 0x872a, 0x87a1, 0x87a4, 0x87ad, 0x88a9, + 0x88ae, 0x88b0, 0x8c0d, 0x8b63, 0x8b71, 0x8c51, 0x8c54, 0x8c2a, + 0x8c44, 0x8c55, 0x8c99, 0x8c39, 0x8c3f, 0x8c3e, 0x8c4f, 0x8c4d, + 0x8c35, 0x8c40, 0x8c31, 0x8bd5, 0x8c2b, 0x8c33, 0x8c41, 0x8c56, + 0x8c4c, 0x8c46, 0x8c3c, 0x8c45, 0x8c43, 0x8c3d, 0x8c70, 0x8c57, + 0x8c38, 0x8c58, 0x1165, 0x8c37, 0x8e07, 0x8e06, 0x8e09, 0x90ab, + 0x9090, 0x9093, 0x90bc, 0x90a9, 0x909e, 0x90bf, 0x90aa, 0x9091, + 0x90a4, 0x909a, 0x90a7, 0x90a1, 0x909c, 0x90a2, 0x909b, 0x909f, + 0x9094, 0x908f, 0x8ef0, 0x9092, 0x9095, 0x90a5, 0x90a6, 0x9204, + 0x939c, 0x9379, 0x937a, 0x937e, 0x937b, 0x9371, 0x9381, 0x937f, + 0x937c, 0x937d, 0x9375, 0x9376, 0x948e, 0x948f, + /* 0x4a */ + 0x953e, 0x953f, 0x9540, 0x9541, 0x1304, 0x970d, 0x9717, 0x9710, + 0x970e, 0x96ea, 0x971d, 0x9703, 0x9722, 0x9704, 0x9700, 0x9720, + 0x9721, 0x9723, 0x9713, 0x9709, 0x9711, 0x97cb, 0x97ce, 0x97d0, + 0x97cc, 0x97d4, 0x3adb, 0x9809, 0x980b, 0x9885, 0x9906, 0x990d, + 0x1364, 0x9914, 0x990f, 0x9a09, 0x9a14, 0x9a0b, 0x99fc, 0x9a04, + 0x9a0a, 0x9a00, 0x99fd, 0x9a07, 0x9a06, 0x9a11, 0x9a79, 0x9a78, + 0x9b88, 0x9b80, 0x9b8b, 0x9d59, 0x9d61, 0x9d75, 0x1423, 0x9d55, + 0x9d5b, 0x9d5f, 0x9d52, 0x9d62, 0x9d72, 0x9d5d, 0x9d68, 0x9d71, + 0x9d65, 0x9d66, 0x9d67, 0x9d76, 0x9d4c, 0x9d60, 0x9d74, 0x9d50, + 0x9e8a, 0x9e81, 0x9e86, 0x9e7f, 0x9e80, 0x9fa5, 0x9fa7, 0x9fa8, + 0x9fa6, 0x9faf, 0x7f95, 0x9fb1, 0xa035, 0xa039, 0xa1c3, 0xa230, + 0xa22a, 0xa22b, 0xa22d, 0xa22e, 0xa22c, 0xa223, + /* 0x4b */ + 0xa221, 0xa222, 0xa36c, 0xa381, 0xa38f, 0xa380, 0xa3d0, 0xa3cd, + 0xa3d5, 0xa3d4, 0xa4d1, 0xa4be, 0xa4cb, 0xa4ce, 0xa4bd, 0xa4d0, + 0xa704, 0xa6d5, 0xa6d0, 0xa6d3, 0xa6fb, 0xa6d8, 0xa6d1, 0xa6fd, + 0xa6d9, 0xa6d6, 0xa6e6, 0xa6f9, 0xa9a1, 0xa99d, 0xa99e, 0x28d9, + 0xaaff, 0xab5f, 0xab57, 0xab60, 0xab59, 0xac2c, 0xac25, 0xac27, + 0xac30, 0xac24, 0xac26, 0xac2d, 0xac2e, 0xac29, 0xac31, 0xad45, + 0xad47, 0xad52, 0xad4a, 0xad50, 0xad46, 0xad4f, 0xad4e, 0xad53, + 0xaf21, 0xaf09, 0xaf1a, 0xaf1b, 0x7115, 0xaf10, 0xc4f9, 0xaf14, + 0xaf0e, 0xaf12, 0xaf0b, 0xafcf, 0xafd2, 0xafd0, 0xafd4, 0xafd3, + 0xafd1, 0x3518, 0xc4fb, 0xb009, 0xb11c, 0xb127, 0xb125, 0xb11b, + 0xb129, 0xb11f, 0xb130, 0xb124, 0xb128, 0xb119, 0xb12f, 0xb224, + 0xb221, 0xb225, 0xb226, 0xb227, 0xb276, 0xb366, + /* 0x4c */ + 0xb375, 0xb369, 0xb37e, 0xb38f, 0xb374, 0x8e10, 0xb3ad, 0xb42b, + 0xb42a, 0xb458, 0xb522, 0xb51d, 0xb52b, 0xb52c, 0xb52d, 0xb533, + 0xb51b, 0xb527, 0xb52a, 0xb528, 0xb53b, 0xb67e, 0xb671, 0xb679, + 0xb678, 0xb670, 0xb66d, 0xb67d, 0xb675, 0xb676, 0xb6de, 0xb766, + 0xb783, 0xb787, 0xb77b, 0xb789, 0xb786, 0xb782, 0xb77c, 0xb781, + 0xb843, 0xb845, 0xb8f7, 0xb8f9, 0xb8fa, 0xba05, 0xb9fe, 0xba0f, + 0xb9ff, 0xb9fa, 0xba09, 0xba20, 0xba0c, 0xba3c, 0xba22, 0xb9f8, + 0xba0a, 0xba08, 0xb9f7, 0xbc8e, 0xbc77, 0xbc8b, 0xbcb4, 0xbc8a, + 0xbc9a, 0xbc79, 0xbc83, 0xbc7f, 0xbca1, 0xbc8f, 0xbca3, 0xbc81, + 0xbc94, 0xbc7e, 0xbc82, 0xbc90, 0xbca5, 0xbcad, 0xbc9d, 0xbe67, + 0xbe69, 0xbecb, 0xbec8, 0xbed1, 0xbf40, 0xbf4b, 0xbf49, 0xbf46, + 0xbf3e, 0xbf43, 0xbf3f, 0xbfa5, 0xbfa7, 0xc04e, + /* 0x4d */ + 0xc04d, 0x499b, 0xc0e5, 0xc0e1, 0xc0e2, 0xc116, 0xc114, 0xc51b, + 0xc159, 0xc151, 0xc15f, 0xc14a, 0xc157, 0xc158, 0xc1ca, 0xc1db, + 0xc1de, 0xc1e0, 0xc1e1, 0xc1df, 0xc1e2, 0xc1e3, 0xc292, 0xc2bf, + 0xc2be, 0x2c0b, 0x2e52, 0x2e4e, 0x00b9, 0xc313, 0x2fa7, 0x3226, + 0x3227, 0x32c6, 0x330b, 0x336a, 0x3378, 0x381a, 0x3816, 0x3819, + 0x3817, 0x381b, 0x3818, 0x3820, 0x3937, 0x3aec, 0x3b81, 0xae3d, + 0x3e0f, 0x3ead, 0x3ffb, 0x4052, 0x43af, 0x43b7, 0x43b2, 0x4578, + 0x45ac, 0x4700, 0x46fe, 0x4702, 0x46fd, 0x4703, 0x4840, 0x4843, + 0x4842, 0x48b7, 0x49a2, 0x4c00, 0x4c35, 0x4c41, 0x4c05, 0x2e53, + 0x4c50, 0x4c4e, 0x4c53, 0x5053, 0x5050, 0x5057, 0x505f, 0x5055, + 0x50ea, 0x5226, 0xb430, 0x522a, 0x5228, 0x522c, 0x522d, 0x52d4, + 0x5507, 0x5558, 0x5559, 0x58c5, 0x58cd, 0x58c7, + /* 0x4e */ + 0x58e8, 0x084b, 0x5a32, 0xc297, 0x5bde, 0x5d32, 0x34c8, 0xc415, + 0x60f1, 0x60f0, 0x60ec, 0x6109, 0x60f9, 0x60f5, 0x60fe, 0x6374, + 0x6381, 0x637c, 0x6375, 0x6389, 0x6382, 0x6397, 0x6386, 0x637d, + 0x6393, 0x639c, 0x6376, 0x6380, 0x6445, 0x30a1, 0x6603, 0x67c9, + 0x67cd, 0x67d0, 0x69ad, 0x69c5, 0x6aa2, 0x6bec, 0x6bf6, 0x6bf3, + 0x6df3, 0x6dfa, 0x6df9, 0x6df5, 0x6df4, 0x6df8, 0x6eb6, 0x6eb4, + 0x6f32, 0x6fcd, 0x6fc8, 0x6fce, 0x6fca, 0x712a, 0x7121, 0x711d, + 0x73bd, 0x73be, 0x73c2, 0x0cf1, 0x73c9, 0x751f, 0x76f1, 0x76ed, + 0x76f2, 0x76e0, 0x76f7, 0x7830, 0x7837, 0x7831, 0x7836, 0x78c8, + 0x7b6d, 0x7b69, 0x7b7d, 0x7b61, 0x7b70, 0x7b71, 0x7b73, 0x7b76, + 0x7b75, 0x7b78, 0x7b79, 0x7b64, 0x7b6e, 0x7d51, 0x7d4f, 0x7d22, + 0x7faf, 0x7faa, 0x7fa3, 0x7f9d, 0x7f9c, 0x7fa1, + /* 0x4f */ + 0x7fb6, 0x7fac, 0x7fa2, 0x7fa7, 0x7fb0, 0x7fa9, 0x7fc3, 0x8131, + 0x8132, 0x8133, 0x8134, 0x8137, 0x813c, 0x81d9, 0x81dd, 0x81de, + 0x81df, 0x81e0, 0x82a5, 0x82aa, 0x82a2, 0x82a3, 0x8404, 0x8403, + 0x83fe, 0x8428, 0x86af, 0x86ad, 0x86a6, 0x87ac, 0x87a5, 0x87b0, + 0x87b1, 0x8801, 0x88b2, 0x88d2, 0x88f1, 0x8bd1, 0x8c47, 0x8cc9, + 0x8ca7, 0x8cc8, 0x8c95, 0x8c8e, 0x8c91, 0x8c7d, 0x8cee, 0x8c8d, + 0x8c8c, 0x8cb0, 0x8c96, 0x8c42, 0x8c7c, 0x8cb1, 0x8cb2, 0x8c84, + 0x8c9d, 0x8ca1, 0x8c98, 0x8cb3, 0x8c22, 0x8c7b, 0x8c8a, 0x8cce, + 0x8c80, 0x8c97, 0x8cb4, 0x8cb5, 0x8c9a, 0x8c9f, 0x8c93, 0x8e12, + 0x8e0b, 0x8e0e, 0x90a3, 0x90cc, 0x90dc, 0x90e1, 0x90de, 0x90d2, + 0x90db, 0x90d9, 0x90d7, 0x90d4, 0x90c9, 0x90eb, 0x90da, 0x90d1, + 0x9104, 0x90ca, 0x90e2, 0x91d7, 0x938c, 0x9399, + /* 0x50 */ + 0x93a2, 0x9396, 0x9394, 0x939f, 0x1267, 0x938e, 0x9403, 0x9494, + 0x9493, 0x9544, 0x972f, 0x9735, 0x972b, 0x9732, 0x972d, 0x9736, + 0x1314, 0x9731, 0x9712, 0x9733, 0x971f, 0x9734, 0x9740, 0x973f, + 0x9741, 0x97d3, 0x9889, 0x9918, 0x9910, 0x9a1a, 0x9a25, 0x9a1e, + 0x9b92, 0x9b95, 0x9b93, 0x9d84, 0x9d9a, 0x9d89, 0x9d8d, 0x9d88, + 0x9d91, 0x9d9b, 0x9d9c, 0xb148, 0x9e8e, 0x9e92, 0x9fc5, 0x9fc1, + 0x9fb8, 0x9fbe, 0x9fb5, 0x9fc7, 0xa03c, 0x1489, 0xa1ec, 0xa23f, + 0xa239, 0xa237, 0xa3a1, 0xa394, 0xa3a0, 0xa3de, 0xa3db, 0xa3df, + 0xa3dc, 0xa4d6, 0xa4dc, 0xa4dd, 0xa4e0, 0xa4e3, 0xa4e1, 0xa718, + 0xa719, 0xa753, 0xc4ec, 0xa744, 0xa70e, 0xa70f, 0xa747, 0xa717, + 0xa71d, 0xa711, 0xa8b4, 0xa8b6, 0xa9b7, 0xa9be, 0xa9c2, 0xa9b4, + 0xab31, 0xab15, 0xab83, 0xac3b, 0xac36, 0xac42, + /* 0x51 */ + 0xac50, 0xac40, 0xac34, 0xac38, 0xac3d, 0xac3e, 0xac35, 0xac3a, + 0xac46, 0xac37, 0xac39, 0xac45, 0xad77, 0xad5d, 0xad6a, 0xad76, + 0xad6b, 0xad6c, 0xad65, 0xad64, 0xad71, 0xad5f, 0xad72, 0xadfe, + 0xadff, 0xae3e, 0xaf2b, 0xaf36, 0xaf2d, 0xaf39, 0xaf3f, 0xaf3b, + 0xaf33, 0xaf42, 0xaf3a, 0xafd5, 0xafd8, 0xafd9, 0xb00d, 0xb00a, + 0xb039, 0xb03a, 0xb13d, 0xb145, 0xb13a, 0xb137, 0xb13e, 0xb142, + 0xb387, 0xb38c, 0xb382, 0xb36b, 0xb3a0, 0xb39a, 0xb390, 0xb38e, + 0xb3a1, 0xb3bd, 0xb3b2, 0xb3b5, 0xb3b7, 0xb3aa, 0xb3a2, 0xb3a5, + 0xb3ae, 0xb3ab, 0xb3bc, 0xb432, 0xb45a, 0xb564, 0xb55c, 0xb54d, + 0xb53f, 0xb53e, 0xb552, 0xb558, 0xb557, 0xb55e, 0xb553, 0xb554, + 0xb556, 0xab65, 0xb684, 0xb685, 0xb686, 0xb797, 0xb7a1, 0xb7a2, + 0x180b, 0xc50a, 0xb7a3, 0xb7a6, 0x1817, 0xb815, + /* 0x52 */ + 0xb824, 0xb84a, 0xb849, 0xb848, 0xb84b, 0xb90e, 0xb562, 0xb90b, + 0xb90a, 0xb908, 0xb906, 0xba43, 0xba47, 0xba3f, 0xba46, 0xba50, + 0x186d, 0xba4b, 0x1870, 0xba52, 0xbcd7, 0xbcbf, 0xbcd8, 0xbce0, + 0xbce7, 0xbcb8, 0xbcd5, 0xbcef, 0xbce6, 0xbce4, 0xbcd4, 0xbcd6, + 0xbcea, 0x18ed, 0xbcbb, 0xbce9, 0xc510, 0xbe6d, 0xbe70, 0xbe73, + 0xbe72, 0xbed4, 0xbece, 0xbed5, 0xbf5a, 0xbf58, 0xbf52, 0xbf50, + 0xbf55, 0xbf4e, 0xbf4d, 0xbfcb, 0xbfcc, 0xbfcd, 0xbfd1, 0xc058, + 0xc063, 0xc05e, 0xc054, 0xc05b, 0xc0e9, 0xc0e7, 0xc0e8, 0xc11d, + 0xc167, 0xc15a, 0xc15c, 0xc15b, 0xc161, 0xc1a1, 0x198d, 0xc1a4, + 0xc1e9, 0xc1ef, 0xc1e5, 0xc1f5, 0xc1eb, 0xc1ed, 0xc296, 0xc295, + 0xc2b3, 0xc2b5, 0xc2b1, 0x00a7, 0x2e4d, 0x3024, 0x322b, 0x33cf, + 0x34c9, 0x3836, 0x3831, 0x3854, 0x383a, 0x3838, + /* 0x53 */ + 0x3939, 0x3938, 0x3af4, 0x3af3, 0x3af6, 0x3afc, 0x3af5, 0x3af1, + 0x3c9c, 0x3e18, 0x3e1a, 0x3ffc, 0x3ffe, 0x4003, 0x4053, 0x422b, + 0x43c6, 0x43c1, 0x457b, 0x4706, 0x4849, 0x48b8, 0x49a3, 0x4c52, + 0x4c4d, 0x4c5f, 0x4c5e, 0x4c61, 0x4d23, 0x508c, 0x506f, 0x5075, + 0x5074, 0x5071, 0x5070, 0x506c, 0x5326, 0x5508, 0x1e07, 0x58f0, + 0x58ef, 0x58fb, 0x5910, 0x590c, 0x58f6, 0x58fe, 0x5b7c, 0x5be1, + 0x5d38, 0x5d6f, 0x6118, 0x6115, 0x611c, 0x6110, 0x6135, 0xc417, + 0x6117, 0x611d, 0x6126, 0x6128, 0x6129, 0x612a, 0x611a, 0xc416, + 0x4707, 0x63ab, 0x63ac, 0x63a1, 0x63ae, 0x63a3, 0x63a7, 0x6448, + 0x6504, 0x65fd, 0x0a5a, 0x6608, 0x67d2, 0x69c6, 0x69be, 0x6a1c, + 0x6aa6, 0x6aa7, 0x6aab, 0x6b00, 0x6bfb, 0x6bfc, 0x6bf9, 0x6c01, + 0x6e06, 0x6e04, 0xc43c, 0x6f34, 0x7136, 0x7132, + /* 0x54 */ + 0x7142, 0x712d, 0x7135, 0x73d8, 0x7523, 0x7520, 0x7701, 0x7700, + 0x7703, 0xc2bc, 0x783c, 0x7841, 0x7835, 0x78c9, 0x7b8e, 0x7b9e, + 0x7b99, 0x7bb4, 0x7baa, 0x7b9f, 0x7b96, 0x7b9d, 0x7bc3, 0x7b74, + 0x7bab, 0x0eaf, 0x7d63, 0x7d5b, 0x7d5a, 0x7fc5, 0x7fc4, 0x7fcf, + 0x7fc8, 0x7fa4, 0x7fbd, 0x7fd3, 0x8060, 0x813b, 0x81e3, 0x81e7, + 0x82a8, 0x82ac, 0x82a9, 0x832a, 0x8408, 0x8409, 0x86b9, 0x88c1, + 0x88c2, 0x88b8, 0x8ce1, 0x8ceb, 0x8ce5, 0x8cfa, 0x8ce4, 0x8d0b, + 0x8cd7, 0x8cef, 0x8ce0, 0x8cec, 0x8cfb, 0xc4b0, 0x8cd3, 0x8ce6, + 0x8cfc, 0x8ce3, 0x8ccf, 0x8cda, 0x8cdc, 0x8cd2, 0x8ca4, 0x116b, + 0x8e17, 0x8e16, 0x90f2, 0x90fc, 0x9118, 0x90f6, 0x90fe, 0x90f3, + 0x90f7, 0x9101, 0x90f9, 0x9106, 0x90f5, 0x9110, 0x90df, 0x9103, + 0x9108, 0x91d8, 0x9205, 0x9397, 0x93b3, 0x93ae, + /* 0x55 */ + 0x93af, 0x93a7, 0x93b1, 0x93a8, 0x93ac, 0x93ab, 0x9404, 0x949a, + 0x954a, 0x9742, 0x9758, 0x974b, 0x9745, 0x9749, 0x974c, 0x9759, + 0x9756, 0x131b, 0x9746, 0x9744, 0x975b, 0x9769, 0x988e, 0x988f, + 0x991e, 0x86bc, 0x9a2f, 0x9b9e, 0x9b9d, 0x9b9f, 0x9b9c, 0x9db4, + 0x9dae, 0x9dab, 0x9db3, 0x9daf, 0x9dc2, 0x9e93, 0x9e95, 0x9e96, + 0x9e97, 0x9fcf, 0x9fce, 0x9fcb, 0xa04b, 0xa246, 0xa243, 0xa245, + 0xa251, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b8, 0xa3e2, 0xa3e3, 0xa3e6, + 0xa4ed, 0xa4ea, 0xa53a, 0xa759, 0xa784, 0xa75f, 0xa77c, 0xa75c, + 0xa758, 0xa755, 0xa75d, 0xa77e, 0xa780, 0xa783, 0xa757, 0x1563, + 0xa75e, 0xa8ba, 0xa9d5, 0xab58, 0xab68, 0xab67, 0xac4a, 0xac4c, + 0xac52, 0xac49, 0xac4e, 0xac47, 0xac4d, 0xac4b, 0xac4f, 0xad7e, + 0xad87, 0xad83, 0xad89, 0x69ca, 0xad86, 0xad88, + /* 0x56 */ + 0xae47, 0xae42, 0xae49, 0xae48, 0x1680, 0x1684, 0x167f, 0xaf44, + 0xaf51, 0xaf46, 0xaf47, 0xafe4, 0xb00f, 0xb03f, 0xb14b, 0xb157, + 0xb152, 0x16f1, 0xb151, 0xb158, 0xb15e, 0xb153, 0xb15d, 0xb14d, + 0xb23c, 0xb23f, 0xb246, 0xb23e, 0xb244, 0xb245, 0xb241, 0xb238, + 0xb242, 0xb243, 0xb27a, 0xb3a3, 0xb3ba, 0xb3c0, 0xb3c4, 0xb3c6, + 0xb3cb, 0xb461, 0xb57a, 0xb573, 0xb572, 0xb574, 0xb580, 0xb581, + 0x2947, 0xb695, 0xb68f, 0xb690, 0xb692, 0xb694, 0xb68b, 0xb6e6, + 0xb7b2, 0xb7b8, 0xb7bd, 0xb7be, 0xb7ce, 0xb7ba, 0xb816, 0xb826, + 0xb825, 0xb84c, 0xb850, 0xb84e, 0xb851, 0xb852, 0xb914, 0xb915, + 0xb91b, 0xba82, 0xba99, 0xba9a, 0xba7d, 0xba85, 0xba86, 0xba9c, + 0xba79, 0xba7b, 0xba80, 0xba83, 0xba81, 0xbd1e, 0xbd1b, 0xbd2a, + 0xbcfb, 0xbd05, 0xbd20, 0xbd11, 0xbd04, 0xbcfd, + /* 0x57 */ + 0xbd03, 0xbd10, 0xbd18, 0xbd0a, 0xbd4e, 0xbd09, 0xbd07, 0xbd1c, + 0x191c, 0xbe77, 0xbe76, 0xbed8, 0xbed9, 0xbf61, 0xbf5c, 0xbf5e, + 0xbf60, 0xbfaa, 0xbfd6, 0xbfd8, 0xc009, 0xc008, 0xc06b, 0xc065, + 0xc073, 0xc074, 0xc0ed, 0xc124, 0xc125, 0xc16a, 0xc1a7, 0xc1a8, + 0xc20b, 0xc1fa, 0xc1f9, 0xc1ff, 0xc204, 0xc1f6, 0xc205, 0xc299, + 0xc2ab, 0xc2bd, 0xc2b8, 0x00a8, 0x2e64, 0x2e5a, 0x2f72, 0x337a, + 0x3595, 0x385f, 0x3861, 0x385e, 0x385a, 0x385c, 0x385d, 0x386e, + 0x3857, 0x3858, 0x3b02, 0x3b0b, 0x3b08, 0x3b51, 0x3e25, 0x3e28, + 0x3e23, 0x3e21, 0x3e24, 0x3e29, 0x4006, 0x400a, 0x43ca, 0x43cc, + 0x43cb, 0x43cf, 0x457f, 0x457c, 0x45d6, 0x4709, 0x470b, 0x4776, + 0x487d, 0x49a5, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c65, 0x506d, 0x5082, + 0x5083, 0x5087, 0x5095, 0x508a, 0x52d6, 0x5328, + /* 0x58 */ + 0x550d, 0x592e, 0xc3ee, 0x592d, 0x5921, 0x5919, 0x5a3b, 0x5a3c, + 0x5a3a, 0x5b7e, 0x5d3b, 0x6147, 0x6139, 0x6134, 0x6136, 0x6146, + 0x613b, 0x6141, 0x6145, 0x63c0, 0x63c4, 0x63ba, 0x63bd, 0x63be, + 0x64a3, 0x660c, 0x67d9, 0x69cd, 0x6aae, 0x6bff, 0x6c24, 0x6ebb, + 0x6ebc, 0x6f36, 0x6fd5, 0x6fd3, 0x6fd6, 0x713c, 0x713f, 0x73de, + 0x73e3, 0x7527, 0x7529, 0x0d8b, 0x7705, 0x7707, 0x770c, 0x78d0, + 0x7bbe, 0x7bbc, 0x7bd0, 0x7bc2, 0x7bb5, 0x7bc9, 0x7d66, 0x0f2b, + 0x7fd5, 0x7fe2, 0x7fdc, 0x7fe3, 0x7fda, 0x7fc2, 0x7fe8, 0x81e9, + 0x82af, 0x82ad, 0x82ae, 0x840b, 0x86c1, 0x87b6, 0x87b9, 0x88c0, + 0x8ca5, 0x8d28, 0x8d22, 0x8d29, 0x8d18, 0x8d1f, 0x8d1c, 0x8d12, + 0x8d2a, 0x117a, 0x8d21, 0x8d2b, 0x8d17, 0x8cf0, 0x8d16, 0x8d23, + 0x912b, 0x9126, 0x913d, 0x9122, 0x913a, 0x9131, + /* 0x59 */ + 0x9132, 0x9154, 0x9121, 0x9135, 0x1209, 0x912e, 0x9130, 0x912f, + 0x9136, 0x91da, 0x91d9, 0x93bb, 0x93bc, 0x93b7, 0x93c2, 0x93bd, + 0x93b2, 0x126d, 0x7144, 0x7bd1, 0x9752, 0x976b, 0x9767, 0x131f, + 0x9761, 0x976c, 0x9751, 0x9774, 0x9777, 0x976f, 0x976d, 0x9768, + 0xc4d1, 0x9784, 0x9890, 0x9892, 0x9893, 0x991f, 0x9a31, 0x9a38, + 0x9a39, 0x9a37, 0x9bab, 0x9dc3, 0x9dc8, 0x9dcb, 0x9dcf, 0x9e98, + 0x9fd4, 0x9fd3, 0x9fd8, 0x9fd9, 0x9fdd, 0x9fd1, 0x9fd6, 0xa03e, + 0xa258, 0xa257, 0xa255, 0xa3c4, 0xa3e4, 0xa4ee, 0xa4ef, 0xa4f3, + 0xa4f2, 0xa4f0, 0xa7ab, 0xa79a, 0xa7af, 0xa797, 0x156a, 0x156c, + 0xa7bf, 0xa794, 0xa793, 0xa8be, 0xa8bb, 0xa8bc, 0xa9d9, 0xab6c, + 0xac53, 0xac54, 0xac5b, 0xac58, 0xac56, 0xac57, 0xad9f, 0xad94, + 0xad96, 0xad97, 0xae4a, 0xae4b, 0xaf55, 0xaf5a, + /* 0x5a */ + 0xaf5e, 0xaf5f, 0xaf59, 0xaf5b, 0xaf58, 0xaf54, 0xafe8, 0xafeb, + 0xafec, 0xb013, 0xb166, 0xb16b, 0xb162, 0xb169, 0xb163, 0xb15f, + 0xb14e, 0xb248, 0xb24a, 0xb3e3, 0xb3db, 0xb3d8, 0xb3d6, 0xb586, + 0xb590, 0xb591, 0xb588, 0xb594, 0xb583, 0x17b2, 0xb59c, 0xb58d, + 0xb585, 0xb698, 0xb69a, 0xb69c, 0xb6e7, 0xb7c5, 0xb7d0, 0xb7d1, + 0xb819, 0xb827, 0x181d, 0xb854, 0xb92d, 0xb922, 0x182d, 0xb91f, + 0xbabd, 0xbaae, 0xbabb, 0xbaad, 0xbabc, 0xbab9, 0xbab4, 0xbacb, + 0xbab7, 0xbab3, 0xbaba, 0xbab6, 0xbacd, 0xbabe, 0xbac9, 0xc50b, + 0xbd5f, 0xbd3b, 0xbd61, 0xbd5c, 0xbd8a, 0xbd5a, 0xbd4d, 0xbd46, + 0xbd44, 0xbd3d, 0xbd40, 0xbd3c, 0xbd8c, 0xbd41, 0xbd4c, 0xbd3e, + 0xbd4a, 0xbe7c, 0xbe7a, 0xbf65, 0xbf6e, 0xbf69, 0xbf6a, 0xbf6f, + 0xbf6c, 0xbf70, 0xbf68, 0xbf6b, 0x1945, 0xbfac, + /* 0x5b */ + 0xbfde, 0xbfdd, 0xbfdc, 0x63c5, 0xc08c, 0xc083, 0xc082, 0xc088, + 0xc085, 0xc081, 0xc0f5, 0xc0ef, 0xc0f4, 0xc0f2, 0xc0f6, 0xc0f3, + 0xc0f0, 0xc0f1, 0xc12b, 0xc127, 0xc128, 0xc16c, 0xc1ae, 0xc20e, + 0xc21b, 0xc216, 0xc21f, 0xc222, 0xc220, 0xc221, 0xc214, 0xc213, + 0xc29d, 0xc29c, 0xc29e, 0xc29f, 0x2e6b, 0x32c8, 0x3878, 0x3876, + 0x3870, 0x3871, 0x3b0a, 0x3e2c, 0x4711, 0x487e, 0x4c57, 0x4c66, + 0x4c69, 0x4c67, 0x4c68, 0x4c71, 0x4c6f, 0xbfae, 0x508b, 0x5096, + 0x5235, 0x523a, 0x526b, 0x5516, 0x5943, 0x5946, 0x593f, 0x593b, + 0x593d, 0x5ab1, 0x5ab2, 0x5be4, 0x5d40, 0x615d, 0x6151, 0x614d, + 0x614c, 0x615b, 0x63d4, 0x63d2, 0x63ca, 0x63c8, 0x63d0, 0x63c9, + 0x6449, 0x64a4, 0x6612, 0x660f, 0x6611, 0x67db, 0x67dd, 0x67dc, + 0x69d4, 0x6a21, 0x6ab2, 0x6c04, 0x6c02, 0x6e11, + /* 0x5c */ + 0x6e16, 0x6e10, 0x6ebe, 0x8e1a, 0x714c, 0x714a, 0x73f2, 0x73f1, + 0x752a, 0x752c, 0x752f, 0x7531, 0x7711, 0x7712, 0x784b, 0x7bdb, + 0x7bd6, 0x7bdd, 0x7be2, 0x7be4, 0x7be0, 0x7bdf, 0x7be3, 0x7d6e, + 0x7d71, 0x7fe9, 0x7fea, 0x8063, 0x81eb, 0x81ea, 0x86bd, 0x86bb, + 0x86c6, 0x86cc, 0x86c8, 0x63cf, 0x86c9, 0x86ca, 0x86cf, 0x86d0, + 0x87ba, 0x87fb, 0x8803, 0x88c4, 0x8d49, 0x8d53, 0x8d36, 0x8d4a, + 0x8d41, 0x8d4e, 0x8d19, 0x8d4d, 0x8d45, 0x8d4c, 0x8d47, 0x8d48, + 0x8d4f, 0x8d37, 0x8d42, 0x914a, 0x9146, 0x120a, 0x9149, 0x914f, + 0x9151, 0x914c, 0x120c, 0x9206, 0x9551, 0x977a, 0x9783, 0x977e, + 0x977f, 0x9780, 0x6ab5, 0x9891, 0x9894, 0x9895, 0x9921, 0x9920, + 0x9a3d, 0x9a40, 0x9a46, 0x9a84, 0x9bac, 0x9bad, 0x142e, 0x9dda, + 0x9dd9, 0x9fe2, 0x9fe1, 0x9fe3, 0x9fe4, 0x9fde, + /* 0x5d */ + 0x9fdf, 0xa241, 0xa259, 0xa25c, 0xa25a, 0xa3e8, 0xa4f6, 0xa4fc, + 0xa4f7, 0xa4fa, 0xa4f9, 0xa7c4, 0xa7be, 0xa7d2, 0xa7bd, 0xa795, + 0xa7d4, 0xa9e4, 0xac61, 0xac62, 0xac63, 0xac64, 0xac60, 0xac5c, + 0xac5d, 0xac5e, 0xada5, 0xada6, 0xae4c, 0xaf68, 0xaf6e, 0xaf71, + 0xaf6b, 0xaf6f, 0xafee, 0xaff1, 0xaff0, 0xafef, 0xb015, 0xb014, + 0xab6e, 0xb047, 0xb17c, 0xb17a, 0xb174, 0xb176, 0xb16e, 0xb178, + 0xb16d, 0xb16c, 0xb24e, 0xb3d7, 0xb3ea, 0xb3e5, 0xb464, 0xb5b3, + 0xb5a3, 0xb5a5, 0xb5a7, 0xb5a2, 0xb59f, 0xb5a6, 0xb59e, 0xb5a8, + 0xb6a9, 0xb6a6, 0xb6aa, 0xb6ab, 0xb6a0, 0xb6a1, 0xb6a8, 0xb6e8, + 0xb6e9, 0xb6ea, 0xb7e4, 0xb7df, 0xb7e0, 0xb828, 0xb85d, 0xb85b, + 0xb856, 0xb857, 0xb85f, 0xb862, 0xbae1, 0xbae3, 0xbade, 0xbad9, + 0xbae8, 0xbaf2, 0xbaf6, 0xbae6, 0xbaf4, 0xbaf5, + /* 0x5e */ + 0xbae5, 0xbae2, 0x188d, 0xbd96, 0xbdaa, 0xbd97, 0xbd70, 0xbda1, + 0xbd9d, 0xbda9, 0xbd6f, 0xbd7e, 0xbd94, 0xbd9a, 0xbd73, 0xbd87, + 0xbd71, 0xbd77, 0xbd88, 0xbd8d, 0xbd85, 0xbd78, 0xbdad, 0xbe80, + 0xbe81, 0xbee5, 0xbee7, 0xbf7c, 0xbfaf, 0xbfe1, 0xc096, 0xc0a3, + 0xc090, 0xc0f8, 0xc12e, 0xc175, 0xc17e, 0xc17d, 0xc17b, 0xc178, + 0xc1b0, 0xc234, 0xc236, 0xc230, 0xc51d, 0xc22e, 0xc237, 0x34ce, + 0x3597, 0x3598, 0x387c, 0x387e, 0x387d, 0x387f, 0x3b0f, 0x3ca4, + 0x3e31, 0x3e2e, 0x3e2f, 0x3e32, 0x422c, 0x43d4, 0x43dc, 0x43d8, + 0x440e, 0x4583, 0x4584, 0x4712, 0x4c72, 0x4c7c, 0x4c7e, 0x50a6, + 0x50a0, 0x509e, 0x50a2, 0x532a, 0x5518, 0x594d, 0x5958, 0x595b, + 0x7714, 0xc3f2, 0x5be6, 0x6164, 0x6168, 0x6160, 0x6162, 0x63d7, + 0x644b, 0x67e0, 0x6a22, 0x6c05, 0x6e19, 0x6e1a, + /* 0x5f */ + 0x6ec3, 0x6fd8, 0x6fdc, 0x714f, 0x73f7, 0x73f4, 0x73f8, 0x7713, + 0x7850, 0x7bf0, 0x7be9, 0x7bef, 0x7bed, 0x7bea, 0x7bf8, 0x7c05, + 0x7bf2, 0x7d72, 0x0f31, 0x7ff9, 0x7ff3, 0x7ff6, 0x7ff2, 0x7ff7, + 0x8066, 0x8065, 0x8140, 0xc477, 0x86d1, 0x86d3, 0x8804, 0x8d59, + 0x8d60, 0x8d5b, 0x8d5d, 0x8d5e, 0x8d69, 0x8d5c, 0x8d61, 0x8d6a, + 0x8d5f, 0x914e, 0x915c, 0x9160, 0x9163, 0x91db, 0x93ca, 0x93c9, + 0x93c8, 0x94a5, 0x94a3, 0x978e, 0x9787, 0x9789, 0x9785, 0x9786, + 0x978f, 0x978a, 0x9790, 0x9898, 0x989b, 0x9a47, 0x9a49, 0x9a48, + 0x9de5, 0x9dea, 0x9ded, 0x9ff0, 0x9fef, 0x9ff2, 0x9fec, 0xa040, + 0xa260, 0xa25f, 0xa3eb, 0xa3ec, 0xa500, 0xa501, 0xa7e2, 0xa7df, + 0xa7e0, 0xa7e1, 0xa7e3, 0xa8c3, 0xa9eb, 0xa9ea, 0xab61, 0xab71, + 0xac6b, 0xac68, 0xac69, 0xac67, 0xadb0, 0xadb1, + /* 0x60 */ + 0xadb2, 0xae51, 0xaf74, 0xb17f, 0xb184, 0xb253, 0xb254, 0xb3f0, + 0xb3f4, 0xb3f1, 0xb437, 0xb5bf, 0x17bc, 0x17bb, 0xb5bd, 0xb5be, + 0xb5b7, 0xb5c0, 0xb5ba, 0xb5b8, 0xb5bc, 0xb5bb, 0xb6eb, 0xb7e7, + 0xb81d, 0xb81c, 0xb863, 0x484b, 0xb938, 0xb936, 0xb934, 0xb937, + 0xbb06, 0xbb1c, 0xbb02, 0xbb1d, 0xbb1e, 0xbae0, 0xbb11, 0xbb18, + 0xbb21, 0xbb20, 0xbb10, 0xbdbd, 0xbdae, 0xbdb5, 0xbdb8, 0xbdb9, + 0xbdbe, 0xbdc4, 0xbdbc, 0xbdba, 0xbe83, 0xbeea, 0xbeec, 0xbf7e, + 0xbf7b, 0xbfe5, 0xc0a7, 0xc09e, 0xc09a, 0xc12f, 0xc131, 0xc183, + 0xc1b5, 0xc246, 0xc241, 0xc243, 0xc23d, 0xc242, 0xc23b, 0xc247, + 0x336b, 0x33d0, 0x388e, 0x4011, 0xc371, 0xc389, 0x484c, 0x532b, + 0x594f, 0x595e, 0x5963, 0x596b, 0x5a3f, 0x5be9, 0x616d, 0x616b, + 0x616a, 0xbb2a, 0x63e0, 0x63dd, 0x63e1, 0x63de, + /* 0x61 */ + 0x63dc, 0x644d, 0x6616, 0x67e3, 0x69e5, 0x69e4, 0x6e1d, 0x754b, + 0xc2c1, 0x784e, 0x78d6, 0x7bfd, 0x7c07, 0x7bfe, 0x7c03, 0x7c0b, + 0x7bff, 0x7d7a, 0x7d77, 0x7ffb, 0x8143, 0x81ed, 0x87bc, 0x63df, + 0x8805, 0x88c6, 0x88c5, 0x8d74, 0x8d73, 0x8d72, 0x8d78, 0x9173, + 0x917a, 0x6e1c, 0x9176, 0x9175, 0x9177, 0x93cf, 0x93ce, 0x93cd, + 0x94a8, 0x9798, 0x9792, 0x9794, 0x989a, 0x9bb4, 0x9deb, 0x9df4, + 0x9df3, 0x9dee, 0x9df2, 0x9df0, 0xa264, 0xa805, 0xa7fb, 0xa7fc, + 0xa9f3, 0xac6c, 0xadba, 0xaf79, 0xaf7e, 0xaf78, 0xaff4, 0xb016, + 0xb257, 0xb5c8, 0xb5c3, 0xb5ce, 0xb6b3, 0xb6ed, 0xb6ee, 0xb7f1, + 0xb7f8, 0x1814, 0xb864, 0xb865, 0xbb35, 0xbb29, 0xbb2c, 0xbb31, + 0xbb2b, 0xbb2e, 0xbb25, 0xbdda, 0xbde0, 0xbdd4, 0xbde1, 0xbddd, + 0xbfe7, 0xc012, 0xc0ae, 0xc0af, 0xc186, 0xc185, + /* 0x62 */ + 0xc1d1, 0xc258, 0xc23f, 0xc252, 0xc24b, 0xc253, 0xc250, 0xc256, + 0xc257, 0xc2cd, 0xc2cb, 0x3231, 0x3230, 0x33d1, 0x021c, 0x3892, + 0x3890, 0x388f, 0x3893, 0x3891, 0x0372, 0x4713, 0x487f, 0x50ac, + 0x6170, 0x63e5, 0x6a23, 0x6a24, 0x6c08, 0x6c07, 0x6e1f, 0x6e20, + 0x6e21, 0x6fe1, 0x7154, 0x7157, 0x7155, 0x73fa, 0x7538, 0x8d86, + 0x7537, 0x7853, 0x7d7e, 0x7d7b, 0xc471, 0x7ffd, 0x7ffc, 0x8146, + 0x8732, 0x88c7, 0x8d71, 0x8d83, 0x8d6f, 0x8d7e, 0x8d7d, 0x8d81, + 0x8d7c, 0x918a, 0x917e, 0x9180, 0x917d, 0x917f, 0x9182, 0x93d4, + 0x93d0, 0x93d2, 0x9555, 0x979b, 0x979a, 0x9a4e, 0x9df1, 0x9ff8, + 0x9ffd, 0xa25e, 0xa266, 0xa505, 0xa80a, 0xa80b, 0xa80e, 0xa80d, + 0xa811, 0xa809, 0xa810, 0xa80c, 0xa812, 0xa8c4, 0xa9f7, 0xa9f8, + 0xab6a, 0xab6b, 0xadc0, 0xadc2, 0xaf85, 0xaf80, + /* 0x63 */ + 0xaf84, 0xaf81, 0xadc4, 0xb18b, 0xb18d, 0xb18e, 0xb6b7, 0xb6b9, + 0xb6ef, 0xb7fb, 0xb7ff, 0xb867, 0xb868, 0xb869, 0xb93f, 0xbb3c, + 0xbb4c, 0xbb3d, 0xbb3e, 0xbb3f, 0xbb3b, 0xbdff, 0x190e, 0xbdf6, + 0xbdee, 0xbdfc, 0xbdf8, 0xbe01, 0xbdfa, 0xbe88, 0xbf80, 0xc011, + 0xc0fe, 0xc100, 0xc135, 0x6f3c, 0xc1bd, 0xc1bb, 0xc25c, 0xc25a, + 0xc2d1, 0xc2d0, 0x340b, 0x5973, 0x3e39, 0x401a, 0x43e3, 0x4587, + 0x4777, 0x4778, 0x50b1, 0x596a, 0x5974, 0x5beb, 0x617b, 0x64a5, + 0x67e4, 0x6c0b, 0x6c0e, 0x6c0c, 0x7539, 0x7c10, 0x7c11, 0x7c16, + 0x7d81, 0x7d80, 0x7ffe, 0x8001, 0x8000, 0x8147, 0x81ef, 0x8d88, + 0x918b, 0x918d, 0x9187, 0x9185, 0x918f, 0x9184, 0x9188, 0x918e, + 0x918c, 0x93d7, 0x93d6, 0x979f, 0x4588, 0x9e03, 0x9ffe, 0xa3ef, + 0xa509, 0xa508, 0xa820, 0xa824, 0xa81f, 0xac70, + /* 0x64 */ + 0xae56, 0xaff7, 0xaff8, 0xaff6, 0xb190, 0xb25e, 0xb3f7, 0xb5d6, + 0xb5d5, 0xb6bb, 0xb6f0, 0xb801, 0xb86c, 0xb941, 0xb942, 0xbb4f, + 0xbb53, 0xbb58, 0xbe12, 0xbe04, 0xbe13, 0xbe05, 0xbe0d, 0xbf82, + 0xbf81, 0xc0b5, 0xc0ba, 0xc1be, 0xc265, 0xc263, 0xc26e, 0xc26a, + 0xc26c, 0xc2c4, 0x336c, 0x97a5, 0x4012, 0x484d, 0x551f, 0x5977, + 0x5978, 0x5d44, 0x617c, 0x63eb, 0x63ea, 0x63ec, 0x64a7, 0x6619, + 0x6e23, 0x2074, 0x7401, 0x7c1c, 0x8003, 0x8148, 0x86da, 0x8d91, + 0x8d92, 0x9196, 0x9197, 0x9191, 0x9193, 0x93d8, 0x93d5, 0x9557, + 0x9558, 0x97a2, 0x9e05, 0x9ffa, 0xa50c, 0xa50a, 0xa82e, 0xa829, + 0xa82f, 0xa8c5, 0xac72, 0xadc8, 0xae5a, 0xae59, 0xaf89, 0xaf88, + 0xb5db, 0xb5d9, 0xb5da, 0xb6bc, 0x17ec, 0xb806, 0xb805, 0xb86f, + 0xb86d, 0xb870, 0xbb60, 0xbb5e, 0xbb63, 0xbb5a, + /* 0x65 */ + 0xbb5f, 0xbe19, 0xbe1d, 0xbe1b, 0xbe22, 0xbe1c, 0xbe1e, 0xbef7, + 0xbf84, 0xc015, 0xc0b8, 0xc0c1, 0xc101, 0xc10a, 0xc1d2, 0xc275, + 0xc274, 0xc272, 0x34d0, 0x401b, 0x4410, 0x4779, 0x63ed, 0x6ab9, + 0x6e24, 0x6ec5, 0x7403, 0x814a, 0x86f7, 0x87c1, 0x87c2, 0x8d94, + 0x9199, 0x919a, 0x955a, 0x97a8, 0x9825, 0x989e, 0xa041, 0xa832, + 0xa833, 0xadcb, 0xadca, 0xadcc, 0xb193, 0xb5e0, 0xb871, 0xbb6b, + 0xbe2b, 0xbe29, 0xbe1a, 0xbe26, 0xbe27, 0xbe2a, 0xbef8, 0x6f3d, + 0xc276, 0x3b18, 0x597a, 0x617f, 0x0e79, 0x81f0, 0x8d9a, 0x8d96, + 0x919e, 0x919d, 0x91dc, 0x93da, 0x9e0b, 0xa002, 0xa042, 0xa267, + 0xaf8b, 0xb5e2, 0xbb71, 0xbe2f, 0xbe2e, 0xc0c6, 0xc18e, 0xc27b, + 0xc277, 0xc278, 0xc27c, 0x597c, 0x8007, 0x8d97, 0x97d9, 0xa50d, + 0xa50e, 0xb5e3, 0xb5e4, 0xb6f3, 0xb875, 0xbe37, + /* 0x66 */ + 0xbe35, 0xc18f, 0xc280, 0xc27f, 0xc2d4, 0x50b4, 0xbfec, 0xab75, + 0x6c10, 0x8069, 0x91a4, 0x93db, 0xadd1, 0xaf8d, 0xbb76, 0xbe39, + 0xc284, 0xc282, 0x34d2, 0x63ee, 0x6c11, 0x7d84, 0xab74, 0xaf8f, + 0xaf8e, 0xbe3b, 0x32cb, 0xc288, 0xc286, 0x555c, 0x71a4, 0xac75, + 0xc28b, 0x3b19, 0x989f, 0xb5e5, 0xbe40, 0x6c12, 0xbefb, 0xc28c, + 0x71a5, 0xb877, 0xb878, 0xc2d6, 0x93df, 0xadd2, 0x3b1a, 0x97a9, + 0xadd3, 0xc0ca, 0x87c4, 0x94b1, 0xb264, +}; + +static const ucs4_t cns11643_7_2uni_upages[198] = { + 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, + 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, + 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, + 0x04c00, 0x04d00, 0x05600, 0x05800, 0x06100, 0x06400, 0x06700, 0x07100, + 0x07600, 0x07c00, 0x07f00, 0x08100, 0x08600, 0x08d00, 0x08f00, 0x09300, + 0x09500, 0x09a00, 0x0ff00, 0x20000, 0x20100, 0x20300, 0x20400, 0x20500, + 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20f00, 0x21000, + 0x21100, 0x21200, 0x21400, 0x21500, 0x21600, 0x21800, 0x21900, 0x21a00, + 0x21b00, 0x21c00, 0x21d00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, + 0x22400, 0x22500, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22c00, 0x22d00, + 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23500, 0x23600, + 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23e00, 0x23f00, + 0x24000, 0x24100, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, 0x24800, + 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, + 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, + 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, + 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, + 0x26a00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, + 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, + 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, + 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, + 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, + 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, + 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, + 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, +}; + +static int +cns11643_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x66)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 6539) + swc = cns11643_7_2uni_page21[i], + wc = cns11643_7_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/cns11643_inv.h b/Externals/libiconv-1.14/lib/cns11643_inv.h new file mode 100644 index 0000000000..3a7c379a15 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cns11643_inv.h @@ -0,0 +1,15412 @@ +/* + * Copyright (C) 1999-2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CNS 11643-1992 planes 1-7, CNS 11643-1986 plane 15 + */ + +static const unsigned char cns11643_inv_2charset[3*55442] = { + 0x1,0x21,0x70, 0x1,0x22,0x78, 0x1,0x22,0x34, 0x1,0x21,0x31, + 0x1,0x22,0x32, 0x1,0x22,0x33, 0x1,0x25,0x6f, 0x1,0x25,0x6d, + 0x1,0x25,0x6e, 0x1,0x25,0x70, 0x1,0x25,0x6c, 0x1,0x24,0x75, + 0x1,0x24,0x76, 0x1,0x24,0x77, 0x1,0x24,0x78, 0x1,0x24,0x79, + 0x1,0x24,0x7a, 0x1,0x24,0x7b, 0x1,0x24,0x7c, 0x1,0x24,0x7d, + 0x1,0x24,0x7e, 0x1,0x25,0x21, 0x1,0x25,0x22, 0x1,0x25,0x23, + 0x1,0x25,0x24, 0x1,0x25,0x25, 0x1,0x25,0x26, 0x1,0x25,0x27, + 0x1,0x25,0x28, 0x1,0x25,0x29, 0x1,0x25,0x2a, 0x1,0x25,0x2b, + 0x1,0x25,0x2c, 0x1,0x25,0x2d, 0x1,0x25,0x2e, 0x1,0x25,0x2f, + 0x1,0x25,0x30, 0x1,0x25,0x31, 0x1,0x25,0x32, 0x1,0x25,0x33, + 0x1,0x25,0x34, 0x1,0x25,0x35, 0x1,0x25,0x36, 0x1,0x25,0x37, + 0x1,0x25,0x38, 0x1,0x25,0x39, 0x1,0x25,0x3a, 0x1,0x25,0x3b, + 0x1,0x25,0x3c, 0x1,0x25,0x3d, 0x1,0x25,0x3e, 0x1,0x25,0x3f, + 0x1,0x25,0x40, 0x1,0x25,0x41, 0x1,0x25,0x42, 0x1,0x25,0x43, + 0x1,0x25,0x44, 0x1,0x25,0x45, 0x1,0x25,0x46, 0x1,0x21,0x39, + 0x1,0x21,0x37, 0x1,0x22,0x5d, 0x1,0x21,0x64, 0x1,0x21,0x65, + 0x1,0x21,0x66, 0x1,0x21,0x67, 0x1,0x21,0x2d, 0x1,0x21,0x2c, + 0x1,0x21,0x6a, 0x1,0x21,0x6b, 0x1,0x21,0x6f, 0x1,0x22,0x23, + 0x1,0x42,0x42, 0x1,0x22,0x6a, 0x1,0x22,0x22, 0x1,0x22,0x6b, + 0x1,0x24,0x2b, 0x1,0x24,0x2c, 0x1,0x24,0x2d, 0x1,0x24,0x2e, + 0x1,0x24,0x2f, 0x1,0x24,0x30, 0x1,0x24,0x31, 0x1,0x24,0x32, + 0x1,0x24,0x33, 0x1,0x24,0x34, 0x1,0x26,0x35, 0x1,0x26,0x36, + 0x1,0x26,0x37, 0x1,0x26,0x38, 0x1,0x26,0x39, 0x1,0x26,0x3a, + 0x1,0x26,0x3b, 0x1,0x26,0x3c, 0x1,0x26,0x3d, 0x1,0x26,0x3e, + 0x1,0x22,0x58, 0x1,0x22,0x55, 0x1,0x22,0x57, 0x1,0x22,0x56, + 0x1,0x22,0x59, 0x1,0x22,0x5a, 0x1,0x22,0x5c, 0x1,0x22,0x5b, + 0x1,0x22,0x61, 0x1,0x22,0x35, 0x1,0x22,0x3c, 0x1,0x22,0x49, + 0x1,0x22,0x48, 0x1,0x22,0x45, 0x1,0x22,0x46, 0x1,0x22,0x4d, + 0x1,0x22,0x4e, 0x1,0x22,0x50, 0x1,0x22,0x4f, 0x1,0x22,0x44, + 0x1,0x22,0x3d, 0x1,0x22,0x3b, 0x1,0x22,0x3e, 0x1,0x22,0x39, + 0x1,0x22,0x3a, 0x1,0x22,0x47, 0x1,0x22,0x4a, 0x1,0x42,0x21, + 0x1,0x42,0x22, 0x1,0x42,0x23, 0x1,0x42,0x24, 0x1,0x42,0x25, + 0x1,0x42,0x26, 0x1,0x42,0x27, 0x1,0x42,0x28, 0x1,0x42,0x29, + 0x1,0x42,0x2a, 0x1,0x42,0x2b, 0x1,0x42,0x2c, 0x1,0x42,0x2d, + 0x1,0x42,0x2e, 0x1,0x42,0x2f, 0x1,0x42,0x30, 0x1,0x42,0x31, + 0x1,0x42,0x32, 0x1,0x42,0x33, 0x1,0x42,0x34, 0x1,0x42,0x35, + 0x1,0x42,0x36, 0x1,0x42,0x37, 0x1,0x42,0x38, 0x1,0x42,0x39, + 0x1,0x42,0x3a, 0x1,0x42,0x3b, 0x1,0x42,0x3c, 0x1,0x42,0x3d, + 0x1,0x42,0x3e, 0x1,0x42,0x3f, 0x1,0x42,0x40, 0x1,0x42,0x41, + 0x1,0x26,0x21, 0x1,0x26,0x22, 0x1,0x26,0x23, 0x1,0x26,0x24, + 0x1,0x26,0x25, 0x1,0x26,0x26, 0x1,0x26,0x27, 0x1,0x26,0x28, + 0x1,0x26,0x29, 0x1,0x26,0x2a, 0x1,0x26,0x2b, 0x1,0x26,0x2c, + 0x1,0x26,0x2d, 0x1,0x26,0x2e, 0x1,0x26,0x2f, 0x1,0x26,0x30, + 0x1,0x26,0x31, 0x1,0x26,0x32, 0x1,0x26,0x33, 0x1,0x26,0x34, + 0x1,0x23,0x39, 0x1,0x23,0x3a, 0x1,0x23,0x3c, 0x1,0x23,0x3d, + 0x1,0x23,0x3e, 0x1,0x23,0x3f, 0x1,0x23,0x37, 0x1,0x23,0x36, + 0x1,0x23,0x35, 0x1,0x23,0x34, 0x1,0x23,0x33, 0x1,0x23,0x44, + 0x1,0x23,0x45, 0x1,0x23,0x47, 0x1,0x23,0x46, 0x1,0x23,0x40, + 0x1,0x23,0x41, 0x1,0x23,0x43, 0x1,0x23,0x42, 0x1,0x23,0x4c, + 0x1,0x23,0x4d, 0x1,0x23,0x4e, 0x1,0x23,0x24, 0x1,0x23,0x25, + 0x1,0x23,0x26, 0x1,0x23,0x27, 0x1,0x23,0x28, 0x1,0x23,0x29, + 0x1,0x23,0x2a, 0x1,0x23,0x2b, 0x1,0x23,0x32, 0x1,0x23,0x31, + 0x1,0x23,0x30, 0x1,0x23,0x2f, 0x1,0x23,0x2e, 0x1,0x23,0x2d, + 0x1,0x23,0x2c, 0x1,0x23,0x38, 0x1,0x23,0x3b, 0x1,0x21,0x7c, + 0x1,0x21,0x7b, 0x1,0x21,0x75, 0x1,0x21,0x74, 0x1,0x21,0x7e, + 0x1,0x21,0x7d, 0x1,0x21,0x7a, 0x1,0x21,0x79, 0x1,0x21,0x72, + 0x1,0x21,0x76, 0x1,0x21,0x73, 0x1,0x23,0x48, 0x1,0x23,0x49, + 0x1,0x23,0x4b, 0x1,0x23,0x4a, 0x1,0x21,0x78, 0x1,0x21,0x77, + 0x1,0x22,0x54, 0x1,0x22,0x51, 0x1,0x22,0x53, 0x1,0x22,0x52, + 0x1,0x21,0x21, 0x1,0x21,0x23, 0x1,0x21,0x24, 0x1,0x21,0x71, + 0x1,0x21,0x52, 0x1,0x21,0x53, 0x1,0x21,0x4e, 0x1,0x21,0x4f, + 0x1,0x21,0x56, 0x1,0x21,0x57, 0x1,0x21,0x5a, 0x1,0x21,0x5b, + 0x1,0x21,0x4a, 0x1,0x21,0x4b, 0x1,0x22,0x65, 0x1,0x21,0x46, + 0x1,0x21,0x47, 0x1,0x21,0x68, 0x1,0x21,0x69, 0x1,0x24,0x35, + 0x1,0x24,0x36, 0x1,0x24,0x37, 0x1,0x24,0x38, 0x1,0x24,0x39, + 0x1,0x24,0x3a, 0x1,0x24,0x3b, 0x1,0x24,0x3c, 0x1,0x24,0x3d, + 0x1,0x21,0x26, 0x1,0x25,0x47, 0x1,0x25,0x48, 0x1,0x25,0x49, + 0x1,0x25,0x4a, 0x1,0x25,0x4b, 0x1,0x25,0x4c, 0x1,0x25,0x4d, + 0x1,0x25,0x4e, 0x1,0x25,0x4f, 0x1,0x25,0x50, 0x1,0x25,0x51, + 0x1,0x25,0x52, 0x1,0x25,0x53, 0x1,0x25,0x54, 0x1,0x25,0x55, + 0x1,0x25,0x56, 0x1,0x25,0x57, 0x1,0x25,0x58, 0x1,0x25,0x59, + 0x1,0x25,0x5a, 0x1,0x25,0x5b, 0x1,0x25,0x5c, 0x1,0x25,0x5d, + 0x1,0x25,0x5e, 0x1,0x25,0x5f, 0x1,0x25,0x60, 0x1,0x25,0x61, + 0x1,0x25,0x62, 0x1,0x25,0x63, 0x1,0x25,0x64, 0x1,0x25,0x65, + 0x1,0x25,0x66, 0x1,0x25,0x67, 0x1,0x25,0x68, 0x1,0x25,0x69, + 0x1,0x25,0x6a, 0x1,0x25,0x6b, 0x1,0x22,0x21, 0x1,0x22,0x75, + 0x1,0x22,0x76, 0x1,0x22,0x70, 0x1,0x22,0x71, 0x1,0x22,0x72, + 0x1,0x22,0x74, 0x1,0x22,0x77, 0x1,0x22,0x73, 0x1,0x22,0x4c, + 0x1,0x22,0x4b, 0x1,0x22,0x6f, 0x6,0x22,0x2c, 0x4,0x22,0x24, + 0x6,0x21,0x30, 0x6,0x21,0x23, 0xf,0x21,0x6c, 0x4,0x21,0x57, + 0x4,0x23,0x36, 0x4,0x28,0x35, 0x3,0x34,0x3b, 0x3,0x39,0x6d, + 0x3,0x27,0x41, 0x3,0x28,0x6c, 0x3,0x23,0x23, 0x4,0x23,0x37, + 0x4,0x25,0x34, 0x3,0x40,0x34, 0x4,0x21,0x59, 0x3,0x21,0x75, + 0x3,0x21,0x6e, 0x3,0x21,0x71, 0x3,0x21,0x73, 0xf,0x21,0x44, + 0x6,0x23,0x4e, 0x3,0x22,0x71, 0x4,0x22,0x31, 0x3,0x22,0x69, + 0x3,0x22,0x6a, 0xf,0x21,0x72, 0x5,0x23,0x34, 0x3,0x24,0x4a, + 0x3,0x24,0x47, 0x3,0x24,0x4d, 0x6,0x25,0x71, 0x3,0x27,0x46, + 0x5,0x25,0x25, 0x4,0x25,0x39, 0x4,0x25,0x3c, 0x3,0x27,0x45, + 0x5,0x25,0x2b, 0x4,0x25,0x3b, 0x4,0x25,0x38, 0x3,0x27,0x50, + 0xf,0x25,0x4a, 0x3,0x2b,0x31, 0x6,0x2e,0x5a, 0x4,0x28,0x39, + 0x3,0x2b,0x30, 0x5,0x28,0x21, 0x4,0x28,0x3a, 0x3,0x2b,0x2a, + 0x4,0x28,0x37, 0x4,0x28,0x3c, 0x5,0x2b,0x6c, 0x3,0x34,0x49, + 0x3,0x2f,0x52, 0x4,0x2b,0x65, 0x6,0x35,0x38, 0x4,0x30,0x45, + 0x3,0x34,0x3e, 0x3,0x34,0x48, 0x4,0x30,0x4a, 0x4,0x36,0x38, + 0x3,0x39,0x73, 0x4,0x36,0x32, 0x4,0x36,0x37, 0x6,0x46,0x55, + 0x6,0x49,0x7b, 0x3,0x39,0x74, 0x3,0x40,0x35, 0x3,0x40,0x38, + 0x3,0x40,0x3b, 0x4,0x3c,0x2c, 0x4,0x3c,0x2d, 0x4,0x3c,0x28, + 0x4,0x3c,0x2a, 0x5,0x44,0x57, 0x4,0x42,0x37, 0x4,0x42,0x33, + 0x4,0x42,0x2e, 0x3,0x45,0x78, 0x6,0x5a,0x73, 0x4,0x42,0x2f, + 0x3,0x45,0x73, 0x4,0x4f,0x59, 0x3,0x45,0x72, 0x3,0x45,0x6f, + 0x3,0x45,0x77, 0x4,0x42,0x32, 0x4,0x48,0x7b, 0x3,0x4b,0x26, + 0x3,0x4b,0x25, 0x4,0x48,0x7d, 0x3,0x4b,0x24, 0x3,0x4b,0x28, + 0x3,0x4b,0x2a, 0x3,0x50,0x32, 0x4,0x4f,0x5d, 0x5,0x53,0x59, + 0x4,0x4f,0x5b, 0x3,0x54,0x3f, 0x3,0x57,0x53, 0x4,0x5a,0x67, + 0x4,0x5a,0x68, 0x4,0x5f,0x49, 0x4,0x63,0x2f, 0x3,0x5c,0x33, + 0x3,0x5c,0x31, 0x7,0x52,0x74, 0x7,0x57,0x4c, 0x4,0x6a,0x41, + 0x3,0x61,0x3c, 0x4,0x22,0x33, 0xf,0x26,0x5a, 0x4,0x2b,0x69, + 0x3,0x57,0x54, 0x3,0x21,0x76, 0x3,0x22,0x79, 0x3,0x24,0x55, + 0x5,0x23,0x37, 0x6,0x25,0x7b, 0x6,0x25,0x7d, 0x3,0x24,0x56, + 0x3,0x2b,0x38, 0x7,0x4d,0x3d, 0x3,0x2a,0x4c, 0x4,0x30,0x4c, + 0x5,0x31,0x26, 0x4,0x36,0x3d, 0x4,0x3c,0x32, 0x4,0x6a,0x42, + 0x3,0x2b,0x3a, 0x3,0x39,0x78, 0x4,0x49,0x22, 0x3,0x21,0x50, + 0x3,0x23,0x21, 0x3,0x24,0x58, 0x5,0x25,0x2e, 0x3,0x27,0x57, + 0x3,0x27,0x56, 0x3,0x27,0x58, 0x4,0x28,0x43, 0x3,0x2b,0x3c, + 0x3,0x2f,0x5d, 0x3,0x2f,0x5c, 0x4,0x30,0x4d, 0x3,0x39,0x7b, + 0x3,0x39,0x7c, 0x4,0x3c,0x34, 0x3,0x45,0x79, 0x5,0x31,0x29, + 0x4,0x21,0x61, 0x6,0x22,0x41, 0x3,0x21,0x7e, 0x4,0x22,0x3c, + 0x5,0x22,0x30, 0x4,0x23,0x3e, 0x4,0x23,0x3f, 0x4,0x25,0x4a, + 0x4,0x25,0x4c, 0x4,0x25,0x48, 0x4,0x25,0x47, 0x3,0x2b,0x41, + 0x3,0x2b,0x45, 0x3,0x2b,0x42, 0x5,0x2b,0x7c, 0x4,0x30,0x53, + 0x3,0x2f,0x67, 0x3,0x2f,0x69, 0x4,0x30,0x57, 0x4,0x30,0x58, + 0x4,0x30,0x52, 0x5,0x31,0x2c, 0x4,0x30,0x54, 0x4,0x30,0x59, + 0x3,0x3a,0x24, 0x6,0x50,0x6c, 0x4,0x36,0x42, 0x4,0x36,0x45, + 0x3,0x3a,0x22, 0x5,0x3d,0x70, 0x3,0x40,0x42, 0x4,0x42,0x41, + 0x4,0x42,0x43, 0x4,0x42,0x42, 0x4,0x42,0x3c, 0x3,0x45,0x7d, + 0x3,0x45,0x7b, 0x4,0x42,0x3f, 0x4,0x42,0x3e, 0x3,0x45,0x7c, + 0x4,0x49,0x23, 0x4,0x4f,0x62, 0x4,0x4f,0x61, 0x4,0x4f,0x63, + 0x5,0x61,0x3b, 0x4,0x55,0x6c, 0x7,0x3e,0x7d, 0x4,0x5f,0x4a, + 0x4,0x63,0x30, 0x4,0x21,0x64, 0x4,0x22,0x40, 0x4,0x23,0x44, + 0x3,0x24,0x64, 0x4,0x25,0x4f, 0x6,0x29,0x6f, 0x6,0x2f,0x27, + 0x4,0x2b,0x75, 0x3,0x2f,0x6b, 0x4,0x30,0x5a, 0x4,0x36,0x4b, + 0x3,0x46,0x22, 0x4,0x55,0x6f, 0x3,0x54,0x43, 0x4,0x55,0x70, + 0x5,0x53,0x63, 0x4,0x5a,0x6e, 0x4,0x30,0x5c, 0x4,0x36,0x4d, + 0x5,0x3d,0x78, 0x6,0x29,0x72, 0x3,0x34,0x53, 0x5,0x70,0x78, + 0x4,0x23,0x4b, 0x6,0x26,0x38, 0x4,0x2b,0x77, 0x3,0x3a,0x25, + 0x6,0x50,0x76, 0x4,0x3c,0x3e, 0x5,0x44,0x6c, 0x4,0x6d,0x53, + 0x6,0x26,0x36, 0x4,0x36,0x50, 0x3,0x21,0x58, 0x6,0x23,0x71, + 0x3,0x23,0x2c, 0x6,0x50,0x7a, 0x3,0x27,0x64, 0x4,0x21,0x2b, + 0x6,0x21,0x3b, 0x6,0x28,0x64, 0x4,0x25,0x56, 0x3,0x23,0x30, + 0x5,0x22,0x3c, 0x3,0x23,0x2e, 0x3,0x24,0x6a, 0x3,0x24,0x69, + 0x3,0x24,0x68, 0x3,0x27,0x68, 0x6,0x2a,0x2a, 0x3,0x2b,0x4c, + 0x3,0x2f,0x70, 0x4,0x2b,0x7a, 0x3,0x2f,0x71, 0x4,0x36,0x51, + 0x6,0x51,0x22, 0x5,0x4c,0x31, 0x3,0x46,0x24, 0x4,0x49,0x27, + 0x3,0x60,0x70, 0x3,0x21,0x5d, 0x3,0x2f,0x72, 0x6,0x3d,0x61, + 0x3,0x34,0x56, 0x4,0x49,0x29, 0x5,0x21,0x41, 0x3,0x21,0x5f, + 0x3,0x23,0x32, 0x4,0x25,0x5a, 0x4,0x28,0x57, 0x3,0x3f,0x78, + 0x3,0x46,0x27, 0x4,0x47,0x56, 0x4,0x21,0x6b, 0x3,0x22,0x30, + 0x3,0x22,0x2c, 0x3,0x23,0x38, 0x3,0x23,0x36, 0x3,0x24,0x6c, + 0x4,0x23,0x51, 0x3,0x24,0x6b, 0x3,0x24,0x71, 0x4,0x23,0x54, + 0x4,0x23,0x59, 0x3,0x24,0x72, 0x4,0x23,0x53, 0x3,0x24,0x6f, + 0x3,0x24,0x6e, 0x3,0x24,0x7a, 0xf,0x23,0x49, 0x3,0x25,0x25, + 0x3,0x27,0x7a, 0x3,0x27,0x6d, 0x4,0x25,0x5d, 0x3,0x27,0x76, + 0x5,0x25,0x42, 0x6,0x2a,0x39, 0x3,0x2b,0x52, 0x3,0x2b,0x60, + 0x3,0x2b,0x5f, 0x3,0x2b,0x62, 0x3,0x2b,0x5a, 0x4,0x28,0x59, + 0x4,0x28,0x5c, 0x3,0x2b,0x56, 0xf,0x29,0x5c, 0x4,0x2c,0x25, + 0x3,0x2f,0x7d, 0x4,0x2b,0x7e, 0x3,0x2f,0x75, 0x3,0x2f,0x7c, + 0x4,0x2c,0x21, 0x4,0x2b,0x7d, 0x6,0x35,0x7d, 0x3,0x30,0x24, + 0x5,0x2c,0x43, 0x3,0x34,0x5d, 0x3,0x34,0x65, 0x4,0x30,0x6a, + 0x5,0x36,0x70, 0x3,0x34,0x63, 0x3,0x34,0x5c, 0x4,0x30,0x70, + 0x3,0x34,0x5a, 0x4,0x30,0x73, 0x4,0x30,0x71, 0x4,0x30,0x6d, + 0x4,0x30,0x6c, 0xf,0x33,0x43, 0x3,0x38,0x53, 0x4,0x30,0x6f, + 0x5,0x36,0x76, 0x3,0x3a,0x32, 0x4,0x36,0x67, 0x3,0x3a,0x35, + 0x3,0x3a,0x2c, 0x4,0x36,0x5e, 0x4,0x36,0x59, 0x3,0x3a,0x39, + 0x3,0x3a,0x3e, 0x3,0x3a,0x2d, 0x4,0x36,0x60, 0x3,0x3a,0x3d, + 0x4,0x36,0x5f, 0x3,0x3a,0x37, 0x6,0x47,0x39, 0x5,0x36,0x79, + 0x5,0x36,0x7a, 0x3,0x3a,0x30, 0x4,0x36,0x58, 0x4,0x36,0x65, + 0x4,0x36,0x63, 0x3,0x3a,0x41, 0x5,0x36,0x6e, 0x3,0x3a,0x3f, + 0x3,0x3a,0x3a, 0x5,0x3e,0x39, 0x4,0x3c,0x4a, 0x4,0x3c,0x46, + 0x3,0x40,0x4f, 0x5,0x3e,0x3d, 0x4,0x3c,0x47, 0x4,0x3c,0x4c, + 0x3,0x40,0x4d, 0x3,0x40,0x50, 0x6,0x51,0x32, 0x4,0x42,0x52, + 0x3,0x46,0x32, 0x3,0x46,0x2f, 0x3,0x46,0x2d, 0x4,0x42,0x4f, + 0x4,0x42,0x4a, 0x4,0x42,0x55, 0x3,0x46,0x2b, 0x3,0x4b,0x3a, + 0x4,0x42,0x53, 0x4,0x42,0x56, 0x4,0x42,0x51, 0x5,0x45,0x22, + 0x4,0x49,0x30, 0x4,0x49,0x2c, 0x3,0x4b,0x42, 0x4,0x49,0x2d, + 0x3,0x4b,0x36, 0x7,0x21,0x4e, 0x4,0x4f,0x6b, 0x4,0x4f,0x6c, + 0x3,0x50,0x41, 0x4,0x4f,0x67, 0x4,0x4f,0x6a, 0x4,0x4f,0x6f, + 0x3,0x50,0x3c, 0x3,0x50,0x3a, 0x7,0x37,0x37, 0x4,0x55,0x72, + 0x3,0x54,0x46, 0x4,0x55,0x73, 0x4,0x4f,0x6d, 0x5,0x61,0x40, + 0x4,0x5a,0x70, 0x3,0x57,0x56, 0x5,0x61,0x45, 0x4,0x5f,0x4c, + 0x5,0x67,0x59, 0x5,0x6b,0x73, 0x3,0x5c,0x35, 0x3,0x5e,0x27, + 0x4,0x66,0x32, 0x3,0x60,0x2e, 0x3,0x60,0x2d, 0x4,0x6c,0x6c, + 0x7,0x62,0x2f, 0x3,0x22,0x32, 0x3,0x22,0x21, 0x3,0x23,0x3d, + 0x5,0x25,0x53, 0x3,0x27,0x7e, 0x3,0x2b,0x64, 0x3,0x30,0x26, + 0x4,0x42,0x58, 0x4,0x63,0x32, 0x3,0x22,0x33, 0x3,0x25,0x2e, + 0x4,0x23,0x5f, 0x3,0x25,0x39, 0x3,0x25,0x3a, 0x4,0x23,0x5e, + 0x3,0x25,0x3d, 0x3,0x25,0x3f, 0x3,0x25,0x3b, 0x3,0x25,0x34, + 0x3,0x28,0x27, 0x4,0x25,0x6d, 0x3,0x28,0x2b, 0x3,0x28,0x2c, + 0x3,0x2b,0x76, 0x6,0x2f,0x65, 0x3,0x2b,0x74, 0x3,0x2b,0x75, + 0x3,0x2b,0x73, 0x3,0x2b,0x6f, 0x3,0x30,0x29, 0x4,0x2c,0x2f, + 0x4,0x2c,0x31, 0x3,0x30,0x2d, 0x3,0x30,0x2c, 0x3,0x30,0x2e, + 0x3,0x30,0x31, 0x3,0x34,0x6c, 0x3,0x34,0x6d, 0x3,0x34,0x73, + 0x3,0x34,0x6a, 0xf,0x33,0x57, 0x4,0x31,0x21, 0x4,0x36,0x6b, + 0x3,0x3a,0x46, 0x4,0x36,0x6e, 0x3,0x3a,0x51, 0x6,0x47,0x4e, + 0x3,0x3a,0x48, 0x3,0x3a,0x4d, 0x4,0x3c,0x59, 0x4,0x3c,0x5b, + 0x3,0x40,0x53, 0x3,0x40,0x55, 0x4,0x3c,0x56, 0x4,0x3c,0x58, + 0x4,0x42,0x5e, 0x4,0x42,0x5d, 0x4,0x42,0x5b, 0x3,0x46,0x3b, + 0x4,0x42,0x5f, 0x3,0x46,0x39, 0x7,0x21,0x6a, 0x3,0x4b,0x52, + 0x3,0x4b,0x48, 0x4,0x49,0x33, 0x3,0x4b,0x4a, 0x3,0x4b,0x4e, + 0xf,0x4e,0x25, 0xf,0x4e,0x2e, 0x4,0x49,0x2a, 0x3,0x50,0x44, + 0x4,0x4f,0x78, 0x3,0x50,0x47, 0x3,0x50,0x42, 0x3,0x50,0x43, + 0x3,0x50,0x46, 0x3,0x50,0x45, 0x4,0x55,0x7c, 0x3,0x54,0x4d, + 0x3,0x54,0x4a, 0x4,0x55,0x7b, 0x7,0x3f,0x30, 0x3,0x57,0x5d, + 0x7,0x46,0x44, 0x5,0x6b,0x76, 0x3,0x60,0x72, 0x4,0x6c,0x6e, + 0x5,0x37,0x3c, 0x3,0x4d,0x41, 0x3,0x2b,0x78, 0x4,0x28,0x61, + 0x5,0x25,0x58, 0x4,0x36,0x77, 0x4,0x42,0x60, 0x3,0x46,0x47, + 0x4,0x5a,0x7a, 0x3,0x22,0x3a, 0x3,0x23,0x46, 0x3,0x23,0x48, + 0x4,0x23,0x65, 0x3,0x25,0x4a, 0x4,0x25,0x71, 0x5,0x25,0x59, + 0x4,0x25,0x77, 0x4,0x25,0x73, 0x4,0x25,0x78, 0x3,0x2b,0x7d, + 0x4,0x31,0x25, 0x6,0x3e,0x42, 0x3,0x34,0x7a, 0x3,0x3a,0x55, + 0x4,0x3c,0x5c, 0x3,0x50,0x3e, 0x3,0x21,0x74, 0x3,0x23,0x4c, + 0x3,0x23,0x4a, 0x4,0x22,0x56, 0x4,0x22,0x59, 0x4,0x22,0x55, + 0x3,0x23,0x49, 0x3,0x25,0x52, 0x3,0x25,0x57, 0x3,0x25,0x50, + 0x3,0x25,0x4f, 0x3,0x25,0x4d, 0x3,0x25,0x54, 0x3,0x28,0x31, + 0x3,0x28,0x3b, 0x4,0x25,0x7b, 0x3,0x28,0x42, 0x3,0x28,0x32, + 0x3,0x28,0x3a, 0x3,0x28,0x43, 0x3,0x28,0x47, 0x3,0x28,0x34, + 0x4,0x26,0x21, 0x3,0x28,0x44, 0x3,0x28,0x3e, 0x3,0x28,0x36, + 0x3,0x28,0x3c, 0x5,0x25,0x5d, 0x3,0x28,0x39, 0x3,0x28,0x30, + 0x4,0x28,0x6d, 0x4,0x28,0x69, 0x3,0x2b,0x7e, 0x3,0x2c,0x22, + 0xf,0x2a,0x2a, 0x4,0x28,0x67, 0x3,0x30,0x3f, 0x3,0x30,0x42, + 0x3,0x30,0x3d, 0x3,0x30,0x49, 0x3,0x30,0x47, 0x4,0x2c,0x3b, + 0x3,0x30,0x43, 0x3,0x30,0x50, 0x3,0x30,0x4c, 0x3,0x30,0x44, + 0x4,0x2c,0x3f, 0x4,0x2c,0x3a, 0x3,0x30,0x39, 0x4,0x2c,0x3c, + 0x3,0x30,0x51, 0x3,0x30,0x46, 0x3,0x30,0x41, 0x3,0x30,0x3a, + 0xf,0x2e,0x6b, 0xf,0x2e,0x78, 0x4,0x31,0x29, 0x3,0x35,0x26, + 0x3,0x35,0x2d, 0x3,0x35,0x21, 0x3,0x35,0x36, 0x4,0x31,0x28, + 0x3,0x35,0x2c, 0x3,0x35,0x23, 0x3,0x35,0x25, 0x3,0x3a,0x71, + 0x3,0x3a,0x67, 0x3,0x3a,0x74, 0x3,0x3a,0x64, 0x3,0x3a,0x76, + 0x3,0x3a,0x6c, 0x3,0x3a,0x6a, 0x3,0x3a,0x65, 0x5,0x37,0x4e, + 0x3,0x3a,0x6e, 0x5,0x37,0x46, 0x4,0x36,0x7e, 0x3,0x3a,0x6f, + 0x3,0x3a,0x5f, 0x4,0x36,0x7d, 0x3,0x3a,0x70, 0x3,0x3a,0x5d, + 0xf,0x3a,0x3c, 0x3,0x3a,0x6d, 0x3,0x3a,0x69, 0x3,0x3a,0x68, + 0x4,0x3c,0x5f, 0x3,0x40,0x62, 0x4,0x3c,0x61, 0x3,0x40,0x6e, + 0x3,0x40,0x6d, 0x3,0x40,0x68, 0x3,0x40,0x63, 0x4,0x3c,0x64, + 0x3,0x40,0x65, 0x4,0x3c,0x63, 0x3,0x40,0x70, 0x3,0x40,0x6b, + 0x3,0x40,0x6f, 0x3,0x40,0x6c, 0x3,0x40,0x69, 0x3,0x46,0x4b, + 0x4,0x42,0x67, 0x4,0x42,0x6c, 0x4,0x42,0x68, 0x4,0x42,0x66, + 0x3,0x46,0x49, 0x3,0x46,0x52, 0x3,0x46,0x51, 0x4,0x42,0x6b, + 0x4,0x42,0x6d, 0x3,0x46,0x4d, 0x3,0x46,0x4e, 0x4,0x42,0x69, + 0x4,0x49,0x3c, 0x4,0x49,0x3a, 0x3,0x4b,0x59, 0x3,0x4b,0x57, + 0x4,0x49,0x40, 0x3,0x4b,0x55, 0x3,0x50,0x52, 0x3,0x50,0x55, + 0x4,0x50,0x21, 0xf,0x54,0x2a, 0x4,0x56,0x22, 0x4,0x56,0x24, + 0x3,0x57,0x5f, 0x3,0x57,0x60, 0x4,0x5f,0x54, 0x5,0x67,0x5e, + 0x3,0x5a,0x30, 0x3,0x5a,0x32, 0x3,0x5c,0x37, 0x4,0x63,0x35, + 0x3,0x5c,0x38, 0x4,0x66,0x37, 0x4,0x68,0x65, 0x3,0x61,0x62, + 0x3,0x61,0x63, 0x3,0x23,0x4e, 0x6,0x26,0x78, 0x4,0x23,0x6d, + 0x3,0x28,0x49, 0x4,0x28,0x70, 0x4,0x2c,0x41, 0x3,0x30,0x54, + 0x3,0x3a,0x7d, 0x4,0x3c,0x67, 0x7,0x2d,0x2d, 0x3,0x61,0x3d, + 0x3,0x22,0x3c, 0x3,0x23,0x4f, 0x6,0x26,0x79, 0x3,0x25,0x59, + 0x4,0x23,0x70, 0x3,0x25,0x5b, 0x6,0x26,0x7a, 0x3,0x28,0x4f, + 0x5,0x28,0x6e, 0x3,0x2c,0x30, 0x3,0x2c,0x31, 0x3,0x2c,0x33, + 0x4,0x2c,0x42, 0x5,0x2c,0x7c, 0x6,0x36,0x5d, 0x3,0x35,0x42, + 0x3,0x35,0x3d, 0x3,0x35,0x3e, 0x4,0x31,0x2e, 0x6,0x3e,0x5a, + 0x3,0x35,0x40, 0x3,0x3b,0x21, 0x4,0x37,0x22, 0x4,0x3c,0x6a, + 0x4,0x3c,0x6c, 0x4,0x3c,0x6f, 0x3,0x40,0x77, 0x4,0x42,0x74, + 0x4,0x42,0x75, 0x3,0x4b,0x60, 0x4,0x42,0x77, 0x4,0x49,0x43, + 0x4,0x49,0x45, 0x4,0x49,0x46, 0x4,0x5a,0x7d, 0x3,0x5e,0x2b, + 0x7,0x62,0x35, 0x4,0x23,0x71, 0x4,0x26,0x26, 0x6,0x36,0x68, + 0x3,0x3b,0x22, 0x4,0x2c,0x4c, 0x6,0x3e,0x64, 0x4,0x42,0x78, + 0x5,0x4c,0x63, 0x4,0x22,0x5d, 0x4,0x23,0x74, 0x4,0x26,0x28, + 0x4,0x26,0x27, 0x4,0x28,0x74, 0x4,0x28,0x75, 0x4,0x2c,0x4d, + 0x5,0x31,0x75, 0x4,0x31,0x33, 0x5,0x31,0x73, 0x4,0x31,0x32, + 0x4,0x37,0x28, 0x4,0x37,0x29, 0x4,0x3c,0x71, 0x4,0x42,0x79, + 0x3,0x22,0x40, 0x3,0x23,0x53, 0x4,0x26,0x2a, 0x3,0x28,0x52, + 0x3,0x28,0x53, 0x4,0x28,0x79, 0x4,0x28,0x78, 0x3,0x2c,0x39, + 0x3,0x2c,0x38, 0x3,0x2c,0x36, 0x4,0x2c,0x4e, 0x6,0x3e,0x6b, + 0x3,0x35,0x45, 0x4,0x37,0x2b, 0x5,0x37,0x66, 0x4,0x42,0x7d, + 0x4,0x49,0x4a, 0x3,0x5a,0x37, 0x3,0x21,0x62, 0x4,0x23,0x77, + 0x3,0x22,0x42, 0x3,0x22,0x43, 0x3,0x22,0x41, 0x3,0x22,0x44, + 0x3,0x23,0x56, 0x4,0x22,0x61, 0x5,0x22,0x51, 0x4,0x23,0x7b, + 0x5,0x22,0x50, 0x3,0x23,0x57, 0x3,0x23,0x58, 0x4,0x23,0x78, + 0x4,0x23,0x79, 0x3,0x25,0x60, 0x5,0x23,0x70, 0x5,0x23,0x74, + 0x3,0x25,0x64, 0x3,0x25,0x65, 0x4,0x23,0x76, 0x3,0x28,0x5b, + 0x6,0x2a,0x7b, 0x4,0x26,0x31, 0x4,0x26,0x32, 0x4,0x26,0x2e, + 0x3,0x28,0x56, 0x6,0x2a,0x76, 0x3,0x28,0x59, 0x3,0x28,0x5a, + 0x5,0x25,0x6e, 0x3,0x2c,0x3a, 0x4,0x28,0x7b, 0x4,0x2c,0x5b, + 0x4,0x2c,0x53, 0x4,0x2c,0x51, 0x3,0x30,0x60, 0x4,0x2c,0x5f, + 0x4,0x2c,0x55, 0x3,0x30,0x5c, 0x4,0x2c,0x5a, 0x4,0x2c,0x5e, + 0x4,0x2c,0x57, 0x3,0x30,0x5d, 0x6,0x36,0x7c, 0x5,0x2d,0x2e, + 0x3,0x30,0x65, 0x4,0x2c,0x54, 0x3,0x35,0x56, 0x3,0x35,0x49, + 0x4,0x31,0x37, 0x3,0x35,0x4c, 0x4,0x31,0x3d, 0x6,0x3e,0x75, + 0x3,0x35,0x4d, 0x4,0x31,0x39, 0x6,0x3e,0x78, 0x3,0x35,0x50, + 0xf,0x34,0x3f, 0x3,0x35,0x53, 0x3,0x3b,0x2f, 0x3,0x3b,0x32, + 0x3,0x3b,0x29, 0x4,0x37,0x32, 0x4,0x37,0x34, 0x3,0x3b,0x35, + 0x4,0x3c,0x72, 0x3,0x3b,0x30, 0x3,0x3b,0x2c, 0x4,0x3c,0x76, + 0x4,0x3c,0x73, 0x4,0x3c,0x7e, 0x5,0x3e,0x6d, 0x4,0x3d,0x21, + 0x6,0x52,0x34, 0x3,0x40,0x7b, 0x4,0x3c,0x77, 0x4,0x43,0x22, + 0x6,0x5c,0x44, 0x4,0x43,0x2d, 0x4,0x43,0x2a, 0x4,0x43,0x21, + 0x3,0x46,0x55, 0x4,0x43,0x24, 0x3,0x46,0x5b, 0x3,0x46,0x58, + 0x4,0x43,0x2e, 0x3,0x46,0x57, 0x4,0x49,0x50, 0x4,0x49,0x4c, + 0x5,0x4c,0x6c, 0x3,0x4b,0x62, 0x5,0x4c,0x68, 0x4,0x49,0x4b, + 0x4,0x49,0x53, 0x3,0x4b,0x64, 0x4,0x49,0x4f, 0x4,0x49,0x4d, + 0x3,0x4b,0x61, 0x4,0x49,0x54, 0x4,0x50,0x26, 0x4,0x50,0x27, + 0x4,0x56,0x28, 0x4,0x50,0x25, 0x5,0x54,0x36, 0x3,0x50,0x59, + 0x7,0x2d,0x4c, 0x3,0x54,0x5a, 0x3,0x54,0x56, 0x5,0x5b,0x3c, + 0x4,0x56,0x27, 0x3,0x54,0x58, 0x7,0x3f,0x44, 0x4,0x5f,0x5a, + 0x5,0x67,0x63, 0x5,0x67,0x64, 0x4,0x66,0x3a, 0x3,0x5e,0x2c, + 0x4,0x68,0x68, 0x5,0x7b,0x3d, 0x3,0x23,0x5b, 0x6,0x21,0x6e, + 0x3,0x3b,0x38, 0x4,0x49,0x55, 0x3,0x22,0x45, 0x4,0x31,0x42, + 0x3,0x22,0x46, 0x4,0x22,0x65, 0x4,0x22,0x66, 0x3,0x23,0x5d, + 0x4,0x24,0x22, 0x4,0x24,0x24, 0x3,0x25,0x69, 0x4,0x24,0x21, + 0x3,0x25,0x6a, 0xf,0x24,0x25, 0x4,0x26,0x36, 0x4,0x26,0x37, + 0x4,0x29,0x25, 0x4,0x24,0x25, 0x4,0x29,0x22, 0x4,0x29,0x24, + 0x6,0x30,0x63, 0x3,0x2c,0x47, 0x4,0x29,0x23, 0x4,0x29,0x21, + 0x4,0x2c,0x66, 0x4,0x2c,0x68, 0x4,0x31,0x47, 0x4,0x31,0x48, + 0x4,0x31,0x45, 0x4,0x31,0x49, 0x3,0x35,0x5c, 0x4,0x37,0x3b, + 0x4,0x37,0x36, 0x4,0x37,0x3d, 0x4,0x37,0x3a, 0x3,0x3b,0x3c, + 0x4,0x37,0x3c, 0x3,0x3b,0x39, 0x4,0x37,0x39, 0x4,0x3d,0x28, + 0x4,0x3d,0x23, 0x4,0x3d,0x27, 0x4,0x3d,0x26, 0x4,0x3d,0x29, + 0x4,0x43,0x33, 0x4,0x43,0x32, 0x4,0x43,0x31, 0x4,0x43,0x2f, + 0x3,0x4b,0x6e, 0x3,0x4b,0x6f, 0x4,0x50,0x29, 0x4,0x56,0x2d, + 0x4,0x56,0x2b, 0x4,0x63,0x3b, 0x4,0x63,0x3a, 0x3,0x5f,0x44, + 0x4,0x68,0x6b, 0x6,0x48,0x44, 0x3,0x46,0x5e, 0x4,0x50,0x2b, + 0x3,0x23,0x60, 0x3,0x23,0x5f, 0x3,0x23,0x5e, 0x3,0x25,0x6c, + 0x6,0x27,0x47, 0x4,0x26,0x38, 0x4,0x26,0x3d, 0x4,0x26,0x3b, + 0x5,0x26,0x26, 0x4,0x26,0x3c, 0x3,0x28,0x64, 0x4,0x26,0x3a, + 0x3,0x28,0x66, 0xf,0x2f,0x38, 0x3,0x2c,0x49, 0x3,0x2c,0x4a, + 0x4,0x29,0x2a, 0x5,0x29,0x26, 0x4,0x29,0x29, 0x4,0x29,0x28, + 0x4,0x2c,0x6b, 0x4,0x2c,0x6d, 0x4,0x2c,0x6c, 0x3,0x30,0x6d, + 0x3,0x35,0x5e, 0x4,0x31,0x4e, 0x4,0x31,0x4c, 0x4,0x31,0x4f, + 0x3,0x35,0x5d, 0x5,0x38,0x29, 0x4,0x37,0x40, 0x4,0x37,0x41, + 0x3,0x3b,0x41, 0x5,0x3f,0x21, 0x4,0x43,0x36, 0x3,0x46,0x5f, + 0x4,0x43,0x39, 0x4,0x43,0x3a, 0x4,0x49,0x5b, 0x4,0x49,0x5c, + 0x3,0x4b,0x71, 0x3,0x50,0x5d, 0x4,0x50,0x2c, 0x4,0x50,0x2e, + 0x5,0x54,0x42, 0x4,0x5f,0x5e, 0x4,0x63,0x3c, 0x4,0x24,0x29, + 0x3,0x28,0x6a, 0x3,0x46,0x62, 0x7,0x2d,0x5b, 0x4,0x29,0x2b, + 0x4,0x3d,0x2d, 0x6,0x21,0x79, 0x4,0x22,0x6a, 0x3,0x23,0x63, + 0x3,0x23,0x64, 0x3,0x25,0x70, 0x3,0x28,0x6f, 0x4,0x26,0x40, + 0x4,0x26,0x41, 0x3,0x2c,0x4e, 0x4,0x29,0x2d, 0x6,0x30,0x7a, + 0x4,0x29,0x2e, 0x3,0x2c,0x4f, 0x4,0x2c,0x71, 0x5,0x32,0x46, + 0x4,0x31,0x51, 0x4,0x2c,0x72, 0x3,0x3b,0x46, 0x3,0x3b,0x43, + 0x5,0x3f,0x29, 0x4,0x3d,0x2f, 0x4,0x3d,0x2e, 0x6,0x52,0x4d, + 0x4,0x49,0x5d, 0x4,0x49,0x5f, 0x3,0x5e,0x2e, 0x4,0x26,0x42, + 0x4,0x50,0x31, 0x6,0x24,0x70, 0x3,0x28,0x73, 0x4,0x26,0x43, + 0x3,0x28,0x72, 0x3,0x35,0x64, 0x3,0x3b,0x48, 0x3,0x3b,0x49, + 0x4,0x43,0x3b, 0x4,0x49,0x61, 0x3,0x50,0x5f, 0x3,0x22,0x4b, + 0x6,0x2b,0x3e, 0x3,0x28,0x74, 0x4,0x29,0x32, 0x4,0x29,0x34, + 0x3,0x2c,0x52, 0x5,0x29,0x2f, 0x5,0x29,0x33, 0x3,0x2c,0x53, + 0x6,0x31,0x25, 0x5,0x2d,0x47, 0xf,0x2f,0x3e, 0x4,0x31,0x54, + 0x3,0x35,0x66, 0x3,0x35,0x67, 0x4,0x37,0x49, 0x3,0x3b,0x4a, + 0x4,0x37,0x48, 0x4,0x3d,0x33, 0x5,0x45,0x69, 0x4,0x43,0x3d, + 0x6,0x5c,0x67, 0x3,0x50,0x60, 0x4,0x50,0x34, 0x4,0x56,0x2f, + 0x6,0x21,0x7e, 0x3,0x23,0x65, 0x3,0x23,0x68, 0x4,0x24,0x31, + 0x5,0x22,0x67, 0x4,0x22,0x70, 0x3,0x28,0x7b, 0x3,0x28,0x7d, + 0x3,0x25,0x79, 0x4,0x24,0x2e, 0x3,0x28,0x7c, 0x4,0x24,0x30, + 0x4,0x24,0x33, 0x3,0x25,0x73, 0x4,0x24,0x2f, 0x4,0x24,0x32, + 0x3,0x26,0x24, 0x3,0x28,0x79, 0x4,0x29,0x35, 0x4,0x29,0x37, + 0x4,0x26,0x4d, 0x3,0x2c,0x59, 0x3,0x29,0x24, 0x4,0x26,0x48, + 0x3,0x29,0x23, 0x4,0x26,0x4e, 0x4,0x26,0x4c, 0x4,0x26,0x46, + 0xf,0x2a,0x3e, 0x3,0x2c,0x58, 0x4,0x29,0x41, 0x3,0x2c,0x62, + 0x4,0x29,0x3c, 0x4,0x26,0x49, 0x4,0x29,0x39, 0x3,0x30,0x7d, + 0x6,0x37,0x54, 0x4,0x29,0x3d, 0x5,0x29,0x35, 0x4,0x2d,0x28, + 0x4,0x29,0x48, 0x4,0x29,0x3a, 0x4,0x29,0x3b, 0x4,0x29,0x40, + 0x3,0x2c,0x55, 0x6,0x37,0x5a, 0x3,0x30,0x7c, 0x3,0x2c,0x5e, + 0x4,0x31,0x5b, 0x5,0x2d,0x5a, 0x3,0x35,0x73, 0x4,0x2d,0x22, + 0x3,0x35,0x69, 0x3,0x30,0x75, 0x4,0x2d,0x23, 0x3,0x35,0x70, + 0x4,0x2d,0x24, 0x3,0x30,0x77, 0x6,0x37,0x5e, 0x3,0x31,0x24, + 0x4,0x2d,0x2b, 0x4,0x31,0x5a, 0x4,0x31,0x5c, 0x4,0x31,0x62, + 0x3,0x35,0x6b, 0x6,0x48,0x6f, 0x4,0x31,0x63, 0x3,0x35,0x75, + 0x4,0x31,0x60, 0x5,0x32,0x5b, 0x4,0x31,0x5d, 0x3,0x35,0x6c, + 0x3,0x3b,0x4e, 0x4,0x31,0x6c, 0x4,0x31,0x67, 0x3,0x3b,0x4c, + 0x3,0x35,0x6d, 0x3,0x35,0x77, 0x3,0x3b,0x57, 0x4,0x31,0x64, + 0x6,0x48,0x75, 0x3,0x3b,0x53, 0x4,0x31,0x66, 0x4,0x31,0x5e, + 0x5,0x2d,0x57, 0x3,0x3b,0x52, 0x5,0x38,0x42, 0x4,0x31,0x6a, + 0x5,0x38,0x48, 0x4,0x37,0x56, 0x4,0x37,0x50, 0x3,0x3b,0x5c, + 0x4,0x37,0x59, 0x3,0x3b,0x5f, 0x4,0x37,0x54, 0x4,0x37,0x4e, + 0x5,0x3f,0x32, 0x3,0x41,0x25, 0x4,0x37,0x55, 0x4,0x3d,0x3e, + 0x3,0x3b,0x60, 0x4,0x3d,0x37, 0x5,0x32,0x58, 0x3,0x3b,0x5b, + 0x3,0x41,0x26, 0x3,0x41,0x2d, 0x4,0x3d,0x3b, 0x4,0x43,0x43, + 0x5,0x3f,0x42, 0x6,0x52,0x69, 0x3,0x46,0x67, 0x4,0x3d,0x3a, + 0x4,0x3d,0x3c, 0x3,0x41,0x30, 0x3,0x46,0x65, 0x4,0x43,0x42, + 0x4,0x43,0x50, 0x3,0x46,0x66, 0x3,0x41,0x2f, 0x4,0x43,0x48, + 0x4,0x43,0x47, 0x4,0x43,0x49, 0x3,0x4b,0x7d, 0x4,0x43,0x4d, + 0x4,0x49,0x65, 0x3,0x4c,0x22, 0x3,0x46,0x69, 0x3,0x4b,0x7b, + 0x4,0x43,0x4a, 0x4,0x43,0x4c, 0x4,0x43,0x46, 0x3,0x4c,0x27, + 0x3,0x4b,0x78, 0x4,0x43,0x4b, 0x4,0x50,0x38, 0x3,0x4c,0x2a, + 0x4,0x49,0x67, 0x4,0x49,0x69, 0x4,0x49,0x68, 0x4,0x49,0x6b, + 0x7,0x22,0x7c, 0x4,0x49,0x6d, 0x3,0x50,0x69, 0x4,0x49,0x6c, + 0x3,0x4c,0x26, 0x4,0x50,0x39, 0x5,0x5b,0x4c, 0x4,0x5b,0x23, + 0x4,0x5b,0x29, 0x4,0x56,0x36, 0x4,0x5b,0x25, 0x3,0x57,0x67, + 0x4,0x5b,0x24, 0xf,0x5a,0x29, 0x3,0x57,0x66, 0x4,0x50,0x3a, + 0x5,0x67,0x78, 0x4,0x63,0x43, 0x4,0x5f,0x64, 0x5,0x67,0x73, + 0x7,0x47,0x2c, 0x3,0x5e,0x30, 0x4,0x63,0x42, 0x4,0x63,0x40, + 0x3,0x5f,0x47, 0x4,0x68,0x6c, 0x3,0x61,0x78, 0x3,0x23,0x6a, + 0x3,0x26,0x26, 0x4,0x26,0x54, 0x6,0x2b,0x52, 0x4,0x2d,0x2f, + 0x4,0x2d,0x30, 0x5,0x2d,0x5d, 0x3,0x35,0x7a, 0x3,0x3b,0x65, + 0x4,0x3d,0x42, 0x4,0x43,0x54, 0x5,0x4d,0x37, 0x3,0x4c,0x2b, + 0x3,0x54,0x62, 0x6,0x27,0x6e, 0x4,0x26,0x55, 0x4,0x26,0x56, + 0x4,0x29,0x4d, 0x3,0x2c,0x64, 0x4,0x21,0x7b, 0x4,0x21,0x7a, + 0x3,0x22,0x4f, 0x4,0x22,0x74, 0x4,0x22,0x73, 0x4,0x22,0x75, + 0x4,0x24,0x3a, 0x4,0x24,0x36, 0x3,0x26,0x2c, 0x3,0x26,0x2d, + 0x3,0x26,0x30, 0x3,0x26,0x2b, 0x4,0x26,0x58, 0x3,0x29,0x2d, + 0x5,0x26,0x3a, 0x3,0x29,0x2c, 0x3,0x29,0x38, 0x4,0x29,0x55, + 0x4,0x2d,0x33, 0x4,0x26,0x59, 0x3,0x29,0x2b, 0xf,0x27,0x2e, + 0x4,0x29,0x4e, 0x4,0x29,0x54, 0x3,0x2c,0x66, 0x3,0x29,0x27, + 0x3,0x2c,0x67, 0x3,0x2c,0x69, 0x4,0x2d,0x3c, 0x3,0x2c,0x71, + 0x4,0x29,0x56, 0x3,0x2c,0x68, 0x4,0x29,0x52, 0x4,0x2d,0x32, + 0x4,0x2d,0x31, 0x3,0x2c,0x6a, 0x3,0x2c,0x65, 0x3,0x31,0x34, + 0x3,0x31,0x2a, 0x3,0x35,0x7b, 0x3,0x31,0x31, 0x3,0x31,0x3a, + 0x4,0x2d,0x3b, 0x3,0x31,0x2d, 0x3,0x31,0x2b, 0x4,0x31,0x7c, + 0x4,0x32,0x21, 0x4,0x31,0x7b, 0x3,0x36,0x2c, 0x6,0x40,0x32, + 0x4,0x32,0x25, 0x3,0x36,0x2f, 0x3,0x36,0x30, 0x4,0x31,0x79, + 0x3,0x35,0x7e, 0x4,0x31,0x71, 0x3,0x36,0x25, 0x4,0x31,0x7e, + 0x4,0x31,0x7a, 0x3,0x3b,0x6b, 0x3,0x36,0x2a, 0x4,0x37,0x6e, + 0x4,0x37,0x62, 0x3,0x36,0x21, 0x4,0x3d,0x45, 0x3,0x41,0x31, + 0x4,0x37,0x64, 0x3,0x3b,0x6a, 0x4,0x37,0x6b, 0x4,0x37,0x68, + 0x4,0x37,0x65, 0x3,0x3b,0x6c, 0x3,0x3b,0x69, 0x4,0x37,0x70, + 0x4,0x37,0x61, 0x3,0x3b,0x6e, 0x4,0x3d,0x50, 0x4,0x3d,0x4f, + 0x3,0x41,0x37, 0x4,0x3d,0x4c, 0x4,0x3d,0x4a, 0x3,0x41,0x35, + 0x3,0x41,0x3b, 0x4,0x3d,0x48, 0x4,0x3d,0x4e, 0x3,0x41,0x3c, + 0x3,0x41,0x4a, 0x3,0x41,0x43, 0x3,0x41,0x3f, 0x3,0x41,0x47, + 0x3,0x41,0x40, 0x3,0x41,0x46, 0x3,0x41,0x41, 0x3,0x41,0x39, + 0x4,0x43,0x58, 0x4,0x43,0x61, 0x6,0x5d,0x32, 0x3,0x46,0x79, + 0x3,0x47,0x2e, 0x3,0x47,0x2d, 0x4,0x43,0x56, 0x3,0x46,0x7c, + 0x3,0x47,0x27, 0x3,0x47,0x2f, 0x4,0x43,0x5c, 0x3,0x46,0x77, + 0x5,0x46,0x25, 0x3,0x46,0x7d, 0x4,0x49,0x75, 0x3,0x4c,0x36, + 0x4,0x43,0x64, 0x5,0x46,0x23, 0x3,0x47,0x2b, 0x3,0x47,0x2c, + 0x4,0x4a,0x24, 0x3,0x4c,0x33, 0x7,0x23,0x3a, 0x4,0x49,0x79, + 0x4,0x49,0x7a, 0x4,0x49,0x76, 0x4,0x4a,0x28, 0x4,0x4a,0x22, + 0x5,0x4d,0x3a, 0x4,0x49,0x7e, 0x5,0x4d,0x3e, 0x3,0x4c,0x3c, + 0x4,0x4a,0x23, 0x3,0x50,0x74, 0x4,0x56,0x39, 0x4,0x50,0x45, + 0x3,0x50,0x73, 0x3,0x50,0x6e, 0x3,0x50,0x78, 0x3,0x50,0x72, + 0x3,0x50,0x71, 0x3,0x54,0x65, 0x3,0x54,0x6a, 0x3,0x54,0x68, + 0x3,0x54,0x63, 0x3,0x54,0x66, 0x4,0x5b,0x2d, 0x3,0x57,0x69, + 0x4,0x5b,0x32, 0x4,0x5b,0x30, 0x4,0x5b,0x2e, 0x3,0x57,0x6f, + 0x3,0x57,0x71, 0x4,0x5b,0x31, 0x3,0x57,0x68, 0x4,0x5b,0x2f, + 0x3,0x57,0x72, 0xf,0x5e,0x73, 0x3,0x5a,0x3d, 0x3,0x5a,0x3e, + 0x4,0x63,0x47, 0x3,0x5c,0x40, 0x4,0x63,0x46, 0x5,0x70,0x24, + 0x3,0x5e,0x32, 0x4,0x66,0x40, 0x3,0x60,0x31, 0x4,0x6a,0x49, + 0x4,0x6a,0x48, 0x5,0x79,0x2a, 0x4,0x26,0x5b, 0x4,0x2d,0x40, + 0x4,0x2d,0x3f, 0x4,0x32,0x27, 0x4,0x3d,0x54, 0x4,0x24,0x40, + 0x3,0x26,0x3a, 0x4,0x26,0x5e, 0x4,0x26,0x5f, 0x4,0x29,0x5d, + 0x3,0x2c,0x75, 0x3,0x31,0x3e, 0x4,0x2d,0x42, 0x6,0x38,0x2b, + 0x3,0x36,0x33, 0x4,0x32,0x28, 0x3,0x36,0x35, 0x4,0x32,0x2c, + 0x4,0x37,0x79, 0x4,0x37,0x75, 0x4,0x37,0x78, 0x4,0x37,0x77, + 0x4,0x37,0x76, 0x5,0x38,0x7c, 0x3,0x3b,0x77, 0x4,0x3d,0x5c, + 0x4,0x3d,0x59, 0x4,0x3d,0x5b, 0x3,0x41,0x4c, 0x4,0x43,0x66, + 0x5,0x46,0x30, 0x5,0x46,0x2e, 0x4,0x43,0x69, 0x4,0x4a,0x2b, + 0x4,0x4a,0x2a, 0x4,0x4a,0x29, 0x4,0x50,0x49, 0x4,0x50,0x4c, + 0x3,0x57,0x73, 0x4,0x5b,0x3a, 0x4,0x63,0x4c, 0x4,0x66,0x43, + 0x3,0x26,0x3b, 0x6,0x38,0x2c, 0x3,0x41,0x4f, 0x3,0x29,0x3a, + 0x4,0x29,0x61, 0x3,0x31,0x41, 0x3,0x39,0x2b, 0x3,0x3b,0x78, + 0x4,0x4a,0x2e, 0x4,0x56,0x3e, 0x4,0x6a,0x4b, 0x4,0x29,0x62, + 0x4,0x2d,0x49, 0x6,0x38,0x30, 0x6,0x49,0x61, 0x6,0x5d,0x51, + 0x5,0x4d,0x4b, 0x3,0x23,0x71, 0x6,0x2b,0x70, 0x6,0x38,0x34, + 0x3,0x36,0x3b, 0x3,0x36,0x3e, 0x4,0x3d,0x65, 0x4,0x4a,0x30, + 0x4,0x4a,0x31, 0x4,0x22,0x78, 0x4,0x22,0x79, 0x4,0x24,0x43, + 0x3,0x26,0x3c, 0x3,0x26,0x3f, 0x3,0x26,0x3e, 0x3,0x26,0x40, + 0x3,0x29,0x3f, 0x3,0x29,0x3d, 0x4,0x26,0x63, 0x5,0x29,0x4f, + 0x4,0x29,0x63, 0x3,0x2c,0x7b, 0x4,0x29,0x64, 0x4,0x29,0x65, + 0x3,0x2c,0x78, 0x3,0x2d,0x26, 0x6,0x31,0x67, 0x4,0x2d,0x4c, + 0x4,0x32,0x3b, 0x4,0x2d,0x4b, 0x3,0x31,0x47, 0x6,0x38,0x37, + 0x3,0x31,0x4a, 0xf,0x2f,0x6e, 0x4,0x2d,0x4d, 0x6,0x40,0x51, + 0x4,0x32,0x36, 0x4,0x32,0x3a, 0x4,0x32,0x37, 0x3,0x36,0x43, + 0x6,0x40,0x4f, 0x3,0x3c,0x22, 0x4,0x37,0x7e, 0x3,0x3b,0x7a, + 0x3,0x3b,0x7b, 0x4,0x38,0x25, 0x3,0x3c,0x27, 0x4,0x38,0x22, + 0x6,0x49,0x73, 0x3,0x3c,0x21, 0x6,0x53,0x3d, 0x5,0x3f,0x62, + 0x3,0x41,0x52, 0x3,0x41,0x57, 0x3,0x41,0x5a, 0x3,0x41,0x55, + 0x3,0x41,0x53, 0x3,0x41,0x5c, 0x3,0x41,0x58, 0x4,0x3d,0x68, + 0x4,0x3d,0x67, 0x3,0x41,0x54, 0x3,0x47,0x38, 0x4,0x43,0x6e, + 0x3,0x47,0x32, 0x3,0x47,0x36, 0x5,0x4d,0x53, 0x4,0x4a,0x32, + 0x3,0x4c,0x42, 0x3,0x4c,0x45, 0x4,0x50,0x52, 0x4,0x50,0x51, + 0x3,0x51,0x21, 0x5,0x4d,0x50, 0x3,0x50,0x7b, 0x3,0x50,0x7c, + 0x4,0x50,0x53, 0x7,0x2e,0x5a, 0x3,0x54,0x73, 0x3,0x54,0x6e, + 0x4,0x56,0x40, 0x4,0x5b,0x40, 0x4,0x5b,0x41, 0x4,0x5b,0x3f, + 0x7,0x3f,0x76, 0x3,0x5a,0x40, 0x3,0x5a,0x41, 0x3,0x5c,0x44, + 0x3,0x5f,0x4c, 0x3,0x5f,0x4d, 0x5,0x75,0x6e, 0x5,0x75,0x6d, + 0x3,0x23,0x74, 0x4,0x50,0x56, 0x3,0x54,0x74, 0x3,0x29,0x44, + 0x3,0x31,0x4e, 0x5,0x2e,0x25, 0x3,0x36,0x49, 0x3,0x3c,0x28, + 0x4,0x3a,0x43, 0x5,0x46,0x45, 0x5,0x4d,0x58, 0x3,0x51,0x25, + 0x3,0x23,0x76, 0x3,0x26,0x43, 0x4,0x24,0x48, 0x3,0x26,0x46, + 0x3,0x29,0x4b, 0x3,0x29,0x46, 0xf,0x27,0x4c, 0x3,0x29,0x50, + 0x3,0x29,0x4d, 0x5,0x26,0x51, 0x3,0x2d,0x28, 0x3,0x2d,0x2c, + 0x4,0x29,0x6f, 0x4,0x29,0x6c, 0x3,0x2d,0x29, 0x4,0x2d,0x57, + 0x4,0x2d,0x51, 0x4,0x2d,0x54, 0x4,0x2d,0x58, 0x3,0x31,0x52, + 0x5,0x2e,0x2b, 0x4,0x2d,0x52, 0x4,0x2d,0x5b, 0x3,0x31,0x55, + 0x4,0x2d,0x56, 0x3,0x31,0x51, 0x3,0x36,0x59, 0x4,0x32,0x43, + 0x3,0x36,0x4a, 0x3,0x36,0x4f, 0x5,0x32,0x79, 0x4,0x32,0x42, + 0x4,0x32,0x46, 0x4,0x32,0x41, 0x4,0x38,0x34, 0x3,0x36,0x58, + 0x3,0x36,0x5d, 0x4,0x38,0x2f, 0x3,0x3c,0x2e, 0x4,0x38,0x2c, + 0x3,0x3c,0x3f, 0x3,0x3c,0x30, 0x4,0x38,0x2a, 0x5,0x39,0x33, + 0x4,0x38,0x2d, 0x3,0x3c,0x2c, 0x5,0x39,0x39, 0x4,0x38,0x35, + 0x3,0x3c,0x35, 0x4,0x38,0x37, 0x3,0x3c,0x36, 0x3,0x3c,0x43, + 0x3,0x3c,0x2b, 0x3,0x3c,0x2d, 0x4,0x3d,0x78, 0x3,0x41,0x71, + 0x3,0x41,0x66, 0x3,0x41,0x70, 0x4,0x3d,0x6b, 0x4,0x3d,0x6e, + 0x4,0x3d,0x6f, 0x3,0x41,0x6c, 0x3,0x41,0x69, 0x3,0x41,0x64, + 0x4,0x3d,0x6d, 0x3,0x41,0x5e, 0x4,0x3d,0x75, 0x3,0x41,0x62, + 0x3,0x41,0x63, 0x3,0x41,0x7a, 0x3,0x41,0x61, 0x3,0x41,0x5f, + 0x4,0x44,0x23, 0x4,0x3d,0x76, 0x3,0x41,0x60, 0x3,0x42,0x5a, + 0x3,0x41,0x67, 0xf,0x48,0x55, 0x4,0x44,0x24, 0x4,0x43,0x75, + 0x4,0x44,0x21, 0x4,0x43,0x7c, 0x3,0x47,0x3f, 0x4,0x43,0x78, + 0x4,0x43,0x73, 0x3,0x47,0x41, 0x4,0x43,0x74, 0x3,0x47,0x4a, + 0x4,0x43,0x7d, 0x4,0x43,0x7e, 0x4,0x43,0x7a, 0x4,0x44,0x22, + 0x3,0x47,0x4f, 0x3,0x47,0x40, 0x4,0x44,0x25, 0x4,0x43,0x71, + 0x5,0x46,0x4b, 0x3,0x47,0x49, 0x4,0x3d,0x72, 0x3,0x47,0x50, + 0xf,0x48,0x52, 0x3,0x4c,0x4e, 0x5,0x4d,0x6d, 0x4,0x4a,0x3a, + 0x3,0x4c,0x4c, 0x5,0x4d,0x61, 0x3,0x4c,0x53, 0x4,0x4a,0x37, + 0x4,0x4a,0x36, 0x3,0x4c,0x5d, 0x3,0x4c,0x58, 0x7,0x23,0x6f, + 0x4,0x4a,0x38, 0x4,0x4a,0x42, 0x3,0x4c,0x5a, 0x3,0x4c,0x5c, + 0x3,0x4c,0x48, 0x3,0x4c,0x55, 0x3,0x51,0x43, 0x3,0x51,0x42, + 0x4,0x50,0x60, 0x4,0x50,0x5a, 0x3,0x51,0x37, 0x3,0x51,0x30, + 0x4,0x50,0x59, 0x4,0x4a,0x39, 0x3,0x51,0x3f, 0x3,0x51,0x2a, + 0x3,0x51,0x3d, 0x4,0x56,0x49, 0x3,0x51,0x33, 0x3,0x51,0x39, + 0x3,0x4c,0x4b, 0x4,0x50,0x5e, 0x3,0x51,0x2d, 0x4,0x50,0x64, + 0x3,0x51,0x35, 0x3,0x51,0x34, 0x3,0x51,0x36, 0x3,0x55,0x22, + 0x4,0x56,0x48, 0x3,0x54,0x7e, 0x3,0x55,0x25, 0x3,0x54,0x7d, + 0x4,0x56,0x4b, 0x7,0x38,0x55, 0x5,0x5b,0x68, 0x3,0x54,0x77, + 0x3,0x55,0x26, 0xf,0x5f,0x29, 0x3,0x54,0x79, 0x3,0x55,0x28, + 0x4,0x5b,0x48, 0x4,0x5b,0x44, 0x3,0x57,0x7c, 0x4,0x5b,0x4a, + 0x4,0x5b,0x49, 0x4,0x5f,0x6f, 0x4,0x5f,0x73, 0x3,0x5a,0x49, + 0x4,0x5f,0x70, 0x4,0x5f,0x6e, 0x4,0x5f,0x72, 0x4,0x5f,0x75, + 0x3,0x5a,0x4c, 0x3,0x5a,0x4b, 0xf,0x62,0x53, 0x3,0x5a,0x4a, + 0x3,0x5c,0x4c, 0x3,0x5c,0x46, 0x4,0x63,0x51, 0x4,0x63,0x4f, + 0x3,0x5c,0x48, 0x3,0x5c,0x4d, 0x4,0x63,0x54, 0x3,0x5c,0x4b, + 0x3,0x5c,0x45, 0xf,0x65,0x3e, 0x5,0x70,0x27, 0x3,0x5e,0x36, + 0x3,0x5c,0x4a, 0x3,0x5f,0x50, 0x4,0x68,0x6e, 0x3,0x60,0x35, + 0x3,0x60,0x33, 0x3,0x60,0x34, 0x5,0x24,0x48, 0x6,0x28,0x30, + 0x4,0x26,0x6d, 0x5,0x26,0x56, 0x4,0x26,0x70, 0x4,0x26,0x6c, + 0x4,0x2d,0x60, 0x4,0x29,0x70, 0x4,0x29,0x71, 0x6,0x31,0x78, + 0x4,0x29,0x74, 0x4,0x29,0x73, 0x5,0x2e,0x2e, 0x4,0x2d,0x5d, + 0x4,0x2d,0x61, 0x4,0x2d,0x62, 0x4,0x2d,0x5e, 0x3,0x36,0x61, + 0x4,0x32,0x48, 0x4,0x32,0x49, 0x6,0x40,0x6e, 0x4,0x38,0x3b, + 0x4,0x38,0x39, 0x3,0x3c,0x46, 0x5,0x39,0x43, 0x4,0x38,0x3c, + 0x6,0x38,0x64, 0x4,0x3e,0x21, 0x4,0x3d,0x7c, 0x4,0x3d,0x7b, + 0x4,0x3d,0x7d, 0x4,0x3d,0x7e, 0x4,0x3e,0x22, 0x3,0x47,0x52, + 0x6,0x5d,0x77, 0x4,0x44,0x2a, 0x4,0x4a,0x4c, 0x3,0x4c,0x68, + 0x4,0x50,0x66, 0x4,0x50,0x67, 0x4,0x56,0x4f, 0x4,0x56,0x4e, + 0x3,0x55,0x2a, 0x3,0x55,0x2c, 0x4,0x5f,0x77, 0x7,0x4e,0x22, + 0x4,0x68,0x71, 0x5,0x75,0x77, 0x5,0x79,0x2f, 0x6,0x25,0x25, + 0x3,0x2d,0x3e, 0x3,0x2b,0x7b, 0x3,0x3c,0x48, 0x4,0x38,0x3f, + 0x5,0x46,0x5f, 0x3,0x58,0x24, 0x4,0x22,0x7c, 0x3,0x29,0x57, + 0x5,0x26,0x62, 0x4,0x26,0x75, 0x3,0x2d,0x3f, 0x3,0x2d,0x41, + 0x3,0x2d,0x40, 0x3,0x31,0x69, 0x3,0x36,0x63, 0x4,0x32,0x4a, + 0x4,0x38,0x45, 0x4,0x38,0x44, 0x4,0x38,0x46, 0x4,0x38,0x42, + 0x3,0x3c,0x4a, 0x3,0x42,0x23, 0x4,0x3e,0x23, 0x4,0x3e,0x24, + 0x3,0x42,0x24, 0x4,0x44,0x32, 0x5,0x46,0x60, 0x4,0x44,0x33, + 0x4,0x44,0x30, 0x4,0x4a,0x50, 0x4,0x4a,0x4f, 0x4,0x50,0x6b, + 0x4,0x50,0x6a, 0x4,0x56,0x51, 0x4,0x63,0x55, 0x3,0x5c,0x4e, + 0x5,0x75,0x78, 0x5,0x24,0x4e, 0x4,0x26,0x78, 0x4,0x2d,0x64, + 0x3,0x31,0x6b, 0x4,0x32,0x4f, 0x4,0x38,0x49, 0x4,0x38,0x4a, + 0x4,0x38,0x4b, 0x3,0x42,0x25, 0x4,0x44,0x35, 0x3,0x51,0x47, + 0x3,0x51,0x48, 0x4,0x50,0x6e, 0x4,0x56,0x53, 0x3,0x58,0x25, + 0x4,0x29,0x7b, 0x3,0x23,0x7b, 0x4,0x26,0x79, 0x3,0x29,0x5b, + 0x4,0x26,0x7a, 0xf,0x27,0x5b, 0x3,0x2d,0x43, 0x4,0x2d,0x66, + 0x4,0x32,0x52, 0x4,0x32,0x54, 0x4,0x32,0x53, 0x4,0x32,0x55, + 0x3,0x36,0x67, 0x4,0x2d,0x67, 0x4,0x32,0x51, 0x5,0x39,0x5b, + 0x3,0x3c,0x4c, 0x4,0x38,0x4f, 0x4,0x38,0x4c, 0x4,0x3e,0x29, + 0x3,0x42,0x27, 0x4,0x3e,0x28, 0x4,0x3e,0x27, 0x4,0x44,0x3f, + 0x4,0x44,0x38, 0x4,0x44,0x39, 0x4,0x44,0x3a, 0x5,0x46,0x68, + 0x4,0x44,0x3c, 0x4,0x50,0x6f, 0x4,0x50,0x71, 0x4,0x50,0x72, + 0x3,0x51,0x49, 0x4,0x5b,0x50, 0x4,0x5b,0x4f, 0x3,0x5a,0x50, + 0x4,0x6d,0x57, 0x4,0x2d,0x6a, 0x3,0x29,0x5c, 0x3,0x36,0x68, + 0x3,0x4c,0x69, 0x3,0x51,0x4a, 0x4,0x21,0x4f, 0x3,0x22,0x56, + 0x3,0x22,0x55, 0x3,0x24,0x22, 0x5,0x21,0x74, 0x4,0x23,0x22, + 0x3,0x26,0x54, 0x3,0x26,0x4f, 0x4,0x24,0x4f, 0x3,0x26,0x5d, + 0x6,0x28,0x49, 0x3,0x26,0x5a, 0x4,0x24,0x51, 0x3,0x26,0x4b, + 0x6,0x28,0x4a, 0x6,0x28,0x44, 0x3,0x26,0x58, 0x3,0x29,0x61, + 0x3,0x29,0x5f, 0x3,0x29,0x5e, 0x3,0x29,0x62, 0x3,0x29,0x60, + 0x4,0x26,0x7e, 0x3,0x29,0x68, 0x3,0x29,0x66, 0xf,0x27,0x66, + 0x3,0x2d,0x44, 0x5,0x2a,0x24, 0x4,0x27,0x22, 0x3,0x2d,0x54, + 0x5,0x29,0x7b, 0x5,0x29,0x7c, 0x4,0x29,0x7e, 0x3,0x2d,0x56, + 0x3,0x2d,0x4c, 0xf,0x30,0x49, 0x6,0x38,0x72, 0x3,0x31,0x70, + 0x3,0x31,0x71, 0x4,0x2d,0x6b, 0x6,0x39,0x33, 0x3,0x31,0x74, + 0x4,0x2d,0x6c, 0x3,0x36,0x69, 0x3,0x32,0x24, 0x3,0x32,0x23, + 0x3,0x31,0x7e, 0x3,0x31,0x75, 0x4,0x32,0x57, 0x3,0x36,0x71, + 0x4,0x32,0x63, 0x4,0x32,0x64, 0x3,0x36,0x6e, 0x4,0x32,0x5e, + 0x3,0x37,0x22, 0x3,0x36,0x6d, 0x3,0x3c,0x4f, 0x3,0x36,0x7e, + 0x4,0x32,0x58, 0x4,0x32,0x68, 0x5,0x39,0x5e, 0x4,0x32,0x5a, + 0x4,0x32,0x5c, 0x6,0x41,0x2b, 0x5,0x33,0x3d, 0x3,0x3c,0x5e, + 0x3,0x36,0x7b, 0x3,0x3c,0x5f, 0x3,0x36,0x73, 0x6,0x41,0x41, + 0x3,0x36,0x78, 0xf,0x36,0x33, 0x4,0x38,0x51, 0x4,0x38,0x56, + 0x3,0x3c,0x65, 0x4,0x38,0x52, 0x3,0x3c,0x59, 0x4,0x38,0x59, + 0x3,0x3c,0x6a, 0x3,0x3c,0x67, 0x3,0x3c,0x55, 0x4,0x38,0x57, + 0x4,0x38,0x5a, 0x3,0x3c,0x53, 0x3,0x3c,0x57, 0x3,0x3c,0x61, + 0x3,0x42,0x2b, 0x6,0x4a,0x6d, 0xf,0x3c,0x43, 0xf,0x3c,0x5a, + 0x4,0x3e,0x37, 0x3,0x42,0x2c, 0x3,0x42,0x37, 0x3,0x42,0x35, + 0x3,0x42,0x48, 0x3,0x42,0x38, 0x4,0x3e,0x30, 0x4,0x3e,0x39, + 0x4,0x3e,0x2d, 0x3,0x42,0x42, 0x4,0x3e,0x38, 0x3,0x42,0x34, + 0x3,0x42,0x3c, 0x4,0x3e,0x3c, 0x3,0x42,0x2f, 0x3,0x42,0x41, + 0x5,0x40,0x27, 0x4,0x3e,0x2f, 0x4,0x3e,0x32, 0x3,0x42,0x32, + 0x3,0x42,0x43, 0x3,0x47,0x55, 0x4,0x44,0x49, 0x3,0x47,0x60, + 0x6,0x5e,0x3b, 0x3,0x47,0x59, 0x6,0x54,0x50, 0x3,0x47,0x58, + 0x4,0x44,0x46, 0x4,0x44,0x4d, 0x4,0x44,0x4a, 0x6,0x5e,0x40, + 0x3,0x4c,0x6e, 0x4,0x4a,0x5f, 0x4,0x4a,0x61, 0x3,0x4c,0x6f, + 0x3,0x4c,0x7c, 0x4,0x4a,0x68, 0x4,0x4a,0x5d, 0x3,0x4c,0x6d, + 0x4,0x4a,0x59, 0x3,0x4c,0x72, 0x5,0x46,0x78, 0x7,0x24,0x61, + 0x3,0x4c,0x70, 0x4,0x50,0x74, 0x3,0x51,0x4b, 0x3,0x4c,0x76, + 0x4,0x50,0x77, 0x4,0x50,0x7d, 0x5,0x55,0x36, 0x4,0x50,0x76, + 0x3,0x51,0x4f, 0x3,0x51,0x4e, 0x4,0x50,0x7a, 0x5,0x55,0x2d, + 0x3,0x51,0x53, 0x3,0x51,0x57, 0x4,0x50,0x7b, 0x4,0x56,0x56, + 0x3,0x51,0x51, 0x3,0x51,0x4c, 0x4,0x50,0x78, 0x3,0x51,0x52, + 0x4,0x4a,0x62, 0x5,0x55,0x2e, 0x3,0x55,0x32, 0x3,0x55,0x38, + 0x4,0x56,0x5e, 0x4,0x56,0x60, 0x3,0x55,0x34, 0x4,0x56,0x58, + 0x3,0x55,0x2e, 0x4,0x56,0x57, 0x4,0x56,0x5c, 0x3,0x55,0x3b, + 0x4,0x56,0x59, 0x4,0x56,0x5b, 0x3,0x55,0x33, 0x4,0x5b,0x56, + 0x4,0x5b,0x54, 0x4,0x5b,0x5a, 0x4,0x5b,0x57, 0x4,0x5b,0x60, + 0x4,0x5f,0x7b, 0x4,0x5f,0x7d, 0x4,0x5b,0x5b, 0x4,0x5f,0x79, + 0x3,0x5a,0x51, 0x3,0x5c,0x50, 0x4,0x63,0x5a, 0x4,0x63,0x5e, + 0x4,0x63,0x5b, 0x3,0x5c,0x52, 0x4,0x66,0x49, 0x5,0x70,0x3e, + 0x4,0x66,0x4a, 0x4,0x66,0x4c, 0x4,0x68,0x73, 0x3,0x5e,0x39, + 0x3,0x5e,0x38, 0x3,0x5f,0x51, 0x4,0x6a,0x4e, 0x3,0x60,0x38, + 0x4,0x6b,0x6d, 0x4,0x6b,0x6e, 0x3,0x61,0x66, 0x3,0x24,0x2a, + 0x4,0x24,0x52, 0x3,0x26,0x61, 0xf,0x24,0x6e, 0x3,0x29,0x6e, + 0x4,0x27,0x27, 0x3,0x29,0x78, 0xf,0x27,0x6e, 0x3,0x29,0x73, + 0x3,0x2d,0x67, 0x3,0x2d,0x59, 0x3,0x2d,0x66, 0x3,0x2d,0x61, + 0x3,0x2d,0x60, 0x3,0x2d,0x5b, 0x4,0x2a,0x27, 0x3,0x32,0x2e, + 0x4,0x2d,0x73, 0x3,0x32,0x32, 0x3,0x37,0x2b, 0x3,0x37,0x2a, + 0x3,0x37,0x34, 0x4,0x32,0x71, 0x4,0x32,0x76, 0x4,0x32,0x70, + 0x4,0x32,0x77, 0xf,0x36,0x48, 0x3,0x3c,0x76, 0x4,0x38,0x65, + 0x4,0x38,0x61, 0x3,0x3c,0x75, 0x4,0x38,0x62, 0x4,0x38,0x64, + 0x4,0x38,0x60, 0x3,0x3b,0x23, 0x3,0x3c,0x7e, 0x3,0x3c,0x70, + 0x3,0x3c,0x78, 0x3,0x42,0x54, 0x3,0x42,0x4d, 0x3,0x42,0x56, + 0x4,0x3e,0x4b, 0x3,0x42,0x4a, 0x3,0x42,0x55, 0x4,0x3e,0x48, + 0x4,0x3e,0x46, 0x4,0x3e,0x49, 0x6,0x54,0x54, 0x3,0x42,0x4b, + 0x3,0x42,0x50, 0xf,0x42,0x78, 0xf,0x43,0x3c, 0x4,0x44,0x59, + 0x3,0x47,0x73, 0x3,0x47,0x69, 0x6,0x54,0x67, 0x4,0x44,0x56, + 0x4,0x44,0x5a, 0x4,0x44,0x5c, 0x3,0x47,0x71, 0xf,0x49,0x58, + 0x3,0x4d,0x26, 0x3,0x4d,0x23, 0x3,0x4d,0x2b, 0x3,0x4d,0x21, + 0x3,0x4d,0x27, 0x4,0x4a,0x6a, 0x4,0x51,0x25, 0x3,0x51,0x5d, + 0x3,0x51,0x5b, 0x4,0x51,0x2b, 0x3,0x51,0x5f, 0x3,0x51,0x61, + 0x4,0x51,0x24, 0x3,0x51,0x64, 0x3,0x51,0x65, 0x3,0x55,0x3d, + 0x4,0x56,0x62, 0x3,0x55,0x3f, 0x3,0x55,0x44, 0x7,0x39,0x26, + 0x3,0x57,0x51, 0x3,0x58,0x2c, 0x4,0x56,0x64, 0x3,0x5c,0x5a, + 0x3,0x5a,0x59, 0x3,0x5c,0x54, 0x3,0x5c,0x5b, 0x4,0x63,0x5f, + 0x4,0x66,0x4e, 0x5,0x73,0x57, 0x4,0x6a,0x50, 0x3,0x60,0x3a, + 0x3,0x61,0x7a, 0x4,0x27,0x2c, 0x3,0x29,0x7a, 0x3,0x37,0x58, + 0x3,0x47,0x74, 0x3,0x2d,0x6a, 0x4,0x2d,0x76, 0x3,0x37,0x36, + 0x4,0x38,0x6b, 0x3,0x29,0x7b, 0x4,0x2a,0x2c, 0x4,0x38,0x6c, + 0x3,0x29,0x7d, 0x3,0x29,0x7e, 0x5,0x2e,0x53, 0x6,0x39,0x40, + 0x4,0x2d,0x7a, 0x4,0x44,0x5f, 0x7,0x39,0x2d, 0x4,0x5b,0x64, + 0x4,0x66,0x50, 0x3,0x21,0x6a, 0x3,0x32,0x33, 0x4,0x23,0x26, + 0x3,0x26,0x65, 0x4,0x24,0x55, 0x6,0x2c,0x71, 0x4,0x27,0x33, + 0x5,0x26,0x77, 0x4,0x27,0x32, 0x4,0x27,0x2f, 0x3,0x2d,0x6c, + 0x3,0x2d,0x6f, 0x4,0x2a,0x2e, 0x3,0x2d,0x6e, 0x3,0x32,0x34, + 0x3,0x32,0x35, 0x4,0x2d,0x7d, 0x4,0x2d,0x7c, 0x4,0x32,0x7a, + 0x5,0x33,0x4d, 0x4,0x32,0x79, 0x4,0x32,0x7e, 0x3,0x37,0x38, + 0x6,0x41,0x66, 0x3,0x37,0x37, 0x4,0x38,0x70, 0x4,0x38,0x72, + 0x4,0x38,0x73, 0x4,0x44,0x63, 0x6,0x54,0x78, 0x4,0x3e,0x4e, + 0x3,0x42,0x5e, 0x4,0x44,0x62, 0x4,0x44,0x60, 0x4,0x44,0x64, + 0x4,0x4a,0x6f, 0x4,0x4a,0x6e, 0x4,0x4a,0x72, 0x4,0x4a,0x71, + 0x4,0x4a,0x73, 0x4,0x51,0x2e, 0x4,0x51,0x30, 0x4,0x51,0x2f, + 0x4,0x56,0x67, 0x3,0x55,0x46, 0x3,0x55,0x47, 0x4,0x5b,0x66, + 0x4,0x5b,0x65, 0x4,0x60,0x24, 0x7,0x53,0x6b, 0x4,0x6a,0x51, + 0x4,0x27,0x34, 0x4,0x24,0x59, 0x3,0x26,0x6d, 0x4,0x24,0x56, + 0x3,0x26,0x6c, 0x6,0x2c,0x75, 0x4,0x27,0x39, 0x5,0x27,0x2e, + 0x3,0x2a,0x29, 0x3,0x2a,0x24, 0x3,0x2a,0x25, 0x4,0x27,0x3a, + 0x4,0x2a,0x32, 0x4,0x2a,0x34, 0x4,0x2a,0x35, 0x3,0x2d,0x72, + 0x6,0x32,0x67, 0x3,0x32,0x37, 0x5,0x2e,0x5c, 0x4,0x2e,0x21, + 0x4,0x2d,0x7e, 0x4,0x2e,0x22, 0x4,0x2e,0x26, 0x6,0x41,0x6d, + 0x4,0x2e,0x27, 0x5,0x33,0x51, 0x4,0x33,0x28, 0x6,0x41,0x75, + 0x4,0x33,0x29, 0x4,0x33,0x25, 0x4,0x33,0x2b, 0x4,0x33,0x27, + 0x4,0x33,0x2e, 0x4,0x38,0x79, 0x4,0x38,0x77, 0x3,0x3d,0x2c, + 0x4,0x38,0x7b, 0x6,0x4b,0x43, 0x4,0x44,0x65, 0x4,0x3e,0x54, + 0x4,0x44,0x66, 0x4,0x3e,0x53, 0x3,0x42,0x60, 0x4,0x3e,0x52, + 0x4,0x44,0x6a, 0x6,0x5e,0x6e, 0x4,0x44,0x69, 0x4,0x44,0x68, + 0x4,0x44,0x67, 0x3,0x47,0x76, 0x4,0x38,0x7a, 0x4,0x4a,0x7b, + 0x4,0x4a,0x76, 0x4,0x4a,0x7a, 0x4,0x4a,0x7c, 0x7,0x2f,0x74, + 0x4,0x51,0x32, 0x4,0x51,0x34, 0x3,0x55,0x48, 0x4,0x56,0x6a, + 0x4,0x56,0x6b, 0x4,0x5b,0x67, 0x5,0x68,0x3b, 0x4,0x63,0x65, + 0x4,0x63,0x66, 0x4,0x63,0x67, 0x4,0x63,0x63, 0x4,0x6b,0x6f, + 0x3,0x24,0x2e, 0x4,0x23,0x29, 0x3,0x24,0x30, 0x3,0x24,0x31, + 0x3,0x26,0x71, 0x3,0x26,0x6f, 0x3,0x26,0x70, 0x3,0x2a,0x2e, + 0x3,0x2d,0x76, 0x6,0x2d,0x21, 0x3,0x2a,0x30, 0x4,0x27,0x3b, + 0x3,0x2a,0x31, 0x3,0x2d,0x7d, 0x3,0x32,0x3a, 0x4,0x2a,0x37, + 0x4,0x2a,0x38, 0xf,0x2c,0x32, 0x4,0x33,0x2f, 0x3,0x32,0x43, + 0x3,0x32,0x44, 0x3,0x32,0x3b, 0x4,0x33,0x30, 0x3,0x32,0x45, + 0xf,0x31,0x27, 0x3,0x32,0x42, 0x3,0x37,0x3f, 0x3,0x37,0x42, + 0x3,0x37,0x41, 0x4,0x33,0x33, 0x3,0x37,0x3e, 0x3,0x37,0x43, + 0x3,0x3d,0x34, 0x4,0x38,0x7d, 0x5,0x3a,0x2d, 0x3,0x42,0x63, + 0x3,0x3d,0x31, 0x3,0x3d,0x30, 0x3,0x42,0x6c, 0xf,0x36,0x59, + 0xf,0x3d,0x3b, 0x4,0x3e,0x59, 0x3,0x42,0x65, 0x3,0x42,0x69, + 0x5,0x40,0x4e, 0x3,0x42,0x72, 0xf,0x43,0x49, 0xf,0x43,0x56, + 0x3,0x48,0x24, 0x7,0x25,0x37, 0x4,0x4b,0x22, 0x4,0x4b,0x21, + 0x3,0x4d,0x37, 0x3,0x4d,0x3c, 0x3,0x4d,0x33, 0x3,0x4d,0x38, + 0x3,0x4d,0x34, 0x3,0x4d,0x32, 0x3,0x51,0x68, 0x5,0x55,0x5d, + 0x4,0x51,0x37, 0x3,0x51,0x69, 0x3,0x55,0x4a, 0x4,0x56,0x6f, + 0xf,0x55,0x7a, 0xf,0x56,0x22, 0x3,0x55,0x4e, 0x4,0x5b,0x69, + 0x3,0x55,0x4c, 0xf,0x5b,0x2d, 0x3,0x58,0x31, 0x4,0x60,0x2a, + 0xf,0x62,0x78, 0xf,0x62,0x7b, 0x3,0x5c,0x61, 0x4,0x2a,0x39, + 0x4,0x2a,0x3a, 0x5,0x2e,0x62, 0x4,0x2e,0x2b, 0x4,0x33,0x35, + 0x4,0x33,0x34, 0x4,0x38,0x7e, 0x4,0x44,0x70, 0x4,0x44,0x71, + 0x4,0x44,0x6f, 0x4,0x4b,0x23, 0x4,0x4b,0x24, 0x4,0x5b,0x6c, + 0x4,0x6d,0x5a, 0x4,0x24,0x5e, 0x5,0x27,0x32, 0x3,0x2a,0x34, + 0x3,0x2e,0x23, 0x4,0x2a,0x3d, 0x3,0x32,0x4a, 0x3,0x32,0x4b, + 0x4,0x2e,0x2d, 0x3,0x32,0x49, 0x4,0x2e,0x2c, 0x4,0x33,0x3b, + 0x4,0x39,0x21, 0x4,0x33,0x3a, 0x4,0x33,0x38, 0x4,0x33,0x39, + 0x4,0x33,0x37, 0x4,0x39,0x23, 0x4,0x39,0x26, 0x4,0x33,0x3c, + 0x4,0x39,0x24, 0x4,0x3e,0x62, 0x4,0x3e,0x61, 0x4,0x3e,0x5d, + 0x4,0x3e,0x60, 0x3,0x42,0x76, 0x4,0x3e,0x63, 0x5,0x47,0x48, + 0x4,0x44,0x73, 0x4,0x44,0x76, 0x4,0x44,0x74, 0x4,0x44,0x78, + 0x4,0x44,0x77, 0x4,0x44,0x75, 0x4,0x4b,0x25, 0x4,0x4b,0x27, + 0x4,0x4b,0x26, 0x4,0x51,0x3f, 0x3,0x51,0x6f, 0x4,0x51,0x42, + 0x4,0x51,0x41, 0x4,0x56,0x72, 0x4,0x56,0x73, 0x3,0x55,0x51, + 0x4,0x56,0x75, 0x3,0x55,0x50, 0x4,0x56,0x71, 0x4,0x5b,0x6f, + 0x4,0x5b,0x6e, 0x4,0x60,0x2c, 0x4,0x60,0x2b, 0x4,0x68,0x75, + 0x4,0x6b,0x70, 0x4,0x6a,0x53, 0x3,0x32,0x4c, 0x4,0x3e,0x65, + 0x3,0x4d,0x3f, 0x4,0x56,0x78, 0x3,0x3d,0x40, 0xf,0x50,0x4e, + 0x5,0x24,0x63, 0x6,0x28,0x62, 0x3,0x26,0x72, 0x4,0x2a,0x41, + 0x3,0x2e,0x29, 0x4,0x2a,0x43, 0x4,0x2e,0x2f, 0x4,0x2e,0x31, + 0x5,0x33,0x64, 0x3,0x37,0x48, 0x3,0x3d,0x41, 0x4,0x39,0x28, + 0x4,0x3e,0x69, 0x3,0x42,0x79, 0x3,0x42,0x7a, 0x4,0x3e,0x68, + 0x4,0x44,0x79, 0x3,0x4d,0x40, 0x4,0x4b,0x2a, 0x4,0x4b,0x29, + 0x4,0x51,0x44, 0x5,0x5c,0x2f, 0x4,0x5b,0x72, 0x4,0x5b,0x73, + 0x4,0x60,0x2e, 0x4,0x63,0x69, 0x4,0x6a,0x54, 0x4,0x3e,0x6d, + 0x4,0x24,0x61, 0x4,0x24,0x62, 0x5,0x27,0x37, 0x3,0x2a,0x3c, + 0x4,0x2a,0x46, 0x3,0x2e,0x2d, 0x4,0x2a,0x49, 0x3,0x2e,0x2c, + 0x3,0x2e,0x2e, 0x3,0x32,0x56, 0x4,0x2e,0x37, 0x4,0x2e,0x3b, + 0x4,0x2e,0x35, 0x4,0x2e,0x36, 0x3,0x32,0x54, 0x4,0x2e,0x33, + 0x4,0x2e,0x3f, 0x4,0x2e,0x39, 0x6,0x39,0x6b, 0x3,0x32,0x53, + 0x4,0x2e,0x38, 0x4,0x2e,0x3a, 0x5,0x33,0x6d, 0x4,0x33,0x42, + 0x3,0x37,0x4c, 0x4,0x33,0x40, 0x4,0x2e,0x3c, 0x4,0x33,0x3f, + 0x4,0x33,0x45, 0x3,0x37,0x4b, 0x4,0x33,0x43, 0x4,0x39,0x32, + 0x4,0x39,0x33, 0x3,0x3d,0x46, 0x3,0x3d,0x4b, 0x6,0x4b,0x5a, + 0x3,0x3d,0x49, 0x4,0x39,0x36, 0x5,0x40,0x60, 0x4,0x39,0x2f, + 0x4,0x39,0x30, 0x3,0x3d,0x48, 0x3,0x3d,0x4a, 0x5,0x3a,0x3b, + 0x4,0x39,0x35, 0x4,0x39,0x38, 0x4,0x3e,0x74, 0x5,0x40,0x64, + 0x4,0x3e,0x6f, 0x4,0x3e,0x78, 0x4,0x3e,0x6e, 0x4,0x3e,0x76, + 0x4,0x3e,0x73, 0x4,0x3e,0x7a, 0x4,0x45,0x24, 0x4,0x45,0x28, + 0x6,0x5f,0x2d, 0x3,0x48,0x2a, 0x3,0x48,0x2c, 0x4,0x45,0x23, + 0x4,0x45,0x21, 0x7,0x25,0x58, 0x4,0x4b,0x38, 0x3,0x4d,0x42, + 0x4,0x4b,0x37, 0x4,0x4b,0x35, 0x4,0x4b,0x33, 0x4,0x4b,0x2f, + 0x7,0x25,0x5c, 0x4,0x4b,0x2e, 0x5,0x47,0x59, 0x4,0x4b,0x3b, + 0x7,0x30,0x36, 0x4,0x51,0x48, 0x4,0x51,0x49, 0x3,0x51,0x75, + 0x4,0x51,0x4e, 0x4,0x51,0x4a, 0x4,0x51,0x50, 0x4,0x57,0x26, + 0x4,0x57,0x22, 0x4,0x5b,0x7b, 0x4,0x5b,0x77, 0x7,0x40,0x6b, + 0x4,0x57,0x25, 0x7,0x40,0x67, 0x4,0x60,0x32, 0x4,0x60,0x2f, + 0x4,0x60,0x30, 0x4,0x66,0x58, 0x4,0x66,0x59, 0x3,0x5e,0x40, + 0x5,0x73,0x5c, 0x4,0x6a,0x55, 0x4,0x6b,0x72, 0x4,0x6b,0x71, + 0x3,0x62,0x2d, 0x3,0x26,0x75, 0x3,0x2e,0x30, 0x3,0x32,0x58, + 0x3,0x37,0x4e, 0x3,0x43,0x22, 0x3,0x48,0x2d, 0x5,0x47,0x5b, + 0x5,0x4e,0x59, 0x4,0x51,0x56, 0x4,0x60,0x37, 0x4,0x66,0x5b, + 0x4,0x6c,0x73, 0x4,0x27,0x46, 0x4,0x2a,0x4e, 0x3,0x2e,0x31, + 0x4,0x2e,0x46, 0x4,0x2e,0x45, 0x4,0x33,0x47, 0x4,0x33,0x48, + 0x4,0x39,0x3a, 0x6,0x55,0x52, 0x4,0x45,0x30, 0x4,0x45,0x32, + 0x3,0x48,0x2f, 0x3,0x4d,0x43, 0x4,0x4b,0x3d, 0x4,0x51,0x57, + 0x4,0x5b,0x7e, 0x4,0x63,0x6c, 0x4,0x27,0x48, 0x4,0x2a,0x51, + 0x4,0x2a,0x50, 0x4,0x2e,0x47, 0x4,0x2e,0x49, 0x3,0x32,0x59, + 0x4,0x33,0x4b, 0x3,0x37,0x4f, 0x3,0x3d,0x4e, 0x3,0x43,0x23, + 0x5,0x40,0x6f, 0x3,0x48,0x32, 0x4,0x51,0x5a, 0x4,0x45,0x36, + 0x4,0x57,0x2c, 0x4,0x60,0x38, 0x3,0x5f,0x38, 0x4,0x6e,0x48, + 0x3,0x26,0x79, 0x4,0x24,0x65, 0x4,0x27,0x4e, 0x4,0x27,0x4f, + 0x4,0x27,0x4d, 0x4,0x27,0x4c, 0x4,0x27,0x4a, 0x4,0x2a,0x53, + 0x4,0x2a,0x56, 0x4,0x2a,0x57, 0x4,0x2a,0x54, 0x4,0x2a,0x58, + 0x5,0x2a,0x6d, 0x4,0x2a,0x5a, 0x6,0x33,0x38, 0x3,0x2e,0x34, + 0x4,0x2e,0x52, 0x3,0x32,0x5d, 0x3,0x32,0x66, 0x3,0x32,0x60, + 0x4,0x2e,0x4d, 0x3,0x32,0x61, 0x5,0x33,0x76, 0x4,0x33,0x50, + 0x4,0x33,0x51, 0x3,0x37,0x56, 0x3,0x37,0x54, 0x4,0x33,0x52, + 0x4,0x33,0x4e, 0x4,0x33,0x4d, 0x3,0x3d,0x50, 0x4,0x39,0x49, + 0x3,0x3d,0x54, 0x4,0x39,0x4a, 0x3,0x3d,0x55, 0x4,0x39,0x45, + 0x4,0x39,0x48, 0x4,0x39,0x3f, 0x4,0x39,0x41, 0x4,0x39,0x4b, + 0x4,0x39,0x46, 0x4,0x39,0x4d, 0x4,0x39,0x47, 0x4,0x39,0x43, + 0x4,0x3f,0x22, 0x4,0x39,0x4c, 0x4,0x39,0x42, 0x4,0x3f,0x30, + 0x4,0x3f,0x2d, 0x3,0x43,0x24, 0x4,0x3f,0x25, 0x4,0x3f,0x26, + 0x4,0x3f,0x27, 0x4,0x3f,0x2b, 0x4,0x3f,0x2c, 0x6,0x55,0x61, + 0x5,0x47,0x61, 0x4,0x45,0x39, 0x4,0x45,0x41, 0x4,0x45,0x3c, + 0x4,0x45,0x37, 0x3,0x48,0x37, 0x4,0x45,0x43, 0x4,0x45,0x46, + 0x4,0x45,0x3f, 0x4,0x45,0x44, 0x3,0x48,0x3a, 0x4,0x45,0x38, + 0x3,0x4d,0x45, 0x4,0x4b,0x45, 0x4,0x4b,0x42, 0x4,0x4b,0x44, + 0x4,0x4b,0x47, 0x4,0x4b,0x43, 0x4,0x4b,0x4d, 0x3,0x4d,0x47, + 0x5,0x4e,0x60, 0x4,0x4b,0x3f, 0x3,0x51,0x77, 0x3,0x51,0x78, + 0x4,0x51,0x5c, 0x4,0x51,0x60, 0x3,0x51,0x7c, 0x3,0x51,0x7a, + 0x4,0x51,0x5d, 0x4,0x51,0x64, 0x4,0x57,0x32, 0x4,0x57,0x2e, + 0x4,0x57,0x31, 0x4,0x57,0x2f, 0x3,0x55,0x5a, 0x4,0x57,0x30, + 0x4,0x57,0x33, 0x4,0x57,0x34, 0x5,0x56,0x22, 0x5,0x62,0x69, + 0x4,0x5c,0x27, 0x4,0x5c,0x29, 0x4,0x5c,0x2a, 0x4,0x5c,0x25, + 0x3,0x58,0x37, 0x4,0x5c,0x26, 0x4,0x63,0x70, 0x4,0x63,0x6e, + 0x4,0x63,0x71, 0x4,0x63,0x6f, 0x4,0x66,0x5d, 0x3,0x5e,0x41, + 0x4,0x68,0x78, 0x4,0x6a,0x57, 0x4,0x68,0x7a, 0x4,0x6c,0x75, + 0x4,0x6e,0x4d, 0x4,0x27,0x51, 0x4,0x2a,0x5f, 0x4,0x33,0x57, + 0x4,0x45,0x4a, 0x3,0x55,0x5d, 0x4,0x57,0x38, 0x4,0x63,0x74, + 0x4,0x6b,0x75, 0x4,0x2e,0x57, 0x4,0x2e,0x58, 0x4,0x33,0x5a, + 0x4,0x33,0x59, 0x6,0x4c,0x2b, 0x4,0x3f,0x33, 0x4,0x45,0x4c, + 0x3,0x24,0x32, 0x3,0x26,0x7a, 0x4,0x27,0x53, 0xf,0x28,0x7a, + 0x4,0x2a,0x64, 0x3,0x2e,0x38, 0x4,0x2a,0x62, 0x3,0x2e,0x3c, + 0x3,0x2d,0x3b, 0x4,0x2e,0x5f, 0x4,0x2e,0x5c, 0x4,0x2e,0x62, + 0x5,0x2f,0x34, 0x3,0x37,0x5b, 0x3,0x32,0x6a, 0x3,0x32,0x6b, + 0x4,0x2e,0x5e, 0x4,0x2e,0x61, 0x4,0x33,0x5e, 0x4,0x33,0x61, + 0x3,0x37,0x5c, 0x4,0x33,0x5f, 0x3,0x37,0x5a, 0x4,0x33,0x60, + 0x3,0x37,0x5e, 0x3,0x3d,0x5b, 0x5,0x3a,0x59, 0x6,0x4c,0x33, + 0x4,0x39,0x58, 0x3,0x3d,0x58, 0x4,0x39,0x53, 0x4,0x3f,0x40, + 0x4,0x3f,0x39, 0x4,0x3f,0x3f, 0x3,0x43,0x2f, 0x4,0x3f,0x3c, + 0x3,0x43,0x32, 0x4,0x3f,0x3d, 0x3,0x43,0x2c, 0x4,0x3f,0x3e, + 0x4,0x3f,0x38, 0x4,0x3f,0x3a, 0x4,0x3f,0x3b, 0x4,0x3f,0x42, + 0x4,0x45,0x4e, 0x3,0x48,0x43, 0x4,0x45,0x51, 0x3,0x48,0x41, + 0x4,0x45,0x4d, 0x4,0x45,0x55, 0x4,0x45,0x4f, 0x5,0x47,0x76, + 0x4,0x4b,0x5c, 0x4,0x4b,0x58, 0x4,0x4b,0x56, 0x4,0x4b,0x55, + 0x4,0x4b,0x5e, 0x7,0x26,0x24, 0x4,0x4b,0x5b, 0x3,0x52,0x23, + 0x3,0x51,0x7d, 0x4,0x51,0x6c, 0x3,0x51,0x7e, 0x7,0x30,0x59, + 0x5,0x56,0x33, 0x4,0x51,0x70, 0x4,0x51,0x6d, 0x4,0x57,0x3b, + 0x4,0x57,0x41, 0x3,0x48,0x42, 0x4,0x57,0x39, 0x3,0x55,0x5e, + 0x3,0x55,0x5f, 0x4,0x57,0x3f, 0x3,0x58,0x41, 0x4,0x5c,0x2d, + 0x3,0x58,0x3d, 0x4,0x5c,0x31, 0x4,0x5c,0x2f, 0x4,0x5c,0x2e, + 0x4,0x60,0x3f, 0x7,0x4e,0x5c, 0x3,0x5c,0x63, 0x4,0x63,0x76, + 0x4,0x63,0x75, 0x4,0x66,0x5f, 0x4,0x66,0x60, 0x4,0x66,0x61, + 0x4,0x68,0x7c, 0x4,0x68,0x7b, 0x3,0x60,0x75, 0x3,0x61,0x67, + 0x3,0x2e,0x3f, 0x4,0x2a,0x67, 0x4,0x2a,0x66, 0x6,0x33,0x48, + 0x3,0x32,0x6e, 0x4,0x2e,0x64, 0x3,0x32,0x71, 0x3,0x37,0x64, + 0x4,0x33,0x63, 0x4,0x33,0x62, 0x3,0x3d,0x61, 0x3,0x3d,0x60, + 0x4,0x39,0x59, 0x4,0x3f,0x45, 0x4,0x3f,0x44, 0x3,0x43,0x3a, + 0x3,0x43,0x3b, 0x3,0x43,0x3e, 0x4,0x3f,0x47, 0x3,0x43,0x3c, + 0x3,0x43,0x3f, 0x3,0x48,0x46, 0x5,0x48,0x24, 0x3,0x48,0x49, + 0x5,0x4e,0x76, 0x3,0x4d,0x4e, 0x4,0x51,0x76, 0x3,0x52,0x25, + 0x4,0x51,0x74, 0x4,0x51,0x75, 0x4,0x57,0x42, 0x3,0x58,0x46, + 0x3,0x58,0x47, 0x3,0x5a,0x64, 0x4,0x66,0x63, 0x3,0x62,0x34, + 0x5,0x24,0x6e, 0x3,0x26,0x7d, 0x5,0x27,0x46, 0x6,0x2d,0x49, + 0x4,0x27,0x56, 0x3,0x2a,0x40, 0x3,0x2a,0x41, 0x3,0x2a,0x43, + 0x4,0x2a,0x6a, 0x4,0x2a,0x6f, 0x4,0x2a,0x6b, 0x4,0x2a,0x69, + 0x4,0x2a,0x6c, 0xf,0x2c,0x6d, 0x4,0x2e,0x65, 0x3,0x32,0x75, + 0x3,0x32,0x7a, 0x6,0x42,0x66, 0x4,0x33,0x67, 0x4,0x33,0x66, + 0x3,0x37,0x6d, 0x4,0x33,0x65, 0x5,0x34,0x3b, 0x5,0x34,0x39, + 0x4,0x33,0x6a, 0x4,0x33,0x69, 0x4,0x33,0x6b, 0x3,0x37,0x68, + 0x4,0x33,0x6d, 0x5,0x34,0x38, 0x3,0x37,0x6e, 0xf,0x37,0x3b, + 0x4,0x33,0x64, 0x5,0x3a,0x65, 0x4,0x39,0x5e, 0x4,0x39,0x62, + 0x3,0x3d,0x67, 0x4,0x39,0x64, 0x3,0x3d,0x6a, 0x4,0x39,0x63, + 0x3,0x3d,0x6b, 0x4,0x39,0x61, 0x4,0x3f,0x4f, 0x3,0x43,0x40, + 0x4,0x3f,0x4d, 0x3,0x43,0x45, 0x4,0x3f,0x4c, 0x3,0x43,0x42, + 0x4,0x3f,0x4b, 0x3,0x43,0x43, 0x4,0x45,0x57, 0x4,0x3f,0x49, + 0x5,0x41,0x31, 0x3,0x48,0x51, 0x3,0x48,0x4a, 0x4,0x45,0x5b, + 0x3,0x48,0x53, 0x3,0x48,0x4e, 0x4,0x45,0x5a, 0x3,0x48,0x4c, + 0x4,0x45,0x58, 0x6,0x5f,0x6b, 0x4,0x45,0x59, 0x4,0x4b,0x65, + 0x4,0x4b,0x61, 0x3,0x4d,0x54, 0x4,0x4b,0x62, 0x3,0x4d,0x52, + 0x7,0x26,0x32, 0x3,0x4d,0x58, 0x4,0x4b,0x68, 0x4,0x4b,0x66, + 0x4,0x4b,0x64, 0x3,0x4d,0x59, 0x4,0x51,0x7d, 0x4,0x51,0x7c, + 0x3,0x52,0x2b, 0x4,0x51,0x79, 0x4,0x51,0x78, 0x4,0x51,0x7a, + 0x3,0x52,0x2d, 0x4,0x57,0x45, 0x3,0x55,0x63, 0x4,0x57,0x47, + 0x3,0x58,0x48, 0x7,0x41,0x2e, 0x4,0x5c,0x37, 0x4,0x5c,0x35, + 0x4,0x5c,0x36, 0x3,0x5e,0x46, 0x4,0x63,0x79, 0x4,0x66,0x65, + 0x7,0x58,0x4c, 0x4,0x66,0x64, 0x4,0x68,0x7e, 0x4,0x69,0x21, + 0x3,0x62,0x39, 0x4,0x24,0x69, 0x6,0x2d,0x4e, 0x3,0x2e,0x46, + 0x3,0x2e,0x45, 0x4,0x2a,0x71, 0x4,0x2a,0x72, 0x3,0x33,0x21, + 0x3,0x32,0x7e, 0x3,0x32,0x7d, 0x4,0x33,0x6f, 0x4,0x33,0x70, + 0x3,0x37,0x6f, 0x5,0x34,0x45, 0x4,0x33,0x72, 0x4,0x33,0x71, + 0x6,0x42,0x6f, 0x3,0x3d,0x6c, 0x4,0x39,0x67, 0x3,0x3d,0x6d, + 0x6,0x4c,0x53, 0x3,0x3d,0x6e, 0x5,0x41,0x39, 0x4,0x3f,0x53, + 0x4,0x3f,0x52, 0x6,0x56,0x27, 0x4,0x45,0x60, 0x6,0x5f,0x78, + 0x4,0x4b,0x6c, 0x5,0x4f,0x23, 0x5,0x54,0x24, 0x4,0x52,0x25, + 0x4,0x52,0x22, 0x4,0x52,0x24, 0x7,0x30,0x6f, 0x3,0x55,0x65, + 0x3,0x55,0x66, 0x4,0x57,0x4c, 0x4,0x57,0x4d, 0x4,0x57,0x4b, + 0x4,0x57,0x4f, 0x3,0x55,0x67, 0x4,0x5c,0x39, 0x4,0x5c,0x3a, + 0x4,0x60,0x48, 0x4,0x60,0x49, 0x4,0x63,0x7c, 0x4,0x69,0x22, + 0x3,0x24,0x34, 0x3,0x2a,0x46, 0x4,0x2a,0x76, 0x3,0x2e,0x4a, + 0x3,0x33,0x25, 0x4,0x2e,0x6d, 0x3,0x33,0x22, 0x5,0x34,0x46, + 0x3,0x3d,0x6f, 0x4,0x39,0x6a, 0x3,0x43,0x48, 0x4,0x3f,0x54, + 0x4,0x3f,0x55, 0x4,0x3f,0x5a, 0x4,0x45,0x63, 0x4,0x57,0x52, + 0x4,0x5c,0x3b, 0x3,0x5a,0x68, 0x5,0x2b,0x21, 0x4,0x2e,0x75, + 0x4,0x2e,0x70, 0x3,0x33,0x28, 0x4,0x2e,0x77, 0x3,0x33,0x29, + 0x4,0x2e,0x73, 0x4,0x2e,0x72, 0x4,0x33,0x76, 0x4,0x33,0x7d, + 0x3,0x37,0x74, 0x5,0x34,0x48, 0x4,0x33,0x77, 0x4,0x33,0x7b, + 0x3,0x37,0x75, 0x6,0x42,0x76, 0x4,0x33,0x78, 0x4,0x39,0x6d, + 0x4,0x39,0x74, 0x4,0x39,0x71, 0x3,0x3d,0x74, 0x4,0x3f,0x5b, + 0x4,0x39,0x72, 0x3,0x3d,0x7a, 0x4,0x39,0x75, 0x3,0x3d,0x73, + 0x4,0x39,0x6f, 0x6,0x4c,0x5b, 0x6,0x4c,0x56, 0x3,0x43,0x50, + 0x4,0x3f,0x66, 0x4,0x3f,0x62, 0x4,0x3f,0x61, 0x3,0x43,0x52, + 0x3,0x43,0x53, 0x4,0x3f,0x5d, 0x3,0x43,0x4e, 0x4,0x3f,0x60, + 0x3,0x43,0x4b, 0x4,0x3f,0x63, 0x5,0x48,0x46, 0x4,0x39,0x76, + 0x4,0x45,0x65, 0x3,0x48,0x5b, 0x4,0x45,0x6a, 0x4,0x45,0x69, + 0x3,0x48,0x5f, 0x4,0x45,0x6e, 0x4,0x45,0x68, 0x3,0x48,0x59, + 0x4,0x45,0x6d, 0x4,0x45,0x66, 0x5,0x48,0x36, 0x4,0x4b,0x7b, + 0x4,0x4b,0x75, 0x4,0x4b,0x70, 0x3,0x4d,0x61, 0x3,0x4d,0x5e, + 0x4,0x4c,0x22, 0x3,0x4d,0x67, 0x4,0x4b,0x7e, 0x3,0x4d,0x62, + 0x4,0x4c,0x2e, 0x5,0x4f,0x3b, 0x3,0x4d,0x64, 0x4,0x4c,0x30, + 0x4,0x4c,0x25, 0x4,0x4c,0x2d, 0x4,0x4b,0x79, 0x5,0x4f,0x32, + 0x3,0x4d,0x5f, 0x5,0x4f,0x45, 0x4,0x4c,0x2c, 0x4,0x4c,0x27, + 0x4,0x4b,0x77, 0x3,0x4d,0x66, 0x3,0x4d,0x68, 0x4,0x4c,0x28, + 0x5,0x4f,0x36, 0x4,0x52,0x34, 0x4,0x52,0x3a, 0x3,0x52,0x31, + 0x4,0x52,0x37, 0x4,0x52,0x2b, 0x4,0x52,0x38, 0x3,0x52,0x35, + 0x4,0x52,0x39, 0x4,0x52,0x3b, 0x4,0x52,0x36, 0x4,0x52,0x2f, + 0x4,0x52,0x3d, 0x4,0x52,0x29, 0x3,0x52,0x32, 0x4,0x57,0x5b, + 0x5,0x5c,0x6d, 0x4,0x57,0x5e, 0x4,0x57,0x5a, 0x4,0x57,0x62, + 0x5,0x5c,0x7d, 0x4,0x57,0x65, 0x4,0x57,0x53, 0x3,0x55,0x6c, + 0x4,0x57,0x56, 0x4,0x57,0x58, 0x4,0x57,0x59, 0x5,0x5c,0x7e, + 0x4,0x57,0x55, 0x5,0x5d,0x30, 0x4,0x5c,0x44, 0x4,0x5c,0x4f, + 0x4,0x5c,0x4b, 0x4,0x5c,0x50, 0x4,0x5c,0x43, 0x3,0x58,0x4a, + 0x4,0x5c,0x4a, 0x3,0x5a,0x6c, 0x4,0x5c,0x42, 0x4,0x5c,0x4c, + 0x7,0x41,0x3f, 0x4,0x5c,0x46, 0x4,0x5c,0x49, 0x4,0x5c,0x40, + 0x5,0x63,0x34, 0x4,0x5c,0x48, 0x3,0x58,0x4d, 0x3,0x58,0x4b, + 0x5,0x63,0x41, 0x4,0x60,0x56, 0x5,0x68,0x6e, 0x3,0x5a,0x6a, + 0x4,0x60,0x53, 0x5,0x68,0x66, 0x3,0x5a,0x6d, 0x3,0x5a,0x69, + 0x3,0x5a,0x6b, 0x4,0x5c,0x51, 0x4,0x63,0x7e, 0x4,0x66,0x69, + 0x4,0x66,0x6c, 0x4,0x66,0x6e, 0x3,0x5e,0x4a, 0x4,0x66,0x6a, + 0x3,0x5e,0x4d, 0x4,0x66,0x68, 0x4,0x66,0x6d, 0x3,0x5f,0x56, + 0x5,0x70,0x61, 0x4,0x69,0x26, 0x4,0x69,0x28, 0x4,0x6a,0x5d, + 0x4,0x6a,0x61, 0x4,0x6a,0x5c, 0x3,0x60,0x5f, 0x4,0x6b,0x76, + 0x4,0x6d,0x5c, 0x4,0x6d,0x76, 0x7,0x65,0x5d, 0x4,0x2a,0x77, + 0x3,0x33,0x2f, 0x3,0x33,0x33, 0x6,0x43,0x22, 0x4,0x34,0x25, + 0x5,0x34,0x59, 0x3,0x37,0x7c, 0x6,0x4c,0x60, 0x4,0x39,0x7b, + 0x4,0x39,0x7c, 0x3,0x3d,0x7d, 0x3,0x3d,0x7c, 0x4,0x39,0x7d, + 0x3,0x43,0x5a, 0x3,0x43,0x56, 0x3,0x43,0x57, 0x3,0x43,0x59, + 0x3,0x43,0x5b, 0x3,0x48,0x63, 0x4,0x45,0x72, 0x3,0x48,0x64, + 0x3,0x48,0x65, 0x6,0x60,0x2c, 0x3,0x48,0x66, 0x3,0x4d,0x6b, + 0x3,0x4d,0x6c, 0x3,0x4d,0x69, 0x3,0x4d,0x6a, 0x4,0x4c,0x37, + 0x7,0x26,0x57, 0x4,0x4c,0x35, 0x3,0x52,0x36, 0x4,0x57,0x6d, + 0x3,0x55,0x73, 0x3,0x55,0x72, 0x4,0x57,0x69, 0x4,0x57,0x6a, + 0x3,0x4d,0x74, 0x4,0x57,0x6b, 0x5,0x63,0x4e, 0x4,0x5c,0x56, + 0x3,0x58,0x52, 0x4,0x5c,0x55, 0x4,0x5c,0x54, 0x5,0x63,0x54, + 0x3,0x58,0x53, 0x3,0x5a,0x70, 0x4,0x60,0x5b, 0x4,0x60,0x5d, + 0x4,0x64,0x23, 0x3,0x5c,0x68, 0x7,0x54,0x3a, 0x5,0x70,0x70, + 0x4,0x6a,0x65, 0x5,0x76,0x39, 0x4,0x6c,0x7a, 0x3,0x61,0x45, + 0x4,0x27,0x5c, 0x6,0x33,0x64, 0x3,0x2e,0x57, 0x3,0x2e,0x55, + 0x3,0x2e,0x58, 0x4,0x2e,0x78, 0x4,0x2e,0x7e, 0x3,0x33,0x35, + 0x3,0x33,0x34, 0x4,0x2e,0x7c, 0x3,0x33,0x39, 0x4,0x2f,0x21, + 0x3,0x33,0x38, 0x4,0x2e,0x7d, 0x3,0x33,0x36, 0x3,0x33,0x3a, + 0x4,0x34,0x2e, 0x4,0x34,0x26, 0x3,0x38,0x23, 0x3,0x38,0x2a, + 0x4,0x34,0x27, 0x4,0x34,0x30, 0x3,0x38,0x2c, 0x4,0x34,0x2d, + 0x4,0x34,0x2b, 0x4,0x34,0x29, 0x3,0x38,0x28, 0x3,0x38,0x2d, + 0x3,0x38,0x25, 0x3,0x3e,0x36, 0x5,0x3b,0x2c, 0x3,0x3e,0x2d, + 0x3,0x3e,0x32, 0x3,0x3e,0x27, 0x3,0x3e,0x30, 0x3,0x3e,0x25, + 0x6,0x4c,0x71, 0x3,0x3e,0x31, 0x4,0x3f,0x6a, 0x3,0x43,0x65, + 0x3,0x43,0x6b, 0x4,0x3f,0x6e, 0x4,0x3f,0x73, 0x4,0x3f,0x6f, + 0x3,0x43,0x61, 0x3,0x43,0x5d, 0x3,0x48,0x6c, 0x4,0x45,0x75, + 0x4,0x45,0x7e, 0x4,0x45,0x79, 0x4,0x46,0x21, 0x3,0x48,0x67, + 0x3,0x43,0x5f, 0x3,0x48,0x72, 0x3,0x48,0x75, 0x4,0x46,0x23, + 0x5,0x48,0x54, 0x3,0x48,0x6f, 0x3,0x4e,0x2a, 0x5,0x4f,0x53, + 0x4,0x4c,0x3e, 0x4,0x4c,0x3c, 0x4,0x4c,0x40, 0x3,0x4d,0x7b, + 0x3,0x4e,0x21, 0x3,0x4e,0x2d, 0x3,0x4d,0x76, 0x3,0x4d,0x79, + 0x4,0x4c,0x3a, 0x4,0x4c,0x3d, 0x4,0x4c,0x3f, 0x3,0x4d,0x7a, + 0x4,0x4c,0x44, 0x5,0x4f,0x54, 0x3,0x4e,0x26, 0x3,0x4e,0x23, + 0x3,0x52,0x3a, 0x4,0x52,0x49, 0x3,0x52,0x3c, 0x4,0x52,0x47, + 0x3,0x52,0x3d, 0x3,0x52,0x3e, 0x4,0x57,0x73, 0x3,0x55,0x78, + 0x5,0x5d,0x3f, 0x3,0x55,0x76, 0x5,0x5d,0x46, 0x3,0x55,0x77, + 0x4,0x57,0x6e, 0x3,0x55,0x7c, 0x3,0x55,0x7b, 0x7,0x3a,0x39, + 0x4,0x5c,0x62, 0x4,0x5c,0x60, 0x4,0x57,0x72, 0x3,0x58,0x57, + 0x3,0x58,0x56, 0x3,0x59,0x29, 0x4,0x60,0x66, 0x4,0x60,0x63, + 0x4,0x60,0x68, 0x4,0x60,0x62, 0x7,0x47,0x4a, 0x3,0x5a,0x73, + 0x3,0x5a,0x71, 0x5,0x6d,0x22, 0x3,0x5c,0x69, 0x4,0x64,0x24, + 0x3,0x5c,0x6a, 0x3,0x5c,0x6b, 0x3,0x5e,0x4f, 0x3,0x5e,0x4e, + 0x4,0x69,0x2a, 0x7,0x58,0x58, 0x3,0x5f,0x59, 0x4,0x69,0x2b, + 0x4,0x6a,0x66, 0x4,0x6b,0x79, 0x4,0x6b,0x78, 0x7,0x5f,0x33, + 0x3,0x60,0x78, 0x4,0x6c,0x7c, 0x4,0x6c,0x7b, 0x4,0x6d,0x77, + 0x4,0x2a,0x79, 0x4,0x2f,0x29, 0x3,0x38,0x2f, 0x3,0x38,0x32, + 0x5,0x34,0x60, 0x4,0x34,0x34, 0x3,0x38,0x30, 0x4,0x34,0x33, + 0x4,0x3a,0x28, 0x4,0x46,0x25, 0x3,0x48,0x76, 0x4,0x52,0x4e, + 0x4,0x6a,0x6b, 0xf,0x21,0x47, 0x3,0x2a,0x4d, 0x3,0x2e,0x5c, + 0x3,0x2e,0x5b, 0x3,0x2e,0x59, 0x4,0x2a,0x7b, 0x4,0x2f,0x2a, + 0x6,0x3a,0x6b, 0x4,0x2f,0x2d, 0x4,0x34,0x35, 0x4,0x3f,0x75, + 0x4,0x3a,0x2a, 0x3,0x43,0x6c, 0x3,0x43,0x6d, 0x5,0x41,0x65, + 0x3,0x48,0x7a, 0x3,0x48,0x7b, 0x4,0x52,0x4f, 0x4,0x57,0x75, + 0x4,0x5c,0x65, 0x4,0x60,0x6d, 0x4,0x66,0x7b, 0x4,0x6b,0x7b, + 0x6,0x3a,0x74, 0x4,0x2f,0x2e, 0x3,0x31,0x3f, 0x4,0x34,0x38, + 0x4,0x34,0x36, 0x4,0x34,0x37, 0x6,0x43,0x3c, 0x4,0x3a,0x2d, + 0x4,0x3a,0x31, 0x4,0x3a,0x30, 0x4,0x3f,0x76, 0x3,0x48,0x7e, + 0x4,0x46,0x27, 0x3,0x48,0x7d, 0x4,0x46,0x28, 0x3,0x48,0x7c, + 0x4,0x4c,0x49, 0x4,0x52,0x53, 0x3,0x52,0x41, 0x4,0x57,0x77, + 0x4,0x5c,0x6a, 0x4,0x5c,0x6b, 0x4,0x69,0x2c, 0x3,0x33,0x40, + 0x3,0x33,0x41, 0x4,0x34,0x3a, 0x3,0x38,0x33, 0x4,0x34,0x3b, + 0x4,0x34,0x3e, 0x4,0x34,0x3c, 0x3,0x38,0x35, 0x3,0x38,0x34, + 0x4,0x3a,0x34, 0x4,0x3a,0x35, 0x5,0x3b,0x3a, 0x4,0x3a,0x33, + 0x3,0x43,0x70, 0x4,0x3f,0x78, 0x3,0x43,0x71, 0x4,0x3f,0x77, + 0x3,0x43,0x6f, 0x3,0x49,0x21, 0x4,0x46,0x2a, 0x4,0x46,0x29, + 0x4,0x46,0x2b, 0x4,0x52,0x55, 0x4,0x52,0x56, 0x3,0x58,0x5e, + 0x3,0x58,0x60, 0x3,0x58,0x5f, 0x3,0x5c,0x6e, 0x4,0x66,0x7d, + 0x3,0x3e,0x39, 0x3,0x3e,0x3a, 0x4,0x2b,0x27, 0x4,0x2b,0x28, + 0x4,0x2f,0x38, 0x4,0x2b,0x29, 0x3,0x38,0x38, 0x4,0x3f,0x7a, + 0x4,0x46,0x2e, 0x4,0x46,0x2d, 0x4,0x46,0x2f, 0x4,0x46,0x32, + 0x4,0x46,0x30, 0x4,0x4c,0x4f, 0x4,0x57,0x7d, 0x4,0x57,0x7a, + 0x4,0x57,0x7b, 0x4,0x5c,0x70, 0x4,0x67,0x21, 0x4,0x24,0x6d, + 0x3,0x33,0x46, 0x3,0x33,0x45, 0x3,0x38,0x3a, 0x4,0x34,0x41, + 0x4,0x3a,0x39, 0x5,0x41,0x70, 0x3,0x43,0x74, 0x4,0x46,0x36, + 0x4,0x46,0x34, 0x4,0x46,0x35, 0x4,0x46,0x37, 0x3,0x49,0x24, + 0x3,0x4e,0x33, 0x4,0x4c,0x52, 0x4,0x52,0x5a, 0x3,0x52,0x42, + 0x4,0x52,0x5b, 0x4,0x58,0x21, 0x4,0x58,0x24, 0x4,0x58,0x23, + 0x4,0x58,0x22, 0x3,0x58,0x64, 0x4,0x64,0x28, 0x3,0x5f,0x5c, + 0x6,0x56,0x6d, 0x4,0x23,0x2d, 0x6,0x25,0x49, 0x4,0x24,0x6f, + 0x4,0x24,0x6e, 0x3,0x2a,0x51, 0x6,0x3b,0x28, 0x3,0x2a,0x55, + 0x3,0x2a,0x50, 0x4,0x27,0x66, 0xf,0x28,0x52, 0x4,0x27,0x62, + 0x4,0x27,0x67, 0x4,0x27,0x63, 0x4,0x27,0x65, 0x5,0x27,0x58, + 0x3,0x2a,0x5a, 0x3,0x2a,0x53, 0x5,0x2b,0x33, 0x4,0x2b,0x2f, + 0x4,0x2b,0x2a, 0x4,0x2b,0x2c, 0x3,0x2e,0x62, 0x3,0x2e,0x5f, + 0x6,0x33,0x7d, 0x5,0x2b,0x39, 0x3,0x33,0x51, 0x4,0x2f,0x41, + 0x4,0x2f,0x46, 0x4,0x2f,0x47, 0x4,0x2f,0x3f, 0x6,0x3b,0x31, + 0x5,0x2f,0x6d, 0x3,0x38,0x46, 0x4,0x34,0x4c, 0x4,0x34,0x48, + 0x3,0x38,0x44, 0x4,0x34,0x4b, 0x4,0x34,0x52, 0x4,0x34,0x51, + 0x4,0x34,0x4a, 0x4,0x34,0x53, 0x6,0x43,0x58, 0x3,0x38,0x40, + 0x3,0x38,0x3f, 0x3,0x38,0x43, 0x4,0x3a,0x49, 0x4,0x3a,0x3a, + 0x3,0x3e,0x3f, 0x4,0x3a,0x45, 0x5,0x3b,0x4d, 0x4,0x3a,0x4a, + 0x4,0x3a,0x41, 0x4,0x3a,0x40, 0x4,0x3a,0x42, 0x4,0x3a,0x3d, + 0x3,0x3e,0x46, 0x4,0x3a,0x3f, 0x4,0x3a,0x44, 0x4,0x3a,0x4b, + 0x6,0x49,0x7e, 0x6,0x4d,0x54, 0x6,0x56,0x76, 0x4,0x40,0x27, + 0x3,0x43,0x78, 0x4,0x40,0x2a, 0x4,0x40,0x23, 0x4,0x40,0x26, + 0x3,0x43,0x7a, 0x4,0x3f,0x7d, 0x4,0x40,0x28, 0x3,0x44,0x21, + 0x4,0x40,0x2c, 0x3,0x43,0x7d, 0x3,0x43,0x79, 0x5,0x34,0x6a, + 0x4,0x40,0x25, 0x4,0x46,0x45, 0x4,0x46,0x3e, 0x4,0x46,0x3c, + 0x4,0x46,0x3d, 0x4,0x46,0x3f, 0x3,0x52,0x48, 0x4,0x46,0x42, + 0x4,0x46,0x40, 0x4,0x46,0x3b, 0x3,0x49,0x29, 0x3,0x49,0x28, + 0x4,0x46,0x38, 0x4,0x46,0x47, 0x4,0x46,0x41, 0x4,0x4c,0x5d, + 0x4,0x4c,0x58, 0x4,0x4c,0x5e, 0x4,0x4c,0x55, 0x4,0x4c,0x5c, + 0x6,0x60,0x6f, 0x4,0x4c,0x54, 0x4,0x4c,0x5b, 0x4,0x4c,0x5f, + 0x5,0x42,0x28, 0x4,0x52,0x63, 0x4,0x52,0x64, 0x3,0x52,0x46, + 0x3,0x52,0x45, 0x4,0x52,0x5e, 0x4,0x52,0x61, 0x4,0x52,0x62, + 0x4,0x52,0x66, 0xf,0x51,0x55, 0x5,0x5d,0x5b, 0x4,0x58,0x2b, + 0x4,0x58,0x28, 0x4,0x58,0x2c, 0x4,0x5c,0x74, 0x3,0x58,0x66, + 0x4,0x5c,0x76, 0x3,0x58,0x67, 0x3,0x5a,0x76, 0x4,0x60,0x74, + 0x4,0x60,0x73, 0x5,0x6d,0x2c, 0x4,0x64,0x2a, 0x4,0x67,0x22, + 0x4,0x67,0x24, 0x4,0x67,0x23, 0x4,0x67,0x25, 0x4,0x69,0x30, + 0x6,0x43,0x64, 0x7,0x42,0x24, 0x3,0x2b,0x44, 0x3,0x44,0x24, + 0x4,0x2f,0x4a, 0x4,0x34,0x58, 0x4,0x4c,0x63, 0x4,0x52,0x6b, + 0x3,0x33,0x53, 0x3,0x33,0x54, 0x3,0x38,0x4a, 0x4,0x4c,0x64, + 0x6,0x61,0x21, 0x3,0x52,0x4b, 0x3,0x5e,0x54, 0x4,0x27,0x6f, + 0x4,0x2b,0x33, 0x4,0x2b,0x32, 0x3,0x2e,0x67, 0x3,0x33,0x56, + 0x4,0x2f,0x50, 0x3,0x38,0x4b, 0x6,0x43,0x71, 0x6,0x43,0x70, + 0x3,0x3e,0x4a, 0x4,0x3a,0x4e, 0x4,0x3a,0x4f, 0x6,0x4d,0x63, + 0x5,0x42,0x2d, 0x4,0x40,0x2f, 0x4,0x46,0x4f, 0x4,0x46,0x51, + 0x4,0x46,0x50, 0x3,0x49,0x2c, 0x6,0x61,0x24, 0x5,0x49,0x2c, + 0x3,0x4e,0x3e, 0x4,0x4c,0x68, 0x4,0x4c,0x65, 0x4,0x52,0x6c, + 0x4,0x52,0x6d, 0x4,0x58,0x30, 0x4,0x58,0x34, 0x4,0x58,0x33, + 0x3,0x56,0x25, 0x3,0x56,0x26, 0x5,0x5d,0x67, 0x5,0x5c,0x4d, + 0x4,0x58,0x32, 0x4,0x5c,0x7c, 0x4,0x64,0x2d, 0x4,0x2f,0x53, + 0x4,0x34,0x5c, 0x4,0x52,0x6f, 0x4,0x52,0x6e, 0x4,0x58,0x35, + 0x4,0x5c,0x7d, 0x4,0x69,0x33, 0x6,0x25,0x4f, 0x3,0x24,0x37, + 0x3,0x24,0x39, 0x3,0x27,0x27, 0x4,0x24,0x76, 0x4,0x24,0x7d, + 0x3,0x27,0x2c, 0x3,0x2a,0x63, 0x3,0x2a,0x67, 0x3,0x2a,0x64, + 0x3,0x2a,0x6a, 0x4,0x27,0x72, 0x3,0x2a,0x62, 0x4,0x28,0x21, + 0x4,0x27,0x73, 0x3,0x2a,0x65, 0x3,0x2a,0x69, 0x5,0x27,0x63, + 0x3,0x2a,0x61, 0x3,0x2e,0x6d, 0x4,0x2b,0x36, 0x3,0x2e,0x70, + 0x3,0x2e,0x71, 0x3,0x2e,0x6c, 0x3,0x2e,0x73, 0x3,0x2e,0x75, + 0x6,0x34,0x3a, 0x4,0x2f,0x55, 0x3,0x33,0x61, 0x4,0x2f,0x61, + 0x3,0x33,0x64, 0x3,0x33,0x5b, 0x3,0x33,0x5e, 0x6,0x3b,0x56, + 0x3,0x33,0x5d, 0x4,0x2f,0x5e, 0x3,0x33,0x5c, 0x3,0x33,0x65, + 0x5,0x30,0x21, 0x4,0x2f,0x59, 0x4,0x2f,0x64, 0x3,0x33,0x60, + 0x4,0x34,0x5e, 0x4,0x34,0x6c, 0x4,0x34,0x71, 0x3,0x38,0x5a, + 0x4,0x34,0x69, 0x4,0x34,0x65, 0x3,0x38,0x56, 0x4,0x34,0x66, + 0x4,0x34,0x62, 0x4,0x34,0x5d, 0x4,0x34,0x63, 0x6,0x44,0x2c, + 0x3,0x38,0x4c, 0x6,0x44,0x28, 0x5,0x35,0x2a, 0x3,0x38,0x59, + 0x3,0x38,0x5c, 0x5,0x35,0x24, 0x4,0x3a,0x6c, 0x4,0x3a,0x60, + 0x4,0x3a,0x5f, 0x4,0x3a,0x64, 0x4,0x3a,0x59, 0x5,0x3b,0x56, + 0x4,0x3a,0x5b, 0x4,0x3a,0x56, 0x3,0x3e,0x53, 0x4,0x3a,0x5e, + 0x3,0x3e,0x54, 0x3,0x3e,0x51, 0x4,0x3a,0x5c, 0x4,0x3a,0x61, + 0x3,0x3e,0x55, 0x6,0x4e,0x27, 0x3,0x3e,0x4c, 0xf,0x3e,0x6b, + 0x4,0x40,0x30, 0x4,0x40,0x32, 0x4,0x3a,0x65, 0x3,0x44,0x37, + 0x4,0x46,0x69, 0x4,0x40,0x47, 0x4,0x40,0x49, 0x4,0x40,0x3a, + 0x3,0x44,0x2b, 0x3,0x44,0x29, 0x3,0x44,0x34, 0x4,0x40,0x48, + 0x3,0x44,0x3d, 0x4,0x40,0x4c, 0x4,0x46,0x65, 0x3,0x49,0x2f, + 0x4,0x46,0x57, 0x6,0x61,0x44, 0x4,0x46,0x64, 0x3,0x49,0x31, + 0x4,0x46,0x53, 0x5,0x49,0x3c, 0x4,0x46,0x61, 0x3,0x49,0x30, + 0x4,0x46,0x6d, 0x4,0x46,0x60, 0x4,0x46,0x5c, 0x3,0x49,0x34, + 0x5,0x49,0x3b, 0x6,0x61,0x58, 0x3,0x49,0x37, 0x3,0x49,0x40, + 0x3,0x4e,0x43, 0x4,0x4c,0x72, 0x3,0x4e,0x3f, 0x4,0x4c,0x70, + 0x4,0x4d,0x24, 0x4,0x4c,0x6b, 0x3,0x4e,0x41, 0x4,0x4c,0x71, + 0x3,0x4e,0x53, 0x4,0x4c,0x6d, 0x4,0x4c,0x73, 0x3,0x4e,0x47, + 0x3,0x4e,0x45, 0x3,0x4e,0x56, 0x4,0x4c,0x7d, 0x3,0x52,0x51, + 0x4,0x4c,0x6c, 0x3,0x4e,0x4a, 0x4,0x4c,0x6e, 0x3,0x4e,0x48, + 0x3,0x4e,0x55, 0x3,0x4e,0x49, 0x5,0x50,0x46, 0x3,0x4e,0x50, + 0xf,0x51,0x65, 0xf,0x51,0x73, 0xf,0x51,0x76, 0x4,0x4d,0x21, + 0x4,0x4c,0x6f, 0x3,0x4e,0x51, 0x4,0x4c,0x77, 0x4,0x52,0x77, + 0x4,0x52,0x7b, 0x4,0x52,0x79, 0x4,0x53,0x2c, 0x4,0x53,0x21, + 0x4,0x52,0x76, 0x3,0x52,0x53, 0x4,0x53,0x25, 0x3,0x52,0x57, + 0x4,0x52,0x7e, 0x3,0x52,0x4d, 0x4,0x53,0x23, 0x4,0x52,0x7a, + 0x4,0x52,0x7c, 0x4,0x52,0x72, 0x5,0x64,0x2d, 0x3,0x52,0x4c, + 0x4,0x53,0x22, 0x4,0x52,0x73, 0x3,0x52,0x4e, 0x4,0x53,0x27, + 0x4,0x53,0x31, 0x4,0x46,0x67, 0x4,0x58,0x44, 0x4,0x58,0x3c, + 0x4,0x58,0x38, 0x4,0x58,0x42, 0x5,0x5d,0x79, 0x4,0x58,0x36, + 0x4,0x58,0x3b, 0x3,0x56,0x2e, 0x3,0x56,0x27, 0x4,0x58,0x3d, + 0x3,0x56,0x2a, 0x3,0x56,0x2f, 0x3,0x58,0x69, 0x4,0x5c,0x7e, + 0x4,0x5d,0x2b, 0x3,0x58,0x6d, 0x3,0x58,0x70, 0x3,0x58,0x6a, + 0x3,0x58,0x71, 0x4,0x5d,0x23, 0x7,0x42,0x38, 0x4,0x5d,0x21, + 0xf,0x60,0x4e, 0x7,0x3b,0x32, 0x4,0x60,0x77, 0x3,0x5c,0x73, + 0x3,0x5b,0x23, 0x4,0x60,0x78, 0x3,0x5b,0x21, 0x3,0x5b,0x24, + 0x7,0x49,0x53, 0x4,0x64,0x2f, 0x4,0x64,0x34, 0x3,0x5c,0x7d, + 0x4,0x64,0x33, 0x3,0x5c,0x74, 0x7,0x54,0x68, 0x3,0x5c,0x79, + 0x4,0x64,0x32, 0x4,0x64,0x38, 0x3,0x5c,0x7a, 0x4,0x64,0x30, + 0x3,0x5c,0x75, 0x4,0x64,0x36, 0x4,0x67,0x27, 0x3,0x5e,0x59, + 0x4,0x67,0x28, 0xf,0x68,0x39, 0x3,0x5f,0x5d, 0x4,0x69,0x37, + 0x7,0x58,0x72, 0x3,0x60,0x41, 0x3,0x60,0x42, 0x5,0x78,0x25, + 0x4,0x6b,0x7d, 0x4,0x6d,0x5e, 0x4,0x6c,0x7d, 0x3,0x61,0x6a, + 0x4,0x6d,0x79, 0x4,0x6d,0x7b, 0xf,0x6c,0x6c, 0x4,0x6e,0x37, + 0x4,0x6e,0x36, 0x5,0x7c,0x3e, 0x3,0x2a,0x6d, 0x4,0x2b,0x3e, + 0x4,0x2f,0x67, 0x3,0x33,0x67, 0x3,0x33,0x66, 0x3,0x33,0x68, + 0x5,0x35,0x35, 0x3,0x38,0x62, 0x5,0x3b,0x70, 0x3,0x3e,0x60, + 0x3,0x44,0x41, 0x5,0x42,0x54, 0x5,0x42,0x53, 0x3,0x44,0x42, + 0x3,0x44,0x43, 0x4,0x4d,0x26, 0x4,0x53,0x36, 0x4,0x5d,0x32, + 0x5,0x64,0x3b, 0x5,0x64,0x3a, 0x4,0x64,0x3a, 0x3,0x27,0x2e, + 0x3,0x2e,0x7d, 0x3,0x2f,0x21, 0x3,0x2f,0x22, 0x4,0x2f,0x69, + 0x4,0x2f,0x6b, 0x6,0x3b,0x69, 0x3,0x38,0x68, 0x3,0x38,0x67, + 0x4,0x34,0x7c, 0x3,0x38,0x65, 0x4,0x34,0x7b, 0x4,0x34,0x79, + 0x5,0x3c,0x26, 0x6,0x44,0x48, 0x4,0x3a,0x72, 0x3,0x3e,0x67, + 0x4,0x3a,0x74, 0x3,0x3e,0x65, 0x5,0x3b,0x74, 0x4,0x3a,0x70, + 0x4,0x3a,0x6d, 0x3,0x3e,0x64, 0x3,0x3e,0x66, 0x4,0x40,0x56, + 0x4,0x40,0x57, 0x3,0x44,0x4b, 0x3,0x44,0x47, 0x4,0x40,0x5b, + 0x4,0x3a,0x6e, 0x4,0x40,0x5d, 0x3,0x44,0x4a, 0x4,0x46,0x78, + 0x3,0x49,0x46, 0x4,0x46,0x72, 0x4,0x46,0x73, 0x4,0x46,0x71, + 0x4,0x46,0x75, 0x3,0x49,0x47, 0x4,0x46,0x70, 0x4,0x46,0x76, + 0x6,0x61,0x69, 0x3,0x49,0x48, 0x4,0x46,0x7b, 0x3,0x4e,0x5a, + 0x3,0x4e,0x5c, 0x7,0x28,0x42, 0x3,0x4e,0x57, 0x3,0x4e,0x58, + 0x4,0x4d,0x30, 0x3,0x4e,0x5b, 0x4,0x46,0x79, 0x4,0x4d,0x36, + 0x4,0x4d,0x2f, 0x3,0x49,0x4d, 0x4,0x53,0x3e, 0x3,0x52,0x5c, + 0x7,0x32,0x73, 0x4,0x53,0x3d, 0x4,0x58,0x4d, 0x3,0x52,0x60, + 0x7,0x32,0x75, 0x3,0x52,0x61, 0x5,0x5e,0x32, 0x4,0x58,0x57, + 0x4,0x58,0x52, 0x3,0x56,0x37, 0x4,0x58,0x58, 0x4,0x58,0x4f, + 0x4,0x58,0x56, 0x3,0x56,0x38, 0x4,0x58,0x4e, 0x3,0x56,0x32, + 0x4,0x58,0x54, 0x4,0x58,0x5f, 0x3,0x56,0x35, 0x3,0x56,0x3c, + 0x3,0x56,0x31, 0x4,0x5d,0x3b, 0x5,0x5e,0x35, 0x4,0x5d,0x39, + 0x3,0x58,0x72, 0x4,0x61,0x24, 0x5,0x69,0x41, 0x3,0x5b,0x2a, + 0x4,0x61,0x21, 0x4,0x61,0x25, 0xf,0x63,0x6e, 0x5,0x6d,0x4b, + 0x4,0x64,0x3b, 0x4,0x64,0x3c, 0x4,0x64,0x40, 0x4,0x64,0x3e, + 0x4,0x64,0x41, 0x3,0x5d,0x26, 0x3,0x5e,0x5e, 0x4,0x67,0x30, + 0x4,0x64,0x3d, 0x4,0x69,0x3e, 0x3,0x5f,0x5e, 0x3,0x5f,0x60, + 0x3,0x60,0x44, 0x7,0x59,0x25, 0x7,0x5c,0x5e, 0x4,0x6a,0x78, + 0x7,0x5c,0x63, 0x3,0x61,0x48, 0x4,0x6e,0x39, 0x3,0x2f,0x25, + 0x6,0x3b,0x73, 0x3,0x38,0x69, 0x3,0x44,0x4c, 0x4,0x47,0x23, + 0x4,0x4d,0x37, 0x4,0x2f,0x6f, 0x4,0x3a,0x78, 0x3,0x4e,0x5e, + 0x4,0x53,0x4a, 0x3,0x5b,0x2e, 0x3,0x2a,0x6e, 0x3,0x2f,0x28, + 0x4,0x2b,0x46, 0x5,0x30,0x3d, 0x4,0x2f,0x72, 0x5,0x30,0x39, + 0x4,0x35,0x2a, 0x4,0x3a,0x7a, 0x4,0x35,0x2d, 0x4,0x35,0x2e, + 0x4,0x35,0x2c, 0xf,0x32,0x51, 0x4,0x3a,0x79, 0x3,0x3e,0x71, + 0x4,0x35,0x30, 0x3,0x3e,0x6e, 0x3,0x3e,0x6c, 0x3,0x3e,0x6b, + 0x3,0x2f,0x4a, 0x4,0x40,0x62, 0x4,0x47,0x25, 0x6,0x58,0x2b, + 0x3,0x49,0x53, 0x4,0x47,0x2d, 0x5,0x49,0x6c, 0x5,0x49,0x6d, + 0x4,0x40,0x66, 0x4,0x47,0x31, 0x4,0x47,0x27, 0x3,0x49,0x55, + 0x4,0x40,0x60, 0x4,0x47,0x2a, 0x4,0x47,0x2e, 0x4,0x47,0x26, + 0x4,0x47,0x2b, 0x3,0x49,0x5a, 0x3,0x49,0x50, 0x3,0x49,0x5b, + 0x4,0x4d,0x3c, 0x4,0x4d,0x3f, 0x4,0x4d,0x3a, 0x4,0x4d,0x39, + 0x4,0x4d,0x42, 0x4,0x4d,0x40, 0x4,0x4d,0x47, 0x4,0x53,0x52, + 0x4,0x53,0x55, 0x4,0x53,0x56, 0x3,0x4e,0x63, 0x4,0x53,0x4f, + 0x4,0x58,0x63, 0x4,0x58,0x67, 0x3,0x56,0x45, 0x3,0x56,0x43, + 0x4,0x58,0x64, 0x3,0x56,0x3e, 0x7,0x3b,0x59, 0x3,0x56,0x44, + 0x4,0x58,0x65, 0x3,0x56,0x41, 0x5,0x64,0x56, 0x4,0x5d,0x4a, + 0x4,0x5d,0x48, 0x4,0x5d,0x49, 0x4,0x5d,0x44, 0x4,0x5d,0x46, + 0x4,0x61,0x2a, 0x7,0x43,0x22, 0x4,0x64,0x43, 0x7,0x50,0x25, + 0x3,0x5d,0x27, 0x4,0x64,0x44, 0x3,0x5e,0x5f, 0x4,0x6a,0x7b, + 0x7,0x59,0x32, 0x3,0x60,0x7a, 0x4,0x6c,0x26, 0x3,0x60,0x79, + 0x4,0x6d,0x7d, 0x5,0x2b,0x47, 0x4,0x2f,0x73, 0x4,0x35,0x31, + 0x4,0x3b,0x21, 0x3,0x33,0x79, 0x3,0x33,0x78, 0x4,0x35,0x33, + 0x4,0x35,0x35, 0x4,0x3b,0x23, 0x5,0x3c,0x35, 0x4,0x3b,0x22, + 0x3,0x3e,0x73, 0x3,0x44,0x50, 0x3,0x44,0x51, 0x4,0x47,0x36, + 0x4,0x47,0x38, 0x4,0x4d,0x4a, 0x4,0x4d,0x48, 0x4,0x53,0x5a, + 0x4,0x53,0x5b, 0x5,0x58,0x32, 0x4,0x53,0x5c, 0x5,0x5e,0x43, + 0x4,0x58,0x68, 0x4,0x58,0x69, 0x4,0x5d,0x4e, 0x4,0x5d,0x50, + 0x4,0x61,0x2d, 0x4,0x61,0x2e, 0x3,0x5b,0x30, 0x4,0x61,0x2c, + 0x4,0x61,0x30, 0x3,0x5e,0x60, 0x3,0x62,0x3c, 0x4,0x35,0x3a, + 0x3,0x44,0x53, 0x4,0x40,0x67, 0x3,0x44,0x52, 0x4,0x47,0x3a, + 0x4,0x4d,0x51, 0x4,0x4d,0x4c, 0x4,0x4d,0x4e, 0x4,0x4d,0x53, + 0x4,0x4d,0x4f, 0x4,0x53,0x64, 0x4,0x53,0x61, 0x4,0x53,0x62, + 0x4,0x58,0x6b, 0x4,0x58,0x6a, 0x5,0x64,0x63, 0x4,0x61,0x31, + 0x4,0x61,0x34, 0x4,0x64,0x46, 0x4,0x64,0x47, 0x4,0x6d,0x22, + 0x3,0x2f,0x2b, 0x5,0x2b,0x49, 0x3,0x2f,0x2d, 0x4,0x2f,0x7e, + 0x3,0x33,0x7d, 0x4,0x35,0x41, 0x3,0x38,0x7c, 0x3,0x38,0x78, + 0x5,0x35,0x57, 0x4,0x35,0x44, 0x5,0x35,0x5e, 0x3,0x39,0x24, + 0x3,0x39,0x28, 0x3,0x39,0x21, 0x4,0x35,0x3f, 0x3,0x38,0x7d, + 0x3,0x39,0x27, 0x4,0x35,0x43, 0x5,0x35,0x5d, 0x6,0x44,0x6d, + 0x3,0x39,0x26, 0x5,0x35,0x56, 0x4,0x3b,0x33, 0x3,0x3e,0x79, + 0x3,0x3e,0x7a, 0x4,0x3b,0x36, 0x4,0x3b,0x35, 0x3,0x3e,0x76, + 0x3,0x3e,0x7b, 0x3,0x3e,0x77, 0x4,0x3b,0x34, 0x4,0x3b,0x2a, + 0x4,0x3b,0x29, 0x4,0x3b,0x2b, 0x3,0x3f,0x26, 0x6,0x4e,0x6b, + 0x3,0x3f,0x25, 0x3,0x44,0x57, 0x6,0x58,0x41, 0x3,0x44,0x5e, + 0x4,0x40,0x6e, 0x4,0x40,0x6d, 0x4,0x40,0x6c, 0x3,0x44,0x5a, + 0x3,0x44,0x5f, 0x3,0x44,0x62, 0x4,0x47,0x3d, 0x4,0x47,0x40, + 0x4,0x47,0x4a, 0x4,0x47,0x3c, 0x3,0x49,0x6a, 0x4,0x47,0x46, + 0x4,0x47,0x42, 0x3,0x49,0x61, 0x4,0x47,0x43, 0x3,0x49,0x69, + 0x3,0x49,0x67, 0x3,0x49,0x5d, 0x4,0x4d,0x59, 0x4,0x4d,0x56, + 0x4,0x4d,0x5c, 0x4,0x4d,0x5e, 0x3,0x4e,0x68, 0x4,0x4d,0x61, + 0x4,0x4d,0x58, 0x4,0x4d,0x5b, 0x3,0x4e,0x6d, 0x4,0x4d,0x5f, + 0x4,0x4d,0x5a, 0x3,0x4e,0x6b, 0x4,0x4d,0x60, 0x7,0x28,0x79, + 0x4,0x4d,0x55, 0x3,0x4e,0x71, 0x4,0x53,0x6a, 0x3,0x52,0x6c, + 0x3,0x52,0x6d, 0x7,0x33,0x4d, 0x4,0x53,0x6b, 0x3,0x56,0x47, + 0x4,0x58,0x70, 0x3,0x56,0x4b, 0x3,0x56,0x4c, 0x5,0x5e,0x55, + 0x4,0x5d,0x5a, 0x7,0x4a,0x25, 0x4,0x5d,0x57, 0x4,0x5d,0x5b, + 0x3,0x59,0x22, 0x3,0x59,0x25, 0x4,0x5d,0x54, 0x3,0x59,0x27, + 0x4,0x61,0x40, 0x5,0x69,0x52, 0x3,0x5b,0x33, 0x4,0x61,0x3b, + 0x4,0x61,0x3d, 0x4,0x61,0x45, 0x5,0x69,0x51, 0x4,0x64,0x4e, + 0x3,0x5d,0x2d, 0x7,0x50,0x31, 0x4,0x64,0x4c, 0x3,0x5d,0x2f, + 0x4,0x64,0x48, 0x3,0x5d,0x31, 0x4,0x67,0x3d, 0x4,0x67,0x3f, + 0x7,0x55,0x32, 0x4,0x67,0x3e, 0x4,0x67,0x40, 0x4,0x67,0x39, + 0x7,0x59,0x38, 0x3,0x5f,0x63, 0x4,0x69,0x48, 0x5,0x76,0x4c, + 0x4,0x2b,0x49, 0x4,0x30,0x23, 0x6,0x4e,0x7a, 0x3,0x3f,0x27, + 0x4,0x47,0x4c, 0x3,0x4e,0x77, 0x4,0x58,0x75, 0x4,0x5d,0x61, + 0x4,0x69,0x4c, 0x4,0x35,0x4a, 0x3,0x3f,0x28, 0x4,0x40,0x74, + 0x4,0x47,0x4e, 0x4,0x47,0x4f, 0x3,0x49,0x6c, 0x4,0x4d,0x64, + 0x3,0x52,0x70, 0x4,0x53,0x73, 0x3,0x52,0x6f, 0x4,0x53,0x72, + 0x3,0x52,0x71, 0x4,0x58,0x76, 0x4,0x58,0x77, 0x3,0x56,0x4e, + 0x4,0x67,0x44, 0x4,0x6d,0x24, 0x4,0x30,0x25, 0x4,0x35,0x4b, + 0x6,0x45,0x22, 0x4,0x35,0x4c, 0xf,0x44,0x74, 0x4,0x4d,0x67, + 0x4,0x4d,0x65, 0x4,0x4d,0x68, 0x4,0x53,0x75, 0x4,0x53,0x77, + 0x4,0x5d,0x64, 0x4,0x61,0x48, 0x4,0x61,0x46, 0x4,0x67,0x45, + 0x3,0x5f,0x65, 0x3,0x61,0x4c, 0x4,0x6d,0x25, 0x4,0x35,0x50, + 0x6,0x45,0x24, 0x3,0x39,0x2f, 0x4,0x3b,0x3e, 0x3,0x49,0x6e, + 0x3,0x4e,0x79, 0x3,0x4e,0x78, 0x3,0x52,0x72, 0x3,0x56,0x50, + 0x3,0x59,0x2c, 0x3,0x59,0x2d, 0x4,0x61,0x4a, 0x7,0x4a,0x41, + 0x3,0x5b,0x37, 0x4,0x5d,0x68, 0x4,0x35,0x51, 0x4,0x35,0x54, + 0x5,0x3c,0x4c, 0x4,0x3b,0x3f, 0x4,0x3b,0x41, 0x3,0x3f,0x2e, + 0x4,0x3b,0x42, 0x6,0x4f,0x29, 0x4,0x3b,0x43, 0x4,0x41,0x21, + 0x3,0x44,0x66, 0x3,0x44,0x68, 0x5,0x4a,0x29, 0x6,0x62,0x6a, + 0x3,0x49,0x6f, 0x3,0x4e,0x7b, 0x3,0x4e,0x7c, 0x4,0x4d,0x6e, + 0x4,0x4d,0x6c, 0x7,0x29,0x36, 0x4,0x4d,0x6d, 0x5,0x51,0x39, + 0x3,0x4f,0x21, 0x3,0x52,0x74, 0x4,0x53,0x7d, 0x4,0x53,0x79, + 0x4,0x53,0x7b, 0x4,0x53,0x7a, 0x3,0x52,0x76, 0x7,0x3c,0x33, + 0x4,0x58,0x7a, 0xf,0x60,0x7a, 0x4,0x53,0x7e, 0x3,0x5d,0x35, + 0x3,0x5e,0x64, 0x4,0x6b,0x21, 0x5,0x30,0x4b, 0x5,0x43,0x34, + 0x4,0x47,0x59, 0x4,0x47,0x58, 0x4,0x67,0x48, 0x5,0x30,0x4c, + 0x4,0x30,0x27, 0x4,0x30,0x28, 0x4,0x35,0x55, 0x4,0x35,0x56, + 0x3,0x39,0x34, 0x3,0x39,0x36, 0x3,0x3f,0x31, 0x4,0x3b,0x45, + 0x3,0x3f,0x36, 0x3,0x3f,0x32, 0x5,0x3c,0x52, 0x3,0x3f,0x35, + 0x4,0x3b,0x48, 0x4,0x3b,0x47, 0x4,0x41,0x26, 0x4,0x41,0x27, + 0x5,0x43,0x3c, 0x3,0x44,0x6a, 0x4,0x41,0x28, 0x5,0x43,0x38, + 0x4,0x47,0x5a, 0x6,0x62,0x75, 0x4,0x47,0x5b, 0x3,0x49,0x76, + 0x5,0x4a,0x34, 0x3,0x49,0x77, 0x5,0x4a,0x32, 0x3,0x4f,0x27, + 0x4,0x4d,0x73, 0x4,0x4d,0x71, 0x3,0x4f,0x24, 0x4,0x4d,0x74, + 0x7,0x29,0x3d, 0x4,0x54,0x26, 0x5,0x58,0x5c, 0x5,0x58,0x55, + 0x3,0x52,0x78, 0x4,0x58,0x7d, 0x4,0x59,0x25, 0x4,0x58,0x7c, + 0x5,0x5e,0x6d, 0x4,0x5d,0x6d, 0x3,0x59,0x2f, 0x4,0x5d,0x6c, + 0x4,0x5d,0x6a, 0x4,0x5d,0x6e, 0x3,0x59,0x30, 0x4,0x61,0x4d, + 0x3,0x5d,0x36, 0x4,0x64,0x55, 0x4,0x64,0x53, 0x4,0x64,0x56, + 0x4,0x67,0x4a, 0x4,0x69,0x4e, 0x3,0x5f,0x66, 0x4,0x69,0x4f, + 0x4,0x6b,0x23, 0x4,0x6c,0x28, 0x4,0x6d,0x27, 0x4,0x2b,0x4c, + 0x3,0x2f,0x2f, 0x4,0x30,0x2a, 0x3,0x33,0x7e, 0x4,0x35,0x5e, + 0x4,0x35,0x59, 0x5,0x35,0x72, 0x3,0x39,0x3b, 0x4,0x35,0x5b, + 0x4,0x35,0x5c, 0x4,0x35,0x5d, 0x3,0x39,0x3c, 0x5,0x3c,0x63, + 0x4,0x3b,0x4c, 0x4,0x3b,0x50, 0x3,0x3f,0x3d, 0x4,0x3b,0x4d, + 0x4,0x3b,0x49, 0x6,0x4f,0x36, 0x6,0x4f,0x3c, 0x5,0x3c,0x5c, + 0x4,0x3b,0x4a, 0x4,0x3b,0x4b, 0x4,0x3b,0x4f, 0x3,0x3f,0x3c, + 0x5,0x3c,0x5f, 0x4,0x3b,0x51, 0x4,0x41,0x29, 0x5,0x43,0x4b, + 0x3,0x44,0x6c, 0x3,0x44,0x6e, 0xf,0x45,0x58, 0x5,0x4a,0x3e, + 0x4,0x47,0x5e, 0x4,0x47,0x61, 0x4,0x47,0x5f, 0x4,0x47,0x62, + 0x4,0x47,0x65, 0x3,0x49,0x78, 0x4,0x47,0x64, 0x3,0x4f,0x28, + 0x3,0x44,0x6f, 0x4,0x4d,0x77, 0x4,0x4e,0x22, 0x3,0x4f,0x2a, + 0x7,0x29,0x4e, 0x3,0x4f,0x2e, 0x3,0x4f,0x29, 0x4,0x4d,0x7e, + 0x4,0x4e,0x21, 0x4,0x4d,0x7d, 0x4,0x4d,0x79, 0x4,0x4d,0x78, + 0x4,0x4d,0x76, 0x3,0x4f,0x2d, 0x4,0x4e,0x23, 0x4,0x54,0x2e, + 0x3,0x52,0x7d, 0x3,0x52,0x7a, 0x4,0x54,0x2f, 0x4,0x54,0x2d, + 0x5,0x58,0x62, 0x4,0x54,0x30, 0x3,0x52,0x79, 0x5,0x5e,0x7b, + 0x4,0x59,0x2b, 0x4,0x59,0x2c, 0x4,0x59,0x26, 0xf,0x5c,0x78, + 0x4,0x59,0x2a, 0x4,0x59,0x28, 0x3,0x56,0x53, 0x3,0x59,0x33, + 0x4,0x5d,0x74, 0x4,0x5d,0x78, 0x4,0x5d,0x72, 0x4,0x5d,0x75, + 0x7,0x4a,0x57, 0x4,0x61,0x50, 0x3,0x59,0x34, 0x4,0x61,0x51, + 0x4,0x5d,0x77, 0x4,0x64,0x5b, 0x4,0x64,0x5a, 0x4,0x67,0x50, + 0x4,0x67,0x4c, 0x5,0x74,0x4b, 0x4,0x6b,0x24, 0x7,0x5c,0x77, + 0x4,0x6c,0x29, 0x3,0x61,0x4f, 0x3,0x62,0x2e, 0x3,0x3f,0x42, + 0x5,0x3c,0x67, 0x4,0x3b,0x52, 0x4,0x3b,0x53, 0x3,0x3f,0x41, + 0x3,0x44,0x71, 0x3,0x44,0x70, 0x3,0x44,0x72, 0x4,0x4e,0x26, + 0x4,0x54,0x32, 0x4,0x59,0x30, 0x3,0x56,0x56, 0x3,0x5b,0x3e, + 0x4,0x64,0x5f, 0x3,0x60,0x4c, 0x4,0x2b,0x4d, 0x4,0x2b,0x4e, + 0xf,0x2d,0x53, 0x3,0x34,0x22, 0x3,0x39,0x43, 0x3,0x39,0x44, + 0x3,0x39,0x48, 0x4,0x35,0x61, 0x4,0x35,0x62, 0x3,0x39,0x45, + 0x3,0x39,0x46, 0x3,0x39,0x42, 0x6,0x45,0x45, 0x3,0x3f,0x48, + 0x3,0x3f,0x43, 0x4,0x3b,0x54, 0x3,0x3f,0x4a, 0x3,0x44,0x75, + 0x4,0x41,0x2a, 0x3,0x44,0x74, 0x6,0x59,0x24, 0x4,0x41,0x2c, + 0x4,0x47,0x66, 0x4,0x47,0x69, 0x4,0x47,0x67, 0x3,0x49,0x7e, + 0x4,0x4e,0x28, 0x4,0x4e,0x27, 0x4,0x4e,0x2a, 0x4,0x4e,0x29, + 0x3,0x53,0x23, 0x5,0x58,0x72, 0x4,0x54,0x33, 0x4,0x54,0x34, + 0x5,0x51,0x61, 0x3,0x56,0x58, 0x4,0x59,0x32, 0x4,0x59,0x35, + 0x4,0x59,0x37, 0x3,0x56,0x57, 0x4,0x59,0x31, 0x4,0x5d,0x7c, + 0x4,0x5d,0x7b, 0x4,0x5d,0x7a, 0x5,0x65,0x35, 0x4,0x5d,0x7d, + 0x4,0x5d,0x7e, 0x4,0x61,0x59, 0x4,0x61,0x58, 0x4,0x61,0x57, + 0x4,0x64,0x60, 0x4,0x64,0x61, 0x4,0x67,0x52, 0xf,0x68,0x53, + 0x3,0x5f,0x68, 0x3,0x5f,0x67, 0x3,0x60,0x7d, 0x4,0x6d,0x61, + 0x4,0x6e,0x21, 0x3,0x62,0x3d, 0x4,0x4e,0x2e, 0x3,0x5d,0x39, + 0x4,0x47,0x6b, 0xf,0x4c,0x67, 0x3,0x4f,0x38, 0x4,0x64,0x63, + 0x7,0x50,0x56, 0x3,0x27,0x32, 0x4,0x25,0x22, 0xf,0x28,0x72, + 0x3,0x2a,0x6f, 0x5,0x27,0x69, 0x4,0x2b,0x53, 0x4,0x2b,0x50, + 0x3,0x34,0x23, 0x4,0x30,0x2d, 0x4,0x30,0x30, 0x3,0x34,0x24, + 0x4,0x30,0x2e, 0x3,0x39,0x49, 0x4,0x35,0x69, 0x3,0x39,0x4d, + 0x3,0x3f,0x53, 0x4,0x3b,0x57, 0x3,0x3f,0x4e, 0x6,0x4f,0x48, + 0x3,0x3f,0x52, 0x4,0x41,0x2f, 0x3,0x4a,0x25, 0x4,0x47,0x6c, + 0x3,0x4a,0x23, 0x3,0x4f,0x3a, 0x4,0x4e,0x31, 0x4,0x4e,0x35, + 0x3,0x4f,0x3d, 0x3,0x53,0x2a, 0x3,0x53,0x28, 0x3,0x53,0x29, + 0x4,0x59,0x38, 0x4,0x59,0x39, 0x7,0x43,0x77, 0x3,0x59,0x39, + 0x4,0x61,0x5e, 0x4,0x6c,0x2c, 0x3,0x22,0x5f, 0x4,0x23,0x32, + 0x3,0x27,0x36, 0x3,0x27,0x37, 0x3,0x27,0x38, 0x3,0x2a,0x76, + 0x4,0x28,0x29, 0x3,0x2f,0x36, 0x4,0x2b,0x56, 0x3,0x45,0x22, + 0x3,0x2f,0x3d, 0x4,0x2b,0x54, 0x4,0x2b,0x58, 0x3,0x2f,0x39, + 0x3,0x2f,0x3a, 0x6,0x34,0x6d, 0x4,0x30,0x38, 0x4,0x30,0x34, + 0x3,0x34,0x28, 0x4,0x30,0x33, 0x4,0x47,0x71, 0x4,0x35,0x6c, + 0x4,0x35,0x6e, 0x4,0x35,0x73, 0x4,0x35,0x6b, 0x3,0x39,0x50, + 0x4,0x35,0x70, 0x4,0x3b,0x5e, 0x3,0x3f,0x58, 0x4,0x41,0x34, + 0x4,0x41,0x36, 0x3,0x45,0x21, 0x4,0x59,0x3c, 0x4,0x41,0x38, + 0x4,0x47,0x6d, 0x4,0x47,0x6e, 0x3,0x4a,0x29, 0x3,0x4a,0x28, + 0x5,0x4a,0x60, 0x4,0x47,0x70, 0x3,0x4f,0x3e, 0x4,0x4e,0x3d, + 0x4,0x4e,0x3c, 0x5,0x58,0x7e, 0x5,0x5f,0x3c, 0x3,0x60,0x4d, + 0x4,0x6b,0x26, 0x3,0x2f,0x3f, 0x3,0x34,0x2b, 0x3,0x34,0x2c, + 0x4,0x35,0x78, 0x4,0x35,0x74, 0x3,0x39,0x53, 0x5,0x36,0x36, + 0x4,0x35,0x75, 0x4,0x3b,0x60, 0x3,0x3f,0x5a, 0x3,0x3f,0x5b, + 0x3,0x3f,0x5c, 0x4,0x3b,0x64, 0x6,0x59,0x4c, 0x3,0x45,0x26, + 0x4,0x41,0x3d, 0x4,0x41,0x3c, 0x4,0x41,0x3f, 0x4,0x41,0x3e, + 0x4,0x47,0x73, 0x4,0x47,0x74, 0x4,0x4e,0x3f, 0x4,0x4e,0x41, + 0x4,0x4e,0x3e, 0x4,0x4e,0x40, 0x4,0x54,0x3d, 0x4,0x54,0x3c, + 0x4,0x54,0x3a, 0x3,0x53,0x2e, 0x4,0x54,0x40, 0x4,0x54,0x3b, + 0x7,0x34,0x54, 0x3,0x53,0x30, 0x4,0x59,0x3d, 0x4,0x59,0x42, + 0x7,0x3c,0x70, 0x4,0x59,0x41, 0x5,0x65,0x45, 0x4,0x61,0x61, + 0x4,0x61,0x64, 0x4,0x61,0x63, 0x4,0x61,0x62, 0x4,0x61,0x65, + 0x4,0x67,0x5a, 0x4,0x67,0x5b, 0x4,0x69,0x54, 0x4,0x69,0x53, + 0x4,0x6c,0x2e, 0x4,0x6c,0x2d, 0x4,0x6e,0x3d, 0x4,0x35,0x7a, + 0x6,0x3c,0x63, 0x3,0x39,0x5a, 0x3,0x3f,0x5f, 0x3,0x3f,0x64, + 0x3,0x3f,0x61, 0x3,0x3f,0x67, 0x3,0x45,0x2c, 0x5,0x43,0x6d, + 0x3,0x4a,0x2e, 0x4,0x47,0x79, 0x3,0x4a,0x36, 0x4,0x47,0x76, + 0x4,0x47,0x7b, 0x4,0x47,0x78, 0x3,0x4f,0x4f, 0x4,0x4e,0x43, + 0x3,0x4f,0x47, 0x3,0x4f,0x46, 0x7,0x2a,0x38, 0x3,0x4f,0x4a, + 0x7,0x2a,0x3e, 0x3,0x53,0x33, 0x3,0x53,0x34, 0x4,0x54,0x48, + 0x4,0x54,0x46, 0x7,0x3c,0x7b, 0x3,0x56,0x69, 0x7,0x3c,0x77, + 0x4,0x59,0x45, 0x4,0x59,0x44, 0xf,0x5d,0x4c, 0x3,0x59,0x3f, + 0x3,0x59,0x41, 0x4,0x5e,0x2f, 0x4,0x5e,0x2c, 0x7,0x44,0x39, + 0x4,0x5e,0x27, 0x5,0x65,0x4f, 0x4,0x5e,0x2b, 0x3,0x59,0x48, + 0x3,0x59,0x47, 0x3,0x5b,0x46, 0x4,0x61,0x66, 0x3,0x5b,0x4b, + 0x3,0x5b,0x40, 0x3,0x5b,0x52, 0x4,0x61,0x69, 0x5,0x6a,0x33, + 0x4,0x61,0x68, 0x3,0x5b,0x51, 0x3,0x5b,0x4c, 0x3,0x5b,0x49, + 0xf,0x64,0x34, 0x3,0x5d,0x3b, 0x4,0x61,0x6c, 0x3,0x5d,0x40, + 0x4,0x64,0x66, 0x4,0x64,0x6c, 0x5,0x6e,0x35, 0x3,0x5d,0x48, + 0x4,0x64,0x6d, 0x4,0x67,0x5f, 0x3,0x5e,0x6b, 0x4,0x64,0x69, + 0x4,0x67,0x61, 0x3,0x5e,0x6c, 0x4,0x67,0x63, 0x7,0x55,0x68, + 0x3,0x5e,0x69, 0x3,0x5e,0x6e, 0x3,0x5e,0x6f, 0x3,0x5f,0x6f, + 0x3,0x60,0x51, 0x5,0x71,0x55, 0x7,0x59,0x67, 0x3,0x5f,0x6d, + 0x7,0x59,0x68, 0x3,0x5f,0x70, 0x5,0x74,0x55, 0x4,0x6b,0x2a, + 0x5,0x76,0x5f, 0x4,0x6b,0x27, 0x3,0x60,0x4e, 0x3,0x60,0x50, + 0x3,0x61,0x23, 0x3,0x61,0x21, 0x4,0x6c,0x30, 0x3,0x61,0x24, + 0x3,0x61,0x6e, 0x6,0x3c,0x65, 0x4,0x3b,0x67, 0xf,0x3f,0x76, + 0x4,0x41,0x49, 0x4,0x5e,0x32, 0x3,0x39,0x5b, 0x4,0x35,0x7c, + 0x3,0x3f,0x6a, 0x4,0x3b,0x6b, 0x3,0x3f,0x6e, 0x3,0x3f,0x6b, + 0x3,0x45,0x3b, 0x4,0x41,0x50, 0x4,0x41,0x4e, 0x4,0x48,0x23, + 0x3,0x4a,0x3b, 0x3,0x4a,0x3f, 0x3,0x4a,0x3a, 0x5,0x4a,0x6e, + 0x3,0x4a,0x3c, 0x7,0x2a,0x46, 0x4,0x4e,0x48, 0x3,0x4f,0x54, + 0x3,0x4f,0x57, 0x4,0x54,0x4f, 0x4,0x54,0x4b, 0x3,0x53,0x3f, + 0x4,0x54,0x4c, 0x3,0x53,0x41, 0x3,0x53,0x43, 0x3,0x53,0x46, + 0x3,0x53,0x45, 0x7,0x34,0x73, 0x4,0x59,0x4e, 0x4,0x59,0x4f, + 0x4,0x59,0x54, 0x3,0x56,0x6e, 0x3,0x56,0x6c, 0x4,0x59,0x4d, + 0x4,0x59,0x52, 0x4,0x67,0x66, 0x4,0x64,0x71, 0x5,0x71,0x5b, + 0x4,0x69,0x55, 0x5,0x21,0x7d, 0x3,0x22,0x60, 0x3,0x24,0x3e, + 0x5,0x24,0x7b, 0x6,0x29,0x35, 0x4,0x28,0x31, 0x4,0x28,0x32, + 0x3,0x2a,0x7a, 0x5,0x2b,0x64, 0x4,0x2b,0x5a, 0x3,0x2f,0x41, + 0x4,0x2b,0x59, 0x4,0x30,0x40, 0x4,0x30,0x3d, 0x3,0x34,0x35, + 0x4,0x30,0x3e, 0x3,0x34,0x37, 0x4,0x30,0x3c, 0x3,0x39,0x63, + 0x3,0x39,0x5d, 0x4,0x35,0x7d, 0x3,0x39,0x60, 0x3,0x39,0x62, + 0x3,0x39,0x64, 0x3,0x39,0x5f, 0x3,0x3f,0x6f, 0x4,0x3b,0x6d, + 0x3,0x3f,0x74, 0x3,0x45,0x3f, 0x3,0x45,0x3e, 0x4,0x41,0x55, + 0x4,0x41,0x54, 0x3,0x45,0x3d, 0x3,0x45,0x41, 0x3,0x4a,0x41, + 0x3,0x4a,0x40, 0x3,0x4a,0x43, 0x3,0x4a,0x42, 0x3,0x4f,0x59, + 0x3,0x4f,0x58, 0x7,0x2a,0x54, 0x3,0x53,0x47, 0x4,0x54,0x53, + 0x4,0x54,0x51, 0x4,0x59,0x55, 0x3,0x5b,0x54, 0x4,0x64,0x73, + 0x4,0x67,0x67, 0x3,0x34,0x38, 0x4,0x36,0x24, 0x3,0x3f,0x7a, + 0x3,0x3f,0x76, 0x3,0x3f,0x79, 0x3,0x3f,0x77, 0x4,0x41,0x56, + 0x3,0x45,0x44, 0x3,0x45,0x43, 0x3,0x45,0x45, 0x3,0x4a,0x48, + 0x3,0x4f,0x5d, 0x3,0x4f,0x5c, 0x3,0x53,0x4b, 0x3,0x53,0x4a, + 0x3,0x52,0x38, 0x4,0x59,0x58, 0x3,0x56,0x72, 0x3,0x59,0x4c, + 0x3,0x5b,0x55, 0x3,0x5d,0x4a, 0x3,0x5b,0x56, 0x3,0x5d,0x4b, + 0x4,0x69,0x56, 0x3,0x61,0x51, 0x3,0x62,0x40, 0x3,0x39,0x66, + 0x3,0x3f,0x7d, 0x6,0x50,0x31, 0x3,0x45,0x48, 0x4,0x48,0x2d, + 0x4,0x48,0x31, 0x4,0x48,0x2e, 0x3,0x4a,0x4a, 0x4,0x48,0x34, + 0x3,0x4a,0x4b, 0x4,0x48,0x33, 0x6,0x63,0x7b, 0x3,0x4f,0x5e, + 0x3,0x4f,0x61, 0x3,0x4f,0x5f, 0x4,0x54,0x59, 0x3,0x53,0x4f, + 0x3,0x53,0x4e, 0x4,0x59,0x60, 0x3,0x56,0x73, 0x3,0x56,0x77, + 0x4,0x54,0x58, 0x3,0x56,0x76, 0x4,0x59,0x5d, 0x4,0x59,0x5f, + 0x4,0x5e,0x35, 0x3,0x59,0x4d, 0x3,0x59,0x4e, 0x4,0x5e,0x36, + 0x7,0x44,0x58, 0x7,0x44,0x60, 0x4,0x61,0x74, 0x4,0x61,0x73, + 0x3,0x5b,0x57, 0x3,0x5b,0x58, 0x3,0x5b,0x59, 0x4,0x64,0x75, + 0x3,0x5d,0x4d, 0x4,0x69,0x58, 0x4,0x69,0x5a, 0x4,0x69,0x5b, + 0x3,0x60,0x58, 0x3,0x61,0x53, 0x3,0x61,0x27, 0x3,0x61,0x52, + 0x3,0x62,0x24, 0x3,0x62,0x44, 0x3,0x62,0x46, 0x4,0x69,0x5c, + 0x4,0x36,0x28, 0x4,0x36,0x2a, 0x4,0x3b,0x74, 0x4,0x4e,0x4c, + 0x4,0x64,0x7b, 0x4,0x41,0x5a, 0x3,0x45,0x4a, 0x3,0x4a,0x4d, + 0x4,0x48,0x38, 0x4,0x48,0x37, 0x4,0x54,0x5d, 0x4,0x54,0x5c, + 0x4,0x59,0x62, 0x4,0x64,0x7c, 0x4,0x67,0x6e, 0x5,0x71,0x63, + 0x4,0x6c,0x33, 0x4,0x3b,0x79, 0x3,0x40,0x23, 0x4,0x3b,0x76, + 0x3,0x45,0x4d, 0x4,0x41,0x5d, 0x4,0x41,0x5f, 0x3,0x45,0x4c, + 0xf,0x46,0x32, 0x6,0x5a,0x28, 0x4,0x48,0x3a, 0x4,0x48,0x40, + 0x4,0x48,0x3b, 0x3,0x4a,0x4f, 0x3,0x4a,0x50, 0x4,0x48,0x3d, + 0x4,0x4e,0x4f, 0x4,0x54,0x63, 0x4,0x54,0x61, 0x4,0x54,0x60, + 0x4,0x54,0x64, 0x4,0x54,0x62, 0x4,0x59,0x63, 0x4,0x54,0x68, + 0x3,0x53,0x52, 0x3,0x56,0x7c, 0x4,0x59,0x68, 0x4,0x59,0x64, + 0x7,0x3d,0x56, 0x3,0x56,0x79, 0x3,0x56,0x7d, 0x3,0x56,0x7e, + 0x4,0x5e,0x3e, 0x5,0x65,0x7e, 0x4,0x5e,0x42, 0x4,0x5e,0x3c, + 0x5,0x65,0x73, 0x5,0x65,0x7b, 0x4,0x5e,0x3b, 0x4,0x5e,0x41, + 0x3,0x5b,0x5c, 0x3,0x5b,0x5b, 0x4,0x61,0x77, 0x4,0x61,0x7b, + 0x3,0x5b,0x5a, 0x4,0x65,0x23, 0x4,0x64,0x7e, 0x5,0x6e,0x49, + 0x7,0x56,0x27, 0x7,0x56,0x25, 0x4,0x67,0x72, 0x4,0x67,0x70, + 0x5,0x71,0x69, 0x7,0x56,0x26, 0x3,0x5f,0x74, 0x5,0x74,0x62, + 0x4,0x6b,0x2c, 0x3,0x60,0x5a, 0x4,0x6c,0x34, 0x4,0x6d,0x2d, + 0x3,0x61,0x54, 0x4,0x6d,0x65, 0x3,0x61,0x70, 0x4,0x6e,0x22, + 0x4,0x41,0x61, 0x4,0x48,0x43, 0x4,0x48,0x41, 0x4,0x48,0x42, + 0x4,0x48,0x44, 0x3,0x53,0x54, 0x4,0x59,0x6b, 0x7,0x44,0x77, + 0x4,0x5e,0x45, 0x3,0x59,0x52, 0x4,0x61,0x7d, 0x4,0x61,0x7e, + 0x4,0x67,0x73, 0x4,0x69,0x60, 0x3,0x60,0x5b, 0x3,0x45,0x4e, + 0x3,0x57,0x21, 0x3,0x5b,0x63, 0x3,0x5b,0x62, 0x3,0x5d,0x52, + 0x4,0x67,0x75, 0x4,0x6b,0x2d, 0x3,0x40,0x25, 0x3,0x40,0x26, + 0x3,0x40,0x27, 0x3,0x45,0x51, 0x4,0x54,0x6a, 0x4,0x54,0x69, + 0x3,0x59,0x53, 0x4,0x62,0x22, 0x4,0x62,0x23, 0x3,0x5f,0x75, + 0x4,0x3b,0x7b, 0xf,0x40,0x2d, 0x4,0x41,0x65, 0x4,0x41,0x64, + 0x5,0x44,0x34, 0x5,0x4b,0x3e, 0x4,0x48,0x4d, 0x3,0x4a,0x51, + 0x4,0x48,0x4e, 0x3,0x4a,0x53, 0x4,0x48,0x4c, 0x4,0x48,0x4b, + 0x5,0x4b,0x3f, 0x4,0x48,0x47, 0x3,0x4f,0x68, 0x4,0x4e,0x59, + 0x4,0x4e,0x5c, 0x5,0x52,0x60, 0x4,0x54,0x6d, 0x4,0x54,0x6f, + 0x3,0x53,0x56, 0x4,0x4e,0x5d, 0x3,0x53,0x60, 0x3,0x53,0x57, + 0x3,0x53,0x5e, 0x7,0x35,0x51, 0x3,0x57,0x25, 0x4,0x59,0x73, + 0x7,0x3d,0x69, 0x3,0x57,0x22, 0x4,0x59,0x77, 0x3,0x57,0x23, + 0x3,0x57,0x24, 0x3,0x57,0x27, 0x3,0x57,0x29, 0x4,0x5e,0x4e, + 0x3,0x59,0x54, 0x4,0x5e,0x49, 0x4,0x5e,0x47, 0x4,0x5e,0x4b, + 0x3,0x59,0x57, 0x3,0x59,0x55, 0x4,0x5e,0x4d, 0x4,0x5e,0x4c, + 0x3,0x59,0x5a, 0x4,0x62,0x27, 0x4,0x62,0x29, 0x4,0x62,0x2d, + 0x4,0x62,0x26, 0x4,0x62,0x2c, 0x3,0x5b,0x64, 0x4,0x62,0x25, + 0x4,0x62,0x2f, 0x4,0x62,0x28, 0x4,0x62,0x2b, 0x4,0x65,0x2f, + 0x4,0x65,0x31, 0x4,0x65,0x30, 0x3,0x5d,0x54, 0x4,0x67,0x77, + 0x4,0x67,0x79, 0x4,0x67,0x76, 0x4,0x67,0x7c, 0x4,0x67,0x7b, + 0x7,0x56,0x32, 0x4,0x69,0x63, 0x3,0x5f,0x76, 0x4,0x69,0x62, + 0x4,0x6c,0x39, 0x5,0x78,0x48, 0x3,0x61,0x55, 0x4,0x36,0x2b, + 0x4,0x3b,0x7e, 0x3,0x45,0x53, 0x4,0x41,0x6d, 0x4,0x41,0x72, + 0x4,0x41,0x6e, 0x4,0x48,0x51, 0x4,0x48,0x56, 0x4,0x48,0x59, + 0x4,0x48,0x50, 0x4,0x48,0x54, 0x3,0x4a,0x57, 0x4,0x4e,0x60, + 0x4,0x4e,0x61, 0x4,0x54,0x76, 0x4,0x54,0x77, 0x4,0x54,0x73, + 0x4,0x54,0x74, 0x4,0x54,0x75, 0x4,0x59,0x7d, 0x4,0x5a,0x22, + 0x4,0x5a,0x21, 0x4,0x59,0x7c, 0x4,0x59,0x7a, 0x4,0x59,0x7e, + 0x4,0x5e,0x51, 0x7,0x44,0x7e, 0x4,0x5e,0x50, 0x4,0x5e,0x52, + 0x3,0x59,0x5d, 0x3,0x59,0x5e, 0x3,0x59,0x5f, 0x4,0x62,0x32, + 0x3,0x5b,0x67, 0x3,0x5b,0x66, 0x4,0x65,0x36, 0x3,0x5d,0x55, + 0x4,0x67,0x7e, 0x4,0x6b,0x30, 0x4,0x6c,0x3a, 0x3,0x57,0x2b, + 0x3,0x59,0x60, 0x3,0x34,0x3a, 0x4,0x36,0x2c, 0x3,0x40,0x29, + 0x3,0x40,0x2a, 0x4,0x3c,0x24, 0x3,0x40,0x28, 0x4,0x3c,0x25, + 0x3,0x45,0x5d, 0x3,0x40,0x2c, 0x4,0x41,0x77, 0x4,0x41,0x74, + 0x3,0x4a,0x5c, 0x3,0x45,0x5e, 0x4,0x41,0x75, 0x3,0x45,0x56, + 0x3,0x45,0x55, 0x3,0x45,0x5a, 0x4,0x41,0x79, 0x4,0x41,0x7a, + 0x3,0x4a,0x58, 0x3,0x4a,0x59, 0x4,0x48,0x5b, 0x7,0x2b,0x38, + 0x3,0x4a,0x5a, 0x4,0x48,0x5c, 0x6,0x64,0x40, 0x3,0x4f,0x6a, + 0x4,0x4e,0x65, 0x4,0x4e,0x64, 0x4,0x4e,0x67, 0x4,0x4e,0x66, + 0x4,0x54,0x78, 0x4,0x4e,0x69, 0x4,0x54,0x7c, 0x4,0x54,0x7d, + 0x4,0x54,0x7a, 0x4,0x5a,0x27, 0x4,0x55,0x22, 0x4,0x5a,0x28, + 0x4,0x5a,0x2a, 0x5,0x60,0x31, 0x3,0x57,0x2d, 0x3,0x59,0x64, + 0x5,0x60,0x2c, 0x3,0x57,0x2c, 0x4,0x5e,0x58, 0x4,0x5e,0x57, + 0x4,0x5e,0x5b, 0x4,0x5e,0x59, 0x4,0x5e,0x5a, 0x4,0x65,0x39, + 0x4,0x62,0x36, 0x3,0x5b,0x68, 0x4,0x65,0x3c, 0x4,0x65,0x3b, + 0x3,0x5d,0x57, 0x3,0x5d,0x59, 0x4,0x68,0x24, 0x4,0x68,0x23, + 0x3,0x5e,0x7d, 0x4,0x68,0x22, 0x4,0x69,0x67, 0x4,0x69,0x65, + 0x3,0x5f,0x77, 0x4,0x69,0x68, 0x4,0x6b,0x31, 0x3,0x61,0x56, + 0x4,0x6d,0x30, 0x4,0x6d,0x67, 0x4,0x6e,0x25, 0x3,0x4f,0x6c, + 0x3,0x53,0x67, 0x4,0x5e,0x5f, 0x4,0x62,0x3c, 0x4,0x48,0x5d, + 0x3,0x57,0x2f, 0x4,0x55,0x26, 0x3,0x57,0x2e, 0x3,0x61,0x71, + 0x3,0x40,0x2d, 0x5,0x44,0x4a, 0x3,0x45,0x60, 0x4,0x48,0x5e, + 0x3,0x4a,0x65, 0x4,0x48,0x5f, 0x3,0x4a,0x5f, 0x3,0x4a,0x67, + 0x3,0x4a,0x68, 0x3,0x4a,0x6b, 0x3,0x4a,0x69, 0x4,0x4e,0x6f, + 0x3,0x4f,0x71, 0x3,0x4f,0x70, 0x4,0x4e,0x6e, 0x3,0x4f,0x6f, + 0x4,0x4e,0x6d, 0x4,0x4e,0x70, 0x3,0x53,0x6f, 0x3,0x53,0x6e, + 0x3,0x53,0x6d, 0x5,0x5a,0x2c, 0x3,0x53,0x69, 0x4,0x55,0x2d, + 0x5,0x5a,0x2e, 0x7,0x36,0x28, 0x4,0x5a,0x2e, 0x3,0x57,0x32, + 0x3,0x57,0x35, 0x4,0x5a,0x2d, 0x3,0x57,0x31, 0x4,0x5e,0x67, + 0x5,0x6a,0x6e, 0x4,0x5e,0x62, 0x3,0x59,0x68, 0x4,0x5e,0x68, + 0x3,0x59,0x69, 0x4,0x5e,0x63, 0x4,0x5e,0x65, 0x3,0x59,0x6c, + 0x4,0x62,0x41, 0x4,0x62,0x3f, 0x3,0x5b,0x6a, 0x4,0x62,0x46, + 0x4,0x62,0x40, 0x4,0x62,0x44, 0x4,0x62,0x45, 0x4,0x65,0x41, + 0x4,0x65,0x40, 0x3,0x5d,0x5d, 0x3,0x5d,0x5b, 0x4,0x65,0x47, + 0x5,0x6e,0x66, 0x5,0x6e,0x6d, 0x3,0x5d,0x5c, 0x4,0x68,0x29, + 0x4,0x68,0x2a, 0x4,0x68,0x2b, 0x4,0x68,0x2d, 0x3,0x5f,0x23, + 0x5,0x72,0x2d, 0x4,0x68,0x28, 0x7,0x5a,0x3e, 0x5,0x74,0x76, + 0x4,0x69,0x6b, 0x4,0x69,0x69, 0x3,0x5f,0x7a, 0x4,0x6b,0x33, + 0x4,0x6b,0x34, 0x4,0x6b,0x32, 0x3,0x61,0x2b, 0x7,0x60,0x2e, + 0x7,0x60,0x2d, 0x3,0x61,0x57, 0x4,0x6d,0x68, 0x3,0x62,0x27, + 0x4,0x6e,0x3f, 0x3,0x62,0x37, 0x4,0x6e,0x57, 0x3,0x39,0x69, + 0x3,0x40,0x2e, 0x4,0x48,0x62, 0x3,0x4a,0x6d, 0x3,0x4f,0x75, + 0x4,0x4e,0x75, 0x4,0x4e,0x73, 0x4,0x4e,0x76, 0x3,0x4f,0x78, + 0x3,0x53,0x72, 0x3,0x53,0x73, 0x4,0x55,0x30, 0x4,0x55,0x32, + 0x4,0x55,0x2f, 0x4,0x55,0x2e, 0x3,0x57,0x39, 0x4,0x5a,0x31, + 0x4,0x5a,0x35, 0x4,0x5a,0x30, 0x3,0x57,0x38, 0x4,0x5a,0x33, + 0x5,0x66,0x51, 0x4,0x5e,0x6e, 0x3,0x5b,0x70, 0x4,0x62,0x48, + 0x4,0x62,0x47, 0x4,0x65,0x49, 0x3,0x5d,0x5f, 0x4,0x68,0x30, + 0x4,0x69,0x6e, 0x4,0x6b,0x35, 0x4,0x6c,0x3e, 0x4,0x6d,0x33, + 0x3,0x40,0x30, 0x4,0x42,0x22, 0x4,0x62,0x4a, 0x5,0x74,0x7a, + 0x7,0x64,0x75, 0x3,0x40,0x31, 0x5,0x3d,0x52, 0x6,0x64,0x5e, + 0x4,0x48,0x6a, 0x4,0x48,0x69, 0x4,0x48,0x67, 0x3,0x4a,0x74, + 0x5,0x4b,0x59, 0x4,0x4e,0x7b, 0x3,0x4f,0x7a, 0x4,0x55,0x35, + 0x4,0x55,0x36, 0x4,0x5a,0x38, 0x3,0x57,0x3d, 0x4,0x5a,0x3b, + 0x4,0x5e,0x70, 0x4,0x5e,0x73, 0x3,0x59,0x6e, 0x4,0x5e,0x74, + 0x4,0x5e,0x76, 0x4,0x5e,0x75, 0x4,0x5e,0x77, 0x4,0x62,0x4e, + 0x3,0x5b,0x72, 0x4,0x62,0x4c, 0x4,0x65,0x4d, 0x4,0x65,0x4f, + 0x4,0x65,0x4e, 0x7,0x51,0x79, 0x5,0x72,0x3f, 0x3,0x5f,0x26, + 0x4,0x69,0x72, 0x4,0x6c,0x43, 0x4,0x6c,0x41, 0x3,0x61,0x2d, + 0x5,0x78,0x52, 0x4,0x6d,0x35, 0x7,0x61,0x6a, 0x4,0x6d,0x69, + 0x4,0x6e,0x49, 0x7,0x51,0x7d, 0x5,0x72,0x41, 0x3,0x4a,0x77, + 0x3,0x4a,0x76, 0x3,0x4d,0x3e, 0x3,0x53,0x76, 0x7,0x5a,0x4b, + 0x3,0x61,0x58, 0x3,0x4a,0x79, 0x4,0x4f,0x24, 0x4,0x4f,0x25, + 0x4,0x55,0x3f, 0x3,0x53,0x77, 0x4,0x5e,0x7e, 0x3,0x59,0x70, + 0x4,0x5e,0x7d, 0x4,0x5e,0x7c, 0x3,0x5b,0x73, 0x5,0x66,0x68, + 0x3,0x5d,0x65, 0x4,0x69,0x77, 0x4,0x69,0x76, 0x7,0x5a,0x4f, + 0x4,0x6c,0x48, 0x4,0x6c,0x49, 0x4,0x6e,0x58, 0x5,0x3d,0x54, + 0x4,0x48,0x6d, 0x5,0x4b,0x64, 0x4,0x4f,0x28, 0x4,0x4f,0x34, + 0x3,0x50,0x21, 0x7,0x2b,0x6a, 0x4,0x4f,0x39, 0x4,0x4f,0x32, + 0x4,0x4f,0x2b, 0x4,0x4f,0x29, 0x3,0x54,0x27, 0x4,0x55,0x44, + 0x4,0x55,0x42, 0x4,0x55,0x48, 0x3,0x53,0x7e, 0x3,0x54,0x28, + 0x4,0x55,0x41, 0x3,0x54,0x26, 0x3,0x54,0x24, 0x3,0x54,0x22, + 0x3,0x53,0x7b, 0x4,0x5a,0x40, 0x3,0x57,0x41, 0x4,0x5f,0x21, + 0x7,0x3e,0x49, 0x4,0x5a,0x42, 0x3,0x59,0x72, 0x4,0x5f,0x23, + 0x5,0x66,0x6e, 0x4,0x5f,0x27, 0x4,0x5f,0x25, 0x3,0x59,0x78, + 0x4,0x5f,0x24, 0x3,0x59,0x77, 0x4,0x5f,0x29, 0x4,0x5f,0x2b, + 0x4,0x62,0x5d, 0x5,0x6b,0x35, 0x4,0x62,0x67, 0x4,0x62,0x57, + 0x4,0x62,0x61, 0x4,0x62,0x59, 0x4,0x62,0x54, 0x3,0x5b,0x76, + 0x5,0x6b,0x31, 0x4,0x62,0x62, 0x5,0x6b,0x2b, 0x4,0x62,0x60, + 0x4,0x62,0x64, 0x3,0x5b,0x78, 0x3,0x5b,0x7b, 0x3,0x5b,0x7c, + 0xf,0x64,0x72, 0x3,0x5d,0x77, 0x4,0x65,0x55, 0x7,0x52,0x31, + 0x4,0x65,0x5b, 0x3,0x5d,0x6c, 0x7,0x52,0x33, 0x4,0x65,0x53, + 0x3,0x5d,0x6b, 0x3,0x5d,0x6d, 0x4,0x68,0x3d, 0x3,0x5f,0x2d, + 0x3,0x5f,0x30, 0x4,0x68,0x3c, 0x3,0x5f,0x2e, 0x3,0x5f,0x2b, + 0x4,0x68,0x3a, 0x3,0x5f,0x29, 0x3,0x5f,0x2f, 0x4,0x69,0x7d, + 0x3,0x5f,0x7d, 0x4,0x6a,0x21, 0x4,0x69,0x7c, 0x3,0x5f,0x7c, + 0x4,0x69,0x7e, 0x3,0x60,0x24, 0x4,0x69,0x7b, 0x3,0x60,0x21, + 0xf,0x6a,0x3f, 0x4,0x6b,0x3c, 0x4,0x6b,0x3d, 0x4,0x6b,0x40, + 0x4,0x6b,0x3b, 0x7,0x5e,0x23, 0x3,0x60,0x67, 0x3,0x60,0x64, + 0x5,0x78,0x5b, 0x5,0x78,0x56, 0x3,0x61,0x30, 0x4,0x6c,0x4d, + 0x4,0x6c,0x4e, 0x5,0x77,0x24, 0x3,0x61,0x5a, 0x4,0x6d,0x39, + 0x3,0x61,0x31, 0x4,0x6e,0x2c, 0x4,0x6e,0x2d, 0x4,0x6e,0x5b, + 0x3,0x45,0x65, 0x3,0x4a,0x7a, 0x3,0x4a,0x7b, 0x3,0x4a,0x7c, + 0x3,0x4a,0x7e, 0x5,0x4b,0x6b, 0x3,0x4a,0x7d, 0x5,0x53,0x38, + 0x4,0x4f,0x3f, 0x3,0x50,0x23, 0x4,0x4f,0x44, 0x4,0x4f,0x3b, + 0x7,0x2b,0x6d, 0x4,0x4f,0x40, 0x3,0x50,0x28, 0x3,0x50,0x29, + 0x3,0x50,0x26, 0x3,0x4c,0x63, 0x4,0x4f,0x41, 0x4,0x55,0x4e, + 0x3,0x54,0x2f, 0x4,0x55,0x4d, 0x3,0x54,0x30, 0x4,0x55,0x4f, + 0x3,0x54,0x2b, 0x4,0x55,0x54, 0x7,0x36,0x4a, 0x4,0x55,0x4a, + 0x3,0x54,0x2e, 0x4,0x55,0x57, 0x3,0x57,0x4b, 0x4,0x55,0x4b, + 0x3,0x54,0x31, 0x4,0x55,0x55, 0x3,0x54,0x34, 0x4,0x55,0x50, + 0x7,0x36,0x51, 0x3,0x56,0x33, 0x3,0x57,0x4c, 0x4,0x5a,0x51, + 0x3,0x57,0x47, 0x3,0x57,0x49, 0x3,0x57,0x46, 0x4,0x5a,0x52, + 0x3,0x57,0x4e, 0x4,0x5a,0x50, 0x4,0x5f,0x2f, 0x4,0x5f,0x35, + 0x4,0x5f,0x2c, 0x3,0x5a,0x21, 0x3,0x59,0x7c, 0x4,0x5f,0x32, + 0x4,0x5f,0x31, 0x5,0x67,0x26, 0x4,0x5f,0x38, 0x4,0x62,0x6a, + 0x3,0x5c,0x21, 0x4,0x62,0x6c, 0x4,0x65,0x61, 0x3,0x5c,0x28, + 0x4,0x62,0x6f, 0x5,0x6b,0x3c, 0x4,0x5f,0x36, 0xf,0x64,0x75, + 0x3,0x5d,0x78, 0x4,0x65,0x6c, 0x3,0x5d,0x7d, 0x3,0x5d,0x7b, + 0x4,0x65,0x6a, 0x4,0x65,0x64, 0x3,0x5d,0x7c, 0x7,0x52,0x42, + 0x4,0x65,0x62, 0x4,0x65,0x6b, 0x3,0x5d,0x7e, 0x3,0x5f,0x34, + 0x4,0x68,0x40, 0x4,0x68,0x42, 0x4,0x68,0x41, 0x5,0x72,0x63, + 0x3,0x5f,0x33, 0x4,0x6a,0x27, 0x4,0x6a,0x2c, 0x3,0x60,0x28, + 0x4,0x6a,0x26, 0x3,0x60,0x26, 0x3,0x60,0x27, 0x4,0x6b,0x45, + 0x3,0x60,0x6b, 0x5,0x77,0x2c, 0x4,0x6b,0x44, 0x5,0x77,0x34, + 0x4,0x6b,0x47, 0x3,0x60,0x6a, 0x3,0x60,0x69, 0x4,0x6b,0x48, + 0x4,0x6c,0x50, 0x4,0x6c,0x52, 0x4,0x6c,0x51, 0x3,0x61,0x36, + 0x4,0x6c,0x54, 0x4,0x6d,0x3d, 0x3,0x61,0x5c, 0x7,0x63,0x37, + 0x3,0x62,0x2a, 0x3,0x62,0x3e, 0x4,0x6e,0x59, 0x3,0x62,0x43, + 0x4,0x4f,0x47, 0x4,0x5f,0x39, 0x7,0x57,0x29, 0x4,0x6b,0x4d, + 0x5,0x79,0x73, 0x5,0x4b,0x6d, 0x4,0x4f,0x49, 0x4,0x4f,0x4a, + 0x3,0x50,0x2d, 0x3,0x54,0x38, 0x4,0x55,0x58, 0x7,0x36,0x5c, + 0x3,0x5a,0x23, 0x4,0x62,0x72, 0x3,0x5f,0x39, 0x3,0x61,0x37, + 0x3,0x61,0x38, 0x4,0x48,0x73, 0x4,0x48,0x74, 0x3,0x4b,0x21, + 0x4,0x4f,0x4d, 0x4,0x4f,0x4b, 0x4,0x55,0x59, 0x4,0x55,0x5c, + 0x4,0x55,0x5a, 0x4,0x55,0x5d, 0x3,0x57,0x4f, 0x4,0x5f,0x3c, + 0x4,0x5f,0x3b, 0x3,0x5a,0x27, 0x4,0x62,0x79, 0x4,0x62,0x76, + 0x4,0x62,0x7d, 0x4,0x62,0x77, 0x4,0x62,0x7c, 0x4,0x68,0x49, + 0x4,0x68,0x48, 0x4,0x68,0x4a, 0x5,0x75,0x4d, 0x5,0x75,0x48, + 0x4,0x6b,0x4e, 0x3,0x61,0x39, 0x7,0x5a,0x7d, 0x4,0x6d,0x41, + 0x7,0x2c,0x31, 0x4,0x65,0x71, 0x4,0x65,0x72, 0x7,0x36,0x65, + 0x4,0x5f,0x3d, 0x4,0x63,0x21, 0x4,0x65,0x76, 0x4,0x68,0x4b, + 0x4,0x6b,0x52, 0x4,0x6c,0x5a, 0x7,0x2c,0x33, 0x4,0x55,0x5e, + 0x7,0x36,0x67, 0x5,0x6f,0x52, 0x4,0x65,0x79, 0x5,0x6f,0x54, + 0x4,0x68,0x4c, 0x4,0x68,0x4e, 0x4,0x68,0x4d, 0x4,0x6a,0x31, + 0x4,0x6b,0x55, 0x4,0x6d,0x42, 0x4,0x42,0x2c, 0x3,0x4b,0x23, + 0x4,0x4f,0x52, 0x4,0x4f,0x53, 0x4,0x55,0x5f, 0x4,0x5a,0x5f, + 0x5,0x61,0x23, 0x5,0x67,0x40, 0x5,0x67,0x3d, 0x4,0x5f,0x3f, + 0x5,0x67,0x41, 0x4,0x63,0x23, 0x3,0x5c,0x2b, 0x4,0x65,0x7c, + 0x4,0x66,0x21, 0x4,0x65,0x7d, 0x5,0x6f,0x58, 0x4,0x68,0x52, + 0x3,0x5f,0x3b, 0x4,0x6b,0x56, 0x4,0x6c,0x5b, 0x4,0x6d,0x44, + 0x3,0x61,0x5e, 0x4,0x6d,0x43, 0x4,0x6d,0x6f, 0x4,0x5f,0x40, + 0x3,0x5c,0x2c, 0x4,0x6a,0x37, 0x3,0x61,0x3a, 0x4,0x55,0x61, + 0x4,0x6c,0x61, 0x4,0x6c,0x62, 0x4,0x5f,0x43, 0x4,0x5f,0x42, + 0x4,0x5f,0x44, 0x4,0x63,0x26, 0x4,0x68,0x59, 0x4,0x55,0x62, + 0x4,0x5a,0x63, 0x4,0x5f,0x45, 0x4,0x63,0x27, 0x4,0x68,0x5a, + 0x3,0x60,0x2a, 0x4,0x6b,0x58, 0x4,0x6b,0x5b, 0x3,0x5a,0x2c, + 0x4,0x5f,0x46, 0x3,0x5e,0x23, 0x7,0x52,0x67, 0x5,0x6f,0x61, + 0x4,0x68,0x5c, 0x4,0x6e,0x31, 0x5,0x7b,0x7a, 0x4,0x5a,0x66, + 0x5,0x61,0x2d, 0x4,0x5f,0x48, 0x4,0x63,0x29, 0x4,0x63,0x2b, + 0x4,0x66,0x27, 0x4,0x66,0x25, 0x4,0x66,0x26, 0x3,0x5f,0x3d, + 0x4,0x68,0x61, 0x4,0x6a,0x3d, 0x4,0x6a,0x3c, 0x3,0x60,0x6e, + 0x5,0x77,0x4d, 0x4,0x6c,0x69, 0x4,0x6c,0x66, 0x4,0x6c,0x6a, + 0x4,0x6d,0x4c, 0x4,0x6d,0x4b, 0x4,0x6d,0x70, 0x3,0x61,0x76, + 0x3,0x62,0x2b, 0x3,0x62,0x32, 0x4,0x6e,0x4b, 0x4,0x6e,0x4c, + 0x4,0x6e,0x5a, 0x5,0x75,0x61, 0x5,0x6b,0x69, 0x5,0x6c,0x44, + 0x4,0x68,0x62, 0x4,0x68,0x63, 0x4,0x6d,0x51, 0x3,0x62,0x2c, + 0x1,0x44,0x21, 0x1,0x44,0x23, 0x4,0x21,0x26, 0x1,0x44,0x24, + 0x3,0x21,0x26, 0x3,0x21,0x25, 0x2,0x21,0x26, 0x1,0x44,0x37, + 0x1,0x44,0x35, 0x1,0x44,0x38, 0x1,0x44,0x36, 0x2,0x21,0x27, + 0x1,0x44,0x62, 0x2,0x21,0x2f, 0x2,0x21,0x2d, 0x1,0x44,0x61, + 0x1,0x44,0x60, 0x4,0x21,0x39, 0x1,0x45,0x62, 0x1,0x45,0x61, + 0x1,0x45,0x60, 0x4,0x21,0x55, 0x1,0x45,0x63, 0x1,0x45,0x5f, + 0x1,0x47,0x22, 0x1,0x47,0x23, 0x3,0x22,0x62, 0x3,0x22,0x61, + 0x3,0x22,0x63, 0x4,0x23,0x35, 0x3,0x24,0x3f, 0x1,0x4b,0x64, + 0x3,0x21,0x21, 0x4,0x21,0x27, 0x3,0x21,0x2c, 0x1,0x44,0x39, + 0x1,0x44,0x63, 0x2,0x21,0x30, 0x4,0x21,0x3a, 0x1,0x44,0x64, + 0x2,0x21,0x43, 0x1,0x48,0x6b, 0x2,0x25,0x31, 0x4,0x2b,0x5e, + 0x3,0x21,0x22, 0x1,0x44,0x3a, 0x1,0x44,0x65, 0x1,0x45,0x64, + 0x2,0x21,0x44, 0x3,0x27,0x40, 0x3,0x21,0x23, 0x4,0x21,0x22, + 0x4,0x21,0x23, 0x2,0x21,0x21, 0x1,0x44,0x25, 0x1,0x44,0x3c, + 0x3,0x21,0x30, 0x2,0x21,0x28, 0x1,0x44,0x3d, 0x3,0x21,0x2e, + 0x1,0x44,0x66, 0x1,0x45,0x65, 0x1,0x45,0x67, 0x1,0x45,0x66, + 0x4,0x22,0x27, 0x1,0x47,0x24, 0x1,0x47,0x25, 0x3,0x23,0x45, + 0x1,0x4b,0x65, 0x3,0x2b,0x22, 0x1,0x53,0x7d, 0x1,0x44,0x22, + 0x4,0x21,0x24, 0x2,0x21,0x22, 0x1,0x44,0x26, 0x1,0x44,0x3f, + 0x1,0x44,0x3e, 0x3,0x21,0x46, 0x3,0x21,0x45, 0x3,0x22,0x64, + 0x1,0x47,0x26, 0x4,0x22,0x28, 0x3,0x24,0x40, 0x1,0x4b,0x66, + 0x4,0x25,0x31, 0x4,0x25,0x30, 0x3,0x2b,0x23, 0x1,0x58,0x71, + 0x2,0x33,0x4e, 0x3,0x39,0x6c, 0x3,0x39,0x6e, 0x1,0x63,0x2a, + 0x2,0x41,0x56, 0x2,0x41,0x57, 0x3,0x21,0x24, 0x1,0x44,0x27, + 0x3,0x21,0x2d, 0x1,0x44,0x68, 0x3,0x22,0x65, 0x1,0x4b,0x67, + 0x1,0x44,0x28, 0x2,0x21,0x29, 0x1,0x44,0x40, 0x3,0x21,0x31, + 0x1,0x44,0x69, 0x1,0x44,0x6b, 0x2,0x21,0x31, 0x1,0x44,0x6c, + 0x1,0x44,0x6a, 0x4,0x21,0x3b, 0x3,0x21,0x6c, 0x3,0x22,0x66, + 0x1,0x47,0x27, 0x1,0x4b,0x68, 0x3,0x24,0x42, 0x3,0x27,0x42, + 0x1,0x4b,0x69, 0x1,0x4f,0x67, 0x1,0x27,0x28, 0x1,0x44,0x41, + 0x1,0x44,0x6d, 0x3,0x21,0x47, 0x1,0x47,0x28, 0x1,0x47,0x2a, + 0x1,0x47,0x29, 0x1,0x48,0x6c, 0x1,0x4b,0x6a, 0x1,0x4b,0x6b, + 0x1,0x4f,0x68, 0x1,0x4f,0x69, 0x3,0x2b,0x26, 0x3,0x2b,0x25, + 0x3,0x2b,0x27, 0x3,0x2b,0x24, 0x1,0x53,0x7e, 0x4,0x36,0x2e, + 0x2,0x41,0x58, 0x3,0x40,0x33, 0x2,0x6d,0x44, 0x1,0x44,0x29, + 0x3,0x21,0x32, 0x3,0x21,0x33, 0x1,0x44,0x6f, 0x1,0x44,0x6e, + 0x2,0x21,0x32, 0x1,0x44,0x70, 0x1,0x44,0x76, 0x3,0x21,0x49, + 0x1,0x44,0x71, 0x1,0x44,0x72, 0x2,0x21,0x34, 0x2,0x21,0x33, + 0x1,0x44,0x74, 0x1,0x44,0x75, 0x3,0x21,0x4c, 0x1,0x44,0x73, + 0x3,0x21,0x4b, 0x3,0x21,0x4a, 0x4,0x21,0x3c, 0x1,0x45,0x6a, + 0x1,0x45,0x6b, 0x1,0x45,0x6c, 0x1,0x45,0x6d, 0x1,0x45,0x69, + 0x1,0x45,0x70, 0x2,0x21,0x4a, 0x4,0x21,0x5b, 0x2,0x21,0x46, + 0x2,0x21,0x49, 0x1,0x45,0x71, 0x1,0x46,0x23, 0x3,0x21,0x6d, + 0x2,0x21,0x48, 0x4,0x21,0x5a, 0x1,0x45,0x6e, 0x1,0x45,0x6f, + 0x1,0x45,0x68, 0x3,0x21,0x72, 0x3,0x21,0x70, 0x2,0x21,0x45, + 0x2,0x21,0x47, 0x3,0x22,0x6f, 0x3,0x22,0x68, 0x1,0x47,0x37, + 0x2,0x21,0x6f, 0x1,0x47,0x34, 0x1,0x47,0x38, 0x2,0x21,0x79, + 0x2,0x21,0x6d, 0x1,0x47,0x35, 0x2,0x21,0x71, 0x3,0x22,0x6b, + 0x3,0x22,0x67, 0x3,0x22,0x76, 0x1,0x47,0x36, 0x3,0x22,0x6e, + 0x1,0x47,0x39, 0x4,0x22,0x2d, 0x1,0x47,0x2b, 0x2,0x21,0x70, + 0x1,0x47,0x3a, 0x2,0x21,0x74, 0x3,0x22,0x6d, 0x2,0x21,0x78, + 0x2,0x21,0x75, 0x3,0x22,0x6c, 0x3,0x22,0x74, 0x2,0x21,0x72, + 0x1,0x47,0x2c, 0x1,0x47,0x2e, 0x1,0x47,0x3b, 0x4,0x22,0x2a, + 0x1,0x47,0x30, 0x2,0x21,0x6a, 0x1,0x47,0x33, 0x1,0x47,0x31, + 0x1,0x47,0x32, 0x2,0x21,0x7a, 0x2,0x21,0x77, 0x2,0x21,0x6e, + 0x1,0x47,0x2f, 0x3,0x22,0x70, 0x3,0x22,0x77, 0x2,0x21,0x6b, + 0x1,0x47,0x2d, 0x3,0x22,0x75, 0x4,0x22,0x2e, 0x3,0x22,0x73, + 0x2,0x21,0x73, 0x2,0x21,0x76, 0x3,0x22,0x72, 0xf,0x21,0x71, + 0x2,0x21,0x6c, 0x2,0x23,0x28, 0x4,0x23,0x39, 0x1,0x49,0x24, + 0x1,0x48,0x75, 0x3,0x24,0x50, 0x3,0x24,0x48, 0x2,0x23,0x29, + 0x1,0x48,0x72, 0x3,0x24,0x4f, 0x1,0x49,0x26, 0x3,0x24,0x46, + 0x1,0x48,0x7a, 0x3,0x24,0x45, 0x1,0x48,0x79, 0x2,0x22,0x7b, + 0x1,0x48,0x7d, 0x1,0x48,0x78, 0x2,0x23,0x22, 0x2,0x23,0x2a, + 0x3,0x24,0x4e, 0x2,0x23,0x26, 0x3,0x24,0x49, 0x1,0x48,0x7b, + 0x3,0x24,0x4b, 0x3,0x24,0x43, 0x1,0x48,0x7e, 0x1,0x48,0x6f, + 0x1,0x49,0x29, 0x2,0x22,0x7d, 0x3,0x24,0x44, 0x3,0x24,0x4c, + 0x2,0x25,0x3d, 0x1,0x48,0x6d, 0x1,0x49,0x25, 0x1,0x48,0x6e, + 0x1,0x48,0x76, 0x1,0x48,0x77, 0x2,0x23,0x24, 0x2,0x22,0x7e, + 0x1,0x48,0x7c, 0x1,0x48,0x74, 0x2,0x22,0x7a, 0x1,0x48,0x70, + 0x2,0x23,0x27, 0x1,0x49,0x27, 0x1,0x49,0x2a, 0x1,0x48,0x73, + 0x1,0x49,0x22, 0x1,0x49,0x28, 0x1,0x48,0x71, 0x2,0x23,0x25, + 0x1,0x49,0x23, 0x2,0x23,0x2b, 0x2,0x22,0x7c, 0x1,0x49,0x21, + 0x2,0x23,0x21, 0x3,0x64,0x48, 0x2,0x23,0x23, 0x3,0x64,0x49, + 0x1,0x4b,0x79, 0x2,0x25,0x3f, 0x2,0x25,0x4b, 0x1,0x4b,0x71, + 0x3,0x27,0x47, 0x2,0x25,0x4c, 0x1,0x4b,0x6c, 0x1,0x4b,0x76, + 0x4,0x25,0x3e, 0x3,0x27,0x4f, 0x1,0x4b,0x6f, 0x2,0x25,0x39, + 0x1,0x4b,0x77, 0x2,0x25,0x38, 0x2,0x25,0x3c, 0x2,0x25,0x43, + 0x2,0x25,0x41, 0x1,0x4c,0x21, 0x1,0x4b,0x7a, 0x2,0x25,0x33, + 0x2,0x25,0x35, 0x1,0x4b,0x7c, 0x1,0x4b,0x70, 0x2,0x25,0x36, + 0x2,0x25,0x42, 0x2,0x25,0x49, 0x1,0x4b,0x75, 0x2,0x25,0x3b, + 0x2,0x25,0x34, 0x1,0x4b,0x74, 0x2,0x25,0x37, 0x1,0x4b,0x78, + 0x2,0x25,0x3a, 0x3,0x27,0x44, 0x1,0x4b,0x73, 0x3,0x27,0x51, + 0x1,0x4b,0x6e, 0x3,0x27,0x48, 0x1,0x4b,0x7d, 0x2,0x25,0x44, + 0x1,0x4b,0x7e, 0x2,0x25,0x48, 0x3,0x27,0x43, 0x2,0x25,0x46, + 0x2,0x25,0x4a, 0x1,0x4b,0x7b, 0x2,0x25,0x3e, 0x2,0x25,0x32, + 0x4,0x25,0x36, 0x2,0x25,0x40, 0x1,0x4b,0x72, 0x2,0x25,0x45, + 0x1,0x4b,0x6d, 0x2,0x25,0x47, 0x3,0x27,0x4c, 0x3,0x27,0x49, + 0x3,0x27,0x4b, 0x3,0x27,0x4a, 0x3,0x27,0x4d, 0xf,0x25,0x44, + 0x1,0x4f,0x78, 0x1,0x4f,0x6c, 0x3,0x2b,0x2d, 0x3,0x2b,0x2e, + 0x2,0x29,0x22, 0x2,0x29,0x2a, 0x3,0x2b,0x36, 0x1,0x4f,0x6b, + 0x1,0x4f,0x73, 0x1,0x50,0x21, 0x3,0x2b,0x2c, 0x2,0x29,0x30, + 0x2,0x29,0x2e, 0x2,0x29,0x29, 0x4,0x28,0x38, 0x4,0x28,0x3e, + 0x3,0x2b,0x2b, 0x1,0x4f,0x6d, 0x2,0x29,0x2f, 0x2,0x29,0x25, + 0x1,0x4f,0x7b, 0x1,0x4f,0x72, 0x1,0x4f,0x7a, 0x2,0x28,0x7e, + 0x3,0x2b,0x32, 0x2,0x29,0x2c, 0x3,0x2b,0x2f, 0x2,0x29,0x23, + 0x1,0x4f,0x76, 0x2,0x29,0x24, 0x3,0x2b,0x33, 0x2,0x28,0x7d, + 0x1,0x4f,0x7d, 0x1,0x4f,0x70, 0x1,0x4f,0x79, 0x1,0x4f,0x6f, + 0x3,0x2b,0x28, 0x2,0x29,0x21, 0x2,0x29,0x26, 0x3,0x2b,0x29, + 0x2,0x29,0x2d, 0x1,0x4f,0x77, 0x1,0x4f,0x74, 0x2,0x29,0x28, + 0x1,0x4f,0x7c, 0x2,0x29,0x2b, 0x2,0x29,0x27, 0x1,0x4f,0x71, + 0x1,0x4f,0x7e, 0x1,0x4f,0x75, 0x1,0x4f,0x6e, 0x1,0x4f,0x6a, + 0x4,0x28,0x3f, 0x3,0x2b,0x35, 0xf,0x29,0x2d, 0x3,0x2b,0x34, + 0x3,0x64,0x4a, 0x4,0x28,0x3d, 0x2,0x29,0x31, 0x1,0x54,0x3a, + 0x1,0x54,0x24, 0x3,0x2f,0x48, 0x1,0x54,0x34, 0x3,0x2f,0x4d, + 0x1,0x54,0x39, 0x2,0x2d,0x71, 0x2,0x2d,0x70, 0x2,0x2d,0x75, + 0x2,0x2d,0x76, 0x1,0x54,0x27, 0x3,0x2f,0x44, 0x1,0x54,0x30, + 0x3,0x2f,0x58, 0x3,0x2f,0x4c, 0x3,0x2f,0x56, 0x1,0x54,0x3d, + 0x3,0x2f,0x46, 0x1,0x54,0x31, 0x4,0x2b,0x62, 0x3,0x2f,0x4b, + 0x3,0x2f,0x49, 0x3,0x2f,0x47, 0x2,0x2d,0x6a, 0x1,0x54,0x2a, + 0x2,0x2d,0x6b, 0x3,0x2f,0x4f, 0x1,0x54,0x3f, 0x4,0x2b,0x64, + 0x1,0x54,0x36, 0x1,0x54,0x21, 0x1,0x54,0x22, 0x2,0x2d,0x7e, + 0x1,0x59,0x24, 0x3,0x2f,0x53, 0x1,0x54,0x2f, 0x1,0x54,0x2e, + 0x2,0x2d,0x6c, 0x1,0x54,0x32, 0x2,0x33,0x5e, 0x1,0x54,0x29, + 0x2,0x2d,0x77, 0x1,0x54,0x38, 0x1,0x54,0x37, 0x1,0x54,0x2d, + 0x2,0x2d,0x6f, 0x2,0x2d,0x78, 0x3,0x2f,0x45, 0x2,0x2d,0x69, + 0x1,0x54,0x2c, 0x2,0x2d,0x79, 0x1,0x54,0x35, 0x2,0x2d,0x6d, + 0x1,0x54,0x23, 0x3,0x2f,0x4e, 0x1,0x54,0x26, 0x1,0x54,0x25, + 0x2,0x2d,0x7a, 0x1,0x54,0x33, 0x1,0x54,0x28, 0x1,0x54,0x3c, + 0x1,0x54,0x3e, 0x2,0x2d,0x74, 0x1,0x54,0x3b, 0x3,0x2f,0x51, + 0x2,0x2d,0x7c, 0x2,0x2d,0x6e, 0x2,0x2d,0x7d, 0x3,0x2f,0x43, + 0x2,0x2d,0x72, 0x4,0x2b,0x61, 0x2,0x2d,0x7b, 0x3,0x2f,0x50, + 0x2,0x2d,0x73, 0x3,0x2f,0x54, 0x3,0x2f,0x55, 0x1,0x54,0x2b, + 0x3,0x64,0x4b, 0x2,0x33,0x66, 0x2,0x33,0x5a, 0x3,0x34,0x3c, + 0x1,0x58,0x76, 0x3,0x34,0x3f, 0x2,0x33,0x5f, 0x2,0x33,0x65, + 0x1,0x58,0x75, 0x2,0x33,0x58, 0x1,0x58,0x79, 0x2,0x33,0x5c, + 0x2,0x33,0x55, 0x1,0x58,0x77, 0x2,0x33,0x59, 0x1,0x58,0x7c, + 0x1,0x59,0x23, 0x3,0x34,0x44, 0x2,0x33,0x6a, 0x3,0x34,0x41, + 0x2,0x33,0x54, 0x3,0x34,0x42, 0x1,0x58,0x7d, 0x3,0x2f,0x57, + 0x2,0x33,0x69, 0x3,0x34,0x47, 0x3,0x34,0x3d, 0x1,0x58,0x78, + 0x2,0x33,0x5b, 0x1,0x58,0x74, 0x2,0x33,0x56, 0x2,0x33,0x52, + 0x2,0x33,0x60, 0x2,0x33,0x53, 0x2,0x33,0x51, 0x2,0x33,0x5d, + 0x2,0x33,0x63, 0x2,0x33,0x64, 0x1,0x58,0x7a, 0x3,0x34,0x40, + 0x4,0x30,0x47, 0x2,0x3a,0x3f, 0x2,0x33,0x61, 0x2,0x33,0x50, + 0x2,0x33,0x62, 0x3,0x34,0x4b, 0x1,0x59,0x26, 0x2,0x33,0x67, + 0x1,0x59,0x25, 0x2,0x33,0x4f, 0x3,0x34,0x43, 0x2,0x33,0x57, + 0x2,0x33,0x68, 0x1,0x59,0x21, 0x1,0x58,0x7e, 0x1,0x58,0x7b, + 0x1,0x59,0x22, 0x3,0x34,0x4c, 0x3,0x34,0x4a, 0x1,0x58,0x72, + 0x3,0x34,0x45, 0x3,0x34,0x46, 0x1,0x58,0x73, 0x1,0x5e,0x2e, + 0x3,0x39,0x75, 0x2,0x3a,0x42, 0x2,0x3a,0x3b, 0x4,0x36,0x34, + 0x1,0x5e,0x2b, 0x4,0x36,0x33, 0x2,0x3a,0x43, 0x3,0x39,0x71, + 0x3,0x39,0x72, 0x4,0x36,0x36, 0x2,0x3a,0x39, 0x2,0x3a,0x3c, + 0x1,0x5e,0x2a, 0x2,0x3a,0x3d, 0x3,0x39,0x6f, 0x4,0x36,0x31, + 0x1,0x5e,0x2d, 0x2,0x3a,0x41, 0x4,0x36,0x3c, 0x2,0x3a,0x37, + 0x2,0x3a,0x36, 0x1,0x5e,0x2f, 0x3,0x39,0x70, 0x1,0x5e,0x30, + 0x1,0x5e,0x2c, 0x1,0x5e,0x31, 0x2,0x3a,0x35, 0x2,0x3a,0x40, + 0x2,0x3a,0x3e, 0x2,0x3a,0x38, 0x4,0x36,0x39, 0x4,0x36,0x30, + 0x4,0x36,0x3a, 0x1,0x5e,0x29, 0x2,0x3a,0x3a, 0x3,0x64,0x4d, + 0x3,0x40,0x39, 0x3,0x40,0x3c, 0x1,0x63,0x31, 0x1,0x63,0x2b, + 0x2,0x41,0x5c, 0x1,0x63,0x34, 0x2,0x41,0x62, 0x2,0x41,0x65, + 0x1,0x63,0x2d, 0x1,0x63,0x2e, 0x2,0x41,0x5f, 0x1,0x63,0x2c, + 0x2,0x41,0x68, 0x1,0x63,0x32, 0x2,0x41,0x69, 0x3,0x40,0x3a, + 0x2,0x41,0x64, 0x1,0x63,0x33, 0x3,0x40,0x37, 0x2,0x41,0x59, + 0x1,0x63,0x30, 0x2,0x41,0x5a, 0x4,0x3c,0x29, 0x2,0x41,0x63, + 0x2,0x41,0x61, 0x3,0x40,0x3d, 0x2,0x41,0x5d, 0x1,0x63,0x2f, + 0x2,0x41,0x5b, 0x1,0x63,0x35, 0x2,0x41,0x60, 0x2,0x41,0x67, + 0x2,0x41,0x5e, 0x2,0x41,0x66, 0x3,0x40,0x36, 0x3,0x40,0x3e, + 0x1,0x67,0x7c, 0x1,0x67,0x79, 0x3,0x45,0x6b, 0x1,0x67,0x7a, + 0x4,0x42,0x2d, 0x2,0x49,0x21, 0x2,0x48,0x77, 0x1,0x67,0x78, + 0x1,0x67,0x75, 0x2,0x48,0x78, 0x3,0x45,0x6e, 0x3,0x45,0x6c, + 0x1,0x67,0x77, 0x2,0x48,0x7b, 0x3,0x45,0x6d, 0x2,0x48,0x7d, + 0x3,0x45,0x76, 0x4,0x42,0x35, 0x2,0x49,0x26, 0x3,0x45,0x70, + 0x3,0x45,0x75, 0x2,0x49,0x25, 0x2,0x48,0x7e, 0x1,0x67,0x74, + 0x2,0x48,0x76, 0x1,0x67,0x72, 0x2,0x48,0x79, 0x1,0x67,0x7d, + 0x2,0x48,0x7c, 0x3,0x45,0x71, 0x2,0x49,0x22, 0x1,0x67,0x76, + 0x1,0x67,0x73, 0x2,0x49,0x24, 0x2,0x49,0x23, 0x1,0x67,0x7b, + 0x2,0x48,0x7a, 0x3,0x45,0x74, 0x1,0x6c,0x23, 0x2,0x4f,0x54, + 0x3,0x4b,0x29, 0x2,0x4f,0x51, 0x1,0x6c,0x24, 0x4,0x48,0x79, + 0x1,0x6c,0x22, 0x3,0x4b,0x2b, 0x2,0x4f,0x58, 0x2,0x4f,0x55, + 0x2,0x4f,0x4e, 0x1,0x6c,0x21, 0x3,0x4b,0x2d, 0x1,0x6c,0x25, + 0x2,0x4f,0x4f, 0x1,0x6b,0x7e, 0x1,0x6c,0x28, 0x2,0x4f,0x52, + 0x2,0x4f,0x53, 0x1,0x6c,0x26, 0x1,0x6c,0x27, 0x2,0x4f,0x59, + 0x2,0x4f,0x56, 0x2,0x4f,0x57, 0x3,0x4b,0x2c, 0x3,0x4b,0x27, + 0x3,0x64,0x4e, 0x1,0x70,0x33, 0x2,0x56,0x43, 0x1,0x70,0x30, + 0x2,0x56,0x40, 0x1,0x70,0x32, 0x1,0x70,0x34, 0x3,0x50,0x31, + 0x2,0x56,0x41, 0x1,0x70,0x31, 0x4,0x4f,0x5a, 0x2,0x56,0x42, + 0x3,0x50,0x35, 0x2,0x56,0x3f, 0x3,0x50,0x30, 0x3,0x50,0x34, + 0x1,0x73,0x41, 0x2,0x5c,0x49, 0x1,0x73,0x42, 0x2,0x5c,0x47, + 0x4,0x55,0x65, 0x2,0x5c,0x48, 0x2,0x5c,0x46, 0x2,0x5c,0x45, + 0x3,0x54,0x41, 0x3,0x54,0x40, 0x2,0x5c,0x4a, 0x1,0x73,0x40, + 0x3,0x50,0x33, 0x4,0x55,0x69, 0x2,0x61,0x44, 0x2,0x61,0x45, + 0x3,0x57,0x52, 0x2,0x4f,0x50, 0x2,0x61,0x43, 0x1,0x73,0x43, + 0x1,0x78,0x2b, 0x2,0x65,0x37, 0x2,0x65,0x38, 0x3,0x5c,0x32, + 0x1,0x7a,0x62, 0x1,0x7a,0x63, 0x2,0x6b,0x4f, 0x2,0x6b,0x4e, + 0x1,0x7b,0x58, 0x1,0x7b,0x57, 0x2,0x6e,0x7d, 0x3,0x60,0x6f, + 0x1,0x44,0x2a, 0x1,0x44,0x42, 0x1,0x44,0x78, 0x4,0x21,0x3d, + 0x1,0x44,0x77, 0x1,0x45,0x73, 0x1,0x45,0x72, 0x1,0x47,0x3e, + 0x1,0x47,0x3d, 0x1,0x47,0x3f, 0x1,0x47,0x3c, 0x3,0x22,0x78, + 0x1,0x49,0x2c, 0x1,0x49,0x2b, 0x1,0x49,0x2d, 0x3,0x24,0x54, + 0x4,0x23,0x3b, 0x3,0x24,0x53, 0x3,0x24,0x51, 0x1,0x4c,0x23, + 0x4,0x25,0x3f, 0x1,0x4c,0x22, 0x1,0x4c,0x24, 0x3,0x27,0x52, + 0x1,0x50,0x22, 0x4,0x28,0x40, 0x1,0x22,0x79, 0x2,0x2e,0x21, + 0x1,0x22,0x7a, 0x1,0x59,0x27, 0x1,0x22,0x7c, 0x1,0x22,0x7b, + 0x2,0x3a,0x44, 0x3,0x39,0x76, 0x1,0x22,0x7d, 0x1,0x67,0x7e, + 0x1,0x22,0x7e, 0x3,0x5e,0x25, 0x1,0x44,0x2b, 0x3,0x21,0x34, + 0x1,0x44,0x79, 0x1,0x47,0x40, 0x1,0x4c,0x25, 0x3,0x2b,0x37, + 0x1,0x44,0x2c, 0x1,0x44,0x7c, 0x1,0x44,0x7a, 0x1,0x44,0x7b, + 0x1,0x47,0x41, 0x3,0x22,0x7a, 0x4,0x22,0x34, 0x1,0x49,0x2e, + 0x1,0x4c,0x27, 0x1,0x4c,0x26, 0x1,0x4c,0x28, 0x3,0x2e,0x7b, + 0x1,0x54,0x40, 0x3,0x40,0x3f, 0x3,0x64,0x53, 0x1,0x70,0x35, + 0x3,0x21,0x27, 0x4,0x21,0x3e, 0x3,0x21,0x4d, 0x3,0x21,0x48, + 0x3,0x21,0x4e, 0x2,0x21,0x2e, 0x4,0x21,0x52, 0x1,0x45,0x74, + 0x1,0x45,0x75, 0x3,0x21,0x78, 0x3,0x21,0x79, 0x1,0x47,0x42, + 0x4,0x22,0x36, 0x2,0x23,0x2c, 0x3,0x27,0x55, 0x1,0x50,0x24, + 0x1,0x50,0x23, 0x2,0x2e,0x23, 0x2,0x2e,0x22, 0x1,0x59,0x28, + 0x3,0x21,0x28, 0x1,0x44,0x7d, 0x2,0x21,0x35, 0x3,0x21,0x7a, + 0x3,0x24,0x57, 0x2,0x25,0x4d, 0x3,0x2b,0x39, 0x1,0x50,0x25, + 0x3,0x2f,0x5b, 0x1,0x54,0x43, 0x3,0x2f,0x59, 0x1,0x54,0x41, + 0x1,0x54,0x42, 0x3,0x2f,0x5a, 0x3,0x34,0x4d, 0xf,0x46,0x5c, + 0x1,0x70,0x36, 0x1,0x27,0x2f, 0x1,0x45,0x76, 0x4,0x21,0x5e, + 0x1,0x47,0x43, 0x2,0x21,0x7b, 0x3,0x22,0x7e, 0x3,0x22,0x7d, + 0x3,0x22,0x7c, 0x3,0x24,0x59, 0x1,0x49,0x2f, 0x1,0x49,0x30, + 0x3,0x24,0x5a, 0x2,0x23,0x2d, 0x4,0x23,0x3d, 0x2,0x25,0x4e, + 0x1,0x4c,0x29, 0x2,0x25,0x4f, 0x4,0x25,0x40, 0x4,0x25,0x43, + 0x3,0x2b,0x3b, 0x3,0x2b,0x3d, 0x3,0x2b,0x3e, 0x2,0x2e,0x25, + 0x2,0x2e,0x26, 0x1,0x54,0x46, 0x3,0x2f,0x5e, 0x2,0x2e,0x27, + 0x3,0x2f,0x5f, 0x2,0x2e,0x24, 0x1,0x54,0x47, 0x1,0x54,0x45, + 0x1,0x54,0x44, 0x2,0x2e,0x28, 0x3,0x34,0x4f, 0x2,0x33,0x6b, + 0x3,0x34,0x4e, 0x3,0x39,0x7d, 0x3,0x39,0x7a, 0x2,0x3a,0x45, + 0x4,0x36,0x3f, 0x3,0x39,0x7e, 0x2,0x41,0x6a, 0x2,0x49,0x27, + 0x3,0x4b,0x2f, 0x3,0x4b,0x2e, 0x3,0x4b,0x30, 0x1,0x6c,0x29, + 0x1,0x70,0x37, 0x2,0x56,0x44, 0x3,0x54,0x42, 0x1,0x44,0x2d, + 0x1,0x44,0x3b, 0x3,0x21,0x2f, 0x3,0x21,0x35, 0x3,0x21,0x51, + 0x3,0x21,0x7b, 0x3,0x23,0x22, 0xf,0x22,0x59, 0x3,0x24,0x5b, + 0x3,0x27,0x59, 0x4,0x25,0x45, 0x1,0x59,0x29, 0x1,0x5e,0x33, + 0x6,0x46,0x65, 0x1,0x68,0x21, 0x3,0x45,0x7a, 0x2,0x21,0x23, + 0x1,0x44,0x7e, 0x4,0x21,0x60, 0x1,0x45,0x79, 0x1,0x45,0x77, + 0x1,0x45,0x78, 0x1,0x4c,0x2a, 0x3,0x27,0x5a, 0x1,0x44,0x2e, + 0x1,0x44,0x2f, 0x4,0x21,0x2a, 0x1,0x44,0x43, 0x3,0x21,0x36, + 0x3,0x21,0x52, 0x1,0x45,0x21, 0x1,0x45,0x22, 0x1,0x45,0x23, + 0x2,0x21,0x4c, 0x1,0x45,0x7a, 0x3,0x21,0x7d, 0x2,0x21,0x4b, + 0x1,0x47,0x47, 0x3,0x23,0x25, 0x2,0x21,0x7d, 0x1,0x47,0x45, + 0x1,0x47,0x46, 0x2,0x21,0x7c, 0x3,0x23,0x24, 0x3,0x23,0x26, + 0x1,0x47,0x48, 0x1,0x47,0x44, 0x3,0x23,0x27, 0x2,0x23,0x2e, + 0x1,0x4f,0x4f, 0x2,0x23,0x2f, 0x3,0x24,0x5f, 0x3,0x24,0x61, + 0x2,0x23,0x30, 0x4,0x23,0x40, 0x3,0x24,0x5c, 0x1,0x49,0x32, + 0x1,0x49,0x31, 0x3,0x24,0x5e, 0x3,0x24,0x5d, 0x1,0x49,0x35, + 0x1,0x49,0x33, 0x1,0x49,0x34, 0x3,0x24,0x60, 0x1,0x4c,0x30, + 0x3,0x27,0x5b, 0x1,0x4c,0x2f, 0x2,0x25,0x54, 0x2,0x25,0x51, + 0x2,0x25,0x52, 0x3,0x27,0x5e, 0x2,0x25,0x50, 0x1,0x4c,0x31, + 0x1,0x4c,0x2d, 0x1,0x4c,0x2c, 0x3,0x27,0x5f, 0x1,0x4c,0x2e, + 0x1,0x4c,0x2b, 0x3,0x27,0x5d, 0x4,0x25,0x4e, 0x3,0x64,0x4f, + 0x1,0x4c,0x32, 0x1,0x50,0x27, 0x2,0x29,0x32, 0x3,0x2b,0x3f, + 0x2,0x25,0x53, 0x1,0x50,0x2c, 0x3,0x2b,0x40, 0x2,0x29,0x33, + 0x1,0x50,0x28, 0x1,0x50,0x2b, 0x1,0x50,0x2a, 0x1,0x50,0x29, + 0x1,0x50,0x26, 0x3,0x2b,0x43, 0x2,0x2e,0x2b, 0x3,0x2f,0x68, + 0x1,0x54,0x4a, 0x2,0x2e,0x2e, 0x1,0x54,0x48, 0x3,0x2f,0x65, + 0x4,0x2b,0x6e, 0x3,0x2f,0x62, 0x2,0x2e,0x2a, 0x1,0x54,0x4b, + 0x1,0x54,0x49, 0x1,0x54,0x4c, 0x2,0x2e,0x2c, 0x2,0x2e,0x2d, + 0x3,0x2f,0x60, 0x2,0x2e,0x29, 0x2,0x2e,0x2f, 0x3,0x2f,0x66, + 0x3,0x2f,0x61, 0x3,0x2f,0x63, 0xf,0x2e,0x2d, 0x3,0x2f,0x64, + 0x3,0x34,0x50, 0x1,0x5e,0x37, 0x1,0x59,0x2a, 0x2,0x33,0x6c, + 0x2,0x33,0x6e, 0x2,0x33,0x6d, 0x2,0x33,0x6f, 0x1,0x59,0x2b, + 0x3,0x3a,0x23, 0x1,0x5e,0x34, 0x3,0x3a,0x21, 0x1,0x5e,0x35, + 0x1,0x5e,0x36, 0x3,0x34,0x51, 0x1,0x63,0x37, 0x2,0x41,0x6c, + 0x3,0x40,0x41, 0x2,0x41,0x6b, 0x2,0x41,0x6d, 0x2,0x41,0x6e, + 0x1,0x63,0x38, 0x3,0x40,0x40, 0x1,0x63,0x36, 0x2,0x49,0x28, + 0x2,0x49,0x29, 0x1,0x68,0x23, 0x1,0x68,0x22, 0x2,0x4c,0x61, + 0x4,0x49,0x25, 0x3,0x4b,0x31, 0x1,0x6c,0x2a, 0x1,0x6c,0x2b, + 0x1,0x6c,0x2c, 0x1,0x6c,0x2e, 0x2,0x4f,0x5a, 0x2,0x4f,0x5b, + 0x1,0x6c,0x2d, 0x3,0x4b,0x32, 0x3,0x50,0x36, 0x1,0x70,0x38, + 0x4,0x4f,0x64, 0x1,0x70,0x39, 0x3,0x50,0x37, 0x4,0x55,0x6d, + 0x2,0x65,0x39, 0x2,0x6b,0x51, 0x2,0x6b,0x50, 0x2,0x6e,0x7e, + 0x3,0x60,0x2c, 0x1,0x44,0x30, 0x3,0x21,0x37, 0x3,0x21,0x54, + 0x3,0x21,0x53, 0x1,0x45,0x7c, 0x1,0x45,0x7b, 0x1,0x47,0x49, + 0x4,0x22,0x42, 0x4,0x22,0x3f, 0x2,0x21,0x7e, 0x4,0x22,0x41, + 0x3,0x23,0x28, 0x1,0x49,0x37, 0x1,0x49,0x38, 0x1,0x49,0x36, + 0x1,0x49,0x39, 0x2,0x23,0x31, 0x2,0x23,0x32, 0x4,0x23,0x46, + 0x4,0x23,0x47, 0x4,0x23,0x48, 0x3,0x24,0x63, 0x3,0x24,0x62, + 0x3,0x27,0x61, 0x5,0x25,0x3a, 0x5,0x25,0x37, 0x5,0x25,0x38, + 0x3,0x27,0x60, 0x5,0x25,0x3b, 0x1,0x4c,0x34, 0x2,0x25,0x55, + 0x4,0x25,0x50, 0x1,0x4c,0x33, 0x3,0x27,0x62, 0x2,0x29,0x34, + 0x1,0x50,0x30, 0x2,0x29,0x35, 0x1,0x50,0x2f, 0x3,0x2b,0x48, + 0x3,0x2b,0x46, 0x4,0x28,0x49, 0x1,0x50,0x2d, 0x4,0x28,0x4b, + 0x1,0x50,0x2e, 0x3,0x2b,0x47, 0x3,0x2f,0x6f, 0x2,0x2e,0x30, + 0x3,0x2f,0x6c, 0x3,0x2f,0x6a, 0x3,0x2f,0x6d, 0x3,0x2f,0x6e, + 0x1,0x59,0x2c, 0x2,0x33,0x71, 0x3,0x34,0x52, 0x1,0x59,0x2f, + 0x2,0x33,0x70, 0x1,0x5b,0x2b, 0x1,0x59,0x2e, 0x1,0x59,0x2d, + 0x1,0x5e,0x3a, 0x5,0x36,0x6a, 0x1,0x5e,0x39, 0x1,0x5e,0x38, + 0x1,0x63,0x39, 0x3,0x40,0x45, 0x3,0x40,0x44, 0x1,0x63,0x3c, + 0x1,0x63,0x3d, 0x1,0x63,0x3b, 0x4,0x3c,0x3c, 0x1,0x63,0x3a, + 0x3,0x40,0x46, 0x5,0x44,0x67, 0x2,0x49,0x2a, 0x3,0x46,0x21, + 0x2,0x49,0x2b, 0x5,0x44,0x63, 0x3,0x45,0x7e, 0x3,0x4b,0x33, + 0x2,0x4f,0x5d, 0x1,0x6c,0x2f, 0x2,0x4f,0x5c, 0x3,0x4d,0x2c, + 0x1,0x70,0x3a, 0x2,0x5c,0x4b, 0x1,0x73,0x44, 0x5,0x53,0x62, + 0x2,0x65,0x3a, 0x1,0x79,0x61, 0x1,0x27,0x34, 0x1,0x44,0x44, + 0x1,0x45,0x24, 0x2,0x21,0x36, 0x3,0x21,0x55, 0x1,0x45,0x25, + 0x1,0x45,0x26, 0x3,0x21,0x56, 0xf,0x21,0x30, 0x3,0x22,0x23, + 0x3,0x22,0x22, 0x1,0x45,0x7d, 0x1,0x45,0x7e, 0x3,0x22,0x24, + 0x1,0x47,0x4a, 0x2,0x23,0x33, 0x2,0x25,0x56, 0x2,0x25,0x57, + 0x4,0x25,0x51, 0x1,0x50,0x31, 0x2,0x2e,0x31, 0x1,0x59,0x31, + 0x1,0x59,0x30, 0x2,0x3a,0x47, 0x2,0x3a,0x46, 0x6,0x50,0x74, + 0x3,0x50,0x38, 0x1,0x44,0x31, 0x1,0x45,0x27, 0x1,0x46,0x21, + 0x4,0x30,0x5e, 0x1,0x59,0x32, 0x2,0x21,0x24, 0x4,0x21,0x65, + 0x2,0x21,0x4d, 0x1,0x46,0x22, 0x3,0x22,0x26, 0x2,0x22,0x22, + 0x1,0x47,0x4c, 0x1,0x47,0x4b, 0x2,0x22,0x21, 0x1,0x49,0x3a, + 0x3,0x64,0x50, 0x3,0x24,0x65, 0x3,0x2b,0x49, 0x4,0x28,0x4e, + 0x4,0x28,0x50, 0x1,0x54,0x4d, 0x4,0x2b,0x78, 0x4,0x30,0x5f, + 0x2,0x33,0x72, 0x1,0x63,0x3e, 0x2,0x49,0x2c, 0x1,0x68,0x24, + 0x3,0x46,0x23, 0x3,0x4b,0x34, 0x2,0x56,0x45, 0x3,0x54,0x44, + 0x3,0x5c,0x34, 0x2,0x68,0x6a, 0x3,0x21,0x29, 0x1,0x45,0x28, + 0x3,0x21,0x57, 0x3,0x24,0x66, 0x2,0x25,0x58, 0x2,0x29,0x36, + 0x1,0x59,0x35, 0x1,0x59,0x33, 0x1,0x59,0x34, 0x1,0x44,0x32, + 0x4,0x21,0x30, 0x1,0x44,0x45, 0x1,0x24,0x3f, 0x1,0x45,0x2b, + 0x3,0x21,0x59, 0x1,0x45,0x2a, 0x1,0x45,0x29, 0x1,0x46,0x25, + 0x1,0x46,0x24, 0x3,0x23,0x2a, 0x2,0x21,0x4e, 0x2,0x22,0x23, + 0xf,0x22,0x2c, 0x3,0x23,0x2b, 0x3,0x23,0x2d, 0x1,0x4c,0x38, + 0x1,0x4c,0x35, 0x1,0x4c,0x37, 0x1,0x4c,0x36, 0x3,0x27,0x63, + 0x1,0x50,0x32, 0x3,0x2b,0x4a, 0x4,0x30,0x60, 0x1,0x5e,0x3b, + 0x4,0x66,0x30, 0x1,0x44,0x33, 0x3,0x21,0x5a, 0x1,0x45,0x2c, + 0x3,0x22,0x27, 0x1,0x46,0x27, 0x1,0x46,0x26, 0x2,0x23,0x34, + 0x4,0x23,0x4d, 0x3,0x64,0x51, 0x1,0x4c,0x39, 0x3,0x2a,0x5c, + 0x4,0x30,0x64, 0x3,0x21,0x2a, 0x4,0x21,0x31, 0x2,0x21,0x37, + 0x3,0x22,0x28, 0x1,0x46,0x29, 0x1,0x46,0x28, 0x1,0x47,0x4d, + 0x1,0x47,0x4e, 0x2,0x23,0x35, 0x1,0x49,0x3b, 0x3,0x24,0x67, + 0x1,0x49,0x3c, 0x3,0x27,0x65, 0x1,0x4c,0x3a, 0x1,0x4c,0x3b, + 0x1,0x4c,0x3c, 0x3,0x27,0x66, 0x1,0x50,0x33, 0x2,0x29,0x37, + 0x3,0x2b,0x4b, 0x4,0x30,0x65, 0x1,0x54,0x4e, 0x3,0x40,0x47, + 0x2,0x21,0x25, 0x4,0x21,0x44, 0x1,0x45,0x2d, 0x3,0x21,0x5b, + 0x4,0x21,0x67, 0x4,0x21,0x66, 0x3,0x22,0x29, 0x2,0x22,0x24, + 0x3,0x23,0x2f, 0x2,0x23,0x36, 0x2,0x23,0x37, 0x2,0x25,0x59, + 0x3,0x27,0x67, 0x2,0x25,0x5a, 0x2,0x29,0x39, 0x2,0x29,0x38, + 0x2,0x29,0x3b, 0x2,0x29,0x3a, 0x1,0x50,0x34, 0x3,0x64,0x52, + 0x2,0x33,0x73, 0x1,0x54,0x50, 0x2,0x2e,0x32, 0x1,0x54,0x4f, + 0x3,0x34,0x54, 0x4,0x30,0x68, 0x2,0x3a,0x48, 0x1,0x5e,0x3c, + 0x3,0x3a,0x28, 0x2,0x3a,0x49, 0x3,0x3a,0x27, 0x3,0x40,0x4a, + 0x3,0x40,0x49, 0x3,0x40,0x48, 0x2,0x49,0x2d, 0x1,0x68,0x25, + 0x3,0x46,0x25, 0x4,0x3c,0x40, 0x3,0x46,0x26, 0x3,0x4b,0x35, + 0x1,0x6c,0x30, 0x3,0x54,0x45, 0x2,0x65,0x3b, 0xf,0x6d,0x2e, + 0x3,0x21,0x2b, 0x3,0x21,0x5c, 0x4,0x21,0x45, 0x2,0x21,0x38, + 0x3,0x22,0x2a, 0x1,0x46,0x2a, 0x4,0x22,0x48, 0x3,0x23,0x31, + 0x4,0x25,0x59, 0x3,0x27,0x69, 0x3,0x27,0x6a, 0x1,0x59,0x36, + 0x3,0x34,0x55, 0x3,0x3a,0x29, 0x1,0x44,0x34, 0x1,0x44,0x46, + 0x1,0x45,0x2f, 0x1,0x45,0x2e, 0x3,0x21,0x5e, 0x1,0x45,0x30, + 0x3,0x21,0x60, 0x4,0x21,0x69, 0x3,0x22,0x2b, 0x3,0x23,0x33, + 0x4,0x23,0x4f, 0x1,0x4c,0x3e, 0x3,0x27,0x6b, 0x1,0x4c,0x3d, + 0x1,0x4c,0x3f, 0x3,0x2b,0x50, 0x3,0x2b,0x4f, 0x1,0x50,0x35, + 0x3,0x2b,0x4e, 0x3,0x2b,0x4d, 0x6,0x35,0x78, 0x1,0x54,0x51, + 0x3,0x40,0x4b, 0x2,0x56,0x46, 0x1,0x76,0x3b, 0x1,0x44,0x47, + 0x1,0x46,0x2c, 0x1,0x46,0x3b, 0x1,0x46,0x36, 0x4,0x21,0x6c, + 0x1,0x46,0x31, 0x1,0x46,0x30, 0x1,0x46,0x37, 0x1,0x46,0x35, + 0x1,0x46,0x2e, 0x1,0x46,0x3c, 0x1,0x46,0x2f, 0x1,0x46,0x2b, + 0x1,0x46,0x3a, 0x1,0x46,0x39, 0x1,0x46,0x38, 0x1,0x46,0x2d, + 0x3,0x22,0x31, 0x1,0x46,0x34, 0x3,0x22,0x2d, 0x3,0x22,0x2e, + 0x1,0x46,0x33, 0x3,0x22,0x2f, 0xf,0x21,0x50, 0x1,0x46,0x3d, + 0x1,0x46,0x32, 0x4,0x21,0x6a, 0x3,0x23,0x35, 0x3,0x23,0x37, + 0x1,0x47,0x54, 0x4,0x22,0x4c, 0x1,0x47,0x5a, 0x1,0x47,0x56, + 0x3,0x23,0x39, 0x1,0x47,0x5c, 0x2,0x22,0x25, 0x1,0x47,0x59, + 0x1,0x47,0x4f, 0x1,0x47,0x52, 0x1,0x47,0x55, 0x1,0x47,0x51, + 0x1,0x47,0x58, 0x1,0x47,0x5b, 0x1,0x47,0x50, 0x1,0x47,0x53, + 0x1,0x47,0x57, 0x1,0x47,0x5d, 0x3,0x23,0x3a, 0x3,0x23,0x3b, + 0x3,0x23,0x34, 0x2,0x23,0x40, 0x2,0x23,0x3d, 0x3,0x24,0x76, + 0x1,0x49,0x49, 0x2,0x23,0x3e, 0x1,0x49,0x3d, 0x1,0x49,0x3f, + 0x1,0x49,0x57, 0x1,0x49,0x52, 0x3,0x24,0x79, 0x3,0x24,0x7e, + 0x3,0x24,0x75, 0x2,0x23,0x45, 0x2,0x23,0x3f, 0x1,0x49,0x41, + 0x1,0x49,0x43, 0x2,0x23,0x44, 0x1,0x49,0x4a, 0x2,0x23,0x3a, + 0x1,0x49,0x56, 0x1,0x49,0x58, 0x1,0x49,0x3e, 0x1,0x49,0x4f, + 0x3,0x25,0x24, 0x2,0x23,0x38, 0x1,0x49,0x55, 0x3,0x24,0x77, + 0x1,0x49,0x46, 0x3,0x24,0x7b, 0x1,0x49,0x50, 0x1,0x49,0x51, + 0x2,0x23,0x39, 0x1,0x49,0x4e, 0x1,0x49,0x4c, 0x3,0x24,0x70, + 0x1,0x49,0x4d, 0x1,0x49,0x53, 0x2,0x23,0x41, 0x1,0x49,0x40, + 0x3,0x25,0x21, 0x1,0x49,0x54, 0x2,0x23,0x43, 0x1,0x49,0x48, + 0x1,0x49,0x45, 0x3,0x24,0x73, 0x2,0x23,0x3c, 0x1,0x49,0x44, + 0x2,0x23,0x46, 0x1,0x49,0x47, 0x3,0x24,0x7c, 0x1,0x49,0x4b, + 0x3,0x24,0x78, 0x3,0x24,0x74, 0x3,0x24,0x6d, 0x1,0x49,0x42, + 0x2,0x23,0x42, 0x3,0x24,0x7d, 0x3,0x25,0x22, 0x2,0x23,0x3b, + 0x3,0x25,0x23, 0x4,0x25,0x64, 0x4,0x25,0x63, 0x3,0x27,0x6e, + 0x2,0x25,0x6b, 0x2,0x25,0x6a, 0x1,0x4c,0x51, 0x2,0x25,0x6d, + 0x2,0x25,0x6f, 0x2,0x25,0x64, 0x2,0x25,0x67, 0x2,0x25,0x6e, + 0x1,0x4c,0x52, 0x3,0x27,0x74, 0x3,0x27,0x78, 0x2,0x25,0x61, + 0x2,0x25,0x65, 0x3,0x27,0x75, 0x4,0x25,0x5f, 0x2,0x25,0x69, + 0x2,0x29,0x4a, 0x1,0x4c,0x4d, 0x2,0x29,0x4e, 0x1,0x4c,0x40, + 0x2,0x25,0x66, 0x1,0x4c,0x41, 0x1,0x4c,0x4e, 0x1,0x4c,0x47, + 0x1,0x4c,0x43, 0x3,0x27,0x71, 0x2,0x25,0x62, 0x1,0x4c,0x46, + 0x1,0x4c,0x4b, 0x1,0x4c,0x54, 0x2,0x25,0x63, 0x2,0x25,0x5c, + 0x1,0x4c,0x45, 0x2,0x25,0x5d, 0x2,0x25,0x5f, 0x4,0x25,0x60, + 0x1,0x4c,0x48, 0x3,0x27,0x6c, 0x1,0x4c,0x4a, 0x2,0x25,0x5b, + 0x2,0x25,0x60, 0x3,0x27,0x70, 0x3,0x27,0x79, 0x1,0x4c,0x53, + 0x1,0x4c,0x4f, 0x2,0x25,0x68, 0x1,0x4c,0x55, 0x3,0x27,0x73, + 0x1,0x4c,0x4c, 0x2,0x25,0x5e, 0x1,0x4c,0x49, 0x3,0x27,0x6f, + 0x3,0x27,0x77, 0x1,0x4c,0x44, 0x1,0x4c,0x42, 0x2,0x25,0x6c, + 0x1,0x4c,0x50, 0xf,0x25,0x71, 0x3,0x2b,0x5c, 0x3,0x2b,0x5d, + 0x2,0x29,0x49, 0x2,0x29,0x3d, 0x2,0x29,0x4c, 0x3,0x2b,0x57, + 0x3,0x2b,0x59, 0x2,0x29,0x3f, 0x1,0x50,0x3c, 0x1,0x50,0x4a, + 0x1,0x50,0x38, 0x1,0x50,0x49, 0x1,0x50,0x41, 0x1,0x50,0x46, + 0x1,0x50,0x36, 0x2,0x29,0x3e, 0x2,0x29,0x44, 0x1,0x50,0x45, + 0x2,0x29,0x50, 0x1,0x50,0x47, 0x3,0x2b,0x5b, 0x1,0x50,0x3d, + 0x3,0x2b,0x54, 0x3,0x2b,0x5e, 0x2,0x29,0x46, 0x2,0x29,0x43, + 0x1,0x50,0x3b, 0x3,0x2b,0x51, 0x2,0x29,0x3c, 0x1,0x50,0x48, + 0x2,0x29,0x4b, 0x1,0x50,0x40, 0x2,0x29,0x4d, 0x1,0x50,0x4b, + 0x1,0x50,0x37, 0x1,0x50,0x42, 0x1,0x50,0x3f, 0x2,0x29,0x41, + 0x1,0x50,0x43, 0x2,0x29,0x47, 0x2,0x29,0x48, 0x1,0x50,0x3e, + 0x1,0x50,0x44, 0x1,0x50,0x3a, 0x3,0x2b,0x55, 0x3,0x64,0x54, + 0x3,0x2b,0x63, 0x3,0x2b,0x61, 0x1,0x50,0x39, 0x2,0x29,0x40, + 0x3,0x2b,0x53, 0x2,0x29,0x45, 0x3,0x2b,0x58, 0x2,0x29,0x4f, + 0x2,0x2e,0x46, 0x1,0x54,0x5e, 0x2,0x2e,0x34, 0x4,0x2c,0x2d, + 0x2,0x2e,0x39, 0x1,0x54,0x57, 0x1,0x54,0x62, 0x2,0x2e,0x37, + 0x1,0x54,0x52, 0x1,0x54,0x5c, 0x1,0x54,0x61, 0x2,0x2e,0x3e, + 0x4,0x2c,0x26, 0x1,0x54,0x5d, 0x1,0x54,0x60, 0x3,0x2f,0x77, + 0x3,0x30,0x21, 0x2,0x2e,0x41, 0x1,0x54,0x58, 0x2,0x2e,0x38, + 0x3,0x2f,0x74, 0x3,0x2f,0x78, 0x3,0x30,0x22, 0x2,0x2e,0x44, + 0x2,0x2e,0x45, 0x3,0x2f,0x79, 0x1,0x54,0x5a, 0x2,0x2e,0x43, + 0x1,0x54,0x56, 0x1,0x54,0x65, 0x4,0x2c,0x29, 0x2,0x2e,0x3b, + 0x3,0x2f,0x7b, 0x1,0x54,0x54, 0x3,0x2f,0x7a, 0x2,0x2e,0x48, + 0x2,0x2e,0x3c, 0x2,0x2e,0x40, 0x1,0x54,0x59, 0x1,0x54,0x64, + 0x2,0x2e,0x3d, 0x1,0x54,0x5f, 0x2,0x2e,0x42, 0x2,0x2e,0x49, + 0x2,0x34,0x24, 0x3,0x2f,0x73, 0x2,0x2e,0x47, 0x1,0x54,0x66, + 0x1,0x54,0x53, 0x2,0x2e,0x3f, 0x2,0x2e,0x36, 0x3,0x2f,0x76, + 0x1,0x54,0x5b, 0x4,0x2c,0x28, 0x4,0x2c,0x2e, 0x2,0x2e,0x35, + 0x3,0x2f,0x7e, 0x3,0x30,0x25, 0x2,0x2e,0x3a, 0xf,0x29,0x54, + 0xf,0x2e,0x42, 0xf,0x2e,0x4a, 0x2,0x2e,0x33, 0x1,0x54,0x63, + 0x3,0x67,0x21, 0x3,0x34,0x5f, 0x2,0x33,0x7a, 0x3,0x34,0x68, + 0x1,0x59,0x49, 0x2,0x34,0x2a, 0x1,0x59,0x47, 0x1,0x59,0x44, + 0x2,0x34,0x21, 0x1,0x59,0x40, 0x2,0x34,0x25, 0x1,0x59,0x4b, + 0x2,0x33,0x79, 0x2,0x33,0x7e, 0x2,0x33,0x7d, 0x1,0x54,0x55, + 0x1,0x59,0x46, 0x2,0x34,0x28, 0x3,0x34,0x66, 0x2,0x34,0x2b, + 0x2,0x33,0x76, 0x4,0x30,0x77, 0x1,0x5e,0x4e, 0x3,0x34,0x67, + 0x2,0x34,0x2c, 0x1,0x59,0x4c, 0x4,0x30,0x72, 0x1,0x59,0x3e, + 0x1,0x59,0x3b, 0x2,0x34,0x23, 0x1,0x59,0x38, 0x4,0x30,0x74, + 0x2,0x34,0x29, 0x3,0x34,0x5b, 0x1,0x59,0x3f, 0x2,0x34,0x2d, + 0x3,0x34,0x58, 0x2,0x33,0x77, 0x2,0x34,0x27, 0x1,0x59,0x42, + 0x2,0x33,0x78, 0x2,0x33,0x7b, 0x2,0x34,0x22, 0x3,0x34,0x62, + 0x3,0x34,0x61, 0x1,0x59,0x43, 0x1,0x59,0x41, 0x1,0x59,0x4d, + 0x3,0x34,0x57, 0x3,0x3a,0x36, 0x3,0x34,0x64, 0x4,0x30,0x6b, + 0x1,0x59,0x48, 0x3,0x34,0x5e, 0x1,0x59,0x3c, 0x1,0x5a,0x76, + 0x4,0x30,0x7a, 0x1,0x59,0x3d, 0x2,0x33,0x7c, 0x1,0x59,0x4a, + 0x1,0x59,0x45, 0x2,0x34,0x26, 0x1,0x59,0x3a, 0x3,0x34,0x59, + 0x1,0x59,0x39, 0x3,0x64,0x57, 0x3,0x64,0x56, 0x3,0x67,0x22, + 0x3,0x64,0x55, 0x2,0x33,0x74, 0x2,0x33,0x75, 0x2,0x3a,0x4e, + 0x3,0x3a,0x3c, 0x1,0x5e,0x3d, 0x1,0x5e,0x40, 0x2,0x3a,0x59, + 0x1,0x5e,0x54, 0x2,0x3a,0x5c, 0x1,0x5e,0x3e, 0x2,0x3a,0x55, + 0x1,0x5e,0x44, 0x1,0x5e,0x4a, 0x1,0x61,0x43, 0x3,0x3a,0x31, + 0x3,0x3a,0x38, 0x1,0x5e,0x48, 0x2,0x3a,0x52, 0x1,0x5e,0x55, + 0x1,0x5e,0x41, 0x1,0x5e,0x49, 0x2,0x3a,0x5a, 0x2,0x41,0x7c, + 0x2,0x3a,0x5f, 0x2,0x3a,0x53, 0x4,0x36,0x5c, 0x2,0x3a,0x4a, + 0x2,0x3a,0x57, 0x2,0x3a,0x51, 0x1,0x5e,0x47, 0x2,0x3a,0x5d, + 0x3,0x3a,0x2e, 0x3,0x3a,0x2a, 0x1,0x5e,0x43, 0x1,0x5e,0x57, + 0x1,0x5e,0x50, 0x3,0x3a,0x33, 0x1,0x5e,0x45, 0x1,0x5e,0x42, + 0x3,0x3a,0x40, 0x1,0x5e,0x4d, 0x3,0x3a,0x34, 0x2,0x3a,0x5e, + 0x2,0x3a,0x50, 0x2,0x3a,0x56, 0x2,0x3a,0x58, 0x2,0x3a,0x4c, + 0x2,0x3a,0x5b, 0x1,0x5e,0x3f, 0x2,0x3a,0x4b, 0x3,0x3a,0x42, + 0x1,0x5e,0x46, 0x1,0x5e,0x56, 0x1,0x5e,0x52, 0x2,0x3a,0x4d, + 0x1,0x5e,0x4c, 0x3,0x3a,0x3b, 0xf,0x39,0x71, 0x1,0x5e,0x53, + 0x1,0x5e,0x4f, 0x1,0x5e,0x4b, 0x3,0x3a,0x2f, 0x2,0x3a,0x54, + 0x6,0x47,0x29, 0x3,0x67,0x23, 0x1,0x5e,0x51, 0x2,0x41,0x7a, + 0x2,0x41,0x76, 0x3,0x40,0x51, 0x2,0x42,0x27, 0x2,0x41,0x6f, + 0x2,0x41,0x78, 0x1,0x63,0x4c, 0x1,0x63,0x4d, 0x1,0x63,0x45, + 0x2,0x42,0x23, 0x1,0x63,0x4f, 0x2,0x41,0x74, 0x2,0x41,0x73, + 0x2,0x41,0x71, 0x2,0x42,0x25, 0x1,0x63,0x43, 0x2,0x41,0x7d, + 0x2,0x41,0x72, 0x1,0x63,0x46, 0x2,0x41,0x7b, 0x1,0x63,0x41, + 0x2,0x41,0x77, 0x2,0x41,0x7e, 0x2,0x42,0x22, 0x3,0x40,0x4e, + 0x4,0x3c,0x4b, 0x2,0x42,0x26, 0x1,0x63,0x4a, 0x2,0x41,0x70, + 0x1,0x63,0x44, 0x2,0x41,0x75, 0x3,0x3a,0x2b, 0x1,0x63,0x3f, + 0x6,0x51,0x43, 0x1,0x63,0x4b, 0x2,0x42,0x21, 0x1,0x63,0x47, + 0x1,0x63,0x48, 0x1,0x63,0x4e, 0x1,0x63,0x42, 0x1,0x23,0x21, + 0x1,0x63,0x40, 0x2,0x41,0x79, 0x3,0x40,0x4c, 0x3,0x67,0x25, + 0x1,0x63,0x49, 0x3,0x67,0x24, 0xf,0x40,0x62, 0x2,0x42,0x24, + 0x3,0x64,0x58, 0x1,0x68,0x35, 0x1,0x68,0x30, 0x3,0x46,0x2e, + 0x2,0x49,0x3c, 0x2,0x49,0x38, 0x3,0x46,0x28, 0x2,0x49,0x32, + 0x1,0x68,0x2a, 0x1,0x68,0x26, 0x2,0x49,0x3b, 0x1,0x68,0x27, + 0x2,0x49,0x35, 0x2,0x49,0x37, 0x3,0x46,0x29, 0x2,0x49,0x3a, + 0x3,0x46,0x36, 0x1,0x68,0x2c, 0x3,0x46,0x2c, 0x1,0x68,0x33, + 0x1,0x68,0x2d, 0x4,0x42,0x57, 0x3,0x46,0x2a, 0x2,0x49,0x30, + 0x1,0x68,0x2e, 0x1,0x68,0x2f, 0x2,0x49,0x33, 0x1,0x68,0x34, + 0x3,0x46,0x34, 0x2,0x49,0x31, 0x2,0x49,0x36, 0x1,0x68,0x2b, + 0x2,0x49,0x2f, 0x1,0x68,0x31, 0x1,0x68,0x29, 0x3,0x46,0x33, + 0x4,0x42,0x4b, 0x1,0x68,0x28, 0x2,0x49,0x34, 0x2,0x49,0x39, + 0x3,0x46,0x31, 0x1,0x68,0x32, 0x3,0x64,0x5a, 0x3,0x64,0x59, + 0x3,0x46,0x50, 0x2,0x49,0x2e, 0x3,0x46,0x30, 0x1,0x6c,0x37, + 0x2,0x4f,0x6e, 0x3,0x4b,0x41, 0x2,0x4f,0x6b, 0x3,0x4b,0x38, + 0x1,0x6c,0x31, 0x1,0x6c,0x3d, 0x1,0x6c,0x3e, 0x3,0x4b,0x3d, + 0x1,0x6c,0x34, 0x2,0x4f,0x69, 0x1,0x6c,0x36, 0x2,0x4f,0x61, + 0x1,0x6c,0x3c, 0x3,0x4b,0x44, 0x2,0x4f,0x6d, 0x1,0x6c,0x33, + 0x2,0x4f,0x6f, 0x1,0x6c,0x32, 0x4,0x49,0x31, 0x2,0x4f,0x6a, + 0x2,0x4f,0x6c, 0x1,0x6c,0x35, 0x2,0x4f,0x68, 0x2,0x4f,0x62, + 0x2,0x4f,0x5f, 0x4,0x49,0x2e, 0x3,0x4b,0x3e, 0x2,0x3a,0x4f, + 0x2,0x4f,0x65, 0x3,0x4b,0x37, 0x2,0x4f,0x5e, 0x2,0x4f,0x64, + 0x2,0x4f,0x63, 0x3,0x4b,0x3b, 0x2,0x4f,0x60, 0x3,0x4b,0x43, + 0x1,0x6c,0x39, 0x3,0x4b,0x45, 0x3,0x4b,0x40, 0x3,0x46,0x35, + 0x3,0x4b,0x3c, 0x1,0x6c,0x38, 0x3,0x4b,0x39, 0x7,0x21,0x63, + 0x3,0x4b,0x3f, 0x1,0x6c,0x3a, 0x2,0x4f,0x66, 0x1,0x70,0x3b, + 0x2,0x4f,0x67, 0x2,0x56,0x4f, 0x3,0x50,0x3f, 0x2,0x56,0x48, + 0x3,0x50,0x40, 0x1,0x70,0x47, 0x2,0x56,0x4c, 0x1,0x70,0x3f, + 0x1,0x70,0x43, 0x2,0x56,0x4b, 0x3,0x50,0x3b, 0x1,0x70,0x42, + 0x1,0x70,0x3e, 0x1,0x70,0x41, 0x1,0x70,0x3c, 0x1,0x70,0x46, + 0x2,0x56,0x4d, 0x2,0x56,0x49, 0x1,0x70,0x45, 0x2,0x56,0x47, + 0x1,0x70,0x44, 0x2,0x56,0x4e, 0x2,0x56,0x4a, 0x1,0x6c,0x3b, + 0x4,0x4f,0x71, 0x1,0x70,0x48, 0x2,0x56,0x50, 0x1,0x70,0x40, + 0x1,0x70,0x3d, 0xf,0x53,0x5d, 0x3,0x50,0x3d, 0x3,0x54,0x48, + 0x2,0x5c,0x52, 0x2,0x5c,0x54, 0x1,0x73,0x46, 0x2,0x5c,0x55, + 0x2,0x5c,0x53, 0x2,0x5c,0x51, 0x2,0x5c,0x50, 0x1,0x73,0x48, + 0x2,0x5c,0x4f, 0x1,0x73,0x49, 0x4,0x55,0x74, 0x3,0x54,0x49, + 0x3,0x54,0x47, 0x4,0x55,0x78, 0x2,0x5c,0x4d, 0x2,0x5c,0x4e, + 0x1,0x73,0x45, 0x1,0x73,0x4a, 0x1,0x73,0x47, 0x3,0x64,0x5d, + 0x3,0x64,0x5b, 0x2,0x5c,0x4c, 0x3,0x57,0x5b, 0x1,0x76,0x3c, + 0x3,0x57,0x5a, 0x2,0x61,0x48, 0x2,0x61,0x46, 0x2,0x61,0x4b, + 0x2,0x61,0x49, 0x3,0x57,0x58, 0x2,0x61,0x47, 0x2,0x61,0x4a, + 0x3,0x57,0x59, 0x3,0x57,0x57, 0x3,0x57,0x5c, 0x1,0x78,0x2c, + 0x2,0x65,0x3e, 0x2,0x65,0x3f, 0x1,0x78,0x2d, 0x4,0x5f,0x4d, + 0x2,0x65,0x40, 0x2,0x65,0x3c, 0x2,0x65,0x41, 0x2,0x65,0x3d, + 0x1,0x76,0x3d, 0x3,0x5a,0x2d, 0x3,0x64,0x5e, 0x4,0x63,0x31, + 0x2,0x68,0x6b, 0x2,0x68,0x6d, 0x1,0x79,0x64, 0x2,0x68,0x6c, + 0x1,0x79,0x63, 0x1,0x79,0x62, 0x3,0x67,0x26, 0x3,0x67,0x27, + 0x3,0x64,0x5c, 0x3,0x5e,0x26, 0x1,0x79,0x65, 0x2,0x6b,0x53, + 0x2,0x6b,0x54, 0x4,0x66,0x34, 0x1,0x7a,0x65, 0x1,0x7a,0x64, + 0x1,0x7a,0x66, 0x2,0x6b,0x52, 0x3,0x67,0x28, 0x2,0x6d,0x46, + 0x2,0x6d,0x45, 0x3,0x5f,0x40, 0x1,0x7b,0x59, 0x1,0x7b,0x5b, + 0x1,0x7b,0x5a, 0x2,0x6d,0x47, 0x1,0x7c,0x34, 0x2,0x70,0x34, + 0x4,0x6a,0x44, 0x4,0x6a,0x43, 0x1,0x7c,0x5d, 0x3,0x60,0x71, + 0x2,0x70,0x33, 0x2,0x70,0x7c, 0x2,0x21,0x2a, 0x3,0x21,0x77, + 0x4,0x21,0x6f, 0x1,0x46,0x3f, 0x1,0x46,0x3e, 0x4,0x21,0x6d, + 0x1,0x47,0x60, 0x1,0x47,0x5f, 0x2,0x22,0x27, 0x1,0x47,0x5e, + 0x2,0x22,0x26, 0x3,0x23,0x3e, 0x1,0x49,0x5b, 0x2,0x23,0x49, + 0x3,0x25,0x2c, 0x2,0x23,0x48, 0xf,0x23,0x50, 0x3,0x25,0x26, + 0x1,0x49,0x59, 0x1,0x49,0x5c, 0x3,0x25,0x2b, 0x3,0x25,0x2a, + 0x2,0x23,0x47, 0x3,0x25,0x29, 0x1,0x49,0x5a, 0x3,0x25,0x48, + 0x3,0x25,0x27, 0x3,0x25,0x28, 0x3,0x28,0x22, 0x2,0x25,0x70, + 0x3,0x27,0x7d, 0x2,0x25,0x71, 0x1,0x4c,0x56, 0x3,0x27,0x7c, + 0x3,0x28,0x21, 0x3,0x27,0x7b, 0x1,0x50,0x4c, 0x3,0x2b,0x65, + 0x2,0x2e,0x4a, 0x2,0x2e,0x4b, 0x1,0x54,0x67, 0x1,0x54,0x68, + 0x3,0x30,0x27, 0x2,0x34,0x2f, 0x1,0x59,0x4e, 0x1,0x59,0x50, + 0x2,0x34,0x2e, 0x1,0x59,0x4f, 0x2,0x3a,0x60, 0x1,0x5e,0x58, + 0x3,0x3a,0x44, 0x3,0x3a,0x43, 0x4,0x36,0x68, 0x4,0x3c,0x52, + 0x1,0x63,0x50, 0x1,0x63,0x51, 0x2,0x42,0x28, 0x3,0x40,0x52, + 0x1,0x68,0x37, 0x3,0x46,0x37, 0x1,0x68,0x36, 0x2,0x4f,0x70, + 0x2,0x56,0x52, 0x2,0x56,0x51, 0x3,0x5f,0x41, 0x2,0x71,0x5a, + 0x1,0x44,0x48, 0x2,0x21,0x39, 0x3,0x21,0x61, 0x2,0x21,0x4f, + 0x2,0x21,0x50, 0x3,0x22,0x34, 0x4,0x21,0x70, 0x4,0x21,0x71, + 0x1,0x47,0x63, 0x1,0x47,0x67, 0x2,0x22,0x29, 0x4,0x22,0x51, + 0x1,0x47,0x65, 0x1,0x47,0x64, 0x2,0x22,0x28, 0x1,0x47,0x66, + 0x1,0x47,0x62, 0x3,0x23,0x41, 0x3,0x23,0x42, 0x1,0x47,0x61, + 0x2,0x22,0x2a, 0x3,0x23,0x3f, 0x3,0x23,0x40, 0x1,0x49,0x66, + 0x3,0x25,0x31, 0x3,0x25,0x3e, 0x1,0x49,0x63, 0x3,0x25,0x30, + 0x1,0x49,0x5f, 0x2,0x23,0x4a, 0x3,0x25,0x40, 0x3,0x25,0x36, + 0x3,0x25,0x2f, 0x2,0x23,0x4b, 0x3,0x25,0x3c, 0x1,0x49,0x61, + 0x3,0x25,0x2d, 0x2,0x23,0x4d, 0x1,0x49,0x5d, 0x2,0x23,0x4e, + 0x2,0x23,0x4c, 0x1,0x49,0x60, 0x1,0x49,0x62, 0x1,0x49,0x65, + 0x1,0x49,0x64, 0x1,0x49,0x5e, 0x2,0x23,0x4f, 0x3,0x25,0x32, + 0x3,0x25,0x41, 0x3,0x25,0x42, 0x3,0x25,0x33, 0x3,0x25,0x38, + 0x3,0x25,0x37, 0x3,0x64,0x5f, 0xf,0x23,0x52, 0x3,0x25,0x35, + 0x1,0x4c,0x5b, 0x2,0x25,0x7e, 0x3,0x28,0x25, 0x1,0x4c,0x5d, + 0x3,0x28,0x23, 0x1,0x4c,0x5c, 0x3,0x28,0x26, 0x2,0x26,0x21, + 0x1,0x4c,0x5a, 0x1,0x4c,0x59, 0x2,0x25,0x75, 0x4,0x25,0x69, + 0x2,0x25,0x74, 0x3,0x28,0x28, 0x2,0x25,0x72, 0x2,0x25,0x77, + 0x2,0x25,0x76, 0x2,0x25,0x73, 0x2,0x25,0x7c, 0x2,0x25,0x7d, + 0x2,0x25,0x7a, 0x2,0x25,0x78, 0x1,0x4c,0x58, 0x3,0x28,0x29, + 0x4,0x25,0x66, 0x4,0x25,0x68, 0x2,0x25,0x7b, 0x1,0x4c,0x5e, + 0x2,0x26,0x22, 0x4,0x25,0x65, 0x3,0x28,0x2a, 0x2,0x25,0x79, + 0x3,0x28,0x24, 0x1,0x50,0x4d, 0x1,0x4c,0x57, 0x4,0x25,0x6e, + 0xf,0x26,0x33, 0x3,0x64,0x60, 0x1,0x50,0x4e, 0x2,0x29,0x55, + 0x3,0x2b,0x69, 0x3,0x2b,0x68, 0x2,0x29,0x5b, 0x3,0x2b,0x6c, + 0x3,0x2b,0x67, 0x3,0x2b,0x6a, 0x1,0x50,0x54, 0x2,0x29,0x59, + 0x2,0x29,0x5f, 0x3,0x2b,0x71, 0x2,0x29,0x56, 0x2,0x29,0x5a, + 0x2,0x29,0x5c, 0x2,0x29,0x5e, 0x2,0x29,0x58, 0x3,0x2b,0x70, + 0x2,0x29,0x57, 0x2,0x29,0x52, 0x2,0x29,0x53, 0x1,0x50,0x4f, + 0x3,0x2b,0x6b, 0x1,0x50,0x51, 0x1,0x50,0x50, 0x2,0x29,0x54, + 0x2,0x29,0x5d, 0x3,0x2b,0x6d, 0x3,0x2b,0x72, 0x3,0x2b,0x6e, + 0x4,0x28,0x60, 0xf,0x29,0x6a, 0xf,0x29,0x71, 0x3,0x2b,0x66, + 0x1,0x50,0x53, 0x4,0x28,0x5e, 0x2,0x29,0x51, 0x2,0x2e,0x55, + 0x3,0x30,0x2a, 0x2,0x2e,0x54, 0x2,0x2e,0x59, 0x2,0x2e,0x50, + 0x3,0x30,0x30, 0x2,0x2e,0x53, 0x2,0x2e,0x52, 0x3,0x30,0x2f, + 0x2,0x2e,0x56, 0x3,0x30,0x38, 0x2,0x2e,0x5a, 0x1,0x54,0x69, + 0x1,0x54,0x6c, 0x3,0x30,0x34, 0x3,0x30,0x35, 0x2,0x2e,0x51, + 0x2,0x2e,0x57, 0x3,0x30,0x33, 0x3,0x30,0x28, 0x3,0x30,0x37, + 0x1,0x54,0x6b, 0x2,0x2e,0x4c, 0x3,0x30,0x2b, 0x1,0x50,0x52, + 0x2,0x34,0x3d, 0x2,0x2e,0x58, 0x3,0x30,0x36, 0x2,0x2e,0x4f, + 0x4,0x2c,0x33, 0x1,0x54,0x6a, 0x2,0x2e,0x4e, 0xf,0x2e,0x5c, + 0x3,0x30,0x32, 0x2,0x34,0x34, 0x3,0x34,0x6e, 0x3,0x34,0x71, + 0x1,0x59,0x51, 0x1,0x59,0x55, 0x2,0x34,0x44, 0x2,0x34,0x32, + 0x2,0x34,0x40, 0x1,0x59,0x56, 0x2,0x34,0x42, 0x3,0x34,0x72, + 0x2,0x34,0x48, 0x3,0x34,0x74, 0x2,0x34,0x4c, 0x3,0x34,0x69, + 0x4,0x30,0x7b, 0x2,0x34,0x43, 0x2,0x34,0x37, 0x2,0x34,0x3f, + 0x3,0x34,0x6b, 0x2,0x34,0x4d, 0x2,0x34,0x4b, 0x2,0x34,0x41, + 0x2,0x34,0x3c, 0x2,0x34,0x35, 0x2,0x3a,0x68, 0x2,0x34,0x33, + 0x1,0x59,0x5a, 0x2,0x34,0x3a, 0x1,0x59,0x5b, 0x1,0x59,0x57, + 0x2,0x34,0x30, 0x2,0x34,0x46, 0x2,0x34,0x38, 0x3,0x34,0x6f, + 0x3,0x34,0x75, 0x2,0x34,0x36, 0x2,0x34,0x49, 0x1,0x59,0x58, + 0x3,0x34,0x76, 0x2,0x34,0x4f, 0x1,0x59,0x52, 0x1,0x59,0x54, + 0x2,0x34,0x3e, 0x2,0x34,0x39, 0x1,0x54,0x6d, 0x1,0x59,0x53, + 0x2,0x34,0x3b, 0x2,0x34,0x4a, 0x2,0x34,0x4e, 0x2,0x34,0x45, + 0x3,0x64,0x61, 0x2,0x34,0x47, 0x3,0x64,0x62, 0x3,0x64,0x63, + 0x2,0x34,0x31, 0x4,0x36,0x69, 0x3,0x3a,0x4a, 0x2,0x3a,0x63, + 0x3,0x3a,0x45, 0x2,0x3a,0x6c, 0x2,0x3a,0x6b, 0x1,0x5e,0x60, + 0x2,0x3a,0x64, 0x3,0x3a,0x47, 0x1,0x5e,0x61, 0x1,0x5e,0x5f, + 0x3,0x3a,0x50, 0x2,0x3a,0x66, 0x1,0x5e,0x5c, 0x2,0x3a,0x6a, + 0x3,0x3a,0x4c, 0x2,0x3a,0x65, 0x2,0x3a,0x67, 0x2,0x3a,0x61, + 0x1,0x5e,0x5a, 0x4,0x36,0x6f, 0x2,0x3a,0x74, 0x2,0x3a,0x73, + 0x2,0x3a,0x70, 0x1,0x5e,0x59, 0x1,0x5e,0x5d, 0x1,0x5e,0x5e, + 0x2,0x2e,0x4d, 0x2,0x3a,0x6d, 0x1,0x5e,0x5b, 0x1,0x59,0x59, + 0x2,0x3a,0x6f, 0x2,0x3a,0x62, 0x2,0x3a,0x72, 0x2,0x3a,0x71, + 0x3,0x3a,0x4e, 0x2,0x3a,0x75, 0x3,0x3a,0x49, 0x2,0x42,0x36, + 0x3,0x3a,0x4b, 0x2,0x3a,0x6e, 0xf,0x39,0x7d, 0xf,0x39,0x7e, + 0x4,0x3c,0x57, 0x4,0x36,0x6d, 0x4,0x36,0x71, 0x3,0x64,0x64, + 0x2,0x3a,0x69, 0x2,0x42,0x2e, 0x1,0x63,0x5b, 0x1,0x63,0x5e, + 0x1,0x63,0x59, 0x2,0x42,0x2d, 0x2,0x42,0x31, 0x2,0x42,0x2c, + 0x3,0x40,0x57, 0x1,0x63,0x53, 0x1,0x63,0x5d, 0x2,0x42,0x29, + 0x1,0x63,0x57, 0x2,0x42,0x30, 0x3,0x40,0x5b, 0x1,0x63,0x55, + 0x1,0x63,0x54, 0x2,0x42,0x33, 0x1,0x63,0x56, 0x2,0x42,0x35, + 0x3,0x40,0x56, 0x2,0x42,0x32, 0x1,0x63,0x52, 0x3,0x40,0x5e, + 0x3,0x40,0x5c, 0x3,0x40,0x58, 0x1,0x63,0x5c, 0x2,0x42,0x37, + 0x2,0x42,0x2b, 0x2,0x42,0x34, 0x3,0x40,0x5d, 0x4,0x3c,0x53, + 0x2,0x42,0x2a, 0x3,0x40,0x5a, 0x3,0x40,0x59, 0x1,0x63,0x58, + 0x3,0x40,0x54, 0x1,0x63,0x5a, 0x2,0x42,0x2f, 0x2,0x42,0x38, + 0x3,0x46,0x43, 0x3,0x46,0x3e, 0x2,0x49,0x44, 0x1,0x68,0x38, + 0x2,0x49,0x4a, 0x3,0x46,0x42, 0x3,0x46,0x3c, 0x1,0x68,0x3d, + 0x2,0x49,0x46, 0x2,0x49,0x4d, 0x2,0x49,0x3e, 0x1,0x68,0x3f, + 0x1,0x68,0x39, 0x2,0x49,0x43, 0x1,0x6c,0x3f, 0x2,0x49,0x42, + 0x2,0x49,0x4b, 0x1,0x68,0x3a, 0x3,0x46,0x3d, 0x1,0x68,0x3e, + 0x2,0x49,0x41, 0x2,0x49,0x47, 0x2,0x49,0x4c, 0x2,0x49,0x3d, + 0x1,0x68,0x3c, 0x2,0x49,0x45, 0x3,0x46,0x3a, 0x3,0x46,0x45, + 0x2,0x49,0x49, 0x2,0x49,0x4f, 0x2,0x49,0x3f, 0x2,0x49,0x48, + 0x3,0x46,0x38, 0x1,0x68,0x3b, 0x2,0x49,0x4e, 0x3,0x46,0x41, + 0x3,0x46,0x44, 0x3,0x46,0x40, 0x2,0x49,0x40, 0x4,0x42,0x59, + 0x3,0x64,0x65, 0x1,0x6c,0x43, 0x2,0x4f,0x72, 0x1,0x6c,0x41, + 0x1,0x6c,0x40, 0x2,0x4f,0x74, 0x2,0x4f,0x79, 0x3,0x4b,0x46, + 0x2,0x4f,0x75, 0x3,0x4b,0x50, 0x2,0x4f,0x78, 0x1,0x6c,0x46, + 0x3,0x4b,0x51, 0x1,0x70,0x2e, 0x1,0x6c,0x45, 0x3,0x4b,0x4b, + 0x2,0x4f,0x71, 0x2,0x4f,0x77, 0x3,0x46,0x3f, 0x1,0x6c,0x44, + 0x2,0x4f,0x76, 0x3,0x4b,0x4d, 0x2,0x4f,0x73, 0x3,0x4b,0x49, + 0x1,0x6c,0x42, 0x3,0x4b,0x4f, 0x3,0x4b,0x4c, 0x3,0x4b,0x47, + 0x2,0x56,0x57, 0x3,0x50,0x4a, 0x2,0x56,0x59, 0x2,0x56,0x54, + 0x1,0x70,0x4a, 0x2,0x56,0x56, 0x3,0x50,0x4b, 0x1,0x70,0x49, + 0x2,0x56,0x58, 0x3,0x50,0x48, 0x3,0x50,0x4c, 0x1,0x70,0x4c, + 0x2,0x56,0x5a, 0x1,0x70,0x4b, 0x2,0x56,0x53, 0x2,0x56,0x55, + 0x3,0x50,0x49, 0x3,0x54,0x4b, 0x1,0x73,0x4e, 0x2,0x5c,0x58, + 0x3,0x54,0x4c, 0x1,0x73,0x4d, 0x2,0x5c,0x59, 0x1,0x73,0x4c, + 0x2,0x5c,0x57, 0x1,0x73,0x4b, 0x2,0x5c,0x56, 0x1,0x76,0x3f, + 0x1,0x76,0x3e, 0x2,0x65,0x42, 0x2,0x65,0x44, 0x3,0x5a,0x2f, + 0x2,0x65,0x43, 0x1,0x78,0x2e, 0x1,0x78,0x2f, 0x3,0x5a,0x2e, + 0x7,0x46,0x45, 0x1,0x78,0x30, 0x2,0x68,0x6e, 0x1,0x79,0x66, + 0x3,0x5e,0x28, 0x2,0x6f,0x22, 0x2,0x6f,0x21, 0x1,0x7c,0x5e, + 0x1,0x44,0x49, 0x1,0x45,0x31, 0x3,0x23,0x43, 0x1,0x49,0x67, + 0x3,0x25,0x45, 0x3,0x25,0x43, 0x3,0x25,0x44, 0x3,0x28,0x2d, + 0x2,0x29,0x60, 0x3,0x2b,0x77, 0x3,0x34,0x77, 0x1,0x5e,0x62, + 0x1,0x5e,0x63, 0x3,0x3a,0x52, 0x2,0x42,0x39, 0x1,0x68,0x40, + 0x2,0x49,0x50, 0x2,0x4f,0x7a, 0x3,0x64,0x66, 0x3,0x50,0x4d, + 0x3,0x21,0x39, 0x2,0x21,0x3a, 0x3,0x22,0x35, 0x3,0x23,0x44, + 0x2,0x23,0x50, 0x3,0x2b,0x7a, 0x3,0x2b,0x79, 0x3,0x21,0x3a, + 0x3,0x25,0x46, 0x2,0x26,0x23, 0x2,0x29,0x61, 0x2,0x2e,0x5b, + 0x1,0x54,0x6e, 0x3,0x46,0x46, 0x3,0x65,0x60, 0x2,0x65,0x45, + 0x4,0x5f,0x52, 0x1,0x7a,0x67, 0x1,0x44,0x4a, 0x1,0x46,0x40, + 0x2,0x21,0x51, 0x3,0x22,0x36, 0x1,0x47,0x68, 0x1,0x47,0x69, + 0x4,0x22,0x52, 0x1,0x4c,0x5f, 0x4,0x25,0x70, 0x3,0x34,0x79, + 0x1,0x59,0x5c, 0x5,0x37,0x3d, 0x1,0x68,0x42, 0x3,0x40,0x5f, + 0x1,0x68,0x43, 0x1,0x68,0x41, 0x3,0x4b,0x53, 0x1,0x44,0x4b, + 0x4,0x21,0x49, 0x1,0x45,0x32, 0x1,0x45,0x34, 0x1,0x45,0x33, + 0x2,0x21,0x3b, 0x1,0x45,0x35, 0x1,0x46,0x41, 0x2,0x21,0x52, + 0x3,0x22,0x38, 0x1,0x46,0x42, 0x3,0x22,0x37, 0x4,0x21,0x72, + 0x3,0x22,0x39, 0x4,0x22,0x53, 0x3,0x23,0x47, 0x1,0x47,0x6a, + 0x1,0x47,0x6b, 0x2,0x22,0x2b, 0x3,0x25,0x49, 0x1,0x49,0x68, + 0x4,0x23,0x62, 0x2,0x23,0x51, 0x4,0x25,0x75, 0x1,0x4c,0x63, + 0x2,0x26,0x24, 0x4,0x25,0x72, 0x1,0x4c,0x61, 0x1,0x4c,0x62, + 0x1,0x4c,0x60, 0x2,0x2e,0x5c, 0x3,0x28,0x2e, 0x3,0x28,0x2f, + 0x3,0x64,0x67, 0x1,0x50,0x58, 0x1,0x50,0x57, 0x1,0x50,0x59, + 0x1,0x50,0x56, 0x3,0x2b,0x7c, 0x2,0x29,0x62, 0x1,0x4c,0x64, + 0x1,0x50,0x55, 0x1,0x54,0x6f, 0x1,0x54,0x70, 0x4,0x2c,0x38, + 0x1,0x54,0x71, 0x3,0x34,0x7b, 0x2,0x34,0x50, 0x3,0x34,0x7c, + 0x3,0x34,0x7d, 0x4,0x31,0x26, 0x1,0x5e,0x64, 0x2,0x3a,0x76, + 0x1,0x59,0x5d, 0x3,0x3a,0x53, 0x3,0x3a,0x54, 0x4,0x36,0x79, + 0x3,0x40,0x60, 0x1,0x63,0x5f, 0x3,0x40,0x61, 0x1,0x68,0x45, + 0x1,0x68,0x44, 0x2,0x49,0x51, 0x3,0x46,0x48, 0x1,0x6c,0x47, + 0x1,0x70,0x4d, 0x4,0x4f,0x7b, 0x2,0x61,0x4c, 0x2,0x6d,0x48, + 0x2,0x6f,0x23, 0x1,0x44,0x4c, 0x1,0x46,0x43, 0x3,0x22,0x3b, + 0x1,0x46,0x44, 0x2,0x22,0x31, 0x1,0x47,0x6d, 0x1,0x47,0x70, + 0x3,0x23,0x4b, 0x2,0x22,0x2f, 0x2,0x22,0x2d, 0x1,0x47,0x6f, + 0x2,0x22,0x30, 0x2,0x22,0x32, 0x2,0x22,0x2c, 0x1,0x47,0x72, + 0x1,0x47,0x71, 0x1,0x47,0x6e, 0x1,0x47,0x6c, 0x2,0x22,0x2e, + 0x3,0x23,0x4d, 0x3,0x25,0x55, 0x1,0x49,0x73, 0x4,0x23,0x67, + 0x3,0x25,0x4c, 0x1,0x49,0x70, 0x2,0x23,0x56, 0x2,0x23,0x59, + 0x2,0x23,0x58, 0x4,0x23,0x69, 0x1,0x49,0x6a, 0x1,0x49,0x72, + 0x3,0x25,0x4b, 0x4,0x23,0x6a, 0x1,0x49,0x6f, 0x2,0x23,0x55, + 0x2,0x23,0x53, 0x1,0x49,0x6e, 0x3,0x25,0x56, 0x3,0x25,0x53, + 0x3,0x25,0x4e, 0x1,0x49,0x69, 0x1,0x49,0x6c, 0x3,0x25,0x51, + 0x2,0x23,0x54, 0x2,0x23,0x5b, 0x2,0x23,0x57, 0x1,0x49,0x6d, + 0x1,0x49,0x71, 0x1,0x49,0x74, 0x2,0x23,0x52, 0x2,0x23,0x5a, + 0x1,0x49,0x6b, 0x3,0x28,0x41, 0x3,0x28,0x33, 0x1,0x4c,0x69, + 0x1,0x4c,0x71, 0x3,0x28,0x38, 0x2,0x26,0x30, 0x2,0x26,0x29, + 0x1,0x4c,0x72, 0x2,0x26,0x34, 0x2,0x26,0x25, 0x2,0x26,0x2c, + 0x3,0x28,0x45, 0x3,0x28,0x40, 0x1,0x4c,0x68, 0x2,0x26,0x26, + 0x1,0x4c,0x66, 0x2,0x26,0x2d, 0x2,0x26,0x31, 0x1,0x4c,0x65, + 0x3,0x28,0x3d, 0x2,0x26,0x32, 0x2,0x26,0x2b, 0x3,0x28,0x37, + 0x2,0x26,0x2e, 0x3,0x28,0x35, 0x1,0x4c,0x74, 0x1,0x4c,0x6b, + 0x2,0x26,0x35, 0x2,0x26,0x33, 0x3,0x28,0x3f, 0x1,0x4c,0x70, + 0x1,0x4c,0x6e, 0x2,0x26,0x2a, 0x1,0x4c,0x6d, 0x2,0x26,0x28, + 0x2,0x26,0x27, 0x1,0x4c,0x6c, 0x1,0x4c,0x6a, 0x1,0x4c,0x73, + 0x1,0x4c,0x6f, 0x1,0x4c,0x67, 0x3,0x2c,0x26, 0x2,0x26,0x2f, + 0x3,0x28,0x46, 0x1,0x50,0x5b, 0x3,0x2c,0x2d, 0x1,0x50,0x62, + 0x2,0x29,0x70, 0x1,0x50,0x5a, 0x2,0x29,0x68, 0x2,0x29,0x64, + 0x3,0x2c,0x21, 0x2,0x29,0x74, 0x2,0x29,0x63, 0x3,0x2c,0x2c, + 0x1,0x50,0x5d, 0x2,0x29,0x6d, 0x1,0x50,0x60, 0x1,0x50,0x63, + 0x3,0x2c,0x2e, 0x1,0x50,0x5e, 0x2,0x29,0x71, 0x1,0x50,0x61, + 0x3,0x2c,0x23, 0x1,0x54,0x78, 0x2,0x29,0x77, 0x2,0x29,0x65, + 0x3,0x2c,0x24, 0x3,0x2c,0x25, 0x2,0x29,0x67, 0x2,0x29,0x6e, + 0x2,0x29,0x72, 0x2,0x29,0x76, 0x2,0x29,0x73, 0x2,0x29,0x6c, + 0x2,0x29,0x6f, 0x3,0x2c,0x2b, 0x3,0x2c,0x29, 0x2,0x29,0x69, + 0x1,0x50,0x65, 0x2,0x29,0x6b, 0x2,0x29,0x6a, 0x2,0x29,0x75, + 0x1,0x50,0x5c, 0x2,0x29,0x66, 0x1,0x50,0x64, 0x3,0x2c,0x2a, + 0x1,0x50,0x5f, 0x3,0x2c,0x28, 0x1,0x54,0x7e, 0x2,0x2e,0x64, + 0x3,0x30,0x40, 0x1,0x54,0x7d, 0x3,0x2c,0x27, 0x4,0x2c,0x40, + 0x2,0x2e,0x62, 0x4,0x2c,0x3e, 0x1,0x54,0x72, 0x3,0x30,0x4f, + 0x1,0x54,0x77, 0x3,0x30,0x4a, 0x2,0x2e,0x61, 0x2,0x2e,0x5e, + 0x2,0x2e,0x63, 0x1,0x54,0x73, 0x2,0x2e,0x5d, 0x3,0x30,0x4e, + 0x1,0x54,0x76, 0x1,0x54,0x74, 0x3,0x30,0x3e, 0x2,0x2e,0x65, + 0x1,0x54,0x75, 0x1,0x54,0x79, 0x3,0x30,0x3b, 0x3,0x30,0x45, + 0x1,0x54,0x7a, 0x3,0x30,0x48, 0x1,0x54,0x7c, 0x3,0x30,0x52, + 0x4,0x2c,0x39, 0x4,0x2c,0x3d, 0x1,0x54,0x7b, 0x3,0x30,0x3c, + 0x3,0x35,0x22, 0x3,0x35,0x38, 0x2,0x2e,0x5f, 0x2,0x2e,0x60, + 0x3,0x30,0x4d, 0x6,0x36,0x57, 0x3,0x30,0x4b, 0x2,0x2e,0x66, + 0x2,0x34,0x57, 0x1,0x59,0x5e, 0x2,0x3b,0x26, 0x2,0x34,0x56, + 0x2,0x34,0x69, 0x3,0x35,0x28, 0x3,0x35,0x24, 0x1,0x59,0x64, + 0x3,0x35,0x31, 0x2,0x34,0x67, 0x3,0x35,0x33, 0x1,0x59,0x63, + 0x1,0x59,0x5f, 0x2,0x34,0x70, 0x2,0x34,0x60, 0x2,0x34,0x63, + 0x3,0x35,0x2e, 0x1,0x59,0x67, 0x2,0x34,0x6d, 0x2,0x34,0x65, + 0x1,0x59,0x60, 0x1,0x59,0x68, 0x3,0x35,0x2a, 0x2,0x34,0x6a, + 0x2,0x34,0x68, 0x3,0x35,0x2f, 0x3,0x35,0x3b, 0x2,0x34,0x59, + 0x2,0x34,0x6e, 0x2,0x34,0x62, 0x2,0x34,0x5d, 0x3,0x35,0x3a, + 0x2,0x34,0x53, 0x2,0x34,0x6f, 0x2,0x34,0x5f, 0x2,0x34,0x52, + 0x3,0x35,0x39, 0x1,0x59,0x66, 0x2,0x34,0x64, 0x2,0x34,0x71, + 0x2,0x34,0x61, 0x2,0x34,0x55, 0x2,0x34,0x5a, 0x2,0x34,0x51, + 0x3,0x35,0x27, 0x1,0x59,0x65, 0x3,0x35,0x3c, 0x2,0x34,0x5e, + 0x2,0x34,0x5b, 0x1,0x59,0x61, 0x2,0x34,0x54, 0x3,0x35,0x30, + 0x2,0x34,0x6c, 0x1,0x59,0x62, 0x3,0x35,0x2b, 0x2,0x34,0x5c, + 0x2,0x34,0x58, 0x3,0x35,0x29, 0x3,0x35,0x34, 0x2,0x34,0x6b, + 0x3,0x35,0x32, 0xf,0x33,0x73, 0x3,0x35,0x37, 0x3,0x35,0x35, + 0x1,0x5e,0x65, 0x2,0x3a,0x7d, 0x3,0x3a,0x75, 0x2,0x3a,0x7a, + 0x2,0x3b,0x2d, 0x2,0x3b,0x21, 0x2,0x3b,0x2e, 0x3,0x3a,0x7c, + 0x1,0x5e,0x67, 0x3,0x3a,0x63, 0x3,0x3a,0x61, 0x3,0x3a,0x58, + 0x2,0x3b,0x2a, 0x2,0x3b,0x27, 0x3,0x3a,0x5b, 0x3,0x3a,0x77, + 0x3,0x3a,0x72, 0x3,0x3a,0x59, 0x3,0x3a,0x60, 0x2,0x3b,0x28, + 0x2,0x3b,0x2b, 0x2,0x3b,0x2f, 0x3,0x3a,0x7b, 0x2,0x34,0x66, + 0x2,0x3b,0x31, 0x2,0x42,0x4d, 0x3,0x3a,0x66, 0x1,0x5e,0x68, + 0x2,0x3b,0x32, 0x2,0x3a,0x78, 0x2,0x3b,0x24, 0x3,0x3a,0x62, + 0x2,0x3b,0x29, 0x3,0x3a,0x5c, 0x3,0x3a,0x5e, 0x1,0x5e,0x66, + 0x1,0x5e,0x69, 0x2,0x3b,0x30, 0x2,0x3b,0x33, 0x2,0x3a,0x7c, + 0x2,0x3a,0x79, 0x3,0x3a,0x73, 0x3,0x3a,0x5a, 0x2,0x3a,0x7b, + 0x3,0x3a,0x57, 0x3,0x3a,0x7a, 0x2,0x3b,0x22, 0x2,0x3a,0x7e, + 0x1,0x5e,0x6a, 0x3,0x3a,0x56, 0x2,0x3b,0x2c, 0x3,0x3a,0x79, + 0x3,0x3a,0x78, 0x2,0x3b,0x23, 0x2,0x3b,0x25, 0x2,0x3a,0x77, + 0x2,0x42,0x41, 0x2,0x42,0x3f, 0x1,0x63,0x68, 0x1,0x63,0x66, + 0x2,0x42,0x49, 0x2,0x42,0x40, 0x2,0x42,0x4a, 0x2,0x42,0x46, + 0x2,0x42,0x3e, 0x2,0x42,0x4c, 0x2,0x42,0x3d, 0x2,0x42,0x44, + 0x1,0x63,0x65, 0x1,0x63,0x64, 0x1,0x63,0x63, 0x2,0x42,0x42, + 0x2,0x42,0x47, 0x1,0x63,0x60, 0x1,0x63,0x67, 0x3,0x40,0x67, + 0x2,0x42,0x3b, 0x3,0x40,0x66, 0x2,0x42,0x45, 0x2,0x42,0x3a, + 0x2,0x42,0x43, 0x1,0x63,0x61, 0x2,0x42,0x48, 0x2,0x42,0x3c, + 0x1,0x63,0x62, 0x2,0x42,0x4b, 0x3,0x40,0x64, 0x3,0x3a,0x6b, + 0x3,0x40,0x6a, 0x3,0x64,0x68, 0x3,0x64,0x69, 0x2,0x49,0x55, + 0x1,0x68,0x4a, 0x1,0x68,0x49, 0x1,0x68,0x4b, 0x2,0x49,0x61, + 0x2,0x49,0x57, 0x2,0x49,0x5d, 0x2,0x49,0x52, 0x2,0x49,0x60, + 0x2,0x49,0x5f, 0x2,0x49,0x63, 0x2,0x49,0x5c, 0x1,0x68,0x46, + 0x2,0x49,0x5b, 0x1,0x68,0x4c, 0x3,0x46,0x4c, 0x2,0x49,0x54, + 0x1,0x68,0x47, 0x3,0x46,0x4a, 0x2,0x49,0x62, 0x1,0x68,0x48, + 0x2,0x49,0x56, 0x2,0x49,0x59, 0x2,0x49,0x5e, 0x2,0x49,0x58, + 0x2,0x49,0x53, 0x3,0x46,0x4f, 0x3,0x46,0x53, 0x2,0x49,0x5a, + 0x2,0x4f,0x7c, 0x1,0x6c,0x4b, 0x2,0x50,0x21, 0x2,0x4f,0x7e, + 0x2,0x50,0x23, 0x2,0x50,0x25, 0x3,0x4b,0x5c, 0x1,0x6c,0x49, + 0x3,0x4b,0x58, 0x2,0x4f,0x7d, 0x3,0x4b,0x54, 0x2,0x4f,0x7b, + 0x3,0x4b,0x5e, 0x2,0x50,0x26, 0x2,0x50,0x24, 0x2,0x50,0x22, + 0x3,0x4b,0x56, 0x2,0x50,0x28, 0x3,0x4b,0x5a, 0x2,0x50,0x27, + 0x1,0x6c,0x4d, 0x1,0x6c,0x48, 0x3,0x4b,0x5b, 0x1,0x6c,0x4a, + 0x1,0x6c,0x4c, 0x3,0x4b,0x5d, 0x3,0x4b,0x5f, 0x2,0x50,0x29, + 0x2,0x56,0x61, 0x3,0x50,0x50, 0x3,0x50,0x53, 0x2,0x56,0x60, + 0x2,0x56,0x5f, 0x3,0x50,0x51, 0x2,0x56,0x62, 0x2,0x56,0x5b, + 0x3,0x50,0x4f, 0x2,0x56,0x5c, 0x2,0x56,0x64, 0x2,0x56,0x5d, + 0x3,0x50,0x54, 0x1,0x70,0x4e, 0x2,0x56,0x66, 0x3,0x50,0x4e, + 0x2,0x56,0x65, 0x2,0x56,0x5e, 0x3,0x50,0x56, 0x2,0x5c,0x5d, + 0x1,0x73,0x51, 0x2,0x5c,0x5b, 0x2,0x5c,0x60, 0x2,0x5c,0x5f, + 0x2,0x56,0x63, 0x3,0x54,0x50, 0x1,0x73,0x50, 0x3,0x54,0x4e, + 0x2,0x5c,0x5e, 0x2,0x5c,0x5a, 0x2,0x5c,0x62, 0x2,0x5c,0x61, + 0x1,0x73,0x4f, 0x3,0x54,0x52, 0x2,0x5c,0x5c, 0x3,0x54,0x4f, + 0x1,0x70,0x4f, 0x3,0x54,0x51, 0x3,0x54,0x53, 0x1,0x76,0x40, + 0x3,0x5a,0x31, 0x3,0x57,0x61, 0x3,0x57,0x5e, 0x2,0x61,0x4d, + 0x2,0x65,0x46, 0x2,0x65,0x47, 0x2,0x65,0x48, 0x1,0x79,0x67, + 0x4,0x63,0x34, 0x3,0x5c,0x36, 0x1,0x79,0x68, 0x3,0x5c,0x39, + 0x2,0x68,0x6f, 0x3,0x5c,0x3a, 0x2,0x6b,0x56, 0x2,0x6b,0x55, + 0x3,0x5e,0x29, 0x3,0x5f,0x42, 0x2,0x6d,0x49, 0x2,0x6d,0x4a, + 0x2,0x6f,0x24, 0x2,0x70,0x35, 0x3,0x60,0x73, 0x1,0x44,0x4d, + 0x1,0x44,0x4e, 0x4,0x21,0x32, 0x1,0x44,0x4f, 0x1,0x45,0x36, + 0x1,0x46,0x45, 0x2,0x22,0x33, 0x1,0x47,0x73, 0x1,0x47,0x74, + 0x1,0x49,0x77, 0x1,0x49,0x78, 0x1,0x49,0x76, 0x1,0x49,0x75, + 0x1,0x4c,0x75, 0x3,0x28,0x48, 0x4,0x26,0x22, 0x2,0x26,0x36, + 0x1,0x4c,0x77, 0x1,0x4c,0x76, 0x2,0x26,0x37, 0x4,0x26,0x23, + 0x3,0x64,0x6a, 0x4,0x28,0x6e, 0x1,0x50,0x66, 0x3,0x2c,0x2f, + 0x1,0x55,0x21, 0x2,0x2e,0x67, 0x2,0x34,0x73, 0x4,0x31,0x2c, + 0x1,0x59,0x69, 0x1,0x5e,0x6c, 0x2,0x34,0x72, 0x1,0x5e,0x6b, + 0x3,0x40,0x71, 0x1,0x68,0x4d, 0x3,0x40,0x72, 0x2,0x49,0x64, + 0x1,0x70,0x50, 0x3,0x50,0x57, 0x1,0x73,0x52, 0x2,0x5c,0x63, + 0x3,0x5a,0x34, 0x1,0x79,0x69, 0x3,0x5c,0x3b, 0x1,0x7b,0x5c, + 0x3,0x21,0x3b, 0x2,0x21,0x53, 0x3,0x22,0x3d, 0x1,0x46,0x46, + 0x2,0x21,0x54, 0x1,0x47,0x77, 0x3,0x23,0x50, 0x1,0x47,0x75, + 0x1,0x47,0x76, 0x1,0x47,0x78, 0x4,0x23,0x6f, 0x1,0x49,0x7a, + 0x1,0x49,0x79, 0x3,0x25,0x5a, 0x2,0x23,0x5c, 0x1,0x49,0x7b, + 0x4,0x26,0x25, 0x2,0x23,0x5d, 0x2,0x26,0x38, 0x3,0x28,0x4c, + 0x2,0x26,0x39, 0x3,0x28,0x4a, 0x1,0x4c,0x78, 0x1,0x4c,0x7a, + 0x1,0x4c,0x7c, 0x1,0x4c,0x79, 0x1,0x4c,0x7d, 0x1,0x4c,0x7b, + 0x3,0x28,0x4e, 0x3,0x28,0x4b, 0x3,0x28,0x4d, 0x1,0x50,0x6a, + 0x1,0x50,0x67, 0x1,0x50,0x69, 0x1,0x50,0x6b, 0x1,0x50,0x68, + 0x2,0x2e,0x68, 0x2,0x29,0x78, 0xf,0x2a,0x39, 0x3,0x2c,0x32, + 0x2,0x2e,0x6a, 0x2,0x2e,0x69, 0x1,0x55,0x27, 0x4,0x2c,0x46, + 0x1,0x55,0x23, 0x4,0x2c,0x49, 0x6,0x36,0x66, 0x1,0x55,0x24, + 0x1,0x55,0x26, 0x1,0x55,0x28, 0x1,0x55,0x25, 0x3,0x30,0x57, + 0x1,0x55,0x2a, 0x1,0x55,0x29, 0x4,0x2c,0x48, 0x3,0x30,0x56, + 0x3,0x30,0x55, 0xf,0x2e,0x7e, 0x1,0x59,0x6e, 0x2,0x34,0x75, + 0x2,0x34,0x74, 0x1,0x59,0x6d, 0x3,0x35,0x41, 0x1,0x59,0x6c, + 0x1,0x59,0x6b, 0x1,0x59,0x6f, 0x1,0x59,0x6a, 0x3,0x35,0x3f, + 0x2,0x3b,0x39, 0x2,0x3b,0x36, 0x1,0x5e,0x6e, 0x2,0x3b,0x35, + 0x2,0x3b,0x3a, 0x4,0x37,0x24, 0x1,0x5e,0x70, 0x2,0x3b,0x38, + 0x1,0x5e,0x6d, 0x1,0x5e,0x6f, 0x2,0x3b,0x37, 0x3,0x3a,0x7e, + 0x2,0x42,0x4e, 0x3,0x40,0x74, 0x2,0x42,0x4f, 0x2,0x42,0x50, + 0x3,0x40,0x75, 0x3,0x40,0x76, 0x3,0x40,0x73, 0x4,0x3c,0x6e, + 0x1,0x68,0x4e, 0x1,0x68,0x56, 0x2,0x49,0x65, 0x1,0x68,0x50, + 0x1,0x68,0x54, 0x2,0x49,0x66, 0x1,0x68,0x55, 0x1,0x68,0x51, + 0x1,0x68,0x52, 0x1,0x68,0x4f, 0x1,0x68,0x53, 0x1,0x6c,0x50, + 0x2,0x3b,0x34, 0x1,0x6c,0x51, 0x1,0x6c,0x4f, 0x4,0x49,0x44, + 0x1,0x6c,0x4e, 0x2,0x56,0x67, 0x1,0x70,0x51, 0x2,0x5c,0x64, + 0x2,0x5c,0x65, 0x3,0x5a,0x35, 0x4,0x5f,0x55, 0x1,0x78,0x31, + 0x1,0x79,0x6a, 0x3,0x5e,0x2a, 0x1,0x44,0x50, 0x3,0x22,0x3e, + 0x1,0x47,0x79, 0x3,0x25,0x5e, 0x3,0x25,0x5c, 0x3,0x25,0x5d, + 0x3,0x28,0x50, 0x1,0x50,0x6c, 0x2,0x2e,0x6b, 0x1,0x55,0x2b, + 0x3,0x30,0x58, 0x3,0x30,0x59, 0x1,0x59,0x72, 0x1,0x59,0x71, + 0x1,0x59,0x70, 0x1,0x5e,0x71, 0x1,0x5e,0x72, 0x2,0x3b,0x3b, + 0x1,0x68,0x57, 0x1,0x70,0x52, 0x1,0x44,0x51, 0x2,0x21,0x3c, + 0x1,0x45,0x37, 0x2,0x21,0x55, 0x4,0x21,0x73, 0x3,0x22,0x3f, + 0x2,0x22,0x34, 0x1,0x47,0x7a, 0x4,0x22,0x5c, 0x3,0x23,0x52, + 0x3,0x28,0x51, 0x1,0x4c,0x7e, 0x3,0x2c,0x34, 0x3,0x3b,0x24, + 0x2,0x42,0x51, 0x3,0x40,0x78, 0x3,0x65,0x25, 0x1,0x44,0x52, + 0x4,0x21,0x4b, 0x1,0x45,0x38, 0x2,0x22,0x35, 0x2,0x23,0x5e, + 0x4,0x26,0x29, 0x2,0x23,0x5f, 0x3,0x25,0x5f, 0x1,0x49,0x7c, + 0xf,0x25,0x54, 0x3,0x2c,0x35, 0x2,0x3b,0x3c, 0x1,0x5e,0x73, + 0x2,0x42,0x52, 0x4,0x49,0x49, 0x3,0x54,0x54, 0x1,0x73,0x53, + 0x1,0x44,0x53, 0x1,0x44,0x67, 0x1,0x45,0x39, 0x2,0x21,0x56, + 0x1,0x46,0x47, 0x3,0x23,0x54, 0x1,0x4a,0x22, 0x1,0x4a,0x21, + 0x1,0x49,0x7d, 0x1,0x49,0x7e, 0x2,0x26,0x3a, 0x1,0x4d,0x22, + 0x1,0x4d,0x23, 0x2,0x26,0x3b, 0x1,0x4d,0x21, 0x3,0x28,0x54, + 0x3,0x28,0x55, 0x1,0x50,0x70, 0x2,0x29,0x79, 0x1,0x50,0x6f, + 0x1,0x50,0x6d, 0x1,0x50,0x6e, 0x1,0x55,0x2e, 0x1,0x55,0x2c, + 0x3,0x30,0x5a, 0x3,0x30,0x5b, 0x2,0x2e,0x6d, 0x1,0x55,0x2d, + 0x2,0x2e,0x6c, 0x3,0x64,0x6b, 0x1,0x55,0x22, 0x2,0x34,0x76, + 0x4,0x31,0x35, 0x3,0x35,0x43, 0x1,0x59,0x74, 0x1,0x59,0x75, + 0x3,0x3b,0x26, 0x3,0x3b,0x25, 0x1,0x59,0x73, 0x3,0x35,0x44, + 0x1,0x68,0x58, 0x2,0x49,0x67, 0x1,0x6c,0x52, 0x1,0x6c,0x53, + 0x2,0x50,0x2a, 0x1,0x73,0x54, 0x2,0x61,0x4e, 0x2,0x61,0x4f, + 0x3,0x5a,0x38, 0x1,0x7a,0x68, 0x2,0x70,0x36, 0x2,0x21,0x2b, + 0x1,0x45,0x3a, 0x4,0x22,0x5f, 0x1,0x44,0x54, 0x2,0x21,0x58, + 0x2,0x21,0x57, 0x4,0x21,0x76, 0x3,0x64,0x6c, 0x3,0x23,0x55, + 0x1,0x47,0x7b, 0x2,0x22,0x37, 0x2,0x22,0x38, 0x2,0x22,0x36, + 0x4,0x22,0x60, 0x2,0x22,0x39, 0x3,0x23,0x5a, 0xf,0x22,0x47, + 0x3,0x25,0x61, 0x3,0x25,0x66, 0x2,0x23,0x67, 0x4,0x23,0x7a, + 0x2,0x23,0x62, 0x2,0x23,0x64, 0x2,0x23,0x66, 0x2,0x23,0x63, + 0x1,0x4a,0x26, 0x2,0x23,0x60, 0x3,0x25,0x62, 0x2,0x23,0x61, + 0x1,0x4a,0x23, 0x1,0x4a,0x24, 0x2,0x23,0x65, 0x2,0x23,0x68, + 0x1,0x4a,0x25, 0x2,0x23,0x69, 0xf,0x23,0x7c, 0xf,0x23,0x78, + 0x3,0x25,0x63, 0x2,0x26,0x49, 0x3,0x28,0x5d, 0x2,0x26,0x43, + 0x2,0x26,0x3e, 0x1,0x4d,0x25, 0x2,0x26,0x46, 0x2,0x26,0x44, + 0x2,0x26,0x3d, 0x2,0x26,0x4a, 0x2,0x26,0x4d, 0x2,0x26,0x48, + 0x2,0x26,0x41, 0x1,0x4d,0x27, 0x2,0x26,0x47, 0x1,0x4d,0x28, + 0x2,0x26,0x42, 0x2,0x26,0x45, 0x2,0x26,0x3c, 0x2,0x26,0x40, + 0x2,0x26,0x4c, 0x1,0x4d,0x29, 0x4,0x26,0x2f, 0x1,0x4d,0x2a, + 0x3,0x28,0x5e, 0x2,0x26,0x3f, 0x2,0x26,0x4b, 0x1,0x4d,0x24, + 0x1,0x4d,0x26, 0x3,0x28,0x5c, 0x3,0x28,0x5f, 0x3,0x28,0x57, + 0x4,0x26,0x34, 0x3,0x28,0x58, 0x2,0x2a,0x2c, 0x2,0x2a,0x25, + 0x2,0x2a,0x2b, 0x2,0x2a,0x24, 0x2,0x2a,0x26, 0x2,0x29,0x7e, + 0x2,0x29,0x7c, 0x3,0x2c,0x3f, 0x2,0x2a,0x2d, 0x2,0x2a,0x2a, + 0x2,0x29,0x7a, 0x3,0x2c,0x3b, 0x1,0x50,0x72, 0x2,0x2a,0x28, + 0x2,0x2a,0x29, 0x3,0x64,0x6d, 0x2,0x2a,0x27, 0x2,0x29,0x7d, + 0x2,0x29,0x7b, 0x1,0x50,0x71, 0x2,0x2a,0x23, 0x2,0x2a,0x21, + 0x3,0x2c,0x3c, 0x3,0x2c,0x42, 0x2,0x2a,0x22, 0x2,0x2a,0x2e, + 0x3,0x2c,0x3e, 0x3,0x2c,0x41, 0x3,0x2c,0x43, 0x3,0x2c,0x3d, + 0x1,0x55,0x33, 0x3,0x30,0x63, 0x1,0x55,0x32, 0x3,0x30,0x5f, + 0x2,0x2e,0x6e, 0x1,0x55,0x2f, 0x2,0x2e,0x70, 0x3,0x30,0x64, + 0x1,0x55,0x34, 0x2,0x2e,0x71, 0x4,0x2c,0x60, 0x3,0x30,0x61, + 0x1,0x55,0x37, 0x3,0x30,0x62, 0x1,0x55,0x35, 0x2,0x2e,0x72, + 0x2,0x2a,0x2f, 0x2,0x2e,0x74, 0x3,0x30,0x5e, 0x1,0x55,0x31, + 0x4,0x2c,0x5c, 0x1,0x55,0x30, 0x4,0x2c,0x61, 0x2,0x2e,0x6f, + 0x2,0x2e,0x73, 0x1,0x55,0x36, 0x1,0x59,0x77, 0x1,0x59,0x76, + 0x3,0x35,0x4b, 0x3,0x35,0x48, 0x3,0x35,0x47, 0x2,0x34,0x78, + 0x2,0x34,0x7c, 0x2,0x34,0x7e, 0x1,0x59,0x78, 0x2,0x35,0x23, + 0x3,0x35,0x51, 0x1,0x59,0x7c, 0x2,0x35,0x25, 0x3,0x35,0x52, + 0x1,0x59,0x7e, 0x3,0x35,0x4f, 0x1,0x59,0x7a, 0x1,0x5a,0x24, + 0x3,0x35,0x55, 0x1,0x5a,0x21, 0x2,0x34,0x7a, 0x1,0x59,0x79, + 0x3,0x3b,0x2b, 0x2,0x34,0x79, 0x2,0x34,0x77, 0x2,0x35,0x27, + 0x2,0x34,0x7b, 0x3,0x35,0x46, 0x1,0x59,0x7b, 0x2,0x35,0x26, + 0x1,0x5a,0x22, 0x2,0x35,0x22, 0x2,0x35,0x21, 0x1,0x5a,0x23, + 0x2,0x34,0x7d, 0x1,0x59,0x7d, 0x3,0x35,0x4e, 0x6,0x3e,0x76, + 0x3,0x35,0x4a, 0x2,0x35,0x28, 0x3,0x35,0x54, 0x2,0x35,0x24, + 0x2,0x3b,0x4b, 0x2,0x3b,0x52, 0x2,0x3b,0x47, 0x1,0x5e,0x76, + 0x2,0x3b,0x43, 0x2,0x3b,0x53, 0x2,0x3b,0x3d, 0x2,0x3b,0x50, + 0x2,0x3b,0x4e, 0x2,0x3b,0x48, 0x3,0x3b,0x36, 0x2,0x3b,0x51, + 0x2,0x3b,0x4a, 0x3,0x3b,0x28, 0x2,0x3b,0x42, 0x2,0x3b,0x54, + 0x2,0x3b,0x40, 0x2,0x3b,0x4d, 0x2,0x3b,0x3e, 0x3,0x3b,0x27, + 0x2,0x3b,0x55, 0x3,0x3b,0x37, 0x1,0x5e,0x77, 0x3,0x3b,0x2a, + 0x2,0x3b,0x4f, 0x2,0x42,0x55, 0x2,0x3b,0x41, 0x1,0x5e,0x74, + 0x3,0x3b,0x2e, 0x2,0x3b,0x45, 0x3,0x3b,0x34, 0x1,0x5e,0x75, + 0x2,0x3b,0x44, 0x2,0x3b,0x49, 0x3,0x3b,0x33, 0x4,0x37,0x35, + 0x2,0x3b,0x46, 0x4,0x37,0x2f, 0x3,0x3b,0x31, 0x2,0x3b,0x4c, + 0x3,0x3b,0x2d, 0x2,0x42,0x59, 0x4,0x3c,0x79, 0x3,0x41,0x21, + 0x4,0x3c,0x7b, 0x2,0x42,0x5c, 0x2,0x42,0x54, 0x3,0x40,0x7c, + 0x2,0x42,0x56, 0x3,0x40,0x7a, 0x2,0x42,0x5b, 0x2,0x42,0x5a, + 0x1,0x63,0x69, 0x4,0x3c,0x75, 0x2,0x3b,0x3f, 0x2,0x42,0x58, + 0x3,0x40,0x79, 0x3,0x40,0x7d, 0x1,0x63,0x6a, 0x4,0x3c,0x74, + 0x2,0x42,0x53, 0x2,0x42,0x57, 0x4,0x3c,0x7c, 0x4,0x3c,0x78, + 0x3,0x64,0x6e, 0x2,0x49,0x6e, 0x3,0x46,0x5c, 0x2,0x49,0x75, + 0x2,0x49,0x6c, 0x3,0x46,0x54, 0x2,0x49,0x73, 0x2,0x49,0x6a, + 0x2,0x49,0x72, 0x2,0x49,0x76, 0x2,0x49,0x69, 0x2,0x49,0x6d, + 0x2,0x49,0x68, 0x3,0x46,0x56, 0x1,0x68,0x59, 0x4,0x43,0x2c, + 0x2,0x49,0x6b, 0x1,0x68,0x5a, 0x2,0x49,0x71, 0x2,0x49,0x70, + 0x2,0x49,0x6f, 0x3,0x46,0x59, 0x3,0x46,0x5a, 0x2,0x49,0x74, + 0x3,0x64,0x6f, 0x3,0x4b,0x65, 0x3,0x4b,0x66, 0x3,0x4b,0x63, + 0x2,0x50,0x2e, 0x2,0x50,0x30, 0x1,0x6c,0x55, 0x2,0x50,0x31, + 0x3,0x4b,0x6b, 0x2,0x50,0x2c, 0x3,0x4b,0x67, 0x2,0x50,0x2b, + 0x2,0x50,0x35, 0x3,0x4b,0x69, 0x2,0x50,0x33, 0x1,0x6c,0x54, + 0x2,0x50,0x36, 0x2,0x50,0x2d, 0x2,0x50,0x32, 0x2,0x50,0x34, + 0x2,0x50,0x2f, 0x3,0x4b,0x6a, 0x3,0x4b,0x68, 0x3,0x64,0x70, + 0x3,0x50,0x58, 0x2,0x56,0x6b, 0x2,0x56,0x70, 0x2,0x56,0x6a, + 0x2,0x56,0x6f, 0x3,0x50,0x5b, 0x2,0x56,0x68, 0x2,0x56,0x72, + 0x2,0x56,0x6e, 0x2,0x56,0x73, 0x2,0x56,0x6d, 0x2,0x56,0x69, + 0x2,0x56,0x71, 0x3,0x50,0x5a, 0x2,0x56,0x74, 0x2,0x56,0x6c, + 0x3,0x64,0x71, 0x2,0x5c,0x66, 0x1,0x73,0x58, 0x3,0x54,0x57, + 0x1,0x73,0x56, 0x3,0x54,0x59, 0x1,0x73,0x55, 0x1,0x73,0x57, + 0x3,0x54,0x55, 0x3,0x64,0x72, 0x2,0x61,0x50, 0x3,0x57,0x62, + 0x2,0x64,0x3e, 0x2,0x65,0x49, 0x3,0x5a,0x39, 0x2,0x68,0x70, + 0x2,0x68,0x71, 0x3,0x5c,0x3d, 0x1,0x79,0x6b, 0x3,0x5c,0x3c, + 0x2,0x6b,0x57, 0x3,0x5c,0x3e, 0x1,0x7a,0x69, 0x4,0x66,0x3b, + 0x2,0x6b,0x58, 0x3,0x5e,0x2d, 0x2,0x6d,0x4c, 0x1,0x7b,0x5e, + 0x3,0x5f,0x43, 0x1,0x7b,0x5d, 0x2,0x6d,0x4b, 0x1,0x7c,0x35, + 0x3,0x60,0x30, 0x2,0x6f,0x25, 0x4,0x6b,0x68, 0x4,0x6a,0x46, + 0x3,0x21,0x3c, 0x4,0x21,0x2c, 0x1,0x44,0x55, 0x1,0x47,0x7c, + 0x2,0x22,0x3a, 0x2,0x23,0x6a, 0x1,0x4b,0x56, 0x1,0x5a,0x25, + 0x3,0x35,0x57, 0x3,0x4b,0x6c, 0x1,0x44,0x56, 0x1,0x46,0x4a, + 0x1,0x46,0x49, 0x1,0x46,0x48, 0x4,0x22,0x63, 0x1,0x4a,0x27, + 0x1,0x55,0x38, 0x2,0x42,0x5d, 0x1,0x44,0x57, 0x1,0x44,0x58, + 0x1,0x44,0x59, 0x1,0x45,0x3b, 0x3,0x25,0x67, 0x3,0x28,0x60, + 0x1,0x50,0x73, 0x4,0x2c,0x64, 0x2,0x2a,0x30, 0x3,0x2c,0x45, + 0x3,0x2c,0x44, 0x1,0x5e,0x78, 0x1,0x44,0x5a, 0x2,0x21,0x3d, + 0x3,0x21,0x63, 0x4,0x21,0x4c, 0x1,0x46,0x4b, 0x1,0x46,0x4c, + 0x2,0x21,0x59, 0x1,0x47,0x7d, 0x5,0x22,0x5c, 0x3,0x23,0x5c, + 0x3,0x25,0x68, 0x2,0x23,0x6b, 0x3,0x25,0x6b, 0x1,0x4a,0x28, + 0x4,0x24,0x23, 0x2,0x23,0x6c, 0x1,0x4d,0x30, 0x3,0x28,0x62, + 0x3,0x28,0x61, 0x2,0x26,0x4f, 0x1,0x4d,0x2e, 0x1,0x4d,0x2d, + 0x2,0x26,0x4e, 0x1,0x4d,0x2b, 0x2,0x26,0x50, 0x1,0x4d,0x2c, + 0x1,0x4d,0x2f, 0x1,0x50,0x74, 0x3,0x2c,0x46, 0x1,0x50,0x76, + 0x2,0x2a,0x34, 0x2,0x2a,0x31, 0x2,0x2a,0x32, 0x2,0x2a,0x33, + 0x2,0x2a,0x35, 0x1,0x50,0x75, 0x2,0x2e,0x76, 0x2,0x2e,0x75, + 0x3,0x30,0x66, 0x1,0x55,0x3a, 0x3,0x30,0x69, 0x1,0x55,0x39, + 0x3,0x30,0x68, 0x3,0x30,0x6a, 0x3,0x30,0x67, 0x3,0x35,0x5b, + 0x1,0x5a,0x28, 0x2,0x35,0x2a, 0x3,0x35,0x59, 0x1,0x5a,0x27, + 0x1,0x5a,0x29, 0x1,0x5a,0x26, 0x3,0x35,0x58, 0x3,0x35,0x5a, + 0x1,0x5e,0x7a, 0x2,0x35,0x29, 0x5,0x37,0x7c, 0x1,0x5e,0x7b, + 0x2,0x3b,0x57, 0x3,0x39,0x79, 0x1,0x5e,0x7c, 0x2,0x3b,0x56, + 0x1,0x5e,0x79, 0x3,0x3b,0x3a, 0x3,0x3b,0x3b, 0x3,0x3b,0x3d, + 0x2,0x42,0x60, 0x2,0x42,0x62, 0x1,0x63,0x6b, 0x2,0x42,0x61, + 0x2,0x42,0x5f, 0x2,0x42,0x5e, 0x4,0x3d,0x2a, 0x4,0x43,0x35, + 0x3,0x46,0x5d, 0x2,0x49,0x79, 0x1,0x68,0x5f, 0x1,0x68,0x5d, + 0x4,0x43,0x30, 0x1,0x68,0x5e, 0x2,0x49,0x77, 0x2,0x49,0x78, + 0x3,0x4b,0x6d, 0x1,0x68,0x5b, 0x2,0x50,0x3a, 0x2,0x50,0x38, + 0x3,0x4b,0x70, 0x1,0x6c,0x57, 0x2,0x50,0x39, 0x1,0x6c,0x58, + 0x1,0x6c,0x56, 0x1,0x68,0x5c, 0xf,0x4e,0x5e, 0x3,0x64,0x73, + 0x2,0x56,0x77, 0x2,0x56,0x75, 0x2,0x56,0x76, 0x2,0x50,0x37, + 0x2,0x5c,0x68, 0x1,0x73,0x59, 0x2,0x5c,0x67, 0x2,0x61,0x51, + 0x2,0x61,0x52, 0x2,0x56,0x78, 0x2,0x65,0x4a, 0x3,0x66,0x77, + 0x1,0x44,0x5b, 0x1,0x46,0x4d, 0x1,0x48,0x21, 0x2,0x22,0x3b, + 0x1,0x47,0x7e, 0x3,0x28,0x63, 0x1,0x4d,0x31, 0x1,0x63,0x6c, + 0x3,0x21,0x3d, 0x1,0x45,0x3c, 0x1,0x46,0x4e, 0x1,0x50,0x77, + 0x1,0x5e,0x7d, 0x3,0x21,0x3e, 0x2,0x21,0x5a, 0x3,0x22,0x47, + 0x2,0x21,0x5b, 0x3,0x22,0x48, 0x2,0x22,0x3c, 0x3,0x66,0x78, + 0x1,0x4a,0x2a, 0x2,0x23,0x70, 0x2,0x23,0x6e, 0x1,0x4a,0x2b, + 0x2,0x23,0x6d, 0x2,0x23,0x6f, 0x2,0x23,0x71, 0x4,0x24,0x28, + 0x1,0x4a,0x29, 0x3,0x25,0x6e, 0x3,0x25,0x6d, 0x1,0x4d,0x35, + 0x1,0x4d,0x36, 0x1,0x4d,0x33, 0x3,0x28,0x65, 0x3,0x28,0x67, + 0x1,0x4d,0x32, 0x2,0x2a,0x39, 0x1,0x4d,0x34, 0x3,0x28,0x68, + 0x1,0x50,0x78, 0x3,0x2c,0x48, 0x2,0x2a,0x38, 0x2,0x2a,0x3a, + 0x2,0x2a,0x37, 0x2,0x2a,0x3b, 0x1,0x50,0x79, 0x1,0x55,0x3d, + 0x2,0x2e,0x77, 0x3,0x30,0x6c, 0x2,0x2e,0x79, 0x1,0x55,0x3b, + 0x2,0x2e,0x7a, 0x1,0x55,0x3c, 0x2,0x2e,0x78, 0x3,0x30,0x6b, + 0x2,0x2a,0x36, 0x2,0x35,0x2b, 0x2,0x35,0x2e, 0x2,0x35,0x2f, + 0x2,0x35,0x2c, 0x1,0x5a,0x2d, 0x1,0x5a,0x2c, 0x1,0x5a,0x2a, + 0x1,0x5a,0x2b, 0x2,0x35,0x2d, 0x3,0x35,0x61, 0x3,0x35,0x60, + 0x3,0x3b,0x3f, 0x1,0x5a,0x2e, 0x3,0x3b,0x40, 0x3,0x3b,0x3e, + 0x1,0x5f,0x21, 0x1,0x5f,0x22, 0x6,0x48,0x45, 0x1,0x5f,0x23, + 0x2,0x42,0x63, 0x2,0x42,0x65, 0x2,0x42,0x67, 0x1,0x63,0x6e, + 0x1,0x63,0x6d, 0x1,0x5e,0x7e, 0x2,0x42,0x66, 0x2,0x42,0x64, + 0x3,0x64,0x74, 0x2,0x49,0x7d, 0x3,0x46,0x61, 0x3,0x46,0x60, + 0x2,0x49,0x7b, 0x2,0x4a,0x23, 0x1,0x68,0x60, 0x2,0x4a,0x24, + 0x2,0x4a,0x21, 0x1,0x68,0x61, 0x2,0x49,0x7c, 0x2,0x49,0x7a, + 0x2,0x4a,0x22, 0x1,0x6c,0x5a, 0x2,0x50,0x3c, 0x2,0x49,0x7e, + 0x1,0x6c,0x5c, 0x2,0x50,0x3d, 0x1,0x6c,0x5b, 0x1,0x6c,0x5e, + 0x2,0x50,0x3e, 0x1,0x6c,0x59, 0x1,0x6c,0x5d, 0x2,0x56,0x7d, + 0x2,0x56,0x7b, 0x2,0x56,0x7a, 0x2,0x56,0x7c, 0x2,0x56,0x79, + 0x3,0x50,0x5c, 0x4,0x5b,0x21, 0x1,0x78,0x33, 0x3,0x64,0x75, + 0x2,0x68,0x72, 0x2,0x68,0x73, 0x3,0x5c,0x3f, 0x2,0x6b,0x59, + 0x2,0x6d,0x4d, 0x1,0x7d,0x22, 0x3,0x21,0x3f, 0x3,0x23,0x61, + 0x1,0x4d,0x37, 0x1,0x4a,0x2c, 0x3,0x28,0x69, 0x3,0x28,0x6b, + 0x1,0x50,0x7a, 0x3,0x2c,0x4c, 0x3,0x2c,0x4b, 0x3,0x30,0x6e, + 0x1,0x44,0x5c, 0x1,0x45,0x3d, 0x4,0x21,0x4d, 0x1,0x46,0x4f, + 0x2,0x22,0x3d, 0x3,0x25,0x6f, 0x1,0x4a,0x2d, 0x2,0x23,0x72, + 0x3,0x28,0x6d, 0x2,0x2a,0x3c, 0x1,0x50,0x7b, 0x1,0x68,0x62, + 0x1,0x44,0x5d, 0x3,0x21,0x64, 0x3,0x22,0x49, 0x3,0x23,0x62, + 0x1,0x48,0x22, 0xf,0x22,0x4e, 0x3,0x3b,0x42, 0x1,0x63,0x6f, + 0x1,0x44,0x5e, 0x1,0x45,0x3e, 0x1,0x45,0x3f, 0x1,0x46,0x51, + 0x1,0x46,0x50, 0x4,0x22,0x6b, 0x2,0x22,0x3e, 0x1,0x48,0x23, + 0x4,0x22,0x6c, 0x2,0x23,0x73, 0x3,0x25,0x71, 0x1,0x4a,0x2e, + 0x3,0x28,0x6e, 0x2,0x26,0x52, 0x2,0x26,0x53, 0x2,0x26,0x54, + 0x3,0x28,0x70, 0x1,0x4d,0x38, 0x1,0x4d,0x39, 0x2,0x26,0x51, + 0x1,0x4d,0x3a, 0x4,0x29,0x2c, 0x4,0x2c,0x70, 0x1,0x50,0x7c, + 0x2,0x2a,0x3d, 0x3,0x2c,0x4d, 0x2,0x2e,0x7c, 0x1,0x55,0x3e, + 0x3,0x30,0x6f, 0x2,0x2e,0x7b, 0x3,0x35,0x62, 0x1,0x5a,0x2f, + 0x2,0x35,0x30, 0x1,0x5a,0x30, 0x2,0x35,0x31, 0x3,0x35,0x63, + 0x3,0x3b,0x47, 0x3,0x3b,0x45, 0x1,0x5f,0x24, 0x4,0x37,0x45, + 0x3,0x3b,0x44, 0x4,0x3d,0x30, 0x2,0x42,0x68, 0xf,0x41,0x3f, + 0x3,0x41,0x22, 0x2,0x4a,0x26, 0x2,0x4a,0x25, 0x1,0x68,0x63, + 0x4,0x49,0x5e, 0x1,0x6c,0x5f, 0x2,0x50,0x3f, 0x1,0x70,0x53, + 0x2,0x56,0x7e, 0x1,0x73,0x5a, 0x3,0x57,0x63, 0x1,0x7b,0x5f, + 0x2,0x6f,0x27, 0x3,0x21,0x40, 0x3,0x21,0x41, 0x3,0x22,0x4a, + 0x3,0x23,0x51, 0x2,0x26,0x55, 0x3,0x28,0x71, 0x2,0x2a,0x3e, + 0x1,0x5a,0x31, 0x2,0x3b,0x58, 0x1,0x63,0x70, 0x3,0x41,0x23, + 0x3,0x50,0x5e, 0xf,0x54,0x43, 0x3,0x57,0x64, 0x1,0x76,0x41, + 0x3,0x61,0x64, 0x3,0x21,0x42, 0x1,0x4a,0x30, 0x3,0x25,0x72, + 0x1,0x4a,0x2f, 0x1,0x50,0x7d, 0x3,0x2c,0x50, 0x2,0x2e,0x7d, + 0x1,0x5a,0x33, 0x1,0x5d,0x29, 0x1,0x5a,0x34, 0x1,0x5a,0x32, + 0x1,0x5f,0x25, 0x3,0x41,0x24, 0x2,0x4a,0x27, 0x1,0x68,0x64, + 0x1,0x6c,0x60, 0x3,0x5f,0x45, 0x2,0x21,0x2c, 0x2,0x22,0x3f, + 0x4,0x22,0x6d, 0x2,0x23,0x75, 0x1,0x4a,0x31, 0x2,0x23,0x74, + 0x1,0x4a,0x32, 0x4,0x24,0x2c, 0x1,0x4d,0x3e, 0x2,0x26,0x58, + 0x2,0x26,0x57, 0x1,0x4d,0x3d, 0x1,0x4d,0x3b, 0x1,0x4d,0x3c, + 0x2,0x26,0x56, 0x3,0x28,0x76, 0x3,0x28,0x75, 0x1,0x51,0x21, + 0x2,0x2a,0x3f, 0x1,0x51,0x24, 0x1,0x50,0x7e, 0x1,0x51,0x26, + 0x1,0x51,0x22, 0x1,0x51,0x23, 0x1,0x51,0x25, 0x4,0x29,0x31, + 0x3,0x30,0x70, 0x3,0x30,0x72, 0x1,0x55,0x41, 0x1,0x55,0x40, + 0x1,0x55,0x3f, 0x3,0x30,0x71, 0x3,0x64,0x76, 0x2,0x35,0x33, + 0x1,0x5a,0x35, 0x1,0x5a,0x38, 0x1,0x5a,0x36, 0x3,0x64,0x77, + 0x2,0x35,0x32, 0x1,0x5a,0x3b, 0x4,0x31,0x53, 0x1,0x5a,0x37, + 0x2,0x35,0x34, 0x1,0x5a,0x3a, 0x1,0x5a,0x39, 0x4,0x31,0x52, + 0x4,0x31,0x57, 0x4,0x37,0x4a, 0x2,0x3b,0x5a, 0x2,0x3b,0x59, + 0x3,0x3b,0x4b, 0x1,0x5f,0x28, 0x1,0x5f,0x26, 0x1,0x5f,0x27, + 0x2,0x3b,0x5b, 0x1,0x63,0x71, 0x2,0x42,0x6a, 0x1,0x63,0x72, + 0x2,0x42,0x69, 0x4,0x3d,0x34, 0x4,0x43,0x3f, 0x2,0x50,0x40, + 0x3,0x46,0x63, 0x3,0x46,0x64, 0x1,0x6c,0x62, 0x2,0x4a,0x28, + 0x1,0x6c,0x61, 0x3,0x4b,0x72, 0x1,0x68,0x65, 0x3,0x64,0x78, + 0x2,0x57,0x22, 0x2,0x57,0x21, 0x1,0x73,0x5b, 0x2,0x5c,0x69, + 0x2,0x65,0x4b, 0x2,0x68,0x74, 0x2,0x68,0x75, 0x3,0x5e,0x2f, + 0x1,0x45,0x40, 0x4,0x21,0x36, 0x1,0x46,0x52, 0x3,0x22,0x4d, + 0x4,0x22,0x71, 0x2,0x21,0x5c, 0x3,0x22,0x4c, 0x5,0x22,0x66, + 0x1,0x4a,0x34, 0x1,0x4a,0x36, 0x3,0x25,0x78, 0x2,0x22,0x42, + 0x2,0x23,0x78, 0x2,0x23,0x77, 0x2,0x23,0x76, 0x3,0x23,0x66, + 0x2,0x22,0x41, 0x2,0x22,0x40, 0x1,0x48,0x25, 0x1,0x4a,0x35, + 0x1,0x4a,0x33, 0x1,0x48,0x24, 0x3,0x23,0x67, 0x3,0x23,0x69, + 0x3,0x25,0x77, 0x1,0x4d,0x3f, 0x2,0x26,0x59, 0x3,0x25,0x7b, + 0x1,0x4d,0x40, 0x2,0x23,0x7d, 0x4,0x26,0x50, 0x2,0x24,0x21, + 0x2,0x23,0x7e, 0x2,0x26,0x5a, 0x3,0x25,0x76, 0x3,0x25,0x74, + 0x2,0x23,0x7a, 0x3,0x28,0x7e, 0x1,0x4a,0x3a, 0x1,0x4a,0x38, + 0x3,0x25,0x7c, 0x2,0x23,0x79, 0x2,0x23,0x7b, 0x2,0x24,0x23, + 0x3,0x26,0x22, 0x1,0x4a,0x37, 0x3,0x26,0x21, 0x2,0x23,0x7c, + 0x2,0x24,0x27, 0x1,0x4d,0x42, 0x3,0x25,0x7d, 0x2,0x24,0x24, + 0x1,0x4a,0x39, 0x3,0x26,0x23, 0x2,0x24,0x22, 0x2,0x24,0x25, + 0x3,0x25,0x7a, 0x1,0x4d,0x41, 0x3,0x25,0x75, 0x1,0x4d,0x43, + 0x2,0x24,0x26, 0x3,0x28,0x78, 0x3,0x29,0x22, 0x2,0x26,0x6e, + 0x2,0x26,0x61, 0x2,0x26,0x5f, 0x2,0x26,0x6d, 0x2,0x26,0x68, + 0x1,0x51,0x2b, 0x1,0x4d,0x44, 0x2,0x26,0x69, 0x2,0x26,0x6c, + 0x1,0x51,0x27, 0x2,0x26,0x6b, 0x1,0x4d,0x45, 0x1,0x4d,0x4a, + 0x1,0x4d,0x48, 0x2,0x26,0x62, 0x4,0x29,0x36, 0x2,0x26,0x5d, + 0x2,0x26,0x64, 0x1,0x4d,0x4f, 0x2,0x26,0x6f, 0x1,0x51,0x28, + 0x2,0x26,0x65, 0x4,0x26,0x4f, 0x1,0x51,0x29, 0x1,0x4d,0x4b, + 0x2,0x26,0x67, 0x3,0x2c,0x5a, 0x2,0x2a,0x4e, 0x1,0x51,0x2a, + 0x2,0x26,0x5c, 0x1,0x4d,0x4c, 0x1,0x51,0x2c, 0x1,0x4d,0x4d, + 0x1,0x4d,0x49, 0x1,0x4d,0x4e, 0x2,0x26,0x66, 0x2,0x26,0x5b, + 0x2,0x26,0x6a, 0x1,0x4d,0x46, 0x3,0x28,0x77, 0x3,0x2c,0x5b, + 0x2,0x26,0x5e, 0x2,0x26,0x63, 0x2,0x26,0x60, 0x1,0x4d,0x47, + 0x3,0x28,0x7a, 0x2,0x2a,0x40, 0x4,0x29,0x45, 0x2,0x2a,0x41, + 0x3,0x29,0x21, 0x2,0x2a,0x4b, 0x2,0x2f,0x23, 0x2,0x2a,0x4c, + 0x1,0x51,0x32, 0x2,0x2a,0x4f, 0x2,0x2a,0x45, 0x1,0x51,0x31, + 0x2,0x2a,0x47, 0x4,0x29,0x3f, 0x2,0x2a,0x48, 0x3,0x2c,0x60, + 0x3,0x30,0x79, 0x2,0x2a,0x4a, 0x1,0x51,0x2d, 0x3,0x2c,0x56, + 0x3,0x30,0x73, 0x1,0x55,0x45, 0x3,0x2c,0x57, 0x3,0x2c,0x5d, + 0x2,0x2a,0x46, 0x2,0x2a,0x42, 0x1,0x55,0x46, 0x3,0x30,0x7e, + 0x4,0x29,0x3e, 0x2,0x2a,0x50, 0x1,0x55,0x42, 0x2,0x2f,0x21, + 0x2,0x2a,0x49, 0x3,0x2c,0x54, 0x2,0x2e,0x7e, 0x2,0x2a,0x44, + 0x2,0x2a,0x4d, 0x3,0x2c,0x5f, 0x3,0x2c,0x61, 0x1,0x51,0x30, + 0x1,0x55,0x43, 0x1,0x51,0x36, 0x1,0x55,0x44, 0x2,0x2a,0x51, + 0x2,0x2f,0x22, 0x1,0x51,0x2f, 0x1,0x55,0x48, 0x1,0x51,0x35, + 0x1,0x51,0x34, 0x1,0x51,0x33, 0x1,0x55,0x47, 0x2,0x2a,0x52, + 0x1,0x55,0x49, 0x1,0x51,0x2e, 0x4,0x29,0x4b, 0x2,0x2a,0x43, + 0x3,0x30,0x7a, 0x3,0x30,0x78, 0x3,0x30,0x7b, 0x3,0x2c,0x5c, + 0x3,0x30,0x76, 0x1,0x5a,0x3c, 0x2,0x2f,0x26, 0x2,0x2f,0x28, + 0x4,0x2d,0x25, 0x2,0x2f,0x2a, 0x1,0x55,0x4a, 0x1,0x55,0x50, + 0x2,0x35,0x37, 0x2,0x2f,0x2e, 0x2,0x2f,0x25, 0x1,0x5a,0x3e, + 0x2,0x35,0x35, 0x3,0x31,0x22, 0x1,0x55,0x4f, 0x1,0x55,0x4d, + 0x2,0x2f,0x30, 0x4,0x2d,0x2d, 0x2,0x35,0x36, 0x4,0x2d,0x2c, + 0x2,0x2f,0x27, 0x3,0x31,0x25, 0x1,0x55,0x4e, 0x2,0x2f,0x2b, + 0x1,0x55,0x51, 0x2,0x2f,0x2d, 0x3,0x35,0x68, 0x3,0x30,0x74, + 0x1,0x55,0x4c, 0x2,0x2f,0x2c, 0x2,0x2f,0x2f, 0x2,0x2f,0x29, + 0x3,0x31,0x27, 0x1,0x55,0x4b, 0x1,0x5a,0x3f, 0x3,0x35,0x71, + 0x2,0x2f,0x24, 0x1,0x5a,0x3d, 0x3,0x35,0x72, 0x4,0x31,0x6b, + 0x3,0x31,0x23, 0x3,0x31,0x28, 0x1,0x5a,0x40, 0x3,0x31,0x21, + 0x3,0x35,0x6f, 0x3,0x31,0x26, 0x2,0x35,0x39, 0x2,0x35,0x42, + 0x1,0x5f,0x2b, 0x3,0x3b,0x54, 0x1,0x5a,0x42, 0x1,0x5a,0x47, + 0x1,0x5f,0x2c, 0x2,0x35,0x44, 0x1,0x5a,0x4e, 0x2,0x3b,0x5d, + 0x2,0x35,0x3a, 0x1,0x5a,0x46, 0x1,0x5a,0x49, 0x1,0x5a,0x44, + 0x2,0x35,0x38, 0x2,0x35,0x46, 0x2,0x35,0x49, 0x2,0x3b,0x6c, + 0x4,0x31,0x68, 0x2,0x35,0x47, 0x2,0x3b,0x61, 0x1,0x5a,0x45, + 0x1,0x5a,0x4c, 0x1,0x5a,0x50, 0x2,0x35,0x41, 0x2,0x3b,0x5c, + 0x2,0x35,0x45, 0x1,0x5a,0x41, 0x2,0x3b,0x5e, 0x2,0x35,0x48, + 0x2,0x3b,0x60, 0x2,0x35,0x3d, 0x3,0x35,0x6a, 0x1,0x5f,0x29, + 0x3,0x3b,0x56, 0x2,0x35,0x3b, 0x2,0x35,0x3c, 0x1,0x5a,0x4b, + 0x3,0x3b,0x55, 0x3,0x35,0x6e, 0x1,0x5a,0x4a, 0x2,0x35,0x3f, + 0x1,0x5a,0x4f, 0x2,0x35,0x43, 0x1,0x5a,0x48, 0x2,0x35,0x40, + 0x3,0x35,0x79, 0x1,0x5a,0x4d, 0x1,0x5f,0x2d, 0x1,0x5f,0x2a, + 0x2,0x3b,0x5f, 0x3,0x3b,0x58, 0x2,0x35,0x3e, 0x3,0x3b,0x59, + 0x1,0x5a,0x43, 0x3,0x35,0x76, 0x3,0x35,0x78, 0x3,0x3b,0x5a, + 0x3,0x3b,0x4d, 0x3,0x35,0x74, 0x1,0x5f,0x32, 0x1,0x5f,0x36, + 0x2,0x3b,0x63, 0x1,0x63,0x77, 0x1,0x5f,0x34, 0x2,0x3b,0x67, + 0x1,0x5f,0x38, 0x2,0x42,0x6b, 0x2,0x3b,0x69, 0x1,0x63,0x79, + 0x1,0x5f,0x30, 0x1,0x5f,0x33, 0x2,0x3b,0x6a, 0x3,0x3b,0x5e, + 0x2,0x3b,0x6b, 0x2,0x3b,0x71, 0x1,0x5f,0x3a, 0x1,0x63,0x7a, + 0x4,0x3d,0x3d, 0x2,0x3b,0x6d, 0x2,0x3b,0x72, 0x2,0x3b,0x66, + 0x1,0x64,0x26, 0x3,0x3b,0x4f, 0x1,0x63,0x7b, 0x1,0x5f,0x39, + 0x2,0x3b,0x64, 0x2,0x3b,0x73, 0x3,0x3b,0x51, 0x1,0x64,0x25, + 0x1,0x5f,0x37, 0x1,0x63,0x74, 0x2,0x3b,0x70, 0x3,0x3b,0x5d, + 0x1,0x5f,0x3b, 0x2,0x3b,0x68, 0x2,0x3b,0x62, 0x1,0x5f,0x31, + 0x2,0x3b,0x65, 0x5,0x3f,0x30, 0x2,0x3b,0x6e, 0x3,0x41,0x2b, + 0x1,0x63,0x73, 0x1,0x63,0x78, 0x1,0x5f,0x2e, 0x2,0x3b,0x6f, + 0x3,0x3b,0x61, 0x1,0x63,0x76, 0x3,0x3b,0x62, 0x3,0x3b,0x63, + 0x3,0x3b,0x50, 0x1,0x5f,0x2f, 0x3,0x64,0x79, 0x1,0x64,0x24, + 0x2,0x4a,0x2a, 0x2,0x42,0x76, 0x3,0x41,0x29, 0x2,0x42,0x6e, + 0x2,0x4a,0x29, 0x4,0x3d,0x39, 0x2,0x42,0x72, 0x2,0x42,0x74, + 0x3,0x41,0x27, 0x3,0x41,0x2c, 0x2,0x42,0x71, 0x3,0x46,0x6f, + 0x1,0x64,0x23, 0x4,0x3d,0x38, 0x2,0x42,0x70, 0x1,0x64,0x27, + 0x3,0x46,0x6e, 0x6,0x52,0x64, 0x3,0x41,0x28, 0x2,0x4a,0x39, + 0x3,0x46,0x6c, 0x3,0x41,0x2e, 0x1,0x64,0x22, 0x1,0x68,0x67, + 0x2,0x42,0x77, 0x2,0x4a,0x2b, 0x3,0x46,0x6d, 0x3,0x41,0x2a, + 0x1,0x63,0x7e, 0x2,0x42,0x6f, 0x2,0x42,0x73, 0x1,0x68,0x66, + 0x1,0x63,0x75, 0x2,0x42,0x6c, 0x2,0x42,0x6d, 0x1,0x68,0x68, + 0x1,0x63,0x7d, 0x1,0x64,0x21, 0x1,0x63,0x7c, 0x2,0x42,0x75, + 0x3,0x64,0x7a, 0x2,0x4a,0x2f, 0x2,0x4a,0x30, 0x2,0x4a,0x35, + 0x1,0x6c,0x67, 0x2,0x4a,0x3c, 0x3,0x4b,0x73, 0x1,0x68,0x6e, + 0x3,0x4b,0x7e, 0x1,0x68,0x6d, 0x2,0x4a,0x37, 0x3,0x4b,0x74, + 0x1,0x6c,0x66, 0x2,0x4a,0x2c, 0x1,0x68,0x6c, 0x3,0x46,0x71, + 0x2,0x4a,0x3b, 0x1,0x68,0x6a, 0x1,0x68,0x6b, 0x3,0x4b,0x7c, + 0x2,0x4a,0x38, 0x2,0x50,0x51, 0x1,0x6c,0x64, 0x1,0x5f,0x35, + 0x3,0x46,0x72, 0x2,0x4a,0x3a, 0x1,0x6c,0x6b, 0x2,0x4a,0x32, + 0x4,0x49,0x6f, 0x1,0x6c,0x65, 0x3,0x46,0x6a, 0x1,0x6c,0x6a, + 0x2,0x4a,0x2d, 0x2,0x4a,0x31, 0x2,0x4a,0x2e, 0x2,0x4a,0x34, + 0x1,0x68,0x6f, 0x1,0x6c,0x63, 0x1,0x68,0x69, 0x3,0x4c,0x21, + 0x2,0x50,0x43, 0x2,0x4a,0x36, 0x3,0x46,0x68, 0x1,0x6c,0x69, + 0x3,0x46,0x73, 0x1,0x6c,0x6c, 0x7,0x22,0x71, 0x2,0x4a,0x33, + 0x3,0x46,0x6b, 0x1,0x6c,0x68, 0x2,0x50,0x42, 0x5,0x4d,0x2a, + 0x3,0x4c,0x23, 0x3,0x46,0x74, 0x3,0x4c,0x24, 0x3,0x4b,0x77, + 0x2,0x50,0x47, 0x1,0x70,0x57, 0x2,0x50,0x41, 0x2,0x57,0x2e, + 0x2,0x50,0x50, 0x1,0x6c,0x70, 0x3,0x4b,0x7a, 0x1,0x6c,0x6e, + 0x1,0x70,0x55, 0x2,0x50,0x4d, 0x2,0x50,0x49, 0x1,0x6c,0x74, + 0x3,0x4b,0x76, 0x2,0x57,0x25, 0x3,0x50,0x68, 0x3,0x4c,0x28, + 0x3,0x50,0x67, 0x1,0x6c,0x72, 0x2,0x50,0x48, 0x3,0x4c,0x29, + 0x2,0x57,0x23, 0x3,0x4c,0x25, 0x2,0x50,0x4c, 0x4,0x50,0x3b, + 0x2,0x50,0x4f, 0x2,0x50,0x46, 0x3,0x4b,0x79, 0x1,0x6c,0x73, + 0x4,0x50,0x37, 0x3,0x4b,0x75, 0x1,0x6c,0x6d, 0x2,0x57,0x24, + 0x1,0x70,0x56, 0x2,0x50,0x4e, 0x1,0x6c,0x6f, 0x1,0x6c,0x71, + 0x2,0x50,0x4b, 0x1,0x6c,0x75, 0x2,0x50,0x4a, 0x2,0x50,0x45, + 0x2,0x50,0x44, 0x1,0x70,0x54, 0x2,0x50,0x52, 0x2,0x57,0x27, + 0x2,0x5c,0x6b, 0x1,0x70,0x59, 0x3,0x50,0x61, 0x2,0x57,0x2d, + 0x3,0x50,0x63, 0x2,0x57,0x2b, 0x3,0x50,0x6a, 0x2,0x5c,0x6c, + 0x3,0x50,0x64, 0x1,0x70,0x5a, 0x2,0x57,0x2c, 0x3,0x50,0x66, + 0x2,0x57,0x29, 0x1,0x73,0x5d, 0x2,0x5c,0x6a, 0x3,0x50,0x6c, + 0x2,0x57,0x26, 0x2,0x57,0x28, 0x1,0x73,0x5e, 0x1,0x70,0x5c, + 0x1,0x73,0x5c, 0x1,0x70,0x5b, 0x1,0x73,0x60, 0x2,0x57,0x2a, + 0x1,0x70,0x58, 0x3,0x50,0x62, 0x3,0x50,0x65, 0x3,0x50,0x6b, + 0x3,0x66,0x79, 0x4,0x5b,0x2b, 0x2,0x61,0x5b, 0x4,0x56,0x33, + 0x2,0x61,0x53, 0x3,0x54,0x61, 0x3,0x54,0x5f, 0x3,0x54,0x5c, + 0x3,0x54,0x5e, 0x3,0x54,0x5d, 0x2,0x5c,0x72, 0x2,0x61,0x54, + 0x2,0x5c,0x6e, 0x4,0x56,0x32, 0x3,0x54,0x5b, 0x1,0x76,0x42, + 0x2,0x5c,0x70, 0x2,0x5c,0x6f, 0x1,0x73,0x5f, 0x2,0x5c,0x6d, + 0x2,0x5c,0x71, 0x2,0x61,0x5c, 0x2,0x61,0x58, 0x2,0x61,0x5a, + 0x4,0x5f,0x60, 0x2,0x61,0x55, 0x2,0x61,0x56, 0x4,0x5f,0x61, + 0x2,0x61,0x59, 0x2,0x61,0x57, 0x1,0x78,0x34, 0x3,0x57,0x65, + 0x1,0x78,0x37, 0x1,0x78,0x36, 0x1,0x78,0x35, 0x1,0x79,0x6c, + 0x2,0x68,0x76, 0x1,0x79,0x6d, 0x2,0x65,0x4c, 0x1,0x7a,0x6a, + 0x2,0x6b,0x5a, 0x1,0x7a,0x6b, 0x1,0x7b,0x60, 0x1,0x7c,0x36, + 0x2,0x6f,0x28, 0x3,0x5f,0x46, 0x2,0x6f,0x29, 0x2,0x6f,0x2a, + 0x3,0x61,0x3e, 0x2,0x72,0x2a, 0x1,0x45,0x41, 0x2,0x21,0x5d, + 0x1,0x46,0x53, 0x1,0x48,0x27, 0x1,0x48,0x28, 0x1,0x48,0x26, + 0x3,0x23,0x6b, 0x1,0x48,0x29, 0x1,0x4a,0x3c, 0x1,0x4a,0x3b, + 0x3,0x26,0x25, 0x2,0x26,0x70, 0x1,0x4d,0x51, 0x1,0x4d,0x50, + 0x3,0x2c,0x63, 0x2,0x2f,0x31, 0x1,0x5a,0x51, 0x1,0x5a,0x52, + 0x4,0x31,0x6e, 0x4,0x31,0x70, 0x3,0x3b,0x64, 0x1,0x5f,0x3c, + 0x2,0x42,0x78, 0x1,0x64,0x28, 0x1,0x64,0x29, 0x2,0x42,0x7a, + 0x2,0x42,0x7c, 0x2,0x42,0x7b, 0x4,0x3d,0x43, 0x2,0x4a,0x3e, + 0x3,0x46,0x76, 0x2,0x4a,0x3d, 0x1,0x68,0x70, 0x2,0x4a,0x3f, + 0x3,0x46,0x75, 0x2,0x50,0x53, 0x1,0x6c,0x76, 0x3,0x4c,0x2c, + 0x1,0x70,0x5d, 0x3,0x50,0x6d, 0x1,0x73,0x61, 0x1,0x76,0x43, + 0x1,0x73,0x62, 0x3,0x5f,0x48, 0x1,0x45,0x42, 0x3,0x21,0x65, + 0x3,0x21,0x66, 0x3,0x22,0x4e, 0x2,0x24,0x28, 0x3,0x26,0x28, + 0x3,0x26,0x29, 0x2,0x26,0x71, 0x1,0x4d,0x53, 0x1,0x4d,0x52, + 0x1,0x4d,0x54, 0x1,0x51,0x37, 0x2,0x2a,0x53, 0x2,0x2a,0x54, + 0x3,0x31,0x29, 0x2,0x2f,0x32, 0x1,0x55,0x52, 0x1,0x5a,0x53, + 0x1,0x5f,0x3d, 0x2,0x3b,0x74, 0x1,0x45,0x43, 0x4,0x21,0x37, + 0x1,0x44,0x5f, 0x1,0x45,0x44, 0x3,0x22,0x50, 0x2,0x21,0x5e, + 0x1,0x46,0x57, 0x1,0x46,0x56, 0x1,0x46,0x54, 0x1,0x46,0x55, + 0x3,0x23,0x6f, 0x1,0x48,0x2c, 0x2,0x22,0x49, 0x2,0x22,0x4b, + 0x1,0x48,0x2b, 0x2,0x22,0x43, 0x3,0x23,0x6c, 0x2,0x22,0x44, + 0x3,0x23,0x6d, 0x2,0x22,0x4a, 0x2,0x22,0x46, 0x2,0x22,0x48, + 0x1,0x48,0x2a, 0x2,0x22,0x45, 0x2,0x22,0x4c, 0x2,0x22,0x47, + 0x3,0x23,0x6e, 0xf,0x22,0x51, 0x1,0x4a,0x43, 0x1,0x4a,0x4c, + 0x1,0x4a,0x4a, 0x2,0x24,0x32, 0x2,0x24,0x2f, 0x2,0x24,0x37, + 0x1,0x4a,0x48, 0x2,0x24,0x38, 0x3,0x26,0x39, 0x1,0x4a,0x41, + 0x2,0x24,0x35, 0x3,0x26,0x2e, 0x1,0x4a,0x47, 0x2,0x24,0x31, + 0x2,0x24,0x30, 0x1,0x4a,0x45, 0x2,0x24,0x36, 0x1,0x4a,0x46, + 0x1,0x4d,0x55, 0x1,0x4a,0x40, 0x2,0x24,0x33, 0x3,0x26,0x2a, + 0x2,0x24,0x29, 0x1,0x4a,0x3d, 0x3,0x26,0x37, 0x1,0x4a,0x50, + 0x2,0x24,0x2e, 0x2,0x24,0x34, 0x1,0x4a,0x42, 0x1,0x4a,0x44, + 0x3,0x26,0x2f, 0x2,0x24,0x2a, 0x3,0x26,0x36, 0x2,0x24,0x2b, + 0x2,0x24,0x2c, 0x4,0x24,0x39, 0x1,0x4a,0x4f, 0x1,0x4a,0x49, + 0x1,0x4a,0x4e, 0x2,0x24,0x2d, 0x1,0x4a,0x4d, 0x1,0x4a,0x3f, + 0x1,0x4a,0x3e, 0x1,0x4a,0x4b, 0x3,0x26,0x35, 0x4,0x24,0x3c, + 0x3,0x26,0x33, 0x3,0x26,0x34, 0x3,0x26,0x38, 0x3,0x26,0x31, + 0x3,0x64,0x7b, 0xf,0x24,0x39, 0x3,0x26,0x32, 0x3,0x29,0x31, + 0x3,0x29,0x2a, 0x1,0x4d,0x63, 0x2,0x26,0x7d, 0x2,0x26,0x76, + 0x1,0x4d,0x5e, 0x1,0x4d,0x71, 0x2,0x26,0x72, 0x2,0x26,0x79, + 0x2,0x26,0x7b, 0x2,0x26,0x7e, 0x1,0x4d,0x6c, 0x3,0x29,0x26, + 0x2,0x26,0x7a, 0x2,0x26,0x73, 0x1,0x4d,0x6a, 0x2,0x26,0x77, + 0x3,0x29,0x28, 0x2,0x27,0x21, 0x1,0x4d,0x5b, 0x3,0x29,0x25, + 0x2,0x26,0x7c, 0x1,0x4d,0x65, 0x1,0x4d,0x64, 0x2,0x26,0x75, + 0x1,0x4d,0x59, 0x3,0x29,0x34, 0x3,0x29,0x32, 0x1,0x4d,0x5a, + 0xf,0x27,0x30, 0x1,0x4d,0x58, 0x3,0x29,0x33, 0x1,0x4d,0x70, + 0x1,0x4d,0x68, 0x1,0x4d,0x62, 0x1,0x4d,0x56, 0x2,0x26,0x78, + 0x1,0x4d,0x61, 0x1,0x4d,0x57, 0x1,0x4d,0x69, 0x1,0x4d,0x72, + 0x2,0x2a,0x55, 0x1,0x4d,0x66, 0x2,0x26,0x74, 0x1,0x4d,0x5c, + 0x1,0x4d,0x5f, 0x1,0x4d,0x60, 0x3,0x29,0x2e, 0x1,0x4d,0x6e, + 0x1,0x4d,0x6f, 0x1,0x4d,0x6d, 0x1,0x4d,0x67, 0x1,0x4d,0x6b, + 0x1,0x4d,0x5d, 0x1,0x51,0x38, 0x3,0x29,0x30, 0x3,0x29,0x37, + 0x3,0x29,0x35, 0x3,0x29,0x36, 0x3,0x29,0x2f, 0x3,0x29,0x29, + 0x3,0x2c,0x6d, 0x2,0x2a,0x5b, 0x1,0x51,0x44, 0x1,0x51,0x3c, + 0x1,0x51,0x3e, 0x1,0x51,0x43, 0x2,0x2a,0x67, 0x1,0x51,0x41, + 0x2,0x2f,0x33, 0x1,0x55,0x53, 0x1,0x51,0x46, 0x2,0x2a,0x58, + 0x2,0x2a,0x60, 0x1,0x51,0x42, 0x2,0x2a,0x5f, 0x2,0x2a,0x5c, + 0x2,0x2a,0x64, 0x2,0x2a,0x66, 0x1,0x51,0x3b, 0x1,0x51,0x3f, + 0x1,0x51,0x45, 0x1,0x55,0x55, 0x2,0x2a,0x61, 0x1,0x51,0x3d, + 0x1,0x51,0x48, 0x2,0x2a,0x5a, 0x3,0x2c,0x6f, 0x3,0x2c,0x70, + 0x5,0x29,0x45, 0x1,0x51,0x40, 0x1,0x55,0x54, 0x1,0x51,0x3a, + 0x4,0x29,0x59, 0x2,0x2a,0x57, 0x2,0x2a,0x5e, 0x2,0x2a,0x56, + 0x2,0x2a,0x59, 0x2,0x2a,0x5d, 0x2,0x2f,0x34, 0x1,0x51,0x47, + 0x4,0x29,0x51, 0x2,0x2a,0x62, 0x2,0x2a,0x63, 0x2,0x2a,0x65, + 0x1,0x51,0x39, 0x3,0x2c,0x6c, 0x3,0x31,0x32, 0x3,0x31,0x33, + 0x3,0x2c,0x6b, 0x3,0x2c,0x6e, 0x4,0x29,0x5b, 0x1,0x55,0x63, + 0x2,0x2f,0x40, 0x1,0x55,0x61, 0x1,0x55,0x62, 0x2,0x2f,0x36, + 0x2,0x2f,0x46, 0x3,0x31,0x2c, 0x1,0x55,0x58, 0x3,0x31,0x2f, + 0x3,0x31,0x35, 0x2,0x35,0x4a, 0x2,0x2f,0x48, 0x2,0x2f,0x42, + 0x3,0x31,0x38, 0x2,0x2f,0x39, 0x3,0x31,0x37, 0x2,0x2f,0x4b, + 0x2,0x2f,0x3c, 0x1,0x55,0x5e, 0x2,0x35,0x61, 0x2,0x2f,0x3f, + 0x1,0x55,0x60, 0x1,0x55,0x57, 0x3,0x31,0x3c, 0x2,0x2f,0x4d, + 0x2,0x2f,0x41, 0x1,0x55,0x5a, 0x2,0x2f,0x3a, 0x2,0x2f,0x37, + 0x2,0x2f,0x38, 0x1,0x55,0x5b, 0x2,0x2f,0x47, 0x2,0x2f,0x4e, + 0x1,0x55,0x5d, 0x2,0x2f,0x3e, 0x2,0x2f,0x3d, 0x1,0x55,0x65, + 0x1,0x55,0x64, 0x1,0x55,0x56, 0x1,0x55,0x5c, 0x1,0x55,0x5f, + 0x2,0x2f,0x4a, 0x3,0x31,0x2e, 0x3,0x31,0x39, 0x2,0x2f,0x44, + 0x1,0x55,0x59, 0x2,0x2f,0x35, 0x2,0x2f,0x4c, 0x2,0x2f,0x43, + 0x2,0x2f,0x45, 0x2,0x2f,0x49, 0x3,0x31,0x30, 0x3,0x31,0x3b, + 0x3,0x31,0x36, 0x3,0x64,0x7c, 0x3,0x64,0x7d, 0x2,0x35,0x4b, + 0x3,0x36,0x31, 0x1,0x5a,0x5b, 0x1,0x5a,0x6f, 0x1,0x5a,0x6e, + 0x3,0x36,0x27, 0x1,0x5a,0x63, 0x3,0x36,0x29, 0x2,0x35,0x5d, + 0x2,0x35,0x59, 0x2,0x35,0x56, 0x2,0x35,0x68, 0x1,0x5a,0x5e, + 0x1,0x5a,0x56, 0x3,0x36,0x26, 0x3,0x36,0x32, 0x2,0x35,0x5b, + 0x1,0x5f,0x4d, 0x1,0x5a,0x5a, 0x2,0x35,0x63, 0x3,0x36,0x22, + 0x1,0x5a,0x70, 0x1,0x5a,0x6d, 0x2,0x35,0x5f, 0x2,0x35,0x4e, + 0x3,0x35,0x7c, 0x3,0x36,0x2b, 0x1,0x5a,0x6c, 0x2,0x35,0x65, + 0x2,0x35,0x4d, 0x1,0x5a,0x61, 0x1,0x5a,0x65, 0x2,0x35,0x64, + 0x3,0x36,0x23, 0x2,0x35,0x57, 0x1,0x5a,0x66, 0x1,0x5a,0x60, + 0x2,0x35,0x4c, 0x3,0x35,0x7d, 0x1,0x5f,0x3f, 0x2,0x35,0x67, + 0x2,0x35,0x55, 0x1,0x5a,0x6b, 0x2,0x35,0x58, 0x2,0x35,0x66, + 0x1,0x5a,0x6a, 0x3,0x36,0x24, 0x2,0x3b,0x75, 0x4,0x31,0x77, + 0x1,0x5a,0x57, 0x2,0x35,0x53, 0x1,0x5a,0x5c, 0x1,0x5a,0x67, + 0x4,0x31,0x78, 0x1,0x5a,0x62, 0x2,0x35,0x5c, 0x2,0x35,0x52, + 0x2,0x35,0x50, 0x2,0x35,0x62, 0x1,0x5a,0x54, 0x1,0x5a,0x68, + 0x1,0x5a,0x58, 0x1,0x5f,0x3e, 0x2,0x35,0x60, 0x1,0x5a,0x59, + 0x4,0x32,0x23, 0x1,0x5a,0x55, 0x1,0x5a,0x64, 0x1,0x5a,0x5f, + 0x1,0x5a,0x5d, 0x2,0x35,0x54, 0x1,0x5a,0x69, 0x2,0x35,0x51, + 0x2,0x35,0x5e, 0x2,0x35,0x5a, 0x2,0x3b,0x77, 0x2,0x3b,0x76, + 0x3,0x36,0x2d, 0x3,0x64,0x7e, 0x3,0x36,0x2e, 0x2,0x35,0x4f, + 0x2,0x3c,0x29, 0x3,0x3b,0x71, 0x1,0x5f,0x41, 0x3,0x3b,0x70, + 0x2,0x3c,0x2f, 0x2,0x3b,0x7c, 0x2,0x3c,0x2c, 0x2,0x42,0x7d, + 0x1,0x5f,0x44, 0x2,0x3c,0x30, 0x2,0x3c,0x33, 0x1,0x5f,0x43, + 0x2,0x3c,0x21, 0x2,0x3c,0x32, 0x2,0x3c,0x31, 0x1,0x5f,0x45, + 0x2,0x3b,0x78, 0x1,0x5f,0x40, 0x1,0x5f,0x48, 0x3,0x3b,0x73, + 0x1,0x5f,0x46, 0x2,0x3c,0x2e, 0x4,0x37,0x71, 0x2,0x3c,0x24, + 0x1,0x5f,0x4a, 0x2,0x3c,0x35, 0x2,0x3c,0x2d, 0x2,0x3c,0x36, + 0x1,0x5f,0x52, 0x1,0x5f,0x50, 0x2,0x3c,0x2b, 0x2,0x3c,0x2a, + 0x3,0x3b,0x67, 0x2,0x3c,0x28, 0x2,0x3c,0x22, 0x1,0x5f,0x49, + 0x3,0x3b,0x66, 0x1,0x5f,0x47, 0x2,0x2f,0x3b, 0x2,0x3b,0x79, + 0x3,0x3b,0x68, 0x2,0x43,0x3d, 0x2,0x3b,0x7a, 0x1,0x5f,0x42, + 0x1,0x5f,0x4f, 0x2,0x43,0x21, 0x4,0x37,0x60, 0x1,0x5f,0x4b, + 0x1,0x5f,0x4c, 0x2,0x3b,0x7b, 0x2,0x3c,0x34, 0x2,0x42,0x7e, + 0x2,0x3c,0x25, 0x2,0x3b,0x7e, 0x1,0x5f,0x4e, 0x2,0x3c,0x26, + 0x2,0x3c,0x23, 0x3,0x3b,0x72, 0x3,0x3b,0x6d, 0x1,0x5f,0x53, + 0x4,0x37,0x6f, 0x3,0x3b,0x6f, 0x3,0x65,0x21, 0x1,0x64,0x38, + 0x3,0x41,0x49, 0x3,0x41,0x32, 0x2,0x43,0x24, 0x2,0x43,0x37, + 0x2,0x43,0x3c, 0x2,0x43,0x30, 0x1,0x64,0x34, 0x2,0x43,0x41, + 0x1,0x64,0x31, 0x2,0x43,0x22, 0x3,0x41,0x3a, 0x2,0x43,0x23, + 0x1,0x64,0x2a, 0x1,0x64,0x33, 0x2,0x43,0x2a, 0x1,0x64,0x36, + 0x1,0x64,0x37, 0x2,0x43,0x2b, 0x3,0x41,0x38, 0x2,0x43,0x38, + 0x2,0x43,0x3e, 0x1,0x64,0x32, 0x3,0x41,0x3e, 0x1,0x64,0x2c, + 0x2,0x43,0x29, 0x2,0x43,0x25, 0x2,0x43,0x40, 0x2,0x43,0x2e, + 0x2,0x43,0x2f, 0x2,0x43,0x26, 0x2,0x43,0x3a, 0x2,0x43,0x31, + 0x2,0x43,0x3b, 0x2,0x43,0x33, 0x3,0x41,0x3d, 0x1,0x64,0x2d, + 0x2,0x4a,0x40, 0x1,0x64,0x30, 0x1,0x64,0x2e, 0x2,0x43,0x3f, + 0x2,0x43,0x36, 0x2,0x43,0x32, 0x3,0x41,0x36, 0x3,0x41,0x33, + 0x2,0x43,0x27, 0x1,0x68,0x7a, 0x2,0x43,0x35, 0x1,0x64,0x35, + 0x2,0x43,0x2d, 0x3,0x41,0x34, 0x2,0x43,0x2c, 0x3,0x41,0x48, + 0x3,0x47,0x25, 0x3,0x41,0x42, 0x1,0x64,0x2f, 0x1,0x64,0x2b, + 0x2,0x4a,0x55, 0x2,0x43,0x39, 0x2,0x43,0x34, 0x2,0x43,0x28, + 0x3,0x41,0x44, 0x3,0x41,0x45, 0x3,0x66,0x76, 0x2,0x4a,0x50, + 0x3,0x46,0x78, 0x2,0x4a,0x41, 0x2,0x4a,0x4c, 0x3,0x47,0x28, + 0x2,0x4a,0x53, 0x1,0x68,0x78, 0x1,0x5f,0x51, 0x2,0x4a,0x51, + 0x1,0x68,0x73, 0x3,0x46,0x7e, 0x3,0x47,0x24, 0x3,0x46,0x7a, + 0x1,0x68,0x72, 0x2,0x4a,0x58, 0x4,0x43,0x5d, 0x2,0x4a,0x42, + 0x2,0x4a,0x4f, 0x2,0x4a,0x43, 0x2,0x4a,0x4e, 0x1,0x68,0x76, + 0x2,0x4a,0x52, 0x2,0x3c,0x27, 0x3,0x47,0x21, 0x4,0x43,0x5e, + 0x3,0x47,0x2a, 0x2,0x4a,0x59, 0x2,0x4a,0x4a, 0x1,0x68,0x79, + 0x2,0x50,0x61, 0x1,0x6c,0x77, 0x3,0x47,0x23, 0x2,0x4a,0x57, + 0x2,0x4a,0x56, 0x1,0x68,0x7b, 0x2,0x50,0x54, 0x1,0x6c,0x78, + 0x2,0x50,0x55, 0x3,0x47,0x22, 0x2,0x4a,0x46, 0x2,0x4a,0x47, + 0x2,0x4a,0x44, 0x2,0x4a,0x49, 0x2,0x4a,0x45, 0x2,0x4a,0x5a, + 0x1,0x68,0x75, 0x1,0x6c,0x79, 0x1,0x68,0x77, 0x1,0x68,0x7c, + 0x3,0x46,0x7b, 0x2,0x4a,0x48, 0x3,0x47,0x29, 0x2,0x4a,0x54, + 0x3,0x4c,0x2d, 0x3,0x47,0x26, 0x2,0x4a,0x4d, 0x3,0x4c,0x35, + 0x2,0x50,0x58, 0x3,0x4c,0x38, 0x1,0x68,0x71, 0x1,0x6c,0x7c, + 0x2,0x57,0x35, 0x2,0x50,0x5d, 0x2,0x50,0x5c, 0x2,0x50,0x5e, + 0x3,0x4c,0x30, 0x3,0x4c,0x2f, 0x2,0x50,0x5b, 0x1,0x6c,0x7d, + 0x3,0x4c,0x3b, 0x1,0x6d,0x25, 0x1,0x6d,0x22, 0x3,0x4c,0x31, + 0x1,0x6d,0x23, 0x2,0x50,0x56, 0x2,0x50,0x59, 0x2,0x50,0x63, + 0x1,0x6d,0x2b, 0x1,0x6d,0x29, 0x3,0x4c,0x2e, 0x2,0x50,0x5a, + 0x2,0x3b,0x7d, 0x1,0x6c,0x7a, 0x2,0x50,0x60, 0x2,0x50,0x57, + 0x3,0x4c,0x3e, 0x1,0x6d,0x2c, 0x2,0x50,0x5f, 0x1,0x68,0x74, + 0x1,0x6d,0x21, 0x2,0x4a,0x4b, 0x3,0x4c,0x3f, 0x3,0x4c,0x34, + 0x1,0x6d,0x24, 0x3,0x4c,0x3d, 0x1,0x6d,0x28, 0x1,0x6d,0x2a, + 0x1,0x6d,0x27, 0x1,0x6d,0x26, 0x3,0x4c,0x3a, 0x1,0x6c,0x7e, + 0x2,0x50,0x62, 0x1,0x6c,0x7b, 0x1,0x6d,0x2d, 0x3,0x4c,0x39, + 0x3,0x65,0x22, 0x3,0x4c,0x37, 0x1,0x70,0x61, 0x1,0x70,0x62, + 0x2,0x57,0x34, 0x1,0x70,0x6b, 0x1,0x70,0x68, 0x3,0x50,0x70, + 0x1,0x70,0x5f, 0x1,0x70,0x66, 0x2,0x57,0x36, 0x1,0x70,0x64, + 0x1,0x70,0x5e, 0x3,0x4c,0x32, 0x1,0x70,0x65, 0x3,0x50,0x77, + 0x2,0x57,0x33, 0x1,0x73,0x64, 0x1,0x70,0x60, 0x5,0x54,0x5e, + 0x1,0x70,0x67, 0x1,0x73,0x63, 0x2,0x57,0x32, 0x2,0x57,0x31, + 0x3,0x50,0x76, 0x1,0x70,0x69, 0x3,0x50,0x6f, 0x1,0x70,0x6a, + 0x3,0x50,0x79, 0x2,0x57,0x30, 0x2,0x57,0x2f, 0x1,0x73,0x65, + 0x2,0x57,0x39, 0x1,0x70,0x63, 0x2,0x57,0x37, 0x3,0x50,0x75, + 0x3,0x54,0x64, 0x1,0x73,0x66, 0x3,0x54,0x67, 0x1,0x73,0x6b, + 0x2,0x5c,0x75, 0x2,0x5c,0x77, 0x3,0x57,0x6b, 0x1,0x73,0x68, + 0x3,0x57,0x6d, 0x2,0x5c,0x78, 0x2,0x5c,0x74, 0x3,0x57,0x6c, + 0x2,0x5c,0x76, 0x1,0x73,0x69, 0x1,0x73,0x6c, 0x3,0x54,0x69, + 0x2,0x5c,0x73, 0x1,0x73,0x67, 0x1,0x73,0x6a, 0x1,0x76,0x45, + 0x2,0x57,0x38, 0x1,0x76,0x44, 0x7,0x3f,0x62, 0x3,0x57,0x6a, + 0x1,0x76,0x4a, 0x2,0x61,0x60, 0x3,0x57,0x70, 0x1,0x76,0x48, + 0x1,0x76,0x49, 0x2,0x61,0x63, 0x2,0x61,0x5f, 0x1,0x76,0x46, + 0x2,0x61,0x5d, 0x1,0x78,0x38, 0x2,0x61,0x61, 0x4,0x5b,0x36, + 0x2,0x61,0x62, 0x2,0x61,0x5e, 0x3,0x57,0x6e, 0x1,0x76,0x47, + 0x2,0x65,0x4d, 0x3,0x5a,0x3b, 0x2,0x65,0x50, 0x3,0x5a,0x3c, + 0x3,0x5a,0x3a, 0x2,0x65,0x51, 0x2,0x65,0x4f, 0x2,0x65,0x52, + 0x1,0x78,0x39, 0x2,0x65,0x4e, 0x3,0x5e,0x31, 0x2,0x68,0x7a, + 0x1,0x79,0x6f, 0x2,0x68,0x79, 0x2,0x68,0x78, 0x2,0x68,0x77, + 0x1,0x79,0x6e, 0x1,0x79,0x70, 0x3,0x65,0x23, 0x2,0x6b,0x5b, + 0x1,0x7a,0x6d, 0x1,0x7a,0x6c, 0x3,0x5f,0x4a, 0x3,0x5f,0x4b, + 0x2,0x6d,0x4f, 0x2,0x6d,0x4e, 0x2,0x6d,0x51, 0x1,0x7c,0x37, + 0x1,0x7b,0x61, 0x2,0x6f,0x2c, 0x2,0x6d,0x50, 0x3,0x5f,0x49, + 0x3,0x60,0x32, 0x2,0x6f,0x2b, 0x1,0x7c,0x39, 0x1,0x7c,0x38, + 0x1,0x7c,0x5f, 0x2,0x70,0x37, 0x2,0x70,0x7d, 0x1,0x45,0x45, + 0x6,0x23,0x6c, 0x3,0x2c,0x72, 0x2,0x3c,0x37, 0x2,0x57,0x3a, + 0x3,0x21,0x67, 0x3,0x21,0x68, 0x1,0x48,0x2d, 0x2,0x22,0x4d, + 0x1,0x4a,0x53, 0x1,0x4a,0x51, 0x4,0x24,0x3f, 0x1,0x4a,0x52, + 0x4,0x24,0x3e, 0x2,0x27,0x22, 0x1,0x4d,0x73, 0x1,0x51,0x49, + 0x3,0x2c,0x74, 0x2,0x2a,0x68, 0x3,0x2c,0x76, 0x2,0x2a,0x69, + 0x3,0x2c,0x73, 0x1,0x51,0x4a, 0x2,0x2f,0x50, 0x4,0x2d,0x43, + 0x1,0x55,0x66, 0x1,0x55,0x67, 0x2,0x2f,0x4f, 0x3,0x31,0x3d, + 0x4,0x2d,0x44, 0x3,0x36,0x37, 0x3,0x36,0x36, 0x1,0x5a,0x77, + 0x4,0x32,0x2b, 0x1,0x5a,0x73, 0x4,0x32,0x2f, 0x2,0x35,0x69, + 0x1,0x5a,0x7a, 0x1,0x5a,0x79, 0x1,0x5a,0x72, 0x1,0x5a,0x75, + 0x1,0x5a,0x78, 0x1,0x5a,0x74, 0x3,0x36,0x34, 0x2,0x3c,0x3b, + 0x1,0x5a,0x71, 0x1,0x5f,0x54, 0x3,0x3b,0x74, 0x3,0x3b,0x75, + 0x3,0x3b,0x76, 0x1,0x5f,0x56, 0x1,0x5f,0x57, 0x2,0x3c,0x3a, + 0x2,0x3c,0x3d, 0x1,0x5f,0x55, 0x2,0x3c,0x38, 0x2,0x3c,0x3c, + 0x2,0x3c,0x39, 0x3,0x41,0x4b, 0x1,0x64,0x39, 0x3,0x41,0x4e, + 0x4,0x3d,0x5d, 0x2,0x43,0x42, 0x3,0x41,0x4d, 0x3,0x47,0x30, + 0x1,0x68,0x7d, 0x2,0x4a,0x5b, 0x1,0x70,0x6c, 0x1,0x6d,0x2e, + 0x2,0x50,0x64, 0x1,0x6d,0x2f, 0x1,0x6d,0x30, 0x2,0x50,0x66, + 0x2,0x50,0x65, 0x2,0x50,0x67, 0x2,0x57,0x3c, 0x2,0x57,0x3b, + 0x2,0x5c,0x7a, 0x2,0x5c,0x79, 0x1,0x73,0x6d, 0x1,0x73,0x6e, + 0x2,0x65,0x53, 0x3,0x5c,0x41, 0x1,0x45,0x46, 0x3,0x25,0x58, + 0x3,0x29,0x39, 0x4,0x2d,0x47, 0x3,0x31,0x40, 0x2,0x3c,0x3e, + 0x3,0x36,0x38, 0x3,0x36,0x39, 0x1,0x5f,0x59, 0x1,0x5f,0x58, + 0x2,0x43,0x43, 0x2,0x61,0x64, 0x1,0x7a,0x6e, 0x2,0x6f,0x2d, + 0x1,0x45,0x47, 0x4,0x24,0x41, 0x1,0x55,0x68, 0x3,0x31,0x42, + 0x1,0x5a,0x7c, 0x1,0x5a,0x7b, 0x2,0x3c,0x3f, 0x2,0x3c,0x40, + 0x1,0x64,0x3a, 0x2,0x4a,0x5c, 0x1,0x68,0x7e, 0x2,0x57,0x3d, + 0x4,0x56,0x3f, 0x1,0x45,0x48, 0x1,0x46,0x58, 0x3,0x29,0x3b, + 0x1,0x4d,0x74, 0x2,0x27,0x23, 0x2,0x2a,0x6a, 0x1,0x51,0x4b, + 0x1,0x5a,0x7d, 0x3,0x36,0x3a, 0x2,0x3c,0x41, 0x1,0x5f,0x5a, + 0x1,0x64,0x3b, 0x4,0x3d,0x63, 0x2,0x50,0x68, 0x2,0x50,0x69, + 0x4,0x50,0x4e, 0x3,0x54,0x6b, 0x2,0x5c,0x7b, 0x1,0x76,0x4b, + 0x2,0x70,0x7e, 0x1,0x45,0x49, 0x3,0x29,0x3c, 0x2,0x27,0x24, + 0x1,0x4d,0x75, 0x1,0x51,0x4c, 0x3,0x2c,0x77, 0x2,0x2a,0x6b, + 0x1,0x55,0x69, 0x2,0x2f,0x54, 0x2,0x2f,0x52, 0x2,0x2f,0x53, + 0x1,0x55,0x6a, 0x2,0x2f,0x51, 0x3,0x36,0x3c, 0x4,0x32,0x34, + 0x3,0x36,0x3f, 0x3,0x36,0x3d, 0x1,0x5b,0x21, 0x1,0x5b,0x22, + 0x2,0x35,0x6a, 0x1,0x5b,0x23, 0x1,0x5a,0x7e, 0x2,0x3c,0x42, + 0x3,0x3b,0x79, 0x2,0x3c,0x43, 0x2,0x43,0x44, 0x4,0x3d,0x64, + 0x1,0x69,0x22, 0x1,0x69,0x21, 0x4,0x50,0x4f, 0xf,0x54,0x64, + 0x2,0x5c,0x7c, 0x2,0x61,0x65, 0x3,0x5a,0x3f, 0x2,0x65,0x55, + 0x2,0x65,0x54, 0x2,0x68,0x7b, 0x3,0x21,0x69, 0x2,0x21,0x3e, + 0x1,0x51,0x4d, 0x3,0x36,0x41, 0x3,0x41,0x50, 0x1,0x45,0x4a, + 0x1,0x46,0x59, 0x3,0x22,0x51, 0x1,0x48,0x2f, 0x1,0x48,0x2e, + 0x3,0x23,0x73, 0x3,0x23,0x72, 0x1,0x48,0x30, 0x1,0x48,0x31, + 0x2,0x22,0x4f, 0x2,0x22,0x4e, 0x2,0x24,0x39, 0x1,0x4a,0x54, + 0x2,0x24,0x3c, 0x2,0x24,0x3b, 0x2,0x24,0x3a, 0x2,0x24,0x3d, + 0x3,0x26,0x3d, 0x4,0x26,0x62, 0x1,0x4d,0x76, 0x2,0x27,0x2a, + 0x2,0x27,0x26, 0x2,0x27,0x2f, 0x3,0x29,0x43, 0x3,0x29,0x3e, + 0x1,0x4d,0x7d, 0x3,0x29,0x42, 0x1,0x4d,0x7b, 0x2,0x27,0x2b, + 0x2,0x27,0x27, 0x2,0x27,0x2e, 0x1,0x4d,0x7a, 0x1,0x4e,0x23, + 0x2,0x27,0x29, 0x2,0x27,0x25, 0x1,0x4e,0x22, 0x2,0x27,0x2c, + 0x1,0x4d,0x79, 0x2,0x27,0x2d, 0x1,0x4d,0x7c, 0x1,0x4d,0x7e, + 0x2,0x27,0x31, 0x2,0x27,0x30, 0x2,0x27,0x28, 0x1,0x4d,0x78, + 0x1,0x4d,0x77, 0x1,0x4e,0x21, 0x4,0x26,0x61, 0x3,0x29,0x40, + 0x3,0x29,0x41, 0xf,0x27,0x3e, 0x3,0x2c,0x7e, 0x3,0x2c,0x7a, + 0x2,0x2a,0x70, 0x2,0x2a,0x76, 0x3,0x2d,0x23, 0x1,0x51,0x53, + 0x1,0x51,0x50, 0x2,0x2a,0x6d, 0x2,0x2a,0x72, 0x3,0x2c,0x7c, + 0x1,0x51,0x56, 0x1,0x51,0x4e, 0x2,0x2a,0x71, 0x1,0x51,0x51, + 0x1,0x51,0x54, 0x3,0x2c,0x79, 0x4,0x29,0x67, 0x2,0x2a,0x74, + 0x3,0x2c,0x7d, 0x1,0x51,0x4f, 0x2,0x2a,0x79, 0x1,0x51,0x52, + 0x3,0x2d,0x21, 0x1,0x51,0x55, 0x2,0x2a,0x6e, 0x2,0x2a,0x73, + 0x2,0x2a,0x77, 0x2,0x2a,0x6f, 0x2,0x2a,0x6c, 0x3,0x2d,0x24, + 0x3,0x2d,0x25, 0x2,0x2a,0x78, 0x2,0x2a,0x75, 0x3,0x2d,0x22, + 0x3,0x2c,0x37, 0x3,0x31,0x46, 0x1,0x55,0x72, 0x1,0x55,0x6b, + 0x1,0x55,0x6e, 0x3,0x31,0x4c, 0x1,0x55,0x71, 0x3,0x31,0x44, + 0x2,0x2f,0x57, 0x3,0x31,0x49, 0x1,0x55,0x6c, 0x2,0x2f,0x55, + 0x3,0x31,0x48, 0x1,0x55,0x70, 0x3,0x31,0x4d, 0x3,0x31,0x45, + 0x1,0x55,0x6d, 0x3,0x31,0x43, 0x2,0x2f,0x58, 0x1,0x55,0x6f, + 0x3,0x36,0x42, 0x4,0x32,0x39, 0x2,0x35,0x6e, 0x1,0x5b,0x25, + 0x2,0x35,0x6d, 0x2,0x35,0x6f, 0x1,0x5b,0x24, 0x1,0x5b,0x29, + 0x2,0x2f,0x56, 0x3,0x31,0x4b, 0x2,0x35,0x6c, 0x2,0x35,0x70, + 0x3,0x36,0x44, 0x1,0x5b,0x26, 0x2,0x35,0x6b, 0x1,0x5b,0x28, + 0x3,0x36,0x45, 0x1,0x5b,0x27, 0x3,0x3c,0x26, 0x2,0x3c,0x4a, + 0x3,0x3b,0x7d, 0x2,0x3c,0x45, 0x3,0x3c,0x25, 0x1,0x5f,0x5b, + 0x1,0x5f,0x5f, 0x1,0x5f,0x5c, 0x2,0x3c,0x48, 0x2,0x3c,0x4b, + 0x3,0x3c,0x23, 0x1,0x5f,0x5d, 0x4,0x38,0x24, 0x1,0x5f,0x5e, + 0x1,0x5f,0x63, 0x2,0x43,0x4d, 0x2,0x3c,0x49, 0x1,0x5f,0x61, + 0x2,0x3c,0x46, 0x2,0x3c,0x44, 0x3,0x3b,0x7c, 0x1,0x5f,0x62, + 0x3,0x3b,0x7e, 0x2,0x3c,0x47, 0x3,0x3c,0x24, 0x1,0x64,0x41, + 0x4,0x3d,0x69, 0x2,0x43,0x45, 0x1,0x64,0x3e, 0x1,0x64,0x3f, + 0x1,0x64,0x3d, 0x2,0x43,0x4a, 0x2,0x43,0x49, 0x2,0x43,0x46, + 0x1,0x64,0x43, 0x3,0x41,0x5b, 0x3,0x41,0x56, 0x2,0x43,0x48, + 0x1,0x5f,0x60, 0x3,0x41,0x59, 0x3,0x41,0x51, 0x2,0x43,0x4c, + 0x2,0x43,0x47, 0x1,0x64,0x40, 0x1,0x64,0x3c, 0x1,0x64,0x42, + 0x2,0x43,0x4b, 0x3,0x47,0x34, 0x4,0x43,0x6b, 0x3,0x47,0x35, + 0x1,0x69,0x25, 0x4,0x43,0x6f, 0x2,0x4a,0x5f, 0x2,0x4a,0x5e, + 0x2,0x4a,0x5d, 0x1,0x69,0x23, 0x4,0x43,0x6d, 0x3,0x47,0x39, + 0x3,0x47,0x33, 0x3,0x47,0x37, 0x1,0x69,0x24, 0x2,0x50,0x6c, + 0x2,0x50,0x6f, 0x1,0x6d,0x32, 0x3,0x4c,0x44, 0x3,0x4c,0x46, + 0x1,0x6d,0x31, 0x2,0x50,0x70, 0x2,0x50,0x6b, 0x1,0x6d,0x34, + 0x2,0x50,0x6d, 0x3,0x4c,0x41, 0x1,0x6d,0x33, 0x2,0x50,0x6a, + 0x3,0x4c,0x40, 0x2,0x50,0x6e, 0x1,0x70,0x72, 0x1,0x70,0x6f, + 0x2,0x57,0x46, 0x2,0x57,0x45, 0x3,0x4c,0x43, 0x2,0x57,0x44, + 0x2,0x57,0x3f, 0x3,0x50,0x7d, 0x2,0x57,0x40, 0x3,0x51,0x23, + 0x4,0x50,0x50, 0x3,0x50,0x7a, 0x1,0x70,0x70, 0x3,0x50,0x7e, + 0x1,0x70,0x6d, 0x1,0x70,0x71, 0x2,0x57,0x3e, 0x1,0x70,0x6e, + 0x2,0x57,0x41, 0x2,0x57,0x42, 0x2,0x57,0x47, 0x3,0x51,0x22, + 0x3,0x54,0x71, 0x2,0x57,0x43, 0x3,0x54,0x6f, 0x3,0x54,0x70, + 0x2,0x5c,0x7d, 0x4,0x56,0x41, 0x3,0x54,0x6c, 0x3,0x54,0x6d, + 0x1,0x73,0x70, 0x3,0x54,0x72, 0x2,0x61,0x68, 0x1,0x73,0x6f, + 0x2,0x61,0x66, 0x2,0x61,0x67, 0x1,0x76,0x4c, 0x1,0x78,0x3b, + 0x2,0x65,0x56, 0x3,0x5a,0x43, 0x1,0x78,0x3a, 0x3,0x5a,0x42, + 0x3,0x65,0x26, 0x2,0x68,0x7d, 0x2,0x68,0x7e, 0x3,0x5c,0x42, + 0x1,0x79,0x71, 0x3,0x5c,0x43, 0x2,0x68,0x7c, 0x1,0x7a,0x6f, + 0x4,0x6a,0x4c, 0x2,0x6f,0x2e, 0x1,0x7c,0x3a, 0x2,0x70,0x38, + 0x2,0x70,0x39, 0x3,0x61,0x3f, 0x1,0x45,0x4b, 0x4,0x21,0x7c, + 0x1,0x48,0x32, 0x1,0x48,0x33, 0x1,0x4a,0x55, 0x3,0x26,0x41, + 0x2,0x27,0x32, 0x1,0x51,0x57, 0x1,0x55,0x73, 0x1,0x5b,0x2a, + 0xf,0x32,0x73, 0x1,0x59,0x37, 0x1,0x5f,0x64, 0x1,0x5f,0x65, + 0x1,0x5e,0x32, 0x2,0x3c,0x4c, 0x3,0x65,0x27, 0x1,0x64,0x44, + 0x2,0x4a,0x61, 0x2,0x4a,0x60, 0x3,0x51,0x24, 0x7,0x53,0x47, + 0x1,0x45,0x4c, 0x1,0x48,0x34, 0x2,0x27,0x33, 0x1,0x4e,0x25, + 0x3,0x29,0x45, 0x1,0x4e,0x24, 0x3,0x2d,0x27, 0x2,0x2a,0x7a, + 0x2,0x2a,0x7b, 0x3,0x66,0x32, 0x2,0x2f,0x59, 0x2,0x2f,0x5a, + 0x1,0x55,0x74, 0x1,0x55,0x75, 0x3,0x36,0x48, 0x1,0x55,0x76, + 0x2,0x35,0x71, 0x3,0x36,0x47, 0x3,0x36,0x46, 0x1,0x5b,0x2c, + 0x4,0x38,0x29, 0x1,0x5f,0x67, 0x3,0x3c,0x29, 0x1,0x5f,0x66, + 0x2,0x43,0x4e, 0x2,0x46,0x41, 0x2,0x4a,0x62, 0x2,0x57,0x48, + 0x3,0x51,0x26, 0x3,0x66,0x33, 0x1,0x76,0x4d, 0x1,0x79,0x72, + 0x1,0x45,0x4d, 0x1,0x46,0x5c, 0x1,0x46,0x5d, 0x1,0x46,0x5b, + 0x1,0x46,0x5e, 0x1,0x46,0x5a, 0x3,0x22,0x52, 0x1,0x48,0x37, + 0x3,0x23,0x77, 0x2,0x22,0x57, 0x1,0x48,0x36, 0x1,0x48,0x38, + 0x3,0x23,0x78, 0x3,0x23,0x75, 0x2,0x22,0x52, 0x2,0x22,0x51, + 0x2,0x22,0x54, 0x2,0x22,0x53, 0x2,0x22,0x56, 0x1,0x48,0x35, + 0x2,0x22,0x50, 0x2,0x22,0x55, 0xf,0x22,0x58, 0xf,0x22,0x57, + 0x3,0x26,0x48, 0x2,0x24,0x3e, 0x1,0x4a,0x5f, 0x2,0x24,0x3f, + 0x2,0x24,0x43, 0x1,0x4a,0x5e, 0x3,0x26,0x49, 0x2,0x24,0x47, + 0x2,0x24,0x42, 0x2,0x24,0x45, 0x1,0x4a,0x57, 0x1,0x4a,0x58, + 0x1,0x4a,0x59, 0x1,0x4a,0x5a, 0x3,0x26,0x45, 0x1,0x4a,0x61, + 0x3,0x26,0x44, 0x2,0x24,0x41, 0x1,0x4a,0x5c, 0x1,0x4a,0x62, + 0x3,0x26,0x47, 0x2,0x24,0x40, 0x2,0x24,0x46, 0x3,0x26,0x42, + 0x1,0x4a,0x5b, 0x2,0x24,0x44, 0x1,0x4a,0x5d, 0x1,0x4a,0x56, + 0x1,0x4a,0x60, 0x3,0x26,0x4a, 0xf,0x24,0x22, 0x4,0x24,0x46, + 0xf,0x24,0x53, 0x1,0x4e,0x3a, 0x3,0x29,0x47, 0x2,0x27,0x35, + 0x1,0x4e,0x26, 0x4,0x26,0x69, 0x1,0x4e,0x30, 0x1,0x4e,0x31, + 0x1,0x4e,0x29, 0x1,0x4e,0x3b, 0x1,0x4e,0x2b, 0x2,0x27,0x3d, + 0x1,0x4e,0x36, 0x2,0x27,0x38, 0x1,0x4e,0x2c, 0x2,0x27,0x47, + 0x2,0x27,0x48, 0x2,0x27,0x40, 0x2,0x27,0x39, 0x1,0x4e,0x39, + 0x2,0x27,0x45, 0x1,0x4e,0x34, 0x1,0x4e,0x32, 0x3,0x29,0x52, + 0x2,0x27,0x46, 0x3,0x29,0x49, 0x2,0x27,0x44, 0x2,0x27,0x3c, + 0x2,0x27,0x34, 0x2,0x27,0x3b, 0x1,0x4e,0x2d, 0x4,0x26,0x65, + 0x1,0x4e,0x33, 0x3,0x29,0x4a, 0x1,0x4e,0x27, 0x2,0x27,0x3f, + 0x2,0x27,0x3e, 0x2,0x27,0x36, 0x3,0x29,0x4f, 0x1,0x4e,0x35, + 0x2,0x27,0x42, 0x2,0x27,0x37, 0x1,0x4e,0x38, 0x2,0x27,0x49, + 0x1,0x4e,0x28, 0x3,0x29,0x48, 0x1,0x4e,0x2f, 0x2,0x27,0x3a, + 0x2,0x27,0x43, 0x1,0x4e,0x37, 0x4,0x26,0x67, 0x1,0x4e,0x2a, + 0x1,0x4e,0x2e, 0x4,0x26,0x6a, 0x2,0x27,0x41, 0xf,0x27,0x4e, + 0x3,0x29,0x4e, 0x3,0x29,0x4c, 0x3,0x65,0x28, 0xf,0x27,0x50, + 0x3,0x65,0x29, 0x2,0x2b,0x3d, 0x1,0x51,0x5f, 0x1,0x51,0x6c, + 0x3,0x2d,0x36, 0x2,0x2b,0x38, 0x2,0x2b,0x2e, 0x1,0x51,0x65, + 0x2,0x2b,0x2c, 0x1,0x51,0x5e, 0x2,0x2b,0x27, 0x1,0x51,0x68, + 0x2,0x2b,0x34, 0x2,0x2b,0x21, 0x2,0x2b,0x23, 0x3,0x2d,0x2e, + 0x4,0x2d,0x59, 0x4,0x29,0x6e, 0x3,0x2d,0x30, 0x2,0x2b,0x26, + 0x2,0x2a,0x7c, 0x2,0x2b,0x33, 0x2,0x2b,0x43, 0x1,0x51,0x63, + 0x2,0x2b,0x28, 0x2,0x2b,0x3a, 0x3,0x2d,0x2d, 0x2,0x2a,0x7e, + 0x2,0x2b,0x41, 0x2,0x2b,0x42, 0x2,0x2b,0x45, 0x2,0x2b,0x3c, + 0x2,0x2b,0x2d, 0x2,0x2b,0x35, 0x1,0x51,0x69, 0x1,0x51,0x5c, + 0x1,0x51,0x64, 0x1,0x51,0x70, 0x1,0x51,0x59, 0x1,0x51,0x5b, + 0x3,0x2d,0x31, 0x3,0x2d,0x2b, 0x3,0x2d,0x3a, 0x2,0x2b,0x25, + 0x1,0x51,0x6d, 0x1,0x51,0x66, 0x2,0x2b,0x3f, 0x2,0x2b,0x22, + 0x1,0x51,0x6f, 0x1,0x51,0x6a, 0x2,0x2b,0x2b, 0x4,0x29,0x6d, + 0x4,0x2d,0x4e, 0x1,0x51,0x6e, 0x2,0x2b,0x32, 0x2,0x2b,0x2a, + 0x1,0x51,0x67, 0x2,0x2b,0x3e, 0x2,0x2b,0x36, 0x3,0x2d,0x2a, + 0x1,0x51,0x61, 0x2,0x2b,0x44, 0x2,0x2b,0x29, 0x1,0x51,0x5d, + 0x2,0x2b,0x3b, 0x2,0x2b,0x31, 0x1,0x51,0x62, 0x2,0x2b,0x37, + 0x1,0x51,0x5a, 0x2,0x2a,0x7d, 0x1,0x51,0x6b, 0x1,0x56,0x27, + 0x1,0x51,0x60, 0x2,0x2b,0x30, 0x2,0x2b,0x2f, 0x2,0x2b,0x24, + 0x3,0x29,0x51, 0x2,0x2b,0x40, 0x3,0x2d,0x34, 0x2,0x2b,0x39, + 0x3,0x2d,0x32, 0x1,0x51,0x58, 0x3,0x2d,0x39, 0x3,0x2d,0x37, + 0x6,0x31,0x72, 0x3,0x2d,0x38, 0x3,0x65,0x2b, 0x3,0x65,0x2a, + 0xf,0x2b,0x48, 0x2,0x2f,0x6e, 0x1,0x56,0x2e, 0x2,0x2f,0x6f, + 0x3,0x31,0x5d, 0x2,0x2f,0x63, 0x1,0x56,0x23, 0x1,0x56,0x2f, + 0x3,0x31,0x57, 0x2,0x2f,0x5c, 0x3,0x31,0x53, 0x2,0x2f,0x65, + 0x2,0x2f,0x6d, 0x3,0x31,0x5b, 0x2,0x2f,0x5b, 0x2,0x2f,0x76, + 0x1,0x55,0x77, 0x3,0x31,0x5e, 0x3,0x31,0x64, 0x3,0x31,0x50, + 0x2,0x2f,0x75, 0x2,0x2f,0x70, 0x3,0x31,0x5f, 0x2,0x2f,0x71, + 0x1,0x56,0x21, 0x1,0x56,0x2c, 0x2,0x2f,0x67, 0x3,0x31,0x56, + 0x2,0x2f,0x68, 0x2,0x2f,0x72, 0x2,0x2f,0x69, 0x3,0x31,0x63, + 0x2,0x2f,0x64, 0x2,0x2f,0x5e, 0x2,0x2f,0x5f, 0x2,0x2f,0x6c, + 0x2,0x2f,0x66, 0x3,0x31,0x54, 0x3,0x31,0x4f, 0x1,0x55,0x78, + 0x1,0x55,0x7c, 0x2,0x2f,0x74, 0x2,0x2f,0x60, 0x1,0x56,0x2a, + 0x1,0x56,0x26, 0x3,0x31,0x5a, 0x4,0x2d,0x55, 0x1,0x56,0x29, + 0x1,0x56,0x30, 0x1,0x55,0x7d, 0x1,0x56,0x2b, 0x2,0x2f,0x6b, + 0x1,0x56,0x2d, 0x1,0x55,0x7a, 0x3,0x31,0x59, 0x1,0x55,0x79, + 0x2,0x2f,0x5d, 0x4,0x2d,0x4f, 0x2,0x2f,0x61, 0x1,0x56,0x24, + 0x2,0x2f,0x73, 0x2,0x2f,0x6a, 0x2,0x2f,0x62, 0x1,0x56,0x28, + 0x1,0x56,0x25, 0x3,0x2d,0x2f, 0x1,0x55,0x7b, 0x1,0x55,0x7e, + 0x3,0x31,0x62, 0x3,0x31,0x58, 0xf,0x30,0x24, 0x3,0x31,0x61, + 0x3,0x31,0x60, 0x3,0x65,0x2d, 0x3,0x65,0x2c, 0x2,0x36,0x28, + 0x3,0x36,0x55, 0x2,0x35,0x76, 0x2,0x35,0x77, 0x2,0x35,0x7b, + 0x3,0x36,0x60, 0x2,0x36,0x2c, 0x2,0x36,0x29, 0x3,0x36,0x4e, + 0x2,0x36,0x22, 0x2,0x36,0x21, 0x1,0x5b,0x33, 0x2,0x36,0x25, + 0x2,0x36,0x34, 0x2,0x35,0x72, 0x3,0x36,0x5b, 0x2,0x36,0x35, + 0x2,0x36,0x27, 0x2,0x36,0x39, 0x2,0x36,0x2d, 0x1,0x5b,0x32, + 0x2,0x36,0x2b, 0x1,0x5b,0x2d, 0x1,0x5b,0x42, 0x1,0x5b,0x38, + 0x3,0x36,0x57, 0x1,0x5b,0x3c, 0x1,0x5b,0x3b, 0x2,0x35,0x73, + 0x4,0x32,0x3f, 0x2,0x36,0x32, 0x2,0x36,0x38, 0x2,0x36,0x30, + 0x2,0x36,0x37, 0x3,0x36,0x51, 0x2,0x36,0x24, 0x2,0x35,0x74, + 0x2,0x36,0x36, 0x2,0x36,0x26, 0x1,0x5b,0x30, 0x1,0x5b,0x3d, + 0x3,0x36,0x5a, 0x2,0x36,0x2f, 0x1,0x5b,0x36, 0x3,0x36,0x4d, + 0x3,0x36,0x5c, 0x3,0x36,0x50, 0x2,0x36,0x2e, 0x2,0x35,0x75, + 0x1,0x5b,0x3e, 0x3,0x36,0x4b, 0x1,0x5b,0x40, 0x2,0x36,0x31, + 0x1,0x5b,0x41, 0x1,0x5b,0x2f, 0x2,0x35,0x7c, 0x2,0x36,0x33, + 0x3,0x36,0x54, 0x3,0x34,0x78, 0x1,0x5b,0x35, 0x1,0x5b,0x3f, + 0x2,0x35,0x7e, 0x2,0x36,0x2a, 0x2,0x35,0x79, 0x2,0x35,0x7d, + 0x1,0x5b,0x3a, 0x2,0x35,0x78, 0x1,0x5b,0x2e, 0x1,0x5b,0x37, + 0x1,0x5b,0x34, 0x2,0x36,0x23, 0x1,0x56,0x22, 0x2,0x3c,0x63, + 0x1,0x5b,0x31, 0x3,0x36,0x4c, 0x3,0x36,0x52, 0x3,0x36,0x5e, + 0x3,0x36,0x5f, 0xf,0x35,0x57, 0x3,0x36,0x56, 0x3,0x3c,0x45, + 0x1,0x5b,0x39, 0x3,0x3c,0x41, 0x2,0x3c,0x66, 0x2,0x3c,0x7c, + 0x2,0x3c,0x71, 0x1,0x5f,0x7b, 0x3,0x3c,0x38, 0x1,0x5f,0x76, + 0x2,0x3c,0x60, 0x1,0x5f,0x77, 0x2,0x3c,0x70, 0x3,0x3c,0x3e, + 0x2,0x3c,0x69, 0x2,0x3c,0x76, 0x1,0x5f,0x73, 0x2,0x3c,0x4e, + 0x2,0x3c,0x78, 0x1,0x5f,0x69, 0x2,0x3c,0x56, 0x1,0x5f,0x6c, + 0x1,0x5f,0x6b, 0x4,0x38,0x32, 0x1,0x5f,0x7c, 0x3,0x36,0x53, + 0x2,0x3c,0x50, 0x2,0x3c,0x72, 0x2,0x3c,0x73, 0x1,0x5f,0x6e, + 0x1,0x5f,0x6a, 0x2,0x3c,0x5e, 0x3,0x3c,0x3d, 0x1,0x5f,0x75, + 0x2,0x3c,0x59, 0x3,0x3c,0x32, 0x2,0x3c,0x74, 0x1,0x5f,0x71, + 0x2,0x3c,0x6c, 0x2,0x3c,0x79, 0x2,0x3c,0x53, 0x2,0x3c,0x58, + 0x2,0x3c,0x52, 0x3,0x3c,0x2a, 0x1,0x5f,0x70, 0x2,0x3c,0x65, + 0x2,0x43,0x64, 0x2,0x3c,0x54, 0x1,0x5f,0x74, 0x2,0x3c,0x5d, + 0x2,0x3c,0x75, 0x1,0x5f,0x6f, 0x2,0x3c,0x5a, 0x2,0x3c,0x57, + 0x2,0x3c,0x68, 0x1,0x5f,0x72, 0x1,0x5f,0x68, 0x1,0x5f,0x7e, + 0x2,0x3c,0x6b, 0x2,0x3c,0x6a, 0x3,0x3c,0x31, 0x3,0x3c,0x42, + 0x3,0x3c,0x39, 0x3,0x3c,0x3b, 0x3,0x3c,0x34, 0x3,0x3c,0x2f, + 0x2,0x3c,0x4f, 0x1,0x5f,0x6d, 0x2,0x3c,0x77, 0x2,0x3c,0x5f, + 0x2,0x3c,0x61, 0x3,0x3c,0x37, 0x2,0x3c,0x6e, 0x2,0x3c,0x6d, + 0x2,0x3c,0x4d, 0x1,0x5f,0x78, 0x1,0x5f,0x7a, 0x2,0x3c,0x55, + 0x2,0x3c,0x5c, 0x2,0x3c,0x64, 0x1,0x5f,0x79, 0x2,0x3c,0x5b, + 0x2,0x3c,0x67, 0x2,0x3c,0x7a, 0xf,0x3b,0x70, 0x2,0x3c,0x6f, + 0x3,0x3c,0x3c, 0xf,0x3c,0x21, 0x3,0x3c,0x44, 0x3,0x3c,0x33, + 0x2,0x3c,0x7b, 0xf,0x3c,0x29, 0x3,0x65,0x2f, 0x2,0x3c,0x51, + 0xf,0x3b,0x6e, 0x3,0x65,0x2e, 0x3,0x3c,0x40, 0x2,0x43,0x78, + 0x1,0x64,0x4c, 0x3,0x41,0x65, 0x2,0x43,0x76, 0x2,0x43,0x61, + 0x2,0x43,0x66, 0x2,0x43,0x5f, 0x3,0x41,0x77, 0x2,0x43,0x72, + 0x2,0x43,0x51, 0x2,0x43,0x58, 0x4,0x3d,0x71, 0x2,0x43,0x70, + 0x2,0x43,0x7a, 0x2,0x43,0x62, 0x3,0x41,0x68, 0x2,0x43,0x55, + 0x2,0x43,0x68, 0x2,0x43,0x6d, 0x2,0x43,0x59, 0x3,0x41,0x6b, + 0x2,0x43,0x6a, 0x2,0x43,0x56, 0x3,0x41,0x5d, 0x3,0x41,0x75, + 0x2,0x43,0x5d, 0x2,0x43,0x5e, 0x1,0x64,0x4e, 0x2,0x43,0x71, + 0x2,0x43,0x6f, 0x3,0x41,0x73, 0x2,0x43,0x52, 0x2,0x43,0x74, + 0x3,0x41,0x74, 0x2,0x43,0x75, 0x2,0x43,0x77, 0x1,0x64,0x52, + 0x1,0x64,0x4a, 0x3,0x41,0x6f, 0x2,0x35,0x7a, 0x2,0x43,0x5a, + 0x2,0x43,0x6c, 0x2,0x43,0x5b, 0x1,0x64,0x47, 0x1,0x64,0x57, + 0x2,0x43,0x73, 0x1,0x64,0x55, 0x1,0x64,0x51, 0x2,0x43,0x50, + 0x1,0x64,0x49, 0x3,0x41,0x79, 0x2,0x43,0x53, 0x1,0x64,0x56, + 0x3,0x41,0x78, 0x2,0x43,0x63, 0x2,0x43,0x4f, 0x3,0x41,0x76, + 0x1,0x64,0x4f, 0x2,0x43,0x67, 0x2,0x43,0x57, 0x1,0x64,0x50, + 0x2,0x43,0x60, 0x1,0x64,0x46, 0x1,0x5f,0x7d, 0x2,0x43,0x69, + 0x2,0x3c,0x62, 0x2,0x43,0x54, 0x4,0x3d,0x6c, 0x3,0x41,0x6d, + 0x2,0x43,0x6e, 0x1,0x64,0x4b, 0x2,0x43,0x6b, 0x1,0x64,0x48, + 0x2,0x43,0x65, 0x1,0x64,0x53, 0x2,0x43,0x5c, 0x2,0x43,0x79, + 0x3,0x41,0x6a, 0x3,0x41,0x7b, 0xf,0x42,0x49, 0xf,0x42,0x47, + 0x1,0x64,0x4d, 0x2,0x45,0x2c, 0x3,0x41,0x72, 0x1,0x64,0x54, + 0xf,0x42,0x28, 0xf,0x42,0x3c, 0x2,0x4a,0x70, 0x2,0x4a,0x6e, + 0x3,0x47,0x3a, 0x2,0x4b,0x26, 0x2,0x4a,0x6c, 0x3,0x47,0x3d, + 0x2,0x4a,0x7e, 0x1,0x64,0x45, 0x1,0x69,0x28, 0x2,0x4a,0x68, + 0x2,0x4b,0x25, 0x3,0x47,0x51, 0x2,0x4a,0x6d, 0x2,0x4a,0x7b, + 0x1,0x69,0x2d, 0x1,0x69,0x26, 0x3,0x47,0x4e, 0x2,0x4b,0x23, + 0x3,0x47,0x46, 0x2,0x4a,0x66, 0x2,0x4b,0x22, 0x3,0x47,0x47, + 0x1,0x69,0x38, 0x2,0x4a,0x77, 0x2,0x4b,0x29, 0x1,0x69,0x36, + 0x2,0x4a,0x6f, 0x1,0x69,0x27, 0x2,0x4a,0x71, 0x2,0x4b,0x21, + 0x1,0x69,0x30, 0x2,0x4a,0x6a, 0x1,0x69,0x34, 0x1,0x69,0x2a, + 0x2,0x4a,0x73, 0x2,0x4a,0x69, 0x2,0x4a,0x63, 0x3,0x47,0x3e, + 0x2,0x4a,0x7d, 0x1,0x69,0x31, 0x2,0x4b,0x28, 0x2,0x4a,0x64, + 0x1,0x69,0x2e, 0x4,0x43,0x77, 0x2,0x4a,0x79, 0x4,0x43,0x79, + 0x1,0x69,0x2f, 0x2,0x4a,0x6b, 0x2,0x4a,0x76, 0x2,0x4a,0x72, + 0x2,0x4a,0x74, 0x3,0x47,0x43, 0x1,0x69,0x29, 0x2,0x4b,0x27, + 0x1,0x69,0x37, 0x2,0x4a,0x75, 0x3,0x47,0x3b, 0x2,0x4b,0x2a, + 0x4,0x44,0x27, 0x3,0x47,0x3c, 0x2,0x4a,0x65, 0x2,0x4a,0x7a, + 0x1,0x69,0x2c, 0x1,0x69,0x35, 0x1,0x69,0x33, 0x2,0x4a,0x67, + 0x2,0x4a,0x7c, 0x1,0x69,0x32, 0x3,0x47,0x45, 0x3,0x47,0x48, + 0x1,0x69,0x2b, 0x2,0x4a,0x78, 0x3,0x47,0x4d, 0x3,0x47,0x44, + 0x4,0x44,0x28, 0x3,0x4c,0x54, 0x2,0x4b,0x24, 0x3,0x47,0x4c, + 0x2,0x50,0x7c, 0x3,0x47,0x42, 0x2,0x50,0x78, 0x2,0x50,0x74, + 0x2,0x51,0x2a, 0x2,0x51,0x27, 0x1,0x6d,0x37, 0x3,0x4c,0x64, + 0x3,0x4c,0x60, 0x2,0x51,0x2e, 0x2,0x50,0x7b, 0x1,0x6d,0x42, + 0x2,0x51,0x24, 0x3,0x4c,0x4f, 0x3,0x4c,0x51, 0x2,0x50,0x77, + 0x2,0x51,0x23, 0x1,0x6d,0x3f, 0x2,0x51,0x37, 0x4,0x4a,0x3d, + 0x2,0x51,0x34, 0x2,0x51,0x26, 0x2,0x50,0x75, 0x3,0x4c,0x5f, + 0x3,0x4c,0x57, 0x2,0x51,0x2b, 0x2,0x51,0x2d, 0x1,0x6d,0x3b, + 0x2,0x51,0x21, 0x2,0x50,0x7a, 0x2,0x50,0x71, 0x1,0x6d,0x38, + 0x1,0x6d,0x40, 0x4,0x4a,0x48, 0x2,0x51,0x30, 0x1,0x6d,0x41, + 0x2,0x50,0x72, 0x2,0x51,0x36, 0x2,0x51,0x29, 0x2,0x51,0x2f, + 0x1,0x6d,0x3e, 0x3,0x4c,0x4d, 0x3,0x4c,0x50, 0x2,0x51,0x2c, + 0x3,0x4c,0x47, 0x2,0x51,0x33, 0x3,0x4c,0x5b, 0x1,0x6d,0x43, + 0x3,0x4c,0x56, 0x1,0x6d,0x3d, 0x2,0x51,0x25, 0x2,0x50,0x76, + 0x2,0x51,0x38, 0x2,0x50,0x73, 0x2,0x51,0x31, 0x1,0x6d,0x3a, + 0x3,0x4c,0x4a, 0x2,0x50,0x7d, 0x3,0x4c,0x49, 0x2,0x50,0x7e, + 0x1,0x6d,0x39, 0x1,0x6d,0x36, 0x2,0x50,0x79, 0x1,0x6d,0x3c, + 0x3,0x4c,0x52, 0x1,0x6d,0x35, 0x3,0x4c,0x62, 0x2,0x51,0x32, + 0x2,0x51,0x35, 0x2,0x51,0x22, 0x2,0x57,0x55, 0x3,0x4c,0x5e, + 0x3,0x4c,0x59, 0xf,0x4f,0x42, 0x3,0x4c,0x61, 0x3,0x65,0x30, + 0x2,0x57,0x4d, 0x3,0x51,0x2c, 0x2,0x57,0x49, 0x1,0x71,0x21, + 0x3,0x51,0x3c, 0x3,0x51,0x38, 0x1,0x70,0x74, 0x1,0x70,0x79, + 0x1,0x70,0x75, 0x2,0x57,0x57, 0x2,0x57,0x62, 0x1,0x70,0x73, + 0x2,0x57,0x4f, 0x2,0x57,0x58, 0x2,0x51,0x28, 0x2,0x57,0x59, + 0x3,0x51,0x28, 0x3,0x51,0x2b, 0x1,0x70,0x7a, 0x3,0x51,0x40, + 0x2,0x57,0x68, 0x1,0x70,0x7e, 0x1,0x71,0x23, 0x2,0x57,0x4b, + 0x3,0x51,0x3b, 0x1,0x70,0x7d, 0x3,0x51,0x31, 0x2,0x57,0x66, + 0x2,0x57,0x67, 0x2,0x57,0x5d, 0x2,0x57,0x5c, 0x2,0x57,0x54, + 0x3,0x51,0x29, 0x3,0x51,0x3e, 0x2,0x57,0x5e, 0x2,0x57,0x65, + 0x2,0x57,0x64, 0x3,0x51,0x2f, 0x1,0x70,0x78, 0x1,0x70,0x76, + 0x2,0x57,0x56, 0x2,0x57,0x53, 0x3,0x51,0x44, 0x2,0x57,0x50, + 0x2,0x57,0x63, 0x1,0x71,0x22, 0x2,0x57,0x61, 0x1,0x70,0x7c, + 0x1,0x70,0x7b, 0x3,0x51,0x27, 0x2,0x57,0x5b, 0x4,0x4a,0x4b, + 0x2,0x57,0x4a, 0x2,0x57,0x4c, 0x2,0x57,0x4e, 0x2,0x57,0x60, + 0x2,0x57,0x5a, 0x1,0x70,0x77, 0x3,0x51,0x2e, 0x2,0x57,0x51, + 0x3,0x51,0x32, 0x2,0x57,0x5f, 0x3,0x51,0x41, 0x3,0x51,0x3a, + 0xf,0x54,0x7b, 0x2,0x57,0x52, 0x3,0x65,0x31, 0xf,0x55,0x29, + 0x3,0x65,0x32, 0x3,0x54,0x75, 0x1,0x73,0x78, 0x2,0x5d,0x31, + 0x1,0x73,0x71, 0x2,0x5d,0x22, 0x3,0x54,0x7b, 0x2,0x5d,0x2d, + 0x1,0x73,0x73, 0x2,0x5d,0x34, 0x3,0x55,0x21, 0x2,0x5d,0x29, + 0x3,0x54,0x7c, 0x2,0x5d,0x24, 0x3,0x54,0x76, 0x4,0x56,0x45, + 0x2,0x5d,0x35, 0x2,0x5c,0x7e, 0x2,0x5d,0x2b, 0x3,0x55,0x27, + 0x1,0x73,0x7a, 0x2,0x5d,0x30, 0x2,0x5d,0x36, 0x2,0x5d,0x2a, + 0x1,0x73,0x72, 0x2,0x5d,0x2c, 0x2,0x5d,0x21, 0x1,0x73,0x79, + 0x3,0x55,0x23, 0x3,0x54,0x7a, 0x2,0x5d,0x33, 0x2,0x5d,0x26, + 0x1,0x73,0x75, 0x3,0x55,0x24, 0x2,0x5d,0x28, 0x2,0x5d,0x25, + 0x1,0x73,0x7b, 0x2,0x5d,0x27, 0x1,0x73,0x74, 0x1,0x73,0x77, + 0x2,0x5d,0x2f, 0x2,0x5d,0x23, 0x2,0x5d,0x32, 0x3,0x54,0x78, + 0x2,0x5d,0x2e, 0x3,0x55,0x29, 0x3,0x57,0x74, 0x1,0x76,0x4f, + 0x2,0x61,0x73, 0x1,0x76,0x54, 0x1,0x76,0x55, 0x3,0x57,0x77, + 0x3,0x58,0x21, 0x3,0x57,0x76, 0x1,0x76,0x4e, 0x2,0x61,0x72, + 0x3,0x57,0x78, 0x2,0x61,0x6f, 0x2,0x61,0x70, 0x1,0x76,0x52, + 0x2,0x61,0x6a, 0x2,0x61,0x6e, 0x1,0x76,0x51, 0x3,0x57,0x7e, + 0x2,0x61,0x6b, 0x3,0x57,0x79, 0x3,0x58,0x23, 0x3,0x57,0x7d, + 0x3,0x57,0x7a, 0x1,0x76,0x53, 0x1,0x76,0x50, 0x3,0x58,0x22, + 0x2,0x61,0x69, 0x2,0x61,0x6d, 0x2,0x61,0x71, 0x3,0x57,0x7b, + 0x3,0x65,0x33, 0x2,0x65,0x5c, 0x2,0x65,0x59, 0x2,0x65,0x62, + 0x3,0x5a,0x44, 0x2,0x65,0x61, 0x2,0x65,0x5f, 0x2,0x65,0x5a, + 0x3,0x5a,0x4f, 0x1,0x78,0x3f, 0x3,0x5a,0x45, 0x3,0x5a,0x4e, + 0x4,0x5f,0x71, 0x3,0x5a,0x47, 0x3,0x5a,0x4d, 0x2,0x65,0x5b, + 0x1,0x78,0x3e, 0x1,0x73,0x76, 0x2,0x65,0x5e, 0x1,0x78,0x3d, + 0x2,0x65,0x63, 0x2,0x65,0x5d, 0x2,0x65,0x58, 0x2,0x61,0x6c, + 0x3,0x5a,0x48, 0x3,0x5a,0x46, 0x1,0x78,0x3c, 0x3,0x65,0x34, + 0x2,0x65,0x57, 0x2,0x69,0x24, 0x3,0x5c,0x49, 0x2,0x69,0x23, + 0x2,0x65,0x60, 0x1,0x79,0x73, 0x3,0x57,0x75, 0x2,0x69,0x27, + 0x2,0x69,0x28, 0x2,0x69,0x22, 0x2,0x69,0x26, 0x4,0x63,0x50, + 0x2,0x69,0x21, 0x3,0x5c,0x47, 0x3,0x65,0x35, 0x4,0x63,0x4e, + 0x2,0x6b,0x5f, 0x2,0x69,0x25, 0x1,0x7a,0x72, 0x1,0x7a,0x70, + 0x2,0x6b,0x5d, 0x3,0x5e,0x35, 0x3,0x5e,0x34, 0x3,0x5e,0x33, + 0x2,0x6b,0x60, 0x3,0x5e,0x37, 0x2,0x6b,0x5c, 0x2,0x6b,0x5e, + 0x1,0x7a,0x71, 0x3,0x5f,0x4f, 0x3,0x5f,0x4e, 0x2,0x6d,0x53, + 0x2,0x6d,0x54, 0x1,0x7b,0x62, 0x2,0x6d,0x52, 0xf,0x69,0x4c, + 0x3,0x65,0x36, 0x3,0x65,0x37, 0x2,0x6f,0x31, 0x1,0x7c,0x3b, + 0x2,0x6f,0x2f, 0x2,0x6f,0x30, 0x2,0x70,0x3a, 0x3,0x60,0x74, + 0xf,0x6b,0x51, 0x1,0x7d,0x23, 0x2,0x71,0x23, 0x2,0x71,0x21, + 0x2,0x71,0x22, 0x2,0x71,0x24, 0x3,0x61,0x40, 0x3,0x61,0x65, + 0x3,0x61,0x41, 0x2,0x72,0x2b, 0x1,0x45,0x4e, 0x1,0x48,0x39, + 0x3,0x23,0x79, 0x1,0x4e,0x3c, 0x4,0x26,0x71, 0x2,0x27,0x4a, + 0x3,0x29,0x53, 0x3,0x29,0x54, 0x2,0x2b,0x46, 0x4,0x29,0x72, + 0x3,0x2d,0x3c, 0x3,0x31,0x66, 0x2,0x2f,0x77, 0x2,0x2f,0x79, + 0x3,0x31,0x65, 0x2,0x2f,0x78, 0x3,0x31,0x67, 0x2,0x2f,0x7a, + 0x1,0x5b,0x43, 0x2,0x36,0x3b, 0x2,0x2f,0x7b, 0x3,0x36,0x62, + 0x2,0x36,0x3a, 0x2,0x36,0x3c, 0x2,0x36,0x3d, 0x2,0x3c,0x7d, + 0x1,0x60,0x22, 0x2,0x3c,0x7e, 0x2,0x3d,0x22, 0x1,0x60,0x23, + 0x1,0x60,0x21, 0x2,0x3d,0x21, 0x3,0x41,0x7d, 0x2,0x44,0x22, + 0x2,0x43,0x7e, 0x2,0x43,0x7d, 0x3,0x41,0x7c, 0x2,0x43,0x7c, + 0x2,0x43,0x7b, 0x1,0x64,0x58, 0x2,0x44,0x21, 0x1,0x69,0x39, + 0x2,0x4b,0x2b, 0x2,0x4b,0x2d, 0x1,0x69,0x3a, 0x2,0x4b,0x2c, + 0x1,0x6d,0x45, 0x3,0x4c,0x66, 0x1,0x6d,0x44, 0x2,0x51,0x39, + 0x3,0x4c,0x65, 0x3,0x4c,0x67, 0x2,0x57,0x6a, 0x2,0x57,0x69, + 0x2,0x57,0x6b, 0x3,0x51,0x46, 0x3,0x51,0x45, 0x1,0x71,0x24, + 0xf,0x55,0x39, 0x2,0x5d,0x37, 0x1,0x73,0x7c, 0x3,0x55,0x2b, + 0x2,0x61,0x74, 0x1,0x76,0x56, 0x2,0x65,0x64, 0x1,0x7b,0x63, + 0x1,0x45,0x4f, 0x1,0x46,0x5f, 0x1,0x48,0x3a, 0x1,0x4a,0x63, + 0x1,0x4e,0x3d, 0x1,0x4e,0x3e, 0x3,0x29,0x55, 0x3,0x29,0x56, + 0x1,0x51,0x71, 0x3,0x2d,0x3d, 0x3,0x31,0x68, 0x2,0x2f,0x7c, + 0x3,0x3c,0x49, 0x3,0x3c,0x47, 0x4,0x44,0x2d, 0x3,0x41,0x7e, + 0x1,0x64,0x59, 0x3,0x42,0x21, 0x3,0x47,0x53, 0x4,0x4a,0x4e, + 0x2,0x52,0x59, 0x1,0x71,0x25, 0x1,0x76,0x57, 0x1,0x45,0x50, + 0x3,0x22,0x53, 0x1,0x48,0x3b, 0x4,0x26,0x76, 0x2,0x27,0x4c, + 0x1,0x4e,0x3f, 0x2,0x27,0x4b, 0x3,0x29,0x58, 0x2,0x2b,0x47, + 0x1,0x51,0x72, 0x2,0x2b,0x48, 0x5,0x29,0x69, 0x1,0x51,0x73, + 0x2,0x2f,0x7e, 0x1,0x56,0x32, 0x1,0x56,0x31, 0x3,0x31,0x6a, + 0x2,0x36,0x42, 0x2,0x36,0x40, 0x2,0x36,0x41, 0x2,0x36,0x3f, + 0x3,0x36,0x64, 0x2,0x36,0x3e, 0x2,0x3d,0x23, 0x2,0x3d,0x26, + 0x1,0x60,0x25, 0x2,0x3d,0x24, 0x1,0x60,0x24, 0x2,0x3d,0x25, + 0x2,0x44,0x23, 0x3,0x42,0x22, 0x4,0x44,0x31, 0x2,0x4b,0x2e, + 0x2,0x4b,0x2f, 0x2,0x4b,0x30, 0x3,0x47,0x54, 0x2,0x51,0x3c, + 0x2,0x51,0x3b, 0x1,0x6d,0x46, 0x2,0x51,0x3a, 0x2,0x51,0x3d, + 0x2,0x57,0x6c, 0x4,0x50,0x6d, 0x5,0x5b,0x72, 0x2,0x57,0x6d, + 0x2,0x57,0x6e, 0x4,0x56,0x52, 0x2,0x5d,0x38, 0x1,0x73,0x7d, + 0x1,0x76,0x58, 0x2,0x65,0x65, 0x1,0x7a,0x73, 0x2,0x21,0x3f, + 0x3,0x29,0x59, 0x1,0x51,0x74, 0x2,0x2b,0x49, 0x1,0x56,0x33, + 0x4,0x32,0x4e, 0x4,0x32,0x50, 0x1,0x5b,0x44, 0x3,0x36,0x65, + 0x1,0x60,0x26, 0x2,0x3d,0x27, 0x3,0x3c,0x4b, 0x1,0x64,0x5b, + 0x1,0x64,0x5a, 0x3,0x42,0x26, 0x2,0x4b,0x31, 0x2,0x4b,0x32, + 0x1,0x6d,0x47, 0x1,0x6d,0x48, 0x2,0x57,0x70, 0x2,0x57,0x6f, + 0x2,0x61,0x75, 0x2,0x6f,0x32, 0x1,0x45,0x51, 0x2,0x21,0x40, + 0x1,0x46,0x60, 0x3,0x23,0x7a, 0x1,0x4a,0x64, 0x2,0x24,0x48, + 0x3,0x29,0x5a, 0x1,0x51,0x75, 0x1,0x64,0x5c, 0x1,0x45,0x52, + 0x2,0x2b,0x4a, 0x1,0x51,0x76, 0x2,0x2b,0x4b, 0x1,0x73,0x7e, + 0x1,0x45,0x53, 0x3,0x65,0x38, 0x3,0x65,0x39, 0x2,0x27,0x4d, + 0x2,0x2b,0x4c, 0x3,0x2d,0x42, 0x2,0x30,0x25, 0x2,0x30,0x24, + 0x2,0x30,0x22, 0x3,0x31,0x6e, 0x2,0x30,0x21, 0x2,0x30,0x26, + 0x2,0x30,0x23, 0x3,0x31,0x6c, 0x3,0x31,0x6d, 0x1,0x5b,0x45, + 0x1,0x5b,0x46, 0x3,0x36,0x66, 0x1,0x60,0x27, 0x2,0x3d,0x28, + 0x4,0x38,0x4e, 0x2,0x3d,0x29, 0x2,0x3d,0x2a, 0x3,0x3c,0x4d, + 0xf,0x3c,0x3c, 0x3,0x65,0x3a, 0x2,0x44,0x27, 0x2,0x44,0x28, + 0x2,0x44,0x26, 0x3,0x42,0x28, 0x2,0x44,0x24, 0x2,0x44,0x25, + 0x1,0x64,0x5d, 0x2,0x4b,0x33, 0x2,0x51,0x40, 0x2,0x51,0x3f, + 0x2,0x51,0x3e, 0x2,0x51,0x41, 0x2,0x57,0x72, 0x2,0x57,0x71, + 0x1,0x71,0x26, 0x2,0x57,0x73, 0x1,0x74,0x21, 0x2,0x5d,0x39, + 0x3,0x55,0x2d, 0x2,0x61,0x76, 0x2,0x65,0x66, 0x2,0x6d,0x55, + 0x1,0x45,0x54, 0x1,0x46,0x62, 0x1,0x46,0x61, 0x4,0x23,0x21, + 0x1,0x4e,0x40, 0x2,0x21,0x41, 0x2,0x21,0x5f, 0x1,0x48,0x3c, + 0x2,0x22,0x58, 0x2,0x24,0x49, 0x2,0x24,0x4a, 0x1,0x4e,0x41, + 0x3,0x29,0x5d, 0x2,0x27,0x4e, 0x3,0x65,0x3b, 0x1,0x51,0x77, + 0x2,0x2b,0x4d, 0x2,0x2b,0x4e, 0x1,0x56,0x34, 0x1,0x56,0x38, + 0x2,0x30,0x27, 0x1,0x56,0x37, 0x1,0x56,0x35, 0x1,0x56,0x36, + 0x2,0x36,0x43, 0x1,0x5b,0x47, 0x1,0x60,0x2a, 0x3,0x3c,0x4e, + 0x1,0x60,0x28, 0x1,0x60,0x29, 0x2,0x3d,0x2b, 0x3,0x42,0x29, + 0x3,0x42,0x2a, 0x1,0x69,0x3b, 0x1,0x45,0x55, 0x2,0x21,0x60, + 0x3,0x22,0x57, 0x1,0x46,0x63, 0x3,0x22,0x54, 0x2,0x21,0x63, + 0x3,0x24,0x21, 0x1,0x46,0x66, 0x2,0x21,0x62, 0x1,0x46,0x65, + 0x1,0x46,0x64, 0x1,0x4a,0x65, 0x2,0x21,0x61, 0x3,0x22,0x58, + 0x3,0x22,0x59, 0x2,0x22,0x59, 0xf,0x21,0x66, 0x2,0x22,0x5d, + 0x2,0x22,0x5f, 0x2,0x22,0x60, 0x1,0x48,0x46, 0x1,0x48,0x47, + 0x2,0x22,0x5c, 0x1,0x48,0x42, 0x3,0x23,0x7d, 0x2,0x22,0x5a, + 0x3,0x24,0x25, 0x2,0x22,0x5e, 0x1,0x48,0x43, 0x3,0x26,0x55, + 0x1,0x48,0x3e, 0x3,0x23,0x7c, 0x1,0x48,0x3f, 0x3,0x24,0x23, + 0x1,0x48,0x45, 0x2,0x22,0x5b, 0x1,0x48,0x3d, 0x1,0x4a,0x66, + 0x1,0x48,0x40, 0x1,0x48,0x41, 0x1,0x48,0x44, 0xf,0x22,0x5d, + 0x3,0x65,0x3c, 0x2,0x24,0x5b, 0x2,0x24,0x59, 0x2,0x24,0x4c, + 0x1,0x4a,0x72, 0x2,0x24,0x53, 0x1,0x4a,0x6d, 0x2,0x24,0x4d, + 0x3,0x29,0x64, 0x2,0x24,0x55, 0x3,0x26,0x50, 0x2,0x24,0x52, + 0x1,0x4a,0x70, 0x2,0x24,0x51, 0x1,0x4a,0x77, 0x2,0x24,0x5a, + 0x1,0x4a,0x79, 0x3,0x26,0x53, 0x1,0x4a,0x7b, 0x3,0x23,0x7e, + 0x2,0x24,0x4b, 0x3,0x26,0x57, 0x1,0x4a,0x6e, 0x2,0x24,0x5c, + 0x3,0x26,0x51, 0x1,0x4a,0x75, 0x1,0x4a,0x78, 0x3,0x26,0x4c, + 0x2,0x27,0x65, 0x1,0x4a,0x68, 0x1,0x4b,0x21, 0x1,0x4a,0x76, + 0x2,0x24,0x4e, 0x1,0x4a,0x6b, 0x1,0x4a,0x7a, 0x2,0x24,0x56, + 0x1,0x4a,0x69, 0x1,0x4a,0x6a, 0x2,0x27,0x63, 0x2,0x24,0x4f, + 0x1,0x4a,0x71, 0x1,0x4a,0x7c, 0x2,0x24,0x5d, 0x2,0x24,0x50, + 0x1,0x4a,0x6f, 0x3,0x26,0x4d, 0x1,0x4a,0x74, 0x2,0x27,0x4f, + 0x1,0x4a,0x7d, 0x2,0x24,0x57, 0x1,0x4a,0x73, 0x3,0x29,0x63, + 0x1,0x4a,0x7e, 0x1,0x4a,0x67, 0x2,0x24,0x54, 0x1,0x4a,0x6c, + 0x2,0x24,0x58, 0x2,0x27,0x64, 0x3,0x26,0x4e, 0x3,0x26,0x52, + 0x3,0x26,0x5c, 0x3,0x26,0x59, 0x3,0x26,0x56, 0xf,0x24,0x68, + 0x3,0x26,0x5b, 0x1,0x4e,0x4d, 0x1,0x4e,0x5d, 0x2,0x27,0x56, + 0x1,0x4e,0x54, 0x3,0x2d,0x4e, 0x2,0x27,0x6b, 0x1,0x4e,0x45, + 0x3,0x29,0x6b, 0x1,0x4e,0x48, 0x2,0x27,0x62, 0x4,0x27,0x26, + 0x2,0x27,0x54, 0x2,0x27,0x58, 0x1,0x4e,0x50, 0x1,0x4e,0x52, + 0x2,0x27,0x5b, 0x1,0x4e,0x59, 0x1,0x4e,0x4b, 0x1,0x4e,0x49, + 0x1,0x4e,0x4a, 0x1,0x4e,0x58, 0x2,0x27,0x67, 0x1,0x4e,0x53, + 0x2,0x27,0x5a, 0x2,0x27,0x5c, 0x1,0x4e,0x51, 0x1,0x4e,0x56, + 0x2,0x27,0x5d, 0x2,0x27,0x6a, 0x3,0x29,0x6d, 0x1,0x51,0x78, + 0x1,0x4e,0x5c, 0x4,0x26,0x7d, 0x1,0x4e,0x46, 0x2,0x27,0x69, + 0x3,0x29,0x6c, 0x2,0x27,0x6d, 0x2,0x27,0x59, 0x2,0x27,0x6f, + 0x2,0x27,0x60, 0x1,0x4e,0x4f, 0x2,0x27,0x55, 0x1,0x4e,0x4e, + 0x1,0x4e,0x60, 0x1,0x4e,0x55, 0x3,0x29,0x6a, 0x2,0x27,0x53, + 0x2,0x2b,0x57, 0x1,0x4e,0x5b, 0x1,0x4e,0x5f, 0x2,0x27,0x61, + 0x2,0x27,0x66, 0x3,0x29,0x65, 0x1,0x4e,0x61, 0x1,0x4e,0x5a, + 0x1,0x4e,0x4c, 0x1,0x4e,0x42, 0x3,0x29,0x69, 0x1,0x4e,0x47, + 0x4,0x26,0x7b, 0x2,0x27,0x57, 0x1,0x4e,0x43, 0x2,0x27,0x6e, + 0x3,0x29,0x67, 0x2,0x27,0x51, 0x2,0x27,0x50, 0x2,0x27,0x5e, + 0x2,0x27,0x52, 0x1,0x4e,0x5e, 0x1,0x56,0x39, 0x1,0x4e,0x57, + 0x2,0x27,0x5f, 0x1,0x4e,0x44, 0x3,0x2d,0x4f, 0x1,0x52,0x29, + 0x2,0x27,0x6c, 0x3,0x2d,0x46, 0x2,0x2b,0x5e, 0x2,0x2b,0x61, + 0x3,0x2d,0x50, 0x2,0x2b,0x64, 0x2,0x2b,0x59, 0x3,0x2d,0x48, + 0x3,0x2d,0x4a, 0x2,0x2b,0x67, 0x2,0x2b,0x6a, 0x2,0x2b,0x6c, + 0x2,0x2b,0x56, 0x1,0x51,0x79, 0x1,0x51,0x7e, 0x2,0x30,0x2c, + 0x1,0x52,0x30, 0x2,0x2b,0x65, 0x2,0x2b,0x6d, 0x2,0x2b,0x5d, + 0x2,0x2b,0x55, 0x3,0x2d,0x49, 0x3,0x2d,0x47, 0x3,0x2d,0x4d, + 0x2,0x30,0x47, 0x1,0x52,0x23, 0x2,0x2b,0x62, 0x2,0x2b,0x5a, + 0x2,0x2b,0x5c, 0x1,0x52,0x28, 0x3,0x31,0x7a, 0x2,0x2b,0x5f, + 0x1,0x52,0x22, 0x2,0x2b,0x52, 0x2,0x2b,0x68, 0x3,0x2d,0x4b, + 0x2,0x2b,0x6b, 0x3,0x2d,0x45, 0x3,0x2d,0x57, 0x1,0x51,0x7d, + 0x3,0x2d,0x53, 0x1,0x52,0x2b, 0x2,0x2b,0x4f, 0x1,0x52,0x2d, + 0x1,0x51,0x7b, 0x1,0x52,0x31, 0x2,0x2b,0x69, 0x2,0x2b,0x51, + 0x1,0x52,0x2e, 0x2,0x30,0x41, 0x2,0x27,0x68, 0x1,0x52,0x21, + 0x1,0x51,0x7a, 0x2,0x2b,0x58, 0x2,0x2b,0x50, 0x1,0x52,0x2f, + 0x1,0x52,0x27, 0x2,0x2b,0x63, 0x1,0x52,0x2c, 0x1,0x52,0x2a, + 0x2,0x2b,0x5b, 0x1,0x52,0x24, 0x2,0x2b,0x53, 0x1,0x52,0x25, + 0x1,0x52,0x26, 0x2,0x2b,0x54, 0x2,0x2b,0x66, 0x1,0x51,0x7c, + 0x2,0x2b,0x60, 0x4,0x2a,0x21, 0x3,0x2d,0x55, 0x3,0x2d,0x51, + 0x3,0x31,0x77, 0x3,0x31,0x73, 0x2,0x30,0x2f, 0x1,0x56,0x41, + 0x1,0x56,0x46, 0x3,0x31,0x79, 0x3,0x32,0x26, 0x3,0x31,0x76, + 0x2,0x30,0x38, 0x2,0x30,0x3e, 0x2,0x30,0x3a, 0x2,0x30,0x2d, + 0x2,0x30,0x30, 0x2,0x30,0x29, 0x2,0x30,0x2a, 0x1,0x56,0x4d, + 0x1,0x56,0x3e, 0x2,0x30,0x39, 0x2,0x30,0x42, 0x1,0x56,0x48, + 0x1,0x56,0x3a, 0x3,0x31,0x6f, 0x1,0x56,0x43, 0x2,0x30,0x31, + 0x1,0x56,0x45, 0x2,0x30,0x32, 0x2,0x30,0x3c, 0x3,0x32,0x22, + 0x3,0x32,0x25, 0x3,0x31,0x72, 0x1,0x56,0x47, 0x2,0x30,0x4b, + 0x2,0x30,0x2b, 0x1,0x56,0x40, 0x1,0x56,0x3f, 0x1,0x56,0x4b, + 0x2,0x30,0x28, 0x2,0x30,0x49, 0x2,0x30,0x3d, 0x2,0x30,0x4a, + 0x2,0x30,0x44, 0x2,0x30,0x36, 0x2,0x30,0x45, 0x3,0x32,0x21, + 0x2,0x30,0x3f, 0x2,0x30,0x48, 0x2,0x30,0x46, 0x1,0x56,0x4c, + 0x2,0x30,0x37, 0x1,0x56,0x3d, 0x1,0x56,0x3c, 0x1,0x56,0x44, + 0x1,0x56,0x4a, 0x2,0x30,0x43, 0x1,0x56,0x49, 0x2,0x30,0x34, + 0x1,0x5b,0x48, 0x3,0x31,0x78, 0x2,0x30,0x4c, 0x2,0x30,0x33, + 0x2,0x30,0x2e, 0x1,0x56,0x42, 0x1,0x56,0x4e, 0x1,0x56,0x3b, + 0x3,0x32,0x27, 0x2,0x30,0x3b, 0x2,0x30,0x40, 0x3,0x31,0x7d, + 0x3,0x31,0x7b, 0x3,0x31,0x7c, 0x3,0x65,0x3d, 0x1,0x5b,0x6a, + 0x2,0x36,0x45, 0x2,0x36,0x49, 0x3,0x36,0x6f, 0x1,0x5b,0x57, + 0x1,0x5b,0x55, 0x3,0x36,0x7a, 0x3,0x37,0x21, 0x1,0x5b,0x4c, + 0x2,0x36,0x47, 0x2,0x36,0x46, 0x1,0x5b,0x60, 0x3,0x3c,0x50, + 0x2,0x36,0x4c, 0x1,0x5b,0x5a, 0x3,0x36,0x72, 0x2,0x36,0x5e, + 0x2,0x36,0x6a, 0x1,0x5b,0x49, 0x2,0x36,0x5b, 0x2,0x36,0x54, + 0x1,0x5b,0x6c, 0x2,0x36,0x44, 0x3,0x36,0x6a, 0x2,0x36,0x60, + 0x3,0x36,0x6b, 0x1,0x5b,0x69, 0x1,0x5b,0x5d, 0x1,0x5b,0x68, + 0x1,0x5b,0x53, 0x2,0x36,0x50, 0x2,0x36,0x62, 0x2,0x36,0x5a, + 0x1,0x5b,0x54, 0x1,0x5b,0x4e, 0x2,0x36,0x68, 0x3,0x36,0x6c, + 0x2,0x36,0x61, 0x2,0x36,0x63, 0x1,0x5b,0x56, 0x1,0x5b,0x5e, + 0x2,0x36,0x65, 0x2,0x36,0x4e, 0x2,0x36,0x5f, 0x2,0x36,0x53, + 0x2,0x36,0x67, 0x1,0x5b,0x63, 0x1,0x5b,0x4b, 0x1,0x5b,0x61, + 0x2,0x36,0x58, 0x2,0x36,0x56, 0x2,0x36,0x57, 0x1,0x5b,0x58, + 0x2,0x36,0x52, 0x2,0x36,0x51, 0x1,0x5b,0x4d, 0x2,0x36,0x4b, + 0x2,0x36,0x69, 0x1,0x5b,0x4f, 0x2,0x36,0x55, 0x1,0x5b,0x6d, + 0x3,0x36,0x74, 0x1,0x5b,0x67, 0x2,0x36,0x4a, 0x1,0x5b,0x64, + 0x1,0x5b,0x62, 0x1,0x5b,0x6b, 0x2,0x36,0x5c, 0x1,0x5b,0x66, + 0x2,0x30,0x35, 0x2,0x36,0x5d, 0x1,0x5b,0x65, 0x2,0x36,0x64, + 0x1,0x5b,0x4a, 0x2,0x36,0x59, 0x1,0x5b,0x5c, 0x2,0x36,0x4d, + 0x1,0x5b,0x5b, 0x3,0x36,0x7c, 0x1,0x5b,0x59, 0x1,0x5b,0x51, + 0x1,0x5b,0x50, 0x2,0x3d,0x2c, 0x2,0x36,0x66, 0x3,0x3c,0x5d, + 0x3,0x37,0x28, 0x2,0x36,0x4f, 0x3,0x37,0x26, 0x3,0x37,0x23, + 0x2,0x3d,0x41, 0x3,0x36,0x70, 0x1,0x5b,0x52, 0x3,0x36,0x77, + 0x3,0x37,0x24, 0x3,0x36,0x76, 0x3,0x37,0x25, 0x3,0x36,0x79, + 0x4,0x32,0x6d, 0x3,0x36,0x7d, 0x3,0x65,0x3e, 0x3,0x37,0x29, + 0xf,0x36,0x29, 0x3,0x37,0x27, 0x3,0x3c,0x54, 0x1,0x60,0x47, + 0x1,0x5b,0x5f, 0x1,0x60,0x35, 0x2,0x3d,0x3b, 0x1,0x60,0x43, + 0x3,0x3c,0x52, 0x2,0x3d,0x2f, 0x1,0x60,0x32, 0x1,0x60,0x2e, + 0x2,0x3d,0x4d, 0x1,0x60,0x34, 0x1,0x60,0x38, 0x1,0x60,0x33, + 0x1,0x60,0x3c, 0x2,0x3d,0x51, 0x2,0x3d,0x48, 0x3,0x3c,0x6b, + 0x3,0x3c,0x6d, 0x2,0x3d,0x36, 0x1,0x60,0x41, 0x1,0x60,0x3b, + 0x2,0x3d,0x42, 0x1,0x60,0x2b, 0x2,0x3d,0x4e, 0x2,0x3d,0x47, + 0x1,0x60,0x2f, 0x2,0x3d,0x3c, 0x1,0x60,0x3e, 0x2,0x3d,0x59, + 0x2,0x3d,0x5a, 0x4,0x38,0x5b, 0x1,0x60,0x2c, 0x2,0x3d,0x4c, + 0x1,0x60,0x40, 0x2,0x3d,0x40, 0x2,0x3d,0x32, 0x2,0x3d,0x33, + 0x1,0x60,0x44, 0x2,0x3d,0x37, 0x2,0x3d,0x3e, 0x2,0x3d,0x38, + 0x3,0x3c,0x5a, 0x1,0x60,0x42, 0x1,0x60,0x4a, 0x2,0x3d,0x34, + 0x2,0x3d,0x2d, 0x2,0x3d,0x2e, 0x3,0x3c,0x56, 0x2,0x3d,0x30, + 0x1,0x60,0x31, 0x2,0x3d,0x3d, 0x3,0x3c,0x6e, 0x1,0x60,0x3f, + 0x1,0x60,0x48, 0x3,0x3c,0x58, 0x3,0x3c,0x69, 0x2,0x3d,0x3f, + 0x2,0x3d,0x57, 0x2,0x3d,0x4f, 0x1,0x60,0x2d, 0x2,0x3d,0x55, + 0x1,0x60,0x39, 0x3,0x3c,0x66, 0x1,0x60,0x37, 0x3,0x3c,0x64, + 0x2,0x3d,0x5b, 0x1,0x60,0x36, 0x2,0x3d,0x45, 0x2,0x3d,0x39, + 0x2,0x3d,0x43, 0x1,0x60,0x4d, 0x2,0x3d,0x49, 0x2,0x3d,0x46, + 0x2,0x3d,0x35, 0x1,0x60,0x49, 0x2,0x3d,0x53, 0x2,0x3d,0x50, + 0x2,0x3d,0x58, 0x1,0x60,0x30, 0x2,0x3d,0x44, 0x1,0x60,0x4c, + 0x3,0x3c,0x5b, 0x2,0x3d,0x4b, 0x3,0x42,0x3a, 0x3,0x3c,0x60, + 0x1,0x60,0x3a, 0x1,0x60,0x3d, 0x3,0x3c,0x5c, 0x2,0x3d,0x4a, + 0x1,0x60,0x4b, 0x2,0x3d,0x3a, 0x2,0x36,0x48, 0x3,0x3c,0x51, + 0x3,0x3c,0x6c, 0x2,0x3d,0x54, 0x2,0x3d,0x52, 0x2,0x3d,0x56, + 0xf,0x3c,0x5d, 0x3,0x3c,0x62, 0x3,0x65,0x42, 0x4,0x38,0x5e, + 0x3,0x3c,0x63, 0x3,0x3c,0x68, 0xf,0x3c,0x47, 0x3,0x65,0x40, + 0x4,0x38,0x5f, 0x2,0x3d,0x31, 0x1,0x60,0x46, 0x3,0x65,0x3f, + 0x3,0x65,0x41, 0x2,0x44,0x47, 0x2,0x44,0x46, 0x2,0x44,0x2c, + 0x1,0x64,0x63, 0x3,0x42,0x30, 0x2,0x44,0x45, 0x2,0x44,0x2f, + 0x2,0x44,0x30, 0x4,0x3e,0x3f, 0x1,0x64,0x6d, 0x2,0x44,0x4e, + 0x1,0x64,0x68, 0x2,0x44,0x44, 0x3,0x42,0x33, 0x2,0x44,0x29, + 0x1,0x64,0x6e, 0x1,0x64,0x64, 0x2,0x44,0x38, 0x2,0x44,0x2e, + 0x2,0x44,0x31, 0x2,0x44,0x49, 0x1,0x64,0x5e, 0x2,0x44,0x50, + 0x2,0x44,0x48, 0x1,0x64,0x67, 0x2,0x44,0x3d, 0x1,0x64,0x72, + 0x3,0x42,0x2e, 0x3,0x42,0x36, 0x1,0x64,0x71, 0x1,0x64,0x6b, + 0x3,0x42,0x40, 0x4,0x3e,0x36, 0x2,0x44,0x4f, 0x1,0x64,0x5f, + 0x2,0x44,0x3b, 0x2,0x44,0x32, 0x2,0x44,0x3f, 0x2,0x44,0x4b, + 0x1,0x64,0x73, 0x3,0x42,0x39, 0x1,0x64,0x61, 0x2,0x44,0x3a, + 0x3,0x42,0x2d, 0x2,0x44,0x33, 0x1,0x64,0x6a, 0x3,0x42,0x31, + 0x1,0x64,0x69, 0x2,0x44,0x36, 0x2,0x44,0x40, 0x2,0x44,0x4a, + 0x2,0x44,0x2d, 0x2,0x44,0x37, 0x1,0x64,0x62, 0x2,0x44,0x41, + 0x1,0x64,0x6f, 0x1,0x64,0x66, 0x2,0x44,0x34, 0x1,0x64,0x65, + 0x2,0x44,0x2b, 0x2,0x44,0x39, 0x2,0x44,0x4d, 0x1,0x60,0x45, + 0x1,0x69,0x57, 0x2,0x44,0x3c, 0x2,0x4b,0x34, 0x2,0x44,0x3e, + 0x2,0x44,0x4c, 0x1,0x64,0x6c, 0x2,0x44,0x35, 0x1,0x64,0x60, + 0x1,0x64,0x70, 0x1,0x6d,0x5a, 0x2,0x44,0x2a, 0x6,0x54,0x4e, + 0x2,0x44,0x43, 0x3,0x42,0x44, 0x3,0x42,0x3e, 0x3,0x42,0x47, + 0x2,0x44,0x42, 0x3,0x42,0x3d, 0x3,0x42,0x45, 0x3,0x42,0x3f, + 0x3,0x42,0x3b, 0x3,0x42,0x46, 0x2,0x4b,0x50, 0x1,0x69,0x54, + 0x2,0x4b,0x45, 0x2,0x4b,0x4a, 0x1,0x69,0x49, 0x3,0x47,0x56, + 0x2,0x4b,0x36, 0x1,0x69,0x56, 0x3,0x47,0x57, 0x1,0x69,0x40, + 0x2,0x4b,0x35, 0x2,0x4b,0x56, 0x1,0x69,0x58, 0x2,0x4b,0x39, + 0x2,0x4b,0x49, 0x3,0x47,0x65, 0x2,0x4b,0x3b, 0x2,0x4b,0x59, + 0x2,0x4b,0x55, 0x1,0x69,0x3e, 0x1,0x69,0x48, 0x2,0x51,0x5b, + 0x1,0x69,0x55, 0x1,0x69,0x46, 0x2,0x4b,0x37, 0x3,0x47,0x63, + 0x2,0x4b,0x54, 0x1,0x69,0x4a, 0x2,0x4b,0x51, 0x2,0x4b,0x5e, + 0x2,0x4b,0x3d, 0x2,0x4b,0x46, 0x3,0x4c,0x78, 0x3,0x47,0x5b, + 0x2,0x4b,0x5c, 0x2,0x4b,0x52, 0x1,0x69,0x45, 0x3,0x4c,0x6a, + 0x3,0x47,0x64, 0x2,0x4b,0x44, 0x1,0x69,0x3f, 0x1,0x69,0x3d, + 0x1,0x69,0x4f, 0x4,0x44,0x43, 0x3,0x47,0x5f, 0x2,0x4b,0x42, + 0x2,0x4b,0x3f, 0x2,0x4b,0x40, 0x3,0x47,0x5a, 0x2,0x4b,0x58, + 0x3,0x47,0x5c, 0x2,0x4b,0x5d, 0x2,0x4b,0x5b, 0x1,0x69,0x43, + 0x2,0x4b,0x5f, 0x1,0x69,0x47, 0x1,0x69,0x4e, 0x4,0x44,0x44, + 0x2,0x4b,0x38, 0x2,0x51,0x43, 0x2,0x4b,0x41, 0x3,0x47,0x5e, + 0x1,0x69,0x41, 0x1,0x69,0x53, 0x1,0x69,0x50, 0x1,0x69,0x44, + 0x2,0x4b,0x4b, 0x2,0x4b,0x3c, 0x1,0x69,0x51, 0x2,0x4b,0x4d, + 0x1,0x69,0x4b, 0x1,0x69,0x4d, 0x1,0x69,0x3c, 0x3,0x47,0x5d, + 0x2,0x4b,0x4f, 0x2,0x4b,0x47, 0x2,0x4b,0x3a, 0x1,0x69,0x4c, + 0x2,0x4b,0x57, 0x2,0x4b,0x5a, 0x2,0x4b,0x43, 0x2,0x4b,0x4e, + 0x3,0x4c,0x74, 0x1,0x69,0x42, 0x1,0x6d,0x49, 0x2,0x4b,0x4c, + 0x2,0x51,0x42, 0x3,0x47,0x62, 0x2,0x4b,0x53, 0x3,0x47,0x61, + 0x4,0x44,0x52, 0xf,0x4f,0x79, 0x3,0x65,0x44, 0x3,0x65,0x45, + 0x3,0x47,0x66, 0x3,0x65,0x43, 0x2,0x4b,0x3e, 0x2,0x51,0x4c, + 0x2,0x51,0x56, 0x1,0x6d,0x4c, 0x2,0x51,0x55, 0x2,0x51,0x61, + 0x1,0x6d,0x4e, 0x2,0x51,0x53, 0x4,0x4a,0x58, 0x2,0x51,0x57, + 0x1,0x6d,0x59, 0x3,0x4c,0x7d, 0x2,0x51,0x4e, 0x1,0x6d,0x51, + 0x3,0x4c,0x73, 0x2,0x51,0x5a, 0x2,0x57,0x7b, 0x1,0x6d,0x5d, + 0x1,0x6d,0x5c, 0x2,0x51,0x5c, 0x2,0x51,0x4b, 0x2,0x51,0x66, + 0x1,0x6d,0x57, 0x3,0x4c,0x6b, 0x1,0x6d,0x4d, 0x2,0x51,0x5f, + 0x4,0x4a,0x69, 0x2,0x51,0x63, 0x2,0x51,0x68, 0x2,0x51,0x5d, + 0x2,0x51,0x51, 0x1,0x6d,0x50, 0x1,0x6d,0x53, 0x1,0x6d,0x5b, + 0x1,0x6d,0x56, 0x3,0x4c,0x75, 0x2,0x51,0x54, 0x2,0x4b,0x48, + 0x3,0x4c,0x7e, 0x3,0x4c,0x6c, 0x2,0x51,0x50, 0x2,0x51,0x67, + 0x1,0x6d,0x52, 0x3,0x4c,0x79, 0x1,0x6d,0x55, 0x2,0x51,0x69, + 0x1,0x6d,0x4a, 0x2,0x51,0x5e, 0x2,0x51,0x44, 0x2,0x51,0x64, + 0x1,0x74,0x2a, 0x3,0x4c,0x7a, 0x2,0x51,0x52, 0x4,0x50,0x75, + 0x1,0x6d,0x4b, 0x2,0x51,0x4d, 0x1,0x6d,0x4f, 0x2,0x51,0x45, + 0x1,0x69,0x52, 0x2,0x51,0x49, 0x4,0x4a,0x57, 0x2,0x51,0x62, + 0x2,0x51,0x4a, 0x2,0x51,0x48, 0x1,0x6d,0x54, 0x3,0x4c,0x7b, + 0x2,0x51,0x60, 0x3,0x4c,0x77, 0x2,0x51,0x47, 0x2,0x51,0x59, + 0x2,0x51,0x58, 0x2,0x51,0x65, 0x2,0x51,0x4f, 0x1,0x6d,0x58, + 0x4,0x4a,0x64, 0x3,0x65,0x47, 0xf,0x4f,0x7d, 0x3,0x65,0x46, + 0x2,0x57,0x7e, 0x3,0x51,0x56, 0x1,0x71,0x33, 0x1,0x71,0x29, + 0x2,0x58,0x2c, 0x2,0x57,0x76, 0x1,0x71,0x2b, 0x2,0x58,0x24, + 0x1,0x71,0x32, 0x1,0x71,0x2d, 0x2,0x58,0x22, 0x2,0x5d,0x3b, + 0x2,0x58,0x28, 0x2,0x58,0x2e, 0x2,0x58,0x27, 0x2,0x57,0x74, + 0x2,0x58,0x25, 0x2,0x58,0x30, 0x2,0x58,0x32, 0x1,0x71,0x28, + 0x2,0x58,0x31, 0x1,0x71,0x2e, 0x1,0x71,0x34, 0x3,0x51,0x54, + 0x1,0x71,0x31, 0x3,0x51,0x58, 0x2,0x58,0x2b, 0x1,0x71,0x30, + 0x2,0x58,0x26, 0x3,0x51,0x4d, 0x2,0x57,0x78, 0x2,0x57,0x7d, + 0x3,0x51,0x50, 0x2,0x58,0x2a, 0x1,0x71,0x2f, 0x1,0x71,0x2c, + 0x1,0x71,0x27, 0x1,0x71,0x2a, 0x2,0x57,0x7c, 0x4,0x51,0x22, + 0x2,0x51,0x46, 0x2,0x57,0x77, 0x2,0x57,0x7a, 0x2,0x58,0x2d, + 0x2,0x58,0x21, 0x2,0x57,0x75, 0x2,0x5d,0x3a, 0x2,0x58,0x2f, + 0x2,0x57,0x79, 0x2,0x58,0x29, 0x3,0x4c,0x71, 0x3,0x51,0x55, + 0x2,0x5d,0x3d, 0x1,0x74,0x2e, 0x3,0x55,0x30, 0x3,0x55,0x2f, + 0x1,0x74,0x22, 0x3,0x55,0x35, 0x3,0x55,0x36, 0x1,0x74,0x26, + 0x2,0x5d,0x3f, 0x2,0x5d,0x45, 0x2,0x5d,0x43, 0x1,0x74,0x24, + 0x1,0x74,0x25, 0x1,0x74,0x2c, 0x2,0x5d,0x46, 0x2,0x5d,0x3e, + 0x1,0x74,0x27, 0x3,0x55,0x31, 0x2,0x5d,0x42, 0x2,0x5d,0x41, + 0x2,0x5d,0x47, 0x1,0x74,0x2d, 0x3,0x55,0x37, 0x1,0x74,0x28, + 0x1,0x74,0x2b, 0x2,0x5d,0x40, 0x1,0x74,0x2f, 0x1,0x74,0x29, + 0x1,0x74,0x30, 0x1,0x74,0x23, 0x2,0x5d,0x44, 0x3,0x5a,0x55, + 0x2,0x5d,0x3c, 0x3,0x51,0x59, 0x3,0x55,0x39, 0x2,0x62,0x25, + 0x3,0x65,0x48, 0x1,0x76,0x5d, 0x2,0x62,0x22, 0x2,0x62,0x24, + 0x3,0x58,0x28, 0x1,0x76,0x5b, 0x2,0x61,0x7e, 0x2,0x62,0x21, + 0x2,0x61,0x7a, 0x3,0x58,0x2a, 0x3,0x58,0x27, 0x2,0x58,0x23, + 0x2,0x61,0x7b, 0x1,0x76,0x5c, 0x2,0x61,0x77, 0x3,0x58,0x26, + 0x1,0x76,0x59, 0x2,0x62,0x26, 0x1,0x76,0x5a, 0x2,0x61,0x78, + 0x2,0x61,0x79, 0x2,0x61,0x7d, 0x1,0x76,0x5f, 0x3,0x58,0x29, + 0x1,0x76,0x5e, 0x4,0x5b,0x5e, 0x3,0x58,0x2b, 0x2,0x61,0x7c, + 0x1,0x78,0x45, 0x2,0x65,0x6a, 0x2,0x65,0x70, 0x1,0x78,0x46, + 0x2,0x65,0x67, 0x1,0x78,0x43, 0x1,0x78,0x40, 0x2,0x65,0x72, + 0x1,0x78,0x44, 0x3,0x5a,0x52, 0x1,0x78,0x41, 0x2,0x65,0x69, + 0x2,0x65,0x6c, 0x2,0x65,0x6d, 0x2,0x65,0x6e, 0x2,0x65,0x71, + 0x3,0x5a,0x54, 0x2,0x62,0x23, 0x2,0x65,0x68, 0x1,0x78,0x42, + 0x2,0x65,0x6f, 0x2,0x69,0x34, 0x2,0x65,0x6b, 0x3,0x5a,0x53, + 0x3,0x65,0x4a, 0x3,0x65,0x49, 0x2,0x69,0x2b, 0x1,0x79,0x75, + 0x2,0x69,0x2e, 0x1,0x79,0x76, 0x2,0x69,0x37, 0x2,0x69,0x2d, + 0x2,0x69,0x2a, 0x3,0x5c,0x51, 0x2,0x69,0x2c, 0x2,0x69,0x30, + 0x2,0x69,0x33, 0x2,0x69,0x32, 0x2,0x69,0x36, 0x2,0x69,0x29, + 0x3,0x5c,0x4f, 0x1,0x79,0x74, 0x2,0x69,0x31, 0x2,0x69,0x35, + 0x2,0x69,0x38, 0x2,0x69,0x2f, 0x2,0x6b,0x61, 0x2,0x6b,0x62, + 0x2,0x6b,0x66, 0x2,0x6b,0x67, 0x3,0x5e,0x3c, 0x2,0x6b,0x64, + 0x2,0x6b,0x65, 0x2,0x6b,0x63, 0x3,0x5e,0x3a, 0x1,0x7a,0x74, + 0x3,0x5e,0x3b, 0x1,0x7b,0x64, 0x2,0x6d,0x59, 0x3,0x60,0x36, + 0x3,0x5f,0x52, 0x2,0x6d,0x56, 0x2,0x6d,0x57, 0x2,0x6d,0x58, + 0x1,0x7b,0x65, 0x3,0x60,0x37, 0x2,0x6f,0x34, 0x2,0x6f,0x33, + 0x3,0x65,0x4b, 0x2,0x70,0x3d, 0x1,0x7c,0x60, 0x2,0x70,0x3b, + 0x2,0x70,0x3e, 0x2,0x70,0x3c, 0x2,0x71,0x25, 0x1,0x7d,0x24, + 0x1,0x7d,0x32, 0x2,0x71,0x71, 0x2,0x71,0x5b, 0x3,0x61,0x79, + 0x2,0x71,0x70, 0x2,0x72,0x3e, 0x2,0x72,0x3f, 0x1,0x45,0x56, + 0x4,0x21,0x50, 0x3,0x24,0x28, 0x3,0x24,0x26, 0x1,0x48,0x48, + 0x2,0x22,0x61, 0x3,0x24,0x27, 0x3,0x24,0x2b, 0x2,0x24,0x5e, + 0x3,0x26,0x62, 0x1,0x4b,0x22, 0x3,0x26,0x5f, 0x1,0x4b,0x25, + 0x3,0x26,0x5e, 0x2,0x24,0x5f, 0x3,0x26,0x63, 0x1,0x4b,0x23, + 0x1,0x4b,0x24, 0x3,0x26,0x60, 0xf,0x24,0x71, 0x3,0x29,0x77, + 0x2,0x27,0x78, 0x2,0x27,0x7a, 0x2,0x27,0x75, 0x2,0x27,0x72, + 0x2,0x27,0x74, 0x3,0x29,0x74, 0x3,0x29,0x70, 0x3,0x29,0x75, + 0x1,0x4e,0x65, 0x3,0x29,0x6f, 0x3,0x29,0x79, 0x3,0x29,0x76, + 0x1,0x4e,0x63, 0x3,0x29,0x72, 0x3,0x29,0x71, 0x2,0x27,0x76, + 0x1,0x4e,0x64, 0x2,0x27,0x73, 0x2,0x27,0x70, 0x1,0x4e,0x62, + 0x2,0x27,0x77, 0x4,0x27,0x29, 0x2,0x27,0x71, 0x1,0x4e,0x66, + 0x2,0x27,0x79, 0x4,0x27,0x2b, 0x2,0x2b,0x6f, 0x3,0x2d,0x5e, + 0x2,0x2b,0x73, 0x3,0x2d,0x5c, 0x3,0x2d,0x5a, 0x1,0x52,0x3a, + 0x3,0x2d,0x58, 0x4,0x2a,0x26, 0x3,0x2d,0x65, 0x3,0x2d,0x62, + 0x2,0x2b,0x76, 0x3,0x2d,0x5f, 0x1,0x52,0x32, 0x1,0x52,0x35, + 0x1,0x52,0x37, 0x1,0x52,0x39, 0x1,0x52,0x36, 0x2,0x2b,0x72, + 0x2,0x2b,0x71, 0x3,0x2d,0x64, 0x1,0x52,0x34, 0x2,0x2b,0x74, + 0x2,0x2b,0x75, 0x3,0x2d,0x63, 0x2,0x2b,0x6e, 0x1,0x52,0x38, + 0x3,0x2d,0x68, 0x1,0x52,0x33, 0x3,0x2d,0x5d, 0x2,0x2b,0x70, + 0x3,0x65,0x4d, 0x4,0x2a,0x28, 0x3,0x32,0x28, 0x2,0x30,0x5a, + 0x2,0x30,0x5b, 0x2,0x30,0x5c, 0x1,0x56,0x53, 0x4,0x2d,0x75, + 0x1,0x56,0x4f, 0x2,0x30,0x51, 0x3,0x32,0x2a, 0x2,0x30,0x59, + 0x2,0x30,0x5e, 0x1,0x56,0x54, 0x3,0x32,0x2b, 0x2,0x30,0x4f, + 0x2,0x30,0x55, 0x2,0x30,0x4e, 0x2,0x30,0x58, 0x3,0x32,0x31, + 0x3,0x32,0x2f, 0x2,0x30,0x54, 0x1,0x56,0x50, 0x1,0x56,0x52, + 0x2,0x30,0x5d, 0x3,0x32,0x29, 0x2,0x30,0x4d, 0x2,0x30,0x50, + 0x2,0x30,0x56, 0x3,0x32,0x2d, 0x2,0x30,0x57, 0x2,0x30,0x5f, + 0x2,0x30,0x53, 0x3,0x32,0x2c, 0x1,0x56,0x51, 0x3,0x65,0x4f, + 0x3,0x65,0x4e, 0x3,0x32,0x30, 0x1,0x5b,0x72, 0x2,0x36,0x71, + 0x3,0x37,0x30, 0x3,0x37,0x32, 0x2,0x36,0x73, 0x2,0x36,0x6f, + 0x3,0x37,0x2f, 0x2,0x36,0x7b, 0x2,0x36,0x6d, 0x2,0x36,0x7a, + 0x1,0x5b,0x6e, 0x2,0x36,0x6b, 0x2,0x3d,0x5f, 0x2,0x36,0x75, + 0x1,0x5b,0x71, 0x3,0x37,0x35, 0x2,0x36,0x76, 0x2,0x36,0x79, + 0x3,0x37,0x2e, 0x2,0x36,0x7d, 0x3,0x37,0x2c, 0x2,0x36,0x72, + 0x4,0x32,0x72, 0x2,0x36,0x77, 0x3,0x37,0x2d, 0x3,0x37,0x31, + 0x1,0x5b,0x6f, 0x1,0x5b,0x70, 0x2,0x36,0x7c, 0x2,0x36,0x70, + 0x2,0x36,0x6c, 0x2,0x36,0x7e, 0x3,0x37,0x33, 0x2,0x36,0x74, + 0x3,0x65,0x50, 0x3,0x65,0x51, 0x2,0x36,0x78, 0x2,0x36,0x6e, + 0x1,0x60,0x4e, 0x1,0x60,0x4f, 0x2,0x3d,0x69, 0x1,0x60,0x55, + 0x3,0x3c,0x74, 0x2,0x3d,0x5d, 0x2,0x3d,0x66, 0x2,0x3d,0x5c, + 0x1,0x60,0x52, 0x2,0x3d,0x64, 0x2,0x3d,0x62, 0x3,0x3c,0x7d, + 0x2,0x3d,0x63, 0x1,0x60,0x50, 0x3,0x3c,0x7c, 0x2,0x3d,0x67, + 0xf,0x3c,0x7e, 0x3,0x3c,0x6f, 0x3,0x3c,0x7a, 0x3,0x3c,0x72, + 0x3,0x3d,0x21, 0x2,0x3d,0x60, 0x2,0x3d,0x5e, 0x1,0x60,0x51, + 0x2,0x3d,0x61, 0x2,0x3d,0x65, 0x3,0x3c,0x7b, 0x3,0x3c,0x79, + 0x3,0x3c,0x71, 0x1,0x60,0x53, 0x3,0x3c,0x73, 0x3,0x3c,0x77, + 0x3,0x65,0x53, 0x2,0x3d,0x68, 0x3,0x65,0x54, 0x3,0x65,0x55, + 0x3,0x65,0x52, 0x2,0x44,0x56, 0x2,0x44,0x5d, 0x2,0x44,0x5f, + 0x2,0x44,0x65, 0x3,0x42,0x57, 0x1,0x65,0x22, 0x2,0x44,0x51, + 0x3,0x42,0x4c, 0x1,0x64,0x78, 0x3,0x42,0x4e, 0x2,0x44,0x60, + 0x1,0x64,0x7d, 0x2,0x44,0x66, 0x1,0x64,0x74, 0x3,0x42,0x51, + 0x2,0x44,0x63, 0x3,0x42,0x58, 0x2,0x44,0x53, 0x2,0x44,0x64, + 0x2,0x44,0x52, 0x1,0x65,0x24, 0x3,0x42,0x52, 0x2,0x44,0x5e, + 0x1,0x64,0x75, 0x2,0x44,0x67, 0x3,0x48,0x3c, 0x1,0x64,0x7a, + 0x2,0x44,0x57, 0x1,0x65,0x21, 0x2,0x44,0x62, 0x2,0x44,0x55, + 0x2,0x44,0x5c, 0x2,0x44,0x58, 0x2,0x44,0x54, 0x1,0x64,0x77, + 0x1,0x64,0x7e, 0x1,0x64,0x7c, 0x1,0x64,0x79, 0x1,0x65,0x23, + 0x1,0x64,0x76, 0x2,0x44,0x5b, 0x3,0x42,0x4f, 0x1,0x64,0x7b, + 0x3,0x42,0x59, 0x1,0x60,0x54, 0x3,0x42,0x49, 0x2,0x44,0x61, + 0x3,0x65,0x59, 0x2,0x44,0x59, 0x3,0x42,0x53, 0x3,0x65,0x57, + 0x3,0x65,0x58, 0x3,0x65,0x56, 0x2,0x44,0x5a, 0x4,0x44,0x57, + 0x4,0x44,0x5b, 0x2,0x4b,0x67, 0x3,0x47,0x6f, 0x1,0x69,0x5b, + 0x3,0x47,0x6e, 0x3,0x47,0x6c, 0x2,0x4b,0x63, 0x2,0x4b,0x69, + 0x2,0x4b,0x65, 0x3,0x47,0x70, 0x1,0x69,0x5d, 0x2,0x4b,0x64, + 0x2,0x4b,0x68, 0x2,0x4b,0x60, 0x3,0x47,0x72, 0x2,0x4b,0x62, + 0x1,0x69,0x5c, 0x3,0x47,0x6a, 0x3,0x47,0x6d, 0x3,0x47,0x6b, + 0x3,0x47,0x68, 0x2,0x4b,0x66, 0x2,0x4b,0x61, 0x3,0x47,0x67, + 0x1,0x69,0x5e, 0x3,0x65,0x5b, 0x1,0x69,0x59, 0xf,0x49,0x4b, + 0x3,0x65,0x5a, 0x2,0x4b,0x6a, 0xf,0x49,0x5f, 0x1,0x69,0x5a, + 0x2,0x51,0x6f, 0x2,0x51,0x6c, 0x2,0x51,0x78, 0x2,0x51,0x72, + 0x2,0x51,0x74, 0x1,0x6d,0x5e, 0x2,0x51,0x6e, 0x2,0x51,0x76, + 0x3,0x4d,0x2a, 0x3,0x4d,0x24, 0x2,0x51,0x75, 0x2,0x51,0x73, + 0x3,0x4d,0x29, 0x2,0x51,0x79, 0x1,0x6d,0x61, 0x2,0x51,0x70, + 0x2,0x51,0x77, 0x3,0x4d,0x28, 0x1,0x6d,0x5f, 0x3,0x4d,0x25, + 0x3,0x4d,0x22, 0x2,0x51,0x6b, 0x2,0x51,0x6d, 0x1,0x6d,0x60, + 0x2,0x51,0x6a, 0x2,0x51,0x7a, 0x3,0x65,0x5c, 0x2,0x51,0x71, + 0x3,0x51,0x62, 0x3,0x51,0x5a, 0x2,0x58,0x36, 0x1,0x71,0x3b, + 0x3,0x51,0x60, 0x3,0x51,0x5c, 0x2,0x58,0x41, 0x2,0x58,0x3f, + 0x1,0x71,0x35, 0x2,0x58,0x35, 0x2,0x58,0x38, 0x2,0x58,0x39, + 0x2,0x58,0x34, 0x1,0x71,0x3f, 0x1,0x71,0x40, 0x2,0x58,0x33, + 0x2,0x58,0x42, 0x2,0x58,0x3d, 0x1,0x71,0x39, 0x1,0x71,0x36, + 0x2,0x58,0x3c, 0x2,0x58,0x3a, 0x3,0x51,0x63, 0x4,0x51,0x23, + 0x1,0x71,0x3c, 0x2,0x58,0x3e, 0x1,0x71,0x37, 0x3,0x51,0x5e, + 0x1,0x71,0x38, 0x3,0x51,0x66, 0x2,0x58,0x3b, 0x1,0x71,0x3a, + 0x2,0x58,0x37, 0x7,0x2f,0x4f, 0x2,0x58,0x40, 0x1,0x71,0x3d, + 0x2,0x58,0x43, 0x2,0x58,0x44, 0x1,0x71,0x3e, 0x3,0x65,0x5d, + 0x3,0x65,0x5e, 0x1,0x74,0x32, 0x1,0x74,0x39, 0x2,0x5d,0x48, + 0x2,0x5d,0x4e, 0x3,0x55,0x3c, 0x2,0x5d,0x4c, 0x1,0x74,0x35, + 0x1,0x74,0x34, 0x1,0x74,0x31, 0x2,0x5d,0x4a, 0x3,0x55,0x3e, + 0x3,0x55,0x43, 0x3,0x55,0x40, 0x1,0x74,0x37, 0x1,0x74,0x36, + 0x1,0x74,0x33, 0x3,0x55,0x41, 0x2,0x5d,0x4d, 0x2,0x5d,0x49, + 0x2,0x5d,0x4b, 0x3,0x55,0x42, 0x1,0x74,0x38, 0xf,0x5a,0x73, + 0x1,0x76,0x63, 0x2,0x62,0x29, 0x3,0x58,0x2d, 0x1,0x76,0x60, + 0x1,0x76,0x61, 0x2,0x62,0x2b, 0x1,0x76,0x62, 0x2,0x62,0x28, + 0x3,0x58,0x2e, 0x2,0x62,0x27, 0x2,0x65,0x76, 0x2,0x62,0x2a, + 0x3,0x5a,0x56, 0x2,0x65,0x77, 0x1,0x78,0x47, 0x2,0x65,0x75, + 0x3,0x5a,0x57, 0x4,0x5f,0x7e, 0x2,0x65,0x74, 0x3,0x5c,0x59, + 0x2,0x65,0x73, 0x1,0x78,0x48, 0x3,0x65,0x5f, 0x3,0x5c,0x56, + 0x1,0x79,0x77, 0x3,0x5c,0x58, 0x3,0x5c,0x55, 0x2,0x69,0x39, + 0x2,0x69,0x3a, 0x3,0x5a,0x58, 0x3,0x5c,0x53, 0x3,0x5c,0x57, + 0x3,0x65,0x61, 0x2,0x6b,0x6a, 0x2,0x6b,0x69, 0x1,0x7a,0x75, + 0x3,0x5f,0x53, 0x2,0x6b,0x68, 0x2,0x6d,0x5a, 0x2,0x6d,0x5b, + 0x3,0x5f,0x54, 0x3,0x60,0x39, 0x2,0x6f,0x35, 0x2,0x70,0x3f, + 0x3,0x61,0x43, 0x3,0x61,0x42, 0x2,0x71,0x26, 0x2,0x72,0x2c, + 0x1,0x7d,0x46, 0x2,0x72,0x40, 0x1,0x45,0x57, 0x4,0x21,0x51, + 0x1,0x4e,0x67, 0x1,0x4e,0x68, 0x3,0x2d,0x69, 0x4,0x2a,0x2a, + 0x1,0x52,0x3b, 0x3,0x3d,0x22, 0x4,0x4a,0x6c, 0x1,0x74,0x3a, + 0x1,0x45,0x58, 0x1,0x4e,0x69, 0x1,0x56,0x55, 0x1,0x65,0x25, + 0x1,0x45,0x59, 0x3,0x2d,0x6b, 0x1,0x5b,0x73, 0x1,0x69,0x5f, + 0x2,0x21,0x42, 0x3,0x29,0x7c, 0x2,0x2b,0x77, 0x2,0x30,0x60, + 0x4,0x3e,0x4c, 0x2,0x4b,0x6b, 0x4,0x4a,0x6d, 0x1,0x74,0x3b, + 0x1,0x45,0x5a, 0x1,0x4e,0x6a, 0x2,0x2b,0x78, 0x2,0x2b,0x79, + 0x2,0x3d,0x6a, 0x1,0x60,0x56, 0x3,0x42,0x5d, 0x2,0x44,0x68, + 0x3,0x42,0x5c, 0x3,0x42,0x5b, 0x1,0x65,0x26, 0x2,0x4b,0x6c, + 0x4,0x44,0x5e, 0x3,0x4d,0x2e, 0x1,0x6d,0x62, 0x3,0x4d,0x2d, + 0x1,0x78,0x49, 0x1,0x45,0x5b, 0x2,0x3d,0x6b, 0x1,0x45,0x5c, + 0x1,0x48,0x4a, 0x2,0x22,0x62, 0x1,0x48,0x49, 0x1,0x4b,0x28, + 0x1,0x4b,0x27, 0x1,0x4b,0x26, 0x2,0x24,0x60, 0x3,0x26,0x64, + 0x3,0x2a,0x21, 0x3,0x2a,0x22, 0x1,0x4e,0x6b, 0x3,0x2a,0x23, + 0x1,0x4e,0x6c, 0x2,0x27,0x7b, 0x4,0x27,0x31, 0x2,0x2b,0x7a, + 0x3,0x2d,0x6d, 0x2,0x2b,0x7d, 0x1,0x52,0x3d, 0x2,0x2b,0x7b, + 0x4,0x2a,0x2f, 0x1,0x52,0x3c, 0x2,0x2b,0x7c, 0x1,0x52,0x3e, + 0x2,0x30,0x63, 0x2,0x30,0x62, 0x2,0x30,0x61, 0x1,0x56,0x56, + 0x3,0x32,0x36, 0x2,0x37,0x22, 0x2,0x37,0x23, 0x1,0x5b,0x74, + 0x2,0x37,0x21, 0x2,0x37,0x24, 0x1,0x60,0x58, 0x1,0x5b,0x75, + 0x3,0x3d,0x24, 0x3,0x3d,0x23, 0x1,0x60,0x57, 0x2,0x3d,0x6f, + 0x2,0x3d,0x6e, 0x3,0x3d,0x25, 0x2,0x3d,0x6c, 0x2,0x3d,0x6d, + 0x2,0x3d,0x70, 0x2,0x44,0x6a, 0x2,0x44,0x69, 0x2,0x44,0x6d, + 0x4,0x3e,0x4f, 0x2,0x44,0x6c, 0x2,0x44,0x6b, 0x1,0x69,0x60, + 0x2,0x4b,0x6f, 0x3,0x47,0x75, 0x2,0x4b,0x6e, 0x1,0x69,0x61, + 0x2,0x4b,0x6d, 0x2,0x51,0x7b, 0x3,0x4d,0x2f, 0x2,0x51,0x7c, + 0x1,0x6d,0x63, 0x4,0x51,0x2d, 0x2,0x58,0x45, 0x2,0x58,0x46, + 0x5,0x4e,0x37, 0x2,0x65,0x7c, 0x1,0x78,0x4a, 0x2,0x65,0x7b, + 0x2,0x65,0x7a, 0x2,0x65,0x78, 0x2,0x65,0x79, 0x1,0x7a,0x76, + 0x2,0x69,0x3b, 0x2,0x6d,0x5c, 0x2,0x71,0x27, 0x3,0x61,0x7b, + 0x1,0x45,0x5d, 0x4,0x21,0x38, 0x2,0x21,0x64, 0x1,0x46,0x67, + 0x2,0x21,0x65, 0x3,0x24,0x2c, 0x3,0x24,0x2d, 0x4,0x23,0x27, + 0x2,0x22,0x63, 0x2,0x22,0x64, 0x3,0x26,0x6b, 0x3,0x26,0x69, + 0x2,0x24,0x66, 0x3,0x26,0x66, 0x3,0x26,0x67, 0x2,0x24,0x62, + 0x3,0x26,0x6a, 0x2,0x24,0x61, 0x1,0x4e,0x6d, 0x2,0x24,0x65, + 0x1,0x4b,0x2a, 0x2,0x24,0x63, 0x1,0x4b,0x29, 0x2,0x24,0x67, + 0x2,0x24,0x64, 0x3,0x26,0x68, 0x2,0x28,0x21, 0x2,0x2b,0x7e, + 0x2,0x27,0x7d, 0x2,0x28,0x26, 0x3,0x2a,0x26, 0x1,0x4e,0x6e, + 0x3,0x2a,0x2a, 0x1,0x4e,0x71, 0x2,0x28,0x27, 0x2,0x28,0x23, + 0x3,0x2a,0x27, 0x2,0x28,0x24, 0x4,0x27,0x36, 0x2,0x27,0x7c, + 0x1,0x4e,0x70, 0x2,0x27,0x7e, 0x1,0x4e,0x6f, 0x2,0x28,0x25, + 0x3,0x2a,0x28, 0x2,0x28,0x22, 0x6,0x2c,0x7e, 0x2,0x2c,0x24, + 0x1,0x52,0x40, 0x1,0x52,0x41, 0x3,0x2d,0x75, 0x2,0x2c,0x27, + 0x2,0x2c,0x21, 0x3,0x2d,0x74, 0x2,0x2c,0x26, 0x3,0x2d,0x70, + 0x2,0x2c,0x22, 0x1,0x52,0x3f, 0x2,0x2c,0x25, 0x2,0x2c,0x23, + 0x3,0x2d,0x73, 0x3,0x2d,0x71, 0x2,0x30,0x69, 0x2,0x30,0x66, + 0x3,0x32,0x38, 0x2,0x30,0x68, 0x1,0x56,0x5b, 0x1,0x56,0x5a, + 0x1,0x56,0x58, 0x2,0x30,0x65, 0x2,0x30,0x6a, 0x1,0x56,0x57, + 0x1,0x56,0x59, 0x2,0x30,0x67, 0x2,0x37,0x2c, 0x2,0x30,0x64, + 0x2,0x30,0x6b, 0x3,0x32,0x39, 0x4,0x33,0x23, 0x4,0x33,0x2a, + 0x3,0x3d,0x26, 0x2,0x37,0x27, 0x2,0x37,0x2b, 0x5,0x33,0x54, + 0x2,0x37,0x2a, 0x2,0x3d,0x72, 0x2,0x3d,0x7d, 0x4,0x33,0x2d, + 0x3,0x37,0x3b, 0x2,0x37,0x2d, 0x3,0x37,0x3a, 0x2,0x37,0x28, + 0x2,0x3d,0x71, 0x1,0x5b,0x79, 0x4,0x33,0x22, 0x4,0x33,0x2c, + 0x1,0x5b,0x78, 0x2,0x37,0x26, 0x2,0x37,0x29, 0x1,0x5b,0x7a, + 0x3,0x37,0x39, 0x1,0x5b,0x77, 0x1,0x5b,0x76, 0x2,0x37,0x25, + 0x2,0x37,0x2e, 0x2,0x3d,0x74, 0x2,0x3d,0x7b, 0x3,0x3d,0x27, + 0x1,0x60,0x5a, 0x2,0x3d,0x7a, 0x2,0x3d,0x77, 0x3,0x3d,0x2e, + 0x1,0x60,0x5c, 0x3,0x3d,0x29, 0x3,0x3d,0x2b, 0x3,0x3d,0x2a, + 0x2,0x3d,0x79, 0x3,0x42,0x61, 0x3,0x3d,0x2d, 0x2,0x3d,0x73, + 0x2,0x3d,0x75, 0x2,0x3d,0x78, 0x2,0x3d,0x76, 0x1,0x60,0x5b, + 0x2,0x3d,0x7c, 0x1,0x60,0x59, 0x1,0x65,0x27, 0x3,0x3d,0x28, + 0x2,0x44,0x71, 0x2,0x44,0x70, 0x2,0x44,0x6e, 0x6,0x54,0x7c, + 0x1,0x65,0x2a, 0x1,0x65,0x29, 0x2,0x44,0x72, 0x3,0x42,0x5f, + 0x2,0x44,0x6f, 0x2,0x4b,0x70, 0x1,0x69,0x62, 0x1,0x65,0x28, + 0x3,0x42,0x62, 0x3,0x65,0x62, 0x3,0x65,0x63, 0x2,0x44,0x74, + 0x2,0x44,0x73, 0x3,0x4d,0x30, 0x2,0x4b,0x73, 0x2,0x4b,0x71, + 0x1,0x6d,0x64, 0x3,0x47,0x79, 0x1,0x69,0x63, 0x2,0x4b,0x72, + 0x2,0x51,0x7e, 0x3,0x47,0x78, 0x3,0x47,0x7a, 0x3,0x47,0x77, + 0x4,0x4a,0x77, 0x1,0x6d,0x65, 0x2,0x51,0x7d, 0x2,0x52,0x28, + 0x2,0x52,0x27, 0x2,0x52,0x25, 0x4,0x4a,0x75, 0x2,0x52,0x24, + 0x2,0x52,0x21, 0x2,0x52,0x22, 0x2,0x52,0x23, 0x2,0x52,0x26, + 0x2,0x52,0x29, 0x2,0x58,0x4b, 0x2,0x58,0x48, 0x2,0x58,0x49, + 0x1,0x71,0x41, 0x2,0x58,0x47, 0x2,0x58,0x4d, 0x2,0x58,0x4c, + 0x2,0x58,0x4a, 0x2,0x5d,0x50, 0x2,0x5d,0x51, 0x1,0x74,0x3c, + 0x3,0x55,0x49, 0x1,0x74,0x3d, 0x2,0x5d,0x4f, 0x4,0x56,0x6c, + 0x1,0x76,0x65, 0x2,0x62,0x2c, 0x1,0x76,0x64, 0x1,0x78,0x4b, + 0x4,0x60,0x25, 0x1,0x78,0x4c, 0x1,0x79,0x78, 0x2,0x69,0x3d, + 0x2,0x69,0x3c, 0x2,0x6b,0x6b, 0x2,0x6d,0x5d, 0x1,0x7b,0x66, + 0x2,0x6f,0x37, 0x2,0x6f,0x36, 0x2,0x6f,0x38, 0x1,0x46,0x68, + 0x2,0x2c,0x28, 0x1,0x56,0x5c, 0x1,0x5b,0x7b, 0x2,0x37,0x2f, + 0x1,0x46,0x69, 0x2,0x21,0x66, 0x1,0x45,0x5e, 0x3,0x22,0x5a, + 0x3,0x21,0x6b, 0x2,0x22,0x65, 0x3,0x24,0x2f, 0x4,0x23,0x2a, + 0xf,0x22,0x66, 0x2,0x24,0x6c, 0x2,0x24,0x6a, 0x2,0x24,0x6b, + 0x2,0x24,0x68, 0x1,0x4b,0x2b, 0x2,0x24,0x69, 0x3,0x26,0x6e, + 0x3,0x2a,0x33, 0x2,0x28,0x2f, 0x3,0x2a,0x2d, 0x1,0x4e,0x74, + 0x2,0x28,0x2d, 0x2,0x28,0x29, 0x2,0x28,0x2c, 0x3,0x2a,0x2c, + 0x2,0x28,0x28, 0x1,0x4e,0x76, 0x2,0x28,0x2b, 0x3,0x2a,0x2b, + 0x1,0x4e,0x73, 0x1,0x4e,0x72, 0x3,0x2a,0x32, 0x1,0x4e,0x75, + 0x2,0x28,0x2e, 0x2,0x28,0x2a, 0x3,0x2a,0x2f, 0x1,0x52,0x45, + 0x1,0x52,0x48, 0x2,0x2c,0x30, 0x2,0x2c,0x2f, 0x2,0x2c,0x2e, + 0x1,0x52,0x42, 0x2,0x2c,0x37, 0x2,0x2c,0x2d, 0x4,0x2e,0x2a, + 0x1,0x52,0x44, 0x2,0x30,0x70, 0x3,0x2d,0x78, 0x2,0x2c,0x34, + 0x2,0x2c,0x32, 0x1,0x52,0x47, 0x3,0x2d,0x7b, 0x2,0x2c,0x2a, + 0x2,0x2c,0x35, 0x3,0x2d,0x77, 0x2,0x2c,0x2c, 0x2,0x2c,0x36, + 0x2,0x2c,0x33, 0x2,0x2c,0x2b, 0x3,0x2d,0x7a, 0x1,0x52,0x43, + 0x2,0x2c,0x38, 0x2,0x2c,0x29, 0x1,0x52,0x46, 0x3,0x2d,0x7e, + 0x3,0x2d,0x79, 0x3,0x2d,0x7c, 0x2,0x30,0x75, 0x2,0x30,0x6c, + 0x2,0x30,0x77, 0x3,0x32,0x3e, 0x2,0x30,0x6f, 0x2,0x30,0x7a, + 0x2,0x30,0x7b, 0x2,0x30,0x6d, 0x2,0x30,0x79, 0x2,0x30,0x76, + 0x2,0x30,0x74, 0x2,0x30,0x78, 0x1,0x56,0x62, 0x3,0x32,0x40, + 0x1,0x56,0x60, 0x3,0x32,0x47, 0x3,0x32,0x3c, 0x2,0x30,0x72, + 0x3,0x32,0x46, 0x2,0x30,0x6e, 0x3,0x32,0x41, 0x2,0x30,0x71, + 0x2,0x30,0x7c, 0x2,0x30,0x73, 0x1,0x56,0x61, 0x2,0x2c,0x31, + 0x3,0x32,0x3d, 0x1,0x56,0x5d, 0x1,0x56,0x5f, 0x3,0x65,0x64, + 0x3,0x37,0x3d, 0x2,0x37,0x3d, 0x2,0x37,0x32, 0x2,0x37,0x30, + 0x3,0x3d,0x38, 0x2,0x37,0x31, 0x3,0x32,0x3f, 0x2,0x37,0x38, + 0x3,0x37,0x40, 0x2,0x37,0x39, 0x2,0x37,0x35, 0x1,0x5c,0x22, + 0x2,0x37,0x3a, 0x2,0x37,0x37, 0x2,0x37,0x34, 0x3,0x37,0x3c, + 0x1,0x5b,0x7e, 0x2,0x37,0x33, 0x1,0x5b,0x7c, 0x1,0x5c,0x21, + 0x2,0x37,0x36, 0x2,0x37,0x3e, 0x1,0x56,0x5e, 0x1,0x5b,0x7d, + 0x2,0x37,0x3c, 0x2,0x37,0x3b, 0x1,0x5c,0x23, 0x3,0x65,0x65, + 0xf,0x36,0x57, 0x3,0x3d,0x36, 0x3,0x3d,0x3a, 0x2,0x3e,0x24, + 0x3,0x3d,0x2f, 0x3,0x3d,0x3b, 0x3,0x3d,0x32, 0x2,0x3e,0x25, + 0x1,0x60,0x66, 0x3,0x3d,0x39, 0x2,0x3e,0x2b, 0x3,0x42,0x6d, + 0x3,0x3d,0x35, 0x2,0x3e,0x2d, 0x2,0x3e,0x26, 0x1,0x60,0x60, + 0x2,0x3e,0x2a, 0x2,0x3e,0x29, 0x1,0x60,0x61, 0x1,0x60,0x67, + 0x3,0x42,0x64, 0x1,0x60,0x68, 0x2,0x3e,0x2c, 0x1,0x60,0x5e, + 0x2,0x3e,0x23, 0x2,0x3e,0x21, 0x2,0x3e,0x27, 0x2,0x3d,0x7e, + 0x1,0x60,0x65, 0x2,0x3e,0x22, 0x2,0x3e,0x28, 0x2,0x3e,0x2e, + 0x1,0x60,0x5f, 0x1,0x60,0x64, 0x1,0x60,0x62, 0x1,0x60,0x63, + 0x3,0x3d,0x33, 0x3,0x3d,0x3c, 0x1,0x60,0x5d, 0x3,0x65,0x66, + 0x3,0x3d,0x37, 0x3,0x42,0x68, 0x3,0x42,0x75, 0x1,0x65,0x31, + 0x2,0x44,0x7b, 0x1,0x65,0x30, 0x2,0x45,0x21, 0x3,0x42,0x6f, + 0x2,0x44,0x75, 0x3,0x42,0x74, 0x2,0x45,0x22, 0x3,0x42,0x6e, + 0x3,0x42,0x66, 0x3,0x42,0x71, 0x2,0x44,0x76, 0x2,0x44,0x77, + 0x3,0x42,0x73, 0x2,0x45,0x23, 0x2,0x44,0x7e, 0x2,0x44,0x7c, + 0x2,0x44,0x7d, 0x2,0x44,0x79, 0x2,0x44,0x78, 0x3,0x42,0x67, + 0x2,0x45,0x24, 0x1,0x65,0x2d, 0x3,0x42,0x6b, 0x2,0x44,0x7a, + 0x3,0x42,0x70, 0x1,0x65,0x32, 0x1,0x65,0x2c, 0x1,0x65,0x33, + 0x1,0x65,0x34, 0x3,0x42,0x6a, 0x1,0x65,0x2f, 0x1,0x65,0x2e, + 0x3,0x48,0x25, 0x3,0x47,0x7e, 0x2,0x4b,0x74, 0x1,0x69,0x65, + 0x1,0x69,0x64, 0x3,0x47,0x7c, 0x3,0x47,0x7d, 0x2,0x4b,0x79, + 0x3,0x48,0x22, 0x1,0x6d,0x66, 0x1,0x69,0x66, 0x3,0x48,0x21, + 0x3,0x47,0x7b, 0x1,0x69,0x68, 0x2,0x4b,0x7a, 0x1,0x65,0x2b, + 0x1,0x69,0x67, 0x2,0x4b,0x76, 0x2,0x4b,0x78, 0x2,0x4b,0x75, + 0x3,0x48,0x27, 0x2,0x4b,0x77, 0x3,0x48,0x23, 0xf,0x49,0x76, + 0x2,0x52,0x33, 0x3,0x4d,0x31, 0x3,0x4d,0x3b, 0x2,0x52,0x32, + 0x2,0x52,0x2f, 0x1,0x6d,0x69, 0x2,0x58,0x4e, 0x1,0x6d,0x6a, + 0x2,0x52,0x2e, 0x3,0x4d,0x39, 0x1,0x6d,0x68, 0x3,0x4d,0x36, + 0x2,0x52,0x30, 0x2,0x52,0x2d, 0x2,0x52,0x2a, 0x2,0x52,0x31, + 0x2,0x52,0x2b, 0x2,0x52,0x2c, 0x1,0x6d,0x67, 0x3,0x4d,0x35, + 0x3,0x65,0x68, 0x4,0x51,0x39, 0x2,0x5d,0x55, 0x4,0x51,0x3a, + 0x2,0x58,0x52, 0x3,0x4d,0x3a, 0x2,0x58,0x51, 0x2,0x58,0x53, + 0x3,0x51,0x6a, 0x2,0x5d,0x52, 0x1,0x71,0x44, 0x4,0x51,0x38, + 0x2,0x58,0x4f, 0x3,0x51,0x67, 0x1,0x71,0x42, 0x3,0x51,0x6c, + 0x1,0x71,0x46, 0x1,0x71,0x45, 0x2,0x58,0x50, 0x2,0x58,0x54, + 0x3,0x51,0x6b, 0x1,0x71,0x43, 0x3,0x65,0x67, 0x2,0x5d,0x59, + 0x1,0x74,0x40, 0x1,0x76,0x66, 0x1,0x74,0x41, 0x1,0x74,0x3e, + 0x2,0x5d,0x56, 0x2,0x5d,0x54, 0x3,0x55,0x4f, 0x2,0x5d,0x57, + 0x3,0x55,0x4b, 0x2,0x5d,0x5a, 0x1,0x74,0x3f, 0x2,0x5d,0x58, + 0x2,0x5d,0x53, 0x3,0x55,0x4d, 0x3,0x65,0x69, 0x2,0x62,0x2f, + 0x2,0x62,0x32, 0x2,0x66,0x21, 0x2,0x62,0x2d, 0x3,0x58,0x2f, + 0x2,0x69,0x3e, 0x2,0x62,0x33, 0x3,0x58,0x30, 0x1,0x78,0x4d, + 0x2,0x62,0x31, 0x1,0x76,0x67, 0x2,0x62,0x2e, 0x2,0x62,0x30, + 0x2,0x62,0x34, 0x2,0x66,0x22, 0x3,0x5a,0x5a, 0x2,0x65,0x7e, + 0x4,0x60,0x27, 0x3,0x5a,0x5c, 0x3,0x5a,0x5d, 0x3,0x5a,0x5b, + 0x1,0x78,0x4e, 0x2,0x65,0x7d, 0x3,0x5c,0x5e, 0x3,0x5c,0x5c, + 0x3,0x5c,0x5f, 0x1,0x79,0x79, 0x3,0x5c,0x5d, 0x3,0x5c,0x60, + 0x3,0x5e,0x3d, 0x1,0x7a,0x78, 0x2,0x6d,0x5f, 0x1,0x7a,0x77, + 0x2,0x6d,0x61, 0x2,0x6d,0x5e, 0x2,0x6d,0x60, 0x1,0x7c,0x3c, + 0x2,0x70,0x40, 0x1,0x46,0x6a, 0x2,0x28,0x30, 0x2,0x30,0x7d, + 0x2,0x30,0x7e, 0x1,0x5c,0x24, 0x2,0x45,0x25, 0x1,0x71,0x47, + 0x1,0x78,0x4f, 0x1,0x7b,0x67, 0x2,0x70,0x41, 0x1,0x46,0x6b, + 0x2,0x28,0x31, 0x1,0x23,0x22, 0x4,0x2a,0x3c, 0x3,0x2e,0x22, + 0x2,0x2c,0x39, 0x3,0x2e,0x21, 0x2,0x2c,0x3a, 0x3,0x2e,0x24, + 0x3,0x32,0x48, 0x2,0x31,0x21, 0x2,0x31,0x22, 0x1,0x5c,0x25, + 0x1,0x5c,0x26, 0xf,0x36,0x67, 0x3,0x3d,0x3d, 0x4,0x39,0x25, + 0x2,0x3e,0x2f, 0x2,0x45,0x28, 0x2,0x45,0x27, 0x2,0x45,0x26, + 0x2,0x4b,0x7b, 0x3,0x42,0x77, 0x2,0x4b,0x7c, 0x2,0x4b,0x7d, + 0x1,0x69,0x69, 0x3,0x48,0x28, 0x2,0x52,0x35, 0x2,0x52,0x34, + 0x3,0x4d,0x3d, 0x3,0x51,0x6d, 0x2,0x58,0x55, 0x1,0x71,0x48, + 0x1,0x71,0x49, 0x3,0x51,0x6e, 0x2,0x5d,0x5e, 0x2,0x5d,0x5b, + 0x2,0x5d,0x5c, 0x2,0x5d,0x5d, 0x2,0x62,0x36, 0x2,0x62,0x35, + 0x1,0x76,0x68, 0x2,0x66,0x23, 0x2,0x6b,0x6c, 0x1,0x46,0x6c, + 0x1,0x52,0x49, 0x3,0x37,0x44, 0x1,0x5c,0x27, 0x2,0x45,0x29, + 0x3,0x42,0x78, 0x1,0x46,0x6d, 0x4,0x2a,0x40, 0x2,0x31,0x23, + 0x1,0x5c,0x28, 0x3,0x37,0x45, 0x3,0x3d,0x3e, 0x1,0x60,0x69, + 0x1,0x60,0x6a, 0x5,0x47,0x49, 0x1,0x46,0x6e, 0x1,0x46,0x6f, + 0x2,0x22,0x66, 0x1,0x4b,0x2d, 0x1,0x4b,0x2c, 0x1,0x52,0x4a, + 0x2,0x2c,0x3b, 0x2,0x3e,0x30, 0x1,0x46,0x70, 0x1,0x46,0x71, + 0x1,0x46,0x72, 0x1,0x46,0x73, 0x4,0x23,0x2b, 0x1,0x4b,0x2e, + 0x1,0x4b,0x2f, 0x2,0x24,0x6e, 0x2,0x24,0x6d, 0x3,0x2a,0x37, + 0x1,0x4e,0x77, 0x2,0x28,0x34, 0x2,0x28,0x32, 0x2,0x28,0x33, + 0x3,0x2a,0x38, 0x3,0x2a,0x35, 0x4,0x27,0x40, 0x3,0x2a,0x36, + 0x3,0x2e,0x27, 0x2,0x2c,0x3c, 0x2,0x2c,0x3d, 0x3,0x2e,0x25, + 0x3,0x2e,0x28, 0x1,0x52,0x4e, 0x1,0x52,0x4c, 0x3,0x2e,0x2a, + 0x1,0x52,0x4d, 0x1,0x52,0x4b, 0x3,0x2e,0x26, 0xf,0x2b,0x7a, + 0xf,0x2c,0x4a, 0x1,0x56,0x63, 0x3,0x32,0x4e, 0x3,0x32,0x4d, + 0x3,0x32,0x50, 0x3,0x32,0x4f, 0x1,0x56,0x67, 0x1,0x56,0x66, + 0x2,0x31,0x24, 0x1,0x56,0x65, 0x1,0x56,0x64, 0x3,0x32,0x51, + 0x2,0x31,0x25, 0x3,0x37,0x46, 0x1,0x5c,0x2b, 0x2,0x37,0x40, + 0x2,0x37,0x3f, 0x1,0x5c,0x29, 0x1,0x5c,0x2a, 0x3,0x37,0x49, + 0x3,0x37,0x47, 0x1,0x60,0x6c, 0x1,0x60,0x6b, 0x2,0x3e,0x32, + 0x3,0x3d,0x43, 0x3,0x3d,0x42, 0x2,0x3e,0x31, 0x1,0x5c,0x2c, + 0x3,0x3d,0x44, 0x4,0x39,0x2c, 0x4,0x3e,0x6b, 0x1,0x65,0x35, + 0x2,0x45,0x2b, 0x1,0x65,0x36, 0x2,0x45,0x2a, 0x3,0x42,0x7b, + 0x4,0x44,0x7c, 0x4,0x44,0x7b, 0x2,0x4b,0x7e, 0x2,0x52,0x36, + 0x1,0x6d,0x6b, 0x2,0x58,0x56, 0x3,0x51,0x70, 0x3,0x55,0x52, + 0x2,0x5d,0x5f, 0x4,0x5b,0x74, 0x1,0x78,0x51, 0x1,0x78,0x50, + 0x4,0x63,0x68, 0x3,0x5c,0x62, 0x1,0x7b,0x68, 0x1,0x46,0x74, + 0x2,0x28,0x35, 0x3,0x3d,0x45, 0x1,0x5c,0x2d, 0x2,0x4c,0x21, + 0x1,0x69,0x6a, 0x3,0x22,0x5b, 0x3,0x26,0x73, 0x2,0x24,0x6f, + 0x2,0x24,0x70, 0x2,0x28,0x36, 0x1,0x4e,0x79, 0x1,0x4e,0x7a, + 0x3,0x2a,0x3a, 0x4,0x27,0x43, 0x1,0x4e,0x78, 0x3,0x2a,0x3b, + 0x1,0x52,0x52, 0x1,0x52,0x53, 0x1,0x52,0x50, 0x1,0x52,0x51, + 0x3,0x2e,0x2b, 0x2,0x2c,0x3e, 0x3,0x2e,0x2f, 0x4,0x2a,0x4a, + 0x2,0x2c,0x3f, 0x1,0x52,0x4f, 0x2,0x31,0x26, 0x3,0x32,0x57, + 0x1,0x56,0x6b, 0x1,0x56,0x6c, 0x3,0x32,0x55, 0x1,0x5c,0x30, + 0x2,0x31,0x2c, 0x4,0x2e,0x40, 0x1,0x56,0x71, 0x1,0x56,0x6f, + 0x2,0x31,0x2d, 0x2,0x31,0x28, 0x1,0x56,0x6e, 0x1,0x56,0x6d, + 0x1,0x56,0x68, 0x2,0x31,0x2b, 0x2,0x31,0x2a, 0x2,0x31,0x27, + 0x1,0x56,0x70, 0x3,0x32,0x52, 0x2,0x31,0x29, 0x1,0x56,0x69, + 0x4,0x2e,0x34, 0x1,0x56,0x6a, 0x1,0x5c,0x31, 0x2,0x37,0x44, + 0x2,0x37,0x45, 0x1,0x5c,0x32, 0x2,0x37,0x41, 0x2,0x37,0x43, + 0x2,0x37,0x47, 0x2,0x37,0x46, 0x2,0x37,0x42, 0x3,0x37,0x4a, + 0x1,0x5c,0x2e, 0x1,0x5c,0x2f, 0x2,0x3e,0x3a, 0x1,0x60,0x71, + 0x1,0x60,0x70, 0x2,0x3e,0x34, 0x1,0x60,0x6e, 0x4,0x39,0x34, + 0x2,0x3e,0x37, 0x1,0x60,0x72, 0x2,0x3e,0x38, 0x1,0x60,0x73, + 0x2,0x3e,0x35, 0x1,0x60,0x6d, 0x1,0x60,0x6f, 0x2,0x3e,0x39, + 0x3,0x3d,0x47, 0x2,0x3e,0x36, 0x2,0x3e,0x33, 0x4,0x3e,0x77, + 0x2,0x45,0x38, 0x3,0x42,0x7c, 0x2,0x45,0x2d, 0x1,0x65,0x38, + 0x1,0x65,0x3b, 0x1,0x65,0x3a, 0x1,0x65,0x3f, 0x1,0x65,0x3e, + 0x2,0x45,0x39, 0x2,0x45,0x37, 0x2,0x45,0x30, 0x2,0x45,0x34, + 0x2,0x45,0x33, 0x1,0x65,0x3c, 0x2,0x45,0x36, 0x2,0x45,0x32, + 0x2,0x45,0x3a, 0x2,0x45,0x31, 0x1,0x65,0x3d, 0x1,0x65,0x37, + 0x1,0x65,0x39, 0x3,0x42,0x7d, 0x2,0x45,0x2f, 0x3,0x48,0x2b, + 0x2,0x4c,0x23, 0x1,0x69,0x6e, 0x2,0x4c,0x27, 0x1,0x69,0x6d, + 0x2,0x4c,0x24, 0x1,0x69,0x6c, 0x3,0x48,0x29, 0x2,0x45,0x2e, + 0x2,0x45,0x35, 0x2,0x4c,0x26, 0x4,0x44,0x7e, 0x1,0x69,0x6f, + 0x2,0x4c,0x28, 0x2,0x4c,0x25, 0x2,0x4c,0x22, 0x2,0x52,0x39, + 0x2,0x52,0x3d, 0x2,0x52,0x3f, 0x2,0x52,0x3b, 0x2,0x52,0x3a, + 0x2,0x52,0x38, 0x1,0x6d,0x6e, 0x1,0x6d,0x6c, 0x1,0x6d,0x71, + 0x1,0x6d,0x72, 0x2,0x52,0x3c, 0x1,0x6d,0x6f, 0x2,0x52,0x37, + 0x1,0x6d,0x70, 0x1,0x69,0x6b, 0x2,0x52,0x3e, 0x1,0x6d,0x6d, + 0x3,0x51,0x71, 0x2,0x58,0x58, 0x4,0x51,0x4f, 0x2,0x58,0x57, + 0x2,0x58,0x5f, 0x2,0x58,0x59, 0x2,0x58,0x5e, 0x2,0x58,0x5b, + 0x1,0x71,0x4a, 0x2,0x58,0x5d, 0x3,0x51,0x73, 0x3,0x51,0x72, + 0x1,0x71,0x4b, 0x4,0x51,0x4d, 0x1,0x71,0x4c, 0x3,0x51,0x74, + 0x2,0x58,0x5c, 0x2,0x58,0x5a, 0x4,0x57,0x21, 0x4,0x57,0x24, + 0x1,0x74,0x43, 0x2,0x5d,0x60, 0x3,0x55,0x55, 0x3,0x55,0x53, + 0x1,0x74,0x42, 0x2,0x5d,0x63, 0x2,0x5d,0x61, 0x2,0x5d,0x62, + 0x5,0x55,0x69, 0x5,0x5c,0x36, 0x1,0x74,0x44, 0x3,0x55,0x54, + 0x3,0x58,0x34, 0x2,0x62,0x3a, 0x3,0x58,0x33, 0x1,0x76,0x6b, + 0x2,0x62,0x3b, 0x4,0x5b,0x75, 0x4,0x5b,0x79, 0x1,0x76,0x69, + 0x2,0x62,0x3c, 0x1,0x76,0x6a, 0x2,0x62,0x39, 0x2,0x62,0x3d, + 0x3,0x58,0x32, 0x2,0x62,0x37, 0x1,0x78,0x52, 0x2,0x66,0x24, + 0x1,0x78,0x53, 0x1,0x79,0x7a, 0x2,0x62,0x38, 0x1,0x79,0x7b, + 0x3,0x5e,0x3f, 0x3,0x5e,0x3e, 0x1,0x7a,0x79, 0x2,0x6b,0x6d, + 0x1,0x7b,0x6a, 0x2,0x6d,0x62, 0x1,0x7b,0x69, 0x3,0x60,0x3b, + 0x2,0x6f,0x39, 0x1,0x7c,0x61, 0x1,0x7c,0x62, 0x3,0x65,0x6a, + 0x7,0x64,0x52, 0x2,0x72,0x3a, 0x3,0x22,0x5c, 0x3,0x65,0x6b, + 0x1,0x52,0x54, 0x2,0x2c,0x40, 0x1,0x60,0x74, 0x1,0x60,0x75, + 0x1,0x46,0x75, 0x1,0x48,0x4b, 0x2,0x22,0x67, 0x3,0x26,0x74, + 0x2,0x24,0x71, 0x1,0x4b,0x30, 0x3,0x26,0x76, 0x1,0x4e,0x7b, + 0x4,0x2a,0x4c, 0x1,0x52,0x55, 0x1,0x52,0x56, 0x1,0x52,0x57, + 0x2,0x37,0x49, 0x2,0x31,0x2e, 0x1,0x56,0x72, 0x4,0x2e,0x41, + 0x4,0x2e,0x43, 0x1,0x5c,0x33, 0x2,0x37,0x48, 0x3,0x37,0x4d, + 0x2,0x3e,0x3c, 0x1,0x60,0x77, 0x3,0x3d,0x4c, 0x2,0x3e,0x3b, + 0x1,0x60,0x76, 0x3,0x42,0x7e, 0x3,0x43,0x21, 0x2,0x45,0x3b, + 0x1,0x6d,0x73, 0x2,0x52,0x43, 0x2,0x52,0x40, 0x2,0x52,0x41, + 0x2,0x52,0x42, 0x4,0x51,0x54, 0x4,0x51,0x55, 0x3,0x51,0x76, + 0x5,0x5c,0x43, 0x3,0x55,0x56, 0x2,0x5d,0x64, 0x3,0x55,0x57, + 0x2,0x62,0x3e, 0x4,0x5b,0x7c, 0x4,0x5b,0x7d, 0x3,0x5a,0x5e, + 0x2,0x69,0x40, 0x2,0x69,0x3f, 0x4,0x66,0x5a, 0x2,0x6d,0x63, + 0x1,0x46,0x76, 0x2,0x28,0x37, 0x1,0x56,0x73, 0x3,0x3d,0x4d, + 0x1,0x60,0x78, 0x2,0x45,0x3c, 0x4,0x45,0x34, 0x3,0x48,0x30, + 0x2,0x4c,0x29, 0x3,0x48,0x2e, 0x1,0x6d,0x74, 0x2,0x58,0x60, + 0x3,0x65,0x6c, 0x2,0x62,0x3f, 0x2,0x69,0x41, 0x1,0x46,0x77, + 0x3,0x26,0x77, 0x3,0x26,0x78, 0x1,0x4e,0x7c, 0x1,0x52,0x5a, + 0x2,0x2c,0x41, 0x1,0x52,0x5b, 0x1,0x52,0x59, 0x3,0x2e,0x32, + 0x1,0x52,0x58, 0x2,0x31,0x2f, 0x1,0x56,0x74, 0x3,0x32,0x5a, + 0x3,0x32,0x5b, 0x1,0x56,0x75, 0x1,0x56,0x76, 0x1,0x5c,0x35, + 0x2,0x37,0x4a, 0x1,0x5c,0x34, 0x3,0x37,0x50, 0x3,0x37,0x52, + 0x3,0x37,0x51, 0xf,0x37,0x23, 0x3,0x3d,0x4f, 0x2,0x3e,0x3d, + 0x1,0x5c,0x36, 0x1,0x60,0x79, 0x2,0x45,0x3d, 0x1,0x65,0x40, + 0x1,0x65,0x41, 0x4,0x45,0x35, 0x1,0x69,0x70, 0x3,0x48,0x31, + 0x1,0x69,0x71, 0x1,0x6d,0x75, 0x1,0x71,0x4e, 0x2,0x58,0x61, + 0x1,0x71,0x4d, 0x4,0x57,0x2d, 0x2,0x5d,0x65, 0x1,0x74,0x45, + 0x3,0x58,0x35, 0x2,0x62,0x40, 0x2,0x69,0x42, 0x1,0x46,0x78, + 0x1,0x4b,0x31, 0x2,0x28,0x3a, 0x2,0x28,0x39, 0x1,0x4e,0x7d, + 0x2,0x28,0x38, 0x1,0x4e,0x7e, 0x2,0x28,0x3b, 0x4,0x2a,0x55, + 0x2,0x2c,0x47, 0x1,0x52,0x5e, 0x1,0x52,0x5d, 0x2,0x2c,0x49, + 0x2,0x2c,0x48, 0x1,0x52,0x62, 0x3,0x2e,0x35, 0x1,0x52,0x61, + 0x3,0x2e,0x33, 0x4,0x2a,0x59, 0x1,0x52,0x5c, 0x4,0x2a,0x5d, + 0x2,0x2c,0x43, 0x2,0x2c,0x44, 0x2,0x2c,0x45, 0x4,0x2a,0x52, + 0x1,0x52,0x63, 0x2,0x2c,0x42, 0x1,0x52,0x5f, 0x2,0x2c,0x46, + 0x1,0x52,0x60, 0x3,0x32,0x64, 0x3,0x32,0x5f, 0x2,0x31,0x32, + 0x2,0x31,0x36, 0x2,0x31,0x34, 0x2,0x31,0x33, 0x4,0x2e,0x55, + 0x2,0x31,0x37, 0x3,0x32,0x5e, 0x4,0x2e,0x4f, 0x3,0x32,0x68, + 0x2,0x31,0x38, 0x2,0x31,0x39, 0x2,0x31,0x31, 0x4,0x2e,0x51, + 0x2,0x31,0x30, 0x3,0x37,0x59, 0x1,0x56,0x78, 0x1,0x56,0x79, + 0x3,0x32,0x67, 0x2,0x31,0x3a, 0x2,0x31,0x35, 0x3,0x32,0x65, + 0x2,0x37,0x53, 0x3,0x37,0x55, 0x2,0x31,0x3b, 0x1,0x56,0x7a, + 0x1,0x56,0x77, 0x3,0x32,0x5c, 0x3,0x32,0x63, 0x2,0x37,0x4d, + 0x4,0x33,0x4f, 0x2,0x37,0x4c, 0x3,0x37,0x53, 0x2,0x37,0x4e, + 0x2,0x37,0x4f, 0x2,0x37,0x51, 0x2,0x37,0x50, 0x2,0x37,0x55, + 0x1,0x5c,0x3a, 0x1,0x5c,0x37, 0x1,0x5c,0x3b, 0x2,0x37,0x4b, + 0x1,0x5c,0x3c, 0x2,0x37,0x54, 0x1,0x5c,0x39, 0x2,0x37,0x52, + 0x1,0x5c,0x38, 0x3,0x32,0x62, 0x3,0x37,0x57, 0x4,0x33,0x56, + 0x3,0x3d,0x56, 0x3,0x3d,0x53, 0x2,0x3e,0x40, 0x2,0x3e,0x42, + 0x2,0x3e,0x3e, 0x2,0x3e,0x3f, 0x3,0x3d,0x51, 0x3,0x3d,0x52, + 0x2,0x3e,0x43, 0x2,0x3e,0x45, 0x2,0x3e,0x46, 0x2,0x3e,0x41, + 0x2,0x3e,0x44, 0x1,0x60,0x7a, 0x2,0x45,0x41, 0x3,0x43,0x27, + 0x2,0x45,0x46, 0x2,0x45,0x3e, 0x2,0x45,0x42, 0x4,0x3f,0x29, + 0x3,0x43,0x28, 0x2,0x45,0x47, 0x2,0x45,0x43, 0x1,0x65,0x42, + 0x1,0x65,0x4a, 0x3,0x43,0x25, 0x1,0x65,0x45, 0x2,0x45,0x3f, + 0x2,0x45,0x40, 0x1,0x69,0x75, 0x1,0x65,0x4d, 0x1,0x65,0x46, + 0x3,0x43,0x26, 0x1,0x65,0x4b, 0x1,0x65,0x44, 0x2,0x45,0x45, + 0x1,0x65,0x4c, 0x2,0x45,0x44, 0x1,0x65,0x48, 0x1,0x65,0x43, + 0x1,0x65,0x49, 0x2,0x45,0x48, 0x2,0x4c,0x2e, 0x2,0x4c,0x30, + 0x4,0x45,0x42, 0x3,0x48,0x39, 0x4,0x45,0x40, 0x4,0x45,0x3d, + 0x3,0x48,0x33, 0x3,0x48,0x36, 0x3,0x48,0x35, 0x3,0x48,0x34, + 0x3,0x48,0x38, 0x1,0x65,0x47, 0x3,0x48,0x3b, 0x3,0x48,0x3d, + 0x2,0x4c,0x2b, 0x1,0x69,0x73, 0x2,0x4c,0x31, 0x1,0x69,0x74, + 0x2,0x4c,0x2f, 0x2,0x4c,0x2a, 0x2,0x4c,0x2d, 0x2,0x4c,0x32, + 0x1,0x69,0x72, 0x2,0x4c,0x2c, 0x1,0x6d,0x77, 0x2,0x52,0x47, + 0x2,0x52,0x46, 0x3,0x4d,0x44, 0x1,0x6d,0x7a, 0x1,0x6d,0x78, + 0x2,0x52,0x44, 0x1,0x6d,0x76, 0x2,0x52,0x45, 0x3,0x4d,0x46, + 0x1,0x6d,0x79, 0x4,0x51,0x5f, 0x2,0x58,0x69, 0x3,0x51,0x7b, + 0x2,0x58,0x6b, 0x3,0x51,0x79, 0x2,0x58,0x6a, 0x2,0x58,0x62, + 0x2,0x58,0x66, 0x2,0x58,0x65, 0x2,0x58,0x63, 0x1,0x71,0x50, + 0x1,0x71,0x51, 0x1,0x71,0x4f, 0x2,0x58,0x64, 0x2,0x58,0x67, + 0x2,0x58,0x68, 0x3,0x55,0x59, 0x1,0x71,0x52, 0x3,0x55,0x58, + 0x1,0x74,0x4a, 0x2,0x5d,0x6d, 0x3,0x55,0x5b, 0x1,0x74,0x47, + 0x2,0x5d,0x67, 0x1,0x74,0x49, 0x1,0x74,0x4b, 0x4,0x51,0x61, + 0x3,0x55,0x5c, 0x1,0x74,0x48, 0x2,0x5d,0x6c, 0x2,0x5d,0x68, + 0x1,0x74,0x46, 0x2,0x5d,0x6b, 0x2,0x5d,0x66, 0x2,0x5d,0x6a, + 0x2,0x5d,0x69, 0x3,0x58,0x36, 0x3,0x58,0x38, 0x2,0x62,0x42, + 0x1,0x76,0x6e, 0x1,0x76,0x6f, 0x1,0x76,0x6c, 0x3,0x58,0x3b, + 0x1,0x76,0x6d, 0x3,0x58,0x3a, 0x3,0x58,0x39, 0x2,0x62,0x41, + 0x4,0x60,0x39, 0x2,0x66,0x27, 0x3,0x5a,0x60, 0x3,0x5a,0x5f, + 0x1,0x78,0x54, 0x2,0x66,0x25, 0x2,0x66,0x26, 0x2,0x69,0x43, + 0x2,0x69,0x46, 0x2,0x69,0x44, 0x2,0x69,0x45, 0x2,0x6b,0x6e, + 0x3,0x5e,0x42, 0x4,0x66,0x5e, 0x1,0x7a,0x7a, 0x2,0x6f,0x3a, + 0x2,0x70,0x42, 0x4,0x6b,0x74, 0x1,0x7c,0x63, 0x2,0x71,0x28, + 0x2,0x71,0x29, 0x1,0x7d,0x33, 0x1,0x46,0x79, 0x1,0x52,0x64, + 0x3,0x32,0x69, 0x2,0x3e,0x47, 0x3,0x3d,0x57, 0x2,0x45,0x49, + 0x4,0x6c,0x76, 0x1,0x46,0x7a, 0x1,0x4b,0x32, 0x4,0x27,0x52, + 0x1,0x4f,0x21, 0x3,0x2e,0x36, 0x2,0x2c,0x4a, 0x2,0x2c,0x4b, + 0x1,0x56,0x7b, 0x4,0x33,0x5b, 0x2,0x3e,0x48, 0x1,0x60,0x7b, + 0x1,0x65,0x4e, 0x1,0x74,0x4c, 0x2,0x5d,0x6e, 0x2,0x66,0x28, + 0x2,0x69,0x47, 0x1,0x46,0x7b, 0x3,0x26,0x7b, 0x3,0x26,0x7c, + 0xf,0x25,0x23, 0x2,0x28,0x41, 0x2,0x28,0x3c, 0x2,0x28,0x3e, + 0x2,0x28,0x40, 0x2,0x28,0x3f, 0x2,0x28,0x3d, 0x1,0x4f,0x22, + 0xf,0x28,0x34, 0x1,0x52,0x65, 0x2,0x2c,0x54, 0x3,0x2e,0x39, + 0x2,0x2c,0x4f, 0x2,0x2c,0x4c, 0x3,0x2e,0x3b, 0x3,0x2e,0x3e, + 0x2,0x2c,0x53, 0x3,0x2e,0x37, 0x3,0x2e,0x3a, 0x1,0x52,0x67, + 0x1,0x52,0x68, 0x2,0x2c,0x52, 0x2,0x2c,0x51, 0x2,0x2c,0x50, + 0x2,0x2c,0x4d, 0x2,0x2c,0x4e, 0x2,0x2c,0x55, 0x1,0x52,0x66, + 0x3,0x2e,0x3d, 0xf,0x2c,0x5c, 0x3,0x65,0x6d, 0x3,0x65,0x6e, + 0x1,0x57,0x21, 0x3,0x66,0x7c, 0x1,0x57,0x27, 0x1,0x57,0x26, + 0x2,0x31,0x44, 0x2,0x31,0x3e, 0x2,0x31,0x3c, 0x3,0x32,0x6c, + 0x1,0x57,0x24, 0x2,0x37,0x5c, 0x1,0x56,0x7d, 0x2,0x31,0x41, + 0x2,0x31,0x45, 0x2,0x31,0x47, 0x2,0x31,0x43, 0x2,0x31,0x3d, + 0x1,0x57,0x25, 0x2,0x31,0x42, 0x2,0x31,0x40, 0x1,0x56,0x7c, + 0x2,0x31,0x48, 0x1,0x57,0x28, 0x2,0x31,0x46, 0x1,0x57,0x22, + 0x2,0x31,0x3f, 0x3,0x32,0x6d, 0x1,0x57,0x23, 0x1,0x56,0x7e, + 0x3,0x65,0x6f, 0x3,0x37,0x62, 0x1,0x5c,0x3e, 0x4,0x33,0x5d, + 0x2,0x37,0x5d, 0x3,0x37,0x63, 0x3,0x37,0x5d, 0x2,0x37,0x56, + 0x2,0x37,0x58, 0x2,0x37,0x5a, 0x3,0x37,0x5f, 0x2,0x37,0x5b, + 0x2,0x37,0x59, 0x1,0x5c,0x3f, 0x3,0x37,0x61, 0x2,0x37,0x5e, + 0x3,0x37,0x60, 0x2,0x37,0x57, 0x3,0x65,0x70, 0x3,0x65,0x71, + 0x3,0x65,0x72, 0x2,0x3e,0x4c, 0x1,0x60,0x7c, 0x2,0x3e,0x54, + 0x3,0x3d,0x5c, 0x2,0x3e,0x49, 0x6,0x4c,0x2f, 0x2,0x3e,0x55, + 0x3,0x3d,0x59, 0x2,0x3e,0x4a, 0x2,0x3e,0x4b, 0x3,0x3d,0x5d, + 0x4,0x39,0x54, 0x2,0x3e,0x53, 0x2,0x3e,0x52, 0x2,0x3e,0x4f, + 0x1,0x5c,0x3d, 0x1,0x60,0x7d, 0x2,0x3e,0x4d, 0x2,0x3e,0x50, + 0x1,0x60,0x7e, 0x2,0x3e,0x51, 0x2,0x3e,0x4e, 0x3,0x3d,0x5a, + 0x3,0x43,0x31, 0x2,0x45,0x54, 0x3,0x43,0x2d, 0x2,0x45,0x58, + 0x1,0x65,0x55, 0x3,0x43,0x2e, 0x2,0x4c,0x38, 0x1,0x65,0x58, + 0x2,0x45,0x56, 0x3,0x43,0x37, 0x3,0x43,0x29, 0x2,0x45,0x53, + 0x2,0x45,0x4e, 0x2,0x45,0x50, 0x2,0x45,0x51, 0x2,0x45,0x4a, + 0x3,0x43,0x35, 0x1,0x65,0x54, 0x3,0x43,0x2b, 0x3,0x43,0x30, + 0x1,0x65,0x53, 0x3,0x43,0x34, 0x1,0x65,0x4f, 0x2,0x45,0x4d, + 0x3,0x43,0x2a, 0x1,0x65,0x56, 0x3,0x43,0x36, 0x1,0x65,0x57, + 0x2,0x45,0x4c, 0x2,0x45,0x4f, 0x2,0x45,0x57, 0x1,0x65,0x51, + 0x1,0x65,0x52, 0x2,0x45,0x55, 0x2,0x45,0x4b, 0xf,0x44,0x25, + 0x4,0x45,0x53, 0x2,0x4c,0x3a, 0x1,0x69,0x77, 0x2,0x4c,0x3c, + 0x2,0x45,0x52, 0x2,0x4c,0x3e, 0x1,0x69,0x7b, 0x2,0x4c,0x3f, + 0x2,0x4c,0x3b, 0x3,0x48,0x3e, 0x1,0x69,0x78, 0x2,0x4c,0x37, + 0x1,0x69,0x7a, 0x2,0x4c,0x34, 0x2,0x4c,0x39, 0x2,0x4c,0x3d, + 0x2,0x4c,0x36, 0x3,0x48,0x3f, 0x3,0x48,0x45, 0x1,0x65,0x50, + 0x3,0x48,0x44, 0x2,0x4c,0x33, 0x1,0x69,0x79, 0x2,0x4c,0x35, + 0x3,0x65,0x73, 0x3,0x48,0x40, 0xf,0x4a,0x3f, 0x1,0x6d,0x7d, + 0x2,0x52,0x49, 0x1,0x6e,0x23, 0x4,0x4b,0x59, 0x1,0x6e,0x21, + 0x4,0x4b,0x57, 0x3,0x4d,0x4a, 0x1,0x69,0x76, 0x3,0x4d,0x4d, + 0x2,0x52,0x50, 0x2,0x52,0x51, 0x1,0x6d,0x7c, 0x3,0x4d,0x48, + 0x3,0x4d,0x4c, 0x2,0x52,0x4f, 0x2,0x52,0x52, 0x1,0x6d,0x7e, + 0x1,0x6d,0x7b, 0x2,0x52,0x4b, 0x2,0x52,0x48, 0x2,0x52,0x4d, + 0x2,0x52,0x4a, 0x1,0x6e,0x24, 0x2,0x52,0x4c, 0x3,0x4d,0x4b, + 0x3,0x4d,0x49, 0x2,0x52,0x4e, 0x1,0x6e,0x22, 0x3,0x52,0x21, + 0x3,0x65,0x74, 0x1,0x71,0x54, 0x2,0x58,0x72, 0x3,0x52,0x24, + 0x2,0x58,0x6c, 0x2,0x58,0x70, 0x2,0x58,0x76, 0x2,0x58,0x77, + 0x2,0x58,0x73, 0x2,0x58,0x74, 0x2,0x58,0x71, 0x4,0x4b,0x5d, + 0x2,0x58,0x6e, 0x4,0x51,0x6e, 0x1,0x71,0x56, 0x1,0x71,0x53, + 0x2,0x58,0x6d, 0x2,0x58,0x6f, 0x3,0x52,0x22, 0x1,0x71,0x55, + 0x2,0x58,0x75, 0x3,0x65,0x75, 0x1,0x74,0x50, 0x3,0x55,0x60, + 0x3,0x55,0x62, 0x2,0x5d,0x75, 0x2,0x5d,0x6f, 0x1,0x74,0x4f, + 0x4,0x57,0x3e, 0x1,0x74,0x4d, 0x3,0x55,0x61, 0x2,0x5d,0x77, + 0x1,0x74,0x4e, 0x2,0x5d,0x72, 0x2,0x5d,0x73, 0x2,0x5d,0x70, + 0x2,0x5d,0x78, 0x2,0x5d,0x74, 0x4,0x57,0x40, 0x1,0x74,0x51, + 0x2,0x5d,0x71, 0x2,0x5d,0x79, 0x2,0x5d,0x76, 0x3,0x58,0x43, + 0x3,0x58,0x3e, 0x3,0x58,0x40, 0x2,0x62,0x46, 0x3,0x58,0x3f, + 0x3,0x58,0x3c, 0x2,0x62,0x43, 0x3,0x58,0x42, 0x1,0x76,0x70, + 0x4,0x5c,0x32, 0x2,0x62,0x47, 0x2,0x62,0x49, 0x2,0x62,0x48, + 0x2,0x62,0x44, 0x2,0x62,0x45, 0x3,0x58,0x44, 0x2,0x66,0x2d, + 0x3,0x5a,0x61, 0x1,0x78,0x55, 0x3,0x5a,0x62, 0x2,0x66,0x2a, + 0x2,0x66,0x2c, 0x2,0x66,0x29, 0x2,0x66,0x2e, 0x4,0x60,0x42, + 0x3,0x5a,0x63, 0x2,0x66,0x2b, 0x3,0x65,0x76, 0x2,0x69,0x49, + 0x2,0x69,0x4c, 0x2,0x69,0x48, 0x1,0x79,0x7c, 0x2,0x69,0x4a, + 0x2,0x69,0x4b, 0x2,0x69,0x4d, 0x1,0x79,0x7d, 0x1,0x7a,0x21, + 0x1,0x79,0x7e, 0x2,0x6b,0x6f, 0x3,0x5e,0x45, 0x2,0x6b,0x71, + 0x3,0x5e,0x43, 0x2,0x6b,0x70, 0x3,0x5e,0x44, 0x2,0x6d,0x64, + 0xf,0x6a,0x66, 0x3,0x60,0x3c, 0x2,0x70,0x43, 0x2,0x71,0x2a, + 0x1,0x46,0x7c, 0x3,0x24,0x33, 0x2,0x24,0x72, 0x1,0x4f,0x23, + 0x2,0x28,0x43, 0x1,0x4f,0x24, 0x1,0x4f,0x25, 0x2,0x28,0x42, + 0x2,0x2c,0x5a, 0x2,0x2c,0x59, 0x1,0x52,0x69, 0x1,0x52,0x6c, + 0x1,0x52,0x6b, 0x1,0x52,0x6a, 0x2,0x2c,0x56, 0x2,0x2c,0x58, + 0x2,0x2c,0x57, 0x3,0x65,0x77, 0x2,0x31,0x4b, 0x1,0x57,0x2a, + 0x2,0x31,0x4f, 0x2,0x31,0x4e, 0x2,0x31,0x4d, 0x2,0x31,0x49, + 0x1,0x57,0x29, 0x1,0x57,0x2d, 0x1,0x57,0x30, 0x3,0x32,0x6f, + 0x3,0x32,0x70, 0x1,0x57,0x31, 0x2,0x31,0x4a, 0x2,0x31,0x4c, + 0x1,0x57,0x2f, 0x1,0x57,0x2e, 0x1,0x57,0x2c, 0x1,0x57,0x2b, + 0x2,0x37,0x65, 0x3,0x32,0x72, 0x2,0x37,0x63, 0x2,0x37,0x5f, + 0x1,0x5c,0x40, 0x3,0x3d,0x5e, 0x2,0x37,0x60, 0x1,0x5c,0x41, + 0x2,0x37,0x61, 0x2,0x37,0x62, 0x2,0x37,0x64, 0x3,0x37,0x66, + 0x1,0x5c,0x42, 0x3,0x37,0x65, 0x2,0x3e,0x59, 0x3,0x3d,0x5f, + 0x2,0x3e,0x58, 0x2,0x3e,0x57, 0x2,0x3e,0x56, 0x3,0x3d,0x64, + 0x3,0x3d,0x62, 0x4,0x39,0x5a, 0x2,0x45,0x5c, 0x1,0x65,0x59, + 0x4,0x3f,0x46, 0x2,0x45,0x59, 0x2,0x45,0x5b, 0x3,0x43,0x38, + 0x1,0x65,0x5a, 0x3,0x43,0x3d, 0x1,0x65,0x5b, 0x2,0x45,0x5a, + 0x3,0x43,0x39, 0x3,0x3d,0x63, 0x3,0x65,0x78, 0x3,0x48,0x48, + 0x2,0x4c,0x48, 0x3,0x48,0x47, 0x2,0x4c,0x41, 0x2,0x4c,0x42, + 0x5,0x47,0x7e, 0x1,0x69,0x7e, 0x1,0x69,0x7c, 0x1,0x69,0x7d, + 0x2,0x4c,0x4a, 0x5,0x48,0x22, 0x2,0x4c,0x49, 0x2,0x4c,0x46, + 0x2,0x4c,0x45, 0x2,0x4c,0x44, 0x2,0x4c,0x43, 0x2,0x4c,0x47, + 0x2,0x4c,0x40, 0x3,0x65,0x79, 0x2,0x52,0x53, 0x2,0x52,0x58, + 0x2,0x52,0x56, 0x3,0x4d,0x50, 0x3,0x4d,0x51, 0x3,0x4d,0x4f, + 0x2,0x52,0x55, 0x2,0x52,0x54, 0x2,0x52,0x57, 0x3,0x65,0x7a, + 0x2,0x58,0x78, 0x3,0x52,0x26, 0x1,0x71,0x57, 0x1,0x74,0x52, + 0x2,0x5d,0x7b, 0x3,0x52,0x27, 0x1,0x74,0x53, 0x2,0x5d,0x7a, + 0x2,0x62,0x4b, 0x2,0x62,0x4a, 0x1,0x76,0x71, 0x3,0x58,0x45, + 0x2,0x66,0x2f, 0x1,0x78,0x56, 0x2,0x69,0x4e, 0x1,0x7b,0x6b, + 0x2,0x6d,0x65, 0x3,0x60,0x3d, 0x2,0x70,0x45, 0x2,0x70,0x44, + 0x2,0x21,0x67, 0x1,0x52,0x6d, 0x1,0x52,0x6e, 0x2,0x37,0x66, + 0x3,0x65,0x7b, 0x1,0x65,0x5d, 0x1,0x46,0x7d, 0x1,0x4b,0x35, + 0x1,0x4b,0x34, 0x1,0x4b,0x33, 0x4,0x24,0x68, 0x3,0x2a,0x3e, + 0x3,0x2a,0x3d, 0x2,0x28,0x44, 0x3,0x2a,0x3f, 0x3,0x2a,0x42, + 0x1,0x4f,0x27, 0x1,0x4f,0x26, 0x3,0x2a,0x44, 0x1,0x52,0x71, + 0x3,0x65,0x4c, 0x2,0x2c,0x5c, 0x2,0x2c,0x5f, 0x2,0x2c,0x5d, + 0x3,0x2e,0x42, 0x1,0x52,0x6f, 0x1,0x52,0x70, 0x3,0x2e,0x40, + 0x3,0x2e,0x41, 0x2,0x2c,0x5b, 0x2,0x2c,0x5e, 0x3,0x2e,0x43, + 0x1,0x57,0x38, 0x3,0x32,0x74, 0x3,0x32,0x73, 0x3,0x32,0x79, + 0x2,0x31,0x56, 0x2,0x31,0x58, 0x2,0x31,0x57, 0x1,0x57,0x35, + 0x2,0x31,0x52, 0x3,0x32,0x76, 0x3,0x32,0x7b, 0x1,0x57,0x33, + 0x1,0x57,0x32, 0x3,0x32,0x77, 0x1,0x57,0x36, 0x1,0x57,0x34, + 0x3,0x32,0x78, 0x1,0x57,0x37, 0x2,0x31,0x55, 0x2,0x31,0x50, + 0x2,0x31,0x51, 0x2,0x31,0x54, 0x2,0x31,0x53, 0x3,0x32,0x7c, + 0x3,0x37,0x69, 0x3,0x37,0x67, 0x3,0x37,0x6b, 0x3,0x37,0x6a, + 0x2,0x37,0x69, 0x2,0x37,0x6a, 0x2,0x37,0x68, 0x3,0x37,0x6c, + 0x2,0x37,0x67, 0x1,0x5c,0x43, 0xf,0x37,0x3f, 0x3,0x3d,0x65, + 0x1,0x61,0x25, 0x6,0x4c,0x48, 0x2,0x3e,0x5a, 0x2,0x3e,0x5c, + 0x2,0x3e,0x5e, 0x1,0x61,0x24, 0x6,0x4c,0x43, 0x3,0x3d,0x66, + 0x1,0x61,0x22, 0x3,0x3d,0x69, 0x2,0x3e,0x5b, 0x1,0x61,0x23, + 0x2,0x3e,0x5d, 0x1,0x61,0x21, 0x3,0x3d,0x68, 0x3,0x43,0x41, + 0x2,0x45,0x66, 0x2,0x45,0x5d, 0x2,0x45,0x60, 0x2,0x45,0x64, + 0x1,0x65,0x61, 0x2,0x45,0x62, 0x4,0x3f,0x50, 0x2,0x45,0x61, + 0x2,0x45,0x5e, 0x2,0x45,0x5f, 0x1,0x65,0x5f, 0x2,0x45,0x65, + 0x1,0x65,0x5e, 0x3,0x43,0x44, 0x1,0x65,0x63, 0x1,0x65,0x62, + 0x1,0x65,0x60, 0x4,0x3f,0x4a, 0x2,0x45,0x63, 0x3,0x65,0x24, + 0x2,0x4c,0x50, 0x4,0x45,0x5d, 0x2,0x4c,0x4f, 0x3,0x48,0x4b, + 0x3,0x48,0x4d, 0x2,0x4c,0x4b, 0x3,0x48,0x50, 0x3,0x48,0x4f, + 0x1,0x6a,0x21, 0x2,0x4c,0x4e, 0x2,0x4c,0x4d, 0x1,0x6a,0x22, + 0x3,0x48,0x52, 0xf,0x4a,0x64, 0x4,0x4b,0x63, 0x4,0x45,0x5e, + 0x4,0x4b,0x6b, 0x1,0x6e,0x29, 0x3,0x4d,0x55, 0x2,0x52,0x5a, + 0x3,0x4d,0x56, 0x1,0x6e,0x2a, 0x1,0x6e,0x26, 0x1,0x6e,0x28, + 0x3,0x4d,0x5a, 0x1,0x6e,0x25, 0x1,0x6e,0x27, 0x3,0x4d,0x53, + 0x3,0x4d,0x57, 0x2,0x58,0x79, 0x3,0x52,0x2a, 0x1,0x71,0x5a, + 0x2,0x58,0x7b, 0x2,0x58,0x7a, 0x3,0x55,0x64, 0x2,0x4c,0x4c, + 0x1,0x71,0x5c, 0x1,0x71,0x5b, 0x1,0x71,0x58, 0x1,0x71,0x59, + 0x3,0x52,0x2c, 0xf,0x5b,0x59, 0x3,0x52,0x29, 0x2,0x5e,0x22, + 0x4,0x57,0x49, 0x2,0x5d,0x7e, 0x1,0x74,0x54, 0x2,0x5e,0x21, + 0x4,0x57,0x48, 0x2,0x5e,0x23, 0x2,0x5d,0x7d, 0x2,0x5d,0x7c, + 0x2,0x62,0x4c, 0x1,0x76,0x74, 0x1,0x76,0x72, 0x1,0x76,0x73, + 0x3,0x5a,0x66, 0x4,0x60,0x45, 0x3,0x5a,0x65, 0x2,0x66,0x30, + 0x2,0x66,0x31, 0x1,0x78,0x58, 0x3,0x5a,0x67, 0x1,0x78,0x57, + 0x2,0x69,0x50, 0x2,0x69,0x51, 0x2,0x69,0x4f, 0x3,0x5c,0x64, + 0x2,0x6d,0x66, 0x2,0x6d,0x67, 0x3,0x60,0x76, 0x3,0x60,0x77, + 0x1,0x46,0x7e, 0x2,0x22,0x68, 0x1,0x4b,0x36, 0x2,0x28,0x45, + 0x1,0x4f,0x29, 0x1,0x4f,0x28, 0x2,0x28,0x46, 0x3,0x2e,0x44, + 0x3,0x2e,0x47, 0x2,0x2c,0x61, 0x1,0x52,0x72, 0x2,0x2c,0x60, + 0x1,0x52,0x73, 0x3,0x2e,0x49, 0x3,0x2e,0x48, 0x1,0x57,0x39, + 0x2,0x31,0x5b, 0x2,0x31,0x59, 0x2,0x31,0x5f, 0x1,0x57,0x3a, + 0x2,0x31,0x5a, 0x2,0x31,0x5e, 0x2,0x31,0x5c, 0x2,0x31,0x5d, + 0x2,0x37,0x6b, 0x2,0x37,0x6d, 0x3,0x37,0x72, 0x1,0x5c,0x44, + 0x3,0x37,0x71, 0x2,0x37,0x6c, 0x1,0x5c,0x45, 0x1,0x61,0x28, + 0x1,0x61,0x27, 0x1,0x61,0x26, 0x2,0x3e,0x5f, 0x3,0x37,0x70, + 0x4,0x39,0x65, 0x2,0x45,0x69, 0x1,0x65,0x64, 0x1,0x65,0x65, + 0x3,0x43,0x46, 0x2,0x45,0x68, 0x2,0x45,0x67, 0x3,0x43,0x47, + 0x3,0x65,0x7c, 0x2,0x4c,0x51, 0x1,0x6a,0x24, 0x1,0x6a,0x23, + 0x2,0x4c,0x52, 0x2,0x4c,0x53, 0x1,0x6e,0x2c, 0x1,0x6e,0x2b, + 0x3,0x4d,0x5b, 0x2,0x59,0x21, 0x2,0x52,0x5b, 0x2,0x52,0x5d, + 0x2,0x52,0x5c, 0x2,0x58,0x7e, 0x2,0x58,0x7c, 0x2,0x59,0x22, + 0x2,0x58,0x7d, 0x5,0x56,0x52, 0x1,0x71,0x5d, 0x3,0x52,0x2f, + 0x4,0x52,0x27, 0x3,0x52,0x2e, 0x2,0x5e,0x24, 0x1,0x74,0x55, + 0x2,0x5e,0x25, 0x2,0x5e,0x26, 0x3,0x55,0x68, 0x1,0x76,0x75, + 0x1,0x76,0x76, 0x4,0x60,0x4b, 0x1,0x7a,0x22, 0x3,0x5e,0x49, + 0x3,0x5e,0x48, 0x1,0x7c,0x3d, 0x1,0x47,0x21, 0x3,0x26,0x7e, + 0x3,0x27,0x21, 0x4,0x27,0x5b, 0x3,0x2a,0x47, 0x3,0x2e,0x4e, + 0x2,0x2c,0x62, 0x3,0x2e,0x4f, 0x3,0x2e,0x4d, 0x3,0x2e,0x4b, + 0x3,0x2e,0x4c, 0xf,0x2c,0x76, 0x2,0x31,0x60, 0x1,0x57,0x3b, + 0x3,0x33,0x23, 0x3,0x33,0x26, 0x3,0x33,0x27, 0x3,0x33,0x24, + 0x1,0x5d,0x7e, 0x1,0x5d,0x7d, 0x3,0x37,0x73, 0x3,0x3d,0x71, + 0x1,0x61,0x2a, 0x2,0x3e,0x61, 0x1,0x61,0x29, 0x2,0x3e,0x60, + 0x3,0x3d,0x70, 0x4,0x3f,0x57, 0x3,0x43,0x49, 0x3,0x43,0x4a, + 0x2,0x45,0x6a, 0x3,0x48,0x54, 0x1,0x6a,0x25, 0x2,0x4c,0x54, + 0x1,0x6a,0x26, 0x3,0x48,0x55, 0x3,0x52,0x30, 0x3,0x55,0x69, + 0x3,0x55,0x6a, 0x4,0x57,0x50, 0x3,0x58,0x49, 0x1,0x7a,0x23, + 0x2,0x69,0x52, 0x3,0x5f,0x55, 0x1,0x48,0x4c, 0x1,0x4f,0x2a, + 0x2,0x28,0x47, 0x3,0x2e,0x51, 0x1,0x52,0x75, 0x3,0x2e,0x50, + 0x1,0x52,0x74, 0x2,0x2c,0x63, 0x2,0x2c,0x64, 0x2,0x31,0x62, + 0x2,0x31,0x64, 0x1,0x57,0x3c, 0x2,0x31,0x66, 0x2,0x31,0x69, + 0x2,0x31,0x67, 0x3,0x33,0x2b, 0x4,0x2e,0x71, 0x3,0x33,0x2a, + 0x2,0x31,0x68, 0x2,0x31,0x65, 0x2,0x31,0x61, 0x1,0x57,0x3d, + 0x2,0x31,0x6a, 0x2,0x31,0x63, 0x3,0x33,0x2c, 0x3,0x37,0x78, + 0x3,0x37,0x79, 0x2,0x37,0x76, 0x1,0x5c,0x4b, 0x2,0x38,0x21, + 0x1,0x5c,0x48, 0x3,0x37,0x77, 0x2,0x37,0x78, 0x1,0x5c,0x4c, + 0x3,0x37,0x7b, 0x1,0x5c,0x46, 0x3,0x37,0x76, 0x2,0x37,0x73, + 0x2,0x38,0x22, 0x2,0x37,0x74, 0x2,0x37,0x71, 0x1,0x5c,0x4a, + 0x4,0x33,0x7c, 0x1,0x5c,0x47, 0x4,0x33,0x7a, 0x2,0x37,0x77, + 0x2,0x37,0x7a, 0x1,0x5c,0x49, 0x2,0x37,0x7b, 0x1,0x5c,0x4d, + 0x2,0x37,0x7c, 0x2,0x37,0x72, 0x2,0x37,0x79, 0x2,0x37,0x7d, + 0x2,0x37,0x75, 0x2,0x37,0x70, 0x2,0x37,0x6e, 0x3,0x37,0x7a, + 0x3,0x65,0x7d, 0x2,0x37,0x7e, 0xf,0x37,0x4d, 0x2,0x37,0x6f, + 0xf,0x36,0x7e, 0x5,0x3b,0x24, 0x2,0x3e,0x68, 0x3,0x3d,0x7b, + 0x3,0x3d,0x78, 0x3,0x3d,0x75, 0x2,0x3e,0x64, 0x2,0x3e,0x6a, + 0x1,0x61,0x2d, 0x2,0x3e,0x63, 0x2,0x3e,0x65, 0x1,0x61,0x2b, + 0x2,0x3e,0x62, 0x1,0x61,0x32, 0x2,0x3e,0x66, 0x1,0x61,0x31, + 0x2,0x3e,0x67, 0x1,0x61,0x33, 0x1,0x61,0x2e, 0x1,0x61,0x34, + 0x1,0x61,0x2f, 0x3,0x3d,0x79, 0x1,0x61,0x30, 0x3,0x3d,0x72, + 0x1,0x61,0x2c, 0x3,0x3d,0x76, 0x2,0x3e,0x69, 0x3,0x65,0x7e, + 0x3,0x43,0x4f, 0x4,0x3f,0x67, 0x1,0x65,0x68, 0x2,0x45,0x75, + 0x3,0x43,0x4c, 0x2,0x45,0x78, 0x2,0x45,0x6c, 0x2,0x45,0x71, + 0x2,0x45,0x6b, 0x1,0x65,0x6a, 0x3,0x43,0x55, 0x2,0x45,0x6f, + 0x4,0x3f,0x5e, 0x3,0x43,0x4d, 0x3,0x3d,0x77, 0x2,0x45,0x6d, + 0x1,0x65,0x69, 0x3,0x43,0x54, 0x2,0x45,0x74, 0x2,0x45,0x73, + 0x2,0x45,0x70, 0x2,0x45,0x72, 0x2,0x45,0x6e, 0x1,0x6a,0x2a, + 0x2,0x45,0x77, 0x1,0x65,0x66, 0x2,0x45,0x76, 0x3,0x43,0x51, + 0xf,0x44,0x45, 0x3,0x48,0x56, 0x2,0x4c,0x64, 0x3,0x48,0x58, + 0x1,0x6a,0x31, 0x2,0x4c,0x5f, 0x3,0x48,0x60, 0x1,0x6a,0x30, + 0x2,0x4c,0x55, 0x4,0x45,0x6b, 0x2,0x4c,0x57, 0x1,0x6a,0x29, + 0x2,0x4c,0x5c, 0x2,0x4c,0x5b, 0x2,0x4c,0x5e, 0x1,0x6a,0x2e, + 0x2,0x4c,0x59, 0x2,0x4c,0x58, 0x3,0x48,0x5a, 0x3,0x48,0x5e, + 0x1,0x6a,0x2d, 0x1,0x6a,0x28, 0x2,0x4c,0x5a, 0x1,0x6a,0x2b, + 0x2,0x4c,0x60, 0x2,0x4c,0x62, 0x2,0x4c,0x5d, 0x2,0x4c,0x56, + 0x1,0x6a,0x2c, 0x3,0x48,0x57, 0x3,0x48,0x5d, 0x1,0x6e,0x34, + 0x1,0x6a,0x27, 0x4,0x45,0x64, 0x3,0x48,0x5c, 0x2,0x4c,0x63, + 0x4,0x45,0x70, 0x2,0x52,0x61, 0x1,0x6e,0x2d, 0x3,0x4d,0x5c, + 0x2,0x52,0x63, 0x4,0x4c,0x2b, 0x1,0x6e,0x2e, 0x3,0x4d,0x65, + 0x3,0x4d,0x5d, 0x1,0x6e,0x30, 0x2,0x52,0x66, 0x4,0x4b,0x7a, + 0x2,0x52,0x5e, 0x1,0x6a,0x2f, 0x2,0x52,0x64, 0x4,0x4b,0x73, + 0x4,0x4c,0x31, 0x4,0x4b,0x74, 0x4,0x4c,0x2a, 0x2,0x52,0x60, + 0x3,0x4d,0x60, 0x1,0x65,0x67, 0x1,0x6e,0x33, 0x4,0x4c,0x21, + 0x4,0x4b,0x78, 0x1,0x6e,0x2f, 0x4,0x4c,0x26, 0x1,0x6e,0x31, + 0x1,0x6e,0x32, 0x4,0x4b,0x76, 0x1,0x71,0x60, 0x2,0x52,0x65, + 0x2,0x52,0x5f, 0x1,0x6e,0x35, 0x3,0x4d,0x63, 0x2,0x52,0x62, + 0x3,0x66,0x21, 0x2,0x59,0x2c, 0x2,0x59,0x27, 0x4,0x52,0x2d, + 0x5,0x56,0x69, 0x2,0x59,0x31, 0x1,0x71,0x5e, 0x2,0x59,0x29, + 0x1,0x71,0x62, 0x2,0x59,0x2f, 0x2,0x59,0x26, 0x2,0x59,0x23, + 0x2,0x59,0x32, 0x1,0x74,0x5b, 0x1,0x71,0x63, 0x2,0x59,0x2e, + 0x2,0x59,0x24, 0x1,0x71,0x61, 0x2,0x59,0x28, 0x1,0x71,0x65, + 0x2,0x59,0x25, 0x2,0x59,0x2a, 0x1,0x71,0x64, 0x2,0x59,0x2d, + 0x2,0x59,0x30, 0x3,0x52,0x33, 0x3,0x52,0x34, 0x2,0x5e,0x38, + 0x2,0x5e,0x39, 0x2,0x5e,0x29, 0x2,0x5e,0x30, 0x2,0x5e,0x2e, + 0x4,0x57,0x5f, 0x3,0x55,0x6d, 0x1,0x74,0x59, 0x2,0x5e,0x35, + 0x2,0x59,0x2b, 0x3,0x55,0x6b, 0x2,0x5e,0x2c, 0x3,0x55,0x6e, + 0x2,0x5e,0x36, 0x1,0x74,0x58, 0x2,0x5e,0x2b, 0x2,0x5e,0x2a, + 0x2,0x5e,0x34, 0x2,0x5e,0x31, 0x2,0x5e,0x33, 0x4,0x57,0x54, + 0x2,0x5e,0x27, 0x2,0x5e,0x37, 0x1,0x74,0x56, 0x3,0x55,0x70, + 0x2,0x5e,0x32, 0x2,0x5e,0x3b, 0x2,0x5e,0x2f, 0x1,0x74,0x5a, + 0x1,0x74,0x57, 0x2,0x5e,0x2d, 0x2,0x5e,0x28, 0x2,0x5e,0x3a, + 0x1,0x71,0x5f, 0x3,0x55,0x71, 0xf,0x5b,0x5f, 0x4,0x57,0x57, + 0x3,0x55,0x6f, 0x2,0x62,0x4f, 0x3,0x58,0x50, 0x3,0x58,0x4e, + 0x2,0x62,0x4d, 0x2,0x62,0x53, 0x1,0x76,0x7a, 0x2,0x62,0x51, + 0x2,0x62,0x50, 0x1,0x76,0x7c, 0x2,0x62,0x56, 0x1,0x76,0x7b, + 0x3,0x58,0x51, 0x2,0x62,0x57, 0x2,0x62,0x54, 0x1,0x76,0x78, + 0x2,0x62,0x55, 0x2,0x62,0x4e, 0x1,0x76,0x79, 0x1,0x76,0x77, + 0x2,0x66,0x35, 0x2,0x62,0x52, 0x3,0x58,0x4c, 0x3,0x66,0x22, + 0x2,0x62,0x58, 0x3,0x66,0x23, 0x2,0x66,0x32, 0x3,0x5a,0x6f, + 0x3,0x5a,0x6e, 0x4,0x60,0x4e, 0x1,0x78,0x5d, 0x1,0x78,0x5b, + 0x2,0x66,0x34, 0x4,0x60,0x4c, 0x2,0x66,0x36, 0x2,0x66,0x33, + 0x1,0x78,0x5c, 0x1,0x78,0x59, 0x1,0x78,0x5a, 0x1,0x78,0x5e, + 0x3,0x66,0x24, 0x1,0x7a,0x25, 0x3,0x5c,0x66, 0x2,0x69,0x57, + 0x5,0x6c,0x79, 0x2,0x69,0x56, 0x2,0x69,0x54, 0x2,0x69,0x53, + 0x2,0x69,0x55, 0x3,0x5c,0x65, 0x1,0x7a,0x24, 0x1,0x7a,0x26, + 0x3,0x66,0x25, 0xf,0x65,0x67, 0x1,0x7a,0x7b, 0x3,0x5e,0x4c, + 0x4,0x66,0x6f, 0x2,0x6b,0x73, 0x2,0x6b,0x72, 0x3,0x5c,0x67, + 0x3,0x5e,0x4b, 0x2,0x6d,0x68, 0x3,0x5f,0x58, 0x2,0x6d,0x6a, + 0x2,0x6d,0x6c, 0x2,0x6d,0x6b, 0x2,0x6d,0x69, 0x3,0x5f,0x57, + 0x3,0x60,0x3f, 0x1,0x7b,0x6d, 0x1,0x7b,0x6c, 0x3,0x60,0x3e, + 0x1,0x7c,0x3f, 0x1,0x7c,0x3e, 0x1,0x7c,0x40, 0x2,0x6f,0x3c, + 0x2,0x6f,0x3b, 0x3,0x66,0x26, 0x2,0x71,0x2b, 0x2,0x70,0x46, + 0x2,0x71,0x2c, 0x1,0x7d,0x25, 0x3,0x61,0x44, 0x1,0x7d,0x26, + 0x2,0x71,0x5c, 0x4,0x6d,0x5b, 0x3,0x62,0x3a, 0x1,0x7d,0x4b, + 0x1,0x48,0x4d, 0x3,0x2a,0x49, 0x2,0x28,0x48, 0x3,0x2a,0x48, + 0x3,0x2e,0x52, 0x2,0x2c,0x66, 0x2,0x2c,0x67, 0x2,0x2c,0x65, + 0x3,0x2e,0x54, 0x3,0x2e,0x53, 0x1,0x52,0x76, 0xf,0x2d,0x21, + 0x2,0x2c,0x68, 0x2,0x2c,0x69, 0x2,0x2c,0x6a, 0x3,0x33,0x31, + 0x2,0x31,0x6b, 0x2,0x31,0x71, 0x3,0x33,0x2e, 0x3,0x33,0x30, + 0x2,0x31,0x6f, 0x1,0x57,0x3e, 0x2,0x31,0x6d, 0x3,0x33,0x32, + 0x2,0x31,0x6e, 0x2,0x31,0x70, 0x3,0x33,0x2d, 0x2,0x31,0x6c, + 0x1,0x5c,0x4e, 0x3,0x37,0x7d, 0x2,0x38,0x23, 0x1,0x5c,0x50, + 0x2,0x38,0x25, 0x1,0x5c,0x4f, 0x2,0x38,0x24, 0x3,0x37,0x7e, + 0x3,0x38,0x21, 0x3,0x38,0x3e, 0x3,0x38,0x22, 0x4,0x34,0x22, + 0x2,0x3e,0x6c, 0x1,0x61,0x35, 0x3,0x3e,0x21, 0x2,0x3e,0x6e, + 0x2,0x3e,0x6b, 0x2,0x38,0x26, 0x3,0x3e,0x23, 0x1,0x61,0x36, + 0x3,0x3e,0x22, 0x3,0x3d,0x7e, 0x2,0x3e,0x6d, 0x3,0x66,0x27, + 0xf,0x3e,0x21, 0xf,0x3e,0x23, 0x3,0x43,0x58, 0x2,0x45,0x7b, + 0x3,0x43,0x5c, 0x1,0x65,0x6b, 0x2,0x45,0x79, 0x1,0x65,0x6c, + 0x2,0x45,0x7a, 0x1,0x65,0x6d, 0x4,0x45,0x74, 0x3,0x48,0x62, + 0x3,0x48,0x61, 0x1,0x6a,0x32, 0x2,0x4c,0x68, 0x2,0x4c,0x65, + 0x2,0x4c,0x67, 0x1,0x6a,0x33, 0x1,0x6a,0x34, 0x2,0x4c,0x66, + 0xf,0x4b,0x27, 0xf,0x4b,0x2b, 0x3,0x4d,0x6f, 0x3,0x4d,0x71, + 0x3,0x4d,0x6d, 0x2,0x52,0x67, 0x3,0x4d,0x70, 0x3,0x4d,0x73, + 0x2,0x52,0x68, 0x3,0x4d,0x72, 0x1,0x6e,0x36, 0x2,0x52,0x6a, + 0x2,0x52,0x69, 0x3,0x4d,0x6e, 0x1,0x23,0x23, 0x4,0x52,0x44, + 0x2,0x59,0x36, 0x2,0x59,0x37, 0x2,0x59,0x33, 0x3,0x52,0x37, + 0x2,0x59,0x34, 0x1,0x71,0x66, 0x1,0x71,0x67, 0x2,0x59,0x35, + 0x1,0x74,0x61, 0x3,0x55,0x75, 0x3,0x55,0x74, 0x1,0x74,0x5d, + 0x1,0x74,0x62, 0x1,0x74,0x5e, 0x1,0x74,0x60, 0x1,0x74,0x5c, + 0x3,0x52,0x39, 0x1,0x74,0x5f, 0x3,0x58,0x55, 0x4,0x5c,0x5a, + 0x4,0x5c,0x5b, 0x3,0x58,0x54, 0x1,0x76,0x7d, 0x2,0x5e,0x3c, + 0x7,0x48,0x57, 0x2,0x66,0x38, 0x4,0x60,0x5a, 0x2,0x66,0x37, + 0x3,0x66,0x28, 0x2,0x69,0x58, 0x1,0x7a,0x27, 0x1,0x7a,0x28, + 0x2,0x6d,0x6e, 0x2,0x6b,0x74, 0x3,0x61,0x69, 0x2,0x6d,0x6d, + 0x3,0x60,0x40, 0x2,0x71,0x2d, 0x2,0x71,0x72, 0x1,0x48,0x4e, + 0x3,0x27,0x22, 0x1,0x4b,0x37, 0x3,0x2a,0x4b, 0x2,0x28,0x49, + 0x1,0x4f,0x2b, 0x3,0x2a,0x4a, 0x1,0x52,0x79, 0x2,0x2c,0x6d, + 0x1,0x52,0x77, 0x2,0x2c,0x6b, 0x1,0x52,0x7c, 0x1,0x52,0x78, + 0x1,0x52,0x7d, 0x1,0x52,0x7b, 0x2,0x2c,0x6c, 0x1,0x52,0x7a, + 0x1,0x57,0x42, 0x1,0x57,0x41, 0x2,0x31,0x7c, 0x1,0x57,0x4a, + 0x2,0x31,0x75, 0x2,0x31,0x7b, 0x1,0x57,0x46, 0x2,0x31,0x74, + 0x2,0x31,0x7a, 0x2,0x31,0x78, 0x1,0x57,0x45, 0x1,0x57,0x47, + 0x2,0x31,0x77, 0x1,0x57,0x40, 0x2,0x31,0x76, 0x1,0x57,0x4b, + 0x1,0x57,0x48, 0x1,0x57,0x4c, 0x1,0x57,0x49, 0x2,0x31,0x73, + 0x2,0x31,0x72, 0x2,0x31,0x79, 0x1,0x57,0x43, 0x1,0x57,0x3f, + 0x1,0x57,0x44, 0x4,0x2f,0x25, 0x3,0x33,0x37, 0x3,0x33,0x3b, + 0x2,0x38,0x35, 0x2,0x38,0x2e, 0x4,0x3a,0x26, 0x1,0x61,0x3b, + 0x2,0x38,0x2d, 0x3,0x38,0x29, 0x1,0x5c,0x54, 0x1,0x5c,0x5b, + 0x1,0x5c,0x58, 0x1,0x5c,0x5e, 0x1,0x5c,0x5d, 0x1,0x5c,0x59, + 0x3,0x38,0x26, 0x2,0x38,0x27, 0x2,0x38,0x2a, 0x3,0x38,0x27, + 0x2,0x38,0x29, 0x1,0x5c,0x55, 0x2,0x38,0x2b, 0x2,0x38,0x34, + 0x1,0x5c,0x56, 0x2,0x38,0x28, 0x2,0x38,0x31, 0x2,0x38,0x32, + 0x1,0x5c,0x57, 0x2,0x38,0x2f, 0x1,0x5c,0x5c, 0x1,0x5c,0x52, + 0x1,0x5c,0x5a, 0x2,0x38,0x2c, 0x1,0x5c,0x51, 0x2,0x38,0x30, + 0x3,0x38,0x2e, 0x3,0x38,0x24, 0x2,0x38,0x33, 0xf,0x37,0x54, + 0x3,0x38,0x2b, 0x3,0x3e,0x34, 0x2,0x3f,0x21, 0x2,0x3e,0x76, + 0x1,0x61,0x38, 0x2,0x3e,0x7d, 0x2,0x3e,0x7a, 0x2,0x3e,0x72, + 0x2,0x3e,0x7b, 0x1,0x61,0x3a, 0x2,0x3e,0x73, 0x3,0x3e,0x29, + 0x2,0x3e,0x6f, 0x3,0x3e,0x26, 0x3,0x3e,0x2e, 0x1,0x65,0x73, + 0x2,0x3e,0x78, 0x3,0x3e,0x2f, 0x1,0x61,0x37, 0x2,0x3e,0x7e, + 0x3,0x3e,0x28, 0x1,0x61,0x3e, 0x1,0x61,0x40, 0x2,0x3e,0x71, + 0x3,0x3e,0x2c, 0x4,0x3a,0x27, 0x1,0x61,0x3f, 0x2,0x3e,0x74, + 0x1,0x61,0x39, 0x2,0x3e,0x7c, 0x2,0x3e,0x75, 0x2,0x3e,0x79, + 0x3,0x3e,0x2a, 0x2,0x3e,0x77, 0x1,0x61,0x3c, 0x2,0x3e,0x70, + 0x1,0x61,0x41, 0x1,0x5c,0x53, 0x1,0x61,0x3d, 0x1,0x61,0x42, + 0x3,0x3e,0x24, 0x3,0x3e,0x35, 0x3,0x3e,0x33, 0x3,0x43,0x67, + 0x1,0x65,0x6f, 0x2,0x46,0x24, 0x2,0x46,0x26, 0x2,0x46,0x28, + 0x2,0x46,0x2c, 0x3,0x3e,0x2b, 0x2,0x46,0x22, 0x2,0x45,0x7e, + 0x1,0x65,0x71, 0x4,0x3f,0x71, 0x2,0x46,0x27, 0x2,0x46,0x2b, + 0x2,0x46,0x23, 0x2,0x45,0x7d, 0x3,0x43,0x66, 0x2,0x45,0x7c, + 0x3,0x43,0x69, 0x3,0x43,0x60, 0x3,0x43,0x62, 0x2,0x46,0x29, + 0x2,0x46,0x21, 0x2,0x46,0x25, 0x1,0x65,0x72, 0x3,0x43,0x5e, + 0x1,0x65,0x70, 0x2,0x46,0x2d, 0x1,0x65,0x6e, 0x2,0x46,0x2a, + 0x3,0x43,0x64, 0x2,0x4c,0x79, 0x3,0x43,0x68, 0x3,0x43,0x6a, + 0x3,0x43,0x63, 0x1,0x6a,0x37, 0x2,0x4c,0x71, 0x1,0x6e,0x43, + 0x2,0x4c,0x7b, 0x1,0x6a,0x3a, 0x2,0x4d,0x21, 0x1,0x6a,0x40, + 0x2,0x4c,0x6c, 0x3,0x48,0x74, 0x4,0x45,0x7b, 0x2,0x4c,0x7c, + 0x2,0x4c,0x69, 0x3,0x48,0x6d, 0x2,0x4c,0x7e, 0x2,0x4c,0x6d, + 0x3,0x48,0x6e, 0x1,0x6a,0x47, 0x1,0x6a,0x44, 0x2,0x4c,0x7d, + 0x2,0x4c,0x77, 0x1,0x6a,0x36, 0x1,0x6a,0x3e, 0x1,0x6a,0x3d, + 0x3,0x48,0x70, 0x1,0x6a,0x3c, 0x1,0x6a,0x42, 0x3,0x48,0x69, + 0x2,0x4c,0x6a, 0x1,0x6a,0x43, 0x2,0x4c,0x78, 0x1,0x6a,0x3f, + 0x1,0x6a,0x35, 0x2,0x4c,0x7a, 0x1,0x6a,0x38, 0x1,0x6a,0x39, + 0x1,0x6a,0x41, 0x2,0x4c,0x6f, 0x2,0x4c,0x6e, 0x2,0x4c,0x6b, + 0x4,0x45,0x7c, 0x2,0x4c,0x73, 0x2,0x4c,0x70, 0x2,0x4c,0x74, + 0x1,0x6a,0x46, 0x3,0x48,0x68, 0x2,0x4d,0x22, 0x1,0x6a,0x3b, + 0x2,0x4c,0x75, 0x2,0x4c,0x76, 0x3,0x48,0x71, 0x2,0x4c,0x72, + 0x3,0x48,0x73, 0x3,0x66,0x29, 0x3,0x48,0x6b, 0x1,0x6a,0x45, + 0x3,0x66,0x2b, 0x3,0x4e,0x22, 0x2,0x52,0x6f, 0x1,0x6e,0x3b, + 0x1,0x6e,0x44, 0x1,0x6e,0x40, 0x2,0x52,0x6c, 0x3,0x4d,0x7c, + 0x1,0x6e,0x3d, 0x1,0x6e,0x41, 0x2,0x52,0x78, 0x1,0x6e,0x37, + 0x2,0x52,0x70, 0x3,0x4d,0x78, 0x1,0x6e,0x3f, 0x3,0x4e,0x24, + 0x3,0x4e,0x2f, 0x2,0x52,0x73, 0x2,0x52,0x6e, 0x1,0x6e,0x3e, + 0x1,0x6e,0x42, 0x2,0x52,0x6d, 0x3,0x4e,0x2e, 0x1,0x6e,0x3c, + 0x3,0x4d,0x77, 0x2,0x52,0x77, 0x1,0x6e,0x39, 0x2,0x52,0x76, + 0x2,0x52,0x75, 0x1,0x6e,0x45, 0x2,0x50,0x3b, 0x1,0x6e,0x38, + 0x3,0x4e,0x2b, 0x2,0x52,0x74, 0x2,0x52,0x6b, 0x3,0x4d,0x75, + 0x1,0x6e,0x46, 0x2,0x52,0x72, 0x1,0x6e,0x3a, 0x3,0x4e,0x28, + 0x3,0x4e,0x29, 0x3,0x4e,0x25, 0x3,0x4e,0x2c, 0x3,0x4e,0x27, + 0x3,0x4d,0x7e, 0x3,0x4d,0x7d, 0x2,0x52,0x71, 0x4,0x4c,0x45, + 0x3,0x66,0x2a, 0x1,0x71,0x6a, 0x1,0x71,0x6f, 0x1,0x71,0x68, + 0x2,0x59,0x44, 0x2,0x59,0x3b, 0x2,0x59,0x47, 0x2,0x59,0x3f, + 0x2,0x59,0x45, 0x1,0x71,0x70, 0x1,0x71,0x69, 0x2,0x59,0x38, + 0x2,0x59,0x3e, 0x2,0x59,0x48, 0x2,0x59,0x41, 0x2,0x59,0x46, + 0x2,0x59,0x3a, 0x4,0x52,0x4c, 0x3,0x52,0x3b, 0x2,0x59,0x42, + 0x1,0x71,0x6b, 0x2,0x59,0x40, 0x1,0x71,0x6e, 0x1,0x71,0x6d, + 0x2,0x59,0x3c, 0x2,0x59,0x3d, 0x2,0x59,0x39, 0x2,0x59,0x43, + 0x1,0x71,0x6c, 0x2,0x59,0x4a, 0x2,0x59,0x49, 0x3,0x52,0x40, + 0x3,0x52,0x3f, 0x2,0x5e,0x47, 0x2,0x5e,0x43, 0x1,0x74,0x69, + 0x3,0x55,0x79, 0x2,0x5e,0x3d, 0x1,0x74,0x63, 0x1,0x74,0x73, + 0x2,0x5e,0x49, 0x1,0x74,0x6b, 0x1,0x74,0x67, 0x2,0x5e,0x40, + 0x1,0x74,0x6e, 0x1,0x74,0x71, 0x2,0x5e,0x4b, 0x1,0x74,0x66, + 0x2,0x5e,0x42, 0x1,0x74,0x6f, 0x2,0x5e,0x4d, 0x2,0x5e,0x4a, + 0x2,0x5e,0x3e, 0x1,0x74,0x6a, 0x1,0x74,0x64, 0x1,0x74,0x72, + 0x2,0x5e,0x45, 0x1,0x74,0x6d, 0x2,0x5e,0x3f, 0x1,0x74,0x68, + 0x2,0x5e,0x4c, 0x1,0x74,0x6c, 0x1,0x74,0x65, 0x2,0x5e,0x46, + 0x1,0x74,0x70, 0x2,0x5e,0x44, 0x2,0x5e,0x48, 0x3,0x55,0x7a, + 0x4,0x5c,0x5f, 0x3,0x58,0x59, 0x2,0x62,0x5a, 0x2,0x62,0x60, + 0x1,0x77,0x25, 0x2,0x62,0x63, 0x1,0x76,0x7e, 0x1,0x77,0x21, + 0x2,0x62,0x5b, 0x2,0x62,0x62, 0x2,0x62,0x5d, 0x1,0x77,0x26, + 0x1,0x77,0x23, 0x3,0x58,0x5b, 0x2,0x62,0x59, 0x3,0x58,0x58, + 0x1,0x77,0x22, 0x2,0x62,0x5f, 0x2,0x62,0x61, 0x1,0x77,0x24, + 0x2,0x62,0x5e, 0x2,0x62,0x5c, 0x3,0x66,0x2c, 0x4,0x5c,0x5e, + 0x3,0x58,0x5a, 0x2,0x66,0x42, 0x1,0x78,0x62, 0x1,0x78,0x63, + 0x1,0x78,0x5f, 0x3,0x5a,0x72, 0x1,0x78,0x60, 0x3,0x5a,0x74, + 0x2,0x66,0x3e, 0x2,0x66,0x3c, 0x3,0x5a,0x75, 0x2,0x66,0x40, + 0x1,0x78,0x64, 0x2,0x66,0x41, 0x2,0x66,0x3a, 0x2,0x66,0x39, + 0x2,0x66,0x3d, 0x2,0x66,0x3b, 0x1,0x78,0x61, 0x2,0x66,0x3f, + 0x2,0x69,0x59, 0x1,0x7a,0x2b, 0x1,0x7a,0x2a, 0x2,0x69,0x5a, + 0x3,0x5c,0x6c, 0x2,0x69,0x5c, 0x2,0x69,0x5b, 0x1,0x7a,0x2c, + 0x3,0x5e,0x53, 0x3,0x5e,0x50, 0x2,0x6b,0x79, 0x2,0x6b,0x76, + 0x2,0x6b,0x77, 0x3,0x5e,0x51, 0x2,0x6b,0x75, 0x2,0x6b,0x78, + 0x1,0x7a,0x7d, 0x2,0x6b,0x7a, 0x3,0x5e,0x52, 0x1,0x7a,0x7c, + 0x2,0x6d,0x6f, 0x3,0x5f,0x5a, 0x1,0x7c,0x41, 0x1,0x7c,0x43, + 0x2,0x6f,0x3d, 0x1,0x7c,0x42, 0x2,0x70,0x47, 0x2,0x71,0x2f, + 0x2,0x71,0x31, 0x2,0x71,0x2e, 0x2,0x71,0x30, 0x1,0x7d,0x39, + 0x4,0x6d,0x78, 0x3,0x62,0x35, 0x1,0x48,0x4f, 0x4,0x25,0x57, + 0x1,0x52,0x7e, 0x2,0x30,0x52, 0x1,0x57,0x4d, 0x3,0x38,0x31, + 0xf,0x31,0x78, 0x1,0x5c,0x5f, 0x2,0x3f,0x22, 0x2,0x3f,0x23, + 0x3,0x66,0x2d, 0x3,0x48,0x77, 0x2,0x59,0x4b, 0x1,0x74,0x74, + 0x2,0x5e,0x4e, 0x3,0x55,0x7d, 0x3,0x58,0x5c, 0x1,0x77,0x27, + 0x2,0x66,0x44, 0x2,0x66,0x43, 0x1,0x7a,0x2d, 0x2,0x6b,0x7b, + 0x3,0x5f,0x5b, 0x2,0x6d,0x70, 0x1,0x7c,0x64, 0x2,0x22,0x69, + 0x4,0x22,0x21, 0x1,0x4f,0x2c, 0x1,0x4b,0x38, 0xf,0x28,0x4a, + 0x2,0x2c,0x6e, 0x3,0x2a,0x4e, 0x2,0x32,0x24, 0x2,0x31,0x7d, + 0x2,0x32,0x23, 0x2,0x32,0x21, 0x1,0x57,0x4e, 0x2,0x32,0x22, + 0x2,0x31,0x7e, 0x3,0x33,0x3c, 0x2,0x38,0x36, 0x4,0x3a,0x2b, + 0x2,0x3f,0x24, 0x2,0x3f,0x25, 0x2,0x46,0x30, 0x2,0x46,0x31, + 0x1,0x65,0x75, 0x1,0x65,0x76, 0x2,0x46,0x2f, 0x2,0x46,0x32, + 0x2,0x46,0x2e, 0x1,0x65,0x74, 0x3,0x48,0x78, 0x1,0x6a,0x48, + 0x3,0x48,0x79, 0x1,0x65,0x77, 0x2,0x4d,0x23, 0x1,0x6e,0x47, + 0x2,0x52,0x79, 0x1,0x6e,0x48, 0x3,0x4e,0x30, 0x1,0x71,0x71, + 0x2,0x59,0x4e, 0x2,0x59,0x4c, 0x2,0x59,0x4d, 0x2,0x5e,0x51, + 0x2,0x5e,0x50, 0x2,0x5e,0x4f, 0x7,0x41,0x61, 0x4,0x5c,0x68, + 0x2,0x66,0x45, 0x4,0x60,0x6f, 0x1,0x78,0x65, 0x2,0x66,0x46, + 0x2,0x6d,0x71, 0x1,0x7c,0x65, 0x2,0x70,0x48, 0x1,0x48,0x50, + 0x1,0x4f,0x2e, 0x1,0x4f,0x2d, 0x2,0x2c,0x70, 0x1,0x53,0x21, + 0x3,0x2e,0x5d, 0x4,0x2f,0x30, 0x2,0x2c,0x6f, 0x2,0x32,0x26, + 0x3,0x33,0x3d, 0x1,0x57,0x4f, 0x2,0x38,0x37, 0x2,0x32,0x25, + 0x3,0x33,0x3f, 0x4,0x2f,0x2f, 0x3,0x33,0x3e, 0x1,0x5c,0x61, + 0x2,0x38,0x3a, 0x2,0x38,0x38, 0x2,0x38,0x39, 0x1,0x5c,0x60, + 0x2,0x3f,0x27, 0x2,0x3f,0x28, 0x2,0x3f,0x26, 0x3,0x43,0x6e, + 0x1,0x65,0x7a, 0x2,0x46,0x34, 0x2,0x46,0x33, 0x2,0x46,0x35, + 0x1,0x65,0x79, 0x1,0x65,0x78, 0x4,0x46,0x26, 0x2,0x52,0x7a, + 0x2,0x52,0x7c, 0x3,0x4e,0x31, 0x1,0x6e,0x49, 0x2,0x52,0x7b, + 0x2,0x59,0x4f, 0x1,0x71,0x72, 0x2,0x62,0x65, 0x3,0x58,0x5d, + 0x2,0x62,0x64, 0x1,0x78,0x66, 0x2,0x66,0x47, 0x1,0x78,0x68, + 0x1,0x78,0x67, 0x2,0x69,0x5d, 0x2,0x6b,0x7c, 0x1,0x7a,0x7e, + 0x1,0x48,0x51, 0x2,0x2c,0x71, 0x1,0x53,0x22, 0x2,0x32,0x29, + 0x1,0x57,0x51, 0x2,0x32,0x28, 0x2,0x32,0x27, 0x3,0x33,0x42, + 0x1,0x57,0x50, 0x3,0x33,0x43, 0x2,0x38,0x40, 0x4,0x34,0x3d, + 0x2,0x38,0x42, 0x2,0x38,0x3b, 0x2,0x38,0x3c, 0x1,0x5c,0x62, + 0x2,0x38,0x3d, 0x1,0x5c,0x63, 0x2,0x38,0x41, 0x2,0x38,0x3e, + 0x2,0x38,0x3f, 0x1,0x5c,0x64, 0x3,0x3e,0x37, 0x1,0x61,0x44, + 0x1,0x61,0x45, 0x3,0x3e,0x38, 0x2,0x3f,0x29, 0x2,0x46,0x36, + 0x2,0x46,0x37, 0x3,0x43,0x72, 0x2,0x4d,0x27, 0x1,0x6a,0x4b, + 0x1,0x6a,0x49, 0x1,0x6a,0x4a, 0x2,0x4d,0x24, 0x2,0x4d,0x25, + 0x6,0x60,0x58, 0x2,0x4d,0x26, 0x2,0x53,0x23, 0x3,0x4e,0x32, + 0x2,0x53,0x24, 0x1,0x6e,0x4a, 0x2,0x53,0x21, 0x2,0x52,0x7e, + 0x2,0x53,0x22, 0x2,0x52,0x7d, 0x1,0x71,0x75, 0x2,0x59,0x50, + 0x1,0x71,0x73, 0x1,0x71,0x74, 0x2,0x5e,0x53, 0x1,0x74,0x75, + 0x2,0x5e,0x52, 0x2,0x61,0x34, 0x3,0x55,0x7e, 0x2,0x62,0x66, + 0x2,0x62,0x67, 0x1,0x77,0x28, 0x3,0x58,0x61, 0x1,0x77,0x29, + 0x1,0x74,0x76, 0x2,0x66,0x48, 0x2,0x66,0x49, 0x2,0x69,0x5e, + 0x1,0x7a,0x2e, 0x1,0x48,0x52, 0x3,0x66,0x7b, 0x1,0x48,0x53, + 0x1,0x57,0x53, 0x1,0x4f,0x2f, 0x1,0x57,0x52, 0x2,0x2c,0x72, + 0x3,0x38,0x36, 0x4,0x2b,0x25, 0x3,0x33,0x44, 0x1,0x61,0x46, + 0x1,0x48,0x54, 0x1,0x53,0x24, 0x2,0x2c,0x73, 0x2,0x2c,0x74, + 0x1,0x53,0x23, 0x1,0x53,0x25, 0x1,0x48,0x55, 0x4,0x27,0x61, + 0x2,0x2c,0x75, 0x1,0x57,0x55, 0x2,0x32,0x2a, 0x1,0x57,0x57, + 0x1,0x57,0x54, 0x1,0x57,0x56, 0x3,0x38,0x37, 0x2,0x38,0x45, + 0x1,0x5c,0x65, 0x3,0x38,0x39, 0x2,0x38,0x44, 0x2,0x38,0x43, + 0x4,0x3a,0x38, 0x2,0x46,0x38, 0x3,0x49,0x22, 0x2,0x4d,0x28, + 0x4,0x46,0x2c, 0x1,0x6e,0x4b, 0x1,0x71,0x76, 0x2,0x59,0x52, + 0x2,0x59,0x51, 0x3,0x56,0x21, 0x2,0x5e,0x54, 0x4,0x5c,0x71, + 0x3,0x58,0x62, 0x3,0x5c,0x6f, 0x2,0x6b,0x7d, 0x4,0x69,0x2e, + 0x4,0x69,0x2d, 0x1,0x48,0x56, 0x2,0x24,0x73, 0x2,0x28,0x4a, + 0x1,0x53,0x26, 0x2,0x2c,0x76, 0x6,0x3b,0x21, 0x2,0x32,0x2c, + 0x4,0x2f,0x3a, 0x3,0x33,0x49, 0x3,0x33,0x48, 0x1,0x57,0x58, + 0x2,0x32,0x2b, 0x1,0x57,0x59, 0x3,0x33,0x47, 0x3,0x66,0x2f, + 0x2,0x38,0x47, 0x3,0x38,0x3d, 0x3,0x38,0x3c, 0x1,0x5c,0x67, + 0x2,0x38,0x46, 0x2,0x38,0x48, 0x3,0x38,0x3b, 0x1,0x5c,0x66, + 0x3,0x3e,0x3c, 0x2,0x3f,0x2b, 0x2,0x3f,0x2c, 0x2,0x3f,0x2a, + 0x1,0x61,0x47, 0x3,0x67,0x29, 0x4,0x3f,0x7c, 0x1,0x65,0x7b, + 0x3,0x43,0x73, 0x1,0x65,0x7c, 0x4,0x46,0x33, 0x1,0x6a,0x4d, + 0x3,0x49,0x23, 0x2,0x4d,0x2a, 0x2,0x4d,0x29, 0x1,0x6a,0x4c, + 0x3,0x49,0x26, 0x3,0x3e,0x3b, 0x3,0x49,0x25, 0x3,0x66,0x30, + 0x2,0x53,0x25, 0x3,0x4e,0x34, 0x3,0x4e,0x36, 0x2,0x53,0x26, + 0x3,0x4e,0x37, 0x3,0x4e,0x35, 0x3,0x4e,0x38, 0x2,0x59,0x53, + 0x4,0x52,0x5c, 0x3,0x52,0x43, 0x1,0x74,0x7a, 0x1,0x74,0x79, + 0x1,0x74,0x77, 0x1,0x74,0x78, 0x1,0x74,0x7b, 0x3,0x56,0x22, + 0x2,0x62,0x68, 0x1,0x77,0x2b, 0x1,0x77,0x2a, 0x2,0x66,0x4a, + 0x2,0x69,0x5f, 0x3,0x5c,0x70, 0x3,0x5c,0x71, 0x3,0x5c,0x72, + 0x1,0x7b,0x6f, 0x1,0x7b,0x6e, 0x1,0x48,0x57, 0x6,0x3b,0x24, + 0x2,0x2f,0x7d, 0x1,0x65,0x7e, 0x1,0x61,0x48, 0x1,0x65,0x7d, + 0x1,0x6a,0x4e, 0x6,0x60,0x60, 0x1,0x48,0x58, 0x2,0x21,0x68, + 0x1,0x48,0x59, 0x1,0x48,0x5a, 0x3,0x24,0x35, 0x3,0x24,0x36, + 0x2,0x28,0x4b, 0x2,0x24,0x76, 0x3,0x27,0x24, 0x2,0x24,0x77, + 0x1,0x4b,0x3a, 0x3,0x27,0x26, 0x2,0x24,0x74, 0x1,0x4b,0x39, + 0x3,0x27,0x25, 0x1,0x4b,0x3c, 0x2,0x24,0x75, 0x1,0x4b,0x3e, + 0x1,0x4b,0x3d, 0x2,0x24,0x78, 0x1,0x4b,0x3b, 0x4,0x24,0x70, + 0x3,0x27,0x23, 0x1,0x4f,0x34, 0x1,0x4f,0x32, 0x2,0x28,0x4d, + 0x3,0x2a,0x56, 0x1,0x4f,0x31, 0x3,0x2a,0x5b, 0x3,0x2a,0x58, + 0x3,0x2a,0x4f, 0x1,0x4f,0x36, 0x1,0x4f,0x38, 0x1,0x4f,0x35, + 0x3,0x2a,0x59, 0x2,0x28,0x50, 0x2,0x28,0x4c, 0x1,0x4f,0x39, + 0x3,0x2a,0x52, 0x1,0x4f,0x33, 0x1,0x4b,0x3f, 0x3,0x2a,0x54, + 0x1,0x4f,0x37, 0x2,0x28,0x4f, 0x3,0x2a,0x57, 0x4,0x27,0x64, + 0x2,0x28,0x4e, 0x4,0x27,0x69, 0x1,0x4f,0x30, 0x3,0x66,0x31, + 0x2,0x2c,0x7c, 0x1,0x53,0x2a, 0x1,0x53,0x2b, 0x2,0x2c,0x7e, + 0x3,0x2e,0x66, 0x2,0x2c,0x78, 0x2,0x2c,0x7b, 0x2,0x2d,0x26, + 0x2,0x2d,0x24, 0x3,0x2e,0x60, 0x1,0x53,0x2c, 0x2,0x2d,0x2a, + 0x1,0x53,0x2f, 0x2,0x2d,0x27, 0x2,0x2c,0x7d, 0x2,0x2c,0x7a, + 0x3,0x2e,0x61, 0x3,0x2e,0x5e, 0x2,0x3f,0x2e, 0x2,0x2d,0x25, + 0x1,0x53,0x27, 0x2,0x2d,0x28, 0x2,0x2c,0x77, 0x2,0x2d,0x22, + 0x1,0x53,0x29, 0x1,0x53,0x2e, 0x2,0x2d,0x23, 0x1,0x53,0x32, + 0x1,0x53,0x30, 0x3,0x2e,0x65, 0x2,0x2c,0x79, 0x1,0x53,0x2d, + 0x3,0x2e,0x64, 0x2,0x2d,0x21, 0x1,0x53,0x31, 0x1,0x53,0x28, + 0x2,0x2d,0x29, 0x1,0x57,0x5e, 0x3,0x33,0x4c, 0x1,0x57,0x67, + 0x1,0x57,0x5c, 0x1,0x57,0x5a, 0x2,0x32,0x2e, 0x1,0x57,0x62, + 0x1,0x57,0x5f, 0x2,0x32,0x30, 0x3,0x33,0x4a, 0x3,0x33,0x52, + 0x1,0x57,0x61, 0x2,0x32,0x2f, 0x2,0x32,0x2d, 0x2,0x32,0x32, + 0x1,0x57,0x66, 0x1,0x57,0x64, 0x2,0x3f,0x2d, 0x3,0x33,0x4b, + 0x2,0x32,0x33, 0x2,0x32,0x31, 0x1,0x57,0x5b, 0x3,0x33,0x4e, + 0x3,0x33,0x4d, 0x1,0x57,0x5d, 0x1,0x57,0x60, 0x3,0x33,0x4f, + 0x1,0x57,0x63, 0x3,0x2e,0x63, 0x1,0x57,0x65, 0x3,0x3e,0x44, + 0x2,0x38,0x52, 0x1,0x5c,0x69, 0x3,0x38,0x49, 0x2,0x38,0x49, + 0x2,0x38,0x4b, 0x3,0x38,0x47, 0x2,0x38,0x4c, 0x4,0x34,0x4d, + 0x2,0x38,0x54, 0x2,0x38,0x50, 0x2,0x38,0x4e, 0x4,0x3a,0x3b, + 0x2,0x38,0x51, 0x2,0x38,0x55, 0x1,0x5c,0x6a, 0x1,0x5c,0x6e, + 0x2,0x38,0x4a, 0x4,0x34,0x47, 0x2,0x38,0x53, 0x4,0x34,0x50, + 0x1,0x5c,0x6c, 0x3,0x38,0x41, 0x1,0x5c,0x6b, 0x2,0x38,0x4f, + 0x2,0x38,0x4d, 0x3,0x38,0x42, 0x1,0x5c,0x68, 0x1,0x5c,0x6d, + 0x3,0x38,0x45, 0x3,0x38,0x48, 0x1,0x61,0x4e, 0x2,0x3f,0x36, + 0x3,0x3e,0x3e, 0x4,0x3a,0x3e, 0x2,0x3f,0x34, 0x1,0x61,0x50, + 0x4,0x3a,0x47, 0x3,0x3e,0x43, 0x3,0x3e,0x45, 0x3,0x3e,0x41, + 0x2,0x3f,0x2f, 0x2,0x46,0x46, 0x3,0x3e,0x3d, 0x1,0x61,0x4f, + 0x2,0x3f,0x33, 0x3,0x3e,0x40, 0x3,0x3e,0x42, 0x2,0x3f,0x30, + 0x1,0x61,0x4b, 0x1,0x61,0x51, 0x2,0x3f,0x35, 0x1,0x61,0x4d, + 0x2,0x3f,0x32, 0x1,0x6a,0x4f, 0x1,0x61,0x4c, 0x2,0x3f,0x31, + 0x1,0x61,0x52, 0x1,0x61,0x4a, 0x1,0x61,0x49, 0x6,0x43,0x5a, + 0x2,0x46,0x3e, 0x2,0x46,0x3c, 0x3,0x43,0x7b, 0x2,0x46,0x42, + 0x3,0x43,0x7e, 0x2,0x46,0x3a, 0x2,0x46,0x47, 0x2,0x46,0x3f, + 0x3,0x43,0x75, 0x2,0x46,0x39, 0x1,0x66,0x24, 0x1,0x66,0x2a, + 0x2,0x46,0x44, 0x4,0x40,0x29, 0x2,0x46,0x3d, 0x3,0x43,0x76, + 0x1,0x66,0x27, 0x3,0x43,0x77, 0x3,0x44,0x23, 0x1,0x66,0x25, + 0x2,0x46,0x45, 0x1,0x66,0x22, 0x1,0x66,0x21, 0x2,0x46,0x40, + 0x1,0x66,0x26, 0x1,0x61,0x53, 0x3,0x43,0x7c, 0x2,0x46,0x43, + 0x2,0x46,0x3b, 0x1,0x66,0x23, 0x1,0x66,0x28, 0x1,0x66,0x29, + 0x3,0x44,0x22, 0x1,0x6a,0x54, 0x1,0x6a,0x50, 0x3,0x49,0x27, + 0x1,0x6a,0x55, 0x2,0x4d,0x2d, 0x3,0x49,0x2a, 0x4,0x46,0x39, + 0x2,0x4d,0x2c, 0x2,0x4d,0x2e, 0x1,0x6a,0x52, 0x2,0x4d,0x2b, + 0x1,0x6a,0x53, 0x2,0x4d,0x31, 0x2,0x4d,0x30, 0x2,0x4d,0x2f, + 0x4,0x46,0x46, 0x1,0x6a,0x51, 0x4,0x52,0x67, 0x3,0x4e,0x3b, + 0x3,0x4e,0x3d, 0x3,0x4e,0x39, 0x2,0x53,0x2a, 0x3,0x4e,0x3c, + 0x2,0x53,0x2d, 0x1,0x6e,0x51, 0x2,0x53,0x2c, 0x1,0x6e,0x50, + 0x1,0x6e,0x4c, 0x1,0x6e,0x4d, 0x1,0x6e,0x4e, 0x2,0x53,0x29, + 0x2,0x53,0x28, 0x1,0x6e,0x4f, 0x3,0x4e,0x3a, 0x2,0x53,0x2b, + 0x2,0x53,0x27, 0x2,0x59,0x55, 0x2,0x59,0x5f, 0x1,0x71,0x79, + 0x1,0x71,0x78, 0x3,0x52,0x49, 0x2,0x59,0x59, 0x2,0x59,0x5b, + 0x3,0x52,0x47, 0x2,0x59,0x56, 0x3,0x52,0x44, 0x2,0x59,0x5a, + 0x2,0x59,0x54, 0x2,0x59,0x5d, 0x1,0x71,0x77, 0x2,0x59,0x5c, + 0x2,0x59,0x58, 0x2,0x59,0x5e, 0x3,0x56,0x23, 0x2,0x59,0x57, + 0x1,0x74,0x7e, 0x2,0x5e,0x55, 0x2,0x5e,0x5b, 0x1,0x75,0x24, + 0x1,0x75,0x26, 0x1,0x75,0x23, 0x1,0x75,0x22, 0x4,0x58,0x27, + 0x1,0x75,0x21, 0x1,0x74,0x7d, 0x2,0x5e,0x56, 0x2,0x5e,0x59, + 0x1,0x74,0x7c, 0x2,0x5e,0x5a, 0x3,0x56,0x24, 0x1,0x75,0x25, + 0x2,0x5e,0x58, 0x7,0x48,0x7c, 0x2,0x5e,0x57, 0x1,0x77,0x2c, + 0x3,0x58,0x65, 0x1,0x77,0x2d, 0x2,0x62,0x6b, 0x2,0x62,0x69, + 0x2,0x62,0x6a, 0x3,0x5a,0x77, 0x2,0x66,0x4c, 0x3,0x5a,0x78, + 0x2,0x66,0x4b, 0x1,0x78,0x69, 0x2,0x69,0x61, 0x1,0x7a,0x2f, + 0x2,0x69,0x60, 0x2,0x6b,0x7e, 0x2,0x6d,0x72, 0x1,0x7b,0x70, + 0x2,0x71,0x32, 0x2,0x71,0x33, 0x1,0x7c,0x44, 0x1,0x48,0x5b, + 0x4,0x27,0x6c, 0x1,0x4f,0x3a, 0x2,0x3f,0x37, 0x1,0x6a,0x56, + 0x1,0x75,0x27, 0x2,0x5e,0x5c, 0x1,0x48,0x5c, 0x4,0x24,0x73, + 0x1,0x57,0x69, 0x1,0x57,0x68, 0x2,0x3f,0x38, 0x3,0x3e,0x47, + 0x4,0x3a,0x4c, 0x4,0x4c,0x62, 0x2,0x59,0x60, 0x1,0x48,0x5d, + 0x1,0x53,0x33, 0x4,0x3a,0x4d, 0x3,0x3e,0x48, 0x2,0x3f,0x39, + 0x2,0x3f,0x3a, 0x2,0x3f,0x3b, 0x1,0x6a,0x57, 0x1,0x71,0x7a, + 0x1,0x48,0x5e, 0x4,0x27,0x6d, 0x1,0x4f,0x3b, 0x2,0x2d,0x2b, + 0x1,0x57,0x6a, 0x2,0x32,0x34, 0x1,0x5c,0x6f, 0x3,0x3e,0x49, + 0x2,0x3f,0x3c, 0x1,0x66,0x2b, 0x1,0x6a,0x58, 0x1,0x71,0x7b, + 0x1,0x75,0x28, 0x1,0x77,0x2e, 0x2,0x66,0x4d, 0x1,0x48,0x5f, + 0x1,0x4f,0x3c, 0x3,0x2a,0x5d, 0x4,0x27,0x6e, 0x1,0x57,0x6b, + 0x2,0x38,0x56, 0x1,0x61,0x54, 0x3,0x49,0x2b, 0x1,0x6a,0x59, + 0x2,0x4d,0x32, 0x2,0x53,0x2e, 0x3,0x52,0x4a, 0x3,0x58,0x68, + 0x3,0x5a,0x79, 0x1,0x48,0x60, 0x1,0x61,0x55, 0x2,0x46,0x48, + 0x1,0x6a,0x5a, 0x1,0x48,0x61, 0x2,0x28,0x51, 0x2,0x2d,0x2c, + 0x1,0x53,0x34, 0x3,0x2e,0x68, 0x2,0x32,0x36, 0x4,0x2f,0x4f, + 0x3,0x33,0x57, 0x1,0x57,0x6e, 0x3,0x33,0x58, 0x1,0x57,0x6c, + 0x1,0x57,0x6d, 0x1,0x57,0x6f, 0x3,0x33,0x55, 0x2,0x32,0x35, + 0x2,0x38,0x5b, 0x2,0x38,0x58, 0x2,0x38,0x5a, 0x1,0x5c,0x70, + 0x1,0x5c,0x72, 0x1,0x5c,0x71, 0x2,0x38,0x57, 0x1,0x5c,0x73, + 0x2,0x38,0x59, 0x2,0x3f,0x3d, 0x2,0x3f,0x3e, 0x2,0x3f,0x3f, + 0x2,0x46,0x4b, 0x3,0x44,0x26, 0x2,0x46,0x4c, 0x4,0x40,0x2e, + 0x2,0x46,0x4a, 0x2,0x46,0x4d, 0x4,0x40,0x2d, 0x1,0x66,0x2c, + 0x3,0x66,0x34, 0x2,0x46,0x49, 0x3,0x49,0x2d, 0x1,0x6a,0x5b, + 0x3,0x49,0x2e, 0x2,0x53,0x33, 0x2,0x53,0x2f, 0x2,0x53,0x32, + 0x2,0x53,0x34, 0x2,0x53,0x31, 0x2,0x53,0x30, 0x2,0x59,0x61, + 0x2,0x59,0x62, 0x2,0x59,0x63, 0x1,0x71,0x7c, 0x1,0x71,0x7d, + 0x2,0x5e,0x5e, 0x2,0x5e,0x5d, 0x2,0x5e,0x5f, 0x2,0x62,0x6d, + 0x2,0x62,0x6c, 0x2,0x66,0x4f, 0x3,0x5a,0x7a, 0x2,0x66,0x50, + 0x2,0x66,0x4e, 0x3,0x5a,0x7b, 0x1,0x7a,0x30, 0x4,0x64,0x2c, + 0x2,0x69,0x62, 0x2,0x69,0x63, 0x3,0x5e,0x55, 0x2,0x6d,0x73, + 0x2,0x6f,0x3e, 0x2,0x70,0x49, 0x1,0x48,0x62, 0x1,0x4b,0x40, + 0x1,0x75,0x29, 0x1,0x48,0x63, 0xf,0x32,0x32, 0x2,0x38,0x5c, + 0x2,0x3f,0x40, 0x3,0x5a,0x7c, 0x1,0x7c,0x6c, 0x2,0x22,0x6a, + 0x4,0x21,0x53, 0x3,0x24,0x38, 0x2,0x22,0x6b, 0x2,0x22,0x6d, + 0x1,0x48,0x64, 0x2,0x22,0x6e, 0x2,0x22,0x6c, 0x4,0x23,0x2f, + 0x2,0x25,0x22, 0x2,0x25,0x23, 0x2,0x24,0x7b, 0x3,0x27,0x28, + 0x4,0x24,0x7b, 0x4,0x24,0x75, 0x2,0x25,0x21, 0x1,0x4b,0x42, + 0x3,0x27,0x29, 0x1,0x4b,0x43, 0x2,0x24,0x7c, 0x2,0x24,0x7a, + 0x2,0x24,0x79, 0x2,0x24,0x7d, 0x1,0x4b,0x41, 0x2,0x24,0x7e, + 0x2,0x2d,0x2d, 0x3,0x27,0x2b, 0x4,0x24,0x79, 0x2,0x28,0x56, + 0x1,0x4f,0x3f, 0x2,0x28,0x55, 0x2,0x28,0x57, 0x3,0x2a,0x60, + 0x1,0x4f,0x3e, 0x2,0x28,0x5c, 0x1,0x4f,0x42, 0x2,0x28,0x52, + 0x2,0x28,0x60, 0x2,0x28,0x66, 0x1,0x4f,0x49, 0x2,0x28,0x63, + 0x1,0x4f,0x46, 0x3,0x2a,0x6b, 0x2,0x28,0x59, 0x2,0x28,0x5f, + 0x2,0x28,0x61, 0x3,0x2a,0x66, 0x2,0x28,0x54, 0x1,0x4f,0x45, + 0x1,0x4f,0x40, 0x2,0x28,0x5a, 0x1,0x4f,0x47, 0x1,0x4f,0x4a, + 0x1,0x4f,0x44, 0x3,0x2a,0x6c, 0x1,0x4f,0x3d, 0x2,0x28,0x5e, + 0x2,0x28,0x58, 0x2,0x28,0x65, 0x1,0x4f,0x4c, 0x1,0x4f,0x48, + 0x1,0x4f,0x43, 0x2,0x28,0x5d, 0x1,0x57,0x70, 0x2,0x28,0x5b, + 0x1,0x4f,0x41, 0x1,0x4f,0x4b, 0x4,0x27,0x7a, 0x2,0x28,0x53, + 0x4,0x27,0x7e, 0x2,0x28,0x62, 0x2,0x28,0x64, 0x3,0x2a,0x5e, + 0xf,0x28,0x63, 0x3,0x2a,0x68, 0x4,0x27,0x7b, 0x3,0x2e,0x76, + 0x1,0x53,0x45, 0x1,0x53,0x3f, 0x1,0x53,0x47, 0x1,0x53,0x44, + 0x2,0x2d,0x34, 0x2,0x2d,0x37, 0x1,0x53,0x40, 0x3,0x2e,0x6a, + 0x2,0x2d,0x2e, 0x4,0x2b,0x3a, 0x1,0x53,0x39, 0x1,0x53,0x43, + 0x3,0x2e,0x6b, 0x1,0x53,0x46, 0x1,0x53,0x48, 0x2,0x2d,0x43, + 0x2,0x2d,0x3a, 0x3,0x2e,0x78, 0x1,0x53,0x38, 0x2,0x2d,0x42, + 0x1,0x53,0x3c, 0x1,0x53,0x3a, 0x1,0x53,0x35, 0x2,0x2d,0x32, + 0x3,0x2e,0x72, 0x2,0x2d,0x41, 0x2,0x2d,0x36, 0x2,0x2d,0x39, + 0x2,0x2d,0x46, 0x3,0x2e,0x74, 0x1,0x53,0x49, 0x2,0x2d,0x40, + 0x1,0x53,0x41, 0x2,0x2d,0x3b, 0x2,0x2d,0x45, 0x2,0x2d,0x38, + 0x2,0x2d,0x3c, 0x2,0x2d,0x3f, 0x3,0x2e,0x69, 0x3,0x2e,0x6e, + 0x2,0x2d,0x30, 0x2,0x2d,0x44, 0x2,0x2d,0x3e, 0x3,0x2e,0x6f, + 0x3,0x2e,0x7a, 0x2,0x2d,0x2f, 0x6,0x34,0x3c, 0x2,0x2d,0x33, + 0x1,0x53,0x42, 0x1,0x53,0x3d, 0x1,0x53,0x36, 0x1,0x53,0x3b, + 0x1,0x53,0x37, 0x1,0x53,0x4a, 0x2,0x2d,0x31, 0x2,0x32,0x47, + 0x1,0x53,0x3e, 0x4,0x2b,0x3d, 0x3,0x2e,0x79, 0x2,0x2d,0x3d, + 0x2,0x29,0x42, 0x3,0x2e,0x77, 0x3,0x66,0x35, 0x3,0x66,0x37, + 0x2,0x32,0x4a, 0x1,0x57,0x7e, 0x3,0x33,0x62, 0x2,0x32,0x3a, + 0x4,0x2f,0x5d, 0x2,0x32,0x45, 0x2,0x32,0x41, 0x3,0x38,0x4d, + 0x2,0x32,0x54, 0x3,0x33,0x59, 0x2,0x32,0x4c, 0x3,0x33,0x5f, + 0x2,0x32,0x42, 0x3,0x38,0x5b, 0x2,0x32,0x4b, 0x2,0x32,0x3c, + 0x2,0x32,0x40, 0x2,0x32,0x57, 0x1,0x58,0x23, 0x2,0x32,0x4f, + 0x2,0x32,0x46, 0x1,0x57,0x71, 0x2,0x32,0x55, 0x2,0x32,0x38, + 0x4,0x2f,0x5a, 0x2,0x32,0x4e, 0x4,0x2f,0x63, 0x1,0x58,0x22, + 0x1,0x57,0x7b, 0x2,0x32,0x37, 0x1,0x57,0x79, 0x1,0x57,0x78, + 0x1,0x57,0x7d, 0x2,0x32,0x4d, 0x1,0x57,0x75, 0x1,0x57,0x7c, + 0x2,0x2d,0x35, 0x2,0x3f,0x41, 0x2,0x32,0x48, 0x4,0x2f,0x5f, + 0x3,0x2a,0x5f, 0x2,0x32,0x3e, 0x1,0x58,0x21, 0x2,0x32,0x3f, + 0x2,0x32,0x43, 0x1,0x58,0x24, 0x2,0x32,0x39, 0x2,0x32,0x51, + 0x3,0x3e,0x57, 0x2,0x32,0x50, 0x2,0x32,0x58, 0x1,0x57,0x77, + 0x1,0x57,0x74, 0x2,0x32,0x56, 0x2,0x32,0x52, 0x2,0x32,0x49, + 0x2,0x32,0x44, 0x1,0x57,0x7a, 0x1,0x57,0x76, 0x2,0x32,0x3b, + 0x1,0x57,0x72, 0x2,0x32,0x53, 0x1,0x57,0x73, 0x4,0x2f,0x5c, + 0x2,0x32,0x3d, 0x3,0x33,0x5a, 0x3,0x33,0x63, 0x3,0x66,0x36, + 0x3,0x2d,0x33, 0x4,0x34,0x67, 0x3,0x38,0x4e, 0x3,0x38,0x51, + 0x2,0x38,0x62, 0x2,0x38,0x64, 0x2,0x38,0x69, 0x2,0x38,0x7d, + 0x1,0x5d,0x23, 0x1,0x5c,0x77, 0x3,0x38,0x54, 0x2,0x38,0x61, + 0x1,0x5d,0x24, 0x1,0x5d,0x25, 0x2,0x38,0x6c, 0x2,0x38,0x73, + 0x2,0x38,0x79, 0x3,0x38,0x50, 0x2,0x38,0x66, 0x4,0x34,0x6d, + 0x2,0x38,0x6d, 0x3,0x38,0x4f, 0x3,0x38,0x5d, 0x1,0x5d,0x26, + 0x2,0x38,0x7b, 0x2,0x38,0x76, 0x1,0x5d,0x21, 0x1,0x5c,0x7d, + 0x2,0x38,0x72, 0x2,0x38,0x6e, 0x2,0x38,0x60, 0x1,0x5c,0x74, + 0x2,0x38,0x65, 0x2,0x38,0x5d, 0x3,0x38,0x55, 0x1,0x5c,0x7c, + 0x1,0x5c,0x7e, 0x2,0x38,0x6a, 0x2,0x38,0x67, 0x1,0x5c,0x79, + 0x2,0x38,0x77, 0x1,0x5c,0x76, 0x2,0x38,0x68, 0x2,0x3f,0x6a, + 0x2,0x38,0x70, 0x3,0x38,0x5e, 0x2,0x38,0x6f, 0x1,0x5c,0x75, + 0x3,0x38,0x57, 0x1,0x5d,0x22, 0x3,0x38,0x52, 0x1,0x5c,0x78, + 0x2,0x38,0x5e, 0x2,0x38,0x63, 0x2,0x38,0x74, 0x2,0x38,0x7a, + 0x1,0x5d,0x27, 0x2,0x38,0x5f, 0x2,0x38,0x6b, 0x2,0x38,0x71, + 0x1,0x5c,0x7b, 0x4,0x34,0x6f, 0x3,0x38,0x58, 0x2,0x38,0x7c, + 0x2,0x38,0x75, 0x2,0x38,0x78, 0x3,0x38,0x5f, 0xf,0x37,0x78, + 0x1,0x5c,0x7a, 0x4,0x3a,0x68, 0x2,0x3f,0x51, 0x2,0x3f,0x45, + 0x1,0x61,0x5d, 0x2,0x3f,0x62, 0x2,0x3f,0x6b, 0x2,0x3f,0x6e, + 0x1,0x61,0x5b, 0x2,0x3f,0x4d, 0x2,0x3f,0x66, 0x2,0x3f,0x4e, + 0x2,0x3f,0x5c, 0x1,0x61,0x68, 0x2,0x3f,0x58, 0x1,0x61,0x65, + 0x3,0x3e,0x5e, 0x2,0x3f,0x59, 0x2,0x3f,0x42, 0x5,0x3b,0x6f, + 0x2,0x3f,0x67, 0x3,0x3e,0x4f, 0x3,0x3e,0x59, 0x1,0x61,0x6e, + 0x2,0x3f,0x64, 0x2,0x3f,0x5a, 0x2,0x3f,0x70, 0x2,0x3f,0x55, + 0x2,0x46,0x6d, 0x3,0x3e,0x4d, 0x2,0x3f,0x73, 0x1,0x61,0x6c, + 0x2,0x3f,0x53, 0x2,0x3f,0x5f, 0x1,0x61,0x6f, 0x1,0x61,0x5a, + 0x2,0x3f,0x57, 0x2,0x3f,0x71, 0x2,0x3f,0x50, 0x2,0x3f,0x49, + 0x2,0x3f,0x54, 0x3,0x3e,0x5f, 0x2,0x3f,0x48, 0x2,0x3f,0x46, + 0x1,0x61,0x56, 0x2,0x3f,0x68, 0x2,0x3f,0x4f, 0x2,0x3f,0x6c, + 0x3,0x3e,0x4b, 0x2,0x3f,0x6d, 0x1,0x61,0x5e, 0x1,0x61,0x63, + 0x1,0x61,0x5f, 0x1,0x61,0x67, 0x2,0x3f,0x63, 0x1,0x61,0x60, + 0x2,0x3f,0x5b, 0x2,0x3f,0x4b, 0xf,0x3e,0x66, 0x1,0x61,0x58, + 0x2,0x3f,0x43, 0x2,0x3f,0x65, 0x2,0x3f,0x6f, 0x2,0x3f,0x4a, + 0x1,0x61,0x66, 0x2,0x3f,0x74, 0x2,0x3f,0x56, 0x3,0x3e,0x52, + 0x2,0x3f,0x52, 0x3,0x3e,0x5c, 0x1,0x61,0x57, 0x1,0x61,0x6b, + 0x3,0x3e,0x5a, 0x2,0x3f,0x61, 0x1,0x61,0x6d, 0x3,0x3e,0x50, + 0x2,0x3f,0x5d, 0x1,0x61,0x62, 0x1,0x61,0x5c, 0x1,0x61,0x64, + 0x1,0x61,0x59, 0x1,0x61,0x6a, 0x2,0x3f,0x5e, 0x2,0x3f,0x4c, + 0x2,0x3f,0x60, 0x2,0x3f,0x47, 0x2,0x3f,0x69, 0x3,0x3e,0x58, + 0x4,0x3a,0x67, 0x3,0x3e,0x5d, 0x3,0x3e,0x56, 0x3,0x3e,0x4e, + 0x2,0x3f,0x72, 0x3,0x66,0x39, 0x3,0x3e,0x5b, 0x3,0x66,0x38, + 0x2,0x3f,0x44, 0x2,0x46,0x6c, 0x3,0x44,0x2d, 0x2,0x47,0x24, + 0x1,0x65,0x5c, 0x2,0x46,0x71, 0x3,0x44,0x31, 0x2,0x46,0x6f, + 0x2,0x46,0x5a, 0x1,0x66,0x30, 0x2,0x46,0x6a, 0x2,0x46,0x7e, + 0x2,0x46,0x66, 0x1,0x66,0x38, 0x2,0x46,0x7d, 0x2,0x46,0x64, + 0x1,0x61,0x69, 0x2,0x46,0x74, 0x2,0x46,0x65, 0x2,0x46,0x7b, + 0x1,0x66,0x37, 0x1,0x66,0x2f, 0x3,0x44,0x3a, 0x2,0x46,0x4f, + 0x2,0x46,0x57, 0x3,0x44,0x35, 0x2,0x46,0x70, 0x2,0x46,0x68, + 0x2,0x47,0x23, 0x2,0x46,0x6b, 0x1,0x66,0x3d, 0x2,0x46,0x7c, + 0x3,0x44,0x2c, 0x1,0x66,0x34, 0x3,0x44,0x3e, 0x2,0x46,0x6e, + 0x2,0x46,0x76, 0x2,0x46,0x5b, 0x2,0x46,0x75, 0x3,0x44,0x27, + 0x2,0x47,0x28, 0x2,0x46,0x56, 0x2,0x46,0x77, 0x3,0x44,0x33, + 0x2,0x47,0x26, 0x3,0x44,0x3f, 0x2,0x46,0x50, 0x1,0x61,0x61, + 0x3,0x44,0x40, 0x2,0x46,0x5e, 0x2,0x46,0x5d, 0x1,0x66,0x36, + 0x3,0x44,0x32, 0x2,0x46,0x61, 0x2,0x46,0x63, 0x2,0x46,0x72, + 0x2,0x47,0x25, 0x1,0x66,0x39, 0x3,0x44,0x38, 0x1,0x66,0x3a, + 0x3,0x44,0x30, 0x2,0x46,0x55, 0x1,0x66,0x32, 0x2,0x46,0x59, + 0x2,0x47,0x21, 0x1,0x66,0x3b, 0x4,0x40,0x44, 0x1,0x66,0x33, + 0x1,0x66,0x35, 0x1,0x66,0x3c, 0x2,0x47,0x27, 0x2,0x46,0x78, + 0x2,0x46,0x73, 0x3,0x44,0x3c, 0x3,0x44,0x2f, 0x2,0x46,0x60, + 0x2,0x46,0x5f, 0x1,0x66,0x31, 0x2,0x46,0x51, 0x1,0x66,0x2e, + 0x2,0x46,0x69, 0x2,0x46,0x52, 0x2,0x46,0x67, 0x3,0x44,0x2e, + 0x4,0x40,0x41, 0x2,0x46,0x5c, 0x2,0x47,0x22, 0x3,0x44,0x2a, + 0x3,0x44,0x39, 0x4,0x40,0x36, 0x1,0x66,0x2d, 0x3,0x44,0x3b, + 0x3,0x44,0x28, 0x2,0x46,0x58, 0x4,0x40,0x46, 0x2,0x46,0x54, + 0x2,0x46,0x7a, 0x2,0x46,0x53, 0x1,0x6a,0x68, 0x2,0x4d,0x5a, + 0x3,0x49,0x35, 0x3,0x49,0x44, 0x2,0x4d,0x49, 0x3,0x49,0x33, + 0x3,0x49,0x38, 0x2,0x4d,0x33, 0x2,0x4d,0x51, 0x1,0x6a,0x60, + 0x2,0x4d,0x42, 0x2,0x4d,0x4c, 0x1,0x6a,0x63, 0x2,0x4d,0x45, + 0x1,0x6a,0x61, 0x2,0x4d,0x36, 0x2,0x4d,0x54, 0x2,0x4d,0x35, + 0x2,0x4d,0x48, 0x3,0x49,0x3c, 0x2,0x4d,0x34, 0x3,0x49,0x39, + 0x4,0x46,0x6c, 0x2,0x4d,0x46, 0x2,0x4d,0x4f, 0x2,0x4d,0x4d, + 0x2,0x4d,0x41, 0x2,0x4d,0x3c, 0x2,0x4d,0x3a, 0x3,0x49,0x42, + 0x2,0x4d,0x3b, 0x2,0x4d,0x4e, 0x2,0x4d,0x59, 0x2,0x4d,0x43, + 0x1,0x6a,0x62, 0x3,0x49,0x3b, 0x2,0x4d,0x3e, 0x3,0x49,0x3a, + 0x2,0x4d,0x52, 0x3,0x49,0x41, 0x1,0x6a,0x65, 0x2,0x4d,0x3d, + 0x2,0x4d,0x37, 0x2,0x4d,0x47, 0x1,0x6a,0x69, 0x3,0x49,0x32, + 0x4,0x46,0x58, 0x1,0x6a,0x5d, 0x1,0x6a,0x66, 0x2,0x4d,0x3f, + 0x2,0x4d,0x39, 0x3,0x49,0x36, 0x1,0x6a,0x5f, 0x2,0x46,0x79, + 0x1,0x6a,0x5e, 0x2,0x4d,0x4a, 0x3,0x44,0x36, 0x1,0x6a,0x5c, + 0x1,0x6a,0x6b, 0x1,0x6a,0x64, 0x2,0x4d,0x4b, 0x2,0x4d,0x40, + 0x2,0x4d,0x38, 0x2,0x4d,0x53, 0x2,0x4d,0x44, 0x1,0x6a,0x6a, + 0x2,0x4d,0x57, 0x1,0x6a,0x67, 0x2,0x4d,0x56, 0x3,0x49,0x3f, + 0x2,0x4d,0x50, 0x2,0x4d,0x55, 0x3,0x49,0x3e, 0x3,0x49,0x43, + 0x2,0x4d,0x58, 0x3,0x66,0x3b, 0x3,0x66,0x3c, 0x3,0x66,0x3a, + 0x3,0x49,0x3d, 0x2,0x53,0x5c, 0x2,0x53,0x5d, 0x2,0x53,0x50, + 0x2,0x53,0x4f, 0x2,0x53,0x4b, 0x1,0x6e,0x5d, 0x3,0x4e,0x4f, + 0x1,0x6e,0x55, 0x2,0x53,0x5f, 0x2,0x53,0x5e, 0x2,0x46,0x4e, + 0x2,0x53,0x48, 0x2,0x53,0x4c, 0x2,0x53,0x46, 0x3,0x4e,0x44, + 0x2,0x53,0x59, 0x2,0x53,0x4a, 0x3,0x4e,0x42, 0x2,0x53,0x60, + 0x2,0x53,0x43, 0x2,0x53,0x41, 0x2,0x53,0x4d, 0x2,0x53,0x57, + 0x2,0x53,0x52, 0x1,0x6e,0x5f, 0x2,0x53,0x38, 0x3,0x4e,0x40, + 0x2,0x53,0x56, 0x3,0x4e,0x4c, 0x3,0x4e,0x46, 0x3,0x4e,0x54, + 0x1,0x6e,0x60, 0x2,0x46,0x62, 0x2,0x53,0x44, 0x2,0x53,0x3b, + 0x2,0x53,0x3e, 0x2,0x53,0x64, 0x2,0x53,0x45, 0x2,0x53,0x3c, + 0x2,0x53,0x3a, 0x2,0x53,0x37, 0x4,0x4c,0x7a, 0x1,0x6e,0x59, + 0x2,0x53,0x4e, 0x1,0x6e,0x58, 0x1,0x6e,0x5c, 0x2,0x53,0x49, + 0x2,0x53,0x51, 0x1,0x6e,0x52, 0x2,0x53,0x61, 0x2,0x53,0x65, + 0x1,0x6e,0x54, 0x3,0x4e,0x4b, 0x2,0x53,0x40, 0x2,0x53,0x54, + 0x2,0x53,0x58, 0x2,0x53,0x3d, 0x2,0x53,0x62, 0x1,0x6e,0x5b, + 0x4,0x4c,0x6a, 0x1,0x6e,0x5a, 0x2,0x53,0x35, 0x1,0x6e,0x5e, + 0x2,0x53,0x5b, 0x2,0x53,0x3f, 0x2,0x53,0x53, 0x2,0x53,0x39, + 0x2,0x53,0x47, 0x2,0x53,0x42, 0x1,0x6e,0x56, 0x1,0x6e,0x57, + 0x2,0x53,0x55, 0x2,0x53,0x66, 0x2,0x53,0x63, 0x2,0x53,0x5a, + 0x4,0x4c,0x78, 0x3,0x4e,0x4d, 0x3,0x4e,0x4e, 0x3,0x4e,0x52, + 0x4,0x4c,0x74, 0x2,0x53,0x36, 0x1,0x6e,0x53, 0x2,0x59,0x74, + 0x3,0x52,0x5a, 0x2,0x59,0x6b, 0x2,0x59,0x6e, 0x3,0x52,0x52, + 0x1,0x72,0x25, 0x2,0x59,0x70, 0x2,0x59,0x65, 0x2,0x59,0x6c, + 0x2,0x59,0x72, 0x1,0x72,0x22, 0x1,0x72,0x26, 0x1,0x71,0x7e, + 0x3,0x52,0x59, 0x3,0x52,0x50, 0x2,0x59,0x67, 0x2,0x59,0x77, + 0x4,0x4d,0x25, 0x4,0x53,0x33, 0x2,0x59,0x71, 0x4,0x53,0x24, + 0x2,0x59,0x68, 0x2,0x5a,0x22, 0x2,0x59,0x7a, 0x2,0x59,0x64, + 0x2,0x5e,0x72, 0x2,0x59,0x6a, 0x1,0x72,0x21, 0x3,0x52,0x58, + 0x2,0x59,0x75, 0x3,0x52,0x54, 0x2,0x5a,0x21, 0x1,0x72,0x29, + 0x3,0x52,0x56, 0x2,0x59,0x7c, 0x2,0x59,0x69, 0x2,0x59,0x6f, + 0x2,0x59,0x73, 0x2,0x59,0x6d, 0x2,0x5a,0x23, 0x2,0x59,0x7e, + 0x2,0x59,0x7b, 0x1,0x72,0x23, 0x1,0x72,0x24, 0x1,0x72,0x28, + 0x2,0x59,0x66, 0x2,0x5a,0x24, 0x1,0x72,0x27, 0x2,0x59,0x78, + 0x3,0x52,0x4f, 0x3,0x52,0x55, 0x2,0x59,0x76, 0x3,0x66,0x3d, + 0x2,0x59,0x79, 0x2,0x5f,0x21, 0x2,0x5e,0x6c, 0x2,0x5e,0x71, + 0x2,0x5e,0x7e, 0x2,0x5e,0x70, 0x2,0x5e,0x68, 0x2,0x5e,0x6d, + 0x4,0x58,0x3e, 0x1,0x75,0x2c, 0x3,0x56,0x2b, 0x2,0x5e,0x61, + 0x2,0x5e,0x79, 0x2,0x5e,0x7b, 0x2,0x5e,0x60, 0x1,0x75,0x2b, + 0x2,0x5e,0x7d, 0x2,0x5e,0x75, 0x1,0x75,0x32, 0x2,0x5e,0x7c, + 0x2,0x5e,0x6e, 0x1,0x75,0x34, 0x2,0x5e,0x66, 0x2,0x59,0x7d, + 0x2,0x5e,0x76, 0x2,0x5e,0x73, 0x2,0x5e,0x62, 0x2,0x5f,0x23, + 0x1,0x75,0x2e, 0x3,0x56,0x28, 0x3,0x56,0x29, 0x1,0x75,0x2f, + 0x2,0x5e,0x64, 0x2,0x5e,0x74, 0x3,0x56,0x2d, 0x2,0x5f,0x22, + 0x2,0x5e,0x77, 0x2,0x5e,0x6a, 0x1,0x75,0x31, 0x1,0x75,0x2d, + 0x2,0x5e,0x78, 0x2,0x5e,0x6b, 0x2,0x5f,0x24, 0x2,0x5e,0x65, + 0x2,0x5e,0x6f, 0x2,0x5e,0x7a, 0x2,0x5e,0x67, 0x2,0x5e,0x69, + 0x4,0x58,0x40, 0x1,0x75,0x35, 0x2,0x5e,0x63, 0x1,0x75,0x33, + 0x1,0x77,0x30, 0x1,0x75,0x2a, 0x3,0x56,0x2c, 0x3,0x56,0x30, + 0x1,0x75,0x30, 0x1,0x77,0x34, 0x2,0x62,0x7d, 0x3,0x58,0x6c, + 0x2,0x62,0x73, 0x2,0x62,0x6e, 0x2,0x62,0x74, 0x2,0x62,0x7e, + 0x2,0x63,0x24, 0x2,0x63,0x23, 0x1,0x77,0x36, 0x1,0x77,0x35, + 0x3,0x58,0x6e, 0x4,0x5d,0x2c, 0x2,0x62,0x75, 0x2,0x63,0x25, + 0x2,0x62,0x78, 0x2,0x62,0x70, 0x3,0x58,0x6f, 0x2,0x62,0x72, + 0x2,0x62,0x71, 0x2,0x62,0x77, 0x2,0x62,0x7c, 0x2,0x62,0x6f, + 0x2,0x62,0x76, 0x2,0x62,0x7b, 0x1,0x77,0x33, 0x4,0x5d,0x28, + 0x2,0x62,0x79, 0x3,0x58,0x6b, 0x1,0x77,0x31, 0x2,0x62,0x7a, + 0x1,0x77,0x2f, 0x1,0x77,0x32, 0x2,0x66,0x60, 0x2,0x63,0x21, + 0x3,0x66,0x3e, 0x1,0x78,0x6d, 0x3,0x5a,0x7e, 0x2,0x66,0x58, + 0x2,0x66,0x5c, 0x2,0x66,0x54, 0x2,0x66,0x57, 0x3,0x5a,0x7d, + 0x2,0x66,0x5f, 0x1,0x78,0x6b, 0x2,0x66,0x64, 0x2,0x66,0x5d, + 0x4,0x60,0x7a, 0x2,0x66,0x55, 0x2,0x66,0x65, 0x2,0x66,0x5e, + 0x1,0x78,0x6e, 0x1,0x78,0x6f, 0x2,0x66,0x62, 0x3,0x5b,0x22, + 0x2,0x66,0x56, 0x1,0x78,0x6a, 0x1,0x78,0x6c, 0x2,0x66,0x51, + 0x2,0x66,0x59, 0x2,0x66,0x53, 0x3,0x5c,0x7b, 0x2,0x66,0x63, + 0x2,0x66,0x61, 0x2,0x66,0x52, 0x2,0x66,0x5a, 0x4,0x60,0x7b, + 0x3,0x5b,0x25, 0x3,0x66,0x3f, 0x2,0x69,0x6a, 0x1,0x78,0x70, + 0x2,0x66,0x5b, 0x1,0x7a,0x32, 0x1,0x7a,0x34, 0x1,0x7a,0x31, + 0x3,0x5c,0x76, 0x2,0x69,0x6f, 0x2,0x69,0x67, 0x2,0x69,0x65, + 0x2,0x69,0x69, 0x2,0x69,0x66, 0x3,0x5c,0x78, 0x3,0x5c,0x7c, + 0x2,0x69,0x6b, 0x2,0x69,0x6d, 0x1,0x7a,0x35, 0x1,0x7a,0x37, + 0x3,0x5d,0x22, 0x2,0x69,0x6c, 0x1,0x7a,0x38, 0x1,0x7a,0x36, + 0x2,0x69,0x6e, 0x3,0x5c,0x7e, 0x4,0x64,0x37, 0x3,0x5d,0x23, + 0x3,0x5c,0x77, 0x1,0x7a,0x33, 0x3,0x5d,0x21, 0x3,0x5e,0x5b, + 0x3,0x5e,0x5a, 0x1,0x7b,0x21, 0x2,0x6c,0x21, 0x2,0x6c,0x27, + 0x1,0x7b,0x23, 0x2,0x69,0x68, 0x2,0x6c,0x26, 0x3,0x5e,0x5c, + 0x2,0x6c,0x2d, 0x2,0x6c,0x24, 0x2,0x6c,0x2b, 0x2,0x6c,0x2a, + 0x2,0x69,0x64, 0x2,0x6c,0x25, 0x2,0x63,0x22, 0x2,0x6c,0x2e, + 0x2,0x6c,0x23, 0x2,0x6c,0x28, 0x3,0x5e,0x58, 0x2,0x6c,0x2c, + 0x2,0x6c,0x22, 0x3,0x5e,0x56, 0x2,0x6d,0x77, 0x1,0x7b,0x22, + 0x2,0x6c,0x29, 0x3,0x5e,0x57, 0x2,0x6f,0x43, 0x2,0x6d,0x78, + 0x2,0x6d,0x76, 0x2,0x6d,0x74, 0x2,0x6d,0x75, 0x2,0x6d,0x79, + 0x3,0x66,0x40, 0x1,0x7c,0x45, 0x2,0x6f,0x41, 0x2,0x6f,0x3f, + 0x2,0x6f,0x44, 0x2,0x6f,0x42, 0x3,0x60,0x43, 0x2,0x6f,0x45, + 0x1,0x7c,0x46, 0x2,0x6f,0x40, 0x3,0x60,0x2f, 0x3,0x61,0x46, + 0x2,0x70,0x4a, 0x3,0x66,0x41, 0x2,0x71,0x34, 0x2,0x71,0x35, + 0x2,0x71,0x36, 0x3,0x61,0x47, 0x3,0x61,0x7c, 0x2,0x72,0x35, + 0x2,0x72,0x2d, 0x2,0x22,0x6f, 0x1,0x4f,0x4d, 0x1,0x53,0x4b, + 0x4,0x2f,0x68, 0x2,0x32,0x5a, 0x2,0x32,0x59, 0x1,0x58,0x25, + 0x1,0x5d,0x28, 0x2,0x39,0x21, 0x3,0x38,0x63, 0x3,0x38,0x60, + 0x2,0x38,0x7e, 0x3,0x38,0x61, 0x1,0x61,0x70, 0x1,0x66,0x3f, + 0x3,0x3e,0x61, 0x1,0x66,0x3e, 0x1,0x66,0x40, 0x5,0x49,0x4e, + 0x2,0x4d,0x5b, 0x2,0x53,0x67, 0x2,0x5a,0x25, 0x2,0x5a,0x27, + 0x2,0x5a,0x26, 0x7,0x32,0x61, 0x1,0x75,0x36, 0x2,0x5f,0x25, + 0x2,0x63,0x26, 0x2,0x71,0x73, 0x1,0x48,0x65, 0x3,0x27,0x2d, + 0x2,0x28,0x69, 0x2,0x28,0x6a, 0x2,0x28,0x68, 0x2,0x28,0x67, + 0x1,0x4f,0x4e, 0x3,0x66,0x42, 0x2,0x2d,0x4a, 0x2,0x2d,0x48, + 0x3,0x2f,0x23, 0x3,0x2e,0x7c, 0x2,0x2d,0x47, 0x3,0x2e,0x7e, + 0x1,0x53,0x4c, 0x1,0x53,0x4e, 0x1,0x53,0x4d, 0x2,0x2d,0x49, + 0x3,0x2f,0x24, 0xf,0x2d,0x3e, 0x3,0x33,0x69, 0x2,0x32,0x66, + 0x2,0x32,0x63, 0x2,0x32,0x61, 0x4,0x2f,0x6d, 0x3,0x33,0x6c, + 0x1,0x58,0x26, 0x2,0x32,0x64, 0x1,0x58,0x2b, 0x2,0x32,0x5e, + 0x2,0x32,0x6d, 0x3,0x33,0x6f, 0x2,0x32,0x6f, 0x2,0x32,0x5f, + 0x3,0x33,0x6e, 0x1,0x58,0x28, 0x2,0x32,0x70, 0x2,0x32,0x6b, + 0x2,0x32,0x5d, 0x2,0x32,0x62, 0x2,0x32,0x6c, 0x2,0x32,0x68, + 0x2,0x32,0x65, 0x3,0x33,0x6b, 0x1,0x58,0x2d, 0x2,0x32,0x6e, + 0x2,0x32,0x60, 0x3,0x33,0x6a, 0x3,0x33,0x70, 0x2,0x32,0x69, + 0x2,0x32,0x5b, 0x1,0x58,0x2c, 0x1,0x58,0x29, 0x2,0x32,0x67, + 0x3,0x33,0x6d, 0x2,0x32,0x6a, 0x2,0x32,0x5c, 0x1,0x58,0x2a, + 0x1,0x58,0x27, 0x4,0x34,0x7a, 0x3,0x38,0x66, 0x1,0x5d,0x32, + 0x2,0x39,0x28, 0x1,0x5d,0x31, 0x3,0x38,0x64, 0x2,0x39,0x2b, + 0x2,0x39,0x2e, 0x1,0x5d,0x2e, 0x1,0x5d,0x2c, 0x2,0x39,0x23, + 0x2,0x39,0x2c, 0x2,0x39,0x2a, 0x2,0x39,0x27, 0x2,0x39,0x2f, + 0x2,0x39,0x30, 0x2,0x39,0x32, 0x2,0x39,0x33, 0x2,0x39,0x22, + 0x1,0x5d,0x2b, 0x2,0x39,0x25, 0x2,0x39,0x24, 0x2,0x39,0x31, + 0x1,0x5d,0x2d, 0x2,0x39,0x26, 0x1,0x5d,0x2f, 0x1,0x5d,0x2a, + 0x2,0x39,0x29, 0x1,0x5d,0x33, 0x4,0x35,0x26, 0x1,0x5d,0x30, + 0x2,0x39,0x2d, 0xf,0x38,0x3a, 0x1,0x61,0x77, 0x2,0x40,0x25, + 0x4,0x3a,0x71, 0x2,0x3f,0x78, 0x1,0x61,0x74, 0x3,0x3e,0x62, + 0x2,0x47,0x2e, 0x2,0x40,0x23, 0x2,0x3f,0x75, 0x1,0x61,0x72, + 0x2,0x3f,0x7a, 0x1,0x61,0x75, 0x2,0x3f,0x7e, 0x2,0x3f,0x7c, + 0x1,0x61,0x78, 0x1,0x61,0x71, 0x4,0x3a,0x76, 0x3,0x3e,0x63, + 0x2,0x3f,0x76, 0x2,0x3f,0x79, 0x1,0x61,0x76, 0x4,0x3a,0x6f, + 0x2,0x3f,0x77, 0x5,0x3b,0x7b, 0x2,0x40,0x24, 0x2,0x40,0x22, + 0x2,0x3f,0x7b, 0x2,0x3f,0x7d, 0x2,0x40,0x21, 0x1,0x61,0x73, + 0x3,0x3e,0x68, 0x2,0x47,0x2f, 0x2,0x47,0x35, 0x2,0x47,0x2b, + 0x2,0x47,0x31, 0x1,0x66,0x41, 0x2,0x47,0x2d, 0x1,0x66,0x47, + 0x3,0x44,0x44, 0x3,0x44,0x45, 0x1,0x66,0x46, 0x3,0x44,0x49, + 0x1,0x66,0x45, 0x2,0x47,0x34, 0x1,0x66,0x48, 0x1,0x66,0x49, + 0x2,0x47,0x2a, 0x2,0x47,0x37, 0x1,0x66,0x4a, 0x1,0x66,0x44, + 0x1,0x66,0x43, 0x2,0x47,0x33, 0x1,0x66,0x4b, 0x2,0x47,0x29, + 0x2,0x47,0x2c, 0x2,0x47,0x36, 0x2,0x47,0x32, 0x4,0x40,0x59, + 0x4,0x40,0x52, 0x2,0x4d,0x7b, 0x2,0x4d,0x70, 0x1,0x66,0x42, + 0x5,0x42,0x5d, 0x3,0x44,0x46, 0x3,0x44,0x48, 0x1,0x6a,0x72, + 0x2,0x4d,0x64, 0x2,0x4d,0x79, 0x2,0x4d,0x65, 0x1,0x6a,0x6d, + 0x3,0x49,0x4f, 0x2,0x4d,0x62, 0x4,0x40,0x55, 0x2,0x4d,0x6b, + 0x2,0x4d,0x63, 0x1,0x6a,0x6f, 0x2,0x4d,0x5d, 0x2,0x4d,0x78, + 0x1,0x6a,0x70, 0x2,0x4d,0x75, 0x2,0x4d,0x76, 0x2,0x4d,0x5e, + 0x1,0x6a,0x75, 0x2,0x4d,0x6d, 0x3,0x49,0x4a, 0x2,0x4d,0x67, + 0x2,0x4d,0x6e, 0x2,0x4d,0x61, 0x4,0x46,0x7e, 0x2,0x4d,0x7a, + 0x2,0x4d,0x72, 0x2,0x4d,0x6c, 0x2,0x4d,0x5c, 0x1,0x6a,0x71, + 0x2,0x4d,0x73, 0x3,0x49,0x45, 0x1,0x6a,0x74, 0x2,0x4d,0x77, + 0x3,0x49,0x4c, 0x2,0x4d,0x71, 0x1,0x6a,0x6e, 0x2,0x4d,0x6f, + 0x3,0x49,0x49, 0x2,0x4d,0x69, 0x1,0x6a,0x6c, 0x2,0x4d,0x60, + 0x2,0x4d,0x68, 0x2,0x4d,0x74, 0x2,0x4d,0x66, 0xf,0x4c,0x33, + 0x3,0x49,0x4e, 0x2,0x4d,0x6a, 0x3,0x49,0x4b, 0x3,0x66,0x43, + 0x1,0x6e,0x6a, 0x2,0x47,0x30, 0x2,0x53,0x79, 0x2,0x54,0x24, + 0x2,0x53,0x78, 0x2,0x53,0x74, 0x2,0x53,0x71, 0x1,0x6e,0x6b, + 0x2,0x53,0x6f, 0x1,0x6a,0x73, 0x2,0x53,0x68, 0x1,0x6e,0x69, + 0x2,0x53,0x6e, 0x1,0x6e,0x68, 0x2,0x53,0x73, 0x2,0x53,0x70, + 0x2,0x54,0x22, 0x2,0x53,0x7b, 0x2,0x53,0x75, 0x2,0x53,0x7a, + 0x1,0x6e,0x64, 0x2,0x53,0x72, 0x2,0x54,0x27, 0x2,0x53,0x69, + 0x2,0x53,0x6a, 0x2,0x54,0x23, 0x1,0x6e,0x65, 0x2,0x54,0x28, + 0x1,0x6e,0x67, 0x2,0x54,0x29, 0x2,0x53,0x77, 0x2,0x4d,0x5f, + 0x2,0x53,0x7d, 0x2,0x53,0x76, 0x2,0x54,0x21, 0x2,0x53,0x7c, + 0x5,0x50,0x55, 0x3,0x4e,0x5d, 0x4,0x4d,0x28, 0x2,0x53,0x6d, + 0x1,0x6e,0x62, 0x2,0x54,0x26, 0x1,0x6e,0x63, 0x2,0x53,0x6b, + 0x1,0x6e,0x66, 0x2,0x5a,0x32, 0x2,0x53,0x7e, 0x2,0x54,0x25, + 0x4,0x4d,0x31, 0x3,0x4e,0x59, 0x2,0x5a,0x2f, 0x1,0x6e,0x61, + 0x1,0x72,0x2a, 0x2,0x5a,0x39, 0x2,0x5a,0x35, 0x4,0x53,0x3c, + 0x2,0x5a,0x33, 0x2,0x5a,0x2e, 0x2,0x5a,0x3d, 0x3,0x52,0x5b, + 0x3,0x52,0x5d, 0x4,0x53,0x44, 0x1,0x72,0x2e, 0x3,0x52,0x5f, + 0x2,0x5a,0x2a, 0x2,0x5a,0x36, 0x2,0x5a,0x37, 0x2,0x5a,0x2d, + 0x2,0x5a,0x2c, 0x2,0x5a,0x3a, 0x4,0x53,0x41, 0x2,0x5a,0x30, + 0x2,0x5a,0x2b, 0x2,0x5a,0x31, 0x3,0x52,0x62, 0x2,0x5a,0x3c, + 0x2,0x5a,0x29, 0x2,0x5a,0x3b, 0x2,0x5a,0x38, 0x1,0x72,0x2c, + 0x1,0x72,0x2b, 0x4,0x53,0x39, 0x3,0x52,0x5e, 0x1,0x72,0x2d, + 0x2,0x5a,0x34, 0x2,0x5a,0x28, 0x3,0x66,0x45, 0x3,0x66,0x44, + 0x2,0x5f,0x27, 0x1,0x75,0x3c, 0x2,0x5f,0x2b, 0x2,0x5f,0x28, + 0x2,0x5f,0x2f, 0x2,0x5f,0x35, 0x2,0x5f,0x2a, 0x3,0x56,0x3a, + 0x2,0x5f,0x3e, 0x1,0x75,0x39, 0x2,0x5f,0x38, 0x2,0x5f,0x2d, + 0x2,0x5f,0x39, 0x2,0x5f,0x34, 0x2,0x5f,0x3b, 0x2,0x5f,0x2c, + 0x1,0x75,0x3e, 0x1,0x75,0x3d, 0x2,0x5f,0x2e, 0x2,0x5f,0x3c, + 0x2,0x5f,0x26, 0x2,0x5f,0x3a, 0x1,0x75,0x37, 0x3,0x56,0x39, + 0x2,0x5f,0x32, 0x2,0x5f,0x31, 0x2,0x5f,0x36, 0x2,0x5f,0x29, + 0x1,0x75,0x3b, 0x3,0x56,0x3b, 0x1,0x75,0x3f, 0x2,0x5f,0x30, + 0x2,0x5f,0x37, 0x1,0x75,0x40, 0x2,0x5f,0x33, 0x3,0x56,0x36, + 0x3,0x56,0x34, 0x1,0x75,0x38, 0x1,0x75,0x3a, 0x2,0x63,0x33, + 0x2,0x63,0x31, 0x3,0x5b,0x28, 0x3,0x58,0x76, 0x2,0x63,0x37, + 0x2,0x63,0x35, 0x2,0x63,0x38, 0x3,0x58,0x78, 0x2,0x63,0x2a, + 0x2,0x63,0x32, 0x2,0x63,0x3c, 0x2,0x5f,0x3d, 0x2,0x63,0x2e, + 0x1,0x77,0x3a, 0x2,0x53,0x6c, 0x2,0x63,0x29, 0x2,0x63,0x36, + 0x2,0x63,0x30, 0x2,0x63,0x2d, 0x2,0x63,0x28, 0x2,0x63,0x27, + 0x2,0x63,0x3b, 0x3,0x58,0x73, 0x2,0x63,0x2c, 0x2,0x63,0x2b, + 0x1,0x77,0x38, 0x2,0x63,0x34, 0x3,0x58,0x74, 0x1,0x77,0x37, + 0x3,0x58,0x75, 0x5,0x64,0x48, 0x1,0x77,0x39, 0x2,0x63,0x2f, + 0x2,0x63,0x3a, 0x3,0x66,0x46, 0x2,0x66,0x69, 0x2,0x66,0x6a, + 0x3,0x5b,0x2c, 0x1,0x78,0x74, 0x2,0x66,0x67, 0x1,0x78,0x71, + 0x2,0x66,0x6f, 0x3,0x5b,0x27, 0x1,0x78,0x75, 0x2,0x66,0x71, + 0x2,0x66,0x66, 0x2,0x63,0x39, 0x2,0x66,0x73, 0x2,0x66,0x68, + 0x5,0x69,0x43, 0x1,0x78,0x72, 0x2,0x66,0x6e, 0x3,0x5b,0x29, + 0x2,0x66,0x70, 0x2,0x66,0x6b, 0x2,0x66,0x72, 0x2,0x66,0x6d, + 0x2,0x66,0x6c, 0x1,0x78,0x73, 0x3,0x58,0x77, 0x3,0x5b,0x2b, + 0x2,0x69,0x71, 0x2,0x69,0x72, 0x3,0x5d,0x25, 0x2,0x69,0x74, + 0x1,0x7a,0x39, 0x1,0x7a,0x3a, 0x2,0x69,0x75, 0x2,0x69,0x73, + 0x3,0x5d,0x24, 0x2,0x69,0x70, 0x3,0x5e,0x5d, 0x2,0x6c,0x31, + 0x2,0x6c,0x34, 0x2,0x6c,0x30, 0x4,0x61,0x26, 0x1,0x7b,0x27, + 0x2,0x6c,0x32, 0x1,0x7b,0x26, 0x1,0x7b,0x25, 0x1,0x7b,0x24, + 0x2,0x6c,0x33, 0x2,0x6d,0x7e, 0x2,0x6d,0x7c, 0x3,0x5f,0x5f, + 0x2,0x6d,0x7b, 0x2,0x6c,0x2f, 0x2,0x6d,0x7d, 0x2,0x6c,0x35, + 0x2,0x6d,0x7a, 0x3,0x60,0x45, 0x2,0x6f,0x48, 0x2,0x6f,0x26, + 0x2,0x6f,0x46, 0x1,0x7c,0x47, 0x2,0x6f,0x47, 0x2,0x6f,0x49, + 0x3,0x66,0x47, 0x2,0x70,0x4d, 0x1,0x7c,0x66, 0x2,0x70,0x4c, + 0x2,0x70,0x4b, 0x1,0x7c,0x67, 0x4,0x6c,0x23, 0x1,0x7d,0x27, + 0x2,0x71,0x5d, 0x2,0x71,0x75, 0x2,0x71,0x74, 0x2,0x71,0x76, + 0x1,0x48,0x66, 0x2,0x2d,0x4b, 0x3,0x2f,0x26, 0x2,0x32,0x71, + 0x2,0x32,0x72, 0x3,0x38,0x6a, 0x3,0x3e,0x6a, 0x3,0x3e,0x69, + 0x2,0x40,0x26, 0x6,0x4e,0x4f, 0x2,0x6c,0x36, 0x2,0x70,0x4e, + 0x1,0x48,0x67, 0x1,0x53,0x4f, 0x2,0x2d,0x4c, 0x3,0x33,0x71, + 0x3,0x66,0x48, 0x4,0x35,0x27, 0x2,0x39,0x34, 0x1,0x5d,0x34, + 0x2,0x40,0x28, 0x2,0x40,0x27, 0x1,0x61,0x79, 0x3,0x44,0x4d, + 0x1,0x66,0x4c, 0x2,0x54,0x2a, 0x1,0x6e,0x6c, 0x3,0x4e,0x5f, + 0x1,0x6e,0x6d, 0x3,0x52,0x63, 0x3,0x52,0x64, 0x4,0x53,0x4b, + 0x1,0x72,0x2f, 0x1,0x7c,0x68, 0x1,0x48,0x68, 0x3,0x2f,0x27, + 0x2,0x2d,0x4d, 0x1,0x4f,0x50, 0x2,0x2d,0x4f, 0x2,0x2d,0x4e, + 0x1,0x53,0x50, 0x2,0x32,0x73, 0x3,0x33,0x74, 0x2,0x32,0x7a, + 0x1,0x58,0x2e, 0x2,0x32,0x78, 0x2,0x32,0x76, 0x3,0x33,0x77, + 0x2,0x32,0x7d, 0x2,0x32,0x74, 0x2,0x32,0x75, 0x1,0x58,0x2f, + 0x3,0x33,0x72, 0x1,0x58,0x33, 0x3,0x33,0x73, 0x3,0x33,0x75, + 0x2,0x32,0x7e, 0x1,0x58,0x32, 0x2,0x32,0x7c, 0x2,0x32,0x79, + 0x2,0x32,0x77, 0x1,0x58,0x30, 0x1,0x58,0x31, 0x2,0x32,0x7b, + 0x3,0x33,0x76, 0x3,0x66,0x49, 0x1,0x5d,0x36, 0x2,0x39,0x35, + 0x3,0x38,0x72, 0x1,0x5d,0x3b, 0x2,0x39,0x45, 0x1,0x5d,0x3a, + 0x2,0x39,0x47, 0x3,0x38,0x6e, 0x3,0x38,0x74, 0x2,0x39,0x3b, + 0x1,0x5d,0x38, 0x2,0x39,0x46, 0x3,0x38,0x6c, 0x2,0x39,0x36, + 0x1,0x5d,0x39, 0x2,0x39,0x42, 0x2,0x39,0x3e, 0x2,0x39,0x40, + 0x2,0x39,0x3a, 0x2,0x39,0x41, 0x3,0x38,0x6b, 0x4,0x35,0x2f, + 0x1,0x5d,0x35, 0x2,0x39,0x3d, 0x3,0x38,0x73, 0x2,0x39,0x3c, + 0x2,0x39,0x38, 0x3,0x38,0x6d, 0x2,0x39,0x43, 0x3,0x38,0x6f, + 0x3,0x38,0x71, 0x2,0x39,0x3f, 0x2,0x39,0x37, 0x3,0x38,0x70, + 0x2,0x39,0x39, 0x1,0x5d,0x37, 0x2,0x39,0x44, 0x1,0x61,0x7c, + 0x2,0x40,0x33, 0x4,0x3a,0x7b, 0x3,0x3e,0x70, 0x3,0x3e,0x72, + 0x2,0x40,0x2f, 0x2,0x40,0x31, 0x2,0x40,0x2c, 0x2,0x40,0x2b, + 0x2,0x40,0x29, 0x3,0x3e,0x6d, 0x2,0x40,0x30, 0x2,0x40,0x32, + 0x2,0x40,0x2e, 0x3,0x3e,0x6f, 0x2,0x40,0x2d, 0x1,0x61,0x7a, + 0x1,0x61,0x7b, 0x2,0x40,0x35, 0x1,0x66,0x54, 0x2,0x47,0x39, + 0x2,0x47,0x3f, 0x2,0x47,0x3a, 0x2,0x47,0x3b, 0x3,0x44,0x4e, + 0x2,0x47,0x40, 0x5,0x42,0x6c, 0x1,0x66,0x56, 0x4,0x40,0x61, + 0x1,0x66,0x4e, 0x1,0x66,0x55, 0x2,0x47,0x38, 0x2,0x40,0x2a, + 0x1,0x66,0x51, 0x1,0x66,0x4f, 0x2,0x47,0x3e, 0x2,0x47,0x3d, + 0x1,0x66,0x50, 0x1,0x66,0x52, 0x2,0x47,0x3c, 0x1,0x66,0x4d, + 0x3,0x44,0x4f, 0x1,0x66,0x53, 0x3,0x4e,0x60, 0x2,0x4d,0x7d, + 0x1,0x6a,0x7c, 0x3,0x49,0x59, 0x3,0x49,0x52, 0x2,0x4e,0x2a, + 0x2,0x4e,0x29, 0x3,0x49,0x57, 0x2,0x4e,0x24, 0x1,0x6a,0x7e, + 0x2,0x4e,0x28, 0x2,0x4d,0x7e, 0x2,0x4e,0x21, 0x1,0x6a,0x76, + 0x1,0x6a,0x78, 0x3,0x49,0x54, 0x2,0x4e,0x26, 0x2,0x4d,0x7c, + 0x1,0x6a,0x7a, 0x1,0x6a,0x79, 0x2,0x4e,0x22, 0x2,0x4e,0x27, + 0x2,0x4e,0x25, 0x1,0x6a,0x7b, 0x2,0x4e,0x23, 0x3,0x49,0x51, + 0x3,0x49,0x56, 0x2,0x40,0x34, 0x1,0x6a,0x77, 0x3,0x49,0x58, + 0x2,0x54,0x2b, 0x2,0x54,0x32, 0x1,0x6e,0x6f, 0x4,0x4d,0x46, + 0x2,0x54,0x36, 0x1,0x6e,0x73, 0x2,0x54,0x2e, 0x2,0x54,0x2c, + 0x4,0x4d,0x3e, 0x2,0x54,0x35, 0x3,0x4e,0x61, 0x1,0x6e,0x6e, + 0x2,0x54,0x34, 0x1,0x6e,0x70, 0x1,0x6e,0x71, 0x2,0x54,0x2d, + 0x1,0x6e,0x72, 0x2,0x54,0x33, 0x2,0x54,0x2f, 0x2,0x54,0x30, + 0x2,0x54,0x31, 0x1,0x6a,0x7d, 0x3,0x4e,0x62, 0x2,0x5a,0x3e, + 0x2,0x5a,0x4a, 0x4,0x53,0x53, 0x1,0x72,0x34, 0x2,0x5a,0x45, + 0x2,0x5a,0x47, 0x3,0x52,0x65, 0x1,0x72,0x32, 0x2,0x5a,0x3f, + 0x2,0x5a,0x43, 0x4,0x53,0x50, 0x2,0x5a,0x46, 0x1,0x72,0x30, + 0x1,0x72,0x33, 0x2,0x5a,0x49, 0x2,0x5a,0x41, 0x2,0x5a,0x42, + 0x2,0x5a,0x48, 0x2,0x5a,0x40, 0x2,0x5a,0x44, 0x1,0x72,0x31, + 0x2,0x5f,0x40, 0x2,0x5f,0x3f, 0x1,0x75,0x42, 0x2,0x5f,0x45, + 0x1,0x75,0x44, 0x3,0x56,0x40, 0x4,0x58,0x62, 0x1,0x75,0x41, + 0x2,0x5f,0x41, 0x1,0x75,0x45, 0x2,0x5f,0x42, 0x3,0x56,0x3f, + 0x3,0x56,0x3d, 0x2,0x5f,0x43, 0x2,0x5f,0x46, 0x3,0x56,0x42, + 0x1,0x75,0x43, 0x2,0x63,0x41, 0x3,0x58,0x79, 0x2,0x63,0x44, + 0x3,0x58,0x7a, 0x2,0x63,0x3e, 0x2,0x63,0x40, 0x3,0x58,0x7c, + 0x3,0x58,0x7b, 0x2,0x63,0x3f, 0x2,0x63,0x42, 0x2,0x63,0x43, + 0x2,0x5f,0x44, 0x2,0x63,0x3d, 0x3,0x66,0x4a, 0x1,0x78,0x78, + 0x2,0x66,0x77, 0x2,0x66,0x7a, 0x2,0x66,0x7c, 0x2,0x66,0x75, + 0x2,0x66,0x76, 0x2,0x66,0x79, 0x2,0x66,0x7b, 0x1,0x78,0x79, + 0x1,0x78,0x77, 0x1,0x78,0x76, 0x2,0x66,0x78, 0x2,0x66,0x74, + 0x2,0x69,0x76, 0x1,0x7a,0x3b, 0x3,0x5d,0x29, 0x2,0x69,0x77, + 0x3,0x5d,0x28, 0x2,0x6c,0x38, 0x1,0x7b,0x28, 0x2,0x6c,0x3a, + 0x1,0x7b,0x29, 0x2,0x6c,0x37, 0x2,0x6c,0x39, 0x1,0x7b,0x72, + 0x5,0x74,0x38, 0x2,0x6e,0x21, 0x1,0x7b,0x71, 0x2,0x6f,0x4c, + 0x2,0x6f,0x4b, 0x4,0x6c,0x25, 0x2,0x6f,0x4a, 0xf,0x68,0x4a, + 0x3,0x61,0x49, 0x2,0x71,0x37, 0x2,0x71,0x38, 0x2,0x71,0x3a, + 0x2,0x71,0x39, 0x3,0x61,0x7d, 0x2,0x22,0x70, 0x1,0x48,0x69, + 0x1,0x53,0x51, 0x2,0x39,0x48, 0x1,0x61,0x7d, 0x3,0x66,0x4b, + 0x2,0x47,0x41, 0x1,0x77,0x3b, 0x3,0x5b,0x2f, 0x2,0x66,0x7d, + 0x3,0x60,0x46, 0x3,0x61,0x4a, 0x1,0x4b,0x44, 0x3,0x2f,0x29, + 0x4,0x2f,0x76, 0x4,0x2f,0x75, 0x1,0x5d,0x3d, 0x4,0x35,0x34, + 0x3,0x38,0x76, 0x3,0x38,0x75, 0x1,0x5d,0x3c, 0x3,0x38,0x77, + 0x2,0x40,0x36, 0x1,0x61,0x7e, 0x2,0x40,0x38, 0x2,0x40,0x37, + 0x6,0x4e,0x60, 0x3,0x3e,0x74, 0x2,0x47,0x42, 0x1,0x66,0x57, + 0x2,0x4e,0x2b, 0x2,0x4e,0x2e, 0x2,0x4e,0x2d, 0x4,0x47,0x35, + 0x2,0x4e,0x2c, 0x2,0x54,0x37, 0x2,0x54,0x39, 0x2,0x54,0x38, + 0x3,0x4e,0x65, 0x1,0x72,0x36, 0x3,0x52,0x66, 0x4,0x53,0x59, + 0x3,0x4e,0x64, 0x1,0x72,0x35, 0x3,0x56,0x46, 0x1,0x75,0x46, + 0x2,0x5f,0x47, 0x2,0x5f,0x49, 0x2,0x5f,0x48, 0x3,0x58,0x7e, + 0x3,0x58,0x7d, 0x1,0x77,0x3c, 0x3,0x59,0x21, 0x4,0x61,0x2f, + 0x3,0x5b,0x31, 0x2,0x67,0x21, 0x2,0x66,0x7e, 0xf,0x63,0x77, + 0x2,0x69,0x78, 0x1,0x7a,0x3c, 0x3,0x5d,0x2a, 0x3,0x5e,0x61, + 0x1,0x7b,0x2a, 0x2,0x6e,0x23, 0x2,0x6e,0x22, 0x1,0x7d,0x28, + 0x1,0x4b,0x45, 0x2,0x2d,0x50, 0x1,0x53,0x52, 0x2,0x39,0x4b, + 0x2,0x39,0x49, 0x4,0x35,0x39, 0x4,0x35,0x38, 0x2,0x39,0x4a, + 0x2,0x40,0x3a, 0x2,0x40,0x3b, 0x2,0x47,0x49, 0x2,0x40,0x39, + 0x2,0x47,0x43, 0x2,0x47,0x47, 0x2,0x47,0x46, 0x2,0x47,0x48, + 0x1,0x66,0x58, 0x2,0x47,0x45, 0x2,0x47,0x44, 0x2,0x47,0x4a, + 0x3,0x44,0x54, 0x2,0x4e,0x31, 0x2,0x4e,0x2f, 0x3,0x49,0x5c, + 0x2,0x4e,0x30, 0x2,0x54,0x3c, 0x2,0x54,0x3a, 0x3,0x4e,0x66, + 0x2,0x54,0x3b, 0x2,0x5a,0x4b, 0x2,0x5f,0x4a, 0x2,0x5f,0x4b, + 0x1,0x77,0x3d, 0x3,0x5b,0x32, 0x2,0x67,0x22, 0x2,0x69,0x79, + 0x1,0x7a,0x3d, 0x4,0x61,0x37, 0x2,0x6c,0x3b, 0x2,0x6e,0x24, + 0x1,0x7b,0x73, 0x4,0x69,0x45, 0x2,0x6f,0x4d, 0x2,0x71,0x3b, + 0x1,0x4b,0x46, 0x1,0x53,0x54, 0x1,0x53,0x55, 0x2,0x2d,0x51, + 0x3,0x2f,0x2a, 0x3,0x2f,0x2c, 0x2,0x2d,0x52, 0x1,0x53,0x53, + 0x4,0x2f,0x7c, 0x1,0x58,0x39, 0x3,0x33,0x7b, 0x1,0x58,0x37, + 0x3,0x33,0x7a, 0x1,0x58,0x36, 0x1,0x58,0x3d, 0x1,0x58,0x35, + 0x1,0x58,0x3e, 0x2,0x33,0x21, 0x1,0x58,0x3b, 0x4,0x2f,0x7d, + 0x1,0x58,0x38, 0x1,0x58,0x3c, 0x1,0x58,0x3a, 0x1,0x58,0x34, + 0x3,0x33,0x7c, 0x1,0x5d,0x45, 0x3,0x38,0x7e, 0x1,0x5d,0x3f, + 0x2,0x39,0x4f, 0x1,0x5d,0x44, 0x3,0x39,0x23, 0x3,0x39,0x29, + 0x1,0x5d,0x46, 0x1,0x5d,0x40, 0x6,0x44,0x70, 0x1,0x5d,0x41, + 0x3,0x38,0x79, 0x2,0x39,0x4d, 0x3,0x38,0x7b, 0x3,0x39,0x25, + 0x1,0x5d,0x3e, 0x3,0x39,0x22, 0x2,0x39,0x4e, 0x1,0x5d,0x43, + 0x4,0x35,0x3d, 0x5,0x35,0x5b, 0x2,0x39,0x4c, 0x1,0x5d,0x42, + 0x3,0x38,0x7a, 0x1,0x62,0x2b, 0x3,0x3e,0x7c, 0x1,0x62,0x2d, + 0x4,0x3b,0x2f, 0x3,0x3e,0x7d, 0x2,0x40,0x3e, 0x1,0x62,0x2c, + 0x1,0x62,0x21, 0x1,0x62,0x25, 0x3,0x3f,0x24, 0x1,0x66,0x6b, + 0x2,0x47,0x4f, 0x2,0x40,0x40, 0x1,0x62,0x26, 0x3,0x3e,0x7e, + 0x3,0x3e,0x75, 0x2,0x40,0x43, 0x2,0x40,0x44, 0x1,0x62,0x2a, + 0x4,0x3b,0x30, 0x2,0x40,0x46, 0x3,0x3f,0x21, 0x2,0x40,0x48, + 0x3,0x3f,0x23, 0x2,0x40,0x49, 0x2,0x40,0x3d, 0x2,0x40,0x3c, + 0x2,0x40,0x4a, 0x1,0x62,0x29, 0x2,0x40,0x47, 0x2,0x40,0x45, + 0x4,0x3b,0x2c, 0x1,0x62,0x27, 0x1,0x62,0x23, 0x1,0x62,0x2e, + 0x2,0x40,0x41, 0x2,0x40,0x42, 0x2,0x40,0x3f, 0x3,0x3e,0x78, + 0x1,0x62,0x28, 0x4,0x3b,0x31, 0x3,0x3f,0x22, 0x1,0x62,0x24, + 0x1,0x62,0x22, 0x2,0x47,0x4e, 0x1,0x66,0x66, 0x1,0x66,0x61, + 0x3,0x44,0x60, 0x3,0x44,0x59, 0x1,0x66,0x5c, 0x3,0x44,0x63, + 0x1,0x66,0x6c, 0x1,0x66,0x5d, 0x3,0x44,0x55, 0x1,0x66,0x59, + 0x1,0x66,0x68, 0x1,0x66,0x65, 0x1,0x66,0x67, 0x3,0x44,0x58, + 0x1,0x66,0x5e, 0x1,0x66,0x63, 0x1,0x66,0x5a, 0x1,0x66,0x5b, + 0x2,0x47,0x56, 0x2,0x47,0x53, 0x2,0x47,0x4b, 0x2,0x47,0x50, + 0x3,0x44,0x5b, 0x1,0x66,0x69, 0x2,0x47,0x57, 0x1,0x66,0x6a, + 0x1,0x66,0x60, 0x3,0x44,0x5c, 0x3,0x44,0x61, 0x2,0x47,0x4d, + 0x3,0x44,0x56, 0x2,0x47,0x55, 0x2,0x47,0x51, 0x2,0x47,0x54, + 0x2,0x47,0x52, 0x1,0x66,0x64, 0x2,0x47,0x4c, 0x1,0x66,0x5f, + 0x3,0x44,0x5d, 0x2,0x4e,0x34, 0x1,0x6b,0x22, 0x1,0x6b,0x25, + 0x3,0x49,0x5f, 0x2,0x4e,0x36, 0x3,0x49,0x64, 0x1,0x6b,0x2d, + 0x2,0x4e,0x35, 0x1,0x6b,0x27, 0x3,0x49,0x63, 0x1,0x6e,0x78, + 0x2,0x4e,0x37, 0x4,0x47,0x45, 0x1,0x6b,0x2c, 0x2,0x4e,0x33, + 0x1,0x6b,0x2e, 0x3,0x49,0x5e, 0x3,0x49,0x62, 0x3,0x49,0x6b, + 0x1,0x6b,0x23, 0x3,0x49,0x68, 0x1,0x66,0x62, 0x1,0x6b,0x26, + 0x3,0x49,0x60, 0x1,0x6b,0x24, 0x1,0x6b,0x28, 0x1,0x6b,0x2a, + 0x1,0x6b,0x21, 0x1,0x6b,0x2f, 0x1,0x6b,0x2b, 0x3,0x49,0x65, + 0x1,0x6b,0x29, 0x2,0x4e,0x32, 0x3,0x49,0x66, 0xf,0x4c,0x41, + 0x3,0x4e,0x74, 0x1,0x6f,0x21, 0x3,0x4e,0x67, 0x1,0x6e,0x7b, + 0x3,0x4e,0x72, 0x3,0x4e,0x70, 0x3,0x4e,0x6e, 0x1,0x6f,0x24, + 0x3,0x4e,0x6c, 0x2,0x54,0x3f, 0x1,0x6f,0x25, 0x2,0x54,0x4b, + 0x2,0x54,0x44, 0x1,0x6e,0x74, 0x2,0x54,0x4c, 0x2,0x54,0x46, + 0x1,0x6e,0x7e, 0x2,0x54,0x47, 0x3,0x4e,0x73, 0x1,0x6e,0x7d, + 0x2,0x54,0x4a, 0x1,0x6e,0x77, 0x2,0x54,0x48, 0x2,0x54,0x3e, + 0x1,0x6e,0x76, 0x2,0x5a,0x56, 0x1,0x6e,0x7c, 0x3,0x4e,0x75, + 0x1,0x6e,0x79, 0x3,0x4e,0x69, 0x1,0x6f,0x23, 0x3,0x4e,0x6a, + 0x2,0x54,0x3d, 0x3,0x4e,0x76, 0x2,0x54,0x41, 0x1,0x6e,0x75, + 0x2,0x54,0x40, 0x2,0x54,0x42, 0x2,0x54,0x43, 0x1,0x6f,0x22, + 0x2,0x54,0x45, 0x2,0x54,0x49, 0x2,0x54,0x4d, 0x1,0x6f,0x26, + 0x1,0x72,0x3c, 0x2,0x5a,0x51, 0x2,0x5a,0x57, 0x2,0x5a,0x54, + 0x2,0x5a,0x4c, 0x2,0x5a,0x58, 0x2,0x5a,0x4d, 0x3,0x52,0x6a, + 0x2,0x5a,0x53, 0x3,0x52,0x6b, 0x1,0x72,0x37, 0x1,0x72,0x3d, + 0x2,0x5a,0x59, 0x3,0x4e,0x6f, 0x3,0x52,0x67, 0x1,0x72,0x39, + 0x3,0x52,0x6e, 0x1,0x72,0x43, 0x1,0x72,0x3e, 0x2,0x5a,0x5b, + 0x2,0x5a,0x55, 0x1,0x72,0x3a, 0x2,0x5a,0x4e, 0x1,0x72,0x44, + 0x2,0x5a,0x4f, 0x2,0x5a,0x50, 0x1,0x72,0x45, 0x1,0x72,0x42, + 0x1,0x6e,0x7a, 0x3,0x52,0x69, 0x1,0x72,0x38, 0x2,0x5a,0x5c, + 0x1,0x72,0x46, 0x3,0x52,0x68, 0x1,0x72,0x3f, 0x2,0x5a,0x5a, + 0x1,0x72,0x3b, 0x1,0x72,0x40, 0x1,0x72,0x41, 0x3,0x66,0x4c, + 0x1,0x75,0x4e, 0x2,0x5f,0x50, 0x2,0x5f,0x59, 0x2,0x5f,0x56, + 0x2,0x5f,0x58, 0x3,0x56,0x49, 0x1,0x75,0x4b, 0x2,0x5f,0x51, + 0x3,0x56,0x4a, 0x2,0x5f,0x57, 0x1,0x75,0x47, 0x2,0x5f,0x53, + 0x1,0x75,0x4f, 0x2,0x5f,0x4f, 0x2,0x5f,0x54, 0x2,0x5f,0x5b, + 0x2,0x5a,0x52, 0x2,0x5f,0x55, 0x2,0x5f,0x4e, 0x1,0x75,0x48, + 0x2,0x5f,0x4d, 0x1,0x75,0x49, 0x2,0x5f,0x5c, 0x1,0x75,0x4a, + 0x2,0x5f,0x5a, 0x1,0x75,0x4d, 0x2,0x5f,0x4c, 0x3,0x56,0x48, + 0x1,0x75,0x4c, 0x2,0x5f,0x52, 0x2,0x63,0x47, 0x2,0x63,0x55, + 0x2,0x63,0x50, 0x2,0x63,0x52, 0x2,0x63,0x46, 0x1,0x77,0x3e, + 0x3,0x59,0x2a, 0x2,0x63,0x45, 0x1,0x77,0x41, 0x1,0x77,0x40, + 0x3,0x59,0x26, 0x2,0x63,0x54, 0x2,0x63,0x4c, 0x2,0x63,0x49, + 0x2,0x63,0x4f, 0x3,0x59,0x24, 0x2,0x63,0x48, 0x3,0x59,0x28, + 0x2,0x63,0x4a, 0x2,0x63,0x53, 0x2,0x63,0x51, 0x3,0x59,0x23, + 0x1,0x77,0x3f, 0x2,0x63,0x58, 0x2,0x63,0x56, 0x2,0x63,0x4d, + 0x2,0x63,0x57, 0x2,0x63,0x4e, 0x3,0x5b,0x34, 0x2,0x67,0x26, + 0x1,0x78,0x7a, 0x2,0x67,0x2d, 0x3,0x5b,0x35, 0x4,0x61,0x3a, + 0x2,0x6c,0x3e, 0x1,0x79,0x23, 0x2,0x63,0x4b, 0x2,0x67,0x24, + 0x1,0x78,0x7d, 0x2,0x67,0x25, 0x2,0x67,0x2a, 0x3,0x5b,0x36, + 0x3,0x5d,0x33, 0x1,0x79,0x21, 0x1,0x79,0x22, 0x2,0x67,0x23, + 0x2,0x67,0x2c, 0x2,0x67,0x2e, 0x2,0x67,0x27, 0x2,0x67,0x29, + 0x2,0x67,0x2b, 0x2,0x67,0x28, 0x2,0x67,0x2f, 0x1,0x78,0x7c, + 0x1,0x79,0x24, 0x1,0x78,0x7e, 0x1,0x78,0x7b, 0x2,0x69,0x7c, + 0x4,0x64,0x4d, 0x1,0x7a,0x42, 0x2,0x69,0x7a, 0x3,0x5d,0x30, + 0x3,0x5d,0x2c, 0x2,0x69,0x7e, 0x3,0x5d,0x32, 0x2,0x6a,0x21, + 0x1,0x7a,0x40, 0x2,0x6a,0x22, 0x2,0x69,0x7d, 0x3,0x5d,0x2b, + 0x2,0x69,0x7b, 0x1,0x7a,0x43, 0x1,0x7a,0x3f, 0x2,0x6a,0x23, + 0x3,0x5d,0x2e, 0x1,0x7a,0x41, 0x1,0x7a,0x3e, 0x3,0x5c,0x6d, + 0x4,0x67,0x3b, 0x1,0x7b,0x2b, 0x3,0x5e,0x62, 0x4,0x67,0x41, + 0x1,0x7b,0x2c, 0x2,0x6c,0x3d, 0x2,0x6c,0x3c, 0x2,0x6c,0x3f, + 0x2,0x6c,0x40, 0x3,0x5e,0x63, 0x1,0x7b,0x2d, 0x2,0x6e,0x25, + 0x2,0x6e,0x2a, 0x1,0x7b,0x74, 0x3,0x5f,0x61, 0x2,0x6e,0x27, + 0x3,0x5f,0x62, 0x2,0x6e,0x26, 0x2,0x6e,0x29, 0x2,0x6e,0x28, + 0x3,0x60,0x48, 0x2,0x6f,0x51, 0x4,0x6a,0x7c, 0x1,0x7c,0x48, + 0x2,0x6f,0x50, 0x2,0x6f,0x4e, 0x3,0x60,0x47, 0x2,0x6f,0x4f, + 0x3,0x60,0x49, 0x3,0x60,0x7b, 0x1,0x7c,0x6a, 0x1,0x7c,0x69, + 0x2,0x70,0x4f, 0x2,0x70,0x50, 0x1,0x7c,0x6b, 0x3,0x61,0x4b, + 0x2,0x71,0x3c, 0x2,0x71,0x3d, 0x1,0x7d,0x34, 0x3,0x61,0x6b, + 0x1,0x7d,0x3a, 0x3,0x61,0x7e, 0x2,0x71,0x77, 0x2,0x72,0x36, + 0x1,0x4b,0x47, 0x5,0x30,0x46, 0x2,0x39,0x50, 0x3,0x39,0x2a, + 0x2,0x39,0x51, 0x2,0x47,0x58, 0x2,0x4e,0x38, 0x2,0x54,0x4e, + 0x1,0x75,0x51, 0x3,0x56,0x4d, 0x1,0x75,0x50, 0x2,0x63,0x59, + 0x2,0x67,0x30, 0x3,0x5f,0x64, 0x2,0x6f,0x52, 0x1,0x4b,0x48, + 0x2,0x33,0x22, 0x1,0x58,0x3f, 0x1,0x5d,0x47, 0x2,0x47,0x5a, + 0x2,0x47,0x59, 0x1,0x6f,0x27, 0x2,0x54,0x4f, 0x1,0x6f,0x28, + 0x2,0x5f,0x5d, 0x1,0x77,0x42, 0x3,0x5d,0x34, 0x3,0x66,0x4d, + 0x3,0x62,0x21, 0x1,0x7d,0x43, 0x1,0x4b,0x49, 0x2,0x28,0x6b, + 0x2,0x33,0x23, 0x3,0x39,0x2d, 0x4,0x35,0x4d, 0x1,0x5d,0x48, + 0x3,0x39,0x2c, 0x2,0x39,0x52, 0x2,0x39,0x53, 0x3,0x3f,0x2a, + 0x2,0x40,0x4b, 0x3,0x3f,0x29, 0x1,0x62,0x2f, 0x1,0x66,0x6d, + 0x3,0x44,0x64, 0x2,0x47,0x5c, 0x2,0x47,0x5b, 0x2,0x47,0x5d, + 0x3,0x49,0x6d, 0x2,0x4e,0x39, 0x2,0x4e,0x3a, 0x1,0x6b,0x30, + 0x1,0x72,0x47, 0x1,0x6f,0x29, 0x1,0x72,0x48, 0x2,0x5f,0x61, + 0x2,0x5f,0x5e, 0x2,0x5f,0x60, 0x2,0x5f,0x5f, 0x1,0x75,0x52, + 0x3,0x59,0x2b, 0x2,0x63,0x5a, 0x2,0x67,0x32, 0x2,0x67,0x31, + 0x2,0x25,0x24, 0x1,0x58,0x41, 0x1,0x58,0x40, 0x2,0x33,0x24, + 0x3,0x39,0x2e, 0x2,0x39,0x54, 0x3,0x3f,0x2c, 0x3,0x3f,0x2b, + 0x2,0x40,0x4d, 0x2,0x40,0x4c, 0x1,0x62,0x30, 0x3,0x3f,0x2d, + 0x2,0x47,0x5f, 0x2,0x47,0x60, 0x2,0x47,0x5e, 0x4,0x40,0x78, + 0x3,0x44,0x65, 0x1,0x66,0x6f, 0x1,0x66,0x6e, 0x4,0x47,0x54, + 0x1,0x6b,0x32, 0x1,0x6b,0x31, 0x3,0x4e,0x7a, 0x2,0x54,0x50, + 0x2,0x5a,0x5f, 0x2,0x5a,0x5d, 0x2,0x5a,0x5e, 0x1,0x72,0x49, + 0x2,0x5f,0x63, 0x2,0x5f,0x62, 0x3,0x56,0x4f, 0x2,0x63,0x5d, + 0x2,0x63,0x5c, 0x2,0x63,0x5b, 0x2,0x67,0x33, 0x3,0x61,0x4d, + 0x2,0x71,0x78, 0x1,0x4b,0x4a, 0x1,0x53,0x56, 0x3,0x2f,0x2e, + 0x1,0x53,0x57, 0x1,0x58,0x42, 0x1,0x58,0x43, 0x2,0x33,0x26, + 0x2,0x33,0x25, 0x2,0x39,0x55, 0x3,0x39,0x30, 0x1,0x5d,0x4e, + 0x1,0x5d,0x4c, 0x1,0x5d,0x49, 0x1,0x5d,0x4d, 0x1,0x5d,0x4b, + 0x1,0x5d,0x4a, 0x3,0x39,0x32, 0x3,0x39,0x31, 0x1,0x62,0x31, + 0x2,0x40,0x50, 0x3,0x3f,0x2f, 0x1,0x66,0x74, 0x1,0x62,0x33, + 0x1,0x62,0x38, 0x2,0x40,0x52, 0x1,0x62,0x3a, 0x1,0x62,0x39, + 0x1,0x62,0x3c, 0x2,0x40,0x51, 0x2,0x40,0x4e, 0x1,0x62,0x36, + 0x1,0x62,0x32, 0x1,0x62,0x34, 0x2,0x40,0x4f, 0x1,0x62,0x3b, + 0x1,0x62,0x37, 0x1,0x62,0x35, 0x1,0x66,0x76, 0x1,0x66,0x75, + 0x1,0x66,0x73, 0x1,0x66,0x77, 0x4,0x40,0x7e, 0x1,0x66,0x71, + 0x1,0x66,0x72, 0x3,0x44,0x69, 0x1,0x66,0x70, 0x5,0x43,0x2d, + 0x2,0x47,0x61, 0x3,0x44,0x67, 0x2,0x4e,0x3c, 0x3,0x49,0x70, + 0x1,0x6b,0x34, 0x1,0x6b,0x35, 0x1,0x6b,0x33, 0x3,0x49,0x72, + 0x2,0x4e,0x3b, 0x3,0x49,0x71, 0x2,0x4e,0x3d, 0x3,0x66,0x4e, + 0x2,0x54,0x53, 0x2,0x54,0x55, 0x3,0x4e,0x7e, 0x1,0x6f,0x32, + 0x2,0x54,0x56, 0x1,0x6f,0x2b, 0x2,0x54,0x52, 0x1,0x6f,0x2a, + 0x1,0x6f,0x34, 0x1,0x6f,0x30, 0x1,0x6f,0x31, 0x1,0x6f,0x2d, + 0x2,0x54,0x51, 0x1,0x6f,0x2c, 0x2,0x54,0x57, 0x2,0x54,0x54, + 0x3,0x4e,0x7d, 0x1,0x6f,0x33, 0x3,0x4f,0x22, 0x1,0x6f,0x2e, + 0x1,0x6f,0x2f, 0x2,0x5a,0x61, 0x3,0x52,0x75, 0x2,0x5a,0x63, + 0x2,0x5a,0x62, 0x3,0x52,0x73, 0x2,0x5a,0x64, 0x1,0x72,0x4a, + 0x2,0x5a,0x60, 0x3,0x56,0x51, 0x3,0x56,0x52, 0x1,0x75,0x56, + 0x2,0x5f,0x64, 0x1,0x75,0x53, 0x1,0x75,0x57, 0x1,0x75,0x55, + 0x1,0x75,0x54, 0x2,0x63,0x5e, 0x4,0x5d,0x69, 0x2,0x63,0x61, + 0x7,0x43,0x52, 0x2,0x63,0x60, 0x3,0x59,0x2e, 0x2,0x63,0x5f, + 0x1,0x77,0x43, 0x2,0x67,0x34, 0x2,0x67,0x35, 0x1,0x79,0x25, + 0x2,0x67,0x36, 0x1,0x79,0x26, 0x3,0x5b,0x38, 0x3,0x66,0x4f, + 0x1,0x7a,0x45, 0x4,0x64,0x4f, 0x1,0x7a,0x44, 0x2,0x6c,0x41, + 0x3,0x5e,0x65, 0x3,0x5e,0x66, 0x1,0x7b,0x2e, 0x2,0x6c,0x42, + 0x2,0x6e,0x2b, 0x1,0x7b,0x75, 0x1,0x7b,0x76, 0x3,0x66,0x50, + 0x2,0x6f,0x53, 0x3,0x60,0x4a, 0x1,0x7c,0x6d, 0x3,0x61,0x4e, + 0x1,0x4b,0x4b, 0x3,0x39,0x33, 0x1,0x5d,0x50, 0x1,0x5d,0x4f, + 0x2,0x47,0x62, 0x2,0x47,0x63, 0x1,0x6b,0x36, 0x2,0x5a,0x65, + 0x1,0x6f,0x35, 0x2,0x5a,0x66, 0x2,0x5f,0x65, 0x1,0x4b,0x4c, + 0x3,0x24,0x3a, 0x2,0x2d,0x53, 0x1,0x53,0x59, 0x1,0x53,0x58, + 0x2,0x33,0x27, 0x1,0x58,0x44, 0x2,0x33,0x28, 0x2,0x39,0x58, + 0x3,0x39,0x39, 0x2,0x39,0x57, 0x3,0x39,0x37, 0x2,0x39,0x56, + 0x3,0x39,0x35, 0x3,0x39,0x38, 0x2,0x40,0x54, 0x1,0x62,0x3f, + 0x3,0x3f,0x39, 0x3,0x3f,0x34, 0x2,0x40,0x53, 0x1,0x62,0x3e, + 0x3,0x3f,0x37, 0x3,0x3f,0x30, 0x3,0x3f,0x33, 0x2,0x40,0x55, + 0x1,0x62,0x3d, 0x3,0x3f,0x38, 0x2,0x47,0x65, 0x2,0x47,0x68, + 0x2,0x47,0x66, 0x2,0x47,0x67, 0x2,0x47,0x6b, 0x2,0x47,0x64, + 0x2,0x47,0x6c, 0x2,0x47,0x69, 0x2,0x47,0x6a, 0x1,0x6b,0x38, + 0x2,0x4e,0x3e, 0x3,0x49,0x75, 0x3,0x49,0x73, 0x1,0x6b,0x37, + 0x3,0x49,0x74, 0x2,0x54,0x5b, 0x2,0x54,0x59, 0x3,0x4f,0x26, + 0x4,0x4d,0x75, 0x1,0x6f,0x36, 0x2,0x54,0x58, 0x2,0x54,0x5a, + 0x3,0x4f,0x25, 0x1,0x6f,0x37, 0x3,0x4f,0x23, 0x2,0x5a,0x67, + 0x3,0x52,0x77, 0x2,0x5a,0x68, 0x1,0x75,0x58, 0x3,0x59,0x31, + 0x2,0x67,0x38, 0x2,0x67,0x3a, 0x2,0x67,0x37, 0x2,0x67,0x39, + 0x2,0x6a,0x24, 0x2,0x6c,0x43, 0x3,0x66,0x51, 0x2,0x71,0x5e, + 0x1,0x4b,0x4d, 0x1,0x53,0x5a, 0x2,0x33,0x29, 0x2,0x33,0x2b, + 0x2,0x33,0x2a, 0x2,0x39,0x5b, 0x1,0x5d,0x52, 0x3,0x39,0x3e, + 0x2,0x39,0x59, 0x3,0x39,0x3a, 0x1,0x5d,0x51, 0x2,0x39,0x5c, + 0x3,0x39,0x3d, 0x2,0x39,0x5d, 0x2,0x39,0x5a, 0x6,0x45,0x38, + 0x2,0x40,0x61, 0x1,0x62,0x47, 0x2,0x40,0x59, 0x2,0x40,0x5f, + 0x3,0x3f,0x3f, 0x3,0x3f,0x3a, 0x1,0x62,0x42, 0x1,0x62,0x45, + 0x2,0x40,0x58, 0x1,0x62,0x40, 0x2,0x40,0x5c, 0x2,0x47,0x72, + 0x1,0x62,0x44, 0x3,0x3f,0x3b, 0x2,0x40,0x57, 0x3,0x3f,0x3e, + 0x2,0x40,0x5d, 0x2,0x40,0x5a, 0x2,0x40,0x60, 0x2,0x40,0x56, + 0x2,0x40,0x5e, 0x1,0x62,0x43, 0x1,0x62,0x46, 0x2,0x40,0x5b, + 0x1,0x62,0x41, 0x1,0x66,0x79, 0x2,0x47,0x6e, 0x1,0x66,0x78, + 0x2,0x47,0x75, 0x2,0x47,0x74, 0x1,0x67,0x21, 0x1,0x67,0x22, + 0x2,0x47,0x76, 0x1,0x66,0x7a, 0x2,0x47,0x73, 0x1,0x66,0x7e, + 0x2,0x47,0x78, 0x2,0x47,0x6f, 0x3,0x44,0x6b, 0x2,0x47,0x71, + 0x1,0x66,0x7b, 0x2,0x47,0x6d, 0x2,0x47,0x70, 0x2,0x47,0x77, + 0x1,0x66,0x7c, 0x2,0x47,0x79, 0x1,0x66,0x7d, 0x1,0x6b,0x39, + 0x2,0x4e,0x43, 0x2,0x4e,0x49, 0x2,0x4e,0x41, 0x2,0x4e,0x4a, + 0x3,0x49,0x7b, 0x2,0x4e,0x40, 0x2,0x4e,0x45, 0x2,0x4e,0x4b, + 0x2,0x4e,0x48, 0x2,0x4e,0x47, 0x2,0x4e,0x46, 0x3,0x49,0x7a, + 0x2,0x4e,0x3f, 0x2,0x4e,0x44, 0x3,0x49,0x79, 0x2,0x4e,0x42, + 0x1,0x6f,0x3c, 0x1,0x6f,0x39, 0x2,0x54,0x64, 0x2,0x54,0x69, + 0x2,0x54,0x6b, 0x2,0x54,0x68, 0x2,0x54,0x61, 0x2,0x54,0x63, + 0x2,0x54,0x6d, 0x2,0x54,0x6a, 0x2,0x54,0x65, 0x2,0x54,0x6e, + 0x2,0x54,0x62, 0x2,0x54,0x6c, 0x1,0x6f,0x3a, 0x1,0x6f,0x40, + 0x1,0x6f,0x3e, 0x2,0x54,0x5c, 0x1,0x6f,0x3f, 0x1,0x6f,0x3b, + 0x2,0x54,0x5d, 0x2,0x54,0x5f, 0x2,0x54,0x5e, 0x2,0x54,0x66, + 0x2,0x54,0x67, 0x3,0x4f,0x2c, 0x1,0x6f,0x3d, 0x3,0x4f,0x2b, + 0x1,0x6f,0x38, 0x2,0x54,0x60, 0x2,0x5a,0x72, 0x1,0x72,0x4c, + 0x3,0x52,0x7e, 0x2,0x5a,0x69, 0x1,0x72,0x4d, 0x1,0x72,0x50, + 0x2,0x5a,0x6e, 0x5,0x51,0x48, 0x2,0x5a,0x6b, 0x1,0x72,0x4f, + 0x4,0x54,0x29, 0x3,0x52,0x7b, 0x2,0x5a,0x6f, 0x2,0x5a,0x70, + 0x2,0x5a,0x6a, 0x2,0x5a,0x73, 0x2,0x5a,0x6c, 0x2,0x5a,0x71, + 0x1,0x72,0x4e, 0x3,0x52,0x7c, 0x1,0x72,0x4b, 0x2,0x5a,0x6d, + 0x3,0x56,0x54, 0x2,0x5f,0x6b, 0x1,0x75,0x5b, 0x1,0x75,0x59, + 0x1,0x75,0x5c, 0x1,0x75,0x5a, 0x2,0x5f,0x6a, 0x2,0x5f,0x67, + 0x2,0x5f,0x66, 0x3,0x56,0x55, 0x2,0x5f,0x69, 0x4,0x59,0x2d, + 0x2,0x5f,0x68, 0x2,0x63,0x6f, 0x1,0x77,0x49, 0x2,0x63,0x66, + 0x2,0x63,0x65, 0x3,0x59,0x32, 0x1,0x77,0x44, 0x2,0x63,0x6b, + 0x2,0x63,0x6a, 0x2,0x63,0x62, 0x2,0x63,0x6d, 0x2,0x63,0x67, + 0x1,0x77,0x48, 0x2,0x63,0x64, 0x2,0x63,0x6c, 0x2,0x63,0x63, + 0x1,0x77,0x45, 0x1,0x77,0x47, 0x2,0x63,0x68, 0x1,0x77,0x46, + 0x2,0x63,0x69, 0x3,0x5b,0x3a, 0x2,0x63,0x6e, 0x2,0x67,0x3e, + 0x3,0x5b,0x39, 0x1,0x79,0x2b, 0x2,0x67,0x3b, 0x4,0x61,0x52, + 0x2,0x67,0x3f, 0x3,0x5b,0x3b, 0x4,0x61,0x4f, 0x1,0x79,0x28, + 0x2,0x67,0x3d, 0x1,0x79,0x2d, 0x3,0x5b,0x3c, 0x1,0x79,0x2a, + 0x3,0x5b,0x3d, 0x2,0x67,0x3c, 0x4,0x61,0x54, 0x1,0x79,0x2c, + 0x2,0x67,0x40, 0x1,0x79,0x27, 0x1,0x7a,0x47, 0x1,0x7a,0x49, + 0x3,0x5d,0x37, 0x2,0x6a,0x27, 0x1,0x7a,0x48, 0x2,0x6a,0x25, + 0x1,0x79,0x29, 0x2,0x6a,0x26, 0x1,0x7a,0x46, 0x1,0x7b,0x2f, + 0x1,0x7b,0x31, 0x2,0x6c,0x45, 0x1,0x7b,0x30, 0x2,0x6c,0x44, + 0x2,0x6e,0x30, 0x1,0x7b,0x77, 0x2,0x6e,0x2f, 0x1,0x7b,0x78, + 0x2,0x6e,0x2d, 0x2,0x6e,0x2c, 0x2,0x6e,0x31, 0x2,0x6e,0x32, + 0x2,0x6f,0x54, 0x3,0x60,0x4b, 0x2,0x6e,0x2e, 0x2,0x70,0x54, + 0x2,0x70,0x51, 0x2,0x70,0x52, 0x2,0x70,0x53, 0x1,0x7d,0x29, + 0x3,0x61,0x50, 0x2,0x71,0x40, 0x2,0x71,0x3f, 0x2,0x71,0x3e, + 0x2,0x71,0x5f, 0x3,0x61,0x6c, 0x2,0x72,0x2e, 0x2,0x71,0x79, + 0x1,0x7d,0x3b, 0x1,0x4b,0x4e, 0x1,0x58,0x45, 0x3,0x39,0x3f, + 0xf,0x38,0x6c, 0x3,0x39,0x40, 0x3,0x3f,0x40, 0x3,0x44,0x73, + 0x1,0x67,0x23, 0x3,0x49,0x7d, 0x3,0x49,0x7c, 0x3,0x4f,0x30, + 0x3,0x4f,0x32, 0x3,0x4f,0x2f, 0x3,0x4f,0x31, 0x1,0x6f,0x41, + 0x3,0x66,0x52, 0x2,0x5a,0x74, 0xf,0x58,0x33, 0x3,0x59,0x35, + 0x1,0x77,0x4a, 0x3,0x59,0x36, 0x2,0x67,0x41, 0x3,0x5b,0x3f, + 0x4,0x61,0x56, 0x3,0x5d,0x38, 0x4,0x67,0x51, 0x2,0x71,0x7a, + 0x1,0x4b,0x4f, 0x1,0x4f,0x51, 0x1,0x53,0x5c, 0x1,0x53,0x5b, + 0x5,0x30,0x55, 0x1,0x58,0x48, 0x3,0x34,0x21, 0x2,0x33,0x2c, + 0x1,0x58,0x46, 0x2,0x33,0x2d, 0x1,0x58,0x47, 0x3,0x66,0x53, + 0x3,0x39,0x41, 0x2,0x39,0x62, 0x2,0x39,0x5e, 0x3,0x39,0x47, + 0x4,0x35,0x63, 0x1,0x5d,0x53, 0x2,0x39,0x61, 0x2,0x39,0x60, + 0x2,0x39,0x5f, 0x1,0x5d,0x54, 0x2,0x39,0x63, 0x2,0x39,0x64, + 0x3,0x3f,0x45, 0x2,0x40,0x68, 0x2,0x40,0x66, 0x2,0x40,0x6a, + 0x2,0x40,0x6b, 0x2,0x40,0x71, 0x3,0x3f,0x47, 0x2,0x40,0x6d, + 0x2,0x40,0x6f, 0x5,0x43,0x50, 0x2,0x40,0x67, 0x2,0x40,0x62, + 0x4,0x3b,0x55, 0x2,0x40,0x6e, 0x3,0x3f,0x44, 0x3,0x3f,0x46, + 0x2,0x40,0x70, 0x2,0x40,0x69, 0x2,0x40,0x6c, 0x2,0x40,0x63, + 0x1,0x62,0x49, 0x2,0x40,0x65, 0x2,0x40,0x64, 0x1,0x62,0x48, + 0x1,0x62,0x4a, 0x3,0x3f,0x49, 0x1,0x67,0x26, 0x2,0x47,0x7b, + 0x2,0x47,0x7d, 0x2,0x47,0x7c, 0x2,0x48,0x23, 0x1,0x67,0x24, + 0x3,0x44,0x76, 0x2,0x47,0x7e, 0x2,0x47,0x7a, 0x2,0x48,0x21, + 0x2,0x48,0x22, 0x1,0x67,0x25, 0x1,0x67,0x27, 0x2,0x48,0x24, + 0x2,0x4e,0x4f, 0x2,0x4e,0x4e, 0x4,0x47,0x6a, 0x2,0x4e,0x4c, + 0x2,0x4e,0x4d, 0x1,0x6b,0x3b, 0x1,0x6b,0x3d, 0x1,0x6b,0x3a, + 0x1,0x6b,0x3c, 0x2,0x54,0x75, 0x2,0x54,0x76, 0x2,0x54,0x71, + 0x3,0x4f,0x36, 0x2,0x54,0x72, 0x1,0x6f,0x43, 0x1,0x6f,0x48, + 0x1,0x6f,0x42, 0x1,0x6f,0x49, 0x1,0x6f,0x44, 0x2,0x54,0x73, + 0x4,0x4e,0x2d, 0x3,0x4f,0x33, 0x2,0x54,0x74, 0x2,0x54,0x70, + 0x1,0x6f,0x4a, 0x1,0x6f,0x46, 0x3,0x4f,0x35, 0x4,0x4e,0x2b, + 0x1,0x6f,0x45, 0x1,0x6f,0x47, 0x3,0x4f,0x34, 0x2,0x54,0x6f, + 0x3,0x53,0x24, 0x2,0x5a,0x76, 0x1,0x72,0x52, 0x3,0x53,0x22, + 0x3,0x53,0x21, 0x2,0x5a,0x78, 0x1,0x72,0x54, 0x2,0x5a,0x7b, + 0x2,0x5a,0x77, 0x2,0x5a,0x75, 0x2,0x5a,0x7a, 0x1,0x72,0x53, + 0x2,0x5a,0x79, 0x7,0x34,0x32, 0x1,0x72,0x51, 0x3,0x53,0x25, + 0x3,0x56,0x59, 0x1,0x75,0x5e, 0x1,0x75,0x61, 0x2,0x5f,0x6d, + 0x3,0x56,0x5a, 0x1,0x75,0x5f, 0x2,0x5f,0x6c, 0x1,0x75,0x5d, + 0x1,0x75,0x60, 0x2,0x63,0x70, 0x2,0x63,0x71, 0x2,0x63,0x72, + 0x1,0x77,0x4b, 0x3,0x59,0x37, 0x2,0x63,0x73, 0x1,0x77,0x4c, + 0x1,0x79,0x2f, 0x2,0x67,0x44, 0x2,0x67,0x45, 0x2,0x67,0x43, + 0x2,0x67,0x42, 0x2,0x67,0x46, 0x1,0x79,0x2e, 0x2,0x6a,0x2b, + 0x2,0x6a,0x29, 0x2,0x6a,0x2a, 0x2,0x6a,0x2c, 0x2,0x6a,0x28, + 0x2,0x6a,0x2d, 0x2,0x6c,0x47, 0x3,0x5e,0x67, 0x2,0x6c,0x48, + 0x2,0x6c,0x46, 0x1,0x7b,0x32, 0x2,0x6e,0x33, 0x1,0x7b,0x79, + 0x2,0x6e,0x34, 0x2,0x6f,0x56, 0x2,0x6f,0x55, 0x3,0x62,0x22, + 0x1,0x4b,0x50, 0x1,0x62,0x4b, 0x3,0x3f,0x4b, 0x3,0x44,0x77, + 0x1,0x67,0x28, 0x3,0x44,0x78, 0x3,0x4a,0x21, 0x3,0x4a,0x22, + 0x1,0x6b,0x3e, 0x3,0x4f,0x37, 0x3,0x53,0x27, 0x1,0x72,0x56, + 0x3,0x53,0x26, 0x1,0x72,0x55, 0x3,0x66,0x54, 0x3,0x59,0x38, + 0x1,0x79,0x30, 0x1,0x7a,0x29, 0x1,0x7b,0x33, 0x1,0x4b,0x51, + 0x1,0x58,0x49, 0x1,0x67,0x29, 0x3,0x4f,0x39, 0x2,0x67,0x47, + 0x3,0x27,0x2f, 0x4,0x21,0x54, 0xf,0x21,0x6a, 0x4,0x23,0x30, + 0x3,0x24,0x3b, 0xf,0x22,0x71, 0xf,0x22,0x72, 0x3,0x27,0x30, + 0x2,0x25,0x26, 0x4,0x25,0x21, 0x3,0x27,0x33, 0x1,0x4b,0x52, + 0x4,0x25,0x23, 0x1,0x4b,0x55, 0x1,0x4b,0x54, 0x1,0x4b,0x53, + 0x3,0x27,0x31, 0xf,0x25,0x32, 0x2,0x25,0x25, 0x3,0x2a,0x72, + 0x2,0x28,0x6d, 0x3,0x2a,0x70, 0x2,0x28,0x6f, 0x1,0x4f,0x52, + 0x3,0x2a,0x74, 0x4,0x28,0x26, 0x1,0x4f,0x54, 0x2,0x28,0x6c, + 0x2,0x28,0x6e, 0x1,0x4f,0x53, 0x2,0x28,0x71, 0x2,0x28,0x70, + 0x2,0x28,0x72, 0x3,0x2a,0x73, 0x3,0x2a,0x71, 0xf,0x28,0x71, + 0xf,0x28,0x6e, 0x2,0x2d,0x57, 0x2,0x2d,0x55, 0x1,0x53,0x5f, + 0x2,0x2d,0x54, 0x1,0x53,0x64, 0x1,0x53,0x61, 0x1,0x53,0x5e, + 0x3,0x2f,0x31, 0x1,0x53,0x65, 0x3,0x2f,0x32, 0x1,0x53,0x60, + 0x1,0x53,0x63, 0x6,0x34,0x60, 0x1,0x53,0x62, 0x2,0x2d,0x56, + 0x3,0x2f,0x33, 0x1,0x53,0x5d, 0x3,0x2f,0x30, 0x1,0x58,0x4f, + 0x2,0x33,0x2f, 0x2,0x33,0x35, 0x1,0x58,0x4c, 0x1,0x58,0x53, + 0x3,0x34,0x25, 0x1,0x58,0x4e, 0x2,0x33,0x32, 0x2,0x33,0x34, + 0x1,0x58,0x51, 0x2,0x33,0x2e, 0x2,0x33,0x31, 0x1,0x58,0x4d, + 0x1,0x58,0x4a, 0x2,0x33,0x30, 0x1,0x58,0x50, 0x2,0x33,0x33, + 0x1,0x58,0x52, 0x1,0x58,0x4b, 0x4,0x30,0x2f, 0x3,0x34,0x27, + 0x3,0x34,0x26, 0x2,0x39,0x66, 0x2,0x39,0x69, 0x1,0x5d,0x56, + 0x3,0x39,0x4b, 0x1,0x5d,0x60, 0x1,0x5d,0x5c, 0x2,0x39,0x67, + 0x3,0x39,0x4a, 0x3,0x39,0x4e, 0x1,0x5d,0x64, 0x1,0x5d,0x5d, + 0x1,0x5d,0x62, 0x1,0x5d,0x58, 0x4,0x35,0x68, 0x1,0x5d,0x55, + 0x1,0x5d,0x57, 0x1,0x5d,0x63, 0x2,0x39,0x68, 0x1,0x5d,0x5b, + 0x1,0x5d,0x5e, 0x1,0x5d,0x5a, 0x1,0x5d,0x5f, 0x2,0x39,0x6a, + 0x1,0x5d,0x61, 0x1,0x5d,0x59, 0x2,0x39,0x65, 0x3,0x39,0x4c, + 0x3,0x3f,0x4f, 0x3,0x3f,0x50, 0x3,0x3f,0x4d, 0x3,0x3f,0x4c, + 0x3,0x3f,0x51, 0x2,0x40,0x72, 0x1,0x62,0x4c, 0x2,0x40,0x74, + 0x3,0x3f,0x55, 0x1,0x62,0x4e, 0x1,0x62,0x50, 0x4,0x35,0x66, + 0x2,0x40,0x73, 0x1,0x62,0x4d, 0x1,0x62,0x51, 0x3,0x3f,0x56, + 0x1,0x62,0x4f, 0x3,0x3f,0x54, 0x3,0x3f,0x57, 0x1,0x67,0x2f, + 0x2,0x48,0x29, 0x1,0x67,0x37, 0x2,0x48,0x26, 0x3,0x44,0x7d, + 0x1,0x67,0x38, 0x1,0x67,0x2d, 0x3,0x44,0x79, 0x2,0x48,0x27, + 0x3,0x44,0x7c, 0x3,0x44,0x7a, 0x1,0x67,0x32, 0x3,0x44,0x7b, + 0x2,0x48,0x28, 0x1,0x67,0x2b, 0x1,0x67,0x2a, 0x3,0x44,0x7e, + 0x1,0x67,0x35, 0x1,0x67,0x34, 0x1,0x67,0x33, 0x1,0x67,0x31, + 0x1,0x67,0x36, 0x2,0x48,0x25, 0x1,0x67,0x2c, 0x1,0x67,0x2e, + 0x1,0x67,0x30, 0x1,0x6b,0x40, 0x1,0x6b,0x43, 0x3,0x4a,0x24, + 0x1,0x6b,0x47, 0x1,0x6b,0x41, 0x1,0x6b,0x46, 0x1,0x6b,0x44, + 0x3,0x4a,0x27, 0x1,0x6b,0x3f, 0x3,0x4a,0x26, 0x1,0x6b,0x45, + 0x1,0x6b,0x42, 0xf,0x4c,0x6b, 0x4,0x4e,0x32, 0x2,0x54,0x7a, + 0x1,0x6f,0x4d, 0x1,0x6f,0x4b, 0x3,0x4f,0x3c, 0x2,0x54,0x7b, + 0x4,0x4e,0x33, 0x1,0x6f,0x4e, 0x1,0x6f,0x4c, 0x2,0x54,0x79, + 0x2,0x54,0x78, 0x3,0x4f,0x3b, 0x1,0x72,0x5a, 0x2,0x54,0x77, + 0x1,0x72,0x58, 0x1,0x72,0x57, 0x2,0x5a,0x7c, 0x1,0x6f,0x4f, + 0x1,0x72,0x59, 0x2,0x5a,0x7d, 0x1,0x72,0x5c, 0x2,0x5a,0x7e, + 0x1,0x72,0x5b, 0x1,0x75,0x63, 0x2,0x5f,0x6f, 0x1,0x75,0x62, + 0x1,0x75,0x67, 0x1,0x75,0x65, 0x1,0x75,0x66, 0x1,0x77,0x4e, + 0x1,0x75,0x64, 0x2,0x5f,0x6e, 0x2,0x5b,0x21, 0x1,0x77,0x4d, + 0x1,0x77,0x4f, 0x3,0x59,0x3a, 0x1,0x79,0x31, 0x1,0x79,0x32, + 0x4,0x61,0x5f, 0x2,0x6a,0x2e, 0x4,0x69,0x52, 0x1,0x7c,0x4a, + 0x1,0x7c,0x49, 0x1,0x4b,0x57, 0x3,0x22,0x5e, 0x3,0x22,0x5d, + 0x2,0x22,0x75, 0x1,0x58,0x54, 0x3,0x24,0x3c, 0x2,0x22,0x72, + 0x2,0x22,0x73, 0x2,0x22,0x71, 0x3,0x24,0x3d, 0x2,0x22,0x74, + 0x3,0x66,0x55, 0x2,0x25,0x2a, 0x2,0x25,0x27, 0x2,0x25,0x2c, + 0x2,0x25,0x28, 0x1,0x4b,0x58, 0x1,0x4b,0x5b, 0x3,0x27,0x35, + 0x2,0x25,0x29, 0x1,0x4b,0x5a, 0x2,0x25,0x2b, 0x3,0x27,0x39, + 0x3,0x27,0x34, 0x1,0x4b,0x59, 0x3,0x39,0x51, 0x3,0x2a,0x77, + 0x4,0x28,0x2b, 0x2,0x28,0x75, 0x2,0x28,0x77, 0x1,0x4f,0x57, + 0x2,0x28,0x73, 0x2,0x28,0x76, 0x2,0x28,0x74, 0x1,0x4f,0x55, + 0x1,0x4f,0x58, 0x3,0x2a,0x75, 0x1,0x4f,0x56, 0x3,0x2a,0x78, + 0x3,0x2f,0x35, 0x2,0x2d,0x59, 0x2,0x2d,0x5d, 0x2,0x2d,0x5a, + 0x3,0x2f,0x38, 0x1,0x53,0x68, 0x3,0x2f,0x34, 0x1,0x53,0x69, + 0x3,0x2f,0x3e, 0x2,0x2d,0x5c, 0x3,0x2f,0x37, 0x2,0x2d,0x5e, + 0x2,0x2d,0x60, 0x3,0x2f,0x3c, 0x1,0x53,0x66, 0x2,0x2d,0x5f, + 0x4,0x41,0x39, 0x3,0x2f,0x3b, 0x1,0x53,0x67, 0xf,0x45,0x6d, + 0x2,0x39,0x71, 0x2,0x2d,0x5b, 0x2,0x33,0x36, 0x2,0x33,0x3f, + 0x2,0x33,0x3d, 0x2,0x33,0x38, 0x2,0x33,0x39, 0x2,0x33,0x3e, + 0x2,0x33,0x40, 0x1,0x58,0x56, 0x3,0x34,0x29, 0x2,0x33,0x3b, + 0x2,0x33,0x37, 0x1,0x58,0x55, 0x1,0x58,0x57, 0x2,0x33,0x3a, + 0x2,0x33,0x41, 0x2,0x33,0x3c, 0x1,0x5d,0x65, 0x2,0x39,0x74, + 0x2,0x39,0x6c, 0x2,0x39,0x72, 0x2,0x39,0x73, 0x1,0x5d,0x66, + 0x3,0x39,0x4f, 0x2,0x39,0x6b, 0x2,0x39,0x6d, 0x2,0x2d,0x58, + 0x2,0x39,0x6f, 0x2,0x39,0x70, 0x2,0x39,0x6e, 0x1,0x62,0x53, + 0x4,0x4e,0x3b, 0x3,0x39,0x52, 0x2,0x40,0x7b, 0x2,0x5b,0x22, + 0x2,0x40,0x7c, 0x2,0x40,0x79, 0x1,0x5d,0x67, 0x1,0x62,0x55, + 0x2,0x40,0x78, 0x2,0x40,0x7e, 0x2,0x40,0x7d, 0x1,0x62,0x52, + 0x2,0x41,0x23, 0x2,0x40,0x77, 0x2,0x41,0x22, 0x2,0x40,0x75, + 0x2,0x41,0x21, 0x2,0x40,0x7a, 0x1,0x62,0x54, 0x3,0x3f,0x59, + 0x2,0x48,0x30, 0x3,0x45,0x23, 0x2,0x48,0x2b, 0x2,0x48,0x31, + 0x2,0x48,0x2c, 0x2,0x48,0x2a, 0x2,0x48,0x2d, 0x1,0x67,0x39, + 0x3,0x45,0x24, 0x2,0x48,0x2f, 0x3,0x45,0x25, 0x2,0x48,0x2e, + 0x1,0x67,0x3a, 0x1,0x6b,0x49, 0x1,0x6b,0x48, 0x2,0x4e,0x56, + 0x2,0x4e,0x59, 0x2,0x4e,0x51, 0x2,0x4e,0x55, 0x1,0x6b,0x4a, + 0x2,0x4e,0x54, 0x2,0x4e,0x52, 0x2,0x4e,0x58, 0x2,0x4e,0x53, + 0x2,0x4e,0x50, 0x2,0x4e,0x57, 0x3,0x4a,0x2a, 0x2,0x55,0x23, + 0x1,0x6f,0x52, 0x2,0x63,0x74, 0x2,0x54,0x7e, 0x2,0x55,0x21, + 0x2,0x54,0x7d, 0x2,0x40,0x76, 0x1,0x6f,0x51, 0x2,0x55,0x24, + 0x2,0x54,0x7c, 0x1,0x6f,0x50, 0x1,0x6f,0x53, 0x2,0x55,0x22, + 0x2,0x5b,0x23, 0x1,0x72,0x5d, 0x2,0x5b,0x24, 0x2,0x5b,0x25, + 0x3,0x53,0x2b, 0x2,0x5f,0x70, 0x1,0x75,0x68, 0x2,0x63,0x75, + 0x2,0x63,0x76, 0x3,0x59,0x3c, 0x3,0x59,0x3b, 0x2,0x63,0x77, + 0x2,0x67,0x49, 0x2,0x67,0x48, 0x2,0x6a,0x30, 0x2,0x6a,0x2f, + 0x2,0x6c,0x4a, 0x2,0x6c,0x4b, 0x2,0x6c,0x49, 0x2,0x6e,0x35, + 0x1,0x7b,0x7a, 0x1,0x4b,0x5c, 0x1,0x53,0x6b, 0x1,0x53,0x6a, + 0x1,0x58,0x5a, 0x1,0x58,0x59, 0x2,0x33,0x43, 0x2,0x33,0x44, + 0x2,0x33,0x42, 0x3,0x34,0x2a, 0x1,0x58,0x58, 0x2,0x39,0x78, + 0x3,0x39,0x55, 0x2,0x39,0x79, 0x2,0x39,0x75, 0x1,0x5d,0x68, + 0x2,0x39,0x76, 0x3,0x39,0x54, 0x2,0x39,0x77, 0x3,0x66,0x57, + 0x2,0x41,0x26, 0x2,0x41,0x28, 0x2,0x41,0x24, 0x2,0x41,0x27, + 0x1,0x62,0x56, 0x2,0x41,0x25, 0x1,0x62,0x57, 0x3,0x45,0x28, + 0x2,0x42,0x79, 0x1,0x67,0x3d, 0x1,0x67,0x3c, 0x3,0x45,0x27, + 0x1,0x67,0x3b, 0x4,0x41,0x3a, 0x2,0x48,0x32, 0x2,0x48,0x33, + 0x4,0x41,0x3b, 0x2,0x4e,0x5b, 0x2,0x4e,0x5d, 0x1,0x6b,0x4e, + 0x1,0x6b,0x4b, 0x3,0x4a,0x2c, 0x1,0x6b,0x4d, 0x1,0x6b,0x4c, + 0x2,0x4e,0x5c, 0x2,0x4e,0x5a, 0x3,0x4a,0x2b, 0x3,0x4a,0x2d, + 0x2,0x55,0x2b, 0x2,0x55,0x28, 0x2,0x55,0x29, 0x1,0x6f,0x57, + 0x2,0x55,0x2a, 0x2,0x55,0x25, 0x2,0x55,0x26, 0x1,0x6f,0x54, + 0x3,0x4f,0x3f, 0x1,0x6f,0x55, 0x2,0x55,0x27, 0x1,0x6f,0x56, + 0x3,0x4f,0x40, 0x2,0x5b,0x29, 0x3,0x53,0x2d, 0x2,0x5b,0x2a, + 0x2,0x5b,0x27, 0x2,0x5b,0x28, 0x1,0x72,0x5e, 0x2,0x5b,0x26, + 0x4,0x54,0x42, 0x3,0x53,0x2c, 0x3,0x53,0x2f, 0x4,0x59,0x3f, + 0x2,0x5f,0x74, 0x2,0x5f,0x71, 0x2,0x5f,0x73, 0x1,0x75,0x6b, + 0x2,0x5f,0x77, 0x1,0x75,0x6a, 0x2,0x5f,0x75, 0x2,0x5f,0x78, + 0x2,0x5f,0x76, 0x2,0x5f,0x72, 0x1,0x75,0x69, 0x2,0x63,0x79, + 0x4,0x5e,0x24, 0x2,0x63,0x7a, 0x2,0x63,0x78, 0x3,0x59,0x3d, + 0x2,0x63,0x7c, 0x1,0x77,0x50, 0x1,0x77,0x51, 0x2,0x67,0x4b, + 0x1,0x79,0x34, 0x2,0x63,0x7b, 0x2,0x67,0x4a, 0x1,0x79,0x33, + 0x2,0x6a,0x33, 0x2,0x6a,0x34, 0x1,0x7a,0x4a, 0x2,0x6a,0x32, + 0x4,0x64,0x65, 0x2,0x6a,0x31, 0x2,0x6c,0x4c, 0x1,0x7b,0x34, + 0x3,0x5e,0x68, 0x2,0x6f,0x57, 0x2,0x70,0x56, 0x2,0x70,0x55, + 0x3,0x60,0x7e, 0x1,0x7c,0x6e, 0x1,0x7d,0x2a, 0x2,0x70,0x57, + 0x2,0x71,0x60, 0x3,0x61,0x6d, 0x1,0x7d,0x3c, 0x1,0x4b,0x5d, + 0x1,0x4f,0x59, 0x1,0x67,0x3e, 0x1,0x7a,0x4b, 0x1,0x4b,0x5e, + 0x1,0x53,0x6c, 0x1,0x5d,0x69, 0x1,0x62,0x58, 0x1,0x77,0x52, + 0x1,0x4f,0x5a, 0x2,0x2d,0x62, 0x2,0x2d,0x61, 0x2,0x33,0x45, + 0x3,0x34,0x30, 0x1,0x58,0x5d, 0x1,0x58,0x5b, 0x1,0x58,0x5f, + 0x2,0x33,0x47, 0x3,0x34,0x2d, 0x1,0x58,0x5e, 0x1,0x58,0x5c, + 0x3,0x34,0x2f, 0x3,0x34,0x2e, 0x3,0x34,0x31, 0x2,0x33,0x46, + 0x1,0x5d,0x6c, 0x2,0x3a,0x21, 0x3,0x39,0x58, 0x1,0x5d,0x6b, + 0x1,0x5d,0x6d, 0x2,0x3a,0x26, 0x1,0x5d,0x6f, 0x2,0x3a,0x23, + 0x2,0x3a,0x24, 0x2,0x39,0x7a, 0x1,0x5d,0x6e, 0x2,0x3a,0x27, + 0x4,0x35,0x7b, 0x3,0x39,0x57, 0x2,0x39,0x7c, 0x3,0x39,0x56, + 0x2,0x39,0x7d, 0x2,0x39,0x7b, 0x1,0x5d,0x6a, 0x3,0x39,0x59, + 0x2,0x3a,0x25, 0x2,0x39,0x7e, 0x2,0x3a,0x22, 0x2,0x41,0x34, + 0x3,0x3f,0x5d, 0x2,0x41,0x33, 0x2,0x41,0x31, 0x2,0x41,0x29, + 0x2,0x41,0x38, 0x2,0x41,0x2c, 0x2,0x41,0x36, 0x2,0x41,0x3d, + 0x2,0x41,0x35, 0x1,0x62,0x60, 0x3,0x3f,0x66, 0x1,0x62,0x5c, + 0x2,0x41,0x2a, 0x3,0x3f,0x60, 0x2,0x41,0x30, 0x1,0x62,0x5e, + 0x3,0x3f,0x68, 0x2,0x41,0x2f, 0x1,0x62,0x5f, 0x1,0x62,0x61, + 0x2,0x41,0x32, 0x3,0x3f,0x69, 0x1,0x62,0x59, 0x1,0x62,0x5a, + 0x2,0x41,0x3e, 0x2,0x41,0x3c, 0x3,0x3f,0x62, 0x2,0x41,0x3b, + 0x2,0x41,0x2d, 0x3,0x3f,0x65, 0x2,0x41,0x39, 0x4,0x3b,0x66, + 0x1,0x62,0x5d, 0x6,0x4f,0x6f, 0x3,0x3f,0x5e, 0x3,0x66,0x59, + 0x3,0x3f,0x63, 0x1,0x62,0x5b, 0x2,0x41,0x3a, 0x2,0x41,0x2b, + 0x2,0x41,0x2e, 0x2,0x41,0x37, 0x3,0x66,0x58, 0x2,0x4f,0x22, + 0x2,0x48,0x3d, 0x3,0x45,0x2e, 0x2,0x48,0x36, 0x2,0x48,0x49, + 0x2,0x48,0x52, 0x2,0x48,0x39, 0x1,0x67,0x49, 0x3,0x45,0x2b, + 0x2,0x48,0x46, 0x1,0x67,0x3f, 0x1,0x67,0x41, 0x1,0x67,0x4d, + 0x2,0x48,0x37, 0x3,0x45,0x37, 0x3,0x45,0x2f, 0x1,0x67,0x42, + 0x1,0x67,0x44, 0x1,0x67,0x4e, 0x1,0x67,0x43, 0x3,0x45,0x39, + 0x4,0x41,0x41, 0x4,0x41,0x46, 0x3,0x45,0x38, 0x1,0x67,0x4c, + 0x2,0x48,0x3f, 0x4,0x41,0x48, 0x2,0x48,0x34, 0x1,0x67,0x4a, + 0x2,0x48,0x3e, 0x1,0x67,0x46, 0x2,0x48,0x50, 0x1,0x67,0x4b, + 0x2,0x48,0x4e, 0x2,0x48,0x42, 0x2,0x48,0x4c, 0x1,0x67,0x48, + 0x2,0x48,0x35, 0x2,0x48,0x4f, 0x2,0x48,0x4a, 0x3,0x45,0x2a, + 0x2,0x48,0x51, 0x1,0x67,0x40, 0x4,0x41,0x40, 0x3,0x45,0x2d, + 0x1,0x67,0x4f, 0x1,0x67,0x45, 0x3,0x45,0x31, 0x3,0x45,0x29, + 0x2,0x48,0x3b, 0x3,0x45,0x34, 0x2,0x48,0x43, 0x2,0x48,0x47, + 0x3,0x45,0x33, 0x2,0x48,0x4b, 0x1,0x67,0x47, 0x2,0x48,0x3a, + 0x2,0x48,0x38, 0x2,0x48,0x44, 0x4,0x41,0x42, 0x4,0x41,0x43, + 0x3,0x45,0x32, 0x3,0x45,0x35, 0x2,0x48,0x41, 0x2,0x48,0x40, + 0x3,0x45,0x36, 0x2,0x48,0x45, 0x2,0x48,0x48, 0x2,0x48,0x4d, + 0x3,0x66,0x5a, 0xf,0x45,0x72, 0x4,0x47,0x75, 0x2,0x4e,0x60, + 0xf,0x4d,0x22, 0x1,0x6b,0x4f, 0x2,0x4e,0x6a, 0x2,0x4e,0x62, + 0x1,0x6b,0x55, 0x1,0x6b,0x59, 0x2,0x4e,0x73, 0x2,0x4e,0x7b, + 0x2,0x4e,0x6c, 0x1,0x6b,0x51, 0x3,0x4a,0x34, 0x2,0x4e,0x70, + 0x2,0x48,0x3c, 0x3,0x4a,0x35, 0x1,0x6b,0x52, 0x2,0x4e,0x77, + 0x2,0x4e,0x7c, 0x2,0x4e,0x74, 0x3,0x4a,0x2f, 0x2,0x4e,0x76, + 0x2,0x4f,0x21, 0x2,0x4e,0x78, 0x2,0x4e,0x66, 0x2,0x4e,0x6f, + 0x3,0x45,0x30, 0x3,0x4a,0x38, 0x1,0x6b,0x5a, 0x3,0x4a,0x33, + 0x1,0x6b,0x56, 0x2,0x4e,0x64, 0x2,0x4e,0x71, 0x1,0x6b,0x54, + 0x2,0x4e,0x6b, 0x1,0x6b,0x53, 0x2,0x4e,0x79, 0x2,0x4e,0x68, + 0x2,0x4e,0x61, 0x1,0x6b,0x57, 0x2,0x4e,0x7e, 0x3,0x4a,0x39, + 0x4,0x47,0x77, 0x2,0x4e,0x63, 0x2,0x4e,0x75, 0x2,0x4e,0x72, + 0x2,0x4e,0x6d, 0x2,0x4e,0x5f, 0x2,0x4e,0x5e, 0x2,0x4e,0x67, + 0x2,0x4e,0x7a, 0x1,0x6b,0x58, 0x2,0x4e,0x7d, 0x2,0x4e,0x65, + 0x2,0x4e,0x69, 0x1,0x6b,0x50, 0x3,0x4a,0x32, 0x3,0x4a,0x37, + 0xf,0x4d,0x27, 0x3,0x67,0x2a, 0x3,0x4a,0x31, 0x1,0x6f,0x63, + 0x1,0x6f,0x5e, 0x2,0x55,0x4d, 0x2,0x55,0x49, 0x2,0x55,0x31, + 0x1,0x6f,0x5a, 0x3,0x4f,0x42, 0x3,0x4f,0x50, 0x4,0x4e,0x45, + 0x1,0x6f,0x59, 0x1,0x6f,0x5f, 0x4,0x4e,0x47, 0x3,0x4f,0x43, + 0x3,0x4f,0x41, 0x2,0x55,0x2f, 0x1,0x6f,0x5d, 0x2,0x55,0x3b, + 0x2,0x55,0x2d, 0x2,0x55,0x2e, 0x1,0x6f,0x58, 0x2,0x55,0x4c, + 0x1,0x6f,0x61, 0x2,0x55,0x3e, 0x2,0x55,0x43, 0x2,0x55,0x3d, + 0x2,0x5b,0x3c, 0x2,0x55,0x39, 0x2,0x55,0x41, 0x2,0x55,0x3f, + 0x2,0x55,0x32, 0x2,0x55,0x2c, 0x2,0x55,0x47, 0x1,0x6f,0x60, + 0x2,0x55,0x48, 0x3,0x4f,0x48, 0x2,0x55,0x42, 0x3,0x4f,0x49, + 0x2,0x55,0x37, 0x2,0x55,0x35, 0x2,0x55,0x30, 0x3,0x4f,0x4b, + 0x3,0x4f,0x4e, 0x3,0x4f,0x44, 0x2,0x55,0x38, 0x2,0x55,0x45, + 0x2,0x55,0x34, 0x2,0x55,0x44, 0x2,0x55,0x4a, 0x3,0x4f,0x51, + 0x4,0x4e,0x46, 0x1,0x6f,0x5c, 0x3,0x4f,0x45, 0x2,0x55,0x40, + 0x2,0x55,0x46, 0x2,0x55,0x3c, 0x2,0x55,0x36, 0x1,0x6f,0x5b, + 0x3,0x4f,0x52, 0x4,0x4e,0x44, 0x3,0x4f,0x4c, 0x2,0x4e,0x6e, + 0x2,0x55,0x3a, 0x1,0x6f,0x62, 0x2,0x55,0x33, 0xf,0x52,0x6b, + 0x3,0x4f,0x4d, 0x3,0x66,0x5b, 0x3,0x66,0x5c, 0x3,0x4a,0x30, + 0x2,0x5b,0x41, 0x1,0x72,0x61, 0x2,0x5b,0x40, 0x2,0x5b,0x3e, + 0x2,0x5b,0x50, 0x1,0x72,0x65, 0x3,0x53,0x35, 0x2,0x5b,0x4d, + 0x2,0x5b,0x45, 0x2,0x5b,0x4f, 0x2,0x5b,0x37, 0x2,0x5b,0x43, + 0x3,0x53,0x3d, 0x1,0x72,0x67, 0x3,0x53,0x3e, 0x2,0x5b,0x2f, + 0x3,0x53,0x38, 0x2,0x5b,0x2d, 0x2,0x5b,0x4e, 0x3,0x53,0x32, + 0x2,0x5b,0x4c, 0x2,0x5b,0x4b, 0x2,0x5b,0x3b, 0x2,0x5b,0x3a, + 0x2,0x5b,0x30, 0x1,0x72,0x69, 0x4,0x54,0x43, 0x2,0x5b,0x36, + 0x2,0x5b,0x3f, 0x2,0x5b,0x4a, 0x1,0x72,0x6c, 0x2,0x5b,0x51, + 0x3,0x53,0x36, 0x1,0x75,0x73, 0x1,0x72,0x6e, 0x1,0x72,0x68, + 0x2,0x5b,0x34, 0x3,0x53,0x37, 0x2,0x5b,0x3d, 0x2,0x5b,0x2c, + 0x2,0x5b,0x2e, 0x1,0x72,0x5f, 0x1,0x72,0x6b, 0x1,0x72,0x64, + 0x2,0x5b,0x35, 0x2,0x5b,0x44, 0x2,0x55,0x4b, 0x1,0x72,0x6a, + 0x2,0x5b,0x2b, 0x1,0x75,0x6e, 0x2,0x5b,0x46, 0x2,0x5b,0x49, + 0x1,0x72,0x66, 0x3,0x53,0x3b, 0x2,0x5b,0x39, 0x1,0x72,0x6d, + 0x1,0x72,0x63, 0x3,0x53,0x3c, 0x3,0x53,0x39, 0x3,0x53,0x3a, + 0x1,0x72,0x62, 0x2,0x5b,0x42, 0x2,0x5b,0x48, 0x1,0x72,0x60, + 0x4,0x54,0x45, 0x2,0x5b,0x32, 0x2,0x5b,0x47, 0xf,0x58,0x59, + 0xf,0x58,0x48, 0x2,0x5b,0x33, 0x7,0x34,0x63, 0x3,0x66,0x5d, + 0xf,0x58,0x55, 0x3,0x66,0x5e, 0x4,0x54,0x49, 0x3,0x53,0x31, + 0x2,0x5b,0x38, 0x2,0x5f,0x7e, 0x3,0x56,0x65, 0x2,0x60,0x25, + 0x1,0x75,0x70, 0x1,0x75,0x72, 0x2,0x60,0x2b, 0x1,0x75,0x6c, + 0x2,0x60,0x39, 0x2,0x60,0x31, 0x2,0x60,0x26, 0x2,0x60,0x27, + 0x2,0x60,0x30, 0x3,0x56,0x66, 0x1,0x75,0x79, 0x2,0x60,0x2f, + 0x2,0x5f,0x7d, 0x2,0x60,0x2e, 0x2,0x60,0x22, 0x2,0x60,0x3a, + 0x1,0x75,0x78, 0x1,0x75,0x76, 0x2,0x60,0x23, 0x3,0x56,0x5d, + 0x2,0x60,0x36, 0x3,0x56,0x67, 0x2,0x60,0x28, 0x2,0x60,0x35, + 0x3,0x56,0x64, 0x2,0x60,0x37, 0x2,0x5f,0x7c, 0x1,0x75,0x71, + 0x3,0x56,0x5b, 0x2,0x60,0x38, 0x3,0x56,0x68, 0x3,0x56,0x5e, + 0x2,0x60,0x2c, 0x3,0x56,0x6b, 0x1,0x75,0x75, 0x2,0x60,0x29, + 0x3,0x56,0x61, 0x4,0x59,0x49, 0x1,0x75,0x77, 0x2,0x60,0x32, + 0x3,0x56,0x62, 0x3,0x56,0x63, 0x3,0x56,0x5f, 0x1,0x75,0x6f, + 0x2,0x60,0x24, 0x2,0x60,0x33, 0x3,0x56,0x5c, 0x2,0x60,0x2d, + 0x2,0x5b,0x31, 0x2,0x60,0x34, 0x2,0x60,0x21, 0x3,0x56,0x60, + 0x1,0x75,0x74, 0x3,0x56,0x6a, 0x2,0x64,0x2f, 0x4,0x59,0x47, + 0x1,0x75,0x6d, 0x2,0x5f,0x7a, 0x4,0x59,0x46, 0xf,0x5d,0x41, + 0x3,0x66,0x5f, 0xf,0x5d,0x39, 0x2,0x64,0x2c, 0x2,0x64,0x25, + 0x1,0x77,0x54, 0x3,0x59,0x43, 0x2,0x63,0x7e, 0x2,0x64,0x30, + 0x2,0x64,0x27, 0x2,0x60,0x2a, 0x3,0x59,0x40, 0x2,0x64,0x32, + 0x2,0x64,0x21, 0x3,0x59,0x42, 0x1,0x77,0x53, 0x2,0x64,0x2b, + 0x1,0x77,0x55, 0x1,0x77,0x5d, 0x1,0x77,0x5b, 0x2,0x64,0x2d, + 0x1,0x77,0x5c, 0x2,0x64,0x23, 0x3,0x59,0x49, 0x2,0x64,0x24, + 0x2,0x64,0x29, 0x2,0x64,0x2e, 0x3,0x59,0x3e, 0x2,0x5f,0x79, + 0x1,0x77,0x56, 0x2,0x64,0x37, 0x2,0x64,0x34, 0x2,0x67,0x61, + 0x2,0x64,0x2a, 0x2,0x64,0x26, 0x2,0x64,0x35, 0x2,0x67,0x56, + 0x2,0x64,0x28, 0x4,0x5e,0x31, 0x1,0x77,0x59, 0x3,0x59,0x44, + 0x1,0x77,0x58, 0x2,0x5f,0x7b, 0x1,0x77,0x5a, 0x2,0x64,0x31, + 0x2,0x64,0x33, 0x1,0x77,0x57, 0x2,0x64,0x36, 0x2,0x63,0x7d, + 0x4,0x5e,0x29, 0x2,0x64,0x22, 0x3,0x59,0x46, 0xf,0x61,0x33, + 0x3,0x59,0x45, 0x3,0x66,0x61, 0x3,0x66,0x62, 0x3,0x66,0x60, + 0xf,0x61,0x43, 0x2,0x67,0x5f, 0x3,0x5b,0x50, 0x2,0x67,0x4f, + 0x1,0x79,0x38, 0x2,0x67,0x5d, 0x3,0x5b,0x44, 0x3,0x5b,0x45, + 0x2,0x67,0x4d, 0x1,0x79,0x39, 0x4,0x61,0x67, 0x2,0x67,0x58, + 0x3,0x5b,0x43, 0x2,0x67,0x54, 0x1,0x79,0x3e, 0x2,0x67,0x5e, + 0x2,0x67,0x4e, 0x2,0x67,0x51, 0x1,0x79,0x36, 0x2,0x67,0x60, + 0x3,0x5b,0x48, 0x2,0x67,0x59, 0x2,0x67,0x5c, 0x1,0x79,0x3c, + 0x1,0x79,0x41, 0x1,0x79,0x3f, 0x2,0x67,0x55, 0x2,0x67,0x50, + 0x3,0x5b,0x4d, 0x1,0x79,0x3a, 0x1,0x79,0x3b, 0x2,0x67,0x4c, + 0x1,0x79,0x37, 0x3,0x5b,0x4f, 0x1,0x79,0x35, 0x1,0x79,0x3d, + 0x2,0x67,0x5b, 0x1,0x79,0x40, 0x3,0x5b,0x4a, 0x2,0x67,0x57, + 0x2,0x67,0x62, 0x1,0x79,0x42, 0x3,0x5b,0x41, 0x3,0x5b,0x42, + 0x3,0x5b,0x4e, 0x2,0x67,0x53, 0x3,0x5b,0x47, 0x2,0x67,0x5a, + 0x3,0x66,0x65, 0x3,0x66,0x63, 0x3,0x66,0x64, 0x3,0x5d,0x41, + 0x3,0x5e,0x6a, 0x2,0x6a,0x41, 0x2,0x6a,0x50, 0x2,0x6a,0x43, + 0x2,0x6a,0x4a, 0x2,0x67,0x52, 0x2,0x6a,0x48, 0x2,0x6a,0x37, + 0x2,0x6a,0x4e, 0x1,0x7a,0x4e, 0x2,0x6a,0x3b, 0x2,0x6a,0x4d, + 0x2,0x6a,0x42, 0x4,0x64,0x67, 0x3,0x5d,0x43, 0x1,0x7a,0x4d, + 0x3,0x5d,0x3c, 0x3,0x5d,0x3f, 0x2,0x6a,0x52, 0x2,0x6a,0x44, + 0x3,0x5d,0x3e, 0x2,0x6a,0x49, 0x2,0x6a,0x4c, 0x2,0x6a,0x35, + 0x2,0x6a,0x4f, 0x2,0x6a,0x40, 0x2,0x6a,0x45, 0x2,0x6a,0x39, + 0x2,0x6a,0x3d, 0x2,0x6a,0x51, 0x2,0x6a,0x47, 0x2,0x6a,0x36, + 0x2,0x6a,0x3a, 0x2,0x6a,0x3c, 0x2,0x6a,0x46, 0x3,0x5d,0x3d, + 0x1,0x7a,0x4c, 0x2,0x6a,0x3f, 0x3,0x5d,0x44, 0x3,0x5d,0x45, + 0x3,0x5d,0x47, 0x4,0x64,0x6b, 0x3,0x5d,0x42, 0x3,0x5d,0x3a, + 0x2,0x6a,0x38, 0x3,0x66,0x66, 0x3,0x66,0x67, 0x3,0x66,0x68, + 0xf,0x66,0x57, 0x3,0x5d,0x46, 0x2,0x6a,0x3e, 0x2,0x6c,0x50, + 0x2,0x6c,0x54, 0x1,0x7b,0x3b, 0x2,0x6c,0x56, 0x3,0x5e,0x6d, + 0x1,0x7b,0x35, 0x4,0x64,0x6f, 0x2,0x6c,0x52, 0x2,0x6c,0x58, + 0x1,0x7b,0x3a, 0x1,0x7b,0x36, 0x4,0x67,0x5c, 0x1,0x7b,0x37, + 0x2,0x6c,0x4f, 0x2,0x6c,0x55, 0x1,0x7b,0x39, 0x2,0x6c,0x53, + 0x1,0x7b,0x38, 0x2,0x6c,0x4e, 0x2,0x6a,0x4b, 0x2,0x6c,0x51, + 0x4,0x67,0x62, 0x2,0x6c,0x4d, 0x2,0x6c,0x57, 0x3,0x5f,0x69, + 0x3,0x5f,0x6e, 0x1,0x7b,0x7b, 0x2,0x6e,0x3c, 0x2,0x6e,0x3f, + 0x2,0x6e,0x3b, 0x2,0x6e,0x3d, 0x2,0x6e,0x3e, 0x2,0x6e,0x38, + 0x2,0x6e,0x39, 0x2,0x6e,0x36, 0x3,0x5f,0x6a, 0x3,0x5f,0x6c, + 0x2,0x6e,0x3a, 0x2,0x6e,0x37, 0x1,0x7b,0x7c, 0x1,0x7b,0x7d, + 0x3,0x5f,0x6b, 0x2,0x6f,0x59, 0x3,0x60,0x52, 0x2,0x6f,0x5b, + 0x4,0x6b,0x29, 0x5,0x76,0x5d, 0x3,0x60,0x55, 0x3,0x60,0x54, + 0x3,0x60,0x56, 0x2,0x6f,0x5a, 0x2,0x6f,0x5c, 0x3,0x60,0x4f, + 0x1,0x7c,0x4c, 0x3,0x60,0x53, 0x2,0x6f,0x58, 0x1,0x7c,0x4b, + 0x1,0x7c,0x4d, 0x3,0x60,0x57, 0x3,0x66,0x6a, 0x3,0x66,0x69, + 0x2,0x70,0x59, 0x2,0x70,0x5a, 0x1,0x7c,0x6f, 0x2,0x70,0x58, + 0x3,0x61,0x22, 0x2,0x71,0x42, 0x2,0x71,0x41, 0x2,0x71,0x43, + 0x1,0x7d,0x2c, 0x2,0x71,0x44, 0x1,0x7d,0x2b, 0x2,0x71,0x45, + 0x2,0x71,0x61, 0x2,0x71,0x64, 0x2,0x71,0x63, 0x1,0x7d,0x35, + 0x2,0x71,0x62, 0x4,0x6d,0x62, 0x3,0x61,0x6f, 0x3,0x62,0x23, + 0x1,0x7d,0x3f, 0x1,0x7d,0x3d, 0x1,0x7d,0x3e, 0x1,0x7d,0x44, + 0x2,0x72,0x30, 0x2,0x72,0x31, 0x2,0x72,0x2f, 0x2,0x72,0x37, + 0x3,0x62,0x36, 0x1,0x4f,0x5b, 0x4,0x25,0x2b, 0x4,0x30,0x3a, + 0x2,0x3a,0x28, 0x2,0x41,0x3f, 0x2,0x55,0x4e, 0x2,0x67,0x63, + 0x5,0x71,0x56, 0x1,0x4f,0x5c, 0x3,0x2f,0x40, 0x1,0x53,0x6d, + 0x1,0x58,0x60, 0x4,0x30,0x3b, 0x3,0x34,0x32, 0x2,0x3a,0x29, + 0x3,0x39,0x5c, 0x2,0x3a,0x2a, 0x1,0x5d,0x70, 0x1,0x62,0x64, + 0x2,0x41,0x41, 0x2,0x41,0x40, 0x1,0x62,0x68, 0x1,0x62,0x63, + 0x2,0x41,0x42, 0x1,0x62,0x65, 0x1,0x62,0x67, 0x1,0x62,0x66, + 0x1,0x62,0x62, 0x3,0x3f,0x6c, 0xf,0x3f,0x7e, 0x3,0x66,0x6b, + 0x1,0x67,0x50, 0x3,0x45,0x3c, 0x3,0x45,0x3a, 0x2,0x48,0x56, + 0x2,0x48,0x54, 0x4,0x41,0x53, 0x2,0x48,0x55, 0x2,0x48,0x53, + 0xf,0x45,0x7b, 0x1,0x6b,0x5b, 0x3,0x4a,0x3d, 0x1,0x6b,0x5e, + 0x1,0x6b,0x60, 0x1,0x6b,0x5f, 0x4,0x48,0x22, 0x3,0x4a,0x3e, + 0x1,0x6b,0x5c, 0x1,0x6b,0x5d, 0x2,0x55,0x50, 0x2,0x55,0x4f, + 0x1,0x6f,0x64, 0x2,0x55,0x51, 0x3,0x4f,0x53, 0x2,0x55,0x52, + 0x1,0x6f,0x65, 0x3,0x4f,0x55, 0x3,0x4f,0x56, 0x4,0x4e,0x4a, + 0x2,0x5b,0x59, 0x2,0x5b,0x57, 0x2,0x60,0x40, 0x3,0x53,0x42, + 0x2,0x5b,0x55, 0x2,0x5b,0x56, 0x1,0x72,0x6f, 0x2,0x5b,0x52, + 0x2,0x5b,0x5a, 0x2,0x5b,0x54, 0x2,0x5b,0x58, 0x2,0x60,0x3c, + 0x3,0x53,0x44, 0x3,0x53,0x40, 0x2,0x60,0x3e, 0x3,0x56,0x6d, + 0x2,0x60,0x3f, 0x1,0x75,0x7e, 0x2,0x60,0x3b, 0x1,0x75,0x7d, + 0x2,0x60,0x3d, 0x1,0x75,0x7a, 0x1,0x75,0x7b, 0x1,0x75,0x7c, + 0x2,0x5b,0x53, 0x3,0x66,0x6c, 0x1,0x77,0x60, 0x2,0x64,0x3a, + 0x2,0x64,0x38, 0x2,0x64,0x39, 0x1,0x77,0x5e, 0x1,0x77,0x61, + 0x1,0x77,0x5f, 0x3,0x59,0x4b, 0x3,0x59,0x4a, 0x7,0x4b,0x40, + 0x2,0x67,0x64, 0x2,0x67,0x65, 0x1,0x79,0x43, 0x3,0x5b,0x53, + 0x2,0x6a,0x53, 0x2,0x6a,0x55, 0x2,0x6a,0x54, 0x1,0x7a,0x4f, + 0x1,0x7b,0x3c, 0x2,0x6c,0x5b, 0x2,0x6c,0x5a, 0x2,0x6c,0x59, + 0xf,0x68,0x72, 0x3,0x66,0x6d, 0xf,0x25,0x39, 0x1,0x4f,0x5d, + 0x3,0x21,0x43, 0x2,0x21,0x69, 0x2,0x22,0x78, 0x1,0x48,0x6a, + 0x2,0x22,0x76, 0x2,0x22,0x79, 0x2,0x22,0x77, 0x4,0x25,0x2e, + 0x3,0x27,0x3b, 0x3,0x27,0x3a, 0x2,0x25,0x2e, 0x3,0x27,0x3f, + 0x1,0x4b,0x62, 0x3,0x27,0x3c, 0x1,0x4b,0x63, 0x2,0x25,0x30, + 0x1,0x4b,0x60, 0x2,0x25,0x2f, 0x2,0x25,0x2d, 0x1,0x4b,0x61, + 0x1,0x4b,0x5f, 0x3,0x27,0x3d, 0x3,0x27,0x3e, 0x3,0x2a,0x79, + 0x4,0x28,0x33, 0x2,0x28,0x78, 0x2,0x28,0x7b, 0x1,0x4f,0x60, + 0x2,0x28,0x7a, 0x2,0x28,0x79, 0x3,0x2a,0x7c, 0x1,0x4f,0x5f, + 0x1,0x4f,0x5e, 0x3,0x2a,0x7b, 0x1,0x4f,0x62, 0x2,0x28,0x7c, + 0x1,0x4f,0x61, 0x2,0x2d,0x67, 0x1,0x53,0x6f, 0x1,0x53,0x70, + 0x1,0x53,0x71, 0x2,0x2d,0x68, 0x2,0x2d,0x64, 0x1,0x53,0x6e, + 0x2,0x2d,0x65, 0x4,0x2b,0x5d, 0x2,0x2d,0x66, 0x2,0x2d,0x63, + 0x4,0x2b,0x5b, 0x3,0x34,0x36, 0x4,0x30,0x3f, 0x1,0x58,0x67, + 0x3,0x34,0x34, 0x3,0x39,0x5e, 0x1,0x58,0x64, 0x2,0x33,0x48, + 0x1,0x58,0x65, 0x1,0x58,0x68, 0x2,0x33,0x49, 0x3,0x34,0x33, + 0x1,0x58,0x63, 0x1,0x58,0x61, 0x1,0x58,0x62, 0x1,0x58,0x66, + 0x1,0x5d,0x71, 0x2,0x3a,0x2d, 0x1,0x5d,0x79, 0x2,0x3a,0x2c, + 0x3,0x39,0x61, 0x2,0x3a,0x2f, 0x1,0x5d,0x75, 0x2,0x3a,0x2e, + 0x1,0x62,0x70, 0x1,0x5d,0x73, 0x1,0x5d,0x76, 0x1,0x5d,0x72, + 0x1,0x5d,0x77, 0x1,0x5d,0x78, 0x1,0x5d,0x74, 0x3,0x39,0x65, + 0x3,0x3f,0x71, 0x2,0x3a,0x2b, 0x1,0x62,0x6c, 0x2,0x41,0x44, + 0x3,0x3f,0x72, 0x2,0x41,0x48, 0x3,0x3f,0x73, 0x3,0x3f,0x75, + 0x2,0x41,0x47, 0x1,0x62,0x71, 0x1,0x62,0x6d, 0x1,0x62,0x6e, + 0x2,0x41,0x43, 0x2,0x41,0x45, 0x2,0x41,0x46, 0x1,0x62,0x69, + 0x1,0x62,0x6b, 0x3,0x3f,0x70, 0x1,0x62,0x6f, 0x1,0x62,0x6a, + 0x3,0x45,0x40, 0x2,0x48,0x59, 0x2,0x48,0x57, 0x2,0x48,0x58, + 0x1,0x67,0x52, 0x1,0x67,0x53, 0x3,0x45,0x42, 0x2,0x48,0x5a, + 0x1,0x67,0x51, 0x1,0x6b,0x61, 0x4,0x48,0x24, 0x1,0x6b,0x63, + 0x1,0x6b,0x62, 0x3,0x4a,0x45, 0x2,0x4f,0x23, 0x3,0x4a,0x46, + 0x3,0x4a,0x44, 0x2,0x4f,0x24, 0x2,0x55,0x54, 0x3,0x4f,0x5a, + 0x2,0x55,0x53, 0x3,0x4f,0x5b, 0x4,0x54,0x52, 0x1,0x72,0x70, + 0x1,0x72,0x71, 0x2,0x5b,0x5b, 0x1,0x72,0x72, 0x3,0x53,0x48, + 0x2,0x60,0x43, 0x3,0x56,0x70, 0x2,0x60,0x41, 0x3,0x56,0x6f, + 0x2,0x60,0x42, 0x1,0x76,0x21, 0x3,0x56,0x71, 0x2,0x64,0x3b, + 0x1,0x79,0x44, 0x3,0x5d,0x49, 0x3,0x2a,0x7d, 0x3,0x53,0x49, + 0x1,0x76,0x22, 0x1,0x4f,0x63, 0x4,0x30,0x41, 0x1,0x58,0x69, + 0x2,0x33,0x4a, 0x3,0x34,0x39, 0xf,0x32,0x6f, 0x2,0x3a,0x30, + 0x1,0x5d,0x7a, 0x1,0x62,0x72, 0x2,0x41,0x49, 0x2,0x41,0x4b, + 0x1,0x62,0x74, 0x1,0x62,0x73, 0x1,0x62,0x75, 0x1,0x62,0x76, + 0x2,0x41,0x4a, 0x1,0x67,0x56, 0x1,0x67,0x57, 0x1,0x67,0x55, + 0x1,0x6b,0x64, 0x1,0x67,0x54, 0x2,0x48,0x5b, 0x4,0x41,0x57, + 0x3,0x4a,0x47, 0x3,0x4a,0x49, 0x1,0x6b,0x65, 0x2,0x55,0x55, + 0x2,0x5b,0x5c, 0x1,0x72,0x73, 0x1,0x76,0x23, 0x2,0x64,0x3c, + 0x2,0x64,0x40, 0x1,0x77,0x64, 0x2,0x64,0x3d, 0x1,0x77,0x65, + 0x1,0x77,0x63, 0x2,0x64,0x41, 0x1,0x77,0x66, 0x2,0x64,0x3f, + 0x2,0x67,0x66, 0x1,0x77,0x62, 0x1,0x79,0x45, 0x3,0x5e,0x70, + 0x2,0x70,0x5b, 0x3,0x61,0x25, 0x3,0x62,0x2f, 0x1,0x4f,0x64, + 0x1,0x5d,0x7c, 0x1,0x5d,0x7b, 0xf,0x39,0x2a, 0x3,0x3f,0x7e, + 0x3,0x3f,0x7c, 0x3,0x3f,0x7b, 0x1,0x62,0x77, 0x2,0x41,0x4d, + 0x2,0x41,0x4c, 0x1,0x62,0x78, 0x3,0x45,0x46, 0x2,0x48,0x5f, + 0x1,0x67,0x5b, 0x1,0x67,0x58, 0x2,0x48,0x5e, 0x1,0x67,0x5a, + 0x2,0x48,0x5c, 0x1,0x67,0x59, 0x3,0x45,0x47, 0x2,0x48,0x5d, + 0x2,0x4f,0x25, 0x1,0x6b,0x66, 0x2,0x55,0x58, 0x5,0x52,0x3b, + 0x1,0x6f,0x66, 0x2,0x55,0x56, 0x1,0x6f,0x67, 0x1,0x6f,0x68, + 0x2,0x55,0x57, 0x1,0x6f,0x69, 0x3,0x4f,0x60, 0x2,0x5b,0x5d, + 0x3,0x53,0x50, 0x1,0x72,0x77, 0x1,0x72,0x74, 0x1,0x72,0x79, + 0x2,0x5b,0x5f, 0x1,0x72,0x75, 0x2,0x5b,0x5e, 0x1,0x72,0x78, + 0x3,0x53,0x4d, 0x3,0x53,0x4c, 0x1,0x72,0x76, 0x3,0x53,0x51, + 0x2,0x60,0x46, 0x2,0x60,0x48, 0x3,0x56,0x74, 0x3,0x56,0x75, + 0x1,0x76,0x24, 0x2,0x60,0x47, 0x1,0x76,0x25, 0x2,0x60,0x45, + 0x2,0x60,0x44, 0x4,0x5e,0x38, 0x2,0x64,0x43, 0x2,0x64,0x42, + 0x1,0x77,0x67, 0x2,0x64,0x44, 0x2,0x67,0x6b, 0x1,0x79,0x47, + 0x2,0x67,0x6a, 0x2,0x67,0x67, 0x1,0x79,0x46, 0x2,0x67,0x68, + 0x2,0x67,0x69, 0x2,0x6a,0x56, 0x2,0x6a,0x57, 0x1,0x7a,0x50, + 0x3,0x5d,0x4f, 0x1,0x7b,0x3f, 0x3,0x5d,0x4c, 0x3,0x5d,0x4e, + 0x2,0x6c,0x5c, 0x3,0x5e,0x72, 0x3,0x5e,0x71, 0x1,0x7b,0x3d, + 0x1,0x7b,0x3e, 0x2,0x6c,0x5d, 0x3,0x66,0x6e, 0x3,0x5f,0x71, + 0x1,0x7b,0x7e, 0x1,0x7c,0x21, 0x2,0x6e,0x40, 0x3,0x5f,0x72, + 0x3,0x60,0x59, 0x1,0x7c,0x70, 0x2,0x70,0x5d, 0x1,0x7c,0x72, + 0x3,0x61,0x26, 0x2,0x70,0x5c, 0x2,0x70,0x5e, 0x1,0x7c,0x71, + 0x2,0x71,0x46, 0x4,0x6d,0x64, 0x2,0x71,0x7b, 0x3,0x66,0x6f, + 0x3,0x62,0x45, 0x3,0x2a,0x7e, 0x1,0x4f,0x65, 0x3,0x45,0x49, + 0x1,0x67,0x5c, 0x4,0x48,0x35, 0x2,0x4f,0x26, 0x3,0x4a,0x4c, + 0x2,0x55,0x59, 0x1,0x72,0x7a, 0x1,0x72,0x7b, 0x3,0x59,0x4f, + 0x1,0x4f,0x66, 0x3,0x40,0x21, 0x1,0x6f,0x6a, 0x1,0x79,0x48, + 0x1,0x53,0x72, 0x3,0x2b,0x21, 0x3,0x4a,0x4e, 0x1,0x72,0x7c, + 0x3,0x5e,0x73, 0x1,0x7c,0x4e, 0x1,0x53,0x73, 0x2,0x3a,0x31, + 0x4,0x3b,0x77, 0x2,0x41,0x4e, 0x3,0x40,0x24, 0x2,0x41,0x50, + 0x3,0x40,0x22, 0x2,0x41,0x4f, 0x2,0x48,0x63, 0x2,0x48,0x60, + 0x1,0x67,0x5d, 0x6,0x5a,0x24, 0x1,0x67,0x5e, 0x2,0x48,0x61, + 0x2,0x48,0x62, 0x3,0x45,0x4b, 0x2,0x4f,0x28, 0x2,0x4f,0x2d, + 0x1,0x6b,0x67, 0x2,0x4f,0x27, 0x2,0x4f,0x29, 0x2,0x4f,0x30, + 0x2,0x4f,0x2b, 0x2,0x4f,0x2f, 0x2,0x4f,0x2c, 0x2,0x4f,0x2a, + 0x2,0x4f,0x2e, 0x1,0x6b,0x68, 0x3,0x4f,0x62, 0x2,0x55,0x5c, + 0x3,0x4f,0x63, 0x2,0x55,0x5a, 0x1,0x6f,0x6c, 0x3,0x4f,0x64, + 0x1,0x6f,0x6b, 0x2,0x55,0x5b, 0x1,0x6f,0x6d, 0x3,0x53,0x53, + 0x2,0x5b,0x62, 0x4,0x54,0x5f, 0x4,0x54,0x67, 0x2,0x5b,0x61, + 0x1,0x72,0x7d, 0x2,0x5b,0x60, 0x2,0x60,0x49, 0x3,0x56,0x7a, + 0x2,0x60,0x4b, 0x2,0x60,0x4d, 0x2,0x60,0x4c, 0x3,0x56,0x7b, + 0x1,0x76,0x26, 0x2,0x60,0x4a, 0x2,0x64,0x4b, 0x1,0x77,0x68, + 0x2,0x64,0x49, 0x2,0x64,0x4c, 0x1,0x77,0x69, 0x4,0x5e,0x43, + 0x2,0x64,0x47, 0x3,0x59,0x50, 0x2,0x64,0x4a, 0x2,0x64,0x48, + 0x2,0x64,0x45, 0x1,0x77,0x6a, 0x2,0x64,0x46, 0x4,0x61,0x7c, + 0x3,0x5b,0x5f, 0x3,0x5b,0x5d, 0x2,0x67,0x6c, 0x3,0x5b,0x5e, + 0x3,0x5b,0x60, 0x2,0x67,0x6e, 0x2,0x67,0x6d, 0x3,0x5d,0x50, + 0x2,0x6a,0x58, 0x3,0x5d,0x51, 0x2,0x6a,0x59, 0x4,0x67,0x71, + 0x3,0x5e,0x75, 0x3,0x5e,0x74, 0x2,0x6c,0x5e, 0x3,0x5f,0x73, + 0x1,0x7c,0x23, 0x4,0x69,0x5e, 0x1,0x7c,0x22, 0x2,0x6f,0x5d, + 0x2,0x6f,0x5e, 0x1,0x7c,0x73, 0x2,0x70,0x5f, 0x3,0x61,0x28, + 0x1,0x7d,0x36, 0x3,0x62,0x3b, 0x1,0x53,0x74, 0x1,0x62,0x79, + 0x2,0x4f,0x32, 0x2,0x4f,0x31, 0x2,0x55,0x5e, 0x2,0x55,0x5d, + 0x4,0x4e,0x57, 0x3,0x53,0x55, 0x1,0x76,0x27, 0x2,0x60,0x4f, + 0x2,0x60,0x4e, 0x2,0x64,0x4f, 0x2,0x64,0x4d, 0x2,0x64,0x50, + 0x2,0x64,0x4e, 0x3,0x59,0x51, 0x4,0x65,0x29, 0x1,0x79,0x49, + 0x2,0x67,0x6f, 0x2,0x67,0x70, 0x2,0x67,0x71, 0x4,0x65,0x27, + 0x2,0x6c,0x5f, 0x3,0x5e,0x76, 0x2,0x6e,0x41, 0x3,0x61,0x29, + 0x2,0x70,0x60, 0x1,0x53,0x75, 0x3,0x45,0x4f, 0x3,0x4f,0x65, + 0x2,0x5b,0x63, 0x2,0x60,0x50, 0x3,0x5b,0x61, 0x1,0x53,0x76, + 0x4,0x41,0x63, 0x3,0x45,0x50, 0x1,0x6b,0x69, 0x4,0x48,0x46, + 0x2,0x5b,0x64, 0x1,0x77,0x6b, 0x2,0x64,0x51, 0x1,0x79,0x4a, + 0x3,0x5d,0x53, 0x2,0x6a,0x5a, 0x2,0x6a,0x5b, 0x1,0x7b,0x40, + 0x2,0x6f,0x5f, 0x1,0x53,0x77, 0x1,0x5e,0x21, 0x1,0x5e,0x22, + 0x2,0x3a,0x32, 0x1,0x62,0x7a, 0x1,0x62,0x7b, 0x2,0x41,0x51, + 0x1,0x62,0x7c, 0x4,0x41,0x68, 0x1,0x67,0x62, 0x3,0x45,0x52, + 0x1,0x67,0x64, 0x2,0x48,0x65, 0x2,0x48,0x66, 0x2,0x48,0x64, + 0x1,0x67,0x5f, 0x1,0x67,0x60, 0x1,0x67,0x63, 0x1,0x67,0x61, + 0x3,0x4a,0x54, 0x3,0x4a,0x55, 0x2,0x4f,0x33, 0x1,0x6b,0x6a, + 0x1,0x6b,0x6b, 0x3,0x4a,0x52, 0x3,0x4a,0x56, 0x2,0x55,0x65, + 0x1,0x6f,0x70, 0x2,0x55,0x60, 0x2,0x55,0x5f, 0x3,0x4f,0x69, + 0x2,0x55,0x64, 0x1,0x6f,0x6e, 0x3,0x4f,0x67, 0x4,0x4e,0x5a, + 0x1,0x73,0x26, 0x4,0x54,0x70, 0x2,0x55,0x61, 0x2,0x55,0x66, + 0x2,0x55,0x63, 0x2,0x55,0x62, 0x3,0x4f,0x66, 0x1,0x6f,0x6f, + 0x1,0x73,0x24, 0x3,0x53,0x5c, 0x2,0x5b,0x66, 0x1,0x72,0x7e, + 0x3,0x53,0x59, 0x2,0x5b,0x67, 0x3,0x53,0x5a, 0x3,0x52,0x28, + 0x2,0x5b,0x65, 0x3,0x53,0x58, 0x1,0x73,0x23, 0x1,0x73,0x21, + 0x1,0x73,0x25, 0x3,0x53,0x5d, 0x1,0x73,0x22, 0x3,0x53,0x5b, + 0x3,0x53,0x5f, 0x4,0x5e,0x4f, 0x3,0x59,0x5b, 0x3,0x57,0x26, + 0x2,0x60,0x51, 0x4,0x59,0x70, 0x2,0x60,0x56, 0x2,0x60,0x52, + 0x2,0x60,0x55, 0x1,0x76,0x28, 0x3,0x57,0x28, 0x2,0x5e,0x41, + 0x2,0x60,0x54, 0x2,0x60,0x53, 0x3,0x59,0x59, 0x1,0x77,0x6e, + 0x1,0x77,0x6c, 0x1,0x77,0x6f, 0x1,0x77,0x6d, 0x2,0x64,0x52, + 0x2,0x64,0x53, 0x2,0x64,0x54, 0x1,0x77,0x70, 0x3,0x59,0x56, + 0x3,0x59,0x58, 0x3,0x5b,0x65, 0x2,0x67,0x75, 0x1,0x79,0x4c, + 0x2,0x67,0x73, 0x4,0x62,0x30, 0x1,0x79,0x4d, 0x2,0x67,0x72, + 0x2,0x67,0x74, 0x1,0x79,0x4b, 0x2,0x6a,0x5f, 0x2,0x6a,0x5c, + 0x4,0x65,0x2c, 0x2,0x6a,0x5d, 0x2,0x6a,0x5e, 0x2,0x6c,0x60, + 0x1,0x7b,0x42, 0x3,0x5e,0x78, 0x1,0x7b,0x41, 0x3,0x5e,0x77, + 0x2,0x6e,0x43, 0x2,0x6e,0x42, 0x1,0x7c,0x24, 0x3,0x60,0x5d, + 0x3,0x60,0x5e, 0x3,0x60,0x5c, 0x1,0x7c,0x4f, 0x1,0x7c,0x74, + 0x1,0x7d,0x2d, 0x2,0x71,0x47, 0x2,0x71,0x7c, 0x2,0x71,0x7d, + 0x1,0x53,0x78, 0x2,0x41,0x52, 0x4,0x41,0x71, 0x2,0x48,0x67, + 0x2,0x4f,0x34, 0x2,0x4f,0x35, 0x1,0x6b,0x6c, 0x4,0x48,0x57, + 0x1,0x6b,0x6d, 0x2,0x55,0x67, 0x1,0x6f,0x71, 0x3,0x53,0x61, + 0x1,0x76,0x29, 0x3,0x57,0x2a, 0x2,0x64,0x55, 0x3,0x59,0x5c, + 0x1,0x77,0x71, 0x2,0x67,0x78, 0x1,0x79,0x4e, 0x2,0x67,0x77, + 0x2,0x67,0x79, 0x2,0x67,0x76, 0x2,0x6c,0x63, 0x2,0x6a,0x60, + 0x2,0x6a,0x61, 0x3,0x5d,0x56, 0x1,0x7a,0x51, 0x2,0x6c,0x62, + 0x3,0x5e,0x7b, 0x3,0x5e,0x79, 0x2,0x6c,0x61, 0x3,0x5e,0x7a, + 0x2,0x6e,0x44, 0x2,0x71,0x7e, 0x3,0x62,0x25, 0x1,0x53,0x79, + 0x3,0x5e,0x7c, 0x3,0x62,0x26, 0x1,0x53,0x7a, 0x3,0x39,0x67, + 0x1,0x58,0x6a, 0x2,0x33,0x4b, 0x3,0x66,0x70, 0x2,0x3a,0x33, + 0x3,0x39,0x68, 0x1,0x62,0x7d, 0x1,0x63,0x22, 0x1,0x62,0x7e, + 0x2,0x41,0x53, 0x3,0x45,0x5b, 0x1,0x63,0x24, 0x1,0x63,0x21, + 0x3,0x40,0x2b, 0x3,0x45,0x5c, 0x1,0x63,0x23, 0x3,0x45,0x54, + 0x1,0x67,0x66, 0x3,0x45,0x59, 0x2,0x48,0x68, 0x3,0x45,0x57, + 0x3,0x4a,0x5d, 0x2,0x48,0x69, 0x2,0x55,0x69, 0x4,0x41,0x7b, + 0x1,0x67,0x65, 0x1,0x67,0x67, 0x1,0x67,0x68, 0x3,0x45,0x58, + 0x2,0x4f,0x37, 0x3,0x4a,0x5e, 0x2,0x4f,0x36, 0x1,0x6b,0x6e, + 0x5,0x4b,0x4c, 0x1,0x6b,0x6f, 0x3,0x4a,0x5b, 0x2,0x4f,0x38, + 0x2,0x55,0x68, 0x1,0x6b,0x71, 0x1,0x6f,0x72, 0x4,0x4e,0x63, + 0x1,0x6b,0x70, 0x3,0x66,0x7a, 0x1,0x73,0x27, 0x2,0x55,0x6a, + 0x1,0x6f,0x74, 0x1,0x6f,0x73, 0x2,0x55,0x6b, 0x2,0x55,0x6e, + 0x2,0x55,0x6c, 0x2,0x55,0x6d, 0x1,0x6f,0x75, 0x3,0x4f,0x6b, + 0x1,0x73,0x2c, 0x1,0x73,0x2a, 0x3,0x53,0x65, 0x3,0x53,0x66, + 0x1,0x73,0x29, 0x2,0x5b,0x69, 0x3,0x53,0x64, 0x1,0x73,0x2b, + 0x3,0x53,0x62, 0x3,0x53,0x63, 0x2,0x5b,0x68, 0x2,0x60,0x57, + 0x4,0x54,0x7e, 0x2,0x5b,0x6a, 0x1,0x73,0x28, 0x2,0x5b,0x6b, + 0x2,0x60,0x5a, 0x2,0x60,0x58, 0x2,0x60,0x59, 0x2,0x60,0x5e, + 0x1,0x77,0x75, 0x2,0x60,0x5d, 0x2,0x60,0x60, 0x2,0x60,0x5f, + 0x2,0x60,0x5c, 0x2,0x60,0x5b, 0x4,0x55,0x21, 0x1,0x76,0x2a, + 0x3,0x59,0x62, 0x4,0x5a,0x29, 0x3,0x59,0x61, 0x3,0x59,0x66, + 0x2,0x64,0x58, 0x3,0x59,0x65, 0x2,0x64,0x57, 0x1,0x77,0x74, + 0x1,0x77,0x72, 0x1,0x77,0x73, 0x3,0x59,0x63, 0x2,0x64,0x56, + 0x3,0x66,0x71, 0x2,0x67,0x7c, 0x3,0x5b,0x69, 0x1,0x79,0x4f, + 0x4,0x62,0x38, 0x2,0x67,0x7b, 0x2,0x67,0x7a, 0x1,0x79,0x50, + 0x4,0x65,0x3a, 0x2,0x6a,0x66, 0x2,0x6a,0x65, 0x3,0x5d,0x58, + 0x2,0x6a,0x63, 0x3,0x5e,0x7e, 0x2,0x6a,0x62, 0x1,0x7a,0x53, + 0x1,0x7a,0x52, 0x2,0x6a,0x67, 0x2,0x6e,0x45, 0x1,0x7c,0x25, + 0x2,0x6c,0x65, 0x1,0x7b,0x43, 0x2,0x6c,0x64, 0x2,0x6a,0x64, + 0x3,0x5f,0x78, 0x2,0x6e,0x46, 0x1,0x7c,0x50, 0x3,0x61,0x2a, + 0x1,0x7d,0x2e, 0x2,0x71,0x48, 0x4,0x6e,0x24, 0x2,0x72,0x21, + 0x1,0x53,0x7b, 0x2,0x3a,0x34, 0x2,0x60,0x61, 0x1,0x53,0x7c, + 0x3,0x45,0x5f, 0x5,0x4b,0x4e, 0x2,0x4f,0x3a, 0x2,0x4f,0x39, + 0x2,0x5b,0x6c, 0x5,0x5a,0x26, 0x3,0x53,0x68, 0x2,0x60,0x63, + 0x3,0x57,0x30, 0x2,0x60,0x62, 0x3,0x59,0x67, 0x1,0x77,0x76, + 0x2,0x67,0x7d, 0x2,0x67,0x7e, 0x1,0x7a,0x54, 0x3,0x5f,0x21, + 0x3,0x60,0x60, 0x2,0x72,0x22, 0x1,0x58,0x6b, 0x1,0x63,0x26, + 0x1,0x63,0x25, 0x2,0x48,0x6a, 0x2,0x48,0x6c, 0x1,0x67,0x6a, + 0x2,0x48,0x6b, 0x1,0x67,0x69, 0x1,0x67,0x6b, 0x2,0x48,0x6d, + 0x3,0x4a,0x63, 0x3,0x4a,0x62, 0x3,0x4a,0x66, 0x2,0x4f,0x3c, + 0x2,0x4f,0x3e, 0x2,0x4f,0x3d, 0x3,0x4a,0x61, 0x2,0x4f,0x40, + 0x3,0x4a,0x60, 0x3,0x4a,0x6c, 0x3,0x4a,0x64, 0x1,0x6b,0x72, + 0x2,0x4f,0x3f, 0x2,0x4f,0x3b, 0x3,0x4a,0x6a, 0x4,0x48,0x60, + 0x2,0x4f,0x41, 0x3,0x4f,0x73, 0x2,0x55,0x75, 0x3,0x4f,0x6d, + 0x2,0x55,0x78, 0x2,0x55,0x7a, 0x2,0x55,0x70, 0x2,0x55,0x74, + 0x2,0x55,0x71, 0x1,0x6f,0x77, 0x1,0x6f,0x7a, 0x1,0x6f,0x7c, + 0x2,0x55,0x72, 0x2,0x55,0x73, 0x1,0x6f,0x7b, 0x2,0x55,0x76, + 0x2,0x55,0x79, 0x2,0x55,0x77, 0x1,0x6f,0x7d, 0x3,0x4f,0x6e, + 0x1,0x6f,0x79, 0x2,0x55,0x6f, 0x1,0x6f,0x76, 0x3,0x4f,0x72, + 0x1,0x6f,0x78, 0x3,0x4f,0x74, 0x3,0x53,0x70, 0x1,0x73,0x2e, + 0x2,0x5b,0x72, 0x2,0x5b,0x70, 0x2,0x5b,0x6f, 0x3,0x53,0x71, + 0x2,0x5b,0x75, 0x3,0x53,0x6b, 0x2,0x5b,0x74, 0x2,0x5b,0x73, + 0x3,0x53,0x6c, 0x2,0x5b,0x6e, 0x1,0x73,0x2d, 0x2,0x5b,0x6d, + 0x3,0x53,0x6a, 0x2,0x5b,0x71, 0x1,0x73,0x2f, 0x3,0x57,0x34, + 0x2,0x60,0x66, 0x3,0x57,0x37, 0x2,0x60,0x6a, 0x2,0x60,0x67, + 0x2,0x60,0x69, 0x2,0x60,0x68, 0x2,0x60,0x65, 0x2,0x60,0x6b, + 0x2,0x60,0x6e, 0x2,0x60,0x6c, 0x2,0x60,0x6d, 0x1,0x76,0x2c, + 0x3,0x57,0x33, 0x1,0x76,0x2b, 0x2,0x60,0x64, 0x2,0x60,0x6f, + 0x2,0x64,0x5d, 0x2,0x64,0x60, 0x2,0x64,0x62, 0x2,0x64,0x61, + 0x3,0x59,0x6a, 0x2,0x64,0x5b, 0x2,0x64,0x5f, 0x2,0x64,0x5a, + 0x3,0x59,0x6b, 0x2,0x64,0x5c, 0x1,0x77,0x77, 0x2,0x64,0x59, + 0x3,0x59,0x6d, 0x2,0x64,0x5e, 0x2,0x68,0x2d, 0x2,0x68,0x22, + 0x1,0x79,0x51, 0x3,0x5b,0x6f, 0x3,0x5b,0x6d, 0x1,0x79,0x52, + 0x2,0x68,0x21, 0x2,0x68,0x26, 0x2,0x68,0x2c, 0x2,0x68,0x24, + 0x2,0x68,0x2b, 0x3,0x5b,0x6c, 0x2,0x68,0x28, 0x3,0x5b,0x6e, + 0x2,0x68,0x27, 0x2,0x68,0x2a, 0x2,0x68,0x25, 0x2,0x68,0x23, + 0x3,0x5b,0x6b, 0x2,0x68,0x29, 0x2,0x6a,0x6e, 0x2,0x6a,0x6c, + 0x1,0x7a,0x55, 0x2,0x6a,0x6b, 0x2,0x6a,0x71, 0x2,0x6a,0x6f, + 0x3,0x5d,0x5a, 0x1,0x7a,0x56, 0x2,0x6a,0x6a, 0x2,0x6a,0x68, + 0x4,0x65,0x46, 0x2,0x6a,0x69, 0x1,0x7a,0x58, 0x2,0x6a,0x6d, + 0x1,0x7a,0x57, 0x2,0x6a,0x70, 0x2,0x6c,0x66, 0x2,0x6c,0x6c, + 0x3,0x5f,0x24, 0x3,0x5f,0x22, 0x2,0x6c,0x67, 0x1,0x7b,0x47, + 0x2,0x6c,0x6d, 0x1,0x7b,0x46, 0x2,0x6c,0x6b, 0x2,0x6c,0x6a, + 0x1,0x7b,0x45, 0x2,0x6c,0x69, 0x1,0x7b,0x44, 0x2,0x6c,0x68, + 0x7,0x56,0x51, 0x2,0x6e,0x4c, 0x2,0x6e,0x4e, 0x2,0x6e,0x4d, + 0x4,0x69,0x6a, 0x2,0x6e,0x4a, 0x1,0x7c,0x27, 0x2,0x6e,0x47, + 0x2,0x6e,0x4b, 0x2,0x6e,0x50, 0x3,0x5f,0x79, 0x2,0x6e,0x4f, + 0x2,0x6e,0x48, 0x2,0x6e,0x49, 0x1,0x7c,0x26, 0x2,0x6f,0x60, + 0x1,0x7c,0x53, 0x3,0x60,0x62, 0x2,0x6f,0x61, 0x1,0x7c,0x51, + 0x1,0x7c,0x52, 0x3,0x60,0x61, 0x4,0x6c,0x3d, 0x2,0x70,0x61, + 0x1,0x7c,0x75, 0x2,0x71,0x65, 0x3,0x61,0x72, 0x1,0x7d,0x37, + 0x3,0x61,0x73, 0x2,0x72,0x23, 0x1,0x7d,0x38, 0x2,0x72,0x24, + 0x2,0x72,0x25, 0x2,0x72,0x33, 0x2,0x72,0x32, 0x1,0x7d,0x47, + 0x2,0x72,0x3b, 0x1,0x58,0x6c, 0x3,0x40,0x2f, 0x4,0x42,0x21, + 0x2,0x48,0x6f, 0x4,0x41,0x7d, 0x2,0x48,0x6e, 0x4,0x41,0x7e, + 0x1,0x6b,0x73, 0x1,0x6b,0x74, 0x2,0x4f,0x42, 0x4,0x4e,0x74, + 0x2,0x55,0x7b, 0x2,0x5b,0x78, 0x3,0x4f,0x77, 0x3,0x4f,0x76, + 0x1,0x6f,0x7e, 0x1,0x73,0x30, 0x2,0x5b,0x76, 0x4,0x55,0x31, + 0x2,0x5b,0x79, 0x1,0x73,0x31, 0x3,0x57,0x3a, 0x2,0x60,0x70, + 0x2,0x5b,0x77, 0x2,0x64,0x63, 0x1,0x77,0x78, 0x2,0x68,0x2e, + 0x4,0x62,0x49, 0x3,0x5d,0x61, 0x2,0x6a,0x74, 0x2,0x6a,0x72, + 0x3,0x5d,0x60, 0x3,0x5d,0x5e, 0x2,0x6a,0x73, 0x2,0x6c,0x6e, + 0x3,0x5f,0x25, 0x1,0x7b,0x48, 0x2,0x6e,0x51, 0x1,0x7c,0x56, + 0x1,0x7c,0x28, 0x1,0x7c,0x54, 0x1,0x7c,0x55, 0x2,0x70,0x62, + 0x1,0x7d,0x2f, 0x3,0x61,0x74, 0x1,0x58,0x6d, 0x4,0x36,0x2d, + 0x3,0x4a,0x6e, 0x4,0x4e,0x79, 0x2,0x64,0x64, 0x3,0x5f,0x7b, + 0x3,0x60,0x63, 0x2,0x33,0x4c, 0x3,0x40,0x32, 0x1,0x67,0x6c, + 0x3,0x45,0x61, 0x2,0x4f,0x43, 0x3,0x4a,0x6f, 0x3,0x4a,0x73, + 0x1,0x6b,0x75, 0x2,0x4f,0x44, 0x3,0x4a,0x71, 0x3,0x4a,0x70, + 0x3,0x4a,0x72, 0x2,0x55,0x7d, 0x2,0x55,0x7c, 0x1,0x73,0x33, + 0x1,0x70,0x21, 0x1,0x70,0x22, 0x4,0x4f,0x21, 0x2,0x56,0x22, + 0x2,0x56,0x21, 0x2,0x55,0x7e, 0x3,0x4f,0x79, 0x3,0x53,0x75, + 0x2,0x5b,0x7a, 0x2,0x5b,0x7d, 0x3,0x53,0x74, 0x2,0x5b,0x7c, + 0x2,0x5b,0x7b, 0x1,0x73,0x32, 0x2,0x60,0x74, 0x2,0x60,0x72, + 0x2,0x60,0x71, 0x4,0x5a,0x37, 0x3,0x57,0x3b, 0x2,0x60,0x73, + 0x3,0x57,0x3c, 0x1,0x77,0x79, 0x2,0x64,0x66, 0x2,0x64,0x67, + 0x1,0x77,0x7a, 0x3,0x59,0x6f, 0x2,0x64,0x65, 0x3,0x5b,0x71, + 0x2,0x68,0x30, 0x2,0x68,0x2f, 0x2,0x68,0x32, 0x1,0x79,0x53, + 0x2,0x68,0x31, 0x4,0x62,0x4f, 0x2,0x6a,0x75, 0x2,0x6a,0x77, + 0x2,0x6a,0x76, 0x3,0x5f,0x27, 0x2,0x6c,0x6f, 0x2,0x6c,0x72, + 0x2,0x6c,0x70, 0x2,0x6c,0x71, 0x2,0x6e,0x52, 0x1,0x7c,0x29, + 0x4,0x69,0x74, 0x4,0x69,0x71, 0x3,0x66,0x72, 0x2,0x6f,0x62, + 0x2,0x6f,0x63, 0x2,0x6f,0x64, 0x3,0x61,0x2c, 0x1,0x7c,0x76, + 0x1,0x7d,0x30, 0x2,0x72,0x26, 0x1,0x58,0x6e, 0x3,0x4a,0x75, + 0x1,0x70,0x23, 0x1,0x73,0x34, 0x2,0x64,0x68, 0x3,0x5d,0x62, + 0x2,0x6e,0x53, 0x3,0x61,0x2e, 0x4,0x6d,0x37, 0x2,0x71,0x66, + 0x2,0x33,0x4d, 0x3,0x62,0x28, 0x1,0x7d,0x48, 0x1,0x58,0x6f, + 0x2,0x5b,0x7e, 0x3,0x57,0x3e, 0x2,0x64,0x69, 0x2,0x68,0x33, + 0x3,0x5d,0x63, 0x4,0x68,0x36, 0x2,0x6c,0x73, 0x2,0x6e,0x54, + 0x1,0x58,0x70, 0x3,0x45,0x62, 0x2,0x4f,0x45, 0x2,0x4f,0x46, + 0x3,0x4a,0x78, 0x1,0x6b,0x76, 0x1,0x6b,0x77, 0x2,0x56,0x24, + 0x1,0x70,0x25, 0x1,0x70,0x24, 0x2,0x56,0x23, 0x2,0x60,0x75, + 0x3,0x57,0x3f, 0x2,0x64,0x6a, 0x2,0x64,0x6c, 0x2,0x64,0x6b, + 0x1,0x77,0x7d, 0x1,0x77,0x7c, 0x1,0x77,0x7b, 0x3,0x5d,0x64, + 0x1,0x7b,0x4a, 0x2,0x6c,0x74, 0x3,0x5f,0x28, 0x1,0x7b,0x49, + 0x2,0x6e,0x56, 0x2,0x6e,0x55, 0x3,0x61,0x2f, 0x1,0x7c,0x77, + 0x2,0x70,0x63, 0x1,0x5e,0x23, 0x2,0x48,0x70, 0x4,0x42,0x29, + 0x3,0x45,0x63, 0x2,0x4f,0x49, 0x2,0x4f,0x47, 0x2,0x4f,0x48, + 0x4,0x48,0x6b, 0x3,0x4f,0x7e, 0x2,0x56,0x2d, 0x4,0x4f,0x30, + 0x2,0x56,0x28, 0x2,0x56,0x25, 0x2,0x56,0x2c, 0x3,0x4f,0x7c, + 0x4,0x4f,0x35, 0x3,0x4f,0x7b, 0x2,0x56,0x2e, 0x4,0x4f,0x37, + 0x4,0x4f,0x2c, 0x1,0x70,0x27, 0x2,0x56,0x2b, 0x2,0x56,0x27, + 0x3,0x4f,0x7d, 0x4,0x4f,0x2a, 0x2,0x56,0x26, 0x2,0x56,0x2a, + 0x2,0x56,0x29, 0x1,0x70,0x26, 0xf,0x53,0x3e, 0x2,0x5c,0x2b, + 0x2,0x5c,0x26, 0x2,0x5c,0x24, 0x2,0x5c,0x2d, 0x2,0x5c,0x25, + 0x4,0x55,0x47, 0x2,0x5c,0x21, 0x4,0x55,0x43, 0x2,0x5c,0x27, + 0x3,0x53,0x78, 0x3,0x53,0x7a, 0x2,0x5c,0x22, 0x2,0x60,0x7e, + 0x2,0x5c,0x23, 0x2,0x5c,0x2e, 0x3,0x54,0x23, 0x4,0x55,0x45, + 0x3,0x53,0x7c, 0x3,0x54,0x21, 0x5,0x5a,0x4a, 0x3,0x54,0x25, + 0x3,0x53,0x7d, 0x2,0x5c,0x2a, 0x1,0x73,0x35, 0x2,0x5c,0x29, + 0x2,0x5c,0x28, 0x3,0x53,0x79, 0x2,0x5c,0x2c, 0xf,0x59,0x38, + 0x3,0x66,0x73, 0x3,0x57,0x44, 0x2,0x60,0x76, 0x2,0x60,0x79, + 0x4,0x5a,0x49, 0x3,0x57,0x45, 0x2,0x60,0x78, 0x3,0x57,0x40, + 0x2,0x61,0x22, 0x2,0x60,0x7b, 0x2,0x61,0x21, 0x3,0x57,0x42, + 0x2,0x60,0x7d, 0x2,0x60,0x7c, 0x2,0x60,0x7a, 0x4,0x5a,0x41, + 0x2,0x60,0x77, 0x4,0x5a,0x3f, 0x1,0x76,0x2f, 0x1,0x76,0x2e, + 0x4,0x5a,0x44, 0x1,0x76,0x30, 0x1,0x76,0x2d, 0x2,0x61,0x23, + 0x4,0x5a,0x45, 0xf,0x5d,0x76, 0x4,0x5a,0x43, 0x2,0x64,0x72, + 0x2,0x64,0x75, 0x4,0x5f,0x26, 0x2,0x64,0x73, 0x2,0x64,0x77, + 0x5,0x66,0x79, 0x3,0x59,0x74, 0x4,0x5f,0x22, 0x2,0x64,0x78, + 0x4,0x5f,0x2a, 0x2,0x64,0x70, 0x1,0x78,0x24, 0x2,0x64,0x71, + 0x3,0x59,0x73, 0x2,0x64,0x6f, 0x2,0x64,0x76, 0x3,0x5b,0x74, + 0x2,0x64,0x6e, 0x2,0x64,0x6d, 0x1,0x78,0x23, 0x1,0x78,0x21, + 0x1,0x77,0x7e, 0x3,0x59,0x76, 0x3,0x59,0x75, 0x3,0x57,0x43, + 0xf,0x61,0x72, 0x3,0x59,0x71, 0x2,0x64,0x74, 0x2,0x68,0x3c, + 0x2,0x68,0x42, 0x1,0x79,0x56, 0x2,0x68,0x3d, 0x5,0x6b,0x33, + 0x2,0x68,0x40, 0x2,0x68,0x44, 0x1,0x79,0x57, 0x2,0x68,0x3f, + 0x4,0x62,0x5c, 0x2,0x68,0x37, 0x3,0x5b,0x75, 0x2,0x68,0x36, + 0x2,0x68,0x43, 0x2,0x68,0x3a, 0x3,0x5b,0x77, 0x2,0x68,0x38, + 0x2,0x68,0x41, 0x2,0x68,0x39, 0x1,0x79,0x55, 0x1,0x79,0x54, + 0x3,0x5b,0x79, 0x2,0x68,0x34, 0x2,0x68,0x35, 0x2,0x68,0x3e, + 0x4,0x62,0x66, 0x3,0x5b,0x7a, 0x4,0x62,0x68, 0x2,0x68,0x3b, + 0xf,0x64,0x6b, 0x4,0x62,0x55, 0x3,0x5d,0x6f, 0x2,0x6a,0x7a, + 0x2,0x6a,0x7d, 0x3,0x5d,0x71, 0x4,0x62,0x56, 0x3,0x5d,0x67, + 0x3,0x5d,0x69, 0x1,0x78,0x22, 0x3,0x5d,0x6a, 0x3,0x5d,0x74, + 0x3,0x5d,0x75, 0x4,0x65,0x5a, 0x3,0x5d,0x6e, 0x4,0x65,0x59, + 0x3,0x5d,0x68, 0x2,0x6a,0x7b, 0x2,0x6b,0x23, 0x2,0x6b,0x21, + 0x2,0x6a,0x79, 0x2,0x6b,0x26, 0x3,0x5d,0x66, 0x2,0x6a,0x78, + 0x3,0x5d,0x76, 0x1,0x7a,0x5a, 0x2,0x6b,0x22, 0x4,0x65,0x54, + 0x3,0x5d,0x73, 0x4,0x65,0x57, 0x2,0x6a,0x7c, 0x1,0x7a,0x59, + 0x2,0x6b,0x25, 0x3,0x5d,0x72, 0x4,0x65,0x5d, 0x2,0x6b,0x24, + 0x3,0x5d,0x70, 0x2,0x6c,0x77, 0x2,0x6c,0x76, 0x5,0x72,0x51, + 0x3,0x5f,0x2c, 0x5,0x72,0x4b, 0x2,0x6c,0x7d, 0x5,0x72,0x4e, + 0x2,0x6c,0x79, 0x2,0x6c,0x7c, 0x1,0x7b,0x4c, 0x4,0x68,0x3b, + 0x4,0x68,0x3e, 0x2,0x6c,0x7a, 0x2,0x6c,0x7b, 0x4,0x68,0x39, + 0x2,0x6c,0x75, 0x2,0x6c,0x78, 0x1,0x7b,0x4b, 0x3,0x5f,0x2a, + 0xf,0x69,0x2a, 0x1,0x7c,0x2b, 0x2,0x6e,0x61, 0x2,0x6e,0x5c, + 0x2,0x6e,0x60, 0x3,0x60,0x25, 0x2,0x6e,0x63, 0x2,0x6e,0x5f, + 0x3,0x5f,0x7e, 0x2,0x6e,0x5b, 0x3,0x60,0x23, 0x1,0x7c,0x2d, + 0x2,0x6e,0x5e, 0x2,0x6e,0x62, 0x1,0x7c,0x2c, 0x2,0x6e,0x59, + 0x2,0x6a,0x7e, 0x2,0x6e,0x5d, 0x4,0x6a,0x23, 0x5,0x75,0x2d, + 0x2,0x6e,0x5a, 0x3,0x60,0x22, 0x2,0x6e,0x57, 0xf,0x6a,0x3e, + 0x2,0x6e,0x58, 0x1,0x7c,0x2a, 0x2,0x6f,0x68, 0x2,0x6f,0x6a, + 0x2,0x6f,0x6d, 0x2,0x6f,0x69, 0x2,0x6f,0x6e, 0x3,0x60,0x65, + 0x2,0x6f,0x67, 0x3,0x60,0x66, 0x2,0x6f,0x65, 0x3,0x60,0x68, + 0x1,0x7c,0x57, 0x2,0x6f,0x6b, 0x1,0x7c,0x59, 0x1,0x7c,0x58, + 0x2,0x6f,0x66, 0x2,0x6f,0x6c, 0x3,0x61,0x32, 0x2,0x70,0x68, + 0x1,0x7c,0x78, 0x2,0x70,0x69, 0x3,0x61,0x33, 0x2,0x70,0x67, + 0x2,0x70,0x64, 0x4,0x6c,0x4a, 0x3,0x61,0x34, 0x2,0x70,0x66, + 0x2,0x70,0x65, 0x2,0x71,0x49, 0x3,0x61,0x59, 0x2,0x71,0x4b, + 0x2,0x71,0x4a, 0x3,0x61,0x5b, 0x2,0x71,0x69, 0x5,0x7a,0x53, + 0x2,0x71,0x68, 0x2,0x71,0x67, 0x2,0x71,0x6a, 0x3,0x61,0x75, + 0x1,0x7d,0x40, 0x1,0x7d,0x41, 0x2,0x72,0x38, 0x2,0x72,0x3c, + 0x3,0x62,0x41, 0x1,0x5e,0x24, 0x2,0x41,0x54, 0x2,0x48,0x73, + 0x3,0x45,0x64, 0x1,0x67,0x6d, 0x2,0x48,0x71, 0x3,0x45,0x66, + 0x3,0x2f,0x42, 0x2,0x48,0x72, 0x3,0x45,0x68, 0x3,0x45,0x67, + 0x2,0x4f,0x4a, 0x2,0x4f,0x4b, 0x1,0x6b,0x7a, 0x1,0x6b,0x78, + 0x2,0x4f,0x4c, 0x1,0x6b,0x79, 0x2,0x56,0x33, 0x3,0x50,0x27, + 0x2,0x56,0x36, 0x2,0x56,0x30, 0x2,0x56,0x37, 0x2,0x56,0x2f, + 0x2,0x56,0x31, 0x3,0x50,0x2a, 0x2,0x56,0x32, 0x2,0x56,0x35, + 0x3,0x50,0x24, 0x3,0x50,0x2b, 0x1,0x70,0x2a, 0x2,0x56,0x3a, + 0x2,0x56,0x39, 0x1,0x70,0x28, 0x2,0x56,0x34, 0x2,0x56,0x38, + 0x1,0x70,0x29, 0x3,0x54,0x2d, 0x4,0x4f,0x42, 0x3,0x50,0x25, + 0x3,0x50,0x22, 0x3,0x54,0x2a, 0x2,0x5c,0x38, 0x4,0x55,0x52, + 0x1,0x73,0x3a, 0x3,0x54,0x2c, 0x2,0x5c,0x33, 0x1,0x73,0x36, + 0x3,0x54,0x36, 0x2,0x5c,0x30, 0x2,0x5c,0x36, 0x2,0x5c,0x39, + 0x3,0x54,0x33, 0x1,0x73,0x3b, 0x4,0x5a,0x4e, 0x2,0x5c,0x35, + 0x2,0x5c,0x32, 0x2,0x5c,0x3a, 0x2,0x5c,0x31, 0x3,0x54,0x37, + 0x2,0x5c,0x37, 0x1,0x73,0x37, 0x3,0x54,0x29, 0x2,0x5c,0x2f, + 0x1,0x73,0x38, 0x3,0x54,0x35, 0x1,0x73,0x39, 0x2,0x5c,0x34, + 0x3,0x54,0x32, 0x2,0x61,0x35, 0x2,0x61,0x28, 0x2,0x61,0x29, + 0x2,0x61,0x2c, 0x2,0x61,0x2a, 0x4,0x5a,0x55, 0x2,0x61,0x24, + 0x4,0x5a,0x56, 0x3,0x57,0x4d, 0x2,0x61,0x27, 0x2,0x61,0x31, + 0x2,0x61,0x2b, 0x3,0x57,0x48, 0x4,0x5a,0x4f, 0x1,0x76,0x31, + 0x4,0x5a,0x4d, 0x2,0x61,0x33, 0x2,0x61,0x30, 0x1,0x76,0x32, + 0x2,0x61,0x32, 0x2,0x61,0x25, 0x2,0x61,0x2e, 0x2,0x61,0x2f, + 0x3,0x57,0x4a, 0x2,0x61,0x2d, 0xf,0x5e,0x24, 0x3,0x66,0x75, + 0x2,0x64,0x7c, 0x2,0x64,0x7e, 0x2,0x65,0x23, 0x3,0x59,0x79, + 0x3,0x59,0x7b, 0x2,0x64,0x7b, 0x3,0x59,0x7d, 0x1,0x78,0x25, + 0x2,0x65,0x25, 0x2,0x64,0x7a, 0x2,0x65,0x26, 0x3,0x59,0x7e, + 0x2,0x65,0x22, 0x2,0x65,0x24, 0x2,0x65,0x28, 0x2,0x65,0x21, + 0x2,0x65,0x29, 0x2,0x64,0x7d, 0x2,0x64,0x79, 0x1,0x78,0x26, + 0x3,0x5a,0x22, 0x2,0x65,0x27, 0x1,0x78,0x27, 0x1,0x79,0x59, + 0x4,0x5f,0x34, 0x3,0x59,0x7a, 0xf,0x61,0x77, 0x3,0x5b,0x7d, + 0x2,0x61,0x26, 0x2,0x68,0x5e, 0x2,0x68,0x55, 0x1,0x79,0x5b, + 0x2,0x68,0x51, 0x1,0x79,0x5c, 0x3,0x5c,0x27, 0x3,0x5c,0x22, + 0x2,0x68,0x5a, 0x2,0x68,0x54, 0x2,0x68,0x4a, 0x1,0x79,0x5a, + 0x2,0x68,0x57, 0x2,0x68,0x52, 0x2,0x68,0x53, 0x3,0x5c,0x25, + 0x2,0x68,0x45, 0x2,0x68,0x4c, 0x2,0x68,0x5b, 0x3,0x5b,0x7e, + 0x2,0x68,0x58, 0x5,0x6b,0x3f, 0x2,0x68,0x50, 0x3,0x5c,0x26, + 0x2,0x68,0x5c, 0x2,0x68,0x4b, 0x2,0x68,0x46, 0x2,0x68,0x59, + 0x3,0x5c,0x24, 0x2,0x68,0x48, 0x2,0x68,0x56, 0x2,0x68,0x4d, + 0x2,0x68,0x5d, 0x2,0x68,0x49, 0x1,0x79,0x58, 0x2,0x68,0x47, + 0x2,0x68,0x4e, 0x2,0x68,0x4f, 0x2,0x6b,0x2d, 0x3,0x5c,0x23, + 0x2,0x6b,0x2b, 0x4,0x65,0x69, 0x2,0x6b,0x30, 0x3,0x5d,0x79, + 0x2,0x6b,0x3c, 0x2,0x6b,0x33, 0x2,0x6b,0x2c, 0x2,0x6b,0x28, + 0x2,0x6b,0x35, 0x2,0x6b,0x2e, 0x2,0x6b,0x31, 0x2,0x6b,0x2a, + 0x2,0x6b,0x38, 0x2,0x6b,0x27, 0x2,0x6b,0x2f, 0x2,0x6b,0x34, + 0x2,0x6b,0x36, 0x2,0x6b,0x39, 0x2,0x6b,0x29, 0x3,0x5d,0x7a, + 0x2,0x6b,0x3d, 0x2,0x6b,0x3e, 0x2,0x6b,0x37, 0x2,0x6b,0x3b, + 0x2,0x6b,0x32, 0x2,0x6d,0x2f, 0x2,0x6d,0x32, 0x3,0x5f,0x35, + 0x1,0x7b,0x4d, 0x3,0x5f,0x31, 0x2,0x6d,0x31, 0x2,0x6d,0x36, + 0x2,0x6d,0x34, 0x1,0x7b,0x4e, 0x2,0x6d,0x2b, 0x2,0x6d,0x21, + 0x2,0x6c,0x7e, 0x1,0x7b,0x50, 0x2,0x6d,0x2d, 0x2,0x6d,0x2e, + 0x2,0x6d,0x2a, 0x2,0x6d,0x22, 0x3,0x5f,0x32, 0x2,0x6d,0x27, + 0x2,0x6b,0x3a, 0x4,0x68,0x43, 0x2,0x6d,0x23, 0x1,0x7b,0x4f, + 0x2,0x6d,0x29, 0x3,0x5f,0x36, 0x2,0x6d,0x28, 0x2,0x6d,0x24, + 0x2,0x6d,0x30, 0x4,0x68,0x44, 0x2,0x6d,0x25, 0x2,0x6e,0x68, + 0x2,0x6d,0x33, 0x2,0x6d,0x35, 0x2,0x6d,0x2c, 0x2,0x6d,0x26, + 0x2,0x6e,0x69, 0x2,0x6e,0x6b, 0x2,0x6e,0x65, 0x1,0x7c,0x2e, + 0x4,0x6a,0x25, 0x2,0x6e,0x72, 0x2,0x6e,0x70, 0x1,0x7c,0x2f, + 0x2,0x6e,0x6f, 0x2,0x6e,0x6e, 0x2,0x6e,0x67, 0x2,0x6e,0x64, + 0x2,0x6e,0x6a, 0x2,0x6e,0x73, 0x2,0x6e,0x66, 0x2,0x6e,0x6c, + 0x5,0x75,0x45, 0x2,0x6f,0x77, 0x2,0x6f,0x7c, 0x2,0x6f,0x72, + 0x2,0x6f,0x75, 0x1,0x7c,0x5a, 0x2,0x6f,0x79, 0x4,0x6b,0x46, + 0x2,0x70,0x22, 0x2,0x6e,0x6d, 0x4,0x6b,0x4a, 0x2,0x6f,0x73, + 0x2,0x6f,0x7d, 0x2,0x70,0x23, 0x2,0x6f,0x78, 0x2,0x6f,0x71, + 0x2,0x6f,0x7b, 0x4,0x6b,0x4b, 0x2,0x6f,0x7a, 0x2,0x70,0x21, + 0x2,0x6f,0x7e, 0x2,0x6e,0x71, 0x2,0x6f,0x76, 0x2,0x6f,0x70, + 0x2,0x6f,0x74, 0x1,0x7c,0x79, 0x1,0x7c,0x7a, 0x2,0x6f,0x6f, + 0x3,0x60,0x6c, 0x2,0x70,0x74, 0x2,0x70,0x6b, 0x2,0x70,0x73, + 0x2,0x70,0x70, 0x2,0x70,0x71, 0x2,0x70,0x6a, 0x2,0x70,0x6d, + 0x2,0x70,0x75, 0x2,0x70,0x6f, 0x2,0x70,0x6e, 0x2,0x70,0x6c, + 0x3,0x61,0x35, 0x2,0x70,0x72, 0x4,0x6c,0x56, 0x2,0x71,0x4c, + 0x4,0x6d,0x3a, 0x2,0x71,0x4d, 0x3,0x61,0x5d, 0x2,0x71,0x4f, + 0x2,0x71,0x4e, 0x2,0x71,0x51, 0x2,0x71,0x50, 0x2,0x71,0x6c, + 0x2,0x71,0x6b, 0x2,0x72,0x27, 0x3,0x62,0x29, 0x2,0x72,0x28, + 0x3,0x62,0x30, 0x2,0x72,0x34, 0x1,0x7d,0x45, 0x1,0x7d,0x49, + 0x3,0x62,0x38, 0x2,0x72,0x3d, 0x1,0x7d,0x4a, 0x1,0x5e,0x25, + 0x4,0x4f,0x48, 0x5,0x5a,0x5b, 0x1,0x7a,0x5b, 0x2,0x6d,0x37, + 0x3,0x5f,0x37, 0x1,0x7c,0x7b, 0x1,0x7c,0x7c, 0x1,0x5e,0x26, + 0x2,0x48,0x74, 0x3,0x45,0x69, 0x1,0x67,0x6e, 0x2,0x56,0x3b, + 0x3,0x50,0x2c, 0x3,0x54,0x39, 0x2,0x5c,0x3c, 0x2,0x5c,0x3d, + 0x2,0x5c,0x3b, 0x2,0x61,0x37, 0x2,0x61,0x36, 0x1,0x76,0x33, + 0x2,0x65,0x2b, 0x2,0x61,0x38, 0x2,0x65,0x2a, 0x4,0x5f,0x3a, + 0x3,0x5a,0x24, 0x2,0x68,0x60, 0x1,0x79,0x5d, 0x1,0x79,0x5f, + 0x2,0x68,0x5f, 0x3,0x5c,0x29, 0x4,0x62,0x75, 0x1,0x79,0x5e, + 0x3,0x5e,0x21, 0x2,0x6b,0x3f, 0x2,0x6b,0x41, 0x2,0x6b,0x40, + 0x2,0x6d,0x38, 0x1,0x7b,0x51, 0x3,0x5f,0x3a, 0x1,0x7c,0x5b, + 0x2,0x70,0x76, 0x2,0x71,0x52, 0x3,0x62,0x31, 0x3,0x62,0x3f, + 0x2,0x72,0x41, 0x1,0x5e,0x27, 0x3,0x25,0x47, 0x2,0x4f,0x4d, + 0x4,0x4f,0x4c, 0x1,0x70,0x2b, 0x3,0x50,0x2f, 0x3,0x50,0x2e, + 0x3,0x54,0x3a, 0x2,0x5c,0x3f, 0x2,0x5c,0x3e, 0x3,0x57,0x50, + 0x2,0x61,0x39, 0x3,0x5a,0x26, 0x3,0x5a,0x25, 0x4,0x62,0x7e, + 0x1,0x79,0x60, 0x1,0x7a,0x5c, 0x2,0x6e,0x74, 0x2,0x72,0x39, + 0x1,0x5e,0x28, 0x1,0x6b,0x7b, 0x3,0x4b,0x22, 0x1,0x70,0x2c, + 0xf,0x61,0x7c, 0x2,0x68,0x61, 0x3,0x5e,0x22, 0x2,0x70,0x24, + 0x1,0x63,0x27, 0x3,0x39,0x6a, 0x3,0x54,0x3c, 0x3,0x54,0x3b, + 0x4,0x5a,0x5d, 0x2,0x61,0x3a, 0x3,0x5a,0x28, 0x4,0x5f,0x3e, + 0x1,0x7d,0x31, 0x1,0x63,0x28, 0x1,0x70,0x2d, 0x1,0x76,0x34, + 0x2,0x70,0x25, 0x1,0x63,0x29, 0x3,0x39,0x6b, 0x2,0x56,0x3c, + 0x1,0x73,0x3d, 0x2,0x5c,0x40, 0x2,0x5c,0x41, 0x3,0x54,0x3d, + 0x1,0x73,0x3c, 0x4,0x55,0x60, 0x2,0x61,0x3b, 0x1,0x76,0x38, + 0x1,0x76,0x36, 0x1,0x76,0x37, 0x1,0x76,0x35, 0x2,0x65,0x2c, + 0x1,0x78,0x28, 0x4,0x63,0x24, 0x3,0x5c,0x2a, 0x2,0x6b,0x43, + 0x2,0x6b,0x42, 0x2,0x6b,0x45, 0x2,0x6b,0x44, 0x1,0x7a,0x5d, + 0x2,0x6d,0x39, 0x4,0x68,0x56, 0x2,0x6d,0x3b, 0x2,0x6d,0x3a, + 0x1,0x7b,0x52, 0x2,0x6e,0x75, 0x3,0x60,0x29, 0x2,0x70,0x26, + 0x2,0x70,0x27, 0x1,0x7c,0x5c, 0x2,0x71,0x53, 0x2,0x71,0x6d, + 0x1,0x7d,0x42, 0x4,0x6e,0x43, 0x2,0x41,0x55, 0x2,0x5c,0x42, + 0x2,0x61,0x3c, 0x2,0x68,0x62, 0x2,0x48,0x75, 0x3,0x27,0x72, + 0x2,0x61,0x3d, 0x2,0x65,0x2e, 0x2,0x65,0x2d, 0x3,0x5a,0x29, + 0x3,0x5c,0x2d, 0x3,0x5c,0x2e, 0x3,0x5f,0x3c, 0x2,0x70,0x28, + 0x1,0x7c,0x7d, 0x3,0x61,0x5f, 0x2,0x71,0x54, 0x2,0x71,0x6e, + 0x1,0x67,0x6f, 0x2,0x56,0x3d, 0x2,0x56,0x3e, 0x4,0x4f,0x56, + 0x2,0x5c,0x43, 0x1,0x67,0x70, 0x3,0x45,0x6a, 0x1,0x78,0x29, + 0x2,0x65,0x2f, 0x3,0x5c,0x30, 0x2,0x6d,0x3d, 0x1,0x7b,0x53, + 0x2,0x6d,0x3e, 0x2,0x6d,0x3c, 0x2,0x70,0x29, 0x3,0x61,0x60, + 0x2,0x70,0x77, 0x4,0x6d,0x48, 0x1,0x67,0x71, 0x2,0x61,0x40, + 0x2,0x61,0x3f, 0x2,0x61,0x3e, 0x2,0x65,0x30, 0x3,0x5a,0x2b, + 0x3,0x5a,0x2a, 0x2,0x65,0x34, 0x2,0x65,0x33, 0x2,0x65,0x32, + 0x2,0x65,0x31, 0x1,0x78,0x2a, 0x2,0x68,0x63, 0x2,0x6b,0x47, + 0x1,0x7a,0x5e, 0x2,0x6b,0x46, 0x2,0x6d,0x3f, 0x2,0x6e,0x78, + 0x2,0x6e,0x77, 0x1,0x7c,0x30, 0x2,0x6e,0x76, 0x2,0x70,0x2c, + 0x2,0x70,0x2b, 0x2,0x70,0x2a, 0x3,0x60,0x6d, 0x4,0x6e,0x44, + 0x1,0x6b,0x7c, 0x4,0x55,0x63, 0x2,0x5c,0x44, 0x1,0x76,0x39, + 0x4,0x5a,0x64, 0x2,0x68,0x64, 0x2,0x68,0x65, 0x2,0x6e,0x79, + 0x2,0x70,0x2d, 0x4,0x6b,0x5c, 0x3,0x61,0x3b, 0x2,0x70,0x78, + 0x2,0x71,0x55, 0x2,0x72,0x29, 0x2,0x72,0x43, 0x1,0x6b,0x7d, + 0x1,0x76,0x3a, 0x2,0x65,0x35, 0x2,0x68,0x66, 0x2,0x6d,0x40, + 0x2,0x70,0x2e, 0x3,0x23,0x70, 0x1,0x70,0x2f, 0x3,0x54,0x3e, + 0x2,0x61,0x41, 0x2,0x65,0x36, 0x2,0x68,0x67, 0x2,0x68,0x68, + 0x2,0x68,0x69, 0x2,0x6b,0x4c, 0x3,0x5e,0x24, 0x2,0x6b,0x48, + 0x1,0x7b,0x54, 0x2,0x6b,0x4b, 0x2,0x6b,0x4a, 0x1,0x7a,0x5f, + 0x2,0x6b,0x49, 0x1,0x7a,0x61, 0x1,0x7a,0x60, 0x2,0x6d,0x42, + 0x2,0x6d,0x41, 0x1,0x7b,0x55, 0x1,0x7b,0x56, 0x4,0x68,0x60, + 0x3,0x5f,0x3e, 0x1,0x7c,0x32, 0x2,0x6e,0x7a, 0x1,0x7c,0x31, + 0x4,0x6b,0x61, 0x2,0x70,0x31, 0x2,0x70,0x32, 0x2,0x70,0x30, + 0x2,0x70,0x2f, 0x1,0x7d,0x21, 0x4,0x6c,0x64, 0x2,0x70,0x79, + 0x2,0x70,0x7a, 0x2,0x70,0x7b, 0x1,0x7c,0x7e, 0x2,0x71,0x56, + 0x2,0x71,0x59, 0x2,0x71,0x58, 0x2,0x71,0x57, 0x3,0x62,0x33, + 0x4,0x6e,0x45, 0x2,0x72,0x42, 0x1,0x73,0x3e, 0x3,0x57,0x55, + 0x4,0x63,0x2d, 0x1,0x78,0x32, 0x2,0x6b,0x4d, 0x2,0x6d,0x43, + 0x3,0x60,0x2b, 0x1,0x7c,0x33, 0x2,0x6e,0x7b, 0x4,0x6e,0x55, + 0x3,0x62,0x42, 0x2,0x72,0x44, 0xf,0x21,0x59, 0x1,0x73,0x3f, + 0x3,0x5e,0x47, 0x4,0x6e,0x33, 0x2,0x61,0x42, 0x3,0x5f,0x3f, + 0x2,0x6e,0x7c, 0x3,0x61,0x61, 0x2,0x71,0x6f, 0x3,0x61,0x77, + 0xf,0x58,0x4c, 0x1,0x21,0x2b, 0x1,0x21,0x36, 0x1,0x21,0x38, + 0x1,0x21,0x40, 0x1,0x21,0x41, 0x1,0x21,0x44, 0x1,0x21,0x45, + 0x1,0x21,0x48, 0x1,0x21,0x49, 0x1,0x21,0x4c, 0x1,0x21,0x4d, + 0x1,0x21,0x50, 0x1,0x21,0x51, 0x1,0x21,0x54, 0x1,0x21,0x55, + 0x1,0x21,0x58, 0x1,0x21,0x59, 0x1,0x21,0x5c, 0x1,0x21,0x5d, + 0x1,0x22,0x27, 0x1,0x22,0x28, 0x1,0x22,0x2b, 0x1,0x22,0x2c, + 0x1,0x22,0x29, 0x1,0x22,0x2a, 0x1,0x21,0x2e, 0x1,0x21,0x2f, + 0x1,0x21,0x30, 0x1,0x21,0x32, 0x1,0x21,0x33, 0x1,0x21,0x34, + 0x1,0x21,0x35, 0x1,0x21,0x5e, 0x1,0x21,0x5f, 0x1,0x21,0x60, + 0x1,0x21,0x61, 0x1,0x21,0x62, 0x1,0x21,0x63, 0x1,0x22,0x2d, + 0x1,0x22,0x2e, 0x1,0x22,0x2f, 0x1,0x22,0x3f, 0x1,0x22,0x40, + 0x1,0x22,0x41, 0x1,0x22,0x43, 0x1,0x22,0x42, 0x1,0x22,0x62, + 0x1,0x22,0x6c, 0x1,0x22,0x6d, 0x1,0x22,0x6e, 0x1,0x21,0x2a, + 0x1,0x21,0x6c, 0x1,0x22,0x63, 0x1,0x22,0x68, 0x1,0x21,0x6d, + 0x1,0x21,0x3e, 0x1,0x21,0x3f, 0x1,0x21,0x6e, 0x1,0x22,0x30, + 0x1,0x21,0x22, 0x1,0x22,0x31, 0x1,0x21,0x25, 0x1,0x22,0x5f, + 0x1,0x24,0x21, 0x1,0x24,0x22, 0x1,0x24,0x23, 0x1,0x24,0x24, + 0x1,0x24,0x25, 0x1,0x24,0x26, 0x1,0x24,0x27, 0x1,0x24,0x28, + 0x1,0x24,0x29, 0x1,0x24,0x2a, 0x1,0x21,0x28, 0x1,0x21,0x27, + 0x1,0x22,0x36, 0x1,0x22,0x38, 0x1,0x22,0x37, 0x1,0x21,0x29, + 0x1,0x22,0x69, 0x1,0x24,0x41, 0x1,0x24,0x42, 0x1,0x24,0x43, + 0x1,0x24,0x44, 0x1,0x24,0x45, 0x1,0x24,0x46, 0x1,0x24,0x47, + 0x1,0x24,0x48, 0x1,0x24,0x49, 0x1,0x24,0x4a, 0x1,0x24,0x4b, + 0x1,0x24,0x4c, 0x1,0x24,0x4d, 0x1,0x24,0x4e, 0x1,0x24,0x4f, + 0x1,0x24,0x50, 0x1,0x24,0x51, 0x1,0x24,0x52, 0x1,0x24,0x53, + 0x1,0x24,0x54, 0x1,0x24,0x55, 0x1,0x24,0x56, 0x1,0x24,0x57, + 0x1,0x24,0x58, 0x1,0x24,0x59, 0x1,0x24,0x5a, 0x1,0x22,0x60, + 0x1,0x22,0x25, 0x1,0x24,0x5b, 0x1,0x24,0x5c, 0x1,0x24,0x5d, + 0x1,0x24,0x5e, 0x1,0x24,0x5f, 0x1,0x24,0x60, 0x1,0x24,0x61, + 0x1,0x24,0x62, 0x1,0x24,0x63, 0x1,0x24,0x64, 0x1,0x24,0x65, + 0x1,0x24,0x66, 0x1,0x24,0x67, 0x1,0x24,0x68, 0x1,0x24,0x69, + 0x1,0x24,0x6a, 0x1,0x24,0x6b, 0x1,0x24,0x6c, 0x1,0x24,0x6d, + 0x1,0x24,0x6e, 0x1,0x24,0x6f, 0x1,0x24,0x70, 0x1,0x24,0x71, + 0x1,0x24,0x72, 0x1,0x24,0x73, 0x1,0x24,0x74, 0x1,0x21,0x42, + 0x1,0x22,0x5e, 0x1,0x21,0x43, 0x1,0x22,0x66, 0x1,0x22,0x67, + 0x1,0x22,0x64, 0x5,0x21,0x25, 0xf,0x21,0x21, 0x6,0x21,0x2f, + 0x6,0x21,0x2d, 0x6,0x21,0x2e, 0x6,0x21,0x42, 0x6,0x21,0x43, + 0x5,0x21,0x33, 0x3,0x21,0x44, 0xf,0x21,0x3e, 0xf,0x21,0x3f, + 0x6,0x22,0x2b, 0x5,0x21,0x4d, 0x6,0x23,0x40, 0x6,0x23,0x3e, + 0x6,0x23,0x3f, 0x6,0x24,0x67, 0x6,0x25,0x5f, 0x5,0x23,0x2f, + 0xf,0x22,0x74, 0x6,0x25,0x67, 0x6,0x25,0x63, 0x6,0x29,0x37, + 0x6,0x29,0x3a, 0x6,0x29,0x38, 0xf,0x29,0x22, 0xf,0x29,0x23, + 0x6,0x2e,0x66, 0x5,0x30,0x72, 0x5,0x33,0x23, 0xf,0x39,0x32, + 0xf,0x39,0x33, 0x6,0x47,0x2d, 0xf,0x3b,0x73, 0xf,0x40,0x35, + 0xf,0x40,0x75, 0xf,0x47,0x42, 0xf,0x4d,0x56, 0x7,0x21,0x21, + 0xf,0x59,0x47, 0x4,0x4f,0x7c, 0xf,0x5a,0x3f, 0x6,0x21,0x2c, + 0x6,0x21,0x22, 0x6,0x22,0x5f, 0x4,0x21,0x56, 0x6,0x23,0x41, + 0x6,0x25,0x60, 0x6,0x29,0x3b, 0x5,0x25,0x21, 0x5,0x27,0x7a, + 0x6,0x2e,0x4a, 0xf,0x29,0x50, 0x6,0x35,0x25, 0x6,0x35,0x26, + 0x6,0x45,0x7d, 0x6,0x46,0x3f, 0xf,0x46,0x40, 0x5,0x44,0x7e, + 0x6,0x21,0x32, 0x5,0x21,0x2d, 0x6,0x22,0x2d, 0x6,0x23,0x42, + 0xf,0x2d,0x61, 0x6,0x50,0x50, 0xf,0x53,0x44, 0x4,0x21,0x21, + 0x5,0x21,0x26, 0x6,0x21,0x24, 0xf,0x21,0x22, 0x6,0x21,0x33, + 0x6,0x21,0x44, 0xf,0x21,0x25, 0xf,0x21,0x26, 0x5,0x21,0x4e, + 0x6,0x22,0x30, 0xf,0x21,0x45, 0x6,0x22,0x4e, 0x6,0x22,0x2f, + 0xf,0x21,0x40, 0xf,0x21,0x41, 0x6,0x21,0x45, 0x6,0x22,0x31, + 0x6,0x22,0x2e, 0x4,0x22,0x26, 0x4,0x22,0x25, 0x5,0x22,0x24, + 0x5,0x22,0x25, 0x6,0x23,0x43, 0x6,0x29,0x3e, 0x6,0x24,0x5d, + 0x6,0x25,0x56, 0x6,0x25,0x61, 0x6,0x25,0x62, 0x6,0x2c,0x43, + 0x6,0x29,0x3c, 0x6,0x3a,0x65, 0xf,0x29,0x25, 0x6,0x2d,0x2d, + 0x6,0x29,0x3d, 0x6,0x2e,0x4b, 0x5,0x2b,0x67, 0x6,0x35,0x2a, + 0x6,0x35,0x27, 0x6,0x39,0x64, 0x6,0x35,0x29, 0x6,0x3c,0x7b, + 0x6,0x45,0x7e, 0x6,0x46,0x40, 0x6,0x46,0x41, 0x5,0x3d,0x56, + 0x5,0x21,0x23, 0x5,0x21,0x22, 0x6,0x21,0x26, 0x6,0x21,0x25, + 0x5,0x21,0x21, 0x5,0x21,0x2b, 0xf,0x21,0x23, 0x6,0x21,0x46, + 0x5,0x21,0x34, 0xf,0x21,0x27, 0xf,0x21,0x28, 0x6,0x22,0x33, + 0x6,0x22,0x32, 0x6,0x22,0x2a, 0x5,0x21,0x4f, 0x6,0x23,0x46, + 0x6,0x23,0x44, 0xf,0x21,0x6e, 0x6,0x23,0x45, 0xf,0x22,0x75, + 0x6,0x29,0x3f, 0x6,0x2d,0x2c, 0x4,0x26,0x24, 0x6,0x2e,0x4d, + 0x6,0x2e,0x4e, 0xf,0x25,0x40, 0x6,0x2e,0x4c, 0x6,0x35,0x2b, + 0xf,0x2d,0x60, 0x6,0x3c,0x7e, 0x5,0x30,0x73, 0x6,0x3c,0x7d, + 0xf,0x39,0x34, 0x6,0x50,0x51, 0x5,0x44,0x55, 0xf,0x46,0x41, + 0x6,0x5a,0x63, 0x6,0x5a,0x62, 0x7,0x36,0x73, 0x7,0x46,0x27, + 0x7,0x4d,0x3a, 0x5,0x21,0x24, 0x5,0x21,0x27, 0x4,0x21,0x28, + 0x5,0x21,0x28, 0x5,0x21,0x2c, 0x6,0x21,0x47, 0x6,0x21,0x48, + 0x6,0x21,0x49, 0x6,0x23,0x47, 0x5,0x23,0x30, 0x6,0x25,0x64, + 0x6,0x29,0x40, 0x5,0x30,0x74, 0x6,0x46,0x42, 0x7,0x2c,0x3c, + 0x6,0x21,0x27, 0x6,0x21,0x28, 0x6,0x21,0x29, 0x6,0x21,0x4a, + 0x6,0x25,0x65, 0x6,0x23,0x48, 0x6,0x23,0x49, 0x6,0x25,0x68, + 0xf,0x22,0x76, 0x4,0x25,0x33, 0x5,0x25,0x22, 0x4,0x25,0x32, + 0x6,0x2e,0x50, 0x5,0x27,0x7b, 0xf,0x29,0x27, 0x6,0x30,0x7c, + 0x6,0x35,0x2d, 0x6,0x35,0x2c, 0xf,0x2d,0x62, 0x6,0x3d,0x21, + 0xf,0x4d,0x6e, 0x6,0x23,0x4a, 0xf,0x21,0x6f, 0xf,0x21,0x70, + 0xf,0x22,0x2b, 0x5,0x23,0x31, 0xf,0x22,0x77, 0xf,0x22,0x78, + 0xf,0x22,0x79, 0x5,0x25,0x23, 0x6,0x29,0x41, 0xf,0x25,0x43, + 0x6,0x2e,0x52, 0x6,0x2e,0x51, 0xf,0x29,0x28, 0x6,0x35,0x2f, + 0x5,0x2c,0x66, 0x4,0x2b,0x5f, 0x6,0x35,0x30, 0xf,0x2d,0x63, + 0x6,0x35,0x31, 0x6,0x46,0x43, 0x6,0x3d,0x23, 0x6,0x3d,0x22, + 0x4,0x30,0x44, 0x5,0x30,0x75, 0xf,0x32,0x74, 0xf,0x32,0x75, + 0xf,0x32,0x72, 0x6,0x46,0x45, 0x6,0x46,0x44, 0x6,0x46,0x46, + 0x4,0x36,0x2f, 0xf,0x39,0x35, 0xf,0x39,0x36, 0xf,0x39,0x37, + 0x6,0x4c,0x2d, 0xf,0x40,0x36, 0xf,0x40,0x37, 0xf,0x40,0x38, + 0xf,0x46,0x42, 0x6,0x50,0x52, 0x5,0x4b,0x71, 0x7,0x21,0x22, + 0xf,0x4d,0x57, 0xf,0x4d,0x58, 0xf,0x4d,0x59, 0x7,0x26,0x79, + 0x7,0x21,0x24, 0x7,0x21,0x23, 0x7,0x21,0x46, 0x7,0x2c,0x3f, + 0x5,0x53,0x53, 0x7,0x2c,0x3e, 0x7,0x2c,0x3d, 0x7,0x46,0x23, + 0x7,0x46,0x28, 0x6,0x21,0x34, 0x6,0x21,0x35, 0xf,0x21,0x24, + 0x6,0x21,0x4c, 0xf,0x21,0x29, 0x6,0x21,0x4b, 0x3,0x21,0x6f, + 0xf,0x21,0x43, 0x6,0x22,0x35, 0x6,0x22,0x34, 0x6,0x22,0x36, + 0x4,0x21,0x58, 0x4,0x22,0x2c, 0x4,0x22,0x2b, 0x4,0x22,0x29, + 0x6,0x23,0x4f, 0x4,0x22,0x30, 0x6,0x23,0x50, 0x5,0x22,0x27, + 0x6,0x23,0x4d, 0x6,0x23,0x4c, 0x4,0x22,0x2f, 0x6,0x23,0x4b, + 0xf,0x21,0x73, 0xf,0x21,0x74, 0xf,0x21,0x75, 0xf,0x21,0x76, + 0xf,0x21,0x77, 0xf,0x21,0x78, 0xf,0x21,0x79, 0x5,0x22,0x28, + 0x6,0x23,0x51, 0x5,0x22,0x26, 0xf,0x21,0x7a, 0x5,0x23,0x32, + 0x6,0x25,0x6a, 0x4,0x23,0x3a, 0x6,0x25,0x6b, 0x6,0x25,0x74, + 0x6,0x25,0x70, 0x6,0x25,0x6c, 0xf,0x22,0x7a, 0xf,0x22,0x7b, + 0xf,0x22,0x7c, 0xf,0x22,0x7d, 0xf,0x23,0x21, 0xf,0x23,0x22, + 0xf,0x23,0x23, 0xf,0x23,0x25, 0xf,0x23,0x28, 0xf,0x23,0x29, + 0xf,0x23,0x2a, 0xf,0x23,0x2b, 0xf,0x23,0x2c, 0x4,0x23,0x38, + 0x6,0x25,0x6d, 0x6,0x25,0x6f, 0xf,0x23,0x26, 0x6,0x25,0x6e, + 0x6,0x25,0x69, 0x5,0x23,0x33, 0x6,0x25,0x73, 0x6,0x29,0x43, + 0x6,0x29,0x45, 0x4,0x25,0x3a, 0x5,0x25,0x28, 0x6,0x29,0x46, + 0x5,0x25,0x29, 0x3,0x27,0x4e, 0x5,0x25,0x2a, 0x4,0x25,0x37, + 0x4,0x25,0x35, 0x6,0x29,0x4a, 0x6,0x29,0x44, 0x6,0x29,0x4c, + 0x6,0x29,0x47, 0x6,0x29,0x4e, 0x5,0x25,0x26, 0x6,0x29,0x42, + 0xf,0x25,0x45, 0xf,0x25,0x46, 0xf,0x25,0x48, 0xf,0x25,0x49, + 0xf,0x25,0x4b, 0xf,0x25,0x4c, 0xf,0x25,0x4d, 0xf,0x25,0x4e, + 0xf,0x25,0x4f, 0xf,0x25,0x50, 0xf,0x25,0x51, 0x6,0x29,0x4d, + 0x6,0x29,0x48, 0x6,0x29,0x49, 0x6,0x29,0x4b, 0x5,0x25,0x24, + 0x5,0x25,0x27, 0x5,0x27,0x7c, 0x6,0x2e,0x64, 0x6,0x2e,0x59, + 0x5,0x2b,0x72, 0x4,0x28,0x36, 0x6,0x2e,0x63, 0x6,0x2e,0x57, + 0x6,0x2e,0x56, 0x5,0x28,0x23, 0x4,0x28,0x3b, 0x6,0x2e,0x5d, + 0x5,0x27,0x7e, 0x5,0x27,0x7d, 0x5,0x28,0x22, 0x6,0x2e,0x62, + 0x6,0x2e,0x55, 0x6,0x2e,0x54, 0x6,0x2e,0x65, 0x6,0x2e,0x5c, + 0xf,0x29,0x29, 0xf,0x29,0x2a, 0xf,0x29,0x2b, 0xf,0x29,0x2c, + 0xf,0x29,0x2e, 0xf,0x29,0x2f, 0xf,0x29,0x31, 0xf,0x29,0x32, + 0xf,0x29,0x33, 0xf,0x29,0x34, 0xf,0x29,0x35, 0xf,0x29,0x36, + 0xf,0x29,0x37, 0xf,0x29,0x38, 0x6,0x2e,0x53, 0x6,0x2e,0x58, + 0x6,0x2e,0x5b, 0x6,0x2e,0x5e, 0x6,0x2e,0x60, 0xf,0x25,0x47, + 0x6,0x2e,0x5f, 0x5,0x28,0x24, 0x4,0x2b,0x63, 0x5,0x2b,0x70, + 0x4,0x2b,0x67, 0x6,0x35,0x36, 0x5,0x2b,0x6b, 0x6,0x35,0x35, + 0x5,0x2b,0x74, 0x4,0x2b,0x66, 0x4,0x2b,0x68, 0x5,0x2b,0x6f, + 0x6,0x35,0x32, 0x5,0x2b,0x69, 0xf,0x2d,0x64, 0xf,0x2d,0x6e, + 0x6,0x35,0x37, 0x5,0x2b,0x6e, 0xf,0x2d,0x66, 0xf,0x2d,0x67, + 0xf,0x2d,0x6a, 0xf,0x2d,0x6b, 0xf,0x2d,0x6c, 0xf,0x2d,0x6d, + 0xf,0x2d,0x6f, 0xf,0x2d,0x71, 0xf,0x2d,0x72, 0xf,0x2d,0x73, + 0xf,0x2d,0x74, 0xf,0x2d,0x75, 0xf,0x2d,0x76, 0xf,0x2d,0x78, + 0xf,0x2d,0x79, 0xf,0x2d,0x7a, 0xf,0x2d,0x7b, 0xf,0x2d,0x7c, + 0x6,0x35,0x21, 0x6,0x35,0x3a, 0x6,0x35,0x3b, 0x6,0x35,0x33, + 0x6,0x35,0x34, 0x5,0x2b,0x68, 0x6,0x35,0x39, 0xf,0x2d,0x77, + 0xf,0x2d,0x70, 0x5,0x2b,0x6a, 0x5,0x2b,0x6d, 0x5,0x2b,0x75, + 0x5,0x2b,0x71, 0x5,0x2b,0x73, 0x4,0x2b,0x60, 0x6,0x3d,0x2b, + 0x6,0x3d,0x2d, 0x6,0x3d,0x2c, 0x4,0x30,0x49, 0x4,0x30,0x48, + 0x6,0x3d,0x30, 0x6,0x3d,0x28, 0x5,0x31,0x21, 0x6,0x3d,0x33, + 0x5,0x30,0x77, 0x6,0x3d,0x2e, 0x6,0x3d,0x27, 0x5,0x31,0x22, + 0x5,0x30,0x76, 0x4,0x30,0x46, 0x6,0x3d,0x2a, 0x6,0x3d,0x31, + 0x6,0x3d,0x37, 0x6,0x3d,0x32, 0x6,0x3d,0x29, 0x4,0x30,0x4b, + 0x6,0x3d,0x34, 0xf,0x2d,0x69, 0xf,0x32,0x77, 0xf,0x32,0x78, + 0xf,0x32,0x79, 0xf,0x32,0x7a, 0xf,0x32,0x7b, 0xf,0x32,0x7c, + 0xf,0x32,0x7e, 0xf,0x33,0x21, 0xf,0x33,0x23, 0xf,0x33,0x24, + 0xf,0x33,0x25, 0xf,0x33,0x26, 0xf,0x33,0x27, 0x6,0x46,0x37, + 0x6,0x3d,0x38, 0x6,0x3e,0x65, 0x6,0x3d,0x39, 0x6,0x3d,0x2f, + 0x5,0x30,0x7a, 0x6,0x43,0x63, 0x5,0x30,0x7d, 0x5,0x31,0x23, + 0x6,0x3d,0x24, 0x6,0x3d,0x26, 0xf,0x32,0x7d, 0x5,0x30,0x79, + 0x5,0x30,0x7e, 0x5,0x30,0x78, 0x6,0x3d,0x25, 0x6,0x3d,0x36, + 0x5,0x30,0x7c, 0x6,0x46,0x49, 0x6,0x46,0x4f, 0x5,0x36,0x56, + 0x5,0x36,0x51, 0x6,0x46,0x4c, 0x5,0x36,0x4e, 0x5,0x36,0x52, + 0x5,0x36,0x63, 0x5,0x36,0x53, 0x6,0x46,0x48, 0x5,0x36,0x55, + 0x5,0x36,0x50, 0x6,0x46,0x56, 0x4,0x36,0x35, 0x5,0x36,0x54, + 0x6,0x46,0x52, 0x6,0x46,0x50, 0x6,0x46,0x4b, 0x6,0x46,0x4e, + 0x6,0x46,0x53, 0xf,0x32,0x76, 0x6,0x46,0x58, 0x5,0x36,0x4f, + 0x5,0x36,0x57, 0x6,0x46,0x47, 0xf,0x39,0x38, 0xf,0x39,0x39, + 0xf,0x39,0x3a, 0xf,0x39,0x3b, 0xf,0x39,0x3c, 0xf,0x39,0x3d, + 0xf,0x39,0x3e, 0xf,0x39,0x3f, 0x6,0x46,0x4d, 0x4,0x36,0x3b, + 0x6,0x46,0x51, 0x6,0x46,0x54, 0x5,0x36,0x4d, 0x6,0x46,0x4a, + 0x5,0x34,0x21, 0x6,0x50,0x5a, 0x4,0x42,0x38, 0x5,0x3d,0x5a, + 0x5,0x3d,0x58, 0x6,0x50,0x53, 0x5,0x30,0x7b, 0x5,0x3d,0x5e, + 0x5,0x3d,0x5c, 0x6,0x50,0x58, 0x5,0x3d,0x5b, 0x6,0x50,0x5f, + 0x6,0x50,0x5d, 0x4,0x3c,0x2e, 0x6,0x50,0x5c, 0x6,0x50,0x62, + 0x6,0x50,0x55, 0x4,0x3c,0x2f, 0x5,0x3d,0x60, 0x6,0x50,0x54, + 0x5,0x3d,0x57, 0x6,0x50,0x57, 0x6,0x50,0x5e, 0xf,0x40,0x39, + 0xf,0x40,0x3a, 0xf,0x40,0x3b, 0xf,0x40,0x3c, 0xf,0x40,0x3d, + 0xf,0x40,0x3e, 0xf,0x40,0x3f, 0xf,0x40,0x40, 0xf,0x40,0x41, + 0xf,0x40,0x42, 0xf,0x40,0x43, 0xf,0x40,0x44, 0xf,0x40,0x45, + 0xf,0x40,0x46, 0x6,0x50,0x61, 0x6,0x56,0x4e, 0x6,0x50,0x59, + 0x6,0x50,0x56, 0x6,0x46,0x57, 0x5,0x3d,0x59, 0x5,0x3d,0x5d, + 0x5,0x3d,0x5f, 0x4,0x3c,0x2b, 0x6,0x50,0x60, 0x6,0x5a,0x71, + 0x5,0x3d,0x61, 0x7,0x21,0x2e, 0x4,0x42,0x34, 0x5,0x44,0x56, + 0x6,0x5a,0x64, 0x6,0x5a,0x69, 0x5,0x3d,0x62, 0x6,0x5a,0x6b, + 0x4,0x42,0x39, 0x6,0x5a,0x74, 0x4,0x42,0x31, 0x6,0x5a,0x75, + 0x6,0x5a,0x68, 0x6,0x5a,0x67, 0x6,0x5a,0x76, 0xf,0x46,0x43, + 0xf,0x46,0x44, 0xf,0x46,0x45, 0xf,0x46,0x46, 0xf,0x46,0x47, + 0xf,0x46,0x49, 0xf,0x46,0x4a, 0xf,0x46,0x4b, 0xf,0x46,0x4c, + 0xf,0x46,0x4d, 0xf,0x46,0x4e, 0xf,0x46,0x4f, 0xf,0x46,0x51, + 0xf,0x46,0x52, 0xf,0x46,0x53, 0xf,0x46,0x54, 0xf,0x46,0x56, + 0xf,0x46,0x57, 0xf,0x46,0x58, 0xf,0x53,0x45, 0x7,0x26,0x2d, + 0x5,0x44,0x58, 0x6,0x5a,0x77, 0x6,0x5e,0x57, 0x6,0x5a,0x6d, + 0x6,0x5a,0x6f, 0x6,0x5a,0x65, 0xf,0x46,0x50, 0xf,0x46,0x48, + 0xf,0x46,0x55, 0x4,0x42,0x30, 0x6,0x5a,0x66, 0x6,0x5a,0x6a, + 0x6,0x5a,0x6e, 0x6,0x5a,0x70, 0x4,0x42,0x36, 0x5,0x3f,0x46, + 0x4,0x48,0x7e, 0x4,0x48,0x7a, 0x6,0x5a,0x6c, 0x7,0x21,0x2f, + 0x7,0x21,0x31, 0x7,0x21,0x29, 0x7,0x21,0x26, 0x7,0x21,0x25, + 0x5,0x4b,0x77, 0x4,0x48,0x7c, 0x7,0x21,0x2b, 0x7,0x21,0x2c, + 0x5,0x4b,0x73, 0x7,0x21,0x2a, 0x5,0x4b,0x79, 0x5,0x4b,0x78, + 0x7,0x21,0x27, 0xf,0x4d,0x5a, 0xf,0x4d,0x5b, 0xf,0x4d,0x5c, + 0xf,0x4d,0x5d, 0xf,0x4d,0x5e, 0xf,0x4d,0x60, 0xf,0x4d,0x61, + 0x7,0x21,0x28, 0x5,0x4b,0x72, 0x7,0x21,0x2d, 0xf,0x4d,0x62, + 0x4,0x49,0x21, 0x5,0x4b,0x75, 0x7,0x21,0x30, 0x5,0x4b,0x74, + 0x5,0x4c,0x45, 0x5,0x53,0x54, 0x5,0x53,0x5a, 0x7,0x2c,0x40, + 0x4,0x4f,0x58, 0x4,0x4f,0x5f, 0x5,0x53,0x58, 0x4,0x4f,0x5c, + 0x4,0x4f,0x5e, 0x5,0x53,0x55, 0x5,0x53,0x56, 0xf,0x53,0x46, + 0xf,0x53,0x47, 0xf,0x53,0x48, 0xf,0x53,0x49, 0xf,0x53,0x4a, + 0x5,0x53,0x5b, 0x5,0x53,0x57, 0x7,0x36,0x78, 0x5,0x4b,0x76, + 0x5,0x5a,0x6f, 0x5,0x5a,0x70, 0x4,0x55,0x67, 0x4,0x55,0x66, + 0x7,0x36,0x76, 0xf,0x59,0x48, 0xf,0x59,0x4a, 0xf,0x59,0x4b, + 0xf,0x59,0x4c, 0xf,0x59,0x4e, 0x7,0x36,0x75, 0x7,0x36,0x77, + 0xf,0x59,0x49, 0x4,0x55,0x68, 0x7,0x36,0x74, 0x7,0x3e,0x76, + 0x4,0x5a,0x6b, 0x4,0x5a,0x69, 0x4,0x5a,0x6a, 0x7,0x3e,0x78, + 0x7,0x3e,0x77, 0xf,0x5e,0x30, 0xf,0x5e,0x31, 0xf,0x5e,0x2c, + 0xf,0x5e,0x2e, 0xf,0x5e,0x2f, 0x7,0x3e,0x75, 0x5,0x61,0x31, + 0x4,0x5a,0x6c, 0x5,0x61,0x2f, 0x5,0x61,0x30, 0x5,0x61,0x32, + 0x5,0x67,0x4a, 0x5,0x67,0x4e, 0x4,0x63,0x2e, 0x5,0x67,0x4d, + 0x5,0x67,0x4f, 0xf,0x61,0x7e, 0xf,0x62,0x21, 0x7,0x47,0x6f, + 0x5,0x67,0x4c, 0x5,0x67,0x4b, 0x5,0x69,0x7c, 0x7,0x52,0x75, + 0x7,0x4d,0x3c, 0xf,0x64,0x7a, 0x5,0x6b,0x6b, 0x7,0x4d,0x3b, + 0x7,0x4d,0x68, 0x4,0x66,0x2f, 0x4,0x66,0x2e, 0x5,0x6f,0x68, + 0x7,0x57,0x4e, 0x5,0x6b,0x6c, 0xf,0x67,0x3f, 0xf,0x67,0x7e, + 0x4,0x66,0x2d, 0x7,0x57,0x4d, 0xf,0x69,0x38, 0xf,0x69,0x3a, + 0xf,0x69,0x39, 0x5,0x73,0x31, 0x4,0x6a,0x40, 0x7,0x5b,0x45, + 0xf,0x6a,0x4b, 0xf,0x6b,0x41, 0x5,0x75,0x62, 0x4,0x6d,0x52, + 0xf,0x6c,0x49, 0x6,0x21,0x4d, 0x4,0x21,0x5c, 0x4,0x22,0x32, + 0x6,0x23,0x53, 0x6,0x23,0x54, 0x6,0x25,0x75, 0x6,0x25,0x77, + 0x6,0x25,0x78, 0x5,0x23,0x35, 0x6,0x25,0x76, 0x6,0x29,0x51, + 0x6,0x29,0x50, 0x6,0x29,0x4f, 0x6,0x29,0x53, 0xf,0x25,0x53, + 0x6,0x29,0x52, 0xf,0x25,0x52, 0x6,0x2e,0x67, 0x6,0x2e,0x68, + 0x5,0x2b,0x76, 0xf,0x2d,0x7d, 0xf,0x2d,0x7e, 0xf,0x2e,0x21, + 0x6,0x35,0x3c, 0xf,0x33,0x28, 0x5,0x31,0x24, 0x5,0x31,0x25, + 0xf,0x33,0x29, 0xf,0x33,0x2a, 0x6,0x46,0x59, 0xf,0x39,0x40, + 0xf,0x39,0x41, 0xf,0x39,0x42, 0x5,0x36,0x58, 0xf,0x39,0x43, + 0xf,0x40,0x47, 0x6,0x50,0x63, 0xf,0x40,0x48, 0xf,0x46,0x59, + 0xf,0x46,0x5a, 0x5,0x44,0x59, 0x7,0x21,0x34, 0x7,0x21,0x32, + 0x5,0x4b,0x7b, 0xf,0x4d,0x63, 0xf,0x4d,0x64, 0x5,0x4b,0x7a, + 0x7,0x21,0x33, 0x5,0x53,0x5c, 0x7,0x2c,0x41, 0xf,0x53,0x4b, + 0xf,0x53,0x4c, 0xf,0x53,0x4d, 0xf,0x53,0x4e, 0x5,0x5a,0x71, + 0xf,0x59,0x4f, 0xf,0x59,0x50, 0xf,0x59,0x51, 0x7,0x3e,0x79, + 0x5,0x61,0x33, 0xf,0x5e,0x32, 0x7,0x46,0x29, 0x5,0x67,0x50, + 0xf,0x64,0x7b, 0x5,0x67,0x51, 0x5,0x6b,0x6d, 0xf,0x67,0x41, + 0xf,0x69,0x3b, 0xf,0x6a,0x4c, 0x5,0x77,0x53, 0xf,0x6b,0x42, + 0x6,0x21,0x36, 0x5,0x21,0x36, 0x5,0x21,0x35, 0x6,0x22,0x37, + 0x6,0x23,0x56, 0x6,0x23,0x55, 0x5,0x23,0x36, 0x6,0x25,0x79, + 0x5,0x23,0x38, 0x5,0x28,0x25, 0x5,0x28,0x26, 0x4,0x2b,0x6a, + 0x6,0x35,0x3d, 0xf,0x2e,0x22, 0xf,0x2e,0x23, 0x6,0x3d,0x3a, + 0x6,0x46,0x5a, 0x6,0x50,0x64, 0x5,0x3d,0x63, 0x4,0x3c,0x31, + 0x6,0x5a,0x78, 0x5,0x5a,0x72, 0x6,0x21,0x37, 0x6,0x21,0x4e, + 0x5,0x21,0x37, 0x6,0x21,0x41, 0x6,0x21,0x59, 0x5,0x21,0x50, + 0x6,0x23,0x3b, 0x4,0x22,0x35, 0x6,0x23,0x57, 0x6,0x25,0x7c, + 0x6,0x25,0x7e, 0x5,0x23,0x39, 0xf,0x23,0x2d, 0x6,0x25,0x7a, + 0x6,0x29,0x54, 0x6,0x2e,0x6b, 0x6,0x2e,0x69, 0x5,0x28,0x27, + 0x6,0x2e,0x6a, 0x6,0x2e,0x4f, 0x6,0x30,0x7b, 0x6,0x35,0x40, + 0x6,0x35,0x3f, 0x6,0x35,0x41, 0x6,0x35,0x3e, 0x6,0x3d,0x3b, + 0x6,0x46,0x5d, 0x5,0x3d,0x64, 0xf,0x39,0x44, 0xf,0x39,0x45, + 0x6,0x46,0x5b, 0x6,0x46,0x5c, 0x5,0x3d,0x65, 0x6,0x50,0x65, + 0xf,0x40,0x49, 0xf,0x40,0x4a, 0x4,0x42,0x3a, 0x6,0x5a,0x79, + 0xf,0x54,0x46, 0xf,0x53,0x4f, 0xf,0x53,0x50, 0x5,0x61,0x34, + 0xf,0x5e,0x33, 0x7,0x46,0x2a, 0x7,0x46,0x2b, 0x4,0x21,0x2d, + 0x6,0x21,0x4f, 0x6,0x21,0x51, 0x6,0x22,0x39, 0x4,0x21,0x5d, + 0x6,0x22,0x38, 0x5,0x21,0x52, 0xf,0x21,0x46, 0x6,0x22,0x3a, + 0x5,0x21,0x51, 0x6,0x23,0x5a, 0x6,0x23,0x58, 0x6,0x25,0x47, + 0x6,0x26,0x23, 0x6,0x26,0x21, 0x6,0x26,0x22, 0x5,0x23,0x3a, + 0x6,0x28,0x7a, 0x5,0x25,0x2c, 0x6,0x29,0x55, 0x6,0x29,0x56, + 0x6,0x2e,0x6c, 0x6,0x35,0x42, 0x6,0x35,0x43, 0x5,0x2b,0x77, + 0x5,0x2b,0x78, 0x6,0x3d,0x3d, 0x6,0x46,0x5f, 0x3,0x39,0x77, + 0x6,0x46,0x5e, 0x4,0x3c,0x33, 0x5,0x3d,0x66, 0x6,0x5a,0x7b, + 0x6,0x5a,0x7a, 0x7,0x21,0x35, 0x5,0x53,0x5d, 0x7,0x2c,0x42, + 0xf,0x55,0x76, 0x4,0x5a,0x6d, 0xf,0x67,0x42, 0x7,0x57,0x4f, + 0x5,0x21,0x38, 0x6,0x22,0x3b, 0xf,0x21,0x48, 0xf,0x21,0x49, + 0x6,0x23,0x5b, 0x4,0x22,0x37, 0x5,0x22,0x29, 0xf,0x21,0x7b, + 0xf,0x23,0x2e, 0xf,0x23,0x2f, 0x5,0x25,0x2d, 0xf,0x25,0x55, + 0x6,0x2e,0x6d, 0x6,0x3d,0x3e, 0xf,0x2e,0x25, 0xf,0x2e,0x26, + 0xf,0x2e,0x27, 0xf,0x2e,0x28, 0xf,0x2e,0x29, 0x5,0x31,0x27, + 0x6,0x46,0x60, 0xf,0x39,0x47, 0xf,0x39,0x48, 0x6,0x46,0x61, + 0xf,0x3a,0x5d, 0x6,0x50,0x66, 0x6,0x5a,0x7c, 0xf,0x46,0x5b, + 0x5,0x4e,0x77, 0x7,0x2c,0x43, 0xf,0x59,0x52, 0xf,0x53,0x51, + 0x7,0x3e,0x7a, 0x7,0x46,0x2c, 0x7,0x4d,0x3f, 0x5,0x6f,0x69, + 0x5,0x75,0x63, 0xf,0x21,0x4a, 0x6,0x23,0x5c, 0xf,0x21,0x7d, + 0xf,0x21,0x7e, 0x4,0x22,0x38, 0x5,0x23,0x3b, 0x6,0x26,0x24, + 0x4,0x23,0x3c, 0xf,0x23,0x30, 0xf,0x23,0x31, 0xf,0x23,0x32, + 0xf,0x23,0x33, 0xf,0x23,0x24, 0xf,0x22,0x7e, 0x4,0x25,0x41, + 0x4,0x25,0x42, 0x6,0x29,0x58, 0x6,0x29,0x59, 0x5,0x25,0x2f, + 0xf,0x25,0x57, 0x5,0x28,0x29, 0x4,0x28,0x41, 0x4,0x28,0x42, + 0x5,0x28,0x2c, 0x5,0x28,0x28, 0x5,0x28,0x2a, 0x6,0x2e,0x6f, + 0xf,0x29,0x3a, 0xf,0x29,0x3c, 0xf,0x29,0x3d, 0xf,0x29,0x3e, + 0xf,0x29,0x3f, 0x6,0x2e,0x6e, 0x5,0x2b,0x7a, 0x4,0x2b,0x6b, + 0x5,0x2b,0x79, 0x5,0x28,0x2b, 0x6,0x35,0x45, 0x5,0x2b,0x7b, + 0xf,0x2e,0x2a, 0xf,0x2e,0x2b, 0x6,0x35,0x46, 0x5,0x31,0x28, + 0x6,0x3d,0x3f, 0x6,0x3d,0x40, 0x4,0x30,0x4e, 0xf,0x33,0x2b, + 0xf,0x33,0x2c, 0xf,0x33,0x2d, 0xf,0x33,0x2f, 0xf,0x33,0x30, + 0x6,0x46,0x62, 0x5,0x36,0x5c, 0x5,0x36,0x5a, 0x5,0x36,0x5b, + 0x5,0x36,0x59, 0x4,0x36,0x3e, 0xf,0x33,0x2e, 0x5,0x3d,0x6c, + 0x5,0x3d,0x67, 0x5,0x3d,0x69, 0x5,0x3d,0x6a, 0x5,0x3d,0x68, + 0x5,0x3d,0x6b, 0x6,0x50,0x67, 0x6,0x5a,0x7d, 0x5,0x4c,0x21, + 0x5,0x44,0x5a, 0x7,0x21,0x37, 0xf,0x46,0x5d, 0xf,0x46,0x5e, + 0x5,0x4b,0x7e, 0x5,0x4b,0x7d, 0x5,0x4b,0x7c, 0x7,0x21,0x36, + 0xf,0x4d,0x67, 0xf,0x53,0x53, 0x7,0x2c,0x45, 0xf,0x4d,0x66, + 0xf,0x53,0x52, 0x4,0x55,0x6a, 0x7,0x2c,0x46, 0x5,0x5a,0x73, + 0xf,0x59,0x53, 0xf,0x59,0x54, 0x5,0x61,0x36, 0x5,0x61,0x35, + 0x5,0x61,0x37, 0xf,0x5e,0x34, 0x7,0x3e,0x7b, 0x5,0x67,0x52, + 0x5,0x67,0x53, 0x7,0x52,0x76, 0x5,0x73,0x32, 0x4,0x21,0x29, + 0x6,0x21,0x52, 0xf,0x21,0x2a, 0xf,0x21,0x2b, 0xf,0x21,0x2c, + 0xf,0x21,0x2e, 0x6,0x21,0x5c, 0xf,0x21,0x2d, 0x5,0x21,0x53, + 0x6,0x22,0x3d, 0x4,0x21,0x5f, 0x6,0x23,0x5e, 0x6,0x23,0x5d, + 0x6,0x23,0x5f, 0x6,0x23,0x60, 0xf,0x21,0x4b, 0x6,0x26,0x27, + 0x6,0x26,0x25, 0x6,0x26,0x26, 0xf,0x23,0x34, 0xf,0x23,0x35, + 0x4,0x25,0x46, 0x6,0x29,0x5a, 0x4,0x25,0x44, 0x6,0x29,0x5b, + 0x6,0x29,0x5c, 0x6,0x29,0x5d, 0xf,0x25,0x58, 0xf,0x25,0x59, + 0x6,0x2e,0x72, 0x6,0x2e,0x70, 0x6,0x2e,0x71, 0x6,0x35,0x47, + 0xf,0x2e,0x2c, 0x6,0x37,0x27, 0x6,0x3d,0x42, 0x6,0x3d,0x43, + 0x6,0x3d,0x41, 0xf,0x33,0x31, 0xf,0x33,0x32, 0xf,0x33,0x33, + 0x6,0x46,0x63, 0x6,0x46,0x66, 0xf,0x39,0x49, 0x6,0x46,0x64, + 0xf,0x39,0x4a, 0xf,0x46,0x5f, 0xf,0x46,0x60, 0xf,0x46,0x61, + 0xf,0x4d,0x68, 0x7,0x2c,0x47, 0xf,0x53,0x54, 0xf,0x53,0x55, + 0xf,0x53,0x43, 0xf,0x59,0x55, 0xf,0x5e,0x35, 0xf,0x67,0x43, + 0x4,0x21,0x2e, 0x5,0x21,0x39, 0x6,0x21,0x53, 0x6,0x21,0x54, + 0x6,0x22,0x3f, 0x5,0x21,0x54, 0x6,0x22,0x3e, 0xf,0x21,0x4c, + 0x6,0x23,0x65, 0x6,0x23,0x61, 0x6,0x23,0x62, 0x6,0x23,0x63, + 0xf,0x22,0x21, 0x5,0x22,0x2a, 0x6,0x26,0x28, 0xf,0x23,0x36, + 0x6,0x29,0x60, 0x6,0x29,0x5f, 0x6,0x2e,0x73, 0x6,0x2e,0x74, + 0x6,0x34,0x7a, 0x6,0x35,0x48, 0x6,0x3d,0x44, 0x6,0x3d,0x45, + 0x5,0x36,0x5d, 0x6,0x5a,0x7e, 0xf,0x46,0x62, 0x7,0x21,0x70, + 0x7,0x36,0x7b, 0x5,0x5a,0x76, 0x5,0x67,0x54, 0x7,0x4e,0x3e, + 0x6,0x21,0x39, 0x4,0x21,0x40, 0x6,0x21,0x55, 0x5,0x21,0x3a, + 0x5,0x21,0x3b, 0x6,0x21,0x56, 0x4,0x21,0x41, 0xf,0x21,0x2f, + 0x6,0x21,0x57, 0x5,0x21,0x55, 0x5,0x21,0x56, 0x4,0x21,0x62, + 0x6,0x22,0x44, 0x5,0x21,0x57, 0x6,0x22,0x43, 0x6,0x22,0x40, + 0x6,0x22,0x45, 0x4,0x22,0x3a, 0x6,0x23,0x6a, 0x5,0x22,0x2e, + 0x5,0x22,0x2c, 0x5,0x22,0x2b, 0x4,0x22,0x3b, 0x4,0x22,0x39, + 0x6,0x23,0x68, 0x6,0x23,0x67, 0x5,0x22,0x2f, 0x6,0x23,0x6b, + 0x6,0x23,0x69, 0x5,0x22,0x2d, 0x4,0x22,0x3d, 0xf,0x22,0x22, + 0xf,0x22,0x23, 0x4,0x22,0x3e, 0x6,0x23,0x66, 0x4,0x23,0x41, + 0x6,0x26,0x2b, 0x4,0x23,0x43, 0x5,0x23,0x3d, 0x4,0x23,0x42, + 0x5,0x23,0x46, 0x5,0x23,0x45, 0x5,0x23,0x43, 0x5,0x23,0x40, + 0x6,0x26,0x29, 0x5,0x23,0x3f, 0x5,0x23,0x42, 0x5,0x23,0x41, + 0x6,0x26,0x2a, 0x6,0x26,0x2c, 0x5,0x23,0x3e, 0x5,0x23,0x44, + 0x6,0x29,0x69, 0x5,0x25,0x33, 0x5,0x25,0x35, 0x4,0x25,0x49, + 0x4,0x25,0x4b, 0x3,0x27,0x5c, 0x6,0x29,0x66, 0x4,0x25,0x4d, + 0x6,0x29,0x64, 0x6,0x29,0x65, 0x6,0x29,0x6c, 0x6,0x2e,0x75, + 0x6,0x29,0x6a, 0x5,0x25,0x30, 0x5,0x25,0x36, 0x6,0x29,0x6b, + 0x5,0x25,0x32, 0x6,0x29,0x67, 0x5,0x25,0x34, 0xf,0x25,0x5a, + 0xf,0x25,0x5b, 0xf,0x25,0x5c, 0xf,0x25,0x5d, 0x6,0x29,0x68, + 0x6,0x29,0x62, 0x6,0x29,0x61, 0x5,0x25,0x31, 0x6,0x29,0x57, + 0x4,0x28,0x47, 0x5,0x28,0x2d, 0x4,0x28,0x45, 0x6,0x2f,0x24, + 0x6,0x2e,0x7b, 0x6,0x2f,0x22, 0x4,0x28,0x48, 0x6,0x2f,0x21, + 0x4,0x28,0x44, 0x4,0x28,0x46, 0x6,0x2e,0x78, 0x6,0x2e,0x7e, + 0x6,0x2f,0x23, 0x6,0x2e,0x7a, 0x6,0x2e,0x7d, 0x6,0x2e,0x7c, + 0xf,0x29,0x40, 0xf,0x29,0x41, 0xf,0x29,0x42, 0x6,0x2e,0x79, + 0x5,0x28,0x2e, 0x6,0x2e,0x77, 0x6,0x35,0x49, 0x4,0x2b,0x70, + 0x4,0x2b,0x6d, 0x5,0x2c,0x25, 0x5,0x2c,0x23, 0x4,0x2b,0x6f, + 0x4,0x2b,0x73, 0x6,0x35,0x4e, 0x6,0x35,0x52, 0x5,0x2c,0x22, + 0x6,0x35,0x53, 0x4,0x2b,0x6c, 0x5,0x2c,0x26, 0x6,0x35,0x51, + 0x4,0x2b,0x71, 0x6,0x35,0x50, 0x6,0x35,0x4f, 0x6,0x35,0x4c, + 0x6,0x35,0x4b, 0x4,0x2b,0x72, 0x5,0x2c,0x24, 0x6,0x35,0x4d, + 0xf,0x2e,0x33, 0x6,0x35,0x54, 0xf,0x2e,0x2e, 0xf,0x2e,0x2f, + 0xf,0x2e,0x30, 0xf,0x2e,0x32, 0xf,0x2e,0x31, 0x6,0x35,0x4a, + 0x5,0x2c,0x27, 0x5,0x2b,0x7d, 0x5,0x2c,0x21, 0x5,0x2b,0x7e, + 0x4,0x30,0x50, 0x5,0x31,0x2b, 0x4,0x30,0x51, 0x5,0x31,0x2a, + 0x6,0x3d,0x46, 0x4,0x30,0x56, 0x4,0x36,0x49, 0x4,0x30,0x55, + 0x6,0x3d,0x49, 0x6,0x3d,0x47, 0x5,0x36,0x5e, 0x4,0x30,0x4f, + 0x5,0x2c,0x28, 0xf,0x33,0x34, 0xf,0x33,0x35, 0xf,0x33,0x37, + 0x6,0x3d,0x48, 0x6,0x3d,0x4a, 0x6,0x3d,0x4b, 0x4,0x36,0x43, + 0x5,0x36,0x5f, 0x6,0x46,0x6d, 0x6,0x46,0x69, 0x4,0x36,0x46, + 0x4,0x36,0x47, 0x5,0x36,0x60, 0x5,0x36,0x64, 0x4,0x36,0x4a, + 0x4,0x36,0x44, 0x4,0x36,0x41, 0x4,0x36,0x40, 0x6,0x46,0x6b, + 0x6,0x46,0x68, 0x6,0x46,0x6c, 0x5,0x36,0x61, 0x5,0x36,0x62, + 0x6,0x46,0x6a, 0xf,0x39,0x4b, 0xf,0x39,0x4c, 0xf,0x39,0x4d, + 0xf,0x39,0x4e, 0x4,0x36,0x48, 0x6,0x4c,0x46, 0x6,0x46,0x6e, + 0x5,0x36,0x65, 0x4,0x3c,0x39, 0x6,0x50,0x6f, 0x5,0x3d,0x73, + 0x6,0x50,0x6d, 0x4,0x3c,0x35, 0x5,0x3d,0x74, 0x6,0x50,0x6e, + 0x5,0x3d,0x6d, 0x4,0x3c,0x37, 0x4,0x3c,0x36, 0x5,0x3d,0x6e, + 0x4,0x3c,0x3a, 0x5,0x3d,0x6f, 0x6,0x50,0x6b, 0xf,0x40,0x4b, + 0x6,0x50,0x6a, 0x6,0x50,0x68, 0x6,0x50,0x70, 0x6,0x50,0x69, + 0x5,0x3d,0x72, 0x5,0x3d,0x71, 0xf,0x40,0x4c, 0x5,0x44,0x5b, + 0x4,0x42,0x3b, 0x6,0x5b,0x24, 0x5,0x44,0x61, 0x6,0x5b,0x22, + 0x6,0x5b,0x21, 0x4,0x3c,0x38, 0x4,0x42,0x40, 0x5,0x44,0x62, + 0x5,0x44,0x5c, 0x5,0x44,0x5f, 0x4,0x42,0x3d, 0x4,0x42,0x44, + 0x6,0x5b,0x2b, 0x6,0x5b,0x29, 0x6,0x5b,0x28, 0x5,0x44,0x5e, + 0x5,0x4c,0x22, 0x6,0x5b,0x26, 0x5,0x44,0x5d, 0x6,0x5b,0x2a, + 0x5,0x44,0x60, 0x6,0x5b,0x25, 0xf,0x46,0x63, 0xf,0x46,0x64, + 0xf,0x46,0x65, 0x6,0x5b,0x23, 0x6,0x5b,0x27, 0x5,0x4c,0x23, + 0x5,0x4c,0x27, 0x4,0x49,0x24, 0x5,0x4c,0x24, 0x5,0x4c,0x26, + 0x7,0x21,0x3c, 0x7,0x21,0x3d, 0x7,0x21,0x3a, 0x7,0x21,0x3e, + 0x7,0x21,0x3b, 0x5,0x4c,0x25, 0x7,0x21,0x38, 0x7,0x22,0x5a, + 0x7,0x21,0x39, 0x4,0x4f,0x60, 0x7,0x2c,0x49, 0x5,0x5a,0x77, + 0x7,0x2c,0x4a, 0x7,0x2c,0x4e, 0x7,0x2c,0x4d, 0x7,0x2c,0x4c, + 0x5,0x53,0x5f, 0x5,0x53,0x61, 0x5,0x53,0x60, 0x5,0x53,0x5e, + 0x7,0x2c,0x48, 0x7,0x2c,0x4b, 0x7,0x21,0x3f, 0xf,0x53,0x56, + 0x5,0x58,0x51, 0x5,0x5a,0x7a, 0x4,0x55,0x6b, 0x5,0x5a,0x79, + 0x5,0x5a,0x78, 0x7,0x36,0x7c, 0xf,0x59,0x56, 0x4,0x55,0x6e, + 0x7,0x3e,0x7c, 0x5,0x61,0x38, 0x5,0x61,0x39, 0x7,0x36,0x7d, + 0xf,0x5e,0x36, 0x5,0x61,0x3a, 0x7,0x46,0x2f, 0x7,0x46,0x2e, + 0x7,0x46,0x2d, 0x7,0x4d,0x40, 0x7,0x4d,0x41, 0x5,0x6f,0x6a, + 0x7,0x52,0x77, 0xf,0x67,0x44, 0x5,0x75,0x64, 0x4,0x6b,0x65, + 0x7,0x62,0x2d, 0x7,0x62,0x2c, 0x6,0x21,0x3a, 0x5,0x21,0x3c, + 0x6,0x21,0x58, 0x4,0x21,0x63, 0x5,0x21,0x59, 0x5,0x21,0x58, + 0x5,0x22,0x31, 0x5,0x22,0x32, 0xf,0x22,0x25, 0xf,0x22,0x26, + 0xf,0x22,0x27, 0xf,0x22,0x28, 0x5,0x22,0x33, 0x6,0x26,0x2e, + 0x4,0x23,0x45, 0x5,0x23,0x47, 0xf,0x23,0x38, 0xf,0x23,0x3a, + 0xf,0x23,0x3b, 0x6,0x26,0x2d, 0x4,0x23,0x49, 0x5,0x25,0x3d, + 0x5,0x25,0x39, 0x6,0x29,0x6d, 0x5,0x25,0x3c, 0x6,0x29,0x6e, + 0xf,0x25,0x60, 0xf,0x25,0x61, 0xf,0x25,0x62, 0xf,0x25,0x63, + 0x5,0x28,0x30, 0x4,0x28,0x4a, 0x6,0x2f,0x26, 0x5,0x28,0x31, + 0x5,0x28,0x2f, 0x6,0x2f,0x28, 0xf,0x29,0x43, 0xf,0x29,0x44, + 0xf,0x29,0x45, 0x6,0x35,0x55, 0x6,0x35,0x59, 0x4,0x2b,0x74, + 0x5,0x2c,0x2d, 0x5,0x2c,0x29, 0x5,0x2c,0x2b, 0x5,0x2c,0x2c, + 0x5,0x2c,0x2a, 0xf,0x2e,0x34, 0xf,0x2e,0x35, 0x6,0x35,0x56, + 0x6,0x35,0x57, 0x5,0x31,0x2d, 0x6,0x3d,0x4e, 0x6,0x3d,0x4c, + 0x6,0x3d,0x4f, 0x6,0x3d,0x50, 0x6,0x3d,0x51, 0xf,0x33,0x38, + 0xf,0x33,0x39, 0x6,0x3d,0x4d, 0x5,0x36,0x69, 0x5,0x36,0x66, + 0x5,0x36,0x68, 0x5,0x36,0x6b, 0x5,0x36,0x67, 0xf,0x39,0x4f, + 0xf,0x39,0x50, 0x6,0x46,0x6f, 0x6,0x46,0x70, 0x6,0x46,0x71, + 0x5,0x3d,0x76, 0x5,0x3d,0x75, 0x4,0x3c,0x3b, 0x6,0x50,0x72, + 0x6,0x50,0x71, 0xf,0x40,0x4d, 0x5,0x3d,0x77, 0x4,0x42,0x46, + 0x5,0x44,0x66, 0x5,0x44,0x64, 0x5,0x44,0x65, 0x5,0x44,0x69, + 0x4,0x42,0x45, 0x5,0x44,0x68, 0x6,0x5b,0x2e, 0xf,0x46,0x66, + 0x6,0x5b,0x2c, 0x6,0x5b,0x2d, 0x5,0x4c,0x2b, 0x5,0x4c,0x28, + 0x4,0x49,0x26, 0x5,0x4c,0x29, 0x5,0x4c,0x2a, 0x7,0x2c,0x4f, + 0x5,0x5a,0x7c, 0xf,0x53,0x57, 0x5,0x5a,0x7b, 0x5,0x5a,0x7d, + 0x7,0x36,0x7e, 0x7,0x37,0x22, 0x7,0x37,0x21, 0x5,0x61,0x3c, + 0x7,0x3e,0x7e, 0x7,0x3f,0x21, 0x5,0x67,0x56, 0x5,0x67,0x55, + 0x7,0x4d,0x42, 0x5,0x6f,0x6b, 0x7,0x5b,0x46, 0x5,0x75,0x65, + 0x4,0x6c,0x6b, 0x7,0x66,0x3b, 0x5,0x21,0x3d, 0x6,0x22,0x47, + 0x6,0x22,0x48, 0x5,0x22,0x35, 0x5,0x22,0x34, 0x5,0x22,0x36, + 0xf,0x22,0x2a, 0x6,0x26,0x2f, 0x5,0x23,0x48, 0x5,0x23,0x49, + 0x4,0x25,0x52, 0x6,0x29,0x71, 0x6,0x29,0x70, 0xf,0x25,0x64, + 0xf,0x25,0x65, 0x6,0x2f,0x2a, 0x4,0x28,0x4c, 0x6,0x2f,0x2b, + 0x6,0x2f,0x2c, 0xf,0x29,0x46, 0x6,0x2f,0x29, 0x4,0x2b,0x76, + 0x6,0x35,0x5c, 0x6,0x35,0x5b, 0x6,0x35,0x5e, 0x6,0x35,0x5f, + 0x6,0x35,0x5a, 0x6,0x35,0x5d, 0x5,0x2c,0x2f, 0x4,0x30,0x5d, + 0x6,0x3d,0x52, 0x5,0x2c,0x2e, 0x5,0x31,0x2e, 0x5,0x31,0x2f, + 0x6,0x3d,0x53, 0x4,0x36,0x4e, 0xf,0x39,0x51, 0x6,0x50,0x73, + 0x4,0x30,0x5b, 0x5,0x3d,0x79, 0xf,0x40,0x4e, 0xf,0x40,0x4f, + 0x6,0x5b,0x2f, 0x4,0x42,0x47, 0x5,0x44,0x6a, 0x5,0x44,0x6b, + 0xf,0x46,0x67, 0xf,0x4d,0x69, 0x4,0x4f,0x65, 0x7,0x2c,0x50, + 0x7,0x2c,0x51, 0x7,0x37,0x23, 0x7,0x37,0x24, 0x5,0x5a,0x7e, + 0x7,0x4d,0x43, 0x6,0x21,0x2a, 0x4,0x21,0x42, 0x6,0x22,0x4a, + 0x6,0x26,0x30, 0x6,0x26,0x33, 0x5,0x23,0x4a, 0x6,0x26,0x31, + 0x6,0x26,0x32, 0x4,0x28,0x4d, 0x6,0x2f,0x2f, 0x6,0x2f,0x31, + 0x6,0x2f,0x2d, 0x6,0x2f,0x2e, 0x6,0x2f,0x30, 0x6,0x3d,0x54, + 0x6,0x35,0x60, 0xf,0x2e,0x36, 0xf,0x2e,0x37, 0x6,0x35,0x24, + 0x6,0x46,0x72, 0xf,0x39,0x52, 0x4,0x3c,0x3d, 0xf,0x46,0x68, + 0x7,0x3f,0x22, 0x5,0x6d,0x32, 0x6,0x21,0x2b, 0xf,0x21,0x31, + 0x5,0x22,0x37, 0x6,0x23,0x6e, 0x4,0x22,0x43, 0x6,0x23,0x6d, + 0x6,0x26,0x34, 0x4,0x23,0x4a, 0x6,0x26,0x35, 0xf,0x23,0x3c, + 0x6,0x29,0x73, 0x5,0x25,0x3e, 0x5,0x25,0x3f, 0x4,0x28,0x4f, + 0x6,0x2f,0x34, 0x5,0x28,0x33, 0x6,0x2f,0x33, 0x5,0x28,0x32, + 0x6,0x2f,0x32, 0x6,0x2f,0x37, 0x6,0x2f,0x35, 0xf,0x29,0x47, + 0x5,0x2c,0x30, 0x6,0x35,0x62, 0x6,0x35,0x61, 0x5,0x2c,0x31, + 0x6,0x3d,0x55, 0xf,0x33,0x3a, 0x4,0x36,0x4f, 0x6,0x50,0x75, + 0x6,0x46,0x73, 0x6,0x35,0x63, 0x5,0x3d,0x7a, 0x4,0x42,0x48, + 0x6,0x5b,0x31, 0x6,0x5b,0x30, 0x5,0x4c,0x2c, 0x5,0x4c,0x2d, + 0x5,0x4c,0x2e, 0xf,0x4d,0x6a, 0x5,0x53,0x64, 0x7,0x37,0x25, + 0xf,0x5e,0x37, 0x4,0x5f,0x4b, 0x7,0x3f,0x23, 0x7,0x4d,0x44, + 0x7,0x60,0x69, 0x7,0x64,0x43, 0xf,0x21,0x32, 0x5,0x22,0x38, + 0x6,0x23,0x6f, 0x5,0x23,0x4c, 0x6,0x26,0x37, 0xf,0x23,0x3d, + 0xf,0x25,0x66, 0x6,0x2f,0x36, 0x5,0x28,0x34, 0x6,0x35,0x64, + 0xf,0x46,0x69, 0x7,0x4d,0x45, 0x7,0x57,0x50, 0x6,0x21,0x5a, + 0x5,0x21,0x5a, 0x5,0x21,0x5b, 0x6,0x22,0x4b, 0x6,0x23,0x70, + 0x4,0x22,0x44, 0x4,0x22,0x45, 0x6,0x23,0x73, 0x6,0x23,0x72, + 0x5,0x22,0x3a, 0x5,0x22,0x39, 0x6,0x23,0x74, 0x6,0x26,0x39, + 0x5,0x23,0x4d, 0x6,0x26,0x3a, 0x6,0x23,0x75, 0x6,0x26,0x3b, + 0xf,0x23,0x3e, 0x5,0x25,0x40, 0x6,0x29,0x74, 0x6,0x29,0x77, + 0x6,0x29,0x78, 0x6,0x29,0x76, 0xf,0x25,0x67, 0xf,0x25,0x69, + 0xf,0x25,0x6a, 0xf,0x25,0x6b, 0xf,0x25,0x68, 0x6,0x29,0x75, + 0x6,0x35,0x65, 0x6,0x35,0x66, 0xf,0x2e,0x38, 0xf,0x2e,0x39, + 0x4,0x30,0x63, 0x4,0x30,0x61, 0x4,0x30,0x62, 0xf,0x33,0x3b, + 0xf,0x39,0x53, 0xf,0x39,0x54, 0x6,0x50,0x78, 0x6,0x50,0x77, + 0x6,0x50,0x79, 0x6,0x50,0x7b, 0xf,0x40,0x50, 0xf,0x46,0x6a, + 0xf,0x46,0x6b, 0x5,0x4c,0x2f, 0xf,0x4d,0x6b, 0xf,0x4d,0x6c, + 0x7,0x21,0x40, 0x7,0x37,0x26, 0xf,0x5e,0x38, 0x7,0x46,0x30, + 0x7,0x52,0x78, 0x7,0x60,0x6a, 0x7,0x62,0x2e, 0x6,0x22,0x4c, + 0x6,0x23,0x77, 0x6,0x23,0x76, 0x6,0x23,0x78, 0x4,0x23,0x4c, + 0x5,0x23,0x4f, 0x5,0x23,0x4e, 0x6,0x26,0x3c, 0x4,0x25,0x55, + 0x4,0x25,0x54, 0x6,0x29,0x7c, 0x6,0x29,0x7b, 0x6,0x29,0x7d, + 0x6,0x29,0x7a, 0x6,0x29,0x7e, 0x6,0x29,0x79, 0xf,0x25,0x6c, + 0x6,0x2a,0x22, 0x4,0x28,0x52, 0x4,0x28,0x51, 0x5,0x28,0x37, + 0xf,0x29,0x48, 0xf,0x29,0x49, 0xf,0x29,0x4a, 0xf,0x29,0x4b, + 0x6,0x2f,0x39, 0x6,0x35,0x68, 0x4,0x2b,0x79, 0x5,0x2c,0x32, + 0x6,0x35,0x67, 0x6,0x35,0x6a, 0x6,0x3c,0x7a, 0x6,0x35,0x69, + 0x6,0x3d,0x57, 0x6,0x3d,0x56, 0x6,0x35,0x6b, 0x6,0x3d,0x58, + 0x6,0x46,0x75, 0x6,0x46,0x76, 0x6,0x46,0x77, 0x5,0x37,0x3f, + 0x6,0x50,0x7c, 0x5,0x44,0x6d, 0x6,0x5b,0x32, 0x7,0x21,0x41, + 0xf,0x53,0x58, 0x7,0x63,0x4b, 0x5,0x21,0x3e, 0x4,0x21,0x43, + 0xf,0x21,0x34, 0x6,0x21,0x5b, 0x4,0x22,0x46, 0x6,0x2a,0x24, + 0x6,0x23,0x7a, 0x6,0x23,0x79, 0x4,0x23,0x4e, 0x6,0x2f,0x3b, + 0x5,0x28,0x38, 0x6,0x2f,0x3a, 0x4,0x28,0x53, 0x6,0x35,0x6c, + 0x6,0x2f,0x3c, 0x6,0x46,0x78, 0x5,0x2c,0x33, 0x5,0x3d,0x7b, + 0x6,0x50,0x7d, 0x5,0x44,0x6e, 0x7,0x3f,0x24, 0x5,0x21,0x3f, + 0x5,0x21,0x5c, 0x6,0x23,0x7b, 0x6,0x22,0x4f, 0x6,0x22,0x4d, + 0x6,0x22,0x50, 0x5,0x21,0x5d, 0x4,0x22,0x47, 0x5,0x22,0x3b, + 0x6,0x23,0x7c, 0x6,0x23,0x7d, 0x5,0x22,0x3f, 0x5,0x22,0x40, + 0x5,0x22,0x3d, 0x5,0x22,0x3e, 0xf,0x22,0x2d, 0x6,0x26,0x3e, + 0x5,0x23,0x50, 0x6,0x26,0x3d, 0x5,0x23,0x51, 0x6,0x25,0x5e, + 0xf,0x23,0x3f, 0x6,0x2a,0x27, 0x6,0x2a,0x26, 0x6,0x2a,0x29, + 0x6,0x2a,0x28, 0x5,0x25,0x41, 0x4,0x25,0x58, 0xf,0x25,0x6d, + 0xf,0x25,0x6e, 0x6,0x2a,0x25, 0x5,0x28,0x39, 0x4,0x28,0x54, + 0x6,0x2f,0x46, 0x6,0x2f,0x41, 0x6,0x2f,0x44, 0x6,0x2f,0x45, + 0x6,0x2f,0x40, 0x6,0x2f,0x3e, 0x6,0x2f,0x42, 0x6,0x2f,0x43, + 0xf,0x29,0x4d, 0xf,0x29,0x4e, 0x4,0x28,0x55, 0x6,0x2f,0x3f, + 0x6,0x35,0x73, 0x6,0x35,0x74, 0x4,0x2b,0x7b, 0x5,0x2c,0x34, + 0x4,0x2b,0x7c, 0x6,0x35,0x6f, 0x6,0x35,0x6d, 0x6,0x35,0x70, + 0x6,0x35,0x72, 0x6,0x35,0x71, 0x6,0x35,0x6e, 0x5,0x2c,0x35, + 0xf,0x2e,0x3a, 0xf,0x2e,0x3b, 0x6,0x3d,0x60, 0x6,0x3d,0x5b, + 0x4,0x30,0x67, 0x6,0x3d,0x5f, 0x6,0x3d,0x5c, 0x6,0x3d,0x5d, + 0xf,0x33,0x3d, 0x5,0x31,0x30, 0x6,0x3d,0x5e, 0x4,0x30,0x66, + 0x4,0x36,0x52, 0x6,0x46,0x7c, 0x6,0x46,0x7a, 0x4,0x36,0x53, + 0x6,0x46,0x7b, 0x6,0x46,0x79, 0x6,0x46,0x7d, 0xf,0x39,0x55, + 0x6,0x46,0x7e, 0x5,0x3d,0x7c, 0x5,0x3d,0x7d, 0x6,0x51,0x24, + 0x6,0x51,0x23, 0x6,0x50,0x7e, 0xf,0x40,0x51, 0x6,0x51,0x21, + 0x4,0x3c,0x3f, 0x4,0x42,0x49, 0x6,0x5b,0x34, 0x6,0x5b,0x37, + 0x6,0x5b,0x33, 0x6,0x5b,0x38, 0x5,0x44,0x6f, 0xf,0x46,0x6d, + 0xf,0x46,0x6e, 0x6,0x5b,0x36, 0x6,0x5b,0x39, 0x6,0x5b,0x3b, + 0x6,0x5b,0x3a, 0x6,0x5b,0x35, 0x7,0x21,0x43, 0x4,0x49,0x28, + 0x5,0x4c,0x30, 0x7,0x21,0x44, 0x7,0x21,0x42, 0xf,0x4d,0x6d, + 0x7,0x25,0x48, 0x5,0x53,0x65, 0x7,0x2c,0x53, 0x7,0x2c,0x52, + 0xf,0x53,0x59, 0xf,0x53,0x5a, 0x7,0x3b,0x4d, 0xf,0x5e,0x39, + 0xf,0x5e,0x3a, 0xf,0x5e,0x3b, 0xf,0x64,0x7c, 0x7,0x4e,0x27, + 0x7,0x52,0x79, 0x5,0x77,0x54, 0x7,0x5e,0x50, 0x7,0x65,0x33, + 0x7,0x66,0x33, 0x5,0x21,0x2e, 0x6,0x21,0x3c, 0x6,0x21,0x3d, + 0x6,0x21,0x5d, 0x6,0x22,0x52, 0x6,0x22,0x51, 0x4,0x22,0x4a, + 0x6,0x24,0x23, 0x6,0x24,0x21, 0xf,0x22,0x2e, 0x4,0x22,0x49, + 0x6,0x24,0x22, 0x6,0x26,0x40, 0xf,0x23,0x40, 0x5,0x23,0x3c, + 0x6,0x2a,0x2c, 0x6,0x2a,0x2b, 0x6,0x2a,0x2d, 0x6,0x2a,0x2e, + 0x6,0x2f,0x47, 0x6,0x2f,0x48, 0x4,0x28,0x56, 0xf,0x29,0x4f, + 0x6,0x35,0x76, 0x6,0x35,0x75, 0x6,0x36,0x49, 0x6,0x35,0x2e, + 0x5,0x36,0x6c, 0x6,0x47,0x22, 0x6,0x47,0x24, 0x6,0x4d,0x62, + 0xf,0x39,0x56, 0x6,0x47,0x23, 0x5,0x3e,0x21, 0x6,0x51,0x25, + 0x5,0x3d,0x7e, 0xf,0x40,0x52, 0x6,0x5b,0x3c, 0xf,0x46,0x6f, + 0x6,0x60,0x72, 0x7,0x21,0x45, 0x5,0x53,0x66, 0xf,0x59,0x57, + 0x7,0x4b,0x6a, 0x6,0x21,0x60, 0x5,0x21,0x40, 0x6,0x21,0x5e, + 0x5,0x21,0x42, 0x6,0x21,0x62, 0x6,0x21,0x5f, 0x6,0x22,0x55, + 0x4,0x21,0x68, 0x5,0x21,0x5e, 0x6,0x22,0x56, 0x5,0x21,0x5f, + 0x6,0x22,0x53, 0x6,0x22,0x54, 0x6,0x24,0x25, 0x4,0x22,0x4b, + 0x6,0x24,0x24, 0x5,0x22,0x42, 0x6,0x24,0x26, 0x5,0x22,0x41, + 0x6,0x24,0x27, 0x6,0x26,0x44, 0x6,0x26,0x42, 0x5,0x23,0x52, + 0xf,0x23,0x41, 0xf,0x23,0x42, 0xf,0x23,0x43, 0xf,0x23,0x44, + 0x4,0x23,0x50, 0x6,0x2a,0x31, 0x6,0x2a,0x2f, 0x6,0x2a,0x32, + 0x6,0x2a,0x30, 0xf,0x25,0x6f, 0x6,0x2f,0x4d, 0x6,0x2f,0x4a, + 0x6,0x2f,0x4c, 0x6,0x2f,0x4b, 0x6,0x2f,0x49, 0xf,0x29,0x51, + 0xf,0x29,0x52, 0x6,0x32,0x72, 0x5,0x28,0x36, 0x6,0x35,0x7b, + 0x5,0x2c,0x36, 0x6,0x35,0x7c, 0x6,0x35,0x79, 0x6,0x35,0x77, + 0x6,0x35,0x7a, 0xf,0x2e,0x3c, 0xf,0x2e,0x3d, 0xf,0x2e,0x3e, + 0xf,0x2e,0x3f, 0x6,0x3c,0x67, 0x6,0x3d,0x66, 0x6,0x3d,0x68, + 0x5,0x31,0x32, 0x5,0x31,0x33, 0x6,0x3d,0x65, 0x6,0x3d,0x63, + 0x6,0x3d,0x6b, 0x6,0x3d,0x64, 0x5,0x2c,0x37, 0x6,0x3d,0x62, + 0x6,0x3d,0x69, 0x6,0x3d,0x6a, 0x6,0x3c,0x7c, 0x6,0x3d,0x67, + 0x4,0x36,0x54, 0x5,0x36,0x6d, 0x6,0x47,0x27, 0x6,0x47,0x25, + 0xf,0x33,0x3e, 0xf,0x39,0x57, 0xf,0x39,0x58, 0xf,0x39,0x59, + 0xf,0x39,0x5a, 0x6,0x47,0x26, 0x4,0x3c,0x43, 0x4,0x3c,0x42, + 0x6,0x51,0x27, 0x6,0x51,0x28, 0x6,0x51,0x26, 0x4,0x3c,0x41, + 0x6,0x47,0x28, 0x6,0x51,0x5b, 0x6,0x51,0x29, 0x6,0x5f,0x21, + 0x6,0x5b,0x3e, 0x6,0x5b,0x3d, 0x5,0x44,0x70, 0x6,0x53,0x7b, + 0xf,0x4d,0x55, 0x5,0x4c,0x33, 0x5,0x4c,0x34, 0xf,0x46,0x70, + 0x5,0x4c,0x32, 0x7,0x2c,0x55, 0xf,0x53,0x5b, 0x3,0x50,0x39, + 0x5,0x54,0x2e, 0x7,0x2c,0x54, 0x7,0x37,0x29, 0x7,0x37,0x28, + 0xf,0x59,0x58, 0x4,0x5a,0x6f, 0x7,0x46,0x32, 0x7,0x46,0x31, + 0x4,0x66,0x31, 0xf,0x67,0x45, 0x7,0x57,0x51, 0x5,0x75,0x66, + 0x7,0x5e,0x51, 0x7,0x5e,0x52, 0x5,0x21,0x43, 0x6,0x21,0x64, + 0x4,0x21,0x47, 0x4,0x21,0x46, 0xf,0x21,0x36, 0x6,0x21,0x63, + 0x5,0x21,0x61, 0x6,0x22,0x59, 0x6,0x22,0x58, 0x6,0x22,0x5e, + 0x6,0x22,0x5a, 0x6,0x22,0x5d, 0x6,0x22,0x57, 0x6,0x22,0x42, + 0xf,0x21,0x4e, 0x6,0x22,0x5c, 0x5,0x22,0x47, 0x6,0x24,0x2d, + 0x5,0x22,0x45, 0x6,0x24,0x2e, 0x4,0x22,0x4d, 0x5,0x22,0x46, + 0x4,0x22,0x50, 0x6,0x24,0x2c, 0x4,0x22,0x4f, 0x4,0x22,0x4e, + 0x5,0x22,0x44, 0x6,0x24,0x28, 0xf,0x22,0x2f, 0xf,0x22,0x30, + 0xf,0x22,0x32, 0xf,0x22,0x34, 0x6,0x24,0x2a, 0xf,0x22,0x31, + 0xf,0x22,0x33, 0x5,0x22,0x43, 0x6,0x24,0x29, 0x6,0x24,0x2b, + 0x4,0x23,0x56, 0x6,0x26,0x4f, 0x6,0x26,0x46, 0x6,0x26,0x4d, + 0x6,0x26,0x4c, 0x5,0x23,0x56, 0x4,0x23,0x5a, 0x4,0x23,0x5d, + 0x5,0x23,0x5b, 0x5,0x23,0x54, 0x6,0x26,0x48, 0x4,0x23,0x57, + 0x4,0x23,0x52, 0x4,0x23,0x58, 0x5,0x23,0x58, 0x6,0x26,0x49, + 0x5,0x23,0x59, 0x4,0x23,0x55, 0x5,0x23,0x55, 0x6,0x26,0x47, + 0x5,0x23,0x5c, 0xf,0x23,0x45, 0xf,0x23,0x46, 0xf,0x23,0x47, + 0xf,0x23,0x4a, 0xf,0x23,0x4b, 0xf,0x23,0x4c, 0xf,0x23,0x48, + 0x6,0x26,0x4b, 0x6,0x26,0x4a, 0x6,0x26,0x50, 0x6,0x26,0x45, + 0x5,0x23,0x53, 0x5,0x23,0x57, 0x5,0x23,0x5a, 0x4,0x25,0x5c, + 0x4,0x25,0x5e, 0x6,0x2a,0x36, 0x5,0x25,0x4c, 0x5,0x25,0x44, + 0x4,0x25,0x5b, 0x6,0x2a,0x34, 0x5,0x25,0x4d, 0x5,0x25,0x45, + 0x5,0x25,0x47, 0x4,0x25,0x61, 0x5,0x25,0x50, 0x6,0x2a,0x33, + 0x5,0x25,0x52, 0x5,0x28,0x47, 0x6,0x2a,0x3b, 0x5,0x25,0x48, + 0x5,0x25,0x4b, 0x5,0x25,0x4a, 0x5,0x25,0x51, 0x5,0x25,0x49, + 0x5,0x25,0x4e, 0x6,0x2a,0x3d, 0x5,0x25,0x4f, 0xf,0x25,0x70, + 0xf,0x25,0x72, 0xf,0x25,0x73, 0xf,0x25,0x74, 0xf,0x25,0x75, + 0xf,0x25,0x76, 0xf,0x25,0x77, 0xf,0x25,0x78, 0xf,0x25,0x79, + 0xf,0x25,0x7a, 0xf,0x25,0x7d, 0xf,0x25,0x7e, 0xf,0x26,0x21, + 0xf,0x26,0x22, 0xf,0x26,0x23, 0x5,0x25,0x46, 0x6,0x2a,0x35, + 0x5,0x25,0x43, 0x6,0x2a,0x38, 0x6,0x2a,0x37, 0xf,0x25,0x7c, + 0x6,0x2a,0x3a, 0x5,0x2c,0x38, 0x5,0x28,0x46, 0x5,0x28,0x52, + 0x5,0x28,0x4d, 0x5,0x28,0x3c, 0x5,0x28,0x51, 0x6,0x2f,0x54, + 0x6,0x2f,0x4e, 0x5,0x28,0x3f, 0x4,0x28,0x5b, 0x4,0x28,0x5a, + 0x5,0x28,0x4f, 0x5,0x28,0x45, 0x5,0x28,0x4b, 0x5,0x28,0x4a, + 0x5,0x28,0x4e, 0x5,0x28,0x48, 0x5,0x28,0x49, 0x5,0x28,0x3d, + 0x5,0x28,0x41, 0x5,0x28,0x4c, 0x4,0x25,0x62, 0x6,0x2f,0x59, + 0x6,0x2f,0x5a, 0x5,0x28,0x53, 0x6,0x2f,0x4f, 0x5,0x28,0x3a, + 0x6,0x2f,0x57, 0x6,0x2f,0x56, 0x5,0x28,0x50, 0x6,0x2f,0x50, + 0x6,0x2f,0x58, 0x6,0x2f,0x52, 0x5,0x28,0x40, 0x5,0x28,0x42, + 0xf,0x2b,0x33, 0xf,0x29,0x53, 0xf,0x29,0x55, 0xf,0x29,0x56, + 0xf,0x29,0x57, 0xf,0x29,0x58, 0xf,0x29,0x59, 0xf,0x29,0x5a, + 0xf,0x29,0x5b, 0xf,0x29,0x5e, 0xf,0x29,0x5f, 0xf,0x29,0x60, + 0xf,0x29,0x61, 0xf,0x29,0x62, 0xf,0x29,0x63, 0xf,0x29,0x64, + 0xf,0x29,0x66, 0xf,0x29,0x67, 0x5,0x28,0x43, 0x5,0x28,0x44, + 0x4,0x28,0x5d, 0xf,0x29,0x65, 0x6,0x2f,0x55, 0x6,0x2f,0x53, + 0x4,0x28,0x58, 0x5,0x28,0x3b, 0x5,0x28,0x3e, 0x6,0x2f,0x51, + 0x6,0x36,0x29, 0x4,0x2c,0x24, 0x4,0x2c,0x2b, 0x4,0x2c,0x2c, + 0x4,0x2c,0x27, 0x6,0x36,0x22, 0x5,0x2c,0x4e, 0x5,0x2c,0x41, + 0x5,0x2c,0x3f, 0x5,0x2c,0x4c, 0x5,0x2c,0x3d, 0x5,0x2c,0x46, + 0x5,0x2c,0x56, 0x5,0x2c,0x49, 0x4,0x2c,0x2a, 0x5,0x2c,0x4d, + 0x5,0x2c,0x54, 0x5,0x2c,0x52, 0x4,0x2c,0x22, 0x6,0x36,0x23, + 0x6,0x36,0x24, 0x5,0x2c,0x51, 0x4,0x2c,0x23, 0x5,0x2c,0x40, + 0x6,0x36,0x27, 0x6,0x36,0x28, 0x5,0x2c,0x57, 0x6,0x36,0x26, + 0x5,0x2c,0x53, 0x5,0x2c,0x58, 0x5,0x2c,0x47, 0x5,0x2c,0x59, + 0x5,0x2c,0x44, 0x5,0x2c,0x55, 0xf,0x2e,0x40, 0xf,0x2e,0x41, + 0xf,0x2e,0x43, 0xf,0x2e,0x44, 0xf,0x2e,0x48, 0xf,0x2e,0x49, + 0xf,0x2e,0x4b, 0xf,0x2e,0x4c, 0xf,0x2e,0x4d, 0xf,0x2e,0x4e, + 0xf,0x2e,0x4f, 0xf,0x2e,0x50, 0xf,0x2e,0x51, 0xf,0x2e,0x52, + 0xf,0x2e,0x53, 0xf,0x2e,0x54, 0x6,0x39,0x5e, 0x6,0x36,0x21, + 0x5,0x2c,0x42, 0x5,0x2c,0x45, 0x5,0x2c,0x48, 0x6,0x36,0x25, + 0x5,0x2c,0x50, 0x5,0x2c,0x4b, 0x5,0x2c,0x39, 0x5,0x2c,0x3a, + 0x5,0x2c,0x3b, 0xf,0x2e,0x45, 0x5,0x2c,0x4a, 0x5,0x2c,0x4f, + 0x5,0x2c,0x3e, 0x5,0x2c,0x3c, 0x5,0x2c,0x5a, 0x5,0x31,0x46, + 0x4,0x30,0x69, 0x6,0x3d,0x77, 0x6,0x3d,0x74, 0x4,0x30,0x78, + 0x6,0x3d,0x6f, 0x4,0x30,0x75, 0x5,0x31,0x51, 0x5,0x31,0x49, + 0x5,0x31,0x4c, 0x4,0x30,0x6e, 0x4,0x30,0x79, 0x5,0x31,0x44, + 0x6,0x3d,0x76, 0x5,0x31,0x36, 0x5,0x31,0x4a, 0x5,0x31,0x45, + 0x5,0x31,0x4e, 0x5,0x31,0x34, 0x5,0x31,0x4d, 0x5,0x31,0x42, + 0x5,0x31,0x3b, 0x6,0x3d,0x71, 0x6,0x3d,0x75, 0x6,0x3d,0x7d, + 0x6,0x3d,0x7a, 0x6,0x3d,0x7e, 0x5,0x31,0x3a, 0x5,0x31,0x3c, + 0x6,0x3d,0x6c, 0x5,0x31,0x38, 0x6,0x3d,0x72, 0x6,0x3d,0x7b, + 0xf,0x33,0x3f, 0xf,0x33,0x40, 0xf,0x33,0x41, 0xf,0x33,0x42, + 0xf,0x33,0x44, 0xf,0x33,0x45, 0xf,0x33,0x46, 0xf,0x33,0x47, + 0xf,0x33,0x48, 0xf,0x33,0x49, 0xf,0x33,0x4c, 0xf,0x33,0x4d, + 0x5,0x31,0x37, 0x6,0x3d,0x73, 0x5,0x31,0x39, 0x6,0x3d,0x6d, + 0x5,0x31,0x41, 0x5,0x31,0x48, 0x6,0x3e,0x21, 0x5,0x31,0x52, + 0x6,0x3d,0x70, 0x5,0x31,0x40, 0x5,0x31,0x35, 0x5,0x31,0x47, + 0x5,0x31,0x3e, 0x5,0x31,0x43, 0x5,0x31,0x3d, 0x5,0x31,0x50, + 0x6,0x3d,0x79, 0x3,0x34,0x60, 0x5,0x31,0x53, 0x5,0x31,0x4f, + 0x6,0x3d,0x78, 0x6,0x3d,0x6e, 0x5,0x31,0x3f, 0x5,0x31,0x4b, + 0x4,0x36,0x55, 0x4,0x36,0x61, 0x6,0x47,0x32, 0x5,0x37,0x24, + 0x6,0x47,0x37, 0x6,0x47,0x3e, 0x5,0x36,0x77, 0x6,0x47,0x35, + 0x5,0x36,0x7c, 0x4,0x36,0x56, 0x5,0x37,0x28, 0x5,0x36,0x6f, + 0x5,0x36,0x71, 0x4,0x36,0x5a, 0x5,0x36,0x78, 0x4,0x36,0x57, + 0x5,0x37,0x29, 0x5,0x36,0x7e, 0x4,0x36,0x62, 0x4,0x36,0x5b, + 0x5,0x37,0x23, 0x5,0x37,0x27, 0x4,0x36,0x66, 0x5,0x37,0x30, + 0x4,0x36,0x5d, 0x5,0x37,0x2c, 0x5,0x37,0x2e, 0x6,0x47,0x2e, + 0x6,0x47,0x3c, 0x5,0x3e,0x22, 0x6,0x47,0x2b, 0x6,0x47,0x2f, + 0x6,0x47,0x38, 0x5,0x37,0x22, 0x6,0x47,0x34, 0x6,0x47,0x3f, + 0x6,0x47,0x3a, 0x4,0x36,0x64, 0x5,0x37,0x26, 0x5,0x36,0x73, + 0xf,0x39,0x5b, 0xf,0x39,0x5d, 0xf,0x39,0x5e, 0xf,0x39,0x61, + 0xf,0x39,0x62, 0xf,0x39,0x63, 0xf,0x39,0x64, 0xf,0x39,0x65, + 0xf,0x39,0x66, 0xf,0x39,0x67, 0xf,0x39,0x68, 0xf,0x39,0x6a, + 0xf,0x39,0x6d, 0xf,0x39,0x6e, 0xf,0x39,0x6f, 0xf,0x39,0x70, + 0x5,0x36,0x74, 0x5,0x36,0x75, 0x5,0x36,0x7b, 0x5,0x37,0x25, + 0x5,0x37,0x21, 0x6,0x47,0x3b, 0xf,0x39,0x6b, 0xf,0x39,0x5c, + 0xf,0x39,0x5f, 0xf,0x39,0x69, 0xf,0x39,0x6c, 0x5,0x37,0x2b, + 0x5,0x37,0x2f, 0x6,0x47,0x3d, 0x5,0x37,0x2d, 0x5,0x37,0x2a, + 0x5,0x36,0x7d, 0x6,0x47,0x36, 0x6,0x51,0x39, 0x5,0x3e,0x23, + 0x4,0x3c,0x49, 0x5,0x3e,0x27, 0x4,0x3c,0x4e, 0x5,0x36,0x72, + 0x6,0x51,0x41, 0x4,0x3c,0x48, 0x4,0x3c,0x44, 0x6,0x5b,0x42, + 0x5,0x3e,0x2d, 0x6,0x51,0x33, 0x6,0x51,0x35, 0x5,0x3e,0x2a, + 0x5,0x3e,0x38, 0x6,0x51,0x3a, 0x6,0x51,0x30, 0x5,0x3e,0x2e, + 0x5,0x3e,0x24, 0x5,0x3e,0x35, 0x5,0x3e,0x3f, 0x6,0x51,0x3f, + 0x6,0x51,0x37, 0x5,0x3e,0x34, 0x5,0x3e,0x37, 0x4,0x3c,0x4d, + 0x5,0x3e,0x3a, 0x4,0x3c,0x45, 0x5,0x3e,0x33, 0x5,0x3e,0x2c, + 0x4,0x3c,0x4f, 0x5,0x3e,0x2f, 0x4,0x3c,0x51, 0x5,0x3e,0x31, + 0x5,0x3e,0x32, 0x6,0x51,0x3b, 0x6,0x51,0x40, 0x6,0x51,0x2a, + 0x6,0x51,0x3e, 0x6,0x51,0x3d, 0x5,0x3e,0x3b, 0x6,0x51,0x38, + 0x5,0x3e,0x28, 0x5,0x3e,0x30, 0x5,0x3e,0x2b, 0x6,0x51,0x2c, + 0x6,0x51,0x44, 0x6,0x51,0x2e, 0x6,0x51,0x2b, 0x6,0x51,0x2d, + 0xf,0x47,0x26, 0x5,0x3e,0x3e, 0x6,0x51,0x31, 0xf,0x40,0x56, + 0xf,0x40,0x57, 0xf,0x40,0x58, 0xf,0x40,0x59, 0xf,0x40,0x5a, + 0xf,0x40,0x5b, 0xf,0x40,0x5c, 0xf,0x40,0x5d, 0xf,0x40,0x5e, + 0xf,0x40,0x5f, 0xf,0x40,0x60, 0xf,0x40,0x61, 0xf,0x40,0x63, + 0x6,0x51,0x2f, 0x6,0x51,0x34, 0x6,0x51,0x3c, 0xf,0x40,0x54, + 0x6,0x51,0x42, 0x5,0x3e,0x3c, 0x5,0x3e,0x36, 0x5,0x3e,0x25, + 0x5,0x3e,0x29, 0x5,0x3e,0x26, 0xf,0x40,0x64, 0x6,0x5b,0x46, + 0x6,0x5b,0x40, 0x6,0x5b,0x4b, 0x4,0x42,0x4d, 0x6,0x5b,0x4f, + 0x6,0x5b,0x45, 0x6,0x5b,0x51, 0x6,0x5b,0x50, 0x4,0x42,0x4e, + 0x6,0x5b,0x4c, 0x5,0x44,0x73, 0x5,0x44,0x77, 0x5,0x44,0x75, + 0x5,0x44,0x7c, 0x6,0x5b,0x43, 0x6,0x5b,0x47, 0x4,0x42,0x4c, + 0x4,0x42,0x54, 0x5,0x44,0x7b, 0x4,0x42,0x50, 0x5,0x44,0x76, + 0x6,0x5b,0x41, 0x5,0x44,0x71, 0x5,0x44,0x72, 0x5,0x44,0x79, + 0x6,0x5b,0x52, 0x6,0x5b,0x3f, 0x6,0x5b,0x49, 0x6,0x5b,0x4a, + 0x5,0x44,0x78, 0x6,0x5b,0x4d, 0xf,0x46,0x71, 0xf,0x46,0x72, + 0xf,0x46,0x73, 0xf,0x46,0x74, 0xf,0x46,0x76, 0xf,0x46,0x77, + 0xf,0x46,0x78, 0xf,0x46,0x79, 0xf,0x46,0x7a, 0xf,0x46,0x7b, + 0xf,0x46,0x7c, 0xf,0x46,0x7e, 0xf,0x47,0x21, 0xf,0x47,0x22, + 0xf,0x47,0x23, 0xf,0x47,0x27, 0xf,0x47,0x28, 0xf,0x47,0x29, + 0xf,0x47,0x2a, 0xf,0x47,0x2b, 0xf,0x47,0x2c, 0xf,0x47,0x2d, + 0xf,0x47,0x24, 0x6,0x5b,0x48, 0xf,0x46,0x75, 0x5,0x44,0x74, + 0x5,0x44,0x7a, 0x6,0x5b,0x4e, 0x5,0x45,0x21, 0xf,0x46,0x7d, + 0x6,0x5b,0x44, 0xf,0x47,0x25, 0x5,0x4c,0x35, 0x5,0x44,0x7d, + 0xf,0x46,0x6c, 0x7,0x21,0x51, 0x5,0x4c,0x3b, 0x7,0x21,0x55, + 0x7,0x21,0x52, 0x5,0x4c,0x39, 0x7,0x21,0x58, 0x7,0x21,0x4a, + 0x5,0x4c,0x40, 0x5,0x4c,0x46, 0x5,0x4c,0x3d, 0x7,0x21,0x4f, + 0x5,0x4c,0x3e, 0x7,0x21,0x57, 0x7,0x21,0x50, 0x5,0x4c,0x36, + 0x7,0x21,0x4b, 0x5,0x4c,0x3f, 0x7,0x21,0x56, 0x7,0x21,0x59, + 0x5,0x4c,0x41, 0x4,0x49,0x2f, 0x7,0x21,0x5b, 0x5,0x4c,0x3a, + 0x7,0x21,0x48, 0x5,0x4c,0x38, 0x5,0x5b,0x27, 0x7,0x21,0x5a, + 0x4,0x49,0x2b, 0x7,0x21,0x54, 0x5,0x45,0x23, 0x7,0x21,0x53, + 0x7,0x21,0x49, 0x7,0x21,0x47, 0x7,0x21,0x62, 0x7,0x21,0x5c, + 0xf,0x4d,0x7a, 0x7,0x21,0x5e, 0x5,0x4c,0x42, 0x7,0x21,0x61, + 0x7,0x2c,0x61, 0x5,0x4c,0x37, 0x4,0x49,0x32, 0x5,0x4c,0x47, + 0xf,0x4d,0x6f, 0xf,0x4d,0x70, 0xf,0x4d,0x71, 0xf,0x4d,0x72, + 0xf,0x4d,0x73, 0xf,0x4d,0x74, 0xf,0x4d,0x75, 0xf,0x4d,0x76, + 0xf,0x4d,0x78, 0xf,0x4d,0x79, 0x5,0x4c,0x44, 0x7,0x21,0x5f, + 0x7,0x26,0x2b, 0x7,0x21,0x5d, 0x7,0x21,0x4d, 0x7,0x21,0x4c, + 0x5,0x4c,0x3c, 0x5,0x4c,0x43, 0x7,0x2c,0x6a, 0x4,0x4f,0x6e, + 0x5,0x53,0x74, 0x7,0x2c,0x5c, 0x5,0x53,0x72, 0x7,0x2c,0x68, + 0x4,0x4f,0x72, 0x5,0x53,0x6a, 0x5,0x53,0x78, 0x7,0x2c,0x60, + 0x4,0x4f,0x68, 0x4,0x4f,0x73, 0x4,0x4f,0x66, 0x5,0x53,0x71, + 0x4,0x4f,0x70, 0x5,0x53,0x6f, 0x5,0x53,0x68, 0x7,0x2c,0x6b, + 0x7,0x2c,0x5b, 0x7,0x2c,0x64, 0x5,0x53,0x6e, 0x7,0x2c,0x5f, + 0x5,0x53,0x6c, 0x5,0x53,0x67, 0x5,0x53,0x75, 0x5,0x53,0x70, + 0x5,0x53,0x73, 0x7,0x2c,0x59, 0x5,0x53,0x6b, 0x5,0x53,0x69, + 0x7,0x2c,0x67, 0x7,0x2c,0x58, 0x7,0x2c,0x57, 0xf,0x4d,0x77, + 0x4,0x4f,0x69, 0x4,0x4f,0x74, 0x5,0x53,0x77, 0x7,0x2c,0x66, + 0xf,0x53,0x5c, 0xf,0x53,0x5e, 0xf,0x53,0x5f, 0xf,0x53,0x60, + 0xf,0x53,0x61, 0xf,0x53,0x62, 0xf,0x53,0x63, 0xf,0x53,0x64, + 0xf,0x53,0x65, 0xf,0x53,0x67, 0xf,0x53,0x68, 0xf,0x53,0x69, + 0xf,0x53,0x6a, 0xf,0x53,0x6b, 0xf,0x53,0x6c, 0xf,0x53,0x6d, + 0xf,0x53,0x6e, 0xf,0x53,0x6f, 0x7,0x2c,0x5e, 0x7,0x2c,0x5d, + 0x7,0x2c,0x62, 0x7,0x2c,0x69, 0x5,0x53,0x6d, 0xf,0x55,0x74, + 0x5,0x53,0x76, 0x4,0x55,0x7a, 0x5,0x5b,0x26, 0x5,0x5b,0x21, + 0x7,0x37,0x2d, 0x7,0x37,0x2a, 0x7,0x37,0x34, 0x7,0x37,0x35, + 0x5,0x5b,0x23, 0x5,0x5b,0x2b, 0x4,0x55,0x71, 0x4,0x55,0x76, + 0x5,0x5b,0x28, 0x4,0x55,0x77, 0x7,0x37,0x2b, 0x5,0x5b,0x29, + 0x4,0x55,0x79, 0x7,0x37,0x31, 0x7,0x37,0x2f, 0x7,0x37,0x2e, + 0x5,0x5b,0x24, 0x4,0x55,0x75, 0x7,0x37,0x32, 0x7,0x37,0x39, + 0xf,0x59,0x59, 0xf,0x59,0x5a, 0xf,0x59,0x5e, 0xf,0x59,0x5f, + 0xf,0x59,0x60, 0xf,0x59,0x61, 0xf,0x59,0x62, 0x7,0x37,0x38, + 0x7,0x37,0x30, 0x7,0x37,0x36, 0x7,0x37,0x33, 0x7,0x37,0x2c, + 0x5,0x5b,0x2a, 0x5,0x5b,0x22, 0x4,0x5a,0x74, 0x7,0x3f,0x29, + 0x7,0x3f,0x2f, 0x4,0x5a,0x73, 0x5,0x61,0x3e, 0x7,0x3f,0x2b, + 0x4,0x5a,0x71, 0x4,0x5a,0x76, 0x5,0x61,0x46, 0x4,0x5a,0x77, + 0x5,0x67,0x58, 0x5,0x61,0x3d, 0x5,0x61,0x44, 0x5,0x61,0x43, + 0x4,0x5a,0x78, 0x7,0x3f,0x2a, 0x4,0x5a,0x75, 0x4,0x5a,0x79, + 0x4,0x5a,0x72, 0x7,0x3f,0x2e, 0x5,0x61,0x41, 0x7,0x3f,0x27, + 0x7,0x3f,0x2d, 0x7,0x3f,0x28, 0x7,0x3f,0x26, 0x7,0x3f,0x2c, + 0x5,0x61,0x42, 0xf,0x59,0x5b, 0x7,0x3f,0x25, 0xf,0x5e,0x3c, + 0xf,0x5e,0x3d, 0xf,0x5e,0x3e, 0xf,0x5e,0x3f, 0xf,0x5e,0x40, + 0xf,0x5e,0x43, 0xf,0x5e,0x44, 0xf,0x5e,0x45, 0x5,0x61,0x3f, + 0xf,0x5e,0x4a, 0x7,0x46,0x34, 0x4,0x5f,0x4e, 0x5,0x5b,0x25, + 0x7,0x46,0x3b, 0x7,0x46,0x39, 0x7,0x46,0x37, 0x5,0x67,0x5a, + 0x5,0x67,0x5b, 0x4,0x5f,0x50, 0x5,0x67,0x57, 0x7,0x46,0x3c, + 0x7,0x46,0x3a, 0x7,0x46,0x33, 0x7,0x46,0x35, 0x7,0x46,0x38, + 0x4,0x5f,0x4f, 0xf,0x5e,0x46, 0x5,0x67,0x5c, 0xf,0x62,0x22, + 0xf,0x62,0x23, 0xf,0x62,0x24, 0xf,0x62,0x25, 0xf,0x62,0x26, + 0x7,0x46,0x36, 0x7,0x47,0x6e, 0x7,0x46,0x3d, 0x5,0x6b,0x74, + 0x5,0x6b,0x75, 0x5,0x6b,0x6f, 0x5,0x6b,0x71, 0x5,0x6b,0x70, + 0x7,0x4d,0x47, 0x7,0x4d,0x49, 0x7,0x4d,0x4b, 0x7,0x4d,0x48, + 0x7,0x4d,0x46, 0x7,0x4d,0x4a, 0xf,0x64,0x7d, 0xf,0x64,0x7e, + 0xf,0x65,0x21, 0x7,0x4d,0x4c, 0x5,0x6b,0x72, 0x7,0x52,0x7b, + 0x5,0x6f,0x71, 0x5,0x6f,0x6f, 0x4,0x66,0x35, 0x5,0x6f,0x6e, + 0x7,0x52,0x7a, 0x5,0x6f,0x6d, 0x7,0x52,0x7e, 0x5,0x6f,0x70, + 0x7,0x52,0x7d, 0x4,0x66,0x33, 0xf,0x67,0x47, 0xf,0x67,0x48, + 0x5,0x6f,0x6c, 0x7,0x52,0x7c, 0x7,0x57,0x59, 0x7,0x57,0x5a, + 0x5,0x73,0x33, 0x7,0x57,0x55, 0x7,0x57,0x56, 0x7,0x57,0x57, + 0x7,0x57,0x54, 0x7,0x57,0x52, 0x7,0x57,0x53, 0xf,0x69,0x3c, + 0x4,0x68,0x64, 0x7,0x57,0x58, 0x7,0x5b,0x49, 0x7,0x5b,0x4a, + 0xf,0x6a,0x4d, 0x7,0x5b,0x48, 0x7,0x5b,0x47, 0x5,0x77,0x55, + 0x5,0x77,0x56, 0x4,0x6b,0x66, 0x7,0x5e,0x53, 0x7,0x5e,0x55, + 0x7,0x5e,0x54, 0x7,0x5e,0x56, 0xf,0x6b,0x43, 0x5,0x75,0x67, + 0x5,0x79,0x23, 0x4,0x6c,0x6d, 0xf,0x6c,0x22, 0xf,0x6c,0x23, + 0x7,0x60,0x6b, 0x7,0x62,0x32, 0x7,0x62,0x31, 0x7,0x62,0x34, + 0x7,0x62,0x30, 0x7,0x62,0x33, 0xf,0x6c,0x79, 0xf,0x6c,0x7a, + 0x6,0x21,0x65, 0x6,0x21,0x66, 0xf,0x21,0x37, 0x4,0x21,0x6e, + 0x6,0x24,0x32, 0x6,0x24,0x30, 0x5,0x22,0x49, 0xf,0x22,0x35, + 0x6,0x24,0x31, 0x6,0x24,0x2f, 0x5,0x22,0x48, 0x6,0x26,0x54, + 0x6,0x2f,0x5c, 0x6,0x2a,0x3e, 0x6,0x26,0x58, 0x6,0x26,0x56, + 0xf,0x23,0x4f, 0xf,0x23,0x51, 0x6,0x26,0x57, 0x6,0x26,0x59, + 0x6,0x26,0x5c, 0x6,0x26,0x5a, 0x6,0x26,0x51, 0x6,0x26,0x55, + 0x6,0x26,0x52, 0x6,0x26,0x53, 0x6,0x26,0x5b, 0x5,0x25,0x55, + 0x6,0x2a,0x43, 0x6,0x2a,0x40, 0x6,0x2a,0x41, 0x6,0x2a,0x42, + 0x6,0x2d,0x34, 0x6,0x2a,0x3f, 0xf,0x26,0x24, 0x5,0x25,0x54, + 0x5,0x28,0x54, 0x5,0x28,0x56, 0x6,0x2f,0x60, 0x6,0x2f,0x5f, + 0x5,0x28,0x55, 0x6,0x2f,0x5b, 0x6,0x2f,0x5e, 0x6,0x2f,0x5d, + 0x5,0x2c,0x5c, 0x6,0x36,0x2d, 0x6,0x36,0x2a, 0x6,0x36,0x2c, + 0x5,0x2c,0x5b, 0x6,0x36,0x2b, 0x5,0x2c,0x5d, 0x5,0x31,0x56, + 0x6,0x3e,0x25, 0x5,0x31,0x57, 0x6,0x3e,0x24, 0x6,0x3e,0x23, + 0x6,0x3e,0x22, 0x5,0x31,0x54, 0x6,0x3e,0x26, 0x5,0x37,0x33, + 0x6,0x47,0x40, 0x6,0x47,0x41, 0x5,0x37,0x31, 0x5,0x31,0x55, + 0xf,0x39,0x72, 0xf,0x39,0x73, 0xf,0x39,0x74, 0x6,0x47,0x42, + 0x5,0x37,0x32, 0x5,0x3e,0x40, 0x6,0x51,0x45, 0x5,0x3e,0x41, + 0x6,0x51,0x47, 0x6,0x51,0x48, 0x5,0x3e,0x42, 0x6,0x51,0x46, + 0xf,0x40,0x65, 0x6,0x5b,0x54, 0x6,0x5b,0x58, 0x5,0x45,0x24, + 0x6,0x5b,0x55, 0x6,0x5b,0x5a, 0x6,0x5b,0x56, 0xf,0x47,0x2e, + 0xf,0x47,0x2f, 0xf,0x47,0x30, 0x6,0x5b,0x57, 0x7,0x21,0x65, + 0x7,0x21,0x66, 0x7,0x21,0x64, 0xf,0x4d,0x7b, 0x4,0x4f,0x75, + 0xf,0x53,0x73, 0x7,0x37,0x3c, 0x7,0x37,0x3a, 0x7,0x37,0x3b, + 0x4,0x5f,0x51, 0x7,0x4d,0x4d, 0x7,0x53,0x22, 0x7,0x53,0x21, + 0x4,0x21,0x48, 0x5,0x21,0x44, 0x6,0x22,0x60, 0xf,0x21,0x51, + 0xf,0x21,0x52, 0x6,0x22,0x61, 0x6,0x24,0x35, 0xf,0x22,0x36, + 0xf,0x22,0x37, 0x6,0x24,0x34, 0x6,0x26,0x6a, 0x4,0x23,0x60, + 0x6,0x26,0x66, 0x6,0x26,0x62, 0x6,0x26,0x5e, 0x6,0x26,0x69, + 0x6,0x26,0x5d, 0x6,0x26,0x65, 0x6,0x26,0x67, 0xf,0x23,0x53, + 0xf,0x23,0x54, 0xf,0x23,0x56, 0xf,0x23,0x58, 0xf,0x23,0x5a, + 0x6,0x26,0x60, 0x6,0x26,0x63, 0x6,0x26,0x68, 0x6,0x26,0x64, + 0x6,0x26,0x61, 0x6,0x26,0x5f, 0x5,0x23,0x5e, 0xf,0x23,0x59, + 0x5,0x23,0x5d, 0x5,0x23,0x5f, 0x5,0x23,0x60, 0x5,0x23,0x61, + 0x4,0x25,0x6a, 0x6,0x2a,0x4f, 0x6,0x2a,0x47, 0x6,0x2a,0x4c, + 0x6,0x2a,0x46, 0x4,0x25,0x67, 0x6,0x2a,0x4a, 0x4,0x25,0x6c, + 0x6,0x2a,0x48, 0x5,0x25,0x56, 0x6,0x2a,0x51, 0x6,0x26,0x41, + 0x6,0x2a,0x49, 0xf,0x26,0x26, 0xf,0x26,0x27, 0xf,0x26,0x28, + 0xf,0x26,0x29, 0xf,0x26,0x2a, 0xf,0x26,0x30, 0xf,0x26,0x31, + 0xf,0x26,0x2c, 0xf,0x26,0x2b, 0x4,0x25,0x6b, 0xf,0x26,0x2f, + 0xf,0x26,0x2e, 0x6,0x2a,0x50, 0x6,0x2a,0x4b, 0x6,0x2a,0x4d, + 0x6,0x2a,0x4e, 0xf,0x26,0x32, 0xf,0x26,0x25, 0x6,0x2a,0x45, + 0x6,0x2a,0x44, 0x5,0x25,0x57, 0x5,0x28,0x5b, 0x6,0x2f,0x62, + 0x5,0x28,0x57, 0x6,0x2f,0x64, 0x6,0x2f,0x61, 0x5,0x28,0x58, + 0x4,0x28,0x5f, 0x6,0x2f,0x6b, 0x6,0x2f,0x63, 0xf,0x29,0x7a, + 0xf,0x29,0x68, 0xf,0x29,0x69, 0xf,0x29,0x6b, 0xf,0x29,0x6c, + 0xf,0x29,0x6d, 0xf,0x29,0x6e, 0xf,0x29,0x6f, 0xf,0x29,0x70, + 0xf,0x29,0x72, 0xf,0x29,0x73, 0xf,0x29,0x75, 0xf,0x29,0x76, + 0xf,0x29,0x77, 0xf,0x29,0x78, 0xf,0x29,0x79, 0xf,0x29,0x7b, + 0xf,0x29,0x7c, 0xf,0x29,0x7d, 0x6,0x2f,0x6a, 0x6,0x2f,0x6c, + 0x6,0x34,0x31, 0x6,0x2f,0x67, 0x6,0x2f,0x68, 0x6,0x2f,0x66, + 0xf,0x29,0x74, 0x5,0x28,0x5d, 0x5,0x28,0x5a, 0x5,0x28,0x5e, + 0x5,0x28,0x5c, 0x5,0x28,0x59, 0x5,0x2c,0x5e, 0x4,0x2c,0x32, + 0x6,0x36,0x34, 0x4,0x2c,0x30, 0x4,0x2c,0x34, 0x6,0x36,0x32, + 0x6,0x36,0x3c, 0x6,0x36,0x36, 0x6,0x36,0x3d, 0x6,0x36,0x3e, + 0x6,0x36,0x31, 0x6,0x36,0x2e, 0x6,0x36,0x3a, 0x6,0x36,0x2f, + 0x6,0x36,0x40, 0xf,0x2e,0x55, 0xf,0x2e,0x56, 0xf,0x2e,0x57, + 0xf,0x2e,0x58, 0xf,0x2e,0x59, 0xf,0x2e,0x5a, 0xf,0x2e,0x5b, + 0xf,0x2e,0x5e, 0xf,0x2e,0x5f, 0xf,0x2e,0x60, 0x6,0x36,0x30, + 0x6,0x36,0x3f, 0x6,0x36,0x37, 0x6,0x36,0x38, 0x6,0x36,0x39, + 0x5,0x2c,0x60, 0x6,0x36,0x3b, 0xf,0x2e,0x5d, 0xf,0x2e,0x61, + 0x6,0x36,0x33, 0x5,0x2c,0x5f, 0x5,0x2c,0x62, 0x4,0x30,0x7d, + 0x6,0x3e,0x27, 0x4,0x30,0x7c, 0x5,0x31,0x5d, 0x6,0x3e,0x34, + 0x6,0x3e,0x2d, 0x5,0x31,0x5b, 0x6,0x3e,0x2a, 0x5,0x2c,0x61, + 0x6,0x3e,0x33, 0x6,0x3e,0x30, 0x5,0x31,0x5a, 0x4,0x31,0x22, + 0x4,0x31,0x23, 0xf,0x33,0x4f, 0xf,0x33,0x5b, 0x6,0x3e,0x2e, + 0x6,0x3e,0x2f, 0xf,0x33,0x4e, 0xf,0x33,0x50, 0xf,0x33,0x51, + 0xf,0x33,0x52, 0xf,0x33,0x53, 0xf,0x33,0x54, 0xf,0x33,0x55, + 0xf,0x33,0x56, 0xf,0x33,0x58, 0xf,0x33,0x59, 0xf,0x33,0x5a, + 0xf,0x33,0x5e, 0xf,0x33,0x5f, 0xf,0x33,0x60, 0xf,0x33,0x61, + 0x5,0x31,0x5c, 0x6,0x3e,0x31, 0x6,0x3e,0x35, 0x4,0x30,0x7e, + 0x6,0x3e,0x28, 0x6,0x3e,0x29, 0x5,0x31,0x58, 0x5,0x31,0x59, + 0x3,0x3a,0x4f, 0x6,0x51,0x4e, 0x4,0x36,0x72, 0x6,0x47,0x47, + 0x4,0x36,0x6a, 0x6,0x47,0x45, 0x4,0x36,0x70, 0x4,0x36,0x6c, + 0x6,0x47,0x4b, 0x6,0x47,0x50, 0x4,0x36,0x75, 0x6,0x47,0x44, + 0x6,0x47,0x46, 0x6,0x47,0x4d, 0x5,0x37,0x34, 0x6,0x3e,0x32, + 0x6,0x47,0x4f, 0x4,0x3c,0x5a, 0x5,0x37,0x39, 0x4,0x36,0x73, + 0x6,0x4f,0x6d, 0x5,0x37,0x38, 0xf,0x39,0x76, 0xf,0x39,0x78, + 0xf,0x39,0x79, 0xf,0x39,0x7a, 0xf,0x39,0x7b, 0xf,0x39,0x7c, + 0xf,0x3a,0x21, 0xf,0x3a,0x22, 0xf,0x3a,0x23, 0xf,0x3a,0x24, + 0xf,0x3a,0x25, 0xf,0x3a,0x26, 0x6,0x47,0x51, 0x6,0x47,0x4a, + 0x6,0x47,0x49, 0x4,0x36,0x74, 0x6,0x47,0x4c, 0xf,0x39,0x75, + 0x5,0x37,0x37, 0x5,0x37,0x3a, 0x6,0x47,0x48, 0x5,0x37,0x35, + 0x5,0x37,0x36, 0x5,0x37,0x3b, 0x5,0x3e,0x46, 0x6,0x51,0x56, + 0x6,0x51,0x4b, 0x6,0x51,0x55, 0x5,0x3e,0x4d, 0x4,0x3c,0x54, + 0x6,0x5b,0x62, 0x6,0x51,0x52, 0x5,0x3e,0x4c, 0x6,0x51,0x51, + 0x5,0x3e,0x44, 0x5,0x3e,0x4b, 0x5,0x3e,0x43, 0x6,0x51,0x54, + 0x6,0x51,0x50, 0x5,0x3e,0x49, 0x5,0x3e,0x4a, 0x4,0x3c,0x55, + 0x5,0x3e,0x47, 0x6,0x51,0x49, 0x6,0x51,0x4c, 0xf,0x39,0x77, + 0x6,0x51,0x53, 0x6,0x51,0x4d, 0xf,0x40,0x66, 0xf,0x40,0x67, + 0xf,0x40,0x68, 0xf,0x40,0x6a, 0xf,0x40,0x6b, 0xf,0x40,0x6c, + 0xf,0x40,0x6d, 0xf,0x40,0x6e, 0xf,0x40,0x6f, 0xf,0x40,0x70, + 0xf,0x40,0x71, 0xf,0x40,0x72, 0xf,0x40,0x73, 0x6,0x51,0x4f, + 0x5,0x3e,0x4e, 0x5,0x3e,0x48, 0x5,0x3e,0x45, 0x5,0x45,0x29, + 0x5,0x45,0x28, 0x5,0x45,0x27, 0x6,0x5b,0x5c, 0x4,0x42,0x5c, + 0x6,0x5b,0x64, 0x6,0x5b,0x66, 0x6,0x5b,0x61, 0x5,0x45,0x2a, + 0x6,0x5b,0x60, 0x5,0x45,0x26, 0x6,0x5b,0x67, 0xf,0x47,0x32, + 0xf,0x47,0x33, 0xf,0x47,0x34, 0xf,0x47,0x35, 0xf,0x47,0x36, + 0xf,0x47,0x37, 0xf,0x47,0x39, 0xf,0x47,0x3a, 0xf,0x47,0x3b, + 0xf,0x47,0x3c, 0x6,0x5b,0x5d, 0xf,0x47,0x38, 0x6,0x5b,0x6b, + 0x6,0x5b,0x63, 0x6,0x5b,0x53, 0xf,0x47,0x31, 0x4,0x42,0x5a, + 0x6,0x5b,0x65, 0x6,0x5b,0x5e, 0x5,0x45,0x25, 0x5,0x45,0x2b, + 0x7,0x21,0x72, 0x4,0x49,0x34, 0x4,0x49,0x35, 0x7,0x21,0x6f, + 0x4,0x49,0x36, 0x5,0x4c,0x4b, 0x5,0x4c,0x4c, 0x7,0x21,0x6b, + 0x7,0x21,0x78, 0x4,0x49,0x37, 0x7,0x21,0x77, 0x7,0x21,0x74, + 0xf,0x4e,0x21, 0x5,0x4c,0x4d, 0x5,0x4c,0x4f, 0x7,0x21,0x67, + 0x7,0x21,0x75, 0xf,0x4d,0x7c, 0xf,0x4d,0x7d, 0xf,0x4e,0x26, + 0xf,0x4e,0x27, 0xf,0x4e,0x28, 0xf,0x4e,0x29, 0xf,0x4e,0x2a, + 0xf,0x4e,0x2b, 0xf,0x4e,0x2d, 0x7,0x21,0x6c, 0x7,0x21,0x6d, + 0x7,0x21,0x6e, 0x5,0x4c,0x71, 0x7,0x21,0x73, 0x7,0x21,0x71, + 0x7,0x21,0x69, 0xf,0x4d,0x7e, 0xf,0x4e,0x24, 0xf,0x4e,0x23, + 0x5,0x4c,0x4e, 0x5,0x4c,0x4a, 0x5,0x4c,0x48, 0x7,0x21,0x68, + 0x5,0x4c,0x49, 0x7,0x2c,0x6f, 0x7,0x2c,0x71, 0x7,0x2c,0x6c, + 0x4,0x4f,0x77, 0x4,0x4f,0x7a, 0x4,0x4f,0x79, 0x7,0x2c,0x6d, + 0x7,0x2c,0x70, 0xf,0x4e,0x2c, 0xf,0x53,0x74, 0xf,0x53,0x76, + 0xf,0x53,0x78, 0x5,0x53,0x7a, 0x7,0x2c,0x72, 0x5,0x53,0x7b, + 0x5,0x53,0x79, 0x7,0x34,0x6f, 0x7,0x2c,0x73, 0x7,0x2c,0x6e, + 0xf,0x53,0x77, 0x4,0x4f,0x76, 0x7,0x37,0x43, 0x4,0x55,0x7d, + 0x7,0x37,0x3d, 0x5,0x5b,0x2e, 0x7,0x37,0x3f, 0x7,0x37,0x44, + 0x7,0x37,0x42, 0x7,0x37,0x45, 0x5,0x5b,0x2c, 0x7,0x2c,0x74, + 0xf,0x59,0x64, 0xf,0x59,0x65, 0xf,0x59,0x66, 0xf,0x59,0x67, + 0xf,0x59,0x68, 0xf,0x59,0x69, 0xf,0x59,0x6a, 0xf,0x59,0x6b, + 0x7,0x3e,0x6c, 0x7,0x37,0x40, 0x7,0x37,0x41, 0x4,0x55,0x7e, + 0x5,0x5b,0x2f, 0x7,0x3f,0x34, 0x5,0x61,0x47, 0x7,0x37,0x3e, + 0x5,0x61,0x49, 0x7,0x3f,0x33, 0xf,0x5e,0x47, 0xf,0x5e,0x48, + 0xf,0x5e,0x49, 0xf,0x5e,0x4b, 0xf,0x5e,0x4d, 0xf,0x5e,0x4e, + 0x7,0x3f,0x31, 0x7,0x3f,0x32, 0x5,0x5b,0x30, 0x5,0x61,0x48, + 0xf,0x62,0x28, 0x5,0x61,0x4a, 0x7,0x46,0x42, 0x7,0x46,0x3f, + 0x5,0x67,0x5d, 0x7,0x46,0x47, 0x7,0x46,0x41, 0xf,0x5e,0x4c, + 0xf,0x62,0x27, 0x7,0x46,0x43, 0x7,0x46,0x46, 0x7,0x4a,0x3b, + 0x7,0x46,0x40, 0x7,0x3f,0x35, 0x4,0x63,0x33, 0xf,0x65,0x22, + 0xf,0x65,0x23, 0xf,0x65,0x24, 0xf,0x65,0x25, 0x7,0x4d,0x4e, + 0x5,0x6b,0x77, 0x7,0x53,0x28, 0x4,0x66,0x36, 0x7,0x53,0x24, + 0x7,0x53,0x23, 0x7,0x53,0x27, 0x7,0x53,0x25, 0x5,0x6f,0x74, + 0xf,0x67,0x49, 0xf,0x67,0x4a, 0xf,0x67,0x4c, 0x7,0x53,0x26, + 0xf,0x67,0x4b, 0x5,0x6f,0x72, 0x5,0x6f,0x73, 0x7,0x57,0x5b, + 0xf,0x69,0x3d, 0x5,0x73,0x34, 0x7,0x57,0x5d, 0x5,0x73,0x35, + 0x7,0x5b,0x4b, 0x7,0x57,0x5c, 0x7,0x5e,0x57, 0x5,0x77,0x57, + 0x5,0x7b,0x5f, 0x7,0x65,0x5a, 0x7,0x66,0x42, 0x7,0x66,0x4f, + 0x6,0x22,0x62, 0x6,0x2f,0x6d, 0x6,0x26,0x6b, 0x6,0x2a,0x52, + 0xf,0x29,0x7e, 0xf,0x2a,0x21, 0x5,0x2c,0x64, 0x6,0x36,0x42, + 0x6,0x2f,0x6e, 0x6,0x36,0x41, 0xf,0x2e,0x62, 0x5,0x2c,0x63, + 0x6,0x3e,0x36, 0xf,0x33,0x62, 0x6,0x47,0x52, 0x6,0x51,0x59, + 0x6,0x51,0x58, 0x6,0x5b,0x6a, 0x6,0x64,0x7a, 0x6,0x5b,0x68, + 0xf,0x47,0x3d, 0x6,0x5b,0x69, 0x7,0x21,0x7a, 0x7,0x21,0x79, + 0x7,0x2c,0x75, 0x7,0x3f,0x36, 0x7,0x43,0x3f, 0xf,0x5e,0x4f, + 0x7,0x3f,0x37, 0x7,0x46,0x48, 0x7,0x46,0x49, 0x7,0x48,0x3b, + 0x7,0x57,0x5e, 0x5,0x21,0x2f, 0x6,0x22,0x63, 0x6,0x24,0x37, + 0x6,0x24,0x36, 0x6,0x26,0x6c, 0xf,0x23,0x5c, 0x6,0x36,0x43, + 0x6,0x3e,0x37, 0x6,0x3e,0x38, 0x6,0x51,0x5a, 0x6,0x24,0x39, + 0x6,0x24,0x38, 0x5,0x23,0x64, 0x5,0x23,0x63, 0x4,0x25,0x6f, + 0x6,0x2a,0x53, 0xf,0x26,0x34, 0xf,0x2e,0x63, 0x5,0x31,0x5e, + 0x6,0x3e,0x39, 0x6,0x3e,0x3c, 0x5,0x2c,0x65, 0x6,0x3e,0x3b, + 0x6,0x3e,0x3a, 0x5,0x3e,0x4f, 0x6,0x51,0x5c, 0xf,0x40,0x74, + 0x6,0x5b,0x6c, 0xf,0x47,0x3e, 0x6,0x5b,0x6d, 0x5,0x4c,0x50, + 0xf,0x4e,0x2f, 0xf,0x53,0x79, 0x7,0x2c,0x76, 0x7,0x2c,0x77, + 0x7,0x37,0x46, 0x7,0x46,0x4a, 0x7,0x3f,0x3a, 0x7,0x3f,0x38, + 0x7,0x3f,0x39, 0x7,0x46,0x4b, 0x7,0x4d,0x4f, 0x6,0x22,0x64, + 0x6,0x22,0x65, 0x6,0x24,0x3a, 0x6,0x26,0x6e, 0x6,0x26,0x6d, + 0x6,0x2a,0x54, 0xf,0x25,0x42, 0x5,0x28,0x5f, 0x5,0x2c,0x68, + 0x4,0x2c,0x35, 0x5,0x2c,0x67, 0x6,0x36,0x46, 0x6,0x36,0x45, + 0xf,0x2e,0x64, 0xf,0x2e,0x65, 0x6,0x36,0x47, 0x5,0x2c,0x69, + 0x4,0x31,0x24, 0x5,0x31,0x61, 0x6,0x3e,0x3d, 0x5,0x31,0x5f, + 0x5,0x31,0x60, 0x5,0x31,0x62, 0xf,0x33,0x63, 0x6,0x47,0x54, + 0x5,0x37,0x3e, 0x5,0x37,0x42, 0x5,0x37,0x40, 0x5,0x37,0x41, + 0xf,0x3a,0x27, 0x5,0x3e,0x50, 0x6,0x51,0x5d, 0x5,0x3e,0x52, + 0x5,0x3e,0x51, 0x6,0x51,0x5f, 0x4,0x42,0x61, 0x6,0x5b,0x6f, + 0x6,0x5b,0x70, 0x6,0x5b,0x6e, 0x5,0x45,0x2c, 0x5,0x45,0x2e, + 0x7,0x21,0x7b, 0x5,0x4c,0x51, 0x7,0x3f,0x3b, 0x5,0x5b,0x31, + 0x5,0x5b,0x32, 0x7,0x46,0x4c, 0x6,0x21,0x67, 0x6,0x21,0x68, + 0xf,0x21,0x38, 0x6,0x22,0x66, 0xf,0x21,0x53, 0xf,0x21,0x54, + 0x5,0x21,0x76, 0x6,0x24,0x3c, 0x4,0x22,0x54, 0x6,0x24,0x3f, + 0x6,0x24,0x40, 0x6,0x24,0x3e, 0x6,0x24,0x3d, 0xf,0x21,0x6b, + 0x4,0x23,0x63, 0x4,0x23,0x64, 0x4,0x23,0x66, 0xf,0x23,0x5d, + 0xf,0x23,0x5e, 0xf,0x23,0x5f, 0xf,0x23,0x60, 0xf,0x23,0x61, + 0xf,0x23,0x62, 0xf,0x23,0x63, 0x6,0x26,0x70, 0x6,0x26,0x6f, + 0x4,0x25,0x76, 0x5,0x25,0x5a, 0x4,0x25,0x74, 0x6,0x2a,0x55, + 0x6,0x2a,0x56, 0x4,0x28,0x63, 0x6,0x2a,0x5c, 0x6,0x2a,0x58, + 0x6,0x2a,0x59, 0xf,0x26,0x36, 0xf,0x26,0x37, 0x6,0x2a,0x5a, + 0x6,0x2a,0x5b, 0x6,0x2a,0x5d, 0x4,0x25,0x79, 0x6,0x2a,0x57, + 0x6,0x29,0x39, 0x4,0x28,0x64, 0x4,0x28,0x62, 0x5,0x28,0x61, + 0x5,0x28,0x62, 0x5,0x28,0x60, 0xf,0x2a,0x23, 0xf,0x2a,0x24, + 0xf,0x2a,0x25, 0xf,0x2a,0x26, 0xf,0x2a,0x28, 0xf,0x2a,0x29, + 0xf,0x2a,0x27, 0xf,0x2a,0x22, 0x5,0x2c,0x6c, 0x6,0x36,0x48, + 0x6,0x36,0x4b, 0x5,0x2c,0x6a, 0x5,0x2c,0x6d, 0xf,0x2e,0x67, + 0xf,0x2e,0x68, 0xf,0x2e,0x69, 0x6,0x36,0x4a, 0x4,0x2c,0x37, + 0x5,0x2c,0x6b, 0x5,0x31,0x64, 0xf,0x2e,0x66, 0x4,0x2c,0x36, + 0x6,0x3e,0x41, 0x6,0x3e,0x44, 0x3,0x34,0x7e, 0x6,0x3e,0x3e, + 0x6,0x3e,0x43, 0x6,0x3e,0x40, 0x6,0x3e,0x45, 0x6,0x3e,0x3f, + 0xf,0x33,0x64, 0xf,0x33,0x65, 0x4,0x31,0x27, 0x5,0x31,0x63, + 0x4,0x3c,0x5e, 0x6,0x47,0x58, 0x6,0x47,0x5b, 0x6,0x47,0x5d, + 0x6,0x47,0x5a, 0xf,0x3a,0x28, 0x6,0x47,0x55, 0x6,0x47,0x5c, + 0x5,0x37,0x43, 0x6,0x47,0x59, 0x4,0x36,0x7a, 0x4,0x36,0x78, + 0x5,0x37,0x44, 0x6,0x47,0x57, 0x6,0x51,0x60, 0x6,0x51,0x61, + 0x4,0x3c,0x5d, 0xf,0x40,0x76, 0x5,0x3e,0x53, 0x5,0x3e,0x54, + 0x5,0x3e,0x55, 0x6,0x5b,0x72, 0x4,0x42,0x63, 0x5,0x45,0x2f, + 0x4,0x42,0x62, 0xf,0x47,0x3f, 0xf,0x47,0x40, 0xf,0x47,0x41, + 0x6,0x5b,0x71, 0x5,0x45,0x30, 0x4,0x49,0x38, 0x7,0x22,0x22, + 0x7,0x21,0x7c, 0x7,0x22,0x21, 0x7,0x2c,0x7c, 0x7,0x21,0x7e, + 0x5,0x4c,0x53, 0xf,0x4e,0x31, 0xf,0x4e,0x32, 0x7,0x21,0x7d, + 0x4,0x42,0x64, 0x5,0x4c,0x52, 0x7,0x2c,0x7d, 0x5,0x53,0x7c, + 0x7,0x2c,0x78, 0x7,0x2c,0x79, 0x4,0x56,0x21, 0xf,0x53,0x7a, + 0x7,0x2c,0x7a, 0x7,0x37,0x48, 0x7,0x37,0x47, 0x5,0x5b,0x33, + 0x4,0x56,0x2e, 0x4,0x5a,0x7b, 0xf,0x62,0x29, 0x5,0x6b,0x78, + 0x7,0x53,0x29, 0xf,0x69,0x3e, 0x5,0x75,0x68, 0xf,0x6b,0x44, + 0x7,0x5e,0x58, 0xf,0x6c,0x5f, 0x5,0x21,0x62, 0xf,0x21,0x55, + 0xf,0x21,0x56, 0x6,0x24,0x41, 0x4,0x22,0x58, 0x6,0x24,0x42, + 0xf,0x22,0x39, 0xf,0x22,0x3a, 0xf,0x22,0x3b, 0xf,0x22,0x3c, + 0x4,0x22,0x57, 0x5,0x22,0x4b, 0x6,0x24,0x43, 0x5,0x22,0x4a, + 0x6,0x26,0x74, 0x4,0x23,0x68, 0x4,0x23,0x6b, 0xf,0x23,0x64, + 0xf,0x23,0x66, 0xf,0x23,0x68, 0xf,0x23,0x69, 0xf,0x23,0x6b, + 0xf,0x23,0x6c, 0xf,0x23,0x6d, 0xf,0x23,0x6e, 0xf,0x23,0x6f, + 0xf,0x23,0x65, 0x6,0x26,0x72, 0x6,0x26,0x73, 0x6,0x26,0x75, + 0x6,0x26,0x71, 0xf,0x23,0x6a, 0xf,0x23,0x67, 0x5,0x23,0x66, + 0x5,0x23,0x67, 0x5,0x23,0x65, 0x4,0x25,0x7c, 0x6,0x2a,0x61, + 0x6,0x2a,0x60, 0x5,0x25,0x60, 0x4,0x25,0x7a, 0x5,0x25,0x5e, + 0x4,0x25,0x7d, 0x5,0x25,0x5b, 0x5,0x25,0x5c, 0x4,0x25,0x7e, + 0xf,0x26,0x3a, 0xf,0x26,0x3b, 0xf,0x26,0x3e, 0xf,0x26,0x3f, + 0xf,0x26,0x40, 0xf,0x26,0x41, 0xf,0x26,0x42, 0xf,0x26,0x43, + 0xf,0x26,0x45, 0xf,0x26,0x46, 0xf,0x26,0x47, 0xf,0x26,0x48, + 0xf,0x26,0x49, 0x6,0x2a,0x5f, 0x6,0x2a,0x5e, 0xf,0x26,0x44, + 0xf,0x26,0x3c, 0xf,0x26,0x3d, 0x5,0x25,0x62, 0x5,0x25,0x5f, + 0x5,0x25,0x63, 0x5,0x25,0x61, 0x4,0x28,0x68, 0x5,0x28,0x64, + 0x6,0x2f,0x76, 0x6,0x2f,0x78, 0x6,0x2f,0x79, 0x4,0x28,0x65, + 0x4,0x28,0x6b, 0x5,0x28,0x66, 0x4,0x28,0x66, 0x5,0x28,0x63, + 0x6,0x2f,0x70, 0x6,0x2f,0x7b, 0x6,0x2f,0x74, 0x5,0x28,0x6b, + 0x6,0x2f,0x7e, 0xf,0x2a,0x2d, 0xf,0x2a,0x2e, 0xf,0x2a,0x2f, + 0xf,0x2a,0x30, 0xf,0x2a,0x31, 0xf,0x2a,0x32, 0xf,0x2a,0x33, + 0xf,0x2a,0x34, 0x6,0x2f,0x73, 0x6,0x2f,0x77, 0x4,0x28,0x6c, + 0x6,0x2f,0x75, 0x6,0x2f,0x7a, 0x6,0x2f,0x6f, 0x6,0x2f,0x7d, + 0x5,0x28,0x69, 0x4,0x28,0x6a, 0x5,0x28,0x6a, 0x5,0x28,0x67, + 0x6,0x2f,0x71, 0x6,0x2f,0x7c, 0x5,0x28,0x65, 0x5,0x28,0x68, + 0x6,0x2f,0x72, 0x3,0x30,0x53, 0x5,0x2c,0x70, 0x6,0x36,0x4f, + 0x5,0x2c,0x72, 0x5,0x2c,0x75, 0x5,0x2c,0x6f, 0x6,0x36,0x55, + 0x5,0x2c,0x6e, 0x6,0x36,0x56, 0x6,0x36,0x50, 0x6,0x36,0x51, + 0xf,0x2e,0x6c, 0xf,0x2e,0x6e, 0xf,0x2e,0x70, 0xf,0x2e,0x71, + 0xf,0x2e,0x73, 0xf,0x2e,0x74, 0xf,0x2e,0x75, 0xf,0x2e,0x76, + 0xf,0x2e,0x77, 0xf,0x2e,0x79, 0x6,0x36,0x54, 0x6,0x36,0x4e, + 0x5,0x2c,0x71, 0x6,0x36,0x53, 0x6,0x36,0x52, 0xf,0x2e,0x6f, + 0xf,0x2e,0x72, 0x5,0x2c,0x77, 0x5,0x2c,0x74, 0x5,0x2c,0x73, + 0x5,0x2c,0x76, 0x5,0x2c,0x78, 0x6,0x3e,0x4c, 0x6,0x3e,0x52, + 0x6,0x3e,0x46, 0x6,0x3e,0x47, 0x5,0x31,0x6a, 0x6,0x3e,0x48, + 0x6,0x3e,0x49, 0x6,0x3e,0x4f, 0x5,0x31,0x69, 0x5,0x31,0x6d, + 0x6,0x3e,0x4d, 0x4,0x31,0x2b, 0x6,0x3e,0x4e, 0x5,0x31,0x6b, + 0x6,0x3e,0x53, 0xf,0x33,0x68, 0xf,0x33,0x69, 0xf,0x33,0x6a, + 0xf,0x33,0x6b, 0xf,0x33,0x6c, 0xf,0x33,0x6d, 0xf,0x33,0x6e, + 0xf,0x33,0x6f, 0xf,0x33,0x71, 0xf,0x33,0x72, 0xf,0x33,0x74, + 0xf,0x33,0x75, 0xf,0x33,0x76, 0xf,0x33,0x77, 0xf,0x33,0x78, + 0xf,0x33,0x79, 0xf,0x33,0x7a, 0xf,0x33,0x7b, 0xf,0x33,0x7c, + 0xf,0x33,0x7d, 0xf,0x33,0x7e, 0xf,0x34,0x21, 0xf,0x34,0x22, + 0xf,0x34,0x23, 0xf,0x33,0x70, 0x6,0x3e,0x51, 0x4,0x31,0x2a, + 0x6,0x3e,0x4b, 0x6,0x3e,0x4a, 0x5,0x31,0x66, 0x5,0x31,0x67, + 0x5,0x31,0x68, 0x5,0x31,0x65, 0x4,0x36,0x7b, 0x6,0x47,0x62, + 0x4,0x36,0x7c, 0x5,0x37,0x5a, 0x6,0x47,0x5f, 0x4,0x37,0x21, + 0x5,0x37,0x48, 0x5,0x37,0x59, 0x6,0x47,0x64, 0x6,0x47,0x66, + 0x5,0x37,0x4f, 0x6,0x47,0x65, 0x6,0x47,0x60, 0x5,0x37,0x50, + 0x5,0x37,0x49, 0x5,0x37,0x57, 0x5,0x37,0x54, 0x5,0x37,0x47, + 0x5,0x37,0x4b, 0xf,0x3a,0x29, 0xf,0x3a,0x2b, 0xf,0x3a,0x2c, + 0xf,0x3a,0x2d, 0xf,0x3a,0x2e, 0xf,0x3a,0x2f, 0xf,0x3a,0x30, + 0xf,0x3a,0x32, 0xf,0x3a,0x33, 0xf,0x3a,0x34, 0xf,0x3a,0x36, + 0xf,0x3a,0x37, 0xf,0x3a,0x38, 0xf,0x3a,0x39, 0xf,0x3a,0x3a, + 0xf,0x3a,0x3e, 0xf,0x3a,0x3f, 0xf,0x3a,0x41, 0xf,0x3a,0x42, + 0xf,0x3a,0x43, 0xf,0x3a,0x44, 0xf,0x3a,0x45, 0xf,0x3a,0x3b, + 0x5,0x37,0x56, 0x6,0x47,0x63, 0x5,0x37,0x58, 0x6,0x47,0x5e, + 0xf,0x3a,0x3d, 0xf,0x3a,0x40, 0xf,0x3a,0x31, 0xf,0x3a,0x2a, + 0x5,0x37,0x45, 0x5,0x3e,0x56, 0x5,0x37,0x53, 0x5,0x37,0x4c, + 0x5,0x37,0x52, 0x5,0x37,0x51, 0x5,0x37,0x4a, 0x5,0x37,0x4d, + 0x5,0x37,0x55, 0x6,0x47,0x67, 0xf,0x33,0x67, 0x5,0x3e,0x5f, + 0x5,0x3e,0x5a, 0x5,0x3e,0x5d, 0x5,0x3e,0x57, 0x4,0x3c,0x65, + 0x5,0x3e,0x59, 0x6,0x51,0x63, 0x4,0x3c,0x62, 0x4,0x3c,0x60, + 0x6,0x51,0x67, 0x6,0x51,0x65, 0x6,0x5b,0x7c, 0x5,0x3e,0x5c, + 0x5,0x3e,0x5b, 0x6,0x51,0x66, 0xf,0x40,0x78, 0xf,0x40,0x79, + 0xf,0x40,0x7a, 0xf,0x40,0x7c, 0xf,0x40,0x7d, 0xf,0x40,0x7e, + 0xf,0x41,0x22, 0xf,0x41,0x23, 0x6,0x51,0x62, 0x6,0x51,0x64, + 0xf,0x40,0x77, 0x6,0x51,0x68, 0x5,0x3e,0x58, 0x5,0x3e,0x5e, + 0x5,0x3e,0x60, 0x6,0x51,0x6a, 0xf,0x41,0x21, 0x4,0x42,0x70, + 0x5,0x45,0x32, 0x4,0x42,0x6a, 0x6,0x5b,0x7b, 0x4,0x42,0x71, + 0x6,0x5b,0x73, 0x5,0x45,0x34, 0x7,0x22,0x29, 0x4,0x42,0x73, + 0x6,0x5b,0x75, 0xf,0x47,0x48, 0x4,0x42,0x6f, 0x5,0x45,0x37, + 0x4,0x42,0x6e, 0xf,0x47,0x47, 0xf,0x47,0x49, 0xf,0x47,0x4a, + 0xf,0x47,0x4b, 0xf,0x47,0x4c, 0xf,0x47,0x4d, 0xf,0x47,0x4e, + 0xf,0x47,0x4f, 0xf,0x47,0x50, 0xf,0x47,0x51, 0xf,0x47,0x52, + 0xf,0x47,0x54, 0x6,0x5b,0x74, 0x6,0x5b,0x78, 0x4,0x42,0x72, + 0x4,0x42,0x65, 0x6,0x5b,0x76, 0xf,0x47,0x53, 0x5,0x45,0x33, + 0x5,0x45,0x36, 0x5,0x45,0x35, 0x7,0x22,0x26, 0x5,0x45,0x31, + 0x6,0x5b,0x77, 0x5,0x4c,0x5b, 0x5,0x4c,0x59, 0x4,0x49,0x39, + 0x5,0x4c,0x56, 0x7,0x22,0x2f, 0x5,0x4c,0x57, 0x4,0x49,0x3f, + 0x4,0x49,0x3b, 0x7,0x22,0x2c, 0x4,0x49,0x3e, 0x7,0x22,0x25, + 0x6,0x5b,0x79, 0x7,0x22,0x24, 0xf,0x4e,0x3a, 0x7,0x37,0x51, + 0xf,0x47,0x45, 0x5,0x4c,0x54, 0x5,0x4c,0x5c, 0xf,0x4e,0x33, + 0xf,0x4e,0x34, 0xf,0x4e,0x35, 0xf,0x4e,0x36, 0xf,0x4e,0x37, + 0xf,0x4e,0x38, 0xf,0x4e,0x39, 0xf,0x4e,0x3b, 0xf,0x4e,0x3d, + 0xf,0x4e,0x3e, 0xf,0x4e,0x3f, 0xf,0x4e,0x40, 0xf,0x4e,0x41, + 0xf,0x4e,0x42, 0xf,0x4e,0x44, 0x6,0x5b,0x7a, 0x7,0x22,0x27, + 0x7,0x22,0x2e, 0x7,0x22,0x2d, 0x7,0x22,0x28, 0x7,0x22,0x23, + 0xf,0x4e,0x45, 0xf,0x4e,0x43, 0xf,0x4e,0x3c, 0x5,0x4c,0x5a, + 0x5,0x4c,0x55, 0x4,0x49,0x3d, 0x7,0x22,0x2a, 0x5,0x4c,0x58, + 0x7,0x22,0x2b, 0xf,0x54,0x25, 0x5,0x54,0x28, 0x5,0x54,0x23, + 0x7,0x2d,0x25, 0x7,0x2c,0x7e, 0x5,0x54,0x29, 0x5,0x54,0x26, + 0x7,0x2d,0x21, 0x4,0x4f,0x7e, 0x7,0x2d,0x28, 0x5,0x54,0x22, + 0x7,0x2d,0x2b, 0x5,0x53,0x7d, 0x7,0x2d,0x2a, 0x7,0x2d,0x2c, + 0xf,0x53,0x7b, 0xf,0x53,0x7c, 0xf,0x53,0x7d, 0xf,0x53,0x7e, + 0xf,0x54,0x22, 0xf,0x54,0x23, 0xf,0x54,0x24, 0xf,0x54,0x26, + 0xf,0x54,0x27, 0xf,0x54,0x2b, 0xf,0x54,0x2c, 0x5,0x53,0x7e, + 0x7,0x2d,0x26, 0x7,0x2d,0x27, 0x7,0x2d,0x23, 0x7,0x2d,0x22, + 0x7,0x2d,0x24, 0xf,0x54,0x21, 0xf,0x54,0x28, 0x5,0x54,0x27, + 0x5,0x54,0x21, 0x5,0x54,0x25, 0x7,0x2d,0x29, 0x7,0x37,0x4b, + 0x7,0x37,0x54, 0x7,0x37,0x4f, 0x4,0x4f,0x7d, 0x7,0x37,0x4d, + 0x4,0x56,0x23, 0x7,0x37,0x53, 0x7,0x37,0x4a, 0x5,0x5b,0x36, + 0x5,0x5b,0x34, 0x7,0x37,0x4c, 0x7,0x37,0x4e, 0x7,0x37,0x50, + 0x5,0x5b,0x35, 0x4,0x56,0x25, 0xf,0x59,0x6c, 0xf,0x59,0x6d, + 0xf,0x59,0x6e, 0xf,0x59,0x6f, 0xf,0x59,0x70, 0xf,0x59,0x71, + 0x7,0x37,0x52, 0x7,0x37,0x55, 0x7,0x37,0x49, 0x5,0x61,0x4b, + 0x4,0x5a,0x7c, 0x7,0x3f,0x3f, 0x5,0x61,0x4c, 0x5,0x61,0x4d, + 0x7,0x3f,0x3e, 0x7,0x3f,0x40, 0xf,0x5e,0x50, 0xf,0x5e,0x51, + 0xf,0x5e,0x52, 0xf,0x5e,0x54, 0x7,0x3f,0x3d, 0x7,0x3f,0x41, + 0xf,0x5e,0x53, 0x7,0x3f,0x3c, 0x5,0x67,0x5f, 0x4,0x5f,0x53, + 0x7,0x46,0x4d, 0x7,0x46,0x52, 0x7,0x46,0x50, 0xf,0x5e,0x55, + 0xf,0x62,0x2a, 0xf,0x62,0x2b, 0x7,0x46,0x4e, 0x5,0x67,0x61, + 0x5,0x67,0x60, 0xf,0x5f,0x73, 0x7,0x4d,0x51, 0x5,0x6b,0x79, + 0xf,0x65,0x26, 0x5,0x6b,0x7a, 0x5,0x6b,0x7b, 0x7,0x53,0x2a, + 0x5,0x6f,0x76, 0x7,0x53,0x2b, 0x5,0x6f,0x75, 0xf,0x67,0x4d, + 0xf,0x67,0x4e, 0x7,0x57,0x62, 0x5,0x73,0x36, 0x7,0x57,0x61, + 0x7,0x57,0x63, 0x7,0x57,0x5f, 0xf,0x69,0x3f, 0x7,0x57,0x60, + 0x7,0x57,0x64, 0xf,0x69,0x40, 0x5,0x75,0x69, 0x7,0x5b,0x4c, + 0x7,0x5e,0x5a, 0x7,0x5e,0x5b, 0xf,0x6b,0x45, 0x7,0x5e,0x59, + 0x7,0x5e,0x5c, 0xf,0x6c,0x24, 0x5,0x79,0x24, 0xf,0x6c,0x4a, + 0x7,0x63,0x4d, 0x5,0x7a,0x65, 0x4,0x21,0x33, 0x6,0x22,0x68, + 0x5,0x21,0x63, 0x6,0x22,0x69, 0xf,0x21,0x58, 0xf,0x21,0x57, + 0x6,0x24,0x45, 0x6,0x24,0x44, 0x6,0x26,0x76, 0x6,0x26,0x77, + 0x5,0x23,0x6a, 0x4,0x23,0x6c, 0xf,0x23,0x70, 0x5,0x23,0x69, + 0x4,0x28,0x6f, 0x6,0x30,0x24, 0x6,0x2a,0x63, 0x6,0x2a,0x62, + 0xf,0x26,0x4a, 0xf,0x26,0x4b, 0xf,0x26,0x4c, 0xf,0x26,0x4d, + 0xf,0x26,0x4f, 0x6,0x2a,0x64, 0xf,0x26,0x4e, 0x6,0x30,0x23, + 0x6,0x30,0x21, 0x6,0x30,0x26, 0x6,0x30,0x25, 0xf,0x2a,0x35, + 0xf,0x2a,0x36, 0xf,0x2a,0x37, 0x6,0x30,0x22, 0x6,0x36,0x59, + 0x5,0x2c,0x79, 0x6,0x36,0x58, 0xf,0x2e,0x7a, 0xf,0x2e,0x7b, + 0x5,0x2c,0x7a, 0xf,0x33,0x66, 0xf,0x34,0x24, 0xf,0x34,0x25, + 0xf,0x34,0x26, 0xf,0x34,0x27, 0x5,0x37,0x5c, 0x6,0x47,0x69, + 0x5,0x37,0x5b, 0x6,0x47,0x6a, 0xf,0x3a,0x47, 0x6,0x47,0x68, + 0xf,0x3a,0x46, 0x4,0x3c,0x66, 0x4,0x3c,0x68, 0x6,0x51,0x6d, + 0x5,0x3e,0x62, 0xf,0x41,0x25, 0xf,0x41,0x26, 0x6,0x51,0x6b, + 0x6,0x51,0x6c, 0x5,0x3e,0x61, 0x4,0x3c,0x69, 0x6,0x5b,0x7d, + 0xf,0x47,0x55, 0xf,0x47,0x56, 0x5,0x45,0x38, 0x4,0x49,0x41, + 0x4,0x49,0x42, 0xf,0x4e,0x46, 0x5,0x4c,0x5d, 0x7,0x2d,0x2f, + 0x7,0x2d,0x2e, 0x7,0x2d,0x31, 0x7,0x2d,0x32, 0x5,0x54,0x2a, + 0x7,0x2d,0x30, 0xf,0x54,0x2d, 0xf,0x54,0x2e, 0x7,0x37,0x56, + 0x7,0x4d,0x52, 0xf,0x62,0x2c, 0xf,0x62,0x2d, 0x5,0x6b,0x7c, + 0xf,0x6c,0x60, 0x6,0x21,0x69, 0x5,0x21,0x64, 0x6,0x24,0x46, + 0x6,0x24,0x49, 0x6,0x24,0x4a, 0x4,0x22,0x5a, 0xf,0x22,0x3d, + 0xf,0x22,0x3e, 0xf,0x22,0x3f, 0xf,0x22,0x40, 0xf,0x22,0x41, + 0x6,0x24,0x47, 0x6,0x26,0x7e, 0x6,0x26,0x7d, 0x4,0x23,0x6e, + 0x6,0x26,0x7b, 0x6,0x26,0x7c, 0xf,0x23,0x72, 0x5,0x25,0x65, + 0x5,0x25,0x64, 0x6,0x2a,0x66, 0x5,0x25,0x66, 0x6,0x2a,0x67, + 0x6,0x2a,0x68, 0xf,0x26,0x51, 0xf,0x26,0x52, 0xf,0x26,0x54, + 0xf,0x26,0x55, 0x6,0x2a,0x65, 0xf,0x26,0x53, 0x5,0x28,0x6c, + 0x6,0x30,0x28, 0x6,0x30,0x2a, 0x5,0x28,0x6d, 0x4,0x28,0x71, + 0x4,0x28,0x72, 0x4,0x28,0x73, 0x6,0x30,0x2b, 0x6,0x30,0x27, + 0x6,0x30,0x29, 0xf,0x2a,0x38, 0xf,0x2a,0x3a, 0xf,0x2a,0x3b, + 0xf,0x2a,0x3c, 0x6,0x30,0x2c, 0x6,0x30,0x2d, 0x4,0x2c,0x4a, + 0x6,0x36,0x61, 0x4,0x2c,0x45, 0x4,0x2c,0x44, 0x4,0x2c,0x43, + 0x4,0x2c,0x47, 0x6,0x36,0x64, 0x6,0x36,0x65, 0x6,0x36,0x5f, + 0x6,0x36,0x5e, 0x5,0x2c,0x7d, 0x5,0x2d,0x22, 0x6,0x36,0x5b, + 0x6,0x36,0x62, 0xf,0x2e,0x7c, 0xf,0x2e,0x7d, 0x6,0x36,0x60, + 0x6,0x36,0x63, 0x6,0x36,0x5a, 0x6,0x36,0x5c, 0x5,0x2d,0x21, + 0x5,0x2c,0x7e, 0x4,0x31,0x2d, 0x5,0x31,0x6f, 0x6,0x3e,0x57, + 0x6,0x3e,0x59, 0x6,0x3e,0x58, 0x6,0x3e,0x56, 0x6,0x3e,0x5b, + 0x5,0x31,0x70, 0xf,0x34,0x28, 0xf,0x34,0x29, 0xf,0x34,0x2a, + 0xf,0x34,0x2b, 0xf,0x34,0x2c, 0xf,0x34,0x2d, 0xf,0x34,0x2e, + 0xf,0x34,0x2f, 0x4,0x31,0x2f, 0x6,0x3e,0x5c, 0x5,0x31,0x6e, + 0x6,0x3e,0x55, 0x5,0x37,0x5e, 0x4,0x37,0x26, 0x5,0x37,0x61, + 0x6,0x47,0x70, 0x6,0x47,0x6b, 0x4,0x37,0x23, 0x5,0x37,0x5d, + 0x5,0x37,0x60, 0x6,0x47,0x6e, 0x4,0x37,0x25, 0x5,0x37,0x5f, + 0x6,0x47,0x6f, 0x6,0x47,0x6c, 0xf,0x3a,0x48, 0xf,0x3a,0x49, + 0xf,0x3a,0x4a, 0xf,0x3a,0x4b, 0xf,0x3a,0x4c, 0xf,0x3a,0x4d, + 0xf,0x3a,0x4e, 0xf,0x3a,0x4f, 0x6,0x47,0x6d, 0x5,0x37,0x62, + 0xf,0x3d,0x6c, 0x6,0x51,0x74, 0x6,0x51,0x70, 0x4,0x3c,0x6b, + 0x4,0x3c,0x70, 0x5,0x3e,0x63, 0x6,0x51,0x77, 0x5,0x3e,0x64, + 0x6,0x51,0x72, 0x6,0x51,0x71, 0x6,0x51,0x76, 0x4,0x3c,0x6d, + 0x6,0x51,0x73, 0x6,0x51,0x6f, 0x6,0x51,0x75, 0xf,0x41,0x27, + 0xf,0x41,0x28, 0xf,0x41,0x29, 0xf,0x41,0x2a, 0xf,0x41,0x2c, + 0xf,0x41,0x2d, 0xf,0x41,0x2e, 0x6,0x51,0x6e, 0x6,0x5b,0x7e, + 0x6,0x5c,0x27, 0x5,0x45,0x3c, 0x5,0x45,0x3a, 0x6,0x5c,0x24, + 0x6,0x5c,0x2c, 0x4,0x42,0x76, 0x6,0x5c,0x2e, 0x6,0x5c,0x2b, + 0x6,0x5c,0x26, 0x5,0x45,0x39, 0x7,0x22,0x33, 0xf,0x47,0x57, + 0xf,0x47,0x58, 0xf,0x47,0x59, 0xf,0x47,0x5a, 0x6,0x5c,0x28, + 0x6,0x5c,0x25, 0x6,0x5c,0x29, 0x6,0x5c,0x2d, 0x6,0x5c,0x21, + 0x6,0x5c,0x23, 0x5,0x45,0x3b, 0x6,0x5c,0x2a, 0xf,0x47,0x44, + 0x6,0x62,0x67, 0x7,0x22,0x30, 0x5,0x4c,0x5e, 0x4,0x49,0x47, + 0x7,0x22,0x37, 0x4,0x49,0x48, 0x7,0x22,0x35, 0x7,0x22,0x32, + 0xf,0x4e,0x47, 0xf,0x4e,0x48, 0xf,0x4e,0x49, 0xf,0x4e,0x4a, + 0xf,0x4e,0x4b, 0xf,0x4e,0x4c, 0xf,0x4e,0x4e, 0xf,0x4e,0x4f, + 0x7,0x22,0x38, 0x7,0x22,0x36, 0xf,0x4e,0x4d, 0x5,0x4c,0x61, + 0x5,0x4c,0x5f, 0x7,0x22,0x31, 0x5,0x4c,0x60, 0x7,0x2d,0x35, + 0x7,0x2d,0x37, 0x5,0x54,0x2c, 0x4,0x50,0x22, 0x5,0x54,0x2d, + 0x5,0x54,0x2b, 0x7,0x2d,0x36, 0x7,0x2d,0x33, 0x7,0x2d,0x34, + 0xf,0x54,0x2f, 0xf,0x54,0x30, 0xf,0x54,0x31, 0xf,0x54,0x33, + 0xf,0x54,0x34, 0xf,0x54,0x35, 0xf,0x54,0x36, 0xf,0x54,0x37, + 0x7,0x37,0x59, 0x7,0x37,0x57, 0x5,0x5b,0x38, 0xf,0x59,0x72, + 0xf,0x59,0x73, 0xf,0x59,0x74, 0xf,0x59,0x75, 0x7,0x37,0x58, + 0x7,0x37,0x5a, 0x7,0x22,0x34, 0x5,0x5b,0x37, 0x7,0x46,0x58, + 0x5,0x61,0x4e, 0xf,0x59,0x76, 0xf,0x5e,0x56, 0xf,0x5e,0x57, + 0x7,0x3f,0x42, 0xf,0x62,0x2e, 0x4,0x5f,0x57, 0x7,0x46,0x53, + 0x7,0x46,0x55, 0x4,0x5f,0x56, 0x7,0x46,0x57, 0x7,0x46,0x56, + 0xf,0x62,0x2f, 0x7,0x46,0x54, 0x4,0x63,0x36, 0x7,0x4d,0x53, + 0x7,0x53,0x2c, 0x4,0x66,0x38, 0x7,0x53,0x2d, 0xf,0x67,0x4f, + 0xf,0x67,0x50, 0x7,0x53,0x2e, 0x5,0x73,0x38, 0x4,0x68,0x66, + 0x7,0x57,0x65, 0x5,0x73,0x37, 0x7,0x57,0x66, 0x4,0x6a,0x45, + 0x4,0x6b,0x67, 0xf,0x6b,0x46, 0x7,0x60,0x6c, 0x7,0x64,0x45, + 0x5,0x79,0x25, 0xf,0x6c,0x25, 0x4,0x6d,0x54, 0x5,0x7a,0x27, + 0x4,0x6d,0x71, 0x7,0x63,0x4e, 0x7,0x65,0x34, 0x6,0x21,0x6a, + 0x6,0x2a,0x6a, 0x6,0x2a,0x69, 0xf,0x26,0x56, 0xf,0x26,0x57, + 0x5,0x28,0x6f, 0x6,0x30,0x2e, 0xf,0x2a,0x3d, 0x6,0x30,0x31, + 0x6,0x30,0x2f, 0x4,0x31,0x31, 0x6,0x43,0x67, 0x6,0x3e,0x5e, + 0x6,0x3e,0x5d, 0x4,0x37,0x27, 0x6,0x3e,0x5f, 0x6,0x51,0x7a, + 0x6,0x51,0x78, 0x6,0x51,0x79, 0x6,0x5c,0x30, 0x4,0x44,0x26, + 0xf,0x47,0x5b, 0x6,0x5c,0x31, 0x5,0x45,0x3d, 0xf,0x4e,0x51, + 0x7,0x22,0x3a, 0x7,0x22,0x39, 0x7,0x2d,0x39, 0x5,0x53,0x52, + 0x7,0x2d,0x38, 0x7,0x37,0x5b, 0x7,0x37,0x5c, 0x5,0x61,0x4f, + 0x7,0x46,0x59, 0x7,0x4d,0x54, 0x7,0x53,0x2f, 0x6,0x21,0x6b, + 0xf,0x21,0x39, 0x6,0x24,0x4c, 0x5,0x22,0x4c, 0x6,0x27,0x24, + 0x4,0x23,0x72, 0x6,0x27,0x23, 0x6,0x27,0x22, 0xf,0x23,0x73, + 0x5,0x25,0x67, 0xf,0x26,0x58, 0x6,0x2a,0x6b, 0x6,0x30,0x32, + 0x6,0x30,0x30, 0x6,0x30,0x33, 0x5,0x28,0x70, 0x4,0x2c,0x4b, + 0xf,0x2f,0x21, 0x6,0x36,0x69, 0x6,0x3e,0x61, 0x5,0x31,0x71, + 0x5,0x37,0x63, 0x6,0x3e,0x63, 0x6,0x3e,0x60, 0x6,0x3e,0x62, + 0xf,0x34,0x30, 0x6,0x47,0x71, 0xf,0x3a,0x50, 0x6,0x47,0x73, + 0x6,0x47,0x72, 0x5,0x3e,0x65, 0xf,0x41,0x2f, 0x5,0x45,0x3e, + 0x6,0x5c,0x33, 0x6,0x5c,0x32, 0x5,0x4c,0x62, 0x7,0x22,0x3b, + 0x5,0x54,0x2f, 0x7,0x2d,0x3a, 0xf,0x59,0x77, 0x5,0x61,0x50, + 0x5,0x6f,0x77, 0x4,0x21,0x4a, 0xf,0x21,0x3a, 0x5,0x21,0x65, + 0xf,0x21,0x4d, 0xf,0x21,0x5a, 0x6,0x22,0x6b, 0x6,0x22,0x6a, + 0x5,0x22,0x4d, 0xf,0x22,0x43, 0x5,0x23,0x6c, 0x4,0x23,0x73, + 0x5,0x25,0x68, 0x6,0x27,0x25, 0x5,0x23,0x6b, 0x5,0x23,0x6e, + 0x5,0x23,0x6d, 0x6,0x30,0x34, 0x5,0x25,0x69, 0x6,0x2a,0x6c, + 0x5,0x25,0x6b, 0xf,0x26,0x59, 0x6,0x30,0x35, 0x5,0x25,0x6a, + 0x5,0x28,0x71, 0x6,0x30,0x37, 0x6,0x30,0x38, 0x5,0x28,0x72, + 0x6,0x30,0x39, 0x5,0x2d,0x23, 0x6,0x36,0x6c, 0x6,0x36,0x6a, + 0x5,0x2d,0x24, 0x6,0x36,0x6b, 0x6,0x36,0x6d, 0xf,0x2f,0x22, + 0x6,0x3e,0x66, 0x5,0x31,0x72, 0x4,0x31,0x34, 0x5,0x31,0x74, + 0x6,0x47,0x76, 0x6,0x47,0x74, 0x6,0x47,0x75, 0x4,0x37,0x2a, + 0x6,0x47,0x77, 0xf,0x3a,0x51, 0x6,0x51,0x7b, 0x6,0x51,0x7d, + 0x6,0x51,0x7c, 0x5,0x48,0x26, 0x4,0x42,0x7a, 0x6,0x5c,0x34, + 0x5,0x45,0x40, 0x5,0x45,0x3f, 0x6,0x5c,0x35, 0x5,0x45,0x41, + 0x7,0x2d,0x3d, 0x7,0x22,0x3e, 0x7,0x22,0x3d, 0x7,0x22,0x3c, + 0x7,0x2d,0x3b, 0x5,0x54,0x30, 0x7,0x2d,0x3c, 0x7,0x2d,0x3e, + 0xf,0x54,0x38, 0x7,0x37,0x5d, 0x4,0x66,0x39, 0x4,0x68,0x67, + 0x5,0x79,0x26, 0x6,0x21,0x3e, 0x4,0x21,0x75, 0x4,0x21,0x74, + 0x6,0x22,0x6c, 0x6,0x24,0x4d, 0x4,0x22,0x5e, 0x5,0x22,0x4e, + 0x6,0x24,0x4e, 0x6,0x24,0x50, 0x6,0x24,0x51, 0x6,0x24,0x4f, + 0xf,0x22,0x44, 0x6,0x27,0x29, 0xf,0x23,0x74, 0x6,0x27,0x27, + 0x6,0x27,0x26, 0x6,0x27,0x28, 0x5,0x23,0x6f, 0x4,0x26,0x2c, + 0x4,0x26,0x2b, 0x6,0x2a,0x6d, 0x6,0x2a,0x6e, 0x5,0x25,0x6c, + 0x6,0x2a,0x6f, 0xf,0x26,0x5b, 0x5,0x25,0x6d, 0x4,0x28,0x77, + 0x6,0x30,0x3a, 0x6,0x30,0x3f, 0x4,0x28,0x7a, 0x4,0x28,0x76, + 0x5,0x28,0x75, 0x6,0x30,0x3e, 0x6,0x30,0x3d, 0x6,0x30,0x3c, + 0x6,0x30,0x3b, 0xf,0x2a,0x40, 0xf,0x2a,0x41, 0xf,0x2a,0x42, + 0xf,0x2a,0x43, 0xf,0x2a,0x44, 0xf,0x2a,0x3f, 0x6,0x30,0x40, + 0x5,0x28,0x74, 0x6,0x36,0x72, 0x4,0x2c,0x50, 0x6,0x36,0x6f, + 0x4,0x2c,0x4f, 0x6,0x3e,0x67, 0x6,0x36,0x70, 0x6,0x36,0x6e, + 0xf,0x2f,0x23, 0xf,0x2f,0x24, 0xf,0x2f,0x26, 0xf,0x2f,0x27, + 0xf,0x2f,0x28, 0x5,0x2d,0x26, 0x5,0x2d,0x27, 0x6,0x36,0x71, + 0x6,0x36,0x73, 0x5,0x2d,0x25, 0x6,0x36,0x74, 0x6,0x3e,0x6d, + 0x6,0x3e,0x69, 0x5,0x31,0x78, 0x5,0x31,0x7a, 0x5,0x31,0x77, + 0x5,0x31,0x79, 0x5,0x31,0x76, 0x5,0x31,0x7b, 0x6,0x3e,0x70, + 0x6,0x3e,0x6a, 0xf,0x34,0x31, 0xf,0x34,0x32, 0xf,0x34,0x35, + 0xf,0x34,0x36, 0xf,0x34,0x37, 0xf,0x34,0x38, 0xf,0x34,0x39, + 0xf,0x34,0x3a, 0x6,0x3e,0x68, 0x6,0x3e,0x6c, 0x6,0x3e,0x6f, + 0x6,0x3e,0x6e, 0xf,0x34,0x33, 0x6,0x48,0x23, 0x6,0x48,0x24, + 0x6,0x48,0x22, 0x4,0x37,0x2c, 0x6,0x47,0x7e, 0x6,0x47,0x7a, + 0x5,0x37,0x64, 0x4,0x37,0x2d, 0x5,0x37,0x65, 0x6,0x47,0x79, + 0x6,0x47,0x78, 0x6,0x48,0x25, 0x6,0x48,0x21, 0x6,0x48,0x26, + 0x6,0x47,0x7c, 0xf,0x3a,0x52, 0xf,0x3a,0x53, 0xf,0x3a,0x54, + 0x6,0x47,0x7d, 0x4,0x37,0x2e, 0x6,0x52,0x23, 0x5,0x3e,0x69, + 0x5,0x3e,0x67, 0x6,0x52,0x26, 0x5,0x3e,0x68, 0x6,0x52,0x25, + 0x6,0x52,0x29, 0x6,0x52,0x21, 0x6,0x51,0x7e, 0x6,0x52,0x27, + 0x6,0x52,0x24, 0xf,0x41,0x30, 0xf,0x41,0x31, 0xf,0x41,0x32, + 0x6,0x52,0x22, 0x6,0x52,0x28, 0x5,0x3e,0x66, 0x4,0x42,0x7c, + 0x4,0x42,0x7e, 0x4,0x42,0x7b, 0x6,0x5c,0x38, 0x6,0x5c,0x36, + 0x6,0x5c,0x37, 0xf,0x47,0x5d, 0x6,0x5c,0x39, 0x5,0x45,0x42, + 0x7,0x22,0x40, 0x5,0x4c,0x66, 0xf,0x4e,0x52, 0xf,0x4e,0x53, + 0xf,0x4e,0x54, 0xf,0x4e,0x55, 0xf,0x4e,0x56, 0x5,0x4c,0x65, + 0x5,0x4c,0x64, 0x7,0x2d,0x40, 0x7,0x2d,0x3f, 0x7,0x22,0x3f, + 0xf,0x54,0x39, 0x7,0x30,0x2d, 0x7,0x37,0x5e, 0x7,0x3f,0x43, + 0x4,0x5f,0x58, 0x5,0x67,0x62, 0xf,0x65,0x27, 0xf,0x65,0x28, + 0x5,0x6b,0x7d, 0xf,0x67,0x51, 0x5,0x73,0x3a, 0x5,0x21,0x30, + 0x6,0x21,0x6c, 0x6,0x22,0x6d, 0x6,0x24,0x54, 0x6,0x24,0x53, + 0x6,0x24,0x52, 0x5,0x22,0x4f, 0x4,0x23,0x75, 0x6,0x27,0x2a, + 0x4,0x26,0x2d, 0x6,0x2a,0x71, 0x6,0x2a,0x70, 0x5,0x28,0x77, + 0x6,0x30,0x42, 0x6,0x30,0x43, 0x5,0x28,0x76, 0x6,0x30,0x44, + 0x6,0x36,0x77, 0x6,0x36,0x78, 0x6,0x36,0x76, 0x6,0x35,0x28, + 0x6,0x36,0x75, 0x6,0x3e,0x71, 0x6,0x3e,0x72, 0x6,0x48,0x28, + 0x5,0x37,0x67, 0x6,0x48,0x29, 0x6,0x48,0x27, 0xf,0x3a,0x55, + 0x6,0x52,0x2a, 0x6,0x5c,0x3a, 0x7,0x22,0x41, 0x7,0x2d,0x41, + 0x7,0x22,0x42, 0x7,0x22,0x43, 0x7,0x53,0x30, 0x7,0x5e,0x5d, + 0x5,0x21,0x45, 0x5,0x21,0x46, 0x6,0x22,0x70, 0x6,0x22,0x6e, + 0x6,0x22,0x72, 0x6,0x22,0x71, 0xf,0x21,0x5c, 0xf,0x21,0x5d, + 0xf,0x21,0x5e, 0x6,0x22,0x73, 0x5,0x21,0x66, 0x6,0x22,0x6f, + 0x6,0x24,0x57, 0x6,0x24,0x55, 0x6,0x24,0x59, 0x3,0x23,0x59, + 0xf,0x22,0x45, 0xf,0x22,0x46, 0x6,0x24,0x56, 0x5,0x22,0x53, + 0x6,0x24,0x5a, 0x6,0x24,0x58, 0x5,0x22,0x52, 0x6,0x27,0x2e, + 0x5,0x23,0x71, 0x5,0x23,0x78, 0x5,0x23,0x79, 0x6,0x27,0x30, + 0x5,0x23,0x76, 0x5,0x23,0x75, 0x5,0x23,0x77, 0x5,0x23,0x72, + 0x5,0x23,0x73, 0x6,0x27,0x31, 0x6,0x27,0x2c, 0x6,0x27,0x32, + 0xf,0x23,0x76, 0xf,0x23,0x77, 0xf,0x23,0x79, 0xf,0x23,0x7a, + 0xf,0x23,0x7b, 0xf,0x23,0x7e, 0xf,0x24,0x21, 0x6,0x27,0x2d, + 0x6,0x27,0x2f, 0x4,0x23,0x7d, 0xf,0x23,0x7d, 0x6,0x27,0x34, + 0x6,0x27,0x33, 0x4,0x23,0x7c, 0x6,0x27,0x2b, 0x5,0x23,0x7a, + 0x4,0x26,0x30, 0x5,0x25,0x75, 0x6,0x2a,0x75, 0x4,0x26,0x33, + 0x6,0x2a,0x72, 0x5,0x25,0x73, 0x5,0x25,0x74, 0x6,0x2a,0x7a, + 0x5,0x25,0x71, 0x6,0x2a,0x77, 0x6,0x2a,0x7c, 0x5,0x25,0x6f, + 0x6,0x2a,0x79, 0x5,0x25,0x72, 0x5,0x25,0x70, 0x6,0x2a,0x74, + 0x6,0x27,0x35, 0xf,0x26,0x5c, 0xf,0x26,0x5d, 0xf,0x26,0x5e, + 0xf,0x26,0x5f, 0xf,0x26,0x60, 0xf,0x26,0x61, 0xf,0x26,0x63, + 0xf,0x26,0x64, 0xf,0x26,0x65, 0xf,0x26,0x66, 0xf,0x26,0x67, + 0xf,0x26,0x68, 0x6,0x2a,0x78, 0x6,0x2d,0x2b, 0x6,0x2a,0x73, + 0x5,0x25,0x76, 0x6,0x30,0x50, 0x6,0x30,0x4a, 0x5,0x28,0x78, + 0x6,0x30,0x4b, 0x5,0x28,0x79, 0x4,0x28,0x7e, 0x5,0x28,0x7a, + 0x6,0x30,0x46, 0x6,0x30,0x49, 0x6,0x30,0x52, 0xf,0x2a,0x45, + 0xf,0x2a,0x47, 0xf,0x2a,0x48, 0xf,0x2a,0x4b, 0xf,0x2a,0x4c, + 0xf,0x2a,0x4d, 0xf,0x2a,0x4e, 0xf,0x2a,0x4f, 0xf,0x2a,0x50, + 0xf,0x2a,0x51, 0x6,0x30,0x4d, 0x6,0x30,0x45, 0x6,0x30,0x47, + 0x6,0x30,0x51, 0x6,0x30,0x4f, 0x6,0x30,0x4c, 0xf,0x2a,0x4a, + 0xf,0x2a,0x46, 0x6,0x30,0x48, 0x5,0x28,0x7b, 0x4,0x28,0x7c, + 0x5,0x2d,0x2c, 0x5,0x2d,0x29, 0x4,0x2c,0x52, 0x4,0x2c,0x59, + 0x5,0x2d,0x2a, 0x6,0x37,0x21, 0x4,0x2c,0x58, 0x5,0x2d,0x34, + 0x5,0x2d,0x30, 0x5,0x2d,0x2b, 0x6,0x36,0x7d, 0x5,0x2d,0x31, + 0x5,0x2d,0x2d, 0x5,0x2d,0x2f, 0x6,0x37,0x24, 0x6,0x36,0x7e, + 0x4,0x2c,0x62, 0x6,0x36,0x79, 0x4,0x2c,0x63, 0x4,0x2c,0x56, + 0x6,0x37,0x25, 0x6,0x37,0x22, 0x6,0x37,0x23, 0x6,0x36,0x7b, + 0xf,0x2f,0x29, 0xf,0x2f,0x2a, 0xf,0x2f,0x2b, 0xf,0x2f,0x2c, + 0xf,0x2f,0x2d, 0xf,0x2f,0x2e, 0xf,0x2f,0x2f, 0xf,0x2f,0x31, + 0xf,0x2f,0x33, 0x5,0x2d,0x28, 0xf,0x2f,0x30, 0xf,0x2f,0x32, + 0x5,0x2d,0x33, 0x4,0x2c,0x5d, 0x5,0x2d,0x35, 0x5,0x2d,0x36, + 0x5,0x2d,0x32, 0x6,0x3b,0x4e, 0x4,0x31,0x3a, 0x6,0x3f,0x2b, + 0x6,0x3f,0x24, 0x6,0x3f,0x26, 0x4,0x31,0x3c, 0x4,0x31,0x3e, + 0x5,0x31,0x7e, 0x6,0x3e,0x79, 0x6,0x3f,0x22, 0x6,0x3e,0x7b, + 0x5,0x32,0x28, 0x4,0x31,0x38, 0x6,0x3f,0x27, 0x6,0x3f,0x2c, + 0x6,0x3f,0x29, 0x6,0x3e,0x74, 0x6,0x3f,0x2a, 0x4,0x31,0x40, + 0x4,0x31,0x3b, 0x5,0x31,0x7c, 0x5,0x32,0x26, 0x6,0x3e,0x73, + 0x4,0x31,0x36, 0x5,0x31,0x7d, 0x5,0x32,0x24, 0x6,0x3f,0x28, + 0x6,0x3f,0x23, 0xf,0x34,0x3b, 0xf,0x34,0x3c, 0xf,0x34,0x3d, + 0xf,0x34,0x3e, 0xf,0x34,0x40, 0xf,0x34,0x41, 0xf,0x34,0x42, + 0xf,0x34,0x43, 0xf,0x34,0x44, 0xf,0x34,0x46, 0xf,0x34,0x47, + 0xf,0x34,0x48, 0x6,0x3e,0x77, 0x6,0x32,0x2a, 0x6,0x3e,0x7d, + 0x6,0x3e,0x7c, 0x6,0x3e,0x7e, 0x6,0x3f,0x21, 0x6,0x3f,0x25, + 0x4,0x31,0x3f, 0x5,0x32,0x29, 0x5,0x32,0x21, 0x5,0x32,0x27, + 0x5,0x32,0x23, 0x5,0x32,0x22, 0x5,0x32,0x25, 0x5,0x32,0x2a, + 0x5,0x37,0x69, 0x6,0x48,0x33, 0x5,0x37,0x6e, 0x6,0x48,0x2a, + 0x6,0x48,0x34, 0x5,0x37,0x6f, 0x5,0x37,0x6c, 0x5,0x37,0x6b, + 0x4,0x37,0x30, 0x5,0x37,0x70, 0x5,0x37,0x6a, 0x5,0x37,0x71, + 0x5,0x37,0x72, 0x5,0x37,0x74, 0x6,0x48,0x2e, 0x6,0x3e,0x7a, + 0x4,0x37,0x31, 0x6,0x48,0x2f, 0x5,0x37,0x6d, 0x4,0x37,0x33, + 0x5,0x37,0x68, 0x5,0x37,0x73, 0xf,0x3a,0x56, 0xf,0x3a,0x58, + 0xf,0x3a,0x59, 0xf,0x3a,0x5a, 0xf,0x3a,0x5b, 0x6,0x48,0x2d, + 0x5,0x37,0x75, 0x6,0x48,0x32, 0x6,0x48,0x2c, 0x6,0x48,0x31, + 0x6,0x48,0x30, 0xf,0x3a,0x5c, 0x5,0x3e,0x70, 0x6,0x52,0x2d, + 0x5,0x3e,0x6c, 0x4,0x3c,0x7a, 0x5,0x3e,0x71, 0x6,0x52,0x2e, + 0x6,0x5c,0x3b, 0x4,0x3c,0x7d, 0x6,0x52,0x35, 0x5,0x3e,0x6a, + 0x5,0x3e,0x73, 0x6,0x52,0x2b, 0x5,0x3e,0x6f, 0x6,0x52,0x2c, + 0x6,0x52,0x39, 0x6,0x52,0x30, 0x6,0x52,0x38, 0x5,0x3e,0x6e, + 0x6,0x52,0x36, 0x6,0x5c,0x40, 0xf,0x41,0x37, 0x5,0x3e,0x72, + 0xf,0x41,0x33, 0xf,0x41,0x34, 0xf,0x41,0x36, 0xf,0x41,0x38, + 0xf,0x41,0x39, 0x6,0x52,0x3a, 0x6,0x52,0x32, 0x6,0x52,0x37, + 0x5,0x3e,0x6b, 0xf,0x41,0x35, 0x6,0x52,0x2f, 0x5,0x45,0x43, + 0x5,0x45,0x4b, 0x5,0x45,0x49, 0x6,0x5c,0x41, 0x6,0x5c,0x3c, + 0x4,0x43,0x2b, 0x4,0x43,0x26, 0x4,0x43,0x25, 0x5,0x45,0x44, + 0x5,0x45,0x48, 0x5,0x45,0x47, 0x5,0x45,0x4a, 0x5,0x45,0x4e, + 0x6,0x5c,0x3e, 0x6,0x5c,0x47, 0x5,0x45,0x4d, 0x5,0x45,0x45, + 0x5,0x45,0x46, 0x6,0x5c,0x42, 0x4,0x43,0x29, 0x6,0x5c,0x46, + 0x4,0x43,0x27, 0x4,0x43,0x23, 0x5,0x45,0x4c, 0x6,0x5c,0x45, + 0x6,0x5c,0x43, 0x6,0x5c,0x3f, 0x4,0x43,0x28, 0xf,0x47,0x5e, + 0xf,0x47,0x5f, 0xf,0x47,0x60, 0xf,0x47,0x61, 0x6,0x52,0x31, + 0x4,0x49,0x4e, 0x7,0x22,0x49, 0x4,0x49,0x52, 0x7,0x22,0x45, + 0x5,0x4c,0x69, 0x7,0x22,0x50, 0x7,0x22,0x4a, 0x5,0x4c,0x6e, + 0x5,0x4c,0x67, 0x7,0x22,0x47, 0x7,0x22,0x51, 0x5,0x4c,0x6f, + 0x7,0x22,0x4f, 0x7,0x22,0x4c, 0x7,0x22,0x4d, 0x5,0x4c,0x70, + 0x5,0x4c,0x6a, 0x5,0x4c,0x6d, 0x7,0x2d,0x44, 0x7,0x22,0x46, + 0xf,0x4e,0x57, 0xf,0x4e,0x58, 0xf,0x4e,0x59, 0xf,0x4e,0x5b, + 0xf,0x4e,0x5c, 0x7,0x22,0x44, 0x7,0x22,0x4b, 0x7,0x22,0x4e, + 0x5,0x4c,0x6b, 0x7,0x22,0x48, 0x4,0x49,0x51, 0x5,0x54,0x33, + 0x4,0x50,0x23, 0x7,0x2d,0x4a, 0x4,0x50,0x24, 0x5,0x54,0x35, + 0x7,0x2d,0x42, 0x5,0x54,0x38, 0x5,0x54,0x34, 0x5,0x54,0x31, + 0x7,0x2d,0x47, 0x7,0x2d,0x43, 0x5,0x5b,0x39, 0x5,0x54,0x32, + 0xf,0x54,0x3a, 0xf,0x54,0x3b, 0xf,0x54,0x3c, 0x7,0x2d,0x45, + 0x7,0x2d,0x49, 0x7,0x2d,0x48, 0x7,0x2d,0x4b, 0x7,0x2d,0x46, + 0x7,0x2d,0x4d, 0x5,0x54,0x37, 0x4,0x56,0x29, 0x5,0x5b,0x3b, + 0x5,0x61,0x55, 0x7,0x37,0x60, 0x5,0x5b,0x3f, 0x7,0x37,0x66, + 0x5,0x5b,0x3a, 0x7,0x37,0x62, 0x7,0x37,0x64, 0x7,0x37,0x61, + 0x5,0x5b,0x3d, 0x7,0x37,0x5f, 0x7,0x37,0x65, 0xf,0x59,0x79, + 0xf,0x59,0x7a, 0xf,0x59,0x7b, 0x4,0x56,0x2a, 0x7,0x37,0x63, + 0x7,0x37,0x67, 0x7,0x39,0x27, 0x5,0x5b,0x40, 0x7,0x46,0x5a, + 0x5,0x61,0x54, 0x7,0x3f,0x47, 0x4,0x5a,0x7e, 0x5,0x61,0x51, + 0x5,0x61,0x52, 0x7,0x3f,0x49, 0xf,0x5e,0x59, 0x5,0x61,0x53, + 0x7,0x3f,0x46, 0xf,0x5e,0x58, 0x7,0x3f,0x45, 0x7,0x3f,0x48, + 0x5,0x61,0x56, 0x5,0x61,0x57, 0x7,0x46,0x5c, 0x4,0x5f,0x5b, + 0x7,0x46,0x5e, 0x5,0x67,0x65, 0x4,0x5f,0x59, 0x7,0x46,0x5d, + 0x7,0x46,0x5f, 0x7,0x46,0x60, 0xf,0x62,0x30, 0xf,0x62,0x31, + 0xf,0x62,0x32, 0x7,0x46,0x61, 0x7,0x46,0x62, 0x7,0x46,0x5b, + 0x4,0x63,0x38, 0x7,0x4d,0x55, 0x4,0x63,0x37, 0x5,0x6b,0x7e, + 0x7,0x4d,0x57, 0xf,0x65,0x29, 0x7,0x4d,0x56, 0x5,0x5b,0x3e, + 0x5,0x6f,0x78, 0x5,0x6f,0x7a, 0x5,0x6f,0x79, 0x7,0x53,0x32, + 0x7,0x53,0x31, 0x5,0x73,0x3b, 0x4,0x68,0x69, 0x4,0x68,0x6a, + 0x7,0x57,0x67, 0x7,0x57,0x69, 0x7,0x57,0x68, 0x7,0x57,0x6a, + 0x5,0x73,0x3c, 0x7,0x5e,0x5e, 0x4,0x6b,0x6a, 0x4,0x6b,0x69, + 0x7,0x5e,0x60, 0x5,0x77,0x58, 0x7,0x5e,0x5f, 0x5,0x79,0x27, + 0xf,0x6c,0x26, 0x5,0x7a,0x28, 0x5,0x7a,0x66, 0x5,0x7b,0x3c, + 0x7,0x63,0x4f, 0x5,0x7c,0x34, 0x6,0x21,0x6d, 0x4,0x21,0x25, + 0x4,0x22,0x62, 0x5,0x22,0x54, 0x6,0x24,0x5b, 0x6,0x24,0x5c, + 0x5,0x22,0x55, 0x6,0x23,0x7e, 0x4,0x23,0x7e, 0x5,0x23,0x7b, + 0x6,0x2a,0x7d, 0xf,0x26,0x6a, 0xf,0x26,0x69, 0x6,0x30,0x55, + 0x6,0x30,0x54, 0x6,0x30,0x56, 0x6,0x30,0x53, 0x6,0x37,0x26, + 0x5,0x32,0x2b, 0x4,0x31,0x41, 0x6,0x3f,0x2d, 0x5,0x37,0x76, + 0x6,0x5c,0x48, 0x7,0x22,0x52, 0x5,0x54,0x39, 0xf,0x4e,0x5d, + 0xf,0x54,0x3d, 0x7,0x37,0x68, 0x7,0x3f,0x4a, 0x7,0x46,0x63, + 0x5,0x67,0x66, 0x7,0x5e,0x61, 0x7,0x65,0x35, 0x6,0x21,0x6f, + 0x6,0x21,0x71, 0x6,0x21,0x70, 0xf,0x21,0x3b, 0x5,0x21,0x68, + 0x5,0x21,0x67, 0x5,0x23,0x7c, 0x6,0x27,0x37, 0xf,0x26,0x6b, + 0x6,0x30,0x57, 0x6,0x37,0x28, 0xf,0x2f,0x34, 0x6,0x3f,0x2e, + 0xf,0x3a,0x5e, 0x7,0x22,0x53, 0x7,0x46,0x64, 0x6,0x22,0x74, + 0x5,0x22,0x56, 0x6,0x2a,0x7e, 0x6,0x30,0x59, 0x6,0x30,0x58, + 0x4,0x2c,0x65, 0x6,0x3f,0x2f, 0x5,0x35,0x5f, 0x5,0x32,0x2d, + 0x6,0x3f,0x30, 0x5,0x32,0x2c, 0x6,0x48,0x36, 0xf,0x3a,0x5f, + 0xf,0x3a,0x60, 0xf,0x3a,0x61, 0x7,0x22,0x54, 0x7,0x3f,0x4b, + 0x4,0x21,0x77, 0x6,0x22,0x75, 0x6,0x22,0x76, 0x5,0x22,0x59, + 0x5,0x22,0x58, 0x4,0x22,0x64, 0x5,0x22,0x5b, 0x6,0x24,0x61, + 0x6,0x24,0x60, 0x6,0x24,0x5e, 0xf,0x22,0x48, 0xf,0x22,0x4a, + 0x5,0x22,0x57, 0x6,0x24,0x5f, 0x5,0x22,0x5a, 0x6,0x27,0x41, + 0x6,0x27,0x3b, 0x5,0x24,0x22, 0x6,0x27,0x38, 0x5,0x23,0x7e, + 0x5,0x23,0x7d, 0x5,0x24,0x23, 0x6,0x27,0x40, 0x5,0x24,0x24, + 0x6,0x27,0x3c, 0x6,0x27,0x3f, 0x5,0x24,0x21, 0xf,0x24,0x24, + 0x6,0x27,0x39, 0x6,0x27,0x3a, 0x6,0x27,0x3d, 0x5,0x24,0x25, + 0x6,0x27,0x3e, 0x5,0x25,0x7b, 0x4,0x26,0x35, 0x5,0x25,0x79, + 0x5,0x25,0x7d, 0x5,0x25,0x7a, 0x5,0x25,0x7c, 0x5,0x26,0x21, + 0x6,0x2b,0x23, 0x5,0x25,0x7e, 0x5,0x26,0x22, 0x6,0x2b,0x22, + 0xf,0x26,0x6c, 0x5,0x26,0x23, 0x6,0x2b,0x21, 0x5,0x25,0x77, + 0x5,0x25,0x78, 0x5,0x28,0x7e, 0x6,0x30,0x62, 0x5,0x28,0x7d, + 0x5,0x29,0x22, 0x5,0x28,0x7c, 0x5,0x29,0x23, 0x6,0x30,0x5f, + 0x5,0x29,0x25, 0x5,0x29,0x24, 0x6,0x30,0x5b, 0x5,0x29,0x21, + 0x6,0x30,0x5a, 0x6,0x30,0x65, 0x6,0x30,0x67, 0xf,0x2a,0x53, + 0xf,0x2a,0x54, 0xf,0x2a,0x55, 0x4,0x29,0x26, 0x6,0x30,0x61, + 0x6,0x30,0x60, 0x6,0x30,0x5c, 0x6,0x30,0x5d, 0x6,0x30,0x66, + 0x6,0x30,0x64, 0x6,0x30,0x5e, 0x5,0x2d,0x38, 0x6,0x37,0x32, + 0x5,0x2d,0x37, 0x6,0x37,0x2e, 0x5,0x2d,0x39, 0x5,0x32,0x2e, + 0x6,0x37,0x2a, 0x4,0x2c,0x69, 0x4,0x2c,0x6a, 0x6,0x37,0x2f, + 0x5,0x2d,0x3a, 0x6,0x37,0x2d, 0x6,0x37,0x31, 0x6,0x37,0x30, + 0x4,0x2c,0x67, 0x6,0x37,0x33, 0x6,0x37,0x34, 0xf,0x2f,0x36, + 0xf,0x2f,0x35, 0x6,0x37,0x29, 0x6,0x37,0x2b, 0x6,0x3f,0x35, + 0x5,0x32,0x35, 0x4,0x31,0x46, 0x4,0x31,0x43, 0x4,0x31,0x44, + 0x5,0x32,0x33, 0x5,0x32,0x2f, 0x6,0x3f,0x3a, 0x5,0x32,0x30, + 0x5,0x32,0x34, 0x6,0x3f,0x3c, 0x5,0x32,0x31, 0x5,0x32,0x36, + 0x6,0x3f,0x36, 0x6,0x3f,0x3b, 0x6,0x3f,0x32, 0x5,0x32,0x32, + 0x6,0x3f,0x34, 0xf,0x34,0x49, 0xf,0x34,0x4a, 0xf,0x34,0x4b, + 0xf,0x34,0x4c, 0x6,0x3f,0x39, 0x6,0x3f,0x31, 0x6,0x3f,0x3d, + 0x6,0x3f,0x37, 0x6,0x3f,0x33, 0x6,0x48,0x39, 0x4,0x37,0x3e, + 0x6,0x48,0x3e, 0x5,0x37,0x79, 0x5,0x37,0x7a, 0x4,0x37,0x38, + 0x5,0x37,0x78, 0x6,0x48,0x3a, 0x4,0x37,0x37, 0x5,0x38,0x21, + 0x5,0x38,0x22, 0x6,0x3f,0x38, 0x6,0x48,0x40, 0x6,0x48,0x3d, + 0x6,0x48,0x3b, 0x5,0x37,0x7d, 0x6,0x48,0x38, 0xf,0x3a,0x62, + 0xf,0x3a,0x63, 0x6,0x48,0x3f, 0x5,0x37,0x7b, 0x5,0x37,0x77, + 0x6,0x48,0x41, 0x5,0x37,0x7e, 0xf,0x40,0x2b, 0x5,0x3e,0x78, + 0x4,0x3d,0x22, 0x5,0x45,0x52, 0x4,0x3d,0x25, 0x5,0x3e,0x75, + 0x5,0x3e,0x74, 0x4,0x3d,0x24, 0x5,0x3e,0x77, 0x5,0x3e,0x7a, + 0x6,0x52,0x3e, 0x6,0x52,0x3b, 0x6,0x52,0x3d, 0x6,0x5c,0x4b, + 0x5,0x3e,0x7b, 0x6,0x52,0x3c, 0x5,0x3e,0x76, 0x5,0x3e,0x79, + 0x6,0x5c,0x4c, 0x6,0x5c,0x4d, 0x5,0x45,0x58, 0x4,0x43,0x34, + 0x5,0x45,0x4f, 0x5,0x45,0x55, 0x6,0x5c,0x4a, 0x5,0x45,0x54, + 0x5,0x45,0x57, 0xf,0x47,0x62, 0x5,0x45,0x59, 0x5,0x45,0x50, + 0x5,0x45,0x56, 0x5,0x45,0x51, 0x7,0x22,0x57, 0x7,0x22,0x59, + 0x5,0x4c,0x74, 0x5,0x4c,0x73, 0x5,0x4c,0x75, 0x4,0x49,0x57, + 0x5,0x4c,0x76, 0x5,0x4c,0x78, 0x4,0x49,0x56, 0x7,0x22,0x56, + 0x7,0x22,0x55, 0x7,0x22,0x58, 0x5,0x4c,0x77, 0x5,0x4c,0x79, + 0x5,0x4c,0x72, 0x7,0x2d,0x50, 0x5,0x54,0x3e, 0x7,0x2d,0x52, + 0x7,0x2d,0x58, 0x5,0x54,0x3d, 0x4,0x50,0x28, 0x7,0x2d,0x57, + 0x7,0x2d,0x56, 0x5,0x54,0x3b, 0x7,0x2d,0x51, 0x5,0x54,0x3c, + 0x7,0x2d,0x54, 0x5,0x54,0x3f, 0x7,0x2d,0x4f, 0x4,0x50,0x2a, + 0x5,0x5b,0x41, 0x5,0x5b,0x42, 0x4,0x56,0x2c, 0x7,0x37,0x6b, + 0xf,0x59,0x7c, 0x7,0x37,0x69, 0x7,0x37,0x6a, 0x5,0x61,0x5a, + 0x5,0x61,0x59, 0x5,0x61,0x58, 0x7,0x46,0x66, 0x4,0x5f,0x5d, + 0x5,0x67,0x67, 0x4,0x5f,0x5c, 0x7,0x46,0x65, 0x7,0x46,0x67, + 0x5,0x67,0x68, 0xf,0x62,0x33, 0x7,0x4d,0x58, 0x5,0x6c,0x21, + 0x7,0x53,0x33, 0x7,0x57,0x6c, 0x5,0x6f,0x7b, 0x5,0x73,0x3d, + 0x7,0x57,0x6b, 0x7,0x5e,0x62, 0x7,0x5e,0x63, 0x5,0x77,0x59, + 0x7,0x63,0x50, 0x7,0x63,0x75, 0x4,0x21,0x78, 0x6,0x27,0x42, + 0x5,0x24,0x26, 0x4,0x24,0x26, 0x6,0x2b,0x24, 0xf,0x26,0x6d, + 0xf,0x26,0x6e, 0x6,0x30,0x69, 0x6,0x30,0x68, 0xf,0x2a,0x56, + 0x6,0x37,0x35, 0x5,0x32,0x37, 0x6,0x48,0x42, 0x5,0x38,0x23, + 0x6,0x52,0x3f, 0x5,0x45,0x5a, 0xf,0x47,0x64, 0x7,0x4d,0x59, + 0xf,0x6a,0x4e, 0x6,0x21,0x72, 0x6,0x21,0x73, 0x6,0x22,0x78, + 0x5,0x21,0x69, 0x6,0x22,0x77, 0xf,0x21,0x62, 0x4,0x22,0x67, + 0x4,0x24,0x27, 0x5,0x24,0x27, 0xf,0x24,0x26, 0x6,0x29,0x5e, + 0x6,0x2b,0x25, 0x5,0x26,0x24, 0x5,0x26,0x25, 0x6,0x30,0x6a, + 0x6,0x30,0x41, 0x4,0x2f,0x27, 0x6,0x37,0x36, 0x4,0x31,0x4a, + 0x6,0x48,0x43, 0x5,0x3e,0x7c, 0x5,0x45,0x5b, 0x7,0x22,0x5b, + 0xf,0x47,0x65, 0x6,0x5c,0x4e, 0xf,0x4e,0x5f, 0x7,0x22,0x5c, + 0x7,0x22,0x5d, 0x4,0x56,0x26, 0x7,0x57,0x6d, 0x4,0x22,0x68, + 0x5,0x22,0x5e, 0x6,0x24,0x64, 0x5,0x22,0x5d, 0x6,0x24,0x63, + 0x6,0x24,0x62, 0x6,0x24,0x66, 0x4,0x22,0x69, 0x6,0x24,0x65, + 0x6,0x27,0x45, 0x5,0x24,0x2a, 0x5,0x24,0x2c, 0x5,0x24,0x2b, + 0x5,0x24,0x28, 0x5,0x24,0x29, 0x6,0x27,0x44, 0x6,0x27,0x48, + 0x6,0x2b,0x28, 0x6,0x27,0x43, 0x6,0x27,0x46, 0x5,0x24,0x2d, + 0x5,0x26,0x2c, 0x5,0x26,0x28, 0x5,0x26,0x27, 0x5,0x26,0x2b, + 0x5,0x26,0x2a, 0x4,0x26,0x39, 0x6,0x2b,0x26, 0x6,0x2b,0x29, + 0x6,0x2b,0x27, 0x4,0x26,0x3e, 0x6,0x2b,0x2a, 0xf,0x26,0x70, + 0xf,0x26,0x71, 0xf,0x26,0x72, 0xf,0x26,0x73, 0xf,0x26,0x74, + 0x5,0x26,0x29, 0x5,0x26,0x2d, 0x6,0x2b,0x2b, 0x5,0x29,0x28, + 0x5,0x29,0x2a, 0x4,0x29,0x27, 0x6,0x30,0x6c, 0x5,0x29,0x29, + 0x6,0x30,0x6d, 0xf,0x2a,0x57, 0xf,0x2a,0x59, 0xf,0x2a,0x58, + 0xf,0x2a,0x5a, 0xf,0x2a,0x5b, 0xf,0x2a,0x5c, 0x6,0x30,0x6b, + 0x5,0x2d,0x3d, 0x5,0x2d,0x40, 0x5,0x2d,0x3e, 0x5,0x2d,0x41, + 0x5,0x2d,0x3b, 0x6,0x37,0x3a, 0x6,0x37,0x3b, 0x4,0x2c,0x6e, + 0x5,0x2d,0x42, 0x5,0x2d,0x3f, 0x6,0x37,0x3c, 0x5,0x2d,0x3c, + 0x6,0x37,0x39, 0xf,0x2f,0x37, 0x6,0x37,0x37, 0x6,0x37,0x38, + 0x5,0x2c,0x7b, 0x5,0x32,0x44, 0x5,0x32,0x3b, 0x5,0x32,0x39, + 0x4,0x31,0x4d, 0x6,0x3f,0x43, 0x5,0x32,0x42, 0x6,0x3f,0x48, + 0x6,0x3f,0x3e, 0x5,0x32,0x3d, 0x5,0x32,0x3c, 0x5,0x32,0x3f, + 0x5,0x32,0x3e, 0x6,0x3f,0x3f, 0x6,0x3f,0x40, 0x5,0x32,0x41, + 0x5,0x32,0x38, 0x4,0x31,0x50, 0x6,0x3f,0x44, 0x5,0x32,0x43, + 0x5,0x38,0x28, 0x6,0x3f,0x41, 0xf,0x34,0x4d, 0xf,0x34,0x4e, + 0xf,0x34,0x4f, 0xf,0x34,0x50, 0xf,0x34,0x51, 0xf,0x34,0x52, + 0xf,0x34,0x53, 0x6,0x3f,0x47, 0x6,0x46,0x3d, 0x5,0x32,0x3a, + 0x6,0x3f,0x42, 0x5,0x32,0x40, 0x6,0x48,0x4a, 0x4,0x31,0x4b, + 0x5,0x38,0x2b, 0x5,0x38,0x2c, 0x5,0x38,0x2d, 0x6,0x48,0x4b, + 0x6,0x48,0x4e, 0x5,0x38,0x27, 0x6,0x48,0x4d, 0x4,0x37,0x42, + 0x5,0x38,0x2a, 0x5,0x38,0x26, 0x6,0x48,0x49, 0x4,0x37,0x43, + 0x5,0x38,0x25, 0x6,0x52,0x44, 0x6,0x48,0x46, 0x6,0x48,0x47, + 0x5,0x38,0x24, 0xf,0x3a,0x65, 0xf,0x3a,0x67, 0xf,0x3a,0x68, + 0xf,0x3a,0x69, 0xf,0x3a,0x6a, 0x6,0x48,0x48, 0x6,0x48,0x4c, + 0xf,0x3a,0x66, 0x4,0x3d,0x2b, 0x5,0x3f,0x25, 0x4,0x3d,0x2c, + 0x6,0x52,0x41, 0x6,0x52,0x42, 0x5,0x3f,0x22, 0x5,0x3f,0x23, + 0x6,0x52,0x47, 0x5,0x3e,0x7d, 0x6,0x52,0x45, 0xf,0x41,0x3a, + 0xf,0x41,0x3b, 0xf,0x41,0x3c, 0x6,0x52,0x43, 0x6,0x52,0x48, + 0x5,0x3f,0x24, 0x5,0x3e,0x7e, 0x6,0x52,0x46, 0x4,0x43,0x38, + 0x5,0x45,0x5c, 0x4,0x43,0x37, 0x5,0x45,0x5e, 0x6,0x5c,0x50, + 0x5,0x45,0x60, 0x5,0x45,0x5f, 0x6,0x5c,0x4f, 0xf,0x47,0x67, + 0xf,0x47,0x68, 0xf,0x47,0x69, 0xf,0x47,0x6a, 0xf,0x47,0x6b, + 0xf,0x47,0x6c, 0xf,0x47,0x6d, 0xf,0x47,0x6e, 0xf,0x47,0x6f, + 0x6,0x5c,0x51, 0x6,0x60,0x31, 0xf,0x4a,0x54, 0x7,0x22,0x5e, + 0x4,0x49,0x5a, 0x4,0x37,0x3f, 0x4,0x49,0x58, 0x5,0x4c,0x7a, + 0x4,0x49,0x59, 0x7,0x2d,0x59, 0x7,0x22,0x62, 0x5,0x4c,0x7c, + 0x5,0x4c,0x7e, 0xf,0x4e,0x60, 0xf,0x4e,0x62, 0xf,0x4e,0x63, + 0x7,0x22,0x5f, 0x7,0x22,0x61, 0x7,0x22,0x63, 0x7,0x22,0x60, + 0x5,0x4c,0x7b, 0x5,0x54,0x41, 0x5,0x4c,0x7d, 0x5,0x54,0x43, + 0x5,0x54,0x40, 0x4,0x50,0x2d, 0x5,0x54,0x44, 0xf,0x54,0x3f, + 0xf,0x54,0x40, 0xf,0x54,0x41, 0xf,0x54,0x42, 0x7,0x37,0x6e, + 0x5,0x5b,0x44, 0x7,0x37,0x6c, 0x7,0x37,0x6d, 0xf,0x59,0x7e, + 0xf,0x5a,0x21, 0xf,0x5a,0x22, 0xf,0x5a,0x23, 0x5,0x5b,0x43, + 0x7,0x37,0x6f, 0x5,0x5b,0x45, 0x7,0x3f,0x51, 0x7,0x3f,0x4e, + 0x5,0x61,0x5b, 0xf,0x5e,0x5a, 0xf,0x5e,0x5c, 0x7,0x3f,0x4d, + 0x7,0x3f,0x4f, 0x7,0x3f,0x4c, 0xf,0x5e,0x5b, 0x7,0x3f,0x50, + 0x7,0x46,0x68, 0x7,0x46,0x69, 0x5,0x61,0x5c, 0x5,0x67,0x69, + 0xf,0x62,0x34, 0xf,0x62,0x35, 0xf,0x62,0x36, 0x5,0x67,0x6a, + 0x5,0x6c,0x24, 0x5,0x6c,0x23, 0x7,0x4d,0x5d, 0x7,0x4d,0x5b, + 0x5,0x6c,0x22, 0x7,0x4d,0x5a, 0x7,0x4d,0x5c, 0x7,0x4d,0x5e, + 0x4,0x66,0x3c, 0x7,0x53,0x34, 0x7,0x53,0x61, 0x5,0x73,0x3e, + 0x7,0x57,0x6e, 0x7,0x57,0x6f, 0x5,0x75,0x6a, 0xf,0x6a,0x4f, + 0x7,0x5b,0x4d, 0x7,0x5e,0x64, 0x7,0x62,0x36, 0x5,0x7a,0x68, + 0x5,0x7a,0x67, 0xf,0x6c,0x7b, 0xf,0x21,0x63, 0xf,0x22,0x4b, + 0xf,0x22,0x4c, 0x6,0x2b,0x2c, 0xf,0x24,0x27, 0x6,0x2b,0x2d, + 0x6,0x2b,0x2e, 0xf,0x2f,0x39, 0xf,0x2f,0x3b, 0xf,0x2f,0x3c, + 0xf,0x2f,0x3a, 0x5,0x32,0x45, 0xf,0x34,0x54, 0x6,0x48,0x4f, + 0xf,0x3a,0x6b, 0xf,0x3a,0x6c, 0x5,0x3f,0x26, 0x6,0x21,0x3f, + 0x6,0x21,0x75, 0x6,0x22,0x79, 0x6,0x27,0x49, 0x4,0x24,0x2a, + 0x6,0x30,0x70, 0x6,0x27,0x4d, 0xf,0x24,0x28, 0x6,0x27,0x4b, + 0x6,0x27,0x4e, 0x4,0x26,0x3f, 0x6,0x2b,0x30, 0x5,0x26,0x2e, + 0x6,0x2b,0x31, 0x3,0x2a,0x39, 0x4,0x27,0x41, 0x6,0x35,0x23, + 0x6,0x30,0x72, 0x6,0x30,0x73, 0x6,0x30,0x71, 0x6,0x30,0x6f, + 0x6,0x30,0x6e, 0x6,0x37,0x3f, 0x6,0x37,0x3e, 0x4,0x2c,0x6f, + 0x6,0x37,0x3d, 0x6,0x37,0x40, 0x6,0x3f,0x49, 0x6,0x3f,0x4a, + 0x6,0x3f,0x4b, 0x6,0x3f,0x4c, 0x6,0x3f,0x4d, 0x6,0x3f,0x4e, + 0x4,0x37,0x44, 0x6,0x48,0x50, 0x6,0x48,0x54, 0x6,0x48,0x53, + 0x6,0x48,0x51, 0xf,0x3a,0x6d, 0x6,0x48,0x52, 0x6,0x52,0x49, + 0x5,0x3f,0x27, 0xf,0x41,0x3d, 0x6,0x5c,0x53, 0x6,0x5c,0x54, + 0x6,0x5c,0x52, 0x5,0x45,0x61, 0x7,0x22,0x64, 0x7,0x2d,0x5a, + 0x7,0x2d,0x5c, 0x4,0x50,0x2f, 0x5,0x54,0x45, 0x7,0x37,0x71, + 0x7,0x37,0x70, 0x7,0x57,0x70, 0x7,0x63,0x51, 0x7,0x63,0x52, + 0x7,0x65,0x36, 0x6,0x21,0x40, 0x6,0x21,0x76, 0xf,0x22,0x4d, + 0x4,0x24,0x2b, 0x6,0x27,0x50, 0x6,0x27,0x4f, 0x5,0x24,0x2e, + 0x6,0x2b,0x32, 0x6,0x30,0x76, 0x6,0x30,0x75, 0x6,0x30,0x77, + 0x5,0x2e,0x68, 0x6,0x3f,0x4f, 0x5,0x38,0x2e, 0x6,0x52,0x4a, + 0x6,0x5c,0x55, 0x7,0x22,0x65, 0x7,0x2d,0x5d, 0x5,0x21,0x2a, + 0x5,0x21,0x47, 0x6,0x21,0x78, 0x6,0x21,0x7c, 0x6,0x21,0x77, + 0x6,0x21,0x7a, 0x6,0x21,0x7b, 0x6,0x23,0x21, 0x6,0x23,0x22, + 0x6,0x22,0x7c, 0x6,0x22,0x7a, 0x6,0x23,0x23, 0x6,0x22,0x7b, + 0x6,0x22,0x7d, 0x6,0x22,0x7e, 0x5,0x21,0x6a, 0x5,0x22,0x60, + 0x5,0x22,0x5f, 0x6,0x24,0x68, 0x6,0x24,0x69, 0x6,0x24,0x6a, + 0x6,0x24,0x6b, 0x5,0x24,0x2f, 0x6,0x27,0x51, 0x5,0x24,0x31, + 0x6,0x27,0x53, 0x5,0x24,0x30, 0xf,0x24,0x29, 0xf,0x24,0x2a, + 0xf,0x24,0x2b, 0xf,0x24,0x2c, 0x6,0x27,0x52, 0x5,0x24,0x32, + 0x5,0x26,0x2f, 0x6,0x2b,0x36, 0x6,0x2b,0x33, 0x6,0x2b,0x34, + 0x6,0x2b,0x37, 0x6,0x2b,0x35, 0x6,0x30,0x7e, 0x5,0x29,0x2c, + 0x6,0x30,0x7d, 0x4,0x29,0x30, 0x6,0x30,0x79, 0x5,0x29,0x2b, + 0x6,0x30,0x78, 0x5,0x2d,0x44, 0x5,0x2d,0x43, 0x5,0x2d,0x45, + 0x6,0x37,0x43, 0x6,0x37,0x41, 0x5,0x2d,0x46, 0xf,0x2f,0x3d, + 0x6,0x37,0x42, 0x5,0x32,0x4a, 0x5,0x32,0x48, 0x5,0x32,0x49, + 0x6,0x3f,0x56, 0x6,0x3f,0x50, 0x4,0x29,0x2f, 0x6,0x48,0x55, + 0x6,0x3f,0x52, 0x6,0x3f,0x53, 0x5,0x32,0x47, 0x6,0x3f,0x51, + 0xf,0x34,0x55, 0xf,0x34,0x56, 0xf,0x34,0x57, 0x6,0x3f,0x54, + 0x6,0x3f,0x57, 0x6,0x3f,0x55, 0x6,0x48,0x56, 0x6,0x48,0x59, + 0x5,0x38,0x2f, 0x5,0x38,0x32, 0x5,0x38,0x31, 0x6,0x48,0x5a, + 0x5,0x38,0x30, 0x6,0x48,0x58, 0x6,0x48,0x57, 0x5,0x3f,0x28, + 0x4,0x3d,0x31, 0x6,0x52,0x4b, 0xf,0x41,0x40, 0x6,0x52,0x4c, + 0x5,0x45,0x62, 0x6,0x5c,0x56, 0x5,0x45,0x63, 0x6,0x5c,0x57, + 0x6,0x5c,0x59, 0xf,0x47,0x70, 0x6,0x5c,0x5a, 0x6,0x5c,0x58, + 0x5,0x4d,0x21, 0x5,0x4d,0x22, 0x4,0x49,0x60, 0x7,0x22,0x66, + 0xf,0x4e,0x64, 0xf,0x4e,0x65, 0x7,0x22,0x67, 0x7,0x2d,0x5f, + 0x5,0x54,0x46, 0x4,0x50,0x30, 0x7,0x2d,0x60, 0x7,0x2d,0x5e, + 0x7,0x37,0x73, 0x7,0x37,0x72, 0x7,0x37,0x74, 0xf,0x5a,0x24, + 0x4,0x5b,0x22, 0x5,0x61,0x5e, 0x7,0x3f,0x52, 0xf,0x5e,0x5d, + 0x5,0x61,0x5d, 0x7,0x46,0x6d, 0x7,0x46,0x6b, 0x7,0x46,0x6f, + 0x7,0x46,0x6a, 0x7,0x46,0x6c, 0x5,0x67,0x6b, 0x5,0x6c,0x25, + 0x7,0x4d,0x5f, 0x4,0x5f,0x5f, 0x7,0x4d,0x61, 0x7,0x4d,0x60, + 0x5,0x6c,0x26, 0x5,0x6f,0x7c, 0x5,0x6f,0x7d, 0x4,0x66,0x3d, + 0x7,0x53,0x35, 0x5,0x73,0x3f, 0x7,0x60,0x3c, 0x7,0x60,0x6f, + 0x7,0x64,0x46, 0x6,0x24,0x6e, 0x6,0x24,0x6c, 0x6,0x24,0x6d, + 0x5,0x24,0x33, 0x6,0x31,0x21, 0x6,0x2b,0x38, 0x6,0x2d,0x32, + 0x6,0x31,0x24, 0x6,0x37,0x44, 0x6,0x31,0x22, 0x6,0x31,0x23, + 0x6,0x37,0x46, 0x6,0x37,0x45, 0x6,0x3f,0x58, 0x6,0x4f,0x21, + 0x5,0x38,0x33, 0x6,0x48,0x5c, 0x6,0x48,0x5b, 0x5,0x3f,0x2a, + 0x6,0x5c,0x5c, 0x6,0x5c,0x5f, 0x6,0x5c,0x5d, 0x6,0x5c,0x5b, + 0x6,0x5c,0x5e, 0x7,0x2d,0x61, 0x7,0x2d,0x4e, 0x4,0x50,0x32, + 0x7,0x37,0x75, 0x7,0x3f,0x55, 0x7,0x3f,0x54, 0x7,0x3f,0x53, + 0x7,0x46,0x72, 0x7,0x46,0x70, 0x7,0x46,0x71, 0x7,0x57,0x71, + 0x7,0x5b,0x4e, 0x7,0x62,0x37, 0x6,0x23,0x25, 0x6,0x23,0x24, + 0xf,0x21,0x64, 0x6,0x24,0x71, 0x6,0x24,0x6f, 0xf,0x24,0x2d, + 0x6,0x27,0x54, 0x5,0x26,0x30, 0x6,0x2b,0x3b, 0x6,0x2b,0x3a, + 0x6,0x37,0x47, 0x4,0x2c,0x74, 0x4,0x2c,0x73, 0x5,0x35,0x60, + 0x6,0x3f,0x5d, 0x6,0x3f,0x59, 0x6,0x3f,0x5a, 0xf,0x34,0x58, + 0xf,0x34,0x59, 0xf,0x34,0x5a, 0x6,0x3f,0x5c, 0x6,0x3f,0x5b, + 0x5,0x32,0x4b, 0x6,0x48,0x5d, 0x6,0x48,0x60, 0x6,0x48,0x5e, + 0x6,0x48,0x5f, 0xf,0x3a,0x6e, 0x6,0x52,0x51, 0x6,0x52,0x4e, + 0x6,0x52,0x50, 0x6,0x52,0x4f, 0xf,0x41,0x41, 0x4,0x43,0x3c, + 0x6,0x5c,0x60, 0x7,0x22,0x6b, 0x7,0x22,0x6c, 0x7,0x22,0x69, + 0x7,0x22,0x6a, 0x5,0x4d,0x23, 0x4,0x50,0x33, 0x5,0x54,0x47, + 0x7,0x2d,0x64, 0x7,0x37,0x76, 0x7,0x3f,0x56, 0xf,0x67,0x54, + 0x7,0x4d,0x62, 0x7,0x53,0x36, 0x5,0x73,0x41, 0xf,0x6c,0x27, + 0x6,0x21,0x7d, 0x5,0x21,0x6b, 0x4,0x21,0x79, 0x5,0x22,0x61, + 0x4,0x22,0x6e, 0x5,0x22,0x62, 0x5,0x24,0x34, 0x6,0x27,0x58, + 0x5,0x24,0x35, 0x6,0x27,0x57, 0x6,0x27,0x59, 0x6,0x27,0x5b, + 0x6,0x27,0x56, 0x5,0x24,0x36, 0x6,0x27,0x55, 0x6,0x27,0x5a, + 0x5,0x26,0x33, 0x6,0x2b,0x3d, 0x5,0x26,0x31, 0x6,0x2b,0x3c, + 0x5,0x26,0x32, 0x5,0x29,0x2d, 0x6,0x2b,0x3f, 0x4,0x29,0x33, + 0x6,0x31,0x26, 0x5,0x29,0x30, 0x5,0x29,0x2e, 0x6,0x31,0x28, + 0x5,0x29,0x32, 0x5,0x29,0x31, 0xf,0x2a,0x5e, 0x6,0x31,0x27, + 0x6,0x37,0x4d, 0x4,0x2c,0x79, 0x4,0x2c,0x77, 0x4,0x2c,0x7c, + 0x4,0x2c,0x75, 0x5,0x2d,0x4b, 0x5,0x2d,0x49, 0x4,0x2c,0x78, + 0x4,0x2c,0x7a, 0x4,0x2c,0x76, 0x4,0x2c,0x7b, 0x5,0x2d,0x4a, + 0x6,0x37,0x49, 0x6,0x37,0x4f, 0x6,0x37,0x4c, 0xf,0x2f,0x3f, + 0xf,0x2f,0x40, 0x6,0x37,0x4b, 0x6,0x37,0x50, 0x6,0x37,0x4e, + 0x6,0x37,0x4a, 0x4,0x31,0x56, 0x5,0x32,0x4f, 0x6,0x3f,0x68, + 0x6,0x3f,0x61, 0x5,0x32,0x4c, 0x5,0x32,0x51, 0x5,0x32,0x4e, + 0x6,0x3f,0x60, 0x5,0x32,0x50, 0x4,0x31,0x58, 0x6,0x3f,0x67, + 0x6,0x3f,0x65, 0x6,0x3f,0x62, 0x4,0x31,0x59, 0x6,0x3f,0x66, + 0x5,0x32,0x4d, 0x6,0x3f,0x64, 0x6,0x3f,0x5f, 0x6,0x3f,0x63, + 0x6,0x48,0x64, 0xf,0x34,0x5c, 0x4,0x37,0x46, 0x5,0x38,0x36, + 0x5,0x38,0x35, 0x5,0x38,0x3b, 0x5,0x38,0x3a, 0x5,0x38,0x37, + 0x4,0x37,0x47, 0x6,0x48,0x61, 0x5,0x38,0x34, 0x6,0x48,0x63, + 0x5,0x38,0x38, 0x4,0x31,0x55, 0xf,0x3a,0x70, 0x6,0x48,0x62, + 0xf,0x3a,0x6f, 0x5,0x38,0x39, 0x5,0x3f,0x2c, 0x5,0x3f,0x2b, + 0x6,0x52,0x52, 0x6,0x52,0x54, 0x6,0x52,0x57, 0x6,0x52,0x53, + 0xf,0x41,0x42, 0xf,0x41,0x43, 0xf,0x41,0x44, 0xf,0x41,0x45, + 0xf,0x41,0x46, 0xf,0x41,0x47, 0x6,0x52,0x55, 0x6,0x52,0x56, + 0x6,0x56,0x6c, 0x5,0x3f,0x2d, 0x4,0x3d,0x32, 0x6,0x5c,0x66, + 0x6,0x5c,0x63, 0x5,0x45,0x66, 0x6,0x5c,0x62, 0x4,0x43,0x3e, + 0x5,0x45,0x65, 0x4,0x43,0x41, 0x4,0x43,0x40, 0x6,0x5c,0x61, + 0x5,0x45,0x68, 0x5,0x45,0x6a, 0x5,0x45,0x64, 0x6,0x5c,0x68, + 0x6,0x5c,0x69, 0x6,0x5c,0x6a, 0x5,0x45,0x67, 0x6,0x5c,0x64, + 0xf,0x47,0x71, 0xf,0x47,0x72, 0xf,0x47,0x73, 0xf,0x47,0x74, + 0xf,0x47,0x75, 0x6,0x5c,0x65, 0x4,0x49,0x64, 0x5,0x4d,0x24, + 0x5,0x5b,0x48, 0x4,0x49,0x63, 0x4,0x49,0x62, 0x5,0x4d,0x25, + 0x7,0x22,0x6d, 0x7,0x22,0x6f, 0xf,0x4e,0x66, 0xf,0x4e,0x67, + 0x7,0x22,0x6e, 0x7,0x22,0x70, 0x7,0x2d,0x65, 0x5,0x54,0x48, + 0x5,0x54,0x4a, 0x7,0x2d,0x67, 0x7,0x2d,0x66, 0xf,0x54,0x44, + 0xf,0x54,0x45, 0x7,0x2d,0x68, 0x5,0x54,0x49, 0x5,0x5b,0x47, + 0x7,0x37,0x77, 0x4,0x56,0x30, 0xf,0x5c,0x5f, 0x5,0x5b,0x46, + 0x5,0x61,0x60, 0x7,0x3f,0x57, 0x5,0x61,0x5f, 0x7,0x3f,0x58, + 0xf,0x5e,0x5e, 0x5,0x61,0x61, 0x7,0x46,0x73, 0x7,0x46,0x75, + 0x7,0x46,0x76, 0x7,0x4d,0x22, 0x7,0x46,0x74, 0x5,0x6c,0x27, + 0x4,0x63,0x3e, 0x4,0x63,0x3d, 0xf,0x65,0x2a, 0x7,0x4d,0x63, + 0x7,0x53,0x37, 0x5,0x6f,0x7e, 0x7,0x57,0x72, 0x4,0x6a,0x47, + 0x5,0x79,0x28, 0x5,0x21,0x31, 0x6,0x22,0x21, 0x4,0x22,0x6f, + 0x5,0x21,0x6c, 0x6,0x23,0x26, 0xf,0x22,0x4f, 0x6,0x24,0x75, + 0x5,0x22,0x63, 0x6,0x27,0x60, 0x5,0x22,0x69, 0x6,0x27,0x5d, + 0x5,0x22,0x64, 0x6,0x24,0x73, 0x6,0x24,0x74, 0x5,0x22,0x65, + 0x6,0x27,0x5c, 0x6,0x27,0x5e, 0x6,0x27,0x61, 0x6,0x24,0x72, + 0x5,0x22,0x68, 0x5,0x24,0x37, 0x5,0x24,0x39, 0x4,0x26,0x45, + 0x6,0x27,0x66, 0x6,0x27,0x64, 0x6,0x2b,0x46, 0x6,0x27,0x67, + 0x6,0x2b,0x40, 0x6,0x27,0x62, 0x6,0x27,0x63, 0x6,0x2b,0x44, + 0x6,0x27,0x65, 0x6,0x27,0x68, 0x3,0x25,0x7e, 0x6,0x27,0x69, + 0x5,0x24,0x3a, 0xf,0x24,0x2e, 0xf,0x24,0x2f, 0xf,0x24,0x31, + 0xf,0x24,0x32, 0xf,0x24,0x34, 0xf,0x24,0x35, 0xf,0x24,0x36, + 0xf,0x26,0x77, 0xf,0x26,0x78, 0xf,0x26,0x79, 0xf,0x26,0x7a, + 0xf,0x26,0x7b, 0xf,0x26,0x7d, 0xf,0x26,0x7e, 0xf,0x27,0x21, + 0xf,0x26,0x7c, 0x6,0x2b,0x45, 0x6,0x2b,0x41, 0x6,0x2b,0x42, + 0x4,0x24,0x2d, 0xf,0x24,0x30, 0x4,0x26,0x44, 0x5,0x26,0x34, + 0x6,0x2b,0x43, 0x4,0x26,0x47, 0x6,0x2b,0x4c, 0x4,0x29,0x47, + 0x6,0x31,0x2f, 0x4,0x26,0x4b, 0x6,0x2b,0x4d, 0x6,0x31,0x29, + 0x5,0x26,0x35, 0x6,0x31,0x2c, 0x6,0x2b,0x4f, 0x4,0x26,0x4a, + 0x5,0x26,0x37, 0x4,0x29,0x38, 0x5,0x26,0x36, 0x4,0x29,0x43, + 0x6,0x2b,0x49, 0x5,0x26,0x38, 0x4,0x26,0x51, 0x4,0x29,0x44, + 0x6,0x31,0x2a, 0x6,0x31,0x2b, 0x6,0x2b,0x50, 0x6,0x2b,0x47, + 0x6,0x31,0x2d, 0xf,0x26,0x75, 0xf,0x27,0x22, 0xf,0x2a,0x70, + 0x4,0x29,0x46, 0x6,0x31,0x2e, 0x6,0x2b,0x48, 0x6,0x2b,0x4a, + 0x6,0x2b,0x4e, 0x6,0x2b,0x4b, 0xf,0x2a,0x64, 0xf,0x2a,0x5f, + 0xf,0x2a,0x62, 0xf,0x2a,0x65, 0xf,0x2a,0x68, 0xf,0x2a,0x6c, + 0x6,0x37,0x5b, 0x6,0x37,0x59, 0x6,0x31,0x32, 0x4,0x29,0x49, + 0x5,0x29,0x37, 0x4,0x29,0x42, 0x4,0x2d,0x29, 0x5,0x2d,0x4e, + 0x5,0x29,0x36, 0x6,0x31,0x39, 0x6,0x37,0x57, 0x6,0x31,0x33, + 0x4,0x2c,0x7d, 0x5,0x2d,0x4c, 0x6,0x31,0x35, 0x6,0x37,0x53, + 0x4,0x2d,0x21, 0x6,0x31,0x38, 0x5,0x29,0x34, 0x4,0x2c,0x7e, + 0x6,0x31,0x3a, 0x6,0x31,0x31, 0x6,0x31,0x37, 0x6,0x37,0x56, + 0x6,0x37,0x55, 0x4,0x2d,0x2a, 0x6,0x31,0x34, 0xf,0x2a,0x61, + 0xf,0x2a,0x66, 0xf,0x2a,0x69, 0xf,0x2a,0x6b, 0xf,0x2a,0x6d, + 0xf,0x2a,0x6e, 0xf,0x2a,0x6f, 0xf,0x2f,0x46, 0xf,0x2f,0x47, + 0xf,0x2f,0x48, 0xf,0x2f,0x4a, 0x6,0x37,0x52, 0xf,0x2f,0x44, + 0x6,0x37,0x58, 0xf,0x2a,0x63, 0x5,0x2d,0x4d, 0x6,0x37,0x51, + 0x5,0x2d,0x52, 0x5,0x2d,0x58, 0x5,0x2d,0x5b, 0x6,0x3f,0x6d, + 0x6,0x37,0x63, 0x6,0x3f,0x6f, 0x6,0x3f,0x6b, 0x6,0x3f,0x70, + 0x6,0x37,0x64, 0x5,0x2d,0x55, 0x6,0x3f,0x69, 0x4,0x2d,0x2e, + 0x6,0x3f,0x73, 0x5,0x2d,0x56, 0x4,0x2d,0x26, 0x5,0x32,0x5d, + 0x5,0x2d,0x51, 0x5,0x2d,0x5c, 0x6,0x37,0x62, 0x6,0x37,0x5d, + 0x5,0x32,0x54, 0x6,0x37,0x5f, 0x6,0x37,0x61, 0x6,0x3f,0x6c, + 0x6,0x37,0x60, 0x6,0x3f,0x71, 0x4,0x2d,0x27, 0x5,0x2d,0x50, + 0x6,0x37,0x5c, 0x5,0x32,0x53, 0x6,0x3f,0x72, 0x6,0x3f,0x74, + 0x5,0x32,0x52, 0x5,0x2d,0x4f, 0xf,0x2f,0x41, 0xf,0x2f,0x42, + 0xf,0x2f,0x43, 0xf,0x2f,0x49, 0xf,0x2f,0x4b, 0xf,0x34,0x5d, + 0xf,0x34,0x5f, 0xf,0x34,0x60, 0xf,0x34,0x64, 0xf,0x34,0x65, + 0xf,0x34,0x66, 0xf,0x34,0x67, 0xf,0x34,0x68, 0x6,0x3f,0x6a, + 0x6,0x37,0x65, 0x6,0x37,0x66, 0x5,0x2d,0x54, 0x5,0x2d,0x59, + 0x4,0x37,0x5a, 0x6,0x48,0x71, 0x4,0x37,0x4d, 0x5,0x32,0x59, + 0x6,0x3f,0x7c, 0x4,0x37,0x4b, 0x6,0x48,0x73, 0x6,0x48,0x69, + 0x5,0x38,0x55, 0x6,0x3f,0x7e, 0x6,0x48,0x72, 0x6,0x40,0x22, + 0x4,0x31,0x65, 0x5,0x2d,0x53, 0x4,0x31,0x6d, 0x6,0x3f,0x77, + 0x6,0x48,0x6e, 0x4,0x31,0x61, 0x5,0x38,0x3f, 0x5,0x32,0x57, + 0x5,0x32,0x5a, 0x4,0x37,0x4c, 0x6,0x3f,0x79, 0x5,0x32,0x5c, + 0x6,0x3f,0x76, 0x6,0x3f,0x6e, 0x4,0x31,0x69, 0x5,0x38,0x3c, + 0x6,0x48,0x70, 0x5,0x32,0x5e, 0x4,0x31,0x5f, 0x6,0x3f,0x7d, + 0x6,0x3f,0x7b, 0x6,0x3f,0x7a, 0x6,0x48,0x66, 0x6,0x48,0x6c, + 0x5,0x38,0x3e, 0x5,0x38,0x41, 0x6,0x48,0x74, 0x5,0x32,0x55, + 0x6,0x48,0x6b, 0x6,0x48,0x76, 0x6,0x48,0x67, 0x6,0x48,0x65, + 0x6,0x3f,0x75, 0x5,0x38,0x40, 0xf,0x34,0x61, 0xf,0x34,0x5e, + 0xf,0x34,0x62, 0xf,0x34,0x63, 0xf,0x34,0x69, 0xf,0x34,0x6a, + 0xf,0x34,0x6b, 0xf,0x34,0x6c, 0xf,0x34,0x6d, 0xf,0x34,0x6f, + 0xf,0x34,0x70, 0xf,0x34,0x72, 0xf,0x3a,0x72, 0xf,0x3a,0x73, + 0xf,0x3a,0x74, 0xf,0x3a,0x75, 0xf,0x3a,0x76, 0xf,0x3a,0x77, + 0xf,0x3a,0x79, 0xf,0x3a,0x7a, 0xf,0x3a,0x7c, 0xf,0x3a,0x7d, + 0xf,0x3a,0x7e, 0xf,0x3b,0x21, 0xf,0x3b,0x22, 0xf,0x3b,0x25, + 0xf,0x3b,0x29, 0xf,0x3b,0x2a, 0xf,0x3b,0x2c, 0xf,0x3b,0x2e, + 0x6,0x48,0x68, 0x5,0x32,0x56, 0x6,0x3f,0x78, 0xf,0x3b,0x27, + 0xf,0x34,0x6e, 0x6,0x49,0x24, 0x6,0x48,0x6d, 0x6,0x40,0x21, + 0xf,0x3b,0x24, 0x4,0x3d,0x3f, 0x5,0x38,0x4a, 0x5,0x38,0x4d, + 0x5,0x38,0x52, 0x4,0x37,0x4f, 0x4,0x37,0x57, 0x4,0x37,0x51, + 0x6,0x52,0x5d, 0x6,0x49,0x23, 0x5,0x38,0x50, 0x6,0x49,0x22, + 0x4,0x37,0x53, 0x5,0x38,0x56, 0x5,0x38,0x58, 0x5,0x38,0x43, + 0x6,0x52,0x61, 0x5,0x38,0x5a, 0x5,0x3f,0x33, 0x4,0x37,0x5b, + 0x5,0x38,0x53, 0x6,0x49,0x21, 0x5,0x38,0x46, 0x6,0x48,0x7b, + 0x5,0x3f,0x34, 0x5,0x38,0x44, 0x5,0x38,0x54, 0x5,0x32,0x5f, + 0x6,0x52,0x58, 0x5,0x38,0x47, 0x4,0x3d,0x36, 0x4,0x37,0x58, + 0x5,0x38,0x59, 0x5,0x38,0x51, 0x5,0x38,0x4b, 0x5,0x3f,0x31, + 0x6,0x48,0x77, 0x5,0x38,0x4f, 0x5,0x38,0x3d, 0x6,0x48,0x7e, + 0x6,0x52,0x62, 0x6,0x52,0x63, 0x6,0x52,0x5a, 0x6,0x48,0x7d, + 0x5,0x38,0x57, 0x6,0x52,0x5e, 0x6,0x52,0x60, 0x5,0x3f,0x2f, + 0x4,0x3d,0x40, 0x4,0x37,0x52, 0x5,0x38,0x49, 0x6,0x48,0x79, + 0xf,0x3a,0x71, 0xf,0x3a,0x7b, 0xf,0x3b,0x23, 0xf,0x3b,0x28, + 0xf,0x3b,0x2d, 0xf,0x41,0x48, 0xf,0x41,0x4e, 0xf,0x41,0x50, + 0xf,0x41,0x51, 0xf,0x41,0x52, 0x6,0x52,0x5c, 0x6,0x52,0x5f, + 0x6,0x52,0x5b, 0x6,0x48,0x7a, 0xf,0x3b,0x2b, 0x5,0x38,0x4e, + 0x5,0x3f,0x2e, 0x5,0x38,0x4c, 0xf,0x34,0x71, 0xf,0x47,0x7d, + 0x5,0x3f,0x3c, 0x5,0x3f,0x36, 0x5,0x3f,0x35, 0x6,0x52,0x6b, + 0x5,0x4d,0x26, 0x5,0x3f,0x45, 0x6,0x5c,0x6f, 0x5,0x3f,0x39, + 0x5,0x3f,0x3f, 0x5,0x3f,0x44, 0x6,0x5c,0x74, 0x6,0x52,0x6f, + 0x5,0x45,0x6b, 0x5,0x3f,0x3b, 0x6,0x5c,0x6c, 0x6,0x52,0x65, + 0x5,0x3f,0x38, 0x5,0x3f,0x3d, 0x5,0x3f,0x3a, 0x6,0x52,0x59, + 0x4,0x49,0x6e, 0x6,0x5c,0x76, 0x6,0x5c,0x79, 0x5,0x3f,0x43, + 0x6,0x52,0x68, 0x6,0x5c,0x72, 0x4,0x43,0x4f, 0x6,0x5c,0x78, + 0x6,0x5c,0x77, 0x5,0x3f,0x41, 0x5,0x45,0x6d, 0x5,0x3f,0x3e, + 0x6,0x5c,0x71, 0x6,0x5c,0x6e, 0x6,0x5c,0x6d, 0x5,0x3f,0x37, + 0x6,0x52,0x67, 0x6,0x52,0x6d, 0xf,0x41,0x4a, 0xf,0x41,0x4b, + 0xf,0x41,0x4c, 0xf,0x41,0x4d, 0xf,0x41,0x4f, 0xf,0x41,0x53, + 0xf,0x47,0x76, 0xf,0x47,0x77, 0xf,0x47,0x79, 0xf,0x47,0x7a, + 0xf,0x48,0x25, 0xf,0x48,0x28, 0x6,0x5c,0x70, 0x6,0x5c,0x75, + 0x5,0x3f,0x40, 0xf,0x41,0x49, 0x6,0x5c,0x73, 0x6,0x52,0x6e, + 0x6,0x5d,0x23, 0x6,0x5d,0x27, 0x4,0x43,0x45, 0x4,0x43,0x44, + 0x5,0x4d,0x27, 0x6,0x5c,0x7c, 0x5,0x45,0x77, 0x5,0x45,0x76, + 0x5,0x45,0x73, 0x4,0x3d,0x35, 0x6,0x5c,0x7b, 0x7,0x22,0x72, + 0x7,0x22,0x75, 0x5,0x4d,0x29, 0x5,0x45,0x70, 0x5,0x45,0x6f, + 0x5,0x45,0x6c, 0x5,0x45,0x71, 0x5,0x45,0x72, 0x5,0x45,0x79, + 0x6,0x5d,0x25, 0x6,0x5c,0x7d, 0x6,0x5c,0x7e, 0x6,0x52,0x6a, + 0x6,0x5d,0x22, 0x7,0x22,0x74, 0x6,0x5d,0x21, 0x7,0x22,0x77, + 0x5,0x45,0x74, 0x5,0x45,0x78, 0x7,0x2d,0x6a, 0x4,0x43,0x53, + 0xf,0x47,0x78, 0xf,0x47,0x7c, 0xf,0x47,0x7e, 0xf,0x48,0x21, + 0xf,0x48,0x23, 0xf,0x48,0x24, 0xf,0x48,0x26, 0xf,0x4e,0x69, + 0xf,0x4e,0x6a, 0xf,0x4e,0x6b, 0xf,0x4e,0x6c, 0xf,0x4e,0x6d, + 0xf,0x4e,0x6e, 0xf,0x4e,0x6f, 0xf,0x4e,0x73, 0xf,0x4e,0x75, + 0x7,0x22,0x73, 0x7,0x22,0x78, 0x6,0x5c,0x6b, 0x5,0x45,0x6e, + 0x6,0x5c,0x7a, 0x5,0x4d,0x28, 0x5,0x45,0x75, 0x7,0x2d,0x71, + 0x4,0x49,0x66, 0x4,0x43,0x52, 0x7,0x2d,0x6b, 0x4,0x49,0x71, + 0x7,0x2d,0x6d, 0x5,0x4d,0x2f, 0x7,0x2d,0x73, 0x4,0x49,0x6a, + 0x5,0x4d,0x2e, 0x7,0x22,0x79, 0x5,0x4d,0x33, 0x4,0x49,0x72, + 0x7,0x2d,0x75, 0x5,0x38,0x45, 0x5,0x4d,0x32, 0x5,0x4d,0x35, + 0x4,0x50,0x35, 0x4,0x50,0x36, 0x7,0x23,0x21, 0x5,0x4d,0x34, + 0x7,0x37,0x7c, 0x5,0x4d,0x30, 0x5,0x54,0x4e, 0x4,0x56,0x34, + 0x7,0x22,0x7a, 0x7,0x23,0x22, 0x5,0x54,0x54, 0x5,0x4d,0x2b, + 0x5,0x4d,0x2d, 0x5,0x54,0x4d, 0x5,0x4d,0x2c, 0x7,0x2e,0x22, + 0x7,0x2d,0x77, 0x7,0x2d,0x76, 0x7,0x22,0x7e, 0x4,0x50,0x3c, + 0x7,0x2d,0x70, 0x7,0x2d,0x6f, 0xf,0x48,0x22, 0xf,0x4e,0x70, + 0x7,0x2d,0x72, 0x5,0x4d,0x31, 0x7,0x2d,0x6c, 0xf,0x4e,0x71, + 0xf,0x4e,0x72, 0xf,0x4e,0x74, 0xf,0x4e,0x76, 0xf,0x54,0x47, + 0xf,0x54,0x48, 0xf,0x54,0x4a, 0xf,0x54,0x4b, 0xf,0x54,0x51, + 0xf,0x54,0x53, 0x7,0x2d,0x74, 0x5,0x54,0x4b, 0x7,0x30,0x50, + 0x7,0x22,0x7d, 0x7,0x25,0x71, 0x4,0x49,0x70, 0x5,0x54,0x4c, + 0x5,0x54,0x4f, 0xf,0x4e,0x68, 0xf,0x54,0x4f, 0x5,0x54,0x50, + 0x5,0x54,0x52, 0x7,0x2d,0x7b, 0x7,0x2d,0x78, 0x5,0x54,0x55, + 0x5,0x54,0x56, 0x5,0x54,0x51, 0x7,0x2d,0x7e, 0x7,0x2d,0x7c, + 0x7,0x2d,0x7d, 0x5,0x54,0x57, 0x4,0x50,0x3d, 0x5,0x5b,0x49, + 0x7,0x2e,0x21, 0x7,0x37,0x7b, 0x7,0x37,0x7d, 0x7,0x37,0x7a, + 0x7,0x38,0x21, 0x5,0x5b,0x4b, 0x7,0x2d,0x7a, 0x7,0x37,0x79, + 0x7,0x2d,0x6e, 0xf,0x54,0x4d, 0x5,0x54,0x53, 0x7,0x38,0x22, + 0xf,0x54,0x49, 0xf,0x54,0x4e, 0xf,0x54,0x52, 0xf,0x5a,0x25, + 0xf,0x5a,0x26, 0xf,0x5a,0x2e, 0xf,0x5a,0x27, 0x5,0x5b,0x4a, + 0x5,0x54,0x58, 0xf,0x5a,0x2a, 0xf,0x54,0x4c, 0x7,0x37,0x78, + 0x5,0x5b,0x51, 0x4,0x56,0x35, 0x4,0x56,0x31, 0x4,0x5b,0x2a, + 0x5,0x5b,0x4e, 0x5,0x61,0x64, 0x5,0x61,0x62, 0x7,0x3f,0x5b, + 0x7,0x38,0x26, 0x4,0x5b,0x26, 0x5,0x5b,0x4d, 0x5,0x5b,0x4f, + 0x7,0x38,0x23, 0x7,0x38,0x25, 0x5,0x5b,0x50, 0x5,0x61,0x63, + 0x7,0x3f,0x5a, 0x5,0x61,0x65, 0x7,0x3f,0x59, 0x7,0x22,0x76, + 0xf,0x5a,0x2b, 0xf,0x5a,0x2d, 0xf,0x5e,0x5f, 0xf,0x5e,0x60, + 0xf,0x5e,0x62, 0xf,0x5e,0x63, 0xf,0x5e,0x65, 0xf,0x5e,0x66, + 0xf,0x5e,0x67, 0x7,0x3f,0x5c, 0x7,0x38,0x24, 0xf,0x5a,0x28, + 0x4,0x5b,0x27, 0x5,0x5b,0x52, 0x7,0x46,0x79, 0x7,0x3f,0x5d, + 0x5,0x61,0x68, 0x7,0x4d,0x64, 0x4,0x5f,0x63, 0x4,0x5f,0x62, + 0x7,0x46,0x7c, 0x5,0x61,0x69, 0x7,0x4d,0x67, 0x4,0x5b,0x28, + 0x5,0x61,0x6a, 0x7,0x47,0x25, 0x7,0x47,0x21, 0x7,0x46,0x78, + 0x5,0x61,0x67, 0x7,0x46,0x7e, 0x5,0x67,0x6d, 0x7,0x46,0x7a, + 0x5,0x67,0x70, 0x7,0x46,0x77, 0x7,0x47,0x22, 0x7,0x3f,0x5e, + 0x7,0x46,0x7d, 0x5,0x67,0x6e, 0xf,0x5e,0x64, 0x5,0x67,0x6f, + 0x7,0x46,0x7b, 0x5,0x67,0x6c, 0xf,0x62,0x39, 0x7,0x47,0x2a, + 0x4,0x63,0x44, 0x7,0x47,0x27, 0x5,0x67,0x74, 0x7,0x47,0x24, + 0x5,0x6c,0x2a, 0x7,0x47,0x29, 0x7,0x47,0x26, 0x7,0x3f,0x5f, + 0x5,0x67,0x75, 0x4,0x63,0x3f, 0x5,0x67,0x71, 0x5,0x6c,0x28, + 0x7,0x47,0x2b, 0x7,0x47,0x23, 0x7,0x4d,0x65, 0x5,0x67,0x77, + 0xf,0x62,0x3a, 0xf,0x62,0x38, 0xf,0x62,0x3b, 0xf,0x62,0x3c, + 0xf,0x62,0x3d, 0x7,0x4d,0x66, 0x5,0x61,0x66, 0x5,0x67,0x72, + 0xf,0x65,0x2b, 0x5,0x67,0x76, 0x5,0x6c,0x29, 0x7,0x53,0x39, + 0x7,0x4d,0x6a, 0x4,0x63,0x41, 0x7,0x4d,0x69, 0x4,0x63,0x45, + 0x7,0x53,0x38, 0x7,0x4d,0x6b, 0xf,0x67,0x55, 0x7,0x5b,0x4f, + 0x4,0x66,0x3e, 0x5,0x6c,0x2b, 0x7,0x57,0x73, 0x7,0x57,0x74, + 0x7,0x57,0x75, 0x7,0x53,0x3b, 0x7,0x53,0x3a, 0x7,0x53,0x3c, + 0xf,0x69,0x42, 0x7,0x57,0x76, 0x7,0x5b,0x50, 0x7,0x5b,0x52, + 0x7,0x5b,0x53, 0x7,0x5b,0x51, 0xf,0x6a,0x50, 0xf,0x69,0x41, + 0xf,0x6a,0x51, 0xf,0x6a,0x52, 0x7,0x5b,0x55, 0x5,0x77,0x5a, + 0x7,0x5b,0x54, 0x7,0x5e,0x65, 0xf,0x6a,0x53, 0xf,0x6b,0x47, + 0xf,0x6b,0x48, 0x5,0x77,0x5b, 0x7,0x5e,0x66, 0x5,0x79,0x29, + 0x7,0x5e,0x67, 0xf,0x6c,0x28, 0xf,0x6c,0x29, 0x4,0x6d,0x72, + 0xf,0x6c,0x7c, 0xf,0x6c,0x7d, 0x5,0x7b,0x3e, 0x5,0x7b,0x60, + 0xf,0x6d,0x34, 0x5,0x22,0x6a, 0x4,0x22,0x72, 0x6,0x24,0x76, + 0x6,0x27,0x6b, 0x5,0x24,0x3b, 0x6,0x27,0x6a, 0x6,0x27,0x6d, + 0x6,0x27,0x6c, 0x4,0x26,0x52, 0x6,0x2b,0x51, 0x6,0x2b,0x58, + 0x6,0x2b,0x54, 0x6,0x2b,0x56, 0x4,0x26,0x53, 0x6,0x2b,0x55, + 0x6,0x2b,0x53, 0x6,0x2b,0x57, 0xf,0x27,0x24, 0xf,0x27,0x23, + 0x6,0x31,0x3d, 0x6,0x31,0x3b, 0x6,0x31,0x3e, 0x6,0x31,0x40, + 0x4,0x29,0x4c, 0x6,0x31,0x41, 0x6,0x31,0x3f, 0xf,0x2a,0x71, + 0xf,0x2a,0x72, 0x6,0x31,0x3c, 0x6,0x37,0x67, 0x5,0x2d,0x5f, + 0x6,0x37,0x69, 0x5,0x2d,0x5e, 0x6,0x37,0x68, 0x5,0x32,0x61, + 0x4,0x31,0x6f, 0x6,0x40,0x25, 0xf,0x34,0x73, 0xf,0x34,0x74, + 0x6,0x40,0x24, 0x5,0x32,0x60, 0x6,0x49,0x28, 0x6,0x49,0x27, + 0x6,0x49,0x25, 0x6,0x49,0x26, 0x4,0x37,0x5c, 0x6,0x49,0x29, + 0xf,0x3b,0x2f, 0x5,0x38,0x5b, 0x5,0x38,0x5c, 0xf,0x34,0x76, + 0x4,0x3d,0x44, 0x6,0x52,0x71, 0x5,0x3f,0x47, 0x5,0x3f,0x49, + 0xf,0x41,0x55, 0x4,0x3d,0x41, 0x6,0x52,0x70, 0x5,0x3f,0x48, + 0x6,0x5d,0x29, 0x6,0x5d,0x2a, 0x5,0x45,0x7a, 0x5,0x45,0x7c, + 0x5,0x45,0x7b, 0x7,0x23,0x24, 0x5,0x45,0x7d, 0xf,0x48,0x29, + 0xf,0x48,0x2a, 0x6,0x5d,0x28, 0x5,0x4d,0x36, 0x4,0x49,0x73, + 0x4,0x49,0x74, 0x7,0x23,0x28, 0x7,0x23,0x27, 0x7,0x23,0x25, + 0x6,0x5d,0x2b, 0x7,0x23,0x23, 0xf,0x4e,0x7b, 0x7,0x23,0x29, + 0x7,0x23,0x26, 0xf,0x4e,0x77, 0xf,0x4e,0x78, 0xf,0x4e,0x7a, + 0x7,0x23,0x2a, 0x7,0x2e,0x2a, 0x7,0x2e,0x25, 0x7,0x2e,0x24, + 0x7,0x2e,0x27, 0x7,0x2e,0x26, 0x7,0x2e,0x29, 0x7,0x2e,0x28, + 0x7,0x2c,0x63, 0x7,0x31,0x70, 0x7,0x2e,0x23, 0x7,0x38,0x27, + 0x5,0x5b,0x53, 0xf,0x5a,0x2f, 0x7,0x3f,0x60, 0x7,0x47,0x2d, + 0x4,0x5f,0x65, 0x7,0x47,0x2e, 0x5,0x6c,0x2c, 0xf,0x65,0x2c, + 0x5,0x70,0x21, 0x7,0x53,0x3d, 0x6,0x23,0x27, 0x5,0x21,0x6d, + 0x6,0x24,0x77, 0x6,0x24,0x78, 0x4,0x24,0x34, 0xf,0x24,0x37, + 0xf,0x24,0x38, 0x5,0x26,0x39, 0x6,0x2b,0x59, 0x6,0x2b,0x5a, + 0x6,0x31,0x43, 0x6,0x31,0x42, 0x6,0x31,0x44, 0x5,0x29,0x39, + 0xf,0x2a,0x73, 0xf,0x2a,0x74, 0xf,0x2a,0x75, 0x6,0x31,0x46, + 0x6,0x31,0x45, 0x5,0x29,0x38, 0x6,0x37,0x6c, 0x6,0x37,0x6a, + 0x6,0x37,0x6b, 0x5,0x2d,0x61, 0x5,0x2d,0x60, 0x6,0x40,0x26, + 0xf,0x34,0x77, 0x5,0x38,0x5d, 0x5,0x38,0x5f, 0x5,0x38,0x60, + 0x5,0x38,0x5e, 0x5,0x3f,0x4a, 0x5,0x45,0x7e, 0x4,0x43,0x55, + 0x7,0x23,0x2b, 0x5,0x5b,0x54, 0x5,0x70,0x22, 0x6,0x23,0x28, + 0x5,0x21,0x6e, 0x6,0x23,0x29, 0x6,0x23,0x2a, 0x5,0x21,0x6f, + 0x5,0x22,0x6c, 0x4,0x22,0x76, 0x6,0x24,0x79, 0x5,0x22,0x72, + 0x5,0x22,0x70, 0x5,0x22,0x6f, 0x5,0x22,0x6b, 0x5,0x22,0x6d, + 0xf,0x22,0x50, 0xf,0x22,0x52, 0x5,0x22,0x71, 0x4,0x24,0x37, + 0x6,0x27,0x73, 0x6,0x27,0x76, 0x6,0x27,0x75, 0x4,0x26,0x57, + 0x5,0x24,0x3d, 0x6,0x27,0x6f, 0x4,0x24,0x38, 0x4,0x24,0x35, + 0x6,0x27,0x77, 0x5,0x24,0x3e, 0x4,0x24,0x3b, 0x6,0x27,0x72, + 0x6,0x2b,0x5d, 0x6,0x27,0x71, 0x6,0x2b,0x65, 0x6,0x2b,0x5b, + 0x6,0x27,0x70, 0x5,0x24,0x3c, 0x6,0x2b,0x5c, 0x6,0x27,0x74, + 0xf,0x24,0x3b, 0xf,0x24,0x3c, 0xf,0x24,0x3d, 0xf,0x24,0x3e, + 0xf,0x24,0x3f, 0xf,0x24,0x40, 0xf,0x24,0x41, 0xf,0x24,0x43, + 0xf,0x24,0x44, 0xf,0x24,0x45, 0xf,0x24,0x3a, 0x6,0x2b,0x5e, + 0x6,0x2b,0x5f, 0x6,0x2b,0x61, 0x5,0x26,0x3b, 0x5,0x29,0x3a, + 0x6,0x2b,0x64, 0x6,0x31,0x48, 0x5,0x26,0x3d, 0x6,0x31,0x4a, + 0x5,0x26,0x3c, 0x6,0x31,0x49, 0x6,0x31,0x47, 0x6,0x2b,0x62, + 0xf,0x27,0x26, 0xf,0x27,0x27, 0xf,0x27,0x28, 0xf,0x27,0x29, + 0xf,0x27,0x2a, 0xf,0x27,0x2b, 0xf,0x27,0x2c, 0xf,0x27,0x2d, + 0xf,0x27,0x2f, 0xf,0x27,0x25, 0x5,0x26,0x3e, 0x6,0x31,0x52, + 0x6,0x31,0x54, 0x4,0x29,0x58, 0x4,0x29,0x4f, 0x4,0x29,0x50, + 0x6,0x31,0x53, 0x6,0x37,0x6d, 0x5,0x29,0x3f, 0x5,0x29,0x42, + 0x5,0x29,0x41, 0x6,0x31,0x4d, 0x5,0x29,0x47, 0x4,0x2d,0x34, + 0x4,0x29,0x5c, 0x5,0x29,0x3e, 0x5,0x29,0x3d, 0x5,0x2d,0x63, + 0x4,0x29,0x53, 0x6,0x37,0x6e, 0x5,0x29,0x48, 0x4,0x29,0x5a, + 0x6,0x31,0x50, 0x5,0x29,0x40, 0x5,0x29,0x44, 0x6,0x31,0x4e, + 0x6,0x31,0x56, 0x6,0x31,0x4b, 0x5,0x29,0x43, 0x5,0x29,0x3c, + 0x6,0x31,0x55, 0x6,0x31,0x51, 0xf,0x2a,0x76, 0xf,0x2a,0x77, + 0xf,0x2a,0x78, 0xf,0x2a,0x79, 0xf,0x2a,0x7a, 0xf,0x2a,0x7b, + 0xf,0x2a,0x7c, 0xf,0x2a,0x7d, 0xf,0x2a,0x7e, 0xf,0x2b,0x21, + 0xf,0x2b,0x23, 0xf,0x2b,0x24, 0xf,0x2b,0x25, 0xf,0x2b,0x26, + 0xf,0x2b,0x27, 0xf,0x2b,0x28, 0xf,0x2b,0x29, 0xf,0x2b,0x2a, + 0xf,0x2f,0x53, 0xf,0x2f,0x5c, 0xf,0x2f,0x61, 0x6,0x31,0x4c, + 0xf,0x2b,0x22, 0x5,0x29,0x3b, 0x5,0x2d,0x62, 0x5,0x2d,0x64, + 0x4,0x2d,0x3d, 0x6,0x37,0x75, 0x4,0x2d,0x38, 0x5,0x2d,0x6d, + 0x5,0x2d,0x6b, 0x4,0x2d,0x39, 0x4,0x29,0x57, 0x4,0x2d,0x35, + 0x5,0x2d,0x6a, 0x6,0x37,0x7b, 0x6,0x37,0x70, 0x6,0x37,0x7d, + 0x6,0x37,0x73, 0x5,0x2d,0x69, 0x6,0x37,0x72, 0x6,0x37,0x77, + 0x4,0x2d,0x36, 0x6,0x37,0x78, 0x5,0x2d,0x6c, 0x5,0x2d,0x65, + 0x4,0x2d,0x37, 0x5,0x2d,0x67, 0x5,0x2d,0x68, 0x4,0x2d,0x3a, + 0x6,0x37,0x7a, 0x5,0x2d,0x66, 0x6,0x31,0x57, 0x6,0x37,0x76, + 0x6,0x40,0x27, 0x6,0x37,0x79, 0x6,0x37,0x74, 0x5,0x29,0x46, + 0x6,0x37,0x7c, 0x6,0x37,0x7e, 0xf,0x2f,0x4c, 0xf,0x2f,0x4d, + 0xf,0x2f,0x4e, 0xf,0x2f,0x4f, 0xf,0x2f,0x50, 0xf,0x2f,0x51, + 0xf,0x2f,0x52, 0xf,0x2f,0x55, 0xf,0x2f,0x56, 0xf,0x2f,0x57, + 0xf,0x2f,0x5a, 0xf,0x2f,0x5b, 0xf,0x2f,0x5d, 0xf,0x2f,0x5e, + 0xf,0x2f,0x60, 0xf,0x2f,0x62, 0x6,0x40,0x28, 0xf,0x2f,0x58, + 0x6,0x37,0x6f, 0xf,0x2f,0x54, 0x4,0x31,0x72, 0x4,0x31,0x73, + 0x4,0x37,0x5e, 0x5,0x32,0x69, 0x6,0x40,0x31, 0x5,0x2d,0x6e, + 0x6,0x40,0x37, 0x5,0x32,0x63, 0x4,0x31,0x74, 0x4,0x32,0x22, + 0x4,0x31,0x76, 0x5,0x32,0x62, 0x4,0x31,0x7d, 0x5,0x38,0x61, + 0x5,0x32,0x64, 0x6,0x40,0x34, 0x5,0x32,0x67, 0x6,0x40,0x35, + 0x6,0x40,0x2c, 0x6,0x40,0x29, 0x4,0x32,0x24, 0x6,0x49,0x2f, + 0x6,0x49,0x2a, 0x6,0x40,0x2a, 0x5,0x32,0x65, 0x6,0x49,0x2d, + 0x4,0x37,0x5d, 0x6,0x40,0x2f, 0x6,0x49,0x2c, 0x6,0x49,0x2b, + 0x5,0x32,0x68, 0x6,0x40,0x2d, 0x6,0x49,0x2e, 0x6,0x40,0x33, + 0x6,0x40,0x30, 0x4,0x31,0x75, 0x6,0x40,0x2e, 0xf,0x34,0x78, + 0xf,0x34,0x79, 0xf,0x34,0x7a, 0xf,0x34,0x7b, 0xf,0x34,0x7c, + 0xf,0x34,0x7e, 0xf,0x35,0x22, 0xf,0x35,0x23, 0xf,0x35,0x24, + 0xf,0x35,0x25, 0xf,0x35,0x26, 0xf,0x35,0x27, 0xf,0x35,0x28, + 0xf,0x35,0x29, 0xf,0x35,0x2a, 0xf,0x35,0x2b, 0xf,0x35,0x2c, + 0xf,0x35,0x2e, 0xf,0x35,0x2d, 0xf,0x35,0x2f, 0xf,0x35,0x30, + 0xf,0x3b,0x31, 0xf,0x34,0x7d, 0x5,0x32,0x66, 0x4,0x32,0x26, + 0xf,0x3b,0x41, 0x5,0x38,0x6b, 0x6,0x49,0x34, 0x4,0x37,0x69, + 0x6,0x49,0x3b, 0x6,0x49,0x36, 0x5,0x38,0x6d, 0x6,0x49,0x41, + 0x5,0x38,0x74, 0x6,0x49,0x31, 0x4,0x3d,0x51, 0x4,0x37,0x67, + 0x5,0x38,0x62, 0x5,0x38,0x6a, 0x4,0x37,0x5f, 0x5,0x38,0x68, + 0x4,0x37,0x63, 0x5,0x38,0x69, 0x4,0x37,0x6a, 0x5,0x38,0x66, + 0x4,0x37,0x6d, 0x5,0x38,0x6f, 0x4,0x37,0x66, 0x6,0x49,0x42, + 0x6,0x49,0x43, 0x6,0x49,0x3a, 0x5,0x38,0x71, 0x6,0x49,0x33, + 0x6,0x49,0x46, 0x6,0x49,0x37, 0x5,0x38,0x70, 0x4,0x37,0x6c, + 0x6,0x49,0x47, 0x6,0x49,0x32, 0x5,0x38,0x6c, 0x5,0x38,0x6e, + 0x6,0x49,0x44, 0x5,0x38,0x64, 0x6,0x49,0x3c, 0x6,0x49,0x45, + 0x6,0x49,0x40, 0x6,0x49,0x4c, 0x6,0x49,0x3f, 0x6,0x49,0x4d, + 0x6,0x49,0x48, 0x6,0x49,0x39, 0x5,0x38,0x72, 0x6,0x49,0x3d, + 0x5,0x38,0x73, 0x5,0x38,0x67, 0x6,0x49,0x38, 0x6,0x49,0x4b, + 0x5,0x38,0x65, 0x6,0x52,0x73, 0xf,0x3b,0x30, 0xf,0x3b,0x32, + 0xf,0x3b,0x34, 0xf,0x3b,0x35, 0xf,0x3b,0x36, 0xf,0x3b,0x37, + 0xf,0x3b,0x38, 0xf,0x3b,0x39, 0xf,0x3b,0x3a, 0xf,0x3b,0x3b, + 0xf,0x3b,0x3c, 0xf,0x3b,0x3d, 0xf,0x3b,0x3f, 0xf,0x3b,0x40, + 0xf,0x3b,0x42, 0xf,0x3b,0x43, 0xf,0x3b,0x44, 0xf,0x3b,0x45, + 0xf,0x3b,0x46, 0xf,0x3b,0x48, 0xf,0x3b,0x49, 0xf,0x3b,0x4a, + 0x6,0x52,0x74, 0x6,0x49,0x3e, 0x6,0x49,0x49, 0x6,0x49,0x35, + 0x5,0x38,0x63, 0xf,0x3b,0x47, 0x5,0x3f,0x52, 0x6,0x52,0x7b, + 0x4,0x3d,0x4b, 0x4,0x3d,0x49, 0x5,0x3f,0x55, 0x4,0x3d,0x46, + 0x6,0x52,0x78, 0x4,0x3d,0x4d, 0x4,0x3d,0x53, 0x4,0x3d,0x47, + 0x4,0x3d,0x52, 0x6,0x52,0x7e, 0x5,0x3f,0x51, 0x5,0x46,0x21, + 0x5,0x3f,0x4b, 0x6,0x5d,0x2c, 0x6,0x53,0x25, 0x6,0x52,0x75, + 0x6,0x53,0x23, 0x6,0x53,0x22, 0x5,0x3f,0x4d, 0x5,0x3f,0x53, + 0x5,0x3f,0x4e, 0x6,0x52,0x79, 0x6,0x53,0x21, 0x5,0x3f,0x50, + 0x6,0x53,0x24, 0x6,0x52,0x7c, 0x5,0x3f,0x4c, 0x6,0x52,0x7a, + 0x5,0x3f,0x4f, 0xf,0x41,0x56, 0xf,0x41,0x57, 0xf,0x41,0x58, + 0xf,0x41,0x59, 0xf,0x41,0x5a, 0xf,0x41,0x5b, 0xf,0x41,0x5c, + 0xf,0x41,0x5d, 0xf,0x41,0x5e, 0xf,0x41,0x60, 0xf,0x41,0x61, + 0xf,0x41,0x63, 0xf,0x41,0x64, 0xf,0x41,0x65, 0xf,0x41,0x66, + 0xf,0x41,0x67, 0xf,0x41,0x69, 0xf,0x48,0x30, 0x6,0x52,0x77, + 0x6,0x52,0x7d, 0x6,0x52,0x76, 0xf,0x41,0x68, 0x5,0x3f,0x54, + 0x6,0x5d,0x36, 0x5,0x4d,0x39, 0x5,0x46,0x27, 0x5,0x46,0x2a, + 0x4,0x43,0x62, 0x4,0x43,0x5f, 0x6,0x5d,0x3c, 0x6,0x5d,0x3d, + 0x6,0x5d,0x2e, 0x4,0x43,0x57, 0x6,0x5d,0x3f, 0x5,0x46,0x26, + 0x4,0x43,0x63, 0x5,0x4d,0x38, 0x5,0x46,0x29, 0x6,0x5d,0x35, + 0x4,0x43,0x59, 0x7,0x23,0x2f, 0x4,0x43,0x5b, 0x4,0x43,0x5a, + 0x7,0x23,0x2e, 0x7,0x23,0x31, 0x5,0x46,0x24, 0x4,0x43,0x65, + 0x6,0x5d,0x39, 0x6,0x5d,0x3e, 0x6,0x5d,0x3a, 0x5,0x46,0x28, + 0x6,0x5d,0x37, 0x5,0x46,0x2b, 0x7,0x23,0x2c, 0x6,0x5d,0x3b, + 0x6,0x5d,0x33, 0x6,0x5d,0x31, 0x5,0x46,0x22, 0x4,0x43,0x60, + 0x6,0x5d,0x2f, 0x6,0x5d,0x34, 0xf,0x48,0x2b, 0xf,0x48,0x2c, + 0xf,0x48,0x2d, 0xf,0x48,0x2e, 0xf,0x48,0x2f, 0xf,0x48,0x33, + 0xf,0x48,0x34, 0xf,0x48,0x35, 0xf,0x48,0x37, 0xf,0x48,0x38, + 0xf,0x48,0x3a, 0xf,0x48,0x3b, 0xf,0x48,0x39, 0xf,0x48,0x3c, + 0xf,0x48,0x3d, 0xf,0x48,0x3e, 0xf,0x48,0x3f, 0xf,0x48,0x40, + 0xf,0x48,0x41, 0xf,0x48,0x42, 0xf,0x48,0x43, 0xf,0x48,0x44, + 0xf,0x48,0x45, 0xf,0x48,0x47, 0xf,0x48,0x48, 0xf,0x48,0x49, + 0xf,0x48,0x46, 0x6,0x5d,0x30, 0xf,0x48,0x36, 0x7,0x23,0x33, + 0x7,0x23,0x38, 0x5,0x4d,0x3c, 0x4,0x4a,0x25, 0x7,0x23,0x3d, + 0x7,0x23,0x37, 0x7,0x23,0x39, 0x4,0x49,0x7b, 0x4,0x49,0x78, + 0x5,0x4d,0x3d, 0x5,0x4d,0x3b, 0x7,0x23,0x45, 0x4,0x49,0x7d, + 0x7,0x2e,0x2f, 0x4,0x4a,0x21, 0x5,0x4d,0x41, 0x4,0x4a,0x26, + 0x4,0x49,0x7c, 0x5,0x54,0x59, 0x7,0x2e,0x3c, 0x7,0x23,0x35, + 0x7,0x23,0x34, 0x7,0x2e,0x2d, 0x7,0x2e,0x2b, 0x7,0x23,0x44, + 0x7,0x2e,0x2c, 0x7,0x23,0x3c, 0x5,0x4d,0x40, 0x7,0x2e,0x2e, + 0x5,0x4d,0x3f, 0x7,0x23,0x3b, 0x7,0x23,0x42, 0x7,0x23,0x43, + 0x7,0x23,0x3e, 0x7,0x23,0x41, 0x4,0x49,0x77, 0xf,0x48,0x31, + 0x7,0x23,0x32, 0x7,0x23,0x3f, 0x7,0x23,0x40, 0xf,0x4e,0x7c, + 0xf,0x4e,0x7d, 0xf,0x4e,0x7e, 0xf,0x4f,0x21, 0xf,0x4f,0x22, + 0xf,0x4f,0x23, 0xf,0x4f,0x26, 0xf,0x4f,0x27, 0xf,0x4f,0x28, + 0xf,0x4f,0x29, 0xf,0x4f,0x2a, 0xf,0x4f,0x2b, 0xf,0x4f,0x2d, + 0xf,0x4f,0x2e, 0xf,0x4f,0x2f, 0xf,0x4f,0x30, 0xf,0x54,0x5f, + 0xf,0x4f,0x24, 0x4,0x56,0x38, 0x4,0x50,0x41, 0x7,0x2e,0x35, + 0x7,0x2e,0x30, 0x5,0x54,0x5a, 0x5,0x54,0x5b, 0x7,0x2e,0x3e, + 0x7,0x2e,0x3a, 0x7,0x2e,0x32, 0x7,0x23,0x36, 0x4,0x50,0x3e, + 0x4,0x50,0x43, 0x4,0x50,0x40, 0x5,0x54,0x5d, 0x4,0x50,0x3f, + 0x7,0x2e,0x3d, 0x4,0x50,0x46, 0x7,0x2e,0x3b, 0x4,0x50,0x48, + 0x4,0x50,0x42, 0x4,0x50,0x47, 0x7,0x2e,0x39, 0x7,0x2e,0x31, + 0x7,0x2e,0x40, 0x7,0x38,0x29, 0x7,0x2e,0x38, 0x5,0x54,0x5f, + 0x5,0x54,0x5c, 0x7,0x2e,0x37, 0x7,0x38,0x28, 0x7,0x2e,0x33, + 0x7,0x2e,0x3f, 0xf,0x54,0x55, 0xf,0x54,0x56, 0xf,0x54,0x57, + 0xf,0x54,0x58, 0xf,0x54,0x59, 0xf,0x54,0x5a, 0xf,0x54,0x5b, + 0xf,0x54,0x5c, 0xf,0x54,0x5d, 0xf,0x54,0x5e, 0xf,0x54,0x60, + 0x7,0x2e,0x34, 0x7,0x2e,0x36, 0x4,0x50,0x44, 0xf,0x54,0x54, + 0x5,0x5b,0x56, 0x7,0x38,0x31, 0x5,0x5b,0x57, 0x7,0x38,0x36, + 0x4,0x56,0x3b, 0x7,0x38,0x2f, 0x7,0x38,0x35, 0x4,0x56,0x3a, + 0x7,0x38,0x34, 0x7,0x38,0x2c, 0x5,0x5b,0x58, 0x4,0x56,0x37, + 0x5,0x5b,0x55, 0x7,0x38,0x2a, 0x7,0x38,0x37, 0x7,0x38,0x30, + 0x7,0x38,0x2e, 0x7,0x38,0x32, 0x7,0x38,0x38, 0x7,0x38,0x2b, + 0x7,0x38,0x2d, 0xf,0x5a,0x30, 0xf,0x5a,0x31, 0xf,0x5a,0x32, + 0xf,0x5a,0x33, 0xf,0x5a,0x34, 0xf,0x5a,0x35, 0x7,0x38,0x33, + 0x4,0x5b,0x33, 0x4,0x5b,0x38, 0x5,0x61,0x6e, 0x5,0x61,0x6b, + 0x5,0x61,0x6c, 0x5,0x61,0x6d, 0x7,0x3f,0x68, 0x7,0x3f,0x67, + 0x4,0x5b,0x35, 0x4,0x5b,0x37, 0x5,0x67,0x7a, 0x5,0x6c,0x2d, + 0x7,0x3f,0x69, 0x7,0x3f,0x66, 0x4,0x5b,0x34, 0x7,0x3f,0x63, + 0x7,0x3f,0x65, 0x7,0x47,0x2f, 0x7,0x3f,0x61, 0x7,0x3f,0x64, + 0xf,0x5e,0x68, 0xf,0x5e,0x69, 0xf,0x5e,0x6a, 0xf,0x5e,0x6d, + 0xf,0x5e,0x6e, 0xf,0x5e,0x6f, 0xf,0x5e,0x71, 0xf,0x5e,0x72, + 0xf,0x5e,0x74, 0xf,0x5e,0x6c, 0xf,0x5e,0x6b, 0x4,0x5f,0x66, + 0x4,0x5f,0x68, 0x4,0x5f,0x67, 0x4,0x5f,0x69, 0x5,0x6c,0x2f, + 0x7,0x47,0x32, 0x7,0x47,0x34, 0x7,0x47,0x36, 0x5,0x67,0x7b, + 0x7,0x47,0x30, 0x5,0x6c,0x2e, 0x7,0x47,0x38, 0x4,0x5f,0x6b, + 0x7,0x47,0x35, 0x7,0x47,0x33, 0x7,0x47,0x31, 0x4,0x5f,0x6a, + 0x5,0x67,0x79, 0xf,0x62,0x3e, 0xf,0x62,0x3f, 0xf,0x62,0x40, + 0xf,0x62,0x41, 0xf,0x62,0x42, 0xf,0x62,0x43, 0xf,0x62,0x44, + 0xf,0x62,0x45, 0xf,0x62,0x46, 0xf,0x62,0x49, 0xf,0x65,0x2f, + 0x7,0x3f,0x6a, 0x7,0x47,0x37, 0xf,0x62,0x47, 0x5,0x6c,0x32, + 0x4,0x66,0x3f, 0x7,0x4d,0x6d, 0x4,0x63,0x48, 0x7,0x4d,0x6c, + 0x4,0x63,0x49, 0x7,0x4d,0x70, 0x4,0x63,0x4a, 0x7,0x4d,0x6e, + 0x5,0x6c,0x33, 0x5,0x6c,0x30, 0x5,0x6c,0x31, 0x7,0x4d,0x6f, + 0xf,0x65,0x2d, 0xf,0x65,0x2e, 0xf,0x65,0x30, 0x7,0x53,0x44, + 0x7,0x57,0x77, 0x4,0x66,0x41, 0x7,0x53,0x3f, 0x7,0x53,0x43, + 0x7,0x53,0x42, 0x4,0x66,0x42, 0x5,0x73,0x45, 0x7,0x53,0x41, + 0x7,0x53,0x40, 0xf,0x67,0x56, 0xf,0x67,0x57, 0xf,0x67,0x58, + 0xf,0x67,0x59, 0x7,0x57,0x78, 0x7,0x57,0x79, 0x5,0x73,0x44, + 0x5,0x73,0x47, 0x5,0x70,0x23, 0x7,0x57,0x7a, 0x5,0x73,0x42, + 0x5,0x73,0x46, 0x7,0x57,0x7c, 0x7,0x5b,0x57, 0x7,0x53,0x3e, + 0xf,0x69,0x43, 0xf,0x69,0x44, 0x5,0x73,0x43, 0x7,0x57,0x7b, + 0x7,0x5b,0x58, 0xf,0x6a,0x54, 0xf,0x6a,0x55, 0xf,0x6a,0x56, + 0x7,0x5e,0x6a, 0x5,0x77,0x5d, 0x7,0x5e,0x69, 0x4,0x6b,0x6b, + 0x7,0x5e,0x6b, 0x5,0x77,0x5c, 0x7,0x5e,0x68, 0xf,0x6b,0x49, + 0xf,0x6b,0x4a, 0xf,0x6b,0x4b, 0xf,0x6b,0x4c, 0x7,0x62,0x38, + 0xf,0x6c,0x2a, 0xf,0x6c,0x2b, 0x4,0x6d,0x73, 0x7,0x63,0x53, + 0xf,0x6c,0x61, 0x7,0x66,0x26, 0x4,0x22,0x77, 0x4,0x24,0x3d, + 0x4,0x26,0x5a, 0xf,0x27,0x31, 0xf,0x27,0x32, 0xf,0x27,0x33, + 0x6,0x31,0x58, 0x6,0x38,0x22, 0x5,0x2f,0x5c, 0x4,0x2d,0x3e, + 0x6,0x38,0x21, 0x6,0x36,0x44, 0x6,0x40,0x39, 0x6,0x40,0x38, + 0x6,0x49,0x4f, 0x6,0x49,0x4e, 0xf,0x3b,0x4c, 0xf,0x3b,0x4d, + 0x5,0x38,0x75, 0x6,0x53,0x26, 0xf,0x41,0x6a, 0x6,0x53,0x27, + 0x5,0x46,0x2d, 0x6,0x5d,0x40, 0x7,0x23,0x46, 0x7,0x23,0x47, + 0x5,0x54,0x60, 0xf,0x54,0x61, 0x7,0x38,0x3b, 0x7,0x38,0x3a, + 0x5,0x5b,0x59, 0x7,0x38,0x3c, 0x7,0x4d,0x71, 0x5,0x24,0x3f, + 0x6,0x27,0x79, 0x5,0x24,0x40, 0x6,0x27,0x7a, 0x5,0x24,0x41, + 0x6,0x27,0x78, 0x6,0x2b,0x68, 0x4,0x26,0x60, 0x5,0x26,0x42, + 0x5,0x26,0x40, 0x4,0x26,0x5d, 0x6,0x2b,0x6c, 0x6,0x2b,0x66, + 0x6,0x2b,0x6a, 0x6,0x2b,0x69, 0x6,0x2b,0x67, 0x5,0x26,0x3f, + 0x5,0x26,0x41, 0x4,0x26,0x5c, 0x4,0x29,0x60, 0x6,0x31,0x59, + 0x5,0x29,0x4c, 0x5,0x29,0x4b, 0x6,0x31,0x5c, 0x6,0x31,0x5e, + 0x6,0x31,0x5d, 0x5,0x29,0x49, 0x5,0x29,0x4a, 0x4,0x29,0x5e, + 0x4,0x29,0x5f, 0x6,0x31,0x5b, 0x6,0x38,0x23, 0x6,0x38,0x24, + 0x6,0x38,0x26, 0x5,0x2d,0x72, 0x6,0x31,0x5f, 0x4,0x2d,0x45, + 0x6,0x38,0x28, 0x5,0x2d,0x70, 0x6,0x38,0x2a, 0x5,0x2d,0x6f, + 0x5,0x2d,0x74, 0x6,0x38,0x25, 0x5,0x2d,0x73, 0x5,0x2d,0x71, + 0x6,0x38,0x29, 0x6,0x38,0x27, 0x4,0x2d,0x41, 0x5,0x32,0x6d, + 0x6,0x40,0x40, 0x4,0x32,0x2e, 0x6,0x40,0x3a, 0x6,0x40,0x3b, + 0x6,0x40,0x3d, 0x5,0x32,0x6f, 0x5,0x32,0x70, 0x4,0x32,0x30, + 0x6,0x40,0x3e, 0x6,0x40,0x3c, 0x5,0x32,0x6b, 0x6,0x40,0x41, + 0x4,0x32,0x31, 0x4,0x32,0x2a, 0x4,0x32,0x2d, 0x4,0x32,0x29, + 0x5,0x32,0x6e, 0xf,0x35,0x31, 0xf,0x35,0x32, 0xf,0x35,0x33, + 0xf,0x35,0x34, 0xf,0x35,0x35, 0x5,0x32,0x6a, 0x6,0x40,0x3f, + 0x6,0x49,0x58, 0x5,0x39,0x22, 0x6,0x49,0x55, 0x4,0x37,0x7a, + 0x4,0x37,0x7b, 0x6,0x49,0x59, 0x6,0x49,0x54, 0x6,0x49,0x5a, + 0x5,0x38,0x76, 0x5,0x38,0x7e, 0x5,0x39,0x21, 0x5,0x38,0x7d, + 0x5,0x38,0x77, 0x6,0x49,0x56, 0x5,0x38,0x7b, 0x6,0x49,0x51, + 0x6,0x49,0x50, 0x6,0x49,0x53, 0x4,0x37,0x72, 0x4,0x37,0x73, + 0x4,0x37,0x74, 0x5,0x38,0x78, 0x5,0x38,0x79, 0x5,0x32,0x6c, + 0x6,0x49,0x52, 0x6,0x53,0x2f, 0x5,0x38,0x7a, 0x5,0x3f,0x57, + 0x5,0x3f,0x5a, 0x5,0x3f,0x5c, 0x4,0x3d,0x57, 0x4,0x3d,0x5f, + 0x6,0x53,0x2b, 0x6,0x53,0x2e, 0x6,0x53,0x29, 0x5,0x3f,0x5b, + 0x6,0x53,0x30, 0x6,0x53,0x2d, 0x6,0x53,0x28, 0x4,0x3d,0x60, + 0x5,0x3f,0x56, 0x6,0x53,0x31, 0x5,0x3f,0x59, 0x4,0x3d,0x5e, + 0x4,0x3d,0x55, 0x4,0x3d,0x56, 0x4,0x3d,0x58, 0x5,0x3f,0x58, + 0x6,0x53,0x2a, 0xf,0x41,0x6b, 0x6,0x53,0x2c, 0x5,0x32,0x71, + 0x4,0x3d,0x5a, 0x6,0x55,0x60, 0x5,0x46,0x34, 0x6,0x5d,0x49, + 0x5,0x46,0x32, 0x6,0x5d,0x41, 0x4,0x43,0x68, 0x5,0x46,0x31, + 0x6,0x5d,0x42, 0x5,0x46,0x2f, 0x6,0x5d,0x46, 0x5,0x46,0x37, + 0x5,0x46,0x35, 0x6,0x5d,0x47, 0x6,0x5d,0x45, 0x6,0x5d,0x44, + 0x6,0x5d,0x48, 0x6,0x5d,0x43, 0x6,0x5d,0x4a, 0x5,0x46,0x33, + 0x4,0x43,0x67, 0x5,0x46,0x36, 0x6,0x5d,0x4b, 0x5,0x48,0x25, + 0x5,0x4d,0x42, 0x5,0x4d,0x47, 0x4,0x4a,0x2c, 0x7,0x23,0x4e, + 0x7,0x23,0x49, 0x7,0x23,0x48, 0x5,0x4d,0x46, 0x7,0x23,0x52, + 0x7,0x23,0x4f, 0x7,0x23,0x4d, 0x5,0x4d,0x45, 0x7,0x23,0x50, + 0x5,0x4d,0x43, 0x5,0x4d,0x44, 0xf,0x4f,0x31, 0x7,0x23,0x4b, + 0x7,0x23,0x4c, 0x7,0x23,0x4a, 0x4,0x50,0x4b, 0x7,0x2e,0x42, + 0x7,0x2e,0x46, 0x7,0x2e,0x48, 0xf,0x54,0x62, 0x5,0x54,0x61, + 0x7,0x2e,0x4b, 0x7,0x2e,0x47, 0x7,0x2e,0x49, 0x7,0x2e,0x41, + 0x7,0x2e,0x45, 0x7,0x2e,0x4c, 0x5,0x54,0x63, 0x7,0x2e,0x4a, + 0x4,0x50,0x4a, 0x5,0x54,0x64, 0x5,0x54,0x65, 0x5,0x54,0x66, + 0xf,0x54,0x63, 0x7,0x2e,0x44, 0x5,0x54,0x62, 0x7,0x23,0x51, + 0x5,0x54,0x67, 0x7,0x38,0x3e, 0x7,0x38,0x3d, 0x5,0x5b,0x5a, + 0x5,0x5b,0x5e, 0x5,0x5b,0x5d, 0x4,0x56,0x3c, 0x4,0x56,0x3d, + 0x5,0x5b,0x5b, 0xf,0x5a,0x37, 0xf,0x5a,0x38, 0x7,0x38,0x3f, + 0x5,0x5b,0x5c, 0x5,0x61,0x70, 0x7,0x3f,0x6c, 0x5,0x61,0x6f, + 0x4,0x5b,0x3b, 0x7,0x3f,0x6d, 0x7,0x3f,0x6e, 0x4,0x5b,0x39, + 0x7,0x3f,0x6b, 0x5,0x68,0x21, 0x5,0x67,0x7e, 0x5,0x67,0x7c, + 0x5,0x67,0x7d, 0xf,0x62,0x4a, 0x5,0x6c,0x34, 0x4,0x63,0x4d, + 0x5,0x6c,0x35, 0x7,0x4d,0x72, 0x4,0x63,0x4b, 0x7,0x4d,0x75, + 0x7,0x4d,0x74, 0x5,0x6c,0x36, 0x7,0x4d,0x76, 0x7,0x4d,0x77, + 0x4,0x66,0x44, 0x5,0x70,0x25, 0x5,0x70,0x26, 0x5,0x73,0x48, + 0xf,0x69,0x45, 0x7,0x5b,0x59, 0x5,0x75,0x6b, 0x4,0x6a,0x4a, + 0x7,0x5b,0x5a, 0x4,0x6c,0x6f, 0xf,0x6c,0x62, 0xf,0x22,0x53, + 0xf,0x24,0x46, 0x6,0x2b,0x6d, 0xf,0x2b,0x2d, 0xf,0x2b,0x2e, + 0xf,0x2b,0x2f, 0x6,0x38,0x2d, 0x6,0x38,0x2e, 0xf,0x2f,0x65, + 0x6,0x40,0x42, 0x6,0x40,0x44, 0xf,0x35,0x37, 0xf,0x35,0x38, + 0x6,0x40,0x43, 0xf,0x3b,0x4e, 0x5,0x3f,0x5d, 0xf,0x41,0x6c, + 0x6,0x53,0x32, 0xf,0x35,0x36, 0x5,0x4d,0x48, 0x7,0x23,0x54, + 0x7,0x23,0x53, 0x5,0x4d,0x49, 0xf,0x4f,0x33, 0xf,0x4f,0x34, + 0x5,0x4d,0x4a, 0x7,0x2e,0x4d, 0xf,0x5a,0x39, 0xf,0x5e,0x75, + 0xf,0x62,0x4b, 0xf,0x67,0x5a, 0x7,0x5b,0x5b, 0x6,0x22,0x22, + 0xf,0x27,0x34, 0x6,0x31,0x60, 0x4,0x2d,0x48, 0x5,0x2d,0x76, + 0x5,0x2d,0x75, 0x6,0x38,0x2f, 0x5,0x32,0x72, 0xf,0x35,0x39, + 0x6,0x40,0x46, 0x6,0x40,0x45, 0x6,0x49,0x5d, 0xf,0x40,0x32, + 0x6,0x49,0x5b, 0x6,0x49,0x5c, 0x4,0x3d,0x61, 0x6,0x5d,0x4c, + 0x5,0x3f,0x5e, 0xf,0x41,0x6d, 0x4,0x43,0x6a, 0x4,0x4a,0x2d, + 0x7,0x23,0x55, 0x7,0x38,0x40, 0x4,0x5f,0x6c, 0x6,0x22,0x23, + 0xf,0x24,0x47, 0x6,0x2b,0x6f, 0x6,0x2b,0x6e, 0x6,0x31,0x61, + 0xf,0x2f,0x66, 0x4,0x32,0x32, 0x6,0x40,0x48, 0x6,0x40,0x47, + 0x6,0x49,0x60, 0x6,0x49,0x64, 0x6,0x49,0x63, 0x5,0x39,0x23, + 0x6,0x49,0x66, 0x6,0x49,0x5f, 0x6,0x49,0x5e, 0x6,0x49,0x62, + 0x4,0x37,0x7c, 0x6,0x4c,0x3e, 0x6,0x49,0x65, 0x4,0x3d,0x62, + 0x6,0x53,0x36, 0x6,0x53,0x34, 0x6,0x53,0x37, 0x5,0x3f,0x5f, + 0x6,0x5d,0x4f, 0x6,0x5d,0x4e, 0x6,0x5d,0x50, 0x3,0x47,0x31, + 0x4,0x4a,0x2f, 0x6,0x5d,0x4d, 0x5,0x4d,0x4c, 0x5,0x4d,0x4d, + 0x7,0x2e,0x51, 0x7,0x2e,0x50, 0x7,0x2e,0x4f, 0x7,0x2e,0x52, + 0x7,0x2e,0x4e, 0x4,0x50,0x4d, 0x7,0x38,0x41, 0x7,0x38,0x42, + 0x7,0x3f,0x6f, 0x4,0x5b,0x3c, 0x7,0x3f,0x70, 0x7,0x3f,0x71, + 0x7,0x47,0x39, 0xf,0x62,0x4c, 0x7,0x4d,0x78, 0x7,0x57,0x7d, + 0x4,0x24,0x42, 0x6,0x27,0x7b, 0xf,0x27,0x35, 0xf,0x27,0x36, + 0x5,0x29,0x4d, 0x6,0x31,0x64, 0x6,0x31,0x63, 0xf,0x2b,0x30, + 0x6,0x31,0x62, 0x4,0x2d,0x4a, 0x5,0x2d,0x77, 0x6,0x38,0x31, + 0x6,0x38,0x33, 0x6,0x38,0x35, 0xf,0x2f,0x67, 0xf,0x2f,0x68, + 0xf,0x2f,0x69, 0xf,0x2f,0x6a, 0x6,0x38,0x32, 0x4,0x32,0x33, + 0x4,0x32,0x35, 0x6,0x40,0x4a, 0xf,0x35,0x3a, 0xf,0x35,0x3b, + 0x6,0x40,0x49, 0x6,0x49,0x69, 0x5,0x39,0x25, 0x5,0x39,0x24, + 0x6,0x49,0x68, 0x6,0x49,0x6a, 0x6,0x49,0x67, 0xf,0x3b,0x4f, + 0xf,0x3b,0x50, 0x6,0x53,0x38, 0x5,0x3f,0x60, 0x6,0x53,0x39, + 0xf,0x41,0x6e, 0xf,0x41,0x6f, 0x5,0x46,0x38, 0x5,0x46,0x3a, + 0x6,0x5d,0x52, 0x5,0x46,0x39, 0x7,0x23,0x56, 0xf,0x4f,0x35, + 0x7,0x2e,0x53, 0x5,0x54,0x68, 0x7,0x38,0x43, 0x5,0x5b,0x5f, + 0x7,0x3f,0x73, 0x5,0x61,0x71, 0x4,0x5b,0x3d, 0x7,0x3f,0x74, + 0x7,0x3f,0x72, 0x7,0x47,0x3a, 0x7,0x53,0x45, 0x4,0x68,0x6d, + 0x7,0x57,0x7e, 0x7,0x5e,0x6c, 0x7,0x60,0x70, 0x5,0x24,0x42, + 0x5,0x29,0x4e, 0x5,0x2d,0x79, 0x5,0x2d,0x78, 0x4,0x37,0x7d, + 0x6,0x49,0x6b, 0x6,0x53,0x3a, 0x6,0x53,0x3b, 0x4,0x3d,0x66, + 0xf,0x4f,0x36, 0x6,0x23,0x2c, 0x6,0x23,0x2b, 0x6,0x24,0x7b, + 0x5,0x22,0x73, 0x6,0x24,0x7a, 0x6,0x24,0x7c, 0xf,0x22,0x54, + 0xf,0x24,0x4b, 0x6,0x27,0x7c, 0x6,0x27,0x7d, 0x6,0x28,0x25, + 0x5,0x24,0x43, 0x6,0x28,0x22, 0x6,0x27,0x7e, 0x6,0x28,0x24, + 0x6,0x28,0x23, 0x6,0x28,0x21, 0xf,0x24,0x48, 0xf,0x24,0x4a, + 0xf,0x24,0x4c, 0x4,0x24,0x44, 0x5,0x26,0x48, 0x6,0x2b,0x74, + 0x6,0x2b,0x73, 0x5,0x26,0x49, 0x6,0x2b,0x7d, 0x5,0x26,0x44, + 0x6,0x2b,0x79, 0x5,0x26,0x47, 0x6,0x2b,0x7a, 0x6,0x2b,0x77, + 0x5,0x26,0x46, 0x5,0x26,0x45, 0x6,0x2b,0x75, 0x6,0x2b,0x78, + 0xf,0x27,0x37, 0xf,0x27,0x38, 0xf,0x27,0x39, 0xf,0x27,0x3a, + 0xf,0x27,0x3b, 0xf,0x27,0x3c, 0xf,0x27,0x3d, 0x6,0x2b,0x71, + 0x6,0x2b,0x7b, 0x6,0x2b,0x7c, 0x6,0x2b,0x72, 0x6,0x2b,0x76, + 0x5,0x29,0x51, 0x6,0x31,0x65, 0x6,0x31,0x66, 0x5,0x29,0x50, + 0x4,0x29,0x66, 0x6,0x31,0x68, 0x6,0x31,0x69, 0x4,0x29,0x68, + 0xf,0x2b,0x31, 0xf,0x2b,0x32, 0x6,0x31,0x6a, 0xf,0x2b,0x35, + 0xf,0x2b,0x36, 0x6,0x31,0x6e, 0x6,0x31,0x6c, 0x6,0x31,0x6b, + 0x5,0x2d,0x7e, 0x6,0x38,0x3a, 0x5,0x2e,0x21, 0x5,0x2e,0x22, + 0x5,0x2d,0x7b, 0x5,0x2e,0x23, 0x5,0x2d,0x7c, 0x5,0x2d,0x7a, + 0x6,0x38,0x3e, 0x6,0x38,0x38, 0x6,0x38,0x3c, 0x5,0x2d,0x7d, + 0x6,0x38,0x39, 0x6,0x38,0x3d, 0xf,0x2f,0x6b, 0xf,0x2f,0x6d, + 0x6,0x38,0x3b, 0xf,0x2f,0x6c, 0x6,0x38,0x41, 0x6,0x38,0x3f, + 0x5,0x32,0x73, 0x4,0x32,0x38, 0x4,0x38,0x21, 0x6,0x40,0x53, + 0x4,0x32,0x3d, 0x6,0x40,0x4e, 0x6,0x40,0x4b, 0x6,0x40,0x4c, + 0x6,0x40,0x50, 0x6,0x40,0x4d, 0x6,0x40,0x55, 0x5,0x32,0x75, + 0x6,0x38,0x40, 0x6,0x40,0x54, 0x6,0x40,0x56, 0xf,0x35,0x3c, + 0xf,0x35,0x3d, 0xf,0x35,0x3e, 0xf,0x35,0x3f, 0xf,0x35,0x40, + 0xf,0x35,0x41, 0xf,0x35,0x42, 0xf,0x35,0x43, 0xf,0x35,0x44, + 0xf,0x35,0x45, 0xf,0x35,0x46, 0xf,0x35,0x47, 0x6,0x40,0x52, + 0x5,0x32,0x74, 0x6,0x49,0x71, 0x6,0x49,0x74, 0x4,0x32,0x3c, + 0x5,0x3f,0x61, 0x5,0x39,0x2a, 0x6,0x49,0x6f, 0x5,0x39,0x27, + 0x6,0x49,0x70, 0x5,0x39,0x29, 0x5,0x39,0x26, 0x6,0x49,0x6c, + 0x6,0x49,0x6d, 0x4,0x38,0x23, 0x6,0x49,0x76, 0x5,0x39,0x2b, + 0x4,0x38,0x27, 0x6,0x49,0x6e, 0x6,0x49,0x75, 0x6,0x49,0x77, + 0xf,0x3b,0x51, 0xf,0x3b,0x53, 0xf,0x3b,0x54, 0xf,0x3b,0x56, + 0xf,0x3b,0x57, 0xf,0x3b,0x59, 0xf,0x3b,0x5a, 0xf,0x3b,0x5c, + 0xf,0x3b,0x5d, 0xf,0x3b,0x52, 0xf,0x3b,0x58, 0x4,0x38,0x26, + 0x4,0x38,0x28, 0x6,0x49,0x72, 0x5,0x39,0x2c, 0x5,0x39,0x28, + 0x6,0x53,0x43, 0x5,0x3f,0x63, 0x6,0x53,0x41, 0x6,0x5d,0x53, + 0x6,0x53,0x42, 0x6,0x53,0x3f, 0x6,0x53,0x44, 0xf,0x46,0x39, + 0xf,0x3b,0x5b, 0x6,0x53,0x3e, 0xf,0x41,0x70, 0xf,0x41,0x71, + 0xf,0x41,0x73, 0xf,0x41,0x74, 0xf,0x41,0x75, 0xf,0x41,0x76, + 0xf,0x41,0x77, 0xf,0x41,0x78, 0xf,0x41,0x79, 0xf,0x41,0x7a, + 0xf,0x41,0x7b, 0xf,0x41,0x7d, 0x5,0x3d,0x55, 0x6,0x53,0x45, + 0x6,0x53,0x40, 0x5,0x3f,0x64, 0x5,0x46,0x3b, 0x5,0x46,0x3f, + 0x5,0x46,0x3d, 0x5,0x46,0x3e, 0x6,0x5d,0x56, 0x5,0x46,0x40, + 0x5,0x46,0x43, 0x5,0x46,0x44, 0x4,0x43,0x6c, 0x5,0x46,0x42, + 0x5,0x4d,0x4e, 0xf,0x48,0x4a, 0xf,0x48,0x4b, 0xf,0x48,0x4c, + 0xf,0x48,0x4d, 0xf,0x48,0x4e, 0xf,0x48,0x4f, 0x6,0x5d,0x54, + 0x5,0x46,0x3c, 0x6,0x5d,0x57, 0x6,0x5d,0x59, 0x6,0x5d,0x5a, + 0x6,0x5d,0x55, 0x6,0x5d,0x58, 0x7,0x23,0x61, 0x7,0x23,0x5c, + 0x7,0x23,0x5b, 0x7,0x23,0x5e, 0x5,0x4d,0x52, 0x5,0x4d,0x55, + 0x7,0x23,0x5a, 0x7,0x23,0x57, 0x7,0x23,0x58, 0x7,0x23,0x62, + 0xf,0x4f,0x37, 0xf,0x4f,0x39, 0xf,0x4f,0x3a, 0x5,0x4d,0x54, + 0x7,0x23,0x60, 0xf,0x4e,0x30, 0x7,0x23,0x5d, 0x7,0x23,0x5f, + 0x7,0x23,0x59, 0x5,0x4d,0x51, 0x5,0x54,0x69, 0x5,0x54,0x6b, + 0x7,0x2e,0x57, 0x4,0x50,0x55, 0x7,0x2e,0x55, 0x7,0x2e,0x5b, + 0x7,0x2e,0x59, 0x7,0x2e,0x5d, 0x4,0x50,0x54, 0x7,0x2e,0x5c, + 0x7,0x2e,0x54, 0xf,0x54,0x65, 0xf,0x54,0x66, 0xf,0x54,0x67, + 0xf,0x54,0x69, 0xf,0x54,0x6a, 0x7,0x2e,0x58, 0x5,0x4d,0x4f, + 0x7,0x2d,0x62, 0xf,0x54,0x68, 0x7,0x2e,0x43, 0x5,0x54,0x6a, + 0x7,0x2e,0x56, 0xf,0x4f,0x38, 0x7,0x38,0x47, 0x5,0x5b,0x60, + 0x5,0x5b,0x61, 0x7,0x38,0x48, 0x5,0x5b,0x62, 0x7,0x38,0x45, + 0x7,0x38,0x46, 0x7,0x38,0x49, 0xf,0x5a,0x3a, 0xf,0x5a,0x3b, + 0xf,0x5a,0x3c, 0x7,0x38,0x44, 0xf,0x5a,0x3d, 0x4,0x5b,0x3e, + 0x5,0x61,0x72, 0x5,0x61,0x73, 0x7,0x3f,0x75, 0xf,0x5e,0x76, + 0xf,0x5e,0x77, 0xf,0x5e,0x78, 0xf,0x5e,0x79, 0xf,0x5e,0x7b, + 0x7,0x3f,0x78, 0x5,0x68,0x23, 0x7,0x47,0x3d, 0x7,0x47,0x3c, + 0x5,0x68,0x22, 0x5,0x68,0x24, 0x7,0x47,0x3b, 0x7,0x47,0x3e, + 0xf,0x62,0x4d, 0x5,0x6c,0x37, 0xf,0x65,0x31, 0xf,0x65,0x32, + 0x5,0x6b,0x6e, 0x7,0x4d,0x79, 0x7,0x53,0x46, 0x7,0x58,0x21, + 0xf,0x69,0x46, 0x5,0x73,0x39, 0x5,0x73,0x49, 0x7,0x5b,0x5c, + 0x5,0x77,0x5e, 0x7,0x5e,0x6d, 0xf,0x6b,0x4d, 0x5,0x79,0x2b, + 0x7,0x64,0x47, 0xf,0x24,0x4d, 0x6,0x2b,0x7e, 0xf,0x27,0x3f, + 0xf,0x27,0x40, 0x6,0x2c,0x21, 0x5,0x29,0x53, 0x5,0x29,0x52, + 0x6,0x31,0x70, 0xf,0x2b,0x37, 0xf,0x2b,0x39, 0x6,0x31,0x6f, + 0x6,0x38,0x42, 0xf,0x2f,0x6f, 0xf,0x2f,0x70, 0xf,0x2f,0x71, + 0xf,0x2f,0x72, 0xf,0x2f,0x73, 0xf,0x35,0x49, 0xf,0x35,0x4a, + 0xf,0x3b,0x5f, 0x6,0x49,0x7a, 0x6,0x49,0x79, 0x5,0x3f,0x65, + 0x4,0x43,0x70, 0x6,0x53,0x46, 0x5,0x4d,0x57, 0x5,0x4d,0x56, + 0x7,0x23,0x63, 0xf,0x54,0x6b, 0x5,0x5b,0x63, 0x7,0x3f,0x7a, + 0x5,0x61,0x74, 0x7,0x3f,0x79, 0x7,0x3f,0x77, 0x4,0x5f,0x6d, + 0x7,0x4d,0x7a, 0x7,0x4d,0x7b, 0x5,0x7b,0x3f, 0x7,0x66,0x3e, + 0x6,0x23,0x2d, 0x6,0x24,0x7d, 0x5,0x24,0x44, 0x6,0x28,0x29, + 0x6,0x28,0x27, 0x6,0x28,0x28, 0x6,0x28,0x26, 0x6,0x2c,0x22, + 0x5,0x29,0x54, 0x4,0x29,0x69, 0x4,0x29,0x6a, 0xf,0x2b,0x3a, + 0x6,0x31,0x71, 0x6,0x38,0x43, 0xf,0x35,0x4b, 0x5,0x32,0x76, + 0x6,0x40,0x59, 0x6,0x40,0x5b, 0x6,0x49,0x7d, 0x6,0x49,0x7c, + 0x6,0x40,0x5a, 0x5,0x39,0x2d, 0xf,0x39,0x46, 0xf,0x3b,0x61, + 0xf,0x3b,0x62, 0x6,0x53,0x47, 0x5,0x3f,0x67, 0xf,0x3b,0x60, + 0xf,0x41,0x7e, 0xf,0x42,0x21, 0x6,0x53,0x48, 0x6,0x5d,0x5d, + 0x6,0x5d,0x5e, 0x7,0x23,0x64, 0x4,0x4a,0x34, 0x5,0x4d,0x59, + 0x4,0x4a,0x33, 0xf,0x4f,0x3b, 0xf,0x4f,0x3c, 0x5,0x54,0x6e, + 0x5,0x54,0x6c, 0x5,0x5b,0x64, 0x5,0x54,0x6d, 0xf,0x54,0x6d, + 0xf,0x54,0x6e, 0x7,0x38,0x4b, 0x7,0x38,0x4a, 0xf,0x5a,0x3e, + 0x5,0x61,0x75, 0xf,0x5e,0x7c, 0x7,0x3f,0x7b, 0x5,0x6c,0x38, + 0x5,0x75,0x6f, 0x5,0x77,0x5f, 0x5,0x21,0x48, 0x4,0x21,0x4e, + 0x4,0x21,0x7d, 0xf,0x21,0x65, 0x5,0x22,0x75, 0x6,0x25,0x22, + 0x5,0x22,0x74, 0x6,0x24,0x7e, 0x6,0x25,0x21, 0xf,0x22,0x56, + 0x4,0x22,0x7b, 0x4,0x22,0x7a, 0x6,0x28,0x2c, 0x4,0x24,0x49, + 0x6,0x28,0x2a, 0x6,0x28,0x2b, 0xf,0x24,0x4e, 0xf,0x24,0x4f, + 0xf,0x24,0x54, 0xf,0x24,0x50, 0xf,0x24,0x52, 0x5,0x24,0x46, + 0x6,0x28,0x2d, 0x5,0x24,0x45, 0x4,0x24,0x45, 0x4,0x26,0x6b, + 0x5,0x26,0x4c, 0x4,0x26,0x66, 0x5,0x26,0x4b, 0x6,0x2c,0x2b, + 0x5,0x26,0x50, 0x5,0x26,0x52, 0x6,0x2c,0x28, 0x6,0x2c,0x27, + 0x6,0x2c,0x26, 0x5,0x26,0x4d, 0x5,0x26,0x53, 0x5,0x26,0x4f, + 0x5,0x26,0x4e, 0xf,0x27,0x43, 0xf,0x27,0x45, 0xf,0x27,0x46, + 0xf,0x27,0x47, 0xf,0x27,0x49, 0xf,0x27,0x4a, 0xf,0x27,0x4b, + 0xf,0x27,0x4d, 0xf,0x27,0x4f, 0xf,0x27,0x51, 0xf,0x27,0x54, + 0xf,0x27,0x55, 0x6,0x2c,0x24, 0x6,0x2c,0x29, 0x5,0x26,0x54, + 0x6,0x2c,0x2c, 0xf,0x27,0x44, 0x6,0x2c,0x2d, 0x6,0x2c,0x2a, + 0xf,0x27,0x48, 0xf,0x27,0x42, 0x6,0x2c,0x25, 0x5,0x26,0x55, + 0x6,0x2d,0x5c, 0x6,0x31,0x74, 0x6,0x31,0x73, 0x4,0x29,0x6b, + 0x5,0x29,0x56, 0x6,0x31,0x75, 0x6,0x31,0x76, 0x5,0x29,0x55, + 0x5,0x29,0x59, 0x6,0x31,0x77, 0x5,0x2e,0x26, 0x5,0x29,0x5a, + 0x5,0x29,0x58, 0xf,0x27,0x53, 0xf,0x2b,0x3b, 0xf,0x2b,0x3c, + 0xf,0x2b,0x3d, 0xf,0x2b,0x3f, 0xf,0x2b,0x40, 0xf,0x2b,0x41, + 0xf,0x2b,0x42, 0xf,0x2b,0x43, 0xf,0x2b,0x44, 0xf,0x2b,0x45, + 0xf,0x2b,0x46, 0xf,0x2b,0x47, 0xf,0x2b,0x49, 0xf,0x2b,0x4a, + 0xf,0x2b,0x4b, 0xf,0x2b,0x4c, 0xf,0x2b,0x4d, 0xf,0x2b,0x4e, + 0xf,0x2b,0x4f, 0x5,0x29,0x5b, 0x6,0x40,0x5c, 0x6,0x38,0x4f, + 0x6,0x38,0x53, 0x6,0x38,0x4b, 0x6,0x38,0x4d, 0x6,0x38,0x46, + 0x5,0x2e,0x27, 0x6,0x38,0x48, 0x6,0x38,0x45, 0x6,0x38,0x51, + 0x4,0x2d,0x50, 0x6,0x40,0x5d, 0x5,0x29,0x57, 0x5,0x2e,0x29, + 0x5,0x2e,0x2a, 0x6,0x38,0x44, 0xf,0x2f,0x74, 0xf,0x2f,0x75, + 0xf,0x2f,0x76, 0xf,0x2f,0x78, 0xf,0x2f,0x79, 0xf,0x2f,0x7a, + 0xf,0x2f,0x7b, 0xf,0x2f,0x7c, 0xf,0x2f,0x7d, 0xf,0x2f,0x7e, + 0xf,0x30,0x21, 0xf,0x30,0x22, 0xf,0x30,0x23, 0xf,0x30,0x25, + 0xf,0x30,0x26, 0xf,0x30,0x27, 0xf,0x30,0x29, 0xf,0x30,0x2a, + 0xf,0x30,0x2b, 0xf,0x30,0x2c, 0xf,0x30,0x2e, 0x6,0x38,0x4c, + 0x6,0x38,0x47, 0x6,0x38,0x49, 0x4,0x2d,0x53, 0x6,0x38,0x4e, + 0xf,0x30,0x30, 0xf,0x30,0x28, 0x4,0x2d,0x5a, 0xf,0x30,0x2d, + 0x5,0x2e,0x2c, 0x5,0x2e,0x28, 0xf,0x2f,0x77, 0x6,0x38,0x52, + 0x6,0x40,0x68, 0x6,0x40,0x69, 0x6,0x40,0x5f, 0x5,0x32,0x77, + 0x5,0x33,0x21, 0x5,0x39,0x36, 0x4,0x32,0x45, 0x4,0x32,0x40, + 0x5,0x32,0x7d, 0x6,0x40,0x67, 0x6,0x4a,0x2e, 0x6,0x40,0x63, + 0xf,0x35,0x4c, 0xf,0x35,0x4d, 0xf,0x35,0x4f, 0xf,0x35,0x50, + 0xf,0x35,0x51, 0xf,0x35,0x52, 0xf,0x35,0x53, 0xf,0x35,0x54, + 0xf,0x35,0x55, 0xf,0x35,0x56, 0xf,0x35,0x58, 0xf,0x35,0x59, + 0xf,0x35,0x5a, 0xf,0x35,0x5b, 0xf,0x35,0x5c, 0xf,0x35,0x5d, + 0xf,0x35,0x5e, 0xf,0x35,0x5f, 0xf,0x35,0x60, 0xf,0x35,0x61, + 0xf,0x35,0x62, 0xf,0x35,0x63, 0xf,0x35,0x65, 0xf,0x35,0x66, + 0x6,0x40,0x64, 0x6,0x40,0x66, 0x6,0x40,0x65, 0x4,0x32,0x47, + 0x6,0x40,0x62, 0x6,0x40,0x60, 0x6,0x40,0x61, 0x4,0x32,0x44, + 0x5,0x33,0x22, 0x5,0x32,0x78, 0x5,0x32,0x7b, 0x5,0x32,0x7a, + 0x5,0x32,0x7c, 0x6,0x40,0x6a, 0xf,0x35,0x4e, 0x6,0x40,0x5e, + 0x4,0x38,0x36, 0x6,0x4a,0x34, 0x5,0x39,0x35, 0x6,0x53,0x49, + 0x4,0x38,0x2e, 0x5,0x39,0x38, 0x6,0x4a,0x22, 0x5,0x39,0x32, + 0x4,0x38,0x2b, 0x5,0x39,0x30, 0x5,0x39,0x34, 0x4,0x38,0x31, + 0x6,0x4a,0x2d, 0x6,0x4a,0x2f, 0x5,0x39,0x3a, 0x6,0x4a,0x24, + 0x6,0x4a,0x21, 0x5,0x39,0x37, 0x6,0x4a,0x33, 0x5,0x39,0x3c, + 0x5,0x39,0x3b, 0x6,0x4a,0x26, 0x4,0x38,0x30, 0x6,0x4a,0x27, + 0x6,0x4a,0x2a, 0x6,0x4a,0x31, 0x5,0x39,0x40, 0x6,0x53,0x4a, + 0x5,0x39,0x3d, 0x6,0x4a,0x38, 0x6,0x4a,0x23, 0x6,0x4a,0x25, + 0x6,0x4a,0x35, 0x4,0x38,0x33, 0x4,0x38,0x38, 0x6,0x4a,0x36, + 0x6,0x4a,0x37, 0xf,0x3b,0x64, 0xf,0x3b,0x65, 0xf,0x3b,0x67, + 0xf,0x3b,0x68, 0xf,0x3b,0x69, 0xf,0x3b,0x6b, 0xf,0x3b,0x6c, + 0xf,0x3b,0x6d, 0xf,0x3b,0x6f, 0xf,0x3b,0x71, 0xf,0x3b,0x72, + 0xf,0x3b,0x74, 0xf,0x3b,0x75, 0xf,0x3b,0x76, 0xf,0x3b,0x77, + 0xf,0x3b,0x78, 0xf,0x3b,0x79, 0xf,0x3b,0x7a, 0xf,0x3b,0x7b, + 0xf,0x3b,0x7c, 0xf,0x3b,0x7d, 0xf,0x3b,0x7e, 0xf,0x3c,0x22, + 0xf,0x3c,0x23, 0xf,0x3c,0x24, 0xf,0x3c,0x25, 0xf,0x3c,0x26, + 0xf,0x3c,0x27, 0xf,0x3c,0x28, 0xf,0x3c,0x2a, 0xf,0x3c,0x2b, + 0xf,0x3c,0x2c, 0xf,0x3c,0x2d, 0xf,0x3c,0x2e, 0xf,0x3c,0x2f, + 0x6,0x4a,0x29, 0x6,0x4a,0x2b, 0x6,0x4a,0x2c, 0x6,0x4a,0x32, + 0x5,0x39,0x42, 0x6,0x4a,0x30, 0x6,0x4a,0x39, 0x6,0x4a,0x28, + 0x5,0x39,0x3e, 0x5,0x39,0x41, 0x5,0x39,0x2e, 0x5,0x39,0x2f, + 0x5,0x39,0x31, 0x6,0x53,0x4e, 0x6,0x53,0x58, 0x4,0x3d,0x77, + 0x6,0x53,0x56, 0x4,0x3d,0x74, 0x6,0x53,0x57, 0x5,0x3f,0x6f, + 0x5,0x3f,0x6a, 0x5,0x3f,0x6e, 0x5,0x3f,0x6b, 0x4,0x3d,0x6a, + 0x6,0x53,0x5b, 0x5,0x3f,0x73, 0x6,0x53,0x61, 0x5,0x3f,0x68, + 0x4,0x3d,0x7a, 0x5,0x3f,0x74, 0x5,0x3f,0x69, 0x6,0x53,0x55, + 0x5,0x3f,0x70, 0x5,0x3f,0x6d, 0x6,0x53,0x60, 0x4,0x3d,0x73, + 0x6,0x53,0x59, 0x6,0x53,0x5a, 0x6,0x53,0x5d, 0x6,0x53,0x50, + 0x4,0x3d,0x70, 0x6,0x53,0x5c, 0x5,0x3f,0x6c, 0x6,0x53,0x63, + 0x6,0x53,0x4f, 0x6,0x53,0x51, 0x6,0x53,0x4c, 0xf,0x42,0x23, + 0xf,0x42,0x24, 0xf,0x42,0x25, 0xf,0x42,0x26, 0xf,0x42,0x27, + 0xf,0x42,0x29, 0xf,0x42,0x2a, 0xf,0x42,0x2b, 0xf,0x42,0x2c, + 0xf,0x42,0x2d, 0xf,0x42,0x2e, 0xf,0x42,0x30, 0xf,0x42,0x31, + 0xf,0x42,0x32, 0xf,0x42,0x33, 0xf,0x42,0x34, 0xf,0x42,0x35, + 0xf,0x42,0x36, 0xf,0x42,0x38, 0xf,0x42,0x39, 0xf,0x42,0x3a, + 0xf,0x42,0x3b, 0xf,0x42,0x3d, 0xf,0x42,0x3e, 0xf,0x42,0x3f, + 0xf,0x42,0x40, 0xf,0x42,0x41, 0xf,0x42,0x42, 0xf,0x42,0x43, + 0xf,0x42,0x44, 0xf,0x42,0x45, 0xf,0x42,0x46, 0xf,0x42,0x48, + 0xf,0x42,0x4a, 0xf,0x42,0x4c, 0x6,0x53,0x4d, 0x6,0x53,0x52, + 0x6,0x53,0x54, 0x4,0x3d,0x79, 0x6,0x53,0x62, 0x6,0x53,0x4b, + 0x6,0x53,0x5f, 0xf,0x42,0x22, 0xf,0x42,0x2f, 0xf,0x42,0x37, + 0x5,0x39,0x3f, 0x5,0x3f,0x72, 0x6,0x53,0x53, 0xf,0x43,0x74, + 0x5,0x46,0x4e, 0xf,0x42,0x4b, 0x5,0x46,0x50, 0x4,0x43,0x7b, + 0x4,0x43,0x72, 0x5,0x46,0x4d, 0x5,0x46,0x4f, 0x6,0x5d,0x69, + 0x5,0x46,0x55, 0x5,0x46,0x52, 0x7,0x23,0x65, 0x6,0x53,0x64, + 0x5,0x46,0x47, 0x6,0x5d,0x5f, 0x5,0x46,0x54, 0x5,0x46,0x46, + 0x5,0x46,0x58, 0x6,0x5d,0x62, 0x5,0x46,0x4a, 0x5,0x46,0x53, + 0x6,0x5d,0x63, 0x4,0x43,0x76, 0x5,0x46,0x48, 0x5,0x46,0x49, + 0x6,0x5d,0x65, 0x5,0x46,0x4c, 0x5,0x46,0x51, 0xf,0x48,0x57, + 0xf,0x48,0x58, 0xf,0x48,0x59, 0xf,0x48,0x5a, 0xf,0x48,0x5b, + 0xf,0x48,0x5c, 0xf,0x48,0x5d, 0xf,0x48,0x5e, 0xf,0x48,0x5f, + 0xf,0x48,0x60, 0xf,0x48,0x61, 0xf,0x48,0x62, 0xf,0x48,0x63, + 0xf,0x48,0x64, 0xf,0x48,0x65, 0xf,0x48,0x66, 0xf,0x48,0x67, + 0xf,0x48,0x68, 0xf,0x48,0x69, 0xf,0x48,0x6a, 0xf,0x48,0x6b, + 0xf,0x48,0x6c, 0xf,0x48,0x6d, 0xf,0x48,0x6e, 0xf,0x48,0x6f, + 0xf,0x48,0x71, 0xf,0x48,0x72, 0xf,0x48,0x73, 0xf,0x48,0x75, + 0x3,0x47,0x4b, 0x6,0x5d,0x6a, 0x6,0x5d,0x67, 0x6,0x5d,0x6b, + 0x6,0x5d,0x6c, 0x5,0x46,0x56, 0x5,0x46,0x57, 0xf,0x48,0x74, + 0x6,0x5d,0x64, 0x6,0x5d,0x66, 0xf,0x48,0x50, 0xf,0x48,0x51, + 0xf,0x48,0x53, 0xf,0x48,0x54, 0x6,0x5d,0x60, 0x6,0x5d,0x6d, + 0x6,0x5d,0x61, 0xf,0x48,0x56, 0x7,0x23,0x68, 0x5,0x4d,0x67, + 0x5,0x4d,0x5e, 0x4,0x4a,0x3b, 0x4,0x4a,0x47, 0x5,0x4d,0x5b, + 0x4,0x4a,0x40, 0x7,0x23,0x71, 0x7,0x23,0x6c, 0x7,0x23,0x74, + 0x5,0x4d,0x6b, 0x5,0x4d,0x65, 0x7,0x23,0x70, 0x4,0x4a,0x46, + 0x5,0x4d,0x5f, 0x4,0x4a,0x3f, 0x5,0x4d,0x64, 0x4,0x4a,0x43, + 0x4,0x4a,0x3e, 0x4,0x4a,0x35, 0x7,0x23,0x73, 0x5,0x4d,0x5c, + 0x4,0x4a,0x4a, 0x5,0x4d,0x69, 0x7,0x23,0x6e, 0x5,0x4d,0x63, + 0x5,0x4d,0x6a, 0x7,0x23,0x69, 0x4,0x4a,0x41, 0x5,0x4d,0x5d, + 0x7,0x23,0x75, 0x4,0x4a,0x3c, 0x4,0x4a,0x45, 0x4,0x4a,0x49, + 0x7,0x23,0x66, 0x7,0x23,0x6a, 0xf,0x4f,0x3d, 0xf,0x4f,0x3e, + 0xf,0x4f,0x3f, 0xf,0x4f,0x43, 0xf,0x4f,0x44, 0xf,0x4f,0x46, + 0xf,0x4f,0x47, 0xf,0x4f,0x48, 0xf,0x4f,0x49, 0xf,0x4f,0x4a, + 0xf,0x4f,0x4b, 0xf,0x4f,0x4c, 0xf,0x4f,0x4d, 0xf,0x4f,0x4e, + 0xf,0x4f,0x4f, 0xf,0x4f,0x50, 0xf,0x4f,0x51, 0xf,0x4f,0x52, + 0xf,0x4f,0x53, 0xf,0x4f,0x40, 0x7,0x23,0x6b, 0x5,0x4d,0x6c, + 0x5,0x4d,0x68, 0x5,0x4d,0x66, 0x7,0x23,0x67, 0x7,0x23,0x6d, + 0x5,0x4d,0x60, 0x5,0x4d,0x5a, 0x5,0x4d,0x62, 0x4,0x50,0x5b, + 0x5,0x54,0x7d, 0x7,0x2e,0x69, 0x4,0x50,0x65, 0x4,0x50,0x58, + 0x5,0x5b,0x65, 0x7,0x38,0x4c, 0x7,0x2e,0x60, 0x7,0x2e,0x63, + 0x5,0x54,0x7b, 0x7,0x2e,0x68, 0x7,0x2e,0x72, 0x5,0x54,0x7a, + 0x7,0x2e,0x6f, 0x7,0x2e,0x62, 0x4,0x50,0x62, 0x4,0x56,0x4c, + 0x4,0x50,0x57, 0x7,0x2e,0x5f, 0x4,0x50,0x5f, 0x5,0x54,0x79, + 0x7,0x2e,0x67, 0x7,0x2e,0x64, 0x5,0x54,0x71, 0x5,0x54,0x77, + 0x4,0x50,0x5c, 0x7,0x2e,0x6e, 0x7,0x2e,0x74, 0x5,0x54,0x78, + 0x4,0x50,0x5d, 0x7,0x2e,0x66, 0x7,0x2e,0x6b, 0x4,0x50,0x63, + 0x5,0x54,0x70, 0x7,0x2e,0x61, 0x5,0x61,0x7b, 0x5,0x54,0x75, + 0x5,0x54,0x76, 0x5,0x54,0x72, 0x4,0x4a,0x44, 0x7,0x2e,0x73, + 0x7,0x2e,0x6c, 0x7,0x2e,0x65, 0x7,0x2e,0x5e, 0x5,0x54,0x7c, + 0x5,0x54,0x6f, 0x5,0x54,0x73, 0xf,0x54,0x6f, 0xf,0x54,0x70, + 0xf,0x54,0x71, 0xf,0x54,0x72, 0xf,0x54,0x73, 0xf,0x54,0x75, + 0xf,0x54,0x76, 0xf,0x54,0x77, 0xf,0x54,0x78, 0xf,0x54,0x79, + 0xf,0x54,0x7a, 0xf,0x54,0x7c, 0xf,0x54,0x7d, 0xf,0x54,0x7e, + 0xf,0x55,0x21, 0xf,0x55,0x22, 0xf,0x55,0x24, 0xf,0x55,0x25, + 0xf,0x55,0x26, 0xf,0x55,0x27, 0xf,0x55,0x28, 0xf,0x55,0x2b, + 0xf,0x55,0x2c, 0xf,0x55,0x2d, 0xf,0x55,0x2e, 0xf,0x55,0x2f, + 0xf,0x55,0x30, 0xf,0x55,0x32, 0xf,0x55,0x33, 0xf,0x55,0x34, + 0xf,0x55,0x35, 0xf,0x55,0x36, 0xf,0x55,0x37, 0xf,0x55,0x38, + 0x7,0x2e,0x70, 0x7,0x2e,0x71, 0x4,0x50,0x61, 0xf,0x55,0x23, + 0x5,0x54,0x74, 0xf,0x48,0x70, 0xf,0x4f,0x41, 0x7,0x2e,0x6d, + 0x4,0x56,0x43, 0x7,0x38,0x50, 0x7,0x38,0x4e, 0x4,0x56,0x47, + 0x7,0x38,0x52, 0x7,0x38,0x56, 0x5,0x5b,0x6a, 0x5,0x5b,0x6b, + 0x4,0x56,0x4a, 0x4,0x56,0x46, 0x5,0x5b,0x6e, 0x7,0x38,0x53, + 0x5,0x5b,0x6c, 0x7,0x38,0x51, 0x7,0x38,0x57, 0x5,0x61,0x7c, + 0x5,0x5b,0x67, 0x4,0x56,0x4d, 0x4,0x56,0x44, 0x7,0x38,0x59, + 0x4,0x56,0x42, 0x5,0x5b,0x69, 0x7,0x38,0x5b, 0x5,0x5b,0x66, + 0x7,0x38,0x54, 0xf,0x5a,0x40, 0xf,0x5a,0x41, 0xf,0x5a,0x43, + 0xf,0x5a,0x44, 0xf,0x5a,0x45, 0xf,0x5a,0x46, 0xf,0x5a,0x47, + 0xf,0x5a,0x48, 0xf,0x5a,0x49, 0xf,0x5a,0x4a, 0xf,0x5a,0x4b, + 0xf,0x5a,0x4c, 0xf,0x5a,0x4e, 0xf,0x5a,0x4f, 0xf,0x5a,0x51, + 0xf,0x5a,0x52, 0xf,0x5a,0x54, 0x7,0x38,0x58, 0x5,0x5b,0x6d, + 0x7,0x38,0x5a, 0x7,0x38,0x4d, 0x7,0x38,0x4f, 0x7,0x37,0x27, + 0xf,0x5a,0x53, 0xf,0x5a,0x4d, 0x5,0x5b,0x6f, 0x5,0x5b,0x70, + 0xf,0x55,0x31, 0xf,0x5a,0x50, 0x4,0x5b,0x47, 0x5,0x61,0x78, + 0x7,0x40,0x27, 0x7,0x40,0x23, 0x4,0x5b,0x42, 0x7,0x40,0x2b, + 0x5,0x62,0x24, 0x5,0x61,0x7d, 0x5,0x62,0x26, 0x7,0x40,0x29, + 0x4,0x5b,0x45, 0x5,0x61,0x7a, 0x5,0x62,0x22, 0x5,0x62,0x27, + 0x5,0x61,0x7e, 0x7,0x38,0x5c, 0x5,0x62,0x2b, 0x5,0x61,0x79, + 0x4,0x5b,0x43, 0x4,0x5b,0x4c, 0x4,0x5b,0x46, 0x7,0x40,0x2d, + 0x7,0x40,0x28, 0x5,0x62,0x23, 0x7,0x47,0x46, 0x5,0x62,0x29, + 0x7,0x40,0x26, 0x4,0x5b,0x4b, 0x5,0x62,0x28, 0x5,0x62,0x25, + 0x5,0x61,0x76, 0x7,0x3f,0x7c, 0x7,0x3f,0x7d, 0xf,0x5e,0x7e, + 0xf,0x5f,0x22, 0xf,0x5f,0x23, 0xf,0x5f,0x24, 0xf,0x5f,0x25, + 0xf,0x5f,0x26, 0xf,0x5f,0x27, 0xf,0x5f,0x28, 0xf,0x5f,0x2a, + 0xf,0x5f,0x2b, 0xf,0x5f,0x2c, 0xf,0x5f,0x2e, 0xf,0x5f,0x2f, + 0xf,0x5f,0x30, 0x7,0x40,0x21, 0x7,0x40,0x25, 0x7,0x40,0x2c, + 0x7,0x40,0x2a, 0x5,0x62,0x21, 0xf,0x5f,0x21, 0x5,0x62,0x2a, + 0x5,0x61,0x77, 0x7,0x40,0x22, 0x7,0x40,0x24, 0xf,0x5f,0x2d, + 0x5,0x68,0x25, 0x7,0x47,0x43, 0x5,0x68,0x28, 0x5,0x68,0x2b, + 0x5,0x68,0x29, 0x7,0x47,0x42, 0x7,0x47,0x40, 0x5,0x68,0x2d, + 0x7,0x47,0x41, 0x4,0x5f,0x74, 0x7,0x47,0x48, 0x7,0x47,0x49, + 0x5,0x68,0x27, 0x5,0x68,0x26, 0x7,0x47,0x45, 0x5,0x68,0x2f, + 0x7,0x47,0x47, 0x7,0x3f,0x7e, 0xf,0x62,0x52, 0xf,0x62,0x56, + 0xf,0x62,0x58, 0xf,0x62,0x59, 0xf,0x62,0x5a, 0xf,0x62,0x5b, + 0xf,0x62,0x5c, 0xf,0x62,0x5d, 0xf,0x62,0x5f, 0xf,0x62,0x60, + 0xf,0x62,0x61, 0x5,0x68,0x2e, 0x7,0x47,0x44, 0x7,0x47,0x3f, + 0xf,0x62,0x54, 0x5,0x68,0x2c, 0xf,0x62,0x57, 0xf,0x62,0x4f, + 0xf,0x62,0x5e, 0xf,0x5e,0x7d, 0x4,0x63,0x53, 0x7,0x4d,0x7c, + 0x5,0x6c,0x3f, 0x7,0x4d,0x7e, 0x5,0x6c,0x42, 0x5,0x68,0x30, + 0x5,0x6c,0x3a, 0x5,0x6c,0x39, 0x5,0x6c,0x3d, 0x7,0x4d,0x7d, + 0x5,0x6c,0x3c, 0x5,0x6c,0x41, 0x5,0x6c,0x3b, 0x5,0x68,0x2a, + 0x5,0x6c,0x40, 0x5,0x6c,0x3e, 0xf,0x65,0x33, 0xf,0x65,0x34, + 0xf,0x65,0x35, 0xf,0x65,0x36, 0xf,0x65,0x37, 0xf,0x65,0x39, + 0xf,0x65,0x3a, 0xf,0x65,0x3b, 0xf,0x65,0x3c, 0xf,0x65,0x3d, + 0xf,0x65,0x3f, 0x7,0x4e,0x21, 0x4,0x63,0x52, 0x7,0x53,0x49, + 0x7,0x53,0x48, 0x5,0x70,0x2b, 0x5,0x70,0x2d, 0x4,0x66,0x46, + 0x5,0x70,0x29, 0x7,0x53,0x4d, 0x5,0x70,0x28, 0x5,0x70,0x2a, + 0x5,0x70,0x2c, 0x7,0x53,0x4a, 0x4,0x66,0x45, 0x5,0x70,0x2f, + 0x7,0x53,0x4e, 0x5,0x70,0x32, 0xf,0x67,0x5b, 0xf,0x67,0x5c, + 0xf,0x67,0x5d, 0xf,0x67,0x5e, 0xf,0x67,0x5f, 0xf,0x67,0x60, + 0xf,0x67,0x61, 0xf,0x67,0x62, 0xf,0x67,0x63, 0xf,0x67,0x64, + 0x7,0x53,0x4c, 0x5,0x70,0x31, 0x5,0x70,0x30, 0x7,0x53,0x4b, + 0x5,0x70,0x2e, 0x7,0x58,0x26, 0x5,0x73,0x4e, 0x5,0x73,0x4f, + 0x5,0x73,0x4c, 0x5,0x73,0x4a, 0x4,0x68,0x6f, 0x5,0x73,0x4b, + 0x5,0x73,0x4d, 0x7,0x58,0x25, 0xf,0x69,0x47, 0xf,0x69,0x48, + 0xf,0x69,0x49, 0xf,0x69,0x4b, 0xf,0x69,0x4e, 0xf,0x69,0x4f, + 0xf,0x69,0x50, 0xf,0x69,0x51, 0x7,0x58,0x24, 0x7,0x58,0x22, + 0xf,0x67,0x65, 0x5,0x75,0x71, 0x5,0x75,0x73, 0x5,0x77,0x60, + 0x5,0x75,0x74, 0x7,0x5b,0x60, 0x5,0x75,0x72, 0x7,0x5b,0x61, + 0x5,0x75,0x75, 0x7,0x5b,0x5f, 0x5,0x77,0x61, 0x7,0x5b,0x5d, + 0xf,0x6a,0x57, 0xf,0x6a,0x59, 0x7,0x5b,0x5e, 0x5,0x75,0x76, + 0x5,0x75,0x70, 0x4,0x6b,0x6c, 0x7,0x5e,0x6e, 0x5,0x77,0x62, + 0x7,0x60,0x71, 0xf,0x6b,0x4e, 0xf,0x6b,0x4f, 0xf,0x6b,0x50, + 0xf,0x6b,0x53, 0xf,0x6b,0x54, 0x7,0x5e,0x6f, 0x7,0x5e,0x70, + 0xf,0x6a,0x58, 0x7,0x60,0x72, 0x5,0x79,0x2d, 0xf,0x6c,0x2c, + 0x7,0x60,0x73, 0x5,0x79,0x2c, 0x5,0x79,0x2e, 0xf,0x6b,0x52, + 0x5,0x7a,0x29, 0x7,0x63,0x54, 0x7,0x60,0x74, 0x4,0x6d,0x55, + 0xf,0x6c,0x2d, 0xf,0x6c,0x4c, 0xf,0x6c,0x63, 0x7,0x63,0x4c, + 0x7,0x63,0x55, 0x5,0x7b,0x40, 0x7,0x64,0x48, 0x7,0x64,0x49, + 0x7,0x65,0x5b, 0xf,0x6d,0x2f, 0x7,0x65,0x74, 0x6,0x25,0x24, + 0x4,0x24,0x4b, 0x6,0x28,0x2f, 0x6,0x2c,0x2e, 0x6,0x28,0x32, + 0x5,0x24,0x47, 0x6,0x28,0x31, 0x4,0x24,0x4a, 0x5,0x26,0x5c, + 0x5,0x26,0x5b, 0x5,0x26,0x58, 0x6,0x2c,0x2f, 0x4,0x26,0x6f, + 0x6,0x2c,0x30, 0x5,0x26,0x5d, 0x4,0x26,0x6e, 0x5,0x26,0x59, + 0x5,0x26,0x5a, 0x5,0x26,0x57, 0xf,0x27,0x56, 0x5,0x29,0x5f, + 0x6,0x31,0x7a, 0x6,0x38,0x54, 0x6,0x31,0x7c, 0x5,0x29,0x62, + 0x4,0x29,0x75, 0x5,0x29,0x61, 0x5,0x29,0x5e, 0x6,0x31,0x79, + 0x5,0x29,0x5c, 0x5,0x29,0x60, 0x6,0x31,0x7b, 0x5,0x29,0x5d, + 0xf,0x2c,0x77, 0x6,0x38,0x57, 0x6,0x38,0x58, 0x6,0x38,0x55, + 0x5,0x2e,0x33, 0x5,0x2e,0x2d, 0x6,0x38,0x56, 0x6,0x40,0x6b, + 0x5,0x2e,0x32, 0x4,0x2d,0x5f, 0x5,0x2e,0x2f, 0x5,0x2e,0x34, + 0x5,0x2e,0x31, 0x5,0x2e,0x30, 0xf,0x30,0x31, 0x5,0x33,0x25, + 0x6,0x40,0x6c, 0x6,0x40,0x6d, 0xf,0x35,0x67, 0xf,0x35,0x68, + 0xf,0x35,0x69, 0xf,0x35,0x6a, 0xf,0x35,0x6b, 0xf,0x35,0x6c, + 0xf,0x35,0x6d, 0xf,0x35,0x6e, 0x4,0x38,0x3d, 0x5,0x39,0x47, + 0x5,0x3f,0x77, 0x4,0x38,0x3a, 0x5,0x39,0x45, 0x6,0x4a,0x3c, + 0x5,0x33,0x24, 0x5,0x39,0x48, 0x6,0x4a,0x3d, 0x5,0x39,0x44, + 0x5,0x39,0x49, 0x6,0x4a,0x3e, 0x5,0x39,0x46, 0x6,0x4a,0x3b, + 0xf,0x3c,0x30, 0xf,0x3c,0x31, 0x6,0x4a,0x3a, 0x6,0x53,0x6e, + 0x5,0x3f,0x76, 0x5,0x3f,0x75, 0x5,0x3f,0x7a, 0x6,0x53,0x6b, + 0x5,0x3f,0x79, 0x6,0x53,0x67, 0x6,0x53,0x66, 0x6,0x53,0x68, + 0x6,0x53,0x69, 0x6,0x53,0x6a, 0x6,0x53,0x6d, 0x5,0x3f,0x78, + 0xf,0x42,0x4e, 0x6,0x58,0x5a, 0x6,0x53,0x6c, 0x6,0x53,0x65, + 0xf,0x42,0x4d, 0x5,0x46,0x5c, 0x4,0x44,0x2b, 0x5,0x46,0x5e, + 0x6,0x5d,0x6f, 0x6,0x5d,0x6e, 0x4,0x44,0x2c, 0x5,0x46,0x5d, + 0x4,0x44,0x29, 0x6,0x5d,0x75, 0x6,0x5d,0x70, 0x5,0x46,0x5a, + 0x6,0x5d,0x76, 0x6,0x5d,0x74, 0x5,0x46,0x5b, 0x6,0x5d,0x72, + 0x6,0x5d,0x71, 0x6,0x5d,0x73, 0x6,0x53,0x6f, 0xf,0x48,0x76, + 0xf,0x48,0x78, 0x5,0x46,0x59, 0x5,0x4d,0x6e, 0x7,0x23,0x7d, + 0x5,0x4d,0x70, 0x5,0x4d,0x71, 0x4,0x4a,0x4d, 0x7,0x23,0x79, + 0x7,0x23,0x77, 0x7,0x23,0x7e, 0x7,0x23,0x76, 0x7,0x23,0x7a, + 0x7,0x23,0x7b, 0x5,0x4d,0x6f, 0xf,0x4f,0x54, 0x7,0x23,0x7c, + 0x5,0x54,0x7e, 0x7,0x2e,0x76, 0x4,0x50,0x68, 0x7,0x2e,0x75, + 0xf,0x55,0x3a, 0xf,0x55,0x3b, 0x7,0x38,0x5e, 0x7,0x38,0x60, + 0x5,0x5b,0x71, 0x7,0x38,0x5f, 0xf,0x5a,0x55, 0x7,0x38,0x5d, + 0x5,0x62,0x2c, 0x5,0x68,0x32, 0x5,0x68,0x31, 0xf,0x62,0x62, + 0x5,0x70,0x36, 0x7,0x4e,0x23, 0x5,0x70,0x35, 0x5,0x70,0x34, + 0x4,0x68,0x70, 0x5,0x70,0x33, 0x5,0x73,0x50, 0x7,0x58,0x29, + 0x7,0x58,0x27, 0x7,0x58,0x28, 0x5,0x77,0x63, 0x7,0x60,0x75, + 0x4,0x6c,0x70, 0x4,0x6d,0x56, 0x5,0x21,0x32, 0x5,0x21,0x70, + 0x6,0x23,0x2e, 0x6,0x25,0x26, 0x5,0x24,0x4a, 0x6,0x28,0x34, + 0x6,0x2c,0x31, 0x5,0x24,0x49, 0x5,0x24,0x4b, 0x6,0x28,0x33, + 0x6,0x2c,0x3c, 0x6,0x2c,0x34, 0x6,0x2c,0x3b, 0x6,0x2c,0x3a, + 0x6,0x2c,0x36, 0x6,0x2c,0x33, 0x6,0x2c,0x38, 0x6,0x2c,0x32, + 0x6,0x2c,0x37, 0x5,0x26,0x5e, 0x6,0x2c,0x39, 0x6,0x2c,0x35, + 0x5,0x26,0x5f, 0xf,0x27,0x57, 0xf,0x27,0x58, 0xf,0x27,0x59, + 0x4,0x26,0x72, 0x4,0x29,0x76, 0x5,0x29,0x63, 0x5,0x28,0x35, + 0x6,0x38,0x59, 0x6,0x38,0x5c, 0x5,0x2e,0x35, 0x6,0x38,0x5a, + 0x6,0x38,0x5e, 0x6,0x38,0x5d, 0x6,0x38,0x5b, 0x6,0x37,0x48, + 0x5,0x33,0x26, 0x6,0x40,0x70, 0xf,0x35,0x6f, 0x6,0x40,0x6f, + 0x4,0x38,0x40, 0x4,0x38,0x3e, 0x5,0x39,0x4a, 0x5,0x39,0x4b, + 0x6,0x4a,0x43, 0x4,0x38,0x41, 0x6,0x4a,0x42, 0x6,0x4a,0x44, + 0x6,0x4a,0x40, 0x6,0x4a,0x45, 0x6,0x4a,0x46, 0x6,0x4a,0x41, + 0x5,0x3f,0x7c, 0x6,0x53,0x70, 0x5,0x3f,0x7b, 0xf,0x42,0x4f, + 0x6,0x5a,0x61, 0x7,0x24,0x22, 0x7,0x24,0x25, 0x7,0x24,0x23, + 0x7,0x24,0x26, 0x7,0x24,0x21, 0x7,0x24,0x24, 0xf,0x4f,0x55, + 0x7,0x2e,0x7a, 0x7,0x2e,0x79, 0x7,0x2e,0x77, 0x7,0x2e,0x78, + 0x7,0x38,0x61, 0x4,0x56,0x50, 0xf,0x5a,0x56, 0xf,0x5a,0x57, + 0x5,0x62,0x2d, 0x5,0x62,0x2e, 0x7,0x40,0x2e, 0x5,0x73,0x51, + 0x7,0x5b,0x62, 0x7,0x5b,0x63, 0x5,0x21,0x71, 0x5,0x21,0x49, + 0x5,0x22,0x76, 0x6,0x28,0x35, 0x4,0x22,0x7d, 0x6,0x25,0x27, + 0x5,0x24,0x4c, 0x4,0x24,0x4d, 0x6,0x25,0x28, 0x6,0x28,0x36, + 0x6,0x28,0x3b, 0x6,0x28,0x37, 0x4,0x24,0x4c, 0x6,0x28,0x3c, + 0x5,0x24,0x4d, 0x6,0x28,0x39, 0x6,0x28,0x38, 0x6,0x28,0x3a, + 0x6,0x2c,0x3f, 0x5,0x26,0x60, 0x5,0x26,0x66, 0x5,0x26,0x61, + 0x5,0x26,0x64, 0x4,0x26,0x73, 0x4,0x26,0x74, 0x5,0x26,0x63, + 0x4,0x26,0x77, 0x6,0x2c,0x3d, 0x6,0x2c,0x3e, 0x6,0x2c,0x40, + 0x6,0x31,0x7d, 0x5,0x26,0x65, 0x5,0x29,0x68, 0x4,0x29,0x78, + 0x4,0x29,0x79, 0x6,0x32,0x26, 0x4,0x29,0x77, 0x6,0x31,0x7e, + 0x5,0x29,0x64, 0x5,0x29,0x65, 0x5,0x29,0x6b, 0x5,0x29,0x66, + 0x5,0x29,0x67, 0x6,0x32,0x25, 0x4,0x29,0x7a, 0x6,0x32,0x22, + 0x6,0x32,0x23, 0x5,0x29,0x6a, 0x6,0x32,0x24, 0x6,0x38,0x5f, + 0xf,0x2b,0x50, 0x6,0x32,0x21, 0x5,0x29,0x6c, 0x5,0x2e,0x36, + 0x4,0x2d,0x63, 0x6,0x38,0x62, 0x5,0x2e,0x3b, 0x6,0x38,0x65, + 0x5,0x2e,0x3c, 0x5,0x2e,0x38, 0x5,0x2e,0x39, 0x6,0x38,0x63, + 0x6,0x38,0x66, 0x5,0x2e,0x3d, 0x5,0x2e,0x37, 0x5,0x2e,0x3a, + 0x5,0x2e,0x3e, 0x6,0x38,0x60, 0x6,0x38,0x61, 0x5,0x33,0x2b, + 0x6,0x40,0x74, 0x5,0x33,0x2a, 0x6,0x40,0x73, 0x5,0x33,0x27, + 0x5,0x33,0x28, 0x5,0x33,0x29, 0x6,0x40,0x71, 0x4,0x32,0x4b, + 0x5,0x33,0x2c, 0x6,0x4a,0x49, 0x6,0x40,0x75, 0x6,0x40,0x72, + 0xf,0x35,0x71, 0x6,0x53,0x72, 0x6,0x4a,0x4a, 0x5,0x39,0x53, + 0x4,0x38,0x48, 0x6,0x4a,0x4b, 0x4,0x38,0x43, 0x5,0x39,0x4e, + 0x5,0x39,0x4d, 0x5,0x39,0x4f, 0x4,0x38,0x47, 0x5,0x39,0x52, + 0x5,0x39,0x54, 0x5,0x39,0x50, 0x5,0x39,0x4c, 0x5,0x39,0x51, + 0x6,0x4a,0x4c, 0x6,0x53,0x71, 0x6,0x4a,0x48, 0xf,0x3c,0x32, + 0x6,0x53,0x74, 0x6,0x53,0x79, 0x5,0x3f,0x7d, 0x5,0x3f,0x7e, + 0x6,0x53,0x76, 0x6,0x53,0x78, 0x4,0x3e,0x25, 0x6,0x5d,0x78, + 0x6,0x53,0x7a, 0x6,0x53,0x75, 0x6,0x53,0x73, 0xf,0x42,0x50, + 0xf,0x35,0x70, 0x4,0x44,0x34, 0x4,0x44,0x2e, 0x6,0x5d,0x7b, + 0x6,0x5d,0x7c, 0x4,0x44,0x2f, 0x6,0x5d,0x79, 0x6,0x5d,0x7a, + 0x6,0x5d,0x2d, 0x7,0x24,0x29, 0x4,0x4a,0x51, 0x5,0x4d,0x72, + 0x7,0x24,0x27, 0x5,0x4d,0x75, 0x7,0x24,0x28, 0x7,0x24,0x2b, + 0x5,0x4d,0x74, 0x4,0x50,0x69, 0x7,0x24,0x2c, 0x7,0x24,0x2a, + 0xf,0x4f,0x56, 0x5,0x4d,0x73, 0x7,0x2e,0x7b, 0x7,0x2e,0x7c, + 0x5,0x55,0x21, 0x4,0x50,0x6c, 0x5,0x55,0x23, 0x5,0x55,0x22, + 0x7,0x2e,0x7e, 0xf,0x55,0x3c, 0xf,0x55,0x3d, 0x7,0x38,0x64, + 0x7,0x38,0x62, 0x5,0x5b,0x73, 0x7,0x38,0x65, 0x7,0x38,0x63, + 0x5,0x5b,0x74, 0x5,0x62,0x30, 0x5,0x62,0x2f, 0x4,0x5b,0x4d, + 0x7,0x40,0x30, 0x7,0x2e,0x7d, 0x5,0x5b,0x75, 0x7,0x40,0x2f, + 0x5,0x68,0x33, 0x5,0x70,0x37, 0x5,0x70,0x38, 0x7,0x53,0x4f, + 0x7,0x58,0x2a, 0x5,0x75,0x7a, 0x5,0x75,0x79, 0x5,0x26,0x68, + 0x5,0x26,0x67, 0x6,0x32,0x27, 0x6,0x32,0x28, 0x5,0x2e,0x3f, + 0x4,0x32,0x4c, 0x4,0x32,0x4d, 0x6,0x40,0x78, 0x6,0x40,0x79, + 0x6,0x40,0x76, 0x6,0x40,0x77, 0xf,0x35,0x73, 0xf,0x35,0x75, + 0xf,0x35,0x76, 0xf,0x35,0x77, 0x6,0x40,0x7b, 0x6,0x40,0x7a, + 0x5,0x33,0x2d, 0x6,0x4a,0x4f, 0x6,0x4a,0x4e, 0xf,0x3c,0x33, + 0xf,0x35,0x72, 0x6,0x54,0x21, 0x6,0x54,0x22, 0x6,0x53,0x7d, + 0x6,0x53,0x7e, 0x6,0x54,0x24, 0xf,0x42,0x51, 0xf,0x42,0x52, + 0x6,0x54,0x23, 0x6,0x53,0x7c, 0x5,0x40,0x21, 0x5,0x40,0x7b, + 0x5,0x46,0x61, 0x4,0x44,0x36, 0x6,0x5e,0x21, 0x4,0x44,0x37, + 0x6,0x5d,0x7e, 0x6,0x5d,0x7d, 0xf,0x48,0x7a, 0x5,0x4d,0x76, + 0x6,0x5e,0x22, 0x7,0x24,0x2d, 0x4,0x4a,0x52, 0x7,0x2f,0x25, + 0x7,0x2f,0x23, 0x7,0x2f,0x26, 0x7,0x2f,0x21, 0x7,0x2f,0x24, + 0x5,0x55,0x24, 0x7,0x2f,0x22, 0xf,0x55,0x3e, 0xf,0x55,0x3f, + 0xf,0x55,0x40, 0x7,0x38,0x66, 0x7,0x38,0x67, 0x4,0x5b,0x4e, + 0x7,0x40,0x33, 0x5,0x62,0x32, 0x5,0x62,0x31, 0x7,0x40,0x31, + 0x7,0x40,0x32, 0x4,0x5f,0x78, 0x7,0x47,0x4c, 0x7,0x4e,0x25, + 0x7,0x47,0x4d, 0x7,0x53,0x50, 0x4,0x6a,0x4d, 0x5,0x75,0x7b, + 0x7,0x5b,0x64, 0x5,0x73,0x52, 0x7,0x5e,0x73, 0x5,0x77,0x65, + 0x5,0x77,0x64, 0x7,0x60,0x76, 0x7,0x63,0x56, 0x5,0x21,0x72, + 0x6,0x28,0x3d, 0x6,0x2c,0x41, 0x6,0x32,0x29, 0x6,0x38,0x67, + 0xf,0x3c,0x34, 0x5,0x40,0x22, 0x4,0x4a,0x53, 0xf,0x4f,0x57, + 0xf,0x4f,0x58, 0xf,0x5a,0x59, 0xf,0x55,0x41, 0xf,0x62,0x63, + 0xf,0x6a,0x5a, 0x5,0x24,0x4f, 0x6,0x28,0x3e, 0x6,0x2c,0x45, + 0x6,0x2c,0x44, 0x5,0x26,0x69, 0x6,0x38,0x68, 0x6,0x38,0x6a, + 0x6,0x38,0x69, 0x6,0x40,0x7c, 0x6,0x40,0x7d, 0x5,0x40,0x23, + 0x4,0x3e,0x26, 0x5,0x46,0x62, 0x5,0x46,0x63, 0x6,0x5e,0x23, + 0x7,0x24,0x2e, 0x7,0x2f,0x27, 0x7,0x2f,0x28, 0x5,0x55,0x25, + 0x7,0x47,0x4e, 0x5,0x6c,0x43, 0x5,0x79,0x30, 0x5,0x21,0x4a, + 0x4,0x22,0x7e, 0xf,0x22,0x5a, 0xf,0x22,0x5b, 0x6,0x28,0x40, + 0x6,0x28,0x3f, 0x4,0x24,0x4e, 0xf,0x24,0x55, 0xf,0x24,0x56, + 0xf,0x24,0x57, 0xf,0x24,0x59, 0xf,0x24,0x5a, 0x5,0x26,0x6d, + 0x5,0x26,0x6a, 0x5,0x26,0x6c, 0x5,0x26,0x6b, 0x6,0x2c,0x47, + 0x6,0x2c,0x46, 0xf,0x27,0x5a, 0xf,0x27,0x5c, 0xf,0x27,0x5d, + 0xf,0x27,0x5e, 0xf,0x27,0x5f, 0x5,0x26,0x43, 0x6,0x32,0x2c, + 0x5,0x29,0x6e, 0x5,0x29,0x6f, 0x5,0x29,0x6d, 0x5,0x29,0x70, + 0x5,0x29,0x71, 0x6,0x32,0x2d, 0x5,0x29,0x73, 0x6,0x32,0x2f, + 0x6,0x38,0x6d, 0x6,0x32,0x2e, 0x5,0x29,0x74, 0x6,0x32,0x2b, + 0x5,0x29,0x72, 0xf,0x2b,0x51, 0xf,0x2b,0x52, 0xf,0x2b,0x53, + 0xf,0x2b,0x54, 0xf,0x2b,0x55, 0xf,0x2b,0x56, 0xf,0x2b,0x57, + 0xf,0x2b,0x58, 0xf,0x2b,0x59, 0xf,0x2b,0x5a, 0xf,0x2b,0x5b, + 0xf,0x2b,0x5c, 0xf,0x2b,0x5e, 0xf,0x2b,0x5d, 0x6,0x38,0x6f, + 0x5,0x2e,0x41, 0x6,0x38,0x6e, 0x4,0x2d,0x69, 0x5,0x2e,0x43, + 0x4,0x2d,0x68, 0x6,0x38,0x6c, 0x5,0x2e,0x42, 0xf,0x30,0x32, + 0xf,0x30,0x33, 0xf,0x30,0x34, 0xf,0x30,0x35, 0xf,0x30,0x36, + 0xf,0x30,0x37, 0xf,0x30,0x38, 0xf,0x30,0x39, 0x6,0x38,0x6b, + 0x5,0x2e,0x40, 0x6,0x41,0x26, 0x4,0x32,0x56, 0x6,0x41,0x21, + 0x5,0x33,0x31, 0x6,0x41,0x22, 0x6,0x41,0x23, 0x5,0x33,0x2e, + 0x6,0x41,0x25, 0x5,0x33,0x32, 0x5,0x33,0x30, 0x5,0x33,0x2f, + 0x6,0x40,0x7e, 0x6,0x41,0x24, 0xf,0x35,0x78, 0xf,0x35,0x79, + 0xf,0x35,0x7a, 0xf,0x35,0x7b, 0xf,0x35,0x7c, 0x5,0x39,0x55, + 0x4,0x38,0x4d, 0x5,0x39,0x56, 0x4,0x38,0x50, 0x6,0x4a,0x51, + 0x6,0x4a,0x53, 0x5,0x39,0x59, 0x5,0x39,0x58, 0x5,0x39,0x5a, + 0x6,0x4a,0x56, 0x6,0x4a,0x50, 0x6,0x4a,0x55, 0x5,0x39,0x57, + 0x6,0x4a,0x52, 0xf,0x3c,0x3a, 0xf,0x3c,0x35, 0xf,0x3c,0x37, + 0xf,0x3c,0x38, 0xf,0x3c,0x39, 0xf,0x3c,0x3b, 0xf,0x3c,0x3d, + 0xf,0x3c,0x3f, 0xf,0x3c,0x40, 0x6,0x4a,0x54, 0xf,0x3c,0x36, + 0x5,0x39,0x5c, 0x6,0x54,0x2e, 0x6,0x54,0x2c, 0x4,0x3e,0x2b, + 0x6,0x54,0x27, 0x6,0x54,0x2b, 0x4,0x3e,0x2a, 0x6,0x54,0x28, + 0x6,0x54,0x25, 0x6,0x54,0x29, 0x6,0x54,0x26, 0x6,0x54,0x2d, + 0x6,0x54,0x2a, 0x6,0x54,0x2f, 0x5,0x40,0x24, 0xf,0x42,0x53, + 0xf,0x42,0x55, 0xf,0x42,0x56, 0xf,0x42,0x57, 0x6,0x54,0x30, + 0x6,0x5e,0x29, 0x5,0x46,0x66, 0x5,0x46,0x65, 0x6,0x5e,0x2a, + 0x6,0x5e,0x2b, 0x6,0x5e,0x2d, 0x4,0x44,0x3d, 0x6,0x5e,0x24, + 0x4,0x44,0x3e, 0x5,0x46,0x67, 0x4,0x44,0x3b, 0x6,0x5e,0x2e, + 0x6,0x5e,0x2f, 0x6,0x5e,0x26, 0x6,0x5e,0x27, 0xf,0x48,0x7c, + 0xf,0x48,0x7d, 0xf,0x48,0x7e, 0xf,0x49,0x21, 0x6,0x5e,0x28, + 0x5,0x46,0x69, 0x6,0x5e,0x30, 0x6,0x5e,0x25, 0x6,0x5e,0x2c, + 0x4,0x4a,0x56, 0x7,0x24,0x33, 0x7,0x24,0x37, 0x7,0x24,0x35, + 0x4,0x4a,0x55, 0x4,0x4a,0x54, 0x5,0x4d,0x79, 0x7,0x24,0x34, + 0x5,0x4d,0x77, 0x5,0x4d,0x78, 0x7,0x24,0x31, 0x7,0x24,0x32, + 0x7,0x24,0x30, 0x7,0x24,0x2f, 0x7,0x24,0x36, 0x7,0x24,0x38, + 0x7,0x2f,0x29, 0x5,0x55,0x27, 0x7,0x2f,0x2a, 0x4,0x50,0x70, + 0x5,0x55,0x26, 0x4,0x50,0x73, 0x7,0x2f,0x2c, 0xf,0x55,0x42, + 0xf,0x55,0x43, 0xf,0x55,0x44, 0xf,0x55,0x45, 0x7,0x2f,0x2b, + 0x7,0x24,0x39, 0x7,0x38,0x6a, 0x4,0x56,0x55, 0x4,0x56,0x54, + 0x7,0x38,0x69, 0x5,0x5b,0x76, 0x7,0x38,0x68, 0xf,0x5a,0x5a, + 0xf,0x5a,0x5b, 0xf,0x5a,0x5c, 0x7,0x38,0x6c, 0x7,0x38,0x6b, + 0x5,0x62,0x35, 0x5,0x62,0x34, 0x5,0x62,0x36, 0x7,0x40,0x37, + 0x7,0x47,0x4f, 0x7,0x40,0x35, 0x5,0x62,0x37, 0x7,0x40,0x34, + 0x7,0x40,0x36, 0xf,0x5f,0x31, 0x5,0x62,0x33, 0xf,0x5f,0x32, + 0x7,0x47,0x52, 0x5,0x68,0x34, 0x7,0x47,0x50, 0x7,0x47,0x51, + 0xf,0x65,0x41, 0x7,0x4e,0x26, 0x4,0x66,0x47, 0x5,0x70,0x39, + 0x7,0x53,0x51, 0xf,0x67,0x67, 0x7,0x58,0x2b, 0x5,0x73,0x53, + 0xf,0x69,0x52, 0x5,0x75,0x7c, 0x7,0x5b,0x65, 0x7,0x64,0x4a, + 0x6,0x2c,0x48, 0x6,0x32,0x30, 0x5,0x29,0x75, 0x5,0x29,0x76, + 0x6,0x33,0x4c, 0x6,0x41,0x27, 0xf,0x35,0x7d, 0x6,0x41,0x28, + 0x6,0x54,0x31, 0x4,0x44,0x40, 0x7,0x2f,0x2d, 0x7,0x38,0x6d, + 0x4,0x5b,0x51, 0xf,0x5a,0x5d, 0x6,0x25,0x2a, 0x6,0x25,0x29, + 0xf,0x24,0x5c, 0x6,0x2c,0x4b, 0x6,0x2c,0x4a, 0x6,0x2c,0x49, + 0x6,0x32,0x31, 0x6,0x32,0x32, 0xf,0x2b,0x5f, 0x5,0x29,0x77, + 0x5,0x2e,0x44, 0xf,0x35,0x7e, 0x5,0x39,0x5d, 0xf,0x3c,0x41, + 0x6,0x54,0x32, 0x7,0x24,0x3b, 0x7,0x24,0x3a, 0x7,0x40,0x38, + 0x7,0x53,0x52, 0xf,0x21,0x67, 0x6,0x22,0x24, 0x6,0x25,0x2b, + 0x5,0x21,0x73, 0x6,0x25,0x2c, 0xf,0x22,0x5e, 0xf,0x24,0x69, + 0x4,0x23,0x23, 0x6,0x25,0x2d, 0x5,0x24,0x50, 0x6,0x25,0x2f, + 0x6,0x25,0x31, 0x3,0x24,0x24, 0xf,0x22,0x5c, 0xf,0x24,0x5f, + 0xf,0x24,0x60, 0x6,0x25,0x30, 0x6,0x2c,0x4d, 0x5,0x24,0x52, + 0x6,0x28,0x42, 0x5,0x24,0x51, 0x5,0x24,0x53, 0x4,0x24,0x50, + 0x6,0x28,0x46, 0x6,0x28,0x47, 0x6,0x2c,0x4c, 0x6,0x28,0x43, + 0x6,0x28,0x41, 0x6,0x28,0x45, 0x6,0x28,0x48, 0xf,0x24,0x61, + 0xf,0x24,0x5e, 0xf,0x24,0x62, 0xf,0x24,0x63, 0xf,0x24,0x64, + 0xf,0x24,0x65, 0xf,0x24,0x66, 0xf,0x24,0x67, 0xf,0x27,0x63, + 0xf,0x27,0x64, 0xf,0x27,0x65, 0x4,0x27,0x23, 0x5,0x26,0x6f, + 0x6,0x32,0x33, 0x5,0x26,0x72, 0x5,0x26,0x73, 0x4,0x27,0x21, + 0x6,0x2c,0x57, 0x4,0x27,0x25, 0x6,0x2c,0x50, 0x4,0x27,0x24, + 0x6,0x2c,0x4e, 0x5,0x26,0x6e, 0x5,0x26,0x70, 0x6,0x2c,0x58, + 0x5,0x26,0x71, 0x6,0x2c,0x5a, 0x6,0x32,0x34, 0x6,0x2c,0x56, + 0x6,0x2c,0x5c, 0x4,0x26,0x7c, 0x6,0x2c,0x53, 0xf,0x27,0x60, + 0xf,0x27,0x61, 0xf,0x27,0x62, 0xf,0x27,0x67, 0xf,0x27,0x68, + 0xf,0x27,0x69, 0xf,0x27,0x6a, 0xf,0x27,0x6b, 0xf,0x27,0x6d, + 0xf,0x2b,0x64, 0xf,0x2b,0x67, 0xf,0x2b,0x6c, 0x6,0x2c,0x52, + 0x6,0x2c,0x54, 0x6,0x2c,0x55, 0x6,0x2c,0x59, 0x6,0x2c,0x4f, + 0x5,0x29,0x78, 0x4,0x29,0x7c, 0x6,0x32,0x36, 0x5,0x2a,0x22, + 0x6,0x32,0x3b, 0x6,0x32,0x3e, 0x5,0x29,0x79, 0x4,0x2a,0x22, + 0x4,0x2d,0x71, 0x5,0x2a,0x21, 0x5,0x29,0x7e, 0x6,0x32,0x3a, + 0x6,0x32,0x40, 0x5,0x29,0x7a, 0x6,0x32,0x41, 0x5,0x29,0x7d, + 0x6,0x38,0x70, 0x6,0x32,0x3d, 0x6,0x32,0x3c, 0x4,0x2a,0x23, + 0x4,0x29,0x7d, 0x6,0x32,0x3f, 0xf,0x2b,0x60, 0xf,0x2b,0x61, + 0xf,0x2b,0x62, 0xf,0x2b,0x63, 0xf,0x2b,0x65, 0xf,0x2b,0x66, + 0xf,0x2b,0x68, 0xf,0x2b,0x69, 0xf,0x2b,0x6a, 0xf,0x2b,0x6b, + 0xf,0x2b,0x6d, 0xf,0x2b,0x6e, 0xf,0x30,0x3a, 0xf,0x30,0x3d, + 0xf,0x30,0x44, 0x6,0x32,0x38, 0x4,0x2a,0x24, 0x6,0x32,0x35, + 0x6,0x32,0x37, 0x5,0x2a,0x23, 0xf,0x30,0x57, 0x4,0x2d,0x6e, + 0x5,0x2e,0x49, 0x6,0x39,0x30, 0x6,0x39,0x2e, 0x5,0x2e,0x48, + 0x5,0x2e,0x47, 0x6,0x38,0x7c, 0x5,0x2e,0x4a, 0x6,0x38,0x71, + 0x6,0x38,0x7b, 0x4,0x2d,0x6d, 0x4,0x2d,0x6f, 0x6,0x39,0x25, + 0x6,0x38,0x76, 0x6,0x39,0x26, 0x6,0x39,0x2a, 0x6,0x38,0x77, + 0x6,0x39,0x29, 0x6,0x38,0x7e, 0x6,0x39,0x28, 0x6,0x41,0x2a, + 0x6,0x41,0x29, 0x4,0x32,0x66, 0x6,0x39,0x24, 0x6,0x39,0x2c, + 0x5,0x2e,0x45, 0x6,0x39,0x23, 0x6,0x38,0x73, 0x6,0x39,0x2b, + 0x6,0x38,0x78, 0x6,0x39,0x2f, 0x6,0x39,0x32, 0x6,0x41,0x46, + 0xf,0x30,0x3b, 0xf,0x30,0x3e, 0xf,0x30,0x3f, 0xf,0x30,0x40, + 0xf,0x30,0x41, 0xf,0x30,0x42, 0xf,0x30,0x43, 0xf,0x30,0x45, + 0xf,0x30,0x46, 0xf,0x30,0x47, 0xf,0x30,0x48, 0xf,0x30,0x4a, + 0xf,0x30,0x4b, 0xf,0x30,0x4c, 0xf,0x30,0x4d, 0xf,0x30,0x4e, + 0xf,0x30,0x4f, 0xf,0x30,0x50, 0xf,0x30,0x51, 0xf,0x30,0x52, + 0xf,0x30,0x53, 0xf,0x30,0x54, 0xf,0x30,0x55, 0xf,0x30,0x56, + 0xf,0x30,0x58, 0xf,0x30,0x59, 0xf,0x30,0x5a, 0x6,0x38,0x79, + 0x6,0x39,0x22, 0x6,0x39,0x31, 0x4,0x2d,0x72, 0x6,0x39,0x27, + 0x6,0x38,0x7d, 0x6,0x38,0x75, 0x5,0x2e,0x46, 0xf,0x36,0x2d, + 0x4,0x32,0x5d, 0x5,0x33,0x40, 0x4,0x32,0x5b, 0x4,0x32,0x6b, + 0x6,0x41,0x34, 0x6,0x41,0x38, 0x6,0x41,0x3c, 0x4,0x32,0x6a, + 0x6,0x41,0x43, 0x4,0x32,0x61, 0x6,0x41,0x36, 0x4,0x32,0x65, + 0x6,0x41,0x35, 0x6,0x41,0x45, 0x4,0x32,0x69, 0x5,0x33,0x33, + 0x6,0x41,0x31, 0x4,0x32,0x60, 0x4,0x32,0x67, 0x6,0x4a,0x64, + 0x5,0x33,0x3f, 0x6,0x41,0x42, 0x5,0x33,0x3e, 0x6,0x41,0x3f, + 0x4,0x32,0x59, 0x4,0x32,0x5f, 0x6,0x41,0x2c, 0x4,0x25,0x2f, + 0x6,0x41,0x3b, 0x6,0x41,0x30, 0x6,0x4a,0x66, 0x5,0x33,0x38, + 0x5,0x33,0x41, 0x6,0x4a,0x58, 0x6,0x4a,0x59, 0x6,0x41,0x3e, + 0x6,0x41,0x44, 0x5,0x33,0x36, 0x4,0x32,0x62, 0x6,0x41,0x40, + 0x5,0x33,0x3b, 0x6,0x41,0x2f, 0x6,0x41,0x32, 0x5,0x33,0x3a, + 0x5,0x33,0x35, 0x4,0x32,0x6c, 0x4,0x32,0x6e, 0x5,0x33,0x37, + 0x6,0x41,0x3d, 0xf,0x36,0x21, 0xf,0x36,0x22, 0xf,0x36,0x23, + 0xf,0x36,0x25, 0xf,0x36,0x26, 0xf,0x36,0x27, 0xf,0x36,0x28, + 0xf,0x36,0x2a, 0xf,0x36,0x2c, 0xf,0x36,0x2e, 0xf,0x36,0x2f, + 0xf,0x36,0x30, 0xf,0x36,0x31, 0xf,0x36,0x32, 0xf,0x36,0x36, + 0xf,0x36,0x37, 0xf,0x36,0x38, 0xf,0x36,0x39, 0xf,0x36,0x3a, + 0xf,0x36,0x3b, 0xf,0x36,0x3c, 0xf,0x36,0x3d, 0xf,0x3c,0x42, + 0xf,0x3c,0x4b, 0xf,0x3c,0x4d, 0xf,0x3c,0x57, 0xf,0x42,0x5f, + 0x6,0x4a,0x57, 0x6,0x41,0x33, 0x6,0x41,0x37, 0x5,0x33,0x39, + 0x6,0x41,0x3a, 0x6,0x41,0x39, 0x6,0x41,0x47, 0x6,0x41,0x2d, + 0x6,0x41,0x2e, 0x5,0x33,0x34, 0x5,0x33,0x3c, 0x6,0x38,0x7a, + 0x6,0x4a,0x62, 0x6,0x4a,0x70, 0x4,0x38,0x54, 0x5,0x39,0x63, + 0x4,0x38,0x55, 0x6,0x4a,0x5d, 0x6,0x4a,0x5f, 0x5,0x39,0x67, + 0x5,0x39,0x6a, 0x5,0x39,0x62, 0x6,0x54,0x48, 0x5,0x39,0x6c, + 0x6,0x4a,0x5a, 0x4,0x38,0x53, 0x5,0x33,0x42, 0x4,0x38,0x58, + 0x6,0x4a,0x6c, 0x6,0x4a,0x5c, 0x5,0x39,0x68, 0x6,0x4a,0x71, + 0x6,0x54,0x35, 0x6,0x4a,0x67, 0x6,0x4a,0x68, 0x6,0x4a,0x6e, + 0x5,0x39,0x60, 0x6,0x54,0x34, 0x6,0x4a,0x6f, 0x4,0x3e,0x2c, + 0x5,0x39,0x5f, 0x5,0x39,0x66, 0x5,0x39,0x65, 0x5,0x39,0x64, + 0x6,0x4a,0x6a, 0x5,0x39,0x61, 0x6,0x54,0x33, 0x6,0x4a,0x72, + 0x5,0x39,0x6d, 0x6,0x4a,0x61, 0xf,0x3c,0x44, 0xf,0x3c,0x45, + 0xf,0x3c,0x46, 0xf,0x3c,0x48, 0xf,0x3c,0x49, 0xf,0x3c,0x4a, + 0xf,0x3c,0x4e, 0xf,0x3c,0x4f, 0xf,0x3c,0x50, 0xf,0x3c,0x51, + 0xf,0x3c,0x52, 0xf,0x3c,0x53, 0xf,0x3c,0x54, 0xf,0x3c,0x55, + 0xf,0x3c,0x56, 0xf,0x3c,0x58, 0xf,0x3c,0x59, 0xf,0x3c,0x5b, + 0xf,0x3c,0x5c, 0x6,0x4a,0x69, 0x5,0x39,0x69, 0x6,0x4a,0x6b, + 0x4,0x38,0x5d, 0x6,0x4a,0x5b, 0x6,0x4a,0x60, 0x6,0x4a,0x5e, + 0x5,0x39,0x6b, 0xf,0x42,0x73, 0x6,0x54,0x41, 0x5,0x40,0x25, + 0x4,0x3e,0x41, 0x6,0x54,0x38, 0x4,0x3e,0x34, 0x6,0x54,0x3b, + 0x6,0x54,0x43, 0x4,0x3e,0x3b, 0x4,0x3e,0x43, 0x4,0x3e,0x3e, + 0x4,0x3e,0x2e, 0x6,0x54,0x4a, 0x5,0x40,0x29, 0x5,0x40,0x26, + 0x4,0x3e,0x40, 0x6,0x5e,0x31, 0x6,0x54,0x42, 0x4,0x3e,0x3a, + 0x5,0x40,0x2f, 0x5,0x40,0x2d, 0x4,0x3e,0x31, 0x6,0x5e,0x32, + 0x4,0x3e,0x42, 0x5,0x40,0x2c, 0x5,0x40,0x2e, 0x6,0x54,0x3e, + 0x6,0x54,0x4c, 0x7,0x24,0x3c, 0x6,0x54,0x47, 0x4,0x44,0x4b, + 0x6,0x54,0x3f, 0x6,0x54,0x46, 0x6,0x54,0x37, 0x6,0x54,0x36, + 0x5,0x40,0x2b, 0x5,0x40,0x28, 0x4,0x3e,0x3d, 0x6,0x54,0x3c, + 0x6,0x54,0x3d, 0x6,0x54,0x40, 0x6,0x54,0x45, 0xf,0x42,0x58, + 0xf,0x42,0x59, 0xf,0x42,0x5a, 0xf,0x42,0x5b, 0xf,0x42,0x5c, + 0xf,0x42,0x5d, 0xf,0x42,0x5e, 0xf,0x42,0x60, 0xf,0x42,0x61, + 0xf,0x42,0x62, 0xf,0x42,0x65, 0xf,0x42,0x66, 0xf,0x42,0x67, + 0xf,0x42,0x68, 0xf,0x42,0x69, 0xf,0x42,0x6a, 0xf,0x42,0x6c, + 0xf,0x42,0x6d, 0xf,0x42,0x6e, 0xf,0x42,0x6f, 0xf,0x42,0x70, + 0xf,0x42,0x71, 0xf,0x42,0x72, 0xf,0x42,0x75, 0xf,0x49,0x22, + 0xf,0x49,0x3e, 0x5,0x40,0x2a, 0x6,0x54,0x44, 0x4,0x3e,0x35, + 0x6,0x54,0x4d, 0x6,0x54,0x3a, 0x6,0x54,0x4b, 0xf,0x49,0x2f, + 0xf,0x42,0x6b, 0xf,0x4f,0x6c, 0x6,0x54,0x39, 0x7,0x24,0x3d, + 0x4,0x44,0x54, 0x4,0x44,0x47, 0x4,0x44,0x48, 0x4,0x44,0x4c, + 0x5,0x46,0x6b, 0x4,0x44,0x4e, 0x5,0x46,0x6a, 0x5,0x46,0x74, + 0x5,0x46,0x76, 0x4,0x44,0x45, 0x4,0x44,0x53, 0x6,0x5e,0x44, + 0x5,0x46,0x6f, 0x6,0x5e,0x41, 0x6,0x5e,0x3a, 0x4,0x44,0x51, + 0x4,0x44,0x50, 0x5,0x46,0x75, 0x5,0x46,0x72, 0x5,0x46,0x6d, + 0x7,0x24,0x40, 0x7,0x24,0x3f, 0x5,0x46,0x77, 0x6,0x5e,0x45, + 0x4,0x44,0x4f, 0x6,0x5e,0x39, 0x6,0x5e,0x42, 0x5,0x46,0x70, + 0x5,0x46,0x71, 0x4,0x44,0x41, 0x6,0x5e,0x3d, 0x5,0x4d,0x7a, + 0x7,0x24,0x3e, 0x6,0x5e,0x34, 0x5,0x46,0x6e, 0x6,0x5e,0x3f, + 0x5,0x46,0x73, 0xf,0x49,0x23, 0xf,0x49,0x24, 0xf,0x49,0x25, + 0xf,0x49,0x26, 0xf,0x49,0x27, 0xf,0x49,0x28, 0xf,0x49,0x29, + 0xf,0x49,0x2b, 0xf,0x49,0x2c, 0xf,0x49,0x2d, 0xf,0x49,0x2e, + 0xf,0x49,0x30, 0xf,0x49,0x31, 0xf,0x49,0x34, 0xf,0x49,0x36, + 0xf,0x49,0x37, 0xf,0x49,0x38, 0xf,0x49,0x39, 0xf,0x49,0x3a, + 0xf,0x49,0x3c, 0xf,0x49,0x3d, 0xf,0x49,0x41, 0xf,0x49,0x42, + 0xf,0x49,0x43, 0xf,0x4f,0x6d, 0x7,0x22,0x68, 0x4,0x44,0x42, + 0x6,0x5e,0x3c, 0x6,0x5e,0x43, 0x6,0x5e,0x35, 0x5,0x46,0x6c, + 0x6,0x5e,0x33, 0x6,0x5e,0x37, 0x6,0x5e,0x38, 0xf,0x49,0x3b, + 0x6,0x5e,0x36, 0xf,0x49,0x2a, 0x7,0x24,0x62, 0x7,0x24,0x52, + 0x7,0x24,0x4d, 0x4,0x4a,0x60, 0x7,0x24,0x5a, 0x7,0x24,0x54, + 0x7,0x24,0x4c, 0x4,0x4a,0x65, 0x4,0x4a,0x67, 0x5,0x4e,0x25, + 0x7,0x24,0x63, 0x7,0x24,0x4e, 0x7,0x24,0x50, 0x7,0x24,0x56, + 0x4,0x4a,0x5c, 0x7,0x24,0x57, 0x7,0x24,0x49, 0x5,0x4e,0x21, + 0x7,0x24,0x65, 0x7,0x24,0x47, 0x7,0x24,0x44, 0x4,0x4a,0x66, + 0x5,0x4d,0x7b, 0x5,0x4e,0x24, 0x7,0x24,0x64, 0x4,0x4a,0x5b, + 0x7,0x24,0x5b, 0x4,0x4a,0x5a, 0x7,0x24,0x59, 0x5,0x4d,0x7e, + 0x7,0x24,0x43, 0x7,0x24,0x67, 0x5,0x4e,0x23, 0x5,0x4d,0x7d, + 0x7,0x24,0x53, 0x7,0x24,0x42, 0x7,0x3a,0x69, 0x7,0x24,0x45, + 0x7,0x24,0x68, 0x5,0x4e,0x22, 0x7,0x24,0x41, 0x7,0x24,0x5e, + 0x7,0x24,0x66, 0x5,0x4e,0x26, 0x5,0x4e,0x28, 0x5,0x4d,0x7c, + 0x4,0x4a,0x5e, 0x7,0x24,0x5f, 0x7,0x24,0x4b, 0x7,0x24,0x51, + 0x5,0x4e,0x27, 0x7,0x24,0x5c, 0xf,0x4f,0x59, 0xf,0x4f,0x5a, + 0xf,0x4f,0x5b, 0xf,0x4f,0x5c, 0xf,0x4f,0x5d, 0xf,0x4f,0x5e, + 0xf,0x4f,0x5f, 0xf,0x4f,0x62, 0xf,0x4f,0x63, 0xf,0x4f,0x64, + 0xf,0x4f,0x65, 0xf,0x4f,0x66, 0xf,0x4f,0x67, 0xf,0x4f,0x68, + 0xf,0x4f,0x6a, 0xf,0x4f,0x6b, 0xf,0x4f,0x6f, 0xf,0x4f,0x70, + 0xf,0x4f,0x71, 0xf,0x4f,0x72, 0xf,0x4f,0x73, 0xf,0x4f,0x74, + 0xf,0x4f,0x75, 0xf,0x4f,0x76, 0xf,0x4f,0x77, 0xf,0x4f,0x78, + 0xf,0x4f,0x7b, 0xf,0x4f,0x7c, 0xf,0x55,0x51, 0x7,0x24,0x55, + 0x7,0x24,0x60, 0x7,0x2f,0x30, 0x4,0x4a,0x63, 0x7,0x24,0x46, + 0x7,0x24,0x5d, 0x7,0x24,0x48, 0x7,0x24,0x4a, 0xf,0x55,0x4a, + 0xf,0x4f,0x7e, 0xf,0x49,0x40, 0x4,0x50,0x7c, 0x5,0x55,0x35, + 0x5,0x55,0x34, 0x5,0x55,0x28, 0x5,0x55,0x29, 0x5,0x55,0x2b, + 0x7,0x2f,0x33, 0x5,0x55,0x30, 0x7,0x2f,0x47, 0x7,0x2f,0x40, + 0x7,0x2f,0x3a, 0x4,0x50,0x79, 0x7,0x2f,0x39, 0x4,0x50,0x7e, + 0x5,0x55,0x33, 0x7,0x2f,0x3d, 0x7,0x2f,0x31, 0x7,0x2f,0x37, + 0x7,0x2f,0x46, 0x7,0x2f,0x3b, 0x7,0x2f,0x38, 0x7,0x2f,0x43, + 0x7,0x2f,0x36, 0x7,0x2f,0x32, 0x5,0x55,0x31, 0x5,0x55,0x2a, + 0x5,0x5b,0x77, 0x7,0x2f,0x3c, 0x7,0x2f,0x49, 0x5,0x55,0x2c, + 0x5,0x5b,0x79, 0x5,0x55,0x32, 0x7,0x2f,0x2f, 0x7,0x2f,0x34, + 0x7,0x2f,0x3e, 0x7,0x2f,0x41, 0xf,0x55,0x46, 0xf,0x55,0x48, + 0xf,0x55,0x49, 0xf,0x55,0x4b, 0xf,0x55,0x4c, 0xf,0x55,0x4f, + 0xf,0x55,0x50, 0xf,0x55,0x52, 0xf,0x55,0x53, 0xf,0x55,0x54, + 0xf,0x55,0x55, 0xf,0x55,0x57, 0xf,0x5a,0x6d, 0x5,0x55,0x2f, + 0x7,0x2f,0x3f, 0x7,0x2f,0x45, 0x7,0x2f,0x48, 0x7,0x2f,0x4a, + 0x7,0x2f,0x2e, 0x7,0x2f,0x44, 0x4,0x51,0x21, 0xf,0x4f,0x61, + 0xf,0x5a,0x66, 0xf,0x5a,0x5f, 0x5,0x54,0x3a, 0x5,0x5b,0x7c, + 0x4,0x56,0x5a, 0x4,0x56,0x5f, 0x5,0x5b,0x7a, 0x7,0x38,0x7a, + 0x7,0x38,0x6e, 0x4,0x5b,0x52, 0x5,0x5b,0x7b, 0x5,0x5b,0x78, + 0x7,0x38,0x70, 0x7,0x38,0x76, 0x7,0x38,0x6f, 0x7,0x38,0x79, + 0x7,0x38,0x74, 0x7,0x38,0x73, 0x5,0x62,0x38, 0x7,0x38,0x75, + 0x7,0x38,0x7b, 0x5,0x5b,0x7d, 0x7,0x38,0x77, 0x5,0x55,0x37, + 0x3,0x55,0x3a, 0x7,0x38,0x78, 0xf,0x5a,0x60, 0xf,0x5a,0x61, + 0xf,0x5a,0x62, 0xf,0x5a,0x63, 0xf,0x5a,0x64, 0xf,0x5a,0x65, + 0xf,0x5a,0x67, 0xf,0x5a,0x69, 0xf,0x5a,0x6b, 0xf,0x5a,0x70, + 0x7,0x38,0x72, 0x5,0x5b,0x7e, 0x7,0x38,0x7c, 0x7,0x38,0x71, + 0xf,0x55,0x4e, 0xf,0x5a,0x6c, 0xf,0x5a,0x6f, 0xf,0x55,0x47, + 0xf,0x55,0x4d, 0xf,0x5a,0x5e, 0x7,0x2f,0x35, 0x5,0x62,0x3f, + 0x5,0x62,0x46, 0x5,0x62,0x45, 0x4,0x5b,0x5d, 0x5,0x62,0x3d, + 0x5,0x62,0x39, 0x5,0x62,0x42, 0x7,0x40,0x40, 0x7,0x40,0x46, + 0x4,0x5b,0x59, 0x5,0x62,0x4b, 0x5,0x62,0x44, 0x7,0x40,0x3c, + 0x5,0x62,0x41, 0x5,0x62,0x4a, 0x4,0x5b,0x58, 0x5,0x62,0x43, + 0x7,0x40,0x47, 0x5,0x62,0x3b, 0x7,0x40,0x41, 0x5,0x62,0x40, + 0x7,0x40,0x48, 0x7,0x40,0x3a, 0x4,0x5b,0x5f, 0x4,0x5b,0x55, + 0x7,0x40,0x45, 0x7,0x40,0x44, 0x7,0x40,0x3e, 0x5,0x62,0x3a, + 0x4,0x5b,0x53, 0x5,0x62,0x3c, 0x5,0x62,0x3e, 0x5,0x62,0x49, + 0x5,0x62,0x4c, 0x5,0x62,0x47, 0x7,0x40,0x3f, 0x4,0x5b,0x5c, + 0x7,0x40,0x42, 0x7,0x47,0x5f, 0x5,0x62,0x4d, 0xf,0x5f,0x33, + 0xf,0x5f,0x35, 0xf,0x5f,0x36, 0xf,0x5f,0x37, 0xf,0x5f,0x39, + 0xf,0x5f,0x3a, 0xf,0x5f,0x3b, 0xf,0x5f,0x3c, 0xf,0x5f,0x3d, + 0xf,0x5f,0x3e, 0xf,0x5f,0x3f, 0xf,0x5f,0x40, 0xf,0x5f,0x41, + 0xf,0x5f,0x42, 0xf,0x5f,0x43, 0xf,0x62,0x64, 0xf,0x62,0x65, + 0xf,0x62,0x6c, 0x7,0x47,0x5e, 0x7,0x40,0x3d, 0x7,0x40,0x39, + 0x7,0x40,0x43, 0x7,0x40,0x3b, 0xf,0x5f,0x34, 0xf,0x5a,0x6a, + 0xf,0x5a,0x6e, 0x5,0x62,0x48, 0x7,0x47,0x65, 0x7,0x47,0x5c, + 0x7,0x47,0x62, 0x4,0x5f,0x7c, 0x4,0x5f,0x7a, 0x7,0x47,0x53, + 0x5,0x68,0x36, 0x7,0x47,0x56, 0x7,0x47,0x54, 0x7,0x47,0x5b, + 0x7,0x47,0x5a, 0x7,0x47,0x55, 0x5,0x68,0x35, 0x7,0x47,0x59, + 0x7,0x47,0x5d, 0x5,0x6c,0x45, 0x7,0x47,0x61, 0xf,0x62,0x66, + 0xf,0x62,0x67, 0xf,0x62,0x68, 0xf,0x62,0x69, 0xf,0x62,0x6a, + 0xf,0x62,0x6d, 0xf,0x62,0x6e, 0xf,0x62,0x6f, 0xf,0x62,0x70, + 0xf,0x62,0x71, 0x7,0x47,0x57, 0x7,0x47,0x60, 0x7,0x47,0x66, + 0x7,0x47,0x64, 0x7,0x47,0x63, 0x7,0x47,0x58, 0x5,0x6c,0x47, + 0x5,0x6c,0x4a, 0x5,0x6c,0x4b, 0x7,0x4e,0x2b, 0x4,0x63,0x59, + 0x4,0x63,0x5d, 0x7,0x4e,0x2a, 0x7,0x4e,0x29, 0x5,0x6c,0x48, + 0x4,0x63,0x5c, 0x7,0x4e,0x2e, 0x4,0x63,0x57, 0x4,0x63,0x58, + 0x4,0x63,0x56, 0x7,0x4e,0x2d, 0x5,0x70,0x3b, 0x5,0x6c,0x49, + 0x5,0x6c,0x4c, 0x7,0x4e,0x2f, 0xf,0x65,0x42, 0xf,0x65,0x43, + 0xf,0x65,0x44, 0x7,0x4e,0x2c, 0x4,0x66,0x48, 0x5,0x70,0x40, + 0x7,0x53,0x56, 0x5,0x70,0x3f, 0x5,0x70,0x3d, 0x4,0x66,0x4b, + 0x7,0x53,0x54, 0x5,0x70,0x3c, 0x7,0x53,0x59, 0x7,0x53,0x53, + 0x4,0x66,0x4d, 0x7,0x53,0x5f, 0x5,0x70,0x41, 0x7,0x53,0x55, + 0x7,0x53,0x5a, 0xf,0x67,0x68, 0xf,0x67,0x69, 0xf,0x67,0x6a, + 0xf,0x67,0x6b, 0xf,0x67,0x6d, 0xf,0x67,0x6e, 0xf,0x67,0x6f, + 0x7,0x53,0x5b, 0x7,0x53,0x5c, 0x7,0x53,0x5d, 0x7,0x53,0x5e, + 0x5,0x70,0x3a, 0xf,0x67,0x70, 0xf,0x69,0x55, 0x7,0x58,0x2e, + 0x7,0x53,0x57, 0x7,0x58,0x2f, 0x5,0x73,0x54, 0x5,0x70,0x42, + 0x7,0x58,0x2d, 0x5,0x73,0x55, 0x7,0x58,0x31, 0x4,0x68,0x72, + 0x7,0x58,0x32, 0xf,0x69,0x53, 0xf,0x69,0x54, 0x7,0x58,0x33, + 0x7,0x58,0x30, 0x7,0x58,0x2c, 0x5,0x76,0x21, 0x5,0x76,0x22, + 0x7,0x5b,0x69, 0x7,0x5b,0x68, 0x5,0x75,0x7e, 0x7,0x5b,0x67, + 0x5,0x75,0x7d, 0xf,0x6a,0x5b, 0xf,0x6a,0x5c, 0xf,0x6a,0x5d, + 0x7,0x5b,0x6a, 0x7,0x5b,0x66, 0x7,0x5e,0x76, 0x5,0x77,0x67, + 0x7,0x5e,0x77, 0x4,0x6c,0x71, 0x7,0x5e,0x74, 0x5,0x77,0x66, + 0x7,0x5e,0x75, 0x4,0x6c,0x72, 0x7,0x60,0x79, 0x7,0x60,0x78, + 0x7,0x60,0x77, 0xf,0x6c,0x2f, 0x7,0x62,0x39, 0x4,0x6d,0x58, + 0x5,0x7a,0x2b, 0x5,0x7a,0x2a, 0x4,0x6d,0x59, 0x4,0x6d,0x74, + 0x5,0x7a,0x69, 0x5,0x7a,0x6a, 0x7,0x63,0x57, 0x7,0x64,0x4b, + 0x5,0x7b,0x41, 0xf,0x6d,0x26, 0x7,0x65,0x5c, 0x5,0x7c,0x3c, + 0x6,0x23,0x2f, 0x6,0x25,0x33, 0x4,0x23,0x24, 0x4,0x23,0x25, + 0x6,0x25,0x32, 0xf,0x22,0x5f, 0xf,0x22,0x60, 0xf,0x22,0x61, + 0x6,0x25,0x34, 0x4,0x24,0x53, 0x4,0x24,0x54, 0x5,0x24,0x54, + 0x6,0x28,0x4c, 0x5,0x24,0x55, 0x5,0x24,0x57, 0xf,0x24,0x6b, + 0xf,0x24,0x6c, 0xf,0x24,0x6d, 0xf,0x24,0x70, 0xf,0x24,0x72, + 0x6,0x28,0x4b, 0x5,0x26,0x74, 0x4,0x27,0x28, 0x5,0x26,0x75, + 0xf,0x27,0x6f, 0xf,0x27,0x70, 0xf,0x27,0x71, 0xf,0x27,0x73, + 0xf,0x27,0x74, 0xf,0x27,0x75, 0xf,0x27,0x76, 0xf,0x27,0x77, + 0x6,0x2c,0x5f, 0xf,0x27,0x72, 0x6,0x2c,0x5e, 0x4,0x27,0x2a, + 0x5,0x24,0x56, 0x5,0x2a,0x25, 0x6,0x32,0x4c, 0x5,0x2a,0x26, + 0x6,0x32,0x44, 0x5,0x2a,0x27, 0x6,0x32,0x4b, 0x6,0x32,0x46, + 0xf,0x2b,0x6f, 0xf,0x2b,0x70, 0xf,0x2b,0x71, 0xf,0x2b,0x72, + 0xf,0x2b,0x73, 0xf,0x2b,0x74, 0xf,0x2b,0x75, 0xf,0x2b,0x76, + 0xf,0x2b,0x77, 0xf,0x2b,0x78, 0xf,0x2b,0x79, 0xf,0x2b,0x7b, + 0xf,0x2b,0x7c, 0xf,0x2b,0x7d, 0xf,0x2b,0x7e, 0xf,0x2c,0x21, + 0xf,0x2c,0x23, 0x4,0x2a,0x29, 0x6,0x32,0x45, 0x6,0x32,0x43, + 0x6,0x32,0x47, 0x6,0x39,0x3a, 0x5,0x2a,0x28, 0x6,0x32,0x4a, + 0xf,0x2c,0x22, 0x6,0x32,0x49, 0x5,0x2e,0x4f, 0x5,0x2e,0x4e, + 0x6,0x39,0x36, 0x6,0x39,0x39, 0xf,0x30,0x6a, 0x4,0x32,0x6f, + 0x6,0x39,0x37, 0x4,0x2d,0x74, 0x6,0x39,0x34, 0x5,0x2e,0x4b, + 0xf,0x30,0x5d, 0xf,0x30,0x5e, 0xf,0x30,0x5f, 0xf,0x30,0x60, + 0xf,0x30,0x61, 0xf,0x30,0x62, 0xf,0x30,0x63, 0xf,0x30,0x64, + 0xf,0x30,0x65, 0xf,0x30,0x66, 0xf,0x30,0x68, 0xf,0x30,0x69, + 0xf,0x30,0x6b, 0xf,0x30,0x6c, 0xf,0x30,0x6e, 0xf,0x30,0x6f, + 0xf,0x30,0x70, 0xf,0x30,0x71, 0xf,0x30,0x72, 0x5,0x2e,0x4c, + 0x6,0x39,0x35, 0x6,0x39,0x3b, 0x6,0x39,0x3c, 0xf,0x30,0x67, + 0xf,0x30,0x6d, 0x6,0x39,0x38, 0x5,0x2e,0x4d, 0x6,0x41,0x4b, + 0x4,0x32,0x74, 0x5,0x33,0x44, 0x6,0x41,0x4f, 0x4,0x32,0x73, + 0x4,0x32,0x75, 0x6,0x41,0x4e, 0x6,0x41,0x54, 0x6,0x41,0x51, + 0x6,0x41,0x4d, 0x6,0x41,0x4c, 0x6,0x4a,0x73, 0x6,0x41,0x52, + 0x6,0x41,0x50, 0x6,0x41,0x53, 0xf,0x36,0x24, 0xf,0x36,0x3e, + 0xf,0x36,0x3f, 0xf,0x36,0x40, 0xf,0x36,0x41, 0xf,0x36,0x43, + 0xf,0x36,0x44, 0xf,0x36,0x45, 0xf,0x36,0x46, 0xf,0x36,0x47, + 0xf,0x36,0x49, 0xf,0x36,0x4a, 0xf,0x36,0x4c, 0xf,0x36,0x4d, + 0xf,0x36,0x4e, 0xf,0x36,0x50, 0x6,0x41,0x49, 0x6,0x41,0x48, + 0xf,0x36,0x4b, 0x5,0x33,0x43, 0x5,0x33,0x45, 0x6,0x41,0x55, + 0x4,0x38,0x69, 0x6,0x4a,0x78, 0x6,0x41,0x4a, 0x5,0x39,0x71, + 0x5,0x39,0x6f, 0x6,0x4a,0x7e, 0x6,0x4b,0x21, 0x5,0x39,0x6e, + 0x6,0x4a,0x75, 0x4,0x38,0x66, 0x6,0x4a,0x7a, 0x6,0x4a,0x74, + 0x6,0x4a,0x7d, 0x4,0x38,0x63, 0x5,0x39,0x70, 0x6,0x4a,0x77, + 0xf,0x3c,0x5e, 0xf,0x3c,0x5f, 0xf,0x3c,0x60, 0xf,0x3c,0x61, + 0xf,0x3c,0x62, 0xf,0x3c,0x63, 0xf,0x3c,0x64, 0xf,0x3c,0x66, + 0xf,0x3c,0x67, 0xf,0x3c,0x68, 0xf,0x3c,0x69, 0xf,0x3c,0x6b, + 0xf,0x3c,0x6c, 0xf,0x3c,0x6d, 0xf,0x3c,0x6e, 0xf,0x3c,0x6f, + 0xf,0x3c,0x70, 0xf,0x3c,0x71, 0xf,0x3c,0x72, 0xf,0x3c,0x75, + 0xf,0x3c,0x77, 0xf,0x3c,0x78, 0xf,0x3c,0x79, 0xf,0x3c,0x7a, + 0xf,0x3c,0x7b, 0xf,0x3c,0x7c, 0xf,0x3d,0x21, 0x6,0x4a,0x79, + 0x6,0x4a,0x7c, 0x4,0x38,0x67, 0x6,0x4a,0x76, 0x6,0x4a,0x7b, + 0xf,0x3c,0x6a, 0x5,0x39,0x72, 0x5,0x40,0x34, 0x6,0x54,0x5a, + 0x6,0x54,0x58, 0x5,0x40,0x30, 0x6,0x54,0x56, 0x6,0x54,0x5d, + 0x4,0x3e,0x47, 0x6,0x54,0x57, 0x4,0x3e,0x44, 0x6,0x54,0x5b, + 0x6,0x54,0x5e, 0x4,0x3e,0x45, 0x5,0x40,0x32, 0x6,0x54,0x53, + 0x6,0x54,0x63, 0x6,0x54,0x5f, 0x6,0x54,0x64, 0x5,0x40,0x35, + 0x6,0x54,0x5c, 0x6,0x54,0x62, 0xf,0x42,0x76, 0xf,0x42,0x79, + 0xf,0x42,0x7b, 0xf,0x42,0x7c, 0xf,0x42,0x7d, 0xf,0x43,0x21, + 0xf,0x43,0x22, 0xf,0x43,0x23, 0xf,0x43,0x25, 0xf,0x43,0x26, + 0xf,0x43,0x27, 0xf,0x43,0x28, 0xf,0x43,0x29, 0xf,0x43,0x2a, + 0xf,0x43,0x2b, 0xf,0x43,0x2d, 0xf,0x43,0x2e, 0xf,0x43,0x30, + 0xf,0x43,0x33, 0xf,0x43,0x34, 0xf,0x43,0x35, 0xf,0x43,0x36, + 0xf,0x43,0x37, 0xf,0x43,0x38, 0xf,0x43,0x39, 0xf,0x43,0x3a, + 0xf,0x43,0x3b, 0xf,0x43,0x3d, 0xf,0x43,0x3e, 0x6,0x54,0x51, + 0x6,0x54,0x52, 0x6,0x54,0x55, 0x6,0x54,0x66, 0x4,0x3e,0x4a, + 0x6,0x54,0x61, 0x6,0x54,0x65, 0x6,0x5a,0x54, 0xf,0x43,0x2c, + 0x5,0x40,0x33, 0x5,0x40,0x31, 0xf,0x49,0x54, 0x6,0x5e,0x51, + 0x6,0x5e,0x50, 0x5,0x46,0x7e, 0x6,0x5e,0x4a, 0x5,0x47,0x22, + 0x4,0x44,0x55, 0x5,0x46,0x7c, 0x5,0x46,0x7b, 0x5,0x46,0x7a, + 0x7,0x24,0x70, 0x7,0x24,0x6a, 0x6,0x5e,0x46, 0x5,0x47,0x21, + 0x6,0x5e,0x47, 0x6,0x5e,0x48, 0x5,0x46,0x79, 0x6,0x5e,0x4b, + 0x6,0x5e,0x4f, 0xf,0x49,0x44, 0xf,0x49,0x45, 0xf,0x49,0x46, + 0xf,0x49,0x47, 0xf,0x49,0x49, 0xf,0x49,0x4a, 0xf,0x49,0x4c, + 0xf,0x49,0x4d, 0xf,0x49,0x4e, 0xf,0x49,0x4f, 0xf,0x49,0x50, + 0xf,0x49,0x51, 0xf,0x49,0x52, 0xf,0x49,0x53, 0xf,0x49,0x55, + 0xf,0x49,0x56, 0xf,0x49,0x57, 0xf,0x49,0x5a, 0xf,0x49,0x5b, + 0xf,0x49,0x5d, 0xf,0x49,0x5e, 0xf,0x49,0x60, 0xf,0x49,0x62, + 0xf,0x49,0x63, 0xf,0x49,0x64, 0x4,0x44,0x5d, 0x5,0x46,0x7d, + 0x6,0x5e,0x4c, 0x6,0x5e,0x52, 0x6,0x5e,0x49, 0x6,0x5e,0x4d, + 0xf,0x49,0x5c, 0x6,0x54,0x60, 0xf,0x42,0x7e, 0xf,0x42,0x7a, + 0x4,0x4a,0x6b, 0x5,0x4e,0x2c, 0x7,0x24,0x74, 0x7,0x24,0x6d, + 0x7,0x24,0x69, 0x5,0x4e,0x2a, 0x7,0x24,0x6c, 0x7,0x24,0x71, + 0x7,0x24,0x72, 0x7,0x24,0x75, 0x7,0x24,0x6b, 0x5,0x4e,0x29, + 0xf,0x4e,0x22, 0x5,0x4e,0x2b, 0x7,0x24,0x73, 0xf,0x50,0x23, + 0xf,0x50,0x24, 0xf,0x50,0x26, 0xf,0x50,0x27, 0xf,0x50,0x28, + 0xf,0x50,0x29, 0xf,0x50,0x2a, 0xf,0x50,0x2b, 0xf,0x50,0x2e, + 0xf,0x50,0x2f, 0xf,0x50,0x31, 0xf,0x50,0x32, 0xf,0x50,0x33, + 0xf,0x50,0x34, 0xf,0x50,0x35, 0xf,0x50,0x37, 0xf,0x50,0x38, + 0xf,0x50,0x39, 0xf,0x50,0x3a, 0xf,0x50,0x3b, 0xf,0x50,0x3c, + 0x7,0x24,0x6e, 0xf,0x50,0x2c, 0x7,0x2a,0x71, 0xf,0x50,0x2d, + 0xf,0x50,0x30, 0xf,0x50,0x25, 0xf,0x50,0x22, 0x5,0x4e,0x2e, + 0x5,0x4e,0x2d, 0x6,0x5e,0x4e, 0x4,0x51,0x2a, 0x7,0x2f,0x52, + 0x7,0x2f,0x66, 0x7,0x2f,0x50, 0x7,0x2f,0x60, 0x7,0x2f,0x5e, + 0x5,0x55,0x3b, 0x4,0x51,0x27, 0x7,0x2f,0x61, 0x7,0x2f,0x63, + 0x7,0x2f,0x55, 0x7,0x24,0x6f, 0x4,0x51,0x28, 0x7,0x2f,0x56, + 0x7,0x2f,0x64, 0x7,0x2f,0x65, 0x4,0x51,0x26, 0x7,0x2f,0x58, + 0x7,0x2f,0x54, 0x4,0x51,0x29, 0x7,0x2f,0x67, 0x5,0x55,0x3a, + 0x5,0x55,0x3c, 0x7,0x2f,0x62, 0x7,0x2f,0x59, 0x7,0x2f,0x5d, + 0x7,0x2f,0x5a, 0x7,0x2f,0x4b, 0x7,0x2f,0x53, 0x7,0x2f,0x5c, + 0xf,0x55,0x59, 0xf,0x55,0x5a, 0xf,0x55,0x5b, 0xf,0x55,0x5c, + 0xf,0x55,0x5d, 0xf,0x55,0x5e, 0xf,0x55,0x5f, 0xf,0x55,0x60, + 0xf,0x55,0x61, 0xf,0x55,0x62, 0xf,0x55,0x63, 0xf,0x55,0x66, + 0xf,0x55,0x67, 0xf,0x55,0x68, 0xf,0x55,0x6a, 0xf,0x55,0x6b, + 0xf,0x55,0x6d, 0xf,0x55,0x6e, 0xf,0x55,0x70, 0xf,0x55,0x71, + 0xf,0x55,0x72, 0xf,0x55,0x65, 0x5,0x55,0x38, 0x7,0x2f,0x4d, + 0x7,0x2f,0x4e, 0x7,0x2f,0x5b, 0x7,0x2f,0x5f, 0x7,0x31,0x7a, + 0x7,0x2f,0x51, 0x7,0x2c,0x7b, 0xf,0x55,0x6f, 0x5,0x55,0x3d, + 0x5,0x55,0x39, 0x7,0x2f,0x4c, 0x7,0x24,0x76, 0x7,0x2f,0x57, + 0x7,0x39,0x23, 0x4,0x56,0x61, 0x7,0x39,0x25, 0x5,0x55,0x3e, + 0x7,0x39,0x29, 0x7,0x39,0x28, 0x4,0x56,0x63, 0x7,0x2f,0x68, + 0x5,0x5c,0x21, 0x7,0x38,0x7d, 0x5,0x5c,0x24, 0x5,0x5c,0x22, + 0xf,0x5a,0x71, 0xf,0x5a,0x72, 0xf,0x5a,0x76, 0xf,0x5a,0x77, + 0xf,0x5a,0x78, 0xf,0x5a,0x79, 0xf,0x5a,0x7a, 0xf,0x5a,0x7b, + 0xf,0x5a,0x7c, 0xf,0x5a,0x7d, 0xf,0x5a,0x7e, 0xf,0x5b,0x21, + 0xf,0x5b,0x22, 0xf,0x5b,0x23, 0x7,0x38,0x7e, 0x7,0x39,0x24, + 0x7,0x39,0x22, 0x5,0x5c,0x23, 0x7,0x39,0x21, 0xf,0x55,0x69, + 0x7,0x40,0x4f, 0x4,0x5b,0x62, 0x7,0x40,0x4e, 0x5,0x62,0x4e, + 0x7,0x40,0x4b, 0x7,0x40,0x53, 0x7,0x40,0x51, 0x7,0x40,0x4c, + 0x4,0x5b,0x63, 0x5,0x62,0x4f, 0x5,0x62,0x50, 0x4,0x5b,0x61, + 0x7,0x40,0x54, 0x7,0x40,0x4a, 0x7,0x40,0x52, 0xf,0x5f,0x44, + 0xf,0x5f,0x46, 0xf,0x5f,0x45, 0xf,0x5f,0x47, 0xf,0x5f,0x48, + 0xf,0x5f,0x49, 0xf,0x5f,0x4a, 0xf,0x5f,0x4c, 0xf,0x5f,0x4d, + 0x7,0x40,0x50, 0x7,0x42,0x22, 0x7,0x40,0x55, 0x7,0x40,0x4d, + 0x7,0x40,0x49, 0x7,0x39,0x2a, 0xf,0x61,0x76, 0xf,0x5a,0x74, + 0xf,0x5a,0x75, 0x7,0x47,0x6c, 0x5,0x68,0x37, 0x4,0x60,0x21, + 0x7,0x47,0x6d, 0x4,0x60,0x22, 0x7,0x47,0x6a, 0xf,0x62,0x74, + 0xf,0x62,0x75, 0xf,0x62,0x76, 0xf,0x62,0x77, 0x7,0x47,0x69, + 0x7,0x47,0x67, 0x7,0x47,0x6b, 0xf,0x5f,0x4b, 0x7,0x47,0x68, + 0xf,0x65,0x45, 0x5,0x6c,0x4f, 0x7,0x4e,0x30, 0x7,0x4e,0x33, + 0x7,0x4e,0x3b, 0x5,0x6c,0x4e, 0x5,0x6c,0x4d, 0x5,0x6c,0x51, + 0x4,0x60,0x23, 0x7,0x4e,0x32, 0x7,0x4e,0x38, 0x4,0x63,0x62, + 0x4,0x63,0x60, 0x7,0x4e,0x3c, 0x7,0x4e,0x31, 0x7,0x4e,0x35, + 0x7,0x4e,0x37, 0xf,0x65,0x48, 0x7,0x4e,0x34, 0xf,0x65,0x46, + 0xf,0x65,0x47, 0xf,0x65,0x4a, 0xf,0x65,0x4b, 0xf,0x65,0x4c, + 0xf,0x65,0x4d, 0xf,0x65,0x4e, 0x7,0x4e,0x39, 0x7,0x4e,0x36, + 0x7,0x4e,0x3a, 0x5,0x6c,0x50, 0x7,0x53,0x64, 0x4,0x63,0x61, + 0x7,0x53,0x66, 0x5,0x70,0x43, 0x4,0x66,0x4f, 0x7,0x53,0x67, + 0x7,0x53,0x62, 0x7,0x53,0x63, 0x7,0x53,0x65, 0xf,0x67,0x71, + 0xf,0x67,0x72, 0xf,0x67,0x73, 0xf,0x67,0x74, 0xf,0x67,0x75, + 0x7,0x58,0x36, 0x5,0x73,0x56, 0x4,0x6a,0x4f, 0x7,0x58,0x37, + 0x7,0x58,0x38, 0x7,0x58,0x34, 0xf,0x69,0x56, 0xf,0x69,0x57, + 0xf,0x69,0x58, 0x7,0x58,0x35, 0x7,0x5b,0x24, 0x7,0x5b,0x6e, + 0x7,0x5b,0x70, 0x7,0x5b,0x6d, 0x7,0x5c,0x44, 0x7,0x5b,0x6f, + 0x7,0x5b,0x6c, 0x7,0x5b,0x6b, 0x5,0x76,0x23, 0xf,0x6a,0x60, + 0x7,0x5e,0x78, 0xf,0x6a,0x5f, 0x5,0x77,0x68, 0x7,0x61,0x21, + 0x7,0x60,0x7c, 0x7,0x60,0x7e, 0x7,0x61,0x38, 0x7,0x60,0x7b, + 0x7,0x60,0x7d, 0x7,0x62,0x3a, 0x5,0x7a,0x6b, 0xf,0x6c,0x64, + 0xf,0x6c,0x65, 0x7,0x64,0x4d, 0x7,0x64,0x4c, 0x7,0x64,0x4e, + 0x7,0x65,0x37, 0x7,0x66,0x34, 0x5,0x21,0x4b, 0x6,0x23,0x30, + 0x6,0x28,0x4d, 0x6,0x28,0x4e, 0x5,0x24,0x58, 0x6,0x2c,0x62, + 0x6,0x2c,0x61, 0x6,0x2c,0x63, 0xf,0x27,0x78, 0xf,0x27,0x79, + 0x6,0x32,0x4e, 0x5,0x2a,0x2b, 0x5,0x2a,0x29, 0x6,0x32,0x4f, + 0x5,0x2a,0x2a, 0x6,0x32,0x51, 0xf,0x2c,0x24, 0xf,0x2c,0x25, + 0xf,0x2c,0x26, 0x6,0x32,0x4d, 0x6,0x32,0x50, 0x5,0x2e,0x51, + 0x5,0x2e,0x50, 0xf,0x30,0x73, 0x6,0x41,0x57, 0x6,0x41,0x56, + 0x6,0x41,0x58, 0xf,0x36,0x51, 0x4,0x38,0x6a, 0x6,0x4b,0x22, + 0x6,0x47,0x43, 0x6,0x4d,0x5d, 0x6,0x54,0x68, 0x6,0x54,0x69, + 0x6,0x5e,0x53, 0x5,0x47,0x23, 0x6,0x5e,0x56, 0x6,0x5e,0x55, + 0x6,0x5e,0x54, 0x7,0x24,0x7a, 0x5,0x4e,0x2f, 0x7,0x24,0x77, + 0x7,0x24,0x79, 0x7,0x24,0x78, 0x7,0x2f,0x69, 0x7,0x2f,0x6a, + 0x5,0x55,0x3f, 0x4,0x56,0x65, 0xf,0x5b,0x24, 0xf,0x5b,0x25, + 0xf,0x5b,0x26, 0xf,0x55,0x73, 0x7,0x40,0x56, 0x5,0x68,0x38, + 0xf,0x65,0x4f, 0xf,0x65,0x50, 0x7,0x4e,0x3d, 0x7,0x53,0x68, + 0x7,0x5b,0x71, 0x7,0x5e,0x79, 0x7,0x61,0x22, 0xf,0x24,0x73, + 0xf,0x24,0x74, 0x6,0x2c,0x64, 0x6,0x2c,0x65, 0x6,0x41,0x59, + 0x6,0x41,0x5a, 0xf,0x3d,0x22, 0xf,0x3d,0x23, 0x6,0x54,0x6a, + 0xf,0x49,0x65, 0x5,0x47,0x24, 0x5,0x55,0x40, 0xf,0x21,0x68, + 0x6,0x2b,0x6b, 0x5,0x2a,0x2c, 0x4,0x2a,0x2b, 0x4,0x2d,0x77, + 0xf,0x30,0x74, 0x5,0x31,0x6c, 0x6,0x4b,0x23, 0x6,0x54,0x6c, + 0x6,0x54,0x6b, 0x5,0x55,0x41, 0x7,0x24,0x7b, 0x7,0x24,0x7c, + 0x5,0x55,0x42, 0x6,0x22,0x25, 0x6,0x23,0x31, 0x6,0x25,0x35, + 0x6,0x28,0x4f, 0x4,0x27,0x2d, 0x6,0x2c,0x67, 0x6,0x2c,0x66, + 0x6,0x32,0x52, 0x4,0x2a,0x2d, 0x6,0x32,0x53, 0x6,0x32,0x54, + 0x6,0x39,0x3e, 0x4,0x2d,0x78, 0xf,0x30,0x75, 0x6,0x39,0x3d, + 0x6,0x41,0x5b, 0x6,0x41,0x5e, 0x6,0x41,0x5d, 0x4,0x32,0x78, + 0x6,0x41,0x5c, 0xf,0x36,0x52, 0xf,0x36,0x53, 0x6,0x4b,0x28, + 0x6,0x4b,0x24, 0x6,0x4b,0x26, 0x6,0x4b,0x27, 0x6,0x4b,0x29, + 0x6,0x4b,0x25, 0x6,0x4d,0x58, 0x6,0x54,0x6d, 0x6,0x54,0x6e, + 0xf,0x43,0x3f, 0x6,0x5e,0x58, 0x6,0x5e,0x59, 0xf,0x49,0x66, + 0x7,0x24,0x7d, 0xf,0x50,0x3e, 0x7,0x24,0x7e, 0x5,0x55,0x43, + 0x5,0x62,0x51, 0x4,0x51,0x2c, 0x7,0x2f,0x6b, 0x7,0x25,0x21, + 0x5,0x55,0x44, 0x7,0x39,0x2b, 0x7,0x39,0x2c, 0x5,0x5c,0x25, + 0x7,0x47,0x70, 0x5,0x6c,0x52, 0x7,0x58,0x39, 0x7,0x5b,0x72, + 0x7,0x63,0x58, 0x5,0x7b,0x42, 0x7,0x64,0x4f, 0xf,0x21,0x69, + 0x6,0x28,0x51, 0x5,0x24,0x59, 0x6,0x28,0x50, 0x4,0x27,0x2e, + 0x6,0x2c,0x6b, 0x6,0x2c,0x6a, 0x6,0x2c,0x69, 0x6,0x2c,0x68, + 0x6,0x32,0x56, 0x6,0x32,0x55, 0x5,0x2a,0x2d, 0x6,0x32,0x57, + 0x5,0x2a,0x2e, 0x5,0x2e,0x52, 0x4,0x2d,0x79, 0x4,0x2d,0x7b, + 0x6,0x39,0x41, 0x6,0x39,0x3f, 0x5,0x33,0x46, 0x5,0x33,0x47, + 0x6,0x41,0x5f, 0x6,0x41,0x62, 0x6,0x41,0x60, 0x6,0x4b,0x2b, + 0x4,0x38,0x6d, 0x6,0x4b,0x2e, 0x6,0x4b,0x2a, 0x6,0x4b,0x2c, + 0x6,0x4b,0x2d, 0x5,0x39,0x73, 0x5,0x39,0x76, 0x5,0x39,0x74, + 0x5,0x39,0x75, 0x4,0x38,0x6e, 0x5,0x40,0x38, 0x6,0x54,0x6f, + 0x4,0x3e,0x4d, 0x5,0x40,0x36, 0x5,0x40,0x37, 0x6,0x54,0x70, + 0xf,0x3d,0x24, 0x5,0x47,0x25, 0x6,0x5e,0x5b, 0x6,0x5e,0x5c, + 0x6,0x5e,0x5a, 0xf,0x49,0x67, 0x5,0x4e,0x32, 0x7,0x25,0x25, + 0x5,0x4e,0x31, 0x5,0x4e,0x30, 0x5,0x4e,0x33, 0x7,0x25,0x24, + 0x7,0x25,0x22, 0x5,0x4e,0x34, 0x7,0x25,0x23, 0x5,0x55,0x46, + 0x5,0x55,0x47, 0x5,0x55,0x48, 0x7,0x2f,0x6d, 0x5,0x55,0x45, + 0x7,0x2f,0x6c, 0x5,0x5c,0x26, 0x4,0x56,0x66, 0xf,0x5b,0x27, + 0xf,0x5b,0x28, 0x5,0x62,0x53, 0x5,0x62,0x52, 0x5,0x6c,0x53, + 0x7,0x53,0x69, 0x5,0x23,0x68, 0x6,0x39,0x43, 0x6,0x39,0x42, + 0x4,0x38,0x6f, 0x6,0x4b,0x2f, 0xf,0x3d,0x25, 0xf,0x3d,0x26, + 0x6,0x54,0x71, 0x6,0x5e,0x5d, 0x5,0x21,0x75, 0xf,0x22,0x63, + 0x6,0x25,0x36, 0xf,0x22,0x62, 0x6,0x28,0x53, 0xf,0x24,0x75, + 0x6,0x28,0x52, 0x6,0x28,0x54, 0x5,0x26,0x79, 0x5,0x27,0x22, + 0x5,0x26,0x78, 0x5,0x26,0x7b, 0x5,0x26,0x76, 0x5,0x26,0x7d, + 0x6,0x2c,0x6e, 0x4,0x27,0x30, 0x5,0x27,0x21, 0x6,0x2c,0x6c, + 0x5,0x26,0x7e, 0x5,0x27,0x23, 0x5,0x26,0x7c, 0x6,0x2c,0x6d, + 0xf,0x27,0x7b, 0xf,0x27,0x7c, 0xf,0x27,0x7e, 0xf,0x28,0x21, + 0x5,0x26,0x7a, 0x6,0x2c,0x6f, 0x6,0x2c,0x70, 0x5,0x2a,0x32, + 0x5,0x2a,0x30, 0x5,0x2a,0x2f, 0x6,0x32,0x5f, 0x6,0x32,0x5c, + 0x5,0x2a,0x33, 0x5,0x2a,0x31, 0x4,0x2a,0x30, 0x6,0x32,0x5a, + 0x6,0x32,0x59, 0xf,0x2c,0x28, 0xf,0x2c,0x29, 0x6,0x32,0x5b, + 0x6,0x32,0x5e, 0x6,0x32,0x58, 0x6,0x32,0x5d, 0x5,0x2a,0x34, + 0xf,0x27,0x7d, 0x5,0x2e,0x58, 0x5,0x2e,0x54, 0x5,0x2e,0x56, + 0x5,0x2e,0x57, 0x5,0x2e,0x55, 0x6,0x39,0x44, 0x5,0x2e,0x59, + 0x4,0x32,0x7b, 0x6,0x41,0x67, 0x6,0x41,0x68, 0x5,0x33,0x49, + 0x5,0x39,0x77, 0x4,0x32,0x7d, 0x4,0x32,0x7c, 0x5,0x33,0x4b, + 0x5,0x33,0x4c, 0xf,0x36,0x54, 0xf,0x36,0x55, 0x6,0x41,0x65, + 0x6,0x41,0x69, 0x6,0x41,0x64, 0x5,0x33,0x48, 0x4,0x38,0x71, + 0x4,0x38,0x74, 0x5,0x39,0x7d, 0x6,0x4b,0x34, 0x5,0x39,0x79, + 0x5,0x39,0x7b, 0x5,0x39,0x78, 0x6,0x4b,0x32, 0x6,0x4b,0x35, + 0xf,0x3d,0x27, 0xf,0x3d,0x28, 0x6,0x4b,0x33, 0x6,0x4b,0x30, + 0x6,0x4b,0x31, 0x5,0x39,0x7a, 0x5,0x39,0x7c, 0x5,0x33,0x4a, + 0xf,0x3d,0x29, 0x6,0x4b,0x36, 0x5,0x47,0x2b, 0x5,0x40,0x3e, + 0x5,0x40,0x3c, 0x4,0x3e,0x50, 0x6,0x5e,0x64, 0x6,0x54,0x73, + 0x5,0x47,0x26, 0x6,0x54,0x72, 0x6,0x54,0x75, 0x6,0x54,0x74, + 0xf,0x43,0x40, 0xf,0x43,0x41, 0x5,0x40,0x3d, 0x6,0x54,0x77, + 0x5,0x40,0x3b, 0x4,0x44,0x61, 0x5,0x47,0x2d, 0x5,0x47,0x28, + 0x5,0x47,0x2e, 0x5,0x47,0x2c, 0x6,0x5e,0x5f, 0x6,0x5e,0x63, + 0x5,0x47,0x27, 0x5,0x47,0x2a, 0x6,0x5e,0x67, 0x6,0x5e,0x62, + 0x6,0x5e,0x61, 0x5,0x40,0x3a, 0x6,0x5e,0x66, 0xf,0x49,0x68, + 0xf,0x49,0x69, 0xf,0x49,0x6a, 0xf,0x49,0x6b, 0x5,0x47,0x2f, + 0x5,0x47,0x29, 0x6,0x5e,0x60, 0x6,0x54,0x76, 0x6,0x5e,0x65, + 0xf,0x49,0x6c, 0x5,0x47,0x30, 0x5,0x4e,0x36, 0x7,0x25,0x26, + 0x4,0x4a,0x74, 0x5,0x4e,0x39, 0x5,0x4e,0x3a, 0x5,0x4e,0x38, + 0x4,0x4a,0x70, 0x5,0x4e,0x35, 0xf,0x50,0x3f, 0x7,0x25,0x28, + 0x7,0x25,0x27, 0x7,0x2f,0x70, 0x5,0x55,0x49, 0x5,0x55,0x4e, + 0x7,0x2f,0x71, 0x5,0x55,0x4b, 0x5,0x55,0x4d, 0x5,0x55,0x4a, + 0x5,0x55,0x4c, 0x7,0x2f,0x6f, 0x7,0x39,0x30, 0x7,0x39,0x2e, + 0x5,0x5c,0x27, 0x4,0x56,0x68, 0x4,0x56,0x69, 0x7,0x2f,0x6e, + 0x7,0x39,0x2f, 0x7,0x40,0x57, 0x7,0x40,0x58, 0x5,0x68,0x3a, + 0x7,0x53,0x6a, 0x7,0x47,0x72, 0x7,0x47,0x73, 0x7,0x47,0x71, + 0x5,0x68,0x39, 0x7,0x4e,0x3f, 0x5,0x6c,0x54, 0x5,0x6c,0x55, + 0x5,0x70,0x45, 0x7,0x53,0x6c, 0x5,0x70,0x44, 0x5,0x70,0x46, + 0x7,0x58,0x3a, 0x5,0x73,0x59, 0x7,0x5b,0x74, 0x5,0x73,0x58, + 0x7,0x5b,0x75, 0x7,0x5b,0x73, 0x5,0x77,0x69, 0x7,0x61,0x23, + 0xf,0x6c,0x31, 0x7,0x64,0x50, 0xf,0x21,0x3d, 0x6,0x23,0x32, + 0x5,0x21,0x77, 0x5,0x21,0x78, 0x5,0x22,0x78, 0x5,0x22,0x7b, + 0x5,0x22,0x77, 0x4,0x23,0x28, 0x5,0x22,0x7a, 0x6,0x25,0x37, + 0x5,0x22,0x79, 0x5,0x24,0x5e, 0x5,0x24,0x5f, 0x4,0x24,0x5b, + 0x4,0x27,0x37, 0x6,0x28,0x58, 0x4,0x24,0x5a, 0x5,0x24,0x5a, + 0x6,0x28,0x5e, 0x5,0x24,0x5b, 0x6,0x28,0x5b, 0x5,0x27,0x2f, + 0x6,0x2c,0x72, 0x4,0x24,0x57, 0x5,0x24,0x5d, 0x5,0x24,0x5c, + 0x6,0x28,0x5a, 0x6,0x28,0x59, 0x6,0x2c,0x73, 0xf,0x24,0x77, + 0x6,0x28,0x57, 0x6,0x28,0x5c, 0x6,0x28,0x5d, 0x6,0x28,0x56, + 0x4,0x24,0x58, 0x6,0x2c,0x7a, 0x5,0x27,0x28, 0x6,0x2c,0x7b, + 0x5,0x27,0x2c, 0x6,0x2c,0x79, 0x6,0x2c,0x7c, 0x5,0x27,0x27, + 0x5,0x27,0x2a, 0x6,0x2c,0x78, 0x5,0x27,0x2d, 0x5,0x27,0x25, + 0x5,0x27,0x29, 0x5,0x27,0x24, 0x6,0x2c,0x77, 0x4,0x27,0x38, + 0x5,0x2a,0x36, 0x6,0x28,0x55, 0x6,0x32,0x60, 0x5,0x27,0x2b, + 0x6,0x2c,0x76, 0xf,0x28,0x22, 0x6,0x2c,0x7d, 0x6,0x2c,0x74, + 0x4,0x27,0x35, 0x5,0x2a,0x35, 0x5,0x2a,0x3e, 0x6,0x32,0x68, + 0x5,0x2a,0x39, 0x6,0x39,0x4b, 0x5,0x2a,0x3d, 0x6,0x32,0x61, + 0x6,0x39,0x4c, 0x6,0x41,0x6c, 0x5,0x2a,0x3c, 0x4,0x2a,0x31, + 0x5,0x2a,0x3b, 0x6,0x32,0x64, 0x5,0x2a,0x3a, 0x6,0x32,0x66, + 0x4,0x2a,0x33, 0x5,0x2a,0x40, 0x6,0x32,0x63, 0x5,0x27,0x26, + 0x5,0x2a,0x37, 0x5,0x2a,0x38, 0xf,0x2c,0x2a, 0xf,0x2c,0x2c, + 0xf,0x2c,0x2d, 0x6,0x32,0x65, 0xf,0x2c,0x2b, 0x5,0x2a,0x3f, + 0x6,0x39,0x4e, 0x5,0x2e,0x5e, 0x4,0x33,0x21, 0x6,0x39,0x49, + 0x6,0x39,0x4d, 0x4,0x2e,0x25, 0x5,0x2e,0x5b, 0x5,0x2e,0x60, + 0x5,0x2e,0x5d, 0x4,0x2e,0x23, 0x6,0x39,0x45, 0x6,0x39,0x4a, + 0xf,0x30,0x77, 0xf,0x30,0x78, 0x6,0x39,0x48, 0x5,0x2e,0x5a, + 0x4,0x2e,0x24, 0x6,0x39,0x47, 0x6,0x39,0x4f, 0x5,0x2e,0x5f, + 0x6,0x39,0x46, 0x5,0x33,0x4e, 0xf,0x30,0x76, 0x4,0x33,0x24, + 0x6,0x41,0x6e, 0x5,0x33,0x55, 0x5,0x39,0x7e, 0x5,0x33,0x52, + 0x6,0x41,0x70, 0x6,0x41,0x73, 0x5,0x33,0x4f, 0x6,0x41,0x6f, + 0x6,0x4b,0x3b, 0x4,0x33,0x26, 0x5,0x33,0x53, 0x6,0x4b,0x38, + 0x6,0x4b,0x37, 0x5,0x33,0x50, 0x6,0x4b,0x39, 0x6,0x41,0x71, + 0x6,0x41,0x72, 0x6,0x41,0x74, 0x6,0x4b,0x3a, 0x5,0x3a,0x28, + 0x6,0x54,0x7b, 0x5,0x3a,0x26, 0x5,0x40,0x3f, 0x4,0x38,0x75, + 0x5,0x3a,0x22, 0x6,0x4b,0x44, 0x5,0x40,0x40, 0x5,0x3a,0x27, + 0x4,0x38,0x76, 0x5,0x3a,0x25, 0x5,0x3a,0x24, 0x4,0x38,0x78, + 0x6,0x4b,0x3f, 0x4,0x3e,0x51, 0x5,0x3a,0x21, 0x6,0x4b,0x3c, + 0x6,0x4b,0x3e, 0x4,0x3e,0x57, 0xf,0x3d,0x2a, 0xf,0x3d,0x2b, + 0x6,0x54,0x79, 0x6,0x52,0x72, 0x6,0x54,0x7a, 0x6,0x4b,0x40, + 0x6,0x4b,0x41, 0x6,0x4b,0x45, 0x6,0x4b,0x3d, 0x5,0x3a,0x23, + 0xf,0x43,0x43, 0x4,0x3e,0x56, 0x5,0x40,0x48, 0x6,0x55,0x22, + 0x5,0x40,0x47, 0x4,0x3e,0x55, 0x6,0x55,0x27, 0x5,0x40,0x4b, + 0x6,0x55,0x24, 0x6,0x54,0x7e, 0x6,0x54,0x7d, 0x6,0x55,0x26, + 0x5,0x40,0x46, 0x5,0x40,0x44, 0x5,0x40,0x43, 0x6,0x55,0x21, + 0x5,0x40,0x42, 0x6,0x55,0x28, 0x5,0x40,0x4a, 0x5,0x40,0x41, + 0x4,0x3e,0x58, 0x5,0x40,0x49, 0x6,0x55,0x25, 0xf,0x43,0x45, + 0xf,0x43,0x46, 0xf,0x49,0x70, 0xf,0x50,0x40, 0x5,0x40,0x45, + 0x6,0x55,0x23, 0x5,0x40,0x4c, 0x6,0x5e,0x6d, 0x5,0x47,0x3a, + 0x6,0x5e,0x69, 0x7,0x25,0x29, 0x5,0x47,0x37, 0x4,0x44,0x6b, + 0x5,0x47,0x35, 0x5,0x47,0x33, 0x6,0x5e,0x6c, 0x5,0x47,0x3b, + 0x5,0x47,0x36, 0x5,0x47,0x34, 0x6,0x5e,0x70, 0x4,0x44,0x6c, + 0x5,0x47,0x31, 0xf,0x49,0x6d, 0x7,0x25,0x2a, 0xf,0x49,0x6f, + 0x6,0x5e,0x6b, 0x6,0x5e,0x68, 0x6,0x5e,0x6a, 0x6,0x5e,0x6f, + 0x4,0x4a,0x7d, 0x5,0x47,0x3d, 0x5,0x47,0x3c, 0x5,0x47,0x39, + 0x5,0x47,0x38, 0x6,0x5e,0x71, 0x5,0x47,0x32, 0x7,0x25,0x31, + 0x4,0x4a,0x78, 0x4,0x4a,0x79, 0x7,0x25,0x30, 0x5,0x4e,0x3c, + 0x7,0x25,0x34, 0x7,0x2f,0x73, 0x5,0x4e,0x41, 0x7,0x25,0x2f, + 0x7,0x25,0x2b, 0x5,0x4e,0x3e, 0x5,0x4e,0x45, 0x5,0x4e,0x3b, + 0x5,0x4e,0x44, 0x5,0x4e,0x43, 0x5,0x4e,0x3d, 0x5,0x55,0x4f, + 0x7,0x2f,0x72, 0x5,0x4e,0x3f, 0x5,0x4e,0x40, 0x5,0x4e,0x46, + 0x7,0x25,0x2c, 0x7,0x25,0x2d, 0xf,0x55,0x75, 0x5,0x55,0x50, + 0x7,0x25,0x2e, 0x7,0x25,0x33, 0xf,0x49,0x6e, 0x4,0x51,0x33, + 0x5,0x4e,0x42, 0x5,0x55,0x57, 0x4,0x51,0x35, 0x5,0x55,0x55, + 0x5,0x55,0x51, 0x5,0x55,0x52, 0x7,0x2f,0x79, 0x4,0x51,0x31, + 0x7,0x2f,0x78, 0x7,0x2f,0x77, 0x5,0x5c,0x28, 0x4,0x51,0x36, + 0x5,0x55,0x53, 0x5,0x55,0x56, 0x7,0x2f,0x75, 0x7,0x39,0x32, + 0x4,0x56,0x6d, 0x7,0x39,0x31, 0x7,0x2f,0x76, 0x7,0x25,0x32, + 0xf,0x55,0x77, 0x7,0x25,0x35, 0x5,0x55,0x54, 0x5,0x5c,0x2a, + 0x7,0x39,0x33, 0x5,0x5c,0x29, 0x7,0x47,0x77, 0x7,0x39,0x35, + 0x7,0x39,0x34, 0xf,0x5b,0x29, 0xf,0x5b,0x2a, 0xf,0x5b,0x2b, + 0xf,0x5b,0x2c, 0x7,0x40,0x5d, 0x5,0x62,0x55, 0x5,0x62,0x54, + 0x7,0x40,0x5a, 0x7,0x40,0x59, 0x7,0x40,0x5c, 0x4,0x5b,0x68, + 0x7,0x40,0x5b, 0xf,0x5f,0x4e, 0xf,0x5f,0x4f, 0x5,0x62,0x56, + 0x4,0x63,0x64, 0x7,0x47,0x78, 0x7,0x4e,0x40, 0x7,0x47,0x76, + 0x7,0x47,0x74, 0x7,0x4e,0x41, 0x5,0x6c,0x56, 0x7,0x4e,0x42, + 0x5,0x70,0x48, 0x7,0x53,0x6d, 0x5,0x70,0x47, 0x4,0x68,0x74, + 0x5,0x70,0x49, 0x7,0x58,0x3b, 0x7,0x5b,0x76, 0x7,0x5b,0x78, + 0x7,0x5b,0x77, 0x5,0x77,0x6a, 0x7,0x5e,0x7a, 0xf,0x6b,0x55, + 0x7,0x61,0x24, 0x7,0x63,0x59, 0xf,0x28,0x23, 0x6,0x4b,0x46, + 0x6,0x5e,0x72, 0x5,0x21,0x4c, 0x6,0x25,0x38, 0x6,0x23,0x33, + 0x6,0x28,0x5f, 0x5,0x24,0x61, 0x4,0x24,0x5d, 0x4,0x24,0x5c, + 0x6,0x28,0x61, 0x6,0x28,0x60, 0xf,0x24,0x79, 0x5,0x24,0x60, + 0x5,0x27,0x30, 0x6,0x2d,0x25, 0x4,0x27,0x3c, 0x5,0x2a,0x41, + 0xf,0x28,0x25, 0xf,0x28,0x26, 0xf,0x28,0x27, 0xf,0x28,0x28, + 0xf,0x28,0x29, 0x6,0x2d,0x23, 0xf,0x2c,0x40, 0xf,0x28,0x24, + 0x6,0x2d,0x22, 0xf,0x2c,0x3c, 0x6,0x32,0x69, 0x5,0x2a,0x45, + 0x5,0x2a,0x42, 0x4,0x2a,0x36, 0x6,0x32,0x6b, 0x6,0x2f,0x69, + 0xf,0x2c,0x2f, 0xf,0x2c,0x30, 0xf,0x2c,0x31, 0xf,0x2c,0x33, + 0xf,0x2c,0x34, 0xf,0x2c,0x35, 0xf,0x2c,0x36, 0xf,0x2c,0x37, + 0xf,0x2c,0x38, 0xf,0x2c,0x3a, 0xf,0x2c,0x3b, 0xf,0x2c,0x3d, + 0x6,0x32,0x6a, 0x6,0x32,0x6c, 0xf,0x2c,0x3e, 0xf,0x2c,0x3f, + 0xf,0x2c,0x2e, 0x5,0x2a,0x44, 0x5,0x2a,0x43, 0x6,0x39,0x53, + 0x5,0x33,0x56, 0x5,0x2e,0x61, 0x4,0x2e,0x29, 0x6,0x39,0x51, + 0x4,0x2e,0x28, 0x6,0x39,0x52, 0x6,0x39,0x54, 0xf,0x30,0x79, + 0xf,0x30,0x7a, 0xf,0x30,0x7b, 0xf,0x30,0x7c, 0xf,0x30,0x7d, + 0xf,0x30,0x7e, 0xf,0x31,0x21, 0xf,0x31,0x23, 0xf,0x31,0x24, + 0xf,0x31,0x25, 0xf,0x31,0x26, 0x6,0x39,0x50, 0xf,0x36,0x63, + 0x4,0x33,0x31, 0x6,0x39,0x55, 0x6,0x41,0x7a, 0x5,0x33,0x57, + 0x6,0x41,0x7b, 0x4,0x33,0x32, 0x6,0x41,0x77, 0x6,0x41,0x78, + 0x6,0x41,0x79, 0xf,0x31,0x22, 0xf,0x36,0x56, 0xf,0x36,0x58, + 0xf,0x36,0x5c, 0xf,0x36,0x5f, 0xf,0x36,0x60, 0xf,0x36,0x61, + 0xf,0x36,0x62, 0xf,0x36,0x64, 0xf,0x36,0x5d, 0x6,0x41,0x7c, + 0xf,0x36,0x5b, 0xf,0x36,0x5a, 0xf,0x36,0x5e, 0x5,0x33,0x58, + 0x6,0x41,0x76, 0xf,0x3d,0x3e, 0xf,0x3d,0x34, 0x6,0x4b,0x4b, + 0x5,0x3a,0x2b, 0x5,0x3a,0x2a, 0x5,0x3a,0x2c, 0x6,0x55,0x29, + 0x4,0x3e,0x5a, 0x5,0x40,0x4d, 0xf,0x3d,0x38, 0x4,0x38,0x7c, + 0x6,0x4b,0x49, 0x6,0x4b,0x4c, 0xf,0x3d,0x2c, 0xf,0x3d,0x2d, + 0xf,0x3d,0x2e, 0xf,0x3d,0x2f, 0xf,0x3d,0x30, 0xf,0x3d,0x32, + 0xf,0x3d,0x35, 0xf,0x3d,0x36, 0xf,0x3d,0x37, 0xf,0x3d,0x39, + 0xf,0x3d,0x3a, 0xf,0x3d,0x3f, 0xf,0x43,0x50, 0x6,0x4b,0x4e, + 0x6,0x55,0x32, 0x6,0x4b,0x4d, 0xf,0x3d,0x40, 0x6,0x4b,0x48, + 0x6,0x4b,0x4a, 0x6,0x55,0x2a, 0xf,0x3d,0x33, 0xf,0x3d,0x3d, + 0xf,0x3d,0x31, 0x5,0x3a,0x29, 0x6,0x55,0x2b, 0x6,0x55,0x30, + 0x4,0x3e,0x5b, 0x6,0x55,0x31, 0x6,0x55,0x2f, 0x6,0x55,0x2e, + 0x5,0x47,0x3e, 0xf,0x43,0x47, 0xf,0x43,0x4a, 0xf,0x43,0x4c, + 0xf,0x43,0x4d, 0xf,0x43,0x4e, 0xf,0x43,0x4f, 0xf,0x43,0x51, + 0xf,0x43,0x52, 0xf,0x43,0x53, 0xf,0x43,0x54, 0xf,0x43,0x55, + 0xf,0x43,0x57, 0xf,0x43,0x58, 0xf,0x43,0x5a, 0xf,0x43,0x5b, + 0xf,0x43,0x5c, 0xf,0x43,0x5d, 0xf,0x43,0x5e, 0xf,0x43,0x5f, + 0xf,0x43,0x60, 0xf,0x43,0x61, 0xf,0x43,0x62, 0xf,0x43,0x63, + 0xf,0x43,0x65, 0x6,0x55,0x2c, 0x5,0x40,0x4f, 0x5,0x3a,0x2e, + 0xf,0x43,0x4b, 0xf,0x43,0x48, 0x5,0x47,0x3f, 0x6,0x55,0x2d, + 0xf,0x43,0x59, 0xf,0x49,0x7a, 0xf,0x49,0x7b, 0xf,0x4a,0x26, + 0x7,0x25,0x38, 0x6,0x5e,0x74, 0x5,0x47,0x41, 0x7,0x25,0x36, + 0x4,0x44,0x6d, 0x5,0x47,0x40, 0x6,0x5e,0x75, 0x6,0x5e,0x77, + 0x6,0x5e,0x76, 0x6,0x5e,0x73, 0xf,0x49,0x71, 0xf,0x49,0x72, + 0xf,0x49,0x73, 0xf,0x49,0x74, 0xf,0x49,0x75, 0xf,0x49,0x77, + 0xf,0x49,0x78, 0xf,0x49,0x79, 0xf,0x49,0x7c, 0xf,0x49,0x7d, + 0xf,0x49,0x7e, 0xf,0x4a,0x21, 0xf,0x4a,0x22, 0xf,0x4a,0x24, + 0xf,0x4a,0x25, 0xf,0x4a,0x27, 0xf,0x4a,0x28, 0xf,0x4a,0x29, + 0x5,0x47,0x42, 0x3,0x48,0x26, 0x7,0x25,0x39, 0xf,0x4a,0x23, + 0x7,0x25,0x40, 0x4,0x4a,0x7e, 0x5,0x4e,0x47, 0x7,0x2f,0x7b, + 0x7,0x25,0x3a, 0x7,0x2f,0x7a, 0x7,0x25,0x3c, 0x7,0x25,0x3f, + 0x7,0x25,0x41, 0x7,0x25,0x42, 0xf,0x50,0x41, 0xf,0x50,0x42, + 0xf,0x50,0x43, 0xf,0x50,0x44, 0xf,0x50,0x45, 0xf,0x50,0x46, + 0xf,0x50,0x48, 0xf,0x50,0x49, 0xf,0x50,0x4a, 0xf,0x50,0x4b, + 0xf,0x50,0x4c, 0x7,0x25,0x3d, 0x5,0x4e,0x48, 0x7,0x25,0x3b, + 0x5,0x4e,0x49, 0xf,0x55,0x7c, 0xf,0x56,0x2e, 0xf,0x50,0x47, + 0x7,0x30,0x22, 0x7,0x25,0x3e, 0x5,0x55,0x58, 0x5,0x55,0x5b, + 0x5,0x55,0x59, 0x4,0x51,0x3b, 0x7,0x30,0x24, 0x7,0x2f,0x7d, + 0x7,0x2f,0x7e, 0x7,0x2f,0x7c, 0x4,0x51,0x3c, 0x7,0x30,0x21, + 0xf,0x55,0x78, 0xf,0x55,0x79, 0xf,0x55,0x7b, 0xf,0x55,0x7d, + 0xf,0x56,0x23, 0xf,0x56,0x24, 0xf,0x56,0x25, 0xf,0x56,0x26, + 0xf,0x56,0x27, 0xf,0x56,0x29, 0xf,0x56,0x2d, 0xf,0x56,0x2f, + 0x7,0x30,0x25, 0x7,0x30,0x23, 0x7,0x39,0x36, 0xf,0x56,0x30, + 0xf,0x56,0x21, 0xf,0x56,0x28, 0x5,0x55,0x5c, 0x5,0x55,0x5a, + 0xf,0x56,0x2c, 0x7,0x39,0x3b, 0x7,0x39,0x3d, 0x5,0x5c,0x2d, + 0x5,0x5c,0x2b, 0x7,0x40,0x5e, 0x7,0x39,0x39, 0x4,0x5b,0x6a, + 0x4,0x56,0x6e, 0x4,0x56,0x70, 0x7,0x39,0x38, 0xf,0x5b,0x2e, + 0xf,0x5b,0x2f, 0xf,0x5b,0x30, 0xf,0x5b,0x31, 0xf,0x5b,0x32, + 0xf,0x5b,0x33, 0xf,0x5b,0x34, 0xf,0x5b,0x35, 0x5,0x5c,0x2c, + 0x7,0x39,0x3a, 0x7,0x39,0x3c, 0x7,0x39,0x37, 0x7,0x40,0x5f, + 0x5,0x68,0x3c, 0x4,0x5b,0x6b, 0x5,0x62,0x57, 0x4,0x60,0x26, + 0x7,0x40,0x60, 0x4,0x60,0x28, 0xf,0x5f,0x51, 0xf,0x5f,0x53, + 0xf,0x5f,0x54, 0xf,0x5f,0x55, 0xf,0x5f,0x57, 0xf,0x5f,0x59, + 0xf,0x5f,0x5a, 0xf,0x5f,0x5b, 0xf,0x5f,0x5c, 0xf,0x5f,0x5f, + 0x7,0x40,0x61, 0x7,0x40,0x62, 0xf,0x5f,0x50, 0xf,0x5f,0x52, + 0xf,0x5f,0x58, 0xf,0x63,0x23, 0x7,0x47,0x7c, 0x7,0x47,0x7b, + 0x5,0x68,0x3e, 0x7,0x47,0x7a, 0x7,0x4e,0x43, 0x5,0x68,0x3d, + 0x7,0x47,0x79, 0xf,0x62,0x7c, 0xf,0x62,0x7e, 0xf,0x63,0x21, + 0xf,0x63,0x22, 0x4,0x60,0x29, 0xf,0x62,0x79, 0xf,0x62,0x7a, + 0xf,0x62,0x7d, 0x7,0x53,0x6f, 0x5,0x6c,0x57, 0x4,0x66,0x52, + 0xf,0x65,0x52, 0xf,0x65,0x53, 0xf,0x65,0x54, 0xf,0x65,0x55, + 0x7,0x4e,0x44, 0x7,0x53,0x6e, 0xf,0x5f,0x5e, 0x4,0x66,0x51, + 0x7,0x55,0x7c, 0x4,0x66,0x53, 0x7,0x58,0x3c, 0xf,0x67,0x76, + 0x7,0x5b,0x79, 0x4,0x6a,0x52, 0xf,0x69,0x59, 0xf,0x69,0x5a, + 0x5,0x76,0x24, 0xf,0x6a,0x61, 0xf,0x6a,0x63, 0xf,0x6b,0x56, + 0xf,0x6a,0x62, 0x5,0x79,0x31, 0x7,0x61,0x26, 0x7,0x61,0x25, + 0xf,0x6c,0x32, 0x5,0x7a,0x2c, 0x4,0x6e,0x34, 0x6,0x2d,0x26, + 0x5,0x2a,0x47, 0x5,0x2a,0x46, 0x6,0x32,0x6d, 0xf,0x2c,0x41, + 0x6,0x32,0x6e, 0x6,0x39,0x56, 0x5,0x2e,0x63, 0x5,0x2e,0x64, + 0x6,0x39,0x57, 0x6,0x39,0x58, 0x4,0x33,0x36, 0x5,0x33,0x59, + 0x5,0x33,0x5a, 0xf,0x36,0x65, 0x5,0x3a,0x2f, 0x5,0x3a,0x30, + 0x6,0x4b,0x4f, 0xf,0x3d,0x41, 0x6,0x4b,0x50, 0x4,0x3e,0x5c, + 0x5,0x40,0x50, 0x5,0x40,0x51, 0xf,0x43,0x66, 0x7,0x25,0x45, + 0x6,0x5e,0x78, 0x5,0x47,0x43, 0xf,0x4a,0x2a, 0x5,0x47,0x44, + 0x7,0x25,0x44, 0x7,0x30,0x26, 0x4,0x51,0x3d, 0x5,0x4e,0x4a, + 0xf,0x50,0x4d, 0x7,0x25,0x43, 0x4,0x51,0x3e, 0x7,0x39,0x3e, + 0x5,0x62,0x58, 0xf,0x5f,0x60, 0x4,0x5b,0x6d, 0x4,0x66,0x54, + 0x7,0x53,0x70, 0x5,0x70,0x4a, 0x5,0x76,0x25, 0x7,0x5b,0x7a, + 0x7,0x5e,0x7b, 0x7,0x62,0x3b, 0x7,0x62,0x3c, 0x5,0x24,0x62, + 0x5,0x27,0x31, 0x4,0x27,0x3d, 0x6,0x2d,0x27, 0x5,0x2a,0x48, + 0x5,0x2a,0x49, 0x6,0x32,0x6f, 0x4,0x2a,0x3b, 0x4,0x2a,0x3e, + 0x5,0x2e,0x65, 0x5,0x2e,0x67, 0x6,0x39,0x5c, 0x5,0x2e,0x66, + 0xf,0x31,0x29, 0x6,0x39,0x5b, 0x6,0x39,0x59, 0x6,0x39,0x5a, + 0x5,0x33,0x5d, 0x6,0x42,0x22, 0x6,0x41,0x7e, 0x6,0x42,0x24, + 0x5,0x33,0x5e, 0x6,0x42,0x23, 0x5,0x33,0x5c, 0xf,0x36,0x66, + 0xf,0x36,0x68, 0x4,0x39,0x22, 0x5,0x3a,0x31, 0x6,0x55,0x36, + 0x4,0x39,0x27, 0x5,0x3a,0x34, 0x5,0x3a,0x33, 0x5,0x33,0x5f, + 0x6,0x4b,0x52, 0x5,0x3a,0x32, 0x5,0x33,0x5b, 0x6,0x4b,0x51, + 0x6,0x4b,0x53, 0x4,0x3e,0x64, 0x5,0x40,0x52, 0x6,0x55,0x37, + 0x4,0x3e,0x5e, 0x5,0x40,0x53, 0x6,0x55,0x33, 0x6,0x55,0x35, + 0x4,0x3e,0x5f, 0x6,0x55,0x38, 0xf,0x43,0x67, 0x6,0x55,0x34, + 0x5,0x47,0x47, 0x6,0x5e,0x7c, 0x5,0x47,0x45, 0x6,0x5e,0x7a, + 0x4,0x44,0x72, 0x6,0x5e,0x79, 0x6,0x5e,0x7b, 0x5,0x47,0x46, + 0x4,0x4b,0x28, 0x7,0x25,0x4a, 0x5,0x4e,0x4c, 0x5,0x4e,0x4d, + 0x5,0x4e,0x4e, 0x7,0x25,0x46, 0x7,0x25,0x47, 0x7,0x25,0x49, + 0x7,0x30,0x27, 0x4,0x56,0x74, 0x7,0x30,0x28, 0x5,0x55,0x5f, + 0x5,0x55,0x61, 0x4,0x51,0x40, 0x5,0x55,0x60, 0x5,0x55,0x5e, + 0x4,0x56,0x76, 0x5,0x5c,0x2e, 0x4,0x56,0x77, 0x7,0x39,0x40, + 0x7,0x39,0x3f, 0x5,0x4e,0x4b, 0x4,0x5b,0x70, 0x5,0x62,0x5b, + 0x5,0x62,0x5a, 0x7,0x40,0x64, 0x5,0x62,0x59, 0x7,0x40,0x65, + 0x5,0x68,0x3f, 0x7,0x4e,0x45, 0x7,0x53,0x71, 0x7,0x53,0x72, + 0x4,0x66,0x56, 0x5,0x70,0x4b, 0x4,0x66,0x55, 0x7,0x53,0x73, + 0x4,0x68,0x76, 0x7,0x58,0x3d, 0x5,0x73,0x5a, 0x5,0x76,0x28, + 0x5,0x76,0x27, 0x7,0x5b,0x7b, 0x5,0x76,0x26, 0x7,0x5c,0x6b, + 0x5,0x7a,0x6c, 0x7,0x65,0x38, 0x6,0x23,0x34, 0x6,0x2d,0x28, + 0x5,0x27,0x33, 0x4,0x27,0x3e, 0xf,0x28,0x2b, 0x6,0x32,0x70, + 0xf,0x2c,0x43, 0x5,0x40,0x54, 0x6,0x5e,0x7d, 0x7,0x30,0x2b, + 0x7,0x30,0x29, 0x7,0x30,0x2a, 0x4,0x56,0x79, 0x7,0x40,0x66, + 0x5,0x70,0x4c, 0x6,0x23,0x35, 0x6,0x25,0x39, 0x6,0x2d,0x29, + 0x5,0x27,0x34, 0x6,0x2d,0x2a, 0xf,0x2c,0x44, 0xf,0x2c,0x45, + 0x5,0x2a,0x4a, 0x4,0x2a,0x3f, 0x6,0x32,0x71, 0x6,0x34,0x79, + 0x5,0x2e,0x69, 0x6,0x42,0x26, 0x5,0x33,0x60, 0x6,0x42,0x25, + 0x6,0x42,0x27, 0xf,0x36,0x69, 0x6,0x55,0x39, 0x6,0x4b,0x54, + 0xf,0x3d,0x43, 0xf,0x3d,0x42, 0x6,0x55,0x3b, 0xf,0x43,0x68, + 0x6,0x55,0x3a, 0x6,0x5e,0x7e, 0x7,0x25,0x4b, 0xf,0x4a,0x2b, + 0x4,0x56,0x7a, 0xf,0x5b,0x36, 0xf,0x63,0x26, 0x7,0x46,0x6e, + 0xf,0x63,0x25, 0x7,0x53,0x74, 0x6,0x25,0x3a, 0xf,0x24,0x7a, + 0x5,0x27,0x35, 0x6,0x2d,0x2e, 0x6,0x39,0x5d, 0x5,0x33,0x61, + 0xf,0x4a,0x2c, 0xf,0x5f,0x61, 0x7,0x47,0x7d, 0xf,0x6c,0x33, + 0x5,0x73,0x5b, 0x4,0x24,0x5f, 0xf,0x24,0x7c, 0xf,0x24,0x7b, + 0x6,0x28,0x63, 0x4,0x27,0x42, 0x4,0x25,0x53, 0x4,0x27,0x3f, + 0x5,0x27,0x36, 0x6,0x2d,0x31, 0x6,0x2d,0x30, 0x6,0x2d,0x33, + 0xf,0x28,0x2c, 0xf,0x28,0x2d, 0x6,0x2d,0x2f, 0x4,0x2a,0x42, + 0x5,0x2a,0x4d, 0x6,0x32,0x74, 0x5,0x2a,0x4c, 0x6,0x32,0x73, + 0x5,0x2a,0x4b, 0x6,0x32,0x76, 0x6,0x32,0x7a, 0x6,0x32,0x77, + 0x6,0x39,0x65, 0x5,0x2a,0x4e, 0x6,0x32,0x78, 0x6,0x32,0x75, + 0x5,0x2e,0x6e, 0xf,0x2c,0x46, 0xf,0x2c,0x47, 0xf,0x2c,0x48, + 0xf,0x2c,0x49, 0xf,0x2c,0x4b, 0xf,0x2c,0x4c, 0xf,0x2c,0x4d, + 0xf,0x2c,0x4e, 0xf,0x2c,0x4f, 0x5,0x2a,0x4f, 0x5,0x2e,0x6a, + 0x4,0x2e,0x2e, 0x5,0x2e,0x6b, 0x6,0x39,0x61, 0x6,0x39,0x60, + 0x6,0x39,0x62, 0x6,0x39,0x5f, 0x6,0x39,0x63, 0xf,0x31,0x2a, + 0xf,0x31,0x2b, 0xf,0x31,0x2c, 0xf,0x31,0x2e, 0x4,0x2e,0x30, + 0xf,0x31,0x2d, 0x5,0x2e,0x6d, 0x5,0x2e,0x6c, 0x4,0x33,0x3e, + 0x6,0x42,0x28, 0x5,0x33,0x63, 0x5,0x33,0x62, 0x4,0x33,0x3d, + 0x6,0x42,0x2c, 0x6,0x42,0x2f, 0x6,0x42,0x2a, 0x6,0x42,0x2d, + 0x6,0x42,0x2e, 0xf,0x36,0x6b, 0xf,0x36,0x6c, 0x6,0x42,0x2b, + 0x6,0x42,0x29, 0x6,0x41,0x6b, 0x4,0x39,0x2b, 0x4,0x39,0x29, + 0x4,0x39,0x2a, 0x6,0x4b,0x57, 0x6,0x4b,0x59, 0xf,0x36,0x6a, + 0xf,0x3d,0x46, 0xf,0x3d,0x47, 0xf,0x3d,0x48, 0x6,0x4b,0x58, + 0x4,0x39,0x2d, 0x6,0x4b,0x55, 0xf,0x3d,0x44, 0xf,0x3d,0x45, + 0x6,0x55,0x40, 0x4,0x3e,0x6a, 0x4,0x3e,0x67, 0x6,0x55,0x3e, + 0x6,0x55,0x3f, 0x4,0x3e,0x66, 0x5,0x40,0x56, 0x6,0x55,0x3c, + 0x6,0x55,0x42, 0x5,0x40,0x55, 0x6,0x55,0x43, 0x6,0x55,0x44, + 0x6,0x55,0x41, 0xf,0x43,0x69, 0xf,0x43,0x6a, 0x5,0x40,0x57, + 0x6,0x55,0x3d, 0x6,0x5f,0x23, 0x4,0x44,0x7a, 0x5,0x47,0x4a, + 0x6,0x5f,0x22, 0x6,0x5f,0x25, 0x6,0x5f,0x28, 0xf,0x4a,0x2d, + 0x6,0x5f,0x26, 0x6,0x5f,0x24, 0x6,0x5f,0x27, 0x7,0x25,0x50, + 0x4,0x4b,0x2c, 0x7,0x25,0x4c, 0x7,0x25,0x4e, 0x7,0x25,0x4d, + 0x7,0x25,0x4f, 0x5,0x4e,0x4f, 0x7,0x25,0x51, 0xf,0x50,0x4f, + 0x4,0x4b,0x2b, 0x4,0x51,0x45, 0x4,0x51,0x43, 0x4,0x51,0x46, + 0x7,0x30,0x2c, 0x5,0x55,0x62, 0xf,0x56,0x32, 0x7,0x2c,0x3b, + 0x7,0x39,0x41, 0x5,0x5c,0x33, 0x7,0x39,0x43, 0x5,0x5c,0x31, + 0x4,0x56,0x7b, 0x7,0x39,0x42, 0x5,0x5c,0x34, 0xf,0x5b,0x37, + 0x7,0x3c,0x76, 0x5,0x5c,0x30, 0x5,0x5c,0x32, 0xf,0x56,0x31, + 0x4,0x5b,0x71, 0x7,0x47,0x7e, 0x5,0x68,0x41, 0x7,0x48,0x23, + 0x7,0x4e,0x46, 0x7,0x48,0x21, 0x7,0x48,0x24, 0x4,0x60,0x2d, + 0x7,0x48,0x22, 0x7,0x4e,0x48, 0x7,0x4e,0x47, 0x7,0x53,0x77, + 0xf,0x67,0x77, 0x7,0x53,0x75, 0x7,0x53,0x76, 0xf,0x67,0x52, + 0x7,0x58,0x3e, 0x4,0x68,0x77, 0x7,0x53,0x78, 0x7,0x5b,0x7d, + 0xf,0x6a,0x64, 0x7,0x5b,0x7c, 0x7,0x5e,0x7c, 0x7,0x62,0x3e, + 0x7,0x62,0x3d, 0x7,0x63,0x5a, 0x7,0x63,0x5c, 0x7,0x63,0x5b, + 0x7,0x66,0x29, 0x7,0x66,0x35, 0x7,0x66,0x46, 0x6,0x23,0x36, + 0x6,0x25,0x3b, 0xf,0x28,0x2e, 0x4,0x2e,0x32, 0x5,0x2a,0x50, + 0x4,0x39,0x2e, 0x6,0x55,0x46, 0x6,0x55,0x45, 0x6,0x5f,0x29, + 0x5,0x55,0x63, 0x7,0x30,0x2e, 0x7,0x25,0x52, 0x7,0x58,0x3f, + 0x5,0x22,0x7c, 0x5,0x24,0x64, 0x5,0x24,0x65, 0x4,0x24,0x60, + 0x6,0x28,0x66, 0x6,0x28,0x67, 0x6,0x28,0x65, 0x6,0x28,0x68, + 0x4,0x27,0x45, 0x6,0x2d,0x35, 0x4,0x27,0x44, 0xf,0x28,0x2f, + 0x5,0x27,0x38, 0x6,0x2d,0x36, 0x6,0x32,0x7d, 0x4,0x2a,0x4b, + 0x6,0x32,0x7c, 0x6,0x32,0x7b, 0x5,0x2a,0x52, 0x5,0x2a,0x56, + 0x4,0x2a,0x47, 0x4,0x2a,0x48, 0x5,0x2a,0x53, 0x4,0x2a,0x45, + 0x5,0x2a,0x54, 0x5,0x2a,0x51, 0x5,0x2a,0x55, 0x6,0x33,0x24, + 0xf,0x2c,0x50, 0x6,0x32,0x7e, 0xf,0x2c,0x51, 0x6,0x33,0x22, + 0x6,0x33,0x23, 0x6,0x33,0x21, 0x6,0x39,0x69, 0x5,0x2e,0x6f, + 0x5,0x2e,0x73, 0x6,0x39,0x6f, 0x5,0x2e,0x71, 0x6,0x39,0x70, + 0x6,0x39,0x6a, 0x5,0x2e,0x76, 0x5,0x2e,0x72, 0x5,0x2e,0x75, + 0x6,0x39,0x6d, 0x6,0x39,0x71, 0x6,0x39,0x66, 0x4,0x2e,0x3d, + 0x5,0x2e,0x74, 0x6,0x39,0x68, 0x4,0x2e,0x3e, 0x5,0x2e,0x70, + 0x6,0x39,0x6e, 0xf,0x31,0x2f, 0x6,0x39,0x67, 0x6,0x39,0x6c, + 0x6,0x42,0x31, 0x6,0x42,0x37, 0x5,0x33,0x68, 0x6,0x42,0x35, + 0x5,0x33,0x6b, 0x4,0x33,0x41, 0x5,0x33,0x6a, 0x5,0x33,0x66, + 0x6,0x42,0x33, 0x4,0x33,0x44, 0x5,0x33,0x69, 0xf,0x36,0x6d, + 0xf,0x36,0x6e, 0xf,0x36,0x6f, 0x6,0x42,0x36, 0x6,0x42,0x39, + 0x6,0x42,0x34, 0x6,0x42,0x38, 0xf,0x36,0x70, 0x6,0x42,0x30, + 0x5,0x33,0x67, 0x5,0x33,0x6c, 0x5,0x3a,0x36, 0x5,0x3a,0x3f, + 0x6,0x4b,0x61, 0x5,0x3a,0x35, 0x6,0x4b,0x65, 0x5,0x3a,0x39, + 0x5,0x3a,0x3a, 0x5,0x3a,0x3c, 0x5,0x3a,0x37, 0x6,0x4b,0x63, + 0x6,0x4b,0x5f, 0x5,0x3a,0x40, 0x6,0x4b,0x62, 0x6,0x4b,0x5b, + 0x6,0x4b,0x66, 0x5,0x3a,0x3e, 0x6,0x4b,0x5e, 0x4,0x39,0x39, + 0x6,0x4b,0x5d, 0x6,0x4b,0x60, 0x6,0x4b,0x64, 0xf,0x3d,0x49, + 0xf,0x3d,0x4a, 0x4,0x39,0x37, 0x6,0x4b,0x5c, 0x4,0x39,0x31, + 0x5,0x3a,0x38, 0x6,0x55,0x4c, 0x4,0x3e,0x72, 0x4,0x3e,0x70, + 0x4,0x3e,0x7b, 0x5,0x40,0x59, 0x4,0x3e,0x71, 0x4,0x3e,0x75, + 0x4,0x44,0x7d, 0x4,0x3e,0x79, 0x6,0x55,0x49, 0x5,0x40,0x5a, + 0x5,0x40,0x5c, 0x5,0x40,0x62, 0x4,0x3e,0x7c, 0x6,0x55,0x47, + 0x5,0x40,0x61, 0x6,0x55,0x4d, 0x5,0x40,0x65, 0x5,0x40,0x63, + 0x5,0x40,0x5b, 0x5,0x3a,0x3d, 0x5,0x40,0x5f, 0x5,0x40,0x5e, + 0x6,0x55,0x4b, 0x6,0x55,0x4a, 0x4,0x3e,0x7d, 0xf,0x43,0x6b, + 0xf,0x43,0x6c, 0x6,0x55,0x48, 0x6,0x55,0x4e, 0x5,0x40,0x58, + 0x5,0x40,0x66, 0x5,0x40,0x5d, 0x5,0x47,0x58, 0x5,0x47,0x50, + 0x4,0x45,0x25, 0x4,0x45,0x2b, 0x5,0x47,0x4b, 0x5,0x47,0x4f, + 0x4,0x45,0x26, 0x6,0x5f,0x2f, 0x6,0x5f,0x2a, 0x4,0x45,0x2e, + 0x4,0x45,0x2a, 0x6,0x5f,0x2b, 0x6,0x5f,0x34, 0x5,0x47,0x4d, + 0x5,0x47,0x4e, 0x5,0x47,0x53, 0x4,0x45,0x2c, 0x6,0x5f,0x37, + 0x6,0x5f,0x35, 0x5,0x47,0x5a, 0x6,0x5f,0x2e, 0x4,0x45,0x27, + 0x4,0x45,0x22, 0x5,0x47,0x51, 0x5,0x47,0x52, 0x6,0x5f,0x33, + 0x5,0x47,0x4c, 0x5,0x47,0x56, 0x6,0x5f,0x31, 0x6,0x5f,0x30, + 0xf,0x4a,0x2e, 0x6,0x5f,0x38, 0x6,0x5f,0x2c, 0x4,0x45,0x2d, + 0x6,0x5f,0x32, 0x6,0x5f,0x36, 0x5,0x47,0x55, 0x4,0x4b,0x3a, + 0x4,0x4b,0x36, 0x4,0x4b,0x2d, 0x4,0x4b,0x39, 0x5,0x4e,0x53, + 0x4,0x4b,0x34, 0x7,0x25,0x5d, 0x4,0x4b,0x32, 0x5,0x4e,0x55, + 0x5,0x4e,0x57, 0x5,0x4e,0x54, 0x4,0x4b,0x31, 0x7,0x25,0x55, + 0x4,0x4b,0x30, 0x5,0x4e,0x51, 0x5,0x4e,0x52, 0x7,0x25,0x53, + 0x5,0x47,0x57, 0x5,0x4e,0x58, 0x7,0x25,0x54, 0x7,0x25,0x5b, + 0x7,0x25,0x59, 0xf,0x50,0x50, 0xf,0x50,0x51, 0xf,0x50,0x52, + 0xf,0x50,0x53, 0xf,0x50,0x54, 0x7,0x25,0x56, 0x7,0x25,0x5a, + 0x7,0x25,0x5e, 0x5,0x4e,0x56, 0x5,0x4e,0x50, 0x4,0x51,0x4b, + 0x5,0x55,0x65, 0x7,0x30,0x2f, 0x7,0x30,0x30, 0x5,0x55,0x6c, + 0x5,0x55,0x6d, 0x4,0x51,0x4c, 0x4,0x51,0x47, 0x5,0x55,0x68, + 0x7,0x30,0x35, 0x5,0x55,0x66, 0x5,0x55,0x67, 0x5,0x55,0x6b, + 0x7,0x30,0x31, 0x7,0x30,0x37, 0x5,0x55,0x6e, 0xf,0x56,0x34, + 0xf,0x56,0x35, 0x7,0x30,0x34, 0x7,0x30,0x33, 0x5,0x55,0x6a, + 0x7,0x30,0x32, 0x7,0x30,0x38, 0x7,0x30,0x39, 0x5,0x55,0x64, + 0x7,0x25,0x57, 0x4,0x56,0x7c, 0x5,0x5c,0x39, 0x5,0x55,0x70, + 0x7,0x39,0x50, 0x4,0x51,0x51, 0x4,0x45,0x29, 0x4,0x56,0x7e, + 0x7,0x39,0x47, 0x5,0x5c,0x35, 0x7,0x39,0x48, 0x5,0x5c,0x3c, + 0x5,0x5c,0x3a, 0x5,0x5c,0x3d, 0x7,0x39,0x4f, 0x7,0x40,0x6a, + 0x5,0x55,0x6f, 0x5,0x5c,0x37, 0x4,0x56,0x7d, 0x5,0x5c,0x38, + 0x4,0x57,0x23, 0x7,0x39,0x49, 0x7,0x39,0x4d, 0x7,0x39,0x51, + 0x7,0x39,0x4b, 0x7,0x39,0x46, 0x7,0x39,0x4c, 0xf,0x5b,0x38, + 0x7,0x39,0x44, 0x7,0x39,0x45, 0x7,0x39,0x4e, 0x5,0x5c,0x3b, + 0x5,0x62,0x5c, 0x5,0x5c,0x3e, 0x7,0x39,0x4a, 0x4,0x5b,0x78, + 0x5,0x5c,0x40, 0x5,0x62,0x60, 0x7,0x40,0x68, 0x5,0x62,0x65, + 0x7,0x40,0x69, 0x5,0x62,0x61, 0x5,0x62,0x64, 0x4,0x5b,0x76, + 0x5,0x5c,0x3f, 0x5,0x62,0x5d, 0x5,0x62,0x62, 0x5,0x62,0x5e, + 0x5,0x62,0x5f, 0x4,0x5b,0x7a, 0x7,0x40,0x6d, 0x5,0x62,0x63, + 0x7,0x48,0x2b, 0x4,0x60,0x33, 0x7,0x48,0x27, 0x4,0x60,0x34, + 0x5,0x68,0x44, 0x4,0x60,0x35, 0x7,0x48,0x26, 0x5,0x68,0x43, + 0x5,0x68,0x42, 0x4,0x60,0x36, 0xf,0x63,0x27, 0x4,0x60,0x31, + 0x7,0x48,0x28, 0x7,0x48,0x29, 0x7,0x48,0x25, 0x7,0x48,0x2a, + 0x7,0x40,0x6c, 0x4,0x63,0x6a, 0x4,0x63,0x6b, 0x7,0x4e,0x49, + 0x7,0x4e,0x4d, 0x7,0x4e,0x4c, 0x5,0x6c,0x58, 0x5,0x6c,0x59, + 0x7,0x4e,0x4e, 0x7,0x4e,0x4b, 0x7,0x4e,0x4a, 0x5,0x70,0x51, + 0x5,0x70,0x50, 0x5,0x70,0x4e, 0x4,0x66,0x57, 0x7,0x53,0x7a, + 0x5,0x70,0x4f, 0x7,0x53,0x79, 0xf,0x67,0x78, 0x5,0x73,0x5f, + 0x5,0x73,0x5e, 0x5,0x73,0x5d, 0x7,0x5c,0x22, 0x7,0x5b,0x7e, + 0x4,0x6a,0x56, 0x7,0x5c,0x21, 0x5,0x76,0x29, 0x5,0x77,0x6b, + 0x7,0x5e,0x7d, 0x7,0x5e,0x7e, 0x7,0x61,0x42, 0x7,0x61,0x27, + 0x7,0x62,0x3f, 0x7,0x62,0x40, 0x7,0x62,0x41, 0x5,0x7a,0x6d, + 0x7,0x64,0x51, 0x7,0x65,0x39, 0x4,0x24,0x63, 0x6,0x33,0x25, + 0xf,0x2c,0x52, 0x6,0x39,0x73, 0x6,0x39,0x72, 0xf,0x31,0x30, + 0x6,0x42,0x3a, 0xf,0x36,0x71, 0x6,0x4b,0x69, 0x6,0x4b,0x67, + 0x5,0x3a,0x41, 0x6,0x4b,0x68, 0x7,0x25,0x5f, 0x4,0x51,0x53, + 0x4,0x51,0x52, 0x7,0x30,0x3a, 0x6,0x25,0x3c, 0x6,0x25,0x3d, + 0x5,0x24,0x66, 0x5,0x27,0x3a, 0x5,0x27,0x3b, 0x5,0x27,0x39, + 0x5,0x27,0x3c, 0x4,0x2a,0x4d, 0x5,0x2a,0x59, 0x5,0x2a,0x58, + 0x5,0x2a,0x57, 0x6,0x33,0x27, 0x6,0x33,0x28, 0x6,0x33,0x26, + 0xf,0x2c,0x53, 0xf,0x2c,0x54, 0x6,0x33,0x29, 0x5,0x2a,0x5a, + 0x6,0x39,0x74, 0x4,0x2e,0x42, 0x6,0x39,0x75, 0x6,0x42,0x3c, + 0xf,0x31,0x31, 0xf,0x31,0x32, 0xf,0x31,0x33, 0xf,0x31,0x35, + 0xf,0x31,0x36, 0xf,0x36,0x75, 0x4,0x33,0x46, 0x5,0x33,0x6e, + 0x6,0x42,0x3b, 0xf,0x36,0x72, 0xf,0x36,0x73, 0xf,0x36,0x76, + 0x6,0x4b,0x6b, 0x6,0x4b,0x6c, 0x6,0x4b,0x6a, 0xf,0x36,0x74, + 0x5,0x40,0x68, 0x5,0x40,0x67, 0x6,0x55,0x50, 0x4,0x3e,0x7e, + 0x6,0x55,0x4f, 0x5,0x40,0x69, 0xf,0x43,0x6d, 0x4,0x45,0x2f, + 0x6,0x5f,0x39, 0x6,0x5f,0x3a, 0xf,0x4a,0x30, 0xf,0x4a,0x31, + 0xf,0x4a,0x33, 0xf,0x4a,0x34, 0xf,0x4a,0x32, 0x4,0x4b,0x3c, + 0x7,0x25,0x60, 0x7,0x25,0x61, 0x5,0x55,0x72, 0x7,0x30,0x3c, + 0x5,0x55,0x71, 0x7,0x30,0x3b, 0x4,0x57,0x27, 0x4,0x57,0x28, + 0x5,0x5c,0x42, 0x5,0x5c,0x44, 0x7,0x40,0x6e, 0x5,0x5c,0x41, + 0x7,0x39,0x52, 0x5,0x62,0x66, 0x7,0x40,0x6f, 0x7,0x40,0x70, + 0x5,0x68,0x45, 0x5,0x68,0x46, 0x5,0x68,0x47, 0x5,0x68,0x48, + 0x7,0x48,0x2c, 0x7,0x4e,0x50, 0x7,0x4e,0x4f, 0x5,0x62,0x67, + 0x7,0x58,0x40, 0x7,0x58,0x41, 0xf,0x67,0x79, 0x7,0x5c,0x23, + 0x4,0x6b,0x73, 0x7,0x5f,0x21, 0x7,0x65,0x3a, 0x5,0x24,0x67, + 0x5,0x24,0x68, 0x6,0x2d,0x39, 0x6,0x2d,0x37, 0x6,0x2d,0x38, + 0x5,0x27,0x3d, 0x6,0x33,0x2b, 0x5,0x2a,0x5b, 0x4,0x2a,0x4f, + 0x6,0x30,0x36, 0x6,0x33,0x2a, 0x5,0x2e,0x77, 0x5,0x2e,0x78, + 0x6,0x39,0x76, 0x6,0x39,0x7a, 0x5,0x33,0x6f, 0x4,0x2e,0x44, + 0x6,0x39,0x77, 0x6,0x39,0x78, 0x6,0x39,0x79, 0x4,0x33,0x49, + 0x5,0x33,0x70, 0x6,0x42,0x3e, 0xf,0x36,0x79, 0x6,0x42,0x3d, + 0x4,0x39,0x3c, 0x6,0x4b,0x6d, 0x5,0x3a,0x42, 0x6,0x4b,0x6f, + 0x4,0x39,0x3b, 0xf,0x3d,0x4b, 0x6,0x4b,0x6e, 0xf,0x36,0x78, + 0x5,0x40,0x6a, 0x5,0x40,0x6d, 0x5,0x40,0x6b, 0x5,0x40,0x6c, + 0x5,0x40,0x6e, 0x6,0x55,0x53, 0xf,0x43,0x6e, 0x6,0x55,0x51, + 0x4,0x3f,0x21, 0x4,0x45,0x31, 0x4,0x45,0x33, 0x6,0x5f,0x3e, + 0xf,0x4a,0x35, 0x6,0x5f,0x3d, 0x5,0x47,0x5c, 0x6,0x5f,0x3f, + 0x6,0x5f,0x3b, 0x6,0x5f,0x3c, 0x7,0x25,0x63, 0x5,0x4e,0x5a, + 0x5,0x4e,0x5b, 0x5,0x4e,0x5c, 0x7,0x25,0x62, 0x5,0x55,0x76, + 0x5,0x55,0x78, 0x5,0x55,0x74, 0x4,0x51,0x58, 0x5,0x55,0x77, + 0x5,0x55,0x75, 0xf,0x56,0x36, 0x5,0x55,0x73, 0x7,0x30,0x3d, + 0x7,0x30,0x3e, 0x7,0x39,0x53, 0x7,0x30,0x3f, 0x4,0x57,0x29, + 0x5,0x62,0x68, 0x7,0x40,0x72, 0x7,0x40,0x73, 0x7,0x40,0x74, + 0x7,0x40,0x71, 0x5,0x68,0x4a, 0x5,0x68,0x49, 0x7,0x48,0x2d, + 0x4,0x63,0x6d, 0x5,0x6c,0x5b, 0x5,0x6c,0x5a, 0x7,0x4e,0x51, + 0x7,0x53,0x7c, 0x4,0x66,0x5c, 0x7,0x58,0x42, 0x5,0x77,0x6c, + 0x5,0x77,0x6d, 0x7,0x63,0x44, 0x7,0x65,0x58, 0x6,0x28,0x69, + 0xf,0x24,0x7d, 0x4,0x27,0x49, 0x5,0x27,0x3e, 0x4,0x27,0x47, + 0x6,0x2d,0x3b, 0x5,0x27,0x3f, 0x5,0x2a,0x5e, 0x5,0x2a,0x5c, + 0x5,0x2a,0x5d, 0x6,0x33,0x2d, 0x6,0x33,0x2c, 0xf,0x2c,0x55, + 0x5,0x2e,0x79, 0x6,0x3a,0x21, 0x6,0x3a,0x23, 0x4,0x2e,0x48, + 0x5,0x2e,0x7a, 0x6,0x39,0x7e, 0x6,0x39,0x7b, 0x4,0x2e,0x4a, + 0x6,0x3a,0x22, 0xf,0x31,0x37, 0xf,0x31,0x38, 0x6,0x3a,0x24, + 0x6,0x39,0x7c, 0x6,0x39,0x7d, 0x4,0x33,0x4c, 0x5,0x33,0x72, + 0x4,0x33,0x4a, 0x6,0x42,0x3f, 0xf,0x36,0x7a, 0xf,0x36,0x7b, + 0xf,0x36,0x7c, 0xf,0x36,0x7d, 0xf,0x37,0x21, 0xf,0x37,0x22, + 0x6,0x42,0x40, 0x6,0x42,0x41, 0x6,0x3a,0x25, 0x6,0x4b,0x74, + 0x6,0x4b,0x70, 0x5,0x3a,0x43, 0x4,0x39,0x3d, 0x6,0x4b,0x72, + 0x6,0x4b,0x73, 0xf,0x3d,0x4c, 0xf,0x3d,0x4d, 0x6,0x4b,0x71, + 0x6,0x55,0x54, 0x6,0x55,0x56, 0x5,0x40,0x70, 0x6,0x55,0x58, + 0x6,0x55,0x57, 0x6,0x55,0x55, 0xf,0x43,0x6f, 0xf,0x43,0x70, + 0x6,0x5f,0x41, 0x6,0x5f,0x40, 0x6,0x5f,0x4b, 0xf,0x4a,0x36, + 0x5,0x4e,0x5d, 0x7,0x25,0x64, 0x7,0x25,0x65, 0xf,0x50,0x55, + 0xf,0x50,0x56, 0xf,0x50,0x57, 0xf,0x50,0x58, 0xf,0x50,0x59, + 0xf,0x50,0x5a, 0x4,0x51,0x59, 0x7,0x30,0x44, 0x4,0x51,0x5b, + 0x7,0x30,0x40, 0x7,0x30,0x45, 0x5,0x55,0x7a, 0x5,0x55,0x79, + 0xf,0x56,0x37, 0xf,0x56,0x38, 0xf,0x56,0x39, 0xf,0x56,0x3a, + 0xf,0x56,0x3b, 0x7,0x30,0x43, 0x7,0x30,0x41, 0x4,0x57,0x2b, + 0x4,0x5c,0x23, 0x4,0x57,0x2a, 0x7,0x39,0x54, 0x5,0x5c,0x47, + 0x7,0x40,0x75, 0x5,0x5c,0x46, 0xf,0x5b,0x3b, 0xf,0x5b,0x3c, + 0x7,0x39,0x55, 0x7,0x39,0x56, 0x7,0x36,0x79, 0x5,0x5c,0x45, + 0x7,0x30,0x42, 0x7,0x39,0x57, 0x4,0x5c,0x22, 0x4,0x5c,0x21, + 0x7,0x40,0x76, 0x7,0x40,0x78, 0x7,0x40,0x77, 0xf,0x5f,0x62, + 0x7,0x40,0x79, 0x7,0x48,0x2e, 0x5,0x68,0x4b, 0x7,0x48,0x2f, + 0xf,0x63,0x28, 0xf,0x63,0x29, 0x5,0x6c,0x5d, 0x7,0x4e,0x53, + 0x5,0x6c,0x5c, 0x7,0x4e,0x55, 0xf,0x65,0x56, 0x7,0x4e,0x52, + 0x7,0x4e,0x54, 0xf,0x67,0x7b, 0x7,0x58,0x44, 0x5,0x73,0x60, + 0x7,0x58,0x43, 0x7,0x58,0x45, 0xf,0x67,0x7a, 0x7,0x5f,0x22, + 0x5,0x76,0x2a, 0x7,0x5f,0x23, 0x7,0x62,0x42, 0x5,0x22,0x7d, + 0xf,0x22,0x67, 0x6,0x28,0x6a, 0x4,0x24,0x64, 0x5,0x24,0x6a, + 0x4,0x24,0x66, 0x5,0x24,0x6b, 0x5,0x24,0x69, 0xf,0x24,0x7e, + 0x4,0x27,0x50, 0x6,0x2d,0x3c, 0x5,0x27,0x41, 0x4,0x27,0x4b, + 0x6,0x2d,0x40, 0x6,0x2d,0x42, 0x6,0x2d,0x3e, 0x5,0x27,0x42, + 0x5,0x27,0x43, 0x6,0x2d,0x41, 0x6,0x2d,0x3f, 0x5,0x27,0x40, + 0x6,0x2d,0x43, 0x6,0x2d,0x44, 0x6,0x33,0x39, 0x6,0x33,0x35, + 0x6,0x33,0x2e, 0x6,0x33,0x32, 0x4,0x2a,0x5e, 0x6,0x33,0x36, + 0x4,0x2a,0x5c, 0x6,0x33,0x3c, 0x5,0x2a,0x65, 0x6,0x33,0x33, + 0x5,0x2a,0x69, 0x4,0x2a,0x5b, 0x6,0x33,0x2f, 0x6,0x33,0x3b, + 0x5,0x2a,0x60, 0x5,0x2a,0x67, 0x5,0x2a,0x6b, 0x5,0x2a,0x61, + 0x5,0x2a,0x6a, 0x5,0x2a,0x68, 0x5,0x2a,0x63, 0x5,0x2a,0x6c, + 0x6,0x33,0x30, 0x5,0x2a,0x5f, 0x5,0x2a,0x66, 0x5,0x2a,0x62, + 0x5,0x2a,0x64, 0xf,0x2c,0x56, 0xf,0x2c,0x58, 0x6,0x33,0x37, + 0x6,0x33,0x3a, 0x6,0x33,0x34, 0x4,0x2e,0x50, 0x5,0x2f,0x24, + 0x3,0x2e,0x5a, 0x4,0x2e,0x4c, 0x5,0x2e,0x7b, 0x6,0x3a,0x26, + 0x4,0x2e,0x4e, 0x5,0x2f,0x22, 0x5,0x2e,0x7c, 0x6,0x3a,0x28, + 0x4,0x2e,0x4b, 0x6,0x3a,0x29, 0x5,0x2f,0x23, 0x6,0x3a,0x2a, + 0x4,0x2e,0x53, 0x6,0x3a,0x2c, 0x5,0x2e,0x7e, 0x5,0x2f,0x25, + 0x6,0x3a,0x2b, 0xf,0x31,0x39, 0xf,0x31,0x3a, 0xf,0x31,0x3b, + 0xf,0x31,0x3c, 0xf,0x31,0x3d, 0x6,0x3a,0x27, 0x5,0x2f,0x21, + 0x5,0x2e,0x7d, 0x4,0x2e,0x54, 0x4,0x33,0x55, 0x6,0x42,0x53, + 0x6,0x42,0x46, 0x6,0x42,0x4d, 0x5,0x33,0x74, 0x5,0x33,0x73, + 0x5,0x33,0x7d, 0x4,0x33,0x54, 0x6,0x42,0x47, 0x6,0x42,0x44, + 0x6,0x42,0x42, 0x5,0x33,0x7a, 0x5,0x33,0x7b, 0x5,0x33,0x75, + 0x6,0x42,0x4a, 0x5,0x33,0x78, 0x6,0x42,0x54, 0x5,0x33,0x79, + 0x6,0x42,0x43, 0x6,0x42,0x4f, 0x6,0x42,0x4b, 0x6,0x42,0x50, + 0xf,0x37,0x25, 0x6,0x42,0x52, 0x6,0x42,0x4c, 0x6,0x42,0x49, + 0x6,0x42,0x51, 0xf,0x37,0x26, 0x5,0x33,0x7e, 0x6,0x42,0x45, + 0x6,0x42,0x4e, 0x5,0x33,0x77, 0x5,0x33,0x7c, 0x5,0x3a,0x49, + 0x5,0x3a,0x4c, 0x6,0x4b,0x79, 0x6,0x4c,0x23, 0x4,0x33,0x53, + 0x6,0x4b,0x78, 0x5,0x3a,0x4b, 0x6,0x4b,0x7d, 0x6,0x4c,0x21, + 0x5,0x3a,0x46, 0x6,0x4c,0x26, 0x6,0x4b,0x77, 0x4,0x39,0x4f, + 0x5,0x3a,0x4a, 0x5,0x3a,0x48, 0x5,0x3a,0x44, 0x4,0x39,0x4e, + 0x5,0x40,0x71, 0x6,0x4c,0x25, 0x5,0x40,0x7e, 0x4,0x39,0x40, + 0x6,0x4b,0x7e, 0x5,0x3a,0x4d, 0x6,0x4b,0x7b, 0x5,0x3a,0x4e, + 0x6,0x4c,0x28, 0x5,0x3a,0x45, 0x5,0x3a,0x47, 0xf,0x3d,0x4f, + 0xf,0x3d,0x50, 0xf,0x3d,0x51, 0x6,0x4b,0x7c, 0x6,0x4c,0x27, + 0x6,0x4b,0x76, 0x6,0x4c,0x24, 0x6,0x4c,0x22, 0x4,0x39,0x44, + 0x4,0x39,0x50, 0x5,0x3a,0x4f, 0x4,0x39,0x3e, 0x6,0x55,0x5b, + 0x6,0x55,0x5e, 0x6,0x55,0x5a, 0x4,0x3f,0x2a, 0x5,0x40,0x78, + 0x6,0x55,0x5c, 0x5,0x40,0x77, 0x6,0x55,0x5f, 0x5,0x40,0x75, + 0x6,0x55,0x59, 0x4,0x3f,0x23, 0x4,0x3f,0x28, 0x4,0x3f,0x31, + 0x4,0x3f,0x2e, 0x5,0x40,0x7a, 0x6,0x55,0x62, 0x5,0x40,0x76, + 0x4,0x3f,0x2f, 0x4,0x3f,0x24, 0x6,0x55,0x64, 0x5,0x40,0x79, + 0x5,0x40,0x72, 0x5,0x40,0x7c, 0x6,0x55,0x66, 0x6,0x55,0x5d, + 0xf,0x43,0x71, 0xf,0x43,0x72, 0xf,0x43,0x73, 0x6,0x4b,0x75, + 0x6,0x55,0x63, 0x6,0x53,0x35, 0x5,0x40,0x73, 0x5,0x40,0x7d, + 0x5,0x40,0x74, 0x6,0x55,0x65, 0x5,0x47,0x60, 0x4,0x45,0x45, + 0x6,0x5f,0x44, 0x4,0x45,0x3e, 0x5,0x47,0x63, 0x6,0x5f,0x48, + 0x5,0x47,0x65, 0x5,0x47,0x66, 0x6,0x5f,0x49, 0x4,0x4b,0x4f, + 0x6,0x5f,0x4e, 0x6,0x5f,0x46, 0x6,0x5f,0x4f, 0x7,0x25,0x6c, + 0x6,0x5f,0x47, 0x5,0x47,0x67, 0x5,0x47,0x64, 0x6,0x5f,0x43, + 0x6,0x5f,0x4a, 0x6,0x5f,0x45, 0x5,0x47,0x62, 0x6,0x5f,0x42, + 0x5,0x47,0x5f, 0x5,0x47,0x5e, 0x5,0x47,0x5d, 0x7,0x25,0x66, + 0xf,0x4a,0x37, 0xf,0x4a,0x38, 0xf,0x4a,0x39, 0xf,0x4a,0x3a, + 0xf,0x4a,0x3b, 0xf,0x4a,0x3c, 0xf,0x4a,0x3d, 0x4,0x45,0x3a, + 0x6,0x5f,0x4d, 0x6,0x5f,0x4c, 0x5,0x47,0x69, 0x4,0x45,0x3b, + 0x4,0x4b,0x50, 0x4,0x4b,0x4c, 0x4,0x4b,0x3e, 0x5,0x4e,0x62, + 0x5,0x4e,0x67, 0x4,0x4b,0x4e, 0x7,0x25,0x6b, 0x5,0x4e,0x6c, + 0x5,0x4e,0x65, 0x4,0x4b,0x41, 0x7,0x25,0x70, 0x4,0x4b,0x40, + 0x4,0x51,0x65, 0x7,0x30,0x4d, 0x5,0x4e,0x64, 0x5,0x56,0x21, + 0x5,0x4e,0x66, 0x7,0x25,0x6d, 0x5,0x4e,0x6a, 0x7,0x25,0x72, + 0x4,0x4b,0x49, 0x4,0x4b,0x4b, 0x4,0x4b,0x46, 0x5,0x4e,0x5f, + 0x5,0x4e,0x6b, 0x7,0x25,0x67, 0x7,0x25,0x68, 0x7,0x25,0x6a, + 0x4,0x4b,0x4a, 0x5,0x4e,0x63, 0x7,0x25,0x6e, 0x5,0x4e,0x5e, + 0x5,0x4e,0x61, 0x5,0x55,0x7b, 0x5,0x4e,0x69, 0x5,0x4e,0x68, + 0x7,0x25,0x69, 0xf,0x50,0x5b, 0xf,0x50,0x5c, 0xf,0x50,0x5d, + 0x7,0x25,0x6f, 0x4,0x4b,0x48, 0x5,0x56,0x2a, 0x5,0x56,0x2b, + 0x4,0x51,0x5e, 0x5,0x56,0x25, 0x5,0x56,0x23, 0x5,0x56,0x27, + 0x5,0x55,0x7d, 0x4,0x51,0x63, 0x5,0x56,0x29, 0x5,0x55,0x7e, + 0x5,0x56,0x26, 0x5,0x56,0x24, 0x4,0x51,0x62, 0x7,0x30,0x46, + 0x7,0x30,0x4e, 0x7,0x30,0x4f, 0x7,0x30,0x4b, 0x7,0x30,0x47, + 0x5,0x4e,0x6d, 0x4,0x51,0x67, 0x5,0x55,0x7c, 0x7,0x30,0x49, + 0xf,0x56,0x3d, 0x7,0x30,0x51, 0x7,0x30,0x4c, 0x5,0x56,0x2c, + 0x4,0x51,0x66, 0x5,0x47,0x68, 0x5,0x56,0x28, 0x4,0x5c,0x2b, + 0x5,0x5c,0x48, 0x5,0x5c,0x4b, 0x4,0x57,0x35, 0x4,0x57,0x36, + 0x7,0x30,0x52, 0x7,0x39,0x5e, 0x7,0x39,0x59, 0x5,0x5c,0x4a, + 0x7,0x39,0x5a, 0x5,0x5c,0x4c, 0x7,0x39,0x64, 0x5,0x5c,0x49, + 0x7,0x41,0x22, 0x7,0x39,0x5f, 0x7,0x39,0x60, 0x7,0x39,0x5d, + 0x4,0x57,0x37, 0x7,0x39,0x63, 0x5,0x5c,0x4f, 0x7,0x30,0x48, + 0x5,0x5c,0x4e, 0x7,0x39,0x61, 0x7,0x39,0x5c, 0x7,0x39,0x5b, + 0xf,0x5b,0x3e, 0xf,0x5b,0x3f, 0xf,0x5b,0x40, 0x7,0x39,0x62, + 0x7,0x39,0x58, 0x4,0x5c,0x28, 0x7,0x41,0x23, 0x7,0x40,0x7e, + 0x5,0x62,0x6e, 0x4,0x5c,0x2c, 0x5,0x62,0x6b, 0x7,0x40,0x7b, + 0x7,0x40,0x7c, 0x5,0x62,0x70, 0x4,0x5c,0x24, 0x5,0x62,0x6c, + 0x5,0x62,0x6f, 0x5,0x62,0x71, 0x5,0x62,0x6a, 0xf,0x5f,0x63, + 0xf,0x5f,0x64, 0x7,0x41,0x24, 0x7,0x41,0x25, 0x7,0x40,0x7d, + 0x5,0x62,0x6d, 0x7,0x40,0x7a, 0x7,0x41,0x21, 0x5,0x68,0x4f, + 0x5,0x68,0x4c, 0x5,0x68,0x51, 0x4,0x60,0x3e, 0x5,0x68,0x50, + 0x4,0x60,0x3b, 0x5,0x68,0x54, 0x5,0x68,0x4e, 0x7,0x48,0x32, + 0x4,0x60,0x3a, 0x7,0x48,0x34, 0x4,0x60,0x3c, 0x4,0x60,0x3d, + 0x7,0x48,0x30, 0x5,0x68,0x4d, 0x7,0x48,0x31, 0x5,0x68,0x53, + 0x5,0x68,0x52, 0xf,0x63,0x2a, 0x7,0x4b,0x5d, 0x7,0x48,0x35, + 0x7,0x48,0x33, 0x5,0x6c,0x60, 0x5,0x6c,0x62, 0x5,0x6c,0x5e, + 0x7,0x4e,0x58, 0x5,0x6c,0x61, 0x5,0x6c,0x63, 0x7,0x4e,0x57, + 0xf,0x65,0x57, 0x4,0x63,0x72, 0x5,0x6c,0x5f, 0x4,0x63,0x73, + 0x7,0x4e,0x56, 0x7,0x54,0x22, 0x5,0x70,0x52, 0x5,0x70,0x54, + 0x5,0x70,0x53, 0x5,0x70,0x55, 0x7,0x53,0x7e, 0x7,0x54,0x23, + 0x7,0x53,0x7d, 0x4,0x68,0x79, 0x5,0x73,0x63, 0x7,0x58,0x46, + 0x5,0x73,0x61, 0x5,0x73,0x62, 0x7,0x58,0x47, 0x5,0x73,0x65, + 0x4,0x6a,0x59, 0x7,0x54,0x21, 0x5,0x73,0x64, 0x7,0x59,0x33, + 0x5,0x73,0x66, 0x5,0x76,0x2b, 0x7,0x5c,0x26, 0x4,0x6a,0x58, + 0x7,0x5c,0x25, 0x7,0x5f,0x24, 0x4,0x6c,0x74, 0x7,0x62,0x43, + 0x7,0x62,0x45, 0x7,0x62,0x44, 0xf,0x6c,0x66, 0x5,0x7b,0x43, + 0x5,0x27,0x44, 0x4,0x2a,0x60, 0x4,0x2a,0x61, 0x4,0x2e,0x56, + 0x5,0x2f,0x28, 0x5,0x2f,0x27, 0x6,0x3a,0x2f, 0x6,0x3a,0x30, + 0x4,0x33,0x58, 0x5,0x34,0x22, 0xf,0x37,0x27, 0x5,0x3a,0x52, + 0x4,0x39,0x51, 0x5,0x3a,0x53, 0x5,0x3a,0x51, 0x5,0x3a,0x55, + 0x5,0x3a,0x50, 0x6,0x4c,0x29, 0x5,0x3a,0x54, 0x5,0x41,0x23, + 0x5,0x41,0x22, 0x5,0x41,0x21, 0x6,0x5f,0x51, 0x6,0x5f,0x52, + 0x4,0x45,0x47, 0x4,0x45,0x48, 0x5,0x47,0x6c, 0x5,0x47,0x6a, + 0x5,0x47,0x6b, 0x4,0x45,0x49, 0x6,0x5f,0x50, 0x4,0x45,0x4b, + 0xf,0x4d,0x3f, 0x5,0x4e,0x6e, 0x4,0x4b,0x52, 0x7,0x25,0x75, + 0x5,0x4e,0x6f, 0x4,0x4b,0x51, 0x7,0x25,0x74, 0x4,0x4b,0x53, + 0x4,0x51,0x69, 0x4,0x51,0x68, 0x4,0x51,0x6a, 0x5,0x56,0x2d, + 0x5,0x62,0x75, 0x7,0x39,0x65, 0x5,0x5a,0x75, 0x5,0x5c,0x50, + 0x5,0x62,0x74, 0x5,0x62,0x73, 0x5,0x62,0x72, 0x5,0x68,0x57, + 0x5,0x68,0x56, 0x5,0x68,0x55, 0x5,0x68,0x58, 0x7,0x48,0x36, + 0x7,0x48,0x37, 0x4,0x6a,0x5a, 0x7,0x66,0x3f, 0x7,0x66,0x49, + 0x6,0x26,0x3f, 0x6,0x28,0x6b, 0x6,0x28,0x6c, 0x6,0x33,0x41, + 0x6,0x33,0x3f, 0x6,0x33,0x40, 0x5,0x2a,0x6e, 0x5,0x2f,0x2a, + 0x5,0x2f,0x2b, 0x6,0x3a,0x33, 0xf,0x31,0x3f, 0xf,0x31,0x40, + 0x6,0x3a,0x31, 0x6,0x3a,0x32, 0x5,0x2f,0x29, 0x5,0x34,0x23, + 0x5,0x34,0x24, 0x4,0x33,0x5c, 0x6,0x42,0x59, 0x6,0x42,0x57, + 0x5,0x34,0x25, 0x6,0x42,0x55, 0x6,0x42,0x5b, 0x6,0x42,0x56, + 0x6,0x42,0x5a, 0x6,0x42,0x58, 0x4,0x39,0x52, 0x6,0x4c,0x2c, + 0xf,0x3d,0x52, 0x6,0x4c,0x2a, 0xf,0x3d,0x53, 0x5,0x41,0x24, + 0x4,0x3f,0x32, 0x6,0x55,0x69, 0x4,0x3f,0x35, 0x4,0x3f,0x34, + 0x6,0x55,0x67, 0x5,0x3a,0x56, 0x4,0x3f,0x36, 0xf,0x43,0x75, + 0x6,0x55,0x68, 0x5,0x47,0x6d, 0x5,0x47,0x6e, 0x6,0x5f,0x53, + 0x5,0x47,0x6f, 0x5,0x47,0x70, 0xf,0x4a,0x3e, 0x7,0x25,0x78, + 0x4,0x4b,0x54, 0x7,0x25,0x76, 0x7,0x25,0x77, 0xf,0x50,0x61, + 0x7,0x25,0x79, 0x7,0x30,0x54, 0x4,0x51,0x6b, 0xf,0x56,0x3f, + 0x7,0x30,0x53, 0x5,0x5c,0x51, 0x5,0x5c,0x52, 0x7,0x39,0x66, + 0x7,0x39,0x67, 0x5,0x73,0x67, 0x5,0x76,0x2c, 0x5,0x22,0x7e, + 0x6,0x25,0x3e, 0x4,0x24,0x67, 0x6,0x28,0x6d, 0x5,0x24,0x6d, + 0x5,0x24,0x6c, 0xf,0x25,0x21, 0xf,0x25,0x22, 0x5,0x27,0x45, + 0x4,0x27,0x54, 0xf,0x28,0x30, 0xf,0x28,0x31, 0xf,0x28,0x32, + 0xf,0x28,0x33, 0x6,0x2d,0x47, 0xf,0x28,0x35, 0x4,0x2a,0x65, + 0x4,0x2a,0x63, 0x6,0x33,0x45, 0x5,0x2a,0x70, 0xf,0x2c,0x59, + 0xf,0x2c,0x5a, 0xf,0x2c,0x5b, 0xf,0x2c,0x5d, 0xf,0x2c,0x5e, + 0xf,0x2c,0x5f, 0xf,0x2c,0x61, 0xf,0x2c,0x63, 0x6,0x33,0x43, + 0x6,0x33,0x44, 0xf,0x2c,0x64, 0xf,0x2c,0x60, 0x6,0x33,0x42, + 0x5,0x2a,0x6f, 0x5,0x2a,0x71, 0x4,0x2e,0x60, 0x5,0x2f,0x33, + 0x6,0x3a,0x34, 0x6,0x33,0x46, 0x6,0x3a,0x35, 0x5,0x2f,0x2f, + 0x6,0x3a,0x39, 0x5,0x2f,0x2c, 0x5,0x2f,0x31, 0x5,0x2f,0x30, + 0x4,0x2e,0x5b, 0x4,0x2e,0x5d, 0x5,0x2f,0x36, 0x5,0x2f,0x32, + 0x5,0x2f,0x35, 0xf,0x31,0x3e, 0x4,0x2e,0x59, 0x5,0x2f,0x37, + 0x6,0x3a,0x38, 0xf,0x31,0x42, 0xf,0x31,0x43, 0xf,0x31,0x45, + 0xf,0x31,0x46, 0x4,0x2e,0x5a, 0x5,0x2f,0x2d, 0x6,0x3a,0x37, + 0xf,0x31,0x48, 0xf,0x31,0x41, 0x5,0x34,0x26, 0x5,0x2f,0x2e, + 0x6,0x3a,0x36, 0x5,0x34,0x2c, 0x5,0x34,0x28, 0x6,0x42,0x61, + 0x6,0x42,0x5f, 0x5,0x34,0x31, 0x5,0x34,0x30, 0x5,0x34,0x2a, + 0x6,0x42,0x60, 0x5,0x34,0x34, 0x5,0x34,0x32, 0x5,0x2f,0x38, + 0x5,0x34,0x2e, 0x5,0x34,0x27, 0x5,0x34,0x29, 0x5,0x34,0x2d, + 0xf,0x37,0x28, 0xf,0x37,0x29, 0xf,0x37,0x2a, 0xf,0x37,0x2b, + 0xf,0x37,0x2e, 0xf,0x37,0x2f, 0xf,0x37,0x31, 0xf,0x37,0x32, + 0xf,0x37,0x33, 0x6,0x42,0x5e, 0x6,0x42,0x5c, 0x6,0x4c,0x2e, + 0xf,0x37,0x30, 0x5,0x34,0x2b, 0xf,0x37,0x2c, 0x6,0x42,0x62, + 0x5,0x34,0x2f, 0x5,0x34,0x33, 0x6,0x42,0x5d, 0x5,0x3a,0x58, + 0x5,0x3a,0x5e, 0x5,0x3a,0x57, 0x5,0x3a,0x5b, 0x4,0x39,0x56, + 0x6,0x4c,0x35, 0x4,0x39,0x57, 0x4,0x39,0x55, 0x5,0x3a,0x5c, + 0x5,0x3a,0x5d, 0x6,0x4c,0x31, 0x5,0x3a,0x5a, 0x5,0x3a,0x5f, + 0xf,0x3d,0x54, 0xf,0x3d,0x55, 0xf,0x3d,0x56, 0xf,0x3d,0x57, + 0x6,0x4c,0x34, 0x6,0x4c,0x30, 0x6,0x4c,0x32, 0x5,0x3a,0x61, + 0x5,0x3a,0x60, 0x5,0x41,0x28, 0x6,0x55,0x71, 0x4,0x3f,0x37, + 0x5,0x41,0x29, 0x6,0x55,0x6a, 0x6,0x55,0x6c, 0x5,0x41,0x25, + 0x6,0x55,0x6e, 0x4,0x3f,0x41, 0x4,0x3f,0x43, 0x6,0x55,0x6f, + 0x6,0x55,0x72, 0x5,0x41,0x26, 0x5,0x41,0x27, 0x6,0x55,0x6d, + 0xf,0x43,0x77, 0xf,0x43,0x78, 0xf,0x43,0x79, 0xf,0x43,0x7a, + 0xf,0x43,0x7b, 0xf,0x43,0x7c, 0xf,0x43,0x7d, 0xf,0x43,0x7e, + 0xf,0x44,0x21, 0xf,0x44,0x22, 0xf,0x44,0x23, 0xf,0x44,0x24, + 0xf,0x44,0x26, 0x6,0x55,0x70, 0x6,0x55,0x73, 0x6,0x5f,0x5b, + 0x5,0x47,0x78, 0x6,0x5f,0x54, 0x7,0x25,0x7e, 0x5,0x47,0x7a, + 0x6,0x5f,0x56, 0x4,0x45,0x52, 0x5,0x47,0x73, 0x5,0x47,0x72, + 0x6,0x5f,0x57, 0x5,0x47,0x7b, 0x6,0x5f,0x59, 0x6,0x5f,0x5a, + 0x5,0x47,0x75, 0x6,0x5f,0x55, 0x5,0x47,0x71, 0x5,0x47,0x7d, + 0x6,0x5f,0x58, 0xf,0x4a,0x41, 0xf,0x4a,0x43, 0xf,0x4a,0x44, + 0xf,0x4a,0x45, 0xf,0x4a,0x46, 0xf,0x4a,0x47, 0xf,0x4a,0x48, + 0xf,0x4a,0x49, 0xf,0x4a,0x4b, 0xf,0x4a,0x4c, 0xf,0x4a,0x4d, + 0xf,0x4a,0x4f, 0xf,0x4a,0x50, 0xf,0x4a,0x51, 0xf,0x4a,0x52, + 0x4,0x45,0x54, 0xf,0x4a,0x40, 0x5,0x47,0x77, 0x5,0x47,0x7c, + 0x5,0x47,0x79, 0x5,0x47,0x74, 0xf,0x50,0x64, 0x4,0x4b,0x5a, + 0x5,0x4e,0x72, 0x5,0x4e,0x73, 0x7,0x26,0x21, 0x5,0x4e,0x70, + 0x4,0x45,0x50, 0x7,0x26,0x25, 0x5,0x4e,0x75, 0x7,0x25,0x7d, + 0xf,0x50,0x62, 0xf,0x50,0x63, 0xf,0x50,0x65, 0xf,0x50,0x66, + 0xf,0x50,0x68, 0x7,0x26,0x22, 0x7,0x25,0x7a, 0x7,0x26,0x23, + 0x5,0x4e,0x71, 0x5,0x4e,0x74, 0x7,0x25,0x7c, 0xf,0x4a,0x4a, + 0x7,0x30,0x58, 0x5,0x56,0x31, 0x5,0x56,0x2e, 0x5,0x56,0x32, + 0x7,0x30,0x55, 0x4,0x51,0x71, 0x4,0x51,0x73, 0x5,0x56,0x34, + 0x4,0x51,0x72, 0x7,0x30,0x56, 0x7,0x30,0x5a, 0x4,0x51,0x6f, + 0x7,0x30,0x57, 0xf,0x56,0x41, 0xf,0x56,0x42, 0xf,0x56,0x43, + 0x5,0x56,0x30, 0xf,0x56,0x44, 0x5,0x56,0x2f, 0xf,0x56,0x45, + 0xf,0x56,0x46, 0xf,0x56,0x47, 0xf,0x56,0x49, 0xf,0x56,0x4b, + 0xf,0x56,0x4c, 0xf,0x56,0x4d, 0x5,0x5c,0x56, 0x7,0x39,0x68, + 0x5,0x5c,0x54, 0x7,0x39,0x6f, 0x7,0x39,0x6a, 0x5,0x5c,0x53, + 0x4,0x57,0x3a, 0x7,0x39,0x69, 0x5,0x5c,0x55, 0x4,0x57,0x3d, + 0x7,0x39,0x6c, 0x4,0x57,0x3c, 0x5,0x56,0x35, 0x5,0x5c,0x58, + 0x5,0x5c,0x57, 0x5,0x5c,0x59, 0xf,0x5b,0x41, 0xf,0x5b,0x42, + 0xf,0x5b,0x43, 0xf,0x5b,0x44, 0xf,0x5b,0x45, 0xf,0x5b,0x46, + 0xf,0x5b,0x47, 0xf,0x5b,0x48, 0xf,0x5b,0x49, 0x7,0x39,0x6b, + 0x7,0x39,0x6e, 0xf,0x56,0x4a, 0x7,0x41,0x29, 0x5,0x62,0x76, + 0x5,0x62,0x78, 0x7,0x41,0x26, 0x7,0x41,0x28, 0x5,0x62,0x77, + 0x4,0x5c,0x30, 0x5,0x62,0x7a, 0x7,0x41,0x27, 0x5,0x62,0x79, + 0x7,0x41,0x2a, 0xf,0x5f,0x65, 0xf,0x5f,0x66, 0xf,0x5f,0x67, + 0xf,0x5f,0x68, 0xf,0x5f,0x69, 0x4,0x60,0x40, 0x5,0x68,0x5a, + 0x5,0x68,0x59, 0xf,0x63,0x2b, 0xf,0x63,0x2c, 0xf,0x63,0x2d, + 0xf,0x63,0x2e, 0x7,0x48,0x3a, 0x7,0x48,0x38, 0x7,0x48,0x39, + 0xf,0x63,0x2f, 0x5,0x6c,0x65, 0x5,0x6c,0x66, 0x7,0x4e,0x59, + 0x7,0x4e,0x5a, 0x5,0x6c,0x64, 0x5,0x6c,0x67, 0x4,0x60,0x41, + 0x7,0x4e,0x5b, 0xf,0x65,0x5a, 0xf,0x65,0x5b, 0xf,0x65,0x5c, + 0xf,0x65,0x5d, 0x7,0x4e,0x5d, 0x5,0x70,0x56, 0x5,0x70,0x57, + 0xf,0x67,0x7d, 0x7,0x54,0x24, 0x4,0x66,0x62, 0xf,0x67,0x7c, + 0x5,0x73,0x68, 0x7,0x58,0x48, 0x5,0x73,0x69, 0xf,0x69,0x5b, + 0xf,0x69,0x5c, 0x7,0x58,0x49, 0x5,0x73,0x6a, 0x5,0x76,0x2e, + 0x4,0x6a,0x5b, 0x5,0x76,0x2d, 0x5,0x76,0x2f, 0xf,0x6a,0x65, + 0x7,0x5c,0x28, 0x7,0x5c,0x27, 0x7,0x5f,0x26, 0x7,0x5f,0x25, + 0x7,0x5f,0x27, 0x7,0x62,0x46, 0x5,0x7a,0x2d, 0x5,0x7a,0x6e, + 0x4,0x6d,0x75, 0x7,0x64,0x53, 0x7,0x65,0x3b, 0x5,0x7c,0x43, + 0x6,0x22,0x27, 0x6,0x25,0x40, 0x6,0x28,0x6e, 0xf,0x22,0x68, + 0x6,0x2d,0x48, 0xf,0x25,0x24, 0x6,0x33,0x47, 0x6,0x33,0x49, + 0xf,0x28,0x36, 0xf,0x28,0x38, 0xf,0x28,0x39, 0xf,0x28,0x3a, + 0xf,0x28,0x3b, 0xf,0x28,0x3d, 0xf,0x28,0x37, 0x6,0x31,0x5a, + 0x5,0x2f,0x39, 0x6,0x3a,0x3a, 0x4,0x2e,0x63, 0x5,0x2f,0x3a, + 0x6,0x3a,0x3b, 0x6,0x33,0x4b, 0xf,0x2c,0x65, 0xf,0x2c,0x66, + 0xf,0x2c,0x67, 0xf,0x2c,0x68, 0xf,0x2c,0x69, 0xf,0x31,0x49, + 0xf,0x31,0x4b, 0xf,0x31,0x4e, 0x6,0x3a,0x3e, 0x6,0x3a,0x3f, + 0x6,0x3a,0x3d, 0x6,0x3a,0x40, 0x6,0x3a,0x3c, 0xf,0x2c,0x6a, + 0x4,0x2a,0x68, 0x5,0x34,0x36, 0x6,0x3a,0x41, 0xf,0x31,0x4a, + 0xf,0x31,0x4c, 0xf,0x31,0x4d, 0xf,0x31,0x4f, 0xf,0x31,0x50, + 0xf,0x31,0x51, 0xf,0x31,0x52, 0xf,0x31,0x53, 0xf,0x31,0x54, + 0xf,0x37,0x37, 0x6,0x42,0x63, 0x5,0x34,0x35, 0x6,0x4c,0x38, + 0x5,0x3a,0x62, 0x6,0x4c,0x39, 0x6,0x4c,0x3a, 0x6,0x4c,0x3c, + 0x5,0x3a,0x63, 0x6,0x4c,0x3d, 0x6,0x4c,0x3b, 0x6,0x4c,0x36, + 0x6,0x4c,0x37, 0xf,0x37,0x34, 0xf,0x37,0x36, 0xf,0x37,0x38, + 0xf,0x3d,0x5b, 0xf,0x37,0x35, 0x6,0x55,0x75, 0x5,0x41,0x2b, + 0x5,0x41,0x2a, 0x5,0x41,0x2c, 0x6,0x4c,0x3f, 0x4,0x3f,0x48, + 0xf,0x3d,0x58, 0xf,0x3d,0x59, 0xf,0x3d,0x5a, 0xf,0x3d,0x5c, + 0xf,0x3d,0x5d, 0xf,0x3d,0x5e, 0xf,0x3d,0x5f, 0xf,0x3d,0x62, + 0xf,0x3d,0x63, 0xf,0x3d,0x64, 0xf,0x44,0x28, 0xf,0x44,0x2a, + 0xf,0x3d,0x61, 0x6,0x55,0x74, 0x5,0x48,0x23, 0x6,0x5f,0x5f, + 0x6,0x5f,0x60, 0x4,0x45,0x56, 0x6,0x5f,0x63, 0x6,0x5f,0x61, + 0xf,0x44,0x27, 0xf,0x44,0x29, 0xf,0x44,0x2b, 0xf,0x44,0x2c, + 0xf,0x44,0x2d, 0xf,0x44,0x2e, 0xf,0x44,0x2f, 0xf,0x44,0x30, + 0xf,0x44,0x31, 0xf,0x44,0x32, 0x6,0x5f,0x5d, 0x6,0x5f,0x62, + 0x5,0x48,0x21, 0x6,0x5f,0x5e, 0x4,0x4b,0x5f, 0x7,0x26,0x26, + 0x6,0x5f,0x5c, 0x6,0x5f,0x64, 0xf,0x4a,0x53, 0xf,0x4a,0x55, + 0xf,0x4a,0x56, 0xf,0x4a,0x57, 0xf,0x4a,0x58, 0xf,0x4a,0x5a, + 0x7,0x26,0x28, 0x5,0x56,0x38, 0x7,0x30,0x5c, 0x5,0x56,0x36, + 0x7,0x30,0x5d, 0x4,0x51,0x77, 0x5,0x56,0x39, 0x5,0x56,0x37, + 0x5,0x56,0x3a, 0x7,0x26,0x2a, 0x7,0x30,0x5b, 0xf,0x50,0x6a, + 0xf,0x50,0x69, 0xf,0x56,0x51, 0x4,0x57,0x43, 0x5,0x5c,0x5a, + 0x7,0x39,0x73, 0x4,0x57,0x44, 0x7,0x39,0x76, 0x7,0x39,0x74, + 0x7,0x30,0x5e, 0xf,0x50,0x6b, 0xf,0x56,0x4e, 0xf,0x56,0x4f, + 0xf,0x56,0x50, 0xf,0x56,0x52, 0x7,0x39,0x71, 0x7,0x39,0x75, + 0x7,0x39,0x72, 0x7,0x39,0x70, 0xf,0x5b,0x4d, 0xf,0x5b,0x4f, + 0x4,0x5c,0x34, 0x5,0x62,0x7b, 0x7,0x41,0x2c, 0xf,0x5b,0x4b, + 0xf,0x5b,0x4c, 0xf,0x5b,0x4e, 0xf,0x5b,0x50, 0xf,0x5b,0x51, + 0xf,0x5b,0x52, 0x7,0x41,0x2b, 0x4,0x5c,0x33, 0x5,0x68,0x5b, + 0x7,0x48,0x3c, 0x7,0x48,0x3d, 0xf,0x5f,0x6a, 0xf,0x5f,0x6b, + 0x5,0x6c,0x68, 0x4,0x63,0x77, 0xf,0x65,0x5e, 0x7,0x4e,0x5e, + 0x7,0x54,0x26, 0x7,0x54,0x25, 0xf,0x65,0x5f, 0x4,0x68,0x7d, + 0x7,0x58,0x4a, 0x7,0x58,0x4b, 0x7,0x5c,0x29, 0xf,0x69,0x5d, + 0x7,0x5c,0x2a, 0x7,0x5c,0x2b, 0x5,0x77,0x6e, 0x7,0x5c,0x2c, + 0x5,0x77,0x6f, 0xf,0x6a,0x67, 0x5,0x79,0x32, 0x7,0x62,0x49, + 0x7,0x62,0x47, 0x7,0x63,0x5d, 0xf,0x6c,0x67, 0xf,0x22,0x69, + 0x6,0x33,0x4d, 0x6,0x42,0x64, 0x4,0x39,0x5b, 0x6,0x4c,0x40, + 0x6,0x55,0x76, 0x6,0x5f,0x65, 0x7,0x26,0x2c, 0x7,0x30,0x5f, + 0x7,0x30,0x60, 0x7,0x41,0x2d, 0x5,0x73,0x6b, 0x7,0x61,0x28, + 0x4,0x21,0x7e, 0x6,0x25,0x41, 0xf,0x22,0x6a, 0x6,0x28,0x6f, + 0xf,0x25,0x25, 0x6,0x28,0x70, 0x4,0x27,0x55, 0x5,0x27,0x48, + 0x4,0x27,0x57, 0x5,0x27,0x47, 0xf,0x28,0x3e, 0xf,0x28,0x3f, + 0xf,0x28,0x40, 0xf,0x28,0x41, 0xf,0x28,0x42, 0x6,0x2d,0x4a, + 0x6,0x33,0x51, 0x6,0x33,0x54, 0x5,0x2a,0x74, 0x5,0x2a,0x72, + 0x4,0x2a,0x70, 0x5,0x2a,0x75, 0x6,0x33,0x56, 0x6,0x33,0x50, + 0x6,0x33,0x52, 0x4,0x2a,0x6d, 0x6,0x33,0x4f, 0x5,0x2a,0x73, + 0x6,0x33,0x57, 0xf,0x2c,0x6b, 0xf,0x2c,0x6c, 0xf,0x2c,0x6e, + 0xf,0x2c,0x6f, 0xf,0x2c,0x70, 0x6,0x33,0x55, 0x6,0x33,0x53, + 0x6,0x33,0x4e, 0x5,0x2f,0x3c, 0x5,0x2f,0x3b, 0x6,0x3a,0x45, + 0x5,0x2f,0x3d, 0x6,0x3a,0x46, 0x5,0x2f,0x3e, 0x5,0x2a,0x76, + 0x5,0x34,0x3c, 0x6,0x3a,0x47, 0xf,0x31,0x55, 0xf,0x31,0x56, + 0x6,0x3a,0x42, 0x6,0x3a,0x44, 0x5,0x34,0x3a, 0x6,0x42,0x69, + 0x5,0x34,0x3f, 0x4,0x33,0x68, 0x5,0x34,0x3d, 0x6,0x42,0x68, + 0x5,0x34,0x37, 0xf,0x37,0x3a, 0xf,0x37,0x3c, 0xf,0x37,0x3d, + 0xf,0x37,0x3e, 0x4,0x33,0x6c, 0x6,0x42,0x65, 0x6,0x42,0x6a, + 0x4,0x39,0x5f, 0x5,0x3a,0x64, 0x4,0x39,0x60, 0x4,0x39,0x5c, + 0x6,0x4c,0x41, 0x6,0x4c,0x42, 0x6,0x4c,0x45, 0x6,0x4c,0x47, + 0x4,0x39,0x5d, 0x6,0x4c,0x44, 0x4,0x3f,0x51, 0xf,0x3d,0x65, + 0xf,0x3d,0x67, 0xf,0x3d,0x69, 0x5,0x34,0x3e, 0xf,0x3d,0x66, + 0x5,0x41,0x36, 0x5,0x41,0x2f, 0x6,0x55,0x79, 0x6,0x55,0x77, + 0x6,0x55,0x7a, 0x5,0x41,0x30, 0x5,0x41,0x2d, 0x5,0x41,0x32, + 0x5,0x41,0x34, 0x5,0x41,0x38, 0x5,0x41,0x33, 0x4,0x3f,0x4e, + 0x6,0x56,0x21, 0x5,0x41,0x2e, 0x6,0x55,0x7b, 0x6,0x55,0x7e, + 0x6,0x55,0x7c, 0xf,0x44,0x33, 0xf,0x44,0x34, 0xf,0x44,0x35, + 0xf,0x44,0x36, 0xf,0x44,0x37, 0xf,0x44,0x38, 0xf,0x44,0x39, + 0xf,0x44,0x3a, 0x6,0x55,0x78, 0x6,0x55,0x7d, 0x5,0x41,0x37, + 0x5,0x41,0x35, 0x5,0x48,0x28, 0x6,0x5f,0x69, 0x5,0x45,0x2d, + 0x5,0x48,0x2d, 0x6,0x5f,0x68, 0x6,0x5f,0x66, 0x6,0x5f,0x6a, + 0x4,0x45,0x5c, 0x5,0x48,0x2e, 0x5,0x48,0x29, 0x6,0x5f,0x6e, + 0x6,0x5f,0x6f, 0x5,0x48,0x2b, 0x5,0x48,0x27, 0x5,0x48,0x2c, + 0x6,0x5f,0x70, 0x5,0x48,0x2a, 0x6,0x5f,0x67, 0xf,0x4a,0x60, + 0xf,0x4a,0x5b, 0xf,0x4a,0x5c, 0xf,0x4a,0x5d, 0xf,0x4a,0x5e, + 0xf,0x4a,0x5f, 0xf,0x4a,0x61, 0xf,0x4a,0x62, 0xf,0x4a,0x63, + 0xf,0x4a,0x65, 0x6,0x5f,0x6d, 0x6,0x5f,0x6c, 0x5,0x4e,0x7b, + 0x5,0x4e,0x78, 0x5,0x4e,0x7a, 0x7,0x26,0x33, 0x7,0x26,0x30, + 0x5,0x4e,0x79, 0x4,0x4b,0x69, 0x7,0x26,0x34, 0x7,0x26,0x31, + 0x7,0x26,0x38, 0x5,0x48,0x2f, 0x7,0x26,0x2f, 0x5,0x56,0x45, + 0x5,0x4e,0x7c, 0x5,0x4e,0x7d, 0x4,0x4b,0x67, 0x4,0x4b,0x6a, + 0x7,0x26,0x35, 0xf,0x50,0x6c, 0xf,0x50,0x6e, 0xf,0x50,0x6f, + 0xf,0x50,0x70, 0xf,0x50,0x71, 0xf,0x50,0x72, 0x7,0x26,0x2e, + 0x7,0x26,0x36, 0x7,0x26,0x37, 0x4,0x51,0x7b, 0x7,0x30,0x6d, + 0x5,0x56,0x3d, 0x5,0x56,0x40, 0x7,0x30,0x69, 0x5,0x56,0x3c, + 0x5,0x56,0x3f, 0x5,0x56,0x3e, 0x4,0x51,0x7e, 0x5,0x56,0x3b, + 0x5,0x56,0x43, 0x7,0x30,0x63, 0x7,0x30,0x64, 0x5,0x56,0x42, + 0x7,0x30,0x62, 0x5,0x56,0x46, 0x5,0x5c,0x5b, 0x5,0x56,0x47, + 0x7,0x30,0x6b, 0x7,0x30,0x6a, 0x7,0x30,0x6c, 0x7,0x30,0x61, + 0xf,0x56,0x54, 0xf,0x56,0x55, 0x7,0x30,0x65, 0x7,0x30,0x67, + 0x7,0x30,0x68, 0x5,0x56,0x44, 0x5,0x56,0x41, 0x5,0x5c,0x5e, + 0x5,0x5c,0x61, 0x5,0x5c,0x62, 0x5,0x5c,0x5f, 0x5,0x5c,0x5c, + 0x5,0x5c,0x5d, 0x4,0x57,0x4a, 0x7,0x39,0x77, 0x5,0x5c,0x64, + 0x4,0x57,0x46, 0x5,0x5c,0x60, 0x7,0x39,0x7a, 0xf,0x5b,0x54, + 0xf,0x5b,0x55, 0xf,0x5b,0x56, 0xf,0x5b,0x57, 0xf,0x5b,0x58, + 0xf,0x5b,0x5a, 0x7,0x39,0x78, 0xf,0x5b,0x53, 0x5,0x56,0x48, + 0x7,0x39,0x79, 0x5,0x5c,0x63, 0xf,0x56,0x53, 0x5,0x62,0x7d, + 0x5,0x63,0x26, 0x5,0x63,0x24, 0x5,0x63,0x21, 0x5,0x63,0x22, + 0x5,0x63,0x25, 0x7,0x41,0x30, 0x5,0x62,0x7e, 0x7,0x41,0x2f, + 0x5,0x63,0x23, 0xf,0x5f,0x6c, 0xf,0x5f,0x6d, 0xf,0x5f,0x6e, + 0xf,0x5f,0x6f, 0xf,0x5f,0x70, 0xf,0x5f,0x71, 0xf,0x5f,0x72, + 0x5,0x62,0x7c, 0x5,0x68,0x5e, 0x4,0x60,0x43, 0x5,0x68,0x5c, + 0x4,0x60,0x44, 0x4,0x60,0x47, 0x7,0x48,0x3f, 0x4,0x60,0x46, + 0x5,0x68,0x5d, 0x7,0x4e,0x62, 0x7,0x48,0x41, 0x7,0x48,0x3e, + 0xf,0x63,0x30, 0x7,0x48,0x40, 0x5,0x6c,0x6b, 0x4,0x63,0x7a, + 0x4,0x63,0x78, 0x5,0x6c,0x6a, 0x7,0x4e,0x60, 0x4,0x5c,0x38, + 0x5,0x6c,0x69, 0x5,0x6c,0x6c, 0x7,0x4e,0x5f, 0x7,0x4e,0x61, + 0xf,0x65,0x60, 0xf,0x65,0x61, 0xf,0x65,0x63, 0x7,0x4e,0x63, + 0x5,0x6c,0x6d, 0x7,0x54,0x28, 0x7,0x54,0x27, 0x5,0x70,0x58, + 0x7,0x54,0x29, 0x7,0x58,0x4d, 0x5,0x73,0x6c, 0x7,0x58,0x4e, + 0x5,0x76,0x30, 0x5,0x76,0x31, 0x7,0x58,0x4f, 0x5,0x77,0x70, + 0x7,0x5c,0x2d, 0x7,0x5c,0x2e, 0x7,0x5f,0x28, 0x7,0x5e,0x71, + 0xf,0x6b,0x57, 0xf,0x6b,0x58, 0x4,0x6c,0x77, 0x5,0x79,0x33, + 0xf,0x6c,0x34, 0x4,0x6c,0x78, 0x5,0x7a,0x2e, 0x5,0x7b,0x61, + 0x5,0x7b,0x62, 0x6,0x23,0x37, 0x5,0x24,0x6f, 0x5,0x24,0x70, + 0x4,0x27,0x59, 0x4,0x27,0x5a, 0x4,0x27,0x58, 0x6,0x2d,0x4d, + 0x6,0x2d,0x4c, 0x6,0x2d,0x4f, 0x3,0x2a,0x45, 0x6,0x2d,0x4b, + 0xf,0x28,0x43, 0x4,0x2a,0x74, 0x6,0x33,0x59, 0x6,0x33,0x5b, + 0x6,0x33,0x58, 0x5,0x2a,0x77, 0x4,0x2a,0x73, 0x5,0x2a,0x79, + 0x5,0x2a,0x78, 0x6,0x33,0x5a, 0x6,0x33,0x5c, 0x6,0x33,0x5d, + 0x5,0x2a,0x7a, 0xf,0x2c,0x71, 0xf,0x2c,0x72, 0xf,0x2c,0x73, + 0x5,0x2f,0x3f, 0x4,0x2e,0x66, 0x4,0x2e,0x6b, 0x4,0x2e,0x68, + 0x5,0x2f,0x43, 0x5,0x2f,0x42, 0x5,0x2f,0x41, 0x6,0x3a,0x4c, + 0x4,0x2e,0x69, 0x4,0x2e,0x6a, 0x4,0x2e,0x67, 0x6,0x3a,0x4a, + 0x6,0x3a,0x48, 0x5,0x2f,0x40, 0x5,0x2f,0x44, 0xf,0x31,0x58, + 0xf,0x31,0x59, 0xf,0x31,0x5a, 0x6,0x3a,0x4b, 0x6,0x3a,0x49, + 0x5,0x34,0x44, 0x5,0x34,0x43, 0x6,0x42,0x6c, 0x6,0x42,0x6b, + 0x6,0x42,0x6d, 0x5,0x34,0x41, 0x4,0x33,0x6e, 0x5,0x34,0x42, + 0x5,0x34,0x40, 0x6,0x42,0x6e, 0xf,0x37,0x40, 0xf,0x37,0x41, + 0xf,0x37,0x42, 0xf,0x37,0x43, 0xf,0x37,0x44, 0x5,0x3a,0x72, + 0x4,0x39,0x66, 0x5,0x3a,0x74, 0x6,0x4c,0x4e, 0x6,0x4c,0x4a, + 0x4,0x39,0x69, 0x6,0x4c,0x52, 0x5,0x3a,0x69, 0x5,0x3a,0x6f, + 0x5,0x3a,0x71, 0x6,0x4c,0x50, 0x5,0x3a,0x67, 0x6,0x4c,0x51, + 0x5,0x3a,0x68, 0x6,0x4c,0x4b, 0x5,0x3a,0x6a, 0x4,0x39,0x68, + 0x5,0x3a,0x73, 0x6,0x4c,0x4c, 0x5,0x3a,0x70, 0x6,0x4c,0x49, + 0x5,0x3a,0x66, 0x5,0x3a,0x6d, 0x6,0x4c,0x4f, 0x5,0x3a,0x6e, + 0x5,0x3a,0x6b, 0x6,0x4c,0x4d, 0xf,0x3d,0x6b, 0x5,0x41,0x3a, + 0x6,0x56,0x29, 0x5,0x41,0x3c, 0x5,0x41,0x3b, 0x5,0x41,0x3e, + 0x6,0x56,0x22, 0x6,0x56,0x24, 0x5,0x3a,0x6c, 0x5,0x41,0x3d, + 0x5,0x41,0x3f, 0x6,0x56,0x28, 0x6,0x56,0x2b, 0x5,0x41,0x40, + 0x6,0x56,0x26, 0x6,0x56,0x25, 0xf,0x44,0x3b, 0xf,0x44,0x3d, + 0xf,0x44,0x3e, 0xf,0x44,0x3f, 0xf,0x44,0x40, 0x6,0x56,0x23, + 0x6,0x56,0x2a, 0x6,0x57,0x26, 0x4,0x45,0x61, 0x6,0x5f,0x77, + 0x5,0x48,0x32, 0x6,0x5f,0x76, 0x6,0x5f,0x72, 0x6,0x5f,0x74, + 0x6,0x5f,0x73, 0x5,0x48,0x31, 0x6,0x5f,0x79, 0xf,0x4a,0x66, + 0x5,0x48,0x33, 0x6,0x5f,0x71, 0xf,0x44,0x3c, 0x7,0x26,0x3b, + 0x5,0x4f,0x21, 0x5,0x4f,0x27, 0x5,0x4f,0x2a, 0x5,0x48,0x30, + 0x7,0x26,0x3a, 0x5,0x4f,0x2b, 0x5,0x4f,0x26, 0x5,0x4f,0x22, + 0x5,0x4f,0x2c, 0x5,0x4f,0x25, 0x7,0x26,0x39, 0x5,0x4e,0x7e, + 0x5,0x4f,0x28, 0x5,0x4f,0x24, 0x5,0x4f,0x29, 0x7,0x27,0x2e, + 0x4,0x4b,0x6d, 0x5,0x56,0x4f, 0x5,0x56,0x51, 0x4,0x52,0x23, + 0x5,0x56,0x50, 0x4,0x52,0x26, 0x5,0x56,0x49, 0x4,0x52,0x28, + 0x7,0x30,0x70, 0x5,0x56,0x4a, 0x5,0x56,0x4c, 0x5,0x56,0x4b, + 0x5,0x56,0x53, 0x5,0x56,0x4d, 0x5,0x56,0x54, 0x7,0x30,0x6e, + 0x5,0x56,0x4e, 0x5,0x5c,0x65, 0x5,0x56,0x55, 0xf,0x56,0x56, + 0xf,0x56,0x57, 0xf,0x56,0x58, 0xf,0x56,0x59, 0xf,0x56,0x5a, + 0x7,0x30,0x71, 0x5,0x5c,0x6a, 0x5,0x5c,0x67, 0x7,0x3a,0x21, + 0x4,0x57,0x4e, 0x5,0x5c,0x69, 0x7,0x39,0x7c, 0x7,0x39,0x7d, + 0x7,0x39,0x7b, 0x5,0x5c,0x66, 0x7,0x39,0x7e, 0x7,0x30,0x72, + 0x5,0x5c,0x68, 0xf,0x5b,0x5b, 0x5,0x63,0x28, 0x5,0x63,0x27, + 0xf,0x5f,0x74, 0x4,0x60,0x4a, 0x7,0x48,0x44, 0x7,0x48,0x43, + 0x5,0x68,0x5f, 0x7,0x48,0x42, 0x7,0x4e,0x64, 0x7,0x4e,0x66, + 0x5,0x68,0x60, 0x4,0x63,0x7b, 0x5,0x6c,0x6e, 0x7,0x54,0x2d, + 0x7,0x4e,0x67, 0x7,0x4e,0x65, 0xf,0x65,0x64, 0x5,0x70,0x5b, + 0x7,0x54,0x2b, 0x4,0x66,0x67, 0x4,0x66,0x66, 0x5,0x70,0x59, + 0x7,0x54,0x2c, 0x5,0x70,0x5a, 0xf,0x68,0x21, 0xf,0x65,0x65, + 0x5,0x76,0x32, 0x7,0x5c,0x2f, 0x5,0x77,0x71, 0x7,0x61,0x2a, + 0xf,0x6b,0x59, 0x7,0x5f,0x29, 0x5,0x79,0x34, 0x7,0x62,0x4a, + 0x5,0x7b,0x63, 0x6,0x28,0x72, 0x6,0x28,0x71, 0x5,0x27,0x49, + 0x5,0x27,0x4a, 0x4,0x2a,0x75, 0xf,0x2c,0x74, 0xf,0x2c,0x78, + 0x4,0x2e,0x6f, 0x5,0x2f,0x47, 0x5,0x2f,0x48, 0x4,0x2e,0x6c, + 0x5,0x2f,0x46, 0x5,0x2f,0x45, 0x4,0x2e,0x6e, 0xf,0x31,0x5c, + 0xf,0x31,0x5d, 0xf,0x31,0x5e, 0xf,0x31,0x5f, 0xf,0x31,0x61, + 0xf,0x31,0x62, 0x6,0x3a,0x4d, 0x6,0x3a,0x4e, 0x6,0x42,0x72, + 0x4,0x33,0x73, 0x6,0x42,0x71, 0x6,0x42,0x73, 0x6,0x42,0x70, + 0x4,0x33,0x74, 0xf,0x37,0x45, 0xf,0x37,0x47, 0x5,0x34,0x47, + 0xf,0x37,0x48, 0x4,0x39,0x6b, 0x6,0x4c,0x55, 0x5,0x3a,0x75, + 0x5,0x3a,0x77, 0x5,0x3a,0x76, 0x5,0x3a,0x78, 0x6,0x4c,0x54, + 0xf,0x3d,0x6d, 0xf,0x3d,0x6e, 0xf,0x3d,0x6f, 0xf,0x3d,0x70, + 0x4,0x3f,0x56, 0x4,0x3f,0x58, 0x5,0x41,0x42, 0x4,0x3f,0x59, + 0x6,0x56,0x2c, 0x5,0x41,0x41, 0x6,0x56,0x2d, 0x6,0x56,0x2e, + 0xf,0x44,0x41, 0xf,0x44,0x42, 0xf,0x44,0x43, 0x5,0x41,0x43, + 0x5,0x48,0x34, 0x6,0x5f,0x7a, 0x5,0x48,0x35, 0x4,0x45,0x62, + 0xf,0x4a,0x67, 0xf,0x4a,0x68, 0xf,0x4a,0x6a, 0xf,0x4a,0x69, + 0x7,0x26,0x3f, 0x4,0x4b,0x6e, 0x5,0x4f,0x2d, 0xf,0x50,0x73, + 0xf,0x50,0x74, 0xf,0x50,0x75, 0x7,0x26,0x3d, 0xf,0x56,0x5c, + 0xf,0x56,0x5b, 0x4,0x57,0x51, 0x7,0x30,0x74, 0x5,0x56,0x56, + 0xf,0x5b,0x5c, 0x5,0x5c,0x6c, 0x5,0x5d,0x63, 0x7,0x3a,0x22, + 0x5,0x5c,0x6b, 0x5,0x63,0x2a, 0x7,0x3a,0x23, 0xf,0x5f,0x75, + 0x7,0x41,0x31, 0x5,0x63,0x29, 0x7,0x4e,0x68, 0x7,0x54,0x2e, + 0xf,0x65,0x66, 0x7,0x48,0x45, 0x5,0x70,0x5c, 0xf,0x68,0x22, + 0x7,0x58,0x50, 0xf,0x69,0x5e, 0xf,0x6a,0x68, 0x7,0x61,0x2b, + 0xf,0x25,0x26, 0x5,0x27,0x4b, 0x6,0x2d,0x50, 0x5,0x27,0x4d, + 0x5,0x27,0x4c, 0x5,0x2a,0x7c, 0x5,0x2a,0x7d, 0x5,0x2a,0x7b, + 0x6,0x33,0x5f, 0x6,0x33,0x5e, 0x5,0x2a,0x7e, 0xf,0x2c,0x79, + 0xf,0x2c,0x7a, 0xf,0x2c,0x7b, 0xf,0x2c,0x7c, 0xf,0x2c,0x7d, + 0xf,0x29,0x24, 0x5,0x2f,0x4e, 0x5,0x2f,0x49, 0x4,0x2e,0x74, + 0x5,0x2f,0x4a, 0x5,0x2f,0x4c, 0x5,0x2f,0x4d, 0x6,0x3a,0x50, + 0x5,0x2f,0x51, 0x5,0x2f,0x4f, 0x5,0x2f,0x4b, 0x6,0x3a,0x4f, + 0x6,0x3a,0x51, 0x5,0x2f,0x50, 0x5,0x2f,0x52, 0xf,0x31,0x63, + 0xf,0x31,0x64, 0xf,0x31,0x65, 0xf,0x31,0x66, 0xf,0x31,0x67, + 0xf,0x31,0x68, 0xf,0x31,0x69, 0xf,0x31,0x6a, 0x4,0x2e,0x76, + 0x6,0x42,0x74, 0x6,0x42,0x7a, 0x5,0x34,0x4a, 0x4,0x33,0x79, + 0x5,0x34,0x4d, 0x6,0x42,0x77, 0x5,0x34,0x4c, 0x6,0x42,0x7c, + 0x4,0x33,0x75, 0x5,0x34,0x4e, 0x6,0x42,0x75, 0x5,0x2f,0x53, + 0x5,0x34,0x49, 0x6,0x42,0x79, 0x6,0x42,0x7b, 0x5,0x34,0x50, + 0x5,0x34,0x51, 0x6,0x42,0x78, 0xf,0x37,0x49, 0xf,0x37,0x4a, + 0xf,0x37,0x4b, 0xf,0x37,0x4c, 0xf,0x37,0x4e, 0xf,0x37,0x4f, + 0x5,0x3a,0x7c, 0x5,0x3b,0x22, 0x5,0x3a,0x7b, 0x5,0x3a,0x7e, + 0x4,0x39,0x6c, 0x4,0x39,0x6e, 0x6,0x4c,0x5a, 0x5,0x34,0x4b, + 0x4,0x39,0x73, 0x5,0x3b,0x21, 0x5,0x3a,0x7a, 0x4,0x39,0x79, + 0x4,0x39,0x77, 0x4,0x39,0x70, 0x6,0x4c,0x5d, 0x4,0x39,0x78, + 0x6,0x4c,0x57, 0x5,0x3b,0x25, 0x6,0x4c,0x59, 0x6,0x4c,0x5c, + 0x5,0x34,0x4f, 0x5,0x3a,0x7d, 0xf,0x3d,0x71, 0xf,0x3d,0x72, + 0xf,0x3d,0x73, 0xf,0x3d,0x74, 0xf,0x3d,0x75, 0xf,0x3d,0x76, + 0xf,0x3d,0x78, 0xf,0x3d,0x79, 0xf,0x3d,0x7a, 0xf,0x3d,0x77, + 0x5,0x3b,0x23, 0x5,0x41,0x54, 0x5,0x41,0x48, 0x5,0x41,0x4f, + 0x4,0x3f,0x5c, 0x5,0x41,0x4d, 0x5,0x41,0x45, 0x4,0x3f,0x64, + 0x4,0x3f,0x65, 0x5,0x41,0x50, 0x4,0x3f,0x5f, 0x5,0x3a,0x79, + 0x6,0x56,0x30, 0x5,0x41,0x46, 0x5,0x41,0x55, 0x5,0x41,0x4b, + 0x5,0x41,0x52, 0x5,0x41,0x44, 0x5,0x41,0x49, 0x5,0x41,0x4c, + 0x6,0x56,0x34, 0x6,0x56,0x32, 0x6,0x56,0x37, 0x6,0x56,0x3a, + 0x6,0x56,0x33, 0x6,0x56,0x36, 0x6,0x56,0x38, 0x6,0x5f,0x7b, + 0x5,0x41,0x53, 0x5,0x41,0x51, 0x5,0x41,0x4e, 0x5,0x41,0x47, + 0x6,0x56,0x31, 0x6,0x4c,0x58, 0x6,0x56,0x35, 0x6,0x56,0x39, + 0xf,0x44,0x44, 0xf,0x44,0x46, 0xf,0x44,0x47, 0xf,0x44,0x48, + 0xf,0x44,0x49, 0xf,0x44,0x4a, 0xf,0x44,0x4b, 0xf,0x44,0x4c, + 0xf,0x44,0x4d, 0xf,0x44,0x4e, 0xf,0x44,0x4f, 0xf,0x44,0x50, + 0x6,0x56,0x2f, 0xf,0x41,0x3e, 0x5,0x48,0x45, 0x5,0x41,0x56, + 0x4,0x45,0x6c, 0x5,0x48,0x43, 0x6,0x60,0x27, 0x4,0x45,0x67, + 0x6,0x5f,0x7c, 0x6,0x5f,0x7d, 0x5,0x48,0x3c, 0x5,0x48,0x3b, + 0x5,0x48,0x42, 0x4,0x45,0x6f, 0x6,0x60,0x28, 0x5,0x48,0x40, + 0x6,0x60,0x26, 0x5,0x48,0x38, 0x5,0x48,0x39, 0x6,0x60,0x25, + 0x6,0x60,0x21, 0x5,0x48,0x3a, 0x5,0x48,0x41, 0x5,0x48,0x37, + 0x5,0x48,0x3d, 0x6,0x60,0x22, 0x5,0x41,0x4a, 0x5,0x48,0x47, + 0x6,0x5f,0x7e, 0x5,0x48,0x3e, 0x6,0x60,0x24, 0x5,0x48,0x3f, + 0x4,0x45,0x71, 0x5,0x48,0x44, 0xf,0x4a,0x6b, 0xf,0x4a,0x6c, + 0xf,0x4a,0x6d, 0xf,0x4a,0x6e, 0xf,0x4a,0x6f, 0xf,0x4a,0x70, + 0xf,0x4a,0x73, 0xf,0x4a,0x74, 0xf,0x4a,0x75, 0xf,0x4a,0x76, + 0xf,0x4a,0x77, 0xf,0x4a,0x78, 0xf,0x4a,0x79, 0xf,0x4a,0x7a, + 0xf,0x4a,0x72, 0xf,0x4a,0x71, 0x5,0x4f,0x3a, 0x7,0x26,0x49, + 0x7,0x26,0x4b, 0x5,0x4f,0x44, 0x4,0x4c,0x2f, 0x5,0x4f,0x33, + 0x7,0x26,0x51, 0x7,0x26,0x4a, 0x5,0x4f,0x3e, 0x4,0x4b,0x71, + 0x4,0x4b,0x6f, 0x5,0x4f,0x41, 0x5,0x4f,0x2f, 0x5,0x4f,0x34, + 0x5,0x4f,0x43, 0x7,0x26,0x42, 0x5,0x4f,0x40, 0x5,0x4f,0x31, + 0x4,0x52,0x40, 0x5,0x4f,0x39, 0x5,0x4f,0x42, 0x4,0x4b,0x72, + 0x4,0x4c,0x29, 0x4,0x4c,0x23, 0x4,0x4b,0x7d, 0x5,0x4f,0x38, + 0x5,0x4f,0x37, 0x5,0x4f,0x3c, 0x7,0x26,0x4e, 0x5,0x48,0x48, + 0x5,0x4f,0x35, 0x7,0x26,0x50, 0x7,0x26,0x47, 0x7,0x26,0x44, + 0x5,0x4f,0x3f, 0x7,0x26,0x40, 0x7,0x26,0x53, 0x4,0x4c,0x24, + 0x7,0x26,0x4f, 0x4,0x4b,0x7c, 0x7,0x26,0x4c, 0x5,0x4f,0x3d, + 0x7,0x26,0x45, 0x7,0x26,0x43, 0x5,0x4f,0x2e, 0x7,0x26,0x48, + 0x7,0x26,0x46, 0x5,0x4f,0x46, 0xf,0x50,0x78, 0x7,0x26,0x52, + 0xf,0x50,0x77, 0xf,0x50,0x7a, 0xf,0x50,0x7b, 0xf,0x50,0x7c, + 0xf,0x50,0x7d, 0xf,0x50,0x7e, 0xf,0x51,0x22, 0xf,0x51,0x24, + 0xf,0x51,0x29, 0xf,0x51,0x25, 0xf,0x51,0x26, 0xf,0x51,0x27, + 0xf,0x51,0x2a, 0x5,0x56,0x64, 0x4,0x52,0x41, 0x4,0x52,0x3e, + 0x5,0x56,0x58, 0x5,0x56,0x5e, 0x5,0x56,0x66, 0x7,0x31,0x2a, + 0x5,0x56,0x5c, 0x4,0x52,0x2e, 0x5,0x56,0x5d, 0x4,0x52,0x2c, + 0x5,0x56,0x68, 0x7,0x26,0x41, 0x7,0x31,0x25, 0x4,0x52,0x32, + 0x5,0x56,0x67, 0x4,0x52,0x31, 0x7,0x31,0x29, 0x4,0x52,0x3c, + 0x7,0x30,0x7e, 0x7,0x31,0x26, 0x4,0x52,0x30, 0x5,0x56,0x60, + 0x7,0x30,0x7b, 0x4,0x52,0x3f, 0x5,0x56,0x5f, 0x5,0x56,0x59, + 0x7,0x30,0x7a, 0x7,0x31,0x28, 0x4,0x52,0x2a, 0x5,0x56,0x57, + 0x7,0x31,0x24, 0x4,0x52,0x35, 0x5,0x56,0x65, 0x7,0x30,0x7d, + 0x5,0x56,0x62, 0x4,0x52,0x33, 0x7,0x31,0x2b, 0x7,0x30,0x75, + 0x7,0x31,0x27, 0x5,0x4f,0x30, 0x5,0x56,0x63, 0x5,0x56,0x5a, + 0x7,0x30,0x78, 0x7,0x31,0x23, 0x7,0x30,0x76, 0x5,0x56,0x61, + 0xf,0x56,0x72, 0x5,0x56,0x5b, 0x7,0x30,0x7c, 0x7,0x30,0x77, + 0x7,0x31,0x22, 0xf,0x56,0x5d, 0xf,0x56,0x5e, 0xf,0x56,0x60, + 0xf,0x56,0x61, 0xf,0x56,0x62, 0xf,0x56,0x63, 0xf,0x56,0x64, + 0xf,0x56,0x65, 0xf,0x56,0x66, 0xf,0x56,0x67, 0xf,0x56,0x68, + 0xf,0x56,0x69, 0xf,0x56,0x6a, 0xf,0x56,0x6b, 0xf,0x56,0x6c, + 0xf,0x56,0x6d, 0xf,0x56,0x6e, 0xf,0x56,0x6f, 0xf,0x56,0x70, + 0xf,0x56,0x71, 0xf,0x56,0x73, 0x7,0x30,0x79, 0xf,0x50,0x79, + 0x5,0x5d,0x24, 0x5,0x5d,0x21, 0x4,0x57,0x5d, 0x5,0x5c,0x75, + 0x5,0x5d,0x2d, 0x5,0x5c,0x79, 0x4,0x57,0x5c, 0x4,0x57,0x63, + 0x4,0x57,0x67, 0x7,0x3a,0x2c, 0x5,0x5d,0x2b, 0x4,0x57,0x60, + 0x5,0x5d,0x22, 0x5,0x5c,0x70, 0x5,0x5d,0x23, 0x5,0x5c,0x72, + 0x5,0x5d,0x31, 0x5,0x5c,0x7b, 0x5,0x5d,0x2a, 0x5,0x5c,0x77, + 0x5,0x5d,0x34, 0x7,0x3a,0x24, 0x5,0x5c,0x76, 0x5,0x5c,0x7c, + 0x5,0x5d,0x26, 0x4,0x57,0x64, 0x5,0x5d,0x27, 0x7,0x3a,0x29, + 0x5,0x63,0x42, 0x5,0x5d,0x2c, 0x5,0x5c,0x7a, 0x7,0x3a,0x2f, + 0x7,0x3a,0x28, 0x5,0x5c,0x6f, 0x5,0x5d,0x32, 0x5,0x5d,0x29, + 0x5,0x5c,0x73, 0x7,0x3a,0x2b, 0x5,0x5d,0x2e, 0x5,0x5c,0x71, + 0x5,0x5c,0x6e, 0x5,0x5d,0x28, 0x4,0x57,0x66, 0x4,0x5c,0x3c, + 0x5,0x5d,0x33, 0x5,0x5c,0x78, 0x5,0x5d,0x2f, 0x5,0x5d,0x25, + 0x7,0x31,0x21, 0x5,0x5c,0x74, 0x7,0x3a,0x27, 0x7,0x3a,0x26, + 0x7,0x3a,0x25, 0x7,0x3a,0x2d, 0xf,0x5b,0x5d, 0xf,0x5b,0x5e, + 0xf,0x5b,0x60, 0xf,0x5b,0x61, 0xf,0x5b,0x62, 0xf,0x5b,0x63, + 0xf,0x5b,0x64, 0xf,0x5b,0x66, 0xf,0x5b,0x67, 0xf,0x5b,0x68, + 0xf,0x5b,0x69, 0x7,0x3a,0x2a, 0x7,0x3a,0x2e, 0x4,0x57,0x68, + 0xf,0x5b,0x65, 0x4,0x57,0x61, 0x5,0x63,0x4b, 0x5,0x63,0x47, + 0x5,0x5d,0x35, 0x4,0x5c,0x52, 0x5,0x63,0x45, 0x5,0x63,0x38, + 0x5,0x63,0x33, 0x4,0x5c,0x47, 0x5,0x63,0x4a, 0x5,0x63,0x40, + 0x3,0x58,0x4f, 0x5,0x63,0x2e, 0x4,0x5c,0x4e, 0x4,0x5c,0x45, + 0x5,0x63,0x43, 0x5,0x63,0x39, 0x5,0x63,0x4c, 0x4,0x5c,0x3d, + 0x7,0x41,0x3b, 0x5,0x63,0x46, 0x5,0x63,0x30, 0x5,0x63,0x37, + 0x4,0x5c,0x3e, 0x4,0x5c,0x3f, 0x5,0x63,0x48, 0x7,0x41,0x39, + 0x5,0x63,0x35, 0x5,0x63,0x32, 0x5,0x63,0x3f, 0x7,0x41,0x35, + 0x5,0x63,0x2c, 0x7,0x41,0x36, 0x4,0x5c,0x41, 0x7,0x41,0x33, + 0x4,0x5c,0x53, 0x5,0x63,0x3e, 0x7,0x41,0x38, 0x5,0x63,0x3d, + 0x7,0x41,0x3a, 0x7,0x41,0x3e, 0x7,0x41,0x34, 0x5,0x63,0x31, + 0x4,0x5c,0x4d, 0x5,0x63,0x36, 0x5,0x63,0x3a, 0x5,0x63,0x44, + 0x5,0x63,0x49, 0x5,0x63,0x3c, 0x5,0x63,0x2d, 0x7,0x41,0x42, + 0x7,0x41,0x41, 0x5,0x63,0x3b, 0x5,0x63,0x2b, 0x5,0x63,0x2f, + 0x7,0x41,0x32, 0x7,0x41,0x37, 0xf,0x5f,0x76, 0xf,0x5f,0x77, + 0xf,0x5f,0x78, 0xf,0x5f,0x79, 0xf,0x5f,0x7a, 0xf,0x5f,0x7b, + 0xf,0x5f,0x7c, 0xf,0x5f,0x7d, 0xf,0x5f,0x7e, 0xf,0x60,0x21, + 0xf,0x60,0x23, 0xf,0x60,0x24, 0xf,0x60,0x25, 0x7,0x41,0x40, + 0x7,0x41,0x3d, 0xf,0x5b,0x6a, 0xf,0x63,0x36, 0xf,0x63,0x37, + 0xf,0x60,0x22, 0x5,0x68,0x6a, 0x5,0x68,0x6f, 0x7,0x48,0x4e, + 0x4,0x60,0x59, 0x7,0x48,0x4c, 0x5,0x68,0x63, 0x4,0x60,0x54, + 0x4,0x60,0x55, 0x4,0x60,0x51, 0x5,0x68,0x69, 0x4,0x60,0x4f, + 0x4,0x60,0x50, 0x7,0x48,0x48, 0x4,0x60,0x52, 0x5,0x68,0x62, + 0x4,0x60,0x58, 0x4,0x60,0x4d, 0x7,0x48,0x47, 0x5,0x68,0x6d, + 0x5,0x68,0x68, 0x5,0x68,0x70, 0x5,0x68,0x6c, 0x5,0x68,0x6b, + 0x5,0x68,0x65, 0x5,0x68,0x64, 0x5,0x68,0x67, 0x7,0x48,0x46, + 0x7,0x48,0x4a, 0x5,0x68,0x61, 0x5,0x68,0x71, 0x7,0x48,0x49, + 0xf,0x63,0x31, 0xf,0x63,0x33, 0xf,0x63,0x34, 0xf,0x63,0x35, + 0xf,0x63,0x38, 0xf,0x63,0x39, 0xf,0x63,0x3a, 0xf,0x63,0x3b, + 0xf,0x63,0x3c, 0x7,0x48,0x4b, 0x7,0x48,0x4d, 0x5,0x6c,0x7c, + 0x5,0x6c,0x7b, 0x5,0x6c,0x76, 0x4,0x60,0x57, 0x5,0x6c,0x74, + 0x7,0x4e,0x6c, 0x5,0x6c,0x7a, 0x4,0x63,0x7d, 0x7,0x4e,0x74, + 0x4,0x64,0x22, 0x5,0x6c,0x78, 0x5,0x6c,0x73, 0x4,0x66,0x70, + 0x7,0x4e,0x6a, 0x5,0x6c,0x6f, 0x5,0x6c,0x75, 0x5,0x6c,0x71, + 0x7,0x4e,0x69, 0x7,0x4e,0x75, 0x5,0x6c,0x77, 0x7,0x4e,0x6d, + 0x7,0x4e,0x6e, 0x5,0x6c,0x72, 0x7,0x4e,0x6f, 0x7,0x54,0x38, + 0x7,0x4e,0x71, 0x7,0x4e,0x70, 0x7,0x4e,0x72, 0x7,0x4e,0x73, + 0xf,0x65,0x68, 0xf,0x65,0x69, 0x7,0x4e,0x6b, 0x5,0x70,0x64, + 0x5,0x70,0x68, 0x5,0x70,0x69, 0x4,0x66,0x71, 0x4,0x66,0x6b, + 0x5,0x70,0x66, 0x5,0x70,0x6b, 0x7,0x54,0x2f, 0x5,0x70,0x5e, + 0x5,0x70,0x63, 0x5,0x70,0x60, 0x4,0x64,0x21, 0x5,0x70,0x67, + 0x5,0x70,0x5f, 0x5,0x6c,0x70, 0x7,0x54,0x35, 0x5,0x70,0x6a, + 0x5,0x70,0x5d, 0x7,0x54,0x31, 0x5,0x70,0x65, 0x4,0x69,0x27, + 0x5,0x70,0x6c, 0x7,0x54,0x36, 0x7,0x54,0x30, 0x7,0x54,0x34, + 0xf,0x68,0x23, 0xf,0x68,0x24, 0xf,0x68,0x25, 0xf,0x68,0x26, + 0xf,0x68,0x27, 0xf,0x68,0x28, 0xf,0x68,0x29, 0x7,0x54,0x33, + 0x7,0x54,0x39, 0x7,0x54,0x32, 0x7,0x58,0x55, 0x4,0x69,0x24, + 0x4,0x69,0x23, 0x5,0x73,0x70, 0x5,0x73,0x6e, 0x5,0x70,0x62, + 0x5,0x73,0x71, 0x7,0x58,0x52, 0x5,0x70,0x6d, 0x7,0x58,0x51, + 0x5,0x73,0x74, 0x4,0x69,0x25, 0x5,0x73,0x6d, 0x7,0x58,0x54, + 0x7,0x54,0x37, 0x5,0x73,0x76, 0x5,0x73,0x73, 0x5,0x73,0x6f, + 0x5,0x73,0x75, 0x5,0x73,0x72, 0x7,0x58,0x56, 0xf,0x69,0x5f, + 0xf,0x69,0x60, 0xf,0x69,0x61, 0xf,0x69,0x62, 0x7,0x58,0x53, + 0x7,0x59,0x34, 0x4,0x6a,0x5e, 0x5,0x76,0x33, 0x7,0x5c,0x31, + 0x5,0x76,0x34, 0x4,0x6a,0x5f, 0x4,0x6a,0x60, 0x4,0x6a,0x62, + 0x7,0x5c,0x30, 0x5,0x76,0x36, 0x7,0x5c,0x32, 0x5,0x76,0x35, + 0x7,0x5c,0x36, 0x7,0x5c,0x35, 0xf,0x6a,0x69, 0x7,0x5c,0x33, + 0x7,0x5c,0x37, 0x7,0x5c,0x34, 0x5,0x77,0x72, 0x7,0x5f,0x2b, + 0x7,0x5f,0x2e, 0x5,0x77,0x74, 0x5,0x77,0x75, 0x7,0x5f,0x2d, + 0x5,0x76,0x37, 0x7,0x5f,0x2c, 0x7,0x5f,0x2a, 0x5,0x77,0x73, + 0x7,0x5f,0x31, 0x4,0x6b,0x77, 0xf,0x6b,0x5a, 0xf,0x6b,0x5b, + 0xf,0x6b,0x5c, 0x7,0x5f,0x2f, 0x5,0x79,0x35, 0x7,0x61,0x2c, + 0x7,0x61,0x2e, 0x7,0x61,0x31, 0x4,0x6c,0x79, 0x7,0x61,0x2f, + 0x7,0x5f,0x30, 0x7,0x61,0x2d, 0x5,0x7a,0x31, 0x5,0x7a,0x2f, + 0x5,0x7a,0x30, 0x7,0x61,0x30, 0xf,0x6c,0x4f, 0xf,0x6c,0x4d, + 0x7,0x63,0x5e, 0x7,0x63,0x5f, 0xf,0x6c,0x68, 0x7,0x63,0x60, + 0x5,0x7b,0x44, 0x5,0x7b,0x64, 0xf,0x6d,0x27, 0x7,0x64,0x54, + 0x4,0x6e,0x4e, 0x5,0x7b,0x7c, 0x5,0x7c,0x2b, 0x5,0x24,0x71, + 0xf,0x25,0x27, 0x5,0x27,0x4e, 0x6,0x2d,0x51, 0xf,0x28,0x45, + 0x6,0x33,0x61, 0x5,0x2b,0x22, 0x6,0x33,0x60, 0x5,0x2b,0x23, + 0xf,0x2c,0x7e, 0xf,0x2d,0x22, 0x6,0x3a,0x52, 0x5,0x2f,0x54, + 0x6,0x3a,0x56, 0x5,0x2f,0x55, 0x6,0x3a,0x54, 0x5,0x2f,0x56, + 0xf,0x31,0x6b, 0xf,0x31,0x6c, 0xf,0x31,0x6d, 0xf,0x31,0x6e, + 0x6,0x3a,0x53, 0x6,0x3a,0x55, 0x4,0x33,0x7e, 0x5,0x34,0x55, + 0x4,0x34,0x24, 0x5,0x34,0x54, 0x4,0x34,0x21, 0x5,0x34,0x58, + 0x5,0x34,0x53, 0x5,0x34,0x56, 0x5,0x34,0x57, 0x4,0x34,0x23, + 0x5,0x34,0x5a, 0x5,0x34,0x52, 0x6,0x42,0x7d, 0x6,0x4c,0x63, + 0x6,0x43,0x21, 0xf,0x37,0x50, 0xf,0x37,0x51, 0x6,0x42,0x7e, + 0xf,0x37,0x52, 0x5,0x3b,0x26, 0x4,0x39,0x7a, 0x6,0x4c,0x61, + 0x6,0x4c,0x5e, 0x6,0x4c,0x65, 0x5,0x3b,0x28, 0x4,0x3a,0x21, + 0x6,0x4c,0x64, 0x6,0x4c,0x5f, 0xf,0x3d,0x7c, 0xf,0x3d,0x7e, + 0xf,0x3e,0x22, 0xf,0x3d,0x7b, 0x6,0x4c,0x62, 0x5,0x41,0x57, + 0x4,0x3f,0x68, 0x6,0x56,0x3d, 0x5,0x41,0x59, 0x5,0x41,0x5a, + 0x5,0x3b,0x27, 0x5,0x41,0x58, 0x6,0x56,0x3f, 0x6,0x56,0x3e, + 0x4,0x39,0x7e, 0x5,0x41,0x5b, 0x5,0x41,0x5d, 0x5,0x41,0x5c, + 0x6,0x56,0x41, 0xf,0x44,0x52, 0xf,0x44,0x53, 0xf,0x44,0x55, + 0xf,0x44,0x56, 0x6,0x56,0x3b, 0xf,0x44,0x54, 0x6,0x56,0x40, + 0xf,0x44,0x51, 0x6,0x60,0x2d, 0x5,0x48,0x4a, 0x6,0x60,0x2b, + 0x6,0x60,0x2e, 0x5,0x48,0x4c, 0x4,0x45,0x73, 0x6,0x56,0x3c, + 0x6,0x60,0x33, 0x6,0x60,0x32, 0x5,0x48,0x4b, 0x6,0x60,0x30, + 0x5,0x48,0x49, 0x5,0x48,0x4d, 0xf,0x4a,0x7c, 0xf,0x4a,0x7d, + 0xf,0x4a,0x7e, 0xf,0x4b,0x21, 0xf,0x4b,0x22, 0xf,0x4b,0x23, + 0xf,0x4b,0x25, 0xf,0x4b,0x26, 0xf,0x4b,0x28, 0xf,0x4b,0x29, + 0xf,0x4b,0x2a, 0xf,0x4b,0x2d, 0x6,0x60,0x2f, 0xf,0x4b,0x2c, + 0x6,0x60,0x29, 0x6,0x60,0x2a, 0xf,0x4b,0x24, 0x7,0x26,0x58, + 0x7,0x26,0x54, 0x4,0x4c,0x36, 0x5,0x4f,0x4b, 0x7,0x26,0x55, + 0x7,0x26,0x59, 0x4,0x4c,0x33, 0x5,0x4f,0x4a, 0x5,0x4f,0x4c, + 0x5,0x4f,0x50, 0x5,0x48,0x4e, 0x5,0x4f,0x4f, 0x5,0x4f,0x4d, + 0x7,0x26,0x5b, 0x7,0x26,0x56, 0x5,0x4f,0x49, 0x4,0x4c,0x34, + 0x5,0x4f,0x4e, 0x4,0x4c,0x32, 0x7,0x26,0x5a, 0x5,0x4f,0x48, + 0x5,0x4f,0x47, 0xf,0x51,0x2b, 0xf,0x51,0x2c, 0xf,0x51,0x2d, + 0xf,0x51,0x2f, 0x5,0x56,0x6e, 0x5,0x56,0x6c, 0x5,0x5d,0x3c, + 0x4,0x52,0x43, 0x5,0x56,0x6b, 0x4,0x52,0x42, 0x7,0x31,0x2f, + 0x7,0x31,0x30, 0x5,0x56,0x6f, 0x7,0x31,0x2c, 0x5,0x56,0x6a, + 0x5,0x56,0x6d, 0x5,0x56,0x70, 0xf,0x56,0x74, 0xf,0x56,0x75, + 0x7,0x31,0x2e, 0x5,0x5d,0x36, 0x5,0x5d,0x38, 0x7,0x3a,0x30, + 0x5,0x5d,0x39, 0x5,0x5d,0x37, 0x5,0x5d,0x3a, 0x5,0x5d,0x3b, + 0x7,0x3a,0x32, 0x7,0x3a,0x34, 0x7,0x3a,0x35, 0x7,0x3a,0x31, + 0xf,0x5b,0x6b, 0xf,0x5b,0x6c, 0xf,0x5b,0x6d, 0xf,0x5b,0x6f, + 0xf,0x5b,0x70, 0xf,0x5b,0x71, 0xf,0x5b,0x72, 0x4,0x57,0x6c, + 0x5,0x63,0x52, 0x7,0x41,0x45, 0x4,0x5c,0x57, 0x5,0x63,0x53, + 0x5,0x63,0x4f, 0x7,0x48,0x56, 0x5,0x63,0x51, 0x5,0x5d,0x3d, + 0x7,0x41,0x46, 0x5,0x63,0x50, 0x7,0x4e,0x78, 0x5,0x63,0x4d, + 0x7,0x41,0x43, 0xf,0x60,0x27, 0xf,0x60,0x28, 0xf,0x60,0x29, + 0xf,0x5b,0x6e, 0x5,0x68,0x74, 0x7,0x48,0x4f, 0x7,0x48,0x50, + 0x4,0x60,0x5e, 0x4,0x60,0x5c, 0x5,0x68,0x73, 0x5,0x70,0x6e, + 0x7,0x48,0x52, 0x7,0x48,0x53, 0x7,0x41,0x48, 0x4,0x60,0x5f, + 0x4,0x5c,0x58, 0x5,0x68,0x75, 0x7,0x41,0x47, 0x5,0x68,0x72, + 0xf,0x63,0x3e, 0x7,0x48,0x51, 0x7,0x48,0x54, 0x7,0x48,0x55, + 0xf,0x63,0x3f, 0x7,0x4e,0x77, 0x5,0x6c,0x7e, 0x7,0x4e,0x76, + 0xf,0x65,0x6a, 0xf,0x65,0x6b, 0x4,0x66,0x73, 0x4,0x66,0x72, + 0x5,0x70,0x6f, 0x7,0x54,0x3d, 0x7,0x54,0x3c, 0xf,0x68,0x2a, + 0xf,0x68,0x2b, 0x7,0x54,0x3b, 0x5,0x73,0x77, 0x7,0x58,0x57, + 0x5,0x73,0x78, 0x4,0x6a,0x63, 0x4,0x6a,0x64, 0x7,0x5c,0x38, + 0xf,0x6a,0x6a, 0x5,0x76,0x38, 0x7,0x5c,0x39, 0x7,0x5f,0x32, + 0x5,0x77,0x77, 0x5,0x77,0x76, 0x5,0x79,0x38, 0x7,0x61,0x33, + 0x5,0x79,0x37, 0x5,0x79,0x36, 0x7,0x61,0x32, 0x7,0x62,0x4c, + 0x4,0x6d,0x5d, 0x5,0x7a,0x32, 0x7,0x62,0x4b, 0x5,0x7a,0x33, + 0x7,0x63,0x62, 0x7,0x63,0x61, 0x5,0x7b,0x7d, 0x7,0x66,0x36, + 0x5,0x27,0x4f, 0x6,0x2d,0x52, 0x5,0x27,0x50, 0xf,0x28,0x47, + 0xf,0x28,0x48, 0x5,0x27,0x51, 0x5,0x2b,0x26, 0x6,0x33,0x62, + 0x6,0x33,0x65, 0x5,0x2b,0x24, 0x5,0x2b,0x25, 0x6,0x33,0x67, + 0x6,0x33,0x63, 0x5,0x2b,0x27, 0xf,0x2d,0x23, 0x6,0x33,0x68, + 0x6,0x3a,0x5b, 0x6,0x3a,0x57, 0x4,0x2e,0x79, 0x6,0x3a,0x63, + 0x4,0x2e,0x7b, 0x6,0x3a,0x5d, 0x6,0x3a,0x5c, 0x6,0x3a,0x5f, + 0x5,0x2f,0x5a, 0x4,0x2e,0x7a, 0x4,0x2f,0x24, 0x6,0x3a,0x64, + 0x6,0x3a,0x59, 0x4,0x2f,0x23, 0x6,0x3a,0x5e, 0x4,0x2f,0x22, + 0x6,0x3a,0x60, 0x6,0x3a,0x58, 0x5,0x2f,0x59, 0x6,0x3a,0x61, + 0x5,0x2f,0x58, 0x5,0x2f,0x57, 0x6,0x3a,0x5a, 0xf,0x31,0x71, + 0xf,0x31,0x72, 0xf,0x31,0x73, 0xf,0x31,0x74, 0xf,0x31,0x75, + 0xf,0x31,0x76, 0xf,0x31,0x77, 0x4,0x2f,0x26, 0x6,0x3a,0x62, + 0x5,0x34,0x5f, 0x5,0x34,0x5d, 0x4,0x34,0x32, 0x4,0x34,0x28, + 0x4,0x34,0x2a, 0x6,0x43,0x28, 0x4,0x34,0x2f, 0x5,0x34,0x5e, + 0x4,0x34,0x31, 0x6,0x43,0x29, 0x5,0x34,0x5b, 0x4,0x34,0x2c, + 0x6,0x43,0x2b, 0x6,0x43,0x2a, 0x6,0x43,0x25, 0x6,0x43,0x23, + 0x6,0x43,0x24, 0x5,0x34,0x5c, 0xf,0x37,0x58, 0xf,0x37,0x59, + 0xf,0x37,0x5a, 0xf,0x37,0x5b, 0x6,0x43,0x27, 0x6,0x43,0x2c, + 0xf,0x37,0x55, 0x5,0x3b,0x31, 0x5,0x3b,0x30, 0x5,0x3b,0x2e, + 0x5,0x3b,0x32, 0x6,0x4c,0x6d, 0x4,0x3a,0x23, 0x6,0x4c,0x66, + 0x6,0x4c,0x6c, 0x4,0x3a,0x22, 0x4,0x3a,0x24, 0x6,0x4c,0x6e, + 0x6,0x43,0x26, 0x6,0x4c,0x67, 0x6,0x4c,0x70, 0x6,0x4c,0x68, + 0x5,0x3b,0x2d, 0x6,0x4c,0x6a, 0x6,0x4c,0x69, 0x6,0x4c,0x6f, + 0x5,0x3b,0x2a, 0x5,0x3b,0x29, 0x5,0x3b,0x2b, 0xf,0x3e,0x25, + 0xf,0x3e,0x26, 0xf,0x3e,0x27, 0xf,0x3e,0x28, 0xf,0x3e,0x29, + 0xf,0x3e,0x2a, 0xf,0x3e,0x2b, 0xf,0x3e,0x2c, 0xf,0x3e,0x2d, + 0xf,0x3e,0x2e, 0x6,0x4c,0x6b, 0x5,0x3b,0x2f, 0x6,0x56,0x4b, + 0x6,0x56,0x42, 0x5,0x41,0x5f, 0x5,0x41,0x5e, 0x4,0x3f,0x6c, + 0x6,0x56,0x44, 0x4,0x3f,0x6d, 0x6,0x56,0x48, 0x6,0x56,0x45, + 0x4,0x3f,0x69, 0x5,0x41,0x61, 0x5,0x41,0x60, 0x6,0x56,0x43, + 0x6,0x56,0x49, 0x4,0x3a,0x25, 0x4,0x3f,0x6b, 0x6,0x56,0x46, + 0x5,0x41,0x62, 0x6,0x56,0x4c, 0x6,0x56,0x4d, 0x4,0x3f,0x72, + 0x6,0x56,0x4a, 0xf,0x44,0x57, 0xf,0x44,0x58, 0xf,0x44,0x59, + 0xf,0x44,0x5a, 0xf,0x44,0x5b, 0xf,0x44,0x5c, 0xf,0x44,0x5d, + 0xf,0x44,0x5e, 0xf,0x44,0x5f, 0xf,0x44,0x60, 0xf,0x44,0x61, + 0xf,0x44,0x62, 0x6,0x56,0x47, 0x4,0x3f,0x70, 0x4,0x45,0x78, + 0x5,0x48,0x50, 0x4,0x45,0x76, 0x5,0x48,0x52, 0x6,0x60,0x3f, + 0x6,0x60,0x3e, 0x5,0x48,0x56, 0x4,0x45,0x7a, 0x5,0x48,0x55, + 0x4,0x45,0x77, 0x6,0x60,0x39, 0x6,0x60,0x43, 0x6,0x60,0x42, + 0x6,0x60,0x36, 0x4,0x45,0x7d, 0x5,0x48,0x4f, 0x5,0x41,0x63, + 0x6,0x60,0x41, 0x5,0x48,0x51, 0x6,0x60,0x3c, 0x6,0x60,0x34, + 0x5,0x48,0x53, 0x5,0x48,0x57, 0x6,0x60,0x40, 0x6,0x60,0x3b, + 0x4,0x46,0x22, 0x6,0x60,0x38, 0xf,0x4b,0x2e, 0xf,0x4b,0x2f, + 0xf,0x4b,0x30, 0xf,0x4b,0x31, 0xf,0x4b,0x32, 0xf,0x4b,0x33, + 0xf,0x4b,0x34, 0xf,0x4b,0x35, 0xf,0x4b,0x36, 0xf,0x4b,0x37, + 0x6,0x60,0x35, 0x6,0x60,0x37, 0x6,0x60,0x3d, 0x4,0x4c,0x38, + 0x4,0x4c,0x43, 0x7,0x26,0x60, 0x4,0x4c,0x42, 0x4,0x4c,0x3b, + 0x5,0x4f,0x5b, 0x5,0x4f,0x59, 0x4,0x52,0x48, 0x5,0x4f,0x58, + 0x5,0x4f,0x5d, 0x5,0x4f,0x55, 0x4,0x4c,0x46, 0x5,0x4f,0x5a, + 0x7,0x26,0x6c, 0x7,0x26,0x5e, 0x7,0x26,0x64, 0x5,0x4f,0x5c, + 0x5,0x4f,0x52, 0x7,0x26,0x61, 0x7,0x26,0x66, 0x5,0x4f,0x57, + 0x4,0x4c,0x41, 0x4,0x4c,0x39, 0x7,0x26,0x5d, 0x7,0x26,0x65, + 0x7,0x26,0x5c, 0x7,0x26,0x67, 0x6,0x60,0x3a, 0x7,0x26,0x6d, + 0x7,0x26,0x6b, 0x5,0x4f,0x51, 0x5,0x4f,0x56, 0x5,0x4f,0x5e, + 0xf,0x51,0x30, 0xf,0x51,0x31, 0xf,0x51,0x32, 0xf,0x51,0x33, + 0xf,0x51,0x34, 0xf,0x51,0x35, 0xf,0x51,0x38, 0xf,0x51,0x39, + 0xf,0x51,0x3a, 0xf,0x51,0x3d, 0xf,0x51,0x3e, 0xf,0x51,0x3f, + 0x7,0x26,0x62, 0x7,0x26,0x68, 0x7,0x26,0x5f, 0x7,0x26,0x63, + 0x7,0x31,0x46, 0x4,0x52,0x46, 0x7,0x31,0x43, 0x7,0x31,0x44, + 0x4,0x52,0x4a, 0x7,0x31,0x40, 0x7,0x31,0x3d, 0x5,0x56,0x74, + 0x5,0x56,0x76, 0x7,0x31,0x31, 0x7,0x31,0x42, 0x7,0x31,0x32, + 0x7,0x3a,0x36, 0x7,0x31,0x33, 0x7,0x31,0x36, 0x5,0x56,0x75, + 0x5,0x56,0x77, 0x5,0x56,0x73, 0x5,0x5d,0x45, 0x4,0x52,0x45, + 0x5,0x56,0x71, 0x5,0x56,0x72, 0x4,0x52,0x4b, 0x7,0x31,0x3a, + 0x7,0x31,0x37, 0x7,0x31,0x38, 0x7,0x31,0x41, 0x4,0x52,0x4d, + 0x7,0x31,0x35, 0x5,0x56,0x79, 0x7,0x31,0x34, 0x7,0x31,0x45, + 0x7,0x31,0x3b, 0x5,0x56,0x78, 0x7,0x31,0x3f, 0x7,0x31,0x3e, + 0x7,0x31,0x39, 0x7,0x31,0x3c, 0xf,0x56,0x76, 0xf,0x56,0x77, + 0xf,0x56,0x78, 0xf,0x56,0x79, 0xf,0x56,0x7a, 0xf,0x56,0x7b, + 0xf,0x56,0x7c, 0xf,0x56,0x7d, 0xf,0x56,0x7e, 0x7,0x3a,0x44, + 0x7,0x3a,0x43, 0x5,0x5d,0x43, 0x5,0x5d,0x40, 0x4,0x57,0x71, + 0x7,0x3a,0x37, 0x5,0x5d,0x41, 0x7,0x3a,0x42, 0x4,0x57,0x6f, + 0x7,0x3a,0x3a, 0x5,0x5d,0x44, 0x5,0x5d,0x3e, 0x7,0x3a,0x3e, + 0x7,0x3a,0x3b, 0x7,0x3a,0x3c, 0x7,0x3a,0x40, 0x5,0x5d,0x42, + 0x7,0x3a,0x41, 0x7,0x3a,0x3d, 0x5,0x5d,0x47, 0xf,0x5b,0x73, + 0xf,0x5b,0x74, 0xf,0x5b,0x75, 0xf,0x5b,0x77, 0xf,0x5b,0x78, + 0xf,0x5b,0x79, 0xf,0x5b,0x7a, 0xf,0x5b,0x7b, 0xf,0x5b,0x7c, + 0xf,0x5b,0x7d, 0xf,0x5b,0x7e, 0xf,0x5c,0x21, 0xf,0x5c,0x22, + 0x7,0x3a,0x3f, 0x7,0x3a,0x38, 0x4,0x5c,0x64, 0x4,0x5c,0x5c, + 0x7,0x41,0x4e, 0x4,0x5c,0x63, 0x4,0x5c,0x5d, 0x7,0x41,0x4d, + 0x7,0x41,0x54, 0x4,0x5c,0x61, 0x4,0x57,0x70, 0x7,0x41,0x49, + 0x5,0x63,0x55, 0x5,0x63,0x58, 0x5,0x63,0x57, 0x7,0x41,0x4b, + 0x7,0x41,0x51, 0x5,0x63,0x56, 0x7,0x41,0x4a, 0x7,0x41,0x4f, + 0x7,0x41,0x52, 0x7,0x41,0x4c, 0x7,0x41,0x57, 0x7,0x41,0x55, + 0x7,0x41,0x50, 0x7,0x41,0x5b, 0x5,0x63,0x5a, 0x7,0x41,0x56, + 0xf,0x60,0x2a, 0xf,0x60,0x2b, 0xf,0x60,0x2c, 0xf,0x60,0x2d, + 0xf,0x60,0x2e, 0xf,0x60,0x2f, 0xf,0x60,0x30, 0xf,0x60,0x31, + 0xf,0x60,0x32, 0x5,0x63,0x59, 0x7,0x41,0x5c, 0x7,0x41,0x5a, + 0x7,0x41,0x58, 0x7,0x41,0x53, 0x4,0x60,0x64, 0x4,0x60,0x65, + 0x7,0x48,0x5f, 0x4,0x60,0x69, 0x7,0x48,0x67, 0x5,0x68,0x76, + 0x7,0x48,0x64, 0x4,0x60,0x67, 0x7,0x48,0x66, 0x4,0x60,0x6b, + 0x5,0x68,0x79, 0x4,0x60,0x60, 0x5,0x68,0x7a, 0x7,0x48,0x61, + 0x7,0x47,0x4b, 0x4,0x60,0x61, 0x7,0x48,0x5d, 0x5,0x68,0x77, + 0x7,0x48,0x63, 0x7,0x48,0x5b, 0x7,0x48,0x62, 0x5,0x68,0x78, + 0x7,0x48,0x59, 0x7,0x48,0x5a, 0x7,0x48,0x60, 0x7,0x48,0x5e, + 0xf,0x63,0x40, 0xf,0x63,0x41, 0xf,0x63,0x43, 0xf,0x63,0x44, + 0xf,0x63,0x45, 0x7,0x4a,0x73, 0x7,0x48,0x5c, 0x7,0x48,0x65, + 0x4,0x60,0x6a, 0x7,0x4e,0x7d, 0x7,0x4e,0x7c, 0x5,0x6d,0x23, + 0x5,0x6d,0x21, 0x4,0x64,0x25, 0x7,0x4e,0x7e, 0x7,0x4f,0x23, + 0x7,0x4e,0x7b, 0x7,0x54,0x42, 0x7,0x48,0x58, 0x5,0x6d,0x24, + 0x7,0x4f,0x24, 0x7,0x4f,0x26, 0x7,0x4e,0x7a, 0x4,0x66,0x79, + 0x7,0x4f,0x22, 0x7,0x4e,0x79, 0x7,0x4f,0x25, 0xf,0x65,0x6c, + 0xf,0x65,0x6d, 0xf,0x65,0x6e, 0xf,0x65,0x70, 0xf,0x65,0x71, + 0x7,0x4f,0x21, 0x5,0x70,0x72, 0x4,0x66,0x75, 0x7,0x54,0x43, + 0x5,0x70,0x73, 0x4,0x66,0x78, 0x4,0x66,0x76, 0x4,0x66,0x77, + 0x7,0x58,0x5e, 0x7,0x4f,0x27, 0x7,0x54,0x3f, 0x7,0x54,0x3e, + 0x7,0x54,0x41, 0xf,0x68,0x2c, 0xf,0x68,0x2d, 0xf,0x68,0x2e, + 0xf,0x68,0x2f, 0x4,0x66,0x74, 0x7,0x54,0x40, 0x5,0x70,0x71, + 0x7,0x54,0x44, 0x5,0x73,0x7b, 0x7,0x58,0x59, 0x5,0x73,0x7c, + 0x5,0x73,0x79, 0x4,0x69,0x29, 0x5,0x76,0x3a, 0x7,0x58,0x5d, + 0x5,0x73,0x7a, 0x7,0x58,0x5b, 0xf,0x69,0x63, 0xf,0x69,0x64, + 0xf,0x69,0x65, 0xf,0x69,0x66, 0x7,0x58,0x5a, 0x7,0x58,0x5c, + 0x4,0x69,0x4b, 0x4,0x6a,0x67, 0x7,0x58,0x5f, 0x7,0x5c,0x3a, + 0x7,0x5c,0x3b, 0x4,0x6a,0x68, 0x4,0x6a,0x69, 0x4,0x6b,0x7a, + 0x5,0x77,0x78, 0x7,0x5f,0x37, 0x7,0x5f,0x35, 0xf,0x6b,0x5d, + 0x7,0x5f,0x36, 0x7,0x5f,0x38, 0x5,0x79,0x3a, 0x7,0x5f,0x34, + 0x5,0x79,0x39, 0x7,0x61,0x34, 0x7,0x62,0x4f, 0x7,0x62,0x4e, + 0x7,0x63,0x63, 0xf,0x6c,0x69, 0x7,0x63,0x65, 0x7,0x63,0x64, + 0x7,0x64,0x55, 0x5,0x7b,0x65, 0xf,0x6d,0x30, 0x7,0x65,0x75, + 0x6,0x25,0x42, 0x4,0x2a,0x78, 0x5,0x2b,0x28, 0x4,0x2f,0x28, + 0x6,0x3a,0x66, 0x5,0x2f,0x5b, 0x5,0x34,0x61, 0x6,0x43,0x2d, + 0x5,0x3b,0x34, 0x6,0x43,0x2f, 0x6,0x43,0x2e, 0x6,0x4c,0x74, + 0x4,0x3a,0x29, 0x6,0x4c,0x73, 0x5,0x3b,0x33, 0xf,0x3e,0x2f, + 0x6,0x56,0x50, 0x6,0x56,0x4f, 0x4,0x3f,0x74, 0x4,0x46,0x24, + 0x6,0x60,0x45, 0x5,0x48,0x58, 0x6,0x60,0x44, 0x7,0x26,0x6e, + 0xf,0x4b,0x39, 0xf,0x4b,0x3a, 0xf,0x4b,0x3b, 0x7,0x26,0x70, + 0x4,0x4c,0x47, 0xf,0x51,0x40, 0xf,0x51,0x41, 0x7,0x26,0x6f, + 0x5,0x56,0x7b, 0x5,0x56,0x7a, 0xf,0x57,0x22, 0xf,0x57,0x21, + 0x5,0x5d,0x49, 0x7,0x3a,0x45, 0x5,0x5d,0x48, 0xf,0x5a,0x58, + 0xf,0x5c,0x23, 0xf,0x5c,0x24, 0x7,0x41,0x5d, 0x7,0x41,0x5e, + 0xf,0x60,0x33, 0x7,0x48,0x68, 0x4,0x60,0x6c, 0xf,0x63,0x46, + 0x5,0x70,0x74, 0x4,0x64,0x27, 0x4,0x66,0x7a, 0x7,0x54,0x45, + 0x4,0x6a,0x6a, 0x7,0x5c,0x3c, 0xf,0x6a,0x6b, 0x7,0x5f,0x3a, + 0x7,0x5f,0x39, 0x5,0x7a,0x34, 0x7,0x66,0x2a, 0x6,0x22,0x29, + 0x6,0x22,0x28, 0x4,0x24,0x6a, 0x6,0x25,0x44, 0x6,0x25,0x45, + 0x6,0x28,0x73, 0xf,0x21,0x7c, 0x6,0x25,0x43, 0xf,0x25,0x28, + 0xf,0x25,0x2a, 0x6,0x2d,0x53, 0x6,0x33,0x6a, 0x4,0x27,0x5d, + 0x6,0x33,0x69, 0x6,0x2d,0x54, 0x4,0x27,0x5e, 0x6,0x28,0x74, + 0x4,0x24,0x6b, 0x6,0x33,0x6b, 0x4,0x2a,0x7a, 0x4,0x2a,0x7c, + 0xf,0x25,0x56, 0x5,0x2b,0x29, 0xf,0x28,0x49, 0x5,0x27,0x52, + 0x6,0x3a,0x67, 0x6,0x3a,0x68, 0x6,0x3a,0x69, 0x5,0x2f,0x5f, + 0x6,0x3a,0x6c, 0x6,0x3a,0x6a, 0x4,0x2f,0x2c, 0x4,0x2f,0x2b, + 0x6,0x33,0x6e, 0x6,0x33,0x6c, 0x6,0x33,0x6f, 0x6,0x43,0x35, + 0xf,0x29,0x39, 0x5,0x2f,0x5d, 0x6,0x43,0x30, 0x6,0x43,0x31, + 0x6,0x43,0x32, 0x6,0x43,0x34, 0x6,0x43,0x36, 0xf,0x31,0x79, + 0x6,0x33,0x6d, 0x6,0x36,0x7a, 0x5,0x2b,0x2a, 0x4,0x2a,0x7d, + 0x6,0x43,0x33, 0x6,0x4c,0x77, 0x6,0x43,0x37, 0x6,0x3a,0x6d, + 0x6,0x4c,0x76, 0x6,0x43,0x38, 0x5,0x2f,0x5e, 0x5,0x34,0x62, + 0xf,0x37,0x5c, 0x6,0x4c,0x75, 0x5,0x3b,0x36, 0x5,0x3b,0x35, + 0x4,0x3a,0x2c, 0x6,0x4c,0x78, 0xf,0x3e,0x30, 0x6,0x56,0x52, + 0x5,0x41,0x67, 0x6,0x56,0x54, 0x6,0x4c,0x7a, 0x5,0x41,0x64, + 0x5,0x41,0x66, 0x6,0x56,0x53, 0x6,0x56,0x55, 0x6,0x4c,0x79, + 0x6,0x56,0x56, 0xf,0x3e,0x31, 0x6,0x56,0x51, 0xf,0x44,0x63, + 0x6,0x60,0x46, 0x6,0x60,0x48, 0x6,0x60,0x49, 0x6,0x60,0x4a, + 0x6,0x60,0x4b, 0x6,0x60,0x4c, 0x6,0x60,0x4d, 0x6,0x60,0x50, + 0x5,0x48,0x5b, 0x7,0x26,0x75, 0x6,0x60,0x4e, 0x5,0x48,0x5a, + 0x6,0x56,0x57, 0x5,0x48,0x59, 0x6,0x60,0x4f, 0x6,0x60,0x47, + 0xf,0x4b,0x3c, 0x7,0x26,0x71, 0x7,0x26,0x72, 0x7,0x26,0x73, + 0x7,0x26,0x74, 0x5,0x4f,0x62, 0x5,0x4f,0x5f, 0x6,0x60,0x52, + 0x7,0x26,0x76, 0x5,0x4f,0x60, 0x5,0x4f,0x61, 0x6,0x60,0x51, + 0xf,0x51,0x42, 0xf,0x51,0x43, 0x7,0x25,0x73, 0x7,0x31,0x47, + 0x7,0x31,0x48, 0x7,0x31,0x4c, 0x7,0x31,0x49, 0x5,0x56,0x7c, + 0x7,0x31,0x4b, 0x4,0x52,0x51, 0x7,0x3a,0x4e, 0x7,0x31,0x4a, + 0x7,0x31,0x4d, 0x5,0x4f,0x63, 0x5,0x56,0x7d, 0x4,0x52,0x50, + 0x7,0x26,0x77, 0x7,0x26,0x78, 0x7,0x3a,0x47, 0x7,0x3a,0x48, + 0x7,0x3a,0x4b, 0x5,0x5d,0x4a, 0x7,0x31,0x4e, 0x4,0x57,0x74, + 0x5,0x63,0x5b, 0x7,0x3a,0x4c, 0x7,0x3a,0x4d, 0xf,0x5c,0x25, + 0xf,0x57,0x23, 0x7,0x41,0x5f, 0x7,0x41,0x60, 0x7,0x41,0x62, + 0x7,0x41,0x64, 0x4,0x5c,0x67, 0x4,0x5c,0x66, 0x5,0x63,0x5c, + 0x7,0x41,0x63, 0x7,0x48,0x69, 0x7,0x3a,0x4a, 0x5,0x63,0x5e, + 0x5,0x68,0x7b, 0x7,0x48,0x6c, 0x4,0x60,0x6e, 0x7,0x48,0x6a, + 0x7,0x48,0x6b, 0x7,0x4f,0x28, 0x7,0x4f,0x29, 0x7,0x4f,0x2a, + 0x7,0x4f,0x2b, 0x5,0x6d,0x25, 0x5,0x6d,0x27, 0x7,0x4f,0x2c, + 0x5,0x6d,0x26, 0x5,0x6d,0x28, 0x7,0x54,0x46, 0x7,0x4f,0x2d, + 0x5,0x77,0x7a, 0x4,0x6b,0x7c, 0x7,0x5f,0x3b, 0x5,0x77,0x7b, + 0x5,0x77,0x79, 0x7,0x61,0x35, 0x7,0x62,0x50, 0x7,0x63,0x66, + 0x7,0x64,0x56, 0x7,0x65,0x3c, 0x4,0x24,0x6c, 0x4,0x23,0x2c, + 0xf,0x21,0x60, 0x6,0x2d,0x56, 0x5,0x27,0x53, 0x6,0x2d,0x55, + 0xf,0x2d,0x24, 0x6,0x33,0x71, 0x6,0x33,0x70, 0x4,0x2a,0x7e, + 0xf,0x28,0x4b, 0x6,0x3a,0x6e, 0x6,0x3a,0x6f, 0x6,0x43,0x3b, + 0x6,0x3a,0x73, 0x6,0x3a,0x72, 0x6,0x3a,0x71, 0x6,0x3a,0x70, + 0x6,0x43,0x3a, 0xf,0x31,0x7a, 0xf,0x31,0x7b, 0x6,0x43,0x3d, + 0x5,0x34,0x64, 0x4,0x3a,0x2e, 0x6,0x43,0x3e, 0x4,0x34,0x39, + 0x5,0x34,0x65, 0xf,0x37,0x5d, 0x5,0x34,0x63, 0x6,0x43,0x39, + 0xf,0x37,0x5e, 0xf,0x37,0x5f, 0x6,0x43,0x3f, 0x5,0x3b,0x39, + 0x5,0x3b,0x37, 0x6,0x4c,0x7d, 0x4,0x3a,0x2f, 0x6,0x4d,0x21, + 0x5,0x3b,0x38, 0x6,0x4c,0x7e, 0x6,0x4c,0x7c, 0x6,0x4d,0x22, + 0x6,0x47,0x21, 0x6,0x56,0x5a, 0x5,0x41,0x68, 0x6,0x56,0x5b, + 0x6,0x56,0x58, 0x5,0x41,0x69, 0x6,0x56,0x59, 0x6,0x56,0x5c, + 0x5,0x41,0x6a, 0xf,0x3e,0x33, 0xf,0x3e,0x34, 0x5,0x48,0x5c, + 0x6,0x60,0x53, 0x6,0x60,0x55, 0x5,0x48,0x5d, 0x6,0x60,0x54, + 0x5,0x4f,0x64, 0x4,0x4c,0x4a, 0x7,0x26,0x7b, 0x7,0x26,0x7c, + 0x4,0x4c,0x4b, 0x7,0x31,0x4f, 0x7,0x26,0x7a, 0x4,0x4c,0x48, + 0x5,0x57,0x21, 0x5,0x56,0x7e, 0x4,0x52,0x52, 0xf,0x57,0x25, + 0x7,0x31,0x50, 0x4,0x57,0x78, 0x4,0x57,0x76, 0x5,0x5d,0x4b, + 0x7,0x3a,0x50, 0x7,0x3a,0x4f, 0x7,0x3a,0x52, 0xf,0x5c,0x26, + 0x4,0x52,0x54, 0x7,0x3a,0x51, 0x5,0x63,0x5d, 0x4,0x5c,0x69, + 0x5,0x63,0x5f, 0x7,0x41,0x69, 0x7,0x41,0x6a, 0x4,0x5c,0x6d, + 0x7,0x41,0x67, 0x7,0x41,0x68, 0x7,0x41,0x66, 0xf,0x57,0x24, + 0xf,0x60,0x34, 0xf,0x60,0x35, 0x4,0x5c,0x6c, 0x5,0x68,0x7c, + 0x7,0x48,0x70, 0x5,0x76,0x3b, 0x7,0x48,0x6f, 0x7,0x4f,0x2e, + 0x7,0x48,0x6e, 0x5,0x6d,0x29, 0x7,0x4f,0x2f, 0x7,0x4f,0x30, + 0x7,0x4f,0x31, 0x7,0x4f,0x32, 0x7,0x41,0x65, 0x5,0x70,0x75, + 0x7,0x54,0x47, 0x7,0x54,0x48, 0x5,0x73,0x7d, 0x7,0x58,0x60, + 0x7,0x5c,0x3e, 0x7,0x5c,0x3d, 0x7,0x61,0x36, 0x7,0x63,0x67, + 0x7,0x65,0x5e, 0x6,0x2d,0x57, 0x6,0x33,0x75, 0x6,0x33,0x72, + 0x6,0x33,0x76, 0x5,0x2b,0x2b, 0x4,0x2b,0x22, 0x4,0x2b,0x21, + 0x4,0x2b,0x24, 0x6,0x33,0x74, 0x4,0x2b,0x23, 0xf,0x2d,0x25, + 0xf,0x2d,0x26, 0x6,0x33,0x73, 0x4,0x2f,0x33, 0x6,0x3a,0x76, + 0x5,0x2f,0x61, 0x5,0x2f,0x63, 0x5,0x2f,0x60, 0x4,0x2f,0x31, + 0x4,0x2f,0x36, 0x4,0x2f,0x35, 0x6,0x3a,0x75, 0x5,0x2f,0x62, + 0x4,0x2f,0x34, 0x4,0x2f,0x32, 0x6,0x3a,0x77, 0xf,0x2f,0x63, + 0xf,0x2f,0x64, 0x4,0x2f,0x37, 0xf,0x31,0x7c, 0x5,0x34,0x66, + 0x6,0x43,0x41, 0x6,0x43,0x40, 0x6,0x43,0x42, 0x6,0x43,0x43, + 0x6,0x43,0x44, 0x6,0x43,0x46, 0x6,0x43,0x47, 0x4,0x34,0x3f, + 0x6,0x43,0x45, 0x5,0x3b,0x3b, 0x4,0x3a,0x32, 0x6,0x4d,0x26, + 0x6,0x4d,0x27, 0x6,0x4d,0x2d, 0x5,0x3b,0x3d, 0x4,0x3a,0x36, + 0x6,0x4d,0x2e, 0x6,0x4d,0x28, 0x6,0x4d,0x25, 0x6,0x4d,0x2f, + 0x6,0x4d,0x30, 0x5,0x3b,0x3c, 0x6,0x4d,0x2a, 0x6,0x4d,0x2c, + 0x6,0x4d,0x2b, 0xf,0x3e,0x35, 0xf,0x3e,0x36, 0x6,0x4d,0x29, + 0x5,0x41,0x6e, 0x5,0x41,0x6b, 0x4,0x3f,0x79, 0x6,0x56,0x5d, + 0x6,0x56,0x5e, 0x6,0x56,0x5f, 0x5,0x41,0x6d, 0x5,0x41,0x6c, + 0xf,0x44,0x64, 0x6,0x4d,0x24, 0x5,0x48,0x65, 0x5,0x48,0x5e, + 0x6,0x60,0x57, 0x5,0x48,0x5f, 0x5,0x48,0x63, 0x5,0x48,0x60, + 0x5,0x48,0x64, 0x5,0x48,0x61, 0x5,0x48,0x62, 0x6,0x60,0x56, + 0x5,0x48,0x66, 0xf,0x4b,0x3d, 0xf,0x4b,0x3e, 0xf,0x4b,0x3f, + 0xf,0x4b,0x40, 0x5,0x4f,0x6a, 0x5,0x4f,0x6b, 0x7,0x26,0x7e, + 0x5,0x4f,0x68, 0x4,0x4c,0x4c, 0x5,0x4f,0x6c, 0x5,0x4f,0x65, + 0x7,0x26,0x7d, 0x5,0x4f,0x67, 0xf,0x51,0x46, 0x6,0x60,0x59, + 0x5,0x4f,0x66, 0x7,0x27,0x24, 0x7,0x27,0x25, 0x7,0x27,0x21, + 0x4,0x4c,0x4e, 0x7,0x27,0x22, 0x4,0x4c,0x4d, 0x7,0x27,0x23, + 0xf,0x51,0x44, 0xf,0x51,0x45, 0x7,0x31,0x51, 0x7,0x31,0x53, + 0x5,0x57,0x25, 0x7,0x31,0x56, 0x7,0x31,0x52, 0x7,0x31,0x54, + 0x4,0x52,0x57, 0x5,0x57,0x23, 0x5,0x57,0x26, 0x5,0x57,0x24, + 0x5,0x4f,0x69, 0x5,0x57,0x22, 0x7,0x31,0x55, 0x5,0x57,0x27, + 0xf,0x57,0x26, 0x4,0x57,0x79, 0x7,0x3a,0x54, 0x5,0x5d,0x4c, + 0x7,0x3a,0x55, 0x7,0x48,0x71, 0x5,0x5d,0x4d, 0x7,0x3a,0x53, + 0xf,0x5c,0x27, 0xf,0x5c,0x28, 0x5,0x63,0x60, 0x4,0x5c,0x6e, + 0x7,0x41,0x71, 0x5,0x5d,0x4e, 0x4,0x5c,0x6f, 0x7,0x41,0x6d, + 0x7,0x41,0x6f, 0x7,0x41,0x6c, 0x7,0x41,0x70, 0x7,0x41,0x6e, + 0xf,0x60,0x36, 0xf,0x60,0x37, 0x7,0x41,0x6b, 0x4,0x60,0x70, + 0x5,0x68,0x7e, 0x5,0x68,0x7d, 0x7,0x48,0x72, 0x7,0x4f,0x35, + 0x7,0x4f,0x36, 0xf,0x65,0x72, 0x7,0x4f,0x33, 0x4,0x66,0x7c, + 0x7,0x54,0x49, 0x7,0x54,0x4b, 0x7,0x4f,0x34, 0x7,0x54,0x4a, + 0x7,0x58,0x62, 0x7,0x58,0x63, 0x7,0x58,0x61, 0x6,0x25,0x46, + 0x6,0x2d,0x58, 0x6,0x28,0x75, 0x4,0x27,0x5f, 0x4,0x27,0x60, + 0x6,0x3a,0x78, 0x4,0x34,0x40, 0x5,0x2b,0x2c, 0xf,0x37,0x60, + 0xf,0x37,0x61, 0x6,0x43,0x48, 0x6,0x4d,0x31, 0x7,0x27,0x26, + 0x7,0x31,0x58, 0x7,0x31,0x57, 0xf,0x6b,0x5e, 0x6,0x2d,0x59, + 0x6,0x2d,0x5a, 0x5,0x21,0x79, 0xf,0x28,0x4c, 0x4,0x2f,0x39, + 0x5,0x34,0x67, 0x5,0x3b,0x3e, 0x5,0x41,0x6f, 0x6,0x60,0x5a, + 0x7,0x27,0x27, 0x7,0x27,0x29, 0x5,0x48,0x67, 0x7,0x31,0x5a, + 0x7,0x31,0x59, 0x7,0x3a,0x56, 0x5,0x23,0x21, 0x6,0x2d,0x5b, + 0xf,0x28,0x4d, 0x6,0x33,0x77, 0xf,0x2d,0x27, 0x6,0x33,0x78, + 0xf,0x31,0x7e, 0x5,0x34,0x68, 0xf,0x37,0x62, 0x6,0x43,0x49, + 0x4,0x3a,0x37, 0x5,0x3b,0x41, 0x5,0x3b,0x40, 0x4,0x3f,0x7b, + 0x6,0x56,0x60, 0x6,0x60,0x5c, 0x5,0x48,0x6c, 0x5,0x48,0x68, + 0x5,0x48,0x6d, 0x5,0x48,0x6a, 0x5,0x48,0x69, 0x5,0x48,0x6b, + 0x4,0x46,0x31, 0xf,0x44,0x65, 0x6,0x60,0x5b, 0x5,0x4f,0x6f, + 0x5,0x4f,0x70, 0x5,0x4f,0x71, 0x5,0x4f,0x6d, 0x5,0x4f,0x6e, + 0x7,0x27,0x2a, 0x5,0x57,0x29, 0x5,0x57,0x28, 0x4,0x52,0x58, + 0x4,0x52,0x59, 0x7,0x31,0x5c, 0x7,0x31,0x5d, 0x7,0x31,0x5b, + 0xf,0x51,0x47, 0x5,0x5d,0x4f, 0x4,0x57,0x7c, 0x7,0x3a,0x5a, + 0x7,0x3a,0x57, 0x7,0x3a,0x58, 0xf,0x57,0x29, 0x5,0x63,0x61, + 0x4,0x57,0x7e, 0x7,0x41,0x72, 0x7,0x3a,0x59, 0x7,0x48,0x75, + 0x5,0x63,0x62, 0x7,0x41,0x74, 0x7,0x41,0x73, 0xf,0x5c,0x29, + 0xf,0x5c,0x2a, 0x7,0x48,0x74, 0x5,0x69,0x21, 0x7,0x48,0x73, + 0x4,0x66,0x7e, 0x7,0x54,0x4c, 0x4,0x6a,0x6c, 0x5,0x77,0x7c, + 0x5,0x79,0x3b, 0x5,0x27,0x55, 0x5,0x27,0x54, 0x6,0x2d,0x5e, + 0xf,0x28,0x4e, 0xf,0x28,0x4f, 0x6,0x2d,0x5d, 0x5,0x2b,0x2f, + 0x5,0x2b,0x2d, 0x5,0x2b,0x2e, 0x4,0x2f,0x3c, 0x6,0x3a,0x7e, + 0x4,0x2f,0x3b, 0x6,0x3a,0x7a, 0x5,0x2f,0x64, 0x6,0x3b,0x22, + 0xf,0x32,0x21, 0xf,0x32,0x24, 0xf,0x32,0x26, 0xf,0x32,0x27, + 0x6,0x3a,0x7b, 0xf,0x32,0x22, 0x6,0x3a,0x7d, 0x6,0x3a,0x7c, + 0x6,0x3b,0x23, 0x6,0x3a,0x79, 0xf,0x32,0x25, 0x5,0x2f,0x65, + 0x6,0x43,0x4b, 0x4,0x34,0x43, 0x4,0x34,0x42, 0x4,0x34,0x44, + 0x6,0x43,0x4d, 0x5,0x34,0x69, 0x6,0x43,0x4f, 0x6,0x43,0x4e, + 0x6,0x43,0x4c, 0x6,0x43,0x4a, 0xf,0x37,0x63, 0xf,0x37,0x64, + 0xf,0x37,0x65, 0xf,0x37,0x66, 0x5,0x3b,0x42, 0x6,0x4d,0x33, + 0x6,0x4d,0x34, 0x5,0x3b,0x43, 0x6,0x4d,0x35, 0xf,0x3e,0x37, + 0xf,0x3e,0x38, 0xf,0x3e,0x39, 0xf,0x3e,0x3a, 0xf,0x3e,0x3c, + 0xf,0x3e,0x3d, 0xf,0x3e,0x3e, 0xf,0x3e,0x3f, 0xf,0x3e,0x40, + 0x6,0x4d,0x32, 0xf,0x3e,0x3b, 0x6,0x56,0x62, 0x6,0x56,0x66, + 0x5,0x41,0x71, 0x5,0x41,0x72, 0x6,0x56,0x61, 0x6,0x56,0x6b, + 0x6,0x56,0x69, 0x6,0x56,0x67, 0x5,0x41,0x73, 0x6,0x56,0x68, + 0x6,0x56,0x64, 0x6,0x56,0x6a, 0x6,0x56,0x63, 0xf,0x44,0x66, + 0xf,0x44,0x67, 0x6,0x56,0x65, 0x5,0x48,0x70, 0x5,0x48,0x71, + 0x5,0x48,0x6e, 0x4,0x4c,0x50, 0x6,0x60,0x5e, 0x5,0x48,0x72, + 0x5,0x48,0x6f, 0x5,0x48,0x73, 0xf,0x4b,0x41, 0xf,0x4b,0x42, + 0xf,0x4b,0x43, 0xf,0x4b,0x44, 0xf,0x4b,0x45, 0xf,0x4b,0x46, + 0xf,0x4b,0x47, 0xf,0x4b,0x48, 0xf,0x4b,0x4a, 0xf,0x4b,0x4b, + 0xf,0x4b,0x4c, 0x6,0x60,0x5f, 0x5,0x4f,0x72, 0x7,0x27,0x2c, + 0x5,0x4f,0x75, 0x7,0x27,0x2f, 0x5,0x4f,0x74, 0x5,0x4f,0x73, + 0x4,0x4c,0x51, 0x5,0x4f,0x77, 0x7,0x27,0x2b, 0x7,0x27,0x30, + 0x5,0x4f,0x76, 0xf,0x51,0x48, 0xf,0x51,0x49, 0xf,0x51,0x4a, + 0xf,0x51,0x4b, 0xf,0x51,0x4c, 0xf,0x51,0x4d, 0xf,0x51,0x4e, + 0xf,0x51,0x4f, 0x7,0x27,0x2d, 0x5,0x57,0x2c, 0x5,0x57,0x2f, + 0x5,0x57,0x2b, 0x5,0x57,0x2d, 0x5,0x57,0x2e, 0x7,0x31,0x61, + 0x7,0x31,0x5f, 0x7,0x31,0x5e, 0xf,0x57,0x2a, 0xf,0x57,0x2b, + 0xf,0x57,0x2c, 0xf,0x57,0x2d, 0xf,0x57,0x2e, 0xf,0x57,0x2f, + 0x7,0x31,0x60, 0x5,0x57,0x2a, 0x5,0x5d,0x50, 0x5,0x5d,0x51, + 0x5,0x5d,0x52, 0x7,0x3a,0x5b, 0x4,0x58,0x25, 0x4,0x58,0x26, + 0x5,0x5d,0x54, 0x5,0x5d,0x53, 0xf,0x5c,0x2c, 0x7,0x3a,0x5d, + 0x7,0x3a,0x5c, 0x3,0x58,0x63, 0x7,0x41,0x77, 0x5,0x63,0x66, + 0x5,0x63,0x63, 0x4,0x5c,0x72, 0x7,0x41,0x79, 0x5,0x5d,0x55, + 0x7,0x41,0x78, 0x5,0x63,0x64, 0x5,0x63,0x65, 0x7,0x41,0x75, + 0xf,0x60,0x38, 0xf,0x60,0x39, 0xf,0x60,0x3a, 0x7,0x41,0x76, + 0xf,0x5c,0x2b, 0xf,0x63,0x47, 0x7,0x48,0x76, 0x5,0x69,0x22, + 0x5,0x69,0x23, 0x7,0x48,0x78, 0x7,0x48,0x77, 0xf,0x63,0x48, + 0xf,0x63,0x49, 0x7,0x4f,0x39, 0xf,0x65,0x73, 0xf,0x65,0x74, + 0xf,0x65,0x75, 0x7,0x4f,0x38, 0x7,0x4f,0x37, 0x5,0x70,0x76, + 0xf,0x68,0x30, 0xf,0x68,0x31, 0x7,0x54,0x4d, 0x7,0x54,0x4e, + 0x5,0x73,0x7e, 0x7,0x58,0x64, 0x4,0x6a,0x6d, 0xf,0x6a,0x6c, + 0xf,0x6b,0x5f, 0xf,0x6c,0x36, 0xf,0x6c,0x50, 0x5,0x21,0x7a, + 0x6,0x2d,0x5f, 0x5,0x2b,0x30, 0x6,0x43,0x50, 0x6,0x4d,0x36, + 0x6,0x48,0x6a, 0x6,0x56,0x6e, 0x6,0x60,0x62, 0x6,0x60,0x61, + 0x7,0x27,0x31, 0xf,0x51,0x50, 0x7,0x31,0x62, 0x7,0x4f,0x3a, + 0x5,0x23,0x25, 0x5,0x23,0x23, 0x6,0x2d,0x60, 0x6,0x2d,0x61, + 0x6,0x25,0x48, 0xf,0x22,0x6c, 0xf,0x22,0x6d, 0x5,0x23,0x24, + 0x5,0x23,0x22, 0x5,0x24,0x73, 0x5,0x24,0x72, 0x6,0x28,0x79, + 0x6,0x28,0x78, 0x6,0x28,0x77, 0x6,0x28,0x76, 0x6,0x33,0x7b, + 0x6,0x33,0x7a, 0x6,0x33,0x79, 0x5,0x27,0x5a, 0x5,0x27,0x5e, + 0x6,0x2d,0x64, 0x4,0x2f,0x43, 0x6,0x2d,0x6d, 0x6,0x2d,0x6e, + 0x6,0x2d,0x62, 0x5,0x27,0x5d, 0x6,0x2d,0x66, 0x5,0x27,0x59, + 0x5,0x27,0x57, 0x6,0x2d,0x6b, 0x5,0x27,0x5b, 0x4,0x27,0x6b, + 0x6,0x2d,0x68, 0x6,0x2d,0x6f, 0xf,0x28,0x50, 0xf,0x28,0x51, + 0xf,0x28,0x53, 0xf,0x28,0x54, 0x6,0x2d,0x6c, 0x4,0x26,0x64, + 0x6,0x2d,0x65, 0x6,0x2d,0x67, 0x5,0x27,0x5c, 0x6,0x2d,0x6a, + 0x6,0x2d,0x63, 0x6,0x3b,0x27, 0x6,0x3b,0x25, 0x4,0x2f,0x3d, + 0x5,0x27,0x56, 0x6,0x3b,0x26, 0x6,0x34,0x2d, 0x4,0x2b,0x2d, + 0x5,0x2b,0x34, 0x6,0x34,0x28, 0x5,0x2b,0x31, 0x5,0x2b,0x38, + 0x6,0x34,0x29, 0x4,0x2b,0x2e, 0x6,0x43,0x54, 0x6,0x34,0x27, + 0x4,0x2b,0x2b, 0x6,0x34,0x2b, 0x4,0x2b,0x30, 0x6,0x34,0x25, + 0x5,0x2b,0x36, 0x6,0x34,0x26, 0x5,0x2b,0x37, 0x5,0x2b,0x32, + 0x4,0x2f,0x48, 0x5,0x2b,0x35, 0x6,0x33,0x7c, 0x6,0x34,0x21, + 0x6,0x34,0x22, 0x6,0x34,0x24, 0xf,0x2d,0x2a, 0xf,0x2d,0x2f, + 0xf,0x37,0x67, 0xf,0x37,0x68, 0x6,0x33,0x7e, 0x6,0x34,0x2f, + 0x6,0x34,0x2c, 0x6,0x34,0x2a, 0x6,0x34,0x30, 0x6,0x34,0x2e, + 0x6,0x43,0x53, 0x6,0x43,0x52, 0xf,0x2d,0x2b, 0x6,0x43,0x55, + 0x6,0x43,0x56, 0x6,0x3b,0x30, 0x6,0x43,0x51, 0xf,0x2d,0x2d, + 0x5,0x2f,0x67, 0x4,0x2f,0x3e, 0x4,0x34,0x45, 0x4,0x2f,0x45, + 0x6,0x3b,0x32, 0x5,0x2f,0x6c, 0x4,0x2f,0x44, 0x6,0x3b,0x2e, + 0x5,0x2f,0x6e, 0x6,0x3b,0x2a, 0x5,0x2f,0x70, 0x5,0x3b,0x44, + 0x5,0x2f,0x6f, 0x6,0x3b,0x29, 0x5,0x2f,0x66, 0x6,0x3b,0x2b, + 0x4,0x2f,0x40, 0x6,0x4d,0x3b, 0x5,0x2f,0x69, 0xf,0x2d,0x29, + 0xf,0x32,0x28, 0xf,0x32,0x29, 0xf,0x32,0x2d, 0xf,0x3e,0x4c, + 0x5,0x2f,0x68, 0x5,0x2e,0x24, 0x6,0x3b,0x2f, 0x6,0x3b,0x2d, + 0x6,0x3b,0x2c, 0x6,0x3b,0x33, 0x6,0x4d,0x3a, 0x6,0x4d,0x38, + 0x6,0x4d,0x39, 0x6,0x4d,0x37, 0x6,0x34,0x23, 0x5,0x2f,0x6b, + 0x5,0x2f,0x71, 0x5,0x2f,0x6a, 0x5,0x34,0x74, 0x6,0x43,0x5b, + 0x6,0x43,0x59, 0x5,0x34,0x6b, 0x4,0x34,0x4e, 0x5,0x34,0x6c, + 0x4,0x2f,0x42, 0x5,0x34,0x71, 0x4,0x34,0x46, 0x4,0x34,0x55, + 0x5,0x41,0x74, 0x4,0x34,0x54, 0x6,0x43,0x57, 0x5,0x34,0x6e, + 0x6,0x43,0x5f, 0x4,0x34,0x49, 0x5,0x34,0x75, 0x5,0x34,0x76, + 0x6,0x43,0x60, 0x6,0x43,0x5e, 0x4,0x34,0x4f, 0x5,0x34,0x72, + 0x6,0x43,0x61, 0x6,0x43,0x62, 0xf,0x37,0x69, 0xf,0x37,0x6b, + 0x6,0x43,0x5c, 0x6,0x43,0x5d, 0x6,0x56,0x6f, 0x6,0x56,0x70, + 0x6,0x56,0x71, 0x5,0x34,0x73, 0x5,0x34,0x6f, 0x5,0x34,0x70, + 0x6,0x4d,0x43, 0x5,0x3b,0x48, 0x6,0x4d,0x3d, 0x5,0x3b,0x45, + 0x6,0x4d,0x4b, 0x6,0x4d,0x42, 0x4,0x3a,0x3c, 0x5,0x3b,0x4a, + 0x6,0x4d,0x4f, 0x6,0x4d,0x3c, 0x6,0x60,0x65, 0x5,0x3b,0x47, + 0x6,0x4d,0x50, 0x6,0x56,0x75, 0x4,0x3a,0x48, 0x5,0x3b,0x4c, + 0x6,0x4d,0x55, 0x6,0x4d,0x4e, 0x6,0x4d,0x4c, 0x6,0x4d,0x53, + 0x5,0x3b,0x46, 0x5,0x48,0x75, 0x6,0x4d,0x3e, 0x6,0x4d,0x47, + 0x6,0x4d,0x4a, 0xf,0x3e,0x41, 0xf,0x3e,0x44, 0xf,0x3e,0x46, + 0xf,0x3e,0x47, 0xf,0x3e,0x48, 0xf,0x3e,0x49, 0xf,0x3e,0x4a, + 0xf,0x3e,0x4b, 0x6,0x4d,0x44, 0x6,0x4d,0x49, 0xf,0x3b,0x63, + 0x6,0x4d,0x4d, 0x6,0x4d,0x41, 0x6,0x4d,0x52, 0x6,0x4d,0x3f, + 0x6,0x4d,0x40, 0x6,0x60,0x63, 0x6,0x60,0x67, 0x6,0x60,0x64, + 0xf,0x3e,0x45, 0x5,0x3b,0x49, 0x6,0x4d,0x46, 0x5,0x34,0x6d, + 0x5,0x3b,0x4b, 0x5,0x3b,0x4e, 0x5,0x3b,0x4f, 0x6,0x4d,0x51, + 0x5,0x3b,0x51, 0x6,0x4d,0x45, 0x6,0x60,0x68, 0x6,0x60,0x66, + 0x5,0x41,0x7d, 0x4,0x40,0x21, 0x5,0x42,0x26, 0x5,0x42,0x21, + 0x5,0x41,0x75, 0x5,0x41,0x79, 0x5,0x42,0x27, 0x6,0x56,0x7d, + 0x4,0x3f,0x7e, 0x6,0x56,0x72, 0x4,0x3a,0x46, 0x5,0x42,0x22, + 0x5,0x41,0x78, 0x6,0x56,0x77, 0x4,0x40,0x24, 0x6,0x56,0x79, + 0x4,0x40,0x22, 0x6,0x57,0x21, 0x6,0x56,0x73, 0x5,0x42,0x29, + 0x6,0x56,0x74, 0x6,0x56,0x78, 0x5,0x42,0x23, 0x6,0x56,0x7c, + 0x5,0x41,0x7b, 0x5,0x41,0x7a, 0x5,0x42,0x25, 0x5,0x42,0x24, + 0x6,0x56,0x7a, 0x5,0x41,0x76, 0x6,0x56,0x7e, 0xf,0x44,0x69, + 0xf,0x44,0x6a, 0xf,0x44,0x6b, 0xf,0x44,0x6c, 0xf,0x44,0x6d, + 0xf,0x44,0x6f, 0xf,0x44,0x71, 0x4,0x40,0x2b, 0x6,0x57,0x23, + 0x6,0x57,0x22, 0xf,0x44,0x70, 0x7,0x27,0x32, 0x7,0x27,0x33, + 0x6,0x56,0x7b, 0x5,0x41,0x7e, 0x5,0x41,0x7c, 0x4,0x46,0x44, + 0x5,0x48,0x7b, 0x4,0x46,0x4c, 0x4,0x46,0x43, 0x5,0x49,0x23, + 0x6,0x60,0x6a, 0x5,0x48,0x7a, 0x4,0x46,0x4a, 0x5,0x49,0x24, + 0x5,0x49,0x21, 0x4,0x46,0x49, 0x5,0x48,0x77, 0x5,0x48,0x7d, + 0x4,0x46,0x3a, 0x4,0x46,0x4b, 0x5,0x48,0x78, 0x6,0x60,0x71, + 0x6,0x60,0x6c, 0x5,0x48,0x76, 0x6,0x60,0x6e, 0x5,0x48,0x79, + 0x6,0x60,0x6d, 0x5,0x48,0x7c, 0x7,0x31,0x63, 0x5,0x49,0x22, + 0x4,0x46,0x48, 0x6,0x60,0x6b, 0xf,0x4b,0x4d, 0xf,0x4b,0x4e, + 0xf,0x4b,0x4f, 0xf,0x4b,0x51, 0xf,0x4b,0x52, 0xf,0x4b,0x55, + 0xf,0x4b,0x53, 0x6,0x60,0x70, 0x6,0x5d,0x5c, 0x5,0x41,0x77, + 0x5,0x48,0x7e, 0x4,0x4c,0x53, 0x5,0x4f,0x7b, 0x7,0x27,0x34, + 0x4,0x4c,0x57, 0x7,0x27,0x3b, 0x5,0x4f,0x7a, 0x4,0x4c,0x59, + 0x7,0x3a,0x60, 0x7,0x27,0x37, 0x5,0x4f,0x7c, 0x7,0x27,0x35, + 0x4,0x4c,0x5a, 0x7,0x3a,0x5e, 0x5,0x4f,0x78, 0x7,0x27,0x38, + 0xf,0x51,0x51, 0xf,0x51,0x52, 0xf,0x51,0x53, 0xf,0x51,0x54, + 0x7,0x27,0x36, 0x7,0x27,0x39, 0x7,0x27,0x3a, 0x7,0x3a,0x5f, + 0x6,0x60,0x69, 0x5,0x4f,0x79, 0xf,0x5c,0x35, 0x7,0x31,0x6c, + 0x5,0x57,0x37, 0x5,0x57,0x32, 0x4,0x52,0x68, 0x4,0x52,0x5d, + 0x5,0x57,0x31, 0x4,0x52,0x5f, 0x7,0x31,0x67, 0x7,0x31,0x6e, + 0x5,0x57,0x35, 0x5,0x57,0x36, 0x4,0x52,0x65, 0x5,0x4f,0x7d, + 0x5,0x57,0x34, 0x7,0x31,0x65, 0x7,0x31,0x6d, 0x5,0x57,0x39, + 0x7,0x31,0x6a, 0x5,0x69,0x24, 0x4,0x52,0x60, 0x7,0x31,0x6f, + 0xf,0x57,0x31, 0xf,0x57,0x33, 0xf,0x57,0x32, 0x7,0x27,0x3c, + 0x7,0x31,0x68, 0x7,0x31,0x69, 0x7,0x31,0x64, 0x7,0x31,0x66, + 0x7,0x31,0x6b, 0x7,0x41,0x7a, 0x7,0x48,0x79, 0x7,0x41,0x7b, + 0x5,0x57,0x3a, 0x5,0x57,0x30, 0x5,0x57,0x3b, 0x5,0x57,0x38, + 0x5,0x57,0x33, 0x7,0x42,0x21, 0x5,0x5d,0x5a, 0x5,0x5d,0x59, + 0x7,0x3a,0x62, 0x4,0x58,0x2e, 0x4,0x58,0x2a, 0x4,0x58,0x29, + 0x5,0x5d,0x58, 0x5,0x5d,0x56, 0x4,0x60,0x71, 0x7,0x48,0x7b, + 0x5,0x5d,0x5e, 0x7,0x3a,0x65, 0xf,0x5c,0x2e, 0xf,0x5c,0x2f, + 0xf,0x5c,0x31, 0xf,0x5c,0x32, 0xf,0x5c,0x33, 0xf,0x5c,0x34, + 0xf,0x5c,0x36, 0xf,0x5c,0x30, 0x7,0x37,0x7e, 0x7,0x3a,0x63, + 0x7,0x48,0x7a, 0x7,0x48,0x7d, 0x5,0x5d,0x5d, 0x7,0x3a,0x61, + 0x5,0x5d,0x5c, 0x5,0x5d,0x57, 0x7,0x3a,0x64, 0x7,0x48,0x7e, + 0x4,0x5c,0x75, 0x5,0x63,0x6a, 0x5,0x63,0x67, 0x5,0x63,0x69, + 0x5,0x63,0x6c, 0x7,0x41,0x7c, 0x5,0x63,0x6e, 0x7,0x41,0x7e, + 0x5,0x63,0x6b, 0x7,0x42,0x23, 0x5,0x63,0x68, 0x5,0x6d,0x2a, + 0x5,0x63,0x6f, 0xf,0x60,0x3b, 0xf,0x60,0x3c, 0xf,0x60,0x3d, + 0xf,0x60,0x40, 0xf,0x60,0x41, 0x7,0x41,0x7d, 0x7,0x42,0x6d, + 0x4,0x5c,0x73, 0x4,0x60,0x72, 0x7,0x49,0x23, 0x7,0x49,0x29, + 0x5,0x69,0x25, 0x5,0x69,0x26, 0x5,0x63,0x6d, 0x7,0x49,0x24, + 0xf,0x63,0x4a, 0x7,0x49,0x28, 0x7,0x49,0x2a, 0xf,0x63,0x4c, + 0xf,0x63,0x4d, 0x7,0x49,0x22, 0x7,0x49,0x26, 0x7,0x49,0x25, + 0x7,0x49,0x27, 0x7,0x49,0x21, 0xf,0x63,0x4b, 0x7,0x49,0x2b, + 0x7,0x4f,0x3d, 0x5,0x6d,0x2e, 0x5,0x6d,0x2d, 0x4,0x64,0x2b, + 0x4,0x64,0x29, 0x5,0x6d,0x2b, 0xf,0x65,0x76, 0x7,0x4f,0x3c, + 0x7,0x4f,0x3b, 0x4,0x67,0x26, 0x7,0x54,0x4f, 0x5,0x70,0x77, + 0x7,0x5c,0x40, 0x7,0x55,0x3a, 0x7,0x5c,0x3f, 0x4,0x69,0x31, + 0x4,0x69,0x2f, 0x7,0x58,0x65, 0xf,0x68,0x33, 0x7,0x5c,0x41, + 0x5,0x76,0x3d, 0x7,0x5c,0x43, 0x7,0x5c,0x45, 0x7,0x5c,0x46, + 0x5,0x76,0x3c, 0x7,0x5c,0x42, 0x4,0x6a,0x6e, 0x7,0x5c,0x47, + 0x7,0x5c,0x48, 0x7,0x5f,0x3d, 0x5,0x77,0x7d, 0x7,0x5f,0x3e, + 0x5,0x79,0x3c, 0x7,0x64,0x57, 0x5,0x7a,0x6f, 0x5,0x7b,0x45, + 0x6,0x28,0x7c, 0x4,0x24,0x71, 0xf,0x2a,0x49, 0x6,0x3b,0x34, + 0xf,0x32,0x2f, 0x6,0x4d,0x56, 0x6,0x4d,0x57, 0xf,0x4b,0x58, + 0xf,0x4b,0x59, 0xf,0x51,0x56, 0x6,0x60,0x73, 0xf,0x5c,0x37, + 0x7,0x42,0x25, 0xf,0x60,0x42, 0x5,0x70,0x79, 0xf,0x68,0x34, + 0xf,0x69,0x67, 0x7,0x65,0x3d, 0x5,0x7c,0x2c, 0x6,0x25,0x4a, + 0x6,0x28,0x7e, 0x4,0x24,0x72, 0x6,0x28,0x7d, 0x6,0x2d,0x70, + 0x5,0x2b,0x3a, 0x6,0x34,0x32, 0xf,0x2d,0x30, 0x5,0x2f,0x72, + 0x6,0x3b,0x36, 0x4,0x2f,0x49, 0xf,0x32,0x30, 0x6,0x3b,0x37, + 0x6,0x3b,0x35, 0x6,0x43,0x66, 0x6,0x43,0x65, 0xf,0x37,0x6d, + 0xf,0x37,0x6e, 0x6,0x4d,0x59, 0x6,0x4d,0x5a, 0x6,0x57,0x24, + 0x5,0x49,0x25, 0xf,0x4b,0x5a, 0x4,0x4c,0x60, 0x4,0x4c,0x61, + 0x5,0x4f,0x7e, 0xf,0x51,0x57, 0x7,0x27,0x3d, 0x4,0x52,0x69, + 0x5,0x57,0x3c, 0x7,0x3a,0x66, 0x5,0x5d,0x60, 0x5,0x5d,0x5f, + 0xf,0x5c,0x38, 0xf,0x60,0x43, 0x5,0x69,0x27, 0x4,0x60,0x75, + 0x5,0x6d,0x31, 0xf,0x63,0x4e, 0x7,0x49,0x2c, 0x5,0x6d,0x2f, + 0x5,0x6d,0x30, 0x7,0x62,0x51, 0x6,0x29,0x21, 0x6,0x2d,0x71, + 0x6,0x2d,0x72, 0x6,0x3b,0x3a, 0xf,0x2d,0x31, 0x6,0x3b,0x38, + 0x6,0x3b,0x39, 0x5,0x34,0x77, 0x4,0x34,0x56, 0x6,0x4d,0x5b, + 0x5,0x42,0x2a, 0x5,0x49,0x26, 0xf,0x4b,0x5b, 0x5,0x50,0x21, + 0x7,0x27,0x3e, 0xf,0x51,0x58, 0x5,0x50,0x22, 0x7,0x31,0x71, + 0x4,0x52,0x6a, 0x5,0x57,0x3d, 0xf,0x57,0x34, 0x4,0x58,0x2f, + 0x5,0x63,0x70, 0x5,0x63,0x71, 0x4,0x24,0x74, 0x6,0x25,0x4b, + 0x6,0x23,0x64, 0x6,0x2d,0x73, 0x6,0x2d,0x74, 0xf,0x2d,0x32, + 0x4,0x2f,0x4b, 0x6,0x34,0x33, 0x6,0x3b,0x3b, 0x6,0x3b,0x41, + 0x6,0x3b,0x3d, 0x6,0x3b,0x3c, 0x4,0x2f,0x4c, 0x6,0x3b,0x3f, + 0x6,0x3b,0x40, 0x6,0x43,0x69, 0x5,0x34,0x78, 0x6,0x3b,0x3e, + 0x6,0x43,0x68, 0x6,0x43,0x6b, 0x6,0x43,0x6a, 0x5,0x3b,0x52, + 0x6,0x4d,0x5c, 0x5,0x3b,0x53, 0x5,0x49,0x27, 0x6,0x57,0x28, + 0x6,0x57,0x27, 0x6,0x57,0x25, 0x6,0x60,0x74, 0x6,0x60,0x7a, + 0x6,0x60,0x75, 0x6,0x60,0x76, 0x5,0x50,0x23, 0x7,0x27,0x3f, + 0x6,0x60,0x77, 0x6,0x60,0x7b, 0x6,0x60,0x78, 0x7,0x27,0x40, + 0x7,0x27,0x41, 0x7,0x27,0x42, 0x6,0x60,0x79, 0x5,0x49,0x28, + 0x5,0x50,0x24, 0x5,0x50,0x25, 0x7,0x27,0x43, 0x7,0x27,0x44, + 0x7,0x31,0x72, 0x7,0x27,0x45, 0x7,0x27,0x46, 0xf,0x57,0x35, + 0x7,0x31,0x74, 0x7,0x31,0x73, 0x5,0x5d,0x62, 0x7,0x31,0x77, + 0x7,0x31,0x76, 0x7,0x31,0x75, 0x5,0x5d,0x61, 0x5,0x5d,0x64, + 0x7,0x3a,0x67, 0x7,0x42,0x28, 0x7,0x42,0x27, 0x5,0x5d,0x65, + 0x4,0x5c,0x77, 0x7,0x42,0x26, 0xf,0x60,0x44, 0xf,0x60,0x45, + 0x7,0x49,0x2d, 0x5,0x63,0x73, 0x5,0x63,0x72, 0x7,0x49,0x2e, + 0x7,0x4f,0x3f, 0x5,0x69,0x28, 0x5,0x6d,0x33, 0x5,0x6d,0x34, + 0x5,0x6d,0x35, 0x7,0x4f,0x3e, 0x7,0x49,0x2f, 0xf,0x63,0x4f, + 0x5,0x69,0x29, 0x7,0x4f,0x40, 0x7,0x4f,0x41, 0x5,0x70,0x7a, + 0xf,0x65,0x78, 0xf,0x68,0x35, 0xf,0x68,0x37, 0x7,0x58,0x66, + 0xf,0x68,0x36, 0x7,0x58,0x67, 0x7,0x5c,0x49, 0x5,0x77,0x7e, + 0x7,0x61,0x37, 0x5,0x79,0x3d, 0x5,0x79,0x3f, 0x5,0x79,0x3e, + 0xf,0x6c,0x6a, 0x7,0x65,0x3e, 0x7,0x65,0x3f, 0x7,0x66,0x53, + 0x5,0x7c,0x50, 0xf,0x25,0x2b, 0x6,0x34,0x34, 0x4,0x2f,0x4e, + 0x4,0x2f,0x4d, 0x6,0x3b,0x42, 0x6,0x3b,0x43, 0x6,0x3b,0x44, + 0x5,0x2f,0x73, 0x5,0x2f,0x74, 0x6,0x43,0x6c, 0x6,0x43,0x6d, + 0x6,0x41,0x7d, 0x6,0x4d,0x60, 0x6,0x4d,0x5f, 0x6,0x4d,0x61, + 0xf,0x3e,0x50, 0x5,0x49,0x29, 0x4,0x46,0x4d, 0x5,0x45,0x53, + 0x4,0x46,0x4e, 0x6,0x57,0x29, 0xf,0x4b,0x5c, 0x6,0x60,0x7c, + 0x6,0x60,0x7e, 0x6,0x60,0x7d, 0x7,0x27,0x47, 0xf,0x51,0x59, + 0x7,0x27,0x49, 0x7,0x27,0x48, 0x7,0x31,0x78, 0x5,0x57,0x3e, + 0x7,0x31,0x79, 0x7,0x3a,0x68, 0xf,0x60,0x46, 0x5,0x63,0x74, + 0x7,0x42,0x2a, 0x7,0x42,0x29, 0x5,0x6d,0x36, 0x5,0x70,0x7b, + 0x7,0x5c,0x4a, 0x5,0x76,0x3e, 0x5,0x50,0x26, 0x5,0x50,0x27, + 0xf,0x60,0x47, 0x7,0x4f,0x42, 0x7,0x5c,0x4b, 0x7,0x5f,0x3f, + 0x7,0x61,0x39, 0x5,0x7a,0x70, 0x5,0x24,0x74, 0x4,0x27,0x71, + 0x4,0x27,0x70, 0x6,0x2d,0x77, 0x6,0x2d,0x76, 0x6,0x2d,0x75, + 0x5,0x27,0x5f, 0x4,0x2b,0x31, 0x4,0x2b,0x35, 0x4,0x2b,0x34, + 0x6,0x34,0x35, 0x6,0x34,0x37, 0x6,0x34,0x36, 0x6,0x3b,0x4a, + 0x5,0x2f,0x75, 0x6,0x3b,0x49, 0x6,0x3b,0x45, 0x5,0x2f,0x76, + 0x4,0x2f,0x52, 0x4,0x2f,0x51, 0x6,0x3b,0x46, 0x6,0x3b,0x47, + 0x6,0x3b,0x48, 0x5,0x34,0x7a, 0x4,0x34,0x59, 0x4,0x34,0x5b, + 0x6,0x43,0x72, 0x5,0x34,0x7b, 0x6,0x43,0x6e, 0x6,0x43,0x6f, + 0xf,0x37,0x71, 0x5,0x34,0x79, 0xf,0x37,0x70, 0xf,0x37,0x72, + 0x5,0x3b,0x54, 0x6,0x4d,0x65, 0x6,0x4d,0x64, 0x4,0x34,0x5a, + 0x4,0x3a,0x52, 0x4,0x3a,0x50, 0x4,0x3a,0x51, 0x4,0x3a,0x53, + 0x6,0x4d,0x66, 0x5,0x42,0x2b, 0x6,0x57,0x2c, 0x5,0x42,0x2c, + 0x6,0x57,0x2a, 0xf,0x44,0x72, 0x6,0x57,0x2b, 0x6,0x57,0x2d, + 0x6,0x57,0x2e, 0x5,0x42,0x2e, 0x6,0x61,0x27, 0x5,0x49,0x2d, + 0x5,0x49,0x2b, 0x4,0x46,0x52, 0x6,0x61,0x22, 0x6,0x61,0x26, + 0xf,0x4b,0x5e, 0xf,0x4b,0x5f, 0xf,0x4b,0x5d, 0x6,0x61,0x23, + 0x5,0x49,0x2a, 0x5,0x50,0x2f, 0x4,0x4c,0x67, 0x4,0x4c,0x66, + 0x5,0x50,0x2e, 0x5,0x50,0x2b, 0x5,0x50,0x2c, 0x5,0x50,0x30, + 0x5,0x50,0x28, 0x7,0x27,0x4f, 0x7,0x27,0x4d, 0x5,0x50,0x31, + 0x7,0x27,0x4a, 0x7,0x27,0x4c, 0x7,0x27,0x4e, 0x7,0x27,0x4b, + 0x5,0x50,0x2d, 0x5,0x50,0x29, 0x5,0x50,0x2a, 0x5,0x57,0x42, + 0x5,0x57,0x3f, 0x5,0x57,0x43, 0x7,0x31,0x7c, 0x5,0x57,0x40, + 0x7,0x32,0x21, 0x7,0x31,0x7d, 0x7,0x32,0x23, 0x5,0x57,0x41, + 0x7,0x32,0x22, 0xf,0x57,0x36, 0x7,0x31,0x7e, 0x7,0x31,0x7b, + 0x7,0x3a,0x6a, 0x4,0x58,0x31, 0x5,0x5d,0x6c, 0x5,0x5d,0x66, + 0x5,0x5d,0x69, 0x5,0x5d,0x68, 0x5,0x5d,0x6a, 0x5,0x5d,0x6b, + 0x4,0x5c,0x79, 0x5,0x63,0x7b, 0x7,0x42,0x2c, 0x5,0x63,0x75, + 0x5,0x63,0x7a, 0x5,0x63,0x7d, 0x5,0x63,0x79, 0x4,0x5c,0x7a, + 0x4,0x5c,0x7b, 0x5,0x63,0x76, 0x5,0x63,0x77, 0x5,0x63,0x7c, + 0x4,0x5c,0x78, 0x7,0x42,0x2d, 0x7,0x42,0x2b, 0x5,0x63,0x78, + 0x7,0x49,0x30, 0x5,0x69,0x2d, 0x5,0x69,0x2c, 0x5,0x69,0x2b, + 0x5,0x69,0x2a, 0x7,0x49,0x31, 0xf,0x63,0x50, 0x7,0x49,0x32, + 0x5,0x6d,0x37, 0x7,0x4f,0x43, 0x5,0x70,0x7d, 0x5,0x70,0x7c, + 0x7,0x54,0x52, 0x5,0x74,0x21, 0x5,0x74,0x22, 0x4,0x69,0x32, + 0x7,0x58,0x68, 0x7,0x54,0x50, 0x7,0x54,0x51, 0x4,0x6a,0x6f, + 0x7,0x5c,0x4c, 0x7,0x61,0x3b, 0x7,0x61,0x3a, 0x7,0x62,0x52, + 0x5,0x7a,0x71, 0x4,0x6e,0x4f, 0x6,0x34,0x38, 0xf,0x37,0x73, + 0x5,0x3b,0x3f, 0xf,0x3e,0x51, 0xf,0x51,0x5a, 0xf,0x5c,0x39, + 0x7,0x4f,0x44, 0x5,0x34,0x7c, 0x5,0x34,0x7d, 0x6,0x43,0x73, + 0x5,0x34,0x7e, 0xf,0x3e,0x52, 0x6,0x57,0x2f, 0x6,0x57,0x30, + 0x6,0x57,0x31, 0x6,0x61,0x29, 0xf,0x4b,0x60, 0x6,0x61,0x2a, + 0x6,0x61,0x28, 0x7,0x27,0x51, 0x7,0x27,0x50, 0x7,0x27,0x52, + 0xf,0x51,0x5b, 0xf,0x51,0x5c, 0xf,0x51,0x5d, 0x5,0x57,0x44, + 0x5,0x57,0x45, 0x7,0x32,0x25, 0x7,0x32,0x24, 0x5,0x6d,0x39, + 0x5,0x6d,0x38, 0x7,0x4f,0x45, 0xf,0x6c,0x37, 0x5,0x21,0x7b, + 0x6,0x23,0x38, 0x4,0x23,0x2e, 0x6,0x25,0x50, 0x6,0x25,0x51, + 0x6,0x2d,0x78, 0x6,0x25,0x4e, 0x5,0x23,0x26, 0x6,0x25,0x4d, + 0xf,0x22,0x6f, 0xf,0x22,0x70, 0xf,0x22,0x6e, 0x6,0x25,0x4c, + 0x4,0x24,0x77, 0x4,0x24,0x78, 0x4,0x24,0x7c, 0x6,0x29,0x22, + 0x4,0x24,0x7a, 0x6,0x29,0x25, 0x6,0x29,0x23, 0x6,0x29,0x24, + 0x6,0x29,0x26, 0xf,0x25,0x2c, 0xf,0x25,0x2d, 0xf,0x25,0x2e, + 0xf,0x25,0x2f, 0xf,0x25,0x30, 0xf,0x25,0x31, 0x6,0x2d,0x7b, + 0x4,0x27,0x7c, 0x4,0x27,0x77, 0x4,0x27,0x79, 0x5,0x27,0x62, + 0x4,0x27,0x7d, 0x4,0x27,0x78, 0x4,0x27,0x75, 0x5,0x27,0x60, + 0x6,0x2d,0x7c, 0x5,0x27,0x61, 0x4,0x27,0x74, 0x6,0x3b,0x4b, + 0x6,0x27,0x4c, 0x6,0x2e,0x21, 0x5,0x27,0x64, 0x4,0x27,0x76, + 0x6,0x2d,0x7a, 0x6,0x2d,0x7e, 0x6,0x3b,0x4d, 0x6,0x3b,0x4c, + 0xf,0x28,0x57, 0xf,0x28,0x58, 0xf,0x28,0x59, 0xf,0x28,0x5a, + 0xf,0x28,0x5b, 0xf,0x28,0x5d, 0xf,0x28,0x5e, 0xf,0x28,0x5f, + 0xf,0x28,0x60, 0xf,0x28,0x61, 0xf,0x28,0x62, 0xf,0x28,0x64, + 0x6,0x2d,0x79, 0x4,0x2b,0x3b, 0x4,0x2b,0x37, 0x4,0x2b,0x38, + 0x4,0x2b,0x39, 0x5,0x2b,0x3f, 0x6,0x34,0x43, 0x6,0x34,0x3b, + 0x4,0x2b,0x3c, 0x6,0x34,0x41, 0x6,0x34,0x3d, 0x5,0x2b,0x3d, + 0x6,0x34,0x39, 0x6,0x34,0x40, 0x6,0x34,0x3e, 0x6,0x34,0x42, + 0x6,0x34,0x45, 0x6,0x34,0x46, 0x5,0x2b,0x3b, 0x5,0x2b,0x3e, + 0x5,0x2b,0x3c, 0xf,0x2d,0x33, 0xf,0x2d,0x35, 0xf,0x2d,0x37, + 0xf,0x2d,0x38, 0xf,0x2d,0x39, 0xf,0x2d,0x3a, 0xf,0x2d,0x3b, + 0xf,0x2d,0x3c, 0xf,0x2d,0x36, 0x6,0x33,0x3e, 0x6,0x34,0x3f, + 0xf,0x2d,0x34, 0x6,0x2d,0x7d, 0x6,0x4d,0x68, 0xf,0x2a,0x52, + 0x5,0x2f,0x7c, 0x4,0x2f,0x56, 0x4,0x2f,0x57, 0x4,0x2f,0x62, + 0x5,0x2f,0x78, 0x5,0x2f,0x7a, 0x5,0x2f,0x7e, 0x4,0x2f,0x54, + 0x5,0x2f,0x77, 0x5,0x30,0x23, 0x4,0x2f,0x5b, 0x5,0x30,0x27, + 0x4,0x2f,0x58, 0x4,0x2f,0x65, 0x5,0x30,0x24, 0x4,0x2f,0x60, + 0x6,0x3b,0x5e, 0x6,0x3b,0x5f, 0x5,0x30,0x25, 0x6,0x3b,0x61, + 0x5,0x30,0x22, 0x4,0x2f,0x66, 0x6,0x3b,0x59, 0x6,0x3b,0x58, + 0x6,0x4d,0x67, 0x6,0x44,0x22, 0x6,0x3b,0x55, 0x5,0x2f,0x7d, + 0x6,0x3b,0x54, 0x6,0x3b,0x51, 0x6,0x3b,0x4f, 0x6,0x3b,0x5a, + 0x6,0x3b,0x5c, 0x5,0x2f,0x7b, 0x6,0x3b,0x57, 0x5,0x30,0x26, + 0x5,0x2f,0x79, 0x6,0x3b,0x53, 0x6,0x3b,0x5b, 0x6,0x3b,0x5d, + 0x6,0x3b,0x62, 0xf,0x32,0x33, 0xf,0x32,0x35, 0xf,0x32,0x36, + 0xf,0x32,0x37, 0xf,0x32,0x38, 0xf,0x32,0x39, 0xf,0x32,0x3b, + 0xf,0x32,0x3c, 0xf,0x32,0x3d, 0xf,0x32,0x3f, 0xf,0x32,0x40, + 0xf,0x32,0x42, 0xf,0x32,0x43, 0xf,0x32,0x44, 0xf,0x32,0x45, + 0xf,0x32,0x47, 0xf,0x32,0x48, 0xf,0x32,0x49, 0xf,0x32,0x4a, + 0xf,0x32,0x4b, 0x6,0x3b,0x50, 0xf,0x32,0x46, 0xf,0x32,0x4c, + 0xf,0x32,0x3e, 0x5,0x35,0x2b, 0x5,0x35,0x2e, 0x5,0x35,0x27, + 0x4,0x34,0x70, 0x5,0x35,0x2c, 0x4,0x34,0x61, 0x4,0x34,0x6e, + 0x4,0x34,0x68, 0x6,0x44,0x32, 0x4,0x34,0x72, 0x4,0x34,0x75, + 0x6,0x44,0x26, 0x6,0x43,0x7b, 0x6,0x44,0x23, 0x5,0x35,0x23, + 0x6,0x43,0x79, 0x6,0x43,0x75, 0x4,0x34,0x60, 0x5,0x35,0x32, + 0x6,0x43,0x74, 0x6,0x44,0x21, 0x6,0x44,0x38, 0x4,0x34,0x64, + 0x6,0x44,0x36, 0x6,0x4e,0x3a, 0x6,0x44,0x34, 0x6,0x3b,0x60, + 0x6,0x4d,0x78, 0x4,0x34,0x5f, 0x5,0x35,0x21, 0x4,0x34,0x6b, + 0x6,0x43,0x77, 0x6,0x44,0x24, 0x5,0x35,0x30, 0x6,0x44,0x2f, + 0x6,0x44,0x35, 0x6,0x44,0x2e, 0x6,0x44,0x29, 0x5,0x35,0x2f, + 0x6,0x44,0x33, 0x6,0x43,0x78, 0x6,0x44,0x27, 0x5,0x35,0x31, + 0x5,0x42,0x2f, 0x6,0x57,0x32, 0x6,0x57,0x33, 0x6,0x44,0x30, + 0x6,0x44,0x31, 0x6,0x43,0x7e, 0x5,0x35,0x22, 0x5,0x35,0x33, + 0x6,0x44,0x2a, 0x5,0x35,0x29, 0x5,0x35,0x2d, 0x5,0x35,0x26, + 0x6,0x4e,0x37, 0x6,0x44,0x39, 0x6,0x44,0x3a, 0x6,0x43,0x7c, + 0x6,0x43,0x7a, 0xf,0x37,0x74, 0xf,0x37,0x75, 0xf,0x37,0x76, + 0xf,0x37,0x77, 0xf,0x37,0x79, 0xf,0x37,0x7b, 0xf,0x37,0x7c, + 0xf,0x37,0x7d, 0xf,0x37,0x7e, 0xf,0x38,0x21, 0xf,0x38,0x22, + 0xf,0x38,0x24, 0xf,0x38,0x25, 0xf,0x38,0x26, 0xf,0x38,0x27, + 0xf,0x38,0x28, 0xf,0x38,0x29, 0xf,0x38,0x2a, 0xf,0x38,0x2b, + 0xf,0x38,0x2c, 0xf,0x38,0x2d, 0xf,0x38,0x2e, 0xf,0x38,0x2f, + 0xf,0x38,0x30, 0xf,0x38,0x31, 0xf,0x38,0x32, 0xf,0x38,0x33, + 0xf,0x38,0x34, 0xf,0x38,0x35, 0x5,0x3b,0x5d, 0x6,0x43,0x7d, + 0x5,0x35,0x28, 0x6,0x44,0x25, 0xf,0x37,0x7a, 0x6,0x44,0x2d, + 0x6,0x44,0x37, 0xf,0x38,0x23, 0x5,0x35,0x25, 0x5,0x3b,0x55, + 0x4,0x3a,0x55, 0x5,0x3b,0x69, 0x5,0x3b,0x6a, 0x5,0x3b,0x62, + 0x5,0x3b,0x6c, 0x5,0x3b,0x6d, 0x5,0x3b,0x63, 0x4,0x3a,0x5d, + 0x6,0x4d,0x7a, 0x6,0x4d,0x72, 0x6,0x4e,0x2b, 0x6,0x4d,0x70, + 0x6,0x4d,0x6b, 0x5,0x3b,0x5f, 0x5,0x3b,0x67, 0x5,0x3b,0x68, + 0x6,0x4d,0x7b, 0x6,0x4d,0x79, 0x5,0x3b,0x5e, 0x5,0x3b,0x6e, + 0x5,0x3b,0x6b, 0x4,0x34,0x6a, 0x4,0x3a,0x57, 0x4,0x3a,0x5a, + 0x4,0x3a,0x58, 0x4,0x3a,0x62, 0x5,0x3b,0x5a, 0x4,0x3a,0x54, + 0x6,0x4d,0x69, 0x6,0x4e,0x35, 0x4,0x3a,0x63, 0x6,0x4d,0x6a, + 0x5,0x3b,0x64, 0x6,0x4d,0x7c, 0x6,0x4e,0x36, 0x6,0x4d,0x7d, + 0x6,0x4e,0x2f, 0x6,0x4e,0x30, 0x4,0x3a,0x6b, 0x6,0x4e,0x26, + 0x4,0x3a,0x69, 0x6,0x4e,0x23, 0x5,0x3b,0x5c, 0x6,0x4e,0x28, + 0x6,0x4d,0x75, 0x6,0x4e,0x2d, 0x6,0x4d,0x74, 0x6,0x4e,0x22, + 0x6,0x4e,0x31, 0x6,0x4e,0x29, 0x5,0x3b,0x65, 0x6,0x61,0x32, + 0x6,0x61,0x2d, 0x6,0x61,0x2e, 0x5,0x3b,0x57, 0x6,0x4e,0x24, + 0x6,0x4d,0x6f, 0x6,0x4e,0x2e, 0x5,0x49,0x2e, 0x6,0x4d,0x73, + 0x6,0x4e,0x2c, 0x6,0x4d,0x77, 0x6,0x4e,0x25, 0x6,0x4d,0x6d, + 0x6,0x4e,0x2a, 0x4,0x3a,0x6a, 0x5,0x3b,0x60, 0x5,0x3b,0x5b, + 0x6,0x4d,0x76, 0x6,0x4e,0x38, 0x6,0x61,0x2b, 0x5,0x3b,0x66, + 0x6,0x61,0x2f, 0x5,0x3b,0x61, 0x6,0x4e,0x34, 0x6,0x61,0x31, + 0x6,0x61,0x30, 0x6,0x4d,0x6c, 0x6,0x4d,0x7e, 0x6,0x4c,0x7b, + 0x5,0x3b,0x58, 0x6,0x4d,0x6e, 0x6,0x4d,0x71, 0x6,0x4e,0x33, + 0x6,0x4e,0x39, 0xf,0x3e,0x53, 0xf,0x3e,0x55, 0xf,0x3e,0x56, + 0xf,0x3e,0x58, 0xf,0x3e,0x5a, 0xf,0x3e,0x5b, 0xf,0x3e,0x5c, + 0xf,0x3e,0x5d, 0xf,0x3e,0x5e, 0xf,0x3e,0x5f, 0xf,0x3e,0x60, + 0xf,0x3e,0x61, 0xf,0x3e,0x63, 0xf,0x3e,0x64, 0xf,0x3e,0x65, + 0xf,0x3e,0x68, 0xf,0x3e,0x69, 0xf,0x3e,0x6a, 0xf,0x3e,0x6d, + 0xf,0x3e,0x6f, 0xf,0x3e,0x70, 0xf,0x3e,0x71, 0xf,0x3e,0x72, + 0xf,0x3e,0x74, 0xf,0x3e,0x75, 0xf,0x3e,0x76, 0xf,0x3e,0x77, + 0xf,0x3e,0x78, 0xf,0x3e,0x79, 0xf,0x3e,0x7a, 0xf,0x3e,0x7b, + 0xf,0x3e,0x7c, 0xf,0x3e,0x7d, 0xf,0x3e,0x7e, 0x6,0x61,0x2c, + 0x5,0x3b,0x59, 0x6,0x4e,0x21, 0xf,0x3e,0x62, 0xf,0x3e,0x54, + 0xf,0x3e,0x6e, 0xf,0x3e,0x73, 0x4,0x40,0x43, 0x6,0x57,0x34, + 0x6,0x57,0x46, 0x5,0x42,0x4e, 0x6,0x57,0x3a, 0x6,0x57,0x3b, + 0x5,0x42,0x34, 0x4,0x40,0x3d, 0x6,0x57,0x49, 0x6,0x57,0x5a, + 0x4,0x40,0x40, 0x4,0x40,0x42, 0x5,0x42,0x45, 0x6,0x57,0x5e, + 0x5,0x42,0x3a, 0x4,0x40,0x37, 0x4,0x40,0x34, 0x6,0x57,0x41, + 0x6,0x57,0x63, 0x5,0x42,0x33, 0x6,0x57,0x51, 0x6,0x57,0x55, + 0x5,0x42,0x43, 0x6,0x57,0x4a, 0x4,0x40,0x38, 0x4,0x40,0x3b, + 0x5,0x42,0x36, 0x6,0x57,0x43, 0x4,0x40,0x3c, 0x4,0x40,0x45, + 0x5,0x42,0x41, 0x4,0x40,0x4d, 0x5,0x42,0x4f, 0x4,0x40,0x3e, + 0x5,0x42,0x46, 0x6,0x57,0x5d, 0x5,0x42,0x3f, 0x4,0x40,0x33, + 0x4,0x40,0x31, 0x6,0x57,0x65, 0x4,0x40,0x3f, 0x6,0x57,0x42, + 0x5,0x42,0x48, 0x5,0x42,0x42, 0x5,0x42,0x38, 0x5,0x42,0x3e, + 0x6,0x57,0x38, 0x6,0x57,0x53, 0x6,0x57,0x4f, 0x6,0x57,0x40, + 0x6,0x57,0x67, 0x5,0x42,0x3d, 0x6,0x57,0x39, 0x6,0x57,0x64, + 0x6,0x57,0x37, 0x5,0x42,0x50, 0x6,0x57,0x4e, 0x6,0x57,0x45, + 0x6,0x57,0x3c, 0x5,0x42,0x49, 0x5,0x42,0x4d, 0x5,0x42,0x3b, + 0x5,0x42,0x47, 0x6,0x57,0x52, 0x6,0x57,0x60, 0x6,0x57,0x5c, + 0x6,0x57,0x48, 0x6,0x57,0x56, 0x5,0x42,0x39, 0x4,0x40,0x39, + 0x6,0x57,0x57, 0x5,0x42,0x30, 0x5,0x42,0x40, 0x5,0x42,0x32, + 0x5,0x42,0x4a, 0x6,0x57,0x3f, 0x4,0x40,0x35, 0x4,0x40,0x4b, + 0x6,0x57,0x4c, 0x5,0x42,0x35, 0x5,0x42,0x31, 0x6,0x57,0x47, + 0x6,0x57,0x58, 0x7,0x27,0x53, 0x6,0x57,0x61, 0x5,0x42,0x3c, + 0x6,0x57,0x44, 0x6,0x57,0x54, 0x6,0x57,0x36, 0x6,0x57,0x62, + 0x6,0x57,0x66, 0x6,0x57,0x59, 0x4,0x40,0x4e, 0x5,0x42,0x44, + 0x5,0x42,0x4b, 0x6,0x57,0x35, 0x6,0x57,0x3e, 0x6,0x57,0x4b, + 0x6,0x57,0x4d, 0x6,0x57,0x5b, 0x6,0x57,0x5f, 0xf,0x44,0x73, + 0xf,0x44,0x75, 0xf,0x44,0x76, 0xf,0x44,0x77, 0xf,0x44,0x78, + 0xf,0x44,0x79, 0xf,0x44,0x7a, 0xf,0x44,0x7b, 0xf,0x44,0x7c, + 0xf,0x44,0x7d, 0xf,0x44,0x7e, 0xf,0x45,0x21, 0xf,0x45,0x22, + 0xf,0x45,0x23, 0xf,0x45,0x24, 0xf,0x45,0x25, 0xf,0x45,0x26, + 0xf,0x45,0x27, 0xf,0x45,0x28, 0xf,0x45,0x29, 0xf,0x45,0x2a, + 0xf,0x45,0x2b, 0xf,0x45,0x2c, 0xf,0x45,0x2e, 0xf,0x45,0x2f, + 0xf,0x45,0x30, 0xf,0x45,0x31, 0x5,0x42,0x4c, 0x4,0x40,0x4a, + 0x6,0x57,0x3d, 0x6,0x4e,0x32, 0xf,0x3e,0x57, 0x5,0x42,0x37, + 0x4,0x46,0x66, 0x6,0x61,0x60, 0x5,0x49,0x45, 0x6,0x61,0x33, + 0x6,0x61,0x43, 0x5,0x49,0x4b, 0x4,0x46,0x63, 0x6,0x61,0x56, + 0x4,0x46,0x56, 0x6,0x61,0x45, 0x4,0x46,0x59, 0x6,0x61,0x3c, + 0x5,0x49,0x41, 0x6,0x61,0x4a, 0x4,0x46,0x55, 0x6,0x61,0x52, + 0x5,0x49,0x3d, 0x6,0x61,0x40, 0x6,0x61,0x59, 0x5,0x49,0x49, + 0x5,0x49,0x46, 0x6,0x61,0x4c, 0x5,0x49,0x3a, 0x4,0x46,0x5a, + 0x6,0x61,0x39, 0x6,0x61,0x55, 0x6,0x61,0x4d, 0x6,0x61,0x3f, + 0x5,0x49,0x44, 0x5,0x49,0x39, 0x5,0x49,0x30, 0x4,0x46,0x62, + 0x6,0x61,0x41, 0x4,0x46,0x5e, 0x6,0x61,0x36, 0x4,0x46,0x5d, + 0x4,0x46,0x6b, 0x4,0x46,0x5b, 0x5,0x49,0x3f, 0x7,0x27,0x58, + 0x6,0x61,0x37, 0x5,0x49,0x32, 0x5,0x49,0x37, 0x5,0x49,0x31, + 0x5,0x49,0x48, 0x5,0x50,0x3b, 0x4,0x46,0x5f, 0x5,0x49,0x43, + 0x6,0x61,0x38, 0x4,0x46,0x68, 0x6,0x61,0x50, 0x5,0x49,0x38, + 0x6,0x61,0x57, 0x6,0x61,0x46, 0x6,0x61,0x3b, 0x5,0x49,0x40, + 0x5,0x49,0x36, 0x7,0x32,0x27, 0x5,0x49,0x2f, 0x5,0x49,0x34, + 0x6,0x61,0x47, 0x6,0x61,0x49, 0x6,0x61,0x4b, 0x6,0x61,0x4e, + 0x6,0x61,0x5a, 0x6,0x61,0x5d, 0x6,0x61,0x5e, 0xf,0x4b,0x61, + 0xf,0x4b,0x62, 0xf,0x4b,0x63, 0xf,0x4b,0x66, 0xf,0x4b,0x68, + 0xf,0x4b,0x69, 0xf,0x4b,0x6a, 0xf,0x4b,0x6b, 0xf,0x4b,0x6c, + 0xf,0x4b,0x6d, 0xf,0x4b,0x6e, 0xf,0x4b,0x6f, 0xf,0x4b,0x70, + 0xf,0x4b,0x71, 0xf,0x4b,0x72, 0xf,0x4b,0x73, 0xf,0x4b,0x74, + 0xf,0x4b,0x75, 0xf,0x4b,0x76, 0xf,0x4b,0x78, 0xf,0x4b,0x79, + 0xf,0x4b,0x7a, 0xf,0x4b,0x7c, 0xf,0x4b,0x7d, 0xf,0x4b,0x7e, + 0xf,0x4c,0x21, 0xf,0x4c,0x22, 0xf,0x4c,0x23, 0xf,0x4c,0x25, + 0xf,0x4c,0x26, 0xf,0x4c,0x27, 0xf,0x4c,0x28, 0xf,0x4c,0x29, + 0xf,0x4c,0x2a, 0x6,0x61,0x48, 0x5,0x49,0x42, 0x6,0x61,0x53, + 0x6,0x61,0x51, 0x6,0x57,0x68, 0x5,0x49,0x4a, 0x6,0x61,0x5c, + 0x6,0x61,0x5f, 0x6,0x61,0x5b, 0x6,0x61,0x3a, 0x6,0x61,0x35, + 0x6,0x61,0x42, 0x6,0x61,0x3d, 0x6,0x57,0x50, 0xf,0x4b,0x64, + 0xf,0x4b,0x67, 0x6,0x61,0x54, 0x4,0x46,0x6a, 0x4,0x46,0x54, + 0x5,0x49,0x35, 0x5,0x49,0x4d, 0x7,0x32,0x26, 0x5,0x49,0x33, + 0x6,0x61,0x61, 0x5,0x49,0x47, 0x5,0x49,0x4c, 0x5,0x57,0x46, + 0xf,0x4b,0x7b, 0x5,0x49,0x3e, 0x7,0x27,0x6c, 0x4,0x4c,0x7e, + 0x5,0x50,0x32, 0x4,0x4c,0x69, 0x4,0x4c,0x7c, 0x7,0x28,0x21, + 0x5,0x50,0x35, 0x7,0x28,0x24, 0x7,0x27,0x77, 0x7,0x27,0x5c, + 0x5,0x50,0x39, 0x7,0x27,0x69, 0x7,0x27,0x78, 0x7,0x27,0x79, + 0x7,0x27,0x6a, 0x7,0x27,0x73, 0x5,0x50,0x3a, 0x7,0x27,0x6f, + 0x4,0x4c,0x75, 0x5,0x50,0x3d, 0x5,0x50,0x42, 0x7,0x27,0x60, + 0x7,0x28,0x22, 0x5,0x50,0x40, 0x5,0x50,0x3f, 0x5,0x57,0x47, + 0x5,0x50,0x41, 0x5,0x50,0x4b, 0x7,0x27,0x6b, 0x7,0x27,0x76, + 0x7,0x27,0x59, 0x7,0x27,0x72, 0x7,0x27,0x65, 0x5,0x50,0x48, + 0x5,0x50,0x37, 0x4,0x4c,0x7b, 0x7,0x27,0x54, 0x7,0x27,0x5b, + 0x7,0x27,0x64, 0x7,0x27,0x63, 0x7,0x27,0x67, 0x5,0x50,0x33, + 0x7,0x27,0x66, 0x7,0x27,0x7d, 0x7,0x27,0x5e, 0x5,0x50,0x3e, + 0x7,0x27,0x56, 0x5,0x50,0x34, 0x5,0x50,0x4a, 0x7,0x27,0x7c, + 0x7,0x27,0x62, 0x7,0x27,0x5d, 0x7,0x27,0x6e, 0x4,0x4c,0x76, + 0x5,0x50,0x49, 0x5,0x50,0x45, 0x7,0x27,0x74, 0x5,0x57,0x58, + 0x4,0x4d,0x22, 0x5,0x50,0x43, 0x7,0x27,0x55, 0x7,0x27,0x5a, + 0x7,0x27,0x5f, 0x7,0x27,0x70, 0x7,0x27,0x71, 0x7,0x28,0x23, + 0xf,0x51,0x5e, 0xf,0x51,0x5f, 0xf,0x51,0x60, 0xf,0x51,0x62, + 0xf,0x51,0x63, 0xf,0x51,0x66, 0xf,0x51,0x67, 0xf,0x51,0x68, + 0xf,0x51,0x69, 0xf,0x51,0x6a, 0xf,0x51,0x6c, 0xf,0x51,0x6d, + 0xf,0x51,0x6e, 0xf,0x51,0x6f, 0xf,0x51,0x70, 0xf,0x51,0x72, + 0xf,0x51,0x75, 0xf,0x51,0x77, 0x4,0x4d,0x23, 0x7,0x27,0x7a, + 0x5,0x50,0x44, 0x7,0x27,0x7e, 0x7,0x27,0x75, 0x7,0x27,0x68, + 0xf,0x51,0x71, 0xf,0x51,0x61, 0xf,0x51,0x6b, 0x5,0x50,0x36, + 0x7,0x27,0x57, 0x5,0x50,0x47, 0x5,0x50,0x3c, 0x6,0x61,0x34, + 0x7,0x42,0x2e, 0xf,0x4c,0x24, 0x7,0x32,0x51, 0x4,0x53,0x2d, + 0x7,0x32,0x32, 0x4,0x53,0x2a, 0x4,0x53,0x34, 0x7,0x32,0x53, + 0x5,0x57,0x49, 0x4,0x53,0x2b, 0x5,0x57,0x5d, 0x7,0x32,0x43, + 0x5,0x57,0x54, 0x4,0x52,0x71, 0x4,0x53,0x30, 0x5,0x57,0x51, + 0x5,0x57,0x5b, 0x7,0x32,0x3c, 0x4,0x52,0x75, 0x5,0x57,0x5a, + 0x5,0x57,0x4b, 0x5,0x57,0x5f, 0x7,0x32,0x33, 0x5,0x57,0x61, + 0x4,0x53,0x2f, 0x7,0x32,0x28, 0x5,0x57,0x4d, 0x5,0x57,0x4f, + 0x7,0x32,0x4c, 0x5,0x57,0x55, 0x5,0x57,0x62, 0x7,0x32,0x3d, + 0x7,0x32,0x3b, 0x5,0x50,0x4c, 0x4,0x52,0x70, 0x5,0x57,0x48, + 0x5,0x57,0x5e, 0x7,0x32,0x45, 0x7,0x32,0x4b, 0x7,0x32,0x41, + 0x5,0x57,0x64, 0x5,0x57,0x60, 0x7,0x28,0x25, 0x7,0x27,0x7b, + 0x7,0x32,0x52, 0x5,0x5d,0x7a, 0x4,0x53,0x26, 0x7,0x32,0x2e, + 0x4,0x53,0x29, 0x7,0x32,0x36, 0x5,0x57,0x53, 0x4,0x53,0x28, + 0x4,0x52,0x74, 0x5,0x50,0x38, 0x7,0x32,0x2f, 0x5,0x57,0x52, + 0x7,0x32,0x38, 0x5,0x57,0x56, 0x5,0x57,0x4c, 0x7,0x32,0x2d, + 0x7,0x32,0x57, 0x7,0x32,0x4e, 0x4,0x53,0x2e, 0x5,0x57,0x5c, + 0x7,0x32,0x2a, 0x4,0x52,0x78, 0x7,0x32,0x39, 0x7,0x42,0x2f, + 0x7,0x32,0x2b, 0x7,0x32,0x55, 0x4,0x53,0x32, 0x7,0x32,0x42, + 0x7,0x32,0x35, 0x7,0x32,0x3f, 0xf,0x57,0x3e, 0xf,0x57,0x3f, + 0xf,0x57,0x40, 0xf,0x57,0x41, 0x5,0x57,0x4a, 0x5,0x57,0x50, + 0x5,0x57,0x57, 0x7,0x32,0x2c, 0x7,0x32,0x34, 0x7,0x32,0x37, + 0x7,0x32,0x3e, 0x7,0x32,0x40, 0x7,0x32,0x47, 0x7,0x32,0x49, + 0x7,0x32,0x4d, 0x7,0x32,0x4f, 0x7,0x32,0x54, 0x7,0x32,0x59, + 0x7,0x32,0x5a, 0xf,0x57,0x37, 0xf,0x57,0x38, 0xf,0x57,0x39, + 0xf,0x57,0x3a, 0xf,0x57,0x3b, 0xf,0x57,0x3c, 0xf,0x57,0x3d, + 0xf,0x57,0x42, 0xf,0x57,0x43, 0xf,0x57,0x44, 0xf,0x57,0x49, + 0xf,0x57,0x4c, 0xf,0x57,0x4d, 0xf,0x57,0x4e, 0xf,0x57,0x4f, + 0xf,0x57,0x50, 0xf,0x57,0x51, 0xf,0x57,0x52, 0xf,0x57,0x53, + 0xf,0x57,0x54, 0xf,0x57,0x56, 0xf,0x57,0x57, 0xf,0x57,0x58, + 0xf,0x57,0x59, 0xf,0x57,0x5a, 0xf,0x57,0x5b, 0xf,0x57,0x5c, + 0x7,0x32,0x31, 0xf,0x57,0x45, 0x4,0x52,0x7d, 0x7,0x32,0x3a, + 0x7,0x32,0x58, 0x7,0x32,0x50, 0x5,0x57,0x65, 0x5,0x57,0x4e, + 0x7,0x32,0x30, 0x7,0x32,0x29, 0x7,0x32,0x48, 0xf,0x57,0x4a, + 0x7,0x32,0x56, 0x5,0x57,0x63, 0x5,0x57,0x59, 0x7,0x32,0x46, + 0x7,0x3a,0x76, 0x4,0x58,0x3a, 0x4,0x58,0x3f, 0x7,0x3a,0x6e, + 0x7,0x42,0x3b, 0x7,0x3a,0x78, 0x4,0x58,0x48, 0x4,0x58,0x49, + 0x5,0x57,0x66, 0x5,0x5d,0x75, 0x5,0x5d,0x7d, 0x5,0x5d,0x73, + 0x7,0x3b,0x2b, 0x7,0x3b,0x2f, 0x5,0x5d,0x6f, 0x4,0x58,0x4a, + 0x4,0x58,0x37, 0x7,0x3a,0x7b, 0x4,0x58,0x45, 0x5,0x5e,0x21, + 0x7,0x3a,0x7c, 0x7,0x3b,0x23, 0x7,0x3b,0x33, 0x5,0x5d,0x7e, + 0x5,0x5e,0x25, 0x7,0x3b,0x31, 0x5,0x5e,0x22, 0x5,0x5d,0x6e, + 0x5,0x5d,0x78, 0x7,0x3a,0x7e, 0x5,0x5d,0x7c, 0x7,0x3a,0x73, + 0x7,0x3b,0x24, 0x7,0x3b,0x2a, 0x5,0x5d,0x7b, 0x4,0x58,0x4b, + 0x5,0x5d,0x6d, 0x5,0x5e,0x23, 0x4,0x58,0x41, 0x7,0x3b,0x30, + 0x5,0x5d,0x77, 0x4,0x58,0x46, 0x5,0x5d,0x71, 0x5,0x5e,0x24, + 0x7,0x3b,0x25, 0x5,0x5d,0x76, 0x7,0x3a,0x70, 0x7,0x3a,0x75, + 0x7,0x42,0x39, 0x7,0x3a,0x6b, 0x7,0x3a,0x6c, 0x7,0x3b,0x35, + 0x7,0x3a,0x7d, 0x4,0x58,0x47, 0x7,0x3b,0x2e, 0x7,0x3a,0x72, + 0x7,0x3a,0x77, 0x7,0x49,0x34, 0x7,0x3a,0x71, 0x7,0x3b,0x22, + 0x7,0x3b,0x29, 0x7,0x32,0x4a, 0x7,0x3a,0x79, 0x7,0x3b,0x21, + 0x7,0x3b,0x37, 0x5,0x5d,0x74, 0x5,0x50,0x4d, 0x4,0x58,0x43, + 0x7,0x49,0x35, 0x5,0x5d,0x70, 0x5,0x5d,0x72, 0x7,0x3a,0x6d, + 0x7,0x3b,0x27, 0x7,0x3b,0x28, 0x7,0x3b,0x2c, 0x7,0x3b,0x34, + 0xf,0x5c,0x3a, 0xf,0x5c,0x3b, 0xf,0x5c,0x3c, 0xf,0x5c,0x3d, + 0xf,0x5c,0x3e, 0xf,0x5c,0x40, 0xf,0x5c,0x41, 0xf,0x5c,0x42, + 0xf,0x5c,0x43, 0xf,0x5c,0x44, 0xf,0x5c,0x45, 0xf,0x5c,0x46, + 0xf,0x5c,0x47, 0xf,0x5c,0x49, 0xf,0x5c,0x4a, 0xf,0x5c,0x4b, + 0xf,0x5c,0x4c, 0xf,0x5c,0x4f, 0xf,0x5c,0x50, 0x4,0x58,0x39, + 0x7,0x3a,0x7a, 0x7,0x3b,0x2d, 0x7,0x3b,0x36, 0x7,0x3a,0x74, + 0xf,0x5c,0x48, 0xf,0x5c,0x3f, 0xf,0x5c,0x4e, 0xf,0x57,0x55, + 0xf,0x63,0x5b, 0x5,0x64,0x2c, 0x7,0x42,0x4b, 0x4,0x5d,0x24, + 0x7,0x42,0x4c, 0x5,0x64,0x22, 0x4,0x5d,0x25, 0x5,0x5e,0x26, + 0x5,0x64,0x2f, 0x7,0x42,0x48, 0x5,0x64,0x25, 0x5,0x63,0x7e, + 0x7,0x42,0x30, 0x5,0x64,0x21, 0x5,0x64,0x29, 0x5,0x64,0x36, + 0x5,0x64,0x39, 0x7,0x42,0x36, 0x5,0x64,0x33, 0x7,0x42,0x46, + 0x4,0x5d,0x22, 0x5,0x5e,0x27, 0x5,0x64,0x38, 0x5,0x64,0x26, + 0x5,0x64,0x30, 0x7,0x42,0x3d, 0x5,0x64,0x24, 0x5,0x64,0x2e, + 0x7,0x42,0x4d, 0x4,0x5d,0x30, 0x5,0x64,0x31, 0x4,0x5d,0x2e, + 0x4,0x5d,0x26, 0x4,0x5d,0x2a, 0x5,0x64,0x34, 0x5,0x64,0x32, + 0x7,0x42,0x3e, 0x7,0x4f,0x46, 0x7,0x42,0x3a, 0x7,0x42,0x37, + 0x4,0x5d,0x2f, 0x7,0x49,0x44, 0x5,0x64,0x2b, 0x7,0x42,0x33, + 0x7,0x42,0x45, 0x7,0x42,0x49, 0x4,0x5d,0x2d, 0x7,0x3b,0x26, + 0x7,0x42,0x32, 0x7,0x42,0x34, 0x7,0x42,0x35, 0x7,0x42,0x3f, + 0x7,0x42,0x42, 0x7,0x42,0x44, 0x7,0x42,0x4a, 0x7,0x42,0x4e, + 0x7,0x42,0x4f, 0xf,0x60,0x48, 0xf,0x60,0x49, 0xf,0x60,0x4a, + 0xf,0x60,0x4b, 0xf,0x60,0x4c, 0xf,0x60,0x4f, 0xf,0x60,0x50, + 0xf,0x60,0x51, 0xf,0x60,0x52, 0xf,0x60,0x53, 0xf,0x60,0x54, + 0xf,0x60,0x55, 0xf,0x60,0x56, 0xf,0x60,0x57, 0xf,0x60,0x58, + 0xf,0x60,0x59, 0xf,0x60,0x5a, 0xf,0x60,0x5b, 0xf,0x60,0x5c, + 0xf,0x60,0x5e, 0xf,0x60,0x5f, 0x4,0x5d,0x27, 0x7,0x42,0x40, + 0x5,0x64,0x27, 0x7,0x42,0x41, 0x7,0x49,0x33, 0x5,0x64,0x35, + 0x5,0x64,0x2a, 0x4,0x5d,0x29, 0x7,0x42,0x47, 0x5,0x64,0x23, + 0x5,0x64,0x28, 0x5,0x64,0x37, 0x7,0x42,0x43, 0x7,0x42,0x31, + 0x5,0x69,0x3e, 0x5,0x69,0x2f, 0x7,0x4f,0x5d, 0x5,0x69,0x30, + 0x5,0x69,0x3a, 0x5,0x69,0x36, 0x4,0x60,0x7d, 0x4,0x60,0x79, + 0x5,0x69,0x3f, 0x5,0x69,0x37, 0x7,0x49,0x38, 0x7,0x49,0x45, + 0x5,0x69,0x3b, 0x5,0x69,0x35, 0x4,0x60,0x7c, 0x5,0x69,0x2e, + 0x5,0x6d,0x42, 0x7,0x49,0x43, 0x5,0x69,0x38, 0x7,0x49,0x46, + 0x5,0x69,0x39, 0x7,0x49,0x41, 0x7,0x49,0x54, 0x7,0x49,0x51, + 0x7,0x49,0x3c, 0x5,0x69,0x33, 0x5,0x69,0x3d, 0x7,0x49,0x4b, + 0x7,0x49,0x4e, 0x7,0x49,0x3e, 0x7,0x49,0x3d, 0x7,0x49,0x42, + 0x7,0x49,0x47, 0x7,0x4f,0x54, 0x7,0x49,0x4d, 0x7,0x49,0x39, + 0x7,0x49,0x4c, 0x7,0x49,0x4a, 0x7,0x4f,0x47, 0x5,0x69,0x34, + 0x5,0x69,0x32, 0x4,0x60,0x76, 0x5,0x69,0x3c, 0x7,0x49,0x49, + 0x7,0x49,0x40, 0x7,0x49,0x3f, 0x7,0x49,0x36, 0x7,0x49,0x37, + 0x7,0x49,0x3a, 0x7,0x49,0x48, 0x7,0x49,0x50, 0x7,0x49,0x52, + 0xf,0x63,0x51, 0xf,0x63,0x52, 0xf,0x63,0x54, 0xf,0x63,0x55, + 0xf,0x63,0x56, 0xf,0x63,0x57, 0xf,0x63,0x58, 0xf,0x63,0x59, + 0xf,0x63,0x5a, 0xf,0x63,0x5c, 0xf,0x63,0x5d, 0xf,0x63,0x5e, + 0xf,0x63,0x5f, 0xf,0x63,0x60, 0xf,0x63,0x61, 0xf,0x63,0x62, + 0xf,0x63,0x63, 0xf,0x63,0x64, 0xf,0x63,0x65, 0xf,0x63,0x66, + 0xf,0x63,0x67, 0xf,0x63,0x68, 0xf,0x63,0x69, 0x7,0x49,0x4f, + 0x7,0x4f,0x5e, 0x7,0x4f,0x55, 0x7,0x4f,0x4e, 0x5,0x6d,0x40, + 0x5,0x6d,0x47, 0x7,0x4f,0x61, 0x5,0x6d,0x41, 0x5,0x6d,0x44, + 0x4,0x64,0x39, 0x7,0x4f,0x58, 0x5,0x6d,0x46, 0x4,0x64,0x35, + 0x5,0x6d,0x3f, 0x5,0x70,0x7e, 0x7,0x4f,0x5f, 0x5,0x6d,0x3b, + 0x7,0x4f,0x51, 0x7,0x4f,0x50, 0x7,0x4f,0x4c, 0x5,0x6d,0x3e, + 0x5,0x6d,0x45, 0x7,0x4f,0x4d, 0x4,0x64,0x31, 0x7,0x4f,0x67, + 0x5,0x6d,0x3c, 0x7,0x4f,0x4b, 0x7,0x4f,0x53, 0x7,0x4f,0x62, + 0x7,0x4f,0x5b, 0x7,0x49,0x3b, 0x7,0x4f,0x65, 0x5,0x6d,0x43, + 0x4,0x64,0x2e, 0x7,0x4f,0x59, 0x5,0x6d,0x3d, 0x7,0x4f,0x66, + 0x7,0x4f,0x5a, 0x5,0x69,0x31, 0x7,0x54,0x67, 0x7,0x58,0x69, + 0x7,0x4f,0x49, 0x5,0x6d,0x3a, 0x5,0x6d,0x48, 0x7,0x4f,0x52, + 0x7,0x4f,0x56, 0x7,0x4f,0x57, 0x7,0x4f,0x5c, 0x7,0x4f,0x63, + 0x7,0x4f,0x64, 0xf,0x65,0x79, 0xf,0x65,0x7a, 0xf,0x65,0x7b, + 0xf,0x65,0x7c, 0xf,0x65,0x7d, 0xf,0x65,0x7e, 0xf,0x66,0x21, + 0xf,0x66,0x22, 0xf,0x66,0x23, 0xf,0x66,0x24, 0xf,0x66,0x25, + 0xf,0x66,0x26, 0xf,0x66,0x27, 0xf,0x66,0x28, 0xf,0x66,0x29, + 0xf,0x66,0x2a, 0xf,0x66,0x2b, 0xf,0x66,0x2c, 0x7,0x4f,0x4a, + 0x7,0x4f,0x48, 0x7,0x4f,0x60, 0x7,0x54,0x63, 0x4,0x69,0x35, + 0x5,0x71,0x28, 0x7,0x54,0x66, 0x7,0x54,0x5f, 0x5,0x71,0x24, + 0x4,0x67,0x2c, 0x4,0x67,0x2a, 0x7,0x54,0x59, 0x4,0x67,0x2e, + 0x5,0x71,0x22, 0x7,0x54,0x64, 0x5,0x71,0x25, 0x7,0x54,0x65, + 0x4,0x67,0x29, 0x5,0x6d,0x49, 0x5,0x71,0x27, 0x7,0x54,0x5b, + 0x7,0x54,0x53, 0x5,0x71,0x26, 0x7,0x54,0x62, 0x7,0x54,0x57, + 0x7,0x54,0x55, 0x7,0x54,0x60, 0x4,0x67,0x2d, 0x5,0x71,0x23, + 0x5,0x71,0x29, 0x5,0x71,0x2a, 0x7,0x54,0x54, 0x7,0x54,0x5c, + 0x7,0x4f,0x4f, 0x7,0x54,0x5a, 0x7,0x58,0x76, 0x5,0x71,0x21, + 0x7,0x54,0x56, 0x7,0x54,0x5d, 0x7,0x54,0x61, 0xf,0x68,0x38, + 0xf,0x68,0x3a, 0xf,0x68,0x3b, 0xf,0x68,0x3c, 0xf,0x68,0x3d, + 0xf,0x68,0x3e, 0xf,0x68,0x3f, 0xf,0x68,0x41, 0xf,0x68,0x42, + 0xf,0x68,0x43, 0xf,0x68,0x44, 0xf,0x68,0x40, 0x7,0x54,0x58, + 0x5,0x74,0x24, 0x4,0x69,0x36, 0x5,0x74,0x25, 0x5,0x74,0x27, + 0x5,0x74,0x28, 0x7,0x58,0x70, 0x5,0x74,0x29, 0x4,0x69,0x3b, + 0x4,0x69,0x3a, 0x7,0x58,0x77, 0x7,0x58,0x75, 0x7,0x58,0x6d, + 0x7,0x5c,0x53, 0x5,0x74,0x23, 0x5,0x74,0x26, 0x7,0x58,0x6f, + 0x4,0x69,0x38, 0x4,0x69,0x39, 0x7,0x58,0x6e, 0x4,0x69,0x34, + 0x7,0x58,0x73, 0x7,0x58,0x6b, 0x7,0x58,0x78, 0x7,0x58,0x6a, + 0x7,0x58,0x6c, 0x7,0x58,0x71, 0x7,0x58,0x74, 0xf,0x69,0x68, + 0xf,0x69,0x6b, 0xf,0x69,0x6c, 0x7,0x5c,0x4f, 0x7,0x5c,0x5a, + 0x4,0x6a,0x75, 0x5,0x76,0x40, 0x4,0x6a,0x74, 0x5,0x76,0x3f, + 0x4,0x6a,0x71, 0x4,0x6a,0x73, 0x4,0x6a,0x72, 0x4,0x6a,0x70, + 0x5,0x76,0x43, 0x7,0x5c,0x51, 0x7,0x5c,0x5b, 0x5,0x76,0x42, + 0x5,0x79,0x40, 0x7,0x5c,0x55, 0x5,0x76,0x44, 0x7,0x5c,0x57, + 0x7,0x5c,0x58, 0x7,0x5c,0x4d, 0x7,0x5c,0x50, 0x5,0x76,0x41, + 0x7,0x5c,0x56, 0x7,0x5c,0x54, 0x7,0x5c,0x52, 0x7,0x5c,0x59, + 0xf,0x6a,0x6d, 0xf,0x6a,0x6e, 0xf,0x6a,0x6f, 0x7,0x5c,0x4e, + 0xf,0x69,0x6a, 0x5,0x78,0x23, 0x5,0x78,0x22, 0x5,0x78,0x21, + 0x7,0x5f,0x40, 0x5,0x78,0x24, 0x7,0x5f,0x42, 0x7,0x5f,0x46, + 0x7,0x5f,0x43, 0x7,0x5f,0x44, 0x7,0x5f,0x49, 0x7,0x5f,0x41, + 0x7,0x5f,0x47, 0x5,0x79,0x42, 0xf,0x6b,0x60, 0xf,0x6b,0x61, + 0xf,0x6b,0x63, 0x7,0x5f,0x45, 0x7,0x5f,0x48, 0x5,0x79,0x43, + 0x7,0x62,0x55, 0x5,0x79,0x41, 0x7,0x62,0x53, 0x7,0x61,0x3e, + 0x7,0x61,0x3d, 0x7,0x61,0x3c, 0xf,0x6c,0x38, 0xf,0x6c,0x39, + 0x7,0x61,0x3f, 0x5,0x7a,0x35, 0x5,0x7a,0x36, 0x7,0x62,0x59, + 0x7,0x62,0x57, 0x7,0x62,0x56, 0x7,0x62,0x58, 0x7,0x62,0x54, + 0xf,0x6c,0x51, 0x7,0x62,0x48, 0x4,0x6d,0x7a, 0x7,0x63,0x68, + 0x5,0x7a,0x72, 0x4,0x6d,0x5f, 0x4,0x6d,0x7c, 0xf,0x6c,0x6b, + 0xf,0x6c,0x6d, 0x5,0x7b,0x46, 0x4,0x6e,0x35, 0x7,0x64,0x58, + 0x7,0x64,0x59, 0x5,0x7c,0x49, 0x7,0x65,0x40, 0x5,0x7b,0x66, + 0x7,0x65,0x60, 0x7,0x65,0x76, 0x5,0x7c,0x4f, 0x5,0x7c,0x3d, + 0x7,0x65,0x5f, 0xf,0x28,0x65, 0x4,0x2b,0x3f, 0x6,0x34,0x49, + 0x6,0x34,0x48, 0xf,0x32,0x4e, 0x5,0x35,0x36, 0x5,0x35,0x34, + 0x4,0x34,0x77, 0x4,0x34,0x76, 0x6,0x44,0x41, 0x4,0x34,0x78, + 0x6,0x44,0x42, 0x6,0x44,0x40, 0x6,0x44,0x3f, 0x6,0x3b,0x63, + 0x6,0x4e,0x3c, 0x5,0x3b,0x71, 0x6,0x4e,0x3d, 0xf,0x3f,0x22, + 0xf,0x3f,0x23, 0xf,0x3f,0x24, 0x5,0x42,0x55, 0x5,0x42,0x51, + 0x5,0x42,0x52, 0x6,0x57,0x6b, 0x6,0x57,0x6a, 0x6,0x57,0x69, + 0x5,0x49,0x4f, 0x6,0x61,0x62, 0x6,0x61,0x66, 0x4,0x46,0x6f, + 0x6,0x61,0x65, 0x6,0x61,0x67, 0x6,0x61,0x63, 0x6,0x61,0x64, + 0x5,0x49,0x50, 0xf,0x4c,0x2b, 0xf,0x4c,0x2c, 0x4,0x46,0x6e, + 0x7,0x28,0x29, 0x7,0x28,0x27, 0x7,0x32,0x5f, 0x5,0x50,0x4e, + 0x7,0x28,0x26, 0x7,0x28,0x28, 0xf,0x51,0x79, 0x7,0x26,0x29, + 0x5,0x57,0x6a, 0x5,0x57,0x6b, 0x5,0x57,0x68, 0x5,0x57,0x69, + 0x4,0x53,0x35, 0x5,0x57,0x67, 0x7,0x32,0x60, 0x7,0x32,0x5c, + 0x7,0x32,0x5d, 0x4,0x53,0x38, 0x4,0x53,0x37, 0x5,0x57,0x6d, + 0x7,0x32,0x5e, 0xf,0x57,0x5d, 0xf,0x57,0x5e, 0xf,0x57,0x5f, + 0x5,0x57,0x6c, 0x7,0x32,0x5b, 0x4,0x58,0x4c, 0x7,0x3b,0x39, + 0xf,0x5c,0x51, 0xf,0x5c,0x52, 0xf,0x5c,0x53, 0x7,0x42,0x51, + 0x5,0x64,0x3d, 0x4,0x5d,0x33, 0x7,0x42,0x50, 0x4,0x5d,0x31, + 0x7,0x42,0x52, 0x5,0x64,0x3c, 0xf,0x60,0x60, 0x7,0x49,0x56, + 0x7,0x49,0x55, 0x4,0x60,0x7e, 0x7,0x49,0x57, 0x7,0x4f,0x69, + 0x5,0x6d,0x4a, 0x7,0x4f,0x6a, 0x7,0x4c,0x26, 0x5,0x71,0x2c, + 0x7,0x4f,0x68, 0x5,0x71,0x2b, 0x5,0x70,0x4d, 0x7,0x54,0x6a, + 0x7,0x54,0x69, 0x5,0x74,0x2a, 0x7,0x5c,0x24, 0x4,0x6e,0x38, + 0x5,0x24,0x75, 0x6,0x29,0x29, 0x4,0x28,0x22, 0x6,0x2e,0x25, + 0xf,0x28,0x66, 0xf,0x28,0x67, 0xf,0x28,0x69, 0xf,0x28,0x6a, + 0x4,0x2b,0x43, 0x6,0x34,0x4b, 0x4,0x2b,0x40, 0x4,0x2b,0x42, + 0x6,0x34,0x4a, 0x5,0x2b,0x40, 0x6,0x34,0x4d, 0x6,0x34,0x4c, + 0x6,0x34,0x4e, 0xf,0x2d,0x3d, 0xf,0x2d,0x3f, 0xf,0x2d,0x42, + 0xf,0x2d,0x43, 0xf,0x2d,0x44, 0xf,0x2d,0x41, 0x4,0x2b,0x41, + 0x5,0x30,0x30, 0x6,0x3b,0x68, 0x5,0x30,0x2c, 0x5,0x30,0x33, + 0x6,0x3b,0x67, 0x5,0x30,0x2d, 0x5,0x30,0x32, 0x6,0x3b,0x66, + 0x4,0x2f,0x6c, 0x4,0x2f,0x6a, 0x4,0x2f,0x6e, 0x5,0x30,0x2e, + 0x6,0x3b,0x70, 0x5,0x30,0x29, 0x6,0x3b,0x6b, 0x5,0x30,0x31, + 0x5,0x30,0x28, 0x6,0x3b,0x6a, 0x5,0x30,0x2f, 0x5,0x30,0x34, + 0x6,0x3b,0x6e, 0x6,0x3b,0x64, 0x5,0x30,0x2b, 0x6,0x3b,0x65, + 0xf,0x32,0x4f, 0x6,0x3b,0x6c, 0x6,0x3b,0x6d, 0x5,0x30,0x2a, + 0x6,0x3b,0x6f, 0x5,0x35,0x37, 0x4,0x34,0x7d, 0x6,0x44,0x45, + 0x5,0x35,0x38, 0x5,0x35,0x39, 0x5,0x35,0x3a, 0x5,0x35,0x40, + 0x4,0x35,0x22, 0xf,0x38,0x3d, 0x4,0x35,0x23, 0x6,0x44,0x4c, + 0x5,0x35,0x3c, 0x4,0x35,0x21, 0x5,0x35,0x3d, 0x6,0x44,0x46, + 0x5,0x35,0x41, 0x6,0x44,0x49, 0x4,0x35,0x24, 0x4,0x34,0x7e, + 0x6,0x44,0x47, 0x6,0x44,0x4a, 0x6,0x44,0x44, 0x6,0x44,0x4b, + 0x6,0x44,0x4d, 0xf,0x38,0x36, 0xf,0x38,0x37, 0xf,0x38,0x38, + 0xf,0x38,0x39, 0xf,0x38,0x3b, 0xf,0x38,0x3c, 0xf,0x38,0x3e, + 0xf,0x38,0x3f, 0xf,0x38,0x40, 0x5,0x35,0x3e, 0x6,0x44,0x4e, + 0x4,0x35,0x25, 0x6,0x44,0x43, 0x5,0x35,0x3f, 0x5,0x35,0x3b, + 0x5,0x3b,0x73, 0x6,0x4e,0x40, 0xf,0x3f,0x28, 0x4,0x3a,0x73, + 0x6,0x4e,0x48, 0x5,0x3c,0x28, 0x5,0x3b,0x78, 0x5,0x3b,0x75, + 0x5,0x3b,0x77, 0x5,0x3b,0x7a, 0x5,0x3c,0x23, 0x5,0x3b,0x7d, + 0x6,0x4e,0x49, 0x6,0x4e,0x3e, 0x6,0x4e,0x43, 0x5,0x3b,0x76, + 0x5,0x3c,0x27, 0x6,0x4e,0x42, 0x6,0x4e,0x4b, 0x6,0x4e,0x4a, + 0x5,0x3b,0x7c, 0x6,0x4e,0x3f, 0x5,0x3b,0x79, 0x5,0x3c,0x21, + 0x6,0x4e,0x4d, 0x6,0x4e,0x44, 0x6,0x4e,0x45, 0x6,0x57,0x6e, + 0x5,0x3c,0x25, 0x5,0x3b,0x7e, 0x6,0x57,0x78, 0x5,0x3c,0x24, + 0x6,0x4e,0x4c, 0x6,0x4e,0x47, 0x5,0x3c,0x22, 0x5,0x3b,0x72, + 0x6,0x4e,0x41, 0xf,0x3f,0x25, 0xf,0x3f,0x26, 0xf,0x3f,0x27, + 0xf,0x3f,0x29, 0x4,0x3a,0x77, 0x6,0x57,0x70, 0x6,0x57,0x6f, + 0x4,0x40,0x5a, 0x4,0x40,0x5c, 0x6,0x57,0x74, 0x4,0x40,0x54, + 0x5,0x42,0x58, 0x5,0x42,0x5b, 0x5,0x42,0x56, 0x4,0x40,0x51, + 0x4,0x40,0x53, 0x5,0x42,0x5c, 0x5,0x42,0x5e, 0x5,0x42,0x5a, + 0x5,0x42,0x57, 0x4,0x40,0x5e, 0x4,0x40,0x50, 0x6,0x57,0x72, + 0x6,0x57,0x73, 0x6,0x57,0x6c, 0x6,0x57,0x6d, 0x6,0x61,0x68, + 0x6,0x57,0x71, 0x6,0x57,0x75, 0x5,0x42,0x59, 0xf,0x45,0x32, + 0xf,0x45,0x33, 0xf,0x45,0x34, 0xf,0x45,0x35, 0xf,0x45,0x36, + 0xf,0x45,0x37, 0xf,0x45,0x38, 0xf,0x45,0x39, 0x6,0x57,0x76, + 0x7,0x49,0x6b, 0x6,0x57,0x77, 0x6,0x57,0x79, 0x5,0x49,0x51, + 0x5,0x49,0x56, 0x5,0x49,0x5b, 0x5,0x49,0x57, 0x5,0x49,0x5c, + 0x4,0x47,0x21, 0x5,0x49,0x55, 0x4,0x46,0x7d, 0x6,0x62,0x23, + 0x5,0x49,0x5f, 0x4,0x46,0x77, 0x5,0x49,0x59, 0x4,0x46,0x74, + 0x6,0x61,0x76, 0x6,0x61,0x6a, 0x6,0x61,0x75, 0x4,0x47,0x22, + 0x5,0x49,0x5e, 0x6,0x61,0x6b, 0x6,0x61,0x71, 0x5,0x49,0x54, + 0x6,0x61,0x7c, 0x5,0x49,0x5d, 0x5,0x49,0x58, 0x6,0x61,0x7b, + 0x6,0x62,0x21, 0x5,0x49,0x60, 0x6,0x61,0x74, 0x6,0x61,0x7d, + 0x6,0x61,0x6d, 0x5,0x49,0x61, 0x5,0x49,0x62, 0x6,0x61,0x72, + 0x6,0x62,0x22, 0x5,0x49,0x5a, 0x6,0x61,0x6c, 0x6,0x61,0x79, + 0x6,0x61,0x7a, 0x6,0x61,0x70, 0x5,0x49,0x52, 0x6,0x61,0x6e, + 0x5,0x49,0x53, 0x6,0x61,0x73, 0xf,0x4c,0x2d, 0xf,0x4c,0x2e, + 0xf,0x4c,0x30, 0xf,0x4c,0x31, 0xf,0x4c,0x32, 0x6,0x61,0x78, + 0x4,0x40,0x58, 0x6,0x61,0x7e, 0x6,0x61,0x6f, 0x4,0x4d,0x2d, + 0x7,0x28,0x43, 0x5,0x50,0x53, 0x4,0x4d,0x2e, 0x4,0x4d,0x2b, + 0x7,0x28,0x38, 0x4,0x4d,0x34, 0x5,0x50,0x5f, 0x7,0x28,0x37, + 0x7,0x28,0x2c, 0x5,0x50,0x51, 0x7,0x28,0x2b, 0x7,0x28,0x35, + 0x7,0x28,0x3f, 0x5,0x50,0x57, 0x4,0x4d,0x32, 0x4,0x4d,0x2a, + 0x7,0x28,0x40, 0x7,0x28,0x34, 0x5,0x50,0x56, 0x7,0x28,0x3b, + 0x7,0x28,0x31, 0x7,0x28,0x3e, 0x5,0x57,0x6e, 0x4,0x4d,0x2c, + 0x4,0x4d,0x29, 0x5,0x50,0x5c, 0x5,0x50,0x5a, 0x5,0x50,0x50, + 0x5,0x50,0x59, 0x5,0x50,0x58, 0x7,0x28,0x2a, 0x5,0x50,0x5b, + 0x4,0x46,0x7a, 0x5,0x50,0x52, 0x5,0x50,0x5e, 0x5,0x50,0x5d, + 0x4,0x4d,0x35, 0x7,0x28,0x46, 0x7,0x28,0x30, 0x7,0x28,0x2d, + 0x7,0x28,0x44, 0x7,0x28,0x39, 0x7,0x28,0x45, 0x7,0x28,0x3c, + 0x7,0x28,0x2f, 0x6,0x61,0x77, 0x7,0x28,0x36, 0x7,0x28,0x3d, + 0x5,0x50,0x54, 0x4,0x4d,0x27, 0x5,0x50,0x4f, 0xf,0x51,0x7a, + 0xf,0x51,0x7b, 0xf,0x51,0x7e, 0xf,0x52,0x21, 0xf,0x52,0x22, + 0xf,0x52,0x23, 0xf,0x52,0x25, 0xf,0x52,0x28, 0xf,0x52,0x29, + 0xf,0x52,0x2a, 0xf,0x52,0x2b, 0x7,0x28,0x33, 0x7,0x28,0x41, + 0x7,0x28,0x3a, 0xf,0x52,0x27, 0x7,0x28,0x32, 0xf,0x4c,0x2f, + 0x5,0x57,0x70, 0x4,0x53,0x45, 0x5,0x57,0x76, 0x5,0x57,0x75, + 0x4,0x53,0x3a, 0x5,0x57,0x74, 0x5,0x57,0x71, 0x7,0x32,0x6e, + 0x7,0x32,0x7d, 0x5,0x57,0x77, 0x4,0x53,0x48, 0x5,0x57,0x7b, + 0x4,0x53,0x49, 0x4,0x53,0x40, 0x4,0x53,0x42, 0x5,0x57,0x7c, + 0x7,0x32,0x6d, 0x4,0x53,0x3b, 0x7,0x32,0x67, 0x4,0x53,0x3f, + 0x7,0x32,0x7c, 0x5,0x57,0x79, 0x5,0x57,0x6f, 0x5,0x58,0x21, + 0x5,0x57,0x72, 0x7,0x3b,0x3a, 0x5,0x57,0x78, 0x7,0x32,0x69, + 0x4,0x53,0x46, 0x5,0x57,0x7a, 0x7,0x32,0x70, 0x7,0x33,0x22, + 0x5,0x57,0x73, 0x7,0x32,0x64, 0x5,0x57,0x7e, 0x7,0x32,0x74, + 0x4,0x53,0x47, 0x5,0x50,0x60, 0x7,0x32,0x6b, 0x7,0x32,0x65, + 0x5,0x57,0x7d, 0x7,0x32,0x76, 0x4,0x53,0x43, 0x7,0x32,0x7b, + 0x7,0x33,0x24, 0x7,0x32,0x62, 0x7,0x32,0x77, 0x7,0x32,0x63, + 0x7,0x32,0x78, 0x7,0x32,0x6f, 0x7,0x32,0x7e, 0x7,0x32,0x72, + 0x7,0x32,0x68, 0x7,0x33,0x23, 0xf,0x57,0x60, 0xf,0x57,0x61, + 0xf,0x57,0x63, 0xf,0x57,0x64, 0xf,0x57,0x65, 0xf,0x57,0x66, + 0x7,0x32,0x79, 0x7,0x32,0x6a, 0x7,0x32,0x7a, 0x7,0x32,0x71, + 0x7,0x32,0x66, 0x7,0x32,0x6c, 0x4,0x58,0x59, 0x5,0x5e,0x29, + 0x5,0x5e,0x2c, 0x4,0x58,0x55, 0x7,0x3b,0x52, 0x7,0x3b,0x44, + 0x4,0x58,0x60, 0x4,0x58,0x5c, 0x7,0x3b,0x48, 0x7,0x3b,0x42, + 0x7,0x3b,0x55, 0x4,0x58,0x5e, 0x7,0x3b,0x46, 0x7,0x28,0x47, + 0x4,0x58,0x50, 0x5,0x5e,0x31, 0x7,0x3b,0x50, 0x7,0x3b,0x3f, + 0x4,0x58,0x5d, 0x7,0x3b,0x4f, 0x5,0x5e,0x2b, 0x5,0x5e,0x2f, + 0x7,0x3b,0x53, 0x4,0x58,0x5a, 0x7,0x3b,0x47, 0x7,0x3b,0x41, + 0x5,0x5e,0x33, 0x4,0x58,0x53, 0x7,0x3b,0x40, 0x4,0x58,0x51, + 0x7,0x3b,0x3e, 0x7,0x3b,0x54, 0x5,0x5e,0x2a, 0x7,0x3b,0x3c, + 0x7,0x3b,0x3b, 0x7,0x3b,0x49, 0x4,0x58,0x5b, 0x5,0x5e,0x2d, + 0x5,0x5e,0x2e, 0x7,0x3b,0x45, 0xf,0x5c,0x54, 0xf,0x5c,0x55, + 0xf,0x5c,0x56, 0xf,0x5c,0x57, 0xf,0x5c,0x58, 0xf,0x5c,0x59, + 0xf,0x5c,0x5a, 0xf,0x5c,0x5c, 0x7,0x3b,0x43, 0x7,0x3b,0x4b, + 0x7,0x3b,0x4e, 0x7,0x3b,0x51, 0x7,0x3b,0x3d, 0x5,0x5e,0x28, + 0x7,0x3b,0x4a, 0x7,0x3b,0x4c, 0x5,0x5e,0x30, 0x4,0x5d,0x3d, + 0x4,0x5d,0x37, 0x7,0x42,0x55, 0x7,0x42,0x61, 0x7,0x42,0x58, + 0x7,0x42,0x68, 0x5,0x64,0x43, 0x5,0x64,0x44, 0x5,0x5e,0x34, + 0x4,0x5d,0x38, 0x5,0x64,0x50, 0x7,0x42,0x59, 0x4,0x5d,0x36, + 0x5,0x64,0x45, 0x4,0x5d,0x35, 0x4,0x5d,0x3a, 0x5,0x64,0x3f, + 0x5,0x64,0x42, 0x5,0x64,0x4d, 0x4,0x5d,0x34, 0x5,0x64,0x4a, + 0x7,0x42,0x56, 0x5,0x64,0x3e, 0x5,0x64,0x41, 0x5,0x64,0x4b, + 0x7,0x42,0x57, 0x7,0x42,0x5c, 0x7,0x42,0x5b, 0x5,0x64,0x40, + 0x7,0x42,0x6f, 0x7,0x42,0x6b, 0x5,0x64,0x4f, 0x7,0x42,0x6e, + 0x5,0x64,0x49, 0x5,0x64,0x4c, 0x7,0x42,0x69, 0x5,0x64,0x46, + 0x7,0x42,0x6c, 0x5,0x64,0x47, 0x7,0x42,0x65, 0x7,0x42,0x62, + 0x7,0x42,0x5d, 0x7,0x42,0x63, 0x7,0x42,0x54, 0x7,0x42,0x5a, + 0x7,0x42,0x53, 0x7,0x42,0x5e, 0x7,0x42,0x6a, 0x7,0x42,0x66, + 0xf,0x60,0x62, 0xf,0x60,0x64, 0xf,0x60,0x65, 0xf,0x60,0x66, + 0xf,0x60,0x68, 0xf,0x60,0x69, 0xf,0x60,0x6a, 0x7,0x42,0x64, + 0x4,0x5d,0x3c, 0x7,0x42,0x67, 0xf,0x60,0x67, 0xf,0x60,0x61, + 0x5,0x64,0x4e, 0x4,0x61,0x28, 0x7,0x49,0x6a, 0x7,0x49,0x59, + 0x7,0x49,0x60, 0x7,0x49,0x6c, 0x7,0x49,0x5a, 0x7,0x49,0x69, + 0x7,0x49,0x6d, 0x4,0x61,0x23, 0x5,0x69,0x42, 0x5,0x69,0x40, + 0x7,0x49,0x62, 0x7,0x49,0x67, 0x7,0x49,0x65, 0x5,0x69,0x44, + 0x7,0x49,0x5d, 0x7,0x49,0x68, 0x7,0x49,0x64, 0x7,0x49,0x66, + 0x7,0x4f,0x6b, 0x7,0x49,0x61, 0x7,0x49,0x6e, 0x7,0x49,0x6f, + 0x7,0x49,0x63, 0x5,0x69,0x45, 0x7,0x49,0x5c, 0x7,0x49,0x5f, + 0x7,0x49,0x58, 0xf,0x63,0x6b, 0xf,0x63,0x6c, 0xf,0x63,0x6d, + 0xf,0x63,0x6f, 0xf,0x63,0x70, 0xf,0x63,0x71, 0xf,0x63,0x72, + 0xf,0x63,0x73, 0xf,0x63,0x74, 0xf,0x63,0x75, 0x7,0x49,0x5b, + 0x4,0x61,0x22, 0x4,0x61,0x27, 0x7,0x49,0x5e, 0x7,0x42,0x70, + 0x7,0x4f,0x75, 0x7,0x4f,0x7a, 0x5,0x6d,0x4d, 0x7,0x4f,0x6c, + 0x4,0x64,0x42, 0x5,0x6d,0x4c, 0x5,0x6d,0x51, 0x7,0x4f,0x78, + 0x7,0x4f,0x70, 0x5,0x6d,0x50, 0x7,0x4f,0x74, 0x5,0x6d,0x52, + 0x5,0x6d,0x53, 0x7,0x4f,0x73, 0x5,0x6d,0x4e, 0x7,0x4f,0x72, + 0x7,0x4f,0x77, 0x7,0x4f,0x71, 0x7,0x4f,0x6d, 0x5,0x6d,0x4f, + 0x7,0x4f,0x6f, 0x7,0x54,0x77, 0x7,0x4f,0x6e, 0x7,0x4f,0x7b, + 0xf,0x66,0x2d, 0xf,0x66,0x2e, 0xf,0x66,0x2f, 0xf,0x66,0x30, + 0xf,0x66,0x31, 0x7,0x4f,0x76, 0x4,0x67,0x2f, 0x4,0x67,0x34, + 0x7,0x54,0x6b, 0x7,0x54,0x70, 0x5,0x71,0x2f, 0x7,0x54,0x75, + 0x7,0x54,0x6e, 0x7,0x54,0x71, 0x5,0x71,0x2e, 0x7,0x54,0x73, + 0x5,0x71,0x2d, 0x5,0x71,0x30, 0x7,0x54,0x6c, 0x4,0x67,0x33, + 0x7,0x54,0x6f, 0x4,0x67,0x35, 0x4,0x67,0x31, 0x7,0x54,0x72, + 0x5,0x71,0x32, 0x7,0x54,0x78, 0x7,0x4f,0x79, 0x7,0x54,0x74, + 0x4,0x67,0x32, 0x7,0x54,0x79, 0x5,0x71,0x31, 0x5,0x71,0x33, + 0x7,0x54,0x76, 0xf,0x68,0x45, 0xf,0x68,0x46, 0xf,0x68,0x47, + 0xf,0x68,0x48, 0xf,0x68,0x49, 0x7,0x54,0x6d, 0x5,0x74,0x2e, + 0x4,0x69,0x3c, 0x5,0x74,0x2c, 0x5,0x74,0x2b, 0x7,0x59,0x23, + 0x7,0x58,0x7c, 0x5,0x74,0x2d, 0x5,0x74,0x31, 0x5,0x74,0x30, + 0x7,0x58,0x7a, 0x5,0x74,0x33, 0x5,0x74,0x35, 0x5,0x74,0x32, + 0x7,0x58,0x79, 0x4,0x69,0x3d, 0x7,0x59,0x26, 0x7,0x59,0x28, + 0x7,0x59,0x27, 0x7,0x58,0x7e, 0x7,0x59,0x21, 0x5,0x74,0x34, + 0x5,0x74,0x36, 0x7,0x59,0x24, 0x7,0x59,0x29, 0x5,0x74,0x2f, + 0x7,0x58,0x7d, 0x7,0x58,0x7b, 0xf,0x69,0x6d, 0xf,0x69,0x6e, + 0x5,0x76,0x46, 0x4,0x6a,0x76, 0x4,0x6a,0x77, 0x7,0x5c,0x5d, + 0x5,0x76,0x47, 0x4,0x6a,0x79, 0x7,0x5c,0x5f, 0x7,0x5c,0x5c, + 0x5,0x76,0x48, 0x7,0x5c,0x62, 0x5,0x76,0x45, 0x7,0x5f,0x4a, + 0x7,0x5c,0x60, 0x4,0x6a,0x7a, 0x7,0x5c,0x61, 0x5,0x76,0x4a, + 0x7,0x59,0x22, 0x5,0x76,0x49, 0xf,0x6a,0x70, 0xf,0x6a,0x71, + 0xf,0x6a,0x72, 0x5,0x78,0x2c, 0x7,0x5f,0x4b, 0x4,0x6b,0x7e, + 0x5,0x78,0x2b, 0x5,0x78,0x29, 0x7,0x5f,0x4c, 0x5,0x78,0x26, + 0x4,0x6c,0x22, 0x7,0x5f,0x4d, 0x5,0x78,0x2a, 0x5,0x78,0x28, + 0x4,0x6c,0x24, 0x5,0x78,0x2d, 0x5,0x78,0x27, 0x5,0x79,0x44, + 0x4,0x6c,0x7e, 0x5,0x79,0x48, 0x5,0x79,0x4a, 0x4,0x6c,0x21, + 0x7,0x61,0x40, 0x5,0x79,0x46, 0x7,0x61,0x44, 0x7,0x61,0x43, + 0x7,0x61,0x45, 0x5,0x79,0x47, 0x5,0x79,0x49, 0x7,0x61,0x41, + 0x5,0x79,0x45, 0x7,0x62,0x5d, 0x7,0x62,0x5b, 0x7,0x62,0x5e, + 0x7,0x62,0x5c, 0x7,0x62,0x5f, 0x7,0x63,0x6e, 0x7,0x63,0x6c, + 0x5,0x7a,0x73, 0x7,0x63,0x6b, 0x7,0x63,0x6f, 0x7,0x62,0x5a, + 0x7,0x63,0x69, 0x7,0x63,0x71, 0x7,0x63,0x6a, 0x7,0x63,0x70, + 0x7,0x63,0x6d, 0x7,0x64,0x5c, 0x4,0x6e,0x3a, 0x7,0x64,0x5d, + 0x5,0x7b,0x47, 0x5,0x7b,0x48, 0x7,0x64,0x5a, 0x7,0x64,0x5b, + 0x5,0x7b,0x67, 0x7,0x65,0x41, 0x7,0x65,0x42, 0x5,0x7b,0x68, + 0x4,0x6e,0x50, 0x7,0x65,0x62, 0x7,0x65,0x61, 0xf,0x6d,0x31, + 0x7,0x66,0x2b, 0x5,0x27,0x65, 0x6,0x2e,0x27, 0x6,0x2e,0x26, + 0x4,0x2b,0x44, 0x6,0x3b,0x72, 0x5,0x30,0x35, 0x6,0x3b,0x75, + 0x6,0x3b,0x74, 0xf,0x38,0x41, 0x6,0x4e,0x4e, 0x6,0x4e,0x50, + 0x5,0x42,0x5f, 0x6,0x57,0x7c, 0x6,0x57,0x7a, 0x6,0x57,0x7d, + 0x6,0x57,0x7b, 0x5,0x49,0x65, 0x5,0x49,0x63, 0x5,0x49,0x64, + 0x6,0x62,0x26, 0x6,0x62,0x24, 0x7,0x28,0x48, 0x5,0x50,0x61, + 0x7,0x28,0x49, 0x7,0x28,0x4a, 0x6,0x62,0x25, 0x5,0x58,0x23, + 0x5,0x58,0x24, 0x5,0x58,0x22, 0x7,0x33,0x25, 0x7,0x33,0x26, + 0x5,0x5e,0x37, 0x5,0x5e,0x36, 0xf,0x5c,0x5d, 0x4,0x5d,0x3e, + 0x4,0x5d,0x3f, 0x7,0x42,0x71, 0x7,0x42,0x73, 0x4,0x5d,0x40, + 0x7,0x42,0x72, 0x5,0x69,0x46, 0x5,0x6d,0x54, 0x7,0x4f,0x7c, + 0x7,0x54,0x7a, 0x7,0x59,0x2b, 0x7,0x59,0x2a, 0x7,0x5f,0x4e, + 0x7,0x65,0x63, 0x4,0x28,0x23, 0x6,0x2e,0x28, 0x4,0x28,0x24, + 0x6,0x34,0x4f, 0x6,0x34,0x50, 0x5,0x2b,0x41, 0xf,0x2d,0x45, + 0x5,0x30,0x36, 0x6,0x3b,0x77, 0x6,0x3b,0x76, 0x5,0x30,0x37, + 0x6,0x44,0x4f, 0x5,0x3c,0x29, 0x6,0x4e,0x53, 0x6,0x4e,0x52, + 0xf,0x3f,0x2a, 0xf,0x3f,0x2b, 0x6,0x4e,0x51, 0x6,0x58,0x23, + 0x6,0x58,0x21, 0x4,0x40,0x5f, 0x6,0x58,0x22, 0x6,0x57,0x7e, + 0xf,0x45,0x3a, 0x4,0x47,0x24, 0x5,0x50,0x62, 0x6,0x62,0x27, + 0x6,0x62,0x28, 0x4,0x58,0x61, 0x7,0x3b,0x56, 0xf,0x5c,0x5e, + 0x4,0x5d,0x41, 0x7,0x42,0x74, 0x7,0x49,0x70, 0x7,0x54,0x7b, + 0x7,0x5c,0x64, 0x5,0x27,0x66, 0x6,0x2e,0x29, 0x6,0x2e,0x2a, + 0x6,0x2e,0x2b, 0x5,0x2b,0x43, 0x6,0x34,0x51, 0x4,0x2b,0x45, + 0x4,0x2b,0x47, 0x5,0x2b,0x45, 0x6,0x34,0x53, 0x5,0x2b,0x44, + 0xf,0x28,0x6b, 0x6,0x34,0x52, 0x5,0x2b,0x42, 0x5,0x2b,0x46, + 0x6,0x3b,0x7d, 0x5,0x30,0x3c, 0x4,0x2f,0x71, 0x6,0x3c,0x21, + 0x6,0x3c,0x25, 0x5,0x30,0x3f, 0x6,0x3c,0x26, 0x6,0x3c,0x27, + 0x4,0x2f,0x70, 0x6,0x3b,0x79, 0x5,0x30,0x40, 0x6,0x3b,0x7b, + 0x5,0x30,0x38, 0x6,0x3c,0x22, 0x6,0x3b,0x7c, 0x6,0x3c,0x23, + 0x6,0x3b,0x7e, 0x5,0x30,0x3b, 0x6,0x3b,0x7a, 0x6,0x3b,0x78, + 0x5,0x30,0x3a, 0xf,0x32,0x50, 0x6,0x3c,0x24, 0x6,0x3c,0x28, + 0x6,0x3c,0x29, 0xf,0x2d,0x48, 0xf,0x2d,0x49, 0xf,0x32,0x52, + 0x4,0x35,0x28, 0x5,0x3c,0x32, 0x4,0x35,0x2b, 0x4,0x3a,0x7c, + 0x5,0x35,0x46, 0x4,0x35,0x29, 0x6,0x44,0x58, 0x5,0x35,0x47, + 0x5,0x35,0x4a, 0x5,0x35,0x44, 0x5,0x35,0x45, 0x5,0x35,0x43, + 0x6,0x44,0x59, 0x6,0x44,0x5a, 0x5,0x35,0x42, 0x6,0x44,0x53, + 0x6,0x44,0x55, 0x6,0x44,0x54, 0x6,0x44,0x51, 0x6,0x44,0x50, + 0x6,0x44,0x57, 0x6,0x44,0x52, 0xf,0x2d,0x46, 0xf,0x38,0x45, + 0x5,0x35,0x48, 0x6,0x44,0x56, 0x5,0x35,0x49, 0x5,0x3c,0x31, + 0x6,0x4e,0x5b, 0x6,0x4e,0x59, 0x5,0x3c,0x2e, 0x6,0x4e,0x57, + 0x5,0x3c,0x2f, 0x5,0x3c,0x33, 0x4,0x3a,0x7e, 0x6,0x4e,0x58, + 0x6,0x4e,0x54, 0x4,0x3a,0x7d, 0x6,0x4e,0x56, 0x5,0x3c,0x30, + 0x5,0x3c,0x2d, 0x5,0x3c,0x2b, 0x5,0x42,0x64, 0x5,0x3c,0x2a, + 0xf,0x38,0x44, 0xf,0x3f,0x2e, 0x6,0x4e,0x55, 0x6,0x4e,0x5a, + 0x6,0x4e,0x5c, 0x5,0x3c,0x2c, 0xf,0x38,0x43, 0x5,0x42,0x6a, + 0x5,0x42,0x62, 0x5,0x42,0x66, 0x4,0x40,0x65, 0x5,0x42,0x6b, + 0x5,0x42,0x63, 0x5,0x42,0x67, 0x4,0x40,0x63, 0x5,0x42,0x65, + 0x5,0x42,0x69, 0x6,0x58,0x2f, 0x4,0x40,0x64, 0x6,0x58,0x2a, + 0x6,0x58,0x28, 0x6,0x58,0x30, 0x5,0x42,0x68, 0x5,0x42,0x60, + 0x6,0x58,0x24, 0x6,0x58,0x27, 0x6,0x58,0x2d, 0xf,0x3f,0x2c, + 0xf,0x3f,0x2d, 0xf,0x3f,0x2f, 0xf,0x3f,0x30, 0xf,0x45,0x3b, + 0x6,0x58,0x26, 0x6,0x58,0x31, 0x6,0x58,0x25, 0x6,0x58,0x29, + 0x5,0x42,0x61, 0xf,0x45,0x3e, 0x4,0x47,0x30, 0x4,0x47,0x2c, + 0x6,0x62,0x2d, 0x6,0x62,0x33, 0x4,0x47,0x29, 0x5,0x49,0x66, + 0x5,0x49,0x69, 0x4,0x47,0x28, 0x5,0x49,0x68, 0x5,0x3c,0x34, + 0x6,0x62,0x34, 0x5,0x49,0x6a, 0x6,0x62,0x2b, 0x6,0x62,0x29, + 0x6,0x62,0x2a, 0x6,0x62,0x32, 0x6,0x62,0x31, 0x5,0x49,0x67, + 0x6,0x62,0x2f, 0x5,0x49,0x6b, 0x6,0x62,0x30, 0x6,0x62,0x2c, + 0x4,0x47,0x33, 0x6,0x62,0x35, 0x6,0x62,0x2e, 0xf,0x4c,0x34, + 0xf,0x4c,0x36, 0xf,0x4c,0x37, 0x4,0x47,0x2f, 0xf,0x45,0x3c, + 0xf,0x45,0x3f, 0x5,0x50,0x66, 0x7,0x28,0x54, 0x4,0x4d,0x41, + 0x5,0x50,0x69, 0x7,0x28,0x57, 0x4,0x47,0x32, 0x7,0x28,0x56, + 0x5,0x50,0x65, 0x4,0x4d,0x38, 0x7,0x28,0x55, 0x7,0x33,0x28, + 0x5,0x50,0x67, 0x7,0x28,0x5a, 0x7,0x28,0x4b, 0x4,0x4d,0x45, + 0x4,0x4d,0x3b, 0x4,0x4d,0x3d, 0x7,0x28,0x53, 0x4,0x4d,0x44, + 0x4,0x4d,0x43, 0x5,0x50,0x63, 0x7,0x28,0x58, 0x7,0x28,0x52, + 0x7,0x28,0x4c, 0x5,0x50,0x64, 0x7,0x28,0x4f, 0x5,0x50,0x68, + 0x7,0x28,0x51, 0x7,0x28,0x50, 0x7,0x28,0x4d, 0xf,0x4c,0x35, + 0xf,0x52,0x2d, 0x7,0x28,0x4e, 0x7,0x28,0x59, 0x5,0x58,0x2c, + 0x5,0x58,0x2b, 0x7,0x33,0x2b, 0x5,0x58,0x27, 0x5,0x58,0x2a, + 0x7,0x33,0x27, 0x4,0x53,0x51, 0x7,0x33,0x29, 0x4,0x53,0x54, + 0x7,0x3b,0x62, 0x5,0x58,0x29, 0x5,0x58,0x28, 0x7,0x33,0x2a, + 0x4,0x53,0x4e, 0x7,0x33,0x2c, 0x7,0x33,0x2f, 0x4,0x53,0x4d, + 0x5,0x58,0x25, 0x7,0x33,0x30, 0x5,0x58,0x26, 0x7,0x33,0x2e, + 0xf,0x52,0x2c, 0x7,0x33,0x2d, 0x5,0x5e,0x3e, 0x5,0x5e,0x3f, + 0x7,0x3b,0x57, 0x5,0x5e,0x3b, 0x7,0x3b,0x5d, 0x7,0x3b,0x64, + 0x4,0x58,0x66, 0x5,0x5e,0x38, 0x5,0x5e,0x39, 0x5,0x5e,0x3d, + 0x5,0x5e,0x3c, 0x7,0x3b,0x5f, 0x7,0x3b,0x5b, 0x7,0x3b,0x63, + 0x7,0x42,0x7b, 0x7,0x3b,0x5c, 0x7,0x28,0x5b, 0x7,0x3b,0x5e, + 0x7,0x3b,0x60, 0x5,0x5e,0x40, 0x7,0x3b,0x58, 0x7,0x3b,0x5a, + 0x5,0x5e,0x3a, 0xf,0x57,0x67, 0xf,0x57,0x68, 0xf,0x57,0x69, + 0xf,0x57,0x6a, 0x7,0x42,0x75, 0x4,0x5d,0x45, 0x7,0x42,0x7c, + 0x7,0x42,0x7e, 0x5,0x64,0x5b, 0x5,0x64,0x57, 0x7,0x42,0x7d, + 0x4,0x5d,0x4b, 0x5,0x64,0x54, 0x5,0x64,0x55, 0x5,0x64,0x5f, + 0x4,0x5d,0x4d, 0x4,0x5d,0x42, 0x7,0x42,0x7a, 0x5,0x64,0x53, + 0x4,0x5d,0x47, 0x4,0x5d,0x4c, 0x5,0x64,0x5d, 0x7,0x42,0x79, + 0x7,0x42,0x77, 0x5,0x64,0x51, 0x4,0x5d,0x43, 0x5,0x5e,0x42, + 0x5,0x64,0x52, 0x7,0x42,0x78, 0x7,0x43,0x23, 0x7,0x42,0x76, + 0x5,0x64,0x59, 0x5,0x64,0x5a, 0x5,0x5e,0x41, 0x5,0x64,0x5c, + 0x5,0x64,0x5e, 0x5,0x64,0x58, 0xf,0x5c,0x60, 0x7,0x49,0x76, + 0x5,0x69,0x49, 0x5,0x69,0x4a, 0x4,0x61,0x29, 0x7,0x49,0x7b, + 0x7,0x49,0x7c, 0x5,0x69,0x47, 0x5,0x69,0x48, 0x7,0x49,0x72, + 0x7,0x49,0x73, 0x7,0x49,0x75, 0x7,0x49,0x79, 0x7,0x49,0x7a, + 0x7,0x49,0x74, 0x7,0x49,0x78, 0x4,0x61,0x2b, 0x7,0x49,0x77, + 0x7,0x43,0x21, 0xf,0x60,0x6b, 0xf,0x60,0x6c, 0xf,0x63,0x76, + 0x7,0x4f,0x7d, 0x5,0x6d,0x58, 0x7,0x50,0x26, 0x5,0x6d,0x5b, + 0x5,0x71,0x34, 0x5,0x6d,0x55, 0x4,0x64,0x45, 0x7,0x50,0x23, + 0x5,0x6d,0x56, 0x7,0x50,0x22, 0x7,0x54,0x7c, 0x7,0x4f,0x7e, + 0x5,0x6d,0x59, 0x7,0x49,0x71, 0x5,0x6d,0x5a, 0x5,0x6d,0x5c, + 0x7,0x50,0x24, 0xf,0x66,0x34, 0x7,0x50,0x21, 0x5,0x6d,0x5d, + 0x7,0x55,0x22, 0x7,0x55,0x24, 0x5,0x71,0x36, 0x4,0x67,0x36, + 0x7,0x55,0x26, 0x7,0x55,0x25, 0x5,0x71,0x35, 0x7,0x54,0x7e, + 0x7,0x55,0x21, 0x4,0x67,0x37, 0x7,0x55,0x23, 0x7,0x59,0x31, + 0x7,0x54,0x7d, 0xf,0x66,0x33, 0x4,0x69,0x41, 0x7,0x59,0x2e, + 0x4,0x69,0x40, 0x4,0x69,0x3f, 0x5,0x74,0x37, 0x7,0x59,0x2c, + 0x7,0x59,0x2d, 0x7,0x59,0x30, 0x7,0x59,0x2f, 0x5,0x78,0x2e, + 0xf,0x69,0x6f, 0x7,0x5f,0x51, 0x7,0x5f,0x50, 0x7,0x5f,0x4f, + 0x5,0x79,0x4b, 0x7,0x61,0x48, 0x7,0x61,0x47, 0x7,0x61,0x46, + 0x7,0x62,0x61, 0x5,0x7a,0x37, 0x7,0x62,0x62, 0x7,0x62,0x60, + 0x7,0x64,0x5f, 0x7,0x63,0x73, 0x7,0x63,0x72, 0x7,0x64,0x5e, + 0x5,0x7b,0x7e, 0x7,0x65,0x64, 0x7,0x66,0x2c, 0x5,0x7c,0x4b, + 0x7,0x66,0x4d, 0x5,0x24,0x76, 0x6,0x2e,0x2c, 0x4,0x2b,0x48, + 0x5,0x30,0x41, 0x4,0x2f,0x74, 0x6,0x3c,0x2a, 0x6,0x44,0x5b, + 0xf,0x38,0x46, 0xf,0x3f,0x31, 0xf,0x3f,0x32, 0x6,0x58,0x32, + 0x4,0x47,0x34, 0x6,0x62,0x36, 0x6,0x62,0x37, 0x6,0x62,0x38, + 0xf,0x4c,0x38, 0xf,0x4c,0x39, 0x7,0x28,0x5c, 0xf,0x4c,0x3a, + 0xf,0x52,0x30, 0x7,0x33,0x31, 0x7,0x33,0x32, 0xf,0x52,0x2f, + 0x7,0x3b,0x65, 0xf,0x60,0x6d, 0xf,0x60,0x6e, 0x5,0x69,0x4b, + 0x7,0x50,0x27, 0x7,0x55,0x27, 0x5,0x27,0x67, 0x6,0x2e,0x2d, + 0x4,0x2f,0x77, 0x5,0x30,0x42, 0xf,0x32,0x53, 0x5,0x35,0x4d, + 0x5,0x35,0x4e, 0x6,0x44,0x5c, 0x6,0x44,0x5d, 0x5,0x35,0x50, + 0x5,0x35,0x4b, 0xf,0x38,0x47, 0xf,0x38,0x49, 0xf,0x38,0x4b, + 0x4,0x35,0x32, 0x4,0x35,0x36, 0x5,0x35,0x4c, 0x5,0x35,0x4f, + 0x6,0x4e,0x5f, 0x4,0x3b,0x25, 0x6,0x4e,0x62, 0x6,0x4e,0x61, + 0x5,0x3c,0x36, 0x6,0x4e,0x5e, 0x4,0x3b,0x24, 0x6,0x4e,0x5d, + 0x6,0x58,0x36, 0x5,0x42,0x6d, 0x5,0x42,0x6f, 0x5,0x42,0x6e, + 0x6,0x58,0x33, 0x6,0x58,0x37, 0x5,0x42,0x70, 0xf,0x45,0x40, + 0xf,0x45,0x41, 0xf,0x45,0x42, 0x6,0x58,0x35, 0x6,0x62,0x39, + 0x5,0x49,0x71, 0x5,0x49,0x6e, 0x5,0x49,0x72, 0x4,0x47,0x37, + 0x6,0x62,0x3a, 0xf,0x4c,0x3b, 0xf,0x4c,0x3c, 0x5,0x49,0x6f, + 0x6,0x62,0x3b, 0x5,0x49,0x70, 0x4,0x4d,0x49, 0x7,0x28,0x5f, + 0x5,0x50,0x6c, 0x4,0x4d,0x4b, 0x5,0x50,0x6b, 0x7,0x28,0x63, + 0x5,0x50,0x6d, 0x6,0x58,0x34, 0x7,0x28,0x62, 0x5,0x50,0x6a, + 0x5,0x50,0x6e, 0xf,0x52,0x31, 0x7,0x28,0x60, 0x7,0x28,0x5e, + 0x7,0x28,0x5d, 0x7,0x28,0x61, 0x5,0x58,0x30, 0x5,0x58,0x2f, + 0x5,0x58,0x2e, 0x4,0x53,0x57, 0x7,0x33,0x34, 0x5,0x58,0x34, + 0x7,0x3b,0x67, 0x4,0x53,0x58, 0x4,0x53,0x5e, 0x4,0x53,0x5d, + 0x5,0x58,0x31, 0x5,0x58,0x35, 0x7,0x33,0x33, 0x5,0x58,0x2d, + 0x5,0x58,0x33, 0xf,0x57,0x6b, 0xf,0x57,0x6c, 0xf,0x57,0x6d, + 0x7,0x3b,0x66, 0x5,0x64,0x60, 0x5,0x5e,0x45, 0x5,0x5e,0x44, + 0x7,0x3b,0x6a, 0x7,0x3b,0x69, 0x7,0x3b,0x6b, 0x7,0x3b,0x68, + 0xf,0x5c,0x61, 0xf,0x5c,0x62, 0x5,0x64,0x62, 0x4,0x5d,0x51, + 0x4,0x5d,0x4f, 0x7,0x43,0x24, 0x5,0x64,0x61, 0xf,0x60,0x6f, + 0xf,0x60,0x70, 0xf,0x60,0x71, 0x7,0x43,0x25, 0x7,0x49,0x7d, + 0x7,0x49,0x7e, 0x5,0x6d,0x5f, 0x7,0x50,0x29, 0x7,0x50,0x28, + 0xf,0x66,0x35, 0x5,0x6d,0x5e, 0xf,0x68,0x4b, 0xf,0x68,0x4c, + 0x7,0x55,0x28, 0x4,0x69,0x43, 0x5,0x74,0x39, 0x4,0x69,0x42, + 0xf,0x69,0x70, 0xf,0x69,0x71, 0x5,0x78,0x2f, 0x7,0x5f,0x53, + 0xf,0x6b,0x64, 0x7,0x5f,0x52, 0x5,0x79,0x4d, 0x5,0x79,0x4c, + 0x7,0x61,0x49, 0x4,0x6d,0x21, 0x5,0x7a,0x74, 0x4,0x6e,0x3b, + 0x5,0x7c,0x44, 0x7,0x66,0x54, 0x6,0x2e,0x2e, 0x6,0x2e,0x2f, + 0x6,0x34,0x54, 0x5,0x2b,0x48, 0x4,0x2f,0x78, 0x6,0x3c,0x2c, + 0x4,0x2f,0x79, 0x6,0x3c,0x2b, 0x6,0x44,0x67, 0x4,0x35,0x3b, + 0x5,0x35,0x53, 0x5,0x35,0x52, 0x6,0x44,0x5f, 0x6,0x44,0x63, + 0x4,0x35,0x37, 0x6,0x44,0x64, 0x5,0x35,0x51, 0x6,0x44,0x60, + 0xf,0x38,0x4d, 0xf,0x38,0x4e, 0xf,0x38,0x4f, 0x4,0x35,0x3c, + 0x6,0x44,0x66, 0x6,0x44,0x5e, 0x6,0x44,0x62, 0x6,0x44,0x65, + 0x6,0x44,0x61, 0x5,0x3c,0x37, 0x4,0x3b,0x26, 0x6,0x4e,0x64, + 0x6,0x4e,0x67, 0x5,0x3c,0x38, 0x6,0x4e,0x63, 0x6,0x4e,0x66, + 0x6,0x4e,0x69, 0x6,0x4e,0x65, 0x4,0x3b,0x27, 0x4,0x3b,0x28, + 0x6,0x4e,0x68, 0xf,0x3f,0x33, 0x5,0x42,0x73, 0x5,0x42,0x71, + 0x5,0x42,0x72, 0x6,0x58,0x38, 0x6,0x62,0x3e, 0x5,0x49,0x75, + 0x4,0x47,0x39, 0x6,0x62,0x40, 0x5,0x49,0x73, 0x5,0x49,0x74, + 0x6,0x62,0x3d, 0x6,0x62,0x41, 0x6,0x62,0x3c, 0x6,0x62,0x3f, + 0x7,0x28,0x66, 0x5,0x50,0x75, 0x7,0x28,0x67, 0x5,0x50,0x74, + 0x5,0x50,0x70, 0x5,0x50,0x6f, 0x4,0x4d,0x50, 0x4,0x4d,0x52, + 0x4,0x4d,0x4d, 0x7,0x28,0x69, 0x4,0x4d,0x54, 0x5,0x50,0x72, + 0x7,0x28,0x68, 0x7,0x28,0x6a, 0x5,0x50,0x71, 0x7,0x28,0x64, + 0x7,0x28,0x65, 0x5,0x50,0x73, 0x7,0x33,0x38, 0x7,0x33,0x37, + 0x4,0x53,0x5f, 0x5,0x58,0x36, 0x4,0x53,0x63, 0x5,0x58,0x39, + 0x5,0x58,0x3b, 0x4,0x53,0x60, 0x7,0x33,0x36, 0x7,0x33,0x35, + 0x5,0x58,0x37, 0x5,0x58,0x38, 0x5,0x58,0x3a, 0x7,0x33,0x39, + 0x5,0x5e,0x46, 0x7,0x3b,0x6d, 0x7,0x3b,0x73, 0x7,0x3b,0x6c, + 0x5,0x5e,0x4a, 0x5,0x5e,0x49, 0x7,0x3b,0x6e, 0x7,0x33,0x3a, + 0x5,0x5e,0x48, 0x7,0x3b,0x6f, 0x7,0x3b,0x70, 0x7,0x3b,0x71, + 0x4,0x58,0x6c, 0x7,0x3b,0x74, 0x7,0x3b,0x72, 0x5,0x5e,0x47, + 0x7,0x43,0x27, 0x7,0x43,0x28, 0x4,0x5d,0x52, 0x7,0x43,0x26, + 0x7,0x43,0x29, 0x4,0x61,0x35, 0x5,0x69,0x4c, 0x4,0x61,0x32, + 0x4,0x61,0x33, 0x7,0x4a,0x21, 0x7,0x4a,0x22, 0x7,0x4a,0x23, + 0x7,0x4a,0x24, 0x4,0x61,0x36, 0x7,0x50,0x2a, 0x5,0x71,0x37, + 0x7,0x55,0x29, 0x5,0x74,0x3a, 0x4,0x69,0x44, 0x7,0x5c,0x65, + 0x5,0x78,0x30, 0x7,0x62,0x63, 0x4,0x6d,0x60, 0x7,0x64,0x60, + 0x7,0x64,0x61, 0x5,0x7b,0x69, 0x7,0x65,0x43, 0x5,0x23,0x27, + 0x5,0x23,0x28, 0x6,0x2e,0x30, 0x6,0x3c,0x33, 0x4,0x30,0x21, + 0x4,0x2f,0x7b, 0x4,0x2f,0x7a, 0x4,0x30,0x22, 0x5,0x30,0x43, + 0x6,0x3c,0x30, 0x6,0x3c,0x31, 0x6,0x3c,0x2f, 0x6,0x3c,0x32, + 0x6,0x3c,0x2e, 0x4,0x35,0x40, 0x6,0x44,0x6a, 0x6,0x44,0x73, + 0x4,0x35,0x3e, 0x6,0x44,0x6f, 0x5,0x35,0x5c, 0x5,0x35,0x59, + 0x6,0x44,0x71, 0x4,0x35,0x42, 0x5,0x35,0x54, 0x4,0x35,0x46, + 0x6,0x44,0x79, 0x5,0x35,0x55, 0x6,0x44,0x77, 0x6,0x44,0x6b, + 0x6,0x44,0x78, 0x5,0x35,0x58, 0x6,0x44,0x74, 0x6,0x44,0x75, + 0x6,0x44,0x6e, 0x6,0x44,0x7a, 0xf,0x38,0x50, 0xf,0x38,0x51, + 0xf,0x38,0x53, 0xf,0x38,0x54, 0xf,0x38,0x55, 0xf,0x38,0x56, + 0x6,0x44,0x72, 0x6,0x44,0x69, 0x6,0x44,0x68, 0x6,0x44,0x76, + 0x6,0x44,0x6c, 0x5,0x35,0x5a, 0x6,0x4e,0x74, 0x4,0x3b,0x32, + 0x4,0x3b,0x2e, 0x5,0x3c,0x3b, 0x6,0x4e,0x6f, 0x6,0x4e,0x6e, + 0x6,0x4e,0x71, 0x6,0x4e,0x6a, 0x4,0x3b,0x2d, 0x6,0x4e,0x78, + 0x4,0x3b,0x38, 0x4,0x3b,0x39, 0x5,0x3c,0x3c, 0x6,0x4e,0x6d, + 0x6,0x4e,0x76, 0x6,0x4e,0x70, 0x6,0x4e,0x77, 0x4,0x3b,0x37, + 0x5,0x3c,0x39, 0x5,0x3c,0x3a, 0xf,0x3f,0x34, 0xf,0x3f,0x35, + 0xf,0x3f,0x36, 0xf,0x3f,0x37, 0xf,0x3f,0x38, 0xf,0x3f,0x39, + 0xf,0x3f,0x3a, 0xf,0x3f,0x3c, 0x6,0x4e,0x72, 0x6,0x4e,0x75, + 0x6,0x4e,0x6c, 0x6,0x4e,0x79, 0x6,0x4e,0x73, 0x5,0x42,0x75, + 0x4,0x40,0x68, 0x4,0x40,0x6a, 0x6,0x58,0x46, 0x5,0x42,0x76, + 0x5,0x3c,0x3d, 0x5,0x42,0x79, 0x4,0x40,0x71, 0x4,0x40,0x70, + 0x6,0x58,0x40, 0x6,0x58,0x4b, 0x6,0x58,0x3d, 0x6,0x58,0x49, + 0x4,0x40,0x69, 0x4,0x40,0x6b, 0x5,0x42,0x7c, 0x5,0x42,0x74, + 0x4,0x40,0x73, 0x6,0x58,0x43, 0x6,0x58,0x3c, 0x6,0x58,0x47, + 0x6,0x58,0x42, 0x6,0x58,0x3f, 0x4,0x40,0x72, 0x5,0x42,0x7a, + 0x6,0x58,0x48, 0x5,0x42,0x78, 0x5,0x42,0x77, 0x6,0x58,0x44, + 0xf,0x45,0x43, 0xf,0x45,0x45, 0xf,0x45,0x46, 0x6,0x58,0x4a, + 0x5,0x42,0x7b, 0x6,0x58,0x39, 0x6,0x58,0x3b, 0x4,0x40,0x6f, + 0x6,0x58,0x3a, 0x6,0x58,0x45, 0x6,0x58,0x3e, 0x6,0x62,0x4e, + 0x4,0x47,0x3f, 0x5,0x49,0x7a, 0x4,0x47,0x3b, 0x5,0x49,0x78, + 0x5,0x49,0x7b, 0x4,0x47,0x3e, 0x4,0x47,0x48, 0x6,0x62,0x42, + 0x6,0x62,0x4c, 0x4,0x47,0x41, 0x6,0x62,0x53, 0x4,0x47,0x44, + 0x6,0x62,0x4f, 0x4,0x47,0x47, 0x6,0x62,0x46, 0x5,0x49,0x79, + 0x6,0x62,0x51, 0x6,0x62,0x45, 0x4,0x47,0x49, 0x6,0x62,0x50, + 0x6,0x62,0x44, 0x5,0x49,0x76, 0x5,0x49,0x77, 0xf,0x4c,0x3d, + 0xf,0x4c,0x3e, 0xf,0x4c,0x3f, 0xf,0x4c,0x40, 0xf,0x4c,0x42, + 0xf,0x4c,0x43, 0xf,0x4c,0x44, 0xf,0x4c,0x45, 0x6,0x62,0x48, + 0x4,0x47,0x4b, 0x6,0x62,0x4a, 0x5,0x42,0x7d, 0x6,0x62,0x4b, + 0x6,0x62,0x4d, 0x6,0x62,0x43, 0x6,0x62,0x52, 0x6,0x62,0x49, + 0x7,0x29,0x21, 0x5,0x51,0x2a, 0x7,0x28,0x6b, 0x5,0x50,0x7a, + 0x5,0x51,0x22, 0x7,0x28,0x71, 0x7,0x28,0x74, 0x7,0x29,0x22, + 0x7,0x28,0x7c, 0x7,0x28,0x70, 0x5,0x51,0x27, 0x4,0x4d,0x57, + 0x5,0x51,0x29, 0x5,0x51,0x23, 0x5,0x50,0x7b, 0x5,0x50,0x7e, + 0x7,0x28,0x78, 0x5,0x51,0x24, 0x4,0x4d,0x5d, 0x5,0x51,0x26, + 0x4,0x4d,0x62, 0x7,0x29,0x24, 0x7,0x28,0x77, 0x7,0x28,0x6f, + 0x5,0x50,0x78, 0x5,0x50,0x7c, 0x7,0x28,0x7d, 0x7,0x28,0x6d, + 0x5,0x51,0x25, 0x5,0x50,0x7d, 0x5,0x50,0x77, 0x5,0x50,0x79, + 0x5,0x50,0x76, 0xf,0x52,0x32, 0xf,0x52,0x33, 0xf,0x52,0x34, + 0xf,0x52,0x35, 0xf,0x52,0x37, 0xf,0x52,0x39, 0xf,0x52,0x3a, + 0x7,0x28,0x76, 0x7,0x28,0x75, 0x7,0x28,0x6c, 0x7,0x28,0x72, + 0xf,0x52,0x38, 0x5,0x51,0x21, 0x7,0x28,0x7b, 0x7,0x28,0x6e, + 0x5,0x51,0x28, 0x7,0x29,0x23, 0x7,0x28,0x7e, 0x7,0x28,0x7a, + 0x7,0x28,0x73, 0x7,0x33,0x46, 0x5,0x58,0x40, 0x4,0x53,0x71, + 0x7,0x33,0x52, 0x4,0x53,0x68, 0x4,0x53,0x65, 0x4,0x53,0x6c, + 0x7,0x33,0x49, 0x7,0x33,0x51, 0x7,0x33,0x43, 0x5,0x58,0x3d, + 0x7,0x33,0x42, 0x5,0x58,0x3c, 0x7,0x33,0x3c, 0x4,0x53,0x70, + 0x4,0x53,0x67, 0x7,0x33,0x45, 0x4,0x53,0x6f, 0x7,0x33,0x3d, + 0x4,0x53,0x6e, 0x7,0x33,0x47, 0x7,0x33,0x4e, 0x4,0x53,0x66, + 0x7,0x33,0x50, 0x7,0x33,0x3e, 0x4,0x53,0x69, 0x7,0x33,0x3b, + 0x7,0x33,0x53, 0x7,0x33,0x40, 0x7,0x33,0x3f, 0x7,0x33,0x48, + 0x7,0x33,0x4a, 0x5,0x58,0x3f, 0x7,0x33,0x4c, 0x4,0x53,0x6d, + 0x7,0x33,0x44, 0x5,0x58,0x3e, 0xf,0x57,0x6e, 0xf,0x57,0x6f, + 0xf,0x57,0x70, 0xf,0x57,0x71, 0xf,0x57,0x72, 0xf,0x57,0x73, + 0xf,0x57,0x74, 0xf,0x57,0x75, 0xf,0x57,0x76, 0xf,0x57,0x77, + 0xf,0x57,0x78, 0x7,0x33,0x54, 0x7,0x33,0x41, 0x7,0x33,0x4b, + 0x4,0x58,0x6e, 0x5,0x5e,0x52, 0x5,0x5e,0x51, 0x7,0x3b,0x7d, + 0x4,0x58,0x6f, 0x5,0x5e,0x54, 0x4,0x58,0x71, 0x7,0x3b,0x79, + 0x4,0x58,0x6d, 0x5,0x5e,0x4d, 0x5,0x5e,0x53, 0x5,0x5e,0x4e, + 0x7,0x3b,0x76, 0x7,0x3c,0x25, 0x4,0x58,0x72, 0x7,0x43,0x2a, + 0x5,0x5e,0x4f, 0x7,0x3c,0x21, 0x7,0x3b,0x77, 0x5,0x5e,0x56, + 0x7,0x3c,0x27, 0x7,0x3b,0x7c, 0x7,0x3b,0x78, 0x5,0x5e,0x50, + 0x4,0x58,0x74, 0x7,0x3b,0x7b, 0x7,0x3b,0x7e, 0x7,0x3c,0x22, + 0x7,0x3c,0x23, 0x4,0x58,0x73, 0x5,0x5e,0x4b, 0x7,0x3c,0x26, + 0x5,0x5e,0x4c, 0x7,0x3c,0x24, 0x7,0x3b,0x75, 0xf,0x5c,0x63, + 0xf,0x5c,0x64, 0xf,0x5c,0x65, 0xf,0x5c,0x66, 0xf,0x5c,0x67, + 0xf,0x5c,0x68, 0xf,0x5c,0x69, 0xf,0x5c,0x6a, 0xf,0x5c,0x6b, + 0x7,0x3c,0x28, 0x7,0x3c,0x29, 0x7,0x3b,0x7a, 0x4,0x5d,0x5e, + 0x4,0x5d,0x56, 0x7,0x43,0x37, 0x4,0x5d,0x58, 0x7,0x43,0x35, + 0x5,0x64,0x68, 0x7,0x43,0x3a, 0x7,0x43,0x2b, 0x4,0x5d,0x60, + 0x5,0x64,0x66, 0x5,0x58,0x41, 0x4,0x5d,0x59, 0x5,0x64,0x67, + 0x7,0x43,0x38, 0x7,0x43,0x32, 0x5,0x64,0x64, 0x4,0x5d,0x53, + 0x7,0x43,0x3b, 0x4,0x5d,0x55, 0x5,0x64,0x65, 0x4,0x5d,0x5d, + 0x7,0x43,0x39, 0x7,0x43,0x2f, 0x7,0x43,0x33, 0x7,0x4a,0x2a, + 0x7,0x43,0x30, 0x4,0x5d,0x5c, 0x7,0x43,0x34, 0x7,0x43,0x31, + 0x7,0x43,0x3c, 0x7,0x43,0x2c, 0x7,0x43,0x2d, 0xf,0x60,0x72, + 0xf,0x60,0x75, 0x7,0x43,0x36, 0x4,0x5d,0x5f, 0x7,0x43,0x2e, + 0x5,0x69,0x4d, 0x5,0x69,0x4f, 0x7,0x4a,0x2f, 0x4,0x61,0x3e, + 0x7,0x4a,0x2c, 0x7,0x4a,0x2e, 0x4,0x61,0x43, 0x4,0x61,0x39, + 0x5,0x69,0x50, 0x4,0x61,0x41, 0x7,0x4a,0x34, 0x4,0x61,0x42, + 0x5,0x69,0x4e, 0x4,0x61,0x3f, 0x7,0x4a,0x26, 0x7,0x4a,0x29, + 0x7,0x43,0x3d, 0x7,0x4a,0x28, 0x7,0x4a,0x35, 0x7,0x50,0x33, + 0x7,0x4a,0x33, 0x4,0x61,0x3c, 0x5,0x6d,0x60, 0x7,0x4a,0x27, + 0xf,0x63,0x78, 0xf,0x63,0x79, 0xf,0x63,0x7a, 0x4,0x61,0x44, + 0x7,0x4a,0x2b, 0x7,0x50,0x35, 0x7,0x4a,0x30, 0x7,0x4a,0x31, + 0x7,0x4a,0x2d, 0x7,0x4a,0x32, 0x4,0x61,0x38, 0xf,0x60,0x74, + 0x4,0x64,0x4a, 0x4,0x64,0x4b, 0x5,0x6d,0x62, 0x5,0x6d,0x61, + 0x7,0x50,0x2d, 0x5,0x6d,0x63, 0x7,0x50,0x2f, 0x4,0x64,0x49, + 0x7,0x50,0x2b, 0x5,0x69,0x53, 0x7,0x50,0x32, 0x7,0x50,0x2e, + 0x7,0x50,0x34, 0x7,0x50,0x36, 0x7,0x50,0x2c, 0x7,0x50,0x30, + 0xf,0x66,0x36, 0xf,0x66,0x37, 0xf,0x66,0x38, 0xf,0x66,0x39, + 0x7,0x50,0x38, 0x7,0x50,0x37, 0x7,0x50,0x39, 0x7,0x55,0x2a, + 0x4,0x67,0x42, 0x7,0x55,0x34, 0x7,0x55,0x2d, 0x7,0x55,0x33, + 0x4,0x67,0x38, 0x7,0x55,0x2e, 0x5,0x71,0x3d, 0x7,0x55,0x2c, + 0x7,0x55,0x2f, 0x4,0x67,0x3c, 0x5,0x71,0x3a, 0x5,0x71,0x39, + 0x4,0x67,0x43, 0x7,0x59,0x3b, 0x7,0x59,0x35, 0x4,0x67,0x3a, + 0x5,0x71,0x3c, 0x5,0x71,0x3b, 0x7,0x55,0x31, 0x7,0x55,0x2b, + 0x7,0x55,0x30, 0x5,0x71,0x38, 0x7,0x55,0x35, 0x5,0x74,0x3b, + 0x5,0x74,0x3d, 0x5,0x74,0x40, 0x5,0x76,0x4b, 0x4,0x69,0x47, + 0x7,0x59,0x39, 0x4,0x69,0x4a, 0x5,0x74,0x3f, 0x4,0x69,0x49, + 0x5,0x74,0x3e, 0x7,0x59,0x37, 0x7,0x59,0x40, 0x7,0x55,0x36, + 0x5,0x74,0x3c, 0x7,0x59,0x36, 0x7,0x59,0x3a, 0x7,0x59,0x3f, + 0x4,0x69,0x46, 0x7,0x59,0x3e, 0xf,0x69,0x72, 0xf,0x69,0x73, + 0xf,0x69,0x74, 0x7,0x59,0x3c, 0x7,0x59,0x3d, 0x4,0x6a,0x7d, + 0x4,0x6a,0x7e, 0x7,0x5c,0x66, 0x5,0x76,0x4e, 0x5,0x76,0x4d, + 0x5,0x78,0x31, 0x7,0x5c,0x68, 0x7,0x5c,0x69, 0x7,0x5c,0x6a, + 0xf,0x6a,0x74, 0xf,0x6a,0x75, 0x7,0x5c,0x67, 0x7,0x59,0x42, + 0x7,0x5f,0x57, 0x7,0x5f,0x58, 0x7,0x5f,0x55, 0x4,0x6c,0x27, + 0x7,0x5f,0x56, 0x7,0x5f,0x5a, 0xf,0x6b,0x65, 0xf,0x6b,0x66, + 0x7,0x5f,0x54, 0x7,0x5f,0x59, 0x7,0x5f,0x5b, 0x4,0x6d,0x23, + 0x7,0x61,0x4b, 0x5,0x79,0x4e, 0x7,0x61,0x4c, 0xf,0x6c,0x3a, + 0xf,0x6c,0x3b, 0x7,0x61,0x4a, 0x5,0x7a,0x75, 0x7,0x62,0x65, + 0x7,0x62,0x64, 0x5,0x7a,0x39, 0x4,0x6d,0x7e, 0x7,0x63,0x74, + 0x7,0x64,0x62, 0x4,0x6e,0x3c, 0x7,0x64,0x44, 0x7,0x65,0x44, + 0x7,0x66,0x50, 0x5,0x24,0x77, 0x4,0x30,0x24, 0x5,0x30,0x44, + 0x5,0x30,0x45, 0x4,0x35,0x48, 0x4,0x35,0x49, 0x4,0x35,0x47, + 0x6,0x44,0x7b, 0x4,0x3b,0x3a, 0x5,0x42,0x7e, 0x5,0x43,0x21, + 0x6,0x58,0x4c, 0x4,0x47,0x4d, 0x5,0x51,0x2c, 0x4,0x4d,0x63, + 0x5,0x51,0x2d, 0x5,0x51,0x2b, 0x5,0x58,0x42, 0x7,0x33,0x56, + 0x7,0x33,0x55, 0x7,0x3c,0x2a, 0x5,0x5e,0x57, 0x7,0x43,0x3e, + 0x7,0x4a,0x36, 0x7,0x4a,0x39, 0x5,0x69,0x54, 0x7,0x4a,0x37, + 0x5,0x69,0x55, 0x7,0x4a,0x38, 0x7,0x50,0x3a, 0x7,0x4a,0x3a, + 0x5,0x71,0x3e, 0x5,0x7a,0x76, 0x7,0x65,0x77, 0x6,0x34,0x55, + 0x6,0x3c,0x35, 0x6,0x3c,0x34, 0xf,0x38,0x57, 0x4,0x3b,0x3b, + 0x5,0x3c,0x3e, 0x6,0x4e,0x7b, 0xf,0x3f,0x3d, 0x5,0x43,0x22, + 0x4,0x40,0x75, 0x6,0x5b,0x5f, 0x4,0x47,0x50, 0x6,0x62,0x54, + 0x4,0x47,0x51, 0x7,0x29,0x28, 0x7,0x29,0x27, 0x7,0x29,0x25, + 0x5,0x51,0x2f, 0x5,0x51,0x2e, 0x7,0x29,0x26, 0xf,0x52,0x3b, + 0x5,0x58,0x43, 0x4,0x53,0x74, 0x7,0x33,0x57, 0x5,0x58,0x44, + 0x7,0x2c,0x56, 0x5,0x5e,0x5a, 0x7,0x3c,0x2d, 0x5,0x5e,0x58, + 0x7,0x3c,0x2c, 0x5,0x5e,0x59, 0x7,0x3c,0x2b, 0x5,0x64,0x69, + 0x4,0x5d,0x63, 0x7,0x43,0x40, 0x4,0x5d,0x62, 0x5,0x5e,0x5b, + 0x7,0x4a,0x3c, 0x5,0x69,0x57, 0x7,0x4a,0x3d, 0x7,0x43,0x41, + 0x7,0x43,0x42, 0x5,0x69,0x56, 0x5,0x6d,0x66, 0x5,0x6d,0x65, + 0x5,0x6d,0x67, 0xf,0x66,0x3a, 0x5,0x6d,0x64, 0xf,0x63,0x7b, + 0x5,0x71,0x3f, 0x5,0x74,0x41, 0xf,0x6a,0x76, 0xf,0x6a,0x77, + 0x5,0x78,0x32, 0x5,0x79,0x4f, 0x5,0x7a,0x77, 0x7,0x65,0x45, + 0x6,0x25,0x54, 0x5,0x23,0x29, 0x5,0x2b,0x4a, 0x5,0x30,0x48, + 0x5,0x30,0x47, 0x6,0x3c,0x37, 0x6,0x3c,0x36, 0x6,0x44,0x7e, + 0x6,0x44,0x7c, 0x5,0x35,0x61, 0x6,0x45,0x21, 0x6,0x44,0x7d, + 0x4,0x3b,0x3c, 0x6,0x4e,0x7c, 0x4,0x3b,0x3d, 0x5,0x3c,0x40, + 0x5,0x3c,0x3f, 0x6,0x4e,0x7e, 0x5,0x3c,0x41, 0x6,0x4f,0x23, + 0x6,0x4e,0x7d, 0xf,0x32,0x55, 0x4,0x40,0x77, 0x5,0x43,0x25, + 0x4,0x40,0x76, 0x6,0x58,0x4e, 0x6,0x58,0x4f, 0x5,0x43,0x27, + 0x5,0x43,0x23, 0x5,0x43,0x26, 0x6,0x58,0x4d, 0x6,0x4f,0x22, + 0x5,0x43,0x24, 0x5,0x43,0x28, 0x6,0x62,0x55, 0x6,0x62,0x56, + 0x4,0x47,0x53, 0x4,0x47,0x52, 0x6,0x62,0x59, 0x5,0x49,0x7d, + 0x5,0x49,0x7c, 0x6,0x62,0x5b, 0x6,0x62,0x5a, 0x6,0x62,0x57, + 0x6,0x62,0x58, 0x5,0x51,0x32, 0x4,0x4d,0x66, 0x7,0x29,0x29, + 0x7,0x29,0x2b, 0x5,0x51,0x31, 0x5,0x51,0x33, 0x7,0x29,0x2d, + 0x7,0x29,0x2c, 0x5,0x49,0x7e, 0x5,0x51,0x30, 0x7,0x29,0x2a, + 0x5,0x4a,0x21, 0x7,0x29,0x2e, 0xf,0x52,0x3c, 0x5,0x58,0x47, + 0x5,0x58,0x48, 0x5,0x58,0x46, 0x7,0x33,0x59, 0x4,0x53,0x76, + 0x7,0x33,0x5a, 0x7,0x33,0x5c, 0x7,0x33,0x5b, 0x5,0x58,0x45, + 0x7,0x33,0x58, 0x5,0x5e,0x5d, 0x5,0x5e,0x5e, 0x5,0x5e,0x5f, + 0x5,0x5e,0x5c, 0x7,0x3c,0x30, 0x7,0x3c,0x2e, 0x7,0x3c,0x2f, + 0x4,0x5d,0x65, 0x5,0x64,0x6a, 0x5,0x64,0x6b, 0x7,0x43,0x43, + 0x7,0x43,0x44, 0x7,0x43,0x45, 0x4,0x61,0x47, 0x5,0x69,0x58, + 0x5,0x58,0x49, 0x7,0x4a,0x3e, 0x4,0x61,0x49, 0x5,0x6d,0x6b, + 0x5,0x6d,0x68, 0x7,0x50,0x3b, 0x5,0x6d,0x6a, 0x5,0x6d,0x69, + 0x4,0x67,0x46, 0x5,0x71,0x40, 0x7,0x55,0x37, 0x7,0x55,0x38, + 0x7,0x59,0x43, 0x7,0x5c,0x6c, 0x7,0x59,0x44, 0x7,0x59,0x45, + 0x7,0x5c,0x6d, 0x7,0x5c,0x6e, 0x5,0x74,0x42, 0x7,0x5f,0x5c, + 0x7,0x61,0x4d, 0x7,0x5f,0x5d, 0x5,0x79,0x50, 0x5,0x7a,0x3a, + 0x7,0x65,0x46, 0x7,0x66,0x43, 0xf,0x28,0x6c, 0x5,0x2b,0x4b, + 0x6,0x3c,0x38, 0xf,0x32,0x56, 0x5,0x35,0x64, 0x5,0x35,0x63, + 0x4,0x35,0x4f, 0x5,0x35,0x62, 0x4,0x35,0x4e, 0x6,0x45,0x25, + 0x6,0x45,0x23, 0x6,0x4f,0x25, 0x5,0x3c,0x42, 0x5,0x3c,0x46, + 0x5,0x3c,0x44, 0x5,0x3c,0x48, 0x5,0x3c,0x45, 0x6,0x4f,0x28, + 0x6,0x4f,0x26, 0x5,0x3c,0x47, 0x5,0x3c,0x43, 0x6,0x4f,0x27, + 0x6,0x4f,0x24, 0xf,0x3f,0x3e, 0x4,0x40,0x7c, 0x4,0x40,0x7d, + 0x4,0x40,0x7a, 0x6,0x58,0x52, 0x5,0x43,0x2b, 0x6,0x58,0x51, + 0x5,0x43,0x2a, 0x4,0x40,0x79, 0x4,0x40,0x7b, 0x6,0x58,0x53, + 0xf,0x45,0x47, 0x5,0x43,0x29, 0x6,0x62,0x61, 0x6,0x62,0x5c, + 0x5,0x4a,0x25, 0x5,0x4a,0x23, 0x5,0x4a,0x22, 0x6,0x62,0x5f, + 0x5,0x4a,0x24, 0x6,0x62,0x5e, 0x6,0x62,0x60, 0xf,0x4c,0x48, + 0x6,0x62,0x5d, 0x6,0x62,0x62, 0xf,0x4c,0x49, 0x5,0x51,0x35, + 0x5,0x51,0x34, 0x4,0x4d,0x69, 0x5,0x51,0x37, 0x5,0x51,0x36, + 0x5,0x51,0x38, 0x4,0x4d,0x6a, 0x7,0x29,0x2f, 0x7,0x29,0x30, + 0x4,0x4d,0x6b, 0x7,0x29,0x31, 0x7,0x33,0x64, 0x5,0x58,0x4b, + 0x7,0x33,0x5e, 0x7,0x33,0x60, 0x7,0x33,0x61, 0x4,0x53,0x78, + 0x5,0x58,0x4a, 0x7,0x33,0x62, 0x5,0x58,0x4c, 0x7,0x33,0x5f, + 0xf,0x57,0x7a, 0x7,0x33,0x5d, 0x7,0x33,0x63, 0x4,0x58,0x79, + 0x5,0x5e,0x63, 0x7,0x3c,0x31, 0x5,0x5e,0x62, 0x4,0x58,0x78, + 0x5,0x5e,0x60, 0x5,0x5e,0x64, 0x5,0x5e,0x61, 0xf,0x5c,0x6c, + 0x7,0x43,0x46, 0x4,0x5d,0x67, 0x7,0x43,0x47, 0x4,0x5d,0x66, + 0x5,0x64,0x6c, 0x7,0x4a,0x3f, 0x5,0x64,0x6d, 0x5,0x69,0x5b, + 0x7,0x4a,0x40, 0x5,0x69,0x5a, 0x7,0x4a,0x43, 0x7,0x50,0x3d, + 0x7,0x4a,0x42, 0x5,0x69,0x59, 0x5,0x6d,0x6d, 0x5,0x6d,0x6c, + 0x7,0x50,0x3c, 0x5,0x71,0x42, 0x5,0x6d,0x6e, 0x5,0x71,0x41, + 0x7,0x55,0x39, 0x7,0x59,0x46, 0x7,0x5c,0x70, 0x7,0x5c,0x6f, + 0x5,0x7a,0x78, 0x5,0x2b,0x4c, 0x4,0x2b,0x4a, 0x6,0x34,0x56, + 0xf,0x2d,0x4a, 0x4,0x30,0x26, 0x6,0x3c,0x39, 0x5,0x30,0x49, + 0x5,0x30,0x4a, 0xf,0x32,0x57, 0xf,0x32,0x58, 0x6,0x3c,0x3a, + 0x6,0x45,0x2a, 0x6,0x45,0x2c, 0x6,0x45,0x27, 0x6,0x45,0x28, + 0x6,0x45,0x26, 0x6,0x45,0x2b, 0x5,0x35,0x65, 0xf,0x38,0x59, + 0xf,0x38,0x5a, 0xf,0x38,0x5b, 0xf,0x38,0x5c, 0xf,0x38,0x5d, + 0xf,0x38,0x5e, 0xf,0x38,0x5f, 0xf,0x38,0x60, 0x6,0x45,0x2d, + 0x4,0x35,0x53, 0x6,0x45,0x29, 0x4,0x35,0x52, 0x6,0x4f,0x2b, + 0x4,0x3b,0x40, 0x5,0x3c,0x49, 0x5,0x3c,0x4b, 0x6,0x4f,0x2e, + 0x6,0x4f,0x2c, 0x6,0x4f,0x2d, 0x6,0x58,0x57, 0x5,0x3c,0x4a, + 0xf,0x3f,0x3f, 0xf,0x3f,0x41, 0xf,0x3f,0x42, 0xf,0x3f,0x43, + 0xf,0x3f,0x44, 0xf,0x3f,0x45, 0x6,0x4f,0x2f, 0x6,0x4f,0x2a, + 0x5,0x3c,0x4d, 0x4,0x41,0x22, 0x6,0x58,0x54, 0x6,0x58,0x59, + 0x6,0x58,0x56, 0x5,0x43,0x30, 0x5,0x43,0x2c, 0x6,0x58,0x5e, + 0x6,0x58,0x55, 0x5,0x43,0x2f, 0x5,0x43,0x31, 0x5,0x43,0x32, + 0x6,0x58,0x58, 0x6,0x58,0x60, 0x6,0x58,0x62, 0x5,0x43,0x33, + 0x6,0x58,0x5f, 0xf,0x45,0x48, 0xf,0x45,0x49, 0xf,0x45,0x4a, + 0xf,0x45,0x4b, 0xf,0x45,0x4c, 0xf,0x45,0x4d, 0xf,0x45,0x4e, + 0x6,0x58,0x61, 0xf,0x3f,0x40, 0x6,0x58,0x5b, 0x5,0x43,0x2e, + 0xf,0x46,0x34, 0x6,0x62,0x65, 0x4,0x47,0x55, 0x5,0x4a,0x26, + 0x6,0x62,0x64, 0x6,0x62,0x66, 0x6,0x62,0x6c, 0x6,0x62,0x63, + 0x6,0x62,0x69, 0x5,0x4a,0x27, 0x4,0x47,0x57, 0xf,0x4c,0x4d, + 0xf,0x4c,0x4e, 0xf,0x4c,0x4f, 0xf,0x4c,0x51, 0xf,0x4c,0x50, + 0xf,0x4c,0x4c, 0x6,0x62,0x6b, 0x6,0x58,0x5d, 0x7,0x29,0x33, + 0x7,0x29,0x35, 0x5,0x4a,0x28, 0x4,0x4d,0x6f, 0x7,0x29,0x34, + 0x5,0x51,0x3a, 0x4,0x4d,0x70, 0x5,0x51,0x3b, 0x7,0x29,0x39, + 0x7,0x29,0x38, 0x7,0x29,0x32, 0xf,0x52,0x3d, 0xf,0x52,0x3e, + 0xf,0x52,0x3f, 0x7,0x29,0x37, 0xf,0x4c,0x4b, 0x7,0x33,0x6a, + 0x5,0x58,0x4e, 0x7,0x33,0x67, 0x7,0x33,0x66, 0x5,0x58,0x4f, + 0x7,0x33,0x6b, 0x7,0x33,0x6e, 0x4,0x53,0x7c, 0x7,0x33,0x68, + 0x5,0x58,0x4d, 0x6,0x62,0x68, 0xf,0x54,0x32, 0xf,0x57,0x7b, + 0xf,0x57,0x7c, 0xf,0x57,0x7d, 0xf,0x57,0x7e, 0xf,0x58,0x21, + 0xf,0x58,0x22, 0x7,0x33,0x6d, 0x7,0x33,0x6c, 0x7,0x33,0x65, + 0x7,0x33,0x69, 0x5,0x58,0x50, 0x7,0x3c,0x32, 0x5,0x5e,0x65, + 0x5,0x5b,0x2d, 0x5,0x5e,0x67, 0x5,0x58,0x52, 0x5,0x5e,0x66, + 0x4,0x58,0x7b, 0x7,0x3c,0x38, 0x7,0x3c,0x34, 0x7,0x3c,0x36, + 0x7,0x3c,0x37, 0x7,0x3c,0x35, 0xf,0x5c,0x6e, 0xf,0x5c,0x70, + 0xf,0x5c,0x6f, 0x7,0x43,0x4b, 0x5,0x64,0x73, 0x7,0x43,0x4e, + 0x5,0x64,0x6f, 0x7,0x43,0x49, 0x7,0x43,0x4a, 0x7,0x43,0x51, + 0x5,0x64,0x71, 0x5,0x64,0x6e, 0x5,0x64,0x72, 0x7,0x43,0x4d, + 0x7,0x43,0x4c, 0xf,0x60,0x76, 0xf,0x60,0x77, 0xf,0x60,0x78, + 0xf,0x60,0x79, 0xf,0x60,0x7b, 0xf,0x60,0x7c, 0x7,0x43,0x48, + 0x7,0x43,0x50, 0x5,0x64,0x70, 0x7,0x4a,0x47, 0x7,0x4a,0x4b, + 0x5,0x69,0x5d, 0x5,0x64,0x74, 0x7,0x4a,0x4a, 0x7,0x43,0x4f, + 0x5,0x69,0x5c, 0x4,0x61,0x4b, 0x7,0x4a,0x48, 0x5,0x69,0x5e, + 0x7,0x4a,0x4d, 0x7,0x4a,0x4c, 0x5,0x69,0x60, 0x7,0x4a,0x44, + 0x7,0x4a,0x49, 0x7,0x4a,0x46, 0xf,0x63,0x7c, 0xf,0x63,0x7d, + 0xf,0x63,0x7e, 0xf,0x64,0x21, 0x7,0x4a,0x4e, 0x7,0x4a,0x45, + 0x5,0x69,0x5f, 0x4,0x64,0x51, 0x5,0x6d,0x70, 0x4,0x64,0x50, + 0x5,0x6d,0x6f, 0x7,0x50,0x3e, 0x7,0x50,0x40, 0xf,0x66,0x3b, + 0xf,0x66,0x3c, 0xf,0x66,0x3d, 0xf,0x66,0x3e, 0xf,0x66,0x3f, + 0x7,0x50,0x3f, 0x5,0x71,0x43, 0x4,0x67,0x47, 0x5,0x71,0x44, + 0x5,0x71,0x45, 0xf,0x68,0x4e, 0xf,0x68,0x4f, 0x7,0x55,0x3b, + 0x7,0x59,0x47, 0x5,0x74,0x45, 0x5,0x74,0x44, 0xf,0x69,0x76, + 0xf,0x69,0x77, 0xf,0x69,0x78, 0x7,0x59,0x4a, 0x7,0x59,0x48, + 0x7,0x59,0x49, 0xf,0x68,0x4d, 0x7,0x5c,0x71, 0x4,0x6b,0x22, + 0x5,0x74,0x43, 0x7,0x5c,0x72, 0xf,0x6a,0x78, 0x7,0x5c,0x73, + 0x7,0x5f,0x5e, 0x7,0x5f,0x60, 0x7,0x5f,0x5f, 0x7,0x62,0x66, + 0x6,0x2e,0x31, 0x6,0x34,0x57, 0x6,0x34,0x58, 0x5,0x35,0x66, + 0xf,0x38,0x61, 0x6,0x4f,0x30, 0x4,0x3b,0x44, 0x6,0x58,0x63, + 0xf,0x45,0x4f, 0x5,0x4a,0x2a, 0xf,0x4c,0x52, 0x7,0x29,0x3a, + 0x5,0x58,0x54, 0x5,0x58,0x53, 0xf,0x58,0x23, 0x7,0x33,0x6f, + 0x5,0x5e,0x69, 0x5,0x5e,0x6a, 0x5,0x5e,0x68, 0xf,0x5c,0x71, + 0x5,0x64,0x75, 0x7,0x43,0x53, 0x7,0x4a,0x50, 0x7,0x4a,0x4f, + 0x5,0x71,0x46, 0x7,0x5c,0x74, 0x6,0x2e,0x32, 0x6,0x2e,0x33, + 0x6,0x34,0x59, 0xf,0x2d,0x4b, 0xf,0x2d,0x4d, 0xf,0x2d,0x4e, + 0xf,0x2d,0x4f, 0xf,0x2d,0x50, 0x4,0x2b,0x4b, 0x5,0x30,0x4d, + 0x6,0x3c,0x3e, 0x6,0x3c,0x3d, 0x5,0x30,0x4e, 0x6,0x3c,0x3c, + 0x4,0x30,0x29, 0xf,0x32,0x59, 0xf,0x32,0x5a, 0xf,0x32,0x5b, + 0xf,0x32,0x5c, 0xf,0x32,0x5d, 0x5,0x35,0x6d, 0x6,0x45,0x30, + 0x5,0x35,0x67, 0x4,0x35,0x57, 0x5,0x35,0x6a, 0x5,0x35,0x6f, + 0x5,0x35,0x6e, 0x4,0x35,0x58, 0x6,0x45,0x2e, 0x6,0x45,0x2f, + 0x5,0x35,0x6b, 0x5,0x35,0x68, 0xf,0x38,0x63, 0xf,0x38,0x64, + 0xf,0x38,0x65, 0xf,0x38,0x66, 0xf,0x38,0x68, 0xf,0x38,0x69, + 0xf,0x38,0x62, 0x5,0x35,0x6c, 0x5,0x35,0x69, 0xf,0x38,0x67, + 0x5,0x3c,0x51, 0x5,0x3c,0x50, 0x5,0x3c,0x54, 0x5,0x3c,0x4f, + 0x6,0x4f,0x34, 0x6,0x4f,0x31, 0x5,0x43,0x39, 0x5,0x3c,0x53, + 0x5,0x3c,0x4e, 0x6,0x4f,0x33, 0x4,0x3b,0x46, 0x5,0x3c,0x55, + 0x6,0x58,0x64, 0x6,0x4f,0x35, 0xf,0x3f,0x47, 0xf,0x3f,0x48, + 0xf,0x3f,0x49, 0xf,0x3f,0x4a, 0xf,0x3f,0x4b, 0xf,0x3f,0x4c, + 0xf,0x3f,0x4f, 0xf,0x3f,0x50, 0xf,0x3f,0x51, 0x6,0x4f,0x32, + 0xf,0x3f,0x4e, 0x6,0x58,0x66, 0x5,0x43,0x36, 0x4,0x41,0x23, + 0x6,0x58,0x68, 0x4,0x41,0x25, 0x5,0x43,0x3b, 0x5,0x43,0x35, + 0x5,0x43,0x3d, 0x5,0x43,0x37, 0x4,0x41,0x24, 0x6,0x58,0x6a, + 0x6,0x58,0x69, 0x5,0x43,0x3a, 0xf,0x45,0x50, 0xf,0x45,0x51, + 0xf,0x45,0x52, 0xf,0x45,0x53, 0xf,0x45,0x54, 0xf,0x45,0x55, + 0xf,0x45,0x56, 0xf,0x45,0x57, 0x6,0x58,0x65, 0x6,0x58,0x67, + 0x6,0x62,0x6d, 0xf,0x3f,0x4d, 0x6,0x62,0x6e, 0x4,0x47,0x5c, + 0x5,0x4a,0x2c, 0x5,0x4a,0x30, 0x6,0x62,0x72, 0x5,0x4a,0x2b, + 0x5,0x4a,0x2e, 0x5,0x4a,0x31, 0x6,0x62,0x71, 0x6,0x62,0x6f, + 0x5,0x4a,0x33, 0x4,0x47,0x5d, 0x5,0x4a,0x2f, 0x6,0x62,0x76, + 0x5,0x4a,0x2d, 0x6,0x62,0x73, 0xf,0x4c,0x53, 0xf,0x4c,0x54, + 0xf,0x4c,0x55, 0xf,0x4c,0x56, 0xf,0x4c,0x57, 0xf,0x4c,0x58, + 0xf,0x4c,0x59, 0x6,0x62,0x70, 0x5,0x51,0x42, 0x5,0x51,0x3c, + 0x4,0x4d,0x72, 0x5,0x51,0x3f, 0x5,0x51,0x3e, 0x5,0x51,0x3d, + 0x5,0x51,0x40, 0x7,0x29,0x3f, 0x5,0x51,0x46, 0x5,0x51,0x43, + 0x7,0x29,0x41, 0x5,0x51,0x41, 0x7,0x29,0x3c, 0x7,0x29,0x40, + 0x7,0x29,0x3e, 0x6,0x62,0x74, 0x7,0x29,0x42, 0x7,0x33,0x72, + 0x5,0x51,0x45, 0x5,0x51,0x44, 0xf,0x52,0x40, 0xf,0x52,0x41, + 0x7,0x29,0x43, 0x7,0x29,0x3b, 0xf,0x58,0x2d, 0x4,0x54,0x23, + 0x4,0x54,0x24, 0x4,0x54,0x28, 0x7,0x33,0x74, 0x5,0x58,0x59, + 0x4,0x54,0x21, 0x4,0x54,0x22, 0x4,0x54,0x27, 0x7,0x33,0x75, + 0x4,0x54,0x25, 0x7,0x33,0x71, 0x7,0x33,0x70, 0x5,0x58,0x58, + 0x5,0x58,0x5a, 0x7,0x33,0x76, 0xf,0x58,0x24, 0xf,0x58,0x26, + 0xf,0x58,0x27, 0xf,0x58,0x28, 0xf,0x58,0x29, 0xf,0x58,0x2a, + 0xf,0x58,0x2b, 0xf,0x58,0x2c, 0xf,0x58,0x2e, 0x7,0x33,0x78, + 0x7,0x33,0x77, 0x5,0x58,0x5b, 0x5,0x58,0x56, 0x5,0x58,0x57, + 0x5,0x5e,0x6f, 0x5,0x5e,0x71, 0x4,0x59,0x22, 0x5,0x5e,0x70, + 0x4,0x59,0x24, 0x4,0x59,0x21, 0x5,0x5e,0x72, 0x4,0x58,0x7e, + 0x5,0x5e,0x6c, 0x4,0x59,0x23, 0x5,0x5e,0x6e, 0x5,0x5e,0x6b, + 0x7,0x3c,0x3a, 0x5,0x5e,0x73, 0xf,0x58,0x25, 0xf,0x5c,0x72, + 0xf,0x5c,0x73, 0xf,0x5c,0x74, 0xf,0x5c,0x75, 0xf,0x5c,0x76, + 0x7,0x3c,0x39, 0x5,0x64,0x79, 0x5,0x64,0x7c, 0x4,0x5d,0x6b, + 0x7,0x43,0x57, 0x7,0x43,0x56, 0x5,0x64,0x76, 0x5,0x64,0x7a, + 0x5,0x64,0x78, 0x5,0x64,0x77, 0x5,0x64,0x7d, 0x5,0x64,0x7e, + 0x7,0x43,0x5b, 0x7,0x43,0x5a, 0x5,0x64,0x7b, 0xf,0x60,0x7d, + 0x7,0x43,0x58, 0x7,0x43,0x55, 0x7,0x43,0x59, 0x7,0x43,0x54, + 0x5,0x58,0x5d, 0x5,0x69,0x62, 0x5,0x69,0x66, 0x5,0x69,0x68, + 0x4,0x61,0x4e, 0x4,0x61,0x4c, 0x5,0x69,0x63, 0x5,0x69,0x67, + 0x5,0x69,0x65, 0x5,0x69,0x61, 0x7,0x4a,0x52, 0x5,0x69,0x69, + 0x5,0x69,0x64, 0xf,0x64,0x23, 0xf,0x64,0x24, 0xf,0x64,0x25, + 0x7,0x4a,0x51, 0x7,0x4a,0x53, 0x4,0x64,0x52, 0x4,0x64,0x54, + 0x4,0x64,0x58, 0x4,0x64,0x57, 0x5,0x6d,0x71, 0x7,0x50,0x41, + 0x7,0x50,0x43, 0x5,0x6d,0x72, 0x7,0x50,0x42, 0xf,0x66,0x40, + 0xf,0x66,0x41, 0xf,0x66,0x42, 0x4,0x67,0x49, 0x5,0x71,0x48, + 0x5,0x71,0x49, 0x7,0x55,0x3f, 0x7,0x55,0x3d, 0x7,0x55,0x3c, + 0x7,0x55,0x3e, 0x5,0x71,0x47, 0x5,0x74,0x46, 0x5,0x74,0x49, + 0x4,0x69,0x4d, 0x5,0x74,0x48, 0x5,0x74,0x47, 0xf,0x69,0x79, + 0x5,0x76,0x4f, 0x5,0x76,0x50, 0xf,0x6a,0x79, 0x7,0x59,0x4b, + 0x7,0x5c,0x75, 0x7,0x5c,0x76, 0x5,0x78,0x33, 0x5,0x78,0x34, + 0x5,0x78,0x35, 0x4,0x6d,0x26, 0x7,0x61,0x4e, 0x5,0x7a,0x79, + 0x5,0x7b,0x49, 0x6,0x2e,0x35, 0x6,0x2e,0x34, 0x6,0x34,0x5b, + 0x5,0x2b,0x4d, 0xf,0x2d,0x51, 0x6,0x34,0x5a, 0x6,0x3c,0x41, + 0x4,0x30,0x2b, 0x6,0x3c,0x42, 0x6,0x3c,0x40, 0x5,0x30,0x50, + 0x5,0x30,0x4f, 0x6,0x3c,0x3f, 0x6,0x3c,0x43, 0x4,0x35,0x5f, + 0x6,0x45,0x33, 0x4,0x35,0x5a, 0x5,0x35,0x73, 0x6,0x45,0x37, + 0x5,0x35,0x77, 0x6,0x45,0x3a, 0x5,0x35,0x71, 0x5,0x35,0x75, + 0x6,0x45,0x3c, 0x6,0x45,0x3d, 0x5,0x35,0x74, 0x6,0x45,0x3b, + 0x6,0x45,0x32, 0x6,0x45,0x36, 0xf,0x38,0x6a, 0x6,0x45,0x31, + 0x6,0x45,0x35, 0x6,0x45,0x39, 0x5,0x35,0x76, 0x5,0x35,0x70, + 0x6,0x45,0x34, 0x5,0x3c,0x60, 0x5,0x3c,0x57, 0x5,0x3c,0x58, + 0x5,0x3c,0x5b, 0x6,0x4f,0x3b, 0x5,0x3c,0x56, 0x6,0x4f,0x38, + 0x4,0x3b,0x4e, 0x5,0x3c,0x5d, 0x5,0x3c,0x59, 0x5,0x3c,0x61, + 0x5,0x3c,0x5a, 0x6,0x4f,0x39, 0x6,0x58,0x79, 0x5,0x3c,0x62, + 0xf,0x3f,0x54, 0x6,0x4f,0x37, 0xf,0x3f,0x52, 0x6,0x4f,0x3a, + 0x5,0x3c,0x5e, 0x5,0x43,0x41, 0x5,0x43,0x3f, 0x6,0x58,0x71, + 0x5,0x43,0x40, 0x5,0x43,0x42, 0x6,0x58,0x74, 0x6,0x58,0x70, + 0x5,0x43,0x47, 0x5,0x43,0x45, 0x6,0x58,0x6e, 0x6,0x58,0x6d, + 0x5,0x43,0x3e, 0x6,0x58,0x6f, 0x6,0x58,0x72, 0x6,0x58,0x76, + 0x5,0x43,0x4a, 0x6,0x58,0x6c, 0x6,0x58,0x77, 0x5,0x43,0x43, + 0x5,0x43,0x4c, 0x5,0x43,0x48, 0x6,0x58,0x73, 0x5,0x43,0x49, + 0x5,0x43,0x46, 0x6,0x58,0x75, 0x5,0x4a,0x35, 0xf,0x45,0x59, + 0x6,0x58,0x78, 0x6,0x58,0x6b, 0x6,0x63,0x22, 0x5,0x4a,0x43, + 0x4,0x47,0x60, 0x5,0x4a,0x37, 0x5,0x4a,0x3f, 0x5,0x4a,0x36, + 0x5,0x51,0x4e, 0x5,0x4a,0x3b, 0x6,0x62,0x77, 0x6,0x62,0x7b, + 0x5,0x4a,0x42, 0x5,0x4a,0x3c, 0x5,0x4a,0x39, 0x5,0x4a,0x40, + 0x5,0x4a,0x41, 0x5,0x4a,0x3d, 0x5,0x43,0x44, 0x5,0x4a,0x38, + 0x5,0x4a,0x44, 0x6,0x62,0x7e, 0x5,0x4a,0x46, 0x6,0x62,0x79, + 0x5,0x4a,0x47, 0xf,0x4c,0x5a, 0xf,0x4c,0x5b, 0x6,0x62,0x78, + 0x6,0x62,0x7a, 0x6,0x62,0x7d, 0x6,0x63,0x21, 0x6,0x62,0x7c, + 0x5,0x4a,0x3a, 0x7,0x29,0x46, 0x4,0x4d,0x7a, 0x5,0x51,0x4c, + 0x5,0x51,0x47, 0x5,0x51,0x4a, 0x5,0x51,0x4f, 0x7,0x29,0x45, + 0x7,0x29,0x49, 0x4,0x4d,0x7c, 0x7,0x29,0x4d, 0x4,0x4d,0x7b, + 0x5,0x51,0x4b, 0x5,0x51,0x4d, 0x4,0x4e,0x24, 0x5,0x51,0x51, + 0x5,0x51,0x52, 0x4,0x47,0x63, 0x7,0x29,0x4f, 0x5,0x51,0x49, + 0x7,0x29,0x4b, 0xf,0x52,0x42, 0xf,0x52,0x43, 0xf,0x52,0x44, + 0xf,0x52,0x45, 0x7,0x29,0x48, 0x7,0x29,0x4c, 0x7,0x29,0x47, + 0x7,0x29,0x4a, 0x5,0x51,0x50, 0x5,0x51,0x54, 0x5,0x51,0x55, + 0x5,0x4a,0x45, 0x7,0x34,0x21, 0x5,0x58,0x60, 0x5,0x4a,0x48, + 0x5,0x58,0x69, 0x4,0x54,0x2a, 0x7,0x33,0x7a, 0x5,0x58,0x63, + 0x7,0x33,0x7e, 0x7,0x34,0x23, 0x7,0x33,0x7c, 0x5,0x58,0x5f, + 0x7,0x33,0x7b, 0x7,0x34,0x25, 0x5,0x51,0x53, 0x7,0x34,0x26, + 0x5,0x58,0x67, 0x5,0x58,0x68, 0x5,0x58,0x5e, 0x5,0x58,0x61, + 0x7,0x33,0x7d, 0x5,0x58,0x65, 0x5,0x58,0x64, 0x7,0x34,0x24, + 0x4,0x54,0x2b, 0x5,0x58,0x66, 0x4,0x54,0x2c, 0xf,0x58,0x31, + 0xf,0x58,0x32, 0x7,0x34,0x22, 0x5,0x5e,0x7a, 0x5,0x5e,0x7d, + 0x5,0x5e,0x75, 0x7,0x3c,0x40, 0x5,0x5e,0x76, 0x5,0x5e,0x7c, + 0x5,0x5e,0x78, 0x4,0x59,0x29, 0x7,0x3c,0x3e, 0x7,0x43,0x67, + 0x7,0x3c,0x43, 0x5,0x5e,0x7e, 0x4,0x59,0x2e, 0x7,0x3c,0x3b, + 0x7,0x3c,0x42, 0x7,0x3c,0x44, 0x5,0x5e,0x79, 0x4,0x59,0x27, + 0x7,0x3c,0x41, 0x7,0x34,0x27, 0x7,0x3c,0x3f, 0x4,0x59,0x2f, + 0xf,0x5c,0x77, 0x7,0x3c,0x3d, 0xf,0x5c,0x79, 0x5,0x5e,0x77, + 0x5,0x5e,0x74, 0x7,0x43,0x62, 0x4,0x5d,0x70, 0x7,0x43,0x66, + 0x4,0x5d,0x6f, 0x5,0x65,0x21, 0x5,0x65,0x22, 0x5,0x65,0x2d, + 0x5,0x65,0x26, 0x4,0x5d,0x71, 0x5,0x65,0x2c, 0x5,0x65,0x28, + 0x7,0x43,0x5f, 0x5,0x69,0x70, 0x7,0x43,0x65, 0x7,0x43,0x5c, + 0x5,0x65,0x2e, 0x7,0x43,0x5e, 0x5,0x65,0x24, 0x7,0x43,0x61, + 0x5,0x65,0x23, 0x5,0x65,0x29, 0x4,0x5f,0x33, 0x4,0x5d,0x76, + 0x5,0x65,0x25, 0xf,0x60,0x7e, 0xf,0x61,0x21, 0xf,0x61,0x22, + 0xf,0x61,0x23, 0xf,0x61,0x24, 0xf,0x61,0x25, 0x7,0x43,0x6b, + 0x5,0x65,0x27, 0x7,0x43,0x60, 0x7,0x43,0x69, 0x7,0x43,0x68, + 0x7,0x43,0x6a, 0x7,0x43,0x5d, 0x5,0x65,0x2b, 0x7,0x43,0x63, + 0x7,0x3c,0x3c, 0x5,0x65,0x2f, 0x5,0x69,0x6a, 0x7,0x4a,0x65, + 0x5,0x69,0x6f, 0x5,0x69,0x71, 0x7,0x4a,0x68, 0x5,0x69,0x74, + 0x7,0x4a,0x5b, 0x5,0x65,0x2a, 0x5,0x69,0x6e, 0x7,0x4a,0x58, + 0x5,0x69,0x6d, 0x5,0x69,0x72, 0x4,0x61,0x55, 0x7,0x4a,0x54, + 0x4,0x5d,0x73, 0x7,0x4a,0x59, 0x7,0x43,0x64, 0x7,0x4a,0x5e, + 0x5,0x69,0x73, 0x7,0x4a,0x5a, 0x7,0x4a,0x66, 0x7,0x4a,0x55, + 0x7,0x4a,0x5c, 0x5,0x69,0x6b, 0x5,0x69,0x6c, 0x7,0x4a,0x61, + 0x7,0x4a,0x62, 0x7,0x4a,0x63, 0x7,0x4a,0x5f, 0x5,0x69,0x76, + 0x5,0x69,0x75, 0x7,0x4a,0x60, 0x7,0x4a,0x5d, 0x7,0x4a,0x67, + 0x7,0x4a,0x56, 0x7,0x4a,0x64, 0x4,0x61,0x53, 0x4,0x64,0x59, + 0x5,0x6d,0x7d, 0x5,0x6d,0x77, 0x7,0x50,0x44, 0x5,0x6d,0x7b, + 0x5,0x6d,0x76, 0x5,0x6d,0x79, 0x7,0x50,0x48, 0x7,0x50,0x46, + 0x4,0x64,0x5c, 0x5,0x6d,0x73, 0x4,0x64,0x5d, 0x7,0x50,0x47, + 0x5,0x6d,0x78, 0x5,0x6d,0x75, 0x5,0x6d,0x74, 0x7,0x50,0x49, + 0xf,0x66,0x43, 0xf,0x66,0x44, 0xf,0x66,0x45, 0xf,0x66,0x46, + 0xf,0x66,0x47, 0x7,0x50,0x45, 0x7,0x50,0x4a, 0x7,0x50,0x4b, + 0x5,0x6d,0x7c, 0x5,0x6d,0x7e, 0x5,0x6d,0x7a, 0x4,0x67,0x4e, + 0x7,0x55,0x42, 0x4,0x67,0x4f, 0x5,0x71,0x4b, 0x7,0x55,0x41, + 0x7,0x55,0x44, 0x4,0x67,0x4d, 0x4,0x67,0x4b, 0x5,0x71,0x4c, + 0x7,0x55,0x43, 0x7,0x55,0x40, 0x5,0x71,0x4a, 0xf,0x68,0x51, + 0xf,0x68,0x52, 0x5,0x74,0x4a, 0x7,0x55,0x45, 0x7,0x59,0x4c, + 0x5,0x74,0x4d, 0x5,0x74,0x4f, 0x5,0x74,0x4e, 0x5,0x74,0x4c, + 0x7,0x59,0x4d, 0x5,0x74,0x51, 0x7,0x59,0x4e, 0xf,0x69,0x7a, + 0x7,0x59,0x4f, 0x5,0x74,0x50, 0x5,0x76,0x54, 0x5,0x76,0x52, + 0x5,0x76,0x55, 0x7,0x5c,0x79, 0x7,0x5c,0x78, 0x5,0x76,0x53, + 0x5,0x76,0x51, 0x4,0x6c,0x2b, 0x7,0x5f,0x61, 0x5,0x78,0x37, + 0x5,0x78,0x36, 0x4,0x6c,0x2a, 0x5,0x78,0x38, 0x7,0x5f,0x62, + 0x7,0x61,0x4f, 0x7,0x5f,0x63, 0x7,0x61,0x52, 0x4,0x6d,0x28, + 0x7,0x61,0x54, 0x7,0x62,0x67, 0x7,0x61,0x53, 0x7,0x61,0x51, + 0x7,0x61,0x50, 0xf,0x6b,0x67, 0x5,0x7a,0x3c, 0x5,0x7a,0x3b, + 0x5,0x7a,0x3d, 0x7,0x63,0x76, 0x5,0x7b,0x4a, 0x7,0x64,0x63, + 0x5,0x7b,0x6a, 0xf,0x6d,0x28, 0x7,0x65,0x65, 0xf,0x6d,0x33, + 0x6,0x23,0x39, 0x6,0x23,0x3a, 0x6,0x25,0x55, 0x5,0x30,0x52, + 0x6,0x3c,0x44, 0x5,0x30,0x51, 0x5,0x35,0x7a, 0x5,0x35,0x79, + 0x5,0x35,0x78, 0x6,0x45,0x3e, 0x6,0x45,0x41, 0x6,0x45,0x40, + 0x6,0x45,0x42, 0x6,0x45,0x3f, 0x6,0x45,0x43, 0x6,0x45,0x44, + 0x4,0x35,0x60, 0xf,0x38,0x6b, 0x5,0x3c,0x65, 0x6,0x4f,0x3f, + 0x5,0x3c,0x64, 0x6,0x4f,0x41, 0x6,0x4f,0x3e, 0x5,0x3c,0x66, + 0xf,0x3f,0x55, 0xf,0x3f,0x56, 0xf,0x3f,0x57, 0xf,0x3f,0x58, + 0x6,0x4f,0x3d, 0x6,0x4f,0x40, 0x6,0x58,0x7d, 0x5,0x43,0x4d, + 0x6,0x58,0x7a, 0x6,0x58,0x7e, 0x6,0x59,0x21, 0xf,0x45,0x5a, + 0xf,0x45,0x5b, 0xf,0x45,0x5c, 0x6,0x58,0x7b, 0x6,0x58,0x7c, + 0x6,0x59,0x22, 0x5,0x4a,0x4a, 0x6,0x63,0x23, 0x6,0x63,0x24, + 0x5,0x4a,0x49, 0x6,0x63,0x25, 0x6,0x63,0x26, 0xf,0x4c,0x5c, + 0xf,0x4c,0x5d, 0xf,0x4c,0x5e, 0x7,0x29,0x51, 0x5,0x51,0x56, + 0x4,0x4e,0x25, 0xf,0x52,0x46, 0xf,0x52,0x48, 0x7,0x29,0x50, + 0x5,0x58,0x6a, 0x4,0x54,0x31, 0x5,0x58,0x6b, 0x7,0x34,0x28, + 0x7,0x3c,0x46, 0xf,0x58,0x34, 0xf,0x58,0x36, 0x7,0x3c,0x48, + 0x7,0x3c,0x47, 0x7,0x3c,0x45, 0x5,0x5f,0x21, 0xf,0x5c,0x7a, + 0xf,0x5c,0x7b, 0x5,0x65,0x30, 0x7,0x43,0x6c, 0xf,0x61,0x26, + 0xf,0x61,0x27, 0x7,0x4a,0x6c, 0x7,0x4a,0x6d, 0x7,0x4a,0x6a, + 0xf,0x64,0x26, 0xf,0x64,0x27, 0x7,0x4a,0x6b, 0x7,0x4a,0x69, + 0x4,0x64,0x5e, 0x7,0x50,0x4d, 0xf,0x66,0x48, 0xf,0x66,0x49, + 0x7,0x50,0x4e, 0x7,0x55,0x46, 0x5,0x71,0x4d, 0x7,0x55,0x47, + 0x7,0x55,0x48, 0x7,0x55,0x49, 0x7,0x59,0x50, 0xf,0x69,0x7c, + 0x5,0x76,0x56, 0x5,0x79,0x51, 0x6,0x34,0x5c, 0x5,0x2b,0x4e, + 0x6,0x34,0x5e, 0xf,0x2d,0x52, 0xf,0x2d,0x54, 0x6,0x3c,0x45, + 0x5,0x30,0x54, 0x6,0x3c,0x47, 0xf,0x32,0x5f, 0xf,0x32,0x60, + 0x6,0x3c,0x46, 0x5,0x30,0x53, 0xf,0x32,0x5e, 0x5,0x35,0x7b, + 0x6,0x45,0x4e, 0x6,0x45,0x4d, 0x6,0x45,0x46, 0x4,0x35,0x64, + 0x5,0x36,0x22, 0x5,0x36,0x21, 0x6,0x45,0x4a, 0x5,0x35,0x7d, + 0x6,0x45,0x47, 0x6,0x45,0x4c, 0x6,0x45,0x4b, 0x5,0x35,0x7c, + 0x5,0x35,0x7e, 0xf,0x38,0x6d, 0x6,0x45,0x48, 0x6,0x45,0x49, + 0x4,0x35,0x65, 0x6,0x4f,0x46, 0x6,0x4f,0x47, 0x5,0x3c,0x70, + 0x5,0x3c,0x6e, 0x6,0x4f,0x45, 0x6,0x4f,0x44, 0x6,0x4f,0x42, + 0x5,0x36,0x23, 0x5,0x3c,0x6d, 0x5,0x3c,0x68, 0x5,0x3c,0x6b, + 0x5,0x3c,0x6a, 0x6,0x4f,0x43, 0x5,0x3c,0x69, 0x5,0x3c,0x71, + 0x5,0x3c,0x6c, 0x5,0x3c,0x6f, 0x6,0x59,0x23, 0x6,0x59,0x28, + 0x5,0x43,0x53, 0x6,0x59,0x26, 0x6,0x59,0x29, 0x5,0x43,0x51, + 0x4,0x41,0x2b, 0x5,0x43,0x52, 0x5,0x43,0x4f, 0x6,0x59,0x27, + 0x5,0x43,0x4e, 0xf,0x45,0x5d, 0xf,0x45,0x5e, 0xf,0x45,0x5f, + 0x6,0x59,0x25, 0x4,0x41,0x2d, 0x5,0x43,0x54, 0x6,0x63,0x2d, + 0x6,0x63,0x2f, 0x5,0x4a,0x50, 0x4,0x47,0x68, 0x6,0x63,0x28, + 0x6,0x63,0x2b, 0x5,0x4a,0x4d, 0x6,0x63,0x2c, 0x6,0x63,0x27, + 0x6,0x63,0x30, 0x5,0x4a,0x4b, 0x5,0x4a,0x4e, 0x6,0x63,0x31, + 0x6,0x63,0x2e, 0xf,0x4c,0x5f, 0xf,0x4c,0x60, 0xf,0x4c,0x61, + 0xf,0x4c,0x63, 0x5,0x4a,0x4f, 0x5,0x4a,0x4c, 0x7,0x29,0x59, + 0x6,0x63,0x2a, 0x5,0x51,0x60, 0x7,0x29,0x57, 0x7,0x29,0x5e, + 0x7,0x29,0x62, 0x7,0x29,0x56, 0x5,0x51,0x59, 0x7,0x29,0x5a, + 0x7,0x29,0x55, 0x7,0x29,0x5c, 0x5,0x51,0x58, 0x5,0x51,0x5b, + 0x5,0x51,0x5e, 0x4,0x4e,0x2c, 0x6,0x63,0x29, 0x7,0x29,0x58, + 0x7,0x29,0x5d, 0x7,0x29,0x5b, 0x5,0x51,0x5d, 0x5,0x51,0x5f, + 0x7,0x29,0x52, 0x5,0x51,0x57, 0x7,0x29,0x54, 0x7,0x29,0x63, + 0xf,0x52,0x49, 0xf,0x52,0x4a, 0xf,0x52,0x4b, 0xf,0x52,0x4c, + 0x7,0x29,0x53, 0x7,0x29,0x5f, 0x7,0x29,0x60, 0x7,0x29,0x61, + 0x5,0x51,0x5c, 0x5,0x51,0x5a, 0x7,0x34,0x29, 0x5,0x58,0x73, + 0x7,0x34,0x2f, 0x5,0x58,0x74, 0x7,0x34,0x2d, 0x5,0x58,0x70, + 0x7,0x34,0x2b, 0x7,0x34,0x34, 0x5,0x58,0x6e, 0x5,0x58,0x71, + 0x5,0x58,0x6d, 0x7,0x34,0x35, 0x7,0x34,0x30, 0x7,0x34,0x36, + 0x5,0x58,0x6c, 0x7,0x34,0x33, 0xf,0x58,0x37, 0xf,0x58,0x39, + 0xf,0x58,0x3a, 0x7,0x34,0x2c, 0x7,0x34,0x2e, 0x7,0x34,0x2a, + 0xf,0x58,0x38, 0x4,0x54,0x35, 0x5,0x58,0x6f, 0x7,0x3c,0x4a, + 0x7,0x3c,0x52, 0x5,0x5f,0x25, 0x7,0x3c,0x4d, 0x7,0x3c,0x4c, + 0x7,0x3c,0x4b, 0x7,0x3c,0x53, 0x4,0x59,0x33, 0x7,0x3c,0x50, + 0x4,0x59,0x34, 0x7,0x3c,0x51, 0x5,0x5f,0x22, 0x5,0x5f,0x2b, + 0x4,0x59,0x36, 0x5,0x5f,0x28, 0x5,0x5f,0x27, 0x7,0x3c,0x54, + 0x5,0x5f,0x24, 0x5,0x5f,0x2a, 0x7,0x3c,0x49, 0xf,0x5c,0x7c, + 0xf,0x5c,0x7d, 0x7,0x3c,0x4e, 0x7,0x3c,0x4f, 0x5,0x5f,0x26, + 0x5,0x5f,0x23, 0x5,0x5f,0x29, 0x4,0x5d,0x79, 0x7,0x43,0x70, + 0x4,0x5e,0x21, 0x5,0x65,0x32, 0x5,0x65,0x34, 0xf,0x61,0x28, + 0xf,0x61,0x29, 0xf,0x61,0x2a, 0x7,0x43,0x6f, 0x7,0x43,0x72, + 0x7,0x43,0x71, 0x7,0x43,0x6e, 0x7,0x43,0x6d, 0x5,0x65,0x31, + 0x5,0x65,0x33, 0x5,0x69,0x78, 0x7,0x4a,0x6e, 0x7,0x4a,0x71, + 0x7,0x4a,0x6f, 0x7,0x4a,0x70, 0x5,0x69,0x7a, 0x4,0x61,0x5a, + 0x4,0x61,0x5b, 0x5,0x69,0x79, 0x5,0x69,0x77, 0x5,0x69,0x7b, + 0x7,0x4a,0x72, 0xf,0x64,0x28, 0x7,0x4a,0x74, 0x4,0x64,0x62, + 0x5,0x6e,0x25, 0x5,0x6e,0x23, 0x7,0x50,0x53, 0x5,0x6e,0x24, + 0x5,0x6e,0x22, 0x7,0x50,0x51, 0x5,0x6e,0x21, 0xf,0x66,0x4a, + 0x7,0x50,0x52, 0x7,0x50,0x50, 0x7,0x50,0x4f, 0x5,0x6e,0x26, + 0x7,0x50,0x54, 0x4,0x67,0x53, 0x5,0x71,0x4e, 0x4,0x67,0x54, + 0x7,0x55,0x4c, 0x7,0x55,0x4b, 0x7,0x55,0x4a, 0x7,0x59,0x56, + 0x4,0x69,0x50, 0x7,0x59,0x52, 0x7,0x59,0x51, 0x4,0x69,0x51, + 0x7,0x59,0x57, 0x7,0x59,0x53, 0x7,0x59,0x54, 0x7,0x59,0x55, + 0x7,0x5c,0x7e, 0x7,0x5d,0x21, 0x5,0x76,0x57, 0x7,0x5c,0x7b, + 0x7,0x5c,0x7a, 0x7,0x5c,0x7c, 0x7,0x5c,0x7d, 0x5,0x76,0x59, + 0x5,0x76,0x58, 0x5,0x78,0x3c, 0x5,0x78,0x3b, 0x5,0x78,0x3a, + 0x7,0x5f,0x67, 0x7,0x5f,0x65, 0x7,0x5f,0x64, 0x5,0x78,0x39, + 0x7,0x5f,0x66, 0x5,0x79,0x53, 0x5,0x79,0x52, 0x5,0x7a,0x3e, + 0x5,0x7a,0x3f, 0x7,0x62,0x68, 0x5,0x7a,0x7a, 0x7,0x64,0x64, + 0x7,0x62,0x69, 0x7,0x63,0x77, 0x5,0x7b,0x6b, 0x7,0x65,0x66, + 0x6,0x29,0x2b, 0x6,0x2e,0x36, 0x6,0x3c,0x48, 0x6,0x45,0x4f, + 0x5,0x36,0x25, 0x5,0x36,0x24, 0x4,0x41,0x2e, 0x6,0x59,0x2a, + 0xf,0x45,0x61, 0x5,0x4a,0x51, 0xf,0x4c,0x65, 0xf,0x4c,0x66, + 0x5,0x4a,0x52, 0x7,0x29,0x64, 0x7,0x29,0x65, 0x7,0x29,0x66, + 0x5,0x51,0x62, 0x7,0x34,0x37, 0x5,0x58,0x75, 0x7,0x34,0x38, + 0xf,0x58,0x3b, 0x5,0x5f,0x2d, 0x5,0x5f,0x2c, 0xf,0x5c,0x7e, + 0xf,0x5d,0x21, 0xf,0x5d,0x22, 0xf,0x5d,0x23, 0x5,0x5f,0x2e, + 0x5,0x65,0x37, 0x5,0x65,0x36, 0x7,0x43,0x73, 0x7,0x4a,0x75, + 0x4,0x61,0x5c, 0x7,0x4a,0x76, 0xf,0x66,0x4b, 0x7,0x50,0x55, + 0xf,0x68,0x54, 0x7,0x59,0x58, 0x7,0x5f,0x68, 0x7,0x65,0x47, + 0x7,0x65,0x67, 0x6,0x29,0x2c, 0x6,0x2e,0x37, 0x6,0x59,0x2d, + 0x6,0x59,0x2c, 0x6,0x59,0x2b, 0xf,0x52,0x4d, 0x7,0x33,0x21, + 0x4,0x61,0x5d, 0x7,0x55,0x4d, 0x6,0x25,0x59, 0x6,0x25,0x58, + 0x6,0x25,0x57, 0x4,0x24,0x7e, 0x6,0x29,0x2d, 0x4,0x25,0x24, + 0x6,0x3c,0x49, 0x6,0x29,0x2e, 0xf,0x25,0x33, 0xf,0x25,0x34, + 0x6,0x3c,0x4a, 0x6,0x29,0x2f, 0x5,0x24,0x78, 0x6,0x3c,0x4b, + 0x6,0x45,0x50, 0x5,0x27,0x6a, 0x5,0x27,0x6b, 0x5,0x27,0x70, + 0x6,0x2e,0x38, 0x6,0x2e,0x3d, 0x5,0x27,0x6f, 0x4,0x28,0x25, + 0x5,0x27,0x71, 0x5,0x27,0x6d, 0x4,0x28,0x28, 0x6,0x2e,0x3b, + 0xf,0x28,0x6d, 0xf,0x28,0x6f, 0xf,0x28,0x70, 0xf,0x28,0x73, + 0xf,0x28,0x74, 0xf,0x28,0x75, 0x6,0x2e,0x3a, 0x6,0x2e,0x3f, + 0x5,0x27,0x6e, 0x5,0x27,0x68, 0x6,0x2e,0x3c, 0x5,0x27,0x6c, + 0x6,0x2e,0x39, 0x6,0x2e,0x3e, 0x5,0x2b,0x4f, 0x5,0x2b,0x56, + 0x5,0x2b,0x52, 0x6,0x34,0x5f, 0x5,0x2b,0x51, 0x6,0x34,0x62, + 0x5,0x2b,0x55, 0x5,0x2b,0x53, 0x4,0x2b,0x4f, 0x4,0x2b,0x51, + 0x5,0x2b,0x50, 0x6,0x34,0x64, 0x6,0x34,0x63, 0xf,0x2d,0x55, + 0xf,0x2d,0x56, 0xf,0x2d,0x57, 0xf,0x2d,0x58, 0xf,0x2d,0x59, + 0x4,0x2b,0x52, 0x6,0x34,0x65, 0x6,0x34,0x61, 0x6,0x4a,0x47, + 0x5,0x2b,0x57, 0x5,0x2b,0x54, 0x6,0x3c,0x54, 0x6,0x3c,0x58, + 0x5,0x30,0x5b, 0x6,0x3c,0x53, 0x5,0x30,0x56, 0x5,0x30,0x5a, + 0x4,0x30,0x31, 0x5,0x30,0x57, 0x5,0x30,0x59, 0x6,0x3c,0x52, + 0x6,0x3c,0x4c, 0x6,0x3c,0x56, 0x4,0x30,0x32, 0x6,0x3c,0x57, + 0x6,0x3c,0x4d, 0x5,0x43,0x55, 0x6,0x3c,0x55, 0x5,0x30,0x58, + 0x6,0x3c,0x50, 0x6,0x3c,0x4e, 0x5,0x30,0x5c, 0x5,0x36,0x27, + 0x5,0x36,0x26, 0x6,0x3c,0x4f, 0x6,0x45,0x5b, 0x5,0x36,0x2c, + 0x4,0x35,0x6a, 0x6,0x45,0x5c, 0x5,0x36,0x2b, 0x6,0x3c,0x51, + 0x5,0x36,0x29, 0x6,0x45,0x57, 0x6,0x45,0x5a, 0xf,0x38,0x70, + 0xf,0x38,0x71, 0xf,0x38,0x72, 0x6,0x45,0x56, 0x6,0x45,0x54, + 0x6,0x45,0x55, 0x6,0x45,0x52, 0x6,0x45,0x5d, 0x6,0x45,0x58, + 0x6,0x45,0x53, 0x5,0x36,0x2a, 0x4,0x35,0x67, 0x6,0x45,0x59, + 0x5,0x36,0x2d, 0x5,0x36,0x28, 0xf,0x38,0x6f, 0x6,0x45,0x51, + 0x5,0x3c,0x76, 0x5,0x3c,0x72, 0x5,0x3c,0x78, 0x5,0x3c,0x77, + 0x4,0x3b,0x56, 0x6,0x4f,0x53, 0x4,0x3b,0x5a, 0x4,0x3b,0x58, + 0x5,0x3c,0x79, 0x6,0x4f,0x52, 0x7,0x29,0x67, 0x6,0x4f,0x4d, + 0x6,0x4f,0x4c, 0x6,0x4f,0x50, 0x6,0x4f,0x4f, 0x4,0x3b,0x5b, + 0x6,0x4f,0x49, 0x6,0x4f,0x4b, 0xf,0x3f,0x62, 0x6,0x4f,0x51, + 0x6,0x4f,0x54, 0x6,0x4f,0x55, 0x6,0x4f,0x4a, 0xf,0x3f,0x59, + 0xf,0x3f,0x5a, 0xf,0x3f,0x5b, 0xf,0x3f,0x5c, 0xf,0x3f,0x5d, + 0xf,0x3f,0x5f, 0xf,0x3f,0x60, 0xf,0x3f,0x61, 0x5,0x3c,0x75, + 0x6,0x4f,0x4e, 0x5,0x3c,0x74, 0x5,0x3c,0x73, 0x4,0x3b,0x59, + 0x6,0x4f,0x56, 0x6,0x59,0x40, 0x6,0x59,0x34, 0x6,0x59,0x3d, + 0x6,0x59,0x30, 0x4,0x41,0x31, 0x4,0x41,0x30, 0x6,0x59,0x2e, + 0x5,0x43,0x59, 0x6,0x59,0x31, 0x6,0x59,0x41, 0x6,0x59,0x3b, + 0x6,0x59,0x3f, 0x6,0x59,0x37, 0x6,0x59,0x35, 0x6,0x59,0x43, + 0x6,0x59,0x42, 0x5,0x3c,0x7a, 0x4,0x41,0x32, 0x6,0x59,0x33, + 0x6,0x59,0x3e, 0xf,0x45,0x62, 0xf,0x45,0x63, 0xf,0x45,0x64, + 0xf,0x45,0x65, 0xf,0x45,0x66, 0xf,0x45,0x67, 0xf,0x45,0x68, + 0xf,0x45,0x69, 0xf,0x45,0x6a, 0xf,0x45,0x6b, 0xf,0x45,0x6c, + 0x6,0x59,0x32, 0x6,0x59,0x36, 0x6,0x59,0x3c, 0x6,0x59,0x39, + 0x6,0x59,0x38, 0x6,0x59,0x3a, 0x6,0x59,0x2f, 0x5,0x43,0x58, + 0x5,0x43,0x57, 0x5,0x43,0x56, 0x6,0x63,0x35, 0x6,0x63,0x34, + 0x6,0x63,0x37, 0x6,0x63,0x32, 0x6,0x63,0x3a, 0x5,0x4a,0x54, + 0x6,0x63,0x36, 0x6,0x63,0x38, 0x6,0x63,0x3c, 0x5,0x4a,0x53, + 0x5,0x4a,0x56, 0x6,0x63,0x33, 0x6,0x63,0x3b, 0x7,0x3c,0x55, + 0xf,0x4c,0x69, 0xf,0x4c,0x6a, 0xf,0x4c,0x6c, 0xf,0x4c,0x6d, + 0xf,0x4c,0x6e, 0xf,0x4c,0x6f, 0xf,0x4c,0x70, 0xf,0x4c,0x71, + 0xf,0x4c,0x72, 0x6,0x63,0x39, 0x7,0x3c,0x56, 0x7,0x3c,0x57, + 0x7,0x3c,0x58, 0x5,0x4a,0x55, 0x7,0x29,0x6e, 0x7,0x29,0x6c, + 0x7,0x29,0x72, 0x7,0x29,0x69, 0x7,0x29,0x6b, 0x4,0x4e,0x2f, + 0x5,0x51,0x64, 0x4,0x4e,0x30, 0x5,0x51,0x68, 0x5,0x51,0x65, + 0x4,0x4e,0x34, 0x7,0x29,0x70, 0xf,0x52,0x4e, 0xf,0x52,0x4f, + 0xf,0x52,0x50, 0xf,0x52,0x51, 0xf,0x52,0x52, 0x5,0x51,0x6d, + 0x7,0x29,0x6a, 0x7,0x29,0x6f, 0x7,0x29,0x74, 0x7,0x29,0x75, + 0x7,0x29,0x71, 0x7,0x29,0x73, 0x7,0x43,0x74, 0x7,0x29,0x68, + 0x7,0x43,0x75, 0x7,0x29,0x6d, 0x5,0x51,0x69, 0x5,0x51,0x67, + 0x5,0x51,0x6c, 0x5,0x51,0x66, 0x5,0x51,0x6a, 0x5,0x51,0x6b, + 0x5,0x51,0x63, 0x7,0x34,0x46, 0x5,0x58,0x7c, 0x5,0x58,0x7b, + 0x5,0x58,0x79, 0x7,0x34,0x41, 0x5,0x58,0x77, 0x7,0x34,0x45, + 0x7,0x34,0x3e, 0x7,0x34,0x47, 0x4,0x54,0x36, 0x7,0x34,0x42, + 0x7,0x34,0x44, 0x7,0x34,0x39, 0x7,0x34,0x4a, 0x7,0x4a,0x77, + 0x7,0x34,0x3c, 0x7,0x34,0x40, 0x7,0x34,0x4c, 0xf,0x58,0x3c, + 0xf,0x58,0x3d, 0xf,0x58,0x3e, 0x7,0x34,0x3d, 0xf,0x58,0x3f, + 0x7,0x2c,0x5a, 0x7,0x34,0x48, 0x7,0x34,0x3b, 0x7,0x34,0x3a, + 0x7,0x34,0x43, 0x7,0x34,0x4b, 0x5,0x58,0x78, 0x5,0x58,0x7d, + 0x5,0x58,0x7a, 0x7,0x34,0x3f, 0x5,0x58,0x76, 0x5,0x5f,0x2f, + 0x4,0x59,0x3a, 0x7,0x3c,0x60, 0x5,0x5f,0x33, 0x7,0x3c,0x5d, + 0x5,0x5f,0x34, 0x7,0x3c,0x5b, 0x7,0x50,0x57, 0x7,0x34,0x49, + 0x7,0x3c,0x62, 0x7,0x3c,0x5e, 0x5,0x5f,0x32, 0x5,0x5f,0x35, + 0xf,0x5d,0x24, 0xf,0x5d,0x26, 0xf,0x5d,0x27, 0xf,0x5d,0x28, + 0x7,0x3c,0x59, 0x7,0x3c,0x5c, 0x7,0x3c,0x5f, 0x7,0x3c,0x63, + 0xf,0x5d,0x25, 0x5,0x5f,0x36, 0x5,0x5f,0x37, 0x5,0x5f,0x31, + 0x5,0x5f,0x30, 0x7,0x3c,0x5a, 0x5,0x65,0x3d, 0x7,0x43,0x7c, + 0x4,0x5e,0x22, 0x7,0x43,0x7a, 0x5,0x65,0x3a, 0x7,0x43,0x78, + 0xf,0x61,0x2b, 0xf,0x61,0x2c, 0xf,0x61,0x2d, 0x7,0x44,0x21, + 0x7,0x43,0x7e, 0x5,0x65,0x39, 0x7,0x43,0x7d, 0x7,0x43,0x76, + 0x7,0x43,0x79, 0x5,0x65,0x3c, 0x5,0x65,0x3b, 0x5,0x65,0x38, + 0x7,0x43,0x7b, 0x7,0x4b,0x21, 0x7,0x4b,0x22, 0x7,0x4a,0x7e, + 0xf,0x64,0x2a, 0xf,0x64,0x2b, 0xf,0x64,0x2d, 0xf,0x64,0x2e, + 0x7,0x4a,0x79, 0x7,0x4a,0x7a, 0x7,0x4a,0x7d, 0x7,0x4a,0x7b, + 0x7,0x4a,0x7c, 0x7,0x4a,0x78, 0x5,0x6a,0x21, 0x5,0x69,0x7e, + 0xf,0x64,0x2c, 0x7,0x50,0x5a, 0x5,0x6e,0x29, 0x7,0x50,0x59, + 0x5,0x6e,0x27, 0xf,0x66,0x4c, 0x7,0x50,0x58, 0x5,0x6e,0x28, + 0x7,0x5d,0x22, 0x4,0x67,0x55, 0x7,0x55,0x4f, 0x5,0x71,0x51, + 0x7,0x55,0x50, 0x7,0x55,0x4e, 0xf,0x68,0x55, 0xf,0x68,0x56, + 0xf,0x68,0x57, 0xf,0x68,0x58, 0x5,0x71,0x4f, 0x5,0x71,0x50, + 0x5,0x69,0x7d, 0x7,0x55,0x51, 0x5,0x71,0x52, 0x5,0x74,0x52, + 0x4,0x6b,0x25, 0x7,0x59,0x5b, 0x7,0x59,0x5a, 0x7,0x59,0x59, + 0x7,0x5d,0x23, 0x7,0x5d,0x25, 0x7,0x5d,0x24, 0x7,0x62,0x6a, + 0x7,0x5f,0x6a, 0x7,0x5f,0x69, 0x5,0x78,0x3d, 0x7,0x61,0x55, + 0x7,0x62,0x6b, 0x7,0x65,0x68, 0x6,0x29,0x30, 0x5,0x21,0x7c, + 0x5,0x23,0x2c, 0x5,0x23,0x2b, 0x5,0x23,0x2d, 0x5,0x23,0x2a, + 0x4,0x23,0x31, 0x6,0x25,0x5a, 0x6,0x25,0x5c, 0x4,0x23,0x33, + 0x4,0x25,0x27, 0x5,0x24,0x79, 0x4,0x25,0x26, 0x4,0x25,0x28, + 0x4,0x25,0x25, 0x6,0x29,0x33, 0x4,0x25,0x2a, 0x5,0x24,0x7a, + 0x4,0x35,0x71, 0x6,0x29,0x32, 0xf,0x25,0x35, 0xf,0x25,0x36, + 0xf,0x25,0x37, 0xf,0x38,0x73, 0xf,0x38,0x75, 0x6,0x45,0x61, + 0x6,0x45,0x5f, 0x6,0x45,0x60, 0x6,0x29,0x31, 0x4,0x25,0x29, + 0x4,0x28,0x2e, 0x6,0x45,0x5e, 0x4,0x28,0x2a, 0x4,0x28,0x2d, + 0x4,0x28,0x2c, 0x6,0x34,0x69, 0x4,0x28,0x2f, 0x5,0x27,0x72, + 0x5,0x27,0x73, 0x6,0x4f,0x58, 0x6,0x2e,0x43, 0xf,0x28,0x76, + 0xf,0x28,0x78, 0xf,0x28,0x79, 0xf,0x28,0x7c, 0x6,0x4f,0x5a, + 0x6,0x2e,0x41, 0x6,0x2e,0x42, 0x6,0x2e,0x40, 0xf,0x28,0x77, + 0xf,0x28,0x7b, 0x6,0x4f,0x57, 0x6,0x4f,0x59, 0x5,0x27,0x74, + 0x5,0x2b,0x5a, 0x5,0x2b,0x59, 0x5,0x2b,0x58, 0x4,0x2b,0x57, + 0x4,0x2b,0x55, 0x5,0x2b,0x5f, 0x4,0x41,0x33, 0x5,0x2b,0x5b, + 0xf,0x2d,0x5a, 0xf,0x45,0x6e, 0x6,0x59,0x45, 0x6,0x59,0x44, + 0x6,0x59,0x46, 0x6,0x34,0x6c, 0x6,0x34,0x66, 0x6,0x34,0x67, + 0x6,0x34,0x68, 0x6,0x34,0x6b, 0x6,0x34,0x6a, 0x5,0x2b,0x5e, + 0x5,0x2b,0x5c, 0x5,0x2b,0x5d, 0x5,0x30,0x61, 0x5,0x30,0x5d, + 0x4,0x30,0x36, 0x6,0x3c,0x5b, 0x5,0x30,0x65, 0x5,0x30,0x66, + 0x5,0x30,0x5e, 0x5,0x30,0x63, 0x5,0x30,0x5f, 0x4,0x30,0x35, + 0x6,0x3c,0x5d, 0x4,0x30,0x37, 0x6,0x3c,0x5f, 0x6,0x63,0x3d, + 0x6,0x63,0x3f, 0x6,0x63,0x40, 0x6,0x3c,0x5c, 0x6,0x3c,0x5e, + 0x6,0x3c,0x5a, 0x5,0x30,0x62, 0x5,0x30,0x64, 0x5,0x30,0x60, + 0x5,0x30,0x67, 0x6,0x63,0x3e, 0x6,0x3c,0x59, 0xf,0x32,0x62, + 0xf,0x32,0x63, 0xf,0x32,0x64, 0x5,0x51,0x6e, 0x4,0x4e,0x36, + 0x4,0x35,0x6f, 0x5,0x36,0x31, 0x5,0x36,0x30, 0x5,0x36,0x35, + 0x5,0x36,0x2e, 0x5,0x36,0x32, 0x4,0x35,0x6d, 0x6,0x45,0x66, + 0x5,0x36,0x34, 0x7,0x29,0x7a, 0x7,0x29,0x79, 0x6,0x45,0x68, + 0xf,0x32,0x61, 0xf,0x38,0x76, 0xf,0x52,0x54, 0x7,0x29,0x76, + 0x7,0x29,0x77, 0x7,0x29,0x7b, 0x7,0x29,0x78, 0x6,0x45,0x63, + 0x6,0x45,0x65, 0x6,0x45,0x64, 0x6,0x45,0x62, 0xf,0x33,0x3c, + 0x6,0x45,0x67, 0x5,0x36,0x2f, 0x5,0x36,0x33, 0x5,0x30,0x68, + 0x4,0x3b,0x5f, 0x5,0x3d,0x23, 0x5,0x3c,0x7e, 0x5,0x3d,0x22, + 0x4,0x3b,0x5d, 0x5,0x3d,0x24, 0x6,0x4f,0x64, 0x5,0x3d,0x21, + 0x5,0x43,0x67, 0x5,0x3c,0x7d, 0x5,0x3c,0x7c, 0x6,0x4f,0x62, + 0x6,0x4f,0x5b, 0x4,0x3b,0x5c, 0xf,0x3f,0x63, 0xf,0x3f,0x64, + 0xf,0x3f,0x65, 0xf,0x58,0x41, 0x7,0x34,0x4e, 0x6,0x4f,0x5d, + 0x6,0x4f,0x5c, 0x6,0x4f,0x5e, 0x6,0x4f,0x5f, 0x6,0x4f,0x60, + 0x6,0x4f,0x61, 0xf,0x3f,0x66, 0x6,0x4f,0x63, 0x7,0x34,0x4d, + 0x5,0x3c,0x7b, 0x7,0x3c,0x64, 0x5,0x43,0x5b, 0x5,0x43,0x60, + 0x5,0x43,0x63, 0x5,0x43,0x5e, 0x5,0x43,0x5d, 0x4,0x41,0x35, + 0x6,0x63,0x41, 0x5,0x43,0x5c, 0x5,0x43,0x62, 0x5,0x43,0x5f, + 0x5,0x43,0x64, 0x5,0x43,0x66, 0x4,0x41,0x37, 0x5,0x43,0x65, + 0x6,0x59,0x49, 0x5,0x43,0x5a, 0xf,0x45,0x6f, 0x6,0x59,0x48, + 0x6,0x59,0x4b, 0x5,0x43,0x61, 0x4,0x47,0x6f, 0x5,0x4a,0x5d, + 0x5,0x4a,0x5c, 0x5,0x4a,0x59, 0x5,0x4a,0x58, 0x5,0x4a,0x63, + 0x5,0x4a,0x5f, 0x5,0x4a,0x5b, 0x6,0x63,0x46, 0x6,0x63,0x43, + 0x6,0x63,0x42, 0x5,0x4a,0x61, 0x5,0x4a,0x62, 0x7,0x44,0x22, + 0x7,0x44,0x24, 0x7,0x44,0x23, 0x7,0x44,0x25, 0x6,0x63,0x45, + 0x5,0x4a,0x57, 0x4,0x47,0x72, 0x6,0x63,0x44, 0x5,0x65,0x3e, + 0x5,0x4a,0x5a, 0x5,0x4a,0x5e, 0x5,0x4a,0x64, 0x4,0x4e,0x38, + 0x7,0x4b,0x23, 0x5,0x51,0x72, 0x7,0x2a,0x21, 0x4,0x4e,0x37, + 0x5,0x51,0x73, 0x4,0x4e,0x39, 0x5,0x59,0x28, 0x5,0x51,0x6f, + 0x5,0x51,0x70, 0x7,0x29,0x7e, 0x7,0x2a,0x22, 0x4,0x4e,0x3a, + 0xf,0x52,0x53, 0xf,0x52,0x55, 0xf,0x52,0x56, 0x7,0x4b,0x26, + 0x7,0x4b,0x24, 0x7,0x2a,0x23, 0x7,0x2a,0x25, 0x7,0x2a,0x26, + 0x7,0x2a,0x24, 0x7,0x29,0x7c, 0x7,0x29,0x7d, 0x5,0x51,0x74, + 0x7,0x34,0x50, 0x5,0x51,0x71, 0x7,0x4b,0x25, 0x5,0x6e,0x2a, + 0x5,0x59,0x25, 0x5,0x59,0x26, 0x7,0x50,0x5c, 0x4,0x54,0x38, + 0x7,0x34,0x4f, 0x5,0x59,0x21, 0x5,0x59,0x24, 0x7,0x34,0x52, + 0x5,0x59,0x22, 0x5,0x59,0x23, 0x4,0x54,0x39, 0x7,0x34,0x51, + 0xf,0x58,0x40, 0x7,0x50,0x5d, 0x7,0x50,0x5b, 0x5,0x6e,0x2b, + 0x7,0x3c,0x65, 0x7,0x3c,0x69, 0x5,0x5f,0x38, 0x4,0x59,0x3b, + 0x5,0x5f,0x39, 0x7,0x55,0x52, 0x7,0x55,0x53, 0x7,0x55,0x54, + 0x7,0x3c,0x67, 0x7,0x3c,0x6a, 0x7,0x3c,0x66, 0x5,0x5f,0x3b, + 0x5,0x5f,0x3a, 0x7,0x55,0x55, 0x7,0x3c,0x68, 0x5,0x65,0x40, + 0x7,0x44,0x26, 0x7,0x44,0x27, 0x5,0x65,0x41, 0x5,0x6a,0x25, + 0x5,0x65,0x44, 0x7,0x44,0x29, 0x7,0x44,0x28, 0x5,0x65,0x42, + 0x5,0x65,0x43, 0x7,0x59,0x5c, 0x5,0x65,0x3f, 0x7,0x44,0x2a, + 0x7,0x4b,0x28, 0x7,0x44,0x2b, 0x5,0x6a,0x24, 0x7,0x4b,0x27, + 0x5,0x6a,0x23, 0x7,0x4b,0x2a, 0x7,0x4b,0x29, 0x4,0x61,0x60, + 0x5,0x59,0x27, 0x5,0x6a,0x22, 0x4,0x64,0x64, 0x5,0x6e,0x2c, + 0x7,0x50,0x5f, 0x7,0x50,0x61, 0x7,0x50,0x5e, 0x7,0x50,0x60, + 0x4,0x67,0x56, 0xf,0x68,0x59, 0x7,0x55,0x56, 0x7,0x55,0x57, + 0x7,0x59,0x5d, 0x7,0x55,0x58, 0xf,0x68,0x5a, 0x7,0x5d,0x26, + 0x7,0x5f,0x6b, 0x7,0x5f,0x6c, 0x5,0x7b,0x4b, 0x7,0x63,0x78, + 0x4,0x30,0x39, 0xf,0x32,0x65, 0x6,0x3c,0x60, 0x5,0x36,0x38, + 0x5,0x36,0x37, 0x6,0x45,0x72, 0x6,0x45,0x6e, 0x5,0x36,0x39, + 0x4,0x35,0x76, 0x6,0x45,0x6c, 0x6,0x45,0x73, 0x6,0x45,0x69, + 0x4,0x35,0x77, 0x5,0x36,0x3a, 0x6,0x45,0x70, 0x6,0x45,0x6f, + 0x6,0x45,0x6a, 0x6,0x45,0x6b, 0xf,0x38,0x77, 0x6,0x45,0x71, + 0x4,0x35,0x79, 0x6,0x45,0x6d, 0x6,0x45,0x74, 0x6,0x4f,0x6b, + 0x5,0x3d,0x25, 0x5,0x3d,0x26, 0x4,0x3b,0x65, 0x6,0x4f,0x69, + 0x5,0x43,0x6a, 0x4,0x3b,0x62, 0x4,0x3b,0x63, 0x6,0x4f,0x6a, + 0x6,0x4f,0x66, 0x6,0x4f,0x65, 0x4,0x3b,0x61, 0x6,0x4f,0x67, + 0x6,0x4f,0x68, 0xf,0x3f,0x68, 0xf,0x3f,0x69, 0xf,0x3f,0x6a, + 0xf,0x3f,0x6b, 0x6,0x4f,0x6c, 0x5,0x43,0x69, 0x5,0x43,0x6c, + 0x5,0x43,0x68, 0x6,0x59,0x4e, 0x6,0x59,0x4d, 0x5,0x43,0x6b, + 0x6,0x63,0x4a, 0x5,0x4a,0x66, 0x5,0x4a,0x65, 0xf,0x4c,0x73, + 0xf,0x4c,0x74, 0xf,0x4c,0x75, 0xf,0x4c,0x77, 0x6,0x63,0x49, + 0x6,0x63,0x48, 0xf,0x4c,0x78, 0x6,0x63,0x47, 0x7,0x2a,0x28, + 0x5,0x51,0x78, 0x7,0x2a,0x2c, 0x5,0x51,0x79, 0x5,0x51,0x75, + 0x7,0x2a,0x30, 0x5,0x51,0x76, 0x7,0x2a,0x2f, 0x7,0x2a,0x2e, + 0x7,0x2a,0x2d, 0x7,0x2a,0x29, 0x7,0x2a,0x27, 0x5,0x51,0x77, + 0xf,0x4c,0x76, 0xf,0x52,0x58, 0xf,0x52,0x59, 0x7,0x2a,0x2a, + 0x7,0x2a,0x2b, 0x7,0x2a,0x32, 0x7,0x2a,0x31, 0x7,0x34,0x56, + 0x7,0x34,0x55, 0x5,0x59,0x29, 0x7,0x34,0x58, 0x5,0x59,0x2c, + 0x7,0x34,0x5a, 0x4,0x54,0x41, 0x7,0x34,0x5f, 0x4,0x54,0x3e, + 0x4,0x54,0x3f, 0x7,0x34,0x5e, 0x5,0x59,0x2a, 0x7,0x34,0x57, + 0x7,0x34,0x5d, 0x7,0x34,0x5c, 0x5,0x59,0x2b, 0xf,0x58,0x42, + 0xf,0x58,0x43, 0x7,0x34,0x59, 0x7,0x34,0x5b, 0x7,0x34,0x53, + 0x7,0x34,0x60, 0x5,0x5f,0x41, 0x5,0x5f,0x3f, 0x5,0x5f,0x40, + 0x5,0x5f,0x43, 0x4,0x59,0x40, 0x7,0x3c,0x6c, 0x5,0x5f,0x42, + 0x4,0x59,0x3e, 0x7,0x3c,0x6e, 0x5,0x5f,0x3e, 0x7,0x3c,0x74, + 0x5,0x5f,0x44, 0x7,0x3c,0x6d, 0x7,0x3c,0x73, 0xf,0x5d,0x2a, + 0xf,0x5d,0x2b, 0xf,0x5d,0x2c, 0x7,0x3c,0x6f, 0x7,0x3c,0x71, + 0x7,0x3c,0x72, 0x5,0x5f,0x3d, 0x5,0x65,0x46, 0x5,0x65,0x47, + 0x5,0x65,0x49, 0x7,0x44,0x33, 0x7,0x44,0x2f, 0x4,0x5e,0x23, + 0x7,0x44,0x2c, 0x5,0x65,0x48, 0x4,0x5e,0x26, 0x5,0x65,0x4a, + 0x7,0x3c,0x75, 0x4,0x5e,0x25, 0x7,0x44,0x32, 0x5,0x65,0x4b, + 0x7,0x44,0x35, 0x7,0x44,0x36, 0x7,0x44,0x2d, 0xf,0x61,0x2e, + 0x7,0x44,0x31, 0x7,0x44,0x2e, 0x5,0x65,0x4c, 0x7,0x44,0x30, + 0x7,0x4b,0x2f, 0x7,0x4b,0x2c, 0x5,0x6a,0x2e, 0x5,0x6a,0x2b, + 0x5,0x6a,0x27, 0x5,0x6a,0x2a, 0x5,0x6a,0x29, 0x5,0x6a,0x2f, + 0x5,0x6a,0x2c, 0x5,0x6a,0x28, 0x5,0x6a,0x2d, 0x7,0x4b,0x2d, + 0x7,0x4b,0x2e, 0x7,0x4b,0x30, 0x7,0x4b,0x2b, 0x7,0x44,0x34, + 0x5,0x6a,0x30, 0x5,0x6a,0x26, 0x7,0x50,0x62, 0x5,0x6e,0x31, + 0x5,0x6e,0x2e, 0x5,0x6e,0x2f, 0x5,0x6e,0x2d, 0x5,0x6e,0x30, + 0x7,0x50,0x63, 0x7,0x50,0x64, 0xf,0x66,0x4e, 0x7,0x50,0x65, + 0x7,0x50,0x67, 0x7,0x50,0x66, 0x4,0x67,0x59, 0x4,0x67,0x57, + 0x4,0x67,0x58, 0x5,0x71,0x53, 0x7,0x55,0x5a, 0xf,0x68,0x5b, + 0x7,0x55,0x59, 0x7,0x59,0x5e, 0x7,0x59,0x5f, 0x7,0x59,0x62, + 0x5,0x74,0x53, 0x7,0x59,0x61, 0x7,0x59,0x60, 0xf,0x69,0x7d, + 0x7,0x5d,0x27, 0x7,0x5d,0x29, 0x5,0x76,0x5a, 0x7,0x5d,0x2b, + 0x7,0x5d,0x2a, 0x5,0x76,0x5b, 0x7,0x5d,0x28, 0xf,0x6a,0x7a, + 0x5,0x78,0x3f, 0x4,0x6c,0x2f, 0x7,0x5f,0x6d, 0x7,0x5f,0x6e, + 0x5,0x78,0x3e, 0x7,0x62,0x6c, 0x5,0x7a,0x7b, 0x7,0x63,0x7a, + 0x7,0x63,0x79, 0x7,0x64,0x66, 0x7,0x64,0x65, 0x7,0x65,0x78, + 0x7,0x65,0x79, 0x6,0x34,0x6e, 0x5,0x3d,0x27, 0x5,0x36,0x3b, + 0x6,0x63,0x4b, 0x6,0x63,0x4c, 0x5,0x51,0x7a, 0x7,0x2a,0x34, + 0x7,0x2a,0x33, 0x5,0x59,0x2d, 0x7,0x34,0x61, 0x5,0x5f,0x45, + 0xf,0x5d,0x2d, 0x7,0x44,0x37, 0xf,0x66,0x4f, 0xf,0x68,0x5c, + 0x5,0x74,0x54, 0x5,0x36,0x3c, 0x6,0x3c,0x61, 0x6,0x45,0x75, + 0x6,0x4f,0x6e, 0x5,0x3d,0x29, 0x5,0x3d,0x28, 0xf,0x45,0x70, + 0x6,0x63,0x4d, 0x7,0x2a,0x35, 0x5,0x5f,0x46, 0xf,0x61,0x2f, + 0x5,0x65,0x4d, 0xf,0x68,0x5d, 0x5,0x71,0x54, 0x7,0x55,0x5b, + 0x6,0x3c,0x64, 0xf,0x32,0x66, 0x6,0x3c,0x62, 0x5,0x36,0x3d, + 0x6,0x45,0x76, 0x6,0x45,0x77, 0xf,0x38,0x78, 0x6,0x4f,0x73, + 0x6,0x4f,0x74, 0x6,0x4f,0x75, 0x6,0x4f,0x71, 0x6,0x4f,0x72, + 0x6,0x4f,0x78, 0x6,0x4f,0x76, 0x6,0x4f,0x70, 0x6,0x4f,0x79, + 0xf,0x3f,0x6c, 0xf,0x3f,0x6d, 0xf,0x3f,0x6e, 0xf,0x3f,0x6f, + 0xf,0x3f,0x72, 0xf,0x3f,0x74, 0xf,0x3f,0x71, 0x6,0x4f,0x77, + 0xf,0x3f,0x70, 0x4,0x41,0x47, 0x5,0x43,0x6e, 0x4,0x41,0x45, + 0x4,0x41,0x44, 0x6,0x59,0x53, 0x6,0x59,0x4f, 0xf,0x45,0x71, + 0xf,0x45,0x75, 0xf,0x45,0x76, 0xf,0x45,0x77, 0xf,0x45,0x78, + 0x6,0x59,0x55, 0x6,0x59,0x51, 0x6,0x59,0x52, 0xf,0x45,0x79, + 0x6,0x59,0x54, 0x6,0x59,0x50, 0xf,0x45,0x74, 0x5,0x4a,0x67, + 0x5,0x4a,0x68, 0x6,0x63,0x52, 0x5,0x4a,0x69, 0xf,0x4c,0x68, + 0xf,0x4c,0x79, 0xf,0x4c,0x7b, 0xf,0x4c,0x7c, 0xf,0x4c,0x7d, + 0xf,0x4d,0x21, 0xf,0x4d,0x23, 0xf,0x4d,0x24, 0xf,0x4d,0x25, + 0xf,0x4d,0x28, 0xf,0x4d,0x29, 0x6,0x63,0x4e, 0x4,0x47,0x7a, + 0x6,0x63,0x50, 0x6,0x63,0x51, 0xf,0x4d,0x2a, 0x6,0x63,0x54, + 0xf,0x4c,0x7a, 0x6,0x63,0x55, 0xf,0x4d,0x2b, 0xf,0x4d,0x26, + 0xf,0x4c,0x7e, 0x7,0x2a,0x3a, 0x4,0x4e,0x42, 0x5,0x51,0x7e, + 0x7,0x2a,0x41, 0x7,0x2a,0x3b, 0x7,0x2a,0x40, 0x7,0x2a,0x39, + 0x5,0x51,0x7d, 0x7,0x2a,0x43, 0x7,0x2a,0x44, 0x7,0x2a,0x3d, + 0x5,0x51,0x7b, 0x7,0x2a,0x37, 0xf,0x52,0x5b, 0xf,0x52,0x5d, + 0xf,0x52,0x5f, 0xf,0x52,0x60, 0xf,0x52,0x63, 0xf,0x52,0x64, + 0xf,0x52,0x65, 0xf,0x52,0x67, 0xf,0x52,0x68, 0xf,0x52,0x69, + 0xf,0x52,0x6a, 0xf,0x52,0x6c, 0xf,0x52,0x6d, 0x7,0x2a,0x42, + 0x7,0x2a,0x3c, 0x7,0x2a,0x3f, 0x7,0x2a,0x45, 0xf,0x52,0x5e, + 0x7,0x2a,0x36, 0x5,0x51,0x7c, 0xf,0x52,0x62, 0xf,0x52,0x66, + 0xf,0x52,0x5a, 0x5,0x59,0x34, 0x5,0x59,0x37, 0x5,0x59,0x32, + 0x4,0x54,0x47, 0x5,0x59,0x2e, 0x5,0x59,0x30, 0x7,0x34,0x65, + 0x7,0x34,0x64, 0x7,0x34,0x6b, 0x7,0x34,0x69, 0x7,0x34,0x67, + 0x5,0x59,0x36, 0x4,0x54,0x44, 0x7,0x34,0x62, 0x7,0x34,0x6a, + 0x7,0x34,0x68, 0x5,0x59,0x2f, 0x7,0x34,0x66, 0xf,0x52,0x5c, + 0x5,0x59,0x33, 0xf,0x58,0x44, 0xf,0x58,0x46, 0xf,0x58,0x47, + 0xf,0x58,0x49, 0xf,0x58,0x4a, 0xf,0x58,0x4b, 0xf,0x58,0x4d, + 0xf,0x58,0x4e, 0xf,0x58,0x4f, 0xf,0x58,0x51, 0xf,0x58,0x53, + 0xf,0x58,0x54, 0xf,0x58,0x56, 0xf,0x58,0x57, 0xf,0x58,0x5a, + 0xf,0x58,0x5c, 0xf,0x58,0x5d, 0xf,0x58,0x5e, 0xf,0x58,0x60, + 0xf,0x58,0x61, 0xf,0x58,0x63, 0xf,0x58,0x64, 0xf,0x58,0x50, + 0xf,0x58,0x52, 0xf,0x58,0x5f, 0xf,0x58,0x45, 0xf,0x58,0x58, + 0x5,0x59,0x38, 0x5,0x59,0x31, 0x5,0x5f,0x48, 0x5,0x5f,0x49, + 0x7,0x3c,0x79, 0x4,0x59,0x43, 0x5,0x5f,0x4c, 0x5,0x5f,0x4b, + 0x7,0x3c,0x7c, 0x5,0x59,0x35, 0x5,0x5f,0x47, 0x7,0x3c,0x7a, + 0x5,0x5f,0x4a, 0x5,0x5f,0x4f, 0x7,0x3c,0x7e, 0x7,0x3d,0x24, + 0x7,0x3d,0x21, 0x7,0x3d,0x25, 0xf,0x5d,0x2f, 0xf,0x5d,0x30, + 0xf,0x5d,0x34, 0xf,0x5d,0x35, 0xf,0x5d,0x36, 0xf,0x5d,0x37, + 0xf,0x5d,0x3a, 0xf,0x5d,0x3b, 0xf,0x5d,0x3c, 0xf,0x5d,0x3d, + 0xf,0x5d,0x3f, 0xf,0x5d,0x40, 0xf,0x5d,0x42, 0xf,0x5d,0x43, + 0xf,0x5d,0x44, 0xf,0x5d,0x45, 0xf,0x5d,0x46, 0xf,0x5d,0x47, + 0xf,0x5d,0x48, 0xf,0x5d,0x49, 0xf,0x5d,0x4b, 0xf,0x5d,0x4e, + 0xf,0x5d,0x4f, 0x7,0x3c,0x7d, 0x7,0x3d,0x22, 0x7,0x3c,0x78, + 0x7,0x3d,0x23, 0x4,0x59,0x48, 0xf,0x5d,0x4a, 0xf,0x5d,0x38, + 0xf,0x5d,0x33, 0xf,0x5d,0x31, 0x5,0x5f,0x4e, 0x5,0x5f,0x4d, + 0xf,0x5d,0x2e, 0x5,0x65,0x51, 0x4,0x5e,0x2d, 0x4,0x5e,0x2e, + 0x5,0x65,0x52, 0x4,0x5e,0x28, 0x4,0x5e,0x2a, 0x7,0x44,0x38, + 0x5,0x65,0x50, 0x5,0x65,0x4e, 0x5,0x6a,0x31, 0x7,0x44,0x3a, + 0x5,0x65,0x53, 0x4,0x5e,0x30, 0x7,0x44,0x40, 0x7,0x44,0x3f, + 0x5,0x65,0x54, 0x5,0x65,0x55, 0x7,0x44,0x41, 0xf,0x61,0x31, + 0xf,0x61,0x32, 0xf,0x61,0x34, 0xf,0x61,0x36, 0xf,0x61,0x37, + 0xf,0x61,0x38, 0xf,0x61,0x3a, 0xf,0x61,0x3c, 0xf,0x61,0x3d, + 0xf,0x61,0x3e, 0xf,0x61,0x40, 0xf,0x61,0x41, 0xf,0x61,0x42, + 0xf,0x61,0x44, 0xf,0x61,0x45, 0xf,0x61,0x46, 0x7,0x44,0x3b, + 0x7,0x44,0x3c, 0x7,0x44,0x3e, 0x7,0x44,0x3d, 0xf,0x61,0x30, + 0xf,0x61,0x39, 0xf,0x61,0x35, 0xf,0x5f,0x5d, 0x4,0x61,0x6b, + 0x7,0x4b,0x33, 0x7,0x4b,0x37, 0x5,0x6a,0x32, 0x7,0x4b,0x34, + 0x5,0x6a,0x34, 0x7,0x4b,0x32, 0x7,0x4b,0x3a, 0x7,0x4b,0x36, + 0x7,0x4b,0x39, 0x7,0x4b,0x3b, 0xf,0x64,0x31, 0xf,0x64,0x32, + 0xf,0x64,0x33, 0xf,0x64,0x35, 0xf,0x64,0x36, 0xf,0x64,0x38, + 0xf,0x64,0x39, 0xf,0x64,0x3a, 0xf,0x64,0x3b, 0xf,0x64,0x3c, + 0xf,0x64,0x3d, 0xf,0x64,0x3f, 0xf,0x64,0x40, 0xf,0x64,0x41, + 0xf,0x64,0x42, 0xf,0x64,0x43, 0xf,0x64,0x44, 0xf,0x64,0x45, + 0x7,0x4b,0x3c, 0x7,0x4b,0x35, 0x7,0x4b,0x38, 0x4,0x61,0x6a, + 0x7,0x4b,0x31, 0x5,0x65,0x56, 0xf,0x64,0x3e, 0x4,0x64,0x68, + 0x7,0x50,0x6d, 0x7,0x50,0x6e, 0x5,0x6e,0x38, 0x7,0x50,0x72, + 0x5,0x6e,0x33, 0x4,0x64,0x6a, 0x5,0x6e,0x36, 0x5,0x6e,0x32, + 0x7,0x50,0x70, 0x7,0x50,0x68, 0x7,0x50,0x69, 0x5,0x6e,0x37, + 0x4,0x64,0x6e, 0x7,0x50,0x71, 0x5,0x6e,0x34, 0xf,0x66,0x50, + 0xf,0x66,0x51, 0xf,0x66,0x53, 0xf,0x66,0x54, 0xf,0x66,0x55, + 0xf,0x66,0x56, 0xf,0x66,0x58, 0xf,0x66,0x59, 0xf,0x66,0x5a, + 0xf,0x66,0x5b, 0xf,0x66,0x5d, 0xf,0x66,0x5f, 0xf,0x66,0x60, + 0xf,0x66,0x61, 0xf,0x66,0x62, 0xf,0x66,0x63, 0xf,0x66,0x64, + 0xf,0x66,0x66, 0xf,0x66,0x68, 0xf,0x66,0x6a, 0xf,0x66,0x6b, + 0xf,0x66,0x6c, 0xf,0x66,0x6d, 0xf,0x66,0x6e, 0xf,0x66,0x6f, + 0x7,0x50,0x6c, 0x7,0x50,0x6f, 0xf,0x66,0x52, 0xf,0x66,0x5c, + 0xf,0x66,0x67, 0x7,0x50,0x6a, 0x7,0x55,0x62, 0x4,0x67,0x5e, + 0x7,0x55,0x67, 0x7,0x55,0x61, 0x7,0x55,0x5c, 0x4,0x67,0x60, + 0x4,0x67,0x5d, 0x7,0x55,0x60, 0x7,0x55,0x63, 0x7,0x55,0x69, + 0x7,0x55,0x5e, 0xf,0x68,0x5e, 0xf,0x68,0x5f, 0xf,0x68,0x60, + 0xf,0x68,0x61, 0xf,0x68,0x62, 0xf,0x68,0x63, 0xf,0x68,0x64, + 0xf,0x68,0x65, 0xf,0x68,0x66, 0xf,0x68,0x67, 0xf,0x68,0x68, + 0xf,0x68,0x69, 0xf,0x68,0x6b, 0xf,0x68,0x6c, 0xf,0x68,0x6d, + 0xf,0x68,0x6e, 0xf,0x68,0x6f, 0x7,0x55,0x5f, 0x7,0x55,0x64, + 0x7,0x55,0x65, 0x7,0x55,0x66, 0x7,0x55,0x5d, 0xf,0x68,0x6a, + 0x5,0x74,0x57, 0x7,0x59,0x6b, 0x7,0x59,0x6a, 0x7,0x5d,0x30, + 0x7,0x59,0x66, 0x7,0x59,0x64, 0xf,0x69,0x7e, 0xf,0x6a,0x21, + 0xf,0x6a,0x22, 0xf,0x6a,0x23, 0xf,0x6a,0x24, 0xf,0x6a,0x25, + 0xf,0x6a,0x26, 0xf,0x6a,0x27, 0xf,0x6a,0x28, 0xf,0x6a,0x29, + 0xf,0x6a,0x2a, 0xf,0x6a,0x2b, 0x7,0x59,0x63, 0x7,0x59,0x65, + 0x5,0x74,0x56, 0x5,0x76,0x5e, 0x4,0x6b,0x28, 0x5,0x76,0x5c, + 0xf,0x6b,0x2f, 0x7,0x5d,0x2f, 0x7,0x5d,0x2d, 0x7,0x59,0x69, + 0x7,0x5d,0x2c, 0xf,0x6a,0x7c, 0xf,0x6a,0x7d, 0xf,0x6b,0x23, + 0xf,0x6b,0x24, 0xf,0x6b,0x25, 0xf,0x6b,0x26, 0xf,0x6b,0x29, + 0xf,0x6b,0x2a, 0xf,0x6b,0x2b, 0xf,0x6b,0x2c, 0xf,0x6b,0x2d, + 0xf,0x6b,0x2e, 0x7,0x5d,0x2e, 0x7,0x5d,0x31, 0xf,0x6b,0x21, + 0xf,0x6a,0x7e, 0xf,0x6b,0x27, 0x5,0x78,0x40, 0x7,0x5f,0x70, + 0x7,0x5f,0x71, 0x7,0x5f,0x72, 0x7,0x5f,0x6f, 0x7,0x5f,0x73, + 0xf,0x6b,0x68, 0xf,0x6b,0x69, 0xf,0x6b,0x6a, 0xf,0x6b,0x6b, + 0xf,0x6b,0x6c, 0x4,0x6d,0x63, 0x7,0x61,0x57, 0x7,0x61,0x58, + 0xf,0x6b,0x6d, 0xf,0x6c,0x3c, 0xf,0x6c,0x3d, 0x7,0x61,0x56, + 0x7,0x62,0x72, 0x7,0x62,0x6d, 0x7,0x62,0x6e, 0x7,0x62,0x74, + 0x7,0x62,0x70, 0x7,0x62,0x6f, 0x5,0x7a,0x40, 0x7,0x62,0x73, + 0x7,0x62,0x71, 0x7,0x62,0x75, 0xf,0x6c,0x52, 0xf,0x6c,0x53, + 0xf,0x6c,0x54, 0xf,0x6c,0x55, 0xf,0x6c,0x56, 0xf,0x6c,0x57, + 0xf,0x6c,0x58, 0xf,0x6c,0x40, 0x5,0x7a,0x41, 0x5,0x7a,0x7c, + 0x7,0x63,0x7d, 0x7,0x63,0x7b, 0xf,0x6c,0x6f, 0x7,0x63,0x7c, + 0xf,0x6d,0x23, 0x7,0x64,0x68, 0xf,0x6d,0x21, 0x7,0x64,0x67, + 0x7,0x64,0x69, 0xf,0x6d,0x22, 0xf,0x6c,0x3e, 0x7,0x65,0x48, + 0x7,0x65,0x49, 0xf,0x6d,0x29, 0x5,0x7c,0x21, 0xf,0x6d,0x35, + 0xf,0x6d,0x38, 0xf,0x6d,0x39, 0x6,0x2e,0x44, 0x6,0x29,0x34, + 0x5,0x2b,0x60, 0x5,0x36,0x3f, 0x6,0x45,0x7b, 0x5,0x36,0x3e, + 0x5,0x36,0x40, 0x6,0x45,0x7a, 0xf,0x38,0x79, 0x6,0x45,0x79, + 0x6,0x45,0x78, 0x5,0x3d,0x2a, 0x5,0x3d,0x2b, 0x4,0x3b,0x68, + 0x6,0x4f,0x7a, 0x6,0x4f,0x7b, 0xf,0x3f,0x75, 0x6,0x59,0x59, + 0x6,0x59,0x58, 0x4,0x41,0x4a, 0x6,0x59,0x56, 0x6,0x59,0x57, + 0xf,0x45,0x7a, 0x5,0x43,0x70, 0x5,0x43,0x6f, 0x5,0x4a,0x6a, + 0x4,0x47,0x7c, 0x6,0x63,0x56, 0x6,0x63,0x57, 0x5,0x4a,0x6b, + 0x5,0x52,0x21, 0x5,0x52,0x23, 0x5,0x59,0x39, 0x5,0x52,0x22, + 0x5,0x52,0x24, 0x5,0x52,0x25, 0xf,0x58,0x65, 0x5,0x59,0x3b, + 0x7,0x34,0x6e, 0x5,0x59,0x3a, 0x7,0x3d,0x26, 0x7,0x34,0x6d, + 0x7,0x34,0x70, 0x7,0x34,0x6c, 0x7,0x3d,0x29, 0x4,0x59,0x4a, + 0x5,0x5f,0x50, 0x4,0x59,0x4b, 0x7,0x3d,0x2a, 0x7,0x3d,0x28, + 0x7,0x3d,0x27, 0x7,0x44,0x43, 0x5,0x65,0x58, 0x7,0x44,0x42, + 0x5,0x65,0x57, 0x5,0x6a,0x38, 0x5,0x6a,0x36, 0x5,0x6a,0x35, + 0x5,0x6a,0x37, 0x5,0x6e,0x39, 0x7,0x50,0x73, 0x7,0x50,0x74, + 0x4,0x67,0x64, 0x7,0x55,0x6a, 0x7,0x59,0x6d, 0x7,0x59,0x6e, + 0x7,0x59,0x6c, 0x5,0x76,0x61, 0x5,0x76,0x60, 0x5,0x78,0x41, + 0x7,0x5f,0x74, 0x7,0x62,0x76, 0x7,0x64,0x6a, 0x5,0x2b,0x61, + 0x5,0x30,0x6a, 0x5,0x30,0x6b, 0x5,0x30,0x69, 0xf,0x32,0x67, + 0x6,0x3c,0x66, 0x5,0x36,0x42, 0x5,0x36,0x41, 0xf,0x38,0x7a, + 0xf,0x38,0x7b, 0x6,0x45,0x7c, 0x5,0x3d,0x33, 0x5,0x3d,0x31, + 0x5,0x3d,0x2f, 0x4,0x3b,0x6a, 0x5,0x3d,0x30, 0x4,0x3b,0x6c, + 0x3,0x3f,0x6d, 0x5,0x3d,0x2c, 0x5,0x3d,0x2d, 0x5,0x3d,0x2e, + 0x6,0x4f,0x7e, 0x6,0x50,0x21, 0x5,0x3d,0x32, 0x6,0x4f,0x7c, + 0xf,0x3f,0x78, 0xf,0x3f,0x79, 0xf,0x3f,0x7a, 0xf,0x3f,0x7b, + 0xf,0x3f,0x7c, 0xf,0x3f,0x7d, 0xf,0x40,0x21, 0x6,0x4f,0x7d, + 0x4,0x3b,0x69, 0x4,0x41,0x4c, 0x6,0x59,0x5e, 0x4,0x41,0x52, + 0x4,0x41,0x4d, 0x4,0x41,0x4b, 0xf,0x45,0x7e, 0x6,0x59,0x5d, + 0x5,0x43,0x74, 0x5,0x43,0x71, 0x5,0x43,0x73, 0x5,0x43,0x72, + 0x6,0x59,0x5b, 0x4,0x41,0x51, 0x4,0x41,0x4f, 0x6,0x59,0x5c, + 0x6,0x59,0x5a, 0xf,0x45,0x7d, 0xf,0x46,0x21, 0x5,0x4a,0x73, + 0x5,0x4a,0x6f, 0x5,0x4a,0x71, 0x4,0x47,0x7e, 0x5,0x4a,0x6d, + 0x4,0x48,0x21, 0x5,0x4a,0x74, 0x6,0x63,0x5a, 0x5,0x4a,0x70, + 0x5,0x4a,0x75, 0x4,0x47,0x7d, 0x5,0x4a,0x72, 0x5,0x4a,0x76, + 0x6,0x63,0x59, 0x6,0x63,0x5b, 0x6,0x63,0x5c, 0x5,0x4a,0x6c, + 0x7,0x2a,0x48, 0x5,0x52,0x2d, 0x5,0x52,0x28, 0x7,0x2a,0x4d, + 0x5,0x52,0x2a, 0x5,0x52,0x27, 0x7,0x2a,0x4e, 0x4,0x4e,0x49, + 0x5,0x52,0x2c, 0x5,0x52,0x29, 0x7,0x2a,0x4c, 0xf,0x52,0x6e, + 0xf,0x52,0x6f, 0xf,0x52,0x71, 0x7,0x2a,0x47, 0x7,0x2a,0x49, + 0x7,0x2a,0x4a, 0x7,0x2a,0x4b, 0x5,0x52,0x26, 0x5,0x52,0x2b, + 0x5,0x52,0x2e, 0xf,0x52,0x70, 0x4,0x54,0x50, 0x4,0x54,0x4d, + 0x5,0x59,0x3d, 0x5,0x59,0x40, 0x7,0x34,0x72, 0x5,0x59,0x3c, + 0x5,0x59,0x3e, 0x5,0x59,0x3f, 0x7,0x34,0x75, 0x7,0x34,0x77, + 0x7,0x34,0x79, 0xf,0x58,0x66, 0xf,0x58,0x67, 0xf,0x58,0x68, + 0x7,0x34,0x74, 0x7,0x34,0x78, 0x7,0x34,0x76, 0x4,0x54,0x4e, + 0x4,0x59,0x53, 0x4,0x59,0x51, 0x5,0x5f,0x54, 0x7,0x3d,0x2b, + 0x5,0x5f,0x51, 0x5,0x5f,0x53, 0x5,0x5f,0x55, 0x5,0x5f,0x52, + 0x7,0x3d,0x2d, 0x4,0x59,0x50, 0x7,0x3d,0x2c, 0x4,0x59,0x4c, + 0x7,0x3d,0x2e, 0xf,0x5d,0x50, 0x7,0x3d,0x2f, 0x7,0x3d,0x30, + 0x7,0x3d,0x31, 0x5,0x65,0x5f, 0x5,0x65,0x5e, 0x5,0x65,0x5a, + 0x4,0x5e,0x33, 0x7,0x44,0x44, 0x5,0x65,0x5b, 0x5,0x65,0x61, + 0x5,0x65,0x60, 0x7,0x44,0x46, 0x5,0x65,0x5d, 0x5,0x65,0x59, + 0x5,0x65,0x5c, 0xf,0x61,0x47, 0xf,0x61,0x48, 0xf,0x61,0x49, + 0xf,0x61,0x4c, 0xf,0x61,0x4b, 0x7,0x44,0x45, 0x7,0x44,0x47, + 0x5,0x6a,0x39, 0x7,0x4b,0x3e, 0x7,0x4b,0x3f, 0x4,0x61,0x6d, + 0x5,0x6a,0x3a, 0x7,0x4b,0x3d, 0x4,0x61,0x6e, 0xf,0x64,0x46, + 0xf,0x64,0x47, 0xf,0x64,0x48, 0xf,0x64,0x49, 0xf,0x64,0x4a, + 0x4,0x64,0x70, 0x5,0x6e,0x3f, 0x5,0x6e,0x3a, 0x5,0x6e,0x3d, + 0x5,0x6e,0x3c, 0x5,0x6e,0x3e, 0x5,0x6e,0x40, 0x4,0x64,0x72, + 0x7,0x50,0x78, 0x5,0x6a,0x3b, 0x7,0x50,0x75, 0xf,0x66,0x70, + 0xf,0x66,0x71, 0x7,0x50,0x76, 0x5,0x6e,0x3b, 0x7,0x50,0x77, + 0x5,0x71,0x5a, 0x5,0x6e,0x41, 0x4,0x67,0x65, 0x5,0x71,0x59, + 0x5,0x71,0x57, 0xf,0x68,0x70, 0xf,0x68,0x71, 0xf,0x68,0x73, + 0xf,0x68,0x74, 0xf,0x68,0x75, 0x5,0x71,0x5c, 0x5,0x71,0x58, + 0x5,0x74,0x58, 0x7,0x55,0x6b, 0xf,0x6a,0x2f, 0x7,0x59,0x6f, + 0xf,0x6a,0x2c, 0xf,0x6a,0x2d, 0xf,0x6a,0x2e, 0xf,0x6a,0x30, + 0xf,0x6a,0x31, 0xf,0x6b,0x30, 0xf,0x6b,0x31, 0xf,0x6b,0x32, + 0x7,0x5d,0x32, 0x5,0x78,0x42, 0xf,0x6b,0x6e, 0xf,0x6b,0x6f, + 0x7,0x5f,0x76, 0x7,0x5f,0x75, 0x5,0x79,0x54, 0x4,0x6d,0x29, + 0x4,0x6d,0x2a, 0x7,0x61,0x59, 0x7,0x62,0x77, 0x7,0x62,0x78, + 0x5,0x7a,0x7d, 0xf,0x6d,0x2a, 0x6,0x2e,0x45, 0x5,0x22,0x22, + 0x5,0x21,0x7e, 0x4,0x22,0x23, 0x5,0x22,0x23, 0x4,0x22,0x22, + 0x5,0x22,0x21, 0x5,0x23,0x2e, 0x4,0x23,0x34, 0x6,0x25,0x5d, + 0x5,0x24,0x7d, 0x4,0x25,0x2c, 0x4,0x25,0x2d, 0x5,0x24,0x7e, + 0x5,0x24,0x7c, 0xf,0x25,0x3a, 0xf,0x25,0x3b, 0xf,0x25,0x3c, + 0xf,0x25,0x3d, 0xf,0x25,0x3e, 0xf,0x25,0x3f, 0x5,0x27,0x75, + 0x6,0x2e,0x47, 0x5,0x27,0x76, 0x5,0x27,0x78, 0x5,0x27,0x79, + 0x4,0x28,0x30, 0x5,0x27,0x77, 0x6,0x2e,0x46, 0x6,0x2e,0x48, + 0xf,0x28,0x7d, 0xf,0x28,0x7e, 0x5,0x2b,0x62, 0x6,0x34,0x70, + 0x6,0x34,0x73, 0x4,0x2b,0x5c, 0x5,0x2b,0x65, 0x6,0x34,0x71, + 0x6,0x63,0x5d, 0x6,0x34,0x75, 0x6,0x34,0x76, 0x6,0x34,0x77, + 0x6,0x34,0x72, 0x5,0x2b,0x63, 0x6,0x34,0x78, 0xf,0x2d,0x5b, + 0xf,0x2d,0x5c, 0xf,0x2d,0x5d, 0x6,0x34,0x74, 0x6,0x34,0x6f, + 0x6,0x3c,0x69, 0x5,0x30,0x6f, 0x5,0x2b,0x66, 0x6,0x3c,0x68, + 0x5,0x30,0x6c, 0x5,0x30,0x6e, 0x6,0x3c,0x6e, 0x6,0x3c,0x6b, + 0x6,0x3c,0x6f, 0x5,0x30,0x6d, 0x6,0x3c,0x6a, 0x6,0x3c,0x6d, + 0x6,0x3c,0x6c, 0xf,0x32,0x68, 0xf,0x32,0x69, 0xf,0x32,0x6a, + 0xf,0x32,0x6b, 0xf,0x32,0x6c, 0xf,0x32,0x6d, 0xf,0x32,0x6e, + 0x5,0x36,0x43, 0x6,0x46,0x28, 0x6,0x46,0x21, 0x4,0x35,0x7e, + 0x4,0x36,0x22, 0x4,0x36,0x21, 0x5,0x36,0x44, 0x6,0x46,0x23, + 0x6,0x46,0x24, 0x6,0x46,0x2b, 0x6,0x46,0x2a, 0x6,0x63,0x5e, + 0x6,0x46,0x26, 0x6,0x46,0x22, 0x6,0x46,0x29, 0x6,0x46,0x27, + 0x7,0x34,0x7b, 0x6,0x46,0x25, 0xf,0x38,0x7c, 0xf,0x38,0x7d, + 0xf,0x38,0x7e, 0xf,0x39,0x21, 0xf,0x39,0x22, 0xf,0x39,0x23, + 0xf,0x39,0x24, 0xf,0x39,0x25, 0xf,0x39,0x26, 0xf,0x39,0x27, + 0x5,0x3d,0x38, 0x5,0x3d,0x3d, 0x5,0x3d,0x39, 0x5,0x3d,0x3a, + 0x5,0x3d,0x3c, 0x6,0x50,0x25, 0x6,0x50,0x23, 0x5,0x3d,0x34, + 0x5,0x3d,0x35, 0x5,0x3d,0x37, 0x6,0x50,0x24, 0x6,0x50,0x29, + 0x7,0x3d,0x34, 0x6,0x50,0x27, 0x5,0x3d,0x3b, 0x6,0x50,0x28, + 0x6,0x50,0x26, 0xf,0x40,0x22, 0xf,0x40,0x23, 0x7,0x3d,0x32, + 0x5,0x3d,0x36, 0x6,0x59,0x6a, 0x5,0x43,0x7b, 0x5,0x43,0x78, + 0x6,0x59,0x62, 0x6,0x59,0x69, 0x6,0x59,0x67, 0x5,0x43,0x7c, + 0x5,0x43,0x79, 0x5,0x43,0x77, 0x6,0x63,0x5f, 0x6,0x59,0x63, + 0x6,0x59,0x65, 0x5,0x43,0x7d, 0x5,0x43,0x7a, 0x6,0x59,0x66, + 0x7,0x44,0x49, 0x6,0x59,0x64, 0x7,0x44,0x48, 0x5,0x43,0x76, + 0x6,0x59,0x5f, 0x6,0x59,0x6b, 0x6,0x59,0x60, 0x5,0x43,0x75, + 0x6,0x59,0x61, 0xf,0x46,0x22, 0xf,0x46,0x23, 0xf,0x46,0x24, + 0xf,0x46,0x25, 0xf,0x46,0x26, 0xf,0x46,0x27, 0xf,0x46,0x28, + 0xf,0x46,0x29, 0x6,0x59,0x68, 0x6,0x59,0x6c, 0x7,0x3d,0x33, + 0x6,0x63,0x64, 0x6,0x63,0x62, 0x6,0x63,0x66, 0x4,0x48,0x27, + 0x4,0x48,0x26, 0x5,0x52,0x2f, 0x4,0x48,0x28, 0x4,0x48,0x29, + 0x5,0x4a,0x78, 0x6,0x63,0x63, 0x6,0x63,0x60, 0x4,0x48,0x25, + 0x5,0x4a,0x79, 0x5,0x4a,0x7a, 0x6,0x63,0x65, 0x6,0x63,0x67, + 0x7,0x4b,0x41, 0xf,0x4d,0x2e, 0xf,0x4d,0x2f, 0xf,0x4d,0x30, + 0xf,0x4d,0x31, 0xf,0x4d,0x32, 0xf,0x4d,0x33, 0x6,0x63,0x61, + 0x5,0x4a,0x77, 0x5,0x52,0x36, 0x5,0x52,0x34, 0x5,0x52,0x35, + 0x7,0x2a,0x55, 0x5,0x52,0x38, 0x5,0x52,0x32, 0x5,0x52,0x31, + 0x7,0x2a,0x4f, 0x5,0x52,0x33, 0x5,0x52,0x37, 0x5,0x52,0x30, + 0x7,0x50,0x7a, 0x7,0x2a,0x53, 0x7,0x2a,0x51, 0x7,0x2a,0x50, + 0x7,0x2a,0x52, 0xf,0x52,0x72, 0xf,0x52,0x73, 0xf,0x52,0x74, + 0xf,0x52,0x75, 0xf,0x52,0x76, 0xf,0x52,0x77, 0x7,0x2a,0x56, + 0x5,0x59,0x41, 0x5,0x59,0x42, 0x4,0x54,0x54, 0x7,0x34,0x7c, + 0x5,0x59,0x44, 0x5,0x59,0x43, 0x7,0x34,0x7e, 0x7,0x50,0x79, + 0xf,0x58,0x69, 0xf,0x58,0x6a, 0xf,0x58,0x6b, 0xf,0x58,0x6c, + 0x5,0x6a,0x3c, 0x7,0x34,0x7d, 0x5,0x5f,0x56, 0x5,0x5f,0x57, + 0x7,0x3d,0x36, 0x7,0x3d,0x37, 0x7,0x3d,0x35, 0x5,0x74,0x59, + 0xf,0x5d,0x51, 0xf,0x5d,0x52, 0xf,0x5d,0x53, 0xf,0x5d,0x54, + 0x5,0x65,0x62, 0x7,0x44,0x4c, 0x4,0x5e,0x34, 0x7,0x44,0x4a, + 0x7,0x44,0x4b, 0xf,0x61,0x4d, 0xf,0x61,0x4e, 0xf,0x61,0x4f, + 0xf,0x61,0x50, 0x5,0x6a,0x3d, 0x7,0x4b,0x43, 0x7,0x55,0x6c, + 0x7,0x4b,0x45, 0xf,0x64,0x4c, 0x5,0x78,0x43, 0x7,0x4b,0x42, + 0x7,0x4b,0x44, 0x7,0x5f,0x77, 0xf,0x66,0x72, 0xf,0x66,0x73, + 0x7,0x51,0x72, 0x5,0x71,0x5d, 0x7,0x55,0x6e, 0x7,0x55,0x6d, + 0x7,0x62,0x79, 0x7,0x62,0x7a, 0x7,0x59,0x70, 0x7,0x5d,0x49, + 0x7,0x5f,0x78, 0x5,0x7a,0x7e, 0x5,0x7b,0x21, 0x7,0x66,0x37, + 0x7,0x66,0x28, 0x6,0x59,0x6d, 0x4,0x4e,0x4b, 0x7,0x2a,0x57, + 0xf,0x52,0x79, 0xf,0x52,0x78, 0x5,0x59,0x45, 0x7,0x35,0x21, + 0x4,0x59,0x56, 0x7,0x44,0x4d, 0x7,0x44,0x4e, 0x5,0x6a,0x3e, + 0x7,0x50,0x7b, 0x6,0x3c,0x70, 0x6,0x3c,0x71, 0x6,0x3c,0x72, + 0x6,0x46,0x2c, 0x5,0x36,0x45, 0x4,0x36,0x23, 0x6,0x46,0x2e, + 0x6,0x46,0x2d, 0x6,0x46,0x30, 0x6,0x46,0x2f, 0x4,0x3b,0x70, + 0x6,0x50,0x2c, 0x4,0x3b,0x6e, 0x6,0x50,0x2a, 0x6,0x59,0x73, + 0x6,0x50,0x30, 0x6,0x50,0x2e, 0x6,0x50,0x2b, 0x4,0x3b,0x71, + 0x4,0x3b,0x6f, 0x6,0x50,0x2f, 0x6,0x50,0x2d, 0x6,0x59,0x7b, + 0x5,0x43,0x7e, 0x6,0x59,0x6e, 0x6,0x59,0x71, 0x6,0x59,0x77, + 0x6,0x59,0x75, 0x6,0x59,0x7a, 0x6,0x59,0x72, 0x6,0x59,0x70, + 0x6,0x59,0x74, 0x6,0x59,0x79, 0x6,0x59,0x78, 0x6,0x59,0x6f, + 0x6,0x59,0x76, 0x6,0x63,0x74, 0x6,0x63,0x72, 0x5,0x4a,0x7b, + 0x6,0x63,0x6b, 0x6,0x63,0x6c, 0x6,0x63,0x76, 0x6,0x63,0x68, + 0x6,0x63,0x77, 0x6,0x63,0x70, 0x4,0x48,0x2a, 0x6,0x63,0x75, + 0x6,0x63,0x6f, 0x5,0x4a,0x7c, 0x6,0x63,0x71, 0x6,0x63,0x69, + 0x5,0x4a,0x7d, 0x4,0x48,0x2b, 0x6,0x63,0x6a, 0xf,0x4d,0x34, + 0xf,0x4d,0x35, 0x6,0x63,0x73, 0x6,0x63,0x78, 0x6,0x63,0x6d, + 0x7,0x2a,0x5d, 0x7,0x2a,0x5b, 0x7,0x2a,0x64, 0x7,0x2a,0x5f, + 0x7,0x2a,0x5c, 0x5,0x52,0x3a, 0x7,0x2a,0x5e, 0x7,0x2a,0x66, + 0x7,0x2a,0x62, 0x7,0x2a,0x60, 0x7,0x2a,0x61, 0x7,0x2a,0x63, + 0x7,0x2a,0x5a, 0x7,0x2a,0x58, 0x5,0x52,0x39, 0x7,0x2a,0x65, + 0x7,0x2a,0x67, 0x4,0x59,0x57, 0x4,0x54,0x55, 0x5,0x59,0x47, + 0x7,0x35,0x29, 0x7,0x35,0x24, 0x7,0x35,0x2f, 0x7,0x35,0x22, + 0x7,0x35,0x2d, 0x7,0x35,0x28, 0x7,0x35,0x25, 0x7,0x35,0x2c, + 0x7,0x35,0x2a, 0x7,0x35,0x26, 0x5,0x59,0x46, 0x7,0x35,0x30, + 0x4,0x54,0x56, 0x7,0x35,0x2b, 0x7,0x35,0x33, 0x7,0x35,0x27, + 0x7,0x2a,0x59, 0x7,0x35,0x34, 0x7,0x35,0x31, 0x7,0x35,0x23, + 0x7,0x35,0x32, 0xf,0x58,0x6d, 0x7,0x35,0x2e, 0xf,0x52,0x7a, + 0x4,0x59,0x59, 0x7,0x3d,0x3d, 0x7,0x3d,0x3b, 0x7,0x3d,0x45, + 0x7,0x3d,0x3c, 0x7,0x3d,0x3e, 0x7,0x3d,0x49, 0x7,0x3d,0x3a, + 0x7,0x3d,0x42, 0x7,0x3d,0x39, 0x7,0x3d,0x38, 0x7,0x3d,0x3f, + 0x5,0x5f,0x58, 0x7,0x3d,0x47, 0x7,0x3d,0x41, 0x7,0x3d,0x40, + 0x7,0x3d,0x43, 0x7,0x3d,0x48, 0x7,0x35,0x36, 0xf,0x5d,0x55, + 0xf,0x5d,0x57, 0x7,0x3d,0x44, 0x7,0x3d,0x46, 0x7,0x44,0x50, + 0x7,0x44,0x56, 0x7,0x44,0x52, 0x7,0x44,0x53, 0x7,0x44,0x4f, + 0x5,0x65,0x63, 0x7,0x44,0x57, 0x7,0x44,0x55, 0x5,0x65,0x64, + 0x7,0x44,0x51, 0x7,0x44,0x54, 0x7,0x4b,0x4a, 0x7,0x4b,0x47, + 0x7,0x4b,0x4b, 0x7,0x4b,0x48, 0x5,0x6a,0x3f, 0x7,0x4b,0x4e, + 0x4,0x61,0x6f, 0x5,0x6a,0x40, 0x7,0x4b,0x46, 0x7,0x4b,0x4c, + 0x7,0x4b,0x4d, 0x4,0x61,0x70, 0x7,0x4b,0x49, 0x7,0x4b,0x4f, + 0x7,0x51,0x23, 0x7,0x51,0x27, 0x7,0x50,0x7d, 0x7,0x51,0x2a, + 0x7,0x51,0x24, 0x7,0x51,0x2b, 0x7,0x51,0x28, 0x7,0x50,0x7c, + 0x5,0x6e,0x42, 0x7,0x51,0x25, 0x7,0x51,0x26, 0x5,0x6e,0x43, + 0x7,0x51,0x22, 0xf,0x66,0x74, 0x7,0x50,0x7e, 0x7,0x51,0x2c, + 0x7,0x51,0x29, 0x7,0x55,0x74, 0x4,0x67,0x68, 0x7,0x55,0x72, + 0x7,0x55,0x6f, 0x7,0x55,0x76, 0x7,0x55,0x70, 0x7,0x55,0x75, + 0x7,0x55,0x73, 0x7,0x55,0x77, 0x7,0x51,0x21, 0xf,0x68,0x76, + 0x7,0x55,0x71, 0x7,0x59,0x71, 0x7,0x59,0x72, 0x4,0x69,0x57, + 0x7,0x59,0x75, 0x7,0x59,0x76, 0x7,0x59,0x74, 0xf,0x6a,0x32, + 0x7,0x59,0x73, 0x7,0x5d,0x38, 0x7,0x5d,0x39, 0x7,0x5d,0x3a, + 0x4,0x6b,0x2b, 0x7,0x5d,0x37, 0x7,0x5d,0x33, 0x7,0x5d,0x34, + 0x7,0x5d,0x35, 0x7,0x5d,0x36, 0x7,0x5f,0x7c, 0x7,0x5f,0x7a, + 0x7,0x5f,0x7b, 0x7,0x5f,0x79, 0x7,0x61,0x5a, 0xf,0x6c,0x41, + 0x7,0x63,0x7e, 0x7,0x64,0x6b, 0x7,0x66,0x40, 0xf,0x2d,0x5e, + 0x5,0x30,0x70, 0xf,0x32,0x70, 0x6,0x46,0x32, 0x6,0x46,0x33, + 0x4,0x36,0x25, 0x6,0x46,0x31, 0xf,0x39,0x28, 0xf,0x39,0x29, + 0x5,0x3d,0x40, 0x5,0x3d,0x3e, 0x5,0x3d,0x41, 0x5,0x3d,0x3f, + 0x4,0x3b,0x73, 0x6,0x50,0x33, 0x4,0x3b,0x72, 0x6,0x50,0x32, + 0xf,0x40,0x25, 0xf,0x40,0x27, 0xf,0x40,0x26, 0x4,0x41,0x58, + 0x5,0x44,0x25, 0x5,0x44,0x22, 0x5,0x44,0x21, 0x5,0x44,0x24, + 0x5,0x44,0x23, 0x6,0x59,0x7c, 0xf,0x46,0x2b, 0xf,0x46,0x2c, + 0xf,0x46,0x2d, 0x5,0x44,0x26, 0x5,0x4b,0x22, 0x4,0x48,0x30, + 0x5,0x4b,0x23, 0x5,0x4b,0x21, 0x5,0x4a,0x7e, 0x4,0x48,0x2c, + 0x4,0x48,0x2f, 0x6,0x63,0x7d, 0x4,0x48,0x32, 0x6,0x63,0x7c, + 0x6,0x63,0x7e, 0xf,0x4d,0x37, 0xf,0x4d,0x38, 0x6,0x63,0x7a, + 0x6,0x63,0x79, 0x7,0x2a,0x6a, 0x7,0x2a,0x69, 0x5,0x52,0x45, + 0x5,0x52,0x40, 0x5,0x52,0x41, 0x5,0x52,0x3f, 0x5,0x52,0x3e, + 0x5,0x52,0x43, 0x5,0x52,0x3d, 0x4,0x54,0x57, 0x5,0x52,0x3c, + 0x7,0x2a,0x6b, 0x7,0x2a,0x6c, 0xf,0x46,0x2a, 0xf,0x52,0x7b, + 0xf,0x52,0x7c, 0xf,0x52,0x7d, 0xf,0x52,0x7e, 0xf,0x53,0x21, + 0x7,0x2a,0x68, 0x5,0x52,0x44, 0x5,0x52,0x42, 0x5,0x5f,0x59, + 0x7,0x35,0x3b, 0x4,0x54,0x5b, 0x5,0x59,0x4e, 0x5,0x59,0x4b, + 0x4,0x54,0x5a, 0x7,0x35,0x38, 0x5,0x59,0x4d, 0x5,0x59,0x4a, + 0x7,0x35,0x3a, 0x5,0x59,0x49, 0x7,0x35,0x39, 0x7,0x35,0x37, + 0x5,0x59,0x48, 0x7,0x35,0x3c, 0xf,0x58,0x6e, 0xf,0x58,0x6f, + 0xf,0x58,0x71, 0xf,0x58,0x72, 0xf,0x58,0x73, 0xf,0x58,0x74, + 0xf,0x58,0x75, 0xf,0x58,0x70, 0xf,0x55,0x64, 0x5,0x59,0x4c, + 0x4,0x59,0x5c, 0x4,0x59,0x5a, 0x4,0x59,0x5b, 0x5,0x5f,0x5a, + 0x4,0x59,0x61, 0x5,0x5f,0x5c, 0x4,0x59,0x5e, 0x7,0x3d,0x4a, + 0x5,0x65,0x68, 0x7,0x3d,0x4b, 0x7,0x3d,0x4d, 0x5,0x5f,0x5b, + 0xf,0x5d,0x59, 0x7,0x3d,0x4c, 0x7,0x3d,0x4e, 0xf,0x5d,0x5a, + 0x5,0x5f,0x5d, 0x5,0x65,0x6c, 0x5,0x65,0x6f, 0x7,0x44,0x5f, + 0x7,0x44,0x63, 0x5,0x65,0x69, 0x7,0x44,0x5e, 0x5,0x65,0x66, + 0x7,0x44,0x65, 0x7,0x44,0x62, 0x4,0x5e,0x37, 0x5,0x65,0x65, + 0x5,0x65,0x67, 0x7,0x44,0x61, 0x7,0x44,0x5a, 0x7,0x44,0x5d, + 0x5,0x65,0x6e, 0x7,0x44,0x5b, 0xf,0x61,0x51, 0x7,0x44,0x64, + 0x7,0x44,0x59, 0x7,0x44,0x5c, 0x5,0x65,0x6b, 0x5,0x65,0x6d, + 0xf,0x5d,0x58, 0x5,0x65,0x6a, 0x5,0x6a,0x47, 0x5,0x6a,0x41, + 0x5,0x6a,0x45, 0x5,0x6a,0x42, 0x5,0x6a,0x43, 0x4,0x61,0x72, + 0x5,0x6a,0x46, 0x5,0x6a,0x44, 0x5,0x6a,0x49, 0x4,0x61,0x71, + 0x7,0x4b,0x50, 0x7,0x4b,0x55, 0x7,0x4b,0x51, 0x5,0x6a,0x48, + 0x7,0x4b,0x53, 0xf,0x64,0x4e, 0x7,0x4b,0x57, 0x7,0x4b,0x56, + 0x7,0x4b,0x54, 0x7,0x4b,0x52, 0x7,0x4b,0x58, 0x7,0x51,0x2e, + 0x4,0x64,0x74, 0x7,0x51,0x36, 0x4,0x64,0x76, 0x5,0x6e,0x44, + 0x4,0x67,0x6d, 0x4,0x64,0x78, 0x7,0x51,0x34, 0x7,0x51,0x33, + 0x5,0x6e,0x45, 0x4,0x64,0x7a, 0x4,0x64,0x77, 0x4,0x64,0x79, + 0x7,0x51,0x2f, 0x7,0x51,0x31, 0x7,0x51,0x32, 0xf,0x66,0x75, + 0x7,0x51,0x35, 0x7,0x51,0x37, 0x7,0x51,0x30, 0x7,0x51,0x2d, + 0x4,0x67,0x6a, 0x4,0x67,0x69, 0x7,0x55,0x78, 0x5,0x71,0x5e, + 0x5,0x71,0x5f, 0x4,0x67,0x6b, 0x4,0x67,0x6c, 0x7,0x55,0x7a, + 0x5,0x71,0x60, 0x5,0x71,0x61, 0x7,0x55,0x7d, 0x7,0x55,0x79, + 0x7,0x55,0x7e, 0x7,0x55,0x7b, 0x5,0x74,0x5c, 0x5,0x74,0x5f, + 0x4,0x69,0x59, 0x7,0x59,0x78, 0x5,0x74,0x5d, 0x7,0x59,0x79, + 0x7,0x59,0x7a, 0x5,0x74,0x5a, 0x5,0x74,0x5e, 0x5,0x74,0x5b, + 0x7,0x59,0x77, 0x5,0x76,0x62, 0x7,0x5d,0x3b, 0x7,0x5d,0x3c, + 0xf,0x6b,0x33, 0x5,0x76,0x63, 0x5,0x78,0x44, 0x4,0x6c,0x32, + 0x4,0x6c,0x31, 0x7,0x5f,0x7d, 0x7,0x5f,0x7e, 0x7,0x60,0x21, + 0xf,0x6b,0x70, 0x4,0x6d,0x2c, 0x5,0x79,0x56, 0x4,0x6d,0x2b, + 0x5,0x79,0x55, 0x7,0x61,0x5b, 0x5,0x79,0x57, 0x5,0x7a,0x44, + 0x7,0x62,0x7b, 0x5,0x7a,0x43, 0x7,0x62,0x7c, 0xf,0x6c,0x59, + 0x7,0x63,0x23, 0x5,0x7a,0x42, 0x7,0x64,0x6c, 0x4,0x6e,0x3e, + 0x7,0x65,0x4b, 0x7,0x65,0x4a, 0x7,0x65,0x4c, 0x5,0x7b,0x6c, + 0x7,0x66,0x2d, 0x7,0x66,0x4e, 0x7,0x66,0x51, 0x4,0x6e,0x5c, + 0x4,0x36,0x26, 0x6,0x50,0x34, 0xf,0x46,0x2e, 0xf,0x46,0x2f, + 0xf,0x46,0x30, 0x6,0x59,0x7d, 0x4,0x48,0x36, 0x7,0x2c,0x44, + 0x7,0x35,0x3d, 0x5,0x5a,0x74, 0x7,0x44,0x66, 0xf,0x64,0x4f, + 0x5,0x71,0x62, 0xf,0x6b,0x71, 0x6,0x3c,0x74, 0x6,0x2e,0x49, + 0x6,0x3c,0x73, 0x4,0x36,0x27, 0x6,0x46,0x34, 0x4,0x36,0x29, + 0xf,0x39,0x2d, 0x6,0x50,0x35, 0x5,0x3d,0x42, 0x4,0x3b,0x75, + 0x6,0x50,0x37, 0x6,0x50,0x36, 0xf,0x40,0x28, 0xf,0x40,0x29, + 0x6,0x5a,0x21, 0x6,0x59,0x7e, 0xf,0x4d,0x3b, 0x4,0x4e,0x4d, + 0x7,0x2a,0x6e, 0x7,0x2a,0x6d, 0x7,0x35,0x3e, 0x7,0x51,0x38, + 0x7,0x51,0x39, 0x6,0x50,0x39, 0x6,0x50,0x3a, 0x6,0x50,0x38, + 0x4,0x41,0x59, 0x4,0x41,0x5b, 0x5,0x44,0x28, 0x5,0x44,0x27, + 0x6,0x5a,0x23, 0x6,0x5a,0x22, 0x6,0x64,0x22, 0x5,0x4b,0x25, + 0x4,0x48,0x39, 0x6,0x64,0x21, 0x5,0x4b,0x24, 0xf,0x4d,0x3c, + 0x6,0x64,0x23, 0x4,0x4e,0x4e, 0x5,0x52,0x46, 0x5,0x52,0x48, + 0x5,0x52,0x47, 0x7,0x2a,0x70, 0x7,0x2a,0x6f, 0xf,0x58,0x77, + 0x5,0x59,0x50, 0x5,0x59,0x4f, 0x5,0x59,0x54, 0x5,0x59,0x51, + 0x5,0x59,0x52, 0x5,0x59,0x53, 0xf,0x58,0x76, 0x7,0x35,0x3f, + 0x7,0x3d,0x4f, 0x5,0x5f,0x5f, 0x5,0x5f,0x60, 0x5,0x5f,0x62, + 0x5,0x5f,0x61, 0xf,0x5d,0x5b, 0x7,0x3d,0x51, 0x5,0x65,0x72, + 0x7,0x44,0x67, 0x5,0x65,0x70, 0x5,0x65,0x71, 0x4,0x5e,0x39, + 0x5,0x6a,0x4b, 0x5,0x6a,0x4a, 0x5,0x6e,0x47, 0x5,0x6e,0x46, + 0x7,0x4d,0x50, 0x7,0x51,0x3a, 0x5,0x6c,0x46, 0x5,0x71,0x64, + 0x7,0x56,0x22, 0x5,0x71,0x66, 0x5,0x71,0x65, 0xf,0x68,0x79, + 0x7,0x56,0x21, 0x7,0x56,0x24, 0x7,0x56,0x23, 0x7,0x59,0x7b, + 0x7,0x59,0x7c, 0x7,0x5d,0x3d, 0x5,0x76,0x64, 0xf,0x6b,0x34, + 0x7,0x60,0x22, 0x5,0x7a,0x45, 0x7,0x64,0x21, 0x7,0x64,0x6e, + 0x7,0x64,0x6d, 0xf,0x39,0x2e, 0x5,0x3d,0x43, 0x4,0x3b,0x78, + 0x6,0x50,0x3b, 0x5,0x44,0x2c, 0x5,0x44,0x2b, 0x6,0x5a,0x26, + 0x6,0x5a,0x29, 0x5,0x44,0x2a, 0x6,0x5a,0x27, 0x5,0x44,0x29, + 0x6,0x5a,0x25, 0x6,0x5a,0x2b, 0x6,0x5a,0x2a, 0x4,0x41,0x5c, + 0x4,0x41,0x5e, 0xf,0x46,0x31, 0x5,0x4b,0x27, 0x4,0x48,0x3c, + 0x5,0x4b,0x26, 0x6,0x64,0x27, 0x6,0x64,0x25, 0x5,0x4b,0x28, + 0x5,0x4b,0x29, 0x4,0x48,0x3e, 0x5,0x4b,0x2c, 0x5,0x4b,0x2a, + 0x5,0x4b,0x2d, 0x5,0x4b,0x2b, 0x6,0x64,0x29, 0x4,0x48,0x3f, + 0x6,0x64,0x28, 0x6,0x64,0x24, 0x6,0x64,0x26, 0x7,0x2a,0x73, + 0x5,0x52,0x49, 0x7,0x2a,0x77, 0x7,0x2a,0x76, 0x4,0x4e,0x51, + 0x7,0x2a,0x79, 0x5,0x52,0x4a, 0x4,0x4e,0x52, 0x7,0x2a,0x75, + 0x4,0x4e,0x53, 0x5,0x52,0x4d, 0x4,0x4e,0x50, 0x5,0x52,0x4c, + 0x5,0x52,0x4e, 0x7,0x2a,0x74, 0x5,0x52,0x4b, 0x7,0x2a,0x78, + 0x7,0x2a,0x72, 0x7,0x35,0x44, 0x5,0x59,0x55, 0x5,0x59,0x58, + 0x4,0x54,0x66, 0x4,0x54,0x5e, 0x4,0x54,0x65, 0x5,0x59,0x56, + 0x5,0x59,0x57, 0x7,0x35,0x43, 0x7,0x35,0x47, 0x7,0x35,0x40, + 0x7,0x35,0x41, 0x7,0x35,0x45, 0x7,0x35,0x46, 0x7,0x3d,0x58, + 0x7,0x3d,0x5a, 0x5,0x5f,0x63, 0x5,0x5f,0x69, 0x4,0x59,0x66, + 0x5,0x5f,0x65, 0x7,0x3d,0x53, 0x4,0x59,0x67, 0x7,0x35,0x42, + 0x5,0x5f,0x6d, 0x7,0x3d,0x57, 0x4,0x59,0x65, 0x7,0x3d,0x59, + 0x5,0x5f,0x67, 0x5,0x5f,0x6a, 0x7,0x3d,0x55, 0x5,0x5f,0x6b, + 0x7,0x3d,0x5b, 0x7,0x35,0x48, 0x5,0x5f,0x68, 0x7,0x3d,0x54, + 0x7,0x3d,0x5c, 0xf,0x5d,0x5c, 0x7,0x3d,0x52, 0x5,0x5f,0x6c, + 0x5,0x5f,0x66, 0x4,0x5e,0x44, 0x5,0x65,0x7c, 0x5,0x65,0x74, + 0x4,0x5e,0x3a, 0x5,0x65,0x76, 0x5,0x66,0x22, 0x7,0x44,0x6a, + 0x7,0x44,0x68, 0x4,0x5e,0x3f, 0x5,0x65,0x77, 0x4,0x5e,0x40, + 0x7,0x44,0x6d, 0x7,0x44,0x70, 0x5,0x66,0x21, 0x7,0x44,0x6f, + 0x4,0x5e,0x3d, 0x5,0x66,0x23, 0x7,0x44,0x71, 0x7,0x44,0x72, + 0x7,0x44,0x6e, 0xf,0x61,0x53, 0xf,0x61,0x54, 0x5,0x5f,0x64, + 0x7,0x44,0x6c, 0x7,0x44,0x6b, 0x5,0x65,0x78, 0x5,0x66,0x24, + 0x7,0x44,0x69, 0x5,0x65,0x75, 0x5,0x65,0x7a, 0x5,0x65,0x79, + 0x5,0x65,0x7d, 0x4,0x61,0x7a, 0x5,0x6a,0x51, 0x5,0x6a,0x54, + 0x5,0x6a,0x4f, 0x4,0x61,0x79, 0x5,0x6a,0x4d, 0x7,0x4b,0x5a, + 0x5,0x6a,0x55, 0x7,0x4b,0x63, 0x5,0x6a,0x4e, 0x4,0x61,0x78, + 0x7,0x4b,0x61, 0x4,0x61,0x76, 0x7,0x4b,0x5e, 0x4,0x61,0x75, + 0x7,0x4b,0x62, 0x5,0x6a,0x50, 0x7,0x4b,0x60, 0xf,0x64,0x50, + 0xf,0x64,0x52, 0xf,0x64,0x53, 0x7,0x4b,0x5b, 0x7,0x4b,0x5c, + 0x5,0x6a,0x53, 0x5,0x6a,0x52, 0x7,0x4b,0x59, 0x5,0x6a,0x4c, + 0x4,0x65,0x24, 0x5,0x6e,0x4e, 0x4,0x64,0x7d, 0x5,0x6e,0x4f, + 0x5,0x6e,0x4a, 0x7,0x51,0x3b, 0x5,0x6e,0x48, 0x7,0x51,0x3d, + 0x4,0x65,0x21, 0x5,0x6e,0x4c, 0x4,0x65,0x22, 0x4,0x65,0x25, + 0x5,0x6e,0x4d, 0x7,0x51,0x41, 0x7,0x51,0x3c, 0xf,0x66,0x78, + 0x7,0x51,0x3e, 0x7,0x51,0x43, 0x7,0x51,0x40, 0x5,0x6e,0x4b, + 0x7,0x51,0x3f, 0x5,0x6e,0x50, 0x4,0x65,0x26, 0x7,0x51,0x42, + 0x5,0x71,0x6d, 0x7,0x56,0x28, 0x4,0x67,0x6f, 0x7,0x56,0x2a, + 0x7,0x56,0x2b, 0x5,0x71,0x6a, 0x5,0x71,0x6b, 0x5,0x71,0x6c, + 0x5,0x71,0x67, 0x5,0x71,0x68, 0x7,0x56,0x29, 0xf,0x66,0x77, + 0x5,0x74,0x60, 0x7,0x5a,0x26, 0x7,0x59,0x7d, 0x4,0x69,0x5d, + 0x5,0x74,0x61, 0x7,0x5a,0x25, 0x7,0x5a,0x23, 0x7,0x59,0x7e, + 0x7,0x5a,0x24, 0x5,0x74,0x63, 0x5,0x74,0x64, 0x7,0x5a,0x21, + 0x7,0x5a,0x22, 0x5,0x74,0x65, 0x5,0x76,0x65, 0x5,0x76,0x68, + 0x5,0x76,0x66, 0x7,0x5d,0x3e, 0x5,0x76,0x69, 0x5,0x76,0x67, + 0x7,0x5d,0x41, 0x7,0x5d,0x3f, 0x7,0x5d,0x42, 0x7,0x5d,0x40, + 0x5,0x78,0x46, 0x5,0x79,0x58, 0x7,0x60,0x23, 0x5,0x78,0x45, + 0x5,0x78,0x47, 0x7,0x61,0x5e, 0x7,0x61,0x5c, 0x7,0x61,0x5d, + 0x5,0x7a,0x46, 0x7,0x62,0x7e, 0x7,0x63,0x22, 0x5,0x79,0x59, + 0x7,0x63,0x21, 0x7,0x62,0x7d, 0x5,0x7b,0x22, 0x7,0x64,0x70, + 0x7,0x64,0x6f, 0x5,0x7b,0x4c, 0x7,0x65,0x69, 0x5,0x7c,0x35, + 0x7,0x66,0x2e, 0x7,0x66,0x39, 0x7,0x66,0x38, 0x5,0x7c,0x4c, + 0x5,0x3d,0x44, 0x4,0x41,0x60, 0x4,0x41,0x62, 0x6,0x5a,0x2c, + 0x5,0x44,0x2d, 0x6,0x64,0x2b, 0x5,0x4b,0x2f, 0x5,0x4b,0x31, + 0x5,0x4b,0x2e, 0x5,0x4b,0x30, 0x6,0x64,0x2a, 0xf,0x4d,0x3d, + 0x5,0x4b,0x32, 0x4,0x4e,0x55, 0x5,0x52,0x50, 0x4,0x4e,0x54, + 0x4,0x4e,0x56, 0x7,0x2a,0x7b, 0x7,0x2a,0x7a, 0x7,0x2a,0x7c, + 0x7,0x2a,0x7d, 0x7,0x2a,0x7e, 0x5,0x52,0x4f, 0x5,0x52,0x51, + 0x5,0x59,0x59, 0x7,0x35,0x49, 0x7,0x35,0x4a, 0x5,0x59,0x5c, + 0x5,0x59,0x5d, 0x5,0x59,0x5b, 0x7,0x35,0x4b, 0x5,0x59,0x5a, + 0x4,0x59,0x69, 0x7,0x3d,0x5e, 0x5,0x5f,0x6e, 0x7,0x3d,0x5f, + 0x4,0x59,0x6c, 0x4,0x59,0x6a, 0x5,0x5f,0x6f, 0x5,0x5f,0x70, + 0xf,0x5d,0x5d, 0x7,0x3d,0x5d, 0x7,0x3d,0x60, 0x7,0x44,0x76, + 0x7,0x44,0x73, 0x4,0x5e,0x46, 0x7,0x44,0x74, 0x7,0x3d,0x61, + 0x5,0x66,0x25, 0x7,0x44,0x78, 0x7,0x44,0x75, 0x7,0x4b,0x64, + 0x7,0x4b,0x66, 0x7,0x4b,0x69, 0x7,0x4b,0x65, 0x7,0x4b,0x68, + 0x7,0x4b,0x67, 0x7,0x51,0x44, 0x5,0x6a,0x56, 0x5,0x6a,0x57, + 0x7,0x51,0x45, 0x7,0x51,0x46, 0x4,0x65,0x28, 0xf,0x66,0x79, + 0x5,0x6e,0x52, 0x5,0x6e,0x51, 0x5,0x71,0x6e, 0x5,0x71,0x70, + 0x5,0x71,0x72, 0x4,0x67,0x74, 0x7,0x56,0x2c, 0x5,0x71,0x6f, + 0x5,0x71,0x71, 0x7,0x5a,0x27, 0x4,0x69,0x5f, 0x5,0x74,0x66, + 0x7,0x5a,0x28, 0x7,0x5a,0x29, 0x5,0x74,0x67, 0x7,0x5d,0x43, + 0x7,0x5d,0x46, 0x7,0x5d,0x45, 0x7,0x5d,0x44, 0x4,0x6c,0x35, + 0x7,0x61,0x5f, 0x5,0x7a,0x47, 0x7,0x64,0x24, 0x7,0x64,0x22, + 0x7,0x64,0x23, 0x5,0x7b,0x4d, 0x5,0x7b,0x6d, 0x5,0x7c,0x22, + 0x5,0x44,0x2e, 0x6,0x5a,0x2d, 0x5,0x52,0x52, 0x7,0x35,0x4c, + 0x4,0x59,0x6d, 0x7,0x3d,0x62, 0x7,0x4b,0x6c, 0x7,0x51,0x48, + 0x4,0x65,0x2b, 0x5,0x71,0x73, 0x7,0x51,0x47, 0x7,0x56,0x2d, + 0x7,0x5a,0x2a, 0x7,0x5d,0x48, 0x7,0x5d,0x47, 0x7,0x61,0x60, + 0xf,0x40,0x2c, 0x5,0x44,0x30, 0x5,0x44,0x2f, 0x5,0x4b,0x33, + 0x4,0x48,0x45, 0x5,0x4b,0x34, 0x5,0x52,0x5a, 0x7,0x2b,0x21, + 0x5,0x52,0x54, 0x5,0x52,0x57, 0x7,0x2b,0x22, 0x5,0x52,0x55, + 0x5,0x52,0x56, 0x5,0x52,0x59, 0x5,0x52,0x53, 0x4,0x54,0x6b, + 0x5,0x52,0x58, 0xf,0x58,0x79, 0x5,0x59,0x5e, 0x7,0x35,0x4d, + 0x7,0x3d,0x63, 0x5,0x5f,0x71, 0x5,0x5f,0x72, 0x5,0x66,0x26, + 0x5,0x66,0x27, 0x5,0x66,0x28, 0x4,0x62,0x21, 0x5,0x6a,0x58, + 0x5,0x6a,0x59, 0x7,0x51,0x49, 0x7,0x51,0x4a, 0x5,0x6e,0x54, + 0x5,0x6e,0x53, 0x5,0x6e,0x55, 0x7,0x56,0x2e, 0x5,0x71,0x74, + 0x5,0x66,0x29, 0x5,0x74,0x68, 0x5,0x74,0x69, 0x4,0x69,0x61, + 0xf,0x6a,0x33, 0x7,0x5d,0x4a, 0x4,0x6c,0x36, 0x5,0x7b,0x23, + 0x5,0x7c,0x3f, 0x6,0x34,0x7b, 0x6,0x46,0x35, 0x5,0x36,0x46, + 0x5,0x3d,0x4a, 0x5,0x3d,0x48, 0x5,0x3d,0x49, 0x5,0x3d,0x46, + 0x4,0x3b,0x7d, 0x5,0x3d,0x45, 0x4,0x3b,0x7c, 0x6,0x50,0x3c, + 0x4,0x3b,0x7a, 0x4,0x41,0x6c, 0x5,0x44,0x3a, 0x4,0x41,0x6b, + 0x5,0x44,0x31, 0x5,0x44,0x39, 0x6,0x5a,0x2f, 0x4,0x41,0x69, + 0x5,0x4b,0x3b, 0x5,0x44,0x37, 0x4,0x41,0x66, 0x4,0x41,0x67, + 0x4,0x41,0x6a, 0x6,0x5a,0x32, 0x5,0x44,0x36, 0x5,0x44,0x32, + 0x6,0x5a,0x30, 0x6,0x5a,0x31, 0x6,0x5a,0x2e, 0xf,0x46,0x33, + 0x5,0x44,0x33, 0x5,0x44,0x38, 0x5,0x4b,0x3d, 0x6,0x64,0x31, + 0x6,0x64,0x32, 0x5,0x4b,0x37, 0x5,0x4b,0x44, 0x5,0x4b,0x38, + 0x4,0x48,0x49, 0x4,0x48,0x48, 0x5,0x4b,0x3a, 0x5,0x4b,0x36, + 0x4,0x48,0x4f, 0x5,0x4b,0x42, 0x5,0x4b,0x39, 0x7,0x2b,0x2b, + 0x5,0x4b,0x43, 0x6,0x64,0x35, 0x6,0x64,0x33, 0x6,0x64,0x2e, + 0x5,0x4b,0x3c, 0x5,0x4b,0x41, 0xf,0x4d,0x3e, 0x6,0x64,0x2d, + 0x5,0x4b,0x40, 0x6,0x64,0x2c, 0x6,0x64,0x36, 0x5,0x4b,0x35, + 0x6,0x64,0x2f, 0x6,0x64,0x34, 0x5,0x52,0x5d, 0x4,0x4e,0x5b, + 0x7,0x2b,0x25, 0x7,0x2b,0x30, 0x5,0x52,0x5c, 0x5,0x52,0x5b, + 0x4,0x4e,0x58, 0x7,0x2b,0x24, 0x7,0x2b,0x2a, 0x4,0x48,0x4a, + 0x7,0x2b,0x2e, 0x5,0x52,0x5e, 0x4,0x4e,0x5e, 0x7,0x2b,0x2d, + 0x7,0x2b,0x29, 0x7,0x35,0x4f, 0x7,0x2b,0x2c, 0xf,0x53,0x23, + 0xf,0x53,0x24, 0x7,0x2b,0x27, 0x7,0x2b,0x28, 0x7,0x2b,0x2f, + 0x7,0x2b,0x31, 0x7,0x2b,0x23, 0x7,0x2b,0x26, 0x5,0x52,0x5f, + 0x4,0x54,0x6c, 0x5,0x59,0x61, 0x4,0x54,0x6e, 0x5,0x59,0x69, + 0x7,0x35,0x58, 0x5,0x59,0x68, 0x5,0x59,0x66, 0x7,0x35,0x59, + 0x7,0x35,0x57, 0x5,0x59,0x65, 0x5,0x59,0x63, 0x7,0x35,0x5b, + 0x7,0x35,0x50, 0x5,0x59,0x6a, 0x5,0x59,0x62, 0x5,0x59,0x6b, + 0x5,0x59,0x64, 0x5,0x59,0x67, 0x4,0x54,0x71, 0x7,0x35,0x4e, + 0x5,0x59,0x60, 0x7,0x35,0x5a, 0x4,0x54,0x72, 0x7,0x35,0x56, + 0x7,0x35,0x5c, 0xf,0x4d,0x40, 0xf,0x58,0x7a, 0xf,0x58,0x7c, + 0xf,0x58,0x7d, 0xf,0x59,0x21, 0xf,0x59,0x22, 0xf,0x59,0x23, + 0x7,0x35,0x52, 0x7,0x35,0x53, 0x7,0x35,0x54, 0x7,0x35,0x55, + 0x5,0x59,0x6c, 0x5,0x59,0x5f, 0xf,0x58,0x7e, 0x5,0x59,0x6d, + 0x4,0x59,0x75, 0x4,0x59,0x71, 0x4,0x59,0x6e, 0x7,0x3d,0x65, + 0x5,0x5f,0x77, 0x4,0x59,0x79, 0x5,0x5f,0x78, 0x4,0x59,0x74, + 0x5,0x5f,0x76, 0x5,0x5f,0x73, 0x5,0x5f,0x75, 0x4,0x59,0x6f, + 0x5,0x5f,0x7b, 0x7,0x3d,0x6a, 0x4,0x59,0x72, 0x7,0x3d,0x6c, + 0x5,0x5f,0x74, 0x7,0x3d,0x67, 0x4,0x59,0x78, 0x7,0x3d,0x6b, + 0xf,0x5d,0x5e, 0xf,0x5d,0x5f, 0xf,0x5d,0x60, 0xf,0x5d,0x61, + 0xf,0x5d,0x62, 0xf,0x5d,0x63, 0x7,0x3d,0x64, 0x7,0x3d,0x66, + 0x5,0x5f,0x79, 0x5,0x5f,0x7a, 0x7,0x3d,0x68, 0x7,0x3d,0x6d, + 0x5,0x66,0x2a, 0x4,0x5e,0x4a, 0x5,0x66,0x30, 0x5,0x66,0x2e, + 0x4,0x62,0x24, 0x5,0x66,0x2d, 0x5,0x66,0x2b, 0x7,0x44,0x7b, + 0x5,0x66,0x2c, 0x4,0x5e,0x48, 0x5,0x66,0x31, 0x5,0x66,0x2f, + 0x7,0x44,0x7c, 0xf,0x61,0x55, 0xf,0x61,0x56, 0xf,0x61,0x57, + 0xf,0x61,0x58, 0x7,0x44,0x79, 0x7,0x44,0x7a, 0x7,0x4b,0x76, + 0x5,0x6a,0x5d, 0x7,0x4b,0x70, 0x7,0x4b,0x6d, 0x5,0x6a,0x5e, + 0x4,0x62,0x2e, 0x7,0x4b,0x72, 0x5,0x6a,0x5c, 0x5,0x6e,0x56, + 0x5,0x6a,0x5b, 0x5,0x6a,0x5a, 0x7,0x4b,0x74, 0x7,0x4b,0x6f, + 0x4,0x62,0x2a, 0x7,0x4b,0x6e, 0x7,0x4b,0x75, 0x7,0x4b,0x71, + 0xf,0x64,0x54, 0xf,0x64,0x55, 0x7,0x4b,0x77, 0x7,0x4b,0x73, + 0x4,0x65,0x2e, 0x4,0x65,0x2d, 0x5,0x6e,0x5b, 0x5,0x6e,0x59, + 0x7,0x51,0x4e, 0x5,0x6e,0x5a, 0x4,0x65,0x32, 0x7,0x51,0x4d, + 0x4,0x65,0x33, 0x5,0x6e,0x58, 0x7,0x51,0x4b, 0x7,0x51,0x4f, + 0xf,0x66,0x7a, 0x4,0x65,0x34, 0x7,0x51,0x50, 0x7,0x51,0x4c, + 0x5,0x6e,0x57, 0x7,0x50,0x4c, 0x5,0x71,0x75, 0x5,0x71,0x76, + 0x7,0x56,0x2f, 0x5,0x71,0x78, 0x7,0x56,0x38, 0x7,0x5a,0x31, + 0x4,0x67,0x7a, 0x4,0x67,0x78, 0x7,0x56,0x33, 0x7,0x56,0x31, + 0x7,0x56,0x36, 0x5,0x71,0x77, 0x5,0x71,0x79, 0x5,0x71,0x7a, + 0x7,0x56,0x30, 0x7,0x56,0x34, 0xf,0x68,0x7a, 0xf,0x68,0x7b, + 0xf,0x68,0x7c, 0x7,0x56,0x37, 0x7,0x56,0x35, 0x7,0x5a,0x30, + 0x5,0x74,0x6c, 0x5,0x74,0x6b, 0x7,0x5a,0x2d, 0x7,0x5a,0x2f, + 0x5,0x74,0x6a, 0xf,0x6a,0x34, 0x7,0x5a,0x2b, 0x7,0x5a,0x2e, + 0x7,0x5a,0x2c, 0x7,0x5d,0x52, 0x7,0x5d,0x51, 0x7,0x5d,0x4f, + 0x5,0x76,0x6c, 0x5,0x76,0x6d, 0x4,0x6b,0x2e, 0x5,0x76,0x6a, + 0x7,0x5d,0x4d, 0x4,0x6b,0x2f, 0x7,0x5d,0x4e, 0xf,0x6b,0x35, + 0x7,0x5d,0x50, 0x7,0x5d,0x4c, 0x7,0x5d,0x4b, 0x4,0x6c,0x38, + 0x7,0x60,0x24, 0x5,0x76,0x6b, 0x4,0x6c,0x37, 0xf,0x6b,0x72, + 0x7,0x60,0x25, 0x4,0x6d,0x2e, 0x5,0x79,0x5a, 0x5,0x7a,0x48, + 0x7,0x63,0x24, 0x5,0x7a,0x49, 0x7,0x63,0x25, 0x7,0x63,0x26, + 0x4,0x6e,0x23, 0x7,0x64,0x25, 0x7,0x65,0x4d, 0x6,0x46,0x36, + 0x6,0x50,0x3f, 0x4,0x3c,0x21, 0x6,0x50,0x3d, 0x5,0x3d,0x4b, + 0xf,0x40,0x2e, 0x6,0x50,0x3e, 0x5,0x44,0x3b, 0x5,0x44,0x40, + 0x4,0x41,0x6f, 0x5,0x44,0x3d, 0x5,0x44,0x3e, 0x6,0x5a,0x34, + 0x6,0x5a,0x36, 0x5,0x44,0x3c, 0x4,0x41,0x70, 0x6,0x5a,0x35, + 0x6,0x53,0x33, 0x5,0x44,0x3f, 0x6,0x5a,0x37, 0x4,0x48,0x58, + 0x5,0x4b,0x48, 0x4,0x48,0x55, 0x5,0x4b,0x47, 0x5,0x4b,0x46, + 0x5,0x4b,0x45, 0x4,0x48,0x53, 0x6,0x64,0x37, 0x4,0x48,0x52, + 0x6,0x64,0x3b, 0x6,0x64,0x39, 0x6,0x64,0x38, 0x4,0x4e,0x5f, + 0x5,0x52,0x62, 0x4,0x4e,0x62, 0x7,0x2b,0x34, 0x7,0x2b,0x33, + 0x7,0x2b,0x32, 0x5,0x52,0x61, 0x7,0x2b,0x35, 0xf,0x53,0x25, + 0xf,0x53,0x26, 0x5,0x59,0x6f, 0x5,0x59,0x77, 0x5,0x59,0x70, + 0x7,0x35,0x5d, 0x7,0x35,0x60, 0x5,0x59,0x6e, 0x5,0x59,0x73, + 0x5,0x59,0x76, 0x7,0x35,0x5f, 0x7,0x35,0x61, 0x5,0x59,0x74, + 0x5,0x59,0x75, 0x7,0x35,0x5e, 0xf,0x59,0x25, 0x5,0x59,0x72, + 0x5,0x59,0x71, 0x7,0x3d,0x71, 0x4,0x5a,0x25, 0x5,0x60,0x25, + 0x5,0x60,0x26, 0x4,0x59,0x7b, 0x5,0x5f,0x7c, 0x7,0x3d,0x70, + 0x4,0x5a,0x24, 0x5,0x66,0x32, 0x5,0x60,0x22, 0x4,0x5a,0x23, + 0x5,0x5f,0x7e, 0x5,0x60,0x21, 0x5,0x60,0x24, 0x5,0x5f,0x7d, + 0x5,0x60,0x23, 0x7,0x3d,0x6e, 0xf,0x5d,0x64, 0xf,0x5d,0x65, + 0x7,0x3d,0x72, 0x7,0x3d,0x6f, 0x4,0x5e,0x53, 0x7,0x45,0x22, + 0x7,0x45,0x24, 0x5,0x66,0x37, 0x7,0x45,0x26, 0x5,0x66,0x34, + 0x5,0x66,0x38, 0x4,0x5e,0x54, 0x5,0x66,0x3a, 0x4,0x62,0x31, + 0x5,0x66,0x35, 0x7,0x45,0x25, 0x5,0x66,0x36, 0x5,0x66,0x39, + 0x5,0x66,0x33, 0xf,0x61,0x59, 0x7,0x45,0x28, 0x7,0x45,0x23, + 0x7,0x45,0x21, 0x7,0x45,0x27, 0x7,0x44,0x7d, 0x5,0x6a,0x5f, + 0x4,0x62,0x33, 0x4,0x62,0x34, 0x4,0x62,0x35, 0x5,0x6a,0x60, + 0x7,0x4b,0x79, 0xf,0x64,0x56, 0xf,0x64,0x57, 0x7,0x4b,0x78, + 0x7,0x4b,0x7a, 0x7,0x4b,0x7b, 0x7,0x4b,0x7c, 0x5,0x6e,0x5e, + 0x5,0x6e,0x61, 0x5,0x6e,0x60, 0x4,0x65,0x35, 0x5,0x6e,0x5c, + 0x4,0x65,0x37, 0x5,0x6e,0x5f, 0xf,0x66,0x7b, 0x5,0x6e,0x62, + 0x5,0x6e,0x5d, 0x4,0x65,0x38, 0x7,0x56,0x40, 0x4,0x67,0x7d, + 0x4,0x68,0x21, 0x5,0x71,0x7b, 0x7,0x56,0x39, 0x5,0x71,0x7c, + 0x7,0x56,0x3c, 0x7,0x56,0x3a, 0xf,0x68,0x7d, 0x7,0x56,0x3f, + 0x7,0x56,0x41, 0x7,0x56,0x42, 0x7,0x56,0x3d, 0x7,0x56,0x3e, + 0x7,0x56,0x3b, 0x7,0x5a,0x32, 0xf,0x6a,0x35, 0x7,0x5a,0x33, + 0x7,0x5d,0x53, 0x5,0x78,0x49, 0x4,0x6c,0x3b, 0x7,0x60,0x26, + 0x7,0x60,0x27, 0x5,0x79,0x5b, 0x7,0x61,0x61, 0x5,0x79,0x5c, + 0x4,0x6d,0x2f, 0x4,0x6d,0x66, 0x5,0x7a,0x4a, 0x5,0x7b,0x24, + 0x7,0x64,0x26, 0xf,0x6d,0x24, 0x5,0x7c,0x47, 0x7,0x66,0x55, + 0x6,0x3c,0x75, 0x5,0x40,0x39, 0x7,0x2b,0x36, 0x7,0x4b,0x7d, + 0x5,0x6a,0x61, 0x7,0x56,0x43, 0x4,0x69,0x64, 0x5,0x74,0x6d, + 0x6,0x34,0x7c, 0x6,0x34,0x7d, 0x6,0x35,0x22, 0x6,0x34,0x7e, + 0x5,0x30,0x71, 0x6,0x3c,0x76, 0x6,0x3c,0x78, 0x5,0x3d,0x4c, + 0x5,0x36,0x4a, 0x5,0x36,0x47, 0x6,0x46,0x3a, 0x6,0x46,0x38, + 0x5,0x36,0x49, 0x6,0x46,0x39, 0x6,0x46,0x3b, 0x6,0x50,0x40, + 0x5,0x36,0x48, 0x6,0x50,0x41, 0x6,0x50,0x46, 0x4,0x3c,0x22, + 0x5,0x3d,0x4d, 0x6,0x50,0x44, 0x6,0x50,0x45, 0x4,0x3c,0x26, + 0x5,0x3d,0x4e, 0x6,0x5a,0x38, 0x5,0x3d,0x4f, 0x6,0x50,0x42, + 0xf,0x40,0x2f, 0x6,0x50,0x43, 0x4,0x3c,0x23, 0x6,0x5a,0x42, + 0x6,0x5a,0x39, 0x5,0x44,0x42, 0x5,0x44,0x44, 0x5,0x44,0x41, + 0x5,0x44,0x47, 0x4,0x41,0x76, 0x5,0x44,0x43, 0x6,0x64,0x43, + 0x5,0x44,0x45, 0x6,0x5a,0x3c, 0x6,0x5a,0x3b, 0x6,0x64,0x3d, + 0x4,0x41,0x73, 0x6,0x5a,0x3a, 0x6,0x64,0x3e, 0x6,0x5a,0x3e, + 0x5,0x44,0x48, 0x6,0x5a,0x41, 0x5,0x52,0x63, 0xf,0x46,0x37, + 0x6,0x5a,0x40, 0x6,0x5a,0x3f, 0x6,0x64,0x3c, 0x4,0x41,0x78, + 0x5,0x44,0x46, 0x6,0x64,0x3f, 0x7,0x2b,0x37, 0x6,0x64,0x44, + 0x5,0x4b,0x4d, 0x5,0x4b,0x49, 0x6,0x64,0x45, 0x5,0x4b,0x4a, + 0x4,0x48,0x5a, 0x6,0x64,0x42, 0x5,0x4b,0x4b, 0x7,0x2b,0x39, + 0x6,0x64,0x41, 0xf,0x46,0x36, 0xf,0x53,0x28, 0x7,0x2b,0x3a, + 0x4,0x4e,0x6b, 0x7,0x2b,0x40, 0x4,0x4e,0x6a, 0x5,0x52,0x69, + 0x5,0x52,0x64, 0x5,0x59,0x79, 0x4,0x4e,0x68, 0x5,0x52,0x66, + 0x5,0x52,0x6b, 0x5,0x52,0x68, 0x4,0x4e,0x6c, 0x5,0x52,0x6a, + 0x7,0x2b,0x3c, 0x5,0x52,0x65, 0x7,0x2b,0x3b, 0x7,0x3d,0x73, + 0x5,0x52,0x67, 0x7,0x2b,0x3e, 0x7,0x2b,0x3d, 0xf,0x53,0x27, + 0x5,0x59,0x78, 0x7,0x2b,0x3f, 0x5,0x5a,0x23, 0x4,0x5a,0x26, + 0x5,0x5a,0x24, 0x4,0x54,0x7b, 0x7,0x35,0x66, 0x7,0x35,0x6a, + 0x5,0x60,0x27, 0x5,0x59,0x7b, 0x7,0x35,0x69, 0x5,0x59,0x7e, + 0x7,0x35,0x67, 0x5,0x59,0x7c, 0x7,0x35,0x6f, 0x4,0x54,0x79, + 0x7,0x35,0x6b, 0x7,0x35,0x70, 0x5,0x5a,0x25, 0x7,0x35,0x68, + 0x7,0x35,0x63, 0x5,0x59,0x7a, 0x7,0x35,0x65, 0x7,0x35,0x64, + 0x7,0x35,0x6c, 0x5,0x60,0x29, 0x7,0x35,0x6e, 0x7,0x3d,0x75, + 0x7,0x35,0x62, 0x5,0x5a,0x22, 0x7,0x35,0x6d, 0x5,0x59,0x7d, + 0xf,0x59,0x26, 0xf,0x59,0x27, 0xf,0x59,0x28, 0xf,0x59,0x29, + 0x5,0x5a,0x21, 0x7,0x3d,0x74, 0x5,0x60,0x28, 0x5,0x60,0x34, + 0x7,0x3d,0x77, 0x5,0x60,0x2d, 0x5,0x60,0x2f, 0x5,0x60,0x33, + 0x5,0x60,0x2b, 0x7,0x3d,0x76, 0x5,0x60,0x32, 0x5,0x60,0x35, + 0x4,0x5a,0x2b, 0x5,0x60,0x36, 0x7,0x3d,0x78, 0x7,0x3d,0x7d, + 0x7,0x45,0x2a, 0x7,0x3d,0x7a, 0x5,0x60,0x2a, 0x7,0x45,0x2b, + 0x7,0x3e,0x21, 0x5,0x60,0x2e, 0x7,0x3d,0x79, 0x7,0x3d,0x7e, + 0xf,0x5d,0x66, 0xf,0x5d,0x67, 0x7,0x3d,0x7b, 0x5,0x60,0x30, + 0x7,0x3d,0x7c, 0x7,0x45,0x2f, 0x5,0x66,0x3f, 0x5,0x66,0x3b, + 0x4,0x5e,0x56, 0x4,0x5e,0x5c, 0x5,0x60,0x38, 0x4,0x5e,0x5d, + 0x5,0x66,0x3d, 0x5,0x60,0x37, 0x5,0x66,0x3c, 0x7,0x45,0x2e, + 0x7,0x45,0x2d, 0x7,0x4b,0x7e, 0x4,0x5e,0x5e, 0x5,0x66,0x3e, + 0x7,0x4c,0x22, 0x7,0x51,0x54, 0x7,0x45,0x2c, 0x7,0x45,0x29, + 0x7,0x45,0x31, 0xf,0x61,0x5a, 0xf,0x61,0x5b, 0x7,0x4c,0x25, + 0x7,0x4c,0x21, 0x4,0x5e,0x55, 0x7,0x45,0x32, 0x7,0x45,0x30, + 0x5,0x6a,0x64, 0x7,0x4c,0x23, 0x5,0x6a,0x62, 0x4,0x62,0x3b, + 0x4,0x65,0x3d, 0x7,0x51,0x53, 0x5,0x6a,0x69, 0x5,0x6a,0x66, + 0x5,0x6a,0x68, 0x5,0x6a,0x6a, 0x7,0x51,0x51, 0x4,0x62,0x37, + 0x5,0x6a,0x67, 0x5,0x60,0x39, 0x5,0x6a,0x63, 0x7,0x51,0x52, + 0x4,0x62,0x39, 0x7,0x51,0x58, 0x7,0x4c,0x24, 0x7,0x51,0x57, + 0x4,0x62,0x3a, 0xf,0x64,0x58, 0xf,0x64,0x59, 0x5,0x6a,0x65, + 0x7,0x51,0x56, 0x5,0x6a,0x6b, 0x4,0x65,0x3e, 0x7,0x51,0x55, + 0x7,0x51,0x59, 0x7,0x51,0x5f, 0x7,0x56,0x44, 0x5,0x71,0x7d, + 0x7,0x51,0x60, 0x5,0x6e,0x65, 0x4,0x65,0x3f, 0x5,0x71,0x7e, + 0x5,0x6e,0x64, 0x7,0x51,0x5e, 0x7,0x51,0x62, 0x5,0x6e,0x63, + 0x7,0x4c,0x27, 0x7,0x51,0x61, 0x7,0x51,0x5b, 0x7,0x51,0x5c, + 0x7,0x51,0x5d, 0x7,0x56,0x45, 0x7,0x51,0x63, 0x7,0x51,0x5a, + 0x5,0x72,0x28, 0x5,0x72,0x22, 0x7,0x56,0x46, 0x4,0x68,0x25, + 0x5,0x72,0x24, 0x5,0x72,0x21, 0x7,0x56,0x47, 0x5,0x72,0x2b, + 0x7,0x56,0x48, 0x5,0x72,0x2a, 0x5,0x72,0x23, 0x5,0x72,0x27, + 0x5,0x72,0x25, 0x7,0x56,0x49, 0x5,0x72,0x26, 0x5,0x72,0x29, + 0xf,0x68,0x7e, 0x4,0x69,0x66, 0x5,0x74,0x6e, 0x5,0x74,0x6f, + 0x7,0x5a,0x37, 0x7,0x5d,0x54, 0x7,0x5a,0x36, 0x5,0x74,0x70, + 0x7,0x5a,0x35, 0xf,0x6a,0x37, 0x7,0x5a,0x34, 0x5,0x76,0x6e, + 0x7,0x5d,0x56, 0x5,0x76,0x6f, 0x5,0x76,0x70, 0x5,0x78,0x4a, + 0x7,0x5d,0x55, 0x5,0x78,0x4b, 0x5,0x78,0x4c, 0x4,0x6c,0x3c, + 0x7,0x60,0x28, 0x7,0x60,0x2a, 0x7,0x60,0x29, 0x5,0x79,0x5d, + 0x7,0x64,0x27, 0x5,0x7b,0x25, 0x6,0x3c,0x79, 0x6,0x46,0x3c, + 0x6,0x64,0x46, 0x7,0x2b,0x41, 0x6,0x64,0x48, 0x6,0x64,0x47, + 0x5,0x52,0x6c, 0x4,0x55,0x24, 0x4,0x55,0x25, 0x7,0x3e,0x22, + 0x7,0x3e,0x23, 0x7,0x35,0x71, 0x7,0x35,0x73, 0x7,0x35,0x72, + 0x7,0x4c,0x29, 0x7,0x4c,0x28, 0x7,0x45,0x33, 0x7,0x4d,0x73, + 0x7,0x51,0x64, 0x7,0x60,0x2b, 0x4,0x6e,0x26, 0xf,0x32,0x71, + 0x4,0x41,0x7c, 0x6,0x5a,0x43, 0x5,0x47,0x54, 0x6,0x64,0x49, + 0x6,0x64,0x4a, 0xf,0x4d,0x41, 0xf,0x53,0x29, 0x6,0x64,0x4b, + 0x7,0x2b,0x42, 0xf,0x53,0x2a, 0xf,0x59,0x2a, 0x7,0x35,0x74, + 0xf,0x5d,0x68, 0x7,0x3e,0x24, 0x7,0x45,0x36, 0x5,0x66,0x41, + 0x5,0x66,0x40, 0x5,0x66,0x42, 0x7,0x45,0x35, 0x7,0x45,0x34, + 0x5,0x6a,0x6c, 0x4,0x62,0x3d, 0x4,0x62,0x3e, 0x7,0x4c,0x2a, + 0x7,0x51,0x65, 0xf,0x66,0x7c, 0x5,0x72,0x2c, 0xf,0x69,0x21, + 0x7,0x56,0x4a, 0x7,0x5d,0x57, 0x5,0x7a,0x4b, 0x5,0x36,0x4b, + 0x5,0x36,0x4c, 0x5,0x3d,0x50, 0x6,0x50,0x48, 0xf,0x40,0x31, + 0x6,0x50,0x47, 0x5,0x44,0x49, 0x6,0x5a,0x45, 0x6,0x5a,0x44, + 0x6,0x5a,0x47, 0x6,0x5a,0x46, 0x5,0x4b,0x51, 0x6,0x64,0x4d, + 0x6,0x64,0x4e, 0x5,0x4b,0x50, 0x4,0x48,0x61, 0x6,0x64,0x4c, + 0x6,0x64,0x52, 0x5,0x4b,0x4f, 0x7,0x2b,0x43, 0xf,0x4d,0x42, + 0xf,0x4d,0x43, 0xf,0x4d,0x44, 0xf,0x4d,0x45, 0x7,0x2b,0x46, + 0x6,0x64,0x4f, 0x6,0x64,0x51, 0x5,0x4b,0x52, 0x7,0x2b,0x4a, + 0x5,0x52,0x72, 0x7,0x2b,0x4e, 0x7,0x2b,0x47, 0x5,0x5a,0x32, + 0x5,0x52,0x74, 0x5,0x52,0x77, 0x5,0x52,0x6d, 0x5,0x52,0x70, + 0x5,0x52,0x6e, 0x5,0x52,0x75, 0x7,0x2b,0x44, 0x5,0x52,0x76, + 0x7,0x2b,0x48, 0x5,0x52,0x73, 0x7,0x2b,0x4b, 0x7,0x2b,0x49, + 0x5,0x52,0x6f, 0x7,0x2b,0x45, 0x7,0x2b,0x4c, 0x5,0x52,0x71, + 0xf,0x53,0x2b, 0xf,0x53,0x2c, 0xf,0x53,0x2d, 0x7,0x2b,0x4d, + 0x7,0x35,0x7a, 0x4,0x55,0x2c, 0x7,0x35,0x79, 0x5,0x5a,0x2f, + 0x4,0x55,0x2a, 0x4,0x55,0x27, 0x4,0x55,0x2b, 0x4,0x55,0x28, + 0x7,0x35,0x75, 0x5,0x5a,0x29, 0x4,0x55,0x29, 0x5,0x5a,0x30, + 0x5,0x5a,0x2d, 0x7,0x36,0x24, 0x5,0x5a,0x33, 0x5,0x5a,0x27, + 0x5,0x5a,0x31, 0x5,0x5a,0x34, 0x5,0x5a,0x2b, 0x7,0x35,0x7c, + 0x7,0x35,0x7b, 0x7,0x36,0x26, 0x7,0x36,0x21, 0x7,0x35,0x78, + 0x7,0x36,0x23, 0x5,0x5a,0x2a, 0x7,0x36,0x22, 0xf,0x59,0x2c, + 0x5,0x5a,0x28, 0x7,0x35,0x7d, 0x7,0x35,0x7e, 0x7,0x36,0x27, + 0x7,0x36,0x25, 0xf,0x59,0x2b, 0x7,0x35,0x76, 0x7,0x35,0x77, + 0x5,0x60,0x3a, 0x7,0x3e,0x2c, 0x5,0x60,0x3b, 0x7,0x3e,0x26, + 0x4,0x5a,0x2f, 0x7,0x3e,0x27, 0x7,0x3e,0x25, 0x5,0x60,0x3c, + 0x4,0x5a,0x2c, 0x7,0x3e,0x2a, 0x7,0x3e,0x2b, 0x5,0x4b,0x53, + 0x7,0x3e,0x28, 0x5,0x60,0x3e, 0x5,0x60,0x3d, 0xf,0x5d,0x69, + 0xf,0x5d,0x6a, 0x7,0x45,0x3c, 0x5,0x66,0x4c, 0x5,0x66,0x4b, + 0x5,0x66,0x47, 0x4,0x5e,0x64, 0x5,0x66,0x49, 0x5,0x66,0x48, + 0x4,0x5e,0x61, 0x5,0x66,0x45, 0x5,0x66,0x4e, 0x4,0x5e,0x6d, + 0x4,0x5e,0x69, 0x4,0x5e,0x6a, 0x4,0x5e,0x66, 0x5,0x66,0x4f, + 0x5,0x66,0x43, 0x4,0x5e,0x6c, 0x7,0x45,0x3b, 0x7,0x45,0x3a, + 0x7,0x45,0x37, 0x5,0x66,0x4a, 0xf,0x61,0x5d, 0xf,0x61,0x5e, + 0xf,0x61,0x60, 0x4,0x5e,0x6b, 0xf,0x61,0x5c, 0x7,0x45,0x38, + 0x5,0x66,0x44, 0x7,0x45,0x39, 0x5,0x66,0x4d, 0x5,0x6a,0x6d, + 0x5,0x6a,0x73, 0x5,0x6a,0x6f, 0x4,0x62,0x43, 0x7,0x4c,0x31, + 0x5,0x66,0x50, 0x7,0x4c,0x2c, 0x5,0x66,0x46, 0x5,0x6a,0x71, + 0x5,0x6a,0x70, 0x5,0x6a,0x74, 0x7,0x4c,0x2b, 0x5,0x6a,0x72, + 0x5,0x6a,0x76, 0x4,0x62,0x42, 0x5,0x6a,0x77, 0x7,0x4c,0x32, + 0x7,0x4c,0x34, 0x5,0x6a,0x75, 0x7,0x4c,0x33, 0x7,0x4c,0x2d, + 0x7,0x4c,0x2e, 0x7,0x4c,0x2f, 0xf,0x64,0x5b, 0xf,0x64,0x5c, + 0xf,0x64,0x5d, 0x7,0x4c,0x30, 0x3,0x57,0x36, 0x7,0x4c,0x35, + 0x4,0x65,0x45, 0x7,0x51,0x6a, 0x7,0x51,0x69, 0x5,0x6e,0x6e, + 0x5,0x6e,0x69, 0x5,0x6e,0x6b, 0x5,0x6e,0x68, 0x4,0x65,0x42, + 0x5,0x6e,0x70, 0xf,0x66,0x7d, 0x4,0x65,0x43, 0x4,0x65,0x44, + 0x4,0x65,0x48, 0x5,0x6e,0x71, 0x5,0x6e,0x72, 0x5,0x6e,0x67, + 0x7,0x51,0x68, 0x4,0x68,0x26, 0x5,0x6e,0x6a, 0x5,0x6e,0x6f, + 0x5,0x6e,0x6c, 0x7,0x51,0x6b, 0x7,0x51,0x6f, 0x7,0x51,0x70, + 0x7,0x51,0x71, 0x7,0x51,0x6d, 0x7,0x51,0x6c, 0xf,0x66,0x7e, + 0xf,0x67,0x21, 0x7,0x51,0x67, 0x7,0x51,0x6e, 0x7,0x52,0x27, + 0x7,0x51,0x66, 0x5,0x72,0x2f, 0x5,0x72,0x2e, 0x5,0x72,0x31, + 0x4,0x68,0x27, 0x5,0x72,0x32, 0x5,0x72,0x30, 0x4,0x68,0x2c, + 0x7,0x56,0x4d, 0x7,0x56,0x4c, 0x7,0x56,0x4e, 0x7,0x56,0x4b, + 0xf,0x69,0x22, 0x7,0x56,0x4f, 0x7,0x56,0x50, 0x5,0x74,0x78, + 0x7,0x5a,0x3d, 0x5,0x72,0x34, 0x7,0x5a,0x41, 0x7,0x5a,0x38, + 0x5,0x74,0x71, 0x7,0x5a,0x3b, 0x5,0x72,0x33, 0x5,0x74,0x74, + 0x5,0x74,0x77, 0x5,0x74,0x73, 0x7,0x5a,0x40, 0x4,0x69,0x6c, + 0x5,0x74,0x75, 0x7,0x5a,0x39, 0x7,0x5a,0x3a, 0x7,0x5a,0x3c, + 0xf,0x6a,0x38, 0xf,0x6a,0x39, 0xf,0x6a,0x3a, 0x5,0x74,0x72, + 0x5,0x74,0x79, 0x7,0x5a,0x3f, 0x7,0x5d,0x5f, 0x7,0x5d,0x5d, + 0x5,0x76,0x71, 0x5,0x78,0x4e, 0x7,0x5d,0x5c, 0x7,0x5d,0x59, + 0x5,0x76,0x72, 0x7,0x5d,0x5a, 0x7,0x5d,0x5e, 0x7,0x5d,0x5b, + 0x7,0x5d,0x60, 0xf,0x6b,0x38, 0xf,0x6b,0x39, 0x7,0x5d,0x58, + 0x5,0x78,0x4f, 0x7,0x60,0x31, 0x7,0x60,0x34, 0x5,0x78,0x4d, + 0x7,0x60,0x33, 0x7,0x60,0x36, 0x7,0x60,0x35, 0x7,0x60,0x2f, + 0x7,0x60,0x30, 0x7,0x60,0x2c, 0x7,0x60,0x32, 0x5,0x79,0x62, + 0x7,0x61,0x63, 0x5,0x79,0x63, 0x5,0x79,0x5f, 0x4,0x6d,0x31, + 0x5,0x79,0x60, 0x7,0x61,0x62, 0x5,0x79,0x5e, 0x5,0x79,0x61, + 0x4,0x6d,0x32, 0x7,0x61,0x64, 0x5,0x7a,0x4c, 0x5,0x7a,0x4d, + 0x4,0x6e,0x27, 0x7,0x64,0x29, 0x7,0x64,0x28, 0x4,0x6e,0x40, + 0x7,0x64,0x72, 0x7,0x64,0x73, 0x7,0x64,0x71, 0x7,0x65,0x4e, + 0x5,0x7c,0x23, 0x7,0x65,0x6a, 0x7,0x65,0x7a, 0x7,0x65,0x7b, + 0x7,0x66,0x44, 0x5,0x3d,0x51, 0x4,0x3c,0x27, 0x6,0x5a,0x49, + 0x6,0x5a,0x4a, 0x6,0x5a,0x48, 0x6,0x5a,0x4b, 0x4,0x48,0x63, + 0x4,0x48,0x65, 0x5,0x4b,0x55, 0x6,0x64,0x58, 0x5,0x4b,0x54, + 0x4,0x48,0x64, 0x6,0x64,0x56, 0x6,0x64,0x53, 0x6,0x64,0x54, + 0x6,0x64,0x55, 0x6,0x64,0x57, 0x4,0x4e,0x72, 0x4,0x4e,0x71, + 0x5,0x52,0x7a, 0x5,0x52,0x79, 0x7,0x2b,0x52, 0x7,0x36,0x2c, + 0x5,0x52,0x78, 0x5,0x52,0x7b, 0x4,0x4e,0x77, 0x7,0x2b,0x50, + 0x7,0x2b,0x54, 0x7,0x2b,0x51, 0x4,0x4e,0x78, 0x7,0x2b,0x53, + 0x5,0x5a,0x36, 0x5,0x5a,0x35, 0x4,0x55,0x33, 0x7,0x36,0x2b, + 0x7,0x2b,0x4f, 0x7,0x36,0x2a, 0x7,0x36,0x29, 0x7,0x3e,0x2e, + 0x4,0x5a,0x34, 0x7,0x3e,0x32, 0x4,0x5a,0x32, 0x7,0x3e,0x33, + 0x5,0x60,0x3f, 0x7,0x3e,0x31, 0x7,0x3e,0x2d, 0x7,0x3e,0x2f, + 0x7,0x3e,0x30, 0x5,0x66,0x59, 0x7,0x45,0x3e, 0x4,0x5e,0x6f, + 0x7,0x45,0x3d, 0x5,0x66,0x57, 0x7,0x45,0x3f, 0x5,0x66,0x52, + 0x5,0x6a,0x78, 0x5,0x66,0x55, 0x5,0x66,0x53, 0x5,0x66,0x56, + 0x5,0x66,0x58, 0x7,0x3e,0x34, 0x5,0x66,0x54, 0x7,0x4c,0x3b, + 0x5,0x6a,0x7a, 0x5,0x6a,0x79, 0x7,0x4c,0x3a, 0x7,0x4c,0x37, + 0x5,0x6a,0x7c, 0x5,0x6a,0x7d, 0x5,0x6a,0x7b, 0x7,0x4c,0x3d, + 0x7,0x4c,0x3e, 0x7,0x4c,0x39, 0x7,0x4c,0x38, 0x7,0x4c,0x3c, + 0x7,0x4c,0x36, 0x4,0x65,0x4a, 0x5,0x6e,0x75, 0x5,0x6e,0x74, + 0x5,0x6e,0x73, 0x7,0x51,0x73, 0x7,0x51,0x74, 0x7,0x51,0x75, + 0x4,0x68,0x2f, 0x5,0x72,0x36, 0x7,0x56,0x57, 0x4,0x68,0x2e, + 0x5,0x72,0x35, 0x5,0x72,0x37, 0x7,0x56,0x53, 0x7,0x56,0x54, + 0x5,0x72,0x38, 0x7,0x56,0x55, 0xf,0x69,0x23, 0x7,0x56,0x56, + 0x7,0x56,0x52, 0x4,0x69,0x6d, 0x7,0x5a,0x42, 0x4,0x69,0x70, + 0x7,0x5a,0x43, 0x4,0x69,0x6f, 0x7,0x5a,0x44, 0x7,0x5d,0x65, + 0x7,0x5d,0x66, 0x5,0x76,0x73, 0x4,0x6b,0x36, 0x5,0x76,0x75, + 0x4,0x6b,0x37, 0x7,0x5d,0x62, 0x5,0x76,0x74, 0x7,0x5d,0x67, + 0x7,0x5d,0x61, 0x7,0x5d,0x63, 0x7,0x5d,0x64, 0x4,0x6c,0x3f, + 0x5,0x78,0x50, 0x4,0x6d,0x34, 0x7,0x61,0x65, 0xf,0x6b,0x3a, + 0x7,0x63,0x27, 0x5,0x7a,0x4e, 0x7,0x63,0x28, 0x7,0x64,0x2a, + 0x7,0x64,0x74, 0x5,0x7b,0x6e, 0x4,0x42,0x23, 0x4,0x48,0x66, + 0x5,0x46,0x64, 0x5,0x4b,0x56, 0x6,0x64,0x5a, 0xf,0x4d,0x46, + 0xf,0x4d,0x47, 0xf,0x4d,0x48, 0x6,0x64,0x59, 0x7,0x2b,0x56, + 0xf,0x53,0x2e, 0xf,0x53,0x2f, 0x7,0x36,0x2e, 0x7,0x36,0x2d, + 0xf,0x59,0x2d, 0xf,0x59,0x2e, 0x4,0x5a,0x36, 0x5,0x60,0x40, + 0xf,0x5d,0x6b, 0xf,0x5d,0x6c, 0x7,0x45,0x40, 0xf,0x61,0x61, + 0xf,0x61,0x62, 0x7,0x4c,0x3f, 0xf,0x64,0x5f, 0x5,0x6e,0x76, + 0xf,0x67,0x22, 0xf,0x67,0x23, 0xf,0x67,0x24, 0xf,0x67,0x25, + 0x4,0x68,0x31, 0x7,0x56,0x58, 0x7,0x5a,0x45, 0x7,0x5d,0x68, + 0x7,0x5d,0x69, 0x7,0x5d,0x6a, 0x7,0x60,0x37, 0xf,0x6b,0x73, + 0x7,0x61,0x66, 0x7,0x61,0x67, 0x7,0x63,0x29, 0x7,0x64,0x2b, + 0x4,0x6e,0x28, 0x7,0x65,0x7c, 0x6,0x50,0x49, 0x6,0x50,0x4a, + 0x6,0x5a,0x4d, 0x6,0x5a,0x4c, 0xf,0x46,0x3a, 0xf,0x40,0x69, + 0x4,0x48,0x68, 0x5,0x4b,0x58, 0x6,0x64,0x60, 0x6,0x64,0x5f, + 0x6,0x64,0x5d, 0x6,0x64,0x61, 0x6,0x64,0x5b, 0x6,0x64,0x5c, + 0x5,0x4b,0x57, 0x5,0x4b,0x5a, 0x5,0x52,0x7e, 0x7,0x2b,0x57, + 0x7,0x2b,0x5a, 0x4,0x4e,0x7e, 0x7,0x2b,0x58, 0x5,0x53,0x24, + 0x4,0x4f,0x22, 0x7,0x2b,0x5b, 0x5,0x53,0x23, 0x4,0x4e,0x7c, + 0x4,0x4e,0x7d, 0x5,0x52,0x7c, 0x4,0x4e,0x7a, 0x5,0x52,0x7d, + 0x5,0x53,0x22, 0x5,0x53,0x21, 0x7,0x2b,0x5c, 0x7,0x2b,0x59, + 0xf,0x53,0x30, 0xf,0x53,0x31, 0xf,0x53,0x32, 0xf,0x53,0x33, + 0x7,0x36,0x2f, 0x4,0x55,0x37, 0x7,0x36,0x31, 0x5,0x5a,0x3a, + 0x7,0x36,0x30, 0x4,0x55,0x39, 0x4,0x55,0x34, 0x4,0x55,0x3b, + 0x5,0x5a,0x37, 0x5,0x5a,0x39, 0x4,0x55,0x3a, 0x4,0x55,0x38, + 0x7,0x36,0x33, 0x5,0x5a,0x38, 0xf,0x59,0x2f, 0xf,0x59,0x30, + 0xf,0x59,0x31, 0xf,0x59,0x33, 0x7,0x36,0x32, 0x4,0x5a,0x3a, + 0x4,0x5a,0x3c, 0x7,0x3e,0x3a, 0x5,0x60,0x41, 0x5,0x60,0x44, + 0x5,0x60,0x42, 0x7,0x3e,0x38, 0x5,0x60,0x45, 0x5,0x60,0x46, + 0x5,0x60,0x43, 0x7,0x3e,0x35, 0x4,0x5a,0x39, 0x7,0x3e,0x36, + 0xf,0x5d,0x6d, 0xf,0x5d,0x6e, 0xf,0x5d,0x6f, 0x7,0x3e,0x37, + 0x7,0x3e,0x39, 0x7,0x3e,0x3b, 0x7,0x45,0x42, 0x5,0x66,0x5e, + 0x4,0x5e,0x71, 0x5,0x66,0x5c, 0x5,0x66,0x60, 0x5,0x66,0x5f, + 0x7,0x45,0x44, 0x5,0x66,0x61, 0x7,0x4c,0x40, 0x7,0x45,0x43, + 0x4,0x5e,0x72, 0x5,0x66,0x5a, 0x4,0x5e,0x78, 0x5,0x66,0x5b, + 0xf,0x61,0x63, 0xf,0x61,0x65, 0x5,0x66,0x5d, 0x7,0x45,0x41, + 0xf,0x61,0x64, 0x4,0x62,0x4d, 0x7,0x4c,0x43, 0x7,0x4c,0x47, + 0x5,0x6a,0x7e, 0x5,0x6b,0x21, 0x5,0x6b,0x23, 0x4,0x62,0x50, + 0x7,0x4c,0x48, 0x7,0x4c,0x46, 0x7,0x4c,0x41, 0x5,0x6b,0x24, + 0x5,0x6b,0x22, 0x7,0x4c,0x45, 0x7,0x4c,0x42, 0x4,0x62,0x4b, + 0x7,0x4c,0x44, 0xf,0x64,0x60, 0xf,0x64,0x61, 0xf,0x64,0x63, + 0x5,0x6e,0x7c, 0x7,0x51,0x76, 0x5,0x6e,0x77, 0x5,0x6e,0x7b, + 0x5,0x6e,0x7a, 0x5,0x6e,0x79, 0x4,0x65,0x50, 0x4,0x65,0x4c, + 0x5,0x6e,0x7e, 0x5,0x6e,0x78, 0x4,0x65,0x4b, 0x7,0x51,0x77, + 0x7,0x51,0x78, 0x7,0x51,0x7b, 0x7,0x51,0x7c, 0xf,0x67,0x26, + 0xf,0x67,0x27, 0xf,0x67,0x28, 0x5,0x6e,0x7d, 0x5,0x72,0x3b, + 0x5,0x72,0x3e, 0x5,0x72,0x3a, 0x7,0x56,0x59, 0x4,0x68,0x32, + 0x4,0x68,0x34, 0x5,0x72,0x39, 0x4,0x68,0x33, 0x5,0x72,0x3d, + 0x7,0x56,0x5a, 0x5,0x72,0x3c, 0x7,0x56,0x5e, 0xf,0x69,0x24, + 0x7,0x56,0x5b, 0x7,0x56,0x5c, 0x5,0x75,0x21, 0x5,0x74,0x7c, + 0x7,0x5a,0x46, 0x5,0x75,0x22, 0x5,0x74,0x7e, 0x5,0x74,0x7b, + 0x5,0x75,0x25, 0x5,0x75,0x24, 0x5,0x75,0x23, 0x5,0x74,0x7d, + 0x5,0x75,0x26, 0x7,0x56,0x5d, 0x4,0x69,0x73, 0x7,0x5a,0x47, + 0x7,0x5a,0x48, 0xf,0x6a,0x3b, 0xf,0x6a,0x3c, 0x5,0x76,0x77, + 0x4,0x6b,0x38, 0x4,0x6b,0x39, 0x5,0x76,0x76, 0x7,0x5d,0x6c, + 0x7,0x5d,0x6d, 0x7,0x5d,0x6b, 0xf,0x6b,0x3b, 0x4,0x6c,0x40, + 0x7,0x60,0x38, 0x5,0x78,0x51, 0x4,0x6c,0x44, 0x4,0x6c,0x42, + 0x5,0x79,0x65, 0x7,0x61,0x68, 0x5,0x79,0x64, 0x4,0x6d,0x36, + 0xf,0x6c,0x42, 0xf,0x6c,0x43, 0x7,0x61,0x69, 0x5,0x7a,0x4f, + 0x7,0x63,0x2a, 0x7,0x63,0x2b, 0x7,0x64,0x2c, 0x4,0x6e,0x29, + 0x5,0x7b,0x26, 0xf,0x6c,0x72, 0x7,0x64,0x77, 0x7,0x64,0x76, + 0x5,0x7b,0x4e, 0x4,0x6e,0x54, 0x6,0x23,0x3d, 0x6,0x23,0x3c, + 0x5,0x44,0x4b, 0x5,0x4b,0x5b, 0x5,0x4b,0x5c, 0x6,0x64,0x62, + 0x7,0x2b,0x5d, 0x7,0x36,0x34, 0x7,0x3e,0x3c, 0x7,0x45,0x45, + 0x4,0x5e,0x79, 0x7,0x51,0x7e, 0x7,0x56,0x5f, 0x5,0x72,0x40, + 0x7,0x5a,0x49, 0x7,0x60,0x3a, 0x7,0x60,0x39, 0x5,0x78,0x53, + 0x5,0x7b,0x4f, 0x7,0x2b,0x5e, 0x4,0x4f,0x23, 0x4,0x55,0x3c, + 0x7,0x45,0x46, 0x7,0x52,0x21, 0x7,0x56,0x61, 0x7,0x56,0x60, + 0x7,0x5a,0x4a, 0x7,0x5d,0x6e, 0xf,0x6c,0x73, 0x5,0x7b,0x50, + 0x4,0x42,0x24, 0x6,0x5a,0x4e, 0x6,0x64,0x64, 0x6,0x64,0x63, + 0x7,0x2b,0x5f, 0x7,0x36,0x38, 0x4,0x55,0x3e, 0x5,0x5a,0x3b, + 0x7,0x36,0x36, 0x7,0x36,0x35, 0x4,0x55,0x3d, 0x7,0x36,0x37, + 0x5,0x60,0x47, 0x7,0x3e,0x3d, 0x4,0x5e,0x7a, 0x7,0x45,0x48, + 0x7,0x45,0x49, 0x7,0x45,0x47, 0x7,0x4c,0x49, 0x5,0x6b,0x25, + 0x7,0x4c,0x4a, 0x4,0x65,0x51, 0x7,0x52,0x24, 0x7,0x52,0x23, + 0x7,0x52,0x22, 0x7,0x52,0x25, 0x7,0x56,0x62, 0x4,0x68,0x35, + 0x7,0x56,0x64, 0x5,0x72,0x42, 0x7,0x56,0x63, 0x7,0x56,0x65, + 0x7,0x56,0x66, 0x5,0x75,0x27, 0x7,0x5a,0x4c, 0x7,0x5d,0x71, + 0x7,0x5d,0x72, 0x5,0x76,0x78, 0x4,0x69,0x75, 0x4,0x6b,0x3a, + 0x7,0x5d,0x70, 0x5,0x76,0x79, 0x7,0x5d,0x6f, 0x7,0x5d,0x73, + 0x4,0x6c,0x46, 0x4,0x6c,0x45, 0x7,0x5d,0x74, 0x7,0x60,0x3b, + 0x7,0x61,0x6b, 0x7,0x61,0x6c, 0x5,0x7a,0x50, 0x7,0x63,0x2c, + 0x7,0x63,0x2d, 0x7,0x63,0x2e, 0x4,0x6e,0x2a, 0x7,0x64,0x2d, + 0x7,0x64,0x79, 0x7,0x64,0x78, 0x7,0x64,0x7a, 0x7,0x65,0x4f, + 0x5,0x7c,0x24, 0x4,0x6e,0x51, 0x5,0x7c,0x2d, 0x7,0x65,0x7d, + 0x7,0x66,0x4a, 0x7,0x66,0x4b, 0x6,0x50,0x4b, 0x5,0x3d,0x53, + 0x6,0x5a,0x52, 0x5,0x44,0x4e, 0x6,0x5a,0x51, 0x4,0x42,0x26, + 0x5,0x44,0x4c, 0x6,0x5a,0x50, 0x5,0x44,0x4d, 0x4,0x42,0x25, + 0x6,0x5a,0x4f, 0xf,0x39,0x30, 0xf,0x39,0x2f, 0x6,0x5a,0x53, + 0x5,0x4b,0x5f, 0x5,0x4b,0x60, 0x5,0x4b,0x61, 0x5,0x4b,0x5e, + 0x5,0x4b,0x5d, 0x5,0x4b,0x62, 0x6,0x64,0x68, 0x6,0x64,0x65, + 0x6,0x64,0x69, 0xf,0x4d,0x49, 0xf,0x4d,0x4a, 0xf,0x4d,0x4b, + 0x6,0x64,0x6b, 0x6,0x64,0x66, 0x6,0x64,0x6e, 0x6,0x64,0x6c, + 0x6,0x64,0x6d, 0x6,0x64,0x6a, 0x6,0x64,0x67, 0x4,0x4f,0x27, + 0x5,0x53,0x29, 0x7,0x2b,0x61, 0x7,0x2b,0x60, 0x5,0x53,0x28, + 0x5,0x53,0x2b, 0x5,0x5a,0x41, 0x5,0x53,0x2a, 0x4,0x4f,0x26, + 0x7,0x2b,0x63, 0x5,0x53,0x25, 0xf,0x53,0x34, 0xf,0x53,0x35, + 0xf,0x53,0x36, 0x5,0x53,0x27, 0x7,0x2b,0x62, 0x5,0x53,0x26, + 0x5,0x5a,0x3c, 0x7,0x36,0x3a, 0x5,0x5a,0x45, 0x5,0x5a,0x43, + 0x7,0x36,0x39, 0x4,0x55,0x40, 0x5,0x5a,0x44, 0x7,0x36,0x3b, + 0xf,0x59,0x34, 0x5,0x5a,0x3e, 0x5,0x5a,0x3d, 0x5,0x5a,0x3f, + 0x5,0x5a,0x42, 0x7,0x36,0x3c, 0x5,0x5a,0x40, 0x4,0x5a,0x3d, + 0x5,0x60,0x49, 0x5,0x60,0x4c, 0x5,0x60,0x50, 0x4,0x5a,0x3e, + 0x7,0x3e,0x3e, 0x5,0x60,0x48, 0x5,0x60,0x4a, 0x5,0x60,0x4f, + 0x5,0x60,0x4d, 0x7,0x3e,0x40, 0x7,0x3e,0x41, 0x7,0x3e,0x43, + 0xf,0x5d,0x70, 0xf,0x5d,0x71, 0xf,0x5d,0x72, 0x5,0x60,0x4e, + 0x7,0x3e,0x3f, 0x7,0x3e,0x42, 0x5,0x60,0x4b, 0x5,0x66,0x63, + 0x7,0x45,0x4b, 0x4,0x5e,0x7b, 0x5,0x66,0x69, 0x7,0x45,0x4e, + 0x5,0x66,0x67, 0x5,0x66,0x65, 0x7,0x45,0x4f, 0x7,0x45,0x4c, + 0xf,0x61,0x67, 0x7,0x45,0x4a, 0x7,0x45,0x51, 0x5,0x66,0x62, + 0x7,0x45,0x4d, 0x7,0x45,0x50, 0x5,0x66,0x66, 0x5,0x6b,0x26, + 0x5,0x6b,0x29, 0x7,0x4c,0x4b, 0x5,0x6b,0x27, 0x7,0x4c,0x4c, + 0x7,0x4c,0x4d, 0xf,0x64,0x64, 0xf,0x64,0x65, 0xf,0x64,0x66, + 0xf,0x64,0x67, 0x5,0x66,0x64, 0x5,0x6b,0x28, 0x7,0x52,0x2b, + 0x4,0x65,0x52, 0x7,0x52,0x2a, 0x5,0x6f,0x21, 0x7,0x52,0x29, + 0x7,0x52,0x28, 0x5,0x6f,0x22, 0x7,0x52,0x26, 0xf,0x67,0x29, + 0x5,0x72,0x44, 0x5,0x72,0x46, 0x5,0x72,0x48, 0x4,0x68,0x37, + 0x7,0x56,0x67, 0x7,0x56,0x68, 0xf,0x69,0x25, 0x5,0x72,0x45, + 0x5,0x72,0x43, 0x7,0x56,0x69, 0x5,0x72,0x47, 0x5,0x75,0x2a, + 0x4,0x62,0x51, 0x7,0x5a,0x50, 0x4,0x69,0x78, 0x5,0x75,0x28, + 0x7,0x5a,0x4e, 0x4,0x69,0x79, 0x5,0x75,0x2b, 0xf,0x6a,0x3d, + 0x5,0x75,0x2c, 0x5,0x75,0x29, 0x4,0x69,0x7a, 0xf,0x67,0x2a, + 0x7,0x5a,0x4d, 0x5,0x76,0x7b, 0x5,0x76,0x7a, 0xf,0x69,0x26, + 0x5,0x78,0x54, 0x5,0x78,0x55, 0x4,0x6c,0x47, 0x7,0x60,0x3f, + 0x7,0x60,0x3e, 0x7,0x60,0x40, 0x7,0x60,0x3d, 0x5,0x79,0x67, + 0x5,0x79,0x66, 0xf,0x6c,0x44, 0x7,0x63,0x2f, 0x4,0x6e,0x2b, + 0x7,0x64,0x2e, 0x7,0x64,0x2f, 0x4,0x6e,0x41, 0x5,0x7b,0x51, + 0x5,0x7b,0x6f, 0x5,0x7c,0x25, 0x5,0x7c,0x40, 0x4,0x30,0x43, + 0x4,0x42,0x2a, 0x4,0x42,0x27, 0x6,0x5a,0x55, 0x4,0x42,0x28, + 0x6,0x5a,0x56, 0x5,0x44,0x4f, 0xf,0x46,0x3b, 0x6,0x64,0x6f, + 0x5,0x4b,0x65, 0x4,0x48,0x6c, 0x5,0x4b,0x63, 0xf,0x4d,0x4c, + 0xf,0x4d,0x4d, 0x5,0x4b,0x66, 0x4,0x4f,0x2f, 0x4,0x4f,0x33, + 0x4,0x4f,0x31, 0x4,0x4f,0x2d, 0x7,0x2b,0x68, 0x5,0x53,0x31, + 0x5,0x53,0x30, 0x7,0x2b,0x65, 0x7,0x2b,0x64, 0x5,0x53,0x2e, + 0x4,0x4f,0x38, 0x5,0x53,0x33, 0x5,0x53,0x2c, 0x5,0x53,0x2d, + 0x7,0x2b,0x6c, 0x7,0x2b,0x66, 0x4,0x4f,0x36, 0x5,0x53,0x32, + 0xf,0x53,0x37, 0xf,0x53,0x3a, 0xf,0x53,0x3d, 0x7,0x2b,0x6b, + 0x7,0x2b,0x67, 0x7,0x2b,0x69, 0x4,0x4f,0x2e, 0xf,0x53,0x39, + 0x5,0x53,0x2f, 0x5,0x5a,0x48, 0x5,0x5a,0x46, 0x7,0x36,0x3d, + 0x5,0x5a,0x49, 0x4,0x55,0x46, 0x4,0x5a,0x46, 0x5,0x5a,0x4e, + 0x5,0x5a,0x4d, 0x4,0x55,0x49, 0x7,0x36,0x43, 0x7,0x36,0x3e, + 0x7,0x36,0x41, 0x7,0x36,0x40, 0x5,0x5a,0x4c, 0x7,0x36,0x44, + 0xf,0x59,0x36, 0xf,0x59,0x37, 0xf,0x59,0x39, 0xf,0x59,0x3a, + 0x5,0x5a,0x4b, 0x7,0x36,0x42, 0xf,0x59,0x35, 0x5,0x5a,0x47, + 0x7,0x36,0x3f, 0x5,0x60,0x56, 0x4,0x5a,0x48, 0x5,0x60,0x57, + 0x5,0x60,0x54, 0x5,0x60,0x52, 0x4,0x5a,0x47, 0x7,0x3e,0x4b, + 0x5,0x60,0x55, 0x7,0x3e,0x46, 0x7,0x3e,0x4d, 0x7,0x3e,0x45, + 0x4,0x5a,0x4b, 0x7,0x3e,0x4c, 0x5,0x60,0x5a, 0x5,0x60,0x58, + 0x7,0x3e,0x44, 0x4,0x5a,0x4a, 0xf,0x46,0x3c, 0xf,0x5d,0x73, + 0xf,0x5d,0x74, 0xf,0x5d,0x75, 0xf,0x5d,0x77, 0xf,0x5d,0x79, + 0x7,0x3e,0x48, 0x5,0x60,0x5b, 0x5,0x60,0x53, 0x7,0x3e,0x4a, + 0x5,0x60,0x51, 0x5,0x60,0x59, 0x5,0x66,0x77, 0x5,0x66,0x74, + 0x5,0x66,0x70, 0x5,0x66,0x6b, 0x7,0x45,0x53, 0x4,0x5f,0x28, + 0x5,0x66,0x6d, 0x7,0x45,0x52, 0x5,0x66,0x6a, 0x5,0x66,0x71, + 0x5,0x66,0x75, 0x5,0x66,0x72, 0x5,0x66,0x6f, 0x5,0x66,0x6c, + 0x7,0x45,0x54, 0xf,0x61,0x68, 0xf,0x61,0x69, 0xf,0x61,0x6a, + 0xf,0x61,0x6b, 0xf,0x61,0x6c, 0xf,0x61,0x6d, 0xf,0x61,0x6e, + 0xf,0x61,0x6f, 0xf,0x61,0x71, 0xf,0x61,0x73, 0x7,0x45,0x55, + 0x7,0x3e,0x47, 0x5,0x66,0x76, 0x5,0x66,0x73, 0x7,0x4c,0x5b, + 0x7,0x4c,0x58, 0x4,0x62,0x5e, 0x7,0x4c,0x52, 0x5,0x6b,0x2d, + 0x4,0x62,0x52, 0x5,0x6b,0x2f, 0x7,0x4c,0x4f, 0x7,0x4c,0x51, + 0x4,0x62,0x5f, 0x5,0x66,0x78, 0x4,0x62,0x63, 0x5,0x6b,0x32, + 0x4,0x62,0x5b, 0x7,0x4c,0x4e, 0x4,0x62,0x5a, 0x4,0x62,0x65, + 0x7,0x4c,0x5a, 0x7,0x4c,0x53, 0x7,0x4c,0x59, 0x4,0x62,0x58, + 0x7,0x4c,0x55, 0x5,0x6b,0x36, 0x5,0x6b,0x2e, 0x7,0x4c,0x50, + 0x5,0x6b,0x34, 0xf,0x64,0x6e, 0xf,0x64,0x68, 0xf,0x64,0x6a, + 0xf,0x64,0x6c, 0xf,0x64,0x6f, 0xf,0x64,0x70, 0xf,0x64,0x71, + 0x5,0x6b,0x30, 0x7,0x4c,0x54, 0x7,0x4c,0x57, 0x4,0x62,0x53, + 0x5,0x6b,0x37, 0x5,0x6b,0x2a, 0xf,0x64,0x69, 0x5,0x6b,0x2c, + 0xf,0x61,0x70, 0x7,0x4c,0x56, 0x5,0x6f,0x27, 0x7,0x52,0x2e, + 0x5,0x6f,0x26, 0x5,0x6b,0x38, 0x5,0x6f,0x29, 0x7,0x52,0x2c, + 0x4,0x65,0x58, 0x5,0x6f,0x2b, 0x7,0x52,0x2f, 0x7,0x52,0x2d, + 0x5,0x6f,0x28, 0x4,0x65,0x56, 0x5,0x6f,0x24, 0x7,0x52,0x32, + 0x4,0x65,0x5e, 0x5,0x6f,0x25, 0x5,0x6f,0x23, 0x4,0x65,0x60, + 0x7,0x52,0x30, 0x5,0x6f,0x2c, 0x7,0x52,0x34, 0xf,0x67,0x2b, + 0xf,0x67,0x2c, 0xf,0x67,0x2d, 0xf,0x67,0x2f, 0xf,0x67,0x30, + 0xf,0x67,0x31, 0xf,0x67,0x32, 0xf,0x67,0x2e, 0x5,0x6f,0x2a, + 0xf,0x67,0x34, 0x5,0x72,0x4a, 0x4,0x68,0x3f, 0x5,0x72,0x4f, + 0x5,0x72,0x53, 0x5,0x77,0x23, 0x5,0x72,0x49, 0x5,0x72,0x52, + 0x4,0x68,0x38, 0x7,0x56,0x71, 0x5,0x72,0x4c, 0x7,0x56,0x72, + 0x5,0x72,0x57, 0x7,0x56,0x6d, 0x5,0x72,0x54, 0x5,0x72,0x4d, + 0x7,0x56,0x73, 0x7,0x56,0x75, 0x7,0x56,0x6a, 0x7,0x56,0x74, + 0x5,0x72,0x56, 0x7,0x56,0x6e, 0x7,0x56,0x6f, 0xf,0x69,0x28, + 0xf,0x69,0x29, 0xf,0x69,0x2b, 0xf,0x69,0x2c, 0xf,0x69,0x2d, + 0xf,0x69,0x2e, 0xf,0x69,0x2f, 0xf,0x69,0x30, 0xf,0x69,0x31, + 0xf,0x69,0x32, 0x7,0x56,0x6b, 0x7,0x56,0x6c, 0x5,0x72,0x55, + 0x7,0x56,0x70, 0x5,0x72,0x50, 0x7,0x5a,0x54, 0x7,0x5a,0x52, + 0x5,0x75,0x32, 0x4,0x6a,0x22, 0x5,0x75,0x2e, 0x5,0x75,0x2f, + 0x7,0x5a,0x5a, 0x7,0x5a,0x57, 0x5,0x75,0x30, 0x7,0x5a,0x5c, + 0x7,0x5a,0x59, 0x5,0x75,0x34, 0x7,0x5a,0x56, 0x7,0x5a,0x5b, + 0x7,0x5a,0x53, 0x7,0x5a,0x55, 0x7,0x5a,0x51, 0x7,0x5a,0x5e, + 0xf,0x6a,0x41, 0xf,0x6a,0x42, 0xf,0x6a,0x43, 0xf,0x6a,0x40, + 0x7,0x5a,0x5f, 0x5,0x75,0x33, 0x7,0x5a,0x58, 0x7,0x5a,0x5d, + 0x5,0x75,0x31, 0x5,0x76,0x7e, 0x7,0x5d,0x78, 0x5,0x77,0x22, + 0x4,0x6b,0x3e, 0x4,0x6b,0x3f, 0x5,0x76,0x7c, 0x7,0x5d,0x77, + 0x4,0x65,0x5c, 0x7,0x60,0x46, 0x7,0x5d,0x75, 0x7,0x5e,0x22, + 0x7,0x5d,0x76, 0x5,0x76,0x7d, 0x7,0x5e,0x21, 0x7,0x5d,0x7c, + 0x5,0x77,0x21, 0x7,0x5d,0x79, 0xf,0x6b,0x3d, 0xf,0x6b,0x3f, + 0x7,0x5d,0x7a, 0x7,0x5d,0x7d, 0x7,0x5d,0x7e, 0x7,0x5d,0x7b, + 0xf,0x6b,0x3c, 0x7,0x60,0x43, 0x5,0x78,0x5c, 0x5,0x78,0x60, + 0x5,0x78,0x5a, 0x7,0x60,0x41, 0x4,0x6c,0x4f, 0x4,0x6c,0x4c, + 0x5,0x78,0x59, 0x5,0x78,0x61, 0x4,0x6c,0x4b, 0x5,0x78,0x5f, + 0x5,0x78,0x5e, 0x5,0x78,0x57, 0x7,0x60,0x4b, 0x7,0x60,0x47, + 0x5,0x78,0x58, 0xf,0x6b,0x75, 0xf,0x6b,0x78, 0x7,0x60,0x48, + 0x7,0x60,0x42, 0x7,0x60,0x44, 0x7,0x60,0x45, 0x5,0x78,0x5d, + 0x7,0x60,0x4a, 0x7,0x60,0x49, 0x7,0x61,0x73, 0x5,0x79,0x68, + 0x4,0x6d,0x38, 0x5,0x79,0x69, 0x7,0x61,0x6e, 0x7,0x60,0x7a, + 0x7,0x61,0x71, 0x7,0x61,0x6f, 0x5,0x79,0x6b, 0x7,0x61,0x72, + 0x7,0x61,0x70, 0xf,0x6c,0x45, 0xf,0x6c,0x46, 0x5,0x79,0x6a, + 0x7,0x61,0x6d, 0x7,0x63,0x35, 0x7,0x63,0x30, 0x7,0x63,0x32, + 0x7,0x63,0x33, 0x7,0x63,0x34, 0x5,0x7a,0x51, 0x5,0x7a,0x52, + 0xf,0x6c,0x5a, 0xf,0x6c,0x5b, 0xf,0x6c,0x5c, 0xf,0x6c,0x5d, + 0x7,0x63,0x31, 0x5,0x7b,0x28, 0x5,0x7b,0x27, 0x7,0x64,0x30, + 0x5,0x7b,0x29, 0xf,0x6c,0x74, 0x7,0x64,0x31, 0x5,0x7b,0x2a, + 0x7,0x64,0x32, 0x7,0x64,0x7e, 0x5,0x7b,0x53, 0x5,0x7b,0x52, + 0x5,0x7b,0x55, 0x7,0x64,0x7c, 0x7,0x65,0x21, 0x7,0x64,0x7b, + 0x5,0x7b,0x54, 0x7,0x64,0x7d, 0xf,0x6c,0x75, 0x5,0x7b,0x73, + 0x5,0x7b,0x72, 0x5,0x7b,0x71, 0x5,0x7b,0x70, 0x7,0x65,0x50, + 0x5,0x7c,0x26, 0xf,0x6d,0x2b, 0xf,0x6d,0x2c, 0x5,0x7c,0x27, + 0x7,0x65,0x6b, 0x5,0x7c,0x2e, 0x5,0x7c,0x37, 0x7,0x66,0x2f, + 0x5,0x7c,0x36, 0xf,0x53,0x3c, 0xf,0x5d,0x78, 0xf,0x6b,0x3e, + 0x6,0x50,0x4c, 0xf,0x40,0x33, 0x6,0x50,0x4d, 0x4,0x42,0x2b, + 0x6,0x5a,0x57, 0x5,0x44,0x51, 0x5,0x44,0x52, 0x6,0x5a,0x5c, + 0x6,0x5a,0x58, 0x6,0x5a,0x59, 0x5,0x44,0x50, 0x6,0x5a,0x5a, + 0x6,0x5a,0x5b, 0x6,0x64,0x70, 0x5,0x4b,0x6a, 0x6,0x64,0x71, + 0x5,0x4b,0x69, 0x4,0x48,0x6e, 0x4,0x48,0x6f, 0x6,0x64,0x72, + 0x6,0x64,0x73, 0x6,0x64,0x74, 0x4,0x48,0x70, 0x5,0x4b,0x68, + 0xf,0x4d,0x4f, 0xf,0x4d,0x50, 0xf,0x4d,0x51, 0x5,0x4b,0x67, + 0x4,0x4f,0x45, 0x7,0x2b,0x72, 0x7,0x2b,0x7d, 0x7,0x2b,0x6f, + 0x7,0x2b,0x73, 0x7,0x2b,0x79, 0x5,0x53,0x37, 0x5,0x53,0x3b, + 0x5,0x53,0x3d, 0x5,0x53,0x39, 0x7,0x2b,0x76, 0x7,0x2b,0x7c, + 0x5,0x53,0x3f, 0x5,0x53,0x34, 0x4,0x4f,0x3d, 0x5,0x53,0x41, + 0x5,0x53,0x3e, 0x5,0x53,0x35, 0x4,0x4f,0x3e, 0x5,0x53,0x42, + 0x7,0x2b,0x7a, 0x4,0x4f,0x3c, 0x7,0x2b,0x75, 0x4,0x4f,0x43, + 0x4,0x4f,0x3a, 0x5,0x53,0x43, 0x4,0x4f,0x46, 0x7,0x2b,0x70, + 0x7,0x2b,0x7b, 0xf,0x53,0x40, 0x7,0x2b,0x6e, 0x7,0x2b,0x77, + 0x7,0x2b,0x78, 0x5,0x53,0x36, 0x5,0x53,0x3a, 0x5,0x53,0x40, + 0x7,0x2b,0x71, 0x7,0x2b,0x74, 0x5,0x53,0x3c, 0x7,0x36,0x4b, + 0x5,0x5a,0x54, 0x5,0x5a,0x56, 0x5,0x5a,0x51, 0x5,0x5a,0x4f, + 0x4,0x55,0x4c, 0x5,0x5a,0x53, 0x5,0x5a,0x59, 0x5,0x5a,0x52, + 0x7,0x36,0x57, 0x7,0x36,0x52, 0x5,0x5a,0x57, 0x4,0x55,0x56, + 0x7,0x36,0x54, 0x5,0x5a,0x58, 0x7,0x36,0x50, 0x5,0x5a,0x55, + 0x7,0x36,0x53, 0x7,0x36,0x4c, 0x7,0x36,0x45, 0x7,0x36,0x4e, + 0xf,0x59,0x3d, 0xf,0x59,0x3e, 0xf,0x59,0x3f, 0xf,0x59,0x40, + 0x7,0x36,0x4d, 0x7,0x36,0x4f, 0x7,0x36,0x58, 0x7,0x36,0x56, + 0x7,0x36,0x47, 0x7,0x36,0x48, 0x7,0x36,0x55, 0x4,0x55,0x53, + 0x4,0x55,0x51, 0x6,0x50,0x4e, 0x7,0x36,0x49, 0x5,0x5a,0x50, + 0x7,0x36,0x46, 0xf,0x56,0x33, 0x7,0x3e,0x51, 0x4,0x5a,0x4c, + 0x5,0x60,0x5e, 0x5,0x60,0x69, 0x7,0x3e,0x54, 0x4,0x5a,0x53, + 0x5,0x60,0x67, 0x7,0x3e,0x55, 0x5,0x60,0x5d, 0x5,0x60,0x61, + 0x7,0x3e,0x4e, 0x5,0x60,0x64, 0x5,0x60,0x6b, 0x5,0x60,0x60, + 0x5,0x60,0x62, 0x4,0x5a,0x54, 0x7,0x3e,0x57, 0x5,0x60,0x5c, + 0x5,0x60,0x63, 0x4,0x5a,0x58, 0x7,0x3e,0x4f, 0x4,0x5a,0x5b, + 0x5,0x60,0x6c, 0x7,0x3e,0x58, 0x7,0x3e,0x53, 0x5,0x60,0x68, + 0x5,0x60,0x6a, 0xf,0x5d,0x7a, 0xf,0x5d,0x7b, 0xf,0x5d,0x7c, + 0xf,0x5d,0x7d, 0xf,0x5e,0x21, 0xf,0x5e,0x22, 0xf,0x5e,0x23, + 0xf,0x5e,0x25, 0x7,0x3e,0x50, 0x5,0x60,0x5f, 0x4,0x5a,0x5a, + 0x7,0x3e,0x56, 0x5,0x60,0x65, 0x5,0x60,0x66, 0x7,0x3e,0x52, + 0x4,0x5a,0x57, 0x7,0x45,0x5b, 0x5,0x60,0x6d, 0x7,0x45,0x5f, + 0x5,0x66,0x7d, 0x5,0x67,0x25, 0x5,0x67,0x27, 0x4,0x5f,0x2e, + 0x5,0x67,0x2a, 0x5,0x66,0x7a, 0x5,0x67,0x21, 0x5,0x66,0x7e, + 0x5,0x66,0x7b, 0x7,0x45,0x5d, 0x7,0x45,0x58, 0x4,0x5f,0x2d, + 0x7,0x45,0x5e, 0x5,0x66,0x7c, 0x5,0x67,0x2b, 0x4,0x5f,0x30, + 0x7,0x45,0x67, 0x5,0x67,0x22, 0x7,0x45,0x64, 0x7,0x45,0x5c, + 0x5,0x67,0x28, 0x7,0x45,0x61, 0x7,0x45,0x62, 0x7,0x45,0x66, + 0x5,0x67,0x24, 0x7,0x45,0x59, 0x5,0x67,0x23, 0x7,0x45,0x68, + 0x7,0x45,0x56, 0x7,0x45,0x60, 0xf,0x61,0x74, 0xf,0x61,0x75, + 0x7,0x45,0x57, 0x5,0x67,0x29, 0x7,0x45,0x63, 0x5,0x6b,0x39, + 0x7,0x4c,0x5d, 0x5,0x6b,0x3a, 0x7,0x4c,0x62, 0x5,0x6b,0x3e, + 0x5,0x6b,0x4a, 0x5,0x6b,0x40, 0x7,0x4c,0x6a, 0x7,0x4c,0x64, + 0x5,0x6b,0x3b, 0x7,0x4c,0x68, 0x7,0x4c,0x6b, 0x7,0x4c,0x63, + 0x5,0x6b,0x4c, 0x5,0x6b,0x3d, 0x5,0x6b,0x4b, 0x4,0x62,0x6b, + 0x5,0x6b,0x42, 0x5,0x6b,0x45, 0x7,0x4c,0x60, 0x7,0x4c,0x5e, + 0x5,0x6b,0x48, 0x5,0x6b,0x44, 0x7,0x4c,0x5c, 0x7,0x4c,0x66, + 0x7,0x4c,0x6c, 0x5,0x6b,0x41, 0x4,0x62,0x6d, 0x7,0x4c,0x69, + 0x5,0x6b,0x46, 0xf,0x64,0x74, 0xf,0x64,0x76, 0xf,0x64,0x77, + 0x7,0x4c,0x61, 0x5,0x6b,0x47, 0x7,0x4c,0x6f, 0x5,0x6b,0x49, + 0x7,0x45,0x69, 0x7,0x4c,0x65, 0x7,0x4c,0x67, 0x7,0x4c,0x6d, + 0x5,0x6b,0x43, 0x7,0x4c,0x6e, 0x7,0x4c,0x5f, 0x4,0x62,0x69, + 0x5,0x6f,0x38, 0x5,0x6f,0x30, 0x7,0x52,0x3a, 0x4,0x65,0x65, + 0x5,0x6f,0x3e, 0x7,0x52,0x43, 0x5,0x6f,0x32, 0x5,0x6f,0x42, + 0x4,0x62,0x70, 0x7,0x52,0x36, 0x5,0x6f,0x2f, 0x4,0x65,0x63, + 0x5,0x6f,0x31, 0x4,0x65,0x6e, 0x4,0x65,0x68, 0x5,0x6f,0x33, + 0x5,0x6f,0x2d, 0x5,0x6f,0x37, 0x5,0x6f,0x44, 0x5,0x6f,0x39, + 0x4,0x65,0x6d, 0x4,0x65,0x66, 0x5,0x6f,0x3a, 0x5,0x6f,0x3c, + 0x5,0x6f,0x40, 0x4,0x65,0x67, 0x5,0x6f,0x2e, 0x5,0x6f,0x3b, + 0x5,0x6f,0x36, 0x5,0x6f,0x3f, 0x7,0x52,0x3f, 0x7,0x52,0x3b, + 0x7,0x52,0x40, 0x7,0x52,0x35, 0x7,0x52,0x37, 0x5,0x6f,0x3d, + 0x5,0x6f,0x35, 0x5,0x6f,0x34, 0x5,0x6f,0x43, 0x7,0x52,0x38, + 0xf,0x67,0x37, 0x7,0x52,0x3e, 0x7,0x52,0x3d, 0x7,0x52,0x39, + 0x7,0x52,0x44, 0x7,0x52,0x41, 0x7,0x52,0x3c, 0xf,0x67,0x38, + 0x5,0x6f,0x41, 0x7,0x45,0x5a, 0x5,0x72,0x5e, 0x7,0x56,0x79, + 0x5,0x72,0x66, 0x7,0x56,0x7e, 0x5,0x72,0x5d, 0x5,0x72,0x60, + 0x5,0x72,0x5b, 0x5,0x72,0x65, 0x5,0x72,0x64, 0x7,0x57,0x21, + 0x7,0x56,0x7d, 0x7,0x56,0x7a, 0x5,0x72,0x68, 0x7,0x57,0x27, + 0x7,0x57,0x26, 0x7,0x57,0x24, 0x5,0x72,0x5c, 0x5,0x72,0x61, + 0x5,0x6f,0x45, 0x5,0x72,0x5a, 0x5,0x72,0x62, 0x7,0x57,0x22, + 0x7,0x56,0x7c, 0x5,0x72,0x69, 0x5,0x72,0x6a, 0xf,0x69,0x34, + 0x5,0x72,0x5f, 0x7,0x57,0x23, 0x7,0x56,0x77, 0x7,0x57,0x28, + 0x7,0x56,0x76, 0x7,0x56,0x7b, 0xf,0x69,0x33, 0x5,0x72,0x58, + 0x7,0x56,0x78, 0x5,0x72,0x59, 0xf,0x67,0x36, 0x5,0x75,0x42, + 0x5,0x75,0x3d, 0x4,0x6a,0x24, 0x4,0x6a,0x2d, 0x5,0x75,0x3c, + 0x4,0x6a,0x28, 0x5,0x75,0x43, 0x5,0x75,0x39, 0x5,0x6f,0x46, + 0x5,0x75,0x44, 0x5,0x75,0x40, 0x5,0x75,0x3f, 0x4,0x6a,0x2b, + 0x7,0x5a,0x62, 0x7,0x5a,0x6c, 0x7,0x5a,0x6a, 0x7,0x5a,0x70, + 0x4,0x6a,0x2a, 0x7,0x5a,0x6b, 0x7,0x5a,0x6e, 0x5,0x75,0x3b, + 0x4,0x6a,0x29, 0x7,0x5a,0x69, 0x5,0x75,0x37, 0x7,0x5a,0x68, + 0x5,0x75,0x38, 0x5,0x75,0x46, 0x5,0x72,0x67, 0x7,0x5a,0x71, + 0x5,0x75,0x41, 0x7,0x5a,0x6f, 0x7,0x5a,0x67, 0x7,0x57,0x25, + 0xf,0x6a,0x44, 0xf,0x6a,0x45, 0xf,0x6a,0x46, 0xf,0x6a,0x47, + 0xf,0x6a,0x48, 0x5,0x75,0x3e, 0x7,0x5a,0x66, 0x7,0x5a,0x64, + 0x7,0x5a,0x61, 0x7,0x5a,0x63, 0x5,0x75,0x3a, 0x7,0x5e,0x2b, + 0x7,0x5e,0x27, 0x7,0x5e,0x31, 0x5,0x77,0x33, 0x7,0x5e,0x2f, + 0x5,0x77,0x2e, 0x5,0x77,0x29, 0x4,0x6b,0x43, 0x7,0x5e,0x32, + 0x7,0x5e,0x36, 0x5,0x77,0x25, 0x5,0x77,0x30, 0x5,0x77,0x2a, + 0x5,0x77,0x28, 0x5,0x77,0x2f, 0x7,0x5e,0x2c, 0x5,0x77,0x27, + 0x5,0x77,0x26, 0x5,0x77,0x38, 0x5,0x77,0x2b, 0x4,0x6b,0x49, + 0x4,0x6b,0x42, 0x7,0x5e,0x35, 0x5,0x77,0x31, 0x7,0x5e,0x30, + 0x7,0x5e,0x33, 0x5,0x77,0x2d, 0x7,0x5a,0x65, 0x5,0x77,0x35, + 0x7,0x5a,0x6d, 0x7,0x5e,0x34, 0x5,0x77,0x36, 0x7,0x5e,0x2d, + 0xf,0x6b,0x40, 0x7,0x5e,0x24, 0x7,0x5e,0x26, 0x7,0x5e,0x2e, + 0x7,0x5e,0x29, 0x7,0x5e,0x28, 0x5,0x77,0x32, 0x7,0x5e,0x2a, + 0x7,0x5e,0x25, 0x4,0x6b,0x41, 0xf,0x6b,0x7a, 0x7,0x5e,0x37, + 0x7,0x60,0x4d, 0x5,0x78,0x67, 0x5,0x78,0x69, 0x5,0x78,0x6d, + 0x5,0x78,0x65, 0x5,0x77,0x37, 0x5,0x78,0x68, 0x7,0x60,0x4e, + 0x5,0x78,0x6a, 0x5,0x78,0x6b, 0x7,0x60,0x4f, 0x7,0x60,0x50, + 0x7,0x60,0x54, 0x5,0x78,0x6c, 0x7,0x60,0x53, 0x7,0x60,0x4c, + 0x7,0x60,0x51, 0x5,0x78,0x63, 0x5,0x78,0x66, 0x5,0x78,0x62, + 0xf,0x6b,0x79, 0x7,0x60,0x52, 0x4,0x6c,0x55, 0x5,0x78,0x64, + 0x4,0x6c,0x53, 0x5,0x79,0x71, 0x5,0x79,0x6d, 0x5,0x79,0x70, + 0x7,0x61,0x76, 0x4,0x6d,0x3b, 0x5,0x79,0x6e, 0x5,0x79,0x6c, + 0x4,0x6d,0x3c, 0x7,0x61,0x74, 0x5,0x79,0x6f, 0x7,0x61,0x78, + 0x7,0x61,0x75, 0x7,0x61,0x77, 0x4,0x6d,0x3e, 0x5,0x7a,0x58, + 0x7,0x63,0x39, 0x5,0x7a,0x56, 0x4,0x6d,0x6b, 0x5,0x7a,0x5a, + 0x5,0x7a,0x59, 0x5,0x7a,0x55, 0x5,0x7a,0x57, 0x4,0x6d,0x6a, + 0x7,0x63,0x38, 0x5,0x7a,0x54, 0x7,0x63,0x3b, 0x5,0x7a,0x5b, + 0x7,0x63,0x3d, 0xf,0x6c,0x5e, 0x7,0x63,0x3a, 0x7,0x63,0x36, + 0x7,0x63,0x3c, 0x5,0x7b,0x2e, 0x7,0x64,0x34, 0x7,0x64,0x36, + 0x5,0x7b,0x2f, 0x5,0x7b,0x2c, 0x5,0x7b,0x2b, 0x5,0x7b,0x31, + 0x5,0x7b,0x30, 0x5,0x7b,0x2d, 0x7,0x64,0x37, 0xf,0x6c,0x76, + 0x4,0x6e,0x2e, 0x7,0x64,0x33, 0x7,0x64,0x35, 0x5,0x7b,0x56, + 0x7,0x65,0x22, 0x7,0x65,0x53, 0x7,0x65,0x24, 0x7,0x65,0x26, + 0x7,0x65,0x23, 0x7,0x65,0x27, 0x5,0x7b,0x57, 0x7,0x65,0x25, + 0x4,0x6e,0x42, 0x5,0x7b,0x74, 0x7,0x65,0x54, 0x7,0x65,0x55, + 0x5,0x7b,0x75, 0x7,0x65,0x52, 0x7,0x65,0x56, 0x7,0x65,0x51, + 0x7,0x65,0x6d, 0x7,0x65,0x6c, 0x5,0x7c,0x29, 0x5,0x7c,0x28, + 0xf,0x6d,0x32, 0x5,0x7c,0x2f, 0x7,0x66,0x21, 0x7,0x65,0x7e, + 0x5,0x7c,0x38, 0x7,0x66,0x30, 0x5,0x7c,0x39, 0x7,0x66,0x3a, + 0x5,0x7c,0x41, 0xf,0x6d,0x37, 0x5,0x7c,0x48, 0x7,0x66,0x45, + 0x4,0x48,0x71, 0x4,0x48,0x72, 0x5,0x53,0x44, 0x7,0x2c,0x22, + 0x7,0x2c,0x21, 0x7,0x2b,0x7e, 0x5,0x5a,0x5a, 0x5,0x5a,0x5c, + 0x7,0x36,0x5a, 0x7,0x36,0x5b, 0xf,0x59,0x41, 0x7,0x36,0x59, + 0x5,0x67,0x2c, 0x7,0x3e,0x59, 0x4,0x62,0x71, 0x7,0x4c,0x70, + 0x5,0x6b,0x4d, 0x7,0x4c,0x71, 0x7,0x52,0x46, 0x5,0x6f,0x48, + 0x5,0x6f,0x49, 0x7,0x52,0x47, 0x5,0x6f,0x47, 0x7,0x52,0x49, + 0x7,0x52,0x48, 0x4,0x68,0x45, 0x7,0x57,0x2b, 0x7,0x57,0x2a, + 0x5,0x72,0x6b, 0x7,0x5a,0x73, 0x7,0x5a,0x72, 0x4,0x6b,0x4c, + 0x7,0x5e,0x38, 0x7,0x5e,0x39, 0x5,0x77,0x39, 0x7,0x60,0x55, + 0x4,0x6c,0x57, 0x5,0x79,0x72, 0x4,0x6d,0x3f, 0x7,0x63,0x3e, + 0x5,0x7b,0x32, 0x6,0x5a,0x5d, 0xf,0x46,0x3d, 0x5,0x4b,0x6c, + 0xf,0x4d,0x52, 0x7,0x2c,0x28, 0x5,0x53,0x45, 0x7,0x2c,0x27, + 0x7,0x2c,0x26, 0x7,0x2c,0x24, 0x5,0x53,0x46, 0x7,0x2c,0x25, + 0x5,0x53,0x47, 0x7,0x2c,0x29, 0x7,0x2c,0x23, 0x7,0x36,0x5d, + 0x5,0x5a,0x5d, 0xf,0x59,0x42, 0xf,0x59,0x43, 0xf,0x59,0x44, + 0x5,0x60,0x6f, 0x5,0x60,0x72, 0x5,0x60,0x70, 0x4,0x5a,0x5c, + 0x5,0x60,0x73, 0x5,0x60,0x71, 0x7,0x3e,0x5b, 0x7,0x3e,0x5a, + 0x7,0x3e,0x5e, 0x7,0x3e,0x5d, 0xf,0x5e,0x26, 0x5,0x60,0x6e, + 0x7,0x45,0x6e, 0x5,0x67,0x31, 0x5,0x67,0x2e, 0x5,0x67,0x2d, + 0x7,0x45,0x6b, 0x7,0x45,0x6d, 0x7,0x45,0x6a, 0x5,0x67,0x30, + 0x7,0x45,0x6c, 0xf,0x61,0x78, 0xf,0x61,0x79, 0xf,0x61,0x7a, + 0x5,0x67,0x2f, 0x5,0x6b,0x4f, 0x5,0x6b,0x4e, 0x5,0x6b,0x51, + 0x4,0x62,0x73, 0x7,0x4c,0x73, 0x5,0x6b,0x50, 0x7,0x4c,0x72, + 0x5,0x68,0x40, 0x7,0x52,0x4b, 0x4,0x62,0x74, 0x4,0x65,0x6f, + 0x7,0x4c,0x74, 0xf,0x67,0x39, 0x7,0x52,0x4a, 0x7,0x52,0x4c, + 0x5,0x6f,0x4a, 0x4,0x68,0x47, 0x7,0x57,0x2c, 0x7,0x57,0x2d, + 0x4,0x68,0x46, 0xf,0x69,0x35, 0x5,0x75,0x47, 0x4,0x6a,0x2e, + 0xf,0x6a,0x49, 0x5,0x77,0x3a, 0x5,0x77,0x3c, 0x5,0x77,0x3b, + 0x7,0x5e,0x3a, 0x7,0x5e,0x3b, 0x7,0x60,0x56, 0x4,0x6c,0x58, + 0x7,0x60,0x57, 0xf,0x6b,0x7b, 0x5,0x79,0x75, 0x5,0x79,0x74, + 0x5,0x78,0x6e, 0x4,0x6d,0x40, 0x4,0x6d,0x6c, 0xf,0x6c,0x47, + 0x7,0x65,0x28, 0x7,0x65,0x57, 0x5,0x7c,0x46, 0x7,0x66,0x47, + 0x6,0x5a,0x5f, 0x6,0x5a,0x5e, 0x5,0x44,0x53, 0xf,0x46,0x3f, + 0x4,0x48,0x75, 0x6,0x64,0x75, 0xf,0x4d,0x53, 0x5,0x53,0x4b, + 0x5,0x53,0x4a, 0x4,0x4f,0x4f, 0x5,0x53,0x49, 0x5,0x53,0x48, + 0x7,0x2c,0x2b, 0x7,0x2c,0x2f, 0x7,0x2c,0x2a, 0x4,0x4f,0x4e, + 0x7,0x2c,0x2c, 0x5,0x53,0x4c, 0x7,0x2c,0x2e, 0x7,0x2c,0x2d, + 0x7,0x36,0x61, 0x7,0x36,0x5f, 0x7,0x36,0x5e, 0x7,0x36,0x63, + 0x4,0x55,0x5b, 0x7,0x36,0x62, 0x6,0x47,0x53, 0xf,0x59,0x45, + 0x5,0x5a,0x5e, 0x7,0x36,0x60, 0x5,0x60,0x74, 0x5,0x60,0x75, + 0x7,0x3e,0x60, 0x7,0x3e,0x61, 0xf,0x5e,0x28, 0x7,0x3e,0x62, + 0x7,0x3e,0x5f, 0x7,0x45,0x70, 0x5,0x67,0x32, 0x7,0x45,0x72, + 0x5,0x67,0x33, 0x5,0x67,0x35, 0x7,0x45,0x73, 0x5,0x67,0x34, + 0xf,0x61,0x7b, 0x7,0x45,0x71, 0x7,0x45,0x6f, 0x4,0x62,0x7a, + 0x4,0x62,0x78, 0x7,0x4c,0x79, 0x7,0x4c,0x7b, 0x7,0x4c,0x75, + 0x5,0x6b,0x54, 0x5,0x6b,0x52, 0x7,0x4c,0x7a, 0x5,0x6b,0x55, + 0x5,0x6b,0x53, 0x7,0x4c,0x78, 0x4,0x62,0x7b, 0x7,0x4c,0x77, + 0x7,0x4c,0x76, 0x5,0x6f,0x4b, 0x7,0x52,0x53, 0x7,0x52,0x52, + 0x5,0x6f,0x4c, 0x7,0x52,0x50, 0x4,0x65,0x70, 0x7,0x52,0x4f, + 0x5,0x6f,0x4e, 0x5,0x6f,0x4d, 0x7,0x52,0x51, 0xf,0x67,0x3a, + 0x7,0x52,0x4e, 0x7,0x52,0x4d, 0x5,0x72,0x6c, 0x7,0x57,0x2f, + 0x5,0x72,0x6f, 0x7,0x57,0x30, 0x5,0x72,0x6e, 0x7,0x57,0x31, + 0x7,0x57,0x2e, 0x5,0x72,0x6d, 0x5,0x75,0x4b, 0x5,0x75,0x4c, + 0x7,0x5a,0x74, 0x5,0x75,0x49, 0x5,0x75,0x4e, 0x7,0x5a,0x7b, + 0x7,0x5a,0x76, 0x7,0x5a,0x77, 0x7,0x5a,0x7c, 0x7,0x5a,0x79, + 0x5,0x75,0x4a, 0x7,0x5a,0x75, 0x7,0x5a,0x78, 0x7,0x5a,0x7a, + 0x5,0x77,0x3f, 0x4,0x6b,0x4f, 0x5,0x77,0x3e, 0x5,0x77,0x40, + 0x5,0x77,0x3d, 0x5,0x78,0x6f, 0x5,0x78,0x71, 0x5,0x78,0x70, + 0x7,0x60,0x59, 0x7,0x5e,0x3c, 0x4,0x6c,0x59, 0x7,0x60,0x58, + 0x4,0x6d,0x6d, 0x7,0x63,0x3f, 0x7,0x64,0x39, 0x7,0x64,0x38, + 0x5,0x7b,0x58, 0x7,0x65,0x29, 0x4,0x6e,0x52, 0x5,0x7c,0x30, + 0xf,0x29,0x21, 0xf,0x46,0x3e, 0xf,0x53,0x42, 0xf,0x5e,0x27, + 0x5,0x4b,0x70, 0x5,0x4b,0x6e, 0x5,0x4b,0x6f, 0x5,0x53,0x4e, + 0x4,0x4f,0x50, 0x5,0x53,0x4d, 0x7,0x2c,0x30, 0x5,0x5a,0x61, + 0x7,0x36,0x64, 0x5,0x5a,0x5f, 0x5,0x5a,0x60, 0xf,0x59,0x46, + 0x5,0x60,0x78, 0x5,0x60,0x76, 0xf,0x5e,0x29, 0x5,0x60,0x77, + 0x5,0x67,0x36, 0x7,0x4c,0x7c, 0x5,0x6b,0x56, 0x7,0x4c,0x7d, + 0x4,0x65,0x73, 0x7,0x57,0x32, 0x5,0x72,0x70, 0x7,0x5a,0x7e, + 0x4,0x6b,0x50, 0x7,0x5b,0x56, 0x7,0x5e,0x3d, 0x4,0x6b,0x51, + 0x5,0x7c,0x31, 0xf,0x4d,0x54, 0x7,0x2c,0x32, 0x5,0x5a,0x62, + 0x5,0x5a,0x64, 0x5,0x5a,0x63, 0x5,0x60,0x7a, 0x5,0x67,0x38, + 0x5,0x60,0x79, 0x5,0x67,0x39, 0x5,0x67,0x37, 0x5,0x6b,0x57, + 0x4,0x63,0x22, 0xf,0x64,0x79, 0x4,0x65,0x75, 0x4,0x65,0x74, + 0x5,0x6f,0x50, 0x5,0x6f,0x4f, 0x4,0x65,0x77, 0x7,0x52,0x54, + 0x7,0x52,0x55, 0x7,0x52,0x56, 0xf,0x67,0x3b, 0x7,0x52,0x57, + 0x5,0x72,0x73, 0x5,0x72,0x72, 0x5,0x72,0x71, 0x7,0x57,0x33, + 0x7,0x57,0x34, 0x5,0x75,0x4f, 0x4,0x6a,0x2f, 0x4,0x6a,0x30, + 0x7,0x5b,0x23, 0x7,0x5b,0x22, 0x7,0x5b,0x21, 0x7,0x5e,0x3e, + 0x5,0x78,0x72, 0x7,0x60,0x5a, 0x5,0x78,0x73, 0x7,0x61,0x79, + 0x5,0x79,0x76, 0x7,0x66,0x27, 0x4,0x48,0x76, 0x5,0x53,0x4f, + 0x4,0x4f,0x51, 0x7,0x36,0x68, 0x7,0x36,0x66, 0x5,0x5a,0x66, + 0x5,0x5a,0x65, 0x5,0x5a,0x67, 0x5,0x60,0x7e, 0x7,0x3e,0x64, + 0x5,0x60,0x7c, 0x7,0x3e,0x63, 0x5,0x60,0x7b, 0x4,0x5a,0x5e, + 0x5,0x60,0x7d, 0x7,0x3e,0x65, 0x7,0x3e,0x66, 0x5,0x67,0x3b, + 0x5,0x67,0x3a, 0x4,0x65,0x78, 0x5,0x6f,0x51, 0x5,0x6f,0x53, + 0x5,0x72,0x74, 0x7,0x57,0x36, 0x7,0x57,0x35, 0xf,0x69,0x36, + 0x5,0x75,0x50, 0x4,0x6b,0x54, 0x5,0x77,0x42, 0x5,0x77,0x41, + 0x4,0x6b,0x53, 0x7,0x63,0x40, 0x7,0x61,0x7a, 0x4,0x6d,0x6e, + 0x5,0x7b,0x5a, 0x7,0x65,0x2a, 0x5,0x7b,0x59, 0x6,0x64,0x76, + 0x5,0x44,0x54, 0x6,0x64,0x78, 0x6,0x64,0x77, 0x7,0x2c,0x34, + 0x4,0x4f,0x55, 0x4,0x4f,0x54, 0x5,0x53,0x50, 0x7,0x2c,0x35, + 0x7,0x2c,0x36, 0x7,0x36,0x6a, 0x5,0x5a,0x6a, 0x5,0x5a,0x68, + 0x5,0x5a,0x69, 0x7,0x36,0x69, 0x7,0x36,0x6b, 0x7,0x36,0x6c, + 0x4,0x5a,0x60, 0x7,0x3e,0x68, 0x5,0x61,0x21, 0xf,0x5e,0x2a, + 0x7,0x3e,0x67, 0x5,0x67,0x3e, 0x5,0x67,0x3c, 0x7,0x45,0x74, + 0x5,0x6b,0x58, 0x5,0x61,0x22, 0x5,0x67,0x3f, 0x5,0x6b,0x5a, + 0x5,0x6b,0x59, 0x5,0x6b,0x5b, 0x5,0x6b,0x5d, 0x5,0x6b,0x5c, + 0x7,0x4d,0x21, 0x7,0x4c,0x7e, 0x5,0x6f,0x56, 0x5,0x6f,0x57, + 0x7,0x52,0x5b, 0x5,0x6f,0x5b, 0x5,0x6f,0x59, 0x5,0x6f,0x55, + 0x7,0x52,0x58, 0x4,0x65,0x7e, 0x4,0x65,0x7b, 0x7,0x52,0x5c, + 0x5,0x6f,0x5a, 0x4,0x65,0x7a, 0x7,0x52,0x5a, 0xf,0x67,0x3c, + 0x7,0x52,0x59, 0x7,0x57,0x38, 0x4,0x68,0x53, 0x4,0x68,0x51, + 0x5,0x72,0x78, 0x4,0x68,0x50, 0x5,0x72,0x7b, 0x7,0x57,0x37, + 0x5,0x72,0x75, 0x5,0x72,0x79, 0x5,0x72,0x77, 0x4,0x68,0x54, + 0x5,0x72,0x76, 0x4,0x68,0x55, 0x4,0x6a,0x34, 0x7,0x57,0x39, + 0x7,0x57,0x3a, 0x5,0x72,0x7a, 0x5,0x75,0x51, 0x4,0x6a,0x33, + 0x4,0x6a,0x35, 0x7,0x5b,0x2a, 0x7,0x5b,0x27, 0x7,0x5b,0x26, + 0x4,0x6a,0x32, 0x7,0x5b,0x29, 0x7,0x5b,0x28, 0x5,0x75,0x52, + 0x7,0x5b,0x25, 0x5,0x77,0x47, 0x7,0x5e,0x41, 0x5,0x77,0x46, + 0x5,0x77,0x44, 0x5,0x77,0x45, 0x5,0x77,0x43, 0x5,0x77,0x48, + 0x7,0x5e,0x3f, 0x5,0x78,0x76, 0x5,0x78,0x77, 0x7,0x60,0x5d, + 0x4,0x6c,0x5c, 0x4,0x6c,0x60, 0x5,0x78,0x75, 0x7,0x60,0x5c, + 0x5,0x78,0x74, 0x4,0x6c,0x5f, 0x4,0x6c,0x5e, 0x4,0x6c,0x5d, + 0x7,0x5e,0x40, 0x7,0x60,0x5b, 0x5,0x79,0x78, 0x5,0x79,0x79, + 0x5,0x79,0x7a, 0x5,0x79,0x77, 0x4,0x6d,0x45, 0x7,0x61,0x7b, + 0x7,0x61,0x7c, 0x4,0x6d,0x46, 0x5,0x7a,0x5c, 0x7,0x64,0x3a, + 0x7,0x65,0x2b, 0x4,0x6e,0x30, 0x7,0x64,0x3b, 0x5,0x7b,0x33, + 0x4,0x6e,0x2f, 0x5,0x7b,0x5b, 0x5,0x7b,0x5c, 0x7,0x65,0x2c, + 0x4,0x6e,0x4a, 0x5,0x7b,0x76, 0x7,0x65,0x6e, 0x5,0x7c,0x4a, + 0x7,0x66,0x52, 0x7,0x45,0x75, 0x4,0x66,0x22, 0x5,0x72,0x7c, + 0x4,0x68,0x57, 0x5,0x77,0x49, 0x6,0x64,0x79, 0x7,0x2c,0x38, + 0x7,0x2c,0x37, 0x5,0x61,0x24, 0x7,0x36,0x6d, 0x4,0x5a,0x61, + 0x7,0x3e,0x69, 0x7,0x3e,0x6a, 0x7,0x45,0x78, 0x5,0x67,0x42, + 0x7,0x45,0x79, 0x7,0x45,0x77, 0x7,0x45,0x76, 0x4,0x5f,0x41, + 0x7,0x4d,0x24, 0x7,0x4d,0x25, 0x7,0x3e,0x6b, 0x7,0x4d,0x23, + 0x7,0x52,0x5e, 0x7,0x52,0x5f, 0x7,0x52,0x5d, 0x5,0x72,0x7d, + 0x7,0x57,0x3b, 0x4,0x6a,0x36, 0x7,0x5b,0x2c, 0x7,0x5b,0x31, + 0x7,0x5b,0x32, 0x7,0x5b,0x2e, 0x7,0x5b,0x30, 0x7,0x5b,0x2d, + 0x7,0x5b,0x2b, 0x7,0x5b,0x2f, 0x5,0x77,0x4a, 0x7,0x5e,0x42, + 0x5,0x78,0x78, 0x5,0x79,0x7b, 0x5,0x7a,0x5d, 0x4,0x6d,0x47, + 0x7,0x63,0x41, 0x5,0x7b,0x34, 0x7,0x63,0x42, 0x7,0x65,0x2d, + 0x6,0x50,0x4f, 0x7,0x36,0x6e, 0x7,0x36,0x6f, 0x5,0x5a,0x6b, + 0x7,0x46,0x4f, 0x7,0x65,0x2e, 0x5,0x5a,0x6c, 0x5,0x61,0x25, + 0x7,0x3e,0x6d, 0x5,0x67,0x43, 0x7,0x45,0x7a, 0x5,0x67,0x44, + 0xf,0x61,0x7d, 0x7,0x4d,0x27, 0x5,0x6b,0x60, 0x7,0x4d,0x26, + 0x5,0x6b,0x5e, 0x5,0x6b,0x5f, 0x4,0x63,0x25, 0x4,0x66,0x23, + 0x7,0x52,0x60, 0x4,0x6a,0x39, 0x4,0x68,0x58, 0x7,0x57,0x3c, + 0x7,0x57,0x3d, 0x5,0x75,0x53, 0x7,0x5b,0x34, 0x7,0x5b,0x35, + 0x5,0x75,0x55, 0x4,0x6a,0x38, 0x7,0x5b,0x33, 0x5,0x75,0x54, + 0x7,0x5e,0x43, 0x7,0x60,0x5e, 0x5,0x78,0x79, 0x7,0x60,0x5f, + 0x5,0x79,0x7c, 0x7,0x63,0x43, 0x5,0x7b,0x35, 0x5,0x7b,0x77, + 0x7,0x2c,0x39, 0x5,0x5a,0x6d, 0x7,0x3e,0x6e, 0x5,0x5a,0x6e, + 0x5,0x61,0x28, 0x5,0x61,0x2a, 0x5,0x61,0x2b, 0x5,0x61,0x29, + 0x5,0x61,0x27, 0x7,0x3e,0x70, 0x5,0x61,0x26, 0x7,0x3e,0x6f, + 0x5,0x61,0x2c, 0x4,0x5a,0x62, 0x7,0x45,0x7c, 0x7,0x4d,0x2c, + 0x5,0x67,0x47, 0x5,0x67,0x48, 0x5,0x67,0x46, 0x5,0x67,0x45, + 0x7,0x45,0x7b, 0x7,0x4d,0x2a, 0x5,0x6b,0x61, 0x5,0x6b,0x63, + 0x5,0x6b,0x62, 0x7,0x4d,0x2d, 0x7,0x4d,0x2e, 0x7,0x4d,0x29, + 0x7,0x52,0x62, 0x7,0x52,0x64, 0x7,0x52,0x63, 0x5,0x6f,0x5d, + 0x5,0x6f,0x5e, 0x7,0x4d,0x2b, 0x7,0x52,0x65, 0x5,0x6f,0x5c, + 0x7,0x52,0x61, 0x5,0x73,0x21, 0x5,0x72,0x7e, 0x7,0x57,0x3e, + 0x5,0x75,0x57, 0x7,0x5b,0x36, 0x5,0x75,0x58, 0x5,0x75,0x59, + 0x5,0x75,0x56, 0x4,0x6a,0x3a, 0x7,0x5e,0x44, 0x5,0x77,0x4b, + 0x4,0x6b,0x59, 0x7,0x5e,0x48, 0x4,0x6b,0x57, 0x4,0x6b,0x5a, + 0x7,0x5e,0x47, 0x7,0x5e,0x46, 0x7,0x5e,0x45, 0x5,0x78,0x7d, + 0x4,0x6c,0x63, 0x5,0x78,0x7b, 0x5,0x78,0x7a, 0x7,0x60,0x60, + 0x7,0x61,0x7e, 0x7,0x61,0x7d, 0x4,0x6d,0x49, 0x5,0x79,0x7d, + 0x5,0x7b,0x36, 0x5,0x7b,0x79, 0x5,0x7b,0x78, 0x7,0x65,0x6f, + 0x7,0x66,0x22, 0x4,0x4f,0x57, 0x7,0x36,0x70, 0x7,0x36,0x71, + 0x7,0x3e,0x72, 0x7,0x3e,0x71, 0x5,0x67,0x49, 0x7,0x45,0x7e, + 0x7,0x46,0x21, 0x7,0x45,0x7d, 0x5,0x6b,0x64, 0x5,0x6b,0x65, + 0x7,0x52,0x66, 0x5,0x6f,0x5f, 0x5,0x6f,0x60, 0x7,0x52,0x68, + 0x4,0x68,0x5b, 0x5,0x73,0x22, 0x7,0x57,0x3f, 0x7,0x57,0x40, + 0x5,0x73,0x23, 0x5,0x73,0x24, 0x7,0x5b,0x37, 0x5,0x77,0x4c, + 0x7,0x5e,0x49, 0x5,0x78,0x7c, 0xf,0x6b,0x7e, 0x7,0x60,0x61, + 0x5,0x79,0x7e, 0x5,0x7a,0x21, 0x7,0x63,0x46, 0x5,0x7a,0x5e, + 0x7,0x63,0x45, 0x7,0x64,0x3c, 0x4,0x6e,0x53, 0x5,0x7c,0x32, + 0xf,0x40,0x34, 0x4,0x55,0x64, 0x4,0x5a,0x65, 0x7,0x46,0x22, + 0x4,0x63,0x28, 0x7,0x4d,0x2f, 0x5,0x6d,0x57, 0x4,0x66,0x24, + 0x4,0x6a,0x3b, 0xf,0x69,0x37, 0x5,0x7a,0x23, 0x5,0x7a,0x22, + 0x7,0x62,0x21, 0x7,0x65,0x2f, 0x5,0x61,0x2e, 0x7,0x3e,0x73, + 0x7,0x46,0x25, 0x4,0x5f,0x47, 0x7,0x46,0x24, 0x7,0x4d,0x30, + 0x5,0x6b,0x66, 0x4,0x63,0x2a, 0x7,0x4d,0x31, 0x7,0x4d,0x34, + 0x7,0x4d,0x32, 0x7,0x4d,0x33, 0x7,0x4d,0x35, 0x7,0x4d,0x36, + 0x5,0x6b,0x67, 0x7,0x52,0x6b, 0x5,0x6f,0x63, 0x5,0x6f,0x62, + 0x4,0x66,0x28, 0x7,0x52,0x69, 0x4,0x66,0x2a, 0x7,0x52,0x6d, + 0x4,0x66,0x29, 0x7,0x52,0x6e, 0x7,0x52,0x6a, 0x4,0x48,0x78, + 0x7,0x52,0x6c, 0x7,0x57,0x46, 0x5,0x73,0x2a, 0x5,0x73,0x27, + 0x7,0x57,0x43, 0x7,0x57,0x42, 0x4,0x68,0x5e, 0x5,0x73,0x28, + 0x4,0x68,0x5f, 0x4,0x68,0x5d, 0x7,0x57,0x44, 0x5,0x73,0x25, + 0x5,0x73,0x2b, 0x7,0x57,0x45, 0x7,0x57,0x47, 0x5,0x73,0x29, + 0x7,0x57,0x41, 0x5,0x73,0x26, 0x7,0x5b,0x38, 0x4,0x6a,0x3e, + 0x5,0x75,0x5c, 0x5,0x75,0x5b, 0x5,0x75,0x5e, 0x7,0x5b,0x40, + 0x7,0x5b,0x3f, 0x5,0x75,0x5f, 0x7,0x5b,0x3a, 0x5,0x75,0x60, + 0x4,0x6a,0x3f, 0x7,0x5b,0x39, 0x5,0x75,0x5a, 0x7,0x5b,0x3b, + 0x7,0x5b,0x3d, 0x7,0x5b,0x3e, 0x7,0x5b,0x3c, 0x5,0x75,0x5d, + 0x5,0x77,0x4f, 0x5,0x77,0x4e, 0x4,0x6b,0x5e, 0x4,0x6b,0x62, + 0x4,0x6b,0x63, 0x4,0x6b,0x5f, 0x4,0x6b,0x60, 0x5,0x77,0x50, + 0x7,0x5e,0x4e, 0x7,0x5e,0x4c, 0x4,0x6b,0x5d, 0x7,0x5e,0x4a, + 0x7,0x5e,0x4b, 0x7,0x5e,0x4f, 0x4,0x6b,0x64, 0x4,0x6c,0x67, + 0x5,0x78,0x7e, 0x7,0x60,0x67, 0x4,0x6c,0x68, 0x7,0x60,0x65, + 0x5,0x79,0x21, 0x7,0x62,0x23, 0x4,0x6c,0x65, 0x7,0x60,0x63, + 0x7,0x60,0x66, 0x7,0x60,0x64, 0x7,0x60,0x62, 0x7,0x60,0x68, + 0x5,0x79,0x22, 0x4,0x6d,0x4e, 0x4,0x6d,0x4a, 0x7,0x62,0x25, + 0x5,0x7a,0x26, 0x4,0x6d,0x50, 0x4,0x6d,0x4d, 0x5,0x7a,0x24, + 0x7,0x62,0x27, 0x4,0x6d,0x4f, 0x7,0x62,0x24, 0x7,0x62,0x26, + 0x7,0x62,0x28, 0x7,0x62,0x29, 0x7,0x62,0x22, 0x5,0x7a,0x25, + 0x7,0x63,0x48, 0x5,0x7a,0x60, 0x7,0x63,0x47, 0x5,0x7a,0x62, + 0x5,0x7a,0x5f, 0x5,0x7a,0x61, 0x7,0x64,0x3e, 0x4,0x6e,0x32, + 0x7,0x64,0x3d, 0x5,0x7b,0x37, 0x5,0x7b,0x39, 0x5,0x7b,0x38, + 0x7,0x64,0x40, 0x7,0x64,0x41, 0x7,0x64,0x3f, 0x4,0x6e,0x46, + 0x7,0x65,0x32, 0x5,0x7b,0x5d, 0x7,0x65,0x31, 0x7,0x65,0x30, + 0x7,0x65,0x59, 0x7,0x65,0x71, 0x7,0x65,0x72, 0x5,0x7c,0x2a, + 0x7,0x65,0x70, 0x7,0x65,0x73, 0x5,0x7c,0x33, 0x7,0x66,0x24, + 0x7,0x66,0x23, 0x5,0x7c,0x3b, 0x7,0x66,0x32, 0x5,0x7c,0x3a, + 0x7,0x66,0x31, 0x7,0x66,0x3d, 0x7,0x66,0x3c, 0x5,0x7c,0x45, + 0x7,0x66,0x41, 0x7,0x66,0x48, 0x5,0x7c,0x4e, 0x5,0x7c,0x4d, + 0x5,0x6b,0x68, 0x7,0x4d,0x37, 0x4,0x63,0x2c, 0x7,0x52,0x70, + 0x7,0x52,0x6f, 0x7,0x4e,0x24, 0x5,0x6f,0x64, 0x7,0x57,0x48, + 0xf,0x67,0x3d, 0x7,0x5b,0x42, 0x7,0x5b,0x41, 0x7,0x5b,0x43, + 0x7,0x5b,0x44, 0x5,0x77,0x51, 0x5,0x7c,0x51, 0x7,0x36,0x72, + 0x7,0x3e,0x74, 0x7,0x46,0x26, 0x7,0x57,0x49, 0x5,0x6f,0x65, + 0x4,0x66,0x2b, 0x5,0x6f,0x67, 0x5,0x6f,0x66, 0x4,0x66,0x2c, + 0x7,0x52,0x73, 0x7,0x52,0x71, 0xf,0x67,0x3e, 0x7,0x52,0x72, + 0x5,0x73,0x2c, 0x5,0x73,0x2e, 0x7,0x57,0x4b, 0x5,0x73,0x2f, + 0x5,0x6b,0x6a, 0x5,0x73,0x2d, 0x7,0x54,0x2a, 0x7,0x57,0x4a, + 0x7,0x4d,0x39, 0x7,0x4d,0x38, 0x5,0x7b,0x5e, 0x7,0x61,0x29, + 0x5,0x7b,0x3a, 0x5,0x77,0x52, 0x7,0x64,0x42, 0xf,0x6d,0x2d, + 0x5,0x7c,0x42, 0xf,0x29,0x26, 0x5,0x73,0x30, 0x7,0x62,0x2b, + 0x7,0x62,0x2a, 0x5,0x7a,0x64, 0x5,0x7a,0x63, 0x7,0x63,0x4a, + 0x7,0x63,0x49, 0x5,0x7b,0x3b, 0x4,0x6e,0x47, 0x7,0x66,0x25, + 0x4,0x6e,0x56, 0x7,0x66,0x4c, 0x6,0x29,0x36, 0x6,0x21,0x31, + 0x6,0x21,0x21, 0x6,0x25,0x66, 0x6,0x25,0x72, 0x4,0x25,0x3d, + 0x6,0x2e,0x61, 0xf,0x2d,0x68, 0x6,0x3d,0x35, 0x6,0x50,0x5b, + 0x4,0x3c,0x30, 0x6,0x5a,0x72, 0xf,0x59,0x4d, 0x6,0x23,0x52, + 0x3,0x24,0x52, 0x3,0x27,0x53, 0xf,0x67,0x40, 0x3,0x27,0x54, + 0x6,0x3d,0x3c, 0x7,0x4d,0x3e, 0x6,0x21,0x50, 0x3,0x22,0x7b, + 0x6,0x23,0x59, 0x3,0x21,0x4f, 0x6,0x35,0x44, 0x4,0x21,0x3f, + 0x6,0x22,0x3c, 0x3,0x24,0x41, 0x7,0x36,0x7a, 0x5,0x21,0x29, + 0x6,0x21,0x38, 0xf,0x23,0x37, 0x6,0x29,0x63, 0x6,0x2e,0x76, + 0x6,0x46,0x67, 0x3,0x40,0x43, 0xf,0x22,0x29, 0x6,0x2f,0x25, + 0x6,0x35,0x58, 0x4,0x36,0x4c, 0x4,0x21,0x2f, 0x6,0x22,0x46, + 0x3,0x22,0x25, 0x6,0x22,0x49, 0x3,0x23,0x29, 0x6,0x2f,0x38, + 0x6,0x46,0x74, 0x6,0x2a,0x23, 0x6,0x2f,0x3d, 0x6,0x3d,0x59, + 0x6,0x3d,0x5a, 0x3,0x3a,0x26, 0xf,0x21,0x33, 0x3,0x24,0x29, + 0x6,0x21,0x61, 0x6,0x26,0x43, 0x5,0x31,0x31, 0x6,0x22,0x5b, + 0x5,0x21,0x60, 0x3,0x23,0x3c, 0x4,0x23,0x5c, 0x6,0x26,0x4e, + 0x4,0x23,0x5b, 0x6,0x2a,0x3c, 0x3,0x30,0x23, 0x6,0x35,0x7e, + 0x4,0x30,0x76, 0x6,0x3d,0x7c, 0x6,0x47,0x2a, 0x6,0x47,0x2c, + 0x6,0x47,0x30, 0x6,0x47,0x31, 0x6,0x47,0x33, 0x4,0x3c,0x50, + 0x6,0x5b,0x5b, 0x6,0x51,0x36, 0x6,0x5b,0x59, 0x7,0x21,0x60, + 0x7,0x2c,0x65, 0x3,0x21,0x7c, 0x6,0x24,0x33, 0x6,0x36,0x35, + 0x6,0x3e,0x2c, 0x6,0x3e,0x2b, 0x3,0x34,0x70, 0x4,0x36,0x76, + 0x6,0x51,0x4a, 0x7,0x21,0x76, 0x7,0x46,0x3e, 0xf,0x23,0x5b, + 0x6,0x51,0x57, 0x5,0x23,0x62, 0x6,0x24,0x3b, 0x6,0x51,0x5e, + 0x6,0x47,0x56, 0x6,0x22,0x67, 0xf,0x2a,0x2b, 0x6,0x36,0x4c, + 0x6,0x36,0x4d, 0xf,0x2e,0x6d, 0x6,0x3e,0x54, 0x6,0x3e,0x50, + 0x6,0x47,0x61, 0x6,0x51,0x69, 0xf,0x47,0x46, 0x3,0x5a,0x33, + 0x7,0x46,0x51, 0x6,0x24,0x48, 0x4,0x31,0x30, 0xf,0x41,0x2b, + 0x6,0x5c,0x22, 0x3,0x5a,0x36, 0x7,0x60,0x6d, 0x6,0x27,0x21, + 0x6,0x36,0x67, 0x6,0x24,0x4b, 0x4,0x21,0x34, 0x5,0x28,0x73, + 0x6,0x47,0x7b, 0x4,0x21,0x35, 0xf,0x26,0x62, 0x3,0x2c,0x40, + 0x6,0x30,0x4e, 0x6,0x48,0x2b, 0x6,0x48,0x35, 0x3,0x40,0x7e, + 0x6,0x52,0x33, 0x6,0x5c,0x3d, 0x6,0x27,0x36, 0x6,0x5c,0x49, + 0xf,0x21,0x5f, 0x6,0x48,0x37, 0x6,0x37,0x2c, 0x6,0x48,0x3c, + 0x7,0x2d,0x53, 0x7,0x2d,0x55, 0x7,0x60,0x6e, 0x5,0x29,0x27, + 0x6,0x3f,0x46, 0x6,0x3f,0x45, 0x3,0x35,0x5f, 0x6,0x52,0x40, + 0x5,0x45,0x5d, 0x6,0x21,0x74, 0x6,0x27,0x4a, 0x6,0x2b,0x2f, + 0x6,0x30,0x74, 0xf,0x2a,0x5d, 0x6,0x2b,0x39, 0x7,0x2d,0x63, + 0x5,0x73,0x40, 0x3,0x2c,0x51, 0x6,0x3f,0x5e, 0x5,0x2d,0x48, + 0x3,0x35,0x65, 0x6,0x27,0x5f, 0xf,0x24,0x33, 0x5,0x24,0x38, + 0x6,0x31,0x36, 0x6,0x31,0x30, 0xf,0x2a,0x67, 0x4,0x29,0x4a, + 0x6,0x48,0x7c, 0x6,0x48,0x78, 0x3,0x46,0x70, 0x6,0x52,0x6c, + 0x6,0x52,0x66, 0x6,0x5d,0x26, 0x6,0x5d,0x24, 0x4,0x43,0x51, + 0x7,0x2d,0x69, 0x7,0x2d,0x79, 0x7,0x22,0x7b, 0x3,0x54,0x60, + 0x4,0x5b,0x2c, 0x7,0x47,0x28, 0x3,0x26,0x27, 0x6,0x40,0x23, + 0x5,0x22,0x6e, 0x6,0x2b,0x63, 0x6,0x2b,0x60, 0x6,0x31,0x4f, + 0xf,0x2b,0x2b, 0x6,0x37,0x71, 0x3,0x36,0x28, 0x6,0x40,0x36, + 0x6,0x40,0x2b, 0x6,0x49,0x4a, 0x6,0x49,0x30, 0xf,0x41,0x5f, + 0x7,0x23,0x30, 0x6,0x5d,0x38, 0x5,0x46,0x2c, 0x7,0x23,0x2d, + 0xf,0x4f,0x25, 0x4,0x4a,0x27, 0x7,0x38,0x39, 0xf,0x5e,0x70, + 0x4,0x2d,0x46, 0x6,0x49,0x57, 0xf,0x5a,0x36, 0x3,0x36,0x40, + 0x6,0x38,0x36, 0xf,0x41,0x72, 0x6,0x53,0x3c, 0x5,0x46,0x41, + 0xf,0x2b,0x38, 0x6,0x31,0x6d, 0x6,0x40,0x57, 0x6,0x49,0x78, + 0x6,0x5d,0x5b, 0x6,0x2c,0x23, 0x5,0x26,0x4a, 0x4,0x32,0x3e, + 0x6,0x40,0x58, 0x5,0x3f,0x66, 0x4,0x24,0x47, 0x6,0x28,0x2e, + 0xf,0x24,0x51, 0x4,0x26,0x68, 0x3,0x2d,0x35, 0x6,0x38,0x4a, + 0x3,0x31,0x5c, 0x4,0x2d,0x5c, 0x6,0x38,0x50, 0x5,0x32,0x7e, + 0x3,0x3c,0x3a, 0x6,0x53,0x5e, 0x5,0x3f,0x71, 0x3,0x41,0x6e, + 0x6,0x5d,0x68, 0x7,0x23,0x72, 0xf,0x54,0x74, 0x7,0x2e,0x6a, + 0x4,0x5f,0x76, 0x7,0x58,0x23, 0x6,0x25,0x23, 0x6,0x4a,0x3f, + 0x7,0x23,0x78, 0x7,0x5e,0x72, 0xf,0x48,0x79, 0x6,0x53,0x77, + 0x4,0x2d,0x65, 0xf,0x35,0x74, 0x6,0x4a,0x4d, 0x6,0x2c,0x42, + 0xf,0x48,0x7b, 0x6,0x25,0x2e, 0xf,0x24,0x5d, 0x6,0x2c,0x5b, + 0x6,0x2c,0x51, 0x3,0x2d,0x52, 0x6,0x32,0x39, 0x6,0x32,0x42, + 0x4,0x2a,0x25, 0x4,0x2d,0x70, 0x6,0x39,0x2d, 0x6,0x38,0x74, + 0x6,0x39,0x21, 0xf,0x30,0x5b, 0x3,0x36,0x75, 0x6,0x4a,0x65, + 0x6,0x4a,0x63, 0x4,0x3e,0x33, 0x6,0x54,0x49, 0x6,0x54,0x4f, + 0xf,0x42,0x74, 0x6,0x5e,0x3e, 0x7,0x24,0x4f, 0x7,0x24,0x58, + 0xf,0x4f,0x69, 0x7,0x2f,0x42, 0xf,0x55,0x56, 0x4,0x56,0x5d, + 0x7,0x4e,0x28, 0x7,0x53,0x60, 0x7,0x53,0x58, 0x6,0x2c,0x60, + 0x6,0x2c,0x5d, 0x6,0x32,0x48, 0x4,0x38,0x68, 0xf,0x43,0x2f, + 0x6,0x54,0x59, 0xf,0x50,0x3d, 0xf,0x55,0x58, 0x5,0x7b,0x7b, + 0x3,0x55,0x45, 0x6,0x41,0x61, 0x6,0x41,0x63, 0x6,0x41,0x6a, + 0x6,0x5e,0x5e, 0x6,0x32,0x62, 0x6,0x4b,0x42, 0x7,0x47,0x75, + 0x6,0x22,0x26, 0xf,0x24,0x78, 0x6,0x2d,0x24, 0xf,0x2c,0x39, + 0xf,0x31,0x28, 0x6,0x4b,0x47, 0xf,0x43,0x64, 0x4,0x44,0x6e, + 0x7,0x40,0x63, 0xf,0x63,0x24, 0x6,0x42,0x21, 0x3,0x3d,0x3f, + 0x6,0x32,0x79, 0x4,0x2a,0x44, 0x5,0x33,0x65, 0x6,0x4b,0x56, + 0x4,0x3e,0x6c, 0x6,0x42,0x32, 0xf,0x4a,0x2f, 0x7,0x53,0x7b, + 0x6,0x2d,0x3a, 0x5,0x33,0x71, 0xf,0x56,0x3c, 0x6,0x2d,0x45, + 0x6,0x2d,0x3d, 0x6,0x33,0x3d, 0x6,0x33,0x31, 0x5,0x2f,0x26, + 0xf,0x2c,0x57, 0x6,0x3a,0x2d, 0x6,0x3a,0x2e, 0x6,0x42,0x48, + 0x6,0x4b,0x7a, 0xf,0x50,0x5f, 0x7,0x30,0x4a, 0x6,0x25,0x3f, + 0x6,0x2d,0x46, 0x3,0x43,0x33, 0x6,0x55,0x6b, 0x7,0x25,0x7b, + 0x7,0x39,0x6d, 0xf,0x28,0x3c, 0x6,0x33,0x4a, 0xf,0x3d,0x60, + 0x4,0x4b,0x60, 0x7,0x26,0x27, 0x6,0x3a,0x43, 0x6,0x42,0x67, + 0x4,0x45,0x5f, 0x4,0x52,0x21, 0x7,0x30,0x66, 0x6,0x5f,0x75, + 0x7,0x26,0x3e, 0x7,0x26,0x3c, 0x7,0x30,0x73, 0xf,0x4a,0x7b, + 0x6,0x60,0x23, 0xf,0x51,0x23, 0x7,0x26,0x4d, 0x7,0x41,0x3c, + 0x5,0x6c,0x7d, 0x7,0x31,0x2d, 0x7,0x3a,0x33, 0x4,0x5c,0x59, + 0x7,0x41,0x44, 0x3,0x2e,0x56, 0x6,0x33,0x66, 0x3,0x48,0x6a, + 0xf,0x51,0x37, 0x7,0x26,0x6a, 0x7,0x26,0x69, 0x4,0x64,0x26, + 0x7,0x62,0x4d, 0x6,0x4c,0x72, 0x7,0x3a,0x46, 0xf,0x3e,0x32, + 0x7,0x3a,0x49, 0x7,0x48,0x6d, 0x7,0x5f,0x3c, 0x6,0x4d,0x23, + 0xf,0x57,0x27, 0x4,0x2b,0x26, 0x7,0x27,0x28, 0xf,0x57,0x28, + 0x6,0x60,0x5d, 0x5,0x48,0x74, 0xf,0x5c,0x2d, 0x6,0x28,0x7b, + 0x4,0x27,0x68, 0x6,0x2d,0x69, 0x3,0x33,0x50, 0x5,0x3b,0x50, + 0x6,0x4d,0x48, 0xf,0x44,0x68, 0xf,0x4b,0x57, 0xf,0x4b,0x56, + 0x4,0x4c,0x56, 0x4,0x58,0x2d, 0x4,0x34,0x57, 0x6,0x4d,0x5e, + 0x3,0x44,0x25, 0x6,0x61,0x25, 0x3,0x27,0x2a, 0x6,0x25,0x52, + 0x6,0x29,0x27, 0xf,0x28,0x5c, 0x6,0x29,0x28, 0x6,0x2e,0x22, + 0x6,0x2e,0x23, 0x6,0x34,0x44, 0x6,0x2e,0x24, 0x6,0x3b,0x52, + 0xf,0x32,0x3a, 0x4,0x34,0x73, 0x6,0x44,0x2b, 0x4,0x34,0x74, + 0x6,0x43,0x76, 0x6,0x44,0x3b, 0x4,0x3a,0x66, 0x6,0x44,0x3e, + 0x6,0x44,0x3c, 0x6,0x44,0x3d, 0x6,0x4e,0x3b, 0x6,0x61,0x3e, + 0x6,0x61,0x4f, 0xf,0x51,0x64, 0x4,0x4c,0x79, 0x7,0x27,0x61, + 0x7,0x27,0x6d, 0x7,0x32,0x44, 0xf,0x57,0x47, 0x7,0x3a,0x6f, + 0xf,0x60,0x5d, 0x7,0x42,0x3c, 0x7,0x54,0x5e, 0x4,0x67,0x2b, + 0x6,0x34,0x47, 0x4,0x40,0x4f, 0x7,0x3b,0x38, 0x3,0x5b,0x26, + 0x6,0x3b,0x71, 0x4,0x3a,0x75, 0x6,0x4e,0x46, 0x4,0x46,0x7c, + 0x4,0x4d,0x33, 0xf,0x52,0x24, 0x7,0x28,0x2e, 0xf,0x51,0x7d, + 0x7,0x42,0x60, 0x7,0x42,0x5f, 0x3,0x5b,0x2d, 0x4,0x64,0x3f, + 0x4,0x53,0x4c, 0x6,0x25,0x53, 0x5,0x30,0x3e, 0x6,0x58,0x2e, + 0x6,0x58,0x2c, 0xf,0x45,0x3d, 0x7,0x3b,0x61, 0xf,0x38,0x4a, + 0x5,0x7a,0x38, 0x6,0x3c,0x2d, 0x4,0x35,0x45, 0xf,0x3f,0x3b, + 0x6,0x62,0x47, 0x7,0x33,0x4f, 0x7,0x59,0x41, 0x6,0x29,0x2a, + 0x6,0x58,0x50, 0x6,0x58,0x5c, 0x3,0x60,0x7c, 0x6,0x3c,0x3b, + 0x7,0x33,0x79, 0x7,0x33,0x73, 0xf,0x3f,0x53, 0x3,0x44,0x6d, + 0x7,0x29,0x44, 0x6,0x34,0x5d, 0x4,0x30,0x2c, 0x7,0x34,0x31, + 0x4,0x54,0x37, 0x7,0x3c,0x61, 0x6,0x25,0x5b, 0x4,0x35,0x72, + 0x6,0x59,0x47, 0x6,0x59,0x4a, 0x7,0x3c,0x6b, 0xf,0x45,0x73, + 0x6,0x63,0x53, 0x6,0x63,0x4f, 0x4,0x54,0x4a, 0xf,0x66,0x5e, + 0x7,0x50,0x6b, 0xf,0x6c,0x3f, 0x6,0x63,0x58, 0x7,0x34,0x7a, + 0x7,0x34,0x71, 0xf,0x61,0x4a, 0x6,0x50,0x22, 0x6,0x63,0x6e, + 0x7,0x35,0x35, 0x3,0x56,0x78, 0x5,0x5f,0x5e, 0x7,0x3d,0x50, + 0xf,0x58,0x78, 0x7,0x4b,0x5f, 0x4,0x65,0x2a, 0x7,0x4b,0x6b, + 0x5,0x3d,0x47, 0x5,0x44,0x35, 0x6,0x5a,0x33, 0x6,0x64,0x30, + 0x4,0x59,0x76, 0x6,0x64,0x3a, 0x6,0x3c,0x77, 0x6,0x5a,0x3d, + 0x4,0x55,0x23, 0x4,0x5e,0x60, 0x6,0x64,0x50, 0x7,0x3e,0x29, + 0x7,0x2b,0x55, 0xf,0x59,0x32, 0x7,0x51,0x7a, 0x7,0x5a,0x60, + 0x4,0x5a,0x59, 0x7,0x45,0x65, 0x4,0x5f,0x37, 0x4,0x62,0x6e, + 0x7,0x52,0x45, 0x5,0x75,0x36, 0x5,0x75,0x35, 0xf,0x6c,0x77, + 0x7,0x3e,0x5c, 0x6,0x46,0x3e, 0x4,0x68,0x4f, 0x6,0x5a,0x60, + 0x4,0x28,0x34, 0x3,0x5c,0x2f, 0x5,0x53,0x51, 0x7,0x4d,0x28, + 0x4,0x48,0x77, 0x7,0x5e,0x4d, +}; + +static const Summary16 cns11643_inv_uni2indx_page00[16] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0080 }, { 1, 0x0083 }, + { 4, 0x0000 }, { 4, 0x0080 }, { 5, 0x0000 }, { 5, 0x0080 }, +}; +static const Summary16 cns11643_inv_uni2indx_page02[29] = { + /* 0x0200 */ + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0e80 }, { 10, 0x0200 }, { 11, 0x0000 }, { 11, 0x0000 }, + /* 0x0300 */ + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, + { 50, 0x03fb }, +}; +static const Summary16 cns11643_inv_uni2indx_page20[44] = { + /* 0x2000 */ + { 59, 0x0000 }, { 59, 0x3358 }, { 66, 0x0060 }, { 68, 0x4824 }, + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x1000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + /* 0x2100 */ + { 73, 0x0228 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x03ff }, { 86, 0x03ff }, + { 96, 0x0000 }, { 96, 0x03cf }, { 104, 0x0000 }, { 104, 0x0000 }, + { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, + /* 0x2200 */ + { 104, 0x0000 }, { 104, 0xc420 }, { 108, 0x4e01 }, { 113, 0x1030 }, + { 116, 0x0000 }, { 116, 0x0004 }, { 117, 0x00c3 }, { 121, 0x0000 }, + { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0020 }, { 122, 0x8000 }, +}; +static const Summary16 cns11643_inv_uni2indx_page24[37] = { + /* 0x2400 */ + { 123, 0xffff }, { 139, 0xffff }, { 155, 0x0002 }, { 156, 0x0000 }, + { 156, 0x0000 }, { 156, 0x0000 }, { 156, 0x03ff }, { 166, 0x3ff0 }, + { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, + { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, + /* 0x2500 */ + { 176, 0x1005 }, { 179, 0x1111 }, { 183, 0x1010 }, { 185, 0x1010 }, + { 187, 0x0000 }, { 187, 0x4001 }, { 189, 0xe402 }, { 194, 0x000f }, + { 198, 0xfffe }, { 213, 0x0030 }, { 215, 0x0003 }, { 217, 0x300c }, + { 221, 0xc8c0 }, { 226, 0x0000 }, { 226, 0x003c }, { 230, 0x0000 }, + /* 0x2600 */ + { 230, 0x0260 }, { 233, 0x0000 }, { 233, 0x0000 }, { 233, 0x0000 }, + { 233, 0x0007 }, +}; +static const Summary16 cns11643_inv_uni2indx_page30[1787] = { + /* 0x3000 */ + { 236, 0xff0f }, { 248, 0x6037 }, { 255, 0x03fe }, { 264, 0x0000 }, + { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, + { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, + { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0800 }, + /* 0x3100 */ + { 265, 0xffe0 }, { 276, 0xffff }, { 292, 0x03ff }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + /* 0x3200 */ + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0008 }, { 303, 0x0000 }, + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, + /* 0x3300 */ + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, + { 303, 0xc000 }, { 305, 0x7000 }, { 308, 0x0002 }, { 309, 0x0000 }, + { 309, 0x4010 }, { 311, 0x0026 }, { 314, 0x0000 }, { 314, 0x0000 }, + /* 0x3400 */ + { 314, 0x1073 }, { 320, 0x1040 }, { 322, 0x7b12 }, { 330, 0x5f5f }, + { 342, 0xfe3e }, { 354, 0xff8b }, { 366, 0xc0f8 }, { 373, 0xfefb }, + { 387, 0x7fff }, { 402, 0xfefe }, { 416, 0xbff3 }, { 429, 0xfffd }, + { 444, 0xdfbc }, { 456, 0xfdfb }, { 470, 0xf39f }, { 482, 0x7ffe }, + /* 0x3500 */ + { 496, 0xfcff }, { 510, 0x77af }, { 522, 0xf7ff }, { 537, 0xffff }, + { 553, 0xffff }, { 569, 0xdff7 }, { 583, 0xfeff }, { 598, 0x1fef }, + { 610, 0x81ff }, { 620, 0x81ff }, { 630, 0x0fff }, { 642, 0xfff0 }, + { 654, 0x3fff }, { 668, 0x1ff9 }, { 679, 0x3ffc }, { 691, 0xf87f }, + /* 0x3600 */ + { 703, 0x3fe7 }, { 715, 0xfe7b }, { 728, 0xbfff }, { 743, 0x8fdf }, + { 755, 0xefbf }, { 769, 0x7e2f }, { 780, 0xffbf }, { 795, 0x5fff }, + { 809, 0xfebf }, { 823, 0xf5fd }, { 836, 0x7fff }, { 851, 0xffff }, + { 867, 0xe63e }, { 877, 0x7fff }, { 892, 0xffe6 }, { 905, 0x7fff }, + /* 0x3700 */ + { 920, 0xfffe }, { 935, 0x7fef }, { 949, 0xdfff }, { 964, 0xffff }, + { 980, 0xf5bf }, { 993, 0xfbff }, { 1008, 0xfefd }, { 1022, 0xfff7 }, + { 1037, 0x9fff }, { 1051, 0x9fff }, { 1065, 0xbffe }, { 1079, 0xfeff }, + { 1094, 0xffbb }, { 1108, 0xffdf }, { 1123, 0xbfe5 }, { 1135, 0xff7f }, + /* 0x3800 */ + { 1150, 0xfff7 }, { 1165, 0x3fff }, { 1179, 0xe7e7 }, { 1191, 0xfff6 }, + { 1205, 0xdfff }, { 1220, 0xffff }, { 1236, 0xefed }, { 1249, 0xffff }, + { 1265, 0xff7f }, { 1280, 0xffff }, { 1296, 0xd7eb }, { 1308, 0x7d7d }, + { 1320, 0xfbff }, { 1335, 0xff1f }, { 1348, 0xb87d }, { 1358, 0xfce7 }, + /* 0x3900 */ + { 1370, 0xfffe }, { 1385, 0xfeff }, { 1400, 0xd7ff }, { 1414, 0xcfff }, + { 1428, 0xffff }, { 1444, 0xfc7f }, { 1457, 0xfbff }, { 1472, 0xf7ff }, + { 1487, 0xfeff }, { 1502, 0xfdff }, { 1517, 0xffff }, { 1533, 0xfff5 }, + { 1547, 0x7fff }, { 1562, 0x47fc }, { 1572, 0xfffe }, { 1587, 0xfffe }, + /* 0x3a00 */ + { 1602, 0xffff }, { 1618, 0xfeff }, { 1633, 0xe7ff }, { 1647, 0xffff }, + { 1663, 0x7ff9 }, { 1676, 0x7ffd }, { 1690, 0xbfff }, { 1705, 0xfeff }, + { 1720, 0xfbb7 }, { 1733, 0xf46e }, { 1743, 0xfb7f }, { 1757, 0xdff3 }, + { 1770, 0xec3f }, { 1781, 0xffbf }, { 1796, 0xdef3 }, { 1808, 0x3fff }, + /* 0x3b00 */ + { 1822, 0xfffe }, { 1837, 0x7fbd }, { 1850, 0xfeef }, { 1864, 0x9b7f }, + { 1876, 0x1f9e }, { 1886, 0xff3e }, { 1899, 0xff07 }, { 1910, 0xff07 }, + { 1921, 0xf9ff }, { 1935, 0xffff }, { 1951, 0xfffa }, { 1965, 0x97ff }, + { 1978, 0xffff }, { 1994, 0xfff9 }, { 2008, 0xfc7f }, { 2021, 0xcfff }, + /* 0x3c00 */ + { 2035, 0xffff }, { 2051, 0xeff7 }, { 2065, 0xffff }, { 2081, 0xfeff }, + { 2096, 0xffff }, { 2112, 0xdff4 }, { 2124, 0xbdff }, { 2138, 0xff7f }, + { 2153, 0xffff }, { 2169, 0xfffe }, { 2184, 0xbdff }, { 2198, 0x7fff }, + { 2213, 0xfdff }, { 2228, 0xffcf }, { 2242, 0x7ff0 }, { 2253, 0xfff8 }, + /* 0x3d00 */ + { 2266, 0xc7ff }, { 2279, 0x7fff }, { 2294, 0xffe3 }, { 2307, 0xf9ff }, + { 2321, 0xfc7f }, { 2334, 0xe3ff }, { 2347, 0xffff }, { 2363, 0xefff }, + { 2378, 0xf1f3 }, { 2389, 0xddfe }, { 2402, 0xfffb }, { 2417, 0xde3d }, + { 2428, 0xefff }, { 2443, 0x8fff }, { 2456, 0xf97f }, { 2469, 0xdbf9 }, + /* 0x3e00 */ + { 2481, 0xff3f }, { 2495, 0xffff }, { 2511, 0xffff }, { 2527, 0x7fef }, + { 2541, 0xfeff }, { 2556, 0xffff }, { 2572, 0xf8ff }, { 2585, 0xfffe }, + { 2600, 0xdfbf }, { 2614, 0xfdff }, { 2629, 0x7ffb }, { 2643, 0xa7bf }, + { 2655, 0x7f9f }, { 2668, 0xe6fe }, { 2680, 0xf98f }, { 2691, 0xffe7 }, + /* 0x3f00 */ + { 2705, 0xfef6 }, { 2718, 0xffff }, { 2734, 0xffff }, { 2750, 0xffff }, + { 2766, 0x7fdf }, { 2780, 0xffef }, { 2795, 0xffff }, { 2811, 0xefb7 }, + { 2824, 0xffff }, { 2840, 0xffff }, { 2856, 0xffff }, { 2872, 0xffc1 }, + { 2883, 0xfffe }, { 2898, 0xffee }, { 2912, 0xfffe }, { 2927, 0xffff }, + /* 0x4000 */ + { 2943, 0xefff }, { 2958, 0xdfff }, { 2973, 0xff9f }, { 2987, 0xffff }, + { 3003, 0xfffe }, { 3018, 0xffbf }, { 3033, 0xfbfd }, { 3047, 0xffff }, + { 3063, 0xf7ff }, { 3078, 0xffff }, { 3094, 0xfeff }, { 3109, 0xffdf }, + { 3124, 0xff87 }, { 3136, 0x7ffe }, { 3150, 0x7eff }, { 3164, 0xefff }, + /* 0x4100 */ + { 3179, 0xfbff }, { 3194, 0xbf3f }, { 3207, 0xfff7 }, { 3222, 0xfdcf }, + { 3235, 0xfdff }, { 3250, 0x7fff }, { 3265, 0xf3ff }, { 3279, 0xffff }, + { 3295, 0xef3f }, { 3308, 0xffff }, { 3324, 0xbfff }, { 3339, 0xffef }, + { 3354, 0xfbef }, { 3368, 0xffff }, { 3384, 0xffff }, { 3400, 0x7fe7 }, + /* 0x4200 */ + { 3413, 0xffff }, { 3429, 0xffff }, { 3445, 0xfcff }, { 3459, 0xffff }, + { 3475, 0xff7f }, { 3490, 0xffff }, { 3506, 0xffef }, { 3521, 0xffff }, + { 3537, 0xefff }, { 3552, 0xffff }, { 3568, 0xfffb }, { 3583, 0xffff }, + { 3599, 0xff1f }, { 3612, 0xdfff }, { 3627, 0xffff }, { 3643, 0xffff }, + /* 0x4300 */ + { 3659, 0xf7ff }, { 3674, 0xffff }, { 3690, 0xffff }, { 3706, 0x003f }, + { 3712, 0xfffc }, { 3726, 0xffff }, { 3742, 0xfffe }, { 3757, 0xffff }, + { 3773, 0xffff }, { 3789, 0xb7ff }, { 3803, 0xefdf }, { 3817, 0xffff }, + { 3833, 0xffff }, { 3849, 0xdfff }, { 3864, 0x9fff }, { 3878, 0xffff }, + /* 0x4400 */ + { 3894, 0xffbf }, { 3909, 0xffff }, { 3925, 0xfbff }, { 3940, 0xffff }, + { 3956, 0xffff }, { 3972, 0xffbf }, { 3987, 0xbdff }, { 4001, 0xbe7f }, + { 4014, 0xff7f }, { 4029, 0xfdfd }, { 4043, 0x3fff }, { 4057, 0x3fff }, + { 4071, 0xfffe }, { 4086, 0xff8f }, { 4099, 0xe4ff }, { 4111, 0xf7ff }, + /* 0x4500 */ + { 4126, 0xffff }, { 4142, 0xffff }, { 4158, 0xffff }, { 4174, 0xffff }, + { 4190, 0xfffb }, { 4205, 0xfffe }, { 4220, 0xfff7 }, { 4235, 0xffbf }, + { 4250, 0xffff }, { 4266, 0xffff }, { 4282, 0xefff }, { 4297, 0xbfff }, + { 4312, 0xffff }, { 4328, 0xffbf }, { 4343, 0xdfff }, { 4358, 0xf7f7 }, + /* 0x4600 */ + { 4372, 0xffff }, { 4388, 0xb7ff }, { 4402, 0xffff }, { 4418, 0xfffb }, + { 4433, 0xc3ff }, { 4445, 0xfff7 }, { 4460, 0xf7ff }, { 4475, 0xf7bf }, + { 4489, 0xffff }, { 4505, 0xffdf }, { 4520, 0xefef }, { 4534, 0xffff }, + { 4550, 0xffff }, { 4566, 0xfff7 }, { 4581, 0xffff }, { 4597, 0xffff }, + /* 0x4700 */ + { 4613, 0xffff }, { 4629, 0xffff }, { 4645, 0xfc07 }, { 4654, 0xfff7 }, + { 4669, 0xffff }, { 4685, 0xf5ff }, { 4699, 0xffff }, { 4715, 0xefff }, + { 4730, 0x0fff }, { 4742, 0xfffe }, { 4757, 0xffff }, { 4773, 0xfffb }, + { 4788, 0xffff }, { 4804, 0xffff }, { 4820, 0xffff }, { 4836, 0xfffb }, + /* 0x4800 */ + { 4851, 0xefff }, { 4866, 0xffbf }, { 4881, 0xffff }, { 4897, 0xfbff }, + { 4912, 0xffff }, { 4928, 0xffff }, { 4944, 0xffff }, { 4960, 0xf7fd }, + { 4974, 0x7ff8 }, { 4986, 0xfe7f }, { 5000, 0xfff7 }, { 5015, 0xfbff }, + { 5030, 0xfdff }, { 5045, 0xfffb }, { 5060, 0xffbf }, { 5075, 0xfff7 }, + /* 0x4900 */ + { 5090, 0xfffe }, { 5105, 0xffff }, { 5121, 0xfdf7 }, { 5135, 0xfffb }, + { 5150, 0xff7f }, { 5165, 0xefff }, { 5180, 0xffff }, { 5196, 0x01ff }, + { 5205, 0xff80 }, { 5214, 0xf7ff }, { 5229, 0xfdff }, { 5244, 0x3e3e }, + { 5254, 0x7efe }, { 5267, 0xffff }, { 5283, 0xd5ff }, { 5296, 0xffff }, + /* 0x4a00 */ + { 5312, 0xffff }, { 5328, 0xfbff }, { 5343, 0xffff }, { 5359, 0xffff }, + { 5375, 0xbfef }, { 5389, 0xffff }, { 5405, 0xffff }, { 5421, 0xffff }, + { 5437, 0xffff }, { 5453, 0x7fff }, { 5468, 0xfbff }, { 5483, 0xffff }, + { 5499, 0xffff }, { 5515, 0xffff }, { 5531, 0xffff }, { 5547, 0xffff }, + /* 0x4b00 */ + { 5563, 0xffff }, { 5579, 0xffff }, { 5595, 0xffff }, { 5611, 0xffff }, + { 5627, 0x7fff }, { 5642, 0xefff }, { 5657, 0xfbff }, { 5672, 0xffff }, + { 5688, 0xffff }, { 5704, 0xffff }, { 5720, 0xffff }, { 5736, 0xffff }, + { 5752, 0xffc7 }, { 5765, 0xffff }, { 5781, 0xfdff }, { 5796, 0xf7ff }, + /* 0x4c00 */ + { 5811, 0xff7f }, { 5826, 0xffff }, { 5842, 0xbfff }, { 5857, 0xffb7 }, + { 5871, 0xffff }, { 5887, 0xffff }, { 5903, 0xfbff }, { 5918, 0xffef }, + { 5933, 0xff7f }, { 5948, 0x1eff }, { 5960, 0xffe0 }, { 5971, 0xffbf }, + { 5986, 0xffff }, { 6002, 0xffff }, { 6018, 0xffff }, { 6034, 0xfdff }, + /* 0x4d00 */ + { 6049, 0xffff }, { 6065, 0xfc07 }, { 6074, 0xfeff }, { 6089, 0xffff }, + { 6105, 0xffff }, { 6121, 0xffff }, { 6137, 0xffff }, { 6153, 0xffff }, + { 6169, 0xffff }, { 6185, 0xffff }, { 6201, 0x9fff }, { 6215, 0x003b }, + { 6220, 0x0000 }, { 6220, 0x0000 }, { 6220, 0x0000 }, { 6220, 0x0000 }, + /* 0x4e00 */ + { 6220, 0xffbf }, { 6235, 0xc3f7 }, { 6246, 0xef5f }, { 6259, 0xbb6f }, + { 6271, 0xebef }, { 6284, 0xf7de }, { 6297, 0x070c }, { 6302, 0xc23a }, + { 6309, 0xfbff }, { 6324, 0xfbfe }, { 6338, 0xf97f }, { 6351, 0x56df }, + { 6362, 0xffff }, { 6378, 0xfff1 }, { 6391, 0xc3ff }, { 6403, 0xffff }, + /* 0x4f00 */ + { 6419, 0xffff }, { 6435, 0x3fff }, { 6449, 0xf304 }, { 6456, 0xffff }, + { 6472, 0xffff }, { 6488, 0xffff }, { 6504, 0xffdf }, { 6519, 0xffff }, + { 6535, 0xffff }, { 6551, 0xffff }, { 6567, 0xc80f }, { 6574, 0xffff }, + { 6590, 0xffff }, { 6606, 0xffff }, { 6622, 0xd2bf }, { 6633, 0xffff }, + /* 0x5000 */ + { 6649, 0xffff }, { 6665, 0xffff }, { 6681, 0xffff }, { 6697, 0x93ff }, + { 6709, 0xffff }, { 6725, 0xffff }, { 6741, 0xffff }, { 6757, 0x3fff }, + { 6771, 0xffff }, { 6787, 0xffff }, { 6803, 0xfc4f }, { 6814, 0xffff }, + { 6830, 0xffff }, { 6846, 0xffff }, { 6862, 0xffff }, { 6878, 0xfffb }, + /* 0x5100 */ + { 6893, 0xffff }, { 6909, 0xffff }, { 6925, 0xffff }, { 6941, 0xffff }, + { 6957, 0xffff }, { 6973, 0xffff }, { 6989, 0x7fff }, { 7004, 0xd3ee }, + { 7015, 0xfffd }, { 7030, 0xe3ff }, { 7043, 0x3f7f }, { 7056, 0xf7ff }, + { 7071, 0xffff }, { 7087, 0xffff }, { 7103, 0x753f }, { 7114, 0x67ff }, + /* 0x5200 */ + { 7127, 0xdfff }, { 7142, 0xf1ff }, { 7155, 0xcfff }, { 7169, 0x7fff }, + { 7184, 0xfffa }, { 7198, 0xfffc }, { 7212, 0xffff }, { 7228, 0xfffd }, + { 7243, 0x7fff }, { 7258, 0xffff }, { 7274, 0xfff9 }, { 7288, 0xfffb }, + { 7303, 0xf7ff }, { 7318, 0xfbff }, { 7333, 0xffff }, { 7349, 0xffff }, + /* 0x5300 */ + { 7365, 0xfffb }, { 7380, 0xffff }, { 7396, 0xbfbf }, { 7410, 0xffff }, + { 7426, 0xffff }, { 7442, 0xffbf }, { 7457, 0xf7fb }, { 7471, 0xffff }, + { 7487, 0xcfdd }, { 7499, 0xffdc }, { 7512, 0xfff3 }, { 7526, 0x6fff }, + { 7540, 0xff3f }, { 7554, 0xfefd }, { 7568, 0xffff }, { 7584, 0xbfff }, + /* 0x5400 */ + { 7599, 0xffff }, { 7615, 0xff6f }, { 7629, 0xffff }, { 7645, 0xffff }, + { 7661, 0xffff }, { 7677, 0xe413 }, { 7684, 0xffff }, { 7700, 0xffff }, + { 7716, 0xffff }, { 7732, 0xd57f }, { 7744, 0xffff }, { 7760, 0xffff }, + { 7776, 0xffff }, { 7792, 0x4441 }, { 7796, 0xffff }, { 7812, 0xffff }, + /* 0x5500 */ + { 7828, 0xffff }, { 7844, 0x0fff }, { 7856, 0xffc3 }, { 7868, 0xffff }, + { 7884, 0xffff }, { 7900, 0xffff }, { 7916, 0x0d7f }, { 7926, 0xfcee }, + { 7938, 0xffff }, { 7954, 0xffff }, { 7970, 0xffff }, { 7986, 0x8c7f }, + { 7996, 0xffff }, { 8012, 0xffff }, { 8028, 0xc7ff }, { 8041, 0xffd7 }, + /* 0x5600 */ + { 8055, 0xffff }, { 8071, 0xfbff }, { 8086, 0xffc5 }, { 8098, 0xffff }, + { 8114, 0xffff }, { 8130, 0xc7ff }, { 8143, 0xffff }, { 8159, 0xefff }, + { 8174, 0xffff }, { 8190, 0xffff }, { 8206, 0xffe1 }, { 8218, 0xffff }, + { 8234, 0xbfff }, { 8249, 0xff9f }, { 8263, 0xfffb }, { 8278, 0xbfcf }, + /* 0x5700 */ + { 8291, 0xffbf }, { 8306, 0xfdff }, { 8321, 0xffbf }, { 8336, 0xf87f }, + { 8348, 0xffff }, { 8364, 0x8bff }, { 8376, 0xfffe }, { 8391, 0xffff }, + { 8407, 0xfd8f }, { 8419, 0xffff }, { 8435, 0x5fff }, { 8449, 0xfff0 }, + { 8461, 0xffff }, { 8477, 0xf8bf }, { 8489, 0xffff }, { 8505, 0xffff }, + /* 0x5800 */ + { 8521, 0xffff }, { 8537, 0xff9d }, { 8550, 0xffff }, { 8566, 0xffff }, + { 8582, 0xffbd }, { 8596, 0xffff }, { 8612, 0xbfff }, { 8627, 0xfffe }, + { 8642, 0xffff }, { 8658, 0xfdff }, { 8673, 0xffff }, { 8689, 0xfcbf }, + { 8702, 0xe7ff }, { 8716, 0xff7f }, { 8731, 0xdbdf }, { 8744, 0xfebf }, + /* 0x5900 */ + { 8758, 0xff7f }, { 8773, 0xbfff }, { 8788, 0xffff }, { 8804, 0xf1ff }, + { 8817, 0xfff9 }, { 8831, 0xffbf }, { 8846, 0xffff }, { 8862, 0xffff }, + { 8878, 0xfe7f }, { 8892, 0xffff }, { 8908, 0xf1ff }, { 8921, 0xffff }, + { 8937, 0xffff }, { 8953, 0xffff }, { 8969, 0xffff }, { 8985, 0xffff }, + /* 0x5a00 */ + { 9001, 0xfe1f }, { 9013, 0xffff }, { 9029, 0xffff }, { 9045, 0xffeb }, + { 9059, 0xffff }, { 9075, 0xffff }, { 9091, 0xffff }, { 9107, 0xffaf }, + { 9121, 0xffff }, { 9137, 0xffff }, { 9153, 0xdfff }, { 9168, 0xffff }, + { 9184, 0xffff }, { 9200, 0xffeb }, { 9214, 0xffff }, { 9230, 0xfff9 }, + /* 0x5b00 */ + { 9244, 0xffff }, { 9260, 0xffff }, { 9276, 0xffff }, { 9292, 0xffbf }, + { 9307, 0xffff }, { 9323, 0xbdff }, { 9337, 0xdfff }, { 9352, 0xffff }, + { 9368, 0xffff }, { 9384, 0xfffd }, { 9399, 0xfbfc }, { 9412, 0xdfff }, + { 9427, 0xfdff }, { 9442, 0xffff }, { 9458, 0xffff }, { 9474, 0xe7ff }, + /* 0x5c00 */ + { 9488, 0xfffb }, { 9503, 0xcfff }, { 9517, 0xbf3f }, { 9530, 0xffeb }, + { 9544, 0xfff3 }, { 9558, 0xffff }, { 9574, 0xffbf }, { 9589, 0x7fbb }, + { 9602, 0xfff3 }, { 9616, 0xf2bf }, { 9628, 0xffff }, { 9644, 0x0fff }, + { 9656, 0xffc3 }, { 9668, 0xffff }, { 9684, 0xff66 }, { 9696, 0xffff }, + /* 0x5d00 */ + { 9712, 0xffc3 }, { 9724, 0xffff }, { 9740, 0xdfff }, { 9755, 0xffff }, + { 9771, 0xffff }, { 9787, 0xcaff }, { 9799, 0xffff }, { 9815, 0xffbf }, + { 9830, 0xffff }, { 9846, 0xffff }, { 9862, 0xffff }, { 9878, 0xffff }, + { 9894, 0xffdf }, { 9909, 0xffff }, { 9925, 0x4bff }, { 9937, 0xefff }, + /* 0x5e00 */ + { 9952, 0x7fdf }, { 9966, 0xeffe }, { 9980, 0xff3f }, { 9994, 0xe7fd }, + { 10007, 0xfdff }, { 10022, 0xffff }, { 10038, 0xffff }, { 10054, 0xffff }, + { 10070, 0xffbf }, { 10085, 0x3fe5 }, { 10096, 0xffff }, { 10112, 0xefff }, + { 10127, 0xffff }, { 10143, 0xffff }, { 10159, 0xffef }, { 10174, 0xffff }, + /* 0x5f00 */ + { 10190, 0xfdff }, { 10205, 0xffbf }, { 10220, 0xfbfe }, { 10234, 0xffff }, + { 10250, 0xffdf }, { 10265, 0x7fff }, { 10280, 0xfeff }, { 10295, 0xf7ff }, + { 10310, 0xffff }, { 10326, 0xffdf }, { 10341, 0xffff }, { 10357, 0xffff }, + { 10373, 0xffbf }, { 10388, 0xffff }, { 10404, 0xffff }, { 10420, 0xffff }, + /* 0x6000 */ + { 10436, 0xff81 }, { 10446, 0xffff }, { 10462, 0xffff }, { 10478, 0x23ff }, + { 10489, 0xffff }, { 10505, 0xffff }, { 10521, 0xffff }, { 10537, 0xd03f }, + { 10546, 0xffff }, { 10562, 0xffff }, { 10578, 0x47ff }, { 10590, 0xffff }, + { 10606, 0xffff }, { 10622, 0xffff }, { 10638, 0x47ff }, { 10650, 0xffff }, + /* 0x6100 */ + { 10666, 0xffff }, { 10682, 0xffff }, { 10698, 0xffaf }, { 10712, 0xffff }, + { 10728, 0xffff }, { 10744, 0xfffd }, { 10759, 0xffff }, { 10775, 0xffff }, + { 10791, 0xffff }, { 10807, 0xffff }, { 10823, 0xffff }, { 10839, 0xffff }, + { 10855, 0xffff }, { 10871, 0xffe9 }, { 10884, 0xffff }, { 10900, 0xffef }, + /* 0x6200 */ + { 10915, 0xf7bf }, { 10929, 0xff7f }, { 10944, 0xffff }, { 10960, 0xffff }, + { 10976, 0xffef }, { 10991, 0xff9f }, { 11005, 0xe1ff }, { 11017, 0xffff }, + { 11033, 0xffff }, { 11049, 0x7fff }, { 11064, 0xfff8 }, { 11077, 0xffff }, + { 11093, 0xffff }, { 11109, 0xffff }, { 11125, 0xfc13 }, { 11134, 0xffff }, + /* 0x6300 */ + { 11150, 0xffff }, { 11166, 0x8aff }, { 11177, 0xff0a }, { 11187, 0xffff }, + { 11203, 0xffff }, { 11219, 0x3fff }, { 11233, 0xfff1 }, { 11246, 0xffff }, + { 11262, 0xffff }, { 11278, 0xffff }, { 11294, 0xffff }, { 11310, 0xe447 }, + { 11318, 0xffff }, { 11334, 0xffff }, { 11350, 0xffff }, { 11366, 0x47ff }, + /* 0x6400 */ + { 11378, 0xffc8 }, { 11389, 0xffff }, { 11405, 0xffff }, { 11421, 0xffff }, + { 11437, 0xfacb }, { 11448, 0xffff }, { 11464, 0xffff }, { 11480, 0xffff }, + { 11496, 0xffef }, { 11511, 0xffff }, { 11527, 0xffff }, { 11543, 0xfa5f }, + { 11555, 0xffff }, { 11571, 0x9fff }, { 11585, 0xffff }, { 11601, 0xffff }, + /* 0x6500 */ + { 11617, 0xffff }, { 11633, 0xfffb }, { 11648, 0xffff }, { 11664, 0xffff }, + { 11680, 0xffff }, { 11696, 0xf7ff }, { 11711, 0xfdff }, { 11726, 0x9fff }, + { 11740, 0x7fbf }, { 11754, 0xfff7 }, { 11769, 0xfdff }, { 11784, 0xffff }, + { 11800, 0xfffe }, { 11815, 0xffdf }, { 11830, 0xffff }, { 11846, 0xfe7f }, + /* 0x6600 */ + { 11860, 0xffff }, { 11876, 0xffff }, { 11892, 0xffff }, { 11908, 0x1fff }, + { 11921, 0xffff }, { 11937, 0xff87 }, { 11949, 0xffff }, { 11965, 0xffff }, + { 11981, 0xfff3 }, { 11995, 0xffff }, { 12011, 0xff7f }, { 12026, 0xffff }, + { 12042, 0xffff }, { 12058, 0xffff }, { 12074, 0xffff }, { 12090, 0xd7ff }, + /* 0x6700 */ + { 12104, 0xffff }, { 12120, 0xffff }, { 12136, 0xfdff }, { 12151, 0xfffe }, + { 12166, 0xfff5 }, { 12180, 0xffff }, { 12196, 0xfc67 }, { 12207, 0xffff }, + { 12223, 0xffff }, { 12239, 0xffff }, { 12255, 0xd05e }, { 12263, 0xffff }, + { 12279, 0xffff }, { 12295, 0xffff }, { 12311, 0xffff }, { 12327, 0xdfff }, + /* 0x6800 */ + { 12342, 0x0073 }, { 12347, 0xffff }, { 12363, 0xffff }, { 12379, 0xffff }, + { 12395, 0xffff }, { 12411, 0x47ff }, { 12423, 0xf800 }, { 12428, 0xffff }, + { 12444, 0xdfff }, { 12459, 0xffff }, { 12475, 0xffff }, { 12491, 0x23ff }, + { 12502, 0xfffa }, { 12516, 0xffff }, { 12532, 0xffff }, { 12548, 0xffff }, + /* 0x6900 */ + { 12564, 0xffff }, { 12580, 0x59ff }, { 12592, 0xdea0 }, { 12600, 0xffff }, + { 12616, 0xffff }, { 12632, 0xffff }, { 12648, 0xffff }, { 12664, 0xbfff }, + { 12679, 0xf46d }, { 12689, 0xffff }, { 12705, 0xffff }, { 12721, 0xffff }, + { 12737, 0xffff }, { 12753, 0x03ff }, { 12763, 0xfffe }, { 12778, 0xffff }, + /* 0x6a00 */ + { 12794, 0xffff }, { 12810, 0xffff }, { 12826, 0x3fff }, { 12840, 0xfffc }, + { 12854, 0xffff }, { 12870, 0xffff }, { 12886, 0xffff }, { 12902, 0xe5c7 }, + { 12912, 0xffff }, { 12928, 0xffff }, { 12944, 0xfdff }, { 12959, 0xffff }, + { 12975, 0xfdff }, { 12990, 0xffff }, { 13006, 0xffef }, { 13021, 0xff7f }, + /* 0x6b00 */ + { 13036, 0xffdf }, { 13051, 0x7fff }, { 13066, 0xffff }, { 13082, 0xffff }, + { 13098, 0xffff }, { 13114, 0xffff }, { 13130, 0xffff }, { 13146, 0xefff }, + { 13161, 0xff7f }, { 13176, 0xfbf3 }, { 13189, 0xffff }, { 13205, 0xfffd }, + { 13220, 0xfffb }, { 13235, 0x7ddf }, { 13248, 0xbfff }, { 13263, 0xffff }, + /* 0x6c00 */ + { 13279, 0xbf7f }, { 13293, 0xff7f }, { 13308, 0xfdfb }, { 13322, 0xdbdf }, + { 13335, 0xfe7f }, { 13349, 0xffff }, { 13365, 0xffef }, { 13380, 0xffff }, + { 13396, 0xffff }, { 13412, 0xffff }, { 13428, 0xfc0f }, { 13438, 0xffff }, + { 13454, 0xffff }, { 13470, 0xffff }, { 13486, 0xffff }, { 13502, 0x823f }, + /* 0x6d00 */ + { 13510, 0xffff }, { 13526, 0xffff }, { 13542, 0xffff }, { 13558, 0xffff }, + { 13574, 0x003f }, { 13580, 0xffc0 }, { 13590, 0xffff }, { 13606, 0xffff }, + { 13622, 0xffff }, { 13638, 0x0fff }, { 13650, 0xfc20 }, { 13657, 0xffff }, + { 13673, 0xffff }, { 13689, 0xffff }, { 13705, 0xffff }, { 13721, 0xffff }, + /* 0x6e00 */ + { 13737, 0x9fff }, { 13751, 0xffa4 }, { 13762, 0xffff }, { 13778, 0xffff }, + { 13794, 0xffff }, { 13810, 0xffff }, { 13826, 0xffff }, { 13842, 0x7fff }, + { 13857, 0xef55 }, { 13868, 0xffff }, { 13884, 0xffff }, { 13900, 0xffff }, + { 13916, 0xffff }, { 13932, 0x3fff }, { 13946, 0xfb48 }, { 13955, 0xffff }, + /* 0x6f00 */ + { 13971, 0xffff }, { 13987, 0xffff }, { 14003, 0xffff }, { 14019, 0xffff }, + { 14035, 0xd77f }, { 14048, 0xffff }, { 14064, 0xffff }, { 14080, 0xffff }, + { 14096, 0xffff }, { 14112, 0xe7ff }, { 14126, 0xffff }, { 14142, 0xffff }, + { 14158, 0xffff }, { 14174, 0xfff9 }, { 14188, 0xffff }, { 14204, 0xfdff }, + /* 0x7000 */ + { 14219, 0xffff }, { 14235, 0xffff }, { 14251, 0xffff }, { 14267, 0xffff }, + { 14283, 0x3fff }, { 14297, 0xfffe }, { 14312, 0xdfff }, { 14327, 0xffff }, + { 14343, 0xfffe }, { 14358, 0x8fff }, { 14371, 0xffff }, { 14387, 0xcfff }, + { 14401, 0xfff1 }, { 14414, 0xffff }, { 14430, 0xc43f }, { 14439, 0xffff }, + /* 0x7100 */ + { 14455, 0xffff }, { 14471, 0xfe8f }, { 14483, 0xffff }, { 14499, 0xafff }, + { 14513, 0xfffe }, { 14528, 0xffdf }, { 14543, 0xffff }, { 14559, 0xfff7 }, + { 14574, 0xffff }, { 14590, 0xffff }, { 14606, 0xffff }, { 14622, 0xffff }, + { 14638, 0xffff }, { 14654, 0xffff }, { 14670, 0xffff }, { 14686, 0xff3f }, + /* 0x7200 */ + { 14700, 0xffff }, { 14716, 0xffff }, { 14732, 0xffff }, { 14748, 0xff75 }, + { 14761, 0xdfff }, { 14776, 0xefff }, { 14791, 0xffff }, { 14807, 0xffdf }, + { 14822, 0xfbff }, { 14837, 0xffff }, { 14853, 0xfffe }, { 14868, 0xfe7f }, + { 14882, 0xfeff }, { 14897, 0xbfff }, { 14912, 0x3fff }, { 14926, 0xfff8 }, + /* 0x7300 */ + { 14939, 0xfff7 }, { 14954, 0x7fff }, { 14969, 0xfffc }, { 14983, 0xfdff }, + { 14998, 0xffff }, { 15014, 0xffff }, { 15030, 0xdfe7 }, { 15043, 0xffff }, + { 15059, 0xffff }, { 15075, 0xf1ff }, { 15088, 0xbfff }, { 15103, 0xfffc }, + { 15117, 0xffff }, { 15133, 0xfffd }, { 15148, 0xffff }, { 15164, 0xfff8 }, + /* 0x7400 */ + { 15177, 0x3fff }, { 15191, 0xfffc }, { 15205, 0xffff }, { 15221, 0xff7f }, + { 15236, 0xffff }, { 15252, 0xffff }, { 15268, 0xffff }, { 15284, 0xff7f }, + { 15299, 0xbfff }, { 15314, 0xffff }, { 15330, 0xffff }, { 15346, 0xffff }, + { 15362, 0xffff }, { 15378, 0xfffb }, { 15393, 0xff7f }, { 15408, 0xeff8 }, + /* 0x7500 */ + { 15420, 0xffdf }, { 15435, 0xfdff }, { 15450, 0xffff }, { 15466, 0xefcf }, + { 15479, 0xffdf }, { 15494, 0xfffb }, { 15509, 0xfdfe }, { 15523, 0xffe7 }, + { 15537, 0xdffb }, { 15551, 0x7f3f }, { 15564, 0x0ffc }, { 15574, 0xffff }, + { 15590, 0xfcff }, { 15604, 0xffbf }, { 15619, 0xf0ff }, { 15631, 0xffff }, + /* 0x7600 */ + { 15647, 0xff8f }, { 15660, 0xfe7f }, { 15674, 0xf3ff }, { 15688, 0x3fff }, + { 15702, 0xdfff }, { 15717, 0x9fff }, { 15731, 0xf7b7 }, { 15744, 0xfbff }, + { 15759, 0xffff }, { 15775, 0xfffd }, { 15790, 0xffff }, { 15806, 0xfff9 }, + { 15820, 0x7fff }, { 15835, 0xfffc }, { 15849, 0xffff }, { 15865, 0xffff }, + /* 0x7700 */ + { 15881, 0xcfff }, { 15895, 0xffff }, { 15911, 0xefff }, { 15926, 0xffff }, + { 15942, 0xffff }, { 15958, 0xfffc }, { 15972, 0xffff }, { 15988, 0xffff }, + { 16004, 0xffbf }, { 16019, 0xfff3 }, { 16033, 0xffff }, { 16049, 0xffff }, + { 16065, 0xf6ff }, { 16079, 0xffff }, { 16095, 0xf7ff }, { 16110, 0x7fff }, + /* 0x7800 */ + { 16125, 0xfffc }, { 16139, 0xeb3f }, { 16151, 0xffff }, { 16167, 0x21ff }, + { 16177, 0xfffc }, { 16191, 0xf11f }, { 16201, 0xffff }, { 16217, 0xff43 }, + { 16228, 0xffff }, { 16244, 0xf7ff }, { 16259, 0xffff }, { 16275, 0xff9f }, + { 16289, 0xffff }, { 16305, 0xfd7f }, { 16319, 0xffff }, { 16335, 0xffdf }, + /* 0x7900 */ + { 16350, 0xfff7 }, { 16365, 0xffbf }, { 16380, 0xffff }, { 16396, 0xf7e7 }, + { 16409, 0xbff7 }, { 16423, 0xffff }, { 16439, 0x7fff }, { 16454, 0xfeff }, + { 16469, 0xffdf }, { 16484, 0xffff }, { 16500, 0xffff }, { 16516, 0xffff }, + { 16532, 0xffff }, { 16548, 0xffff }, { 16564, 0x7fff }, { 16579, 0x9fef }, + /* 0x7a00 */ + { 16592, 0xffff }, { 16608, 0xffff }, { 16624, 0xffe7 }, { 16638, 0xffff }, + { 16654, 0xfff7 }, { 16669, 0x9ff9 }, { 16681, 0xfff7 }, { 16696, 0xff7f }, + { 16711, 0x9fff }, { 16725, 0xcfff }, { 16739, 0xdf9f }, { 16752, 0xffff }, + { 16768, 0xfff7 }, { 16783, 0xbfbf }, { 16797, 0xffff }, { 16813, 0xffff }, + /* 0x7b00 */ + { 16829, 0xff73 }, { 16842, 0xffdf }, { 16857, 0xffff }, { 16873, 0xabff }, + { 16886, 0xffff }, { 16902, 0xc3ff }, { 16914, 0xffff }, { 16930, 0x0bff }, + { 16941, 0xfffe }, { 16956, 0xfbff }, { 16971, 0xf03f }, { 16981, 0xffff }, + { 16997, 0x7fff }, { 17012, 0xfff1 }, { 17025, 0x3fff }, { 17039, 0xffff }, + /* 0x7c00 */ + { 17055, 0xffff }, { 17071, 0xff37 }, { 17084, 0xffff }, { 17100, 0xfffd }, + { 17115, 0xfffd }, { 17130, 0xffff }, { 17146, 0xfffd }, { 17161, 0xffff }, + { 17177, 0x7ffb }, { 17191, 0xfffe }, { 17206, 0xdbff }, { 17220, 0xffff }, + { 17236, 0xffff }, { 17252, 0xfeff }, { 17267, 0xffff }, { 17283, 0xfdff }, + /* 0x7d00 */ + { 17298, 0xffff }, { 17314, 0xffff }, { 17330, 0xff3f }, { 17344, 0xffff }, + { 17360, 0xffff }, { 17376, 0xffff }, { 17392, 0xffff }, { 17408, 0xff7f }, + { 17423, 0xffff }, { 17439, 0xf3ff }, { 17453, 0xffff }, { 17469, 0xffff }, + { 17485, 0xffff }, { 17501, 0xffcf }, { 17515, 0xffff }, { 17531, 0xffff }, + /* 0x7e00 */ + { 17547, 0xff9f }, { 17561, 0xffff }, { 17577, 0xfeff }, { 17592, 0xffff }, + { 17608, 0xf3ff }, { 17622, 0xffff }, { 17638, 0xff7f }, { 17653, 0xffff }, + { 17669, 0xfff7 }, { 17684, 0x7ffe }, { 17698, 0x0000 }, { 17698, 0x0000 }, + { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, + /* 0x7f00 */ + { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0xffc0 }, + { 17708, 0xfdfb }, { 17722, 0xfbb7 }, { 17735, 0xffff }, { 17751, 0xffef }, + { 17766, 0xfffd }, { 17781, 0x7fff }, { 17796, 0xfbff }, { 17811, 0xffff }, + { 17827, 0xffff }, { 17843, 0xf8ff }, { 17856, 0xffff }, { 17872, 0xffff }, + /* 0x8000 */ + { 17888, 0xffff }, { 17904, 0xffff }, { 17920, 0xff7b }, { 17934, 0xffff }, + { 17950, 0xc7fb }, { 17962, 0xffef }, { 17977, 0xfdfb }, { 17991, 0xffff }, + { 18007, 0xfff6 }, { 18021, 0xffff }, { 18037, 0xfffe }, { 18052, 0x0fff }, + { 18064, 0xfffc }, { 18078, 0xffff }, { 18094, 0xe07f }, { 18104, 0xffff }, + /* 0x8100 */ + { 18120, 0x07ff }, { 18131, 0xfff0 }, { 18143, 0xffff }, { 18159, 0xfe13 }, + { 18169, 0xffff }, { 18185, 0xf93f }, { 18197, 0xffff }, { 18213, 0xa7ff }, + { 18226, 0xffff }, { 18242, 0xfffd }, { 18257, 0xffcf }, { 18271, 0xffbf }, + { 18286, 0xffff }, { 18302, 0xeff7 }, { 18316, 0xffff }, { 18332, 0xffff }, + /* 0x8200 */ + { 18348, 0xffbf }, { 18363, 0xff7f }, { 18378, 0xbff7 }, { 18392, 0xb7fc }, + { 18404, 0xdfff }, { 18419, 0xdfef }, { 18433, 0xfffe }, { 18448, 0xfbfe }, + { 18462, 0xfefb }, { 18476, 0xff7f }, { 18491, 0xffff }, { 18507, 0xffff }, + { 18523, 0x063f }, { 18531, 0xffff }, { 18547, 0xffff }, { 18563, 0xffff }, + /* 0x8300 */ + { 18579, 0x7fff }, { 18594, 0xffc5 }, { 18606, 0xffff }, { 18622, 0xffff }, + { 18638, 0xffff }, { 18654, 0x01ff }, { 18663, 0x000c }, { 18665, 0xffff }, + { 18681, 0xffff }, { 18697, 0xffff }, { 18713, 0xffff }, { 18729, 0xe281 }, + { 18735, 0xffff }, { 18751, 0xffff }, { 18767, 0xffff }, { 18783, 0xffff }, + /* 0x8400 */ + { 18799, 0xffff }, { 18815, 0xc9ff }, { 18827, 0xfe0a }, { 18836, 0xffff }, + { 18852, 0xffff }, { 18868, 0xffff }, { 18884, 0xffff }, { 18900, 0xffff }, + { 18916, 0xe15f }, { 18926, 0xffff }, { 18942, 0xffff }, { 18958, 0xffff }, + { 18974, 0xffff }, { 18990, 0x4dff }, { 19002, 0xff96 }, { 19014, 0xffff }, + /* 0x8500 */ + { 19030, 0xffff }, { 19046, 0xffff }, { 19062, 0xffff }, { 19078, 0xe93f }, + { 19089, 0xffff }, { 19105, 0xffff }, { 19121, 0xffff }, { 19137, 0xffeb }, + { 19151, 0xffff }, { 19167, 0xffff }, { 19183, 0x9fff }, { 19197, 0xffff }, + { 19213, 0xffff }, { 19229, 0xfff7 }, { 19244, 0xffff }, { 19260, 0xffff }, + /* 0x8600 */ + { 19276, 0xffff }, { 19292, 0xffeb }, { 19306, 0xffff }, { 19322, 0xfffe }, + { 19337, 0x7fef }, { 19351, 0xffff }, { 19367, 0xffff }, { 19383, 0x7fff }, + { 19398, 0xfff0 }, { 19410, 0xffff }, { 19426, 0xe7ff }, { 19440, 0xffff }, + { 19456, 0x9fff }, { 19470, 0xffff }, { 19486, 0x7fff }, { 19501, 0xffe0 }, + /* 0x8700 */ + { 19512, 0xffff }, { 19528, 0xff7f }, { 19543, 0xffff }, { 19559, 0xffff }, + { 19575, 0xf4ff }, { 19588, 0xffff }, { 19604, 0xffff }, { 19620, 0x3fff }, + { 19634, 0xfffe }, { 19649, 0xffff }, { 19665, 0xfe3f }, { 19678, 0xffff }, + { 19694, 0x7fff }, { 19709, 0xfffe }, { 19724, 0xffff }, { 19740, 0xffff }, + /* 0x8800 */ + { 19756, 0xffff }, { 19772, 0xffff }, { 19788, 0xffff }, { 19804, 0xffff }, + { 19820, 0xffff }, { 19836, 0xffef }, { 19851, 0xefcf }, { 19864, 0xffff }, + { 19880, 0xff9f }, { 19894, 0xffff }, { 19910, 0x1fff }, { 19923, 0xfffe }, + { 19938, 0xfe07 }, { 19948, 0xffff }, { 19964, 0xffc3 }, { 19976, 0xffff }, + /* 0x8900 */ + { 19992, 0xffef }, { 20007, 0xcfff }, { 20021, 0xffff }, { 20037, 0xffef }, + { 20052, 0xff5f }, { 20066, 0xffdf }, { 20081, 0xfeff }, { 20096, 0xffff }, + { 20112, 0xfffe }, { 20127, 0xffff }, { 20143, 0xffff }, { 20159, 0xffff }, + { 20175, 0x0001 }, { 20176, 0xbffc }, { 20189, 0x7fff }, { 20204, 0xffff }, + /* 0x8a00 */ + { 20220, 0xfffd }, { 20235, 0xfbff }, { 20250, 0xffff }, { 20266, 0xfff7 }, + { 20281, 0xffff }, { 20297, 0x7fff }, { 20312, 0xffff }, { 20328, 0xffff }, + { 20344, 0xf9ff }, { 20358, 0xffff }, { 20374, 0xbfff }, { 20389, 0xffff }, + { 20405, 0xffff }, { 20421, 0xfbff }, { 20436, 0xffff }, { 20452, 0xffff }, + /* 0x8b00 */ + { 20468, 0xffff }, { 20484, 0xffff }, { 20500, 0xfffd }, { 20515, 0xffff }, + { 20531, 0xffff }, { 20547, 0xf7ff }, { 20562, 0xffff }, { 20578, 0xfffb }, + { 20593, 0x7fff }, { 20608, 0xffff }, { 20624, 0x0000 }, { 20624, 0x0000 }, + { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, + /* 0x8c00 */ + { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0xff80 }, + { 20633, 0xffff }, { 20649, 0xffff }, { 20665, 0xbfff }, { 20680, 0xffff }, + { 20696, 0xffff }, { 20712, 0xffff }, { 20728, 0xffff }, { 20744, 0xffff }, + { 20760, 0xbfff }, { 20775, 0xffff }, { 20791, 0xffff }, { 20807, 0xffff }, + /* 0x8d00 */ + { 20823, 0xffff }, { 20839, 0x1fff }, { 20852, 0x0000 }, { 20852, 0x0000 }, + { 20852, 0x0000 }, { 20852, 0x0000 }, { 20852, 0xfbf0 }, { 20863, 0xffdf }, + { 20878, 0xffff }, { 20894, 0xffff }, { 20910, 0xffff }, { 20926, 0xfefd }, + { 20940, 0xffef }, { 20955, 0xbfff }, { 20970, 0xffdf }, { 20985, 0xf41f }, + /* 0x8e00 */ + { 20995, 0xafff }, { 21009, 0xffff }, { 21025, 0x4fff }, { 21038, 0xffff }, + { 21054, 0xffff }, { 21070, 0xfffb }, { 21085, 0xffff }, { 21101, 0x1fff }, + { 21114, 0x7ffe }, { 21128, 0xe7ff }, { 21142, 0xffff }, { 21158, 0xf7df }, + { 21172, 0xfedf }, { 21186, 0xffff }, { 21202, 0xfff3 }, { 21216, 0xffff }, + /* 0x8f00 */ + { 21232, 0xefff }, { 21247, 0xffff }, { 21263, 0xffff }, { 21279, 0xffff }, + { 21295, 0xefff }, { 21310, 0xffff }, { 21326, 0x003f }, { 21332, 0x0000 }, + { 21332, 0x0000 }, { 21332, 0xf800 }, { 21337, 0xf5ff }, { 21351, 0xdbff }, + { 21365, 0xffff }, { 21381, 0x93ff }, { 21393, 0xffff }, { 21409, 0xfff3 }, + /* 0x9000 */ + { 21423, 0xfbff }, { 21438, 0xffff }, { 21454, 0xff3f }, { 21468, 0xfdff }, + { 21483, 0xffff }, { 21499, 0xff3f }, { 21513, 0xffdf }, { 21528, 0xffff }, + { 21544, 0xffff }, { 21560, 0xdfff }, { 21575, 0xefff }, { 21590, 0xf3ff }, + { 21604, 0x7fff }, { 21619, 0xfff4 }, { 21632, 0xff3f }, { 21646, 0xfeff }, + /* 0x9100 */ + { 21661, 0xffff }, { 21677, 0xffff }, { 21693, 0xffff }, { 21709, 0xffff }, + { 21725, 0xfffb }, { 21740, 0x97ff }, { 21753, 0xffbf }, { 21768, 0x1ffd }, + { 21780, 0xffff }, { 21796, 0xff7f }, { 21811, 0xffef }, { 21826, 0xfeff }, + { 21841, 0xfaff }, { 21855, 0xfffb }, { 21870, 0xfffd }, { 21885, 0xe3ff }, + /* 0x9200 */ + { 21898, 0xffff }, { 21914, 0xffff }, { 21930, 0xe8ff }, { 21942, 0xffff }, + { 21958, 0xffff }, { 21974, 0xffff }, { 21990, 0xffff }, { 22006, 0xfffd }, + { 22021, 0xffff }, { 22037, 0xffff }, { 22053, 0xffff }, { 22069, 0xffff }, + { 22085, 0xffff }, { 22101, 0xffff }, { 22117, 0xffff }, { 22133, 0xffff }, + /* 0x9300 */ + { 22149, 0xffff }, { 22165, 0xffff }, { 22181, 0xffff }, { 22197, 0xbfff }, + { 22212, 0xffed }, { 22226, 0xffff }, { 22242, 0xffff }, { 22258, 0xffff }, + { 22274, 0xffff }, { 22290, 0xffff }, { 22306, 0xffff }, { 22322, 0xfbff }, + { 22337, 0xffff }, { 22353, 0xffff }, { 22369, 0xffff }, { 22385, 0xfffe }, + /* 0x9400 */ + { 22400, 0xffff }, { 22416, 0xffff }, { 22432, 0xffbd }, { 22446, 0xffff }, + { 22462, 0xfffd }, { 22477, 0xfff7 }, { 22492, 0xffff }, { 22508, 0xffff }, + { 22524, 0x001f }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, + { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, + /* 0x9500 */ + { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, + { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x7f80 }, + { 22537, 0xfbff }, { 22552, 0xffff }, { 22568, 0xfbff }, { 22583, 0xffff }, + { 22599, 0x7fff }, { 22614, 0xffff }, { 22630, 0x00ff }, { 22638, 0x0020 }, + /* 0x9600 */ + { 22639, 0x0000 }, { 22639, 0x7000 }, { 22642, 0xffff }, { 22658, 0xff9f }, + { 22672, 0xfc1f }, { 22683, 0xffff }, { 22699, 0xfc1f }, { 22710, 0xfbff }, + { 22725, 0xffff }, { 22741, 0xfffe }, { 22756, 0xffff }, { 22772, 0xffff }, + { 22788, 0xffff }, { 22804, 0xffff }, { 22820, 0xfffe }, { 22835, 0xbff7 }, + /* 0x9700 */ + { 22849, 0xfffd }, { 22864, 0xffff }, { 22880, 0xdfff }, { 22895, 0xffff }, + { 22911, 0x2fff }, { 22924, 0xffe7 }, { 22938, 0xffdf }, { 22953, 0xfffd }, + { 22968, 0xffbf }, { 22983, 0xfff8 }, { 22996, 0x7fff }, { 23011, 0xffff }, + { 23027, 0xffff }, { 23043, 0xffff }, { 23059, 0xe03f }, { 23068, 0xffff }, + /* 0x9800 */ + { 23084, 0xffff }, { 23100, 0xffff }, { 23116, 0xefff }, { 23131, 0xffff }, + { 23147, 0xffff }, { 23163, 0xffff }, { 23179, 0xffff }, { 23195, 0x001f }, + { 23200, 0x0000 }, { 23200, 0x0000 }, { 23200, 0xfb00 }, { 23207, 0xffef }, + { 23222, 0x3fdf }, { 23235, 0xb800 }, { 23239, 0xbefe }, { 23252, 0xffff }, + /* 0x9900 */ + { 23268, 0x5fff }, { 23282, 0xffff }, { 23298, 0xffff }, { 23314, 0xffff }, + { 23330, 0xffff }, { 23346, 0xffff }, { 23362, 0x0003 }, { 23364, 0x0000 }, + { 23364, 0x0000 }, { 23364, 0xffc0 }, { 23374, 0xffff }, { 23390, 0xffff }, + { 23406, 0xffdf }, { 23421, 0xffff }, { 23437, 0xffff }, { 23453, 0xfffb }, + /* 0x9a00 */ + { 23468, 0xffff }, { 23484, 0xfff3 }, { 23498, 0xfeff }, { 23513, 0xffff }, + { 23529, 0xffff }, { 23545, 0xffff }, { 23561, 0x0fff }, { 23573, 0x0000 }, + { 23573, 0x0000 }, { 23573, 0x0000 }, { 23573, 0xff00 }, { 23581, 0xffff }, + { 23597, 0xe7df }, { 23610, 0xffff }, { 23626, 0xffff }, { 23642, 0xffff }, + /* 0x9b00 */ + { 23658, 0xffff }, { 23674, 0xfff7 }, { 23689, 0xffff }, { 23705, 0xffbf }, + { 23720, 0xff7f }, { 23735, 0xbfff }, { 23750, 0xffff }, { 23766, 0xfeff }, + { 23781, 0xffff }, { 23797, 0xff7f }, { 23812, 0xffff }, { 23828, 0xffeb }, + { 23842, 0xbfff }, { 23857, 0xfffc }, { 23871, 0xffff }, { 23887, 0xffd9 }, + /* 0x9c00 */ + { 23900, 0xffff }, { 23916, 0xf8ff }, { 23929, 0xffff }, { 23945, 0xfffe }, + { 23960, 0xffff }, { 23976, 0xe3ff }, { 23989, 0xf1ff }, { 24002, 0x0ffe }, + { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, + { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0xffe0 }, { 24024, 0xfffe }, + /* 0x9d00 */ + { 24039, 0xbfff }, { 24054, 0xffff }, { 24070, 0xe7ff }, { 24084, 0xffff }, + { 24100, 0xfebf }, { 24114, 0xffff }, { 24130, 0xffdf }, { 24145, 0xffff }, + { 24161, 0x1fff }, { 24174, 0xffff }, { 24190, 0xf7ff }, { 24205, 0xffff }, + { 24221, 0xffbf }, { 24236, 0xffff }, { 24252, 0xffff }, { 24268, 0xffff }, + /* 0x9e00 */ + { 24284, 0xffff }, { 24300, 0x7fff }, { 24315, 0x0000 }, { 24315, 0x0000 }, + { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0xbee0 }, + { 24324, 0xffff }, { 24340, 0xffff }, { 24356, 0xffff }, { 24372, 0xf8ff }, + { 24385, 0xfdff }, { 24400, 0xffff }, { 24416, 0xf9fd }, { 24429, 0xffff }, + /* 0x9f00 */ + { 24445, 0xc7ff }, { 24458, 0xffff }, { 24474, 0xfffd }, { 24489, 0xffff }, + { 24505, 0xffff }, { 24521, 0xfffd }, { 24536, 0xfffb }, { 24551, 0x7fff }, + { 24566, 0xe000 }, { 24569, 0x73ff }, { 24582, 0x003f }, +}; +static const Summary16 cns11643_inv_uni2indx_pagefa[3] = { + /* 0xfa00 */ + { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0100 }, +}; +static const Summary16 cns11643_inv_uni2indx_pagefe[31] = { + /* 0xfe00 */ + { 24589, 0x0000 }, { 24589, 0x0000 }, { 24589, 0x0000 }, { 24589, 0xffe7 }, + { 24603, 0x7e1f }, { 24614, 0xfef7 }, { 24628, 0x0f7f }, { 24639, 0x0000 }, + { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, + { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, + /* 0xff00 */ + { 24639, 0xff7a }, { 24652, 0xffff }, { 24668, 0xffff }, { 24684, 0x97ff }, + { 24697, 0xfffe }, { 24712, 0x3fff }, { 24726, 0x0000 }, { 24726, 0x0000 }, + { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, + { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0023 }, +}; +static const Summary16 cns11643_inv_uni2indx_page200[2670] = { + /* 0x20000 */ + { 24729, 0x8bbd }, { 24739, 0x0715 }, { 24745, 0x722f }, { 24754, 0x0860 }, + { 24757, 0x39ca }, { 24765, 0x08ec }, { 24771, 0xeaf6 }, { 24782, 0xe0d7 }, + { 24791, 0xb1fc }, { 24801, 0x5fbc }, { 24812, 0xd33d }, { 24822, 0xf6ff }, + { 24836, 0x8a5c }, { 24843, 0xc377 }, { 24853, 0x24f3 }, { 24861, 0x795f }, + /* 0x20100 */ + { 24872, 0xfff4 }, { 24885, 0xeefe }, { 24898, 0x751f }, { 24908, 0x03b7 }, + { 24916, 0x9fb9 }, { 24927, 0xe3fa }, { 24938, 0xfebf }, { 24952, 0x4071 }, + { 24957, 0xd6ff }, { 24970, 0x3004 }, { 24973, 0xb3f8 }, { 24983, 0x1ff5 }, + { 24994, 0x8ffc }, { 25005, 0xff11 }, { 25015, 0x0fff }, { 25027, 0xc096 }, + /* 0x20200 */ + { 25033, 0xfffb }, { 25048, 0xffe3 }, { 25061, 0xf787 }, { 25072, 0xffff }, + { 25088, 0xfff0 }, { 25100, 0x0977 }, { 25108, 0x7ffe }, { 25122, 0xffce }, + { 25135, 0x1dff }, { 25147, 0x4056 }, { 25152, 0x7ffd }, { 25166, 0x4fff }, + { 25179, 0xfffe }, { 25194, 0x287f }, { 25203, 0xffae }, { 25216, 0xffff }, + /* 0x20300 */ + { 25232, 0xfb81 }, { 25241, 0x119f }, { 25249, 0xfe03 }, { 25258, 0xdeff }, + { 25272, 0xff11 }, { 25282, 0xc17f }, { 25292, 0xdf84 }, { 25301, 0x0fff }, + { 25313, 0xfffc }, { 25327, 0x4fff }, { 25340, 0xd08e }, { 25347, 0xffcf }, + { 25361, 0xf59f }, { 25373, 0x04d7 }, { 25380, 0xff9e }, { 25393, 0x0dd1 }, + /* 0x20400 */ + { 25400, 0x7f41 }, { 25409, 0x8de4 }, { 25417, 0xcdfe }, { 25429, 0xfc6f }, + { 25441, 0xf037 }, { 25450, 0xbf8e }, { 25461, 0xefd0 }, { 25471, 0xeecc }, + { 25481, 0x3d7b }, { 25492, 0xcff9 }, { 25504, 0x2f1f }, { 25514, 0xbf7f }, + { 25528, 0xfb5c }, { 25539, 0xb9ac }, { 25548, 0xecb3 }, { 25558, 0x21db }, + /* 0x20500 */ + { 25566, 0xdfdf }, { 25580, 0xbfed }, { 25593, 0x8fa7 }, { 25603, 0x73fa }, + { 25614, 0x6d5e }, { 25624, 0xed5f }, { 25636, 0xf3fd }, { 25649, 0x2eef }, + { 25660, 0xb433 }, { 25668, 0xd6ff }, { 25681, 0x4acf }, { 25690, 0x3fd6 }, + { 25701, 0x7fff }, { 25716, 0x7fbe }, { 25729, 0xf5e6 }, { 25740, 0xfcfe }, + /* 0x20600 */ + { 25753, 0x7ff1 }, { 25765, 0xf9de }, { 25777, 0xfabf }, { 25790, 0xf5ef }, + { 25803, 0xbfc1 }, { 25813, 0xbf8f }, { 25825, 0xef87 }, { 25836, 0xefef }, + { 25850, 0xe9c7 }, { 25860, 0xefc6 }, { 25871, 0xffea }, { 25884, 0xff9f }, + { 25898, 0xe39f }, { 25909, 0x0fff }, { 25921, 0xffe1 }, { 25933, 0xfbf7 }, + /* 0x20700 */ + { 25947, 0x12c4 }, { 25952, 0xbfff }, { 25967, 0x016f }, { 25974, 0xffff }, + { 25990, 0x3f3f }, { 26002, 0xef06 }, { 26011, 0xe7bf }, { 26024, 0xe002 }, + { 26028, 0xffff }, { 26044, 0x311f }, { 26052, 0xfff0 }, { 26064, 0xf88f }, + { 26074, 0xfffe }, { 26089, 0x9fff }, { 26103, 0xffc0 }, { 26113, 0xfc2b }, + /* 0x20800 */ + { 26123, 0xe9ff }, { 26136, 0xf88d }, { 26145, 0xdccf }, { 26156, 0xfbdf }, + { 26170, 0x31de }, { 26179, 0xc3fe }, { 26190, 0xff47 }, { 26202, 0xfb37 }, + { 26214, 0xcff7 }, { 26227, 0x03fc }, { 26235, 0xa1ff }, { 26246, 0x9fdf }, + { 26259, 0xfffb }, { 26274, 0xf7de }, { 26287, 0xcfff }, { 26301, 0xffbb }, + /* 0x20900 */ + { 26315, 0xcfbb }, { 26327, 0xdfbf }, { 26341, 0xfd3f }, { 26354, 0xd77b }, + { 26366, 0xde3f }, { 26378, 0x7e4f }, { 26389, 0xfe6e }, { 26401, 0x6dff }, + { 26414, 0x31ed }, { 26423, 0xff7e }, { 26437, 0x3c7f }, { 26448, 0x70f3 }, + { 26457, 0xc517 }, { 26465, 0xdf9b }, { 26477, 0xff7f }, { 26492, 0x3ffc }, + /* 0x20a00 */ + { 26504, 0xebef }, { 26517, 0xff5d }, { 26530, 0xf0ad }, { 26539, 0x2ff7 }, + { 26551, 0xfc9f }, { 26563, 0xffc6 }, { 26575, 0xffdd }, { 26589, 0xff1f }, + { 26602, 0xffd0 }, { 26613, 0xff7e }, { 26627, 0xec75 }, { 26637, 0xfe29 }, + { 26647, 0x5387 }, { 26655, 0xc6bd }, { 26665, 0x1ff5 }, { 26676, 0x9e1b }, + /* 0x20b00 */ + { 26685, 0xc5f7 }, { 26696, 0xfd8b }, { 26707, 0xffee }, { 26721, 0xbffe }, + { 26735, 0xfebf }, { 26749, 0xffff }, { 26765, 0xffeb }, { 26779, 0xd97f }, + { 26791, 0xeffe }, { 26805, 0x7fff }, { 26820, 0xfdff }, { 26835, 0x0fbf }, + { 26846, 0xff46 }, { 26857, 0x7fff }, { 26872, 0x59fa }, { 26882, 0x0068 }, + /* 0x20c00 */ + { 26885, 0xff30 }, { 26895, 0x7fff }, { 26910, 0xfffe }, { 26925, 0x8165 }, + { 26931, 0x4001 }, { 26933, 0xffff }, { 26949, 0xfbff }, { 26964, 0xfe2f }, + { 26976, 0xdbff }, { 26990, 0x0089 }, { 26993, 0xee00 }, { 26999, 0xffff }, + { 27015, 0x7fff }, { 27030, 0xf800 }, { 27035, 0xcfff }, { 27049, 0x8f93 }, + /* 0x20d00 */ + { 27058, 0x0008 }, { 27059, 0x0000 }, { 27059, 0xffce }, { 27072, 0xffff }, + { 27088, 0x040f }, { 27093, 0xfffe }, { 27108, 0x0427 }, { 27113, 0x02a5 }, + { 27118, 0x0000 }, { 27118, 0x0000 }, { 27118, 0x7f80 }, { 27126, 0xfdbf }, + { 27140, 0xffff }, { 27156, 0xfffe }, { 27171, 0xff80 }, { 27180, 0x79ff }, + /* 0x20e00 */ + { 27193, 0x3011 }, { 27197, 0x2040 }, { 27199, 0x6000 }, { 27201, 0x8fef }, + { 27213, 0xffff }, { 27229, 0xdfff }, { 27244, 0x4fff }, { 27257, 0x8000 }, + { 27258, 0xffff }, { 27274, 0x0008 }, { 27275, 0x0014 }, { 27277, 0x0000 }, + { 27277, 0xf000 }, { 27281, 0xfff3 }, { 27295, 0xffff }, { 27311, 0xc043 }, + /* 0x20f00 */ + { 27316, 0xffff }, { 27332, 0x557f }, { 27343, 0x020c }, { 27346, 0x0000 }, + { 27346, 0x0000 }, { 27346, 0x3000 }, { 27348, 0xfffd }, { 27363, 0xff7f }, + { 27378, 0x1f7f }, { 27390, 0xffc0 }, { 27400, 0x84e3 }, { 27407, 0x0001 }, + { 27408, 0xffe0 }, { 27419, 0xffff }, { 27435, 0x40ff }, { 27444, 0xfc00 }, + /* 0x21000 */ + { 27450, 0xffff }, { 27466, 0x000d }, { 27469, 0x0000 }, { 27469, 0xbe00 }, + { 27475, 0xfbfe }, { 27489, 0x80ef }, { 27497, 0x3b3f }, { 27508, 0x0000 }, + { 27508, 0x8c00 }, { 27511, 0xffff }, { 27527, 0x13ff }, { 27538, 0x7fc0 }, + { 27547, 0x0000 }, { 27547, 0xa000 }, { 27549, 0xffff }, { 27565, 0x0084 }, + /* 0x21100 */ + { 27567, 0x077c }, { 27575, 0x7ffe }, { 27589, 0x0009 }, { 27591, 0x8ffe }, + { 27603, 0x0003 }, { 27605, 0xf790 }, { 27614, 0x600a }, { 27618, 0xff47 }, + { 27630, 0xce68 }, { 27638, 0x180f }, { 27644, 0x238f }, { 27652, 0xdffd }, + { 27666, 0x7fda }, { 27678, 0x09ff }, { 27688, 0x041f }, { 27694, 0xf2ff }, + /* 0x21200 */ + { 27707, 0xfe9d }, { 27719, 0xbff2 }, { 27731, 0x743c }, { 27739, 0xd38a }, + { 27747, 0x3416 }, { 27753, 0xaf04 }, { 27760, 0x10ff }, { 27769, 0x10ee }, + { 27776, 0xffff }, { 27792, 0x5ff8 }, { 27803, 0x11fb }, { 27812, 0x7ff0 }, + { 27823, 0xfff0 }, { 27835, 0x797f }, { 27847, 0xff89 }, { 27858, 0x01ff }, + /* 0x21300 */ + { 27867, 0xffc2 }, { 27878, 0x97ed }, { 27889, 0xfef0 }, { 27900, 0xfbdf }, + { 27914, 0x87ff }, { 27926, 0x003a }, { 27930, 0xfff3 }, { 27944, 0xfcff }, + { 27958, 0x40ff }, { 27967, 0x04e1 }, { 27972, 0xdf80 }, { 27980, 0xfffb }, + { 27995, 0xffaf }, { 28009, 0x00bf }, { 28016, 0xee00 }, { 28022, 0x81ff }, + /* 0x21400 */ + { 28032, 0x47ff }, { 28044, 0xe83b }, { 28053, 0x2f7f }, { 28065, 0x5fff }, + { 28079, 0x8784 }, { 28085, 0xdf16 }, { 28095, 0x395f }, { 28105, 0x07c0 }, + { 28110, 0x7fc4 }, { 28120, 0xfe4d }, { 28131, 0x811b }, { 28137, 0x3fbf }, + { 28150, 0x3600 }, { 28154, 0x0ebf }, { 28164, 0x1ed8 }, { 28172, 0xbf7f }, + /* 0x21500 */ + { 28186, 0x8f96 }, { 28195, 0xefa0 }, { 28204, 0xb1f7 }, { 28215, 0x7ee1 }, + { 28225, 0x7c60 }, { 28232, 0xff6e }, { 28245, 0xdfdf }, { 28259, 0xffde }, + { 28273, 0xad53 }, { 28282, 0xf7be }, { 28295, 0xfe3c }, { 28306, 0xe3dd }, + { 28317, 0x114a }, { 28322, 0xf33c }, { 28332, 0xff6f }, { 28346, 0xff91 }, + /* 0x21600 */ + { 28357, 0xfa77 }, { 28369, 0xa7f5 }, { 28380, 0x0a7d }, { 28388, 0xbffd }, + { 28402, 0xf792 }, { 28412, 0x35e1 }, { 28420, 0xff05 }, { 28430, 0xffc7 }, + { 28443, 0x9fe3 }, { 28454, 0x59c3 }, { 28462, 0x8d39 }, { 28470, 0xff3f }, + { 28484, 0x6ff8 }, { 28495, 0xffed }, { 28509, 0xfe27 }, { 28520, 0x7e9f }, + /* 0x21700 */ + { 28532, 0xffff }, { 28548, 0xbbfe }, { 28561, 0xffeb }, { 28575, 0xe17f }, + { 28586, 0xb4ff }, { 28598, 0xff82 }, { 28608, 0x0fff }, { 28620, 0xffe4 }, + { 28632, 0x5fff }, { 28646, 0xff1b }, { 28658, 0xffdf }, { 28673, 0xffc1 }, + { 28684, 0x47ff }, { 28696, 0xfe72 }, { 28707, 0xffff }, { 28723, 0xe09f }, + /* 0x21800 */ + { 28732, 0x493f }, { 28741, 0xfebf }, { 28755, 0xf8f5 }, { 28766, 0x21ff }, + { 28776, 0xbf2c }, { 28786, 0xbeff }, { 28800, 0xff21 }, { 28810, 0xf2ff }, + { 28823, 0x2ffc }, { 28834, 0x3ffe }, { 28847, 0x7ff8 }, { 28859, 0xc1b6 }, + { 28867, 0xfbef }, { 28881, 0xfc37 }, { 28892, 0xee12 }, { 28900, 0xf5bf }, + /* 0x21900 */ + { 28913, 0xb9c7 }, { 28923, 0x3fe4 }, { 28933, 0xdf7e }, { 28946, 0xd6d7 }, + { 28957, 0xe7ef }, { 28970, 0x79ff }, { 28983, 0xff4e }, { 28995, 0x6ec7 }, + { 29005, 0xdaf8 }, { 29015, 0xe5ae }, { 29025, 0xa23f }, { 29034, 0xf321 }, + { 29042, 0xf9fc }, { 29054, 0xf7c2 }, { 29064, 0xfe0d }, { 29074, 0x0df3 }, + /* 0x21a00 */ + { 29083, 0xe7ff }, { 29097, 0xd01b }, { 29104, 0xfffd }, { 29119, 0xf853 }, + { 29128, 0xc3ff }, { 29140, 0xca3f }, { 29150, 0xf7ff }, { 29165, 0xfc1f }, + { 29176, 0xcf7f }, { 29189, 0x8dd9 }, { 29198, 0x7fbf }, { 29212, 0xf5d0 }, + { 29221, 0x7fff }, { 29236, 0xfdfc }, { 29249, 0xf60d }, { 29258, 0xf88f }, + /* 0x21b00 */ + { 29268, 0xb4f9 }, { 29278, 0xaf5e }, { 29289, 0xd78d }, { 29299, 0xee1b }, + { 29309, 0x7d66 }, { 29319, 0xe66f }, { 29330, 0x8f23 }, { 29338, 0xe238 }, + { 29345, 0xc00f }, { 29351, 0xe221 }, { 29357, 0x00c2 }, { 29360, 0x8813 }, + { 29365, 0xe67c }, { 29375, 0xfb55 }, { 29386, 0xf7ef }, { 29400, 0x1dfc }, + /* 0x21c00 */ + { 29410, 0x7e9c }, { 29420, 0x33f7 }, { 29431, 0xfe7d }, { 29444, 0xf5c1 }, + { 29453, 0xf81f }, { 29463, 0x2fbf }, { 29475, 0x7dff }, { 29489, 0xfe97 }, + { 29501, 0x5fff }, { 29515, 0xfffe }, { 29530, 0xf7cb }, { 29542, 0x4f7f }, + { 29554, 0xa7f4 }, { 29564, 0xc1fb }, { 29574, 0x39c3 }, { 29582, 0xc196 }, + /* 0x21d00 */ + { 29589, 0xf977 }, { 29601, 0xfbee }, { 29614, 0xbbfa }, { 29626, 0x99ef }, + { 29637, 0xcdc3 }, { 29646, 0x7ffa }, { 29659, 0x4fd8 }, { 29668, 0x560b }, + { 29675, 0xfffc }, { 29689, 0xefff }, { 29704, 0xfe15 }, { 29714, 0xfb0b }, + { 29724, 0x92ff }, { 29735, 0xffff }, { 29751, 0xe7ff }, { 29765, 0x81ff }, + /* 0x21e00 */ + { 29775, 0x5704 }, { 29781, 0xdfff }, { 29796, 0x17ff }, { 29808, 0xff60 }, + { 29818, 0xac4f }, { 29827, 0x0014 }, { 29829, 0xffbc }, { 29842, 0x7fed }, + { 29855, 0xfd40 }, { 29863, 0x2614 }, { 29868, 0xf812 }, { 29875, 0xfeff }, + { 29890, 0x28ff }, { 29900, 0xffa2 }, { 29911, 0xf7ff }, { 29926, 0x43f7 }, + /* 0x21f00 */ + { 29936, 0x7c00 }, { 29941, 0x3fff }, { 29955, 0x87e0 }, { 29962, 0xf441 }, + { 29969, 0x77ff }, { 29983, 0xfd39 }, { 29994, 0xf0fb }, { 30005, 0x2521 }, + { 30010, 0x7fe5 }, { 30022, 0xff33 }, { 30034, 0xc2dc }, { 30042, 0x78c7 }, + { 30051, 0x9fc2 }, { 30060, 0xb972 }, { 30069, 0xffaf }, { 30083, 0xeb8f }, + /* 0x22000 */ + { 30094, 0x47ff }, { 30106, 0xb31f }, { 30116, 0x821f }, { 30123, 0x8ad0 }, + { 30129, 0x11ff }, { 30139, 0x9ffd }, { 30152, 0xf7fc }, { 30165, 0xfe3f }, + { 30178, 0xadcf }, { 30189, 0xe5ff }, { 30202, 0xde6f }, { 30214, 0xfff6 }, + { 30228, 0xf85f }, { 30239, 0xffff }, { 30255, 0xfd9b }, { 30267, 0x6fff }, + /* 0x22100 */ + { 30281, 0xfdf2 }, { 30293, 0xddf9 }, { 30305, 0x08ff }, { 30314, 0xf7ff }, + { 30329, 0xee04 }, { 30336, 0xceff }, { 30349, 0xef4f }, { 30361, 0xfb67 }, + { 30373, 0xefb8 }, { 30384, 0x9e0f }, { 30393, 0xd014 }, { 30398, 0xfbfe }, + { 30412, 0xfcc3 }, { 30422, 0x7fd7 }, { 30435, 0xaff9 }, { 30447, 0xfffd }, + /* 0x22200 */ + { 30462, 0xffb7 }, { 30476, 0xfe87 }, { 30487, 0x313f }, { 30496, 0xfffc }, + { 30510, 0xfd7f }, { 30524, 0xff61 }, { 30535, 0xffff }, { 30551, 0x9057 }, + { 30558, 0x5eff }, { 30571, 0xfbfd }, { 30585, 0xf57f }, { 30598, 0x1fff }, + { 30611, 0xf0fe }, { 30622, 0x35ff }, { 30634, 0xacfe }, { 30645, 0xf9e7 }, + /* 0x22300 */ + { 30657, 0xabdd }, { 30668, 0x7bfe }, { 30681, 0xbfed }, { 30694, 0xfd7a }, + { 30706, 0xe47e }, { 30716, 0xfff5 }, { 30730, 0xd9dd }, { 30741, 0xcfcf }, + { 30753, 0x74db }, { 30763, 0xb70f }, { 30773, 0x2ffd }, { 30785, 0xdfc7 }, + { 30797, 0x03e3 }, { 30804, 0x07fc }, { 30813, 0xdfd0 }, { 30823, 0x7fff }, + /* 0x22400 */ + { 30838, 0xbdff }, { 30852, 0xe37c }, { 30862, 0xb3ff }, { 30875, 0xdfbd }, + { 30888, 0x3fdf }, { 30901, 0x5fff }, { 30915, 0xaf5e }, { 30926, 0xe3ef }, + { 30938, 0x979f }, { 30949, 0xfff3 }, { 30963, 0xfff7 }, { 30978, 0xebfd }, + { 30991, 0x8ffd }, { 31003, 0xf1fd }, { 31015, 0xfe2d }, { 31026, 0x77ff }, + /* 0x22500 */ + { 31040, 0xffdf }, { 31055, 0xf503 }, { 31063, 0x2fff }, { 31076, 0xf9fb }, + { 31089, 0xe189 }, { 31096, 0xffff }, { 31112, 0xfc9f }, { 31124, 0x5edb }, + { 31135, 0xe71e }, { 31145, 0xff8f }, { 31158, 0x3efd }, { 31170, 0x2ffd }, + { 31182, 0x7f8a }, { 31192, 0xf9bf }, { 31205, 0x5fff }, { 31219, 0x8e26 }, + /* 0x22600 */ + { 31226, 0xffff }, { 31242, 0x647f }, { 31252, 0x8dc9 }, { 31260, 0xfdff }, + { 31275, 0x7fff }, { 31290, 0xffc0 }, { 31300, 0x414f }, { 31307, 0xffff }, + { 31323, 0xffff }, { 31339, 0xfe83 }, { 31349, 0x807f }, { 31357, 0x0c01 }, + { 31360, 0xfffe }, { 31375, 0xffff }, { 31391, 0x7fff }, { 31406, 0xff81 }, + /* 0x22700 */ + { 31416, 0xffff }, { 31432, 0x8ccf }, { 31441, 0xffb8 }, { 31453, 0xffff }, + { 31469, 0xffff }, { 31485, 0xe0bf }, { 31495, 0x67ff }, { 31508, 0x2004 }, + { 31510, 0xf682 }, { 31518, 0xf7ff }, { 31533, 0xffff }, { 31549, 0xffcf }, + { 31563, 0x0c1f }, { 31570, 0x3000 }, { 31572, 0xdfdf }, { 31586, 0xffff }, + /* 0x22800 */ + { 31602, 0xfc01 }, { 31609, 0xd7ff }, { 31623, 0x5003 }, { 31627, 0xfffe }, + { 31642, 0xcfff }, { 31656, 0x43ff }, { 31667, 0xfff6 }, { 31681, 0xe118 }, + { 31687, 0xb000 }, { 31690, 0xfffe }, { 31705, 0x40ff }, { 31714, 0x00ff }, + { 31722, 0xfe02 }, { 31730, 0xff7f }, { 31745, 0xff07 }, { 31756, 0xf8c5 }, + /* 0x22900 */ + { 31765, 0xdfff }, { 31780, 0x03ef }, { 31789, 0xfff0 }, { 31801, 0x7c7f }, + { 31813, 0xfc1a }, { 31822, 0xfd9f }, { 31835, 0xfbf2 }, { 31847, 0xff07 }, + { 31858, 0xcbe2 }, { 31867, 0xfe79 }, { 31879, 0xdfdf }, { 31893, 0x8fc0 }, + { 31900, 0x7fcf }, { 31913, 0x997e }, { 31923, 0x1ff5 }, { 31934, 0xe7f8 }, + /* 0x22a00 */ + { 31945, 0x7ff0 }, { 31956, 0xce3f }, { 31967, 0xb67b }, { 31978, 0x7f94 }, + { 31988, 0x69f2 }, { 31997, 0x236e }, { 32005, 0x7b65 }, { 32015, 0x007f }, + { 32022, 0xfffc }, { 32036, 0xf0ff }, { 32048, 0x029f }, { 32055, 0xfdf0 }, + { 32066, 0x7fc5 }, { 32077, 0x0010 }, { 32078, 0xfff4 }, { 32091, 0xffff }, + /* 0x22b00 */ + { 32107, 0xffc9 }, { 32119, 0x4fff }, { 32132, 0x9c04 }, { 32137, 0xffff }, + { 32153, 0x7fff }, { 32168, 0xfffc }, { 32182, 0x055f }, { 32190, 0x0000 }, + { 32190, 0xffde }, { 32204, 0xf7ff }, { 32219, 0xc19f }, { 32228, 0xffff }, + { 32244, 0x115f }, { 32252, 0x0000 }, { 32252, 0xfe08 }, { 32260, 0xffff }, + /* 0x22c00 */ + { 32276, 0xffff }, { 32292, 0x1fff }, { 32305, 0xff00 }, { 32313, 0x7fff }, + { 32328, 0x20ad }, { 32334, 0x8000 }, { 32335, 0xdfff }, { 32350, 0xdfdf }, + { 32364, 0xffff }, { 32380, 0x0167 }, { 32386, 0x0002 }, { 32387, 0x7ff9 }, + { 32400, 0xebff }, { 32414, 0x077f }, { 32424, 0xfffe }, { 32439, 0x5fff }, + /* 0x22d00 */ + { 32453, 0x0003 }, { 32455, 0x0000 }, { 32455, 0x7fff }, { 32470, 0xffff }, + { 32486, 0xe51b }, { 32495, 0xffff }, { 32511, 0x0009 }, { 32513, 0x8000 }, + { 32514, 0xffff }, { 32530, 0x3fff }, { 32544, 0xffc0 }, { 32554, 0x0023 }, + { 32557, 0xfb80 }, { 32565, 0x3fff }, { 32579, 0x2ff0 }, { 32588, 0xffc0 }, + /* 0x22e00 */ + { 32598, 0xc3ff }, { 32610, 0x037f }, { 32619, 0xfff8 }, { 32632, 0xff9f }, + { 32646, 0xa817 }, { 32653, 0x87fb }, { 32664, 0xf007 }, { 32671, 0x0ebf }, + { 32681, 0x9ffc }, { 32693, 0xc763 }, { 32702, 0x77e7 }, { 32714, 0x47f7 }, + { 32725, 0xe51e }, { 32734, 0x6cf3 }, { 32744, 0xf6e3 }, { 32755, 0x6ede }, + /* 0x22f00 */ + { 32766, 0xffe0 }, { 32777, 0xf133 }, { 32786, 0xf5af }, { 32798, 0xac40 }, + { 32803, 0x8fff }, { 32816, 0xe9bf }, { 32828, 0xf7f3 }, { 32841, 0x84fd }, + { 32850, 0xbbfd }, { 32863, 0xfe1d }, { 32874, 0xffb9 }, { 32887, 0x77fa }, + { 32899, 0x6fc0 }, { 32907, 0xcbff }, { 32920, 0x7f3b }, { 32932, 0xe3fc }, + /* 0x23000 */ + { 32943, 0xde47 }, { 32953, 0x6577 }, { 32963, 0xfdff }, { 32978, 0x34fa }, + { 32987, 0xddce }, { 32998, 0xf7a7 }, { 33010, 0x5abf }, { 33021, 0xbdfa }, + { 33033, 0x9677 }, { 33043, 0xca3a }, { 33051, 0xedff }, { 33065, 0xbf66 }, + { 33076, 0xbd4f }, { 33087, 0xfb5b }, { 33099, 0xffc6 }, { 33111, 0xfba8 }, + /* 0x23100 */ + { 33121, 0xdf17 }, { 33132, 0xe793 }, { 33142, 0x4dd7 }, { 33152, 0xdbf7 }, + { 33165, 0x5fd7 }, { 33177, 0xfc4f }, { 33188, 0xffff }, { 33204, 0x7f9e }, + { 33216, 0x0e7a }, { 33224, 0x7ffc }, { 33237, 0x0bc9 }, { 33244, 0xfffc }, + { 33258, 0xf841 }, { 33265, 0x043f }, { 33272, 0xdffc }, { 33285, 0xfc4f }, + /* 0x23200 */ + { 33296, 0xa19f }, { 33305, 0x8000 }, { 33306, 0x47f3 }, { 33316, 0x7fe0 }, + { 33326, 0x051f }, { 33333, 0x1ffe }, { 33345, 0x3ff8 }, { 33356, 0xfc01 }, + { 33363, 0x805e }, { 33369, 0xee73 }, { 33380, 0xc1fb }, { 33390, 0x255f }, + { 33399, 0xbf30 }, { 33408, 0xc1f9 }, { 33417, 0xfc28 }, { 33425, 0x85fc }, + /* 0x23300 */ + { 33434, 0xe1b8 }, { 33442, 0x93c8 }, { 33449, 0xbffc }, { 33462, 0x798f }, + { 33472, 0x91d8 }, { 33479, 0xfb5e }, { 33491, 0x58ff }, { 33502, 0x17f8 }, + { 33511, 0x3e36 }, { 33520, 0x9f9d }, { 33531, 0x723b }, { 33540, 0xbf7e }, + { 33553, 0x0fef }, { 33564, 0xfff7 }, { 33579, 0xffa3 }, { 33591, 0x6b4f }, + /* 0x23400 */ + { 33601, 0xff8b }, { 33613, 0xff8f }, { 33626, 0x07ff }, { 33637, 0xffe1 }, + { 33649, 0x801f }, { 33655, 0xfffe }, { 33670, 0xed3f }, { 33682, 0xe306 }, + { 33689, 0x83ff }, { 33700, 0xffff }, { 33716, 0xbfff }, { 33731, 0x9fc0 }, + { 33739, 0xffff }, { 33755, 0xffff }, { 33771, 0xff83 }, { 33782, 0xffff }, + /* 0x23500 */ + { 33798, 0xffff }, { 33814, 0x007e }, { 33820, 0xf800 }, { 33825, 0xfffe }, + { 33840, 0x7fff }, { 33855, 0xfa0f }, { 33865, 0xffff }, { 33881, 0x9fff }, + { 33895, 0x048f }, { 33901, 0x0029 }, { 33904, 0xff78 }, { 33916, 0xfff7 }, + { 33931, 0x000e }, { 33934, 0xfff1 }, { 33947, 0xffff }, { 33963, 0x0db9 }, + /* 0x23600 */ + { 33971, 0xe8a1 }, { 33978, 0xfff7 }, { 33993, 0xffff }, { 34009, 0x880f }, + { 34015, 0xfffe }, { 34030, 0x0a7f }, { 34039, 0x0010 }, { 34040, 0xf87f }, + { 34052, 0xffff }, { 34068, 0xfff7 }, { 34083, 0x877f }, { 34094, 0xffff }, + { 34110, 0xffff }, { 34126, 0x8543 }, { 34132, 0x5800 }, { 34135, 0xbfff }, + /* 0x23700 */ + { 34150, 0xe1ff }, { 34162, 0xffff }, { 34178, 0x91f8 }, { 34186, 0x9600 }, + { 34190, 0xfffe }, { 34205, 0x7fff }, { 34220, 0xffa0 }, { 34230, 0x5aff }, + { 34242, 0x1ac2 }, { 34248, 0xffff }, { 34264, 0xfff8 }, { 34277, 0x98e5 }, + { 34285, 0xfff4 }, { 34298, 0xff07 }, { 34309, 0x910f }, { 34316, 0x7f7d }, + /* 0x23800 */ + { 34329, 0xdffe }, { 34343, 0xfe11 }, { 34352, 0x7fe3 }, { 34364, 0xffa0 }, + { 34374, 0xf679 }, { 34385, 0x591f }, { 34394, 0x6fad }, { 34405, 0x1dde }, + { 34415, 0xfeff }, { 34430, 0xff9f }, { 34444, 0xf7cf }, { 34457, 0xac3f }, + { 34467, 0xff7f }, { 34482, 0xe3ef }, { 34494, 0x9bff }, { 34507, 0xffff }, + /* 0x23900 */ + { 34523, 0xffbf }, { 34538, 0x77b7 }, { 34550, 0x723f }, { 34560, 0xdef6 }, + { 34572, 0xffbf }, { 34587, 0x3bff }, { 34600, 0x2fed }, { 34611, 0xff3c }, + { 34623, 0x0fbe }, { 34633, 0xf7f0 }, { 34644, 0x81f6 }, { 34652, 0xbfe6 }, + { 34664, 0xfeff }, { 34679, 0xe07f }, { 34689, 0xffff }, { 34705, 0xfbff }, + /* 0x23a00 */ + { 34720, 0xffeb }, { 34734, 0xffc7 }, { 34747, 0x837f }, { 34757, 0x2bfe }, + { 34768, 0xfbf8 }, { 34780, 0xe3ff }, { 34793, 0xbf3f }, { 34806, 0xdcdf }, + { 34818, 0xf96d }, { 34829, 0x9aff }, { 34841, 0xf6fb }, { 34854, 0xfbef }, + { 34868, 0x30e3 }, { 34875, 0xc74f }, { 34885, 0xbbfe }, { 34898, 0xf711 }, + /* 0x23b00 */ + { 34907, 0xff7f }, { 34922, 0xdcff }, { 34935, 0xfffe }, { 34950, 0xff2f }, + { 34963, 0xfeb7 }, { 34976, 0xf43f }, { 34987, 0x7fef }, { 35001, 0xfffe }, + { 35016, 0xff07 }, { 35027, 0xffbf }, { 35042, 0xff98 }, { 35053, 0x3e1f }, + { 35063, 0xffe4 }, { 35075, 0xbbee }, { 35087, 0xfff4 }, { 35100, 0xff87 }, + /* 0x23c00 */ + { 35112, 0x7e47 }, { 35122, 0xdc5f }, { 35133, 0x7d1f }, { 35144, 0xdbc6 }, + { 35154, 0xdfb1 }, { 35165, 0xdf7f }, { 35179, 0xcc7b }, { 35189, 0x03f4 }, + { 35196, 0xcbdf }, { 35208, 0xe03f }, { 35217, 0xffa3 }, { 35229, 0xfffd }, + { 35244, 0xfc37 }, { 35255, 0x2fff }, { 35268, 0xfff8 }, { 35281, 0x00ff }, + /* 0x23d00 */ + { 35289, 0xfffe }, { 35304, 0xe077 }, { 35313, 0xffff }, { 35329, 0x5fff }, + { 35343, 0xfffc }, { 35357, 0x7fff }, { 35372, 0x1354 }, { 35378, 0xff8a }, + { 35389, 0xffff }, { 35405, 0xff7f }, { 35420, 0x007e }, { 35426, 0xc020 }, + { 35429, 0xffff }, { 35445, 0xafff }, { 35459, 0x02d6 }, { 35465, 0xf860 }, + /* 0x23e00 */ + { 35472, 0xffff }, { 35488, 0xffff }, { 35504, 0x0003 }, { 35506, 0xfffc }, + { 35520, 0x76df }, { 35532, 0xec00 }, { 35537, 0xffff }, { 35553, 0xfffe }, + { 35568, 0xf003 }, { 35574, 0xffff }, { 35590, 0x97ff }, { 35603, 0x8057 }, + { 35609, 0xb400 }, { 35613, 0xffff }, { 35629, 0xffff }, { 35645, 0x8007 }, + /* 0x23f00 */ + { 35649, 0xffff }, { 35665, 0xafff }, { 35679, 0x000f }, { 35683, 0x8820 }, + { 35686, 0xdff8 }, { 35698, 0xffff }, { 35714, 0xffff }, { 35730, 0x2079 }, + { 35736, 0xfff0 }, { 35748, 0xffff }, { 35764, 0x7f0f }, { 35775, 0x0081 }, + { 35777, 0xffe2 }, { 35789, 0xffff }, { 35805, 0x001f }, { 35810, 0xfffe }, + /* 0x24000 */ + { 35825, 0x49f3 }, { 35834, 0x8002 }, { 35836, 0xffff }, { 35852, 0xc2ff }, + { 35863, 0x37ff }, { 35876, 0xf481 }, { 35883, 0xfffe }, { 35898, 0xffff }, + { 35914, 0xc4ff }, { 35925, 0xffff }, { 35941, 0x806e }, { 35947, 0xefff }, + { 35962, 0xfc17 }, { 35972, 0x07bf }, { 35982, 0xbe08 }, { 35989, 0x7bf7 }, + /* 0x24100 */ + { 36002, 0xc2e0 }, { 36008, 0xfffb }, { 36023, 0x1f5f }, { 36034, 0x2ff8 }, + { 36044, 0x7cee }, { 36055, 0x2f06 }, { 36062, 0x6f5f }, { 36074, 0xfb9f }, + { 36087, 0xef7d }, { 36100, 0xe5f7 }, { 36112, 0xbfc0 }, { 36121, 0xf017 }, + { 36129, 0xff83 }, { 36140, 0xafff }, { 36154, 0x8807 }, { 36159, 0xe0ff }, + /* 0x24200 */ + { 36170, 0xffff }, { 36186, 0x0967 }, { 36193, 0xffec }, { 36206, 0xfe07 }, + { 36216, 0x07ff }, { 36227, 0xa202 }, { 36231, 0xfefe }, { 36245, 0xfe00 }, + { 36252, 0xffff }, { 36268, 0x1bff }, { 36280, 0x8020 }, { 36282, 0xfff4 }, + { 36295, 0xf8df }, { 36307, 0xffff }, { 36323, 0x97ff }, { 36336, 0x040b }, + /* 0x24300 */ + { 36340, 0xff8a }, { 36351, 0xf87f }, { 36363, 0xffff }, { 36379, 0x3f7f }, + { 36392, 0xe100 }, { 36396, 0x3ff9 }, { 36408, 0xffc4 }, { 36419, 0xdfff }, + { 36434, 0x1034 }, { 36438, 0xe5c0 }, { 36445, 0xffff }, { 36461, 0xc1bf }, + { 36471, 0xffff }, { 36487, 0xefbf }, { 36501, 0xe201 }, { 36506, 0xfff1 }, + /* 0x24400 */ + { 36519, 0xfff1 }, { 36532, 0xc0a7 }, { 36539, 0xbfc4 }, { 36549, 0xff8f }, + { 36562, 0xcc6f }, { 36572, 0xf0dd }, { 36582, 0x0185 }, { 36586, 0xf7ff }, + { 36601, 0xff47 }, { 36613, 0x5089 }, { 36618, 0x58de }, { 36627, 0x7de8 }, + { 36637, 0x873f }, { 36647, 0xf6f5 }, { 36659, 0xfde3 }, { 36671, 0x79de }, + /* 0x24500 */ + { 36682, 0xd4ff }, { 36694, 0x11bf }, { 36703, 0x57fd }, { 36715, 0x033f }, + { 36723, 0xeb2d }, { 36733, 0xffeb }, { 36747, 0xefff }, { 36762, 0x7eff }, + { 36776, 0xffee }, { 36790, 0x7ffb }, { 36804, 0xfffd }, { 36819, 0x7c9f }, + { 36830, 0xffb7 }, { 36844, 0x1f82 }, { 36851, 0xffef }, { 36866, 0xbdfa }, + /* 0x24600 */ + { 36878, 0xf339 }, { 36888, 0xfff3 }, { 36902, 0xf8ff }, { 36915, 0xff1d }, + { 36927, 0xb61d }, { 36936, 0xf9bf }, { 36949, 0x2dd7 }, { 36959, 0x0fbf }, + { 36970, 0xff1c }, { 36981, 0x437f }, { 36991, 0xff01 }, { 37000, 0xff7f }, + { 37015, 0xff04 }, { 37024, 0x8823 }, { 37029, 0x8afe }, { 37039, 0xee5f }, + /* 0x24700 */ + { 37051, 0xbbbd }, { 37063, 0x3ed7 }, { 37074, 0x895e }, { 37082, 0xffff }, + { 37098, 0xb04f }, { 37106, 0xdfff }, { 37121, 0xd17b }, { 37131, 0xffff }, + { 37147, 0x8177 }, { 37155, 0xfe80 }, { 37163, 0xb02f }, { 37171, 0xc305 }, + { 37177, 0xfffb }, { 37192, 0xf6b7 }, { 37204, 0x3fff }, { 37218, 0x2d7c }, + /* 0x24800 */ + { 37227, 0xe480 }, { 37232, 0xf7ff }, { 37247, 0x1bf3 }, { 37257, 0xfe20 }, + { 37265, 0x60ff }, { 37275, 0xf383 }, { 37284, 0x7fff }, { 37299, 0xbe7f }, + { 37312, 0xfe28 }, { 37321, 0x77ff }, { 37335, 0x87cf }, { 37345, 0x0fff }, + { 37357, 0x6f2b }, { 37367, 0xbb8f }, { 37378, 0xcfdd }, { 37390, 0x1fb5 }, + /* 0x24900 */ + { 37400, 0xf97c }, { 37411, 0xfd0f }, { 37422, 0x9d3f }, { 37433, 0x1fe6 }, + { 37443, 0xfff8 }, { 37456, 0x1ff0 }, { 37465, 0x3ff0 }, { 37475, 0xfbf2 }, + { 37487, 0x002b }, { 37491, 0xffff }, { 37507, 0xf977 }, { 37519, 0xf01f }, + { 37528, 0xffff }, { 37544, 0xc2df }, { 37554, 0xfcfd }, { 37567, 0xfc05 }, + /* 0x24a00 */ + { 37575, 0xbfff }, { 37590, 0x3ff9 }, { 37602, 0xf800 }, { 37607, 0x7f3f }, + { 37620, 0x0bff }, { 37631, 0xfffc }, { 37645, 0xfff8 }, { 37658, 0xf837 }, + { 37668, 0xf8ff }, { 37681, 0xff81 }, { 37691, 0x7f7d }, { 37704, 0xf7f0 }, + { 37715, 0x377f }, { 37727, 0x9df1 }, { 37737, 0xff78 }, { 37749, 0x7dff }, + /* 0x24b00 */ + { 37763, 0xfb9e }, { 37775, 0x3fc7 }, { 37786, 0xf75f }, { 37799, 0xdef1 }, + { 37810, 0xf07f }, { 37821, 0xf9bf }, { 37834, 0x17ef }, { 37845, 0xfe19 }, + { 37855, 0xefe1 }, { 37866, 0x3f59 }, { 37876, 0xefc6 }, { 37887, 0x3f2f }, + { 37898, 0x7b8b }, { 37908, 0xeff9 }, { 37921, 0xdcdf }, { 37933, 0x729c }, + /* 0x24c00 */ + { 37941, 0x65f9 }, { 37951, 0xeaa3 }, { 37960, 0xff3f }, { 37974, 0xff7f }, + { 37989, 0xf801 }, { 37995, 0xc7e5 }, { 38005, 0xfff8 }, { 38018, 0x704b }, + { 38025, 0xe9f8 }, { 38035, 0x3fff }, { 38049, 0xf88b }, { 38058, 0xefe7 }, + { 38071, 0xbf21 }, { 38080, 0x8dfc }, { 38090, 0xfe13 }, { 38100, 0xde4c }, + /* 0x24d00 */ + { 38109, 0x59bf }, { 38120, 0xf3ef }, { 38133, 0xcff3 }, { 38145, 0xff9f }, + { 38159, 0x398f }, { 38168, 0xff92 }, { 38179, 0x2fff }, { 38192, 0xff80 }, + { 38201, 0x1e7f }, { 38212, 0xfff8 }, { 38225, 0x3f3f }, { 38237, 0x00c0 }, + { 38239, 0xffff }, { 38255, 0x7ffb }, { 38269, 0x0021 }, { 38271, 0xfb80 }, + /* 0x24e00 */ + { 38279, 0xffff }, { 38295, 0xe3fe }, { 38307, 0xfe15 }, { 38317, 0xffff }, + { 38333, 0xa27c }, { 38341, 0xf800 }, { 38346, 0x9fff }, { 38360, 0x0a5b }, + { 38367, 0xfff3 }, { 38381, 0x3fff }, { 38395, 0x03c2 }, { 38400, 0xff80 }, + { 38409, 0x23ff }, { 38420, 0x7fe0 }, { 38430, 0xc12e }, { 38437, 0x07fe }, + /* 0x24f00 */ + { 38447, 0x38ff }, { 38458, 0xb7c7 }, { 38469, 0xbfbf }, { 38483, 0x7687 }, + { 38492, 0x77ce }, { 38503, 0xef57 }, { 38515, 0x97f3 }, { 38526, 0xbe81 }, + { 38534, 0xff08 }, { 38543, 0x7b20 }, { 38550, 0x3dff }, { 38563, 0x795c }, + { 38572, 0xcfe9 }, { 38583, 0xbfe7 }, { 38596, 0x5fa7 }, { 38607, 0x86fc }, + /* 0x25000 */ + { 38616, 0xefde }, { 38629, 0xdff3 }, { 38642, 0xb97e }, { 38653, 0xb677 }, + { 38664, 0xdbff }, { 38678, 0xdf7f }, { 38692, 0xfffb }, { 38707, 0x9fdb }, + { 38719, 0xf5f9 }, { 38731, 0xdffb }, { 38745, 0x73f3 }, { 38756, 0xd7ee }, + { 38768, 0x6fbf }, { 38781, 0x13fc }, { 38790, 0x1ff2 }, { 38800, 0x3ffc }, + /* 0x25100 */ + { 38812, 0xfffd }, { 38827, 0x7bff }, { 38841, 0x02b8 }, { 38846, 0xfffe }, + { 38861, 0x7e13 }, { 38870, 0xff88 }, { 38880, 0x7fef }, { 38894, 0x324f }, + { 38902, 0xfbe0 }, { 38912, 0xffff }, { 38928, 0x1c7f }, { 38938, 0x0069 }, + { 38942, 0xfef8 }, { 38954, 0xff7f }, { 38969, 0x4f13 }, { 38977, 0xc030 }, + /* 0x25200 */ + { 38981, 0xffed }, { 38995, 0x1fff }, { 39008, 0x07fc }, { 39017, 0xf980 }, + { 39024, 0xffff }, { 39040, 0xffff }, { 39056, 0x007c }, { 39061, 0xfff1 }, + { 39074, 0x47f7 }, { 39085, 0x0021 }, { 39087, 0xfd80 }, { 39095, 0xffff }, + { 39111, 0x271f }, { 39120, 0xfe01 }, { 39128, 0xbf3f }, { 39141, 0x8801 }, + /* 0x25300 */ + { 39144, 0xffff }, { 39160, 0xfcf1 }, { 39171, 0xe70e }, { 39180, 0xfc67 }, + { 39191, 0x9e5f }, { 39202, 0xc6b8 }, { 39210, 0xffbf }, { 39225, 0xffef }, + { 39240, 0xfefd }, { 39254, 0x17fd }, { 39265, 0x1ff2 }, { 39275, 0xff7f }, + { 39290, 0xc207 }, { 39296, 0xf792 }, { 39306, 0x9c07 }, { 39313, 0x78ff }, + /* 0x25400 */ + { 39325, 0x001b }, { 39329, 0x7fea }, { 39341, 0x1e3f }, { 39351, 0x35fe }, + { 39362, 0xfff3 }, { 39376, 0x7f9f }, { 39389, 0xd20c }, { 39395, 0xff7d }, + { 39409, 0xbfd7 }, { 39422, 0x5054 }, { 39427, 0xff90 }, { 39437, 0x3e7f }, + { 39449, 0xfcc3 }, { 39459, 0xfcff }, { 39473, 0x20ff }, { 39482, 0xfc02 }, + /* 0x25500 */ + { 39489, 0x07ff }, { 39500, 0xfffd }, { 39515, 0xff0d }, { 39526, 0x07ff }, + { 39537, 0xfbe8 }, { 39548, 0xc5fb }, { 39559, 0x3fe3 }, { 39570, 0xffff }, + { 39586, 0x9ffc }, { 39598, 0xff80 }, { 39607, 0xdc7f }, { 39619, 0xfa9b }, + { 39630, 0x027f }, { 39638, 0xeb4c }, { 39647, 0xfc0e }, { 39656, 0xcd96 }, + /* 0x25600 */ + { 39665, 0x637a }, { 39674, 0x7e60 }, { 39682, 0x7850 }, { 39688, 0xff03 }, + { 39698, 0xfe14 }, { 39707, 0x3ff0 }, { 39717, 0xf910 }, { 39724, 0x1f87 }, + { 39733, 0xff08 }, { 39742, 0x17ff }, { 39754, 0x0fc0 }, { 39760, 0x03ff }, + { 39770, 0xfdef }, { 39784, 0xff10 }, { 39793, 0xc01f }, { 39800, 0xbfbf }, + /* 0x25700 */ + { 39814, 0x9fbe }, { 39826, 0xccbe }, { 39836, 0x9ee9 }, { 39846, 0xff9f }, + { 39860, 0xbdba }, { 39871, 0x7d7d }, { 39883, 0xfffc }, { 39897, 0xde78 }, + { 39907, 0x037f }, { 39916, 0xff84 }, { 39926, 0x8207 }, { 39931, 0xfffe }, + { 39946, 0xe0a0 }, { 39951, 0x5fff }, { 39965, 0x03fc }, { 39973, 0xed80 }, + /* 0x25800 */ + { 39980, 0xffff }, { 39996, 0x01ff }, { 40005, 0x0006 }, { 40007, 0xf6fe }, + { 40020, 0x1feb }, { 40031, 0xbc10 }, { 40037, 0xffff }, { 40053, 0x0279 }, + { 40059, 0xfd83 }, { 40069, 0x7f7e }, { 40082, 0x6080 }, { 40085, 0xbff3 }, + { 40098, 0x003f }, { 40104, 0xd7c8 }, { 40113, 0xffe1 }, { 40125, 0x40bf }, + /* 0x25900 */ + { 40133, 0x5cef }, { 40144, 0xd7fe }, { 40157, 0x6f9c }, { 40167, 0xfff3 }, + { 40181, 0xff8e }, { 40193, 0x4f9f }, { 40204, 0x7fff }, { 40219, 0xffc0 }, + { 40229, 0xfdff }, { 40244, 0xf80b }, { 40252, 0xe7f7 }, { 40265, 0xff67 }, + { 40278, 0x84e0 }, { 40283, 0xfffd }, { 40298, 0xf025 }, { 40305, 0xbfff }, + /* 0x25a00 */ + { 40320, 0xe40f }, { 40328, 0x05ff }, { 40338, 0x7c0e }, { 40346, 0xb9ff }, + { 40359, 0xdd0f }, { 40369, 0x1bfd }, { 40380, 0x7fff }, { 40395, 0xdb7e }, + { 40407, 0xffdf }, { 40422, 0x8f3f }, { 40433, 0xf7f3 }, { 40446, 0xf86f }, + { 40457, 0xe708 }, { 40464, 0xff47 }, { 40476, 0xe1e7 }, { 40486, 0xfffb }, + /* 0x25b00 */ + { 40501, 0xf0bf }, { 40512, 0xeeff }, { 40526, 0xfc7e }, { 40538, 0xfbff }, + { 40553, 0x0fff }, { 40565, 0xffff }, { 40581, 0xfdff }, { 40596, 0xff83 }, + { 40607, 0xf03f }, { 40617, 0x7fff }, { 40632, 0xeffd }, { 40646, 0xffe0 }, + { 40657, 0x0047 }, { 40661, 0xffff }, { 40677, 0xffff }, { 40693, 0xf7ff }, + /* 0x25c00 */ + { 40708, 0xfa64 }, { 40717, 0xffff }, { 40733, 0xffff }, { 40749, 0xffff }, + { 40765, 0xf0f7 }, { 40776, 0xffff }, { 40792, 0x025f }, { 40799, 0xffe8 }, + { 40811, 0xfff3 }, { 40825, 0xffe7 }, { 40839, 0xdfff }, { 40854, 0x3fff }, + { 40868, 0xffc1 }, { 40879, 0xffff }, { 40895, 0xffff }, { 40911, 0x87ff }, + /* 0x25d00 */ + { 40923, 0xffff }, { 40939, 0xe018 }, { 40944, 0xffff }, { 40960, 0xeff7 }, + { 40974, 0x7ff0 }, { 40985, 0xf009 }, { 40991, 0xffff }, { 41007, 0x2f7f }, + { 41019, 0xfdc0 }, { 41028, 0xffff }, { 41044, 0x0ff8 }, { 41053, 0xfff0 }, + { 41065, 0xf3ff }, { 41079, 0xfff3 }, { 41093, 0xff1f }, { 41106, 0xf1f7 }, + /* 0x25e00 */ + { 41118, 0xcfa9 }, { 41128, 0x13d3 }, { 41136, 0xbbee }, { 41148, 0x7ffb }, + { 41162, 0xffee }, { 41176, 0xf467 }, { 41186, 0x29d7 }, { 41195, 0xfffc }, + { 41209, 0x0bf0 }, { 41216, 0xff80 }, { 41225, 0xff9f }, { 41239, 0x115f }, + { 41247, 0xfffe }, { 41262, 0x1e7f }, { 41273, 0xfff0 }, { 41285, 0x800f }, + /* 0x25f00 */ + { 41290, 0xf3ff }, { 41304, 0xff0f }, { 41316, 0x01f7 }, { 41324, 0xffe0 }, + { 41335, 0x8eef }, { 41346, 0x6fe3 }, { 41357, 0xf0e8 }, { 41365, 0xffdf }, + { 41380, 0xf7f7 }, { 41394, 0x7e5f }, { 41406, 0xffff }, { 41422, 0x0dfd }, + { 41432, 0xfff8 }, { 41445, 0x93ef }, { 41456, 0xffc2 }, { 41467, 0xf7ff }, + /* 0x26000 */ + { 41482, 0x02ff }, { 41491, 0xfffc }, { 41505, 0xf0ff }, { 41517, 0x00ff }, + { 41525, 0xff58 }, { 41536, 0x7fff }, { 41551, 0xfff2 }, { 41564, 0x0013 }, + { 41567, 0xfbff }, { 41582, 0xffbf }, { 41597, 0xffc7 }, { 41610, 0x00b3 }, + { 41615, 0xfffa }, { 41629, 0xfbff }, { 41644, 0x01fd }, { 41652, 0x07ff }, + /* 0x26100 */ + { 41663, 0xfe00 }, { 41670, 0x1fff }, { 41683, 0x7ffc }, { 41696, 0xf006 }, + { 41702, 0xffff }, { 41718, 0xe03f }, { 41727, 0x15bf }, { 41737, 0xffe8 }, + { 41749, 0xff7f }, { 41764, 0xf8ff }, { 41777, 0x9eff }, { 41790, 0xf87f }, + { 41802, 0xdf3f }, { 41815, 0xdffa }, { 41828, 0x1faf }, { 41839, 0xffdf }, + /* 0x26200 */ + { 41854, 0x00eb }, { 41860, 0x0000 }, { 41860, 0xfbec }, { 41872, 0xdf7f }, + { 41886, 0xdbb7 }, { 41898, 0xeeef }, { 41911, 0xfefd }, { 41925, 0xdbbc }, + { 41936, 0xeb8f }, { 41947, 0xf3ff }, { 41961, 0xef9f }, { 41974, 0xf078 }, + { 41982, 0x3ff4 }, { 41993, 0xffc7 }, { 42006, 0xf99f }, { 42018, 0xfbbf }, + /* 0x26300 */ + { 42032, 0xe66f }, { 42043, 0xfaff }, { 42057, 0x7f1f }, { 42069, 0xddfe }, + { 42082, 0xfdcf }, { 42095, 0xfdf7 }, { 42109, 0xf7e6 }, { 42121, 0xfe05 }, + { 42130, 0x2fe9 }, { 42140, 0x27f0 }, { 42148, 0x8afc }, { 42157, 0x9f9b }, + { 42168, 0xffea }, { 42181, 0xf7e3 }, { 42193, 0xaf8f }, { 42204, 0x7ff5 }, + /* 0x26400 */ + { 42217, 0x7ffd }, { 42231, 0x5ffb }, { 42244, 0xf7fc }, { 42257, 0x7fef }, + { 42271, 0xffd1 }, { 42283, 0xff3f }, { 42297, 0x1fff }, { 42310, 0xff7f }, + { 42325, 0xfdf8 }, { 42337, 0xbe7f }, { 42350, 0xf77d }, { 42363, 0x7dce }, + { 42374, 0xd01b }, { 42381, 0x67df }, { 42393, 0xff71 }, { 42405, 0x7fb3 }, + /* 0x26500 */ + { 42417, 0xfa7f }, { 42430, 0xfdbf }, { 42444, 0xbf7f }, { 42458, 0xf3af }, + { 42470, 0xfdbf }, { 42484, 0x7dff }, { 42498, 0xffe7 }, { 42512, 0xffe6 }, + { 42525, 0x7f3d }, { 42537, 0x1fff }, { 42550, 0x9ffc }, { 42562, 0xf27f }, + { 42574, 0x27ff }, { 42586, 0x87ff }, { 42598, 0x9fff }, { 42612, 0x43fe }, + /* 0x26600 */ + { 42622, 0xefff }, { 42637, 0xe93f }, { 42648, 0xff0d }, { 42659, 0xedfc }, + { 42671, 0x2fff }, { 42684, 0x99ff }, { 42696, 0xff87 }, { 42708, 0x9fff }, + { 42722, 0x73ff }, { 42735, 0xff1e }, { 42747, 0x7fff }, { 42762, 0x2ffc }, + { 42773, 0xc03e }, { 42780, 0xfffd }, { 42795, 0x7efb }, { 42808, 0x02d8 }, + /* 0x26700 */ + { 42813, 0xfddc }, { 42825, 0x9fff }, { 42839, 0x17ff }, { 42851, 0xee68 }, + { 42860, 0x8002 }, { 42862, 0xffff }, { 42878, 0xffff }, { 42894, 0xfdff }, + { 42909, 0x0ab3 }, { 42916, 0xfee0 }, { 42926, 0xbfff }, { 42941, 0x3fe7 }, + { 42953, 0x0003 }, { 42955, 0xbb30 }, { 42963, 0xbeff }, { 42977, 0x0019 }, + /* 0x26800 */ + { 42980, 0xffff }, { 42996, 0xd6ff }, { 43009, 0x1b31 }, { 43016, 0xdf80 }, + { 43024, 0xf1ef }, { 43036, 0x19bf }, { 43046, 0x3f00 }, { 43052, 0xfff7 }, + { 43067, 0xf52f }, { 43078, 0x3ff3 }, { 43090, 0xbff0 }, { 43101, 0xbf00 }, + { 43108, 0xbfe3 }, { 43120, 0xfc4f }, { 43131, 0x7a13 }, { 43139, 0xfffe }, + /* 0x26900 */ + { 43154, 0xf47d }, { 43165, 0xef75 }, { 43177, 0x1ffe }, { 43189, 0x9efc }, + { 43200, 0xdff6 }, { 43213, 0xebbf }, { 43226, 0x6be7 }, { 43237, 0xfffc }, + { 43251, 0xd7ff }, { 43265, 0xffeb }, { 43279, 0xfebf }, { 43293, 0xff7f }, + { 43308, 0xd7f7 }, { 43321, 0xa4fb }, { 43331, 0x6dff }, { 43344, 0xdb7b }, + /* 0x26a00 */ + { 43356, 0xfffb }, { 43371, 0xb7fd }, { 43384, 0xf5df }, { 43397, 0xf4f7 }, + { 43409, 0xff98 }, { 43420, 0xf318 }, { 43428, 0x1fff }, { 43441, 0x7ff6 }, + { 43454, 0x6ff0 }, { 43464, 0x3ffe }, { 43477, 0xfeb0 }, { 43487, 0xe1c7 }, + { 43496, 0xddff }, { 43510, 0x7eb7 }, { 43522, 0xbffd }, { 43536, 0xffdf }, + /* 0x26b00 */ + { 43551, 0xfbff }, { 43566, 0xfff9 }, { 43580, 0xfeff }, { 43595, 0xffbf }, + { 43610, 0x0bff }, { 43621, 0x3ff0 }, { 43631, 0xfb04 }, { 43639, 0xffff }, + { 43655, 0xffff }, { 43671, 0xff0f }, { 43683, 0xffff }, { 43699, 0xffa8 }, + { 43710, 0xffff }, { 43726, 0xff7e }, { 43740, 0xff7f }, { 43755, 0xff1f }, + /* 0x26c00 */ + { 43768, 0xffff }, { 43784, 0x6bff }, { 43797, 0xfc82 }, { 43805, 0xffff }, + { 43821, 0xffbf }, { 43836, 0xdfff }, { 43851, 0xffff }, { 43867, 0x1ffd }, + { 43879, 0xfff8 }, { 43892, 0xffff }, { 43908, 0x97ff }, { 43921, 0x20c1 }, + { 43925, 0xffff }, { 43941, 0xffff }, { 43957, 0x7fff }, { 43972, 0xffff }, + /* 0x26d00 */ + { 43988, 0xffa7 }, { 44001, 0xffff }, { 44017, 0xf801 }, { 44023, 0xffff }, + { 44039, 0x7fff }, { 44054, 0xe007 }, { 44060, 0xfffe }, { 44075, 0xffff }, + { 44091, 0xfff7 }, { 44106, 0x0fff }, { 44118, 0xff00 }, { 44126, 0xffff }, + { 44142, 0xffff }, { 44158, 0xefbf }, { 44172, 0x040b }, { 44176, 0xbfff }, + /* 0x26e00 */ + { 44191, 0xffdf }, { 44206, 0xffff }, { 44222, 0xffdf }, { 44237, 0x07ff }, + { 44248, 0xffc0 }, { 44258, 0xffff }, { 44274, 0x451e }, { 44281, 0xe084 }, + { 44286, 0xffd7 }, { 44300, 0xffff }, { 44316, 0xffff }, { 44332, 0xffff }, + { 44348, 0x3fff }, { 44362, 0xff00 }, { 44370, 0xffff }, { 44386, 0xffff }, + /* 0x26f00 */ + { 44402, 0xfcff }, { 44416, 0x0227 }, { 44421, 0xfe16 }, { 44431, 0xffff }, + { 44447, 0xdfff }, { 44462, 0xffff }, { 44478, 0x5fff }, { 44492, 0xffe2 }, + { 44504, 0xffff }, { 44520, 0x8895 }, { 44526, 0xf482 }, { 44533, 0xffff }, + { 44549, 0xff7f }, { 44564, 0x03ff }, { 44574, 0xffff }, { 44590, 0xfe3f }, + /* 0x27000 */ + { 44603, 0x20f7 }, { 44611, 0x2ff0 }, { 44620, 0xffff }, { 44636, 0xffbf }, + { 44651, 0xbfff }, { 44666, 0xfff2 }, { 44679, 0xffff }, { 44695, 0xf801 }, + { 44701, 0xff7f }, { 44716, 0xffff }, { 44732, 0x03ba }, { 44739, 0xffff }, + { 44755, 0xc3ff }, { 44767, 0xffff }, { 44783, 0xdfff }, { 44798, 0xfe01 }, + /* 0x27100 */ + { 44806, 0xeaff }, { 44819, 0xffff }, { 44835, 0x7f0f }, { 44846, 0xffc0 }, + { 44856, 0xffff }, { 44872, 0xffdf }, { 44887, 0xc7c7 }, { 44897, 0x7ddf }, + { 44910, 0xefea }, { 44922, 0x7fff }, { 44937, 0x1ff9 }, { 44948, 0xfc7e }, + { 44960, 0x2ffe }, { 44972, 0xf1bf }, { 44984, 0x3fff }, { 44998, 0xf83e }, + /* 0x27200 */ + { 45008, 0x6bcb }, { 45018, 0xf5ef }, { 45031, 0xffb9 }, { 45044, 0xfff1 }, + { 45057, 0xffff }, { 45073, 0xd9e3 }, { 45083, 0xffff }, { 45099, 0xf8f9 }, + { 45110, 0xe1ef }, { 45121, 0xffff }, { 45137, 0xfbff }, { 45152, 0x9fc3 }, + { 45162, 0xff00 }, { 45170, 0xfbff }, { 45185, 0xff83 }, { 45196, 0x0009 }, + /* 0x27300 */ + { 45198, 0xfffa }, { 45212, 0xbfff }, { 45227, 0x3fdf }, { 45240, 0xaff0 }, + { 45250, 0x0000 }, { 45250, 0xfffe }, { 45265, 0xffff }, { 45281, 0xffff }, + { 45297, 0xff1f }, { 45310, 0xc59f }, { 45320, 0xff7e }, { 45334, 0xffff }, + { 45350, 0xffff }, { 45366, 0xf03f }, { 45376, 0x175f }, { 45386, 0xff00 }, + /* 0x27400 */ + { 45394, 0xfff7 }, { 45409, 0xffff }, { 45425, 0xeff8 }, { 45437, 0x007a }, + { 45442, 0xfff1 }, { 45455, 0xf7ff }, { 45470, 0xffff }, { 45486, 0xff1f }, + { 45499, 0xc15e }, { 45507, 0xfdff }, { 45522, 0x0ffe }, { 45533, 0xfffc }, + { 45547, 0xdf00 }, { 45554, 0xffff }, { 45570, 0x18fe }, { 45579, 0xfffe }, + /* 0x27500 */ + { 45594, 0xc1df }, { 45604, 0xe13f }, { 45614, 0xddff }, { 45628, 0x24ff }, + { 45638, 0xfffe }, { 45653, 0xf9f7 }, { 45666, 0xc1ff }, { 45677, 0xf7ff }, + { 45692, 0xfdf5 }, { 45705, 0xfffe }, { 45720, 0xbf90 }, { 45729, 0x7ffc }, + { 45742, 0xffdf }, { 45757, 0xfff7 }, { 45772, 0xffee }, { 45786, 0x8ffe }, + /* 0x27600 */ + { 45798, 0xef7f }, { 45812, 0xf64f }, { 45823, 0xffff }, { 45839, 0x7cf9 }, + { 45850, 0xffff }, { 45866, 0xff07 }, { 45877, 0xffbf }, { 45892, 0xc2ac }, + { 45899, 0xffff }, { 45915, 0x7fe7 }, { 45928, 0xfffa }, { 45942, 0xf7ff }, + { 45957, 0xe009 }, { 45962, 0xffff }, { 45978, 0x1fff }, { 45991, 0xff0f }, + /* 0x27700 */ + { 46003, 0x2dff }, { 46015, 0xe026 }, { 46021, 0xfaff }, { 46035, 0xe187 }, + { 46043, 0xbfff }, { 46058, 0x0fff }, { 46070, 0xfc0c }, { 46078, 0xffff }, + { 46094, 0xf1c7 }, { 46104, 0xfafd }, { 46117, 0xffc6 }, { 46129, 0x3fef }, + { 46142, 0xf78c }, { 46152, 0xcff7 }, { 46165, 0xefca }, { 46176, 0xff9e }, + /* 0x27800 */ + { 46189, 0xdadf }, { 46201, 0xffef }, { 46216, 0x6f0f }, { 46226, 0xf82f }, + { 46236, 0xf979 }, { 46247, 0x29ef }, { 46257, 0xffff }, { 46273, 0xef8e }, + { 46284, 0xe77f }, { 46297, 0x777c }, { 46308, 0xe9ff }, { 46321, 0xffbe }, + { 46335, 0xe3ff }, { 46348, 0x5fff }, { 46362, 0xff2e }, { 46374, 0x7ff3 }, + /* 0x27900 */ + { 46387, 0xfbf8 }, { 46399, 0xf9ff }, { 46413, 0xdecf }, { 46425, 0xfcc6 }, + { 46435, 0x3517 }, { 46443, 0x3fea }, { 46454, 0xef7e }, { 46467, 0xffbb }, + { 46481, 0xbfc7 }, { 46493, 0xfe84 }, { 46502, 0xffff }, { 46518, 0x4cff }, + { 46529, 0xff76 }, { 46542, 0xffff }, { 46558, 0x0df3 }, { 46567, 0xffff }, + /* 0x27a00 */ + { 46583, 0x8fff }, { 46596, 0x7e7f }, { 46609, 0xffd9 }, { 46622, 0xffff }, + { 46638, 0xfefd }, { 46652, 0xff43 }, { 46663, 0xffff }, { 46679, 0xfffe }, + { 46694, 0xffff }, { 46710, 0xffd7 }, { 46724, 0xffff }, { 46740, 0x86ff }, + { 46751, 0x89ff }, { 46762, 0xfffd }, { 46777, 0xffff }, { 46793, 0xe565 }, + /* 0x27b00 */ + { 46802, 0xfffd }, { 46817, 0xbeef }, { 46830, 0xffbf }, { 46845, 0xf87f }, + { 46857, 0xff7f }, { 46872, 0xff7f }, { 46887, 0xffbf }, { 46902, 0xff97 }, + { 46915, 0xdfff }, { 46930, 0xef7f }, { 46944, 0xfb2c }, { 46954, 0x3def }, + { 46966, 0xfe47 }, { 46977, 0x9f39 }, { 46987, 0xeeef }, { 47000, 0xff9b }, + /* 0x27c00 */ + { 47013, 0x3efb }, { 47025, 0x637f }, { 47036, 0xffab }, { 47049, 0xfff5 }, + { 47063, 0xe7ff }, { 47077, 0xffff }, { 47093, 0xff3f }, { 47107, 0xd9ff }, + { 47120, 0xffff }, { 47136, 0xfdbf }, { 47150, 0xf7ff }, { 47165, 0xc2ff }, + { 47176, 0xffff }, { 47192, 0xfedf }, { 47206, 0xffe7 }, { 47220, 0x5fee }, + /* 0x27d00 */ + { 47232, 0xf0fe }, { 47243, 0xe7f1 }, { 47254, 0x3d7b }, { 47265, 0xffef }, + { 47280, 0xffb7 }, { 47294, 0x37e3 }, { 47304, 0xfff9 }, { 47318, 0xe7f7 }, + { 47331, 0x7fec }, { 47343, 0xff8f }, { 47356, 0x05ff }, { 47366, 0xdfff }, + { 47381, 0xfe9f }, { 47394, 0xd6ff }, { 47407, 0xfbff }, { 47422, 0xf825 }, + /* 0x27e00 */ + { 47430, 0xffff }, { 47446, 0x47f2 }, { 47455, 0xe9ff }, { 47468, 0xf3fe }, + { 47481, 0x43c9 }, { 47488, 0x7f00 }, { 47495, 0xf09b }, { 47504, 0x23fc }, + { 47513, 0xffd0 }, { 47524, 0xefdd }, { 47537, 0xffff }, { 47553, 0xffec }, + { 47566, 0xdfff }, { 47581, 0xbffe }, { 47595, 0xd8ff }, { 47607, 0xbf7f }, + /* 0x27f00 */ + { 47621, 0xc2ff }, { 47632, 0xffff }, { 47648, 0xffef }, { 47663, 0xffff }, + { 47679, 0xfe76 }, { 47691, 0xffff }, { 47707, 0xbfff }, { 47722, 0xffd8 }, + { 47734, 0xe93f }, { 47745, 0xffff }, { 47761, 0xff7f }, { 47776, 0x1f73 }, + { 47786, 0x227f }, { 47795, 0xfffc }, { 47809, 0xc05d }, { 47816, 0xfffe }, + /* 0x28000 */ + { 47831, 0x0249 }, { 47835, 0xfff8 }, { 47848, 0x7fff }, { 47863, 0x00c2 }, + { 47866, 0xffff }, { 47882, 0x5e3f }, { 47893, 0x000d }, { 47896, 0xffe8 }, + { 47908, 0xf9ff }, { 47922, 0xf80a }, { 47929, 0xffff }, { 47945, 0x81ff }, + { 47955, 0x0003 }, { 47957, 0xfffc }, { 47971, 0x51ff }, { 47982, 0x8008 }, + /* 0x28100 */ + { 47984, 0xffe9 }, { 47997, 0x0fff }, { 48009, 0x3ffe }, { 48022, 0x0000 }, + { 48022, 0xdd60 }, { 48030, 0xffff }, { 48046, 0x07ff }, { 48057, 0x0076 }, + { 48062, 0xffff }, { 48078, 0x1df3 }, { 48088, 0xfdc0 }, { 48097, 0x183f }, + { 48105, 0x9dfe }, { 48117, 0x67d0 }, { 48125, 0xeff0 }, { 48136, 0x3c1f }, + /* 0x28200 */ + { 48145, 0xad38 }, { 48153, 0xff3b }, { 48166, 0xfe17 }, { 48177, 0xff37 }, + { 48190, 0xff0d }, { 48201, 0x0bb1 }, { 48208, 0xc1fc }, { 48217, 0x9e0f }, + { 48226, 0xe45b }, { 48235, 0x2bfd }, { 48246, 0x9e9f }, { 48257, 0xfffe }, + { 48272, 0xd0d1 }, { 48279, 0x1fff }, { 48292, 0xffc0 }, { 48302, 0x1277 }, + /* 0x28300 */ + { 48310, 0xeffe }, { 48324, 0xbe40 }, { 48331, 0xffff }, { 48347, 0x79ff }, + { 48360, 0xffef }, { 48375, 0x87df }, { 48386, 0xffa9 }, { 48398, 0x8bdf }, + { 48409, 0x3fbf }, { 48422, 0x136f }, { 48431, 0xfff6 }, { 48445, 0x53ff }, + { 48457, 0xcfe2 }, { 48467, 0xe37e }, { 48478, 0x9f5f }, { 48490, 0x677f }, + /* 0x28400 */ + { 48502, 0xb806 }, { 48508, 0xffb3 }, { 48521, 0xbf17 }, { 48532, 0x7a67 }, + { 48542, 0xafff }, { 48556, 0x4f1f }, { 48566, 0xbfff }, { 48581, 0xf0bf }, + { 48592, 0xfffb }, { 48607, 0x2cf8 }, { 48615, 0xfffd }, { 48630, 0xf00d }, + { 48637, 0x6fbf }, { 48650, 0x2bfc }, { 48660, 0xfff0 }, { 48672, 0xefff }, + /* 0x28500 */ + { 48687, 0xc829 }, { 48693, 0xfeff }, { 48708, 0xffde }, { 48722, 0x0007 }, + { 48725, 0xaffe }, { 48738, 0xfc5b }, { 48749, 0xc7ff }, { 48762, 0x317f }, + { 48772, 0xffca }, { 48784, 0xe3f9 }, { 48795, 0xfc3b }, { 48806, 0xdffb }, + { 48820, 0xf81f }, { 48830, 0xc3bd }, { 48840, 0xffee }, { 48854, 0x3fc3 }, + /* 0x28600 */ + { 48864, 0xf7bf }, { 48878, 0xfe0b }, { 48888, 0x7fcf }, { 48901, 0xb3e5 }, + { 48911, 0xc7ff }, { 48924, 0xd7bf }, { 48937, 0xebd9 }, { 48948, 0x7fe7 }, + { 48961, 0xaefc }, { 48972, 0xfffe }, { 48987, 0xfd25 }, { 48997, 0xbe7f }, + { 49010, 0xffda }, { 49023, 0xde7f }, { 49036, 0xfffb }, { 49051, 0xf9fb }, + /* 0x28700 */ + { 49064, 0xfd6f }, { 49077, 0x9fff }, { 49091, 0xe5ff }, { 49104, 0xfffd }, + { 49119, 0xfe9b }, { 49131, 0xe9bb }, { 49142, 0xfdef }, { 49156, 0xe1fb }, + { 49167, 0xf2bf }, { 49179, 0xdffe }, { 49193, 0xcfc3 }, { 49203, 0xffeb }, + { 49217, 0xe13f }, { 49227, 0xdff3 }, { 49240, 0xd9df }, { 49252, 0xfff7 }, + /* 0x28800 */ + { 49267, 0xfde7 }, { 49280, 0x79ff }, { 49293, 0x40f4 }, { 49299, 0x7fc0 }, + { 49308, 0xf826 }, { 49316, 0x3dfb }, { 49328, 0xfe0d }, { 49338, 0x61ff }, + { 49349, 0xfffb }, { 49364, 0x0e77 }, { 49373, 0xbfff }, { 49388, 0xe66f }, + { 49399, 0x48ff }, { 49409, 0xbffb }, { 49423, 0xefcb }, { 49435, 0xffdf }, + /* 0x28900 */ + { 49450, 0xf7a7 }, { 49462, 0x6fef }, { 49475, 0x376f }, { 49486, 0xc7d0 }, + { 49494, 0xfe1d }, { 49505, 0x03ff }, { 49515, 0xe7f4 }, { 49526, 0x4a6f }, + { 49535, 0xfc74 }, { 49545, 0xf25f }, { 49556, 0xfd09 }, { 49565, 0xc19f }, + { 49574, 0xfffe }, { 49589, 0x1a68 }, { 49595, 0xfff2 }, { 49608, 0xe07f }, + /* 0x28a00 */ + { 49618, 0x7fff }, { 49633, 0x20ff }, { 49642, 0xd220 }, { 49647, 0x7fff }, + { 49662, 0xf000 }, { 49666, 0xf9ff }, { 49680, 0x121f }, { 49687, 0x1620 }, + { 49691, 0xfffe }, { 49706, 0x80df }, { 49714, 0xffff }, { 49730, 0x30c1 }, + { 49735, 0xd840 }, { 49740, 0x037f }, { 49749, 0xffc0 }, { 49759, 0x2bff }, + /* 0x28b00 */ + { 49771, 0xf038 }, { 49778, 0xafdf }, { 49791, 0xc7f8 }, { 49801, 0x7fff }, + { 49816, 0x4290 }, { 49820, 0xffe9 }, { 49833, 0xef84 }, { 49842, 0x50ff }, + { 49852, 0x8019 }, { 49856, 0xccbc }, { 49865, 0x89ff }, { 49876, 0xfb80 }, + { 49884, 0xffd0 }, { 49895, 0xc697 }, { 49904, 0xe04f }, { 49912, 0x5c01 }, + /* 0x28c00 */ + { 49917, 0xfe23 }, { 49927, 0xf7f7 }, { 49941, 0xd315 }, { 49949, 0x394f }, + { 49958, 0x0000 }, { 49958, 0xff80 }, { 49967, 0x0bf4 }, { 49975, 0x86f8 }, + { 49983, 0x3fcf }, { 49995, 0xedb8 }, { 50005, 0xe3e7 }, { 50016, 0x5d5c }, + { 50025, 0xde3f }, { 50037, 0xffeb }, { 50051, 0x3faf }, { 50063, 0xfffd }, + /* 0x28d00 */ + { 50078, 0xe037 }, { 50086, 0xa3ff }, { 50098, 0xff21 }, { 50108, 0x81eb }, + { 50116, 0xbff3 }, { 50129, 0x10ff }, { 50138, 0xfff4 }, { 50151, 0x02ad }, + { 50157, 0xffff }, { 50173, 0xf444 }, { 50180, 0xf0ff }, { 50192, 0x43df }, + { 50202, 0x3efe }, { 50214, 0xfabc }, { 50225, 0x0dde }, { 50234, 0x198f }, + /* 0x28e00 */ + { 50242, 0x8000 }, { 50243, 0x7dff }, { 50257, 0xfa1f }, { 50268, 0x012f }, + { 50274, 0xdffe }, { 50288, 0xff2b }, { 50300, 0xe08f }, { 50308, 0xffef }, + { 50323, 0xfc7f }, { 50336, 0x800f }, { 50341, 0xffff }, { 50357, 0x8032 }, + { 50361, 0xffff }, { 50377, 0xfd7f }, { 50391, 0x8543 }, { 50397, 0xffff }, + /* 0x28f00 */ + { 50413, 0xfd7f }, { 50427, 0xfbff }, { 50442, 0xfc41 }, { 50450, 0xe07b }, + { 50459, 0xf0ff }, { 50471, 0xb3ff }, { 50484, 0x5def }, { 50496, 0xbf7e }, + { 50509, 0xafef }, { 50522, 0x3ffe }, { 50535, 0xcfff }, { 50549, 0xfffc }, + { 50563, 0xfb7f }, { 50577, 0x47ff }, { 50589, 0xffff }, { 50605, 0xe67f }, + /* 0x29000 */ + { 50617, 0xffff }, { 50633, 0xffbf }, { 50648, 0xfff3 }, { 50662, 0xfff3 }, + { 50676, 0xffe7 }, { 50690, 0xfbff }, { 50705, 0x3b9f }, { 50716, 0x7fe5 }, + { 50728, 0x37fc }, { 50739, 0x1dfc }, { 50749, 0x77fe }, { 50762, 0xffac }, + { 50774, 0x17ef }, { 50785, 0x7fff }, { 50800, 0xafcb }, { 50811, 0xf7f0 }, + /* 0x29100 */ + { 50822, 0x221b }, { 50828, 0xffc0 }, { 50838, 0x6aff }, { 50850, 0xff80 }, + { 50859, 0xceff }, { 50872, 0xe00d }, { 50878, 0x3fff }, { 50892, 0xf0c6 }, + { 50900, 0x03ff }, { 50910, 0x8dfe }, { 50921, 0xea70 }, { 50929, 0xa5ef }, + { 50940, 0x5f9f }, { 50952, 0xffbe }, { 50966, 0xffdb }, { 50980, 0xd7ef }, + /* 0x29200 */ + { 50993, 0xf7f8 }, { 51005, 0xbe4e }, { 51015, 0xf9ff }, { 51029, 0x7b7f }, + { 51042, 0x7fbf }, { 51056, 0xee52 }, { 51065, 0x5ffe }, { 51078, 0xff00 }, + { 51086, 0x0b3f }, { 51095, 0xffff }, { 51111, 0xfe60 }, { 51120, 0x938d }, + { 51128, 0xffff }, { 51144, 0xe83f }, { 51154, 0xffff }, { 51170, 0xf77f }, + /* 0x29300 */ + { 51184, 0xfff9 }, { 51198, 0x2cff }, { 51209, 0xffc7 }, { 51222, 0xcecf }, + { 51233, 0xceff }, { 51246, 0xfffe }, { 51261, 0xcff0 }, { 51271, 0xc3be }, + { 51281, 0xffb7 }, { 51295, 0x7fbe }, { 51308, 0xfff2 }, { 51321, 0xffef }, + { 51336, 0xcfeb }, { 51348, 0xcfff }, { 51362, 0xff7f }, { 51377, 0x0ff7 }, + /* 0x29400 */ + { 51388, 0xbebe }, { 51400, 0xdff8 }, { 51412, 0x7dff }, { 51426, 0xdef7 }, + { 51439, 0x3fef }, { 51452, 0xffff }, { 51468, 0x5fff }, { 51482, 0x7fff }, + { 51497, 0x9fff }, { 51511, 0xffff }, { 51527, 0xecd7 }, { 51538, 0xffff }, + { 51554, 0x7f7f }, { 51568, 0xe37a }, { 51578, 0xffff }, { 51594, 0x7dff }, + /* 0x29500 */ + { 51608, 0xffff }, { 51624, 0xfe19 }, { 51634, 0xb3ff }, { 51647, 0xfff9 }, + { 51661, 0xff65 }, { 51673, 0xefff }, { 51688, 0xfa7f }, { 51701, 0xd5fe }, + { 51713, 0xfcdb }, { 51725, 0xbe09 }, { 51733, 0x53fe }, { 51744, 0x7ffd }, + { 51758, 0x3ff2 }, { 51769, 0xeff8 }, { 51781, 0xff0f }, { 51793, 0x0dff }, + /* 0x29600 */ + { 51804, 0xffea }, { 51817, 0xf6ff }, { 51831, 0xe0ff }, { 51842, 0xffff }, + { 51858, 0x477f }, { 51869, 0xfede }, { 51882, 0x0012 }, { 51884, 0x34d6 }, + { 51892, 0xffff }, { 51908, 0x7fec }, { 51920, 0xff19 }, { 51931, 0xafff }, + { 51945, 0xff63 }, { 51957, 0xe8cf }, { 51967, 0xffff }, { 51983, 0xfe0a }, + /* 0x29700 */ + { 51992, 0xffff }, { 52008, 0xfcfd }, { 52021, 0xb004 }, { 52025, 0xffff }, + { 52041, 0x0267 }, { 52047, 0xef80 }, { 52055, 0x5bff }, { 52068, 0xf337 }, + { 52079, 0xffff }, { 52095, 0xc6c3 }, { 52103, 0x7fff }, { 52118, 0xf4a4 }, + { 52126, 0xbfff }, { 52141, 0x2bf8 }, { 52150, 0xe5f8 }, { 52160, 0x01d3 }, + /* 0x29800 */ + { 52166, 0x0000 }, { 52166, 0x1ee3 }, { 52175, 0x1c7c }, { 52183, 0xde85 }, + { 52192, 0x77f7 }, { 52205, 0x6d3f }, { 52216, 0x67b2 }, { 52225, 0xffaf }, + { 52239, 0xf35e }, { 52250, 0xffff }, { 52266, 0xe0eb }, { 52275, 0xffff }, + { 52291, 0x77bf }, { 52304, 0xffe7 }, { 52318, 0xe19f }, { 52328, 0xffff }, + /* 0x29900 */ + { 52344, 0x82d3 }, { 52351, 0xffcd }, { 52364, 0x7fff }, { 52379, 0xe88b }, + { 52387, 0xffff }, { 52403, 0x5ddf }, { 52415, 0xf814 }, { 52422, 0x0c1f }, + { 52429, 0xffff }, { 52445, 0xdaf3 }, { 52456, 0x31ff }, { 52467, 0xffc8 }, + { 52478, 0xcffd }, { 52491, 0x0f71 }, { 52499, 0x003f }, { 52505, 0x0000 }, + /* 0x29a00 */ + { 52505, 0x0000 }, { 52505, 0xf8e6 }, { 52515, 0xf0df }, { 52526, 0xe5ff }, + { 52539, 0xfe4f }, { 52551, 0xffa8 }, { 52562, 0xe04f }, { 52570, 0x637f }, + { 52581, 0xfe7f }, { 52595, 0x1fbf }, { 52607, 0x6fff }, { 52621, 0xdbcc }, + { 52631, 0xde7f }, { 52644, 0xf7a3 }, { 52655, 0xffff }, { 52671, 0xb69b }, + /* 0x29b00 */ + { 52681, 0x8e1b }, { 52689, 0xffff }, { 52705, 0x03c7 }, { 52712, 0xbfff }, + { 52727, 0xff8f }, { 52740, 0xe5ef }, { 52752, 0x6fff }, { 52766, 0xff80 }, + { 52775, 0x3bff }, { 52788, 0xffc0 }, { 52798, 0xc3cf }, { 52808, 0x77ff }, + { 52822, 0xfff8 }, { 52835, 0xf853 }, { 52844, 0x23f1 }, { 52852, 0x8d3f }, + /* 0x29c00 */ + { 52862, 0xfefe }, { 52876, 0xf2ff }, { 52889, 0xffff }, { 52905, 0xd2fe }, + { 52916, 0xffbb }, { 52930, 0xbfdf }, { 52944, 0xbbff }, { 52958, 0xe7bf }, + { 52971, 0xfdff }, { 52986, 0x7ff3 }, { 52999, 0xdfee }, { 53012, 0xfa49 }, + { 53021, 0xfbf7 }, { 53035, 0xbf7f }, { 53049, 0xf7ff }, { 53064, 0xf7e7 }, + /* 0x29d00 */ + { 53077, 0xefc9 }, { 53088, 0xfb7f }, { 53102, 0xef5f }, { 53115, 0xaddf }, + { 53127, 0xfdb7 }, { 53140, 0x0bfb }, { 53150, 0xffff }, { 53166, 0x13fb }, + { 53176, 0x7fff }, { 53191, 0x4c7e }, { 53200, 0xfffd }, { 53215, 0xbfc3 }, + { 53226, 0xf80c }, { 53233, 0xf7ff }, { 53248, 0x507f }, { 53257, 0xffb0 }, + /* 0x29e00 */ + { 53268, 0xffff }, { 53284, 0x9f85 }, { 53293, 0x21a5 }, { 53299, 0xd600 }, + { 53304, 0xffff }, { 53320, 0x5fc7 }, { 53331, 0x0104 }, { 53333, 0xfffe }, + { 53348, 0xe07f }, { 53358, 0x1e7f }, { 53369, 0xe800 }, { 53373, 0x7fff }, + { 53388, 0x2fe0 }, { 53396, 0xff40 }, { 53405, 0x0dff }, { 53416, 0x0174 }, + /* 0x29f00 */ + { 53421, 0x7ffc }, { 53434, 0xf1c7 }, { 53444, 0x7fe3 }, { 53456, 0xf83e }, + { 53466, 0xf11f }, { 53476, 0xfd2b }, { 53487, 0x7fcb }, { 53499, 0x00eb }, + { 53505, 0xa201 }, { 53509, 0xfbff }, { 53524, 0x1eff }, { 53536, 0xffff }, + { 53552, 0x9fff }, { 53566, 0xf8ff }, { 53579, 0x7fff }, { 53594, 0x11fe }, + /* 0x2a000 */ + { 53603, 0xbf83 }, { 53613, 0xeffe }, { 53627, 0x3fff }, { 53641, 0xb5ff }, + { 53654, 0xff01 }, { 53663, 0xffff }, { 53679, 0x7fff }, { 53694, 0xfb85 }, + { 53704, 0xffff }, { 53720, 0xefbb }, { 53733, 0x242a }, { 53738, 0xfff0 }, + { 53750, 0xffff }, { 53766, 0x3dff }, { 53779, 0x86d5 }, { 53787, 0xfe48 }, + /* 0x2a100 */ + { 53796, 0xfeff }, { 53811, 0x599f }, { 53821, 0xfe09 }, { 53830, 0xfbff }, + { 53845, 0x7fff }, { 53860, 0x947e }, { 53869, 0xc002 }, { 53872, 0xffff }, + { 53888, 0x3fff }, { 53902, 0x24f2 }, { 53909, 0xff02 }, { 53918, 0xffff }, + { 53934, 0x065e }, { 53941, 0x35fe }, { 53952, 0xf003 }, { 53958, 0x9fff }, + /* 0x2a200 */ + { 53972, 0x7efa }, { 53984, 0xff0d }, { 53995, 0xcff4 }, { 54006, 0xbfb7 }, + { 54019, 0x0001 }, { 54020, 0xffc0 }, { 54030, 0xe3db }, { 54041, 0x95ef }, + { 54052, 0xfbdf }, { 54066, 0x5bfb }, { 54078, 0xbde3 }, { 54089, 0xfffe }, + { 54104, 0xebf8 }, { 54115, 0x7ff7 }, { 54129, 0xfcae }, { 54140, 0xfd9d }, + /* 0x2a300 */ + { 54152, 0x7fee }, { 54165, 0x3df7 }, { 54177, 0xf17d }, { 54188, 0xf91f }, + { 54199, 0xfaff }, { 54213, 0xfd7f }, { 54227, 0xffff }, { 54243, 0xff7d }, + { 54257, 0xe0df }, { 54267, 0xfcfd }, { 54280, 0xfdff }, { 54295, 0x6e7d }, + { 54306, 0x7fde }, { 54319, 0x7f7a }, { 54331, 0xf1f2 }, { 54341, 0xffdf }, + /* 0x2a400 */ + { 54356, 0xff9d }, { 54369, 0xfbfe }, { 54383, 0x0df3 }, { 54392, 0x831c }, + { 54398, 0x7f1f }, { 54410, 0x7ffc }, { 54423, 0xffea }, { 54436, 0xc09f }, + { 54444, 0x993f }, { 54454, 0xff7f }, { 54469, 0xfe8f }, { 54481, 0xcf31 }, + { 54490, 0xde5b }, { 54501, 0xfdff }, { 54516, 0xf3b6 }, { 54527, 0xfbff }, + /* 0x2a500 */ + { 54542, 0xed77 }, { 54554, 0x39f7 }, { 54565, 0xdffc }, { 54578, 0xfdeb }, + { 54591, 0xff5f }, { 54605, 0xff9e }, { 54618, 0xff92 }, { 54629, 0xefe2 }, + { 54640, 0xf9ef }, { 54653, 0x0dff }, { 54664, 0xc7fe }, { 54676, 0x78f9 }, + { 54686, 0xfef6 }, { 54699, 0xff37 }, { 54712, 0xbfff }, { 54727, 0xffe4 }, + /* 0x2a600 */ + { 54739, 0xec33 }, { 54748, 0x99ff }, { 54760, 0x77f7 }, { 54773, 0xffd5 }, + { 54786, 0xffcf }, { 54800, 0xffcf }, { 54814, 0x56f8 }, { 54823, 0xbbfd }, + { 54836, 0x7b5f }, { 54848, 0xfbee }, { 54861, 0xf9e1 }, { 54871, 0xfffb }, + { 54886, 0xef5f }, { 54899, 0x007f }, +}; +static const Summary16 cns11643_inv_uni2indx_page2f8[34] = { + /* 0x2f800 */ + { 54906, 0xffff }, { 54922, 0xffff }, { 54938, 0xffff }, { 54954, 0xffff }, + { 54970, 0xfffe }, { 54985, 0xffff }, { 55001, 0xffff }, { 55017, 0xffff }, + { 55033, 0xffff }, { 55049, 0xffef }, { 55064, 0xffff }, { 55080, 0xffff }, + { 55096, 0xdfff }, { 55111, 0xffff }, { 55127, 0xffff }, { 55143, 0xffff }, + /* 0x2f900 */ + { 55159, 0xffff }, { 55175, 0xffff }, { 55191, 0xffff }, { 55207, 0xffff }, + { 55223, 0xffff }, { 55239, 0xffff }, { 55255, 0xffff }, { 55271, 0xffff }, + { 55287, 0xffff }, { 55303, 0xffef }, { 55318, 0xffff }, { 55334, 0xfffb }, + { 55349, 0xffff }, { 55365, 0xffef }, { 55380, 0xffff }, { 55396, 0xffff }, + /* 0x2fa00 */ + { 55412, 0xffff }, { 55428, 0x3fff }, +}; + +static int +cns11643_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0100) + summary = &cns11643_inv_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x0200 && wc < 0x03d0) + summary = &cns11643_inv_uni2indx_page02[(wc>>4)-0x020]; + else if (wc >= 0x2000 && wc < 0x22c0) + summary = &cns11643_inv_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x2400 && wc < 0x2650) + summary = &cns11643_inv_uni2indx_page24[(wc>>4)-0x240]; + else if (wc >= 0x3000 && wc < 0x9fb0) + summary = &cns11643_inv_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0xfa00 && wc < 0xfa30) + summary = &cns11643_inv_uni2indx_pagefa[(wc>>4)-0xfa0]; + else if (wc >= 0xfe00 && wc < 0xfff0) + summary = &cns11643_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; + else if (wc >= 0x20000 && wc < 0x2a6e0) + summary = &cns11643_inv_uni2indx_page200[(wc>>4)-0x2000]; + else if (wc >= 0x2f800 && wc < 0x2fa20) + summary = &cns11643_inv_uni2indx_page2f8[(wc>>4)-0x2f80]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + used += summary->indx; + r[0] = cns11643_inv_2charset[3*used]; + r[1] = cns11643_inv_2charset[3*used+1]; + r[2] = cns11643_inv_2charset[3*used+2]; + return 3; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/config.h b/Externals/libiconv-1.14/lib/config.h new file mode 100644 index 0000000000..7edf9a1006 --- /dev/null +++ b/Externals/libiconv-1.14/lib/config.h @@ -0,0 +1,72 @@ +/* lib/config.h. Generated from config.h.in by configure. */ +/* Copyright (C) 1999-2003, 2005, 2007, 2010 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + + +/* Define to 1 to enable a few rarely used encodings. */ +/* #undef ENABLE_EXTRA */ + +/* Define to 1 if the package shall run at any location in the filesystem. */ +/* #undef ENABLE_RELOCATABLE */ + +/* Define to a type if does not define. */ +/* #undef mbstate_t */ + +/* Define if you have , the iconv_t type, and the + iconv_open, iconv, iconv_close functions. */ +#define HAVE_ICONV 1 +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Define to 1 if you have the getc_unlocked() function. */ +#define HAVE_GETC_UNLOCKED 1 + +/* Define if you have and nl_langinfo(CODESET). */ +#define HAVE_LANGINFO_CODESET 1 + +/* Define if you have the mbrtowc() function. */ +#define HAVE_MBRTOWC 1 + +/* Define to 1 if you have the setlocale() function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDDEF_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 or 0, depending whether the compiler supports simple visibility + declarations. */ +#define HAVE_VISIBILITY 1 + +/* Define if you have the wcrtomb() function. */ +#define HAVE_WCRTOMB 1 + +/* Define to 1 if O_NOFOLLOW works. */ +#define HAVE_WORKING_O_NOFOLLOW 1 + +/* Define if the machine's byte ordering is little endian. */ +#define WORDS_LITTLEENDIAN 1 + +/* Define to the value of ${prefix}, as a string. */ +#define INSTALLPREFIX "/usr/local" + diff --git a/Externals/libiconv-1.14/lib/config.h.in b/Externals/libiconv-1.14/lib/config.h.in new file mode 100644 index 0000000000..6db23e1214 --- /dev/null +++ b/Externals/libiconv-1.14/lib/config.h.in @@ -0,0 +1,71 @@ +/* Copyright (C) 1999-2003, 2005, 2007, 2010 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + + +/* Define to 1 to enable a few rarely used encodings. */ +#undef ENABLE_EXTRA + +/* Define to 1 if the package shall run at any location in the filesystem. */ +#undef ENABLE_RELOCATABLE + +/* Define to a type if does not define. */ +#undef mbstate_t + +/* Define if you have , the iconv_t type, and the + iconv_open, iconv, iconv_close functions. */ +#undef HAVE_ICONV +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST /* empty by default */ + +/* Define to 1 if you have the getc_unlocked() function. */ +#undef HAVE_GETC_UNLOCKED + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define if you have the mbrtowc() function. */ +#undef HAVE_MBRTOWC + +/* Define to 1 if you have the setlocale() function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 or 0, depending whether the compiler supports simple visibility + declarations. */ +#undef HAVE_VISIBILITY + +/* Define if you have the wcrtomb() function. */ +#undef HAVE_WCRTOMB + +/* Define to 1 if O_NOFOLLOW works. */ +#undef HAVE_WORKING_O_NOFOLLOW + +/* Define if the machine's byte ordering is little endian. */ +#undef WORDS_LITTLEENDIAN + +/* Define to the value of ${prefix}, as a string. */ +#undef INSTALLPREFIX + diff --git a/Externals/libiconv-1.14/lib/converters.h b/Externals/libiconv-1.14/lib/converters.h new file mode 100644 index 0000000000..18c5f9966b --- /dev/null +++ b/Externals/libiconv-1.14/lib/converters.h @@ -0,0 +1,298 @@ +/* + * Copyright (C) 1999-2002, 2004-2010 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This file defines all the converters. */ + + +/* Our own notion of wide character, as UCS-4, according to ISO-10646-1. */ +typedef unsigned int ucs4_t; + +/* State used by a conversion. 0 denotes the initial state. */ +typedef unsigned int state_t; + +/* iconv_t is an opaque type. This is the real iconv_t type. */ +typedef struct conv_struct * conv_t; + +/* + * Data type for conversion multibyte -> unicode + */ +struct mbtowc_funcs { + int (*xxx_mbtowc) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); + /* + * int xxx_mbtowc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n) + * converts the byte sequence starting at s to a wide character. Up to n bytes + * are available at s. n is >= 1. + * Result is number of bytes consumed (if a wide character was read), + * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed) + * if only a shift sequence was read. + */ + int (*xxx_flushwc) (conv_t conv, ucs4_t *pwc); + /* + * int xxx_flushwc (conv_t conv, ucs4_t *pwc) + * returns to the initial state and stores the pending wide character, if any. + * Result is 1 (if a wide character was read) or 0 if none was pending. + */ +}; + +/* Return code if invalid input after a shift sequence of n bytes was read. + (xxx_mbtowc) */ +#define RET_SHIFT_ILSEQ(n) (-1-2*(n)) +/* Return code if invalid. (xxx_mbtowc) */ +#define RET_ILSEQ RET_SHIFT_ILSEQ(0) +/* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */ +#define RET_TOOFEW(n) (-2-2*(n)) +/* Retrieve the n from the encoded RET_... value. */ +#define DECODE_SHIFT_ILSEQ(r) ((unsigned int)(RET_SHIFT_ILSEQ(0) - (r)) / 2) +#define DECODE_TOOFEW(r) ((unsigned int)(RET_TOOFEW(0) - (r)) / 2) + +/* + * Data type for conversion unicode -> multibyte + */ +struct wctomb_funcs { + int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n); + /* + * int xxx_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) + * converts the wide character wc to the character set xxx, and stores the + * result beginning at r. Up to n bytes may be written at r. n is >= 1. + * Result is number of bytes written, or -1 if invalid, or -2 if n too small. + */ + int (*xxx_reset) (conv_t conv, unsigned char *r, int n); + /* + * int xxx_reset (conv_t conv, unsigned char *r, int n) + * stores a shift sequences returning to the initial state beginning at r. + * Up to n bytes may be written at r. n is >= 0. + * Result is number of bytes written, or -2 if n too small. + */ +}; + +/* Return code if invalid. (xxx_wctomb) */ +#define RET_ILUNI -1 +/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */ +#define RET_TOOSMALL -2 + +/* + * Contents of a conversion descriptor. + */ +struct conv_struct { + struct loop_funcs lfuncs; + /* Input (conversion multibyte -> unicode) */ + int iindex; + struct mbtowc_funcs ifuncs; + state_t istate; + /* Output (conversion unicode -> multibyte) */ + int oindex; + struct wctomb_funcs ofuncs; + int oflags; + state_t ostate; + /* Operation flags */ + int transliterate; + int discard_ilseq; + #ifndef LIBICONV_PLUG + struct iconv_fallbacks fallbacks; + struct iconv_hooks hooks; + #endif +}; + +/* + * Include all the converters. + */ + +#include "ascii.h" + +/* General multi-byte encodings */ +#include "utf8.h" +#include "ucs2.h" +#include "ucs2be.h" +#include "ucs2le.h" +#include "ucs4.h" +#include "ucs4be.h" +#include "ucs4le.h" +#include "utf16.h" +#include "utf16be.h" +#include "utf16le.h" +#include "utf32.h" +#include "utf32be.h" +#include "utf32le.h" +#include "utf7.h" +#include "ucs2internal.h" +#include "ucs2swapped.h" +#include "ucs4internal.h" +#include "ucs4swapped.h" +#include "c99.h" +#include "java.h" + +/* 8-bit encodings */ +#include "iso8859_1.h" +#include "iso8859_2.h" +#include "iso8859_3.h" +#include "iso8859_4.h" +#include "iso8859_5.h" +#include "iso8859_6.h" +#include "iso8859_7.h" +#include "iso8859_8.h" +#include "iso8859_9.h" +#include "iso8859_10.h" +#include "iso8859_11.h" +#include "iso8859_13.h" +#include "iso8859_14.h" +#include "iso8859_15.h" +#include "iso8859_16.h" +#include "koi8_r.h" +#include "koi8_u.h" +#include "koi8_ru.h" +#include "cp1250.h" +#include "cp1251.h" +#include "cp1252.h" +#include "cp1253.h" +#include "cp1254.h" +#include "cp1255.h" +#include "cp1256.h" +#include "cp1257.h" +#include "cp1258.h" +#include "cp850.h" +#include "cp862.h" +#include "cp866.h" +#include "cp1131.h" +#include "mac_roman.h" +#include "mac_centraleurope.h" +#include "mac_iceland.h" +#include "mac_croatian.h" +#include "mac_romania.h" +#include "mac_cyrillic.h" +#include "mac_ukraine.h" +#include "mac_greek.h" +#include "mac_turkish.h" +#include "mac_hebrew.h" +#include "mac_arabic.h" +#include "mac_thai.h" +#include "hp_roman8.h" +#include "nextstep.h" +#include "armscii_8.h" +#include "georgian_academy.h" +#include "georgian_ps.h" +#include "koi8_t.h" +#include "pt154.h" +#include "rk1048.h" +#include "mulelao.h" +#include "cp1133.h" +#include "tis620.h" +#include "cp874.h" +#include "viscii.h" +#include "tcvn.h" + +/* CJK character sets [CCS = coded character set] [CJKV.INF chapter 3] */ + +typedef struct { + unsigned short indx; /* index into big table */ + unsigned short used; /* bitmask of used entries */ +} Summary16; + +#include "iso646_jp.h" +#include "jisx0201.h" +#include "jisx0208.h" +#include "jisx0212.h" + +#include "iso646_cn.h" +#include "gb2312.h" +#include "isoir165.h" +/*#include "gb12345.h"*/ +#include "gbk.h" +#include "cns11643.h" +#include "big5.h" + +#include "ksc5601.h" +#include "johab_hangul.h" + +/* CJK encodings [CES = character encoding scheme] [CJKV.INF chapter 4] */ + +#include "euc_jp.h" +#include "sjis.h" +#include "cp932.h" +#include "iso2022_jp.h" +#include "iso2022_jp1.h" +#include "iso2022_jp2.h" + +#include "euc_cn.h" +#include "ces_gbk.h" +#include "cp936.h" +#include "gb18030.h" +#include "iso2022_cn.h" +#include "iso2022_cnext.h" +#include "hz.h" +#include "euc_tw.h" +#include "ces_big5.h" +#include "cp950.h" +#include "big5hkscs1999.h" +#include "big5hkscs2001.h" +#include "big5hkscs2004.h" +#include "big5hkscs2008.h" + +#include "euc_kr.h" +#include "cp949.h" +#include "johab.h" +#include "iso2022_kr.h" + +/* Encodings used by system dependent locales. */ + +#ifdef USE_AIX +#include "cp856.h" +#include "cp922.h" +#include "cp943.h" +#include "cp1046.h" +#include "cp1124.h" +#include "cp1129.h" +#include "cp1161.h" +#include "cp1162.h" +#include "cp1163.h" +#endif + +#ifdef USE_OSF1 +#include "dec_kanji.h" +#include "dec_hanyu.h" +#endif + +#ifdef USE_DOS +#include "cp437.h" +#include "cp737.h" +#include "cp775.h" +#include "cp852.h" +#include "cp853.h" +#include "cp855.h" +#include "cp857.h" +#include "cp858.h" +#include "cp860.h" +#include "cp861.h" +#include "cp863.h" +#include "cp864.h" +#include "cp865.h" +#include "cp869.h" +#include "cp1125.h" +#endif + +#ifdef USE_EXTRA +#include "euc_jisx0213.h" +#include "shift_jisx0213.h" +#include "iso2022_jp3.h" +#include "big5_2003.h" +#include "tds565.h" +#include "atarist.h" +#include "riscos1.h" +#endif + diff --git a/Externals/libiconv-1.14/lib/cp1046.h b/Externals/libiconv-1.14/lib/cp1046.h new file mode 100644 index 0000000000..b6716b73db --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1046.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1046 + */ + +static const unsigned short cp1046_2uni[128] = { + /* 0x80 */ + 0xfe88, 0x00d7, 0x00f7, 0xf8f6, 0xf8f5, 0xf8f4, 0xf8f7, 0xfe71, + 0x0088, 0x25a0, 0x2502, 0x2500, 0x2510, 0x250c, 0x2514, 0x2518, + /* 0x90 */ + 0xfe79, 0xfe7b, 0xfe7d, 0xfe7f, 0xfe77, 0xfe8a, 0xfef0, 0xfef3, + 0xfef2, 0xfece, 0xfecf, 0xfed0, 0xfef6, 0xfef8, 0xfefa, 0xfefc, + /* 0xa0 */ + 0x00a0, 0xf8fa, 0xf8f9, 0xf8f8, 0x00a4, 0xf8fb, 0xfe8b, 0xfe91, + 0xfe97, 0xfe9b, 0xfe9f, 0xfea3, 0x060c, 0x00ad, 0xfea7, 0xfeb3, + /* 0xb0 */ + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0xfeb7, 0x061b, 0xfebb, 0xfebf, 0xfeca, 0x061f, + /* 0xc0 */ + 0xfecb, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + /* 0xd0 */ + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0xfec7, 0x0639, 0x063a, 0xfecc, 0xfe82, 0xfe84, 0xfe8e, 0xfed3, + /* 0xe0 */ + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + /* 0xf0 */ + 0x0650, 0x0651, 0x0652, 0xfed7, 0xfedb, 0xfedf, 0xf8fc, 0xfef5, + 0xfef7, 0xfef9, 0xfefb, 0xfee3, 0xfee7, 0xfeec, 0xfee9, 0xfffd, +}; + +static int +cp1046_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1046_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1046_page00[112] = { + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, /* 0xf0-0xf7 */ +}; +static const unsigned char cp1046_page06[104] = { + 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0x00, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ + 0xb8, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ +}; +static const unsigned char cp1046_page25[32] = { + 0x8b, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char cp1046_pagef8[16] = { + 0x00, 0x00, 0x00, 0x00, 0x85, 0x84, 0x83, 0x86, /* 0xf0-0xf7 */ + 0xa3, 0xa2, 0xa1, 0xa5, 0xf6, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp1046_pagefe[144] = { + 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, /* 0x70-0x77 */ + 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, /* 0x78-0x7f */ + 0x00, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x80, 0x00, 0x95, 0xa6, 0x00, 0x00, 0xde, 0x00, /* 0x88-0x8f */ + 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xae, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xba, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbd, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, /* 0xc0-0xc7 */ + 0x00, 0x00, 0xbe, 0xc0, 0xdb, 0x00, 0x99, 0x9a, /* 0xc8-0xcf */ + 0x9b, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xf3, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf5, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfc, /* 0xe0-0xe7 */ + 0x00, 0xfe, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x96, 0x00, 0x98, 0x97, 0x00, 0xf7, 0x9c, 0xf8, /* 0xf0-0xf7 */ + 0x9d, 0xf9, 0x9e, 0xfa, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; + +static int +cp1046_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x0088 && wc < 0x00f8) + c = cp1046_page00[wc-0x0088]; + else if (wc >= 0x0608 && wc < 0x0670) + c = cp1046_page06[wc-0x0608]; + else if (wc >= 0x2500 && wc < 0x2520) + c = cp1046_page25[wc-0x2500]; + else if (wc == 0x25a0) + c = 0x89; + else if (wc >= 0xf8f0 && wc < 0xf900) + c = cp1046_pagef8[wc-0xf8f0]; + else if (wc >= 0xfe70 && wc < 0xff00) + c = cp1046_pagefe[wc-0xfe70]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1124.h b/Externals/libiconv-1.14/lib/cp1124.h new file mode 100644 index 0000000000..8b97a7e851 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1124.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1124 + */ + +static const unsigned short cp1124_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0401, 0x0402, 0x0490, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + /* 0xb0 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0xc0 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xd0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xe0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + /* 0xf0 */ + 0x2116, 0x0451, 0x0452, 0x0491, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, +}; + +static int +cp1124_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp1124_2uni[c-0xa0]; + return 1; +} + +static const unsigned char cp1124_page00[16] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ +}; +static const unsigned char cp1124_page04[152] = { + 0x00, 0xa1, 0xa2, 0x00, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0x00, 0xf1, 0xf2, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xa3, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; + +static int +cp1124_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b0) + c = cp1124_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = cp1124_page04[wc-0x0400]; + else if (wc == 0x2116) + c = 0xf0; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1125.h b/Externals/libiconv-1.14/lib/cp1125.h new file mode 100644 index 0000000000..802f0742d6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1125.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1125 + */ + +static const unsigned short cp1125_2uni[80] = { + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + /* 0xf0 */ + 0x0401, 0x0451, 0x0490, 0x0491, 0x0404, 0x0454, 0x0406, 0x0456, + 0x0407, 0x0457, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, +}; + +static int +cp1125_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else if (c < 0xb0) + *pwc = (ucs4_t) c + 0x0390; + else + *pwc = (ucs4_t) cp1125_2uni[c-0xb0]; + return 1; +} + +static const unsigned char cp1125_page00[24] = { + 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ +}; +static const unsigned char cp1125_page04[152] = { + 0x00, 0xf0, 0x00, 0x00, 0xf4, 0x00, 0xf6, 0xf8, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0x00, 0xf1, 0x00, 0x00, 0xf5, 0x00, 0xf7, 0xf9, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xf2, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1125_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp1125_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b8) + c = cp1125_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = cp1125_page04[wc-0x0400]; + else if (wc == 0x2116) + c = 0xfc; + else if (wc == 0x221a) + c = 0xfb; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp1125_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1129.h b/Externals/libiconv-1.14/lib/cp1129.h new file mode 100644 index 0000000000..1b7cff8594 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1129.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1129 + */ + +static const unsigned short cp1129_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x0153, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0178, 0x00b5, 0x00b6, 0x00b7, + 0x0152, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, +}; + +static int +cp1129_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp1129_2uni[c-0xa0]; + return 1; +} + +static const unsigned char cp1129_page00[272] = { + 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ + 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xb8, 0xa8, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ +}; +static const unsigned char cp1129_page03[40] = { + 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; + +static int +cp1129_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a8) { + *r = wc; + return 1; + } + else if (wc >= 0x00a8 && wc < 0x01b8) + c = cp1129_page00[wc-0x00a8]; + else if (wc >= 0x0300 && wc < 0x0328) + c = cp1129_page03[wc-0x0300]; + else if (wc == 0x20ab) + c = 0xfe; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1131.h b/Externals/libiconv-1.14/lib/cp1131.h new file mode 100644 index 0000000000..15f4ed2acc --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1131.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1131 + */ + +static const unsigned short cp1131_2uni[128] = { + /* 0x80 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0x90 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xa0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + /* 0xf0 */ + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, + 0x0406, 0x0456, 0x00b7, 0x00a4, 0x0490, 0x0491, 0x2219, 0x00a0, +}; + +static int +cp1131_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp1131_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp1131_page00[24] = { + 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ +}; +static const unsigned char cp1131_page04[152] = { + 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0xf8, 0xf4, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0xf9, 0xf5, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xfc, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1131_page25[152] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; + +static int +cp1131_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b8) + c = cp1131_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = cp1131_page04[wc-0x0400]; + else if (wc == 0x2219) + c = 0xfe; + else if (wc >= 0x2500 && wc < 0x2598) + c = cp1131_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1133.h b/Externals/libiconv-1.14/lib/cp1133.h new file mode 100644 index 0000000000..a16d93f1a4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1133.h @@ -0,0 +1,110 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * IBM-CP1133 + */ + +static const unsigned short cp1133_2uni_1[64] = { + /* 0xa0 */ + 0x00a0, 0x0e81, 0x0e82, 0x0e84, 0x0e87, 0x0e88, 0x0eaa, 0x0e8a, + 0x0e8d, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0e99, 0x0e9a, 0x0e9b, + /* 0xb0 */ + 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea5, + 0x0ea7, 0x0eab, 0x0ead, 0x0eae, 0xfffd, 0xfffd, 0xfffd, 0x0eaf, + /* 0xc0 */ + 0x0eb0, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, + 0x0eb9, 0x0ebc, 0x0eb1, 0x0ebb, 0x0ebd, 0xfffd, 0xfffd, 0xfffd, + /* 0xd0 */ + 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec8, 0x0ec9, 0x0eca, + 0x0ecb, 0x0ecc, 0x0ecd, 0x0ec6, 0xfffd, 0x0edc, 0x0edd, 0x20ad, +}; +static const unsigned short cp1133_2uni_2[16] = { + /* 0xf0 */ + 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, + 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x00a2, 0x00ac, 0x00a6, 0xfffd, +}; + +static int +cp1133_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0xe0) { + unsigned short wc = cp1133_2uni_1[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + else if (c < 0xf0) { + } + else { + unsigned short wc = cp1133_2uni_2[c-0xf0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1133_page00[16] = { + 0xa0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ +}; +static const unsigned char cp1133_page0e[96] = { + 0x00, 0xa1, 0xa2, 0x00, 0xa3, 0x00, 0x00, 0xa4, /* 0x80-0x87 */ + 0xa5, 0x00, 0xa7, 0x00, 0x00, 0xa8, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0xa9, 0xaa, 0xab, 0xac, /* 0x90-0x97 */ + 0x00, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, /* 0x98-0x9f */ + 0x00, 0xb4, 0xb5, 0xb6, 0x00, 0xb7, 0x00, 0xb8, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xa6, 0xb9, 0x00, 0xba, 0xbb, 0xbf, /* 0xa8-0xaf */ + 0xc0, 0xca, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, /* 0xb0-0xb7 */ + 0xc7, 0xc8, 0x00, 0xcb, 0xc9, 0xcc, 0x00, 0x00, /* 0xb8-0xbf */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xdb, 0x00, /* 0xc0-0xc7 */ + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0x00, 0x00, /* 0xc8-0xcf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */ + 0xf8, 0xf9, 0x00, 0x00, 0xdd, 0xde, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +cp1133_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b0) + c = cp1133_page00[wc-0x00a0]; + else if (wc >= 0x0e80 && wc < 0x0ee0) + c = cp1133_page0e[wc-0x0e80]; + else if (wc == 0x20ad) + c = 0xdf; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1161.h b/Externals/libiconv-1.14/lib/cp1161.h new file mode 100644 index 0000000000..b6349c67c4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1161.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1161 + */ + +static const unsigned short cp1161_2uni[96] = { + /* 0xa0 */ + 0x0e48, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + /* 0xb0 */ + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + /* 0xc0 */ + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + /* 0xd0 */ + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0x0e49, 0x0e4a, 0x0e4b, 0x20ac, 0x0e3f, + /* 0xe0 */ + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, + /* 0xf0 */ + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x00a2, 0x00ac, 0x00a6, 0x00a0, +}; + +static int +cp1161_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0xa0) { + } + else { + *pwc = (ucs4_t) cp1161_2uni[c-0xa0]; + return 1; + } + return RET_ILSEQ; +} + +static const unsigned char cp1161_page00[16] = { + 0xff, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ +}; + +static int +cp1161_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b0) + c = cp1161_page00[wc-0x00a0]; + else if (wc >= 0x0e48 && wc < 0x0e4c) + c = wc-0x0d60; + else if (wc >= 0x0e00 && wc < 0x0e60) + c = cp874_page0e[wc-0x0e00]; + else if (wc == 0x20ac) + c = 0xde; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1162.h b/Externals/libiconv-1.14/lib/cp1162.h new file mode 100644 index 0000000000..6c7fa82ae5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1162.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1162 + */ + +static int +cp1162_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp874_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + } + return RET_ILSEQ; +} + +static int +cp1162_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x0080 && wc < 0x00a0 && cp874_2uni[wc-0x0080] == 0xfffd) + c = wc; + else if (wc == 0x00a0) + c = 0xa0; + else if (wc >= 0x0e00 && wc < 0x0e60) + c = cp874_page0e[wc-0x0e00]; + else if (wc >= 0x2010 && wc < 0x2028) + c = cp874_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1163.h b/Externals/libiconv-1.14/lib/cp1163.h new file mode 100644 index 0000000000..ca5d0b07d1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1163.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1163 + */ + +static int +cp1163_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else if (c == 0xa4) + *pwc = 0x20ac; + else + *pwc = (ucs4_t) cp1129_2uni[c-0xa0]; + return 1; +} + +static const unsigned char cp1163_page20[8] = { + 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ +}; + +static int +cp1163_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0 || (wc < 0x00a8 && wc != 0x00a4) || wc == 0x00d0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a8 && wc < 0x01b8) + c = cp1129_page00[wc-0x00a8]; + else if (wc >= 0x0300 && wc < 0x0328) + c = cp1129_page03[wc-0x0300]; + else if (wc == 0x203e) + c = 0xaf; + else if (wc >= 0x20a8 && wc < 0x20b0) + c = cp1163_page20[wc-0x20a8]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1250.h b/Externals/libiconv-1.14/lib/cp1250.h new file mode 100644 index 0000000000..b89300fecb --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1250.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1250 + */ + +static const unsigned short cp1250_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, + 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, + /* 0xa0 */ + 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, + /* 0xc0 */ + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + /* 0xd0 */ + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + /* 0xe0 */ + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + /* 0xf0 */ + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, +}; + +static int +cp1250_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1250_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1250_page00[224] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ + 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc3, 0xe3, 0xa5, 0xb9, 0xc6, 0xe6, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xbc, 0xbe, 0x00, /* 0x38-0x3f */ + 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ + 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ + 0xd8, 0xf8, 0x8c, 0x9c, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ + 0x8a, 0x9a, 0xde, 0xfe, 0x8d, 0x9d, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ + 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x8f, 0x9f, 0xaf, 0xbf, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char cp1250_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1250_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1250_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = cp1250_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1250_page02[wc-0x02c0]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1250_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1251.h b/Externals/libiconv-1.14/lib/cp1251.h new file mode 100644 index 0000000000..0fa540db49 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1251.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1251 + */ + +static const unsigned short cp1251_2uni[128] = { + /* 0x80 */ + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, + 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, + /* 0x90 */ + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, + /* 0xa0 */ + 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, + 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, + 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, + /* 0xc0 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0xd0 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xe0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xf0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, +}; + +static int +cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1251_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1251_page00[32] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char cp1251_page04[152] = { + 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ + 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ + 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ + 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1251_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = cp1251_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = cp1251_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1251_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x88; + else if (wc == 0x2116) + c = 0xb9; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1252.h b/Externals/libiconv-1.14/lib/cp1252.h new file mode 100644 index 0000000000..15644423ad --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1252.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1252 + */ + +static const unsigned short cp1252_2uni[32] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, +}; + +static int +cp1252_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80 || c >= 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1252_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1252_page01[72] = { + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1252_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1252_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1252_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = wc; + else if (wc >= 0x0150 && wc < 0x0198) + c = cp1252_page01[wc-0x0150]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1252_page02[wc-0x02c0]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1252_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1253.h b/Externals/libiconv-1.14/lib/cp1253.h new file mode 100644 index 0000000000..020f0d6e05 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1253.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1253 + */ + +static const unsigned short cp1253_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa0 */ + 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, + 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, + /* 0xc0 */ + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + /* 0xd0 */ + 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, + /* 0xe0 */ + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + /* 0xf0 */ + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, +}; + +static int +cp1253_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1253_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1253_page00[32] = { + 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char cp1253_page03[80] = { + 0x00, 0x00, 0x00, 0x00, 0xb4, 0xa1, 0xa2, 0x00, /* 0x80-0x87 */ + 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ + 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ +}; +static const unsigned char cp1253_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1253_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = cp1253_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x83; + else if (wc >= 0x0380 && wc < 0x03d0) + c = cp1253_page03[wc-0x0380]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1253_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1254.h b/Externals/libiconv-1.14/lib/cp1254.h new file mode 100644 index 0000000000..845a01b894 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1254.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1254 + */ + +static const unsigned short cp1254_2uni_1[32] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, +}; +static const unsigned short cp1254_2uni_2[16] = { + /* 0xd0 */ + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, +}; +static const unsigned short cp1254_2uni_3[16] = { + /* 0xf0 */ + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, +}; + +static int +cp1254_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0xa0) { + unsigned short wc = cp1254_2uni_1[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + else if (c < 0xd0) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0xe0) { + *pwc = (ucs4_t) cp1254_2uni_2[c-0xd0]; + return 1; + } + else if (c < 0xf0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + *pwc = (ucs4_t) cp1254_2uni_3[c-0xf0]; + return 1; + } + return RET_ILSEQ; +} + +static const unsigned char cp1254_page00[48] = { + 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ +}; +static const unsigned char cp1254_page01[128] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ + 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1254_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1254_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1254_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00d0) + c = wc; + else if (wc >= 0x00d0 && wc < 0x0100) + c = cp1254_page00[wc-0x00d0]; + else if (wc >= 0x0118 && wc < 0x0198) + c = cp1254_page01[wc-0x0118]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1254_page02[wc-0x02c0]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1254_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1255.h b/Externals/libiconv-1.14/lib/cp1255.h new file mode 100644 index 0000000000..e7761aeb5b --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1255.h @@ -0,0 +1,380 @@ +/* + * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1255 + */ + +#include "flushwc.h" + +/* Combining characters used in Hebrew encoding CP1255. */ + +/* Relevant combining characters: + 0x05b4, 0x05b7, 0x05b8, 0x05b9, 0x05bc, 0x05bf, 0x05c1, 0x05c2. */ + +/* Composition tables for each of the relevant combining characters. */ +static const struct { unsigned short base; unsigned short composed; } cp1255_comp_table_data[] = { +#define cp1255_comp_table05b4_idx 0 +#define cp1255_comp_table05b4_len 1 + { 0x05D9, 0xFB1D }, +#define cp1255_comp_table05b7_idx (cp1255_comp_table05b4_idx+cp1255_comp_table05b4_len) +#define cp1255_comp_table05b7_len 2 + { 0x05D0, 0xFB2E }, + { 0x05F2, 0xFB1F }, +#define cp1255_comp_table05b8_idx (cp1255_comp_table05b7_idx+cp1255_comp_table05b7_len) +#define cp1255_comp_table05b8_len 1 + { 0x05D0, 0xFB2F }, +#define cp1255_comp_table05b9_idx (cp1255_comp_table05b8_idx+cp1255_comp_table05b8_len) +#define cp1255_comp_table05b9_len 1 + { 0x05D5, 0xFB4B }, +#define cp1255_comp_table05bc_idx (cp1255_comp_table05b9_idx+cp1255_comp_table05b9_len) +#define cp1255_comp_table05bc_len 24 + { 0x05D0, 0xFB30 }, + { 0x05D1, 0xFB31 }, + { 0x05D2, 0xFB32 }, + { 0x05D3, 0xFB33 }, + { 0x05D4, 0xFB34 }, + { 0x05D5, 0xFB35 }, + { 0x05D6, 0xFB36 }, + { 0x05D8, 0xFB38 }, + { 0x05D9, 0xFB39 }, + { 0x05DA, 0xFB3A }, + { 0x05DB, 0xFB3B }, + { 0x05DC, 0xFB3C }, + { 0x05DE, 0xFB3E }, + { 0x05E0, 0xFB40 }, + { 0x05E1, 0xFB41 }, + { 0x05E3, 0xFB43 }, + { 0x05E4, 0xFB44 }, + { 0x05E6, 0xFB46 }, + { 0x05E7, 0xFB47 }, + { 0x05E8, 0xFB48 }, + { 0x05E9, 0xFB49 }, + { 0x05EA, 0xFB4A }, + { 0xFB2A, 0xFB2C }, + { 0xFB2B, 0xFB2D }, +#define cp1255_comp_table05bf_idx (cp1255_comp_table05bc_idx+cp1255_comp_table05bc_len) +#define cp1255_comp_table05bf_len 3 + { 0x05D1, 0xFB4C }, + { 0x05DB, 0xFB4D }, + { 0x05E4, 0xFB4E }, +#define cp1255_comp_table05c1_idx (cp1255_comp_table05bf_idx+cp1255_comp_table05bf_len) +#define cp1255_comp_table05c1_len 2 + { 0x05E9, 0xFB2A }, + { 0xFB49, 0xFB2C }, +#define cp1255_comp_table05c2_idx (cp1255_comp_table05c1_idx+cp1255_comp_table05c1_len) +#define cp1255_comp_table05c2_len 2 + { 0x05E9, 0xFB2B }, + { 0xFB49, 0xFB2D }, +}; +static const struct { unsigned int len; unsigned int idx; } cp1255_comp_table[] = { + { cp1255_comp_table05b4_len, cp1255_comp_table05b4_idx }, + { cp1255_comp_table05b7_len, cp1255_comp_table05b7_idx }, + { cp1255_comp_table05b8_len, cp1255_comp_table05b8_idx }, + { cp1255_comp_table05b9_len, cp1255_comp_table05b9_idx }, + { cp1255_comp_table05bc_len, cp1255_comp_table05bc_idx }, + { cp1255_comp_table05bf_len, cp1255_comp_table05bf_idx }, + { cp1255_comp_table05c1_len, cp1255_comp_table05c1_idx }, + { cp1255_comp_table05c2_len, cp1255_comp_table05c2_idx }, +}; + +/* Decomposition table for the relevant Unicode characters. */ +struct cp1255_decomp { unsigned short composed; unsigned short base; int comb1 : 8; signed int comb2 : 8; }; +static const struct cp1255_decomp cp1255_decomp_table[] = { + { 0xFB1D, 0x05D9, 0, -1 }, + { 0xFB1F, 0x05F2, 1, -1 }, + { 0xFB2A, 0x05E9, 6, -1 }, + { 0xFB2B, 0x05E9, 7, -1 }, + { 0xFB2C, 0x05E9, 4, 6 }, + { 0xFB2D, 0x05E9, 4, 7 }, + { 0xFB2E, 0x05D0, 1, -1 }, + { 0xFB2F, 0x05D0, 2, -1 }, + { 0xFB30, 0x05D0, 4, -1 }, + { 0xFB31, 0x05D1, 4, -1 }, + { 0xFB32, 0x05D2, 4, -1 }, + { 0xFB33, 0x05D3, 4, -1 }, + { 0xFB34, 0x05D4, 4, -1 }, + { 0xFB35, 0x05D5, 4, -1 }, + { 0xFB36, 0x05D6, 4, -1 }, + { 0xFB38, 0x05D8, 4, -1 }, + { 0xFB39, 0x05D9, 4, -1 }, + { 0xFB3A, 0x05DA, 4, -1 }, + { 0xFB3B, 0x05DB, 4, -1 }, + { 0xFB3C, 0x05DC, 4, -1 }, + { 0xFB3E, 0x05DE, 4, -1 }, + { 0xFB40, 0x05E0, 4, -1 }, + { 0xFB41, 0x05E1, 4, -1 }, + { 0xFB43, 0x05E3, 4, -1 }, + { 0xFB44, 0x05E4, 4, -1 }, + { 0xFB46, 0x05E6, 4, -1 }, + { 0xFB47, 0x05E7, 4, -1 }, + { 0xFB48, 0x05E8, 4, -1 }, + { 0xFB49, 0x05E9, 4, -1 }, + { 0xFB4A, 0x05EA, 4, -1 }, + { 0xFB4B, 0x05D5, 3, -1 }, + { 0xFB4C, 0x05D1, 5, -1 }, + { 0xFB4D, 0x05DB, 5, -1 }, + { 0xFB4E, 0x05E4, 5, -1 }, +}; + +static const unsigned char cp1255_comb_table[] = { + 0xc4, 0xc7, 0xc8, 0xc9, 0xcc, 0xcf, 0xd1, 0xd2, +}; + +static const unsigned short cp1255_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa0 */ + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + /* 0xc0 */ + 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, + 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, + /* 0xd0 */ + 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, + 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xe0 */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + /* 0xf0 */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, +}; + +/* In the CP1255 to Unicode direction, the state contains a buffered + character, or 0 if none. */ + +static int +cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + unsigned short wc; + unsigned short last_wc; + if (c < 0x80) { + wc = c; + } else { + wc = cp1255_2uni[c-0x80]; + if (wc == 0xfffd) + return RET_ILSEQ; + } + last_wc = conv->istate; + if (last_wc) { + if (wc >= 0x05b0 && wc < 0x05c5) { + /* See whether last_wc and wc can be combined. */ + unsigned int k; + unsigned int i1, i2; + switch (wc) { + case 0x05b4: k = 0; break; + case 0x05b7: k = 1; break; + case 0x05b8: k = 2; break; + case 0x05b9: k = 3; break; + case 0x05bc: k = 4; break; + case 0x05bf: k = 5; break; + case 0x05c1: k = 6; break; + case 0x05c2: k = 7; break; + default: goto not_combining; + } + i1 = cp1255_comp_table[k].idx; + i2 = i1 + cp1255_comp_table[k].len-1; + if (last_wc >= cp1255_comp_table_data[i1].base + && last_wc <= cp1255_comp_table_data[i2].base) { + unsigned int i; + for (;;) { + i = (i1+i2)>>1; + if (last_wc == cp1255_comp_table_data[i].base) + break; + if (last_wc < cp1255_comp_table_data[i].base) { + if (i1 == i) + goto not_combining; + i2 = i; + } else { + if (i1 != i) + i1 = i; + else { + i = i2; + if (last_wc == cp1255_comp_table_data[i].base) + break; + goto not_combining; + } + } + } + last_wc = cp1255_comp_table_data[i].composed; + if (last_wc == 0xfb2a || last_wc == 0xfb2b || last_wc == 0xfb49) { + /* Buffer the combined character. */ + conv->istate = last_wc; + return RET_TOOFEW(1); + } else { + /* Output the combined character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 1; + } + } + } + not_combining: + /* Output the buffered character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 0; /* Don't advance the input pointer. */ + } + if ((wc >= 0x05d0 && wc <= 0x05ea && ((0x07db5f7f >> (wc - 0x05d0)) & 1)) + || wc == 0x05f2) { + /* wc is a possible match in cp1255_comp_table_data. Buffer it. */ + conv->istate = wc; + return RET_TOOFEW(1); + } else { + /* Output wc immediately. */ + *pwc = (ucs4_t) wc; + return 1; + } +} + +#define cp1255_flushwc normal_flushwc + +static const unsigned char cp1255_page00[88] = { + 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ +}; +static const unsigned char cp1255_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1255_page05[72] = { + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */ + 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */ + 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ + 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ +}; +static const unsigned char cp1255_page20[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = cp1255_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x83; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1255_page02[wc-0x02c0]; + else if (wc >= 0x05b0 && wc < 0x05f8) + c = cp1255_page05[wc-0x05b0]; + else if (wc >= 0x2008 && wc < 0x2040) + c = cp1255_page20[wc-0x2008]; + else if (wc == 0x20aa) + c = 0xa4; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + /* Try canonical decomposition. */ + { + /* Binary search through cp1255_decomp_table. */ + unsigned int i1 = 0; + unsigned int i2 = sizeof(cp1255_decomp_table)/sizeof(cp1255_decomp_table[0])-1; + if (wc >= cp1255_decomp_table[i1].composed + && wc <= cp1255_decomp_table[i2].composed) { + unsigned int i; + for (;;) { + /* Here i2 - i1 > 0. */ + i = (i1+i2)>>1; + if (wc == cp1255_decomp_table[i].composed) + break; + if (wc < cp1255_decomp_table[i].composed) { + if (i1 == i) + return RET_ILUNI; + /* Here i1 < i < i2. */ + i2 = i; + } else { + /* Here i1 <= i < i2. */ + if (i1 != i) + i1 = i; + else { + /* Here i2 - i1 = 1. */ + i = i2; + if (wc == cp1255_decomp_table[i].composed) + break; + else + return RET_ILUNI; + } + } + } + /* Found a canonical decomposition. */ + wc = cp1255_decomp_table[i].base; + /* wc is one of 0x05d0..0x05d6, 0x05d8..0x05dc, 0x05de, 0x05e0..0x05e1, + 0x05e3..0x05e4, 0x05e6..0x05ea, 0x05f2. */ + c = cp1255_page05[wc-0x05b0]; + if (cp1255_decomp_table[i].comb2 < 0) { + if (n < 2) + return RET_TOOSMALL; + r[0] = c; + r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; + return 2; + } else { + if (n < 3) + return RET_TOOSMALL; + r[0] = c; + r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; + r[2] = cp1255_comb_table[cp1255_decomp_table[i].comb2]; + return 3; + } + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1256.h b/Externals/libiconv-1.14/lib/cp1256.h new file mode 100644 index 0000000000..3804e8f4bd --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1256.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1256 + */ + +static const unsigned short cp1256_2uni[128] = { + /* 0x80 */ + 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + /* 0x90 */ + 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, + /* 0xa0 */ + 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, + /* 0xc0 */ + 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + /* 0xd0 */ + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, + 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, + /* 0xe0 */ + 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, + 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, +}; + +static int +cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp1256_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp1256_page00[96] = { + 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */ + 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp1256_page01[72] = { + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char cp1256_page06[208] = { + 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */ + 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */ + 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */ + 0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */ + 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */ + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ +}; +static const unsigned char cp1256_page20[56] = { + 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp1256_page00[wc-0x00a0]; + else if (wc >= 0x0150 && wc < 0x0198) + c = cp1256_page01[wc-0x0150]; + else if (wc == 0x02c6) + c = 0x88; + else if (wc >= 0x0608 && wc < 0x06d8) + c = cp1256_page06[wc-0x0608]; + else if (wc >= 0x2008 && wc < 0x2040) + c = cp1256_page20[wc-0x2008]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1257.h b/Externals/libiconv-1.14/lib/cp1257.h new file mode 100644 index 0000000000..0d8518e4e2 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1257.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1257 + */ + +static const unsigned short cp1257_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, + 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, + /* 0xa0 */ + 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, + 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, + /* 0xc0 */ + 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, + 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, + /* 0xd0 */ + 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, + 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, + /* 0xe0 */ + 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, + 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, + /* 0xf0 */ + 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, + 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, +}; + +static int +cp1257_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp1257_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp1257_page00[224] = { + 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0x8d, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x9d, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x8f, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ + 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ + 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char cp1257_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0xff, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1257_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1257_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = cp1257_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1257_page02[wc-0x02c0]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1257_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp1258.h b/Externals/libiconv-1.14/lib/cp1258.h new file mode 100644 index 0000000000..5783404837 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp1258.h @@ -0,0 +1,288 @@ +/* + * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP1258 + */ + +#include "flushwc.h" +#include "vietcomb.h" + +static const unsigned char cp1258_comb_table[] = { + 0xcc, 0xec, 0xde, 0xd2, 0xf2, +}; + +/* The possible bases in viet_comp_table_data: + 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, + 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, + 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00A8, 0x00C2, 0x00C5..0x00C7, + 0x00CA, 0x00CF, 0x00D3..0x00D4, 0x00D6, 0x00D8, 0x00DA, 0x00DC, 0x00E2, + 0x00E5..0x00E7, 0x00EA, 0x00EF, 0x00F3..0x00F4, 0x00F6, 0x00F8, 0x00FA, + 0x00FC, 0x0102..0x0103, 0x01A0..0x01A1, 0x01AF..0x01B0. */ +static const unsigned int cp1258_comp_bases[] = { + 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000120, 0x155884e4, 0x155884e4, + 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00018003 +}; + +static const unsigned short cp1258_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, + /* 0xa0 */ + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, +}; + +/* In the CP1258 to Unicode direction, the state contains a buffered + character, or 0 if none. */ + +static int +cp1258_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + unsigned short wc; + unsigned short last_wc; + if (c < 0x80) { + wc = c; + } else { + wc = cp1258_2uni[c-0x80]; + if (wc == 0xfffd) + return RET_ILSEQ; + } + last_wc = conv->istate; + if (last_wc) { + if (wc >= 0x0300 && wc < 0x0340) { + /* See whether last_wc and wc can be combined. */ + unsigned int k; + unsigned int i1, i2; + switch (wc) { + case 0x0300: k = 0; break; + case 0x0301: k = 1; break; + case 0x0303: k = 2; break; + case 0x0309: k = 3; break; + case 0x0323: k = 4; break; + default: abort(); + } + i1 = viet_comp_table[k].idx; + i2 = i1 + viet_comp_table[k].len-1; + if (last_wc >= viet_comp_table_data[i1].base + && last_wc <= viet_comp_table_data[i2].base) { + unsigned int i; + for (;;) { + i = (i1+i2)>>1; + if (last_wc == viet_comp_table_data[i].base) + break; + if (last_wc < viet_comp_table_data[i].base) { + if (i1 == i) + goto not_combining; + i2 = i; + } else { + if (i1 != i) + i1 = i; + else { + i = i2; + if (last_wc == viet_comp_table_data[i].base) + break; + goto not_combining; + } + } + } + last_wc = viet_comp_table_data[i].composed; + /* Output the combined character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 1; + } + } + not_combining: + /* Output the buffered character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 0; /* Don't advance the input pointer. */ + } + if (wc >= 0x0041 && wc <= 0x01b0 + && ((cp1258_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { + /* wc is a possible match in viet_comp_table_data. Buffer it. */ + conv->istate = wc; + return RET_TOOFEW(1); + } else { + /* Output wc immediately. */ + *pwc = (ucs4_t) wc; + return 1; + } +} + +#define cp1258_flushwc normal_flushwc + +static const unsigned char cp1258_page00[88] = { + 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ +}; +static const unsigned char cp1258_page01[104] = { + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ +}; +static const unsigned char cp1258_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp1258_page03[40] = { + 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char cp1258_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +cp1258_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = wc; + else if (wc >= 0x00c0 && wc < 0x0118) + c = cp1258_page00[wc-0x00c0]; + else if (wc >= 0x0150 && wc < 0x01b8) + c = cp1258_page01[wc-0x0150]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp1258_page02[wc-0x02c0]; + else if (wc >= 0x0300 && wc < 0x0328) + c = cp1258_page03[wc-0x0300]; + else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ + c = cp1258_page03[wc-0x0340]; + else if (wc >= 0x2010 && wc < 0x2040) + c = cp1258_page20[wc-0x2010]; + else if (wc == 0x20ab) + c = 0xfe; + else if (wc == 0x20ac) + c = 0x80; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + /* Try canonical decomposition. */ + { + /* Binary search through viet_decomp_table. */ + unsigned int i1 = 0; + unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; + if (wc >= viet_decomp_table[i1].composed + && wc <= viet_decomp_table[i2].composed) { + unsigned int i; + for (;;) { + /* Here i2 - i1 > 0. */ + i = (i1+i2)>>1; + if (wc == viet_decomp_table[i].composed) + break; + if (wc < viet_decomp_table[i].composed) { + if (i1 == i) + return RET_ILUNI; + /* Here i1 < i < i2. */ + i2 = i; + } else { + /* Here i1 <= i < i2. */ + if (i1 != i) + i1 = i; + else { + /* Here i2 - i1 = 1. */ + i = i2; + if (wc == viet_decomp_table[i].composed) + break; + else + return RET_ILUNI; + } + } + } + /* Found a canonical decomposition. */ + wc = viet_decomp_table[i].base; + /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, + 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, + 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, + 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, + 0x01a1, 0x01af, 0x01b0. */ + if (wc < 0x0100) + c = wc; + else if (wc < 0x0118) + c = cp1258_page00[wc-0x00c0]; + else + c = cp1258_page01[wc-0x0150]; + if (n < 2) + return RET_TOOSMALL; + r[0] = c; + r[1] = cp1258_comb_table[viet_decomp_table[i].comb1]; + return 2; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp437.h b/Externals/libiconv-1.14/lib/cp437.h new file mode 100644 index 0000000000..a3c8e685bb --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp437.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP437 + */ + +static const unsigned short cp437_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp437_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp437_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp437_page00[96] = { + 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ +}; +static const unsigned char cp437_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp437_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp437_page23[24] = { + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char cp437_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp437_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp437_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp437_page03[wc-0x0390]; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x20a7) + c = 0x9e; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp437_page22[wc-0x2218]; + else if (wc >= 0x2310 && wc < 0x2328) + c = cp437_page23[wc-0x2310]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp437_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp737.h b/Externals/libiconv-1.14/lib/cp737.h new file mode 100644 index 0000000000..955e458d04 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp737.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP737 + */ + +static const unsigned short cp737_2uni[128] = { + /* 0x80 */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + /* 0x90 */ + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + /* 0xa0 */ + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03c9, 0x03ac, 0x03ad, 0x03ae, 0x03ca, 0x03af, 0x03cc, 0x03cd, + 0x03cb, 0x03ce, 0x0386, 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, + /* 0xf0 */ + 0x038f, 0x00b1, 0x2265, 0x2264, 0x03aa, 0x03ab, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp737_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp737_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp737_page00[24] = { + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ +}; +static const unsigned char cp737_page03[80] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, /* 0x80-0x87 */ + 0xeb, 0xec, 0xed, 0x00, 0xee, 0x00, 0xef, 0xf0, /* 0x88-0x8f */ + 0x00, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, /* 0x90-0x97 */ + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, /* 0x98-0x9f */ + 0x8f, 0x90, 0x00, 0x91, 0x92, 0x93, 0x94, 0x95, /* 0xa0-0xa7 */ + 0x96, 0x97, 0xf4, 0xf5, 0xe1, 0xe2, 0xe3, 0xe5, /* 0xa8-0xaf */ + 0x00, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, /* 0xb0-0xb7 */ + 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, /* 0xb8-0xbf */ + 0xa7, 0xa8, 0xaa, 0xa9, 0xab, 0xac, 0xad, 0xae, /* 0xc0-0xc7 */ + 0xaf, 0xe0, 0xe4, 0xe8, 0xe6, 0xe7, 0xe9, 0x00, /* 0xc8-0xcf */ +}; +static const unsigned char cp737_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp737_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp737_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b8) + c = cp737_page00[wc-0x00a0]; + else if (wc == 0x00f7) + c = 0xf6; + else if (wc >= 0x0380 && wc < 0x03d0) + c = cp737_page03[wc-0x0380]; + else if (wc == 0x207f) + c = 0xfc; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp737_page22[wc-0x2218]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp737_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp775.h b/Externals/libiconv-1.14/lib/cp775.h new file mode 100644 index 0000000000..b9a5a5c4eb --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp775.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP775 + */ + +static const unsigned short cp775_2uni[128] = { + /* 0x80 */ + 0x0106, 0x00fc, 0x00e9, 0x0101, 0x00e4, 0x0123, 0x00e5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012b, 0x0179, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x014d, 0x00f6, 0x0122, 0x00a2, 0x015a, + 0x015b, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x00a4, + /* 0xa0 */ + 0x0100, 0x012a, 0x00f3, 0x017b, 0x017c, 0x017a, 0x201d, 0x00a6, + 0x00a9, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x0141, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010c, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255d, 0x012e, 0x0160, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0172, 0x016a, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x017d, + /* 0xd0 */ + 0x0105, 0x010d, 0x0119, 0x0117, 0x012f, 0x0161, 0x0173, 0x016b, + 0x017e, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x00d3, 0x00df, 0x014c, 0x0143, 0x00f5, 0x00d5, 0x00b5, 0x0144, + 0x0136, 0x0137, 0x013b, 0x013c, 0x0146, 0x0112, 0x0145, 0x2019, + /* 0xf0 */ + 0x00ad, 0x00b1, 0x201c, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x201e, + 0x00b0, 0x2219, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp775_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp775_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp775_page00[224] = { + 0xff, 0x00, 0x96, 0x9c, 0x9f, 0x00, 0xa7, 0xf5, /* 0xa0-0xa7 */ + 0x00, 0xa8, 0x00, 0xae, 0xaa, 0xf0, 0xa9, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xfc, 0x00, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0xfb, 0x00, 0xaf, 0xac, 0xab, 0xf3, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe5, 0x99, 0x9e, /* 0xd0-0xd7 */ + 0x9d, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x84, 0x86, 0x91, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xa2, 0x00, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x9b, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0xa0, 0x83, 0x00, 0x00, 0xb5, 0xd0, 0x80, 0x87, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xb6, 0xd1, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0xed, 0x89, 0x00, 0x00, 0xb8, 0xd3, /* 0x10-0x17 */ + 0xb7, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x95, 0x85, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0xa1, 0x8c, 0x00, 0x00, 0xbd, 0xd4, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xe9, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0xea, 0xeb, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0xad, 0x88, 0xe3, 0xe7, 0xee, 0xec, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x93, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x8b, /* 0x50-0x57 */ + 0x00, 0x00, 0x97, 0x98, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xbe, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0xc7, 0xd7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0xc6, 0xd6, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x8d, 0xa5, 0xa3, 0xa4, 0xcf, 0xd8, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char cp775_page20[8] = { + 0x00, 0xef, 0x00, 0x00, 0xf2, 0xa6, 0xf7, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char cp775_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp775_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = cp775_page00[wc-0x00a0]; + else if (wc >= 0x2018 && wc < 0x2020) + c = cp775_page20[wc-0x2018]; + else if (wc == 0x2219) + c = 0xf9; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp775_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp850.h b/Externals/libiconv-1.14/lib/cp850.h new file mode 100644 index 0000000000..25acfee148 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp850.h @@ -0,0 +1,124 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP850 + */ + +static const unsigned short cp850_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, + 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, + 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, + /* 0xe0 */ + 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, + 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, + /* 0xf0 */ + 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, + 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp850_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp850_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp850_page00[96] = { + 0xff, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ + 0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8, /* 0xb8-0xbf */ + 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ + 0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e, /* 0xd0-0xd7 */ + 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0xd0, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x9b, 0x97, 0xa3, 0x96, 0x81, 0xec, 0xe7, 0x98, /* 0xf8-0xff */ +}; +static const unsigned char cp850_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp850_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp850_page00[wc-0x00a0]; + else if (wc == 0x0131) + c = 0xd5; + else if (wc == 0x0192) + c = 0x9f; + else if (wc == 0x2017) + c = 0xf2; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp850_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp852.h b/Externals/libiconv-1.14/lib/cp852.h new file mode 100644 index 0000000000..fac7a63f15 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp852.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP852 + */ + +static const unsigned short cp852_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x016f, 0x0107, 0x00e7, + 0x0142, 0x00eb, 0x0150, 0x0151, 0x00ee, 0x0179, 0x00c4, 0x0106, + /* 0x90 */ + 0x00c9, 0x0139, 0x013a, 0x00f4, 0x00f6, 0x013d, 0x013e, 0x015a, + 0x015b, 0x00d6, 0x00dc, 0x0164, 0x0165, 0x0141, 0x00d7, 0x010d, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x0104, 0x0105, 0x017d, 0x017e, + 0x0118, 0x0119, 0x00ac, 0x017a, 0x010c, 0x015f, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x011a, + 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0102, 0x0103, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0x0111, 0x0110, 0x010e, 0x00cb, 0x010f, 0x0147, 0x00cd, 0x00ce, + 0x011b, 0x2518, 0x250c, 0x2588, 0x2584, 0x0162, 0x016e, 0x2580, + /* 0xe0 */ + 0x00d3, 0x00df, 0x00d4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00da, 0x0155, 0x0170, 0x00fd, 0x00dd, 0x0163, 0x00b4, + /* 0xf0 */ + 0x00ad, 0x02dd, 0x02db, 0x02c7, 0x02d8, 0x00a7, 0x00f7, 0x00b8, + 0x00b0, 0x00a8, 0x02d9, 0x0171, 0x0158, 0x0159, 0x25a0, 0x00a0, +}; + +static int +cp852_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp852_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp852_page00[224] = { + 0xff, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0x00, 0x00, 0xae, 0xaa, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0xf7, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xb5, 0xb6, 0x00, 0x8e, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0xd3, 0x00, 0xd6, 0xd7, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xe0, 0xe2, 0x00, 0x99, 0x9e, /* 0xd0-0xd7 */ + 0x00, 0x00, 0xe9, 0x00, 0x9a, 0xed, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x00, 0xa0, 0x83, 0x00, 0x84, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ + 0x00, 0x82, 0x00, 0x89, 0x00, 0xa1, 0x8c, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x00, 0xa3, 0x00, 0x81, 0xec, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc6, 0xc7, 0xa4, 0xa5, 0x8f, 0x86, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xac, 0x9f, 0xd2, 0xd4, /* 0x08-0x0f */ + 0xd1, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xa8, 0xa9, 0xb7, 0xd8, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x91, 0x92, 0x00, 0x00, 0x95, 0x96, 0x00, /* 0x38-0x3f */ + 0x00, 0x9d, 0x88, 0xe3, 0xe4, 0x00, 0x00, 0xd5, /* 0x40-0x47 */ + 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x8a, 0x8b, 0x00, 0x00, 0xe8, 0xea, 0x00, 0x00, /* 0x50-0x57 */ + 0xfc, 0xfd, 0x97, 0x98, 0x00, 0x00, 0xb8, 0xad, /* 0x58-0x5f */ + 0xe6, 0xe7, 0xdd, 0xee, 0x9b, 0x9c, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x85, /* 0x68-0x6f */ + 0xeb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x8d, 0xab, 0xbd, 0xbe, 0xa6, 0xa7, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char cp852_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xf4, 0xfa, 0x00, 0xf2, 0x00, 0xf1, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp852_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp852_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = cp852_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = cp852_page02[wc-0x02c0]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp852_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp853.h b/Externals/libiconv-1.14/lib/cp853.h new file mode 100644 index 0000000000..fe82ae9817 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp853.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP853 + */ + +static const unsigned short cp853_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x0109, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x0108, + /* 0x90 */ + 0x00c9, 0x010b, 0x010a, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x0130, 0x00d6, 0x00dc, 0x011d, 0x00a3, 0x011c, 0x00d7, 0x0135, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f, + 0x0124, 0x0125, 0xfffd, 0x00bd, 0x0134, 0x015f, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, + 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x015c, 0x015d, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0xfffd, 0xfffd, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, + 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0xfffd, 0x00cc, 0x2580, + /* 0xe0 */ + 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x0120, 0x0121, 0x00b5, 0x0126, + 0x0127, 0x00da, 0x00db, 0x00d9, 0x016c, 0x016d, 0xfffd, 0x00b4, + /* 0xf0 */ + 0x00ad, 0xfffd, 0x2113, 0x0149, 0x02d8, 0x00a7, 0x00f7, 0x00b8, + 0x00b0, 0x00a8, 0x02d9, 0xfffd, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp853_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp853_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp853_page00[96] = { + 0xff, 0x00, 0x00, 0x9c, 0xcf, 0x00, 0x00, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0x00, 0x00, 0xae, 0x00, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0x00, 0xfd, 0xfc, 0xef, 0xe6, 0x00, 0x00, /* 0xb0-0xb7 */ + 0xf7, 0x00, 0x00, 0xaf, 0x00, 0xab, 0x00, 0x00, /* 0xb8-0xbf */ + 0xb7, 0xb5, 0xb6, 0x00, 0x8e, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ + 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ + 0x00, 0xa5, 0xe3, 0xe0, 0xe2, 0x00, 0x99, 0x9e, /* 0xd0-0xd7 */ + 0x00, 0xeb, 0xe9, 0xea, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0x00, 0x84, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp853_page01[120] = { + 0x8f, 0x86, 0x92, 0x91, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9b, 0xa6, 0xa7, /* 0x18-0x1f */ + 0xe4, 0xe5, 0x00, 0x00, 0xa8, 0xa9, 0xe7, 0xe8, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x98, 0xd5, 0x00, 0x00, 0xac, 0x9f, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc7, 0xb8, 0xad, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0xec, 0xed, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char cp853_page02[8] = { + 0xf4, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char cp853_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp853_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp853_page00[wc-0x00a0]; + else if (wc >= 0x0108 && wc < 0x0180) + c = cp853_page01[wc-0x0108]; + else if (wc >= 0x02d8 && wc < 0x02e0) + c = cp853_page02[wc-0x02d8]; + else if (wc == 0x2113) + c = 0xf2; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp853_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp855.h b/Externals/libiconv-1.14/lib/cp855.h new file mode 100644 index 0000000000..ddb8bf17d0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp855.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP855 + */ + +static const unsigned short cp855_2uni[128] = { + /* 0x80 */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + /* 0x90 */ + 0x0459, 0x0409, 0x045a, 0x040a, 0x045b, 0x040b, 0x045c, 0x040c, + 0x045e, 0x040e, 0x045f, 0x040f, 0x044e, 0x042e, 0x044a, 0x042a, + /* 0xa0 */ + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255d, 0x0439, 0x0419, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x043a, 0x041a, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0x043b, 0x041b, 0x043c, 0x041c, 0x043d, 0x041d, 0x043e, 0x041e, + 0x043f, 0x2518, 0x250c, 0x2588, 0x2584, 0x041f, 0x044f, 0x2580, + /* 0xe0 */ + 0x042f, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044c, 0x042c, 0x2116, + /* 0xf0 */ + 0x00ad, 0x044b, 0x042b, 0x0437, 0x0417, 0x0448, 0x0428, 0x044d, + 0x042d, 0x0449, 0x0429, 0x0447, 0x0427, 0x00a7, 0x25a0, 0x00a0, +}; + +static int +cp855_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp855_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp855_page00[32] = { + 0xff, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0xae, 0x00, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char cp855_page04[96] = { + 0x00, 0x85, 0x81, 0x83, 0x87, 0x89, 0x8b, 0x8d, /* 0x00-0x07 */ + 0x8f, 0x91, 0x93, 0x95, 0x97, 0x00, 0x99, 0x9b, /* 0x08-0x0f */ + 0xa1, 0xa3, 0xec, 0xad, 0xa7, 0xa9, 0xea, 0xf4, /* 0x10-0x17 */ + 0xb8, 0xbe, 0xc7, 0xd1, 0xd3, 0xd5, 0xd7, 0xdd, /* 0x18-0x1f */ + 0xe2, 0xe4, 0xe6, 0xe8, 0xab, 0xb6, 0xa5, 0xfc, /* 0x20-0x27 */ + 0xf6, 0xfa, 0x9f, 0xf2, 0xee, 0xf8, 0x9d, 0xe0, /* 0x28-0x2f */ + 0xa0, 0xa2, 0xeb, 0xac, 0xa6, 0xa8, 0xe9, 0xf3, /* 0x30-0x37 */ + 0xb7, 0xbd, 0xc6, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, /* 0x38-0x3f */ + 0xe1, 0xe3, 0xe5, 0xe7, 0xaa, 0xb5, 0xa4, 0xfb, /* 0x40-0x47 */ + 0xf5, 0xf9, 0x9e, 0xf1, 0xed, 0xf7, 0x9c, 0xde, /* 0x48-0x4f */ + 0x00, 0x84, 0x80, 0x82, 0x86, 0x88, 0x8a, 0x8c, /* 0x50-0x57 */ + 0x8e, 0x90, 0x92, 0x94, 0x96, 0x00, 0x98, 0x9a, /* 0x58-0x5f */ +}; +static const unsigned char cp855_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp855_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = cp855_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0460) + c = cp855_page04[wc-0x0400]; + else if (wc == 0x2116) + c = 0xef; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp855_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp856.h b/Externals/libiconv-1.14/lib/cp856.h new file mode 100644 index 0000000000..30ba80b331 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp856.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP856 + */ + +static const unsigned short cp856_2uni[128] = { + /* 0x80 */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + /* 0x90 */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0x00a3, 0xfffd, 0x00d7, 0xfffd, + /* 0xa0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0xfffd, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xfffd, 0xfffd, 0xfffd, + 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xfffd, 0xfffd, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0xfffd, 0x2580, + /* 0xe0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00b5, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00af, 0x00b4, + /* 0xf0 */ + 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, + 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp856_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp856_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp856_page00[88] = { + 0xff, 0x00, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0xb8, 0x00, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ + 0xf7, 0xfb, 0x00, 0xaf, 0xac, 0xab, 0xf3, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ +}; +static const unsigned char cp856_page05[32] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0xd0-0xd7 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0xd8-0xdf */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0xe0-0xe7 */ + 0x98, 0x99, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char cp856_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp856_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = cp856_page00[wc-0x00a0]; + else if (wc >= 0x05d0 && wc < 0x05f0) + c = cp856_page05[wc-0x05d0]; + else if (wc == 0x2017) + c = 0xf2; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp856_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp857.h b/Externals/libiconv-1.14/lib/cp857.h new file mode 100644 index 0000000000..09de722d21 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp857.h @@ -0,0 +1,138 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP857 + */ + +static const unsigned short cp857_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x0131, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x0130, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x015e, 0x015f, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f, + 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, + 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, + /* 0xd0 */ + 0x00ba, 0x00aa, 0x00ca, 0x00cb, 0x00c8, 0xfffd, 0x00cd, 0x00ce, + 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, + /* 0xe0 */ + 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0xfffd, + 0x00d7, 0x00da, 0x00db, 0x00d9, 0x00ec, 0x00ff, 0x00af, 0x00b4, + /* 0xf0 */ + 0x00ad, 0x00b1, 0xfffd, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, + 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp857_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp857_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp857_page00[96] = { + 0xff, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0xb8, 0xd1, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ + 0xf7, 0xfb, 0xd0, 0xaf, 0xac, 0xab, 0xf3, 0xa8, /* 0xb8-0xbf */ + 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ + 0x00, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0xe8, /* 0xd0-0xd7 */ + 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0xec, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x9b, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0xed, /* 0xf8-0xff */ +}; +static const unsigned char cp857_page01[72] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa7, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x98, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x9f, /* 0x58-0x5f */ +}; +static const unsigned char cp857_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp857_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp857_page00[wc-0x00a0]; + else if (wc >= 0x0118 && wc < 0x0160) + c = cp857_page01[wc-0x0118]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp857_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp858.h b/Externals/libiconv-1.14/lib/cp858.h new file mode 100644 index 0000000000..dd26d0a27e --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp858.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP858 + */ + +static int +cp858_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else if (c == 0xd5) + *pwc = 0x20ac; + else + *pwc = (ucs4_t) cp850_2uni[c-0x80]; + return 1; +} + +static int +cp858_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp850_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc == 0x2017) + c = 0xf2; + else if (wc == 0x20ac) + c = 0xd5; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp850_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp860.h b/Externals/libiconv-1.14/lib/cp860.h new file mode 100644 index 0000000000..2cca2f12ff --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp860.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP860 + */ + +static const unsigned short cp860_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e3, 0x00e0, 0x00c1, 0x00e7, + 0x00ea, 0x00ca, 0x00e8, 0x00cd, 0x00d4, 0x00ec, 0x00c3, 0x00c2, + /* 0x90 */ + 0x00c9, 0x00c0, 0x00c8, 0x00f4, 0x00f5, 0x00f2, 0x00da, 0x00f9, + 0x00cc, 0x00d5, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x20a7, 0x00d3, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x00d2, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp860_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp860_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp860_page00[96] = { + 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0x91, 0x86, 0x8f, 0x8e, 0x00, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ + 0x92, 0x90, 0x89, 0x00, 0x98, 0x8b, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0xa5, 0xa9, 0x9f, 0x8c, 0x99, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x9d, 0x96, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0x84, 0x00, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x00, 0x8d, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x94, 0x00, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x97, 0xa3, 0x00, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp860_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp860_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp860_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp860_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp860_page00[wc-0x00a0]; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp860_page03[wc-0x0390]; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x20a7) + c = 0x9e; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp860_page22[wc-0x2218]; + else if (wc >= 0x2320 && wc < 0x2322) + c = wc-0x222c; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp860_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp861.h b/Externals/libiconv-1.14/lib/cp861.h new file mode 100644 index 0000000000..07bcf5f2d8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp861.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP861 + */ + +static const unsigned short cp861_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00d0, 0x00f0, 0x00de, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00fe, 0x00fb, 0x00dd, + 0x00fd, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00c1, 0x00cd, 0x00d3, 0x00da, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp861_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp861_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp861_page00[96] = { + 0xff, 0xad, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0x00, 0xa4, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, /* 0xc8-0xcf */ + 0x8b, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ + 0x9d, 0x00, 0xa7, 0x00, 0x9a, 0x97, 0x8d, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x00, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ + 0x8c, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x9b, 0x00, 0xa3, 0x96, 0x81, 0x98, 0x95, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp861_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp861_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp861_page23[24] = { + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char cp861_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp861_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp861_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp861_page03[wc-0x0390]; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x20a7) + c = 0x9e; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp861_page22[wc-0x2218]; + else if (wc >= 0x2310 && wc < 0x2328) + c = cp861_page23[wc-0x2310]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp861_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp862.h b/Externals/libiconv-1.14/lib/cp862.h new file mode 100644 index 0000000000..623fc4d5fa --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp862.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP862 + */ + +static const unsigned short cp862_2uni[128] = { + /* 0x80 */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + /* 0x90 */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp862_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp862_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp862_page00[96] = { + 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0xa4, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp862_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp862_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp862_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp862_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp862_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp862_page03[wc-0x0390]; + else if (wc >= 0x05d0 && wc < 0x05eb) + c = wc-0x0550; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x20a7) + c = 0x9e; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp862_page22[wc-0x2218]; + else if (wc == 0x2310) + c = 0xa9; + else if (wc >= 0x2320 && wc < 0x2322) + c = wc-0x222c; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp862_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp863.h b/Externals/libiconv-1.14/lib/cp863.h new file mode 100644 index 0000000000..5890ad423d --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp863.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP863 + */ + +static const unsigned short cp863_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00c2, 0x00e0, 0x00b6, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x2017, 0x00c0, 0x00a7, + /* 0x90 */ + 0x00c9, 0x00c8, 0x00ca, 0x00f4, 0x00cb, 0x00cf, 0x00fb, 0x00f9, + 0x00a4, 0x00d4, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x00db, 0x0192, + /* 0xa0 */ + 0x00a6, 0x00b4, 0x00f3, 0x00fa, 0x00a8, 0x00b8, 0x00b3, 0x00af, + 0x00ce, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00be, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp863_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp863_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp863_page00[96] = { + 0xff, 0x00, 0x9b, 0x9c, 0x98, 0x00, 0xa0, 0x8f, /* 0xa0-0xa7 */ + 0xa4, 0x00, 0x00, 0xae, 0xaa, 0x00, 0x00, 0xa7, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0xa6, 0xa1, 0xe6, 0x86, 0xfa, /* 0xb0-0xb7 */ + 0xa5, 0x00, 0x00, 0xaf, 0xac, 0xab, 0xad, 0x00, /* 0xb8-0xbf */ + 0x8e, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ + 0x91, 0x90, 0x92, 0x94, 0x00, 0x00, 0xa8, 0x95, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x9d, 0x00, 0x9e, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x00, 0x00, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ + 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char cp863_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp863_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp863_page23[24] = { + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char cp863_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp863_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp863_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp863_page03[wc-0x0390]; + else if (wc == 0x2017) + c = 0x8d; + else if (wc == 0x207f) + c = 0xfc; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp863_page22[wc-0x2218]; + else if (wc >= 0x2310 && wc < 0x2328) + c = cp863_page23[wc-0x2310]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp863_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp864.h b/Externals/libiconv-1.14/lib/cp864.h new file mode 100644 index 0000000000..a1d8c4a23f --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp864.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP864 + */ + +static const unsigned short cp864_2uni_1[16] = { + /* 0x20 */ + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, +}; +static const unsigned short cp864_2uni_2[128] = { + /* 0x80 */ + 0x00b0, 0x00b7, 0x2219, 0x221a, 0x2592, 0x2500, 0x2502, 0x253c, + 0x2524, 0x252c, 0x251c, 0x2534, 0x2510, 0x250c, 0x2514, 0x2518, + /* 0x90 */ + 0x03b2, 0x221e, 0x03c6, 0x00b1, 0x00bd, 0x00bc, 0x2248, 0x00ab, + 0x00bb, 0xfef7, 0xfef8, 0xfffd, 0xfffd, 0xfefb, 0xfefc, 0xfffd, + /* 0xa0 */ + 0x00a0, 0x00ad, 0xfe82, 0x00a3, 0x00a4, 0xfe84, 0xfffd, 0xfffd, + 0xfe8e, 0xfe8f, 0xfe95, 0xfe99, 0x060c, 0xfe9d, 0xfea1, 0xfea5, + /* 0xb0 */ + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0xfed1, 0x061b, 0xfeb1, 0xfeb5, 0xfeb9, 0x061f, + /* 0xc0 */ + 0x00a2, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfeca, 0xfe8b, 0xfe8d, + 0xfe91, 0xfe93, 0xfe97, 0xfe9b, 0xfe9f, 0xfea3, 0xfea7, 0xfea9, + /* 0xd0 */ + 0xfeab, 0xfead, 0xfeaf, 0xfeb3, 0xfeb7, 0xfebb, 0xfebf, 0xfec1, + 0xfec5, 0xfecb, 0xfecf, 0x00a6, 0x00ac, 0x00f7, 0x00d7, 0xfec9, + /* 0xe0 */ + 0x0640, 0xfed3, 0xfed7, 0xfedb, 0xfedf, 0xfee3, 0xfee7, 0xfeeb, + 0xfeed, 0xfeef, 0xfef3, 0xfebd, 0xfecc, 0xfece, 0xfecd, 0xfee1, + /* 0xf0 */ + 0xfe7d, 0x0651, 0xfee5, 0xfee9, 0xfeec, 0xfef0, 0xfef2, 0xfed0, + 0xfed5, 0xfef5, 0xfef6, 0xfedd, 0xfed9, 0xfef1, 0x25a0, 0xfffd, +}; + +static int +cp864_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x20) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0x30) { + *pwc = (ucs4_t) cp864_2uni_1[c-0x20]; + return 1; + } + else if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp864_2uni_2[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp864_page00[8] = { + 0x20, 0x21, 0x22, 0x23, 0x24, 0x00, 0x26, 0x27, /* 0x20-0x27 */ +}; +static const unsigned char cp864_page00_1[88] = { + 0xa0, 0x00, 0xc0, 0xa3, 0xa4, 0x00, 0xdb, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x97, 0xdc, 0xa1, 0x00, 0x00, /* 0xa8-0xaf */ + 0x80, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x98, 0x95, 0x94, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xf0-0xf7 */ +}; +static const unsigned char cp864_page06[104] = { + 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ + 0xb8, 0xb9, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ +}; +static const unsigned char cp864_page22[56] = { + 0x00, 0x82, 0x83, 0x00, 0x00, 0x00, 0x91, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ +}; +static const unsigned char cp864_page25[64] = { + 0x85, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x8f, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; +static const unsigned char cp864_pagefe[136] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, /* 0x78-0x7f */ + 0xc1, 0xc2, 0xa2, 0xc3, 0xa5, 0xc4, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc7, 0xa8, 0xa9, /* 0x88-0x8f */ + 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xaa, 0x00, 0xca, /* 0x90-0x97 */ + 0x00, 0xab, 0x00, 0xcb, 0x00, 0xad, 0x00, 0xcc, /* 0x98-0x9f */ + 0x00, 0xae, 0x00, 0xcd, 0x00, 0xaf, 0x00, 0xce, /* 0xa0-0xa7 */ + 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, /* 0xa8-0xaf */ + 0x00, 0xbc, 0x00, 0xd3, 0x00, 0xbd, 0x00, 0xd4, /* 0xb0-0xb7 */ + 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xeb, 0x00, 0xd6, /* 0xb8-0xbf */ + 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0xdf, 0xc5, 0xd9, 0xec, 0xee, 0xed, 0xda, /* 0xc8-0xcf */ + 0xf7, 0xba, 0x00, 0xe1, 0x00, 0xf8, 0x00, 0xe2, /* 0xd0-0xd7 */ + 0x00, 0xfc, 0x00, 0xe3, 0x00, 0xfb, 0x00, 0xe4, /* 0xd8-0xdf */ + 0x00, 0xef, 0x00, 0xe5, 0x00, 0xf2, 0x00, 0xe6, /* 0xe0-0xe7 */ + 0x00, 0xf3, 0x00, 0xe7, 0xf4, 0xe8, 0x00, 0xe9, /* 0xe8-0xef */ + 0xf5, 0xfd, 0xf6, 0xea, 0x00, 0xf9, 0xfa, 0x99, /* 0xf0-0xf7 */ + 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; + +static int +cp864_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0020) { + *r = wc; + return 1; + } + else if (wc >= 0x0020 && wc < 0x0028) + c = cp864_page00[wc-0x0020]; + else if (wc >= 0x0028 && wc < 0x0080) + c = wc; + else if (wc >= 0x00a0 && wc < 0x00f8) + c = cp864_page00_1[wc-0x00a0]; + else if (wc == 0x03b2) + c = 0x90; + else if (wc == 0x03c6) + c = 0x92; + else if (wc >= 0x0608 && wc < 0x0670) + c = cp864_page06[wc-0x0608]; + else if (wc >= 0x2218 && wc < 0x2250) + c = cp864_page22[wc-0x2218]; + else if (wc >= 0x2500 && wc < 0x2540) + c = cp864_page25[wc-0x2500]; + else if (wc == 0x2592) + c = 0x84; + else if (wc == 0x25a0) + c = 0xfe; + else if (wc >= 0xfe78 && wc < 0xff00) + c = cp864_pagefe[wc-0xfe78]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp865.h b/Externals/libiconv-1.14/lib/cp865.h new file mode 100644 index 0000000000..3944916d9f --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp865.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP865 + */ + +static const unsigned short cp865_2uni[128] = { + /* 0x80 */ + 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, + 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, + /* 0x90 */ + 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, + 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, + /* 0xa0 */ + 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, + 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00a4, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, + 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, + /* 0xf0 */ + 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, +}; + +static int +cp865_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp865_2uni[c-0x80]; + return 1; +} + +static const unsigned char cp865_page00[96] = { + 0xff, 0xad, 0x00, 0x9c, 0xaf, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xa7, 0x00, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ + 0x9d, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ + 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ + 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ + 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ + 0x9b, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ +}; +static const unsigned char cp865_page03[56] = { + 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ +}; +static const unsigned char cp865_page22[80] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char cp865_page23[24] = { + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char cp865_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp865_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = cp865_page00[wc-0x00a0]; + else if (wc == 0x0192) + c = 0x9f; + else if (wc >= 0x0390 && wc < 0x03c8) + c = cp865_page03[wc-0x0390]; + else if (wc == 0x207f) + c = 0xfc; + else if (wc == 0x20a7) + c = 0x9e; + else if (wc >= 0x2218 && wc < 0x2268) + c = cp865_page22[wc-0x2218]; + else if (wc >= 0x2310 && wc < 0x2328) + c = cp865_page23[wc-0x2310]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp865_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp866.h b/Externals/libiconv-1.14/lib/cp866.h new file mode 100644 index 0000000000..0aaa2169f0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp866.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP866 + */ + +static const unsigned short cp866_2uni[80] = { + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + /* 0xd0 */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + /* 0xe0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + /* 0xf0 */ + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, + 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, +}; + +static int +cp866_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else if (c < 0xb0) + *pwc = (ucs4_t) c + 0x0390; + else + *pwc = (ucs4_t) cp866_2uni[c-0xb0]; + return 1; +} + +static const unsigned char cp866_page00[24] = { + 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ +}; +static const unsigned char cp866_page04[96] = { + 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ +}; +static const unsigned char cp866_page22[8] = { + 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char cp866_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ + 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ + 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ + 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp866_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b8) + c = cp866_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0460) + c = cp866_page04[wc-0x0400]; + else if (wc == 0x2116) + c = 0xfc; + else if (wc >= 0x2218 && wc < 0x2220) + c = cp866_page22[wc-0x2218]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp866_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp869.h b/Externals/libiconv-1.14/lib/cp869.h new file mode 100644 index 0000000000..8e839d2cfa --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp869.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP869 + */ + +static const unsigned short cp869_2uni[128] = { + /* 0x80 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0386, 0xfffd, + 0x00b7, 0x00ac, 0x00a6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + /* 0x90 */ + 0x038a, 0x03aa, 0x038c, 0xfffd, 0xfffd, 0x038e, 0x03ab, 0x00a9, + 0x038f, 0x00b2, 0x00b3, 0x03ac, 0x00a3, 0x03ad, 0x03ae, 0x03af, + /* 0xa0 */ + 0x03ca, 0x0390, 0x03cc, 0x03cd, 0x0391, 0x0392, 0x0393, 0x0394, + 0x0395, 0x0396, 0x0397, 0x00bd, 0x0398, 0x0399, 0x00ab, 0x00bb, + /* 0xb0 */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039a, 0x039b, 0x039c, + 0x039d, 0x2563, 0x2551, 0x2557, 0x255d, 0x039e, 0x039f, 0x2510, + /* 0xc0 */ + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x03a0, 0x03a1, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x03a3, + /* 0xd0 */ + 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, + 0x03b3, 0x2518, 0x250c, 0x2588, 0x2584, 0x03b4, 0x03b5, 0x2580, + /* 0xe0 */ + 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, + 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x0384, + /* 0xf0 */ + 0x00ad, 0x00b1, 0x03c5, 0x03c6, 0x03c7, 0x00a7, 0x03c8, 0x0385, + 0x00b0, 0x00a8, 0x03c9, 0x03cb, 0x03b0, 0x03ce, 0x25a0, 0x00a0, +}; + +static int +cp869_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp869_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp869_page00[32] = { + 0xff, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x8a, 0xf5, /* 0xa0-0xa7 */ + 0xf9, 0x97, 0x00, 0xae, 0x89, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ + 0xf8, 0xf1, 0x99, 0x9a, 0x00, 0x00, 0x00, 0x88, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xaf, 0x00, 0xab, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char cp869_page03[80] = { + 0x00, 0x00, 0x00, 0x00, 0xef, 0xf7, 0x86, 0x00, /* 0x80-0x87 */ + 0x8d, 0x8f, 0x90, 0x00, 0x92, 0x00, 0x95, 0x98, /* 0x88-0x8f */ + 0xa1, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, /* 0x90-0x97 */ + 0xac, 0xad, 0xb5, 0xb6, 0xb7, 0xb8, 0xbd, 0xbe, /* 0x98-0x9f */ + 0xc6, 0xc7, 0x00, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, /* 0xa0-0xa7 */ + 0xd4, 0xd5, 0x91, 0x96, 0x9b, 0x9d, 0x9e, 0x9f, /* 0xa8-0xaf */ + 0xfc, 0xd6, 0xd7, 0xd8, 0xdd, 0xde, 0xe0, 0xe1, /* 0xb0-0xb7 */ + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, /* 0xb8-0xbf */ + 0xea, 0xeb, 0xed, 0xec, 0xee, 0xf2, 0xf3, 0xf4, /* 0xc0-0xc7 */ + 0xf6, 0xfa, 0xa0, 0xfb, 0xa2, 0xa3, 0xfd, 0x00, /* 0xc8-0xcf */ +}; +static const unsigned char cp869_page20[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, /* 0x10-0x17 */ + 0x8b, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char cp869_page25[168] = { + 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ + 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ + 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ + 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +cp869_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = cp869_page00[wc-0x00a0]; + else if (wc >= 0x0380 && wc < 0x03d0) + c = cp869_page03[wc-0x0380]; + else if (wc >= 0x2010 && wc < 0x2020) + c = cp869_page20[wc-0x2010]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = cp869_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp874.h b/Externals/libiconv-1.14/lib/cp874.h new file mode 100644 index 0000000000..6374dd7d05 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp874.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP874 + */ + +static const unsigned short cp874_2uni[128] = { + /* 0x80 */ + 0x20ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2026, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x90 */ + 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa0 */ + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + /* 0xb0 */ + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + /* 0xc0 */ + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + /* 0xd0 */ + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f, + /* 0xe0 */ + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, + /* 0xf0 */ + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +}; + +static int +cp874_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = cp874_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char cp874_page0e[96] = { + 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ +}; +static const unsigned char cp874_page20[24] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ +}; + +static int +cp874_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc == 0x00a0) + c = 0xa0; + else if (wc >= 0x0e00 && wc < 0x0e60) + c = cp874_page0e[wc-0x0e00]; + else if (wc >= 0x2010 && wc < 0x2028) + c = cp874_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x80; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp922.h b/Externals/libiconv-1.14/lib/cp922.h new file mode 100644 index 0000000000..ca661b3862 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp922.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP922 + */ + +static const unsigned short cp922_2uni_1[16] = { + /* 0xa0 */ + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x203e, +}; +static const unsigned short cp922_2uni_2[16] = { + /* 0xd0 */ + 0x0160, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x017d, 0x00df, +}; +static const unsigned short cp922_2uni_3[16] = { + /* 0xf0 */ + 0x0161, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x017e, 0x00ff, +}; + +static int +cp922_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else if (c < 0xb0) + *pwc = (ucs4_t) cp922_2uni_1[c-0xa0]; + else if (c < 0xd0) + *pwc = (ucs4_t) c; + else if (c < 0xe0) + *pwc = (ucs4_t) cp922_2uni_2[c-0xd0]; + else if (c < 0xf0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) cp922_2uni_3[c-0xf0]; + return 1; +} + +static const unsigned char cp922_page00[88] = { + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ +}; +static const unsigned char cp922_page01[32] = { + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ +}; + +static int +cp922_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a8) { + *r = wc; + return 1; + } + else if (wc >= 0x00a8 && wc < 0x0100) + c = cp922_page00[wc-0x00a8]; + else if (wc >= 0x0160 && wc < 0x0180) + c = cp922_page01[wc-0x0160]; + else if (wc == 0x203e) + c = 0xaf; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp932.h b/Externals/libiconv-1.14/lib/cp932.h new file mode 100644 index 0000000000..6534cd0297 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp932.h @@ -0,0 +1,240 @@ +/* + * Copyright (C) 1999-2002, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP932 + */ + +/* + * Microsoft CP932 is a slightly extended version of SHIFT_JIS. + * The differences between the EASTASIA/JIS/SHIFTJIS.TXT and the + * VENDORS/MICSFT/WINDOWS/CP932.TXT tables found on ftp.unicode.org are + * as follows: + * + * 1. CP932 uses ASCII, not JISX0201 Roman. + * + * 2. Some characters in the JISX0208 range are defined differently: + * + * code SHIFTJIS.TXT CP932.TXT + * 0x815F 0x005C # REVERSE SOLIDUS 0xFF3C # FULLWIDTH REVERSE SOLIDUS + * 0x8160 0x301C # WAVE DASH 0xFF5E # FULLWIDTH TILDE + * 0x8161 0x2016 # DOUBLE VERTICAL LINE 0x2225 # PARALLEL TO + * 0x817C 0x2212 # MINUS SIGN 0xFF0D # FULLWIDTH HYPHEN-MINUS + * 0x8191 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN + * 0x8192 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN + * 0x81CA 0x00AC # NOT SIGN 0xFFE2 # FULLWIDTH NOT SIGN + * + * We don't implement the latter 6 of these changes, only the first one. + * SHIFTJIS.TXT makes more sense. However, as a compromise with user + * expectation, we implement the middle 5 of these changes in the + * Unicode to CP932 direction. We don't implement the last one at all, + * because it would collide with the mapping of 0xFA54. + * + * 3. A few new rows. See cp932ext.h. + * + * Many variants of CP932 (in GNU libc, JDK, OSF/1, Windows-2000, ICU) also + * add: + * + * 4. Private area mappings: + * + * code Unicode + * 0x{F0..F9}{40..7E,80..FC} U+E000..U+E757 + * + * We add them too because, although there are backward compatibility problems + * when a character from a private area is moved to an official Unicode code + * point, they are useful for some people in practice. + */ + +#include "cp932ext.h" + +/* + Conversion between SJIS codes (s1,s2) and JISX0208 codes (c1,c2): + Example. (s1,s2) = 0x8140, (c1,c2) = 0x2121. + 0x81 <= s1 <= 0x9F || 0xE0 <= s1 <= 0xEA, + 0x40 <= s2 <= 0x7E || 0x80 <= s2 <= 0xFC, + 0x21 <= c1 <= 0x74, 0x21 <= c2 <= 0x7E. + Invariant: + 94*2*(s1 < 0xE0 ? s1-0x81 : s1-0xC1) + (s2 < 0x80 ? s2-0x40 : s2-0x41) + = 94*(c1-0x21)+(c2-0x21) + Conversion (s1,s2) -> (c1,c2): + t1 := (s1 < 0xE0 ? s1-0x81 : s1-0xC1) + t2 := (s2 < 0x80 ? s2-0x40 : s2-0x41) + c1 := 2*t1 + (t2 < 0x5E ? 0 : 1) + 0x21 + c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 + Conversion (c1,c2) -> (s1,s2): + t1 := (c1 - 0x21) >> 1 + t2 := ((c1 - 0x21) & 1) * 0x5E + (c2 - 0x21) + s1 := (t1 < 0x1F ? t1+0x81 : t1+0xC1) + s2 := (t2 < 0x3F ? t2+0x40 : t2+0x41) + */ + +static int +cp932_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + else if (c >= 0xa1 && c <= 0xdf) + return jisx0201_mbtowc(conv,pwc,s,n); + else { + unsigned char s1, s2; + s1 = c; + if ((s1 >= 0x81 && s1 <= 0x9f && s1 != 0x87) || (s1 >= 0xe0 && s1 <= 0xea)) { + if (n < 2) + return RET_TOOFEW(0); + s2 = s[1]; + if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { + unsigned char t1 = (s1 < 0xe0 ? s1-0x81 : s1-0xc1); + unsigned char t2 = (s2 < 0x80 ? s2-0x40 : s2-0x41); + unsigned char buf[2]; + buf[0] = 2*t1 + (t2 < 0x5e ? 0 : 1) + 0x21; + buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; + return jisx0208_mbtowc(conv,pwc,buf,2); + } + } else if ((s1 == 0x87) || (s1 >= 0xed && s1 <= 0xee) || (s1 >= 0xfa)) { + if (n < 2) + return RET_TOOFEW(0); + return cp932ext_mbtowc(conv,pwc,s,2); + } else if (s1 >= 0xf0 && s1 <= 0xf9) { + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + if (n < 2) + return RET_TOOFEW(0); + s2 = s[1]; + if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { + *pwc = 0xe000 + 188*(s1 - 0xf0) + (s2 < 0x80 ? s2-0x40 : s2-0x41); + return 2; + } + } + return RET_ILSEQ; + } +} + +static int +cp932_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + unsigned char c; + if (ret != 1) abort(); + c = buf[0]; + if (c < 0x80) { + r[0] = c; + return 1; + } + } + + /* Try JIS X 0201-1976 Katakana. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + unsigned char c; + if (ret != 1) abort(); + c = buf[0]; + if (c >= 0xa1 && c <= 0xdf) { + r[0] = c; + return 1; + } + } + + /* Try JIS X 0208-1990. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + unsigned char c1, c2; + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + c1 = buf[0]; + c2 = buf[1]; + if ((c1 >= 0x21 && c1 <= 0x74) && (c2 >= 0x21 && c2 <= 0x7e)) { + unsigned char t1 = (c1 - 0x21) >> 1; + unsigned char t2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21); + r[0] = (t1 < 0x1f ? t1+0x81 : t1+0xc1); + r[1] = (t2 < 0x3f ? t2+0x40 : t2+0x41); + return 2; + } + } + + /* Try CP932 extensions. */ + ret = cp932ext_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + if (wc >= 0xe000 && wc < 0xe758) { + unsigned char c1, c2; + if (n < 2) + return RET_TOOSMALL; + c1 = (unsigned int) (wc - 0xe000) / 188; + c2 = (unsigned int) (wc - 0xe000) % 188; + r[0] = c1+0xf0; + r[1] = (c2 < 0x3f ? c2+0x40 : c2+0x41); + return 2; + } + + /* Irreversible mappings. */ + if (wc == 0xff5e) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x81; + r[1] = 0x60; + return 2; + } + if (wc == 0x2225) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x81; + r[1] = 0x61; + return 2; + } + if (wc == 0xff0d) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x81; + r[1] = 0x7c; + return 2; + } + if (wc == 0xffe0) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x81; + r[1] = 0x91; + return 2; + } + if (wc == 0xffe1) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x81; + r[1] = 0x92; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp932ext.h b/Externals/libiconv-1.14/lib/cp932ext.h new file mode 100644 index 0000000000..6f94c9a5cf --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp932ext.h @@ -0,0 +1,709 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP932 extensions + */ + +static const unsigned short cp932ext_2uni_page87[92] = { + /* 0x87 */ + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, 0x2163, + 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0xfffd, 0x3349, + 0x3314, 0x3322, 0x334d, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, + 0x3357, 0x330d, 0x3326, 0x3323, 0x332b, 0x334a, 0x333b, 0x339c, + 0x339d, 0x339e, 0x338e, 0x338f, 0x33c4, 0x33a1, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x337b, 0x301d, + 0x301f, 0x2116, 0x33cd, 0x2121, 0x32a4, 0x32a5, 0x32a6, 0x32a7, + 0x32a8, 0x3231, 0x3232, 0x3239, 0x337e, 0x337d, 0x337c, 0x2252, + 0x2261, 0x222b, 0x222e, 0x2211, 0x221a, 0x22a5, 0x2220, 0x221f, + 0x22bf, 0x2235, 0x2229, 0x222a, +}; +static const unsigned short cp932ext_2uni_pageed[376] = { + /* 0xed */ + 0x7e8a, 0x891c, 0x9348, 0x9288, 0x84dc, 0x4fc9, 0x70bb, 0x6631, + 0x68c8, 0x92f9, 0x66fb, 0x5f45, 0x4e28, 0x4ee1, 0x4efc, 0x4f00, + 0x4f03, 0x4f39, 0x4f56, 0x4f92, 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd, + 0x5040, 0x5022, 0x4fff, 0x501e, 0x5046, 0x5070, 0x5042, 0x5094, + 0x50f4, 0x50d8, 0x514a, 0x5164, 0x519d, 0x51be, 0x51ec, 0x5215, + 0x529c, 0x52a6, 0x52c0, 0x52db, 0x5300, 0x5307, 0x5324, 0x5372, + 0x5393, 0x53b2, 0x53dd, 0xfa0e, 0x549c, 0x548a, 0x54a9, 0x54ff, + 0x5586, 0x5759, 0x5765, 0x57ac, 0x57c8, 0x57c7, 0xfa0f, 0xfa10, + 0x589e, 0x58b2, 0x590b, 0x5953, 0x595b, 0x595d, 0x5963, 0x59a4, + 0x59ba, 0x5b56, 0x5bc0, 0x752f, 0x5bd8, 0x5bec, 0x5c1e, 0x5ca6, + 0x5cba, 0x5cf5, 0x5d27, 0x5d53, 0xfa11, 0x5d42, 0x5d6d, 0x5db8, + 0x5db9, 0x5dd0, 0x5f21, 0x5f34, 0x5f67, 0x5fb7, 0x5fde, 0x605d, + 0x6085, 0x608a, 0x60de, 0x60d5, 0x6120, 0x60f2, 0x6111, 0x6137, + 0x6130, 0x6198, 0x6213, 0x62a6, 0x63f5, 0x6460, 0x649d, 0x64ce, + 0x654e, 0x6600, 0x6615, 0x663b, 0x6609, 0x662e, 0x661e, 0x6624, + 0x6665, 0x6657, 0x6659, 0xfa12, 0x6673, 0x6699, 0x66a0, 0x66b2, + 0x66bf, 0x66fa, 0x670e, 0xf929, 0x6766, 0x67bb, 0x6852, 0x67c0, + 0x6801, 0x6844, 0x68cf, 0xfa13, 0x6968, 0xfa14, 0x6998, 0x69e2, + 0x6a30, 0x6a6b, 0x6a46, 0x6a73, 0x6a7e, 0x6ae2, 0x6ae4, 0x6bd6, + 0x6c3f, 0x6c5c, 0x6c86, 0x6c6f, 0x6cda, 0x6d04, 0x6d87, 0x6d6f, + 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39, 0x6e5c, + 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005, 0x7007, + 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146, 0x7147, + 0xfa15, 0x71c1, 0x71fe, 0x72b1, + /* 0xee */ + 0x72be, 0x7324, 0xfa16, 0x7377, 0x73bd, 0x73c9, 0x73d6, 0x73e3, + 0x73d2, 0x7407, 0x73f5, 0x7426, 0x742a, 0x7429, 0x742e, 0x7462, + 0x7489, 0x749f, 0x7501, 0x756f, 0x7682, 0x769c, 0x769e, 0x769b, + 0x76a6, 0xfa17, 0x7746, 0x52af, 0x7821, 0x784e, 0x7864, 0x787a, + 0x7930, 0xfa18, 0xfa19, 0xfa1a, 0x7994, 0xfa1b, 0x799b, 0x7ad1, + 0x7ae7, 0xfa1c, 0x7aeb, 0x7b9e, 0xfa1d, 0x7d48, 0x7d5c, 0x7db7, + 0x7da0, 0x7dd6, 0x7e52, 0x7f47, 0x7fa1, 0xfa1e, 0x8301, 0x8362, + 0x837f, 0x83c7, 0x83f6, 0x8448, 0x84b4, 0x8553, 0x8559, 0x856b, + 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0x88f5, 0x8a12, 0x8a37, + 0x8a79, 0x8aa7, 0x8abe, 0x8adf, 0xfa22, 0x8af6, 0x8b53, 0x8b7f, + 0x8cf0, 0x8cf4, 0x8d12, 0x8d76, 0xfa23, 0x8ecf, 0xfa24, 0xfa25, + 0x9067, 0x90de, 0xfa26, 0x9115, 0x9127, 0x91da, 0x91d7, 0x91de, + 0x91ed, 0x91ee, 0x91e4, 0x91e5, 0x9206, 0x9210, 0x920a, 0x923a, + 0x9240, 0x923c, 0x924e, 0x9259, 0x9251, 0x9239, 0x9267, 0x92a7, + 0x9277, 0x9278, 0x92e7, 0x92d7, 0x92d9, 0x92d0, 0xfa27, 0x92d5, + 0x92e0, 0x92d3, 0x9325, 0x9321, 0x92fb, 0xfa28, 0x931e, 0x92ff, + 0x931d, 0x9302, 0x9370, 0x9357, 0x93a4, 0x93c6, 0x93de, 0x93f8, + 0x9431, 0x9445, 0x9448, 0x9592, 0xf9dc, 0xfa29, 0x969d, 0x96af, + 0x9733, 0x973b, 0x9743, 0x974d, 0x974f, 0x9751, 0x9755, 0x9857, + 0x9865, 0xfa2a, 0xfa2b, 0x9927, 0xfa2c, 0x999e, 0x9a4e, 0x9ad9, + 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00, 0x9d70, + 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, 0xfffd, 0xfffd, 0x2170, 0x2171, + 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, + 0xffe2, 0xffe4, 0xff07, 0xff02, +}; +static const unsigned short cp932ext_2uni_pagefa[388] = { + /* 0xfa */ + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, + 0x2166, 0x2167, 0x2168, 0x2169, 0xffe2, 0xffe4, 0xff07, 0xff02, + 0x3231, 0x2116, 0x2121, 0x2235, 0x7e8a, 0x891c, 0x9348, 0x9288, + 0x84dc, 0x4fc9, 0x70bb, 0x6631, 0x68c8, 0x92f9, 0x66fb, 0x5f45, + 0x4e28, 0x4ee1, 0x4efc, 0x4f00, 0x4f03, 0x4f39, 0x4f56, 0x4f92, + 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd, 0x5040, 0x5022, 0x4fff, 0x501e, + 0x5046, 0x5070, 0x5042, 0x5094, 0x50f4, 0x50d8, 0x514a, 0x5164, + 0x519d, 0x51be, 0x51ec, 0x5215, 0x529c, 0x52a6, 0x52c0, 0x52db, + 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53b2, 0x53dd, 0xfa0e, + 0x549c, 0x548a, 0x54a9, 0x54ff, 0x5586, 0x5759, 0x5765, 0x57ac, + 0x57c8, 0x57c7, 0xfa0f, 0xfa10, 0x589e, 0x58b2, 0x590b, 0x5953, + 0x595b, 0x595d, 0x5963, 0x59a4, 0x59ba, 0x5b56, 0x5bc0, 0x752f, + 0x5bd8, 0x5bec, 0x5c1e, 0x5ca6, 0x5cba, 0x5cf5, 0x5d27, 0x5d53, + 0xfa11, 0x5d42, 0x5d6d, 0x5db8, 0x5db9, 0x5dd0, 0x5f21, 0x5f34, + 0x5f67, 0x5fb7, 0x5fde, 0x605d, 0x6085, 0x608a, 0x60de, 0x60d5, + 0x6120, 0x60f2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62a6, + 0x63f5, 0x6460, 0x649d, 0x64ce, 0x654e, 0x6600, 0x6615, 0x663b, + 0x6609, 0x662e, 0x661e, 0x6624, 0x6665, 0x6657, 0x6659, 0xfa12, + 0x6673, 0x6699, 0x66a0, 0x66b2, 0x66bf, 0x66fa, 0x670e, 0xf929, + 0x6766, 0x67bb, 0x6852, 0x67c0, 0x6801, 0x6844, 0x68cf, 0xfa13, + 0x6968, 0xfa14, 0x6998, 0x69e2, 0x6a30, 0x6a6b, 0x6a46, 0x6a73, + 0x6a7e, 0x6ae2, 0x6ae4, 0x6bd6, 0x6c3f, 0x6c5c, 0x6c86, 0x6c6f, + 0x6cda, 0x6d04, 0x6d87, 0x6d6f, + /* 0xfb */ + 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39, 0x6e5c, + 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005, 0x7007, + 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146, 0x7147, + 0xfa15, 0x71c1, 0x71fe, 0x72b1, 0x72be, 0x7324, 0xfa16, 0x7377, + 0x73bd, 0x73c9, 0x73d6, 0x73e3, 0x73d2, 0x7407, 0x73f5, 0x7426, + 0x742a, 0x7429, 0x742e, 0x7462, 0x7489, 0x749f, 0x7501, 0x756f, + 0x7682, 0x769c, 0x769e, 0x769b, 0x76a6, 0xfa17, 0x7746, 0x52af, + 0x7821, 0x784e, 0x7864, 0x787a, 0x7930, 0xfa18, 0xfa19, 0xfa1a, + 0x7994, 0xfa1b, 0x799b, 0x7ad1, 0x7ae7, 0xfa1c, 0x7aeb, 0x7b9e, + 0xfa1d, 0x7d48, 0x7d5c, 0x7db7, 0x7da0, 0x7dd6, 0x7e52, 0x7f47, + 0x7fa1, 0xfa1e, 0x8301, 0x8362, 0x837f, 0x83c7, 0x83f6, 0x8448, + 0x84b4, 0x8553, 0x8559, 0x856b, 0xfa1f, 0x85b0, 0xfa20, 0xfa21, + 0x8807, 0x88f5, 0x8a12, 0x8a37, 0x8a79, 0x8aa7, 0x8abe, 0x8adf, + 0xfa22, 0x8af6, 0x8b53, 0x8b7f, 0x8cf0, 0x8cf4, 0x8d12, 0x8d76, + 0xfa23, 0x8ecf, 0xfa24, 0xfa25, 0x9067, 0x90de, 0xfa26, 0x9115, + 0x9127, 0x91da, 0x91d7, 0x91de, 0x91ed, 0x91ee, 0x91e4, 0x91e5, + 0x9206, 0x9210, 0x920a, 0x923a, 0x9240, 0x923c, 0x924e, 0x9259, + 0x9251, 0x9239, 0x9267, 0x92a7, 0x9277, 0x9278, 0x92e7, 0x92d7, + 0x92d9, 0x92d0, 0xfa27, 0x92d5, 0x92e0, 0x92d3, 0x9325, 0x9321, + 0x92fb, 0xfa28, 0x931e, 0x92ff, 0x931d, 0x9302, 0x9370, 0x9357, + 0x93a4, 0x93c6, 0x93de, 0x93f8, 0x9431, 0x9445, 0x9448, 0x9592, + 0xf9dc, 0xfa29, 0x969d, 0x96af, 0x9733, 0x973b, 0x9743, 0x974d, + 0x974f, 0x9751, 0x9755, 0x9857, 0x9865, 0xfa2a, 0xfa2b, 0x9927, + 0xfa2c, 0x999e, 0x9a4e, 0x9ad9, + /* 0xfc */ + 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00, 0x9d70, + 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, +}; + +static int +cp932ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x87) || (c1 >= 0xed && c1 <= 0xee) || (c1 >= 0xfa && c1 <= 0xfc)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xfd)) { + unsigned int i = 188 * (c1 - (c1 >= 0xe0 ? 0xc1 : 0x81)) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + unsigned short wc = 0xfffd; + if (i < 8272) { + if (i < 1220) + wc = cp932ext_2uni_page87[i-1128]; + } else if (i < 10716) { + if (i < 8648) + wc = cp932ext_2uni_pageed[i-8272]; + } else { + if (i < 11104) + wc = cp932ext_2uni_pagefa[i-10716]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short cp932ext_2charset[457] = { + 0xfa59, 0xfa5a, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, + 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa40, 0xfa41, 0xfa42, 0xfa43, + 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0x8794, 0x8795, + 0x8798, 0x8797, 0x879b, 0x879c, 0x8792, 0x8793, 0xfa5b, 0x8790, + 0x8791, 0x8796, 0x8799, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, + 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, + 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8780, + 0x8781, 0xfa58, 0x878b, 0x878c, 0x8785, 0x8786, 0x8787, 0x8788, + 0x8789, 0x8765, 0x8769, 0x8760, 0x8763, 0x8761, 0x876b, 0x876a, + 0x8764, 0x876c, 0x8766, 0x876e, 0x875f, 0x876d, 0x8762, 0x8767, + 0x8768, 0x877e, 0x878f, 0x878e, 0x878d, 0x8772, 0x8773, 0x876f, + 0x8770, 0x8771, 0x8775, 0x8774, 0x8783, 0xfa68, 0xfa69, 0xfa6a, + 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa70, 0xfa6f, 0xfa72, 0xfa71, + 0xfa61, 0xfa73, 0xfa76, 0xfa77, 0xfa75, 0xfa74, 0xfa7a, 0xfa78, + 0xfa79, 0xfa7b, 0xfa7d, 0xfa7c, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, + 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfb77, 0xfa87, 0xfa88, 0xfa89, + 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa92, 0xfa91, + 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa9a, 0xfa99, + 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfaa1, 0xfaa2, 0xfaa3, 0xfaa4, + 0xfaa5, 0xfaa6, 0xfaa7, 0xfaa9, 0xfaaa, 0xfaab, 0xfaac, 0xfaad, + 0xfaae, 0xfaaf, 0xfab2, 0xfab0, 0xfab3, 0xfab4, 0xfab5, 0xfab6, + 0xfab7, 0xfab8, 0xfa67, 0xfab9, 0xfaba, 0xfabb, 0xfabc, 0xfabd, + 0xfabe, 0xfac0, 0xfabf, 0xfac2, 0xfac3, 0xfac1, 0xfac5, 0xfac4, + 0xfac6, 0xfac7, 0xfac8, 0xfac9, 0xfaca, 0xfacb, 0xfacc, 0xfacd, + 0xface, 0xfad1, 0xfacf, 0xfad3, 0xfad4, 0xfad2, 0xfa63, 0xfad0, + 0xfad6, 0xfad7, 0xfad5, 0xfad9, 0xfada, 0xfadb, 0xfadc, 0xfadd, + 0xfade, 0xfa66, 0xfadf, 0xfae1, 0xfae2, 0xfae4, 0xfae5, 0xfae6, + 0xfae3, 0xfa64, 0xfae7, 0xfae9, 0xfaeb, 0xfaec, 0xfaed, 0xfaef, + 0xfaee, 0xfaf0, 0xfaf1, 0xfaf2, 0xfaf3, 0xfaf4, 0xfaf5, 0xfaf6, + 0xfaf8, 0xfaf7, 0xfaf9, 0xfafa, 0xfafc, 0xfafb, 0xfb40, 0xfb41, + 0xfb42, 0xfb44, 0xfb43, 0xfb45, 0xfb48, 0xfb46, 0xfb49, 0xfb47, + 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, + 0xfb52, 0xfa62, 0xfb54, 0xfb53, 0xfb56, 0xfb57, 0xfb55, 0xfb59, + 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5f, 0xfb60, 0xfb61, 0xfb64, + 0xfb62, 0xfb63, 0xfb66, 0xfb65, 0xfb67, 0xfb69, 0xfb68, 0xfb6a, + 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfaa8, 0xfb6f, 0xfb70, 0xfb73, + 0xfb71, 0xfb72, 0xfb74, 0xfb76, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, + 0xfb7c, 0xfb81, 0xfb83, 0xfb84, 0xfb85, 0xfb87, 0xfb88, 0xfb8a, + 0xfb8b, 0xfb8d, 0xfb8c, 0xfb8e, 0xfb8f, 0xfa5c, 0xfb90, 0xfb91, + 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfa60, + 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9e, 0xfba1, 0xfba2, 0xfa5d, 0xfba3, + 0xfba4, 0xfba5, 0xfba6, 0xfba7, 0xfba8, 0xfbaa, 0xfbab, 0xfbac, + 0xfbad, 0xfbae, 0xfbaf, 0xfbb0, 0xfbb2, 0xfbb5, 0xfbb6, 0xfbb8, + 0xfbb9, 0xfbbb, 0xfbba, 0xfbbc, 0xfbbf, 0xfbc0, 0xfbbd, 0xfbbe, + 0xfbc1, 0xfbc3, 0xfbc2, 0xfbca, 0xfbc4, 0xfbc6, 0xfbc5, 0xfbc7, + 0xfbc9, 0xfbc8, 0xfbcb, 0xfbcd, 0xfbce, 0xfa5f, 0xfbcc, 0xfbd2, + 0xfbd6, 0xfbd4, 0xfbd0, 0xfbd1, 0xfbd5, 0xfbcf, 0xfa65, 0xfbd9, + 0xfbdc, 0xfbde, 0xfbdd, 0xfbdb, 0xfbd8, 0xfbd7, 0xfa5e, 0xfbe0, + 0xfbdf, 0xfbe1, 0xfbe2, 0xfbe3, 0xfbe4, 0xfbe5, 0xfbe6, 0xfbe7, + 0xfbe8, 0xfbeb, 0xfbec, 0xfbed, 0xfbee, 0xfbef, 0xfbf0, 0xfbf1, + 0xfbf2, 0xfbf3, 0xfbf4, 0xfbf5, 0xfbf8, 0xfbfa, 0xfbfb, 0xfbfc, + 0xfc40, 0xfc42, 0xfc41, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc48, + 0xfc47, 0xfc4a, 0xfc4b, 0xfae0, 0xfbe9, 0xfa90, 0xfa9b, 0xfa9c, + 0xfab1, 0xfad8, 0xfae8, 0xfaea, 0xfb58, 0xfb5e, 0xfb75, 0xfb7d, + 0xfb7e, 0xfb80, 0xfb82, 0xfb86, 0xfb89, 0xfb92, 0xfb9d, 0xfb9f, + 0xfba0, 0xfba9, 0xfbb1, 0xfbb3, 0xfbb4, 0xfbb7, 0xfbd3, 0xfbda, + 0xfbea, 0xfbf6, 0xfbf7, 0xfbf9, 0xfc49, 0xfa57, 0xfa56, 0xfa54, + 0xfa55, +}; + +static const Summary16 cp932ext_uni2indx_page21[28] = { + /* 0x2100 */ + { 0, 0x0000 }, { 0, 0x0040 }, { 1, 0x0002 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x03ff }, { 12, 0x03ff }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + /* 0x2200 */ + { 22, 0x0000 }, { 22, 0x8402 }, { 25, 0x4e01 }, { 30, 0x0020 }, + { 31, 0x0000 }, { 31, 0x0004 }, { 32, 0x0002 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0020 }, { 34, 0x8000 }, +}; +static const Summary16 cp932ext_uni2indx_page24[8] = { + /* 0x2400 */ + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xffff }, { 51, 0x000f }, +}; +static const Summary16 cp932ext_uni2indx_page30[2] = { + /* 0x3000 */ + { 55, 0x0000 }, { 55, 0xa000 }, +}; +static const Summary16 cp932ext_uni2indx_page32[29] = { + /* 0x3200 */ + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0206 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x01f0 }, { 65, 0x0000 }, + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + /* 0x3300 */ + { 65, 0x2008 }, { 67, 0x0110 }, { 69, 0x08cc }, { 74, 0x0840 }, + { 76, 0x2600 }, { 79, 0x0082 }, { 81, 0x0000 }, { 81, 0x7800 }, + { 85, 0xc000 }, { 87, 0x7000 }, { 90, 0x0002 }, { 91, 0x0000 }, + { 91, 0x2010 }, +}; +static const Summary16 cp932ext_uni2indx_page4e[121] = { + /* 0x4e00 */ + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0100 }, { 94, 0x0000 }, + { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, + { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, + { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0002 }, { 95, 0x1000 }, + /* 0x4f00 */ + { 96, 0x0009 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0200 }, + { 99, 0x0000 }, { 99, 0x0040 }, { 100, 0x0000 }, { 100, 0x0000 }, + { 100, 0x0400 }, { 101, 0x0414 }, { 104, 0x0000 }, { 104, 0x0000 }, + { 104, 0x2200 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x8000 }, + /* 0x5000 */ + { 107, 0x0000 }, { 107, 0x4000 }, { 108, 0x0004 }, { 109, 0x0000 }, + { 109, 0x0045 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0001 }, + { 113, 0x0000 }, { 113, 0x0010 }, { 114, 0x0000 }, { 114, 0x0000 }, + { 114, 0x0000 }, { 114, 0x0100 }, { 115, 0x0000 }, { 115, 0x0010 }, + /* 0x5100 */ + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, + { 116, 0x0400 }, { 117, 0x0000 }, { 117, 0x0010 }, { 118, 0x0000 }, + { 118, 0x0000 }, { 118, 0x2000 }, { 119, 0x0000 }, { 119, 0x4000 }, + { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x1000 }, { 121, 0x0000 }, + /* 0x5200 */ + { 121, 0x0000 }, { 121, 0x0020 }, { 122, 0x0000 }, { 122, 0x0000 }, + { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, + { 122, 0x0000 }, { 122, 0x1000 }, { 123, 0x8040 }, { 125, 0x0000 }, + { 125, 0x0001 }, { 126, 0x0800 }, { 127, 0x0000 }, { 127, 0x0000 }, + /* 0x5300 */ + { 127, 0x0081 }, { 129, 0x0000 }, { 129, 0x0010 }, { 130, 0x0000 }, + { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0004 }, + { 131, 0x0000 }, { 131, 0x0008 }, { 132, 0x0000 }, { 132, 0x0004 }, + { 133, 0x0000 }, { 133, 0x2000 }, { 134, 0x0000 }, { 134, 0x0000 }, + /* 0x5400 */ + { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, + { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, + { 134, 0x0400 }, { 135, 0x1000 }, { 136, 0x0200 }, { 137, 0x0000 }, + { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x8000 }, + /* 0x5500 */ + { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, + { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, + { 138, 0x0040 }, +}; +static const Summary16 cp932ext_uni2indx_page57[44] = { + /* 0x5700 */ + { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, + { 139, 0x0000 }, { 139, 0x0200 }, { 140, 0x0020 }, { 141, 0x0000 }, + { 141, 0x0000 }, { 141, 0x0000 }, { 141, 0x1000 }, { 142, 0x0000 }, + { 142, 0x0180 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, + /* 0x5800 */ + { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, + { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, + { 144, 0x0000 }, { 144, 0x4000 }, { 145, 0x0000 }, { 145, 0x0004 }, + { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, + /* 0x5900 */ + { 146, 0x0800 }, { 147, 0x0000 }, { 147, 0x0000 }, { 147, 0x0000 }, + { 147, 0x0000 }, { 147, 0x2808 }, { 150, 0x0008 }, { 151, 0x0000 }, + { 151, 0x0000 }, { 151, 0x0000 }, { 151, 0x0010 }, { 152, 0x0400 }, +}; +static const Summary16 cp932ext_uni2indx_page5b[46] = { + /* 0x5b00 */ + { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, + { 153, 0x0000 }, { 153, 0x0040 }, { 154, 0x0000 }, { 154, 0x0000 }, + { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, + { 154, 0x0001 }, { 155, 0x0100 }, { 156, 0x1000 }, { 157, 0x0000 }, + /* 0x5c00 */ + { 157, 0x0000 }, { 157, 0x4000 }, { 158, 0x0000 }, { 158, 0x0000 }, + { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, + { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0040 }, { 159, 0x0400 }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0020 }, + /* 0x5d00 */ + { 161, 0x0000 }, { 161, 0x0000 }, { 161, 0x0080 }, { 162, 0x0000 }, + { 162, 0x0004 }, { 163, 0x0008 }, { 164, 0x2000 }, { 165, 0x0000 }, + { 165, 0x0000 }, { 165, 0x0000 }, { 165, 0x0000 }, { 165, 0x0300 }, + { 167, 0x0000 }, { 167, 0x0001 }, +}; +static const Summary16 cp932ext_uni2indx_page5f[458] = { + /* 0x5f00 */ + { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0002 }, { 169, 0x0010 }, + { 170, 0x0020 }, { 171, 0x0000 }, { 171, 0x0080 }, { 172, 0x0000 }, + { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0080 }, + { 173, 0x0000 }, { 173, 0x4000 }, { 174, 0x0000 }, { 174, 0x0000 }, + /* 0x6000 */ + { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, + { 174, 0x0000 }, { 174, 0x2000 }, { 175, 0x0000 }, { 175, 0x0000 }, + { 175, 0x0420 }, { 177, 0x0000 }, { 177, 0x0000 }, { 177, 0x0000 }, + { 177, 0x0000 }, { 177, 0x4020 }, { 179, 0x0000 }, { 179, 0x0004 }, + /* 0x6100 */ + { 180, 0x0000 }, { 180, 0x0002 }, { 181, 0x0001 }, { 182, 0x0081 }, + { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, + { 184, 0x0000 }, { 184, 0x0100 }, { 185, 0x0000 }, { 185, 0x0000 }, + { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, + /* 0x6200 */ + { 185, 0x0000 }, { 185, 0x0008 }, { 186, 0x0000 }, { 186, 0x0000 }, + { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, + { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0040 }, { 187, 0x0000 }, + { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, + /* 0x6300 */ + { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, + { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, + { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, + { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0020 }, + /* 0x6400 */ + { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, + { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0001 }, { 189, 0x0000 }, + { 189, 0x0000 }, { 189, 0x2000 }, { 190, 0x0000 }, { 190, 0x0000 }, + { 190, 0x4000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, + /* 0x6500 */ + { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, + { 191, 0x4000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, + { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, + { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, + /* 0x6600 */ + { 192, 0x0201 }, { 194, 0x4020 }, { 196, 0x4010 }, { 198, 0x0802 }, + { 200, 0x0000 }, { 200, 0x0280 }, { 202, 0x0020 }, { 203, 0x0008 }, + { 204, 0x0000 }, { 204, 0x0200 }, { 205, 0x0001 }, { 206, 0x8004 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0c00 }, + /* 0x6700 */ + { 210, 0x4000 }, { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0000 }, + { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0040 }, { 212, 0x0000 }, + { 212, 0x0000 }, { 212, 0x0000 }, { 212, 0x0000 }, { 212, 0x0800 }, + { 213, 0x0001 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, + /* 0x6800 */ + { 214, 0x0002 }, { 215, 0x0000 }, { 215, 0x0000 }, { 215, 0x0000 }, + { 215, 0x0010 }, { 216, 0x0004 }, { 217, 0x0000 }, { 217, 0x0000 }, + { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, + { 217, 0x8100 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, + /* 0x6900 */ + { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, + { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0100 }, { 220, 0x0000 }, + { 220, 0x0000 }, { 220, 0x0100 }, { 221, 0x0000 }, { 221, 0x0000 }, + { 221, 0x0000 }, { 221, 0x0000 }, { 221, 0x0004 }, { 222, 0x0000 }, + /* 0x6a00 */ + { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0001 }, + { 223, 0x0040 }, { 224, 0x0000 }, { 224, 0x0800 }, { 225, 0x4008 }, + { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, + { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0014 }, { 229, 0x0000 }, + /* 0x6b00 */ + { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, + { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, + { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, + { 229, 0x0000 }, { 229, 0x0040 }, { 230, 0x0000 }, { 230, 0x0000 }, + /* 0x6c00 */ + { 230, 0x0000 }, { 230, 0x0000 }, { 230, 0x0000 }, { 230, 0x8000 }, + { 231, 0x0000 }, { 231, 0x1000 }, { 232, 0x8000 }, { 233, 0x0000 }, + { 233, 0x0040 }, { 234, 0x0000 }, { 234, 0x0000 }, { 234, 0x0000 }, + { 234, 0x0000 }, { 234, 0x0400 }, { 235, 0x0000 }, { 235, 0x0000 }, + /* 0x6d00 */ + { 235, 0x0010 }, { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x0000 }, + { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x8000 }, { 237, 0x0000 }, + { 237, 0x0080 }, { 238, 0x0040 }, { 239, 0x1000 }, { 240, 0x0000 }, + { 240, 0x8000 }, { 241, 0x0000 }, { 241, 0x0000 }, { 241, 0x1104 }, + /* 0x6e00 */ + { 244, 0x0000 }, { 244, 0x0000 }, { 244, 0x0080 }, { 245, 0x1200 }, + { 247, 0x0000 }, { 247, 0x1000 }, { 248, 0x0000 }, { 248, 0x0000 }, + { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x8000 }, + { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, + /* 0x6f00 */ + { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, + { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, + { 249, 0x0100 }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0x0020 }, + { 251, 0x0000 }, { 251, 0x0000 }, { 251, 0x0000 }, { 251, 0x0020 }, + /* 0x7000 */ + { 252, 0x00a0 }, { 254, 0x0000 }, { 254, 0x0100 }, { 255, 0x0000 }, + { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0000 }, + { 255, 0x0020 }, { 256, 0x0000 }, { 256, 0x0800 }, { 257, 0x0800 }, + { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, + /* 0x7100 */ + { 258, 0x8010 }, { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x0000 }, + { 260, 0x00c0 }, { 262, 0x1000 }, { 263, 0x0000 }, { 263, 0x0000 }, + { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, + { 263, 0x0002 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x4000 }, + /* 0x7200 */ + { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, + { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, + { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x4002 }, + { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0000 }, + /* 0x7300 */ + { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0010 }, { 268, 0x0000 }, + { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0080 }, + { 269, 0x0000 }, { 269, 0x0000 }, { 269, 0x0000 }, { 269, 0x2000 }, + { 270, 0x0200 }, { 271, 0x0044 }, { 273, 0x0008 }, { 274, 0x0020 }, + /* 0x7400 */ + { 275, 0x0080 }, { 276, 0x0000 }, { 276, 0x4640 }, { 280, 0x0000 }, + { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x0004 }, { 281, 0x0000 }, + { 281, 0x0200 }, { 282, 0x8000 }, { 283, 0x0000 }, { 283, 0x0000 }, + { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, + /* 0x7500 */ + { 283, 0x0002 }, { 284, 0x0000 }, { 284, 0x8000 }, { 285, 0x0000 }, + { 285, 0x0000 }, { 285, 0x0000 }, { 285, 0x8000 }, { 286, 0x0000 }, + { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, + { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, + /* 0x7600 */ + { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, + { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, + { 286, 0x0004 }, { 287, 0x5800 }, { 290, 0x0040 }, { 291, 0x0000 }, + { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, + /* 0x7700 */ + { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, + { 291, 0x0040 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, + { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, + { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, + /* 0x7800 */ + { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0002 }, { 293, 0x0000 }, + { 293, 0x4000 }, { 294, 0x0000 }, { 294, 0x0010 }, { 295, 0x0400 }, + { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, + { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, + /* 0x7900 */ + { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0001 }, + { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0000 }, + { 297, 0x0000 }, { 297, 0x0810 }, { 299, 0x0000 }, { 299, 0x0000 }, + { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, + /* 0x7a00 */ + { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, + { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, + { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, + { 299, 0x0000 }, { 299, 0x0002 }, { 300, 0x0880 }, { 302, 0x0000 }, + /* 0x7b00 */ + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, + { 302, 0x0000 }, { 302, 0x4000 }, +}; +static const Summary16 cp932ext_uni2indx_page7d[43] = { + /* 0x7d00 */ + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, + { 303, 0x0100 }, { 304, 0x1000 }, { 305, 0x0000 }, { 305, 0x0000 }, + { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0001 }, { 306, 0x0080 }, + { 307, 0x0000 }, { 307, 0x0040 }, { 308, 0x0000 }, { 308, 0x0000 }, + /* 0x7e00 */ + { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0000 }, + { 308, 0x0000 }, { 308, 0x0004 }, { 309, 0x0000 }, { 309, 0x0000 }, + { 309, 0x0400 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, + { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, + /* 0x7f00 */ + { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, + { 310, 0x0080 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, + { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0002 }, +}; +static const Summary16 cp932ext_uni2indx_page83[44] = { + /* 0x8300 */ + { 312, 0x0002 }, { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0000 }, + { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0004 }, { 314, 0x8000 }, + { 315, 0x0000 }, { 315, 0x0000 }, { 315, 0x0000 }, { 315, 0x0000 }, + { 315, 0x0080 }, { 316, 0x0000 }, { 316, 0x0000 }, { 316, 0x0040 }, + /* 0x8400 */ + { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x0000 }, + { 317, 0x0100 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, + { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0010 }, + { 319, 0x0000 }, { 319, 0x1000 }, { 320, 0x0000 }, { 320, 0x0000 }, + /* 0x8500 */ + { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0000 }, + { 320, 0x0000 }, { 320, 0x0208 }, { 322, 0x0800 }, { 323, 0x0000 }, + { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0001 }, +}; +static const Summary16 cp932ext_uni2indx_page88[109] = { + /* 0x8800 */ + { 324, 0x0080 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, + { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, + { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, + { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0020 }, + /* 0x8900 */ + { 326, 0x0000 }, { 326, 0x1000 }, { 327, 0x0000 }, { 327, 0x0000 }, + { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, + { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, + { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, + /* 0x8a00 */ + { 327, 0x0000 }, { 327, 0x0004 }, { 328, 0x0000 }, { 328, 0x0080 }, + { 329, 0x0000 }, { 329, 0x0000 }, { 329, 0x0000 }, { 329, 0x0200 }, + { 330, 0x0000 }, { 330, 0x0000 }, { 330, 0x0080 }, { 331, 0x4000 }, + { 332, 0x0000 }, { 332, 0x8000 }, { 333, 0x0000 }, { 333, 0x0040 }, + /* 0x8b00 */ + { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, + { 334, 0x0000 }, { 334, 0x0008 }, { 335, 0x0000 }, { 335, 0x8000 }, + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, + /* 0x8c00 */ + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, + { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0011 }, + /* 0x8d00 */ + { 338, 0x0000 }, { 338, 0x0004 }, { 339, 0x0000 }, { 339, 0x0000 }, + { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0040 }, + { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, + { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, + /* 0x8e00 */ + { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, + { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, + { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, + { 340, 0x8000 }, +}; +static const Summary16 cp932ext_uni2indx_page90[238] = { + /* 0x9000 */ + { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, + { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0080 }, { 342, 0x0000 }, + { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, + { 342, 0x0000 }, { 342, 0x4000 }, { 343, 0x0000 }, { 343, 0x0000 }, + /* 0x9100 */ + { 343, 0x0000 }, { 343, 0x0020 }, { 344, 0x0080 }, { 345, 0x0000 }, + { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, + { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, + { 345, 0x0000 }, { 345, 0x4480 }, { 348, 0x6030 }, { 352, 0x0000 }, + /* 0x9200 */ + { 352, 0x0440 }, { 354, 0x0001 }, { 355, 0x0000 }, { 355, 0x1600 }, + { 358, 0x4001 }, { 360, 0x0202 }, { 362, 0x0080 }, { 363, 0x0180 }, + { 365, 0x0100 }, { 366, 0x0000 }, { 366, 0x0080 }, { 367, 0x0000 }, + { 367, 0x0000 }, { 367, 0x02a9 }, { 372, 0x0081 }, { 374, 0x8a00 }, + /* 0x9300 */ + { 377, 0x0004 }, { 378, 0x6000 }, { 380, 0x0022 }, { 382, 0x0000 }, + { 382, 0x0100 }, { 383, 0x0080 }, { 384, 0x0000 }, { 384, 0x0001 }, + { 385, 0x0000 }, { 385, 0x0000 }, { 385, 0x0010 }, { 386, 0x0000 }, + { 386, 0x0040 }, { 387, 0x4000 }, { 388, 0x0000 }, { 388, 0x0100 }, + /* 0x9400 */ + { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0002 }, + { 390, 0x0120 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, + { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, + { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, + /* 0x9500 */ + { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, + { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, + { 392, 0x0000 }, { 392, 0x0004 }, { 393, 0x0000 }, { 393, 0x0000 }, + { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, + /* 0x9600 */ + { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, + { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, + { 393, 0x0000 }, { 393, 0x2000 }, { 394, 0x8000 }, { 395, 0x0000 }, + { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, + /* 0x9700 */ + { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0808 }, + { 397, 0xa008 }, { 400, 0x0022 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + /* 0x9800 */ + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0x0000 }, { 402, 0x0080 }, { 403, 0x0020 }, { 404, 0x0000 }, + { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, + { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, + /* 0x9900 */ + { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0080 }, { 405, 0x0000 }, + { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, + { 405, 0x0000 }, { 405, 0x4000 }, { 406, 0x0000 }, { 406, 0x0000 }, + { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, + /* 0x9a00 */ + { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, + { 406, 0x4000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, + { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, + { 407, 0x0000 }, { 407, 0x1200 }, { 409, 0x0000 }, { 409, 0x0000 }, + /* 0x9b00 */ + { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, + { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0024 }, + { 411, 0x8000 }, { 412, 0x0000 }, { 412, 0x0000 }, { 412, 0x0802 }, + { 414, 0x0000 }, { 414, 0x0000 }, { 414, 0x0000 }, { 414, 0x0000 }, + /* 0x9c00 */ + { 414, 0x0001 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, + { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, + { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, + { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, + /* 0x9d00 */ + { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, + { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0800 }, { 416, 0x0001 }, + { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, + { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, + /* 0x9e00 */ + { 417, 0x0000 }, { 417, 0x0200 }, { 418, 0x0000 }, { 418, 0x0000 }, + { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, + { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, + { 418, 0x0000 }, { 418, 0x0002 }, +}; +static const Summary16 cp932ext_uni2indx_pagef9[19] = { + /* 0xf900 */ + { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0200 }, { 420, 0x0000 }, + { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, + { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, + { 420, 0x0000 }, { 420, 0x1000 }, { 421, 0x0000 }, { 421, 0x0000 }, + /* 0xfa00 */ + { 421, 0xc000 }, { 423, 0xffff }, { 439, 0x3fff }, +}; +static const Summary16 cp932ext_uni2indx_pageff[15] = { + /* 0xff00 */ + { 453, 0x0084 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, + { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, + { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, + { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0014 }, +}; + +static int +cp932ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x2100 && wc < 0x22c0) + summary = &cp932ext_uni2indx_page21[(wc>>4)-0x210]; + else if (wc >= 0x2400 && wc < 0x2480) + summary = &cp932ext_uni2indx_page24[(wc>>4)-0x240]; + else if (wc >= 0x3000 && wc < 0x3020) + summary = &cp932ext_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x3200 && wc < 0x33d0) + summary = &cp932ext_uni2indx_page32[(wc>>4)-0x320]; + else if (wc >= 0x4e00 && wc < 0x5590) + summary = &cp932ext_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0x5700 && wc < 0x59c0) + summary = &cp932ext_uni2indx_page57[(wc>>4)-0x570]; + else if (wc >= 0x5b00 && wc < 0x5de0) + summary = &cp932ext_uni2indx_page5b[(wc>>4)-0x5b0]; + else if (wc >= 0x5f00 && wc < 0x7ba0) + summary = &cp932ext_uni2indx_page5f[(wc>>4)-0x5f0]; + else if (wc >= 0x7d00 && wc < 0x7fb0) + summary = &cp932ext_uni2indx_page7d[(wc>>4)-0x7d0]; + else if (wc >= 0x8300 && wc < 0x85c0) + summary = &cp932ext_uni2indx_page83[(wc>>4)-0x830]; + else if (wc >= 0x8800 && wc < 0x8ed0) + summary = &cp932ext_uni2indx_page88[(wc>>4)-0x880]; + else if (wc >= 0x9000 && wc < 0x9ee0) + summary = &cp932ext_uni2indx_page90[(wc>>4)-0x900]; + else if (wc >= 0xf900 && wc < 0xfa30) + summary = &cp932ext_uni2indx_pagef9[(wc>>4)-0xf90]; + else if (wc >= 0xff00 && wc < 0xfff0) + summary = &cp932ext_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = cp932ext_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/cp936.h b/Externals/libiconv-1.14/lib/cp936.h new file mode 100644 index 0000000000..06e510cae2 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp936.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP936 + */ + +/* + * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese + * specification, whereas CP936 is de-facto maintained by Microsoft. And, + * of course, Microsoft modified CP936 since 1999. + * + * The differences from GBK are: + * + * 1. A single character: + * + * code CP936.TXT + * 0x80 0x20AC # EURO SIGN + * + * Some variants of CP936 (in JDK, Windows-2000, ICU) also add: + * + * 2. Private area mappings: + * + * code Unicode + * 0x{A1..A2}{40..7E,80..A0} U+E4C6..U+E585 + * 0x{AA..AF,F8..FE}{A1..FE} U+E000..U+E4C5 + * + * We add them too because, although there are backward compatibility problems + * when a character from a private area is moved to an official Unicode code + * point, they are useful for some people in practice. + */ + +static int +cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + /* Try GBK first. */ + { + int ret = ces_gbk_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + } + /* Then handle the additional mappings. */ + { + unsigned char c = *s; + if (c == 0x80) { + *pwc = 0x20ac; + return 1; + } + /* User-defined characters */ + if (c >= 0xa1 && c <= 0xa2) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { + *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + return 2; + } + } + } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1); + return 2; + } + } + } + } + return RET_ILSEQ; +} + +static int +cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + /* Try GBK first. */ + { + int ret = ces_gbk_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + } + /* Then handle the additional mappings. */ + if (wc >= 0xe000 && wc < 0xe586) { + /* User-defined characters */ + if (n < 2) + return RET_TOOFEW(0); + if (wc < 0xe4c6) { + unsigned int i = wc - 0xe000; + unsigned int c1 = i / 94; + unsigned int c2 = i % 94; + r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2); + r[1] = c2 + 0xa1; + return 2; + } else { + unsigned int i = wc - 0xe4c6; + unsigned int c1 = i / 96; + unsigned int c2 = i % 96; + r[0] = c1 + 0xa1; + r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41); + return 2; + } + } else if (wc == 0x20ac) { + r[0] = 0x80; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp936ext.h b/Externals/libiconv-1.14/lib/cp936ext.h new file mode 100644 index 0000000000..db1817b701 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp936ext.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP936 extensions + */ + +static const unsigned short cp936ext_2uni_pagea6[181-159] = { + /* 0xa6 */ + 0xfe35, + 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, + 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, + 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, +}; +static const unsigned short cp936ext_2uni_pagea8[128-122] = { + /* 0xa8 */ + 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261, +}; + +static int +cp936ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0xa6) || (c1 == 0xa8)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { + unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + unsigned short wc = 0xfffd; + if (i < 7410) { + if (i >= 7189 && i < 7211) + wc = cp936ext_2uni_pagea6[i-7189]; + } else { + if (i >= 7532 && i < 7538) + wc = cp936ext_2uni_pagea8[i-7532]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short cp936ext_page01[16] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ + 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ +}; +static const unsigned short cp936ext_page02[24] = { + 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ + 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ +}; +static const unsigned short cp936ext_pagefe[24] = { + 0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/ + 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/ + 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ +}; + +static int +cp936ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + unsigned short c = 0; + if (wc >= 0x0140 && wc < 0x0150) + c = cp936ext_page01[wc-0x0140]; + else if (wc >= 0x0250 && wc < 0x0268) + c = cp936ext_page02[wc-0x0250]; + else if (wc >= 0xfe30 && wc < 0xfe48) + c = cp936ext_pagefe[wc-0xfe30]; + if (c != 0) { + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/cp943.h b/Externals/libiconv-1.14/lib/cp943.h new file mode 100644 index 0000000000..dbaebe97e2 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp943.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * IBM CP943 + */ + +/* This is essentially CP932, with many mappings missing in the AIX conversion + table. We just pretend it were the same as CP932. */ + +#define cp943_mbtowc cp932_mbtowc +#define cp943_wctomb cp932_wctomb diff --git a/Externals/libiconv-1.14/lib/cp949.h b/Externals/libiconv-1.14/lib/cp949.h new file mode 100644 index 0000000000..665e7243ae --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp949.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 1999-2001, 2005, 2007 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP949 is EUC-KR, extended with UHC (Unified Hangul Code). + * + * Some variants of CP949 (in JDK, Windows-2000, ICU) also add: + * + * 2. Private area mappings: + * + * code Unicode + * 0xC9{A1..FE} U+E000..U+E05D + * 0xFE{A1..FE} U+E05E..U+E0BB + * + * We add them too because, although there are backward compatibility problems + * when a character from a private area is moved to an official Unicode code + * point, they are useful for some people in practice. + */ + +#include "uhc_1.h" +#include "uhc_2.h" + +static int +cp949_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* UHC part 1 */ + if (c >= 0x81 && c <= 0xa0) + return uhc_1_mbtowc(conv,pwc,s,n); + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 < 0xa1) + /* UHC part 2 */ + return uhc_2_mbtowc(conv,pwc,s,n); + else if (c2 < 0xff && !(c == 0xa2 && c2 == 0xe8)) { + /* Code set 1 (KS C 5601-1992, now KS X 1001:1998) */ + unsigned char buf[2]; + int ret; + buf[0] = c-0x80; buf[1] = c2-0x80; + ret = ksc5601_mbtowc(conv,pwc,buf,2); + if (ret != RET_ILSEQ) + return ret; + /* User-defined characters */ + if (c == 0xc9) { + *pwc = 0xe000 + (c2 - 0xa1); + return 2; + } + if (c == 0xfe) { + *pwc = 0xe05e + (c2 - 0xa1); + return 2; + } + } + } + } + return RET_ILSEQ; +} + +static int +cp949_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (KS C 5601-1992, now KS X 1001:1998) */ + if (wc != 0x327e) { + ret = ksc5601_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + } + + /* UHC */ + if (wc >= 0xac00 && wc < 0xd7a4) { + if (wc < 0xc8a5) + return uhc_1_wctomb(conv,r,wc,n); + else + return uhc_2_wctomb(conv,r,wc,n); + } + + /* User-defined characters */ + if (wc >= 0xe000 && wc < 0xe0bc) { + if (n < 2) + return RET_TOOSMALL; + if (wc < 0xe05e) { + r[0] = 0xc9; + r[1] = wc - 0xe000 + 0xa1; + } else { + r[0] = 0xfe; + r[1] = wc - 0xe05e + 0xa1; + } + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp950.h b/Externals/libiconv-1.14/lib/cp950.h new file mode 100644 index 0000000000..28ca19945c --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp950.h @@ -0,0 +1,284 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP950 + */ + +/* + * Microsoft CP950 is a slightly extended and slightly modified version of + * BIG5. The differences between the EASTASIA/OTHER/BIG5.TXT and + * VENDORS/MICSFT/WINDOWS/CP950.TXT tables found on ftp.unicode.org are + * as follows: + * + * 1. Some characters in the BIG5 range are defined differently: + * + * code BIG5.TXT CP950.TXT + * 0xA145 0x2022 # BULLET 0x2027 # HYPHENATION POINT + * 0xA14E 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA + * 0xFE51 # SMALL IDEOGRAPHIC COMMA + * 0xA15A --- 0x2574 # BOX DRAWINGS LIGHT LEFT + * 0xA1C2 0x203E # OVERLINE 0x00AF # MACRON + * 0xA1C3 --- 0xFFE3 # FULLWIDTH MACRON + * 0xA1C5 --- 0x02CD # MODIFIER LETTER LOW MACRON + * 0xA1E3 0x223C # TILDE OPERATOR 0xFF5E # FULLWIDTH TILDE + * 0xA1F2 0x2641 # EARTH 0x2295 # CIRCLED PLUS + * 0xA1F3 0x2609 # SUN 0x2299 # CIRCLED DOT OPERATOR + * 0xA1FE --- 0xFF0F # FULLWIDTH SOLIDUS + * 0xA240 --- 0xFF3C # FULLWIDTH REVERSE SOLIDUS + * 0xA241 0xFF0F # FULLWIDTH SOLIDUS 0x2215 # DIVISION SLASH + * 0xA242 0xFF3C # FULLWIDTH REVERSE SOLIDUS + * 0xFE68 # SMALL REVERSE SOLIDUS + * 0xA244 0x00A5 # YEN SIGN 0xFFE5 # FULLWIDTH YEN SIGN + * 0xA246 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN + * 0xA247 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN + * 0xA2CC --- 0x5341 + * 0xA2CE --- 0x5345 + * + * 2. A small new row. See cp950ext.h. + * + * 3. CP950.TXT is lacking the range 0xC6A1..0xC7FC (Hiragana, Katakana, + * Cyrillic, circled digits, parenthesized digits). + * + * We implement this omission, because said range is marked "uncertain" + * in the unicode.org BIG5 table. + * + * The table found on Microsoft's website furthermore adds: + * + * 4. A single character: + * + * code CP950.TXT + * 0xA3E1 0x20AC # EURO SIGN + * + * Many variants of BIG5 or CP950 (in JDK, Solaris, OSF/1, Windows-2000, ICU, + * as well as our BIG5-2003 converter) also add: + * + * 5. Private area mappings: + * + * code Unicode + * 0x{81..8D}{40..7E,A1..FE} U+EEB8..U+F6B0 + * 0x{8E..A0}{40..7E,A1..FE} U+E311..U+EEB7 + * 0x{FA..FE}{40..7E,A1..FE} U+E000..U+E310 + * + * We add them too because, although there are backward compatibility problems + * when a character from a private area is moved to an official Unicode code + * point, they are useful for some people in practice. + */ + +static const unsigned short cp950_2uni_pagea1[314] = { + /* 0xa1 */ + 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a, + 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, + 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, + 0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, + 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, + 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, + 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, + 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, + 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, + 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, + 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, + 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, + 0x00af, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, + 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, + 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, + 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, + 0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, + 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, + 0x2199, 0x2198, 0x2225, 0x2223, 0xff0f, + /* 0xa2 */ + 0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1, + 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, + 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, + 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, + 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, + 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, + 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, + 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, + 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, + 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, + 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, + 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xff21, 0xff22, 0xff23, + 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, + 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, + 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, + 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, + 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, + 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, +}; + +#include "cp950ext.h" + +static int +cp950_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (BIG5 extended) */ + if (c >= 0x81 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + if (c >= 0xa1) { + if (c < 0xa3) { + unsigned int i = 157 * (c - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + unsigned short wc = cp950_2uni_pagea1[i]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { + int ret = big5_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + if (c == 0xa3 && c2 == 0xe1) { + *pwc = 0x20ac; + return 2; + } + if (c >= 0xfa) { + /* User-defined characters */ + *pwc = 0xe000 + 157 * (c - 0xfa) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + return 2; + } + } else { + /* 0x81 <= c < 0xa1. */ + /* User-defined characters */ + *pwc = (c >= 0x8e ? 0xdb18 : 0xeeb8) + 157 * (c - 0x81) + + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + return 2; + } + } + } + if (c == 0xf9) { + int ret = cp950ext_mbtowc(conv,pwc,s,2); + if (ret != RET_ILSEQ) + return ret; + } + } + return RET_ILSEQ; +} + +static int +cp950_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (BIG5 extended) */ + switch (wc >> 8) { + case 0x00: + if (wc == 0x00af) { buf[0] = 0xa1; buf[1] = 0xc2; ret = 2; break; } + if (wc == 0x00a2 || wc == 0x00a3 || wc == 0x00a4) + return RET_ILUNI; + break; + case 0x02: + if (wc == 0x02cd) { buf[0] = 0xa1; buf[1] = 0xc5; ret = 2; break; } + break; + case 0x20: + if (wc == 0x2027) { buf[0] = 0xa1; buf[1] = 0x45; ret = 2; break; } + if (wc == 0x20ac) { buf[0] = 0xa3; buf[1] = 0xe1; ret = 2; break; } + if (wc == 0x2022 || wc == 0x203e) + return RET_ILUNI; + break; + case 0x22: + if (wc == 0x2215) { buf[0] = 0xa2; buf[1] = 0x41; ret = 2; break; } + if (wc == 0x2295) { buf[0] = 0xa1; buf[1] = 0xf2; ret = 2; break; } + if (wc == 0x2299) { buf[0] = 0xa1; buf[1] = 0xf3; ret = 2; break; } + if (wc == 0x223c) + return RET_ILUNI; + break; + case 0x25: + if (wc == 0x2574) { buf[0] = 0xa1; buf[1] = 0x5a; ret = 2; break; } + break; + case 0x26: + if (wc == 0x2609 || wc == 0x2641) + return RET_ILUNI; + break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: + case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: + case 0xec: case 0xed: case 0xee: case 0xef: case 0xf0: case 0xf1: + case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: + { + /* User-defined characters */ + unsigned int i = wc - 0xe000; + if (i < 5809) { + unsigned int c1 = i / 157; + unsigned int c2 = i % 157; + buf[0] = c1 + (c1 < 5 ? 0xfa : c1 < 24 ? 0x89 : 0x69); + buf[1] = c2 + (c2 < 0x3f ? 0x40 : 0x62); + ret = 2; + break; + } + } + break; + case 0xfe: + if (wc == 0xfe51) { buf[0] = 0xa1; buf[1] = 0x4e; ret = 2; break; } + if (wc == 0xfe68) { buf[0] = 0xa2; buf[1] = 0x42; ret = 2; break; } + break; + case 0xff: + if (wc == 0xff0f) { buf[0] = 0xa1; buf[1] = 0xfe; ret = 2; break; } + if (wc == 0xff3c) { buf[0] = 0xa2; buf[1] = 0x40; ret = 2; break; } + if (wc == 0xff5e) { buf[0] = 0xa1; buf[1] = 0xe3; ret = 2; break; } + if (wc == 0xffe0) { buf[0] = 0xa2; buf[1] = 0x46; ret = 2; break; } + if (wc == 0xffe1) { buf[0] = 0xa2; buf[1] = 0x47; ret = 2; break; } + if (wc == 0xffe3) { buf[0] = 0xa1; buf[1] = 0xc3; ret = 2; break; } + if (wc == 0xffe5) { buf[0] = 0xa2; buf[1] = 0x44; ret = 2; break; } + if (wc == 0xff64) + return RET_ILUNI; + break; + } + if (ret == RET_ILUNI) + ret = big5_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + } + ret = cp950ext_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/cp950ext.h b/Externals/libiconv-1.14/lib/cp950ext.h new file mode 100644 index 0000000000..2a18d80545 --- /dev/null +++ b/Externals/libiconv-1.14/lib/cp950ext.h @@ -0,0 +1,161 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * CP950 extensions + */ + +static const unsigned short cp950ext_2uni_pagef9[157-116] = { + /* 0xf9 */ + 0x7881, 0x92b9, 0x88cf, 0x58bb, + 0x6052, 0x7ca7, 0x5afa, 0x2554, 0x2566, 0x2557, 0x2560, 0x256c, + 0x2563, 0x255a, 0x2569, 0x255d, 0x2552, 0x2564, 0x2555, 0x255e, + 0x256a, 0x2561, 0x2558, 0x2567, 0x255b, 0x2553, 0x2565, 0x2556, + 0x255f, 0x256b, 0x2562, 0x2559, 0x2568, 0x255c, 0x2551, 0x2550, + 0x256d, 0x256e, 0x2570, 0x256f, 0x2593, +}; + +static int +cp950ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0xf9)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + unsigned short wc = 0xfffd; + { + if (i >= 13932 && i < 13973) + wc = cp950ext_2uni_pagef9[i-13932]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short cp950ext_2charset[41] = { + 0xf9f9, 0xf9f8, 0xf9e6, 0xf9ef, 0xf9dd, 0xf9e8, 0xf9f1, 0xf9df, + 0xf9ec, 0xf9f5, 0xf9e3, 0xf9ee, 0xf9f7, 0xf9e5, 0xf9e9, 0xf9f2, + 0xf9e0, 0xf9eb, 0xf9f4, 0xf9e2, 0xf9e7, 0xf9f0, 0xf9de, 0xf9ed, + 0xf9f6, 0xf9e4, 0xf9ea, 0xf9f3, 0xf9e1, 0xf9fa, 0xf9fb, 0xf9fd, + 0xf9fc, 0xf9fe, 0xf9d9, 0xf9dc, 0xf9da, 0xf9d6, 0xf9db, 0xf9d8, + 0xf9d7, +}; + +static const Summary16 cp950ext_uni2indx_page25[10] = { + /* 0x2500 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0xffff }, { 16, 0xffff }, { 32, 0x0001 }, + { 33, 0x0000 }, { 33, 0x0008 }, +}; +static const Summary16 cp950ext_uni2indx_page58[12] = { + /* 0x5800 */ + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0800 }, +}; +static const Summary16 cp950ext_uni2indx_page5a[16] = { + /* 0x5a00 */ + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0400 }, +}; +static const Summary16 cp950ext_uni2indx_page60[6] = { + /* 0x6000 */ + { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, + { 36, 0x0000 }, { 36, 0x0004 }, +}; +static const Summary16 cp950ext_uni2indx_page78[9] = { + /* 0x7800 */ + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0002 }, +}; +static const Summary16 cp950ext_uni2indx_page7c[11] = { + /* 0x7c00 */ + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0080 }, +}; +static const Summary16 cp950ext_uni2indx_page88[13] = { + /* 0x8800 */ + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x8000 }, +}; +static const Summary16 cp950ext_uni2indx_page92[12] = { + /* 0x9200 */ + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0200 }, +}; + +static int +cp950ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x2500 && wc < 0x25a0) + summary = &cp950ext_uni2indx_page25[(wc>>4)-0x250]; + else if (wc >= 0x5800 && wc < 0x58c0) + summary = &cp950ext_uni2indx_page58[(wc>>4)-0x580]; + else if (wc >= 0x5a00 && wc < 0x5b00) + summary = &cp950ext_uni2indx_page5a[(wc>>4)-0x5a0]; + else if (wc >= 0x6000 && wc < 0x6060) + summary = &cp950ext_uni2indx_page60[(wc>>4)-0x600]; + else if (wc >= 0x7800 && wc < 0x7890) + summary = &cp950ext_uni2indx_page78[(wc>>4)-0x780]; + else if (wc >= 0x7c00 && wc < 0x7cb0) + summary = &cp950ext_uni2indx_page7c[(wc>>4)-0x7c0]; + else if (wc >= 0x8800 && wc < 0x88d0) + summary = &cp950ext_uni2indx_page88[(wc>>4)-0x880]; + else if (wc >= 0x9200 && wc < 0x92c0) + summary = &cp950ext_uni2indx_page92[(wc>>4)-0x920]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = cp950ext_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/dec_hanyu.h b/Externals/libiconv-1.14/lib/dec_hanyu.h new file mode 100644 index 0000000000..065fd5d515 --- /dev/null +++ b/Externals/libiconv-1.14/lib/dec_hanyu.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * DEC-HANYU + */ + +static int +dec_hanyu_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (CNS 11643-1992 Plane 1), + Code set 2 (CNS 11643-1992 Plane 2), + Code set 3 (CNS 11643-1992 Plane 3) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c == 0xc2 && c2 == 0xcb) { + if (n < 4) + return RET_TOOFEW(0); + if (s[2] >= 0xa1 && s[2] < 0xff && s[3] >= 0xa1 && s[3] < 0xff) { + unsigned char buf[2]; + int ret; + buf[0] = s[2]-0x80; buf[1] = s[3]-0x80; + ret = cns11643_3_mbtowc(conv,pwc,buf,2); + if (ret != RET_ILSEQ) { + if (ret != 2) abort(); + return 4; + } + } + } else if (c2 >= 0xa1 && c2 < 0xff) { + if (c != 0xc2 || c2 < 0xc2) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return cns11643_1_mbtowc(conv,pwc,buf,2); + } + } else if (c2 >= 0x21 && c2 < 0x7f) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2; + return cns11643_2_mbtowc(conv,pwc,buf,2); + } + } + } + return RET_ILSEQ; +} + +static int +dec_hanyu_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[3]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + ret = cns11643_wctomb(conv,buf,wc,3); + if (ret != RET_ILUNI) { + if (ret != 3) abort(); + + /* Code set 1 (CNS 11643-1992 Plane 1) */ + if (buf[0] == 1 && (buf[1] != 0x42 || buf[2] < 0x42)) { + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[1]+0x80; + r[1] = buf[2]+0x80; + return 2; + } + + /* Code set 2 (CNS 11643-1992 Plane 2) */ + if (buf[0] == 2) { + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[1]+0x80; + r[1] = buf[2]; + return 2; + } + + /* Code set 3 (CNS 11643-1992 Plane 3) */ + if (buf[0] == 3) { + if (n < 4) + return RET_TOOSMALL; + r[0] = 0xc2; + r[1] = 0xcb; + r[2] = buf[1]+0x80; + r[3] = buf[2]+0x80; + return 4; + } + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/dec_kanji.h b/Externals/libiconv-1.14/lib/dec_kanji.h new file mode 100644 index 0000000000..0a056fb87e --- /dev/null +++ b/Externals/libiconv-1.14/lib/dec_kanji.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * DEC-KANJI + */ + +static int +dec_kanji_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (JIS X 0208) */ + if (c >= 0xa1 && c < 0xf5) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return jisx0208_mbtowc(conv,pwc,buf,2); + } + } + } + return RET_ILSEQ; +} + +static int +dec_kanji_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (JIS X 0208) */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/encodings.def b/Externals/libiconv-1.14/lib/encodings.def new file mode 100644 index 0000000000..0174343517 --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings.def @@ -0,0 +1,1030 @@ +/* Copyright (C) 1999-2010 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* The list of all system independent user-visible encodings. */ + +/* By convention, an encoding named FOOBAR or FOO_BAR or FOO-BAR is defined + in a file named "foobar.h" through the functions foobar_mbtowc and + foobar_wctomb (and possibly foobar_reset). */ + +/* DEFENCODING(( name, alias1, ..., ), + xxx, + { xxx_mbtowc, xxx_flushwc }, + { xxx_wctomb, xxx_reset }) + defines an encoding with the given name and aliases. (There is no + difference between a name and an alias. By convention, the name is chosen + as the preferred MIME name or the standard name.) + All names and aliases must be in ASCII. Case is not significant, but + for the "cs*" aliases mixed case is preferred, otherwise UPPERCASE is + preferred. For all names and aliases, note where it comes from. + xxx is the name as used in the C code (lowercase). + */ + + +DEFENCODING(( "US-ASCII", /* IANA */ + "ASCII", /* IANA, JDK 1.1 */ + "ISO646-US", /* IANA */ + "ISO_646.IRV:1991", /* IANA */ + "ISO-IR-6", /* IANA */ + "ANSI_X3.4-1968", /* IANA */ + "ANSI_X3.4-1986", /* IANA */ + "CP367", /* IANA */ + "IBM367", /* IANA */ + "US", /* IANA */ + "csASCII", /* IANA */ + /*"ISO646.1991-IRV", X11R6.4 */ + ), + ascii, + { ascii_mbtowc, NULL }, { ascii_wctomb, NULL }) +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "646", /* Solaris */ + ascii) +#endif + +/* General multi-byte encodings */ + +DEFENCODING(( "UTF-8", /* IANA, RFC 2279 */ + /*"UTF8", JDK 1.1 */ + /*"CP65001", Windows */ + ), + utf8, + { utf8_mbtowc, NULL }, { utf8_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "UTF8", /* HP-UX */ + utf8) +#endif + +DEFENCODING(( "UCS-2", /* glibc */ + "ISO-10646-UCS-2", /* IANA */ + "csUnicode", /* IANA */ + ), + ucs2, + { ucs2_mbtowc, NULL }, { ucs2_wctomb, NULL }) + +DEFENCODING(( "UCS-2BE", /* glibc */ + "UNICODEBIG", /* glibc */ + "UNICODE-1-1", /* IANA */ + "csUnicode11", /* IANA */ + /*"CP1201", Windows */ + ), + ucs2be, + { ucs2be_mbtowc, NULL }, { ucs2be_wctomb, NULL }) + +DEFENCODING(( "UCS-2LE", /* glibc */ + "UNICODELITTLE", /* glibc */ + /*"CP1200", Windows */ + ), + ucs2le, + { ucs2le_mbtowc, NULL }, { ucs2le_wctomb, NULL }) + +DEFENCODING(( "UCS-4", /* glibc */ + "ISO-10646-UCS-4", /* IANA */ + "csUCS4", /* IANA */ + ), + ucs4, + { ucs4_mbtowc, NULL }, { ucs4_wctomb, NULL }) + +DEFENCODING(( "UCS-4BE", /* glibc */ + /*"CP12001", Windows */ + ), + ucs4be, + { ucs4be_mbtowc, NULL }, { ucs4be_wctomb, NULL }) + +DEFENCODING(( "UCS-4LE", /* glibc */ + /*"CP12000", Windows */ + ), + ucs4le, + { ucs4le_mbtowc, NULL }, { ucs4le_wctomb, NULL }) + +DEFENCODING(( "UTF-16", /* IANA, RFC 2781 */ + ), + utf16, + { utf16_mbtowc, NULL }, { utf16_wctomb, NULL }) + +DEFENCODING(( "UTF-16BE", /* IANA, RFC 2781 */ + ), + utf16be, + { utf16be_mbtowc, NULL }, { utf16be_wctomb, NULL }) + +DEFENCODING(( "UTF-16LE", /* IANA, RFC 2781 */ + ), + utf16le, + { utf16le_mbtowc, NULL }, { utf16le_wctomb, NULL }) + +DEFENCODING(( "UTF-32", /* IANA, Unicode 3.1 */ + ), + utf32, + { utf32_mbtowc, NULL }, { utf32_wctomb, NULL }) + +DEFENCODING(( "UTF-32BE", /* IANA, Unicode 3.1 */ + ), + utf32be, + { utf32be_mbtowc, NULL }, { utf32be_wctomb, NULL }) + +DEFENCODING(( "UTF-32LE", /* IANA, Unicode 3.1 */ + ), + utf32le, + { utf32le_mbtowc, NULL }, { utf32le_wctomb, NULL }) + +DEFENCODING(( "UTF-7", /* IANA, RFC 2152 */ + "UNICODE-1-1-UTF-7", /* IANA, RFC 1642 */ + "csUnicode11UTF7", /* IANA */ + /*"CP65000", Windows */ + ), + utf7, + { utf7_mbtowc, NULL }, { utf7_wctomb, utf7_reset }) + +DEFENCODING(( "UCS-2-INTERNAL", /* libiconv */ + ), + ucs2internal, + { ucs2internal_mbtowc, NULL }, { ucs2internal_wctomb, NULL }) + +DEFENCODING(( "UCS-2-SWAPPED", /* libiconv */ + ), + ucs2swapped, + { ucs2swapped_mbtowc, NULL }, { ucs2swapped_wctomb, NULL }) + +DEFENCODING(( "UCS-4-INTERNAL", /* libiconv */ + ), + ucs4internal, + { ucs4internal_mbtowc, NULL },{ ucs4internal_wctomb, NULL }) + +DEFENCODING(( "UCS-4-SWAPPED", /* libiconv */ + ), + ucs4swapped, + { ucs4swapped_mbtowc, NULL }, { ucs4swapped_wctomb, NULL }) + +DEFENCODING(( "C99", + ), + c99, + { c99_mbtowc, NULL }, { c99_wctomb, NULL }) + +DEFENCODING(( "JAVA", + ), + java, + { java_mbtowc, NULL }, { java_wctomb, NULL }) + +/* Standard 8-bit encodings */ + +DEFENCODING(( "ISO-8859-1", /* IANA */ + "ISO_8859-1", /* IANA */ + "ISO_8859-1:1987", /* IANA */ + "ISO-IR-100", /* IANA */ + "CP819", /* IANA */ + "IBM819", /* IANA */ + "LATIN1", /* IANA */ + "L1", /* IANA */ + "csISOLatin1", /* IANA */ + "ISO8859-1", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ + /*"ISO8859_1", JDK 1.1 */ + /*"CP28591", Windows */ + ), + iso8859_1, + { iso8859_1_mbtowc, NULL }, { iso8859_1_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88591", /* HP-UX */ + iso8859_1) +#endif + +DEFENCODING(( "ISO-8859-2", /* IANA */ + "ISO_8859-2", /* IANA */ + "ISO_8859-2:1987", /* IANA */ + "ISO-IR-101", /* IANA */ + "LATIN2", /* IANA */ + "L2", /* IANA */ + "csISOLatin2", /* IANA */ + "ISO8859-2", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ + /*"ISO8859_2", JDK 1.1 */ + /*"CP28592", Windows */ + ), + iso8859_2, + { iso8859_2_mbtowc, NULL }, { iso8859_2_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88592", /* HP-UX */ + iso8859_2) +#endif + +DEFENCODING(( "ISO-8859-3", /* IANA */ + "ISO_8859-3", /* IANA */ + "ISO_8859-3:1988", /* IANA */ + "ISO-IR-109", /* IANA */ + "LATIN3", /* IANA */ + "L3", /* IANA */ + "csISOLatin3", /* IANA */ + "ISO8859-3", /* X11R6.4, glibc, FreeBSD, Solaris */ + /*"ISO8859_3", JDK 1.1 */ + /*"CP28593", Windows */ + ), + iso8859_3, + { iso8859_3_mbtowc, NULL }, { iso8859_3_wctomb, NULL }) + +DEFENCODING(( "ISO-8859-4", /* IANA */ + "ISO_8859-4", /* IANA */ + "ISO_8859-4:1988", /* IANA */ + "ISO-IR-110", /* IANA */ + "LATIN4", /* IANA */ + "L4", /* IANA */ + "csISOLatin4", /* IANA */ + "ISO8859-4", /* X11R6.4, glibc, FreeBSD, OSF/1, Solaris */ + /*"ISO8859_4", JDK 1.1 */ + /*"CP28594", Windows */ + ), + iso8859_4, + { iso8859_4_mbtowc, NULL }, { iso8859_4_wctomb, NULL }) + +DEFENCODING(( "ISO-8859-5", /* IANA */ + "ISO_8859-5", /* IANA */ + "ISO_8859-5:1988", /* IANA */ + "ISO-IR-144", /* IANA */ + "CYRILLIC", /* IANA */ + "csISOLatinCyrillic", /* IANA */ + "ISO8859-5", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ + /*"ISO8859_5", JDK 1.1 */ + /*"CP28595", Windows */ + ), + iso8859_5, + { iso8859_5_mbtowc, NULL }, { iso8859_5_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88595", /* HP-UX */ + iso8859_5) +#endif + +DEFENCODING(( "ISO-8859-6", /* IANA */ + "ISO_8859-6", /* IANA */ + "ISO_8859-6:1987", /* IANA */ + "ISO-IR-127", /* IANA */ + "ECMA-114", /* IANA */ + "ASMO-708", /* IANA */ + "ARABIC", /* IANA */ + "csISOLatinArabic", /* IANA */ + "ISO8859-6", /* X11R6.4, glibc, FreeBSD, AIX, Solaris */ + /*"ISO8859_6", JDK 1.1 */ + /*"CP28596", Windows */ + ), + iso8859_6, + { iso8859_6_mbtowc, NULL }, { iso8859_6_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88596", /* HP-UX */ + iso8859_6) +#endif + +DEFENCODING(( "ISO-8859-7", /* IANA, RFC 1947 */ + "ISO_8859-7", /* IANA */ + "ISO_8859-7:1987", /* IANA */ + "ISO_8859-7:2003", + "ISO-IR-126", /* IANA */ + "ECMA-118", /* IANA */ + "ELOT_928", /* IANA */ + "GREEK8", /* IANA */ + "GREEK", /* IANA */ + "csISOLatinGreek", /* IANA */ + "ISO8859-7", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ + /*"ISO8859_7", JDK 1.1 */ + /*"CP28597", Windows */ + ), + iso8859_7, + { iso8859_7_mbtowc, NULL }, { iso8859_7_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88597", /* HP-UX */ + iso8859_7) +#endif + +DEFENCODING(( "ISO-8859-8", /* IANA */ + "ISO_8859-8", /* IANA */ + "ISO_8859-8:1988", /* IANA */ + "ISO-IR-138", /* IANA */ + "HEBREW", /* IANA */ + "csISOLatinHebrew", /* IANA */ + "ISO8859-8", /* X11R6.4, glibc, FreeBSD, AIX, OSF/1, Solaris */ + /*"ISO8859_8", JDK 1.1 */ + /*"CP28598", Windows */ + /*"CP38598", Windows */ + ), + iso8859_8, + { iso8859_8_mbtowc, NULL }, { iso8859_8_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88598", /* HP-UX */ + iso8859_8) +#endif + +DEFENCODING(( "ISO-8859-9", /* IANA */ + "ISO_8859-9", /* IANA */ + "ISO_8859-9:1989", /* IANA */ + "ISO-IR-148", /* IANA */ + "LATIN5", /* IANA */ + "L5", /* IANA */ + "csISOLatin5", /* IANA */ + "ISO8859-9", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ + /*"ISO8859_9", JDK 1.1 */ + /*"CP28599", Windows */ + ), + iso8859_9, + { iso8859_9_mbtowc, NULL }, { iso8859_9_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO88599", /* HP-UX */ + iso8859_9) +#endif + +DEFENCODING(( "ISO-8859-10", /* IANA */ + "ISO_8859-10", + "ISO_8859-10:1992", /* IANA */ + "ISO-IR-157", /* IANA */ + "LATIN6", /* IANA */ + "L6", /* IANA */ + "csISOLatin6", /* IANA */ + "ISO8859-10", /* X11R6.4, glibc, FreeBSD */ + ), + iso8859_10, + { iso8859_10_mbtowc, NULL }, { iso8859_10_wctomb, NULL }) + +DEFENCODING(( "ISO-8859-11", /* glibc */ + "ISO_8859-11", + "ISO8859-11", /* X11R6.7, glibc */ + ), + iso8859_11, + { iso8859_11_mbtowc, NULL }, { iso8859_11_wctomb, NULL }) + +DEFENCODING(( "ISO-8859-13", /* IANA, glibc */ + "ISO_8859-13", + "ISO-IR-179", /* glibc */ + "LATIN7", /* glibc */ + "L7", /* glibc */ + "ISO8859-13", /* glibc, FreeBSD */ + ), + iso8859_13, + { iso8859_13_mbtowc, NULL }, { iso8859_13_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-921", /* AIX */ + iso8859_13) +#endif + +DEFENCODING(( "ISO-8859-14", /* IANA, glibc */ + "ISO_8859-14", /* IANA */ + "ISO_8859-14:1998", /* IANA, glibc */ + "ISO-IR-199", /* IANA */ + "LATIN8", /* IANA, glibc */ + "L8", /* IANA, glibc */ + "ISO-CELTIC", /* IANA */ + "ISO8859-14", /* glibc, FreeBSD */ + ), + iso8859_14, + { iso8859_14_mbtowc, NULL }, { iso8859_14_wctomb, NULL }) + +DEFENCODING(( "ISO-8859-15", /* IANA, glibc */ + "ISO_8859-15", /* IANA */ + "ISO_8859-15:1998", /* glibc */ + "ISO-IR-203", + "LATIN-9", /* IANA */ + "ISO8859-15", /* glibc, FreeBSD, AIX, OSF/1, Solaris */ + /*"CP28605", Windows */ + ), + iso8859_15, + { iso8859_15_mbtowc, NULL }, { iso8859_15_wctomb, NULL }) +#ifdef USE_HPUX_ALIASES +DEFALIAS( "ISO885915", /* HP-UX */ + iso8859_15) +#endif + +DEFENCODING(( "ISO-8859-16", /* IANA */ + "ISO_8859-16", /* IANA */ + "ISO_8859-16:2001", /* IANA */ + "ISO-IR-226", /* IANA */ + "LATIN10", /* IANA */ + "L10", /* IANA */ + "ISO8859-16", /* glibc, FreeBSD */ + ), + iso8859_16, + { iso8859_16_mbtowc, NULL }, { iso8859_16_wctomb, NULL }) + +DEFENCODING(( "KOI8-R", /* IANA, RFC 1489, X11R6.4, JDK 1.1 */ + "csKOI8R", /* IANA */ + /*"CP20866", Windows */ + ), + koi8_r, + { koi8_r_mbtowc, NULL }, { koi8_r_wctomb, NULL }) + +DEFENCODING(( "KOI8-U", /* IANA, RFC 2319 */ + ), + koi8_u, + { koi8_u_mbtowc, NULL }, { koi8_u_wctomb, NULL }) + +DEFENCODING(( "KOI8-RU", + ), + koi8_ru, + { koi8_ru_mbtowc, NULL }, { koi8_ru_wctomb, NULL }) + +/* Windows 8-bit encodings */ + +DEFENCODING(( "CP1250", /* JDK 1.1 */ + "WINDOWS-1250", /* IANA */ + "MS-EE", + ), + cp1250, + { cp1250_mbtowc, NULL }, { cp1250_wctomb, NULL }) + +DEFENCODING(( "CP1251", /* JDK 1.1 */ + "WINDOWS-1251", /* IANA */ + "MS-CYRL", + ), + cp1251, + { cp1251_mbtowc, NULL }, { cp1251_wctomb, NULL }) +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "ANSI-1251", /* Solaris */ + cp1251) +#endif + +DEFENCODING(( "CP1252", /* JDK 1.1 */ + "WINDOWS-1252", /* IANA */ + "MS-ANSI", + ), + cp1252, + { cp1252_mbtowc, NULL }, { cp1252_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-1252", /* AIX */ + cp1252) +#endif + +DEFENCODING(( "CP1253", /* JDK 1.1 */ + "WINDOWS-1253", /* IANA */ + "MS-GREEK", + ), + cp1253, + { cp1253_mbtowc, NULL }, { cp1253_wctomb, NULL }) + +DEFENCODING(( "CP1254", /* JDK 1.1 */ + "WINDOWS-1254", /* IANA */ + "MS-TURK", + ), + cp1254, + { cp1254_mbtowc, NULL }, { cp1254_wctomb, NULL }) + +DEFENCODING(( "CP1255", /* JDK 1.1 */ + "WINDOWS-1255", /* IANA */ + "MS-HEBR", + ), + cp1255, + { cp1255_mbtowc, cp1255_flushwc }, { cp1255_wctomb, NULL }) + +DEFENCODING(( "CP1256", /* JDK 1.1 */ + "WINDOWS-1256", /* IANA */ + "MS-ARAB", + ), + cp1256, + { cp1256_mbtowc, NULL }, { cp1256_wctomb, NULL }) + +DEFENCODING(( "CP1257", /* JDK 1.1 */ + "WINDOWS-1257", /* IANA */ + "WINBALTRIM", + ), + cp1257, + { cp1257_mbtowc, NULL }, { cp1257_wctomb, NULL }) + +DEFENCODING(( "CP1258", /* JDK 1.1 */ + "WINDOWS-1258", /* IANA */ + ), + cp1258, + { cp1258_mbtowc, cp1258_flushwc }, { cp1258_wctomb, NULL }) + +/* DOS 8-bit encodings */ + +DEFENCODING(( "CP850", /* IANA, JDK 1.1 */ + "IBM850", /* IANA */ + "850", /* IANA */ + "csPC850Multilingual", /* IANA */ + ), + cp850, + { cp850_mbtowc, NULL }, { cp850_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-850", /* AIX */ + cp850) +#endif + +DEFENCODING(( "CP862", /* IANA, JDK 1.1 */ + "IBM862", /* IANA */ + "862", /* IANA */ + "csPC862LatinHebrew", /* IANA */ + ), + cp862, + { cp862_mbtowc, NULL }, { cp862_wctomb, NULL }) + +DEFENCODING(( "CP866", /* IANA, JDK 1.1 */ + "IBM866", /* IANA */ + "866", /* IANA */ + "csIBM866", /* IANA */ + ), + cp866, + { cp866_mbtowc, NULL }, { cp866_wctomb, NULL }) + +DEFENCODING(( "CP1131", /* FreeBSD, MacOS X */ + ), + cp1131, + { cp1131_mbtowc, NULL }, { cp1131_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-1131", /* AIX */ + cp1131) +#endif + +/* Macintosh 8-bit encodings */ + +DEFENCODING(( "MacRoman", /* JDK 1.1 */ + /* This is the best table for MACINTOSH. The ones */ + /* in glibc and FreeBSD-iconv are bad quality. */ + "MACINTOSH", /* IANA */ + "MAC", /* IANA */ + "csMacintosh", /* IANA */ + /*"CP10000", Windows */ + ), + mac_roman, + { mac_roman_mbtowc, NULL }, { mac_roman_wctomb, NULL }) + +DEFENCODING(( "MacCentralEurope", /* JDK 1.1 */ + /*"CP10029", Windows */ + ), + mac_centraleurope, + { mac_centraleurope_mbtowc, NULL }, { mac_centraleurope_wctomb, NULL }) + +DEFENCODING(( "MacIceland", /* JDK 1.1 */ + /*"CP10079", Windows */ + ), + mac_iceland, + { mac_iceland_mbtowc, NULL }, { mac_iceland_wctomb, NULL }) + +DEFENCODING(( "MacCroatian", /* JDK 1.1 */ + /*"CP10082", Windows */ + ), + mac_croatian, + { mac_croatian_mbtowc, NULL }, { mac_croatian_wctomb, NULL }) + +DEFENCODING(( "MacRomania", /* JDK 1.1 */ + /*"CP10010", Windows */ + ), + mac_romania, + { mac_romania_mbtowc, NULL }, { mac_romania_wctomb, NULL }) + +DEFENCODING(( "MacCyrillic", /* JDK 1.1 */ + /*"CP10007", Windows */ + ), + mac_cyrillic, + { mac_cyrillic_mbtowc, NULL }, { mac_cyrillic_wctomb, NULL }) + +DEFENCODING(( "MacUkraine", /* JDK 1.1 */ + /*"CP10017", Windows */ + ), + mac_ukraine, + { mac_ukraine_mbtowc, NULL }, { mac_ukraine_wctomb, NULL }) + +DEFENCODING(( "MacGreek", /* JDK 1.1 */ + /*"CP10006", Windows */ + ), + mac_greek, + { mac_greek_mbtowc, NULL }, { mac_greek_wctomb, NULL }) + +DEFENCODING(( "MacTurkish", /* JDK 1.1 */ + /*"CP10081", Windows */ + ), + mac_turkish, + { mac_turkish_mbtowc, NULL }, { mac_turkish_wctomb, NULL }) + +DEFENCODING(( "MacHebrew", /* JDK 1.1 */ + /*"CP10005", Windows */ + ), + mac_hebrew, + { mac_hebrew_mbtowc, NULL }, { mac_hebrew_wctomb, NULL }) + +DEFENCODING(( "MacArabic", /* JDK 1.1 */ + /*"CP10004", Windows */ + ), + mac_arabic, + { mac_arabic_mbtowc, NULL }, { mac_arabic_wctomb, NULL }) + +DEFENCODING(( "MacThai", /* JDK 1.1 */ + /*"CP10021", Windows */ + ), + mac_thai, + { mac_thai_mbtowc, NULL }, { mac_thai_wctomb, NULL }) + +/* Other platform specific 8-bit encodings */ + +DEFENCODING(( "HP-ROMAN8", /* IANA, X11R6.4 */ + "ROMAN8", /* IANA */ + "R8", /* IANA */ + "csHPRoman8", /* IANA */ + ), + hp_roman8, + { hp_roman8_mbtowc, NULL }, { hp_roman8_wctomb, NULL }) + +DEFENCODING(( "NEXTSTEP", + ), + nextstep, + { nextstep_mbtowc, NULL }, { nextstep_wctomb, NULL }) + +/* Regional 8-bit encodings used for a single language */ + +DEFENCODING(( "ARMSCII-8", + ), + armscii_8, + { armscii_8_mbtowc, NULL }, { armscii_8_wctomb, NULL }) + +DEFENCODING(( "GEORGIAN-ACADEMY", + ), + georgian_academy, + { georgian_academy_mbtowc, NULL }, { georgian_academy_wctomb, NULL }) + +DEFENCODING(( "GEORGIAN-PS", + ), + georgian_ps, + { georgian_ps_mbtowc, NULL }, { georgian_ps_wctomb, NULL }) + +DEFENCODING(( "KOI8-T", + ), + koi8_t, + { koi8_t_mbtowc, NULL }, { koi8_t_wctomb, NULL }) + +DEFENCODING(( "PT154", /* IANA, glibc */ + "PTCP154", /* IANA */ + "CP154", /* IANA */ + "CYRILLIC-ASIAN", /* IANA */ + "csPTCP154", /* IANA */ + ), + pt154, + { pt154_mbtowc, NULL }, { pt154_wctomb, NULL }) + +DEFENCODING(( "RK1048", /* IANA, glibc */ + "STRK1048-2002", /* IANA */ + "KZ-1048", /* IANA */ + "csKZ1048", /* IANA */ + ), + rk1048, + { rk1048_mbtowc, NULL }, { rk1048_wctomb, NULL }) + +DEFENCODING(( "MULELAO-1", + ), + mulelao, + { mulelao_mbtowc, NULL }, { mulelao_wctomb, NULL }) + +DEFENCODING(( "CP1133", + "IBM-CP1133", + ), + cp1133, + { cp1133_mbtowc, NULL }, { cp1133_wctomb, NULL }) + +DEFENCODING(( "TIS-620", /* IANA */ + "TIS620", /* glibc, HP-UX */ + "TIS620-0", /* glibc */ + "TIS620.2529-1", /* glibc */ + "TIS620.2533-0", /* glibc */ + "TIS620.2533-1", + "ISO-IR-166", /* glibc */ + ), + tis620, + { tis620_mbtowc, NULL }, { tis620_wctomb, NULL }) +#ifdef USE_OSF1_ALIASES +DEFALIAS( "TACTIS", /* OSF/1 */ + tis620) +#endif +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "TIS620.2533", /* Solaris */ + tis620) +#endif + +DEFENCODING(( "CP874", /* JDK 1.1 */ + "WINDOWS-874", + ), + cp874, + { cp874_mbtowc, NULL }, { cp874_wctomb, NULL }) + +DEFENCODING(( "VISCII", /* IANA, RFC 1456 */ + "VISCII1.1-1", + "csVISCII", /* IANA */ + ), + viscii, + { viscii_mbtowc, NULL }, { viscii_wctomb, NULL }) + +DEFENCODING(( "TCVN", + "TCVN-5712", + "TCVN5712-1", + "TCVN5712-1:1993", + ), + tcvn, + { tcvn_mbtowc, tcvn_flushwc }, { tcvn_wctomb, NULL }) + +/* CJK character sets (not documented) */ + +DEFENCODING(( "JIS_C6220-1969-RO", /* IANA */ + "ISO646-JP", /* IANA */ + "ISO-IR-14", /* IANA */ + "JP", /* IANA */ + "csISO14JISC6220ro", /* IANA */ + ), + iso646_jp, + { iso646_jp_mbtowc, NULL }, { iso646_jp_wctomb, NULL }) + +DEFENCODING(( "JIS_X0201", /* IANA */ + "JISX0201-1976", + "X0201", /* IANA */ + "csHalfWidthKatakana", /* IANA */ + /*"JISX0201.1976-0", X11R6.4 */ + /*"JIS0201", JDK 1.1 */ + ), + jisx0201, + { jisx0201_mbtowc, NULL }, { jisx0201_wctomb, NULL }) + +DEFENCODING(( "JIS_X0208", + "JIS_X0208-1983", /* IANA */ + "JIS_X0208-1990", + "JIS0208", + "X0208", /* IANA */ + "ISO-IR-87", /* IANA */ + "JIS_C6226-1983", /* IANA */ + "csISO87JISX0208", /* IANA */ + /*"JISX0208.1983-0", X11R6.4 */ + /*"JISX0208.1990-0", X11R6.4 */ + /*"JIS0208", JDK 1.1 */ + ), + jisx0208, + { jisx0208_mbtowc, NULL }, { jisx0208_wctomb, NULL }) + +DEFENCODING(( "JIS_X0212", + "JIS_X0212.1990-0", + "JIS_X0212-1990", /* IANA */ + "X0212", /* IANA */ + "ISO-IR-159", /* IANA */ + "csISO159JISX02121990", /* IANA */ + /*"JISX0212.1990-0", X11R6.4 */ + /*"JIS0212", JDK 1.1 */ + ), + jisx0212, + { jisx0212_mbtowc, NULL }, { jisx0212_wctomb, NULL }) + +DEFENCODING(( "GB_1988-80", /* IANA */ + "ISO646-CN", /* IANA */ + "ISO-IR-57", /* IANA */ + "CN", /* IANA */ + "csISO57GB1988", /* IANA */ + ), + iso646_cn, + { iso646_cn_mbtowc, NULL }, { iso646_cn_wctomb, NULL }) + +DEFENCODING(( "GB_2312-80", /* IANA */ + "ISO-IR-58", /* IANA */ + "csISO58GB231280", /* IANA */ + "CHINESE", /* IANA */ + /*"GB2312.1980-0", X11R6.4 */ + ), + gb2312, + { gb2312_mbtowc, NULL }, { gb2312_wctomb, NULL }) + +DEFENCODING(( "ISO-IR-165", + "CN-GB-ISOIR165", /* RFC 1922 */ + ), + isoir165, + { isoir165_mbtowc, NULL }, { isoir165_wctomb, NULL }) + +DEFENCODING(( "KSC_5601", /* IANA */ + "KS_C_5601-1987", /* IANA */ + "KS_C_5601-1989", /* IANA */ + "ISO-IR-149", /* IANA */ + "csKSC56011987", /* IANA */ + "KOREAN", /* IANA */ + /*"KSC5601.1987-0", X11R6.4 */ + /*"KSX1001:1992", Ken Lunde */ + ), + ksc5601, + { ksc5601_mbtowc, NULL }, { ksc5601_wctomb, NULL }) + +/* CJK encodings */ + +DEFENCODING(( "EUC-JP", /* IANA */ + "EUCJP", /* glibc, HP-UX, IRIX, OSF/1, Solaris */ + "Extended_UNIX_Code_Packed_Format_for_Japanese", /* IANA */ + "csEUCPkdFmtJapanese", /* IANA */ + /*"EUC_JP", JDK 1.1 */ + /*"CP51932", Windows */ + ), + euc_jp, + { euc_jp_mbtowc, NULL }, { euc_jp_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-EUCJP", /* AIX */ + euc_jp) +#endif +#ifdef USE_OSF1_ALIASES +DEFALIAS( "SDECKANJI", /* OSF/1 */ + euc_jp) +#endif + +DEFENCODING(( "SHIFT_JIS", /* IANA */ + "SHIFT-JIS", /* glibc */ + "SJIS", /* JDK 1.1, HP-UX, OSF/1 */ + "MS_KANJI", /* IANA */ + "csShiftJIS", /* IANA */ + ), + sjis, + { sjis_mbtowc, NULL }, { sjis_wctomb, NULL }) +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "PCK", /* Solaris */ + sjis) +#endif + +DEFENCODING(( "CP932", /* glibc */ + ), + cp932, + { cp932_mbtowc, NULL }, { cp932_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-932", /* AIX */ + cp932) +#endif + +DEFENCODING(( "ISO-2022-JP", /* IANA, RFC 1468 */ + "csISO2022JP", /* IANA */ + /*"ISO2022JP", JDK 1.1 */ + ), + iso2022_jp, + { iso2022_jp_mbtowc, NULL }, { iso2022_jp_wctomb, iso2022_jp_reset }) + +DEFENCODING(( "ISO-2022-JP-1", /* RFC 2237 */ + ), + iso2022_jp1, + { iso2022_jp1_mbtowc, NULL }, { iso2022_jp1_wctomb, iso2022_jp1_reset }) + +DEFENCODING(( "ISO-2022-JP-2", /* IANA, RFC 1554 */ + "csISO2022JP2", /* IANA */ + ), + iso2022_jp2, + { iso2022_jp2_mbtowc, NULL }, { iso2022_jp2_wctomb, iso2022_jp2_reset }) + +DEFENCODING(( "EUC-CN", /* glibc */ + "EUCCN", /* glibc, IRIX */ + "GB2312", /* IANA */ + "CN-GB", /* RFC 1922 */ + "csGB2312", /* IANA */ + /*"EUC_CN", JDK 1.1 */ + /*"CP51936", Windows */ + ), + euc_cn, + { euc_cn_mbtowc, NULL }, { euc_cn_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-EUCCN", /* AIX */ + euc_cn) +#endif +#ifdef USE_HPUX_ALIASES +DEFALIAS( "HP15CN", /* HP-UX */ + euc_cn) +#endif +#ifdef USE_OSF1_ALIASES +DEFALIAS( "DECHANZI", /* OSF/1 */ + euc_cn) +#endif + +DEFENCODING(( "GBK", /* IANA, JDK 1.1 */ + ), + ces_gbk, + { ces_gbk_mbtowc, NULL }, { ces_gbk_wctomb, NULL }) + +DEFENCODING(( "CP936", /* IANA */ + "MS936", /* IANA */ + "WINDOWS-936", /* IANA */ + ), + cp936, + { cp936_mbtowc, NULL }, { cp936_wctomb, NULL }) + +DEFENCODING(( "GB18030", /* IANA, glibc */ + /*"CP54936", Windows */ + ), + gb18030, + { gb18030_mbtowc, NULL }, { gb18030_wctomb, NULL }) + +DEFENCODING(( "ISO-2022-CN", /* IANA, RFC 1922 */ + "csISO2022CN", + /*"ISO2022CN", JDK 1.1 */ + ), + iso2022_cn, + { iso2022_cn_mbtowc, NULL }, { iso2022_cn_wctomb, iso2022_cn_reset }) + +DEFENCODING(( "ISO-2022-CN-EXT", /* IANA, RFC 1922 */ + ), + iso2022_cn_ext, + { iso2022_cn_ext_mbtowc, NULL }, { iso2022_cn_ext_wctomb, iso2022_cn_ext_reset }) + +DEFENCODING(( "HZ", /* RFC 1843 */ + "HZ-GB-2312", /* IANA, RFC 1842 */ + ), + hz, + { hz_mbtowc, NULL }, { hz_wctomb, hz_reset }) + +DEFENCODING(( "EUC-TW", /* glibc */ + "EUCTW", /* glibc, HP-UX, IRIX, OSF/1 */ + "csEUCTW", + /*"EUC_TW", JDK 1.1 */ + /*"CP51950", Windows */ + ), + euc_tw, + { euc_tw_mbtowc, NULL }, { euc_tw_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-EUCTW", /* AIX */ + euc_tw) +#endif +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "CNS11643", /* Solaris */ + euc_tw) +#endif + +DEFENCODING(( "BIG5", /* IANA, JDK 1.1 */ + "BIG-5", /* glibc */ + "BIG-FIVE", /* glibc */ + "BIGFIVE", /* glibc */ + "CN-BIG5", /* RFC 1922 */ + "csBig5", /* IANA */ + ), + ces_big5, + { ces_big5_mbtowc, NULL }, { ces_big5_wctomb, NULL }) + +DEFENCODING(( "CP950", /* JDK 1.1 */ + ), + cp950, + { cp950_mbtowc, NULL }, { cp950_wctomb, NULL }) + +DEFENCODING(( "BIG5-HKSCS:1999", + ), + big5hkscs1999, + { big5hkscs1999_mbtowc, big5hkscs1999_flushwc }, { big5hkscs1999_wctomb, big5hkscs1999_reset }) + +DEFENCODING(( "BIG5-HKSCS:2001", + ), + big5hkscs2001, + { big5hkscs2001_mbtowc, big5hkscs2001_flushwc }, { big5hkscs2001_wctomb, big5hkscs2001_reset }) + +DEFENCODING(( "BIG5-HKSCS:2004", + ), + big5hkscs2004, + { big5hkscs2004_mbtowc, big5hkscs2004_flushwc }, { big5hkscs2004_wctomb, big5hkscs2004_reset }) + +DEFENCODING(( "BIG5-HKSCS", /* IANA */ + "BIG5HKSCS", /* glibc */ + "BIG5-HKSCS:2008", + ), + big5hkscs2008, + { big5hkscs2008_mbtowc, big5hkscs2008_flushwc }, { big5hkscs2008_wctomb, big5hkscs2008_reset }) + +DEFENCODING(( "EUC-KR", /* IANA, RFC 1557 */ + "EUCKR", /* glibc, HP-UX, IRIX, OSF/1 */ + "csEUCKR", /* IANA */ + /*"EUC_KR", JDK 1.1 */ + /*"CP51949", Windows */ + ), + euc_kr, + { euc_kr_mbtowc, NULL }, { euc_kr_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-EUCKR", /* AIX */ + euc_kr) +#endif +#ifdef USE_OSF1_ALIASES +DEFALIAS( "DECKOREAN", /* OSF/1 */ + euc_kr) +#endif +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "5601", /* Solaris */ + euc_kr) +#endif + +DEFENCODING(( "CP949", /* JDK 1.1 */ + "UHC", /* glibc */ + ), + cp949, + { cp949_mbtowc, NULL }, { cp949_wctomb, NULL }) +#ifdef USE_OSF1_ALIASES +DEFALIAS( "KSC5601", /* OSF/1 */ + cp949) +#endif + +DEFENCODING(( "JOHAB", /* glibc */ + "CP1361", /* glibc */ + ), + johab, + { johab_mbtowc, NULL }, { johab_wctomb, NULL }) +#ifdef USE_SOLARIS_ALIASES +DEFALIAS( "KO_KR.JOHAP92", /* Solaris */ + johab) +#endif + +DEFENCODING(( "ISO-2022-KR", /* IANA, RFC 1557 */ + "csISO2022KR", /* IANA */ + /*"ISO2022KR", JDK 1.1 */ + ), + iso2022_kr, + { iso2022_kr_mbtowc, NULL }, { iso2022_kr_wctomb, iso2022_kr_reset }) + diff --git a/Externals/libiconv-1.14/lib/encodings_aix.def b/Externals/libiconv-1.14/lib/encodings_aix.def new file mode 100644 index 0000000000..259452eb53 --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings_aix.def @@ -0,0 +1,97 @@ +/* Copyright (C) 2000-2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Encodings used by system dependent locales on AIX. */ + +DEFENCODING(( "CP856", + ), + cp856, + { cp856_mbtowc, NULL }, { cp856_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-856", /* AIX */ + cp856) +#endif + +DEFENCODING(( "CP922", + ), + cp922, + { cp922_mbtowc, NULL }, { cp922_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-922", /* AIX */ + cp922) +#endif + +DEFENCODING(( "CP943", + ), + cp943, + { cp943_mbtowc, NULL }, { cp943_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-943", /* AIX */ + cp943) +#endif + +DEFENCODING(( "CP1046", + ), + cp1046, + { cp1046_mbtowc, NULL }, { cp1046_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-1046", /* AIX */ + cp1046) +#endif + +DEFENCODING(( "CP1124", + ), + cp1124, + { cp1124_mbtowc, NULL }, { cp1124_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-1124", /* AIX */ + cp1124) +#endif + +DEFENCODING(( "CP1129", + ), + cp1129, + { cp1129_mbtowc, NULL }, { cp1129_wctomb, NULL }) +#ifdef USE_AIX_ALIASES +DEFALIAS( "IBM-1129", /* AIX */ + cp1129) +#endif + +DEFENCODING(( "CP1161", + "IBM1161", /* glibc */ + "IBM-1161", /* glibc */ + "csIBM1161", /* glibc */ + ), + cp1161, + { cp1161_mbtowc, NULL }, { cp1161_wctomb, NULL }) + +DEFENCODING(( "CP1162", + "IBM1162", /* glibc */ + "IBM-1162", /* glibc */ + "csIBM1162", /* glibc */ + ), + cp1162, + { cp1162_mbtowc, NULL }, { cp1162_wctomb, NULL }) + +DEFENCODING(( "CP1163", + "IBM1163", /* glibc */ + "IBM-1163", /* glibc */ + "csIBM1163", /* glibc */ + ), + cp1163, + { cp1163_mbtowc, NULL }, { cp1163_wctomb, NULL }) diff --git a/Externals/libiconv-1.14/lib/encodings_dos.def b/Externals/libiconv-1.14/lib/encodings_dos.def new file mode 100644 index 0000000000..c9d30c8c0f --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings_dos.def @@ -0,0 +1,127 @@ +/* Copyright (C) 2001-2002 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Encodings used by system dependent locales on MSDOS. */ + +DEFENCODING(( "CP437", /* IANA, JDK 1.1 */ + "IBM437", /* IANA */ + "437", /* IANA */ + "csPC8CodePage437", /* IANA */ + ), + cp437, + { cp437_mbtowc, NULL }, { cp437_wctomb, NULL }) + +DEFENCODING(( "CP737", /* JDK 1.1 */ + ), + cp737, + { cp737_mbtowc, NULL }, { cp737_wctomb, NULL }) + +DEFENCODING(( "CP775", /* IANA, JDK 1.1 */ + "IBM775", /* IANA */ + "csPC775Baltic", /* IANA */ + ), + cp775, + { cp775_mbtowc, NULL }, { cp775_wctomb, NULL }) + +DEFENCODING(( "CP852", /* IANA, JDK 1.1 */ + "IBM852", /* IANA */ + "852", /* IANA */ + "csPCp852", /* IANA */ + ), + cp852, + { cp852_mbtowc, NULL }, { cp852_wctomb, NULL }) + +DEFENCODING(( "CP853", + ), + cp853, + { cp853_mbtowc, NULL }, { cp853_wctomb, NULL }) + +DEFENCODING(( "CP855", /* IANA, JDK 1.1 */ + "IBM855", /* IANA */ + "855", /* IANA */ + "csIBM855", /* IANA */ + ), + cp855, + { cp855_mbtowc, NULL }, { cp855_wctomb, NULL }) + +DEFENCODING(( "CP857", /* IANA, JDK 1.1 */ + "IBM857", /* IANA */ + "857", /* IANA */ + "csIBM857", /* IANA */ + ), + cp857, + { cp857_mbtowc, NULL }, { cp857_wctomb, NULL }) + +DEFENCODING(( "CP858", /* JDK 1.1.7 */ + ), + cp858, + { cp858_mbtowc, NULL }, { cp858_wctomb, NULL }) + +DEFENCODING(( "CP860", /* IANA, JDK 1.1 */ + "IBM860", /* IANA */ + "860", /* IANA */ + "csIBM860", /* IANA */ + ), + cp860, + { cp860_mbtowc, NULL }, { cp860_wctomb, NULL }) + +DEFENCODING(( "CP861", /* IANA, JDK 1.1 */ + "IBM861", /* IANA */ + "861", /* IANA */ + "CP-IS", /* IANA */ + "csIBM861", /* IANA */ + ), + cp861, + { cp861_mbtowc, NULL }, { cp861_wctomb, NULL }) + +DEFENCODING(( "CP863", /* IANA, JDK 1.1 */ + "IBM863", /* IANA */ + "863", /* IANA */ + "csIBM863", /* IANA */ + ), + cp863, + { cp863_mbtowc, NULL }, { cp863_wctomb, NULL }) + +DEFENCODING(( "CP864", /* IANA, JDK 1.1 */ + "IBM864", /* IANA */ + "csIBM864", /* IANA */ + ), + cp864, + { cp864_mbtowc, NULL }, { cp864_wctomb, NULL }) + +DEFENCODING(( "CP865", /* IANA, JDK 1.1 */ + "IBM865", /* IANA */ + "865", /* IANA */ + "csIBM865", /* IANA */ + ), + cp865, + { cp865_mbtowc, NULL }, { cp865_wctomb, NULL }) + +DEFENCODING(( "CP869", /* IANA, JDK 1.1 */ + "IBM869", /* IANA */ + "869", /* IANA */ + "CP-GR", /* IANA */ + "csIBM869", /* IANA */ + ), + cp869, + { cp869_mbtowc, NULL }, { cp869_wctomb, NULL }) + +DEFENCODING(( "CP1125", /* ICU */ + ), + cp1125, + { cp1125_mbtowc, NULL }, { cp1125_wctomb, NULL }) diff --git a/Externals/libiconv-1.14/lib/encodings_extra.def b/Externals/libiconv-1.14/lib/encodings_extra.def new file mode 100644 index 0000000000..614422b68d --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings_extra.def @@ -0,0 +1,57 @@ +/* Copyright (C) 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +DEFENCODING(( "EUC-JISX0213", + "EUC-JIS-2004", /* x0213.org */ + ), + euc_jisx0213, + { euc_jisx0213_mbtowc, euc_jisx0213_flushwc }, { euc_jisx0213_wctomb, euc_jisx0213_reset }) + +DEFENCODING(( "SHIFT_JISX0213", + "SHIFT_JIS-2004", /* x0213.org */ + ), + shift_jisx0213, + { shift_jisx0213_mbtowc, shift_jisx0213_flushwc }, { shift_jisx0213_wctomb, shift_jisx0213_reset }) + +DEFENCODING(( "ISO-2022-JP-3", + "ISO-2022-JP-2004", /* x0213.org */ + ), + iso2022_jp3, + { iso2022_jp3_mbtowc, iso2022_jp3_flushwc }, { iso2022_jp3_wctomb, iso2022_jp3_reset }) + +DEFENCODING(( "BIG5-2003", + ), + big5_2003, + { big5_2003_mbtowc, NULL }, { big5_2003_wctomb, NULL }) + +DEFENCODING(( "TDS565", + "ISO-IR-230", + ), + tds565, + { tds565_mbtowc, NULL }, { tds565_wctomb, NULL }) + +DEFENCODING(( "ATARIST", + "ATARI", + ), + atarist, + { atarist_mbtowc, NULL }, { atarist_wctomb, NULL }) + +DEFENCODING(( "RISCOS-LATIN1", + ), + riscos1, + { riscos1_mbtowc, NULL }, { riscos1_wctomb, NULL }) diff --git a/Externals/libiconv-1.14/lib/encodings_local.def b/Externals/libiconv-1.14/lib/encodings_local.def new file mode 100644 index 0000000000..4e793e5bd9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings_local.def @@ -0,0 +1,29 @@ +/* Copyright (C) 2000-2001 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Names for locale dependent encodings. */ + +DEFENCODING(( "CHAR", + ), + local_char, + { NULL, NULL }, { NULL, NULL }) + +DEFENCODING(( "WCHAR_T", /* glibc */ + ), + local_wchar_t, + { NULL, NULL }, { NULL, NULL }) diff --git a/Externals/libiconv-1.14/lib/encodings_osf1.def b/Externals/libiconv-1.14/lib/encodings_osf1.def new file mode 100644 index 0000000000..7912854bbb --- /dev/null +++ b/Externals/libiconv-1.14/lib/encodings_osf1.def @@ -0,0 +1,37 @@ +/* Copyright (C) 2001, 2008 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Encodings used by system dependent locales on OSF/1 a.k.a. Tru64. */ + +DEFENCODING(( "DEC-KANJI", + ), + dec_kanji, + { dec_kanji_mbtowc, NULL }, { dec_kanji_wctomb, NULL }) +#ifdef USE_OSF1_ALIASES +DEFALIAS( "DECKANJI", /* OSF/1 */ + dec_kanji) +#endif + +DEFENCODING(( "DEC-HANYU", + ), + dec_hanyu, + { dec_hanyu_mbtowc, NULL }, { dec_hanyu_wctomb, NULL }) +#ifdef USE_OSF1_ALIASES +DEFALIAS( "DECHANYU", /* OSF/1 */ + dec_hanyu) +#endif diff --git a/Externals/libiconv-1.14/lib/euc_cn.h b/Externals/libiconv-1.14/lib/euc_cn.h new file mode 100644 index 0000000000..a25417a989 --- /dev/null +++ b/Externals/libiconv-1.14/lib/euc_cn.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * EUC-CN + */ + +static int +euc_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII or GB 1988-89) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (GB 2312-1980) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return gb2312_mbtowc(conv,pwc,buf,2); + } else + return RET_ILSEQ; + } + } + return RET_ILSEQ; +} + +static int +euc_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or GB 1988-89) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (GB 2312-1980) */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/euc_jisx0213.h b/Externals/libiconv-1.14/lib/euc_jisx0213.h new file mode 100644 index 0000000000..4d417ca12e --- /dev/null +++ b/Externals/libiconv-1.14/lib/euc_jisx0213.h @@ -0,0 +1,268 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * EUC-JISX0213 + */ + +/* The structure of EUC-JISX0213 is as follows: + + 0x00..0x7F: ASCII + + 0x8E{A1..FE}: JISX0201 Katakana, with prefix 0x8E, offset by +0x80. + + 0x8F{A1..FE}{A1..FE}: JISX0213 plane 2, with prefix 0x8F, offset by +0x8080. + + 0x{A1..FE}{A1..FE}: JISX0213 plane 1, offset by +0x8080. + + Note that some JISX0213 characters are not contained in Unicode 3.2 + and are therefore best represented as sequences of Unicode characters. +*/ + +#include "jisx0213.h" +#include "flushwc.h" + +static int +euc_jisx0213_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + if (c < 0x80) { + /* Plain ASCII character. */ + *pwc = (ucs4_t) c; + return 1; + } else { + if ((c >= 0xa1 && c <= 0xfe) || c == 0x8e || c == 0x8f) { + /* Two or three byte character. */ + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 <= 0xfe) { + if (c == 0x8e) { + /* Half-width katakana. */ + if (c2 <= 0xdf) { + *pwc = c2 + 0xfec0; + return 2; + } + } else { + ucs4_t wc; + if (c == 0x8f) { + /* JISX 0213 plane 2. */ + if (n >= 3) { + unsigned char c3 = s[2]; + wc = jisx0213_to_ucs4(0x200-0x80+c2,c3^0x80); + } else + return RET_TOOFEW(0); + } else { + /* JISX 0213 plane 1. */ + wc = jisx0213_to_ucs4(0x100-0x80+c,c2^0x80); + } + if (wc) { + if (wc < 0x80) { + /* It's a combining character. */ + ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; + ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + } else + *pwc = wc; + return (c == 0x8f ? 3 : 2); + } + } + } + } else + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + } +} + +#define euc_jisx0213_flushwc normal_flushwc + +/* Composition tables for each of the relevant combining characters. */ +static const struct { unsigned short base; unsigned short composed; } euc_jisx0213_comp_table_data[] = { +#define euc_jisx0213_comp_table02e5_idx 0 +#define euc_jisx0213_comp_table02e5_len 1 + { 0xabe4, 0xabe5 }, /* 0x12B65 = 0x12B64 U+02E5 */ +#define euc_jisx0213_comp_table02e9_idx (euc_jisx0213_comp_table02e5_idx+euc_jisx0213_comp_table02e5_len) +#define euc_jisx0213_comp_table02e9_len 1 + { 0xabe0, 0xabe6 }, /* 0x12B66 = 0x12B60 U+02E9 */ +#define euc_jisx0213_comp_table0300_idx (euc_jisx0213_comp_table02e9_idx+euc_jisx0213_comp_table02e9_len) +#define euc_jisx0213_comp_table0300_len 5 + { 0xa9dc, 0xabc4 }, /* 0x12B44 = 0x1295C U+0300 */ + { 0xabb8, 0xabc8 }, /* 0x12B48 = 0x12B38 U+0300 */ + { 0xabb7, 0xabca }, /* 0x12B4A = 0x12B37 U+0300 */ + { 0xabb0, 0xabcc }, /* 0x12B4C = 0x12B30 U+0300 */ + { 0xabc3, 0xabce }, /* 0x12B4E = 0x12B43 U+0300 */ +#define euc_jisx0213_comp_table0301_idx (euc_jisx0213_comp_table0300_idx+euc_jisx0213_comp_table0300_len) +#define euc_jisx0213_comp_table0301_len 4 + { 0xabb8, 0xabc9 }, /* 0x12B49 = 0x12B38 U+0301 */ + { 0xabb7, 0xabcb }, /* 0x12B4B = 0x12B37 U+0301 */ + { 0xabb0, 0xabcd }, /* 0x12B4D = 0x12B30 U+0301 */ + { 0xabc3, 0xabcf }, /* 0x12B4F = 0x12B43 U+0301 */ +#define euc_jisx0213_comp_table309a_idx (euc_jisx0213_comp_table0301_idx+euc_jisx0213_comp_table0301_len) +#define euc_jisx0213_comp_table309a_len 14 + { 0xa4ab, 0xa4f7 }, /* 0x12477 = 0x1242B U+309A */ + { 0xa4ad, 0xa4f8 }, /* 0x12478 = 0x1242D U+309A */ + { 0xa4af, 0xa4f9 }, /* 0x12479 = 0x1242F U+309A */ + { 0xa4b1, 0xa4fa }, /* 0x1247A = 0x12431 U+309A */ + { 0xa4b3, 0xa4fb }, /* 0x1247B = 0x12433 U+309A */ + { 0xa5ab, 0xa5f7 }, /* 0x12577 = 0x1252B U+309A */ + { 0xa5ad, 0xa5f8 }, /* 0x12578 = 0x1252D U+309A */ + { 0xa5af, 0xa5f9 }, /* 0x12579 = 0x1252F U+309A */ + { 0xa5b1, 0xa5fa }, /* 0x1257A = 0x12531 U+309A */ + { 0xa5b3, 0xa5fb }, /* 0x1257B = 0x12533 U+309A */ + { 0xa5bb, 0xa5fc }, /* 0x1257C = 0x1253B U+309A */ + { 0xa5c4, 0xa5fd }, /* 0x1257D = 0x12544 U+309A */ + { 0xa5c8, 0xa5fe }, /* 0x1257E = 0x12548 U+309A */ + { 0xa6f5, 0xa6f8 }, /* 0x12678 = 0x12675 U+309A */ +}; + +static int +euc_jisx0213_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned short lasttwo = conv->ostate; + + if (lasttwo) { + /* Attempt to combine the last character with this one. */ + unsigned int idx; + unsigned int len; + + if (wc == 0x02e5) + idx = euc_jisx0213_comp_table02e5_idx, + len = euc_jisx0213_comp_table02e5_len; + else if (wc == 0x02e9) + idx = euc_jisx0213_comp_table02e9_idx, + len = euc_jisx0213_comp_table02e9_len; + else if (wc == 0x0300) + idx = euc_jisx0213_comp_table0300_idx, + len = euc_jisx0213_comp_table0300_len; + else if (wc == 0x0301) + idx = euc_jisx0213_comp_table0301_idx, + len = euc_jisx0213_comp_table0301_len; + else if (wc == 0x309a) + idx = euc_jisx0213_comp_table309a_idx, + len = euc_jisx0213_comp_table309a_len; + else + goto not_combining; + + do + if (euc_jisx0213_comp_table_data[idx].base == lasttwo) + break; + while (++idx, --len > 0); + + if (len > 0) { + /* Output the combined character. */ + if (n >= 2) { + lasttwo = euc_jisx0213_comp_table_data[idx].composed; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + not_combining: + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + r += 2; + count = 2; + } + + if (wc < 0x80) { + /* Plain ASCII character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else if (wc >= 0xff61 && wc <= 0xff9f) { + /* Half-width katakana. */ + if (n >= count+2) { + r[0] = 0x8e; + r[1] = wc - 0xfec0; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } else { + unsigned short jch = ucs4_to_jisx0213(wc); + if (jch != 0) { + if (jch & 0x0080) { + /* A possible match in comp_table_data. We have to buffer it. */ + /* We know it's a JISX 0213 plane 1 character. */ + if (jch & 0x8000) abort(); + conv->ostate = jch | 0x8080; + return count+0; + } + if (jch & 0x8000) { + /* JISX 0213 plane 2. */ + if (n >= count+3) { + r[0] = 0x8f; + r[1] = (jch >> 8) | 0x80; + r[2] = (jch & 0xff) | 0x80; + conv->ostate = 0; + return count+3; + } else + return RET_TOOSMALL; + } else { + /* JISX 0213 plane 1. */ + if (n >= count+2) { + r[0] = (jch >> 8) | 0x80; + r[1] = (jch & 0xff) | 0x80; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + } + return RET_ILUNI; + } +} + +static int +euc_jisx0213_reset (conv_t conv, unsigned char *r, int n) +{ + state_t lasttwo = conv->ostate; + + if (lasttwo) { + if (n < 2) + return RET_TOOSMALL; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/euc_jp.h b/Externals/libiconv-1.14/lib/euc_jp.h new file mode 100644 index 0000000000..84fa2e7eb0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/euc_jp.h @@ -0,0 +1,191 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * EUC-JP + */ + +static int +euc_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (JIS X 0208) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + if (c < 0xf5) { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return jisx0208_mbtowc(conv,pwc,buf,2); + } else + return RET_ILSEQ; + } else { + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + *pwc = 0xe000 + 94*(c-0xf5) + (c2-0xa1); + return 2; + } else + return RET_ILSEQ; + } + } + /* Code set 2 (half-width katakana) */ + if (c == 0x8e) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xe0) { + int ret = jisx0201_mbtowc(conv,pwc,s+1,n-1); + if (ret == RET_ILSEQ) + return RET_ILSEQ; + if (ret != 1) abort(); + return 2; + } else + return RET_ILSEQ; + } + } + /* Code set 3 (JIS X 0212-1990) */ + if (c == 0x8f) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + if (n < 3) + return RET_TOOFEW(0); + if (c2 < 0xf5) { + unsigned char c3 = s[2]; + if (c3 >= 0xa1 && c3 < 0xff) { + unsigned char buf[2]; + int ret; + buf[0] = c2-0x80; buf[1] = c3-0x80; + ret = jisx0212_mbtowc(conv,pwc,buf,2); + if (ret == RET_ILSEQ) + return RET_ILSEQ; + if (ret != 2) abort(); + return 3; + } else + return RET_ILSEQ; + } else { + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + unsigned char c3 = s[2]; + if (c3 >= 0xa1 && c3 < 0xff) { + *pwc = 0xe3ac + 94*(c2-0xf5) + (c3-0xa1); + return 3; + } else + return RET_ILSEQ; + } + } else + return RET_ILSEQ; + } + } + return RET_ILSEQ; +} + +static int +euc_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (JIS X 0208) */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + + /* Code set 2 (half-width katakana) */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI && buf[0] >= 0x80) { + if (ret != 1) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = 0x8e; + r[1] = buf[0]; + return 2; + } + + /* Code set 3 (JIS X 0212-1990) */ + ret = jisx0212_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 3) + return RET_TOOSMALL; + r[0] = 0x8f; + r[1] = buf[0]+0x80; + r[2] = buf[1]+0x80; + return 3; + } + + /* Extra compatibility with Shift_JIS. */ + if (wc == 0x00a5) { + r[0] = 0x5c; + return 1; + } + if (wc == 0x203e) { + r[0] = 0x7e; + return 1; + } + + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + if (wc >= 0xe000 && wc < 0xe758) { + if (wc < 0xe3ac) { + unsigned char c1, c2; + if (n < 2) + return RET_TOOSMALL; + c1 = (unsigned int) (wc - 0xe000) / 94; + c2 = (unsigned int) (wc - 0xe000) % 94; + r[0] = c1+0xf5; + r[1] = c2+0xa1; + return 2; + } else { + unsigned char c1, c2; + if (n < 3) + return RET_TOOSMALL; + c1 = (unsigned int) (wc - 0xe3ac) / 94; + c2 = (unsigned int) (wc - 0xe3ac) % 94; + r[0] = 0x8f; + r[1] = c1+0xf5; + r[2] = c2+0xa1; + return 3; + } + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/euc_kr.h b/Externals/libiconv-1.14/lib/euc_kr.h new file mode 100644 index 0000000000..8b3dd0528d --- /dev/null +++ b/Externals/libiconv-1.14/lib/euc_kr.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 1999-2001, 2007 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * EUC-KR + */ + +/* Specification: RFC 1557 */ + +static int +euc_kr_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII or KS C 5636-1993) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (KS C 5601-1992, now KS X 1001:2002) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return ksc5601_mbtowc(conv,pwc,buf,2); + } else + return RET_ILSEQ; + } + } + return RET_ILSEQ; +} + +static int +euc_kr_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or KS C 5636-1993) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (KS C 5601-1992, now KS X 1001:2002) */ + ret = ksc5601_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/euc_tw.h b/Externals/libiconv-1.14/lib/euc_tw.h new file mode 100644 index 0000000000..f7bdc8b7ca --- /dev/null +++ b/Externals/libiconv-1.14/lib/euc_tw.h @@ -0,0 +1,116 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * EUC-TW + */ + +static int +euc_tw_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + /* Code set 0 (ASCII) */ + if (c < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + /* Code set 1 (CNS 11643-1992 Plane 1) */ + if (c >= 0xa1 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + buf[0] = c-0x80; buf[1] = c2-0x80; + return cns11643_1_mbtowc(conv,pwc,buf,2); + } else + return RET_ILSEQ; + } + } + /* Code set 2 (CNS 11643-1992 Planes 1-16) */ + if (c == 0x8e) { + if (n < 4) + return RET_TOOFEW(0); + { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 <= 0xb0) { + unsigned char c3 = s[2]; + unsigned char c4 = s[3]; + if (c3 >= 0xa1 && c3 < 0xff && c4 >= 0xa1 && c4 < 0xff) { + unsigned char buf[2]; + int ret; + buf[0] = c3-0x80; buf[1] = c4-0x80; + switch (c2-0xa0) { + case 1: ret = cns11643_1_mbtowc(conv,pwc,buf,2); break; + case 2: ret = cns11643_2_mbtowc(conv,pwc,buf,2); break; + case 3: ret = cns11643_3_mbtowc(conv,pwc,buf,2); break; + case 4: ret = cns11643_4_mbtowc(conv,pwc,buf,2); break; + case 5: ret = cns11643_5_mbtowc(conv,pwc,buf,2); break; + case 6: ret = cns11643_6_mbtowc(conv,pwc,buf,2); break; + case 7: ret = cns11643_7_mbtowc(conv,pwc,buf,2); break; + case 15: ret = cns11643_15_mbtowc(conv,pwc,buf,2); break; + default: return RET_ILSEQ; + } + if (ret == RET_ILSEQ) + return RET_ILSEQ; + if (ret != 2) abort(); + return 4; + } + } + } + } + return RET_ILSEQ; +} + +static int +euc_tw_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[3]; + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + ret = cns11643_wctomb(conv,buf,wc,3); + if (ret != RET_ILUNI) { + if (ret != 3) abort(); + + /* Code set 1 (CNS 11643-1992 Plane 1) */ + if (buf[0] == 1) { + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[1]+0x80; + r[1] = buf[2]+0x80; + return 2; + } + + /* Code set 2 (CNS 11643-1992 Planes 1-16) */ + if (n < 4) + return RET_TOOSMALL; + r[0] = 0x8e; + r[1] = buf[0]+0xa0; + r[2] = buf[1]+0x80; + r[3] = buf[2]+0x80; + return 4; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/flags.h b/Externals/libiconv-1.14/lib/flags.h new file mode 100644 index 0000000000..e91934abd5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/flags.h @@ -0,0 +1,157 @@ +/* Generated automatically by genflags. */ + +/* Set if the encoding can encode + the acute and grave accents U+00B4 and U+0060. */ +#define HAVE_ACCENTS 1 + +/* Set if the encoding can encode + the single quotation marks U+2018 and U+2019. */ +#define HAVE_QUOTATION_MARKS 2 + +/* Set if the encoding can encode + the double-width Hangul letters (Jamo) U+3131 to U+3163. */ +#define HAVE_HANGUL_JAMO 4 + +#define ei_ascii_oflags (0) +#define ei_utf8_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs2_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs2be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs2le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs4_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs4be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs4le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf16_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf16be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf16le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf32_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf32be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf32le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf7_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs2internal_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs2swapped_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs4internal_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_ucs4swapped_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_c99_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_java_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_iso8859_1_oflags (HAVE_ACCENTS) +#define ei_iso8859_2_oflags (HAVE_ACCENTS) +#define ei_iso8859_3_oflags (HAVE_ACCENTS) +#define ei_iso8859_4_oflags (HAVE_ACCENTS) +#define ei_iso8859_5_oflags (0) +#define ei_iso8859_6_oflags (0) +#define ei_iso8859_7_oflags (HAVE_QUOTATION_MARKS) +#define ei_iso8859_8_oflags (HAVE_ACCENTS) +#define ei_iso8859_9_oflags (HAVE_ACCENTS) +#define ei_iso8859_10_oflags (0) +#define ei_iso8859_11_oflags (0) +#define ei_iso8859_13_oflags (0) +#define ei_iso8859_14_oflags (0) +#define ei_iso8859_15_oflags (0) +#define ei_iso8859_16_oflags (0) +#define ei_koi8_r_oflags (0) +#define ei_koi8_u_oflags (0) +#define ei_koi8_ru_oflags (0) +#define ei_cp1250_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1251_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp1252_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1253_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp1254_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1255_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1256_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1257_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1258_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp850_oflags (HAVE_ACCENTS) +#define ei_cp862_oflags (0) +#define ei_cp866_oflags (0) +#define ei_cp1131_oflags (0) +#define ei_mac_roman_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_mac_centraleurope_oflags (HAVE_QUOTATION_MARKS) +#define ei_mac_iceland_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_mac_croatian_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_mac_romania_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_mac_cyrillic_oflags (HAVE_QUOTATION_MARKS) +#define ei_mac_ukraine_oflags (HAVE_QUOTATION_MARKS) +#define ei_mac_greek_oflags (HAVE_QUOTATION_MARKS) +#define ei_mac_turkish_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_mac_hebrew_oflags (HAVE_QUOTATION_MARKS) +#define ei_mac_arabic_oflags (0) +#define ei_mac_thai_oflags (HAVE_QUOTATION_MARKS) +#define ei_hp_roman8_oflags (HAVE_ACCENTS) +#define ei_nextstep_oflags (HAVE_ACCENTS) +#define ei_armscii_8_oflags (0) +#define ei_georgian_academy_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_georgian_ps_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_koi8_t_oflags (HAVE_QUOTATION_MARKS) +#define ei_pt154_oflags (HAVE_QUOTATION_MARKS) +#define ei_rk1048_oflags (HAVE_QUOTATION_MARKS) +#define ei_mulelao_oflags (0) +#define ei_cp1133_oflags (0) +#define ei_tis620_oflags (0) +#define ei_cp874_oflags (HAVE_QUOTATION_MARKS) +#define ei_viscii_oflags (0) +#define ei_tcvn_oflags (HAVE_ACCENTS) +#define ei_iso646_jp_oflags (0) +#define ei_jisx0201_oflags (0) +#define ei_jisx0208_oflags (HAVE_QUOTATION_MARKS) +#define ei_jisx0212_oflags (0) +#define ei_iso646_cn_oflags (0) +#define ei_gb2312_oflags (HAVE_QUOTATION_MARKS) +#define ei_isoir165_oflags (HAVE_QUOTATION_MARKS) +#define ei_ksc5601_oflags (HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_euc_jp_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_sjis_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp932_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_iso2022_jp_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_iso2022_jp1_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_iso2022_jp2_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_euc_cn_oflags (HAVE_QUOTATION_MARKS) +#define ei_ces_gbk_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp936_oflags (HAVE_QUOTATION_MARKS) +#define ei_gb18030_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_iso2022_cn_oflags (HAVE_QUOTATION_MARKS) +#define ei_iso2022_cn_ext_oflags (HAVE_QUOTATION_MARKS) +#define ei_hz_oflags (HAVE_QUOTATION_MARKS) +#define ei_euc_tw_oflags (HAVE_QUOTATION_MARKS) +#define ei_ces_big5_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp950_oflags (HAVE_QUOTATION_MARKS) +#define ei_big5hkscs1999_oflags (HAVE_QUOTATION_MARKS) +#define ei_big5hkscs2001_oflags (HAVE_QUOTATION_MARKS) +#define ei_big5hkscs2004_oflags (HAVE_QUOTATION_MARKS) +#define ei_big5hkscs2008_oflags (HAVE_QUOTATION_MARKS) +#define ei_euc_kr_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_cp949_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_johab_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_iso2022_kr_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_cp856_oflags (HAVE_ACCENTS) +#define ei_cp922_oflags (HAVE_ACCENTS) +#define ei_cp943_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_cp1046_oflags (0) +#define ei_cp1124_oflags (0) +#define ei_cp1129_oflags (0) +#define ei_cp1161_oflags (0) +#define ei_cp1162_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp1163_oflags (0) +#define ei_dec_kanji_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_dec_hanyu_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp437_oflags (0) +#define ei_cp737_oflags (0) +#define ei_cp775_oflags (0) +#define ei_cp852_oflags (HAVE_ACCENTS) +#define ei_cp853_oflags (HAVE_ACCENTS) +#define ei_cp855_oflags (0) +#define ei_cp857_oflags (HAVE_ACCENTS) +#define ei_cp858_oflags (HAVE_ACCENTS) +#define ei_cp860_oflags (0) +#define ei_cp861_oflags (0) +#define ei_cp863_oflags (HAVE_ACCENTS) +#define ei_cp864_oflags (0) +#define ei_cp865_oflags (0) +#define ei_cp869_oflags (HAVE_QUOTATION_MARKS) +#define ei_cp1125_oflags (0) +#define ei_euc_jisx0213_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_shift_jisx0213_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_iso2022_jp3_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) +#define ei_big5_2003_oflags (HAVE_QUOTATION_MARKS) +#define ei_tds565_oflags (0) +#define ei_atarist_oflags (HAVE_ACCENTS) +#define ei_riscos1_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) diff --git a/Externals/libiconv-1.14/lib/flushwc.h b/Externals/libiconv-1.14/lib/flushwc.h new file mode 100644 index 0000000000..da25212efa --- /dev/null +++ b/Externals/libiconv-1.14/lib/flushwc.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _FLUSHWC_H +#define _FLUSHWC_H + +static int +normal_flushwc (conv_t conv, ucs4_t *pwc) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 1; + } else + return 0; +} + +#endif /* _FLUSHWC_H */ diff --git a/Externals/libiconv-1.14/lib/gb12345.h b/Externals/libiconv-1.14/lib/gb12345.h new file mode 100644 index 0000000000..b7e062e3e6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb12345.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB/T 12345-1990 + */ + +/* + * GB/T 12345-1990 is a traditional chinese counterpart of GB 2312-1986. + * According to the unicode.org tables: + * 2146 characters have been changed to their traditional counterpart, + * 103 characters have been added, no characters have been removed. + * Therefore we use an auxiliary table, which contains only the changes. + */ + +#include "gb12345ext.h" + +static int +gb12345_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + int ret; + + /* The gb12345ext table overrides some entries in the gb2312 table. */ + /* Try the GB12345 extensions -> Unicode table. */ + ret = gb12345ext_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + /* Try the GB2312 -> Unicode table. */ + ret = gb2312_mbtowc(conv,pwc,s,n); + return ret; +} + +static int +gb12345_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int ret; + + /* The gb12345ext table overrides some entries in the gb2312 table. */ + /* Try the Unicode -> GB12345 extensions table. */ + ret = gb12345ext_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + /* Try the Unicode -> GB2312 table, and check that the resulting GB2312 + byte sequence is not overridden by the GB12345 extensions table. */ + ret = gb2312_wctomb(conv,r,wc,n); + if (ret == 2 && gb12345ext_mbtowc(conv,&wc,r,2) == 2) + return RET_ILUNI; + else + return ret; +} diff --git a/Externals/libiconv-1.14/lib/gb12345ext.h b/Externals/libiconv-1.14/lib/gb12345ext.h new file mode 100644 index 0000000000..b461ec87d5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb12345ext.h @@ -0,0 +1,1796 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB/T 12345.1990-0 extensions + */ + +static const unsigned short gb12345ext_2uni_page21[12] = { + /* 0x21 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x2225, +}; +static const unsigned short gb12345ext_2uni_page26[85] = { + /* 0x26 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfe35, + 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, + 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, + 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, +}; +static const unsigned short gb12345ext_2uni_page28[32] = { + /* 0x28 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x0251, 0x1e3f, 0x0144, 0x0148, 0x01f9, 0x0261, +}; +static const unsigned short gb12345ext_2uni_page30[6871] = { + /* 0x30 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x769a, + 0xfffd, 0x85f9, 0xfffd, 0xfffd, 0x7919, 0x611b, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x9aaf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8956, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x58e9, 0xfffd, 0x7f77, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x64fa, 0xfffd, 0x6557, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9812, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x8fa6, 0x7d46, 0xfffd, 0x5e6b, 0xfffd, + 0xfffd, 0xfffd, 0x7d81, 0xfffd, 0xfffd, 0xfffd, 0x938a, 0xfffd, + 0x8b17, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x31 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98fd, 0x5bf6, 0xfffd, 0x5831, + 0xfffd, 0xfffd, 0x9b91, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8f29, 0xfffd, 0x8c9d, 0x92c7, 0xfffd, 0x72fd, 0x5099, + 0x618a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7db3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x7b46, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7562, 0x6583, + 0xfffd, 0x5e63, 0xfffd, 0xfffd, 0x9589, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x908a, 0x7de8, + 0x8cb6, 0xfffd, 0xfffd, 0x8b8a, 0xfffd, 0xfffd, 0x8faf, 0x8fae, + 0xfffd, 0x6a19, 0xfffd, 0xfffd, 0xfffd, 0x9c49, 0xfffd, 0xfffd, + 0x765f, 0xfffd, 0xfffd, 0x7015, 0x6ff1, 0x8cd3, 0x64ef, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9905, 0xfffd, + /* 0x32 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64a5, 0x9262, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9251, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99c1, 0xfffd, 0xfffd, 0xfffd, + 0x88dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ca1, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x53c3, 0x8836, 0x6b98, + 0x615a, 0x6158, 0x71e6, 0x84bc, 0x8259, 0x5009, 0x6ec4, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x53a0, 0xfffd, 0x5074, + 0xfffd, 0x6e2c, 0x5c64, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a6b, 0xfffd, + 0xfffd, 0xfffd, 0x6519, 0x647b, 0x87ec, 0x995e, 0x8b92, 0x7e8f, + 0x93df, 0x7523, 0x95e1, 0x986b, 0xfffd, 0xfffd, + /* 0x33 */ + 0x5834, 0x5617, 0xfffd, 0x9577, 0x511f, 0x8178, 0x5ee0, 0xfffd, + 0x66a2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9214, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8eca, 0xfffd, 0xfffd, 0xfffd, + 0x5fb9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5875, 0xfffd, 0xfffd, + 0xfffd, 0x9673, 0xfffd, 0x896f, 0xfffd, 0x7a31, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61f2, 0xfffd, 0x8aa0, 0xfffd, + 0xfffd, 0x9a01, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x9072, 0xfffd, 0x99b3, 0xfffd, 0x9f52, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x71be, 0xfffd, 0x885d, 0x87f2, 0xfffd, 0x5bf5, + 0xfffd, 0xfffd, 0x7587, 0x8e8a, 0xfffd, 0xfffd, 0x7c4c, 0xfffd, + 0x7da2, 0xfffd, 0x919c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x92e4, 0x96db, 0xfffd, 0xfffd, 0xfffd, + /* 0x34 */ + 0x790e, 0x5132, 0xfffd, 0xfffd, 0x89f8, 0x8655, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x50b3, 0xfffd, 0xfffd, 0xfffd, 0x7621, 0xfffd, + 0xfffd, 0xfffd, 0x95d6, 0x5275, 0xfffd, 0xfffd, 0xfffd, 0x9318, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d14, 0xfffd, + 0xfffd, 0x7dbd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8fad, 0xfffd, + 0xfffd, 0x8a5e, 0xfffd, 0xfffd, 0x8cdc, 0xfffd, 0x8070, 0xfffd, + 0xfffd, 0xfffd, 0x5f9e, 0x53e2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8ea5, 0xfffd, 0x7ac4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x932f, 0xfffd, 0x9054, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e36, + 0xfffd, 0xfffd, 0x8cb8, 0xfffd, 0xfffd, 0xfffd, + /* 0x35 */ + 0xfffd, 0xfffd, 0x64d4, 0xfffd, 0x55ae, 0x9132, 0x64a3, 0x81bd, + 0xfffd, 0xfffd, 0xfffd, 0x619a, 0xfffd, 0x8a95, 0x5f48, 0xfffd, + 0x7576, 0x64cb, 0x9ee8, 0x8569, 0x6a94, 0xfffd, 0x6417, 0xfffd, + 0xfffd, 0x5cf6, 0x79b1, 0x5c0e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71c8, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9127, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6575, + 0xfffd, 0xfffd, 0x6ecc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x905e, 0x7de0, 0x985b, 0xfffd, + 0xfffd, 0xfffd, 0x9ede, 0xfffd, 0xfffd, 0x588a, 0x96fb, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6fb1, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91e3, 0x8abf, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8adc, 0xfffd, + /* 0x36 */ + 0xfffd, 0xfffd, 0xfffd, 0x91d8, 0x9802, 0xfffd, 0x9320, 0xfffd, + 0x8a02, 0xfffd, 0x6771, 0xfffd, 0xfffd, 0xfffd, 0x52d5, 0x68df, + 0xfffd, 0xfffd, 0x51cd, 0xfffd, 0xfffd, 0xfffd, 0x9b25, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x72a2, 0x7368, + 0x8b80, 0xfffd, 0xfffd, 0x8ced, 0xfffd, 0x934d, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x935b, 0xfffd, 0x65b7, 0x7dde, + 0xfffd, 0xfffd, 0x968a, 0x5c0d, 0xfffd, 0x5678, 0xfffd, 0xfffd, + 0x9813, 0xfffd, 0x920d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x596a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x58ae, 0xfffd, 0xfffd, 0x9d5d, 0xfffd, 0x984d, 0x8a1b, 0xfffd, + 0x60e1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9913, 0xfffd, 0xfffd, + 0x5152, 0xfffd, 0x723e, 0x990c, 0xfffd, 0xfffd, + /* 0x37 */ + 0x8cb3, 0x767c, 0x7f70, 0xfffd, 0xfffd, 0xfffd, 0x95a5, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x792c, 0x91e9, + 0xfffd, 0xfffd, 0x7169, 0xfffd, 0xfffd, 0x7bc4, 0x8ca9, 0xfffd, + 0x98ef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8a2a, 0x7d21, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x98db, 0xfffd, 0xfffd, 0x8ab9, 0xfffd, 0xfffd, 0x5ee2, 0xfffd, + 0x8cbb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d1b, 0x58b3, + 0xfffd, 0xfffd, 0xfffd, 0x596e, 0xfffd, 0xfffd, 0x61a4, 0x7cde, + 0x8c50, 0xfffd, 0x6953, 0xfffd, 0xfffd, 0x92d2, 0x98a8, 0x760b, + 0xfffd, 0xfffd, 0x99ae, 0x7e2b, 0x8af7, 0xfffd, 0x9cf3, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x819a, 0xfffd, 0xfffd, 0xfffd, 0x8f3b, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x38 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64ab, 0x8f14, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8ce6, 0x5fa9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8ca0, 0xfffd, 0x8a03, 0xfffd, 0x5a66, 0x7e1b, 0xfffd, + 0xfffd, 0xfffd, 0x8a72, 0xfffd, 0xfffd, 0x9223, 0x84cb, 0xfffd, + 0x5e79, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8d95, 0xfffd, + 0xfffd, 0xfffd, 0x8d1b, 0x5ca1, 0x525b, 0x92fc, 0xfffd, 0xfffd, + 0x7db1, 0x5d17, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x93ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x64f1, 0xfffd, 0x9d3f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x95a3, 0xfffd, 0x927b, 0x500b, 0xfffd, 0x7d66, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x39 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f94, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x978f, 0xfffd, 0xfffd, + 0x8ca2, 0xfffd, 0x920e, 0xfffd, 0x6e9d, 0xfffd, 0xfffd, 0xfffd, + 0x69cb, 0x8cfc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8831, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9867, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x526e, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x95dc, + 0xfffd, 0xfffd, 0x89c0, 0xfffd, 0x9928, 0xfffd, 0x6163, 0xfffd, + 0x8cab, 0xfffd, 0x5ee3, 0xfffd, 0xfffd, 0x898f, 0xfffd, 0xfffd, + 0x6b78, 0x9f9c, 0x95a8, 0x8ecc, 0xfffd, 0x8a6d, 0xfffd, 0xfffd, + 0x6ac3, 0xfffd, 0x8cb4, 0x528a, 0x8f25, 0xfffd, 0xfffd, 0x934b, + 0xfffd, 0x570b, 0xfffd, 0xfffd, 0x904e, 0xfffd, + /* 0x3a */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99ed, 0xfffd, + 0xfffd, 0xfffd, 0x97d3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x6f22, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x865f, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x95a1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9db4, 0x8cc0, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x8f5f, 0xfffd, 0xfffd, 0xfffd, 0x9d3b, + 0xfffd, 0xfffd, 0xfffd, 0x7d05, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5f8c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58fa, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x3b */ + 0xfffd, 0xfffd, 0xfffd, 0x8b77, 0xfffd, 0x6eec, 0xfffd, 0xfffd, + 0x5629, 0x83ef, 0xfffd, 0xfffd, 0x756b, 0x5283, 0xfffd, 0x8a71, + 0xfffd, 0xfffd, 0x61f7, 0xfffd, 0x58de, 0x6b61, 0x74b0, 0xfffd, + 0x9084, 0x7de9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8b0a, 0xfffd, 0x63ee, 0x8f1d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cc4, 0x7a62, + 0x6703, 0x71f4, 0x532f, 0x8af1, 0x8aa8, 0x7e6a, 0x8477, 0xfffd, + 0xfffd, 0xfffd, 0x6e3e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7372, 0xfffd, 0xfffd, 0xfffd, 0x8ca8, 0x798d, 0x64ca, 0xfffd, + 0xfffd, 0x6a5f, 0xfffd, 0xfffd, 0x7a4d, 0xfffd, + /* 0x3c */ + 0xfffd, 0x9951, 0xfffd, 0xfffd, 0x8b4f, 0x9dc4, 0xfffd, 0x7e3e, + 0x7ddd, 0xfffd, 0x6975, 0xfffd, 0x8f2f, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d1a, 0x64e0, 0x5e7e, + 0xfffd, 0xfffd, 0x858a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x5291, 0xfffd, 0x6fdf, 0xfffd, 0xfffd, 0x8a08, 0x8a18, 0xfffd, + 0xfffd, 0x969b, 0xfffd, 0x7e7c, 0x7d00, 0xfffd, 0xfffd, 0x593e, + 0xfffd, 0xfffd, 0xfffd, 0x83a2, 0x9830, 0x8cc8, 0xfffd, 0x9240, + 0xfffd, 0xfffd, 0x50f9, 0xfffd, 0x99d5, 0xfffd, 0x6bb2, 0x76e3, + 0x5805, 0xfffd, 0x7b8b, 0x9593, 0xfffd, 0xfffd, 0xfffd, 0x8271, + 0xfffd, 0x7dd8, 0x7e6d, 0x6aa2, 0xfffd, 0xfffd, 0x9e7c, 0x63c0, + 0x64bf, 0x7c21, 0x5109, 0xfffd, 0xfffd, 0x85a6, 0x6abb, 0x9452, + 0x8e10, 0x8ce4, 0x898b, 0x9375, 0xfffd, 0xfffd, + /* 0x3d */ + 0xfffd, 0x8266, 0x528d, 0x991e, 0x6f38, 0x6ffa, 0x6f97, 0xfffd, + 0xfffd, 0xfffd, 0x5c07, 0x6f3f, 0xfffd, 0xfffd, 0x8523, 0x69f3, + 0x596c, 0x8b1b, 0xfffd, 0x91ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x81a0, 0xfffd, 0xfffd, 0x6f86, 0x9a55, 0x5b0c, 0xfffd, + 0x652a, 0x9278, 0x77ef, 0x50e5, 0xfffd, 0xfffd, 0xfffd, 0x9903, + 0x7e73, 0x7d5e, 0xfffd, 0xfffd, 0xfffd, 0x8f4e, 0x8f03, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x968e, 0xfffd, + 0xfffd, 0x7bc0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f54, + 0x7d50, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8aa1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7dca, 0x9326, 0x50c5, 0x8b39, 0x9032, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71fc, 0xfffd, + /* 0x3e */ + 0x76e1, 0x52c1, 0xfffd, 0xfffd, 0x8396, 0xfffd, 0xfffd, 0x9be8, + 0xfffd, 0x9a5a, 0xfffd, 0xfffd, 0x7d93, 0xfffd, 0xfffd, 0xfffd, + 0x9838, 0xfffd, 0xfffd, 0xfffd, 0x93e1, 0x5f91, 0x75d9, 0xfffd, + 0xfffd, 0x7af6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cfe, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x820a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x99d2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8209, 0xfffd, 0xfffd, 0xfffd, 0x64da, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x92f8, 0xfffd, 0xfffd, 0x61fc, 0xfffd, 0x5287, 0xfffd, + 0x9d51, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d79, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x89ba, 0xfffd, 0x8a23, 0x7d76, + 0xfffd, 0xfffd, 0x921e, 0x8ecd, 0xfffd, 0xfffd, + /* 0x3f */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99ff, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x958b, 0xfffd, 0xfffd, 0x51f1, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9846, 0xfffd, 0x6bbb, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ab2, 0xfffd, 0xfffd, + 0x58be, 0x61c7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x6473, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x5eab, 0x8932, 0x8a87, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x584a, 0xfffd, 0x5108, 0xfffd, 0x5bec, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7926, 0xfffd, 0x66e0, 0xfffd, 0x8667, 0xfffd, + 0x5dcb, 0x7aba, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x40 */ + 0x994b, 0xfffd, 0x6f70, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x64f4, 0xfffd, 0x95ca, 0xfffd, 0xfffd, 0xfffd, 0x881f, 0x81d8, + 0xfffd, 0xfffd, 0x840a, 0x4f86, 0x8cf4, 0x85cd, 0xfffd, 0x6b04, + 0x6514, 0x7c43, 0x95cc, 0x862d, 0x703e, 0x8b95, 0x652c, 0x89bd, + 0x61f6, 0x7e9c, 0x721b, 0x6feb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6488, 0x52de, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6f87, 0xfffd, 0x6a02, 0xfffd, 0x9433, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58d8, 0xfffd, 0xfffd, 0x985e, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7c6c, 0xfffd, 0x96e2, 0x7055, 0xfffd, 0xfffd, 0x88cf, 0x9bc9, + 0x79ae, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9e97, 0x53b2, 0x52f5, + 0x792b, 0x6b77, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x41 */ + 0xfffd, 0xfffd, 0xfffd, 0x701d, 0x96b8, 0xfffd, 0xfffd, 0xfffd, + 0x5006, 0x806f, 0x84ee, 0x9023, 0x942e, 0xfffd, 0x6190, 0x6f23, + 0x7c3e, 0x6582, 0x81c9, 0x93c8, 0x6200, 0x7149, 0x7df4, 0x7ce7, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5169, 0x8f1b, 0xfffd, 0xfffd, + 0xfffd, 0x8ad2, 0xfffd, 0xfffd, 0xfffd, 0x7642, 0xfffd, 0xfffd, + 0x907c, 0xfffd, 0xfffd, 0xfffd, 0x9410, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7375, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x81e8, 0x9130, 0x9c57, 0xfffd, 0xfffd, 0x8cc3, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9f61, 0x9234, 0xfffd, 0xfffd, 0xfffd, + 0x9748, 0xfffd, 0x5dba, 0x9818, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x993e, 0xfffd, 0x5289, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9f8d, 0x807e, 0x56a8, 0x7c60, 0xfffd, + /* 0x42 */ + 0xfffd, 0x58df, 0x650f, 0x96b4, 0x6a13, 0x5a41, 0x645f, 0x7c0d, + 0xfffd, 0xfffd, 0x8606, 0x76e7, 0x9871, 0x5eec, 0x7210, 0x64c4, + 0x6ef7, 0x865c, 0x9b6f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cc2, + 0xfffd, 0xfffd, 0xfffd, 0x9332, 0x9678, 0xfffd, 0x9a62, 0xfffd, + 0x92c1, 0xfffd, 0xfffd, 0xfffd, 0x5c62, 0x7e37, 0x616e, 0xfffd, + 0xfffd, 0xfffd, 0x6ffe, 0x7dd1, 0x5dd2, 0x6523, 0x5b7f, 0x7064, + 0xfffd, 0x4e82, 0xfffd, 0xfffd, 0x6384, 0x8f2a, 0x502b, 0x4f96, + 0x6dea, 0x7db8, 0x8ad6, 0x863f, 0xfffd, 0x7f85, 0x908f, 0x947c, + 0x7c6e, 0x9a3e, 0xfffd, 0xfffd, 0xfffd, 0x99f1, 0x7d61, 0x5abd, + 0xfffd, 0x746a, 0x78bc, 0x879e, 0x99ac, 0x99e1, 0xfffd, 0x55ce, + 0xfffd, 0x8cb7, 0x9ea5, 0x8ce3, 0x9081, 0xfffd, 0x779e, 0x9945, + 0x883b, 0x6eff, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x43 */ + 0x8b3e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9328, 0xfffd, 0xfffd, 0x925a, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8cbf, 0x9ebd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9382, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9580, 0x60b6, 0x5011, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9333, 0xfffd, 0x5922, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b0e, 0x5f4c, 0xfffd, 0xfffd, + 0x8993, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dbf, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dec, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5edf, 0xfffd, 0xfffd, 0x6ec5, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61ab, 0x95a9, 0xfffd, 0xfffd, + 0x9cf4, 0x9298, 0xfffd, 0xfffd, 0x8b2c, 0xfffd, + /* 0x44 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8b00, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x755d, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9209, 0xfffd, 0xfffd, + 0x7d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x96e3, 0xfffd, 0x6493, 0x8166, 0x60f1, 0x9b27, 0xfffd, 0xfffd, + 0x9912, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x64ec, 0xfffd, 0xfffd, 0x81a9, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6506, 0xfffd, 0xfffd, 0xfffd, 0x91c0, + 0x9ce5, 0xfffd, 0xfffd, 0x8076, 0xfffd, 0x5699, 0x9477, 0x93b3, + 0xfffd, 0xfffd, 0x6ab8, 0x7370, 0xfffd, 0x5be7, + /* 0x45 */ + 0x64f0, 0x6fd8, 0xfffd, 0xfffd, 0x9215, 0x7d10, 0x81bf, 0x6fc3, + 0x8fb2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7627, 0xfffd, 0xfffd, 0xfffd, 0x8afe, 0xfffd, 0x6b50, 0x9dd7, + 0x6bc6, 0xfffd, 0x5614, 0xfffd, 0x6f1a, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x76e4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9f90, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8ce0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5674, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9d6c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x46 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9a19, 0x98c4, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x983b, 0x8ca7, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x860b, 0xfffd, 0xfffd, 0x6191, 0xfffd, 0x8a55, + 0xfffd, 0xfffd, 0x6f51, 0x9817, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x64b2, 0x92ea, 0x50d5, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x6a38, 0xfffd, 0xfffd, 0xfffd, 0x8b5c, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x81cd, 0x9f4a, 0xfffd, 0xfffd, 0xfffd, 0x9a0e, 0xfffd, + 0x8c48, 0xfffd, 0xfffd, 0x5553, 0xfffd, 0xfffd, 0xfffd, 0x6c23, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a16, 0xfffd, + /* 0x47 */ + 0xfffd, 0xfffd, 0x727d, 0xfffd, 0x91fa, 0x925b, 0xfffd, 0x9077, + 0x7c3d, 0xfffd, 0x8b19, 0xfffd, 0xfffd, 0x9322, 0x9257, 0xfffd, + 0xfffd, 0xfffd, 0x6dfa, 0x8b74, 0x5879, 0xfffd, 0xfffd, 0xfffd, + 0x69cd, 0x55c6, 0xfffd, 0xfffd, 0x58bb, 0x8594, 0xfffd, 0x6436, + 0xfffd, 0x936c, 0xfffd, 0xfffd, 0x6a4b, 0xfffd, 0x55ac, 0x50d1, + 0xfffd, 0xfffd, 0xfffd, 0x7ff9, 0xfffd, 0xfffd, 0x7ac5, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7aca, 0x6b3d, 0xfffd, 0x89aa, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5be2, 0xfffd, 0xfffd, + 0x8f15, 0x6c2b, 0x50be, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9803, 0x8acb, 0x6176, 0x74ca, 0x7aae, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8da8, 0x5340, + 0xfffd, 0xfffd, 0x8ec0, 0xfffd, 0x9a45, 0xfffd, + /* 0x48 */ + 0xfffd, 0xfffd, 0x9f72, 0xfffd, 0xfffd, 0xfffd, 0x9874, 0x6b0a, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x52f8, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9d72, 0xfffd, 0x78ba, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8b93, 0x9952, 0x64fe, 0x7e5e, 0xfffd, 0x71b1, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x97cc, 0xfffd, 0x8a8d, 0xfffd, + 0xfffd, 0x7d09, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x69ae, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d68, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8edf, 0xfffd, 0xfffd, 0xfffd, + 0x92ed, 0x958f, 0x6f64, 0xfffd, 0xfffd, 0xfffd, 0x7051, 0x85a9, + 0xfffd, 0x9c13, 0xfffd, 0x8cfd, 0xfffd, 0xfffd, + /* 0x49 */ + 0x5098, 0xfffd, 0xfffd, 0xfffd, 0x55aa, 0xfffd, 0x9a37, 0x6383, + 0xfffd, 0xfffd, 0xfffd, 0x6f80, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x6bba, 0xfffd, 0xfffd, 0x7d17, 0xfffd, 0xfffd, 0xfffd, 0x7be9, + 0x66ec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x9583, 0x965d, 0xfffd, 0x8d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7e55, 0xfffd, 0x50b7, 0xfffd, 0x8cde, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71d2, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7d39, 0xfffd, 0x8cd2, 0xfffd, 0xfffd, + 0x6368, 0xfffd, 0x651d, 0xfffd, 0x61fe, 0xfffd, 0xfffd, 0x8a2d, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d33, + 0xfffd, 0xfffd, 0x5be9, 0x5b38, 0xfffd, 0x814e, 0xfffd, 0x6ef2, + 0x8072, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e69, + /* 0x4a */ + 0xfffd, 0xfffd, 0xfffd, 0x52dd, 0x8056, 0x5e2b, 0xfffd, 0x7345, + 0xfffd, 0x6fd5, 0x8a69, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x6642, 0xfffd, 0xfffd, 0x8755, 0x5be6, 0x8b58, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x99db, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x52e2, 0xfffd, 0xfffd, + 0xfffd, 0x9069, 0xfffd, 0xfffd, 0x91cb, 0x98fe, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8996, 0x8a66, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x58fd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7378, 0xfffd, 0x6a1e, + 0xfffd, 0xfffd, 0xfffd, 0x8f38, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x66f8, 0x8d16, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5c6c, 0x8853, 0xfffd, 0x6a39, 0xfffd, + 0xfffd, 0x7aea, 0xfffd, 0xfffd, 0x6578, 0xfffd, + /* 0x4b */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e25, 0xfffd, + 0xfffd, 0xfffd, 0x96d9, 0xfffd, 0x8ab0, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9806, 0xfffd, 0x8aac, 0x78a9, 0xfffd, 0x720d, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d72, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98fc, 0xfffd, + 0x9b06, 0x8073, 0x616b, 0x980c, 0xfffd, 0xfffd, 0x8a1f, 0x8aa6, + 0xfffd, 0xfffd, 0x64fb, 0xfffd, 0x8607, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a34, 0x8085, + 0xfffd, 0xfffd, 0xfffd, 0x96d6, 0xfffd, 0x96a8, 0x7d8f, 0xfffd, + 0xfffd, 0x6b72, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b6b, 0x640d, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e2e, 0x7463, 0xfffd, 0x9396, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x4c */ + 0x737a, 0x64bb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81fa, + 0xfffd, 0xfffd, 0xfffd, 0x614b, 0xfffd, 0xfffd, 0x6524, 0x8caa, + 0x7671, 0x7058, 0x58c7, 0xfffd, 0xfffd, 0xfffd, 0x8b5a, 0x8ac7, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5606, 0xfffd, 0x6e6f, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x71d9, 0xfffd, 0x6fe4, 0xfffd, 0x7e27, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a0e, 0xfffd, 0xfffd, + 0xfffd, 0x9a30, 0xfffd, 0x8b04, 0xfffd, 0xfffd, 0xfffd, 0x92bb, + 0xfffd, 0x984c, 0xfffd, 0xfffd, 0x9ad4, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x689d, 0xfffd, 0xfffd, 0xfffd, + 0x8cbc, 0x9435, 0xfffd, 0x5ef3, 0x807d, 0x70f4, + /* 0x4d */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9285, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7d71, 0xfffd, 0xfffd, 0xfffd, 0x982d, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5716, 0xfffd, 0xfffd, 0x5857, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5718, 0xfffd, 0x983d, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9d15, 0xfffd, 0x99b1, 0x99dd, 0x6a62, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7aaa, 0xfffd, 0xfffd, 0x896a, + 0xfffd, 0xfffd, 0xfffd, 0x5f4e, 0x7063, 0xfffd, 0x9811, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x842c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7db2, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x4e */ + 0xfffd, 0xfffd, 0xfffd, 0x97cb, 0x9055, 0xfffd, 0x570d, 0xfffd, + 0xfffd, 0x7232, 0x6ff0, 0x7dad, 0x8466, 0xfffd, 0xfffd, 0x5049, + 0x50de, 0xfffd, 0x7def, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b02, 0xfffd, 0xfffd, 0x885b, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x805e, 0x7d0b, 0xfffd, 0x7a69, + 0xfffd, 0x554f, 0xfffd, 0xfffd, 0xfffd, 0x64be, 0x8778, 0x6e26, + 0x7aa9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x55da, + 0x93a2, 0x70cf, 0xfffd, 0x8aa3, 0xfffd, 0x7121, 0x856a, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5862, 0xfffd, 0x9727, 0xfffd, 0xfffd, 0xfffd, + 0x52d9, 0xfffd, 0x8aa4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x932b, 0x72a7, + /* 0x4f */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8972, 0xfffd, 0x7fd2, + 0xfffd, 0xfffd, 0x9291, 0xfffd, 0xfffd, 0xfffd, 0x6232, 0x7d30, + 0xfffd, 0x8766, 0xfffd, 0xfffd, 0x8f44, 0xfffd, 0x5cfd, 0x4fe0, + 0x72f9, 0xfffd, 0xfffd, 0xfffd, 0x5687, 0xfffd, 0x9341, 0xfffd, + 0xfffd, 0x9bae, 0x7e96, 0xfffd, 0x8ce2, 0x929c, 0xfffd, 0x9591, + 0xfffd, 0xfffd, 0xfffd, 0x986f, 0x96aa, 0x73fe, 0x737b, 0x7e23, + 0xfffd, 0x9921, 0xfffd, 0x61b2, 0xfffd, 0xfffd, 0x7dab, 0xfffd, + 0xfffd, 0x9472, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9109, 0xfffd, + 0xfffd, 0x8a73, 0xfffd, 0x97ff, 0xfffd, 0x9805, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x856d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x56c2, 0x92b7, 0xfffd, 0xfffd, 0xfffd, 0x66c9, + /* 0x50 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x562f, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5354, 0x633e, 0xfffd, 0xfffd, + 0xfffd, 0x8105, 0x8ae7, 0x5beb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x7009, 0x8b1d, 0xfffd, 0xfffd, 0xfffd, 0x92c5, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91c1, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8208, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x92b9, 0xfffd, 0xfffd, 0x7d89, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9808, 0xfffd, 0x8a31, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dd2, 0x7e8c, + 0x8ed2, 0xfffd, 0xfffd, 0x61f8, 0xfffd, 0xfffd, + /* 0x51 */ + 0x9078, 0x766c, 0xfffd, 0x7d62, 0xfffd, 0xfffd, 0x5b78, 0xfffd, + 0xfffd, 0xfffd, 0x52db, 0xfffd, 0xfffd, 0xfffd, 0x8a62, 0x5c0b, + 0x99b4, 0xfffd, 0xfffd, 0xfffd, 0x8a13, 0x8a0a, 0x905c, 0xfffd, + 0x58d3, 0xfffd, 0x9d09, 0x9d28, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x555e, 0x4e9e, 0x8a1d, + 0xfffd, 0xfffd, 0x95b9, 0xfffd, 0xfffd, 0x9e7d, 0x56b4, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9854, 0x95bb, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8277, 0xfffd, 0xfffd, + 0x53ad, 0x786f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8afa, + 0x9a57, 0xfffd, 0xfffd, 0x9d26, 0xfffd, 0x694a, 0x63da, 0xfffd, + 0x760d, 0xfffd, 0xfffd, 0x967d, 0xfffd, 0xfffd, 0x7662, 0x990a, + 0x6a23, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x52 */ + 0xfffd, 0x582f, 0xfffd, 0xfffd, 0x8b21, 0xfffd, 0xfffd, 0xfffd, + 0x85e5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x723a, 0xfffd, + 0xfffd, 0xfffd, 0x9801, 0xfffd, 0x696d, 0x8449, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91ab, 0xfffd, 0x92a5, 0xfffd, + 0xfffd, 0xfffd, 0x9824, 0xfffd, 0x907a, 0xfffd, 0x5100, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87fb, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x85dd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x5104, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x61b6, 0x7fa9, 0xfffd, 0xfffd, 0x8a63, + 0x8b70, 0x8abc, 0x8b6f, 0xfffd, 0xfffd, 0xfffd, 0x7e79, 0xfffd, + 0x852d, 0xfffd, 0xfffd, 0xfffd, 0x9670, 0xfffd, 0xfffd, 0x9280, + 0xfffd, 0xfffd, 0x98f2, 0xfffd, 0xfffd, 0x96b1, + /* 0x53 */ + 0xfffd, 0xfffd, 0x6afb, 0x5b30, 0x9df9, 0x61c9, 0x7e93, 0x7469, + 0x87a2, 0x71df, 0x7192, 0x8805, 0xfffd, 0x8d0f, 0xfffd, 0xfffd, + 0x7a4e, 0xfffd, 0xfffd, 0x55b2, 0x64c1, 0x50ad, 0xfffd, 0x7670, + 0xfffd, 0xfffd, 0x8e34, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x512a, 0xfffd, 0x6182, 0xfffd, + 0xfffd, 0x90f5, 0x923e, 0x7336, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a98, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f3f, 0x9918, + 0xfffd, 0xfffd, 0x9b5a, 0xfffd, 0xfffd, 0x6f01, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8207, 0x5dbc, 0xfffd, 0xfffd, 0x8a9e, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9b31, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7344, 0xfffd, 0x8b7d, + /* 0x54 */ + 0xfffd, 0xfffd, 0xfffd, 0x9810, 0xfffd, 0x99ad, 0x9d1b, 0x6df5, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f45, 0x5712, + 0x54e1, 0x5713, 0xfffd, 0xfffd, 0x7de3, 0x9060, 0xfffd, 0x9858, + 0xfffd, 0xfffd, 0xfffd, 0x7d04, 0xfffd, 0x8e8d, 0x9470, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x95b2, 0xfffd, 0x96f2, 0x9116, 0xfffd, + 0x9695, 0xfffd, 0x904b, 0x85f4, 0x9196, 0x6688, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x96dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f09, + 0xfffd, 0xfffd, 0xfffd, 0x6522, 0x66ab, 0x8d0a, 0x8d1c, 0x81df, + 0xfffd, 0xfffd, 0xfffd, 0x947f, 0xfffd, 0x68d7, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7ac8, 0xfffd, 0x8cac, + 0x64c7, 0x5247, 0x6fa4, 0x8cca, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8d08, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ecb, + /* 0x55 */ + 0x9358, 0x9598, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8a50, 0xfffd, 0x9f4b, 0xfffd, 0xfffd, 0x50b5, 0xfffd, 0xfffd, + 0x6c08, 0xfffd, 0xfffd, 0xfffd, 0x76de, 0x65ac, 0x8f3e, 0x5d84, + 0xfffd, 0xfffd, 0x68e7, 0xfffd, 0x6230, 0xfffd, 0xfffd, 0x7dbb, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5f35, 0xfffd, 0x6f32, 0xfffd, + 0xfffd, 0x5e33, 0x8cec, 0xfffd, 0x8139, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x8d99, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87c4, 0x8f4d, 0xfffd, 0x937a, + 0xfffd, 0x9019, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8c9e, 0x91dd, 0x5075, 0xfffd, 0xfffd, 0x8a3a, 0xfffd, + 0xfffd, 0x93ae, 0x9663, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x56 */ + 0x5e40, 0x7665, 0x912d, 0x8b49, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e54, 0x8077, + 0xfffd, 0xfffd, 0xfffd, 0x57f7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8879, 0xfffd, 0x7d19, 0xfffd, 0x646f, 0x64f2, + 0xfffd, 0xfffd, 0xfffd, 0x5e5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8cea, 0xfffd, 0xfffd, 0x6eef, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9418, 0xfffd, 0x7d42, 0x7a2e, 0x816b, 0xfffd, + 0xfffd, 0x8846, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b05, 0xfffd, + 0x8ef8, 0xfffd, 0xfffd, 0xfffd, 0x76ba, 0xfffd, 0x665d, 0x9a5f, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8af8, 0x8a85, 0xfffd, + 0xfffd, 0x71ed, 0xfffd, 0xfffd, 0x77da, 0x56d1, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x8caf, 0x9444, 0x7bc9, + /* 0x57 */ + 0xfffd, 0xfffd, 0xfffd, 0x99d0, 0xfffd, 0xfffd, 0xfffd, 0x5c08, + 0x78da, 0x8f49, 0xfffd, 0x8cfa, 0xfffd, 0x6a01, 0x838a, 0x88dd, + 0x599d, 0xfffd, 0x58ef, 0x72c0, 0xfffd, 0x9310, 0xfffd, 0x8d05, + 0x589c, 0x7db4, 0x8ac4, 0x6e96, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6fc1, 0xfffd, + 0xfffd, 0x8cc7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f2c, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7d9c, 0x7e3d, 0x7e31, 0x9112, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a5b, 0xfffd, + 0x7d44, 0x947d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x58 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x55c7, 0xfffd, 0xfffd, 0x5399, 0xfffd, + 0x53b4, 0xfffd, 0xfffd, 0x9768, 0x8d0b, 0xfffd, 0xfffd, 0x532d, + 0x5331, 0xfffd, 0x8cfe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x5244, 0xfffd, 0x528c, 0x5274, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x50b4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5000, 0x5096, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x59 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5115, 0xfffd, 0x5102, 0xfffd, + 0x5114, 0x513c, 0x5137, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50e8, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50c2, 0x513b, 0x5110, 0x513a, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50c9, 0xfffd, 0xfffd, 0xfffd, + 0x7cf4, 0xfffd, 0xfffd, 0x9ecc, 0xfffd, 0x56c5, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x9cec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x893b, 0x81e0, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x5a */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a01, 0x8a10, 0x8a0c, 0x8a15, + 0x8b33, 0x8a4e, 0x8a25, 0x8a41, 0x8a36, 0x8a46, 0x8a54, 0x8a58, + 0x8a52, 0x8a86, 0x8a84, 0x8a7f, 0x8a70, 0x8a7c, 0x8a75, 0x8a6c, + 0x8a6e, 0x8acd, 0x8ae2, 0x8a61, 0x8a9a, 0x8aa5, 0x8a91, 0x8a92, + 0x8acf, 0x8ad1, 0x8ac9, 0x8adb, 0x8ad7, 0x8ac2, 0x8ab6, 0x8af6, + 0x8aeb, 0x8b14, 0x8b01, 0x8ae4, 0x8aed, 0x8afc, 0x8af3, 0x8ae6, + 0x8aee, 0x8ade, 0x8b28, 0x8b9c, 0x8b16, 0x8b1a, 0x8b10, 0x8b2b, + 0x8b2d, 0x8b56, 0x8b59, 0x8b4e, 0x8b9e, 0x8b6b, 0x8b96, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9658, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x913a, 0xfffd, + 0x9114, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9134, + /* 0x5b */ + 0xfffd, 0xfffd, 0x90df, 0xfffd, 0xfffd, 0x9136, 0xfffd, 0xfffd, + 0x9106, 0x9148, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x82bb, 0xfffd, 0x52f1, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5df0, 0xfffd, + 0x580a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x58d9, 0xfffd, 0xfffd, 0x58e2, 0xfffd, 0xfffd, + 0xfffd, 0x58e0, 0xfffd, 0x58da, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x57e1, 0xfffd, 0xfffd, 0x584f, 0xfffd, 0xfffd, + 0x5816, 0xfffd, 0xfffd, 0xfffd, 0x5852, 0x581d, 0x5864, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x5c */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x858c, 0xfffd, 0xfffd, 0x8553, 0xfffd, + 0xfffd, 0x85f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x83a7, + 0x8407, 0x84ef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x82e7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8622, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8526, + 0xfffd, 0xfffd, 0x584b, 0x7162, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8558, 0x84fd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x854e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8588, 0xfffd, 0xfffd, + 0x85ba, 0xfffd, 0xfffd, 0xfffd, 0x7296, 0x6ece, + /* 0x5d */ + 0x8541, 0xfffd, 0x85ce, 0x8552, 0x84c0, 0x8452, 0x8464, 0xfffd, + 0xfffd, 0x8494, 0x8435, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x859f, 0xfffd, 0xfffd, 0x8555, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9daf, 0x8493, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7e08, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8546, 0xfffd, 0xfffd, 0x8562, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x851e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9a40, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x863a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x93a3, 0x8577, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x861e, 0xfffd, 0x85fa, + /* 0x5e */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8604, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x85ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x861a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5969, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5c37, 0xfffd, + 0x636b, 0x6476, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x649f, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x6451, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x645c, + 0xfffd, 0xfffd, 0xfffd, 0x64b3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x6504, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6516, 0xfffd, 0xfffd, + /* 0x5f */ + 0xfffd, 0x64f7, 0x64fc, 0xfffd, 0x651b, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5630, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5638, 0x56c8, 0xfffd, 0x56a6, 0xfffd, + 0xfffd, 0x5504, 0x54bc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5680, 0xfffd, 0xfffd, 0xfffd, 0x565d, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5660, 0xfffd, 0xfffd, 0x5635, + 0x55f6, 0xfffd, 0xfffd, 0x5666, 0xfffd, 0xfffd, 0xfffd, 0x5672, + 0xfffd, 0x568c, 0xfffd, 0xfffd, 0xfffd, 0x5665, 0xfffd, 0xfffd, + 0x561c, 0xfffd, 0x562e, 0xfffd, 0xfffd, 0xfffd, 0x55e9, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5616, 0xfffd, 0xfffd, 0xfffd, + 0x56c0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x60 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x560d, 0x56b3, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x56c1, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x566f, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f61, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x56b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5695, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5707, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e43, + 0xfffd, 0xfffd, 0xfffd, 0x5e6c, 0x5e58, 0x5e57, + /* 0x61 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5d87, 0xfffd, 0x5cf4, 0xfffd, 0xfffd, 0x5d50, + 0xfffd, 0xfffd, 0xfffd, 0x5d2c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5da7, 0xfffd, 0x5da0, 0xfffd, 0xfffd, 0x5d97, + 0x5d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x5db8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5d81, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5dd4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x540e, 0x5fa0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7377, 0x7341, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x736a, 0xfffd, 0x733b, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x736b, 0xfffd, + /* 0x62 */ + 0xfffd, 0xfffd, 0xfffd, 0x7380, 0xfffd, 0xfffd, 0xfffd, 0x737c, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x98e0, 0x9933, 0x98e9, 0x993c, 0x98ea, 0x98eb, + 0x98ed, 0x98f4, 0x9909, 0x9911, 0x4f59, 0x991b, 0x9937, 0x993f, + 0x9943, 0x9948, 0x9949, 0x994a, 0x994c, 0x9962, 0xfffd, 0x5ee1, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8ce1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x61fa, 0x61ae, 0xfffd, 0x616a, 0xfffd, 0xfffd, + 0x613e, 0x60b5, 0x6134, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61cc, + 0xfffd, 0x615f, 0x61e8, 0x60fb, 0x6137, 0xfffd, + /* 0x63 */ + 0xfffd, 0x60f2, 0xfffd, 0xfffd, 0x6173, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x611c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6192, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9582, 0x9586, 0x95c8, 0x958e, + 0x9594, 0x958c, 0x95e5, 0x95ad, 0x95ab, 0x9b2e, 0x95ac, 0x95be, + 0x95b6, 0x9b29, 0x95bf, 0x95bd, 0x95bc, 0x95c3, 0x95cb, 0x95d4, + 0x95d0, 0x95d5, 0x95de, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7043, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f59, 0xfffd, 0xfffd, 0xfffd, + 0x7027, 0x7018, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ffc, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6d87, + /* 0x64 */ + 0xfffd, 0xfffd, 0xfffd, 0x6d79, 0x6e5e, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x6fae, 0xfffd, 0xfffd, 0xfffd, 0x700f, 0x6ef8, + 0x6f6f, 0xfffd, 0xfffd, 0xfffd, 0x6df6, 0x6f7f, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x7006, 0xfffd, 0xfffd, 0x6fa0, 0xfffd, 0xfffd, 0xfffd, + 0x700b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7067, 0xfffd, 0xfffd, 0x7044, 0xfffd, 0x7005, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6f77, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x7020, 0x701f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x7032, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7028, + /* 0x65 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x705d, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x9a2b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9087, 0xfffd, + 0x9015, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9090, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5c68, + 0xfffd, 0x5f33, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5af5, 0x5ad7, 0xfffd, + /* 0x66 */ + 0xfffd, 0xfffd, 0x5b00, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x5a6d, 0x5b08, 0xfffd, 0x5b4c, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x5aa7, 0x5afb, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b0b, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b21, + 0x5b2a, 0xfffd, 0xfffd, 0xfffd, 0x5b19, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99d4, + 0x99df, 0x99d9, 0x9a36, 0x9a5b, 0x99d1, 0x99d8, 0x9a4d, 0x9a4a, + 0x99e2, 0x9a6a, 0x9a0f, 0x9a0d, 0x9a05, 0x9a42, 0x9a2d, 0x9a16, + 0x9a41, 0x9a2e, 0x9a38, 0x9a43, 0x9a44, 0x9a4f, 0x9a65, 0x9a64, + 0x7cf9, 0x7d06, 0x7d02, 0x7d07, 0x7d08, 0x7e8a, + /* 0x67 */ + 0x7d1c, 0x7d15, 0x7d13, 0x7d3a, 0x7d32, 0x7d31, 0x7e10, 0x7d3c, + 0x7d40, 0x7d3f, 0x7d5d, 0x7d4e, 0x7d73, 0x7d86, 0x7d83, 0x7d88, + 0x7dbe, 0x7dba, 0x7dcb, 0x7dd4, 0x7dc4, 0x7d9e, 0x7dac, 0x7db9, + 0x7da3, 0x7db0, 0x7dc7, 0x7dd9, 0x7dd7, 0x7df9, 0x7df2, 0x7e62, + 0x7de6, 0x7df6, 0x7df1, 0x7e0b, 0x7de1, 0x7e09, 0x7e1d, 0x7e1f, + 0x7e1e, 0x7e2d, 0x7e0a, 0x7e11, 0x7e7d, 0x7e39, 0x7e35, 0x7e32, + 0x7e46, 0x7e45, 0x7e88, 0x7e5a, 0x7e52, 0x7e6e, 0x7e7e, 0x7e70, + 0x7e6f, 0x7e98, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x74a3, 0x744b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74cf, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x980a, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x74bd, 0x743f, 0x7489, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x68 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74a6, + 0xfffd, 0xfffd, 0xfffd, 0x74d4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74da, 0xfffd, 0x97d9, + 0x97de, 0x97dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x69aa, 0x6aea, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6898, 0xfffd, 0x68d6, 0x6a05, + 0x689f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6adb, 0xfffd, 0x6af3, + 0xfffd, 0xfffd, 0x6ae8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6adf, 0xfffd, 0x6a89, 0xfffd, + 0xfffd, 0x690f, 0x6a48, 0xfffd, 0x6968, 0xfffd, 0x69bf, 0xfffd, + 0xfffd, 0xfffd, 0x6a3a, 0xfffd, 0x6a9c, 0xfffd, 0x6b12, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x6b1e, 0xfffd, 0xfffd, 0x6add, 0x69e7, 0xfffd, + /* 0x69 */ + 0x6b0f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6b16, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6aec, 0x6ada, 0xfffd, 0x6af8, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6ab3, 0xfffd, 0x6ae7, 0xfffd, 0xfffd, + 0x6aa3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ad3, 0xfffd, 0xfffd, + 0xfffd, 0x6ade, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x6ba4, 0xfffd, 0x6b9e, 0x6bae, 0xfffd, + 0x6bab, 0xfffd, 0x6baf, 0xfffd, 0x8ed4, 0x8edb, 0x8ef2, 0x8efb, + 0x8f64, 0x8ef9, 0x8efc, 0x8eeb, 0x8ee4, 0x8f62, 0x8efa, 0x8efe, + 0x8f0a, 0x8f07, 0x8f05, 0x8f12, 0x8f26, 0x8f1e, + /* 0x6a */ + 0x8f1f, 0x8f1c, 0x8f33, 0x8f46, 0x8f54, 0xfffd, 0x6214, 0x6227, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x750c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x66c7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x66c4, 0xfffd, 0xfffd, 0x6689, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x66d6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8cc1, 0x8cb0, 0x8cba, 0x8cbd, 0x8d04, 0x8cb2, 0x8cc5, + 0x8d10, 0x8cd1, 0x8cda, 0x8cd5, 0x8ceb, 0x8ce7, 0x8cfb, 0x8998, + 0x89ac, 0x89a1, 0x89bf, 0x89a6, 0x89af, 0x89b2, 0x89b7, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x6b */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6bff, 0xfffd, + 0xfffd, 0x6c0c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x6c2c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7258, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x6727, 0x8156, 0xfffd, 0x81da, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x811b, 0xfffd, 0xfffd, + 0xfffd, 0x81be, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8161, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81cf, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x6c */ + 0xfffd, 0xfffd, 0x6b5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x98ae, 0x98af, 0x98b6, 0x98bc, 0x98c6, 0x98c8, 0xfffd, 0xfffd, + 0x8f42, 0xfffd, 0xfffd, 0x9f4f, 0x6595, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x716c, 0x7152, 0xfffd, + 0x7197, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71c1, 0xfffd, + 0xfffd, 0xfffd, 0x71dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x71fe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x79b0, 0xfffd, 0xfffd, 0x798e, 0xfffd, 0xfffd, 0x79aa, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x6d */ + 0x61df, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6164, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61e3, 0x6207, + 0xfffd, 0xfffd, 0xfffd, 0x6fa9, 0xfffd, 0x78ef, 0xfffd, 0x78ad, + 0xfffd, 0x7868, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x78b8, 0xfffd, + 0xfffd, 0x792a, 0x7931, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7864, 0x78fd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x78e7, 0xfffd, 0xfffd, 0xfffd, 0x78e3, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f95, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7798, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x775e, 0x77bc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x6e */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7f86, 0xfffd, 0xfffd, 0x7f88, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x91d2, 0x91d3, 0x91d4, 0x91d9, 0x91d7, + 0x91d5, 0x91f7, 0x91e7, 0x91e4, 0x9346, 0x91f5, 0x91f9, 0x9208, + 0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, 0x9225, + 0x9200, 0x923a, 0x9266, 0x9237, 0x9233, 0x9255, 0x923d, 0x9238, + 0x925e, 0x926c, 0x926d, 0x923f, 0x9460, 0x9230, 0x9249, 0x9248, + 0x924d, 0x922e, 0x9239, 0x9438, 0x92ac, 0x92a0, 0x927a, 0x92aa, + 0x92ee, 0x92cf, 0x9403, 0x92e3, 0x943a, 0x92b1, 0x92a6, 0x93a7, + 0x9296, 0x92cc, 0x92a9, 0x93f5, 0x9293, 0x927f, + /* 0x6f */ + 0x93a9, 0x929a, 0x931a, 0x92ab, 0x9283, 0x940b, 0x92a8, 0x92a3, + 0x9412, 0x9338, 0x92f1, 0x93d7, 0x92e5, 0x92f0, 0x92ef, 0x92e8, + 0x92bc, 0x92dd, 0x92f6, 0x9426, 0x9427, 0x92c3, 0x92df, 0x92e6, + 0x9312, 0x9306, 0x9369, 0x931b, 0x9340, 0x9301, 0x9315, 0x932e, + 0x9343, 0x9307, 0x9308, 0x931f, 0x9319, 0x9365, 0x9347, 0x9376, + 0x9354, 0x9364, 0x93aa, 0x9370, 0x9384, 0x93e4, 0x93d8, 0x9428, + 0x9387, 0x93cc, 0x9398, 0x93b8, 0x93bf, 0x93a6, 0x93b0, 0x93b5, + 0x944c, 0x93e2, 0x93dc, 0x93dd, 0x93cd, 0x93de, 0x93c3, 0x93c7, + 0x93d1, 0x9414, 0x941d, 0x93f7, 0x9465, 0x9413, 0x946d, 0x9420, + 0x9479, 0x93f9, 0x9419, 0x944a, 0x9432, 0x943f, 0x9454, 0x9463, + 0x937e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x70 */ + 0xfffd, 0xfffd, 0x7a61, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9ce9, 0x9cf6, + 0x9d07, 0x9d06, 0x9d23, 0x9d87, 0x9e15, 0x9d1d, 0x9d1f, 0x9de5, + 0x9d2f, 0x9dd9, 0x9d30, 0x9d42, 0x9e1e, 0x9d53, 0x9e1d, 0x9d60, + 0x9d52, 0x9df3, 0x9d5c, 0x9d61, 0x9d93, 0x9d6a, 0x9d6f, 0x9d89, + 0x9d98, 0x9d9a, 0x9dc0, 0x9da5, 0x9da9, 0x9dc2, 0x9dbc, 0x9e1a, + 0x9dd3, 0x9dda, 0x9def, 0x9de6, 0x9df2, 0x9df8, 0x9e0c, 0x9dfa, + 0x9e1b, 0xfffd, 0xfffd, 0x7664, 0x7658, 0xfffd, 0x7667, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x7602, 0xfffd, 0xfffd, 0x7646, 0xfffd, 0xfffd, 0x7647, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7649, 0xfffd, + 0x761e, 0xfffd, 0xfffd, 0x763b, 0xfffd, 0xfffd, + /* 0x71 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x766d, + 0xfffd, 0xfffd, 0x766e, 0xfffd, 0xfffd, 0x7669, 0xfffd, 0xfffd, + 0xfffd, 0x7672, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x7ac7, 0xfffd, 0xfffd, 0xfffd, 0x7ab6, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8960, 0xfffd, 0xfffd, 0xfffd, 0x8933, 0xfffd, 0x895d, 0x8947, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x8938, 0xfffd, 0x8964, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x76b8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x802e, 0xfffd, 0xfffd, 0x802c, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8079, 0xfffd, + 0x8075, 0xfffd, 0xfffd, 0x9807, 0x980e, 0x980f, + /* 0x72 */ + 0x9821, 0x981c, 0x6f41, 0x9826, 0x9837, 0x984e, 0x9853, 0x9873, + 0x9862, 0x9859, 0x9865, 0x986c, 0x9870, 0xfffd, 0xfffd, 0xfffd, + 0x87e3, 0x8806, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8706, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x8823, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x87f6, 0xfffd, 0xfffd, 0x86fa, 0x87ef, 0xfffd, 0x8784, 0xfffd, + 0xfffd, 0xfffd, 0x8810, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87c8, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8811, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87bb, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87ce, 0xfffd, + /* 0x73 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7f4c, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7be4, 0xfffd, 0x7b67, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c69, 0xfffd, 0xfffd, + 0x7bf3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c00, 0x7bcb, 0xfffd, 0xfffd, + 0xfffd, 0x7c5c, 0xfffd, 0x7c1e, 0xfffd, 0xfffd, 0x7c2b, 0xfffd, + 0x7c23, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c6a, 0xfffd, + /* 0x74 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c5f, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8264, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x826b, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x88ca, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7fa5, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cf2, 0x7cf6, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cdd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x7e36, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9ea9, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8db2, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x75 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91c5, 0x91c3, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9e7a, 0x8e89, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x8e4c, 0xfffd, 0xfffd, 0xfffd, 0x8e92, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8e7a, 0x8e55, 0xfffd, + 0x8e9a, 0x8e8b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x8e93, 0xfffd, 0xfffd, 0x8e91, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ea1, 0x8e63, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8eaa, 0xfffd, + 0xfffd, 0x8ea6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x89f4, 0xfffd, 0xfffd, + /* 0x76 */ + 0xfffd, 0xfffd, 0x89f6, 0xfffd, 0xfffd, 0x975a, 0xfffd, 0x9742, + 0xfffd, 0xfffd, 0x973d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9744, + 0xfffd, 0xfffd, 0x9f54, 0x9f5f, 0x9f59, 0x9f60, 0x9f5c, 0x9f66, + 0x9f6c, 0x9f6a, 0x9f77, 0x9efd, 0x9eff, 0x9f09, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b8e, 0xfffd, 0x947e, 0xfffd, + 0x93e8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9b77, 0x9b74, + 0x9b81, 0x9b83, 0x9b8e, 0x9c78, 0x7a4c, 0x9b92, 0x9c5f, 0x9b90, + 0x9bad, 0x9b9a, 0x9baa, 0x9b9e, 0x9c6d, 0x9bab, 0x9b9d, 0x9c58, + 0x9bc1, 0x9c7a, 0x9c31, 0x9c39, 0x9c23, 0x9c37, 0x9bc0, 0x9bca, + 0x9bc7, 0x9bfd, 0x9bd6, 0x9bea, 0x9beb, 0x9be1, 0x9be4, 0x9be7, + 0x9bdd, 0x9be2, 0x9bf0, 0x9bdb, 0x9bf4, 0x9bd4, 0x9c5d, 0x9c08, + 0x9c10, 0x9c0d, 0x9c12, 0x9c09, 0x9bff, 0x9c20, + /* 0x77 */ + 0x9c32, 0x9c2d, 0x9c28, 0x9c25, 0x9c29, 0x9c33, 0x9c3e, 0x9c48, + 0x9c3b, 0x9c35, 0x9c45, 0x9c56, 0x9c54, 0x9c52, 0x9c67, 0xfffd, + 0xfffd, 0x97c3, 0x97bd, 0xfffd, 0x97c9, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9dbb, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x9acf, 0xfffd, 0x9ad6, 0x9ad5, 0xfffd, 0xfffd, + 0xfffd, 0x9b58, 0x9b4e, 0xfffd, 0xfffd, 0xfffd, 0x9957, 0x995c, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9b22, 0xfffd, 0xfffd, + 0x4e48, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x9ef7, 0xfffd, 0xfffd, 0x9ef2, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x78 */ + 0x896c, 0x95c6, 0x9336, 0x5f46, 0x8514, 0x7e94, 0x5382, 0x51b2, + 0x4e11, 0x9f63, 0x5679, 0x515a, 0x6dc0, 0x9f15, 0x6597, 0x5641, + 0x9aee, 0x8303, 0x4e30, 0x8907, 0x5e72, 0x7a40, 0x98b3, 0x5e7f, + 0x95a4, 0x9b0d, 0x5212, 0x8ff4, 0x5f59, 0x7a6b, 0x98e2, 0x51e0, + 0x50a2, 0x4ef7, 0x8350, 0x8591, 0x5118, 0x636e, 0x6372, 0x524b, + 0x5938, 0x774f, 0x8721, 0x814a, 0x7e8d, 0x91cc, 0x66c6, 0x5e18, + 0x77ad, 0x9e75, 0x56c9, 0x9ef4, 0x6fdb, 0x61de, 0x77c7, 0x7030, + 0x9eb5, 0x884a, 0x95e2, 0x82f9, 0x51ed, 0x6251, 0x4ec6, 0x6734, + 0x97c6, 0x7c64, 0x7e34, 0x97a6, 0x9eaf, 0x786e, 0x820d, 0x672f, + 0x677e, 0x56cc, 0x53f0, 0x98b1, 0x6aaf, 0x7f4e, 0x6d82, 0x7cf0, + 0x4e07, 0x4fc2, 0x7e6b, 0x9e79, 0x56ae, 0x9b1a, 0x846f, 0x53f6, + 0x90c1, 0x79a6, 0x7c72, 0x613f, 0x4e91, 0x9ad2, + /* 0x79 */ + 0x75c7, 0x96bb, 0x53ea, 0x7dfb, 0x88fd, 0x79cd, 0x7843, 0x7b51, + 0x51c6, +}; + +static int +gb12345ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x21) || (c1 == 0x26) || (c1 == 0x28) || (c1 >= 0x30 && c1 <= 0x79)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 470) { + if (i < 12) + wc = gb12345ext_2uni_page21[i]; + } else if (i < 658) { + if (i < 555) + wc = gb12345ext_2uni_page26[i-470]; + } else if (i < 1410) { + if (i < 690) + wc = gb12345ext_2uni_page28[i-658]; + } else { + if (i < 8281) + wc = gb12345ext_2uni_page30[i-1410]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short gb12345ext_2charset[2252] = { + 0x283d, 0x283e, 0x283f, 0x283b, 0x2840, 0x283c, 0x212c, 0x7871, + 0x7829, 0x7833, 0x7761, 0x4252, 0x787d, 0x5147, 0x785f, 0x7842, + 0x6245, 0x4034, 0x4258, 0x7872, 0x4f40, 0x5876, 0x4129, 0x3256, + 0x3876, 0x4347, 0x4257, 0x4e30, 0x3260, 0x556c, 0x5877, 0x4921, + 0x3138, 0x7841, 0x5336, 0x342b, 0x5871, 0x552e, 0x494b, 0x4763, + 0x594d, 0x3d76, 0x595d, 0x4748, 0x464d, 0x4e31, 0x3d44, 0x5947, + 0x3c5b, 0x5247, 0x592f, 0x525a, 0x3f6b, 0x3c73, 0x594f, 0x5931, + 0x592d, 0x7845, 0x3325, 0x5345, 0x3422, 0x5933, 0x5950, 0x594e, + 0x5932, 0x3679, 0x782c, 0x413d, 0x7828, 0x7929, 0x3633, 0x7840, + 0x785d, 0x3f2d, 0x783b, 0x5859, 0x5472, 0x7848, 0x3855, 0x3950, + 0x585c, 0x3434, 0x3b2e, 0x3e67, 0x4175, 0x3974, 0x585b, 0x3d23, + 0x3c41, 0x3e22, 0x362f, 0x4e71, 0x512b, 0x4a24, 0x404d, 0x4a46, + 0x5b3d, 0x4078, 0x4830, 0x5850, 0x3b63, 0x5851, 0x4778, 0x502d, + 0x7827, 0x5847, 0x325e, 0x5161, 0x4077, 0x5849, 0x324e, 0x3454, + 0x7923, 0x786b, 0x7878, 0x6161, 0x5f43, 0x5431, 0x5f42, 0x4e4a, + 0x4674, 0x5146, 0x4925, 0x4747, 0x3525, 0x5334, 0x473a, 0x5844, + 0x4270, 0x4e58, 0x5f6f, 0x5f59, 0x4c3e, 0x6036, 0x453b, 0x5f75, + 0x3322, 0x5f69, 0x3b29, 0x5f6b, 0x5025, 0x5f34, 0x5f58, 0x5f3c, + 0x7830, 0x5f50, 0x5f55, 0x5f66, 0x5f5c, 0x6048, 0x5f60, 0x4567, + 0x3656, 0x782b, 0x5f4c, 0x4f45, 0x5f62, 0x6060, 0x4476, 0x5f3f, + 0x417c, 0x7875, 0x6037, 0x514f, 0x6053, 0x5f79, 0x603f, 0x4f79, + 0x5966, 0x5f3d, 0x7853, 0x786a, 0x5676, 0x6070, 0x397a, 0x4e27, + 0x5430, 0x5432, 0x4d3c, 0x4d45, 0x5b6b, 0x5634, 0x3c61, 0x5b51, + 0x5b71, 0x5b76, 0x5222, 0x3128, 0x3321, 0x3f69, 0x5c63, 0x5b6e, + 0x5b75, 0x4d3f, 0x4e6b, 0x5b77, 0x333e, 0x4735, 0x3566, 0x5739, + 0x3669, 0x3758, 0x473d, 0x3f51, 0x4c33, 0x5139, 0x405d, 0x5b5b, + 0x5b64, 0x3b35, 0x4222, 0x5b62, 0x5b5e, 0x3053, 0x5733, 0x3a78, + 0x4a59, 0x434e, 0x7849, 0x3c50, 0x5e46, 0x3661, 0x3d31, 0x375c, + 0x5731, 0x4226, 0x383e, 0x662b, 0x6634, 0x4268, 0x657d, 0x657c, + 0x6635, 0x6623, 0x662c, 0x663f, 0x3d3f, 0x664d, 0x6648, 0x6649, + 0x5324, 0x4974, 0x662e, 0x4b6f, 0x5127, 0x424f, 0x475e, 0x4a35, + 0x447e, 0x4973, 0x5034, 0x3f6d, 0x3368, 0x3126, 0x3d2b, 0x5728, + 0x5130, 0x3654, 0x353c, 0x5e4f, 0x4245, 0x3263, 0x6570, 0x4a74, + 0x3854, 0x612d, 0x353a, 0x4f3f, 0x6141, 0x385a, 0x6134, 0x6130, + 0x6150, 0x5538, 0x612b, 0x6140, 0x613d, 0x613b, 0x6149, 0x416b, + 0x536c, 0x3f79, 0x424d, 0x615b, 0x5b4f, 0x7850, 0x4b27, 0x4a26, + 0x554a, 0x3478, 0x5621, 0x6078, 0x607e, 0x607d, 0x5644, 0x3152, + 0x306f, 0x607c, 0x7835, 0x3849, 0x3c38, 0x7838, 0x3f62, 0x436d, + 0x3327, 0x6250, 0x374f, 0x3963, 0x422e, 0x4c7c, 0x6572, 0x5545, + 0x7824, 0x352f, 0x4356, 0x4d64, 0x783d, 0x3a73, 0x3e36, 0x3453, + 0x6162, 0x3834, 0x3339, 0x626a, 0x4346, 0x3671, 0x4455, 0x6322, + 0x627c, 0x302e, 0x632b, 0x626b, 0x627d, 0x6269, 0x787c, 0x4c2c, + 0x3252, 0x3251, 0x627a, 0x395f, 0x6d28, 0x6266, 0x4b4b, 0x4247, + 0x6325, 0x476c, 0x5347, 0x3139, 0x412f, 0x463e, 0x6334, 0x352c, + 0x375f, 0x4375, 0x6264, 0x4f5c, 0x5264, 0x3f52, 0x5326, 0x6278, + 0x7856, 0x6d21, 0x6d2f, 0x627b, 0x334d, 0x4041, 0x3b33, 0x507c, + 0x6263, 0x3e65, 0x4965, 0x4135, 0x6d30, 0x6a27, 0x6a28, 0x553d, + 0x4f37, 0x785e, 0x502e, 0x4961, 0x5e51, 0x7846, 0x7847, 0x4928, + 0x4255, 0x3c70, 0x516f, 0x3b53, 0x4b70, 0x3537, 0x4740, 0x5e62, + 0x5e68, 0x4227, 0x563f, 0x3f59, 0x5e52, 0x3274, 0x404c, 0x4453, + 0x5e58, 0x3527, 0x3226, 0x3827, 0x464b, 0x5e6c, 0x4c22, 0x4e4e, + 0x3c71, 0x5335, 0x4230, 0x5471, 0x3b77, 0x3532, 0x3523, 0x3e5d, + 0x3c37, 0x4462, 0x3177, 0x4521, 0x3869, 0x5640, 0x4029, 0x5f22, + 0x305a, 0x4b53, 0x5f23, 0x4845, 0x5e73, 0x446c, 0x4223, 0x4039, + 0x5e7c, 0x3273, 0x5f25, 0x4963, 0x545c, 0x424e, 0x4c2f, 0x3d41, + 0x403f, 0x305c, 0x3550, 0x4a7d, 0x4132, 0x3150, 0x6c35, 0x782f, + 0x5536, 0x364f, 0x4a31, 0x5667, 0x544e, 0x6a4d, 0x3329, 0x545d, + 0x6a4a, 0x784f, 0x6a3c, 0x4f7e, 0x6a53, 0x3f75, 0x4939, 0x4a69, + 0x3b61, 0x6b4a, 0x7868, 0x7860, 0x362b, 0x7869, 0x6845, 0x4c75, + 0x6849, 0x6847, 0x5466, 0x3630, 0x553b, 0x6862, 0x516e, 0x3763, + 0x6865, 0x5235, 0x3c2b, 0x683f, 0x4859, 0x6867, 0x3939, 0x4739, + 0x687d, 0x3d30, 0x572e, 0x4056, 0x6848, 0x4225, 0x316a, 0x4a60, + 0x5179, 0x4653, 0x4a77, 0x686b, 0x6863, 0x4745, 0x3b7a, 0x4d56, + 0x685f, 0x3535, 0x686d, 0x3c6c, 0x6949, 0x786d, 0x6944, 0x447b, + 0x3c77, 0x3971, 0x6956, 0x6935, 0x684e, 0x687c, 0x695a, 0x685d, + 0x6946, 0x6853, 0x6840, 0x6934, 0x6850, 0x6937, 0x5323, 0x4038, + 0x4828, 0x6921, 0x686f, 0x692d, 0x6879, 0x4755, 0x4537, 0x6c23, + 0x3b36, 0x4b6a, 0x407a, 0x3969, 0x3250, 0x6966, 0x6964, 0x6969, + 0x6967, 0x696b, 0x3c5f, 0x4931, 0x3f47, 0x4539, 0x6b27, 0x5531, + 0x6b2a, 0x4678, 0x4762, 0x6b32, 0x6424, 0x786f, 0x637e, 0x782d, + 0x4259, 0x5428, 0x6435, 0x4733, 0x4e50, 0x3262, 0x3b6b, 0x6425, + 0x4c40, 0x573c, 0x3935, 0x3257, 0x4370, 0x3553, 0x5c7e, 0x3b26, + 0x564d, 0x4978, 0x4231, 0x6430, 0x427a, 0x5366, 0x453d, 0x3a3a, + 0x4130, 0x5755, 0x5547, 0x3d25, 0x3d2c, 0x7223, 0x4643, 0x3d60, + 0x636d, 0x4873, 0x6431, 0x4023, 0x6464, 0x6436, 0x492c, 0x3d3d, + 0x4054, 0x3d27, 0x6445, 0x5473, 0x6d34, 0x642b, 0x356d, 0x5747, + 0x4528, 0x4a2a, 0x4522, 0x7855, 0x3c43, 0x4c4e, 0x4044, 0x4e2b, + 0x3175, 0x3d26, 0x6378, 0x424b, 0x645e, 0x6442, 0x503a, 0x6449, + 0x642f, 0x3174, 0x6372, 0x4124, 0x646c, 0x646b, 0x6371, 0x647e, + 0x7858, 0x6472, 0x403d, 0x6363, 0x645c, 0x4877, 0x406c, 0x4c32, + 0x6530, 0x4d65, 0x4250, 0x6459, 0x4e5a, 0x4c7e, 0x4e5e, 0x4136, + 0x6c3f, 0x5c64, 0x3733, 0x6c3e, 0x532b, 0x6c41, 0x4848, 0x3363, + 0x6c47, 0x3546, 0x4955, 0x4c4c, 0x6c4b, 0x532a, 0x3253, 0x5672, + 0x3b62, 0x3d7d, 0x6c62, 0x4b38, 0x422f, 0x4043, 0x4e2a, 0x522f, + 0x367b, 0x6b39, 0x4723, 0x5c7d, 0x363f, 0x4e7e, 0x5734, 0x4f41, + 0x3137, 0x534c, 0x6178, 0x616f, 0x537c, 0x4a28, 0x3640, 0x6176, + 0x617d, 0x447c, 0x3b71, 0x4154, 0x616e, 0x4a5e, 0x4c21, 0x4f57, + 0x6228, 0x6224, 0x4f56, 0x6775, 0x6762, 0x4b76, 0x5328, 0x426a, + 0x6776, 0x6761, 0x6828, 0x3b37, 0x6774, 0x476d, 0x6767, 0x682c, + 0x6836, 0x6a31, 0x327a, 0x4436, 0x314f, 0x3b2d, 0x3531, 0x336b, + 0x7921, 0x3e37, 0x7069, 0x3768, 0x5171, 0x7079, 0x342f, 0x4531, + 0x707c, 0x4146, 0x706c, 0x706f, 0x7077, 0x705d, 0x3171, 0x5177, + 0x705c, 0x5622, 0x705f, 0x712e, 0x5122, 0x7128, 0x712b, 0x5338, + 0x4c31, 0x7132, 0x3722, 0x3028, 0x7164, 0x5665, 0x5535, 0x3e21, + 0x3c60, 0x454c, 0x422c, 0x784a, 0x6d79, 0x6d6e, 0x4277, 0x7851, + 0x6d7a, 0x7857, 0x5675, 0x3d43, 0x7927, 0x6d4c, 0x6d3a, 0x7866, + 0x5162, 0x4b36, 0x6d38, 0x6d3f, 0x4837, 0x426b, 0x5729, 0x6d57, + 0x6d53, 0x6d36, 0x6d4d, 0x3421, 0x302d, 0x3f73, 0x6d42, 0x4079, + 0x372f, 0x6d43, 0x3b76, 0x6c75, 0x787a, 0x6c78, 0x4071, 0x6c72, + 0x353b, 0x7926, 0x5656, 0x3346, 0x7836, 0x7655, 0x3b7d, 0x5331, + 0x7023, 0x3b60, 0x4e48, 0x783e, 0x4e51, 0x4d5d, 0x476e, 0x7140, + 0x3f7a, 0x345c, 0x474f, 0x713c, 0x546e, 0x4754, 0x4a7a, 0x3e3a, + 0x314a, 0x7928, 0x7348, 0x3c63, 0x3d5a, 0x3736, 0x567e, 0x7366, + 0x7346, 0x4938, 0x7359, 0x7365, 0x4228, 0x736c, 0x3c72, 0x7371, + 0x736f, 0x4729, 0x4131, 0x403a, 0x336f, 0x736a, 0x7425, 0x417d, + 0x7862, 0x7356, 0x737d, 0x4069, 0x4261, 0x787b, 0x7456, 0x3760, + 0x4138, 0x7870, 0x744f, 0x5961, 0x7450, 0x6679, 0x3e40, 0x3c4d, + 0x667b, 0x543c, 0x3a6c, 0x667a, 0x667c, 0x667d, 0x4852, 0x4e46, + 0x4449, 0x4526, 0x6723, 0x343f, 0x6722, 0x4934, 0x563d, 0x3c36, + 0x3757, 0x6721, 0x3744, 0x4f38, 0x6726, 0x6725, 0x4970, 0x495c, + 0x6724, 0x6728, 0x672a, 0x6729, 0x5655, 0x5769, 0x306d, 0x672c, + 0x3d61, 0x672b, 0x3d4a, 0x4267, 0x5124, 0x3878, 0x485e, 0x4d33, + 0x4b3f, 0x672d, 0x3e78, 0x3e6e, 0x3073, 0x672f, 0x672e, 0x6730, + 0x5065, 0x4b67, 0x3e2d, 0x575b, 0x6736, 0x3371, 0x6739, 0x4f5f, + 0x6737, 0x4e2c, 0x673a, 0x3859, 0x4d78, 0x3141, 0x573a, 0x425a, + 0x6738, 0x6732, 0x5540, 0x3442, 0x6731, 0x4360, 0x6735, 0x673b, + 0x3d74, 0x6733, 0x424c, 0x5077, 0x6734, 0x673d, 0x3c6a, 0x673c, + 0x3c29, 0x3650, 0x355e, 0x6745, 0x5435, 0x6741, 0x3160, 0x3b3a, + 0x4365, 0x4e33, 0x6743, 0x673f, 0x4137, 0x6742, 0x673e, 0x7924, + 0x5d53, 0x6746, 0x674b, 0x6744, 0x6727, 0x674c, 0x383f, 0x6747, + 0x6749, 0x6748, 0x4f58, 0x4c50, 0x376c, 0x674a, 0x4b75, 0x575d, + 0x6750, 0x7863, 0x674f, 0x746a, 0x4246, 0x674e, 0x575c, 0x3c28, + 0x6752, 0x6751, 0x6755, 0x562f, 0x4949, 0x6754, 0x4846, 0x6740, + 0x497e, 0x3b66, 0x7873, 0x3c6b, 0x6756, 0x6759, 0x6758, 0x3d49, + 0x526f, 0x3c4c, 0x674d, 0x6757, 0x6753, 0x667e, 0x5078, 0x784d, + 0x3278, 0x5327, 0x7826, 0x4f4b, 0x675a, 0x4042, 0x733f, 0x786e, + 0x3723, 0x3055, 0x425e, 0x6e3c, 0x6e3f, 0x7447, 0x5265, 0x4f30, + 0x474c, 0x716f, 0x716c, 0x4a25, 0x4e45, 0x412a, 0x344f, 0x4979, + 0x4b4a, 0x7179, 0x4474, 0x5630, 0x7177, 0x4c7d, 0x417b, 0x4b60, + 0x5032, 0x6b56, 0x554d, 0x784c, 0x4976, 0x6b4b, 0x6b61, 0x4454, + 0x5657, 0x3326, 0x3774, 0x3d3a, 0x4465, 0x3528, 0x6b5a, 0x4527, + 0x4133, 0x466a, 0x6b77, 0x4030, 0x6b4d, 0x5460, 0x5975, 0x4159, + 0x4c28, 0x536b, 0x504b, 0x3e59, 0x3e49, 0x7867, 0x3255, 0x742f, + 0x3d22, 0x7435, 0x3c68, 0x515e, 0x5b3b, 0x5c51, 0x785c, 0x7832, + 0x7843, 0x572f, 0x3e25, 0x3c54, 0x5c48, 0x3b2a, 0x5c49, 0x4033, + 0x4d72, 0x5d2b, 0x5236, 0x5d26, 0x5d27, 0x4e2d, 0x7877, 0x3b67, + 0x5d3b, 0x5d2a, 0x3254, 0x5d25, 0x3847, 0x412b, 0x5c4a, 0x5c6a, + 0x7825, 0x5d64, 0x3d2f, 0x5c60, 0x5271, 0x5d21, 0x5d5b, 0x5c71, + 0x5d24, 0x5c3f, 0x5d35, 0x5c69, 0x5d5e, 0x3534, 0x4e5f, 0x4f74, + 0x5d77, 0x5c76, 0x3c3b, 0x5c3c, 0x7844, 0x473e, 0x5d32, 0x3c76, + 0x4878, 0x5c79, 0x4036, 0x5d23, 0x5255, 0x5229, 0x5e34, 0x544c, + 0x5c42, 0x302a, 0x5d7e, 0x5e2d, 0x422b, 0x4b55, 0x463b, 0x5e3a, + 0x5d7c, 0x5c57, 0x403c, 0x5d71, 0x425c, 0x3426, 0x4232, 0x3a45, + 0x3f77, 0x724c, 0x7239, 0x784b, 0x4a34, 0x4f3a, 0x4e4f, 0x724f, + 0x426c, 0x5329, 0x7277, 0x555d, 0x7265, 0x727d, 0x7231, 0x3275, + 0x724d, 0x3366, 0x7249, 0x524f, 0x532c, 0x7232, 0x7253, 0x726e, + 0x402f, 0x7243, 0x3946, 0x324f, 0x4279, 0x565a, 0x785a, 0x4a75, + 0x4e40, 0x3365, 0x563b, 0x7441, 0x406f, 0x3239, 0x5730, 0x7925, + 0x7834, 0x3f63, 0x714d, 0x715a, 0x5974, 0x7150, 0x3040, 0x714f, + 0x7149, 0x715c, 0x4d60, 0x7821, 0x3344, 0x4f2e, 0x3c7b, 0x3966, + 0x4359, 0x4a53, 0x6a68, 0x6a6a, 0x6a6c, 0x4757, 0x6a69, 0x6a6d, + 0x6a6e, 0x6a6f, 0x3e75, 0x4040, 0x6a6b, 0x395b, 0x757c, 0x7623, + 0x3425, 0x5a25, 0x3629, 0x383c, 0x3c46, 0x5136, 0x5a27, 0x4c56, + 0x5a26, 0x5135, 0x5a28, 0x467d, 0x3c47, 0x366f, 0x5148, 0x4b4f, + 0x3e77, 0x5a2b, 0x3743, 0x4968, 0x506d, 0x4b5f, 0x5a2d, 0x556f, + 0x5a2c, 0x5a2e, 0x5a2a, 0x5529, 0x5a31, 0x5a2f, 0x4640, 0x5a30, + 0x5767, 0x344a, 0x5a3c, 0x512f, 0x5268, 0x4a54, 0x4a2b, 0x326f, + 0x5a38, 0x396e, 0x5a39, 0x5a35, 0x3b30, 0x3843, 0x4f6a, 0x5a37, + 0x5a36, 0x5a34, 0x5a33, 0x566f, 0x5a32, 0x3f64, 0x484f, 0x5a3f, + 0x5a40, 0x352e, 0x5355, 0x5a3d, 0x536f, 0x334f, 0x3d6b, 0x4e5c, + 0x4e73, 0x5a3e, 0x4b50, 0x3b65, 0x4b35, 0x4b2d, 0x3f4e, 0x5a47, + 0x374c, 0x526a, 0x3577, 0x5a46, 0x573b, 0x4c38, 0x5a43, 0x476b, + 0x5a3a, 0x5a41, 0x5a42, 0x4142, 0x425b, 0x5a45, 0x5a44, 0x357d, + 0x5a52, 0x5a3b, 0x5a4c, 0x5a50, 0x5033, 0x5a49, 0x5a4d, 0x5a51, + 0x3b64, 0x5a4f, 0x5a48, 0x376d, 0x566e, 0x5168, 0x5a4e, 0x4535, + 0x4431, 0x5a4b, 0x4e3d, 0x4c5c, 0x565f, 0x3b51, 0x4355, 0x5a57, + 0x5a4a, 0x5a55, 0x3079, 0x472b, 0x5a56, 0x3d32, 0x503b, 0x5225, + 0x5a53, 0x5a58, 0x437d, 0x5a59, 0x5a29, 0x3d77, 0x4321, 0x5624, + 0x5a5c, 0x3c25, 0x5a5a, 0x4a36, 0x5a5b, 0x4c37, 0x4657, 0x5a5e, + 0x526b, 0x5269, 0x4734, 0x3b24, 0x537e, 0x3641, 0x3164, 0x7645, + 0x3277, 0x4843, 0x403e, 0x5a5f, 0x5a54, 0x5a5d, 0x4671, 0x3761, + 0x3134, 0x556a, 0x383a, 0x3246, 0x3931, 0x4636, 0x3b75, 0x3737, + 0x4c30, 0x3961, 0x5470, 0x567c, 0x6a5b, 0x6a5f, 0x3721, 0x3973, + 0x3161, 0x4272, 0x347b, 0x6a5c, 0x3751, 0x4c79, 0x6a5d, 0x4333, + 0x3a58, 0x6a5a, 0x4238, 0x415e, 0x3b5f, 0x6a60, 0x574a, 0x3c56, + 0x5474, 0x6a62, 0x495e, 0x3176, 0x6a64, 0x6a63, 0x344d, 0x494d, + 0x4562, 0x6259, 0x4f4d, 0x4274, 0x3c7a, 0x3833, 0x6a66, 0x564a, + 0x6a65, 0x554b, 0x3644, 0x4035, 0x572c, 0x6a67, 0x393a, 0x487c, + 0x5853, 0x6a5e, 0x5738, 0x5479, 0x545e, 0x584d, 0x4944, 0x532e, + 0x6a61, 0x4a6a, 0x3853, 0x545f, 0x384f, 0x5554, 0x4777, 0x7475, + 0x3c79, 0x533b, 0x7544, 0x754f, 0x7567, 0x754e, 0x753b, 0x336c, + 0x7552, 0x543e, 0x755c, 0x7548, 0x7559, 0x7551, 0x7566, 0x345a, + 0x7572, 0x756f, 0x477b, 0x3335, 0x547e, 0x396c, 0x3e7c, 0x5079, + 0x696d, 0x696e, 0x486d, 0x6975, 0x6974, 0x696f, 0x5661, 0x6972, + 0x6977, 0x6970, 0x6973, 0x6978, 0x3d4f, 0x697b, 0x697a, 0x5458, + 0x6979, 0x697c, 0x3828, 0x4761, 0x413e, 0x6a22, 0x3b54, 0x697e, + 0x6a21, 0x3975, 0x697d, 0x3132, 0x4256, 0x3c2d, 0x6a23, 0x4a64, + 0x3778, 0x5537, 0x535f, 0x6c31, 0x4f3d, 0x542f, 0x6a24, 0x572a, + 0x555e, 0x3d4e, 0x6a25, 0x3a64, 0x604e, 0x6976, 0x6971, 0x306c, + 0x3447, 0x3168, 0x3167, 0x4529, 0x783c, 0x6549, 0x5562, 0x412c, + 0x3d78, 0x544b, 0x397d, 0x346f, 0x4e25, 0x5137, 0x355d, 0x5436, + 0x4a4a, 0x3359, 0x4728, 0x5121, 0x5245, 0x4149, 0x4275, 0x3b39, + 0x6547, 0x315f, 0x425f, 0x654e, 0x7879, 0x5b23, 0x534a, 0x5b29, + 0x4f67, 0x575e, 0x5a79, 0x5447, 0x354b, 0x5623, 0x415a, 0x3526, + 0x5a7e, 0x5b26, 0x5a77, 0x5b2a, 0x544d, 0x3373, 0x523d, 0x3d34, + 0x4470, 0x5046, 0x7527, 0x7526, 0x4a4d, 0x784e, 0x6e44, 0x6e45, + 0x6e46, 0x6e49, 0x6e48, 0x3624, 0x6e47, 0x556b, 0x3576, 0x6e4c, + 0x6e4b, 0x3730, 0x6e4e, 0x6e4a, 0x6e4f, 0x4725, 0x6e59, 0x6e55, + 0x6e57, 0x6e50, 0x4446, 0x365b, 0x3933, 0x6e54, 0x6e53, 0x332e, + 0x4525, 0x3e7b, 0x3846, 0x6e58, 0x6e51, 0x6e56, 0x6e6a, 0x6e66, + 0x6e5d, 0x4165, 0x6e5c, 0x6e60, 0x6e6b, 0x6e5a, 0x6e5f, 0x534b, + 0x6e64, 0x3c58, 0x6e52, 0x6e68, 0x6e67, 0x6e69, 0x322c, 0x6e5e, + 0x472f, 0x432d, 0x4726, 0x6e61, 0x3227, 0x6e5b, 0x6e62, 0x6e63, + 0x3d42, 0x6e6f, 0x3875, 0x6e7e, 0x5278, 0x6f25, 0x4d2d, 0x4f33, + 0x6e7d, 0x6e79, 0x437a, 0x6f22, 0x4f4e, 0x6e6e, 0x6f28, 0x523f, + 0x6e77, 0x6f27, 0x6e7b, 0x6e70, 0x6f24, 0x6e6d, 0x6e76, 0x4f7a, + 0x5062, 0x4c60, 0x6f31, 0x4241, 0x6f36, 0x503f, 0x3135, 0x6e7a, + 0x6e72, 0x3766, 0x6f32, 0x6f37, 0x6e74, 0x337a, 0x6f2d, 0x6f38, + 0x6f30, 0x464c, 0x4871, 0x6e71, 0x6f2f, 0x6f2e, 0x6f2b, 0x6f33, + 0x3e62, 0x3856, 0x6f3e, 0x6f3a, 0x6f42, 0x6f43, 0x5736, 0x6f39, + 0x6f3f, 0x3438, 0x6f45, 0x6f23, 0x6f3c, 0x6f44, 0x3627, 0x472e, + 0x3d75, 0x432a, 0x4e7d, 0x6f40, 0x346d, 0x423c, 0x434c, 0x7823, + 0x6f2a, 0x6f3d, 0x4f47, 0x6f41, 0x6e4d, 0x6f47, 0x3978, 0x3646, + 0x6f49, 0x5521, 0x364d, 0x6f4a, 0x6f46, 0x6f3b, 0x4742, 0x6f4c, + 0x3c7c, 0x6f48, 0x5560, 0x6f71, 0x433e, 0x6f4d, 0x6f51, 0x3077, + 0x4b78, 0x6f53, 0x4e59, 0x5d76, 0x6f56, 0x6e78, 0x6f21, 0x6f4b, + 0x3864, 0x5572, 0x6f57, 0x4478, 0x6f58, 0x6f54, 0x6f55, 0x6f5f, + 0x6f60, 0x4134, 0x6f52, 0x6f5d, 0x6f61, 0x6f2c, 0x6f4f, 0x6f5b, + 0x6f5c, 0x6f5e, 0x3279, 0x3e35, 0x6f5a, 0x6f4e, 0x7649, 0x6e7c, + 0x6f64, 0x6f6a, 0x6e73, 0x6f26, 0x414d, 0x6f29, 0x6f66, 0x6f62, + 0x5653, 0x6f6b, 0x6f63, 0x6f68, 0x6f34, 0x6f35, 0x6f50, 0x412d, + 0x6f6d, 0x4058, 0x4c7a, 0x6e6c, 0x6e75, 0x6f6e, 0x567d, 0x6f6c, + 0x6f59, 0x3c78, 0x6f6f, 0x6e65, 0x6f70, 0x6f65, 0x6f67, 0x543f, + 0x4f62, 0x4477, 0x6f69, 0x4260, 0x576a, 0x7647, 0x5464, 0x3324, + 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x3f2a, 0x634a, 0x6348, + 0x4872, 0x4f50, 0x3c64, 0x6349, 0x5522, 0x3a52, 0x3873, 0x7839, + 0x3727, 0x396b, 0x4376, 0x634d, 0x634f, 0x634c, 0x5444, 0x6351, + 0x514b, 0x5156, 0x6355, 0x6354, 0x6350, 0x6353, 0x6356, 0x7822, + 0x6347, 0x402b, 0x6357, 0x403b, 0x6359, 0x6358, 0x635a, 0x3433, + 0x3958, 0x635b, 0x327b, 0x785b, 0x634b, 0x5a6a, 0x4942, 0x5573, + 0x5275, 0x3342, 0x423d, 0x5174, 0x3653, 0x3d57, 0x5449, 0x3c4a, + 0x4b66, 0x4f55, 0x527e, 0x4224, 0x4125, 0x7922, 0x4b64, 0x4b2b, + 0x337b, 0x5453, 0x406b, 0x4451, 0x5446, 0x3567, 0x4e6d, 0x762b, + 0x7628, 0x7630, 0x4169, 0x7626, 0x584c, 0x392e, 0x7864, 0x7733, + 0x7732, 0x7861, 0x7735, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x683a, + 0x6839, 0x4f6c, 0x5233, 0x3625, 0x476a, 0x4f6e, 0x4b33, 0x717c, + 0x506b, 0x676f, 0x4b4c, 0x717d, 0x717e, 0x5424, 0x4d67, 0x3064, + 0x3659, 0x4644, 0x416c, 0x7222, 0x7221, 0x5243, 0x7224, 0x4d37, + 0x3c55, 0x7225, 0x3e31, 0x4635, 0x4d47, 0x3f45, 0x4c62, 0x366e, + 0x7226, 0x7227, 0x5155, 0x5438, 0x722a, 0x355f, 0x4060, 0x7229, + 0x722b, 0x394b, 0x327c, 0x722c, 0x4f54, 0x722d, 0x422d, 0x7228, + 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x786c, 0x7837, 0x6c2b, 0x6c2c, + 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x623b, 0x783f, 0x623d, 0x623f, + 0x6240, 0x6241, 0x3739, 0x527b, 0x6242, 0x4b47, 0x3125, 0x4a4e, + 0x3d48, 0x317d, 0x6243, 0x5178, 0x367c, 0x6244, 0x4459, 0x3676, + 0x5360, 0x6246, 0x3d24, 0x4f5a, 0x395d, 0x623c, 0x6247, 0x623e, + 0x4173, 0x6248, 0x6249, 0x4278, 0x624a, 0x624b, 0x624c, 0x4021, + 0x624d, 0x3c22, 0x4844, 0x774f, 0x7750, 0x3276, 0x624e, 0x426d, + 0x5426, 0x376b, 0x4d54, 0x335b, 0x5131, 0x3235, 0x5724, 0x6665, + 0x3e54, 0x6660, 0x3c5d, 0x6666, 0x6662, 0x4a3b, 0x4d55, 0x6661, + 0x426e, 0x6669, 0x3a27, 0x4266, 0x3f25, 0x3352, 0x666d, 0x666c, + 0x466f, 0x666b, 0x6670, 0x462d, 0x6539, 0x666f, 0x6672, 0x4c5a, + 0x6663, 0x4927, 0x6673, 0x4262, 0x5d6b, 0x6671, 0x666e, 0x6674, + 0x6675, 0x477d, 0x6668, 0x6667, 0x6676, 0x3d3e, 0x5169, 0x3e2a, + 0x6664, 0x5668, 0x423f, 0x6678, 0x6677, 0x666a, 0x3039, 0x7743, + 0x787e, 0x4c65, 0x7746, 0x7745, 0x7831, 0x4b49, 0x783a, 0x7876, + 0x775e, 0x3637, 0x4456, 0x6352, 0x634e, 0x5374, 0x774b, 0x774a, + 0x5363, 0x4233, 0x7650, 0x764f, 0x7651, 0x7652, 0x7653, 0x7658, + 0x312b, 0x7656, 0x765a, 0x765f, 0x765c, 0x765b, 0x765e, 0x7659, + 0x4f4a, 0x7667, 0x7661, 0x7669, 0x4070, 0x7668, 0x7676, 0x766b, + 0x7674, 0x7671, 0x766e, 0x7672, 0x766f, 0x7670, 0x3e28, 0x766c, + 0x766d, 0x7673, 0x7675, 0x766a, 0x767d, 0x7678, 0x767c, 0x767a, + 0x7679, 0x767b, 0x487a, 0x767e, 0x7665, 0x7724, 0x7723, 0x7725, + 0x7722, 0x7663, 0x7721, 0x7726, 0x772a, 0x7666, 0x7664, 0x7729, + 0x7727, 0x772b, 0x7728, 0x316e, 0x772e, 0x772d, 0x772c, 0x415b, + 0x7660, 0x7677, 0x7657, 0x772f, 0x765d, 0x7654, 0x7662, 0x4471, + 0x702f, 0x596c, 0x376f, 0x4379, 0x7030, 0x7032, 0x7031, 0x513b, + 0x4d52, 0x5427, 0x7036, 0x7037, 0x7033, 0x516c, 0x513c, 0x7039, + 0x703b, 0x3a68, 0x386b, 0x703c, 0x3e69, 0x7041, 0x703e, 0x7043, + 0x366c, 0x7040, 0x7044, 0x7046, 0x4574, 0x7047, 0x4835, 0x7034, + 0x7048, 0x7045, 0x7049, 0x704a, 0x704c, 0x704d, 0x5d3a, 0x3a57, + 0x773d, 0x704f, 0x704b, 0x704e, 0x3c26, 0x7051, 0x4538, 0x703a, + 0x7052, 0x7038, 0x7054, 0x7053, 0x7055, 0x7042, 0x7056, 0x5325, + 0x7058, 0x7057, 0x7035, 0x7050, 0x7059, 0x703f, 0x703d, 0x7852, + 0x7874, 0x753a, 0x3c6f, 0x514e, 0x4076, 0x4273, 0x746f, 0x7865, + 0x7859, 0x4334, 0x5964, 0x3563, 0x3533, 0x7775, 0x7854, 0x7772, + 0x763c, 0x763d, 0x763e, 0x782e, 0x466b, 0x552b, 0x6c34, 0x335d, + 0x7633, 0x7635, 0x7637, 0x7634, 0x7636, 0x4164, 0x782a, 0x7638, + 0x763a, 0x7639, 0x4823, 0x763b, 0x417a, 0x4553, 0x3928, 0x6d68, + 0x396a, 0x2672, 0x2674, 0x2675, 0x2660, 0x2661, 0x2670, 0x2671, + 0x2662, 0x2663, 0x266e, 0x266f, 0x2666, 0x2667, 0x2664, 0x2665, + 0x2668, 0x2669, 0x266a, 0x266b, +}; + +static const Summary16 gb12345ext_uni2indx_page01[23] = { + /* 0x0100 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0110 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0200 }, + /* 0x0200 */ + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0002 }, { 4, 0x0002 }, +}; +static const Summary16 gb12345ext_uni2indx_page1e[4] = { + /* 0x1e00 */ + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x8000 }, +}; +static const Summary16 gb12345ext_uni2indx_page22[3] = { + /* 0x2200 */ + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0020 }, +}; +static const Summary16 gb12345ext_uni2indx_page4e[1306] = { + /* 0x4e00 */ + { 7, 0x0080 }, { 8, 0x0002 }, { 9, 0x0000 }, { 9, 0x0001 }, + { 10, 0x0100 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0004 }, { 12, 0x4002 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0040 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0080 }, + /* 0x4f00 */ + { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, + { 16, 0x0000 }, { 16, 0x0200 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0040 }, { 18, 0x0040 }, { 19, 0x0000 }, { 19, 0x0000 }, + { 19, 0x0004 }, { 20, 0x0000 }, { 20, 0x0001 }, { 21, 0x0000 }, + /* 0x5000 */ + { 21, 0x0a41 }, { 25, 0x0002 }, { 26, 0x0800 }, { 27, 0x0000 }, + { 27, 0x0200 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0030 }, + { 30, 0x0000 }, { 30, 0x0340 }, { 33, 0x2004 }, { 35, 0x40b8 }, + { 40, 0x0224 }, { 43, 0x4022 }, { 46, 0x0120 }, { 48, 0x0200 }, + /* 0x5100 */ + { 49, 0x0315 }, { 54, 0x8131 }, { 59, 0x0400 }, { 60, 0x1c84 }, + { 65, 0x0000 }, { 65, 0x0404 }, { 67, 0x0200 }, { 68, 0x0000 }, + { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0004 }, + { 69, 0x2040 }, { 71, 0x0000 }, { 71, 0x2001 }, { 73, 0x0002 }, + /* 0x5200 */ + { 74, 0x0000 }, { 74, 0x0004 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0890 }, { 78, 0x0800 }, { 79, 0x4000 }, { 80, 0x0030 }, + { 82, 0x3688 }, { 88, 0x0002 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0002 }, { 90, 0x6a20 }, { 95, 0x0004 }, { 96, 0x0122 }, + /* 0x5300 */ + { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0xa000 }, { 101, 0x0002 }, + { 102, 0x0001 }, { 103, 0x0010 }, { 104, 0x0000 }, { 104, 0x0000 }, + { 104, 0x0004 }, { 105, 0x0200 }, { 106, 0x2001 }, { 108, 0x0014 }, + { 110, 0x0008 }, { 111, 0x0000 }, { 111, 0x0404 }, { 113, 0x0041 }, + /* 0x5400 */ + { 115, 0x4000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x1000 }, + { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0002 }, { 118, 0x0000 }, + /* 0x5500 */ + { 118, 0x0010 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, + { 119, 0x8000 }, { 120, 0x4008 }, { 122, 0x0000 }, { 122, 0x0000 }, + { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x5400 }, { 125, 0x0004 }, + { 126, 0x40c0 }, { 129, 0x0400 }, { 130, 0x0200 }, { 131, 0x0040 }, + /* 0x5600 */ + { 132, 0x2040 }, { 134, 0x10d0 }, { 138, 0xc200 }, { 141, 0x0121 }, + { 144, 0x0002 }, { 145, 0x2000 }, { 146, 0x8061 }, { 150, 0x0314 }, + { 154, 0x1081 }, { 157, 0x0220 }, { 159, 0x4140 }, { 162, 0x0058 }, + { 165, 0x1327 }, { 172, 0x0002 }, { 173, 0x0000 }, { 173, 0x0000 }, + /* 0x5700 */ + { 173, 0x2880 }, { 176, 0x014c }, { 180, 0x0000 }, { 180, 0x0000 }, + { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, + { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, + { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0002 }, { 181, 0x0080 }, + /* 0x5800 */ + { 182, 0x0420 }, { 184, 0x2040 }, { 186, 0x8000 }, { 187, 0x0012 }, + { 189, 0x8c00 }, { 192, 0x0084 }, { 194, 0x0014 }, { 196, 0x0220 }, + { 198, 0x0400 }, { 199, 0x1000 }, { 200, 0x4000 }, { 201, 0x4808 }, + { 204, 0x0080 }, { 205, 0xc708 }, { 211, 0x8205 }, { 215, 0x2400 }, + /* 0x5900 */ + { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0004 }, { 218, 0x4100 }, + { 220, 0x0000 }, { 220, 0x0000 }, { 220, 0x5600 }, { 224, 0x0000 }, + { 224, 0x0000 }, { 224, 0x2000 }, { 225, 0x0000 }, { 225, 0x0000 }, + { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, + /* 0x5a00 */ + { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, + { 225, 0x0002 }, { 226, 0x0000 }, { 226, 0x2040 }, { 228, 0x0000 }, + { 228, 0x0000 }, { 228, 0x0000 }, { 228, 0x0080 }, { 229, 0x2000 }, + { 230, 0x0000 }, { 230, 0x0080 }, { 231, 0x0000 }, { 231, 0x0820 }, + /* 0x5b00 */ + { 233, 0x1901 }, { 237, 0x0200 }, { 238, 0x0402 }, { 240, 0x0101 }, + { 242, 0x1000 }, { 243, 0x0000 }, { 243, 0x0800 }, { 244, 0x8100 }, + { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, + { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x1ac4 }, { 252, 0x0060 }, + /* 0x5c00 */ + { 254, 0x6980 }, { 259, 0x0000 }, { 259, 0x0000 }, { 259, 0x0080 }, + { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x1114 }, { 264, 0x0000 }, + { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0002 }, { 265, 0x0000 }, + { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x2050 }, + /* 0x5d00 */ + { 268, 0x2000 }, { 269, 0x0080 }, { 270, 0x1000 }, { 271, 0x0000 }, + { 271, 0x0000 }, { 271, 0x0001 }, { 272, 0x0000 }, { 272, 0x0000 }, + { 272, 0x0092 }, { 275, 0x0080 }, { 276, 0x0081 }, { 278, 0x1500 }, + { 281, 0x0800 }, { 282, 0x0014 }, { 284, 0x0000 }, { 284, 0x0001 }, + /* 0x5e00 */ + { 285, 0x0000 }, { 285, 0x0100 }, { 286, 0x0820 }, { 288, 0x0048 }, + { 290, 0x0009 }, { 292, 0x8180 }, { 295, 0x1808 }, { 298, 0xc204 }, + { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0800 }, { 303, 0x0000 }, + { 303, 0x0000 }, { 303, 0x8000 }, { 304, 0x100f }, { 309, 0x0008 }, + /* 0x5f00 */ + { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0028 }, + { 312, 0x5140 }, { 316, 0x0200 }, { 317, 0x0000 }, { 317, 0x0000 }, + { 317, 0x1000 }, { 318, 0x4002 }, { 320, 0x0201 }, { 322, 0x0200 }, + { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, + /* 0x6000 */ + { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, + { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, + { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0060 }, + { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0002 }, { 326, 0x0806 }, + /* 0x6100 */ + { 329, 0x0000 }, { 329, 0x1800 }, { 331, 0x0000 }, { 331, 0xc090 }, + { 335, 0x0800 }, { 336, 0x8500 }, { 339, 0x4c18 }, { 344, 0x0048 }, + { 346, 0x0404 }, { 348, 0x0407 }, { 352, 0x4810 }, { 355, 0x0044 }, + { 357, 0x1280 }, { 360, 0xc000 }, { 362, 0x0108 }, { 364, 0x55c4 }, + /* 0x6200 */ + { 371, 0x0081 }, { 373, 0x0010 }, { 374, 0x0080 }, { 375, 0x0005 }, + { 377, 0x0000 }, { 377, 0x0002 }, { 378, 0x0000 }, { 378, 0x0000 }, + { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, + { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, + /* 0x6300 */ + { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x4000 }, + { 379, 0x0000 }, { 379, 0x0000 }, { 379, 0x4900 }, { 382, 0x0004 }, + { 383, 0x0018 }, { 385, 0x0000 }, { 385, 0x0000 }, { 385, 0x0000 }, + { 385, 0x0001 }, { 386, 0x0400 }, { 387, 0x4000 }, { 388, 0x0000 }, + /* 0x6400 */ + { 388, 0x2000 }, { 389, 0x0080 }, { 390, 0x0000 }, { 390, 0x0040 }, + { 391, 0x0000 }, { 391, 0x9002 }, { 394, 0x8000 }, { 395, 0x0848 }, + { 398, 0x0100 }, { 399, 0x8008 }, { 401, 0x0828 }, { 404, 0xc80c }, + { 409, 0x0c92 }, { 414, 0x0410 }, { 416, 0x9001 }, { 419, 0x5c97 }, + /* 0x6500 */ + { 428, 0x8050 }, { 431, 0x2a50 }, { 436, 0x141c }, { 441, 0x0000 }, + { 441, 0x0000 }, { 441, 0x0080 }, { 442, 0x0000 }, { 442, 0x0120 }, + { 444, 0x000c }, { 446, 0x00a0 }, { 448, 0x1000 }, { 449, 0x0080 }, + { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, + /* 0x6600 */ + { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, + { 450, 0x0004 }, { 451, 0x2000 }, { 452, 0x0000 }, { 452, 0x0000 }, + { 452, 0x0300 }, { 454, 0x0000 }, { 454, 0x0804 }, { 456, 0x0000 }, + { 456, 0x02d0 }, { 460, 0x0040 }, { 461, 0x1001 }, { 463, 0x0100 }, + /* 0x6700 */ + { 464, 0x0008 }, { 465, 0x0000 }, { 465, 0x8080 }, { 467, 0x0010 }, + { 468, 0x0000 }, { 468, 0x0000 }, { 468, 0x0000 }, { 468, 0x4002 }, + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + /* 0x6800 */ + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + { 470, 0x0000 }, { 470, 0xa100 }, { 473, 0x0000 }, { 473, 0x0000 }, + { 473, 0x0000 }, { 473, 0x80c0 }, { 476, 0x0080 }, { 477, 0x0000 }, + /* 0x6900 */ + { 477, 0x8000 }, { 478, 0x0000 }, { 478, 0x0000 }, { 478, 0x0000 }, + { 478, 0x0400 }, { 479, 0x0008 }, { 480, 0x2100 }, { 482, 0x0020 }, + { 483, 0x0000 }, { 483, 0x0000 }, { 483, 0x4400 }, { 485, 0x8000 }, + { 486, 0x2800 }, { 488, 0x0000 }, { 488, 0x0080 }, { 489, 0x0008 }, + /* 0x6a00 */ + { 490, 0x0026 }, { 493, 0x4208 }, { 496, 0x0008 }, { 497, 0x0700 }, + { 500, 0x0900 }, { 502, 0x8000 }, { 503, 0x0004 }, { 504, 0x0000 }, + { 504, 0x0200 }, { 505, 0x1010 }, { 507, 0x800c }, { 510, 0x0908 }, + { 513, 0x0008 }, { 514, 0xec08 }, { 520, 0x1580 }, { 524, 0x0908 }, + /* 0x6b00 */ + { 527, 0x8410 }, { 530, 0x4044 }, { 533, 0x0000 }, { 533, 0x2000 }, + { 534, 0x0000 }, { 534, 0x8001 }, { 536, 0x0002 }, { 537, 0x0184 }, + { 540, 0x0000 }, { 540, 0x4100 }, { 542, 0xc810 }, { 546, 0x0c04 }, + { 549, 0x0040 }, { 550, 0x0000 }, { 550, 0x0000 }, { 550, 0x8000 }, + /* 0x6c00 */ + { 551, 0x1100 }, { 553, 0x0000 }, { 553, 0x1808 }, { 556, 0x0000 }, + { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, + { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, + { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, + /* 0x6d00 */ + { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, + { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0200 }, + { 557, 0x0084 }, { 559, 0x0000 }, { 559, 0x0000 }, { 559, 0x0000 }, + { 559, 0x0001 }, { 560, 0x0000 }, { 560, 0x0400 }, { 561, 0x0460 }, + /* 0x6e00 */ + { 564, 0x0000 }, { 564, 0x0000 }, { 564, 0x1040 }, { 566, 0x4000 }, + { 567, 0x0000 }, { 567, 0x4000 }, { 568, 0x8000 }, { 569, 0x0000 }, + { 569, 0x0000 }, { 569, 0x2040 }, { 571, 0x0000 }, { 571, 0x0000 }, + { 571, 0x5030 }, { 575, 0x0000 }, { 575, 0x9000 }, { 577, 0x8184 }, + /* 0x6f00 */ + { 581, 0x0002 }, { 582, 0x0400 }, { 583, 0x100c }, { 586, 0x8104 }, + { 589, 0x0002 }, { 590, 0x0212 }, { 593, 0x8010 }, { 595, 0x8081 }, + { 598, 0x00c1 }, { 601, 0x0080 }, { 602, 0x4211 }, { 606, 0x0002 }, + { 607, 0x000a }, { 609, 0x8920 }, { 613, 0x0810 }, { 615, 0x5403 }, + /* 0x7000 */ + { 620, 0x8a60 }, { 625, 0xa120 }, { 629, 0x0181 }, { 632, 0x4005 }, + { 635, 0x0018 }, { 637, 0x2122 }, { 641, 0x0098 }, { 644, 0x0000 }, + { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x0000 }, + { 644, 0x8000 }, { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0010 }, + /* 0x7100 */ + { 646, 0x0000 }, { 646, 0x0000 }, { 646, 0x0002 }, { 647, 0x0000 }, + { 647, 0x0200 }, { 648, 0x0004 }, { 649, 0x1204 }, { 652, 0x0000 }, + { 652, 0x0000 }, { 652, 0x0084 }, { 654, 0x0000 }, { 654, 0x4002 }, + { 656, 0x0102 }, { 658, 0x9204 }, { 662, 0x2040 }, { 664, 0x5010 }, + /* 0x7200 */ + { 667, 0x2000 }, { 668, 0x0801 }, { 670, 0x0000 }, { 670, 0x4404 }, + { 673, 0x0000 }, { 673, 0x0100 }, { 674, 0x0000 }, { 674, 0x2000 }, + { 675, 0x0000 }, { 675, 0x0040 }, { 676, 0x0084 }, { 678, 0x0000 }, + { 678, 0x0001 }, { 679, 0x0000 }, { 679, 0x0000 }, { 679, 0x2200 }, + /* 0x7300 */ + { 681, 0x0000 }, { 681, 0x0000 }, { 681, 0x0000 }, { 681, 0x0840 }, + { 683, 0x0032 }, { 686, 0x0000 }, { 686, 0x0d00 }, { 689, 0x1da5 }, + { 697, 0x0001 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, + { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x4000 }, + /* 0x7400 */ + { 699, 0x0000 }, { 699, 0x0000 }, { 699, 0x0000 }, { 699, 0x8000 }, + { 700, 0x0800 }, { 701, 0x0000 }, { 701, 0x0608 }, { 704, 0x0000 }, + { 704, 0x0200 }, { 705, 0x0000 }, { 705, 0x0048 }, { 707, 0x2001 }, + { 709, 0x8400 }, { 711, 0x0410 }, { 713, 0x0000 }, { 713, 0x0000 }, + /* 0x7500 */ + { 713, 0x1000 }, { 714, 0x0000 }, { 714, 0x0008 }, { 715, 0x0000 }, + { 715, 0x0000 }, { 715, 0x2000 }, { 716, 0x0804 }, { 718, 0x0040 }, + { 719, 0x0080 }, { 720, 0x0000 }, { 720, 0x0000 }, { 720, 0x0000 }, + { 720, 0x0080 }, { 721, 0x0200 }, { 722, 0x0000 }, { 722, 0x0000 }, + /* 0x7600 */ + { 722, 0x2804 }, { 725, 0x4000 }, { 726, 0x0082 }, { 728, 0x0800 }, + { 729, 0x02c4 }, { 733, 0x8100 }, { 735, 0x72b4 }, { 743, 0x1007 }, + { 747, 0x0000 }, { 747, 0x0400 }, { 748, 0x0000 }, { 748, 0x0500 }, + { 750, 0x0000 }, { 750, 0x4000 }, { 751, 0x009a }, { 755, 0x0000 }, + /* 0x7700 */ + { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, + { 755, 0x8000 }, { 756, 0x4000 }, { 757, 0x0000 }, { 757, 0x0000 }, + { 757, 0x0000 }, { 757, 0x4100 }, { 759, 0x2000 }, { 760, 0x1000 }, + { 761, 0x0080 }, { 762, 0x0400 }, { 763, 0x8000 }, { 764, 0x0000 }, + /* 0x7800 */ + { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0000 }, + { 764, 0x0008 }, { 765, 0x0000 }, { 765, 0xc110 }, { 769, 0x0000 }, + { 769, 0x0000 }, { 769, 0x0000 }, { 769, 0x2200 }, { 771, 0x1500 }, + { 774, 0x0000 }, { 774, 0x0400 }, { 775, 0x8088 }, { 778, 0x2000 }, + /* 0x7900 */ + { 779, 0x4000 }, { 780, 0x0200 }, { 781, 0x1c40 }, { 785, 0x0002 }, + { 786, 0x0000 }, { 786, 0x0000 }, { 786, 0x0000 }, { 786, 0x0000 }, + { 786, 0x6000 }, { 788, 0x0000 }, { 788, 0x4440 }, { 791, 0x0003 }, + { 793, 0x2000 }, { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x0000 }, + /* 0x7a00 */ + { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x4000 }, { 795, 0x0002 }, + { 796, 0x7001 }, { 800, 0x0000 }, { 800, 0x0a06 }, { 804, 0x0000 }, + { 804, 0x0000 }, { 804, 0x0000 }, { 804, 0x4600 }, { 807, 0x0440 }, + { 809, 0x05b0 }, { 814, 0x0000 }, { 814, 0x0400 }, { 815, 0x0040 }, + /* 0x7b00 */ + { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, + { 816, 0x0040 }, { 817, 0x0002 }, { 818, 0x0080 }, { 819, 0x0000 }, + { 819, 0x0800 }, { 820, 0x0000 }, { 820, 0x0000 }, { 820, 0x0000 }, + { 820, 0x0a11 }, { 824, 0x0000 }, { 824, 0x0210 }, { 826, 0x0008 }, + /* 0x7c00 */ + { 827, 0x2001 }, { 829, 0x4000 }, { 830, 0x080a }, { 833, 0x6000 }, + { 835, 0x1008 }, { 837, 0x9000 }, { 839, 0x5611 }, { 845, 0x0004 }, + { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x0000 }, + { 846, 0x0000 }, { 846, 0x6000 }, { 848, 0x0080 }, { 849, 0x4255 }, + /* 0x7d00 */ + { 855, 0x2bf5 }, { 865, 0x1eb9 }, { 874, 0x0002 }, { 875, 0x960f }, + { 883, 0x4055 }, { 888, 0x6001 }, { 891, 0x0146 }, { 895, 0x024e }, + { 900, 0x834a }, { 906, 0x5008 }, { 909, 0x380c }, { 914, 0xef1f }, + { 926, 0x0c90 }, { 930, 0x6396 }, { 938, 0x934b }, { 946, 0x0a56 }, + /* 0x7e00 */ + { 952, 0x0f00 }, { 956, 0xe803 }, { 962, 0x6888 }, { 967, 0x62f6 }, + { 976, 0x0060 }, { 978, 0x4434 }, { 983, 0xee04 }, { 990, 0x7209 }, + { 996, 0xb500 }, { 1001, 0x1158 }, { 1006, 0x0000 }, { 1006, 0x0000 }, + { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, + /* 0x7f00 */ + { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, + { 1006, 0x5000 }, { 1008, 0x0000 }, { 1008, 0x0000 }, { 1008, 0x0081 }, + { 1010, 0x0160 }, { 1013, 0x0000 }, { 1013, 0x0220 }, { 1015, 0x0000 }, + { 1015, 0x0000 }, { 1015, 0x0004 }, { 1016, 0x0000 }, { 1016, 0x0200 }, + /* 0x8000 */ + { 1017, 0x0000 }, { 1017, 0x0000 }, { 1017, 0x5000 }, { 1019, 0x0000 }, + { 1019, 0x0000 }, { 1019, 0x4040 }, { 1021, 0x8000 }, { 1022, 0x62ed }, + { 1031, 0x0020 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, + { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, + /* 0x8100 */ + { 1032, 0x0020 }, { 1033, 0x0800 }, { 1034, 0x0000 }, { 1034, 0x0200 }, + { 1035, 0x4400 }, { 1037, 0x0040 }, { 1038, 0x0842 }, { 1041, 0x0100 }, + { 1042, 0x0000 }, { 1042, 0x0400 }, { 1043, 0x0201 }, { 1045, 0xe000 }, + { 1048, 0xa200 }, { 1051, 0x8500 }, { 1054, 0x0101 }, { 1056, 0x0400 }, + /* 0x8200 */ + { 1057, 0x2780 }, { 1062, 0x0000 }, { 1062, 0x0000 }, { 1062, 0x0000 }, + { 1062, 0x0000 }, { 1062, 0x0200 }, { 1063, 0x0850 }, { 1066, 0x0082 }, + { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0800 }, + { 1069, 0x0000 }, { 1069, 0x0000 }, { 1069, 0x0080 }, { 1070, 0x0200 }, + /* 0x8300 */ + { 1071, 0x0008 }, { 1072, 0x0000 }, { 1072, 0x0000 }, { 1072, 0x0000 }, + { 1072, 0x0000 }, { 1072, 0x0001 }, { 1073, 0x0000 }, { 1073, 0x0000 }, + { 1073, 0x0400 }, { 1074, 0x0040 }, { 1075, 0x0084 }, { 1077, 0x0000 }, + { 1077, 0x0000 }, { 1077, 0x0000 }, { 1077, 0x8000 }, { 1078, 0x0000 }, + /* 0x8400 */ + { 1078, 0x0480 }, { 1080, 0x0000 }, { 1080, 0x1000 }, { 1081, 0x0020 }, + { 1082, 0x0200 }, { 1083, 0x0004 }, { 1084, 0x8050 }, { 1087, 0x0080 }, + { 1088, 0x0000 }, { 1088, 0x0018 }, { 1090, 0x0000 }, { 1090, 0x1000 }, + { 1091, 0x0801 }, { 1093, 0x0000 }, { 1093, 0xc000 }, { 1095, 0x2000 }, + /* 0x8500 */ + { 1096, 0x0000 }, { 1096, 0x4010 }, { 1098, 0x2048 }, { 1101, 0x0000 }, + { 1101, 0x4042 }, { 1104, 0x012c }, { 1108, 0x2604 }, { 1112, 0x0080 }, + { 1113, 0x1500 }, { 1116, 0x8012 }, { 1119, 0x0240 }, { 1121, 0x0400 }, + { 1122, 0x6000 }, { 1124, 0x2000 }, { 1125, 0x0420 }, { 1127, 0x0650 }, + /* 0x8600 */ + { 1131, 0x08d0 }, { 1135, 0x4400 }, { 1137, 0x2004 }, { 1139, 0x8400 }, + { 1141, 0x0000 }, { 1141, 0x9020 }, { 1144, 0x0080 }, { 1145, 0x0000 }, + { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, + { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0400 }, + /* 0x8700 */ + { 1146, 0x0040 }, { 1147, 0x0000 }, { 1147, 0x0002 }, { 1148, 0x0000 }, + { 1148, 0x0000 }, { 1148, 0x0020 }, { 1149, 0x0040 }, { 1150, 0x0100 }, + { 1151, 0x0010 }, { 1152, 0x4000 }, { 1153, 0x0004 }, { 1154, 0x0800 }, + { 1155, 0x4110 }, { 1158, 0x0000 }, { 1158, 0x9008 }, { 1161, 0x0844 }, + /* 0x8800 */ + { 1164, 0x0060 }, { 1166, 0x8003 }, { 1169, 0x0008 }, { 1170, 0x0842 }, + { 1173, 0x0440 }, { 1175, 0x2808 }, { 1178, 0x0000 }, { 1178, 0x0200 }, + { 1179, 0x0000 }, { 1179, 0x0000 }, { 1179, 0x0000 }, { 1179, 0x0000 }, + { 1179, 0x8400 }, { 1181, 0x3000 }, { 1183, 0x0000 }, { 1183, 0x2000 }, + /* 0x8900 */ + { 1184, 0x0080 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x090c }, + { 1189, 0x0080 }, { 1190, 0x2040 }, { 1192, 0x9411 }, { 1197, 0x0004 }, + { 1198, 0x8800 }, { 1200, 0x0148 }, { 1203, 0x9442 }, { 1208, 0xa484 }, + { 1213, 0x0001 }, { 1214, 0x0000 }, { 1214, 0x0000 }, { 1214, 0x0150 }, + /* 0x8a00 */ + { 1217, 0x550e }, { 1224, 0xa969 }, { 1232, 0x2428 }, { 1236, 0x0452 }, + { 1240, 0x4042 }, { 1243, 0x4935 }, { 1250, 0x7a4e }, { 1259, 0x902f }, + { 1266, 0x20f0 }, { 1271, 0x4526 }, { 1277, 0x117b }, { 1285, 0x9245 }, + { 1291, 0xaa94 }, { 1298, 0x58c6 }, { 1305, 0x68d4 }, { 1312, 0x55ca }, + /* 0x8b00 */ + { 1320, 0x4437 }, { 1327, 0x2ed1 }, { 1335, 0x3902 }, { 1340, 0x4208 }, + { 1343, 0xc200 }, { 1346, 0x1740 }, { 1351, 0x8800 }, { 1353, 0x2091 }, + { 1357, 0x4401 }, { 1360, 0x506c }, { 1366, 0x0000 }, { 1366, 0x0000 }, + { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, + /* 0x8c00 */ + { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, + { 1366, 0x0100 }, { 1367, 0x0001 }, { 1368, 0x0000 }, { 1368, 0x0000 }, + { 1368, 0x0000 }, { 1368, 0x6000 }, { 1370, 0x9f87 }, { 1380, 0xbddd }, + { 1392, 0x05bf }, { 1401, 0x542e }, { 1408, 0x3cdf }, { 1419, 0x7c10 }, + /* 0x8d00 */ + { 1425, 0xad30 }, { 1432, 0x1841 }, { 1436, 0x0000 }, { 1436, 0x0000 }, + { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, + { 1436, 0x0000 }, { 1436, 0x0220 }, { 1438, 0x0100 }, { 1439, 0x0004 }, + { 1440, 0x0000 }, { 1440, 0x0000 }, { 1440, 0x0000 }, { 1440, 0x0000 }, + /* 0x8e00 */ + { 1440, 0x0000 }, { 1440, 0x0001 }, { 1441, 0x0000 }, { 1441, 0x0010 }, + { 1442, 0x1000 }, { 1443, 0x0020 }, { 1444, 0x0008 }, { 1445, 0x0400 }, + { 1446, 0x2e00 }, { 1450, 0x040e }, { 1454, 0x0462 }, { 1458, 0x0000 }, + { 1458, 0x3c01 }, { 1463, 0x8814 }, { 1467, 0x0810 }, { 1469, 0x5f04 }, + /* 0x8f00 */ + { 1476, 0x06a8 }, { 1481, 0xf834 }, { 1489, 0x8660 }, { 1494, 0xc908 }, + { 1499, 0x6274 }, { 1506, 0x8010 }, { 1508, 0x0016 }, { 1511, 0x0000 }, + { 1511, 0x0000 }, { 1511, 0x0000 }, { 1511, 0xe040 }, { 1515, 0x0004 }, + { 1516, 0x0000 }, { 1516, 0x0000 }, { 1516, 0x0000 }, { 1516, 0x0010 }, + /* 0x9000 */ + { 1517, 0x0000 }, { 1517, 0x0220 }, { 1519, 0x0008 }, { 1520, 0x0004 }, + { 1521, 0x4800 }, { 1523, 0x5030 }, { 1527, 0x0201 }, { 1529, 0x1584 }, + { 1534, 0x8492 }, { 1539, 0x0001 }, { 1540, 0x0000 }, { 1540, 0x0000 }, + { 1540, 0x0002 }, { 1541, 0x8000 }, { 1542, 0x0000 }, { 1542, 0x0020 }, + /* 0x9100 */ + { 1543, 0x0240 }, { 1545, 0x0054 }, { 1548, 0x2080 }, { 1550, 0x0455 }, + { 1555, 0x0100 }, { 1556, 0x0000 }, { 1556, 0x0000 }, { 1556, 0x0000 }, + { 1556, 0x0000 }, { 1556, 0x1040 }, { 1558, 0x1800 }, { 1560, 0x0000 }, + { 1560, 0x182b }, { 1566, 0x23bc }, { 1574, 0x0298 }, { 1578, 0x06a0 }, + /* 0x9200 */ + { 1582, 0x6313 }, { 1589, 0x4033 }, { 1594, 0x40e8 }, { 1599, 0xe799 }, + { 1609, 0x2321 }, { 1614, 0x4ca2 }, { 1620, 0x3044 }, { 1624, 0x8d00 }, + { 1628, 0x0029 }, { 1631, 0x154a }, { 1637, 0x1f69 }, { 1646, 0x1a82 }, + { 1651, 0x90aa }, { 1657, 0xa004 }, { 1660, 0xe578 }, { 1669, 0x1143 }, + /* 0x9300 */ + { 1674, 0x01c2 }, { 1678, 0x8f25 }, { 1686, 0xc945 }, { 1693, 0x014c }, + { 1697, 0x28cb }, { 1704, 0x0910 }, { 1707, 0x1230 }, { 1711, 0x4461 }, + { 1716, 0x0494 }, { 1720, 0x0140 }, { 1722, 0x56cc }, { 1730, 0x8129 }, + { 1735, 0x3188 }, { 1740, 0xf182 }, { 1747, 0x0116 }, { 1751, 0x02a0 }, + /* 0x9400 */ + { 1754, 0x0808 }, { 1756, 0x231d }, { 1763, 0x41c1 }, { 1768, 0x852c }, + { 1774, 0x1410 }, { 1777, 0x0014 }, { 1779, 0x2029 }, { 1783, 0xf285 }, + { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, + { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, + /* 0x9500 */ + { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, + { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0080 }, + { 1792, 0xda4d }, { 1801, 0x011a }, { 1805, 0x3b3a }, { 1814, 0xfa44 }, + { 1822, 0x1d48 }, { 1828, 0x5071 }, { 1834, 0x0026 }, { 1837, 0x0000 }, + /* 0x9600 */ + { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x0000 }, + { 1837, 0x0000 }, { 1837, 0x2100 }, { 1839, 0x0008 }, { 1840, 0x2109 }, + { 1844, 0x4400 }, { 1846, 0x0820 }, { 1848, 0x0500 }, { 1850, 0x0912 }, + { 1854, 0x0000 }, { 1854, 0x1a40 }, { 1858, 0x000c }, { 1860, 0x0804 }, + /* 0x9700 */ + { 1862, 0x0000 }, { 1862, 0x0000 }, { 1862, 0x0080 }, { 1863, 0x2000 }, + { 1864, 0x0114 }, { 1867, 0x0400 }, { 1868, 0x0100 }, { 1869, 0x0000 }, + { 1869, 0x8000 }, { 1870, 0x0000 }, { 1870, 0x0040 }, { 1871, 0x2000 }, + { 1872, 0x1a48 }, { 1877, 0x5208 }, { 1881, 0x0000 }, { 1881, 0x8000 }, + /* 0x9800 */ + { 1882, 0xd5ee }, { 1893, 0x118f }, { 1900, 0x2052 }, { 1904, 0x2981 }, + { 1909, 0x7040 }, { 1913, 0x4b18 }, { 1919, 0x98a4 }, { 1925, 0x001b }, + { 1929, 0x0000 }, { 1929, 0x0000 }, { 1929, 0xc100 }, { 1932, 0x104a }, + { 1936, 0x0150 }, { 1939, 0x0800 }, { 1940, 0xae05 }, { 1947, 0x7014 }, + /* 0x9900 */ + { 1952, 0x1628 }, { 1957, 0x490e }, { 1963, 0x0102 }, { 1965, 0xd088 }, + { 1970, 0x1f28 }, { 1977, 0x5086 }, { 1982, 0x0004 }, { 1983, 0x0000 }, + { 1983, 0x0000 }, { 1983, 0x0000 }, { 1983, 0x7000 }, { 1986, 0x001a }, + { 1989, 0x0002 }, { 1990, 0xab37 }, { 2000, 0x2006 }, { 2003, 0x8002 }, + /* 0x9a00 */ + { 2005, 0xe022 }, { 2010, 0x0240 }, { 2012, 0x6800 }, { 2015, 0x41c1 }, + { 2020, 0xa43f }, { 2029, 0x8ca0 }, { 2034, 0x0434 }, { 2038, 0x0000 }, + { 2038, 0x0000 }, { 2038, 0x0000 }, { 2038, 0x8000 }, { 2039, 0x0000 }, + { 2039, 0x8000 }, { 2040, 0x0074 }, { 2044, 0x4000 }, { 2045, 0x0000 }, + /* 0x9b00 */ + { 2045, 0x2040 }, { 2047, 0x0400 }, { 2048, 0x42a4 }, { 2053, 0x0002 }, + { 2054, 0x4000 }, { 2055, 0x0500 }, { 2057, 0x8000 }, { 2058, 0x0090 }, + { 2060, 0x400a }, { 2063, 0x6407 }, { 2069, 0x6c00 }, { 2073, 0x0000 }, + { 2073, 0x0683 }, { 2078, 0x2850 }, { 2082, 0x0d96 }, { 2089, 0xa011 }, + /* 0x9c00 */ + { 2093, 0x2300 }, { 2096, 0x000d }, { 2099, 0x2329 }, { 2105, 0x4aae }, + { 2113, 0x0320 }, { 2116, 0xa1d4 }, { 2123, 0x2080 }, { 2125, 0x0500 }, + { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, + { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x1220 }, { 2130, 0x0058 }, + /* 0x9d00 */ + { 2133, 0x02c0 }, { 2136, 0xa820 }, { 2140, 0x8148 }, { 2144, 0x8801 }, + { 2147, 0x0004 }, { 2148, 0x300e }, { 2153, 0x9403 }, { 2158, 0x0004 }, + { 2159, 0x0280 }, { 2161, 0x0508 }, { 2164, 0x8220 }, { 2167, 0x1810 }, + { 2170, 0x0015 }, { 2173, 0x0688 }, { 2177, 0x8060 }, { 2180, 0x070c }, + /* 0x9e00 */ + { 2185, 0x1000 }, { 2186, 0x6c20 }, { 2191, 0x0000 }, { 2191, 0x0000 }, + { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x3620 }, + { 2196, 0x0000 }, { 2196, 0x0080 }, { 2197, 0x8220 }, { 2200, 0x2020 }, + { 2202, 0x1000 }, { 2203, 0x4000 }, { 2204, 0x0100 }, { 2205, 0xa094 }, + /* 0x9f00 */ + { 2210, 0x0200 }, { 2211, 0x0020 }, { 2212, 0x0000 }, { 2212, 0x0000 }, + { 2212, 0x8c00 }, { 2215, 0x9214 }, { 2220, 0x144b }, { 2226, 0x0084 }, + { 2228, 0x2000 }, { 2229, 0x1031 }, +}; +static const Summary16 gb12345ext_uni2indx_pagefe[5] = { + /* 0xfe00 */ + { 2233, 0x0000 }, { 2233, 0x0000 }, { 2233, 0x0000 }, { 2233, 0xfffa }, + { 2247, 0x001f }, +}; + +static int +gb12345ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0100 && wc < 0x0270) + summary = &gb12345ext_uni2indx_page01[(wc>>4)-0x010]; + else if (wc >= 0x1e00 && wc < 0x1e40) + summary = &gb12345ext_uni2indx_page1e[(wc>>4)-0x1e0]; + else if (wc >= 0x2200 && wc < 0x2230) + summary = &gb12345ext_uni2indx_page22[(wc>>4)-0x220]; + else if (wc >= 0x4e00 && wc < 0x9fa0) + summary = &gb12345ext_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xfe00 && wc < 0xfe50) + summary = &gb12345ext_uni2indx_pagefe[(wc>>4)-0xfe0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = gb12345ext_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/gb18030.h b/Externals/libiconv-1.14/lib/gb18030.h new file mode 100644 index 0000000000..e9502e1bdd --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb18030.h @@ -0,0 +1,382 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB18030 + */ + +/* + * GB18030, as specified in the GB18030 standard, is an extension of GBK. + * + * In what follows, page numbers refer to the GB18030 standard (second + * printing). + * + * + * It consists of the following parts: + * + * One-byte range: + * ASCII p. 2 0x{00..7F} + * + * Two-byte range: + * GBK part 1 p. 10..12 0x{A1..A9}{A1..FE} + * GBK part 2 p. 13..36 0x{B0..F7}{A1..FE} + * GBK part 3 p. 37..52 0x{81..A0}{40..7E,80..FE} + * GBK part 4 p. 53..81 0x{AA..FE}{40..7E,80..A0} + * GBK part 5 p. 82 0x{A8..A9}{40..7E,80..A0} + * UDA part 1 p. 83..84 0x{AA..AF}{A1..FE} U+E000..U+E233 + * UDA part 2 p. 85..87 0x{F8..FE}{A1..FE} U+E234..U+E4C5 + * UDA part 3 p. 88..90 0x{A1..A7}{40..7E,80..A0} U+E4C6..U+E765 + * + * Four-byte range: + * BMP rest p. 94..283 0x{81..84}{30..39}{81..FE}{30..39} + * rest of U+0080..U+FFFF + * Planes 1-16 p. 5 0x{90..FE}{30..39}{81..FE}{30..39} + * U+10000..U+10FFFF + * + * To GBK part 1 were added: + * 1. 0xA2E3, 0xA8BF. + * 2. Characters mapped to the Unicode PUA + * 0xA2AB..0xA2B0 U+E766..U+E76B + * 0xA2E4 U+E76D + * 0xA2EF..0xA2F0 U+E76E..U+E76F + * 0xA2FD..0xA2FE U+E770..U+E771 + * 0xA4F4..0xA4FE U+E772..U+E77C + * 0xA5F7..0xA5FE U+E77D..U+E784 + * 0xA6B9..0xA6C0 U+E785..U+E78C + * 0xA6D9..0xA6DF [glyphs here!!] U+E78D..U+E793 + * 0xA6EC..0xA6ED [glyphs here!!] U+E794..U+E795 + * 0xA6F3 [glyphs here!!] U+E796 + * 0xA6F6..0xA6FE U+E797..U+E79F + * 0xA7C2..0xA7D0 U+E7A0..U+E7AE + * 0xA7F2..0xA7FE U+E7AF..U+E7BB + * 0xA8BC [glyphs here!!] U+E7C7 + * 0xA8C1..0xA8C4 U+E7C9..U+E7CC + * 0xA8EA..0xA8FE U+E7CD..U+E7E1 + * 0xA9A1..0xA9A3 U+E7FE..U+E800 + * 0xA9F0..0xA9FE U+E801..U+E80F + * + * To GBK part 2 were added: + * 3. Characters mapped to the Unicode PUA + * 0xD7FA..0xD7FE U+E810..0xE814 + * + * To GBK part 3 nothing was added. + * + * To GBK part 4 were added: + * 4. 0xFE{50,54..58,5A..60,62..65,68..6B,6E..75,77..7D,80..8F,92..9F}. + * 5. Characters mapped to the Unicode PUA + * 0xFE51..0xFE53 [glyphs here!!] U+E816..U+E818 + * 0xFE59 [glyphs here!!] U+E81E + * 0xFE61 [glyphs here!!] U+E826 + * 0xFE66..0xFE67 [glyphs here!!] U+E82B..U+E82C + * 0xFE6C..0xFE6D [glyphs here!!] U+E831..U+E832 + * 0xFE76 [glyphs here!!] U+E83B + * 0xFE7E [glyphs here!!] U+E843 + * 0xFE90..0xFE91 [glyphs here!!] U+E854..U+E855 + * 0xFEA0 [glyphs here!!] U+E864 + * + * To GBK part 5 were added: + * 6. 0xA98A..0xA995. + * 7. Characters mapped to the Unicode PUA + * 0xA896..0xA8A0 U+E7BC..U+E7C6 + * 0xA958 U+E7E2 + * 0xA95B U+E7E3 + * 0xA95D..0xA95F U+E7E4..U+E7E6 + * 0xA997..0xA9A0 U+E7F4..U+E7FD + * + * UDA part 1 contains the user-defined characters, mapped to the Unicode PUA + * U+E000..U+E233 in ascending order. + * + * UDA part 2 contains the user-defined characters, mapped to the Unicode PUA + * U+E234..U+E4C5 in ascending order. + * + * UDA part 3 contains the user-defined characters, mapped to the Unicode PUA + * U+E4C6..U+E765 in ascending order. + * + * The four-byte range 0x{81..84}{30..39}{81..FE}{30..39} + * contains the rest of the Unicode BMP in ascending order. + * Start: 0x81308130 = 0x0080 + * End: 0x8431A439 = 0xFFFF + * + * The four-byte range 0x{90..E3}{30..39}{81..FE}{30..39} + * contains the remaining 16 Unicode planes in Unicode order. + * Start: 0x90308130 = 0x010000 + * End: 0xE3329A35 = 0x10FFFF + * + * + * Unassigned Unicode characters are mapped. For example, + * U+173F = 0x8134BF35 (p. 120) + * U+2EFF = 0x81398B31 (p. 148) + * U+FFFE = 0x8431A438 (p. 283) + * + * + * The Unicode PUA (U+E000..U+F8FF) is mapped as follows: + * p. 83..84 0x{AA..AF}{A1..FE} U+E000..U+E233 + * p. 85..87 0x{F8..FE}{A1..FE} U+E234..U+E4C5 + * p. 88..90 0x{A1..A7}{40..7E,80..A0} U+E4C6..U+E765 + * p. 10 0xA2AB..0xA2B0 U+E766..U+E76B + * p. 255 0x8336C739 U+E76C + * p. 10 0xA2E4 U+E76D + * p. 10 0xA2EF..0xA2F0 U+E76E..U+E76F + * p. 10 0xA2FD..0xA2FE U+E770..U+E771 + * p. 11 0xA4F4..0xA4FE U+E772..U+E77C + * p. 11 0xA5F7..0xA5FE U+E77D..U+E784 + * p. 11 0xA6B9..0xA6C0 U+E785..U+E78C + * p. 11 0xA6D9..0xA6DF [glyphs here!!] U+E78D..U+E793 + * p. 11 0xA6EC..0xA6ED [glyphs here!!] U+E794..U+E795 + * p. 11 0xA6F3 [glyphs here!!] U+E796 + * p. 11 0xA6F6..0xA6FE U+E797..U+E79F + * p. 12 0xA7C2..0xA7D0 U+E7A0..U+E7AE + * p. 12 0xA7F2..0xA7FE U+E7AF..U+E7BB + * p. 82 0xA896..0xA8A0 U+E7BC..U+E7C6 + * p. 12 0xA8BC [glyphs here!!] U+E7C7 + * p. 255 0x8336C830 U+E7C8 + * p. 12 0xA8C1..0xA8C4 U+E7C9..U+E7CC + * p. 12 0xA8EA..0xA8FE U+E7CD..U+E7E1 + * p. 82 0xA958 U+E7E2 + * p. 82 0xA95B U+E7E3 + * p. 82 0xA95D..0xA95F U+E7E4..U+E7E6 + * p. 255 0x8336C831..0x8336C933 U+E7E7..U+E7F3 + * p. 82 0xA997..0xA9A0 U+E7F4..U+E7FD + * p. 12 0xA9A1..0xA9A3 U+E7FE..U+E800 + * p. 12 0xA9F0..0xA9FE U+E801..U+E80F + * p. 26 0xD7FA..0xD7FE U+E810..0xE814 + * p. 255 0x8336C934 U+E815 + * p. 81 0xFE51..0xFE53 [glyphs here!!] U+E816..U+E818 + * p. 255 0x8336C935..0x8336C939 U+E819..U+E81D + * p. 81 0xFE59 [glyphs here!!] U+E81E + * p. 255 0x8336CA30..0x8336CA36 U+E81F..U+E825 + * p. 81 0xFE61 [glyphs here!!] U+E826 + * p. 255 0x8336CA37..0x8336CB30 U+E827..U+E82A + * p. 81 0xFE66..0xFE67 [glyphs here!!] U+E82B..U+E82C + * p. 255 0x8336CB31..0x8336CB34 U+E82D..U+E830 + * p. 81 0xFE6C..0xFE6D [glyphs here!!] U+E831..U+E832 + * p. 255 0x8336CB35..0x8336CC32 U+E833..U+E83A + * p. 81 0xFE76 [glyphs here!!] U+E83B + * p. 255 0x8336CC33..0x8336CC39 U+E83C..U+E842 + * p. 81 0xFE7E [glyphs here!!] U+E843 + * p. 255 0x8336CD30..0x8336CE35 U+E844..U+E853 + * p. 81 0xFE90..0xFE91 [glyphs here!!] U+E854..U+E855 + * p. 255 0x8336CE36..0x8336CF39 U+E856..U+E863 + * p. 81 0xFEA0 [glyphs here!!] U+E864 + * p. 255..276 0x8336D030..0x84308130 U+E865..U+F8FF + * + * + * The Unicode surrogate area (U+D800..U+DFFF) is not mapped. (p. 255) + * + */ + +#include "gb18030ext.h" +#include "gb18030uni.h" + +static int +gb18030_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + int ret; + + /* Code set 0 (ASCII) */ + if (*s < 0x80) + return ascii_mbtowc(conv,pwc,s,n); + + /* Code set 1 (GBK extended) */ + ret = gbk_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + + ret = gb18030ext_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + + /* Code set 2 (remainder of Unicode U+0000..U+FFFF), including + User-defined characters, two-byte part of range U+E766..U+E864 */ + ret = gb18030uni_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + /* User-defined characters range U+E000..U+E765 */ + { + unsigned char c1 = s[0]; + if ((c1 >= 0xaa && c1 <= 0xaf) || (c1 >= 0xf8 && c1 <= 0xfe)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 <= 0xfe) { + *pwc = 0xe000 + 94 * (c1 >= 0xf8 ? c1 - 0xf2 : c1 - 0xaa) + (c2 - 0xa1); + return 2; + } + } else + return RET_TOOFEW(0); + } else if (c1 >= 0xa1 && c1 <= 0xa7) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x40 && c2 <= 0xa1 && c2 != 0x7f) { + *pwc = 0xe4c6 + 96 * (c1 - 0xa1) + c2 - (c2 >= 0x80 ? 0x41 : 0x40); + return 2; + } + } else + return RET_TOOFEW(0); + } + } + + /* Code set 3 (Unicode U+10000..U+10FFFF) */ + { + unsigned char c1 = s[0]; + if (c1 >= 0x90 && c1 <= 0xe3) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x30 && c2 <= 0x39) { + if (n >= 3) { + unsigned char c3 = s[2]; + if (c3 >= 0x81 && c3 <= 0xfe) { + if (n >= 4) { + unsigned char c4 = s[3]; + if (c4 >= 0x30 && c4 <= 0x39) { + unsigned int i = (((c1 - 0x90) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); + if (i >= 0 && i < 0x100000) { + *pwc = (ucs4_t) (0x10000 + i); + return 4; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } +} + +static const unsigned short gb18030_pua2charset[32*3] = { +/* Unicode range GB18030 range */ + 0xe766, 0xe76b, 0xa2ab, /*.. 0xa2b0, */ + 0xe76d, 0xe76d, 0xa2e4, + 0xe76e, 0xe76f, 0xa2ef, /*.. 0xa2f0, */ + 0xe770, 0xe771, 0xa2fd, /*.. 0xa2fe, */ + 0xe772, 0xe77c, 0xa4f4, /*.. 0xa4fe, */ + 0xe77d, 0xe784, 0xa5f7, /*.. 0xa5fe, */ + 0xe785, 0xe78c, 0xa6b9, /*.. 0xa6c0, */ + 0xe78d, 0xe793, 0xa6d9, /*.. 0xa6df, */ + 0xe794, 0xe795, 0xa6ec, /*.. 0xa6ed, */ + 0xe796, 0xe796, 0xa6f3, + 0xe797, 0xe79f, 0xa6f6, /*.. 0xa6fe, */ + 0xe7a0, 0xe7ae, 0xa7c2, /*.. 0xa7d0, */ + 0xe7af, 0xe7bb, 0xa7f2, /*.. 0xa7fe, */ + 0xe7bc, 0xe7c6, 0xa896, /*.. 0xa8a0, */ + 0xe7c7, 0xe7c7, 0xa8bc, + 0xe7c9, 0xe7cc, 0xa8c1, /*.. 0xa8c4, */ + 0xe7cd, 0xe7e1, 0xa8ea, /*.. 0xa8fe, */ + 0xe7e2, 0xe7e2, 0xa958, + 0xe7e3, 0xe7e3, 0xa95b, + 0xe7e4, 0xe7e6, 0xa95d, /*.. 0xa95f, */ + 0xe7f4, 0xe800, 0xa997, /*.. 0xa9a3, */ + 0xe801, 0xe80f, 0xa9f0, /*.. 0xa9fe, */ + 0xe810, 0xe814, 0xd7fa, /*.. 0xd7fe, */ + 0xe816, 0xe818, 0xfe51, /*.. 0xfe53, */ + 0xe81e, 0xe81e, 0xfe59, + 0xe826, 0xe826, 0xfe61, + 0xe82b, 0xe82c, 0xfe66, /*.. 0xfe67, */ + 0xe831, 0xe832, 0xfe6c, /*.. 0xfe6d, */ + 0xe83b, 0xe83b, 0xfe76, + 0xe843, 0xe843, 0xfe7e, + 0xe854, 0xe855, 0xfe90, /*.. 0xfe91, */ + 0xe864, 0xe864, 0xfea0, +}; + +static int +gb18030_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int ret; + + /* Code set 0 (ASCII) */ + ret = ascii_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 1 (GBK extended) */ + ret = gbk_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + ret = gb18030ext_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 2 (remainder of Unicode U+0000..U+FFFF) */ + if (wc >= 0xe000 && wc <= 0xe864) { + if (n >= 2) { + if (wc < 0xe766) { + /* User-defined characters range U+E000..U+E765 */ + if (wc < 0xe4c6) { + unsigned int i = wc - 0xe000; + r[1] = (i % 94) + 0xa1; i = i / 94; + r[0] = (i < 6 ? i + 0xaa : i + 0xf2); + return 2; + } else { + unsigned int i = wc - 0xe4c6; + r[0] = (i / 96) + 0xa1; i = i % 96; + r[1] = i + (i >= 0x3f ? 0x41 : 0x40); + return 2; + } + } else { + /* User-defined characters, two-byte part of range U+E766..U+E864 */ + unsigned int k1 = 0; + unsigned int k2 = 32; + /* Invariant: We know that if wc occurs in Unicode interval in + gb18030_pua2charset, it does so at a k with k1 <= k < k2. */ + while (k1 < k2) { + unsigned int k = (k1 + k2) / 2; + if (wc < gb18030_pua2charset[k*3+0]) + k2 = k; + else if (wc > gb18030_pua2charset[k*3+1]) + k1 = k + 1; + else { + unsigned short c = + gb18030_pua2charset[k*3+2] + (wc - gb18030_pua2charset[k*3+0]); + r[0] = (c >> 8); + r[1] = (c & 0xff); + return 2; + } + } + } + } else + return RET_TOOSMALL; + } + ret = gb18030uni_wctomb(conv,r,wc,n); + if (ret != RET_ILUNI) + return ret; + + /* Code set 3 (Unicode U+10000..U+10FFFF) */ + if (n >= 4) { + if (wc >= 0x10000 && wc < 0x110000) { + unsigned int i = wc - 0x10000; + r[3] = (i % 10) + 0x30; i = i / 10; + r[2] = (i % 126) + 0x81; i = i / 126; + r[1] = (i % 10) + 0x30; i = i / 10; + r[0] = i + 0x90; + return 4; + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/gb18030ext.h b/Externals/libiconv-1.14/lib/gb18030ext.h new file mode 100644 index 0000000000..5e59419bc8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb18030ext.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 1999-2001, 2005, 2011 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB18030 two-byte extension + */ + +static const unsigned short gb18030ext_2uni_pagea9[13] = { + /* 0xa9 */ + 0x303e, 0x2ff0, 0x2ff1, 0x2ff2, 0x2ff3, 0x2ff4, 0x2ff5, 0x2ff6, + 0x2ff7, 0x2ff8, 0x2ff9, 0x2ffa, 0x2ffb, +}; +static const unsigned int gb18030ext_2uni_pagefe[96] = { + /* 0xfe */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x2e81, 0x20087, 0x20089, 0x200cc, 0x2e84, 0x3473, 0x3447, 0x2e88, + 0x2e8b, 0x9fb4, 0x359e, 0x361a, 0x360e, 0x2e8c, 0x2e97, 0x396e, + 0x3918, 0x9fb5, 0x39cf, 0x39df, 0x3a73, 0x39d0, 0x9fb6, 0x9fb7, + 0x3b4e, 0x3c6e, 0x3ce0, 0x2ea7, 0x215d7, 0x9fb8, 0x2eaa, 0x4056, + 0x415f, 0x2eae, 0x4337, 0x2eb3, 0x2eb6, 0x2eb7, 0x2298f, 0x43b1, + 0x43ac, 0x2ebb, 0x43dd, 0x44d6, 0x4661, 0x464c, 0x9fb9, 0x4723, + 0x4729, 0x477c, 0x478d, 0x2eca, 0x4947, 0x497a, 0x497d, 0x4982, + 0x4983, 0x4985, 0x4986, 0x499f, 0x499b, 0x49b7, 0x49b6, 0x9fba, + 0x241fe, 0x4ca3, 0x4c9f, 0x4ca0, 0x4ca1, 0x4c77, 0x4ca2, 0x4d13, + 0x4d14, 0x4d15, 0x4d16, 0x4d17, 0x4d18, 0x4d19, 0x4dae, 0x9fbb, +}; + +static int +gb18030ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0xa2) || (c1 >= 0xa4 && c1 <= 0xa9) || (c1 == 0xd7) || (c1 == 0xfe)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { + unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + unsigned int wc = 0xfffd; + switch (c1) { + case 0xa2: + if (i >= 6376 && i <= 6381) /* 0xA2AB..0xA2B0 */ + wc = 0xe766 + (i - 6376); + else if (i == 6432) /* 0xA2E3 */ + wc = 0x20ac; + else if (i == 6433) /* 0xA2E4 */ + wc = 0xe76d; + else if (i >= 6444 && i <= 6445) /* 0xA2EF..0xA2F0 */ + wc = 0xe76e + (i - 6444); + else if (i >= 6458 && i <= 6459) /* 0xA2FD..0xA2FE */ + wc = 0xe770 + (i - 6458); + break; + case 0xa4: + if (i >= 6829 && i <= 6839) /* 0xA4F4..0xA4FE */ + wc = 0xe772 + (i - 6829); + break; + case 0xa5: + if (i >= 7022 && i <= 7029) /* 0xA5F7..0xA5FE */ + wc = 0xe77d + (i - 7022); + break; + case 0xa6: + if (i >= 7150 && i <= 7157) /* 0xA6B9..0xA6C0 */ + wc = 0xe785 + (i - 7150); + else if (i >= 7183 && i <= 7184) /* 0xA6DA..0xA6DB */ + wc = 0xfe12 - (i - 7183); + else if (i >= 7182 && i <= 7190) /* 0xA6D9..0xA6DF */ + wc = 0xfe10 + (i - 7182); + else if (i >= 7201 && i <= 7202) /* 0xA6EC..0xA6ED */ + wc = 0xfe17 + (i - 7201); + else if (i == 7208) /* 0xA6F3 */ + wc = 0xfe19; + else if (i >= 7211 && i <= 7219) /* 0xA6F6..0xA6FE */ + wc = 0xe797 + (i - 7211); + break; + case 0xa7: + if (i >= 7349 && i <= 7363) /* 0xA7C2..0xA7D0 */ + wc = 0xe7a0 + (i - 7349); + else if (i >= 7397 && i <= 7409) /* 0xA7F2..0xA7FE */ + wc = 0xe7af + (i - 7397); + break; + case 0xa8: + if (i >= 7495 && i <= 7505) /* 0xA896..0xA8A0 */ + wc = 0xe7bc + (i - 7495); + else if (i == 7533) /* 0xA8BC */ + wc = 0x1e3f; + else if (i == 7536) /* 0xA8BF */ + wc = 0x01f9; + else if (i >= 7538 && i <= 7541) /* 0xA8C1..0xA8C4 */ + wc = 0xe7c9 + (i - 7538); + else if (i >= 7579 && i <= 7599) /* 0xA8EA..0xA8FE */ + wc = 0xe7cd + (i - 7579); + break; + case 0xa9: + if (i == 7624) /* 0xA958 */ + wc = 0xe7e2; + else if (i == 7627) /* 0xA95B */ + wc = 0xe7e3; + else if (i >= 7629 && i <= 7631) /* 0xA95D..0xA95F */ + wc = 0xe7e4 + (i - 7629); + else if (i >= 7672 && i < 7685) /* 0xA989..0xA995 */ + wc = gb18030ext_2uni_pagea9[i-7672]; + else if (i >= 7686 && i <= 7698) /* 0xA997..0xA9A3 */ + wc = 0xe7f4 + (i - 7686); + else if (i >= 7775 && i <= 7789) /* 0xA9F0..0xA9FE */ + wc = 0xe801 + (i - 7775); + break; + case 0xd7: + if (i >= 16525 && i <= 16529) /* 0xD7FA..0xD7FE */ + wc = 0xe810 + (i - 16525); + break; + case 0xfe: + if (i < 23846) + wc = gb18030ext_2uni_pagefe[i-23750]; + break; + default: + break; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short gb18030ext_page2e[80] = { + 0x0000, 0xfe50, 0x0000, 0x0000, 0xfe54, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ + 0xfe57, 0x0000, 0x0000, 0xfe58, 0xfe5d, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5e, /*0x90-0x97*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe6b, /*0xa0-0xa7*/ + 0x0000, 0x0000, 0xfe6e, 0x0000, 0x0000, 0x0000, 0xfe71, 0x0000, /*0xa8-0xaf*/ + 0x0000, 0x0000, 0x0000, 0xfe73, 0x0000, 0x0000, 0xfe74, 0xfe75, /*0xb0-0xb7*/ + 0x0000, 0x0000, 0x0000, 0xfe79, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/ + 0x0000, 0x0000, 0xfe84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/ +}; +static const unsigned short gb18030ext_page2f[16] = { + 0xa98a, 0xa98b, 0xa98c, 0xa98d, 0xa98e, 0xa98f, 0xa990, 0xa991, /*0xf0-0xf7*/ + 0xa992, 0xa993, 0xa994, 0xa995, 0x0000, 0x0000, 0x0000, 0x0000, /*0xf8-0xff*/ +}; +static const unsigned short gb18030ext_page34[56] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe56, /*0x40-0x47*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/ + 0x0000, 0x0000, 0x0000, 0xfe55, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/ +}; +static const unsigned short gb18030ext_page36[24] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x0000, /*0x08-0x0f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/ + 0x0000, 0x0000, 0xfe5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ +}; +static const unsigned short gb18030ext_page39[24] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe62, /*0xc8-0xcf*/ + 0xfe65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe63, /*0xd8-0xdf*/ +}; +static const unsigned short gb18030ext_page43[56] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0xfe78, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/ + 0x0000, 0xfe77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe7a, 0x0000, 0x0000, /*0xd8-0xdf*/ +}; +static const unsigned short gb18030ext_page46[32] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0xfe7d, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ + 0x0000, 0xfe7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ +}; +static const unsigned short gb18030ext_page47_1[16] = { + 0x0000, 0x0000, 0x0000, 0xfe80, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/ + 0x0000, 0xfe81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/ +}; +static const unsigned short gb18030ext_page47_2[24] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0xfe82, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe83, 0x0000, 0x0000, /*0x88-0x8f*/ +}; +static const unsigned short gb18030ext_page49[120] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe85, /*0x40-0x47*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/ + 0x0000, 0x0000, 0xfe86, 0x0000, 0x0000, 0xfe87, 0x0000, 0x0000, /*0x78-0x7f*/ + 0x0000, 0x0000, 0xfe88, 0xfe89, 0x0000, 0xfe8a, 0xfe8b, 0x0000, /*0x80-0x87*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/ + 0x0000, 0x0000, 0x0000, 0xfe8d, 0x0000, 0x0000, 0x0000, 0xfe8c, /*0x98-0x9f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe8f, 0xfe8e, /*0xb0-0xb7*/ +}; +static const unsigned short gb18030ext_page4c[56] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe96, /*0x70-0x77*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe93, /*0x98-0x9f*/ + 0xfe94, 0xfe95, 0xfe97, 0xfe92, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/ +}; +static const unsigned short gb18030ext_page4d[16] = { + 0x0000, 0x0000, 0x0000, 0xfe98, 0xfe99, 0xfe9a, 0xfe9b, 0xfe9c, /*0x10-0x17*/ + 0xfe9d, 0xfe9e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ +}; +static const unsigned short gb18030ext_page9f[16] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0xfe59, 0xfe61, 0xfe66, 0xfe67, /*0xb0-0xb7*/ + 0xfe6d, 0xfe7e, 0xfe90, 0xfea0, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ +}; +static const unsigned short gb18030ext_pagefe[16] = { + 0xa6d9, 0xa6db, 0xa6da, 0xa6dc, 0xa6dd, 0xa6de, 0xa6df, 0xa6ec, /*0x10-0x17*/ + 0xa6ed, 0xa6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ +}; + +static int +gb18030ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + unsigned short c = 0; + if (wc == 0x01f9) + c = 0xa8bf; + else if (wc == 0x1e3f) + c = 0xa8bc; + else if (wc == 0x20ac) + c = 0xa2e3; + else if (wc >= 0x2e80 && wc < 0x2ed0) + c = gb18030ext_page2e[wc-0x2e80]; + else if (wc >= 0x2ff0 && wc < 0x3000) + c = gb18030ext_page2f[wc-0x2ff0]; + else if (wc == 0x303e) + c = 0xa989; + else if (wc >= 0x3440 && wc < 0x3478) + c = gb18030ext_page34[wc-0x3440]; + else if (wc == 0x359e) + c = 0xfe5a; + else if (wc >= 0x3608 && wc < 0x3620) + c = gb18030ext_page36[wc-0x3608]; + else if (wc == 0x3918) + c = 0xfe60; + else if (wc == 0x396e) + c = 0xfe5f; + else if (wc >= 0x39c8 && wc < 0x39e0) + c = gb18030ext_page39[wc-0x39c8]; + else if (wc == 0x3a73) + c = 0xfe64; + else if (wc == 0x3b4e) + c = 0xfe68; + else if (wc == 0x3c6e) + c = 0xfe69; + else if (wc == 0x3ce0) + c = 0xfe6a; + else if (wc == 0x4056) + c = 0xfe6f; + else if (wc == 0x415f) + c = 0xfe70; + else if (wc == 0x4337) + c = 0xfe72; + else if (wc >= 0x43a8 && wc < 0x43e0) + c = gb18030ext_page43[wc-0x43a8]; + else if (wc == 0x44d6) + c = 0xfe7b; + else if (wc >= 0x4648 && wc < 0x4668) + c = gb18030ext_page46[wc-0x4648]; + else if (wc >= 0x4720 && wc < 0x4730) + c = gb18030ext_page47_1[wc-0x4720]; + else if (wc >= 0x4778 && wc < 0x4790) + c = gb18030ext_page47_2[wc-0x4778]; + else if (wc >= 0x4940 && wc < 0x49b8) + c = gb18030ext_page49[wc-0x4940]; + else if (wc >= 0x4c70 && wc < 0x4ca8) + c = gb18030ext_page4c[wc-0x4c70]; + else if (wc >= 0x4d10 && wc < 0x4d20) + c = gb18030ext_page4d[wc-0x4d10]; + else if (wc == 0x4dae) + c = 0xfe9f; + else if (wc >= 0x9fb4 && wc < 0x9fbc) + c = gb18030ext_page9f[wc-0x9fb0]; + else if (wc >= 0xfe10 && wc < 0xfe1a) + c = gb18030ext_pagefe[wc-0xfe10]; + else if (wc == 0x20087) + c = 0xfe51; + else if (wc == 0x20089) + c = 0xfe52; + else if (wc == 0x200cc) + c = 0xfe53; + else if (wc == 0x215d7) + c = 0xfe6c; + else if (wc == 0x2298f) + c = 0xfe76; + else if (wc == 0x241fe) + c = 0xfe91; + if (c != 0) { + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/gb18030uni.h b/Externals/libiconv-1.14/lib/gb18030uni.h new file mode 100644 index 0000000000..bea31e513b --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb18030uni.h @@ -0,0 +1,249 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB18030 four-byte extension + */ + +static const unsigned short gb18030uni_charset2uni_ranges[412] = { + 0x0000, 0x0023, 0x0024, 0x0025, 0x0026, 0x002c, 0x002d, 0x0031, + 0x0032, 0x0050, 0x0051, 0x0058, 0x0059, 0x005e, 0x005f, 0x005f, + 0x0060, 0x0063, 0x0064, 0x0066, 0x0067, 0x0067, 0x0068, 0x0068, + 0x0069, 0x006c, 0x006d, 0x007d, 0x007e, 0x0084, 0x0085, 0x0093, + 0x0094, 0x00ab, 0x00ac, 0x00ae, 0x00af, 0x00b2, 0x00b3, 0x00cf, + 0x00d0, 0x0131, 0x0132, 0x0132, 0x0133, 0x0133, 0x0134, 0x0134, + 0x0135, 0x0135, 0x0136, 0x0136, 0x0137, 0x0137, 0x0138, 0x0138, + 0x0139, 0x0154, 0x0155, 0x01ab, 0x01ac, 0x01ba, 0x01bb, 0x021f, + 0x0220, 0x0220, 0x0221, 0x022d, 0x022e, 0x02e4, 0x02e5, 0x02e5, + 0x02e6, 0x02ec, 0x02ed, 0x02ed, 0x02ee, 0x0324, 0x0325, 0x0332, + 0x0333, 0x0333, 0x0334, 0x1ef1, 0x1ef2, 0x1ef3, 0x1ef4, 0x1ef4, + 0x1ef5, 0x1ef6, 0x1ef7, 0x1efd, 0x1efe, 0x1f06, 0x1f07, 0x1f07, + 0x1f08, 0x1f08, 0x1f09, 0x1f0d, 0x1f0e, 0x1f7d, 0x1f7e, 0x1fd3, + 0x1fd4, 0x1fd4, 0x1fd5, 0x1fd7, 0x1fd8, 0x1fe3, 0x1fe4, 0x1fed, + 0x1fee, 0x202b, 0x202c, 0x202f, 0x2030, 0x2045, 0x2046, 0x2047, + 0x2048, 0x20b5, 0x20b6, 0x20bb, 0x20bc, 0x20bc, 0x20bd, 0x20bf, + 0x20c0, 0x20c3, 0x20c4, 0x20c5, 0x20c6, 0x20c7, 0x20c8, 0x20c8, + 0x20c9, 0x20c9, 0x20ca, 0x20cb, 0x20cc, 0x20d0, 0x20d1, 0x20d5, + 0x20d6, 0x20df, 0x20e0, 0x20e2, 0x20e3, 0x20e7, 0x20e8, 0x20f4, + 0x20f5, 0x20f6, 0x20f7, 0x20fc, 0x20fd, 0x2121, 0x2122, 0x2124, + 0x2125, 0x212f, 0x2130, 0x2148, 0x2149, 0x219a, 0x219b, 0x22e7, + 0x22e8, 0x22f1, 0x22f2, 0x2355, 0x2356, 0x2359, 0x235a, 0x2366, + 0x2367, 0x2369, 0x236a, 0x2373, 0x2374, 0x2383, 0x2384, 0x238b, + 0x238c, 0x2393, 0x2394, 0x2396, 0x2397, 0x2398, 0x2399, 0x23aa, + 0x23ab, 0x23c9, 0x23ca, 0x23cb, 0x23cc, 0x2401, 0x2402, 0x2402, + 0x2403, 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c45, 0x2c46, 0x2c47, + 0x2c48, 0x2c51, 0x2c52, 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c65, + 0x2c66, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6e, 0x2c6f, 0x2c7c, + 0x2c7d, 0x2da1, 0x2da2, 0x2da5, 0x2da6, 0x2da6, 0x2da7, 0x2dab, + 0x2dac, 0x2dad, 0x2dae, 0x2dc1, 0x2dc2, 0x2dc3, 0x2dc4, 0x2dca, + 0x2dcb, 0x2dcc, 0x2dcd, 0x2dd1, 0x2dd2, 0x2dd7, 0x2dd8, 0x2ecd, + 0x2ece, 0x2ed4, 0x2ed5, 0x2f45, 0x2f46, 0x302f, 0x3030, 0x303b, + 0x303c, 0x303d, 0x303e, 0x305f, 0x3060, 0x3068, 0x3069, 0x306a, + 0x306b, 0x306c, 0x306d, 0x30dd, 0x30de, 0x3108, 0x3109, 0x3232, + 0x3233, 0x32a1, 0x32a2, 0x32ac, 0x32ad, 0x35a9, 0x35aa, 0x35fe, + 0x35ff, 0x365e, 0x365f, 0x366c, 0x366d, 0x36ff, 0x3700, 0x37d9, + 0x37da, 0x38f8, 0x38f9, 0x3969, 0x396a, 0x3cde, 0x3cdf, 0x3de6, + 0x3de7, 0x3fbd, 0x3fbe, 0x4031, 0x4032, 0x4035, 0x4036, 0x4060, + 0x4061, 0x4158, 0x4159, 0x42cd, 0x42ce, 0x42e1, 0x42e2, 0x43a2, + 0x43a3, 0x43a7, 0x43a8, 0x43f9, 0x43fa, 0x4409, 0x440a, 0x45c2, + 0x45c3, 0x45f4, 0x45f5, 0x45f6, 0x45f7, 0x45fa, 0x45fb, 0x45fb, + 0x45fc, 0x460f, 0x4610, 0x4612, 0x4613, 0x4628, 0x4629, 0x48e7, + 0x48e8, 0x490e, 0x490f, 0x497d, 0x497e, 0x4a11, 0x4a12, 0x4a62, + 0x4a63, 0x82bc, + 0x82bd, 0x82bd, 0x82be, 0x82be, 0x82bf, 0x82cb, + 0x82cc, 0x82cc, 0x82cd, 0x82d1, 0x82d2, 0x82d8, 0x82d9, 0x82dc, + 0x82dd, 0x82e0, 0x82e1, 0x82e8, 0x82e9, 0x82ef, 0x82f0, 0x82ff, + 0x8300, 0x830d, + 0x830e, 0x93d4, 0x93d5, 0x9420, 0x9421, 0x943b, + 0x943c, 0x948c, 0x948d, 0x9495, 0x9496, 0x94af, 0x94b0, 0x94b0, + 0x94b1, 0x94b1, 0x94b2, 0x94b4, 0x94b5, 0x94ba, 0x94bb, 0x94bb, + 0x94bc, 0x94bd, 0x94be, 0x98c3, 0x98c4, 0x98c4, 0x98c5, 0x98c8, + 0x98c9, 0x98c9, 0x98ca, 0x98ca, 0x98cb, 0x98cb, 0x98cc, 0x9960, + 0x9961, 0x99e1, 0x99e2, 0x99fb +}; + +static const unsigned short gb18030uni_uni2charset_ranges[412] = { + 0x0080, 0x00a3, 0x00a5, 0x00a6, 0x00a9, 0x00af, 0x00b2, 0x00b6, + 0x00b8, 0x00d6, 0x00d8, 0x00df, 0x00e2, 0x00e7, 0x00eb, 0x00eb, + 0x00ee, 0x00f1, 0x00f4, 0x00f6, 0x00f8, 0x00f8, 0x00fb, 0x00fb, + 0x00fd, 0x0100, 0x0102, 0x0112, 0x0114, 0x011a, 0x011c, 0x012a, + 0x012c, 0x0143, 0x0145, 0x0147, 0x0149, 0x014c, 0x014e, 0x016a, + 0x016c, 0x01cd, 0x01cf, 0x01cf, 0x01d1, 0x01d1, 0x01d3, 0x01d3, + 0x01d5, 0x01d5, 0x01d7, 0x01d7, 0x01d9, 0x01d9, 0x01db, 0x01db, + 0x01dd, 0x01f8, 0x01fa, 0x0250, 0x0252, 0x0260, 0x0262, 0x02c6, + 0x02c8, 0x02c8, 0x02cc, 0x02d8, 0x02da, 0x0390, 0x03a2, 0x03a2, + 0x03aa, 0x03b0, 0x03c2, 0x03c2, 0x03ca, 0x0400, 0x0402, 0x040f, + 0x0450, 0x0450, 0x0452, 0x200f, 0x2011, 0x2012, 0x2017, 0x2017, + 0x201a, 0x201b, 0x201e, 0x2024, 0x2027, 0x202f, 0x2031, 0x2031, + 0x2034, 0x2034, 0x2036, 0x203a, 0x203c, 0x20ab, 0x20ad, 0x2102, + 0x2104, 0x2104, 0x2106, 0x2108, 0x210a, 0x2115, 0x2117, 0x2120, + 0x2122, 0x215f, 0x216c, 0x216f, 0x217a, 0x218f, 0x2194, 0x2195, + 0x219a, 0x2207, 0x2209, 0x220e, 0x2210, 0x2210, 0x2212, 0x2214, + 0x2216, 0x2219, 0x221b, 0x221c, 0x2221, 0x2222, 0x2224, 0x2224, + 0x2226, 0x2226, 0x222c, 0x222d, 0x222f, 0x2233, 0x2238, 0x223c, + 0x223e, 0x2247, 0x2249, 0x224b, 0x224d, 0x2251, 0x2253, 0x225f, + 0x2262, 0x2263, 0x2268, 0x226d, 0x2270, 0x2294, 0x2296, 0x2298, + 0x229a, 0x22a4, 0x22a6, 0x22be, 0x22c0, 0x2311, 0x2313, 0x245f, + 0x246a, 0x2473, 0x249c, 0x24ff, 0x254c, 0x254f, 0x2574, 0x2580, + 0x2590, 0x2592, 0x2596, 0x259f, 0x25a2, 0x25b1, 0x25b4, 0x25bb, + 0x25be, 0x25c5, 0x25c8, 0x25ca, 0x25cc, 0x25cd, 0x25d0, 0x25e1, + 0x25e6, 0x2604, 0x2607, 0x2608, 0x260a, 0x263f, 0x2641, 0x2641, + 0x2643, 0x2e80, 0x2e82, 0x2e83, 0x2e85, 0x2e87, 0x2e89, 0x2e8a, + 0x2e8d, 0x2e96, 0x2e98, 0x2ea6, 0x2ea8, 0x2ea9, 0x2eab, 0x2ead, + 0x2eaf, 0x2eb2, 0x2eb4, 0x2eb5, 0x2eb8, 0x2eba, 0x2ebc, 0x2ec9, + 0x2ecb, 0x2fef, 0x2ffc, 0x2fff, 0x3004, 0x3004, 0x3018, 0x301c, + 0x301f, 0x3020, 0x302a, 0x303d, 0x303f, 0x3040, 0x3094, 0x309a, + 0x309f, 0x30a0, 0x30f7, 0x30fb, 0x30ff, 0x3104, 0x312a, 0x321f, + 0x322a, 0x3230, 0x3232, 0x32a2, 0x32a4, 0x338d, 0x3390, 0x339b, + 0x339f, 0x33a0, 0x33a2, 0x33c3, 0x33c5, 0x33cd, 0x33cf, 0x33d0, + 0x33d3, 0x33d4, 0x33d6, 0x3446, 0x3448, 0x3472, 0x3474, 0x359d, + 0x359f, 0x360d, 0x360f, 0x3619, 0x361b, 0x3917, 0x3919, 0x396d, + 0x396f, 0x39ce, 0x39d1, 0x39de, 0x39e0, 0x3a72, 0x3a74, 0x3b4d, + 0x3b4f, 0x3c6d, 0x3c6f, 0x3cdf, 0x3ce1, 0x4055, 0x4057, 0x415e, + 0x4160, 0x4336, 0x4338, 0x43ab, 0x43ad, 0x43b0, 0x43b2, 0x43dc, + 0x43de, 0x44d5, 0x44d7, 0x464b, 0x464d, 0x4660, 0x4662, 0x4722, + 0x4724, 0x4728, 0x472a, 0x477b, 0x477d, 0x478c, 0x478e, 0x4946, + 0x4948, 0x4979, 0x497b, 0x497c, 0x497e, 0x4981, 0x4984, 0x4984, + 0x4987, 0x499a, 0x499c, 0x499e, 0x49a0, 0x49b5, 0x49b8, 0x4c76, + 0x4c78, 0x4c9e, 0x4ca4, 0x4d12, 0x4d1a, 0x4dad, 0x4daf, 0x4dff, + 0x9fa6, 0xd7ff, + 0xe76c, 0xe76c, 0xe7c8, 0xe7c8, 0xe7e7, 0xe7f3, + 0xe815, 0xe815, 0xe819, 0xe81d, 0xe81f, 0xe825, 0xe827, 0xe82a, + 0xe82d, 0xe830, 0xe833, 0xe83a, 0xe83c, 0xe842, 0xe844, 0xe853, + 0xe856, 0xe863, + 0xe865, 0xf92b, 0xf92d, 0xf978, 0xf97a, 0xf994, + 0xf996, 0xf9e6, 0xf9e8, 0xf9f0, 0xf9f2, 0xfa0b, 0xfa10, 0xfa10, + 0xfa12, 0xfa12, 0xfa15, 0xfa17, 0xfa19, 0xfa1e, 0xfa22, 0xfa22, + 0xfa25, 0xfa26, 0xfa2a, 0xfe2f, 0xfe32, 0xfe32, 0xfe45, 0xfe48, + 0xfe53, 0xfe53, 0xfe58, 0xfe58, 0xfe67, 0xfe67, 0xfe6c, 0xff00, + 0xff5f, 0xffdf, 0xffe6, 0xffff +}; + +static const unsigned short gb18030uni_ranges[206] = { + 128, 129, 131, 133, 134, 135, 137, 140, + 142, 144, 145, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 171, 172, 189, 196, 213, 220, 221, + 285, 286, 287, 291, 293, 295, 297, 298, + 300, 301, 302, 303, 304, 305, 306, 307, + 308, 320, 330, 334, 338, 339, 340, 341, + 342, 343, 347, 348, 349, 354, 355, 359, + 360, 361, 362, 363, 365, 369, 371, 372, + 373, 374, 375, 376, 386, 426, 502, 538, + 553, 556, 558, 560, 562, 564, 565, 567, + 571, 573, 574, 575, 576, 577, 578, 579, + 581, 582, 583, 584, 585, 586, 588, 589, + 590, 602, 606, 625, 627, 636, 637, 720, + 724, 810, 813, 850, 860, 861, 862, 864, + 867, 868, 869, 870, 872, 873, 874, 875, + 876, 877, 878, 879, 880, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 891, 892, + 893, 894, 895, 896, 897, 898, 899, 900, + 901, 902, 903, 905, 907, 908, 909, 911, + 912, 917, 924, 925, 21827, + 25775, 25866, 25896, + 25929, 25932, 25933, 25934, 25936, 25938, 25939, 25940, + 25942, + 25943, 25944, 25945, 25946, 25947, 25948, 25952, + 25953, 25955, 25956, 25959, 25961, 25964, 25966, 25984, + 25994, 25998, 26012, 26016, 26110, 26116 +}; + +static int +gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if (c1 >= 0x81 && c1 <= 0x84) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x30 && c2 <= 0x39) { + if (n >= 3) { + unsigned char c3 = s[2]; + if (c3 >= 0x81 && c3 <= 0xfe) { + if (n >= 4) { + unsigned char c4 = s[3]; + if (c4 >= 0x30 && c4 <= 0x39) { + unsigned int i = (((c1 - 0x81) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); + if (i >= 0 && i <= 39419) { + unsigned int k1 = 0; + unsigned int k2 = 205; + while (k1 < k2) { + unsigned int k = (k1 + k2) / 2; + if (i <= gb18030uni_charset2uni_ranges[2*k+1]) + k2 = k; + else if (i >= gb18030uni_charset2uni_ranges[2*k+2]) + k1 = k + 1; + else + return RET_ILSEQ; + } + { + unsigned int diff = gb18030uni_ranges[k1]; + *pwc = (ucs4_t) (i + diff); + return 4; + } + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static int +gb18030uni_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 4) { + unsigned int i = wc; + if (i >= 0x0080 && i <= 0xffff) { + unsigned int k1 = 0; + unsigned int k2 = 205; + while (k1 < k2) { + unsigned int k = (k1 + k2) / 2; + if (i <= gb18030uni_uni2charset_ranges[2*k+1]) + k2 = k; + else if (i >= gb18030uni_uni2charset_ranges[2*k+2]) + k1 = k + 1; + else + return RET_ILUNI; + } + { + unsigned int diff = gb18030uni_ranges[k1]; + i -= diff; + r[3] = (i % 10) + 0x30; i = i / 10; + r[2] = (i % 126) + 0x81; i = i / 126; + r[1] = (i % 10) + 0x30; i = i / 10; + r[0] = i + 0x81; + return 4; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/gb2312.h b/Externals/libiconv-1.14/lib/gb2312.h new file mode 100644 index 0000000000..831a569127 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gb2312.h @@ -0,0 +1,2571 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GB2312.1980-0 + */ + +static const unsigned short gb2312_2uni_page21[831] = { + /* 0x21 */ + 0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003, + 0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c, + 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, + 0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1, + 0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a, + 0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d, + 0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234, + 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4, + 0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb, + 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, + 0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, + /* 0x22 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, + 0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477, + 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, + 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223, + 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd, + 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, + 0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd, + /* 0x23 */ + 0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08, + 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, + 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, + 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, + 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, + 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, + 0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, + 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, + 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, + 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, + 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, + /* 0x24 */ + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, + 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, + 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, + 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, + 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, + 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, + 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x25 */ + 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, + 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, + 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, + 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, + 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, + 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, + 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, + 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, + 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, + 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, + 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x26 */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x27 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, + 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, + 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, + 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, + 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x28 */ + 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8, + 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, + 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, + 0x00fc, 0x00ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108, + 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, + 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, + 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, + 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, + 0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x29 */ + 0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, + 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, + 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, + 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, + 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, + 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, + 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, + 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, + 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, + 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, +}; +static const unsigned short gb2312_2uni_page30[6768] = { + /* 0x30 */ + 0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691, + 0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d, + 0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848, + 0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884, + 0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed, + 0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776, + 0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf, + 0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed, + 0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc, + 0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886, + 0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d, + 0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265, + /* 0x31 */ + 0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5, + 0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351, + 0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907, + 0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29, + 0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4, + 0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9, + 0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5, + 0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16, + 0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab, + 0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b, + 0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175, + 0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3, + /* 0x32 */ + 0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2, + 0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236, + 0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa, + 0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016, + 0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29, + 0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b, + 0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf, + 0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7, + 0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336, + 0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6, + 0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20, + 0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316, + /* 0x33 */ + 0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e, + 0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632, + 0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3, + 0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1, + 0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59, + 0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f, + 0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60, + 0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64, + 0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0, + 0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7, + 0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8, + 0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a, + /* 0x34 */ + 0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd, + 0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97, + 0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524, + 0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822, + 0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148, + 0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471, + 0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07, + 0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106, + 0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb, + 0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54, + 0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26, + 0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e, + /* 0x35 */ + 0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6, + 0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb, + 0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48, + 0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053, + 0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49, + 0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c, + 0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730, + 0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382, + 0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43, + 0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc, + 0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc, + 0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0, + /* 0x36 */ + 0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a, + 0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b, + 0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661, + 0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec, + 0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6, + 0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e, + 0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566, + 0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a, + 0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0, + 0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25, + 0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c, + 0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c, + /* 0x37 */ + 0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5, + 0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492, + 0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af, + 0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632, + 0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561, + 0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8, + 0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f, + 0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa, + 0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af, + 0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b, + 0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90, + 0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d, + /* 0x38 */ + 0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85, + 0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74, + 0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236, + 0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490, + 0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89, + 0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f, + 0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b, + 0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f, + 0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c, + 0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b, + 0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9, + 0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9, + /* 0x39 */ + 0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a, + 0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1, + 0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2, + 0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30, + 0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37, + 0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250, + 0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173, + 0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c, + 0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845, + 0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842, + 0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505, + 0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8, + /* 0x3a */ + 0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163, + 0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a, + 0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a, + 0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a, + 0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d, + 0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2, + 0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a, + 0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8, + 0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f, + 0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c, + 0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6, + 0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56, + /* 0x3b */ + 0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1, + 0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd, + 0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853, + 0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115, + 0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757, + 0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d, + 0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de, + 0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd, + 0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f, + 0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b, + 0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e, + 0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95, + /* 0x3c */ + 0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9, + 0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca, + 0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0, + 0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d, + 0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2, + 0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939, + 0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be, + 0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1, + 0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270, + 0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3, + 0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274, + 0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6, + /* 0x3d */ + 0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa, + 0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868, + 0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901, + 0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc, + 0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a, + 0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb, + 0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a, + 0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01, + 0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f, + 0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1, + 0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb, + 0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78, + /* 0x3e */ + 0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8, + 0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f, + 0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756, + 0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0, + 0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551, + 0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8, + 0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9, + 0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd, + 0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350, + 0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b, + 0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd, + 0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb, + /* 0x3f */ + 0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361, + 0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a, + 0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b, + 0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777, + 0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3, + 0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543, + 0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7, + 0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6, + 0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef, + 0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50, + 0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4, + 0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080, + /* 0x40 */ + 0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec, + 0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a, + 0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f, + 0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8, + 0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca, + 0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c, + 0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d, + 0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b, + 0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece, + 0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4, + 0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1, + 0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0, + /* 0x41 */ + 0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9, + 0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f, + 0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae, + 0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e, + 0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5, + 0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217, + 0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716, + 0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce, + 0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc, + 0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409, + 0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3, + 0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf, + /* 0x42 */ + 0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3, + 0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3, + 0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42, + 0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415, + 0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f, + 0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6, + 0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1, + 0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523, + 0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988, + 0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417, + 0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992, + 0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b, + /* 0x43 */ + 0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b, + 0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192, + 0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176, + 0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e, + 0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c, + 0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f, + 0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8, + 0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5, + 0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf, + 0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d, + 0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f, + 0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478, + /* 0x44 */ + 0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9, + 0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c, + 0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd, + 0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766, + 0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c, + 0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, + 0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462, + 0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5, + 0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b, + 0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f, + 0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d, + 0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81, + /* 0x45 */ + 0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53, + 0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650, + 0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25, + 0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c, + 0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43, + 0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224, + 0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486, + 0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9, + 0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6, + 0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c, + 0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812, + 0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7, + /* 0x46 */ + 0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41, + 0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2, + 0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058, + 0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4, + 0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb, + 0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9, + 0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd, + 0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4, + 0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566, + 0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77, + 0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14, + 0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390, + /* 0x47 */ + 0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1, + 0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d, + 0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49, + 0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2, + 0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8, + 0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207, + 0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6, + 0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752, + 0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30, + 0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18, + 0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a, + 0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20, + /* 0x48 */ + 0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743, + 0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d, + 0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0, + 0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4, + 0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed, + 0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203, + 0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9, + 0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9, + 0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1, + 0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e, + 0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428, + 0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1, + /* 0x49 */ + 0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b, + 0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802, + 0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b, + 0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b, + 0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247, + 0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a, + 0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6, + 0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c, + 0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe, + 0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5, + 0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17, + 0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3, + /* 0x4a */ + 0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee, + 0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe, + 0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2, + 0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16, + 0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc, + 0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02, + 0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88, + 0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2, + 0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f, + 0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72, + 0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f, + 0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31, + /* 0x4b */ + 0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813, + 0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e, + 0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1, + 0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b, + 0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3, + 0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5, + 0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20, + 0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083, + 0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3, + 0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f, + 0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501, + 0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854, + /* 0x4c */ + 0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0, + 0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a, + 0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08, + 0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64, + 0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018, + 0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6, + 0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279, + 0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511, + 0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5, + 0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c, + 0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3, + 0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3, + /* 0x4d */ + 0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a, + 0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876, + 0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f, + 0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60, + 0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f, + 0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258, + 0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3, + 0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c, + 0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38, + 0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b, + 0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51, + 0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01, + /* 0x4e */ + 0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f, + 0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f, + 0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3, + 0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b, + 0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33, + 0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1, + 0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c, + 0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7, + 0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e, + 0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff, + 0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852, + 0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a, + /* 0x4f */ + 0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184, + 0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60, + 0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6, + 0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0, + 0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148, + 0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2, + 0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf, + 0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8, + 0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4, + 0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61, + 0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee, + 0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653, + /* 0x50 */ + 0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954, + 0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa, + 0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8, + 0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23, + 0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165, + 0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c, + 0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8, + 0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d, + 0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700, + 0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9, + 0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed, + 0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384, + /* 0x51 */ + 0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74, + 0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb, + 0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5, + 0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259, + 0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6, + 0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814, + 0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf, + 0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5, + 0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a, + 0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f, + 0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b, + 0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476, + /* 0x52 */ + 0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200, + 0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce, + 0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b, + 0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d, + 0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0, + 0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a, + 0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091, + 0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6, + 0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3, + 0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335, + 0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6, + 0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690, + /* 0x53 */ + 0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9, + 0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71, + 0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8, + 0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38, + 0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24, + 0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709, + 0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2, + 0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59, + 0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88, + 0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd, + 0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea, + 0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89, + /* 0x54 */ + 0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a, + 0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed, + 0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f, + 0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3, + 0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300, + 0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55, + 0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d, + 0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f, + 0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1, + 0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23, + 0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe, + 0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67, + /* 0x55 */ + 0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8, + 0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb, + 0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d, + 0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd, + 0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756, + 0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db, + 0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087, + 0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517, + 0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827, + 0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707, + 0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0, + 0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f, + /* 0x56 */ + 0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431, + 0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c, + 0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307, + 0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7, + 0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9, + 0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d, + 0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd, + 0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5, + 0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4, + 0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010, + 0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457, + 0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51, + /* 0x57 */ + 0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13, + 0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5, + 0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58, + 0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c, + 0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179, + 0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4, + 0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5, + 0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f, + 0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b, + 0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a, + 0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750, + 0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x58 */ + 0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98, + 0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315, + 0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997, + 0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69, + 0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d, + 0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326, + 0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e, + 0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c, + 0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54, + 0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede, + 0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09, + 0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d, + /* 0x59 */ + 0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89, + 0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94, + 0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1, + 0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e, + 0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043, + 0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9, + 0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107, + 0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46, + 0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9, + 0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156, + 0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34, + 0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc, + /* 0x5a */ + 0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa, + 0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce, + 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf, + 0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6, + 0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c, + 0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b, + 0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a, + 0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369, + 0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c, + 0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674, + 0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099, + 0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba, + /* 0x5b */ + 0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7, + 0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef, + 0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139, + 0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be, + 0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4, + 0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c, + 0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c, + 0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742, + 0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d, + 0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7, + 0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2, + 0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd, + /* 0x5c */ + 0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844, + 0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8, + 0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8, + 0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be, + 0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb, + 0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4, + 0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307, + 0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311, + 0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351, + 0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b, + 0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317, + 0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365, + /* 0x5d */ + 0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0, + 0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385, + 0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e, + 0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807, + 0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411, + 0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea, + 0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a, + 0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c, + 0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1, + 0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba, + 0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c, + 0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a, + /* 0x5e */ + 0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564, + 0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8, + 0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7, + 0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629, + 0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955, + 0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c, + 0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322, + 0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a, + 0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc, + 0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452, + 0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c, + 0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496, + /* 0x5f */ + 0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7, + 0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519, + 0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412, + 0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, + 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, + 0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d, + 0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3, + 0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9, + 0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de, + 0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523, + 0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549, + 0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c, + /* 0x60 */ + 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c, + 0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f, + 0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594, + 0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec, + 0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3, + 0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608, + 0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d, + 0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c, + 0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c, + 0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5, + 0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f, + 0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c, + /* 0x61 */ + 0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a, + 0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a, + 0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3, + 0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02, + 0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b, + 0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d, + 0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d, + 0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89, + 0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc, + 0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3, + 0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2, + 0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa, + /* 0x62 */ + 0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315, + 0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d, + 0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7, + 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, + 0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a, + 0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91, + 0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3, + 0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4, + 0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4, + 0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035, + 0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f, + 0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042, + /* 0x63 */ + 0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092, + 0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6, + 0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100, + 0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7, + 0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3, + 0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608, + 0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616, + 0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54, + 0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68, + 0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad, + 0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa, + 0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe, + /* 0x64 */ + 0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19, + 0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52, + 0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93, + 0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5, + 0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9, + 0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b, + 0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44, + 0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7, + 0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2, + 0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f, + 0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d, + 0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1, + /* 0x65 */ + 0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde, + 0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f, + 0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f, + 0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07, + 0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6, + 0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d, + 0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051, + 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074, + 0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56, + 0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66, + 0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e, + 0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3, + /* 0x66 */ + 0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af, + 0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8, + 0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13, + 0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec, + 0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2, + 0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8, + 0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15, + 0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75, + 0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85, + 0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b, + 0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7, + 0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9, + /* 0x67 */ + 0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb, + 0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8, + 0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa, + 0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b, + 0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b, + 0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, + 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, + 0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e, + 0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7, + 0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a, + 0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b, + 0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c, + /* 0x68 */ + 0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477, + 0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b, + 0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea, + 0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5, + 0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e, + 0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a, + 0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd, + 0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832, + 0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883, + 0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a, + 0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b, + 0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9, + /* 0x69 */ + 0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971, + 0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966, + 0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4, + 0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff, + 0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e, + 0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28, + 0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337, + 0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d, + 0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72, + 0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c, + 0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b, + /* 0x6a */ + 0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217, + 0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7, + 0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee, + 0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, + 0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, + 0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677, + 0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6, + 0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45, + 0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7, + 0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e, + 0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b, + 0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0, + /* 0x6b */ + 0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9, + 0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a, + 0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b, + 0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c, + 0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4, + 0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4, + 0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4, + 0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a, + 0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153, + 0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d, + 0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5, + 0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb, + /* 0x6c */ + 0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59, + 0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40, + 0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4, + 0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096, + 0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca, + 0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168, + 0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5, + 0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228, + 0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248, + 0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953, + 0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985, + 0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0, + /* 0x6d */ + 0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab, + 0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206, + 0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800, + 0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d, + 0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823, + 0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, + 0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1, + 0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec, + 0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b, + 0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707, + 0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738, + 0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768, + /* 0x6e */ + 0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791, + 0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e, + 0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61, + 0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e, + 0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a, + 0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a, + 0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac, + 0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9, + 0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca, + 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5, + 0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0, + 0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea, + /* 0x6f */ + 0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7, + 0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507, + 0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514, + 0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522, + 0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536, + 0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544, + 0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553, + 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f, + 0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, + 0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573, + 0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb, + 0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14, + /* 0x70 */ + 0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e, + 0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22, + 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36, + 0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44, + 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51, + 0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66, + 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d, + 0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3, + 0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2, + 0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7, + 0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c, + 0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619, + /* 0x71 */ + 0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f, + 0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c, + 0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80, + 0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad, + 0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2, + 0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5, + 0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919, + 0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966, + 0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014, + 0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, + 0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052, + 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, + /* 0x72 */ + 0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e, + 0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c, + 0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b, + 0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6, + 0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9, + 0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0, + 0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707, + 0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e, + 0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729, + 0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760, + 0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764, + 0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2, + /* 0x73 */ + 0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5, + 0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0, + 0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe, + 0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44, + 0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15, + 0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e, + 0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58, + 0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b, + 0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac, + 0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4, + 0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea, + 0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b, + /* 0x74 */ + 0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201, + 0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d, + 0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e, + 0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e, + 0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7, + 0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c, + 0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc, + 0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf, + 0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3, + 0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4, + 0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47, + 0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164, + /* 0x75 */ + 0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172, + 0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2, + 0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba, + 0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5, + 0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde, + 0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3, + 0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f, + 0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35, + 0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a, + 0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94, + 0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98, + 0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc, + /* 0x76 */ + 0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3, + 0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d, + 0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88, + 0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc, + 0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8, + 0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82, + 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90, + 0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f, + 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, + 0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, + 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, + 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb, + /* 0x77 */ + 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5, + 0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c, + 0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2, + 0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc, + 0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45, + 0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d, + 0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb, + 0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23, + 0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92, + 0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf, + 0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c, + 0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44, +}; + +static int +gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 1410) { + if (i < 831) + wc = gb2312_2uni_page21[i]; + } else { + if (i < 8178) + wc = gb2312_2uni_page30[i-1410]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short gb2312_2charset[7445] = { + 0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822, + 0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142, + 0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d, + 0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837, + 0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, + 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, + 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, + 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, + 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, + 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, + 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, + 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, + 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, + 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, + 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, + 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, + 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, + 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, + 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x212a, 0x212c, 0x212e, + 0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179, + 0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, + 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c, + 0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e, + 0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153, + 0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159, + 0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150, + 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, + 0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a, + 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, + 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232, + 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, + 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, + 0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, + 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, + 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, + 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, + 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, + 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, + 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, + 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, + 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, + 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175, + 0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f, + 0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129, + 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, + 0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 0x2421, + 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, + 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, + 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, + 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, + 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, + 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, + 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, + 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, + 0x2472, 0x2473, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, + 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, + 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, + 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, + 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, + 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, + 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, + 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, + 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, + 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, + 0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, + 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, + 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, + 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, + 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266, + 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, + 0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42, + 0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827, + 0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829, + 0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c, + 0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a, + 0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334, + 0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639, + 0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672, + 0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869, + 0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a, + 0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147, + 0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260, + 0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757, + 0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c, + 0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69, + 0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c, + 0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e, + 0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872, + 0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878, + 0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345, + 0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b, + 0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923, + 0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b, + 0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922, + 0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921, + 0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170, + 0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39, + 0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927, + 0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c, + 0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756, + 0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e, + 0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939, + 0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e, + 0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136, + 0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68, + 0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941, + 0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c, + 0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c, + 0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078, + 0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951, + 0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954, + 0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865, + 0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557, + 0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970, + 0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179, + 0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f, + 0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867, + 0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22, + 0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24, + 0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76, + 0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c, + 0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d, + 0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a, + 0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f, + 0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857, + 0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175, + 0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b, + 0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f, + 0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41, + 0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a, + 0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831, + 0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866, + 0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153, + 0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22, + 0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42, + 0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957, + 0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b, + 0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33, + 0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d, + 0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c, + 0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274, + 0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c, + 0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e, + 0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61, + 0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161, + 0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849, + 0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58, + 0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734, + 0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45, + 0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b, + 0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37, + 0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570, + 0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575, + 0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45, + 0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d, + 0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d, + 0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c, + 0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a, + 0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f, + 0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f, + 0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e, + 0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526, + 0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27, + 0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56, + 0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b, + 0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637, + 0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c, + 0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c, + 0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867, + 0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c, + 0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d, + 0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f, + 0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027, + 0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50, + 0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028, + 0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79, + 0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031, + 0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d, + 0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32, + 0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d, + 0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a, + 0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035, + 0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f, + 0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055, + 0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a, + 0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058, + 0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061, + 0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e, + 0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841, + 0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79, + 0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44, + 0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071, + 0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a, + 0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075, + 0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967, + 0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78, + 0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35, + 0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b, + 0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a, + 0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65, + 0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d, + 0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51, + 0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79, + 0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74, + 0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24, + 0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43, + 0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26, + 0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a, + 0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b, + 0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439, + 0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a, + 0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979, + 0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44, + 0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239, + 0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b, + 0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46, + 0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760, + 0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c, + 0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43, + 0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851, + 0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e, + 0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628, + 0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63, + 0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a, + 0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b, + 0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633, + 0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637, + 0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639, + 0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037, + 0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344, + 0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e, + 0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651, + 0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652, + 0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d, + 0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843, + 0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127, + 0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866, + 0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58, + 0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959, + 0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973, + 0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457, + 0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176, + 0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342, + 0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148, + 0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c, + 0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959, + 0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c, + 0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c, + 0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628, + 0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641, + 0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f, + 0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c, + 0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d, + 0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133, + 0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132, + 0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c, + 0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d, + 0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e, + 0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538, + 0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736, + 0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155, + 0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428, + 0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e, + 0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f, + 0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26, + 0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131, + 0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f, + 0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d, + 0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126, + 0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43, + 0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432, + 0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252, + 0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253, + 0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339, + 0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e, + 0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43, + 0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157, + 0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a, + 0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574, + 0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969, + 0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e, + 0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330, + 0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e, + 0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161, + 0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379, + 0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55, + 0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263, + 0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343, + 0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265, + 0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33, + 0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274, + 0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272, + 0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439, + 0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278, + 0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21, + 0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e, + 0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52, + 0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341, + 0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323, + 0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a, + 0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42, + 0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68, + 0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65, + 0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668, + 0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29, + 0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850, + 0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448, + 0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b, + 0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d, + 0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038, + 0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32, + 0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37, + 0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d, + 0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f, + 0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79, + 0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245, + 0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b, + 0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067, + 0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350, + 0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36, + 0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255, + 0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556, + 0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523, + 0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160, + 0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e, + 0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039, + 0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930, + 0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443, + 0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a, + 0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58, + 0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d, + 0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d, + 0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c, + 0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d, + 0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e, + 0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545, + 0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46, + 0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62, + 0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860, + 0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b, + 0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e, + 0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75, + 0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863, + 0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f, + 0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177, + 0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d, + 0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345, + 0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b, + 0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33, + 0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28, + 0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c, + 0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55, + 0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d, + 0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156, + 0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743, + 0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35, + 0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362, + 0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36, + 0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a, + 0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855, + 0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39, + 0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e, + 0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f, + 0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551, + 0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b, + 0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e, + 0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f, + 0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140, + 0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54, + 0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56, + 0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c, + 0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350, + 0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b, + 0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d, + 0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453, + 0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244, + 0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75, + 0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d, + 0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939, + 0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336, + 0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847, + 0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c, + 0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c, + 0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858, + 0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d, + 0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a, + 0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77, + 0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860, + 0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e, + 0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871, + 0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a, + 0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d, + 0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868, + 0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60, + 0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879, + 0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44, + 0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b, + 0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c, + 0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b, + 0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939, + 0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225, + 0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947, + 0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e, + 0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933, + 0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e, + 0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958, + 0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741, + 0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956, + 0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951, + 0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23, + 0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27, + 0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d, + 0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963, + 0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968, + 0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f, + 0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63, + 0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e, + 0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27, + 0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835, + 0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30, + 0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031, + 0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f, + 0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a, + 0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a, + 0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74, + 0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f, + 0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663, + 0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363, + 0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370, + 0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553, + 0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a, + 0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522, + 0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379, + 0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371, + 0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427, + 0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e, + 0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d, + 0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549, + 0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262, + 0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563, + 0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b, + 0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479, + 0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69, + 0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553, + 0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144, + 0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d, + 0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447, + 0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34, + 0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428, + 0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978, + 0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42, + 0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548, + 0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f, + 0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453, + 0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f, + 0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463, + 0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466, + 0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459, + 0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32, + 0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d, + 0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470, + 0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b, + 0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b, + 0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479, + 0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523, + 0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526, + 0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e, + 0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52, + 0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41, + 0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b, + 0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46, + 0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43, + 0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672, + 0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d, + 0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49, + 0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c, + 0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f, + 0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e, + 0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56, + 0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64, + 0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46, + 0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e, + 0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d, + 0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523, + 0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70, + 0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c, + 0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71, + 0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f, + 0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172, + 0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175, + 0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178, + 0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b, + 0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d, + 0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d, + 0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a, + 0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233, + 0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760, + 0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762, + 0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a, + 0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767, + 0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775, + 0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822, + 0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d, + 0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826, + 0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829, + 0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f, + 0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833, + 0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f, + 0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567, + 0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70, + 0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538, + 0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e, + 0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30, + 0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668, + 0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e, + 0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d, + 0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a, + 0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061, + 0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068, + 0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a, + 0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121, + 0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35, + 0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071, + 0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e, + 0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471, + 0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833, + 0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f, + 0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547, + 0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e, + 0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665, + 0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266, + 0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847, + 0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c, + 0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d, + 0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566, + 0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77, + 0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c, + 0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d, + 0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a, + 0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28, + 0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549, + 0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47, + 0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58, + 0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79, + 0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33, + 0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f, + 0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47, + 0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43, + 0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f, + 0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332, + 0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d, + 0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57, + 0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a, + 0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a, + 0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61, + 0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65, + 0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c, + 0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f, + 0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631, + 0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b, + 0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e, + 0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c, + 0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77, + 0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346, + 0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c, + 0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655, + 0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442, + 0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137, + 0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a, + 0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c, + 0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140, + 0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542, + 0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344, + 0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b, + 0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354, + 0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351, + 0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548, + 0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f, + 0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363, + 0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b, + 0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c, + 0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368, + 0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373, + 0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377, + 0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e, + 0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424, + 0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c, + 0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450, + 0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138, + 0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456, + 0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47, + 0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469, + 0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075, + 0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e, + 0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c, + 0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f, + 0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d, + 0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726, + 0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d, + 0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e, + 0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d, + 0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065, + 0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078, + 0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360, + 0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a, + 0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042, + 0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742, + 0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435, + 0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a, + 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75, + 0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757, + 0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f, + 0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37, + 0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643, + 0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c, + 0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a, + 0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370, + 0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462, + 0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467, + 0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c, + 0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167, + 0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b, + 0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172, + 0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922, + 0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178, + 0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31, + 0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41, + 0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326, + 0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47, + 0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42, + 0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50, + 0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f, + 0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a, + 0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248, + 0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d, + 0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460, + 0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45, + 0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622, + 0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68, + 0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e, + 0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465, + 0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232, + 0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22, + 0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b, + 0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b, + 0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428, + 0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66, + 0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f, + 0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255, + 0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435, + 0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d, + 0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575, + 0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842, + 0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c, + 0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66, + 0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47, + 0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b, + 0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48, + 0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26, + 0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65, + 0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322, + 0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751, + 0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57, + 0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b, + 0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e, + 0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75, + 0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073, + 0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859, + 0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271, + 0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31, + 0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37, + 0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a, + 0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35, + 0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d, + 0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43, + 0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162, + 0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49, + 0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46, + 0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47, + 0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870, + 0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450, + 0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c, + 0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72, + 0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f, + 0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d, + 0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e, + 0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35, + 0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e, + 0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21, + 0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a, + 0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35, + 0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37, + 0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59, + 0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40, + 0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f, + 0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67, + 0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f, + 0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141, + 0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239, + 0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b, + 0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249, + 0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254, + 0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f, + 0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258, + 0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f, + 0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261, + 0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a, + 0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279, + 0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b, + 0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322, + 0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329, + 0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321, + 0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328, + 0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864, + 0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a, + 0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62, + 0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344, + 0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c, + 0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064, + 0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b, + 0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261, + 0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150, + 0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153, + 0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152, + 0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e, + 0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a, + 0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68, + 0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, + 0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621, + 0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a, + 0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629, + 0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27, + 0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47, + 0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f, + 0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c, + 0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e, + 0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33, + 0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37, + 0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a, + 0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f, + 0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50, + 0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c, + 0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142, + 0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51, + 0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e, + 0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53, + 0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57, + 0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b, + 0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948, + 0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73, + 0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575, + 0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a, + 0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75, + 0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961, + 0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b, + 0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f, + 0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64, + 0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d, + 0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c, + 0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853, + 0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830, + 0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777, + 0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540, + 0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c, + 0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547, + 0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972, + 0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551, + 0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24, + 0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759, + 0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561, + 0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568, + 0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264, + 0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a, + 0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d, + 0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c, + 0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f, + 0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976, + 0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b, + 0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975, + 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e, + 0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c, + 0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868, + 0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138, + 0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543, + 0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76, + 0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c, + 0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b, + 0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137, + 0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551, + 0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552, + 0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d, + 0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169, + 0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e, + 0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771, + 0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258, + 0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f, + 0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771, + 0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a, + 0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23, + 0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24, + 0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b, + 0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33, + 0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a, + 0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f, + 0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56, + 0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528, + 0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527, + 0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d, + 0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533, + 0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d, + 0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646, + 0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d, + 0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47, + 0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d, + 0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e, + 0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755, + 0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525, + 0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d, + 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58, + 0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d, + 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, + 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75, + 0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33, + 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875, + 0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26, + 0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b, + 0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978, + 0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33, + 0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39, + 0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e, + 0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47, + 0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c, + 0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742, + 0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e, + 0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478, + 0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, + 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60, + 0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, + 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e, + 0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, + 0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64, + 0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b, + 0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444, + 0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156, + 0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359, + 0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66, + 0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768, + 0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d, + 0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b, + 0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449, + 0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d, + 0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874, + 0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125, + 0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145, + 0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643, + 0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163, + 0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570, + 0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a, + 0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632, + 0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352, + 0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731, + 0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737, + 0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b, + 0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233, + 0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67, + 0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d, + 0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224, + 0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226, + 0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b, + 0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b, + 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f, + 0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c, + 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24, + 0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48, + 0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d, + 0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b, + 0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63, + 0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d, + 0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663, + 0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e, + 0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169, + 0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f, + 0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262, + 0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a, + 0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744, + 0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755, + 0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c, + 0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d, + 0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b, + 0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650, + 0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658, + 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f, + 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666, + 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, + 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675, + 0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c, + 0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, + 0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, + 0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379, + 0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c, + 0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039, + 0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69, + 0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045, + 0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b, + 0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052, + 0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059, + 0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234, + 0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762, + 0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c, + 0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773, + 0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d, + 0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777, + 0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e, + 0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636, + 0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928, + 0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325, + 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, + 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, + 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, + 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, + 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, + 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, + 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, + 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, + 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, + 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, + 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, + 0x212b, 0x2169, 0x216a, 0x237e, 0x2324, +}; + +static const Summary16 gb2312_uni2indx_page00[70] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0190 }, { 3, 0x0003 }, + { 5, 0x0000 }, { 5, 0x0080 }, { 6, 0x3703 }, { 13, 0x168c }, + /* 0x0100 */ + { 19, 0x0002 }, { 20, 0x0808 }, { 22, 0x0800 }, { 23, 0x0000 }, + { 23, 0x2000 }, { 24, 0x0000 }, { 24, 0x0800 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x4000 }, { 26, 0x1555 }, { 33, 0x0000 }, { 33, 0x0000 }, + /* 0x0200 */ + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0280 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + /* 0x0300 */ + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0xfffe }, + { 74, 0x03fb }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, + /* 0x0400 */ + { 83, 0x0002 }, { 84, 0xffff }, { 100, 0xffff }, { 116, 0xffff }, + { 132, 0xffff }, { 148, 0x0002 }, +}; +static const Summary16 gb2312_uni2indx_page20[101] = { + /* 0x2000 */ + { 149, 0x0000 }, { 149, 0x3360 }, { 155, 0x0040 }, { 156, 0x080d }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + /* 0x2100 */ + { 160, 0x0008 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0000 }, + { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0fff }, { 174, 0x0000 }, + { 174, 0x0000 }, { 174, 0x000f }, { 178, 0x0000 }, { 178, 0x0000 }, + { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, + /* 0x2200 */ + { 178, 0x8100 }, { 180, 0x6402 }, { 184, 0x4fa1 }, { 192, 0x20f0 }, + { 197, 0x1100 }, { 199, 0x0000 }, { 199, 0xc033 }, { 205, 0x0000 }, + { 205, 0x0000 }, { 205, 0x0200 }, { 206, 0x0020 }, { 207, 0x0000 }, + { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, + /* 0x2300 */ + { 207, 0x0000 }, { 207, 0x0004 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + /* 0x2400 */ + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x03ff }, { 218, 0xfff0 }, + { 230, 0xffff }, { 246, 0x0fff }, { 258, 0x0000 }, { 258, 0x0000 }, + { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, + /* 0x2500 */ + { 258, 0xffff }, { 274, 0xffff }, { 290, 0xffff }, { 306, 0xffff }, + { 322, 0x0fff }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, + { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0003 }, { 336, 0x000c }, + { 338, 0xc8c0 }, { 343, 0x0000 }, { 343, 0x0000 }, { 343, 0x0000 }, + /* 0x2600 */ + { 343, 0x0060 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, + { 345, 0x0005 }, +}; +static const Summary16 gb2312_uni2indx_page30[35] = { + /* 0x3000 */ + { 347, 0xff2f }, { 360, 0x00fb }, { 367, 0x0000 }, { 367, 0x0000 }, + { 367, 0xfffe }, { 382, 0xffff }, { 398, 0xffff }, { 414, 0xffff }, + { 430, 0xffff }, { 446, 0x000f }, { 450, 0xfffe }, { 465, 0xffff }, + { 481, 0xffff }, { 497, 0xffff }, { 513, 0xffff }, { 529, 0x087f }, + /* 0x3100 */ + { 537, 0xffe0 }, { 548, 0xffff }, { 564, 0x03ff }, { 574, 0x0000 }, + { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, + { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, + { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, + /* 0x3200 */ + { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x03ff }, +}; +static const Summary16 gb2312_uni2indx_page4e[1263] = { + /* 0x4e00 */ + { 584, 0x7f8b }, { 595, 0x7f7b }, { 608, 0x3db4 }, { 617, 0xef55 }, + { 628, 0xfba8 }, { 638, 0xf35d }, { 649, 0x0243 }, { 653, 0x400b }, + { 657, 0xfb40 }, { 665, 0x8d3e }, { 674, 0x7bf7 }, { 687, 0x8c2c }, + { 693, 0x6eff }, { 706, 0xe3fa }, { 717, 0x1d3a }, { 725, 0xa8ed }, + /* 0x4f00 */ + { 734, 0xe602 }, { 740, 0xcf83 }, { 749, 0x8cf5 }, { 758, 0x3555 }, + { 766, 0xe048 }, { 771, 0xffab }, { 784, 0x92b9 }, { 792, 0xd859 }, + { 800, 0xab18 }, { 807, 0x2892 }, { 812, 0xd7e9 }, { 823, 0x8020 }, + { 825, 0xc438 }, { 831, 0xf583 }, { 840, 0xe74a }, { 849, 0x450a }, + /* 0x5000 */ + { 854, 0xb000 }, { 857, 0x9714 }, { 864, 0x7762 }, { 873, 0x5400 }, + { 876, 0xd188 }, { 882, 0x1420 }, { 885, 0x1020 }, { 887, 0xc8c0 }, + { 892, 0x2121 }, { 896, 0x0000 }, { 896, 0x13a8 }, { 902, 0x0c04 }, + { 905, 0x8000 }, { 906, 0x0440 }, { 908, 0x70c0 }, { 913, 0x0828 }, + /* 0x5100 */ + { 916, 0x08c0 }, { 919, 0x0004 }, { 920, 0x0002 }, { 921, 0x8000 }, + { 922, 0x2b7b }, { 932, 0x1472 }, { 938, 0x7924 }, { 945, 0x3bfb }, + { 957, 0x3327 }, { 965, 0x1ae4 }, { 972, 0x9835 }, { 979, 0x38ef }, + { 989, 0x9ad1 }, { 997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 }, + /* 0x5200 */ + { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 }, + { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 }, + { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e }, + { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 }, + /* 0x5300 */ + { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 }, + { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb }, + { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 }, + { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef }, + /* 0x5400 */ + { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 }, + { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee }, + { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a }, + { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c }, + /* 0x5500 */ + { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b }, + { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 }, + { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa }, + { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac }, + /* 0x5600 */ + { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 }, + { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 }, + { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 }, + { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 }, + /* 0x5700 */ + { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 }, + { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 }, + { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 }, + { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 }, + /* 0x5800 */ + { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 }, + { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 }, + { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 }, + { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 }, + /* 0x5900 */ + { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 }, + { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 }, + { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 }, + { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 }, + /* 0x5a00 */ + { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 }, + { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 }, + { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c }, + { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 }, + /* 0x5b00 */ + { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 }, + { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b }, + { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 }, + { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 }, + /* 0x5c00 */ + { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 }, + { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 }, + { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa }, + { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 }, + /* 0x5d00 */ + { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 }, + { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 }, + { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 }, + { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e }, + /* 0x5e00 */ + { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 }, + { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c }, + { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 }, + { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 }, + /* 0x5f00 */ + { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 }, + { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b }, + { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 }, + { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 }, + /* 0x6000 */ + { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 }, + { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 }, + { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 }, + { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 }, + /* 0x6100 */ + { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 }, + { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 }, + { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 }, + { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 }, + /* 0x6200 */ + { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 }, + { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 }, + { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 }, + { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da }, + /* 0x6300 */ + { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 }, + { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 }, + { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 }, + { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 }, + /* 0x6400 */ + { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 }, + { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 }, + { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 }, + { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 }, + /* 0x6500 */ + { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 }, + { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 }, + { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 }, + { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 }, + /* 0x6600 */ + { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 }, + { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 }, + { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 }, + { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d }, + /* 0x6700 */ + { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 }, + { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad }, + { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 }, + { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b }, + /* 0x6800 */ + { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c }, + { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 }, + { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 }, + { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 }, + /* 0x6900 */ + { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 }, + { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 }, + { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 }, + { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 }, + /* 0x6a00 */ + { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 }, + { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 }, + { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 }, + { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, + /* 0x6b00 */ + { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 }, + { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 }, + { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 }, + { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 }, + /* 0x6c00 */ + { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 }, + { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 }, + { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e }, + { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb }, + /* 0x6d00 */ + { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e }, + { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 }, + { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 }, + { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a }, + /* 0x6e00 */ + { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 }, + { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 }, + { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 }, + { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 }, + /* 0x6f00 */ + { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a }, + { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 }, + { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 }, + { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 }, + /* 0x7000 */ + { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 }, + { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 }, + { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a }, + { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 }, + /* 0x7100 */ + { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 }, + { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c }, + { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 }, + { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 }, + /* 0x7200 */ + { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 }, + { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 }, + { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 }, + { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f }, + /* 0x7300 */ + { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 }, + { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 }, + { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d }, + { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 }, + /* 0x7400 */ + { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 }, + { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 }, + { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 }, + { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 }, + /* 0x7500 */ + { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf }, + { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 }, + { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f }, + { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 }, + /* 0x7600 */ + { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 }, + { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 }, + { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 }, + { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 }, + /* 0x7700 */ + { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 }, + { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 }, + { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 }, + { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 }, + /* 0x7800 */ + { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 }, + { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 }, + { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f }, + { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 }, + /* 0x7900 */ + { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 }, + { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 }, + { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 }, + { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 }, + /* 0x7a00 */ + { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 }, + { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 }, + { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 }, + { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 }, + /* 0x7b00 */ + { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a }, + { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 }, + { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 }, + { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 }, + /* 0x7c00 */ + { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 }, + { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 }, + { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e }, + { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 }, + /* 0x7d00 */ + { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 }, + { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 }, + { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 }, + { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, + /* 0x7e00 */ + { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 }, + { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 }, + { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef }, + { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff }, + /* 0x7f00 */ + { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f }, + { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 }, + { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 }, + { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b }, + /* 0x8000 */ + { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea }, + { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 }, + { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 }, + { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f }, + /* 0x8100 */ + { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 }, + { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 }, + { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 }, + { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 }, + /* 0x8200 */ + { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb }, + { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d }, + { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b }, + { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 }, + /* 0x8300 */ + { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a }, + { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 }, + { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df }, + { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 }, + /* 0x8400 */ + { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 }, + { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a }, + { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 }, + { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 }, + /* 0x8500 */ + { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 }, + { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 }, + { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 }, + { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 }, + /* 0x8600 */ + { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 }, + { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 }, + { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 }, + { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f }, + /* 0x8700 */ + { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 }, + { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 }, + { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 }, + { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 }, + /* 0x8800 */ + { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 }, + { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 }, + { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 }, + { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b }, + /* 0x8900 */ + { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 }, + { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 }, + { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 }, + { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 }, + /* 0x8a00 */ + { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 }, + { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 }, + { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 }, + { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, + /* 0x8b00 */ + { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 }, + { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 }, + { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd }, + { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff }, + /* 0x8c00 */ + { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff }, + { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 }, + { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 }, + { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, + /* 0x8d00 */ + { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff }, + { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 }, + { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a }, + { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 }, + /* 0x8e00 */ + { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 }, + { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 }, + { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 }, + { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, + /* 0x8f00 */ + { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, + { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff }, + { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 }, + { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 }, + /* 0x9000 */ + { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 }, + { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 }, + { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b }, + { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 }, + /* 0x9100 */ + { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 }, + { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 }, + { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 }, + { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 }, + /* 0x9200 */ + { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, + { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 }, + { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 }, + { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, + /* 0x9300 */ + { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 }, + { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 }, + { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, + { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 }, + /* 0x9400 */ + { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 }, + { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 }, + { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff }, + { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff }, + /* 0x9500 */ + { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 }, + { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f }, + { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, + { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff }, + /* 0x9600 */ + { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e }, + { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 }, + { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 }, + { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 }, + /* 0x9700 */ + { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 }, + { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 }, + { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 }, + { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 }, + /* 0x9800 */ + { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, + { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 }, + { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 }, + { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 }, + /* 0x9900 */ + { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 }, + { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 }, + { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 }, + { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, + /* 0x9a00 */ + { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, + { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb }, + { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 }, + { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 }, + /* 0x9b00 */ + { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 }, + { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 }, + { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, + { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, + /* 0x9c00 */ + { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, + { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 }, + { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff }, + { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 }, +}; +static const Summary16 gb2312_uni2indx_page9e[27] = { + /* 0x9e00 */ + { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee }, + { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b }, + { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 }, + { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 }, + /* 0x9f00 */ + { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 }, + { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 }, + { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 }, +}; +static const Summary16 gb2312_uni2indx_pageff[15] = { + /* 0xff00 */ + { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff }, + { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 }, + { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, + { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b }, +}; + +static int +gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0460) + summary = &gb2312_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x2000 && wc < 0x2650) + summary = &gb2312_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x3000 && wc < 0x3230) + summary = &gb2312_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x4e00 && wc < 0x9cf0) + summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0x9e00 && wc < 0x9fb0) + summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0]; + else if (wc >= 0xff00 && wc < 0xfff0) + summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = gb2312_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/gbk.h b/Externals/libiconv-1.14/lib/gbk.h new file mode 100644 index 0000000000..b6ff526284 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gbk.h @@ -0,0 +1,169 @@ +/* + * Copyright (C) 1999-2001, 2005, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GBK + */ + +/* + * GBK, as described in Ken Lunde's book, is an extension of GB 2312-1980 + * (shifted by adding 0x8080 to the range 0xA1A1..0xFEFE, as used in EUC-CN). + * It adds the following ranges: + * + * (part of GBK/1) 0xA2A1-0xA2AA Small Roman numerals + * GBK/3 0x{81-A0}{40-7E,80-FE} 6080 new characters, all in Unicode + * GBK/4 0x{AA-FE}{40-7E,80-A0} 8160 new characters, 8080 in Unicode + * GBK/5 0x{A8-A9}{40-7E,80-A0} 166 new characters, 153 in Unicode + * + * Furthermore, all four tables I have looked at + * - the CP936 table by Microsoft, found on ftp.unicode.org in 1999, + * - the GBK table by Sun, investigated on a Solaris 2.7 machine, + * - the GBK tables by CWEX, found in the Big5+ package, + * - the GB18030 standard (second printing), + * agree in the following extensions. (Ken Lunde must have overlooked these + * differences between GB2312 and GBK. Also, the CWEX tables have additional + * differences.) + * + * 1. Some characters in the GB2312 range are defined differently: + * + * code GB2312 GBK + * 0xA1A4 0x30FB # KATAKANA MIDDLE DOT 0x00B7 # MIDDLE DOT + * 0xA1AA 0x2015 # HORIZONTAL BAR 0x2014 # EM DASH + * + * 2. 19 characters added in the range 0xA6E0-0xA6F5. + * + * 3. 4 characters added in the range 0xA8BB-0xA8C0. + * + * CP936 as of 1999 was identical to GBK. However, since 1999, Microsoft has + * added new mappings to CP936... + */ + +#include "gbkext1.h" +#include "gbkext2.h" +#include "gbkext_inv.h" +#include "cp936ext.h" + +static int +gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + + if (c >= 0x81 && c < 0xff) { + if (n < 2) + return RET_TOOFEW(0); + if (c >= 0xa1 && c <= 0xf7) { + unsigned char c2 = s[1]; + if (c == 0xa1) { + if (c2 == 0xa4) { + *pwc = 0x00b7; + return 2; + } + if (c2 == 0xaa) { + *pwc = 0x2014; + return 2; + } + } + if (c2 >= 0xa1 && c2 < 0xff) { + unsigned char buf[2]; + int ret; + buf[0] = c-0x80; buf[1] = c2-0x80; + ret = gb2312_mbtowc(conv,pwc,buf,2); + if (ret != RET_ILSEQ) + return ret; + buf[0] = c; buf[1] = c2; + ret = cp936ext_mbtowc(conv,pwc,buf,2); + if (ret != RET_ILSEQ) + return ret; + } + } + if (c >= 0x81 && c <= 0xa0) + return gbkext1_mbtowc(conv,pwc,s,2); + if (c >= 0xa8 && c <= 0xfe) + return gbkext2_mbtowc(conv,pwc,s,2); + if (c == 0xa2) { + unsigned char c2 = s[1]; + if (c2 >= 0xa1 && c2 <= 0xaa) { + *pwc = 0x2170+(c2-0xa1); + return 2; + } + } + } + return RET_ILSEQ; +} + +static int +gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + if (wc != 0x30fb && wc != 0x2015) { + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]+0x80; + r[1] = buf[1]+0x80; + return 2; + } + } + ret = gbkext_inv_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + if (wc >= 0x2170 && wc <= 0x2179) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0xa2; + r[1] = 0xa1 + (wc-0x2170); + return 2; + } + ret = cp936ext_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + if (wc == 0x00b7) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0xa1; + r[1] = 0xa4; + return 2; + } + if (wc == 0x2014) { + if (n < 2) + return RET_TOOSMALL; + r[0] = 0xa1; + r[1] = 0xaa; + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/gbkext1.h b/Externals/libiconv-1.14/lib/gbkext1.h new file mode 100644 index 0000000000..d244c7695e --- /dev/null +++ b/Externals/libiconv-1.14/lib/gbkext1.h @@ -0,0 +1,853 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GBK/3 extensions + */ + +static const unsigned short gbkext1_2uni_page81[6080] = { + /* 0x81 */ + 0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f, + 0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31, + 0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44, + 0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62, + 0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c, + 0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77, + 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80, + 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, 0x4e90, + 0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3, 0x4eaa, + 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9, + 0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0, 0x4ed2, + 0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7, 0x4ee9, + 0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9, 0x4efa, + 0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, + 0x4f07, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f13, 0x4f14, 0x4f15, + 0x4f16, 0x4f1c, 0x4f1d, 0x4f21, 0x4f23, 0x4f28, 0x4f29, 0x4f2c, + 0x4f2d, 0x4f2e, 0x4f31, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, + 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f44, 0x4f45, 0x4f47, + 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, + 0x4f61, 0x4f62, 0x4f66, 0x4f68, 0x4f6a, 0x4f6b, 0x4f6d, 0x4f6e, + 0x4f71, 0x4f72, 0x4f75, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, + 0x4f80, 0x4f81, 0x4f82, 0x4f85, 0x4f86, 0x4f87, 0x4f8a, 0x4f8c, + 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f95, 0x4f96, 0x4f98, 0x4f99, + 0x4f9a, 0x4f9c, 0x4f9e, 0x4f9f, 0x4fa1, 0x4fa2, + /* 0x82 */ + 0x4fa4, 0x4fab, 0x4fad, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, + 0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, + 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc6, 0x4fc7, 0x4fc8, 0x4fc9, + 0x4fcb, 0x4fcc, 0x4fcd, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, + 0x4fd9, 0x4fdb, 0x4fe0, 0x4fe2, 0x4fe4, 0x4fe5, 0x4fe7, 0x4feb, + 0x4fec, 0x4ff0, 0x4ff2, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff9, + 0x4ffb, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003, + 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500a, 0x500b, + 0x500e, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501b, + 0x501d, 0x501e, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502b, + 0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, + 0x5037, 0x5038, 0x5039, 0x503b, 0x503d, 0x503f, 0x5040, 0x5041, + 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504a, 0x504b, 0x504d, + 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, + 0x5059, 0x505b, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, + 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, + 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, + 0x5075, 0x5078, 0x5079, 0x507a, 0x507c, 0x507d, 0x5081, 0x5082, + 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508a, 0x508b, 0x508c, + 0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, + 0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, + 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a4, 0x50a6, 0x50aa, + 0x50ab, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b3, 0x50b4, + 0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50bc, + /* 0x83 */ + 0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, + 0x50c5, 0x50c6, 0x50c7, 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, + 0x50cd, 0x50ce, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, + 0x50d7, 0x50d8, 0x50d9, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, + 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e8, 0x50e9, + 0x50ea, 0x50eb, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f4, 0x50f6, + 0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fc, 0x50fd, 0x50fe, 0x50ff, + 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x5109, + 0x510a, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5113, + 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b, + 0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5122, 0x5123, 0x5124, + 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, + 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, + 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, + 0x513d, 0x513e, 0x5142, 0x5147, 0x514a, 0x514c, 0x514e, 0x514f, + 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515b, 0x515d, + 0x515e, 0x515f, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, + 0x5169, 0x516a, 0x516f, 0x5172, 0x517a, 0x517e, 0x517f, 0x5183, + 0x5184, 0x5186, 0x5187, 0x518a, 0x518b, 0x518e, 0x518f, 0x5190, + 0x5191, 0x5193, 0x5194, 0x5198, 0x519a, 0x519d, 0x519e, 0x519f, + 0x51a1, 0x51a3, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ad, + 0x51ae, 0x51b4, 0x51b8, 0x51b9, 0x51ba, 0x51be, 0x51bf, 0x51c1, + 0x51c2, 0x51c3, 0x51c5, 0x51c8, 0x51ca, 0x51cd, 0x51ce, 0x51d0, + 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, + /* 0x84 */ + 0x51d8, 0x51d9, 0x51da, 0x51dc, 0x51de, 0x51df, 0x51e2, 0x51e3, + 0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51ec, 0x51ee, + 0x51f1, 0x51f2, 0x51f4, 0x51f7, 0x51fe, 0x5204, 0x5205, 0x5209, + 0x520b, 0x520c, 0x520f, 0x5210, 0x5213, 0x5214, 0x5215, 0x521c, + 0x521e, 0x521f, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, + 0x522a, 0x522c, 0x522f, 0x5231, 0x5232, 0x5234, 0x5235, 0x523c, + 0x523e, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524b, + 0x524e, 0x524f, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259, + 0x525a, 0x525b, 0x525d, 0x525f, 0x5260, 0x5262, 0x5263, 0x5264, + 0x5266, 0x5268, 0x526b, 0x526c, 0x526d, 0x526e, 0x5270, 0x5271, + 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a, + 0x527b, 0x527c, 0x527e, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, + 0x5287, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, + 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, + 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52ae, 0x52af, + 0x52b0, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba, + 0x52bb, 0x52bc, 0x52bd, 0x52c0, 0x52c1, 0x52c2, 0x52c4, 0x52c5, + 0x52c6, 0x52c8, 0x52ca, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d1, + 0x52d3, 0x52d4, 0x52d5, 0x52d7, 0x52d9, 0x52da, 0x52db, 0x52dc, + 0x52dd, 0x52de, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e5, 0x52e6, + 0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, + 0x52ef, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, + 0x52f8, 0x52fb, 0x52fc, 0x52fd, 0x5301, 0x5302, 0x5303, 0x5304, + 0x5307, 0x5309, 0x530a, 0x530b, 0x530c, 0x530e, + /* 0x85 */ + 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531b, 0x531c, 0x531e, + 0x531f, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, + 0x532c, 0x532d, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, + 0x5335, 0x5336, 0x5337, 0x5338, 0x533c, 0x533d, 0x5340, 0x5342, + 0x5344, 0x5346, 0x534b, 0x534c, 0x534d, 0x5350, 0x5354, 0x5358, + 0x5359, 0x535b, 0x535d, 0x5365, 0x5368, 0x536a, 0x536c, 0x536d, + 0x5372, 0x5376, 0x5379, 0x537b, 0x537c, 0x537d, 0x537e, 0x5380, + 0x5381, 0x5383, 0x5387, 0x5388, 0x538a, 0x538e, 0x538f, 0x5390, + 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539b, + 0x539c, 0x539e, 0x53a0, 0x53a1, 0x53a4, 0x53a7, 0x53aa, 0x53ab, + 0x53ac, 0x53ad, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, + 0x53b5, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bc, 0x53bd, 0x53be, + 0x53c0, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, 0x53ce, 0x53cf, + 0x53d0, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dc, 0x53dd, 0x53de, + 0x53e1, 0x53e2, 0x53e7, 0x53f4, 0x53fa, 0x53fe, 0x53ff, 0x5400, + 0x5402, 0x5405, 0x5407, 0x540b, 0x5414, 0x5418, 0x5419, 0x541a, + 0x541c, 0x5422, 0x5424, 0x5425, 0x542a, 0x5430, 0x5433, 0x5436, + 0x5437, 0x543a, 0x543d, 0x543f, 0x5441, 0x5442, 0x5444, 0x5445, + 0x5447, 0x5449, 0x544c, 0x544d, 0x544e, 0x544f, 0x5451, 0x545a, + 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, + 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470, + 0x5474, 0x5479, 0x547a, 0x547e, 0x547f, 0x5481, 0x5483, 0x5485, + 0x5487, 0x5488, 0x5489, 0x548a, 0x548d, 0x5491, 0x5493, 0x5497, + 0x5498, 0x549c, 0x549e, 0x549f, 0x54a0, 0x54a1, + /* 0x86 */ + 0x54a2, 0x54a5, 0x54ae, 0x54b0, 0x54b2, 0x54b5, 0x54b6, 0x54b7, + 0x54b9, 0x54ba, 0x54bc, 0x54be, 0x54c3, 0x54c5, 0x54ca, 0x54cb, + 0x54d6, 0x54d8, 0x54db, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, + 0x54eb, 0x54ec, 0x54ef, 0x54f0, 0x54f1, 0x54f4, 0x54f5, 0x54f6, + 0x54f7, 0x54f8, 0x54f9, 0x54fb, 0x54fe, 0x5500, 0x5502, 0x5503, + 0x5504, 0x5505, 0x5508, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, + 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a, + 0x551c, 0x551d, 0x551e, 0x551f, 0x5521, 0x5525, 0x5526, 0x5528, + 0x5529, 0x552b, 0x552d, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, + 0x5539, 0x553a, 0x553b, 0x553d, 0x5540, 0x5542, 0x5545, 0x5547, + 0x5548, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5551, 0x5552, + 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555d, + 0x555e, 0x555f, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556b, + 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557a, + 0x557d, 0x557f, 0x5585, 0x5586, 0x558c, 0x558d, 0x558e, 0x5590, + 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559a, 0x559b, 0x559e, + 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a8, + 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0, + 0x55b2, 0x55b4, 0x55b6, 0x55b8, 0x55ba, 0x55bc, 0x55bf, 0x55c0, + 0x55c1, 0x55c2, 0x55c3, 0x55c6, 0x55c7, 0x55c8, 0x55ca, 0x55cb, + 0x55ce, 0x55cf, 0x55d0, 0x55d5, 0x55d7, 0x55d8, 0x55d9, 0x55da, + 0x55db, 0x55de, 0x55e0, 0x55e2, 0x55e7, 0x55e9, 0x55ed, 0x55ee, + 0x55f0, 0x55f1, 0x55f4, 0x55f6, 0x55f8, 0x55f9, 0x55fa, 0x55fb, + 0x55fc, 0x55ff, 0x5602, 0x5603, 0x5604, 0x5605, + /* 0x87 */ + 0x5606, 0x5607, 0x560a, 0x560b, 0x560d, 0x5610, 0x5611, 0x5612, + 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561a, 0x561c, + 0x561d, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, + 0x562a, 0x562b, 0x562e, 0x562f, 0x5630, 0x5633, 0x5635, 0x5637, + 0x5638, 0x563a, 0x563c, 0x563d, 0x563e, 0x5640, 0x5641, 0x5642, + 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564a, + 0x564b, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, + 0x565a, 0x565b, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5663, + 0x5665, 0x5666, 0x5667, 0x566d, 0x566e, 0x566f, 0x5670, 0x5672, + 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567a, 0x567d, + 0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, + 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x5690, 0x5691, + 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a, + 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2, + 0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab, + 0x56ac, 0x56ad, 0x56ae, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, + 0x56b5, 0x56b6, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bd, 0x56be, + 0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, + 0x56c7, 0x56c8, 0x56c9, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, + 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d5, 0x56d6, 0x56d8, 0x56d9, + 0x56dc, 0x56e3, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea, + 0x56ec, 0x56ee, 0x56ef, 0x56f2, 0x56f3, 0x56f6, 0x56f7, 0x56f8, + 0x56fb, 0x56fc, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570b, + 0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711, + /* 0x88 */ + 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, + 0x571a, 0x571b, 0x571d, 0x571e, 0x5720, 0x5721, 0x5722, 0x5724, + 0x5725, 0x5726, 0x5727, 0x572b, 0x5731, 0x5732, 0x5734, 0x5735, + 0x5736, 0x5737, 0x5738, 0x573c, 0x573d, 0x573f, 0x5741, 0x5743, + 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574b, 0x5752, 0x5753, + 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, + 0x5767, 0x576c, 0x576e, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, + 0x5778, 0x5779, 0x577a, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781, + 0x5787, 0x5788, 0x5789, 0x578a, 0x578d, 0x578e, 0x578f, 0x5790, + 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a, + 0x579c, 0x579d, 0x579e, 0x579f, 0x57a5, 0x57a8, 0x57aa, 0x57ac, + 0x57af, 0x57b0, 0x57b1, 0x57b3, 0x57b5, 0x57b6, 0x57b7, 0x57b9, + 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1, + 0x57c4, 0x57c5, 0x57c6, 0x57c7, 0x57c8, 0x57c9, 0x57ca, 0x57cc, + 0x57cd, 0x57d0, 0x57d1, 0x57d3, 0x57d6, 0x57d7, 0x57db, 0x57dc, + 0x57de, 0x57e1, 0x57e2, 0x57e3, 0x57e5, 0x57e6, 0x57e7, 0x57e8, + 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ee, 0x57f0, 0x57f1, 0x57f2, + 0x57f3, 0x57f5, 0x57f6, 0x57f7, 0x57fb, 0x57fc, 0x57fe, 0x57ff, + 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580a, 0x580c, + 0x580e, 0x580f, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, + 0x5818, 0x581a, 0x581b, 0x581c, 0x581d, 0x581f, 0x5822, 0x5823, + 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582b, 0x582c, 0x582d, + 0x582e, 0x582f, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, + 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, + /* 0x89 */ + 0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584e, 0x584f, 0x5850, + 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585a, 0x585b, + 0x585c, 0x585d, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, + 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586d, 0x586e, 0x586f, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587f, 0x5882, + 0x5884, 0x5886, 0x5887, 0x5888, 0x588a, 0x588b, 0x588c, 0x588d, + 0x588e, 0x588f, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, + 0x5898, 0x589b, 0x589c, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a3, + 0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58aa, 0x58ab, 0x58ac, 0x58ad, + 0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, + 0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bd, 0x58be, + 0x58bf, 0x58c0, 0x58c2, 0x58c3, 0x58c4, 0x58c6, 0x58c7, 0x58c8, + 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0, + 0x58d2, 0x58d3, 0x58d4, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da, + 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2, + 0x58e3, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58ed, + 0x58ef, 0x58f1, 0x58f2, 0x58f4, 0x58f5, 0x58f7, 0x58f8, 0x58fa, + 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5903, + 0x5905, 0x5906, 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590e, + 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591b, 0x591d, + 0x591e, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592c, + 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593b, + /* 0x8a */ + 0x593d, 0x593e, 0x593f, 0x5940, 0x5943, 0x5945, 0x5946, 0x594a, + 0x594c, 0x594d, 0x5950, 0x5952, 0x5953, 0x5959, 0x595b, 0x595c, + 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, + 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, + 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597a, 0x597b, 0x597c, + 0x597e, 0x597f, 0x5980, 0x5985, 0x5989, 0x598b, 0x598c, 0x598e, + 0x598f, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599a, 0x599b, + 0x599c, 0x599d, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a6, 0x59a7, + 0x59ac, 0x59ad, 0x59b0, 0x59b1, 0x59b3, 0x59b4, 0x59b5, 0x59b6, + 0x59b7, 0x59b8, 0x59ba, 0x59bc, 0x59bd, 0x59bf, 0x59c0, 0x59c1, + 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c7, 0x59c8, 0x59c9, 0x59cc, + 0x59cd, 0x59ce, 0x59cf, 0x59d5, 0x59d6, 0x59d9, 0x59db, 0x59de, + 0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e4, 0x59e6, 0x59e7, 0x59e9, + 0x59ea, 0x59eb, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2, + 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59fa, 0x59fc, + 0x59fd, 0x59fe, 0x5a00, 0x5a02, 0x5a0a, 0x5a0b, 0x5a0d, 0x5a0e, + 0x5a0f, 0x5a10, 0x5a12, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a19, + 0x5a1a, 0x5a1b, 0x5a1d, 0x5a1e, 0x5a21, 0x5a22, 0x5a24, 0x5a26, + 0x5a27, 0x5a28, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, + 0x5a30, 0x5a33, 0x5a35, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, + 0x5a3d, 0x5a3e, 0x5a3f, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, + 0x5a47, 0x5a48, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, + 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a56, 0x5a57, 0x5a58, 0x5a59, + 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, + /* 0x8b */ + 0x5a61, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a68, 0x5a69, 0x5a6b, + 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, + 0x5a78, 0x5a79, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a80, 0x5a81, + 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, 0x5a88, 0x5a89, + 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91, + 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9c, + 0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, + 0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aab, 0x5aac, 0x5aad, + 0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab4, 0x5ab6, 0x5ab7, 0x5ab9, + 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abf, 0x5ac0, 0x5ac3, 0x5ac4, + 0x5ac5, 0x5ac6, 0x5ac7, 0x5ac8, 0x5aca, 0x5acb, 0x5acd, 0x5ace, + 0x5acf, 0x5ad0, 0x5ad1, 0x5ad3, 0x5ad5, 0x5ad7, 0x5ad9, 0x5ada, + 0x5adb, 0x5add, 0x5ade, 0x5adf, 0x5ae2, 0x5ae4, 0x5ae5, 0x5ae7, + 0x5ae8, 0x5aea, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af2, + 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa, + 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02, + 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, 0x5b08, 0x5b0a, 0x5b0b, + 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13, + 0x5b14, 0x5b15, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, + 0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, + 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, + 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b33, 0x5b35, 0x5b36, 0x5b38, + 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b41, + 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, + /* 0x8c */ + 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, + 0x5b52, 0x5b56, 0x5b5e, 0x5b60, 0x5b61, 0x5b67, 0x5b68, 0x5b6b, + 0x5b6d, 0x5b6e, 0x5b6f, 0x5b72, 0x5b74, 0x5b76, 0x5b77, 0x5b78, + 0x5b79, 0x5b7b, 0x5b7c, 0x5b7e, 0x5b7f, 0x5b82, 0x5b86, 0x5b8a, + 0x5b8d, 0x5b8e, 0x5b90, 0x5b91, 0x5b92, 0x5b94, 0x5b96, 0x5b9f, + 0x5ba7, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb1, + 0x5bb2, 0x5bb7, 0x5bba, 0x5bbb, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bc3, + 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd1, + 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, + 0x5bdc, 0x5be0, 0x5be2, 0x5be3, 0x5be6, 0x5be7, 0x5be9, 0x5bea, + 0x5beb, 0x5bec, 0x5bed, 0x5bef, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, + 0x5bf5, 0x5bf6, 0x5bf7, 0x5bfd, 0x5bfe, 0x5c00, 0x5c02, 0x5c03, + 0x5c05, 0x5c07, 0x5c08, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c10, + 0x5c12, 0x5c13, 0x5c17, 0x5c19, 0x5c1b, 0x5c1e, 0x5c1f, 0x5c20, + 0x5c21, 0x5c23, 0x5c26, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2d, + 0x5c2e, 0x5c2f, 0x5c30, 0x5c32, 0x5c33, 0x5c35, 0x5c36, 0x5c37, + 0x5c43, 0x5c44, 0x5c46, 0x5c47, 0x5c4c, 0x5c4d, 0x5c52, 0x5c53, + 0x5c54, 0x5c56, 0x5c57, 0x5c58, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, + 0x5c5f, 0x5c62, 0x5c64, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, + 0x5c6c, 0x5c6d, 0x5c70, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, + 0x5c77, 0x5c78, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c80, 0x5c83, + 0x5c84, 0x5c85, 0x5c86, 0x5c87, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8e, + 0x5c8f, 0x5c92, 0x5c93, 0x5c95, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0, + 0x5ca1, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8, + /* 0x8d */ + 0x5caa, 0x5cae, 0x5caf, 0x5cb0, 0x5cb2, 0x5cb4, 0x5cb6, 0x5cb9, + 0x5cba, 0x5cbb, 0x5cbc, 0x5cbe, 0x5cc0, 0x5cc2, 0x5cc3, 0x5cc5, + 0x5cc6, 0x5cc7, 0x5cc8, 0x5cc9, 0x5cca, 0x5ccc, 0x5ccd, 0x5cce, + 0x5ccf, 0x5cd0, 0x5cd1, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, + 0x5cd8, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0, + 0x5ce2, 0x5ce3, 0x5ce7, 0x5ce9, 0x5ceb, 0x5cec, 0x5cee, 0x5cef, + 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8, + 0x5cf9, 0x5cfa, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01, + 0x5d04, 0x5d05, 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, + 0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d15, 0x5d17, 0x5d18, + 0x5d19, 0x5d1a, 0x5d1c, 0x5d1d, 0x5d1f, 0x5d20, 0x5d21, 0x5d22, + 0x5d23, 0x5d25, 0x5d28, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2f, 0x5d30, + 0x5d31, 0x5d32, 0x5d33, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, + 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, + 0x5d44, 0x5d45, 0x5d46, 0x5d48, 0x5d49, 0x5d4d, 0x5d4e, 0x5d4f, + 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, + 0x5d59, 0x5d5a, 0x5d5c, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, + 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d6a, 0x5d6d, + 0x5d6e, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d75, 0x5d76, 0x5d77, + 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, + 0x5d80, 0x5d81, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, 0x5d88, + 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90, + 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98, + 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9e, 0x5d9f, 0x5da0, + /* 0x8e */ + 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8, + 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0, + 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db8, 0x5db9, + 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1, + 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc6, 0x5dc7, 0x5dc8, 0x5dc9, 0x5dca, + 0x5dcb, 0x5dcc, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, + 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddc, + 0x5ddf, 0x5de0, 0x5de3, 0x5de4, 0x5dea, 0x5dec, 0x5ded, 0x5df0, + 0x5df5, 0x5df6, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dff, + 0x5e00, 0x5e04, 0x5e07, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0d, 0x5e0e, + 0x5e12, 0x5e13, 0x5e17, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22, + 0x5e23, 0x5e24, 0x5e25, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, + 0x5e2f, 0x5e30, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e39, + 0x5e3a, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e43, 0x5e46, 0x5e47, + 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50, + 0x5e51, 0x5e52, 0x5e53, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, + 0x5e5c, 0x5e5d, 0x5e5f, 0x5e60, 0x5e63, 0x5e64, 0x5e65, 0x5e66, + 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, + 0x5e6f, 0x5e70, 0x5e71, 0x5e75, 0x5e77, 0x5e79, 0x5e7e, 0x5e81, + 0x5e82, 0x5e83, 0x5e85, 0x5e88, 0x5e89, 0x5e8c, 0x5e8d, 0x5e8e, + 0x5e92, 0x5e98, 0x5e9b, 0x5e9d, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, + 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5eae, 0x5eaf, 0x5eb0, + 0x5eb1, 0x5eb2, 0x5eb4, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebf, + 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, + /* 0x8f */ + 0x5ec6, 0x5ec7, 0x5ec8, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, + 0x5ed0, 0x5ed4, 0x5ed5, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edc, + 0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, + 0x5ee5, 0x5ee6, 0x5ee7, 0x5ee9, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, + 0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef5, 0x5ef8, 0x5ef9, + 0x5efb, 0x5efc, 0x5efd, 0x5f05, 0x5f06, 0x5f07, 0x5f09, 0x5f0c, + 0x5f0d, 0x5f0e, 0x5f10, 0x5f12, 0x5f14, 0x5f16, 0x5f19, 0x5f1a, + 0x5f1c, 0x5f1d, 0x5f1e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, + 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f32, 0x5f33, 0x5f34, 0x5f35, + 0x5f36, 0x5f37, 0x5f38, 0x5f3b, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f41, + 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, + 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f51, 0x5f54, + 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5e, 0x5f5f, 0x5f60, 0x5f63, + 0x5f65, 0x5f67, 0x5f68, 0x5f6b, 0x5f6e, 0x5f6f, 0x5f72, 0x5f74, + 0x5f75, 0x5f76, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f83, + 0x5f86, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f91, 0x5f93, 0x5f94, 0x5f96, + 0x5f9a, 0x5f9b, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa2, 0x5fa3, + 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa9, 0x5fab, 0x5fac, 0x5faf, + 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb6, 0x5fb8, 0x5fb9, + 0x5fba, 0x5fbb, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc7, + 0x5fc8, 0x5fca, 0x5fcb, 0x5fce, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fda, + 0x5fdb, 0x5fdc, 0x5fde, 0x5fdf, 0x5fe2, 0x5fe3, 0x5fe5, 0x5fe6, + 0x5fe8, 0x5fe9, 0x5fec, 0x5fef, 0x5ff0, 0x5ff2, 0x5ff3, 0x5ff4, + 0x5ff6, 0x5ff7, 0x5ff9, 0x5ffa, 0x5ffc, 0x6007, + /* 0x90 */ + 0x6008, 0x6009, 0x600b, 0x600c, 0x6010, 0x6011, 0x6013, 0x6017, + 0x6018, 0x601a, 0x601e, 0x601f, 0x6022, 0x6023, 0x6024, 0x602c, + 0x602d, 0x602e, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, + 0x6037, 0x6038, 0x6039, 0x603a, 0x603d, 0x603e, 0x6040, 0x6044, + 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604c, 0x604e, + 0x604f, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605b, + 0x605c, 0x605e, 0x605f, 0x6060, 0x6061, 0x6065, 0x6066, 0x606e, + 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607e, 0x6080, 0x6081, + 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608a, 0x608b, 0x608e, + 0x608f, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, + 0x609c, 0x609e, 0x60a1, 0x60a2, 0x60a4, 0x60a5, 0x60a7, 0x60a9, + 0x60aa, 0x60ae, 0x60b0, 0x60b3, 0x60b5, 0x60b6, 0x60b7, 0x60b9, + 0x60ba, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3, + 0x60c4, 0x60c7, 0x60c8, 0x60c9, 0x60cc, 0x60cd, 0x60ce, 0x60cf, + 0x60d0, 0x60d2, 0x60d3, 0x60d4, 0x60d6, 0x60d7, 0x60d9, 0x60db, + 0x60de, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60ea, 0x60f1, + 0x60f2, 0x60f5, 0x60f7, 0x60f8, 0x60fb, 0x60fc, 0x60fd, 0x60fe, + 0x60ff, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610a, 0x610b, + 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, + 0x6118, 0x6119, 0x611b, 0x611c, 0x611d, 0x611e, 0x6121, 0x6122, + 0x6125, 0x6128, 0x6129, 0x612a, 0x612c, 0x612d, 0x612e, 0x612f, + 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, + 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x6140, + 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, + /* 0x91 */ + 0x6147, 0x6149, 0x614b, 0x614d, 0x614f, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, + 0x615e, 0x615f, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, + 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6171, + 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617a, 0x617b, + 0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618c, + 0x618d, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, + 0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619e, 0x619f, + 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61aa, + 0x61ab, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3, + 0x61b4, 0x61b5, 0x61b6, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, + 0x61bd, 0x61bf, 0x61c0, 0x61c1, 0x61c3, 0x61c4, 0x61c5, 0x61c6, + 0x61c7, 0x61c9, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d3, + 0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, + 0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, + 0x61e5, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, + 0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f6, + 0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, + 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, + 0x6213, 0x6214, 0x6219, 0x621c, 0x621d, 0x621e, 0x6220, 0x6223, + 0x6226, 0x6227, 0x6228, 0x6229, 0x622b, 0x622d, 0x622f, 0x6230, + 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623a, 0x623b, + 0x623c, 0x6242, 0x6244, 0x6245, 0x6246, 0x624a, + /* 0x92 */ + 0x624f, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625a, 0x625c, + 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, + 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627a, + 0x627b, 0x627d, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, + 0x6288, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6294, + 0x6299, 0x629c, 0x629d, 0x629e, 0x62a3, 0x62a6, 0x62a7, 0x62a9, + 0x62aa, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b2, 0x62b3, 0x62b4, + 0x62b6, 0x62b7, 0x62b8, 0x62ba, 0x62be, 0x62c0, 0x62c1, 0x62c3, + 0x62cb, 0x62cf, 0x62d1, 0x62d5, 0x62dd, 0x62de, 0x62e0, 0x62e1, + 0x62e4, 0x62ea, 0x62eb, 0x62f0, 0x62f2, 0x62f5, 0x62f8, 0x62f9, + 0x62fa, 0x62fb, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630a, + 0x630b, 0x630c, 0x630d, 0x630f, 0x6310, 0x6312, 0x6313, 0x6314, + 0x6315, 0x6317, 0x6318, 0x6319, 0x631c, 0x6326, 0x6327, 0x6329, + 0x632c, 0x632d, 0x632e, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, + 0x6336, 0x6337, 0x6338, 0x633b, 0x633c, 0x633e, 0x633f, 0x6340, + 0x6341, 0x6344, 0x6347, 0x6348, 0x634a, 0x6351, 0x6352, 0x6353, + 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, + 0x635d, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636a, 0x636b, + 0x636c, 0x636f, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, + 0x6379, 0x637c, 0x637d, 0x637e, 0x637f, 0x6381, 0x6383, 0x6384, + 0x6385, 0x6386, 0x638b, 0x638d, 0x6391, 0x6393, 0x6394, 0x6395, + 0x6397, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, + 0x63a1, 0x63a4, 0x63a6, 0x63ab, 0x63af, 0x63b1, 0x63b2, 0x63b5, + 0x63b6, 0x63b9, 0x63bb, 0x63bd, 0x63bf, 0x63c0, + /* 0x93 */ + 0x63c1, 0x63c2, 0x63c3, 0x63c5, 0x63c7, 0x63c8, 0x63ca, 0x63cb, + 0x63cc, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63d7, 0x63d8, 0x63d9, + 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63df, 0x63e2, 0x63e4, 0x63e5, + 0x63e6, 0x63e7, 0x63e8, 0x63eb, 0x63ec, 0x63ee, 0x63ef, 0x63f0, + 0x63f1, 0x63f3, 0x63f5, 0x63f7, 0x63f9, 0x63fa, 0x63fb, 0x63fc, + 0x63fe, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640a, + 0x640d, 0x640e, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, + 0x6419, 0x641a, 0x641d, 0x641f, 0x6422, 0x6423, 0x6424, 0x6425, + 0x6427, 0x6428, 0x6429, 0x642b, 0x642e, 0x642f, 0x6430, 0x6431, + 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643b, + 0x643c, 0x643e, 0x6440, 0x6442, 0x6443, 0x6449, 0x644b, 0x644c, + 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, + 0x6457, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, + 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646a, + 0x646b, 0x646c, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, + 0x6474, 0x6475, 0x6476, 0x6477, 0x647b, 0x647c, 0x647d, 0x647e, + 0x647f, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648a, + 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6493, 0x6494, + 0x6497, 0x6498, 0x649a, 0x649b, 0x649c, 0x649d, 0x649f, 0x64a0, + 0x64a1, 0x64a2, 0x64a3, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64aa, + 0x64ab, 0x64af, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b6, 0x64b9, + 0x64bb, 0x64bd, 0x64be, 0x64bf, 0x64c1, 0x64c3, 0x64c4, 0x64c6, + 0x64c7, 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cf, 0x64d1, + 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d9, 0x64da, + /* 0x94 */ + 0x64db, 0x64dc, 0x64dd, 0x64df, 0x64e0, 0x64e1, 0x64e3, 0x64e5, + 0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, + 0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, + 0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, + 0x64ff, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, + 0x6508, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510, + 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651a, + 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522, + 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652c, + 0x652d, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653a, 0x653c, + 0x653d, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, + 0x654a, 0x654b, 0x654d, 0x654e, 0x6550, 0x6552, 0x6553, 0x6554, + 0x6557, 0x6558, 0x655a, 0x655c, 0x655f, 0x6560, 0x6561, 0x6564, + 0x6565, 0x6567, 0x6568, 0x6569, 0x656a, 0x656d, 0x656e, 0x656f, + 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657a, 0x657b, + 0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583, + 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658a, 0x658d, 0x658e, + 0x658f, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659a, 0x659d, + 0x659e, 0x65a0, 0x65a2, 0x65a3, 0x65a6, 0x65a8, 0x65aa, 0x65ac, + 0x65ae, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, + 0x65b8, 0x65ba, 0x65bb, 0x65be, 0x65bf, 0x65c0, 0x65c2, 0x65c7, + 0x65c8, 0x65c9, 0x65ca, 0x65cd, 0x65d0, 0x65d1, 0x65d3, 0x65d4, + 0x65d5, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, + 0x65df, 0x65e1, 0x65e3, 0x65e4, 0x65ea, 0x65eb, + /* 0x95 */ + 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f8, 0x65f9, 0x65fb, 0x65fc, + 0x65fd, 0x65fe, 0x65ff, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660b, 0x660d, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, + 0x6618, 0x661a, 0x661b, 0x661c, 0x661e, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, + 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663d, + 0x663f, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, + 0x6649, 0x664a, 0x664d, 0x664e, 0x6650, 0x6651, 0x6658, 0x6659, + 0x665b, 0x665c, 0x665d, 0x665e, 0x6660, 0x6662, 0x6663, 0x6665, + 0x6667, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x6671, 0x6672, + 0x6673, 0x6675, 0x6678, 0x6679, 0x667b, 0x667c, 0x667d, 0x667f, + 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668a, + 0x668b, 0x668d, 0x668e, 0x668f, 0x6690, 0x6692, 0x6693, 0x6694, + 0x6695, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669e, 0x669f, + 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a9, + 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66af, 0x66b0, 0x66b1, 0x66b2, + 0x66b3, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66ba, 0x66bb, 0x66bc, + 0x66bd, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, + 0x66c6, 0x66c7, 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, + 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, + 0x66d6, 0x66d7, 0x66d8, 0x66da, 0x66de, 0x66df, 0x66e0, 0x66e1, + 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e7, 0x66e8, 0x66ea, 0x66eb, + 0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f1, 0x66f5, 0x66f6, 0x66f8, + 0x66fa, 0x66fb, 0x66fd, 0x6701, 0x6702, 0x6703, + /* 0x96 */ + 0x6704, 0x6705, 0x6706, 0x6707, 0x670c, 0x670e, 0x670f, 0x6711, + 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671a, 0x671c, 0x671e, + 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, + 0x672e, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, + 0x673b, 0x673c, 0x673e, 0x673f, 0x6741, 0x6744, 0x6745, 0x6747, + 0x674a, 0x674b, 0x674d, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, + 0x6759, 0x675a, 0x675b, 0x675d, 0x6762, 0x6763, 0x6764, 0x6766, + 0x6767, 0x676b, 0x676c, 0x676e, 0x6771, 0x6774, 0x6776, 0x6778, + 0x6779, 0x677a, 0x677b, 0x677d, 0x6780, 0x6782, 0x6783, 0x6785, + 0x6786, 0x6788, 0x678a, 0x678c, 0x678d, 0x678e, 0x678f, 0x6791, + 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679b, 0x679f, 0x67a0, + 0x67a1, 0x67a4, 0x67a6, 0x67a9, 0x67ac, 0x67ae, 0x67b1, 0x67b2, + 0x67b4, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, + 0x67c0, 0x67c2, 0x67c5, 0x67c6, 0x67c7, 0x67c8, 0x67c9, 0x67ca, + 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67d5, 0x67d6, 0x67d7, 0x67db, + 0x67df, 0x67e1, 0x67e3, 0x67e4, 0x67e6, 0x67e7, 0x67e8, 0x67ea, + 0x67eb, 0x67ed, 0x67ee, 0x67f2, 0x67f5, 0x67f6, 0x67f7, 0x67f8, + 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fe, 0x6801, 0x6802, 0x6803, + 0x6804, 0x6806, 0x680d, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, + 0x6819, 0x681a, 0x681b, 0x681c, 0x681e, 0x681f, 0x6820, 0x6822, + 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682b, 0x682c, + 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, + 0x683a, 0x683b, 0x683f, 0x6847, 0x684b, 0x684d, 0x684f, 0x6852, + 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, + /* 0x97 */ + 0x685c, 0x685d, 0x685e, 0x685f, 0x686a, 0x686c, 0x686d, 0x686e, + 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, + 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6882, + 0x6884, 0x6887, 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, + 0x688e, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, + 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0, + 0x68a1, 0x68a3, 0x68a4, 0x68a5, 0x68a9, 0x68aa, 0x68ab, 0x68ac, + 0x68ae, 0x68b1, 0x68b2, 0x68b4, 0x68b6, 0x68b7, 0x68b8, 0x68b9, + 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c1, 0x68c3, + 0x68c4, 0x68c5, 0x68c6, 0x68c7, 0x68c8, 0x68ca, 0x68cc, 0x68ce, + 0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d4, 0x68d6, 0x68d7, 0x68d9, + 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e1, 0x68e2, 0x68e4, + 0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, + 0x68ed, 0x68ef, 0x68f2, 0x68f3, 0x68f4, 0x68f6, 0x68f7, 0x68f8, + 0x68fb, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6902, 0x6903, 0x6904, + 0x6906, 0x6907, 0x6908, 0x6909, 0x690a, 0x690c, 0x690f, 0x6911, + 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a, + 0x691b, 0x691c, 0x691d, 0x691e, 0x6921, 0x6922, 0x6923, 0x6925, + 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692e, + 0x692f, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, + 0x693a, 0x693b, 0x693c, 0x693e, 0x6940, 0x6941, 0x6943, 0x6944, + 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, + 0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, + 0x6956, 0x6958, 0x6959, 0x695b, 0x695c, 0x695f, + /* 0x98 */ + 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696a, + 0x696c, 0x696d, 0x696f, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, + 0x6976, 0x697a, 0x697b, 0x697d, 0x697e, 0x697f, 0x6981, 0x6983, + 0x6985, 0x698a, 0x698b, 0x698c, 0x698e, 0x698f, 0x6990, 0x6991, + 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699a, 0x699d, 0x699e, + 0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, + 0x69a9, 0x69aa, 0x69ac, 0x69ae, 0x69af, 0x69b0, 0x69b2, 0x69b3, + 0x69b5, 0x69b6, 0x69b8, 0x69b9, 0x69ba, 0x69bc, 0x69bd, 0x69be, + 0x69bf, 0x69c0, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, + 0x69c8, 0x69c9, 0x69cb, 0x69cd, 0x69cf, 0x69d1, 0x69d2, 0x69d3, + 0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69dc, 0x69dd, + 0x69de, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, + 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ee, 0x69ef, 0x69f0, + 0x69f1, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9, + 0x69fa, 0x69fb, 0x69fc, 0x69fe, 0x6a00, 0x6a01, 0x6a02, 0x6a03, + 0x6a04, 0x6a05, 0x6a06, 0x6a07, 0x6a08, 0x6a09, 0x6a0b, 0x6a0c, + 0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, + 0x6a15, 0x6a16, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, + 0x6a20, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a29, + 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a30, 0x6a32, 0x6a33, 0x6a34, + 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3f, + 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a45, 0x6a46, 0x6a48, 0x6a49, + 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a51, 0x6a52, + 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a5a, + /* 0x99 */ + 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a62, 0x6a63, 0x6a64, + 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, + 0x6a6e, 0x6a6f, 0x6a70, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, + 0x6a77, 0x6a78, 0x6a7a, 0x6a7b, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a81, + 0x6a82, 0x6a83, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, 0x6a8a, + 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8f, 0x6a92, 0x6a93, 0x6a94, 0x6a95, + 0x6a96, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, + 0x6a9f, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, + 0x6aa8, 0x6aaa, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2, + 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, + 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, + 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, + 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2, + 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada, + 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2, + 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea, + 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2, + 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa, + 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02, + 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, 0x6b08, 0x6b09, 0x6b0a, + 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12, + 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a, + 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b25, 0x6b26, 0x6b28, + 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, + /* 0x9a */ + 0x6b2f, 0x6b30, 0x6b31, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b38, + 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b44, + 0x6b45, 0x6b48, 0x6b4a, 0x6b4b, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50, + 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, + 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61, + 0x6b68, 0x6b69, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70, + 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78, + 0x6b7a, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b85, 0x6b88, 0x6b8c, + 0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b94, 0x6b95, 0x6b97, 0x6b98, + 0x6b99, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, + 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6bab, 0x6bac, + 0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb6, 0x6bb8, + 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bc0, 0x6bc3, + 0x6bc4, 0x6bc6, 0x6bc7, 0x6bc8, 0x6bc9, 0x6bca, 0x6bcc, 0x6bce, + 0x6bd0, 0x6bd1, 0x6bd8, 0x6bda, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, + 0x6be0, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8, + 0x6be9, 0x6bec, 0x6bed, 0x6bee, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf4, + 0x6bf6, 0x6bf7, 0x6bf8, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfe, 0x6bff, + 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c08, 0x6c09, 0x6c0a, + 0x6c0b, 0x6c0c, 0x6c0e, 0x6c12, 0x6c17, 0x6c1c, 0x6c1d, 0x6c1e, + 0x6c20, 0x6c23, 0x6c25, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c31, 0x6c33, + 0x6c36, 0x6c37, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3e, 0x6c3f, + 0x6c43, 0x6c44, 0x6c45, 0x6c48, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, + 0x6c4f, 0x6c51, 0x6c52, 0x6c53, 0x6c56, 0x6c58, + /* 0x9b */ + 0x6c59, 0x6c5a, 0x6c62, 0x6c63, 0x6c65, 0x6c66, 0x6c67, 0x6c6b, + 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c71, 0x6c73, 0x6c75, 0x6c77, + 0x6c78, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7f, 0x6c80, 0x6c84, 0x6c87, + 0x6c8a, 0x6c8b, 0x6c8d, 0x6c8e, 0x6c91, 0x6c92, 0x6c95, 0x6c96, + 0x6c97, 0x6c98, 0x6c9a, 0x6c9c, 0x6c9d, 0x6c9e, 0x6ca0, 0x6ca2, + 0x6ca8, 0x6cac, 0x6caf, 0x6cb0, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, + 0x6cba, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc6, 0x6cc7, 0x6cc8, + 0x6ccb, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd1, 0x6cd2, 0x6cd8, 0x6cd9, + 0x6cda, 0x6cdc, 0x6cdd, 0x6cdf, 0x6ce4, 0x6ce6, 0x6ce7, 0x6ce9, + 0x6cec, 0x6ced, 0x6cf2, 0x6cf4, 0x6cf9, 0x6cff, 0x6d00, 0x6d02, + 0x6d03, 0x6d05, 0x6d06, 0x6d08, 0x6d09, 0x6d0a, 0x6d0d, 0x6d0f, + 0x6d10, 0x6d11, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d18, 0x6d1c, + 0x6d1d, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d26, + 0x6d28, 0x6d29, 0x6d2c, 0x6d2d, 0x6d2f, 0x6d30, 0x6d34, 0x6d36, + 0x6d37, 0x6d38, 0x6d3a, 0x6d3f, 0x6d40, 0x6d42, 0x6d44, 0x6d49, + 0x6d4c, 0x6d50, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d5b, 0x6d5d, + 0x6d5f, 0x6d61, 0x6d62, 0x6d64, 0x6d65, 0x6d67, 0x6d68, 0x6d6b, + 0x6d6c, 0x6d6d, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d75, 0x6d76, + 0x6d79, 0x6d7a, 0x6d7b, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81, + 0x6d83, 0x6d84, 0x6d86, 0x6d87, 0x6d8a, 0x6d8b, 0x6d8d, 0x6d8f, + 0x6d90, 0x6d92, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9c, + 0x6da2, 0x6da5, 0x6dac, 0x6dad, 0x6db0, 0x6db1, 0x6db3, 0x6db4, + 0x6db6, 0x6db7, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, + 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc8, 0x6dc9, 0x6dca, + /* 0x9c */ + 0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, + 0x6dd7, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddf, 0x6de2, 0x6de3, 0x6de5, + 0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6ded, 0x6def, 0x6df0, 0x6df2, + 0x6df4, 0x6df5, 0x6df6, 0x6df8, 0x6dfa, 0x6dfd, 0x6dfe, 0x6dff, + 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e06, 0x6e07, 0x6e08, + 0x6e09, 0x6e0b, 0x6e0f, 0x6e12, 0x6e13, 0x6e15, 0x6e18, 0x6e19, + 0x6e1b, 0x6e1c, 0x6e1e, 0x6e1f, 0x6e22, 0x6e26, 0x6e27, 0x6e28, + 0x6e2a, 0x6e2c, 0x6e2e, 0x6e30, 0x6e31, 0x6e33, 0x6e35, 0x6e36, + 0x6e37, 0x6e39, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40, + 0x6e41, 0x6e42, 0x6e45, 0x6e46, 0x6e47, 0x6e48, 0x6e49, 0x6e4a, + 0x6e4b, 0x6e4c, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e55, 0x6e57, + 0x6e59, 0x6e5a, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e60, 0x6e61, 0x6e62, + 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, + 0x6e6c, 0x6e6d, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, + 0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, + 0x6e7d, 0x6e80, 0x6e81, 0x6e82, 0x6e84, 0x6e87, 0x6e88, 0x6e8a, + 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e91, 0x6e92, 0x6e93, 0x6e94, + 0x6e95, 0x6e96, 0x6e97, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9d, 0x6e9e, + 0x6ea0, 0x6ea1, 0x6ea3, 0x6ea4, 0x6ea6, 0x6ea8, 0x6ea9, 0x6eab, + 0x6eac, 0x6ead, 0x6eae, 0x6eb0, 0x6eb3, 0x6eb5, 0x6eb8, 0x6eb9, + 0x6ebc, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, + 0x6ec8, 0x6ec9, 0x6eca, 0x6ecc, 0x6ecd, 0x6ece, 0x6ed0, 0x6ed2, + 0x6ed6, 0x6ed8, 0x6ed9, 0x6edb, 0x6edc, 0x6edd, 0x6ee3, 0x6ee7, + 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, + /* 0x9d */ + 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8, + 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01, + 0x6f03, 0x6f04, 0x6f05, 0x6f07, 0x6f08, 0x6f0a, 0x6f0b, 0x6f0c, + 0x6f0d, 0x6f0e, 0x6f10, 0x6f11, 0x6f12, 0x6f16, 0x6f17, 0x6f18, + 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f21, + 0x6f22, 0x6f23, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f2c, 0x6f2e, + 0x6f30, 0x6f32, 0x6f34, 0x6f35, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, + 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43, + 0x6f44, 0x6f45, 0x6f48, 0x6f49, 0x6f4a, 0x6f4c, 0x6f4e, 0x6f4f, + 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, + 0x6f59, 0x6f5a, 0x6f5b, 0x6f5d, 0x6f5f, 0x6f60, 0x6f61, 0x6f63, + 0x6f64, 0x6f65, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, + 0x6f6f, 0x6f70, 0x6f71, 0x6f73, 0x6f75, 0x6f76, 0x6f77, 0x6f79, + 0x6f7b, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83, + 0x6f85, 0x6f86, 0x6f87, 0x6f8a, 0x6f8b, 0x6f8f, 0x6f90, 0x6f91, + 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99, + 0x6f9a, 0x6f9b, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa2, 0x6fa3, + 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, + 0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb4, 0x6fb5, + 0x6fb7, 0x6fb8, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, + 0x6fc1, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, 0x6fc8, 0x6fca, + 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd3, 0x6fd4, + 0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, + 0x6fdd, 0x6fdf, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, + /* 0x9e */ + 0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, + 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, + 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, + 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, + 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, + 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, + 0x7019, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022, + 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b, + 0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033, + 0x7034, 0x7036, 0x7037, 0x7038, 0x703a, 0x703b, 0x703c, 0x703d, + 0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, + 0x7046, 0x7047, 0x7048, 0x7049, 0x704a, 0x704b, 0x704d, 0x704e, + 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, + 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705f, 0x7060, + 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, + 0x7069, 0x706a, 0x706e, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, + 0x7079, 0x707a, 0x707b, 0x707d, 0x7081, 0x7082, 0x7083, 0x7084, + 0x7086, 0x7087, 0x7088, 0x708b, 0x708c, 0x708d, 0x708f, 0x7090, + 0x7091, 0x7093, 0x7097, 0x7098, 0x709a, 0x709b, 0x709e, 0x709f, + 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, + 0x70a8, 0x70a9, 0x70aa, 0x70b0, 0x70b2, 0x70b4, 0x70b5, 0x70b6, + 0x70ba, 0x70be, 0x70bf, 0x70c4, 0x70c5, 0x70c6, 0x70c7, 0x70c9, + 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2, + 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70da, + /* 0x9f */ + 0x70dc, 0x70dd, 0x70de, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e5, + 0x70ea, 0x70ee, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, + 0x70f6, 0x70f8, 0x70fa, 0x70fb, 0x70fc, 0x70fe, 0x70ff, 0x7100, + 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, + 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7111, 0x7112, 0x7114, + 0x7117, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121, + 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712a, + 0x712b, 0x712c, 0x712d, 0x712e, 0x7132, 0x7133, 0x7134, 0x7135, + 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, + 0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, + 0x7148, 0x7149, 0x714b, 0x714d, 0x714f, 0x7150, 0x7151, 0x7152, + 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a, + 0x715b, 0x715d, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, + 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716f, 0x7170, 0x7171, + 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717b, 0x717c, 0x717e, + 0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, + 0x7188, 0x7189, 0x718b, 0x718c, 0x718d, 0x718e, 0x7190, 0x7191, + 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719a, 0x719b, 0x719c, + 0x719d, 0x719e, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, + 0x71a7, 0x71a9, 0x71aa, 0x71ab, 0x71ad, 0x71ae, 0x71af, 0x71b0, + 0x71b1, 0x71b2, 0x71b4, 0x71b6, 0x71b7, 0x71b8, 0x71ba, 0x71bb, + 0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c4, + 0x71c5, 0x71c6, 0x71c7, 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, + 0x71cd, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3, + /* 0xa0 */ + 0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, + 0x71de, 0x71df, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e6, 0x71e8, + 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ef, 0x71f0, 0x71f1, + 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71fa, + 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202, + 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720a, 0x720b, + 0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213, + 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b, + 0x721c, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, + 0x7225, 0x7226, 0x7227, 0x7229, 0x722b, 0x722d, 0x722e, 0x722f, + 0x7232, 0x7233, 0x7234, 0x723a, 0x723c, 0x723e, 0x7240, 0x7241, + 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724a, 0x724b, + 0x724e, 0x724f, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, + 0x7258, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7264, 0x7265, + 0x7268, 0x726a, 0x726b, 0x726c, 0x726d, 0x7270, 0x7271, 0x7273, + 0x7274, 0x7276, 0x7277, 0x7278, 0x727b, 0x727c, 0x727d, 0x7282, + 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728c, 0x728e, + 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, + 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x72a0, 0x72a1, + 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9, + 0x72aa, 0x72ab, 0x72ae, 0x72b1, 0x72b2, 0x72b3, 0x72b5, 0x72ba, + 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c5, 0x72c6, + 0x72c7, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cf, 0x72d1, 0x72d3, + 0x72d4, 0x72d5, 0x72d6, 0x72d8, 0x72da, 0x72db, +}; + +static int +gbkext1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x81 && c1 <= 0xa0)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { + unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + unsigned short wc = 0xfffd; + { + if (i < 6080) + wc = gbkext1_2uni_page81[i]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/gbkext2.h b/Externals/libiconv-1.14/lib/gbkext2.h new file mode 100644 index 0000000000..5a0dbdec57 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gbkext2.h @@ -0,0 +1,1174 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GBK/4 and GBK/5 extensions + */ + +static const unsigned short gbkext2_2uni_pagea8[8272] = { + /* 0xa8 */ + 0x02ca, 0x02cb, 0x02d9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, + 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221f, 0x2223, + 0x2252, 0x2266, 0x2267, 0x22bf, 0x2550, 0x2551, 0x2552, 0x2553, + 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, + 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, + 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, + 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, + 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593, + 0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5, + 0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa9 */ + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1, + 0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4, + 0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd, + 0x30fc, 0x309b, 0x309c, 0x30fd, 0x30fe, 0x3006, 0x309d, 0x309e, + 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50, + 0xfe51, 0xfe52, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe59, 0xfe5a, + 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62, + 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xaa */ + 0x72dc, 0x72dd, 0x72df, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, + 0x72e7, 0x72ea, 0x72eb, 0x72f5, 0x72f6, 0x72f9, 0x72fd, 0x72fe, + 0x72ff, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, + 0x7309, 0x730b, 0x730c, 0x730d, 0x730f, 0x7310, 0x7311, 0x7312, + 0x7314, 0x7318, 0x7319, 0x731a, 0x731f, 0x7320, 0x7323, 0x7324, + 0x7326, 0x7327, 0x7328, 0x732d, 0x732f, 0x7330, 0x7332, 0x7333, + 0x7335, 0x7336, 0x733a, 0x733b, 0x733c, 0x733d, 0x7340, 0x7341, + 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, + 0x734a, 0x734b, 0x734c, 0x734e, 0x734f, 0x7351, 0x7353, 0x7354, + 0x7355, 0x7356, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, + 0x735e, 0x735f, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, + 0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736e, 0x7370, 0x7371, + /* 0xab */ + 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, + 0x737a, 0x737b, 0x737c, 0x737d, 0x737f, 0x7380, 0x7381, 0x7382, + 0x7383, 0x7385, 0x7386, 0x7388, 0x738a, 0x738c, 0x738d, 0x738f, + 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, + 0x739a, 0x739c, 0x739d, 0x739e, 0x73a0, 0x73a1, 0x73a3, 0x73a4, + 0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73aa, 0x73ac, 0x73ad, 0x73b1, + 0x73b4, 0x73b5, 0x73b6, 0x73b8, 0x73b9, 0x73bc, 0x73bd, 0x73be, + 0x73bf, 0x73c1, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, 0x73cb, + 0x73cc, 0x73ce, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, + 0x73d8, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73df, 0x73e1, 0x73e2, + 0x73e3, 0x73e4, 0x73e6, 0x73e8, 0x73ea, 0x73eb, 0x73ec, 0x73ee, + 0x73ef, 0x73f0, 0x73f1, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, + /* 0xac */ + 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, + 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740b, 0x740c, + 0x740d, 0x740e, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, + 0x7417, 0x7418, 0x7419, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420, + 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742b, 0x742d, 0x742f, + 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743d, + 0x743e, 0x743f, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, + 0x7447, 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, + 0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, + 0x745d, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, + 0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746e, 0x746f, + 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747a, + /* 0xad */ + 0x747b, 0x747c, 0x747d, 0x747f, 0x7482, 0x7484, 0x7485, 0x7486, + 0x7488, 0x7489, 0x748a, 0x748c, 0x748d, 0x748f, 0x7491, 0x7492, + 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a, + 0x749b, 0x749d, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, + 0x74a5, 0x74a6, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, + 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, + 0x74b8, 0x74b9, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0, + 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, 0x74c8, + 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0, + 0x74d1, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9, + 0x74da, 0x74db, 0x74dd, 0x74df, 0x74e1, 0x74e5, 0x74e7, 0x74e8, + 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74f0, 0x74f1, 0x74f2, + /* 0xae */ + 0x74f3, 0x74f5, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, + 0x74fe, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, + 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750e, 0x7510, 0x7512, + 0x7514, 0x7515, 0x7516, 0x7517, 0x751b, 0x751d, 0x751e, 0x7520, + 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752a, 0x752e, + 0x7534, 0x7536, 0x7539, 0x753c, 0x753d, 0x753f, 0x7541, 0x7542, + 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754a, 0x754d, 0x7550, + 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755d, + 0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, + 0x7568, 0x7569, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570, + 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757a, 0x757b, 0x757c, + 0x757d, 0x757e, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, + /* 0xaf */ + 0x7588, 0x7589, 0x758a, 0x758c, 0x758d, 0x758e, 0x7590, 0x7593, + 0x7595, 0x7598, 0x759b, 0x759c, 0x759e, 0x75a2, 0x75a6, 0x75a7, + 0x75a8, 0x75a9, 0x75aa, 0x75ad, 0x75b6, 0x75b7, 0x75ba, 0x75bb, + 0x75bf, 0x75c0, 0x75c1, 0x75c6, 0x75cb, 0x75cc, 0x75ce, 0x75cf, + 0x75d0, 0x75d1, 0x75d3, 0x75d7, 0x75d9, 0x75da, 0x75dc, 0x75dd, + 0x75df, 0x75e0, 0x75e1, 0x75e5, 0x75e9, 0x75ec, 0x75ed, 0x75ee, + 0x75ef, 0x75f2, 0x75f3, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75fa, + 0x75fb, 0x75fd, 0x75fe, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608, + 0x7609, 0x760b, 0x760d, 0x760e, 0x760f, 0x7611, 0x7612, 0x7613, + 0x7614, 0x7616, 0x761a, 0x761c, 0x761d, 0x761e, 0x7621, 0x7623, + 0x7627, 0x7628, 0x762c, 0x762e, 0x762f, 0x7631, 0x7632, 0x7636, + 0x7637, 0x7639, 0x763a, 0x763b, 0x763d, 0x7641, 0x7642, 0x7644, + /* 0xb0 */ + 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764b, 0x764e, + 0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, + 0x7659, 0x765a, 0x765b, 0x765d, 0x765f, 0x7660, 0x7661, 0x7662, + 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766c, + 0x766d, 0x766e, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, + 0x7676, 0x7677, 0x7679, 0x767a, 0x767c, 0x767f, 0x7680, 0x7681, + 0x7683, 0x7685, 0x7689, 0x768a, 0x768c, 0x768d, 0x768f, 0x7690, + 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769a, 0x769b, 0x769c, + 0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a5, + 0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, + 0x76af, 0x76b0, 0x76b3, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9, + 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76c0, 0x76c1, 0x76c3, + /* 0xb1 */ + 0x76c4, 0x76c7, 0x76c9, 0x76cb, 0x76cc, 0x76d3, 0x76d5, 0x76d9, + 0x76da, 0x76dc, 0x76dd, 0x76de, 0x76e0, 0x76e1, 0x76e2, 0x76e3, + 0x76e4, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, + 0x76ed, 0x76f0, 0x76f3, 0x76f5, 0x76f6, 0x76f7, 0x76fa, 0x76fb, + 0x76fd, 0x76ff, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770a, + 0x770c, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, + 0x7715, 0x7716, 0x7717, 0x7718, 0x771b, 0x771c, 0x771d, 0x771e, + 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772a, 0x772b, 0x772c, + 0x772e, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773b, + 0x773d, 0x773e, 0x773f, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, + 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7752, + 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775c, + /* 0xb2 */ + 0x775d, 0x775e, 0x775f, 0x7760, 0x7764, 0x7767, 0x7769, 0x776a, + 0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, + 0x7775, 0x7776, 0x7777, 0x7778, 0x777a, 0x777b, 0x777c, 0x7781, + 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778a, 0x778b, + 0x778f, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, + 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x77a1, 0x77a3, + 0x77a4, 0x77a6, 0x77a8, 0x77ab, 0x77ad, 0x77ae, 0x77af, 0x77b1, + 0x77b2, 0x77b4, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bc, + 0x77be, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, + 0x77c7, 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77ce, 0x77cf, + 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d8, + 0x77d9, 0x77da, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e4, + /* 0xb3 */ + 0x77e6, 0x77e8, 0x77ea, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f4, + 0x77f5, 0x77f7, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x7803, 0x7804, + 0x7805, 0x7806, 0x7807, 0x7808, 0x780a, 0x780b, 0x780e, 0x780f, + 0x7810, 0x7813, 0x7815, 0x7819, 0x781b, 0x781e, 0x7820, 0x7821, + 0x7822, 0x7824, 0x7828, 0x782a, 0x782b, 0x782e, 0x782f, 0x7831, + 0x7832, 0x7833, 0x7835, 0x7836, 0x783d, 0x783f, 0x7841, 0x7842, + 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784a, 0x784b, 0x784d, + 0x784f, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785a, 0x785b, + 0x785c, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, + 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786f, 0x7870, 0x7871, + 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787a, + 0x787b, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883, + /* 0xb4 */ + 0x7884, 0x7885, 0x7886, 0x7888, 0x788a, 0x788b, 0x788f, 0x7890, + 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789d, 0x789e, 0x78a0, + 0x78a2, 0x78a4, 0x78a6, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, + 0x78ad, 0x78ae, 0x78af, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78ba, + 0x78bb, 0x78bc, 0x78bd, 0x78bf, 0x78c0, 0x78c2, 0x78c3, 0x78c4, + 0x78c6, 0x78c7, 0x78c8, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d1, + 0x78d2, 0x78d3, 0x78d6, 0x78d7, 0x78d8, 0x78da, 0x78db, 0x78dc, + 0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, + 0x78e5, 0x78e6, 0x78e7, 0x78e9, 0x78ea, 0x78eb, 0x78ed, 0x78ee, + 0x78ef, 0x78f0, 0x78f1, 0x78f3, 0x78f5, 0x78f6, 0x78f8, 0x78f9, + 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7902, 0x7903, + 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, + /* 0xb5 */ + 0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, + 0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, + 0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, + 0x7939, 0x793d, 0x793f, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, + 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951, + 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, + 0x7966, 0x7969, 0x796a, 0x796b, 0x796c, 0x796e, 0x7970, 0x7971, + 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797b, 0x797c, + 0x797d, 0x797e, 0x797f, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, + 0x7989, 0x798b, 0x798c, 0x798d, 0x798e, 0x7990, 0x7991, 0x7992, + /* 0xb6 */ + 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799b, + 0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3, + 0x79a4, 0x79a5, 0x79a6, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, + 0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b4, 0x79b5, + 0x79b6, 0x79b7, 0x79b8, 0x79bc, 0x79bf, 0x79c2, 0x79c4, 0x79c5, + 0x79c7, 0x79c8, 0x79ca, 0x79cc, 0x79ce, 0x79cf, 0x79d0, 0x79d3, + 0x79d4, 0x79d6, 0x79d7, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, + 0x79de, 0x79e0, 0x79e1, 0x79e2, 0x79e5, 0x79e8, 0x79ea, 0x79ec, + 0x79ee, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, + 0x79f9, 0x79fa, 0x79fc, 0x79fe, 0x79ff, 0x7a01, 0x7a04, 0x7a05, + 0x7a07, 0x7a08, 0x7a09, 0x7a0a, 0x7a0c, 0x7a0f, 0x7a10, 0x7a11, + 0x7a12, 0x7a13, 0x7a15, 0x7a16, 0x7a18, 0x7a19, 0x7a1b, 0x7a1c, + /* 0xb7 */ + 0x7a1d, 0x7a1f, 0x7a21, 0x7a22, 0x7a24, 0x7a25, 0x7a26, 0x7a27, + 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, + 0x7a30, 0x7a31, 0x7a32, 0x7a34, 0x7a35, 0x7a36, 0x7a38, 0x7a3a, + 0x7a3e, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a47, + 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, + 0x7a50, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a58, 0x7a59, + 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61, + 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69, + 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a71, 0x7a72, + 0x7a73, 0x7a75, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a82, 0x7a85, + 0x7a87, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8e, 0x7a8f, 0x7a90, + 0x7a93, 0x7a94, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9e, 0x7aa1, 0x7aa2, + /* 0xb8 */ + 0x7aa3, 0x7aa4, 0x7aa7, 0x7aa9, 0x7aaa, 0x7aab, 0x7aae, 0x7aaf, + 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8, + 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7ac0, 0x7ac1, + 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, 0x7ac8, 0x7ac9, + 0x7aca, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2, + 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad7, 0x7ad8, 0x7ada, 0x7adb, 0x7adc, + 0x7add, 0x7ae1, 0x7ae2, 0x7ae4, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea, + 0x7aeb, 0x7aec, 0x7aee, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, + 0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7afb, 0x7afc, 0x7afe, 0x7b00, + 0x7b01, 0x7b02, 0x7b05, 0x7b07, 0x7b09, 0x7b0c, 0x7b0d, 0x7b0e, + 0x7b10, 0x7b12, 0x7b13, 0x7b16, 0x7b17, 0x7b18, 0x7b1a, 0x7b1c, + 0x7b1d, 0x7b1f, 0x7b21, 0x7b22, 0x7b23, 0x7b27, 0x7b29, 0x7b2d, + /* 0xb9 */ + 0x7b2f, 0x7b30, 0x7b32, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b39, + 0x7b3b, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, + 0x7b46, 0x7b48, 0x7b4a, 0x7b4d, 0x7b4e, 0x7b53, 0x7b55, 0x7b57, + 0x7b59, 0x7b5c, 0x7b5e, 0x7b5f, 0x7b61, 0x7b63, 0x7b64, 0x7b65, + 0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, + 0x7b6f, 0x7b70, 0x7b73, 0x7b74, 0x7b76, 0x7b78, 0x7b7a, 0x7b7c, + 0x7b7d, 0x7b7f, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b86, 0x7b87, + 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8e, 0x7b8f, 0x7b91, + 0x7b92, 0x7b93, 0x7b96, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9e, + 0x7b9f, 0x7ba0, 0x7ba3, 0x7ba4, 0x7ba5, 0x7bae, 0x7baf, 0x7bb0, + 0x7bb2, 0x7bb3, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb9, 0x7bba, 0x7bbb, + 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc2, 0x7bc3, 0x7bc4, + /* 0xba */ + 0x7bc5, 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcd, 0x7bce, 0x7bcf, + 0x7bd0, 0x7bd2, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bdb, + 0x7bdc, 0x7bde, 0x7bdf, 0x7be0, 0x7be2, 0x7be3, 0x7be4, 0x7be7, + 0x7be8, 0x7be9, 0x7beb, 0x7bec, 0x7bed, 0x7bef, 0x7bf0, 0x7bf2, + 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, + 0x7bfd, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, + 0x7c06, 0x7c08, 0x7c09, 0x7c0a, 0x7c0d, 0x7c0e, 0x7c10, 0x7c11, + 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c17, 0x7c18, 0x7c19, 0x7c1a, + 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c20, 0x7c21, 0x7c22, 0x7c23, + 0x7c24, 0x7c25, 0x7c28, 0x7c29, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, + 0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, + 0x7c37, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c42, + /* 0xbb */ + 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, 0x7c48, 0x7c49, 0x7c4a, + 0x7c4b, 0x7c4c, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53, + 0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, + 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63, + 0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, + 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c75, + 0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7e, 0x7c7f, 0x7c80, + 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, 0x7c88, + 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c93, + 0x7c94, 0x7c96, 0x7c99, 0x7c9a, 0x7c9b, 0x7ca0, 0x7ca1, 0x7ca3, + 0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7cab, 0x7cac, 0x7cad, 0x7caf, + 0x7cb0, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cba, 0x7cbb, + /* 0xbc */ + 0x7cbf, 0x7cc0, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc6, 0x7cc9, 0x7ccb, + 0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd8, + 0x7cda, 0x7cdb, 0x7cdd, 0x7cde, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, + 0x7ce5, 0x7ce6, 0x7ce7, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, + 0x7cee, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, + 0x7cf7, 0x7cf9, 0x7cfa, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00, + 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, 0x7d08, + 0x7d09, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11, + 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19, + 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d21, 0x7d23, + 0x7d24, 0x7d25, 0x7d26, 0x7d28, 0x7d29, 0x7d2a, 0x7d2c, 0x7d2d, + 0x7d2e, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, + /* 0xbd */ + 0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, + 0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, + 0x7d47, 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, + 0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, + 0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, + 0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, + 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6f, + 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d78, + 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80, + 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, 0x7d88, + 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90, + 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98, + /* 0xbe */ + 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, + 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da7, 0x7da8, 0x7da9, + 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7daf, 0x7db0, 0x7db1, 0x7db2, + 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba, + 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2, + 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca, + 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2, + 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda, + 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2, + 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea, + 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2, + 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa, + /* 0xbf */ + 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02, + 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, 0x7e08, 0x7e09, 0x7e0a, + 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12, + 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a, + 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22, + 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a, + 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32, + 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a, + 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e42, 0x7e43, 0x7e44, + 0x7e45, 0x7e46, 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, + 0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, + 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, + /* 0xc0 */ + 0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, + 0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, + 0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, + 0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, + 0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e83, 0x7e84, 0x7e85, 0x7e86, + 0x7e87, 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, + 0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, + 0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9c, 0x7e9d, 0x7e9e, 0x7eae, + 0x7eb4, 0x7ebb, 0x7ebc, 0x7ed6, 0x7ee4, 0x7eec, 0x7ef9, 0x7f0a, + 0x7f10, 0x7f1e, 0x7f37, 0x7f39, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, + 0x7f3f, 0x7f40, 0x7f41, 0x7f43, 0x7f46, 0x7f47, 0x7f48, 0x7f49, + 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f52, 0x7f53, + /* 0xc1 */ + 0x7f56, 0x7f59, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f60, 0x7f63, + 0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6f, + 0x7f70, 0x7f73, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f7a, 0x7f7b, + 0x7f7c, 0x7f7d, 0x7f7f, 0x7f80, 0x7f82, 0x7f83, 0x7f84, 0x7f85, + 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, + 0x7f91, 0x7f92, 0x7f93, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99, + 0x7f9b, 0x7f9c, 0x7fa0, 0x7fa2, 0x7fa3, 0x7fa5, 0x7fa6, 0x7fa8, + 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7fb1, 0x7fb3, + 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fba, 0x7fbb, 0x7fbe, 0x7fc0, + 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc6, 0x7fc7, 0x7fc8, 0x7fc9, 0x7fcb, + 0x7fcd, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd6, 0x7fd7, + 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fe2, 0x7fe3, + /* 0xc2 */ + 0x7fe4, 0x7fe7, 0x7fe8, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fef, + 0x7ff2, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, + 0x7ffd, 0x7ffe, 0x7fff, 0x8002, 0x8007, 0x8008, 0x8009, 0x800a, + 0x800e, 0x800f, 0x8011, 0x8013, 0x801a, 0x801b, 0x801d, 0x801e, + 0x801f, 0x8021, 0x8023, 0x8024, 0x802b, 0x802c, 0x802d, 0x802e, + 0x802f, 0x8030, 0x8032, 0x8034, 0x8039, 0x803a, 0x803c, 0x803e, + 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804e, + 0x804f, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, + 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062, + 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806b, 0x806c, + 0x806d, 0x806e, 0x806f, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, + 0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, + /* 0xc3 */ + 0x807e, 0x8081, 0x8082, 0x8085, 0x8088, 0x808a, 0x808d, 0x808e, + 0x808f, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, + 0x809e, 0x80a3, 0x80a6, 0x80a7, 0x80a8, 0x80ac, 0x80b0, 0x80b3, + 0x80b5, 0x80b6, 0x80b8, 0x80b9, 0x80bb, 0x80c5, 0x80c7, 0x80c8, + 0x80c9, 0x80ca, 0x80cb, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3, + 0x80d4, 0x80d5, 0x80d8, 0x80df, 0x80e0, 0x80e2, 0x80e3, 0x80e6, + 0x80ee, 0x80f5, 0x80f7, 0x80f9, 0x80fb, 0x80fe, 0x80ff, 0x8100, + 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810b, 0x810c, + 0x8115, 0x8117, 0x8119, 0x811b, 0x811c, 0x811d, 0x811f, 0x8120, + 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, + 0x8129, 0x812a, 0x812b, 0x812d, 0x812e, 0x8130, 0x8133, 0x8134, + 0x8135, 0x8137, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813f, + /* 0xc4 */ + 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, + 0x814d, 0x814e, 0x814f, 0x8152, 0x8156, 0x8157, 0x8158, 0x815b, + 0x815c, 0x815d, 0x815e, 0x815f, 0x8161, 0x8162, 0x8163, 0x8164, + 0x8166, 0x8168, 0x816a, 0x816b, 0x816c, 0x816f, 0x8172, 0x8173, + 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, + 0x8186, 0x8187, 0x8189, 0x818b, 0x818c, 0x818d, 0x818e, 0x8190, + 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819a, + 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a4, 0x81a5, 0x81a7, + 0x81a9, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, + 0x81b2, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81bc, + 0x81bd, 0x81be, 0x81bf, 0x81c4, 0x81c5, 0x81c7, 0x81c8, 0x81c9, + 0x81cb, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, + /* 0xc5 */ + 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, + 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e4, + 0x81e5, 0x81e6, 0x81e8, 0x81e9, 0x81eb, 0x81ee, 0x81ef, 0x81f0, + 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, + 0x81fd, 0x81ff, 0x8203, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b, + 0x820e, 0x820f, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, + 0x8219, 0x821a, 0x821d, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822e, 0x8232, 0x823a, 0x823c, 0x823d, 0x823f, 0x8240, + 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824a, 0x824c, + 0x824d, 0x824e, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, + 0x8256, 0x8257, 0x8259, 0x825b, 0x825c, 0x825d, 0x825e, 0x8260, + 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, + /* 0xc6 */ + 0x826a, 0x826b, 0x826c, 0x826d, 0x8271, 0x8275, 0x8276, 0x8277, + 0x8278, 0x827b, 0x827c, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, + 0x8287, 0x8289, 0x828c, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, + 0x829a, 0x829b, 0x829e, 0x82a0, 0x82a2, 0x82a3, 0x82a7, 0x82b2, + 0x82b5, 0x82b6, 0x82ba, 0x82bb, 0x82bc, 0x82bf, 0x82c0, 0x82c2, + 0x82c3, 0x82c5, 0x82c6, 0x82c9, 0x82d0, 0x82d6, 0x82d9, 0x82da, + 0x82dd, 0x82e2, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82ec, 0x82ed, + 0x82ee, 0x82f0, 0x82f2, 0x82f3, 0x82f5, 0x82f6, 0x82f8, 0x82fa, + 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x830a, 0x830b, 0x830d, + 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831d, 0x831e, + 0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, + 0x8329, 0x832a, 0x832e, 0x8330, 0x8332, 0x8337, 0x833b, 0x833d, + /* 0xc7 */ + 0x833e, 0x833f, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834a, + 0x834b, 0x834c, 0x834d, 0x834e, 0x8353, 0x8355, 0x8356, 0x8357, + 0x8358, 0x8359, 0x835d, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, + 0x8374, 0x8375, 0x8376, 0x8379, 0x837a, 0x837e, 0x837f, 0x8380, + 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838a, 0x838b, + 0x838c, 0x838d, 0x838f, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, + 0x8397, 0x8399, 0x839a, 0x839d, 0x839f, 0x83a1, 0x83a2, 0x83a3, + 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83ac, 0x83ad, 0x83ae, 0x83af, + 0x83b5, 0x83bb, 0x83be, 0x83bf, 0x83c2, 0x83c3, 0x83c4, 0x83c6, + 0x83c8, 0x83c9, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2, + 0x83d3, 0x83d5, 0x83d7, 0x83d9, 0x83da, 0x83db, 0x83de, 0x83e2, + 0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, 0x83eb, 0x83ec, 0x83ed, + /* 0xc8 */ + 0x83ee, 0x83ef, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83fa, + 0x83fb, 0x83fc, 0x83fe, 0x83ff, 0x8400, 0x8402, 0x8405, 0x8407, + 0x8408, 0x8409, 0x840a, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, + 0x8416, 0x8417, 0x8419, 0x841a, 0x841b, 0x841e, 0x841f, 0x8420, + 0x8421, 0x8422, 0x8423, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, + 0x842e, 0x842f, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, + 0x8437, 0x8439, 0x843a, 0x843b, 0x843e, 0x843f, 0x8440, 0x8441, + 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a, + 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8452, 0x8453, + 0x8454, 0x8455, 0x8456, 0x8458, 0x845d, 0x845e, 0x845f, 0x8460, + 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846a, 0x846e, + 0x846f, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847b, 0x847c, + /* 0xc9 */ + 0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, + 0x8486, 0x848a, 0x848d, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, + 0x8494, 0x8495, 0x8496, 0x8498, 0x849a, 0x849b, 0x849d, 0x849e, + 0x849f, 0x84a0, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, + 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84b0, + 0x84b1, 0x84b3, 0x84b5, 0x84b6, 0x84b7, 0x84bb, 0x84bc, 0x84be, + 0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84cb, + 0x84cc, 0x84ce, 0x84cf, 0x84d2, 0x84d4, 0x84d5, 0x84d7, 0x84d8, + 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84de, 0x84e1, 0x84e2, 0x84e4, + 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ed, 0x84ee, 0x84ef, + 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, + 0x84f9, 0x84fa, 0x84fb, 0x84fd, 0x84fe, 0x8500, 0x8501, 0x8502, + /* 0xca */ + 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850a, + 0x850b, 0x850d, 0x850e, 0x850f, 0x8510, 0x8512, 0x8514, 0x8515, + 0x8516, 0x8518, 0x8519, 0x851b, 0x851c, 0x851d, 0x851e, 0x8520, + 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, + 0x852a, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533, + 0x8534, 0x8535, 0x8536, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542, + 0x8544, 0x8545, 0x8546, 0x8547, 0x854b, 0x854c, 0x854d, 0x854e, + 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, + 0x8558, 0x855a, 0x855b, 0x855c, 0x855d, 0x855f, 0x8560, 0x8561, + 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856a, 0x856b, + 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8573, 0x8575, + 0x8576, 0x8577, 0x8578, 0x857c, 0x857d, 0x857f, 0x8580, 0x8581, + /* 0xcb */ + 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, + 0x858d, 0x858e, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, + 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859d, 0x859e, 0x859f, + 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a5, 0x85a6, 0x85a7, 0x85a9, + 0x85ab, 0x85ac, 0x85ad, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, + 0x85b6, 0x85b8, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, + 0x85c0, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, + 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85d1, 0x85d2, 0x85d4, + 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dd, 0x85de, + 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e5, 0x85e6, 0x85e7, + 0x85e8, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, + 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, + /* 0xcc */ + 0x85f9, 0x85fa, 0x85fc, 0x85fd, 0x85fe, 0x8600, 0x8601, 0x8602, + 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860a, 0x860b, + 0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8612, 0x8613, 0x8614, + 0x8615, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d, + 0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, + 0x8626, 0x8628, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f, + 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, + 0x8639, 0x863a, 0x863b, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641, + 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, + 0x864a, 0x864b, 0x864c, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, + 0x8658, 0x8659, 0x865b, 0x865c, 0x865d, 0x865f, 0x8660, 0x8661, + 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, + /* 0xcd */ + 0x866d, 0x866f, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, + 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, + 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869e, 0x869f, 0x86a0, + 0x86a1, 0x86a2, 0x86a5, 0x86a6, 0x86ab, 0x86ad, 0x86ae, 0x86b2, + 0x86b3, 0x86b7, 0x86b8, 0x86b9, 0x86bb, 0x86bc, 0x86bd, 0x86be, + 0x86bf, 0x86c1, 0x86c2, 0x86c3, 0x86c5, 0x86c8, 0x86cc, 0x86cd, + 0x86d2, 0x86d3, 0x86d5, 0x86d6, 0x86d7, 0x86da, 0x86dc, 0x86dd, + 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e5, 0x86e6, 0x86e7, 0x86e8, + 0x86ea, 0x86eb, 0x86ec, 0x86ef, 0x86f5, 0x86f6, 0x86f7, 0x86fa, + 0x86fb, 0x86fc, 0x86fd, 0x86ff, 0x8701, 0x8704, 0x8705, 0x8706, + 0x870b, 0x870c, 0x870e, 0x870f, 0x8710, 0x8711, 0x8714, 0x8716, + /* 0xce */ + 0x8719, 0x871b, 0x871d, 0x871f, 0x8720, 0x8724, 0x8726, 0x8727, + 0x8728, 0x872a, 0x872b, 0x872c, 0x872d, 0x872f, 0x8730, 0x8732, + 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873a, 0x873c, 0x873d, + 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874a, + 0x874b, 0x874d, 0x874f, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, + 0x8756, 0x8758, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, + 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, + 0x876c, 0x876d, 0x876f, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, + 0x8778, 0x8779, 0x877a, 0x877f, 0x8780, 0x8781, 0x8784, 0x8786, + 0x8787, 0x8789, 0x878a, 0x878c, 0x878e, 0x878f, 0x8790, 0x8791, + 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879a, 0x879b, + 0x879c, 0x879d, 0x879e, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, + /* 0xcf */ + 0x87a5, 0x87a6, 0x87a7, 0x87a9, 0x87aa, 0x87ae, 0x87b0, 0x87b1, + 0x87b2, 0x87b4, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87bb, 0x87bc, + 0x87be, 0x87bf, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c7, + 0x87c8, 0x87c9, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d4, + 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87dc, 0x87dd, + 0x87de, 0x87df, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e6, 0x87e7, + 0x87e8, 0x87e9, 0x87eb, 0x87ec, 0x87ed, 0x87ef, 0x87f0, 0x87f1, + 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87fa, + 0x87fb, 0x87fc, 0x87fd, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8804, + 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880b, 0x880c, 0x880d, + 0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, + 0x8819, 0x881a, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8823, + /* 0xd0 */ + 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b, + 0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8833, 0x8834, + 0x8835, 0x8836, 0x8837, 0x8838, 0x883a, 0x883b, 0x883d, 0x883e, + 0x883f, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, + 0x884a, 0x884b, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, + 0x8855, 0x8856, 0x8858, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, + 0x885f, 0x8860, 0x8866, 0x8867, 0x886a, 0x886d, 0x886f, 0x8871, + 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887a, 0x887b, + 0x887c, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888a, 0x888c, + 0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, + 0x8898, 0x8899, 0x889a, 0x889b, 0x889d, 0x889e, 0x889f, 0x88a0, + 0x88a1, 0x88a3, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, + /* 0xd1 */ + 0x88ac, 0x88ae, 0x88af, 0x88b0, 0x88b2, 0x88b3, 0x88b4, 0x88b5, + 0x88b6, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bd, 0x88be, 0x88bf, + 0x88c0, 0x88c3, 0x88c4, 0x88c7, 0x88c8, 0x88ca, 0x88cb, 0x88cc, + 0x88cd, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d6, 0x88d7, 0x88da, + 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88e0, 0x88e1, 0x88e6, 0x88e7, + 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f2, + 0x88f5, 0x88f6, 0x88f7, 0x88fa, 0x88fb, 0x88fd, 0x88ff, 0x8900, + 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, + 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8911, 0x8914, 0x8915, + 0x8916, 0x8917, 0x8918, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920, + 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892c, + 0x892d, 0x892e, 0x892f, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, + /* 0xd2 */ + 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, + 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, + 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, + 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, + 0x895a, 0x895b, 0x895c, 0x895d, 0x8960, 0x8961, 0x8962, 0x8963, + 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, + 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, + 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897c, 0x897d, + 0x897e, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, + 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, + 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, + 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, + /* 0xd3 */ + 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, + 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, + 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, + 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c3, + 0x89cd, 0x89d3, 0x89d4, 0x89d5, 0x89d7, 0x89d8, 0x89d9, 0x89db, + 0x89dd, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e4, 0x89e7, 0x89e8, + 0x89e9, 0x89ea, 0x89ec, 0x89ed, 0x89ee, 0x89f0, 0x89f1, 0x89f2, + 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, + 0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a01, 0x8a02, 0x8a03, 0x8a04, + 0x8a05, 0x8a06, 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, + 0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, + 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, + /* 0xd4 */ + 0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, + 0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, + 0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, + 0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, + 0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, + 0x8a47, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, + 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, + 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, + 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, + 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, + 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, + 0x8a78, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80, + /* 0xd5 */ + 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, + 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, + 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, + 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, + 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, + 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, + 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, + 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, + 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, + 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, + 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, + 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, + /* 0xd6 */ + 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, + 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, + 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, + 0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03, + 0x8b04, 0x8b05, 0x8b06, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, + 0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, + 0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, + 0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, + 0x8b25, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, + 0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, + 0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, + 0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, + /* 0xd7 */ + 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, + 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, + 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, + 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, + 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6d, 0x8b6e, 0x8b6f, + 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, + 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, + 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, + 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, + 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, + 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, + 0x8bac, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bd0, 0x8bea, 0x8c09, 0x8c1e, + /* 0xd8 */ + 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, + 0x8c40, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c48, 0x8c4a, 0x8c4b, + 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, + 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, + 0x8c5f, 0x8c60, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, + 0x8c69, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, + 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, + 0x8c7f, 0x8c80, 0x8c81, 0x8c83, 0x8c84, 0x8c86, 0x8c87, 0x8c88, + 0x8c8b, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, + 0x8c95, 0x8c96, 0x8c97, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, + 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, + 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, + /* 0xd9 */ + 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, + 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, + 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, + 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, + 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, + 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, + 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, + 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, + 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, + 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, + 0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, + 0x8d06, 0x8d07, 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, + /* 0xda */ + 0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, + 0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d20, + 0x8d51, 0x8d52, 0x8d57, 0x8d5f, 0x8d65, 0x8d68, 0x8d69, 0x8d6a, + 0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, 0x8d72, 0x8d78, 0x8d79, 0x8d7a, + 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d82, 0x8d83, + 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, + 0x8d90, 0x8d92, 0x8d93, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, + 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8da0, 0x8da1, 0x8da2, + 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, + 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db2, 0x8db6, 0x8db7, + 0x8db9, 0x8dbb, 0x8dbd, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc5, 0x8dc7, + 0x8dc8, 0x8dc9, 0x8dca, 0x8dcd, 0x8dd0, 0x8dd2, 0x8dd3, 0x8dd4, + /* 0xdb */ + 0x8dd5, 0x8dd8, 0x8dd9, 0x8ddc, 0x8de0, 0x8de1, 0x8de2, 0x8de5, + 0x8de6, 0x8de7, 0x8de9, 0x8ded, 0x8dee, 0x8df0, 0x8df1, 0x8df2, + 0x8df4, 0x8df6, 0x8dfc, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02, + 0x8e03, 0x8e04, 0x8e06, 0x8e07, 0x8e08, 0x8e0b, 0x8e0d, 0x8e0e, + 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e15, 0x8e16, 0x8e17, 0x8e18, + 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e20, 0x8e21, 0x8e24, 0x8e25, + 0x8e26, 0x8e27, 0x8e28, 0x8e2b, 0x8e2d, 0x8e30, 0x8e32, 0x8e33, + 0x8e34, 0x8e36, 0x8e37, 0x8e38, 0x8e3b, 0x8e3c, 0x8e3e, 0x8e3f, + 0x8e43, 0x8e45, 0x8e46, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, + 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e5a, 0x8e5b, + 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, + 0x8e64, 0x8e65, 0x8e67, 0x8e68, 0x8e6a, 0x8e6b, 0x8e6e, 0x8e71, + /* 0xdc */ + 0x8e73, 0x8e75, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7d, + 0x8e7e, 0x8e80, 0x8e82, 0x8e83, 0x8e84, 0x8e86, 0x8e88, 0x8e89, + 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e91, 0x8e92, 0x8e93, + 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9d, + 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, + 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8ead, 0x8eae, 0x8eb0, 0x8eb1, + 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8ebb, + 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, + 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, + 0x8ecc, 0x8ecd, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, + 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, + 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, + /* 0xdd */ + 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, + 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, + 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, + 0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, + 0x8f05, 0x8f06, 0x8f07, 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, + 0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, + 0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, + 0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, + 0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, + 0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, + 0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, + 0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, + /* 0xde */ + 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, + 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, + 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, + 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, + 0x8f65, 0x8f6a, 0x8f80, 0x8f8c, 0x8f92, 0x8f9d, 0x8fa0, 0x8fa1, + 0x8fa2, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8faa, 0x8fac, 0x8fad, + 0x8fae, 0x8faf, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb7, 0x8fb8, + 0x8fba, 0x8fbb, 0x8fbc, 0x8fbf, 0x8fc0, 0x8fc3, 0x8fc6, 0x8fc9, + 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fcf, 0x8fd2, 0x8fd6, 0x8fd7, + 0x8fda, 0x8fe0, 0x8fe1, 0x8fe3, 0x8fe7, 0x8fec, 0x8fef, 0x8ff1, + 0x8ff2, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffe, + 0x8fff, 0x9007, 0x9008, 0x900c, 0x900e, 0x9013, 0x9015, 0x9018, + /* 0xdf */ + 0x9019, 0x901c, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, + 0x902a, 0x902b, 0x902c, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, + 0x9037, 0x9039, 0x903a, 0x903d, 0x903f, 0x9040, 0x9043, 0x9045, + 0x9046, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904e, 0x9054, + 0x9055, 0x9056, 0x9059, 0x905a, 0x905c, 0x905d, 0x905e, 0x905f, + 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906a, 0x906b, + 0x906c, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, + 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907e, 0x9081, 0x9084, + 0x9085, 0x9086, 0x9087, 0x9089, 0x908a, 0x908c, 0x908d, 0x908e, + 0x908f, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, 0x909c, + 0x909e, 0x909f, 0x90a0, 0x90a4, 0x90a5, 0x90a7, 0x90a8, 0x90a9, + 0x90ab, 0x90ad, 0x90b2, 0x90b7, 0x90bc, 0x90bd, 0x90bf, 0x90c0, + /* 0xe0 */ + 0x90c2, 0x90c3, 0x90c6, 0x90c8, 0x90c9, 0x90cb, 0x90cc, 0x90cd, + 0x90d2, 0x90d4, 0x90d5, 0x90d6, 0x90d8, 0x90d9, 0x90da, 0x90de, + 0x90df, 0x90e0, 0x90e3, 0x90e4, 0x90e5, 0x90e9, 0x90ea, 0x90ec, + 0x90ee, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f5, 0x90f6, 0x90f7, + 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90ff, 0x9100, 0x9101, 0x9103, + 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, + 0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, + 0x9115, 0x9116, 0x9117, 0x9118, 0x911a, 0x911b, 0x911c, 0x911d, + 0x911f, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, + 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x9130, 0x9132, + 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913a, 0x913b, + 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9144, + /* 0xe1 */ + 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915b, 0x915c, 0x915f, 0x9160, 0x9166, 0x9167, + 0x9168, 0x916b, 0x916d, 0x9173, 0x917a, 0x917b, 0x917c, 0x9180, + 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918a, 0x918e, + 0x918f, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, + 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a4, 0x91a5, + 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91ab, 0x91ac, 0x91b0, 0x91b1, + 0x91b2, 0x91b3, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91bb, 0x91bc, + 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, + 0x91c5, 0x91c6, 0x91c8, 0x91cb, 0x91d0, 0x91d2, 0x91d3, 0x91d4, + 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dd, + 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, + /* 0xe2 */ + 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, + 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, + 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, + 0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, + 0x9206, 0x9207, 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d, + 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, + 0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d, + 0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, + 0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, + 0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, + 0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, + 0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, + /* 0xe3 */ + 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, + 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, + 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, + 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, + 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, + 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, + 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, + 0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, + 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928f, + 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, + 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, + 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, + /* 0xe4 */ + 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92af, 0x92b0, + 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, + 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, + 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c9, + 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, + 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, + 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, + 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, + 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, + 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, + 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301, + 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, + /* 0xe5 */ + 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311, + 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, + 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321, + 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, + 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331, + 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, + 0x933a, 0x933b, 0x933c, 0x933d, 0x933f, 0x9340, 0x9341, 0x9342, + 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, + 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, + 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, + 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, + 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936b, + /* 0xe6 */ + 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, + 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, + 0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383, + 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, + 0x938c, 0x938d, 0x938e, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, + 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, + 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, + 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, + 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, + 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, + 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, + 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93cb, 0x93cc, 0x93cd, + /* 0xe7 */ + 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, + 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, + 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, + 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, + 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, + 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, + 0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, + 0x9407, 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e, + 0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, + 0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e, + 0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, + 0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e, + /* 0xe8 */ + 0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, + 0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943f, + 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, + 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, + 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, + 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, + 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, + 0x9468, 0x9469, 0x946a, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, + 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, + 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480, + 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94c7, + 0x94cf, 0x94d3, 0x94d4, 0x94da, 0x94e6, 0x94fb, 0x951c, 0x9520, + /* 0xe9 */ + 0x9527, 0x9533, 0x953d, 0x9543, 0x9548, 0x954b, 0x9555, 0x955a, + 0x9560, 0x956e, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957a, + 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, + 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, + 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, + 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, + 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, + 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, + 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, + 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, + 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, + 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, + /* 0xea */ + 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, + 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, + 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, + 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95ec, 0x95ff, 0x9607, 0x9613, + 0x9618, 0x961b, 0x961e, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, + 0x9627, 0x9628, 0x9629, 0x962b, 0x962c, 0x962d, 0x962f, 0x9630, + 0x9637, 0x9638, 0x9639, 0x963a, 0x963e, 0x9641, 0x9643, 0x964a, + 0x964e, 0x964f, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, + 0x9659, 0x965a, 0x965c, 0x965d, 0x965e, 0x9660, 0x9663, 0x9665, + 0x9666, 0x966b, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673, + 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, + 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968a, + /* 0xeb */ + 0x968c, 0x968e, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969a, + 0x969b, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, + 0x96a4, 0x96a5, 0x96a6, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, + 0x96ad, 0x96ae, 0x96af, 0x96b1, 0x96b2, 0x96b4, 0x96b5, 0x96b7, + 0x96b8, 0x96ba, 0x96bb, 0x96bf, 0x96c2, 0x96c3, 0x96c8, 0x96ca, + 0x96cb, 0x96d0, 0x96d1, 0x96d3, 0x96d4, 0x96d6, 0x96d7, 0x96d8, + 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e1, + 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96eb, 0x96ec, + 0x96ed, 0x96ee, 0x96f0, 0x96f1, 0x96f2, 0x96f4, 0x96f5, 0x96f8, + 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96ff, 0x9702, 0x9703, 0x9705, + 0x970a, 0x970b, 0x970c, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, + 0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971d, 0x971f, 0x9720, + /* 0xec */ + 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, + 0x9729, 0x972b, 0x972c, 0x972e, 0x972f, 0x9731, 0x9733, 0x9734, + 0x9735, 0x9736, 0x9737, 0x973a, 0x973b, 0x973c, 0x973d, 0x973f, + 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, + 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, + 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975a, 0x975c, + 0x975d, 0x975f, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976a, + 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, + 0x9775, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977d, 0x977e, + 0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, + 0x9788, 0x9789, 0x978a, 0x978c, 0x978e, 0x978f, 0x9790, 0x9793, + 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, + /* 0xed */ + 0x979e, 0x979f, 0x97a1, 0x97a2, 0x97a4, 0x97a5, 0x97a6, 0x97a7, + 0x97a8, 0x97a9, 0x97aa, 0x97ac, 0x97ae, 0x97b0, 0x97b1, 0x97b3, + 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, + 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, + 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, + 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, + 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, + 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, + 0x97e5, 0x97e8, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f4, + 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, + 0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, + 0x9807, 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, + /* 0xee */ + 0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, + 0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, + 0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, + 0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, + 0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, + 0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, + 0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, + 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, + 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, + 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, + 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, + 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, + /* 0xef */ + 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988b, 0x988e, + 0x9892, 0x9895, 0x9899, 0x98a3, 0x98a8, 0x98a9, 0x98aa, 0x98ab, + 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, + 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, + 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, + 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, + 0x98cc, 0x98cd, 0x98cf, 0x98d0, 0x98d4, 0x98d6, 0x98d7, 0x98db, + 0x98dc, 0x98dd, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, + 0x98e6, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, + 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, + 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, + 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, + /* 0xf0 */ + 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990e, 0x990f, 0x9911, + 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, + 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921, + 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, + 0x992a, 0x992b, 0x992c, 0x992d, 0x992f, 0x9930, 0x9931, 0x9932, + 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a, + 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942, + 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, + 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, + 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, + 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, + 0x9973, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x9989, + /* 0xf1 */ + 0x998c, 0x998e, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, + 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a6, 0x99a7, 0x99a9, + 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, + 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, + 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, + 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, + 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, + 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, + 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, + 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, + 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, + 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, + /* 0xf2 */ + 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01, + 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, 0x9a08, 0x9a09, + 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11, + 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19, + 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21, + 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29, + 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31, + 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39, + 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41, + 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, + 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, + 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, + /* 0xf3 */ + 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, + 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, + 0x9a6a, 0x9a6b, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a94, + 0x9a95, 0x9a99, 0x9aa6, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, + 0x9aae, 0x9aaf, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab9, 0x9abb, + 0x9abd, 0x9abe, 0x9abf, 0x9ac3, 0x9ac4, 0x9ac6, 0x9ac7, 0x9ac8, + 0x9ac9, 0x9aca, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad2, 0x9ad4, + 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, + 0x9ade, 0x9ae0, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae8, + 0x9ae9, 0x9aea, 0x9aec, 0x9aee, 0x9af0, 0x9af1, 0x9af2, 0x9af3, + 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9afa, 0x9afc, 0x9afd, + 0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b04, 0x9b05, 0x9b06, + /* 0xf4 */ + 0x9b07, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, + 0x9b11, 0x9b12, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19, + 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b20, 0x9b21, 0x9b22, + 0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, + 0x9b2c, 0x9b2d, 0x9b2e, 0x9b30, 0x9b31, 0x9b33, 0x9b34, 0x9b35, + 0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3d, 0x9b3e, 0x9b3f, + 0x9b40, 0x9b46, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4e, 0x9b50, 0x9b52, + 0x9b53, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, + 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, + 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, + 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, + 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, + /* 0xf5 */ + 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83, + 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, + 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, + 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, + 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, + 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, + 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, + 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, + 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, + 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, + 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, + 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, + /* 0xf6 */ + 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, + 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, + 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, + 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, + 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03, + 0x9c04, 0x9c05, 0x9c06, 0x9c07, 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, + 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13, + 0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, + 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23, + 0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, + 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33, + 0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, + /* 0xf7 */ + 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43, + 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, + 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, + 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, + 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, + 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, + 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, + 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, + 0x9c7d, 0x9c7e, 0x9c80, 0x9c83, 0x9c84, 0x9c89, 0x9c8a, 0x9c8c, + 0x9c8f, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9d, 0x9caa, + 0x9cac, 0x9caf, 0x9cb9, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, + 0x9cc8, 0x9cc9, 0x9cd1, 0x9cd2, 0x9cda, 0x9cdb, 0x9ce0, 0x9ce1, + /* 0xf8 */ + 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, + 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, + 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, + 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02, + 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, 0x9d08, 0x9d09, 0x9d0a, + 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12, + 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a, + 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22, + 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a, + 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32, + 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a, + 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42, + /* 0xf9 */ + 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, + 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, + 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, + 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, + 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, + 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, + 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, + 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, + 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, + 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, + 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, + 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, + /* 0xfa */ + 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, + 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, + 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, + 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, + 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, + 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, + 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, + 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, + 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, + 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, + 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, + 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02, + /* 0xfb */ + 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, 0x9e08, 0x9e09, 0x9e0a, + 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12, + 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a, + 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e24, 0x9e27, 0x9e2e, 0x9e30, + 0x9e34, 0x9e3b, 0x9e3c, 0x9e40, 0x9e4d, 0x9e50, 0x9e52, 0x9e53, + 0x9e54, 0x9e56, 0x9e59, 0x9e5d, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, + 0x9e65, 0x9e6e, 0x9e6f, 0x9e72, 0x9e74, 0x9e75, 0x9e76, 0x9e77, + 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e80, 0x9e81, + 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e89, 0x9e8a, 0x9e8c, 0x9e8d, + 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e94, 0x9e95, 0x9e96, 0x9e97, + 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9e, 0x9ea0, 0x9ea1, + 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, + /* 0xfc */ + 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, + 0x9eb3, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb9, 0x9eba, 0x9ebc, 0x9ebf, + 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, + 0x9eca, 0x9ecb, 0x9ecc, 0x9ed0, 0x9ed2, 0x9ed3, 0x9ed5, 0x9ed6, + 0x9ed7, 0x9ed9, 0x9eda, 0x9ede, 0x9ee1, 0x9ee3, 0x9ee4, 0x9ee6, + 0x9ee8, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, + 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9efa, 0x9efd, + 0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, + 0x9f07, 0x9f08, 0x9f09, 0x9f0a, 0x9f0c, 0x9f0f, 0x9f11, 0x9f12, + 0x9f14, 0x9f15, 0x9f16, 0x9f18, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, + 0x9f1e, 0x9f1f, 0x9f21, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, + 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2d, 0x9f2e, 0x9f30, 0x9f31, + /* 0xfd */ + 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f38, 0x9f3a, 0x9f3c, + 0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f45, 0x9f46, 0x9f47, + 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, + 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, + 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, + 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, + 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, + 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, + 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f81, 0x9f82, 0x9f8d, + 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, + 0x9f96, 0x9f97, 0x9f98, 0x9f9c, 0x9f9d, 0x9f9e, 0x9fa1, 0x9fa2, + 0x9fa3, 0x9fa4, 0x9fa5, 0xf92c, 0xf979, 0xf995, 0xf9e7, 0xf9f1, + /* 0xfe */ + 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18, + 0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29, +}; + +static int +gbkext2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0xa8 && c1 <= 0xfe)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { + unsigned int i = 96 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); + unsigned short wc = 0xfffd; + { + if (i < 12016) + wc = gbkext2_2uni_pagea8[i-3744]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + diff --git a/Externals/libiconv-1.14/lib/gbkext_inv.h b/Externals/libiconv-1.14/lib/gbkext_inv.h new file mode 100644 index 0000000000..45f57d9b76 --- /dev/null +++ b/Externals/libiconv-1.14/lib/gbkext_inv.h @@ -0,0 +1,2343 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GBK extensions + */ + +static const unsigned short gbkext_inv_2charset[14313] = { + 0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846, + 0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, + 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854, + 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, + 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, + 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, + 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, + 0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, + 0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, + 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, + 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894, + 0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, + 0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963, + 0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, + 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141, + 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, + 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, + 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, + 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, + 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, + 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, + 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, + 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182, + 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a, + 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, + 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, + 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, + 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, + 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, + 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, + 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, + 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, + 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, + 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, + 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, + 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, + 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, + 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, + 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, + 0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, + 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, + 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, + 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, + 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, + 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, + 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, + 0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, + 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, + 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, + 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, + 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, + 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, + 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, + 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, + 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, + 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, + 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, + 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, + 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, + 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, + 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, + 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, + 0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, + 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, + 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, + 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, + 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, + 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, + 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, + 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, + 0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, + 0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, + 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, + 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, + 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, + 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, + 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, + 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, + 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, + 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, + 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, + 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, + 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, + 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, + 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, + 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, + 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, + 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, + 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, + 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, + 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, + 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, + 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, + 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, + 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, + 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, + 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, + 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, + 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, + 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, + 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, + 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, + 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, + 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, + 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, + 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, + 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, + 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, + 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, + 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541, + 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549, + 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, + 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, + 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, + 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, + 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, + 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, + 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, + 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, + 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, + 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, + 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, + 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, + 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, + 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, + 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, + 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca, + 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, + 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, + 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, + 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, + 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, + 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, + 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643, + 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, + 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, + 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, + 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, + 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, + 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, + 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, + 0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, + 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, + 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, + 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, + 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, + 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, + 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, + 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, + 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, + 0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, + 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, + 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, + 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, + 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, + 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, + 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, + 0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, + 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, + 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, + 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, + 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, + 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, + 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, + 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, + 0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, + 0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, + 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, + 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, + 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, + 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, + 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, + 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, + 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, + 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, + 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, + 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, + 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, + 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, + 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, + 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, + 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, + 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, + 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, + 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, + 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, + 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, + 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, + 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880, + 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, + 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, + 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, + 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, + 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, + 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, + 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, + 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, + 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, + 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, + 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, + 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, + 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, + 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, + 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, + 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, + 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, + 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, + 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, + 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, + 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, + 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, + 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, + 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, + 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a, + 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, + 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, + 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, + 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, + 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, + 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, + 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, + 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, + 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, + 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, + 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, + 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, + 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, + 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, + 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, + 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, + 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, + 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, + 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, + 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, + 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, + 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, + 0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, + 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, + 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, + 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, + 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, + 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, + 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, + 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, + 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, + 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, + 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, + 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, + 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, + 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, + 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, + 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, + 0x8afd, 0x8afe, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, + 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, + 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, + 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, + 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, + 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, + 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, + 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, + 0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, + 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, + 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, + 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, + 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, + 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, + 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, + 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, + 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, + 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, + 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, + 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, + 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, + 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, + 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, + 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, + 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, + 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, + 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, + 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, + 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, + 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, + 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, + 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80, + 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88, + 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, + 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, + 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, + 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, + 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, + 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, + 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, + 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, + 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, + 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, + 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, + 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, + 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, + 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, + 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41, + 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49, + 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, + 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, + 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, + 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, + 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, + 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, + 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82, + 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a, + 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, + 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, + 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, + 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, + 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, + 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, + 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, + 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, + 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, + 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, + 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, + 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, + 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, + 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, + 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, + 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, + 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, + 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, + 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, + 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, + 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, + 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, + 0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, + 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, + 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, + 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, + 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, + 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, + 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, + 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, + 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, + 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, + 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, + 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, + 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, + 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, + 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, + 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, + 0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, + 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, + 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, + 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, + 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, + 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, + 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, + 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, + 0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, + 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, + 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, + 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, + 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, + 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, + 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, + 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, + 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, + 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, + 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, + 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, + 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, + 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, + 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, + 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, + 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, + 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, + 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, + 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, + 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, + 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, + 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, + 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080, + 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, + 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, + 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, + 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, + 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, + 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, + 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, + 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, + 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, + 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, + 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, + 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, + 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, + 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, + 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, + 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, + 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, + 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, + 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, + 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, + 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, + 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, + 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, + 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182, + 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, + 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, + 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, + 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, + 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, + 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, + 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, + 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, + 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, + 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, + 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, + 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, + 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, + 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, + 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, + 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x9240, 0x9241, 0x9242, 0x9243, + 0x9244, 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, + 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, + 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, + 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, + 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, + 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, + 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, + 0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, + 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, + 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, + 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, + 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, + 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, + 0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, + 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, + 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, + 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc, + 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, + 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, + 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, + 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, + 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, + 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, + 0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, + 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, + 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, + 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, + 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, + 0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, + 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, + 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, + 0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, + 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, + 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, + 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, + 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, + 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, + 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, + 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, + 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, + 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, + 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, + 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, + 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, + 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, + 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, + 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, + 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, + 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, + 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, + 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, + 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, + 0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, + 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, + 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480, + 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, + 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, + 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, + 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, + 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, + 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, + 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, + 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, + 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8, + 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, + 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, + 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, + 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, + 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, + 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, + 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541, + 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, + 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, + 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, + 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, + 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, + 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, + 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579, + 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, + 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, + 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, + 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, + 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, + 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, + 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, + 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, + 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, + 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, + 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, + 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, + 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, + 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, + 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, + 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, + 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, + 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b, + 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, + 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, + 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, + 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, + 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, + 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, + 0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, + 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, + 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, + 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, + 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, + 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, + 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, + 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, + 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, + 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, + 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, + 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, + 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, + 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, + 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, + 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, + 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, + 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, + 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, + 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, + 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, + 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, + 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, + 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, + 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, + 0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, + 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, + 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, + 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, + 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, + 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, + 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, + 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, + 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, + 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, + 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, + 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, + 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, + 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, + 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, + 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, + 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, + 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, + 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, + 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, + 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, + 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, + 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880, + 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, + 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, + 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, + 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, + 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, + 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, + 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, + 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, + 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, + 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, + 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, + 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, + 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, + 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, + 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, + 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, + 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, + 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, + 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, + 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, + 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, + 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, + 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, + 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982, + 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, + 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, + 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, + 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, + 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, + 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, + 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, + 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, + 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, + 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, + 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, + 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, + 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, + 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, + 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, + 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43, + 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, + 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, + 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, + 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, + 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, + 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, + 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, + 0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, + 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, + 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, + 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, + 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, + 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, + 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, + 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, + 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, + 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, + 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, + 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, + 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, + 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, + 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, + 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, + 0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, + 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, + 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, + 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, + 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, + 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, + 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, + 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, + 0x9b7e, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, + 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, + 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, + 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, + 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, + 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, + 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, + 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, + 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, + 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, + 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, + 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, + 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, + 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, + 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, + 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, + 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, + 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, + 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, + 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, + 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, + 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, + 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, + 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80, + 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88, + 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, + 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, + 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, + 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, + 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, + 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, + 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, + 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, + 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, + 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, + 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, + 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, + 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, + 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, + 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9d40, 0x9d41, + 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, + 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, + 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, + 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, + 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, + 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, + 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, + 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, + 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, + 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, + 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, + 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, + 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, + 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, + 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, + 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, + 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, + 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, + 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, + 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, + 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, + 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, + 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, + 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42, 0x9e43, + 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, + 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, + 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, + 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, + 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, + 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, + 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, + 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, + 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, + 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, + 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, + 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, + 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, + 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, + 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, + 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, + 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, + 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, + 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, + 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, + 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, + 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, + 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, + 0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, + 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, + 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, + 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, + 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, + 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, + 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, + 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, + 0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, + 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, + 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, + 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, + 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, + 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, + 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, + 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, + 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, + 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, + 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, + 0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, + 0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, + 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, + 0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, + 0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, + 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, + 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, + 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, + 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, + 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, + 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, + 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, + 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080, + 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, + 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, + 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, + 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, + 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, + 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, + 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, + 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, + 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, + 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, + 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, + 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, + 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, + 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, + 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, + 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, + 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, + 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, + 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, + 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, + 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, + 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, + 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, + 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82, + 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, + 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, + 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, + 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41, + 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, + 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, + 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59, + 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61, + 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69, + 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71, + 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79, + 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82, + 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, + 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92, + 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, + 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41, + 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, + 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, + 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, + 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, + 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, + 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, + 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, + 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82, + 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, + 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, + 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, + 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, + 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, + 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, + 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, + 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, + 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, + 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, + 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, + 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82, + 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a, + 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, + 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, + 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41, + 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, + 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, + 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, + 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, + 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, + 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, + 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, + 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82, + 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, + 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, + 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, + 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41, + 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49, + 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, + 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, + 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, + 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, + 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, + 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, + 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82, + 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, + 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, + 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, + 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041, + 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, + 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, + 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, + 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061, + 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, + 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, + 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, + 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, + 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, + 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, + 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, + 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141, + 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, + 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, + 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, + 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, + 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, + 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, + 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, + 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182, + 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, + 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, + 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, + 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241, + 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, + 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, + 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, + 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, + 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, + 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, + 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, + 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282, + 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, + 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, + 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, + 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341, + 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, + 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, + 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, + 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, + 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, + 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, + 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, + 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382, + 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, + 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, + 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, + 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, + 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, + 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, + 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, + 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, + 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, + 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, + 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, + 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, + 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a, + 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, + 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, + 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, + 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, + 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, + 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, + 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, + 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, + 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, + 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, + 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb580, 0xb581, 0xb582, + 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, + 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, + 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, + 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, + 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xb649, + 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, + 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, + 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, + 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, + 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, + 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, + 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb680, 0xb681, 0xb682, + 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, + 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, + 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, + 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741, + 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, + 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, + 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, + 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, + 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, + 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, + 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, + 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782, + 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, + 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, + 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, + 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841, + 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, + 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, + 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, + 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, + 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, + 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, + 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, + 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, + 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, + 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, + 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, + 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941, + 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, + 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, + 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, + 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, + 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, + 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, + 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, + 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982, + 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, + 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, + 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, + 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41, + 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, + 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, + 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, + 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, + 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, + 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, + 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, + 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, + 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, + 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, + 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, + 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41, + 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, + 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, + 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, + 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, + 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, + 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, + 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, + 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82, + 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, + 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, + 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, + 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41, + 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, + 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, + 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, + 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, + 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, + 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, + 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, + 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc80, 0xbc81, 0xbc82, + 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, + 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, + 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, + 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41, + 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49, + 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, + 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, + 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, + 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, + 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, + 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, + 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82, + 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, + 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, + 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, + 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41, + 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, + 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, + 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, + 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, + 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, + 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, + 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, + 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, + 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, + 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, + 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, + 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, + 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, + 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, + 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, + 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, + 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, + 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, + 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, + 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf80, 0xbf81, 0xbf82, + 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, + 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, + 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, + 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, + 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, + 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, + 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, + 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, + 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, + 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, + 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, + 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082, + 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, + 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, + 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, + 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141, + 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, + 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, + 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, + 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, + 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, + 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, + 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, + 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182, + 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, + 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, + 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, + 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241, + 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, + 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, + 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, + 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, + 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, + 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, + 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, + 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282, + 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, + 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, + 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, + 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341, + 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, + 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, + 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, + 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, + 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, + 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, + 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, + 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382, + 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, + 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, + 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, + 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441, + 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449, + 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, + 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, + 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, + 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, + 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, + 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, + 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482, + 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, + 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, + 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, + 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, + 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, + 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, + 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, + 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, + 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, + 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, + 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, + 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582, + 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, + 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, + 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, + 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641, + 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, + 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, + 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, + 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, + 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, + 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, + 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, + 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682, + 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a, + 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, + 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, + 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741, + 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, + 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, + 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, + 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, + 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, + 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, + 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, + 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782, + 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, + 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, + 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, + 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, + 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, + 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, + 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, + 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, + 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, + 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, + 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, + 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, + 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, + 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, + 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, + 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941, + 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, + 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, + 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, + 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, + 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, + 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, + 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, + 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982, + 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, + 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, + 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, + 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, + 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, + 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, + 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, + 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, + 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, + 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, + 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, + 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82, + 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, + 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, + 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, + 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41, + 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, + 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, + 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, + 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, + 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, + 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, + 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, + 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb80, 0xcb81, 0xcb82, + 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, + 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, + 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, + 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41, + 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, + 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, + 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, + 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, + 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, + 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, + 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, + 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82, + 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, + 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, + 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, + 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcd40, 0xcd41, + 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, + 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, + 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, + 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, + 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, + 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, + 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, + 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82, + 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a, + 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, + 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, + 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41, + 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, + 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, + 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, + 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, + 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, + 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, + 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, + 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82, + 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, + 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, + 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, + 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, + 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, + 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, + 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, + 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, + 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, + 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, + 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, + 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82, + 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, + 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, + 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, + 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041, + 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, + 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, + 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, + 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, + 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, + 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, + 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, + 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xd082, + 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, + 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, + 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, + 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd140, 0xd141, + 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, + 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, + 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, + 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, + 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, + 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, + 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, + 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182, + 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, + 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, + 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, + 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241, + 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, + 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, + 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, + 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, + 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, + 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, + 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, + 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd280, 0xd281, 0xd282, + 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, + 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, + 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, + 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341, + 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, + 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, + 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, + 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, + 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, + 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, + 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, + 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, + 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, + 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, + 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, + 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, + 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, + 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, + 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, + 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, + 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, + 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, + 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, + 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482, + 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a, + 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, + 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, + 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541, + 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, + 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, + 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, + 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, + 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, + 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, + 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, + 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, + 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, + 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, + 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, + 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, + 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, + 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, + 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, + 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, + 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, + 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, + 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, + 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682, + 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, + 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, + 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, + 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, + 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, + 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, + 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, + 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, + 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, + 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, + 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, + 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782, + 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a, + 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, + 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, + 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841, + 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, + 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, + 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, + 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, + 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, + 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, + 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, + 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882, + 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a, + 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, + 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, + 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, + 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, + 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, + 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, + 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, + 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, + 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, + 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, + 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, + 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, + 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, + 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, + 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, + 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, + 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, + 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, + 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, + 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, + 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, + 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, + 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82, + 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, + 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, + 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, + 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41, + 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49, + 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, + 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, + 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, + 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, + 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, + 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, + 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82, + 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a, + 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, + 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, + 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41, + 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49, + 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, + 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, + 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, + 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, + 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, + 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, + 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, + 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, + 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, + 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, + 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, + 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, + 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, + 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, + 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, + 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, + 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, + 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, + 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, + 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, + 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, + 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, + 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, + 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, + 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, + 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, + 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, + 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, + 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, + 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, + 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82, + 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a, + 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, + 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, + 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41, + 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49, + 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, + 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, + 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, + 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, + 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, + 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, + 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82, + 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a, + 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, + 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, + 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041, + 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, + 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, + 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, + 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, + 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, + 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, + 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, + 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082, + 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a, + 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, + 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, + 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141, + 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, + 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, + 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, + 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, + 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, + 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, + 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, + 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182, + 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, + 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, + 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, + 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, + 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, + 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, + 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, + 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, + 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, + 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, + 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, + 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, + 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, + 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, + 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, + 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, + 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, + 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, + 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, + 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, + 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, + 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, + 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, + 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382, + 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a, + 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, + 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, + 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441, + 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, + 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, + 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, + 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, + 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, + 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, + 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, + 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482, + 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a, + 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, + 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, + 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541, + 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549, + 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, + 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, + 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, + 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, + 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, + 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, + 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, + 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, + 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, + 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, + 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641, + 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, + 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, + 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, + 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, + 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, + 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, + 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, + 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, + 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, + 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, + 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, + 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, + 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749, + 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, + 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, + 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, + 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, + 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, + 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, + 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782, + 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a, + 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, + 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, + 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841, + 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849, + 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, + 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, + 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, + 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, + 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, + 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, + 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882, + 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a, + 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, + 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, + 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941, + 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949, + 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, + 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, + 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, + 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, + 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, + 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, + 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, + 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, + 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, + 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, + 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, + 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, + 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, + 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, + 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, + 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, + 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, + 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, + 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, + 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a, + 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, + 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, + 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41, + 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49, + 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, + 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, + 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, + 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, + 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, + 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, + 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, + 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a, + 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, + 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, + 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41, + 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, + 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, + 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, + 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, + 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, + 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, + 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, + 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82, + 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a, + 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, + 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, + 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, + 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49, + 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, + 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, + 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, + 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, + 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, + 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, + 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82, + 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a, + 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, + 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, + 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41, + 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49, + 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, + 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, + 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, + 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, + 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, + 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, + 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82, + 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a, + 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, + 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, + 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41, + 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, + 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, + 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, + 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, + 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, + 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, + 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, + 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xef82, + 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, + 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, + 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, + 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xf040, 0xf041, + 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049, + 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, + 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, + 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, + 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, + 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, + 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, + 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, + 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, + 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, + 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, + 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf140, 0xf141, + 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, + 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, + 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, + 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, + 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, + 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, + 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, + 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf180, 0xf181, 0xf182, + 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, + 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, + 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, + 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf240, 0xf241, + 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249, + 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, + 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, + 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, + 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269, + 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, + 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, + 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf280, 0xf281, 0xf282, + 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, + 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, + 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, + 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf340, 0xf341, + 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349, + 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, + 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, + 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, + 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, + 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, + 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, + 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf382, + 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a, + 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, + 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, + 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf440, 0xf441, + 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449, + 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, + 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, + 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, + 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, + 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, + 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, + 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, + 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, + 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, + 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, + 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, + 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, + 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, + 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, + 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, + 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, + 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, + 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, + 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, + 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, + 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, + 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, + 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, + 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, + 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, + 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, + 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, + 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, + 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, + 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, + 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, + 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, + 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, + 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, + 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, + 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, + 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, + 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, + 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, + 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, + 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, + 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, + 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782, + 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a, + 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, + 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, + 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841, + 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, + 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, + 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, + 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, + 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, + 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, + 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, + 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, + 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, + 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, + 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, + 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, + 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, + 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, + 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, + 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, + 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, + 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, + 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, + 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, + 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, + 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, + 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, + 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, + 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, + 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, + 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, + 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, + 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, + 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, + 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, + 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, + 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, + 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, + 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, + 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, + 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, + 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, + 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, + 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, + 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, + 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, + 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, + 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82, + 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, + 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, + 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, + 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, + 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49, + 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, + 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, + 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, + 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, + 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, + 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, + 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82, + 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a, + 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, + 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, + 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41, + 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, + 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, + 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, + 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, + 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, + 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, + 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, + 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82, + 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a, + 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, + 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, + 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41, + 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49, + 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968, + 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, + 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, + 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981, + 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956, + 0xa957, +}; + +static const Summary16 gbkext_inv_uni2indx_page02[14] = { + /* 0x0200 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0c00 }, { 2, 0x0200 }, +}; +static const Summary16 gbkext_inv_uni2indx_page20[44] = { + /* 0x2000 */ + { 3, 0x0000 }, { 3, 0x0029 }, { 6, 0x0020 }, { 7, 0x0020 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + /* 0x2100 */ + { 8, 0x0220 }, { 10, 0x0000 }, { 10, 0x0002 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x03c0 }, { 15, 0x0000 }, { 15, 0x0000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, + /* 0x2200 */ + { 15, 0x0000 }, { 15, 0x8020 }, { 17, 0x0008 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0004 }, { 19, 0x00c0 }, { 21, 0x0000 }, + { 21, 0x0000 }, { 21, 0x0020 }, { 22, 0x0000 }, { 22, 0x8000 }, +}; +static const Summary16 gbkext_inv_uni2indx_page25[17] = { + /* 0x2500 */ + { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, + { 23, 0x0000 }, { 23, 0xffff }, { 39, 0xffff }, { 55, 0x000f }, + { 59, 0xfffe }, { 74, 0x0038 }, { 77, 0x0000 }, { 77, 0x3000 }, + { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x003c }, { 83, 0x0000 }, + /* 0x2600 */ + { 83, 0x0200 }, +}; +static const Summary16 gbkext_inv_uni2indx_page30[16] = { + /* 0x3000 */ + { 84, 0x00c0 }, { 86, 0x6004 }, { 89, 0x03fe }, { 98, 0x0000 }, + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, + { 98, 0x0000 }, { 98, 0x7800 }, { 102, 0x0000 }, { 102, 0x0000 }, + { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x7000 }, +}; +static const Summary16 gbkext_inv_uni2indx_page32[30] = { + /* 0x3200 */ + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0002 }, + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0008 }, { 107, 0x0000 }, + { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, + /* 0x3300 */ + { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, + { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, + { 107, 0xc000 }, { 109, 0x7000 }, { 112, 0x0002 }, { 113, 0x0000 }, + { 113, 0x4010 }, { 115, 0x0026 }, +}; +static const Summary16 gbkext_inv_uni2indx_page4e[1307] = { + /* 0x4e00 */ + { 118, 0x8074 }, { 123, 0x8084 }, { 126, 0xc24b }, { 133, 0x10aa }, + { 138, 0x0457 }, { 144, 0x0ca2 }, { 149, 0xfdbc }, { 161, 0xbff4 }, + { 173, 0x04bf }, { 181, 0x72c1 }, { 188, 0x8408 }, { 191, 0x73d3 }, + { 201, 0x9100 }, { 204, 0x1c05 }, { 209, 0xe2c5 }, { 217, 0x5712 }, + /* 0x4f00 */ + { 224, 0x19fd }, { 234, 0x307c }, { 241, 0x730a }, { 248, 0xcaaa }, + { 256, 0x1fb7 }, { 267, 0x0054 }, { 270, 0x6d46 }, { 278, 0x27a6 }, + { 286, 0x54e7 }, { 295, 0xd76d }, { 306, 0x2816 }, { 311, 0x7fdf }, + { 325, 0x3bc7 }, { 335, 0x0a7c }, { 342, 0x18b5 }, { 349, 0xbaf5 }, + /* 0x5000 */ + { 360, 0x4fff }, { 373, 0x68eb }, { 382, 0x889d }, { 389, 0xabff }, + { 402, 0x2e77 }, { 412, 0xebdf }, { 425, 0xefdf }, { 439, 0x373f }, + { 450, 0xdede }, { 462, 0xffff }, { 478, 0xec57 }, { 488, 0xf3fb }, + { 501, 0x7fff }, { 516, 0xfbbf }, { 530, 0x8f3f }, { 541, 0xf7d7 }, + /* 0x5100 */ + { 554, 0xf73f }, { 567, 0xfffb }, { 582, 0xfffd }, { 597, 0x7fff }, + { 612, 0xd484 }, { 618, 0xeb8d }, { 628, 0x86db }, { 637, 0xc404 }, + { 641, 0xccd8 }, { 649, 0xe51b }, { 658, 0x67ca }, { 667, 0xc710 }, + { 673, 0x652e }, { 681, 0xd7fd }, { 694, 0x57ec }, { 704, 0x4096 }, + /* 0x5200 */ + { 709, 0x9a30 }, { 715, 0xd039 }, { 722, 0x94ee }, { 731, 0x5036 }, + { 737, 0xcbf0 }, { 746, 0xafac }, { 756, 0x795d }, { 766, 0x5ffb }, + { 779, 0xfef9 }, { 792, 0x17f6 }, { 802, 0xc0f0 }, { 808, 0x3ff1 }, + { 819, 0xf577 }, { 831, 0x7eba }, { 842, 0xffef }, { 857, 0x39fe }, + /* 0x5300 */ + { 868, 0x5e9e }, { 878, 0xd91e }, { 887, 0xbbb4 }, { 897, 0x31ff }, + { 908, 0x3855 }, { 915, 0x2b11 }, { 921, 0x3520 }, { 926, 0x7a44 }, + { 933, 0xc58b }, { 941, 0x5adf }, { 952, 0xbc93 }, { 961, 0x77bf }, + { 974, 0xc0f9 }, { 982, 0x742d }, { 990, 0x0086 }, { 993, 0xc410 }, + /* 0x5400 */ + { 997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 }, + { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 }, + { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 }, + { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 }, + /* 0x5500 */ + { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 }, + { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f }, + { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 }, + { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 }, + /* 0x5600 */ + { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 }, + { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd }, + { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f }, + { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc }, + /* 0x5700 */ + { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 }, + { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 }, + { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb }, + { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef }, + /* 0x5800 */ + { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde }, + { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff }, + { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff }, + { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 }, + /* 0x5900 */ + { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d }, + { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 }, + { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb }, + { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff }, + /* 0x5a00 */ + { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 }, + { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f }, + { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 }, + { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd }, + /* 0x5b00 */ + { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b }, + { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 }, + { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 }, + { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe }, + /* 0x5c00 */ + { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed }, + { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd }, + { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 }, + { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe }, + /* 0x5d00 */ + { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef }, + { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef }, + { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f }, + { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 }, + /* 0x5e00 */ + { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d }, + { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 }, + { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 }, + { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f }, + /* 0x5f00 */ + { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd }, + { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 }, + { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f }, + { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd }, + /* 0x6000 */ + { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df }, + { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 }, + { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 }, + { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 }, + /* 0x6100 */ + { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff }, + { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e }, + { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f }, + { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf }, + /* 0x6200 */ + { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 }, + { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 }, + { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd }, + { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 }, + /* 0x6300 */ + { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb }, + { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d }, + { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 }, + { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab }, + /* 0x6400 */ + { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef }, + { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff }, + { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e }, + { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff }, + /* 0x6500 */ + { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f }, + { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a }, + { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe }, + { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c }, + /* 0x6600 */ + { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d }, + { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e }, + { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef }, + { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 }, + /* 0x6700 */ + { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd }, + { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 }, + { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 }, + { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 }, + /* 0x6800 */ + { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 }, + { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f }, + { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 }, + { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc }, + /* 0x6900 */ + { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee }, + { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d }, + { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d }, + { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb }, + /* 0x6a00 */ + { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd }, + { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd }, + { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff }, + { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff }, + /* 0x6b00 */ + { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b }, + { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff }, + { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 }, + { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 }, + /* 0x6c00 */ + { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca }, + { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa }, + { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 }, + { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 }, + /* 0x6d00 */ + { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 }, + { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f }, + { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb }, + { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 }, + /* 0x6e00 */ + { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb }, + { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff }, + { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 }, + { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef }, + /* 0x6f00 */ + { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 }, + { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb }, + { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 }, + { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff }, + /* 0x7000 */ + { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf }, + { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e }, + { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 }, + { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f }, + /* 0x7100 */ + { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc }, + { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 }, + { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 }, + { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff }, + /* 0x7200 */ + { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c }, + { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db }, + { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e }, + { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 }, + /* 0x7300 */ + { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d }, + { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff }, + { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 }, + { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb }, + /* 0x7400 */ + { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 }, + { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e }, + { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff }, + { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f }, + /* 0x7500 */ + { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 }, + { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb }, + { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 }, + { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec }, + /* 0x7600 */ + { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 }, + { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff }, + { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 }, + { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 }, + /* 0x7700 */ + { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f }, + { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff }, + { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 }, + { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 }, + /* 0x7800 */ + { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e }, + { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f }, + { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 }, + { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b }, + /* 0x7900 */ + { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef }, + { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f }, + { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 }, + { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe }, + /* 0x7a00 */ + { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 }, + { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e }, + { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 }, + { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff }, + /* 0x7b00 */ + { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 }, + { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 }, + { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed }, + { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d }, + /* 0x7c00 */ + { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff }, + { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 }, + { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 }, + { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff }, + /* 0x7d00 */ + { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff }, + { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f }, + { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff }, + { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff }, + /* 0x7e00 */ + { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff }, + { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff }, + { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 }, + { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 }, + /* 0x7f00 */ + { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 }, + { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 }, + { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa }, + { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 }, + /* 0x8000 */ + { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 }, + { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd }, + { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 }, + { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 }, + /* 0x8100 */ + { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 }, + { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec }, + { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 }, + { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 }, + /* 0x8200 */ + { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 }, + { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 }, + { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 }, + { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d }, + /* 0x8300 */ + { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 }, + { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f }, + { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 }, + { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 }, + /* 0x8400 */ + { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd }, + { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 }, + { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb }, + { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe }, + /* 0x8500 */ + { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f }, + { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb }, + { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e }, + { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff }, + /* 0x8600 */ + { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff }, + { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd }, + { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c }, + { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 }, + /* 0x8700 */ + { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d }, + { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae }, + { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 }, + { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff }, + /* 0x8800 */ + { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb }, + { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a }, + { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d }, + { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 }, + /* 0x8900 */ + { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae }, + { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff }, + { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff }, + { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 }, + /* 0x8a00 */ + { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff }, + { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff }, + { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff }, + { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff }, + /* 0x8b00 */ + { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff }, + { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff }, + { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 }, + { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 }, + /* 0x8c00 */ + { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 }, + { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 }, + { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff }, + { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff }, + /* 0x8d00 */ + { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 }, + { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 }, + { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 }, + { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 }, + /* 0x8e00 */ + { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd }, + { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa }, + { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb }, + { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff }, + /* 0x8f00 */ + { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff }, + { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 }, + { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc }, + { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 }, + /* 0x9000 */ + { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f }, + { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf }, + { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 }, + { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef }, + /* 0x9100 */ + { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd }, + { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 }, + { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf }, + { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff }, + /* 0x9200 */ + { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff }, + { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef }, + { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff }, + { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff }, + /* 0x9300 */ + { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff }, + { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff }, + { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff }, + { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff }, + /* 0x9400 */ + { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff }, + { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff }, + { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 }, + { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 }, + /* 0x9500 */ + { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 }, + { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 }, + { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff }, + { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 }, + /* 0x9600 */ + { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 }, + { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b }, + { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 }, + { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 }, + /* 0x9700 */ + { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa }, + { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 }, + { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb }, + { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 }, + /* 0x9800 */ + { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff }, + { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f }, + { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff }, + { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff }, + /* 0x9900 */ + { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff }, + { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 }, + { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff }, + { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff }, + /* 0x9a00 */ + { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff }, + { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 }, + { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c }, + { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff }, + /* 0x9b00 */ + { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb }, + { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff }, + { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff }, + { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff }, + /* 0x9c00 */ + { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff }, + { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff }, + { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 }, + { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff }, + /* 0x9d00 */ + { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff }, + { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff }, + { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff }, + { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff }, + /* 0x9e00 */ + { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 }, + { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 }, + { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef }, + { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff }, + /* 0x9f00 */ + { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f }, + { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff }, + { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e }, +}; +static const Summary16 gbkext_inv_uni2indx_pagef9[19] = { + /* 0xf900 */ + { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 }, + { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 }, + { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 }, + { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 }, + /* 0xfa00 */ + { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b }, +}; +static const Summary16 gbkext_inv_uni2indx_pagefe[31] = { + /* 0xfe00 */ + { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 }, + { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 }, + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, + /* 0xff00 */ + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, + { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 }, +}; + +static int +gbkext_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0200 && wc < 0x02e0) + summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020]; + else if (wc >= 0x2000 && wc < 0x22c0) + summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x2500 && wc < 0x2610) + summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250]; + else if (wc >= 0x3000 && wc < 0x3100) + summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x3200 && wc < 0x33e0) + summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320]; + else if (wc >= 0x4e00 && wc < 0x9fb0) + summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xf900 && wc < 0xfa30) + summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90]; + else if (wc >= 0xfe00 && wc < 0xfff0) + summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = gbkext_inv_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/genaliases.c b/Externals/libiconv-1.14/lib/genaliases.c new file mode 100644 index 0000000000..b54b97d5fc --- /dev/null +++ b/Externals/libiconv-1.14/lib/genaliases.c @@ -0,0 +1,104 @@ +/* Copyright (C) 1999-2001, 2003, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Creates the aliases.gperf table. */ + +#include +#include + +static void emit_alias (FILE* out1, const char* alias, const char* c_name) +{ + /* Output alias in upper case. */ + const char* s = alias; + for (; *s; s++) { + unsigned char c = * (unsigned char *) s; + if (c >= 0x80) + exit(1); + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + putc(c, out1); + } + fprintf(out1,", ei_%s\n", c_name); +} + +static void emit_encoding (FILE* out1, FILE* out2, const char* const* names, size_t n, const char* c_name) +{ + fprintf(out2,"grep 'sizeof(\""); + /* Output *names in upper case. */ + { + const char* s = *names; + for (; *s; s++) { + unsigned char c = * (unsigned char *) s; + if (c >= 0x80) + exit(1); + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + putc(c, out2); + } + } + fprintf(out2,"\")' tmp.h | sed -e 's|^.*\\(stringpool_str[0-9]*\\).*$| (int)(long)\\&((struct stringpool_t *)0)->\\1,|'\n"); + for (; n > 0; names++, n--) + emit_alias(out1, *names, c_name); +} + +int main () +{ + FILE* stdout2; + + printf("struct alias { int name; unsigned int encoding_index; };\n"); + printf("%%struct-type\n"); + printf("%%language=ANSI-C\n"); + printf("%%define hash-function-name aliases_hash\n"); + printf("%%define lookup-function-name aliases_lookup\n"); + printf("%%7bit\n"); + printf("%%readonly-tables\n"); + printf("%%global-table\n"); + printf("%%define word-array-name aliases\n"); + printf("%%pic\n"); + printf("%%%%\n"); + +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + { \ + static const char* const names[] = BRACIFY xxx_names; \ + emit_encoding(stdout,stdout2,names,sizeof(names)/sizeof(names[0]),#xxx); \ + } +#define BRACIFY(...) { __VA_ARGS__ } +#define DEFALIAS(xxx_alias,xxx) emit_alias(stdout,xxx_alias,#xxx); + + stdout2 = fdopen(3, "w"); + if (stdout2 == NULL) + exit(1); +#include "encodings.def" + if (fclose(stdout2)) + exit(1); + + stdout2 = fdopen(4, "w"); + if (stdout2 == NULL) + exit(1); +#include "encodings_local.def" + if (fclose(stdout2)) + exit(1); + +#undef DEFALIAS +#undef BRACIFY +#undef DEFENCODING + + if (ferror(stdout) || fclose(stdout)) + exit(1); + exit(0); +} diff --git a/Externals/libiconv-1.14/lib/genaliases2.c b/Externals/libiconv-1.14/lib/genaliases2.c new file mode 100644 index 0000000000..1b789ed9aa --- /dev/null +++ b/Externals/libiconv-1.14/lib/genaliases2.c @@ -0,0 +1,83 @@ +/* Copyright (C) 1999-2003, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Creates the aliases2.h table. */ + +#include +#include + +static unsigned int counter = 0; + +static void emit_alias (FILE* out1, const char* tag, const char* alias, const char* c_name) +{ + fprintf(out1," S(%s_%u, \"",tag,counter); + /* Output alias in upper case. */ + { + const char* s = alias; + for (; *s; s++) { + unsigned char c = * (unsigned char *) s; + if (c >= 0x80) + exit(1); + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + putc(c, out1); + } + } + fprintf(out1,"\", ei_%s )\n", c_name); + counter++; +} + +static void emit_encoding (FILE* out1, FILE* out2, const char* tag, const char* const* names, size_t n, const char* c_name) +{ + fprintf(out2," (int)(long)&((struct stringpool2_t *)0)->stringpool_%s_%u,\n",tag,counter); + for (; n > 0; names++, n--) + emit_alias(out1, tag, *names, c_name); +} + +int main (int argc, char* argv[]) +{ + const char * tag = (argc > 1 ? argv[1] : "xxx"); + FILE * stdout2 = fdopen(3, "w"); + if (stdout2 == NULL) + exit(1); +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + { \ + static const char* const names[] = BRACIFY xxx_names; \ + emit_encoding(stdout,stdout2,tag,names,sizeof(names)/sizeof(names[0]),#xxx); \ + } +#define BRACIFY(...) { __VA_ARGS__ } +#define DEFALIAS(xxx_alias,xxx) emit_alias(stdout,tag,xxx_alias,#xxx); +#ifdef USE_AIX +#include "encodings_aix.def" +#endif +#ifdef USE_OSF1 +#include "encodings_osf1.def" +#endif +#ifdef USE_DOS +#include "encodings_dos.def" +#endif +#ifdef USE_EXTRA +#include "encodings_extra.def" +#endif +#undef DEFALIAS +#undef BRACIFY +#undef DEFENCODING + if (ferror(stdout) || fclose(stdout) || ferror(stdout2) || fclose(stdout2)) + exit(1); + exit(0); +} diff --git a/Externals/libiconv-1.14/lib/genflags.c b/Externals/libiconv-1.14/lib/genflags.c new file mode 100644 index 0000000000..448f89288d --- /dev/null +++ b/Externals/libiconv-1.14/lib/genflags.c @@ -0,0 +1,114 @@ +/* Copyright (C) 2000-2002, 2005-2006, 2008-2009 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Creates the flags.h include file. */ + +#include +#include +#include + +/* Consider all encodings, including the system dependent ones. */ +#define USE_AIX +#define USE_OSF1 +#define USE_DOS +#define USE_EXTRA + +struct loop_funcs {}; +struct iconv_fallbacks {}; +struct iconv_hooks {}; +#include "converters.h" + +static void emit_encoding (struct wctomb_funcs * ofuncs, const char* c_name) +{ + /* Prepare a converter struct. */ + struct conv_struct conv; + memset(&conv,'\0',sizeof(conv)); + conv.ofuncs = *ofuncs; + + { + /* See whether the encoding can encode the accents and quotation marks. */ + ucs4_t probe[6] = { 0x0060, 0x00b4, 0x2018, 0x2019, 0x3131, 0x3163, }; + int res[6]; + int i; + for (i = 0; i < 6; i++) { + unsigned char buf[10]; + memset(&conv.ostate,'\0',sizeof(state_t)); + res[i] = (conv.ofuncs.xxx_wctomb(&conv,buf,probe[i],sizeof(buf)) != RET_ILUNI); + } + printf("#define ei_%s_oflags (",c_name); + { + int first = 1; + if (res[0] && res[1]) { + printf("HAVE_ACCENTS"); + first = 0; + } + if (res[2] && res[3]) { + if (!first) printf(" | "); + printf("HAVE_QUOTATION_MARKS"); + first = 0; + } + if (res[4] && res[5]) { + if (!first) printf(" | "); + printf("HAVE_HANGUL_JAMO"); + first = 0; + } + if (first) printf("0"); + } + printf(")\n"); + } +} + +int main () +{ + int bitmask = 1; + printf("/* Generated automatically by genflags. */\n"); + printf("\n"); + printf("/* Set if the encoding can encode\n"); + printf(" the acute and grave accents U+00B4 and U+0060. */\n"); + printf("#define HAVE_ACCENTS %d\n",bitmask); + printf("\n"); + bitmask = bitmask << 1; + printf("/* Set if the encoding can encode\n"); + printf(" the single quotation marks U+2018 and U+2019. */\n"); + printf("#define HAVE_QUOTATION_MARKS %d\n",bitmask); + printf("\n"); + bitmask = bitmask << 1; + printf("/* Set if the encoding can encode\n"); + printf(" the double-width Hangul letters (Jamo) U+3131 to U+3163. */\n"); + printf("#define HAVE_HANGUL_JAMO %d\n",bitmask); + printf("\n"); + +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + { \ + struct wctomb_funcs ofuncs = xxx_ofuncs1,xxx_ofuncs2; \ + emit_encoding(&ofuncs,#xxx); \ + } +#define DEFALIAS(xxx_alias,xxx) /* nothing */ +/* Consider all encodings, including the system dependent ones. */ +#include "encodings.def" +#include "encodings_aix.def" +#include "encodings_osf1.def" +#include "encodings_dos.def" +#include "encodings_extra.def" +#undef DEFALIAS +#undef DEFENCODING + + if (ferror(stdout) || fclose(stdout)) + exit(1); + exit(0); +} diff --git a/Externals/libiconv-1.14/lib/gentranslit.c b/Externals/libiconv-1.14/lib/gentranslit.c new file mode 100644 index 0000000000..0b2779c7ff --- /dev/null +++ b/Externals/libiconv-1.14/lib/gentranslit.c @@ -0,0 +1,258 @@ +/* Copyright (C) 1999-2003, 2005, 2011 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + The GNU LIBICONV Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + The GNU LIBICONV Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU LIBICONV Library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* + * Generates a table of small strings, used for transliteration, from a table + * containing lines of the form + * Unicode utf-8 replacement # comment + */ + +#include +#include +#include + +int main (int argc, char *argv[]) +{ + unsigned int data[0x100000]; + int uni2index[0x110000]; + int index; + + if (argc != 1) + exit(1); + + printf("/*\n"); + printf(" * Copyright (C) 1999-2003 Free Software Foundation, Inc.\n"); + printf(" * This file is part of the GNU LIBICONV Library.\n"); + printf(" *\n"); + printf(" * The GNU LIBICONV Library is free software; you can redistribute it\n"); + printf(" * and/or modify it under the terms of the GNU Library General Public\n"); + printf(" * License as published by the Free Software Foundation; either version 2\n"); + printf(" * of the License, or (at your option) any later version.\n"); + printf(" *\n"); + printf(" * The GNU LIBICONV Library is distributed in the hope that it will be\n"); + printf(" * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); + printf(" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"); + printf(" * Library General Public License for more details.\n"); + printf(" *\n"); + printf(" * You should have received a copy of the GNU Library General Public\n"); + printf(" * License along with the GNU LIBICONV Library; see the file COPYING.LIB.\n"); + printf(" * If not, write to the Free Software Foundation, Inc., 51 Franklin Street,\n"); + printf(" * Fifth Floor, Boston, MA 02110-1301, USA.\n"); + printf(" */\n"); + printf("\n"); + printf("/*\n"); + printf(" * Transliteration table\n"); + printf(" */\n"); + printf("\n"); + { + int c; + int j; + for (j = 0; j < 0x110000; j++) + uni2index[j] = -1; + index = 0; + for (;;) { + c = getc(stdin); + if (c == EOF) + break; + if (c == '#') { + do { c = getc(stdin); } while (!(c == EOF || c == '\n')); + continue; + } + ungetc(c,stdin); + if (scanf("%x",&j) != 1) + exit(1); + c = getc(stdin); + if (c != '\t') + exit(1); + for (;;) { + c = getc(stdin); + if (c == EOF || c == '\n') + exit(1); + if (c == '\t') + break; + if (uni2index[j] < 0) { + uni2index[j] = index; + data[index++] = 0; + } + if (c >= 0x80) { + /* Finish reading an UTF-8 character. */ + if (c < 0xc0) + exit(1); + else { + unsigned int i = (c < 0xe0 ? 2 : c < 0xf0 ? 3 : c < 0xf8 ? 4 : c < 0xfc ? 5 : 6); + c &= (1 << (8-i)) - 1; + while (--i > 0) { + int cc = getc(stdin); + if (!(cc >= 0x80 && cc < 0xc0)) + exit(1); + c <<= 6; c |= (cc & 0x3f); + } + } + } + data[index++] = (unsigned int) c; + } + if (uni2index[j] >= 0) + data[uni2index[j]] = index - uni2index[j] - 1; + do { c = getc(stdin); } while (!(c == EOF || c == '\n')); + } + } + printf("static const unsigned int translit_data[%d] = {",index); + { + int i; + for (i = 0; i < index; i++) { + if (data[i] < 32) + printf("\n %3d,",data[i]); + else if (data[i] == '\'') + printf("'\\'',"); + else if (data[i] == '\\') + printf("'\\\\',"); + else if (data[i] < 127) + printf(" '%c',",data[i]); + else if (data[i] < 256) + printf("0x%02X,",data[i]); + else + printf("0x%04X,",data[i]); + } + printf("\n};\n"); + } + printf("\n"); + { + bool pages[0x1100]; + int line[0x22000]; + int tableno; + struct { int minline; int maxline; int usecount; const char* suffix; } tables[0x2000]; + int i, j, p, j1, j2, t; + + for (p = 0; p < 0x1100; p++) + pages[p] = false; + for (j = 0; j < 0x110000; j++) + if (uni2index[j] >= 0) + pages[j>>8] = true; + for (j1 = 0; j1 < 0x22000; j1++) { + bool all_invalid = true; + for (j2 = 0; j2 < 8; j2++) { + j = 8*j1+j2; + if (uni2index[j] >= 0) + all_invalid = false; + } + if (all_invalid) + line[j1] = -1; + else + line[j1] = 0; + } + tableno = 0; + for (j1 = 0; j1 < 0x22000; j1++) { + if (line[j1] >= 0) { + if (tableno > 0 + && ((j1 > 0 && line[j1-1] == tableno-1) + || ((tables[tableno-1].maxline >> 5) == (j1 >> 5) + && j1 - tables[tableno-1].maxline <= 8))) { + line[j1] = tableno-1; + tables[tableno-1].maxline = j1; + } else { + tableno++; + line[j1] = tableno-1; + tables[tableno-1].minline = tables[tableno-1].maxline = j1; + } + } + } + for (t = 0; t < tableno; t++) { + tables[t].usecount = 0; + j1 = 8*tables[t].minline; + j2 = 8*(tables[t].maxline+1); + for (j = j1; j < j2; j++) + if (uni2index[j] >= 0) + tables[t].usecount++; + } + for (t = 0, p = -1, i = 0; t < tableno; t++) { + if (tables[t].usecount > 1) { + char* s; + if (p == tables[t].minline >> 5) { + s = (char*) malloc(4+1+2+1); + sprintf(s, "%02x_%d", p, ++i); + } else { + p = tables[t].minline >> 5; + s = (char*) malloc(4+1); + sprintf(s, "%02x", p); + } + tables[t].suffix = s; + } else + tables[t].suffix = NULL; + } + { + p = -1; + for (t = 0; t < tableno; t++) + if (tables[t].usecount > 1) { + p = 0; + printf("static const short translit_page%s[%d] = {\n", tables[t].suffix, 8*(tables[t].maxline-tables[t].minline+1)); + for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) { + if ((j1 % 0x20) == 0 && j1 > tables[t].minline) + printf(" /* 0x%04x */\n", 8*j1); + printf(" "); + for (j2 = 0; j2 < 8; j2++) { + j = 8*j1+j2; + printf(" %4d,", uni2index[j]); + } + printf(" /* 0x%02x-0x%02x */\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7); + } + printf("};\n"); + } + if (p >= 0) + printf("\n"); + } + printf("#define translit_index(wc) \\\n ("); + for (j1 = 0; j1 < 0x22000;) { + t = line[j1]; + for (j2 = j1; j2 < 0x22000 && line[j2] == t; j2++); + if (t >= 0) { + if (j1 != tables[t].minline) abort(); + if (j2 > tables[t].maxline+1) abort(); + j2 = tables[t].maxline+1; + } + if (t == -1) { + } else { + if (t >= 0 && tables[t].usecount == 0) abort(); + if (t >= 0 && tables[t].usecount == 1) { + if (j2 != j1+1) abort(); + for (j = 8*j1; j < 8*j2; j++) + if (uni2index[j] >= 0) { + printf("wc == 0x%04x ? %d", j, uni2index[j]); + break; + } + } else { + if (j1 == 0) { + printf("wc < 0x%04x", 8*j2); + } else { + printf("wc >= 0x%04x && wc < 0x%04x", 8*j1, 8*j2); + } + printf(" ? translit_page%s[wc", tables[t].suffix); + if (tables[t].minline > 0) + printf("-0x%04x", 8*j1); + printf("]"); + } + printf(" : \\\n "); + } + j1 = j2; + } + printf("-1)\n"); + } + + if (ferror(stdout) || fclose(stdout)) + exit(1); + exit(0); +} diff --git a/Externals/libiconv-1.14/lib/georgian_academy.h b/Externals/libiconv-1.14/lib/georgian_academy.h new file mode 100644 index 0000000000..ddbe57806d --- /dev/null +++ b/Externals/libiconv-1.14/lib/georgian_academy.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GEORGIAN-ACADEMY + */ + +static const unsigned short georgian_academy_2uni[32] = { + /* 0x80 */ + 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, + /* 0x90 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, +}; + +static int +georgian_academy_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0x80 && c < 0xa0) + *pwc = (ucs4_t) georgian_academy_2uni[c-0x80]; + else if (c >= 0xc0 && c < 0xe7) + *pwc = (ucs4_t) c + 0x1010; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char georgian_academy_page00[32] = { + 0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */ + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */ +}; +static const unsigned char georgian_academy_page01[72] = { + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char georgian_academy_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char georgian_academy_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +georgian_academy_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x0080 && wc < 0x00a0) + c = georgian_academy_page00[wc-0x0080]; + else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e7 && wc < 0x0100)) + c = wc; + else if (wc >= 0x0150 && wc < 0x0198) + c = georgian_academy_page01[wc-0x0150]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = georgian_academy_page02[wc-0x02c0]; + else if (wc >= 0x10d0 && wc < 0x10f7) + c = wc-0x1010; + else if (wc >= 0x2010 && wc < 0x2040) + c = georgian_academy_page20[wc-0x2010]; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/georgian_ps.h b/Externals/libiconv-1.14/lib/georgian_ps.h new file mode 100644 index 0000000000..e23dbae1cd --- /dev/null +++ b/Externals/libiconv-1.14/lib/georgian_ps.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * GEORGIAN-PS + */ + +static const unsigned short georgian_ps_2uni_1[32] = { + /* 0x80 */ + 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, + /* 0x90 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, +}; +static const unsigned short georgian_ps_2uni_2[39] = { + /* 0xc0 */ + 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10f1, + 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10f2, 0x10dd, + /* 0xd0 */ + 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10f3, 0x10e3, 0x10e4, + 0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, + /* 0xe0 */ + 0x10ed, 0x10ee, 0x10f4, 0x10ef, 0x10f0, 0x10f5, +}; + +static int +georgian_ps_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0x80 && c < 0xa0) + *pwc = (ucs4_t) georgian_ps_2uni_1[c-0x80]; + else if (c >= 0xc0 && c < 0xe6) + *pwc = (ucs4_t) georgian_ps_2uni_2[c-0xc0]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char georgian_ps_page00[32] = { + 0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */ + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */ +}; +static const unsigned char georgian_ps_page01[72] = { + 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char georgian_ps_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char georgian_ps_page10[40] = { + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, /* 0xd0-0xd7 */ + 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xcf, 0xd0, 0xd1, /* 0xd8-0xdf */ + 0xd2, 0xd3, 0xd4, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, /* 0xe0-0xe7 */ + 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe3, /* 0xe8-0xef */ + 0xe4, 0xc7, 0xce, 0xd5, 0xe2, 0xe5, 0x00, 0x00, /* 0xf0-0xf7 */ +}; +static const unsigned char georgian_ps_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; + +static int +georgian_ps_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x0080 && wc < 0x00a0) + c = georgian_ps_page00[wc-0x0080]; + else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e6 && wc < 0x0100)) + c = wc; + else if (wc >= 0x0150 && wc < 0x0198) + c = georgian_ps_page01[wc-0x0150]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = georgian_ps_page02[wc-0x02c0]; + else if (wc >= 0x10d0 && wc < 0x10f8) + c = georgian_ps_page10[wc-0x10d0]; + else if (wc >= 0x2010 && wc < 0x2040) + c = georgian_ps_page20[wc-0x2010]; + else if (wc == 0x2122) + c = 0x99; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/hkscs1999.h b/Externals/libiconv-1.14/lib/hkscs1999.h new file mode 100644 index 0000000000..3732763396 --- /dev/null +++ b/Externals/libiconv-1.14/lib/hkscs1999.h @@ -0,0 +1,3005 @@ +/* + * Copyright (C) 1999-2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HKSCS:1999 + */ + +static const unsigned short hkscs1999_2uni_page88[627] = { + /* 0x88 */ + 0x06c0, 0x06c1, 0x06c2, 0x06c3, 0x06c4, 0x720c, 0x06c5, 0x71d1, + 0x71cd, 0x06c6, 0x06c7, 0x71cb, 0x8c68, 0x06c8, 0x71ca, 0x06c9, + 0x06ca, 0x06cb, 0x06cc, 0x720e, 0x06cd, 0x06ce, 0x0080, 0x0041, + 0x010d, 0x0040, 0x0092, 0x0049, 0x009a, 0x0048, 0x00cc, 0x0053, + 0x0111, 0x0052, 0x70fd, 0x02be, 0x70fd, 0x02c0, 0x004a, 0x0081, + 0x0061, 0x010e, 0x0060, 0x0151, 0x0093, 0x0069, 0x009b, 0x0068, + 0x00ab, 0x006d, 0x0110, 0x006c, 0x00cd, 0x0073, 0x0112, 0x0072, + 0x00eb, 0x007a, 0x0114, 0x0079, 0x0116, 0x0118, 0x011a, 0x011c, + 0x007c, 0x70fd, 0x02bf, 0x70fd, 0x02c1, 0x006a, 0x0161, 0x041a, + 0x041b, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + /* 0x89 */ + 0xf029, 0x8005, 0x70fd, 0x374a, 0x70fd, 0x70fd, 0x207d, 0x40dd, + 0x6dce, 0x62df, 0x70fd, 0x70fd, 0xd275, 0x36d1, 0x215a, 0x2168, + 0x21e8, 0x2396, 0x23b4, 0x23dc, 0x2424, 0x24e1, 0x24e8, 0x257b, + 0x258e, 0x2611, 0x2618, 0x2922, 0x2b30, 0x2b44, 0x2b47, 0x2b72, + 0x2b74, 0x2da6, 0x2dde, 0x2ddf, 0x2eda, 0x30c6, 0x327b, 0x37c9, + 0x3a3e, 0x3a44, 0x3aa5, 0x3f8e, 0x42bc, 0x4735, 0x50a4, 0x50ac, + 0x50ba, 0x50c7, 0x50cf, 0x50df, 0x5106, 0x5137, 0x547a, 0x54cf, + 0x556f, 0x5b46, 0x5d3e, 0x5d62, 0x60a6, 0x60a7, 0x60ae, 0x4611, + 0x4efc, 0x4fcd, 0x3b86, 0x4cc9, 0x2467, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x628c, 0x4ab8, 0x625e, 0x52bc, 0x70fd, 0x5e4b, 0x52f6, + 0x78e7, 0x70fd, 0x70fd, 0x529f, 0x6f47, 0x1f8d, 0x6e49, 0x6e8c, + 0x1efe, 0xebb6, 0xcd4e, 0x6e8a, 0xee73, 0x0901, 0x70fd, 0x409a, + 0x543e, 0x4719, 0x70fd, 0x1c11, 0x6b6c, 0x6b8f, 0x7019, 0x4b87, + 0xdcac, 0x8a8a, 0x7650, 0x9526, 0x2064, 0x20c1, 0x20c0, 0x20c7, + 0x20ff, 0x212b, 0x2177, 0x078c, 0x21fd, 0x1148, 0x2243, 0x22c8, + 0x07bd, 0x07d3, 0x07e5, 0x23c6, 0x2b45, 0x241b, 0x243c, 0x2445, + 0x20c9, 0x24b9, 0x24d0, 0x2567, 0x0907, 0x25e9, 0x0891, 0x25f0, + 0x0893, 0x2602, 0x2663, 0x08ad, 0x08b2, 0x09c1, 0x26d3, 0x26e3, + 0x26f4, 0x26f9, 0x2710, 0x272f, 0x2758, 0x2763, 0x2768, 0x08d8, + 0x277f, 0x08e5, 0x08ff, 0x2817, 0x0905, + /* 0x8a */ + 0xd784, 0x2765, 0x70fd, 0x7b02, 0x7bd5, 0xb42b, 0x27d0, 0x96c6, + 0x0d2c, 0x7401, 0x5f86, 0xb138, 0xe665, 0x1353, 0xd97e, 0x497a, + 0x9638, 0x0d74, 0x1ad5, 0xda1d, 0xc7b2, 0xb16a, 0x371d, 0x7c3c, + 0x7e74, 0x7b95, 0x7fb4, 0x36cd, 0x5fbe, 0x7d56, 0x7acb, 0x7e24, + 0x96a9, 0xdad6, 0xaa13, 0x70fd, 0x7c06, 0xe9cd, 0xd9a9, 0x1af4, + 0xb227, 0x96c2, 0x6bb2, 0x0da7, 0xe6f4, 0x12ed, 0x0846, 0xb587, + 0xe754, 0xd3c8, 0x9744, 0x6dee, 0x6915, 0x70fd, 0x16d9, 0xbfe5, + 0x36f4, 0x2723, 0x974c, 0x95ca, 0x7f37, 0x0d3b, 0x7f2f, 0xc49a, + 0xc4d6, 0xd4a0, 0x372a, 0xb392, 0x7b03, 0x5fa8, 0x8de1, 0xe14c, + 0x7731, 0x70fd, 0x1b0b, 0x7269, 0x12fa, 0x2ab3, 0x978d, 0x70fd, + 0xaac8, 0x75bc, 0xbfd7, 0x7e0c, 0x7c56, 0x27b9, 0x13bb, 0x16ba, + 0x70fd, 0x1d74, 0x94e6, 0x7f5d, 0x53aa, 0x69f5, 0x7c5c, 0x35b9, + 0x0d3e, 0x9275, 0x5f00, 0x28e1, 0x36bc, 0x1143, 0x70fd, 0xf101, + 0x7cc9, 0x950f, 0x96c9, 0x70fd, 0x7f88, 0xa142, 0x0cd2, 0x0d46, + 0xdb1b, 0x08b8, 0xbdc9, 0x8d07, 0x2892, 0x7df1, 0x96b2, 0xe720, + 0x07fc, 0x3e7d, 0xb1bb, 0x70fd, 0x70fd, 0xd0f4, 0x988b, 0x8e48, + 0xf15b, 0xe24d, 0x7d3a, 0x7af4, 0xc5dc, 0x5193, 0x7f8f, 0x9303, + 0x9439, 0x093b, 0xb4a3, 0x7d4c, 0x7e4d, 0x7d6a, 0x1293, 0x7df0, + 0x7c07, 0x800f, 0x7d0c, 0x70fd, 0x7d6b, 0x7a69, 0x7c08, 0x7f80, + 0x7ffd, 0x12f9, 0x9196, 0x3672, 0x7e6d, + /* 0x8b */ + 0x9d34, 0xd1b9, 0x95ce, 0x7c3e, 0x7c3f, 0x9651, 0x9655, 0x0d58, + 0x7d58, 0x7f87, 0x7dee, 0xf132, 0xc890, 0xe252, 0xe2d9, 0xe24a, + 0x66aa, 0x270c, 0x54c4, 0x27f9, 0x70fd, 0xec83, 0x6d26, 0x6bb6, + 0xd29e, 0x97ee, 0x4340, 0x536d, 0x52ec, 0x2e5c, 0xc3b2, 0x5334, + 0x0ad7, 0x259f, 0xd97d, 0x62b6, 0x7dba, 0x7ccf, 0x7d37, 0x7dbb, + 0x091d, 0xb16b, 0x0949, 0x7b96, 0x28ef, 0x92b5, 0x7f89, 0x7cd0, + 0x7d38, 0x7f38, 0x8008, 0xda87, 0x8315, 0x7d39, 0xb1d0, 0x97a4, + 0x2c94, 0x7edd, 0x7ede, 0x7fb5, 0x7fb6, 0x29dc, 0x7cd1, 0xd214, + 0xdb4d, 0x7e75, 0x7d3b, 0xb47e, 0x0a43, 0x7e76, 0x8040, 0xb598, + 0xefbd, 0xae5a, 0x867a, 0xa6b7, 0xdafc, 0x2ad9, 0x24a8, 0x095a, + 0xb8bd, 0x4db2, 0x2da8, 0x1b00, 0x1dec, 0x6fa7, 0x1ce7, 0x6d1f, + 0x6c8d, 0xbb74, 0x9abd, 0x283b, 0x0932, 0x28c9, 0x2068, 0x2b42, + 0x8901, 0xf238, 0x6851, 0x7186, 0x209b, 0x20fb, 0x087e, 0x2e63, + 0x3191, 0x3204, 0x0c3a, 0x348c, 0x3775, 0x3dba, 0x3e75, 0x3e7a, + 0x426c, 0x442b, 0x206c, 0x44ad, 0xad69, 0x5152, 0x4b3b, 0x4ef9, + 0x5153, 0xc12a, 0x0801, 0x70fd, 0xc1cb, 0x5202, 0x5280, 0xc412, + 0xc711, 0x259d, 0x59e4, 0x5b41, 0xd3b2, 0x5d20, 0x5e5d, 0x6585, + 0x6678, 0x667f, 0x66e8, 0xe30f, 0x68e6, 0x6975, 0x69ce, 0x69de, + 0x6a63, 0xe790, 0x6d7c, 0x6e9f, 0x6f44, 0x3daf, 0x7047, 0x2077, + 0x7187, 0x671d, 0x3477, 0x65a2, +}; +static const unsigned short hkscs1999_2uni_page8d[3140] = { + /* 0x8d */ + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x2f7e, 0x2f88, 0x2f96, 0x10fc, 0x0b4f, 0x2fe4, 0x2ff9, 0x0b60, + 0x0b78, 0x3082, 0x30fd, 0x3165, 0x31c3, 0x0c48, 0x0c54, 0x0c7f, + 0x0c8d, 0x3317, 0x337d, 0x2f25, 0x0cc9, 0x33f7, 0x33f9, 0x340f, + 0x0cf8, 0x346c, 0x34d0, 0x3525, 0x3558, 0x0d38, 0x28f1, 0x0d43, + 0x3622, 0x363b, 0x3647, 0x369a, 0x0d8b, 0x3700, 0x2f55, 0x2861, + 0x701f, 0x0dd7, 0x37c6, 0x0dfd, 0x383f, 0x3893, 0x0e32, 0x38d2, + 0x0e62, 0x3956, 0x0e82, 0x39e4, 0x3a40, 0x0e98, 0x3a8a, 0x3ac4, + 0x0eb2, 0x0eb1, 0x0ebb, 0x3b49, 0x3b83, 0x445c, 0x3ba4, 0x3bdf, + 0x3bc5, 0x0efc, 0x3c16, 0x0f1d, 0x3ca5, 0x3cb4, 0x3cb1, 0x3cc2, + 0x0f2c, 0x3cd9, 0x0f32, 0x3ceb, 0x3cf5, 0x3d14, 0x3d36, 0x3dc1, + 0x3e01, 0x3e2a, 0x3eb5, 0x3eea, 0x0fcb, 0x3f42, 0x3f46, 0x3f66, + 0x3fc1, 0x0fef, 0x3fe4, 0x3ff1, 0x4015, 0x4018, 0x4029, 0x4086, + 0xdfc0, 0x40bb, 0x40e2, 0x40da, 0x6fff, 0x40e8, 0x40e9, 0x4124, + 0x4134, 0x1046, 0xa481, 0x4181, 0x41be, 0x106a, 0x1075, 0x43b7, + 0x2ed9, 0x108a, 0x422c, 0x1091, 0x4250, 0x4254, 0x426f, 0x427f, + 0x4289, 0x73e5, 0x16c1, 0x0931, 0x7d98, + /* 0x8e */ + 0xa417, 0x29fe, 0xcc13, 0x433e, 0xb920, 0x098e, 0x3be2, 0xe1e9, + 0x2db4, 0x4c49, 0xb9a1, 0xe659, 0x4c65, 0x4c7d, 0xba6c, 0x4cbb, + 0x4cb0, 0x4cc2, 0x4cc3, 0x43d1, 0xc30d, 0x14ca, 0x4cda, 0x4cdd, + 0x4cea, 0x14ef, 0x26f2, 0xbc01, 0x4d0b, 0x4d55, 0x4d29, 0xb5ce, + 0xbcfe, 0x4da2, 0x4d6f, 0x559c, 0xbbb4, 0xc9bf, 0x4dd0, 0x5621, + 0x4d92, 0x70fd, 0xbd20, 0x10ad, 0xbc65, 0x5692, 0x4dfa, 0x70fd, + 0x4e35, 0xbcc1, 0x4e44, 0x4e83, 0xad02, 0x4ea6, 0x38bd, 0xaab8, + 0x4ec9, 0x4ec7, 0x4ee6, 0x4e74, 0x4ef3, 0x4ef5, 0x70fd, 0x5067, + 0x181d, 0xcb84, 0x4f5d, 0xcc16, 0x468d, 0x4f89, 0x4fab, 0x4335, + 0x4fb3, 0x70fd, 0xa597, 0xbf69, 0x4fe4, 0x1013, 0x4ff5, 0x8639, + 0x4fe5, 0xdbed, 0x70fd, 0xc021, 0xc05a, 0x506e, 0x5092, 0x162b, + 0x656c, 0x5027, 0x5140, 0x5141, 0x5147, 0x4b36, 0xc150, 0x6ae1, + 0x5197, 0xc1d1, 0x51a3, 0x84a1, 0x7168, 0x185c, 0xa066, 0x1803, + 0xdbba, 0x51fa, 0xc309, 0x70fd, 0x5208, 0x521d, 0x70fd, 0x522f, + 0xedc7, 0xca03, 0x523b, 0x523c, 0x5261, 0x9214, 0x1c89, 0xc426, + 0xa363, 0xc4a8, 0x3965, 0x52a7, 0xe048, 0x5307, 0x531a, 0x2af0, + 0x91f6, 0x3ebf, 0xc318, 0xb2f8, 0x3727, 0x834a, 0x5418, 0x869e, + 0x3c93, 0xaee5, 0xaf15, 0x177a, 0x5429, 0x7a0d, 0xc812, 0xa2fe, + 0x2239, 0x83bd, 0x56e2, 0x5562, 0xc84a, 0xae27, 0x9e30, 0x85b3, + 0xa378, 0x54aa, 0x3b5b, 0xf2d4, 0x14db, + /* 0x8f */ + 0x574b, 0x54d0, 0x551a, 0x7cd6, 0x85f4, 0x0a01, 0x9afd, 0x9e5a, + 0x547b, 0x54e2, 0x5518, 0xa3cb, 0xcae3, 0xc845, 0xc8d7, 0x9ece, + 0x10bf, 0x551d, 0x282c, 0x5585, 0x180b, 0xcae5, 0x55ac, 0x70fd, + 0x55d3, 0x07be, 0xcc14, 0x3c97, 0x575a, 0x07d6, 0xcb82, 0x98ef, + 0x5658, 0xbbe4, 0x5671, 0x10d3, 0x17e4, 0x3ce7, 0x564a, 0xa275, + 0x4b58, 0x70fd, 0xc8d6, 0xcbb7, 0xcb83, 0x56de, 0x70fd, 0x5591, + 0x17a0, 0x5693, 0x56e4, 0xbc91, 0x1540, 0xbcc0, 0x1843, 0x5734, + 0x2d32, 0xcbd9, 0x1827, 0x5773, 0x1816, 0x39ff, 0x57d6, 0xdde5, + 0xddfb, 0x5781, 0xcdc8, 0x57c2, 0x8402, 0xce0d, 0xf2f2, 0x186a, + 0x57e8, 0x0988, 0x86e2, 0x2637, 0xcfda, 0x583e, 0x58f1, 0xee38, + 0x596e, 0x9627, 0x5931, 0x595a, 0x598f, 0x28a1, 0x582c, 0x3a96, + 0x190f, 0x59c5, 0x59c6, 0xd160, 0xa339, 0xd164, 0x59de, 0x5a1c, + 0x195b, 0x5a34, 0x5a35, 0x3601, 0x5a45, 0x4977, 0xd24f, 0x5b07, + 0x5b0a, 0x70fd, 0x70fd, 0x5b27, 0x5b3c, 0xe025, 0x5b67, 0xd424, + 0xd5bd, 0x5c1c, 0x4993, 0x62fe, 0x5c10, 0xd559, 0x4ce9, 0xd63a, + 0xa4cf, 0x1a13, 0xd638, 0x437c, 0x5c8c, 0x5c9f, 0xb630, 0xb6e5, + 0x5cbf, 0x5ccc, 0x5ccd, 0x5c29, 0xaefa, 0x5d10, 0x5d1b, 0x5c2f, + 0x851f, 0x1915, 0x59cf, 0x5ddb, 0xd754, 0xd78f, 0xf314, 0x0a65, + 0xd753, 0x5e16, 0xd798, 0xd7bd, 0x5e52, 0x5e43, 0x8750, 0x5e1b, + 0x425c, 0x5e51, 0xb089, 0x11d0, 0x70fd, + /* 0x90 */ + 0x5ee9, 0xd8c2, 0x7ed4, 0xae0a, 0x0ebc, 0xda7c, 0xce4c, 0x4ce7, + 0x5fed, 0x5ff6, 0x6003, 0x63d4, 0x6059, 0x606d, 0xdbe5, 0xdc52, + 0x60e5, 0x6403, 0xef9f, 0x7950, 0x60f3, 0x1c2a, 0xdfde, 0xdd3d, + 0xa33b, 0x3138, 0x9be2, 0x6139, 0xed94, 0xde3c, 0xdd01, 0x8ee5, + 0x0cc0, 0xcc17, 0x6177, 0xdd3c, 0xd5be, 0x61a1, 0xdd6c, 0xddcb, + 0x61e8, 0xde93, 0x6204, 0xde66, 0x61ee, 0x70fd, 0x6267, 0x0e30, + 0x62a9, 0x62c4, 0x4eac, 0xdf33, 0x8b09, 0x630e, 0x3edf, 0x6341, + 0x6362, 0xb739, 0x70fd, 0xe0c6, 0xa25b, 0xe10c, 0xb75b, 0x7bf1, + 0x642c, 0x646b, 0xe0e1, 0xe1eb, 0x428f, 0x2d03, 0xe0e2, 0xe0e5, + 0x1c65, 0x6344, 0xe1ec, 0xe239, 0xe1ff, 0x6473, 0x655b, 0x5ffc, + 0x6685, 0x66a6, 0x6526, 0x66a0, 0x41f6, 0x15b9, 0x917a, 0xde58, + 0x813c, 0xa3ae, 0x1cdf, 0x3e5c, 0x677b, 0x6796, 0x146c, 0x67a3, + 0xcc15, 0x341a, 0x67b6, 0x4af5, 0xe0e0, 0x67bd, 0x260c, 0x1ca1, + 0xc9f8, 0x7334, 0xc290, 0xe46f, 0xe4a5, 0xaf51, 0x8755, 0x9c8a, + 0x6831, 0x5802, 0x6836, 0x1d0f, 0x183d, 0x1885, 0xaf69, 0x4275, + 0x2d81, 0x681b, 0x70fd, 0xe595, 0x6857, 0x2d8a, 0xe5ab, 0x685f, + 0x6525, 0x2310, 0x9a37, 0x9a3c, 0x6889, 0x689f, 0x68b1, 0x68be, + 0x68c0, 0x68d2, 0x68e0, 0xb66c, 0x68ee, 0x461c, 0xe5f3, 0x70fd, + 0x68f5, 0xe5dd, 0xd47a, 0x1d91, 0x6934, 0x6933, 0x694b, 0x6966, + 0x0e4e, 0xceb5, 0x1051, 0x76b0, 0xa69c, + /* 0x91 */ + 0xb886, 0x69ca, 0x69b7, 0x69c8, 0x69c7, 0x1dbf, 0xca67, 0x8513, + 0x27f0, 0x69e1, 0x69e6, 0x69ec, 0x6478, 0x6a39, 0xaea9, 0x1e32, + 0xe7d7, 0xe885, 0x6af5, 0x6b0c, 0x6b3b, 0x6b10, 0x6b58, 0xb8a5, + 0x0a04, 0xe471, 0xea55, 0x6be0, 0x6be2, 0xea05, 0x6bf4, 0x1ece, + 0x6c14, 0x6c2d, 0xddc0, 0x2274, 0x6c34, 0xc768, 0x0c03, 0x99fd, + 0x6c50, 0x6c40, 0xeafe, 0x2c85, 0x86a3, 0x6c8e, 0xa78b, 0x6d02, + 0x6cff, 0x6d0c, 0xec28, 0x6e54, 0xed37, 0xeed2, 0xeeeb, 0xee21, + 0xee63, 0xef1f, 0x6dfe, 0x6e03, 0xee74, 0x6e8e, 0x3ac8, 0x6e44, + 0x8d9b, 0xeed3, 0xef60, 0x877b, 0xef73, 0x6db9, 0xedf9, 0xefb4, + 0x6f10, 0x6f15, 0x6f1e, 0x6f22, 0x1ff4, 0x6f2a, 0x6f2f, 0xa8a4, + 0x6f41, 0x0ea0, 0x0d25, 0x101d, 0x2172, 0x0afe, 0xe22b, 0x6f82, + 0x6f88, 0x1e56, 0x6524, 0xcae2, 0x6f97, 0x70fd, 0x6fb9, 0x28df, + 0x28ca, 0x6fc5, 0x6ab8, 0xe44b, 0x68f2, 0x567f, 0x6fe2, 0x6fe9, + 0x4cdc, 0x700e, 0x4416, 0x1e7e, 0xadf5, 0xae3b, 0x4377, 0xae78, + 0xa888, 0xaed1, 0x459e, 0xe1da, 0x873a, 0x4b9f, 0xdf7e, 0xe336, + 0x6469, 0x64f3, 0xe044, 0x63ec, 0x6481, 0x64cb, 0xdf6c, 0xa9f9, + 0x4417, 0x11eb, 0x4972, 0x4c43, 0x42d0, 0xa9b3, 0xa938, 0x437e, + 0x862f, 0x42a3, 0x86fe, 0x9e99, 0x11c7, 0x86c5, 0xb62f, 0x8638, + 0x0a62, 0x853b, 0x8679, 0x0a21, 0x85b4, 0x8711, 0xbecb, 0x0a63, + 0x8500, 0x299b, 0xaea5, 0x82be, 0x8168, + /* 0x92 */ + 0x8286, 0x8376, 0x5703, 0x9fa6, 0x70fd, 0x5655, 0xae14, 0xcea5, + 0xa3b1, 0xb6dc, 0xa43b, 0xcd92, 0x17f4, 0x9fee, 0xe91d, 0xcc66, + 0x3a39, 0x0a73, 0x0f55, 0x10e7, 0x2aac, 0x8762, 0x3a50, 0x1357, + 0xa03f, 0xa621, 0xa5cb, 0xa64f, 0xc961, 0x270b, 0x28de, 0xc471, + 0x28d2, 0x7e9f, 0x7a68, 0x7ccd, 0x64c6, 0xe113, 0x649c, 0x2138, + 0x236b, 0x0b59, 0xa976, 0x20fc, 0x7525, 0x743f, 0x218b, 0x21ca, + 0xb7d1, 0x2ca8, 0x726b, 0x748b, 0x0cd9, 0x73ca, 0x74d4, 0x0775, + 0x2169, 0x7380, 0xe3b3, 0x7335, 0x5c5a, 0x72cc, 0x20d8, 0x230d, + 0x234d, 0x21e2, 0x2143, 0xae8e, 0xa3ca, 0x2182, 0x226e, 0x22ac, + 0x22c1, 0x220c, 0x2225, 0x2298, 0x233c, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x4076, 0x9e95, 0xa3b9, 0xa3ff, 0x3fb2, 0x86c4, 0xa3c9, + 0x23e8, 0x2403, 0x7660, 0x17dd, 0x7563, 0x7552, 0x7551, 0x5eba, + 0xe09c, 0x770e, 0x2499, 0x24e4, 0x77f3, 0x2521, 0x70fd, 0x197a, + 0x438c, 0xa8cc, 0x7ae0, 0xae2c, 0x7fa4, 0x3c11, 0x7cdd, 0x70fd, + 0x11de, 0x4699, 0x4614, 0x4656, 0x4598, 0x1e4e, 0xaf3c, 0xa5cd, + 0x2610, 0x08c4, 0x440f, 0xa609, 0x27f4, 0x7405, 0x270d, 0x7a86, + 0x295d, 0x635d, 0x67f4, 0x6466, 0x2a1d, 0x29cd, 0x29bf, 0x097e, + 0x2b0b, 0x2cd9, 0xe046, 0x853a, 0x85af, 0x8550, 0x2c6c, 0x2bf8, + 0x638f, 0x2cbe, 0x2d0f, 0x2c52, 0xba06, 0x8833, 0x86a1, 0xa7d5, + 0x0a35, 0x3f45, 0x4643, 0x2c61, 0xbe03, + /* 0x93 */ + 0x2cc1, 0xe1d7, 0x74d3, 0x64e0, 0x468c, 0x81c3, 0x4305, 0x1c72, + 0x6508, 0xdffb, 0x64bd, 0x0ae0, 0x2e5e, 0x2ede, 0x309e, 0x3088, + 0x87d6, 0x87bc, 0xa1ee, 0x310d, 0x2d8f, 0x8743, 0x8744, 0x0a41, + 0x86e0, 0x0a1d, 0x853e, 0x0a13, 0x532a, 0xe047, 0x8a7a, 0x9db2, + 0xdfa8, 0x314c, 0x314e, 0x8767, 0x85eb, 0x2cab, 0x857b, 0x2d84, + 0x57d4, 0xd17d, 0x59e0, 0x32be, 0x9360, 0x912b, 0x321b, 0x11b8, + 0x90ef, 0x90fe, 0xe448, 0xccb3, 0x3400, 0x713e, 0x7146, 0x911b, + 0x33d9, 0x33d8, 0x32b5, 0x969b, 0x9707, 0xabd4, 0xe50d, 0x36b1, + 0xab65, 0x95aa, 0x0d69, 0x9562, 0x9d90, 0xe86a, 0x9878, 0x3577, + 0xf09b, 0x36f6, 0x3571, 0x3611, 0xae63, 0x9767, 0x34e4, 0x96a1, + 0x367b, 0x37ab, 0x3bb2, 0x0f34, 0x9a0e, 0x9c2d, 0xae09, 0x9c2b, + 0x274d, 0x9c60, 0x8719, 0xe5ff, 0x390e, 0x9c09, 0x9b33, 0x0e20, + 0x1490, 0xb704, 0xe122, 0xb70f, 0x853c, 0xb6db, 0xb625, 0x4aee, + 0x9a83, 0x866a, 0x9bb4, 0x07a4, 0x9b8f, 0x9b02, 0xa809, 0x38ce, + 0xca64, 0x38ab, 0x1e53, 0x3870, 0xd370, 0x8aab, 0x38a3, 0x9c52, + 0x9c61, 0x385e, 0xb972, 0x0c11, 0xa13a, 0xa0bc, 0x0ed9, 0xa0a2, + 0x9d3e, 0x46d0, 0x0ed6, 0x39cf, 0xab2a, 0x3af6, 0x3a5e, 0x0f04, + 0x3cfe, 0x0ba3, 0xa0d5, 0xa9c7, 0x3c73, 0x3c92, 0x3d09, 0x3d45, + 0x8752, 0x3751, 0x3ad8, 0x3c8c, 0x0f17, 0x3cba, 0x3d97, 0xa500, + 0xa25a, 0x64a0, 0x63f2, 0xe1ea, 0xe0cb, + /* 0x94 */ + 0x6389, 0xd8de, 0xdfdc, 0x6567, 0x3fe5, 0x410b, 0xae6c, 0x70fd, + 0xa4bf, 0x108f, 0x4004, 0xa57c, 0x2c7d, 0x400a, 0x2a87, 0x3f64, + 0x4a42, 0x433b, 0xa85a, 0xa7b6, 0x42f1, 0x4450, 0x4487, 0x4494, + 0xac4f, 0xac25, 0x23b9, 0xaf24, 0x766b, 0x467a, 0xa438, 0x9f5f, + 0xaeca, 0xad97, 0xbf21, 0x1206, 0x11b1, 0xaf5f, 0xe223, 0xa475, + 0x32e7, 0x11f3, 0x46cc, 0x463c, 0x6487, 0x4637, 0x179f, 0xcb2a, + 0x1851, 0x4783, 0x1263, 0xb099, 0xb0c6, 0x1258, 0x4755, 0x4873, + 0xf0c6, 0x0e59, 0x4668, 0xe0cc, 0xae2b, 0xae0e, 0x0e3b, 0x10cd, + 0xaece, 0x11ff, 0xae45, 0xad73, 0x62fa, 0x2972, 0x6442, 0xe0e3, + 0x86a4, 0x231f, 0xb4e1, 0xb4a7, 0x4978, 0x9bb2, 0x490e, 0x490f, + 0x497b, 0xab97, 0xa081, 0x0d9e, 0xad70, 0x4638, 0x469b, 0x11bf, + 0xaf3a, 0xaf47, 0x13c8, 0xaf16, 0xc0ae, 0x6407, 0xb701, 0x4a1e, + 0x4a8d, 0x4a88, 0x4ad2, 0x45d0, 0x4b59, 0xd281, 0xb863, 0x140e, + 0x70fd, 0x5696, 0x4ba5, 0x3c6d, 0xa43a, 0x4c3a, 0x4bf4, 0x146e, + 0x8526, 0x1432, 0x6335, 0x4bf1, 0x7c0c, 0xae0c, 0x7359, 0xa33a, + 0x85ae, 0x08d7, 0x27ab, 0x08b0, 0x09ea, 0x7294, 0x7acd, 0x4ce2, + 0x2c99, 0x91f5, 0xbaef, 0xbadc, 0x2c4d, 0x731b, 0x4af0, 0x2c6a, + 0xbbc6, 0x4cfe, 0x14f9, 0x4e5d, 0x4e6d, 0x1511, 0xbbb3, 0xbe3c, + 0xbe26, 0x4ecd, 0xae79, 0x85f0, 0x4e8e, 0x4e7c, 0x4eae, 0x3cf2, + 0x4fdc, 0x5007, 0x4fd3, 0x514e, 0xc121, + /* 0x95 */ + 0xc05c, 0xd648, 0x4f97, 0xbe02, 0x156a, 0xc8b5, 0x7856, 0x3a16, + 0x714e, 0x9ecf, 0x2a04, 0xc292, 0xc278, 0xade2, 0x51dd, 0x4d27, + 0x77ac, 0xbb29, 0xbd43, 0x4d0c, 0xbd8e, 0x6ae6, 0x5805, 0x6b63, + 0x3c5c, 0x9d7f, 0x0d22, 0xae77, 0xc3ed, 0x6b1f, 0xc3e0, 0x5680, + 0xce67, 0xca11, 0x17ea, 0x5337, 0x1702, 0x52c6, 0x5309, 0x5342, + 0xc574, 0x69c3, 0xc802, 0x5462, 0x5465, 0xc811, 0x5653, 0xcae7, + 0x57d0, 0xcf1b, 0x2cc6, 0x147f, 0x8680, 0x2d6b, 0x86e1, 0x2d24, + 0x8718, 0x5860, 0xf2fc, 0xa30f, 0x59ad, 0xd022, 0x2c42, 0x59ee, + 0x2185, 0x5a07, 0x5a3f, 0x5a66, 0x5ae5, 0x5acd, 0xb803, 0x5ad4, + 0xd2c5, 0xd2c4, 0xe1f5, 0xe1d9, 0xe19c, 0xdff9, 0x11ad, 0x56a3, + 0x19f5, 0x19cf, 0x0b32, 0x5bbd, 0x5b9c, 0xe608, 0x318d, 0x632b, + 0xa7c4, 0x3814, 0x4329, 0x42c4, 0x8685, 0x6ded, 0x5ddf, 0x5e29, + 0xd7dc, 0x2bda, 0x49c3, 0x2c30, 0x166e, 0x0a14, 0x5f6a, 0x5fe7, + 0xb009, 0x6070, 0x608a, 0x15f4, 0x3e98, 0x41bb, 0x8ee1, 0x1b9b, + 0x4179, 0x408b, 0x861a, 0x6ce9, 0x09f5, 0xadaf, 0x61fb, 0x70fd, + 0x27b1, 0x1c06, 0x62bb, 0x6504, 0xe04b, 0x1362, 0xe0fc, 0x6527, + 0xe21d, 0xe23b, 0x56e5, 0x5bab, 0x6699, 0x66a7, 0x6697, 0x6696, + 0xe2b4, 0x4645, 0x11c2, 0xad7f, 0xaec2, 0xa92a, 0x11e7, 0x9ba5, + 0x678f, 0xe3e7, 0xe366, 0xe365, 0x11cc, 0xae6d, 0xaef8, 0xa52e, + 0x4612, 0x466b, 0x11fc, 0x6841, 0xe470, + /* 0x96 */ + 0x3a87, 0x1d1d, 0xe453, 0xb91f, 0x70fd, 0x6468, 0xdf89, 0xe226, + 0xe12f, 0xc23e, 0x63ba, 0x2d51, 0x5ce9, 0x1c3c, 0x45f9, 0xa75b, + 0x689b, 0x6871, 0x6a38, 0x7de6, 0x3001, 0xe1c5, 0xaf32, 0x691f, + 0xe65a, 0x63f6, 0xe6d7, 0x62e5, 0x17c0, 0xe150, 0xaee7, 0xe164, + 0x69dc, 0xe045, 0x1200, 0x632a, 0x1c25, 0x5614, 0x6a3b, 0x6a4d, + 0xd606, 0x10fd, 0x6a9b, 0x1e2f, 0x6aaa, 0x6b5c, 0xe165, 0xb988, + 0x3ccf, 0x6b21, 0x2d3e, 0x6b2f, 0xe871, 0x1e50, 0xe8c8, 0x6abc, + 0x1e7d, 0x1e57, 0x647d, 0x2ab2, 0x81c2, 0x2a62, 0xae38, 0x83a8, + 0x4a44, 0x921f, 0xa338, 0x3b05, 0x107d, 0x6558, 0x0c67, 0x3390, + 0x9281, 0x946b, 0x3347, 0x6d4f, 0x6d53, 0x6d7b, 0x6d35, 0x6d10, + 0x6c7f, 0x6ccf, 0xebed, 0x6c9f, 0xef35, 0xee3e, 0x6da1, 0x1f6e, + 0xa644, 0x6e98, 0x1f70, 0x6d8c, 0xeef4, 0xee2d, 0xee33, 0xe8af, + 0x6e25, 0x56bd, 0xcb52, 0xcd1f, 0xc8c2, 0x57bc, 0x1833, 0xcae4, + 0xcbc4, 0xcb30, 0x5620, 0x57ae, 0xcb40, 0xa0d7, 0xbfa4, 0x4be2, + 0x9e9c, 0x9f40, 0x1c2d, 0xae5e, 0x1062, 0x64db, 0x63be, 0x6448, + 0x737f, 0x4ab9, 0x6377, 0x654d, 0x2224, 0x0780, 0x61a4, 0xb6dd, + 0x4a3d, 0x4a54, 0x4ab6, 0x4a4b, 0x8597, 0x9b49, 0xadc1, 0x09da, + 0x21b2, 0x41da, 0x41d9, 0x70fd, 0x421e, 0x2654, 0xa6f5, 0x29fb, + 0x2b33, 0x29ca, 0x6d96, 0x2a17, 0x4334, 0x07ef, 0xa6ec, 0x43eb, + 0xc980, 0xb2d7, 0x70fd, 0x85f5, 0xe049, + /* 0x97 */ + 0x334c, 0x2d0e, 0x2c4b, 0x15bc, 0xa9c8, 0x0a6c, 0x1e3b, 0xdffc, + 0x64bb, 0x64b8, 0x8716, 0x7ddd, 0x5672, 0xca00, 0x82d3, 0xa83a, + 0x9626, 0xa901, 0x2bd4, 0xa337, 0xc501, 0x4fa8, 0xc05b, 0xbfe4, + 0xae39, 0xae0b, 0xdffa, 0x63e5, 0x45e2, 0x11e9, 0x46b4, 0xe163, + 0x86df, 0x11e1, 0xaf33, 0x3d18, 0x45f3, 0x45fb, 0x11d6, 0xaebe, + 0xaf14, 0x8619, 0xaee6, 0x7467, 0x82e4, 0xae65, 0x4648, 0xad96, + 0x42a5, 0xadf6, 0x6384, 0x45e6, 0x645f, 0x75be, 0x6431, 0xe0ce, + 0xe016, 0x6486, 0xe1e7, 0xb755, 0x1c35, 0xe082, 0x436b, 0xadc3, + 0x7bbf, 0x28e4, 0x769a, 0x7aab, 0x7b78, 0x2742, 0x4bc4, 0x863a, + 0x4ffe, 0x8502, 0xaed0, 0x8692, 0x182e, 0x6501, 0x0a4a, 0xe0c0, + 0xae2d, 0x2bf0, 0x86ff, 0x86c3, 0xd084, 0x2ce1, 0x0a22, 0xa2db, + 0x09f0, 0x635f, 0x2cb9, 0xe081, 0x86a2, 0x6474, 0x0fcd, 0x79b4, + 0x1d56, 0x0cca, 0x2334, 0x1069, 0x104c, 0x825c, 0x4375, 0x15fb, + 0xda98, 0x400f, 0xe4a4, 0x17eb, 0x3f97, 0xd80f, 0x4267, 0x3eef, + 0x0fd6, 0xa52d, 0xa3ad, 0x4002, 0x410c, 0x106f, 0x74b5, 0x4751, + 0x09fc, 0x0808, 0x1980, 0x11da, 0x1b71, 0x2c04, 0x636e, 0x1c3e, + 0x6081, 0xe21c, 0xc900, 0x2a52, 0x2a08, 0x0a16, 0x8312, 0x42fe, + 0xa8a2, 0xaef1, 0x9963, 0x8170, 0x8f3d, 0x3af9, 0x3ba7, 0x8258, + 0x9de5, 0xd6b4, 0x9fdf, 0xe083, 0xa0d6, 0x9d3a, 0xb05f, 0x3c5a, + 0x9fad, 0xc9f7, 0x563e, 0x17df, 0x17ce, + /* 0x98 */ + 0xca66, 0xca91, 0xc9c2, 0xcd1e, 0x4117, 0xce49, 0x553d, 0x857a, + 0x55ed, 0xc9c0, 0xcd93, 0x861b, 0x2bc9, 0x2cc2, 0x85f3, 0x2ca1, + 0x2cb1, 0x8745, 0xa73c, 0x0a6d, 0x2c2f, 0x857c, 0x0a07, 0x438e, + 0x6490, 0x38da, 0xa7e5, 0x2cae, 0x2c6b, 0xa7d3, 0x3c6b, 0xa439, + 0xd276, 0xa99b, 0xa80a, 0x431d, 0xa799, 0xdfe1, 0x21f0, 0xca68, + 0x2f02, 0xaa0e, 0xd80d, 0xa8fd, 0x3c4c, 0xa796, 0x81c4, 0x42a6, + 0x4333, 0xa929, 0x10a5, 0x3f1f, 0xf1e5, 0xaecf, 0x5065, 0x2c2b, + 0x2f6f, 0x10f3, 0x319c, 0xaedd, 0x861f, 0x4fa4, 0x5626, 0x26c5, + 0xa1fa, 0x9c80, 0x72d4, 0x29be, 0x7815, 0x7699, 0x12e5, 0x8c1e, + 0xefb6, 0x4203, 0xe51b, 0x2fb0, 0x458f, 0x4ed3, 0xe059, 0xe5e0, + 0x2208, 0x51e7, 0x44cd, 0x4510, 0xd5f4, 0x4538, 0x4539, 0xb876, + 0x4541, 0x4548, 0x11a9, 0xd618, 0x61ac, 0x43f5, 0xad72, 0x45e1, + 0x53f6, 0x11ca, 0x490c, 0x11d1, 0x3ee2, 0x293d, 0x4619, 0x461e, + 0x461f, 0x11e2, 0x11f0, 0x11f4, 0x11fa, 0x46d3, 0x120e, 0x1253, + 0x4742, 0x476d, 0x4772, 0x478d, 0x127c, 0x47c8, 0x47dc, 0x12c0, + 0x484d, 0x12d7, 0x4874, 0x12dc, 0x487a, 0xb29c, 0x4388, 0x2863, + 0x5b00, 0x2aa9, 0x131d, 0x4943, 0x1339, 0x39a1, 0x1345, 0x091b, + 0x4998, 0x136a, 0x136f, 0x2e9e, 0x49be, 0x49cb, 0x2b32, 0x4a18, + 0x42b9, 0x4a1c, 0x13a8, 0x4a39, 0x4a47, 0x4a51, 0x4a66, 0x5648, + 0xb6b5, 0x4b33, 0x3a43, 0x4b32, 0x1403, + /* 0x99 */ + 0x1409, 0x4b91, 0x4b99, 0x60fb, 0x4c06, 0x60fc, 0x1467, 0x4c91, + 0x14b2, 0x4cbc, 0x5479, 0x14c4, 0x4ccf, 0x4cdb, 0x14cf, 0x2061, + 0x4d62, 0x4d6c, 0x4d7b, 0x4e12, 0x4e1b, 0x1560, 0x157a, 0x4e7b, + 0x4e9c, 0x158c, 0x4eb8, 0x1594, 0x4eed, 0x60d3, 0x42c0, 0x7b8f, + 0x4fcf, 0x4fd4, 0x4fd0, 0x4ffd, 0x51ae, 0x51b4, 0x449f, 0x1697, + 0x5220, 0x5225, 0x4d39, 0x522e, 0x5231, 0x5254, 0x10cc, 0x29f4, + 0x42a0, 0x52b7, 0x52e9, 0x16ed, 0x530c, 0x452a, 0x530e, 0x5312, + 0x4760, 0x5314, 0x1701, 0x0e79, 0x5356, 0x5359, 0x535a, 0x1713, + 0x2a7a, 0x537c, 0x5384, 0x1725, 0x5393, 0x172d, 0x53a5, 0x2a2f, + 0x53c1, 0x53e4, 0x5454, 0x178f, 0x54a6, 0x5476, 0x54ca, 0x54d8, + 0x54ff, 0x17b0, 0x5557, 0x6769, 0x3bca, 0x5605, 0x42f5, 0x5664, + 0x3323, 0x5688, 0x1804, 0x56be, 0x56e1, 0x56f8, 0x5710, 0x5738, + 0x5752, 0x183b, 0x576f, 0x5770, 0x57a0, 0x1877, 0x5832, 0x5852, + 0x5872, 0x58af, 0x6745, 0x590b, 0x1906, 0x1917, 0x5a2e, 0x5a7f, + 0x5aa4, 0x5ac7, 0x5b11, 0xd467, 0x5ba9, 0x5bb8, 0x5c14, 0x5c34, + 0x5d91, 0x5e14, 0x5e32, 0x5e5c, 0x1a98, 0x2a9f, 0x5f03, 0x1aed, + 0x212e, 0x5f7a, 0x2818, 0x2994, 0x5fb1, 0x2835, 0x5ff0, 0x1b37, + 0x600e, 0x6022, 0x6024, 0x602d, 0x6032, 0x60f7, 0x6101, 0x610a, + 0x610c, 0x6173, 0x6ac4, 0x1bad, 0x69e0, 0x6313, 0x1c1e, 0x6328, + 0x6358, 0x636b, 0x63b1, 0x63ae, 0x63bf, + /* 0x9a */ + 0x63e3, 0x63eb, 0x63f3, 0x63f4, 0x63fd, 0x6443, 0x6484, 0x64ad, + 0x1c45, 0x1c51, 0x6f3f, 0x6517, 0x2541, 0x651d, 0x652d, 0x653e, + 0x1c6a, 0x6554, 0x6579, 0x662d, 0x66a2, 0x1ca7, 0x66f4, 0x6733, + 0x1ce5, 0x39e0, 0x1d24, 0x6840, 0x1d35, 0x68b2, 0x68c2, 0x2894, + 0x1da4, 0x3328, 0x69b9, 0x1dd9, 0x69f1, 0x2a84, 0x6a0e, 0x6a19, + 0x23f4, 0x6a1c, 0x6a37, 0x6a42, 0x6a5d, 0x6a62, 0x1e30, 0x6ac5, + 0x1e5d, 0x6b3c, 0x6c0f, 0x4c83, 0x6c69, 0x6c81, 0x6cdd, 0x6cf1, + 0x6cf4, 0x1f2d, 0x6d20, 0x0aaf, 0x8902, 0x6dc9, 0x6d3a, 0x6f7e, + 0x2890, 0x6e13, 0x6e3d, 0x6e40, 0x6e7c, 0x65f6, 0x60f6, 0x6efb, + 0x6f2c, 0x6f31, 0x6f3d, 0x6f46, 0x65dc, 0x6f62, 0x6f71, 0x6f78, + 0x4cc8, 0x6fc4, 0x7194, 0x7377, 0x7460, 0x3b5a, 0x65c3, 0x2bec, + 0x7597, 0x2a80, 0x65c1, 0x0af9, 0x7655, 0x7695, 0x76f6, 0x84fa, + 0x2997, 0x4373, 0x79c2, 0x79cd, 0x7a7f, 0x26aa, 0xf1fb, 0x7a8b, + 0x26de, 0x7abb, 0x7afb, 0x7b13, 0x7b25, 0x7b3c, 0x3327, 0x7b4d, + 0x28ba, 0x7b75, 0x7b9d, 0x7bad, 0x7c2f, 0x7c72, 0x7c88, 0x3b95, + 0x6d2f, 0x5925, 0x7cc4, 0x7cce, 0x7d97, 0x7e50, 0x7ded, 0x7d33, + 0x2e60, 0x7e7c, 0x304b, 0x7f1c, 0x7f0f, 0x7f36, 0x395e, 0x7f3b, + 0x7f48, 0x7f56, 0x0987, 0x7f7f, 0x7f93, 0x7fef, 0x7ffb, 0x25a4, + 0x56ad, 0x81a3, 0x8235, 0x81f6, 0x5d01, 0x83f7, 0x8459, 0x8603, + 0x8607, 0x20b8, 0x42bb, 0x866d, 0x87aa, + /* 0x9b */ + 0x886d, 0x8885, 0x896a, 0x89b0, 0x89ec, 0x8b48, 0x3503, 0x8b55, + 0x8b95, 0x4398, 0x3a95, 0x8c85, 0x3c29, 0x0a08, 0x8ebc, 0x8f57, + 0x8f7a, 0x922a, 0x9371, 0x944f, 0x54fd, 0x9467, 0x9493, 0x9515, + 0x5b25, 0x9528, 0x60e0, 0x954e, 0x68b8, 0x957f, 0x6947, 0x6bbd, + 0x964c, 0x70fd, 0x9688, 0x96b7, 0xbbe8, 0x9708, 0x9712, 0x97b7, + 0x9795, 0x9842, 0x9934, 0x994c, 0x99b3, 0x99e6, 0x9c9f, 0x9d1e, + 0x31f1, 0x3888, 0x38ff, 0xd579, 0x9e67, 0x9ef3, 0x70fd, 0xae3a, + 0x70fd, 0x9f1a, 0xa016, 0x70fd, 0x7406, 0x2af5, 0x394e, 0x3b58, + 0xa1a7, 0xd1d7, 0xbf22, 0xa391, 0xa3f9, 0xd17e, 0x8cda, 0x1bd0, + 0x1d78, 0xa659, 0xe09a, 0xa82e, 0xa84d, 0xa57b, 0xa874, 0xa8d6, + 0xaec5, 0x764a, 0x2412, 0x7691, 0x2bdf, 0x8b28, 0x0efe, 0xa2bf, + 0xa944, 0xaa16, 0x29c8, 0xab74, 0x0cdb, 0xac2f, 0xdda8, 0xe949, + 0x0aa2, 0x8e03, 0x5cde, 0xe14e, 0x70fd, 0xacd2, 0xad7b, 0xae95, + 0x4409, 0xaf40, 0x7b38, 0x2ba5, 0xb225, 0xb2c6, 0x7779, 0x601a, + 0xb36c, 0x24cf, 0x297f, 0x4371, 0xb559, 0xb619, 0xa48a, 0xaf27, + 0x27fc, 0xb646, 0xb66e, 0xc892, 0x70fd, 0x07b3, 0xb6bf, 0xd1b2, + 0xb6de, 0x1a18, 0xb6e2, 0xb6e6, 0xb907, 0xadbf, 0xb95d, 0x22a6, + 0x083b, 0x9d0c, 0x70fd, 0xb9c3, 0x1a7c, 0xdf48, 0xbaee, 0xbb89, + 0xbc06, 0x8a50, 0x29e1, 0x4351, 0x70fd, 0xc002, 0xd6d2, 0x6196, + 0xc0b2, 0xb2da, 0x5ce2, 0xc282, 0xc2ca, + /* 0x9c */ + 0x2f9b, 0xc937, 0x70fd, 0xc304, 0x875c, 0x5c6a, 0xae76, 0xc308, + 0xa52f, 0xc352, 0x1e80, 0xc3ff, 0xc475, 0x921b, 0x6565, 0xb921, + 0x33d5, 0x2c67, 0xf28d, 0x70fd, 0x28f9, 0xaa61, 0xc4bc, 0x20aa, + 0xadb4, 0x6756, 0x3fcf, 0xc9fd, 0x0958, 0x5af7, 0xc559, 0xc62e, + 0xc291, 0xc61e, 0x70fd, 0xc687, 0x4d42, 0xe480, 0x7911, 0xc6e6, + 0x70fd, 0xc6f9, 0x4c45, 0x70fd, 0xc7ba, 0x6b26, 0xc7ed, 0x099f, + 0xc2e9, 0x7121, 0x4b83, 0xc7f4, 0xc89b, 0x2f6c, 0x9e19, 0x70fd, + 0xc8dd, 0x19d0, 0xc9e4, 0x473b, 0x59e5, 0xcaee, 0x2af6, 0x0a5c, + 0x90cd, 0xcd8b, 0xcecd, 0x0f94, 0xcf40, 0xcf45, 0x6381, 0x8dba, + 0xcf4b, 0x6430, 0xcfa6, 0xae50, 0x3e79, 0x659f, 0xd050, 0x7db8, + 0x59a7, 0x5a75, 0x9426, 0xdcb3, 0x85f1, 0x40b8, 0xaeaa, 0x8660, + 0x0ce4, 0x09f9, 0x70fd, 0x70fd, 0x183f, 0x38f6, 0xeaad, 0xe824, + 0x5ac3, 0xd30c, 0xd358, 0x2916, 0x13df, 0x844a, 0x0ce1, 0xa02f, + 0xd9a8, 0x8285, 0x43ad, 0x5566, 0xd4dd, 0xe568, 0x70fd, 0x1f77, + 0xcdef, 0xdfab, 0xd4fd, 0xd50a, 0xd60b, 0xd766, 0xa6ba, 0x4d43, + 0x4b7e, 0xd8c9, 0x41b5, 0xefdf, 0x3c43, 0xdb98, 0x25e2, 0xcb47, + 0x64bf, 0x3a76, 0x685d, 0xda2f, 0xd8e3, 0xc775, 0x82ad, 0x9baf, + 0xd908, 0x2fc5, 0xe230, 0xd943, 0x2955, 0x6923, 0xdf49, 0x2feb, + 0xae08, 0x37fe, 0x3c15, 0x2612, 0xaf25, 0xa4c1, 0x0f51, 0x3976, + 0xd950, 0xd9b4, 0xd9ee, 0x8c21, 0xda0f, + /* 0x9d */ + 0xda49, 0xda6f, 0xda9a, 0xdb86, 0xdbaf, 0xdc0a, 0x090a, 0xdca8, + 0xde2a, 0x1bfa, 0x3626, 0xdf56, 0x4a08, 0x6355, 0xdfb8, 0x16f2, + 0xdfe7, 0x16df, 0xdfe8, 0xe146, 0xe1d4, 0x2c38, 0xe209, 0x70fd, + 0xe405, 0xe4ac, 0x70fd, 0xe4d0, 0xe4fc, 0x10f7, 0xe51e, 0xaf4a, + 0x6110, 0x448f, 0x28cb, 0xe667, 0xe6e9, 0xe6b0, 0xe6b8, 0xe732, + 0xe851, 0xe8c9, 0xe8ea, 0xe943, 0xe9a8, 0xea0e, 0xeb1a, 0xeb5b, + 0x509f, 0xecb8, 0xece3, 0x1f64, 0x6647, 0xef93, 0x43a2, 0xefff, + 0x2011, 0x6152, 0xf0cb, 0x201c, 0x7b5c, 0x60fe, 0x2801, 0x60fa, + 0x8ff0, 0x60f9, 0xaf13, 0x1809, 0x507f, 0x4156, 0x3cf1, 0x212a, + 0x0824, 0xe12c, 0xd39d, 0x0a7a, 0x5fc0, 0x8635, 0xd8e4, 0xe16c, + 0xe199, 0xd53e, 0xc46f, 0x10eb, 0xd1d5, 0xa277, 0xb7b5, 0xba16, + 0x20da, 0xbe01, 0xc118, 0x28ff, 0x7d2d, 0x5f4e, 0x2dad, 0xa3c8, + 0xb05e, 0x361e, 0x70fd, 0x8636, 0x86bb, 0x3770, 0x286d, 0xbc4a, + 0x265a, 0xb5d1, 0x10c6, 0xeb58, 0x1f3d, 0x2862, 0x285e, 0x5149, + 0xbe58, 0x2bb5, 0xa2c0, 0x58f0, 0x205c, 0x7eaa, 0x7c09, 0x9fba, + 0x5317, 0x6dde, 0x5e58, 0x483b, 0x6d45, 0x484e, 0x49b9, 0x6445, + 0x2672, 0x5348, 0x54f7, 0x2865, 0x5332, 0x5618, 0x52bd, 0x282a, + 0x4b62, 0x2883, 0x2656, 0x7d5d, 0x090e, 0x2845, 0x2831, 0x3931, + 0xdb62, 0x096d, 0x4734, 0x2830, 0x27fa, 0x26d7, 0x27b2, 0x7b01, + 0x7b56, 0x3110, 0xb448, 0x7d36, 0x9662, + /* 0x9e */ + 0x7d62, 0x6f2b, 0x4f5a, 0x281e, 0x7f35, 0x34dd, 0x686d, 0x26d4, + 0x5e0d, 0x43f6, 0x6276, 0x363c, 0x35f9, 0x363e, 0x27a9, 0x9583, + 0x6d72, 0x98b3, 0x23da, 0x081f, 0x7c67, 0x23e7, 0x268d, 0x275e, + 0x2753, 0x4866, 0x5f6d, 0xc64a, 0x47b1, 0x52b6, 0x5984, 0x5906, + 0x5a47, 0x53b6, 0x561c, 0x7f81, 0x17ec, 0x4504, 0xac06, 0x2dd0, + 0x550b, 0xc653, 0x28bb, 0x91f4, 0xd72f, 0xa6e3, 0xd773, 0xcc10, + 0xcf76, 0x6270, 0x8099, 0x6308, 0xa2bc, 0xf1a9, 0x7d6c, 0x7db9, + 0x4466, 0x89e2, 0x1a4e, 0xb302, 0xd8b9, 0x7eab, 0x13fa, 0x6d5d, + 0x375f, 0x97a0, 0x1bf3, 0xaca0, 0xeb3c, 0x7eac, 0x7cca, 0x70fd, + 0xd123, 0x7ead, 0x70fd, 0xbf88, 0x8047, 0x43a3, 0x508e, 0x6dd0, + 0x205a, 0x2044, 0x08b7, 0x2d4d, 0x3ef2, 0x25a7, 0x09ec, 0x0d1c, + 0x25bd, 0x09e5, 0xab18, 0x2ada, 0xafae, 0x542d, 0x268b, 0x29ea, + 0xbad5, 0x78b9, 0x70fd, 0x0d92, 0x8fa5, 0x4574, 0xec6c, 0x1fc9, + 0x6ced, 0xa2be, 0xecf0, 0x1f1b, 0xb2e9, 0xe69e, 0xed5e, 0x565c, + 0xa336, 0xcf72, 0xc573, 0xa020, 0x356e, 0x4f25, 0xa437, 0xa3ac, + 0x0d6a, 0x6148, 0x250c, 0x1174, 0x09ba, 0x18e9, 0x754e, 0x4840, + 0x2d30, 0x7d76, 0x4a7a, 0xd86e, 0x2ae7, 0x13bf, 0x28bc, 0x6c8b, + 0x2fb4, 0x4854, 0xf074, 0x6f05, 0x1fa1, 0x70fd, 0x0b3b, 0x3359, + 0x9a5a, 0xa932, 0x70fd, 0x289d, 0x8169, 0x29e7, 0xade3, 0xebc6, + 0x2474, 0xcdee, 0x08ed, 0x70fd, 0x6dfc, + /* 0x9f */ + 0x4e56, 0x6c39, 0x2a1e, 0x85ac, 0x2e93, 0x3713, 0xe650, 0xc1b5, + 0xcea4, 0x586d, 0x7be8, 0xca62, 0xaf62, 0x7c31, 0x70fd, 0x243e, + 0x8b8f, 0x2fce, 0x6803, 0x8a91, 0x6f01, 0x618c, 0x4d1f, 0x6c02, + 0x2f11, 0x4da3, 0x34a8, 0x3575, 0x6bff, 0x4dcf, 0x6c2a, 0x4e7e, + 0x70fd, 0x4e42, 0x4e86, 0x6d15, 0x4dfc, 0x6c09, 0x70fd, 0x6d1b, + 0xadbe, 0x6fda, 0x27b3, 0x2e03, 0x223d, 0x6f18, 0x2232, 0x24a0, + 0x1106, 0x2511, 0x29a7, 0x2296, 0x2bf7, 0x3052, 0x68c8, 0x6e2b, + 0x609c, 0x26a9, 0x68b4, 0x6a40, 0x68ba, 0x256c, 0x3370, 0x3b6c, + 0x261a, 0x6d0a, 0x6d82, 0x1efb, 0x6741, 0x3bc0, 0x22e6, 0x4746, + 0x85ad, 0x6ada, 0x24b3, 0x70fd, 0x6259, 0x6781, 0x625c, 0x70fd, + 0x6251, 0xe397, 0x35bf, 0xca63, 0x3d0a, 0x2851, 0x628e, 0x477a, + 0x34c5, 0x74bc, 0x454f, 0x4e70, 0xbc21, 0xa2bd, 0x70fd, 0xad99, + 0x48d6, 0x6c9d, 0x206a, 0x7b94, 0x55be, 0x59c2, 0x70fd, 0x2e8a, + 0x3c00, 0x70fd, 0x29ba, 0x245f, 0x3035, 0x210e, 0x3e71, 0x72b2, + 0x2179, 0x26dc, 0x271a, 0x24da, 0x5ec2, 0x093e, 0x70fd, 0x0933, + 0x70fd, 0x3d92, 0x627c, 0x7025, 0x6c97, 0x692e, 0x69b4, 0x6bba, + 0x6f28, 0x6f04, 0x437a, 0x4d14, 0x70fd, 0x3e3a, 0x5998, 0x5178, + 0x70fd, 0x2860, 0xf14a, 0x5fb7, 0x6fd3, 0x70fd, 0x5f14, 0x5f8f, + 0x6e9c, 0x5f41, 0x34c2, 0xdbfd, 0x5f68, 0x5fb5, 0x4cd3, 0xaef7, + 0x4c3e, 0x4ad8, 0x3f2a, 0x5be7, 0x4807, + /* 0xa0 */ + 0xe05a, 0x6fa6, 0x3f0e, 0x5956, 0x47c3, 0xefb2, 0x4a53, 0xf200, + 0x5e4c, 0x44e2, 0x4571, 0x5cad, 0x4502, 0x46f1, 0x5e2b, 0xaf3b, + 0x57ef, 0x31fa, 0x5a20, 0x17b7, 0x70fd, 0x867b, 0xcb45, 0x70fd, + 0x5bfe, 0x905b, 0x70fd, 0x333d, 0x4867, 0x6bd7, 0x6dc4, 0x646e, + 0x6c8f, 0x5975, 0x70fd, 0x70fd, 0x5e37, 0x452c, 0x6821, 0x6cb0, + 0x0916, 0x44b2, 0x1ec7, 0x4e51, 0x6a4a, 0xc059, 0x3399, 0x1ec4, + 0x6f16, 0x33bd, 0x70fd, 0x299f, 0x33af, 0x34e6, 0x3479, 0x70fd, + 0x0d9c, 0x3422, 0x25ea, 0x9d35, 0x35a4, 0x3a42, 0x0912, 0x2f97, + 0xe1c2, 0x611a, 0xe339, 0x70fd, 0x2319, 0x8a06, 0x4b06, 0x2572, + 0x6738, 0x7dfb, 0x1365, 0x70fd, 0x49fe, 0x70fd, 0x4ec2, 0xbe9a, + 0x4eda, 0x4c2d, 0x5266, 0x5263, 0x4f4d, 0x4705, 0x46f2, 0x5b14, + 0x541a, 0x394c, 0x5262, 0xd086, 0x525b, 0x46f0, 0x5303, 0x4924, + 0x5b09, 0xc58c, 0x4753, 0xcc11, 0x5929, 0x594e, 0x53c8, 0x590c, + 0x5bc9, 0x5ded, 0x5cc3, 0x492b, 0x46f8, 0x56da, 0x0975, 0x3bf2, + 0x5ee6, 0x70fd, 0x5b29, 0x70fd, 0x3ff9, 0x5941, 0xa551, 0x46e7, + 0x10db, 0x4376, 0x32e4, 0x33dc, 0x0fd1, 0x70fd, 0x32b7, 0x70fd, + 0x5171, 0xe12d, 0x70fd, 0x3329, 0x1e3e, 0x2460, 0x0f58, 0xa287, + 0xbe57, 0xd1d6, 0xb6b1, 0x8784, 0x81be, 0xe883, 0xcb1c, 0xcded, + 0x2f01, 0xc0ad, 0xe00f, 0x9f77, 0x71ee, 0xc606, 0xb24e, 0x1862, + 0x2d5f, 0xc1cc, 0x6fd0, 0x6f26, 0xc12b, +}; +static const unsigned short hkscs1999_2uni_pagec6[471] = { + /* 0xc6 */ + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x0460, + 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, 0x0468, + 0x0469, 0x0474, 0x0475, 0x0476, 0x0477, 0x0478, 0x0479, 0x047a, + 0x047b, 0x047c, 0x047d, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, + 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x2076, 0x207f, 0x20c5, + 0x20e0, 0x23c2, 0x23d6, 0x23eb, 0x2539, 0x2578, 0x25a9, 0x25f6, + 0x2b4a, 0x2dc0, 0x301b, 0x05b3, 0x30bf, 0x70fd, 0x3190, 0x31a1, + 0x3774, 0x70fd, 0x4792, 0x70fd, 0x60f5, 0x70fd, 0x0028, 0x01c6, + 0x06bd, 0x06be, 0x065d, 0x065e, 0x70fd, 0x70fd, 0x05c5, 0x05c6, + 0x05c7, 0x06bc, 0x70bb, 0x70bd, 0x04fd, 0x0601, 0x0602, 0x0603, + 0x0604, 0x0605, 0x0606, 0x0607, 0x0608, 0x0609, 0x060a, 0x060b, + 0x060c, 0x060d, 0x060e, 0x060f, 0x0610, 0x0611, 0x0612, 0x0613, + 0x0614, 0x0615, 0x0616, 0x0617, 0x0618, + /* 0xc7 */ + 0x0619, 0x061a, 0x061b, 0x061c, 0x061d, 0x061e, 0x061f, 0x0620, + 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, + 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630, + 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, + 0x0639, 0x063a, 0x063b, 0x063c, 0x063d, 0x063e, 0x063f, 0x0640, + 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, + 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, + 0x0651, 0x0652, 0x0653, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, + 0x0666, 0x0667, 0x0668, 0x0669, 0x066a, 0x066b, 0x066c, 0x066d, + 0x066e, 0x066f, 0x0670, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, + 0x0676, 0x0677, 0x0678, 0x0679, 0x067a, 0x067b, 0x067c, 0x067d, + 0x067e, 0x067f, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, + 0x0686, 0x0687, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x068d, + 0x068e, 0x068f, 0x0690, 0x0691, 0x0692, 0x0693, 0x0694, 0x0695, + 0x0696, 0x0697, 0x0698, 0x0699, 0x069a, 0x069b, 0x069c, 0x069d, + 0x069e, 0x069f, 0x06a0, 0x06a1, 0x06a2, 0x06a3, 0x06a4, 0x06a5, + 0x06a6, 0x06a7, 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ad, + 0x06ae, 0x06af, 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5, + 0x06b6, 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0201, + 0x0216, 0x0217, 0x0218, 0x0219, 0x021a, + /* 0xc8 */ + 0x021b, 0x021c, 0x021d, 0x021e, 0x021f, 0x0220, 0x0221, 0x0222, + 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0228, 0x0229, 0x022a, + 0x022b, 0x022c, 0x022d, 0x022e, 0x022f, 0x0230, 0x0231, 0x0232, + 0x0233, 0x0234, 0x0235, 0x0251, 0x0236, 0x0237, 0x0238, 0x0239, + 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, 0x0240, 0x0241, + 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, + 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, 0x03e7, 0x03b8, + 0x03b9, 0x06cf, 0x71cc, 0x209a, 0x718a, 0x2442, 0x1791, 0x7030, + 0x23c8, 0x7031, 0xd187, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70e2, 0x70e4, 0x7087, 0x7082, 0x0731, + 0x0316, 0x0321, 0x065b, 0x065c, 0x0500, 0x0504, 0x0506, 0x0507, + 0x0508, 0x050a, 0x050c, 0x050d, 0x0515, 0x051c, 0x051d, 0x0525, + 0x0527, 0x052a, 0x052c, 0x052e, 0x0536, 0x053c, 0x053e, 0x0546, + 0x054a, 0x054c, 0x054d, 0x054f, 0x0556, 0x0557, 0x055e, 0x0563, + 0x70fd, 0x70fd, 0x70fd, 0x0183, 0x0150, 0x015b, 0x0154, 0x0175, + 0x00d3, 0x0078, 0x00cb, 0x018a, 0x016a, +}; +static const unsigned short hkscs1999_2uni_pagef9[942] = { + /* 0xf9 */ + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, + 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x4a81, 0x63b9, 0x5a4f, 0x2afb, + 0x3292, 0x4ea7, 0x2d3a, 0x0494, 0x04a6, 0x0497, 0x04a0, 0x04ac, + 0x04a3, 0x049a, 0x04a9, 0x049d, 0x0492, 0x04a4, 0x0495, 0x049e, + 0x04aa, 0x04a1, 0x0498, 0x04a7, 0x049b, 0x0493, 0x04a5, 0x0496, + 0x049f, 0x04ab, 0x04a2, 0x0499, 0x04a8, 0x049c, 0x0491, 0x0490, + 0x04ad, 0x04ae, 0x04b0, 0x04af, 0x70ed, + /* 0xfa */ + 0x75c7, 0x63db, 0x765f, 0xa505, 0x574c, 0x15b5, 0x45ef, 0x23f5, + 0x0989, 0xadc2, 0xdfe4, 0x6444, 0x881b, 0x54ee, 0xa288, 0x4a3c, + 0x3984, 0x351f, 0xadb3, 0xdfaa, 0x7360, 0xc8f3, 0x81c5, 0x21eb, + 0x902d, 0x2248, 0xca69, 0xd584, 0x9f00, 0xaf31, 0x9053, 0x70fd, + 0x743e, 0x31e4, 0x7440, 0x7407, 0x40db, 0x74df, 0x70fd, 0x2341, + 0x07ba, 0x234e, 0x696c, 0x0a83, 0x5616, 0xae24, 0x7547, 0x23a0, + 0x9cf4, 0x23aa, 0x7abf, 0x8d3c, 0x73a5, 0x9070, 0x760e, 0x9bb3, + 0x87c3, 0x2dc2, 0x58fd, 0x7633, 0xa259, 0x23f2, 0x23f8, 0x6db4, + 0x2409, 0x240f, 0x2411, 0x0fdc, 0x2413, 0xaf26, 0x23f3, 0x2422, + 0x2582, 0x242d, 0x55cd, 0x3b7e, 0xa02d, 0x31bb, 0x244b, 0x2466, + 0x247c, 0x24f5, 0x2497, 0x24d4, 0x24f9, 0x2505, 0x4e15, 0x5742, + 0x2520, 0x57cd, 0xc853, 0x70fd, 0xe0de, 0x2789, 0x40d9, 0xa4c0, + 0x7894, 0xa52c, 0x2573, 0x70fd, 0x7aa2, 0x3f0b, 0x8566, 0x3a5b, + 0x45d5, 0x328a, 0x11aa, 0x0c0c, 0x8528, 0x43dd, 0x17a2, 0x25ad, + 0x25b4, 0xde2b, 0x25be, 0x70fd, 0x8416, 0x8453, 0x49e6, 0x25d3, + 0xe09b, 0x25e0, 0x25eb, 0x25ee, 0x45a7, 0xb8f2, 0x1259, 0x459c, + 0x2601, 0x2605, 0x3e89, 0x2089, 0x2a3e, 0x2619, 0x0deb, 0x7a4f, + 0x2620, 0xa52b, 0x97a3, 0x2636, 0x7b37, 0x2653, 0x4279, 0x276b, + 0x3897, 0x3f9b, 0x26ad, 0xc893, 0x7c34, 0x279d, 0x26cf, 0x26e4, + 0x1aa6, 0x854d, 0x7d9d, 0x10b4, 0x7c0d, + /* 0xfb */ + 0xdfbc, 0x9198, 0x2787, 0x1fad, 0x266f, 0x4617, 0x27c6, 0x27e9, + 0x70fd, 0x8717, 0xa57a, 0x1852, 0xa975, 0x38f3, 0x7f74, 0x2877, + 0x390d, 0x9c0a, 0x38e4, 0x38ed, 0x288d, 0x288f, 0x4af1, 0x2931, + 0x6887, 0x263e, 0x2940, 0x292f, 0x292d, 0xe166, 0x0963, 0x810f, + 0x2986, 0xa6e5, 0x3eae, 0x428b, 0x2982, 0x09f1, 0xc9be, 0x2a26, + 0x82d6, 0x2a43, 0x8314, 0xa8a3, 0x2a66, 0xaff5, 0x2a9c, 0x2aea, + 0x08a1, 0x2b20, 0x2b1c, 0x80fc, 0x2b3b, 0x2e3f, 0x2983, 0xee90, + 0xa7b8, 0x64d3, 0x08e1, 0x2b5f, 0x3ae6, 0x0a03, 0x4059, 0x847e, + 0x2c64, 0x2793, 0x84d2, 0x5705, 0x2c09, 0x7c0e, 0xc9c1, 0xca6a, + 0x861c, 0x2c19, 0x863b, 0x85f2, 0xcae6, 0x3fb1, 0x8668, 0x8515, + 0x2c39, 0xcb85, 0x2ceb, 0x2ca3, 0x0a26, 0xae29, 0x70fd, 0x0a48, + 0x2cd6, 0x4665, 0x2d13, 0xcce1, 0x9094, 0x1085, 0x8751, 0x0a72, + 0x84f8, 0x30c3, 0x2510, 0x2db6, 0x37c8, 0x2dbc, 0xd50e, 0x1304, + 0x1b5d, 0x72c4, 0x2e15, 0x33a0, 0x8874, 0xba8c, 0x7625, 0x2e33, + 0x2ddd, 0x1fd0, 0x2e45, 0x88c4, 0x2e53, 0x45ce, 0x2e54, 0x89e5, + 0xc868, 0x2e89, 0x1bdd, 0x2ec5, 0x2f29, 0x2f2f, 0x2fcb, 0x8ab9, + 0x8af7, 0x2f50, 0x2f58, 0x2f86, 0x8b24, 0x2efa, 0x3017, 0x54fc, + 0x0b6d, 0xad81, 0x8c89, 0x8db3, 0x5487, 0x0b76, 0x0f02, 0x306e, + 0x3cca, 0x70fd, 0x30ba, 0xa9fc, 0x7b93, 0x25e6, 0x20f7, 0x70fd, + 0x25e8, 0x85b1, 0x3049, 0x3134, 0xdcc2, + /* 0xfc */ + 0x3139, 0x313b, 0x0be0, 0x313c, 0x3a7e, 0x651b, 0x314d, 0x7281, + 0xf254, 0x0e1e, 0x1bae, 0x81fa, 0x317a, 0xc648, 0x8f50, 0x70fd, + 0x8fb1, 0x31a3, 0x68bd, 0xcbae, 0x31b2, 0x6440, 0xe036, 0x31e7, + 0x2ff6, 0x105f, 0xb510, 0x8bea, 0xce38, 0x9168, 0x62d6, 0x735e, + 0xe029, 0x3271, 0x38c5, 0x86b7, 0x0ca3, 0x10c7, 0x0979, 0x29d0, + 0x92b4, 0x4b71, 0x1140, 0x32de, 0x70fd, 0x32f3, 0xae02, 0xae0f, + 0xd553, 0x46a4, 0x2321, 0x2ce0, 0x33a4, 0x5624, 0x3382, 0xf266, + 0xcc12, 0x33c1, 0x2434, 0x76d6, 0x33c7, 0x2dea, 0xa4f7, 0x935f, + 0x3413, 0xe19d, 0xe8dd, 0x3410, 0x0c72, 0x9480, 0x93c1, 0x3263, + 0x339c, 0x375e, 0x35cb, 0x7218, 0x3505, 0x85b0, 0x3515, 0x980d, + 0x35ac, 0xae5f, 0x0d57, 0x3678, 0x3638, 0x824e, 0x863c, 0x70fd, + 0x418a, 0x9836, 0x6914, 0xa5cc, 0xb89d, 0x3721, 0x3725, 0x657b, + 0x0da6, 0x367a, 0x0d97, 0x378d, 0x4116, 0xaea8, 0xaea3, 0x37c5, + 0x37ad, 0x379f, 0x99fe, 0x37f5, 0xadc0, 0x1df7, 0x3811, 0x13d8, + 0x8669, 0x3820, 0x3823, 0x321f, 0x9d40, 0x3858, 0x9b77, 0x9b78, + 0x3884, 0x9b24, 0x9b25, 0x388b, 0x7d35, 0x38a7, 0xb4a6, 0x38b3, + 0x70fd, 0x8afd, 0x9bb1, 0xddb4, 0x9b48, 0xb5d3, 0x49c5, 0x93f7, + 0x6aa4, 0x3942, 0xa8dc, 0xaea1, 0x0e6b, 0x3c3a, 0xa0c2, 0x70fd, + 0x39a7, 0x39a2, 0xa70d, 0xe4ad, 0x3a17, 0x17e9, 0x3a62, 0x4050, + 0x633c, 0x3a41, 0x9d26, 0xcae0, 0x3a9d, + /* 0xfd */ + 0x9daf, 0x3c21, 0x3c4b, 0xe0df, 0x3bb3, 0x3b03, 0x9ecd, 0x3b41, + 0x3b40, 0x1032, 0x0d41, 0x9f3c, 0x0ec0, 0x39ec, 0x3ba1, 0xe04a, + 0x15fc, 0x3b76, 0x3bd8, 0x0ee1, 0x7489, 0x5563, 0x22d0, 0x3c39, + 0x9f59, 0x8d6a, 0x3c85, 0xa003, 0x3cdd, 0x0f33, 0x39f1, 0x3d08, + 0xe55c, 0x0f4d, 0x3d5d, 0x7863, 0x331e, 0x3d75, 0x3db4, 0x92cd, + 0x40b5, 0xa1db, 0x7475, 0x8798, 0x0a80, 0x2661, 0xa21a, 0x3e21, + 0xa43c, 0x3e1c, 0x3e77, 0x8fcb, 0xad71, 0xc891, 0x3e9a, 0x5426, + 0x3eb9, 0xa33c, 0x17c5, 0xa33d, 0xa6e4, 0xad8c, 0xad80, 0xa289, + 0x0a25, 0x0feb, 0x7bf2, 0x6c83, 0x9b79, 0x8fd1, 0x518f, 0x3a77, + 0xca65, 0xcae1, 0xcb2b, 0x3fd6, 0x3f9c, 0x407c, 0x4104, 0xadff, + 0xa5c5, 0xcbb2, 0x5733, 0xccb4, 0x2407, 0x70fd, 0x70fd, 0x562e, + 0xe121, 0x70fd, 0xa3af, 0x4653, 0xa4c2, 0x4bcc, 0x404f, 0x2cd1, + 0x99cb, 0x41f8, 0x0a4d, 0x419d, 0xa3b0, 0x40fa, 0x8357, 0xa57d, + 0x1855, 0x64f0, 0x4144, 0x415c, 0x104e, 0x4174, 0xe530, 0x103b, + 0x419f, 0xa684, 0x41d3, 0xa5d1, 0xa695, 0xa579, 0xa530, 0xa4f4, + 0xa67f, 0x241f, 0xa696, 0xa697, 0xa680, 0xc0dd, 0x424b, 0x427e, + 0x42a7, 0x4281, 0x42cc, 0x42d5, 0x42d6, 0x42df, 0x1404, 0x10e8, + 0x43b4, 0x4396, 0xa7b7, 0x432b, 0x4345, 0x2cc8, 0x434a, 0x70fd, + 0x2edc, 0xa8a5, 0x434f, 0x6462, 0xa801, 0x432c, 0xa99a, 0xaea7, + 0xaea2, 0x43ba, 0xe1e8, 0x42bd, 0x440e, + /* 0xfe */ + 0x6542, 0x4415, 0x2b51, 0x6543, 0x4424, 0x6441, 0xb785, 0x442e, + 0x4440, 0xadf4, 0x3afd, 0x4455, 0x4457, 0x1155, 0x99c4, 0x3a4d, + 0x413d, 0x4482, 0x70fd, 0x452b, 0xace3, 0xdeeb, 0x1bed, 0xdec4, + 0x4528, 0x452e, 0x45cf, 0x45aa, 0x7afa, 0xc7ee, 0x45c9, 0x4649, + 0xa722, 0x8527, 0xaea4, 0x3863, 0x0a05, 0xae37, 0xae0d, 0xae7b, + 0x45f7, 0x4615, 0x3b43, 0xaea6, 0x4639, 0x7643, 0x11d7, 0x70fd, + 0x93ad, 0x4660, 0xe3b2, 0x4647, 0x45e4, 0x4676, 0x55b9, 0x466c, + 0x0a70, 0x4674, 0x64f1, 0x3c6c, 0x4682, 0x1c53, 0xaf0c, 0xa69f, + 0xaef9, 0xe18f, 0x2d86, 0xe203, 0x86de, 0x46c8, 0x87c8, 0x470e, + 0x70fd, 0x471e, 0xe3d9, 0x888b, 0x2e17, 0xe3ac, 0x6485, 0x474d, + 0x474a, 0x4767, 0x476e, 0xb2c2, 0x1204, 0xb0d3, 0x478e, 0x465d, + 0x479e, 0x47b4, 0x4802, 0x482c, 0x4851, 0x484f, 0x486f, 0x4876, + 0xc275, 0x4890, 0x53ef, 0x0b38, 0xc6d1, 0xc6ce, 0x48a1, 0x48a5, + 0x48b7, 0x48cc, 0xccdf, 0x5662, 0xb3dd, 0xb47d, 0x8adc, 0x491e, + 0x4926, 0x4940, 0x36ef, 0xb4e0, 0x4958, 0x9c2c, 0x49af, 0xdf64, + 0xdf68, 0x8501, 0x49f4, 0x70fd, 0x8236, 0xae92, 0x3b0a, 0x4aaf, + 0x4ac7, 0x4ad3, 0x67a5, 0x4b2e, 0xb760, 0x4ad7, 0x4b34, 0x4ab1, + 0xd18c, 0x60f8, 0x5a04, 0xe12b, 0xbfc3, 0x911c, 0x4b86, 0x5a80, + 0x3b42, 0x4b80, 0xb957, 0x4b9d, 0xd639, 0x4b3c, 0x4ba9, 0x402a, + 0xce66, 0x11a8, 0x4bc6, 0xe4cd, 0x4bd4, +}; + +static const ucs4_t hkscs1999_2uni_upages[973] = { + 0x00080, 0x000c0, 0x00100, 0x00140, 0x001c0, 0x00240, 0x00280, 0x002c0, + 0x00400, 0x00440, 0x01e80, 0x01ec0, 0x02100, 0x02140, 0x02180, 0x021c0, + 0x023c0, 0x02440, 0x02540, 0x02700, 0x02e80, 0x02ec0, 0x02f00, 0x03000, + 0x03040, 0x03080, 0x030c0, 0x031c0, 0x03200, 0x03400, 0x03440, 0x03480, + 0x034c0, 0x03500, 0x03540, 0x03580, 0x035c0, 0x03600, 0x03640, 0x03680, + 0x036c0, 0x03700, 0x03740, 0x03780, 0x037c0, 0x03800, 0x03840, 0x03880, + 0x038c0, 0x03900, 0x03940, 0x03980, 0x039c0, 0x03a00, 0x03a40, 0x03a80, + 0x03ac0, 0x03b00, 0x03b40, 0x03b80, 0x03bc0, 0x03c00, 0x03c40, 0x03cc0, + 0x03d00, 0x03d40, 0x03d80, 0x03dc0, 0x03e00, 0x03e40, 0x03e80, 0x03ec0, + 0x03f00, 0x03f40, 0x03f80, 0x03fc0, 0x04000, 0x04040, 0x04080, 0x040c0, + 0x04100, 0x04140, 0x04180, 0x041c0, 0x04200, 0x04240, 0x04280, 0x042c0, + 0x04300, 0x04340, 0x04380, 0x043c0, 0x04400, 0x04440, 0x04480, 0x044c0, + 0x04500, 0x04540, 0x04580, 0x045c0, 0x04600, 0x04640, 0x04680, 0x046c0, + 0x04700, 0x04740, 0x04780, 0x047c0, 0x04800, 0x04840, 0x04880, 0x048c0, + 0x04900, 0x04940, 0x04980, 0x049c0, 0x04a00, 0x04a80, 0x04ac0, 0x04b00, + 0x04b40, 0x04b80, 0x04bc0, 0x04c00, 0x04c40, 0x04c80, 0x04cc0, 0x04d00, + 0x04d80, 0x04e00, 0x04e40, 0x04e80, 0x04ec0, 0x04f00, 0x04f40, 0x04f80, + 0x04fc0, 0x05000, 0x05040, 0x05080, 0x050c0, 0x05100, 0x05140, 0x05180, + 0x051c0, 0x05200, 0x05240, 0x05280, 0x052c0, 0x05300, 0x05340, 0x05380, + 0x053c0, 0x05400, 0x05440, 0x05480, 0x054c0, 0x05500, 0x05540, 0x05580, + 0x055c0, 0x05600, 0x05640, 0x05680, 0x056c0, 0x05700, 0x05740, 0x05780, + 0x057c0, 0x05800, 0x05840, 0x05880, 0x058c0, 0x05900, 0x05940, 0x05980, + 0x059c0, 0x05a00, 0x05a40, 0x05a80, 0x05ac0, 0x05b00, 0x05b40, 0x05b80, + 0x05bc0, 0x05c00, 0x05c40, 0x05c80, 0x05cc0, 0x05d00, 0x05d40, 0x05d80, + 0x05dc0, 0x05e00, 0x05e40, 0x05e80, 0x05ec0, 0x05f00, 0x05f40, 0x05f80, + 0x05fc0, 0x06000, 0x06040, 0x06080, 0x060c0, 0x06100, 0x06140, 0x06180, + 0x061c0, 0x06200, 0x06240, 0x06280, 0x062c0, 0x06300, 0x06340, 0x06380, + 0x063c0, 0x06400, 0x06440, 0x06480, 0x064c0, 0x06500, 0x06540, 0x06580, + 0x065c0, 0x06600, 0x06640, 0x06680, 0x066c0, 0x06700, 0x06740, 0x06780, + 0x067c0, 0x06800, 0x06840, 0x06880, 0x068c0, 0x06900, 0x06940, 0x06980, + 0x069c0, 0x06a00, 0x06a40, 0x06a80, 0x06ac0, 0x06b00, 0x06b40, 0x06b80, + 0x06bc0, 0x06c00, 0x06c40, 0x06c80, 0x06cc0, 0x06d00, 0x06d40, 0x06d80, + 0x06e00, 0x06e40, 0x06e80, 0x06ec0, 0x06f00, 0x06f40, 0x06f80, 0x06fc0, + 0x07000, 0x07040, 0x07080, 0x070c0, 0x07100, 0x07140, 0x07180, 0x071c0, + 0x07200, 0x07240, 0x07280, 0x072c0, 0x07300, 0x07340, 0x07380, 0x073c0, + 0x07400, 0x07440, 0x07480, 0x074c0, 0x07500, 0x07540, 0x07580, 0x075c0, + 0x07600, 0x07640, 0x07680, 0x076c0, 0x07700, 0x07740, 0x07780, 0x077c0, + 0x07800, 0x07840, 0x07880, 0x078c0, 0x07900, 0x07940, 0x07980, 0x079c0, + 0x07a00, 0x07a40, 0x07a80, 0x07ac0, 0x07b00, 0x07b40, 0x07b80, 0x07bc0, + 0x07c00, 0x07c40, 0x07c80, 0x07cc0, 0x07d00, 0x07d40, 0x07d80, 0x07dc0, + 0x07e00, 0x07e40, 0x07e80, 0x07ec0, 0x07f00, 0x07f40, 0x07f80, 0x07fc0, + 0x08000, 0x08040, 0x08080, 0x080c0, 0x08100, 0x08140, 0x08180, 0x081c0, + 0x08200, 0x08240, 0x08280, 0x082c0, 0x08300, 0x08340, 0x08380, 0x083c0, + 0x08400, 0x08440, 0x08480, 0x084c0, 0x08500, 0x08540, 0x085c0, 0x08600, + 0x08640, 0x08680, 0x086c0, 0x08740, 0x08780, 0x087c0, 0x08800, 0x08840, + 0x08880, 0x088c0, 0x08900, 0x08940, 0x08980, 0x089c0, 0x08a00, 0x08a40, + 0x08a80, 0x08ac0, 0x08b00, 0x08b40, 0x08b80, 0x08bc0, 0x08c40, 0x08c80, + 0x08cc0, 0x08d00, 0x08d40, 0x08d80, 0x08dc0, 0x08e00, 0x08e40, 0x08e80, + 0x08ec0, 0x08f00, 0x08f40, 0x08f80, 0x08fc0, 0x09000, 0x09040, 0x09080, + 0x090c0, 0x09140, 0x09180, 0x091c0, 0x09200, 0x09240, 0x09280, 0x092c0, + 0x09300, 0x09340, 0x09380, 0x093c0, 0x09400, 0x09440, 0x09480, 0x094c0, + 0x09500, 0x09540, 0x09580, 0x095c0, 0x09600, 0x09640, 0x09680, 0x096c0, + 0x09700, 0x09740, 0x09780, 0x097c0, 0x09800, 0x09840, 0x09880, 0x098c0, + 0x09900, 0x09940, 0x09980, 0x099c0, 0x09a00, 0x09a40, 0x09a80, 0x09ac0, + 0x09b00, 0x09b40, 0x09b80, 0x09bc0, 0x09c00, 0x09c40, 0x09d00, 0x09d40, + 0x09d80, 0x09dc0, 0x09e00, 0x09e40, 0x09e80, 0x09ec0, 0x09f00, 0x09f40, + 0x09f80, 0x0f900, 0x0ff00, 0x0ffc0, 0x20000, 0x20040, 0x20080, 0x200c0, + 0x20100, 0x20180, 0x201c0, 0x20200, 0x20240, 0x20280, 0x202c0, 0x20300, + 0x20340, 0x20380, 0x203c0, 0x20400, 0x20440, 0x20480, 0x204c0, 0x20540, + 0x20580, 0x205c0, 0x20600, 0x20640, 0x20700, 0x20740, 0x20800, 0x20840, + 0x208c0, 0x20900, 0x20940, 0x209c0, 0x20a00, 0x20a40, 0x20a80, 0x20ac0, + 0x20b00, 0x20b80, 0x20bc0, 0x20c00, 0x20c40, 0x20c80, 0x20cc0, 0x20d00, + 0x20d40, 0x20d80, 0x20dc0, 0x20e00, 0x20e40, 0x20e80, 0x20ec0, 0x20f00, + 0x20f40, 0x20f80, 0x20fc0, 0x21000, 0x21040, 0x21080, 0x210c0, 0x21100, + 0x21140, 0x21180, 0x211c0, 0x21200, 0x21240, 0x21280, 0x212c0, 0x21300, + 0x21340, 0x21380, 0x213c0, 0x21400, 0x21440, 0x21480, 0x214c0, 0x21540, + 0x21580, 0x21600, 0x21640, 0x21680, 0x216c0, 0x21700, 0x21740, 0x21780, + 0x217c0, 0x21800, 0x21840, 0x21880, 0x218c0, 0x21900, 0x21940, 0x21980, + 0x219c0, 0x21a00, 0x21a40, 0x21b40, 0x21bc0, 0x21c00, 0x21c40, 0x21c80, + 0x21d40, 0x21d80, 0x21dc0, 0x21e00, 0x21e80, 0x21ec0, 0x21f00, 0x21f40, + 0x21f80, 0x21fc0, 0x22040, 0x22080, 0x220c0, 0x22100, 0x22140, 0x22180, + 0x221c0, 0x22200, 0x22240, 0x22300, 0x22380, 0x223c0, 0x22440, 0x22480, + 0x224c0, 0x22500, 0x22540, 0x22580, 0x22600, 0x22640, 0x22680, 0x226c0, + 0x22700, 0x22740, 0x22780, 0x227c0, 0x22800, 0x22840, 0x22880, 0x228c0, + 0x22900, 0x22940, 0x22980, 0x22a40, 0x22ac0, 0x22b00, 0x22b40, 0x22bc0, + 0x22c00, 0x22c40, 0x22c80, 0x22cc0, 0x22d00, 0x22d40, 0x22d80, 0x22dc0, + 0x22e00, 0x22e40, 0x22e80, 0x22ec0, 0x22f40, 0x22fc0, 0x23000, 0x23040, + 0x23080, 0x230c0, 0x23100, 0x23140, 0x23180, 0x231c0, 0x23200, 0x23240, + 0x23280, 0x232c0, 0x23300, 0x23380, 0x233c0, 0x23400, 0x23440, 0x234c0, + 0x23500, 0x23540, 0x23580, 0x235c0, 0x23600, 0x23640, 0x23680, 0x236c0, + 0x23700, 0x23740, 0x23780, 0x237c0, 0x23800, 0x239c0, 0x23a80, 0x23ac0, + 0x23b40, 0x23c80, 0x23cc0, 0x23d40, 0x23d80, 0x23dc0, 0x23e00, 0x23e80, + 0x23ec0, 0x23f00, 0x23f40, 0x23f80, 0x23fc0, 0x24000, 0x24040, 0x24080, + 0x240c0, 0x24100, 0x24140, 0x24180, 0x241c0, 0x24200, 0x24240, 0x24280, + 0x242c0, 0x24300, 0x24340, 0x24380, 0x243c0, 0x24400, 0x24440, 0x24480, + 0x244c0, 0x24500, 0x24540, 0x245c0, 0x24600, 0x24640, 0x24680, 0x246c0, + 0x24700, 0x24780, 0x247c0, 0x24800, 0x24880, 0x248c0, 0x24900, 0x24940, + 0x24980, 0x249c0, 0x24a00, 0x24a40, 0x24a80, 0x24ac0, 0x24b40, 0x24bc0, + 0x24c00, 0x24c80, 0x24cc0, 0x24d00, 0x24d80, 0x24dc0, 0x24e00, 0x24e40, + 0x24e80, 0x24f00, 0x24f40, 0x24f80, 0x24fc0, 0x25000, 0x25040, 0x25080, + 0x25100, 0x25140, 0x251c0, 0x25200, 0x25240, 0x25280, 0x252c0, 0x25300, + 0x25400, 0x25440, 0x25500, 0x25540, 0x25580, 0x255c0, 0x25600, 0x25640, + 0x25680, 0x256c0, 0x25700, 0x25740, 0x257c0, 0x25840, 0x258c0, 0x25900, + 0x25940, 0x25980, 0x259c0, 0x25a80, 0x25ac0, 0x25b40, 0x25b80, 0x25bc0, + 0x25c00, 0x25c40, 0x25c80, 0x25cc0, 0x25d00, 0x25d40, 0x25e00, 0x25e40, + 0x25e80, 0x25ec0, 0x25f00, 0x25f40, 0x25fc0, 0x26000, 0x26040, 0x26080, + 0x26100, 0x26140, 0x26180, 0x261c0, 0x26240, 0x262c0, 0x26300, 0x26340, + 0x26380, 0x263c0, 0x26400, 0x26440, 0x26480, 0x26500, 0x26540, 0x26580, + 0x26600, 0x26680, 0x266c0, 0x26700, 0x26740, 0x26780, 0x267c0, 0x26800, + 0x26840, 0x26880, 0x268c0, 0x26900, 0x26940, 0x26980, 0x269c0, 0x26a00, + 0x26a40, 0x26b00, 0x26b40, 0x26b80, 0x26bc0, 0x26c00, 0x26c40, 0x26c80, + 0x26cc0, 0x26d00, 0x26d40, 0x26d80, 0x26dc0, 0x26e00, 0x26e40, 0x26e80, + 0x26ec0, 0x26f00, 0x26f40, 0x26f80, 0x26fc0, 0x27000, 0x27040, 0x27080, + 0x270c0, 0x27100, 0x27140, 0x271c0, 0x27200, 0x27280, 0x272c0, 0x27380, + 0x27400, 0x27440, 0x27480, 0x27540, 0x27580, 0x275c0, 0x27600, 0x27640, + 0x27680, 0x27700, 0x27740, 0x27780, 0x277c0, 0x27840, 0x27880, 0x278c0, + 0x27900, 0x27940, 0x27980, 0x279c0, 0x27a00, 0x27a40, 0x27a80, 0x27ac0, + 0x27b00, 0x27b40, 0x27bc0, 0x27c00, 0x27d00, 0x27d40, 0x27d80, 0x27dc0, + 0x27e40, 0x27f00, 0x27fc0, 0x28000, 0x28040, 0x28080, 0x280c0, 0x28100, + 0x28140, 0x28180, 0x28200, 0x28240, 0x28280, 0x282c0, 0x28300, 0x28340, + 0x28380, 0x28400, 0x28440, 0x28480, 0x28500, 0x28540, 0x285c0, 0x28600, + 0x28680, 0x286c0, 0x28700, 0x28800, 0x28900, 0x28940, 0x28980, 0x289c0, + 0x28a00, 0x28a40, 0x28a80, 0x28ac0, 0x28b00, 0x28b40, 0x28b80, 0x28bc0, + 0x28c00, 0x28cc0, 0x28d00, 0x28d80, 0x28e00, 0x28e40, 0x28e80, 0x28ec0, + 0x28fc0, 0x29080, 0x290c0, 0x29100, 0x29140, 0x29180, 0x291c0, 0x29400, + 0x29440, 0x294c0, 0x29580, 0x295c0, 0x29700, 0x297c0, 0x29800, 0x29840, + 0x29880, 0x298c0, 0x29900, 0x29940, 0x29980, 0x299c0, 0x29a00, 0x29a40, + 0x29b00, 0x29bc0, 0x29c80, 0x29d00, 0x29d40, 0x29d80, 0x29dc0, 0x29e00, + 0x29e40, 0x29e80, 0x29ec0, 0x29f00, 0x29f80, 0x29fc0, 0x2a000, 0x2a080, + 0x2a0c0, 0x2a100, 0x2a140, 0x2a180, 0x2a1c0, 0x2a200, 0x2a280, 0x2a2c0, + 0x2a380, 0x2a400, 0x2a440, 0x2a5c0, 0x2a600, 0x2a640, 0x2a680, 0x2f800, + 0x2f840, 0x2f880, 0x2f8c0, 0x2f980, 0x2f9c0, +}; + +static int +hkscs1999_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x88 && c1 <= 0x8b) || (c1 >= 0x8d && c1 <= 0xa0) || (c1 >= 0xc6 && c1 <= 0xc8) || (c1 >= 0xf9 && c1 <= 0xfe)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + ucs4_t wc = 0xfffd; + unsigned short swc; + if (i < 2041) { + if (i < 1883) + swc = hkscs1999_2uni_page88[i-1256], + wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); + } else if (i < 10990) { + if (i < 5181) + swc = hkscs1999_2uni_page8d[i-2041], + wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); + } else if (i < 18997) { + if (i < 11461) + swc = hkscs1999_2uni_pagec6[i-10990], + wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); + } else { + if (i < 19939) + swc = hkscs1999_2uni_pagef9[i-18997], + wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short hkscs1999_2charset[4698] = { + 0xc6d8, 0x8859, 0x8857, 0x885d, 0x885b, 0x8866, 0x8861, 0x885f, + 0x886a, 0x8868, 0x886f, 0x886d, 0x88a7, 0x8873, 0x8871, 0x8877, + 0x8875, 0xc8fb, 0x887b, 0x8879, 0x88a2, 0x8856, 0x8867, 0x885a, + 0x886c, 0x885c, 0x886e, 0x8870, 0xc8fc, 0x885e, 0x8874, 0xc8fa, + 0x8878, 0x8858, 0x8869, 0x8872, 0x8860, 0x8876, 0x887a, 0x887c, + 0x887d, 0x887e, 0x88a1, 0xc8f6, 0x886b, 0xc8f8, 0xc8f7, 0x88a8, + 0xc8fe, 0xc8f9, 0xc8f5, 0xc8fd, 0xc6d9, 0xc7f9, 0xc7f3, 0xc7f4, + 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, + 0xc7fe, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, + 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, + 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, + 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85c, 0xc85d, 0xc85e, 0xc85f, + 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, + 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, + 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc85b, 0x8863, + 0x88a4, 0x8865, 0x88a6, 0xc8d2, 0xc8d3, 0xc6b5, 0xc6b6, 0xc6b7, + 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc877, + 0xc878, 0xc876, 0x88a9, 0x88aa, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4, + 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, + 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, + 0xf9f9, 0xf9f8, 0xf9e6, 0xf9ef, 0xf9dd, 0xf9e8, 0xf9f1, 0xf9df, + 0xf9ec, 0xf9f5, 0xf9e3, 0xf9ee, 0xf9f7, 0xf9e5, 0xf9e9, 0xf9f2, + 0xf9e0, 0xf9eb, 0xf9f4, 0xf9e2, 0xf9e7, 0xf9f0, 0xf9de, 0xf9ed, + 0xf9f6, 0xf9e4, 0xf9ea, 0xf9f3, 0xf9e1, 0xf9fa, 0xf9fb, 0xf9fd, + 0xf9fc, 0xc6e6, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, + 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e0, 0xc8e1, 0xc8e2, 0xc8e3, + 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, + 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1, 0xc6cd, 0xc6e0, + 0xc6e1, 0xc6e2, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, + 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, + 0xc6f5, 0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, + 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, + 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, + 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, + 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, + 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, + 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, + 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, + 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc8d4, 0xc8d5, 0xc6dc, + 0xc6dd, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, + 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, + 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, + 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, + 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, + 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, + 0xc7cc, 0xc7cd, 0xc7ce, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, + 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, + 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, + 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, + 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc6e3, + 0xc6da, 0xc6db, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8846, + 0x8849, 0x884a, 0x884d, 0x884f, 0x8850, 0x8851, 0x8852, 0x8854, + 0x8855, 0xc879, 0xc8d1, 0x9277, 0x96df, 0x89d5, 0x93cd, 0x9bdf, + 0xfa68, 0x89da, 0x8f59, 0x89db, 0x8f5d, 0x89dc, 0x96f7, 0x8ada, + 0x8bdc, 0x97db, 0x9e53, 0x9daa, 0x9bea, 0x8a6e, 0x8bc8, 0x89e8, + 0x89ea, 0xfb70, 0x89ed, 0x94dd, 0x89ee, 0x9eb4, 0x8ad3, 0x92db, + 0x94db, 0x89f9, 0xfb7a, 0x89fb, 0x9efc, 0x89fc, 0x89bf, 0x89fe, + 0x89e6, 0x9d46, 0x9dee, 0xa07e, 0xa068, 0x98e9, 0x8b68, 0x8dfd, + 0x8bbe, 0x9fd9, 0x8aeb, 0x9fd7, 0x8b6a, 0x9c5c, 0x8bb1, 0xfb5e, + 0x9df3, 0xa0d0, 0xfc66, 0x92e9, 0x9aec, 0x8fab, 0xfa48, 0x8e45, + 0x9c6f, 0x9ede, 0x89ef, 0x96e9, 0x9ebb, 0x94de, 0x9eb8, 0x97ba, + 0xfb65, 0x95d6, 0x9cbb, 0x97da, 0x8f45, 0xfb7d, 0x9158, 0xfe64, + 0x9856, 0x9b4d, 0x935b, 0x95c7, 0x97e7, 0x9359, 0x91f5, 0x97b8, + 0xfda2, 0xfbb6, 0x92fa, 0x9357, 0x8ba6, 0xfbb9, 0x97b0, 0xfdc4, + 0x9ca1, 0x91f2, 0x91f9, 0x8ff1, 0x9745, 0x9853, 0xfe78, 0xfbc1, + 0x9251, 0x9dad, 0xfd6c, 0xfa6b, 0x9bc2, 0x9a7b, 0x8b60, 0x934b, + 0x9abd, 0x91b7, 0x95b4, 0xfec5, 0x9ef0, 0x8d64, 0x9269, 0x8d67, + 0xfbea, 0xfbef, 0x8d68, 0x93eb, 0xfc42, 0x9166, 0xfacd, 0x93dd, + 0x8bcc, 0x8d6d, 0x8d6e, 0x96a8, 0xfca6, 0x8d6f, 0x8d70, 0xfc64, + 0x9060, 0x8d74, 0x97c3, 0x8ad0, 0x9274, 0x9bbe, 0x9cc8, 0x9cba, + 0x8d78, 0x9eb9, 0x955a, 0x91b4, 0x8a48, 0x8d7d, 0x8a7d, 0x8ac2, + 0xfd4a, 0x8da1, 0x8ad1, 0xfcb4, 0x8b47, 0x93a4, 0x9eda, 0x8a51, + 0x8da6, 0x9ec5, 0xfcc4, 0xa078, 0x94b5, 0xfcc2, 0x8a6b, 0x8dab, + 0xfae8, 0x8dad, 0xfc49, 0x93c1, 0x906f, 0x8db0, 0x947e, 0x90fa, + 0x9479, 0x8db2, 0xfcee, 0x997b, 0x8db4, 0x8db7, 0x91b3, 0x8dbb, + 0x8dba, 0x8dbc, 0x9044, 0xfd4c, 0x93e4, 0x93e0, 0xfd53, 0x8dc3, + 0x9bb8, 0xfbf0, 0x93e9, 0x93f6, 0x8dc5, 0x8dca, 0x8dcc, 0xfd5d, + 0x93b5, 0xfd61, 0x9cf8, 0x9252, 0xa0e8, 0x9ca5, 0x8dd6, 0x97c0, + 0xa0de, 0x97d2, 0xfaa5, 0xfda3, 0x8ddb, 0x8eaf, 0x91b5, 0xfd49, + 0xfdd1, 0x8deb, 0x97c6, 0xfdce, 0x90fc, 0xfc59, 0x96d6, 0x97c5, + 0x8def, 0x97d7, 0x8df0, 0x96a6, 0xfbbf, 0x8df3, 0x9449, 0x8df5, + 0x9872, 0x8e6b, 0xfafd, 0x8f50, 0x9dcc, 0xfc65, 0x996e, 0x94a1, + 0x8f63, 0xa0da, 0x9253, 0xfde9, 0x9db5, 0x9879, 0x9d5d, 0x8d63, + 0x9669, 0x9f70, 0xfc6a, 0x8ac7, 0x89d7, 0xfe4d, 0x9edd, 0xfefb, + 0x98bc, 0xfacc, 0x95b0, 0x9464, 0x936f, 0x94b9, 0x95ec, 0x91ee, + 0x98c3, 0x95f6, 0x8ffd, 0x98c5, 0x9766, 0xfe6e, 0x97dd, 0x92d2, + 0x9761, 0x98cb, 0x95f0, 0x975d, 0x91e3, 0x98cc, 0x9469, 0x98cd, + 0x98ce, 0x95fc, 0x94a3, 0x9662, 0xfeb6, 0x9463, 0x98d0, 0x98d1, + 0x9475, 0xfae0, 0x9472, 0x98d6, 0x8af0, 0x98d9, 0x98db, 0x98dd, + 0x98a8, 0x8a6d, 0x8afb, 0x8aae, 0xfbc9, 0x98e4, 0x98e6, 0x98e8, + 0x8a4d, 0x9257, 0x95df, 0xa0ac, 0x98eb, 0x98ec, 0x98f4, 0x8ab8, + 0x9ee7, 0x94bc, 0xfcd1, 0x9cc6, 0x9e7e, 0x98fe, 0xfde8, 0x9940, + 0x94c9, 0x94d3, 0x9946, 0x90c0, 0x94d1, 0x9573, 0x93c2, 0x9948, + 0x994b, 0x8e55, 0x994e, 0x8efe, 0x8e59, 0x94ec, 0x94ef, 0x8f74, + 0x9955, 0x9544, 0x9956, 0x9959, 0x995b, 0xfa45, 0x90b7, 0x9743, + 0x95cd, 0x97c9, 0xfd50, 0x8eb9, 0x95c6, 0x9967, 0x8ab9, 0x8dfc, + 0x8a76, 0x9d51, 0x9973, 0x9d4f, 0x997a, 0x9564, 0x99a1, 0x99a5, + 0x99a7, 0x8eed, 0x99ad, 0xc87e, 0x946e, 0x8f70, 0xfad0, 0x99b3, + 0xa053, 0x965c, 0xfd7a, 0x97fe, 0x92bd, 0x97fd, 0x8f64, 0xfcf7, + 0x9562, 0x97cd, 0x9e64, 0x924c, 0x8ec9, 0x99bc, 0x9da5, 0x8f54, + 0x8f7c, 0x8ea2, 0x8f7a, 0x97ae, 0x96c8, 0x99c3, 0x90d6, 0x9cbe, + 0x8f76, 0x9470, 0xfb4b, 0xfdca, 0x8ec7, 0xa0f9, 0x8fa9, 0x99c7, + 0x90d7, 0x9edf, 0x99ce, 0x8fba, 0x8feb, 0x99cf, 0x8fc2, 0x92c9, + 0x97dc, 0x95b3, 0x9c79, 0x95b2, 0x8fdb, 0x9be3, 0x9e7a, 0x9bee, + 0x99de, 0xfafa, 0x8a52, 0x99e1, 0x8a67, 0x8bb5, 0x8aac, 0x99e9, + 0xfbca, 0x97de, 0x95d1, 0x99f5, 0xfc4a, 0x9ba9, 0xfbdc, 0xfe56, + 0x9ea4, 0x9d49, 0x95db, 0x89c5, 0x99f8, 0x9664, 0x9055, 0x96d4, + 0x977c, 0x964d, 0x97e1, 0x9a48, 0x9a49, 0xfe7d, 0x90aa, 0x9a50, + 0x9347, 0x8ed8, 0x90c9, 0x9a55, 0x90bc, 0x9a58, 0x8bb8, 0x90d5, + 0x9641, 0x9a5a, 0x9a5c, 0x97c2, 0x8abb, 0x9baa, 0x90f5, 0x9a60, + 0x9145, 0x9a63, 0x8bb6, 0xfccf, 0x966b, 0x9a6e, 0x914f, 0x9746, + 0xa0e6, 0x92d7, 0x9675, 0x93d4, 0x91bb, 0x9679, 0x9a70, 0x9678, + 0x91cd, 0x9c4a, 0xa06f, 0xa06a, 0x915f, 0x9fa5, 0x89ba, 0x9ecd, + 0x9a79, 0x9dce, 0x9d73, 0x96b9, 0x96bc, 0x9cd1, 0x89b7, 0x9eee, + 0xfb43, 0x9ec9, 0xfbd3, 0x91ae, 0x9d78, 0x9d7b, 0x9eb3, 0x9eb2, + 0x9dd6, 0x994f, 0x89ce, 0x8bc0, 0x9fc4, 0x8bd4, 0xc6bf, 0x8bf9, + 0x8946, 0xc6c0, 0xfae5, 0xc87b, 0x8bc6, 0x9c57, 0x9afb, 0x89d0, + 0x89cf, 0xc6c1, 0x89d1, 0x89e2, 0x927e, 0x9dba, 0xc6c2, 0xfbf8, + 0x8bc7, 0x926b, 0x89d2, 0x9fcf, 0x9da9, 0x89d3, 0x99e2, 0x9267, + 0x92a4, 0x894e, 0x894f, 0x9278, 0x91b6, 0x89d4, 0x9fd2, 0x92a7, + 0x95a2, 0x926e, 0x96ea, 0x926f, 0x92a3, 0x8950, 0xfa57, 0x9866, + 0x89d6, 0x98b2, 0x92ab, 0x96de, 0x92ac, 0x9f6e, 0x8ef2, 0x9f6c, + 0x89d8, 0xfa59, 0x92a8, 0x9163, 0x9f73, 0x92ad, 0x9be9, 0x92a9, + 0x92aa, 0x89d9, 0xfd56, 0x9fa8, 0x92a1, 0x90e3, 0xa0a6, 0x94ab, + 0xfc72, 0x97c4, 0x92ae, 0xfa67, 0x92a2, 0xfa69, 0x9268, 0x8951, + 0xfa6f, 0xfa71, 0x8952, 0x945a, 0xc6c3, 0x89dd, 0xc8a2, 0xc6c4, + 0x9e52, 0x8953, 0x9e55, 0x92ba, 0xc6c5, 0xfa7d, 0xfaa8, 0x9a68, + 0xfa47, 0xfa7e, 0x92bb, 0xfdb6, 0xfaa2, 0xfaa3, 0xfaa4, 0x9bb4, + 0xfaa6, 0x89df, 0xfddb, 0xfaa9, 0x8954, 0xfaab, 0xfc7a, 0x89e0, + 0x9f4f, 0xc87d, 0x89e1, 0xfab0, 0x9fcd, 0xa0e7, 0xfab1, 0x89a6, + 0x9efa, 0xfab2, 0xfab4, 0x92c4, 0x9f6f, 0x8bb0, 0x9fac, 0x89e3, + 0x9bd3, 0x89e4, 0xfab5, 0x9fd5, 0x8955, 0x92c5, 0x8956, 0xfab3, + 0xfab6, 0xfab7, 0x9edc, 0xfbc4, 0x9f71, 0xfaba, 0x92c7, 0xc6c6, + 0x9a4c, 0x89e5, 0x9f7d, 0xa0a9, 0xfac4, 0xc6c7, 0x8957, 0xfaaa, + 0x8958, 0x8be3, 0x8b61, 0x9af1, 0x9eb7, 0xc6c8, 0xfad1, 0xfad2, + 0x9eba, 0xfad4, 0xfad9, 0xfadb, 0x9ce0, 0xfbf7, 0xfbfa, 0x89e7, + 0xa07a, 0xfadc, 0xfadd, 0x89e9, 0xc6c9, 0xfae2, 0x89eb, 0xfae3, + 0x90c8, 0x92da, 0x8959, 0x9cf5, 0x895a, 0xfae7, 0x9fa2, 0xfaea, + 0xfaed, 0x8fad, 0xfb59, 0xfaef, 0x96ef, 0x9dec, 0x9dca, 0xfd6d, + 0x89ec, 0xfb44, 0x9de2, 0x9ec0, 0x9e56, 0x9f79, 0x9ac7, 0xfaf4, + 0x98a1, 0xfaf8, 0x89f0, 0x9e47, 0x9df7, 0x9fd3, 0x9aca, 0x89f1, + 0xfaf9, 0x8e5a, 0x89f2, 0x89f3, 0x925d, 0x8b51, 0x92e0, 0x89f4, + 0x9fd4, 0x8a79, 0x89f5, 0x97a7, 0x93ba, 0x9e58, 0x89f6, 0x9e57, + 0x89f7, 0x8a41, 0x89f8, 0xfaf1, 0x89fa, 0xfb42, 0xfabf, 0xfba3, + 0xfaf7, 0x9e4e, 0x94dc, 0x95da, 0x9df8, 0x9f6a, 0x8ab7, 0xfb46, + 0x8a46, 0xfb47, 0x9148, 0x92de, 0x8b53, 0x9df6, 0x9bda, 0x9d7e, + 0x89fd, 0x99e4, 0x9e43, 0x9de9, 0x8f52, 0x9df5, 0x9df0, 0x99e7, + 0x8bbd, 0x9def, 0x9fb7, 0x9dd0, 0x9feb, 0x8da9, 0x9dcf, 0x98e1, + 0x9de5, 0x9dc8, 0xfb4f, 0x9deb, 0xfb54, 0xfb55, 0x9aa2, 0x8ad6, + 0x9a5f, 0x9ef5, 0x8fb7, 0x9ad2, 0x9e6a, 0x9ee8, 0x8bbf, 0x91c2, + 0x9d62, 0x9260, 0x925e, 0x91c1, 0x8ac5, 0x97a3, 0x8b6c, 0x8d7e, + 0x9c54, 0x9dbd, 0x9cc5, 0x895b, 0xfb5c, 0xfb5b, 0xfb57, 0x98c7, + 0xfb5a, 0x9cee, 0x92e2, 0x94a7, 0x9bd4, 0xfb64, 0xfb76, 0xfb60, + 0x99e5, 0x9ac2, 0x91fb, 0xa073, 0x9f72, 0x9fcc, 0x98a5, 0x92e8, + 0x9bbc, 0x96f3, 0x92e7, 0xfc67, 0x8b7d, 0x9bf4, 0x9ef7, 0x9ec1, + 0x996f, 0x96f1, 0x8e41, 0x954a, 0x97e6, 0x96f5, 0x92e6, 0x9f42, + 0xfb67, 0x99a9, 0xfae6, 0xfb69, 0x97e5, 0x967d, 0xfb6c, 0x99a2, + 0x9abb, 0x9a65, 0x944e, 0xfb6e, 0x99df, 0x98e3, 0x9254, 0x967b, + 0x8aaf, 0x8baf, 0x9ebd, 0x9ee6, 0xfb6f, 0x8ee1, 0x9b7d, 0x9c7e, + 0xf9d9, 0x92ea, 0xfb72, 0xfb71, 0x895c, 0x98f0, 0x96f2, 0xfb74, + 0x8bc1, 0x895d, 0x89de, 0x895e, 0xc6ca, 0xfe42, 0xfb7b, 0x895f, + 0x8960, 0x9bcd, 0x9dd3, 0x984c, 0x9752, 0x95c3, 0x9bb6, 0x9ab9, + 0x97b3, 0x9f74, 0x92f1, 0x97df, 0xfba6, 0xfbab, 0x9877, 0x9854, + 0x95c5, 0x9d55, 0xfbb2, 0x957e, 0x9742, 0x94e6, 0x92f5, 0x92fd, + 0xfba2, 0x9c51, 0x94e9, 0x985c, 0x92f0, 0x944c, 0x916b, 0x8b78, + 0x94e2, 0x984f, 0xfbb5, 0x9271, 0x9365, 0x985b, 0x9850, 0x97bc, + 0x92f3, 0x9340, 0x984d, 0x9572, 0xfdef, 0xfdc1, 0xfbba, 0x92eb, + 0xfc73, 0x97b7, 0xfbb4, 0x90a7, 0x9741, 0x92f4, 0xfbbc, 0x9577, + 0x9ee2, 0x8f78, 0xf9dc, 0x9672, 0x9eb5, 0x964b, 0xa0fa, 0x9575, + 0x90da, 0x9367, 0xfea4, 0x90df, 0x9354, 0x8961, 0x8bb4, 0x9dc0, + 0x8e48, 0xfbc5, 0xfbc7, 0xc6cb, 0xfa79, 0x9e67, 0xfbd2, 0x8962, + 0x8963, 0xfc7d, 0x9f6b, 0xfbcc, 0xfeae, 0xfbd1, 0xfb75, 0xfbd4, + 0xfbd6, 0xfbd8, 0x8b5d, 0x934c, 0x9ae2, 0x8bc9, 0xfbdb, 0x9fc9, + 0x9f44, 0x98ed, 0xfbdd, 0x8df2, 0x8964, 0xfdf2, 0x934d, 0xfbe7, + 0xa0f2, 0x9868, 0x9f58, 0x8d73, 0xfbde, 0xfbdf, 0xfbe3, 0x8da8, + 0xfbe4, 0x9c75, 0x9878, 0x8d60, 0xfbe5, 0x8d61, 0x8d62, 0xa0a1, + 0x9c40, 0x98ad, 0x9eea, 0x9ceb, 0xfbe0, 0x9f51, 0x8d65, 0x9cf1, + 0xfc58, 0x8d66, 0x9654, 0xfbe8, 0xc6cc, 0x9fce, 0xfbfc, 0x9ae4, + 0x9f75, 0xfbf1, 0x8d69, 0x934f, 0x934e, 0xfbf4, 0xc6ce, 0xfbc3, + 0x8965, 0x8d6a, 0x9353, 0x9dfb, 0xfbfd, 0x9059, 0xfc40, 0xfc41, + 0xfc43, 0x9361, 0xfc46, 0x9362, 0x8d6b, 0xfc4c, 0x95b8, 0xc6d0, + 0x8bca, 0x987a, 0xc6d1, 0xfc51, 0xfc54, 0xfaaf, 0x8d6c, 0xfa61, + 0xfc57, 0x9b70, 0xa051, 0x8bcb, 0x936e, 0xfcd5, 0xfca9, 0xfc61, + 0x8966, 0xfacb, 0xf9da, 0x937a, 0xa0e0, 0x936b, 0xfc6b, 0xa0dc, + 0x9468, 0xfc6d, 0x8d71, 0xfd64, 0x99ba, 0x9ad0, 0x9a61, 0xa0e5, + 0xa05b, 0x96ac, 0x9740, 0x9ef1, 0x9f7e, 0x8d72, 0xfc76, 0x96a9, + 0xa06e, 0xfcaa, 0xfbcd, 0xfc74, 0xa074, 0xa071, 0xfc79, 0xfc7c, + 0x9c50, 0x9379, 0x9378, 0xa0dd, 0x8d75, 0x8d76, 0x9374, 0x8d77, + 0xfca5, 0xfca2, 0x90c3, 0xa079, 0x8d79, 0x8bfc, 0xa076, 0x8bcd, + 0x9f5a, 0x9ff4, 0x9fba, 0x8d7a, 0x9e45, 0x93b0, 0xa075, 0x9b46, + 0xfcae, 0xfcb0, 0xfa51, 0x8d7b, 0x8d7c, 0x9ed6, 0x93ac, 0x9f5b, + 0x93a9, 0xa07c, 0xfcb2, 0x8ac1, 0x9fb4, 0xfcac, 0x9e4c, 0x8fc5, + 0x93ad, 0x9dc3, 0x8da2, 0x9d4a, 0xfcb6, 0x8da3, 0x9e4b, 0x9e4d, + 0x8da4, 0x8afd, 0xfcb5, 0xfcc3, 0x93b2, 0x8da5, 0x93a1, 0x8ac6, + 0x8a5b, 0x894d, 0xfed4, 0x8a78, 0x93ab, 0x8da7, 0x9f45, 0x8a56, + 0xfcbf, 0xfcc0, 0x8ee6, 0x8aa4, 0x8943, 0x93f3, 0xfcab, 0x9ea2, + 0x9dc7, 0xc6d2, 0x8bce, 0xfcc5, 0xfccb, 0x93b3, 0xfcca, 0xfcc9, + 0x8dac, 0xfbc6, 0x8967, 0xfccd, 0x9cf3, 0xfcd0, 0x95bb, 0xfcd3, + 0xfcd4, 0x8dae, 0xfcd7, 0x93db, 0xfe63, 0x93d5, 0xfcda, 0x9b71, + 0xfcdd, 0x8daf, 0xfaf2, 0x93d8, 0xfcdf, 0x93d3, 0xfce1, 0x8e76, + 0xfc62, 0x93d1, 0x8db1, 0x9859, 0xfb52, 0xfb53, 0xfb4d, 0x9cbf, + 0x9b72, 0xfb50, 0x93be, 0x9df1, 0xfceb, 0xa0bb, 0x9b7e, 0x8db3, + 0x9ae8, 0x8edc, 0x9cf9, 0xfa50, 0x98e7, 0xfcf3, 0xfcf2, 0x93e5, + 0x9a59, 0x8db5, 0xfd4d, 0xfd5e, 0x8f7d, 0x9547, 0xfcf6, 0x9250, + 0x8968, 0x8db6, 0xfcfb, 0xa07d, 0x98fc, 0x8969, 0xfe4f, 0x9256, + 0xfac9, 0x93e8, 0xfcf8, 0x9ce3, 0xfda9, 0xfc44, 0x9640, 0x8db8, + 0x9b4a, 0x8fb9, 0xfcfe, 0x896a, 0x8db9, 0x917e, 0x93f4, 0xfb7c, + 0x93e7, 0x97ef, 0xfe4a, 0xfd45, 0x96a5, 0xfee0, 0xfd48, 0xfd47, + 0xfef2, 0xfe6a, 0x8dbd, 0x9ba1, 0x9ab7, 0x8efc, 0x9fa1, 0xfd51, + 0xfaad, 0x8dbe, 0x89a4, 0x9ad9, 0xfd4e, 0x8dc0, 0x97f0, 0x93b4, + 0xfd44, 0x9fa7, 0x8dc2, 0x99b6, 0xfd52, 0x8dc1, 0x8e46, 0xa0d1, + 0x9fca, 0x92cf, 0x9cf4, 0x8dc4, 0xfd41, 0x9b4c, 0xfd57, 0xfcef, + 0x9cde, 0xfd42, 0x986c, 0x97f9, 0x9558, 0x985e, 0xfe7b, 0x94cd, + 0x93ee, 0xfd5a, 0x93f5, 0x93ef, 0x8eea, 0x8f5b, 0x8dc6, 0x8dc8, + 0x8dc7, 0x93f7, 0x8dc9, 0xfbf2, 0x9670, 0x8dcb, 0xfd5c, 0x8f65, + 0x8dcd, 0x9da8, 0x94f9, 0x8dce, 0x93ea, 0xfd5f, 0x93f0, 0x9fb6, + 0x8dcf, 0x9763, 0x8dd0, 0x93f1, 0xfd62, 0xfd65, 0x9fdb, 0x93f8, + 0x8bf7, 0xfd66, 0x8bcf, 0x8dd1, 0x8dd2, 0xfd71, 0xfd6f, 0x8dd3, + 0x9fe7, 0x90bd, 0x9fd0, 0x8bd0, 0xfd72, 0x9cae, 0x8bd1, 0x8adb, + 0xfae4, 0x95ce, 0xfd76, 0xfb62, 0x8dd4, 0xfd78, 0x8ee3, 0x9076, + 0x98c6, 0x8dd5, 0x97d1, 0x9eb6, 0xfac7, 0xa042, 0x9873, 0x9ffc, + 0x8dd7, 0x92fb, 0x8dd8, 0x944f, 0x8dd9, 0x896b, 0x97ce, 0xfaf3, + 0xfdae, 0xfbaf, 0x92b7, 0x8dda, 0x9c5a, 0xfdad, 0x8ddc, 0x9444, + 0x8ddd, 0xa0d6, 0x97d5, 0x944a, 0x944d, 0x97cb, 0x8dde, 0x8ddf, + 0x8de0, 0xfef9, 0xfdc0, 0xfcf9, 0xfb7e, 0x92b3, 0xfdaf, 0x8de1, + 0x95d3, 0x89c1, 0xfd68, 0x9cb7, 0x8de3, 0xfac0, 0x8de5, 0xfa64, + 0x8947, 0x8de4, 0x8de7, 0x8de8, 0xfdc7, 0xfdb0, 0x9445, 0x97d6, + 0xfcc6, 0x9844, 0x8de9, 0x8dea, 0xfe50, 0xfdcc, 0x9da7, 0xfdcd, + 0xfdcf, 0x95d2, 0x8ded, 0xfcba, 0xfdc5, 0xfdd2, 0x9cdc, 0x95cf, + 0x8dee, 0xfdd4, 0x96ec, 0x96eb, 0x90b6, 0xfdc3, 0x98ab, 0x96ee, + 0x8df4, 0xfde0, 0x8df6, 0x8df7, 0x8ffa, 0x97d0, 0x8bd2, 0x8df8, + 0x90d9, 0xfaf0, 0xfde1, 0x8df9, 0xfde3, 0x8dfa, 0xfb63, 0x90a6, + 0x9970, 0x91eb, 0x9770, 0x986f, 0xfde2, 0x98f2, 0x9afc, 0x896c, + 0xfdfd, 0x995e, 0x95bd, 0xfde4, 0x91e6, 0xfde5, 0xfde6, 0xfde7, + 0x9454, 0x99b8, 0x97e9, 0x9346, 0x9863, 0x95bc, 0xfded, 0xfdf7, + 0x9870, 0x96f6, 0x8ea9, 0x9451, 0x8e43, 0x8b5a, 0xfdee, 0xfdf0, + 0xfdf4, 0x9bf5, 0x977e, 0x9bd5, 0x9ac3, 0x97c8, 0xa0db, 0x91d0, + 0x9fe4, 0x8fdd, 0x91e9, 0x98e0, 0x92ca, 0x9857, 0xfdeb, 0x9b49, + 0x9d76, 0x9eaf, 0x9ccc, 0xfdea, 0x8df1, 0xfdfb, 0x8e53, 0xfacf, + 0x96f9, 0x98bf, 0x9e49, 0x9bca, 0xfdfe, 0x92dc, 0xfe41, 0x91cc, + 0x91e2, 0xfe44, 0x8bd3, 0xfe47, 0xfe48, 0x9455, 0xfe4b, 0xfe4c, + 0x8dbf, 0x9e78, 0xfe51, 0x9456, 0x9d61, 0x9457, 0x9966, 0x8bd5, + 0xa069, 0x98b4, 0xa049, 0xa04c, 0x9e65, 0x98b5, 0xfe58, 0x9975, + 0xfe53, 0xa065, 0xfe59, 0x98b7, 0x98b8, 0x98ba, 0x98bb, 0x9fbc, + 0xa04a, 0x9ec7, 0x98ae, 0x92d6, 0xfae1, 0x91d4, 0xfade, 0xfe5b, + 0xfe5e, 0xfbd7, 0xfe5a, 0x94c5, 0xfaca, 0x98c1, 0x975c, 0xfe74, + 0x9773, 0xfa46, 0x9764, 0xfe68, 0x964e, 0x9765, 0x89a1, 0x95fa, + 0x92d4, 0xfe69, 0xfb45, 0x98c8, 0x90ef, 0x98c9, 0x98ca, 0x946d, + 0x94b7, 0xfe6c, 0x946b, 0x92fc, 0x95eb, 0xfe73, 0x976e, 0xfe5f, + 0xfdbd, 0x92d5, 0xfeb9, 0xfe71, 0xfbbb, 0x947a, 0x95fb, 0xfe77, + 0xfe79, 0xfe75, 0x945d, 0xfe7c, 0x9344, 0x8ea6, 0x92d3, 0x94b8, + 0xfc71, 0x975e, 0xfea7, 0x946a, 0x93e3, 0x98cf, 0xa0d9, 0xa0bf, + 0xa04d, 0xa0b8, 0xa0ce, 0xa0b7, 0xfea9, 0x89c3, 0xfeab, 0x9df4, + 0x896d, 0x9c7b, 0x98d2, 0x9fa9, 0xfeb2, 0xfeb1, 0x97d9, 0xa0c4, + 0x9476, 0x9978, 0xfeb3, 0x98d3, 0xfeb4, 0x98d4, 0x9fb9, 0x9471, + 0x98d5, 0xfeb8, 0xc6d4, 0xfeba, 0x9e5c, 0xfebb, 0xa044, 0x98d7, + 0x98d8, 0xfebc, 0x9ffe, 0xfebd, 0x9ddd, 0x9ee1, 0x98da, 0x9ddf, + 0xfebf, 0xfebe, 0x9eeb, 0x9e59, 0xa05c, 0xfec0, 0x9477, 0x98dc, + 0xfec1, 0x98de, 0xfec3, 0xfec8, 0xfec9, 0xfeca, 0xfecb, 0x9fc2, + 0x98c4, 0x94b0, 0x94b1, 0xfed1, 0xa0c1, 0xfed2, 0xa0cd, 0xfed3, + 0x98e5, 0xfed6, 0x91e4, 0x8fc7, 0x94ae, 0x8a4f, 0x94b2, 0x8fd4, + 0x98ea, 0xfed8, 0x9de0, 0x98ee, 0x95c4, 0xfce8, 0x98ef, 0xfad8, + 0xfedc, 0xa0ae, 0x9d4c, 0x98f1, 0x98f3, 0x94c1, 0x98f5, 0xfa4f, + 0x96e2, 0x9450, 0x96a2, 0x98f6, 0x96e5, 0x98f7, 0xa046, 0x96e3, + 0x98f8, 0x9ee4, 0xf9d6, 0x94c3, 0x94c2, 0xfee1, 0xfee9, 0x96e4, + 0x89ac, 0x96db, 0xfee2, 0x94c4, 0xfee3, 0xfee7, 0x9ffb, 0x93c9, + 0x94e8, 0xfb56, 0x90c5, 0xa0a8, 0xfee5, 0x98fd, 0x98fb, 0xfee8, + 0x8ebf, 0x8bd8, 0xfef7, 0x8f68, 0x94c6, 0x9dea, 0xfc69, 0x9cda, + 0xfef3, 0x9c72, 0xfef0, 0x89c9, 0x9941, 0x9942, 0xfef5, 0x91d7, + 0x94cc, 0xfef8, 0x97a8, 0xfefc, 0xfdbf, 0xfefe, 0x96d1, 0x94d5, + 0x94d0, 0x9944, 0xa0b3, 0x94cf, 0x9ffa, 0x91e5, 0x9c6a, 0x8e49, + 0x8e4c, 0x8e4d, 0x9a73, 0x9947, 0x8e50, 0x8e4f, 0x9949, 0x8e51, + 0x8e52, 0x9ab2, 0x89a5, 0x994c, 0x9ff8, 0x8e56, 0x994d, 0x91ca, + 0x8e57, 0x94e1, 0x9047, 0x8fd8, 0x8e58, 0x94eb, 0x8e5c, 0x9553, + 0x9fe5, 0x9f56, 0x954f, 0x8e5e, 0x996a, 0x9c64, 0x9cd9, 0x8e5d, + 0x9950, 0x9951, 0x8e62, 0x9952, 0x8e68, 0x8e61, 0x9f59, 0x8bb3, + 0x9f5d, 0x8e66, 0x8e6e, 0x9f64, 0x9953, 0xfab8, 0x9954, 0x8e70, + 0x9f61, 0x8e72, 0xa06b, 0x9f40, 0x94ed, 0x94ee, 0x9fbd, 0x8e7b, + 0x9957, 0x94f7, 0x9f5f, 0x8e73, 0x9f62, 0x94f6, 0x9958, 0x8e75, + 0xf9db, 0x9072, 0x94f8, 0x995a, 0xa0b0, 0x8e79, 0x8e78, 0x94f3, + 0x98af, 0xa0b2, 0x8e7a, 0x995c, 0x8e7c, 0x8e7d, 0x8bd9, 0x89a2, + 0x9ed7, 0xa0b6, 0x9e42, 0x8ea4, 0x8ea7, 0x9542, 0x987d, 0x9755, + 0x8ea8, 0x8eaa, 0x89a3, 0x9960, 0x9962, 0x94fc, 0x9961, 0x94fa, + 0x8eae, 0x8eb2, 0x8eb0, 0x9963, 0x97aa, 0x94fb, 0x8ebb, 0x9876, + 0x8ea1, 0x8eb7, 0x9da6, 0x9eb0, 0x8eb8, 0x9d70, 0x896e, 0x896f, + 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8ebc, 0x8ebd, + 0x8ebe, 0x9dd1, 0x94fd, 0x8bd7, 0x8bda, 0xa0e2, 0x9fe9, 0xfda8, + 0x8ae7, 0x8ec2, 0x8ec4, 0x9964, 0x9965, 0x954e, 0x98b3, 0x8ecb, + 0x8bdf, 0x8ece, 0x8ecf, 0x9968, 0x9969, 0x996b, 0x8ed1, 0x996c, + 0x8ed4, 0x8ed5, 0x996d, 0xa0be, 0x8ed6, 0xa0bc, 0xa0b5, 0xa0b4, + 0x8be0, 0x89b5, 0x8edd, 0x9e5d, 0x9971, 0x89ae, 0x9de8, 0x9565, + 0x9972, 0x8b5c, 0x89b1, 0xa0c0, 0x8edf, 0x9566, 0x9974, 0x9976, + 0x9977, 0x9979, 0x9dda, 0x8ee0, 0x935c, 0x9de6, 0x8b5f, 0x9563, + 0x9567, 0x9de3, 0x997c, 0x997d, 0x997e, 0x8b5b, 0x99a3, 0x99a4, + 0x99a6, 0x99a8, 0x8abe, 0x9e61, 0x99aa, 0xa0c8, 0x99ab, 0xfec4, + 0x98c2, 0x8ee8, 0xa0ba, 0xfd77, 0x8eee, 0x9ebf, 0x89c2, 0x99ac, + 0x956b, 0x956c, 0x99af, 0x994a, 0x8976, 0x8f48, 0xfbee, 0x99ae, + 0x8efb, 0x8b52, 0x99b0, 0x8977, 0x8f41, 0x99b1, 0x8f49, 0xfa4d, + 0x9de4, 0xfbe9, 0x9b54, 0x99b2, 0x9e68, 0x8f4a, 0x8f42, 0x8f51, + 0x9846, 0x99b4, 0x8ef5, 0xfd55, 0x9ccd, 0x8978, 0x8f53, 0x8f6f, + 0x8e63, 0x8f56, 0xfe76, 0x9fc6, 0xfaac, 0x8f58, 0x9848, 0x99b7, + 0x9665, 0xfa6c, 0x9de7, 0x9e62, 0x96cc, 0x8e67, 0xfc75, 0x987e, + 0xfdb9, 0x97fc, 0x98f9, 0x8f66, 0x956e, 0x9245, 0x8f60, 0x9ed1, + 0xfecd, 0x99b9, 0x8f62, 0x974c, 0x91c7, 0x955f, 0x99bb, 0x8e6d, + 0x8f71, 0x94cb, 0x95b1, 0x9af2, 0x96c3, 0x99bd, 0xa0cf, 0x8f6d, + 0x99be, 0x8ef4, 0x8f72, 0x95e4, 0x99bf, 0x9242, 0xfba5, 0x99c0, + 0xfdb4, 0x8f77, 0x99c1, 0xfab9, 0x8f40, 0xfa44, 0x99c2, 0x8f5c, + 0x99c4, 0x99c5, 0x8f7b, 0x8fa3, 0x99c6, 0x96cd, 0x96c7, 0x8fa5, + 0xfabb, 0x9570, 0x9368, 0x8f7e, 0x8faa, 0xa050, 0x90d3, 0x9556, + 0x8fb8, 0x99c8, 0x8faf, 0x99c9, 0x9579, 0x9f49, 0x99ca, 0x99cb, + 0x9dd5, 0x8fb0, 0xfa7a, 0x9e5f, 0x99cd, 0xa0c9, 0x9adb, 0xa0c6, + 0x8fb4, 0xa0d7, 0xa0c7, 0xa043, 0x8fb5, 0x8fb2, 0xa061, 0x9e5e, + 0x8fb6, 0x9fe8, 0x9cb2, 0x957c, 0x9fc7, 0x8fbb, 0x8fbc, 0x8fec, + 0x8fc0, 0x936a, 0x8be4, 0x9c7c, 0x95a1, 0xfeec, 0x95a3, 0x8fc1, + 0xa052, 0x99d0, 0x8fc3, 0x8fc4, 0x95a4, 0x8fc6, 0x9e60, 0xf9d8, + 0x95a5, 0x9cb3, 0x99d1, 0xfef1, 0x99d2, 0x9cc2, 0x99d3, 0x95a7, + 0x95a9, 0x95a6, 0x9c5d, 0x98e2, 0x8fc9, 0xa0c2, 0x8fca, 0x99d4, + 0xa0b9, 0x9b58, 0x8fcd, 0xa0d4, 0x8fce, 0x8be5, 0x8979, 0x8fd0, + 0x95b6, 0x99d6, 0x95e5, 0x99d7, 0x95b5, 0xa0ca, 0x9ffd, 0xa058, + 0x8fd6, 0x99d8, 0x8fd3, 0x8fe5, 0x8fe9, 0x99d9, 0x927c, 0x9c45, + 0x8fde, 0x8fdf, 0xa04b, 0x8fe2, 0xa0cc, 0x8fe3, 0x8fe4, 0x9bc4, + 0x9bfc, 0x964c, 0x9af6, 0x8fe7, 0x8fe8, 0x8be7, 0x897a, 0x897b, + 0x99da, 0x8fed, 0x95c0, 0xa0cb, 0x9e48, 0x99db, 0x8ff3, 0x8ff9, + 0x95c1, 0xa04e, 0x99dc, 0xa064, 0x8ff7, 0x89b0, 0xa048, 0x8ffb, + 0x8ff6, 0x9ddc, 0x99dd, 0x8be8, 0x92c1, 0x9fd6, 0xa0d2, 0x9040, + 0x8ac4, 0x99e0, 0x9ff0, 0x9ff3, 0x9dbf, 0x9ff6, 0x95c8, 0x9e5a, + 0x99e3, 0x8a4a, 0x9ff1, 0x8aa7, 0x99e6, 0x9ff7, 0x9fed, 0x8a5c, + 0x9dae, 0x95c9, 0x9048, 0x99e8, 0x9049, 0x90b1, 0x904a, 0x99ea, + 0x9bd1, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x904c, 0x904d, 0x95cb, + 0x97e2, 0x95cc, 0x9f78, 0x897c, 0x897d, 0x897e, 0x995d, 0x9b5a, + 0x9050, 0x9054, 0xc6d6, 0x9aa8, 0x99ef, 0xfeeb, 0x9da3, 0x9da1, + 0x9943, 0x9945, 0x9d7d, 0x99f0, 0x99f1, 0x99f2, 0x9d60, 0xa0a3, + 0x905b, 0x9edb, 0x9d79, 0x99f3, 0x9062, 0x9f55, 0x9bf9, 0x9065, + 0x96e0, 0x98be, 0x9068, 0x906c, 0x95d8, 0x906a, 0x9fb2, 0x9fae, + 0x9fb0, 0x89ad, 0x906e, 0x9e71, 0x9e4a, 0x9fdc, 0x89ab, 0x9fb8, + 0x9070, 0x8b63, 0x95dc, 0x9071, 0xfc5e, 0x8949, 0x965b, 0x94a6, + 0x8fd5, 0x9e73, 0x9075, 0x99f7, 0x99f9, 0x9663, 0x95b9, 0x94d4, + 0xfcfa, 0x9077, 0x90ab, 0x9d4d, 0x99fa, 0x92e3, 0x97bb, 0x9078, + 0x99fb, 0x97e0, 0x96dc, 0x9ca8, 0x9772, 0x9440, 0x92f2, 0x99fd, + 0x99fc, 0xf9d7, 0x964a, 0x96d8, 0x99fe, 0x904b, 0xfa41, 0x9a40, + 0x975b, 0x9a41, 0x91dd, 0x93fc, 0x9a42, 0x9a43, 0x9659, 0x9a44, + 0x9051, 0x94bf, 0x90a2, 0x9cab, 0x9776, 0xfc55, 0xfe45, 0x94a8, + 0x9a45, 0xfa4b, 0x9de1, 0x96d9, 0x9774, 0xfdf5, 0x92e5, 0x9645, + 0x91da, 0x90a3, 0xa05f, 0x90af, 0x97bf, 0x914c, 0x967a, 0x91de, + 0x9a46, 0xfeb0, 0x9779, 0x946c, 0x9858, 0x9266, 0x93fb, 0x9a47, + 0x9749, 0x9748, 0x934a, 0x9ce2, 0x9264, 0x91df, 0xfb79, 0x96d7, + 0x9343, 0xfdcb, 0xfe7a, 0x91db, 0x97af, 0x95dd, 0x9348, 0x9a4b, + 0xfc45, 0x9a4d, 0x91bc, 0x90e2, 0x90b4, 0x95e1, 0x9a4e, 0x9a4f, + 0xfe40, 0xfe43, 0x96dd, 0x9a51, 0x96a7, 0x90b0, 0x9c4e, 0x9443, + 0x8eba, 0x9a52, 0xfcc1, 0x8be9, 0x9caf, 0x8bfd, 0x9abc, 0x9ab8, + 0x9aae, 0x9aa7, 0x9a53, 0x9d74, 0x8bea, 0x8beb, 0x90b2, 0x95e9, + 0x95e8, 0x95e6, 0x90b5, 0x9a54, 0x90b3, 0x95e7, 0x8b50, 0x8bec, + 0x9a56, 0x8bfb, 0x9a57, 0xa0aa, 0x9fa6, 0x99cc, 0x9c59, 0x99b5, + 0x90be, 0x9faf, 0x95f2, 0x90bf, 0x90c1, 0xfee4, 0x90c4, 0x90c7, + 0x92e4, 0x9f52, 0x90db, 0xa066, 0x90d2, 0x90d4, 0x9a5b, 0x95fd, + 0x8bc4, 0x90de, 0x9ce4, 0x90e1, 0x9e46, 0x9651, 0xfb58, 0x90e6, + 0x9650, 0x90e7, 0x90e8, 0x9a5d, 0x9f7a, 0x9b5c, 0x9f7c, 0xfc52, + 0x90e9, 0x90ea, 0x9a5e, 0x9f76, 0x90eb, 0x90ec, 0x8bee, 0x90ee, + 0x91c6, 0x90f2, 0xfcbc, 0x8a74, 0x9657, 0x9cef, 0x9fdf, 0x90f7, + 0x90f6, 0x9b5e, 0x90f8, 0x90f9, 0xfa6a, 0x8bef, 0x9fe0, 0x9142, + 0x9a62, 0x9569, 0x9144, 0x9143, 0x9141, 0x8bf0, 0x9660, 0x8bf1, + 0x99f6, 0x9149, 0x914a, 0x914b, 0x9a64, 0x8abf, 0x9a66, 0x9a67, + 0x9a69, 0x9a6a, 0x9652, 0x914d, 0x9666, 0x9f7b, 0x9a6b, 0xa06c, + 0x9667, 0x9a6c, 0x9a6d, 0x8bf2, 0x966a, 0xfcea, 0x966c, 0x91c4, + 0x9677, 0x99f4, 0x9a6f, 0x9fab, 0x8ec1, 0x9555, 0x9152, 0x9153, + 0x9155, 0x955d, 0x9671, 0x9c6d, 0x9673, 0x9154, 0x9a71, 0x9156, + 0x966d, 0x9557, 0x89c6, 0x89c7, 0x8a6a, 0x8b57, 0x9fe1, 0x9b5f, + 0xa05d, 0x915b, 0x915c, 0x915e, 0x9f5c, 0x9f57, 0x9f65, 0x9a72, + 0x9160, 0x9f5e, 0x9161, 0x9164, 0x9f41, 0x9169, 0x9168, 0x9a74, + 0x96b2, 0x9a75, 0xfda5, 0x9ee9, 0x8bba, 0x916d, 0xa060, 0x9fde, + 0x9fc3, 0x96b5, 0xa067, 0x96b3, 0x9a76, 0x95d5, 0x9eca, 0x9a77, + 0x9a78, 0x9170, 0x916f, 0x9fa3, 0x9171, 0x96b1, 0x9f63, 0x9f67, + 0x8bb9, 0x9a7a, 0x8b56, 0x9ada, 0x96b0, 0x9a7e, 0x9dde, 0x96ad, + 0x96ae, 0x9ea1, 0x9e50, 0x96af, 0x8bf4, 0x9fa4, 0x96bd, 0x96f4, + 0x96b8, 0xfaa1, 0x91a7, 0xa05e, 0x9a7d, 0x8948, 0x9eb1, 0x9ddb, + 0x95bf, 0x8a73, 0x9efe, 0x917a, 0x917b, 0x9aa3, 0x96c2, 0x9f77, + 0x9aa4, 0x9aa5, 0x91a1, 0x89b8, 0x9173, 0x9aa6, 0x89bd, 0x89b9, + 0x917d, 0x96bb, 0x9ff2, 0x8bf5, 0x9aa9, 0x9f54, 0x9fe3, 0x9eed, + 0x91aa, 0x91ab, 0xa070, 0x9f6d, 0x91ac, 0x91ad, 0xa0fd, 0x9fe2, + 0x91af, 0x9e41, 0x9aaa, 0x91b0, 0x9aab, 0x9aac, 0x9a4a, 0x91b2, + 0x8bf6, 0x9aad, 0x89b6, 0x9aaf, 0x9ab0, 0x9ab1, 0x9aa1, 0x91b9, + 0x91ba, 0x91be, 0xa041, 0x8bb7, 0x91c0, 0x9ab3, 0x91c3, 0xa0fc, + 0x9fee, 0x9f69, 0x91c8, 0x91c9, 0x8de6, 0x91cb, 0x89c8, 0x8daa, + 0x9fdd, 0xc8a1, 0xc8a3, 0x8bf8, 0xc8d0, 0xc8cf, 0xc6e4, 0xc6e5, + 0xc8cd, 0xc8ce, 0xf9fe, 0x9c71, 0x9375, 0x9376, 0x9548, 0x8ec6, + 0x8bc5, 0x8bfa, 0xc87c, 0x9ab4, 0x884e, 0x884b, 0xc87a, 0x8848, + 0x8847, 0xa0f6, 0x8845, 0x8853, 0xfcad, 0x8aad, 0x9272, 0xfc47, + 0x94df, 0x9fd1, 0xfbcb, 0x927d, 0x98a4, 0x94e7, 0x90cb, 0x927b, + 0x94d8, 0xfc5f, 0xfa54, 0x9ab5, 0x96da, 0x9279, 0xfa74, 0x9275, + 0x8dfb, 0x8a49, 0x92df, 0x9b7c, 0xfa63, 0xfa60, 0x926d, 0xfa62, + 0x9ab6, 0x976b, 0xfd6a, 0xfd54, 0x9273, 0x97d8, 0x9fbb, 0x9342, + 0x9276, 0xfa65, 0x926c, 0xfa6e, 0x9ee0, 0x92c0, 0x92bf, 0x92be, + 0x9aba, 0x8ab3, 0x9775, 0xfa40, 0xfa76, 0xfbd0, 0xfa7b, 0xfe6d, + 0x9bb3, 0x89cc, 0x9abe, 0xfa42, 0x92bc, 0x945c, 0x9bb5, 0x9abf, + 0x98a7, 0x97a4, 0x90fd, 0xfc7b, 0x9ac0, 0x92c3, 0x8aaa, 0x9bd0, + 0x9550, 0x92c6, 0x98a6, 0x9546, 0xfd63, 0xfac2, 0x9ec3, 0x89b2, + 0x9c66, 0x9053, 0x97c1, 0x9ac4, 0x9ac5, 0x8eef, 0xfae9, 0x9262, + 0x8af7, 0x9ac6, 0x92e1, 0x9ac9, 0xfac6, 0x97a5, 0x9acb, 0xfa72, + 0x8a5e, 0x94e0, 0x92cc, 0x8ae5, 0xfe5c, 0x9acc, 0x9df9, 0x8a43, + 0x8aa6, 0x9acd, 0x9ace, 0xfaee, 0x9bcc, 0x9acf, 0x9ad1, 0x9dfa, + 0x9d7c, 0x9ad3, 0x97a6, 0x995f, 0xfbf6, 0x9fc5, 0x8a59, 0x8b6b, + 0x9ad4, 0x9ad5, 0x97a2, 0x8a44, 0x9f4a, 0x90a1, 0xfda4, 0x8a64, + 0x8af2, 0x8af8, 0x9dd8, 0x94d6, 0xfafe, 0xfba7, 0x9ad6, 0x9f4d, + 0xfaf6, 0x8a57, 0x8b43, 0x8b44, 0x8ab6, 0x8ac0, 0x9e54, 0x9ad7, + 0x9ad8, 0x9adc, 0x8aca, 0x9ea8, 0x9263, 0x9add, 0x8b65, 0x8b6f, + 0x8b7e, 0x8f43, 0x92d0, 0x8af4, 0x9dbe, 0x9ae1, 0xfcde, 0x9dfd, + 0x8b66, 0x8b70, 0x8b75, 0x8ae4, 0x8ba4, 0x8aed, 0x8a5d, 0x8b48, + 0x9ded, 0x9e40, 0x8aef, 0x8af6, 0x9e76, 0x9ee3, 0x9ade, 0x8dfe, + 0xfafc, 0x9cb1, 0x9e77, 0x8b64, 0x8b67, 0x974b, 0x9653, 0x9ae0, + 0x8b4a, 0x8af1, 0x8ad7, 0xa0ab, 0x8ab5, 0x8a5f, 0x8aee, 0x9adf, + 0x8afe, 0x8a58, 0x8ba3, 0x8ba7, 0x9ae3, 0x9261, 0x9dd7, 0x9e7d, + 0x9ea7, 0x9eab, 0x9042, 0x8b79, 0x8b7a, 0x9ae6, 0x9ae5, 0x8a7e, + 0x9e44, 0x9ae7, 0x8a7c, 0x8b71, 0x9ae9, 0x9aea, 0x9aeb, 0x8abd, + 0xfb4e, 0x9aed, 0x8af9, 0x9e63, 0x8b49, 0x8ace, 0x8b6e, 0x8ae8, + 0x9aee, 0x92ce, 0x8a5a, 0x8b7b, 0x8b7c, 0x9aef, 0x9af0, 0x8afa, + 0x8941, 0x8b72, 0x8af3, 0x8ba8, 0x9eae, 0x9e72, 0xfb73, 0xfb5f, + 0x90ba, 0x91fe, 0x9ef6, 0x97ed, 0x9af3, 0xa0ee, 0x967c, 0x9345, + 0x986e, 0xfa56, 0x9af5, 0xfc4b, 0x9af4, 0xfede, 0xfcb7, 0x97f1, + 0x97c7, 0x9ccb, 0x9240, 0x9ce8, 0x91fd, 0x974e, 0xfb68, 0x976c, + 0x97e8, 0xfb6a, 0x8b74, 0x8ee7, 0xfdc8, 0x9241, 0x96a1, 0x8ef3, + 0x9af7, 0x8fa6, 0xfad6, 0x9cc7, 0xfad7, 0x9af8, 0xfba1, 0x8ec5, + 0xfba4, 0xfbc2, 0x9ac1, 0x91fa, 0xfedb, 0x97ab, 0x9147, 0xfbb1, + 0x8fea, 0x94d2, 0xfe61, 0xface, 0x92ed, 0x91f3, 0x93c6, 0x935a, + 0xfafb, 0x92ef, 0xfac8, 0x9847, 0x9366, 0x9855, 0x96e6, 0x9f43, + 0x9faa, 0x94da, 0x92ee, 0xfcaf, 0xfbfb, 0x8ef9, 0x91f6, 0x9364, + 0x94f5, 0x9cb6, 0xfbad, 0x984e, 0x8f44, 0x96fd, 0x9af9, 0x9afa, + 0x9769, 0x95d4, 0x984b, 0xfbaa, 0x987c, 0x91ea, 0x9daf, 0x9dc5, + 0x91f1, 0x8eb1, 0x97a9, 0xfbac, 0xfcb8, 0x9cb9, 0xfbb0, 0xfcd2, + 0x93cb, 0x9afd, 0x91f4, 0x8bac, 0xa055, 0x9574, 0x95be, 0x97ad, + 0x8ee9, 0x92f8, 0x97be, 0x916c, 0x94aa, 0xfc63, 0x9dc6, 0x97b5, + 0x92b8, 0x91ef, 0xfea6, 0x9760, 0x9358, 0x9576, 0x8fac, 0x91ec, + 0x97b4, 0x91f7, 0x974a, 0xfb49, 0x9578, 0x93bc, 0x91d6, 0x9355, + 0x9356, 0x9851, 0x8ff8, 0xfbc0, 0x93f2, 0x90d0, 0x9c44, 0x9255, + 0x9363, 0x91a5, 0xa0ed, 0xfd6b, 0x9afe, 0x9351, 0xfa78, 0xfea8, + 0x9350, 0xfa4c, 0x92f7, 0x9b40, 0xfbce, 0x9b41, 0xfead, 0xfbd5, + 0x8bc2, 0x9a7c, 0x9b42, 0x9b43, 0x9e79, 0xfbd9, 0x9b44, 0xa0a7, + 0x9bf3, 0x935e, 0x89cb, 0x9f53, 0x93d7, 0xfbe1, 0xfed0, 0xfbe2, + 0xfce3, 0x9074, 0xfbe6, 0x9bb7, 0x9b45, 0x9b47, 0x9f50, 0x9b48, + 0xfc5b, 0x98a9, 0x9cfd, 0x884c, 0x9b4b, 0xfbec, 0x9ba8, 0x8ad5, + 0xfa73, 0xfd59, 0x91a2, 0xfbed, 0x9ca9, 0x8aa8, 0x9bc3, 0x8ae1, + 0x9b4e, 0x95d0, 0x905f, 0x97ee, 0xfc4e, 0x9b4f, 0x9b50, 0x9ec6, + 0xfc50, 0xfd73, 0xfda7, 0x9da2, 0xfa58, 0xfa5e, 0xa059, 0xfa75, + 0xfbbe, 0x9ca2, 0x9370, 0x9371, 0x9377, 0xfeef, 0x936d, 0xfc5d, + 0x90b8, 0x8afc, 0xfb41, 0x9e6b, 0x94e3, 0x8ee2, 0x8ed7, 0x9c4d, + 0x96a3, 0x9b51, 0x8ac3, 0x96aa, 0xfc68, 0x8b6d, 0xfd67, 0x8ae9, + 0xfca1, 0x936c, 0x9b52, 0xfe70, 0xfca8, 0xfce9, 0x9cb4, 0x8aea, + 0x9b53, 0x9b55, 0x96ab, 0xfca7, 0x9b56, 0x8abc, 0x8acb, 0x9b57, + 0x89cd, 0x9b59, 0x9b5b, 0x93a5, 0x9b5d, 0x9e4f, 0x93a3, 0x8a7b, + 0x8b42, 0x9750, 0x8fb3, 0x8a50, 0x9b60, 0x8b45, 0x8b46, 0x9dfe, + 0x9b62, 0x937b, 0x93b1, 0x8a60, 0x8ad8, 0x9b63, 0x8a69, 0x8a47, + 0x8acc, 0x937c, 0x9b65, 0x9b66, 0x8a72, 0x8a7a, 0x93af, 0x8ab0, + 0x9b68, 0x9ea3, 0xfaec, 0x8b77, 0x9b67, 0x8b59, 0xfcb1, 0xfcbb, + 0x9b69, 0x93a8, 0x8ae0, 0x9e51, 0x8f5f, 0x9b6a, 0x9b6b, 0x97ec, + 0x9b6c, 0xfe4e, 0xfdc2, 0x9b6d, 0x9167, 0xfccc, 0x93b6, 0x90e4, + 0x90e5, 0x9ef2, 0x93ca, 0x8bbc, 0x8f46, 0x93cf, 0xfcdb, 0xfcdc, + 0x93c0, 0xfce6, 0x96e7, 0xfcd8, 0xfcd9, 0xfda6, 0x93ce, 0x95f1, + 0x9ce9, 0xfce4, 0x94af, 0xfa77, 0x93cc, 0x905a, 0x93bf, 0xfb51, + 0x93b9, 0xfed7, 0x93b7, 0x93d9, 0x93bb, 0x93da, 0x98a3, 0x90d1, + 0x9b6e, 0xfa70, 0x9beb, 0x9b6f, 0xfcfc, 0x8b40, 0xa07b, 0x97f7, + 0x93e2, 0xfcd6, 0x9559, 0x93a6, 0xfd40, 0x935f, 0x97f2, 0x9c76, + 0x8ef8, 0x8f47, 0x9b74, 0x92b4, 0x91ed, 0x96d2, 0xfd46, 0x8f4f, + 0x9549, 0x9b75, 0xfa5c, 0x9b79, 0xfd4b, 0x96d3, 0xfd58, 0x945f, + 0xa0f5, 0x9243, 0x97fa, 0x9dd9, 0x97f4, 0x924d, 0xfd5b, 0x9b7a, + 0x9ed5, 0xfaae, 0x9cc9, 0x9258, 0x8ec8, 0x94b4, 0x93e1, 0x93df, + 0xfcf0, 0x93ec, 0x97f6, 0x96cf, 0x93de, 0x8acf, 0x9ba2, 0xfd69, + 0x9352, 0x98a2, 0xfd6e, 0xfa7c, 0x93fa, 0x907c, 0x8f67, 0x9db7, + 0xa0e9, 0xfa4e, 0xfda1, 0x9e74, 0x9fbf, 0x9ecb, 0x9bb9, 0x9dd4, + 0x97b9, 0x8ef1, 0x957b, 0x9ed2, 0x9753, 0x96a4, 0x8fbe, 0x94d9, + 0x9058, 0xfd79, 0xfd7b, 0x8eda, 0x8efa, 0x9ba5, 0x9ed9, 0x97d4, + 0x90bb, 0xfdbc, 0xfdc6, 0x9248, 0x92b5, 0x9dc1, 0x92b9, 0x92a6, + 0x8f4b, 0x9ba6, 0x92b6, 0x8e40, 0x9ed8, 0x945e, 0x985f, 0x94ce, + 0x924a, 0xfd70, 0x9467, 0x8dec, 0x9bd8, 0x9448, 0xfac1, 0x9cf7, + 0xfdbe, 0x8fda, 0xfdd9, 0xfc7e, 0x93f9, 0xfa43, 0xfaeb, 0xfac3, + 0x97d3, 0x95f9, 0x9c48, 0xfdd8, 0xa0d8, 0xfdd7, 0xfb4a, 0x9baf, + 0x944b, 0xfdc9, 0x8eac, 0xfdb2, 0x925a, 0xfcbd, 0x92d9, 0xfdd5, + 0x92dd, 0x9259, 0x96ba, 0x925b, 0x9bab, 0xfdda, 0xfdde, 0xfdd3, + 0xfdd6, 0xfddc, 0xfddd, 0x90fe, 0xfea1, 0x8bad, 0x9cd8, 0x9e6d, + 0xfd7c, 0xfb61, 0x96f8, 0x96f0, 0xfcf4, 0xfe60, 0x9852, 0x964f, + 0x916e, 0x986d, 0x9864, 0x9453, 0xfdec, 0xfb78, 0x95ba, 0x985d, + 0x92f9, 0x985a, 0xfdf6, 0x93d0, 0x9862, 0x9bad, 0x974f, 0x9bae, + 0x9452, 0x9bb0, 0x91d2, 0x97ea, 0xfb6b, 0x91b1, 0xfdf3, 0x92cb, + 0x9bb1, 0xfcec, 0x986b, 0x9751, 0x9871, 0x95ef, 0x9ef3, 0x91e8, + 0x9bba, 0xfb4c, 0x926a, 0xfdf8, 0x9861, 0x91e7, 0x93ed, 0x9744, + 0x91e1, 0xfbf5, 0x9869, 0x8a62, 0x9bbb, 0x9c55, 0x8e77, 0x8ab2, + 0x9ebc, 0x93e6, 0x93a2, 0x9bbd, 0x94b3, 0x937d, 0x9e66, 0x9459, + 0x9bbf, 0x9458, 0x9ea5, 0x9bc7, 0xfe54, 0x8e74, 0x8bd6, 0x94b6, + 0xfd74, 0x98c0, 0x94a5, 0x9bc8, 0x95ed, 0xfd7e, 0xfbeb, 0xfd7d, + 0x976f, 0x9461, 0x9fc1, 0x95d7, 0xfa52, 0x9c58, 0x9f68, 0x9be7, + 0xfcce, 0x96e8, 0xfa49, 0x97a1, 0x954d, 0x9ef8, 0xfe49, 0x91ce, + 0x9771, 0xfdb1, 0xfc6e, 0x9cf2, 0x93b8, 0x9043, 0x9759, 0x94d7, + 0xfe66, 0x947d, 0xfc6f, 0x9246, 0xfa6d, 0x8ef7, 0xfbb7, 0x947c, + 0x92cd, 0x97b2, 0xfe65, 0x967e, 0x9758, 0x9b77, 0x91cf, 0x94a4, + 0x9cad, 0x8bab, 0x96d5, 0xfcb3, 0x93ae, 0x976d, 0x9446, 0x95f7, + 0x9c46, 0x955b, 0x91d1, 0x94f4, 0xfe67, 0x92a5, 0xfedf, 0x9bc9, + 0xfced, 0xfdfa, 0xfcc8, 0xfe62, 0x91fc, 0xfe6b, 0xfdf9, 0xfcc7, + 0x914e, 0x9cb8, 0x9767, 0x95ee, 0x9bb2, 0x9460, 0x94a2, 0x9875, + 0x97ac, 0x91d3, 0x987b, 0x8eeb, 0x976a, 0x965e, 0x97eb, 0x9ff9, + 0x95f8, 0xfea2, 0x8fe6, 0xfe7e, 0x9da4, 0x9768, 0x8eec, 0x94bd, + 0x945b, 0x9cf6, 0xfaa7, 0x9bd9, 0xfa5d, 0x9656, 0x9762, 0x94ba, + 0xa04f, 0x92d8, 0x9bcb, 0x94bb, 0x9d5f, 0x90cf, 0x9465, 0x9f4c, + 0x90d8, 0x9ebe, 0xfb6d, 0x95ca, 0x9dc2, 0x97f8, 0x8ffc, 0x9473, + 0x9474, 0xfeb7, 0x8a4b, 0x8a55, 0x8b69, 0x8adc, 0x8b76, 0x9bce, + 0x8a68, 0xa0f8, 0x98df, 0xfeb5, 0x9bcf, 0x96fb, 0x9bfb, 0x9ece, + 0x8ee5, 0x9e7b, 0x9bd2, 0x8aa5, 0xfece, 0x8a45, 0x9dfc, 0xfecf, + 0x8ba5, 0x8aec, 0xfce0, 0x94ad, 0xfed5, 0x94ac, 0xfc5a, 0x9bd6, + 0x8a6f, 0x8ba9, 0x8e5f, 0x9dcb, 0xfce7, 0x9bd7, 0x93c8, 0x91f0, + 0x8fe0, 0x9bdb, 0x90ed, 0x9bdc, 0xa0ec, 0x98fa, 0x9be0, 0x93c7, + 0x9249, 0x96e1, 0x9be2, 0x9be4, 0x8fe1, 0x9be5, 0x94c0, 0x93c3, + 0x93c5, 0x9079, 0x977b, 0x907e, 0xfee6, 0xfe46, 0x9db8, 0x9270, + 0x95a8, 0x94c8, 0x98b9, 0x9140, 0xfcbe, 0x9157, 0x8bb2, 0xfadf, + 0x9be6, 0x9643, 0x8e44, 0x9c4f, 0xfef4, 0x9be8, 0x93dc, 0x966f, + 0x8e4a, 0x9bed, 0x92f6, 0x9db9, 0x8e4e, 0xfbcf, 0x9ec2, 0x94e5, + 0x9bf0, 0x94e4, 0x9551, 0x8bbb, 0x9bf1, 0x94f0, 0x8e64, 0x94ea, + 0x8f61, 0x9b64, 0x8e5b, 0x9bf2, 0x9fbe, 0x9dc9, 0x8e6c, 0x8f73, + 0x8f75, 0x8e71, 0x8e60, 0x8e6a, 0x9552, 0x9554, 0x8ad4, 0x9dbb, + 0x9543, 0x92fe, 0x94f2, 0x94f1, 0xa0ea, 0x9dd2, 0xa0b1, 0x91f8, + 0x9462, 0x9ba4, 0x8ead, 0x9ead, 0x96d0, 0xfeee, 0x8ab4, 0x9757, + 0x8a77, 0x9bf7, 0x8eb5, 0xa06d, 0x8eb6, 0x9756, 0x9540, 0xa0f3, + 0x94be, 0x9bfa, 0xfddf, 0x9dbc, 0x94fe, 0x8bdb, 0xa0fe, 0x8ec0, + 0x9f47, 0x8bde, 0xa0fb, 0x8ec3, 0x9649, 0xfec2, 0x954c, 0x9bfd, + 0x90cc, 0x9c60, 0x954b, 0x9bfe, 0x9c70, 0x9c43, 0x9c47, 0x8ecc, + 0x8e54, 0x8ee4, 0x9c49, 0x8b5e, 0x955e, 0x955c, 0x9c4b, 0x8be1, + 0x8ed9, 0x9db4, 0x925f, 0x9c4c, 0x8aa1, 0x8edb, 0x9c56, 0x8aa2, + 0x9754, 0x9c5e, 0x9ed4, 0x9568, 0xa0c3, 0x8ae6, 0xa0f7, 0x9c61, + 0x9c5f, 0xfc4d, 0x9e5b, 0x9e69, 0x9c63, 0xfec7, 0xfec6, 0x9c67, + 0x9c69, 0x8be2, 0x9165, 0x9ce7, 0x8a54, 0x9c6c, 0x9c6e, 0xfe5d, + 0x9c73, 0x956a, 0x956d, 0x8ef0, 0x8f4d, 0x8ef6, 0xfabc, 0xfbda, + 0x8b4c, 0xfd75, 0x9bdd, 0xfaf5, 0x9c74, 0x9545, 0x96c6, 0x8f6a, + 0x8f4e, 0x9c78, 0xfa55, 0x97e4, 0x9c41, 0x925c, 0x96fa, 0xfb66, + 0x8e65, 0x9849, 0xfba8, 0x9842, 0x9c7a, 0x97fb, 0x90ca, 0x9c5b, + 0x974d, 0x8ed3, 0x9561, 0x9f4b, 0x9fb5, 0x93d2, 0xfdaa, 0x9840, + 0x9146, 0x9867, 0xfa5a, 0xfba9, 0x9841, 0xfcfd, 0xfdab, 0x91bd, + 0x8f4c, 0x96c9, 0x8f55, 0xfbae, 0x956f, 0x9c7d, 0xa0f0, 0x946f, + 0xfdac, 0x96cb, 0x96ce, 0xa056, 0x9ce1, 0x96c4, 0x8f5e, 0x8f6c, + 0x8ea3, 0xfbb3, 0xfc53, 0xfdb3, 0x8f6b, 0x96ca, 0x8f79, 0x9e6f, + 0xa0c5, 0xfc78, 0x8e42, 0x8f5a, 0x90c2, 0x8ea5, 0x9061, 0x924f, + 0x9373, 0xfdb5, 0xfecc, 0xfbbd, 0x9843, 0x96c5, 0x89bc, 0x9ca3, + 0x924b, 0x984a, 0x8fa4, 0xa0f1, 0x9efb, 0x9cd2, 0x8fa7, 0xfc5c, + 0x9845, 0x9046, 0xfefa, 0x9560, 0x9f48, 0x9247, 0x90fb, 0x9ca4, + 0x9571, 0x9ca6, 0x9ca7, 0x9caa, 0x9ed3, 0x9e70, 0x9cac, 0x8fae, + 0x957d, 0x9cb0, 0x97b6, 0xa0bd, 0x8adf, 0x9eaa, 0x8fbd, 0x8fbf, + 0x9369, 0x9ba7, 0xc8a4, 0xfeea, 0x9be1, 0x8b41, 0x9db6, 0xa0eb, + 0x9ba3, 0x8ba1, 0x8fc8, 0x894c, 0x9860, 0x94c7, 0x8b58, 0x95ab, + 0x95aa, 0x9cc3, 0x9cc4, 0x93d6, 0x9dac, 0x8be6, 0x8a71, 0x8fd1, + 0x99d5, 0x90f4, 0x8aa3, 0x9cce, 0x9cd4, 0x9cd5, 0xfbc8, 0x9db3, + 0xfc70, 0x8fd7, 0x9b73, 0xfa5b, 0x8fd2, 0x9064, 0x98b6, 0x9668, + 0x9cd6, 0x98bd, 0x8fdc, 0xfef6, 0x8fd9, 0x9541, 0x97f3, 0x9bf8, + 0x9e6c, 0x8ff2, 0x8fee, 0x9cd7, 0x9e6e, 0x8a40, 0x8fef, 0x8ff4, + 0x8ff5, 0x95c2, 0x986a, 0x97cf, 0x9ee5, 0x9e7c, 0x9041, 0x9cdb, + 0x9441, 0x9ce6, 0x9db0, 0x9cea, 0x9ced, 0x9cfa, 0x8b62, 0x8a4e, + 0x9cca, 0x8a66, 0x9cfb, 0x9cfc, 0x9cfe, 0x8a53, 0x9ce5, 0x9d40, + 0x9d41, 0x9045, 0x8b73, 0x97ca, 0x9d42, 0x8a61, 0x8bae, 0x8ad2, + 0x8ba2, 0x9df2, 0x9d43, 0x9cdf, 0x9d44, 0x8eca, 0x904e, 0x8eb3, + 0x9ff5, 0x9d45, 0x904f, 0x9d47, 0x89ca, 0x9cb5, 0xfbfe, 0x905e, + 0x9063, 0x9057, 0x9066, 0x9bc0, 0xfce5, 0x9162, 0x9067, 0x8fa1, + 0x8fa2, 0x9d48, 0xfad3, 0x905d, 0x90b9, 0x906b, 0x9069, 0xfe57, + 0xfe55, 0x9073, 0x9bef, 0x9cf0, 0x9d4b, 0xfed9, 0xfeda, 0x91e0, + 0x91d8, 0x9646, 0x9360, 0xfa53, 0x9cd3, 0x9d4e, 0xfb40, 0x8de2, + 0x9442, 0x9056, 0x9865, 0xfa4a, 0x9d50, 0x9d52, 0x95af, 0x975a, + 0x9349, 0x9747, 0xa0f4, 0x9778, 0x8fcf, 0xfc60, 0xfc56, 0x91dc, + 0x9661, 0x92ec, 0x935d, 0x8ede, 0x96fe, 0xfd4f, 0x95de, 0x98b0, + 0xa040, 0x97bd, 0x977d, 0x97f5, 0x9bac, 0xfada, 0x92c2, 0x97b1, + 0x907b, 0x93fe, 0x947b, 0x9777, 0xfabe, 0xfd43, 0x90c6, 0x90a4, + 0x90a8, 0x94a9, 0x90a9, 0x95e0, 0x907d, 0x9265, 0xfdba, 0x93c4, + 0xfeed, 0x9dab, 0xa0e3, 0x9648, 0x9d53, 0x8aa9, 0x9bc5, 0x965d, + 0x975f, 0x965f, 0x966e, 0xfb5d, 0x9db1, 0xfea3, 0x9db2, 0x95ae, + 0xfca3, 0xa0a2, 0x9655, 0x9d54, 0x9341, 0x95ad, 0x91d5, 0x977a, + 0xfdfc, 0x8e47, 0x93fd, 0x90a5, 0x90ac, 0x95ac, 0x90ae, 0xfea5, + 0x9d56, 0x97e3, 0x95e2, 0x9466, 0x9647, 0x91b8, 0x9cec, 0x90ad, + 0x95e3, 0x8b4f, 0x8ae3, 0x8b4d, 0x95ea, 0x8b4e, 0x8bed, 0x91d9, + 0xa0a4, 0x95f5, 0x95f4, 0x9fb3, 0xfeaf, 0xfe72, 0x927a, 0xfeac, + 0x95f3, 0x9d58, 0x9372, 0x91c5, 0x9642, 0x90cd, 0x95fe, 0x9159, + 0x9c65, 0x97cc, 0x90ce, 0x9d59, 0xfcf5, 0xfefd, 0x9d5b, 0x9d5c, + 0x937e, 0x98ac, 0x9d5e, 0xfdd0, 0xfd60, 0x9ccf, 0x90dd, 0x90e0, + 0x90f3, 0x98b1, 0x90f0, 0x93bd, 0x95b7, 0x9f46, 0x8e4b, 0x9658, + 0x8a4c, 0x9d63, 0x9ecf, 0x9d65, 0x9d66, 0x965a, 0x9d64, 0x8a6c, + 0x8ad9, 0x9d67, 0x8a70, 0x8bf3, 0x9150, 0x9cc1, 0x9d68, 0x93a7, + 0x9674, 0xa0ef, 0x9151, 0x96c1, 0x9676, 0x9d69, 0xfca4, 0x9d6a, + 0x924e, 0x9d6b, 0x9bc1, 0x9d6c, 0x8a65, 0x915d, 0x9d6d, 0x915a, + 0x9cc0, 0x916a, 0x9d6e, 0x9ea6, 0x9dcd, 0x9d6f, 0x89bb, 0x9ef9, + 0x96b4, 0x9172, 0x9ec8, 0x8b55, 0x9d71, 0x9d72, 0x9ecc, 0x9174, + 0x9ed0, 0x905c, 0x8ed2, 0x91a8, 0x9177, 0x96bf, 0x96c0, 0x8fb1, + 0x96b7, 0x9178, 0x89be, 0x917c, 0xfb77, 0x9175, 0x91a3, 0x9176, + 0x96be, 0x9179, 0x96b6, 0x91a4, 0x91a6, 0x9d75, 0x9052, 0xa045, + 0x91a9, 0x98aa, 0x8baa, 0x9cdd, 0x9d77, 0x8940, 0x9eec, 0x93aa, + 0x9478, 0x9d7a, 0x8ac9, 0x8b4b, 0x9fec, 0x8ae2, 0x9e75, 0x9874, + 0x9ac8, 0xa047, 0x8bc3, 0xfc48, 0xfc77, 0x9c52, 0x8efd, 0x8fa8, + 0x957a, 0x8ff0, +}; + +static const Summary16 hkscs1999_uni2indx_page00[45] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0100 }, { 1, 0x0000 }, + { 1, 0x0703 }, { 6, 0x000c }, { 8, 0x3703 }, { 15, 0x170c }, + /* 0x0100 */ + { 21, 0x0003 }, { 23, 0x0c0c }, { 27, 0x0800 }, { 28, 0x0000 }, + { 28, 0x3800 }, { 31, 0x0008 }, { 32, 0x0800 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x6000 }, { 35, 0x1557 }, { 43, 0x0000 }, { 43, 0x0000 }, + /* 0x0200 */ + { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, + { 43, 0x0000 }, { 43, 0x0813 }, { 47, 0x0402 }, { 49, 0x0020 }, + { 50, 0x0408 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, + { 52, 0x0040 }, +}; +static const Summary16 hkscs1999_uni2indx_page04[6] = { + /* 0x0400 */ + { 53, 0x0002 }, { 54, 0xffff }, { 70, 0xffff }, { 86, 0xffff }, + { 102, 0xffff }, { 118, 0x0002 }, +}; +static const Summary16 hkscs1999_uni2indx_page1e[13] = { + /* 0x1e00 */ + { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, + { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, + { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0xc000 }, + { 121, 0x0003 }, +}; +static const Summary16 hkscs1999_uni2indx_page21[15] = { + /* 0x2100 */ + { 123, 0x0000 }, { 123, 0x0040 }, { 124, 0x0002 }, { 125, 0x0000 }, + { 125, 0x0000 }, { 125, 0x0000 }, { 125, 0x0000 }, { 125, 0x03ff }, + { 135, 0x0000 }, { 135, 0x0000 }, { 135, 0x0000 }, { 135, 0x0300 }, + { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x0080 }, +}; +static const Summary16 hkscs1999_uni2indx_page23[40] = { + /* 0x2300 */ + { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, + { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, + { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, + { 138, 0x0000 }, { 138, 0x0c00 }, { 140, 0x0000 }, { 140, 0x0000 }, + /* 0x2400 */ + { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, + { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x03ff }, { 150, 0x3ff0 }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + /* 0x2500 */ + { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, + { 160, 0x0000 }, { 160, 0xffff }, { 176, 0xffff }, { 192, 0x0001 }, +}; +static const Summary16 hkscs1999_uni2indx_page27[4] = { + /* 0x2700 */ + { 193, 0x0000 }, { 193, 0x0000 }, { 193, 0x0000 }, { 193, 0x2000 }, +}; +static const Summary16 hkscs1999_uni2indx_page2e[68] = { + /* 0x2e00 */ + { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, + { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, + { 194, 0x35d1 }, { 202, 0x3020 }, { 205, 0x54a0 }, { 210, 0x5040 }, + { 213, 0xb440 }, { 218, 0x40c0 }, { 221, 0x0008 }, { 222, 0x0000 }, + /* 0x2f00 */ + { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0008 }, + { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, + { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, + { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, + /* 0x3000 */ + { 223, 0x00e0 }, { 226, 0x0000 }, { 226, 0x0000 }, { 226, 0x0000 }, + { 226, 0xfffe }, { 241, 0xffff }, { 257, 0xffff }, { 273, 0xffff }, + { 289, 0xffff }, { 305, 0x780f }, { 313, 0xfffe }, { 328, 0xffff }, + { 344, 0xffff }, { 360, 0xffff }, { 376, 0xffff }, { 392, 0x707f }, + /* 0x3100 */ + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, + { 402, 0xffff }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, + /* 0x3200 */ + { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0002 }, +}; +static const Summary16 hkscs1999_uni2indx_page34[1724] = { + /* 0x3400 */ + { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0020 }, + { 420, 0x1001 }, { 422, 0x0000 }, { 422, 0x0010 }, { 423, 0x6408 }, + { 427, 0x0000 }, { 427, 0x0048 }, { 429, 0x8020 }, { 431, 0x1000 }, + { 432, 0x0102 }, { 434, 0x8000 }, { 435, 0x0010 }, { 436, 0x0800 }, + /* 0x3500 */ + { 437, 0x0040 }, { 438, 0x0000 }, { 438, 0x0000 }, { 438, 0x4000 }, + { 439, 0x0000 }, { 439, 0x000a }, { 441, 0x2002 }, { 443, 0x0185 }, + { 447, 0x0010 }, { 448, 0x0180 }, { 450, 0x2022 }, { 453, 0x8000 }, + { 454, 0x44a2 }, { 459, 0x2844 }, { 463, 0x0000 }, { 463, 0x480e }, + /* 0x3600 */ + { 468, 0x0200 }, { 469, 0x0500 }, { 471, 0x2008 }, { 473, 0x4220 }, + { 476, 0x4380 }, { 480, 0x8000 }, { 481, 0x0000 }, { 481, 0x0400 }, + { 482, 0x0002 }, { 483, 0x0400 }, { 484, 0x1420 }, { 487, 0x1223 }, + { 492, 0x01ba }, { 498, 0x2058 }, { 502, 0x0066 }, { 506, 0x0020 }, + /* 0x3700 */ + { 507, 0x250a }, { 512, 0x1000 }, { 513, 0x302c }, { 518, 0x040d }, + { 522, 0x0009 }, { 524, 0x0000 }, { 524, 0x8004 }, { 526, 0x0000 }, + { 526, 0x0000 }, { 526, 0x0080 }, { 527, 0x0001 }, { 528, 0x4200 }, + { 530, 0x0000 }, { 530, 0x0000 }, { 530, 0x0000 }, { 530, 0x0904 }, + /* 0x3800 */ + { 533, 0x8000 }, { 534, 0x0200 }, { 535, 0x2001 }, { 537, 0x0140 }, + { 539, 0x0000 }, { 539, 0x0000 }, { 539, 0x0008 }, { 540, 0x0000 }, + { 540, 0x0000 }, { 540, 0x0000 }, { 540, 0x0001 }, { 541, 0x0000 }, + { 541, 0x1008 }, { 543, 0x0002 }, { 544, 0x0000 }, { 544, 0x0400 }, + /* 0x3900 */ + { 545, 0x0100 }, { 546, 0x0010 }, { 547, 0x0080 }, { 548, 0x8004 }, + { 550, 0x2000 }, { 551, 0x0000 }, { 551, 0x0008 }, { 552, 0x0000 }, + { 552, 0x0601 }, { 555, 0x0a04 }, { 558, 0x0012 }, { 560, 0x0100 }, + { 561, 0x0000 }, { 561, 0x1000 }, { 562, 0x1024 }, { 565, 0x4900 }, + /* 0x3a00 */ + { 568, 0x004a }, { 571, 0x0180 }, { 573, 0x0600 }, { 575, 0x0010 }, + { 576, 0x0800 }, { 577, 0x5084 }, { 581, 0x00c0 }, { 583, 0x0000 }, + { 583, 0x0000 }, { 583, 0x0080 }, { 584, 0x0800 }, { 585, 0x2000 }, + { 586, 0x0000 }, { 586, 0x4000 }, { 587, 0x0001 }, { 588, 0x0805 }, + /* 0x3b00 */ + { 591, 0x4000 }, { 592, 0x0200 }, { 593, 0x0804 }, { 595, 0x0200 }, + { 596, 0x0004 }, { 597, 0x0100 }, { 598, 0x0001 }, { 599, 0x1806 }, + { 603, 0x0001 }, { 604, 0x0240 }, { 606, 0x0002 }, { 607, 0x5000 }, + { 609, 0x0014 }, { 611, 0x2080 }, { 613, 0x1000 }, { 614, 0x001c }, + /* 0x3c00 */ + { 617, 0x2000 }, { 618, 0x0122 }, { 621, 0x0000 }, { 621, 0x0000 }, + { 621, 0x0000 }, { 621, 0x0010 }, { 622, 0x0000 }, { 622, 0x0000 }, + { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, + { 622, 0x2800 }, { 624, 0x1042 }, { 627, 0x8800 }, { 629, 0x0000 }, + /* 0x3d00 */ + { 629, 0x0000 }, { 629, 0x2008 }, { 631, 0x0000 }, { 631, 0x0804 }, + { 633, 0x5040 }, { 636, 0x8002 }, { 638, 0x8604 }, { 642, 0x2020 }, + { 644, 0x8420 }, { 647, 0x0002 }, { 648, 0x2020 }, { 650, 0x8010 }, + { 652, 0x30c0 }, { 656, 0x0808 }, { 658, 0x0980 }, { 661, 0x3088 }, + /* 0x3e00 */ + { 665, 0x0040 }, { 666, 0x0000 }, { 666, 0x0000 }, { 666, 0x0000 }, + { 666, 0x0109 }, { 669, 0x0020 }, { 670, 0x0000 }, { 670, 0x0010 }, + { 671, 0x0000 }, { 671, 0x0000 }, { 671, 0x2700 }, { 675, 0x8102 }, + { 678, 0x1484 }, { 682, 0x44c3 }, { 688, 0x0a86 }, { 693, 0x9419 }, + /* 0x3f00 */ + { 699, 0x4051 }, { 703, 0x0000 }, { 703, 0x0000 }, { 703, 0x0000 }, + { 703, 0x0000 }, { 703, 0x0308 }, { 706, 0x0008 }, { 707, 0x1000 }, + { 708, 0x0000 }, { 708, 0x0008 }, { 709, 0x0000 }, { 709, 0x0000 }, + { 709, 0x0001 }, { 710, 0x1080 }, { 712, 0x2020 }, { 714, 0x0600 }, + /* 0x4000 */ + { 716, 0x0010 }, { 717, 0x2000 }, { 718, 0x0000 }, { 718, 0x0200 }, + { 719, 0x0020 }, { 720, 0x0088 }, { 722, 0x8424 }, { 726, 0x0000 }, + { 726, 0x0000 }, { 726, 0x0000 }, { 726, 0x0100 }, { 727, 0x8800 }, + { 729, 0x0100 }, { 730, 0x8100 }, { 732, 0x0000 }, { 732, 0x0400 }, + /* 0x4100 */ + { 733, 0x4218 }, { 737, 0x0000 }, { 737, 0x0000 }, { 737, 0x0004 }, + { 738, 0x0000 }, { 738, 0x0000 }, { 738, 0x5080 }, { 741, 0x8000 }, + { 742, 0x0000 }, { 742, 0x0001 }, { 743, 0x0000 }, { 743, 0x0004 }, + { 744, 0x8410 }, { 747, 0x0800 }, { 748, 0x8000 }, { 749, 0x0200 }, + /* 0x4200 */ + { 750, 0x0000 }, { 750, 0x0002 }, { 751, 0x0000 }, { 751, 0x0000 }, + { 751, 0x0001 }, { 752, 0x0000 }, { 752, 0x0401 }, { 754, 0x0400 }, + { 755, 0x1000 }, { 756, 0x0010 }, { 757, 0x0000 }, { 757, 0x1220 }, + { 760, 0x0000 }, { 760, 0x0000 }, { 760, 0x0000 }, { 760, 0x1810 }, + /* 0x4300 */ + { 763, 0x0000 }, { 763, 0x0000 }, { 763, 0x0800 }, { 764, 0x0000 }, + { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x4000 }, { 765, 0x0000 }, + { 765, 0x0000 }, { 765, 0x0080 }, { 766, 0x0000 }, { 766, 0x0400 }, + { 767, 0x0002 }, { 768, 0x8200 }, { 770, 0x2000 }, { 771, 0x0004 }, + /* 0x4400 */ + { 772, 0x0006 }, { 774, 0x0008 }, { 775, 0x2020 }, { 777, 0x0000 }, + { 777, 0x0000 }, { 777, 0x0000 }, { 777, 0x0000 }, { 777, 0x0400 }, + { 778, 0x8000 }, { 779, 0x8002 }, { 781, 0x0005 }, { 783, 0x0081 }, + { 785, 0x4021 }, { 788, 0xa000 }, { 790, 0x1e10 }, { 795, 0x0010 }, + /* 0x4500 */ + { 796, 0x0a18 }, { 800, 0x2040 }, { 802, 0x4080 }, { 804, 0xa808 }, + { 808, 0x0008 }, { 809, 0x1026 }, { 813, 0x0404 }, { 815, 0x0080 }, + { 816, 0x0020 }, { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0000 }, + { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0200 }, { 818, 0x0000 }, + /* 0x4600 */ + { 818, 0x8040 }, { 820, 0x00a0 }, { 822, 0x0000 }, { 822, 0x0000 }, + { 822, 0x0000 }, { 822, 0x0800 }, { 823, 0x0000 }, { 823, 0x0400 }, + { 824, 0x0001 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, + { 825, 0x8000 }, { 826, 0x0001 }, { 827, 0x0000 }, { 827, 0x0020 }, + /* 0x4700 */ + { 828, 0x0000 }, { 828, 0x0108 }, { 830, 0x0000 }, { 830, 0x0000 }, + { 830, 0x4000 }, { 831, 0x0000 }, { 831, 0x0000 }, { 831, 0x1000 }, + { 832, 0x0000 }, { 832, 0x0100 }, { 833, 0x0040 }, { 834, 0x0000 }, + { 834, 0x0000 }, { 834, 0x0020 }, { 835, 0x2000 }, { 836, 0x0010 }, + /* 0x4800 */ + { 837, 0x0801 }, { 839, 0x0000 }, { 839, 0x0000 }, { 839, 0x0080 }, + { 840, 0x0000 }, { 840, 0x2000 }, { 841, 0x0000 }, { 841, 0x0002 }, + { 842, 0x0000 }, { 842, 0x0800 }, { 843, 0x6000 }, { 845, 0x0000 }, + { 845, 0x0000 }, { 845, 0x2001 }, { 847, 0x2000 }, { 848, 0x0408 }, + /* 0x4900 */ + { 850, 0x0040 }, { 851, 0x4002 }, { 853, 0x2420 }, { 856, 0x5020 }, + { 859, 0x0020 }, { 860, 0x000a }, { 862, 0x0420 }, { 864, 0x0004 }, + { 865, 0x0200 }, { 866, 0x0000 }, { 866, 0x0082 }, { 868, 0x0000 }, + { 868, 0x0000 }, { 868, 0x8000 }, { 869, 0x00a0 }, { 871, 0x0000 }, + /* 0x4a00 */ + { 871, 0x8000 }, { 872, 0x2000 }, { 873, 0x0010 }, { 874, 0x0020 }, + { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, + { 875, 0x0000 }, { 875, 0x0040 }, { 876, 0x0000 }, { 876, 0x0110 }, + { 878, 0x0000 }, { 878, 0x0002 }, { 879, 0x0010 }, { 880, 0x8000 }, + /* 0x4b00 */ + { 881, 0x0000 }, { 881, 0x0200 }, { 882, 0x1000 }, { 883, 0x0080 }, + { 884, 0x0000 }, { 884, 0x0000 }, { 884, 0x8000 }, { 885, 0x4805 }, + { 889, 0x4000 }, { 890, 0x20c9 }, { 895, 0x0000 }, { 895, 0x6000 }, + { 897, 0x0001 }, { 898, 0x0000 }, { 898, 0x0000 }, { 898, 0x0000 }, + /* 0x4c00 */ + { 898, 0x4090 }, { 901, 0x0000 }, { 901, 0x0000 }, { 901, 0x4800 }, + { 903, 0x0000 }, { 903, 0x0800 }, { 904, 0x2000 }, { 905, 0x2000 }, + { 906, 0x0000 }, { 906, 0x0000 }, { 906, 0x4010 }, { 908, 0x0081 }, + { 910, 0x2000 }, { 911, 0x0000 }, { 911, 0x2002 }, { 913, 0x0000 }, + /* 0x4d00 */ + { 913, 0x0200 }, { 914, 0x0001 }, { 915, 0x0000 }, { 915, 0x0010 }, + { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x0000 }, + { 916, 0x0000 }, { 916, 0x1002 }, { 918, 0x0000 }, { 918, 0x0000 }, + { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, + /* 0x4e00 */ + { 918, 0x0010 }, { 919, 0x1400 }, { 921, 0x1512 }, { 926, 0xa0c0 }, + { 930, 0x0200 }, { 931, 0x0c00 }, { 933, 0x0400 }, { 934, 0x0100 }, + { 935, 0x02a3 }, { 940, 0x0500 }, { 942, 0x0001 }, { 943, 0x9880 }, + { 947, 0x4000 }, { 948, 0x0000 }, { 948, 0x4c00 }, { 951, 0x0100 }, + /* 0x4f00 */ + { 952, 0x0008 }, { 953, 0x0400 }, { 954, 0x0300 }, { 956, 0x0284 }, + { 959, 0x0824 }, { 962, 0x0000 }, { 962, 0x0000 }, { 962, 0x0004 }, + { 963, 0x0400 }, { 964, 0x0000 }, { 964, 0x0904 }, { 967, 0x2001 }, + { 969, 0x1100 }, { 971, 0x0000 }, { 971, 0x0030 }, { 973, 0x2204 }, + /* 0x5000 */ + { 976, 0x0108 }, { 978, 0x0000 }, { 978, 0x4000 }, { 979, 0x0010 }, + { 980, 0x0000 }, { 980, 0x0140 }, { 982, 0x1040 }, { 984, 0x0000 }, + { 984, 0x0102 }, { 986, 0x0001 }, { 987, 0x0040 }, { 988, 0x0000 }, + { 988, 0x2000 }, { 989, 0x8201 }, { 992, 0x0002 }, { 993, 0x1010 }, + /* 0x5100 */ + { 995, 0x6002 }, { 998, 0x0000 }, { 998, 0x0800 }, { 999, 0x0000 }, + { 999, 0x0000 }, { 999, 0x0040 }, { 1000, 0x0401 }, { 1002, 0x0210 }, + { 1004, 0x0144 }, { 1007, 0x1440 }, { 1010, 0x0980 }, { 1013, 0x013c }, + { 1018, 0x8288 }, { 1022, 0x880e }, { 1027, 0x2014 }, { 1030, 0x5010 }, + /* 0x5200 */ + { 1033, 0x0824 }, { 1036, 0x8000 }, { 1037, 0x00c1 }, { 1040, 0x1010 }, + { 1042, 0x0000 }, { 1042, 0x0280 }, { 1044, 0x0101 }, { 1046, 0x0208 }, + { 1048, 0x8000 }, { 1049, 0x0411 }, { 1052, 0x0112 }, { 1055, 0x0220 }, + { 1057, 0x1020 }, { 1059, 0x0003 }, { 1061, 0x0003 }, { 1063, 0x0200 }, + /* 0x5300 */ + { 1064, 0x0002 }, { 1065, 0x0000 }, { 1065, 0x1080 }, { 1067, 0x090c }, + { 1071, 0x4004 }, { 1073, 0xa000 }, { 1075, 0x2290 }, { 1079, 0x6010 }, + { 1082, 0x0000 }, { 1082, 0x0008 }, { 1083, 0x4f45 }, { 1091, 0x0041 }, + { 1093, 0x1026 }, { 1097, 0x0707 }, { 1103, 0x0001 }, { 1104, 0x40c0 }, + /* 0x5400 */ + { 1107, 0x0000 }, { 1107, 0x0458 }, { 1111, 0x800a }, { 1114, 0x0004 }, + { 1115, 0x2800 }, { 1117, 0x0000 }, { 1117, 0x2600 }, { 1120, 0x0000 }, + { 1120, 0x8020 }, { 1122, 0x5098 }, { 1127, 0x0018 }, { 1129, 0x0214 }, + { 1132, 0x3800 }, { 1135, 0x0401 }, { 1137, 0x8008 }, { 1139, 0x0000 }, + /* 0x5500 */ + { 1139, 0x2004 }, { 1141, 0x4108 }, { 1144, 0x0928 }, { 1148, 0x8000 }, + { 1149, 0x0280 }, { 1151, 0x2008 }, { 1153, 0x0a00 }, { 1155, 0x020e }, + { 1159, 0x0040 }, { 1160, 0x0001 }, { 1161, 0x0200 }, { 1162, 0x1611 }, + { 1167, 0x0002 }, { 1168, 0x4180 }, { 1171, 0x1400 }, { 1173, 0x0823 }, + /* 0x5600 */ + { 1177, 0x0020 }, { 1178, 0x4002 }, { 1180, 0x202f }, { 1186, 0x0080 }, + { 1187, 0xa008 }, { 1190, 0x2015 }, { 1194, 0x0002 }, { 1195, 0x1c00 }, + { 1198, 0x0e00 }, { 1201, 0xc004 }, { 1204, 0x8012 }, { 1207, 0x8202 }, + { 1210, 0x0000 }, { 1210, 0x0040 }, { 1211, 0xa004 }, { 1214, 0x2002 }, + /* 0x5700 */ + { 1216, 0x0001 }, { 1217, 0x2020 }, { 1219, 0x0000 }, { 1219, 0x8004 }, + { 1221, 0x004c }, { 1224, 0x8890 }, { 1228, 0x0080 }, { 1229, 0xc400 }, + { 1232, 0x2500 }, { 1235, 0x1001 }, { 1237, 0x0482 }, { 1240, 0x4810 }, + { 1243, 0x0110 }, { 1245, 0x6080 }, { 1248, 0x8040 }, { 1250, 0x4000 }, + /* 0x5800 */ + { 1251, 0x0008 }, { 1252, 0x0004 }, { 1253, 0x0044 }, { 1255, 0x0400 }, + { 1256, 0x0091 }, { 1259, 0x9000 }, { 1261, 0x1200 }, { 1263, 0x000c }, + { 1265, 0x0000 }, { 1265, 0x0600 }, { 1267, 0x0480 }, { 1269, 0x0861 }, + { 1273, 0x0800 }, { 1274, 0x1000 }, { 1275, 0x0001 }, { 1276, 0x080d }, + /* 0x5900 */ + { 1280, 0x04b4 }, { 1285, 0x8002 }, { 1287, 0x0000 }, { 1287, 0x0014 }, + { 1289, 0x0000 }, { 1289, 0x0000 }, { 1289, 0x0020 }, { 1290, 0x0020 }, + { 1291, 0x0200 }, { 1292, 0x8410 }, { 1295, 0x1000 }, { 1296, 0x0181 }, + { 1299, 0x0210 }, { 1301, 0x0200 }, { 1302, 0x8800 }, { 1304, 0x0301 }, + /* 0x5a00 */ + { 1307, 0x2804 }, { 1310, 0x0004 }, { 1311, 0x1c92 }, { 1317, 0x2000 }, + { 1318, 0x0020 }, { 1319, 0x0210 }, { 1321, 0x490a }, { 1326, 0x4202 }, + { 1329, 0x0146 }, { 1333, 0x0242 }, { 1336, 0x0803 }, { 1339, 0x0000 }, + { 1339, 0xc008 }, { 1342, 0x0008 }, { 1343, 0x0010 }, { 1344, 0x4405 }, + /* 0x5b00 */ + { 1348, 0x2000 }, { 1349, 0x8002 }, { 1351, 0x0800 }, { 1352, 0x0000 }, + { 1352, 0x8452 }, { 1357, 0x0000 }, { 1357, 0x2140 }, { 1360, 0x1050 }, + { 1363, 0x0005 }, { 1365, 0xe001 }, { 1369, 0x0400 }, { 1370, 0x0000 }, + { 1370, 0x0008 }, { 1371, 0x00a0 }, { 1373, 0x0000 }, { 1373, 0x8008 }, + /* 0x5c00 */ + { 1375, 0x0020 }, { 1376, 0x5018 }, { 1380, 0x0009 }, { 1382, 0x0000 }, + { 1382, 0x0600 }, { 1384, 0x4008 }, { 1386, 0x0000 }, { 1386, 0x0000 }, + { 1386, 0x0020 }, { 1387, 0x5600 }, { 1391, 0x0000 }, { 1391, 0x0400 }, + { 1392, 0x0006 }, { 1394, 0x0002 }, { 1395, 0x8220 }, { 1398, 0x0000 }, + /* 0x5d00 */ + { 1398, 0x0000 }, { 1398, 0x0121 }, { 1401, 0x9000 }, { 1403, 0x4000 }, + { 1404, 0x0140 }, { 1406, 0x08c0 }, { 1409, 0x0000 }, { 1409, 0x0011 }, + { 1411, 0x4820 }, { 1414, 0x0000 }, { 1414, 0x0810 }, { 1416, 0x0240 }, + { 1418, 0x0002 }, { 1419, 0x0880 }, { 1421, 0x0000 }, { 1421, 0x0020 }, + /* 0x5e00 */ + { 1422, 0x0a00 }, { 1424, 0x0004 }, { 1425, 0x4000 }, { 1426, 0x0000 }, + { 1426, 0x0104 }, { 1428, 0x4000 }, { 1429, 0x0000 }, { 1429, 0x8400 }, + { 1431, 0x0048 }, { 1433, 0x0000 }, { 1433, 0x0000 }, { 1433, 0x2000 }, + { 1434, 0x2000 }, { 1435, 0x0001 }, { 1436, 0x0000 }, { 1436, 0x1b10 }, + /* 0x5f00 */ + { 1441, 0x7000 }, { 1444, 0x0000 }, { 1444, 0x0020 }, { 1445, 0x0400 }, + { 1446, 0x2000 }, { 1447, 0x1003 }, { 1450, 0x000a }, { 1452, 0x0804 }, + { 1454, 0x0008 }, { 1455, 0x0000 }, { 1455, 0x0090 }, { 1457, 0x0402 }, + { 1459, 0x0010 }, { 1460, 0x8800 }, { 1462, 0x0000 }, { 1462, 0x0000 }, + /* 0x6000 */ + { 1462, 0x0000 }, { 1462, 0x0000 }, { 1462, 0x0008 }, { 1463, 0x0802 }, + { 1465, 0x0400 }, { 1466, 0x0004 }, { 1467, 0x0000 }, { 1467, 0x40a0 }, + { 1470, 0x0000 }, { 1470, 0x4000 }, { 1471, 0x0090 }, { 1473, 0x0008 }, + { 1474, 0x0000 }, { 1474, 0x4080 }, { 1476, 0x0388 }, { 1480, 0x2000 }, + /* 0x6100 */ + { 1481, 0x1080 }, { 1483, 0x0200 }, { 1484, 0x0000 }, { 1484, 0x2001 }, + { 1486, 0x0004 }, { 1487, 0x1201 }, { 1490, 0x8011 }, { 1493, 0x2000 }, + { 1494, 0x0082 }, { 1496, 0x1320 }, { 1500, 0x0000 }, { 1500, 0x0280 }, + { 1502, 0x8001 }, { 1504, 0x0409 }, { 1507, 0x0004 }, { 1508, 0x0000 }, + /* 0x6200 */ + { 1508, 0x0000 }, { 1508, 0x0000 }, { 1508, 0x1000 }, { 1509, 0x0280 }, + { 1511, 0x1000 }, { 1512, 0x0000 }, { 1512, 0x0100 }, { 1513, 0x0000 }, + { 1513, 0x0024 }, { 1515, 0x2001 }, { 1517, 0x0050 }, { 1519, 0x0000 }, + { 1519, 0x0028 }, { 1521, 0x8020 }, { 1523, 0x0020 }, { 1524, 0x0000 }, + /* 0x6300 */ + { 1524, 0x0000 }, { 1524, 0x0100 }, { 1525, 0x4000 }, { 1526, 0x00a2 }, + { 1529, 0x0000 }, { 1529, 0x0000 }, { 1529, 0x1010 }, { 1531, 0x8200 }, + { 1533, 0x0800 }, { 1534, 0x0000 }, { 1534, 0x0000 }, { 1534, 0x0200 }, + { 1535, 0x0002 }, { 1536, 0x4002 }, { 1538, 0x0044 }, { 1540, 0x5900 }, + /* 0x6400 */ + { 1544, 0x0080 }, { 1545, 0x0000 }, { 1545, 0x0000 }, { 1545, 0x0d04 }, + { 1549, 0x0000 }, { 1549, 0x0400 }, { 1550, 0x0000 }, { 1550, 0x1002 }, + { 1552, 0x2000 }, { 1553, 0x0002 }, { 1554, 0x8000 }, { 1555, 0x0050 }, + { 1557, 0x0001 }, { 1558, 0x2008 }, { 1560, 0x04a2 }, { 1564, 0x0000 }, + /* 0x6500 */ + { 1564, 0x0400 }, { 1565, 0xc002 }, { 1568, 0x0000 }, { 1568, 0x0031 }, + { 1571, 0x2000 }, { 1572, 0x8000 }, { 1573, 0x2800 }, { 1575, 0x0000 }, + { 1575, 0x0360 }, { 1579, 0x0000 }, { 1579, 0x0000 }, { 1579, 0x4020 }, + { 1581, 0x0000 }, { 1581, 0x0012 }, { 1583, 0x0009 }, { 1585, 0x8000 }, + /* 0x6600 */ + { 1586, 0x0000 }, { 1586, 0x4100 }, { 1588, 0x0008 }, { 1589, 0x0001 }, + { 1590, 0x0910 }, { 1593, 0x0088 }, { 1595, 0x0888 }, { 1598, 0x2008 }, + { 1600, 0x4020 }, { 1602, 0x0404 }, { 1604, 0x2010 }, { 1606, 0x8048 }, + { 1609, 0x6000 }, { 1611, 0x0000 }, { 1611, 0x0000 }, { 1611, 0x0002 }, + /* 0x6700 */ + { 1612, 0x5004 }, { 1615, 0x4040 }, { 1617, 0x0020 }, { 1618, 0x0040 }, + { 1619, 0x0010 }, { 1620, 0x0000 }, { 1620, 0x0086 }, { 1623, 0x0000 }, + { 1623, 0x8000 }, { 1624, 0x0000 }, { 1624, 0x1011 }, { 1627, 0x8002 }, + { 1629, 0x0000 }, { 1629, 0x00c0 }, { 1631, 0x0000 }, { 1631, 0x4200 }, + /* 0x6800 */ + { 1633, 0x201f }, { 1639, 0x4801 }, { 1642, 0x0004 }, { 1643, 0x40c0 }, + { 1646, 0x0480 }, { 1648, 0x2060 }, { 1651, 0x0020 }, { 1652, 0x0000 }, + { 1652, 0x0110 }, { 1654, 0x0100 }, { 1655, 0x0040 }, { 1656, 0x2240 }, + { 1659, 0x0428 }, { 1662, 0x0000 }, { 1662, 0x0000 }, { 1662, 0x0000 }, + /* 0x6900 */ + { 1662, 0x020f }, { 1667, 0x0d00 }, { 1670, 0x1000 }, { 1671, 0x4040 }, + { 1673, 0x0048 }, { 1675, 0x0020 }, { 1676, 0x0092 }, { 1679, 0x000c }, + { 1681, 0x0421 }, { 1684, 0x8100 }, { 1686, 0x0004 }, { 1687, 0x0004 }, + { 1688, 0x0001 }, { 1689, 0x0062 }, { 1692, 0x0202 }, { 1694, 0x0600 }, + /* 0x6a00 */ + { 1696, 0x1808 }, { 1699, 0x1400 }, { 1701, 0x3800 }, { 1704, 0x0008 }, + { 1705, 0x1020 }, { 1707, 0x008c }, { 1710, 0x0020 }, { 1711, 0x0412 }, + { 1714, 0x8404 }, { 1717, 0x2200 }, { 1719, 0x0880 }, { 1721, 0x4026 }, + { 1725, 0x0700 }, { 1728, 0x0110 }, { 1730, 0x0000 }, { 1730, 0x0040 }, + /* 0x6b00 */ + { 1731, 0x0020 }, { 1732, 0x2000 }, { 1733, 0x0000 }, { 1733, 0x0020 }, + { 1734, 0x0000 }, { 1734, 0x0084 }, { 1736, 0x8000 }, { 1737, 0x0410 }, + { 1739, 0x0002 }, { 1740, 0x0000 }, { 1740, 0x0000 }, { 1740, 0x0000 }, + { 1740, 0x0002 }, { 1741, 0x1000 }, { 1742, 0x0402 }, { 1744, 0x0400 }, + /* 0x6c00 */ + { 1745, 0x0000 }, { 1745, 0x1000 }, { 1746, 0x0000 }, { 1746, 0x26a2 }, + { 1752, 0x0200 }, { 1753, 0x0500 }, { 1755, 0x4000 }, { 1756, 0x8220 }, + { 1759, 0x0000 }, { 1759, 0x8000 }, { 1760, 0x8404 }, { 1763, 0x0004 }, + { 1764, 0x4800 }, { 1766, 0x8000 }, { 1767, 0x0400 }, { 1768, 0x0000 }, + /* 0x6d00 */ + { 1768, 0x0064 }, { 1771, 0x0000 }, { 1771, 0x0050 }, { 1773, 0x0000 }, + { 1773, 0x4000 }, { 1774, 0x1880 }, { 1777, 0x0000 }, { 1777, 0x0006 }, + { 1779, 0x8002 }, { 1781, 0x0040 }, { 1782, 0x0030 }, { 1784, 0x0202 }, + { 1786, 0x0000 }, { 1786, 0x0000 }, { 1786, 0x0000 }, { 1786, 0x0000 }, + /* 0x6e00 */ + { 1786, 0x8414 }, { 1790, 0x0120 }, { 1792, 0x0600 }, { 1794, 0x0000 }, + { 1794, 0x8000 }, { 1795, 0x0201 }, { 1797, 0x0000 }, { 1797, 0x1040 }, + { 1799, 0x0840 }, { 1801, 0x0400 }, { 1802, 0x0000 }, { 1802, 0x0920 }, + { 1805, 0x0000 }, { 1805, 0x2e00 }, { 1809, 0x0304 }, { 1812, 0x0400 }, + /* 0x6f00 */ + { 1813, 0x1810 }, { 1816, 0x00c0 }, { 1818, 0x0010 }, { 1819, 0x2010 }, + { 1821, 0x0010 }, { 1822, 0x1040 }, { 1824, 0x0000 }, { 1824, 0x0210 }, + { 1826, 0x0402 }, { 1828, 0xa000 }, { 1830, 0x0000 }, { 1830, 0x4820 }, + { 1833, 0x0000 }, { 1833, 0x0608 }, { 1836, 0x0000 }, { 1836, 0x0140 }, + /* 0x7000 */ + { 1838, 0x0008 }, { 1839, 0x4000 }, { 1840, 0x1000 }, { 1841, 0x0000 }, + { 1841, 0x0800 }, { 1842, 0x1011 }, { 1845, 0x9080 }, { 1848, 0xc220 }, + { 1852, 0x8a02 }, { 1856, 0x0000 }, { 1856, 0x00e9 }, { 1861, 0x3a00 }, + { 1865, 0x1011 }, { 1868, 0x8061 }, { 1872, 0x0000 }, { 1872, 0x4022 }, + /* 0x7100 */ + { 1875, 0x0020 }, { 1876, 0x2000 }, { 1877, 0x1a00 }, { 1880, 0x4838 }, + { 1885, 0x8421 }, { 1889, 0x0002 }, { 1890, 0x0800 }, { 1891, 0x54ea }, + { 1899, 0x5100 }, { 1902, 0x0140 }, { 1904, 0x200c }, { 1907, 0x0490 }, + { 1910, 0x0000 }, { 1910, 0x2002 }, { 1912, 0x0800 }, { 1913, 0x0060 }, + /* 0x7200 */ + { 1915, 0xc200 }, { 1918, 0x00e0 }, { 1921, 0x4810 }, { 1924, 0x0000 }, + { 1924, 0x0001 }, { 1925, 0x10a1 }, { 1929, 0x0040 }, { 1930, 0x0000 }, + { 1930, 0x8084 }, { 1933, 0x8010 }, { 1935, 0x2000 }, { 1936, 0x0004 }, + { 1937, 0x2000 }, { 1938, 0x0000 }, { 1938, 0x0004 }, { 1939, 0x0000 }, + /* 0x7300 */ + { 1939, 0x0014 }, { 1941, 0x0001 }, { 1942, 0x5d00 }, { 1947, 0x0300 }, + { 1949, 0x8102 }, { 1952, 0x0000 }, { 1952, 0x0000 }, { 1952, 0x0012 }, + { 1954, 0x8000 }, { 1955, 0x5100 }, { 1958, 0x0480 }, { 1960, 0x0000 }, + { 1960, 0xc200 }, { 1963, 0x0021 }, { 1965, 0x8056 }, { 1970, 0x0a88 }, + /* 0x7400 */ + { 1974, 0x0000 }, { 1974, 0xd2b6 }, { 1983, 0x0000 }, { 1983, 0x1380 }, + { 1987, 0x03a8 }, { 1992, 0x2048 }, { 1995, 0x1921 }, { 2000, 0x0450 }, + { 2003, 0x3004 }, { 2006, 0x0a00 }, { 2008, 0x0010 }, { 2009, 0x0010 }, + { 2010, 0x1100 }, { 2012, 0x0009 }, { 2014, 0x0080 }, { 2015, 0x0107 }, + /* 0x7500 */ + { 2019, 0x4020 }, { 2021, 0x4200 }, { 2023, 0x0000 }, { 2023, 0x0830 }, + { 2026, 0x2444 }, { 2030, 0x002a }, { 2033, 0x6081 }, { 2037, 0x0404 }, + { 2039, 0x6008 }, { 2042, 0x4004 }, { 2044, 0x0000 }, { 2044, 0x0012 }, + { 2046, 0x0108 }, { 2048, 0x1000 }, { 2049, 0x0000 }, { 2049, 0x0000 }, + /* 0x7600 */ + { 2049, 0x0084 }, { 2051, 0x0000 }, { 2051, 0x1000 }, { 2052, 0x0800 }, + { 2053, 0xe001 }, { 2057, 0x0012 }, { 2059, 0x80c0 }, { 2062, 0x0458 }, + { 2066, 0x0000 }, { 2066, 0x0001 }, { 2067, 0x0022 }, { 2069, 0x0080 }, + { 2070, 0x1000 }, { 2071, 0x0040 }, { 2072, 0x0000 }, { 2072, 0x0000 }, + /* 0x7700 */ + { 2072, 0xd000 }, { 2075, 0x4000 }, { 2076, 0x0850 }, { 2079, 0x0000 }, + { 2079, 0x0009 }, { 2081, 0x0100 }, { 2082, 0x0000 }, { 2082, 0x0d84 }, + { 2087, 0x0000 }, { 2087, 0x0108 }, { 2089, 0x8000 }, { 2090, 0x4200 }, + { 2092, 0x0828 }, { 2095, 0x0000 }, { 2095, 0x0040 }, { 2096, 0x4010 }, + /* 0x7800 */ + { 2098, 0x0100 }, { 2099, 0x5100 }, { 2102, 0x0000 }, { 2102, 0x3200 }, + { 2105, 0x0894 }, { 2109, 0x001a }, { 2112, 0x0040 }, { 2113, 0x0400 }, + { 2114, 0x2102 }, { 2117, 0x0000 }, { 2117, 0x8000 }, { 2118, 0x0342 }, + { 2122, 0x0080 }, { 2123, 0x018c }, { 2127, 0x4000 }, { 2128, 0x0023 }, + /* 0x7900 */ + { 2131, 0x0040 }, { 2132, 0x0000 }, { 2132, 0x4000 }, { 2133, 0x185c }, + { 2139, 0x0000 }, { 2139, 0x0300 }, { 2141, 0x0004 }, { 2142, 0x4002 }, + { 2144, 0x00c9 }, { 2148, 0xa202 }, { 2152, 0x0220 }, { 2154, 0x0000 }, + { 2154, 0x1050 }, { 2157, 0x0010 }, { 2158, 0x0004 }, { 2159, 0x0012 }, + /* 0x7a00 */ + { 2161, 0x0040 }, { 2162, 0x0000 }, { 2162, 0x2000 }, { 2163, 0x4400 }, + { 2165, 0x0228 }, { 2168, 0x0000 }, { 2168, 0x0020 }, { 2169, 0x2000 }, + { 2170, 0x0008 }, { 2171, 0x0002 }, { 2172, 0x0000 }, { 2172, 0x1801 }, + { 2175, 0x830c }, { 2180, 0x3c08 }, { 2185, 0x0684 }, { 2189, 0x4000 }, + /* 0x7b00 */ + { 2190, 0x1800 }, { 2192, 0x8010 }, { 2194, 0x0280 }, { 2196, 0x0200 }, + { 2197, 0x000c }, { 2199, 0x0020 }, { 2200, 0x9004 }, { 2203, 0x0800 }, + { 2204, 0x0000 }, { 2204, 0x0004 }, { 2205, 0x000c }, { 2207, 0x0004 }, + { 2208, 0x8000 }, { 2209, 0x0001 }, { 2210, 0x0000 }, { 2210, 0x1400 }, + /* 0x7c00 */ + { 2212, 0x0000 }, { 2212, 0x0824 }, { 2215, 0x0000 }, { 2215, 0x0020 }, + { 2216, 0x0014 }, { 2218, 0x2042 }, { 2221, 0x2000 }, { 2222, 0x5811 }, + { 2227, 0x4048 }, { 2230, 0x1000 }, { 2231, 0x50c0 }, { 2235, 0x0100 }, + { 2236, 0x2284 }, { 2240, 0x0408 }, { 2242, 0x2040 }, { 2244, 0x1228 }, + /* 0x7d00 */ + { 2248, 0x0000 }, { 2248, 0x0000 }, { 2248, 0x0020 }, { 2249, 0x0000 }, + { 2249, 0x2000 }, { 2250, 0x2400 }, { 2252, 0x0000 }, { 2252, 0x0000 }, + { 2252, 0x0200 }, { 2253, 0x0080 }, { 2254, 0x0910 }, { 2257, 0x0008 }, + { 2258, 0xa000 }, { 2260, 0x1019 }, { 2264, 0x0030 }, { 2266, 0x6020 }, + /* 0x7e00 */ + { 2269, 0x0080 }, { 2270, 0x0000 }, { 2270, 0x0080 }, { 2271, 0x0000 }, + { 2271, 0x0000 }, { 2271, 0x0000 }, { 2271, 0x40a0 }, { 2274, 0x8000 }, + { 2275, 0x4000 }, { 2276, 0x8004 }, { 2278, 0x1010 }, { 2280, 0x0400 }, + { 2281, 0x8080 }, { 2283, 0x8000 }, { 2284, 0x0000 }, { 2284, 0x0000 }, + /* 0x7f00 */ + { 2284, 0x0040 }, { 2285, 0x0000 }, { 2285, 0x0000 }, { 2285, 0x0080 }, + { 2286, 0x4283 }, { 2291, 0x000c }, { 2293, 0x0000 }, { 2293, 0x0102 }, + { 2295, 0x8000 }, { 2296, 0x0088 }, { 2298, 0x4008 }, { 2300, 0x0010 }, + { 2301, 0x0000 }, { 2301, 0x2000 }, { 2302, 0x0080 }, { 2303, 0x0400 }, + /* 0x8000 */ + { 2304, 0x0104 }, { 2306, 0x2000 }, { 2307, 0xc021 }, { 2311, 0x1802 }, + { 2314, 0x0000 }, { 2314, 0x0810 }, { 2316, 0x004e }, { 2320, 0x0000 }, + { 2320, 0x0001 }, { 2321, 0x8000 }, { 2322, 0x0080 }, { 2323, 0x30c0 }, + { 2327, 0x0040 }, { 2328, 0x0000 }, { 2328, 0x1200 }, { 2330, 0x0040 }, + /* 0x8100 */ + { 2331, 0x5288 }, { 2336, 0x0494 }, { 2340, 0x0400 }, { 2341, 0x0094 }, + { 2344, 0x0104 }, { 2346, 0x0640 }, { 2349, 0x2000 }, { 2350, 0x1000 }, + { 2351, 0x0010 }, { 2352, 0x0008 }, { 2353, 0x0420 }, { 2355, 0x0040 }, + { 2356, 0x0102 }, { 2358, 0x0000 }, { 2358, 0x8010 }, { 2360, 0x0040 }, + /* 0x8200 */ + { 2361, 0x0000 }, { 2361, 0x0500 }, { 2363, 0x2240 }, { 2366, 0x4000 }, + { 2367, 0x0000 }, { 2367, 0x0010 }, { 2368, 0x0024 }, { 2370, 0x0e40 }, + { 2374, 0x0080 }, { 2375, 0x0000 }, { 2375, 0x0440 }, { 2377, 0x0000 }, + { 2377, 0x8410 }, { 2380, 0x0101 }, { 2382, 0x4004 }, { 2384, 0xb080 }, + /* 0x8300 */ + { 2388, 0x0800 }, { 2389, 0x2500 }, { 2392, 0x0000 }, { 2392, 0x2000 }, + { 2393, 0x0000 }, { 2393, 0x0080 }, { 2394, 0x804c }, { 2398, 0x0000 }, + { 2398, 0x0020 }, { 2399, 0x1002 }, { 2401, 0x1000 }, { 2402, 0x4200 }, + { 2404, 0x2000 }, { 2405, 0x0008 }, { 2406, 0x2000 }, { 2407, 0x0000 }, + /* 0x8400 */ + { 2407, 0x0020 }, { 2408, 0x1150 }, { 2412, 0x4053 }, { 2417, 0x4000 }, + { 2418, 0x0500 }, { 2420, 0x1128 }, { 2424, 0x0014 }, { 2426, 0x8006 }, + { 2429, 0x0101 }, { 2431, 0x004c }, { 2434, 0x2008 }, { 2436, 0x6000 }, + { 2438, 0x0000 }, { 2438, 0x4400 }, { 2440, 0x0036 }, { 2444, 0x0100 }, + /* 0x8500 */ + { 2445, 0x0028 }, { 2447, 0x0001 }, { 2448, 0x0000 }, { 2448, 0x0118 }, + { 2451, 0x1804 }, { 2454, 0x0404 }, { 2456, 0x8000 }, { 2457, 0x0009 }, + { 2459, 0x0000 }, { 2459, 0x0000 }, { 2459, 0x0000 }, { 2459, 0x0000 }, + { 2459, 0x0002 }, { 2460, 0x0000 }, { 2460, 0x4001 }, { 2462, 0x1000 }, + /* 0x8600 */ + { 2463, 0x2004 }, { 2465, 0x0051 }, { 2468, 0x8100 }, { 2470, 0x0000 }, + { 2470, 0x0024 }, { 2472, 0x0000 }, { 2472, 0x1000 }, { 2473, 0x4004 }, + { 2475, 0x0000 }, { 2475, 0x0004 }, { 2476, 0x2001 }, { 2478, 0x0004 }, + { 2479, 0x0000 }, { 2479, 0x0000 }, { 2479, 0x8000 }, { 2480, 0x0000 }, + /* 0x8700 */ + { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, + { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x2003 }, + { 2483, 0x1840 }, { 2486, 0x0000 }, { 2486, 0x0220 }, { 2488, 0x0002 }, + { 2489, 0x4002 }, { 2491, 0x0440 }, { 2493, 0x4000 }, { 2494, 0x0020 }, + /* 0x8800 */ + { 2495, 0x8010 }, { 2497, 0x0100 }, { 2498, 0x2080 }, { 2500, 0x0000 }, + { 2500, 0x8064 }, { 2504, 0x4000 }, { 2505, 0x4031 }, { 2509, 0x0000 }, + { 2509, 0x0090 }, { 2511, 0x1000 }, { 2512, 0x4001 }, { 2514, 0x8030 }, + { 2517, 0x80a0 }, { 2520, 0x0000 }, { 2520, 0x0040 }, { 2521, 0x8020 }, + /* 0x8900 */ + { 2523, 0x0001 }, { 2524, 0x0000 }, { 2524, 0x0010 }, { 2525, 0x0000 }, + { 2525, 0x2088 }, { 2528, 0x0010 }, { 2529, 0x0020 }, { 2530, 0x0080 }, + { 2531, 0x0681 }, { 2535, 0x0012 }, { 2537, 0x02a0 }, { 2540, 0x1000 }, + { 2541, 0x0042 }, { 2543, 0x0000 }, { 2543, 0x0080 }, { 2544, 0x0000 }, + /* 0x8a00 */ + { 2544, 0x0000 }, { 2544, 0x1000 }, { 2545, 0x0a00 }, { 2547, 0x2100 }, + { 2549, 0x0200 }, { 2550, 0x0000 }, { 2550, 0x0080 }, { 2551, 0x4000 }, + { 2552, 0x0000 }, { 2552, 0x1011 }, { 2555, 0x8200 }, { 2557, 0x0010 }, + { 2558, 0x0000 }, { 2558, 0x0400 }, { 2559, 0x0400 }, { 2560, 0x0000 }, + /* 0x8b00 */ + { 2560, 0x1000 }, { 2561, 0x8000 }, { 2562, 0x2000 }, { 2563, 0x8000 }, + { 2564, 0x3008 }, { 2567, 0x4000 }, { 2568, 0x0204 }, { 2570, 0x0000 }, + { 2570, 0x0002 }, { 2571, 0x0801 }, { 2573, 0x0001 }, { 2574, 0x4000 }, + { 2575, 0x0000 }, { 2575, 0x0000 }, { 2575, 0x0004 }, { 2576, 0x0000 }, + /* 0x8c00 */ + { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0000 }, + { 2576, 0x0000 }, { 2576, 0x0002 }, { 2577, 0x0000 }, { 2577, 0x0000 }, + { 2577, 0x0000 }, { 2577, 0x8800 }, { 2579, 0x2000 }, { 2580, 0x0000 }, + { 2580, 0x2000 }, { 2581, 0x0850 }, { 2584, 0x0a00 }, { 2586, 0x0084 }, + /* 0x8d00 */ + { 2588, 0x1808 }, { 2591, 0x3106 }, { 2596, 0x0000 }, { 2596, 0x0000 }, + { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0400 }, + { 2597, 0x0004 }, { 2598, 0x0000 }, { 2598, 0x0240 }, { 2600, 0x0000 }, + { 2600, 0x0009 }, { 2602, 0x0010 }, { 2603, 0x0000 }, { 2603, 0x0000 }, + /* 0x8e00 */ + { 2603, 0x4002 }, { 2605, 0x0000 }, { 2605, 0x2500 }, { 2608, 0x0400 }, + { 2609, 0x8040 }, { 2611, 0x0000 }, { 2611, 0x0100 }, { 2612, 0x40a2 }, + { 2616, 0x0001 }, { 2617, 0x0000 }, { 2617, 0x2080 }, { 2619, 0x1041 }, + { 2622, 0x4008 }, { 2624, 0x0400 }, { 2625, 0x2014 }, { 2628, 0x0004 }, + /* 0x8f00 */ + { 2629, 0x0000 }, { 2629, 0x0200 }, { 2630, 0x2000 }, { 2631, 0x0001 }, + { 2632, 0x0402 }, { 2634, 0x1000 }, { 2635, 0x40c0 }, { 2638, 0x0000 }, + { 2638, 0x0000 }, { 2638, 0x0008 }, { 2639, 0x0021 }, { 2641, 0x5fe8 }, + { 2651, 0x1402 }, { 2654, 0x0401 }, { 2656, 0x0000 }, { 2656, 0x0200 }, + /* 0x9000 */ + { 2657, 0x0100 }, { 2658, 0x0004 }, { 2659, 0x0000 }, { 2659, 0x0088 }, + { 2661, 0x1000 }, { 2662, 0x0040 }, { 2663, 0x1012 }, { 2666, 0x0000 }, + { 2666, 0x0000 }, { 2666, 0x0000 }, { 2666, 0x4100 }, { 2668, 0x0800 }, + { 2669, 0x0010 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, + /* 0x9100 */ + { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, + { 2670, 0x0000 }, { 2670, 0x5202 }, { 2674, 0x0080 }, { 2675, 0x1041 }, + { 2678, 0x5000 }, { 2680, 0x0000 }, { 2680, 0x0200 }, { 2681, 0x0840 }, + { 2683, 0x0010 }, { 2684, 0x8040 }, { 2686, 0x0020 }, { 2687, 0x4400 }, + /* 0x9200 */ + { 2689, 0x4100 }, { 2691, 0x0008 }, { 2692, 0x0d00 }, { 2695, 0x1020 }, + { 2697, 0x0012 }, { 2699, 0xa120 }, { 2703, 0x4804 }, { 2706, 0x0080 }, + { 2707, 0x8212 }, { 2711, 0x0000 }, { 2711, 0x4000 }, { 2712, 0xc602 }, + { 2717, 0x0000 }, { 2717, 0x0810 }, { 2719, 0x1828 }, { 2723, 0x205c }, + /* 0x9300 */ + { 2728, 0x0088 }, { 2730, 0x0000 }, { 2730, 0x1000 }, { 2731, 0x0003 }, + { 2733, 0x013f }, { 2740, 0x8000 }, { 2741, 0x4b44 }, { 2747, 0x2118 }, + { 2751, 0x00f2 }, { 2756, 0x1001 }, { 2758, 0x2001 }, { 2760, 0xa900 }, + { 2764, 0x0840 }, { 2766, 0x0808 }, { 2768, 0x0001 }, { 2769, 0x000b }, + /* 0x9400 */ + { 2772, 0x0112 }, { 2775, 0x2880 }, { 2778, 0x20f0 }, { 2783, 0x4000 }, + { 2784, 0x200c }, { 2787, 0x0910 }, { 2790, 0x10a0 }, { 2793, 0x0a00 }, + { 2795, 0x0020 }, { 2796, 0x8000 }, { 2797, 0x0004 }, { 2798, 0x0000 }, + { 2798, 0x000a }, { 2800, 0x1000 }, { 2801, 0x0000 }, { 2801, 0x0040 }, + /* 0x9500 */ + { 2802, 0x0000 }, { 2802, 0x0000 }, { 2802, 0x2000 }, { 2803, 0x0000 }, + { 2803, 0x0080 }, { 2804, 0x0000 }, { 2804, 0x0000 }, { 2804, 0x8100 }, + { 2806, 0x0020 }, { 2807, 0x02c0 }, { 2810, 0x04c5 }, { 2815, 0x0000 }, + { 2815, 0x0000 }, { 2815, 0x0000 }, { 2815, 0x0100 }, { 2816, 0x0010 }, + /* 0x9600 */ + { 2817, 0x0000 }, { 2817, 0x2000 }, { 2818, 0x0000 }, { 2818, 0x0108 }, + { 2820, 0x0022 }, { 2822, 0x0040 }, { 2823, 0x0200 }, { 2824, 0x0800 }, + { 2825, 0x8002 }, { 2827, 0x0040 }, { 2828, 0x0028 }, { 2830, 0x2040 }, + { 2832, 0x0000 }, { 2832, 0x0000 }, { 2832, 0x0000 }, { 2832, 0x0010 }, + /* 0x9700 */ + { 2833, 0x0008 }, { 2834, 0x0800 }, { 2835, 0x0002 }, { 2836, 0x0042 }, + { 2838, 0x0003 }, { 2840, 0xa082 }, { 2844, 0x2000 }, { 2845, 0x0002 }, + { 2846, 0x0280 }, { 2848, 0x8800 }, { 2850, 0x0000 }, { 2850, 0x6516 }, + { 2857, 0x0105 }, { 2860, 0x0004 }, { 2861, 0x4041 }, { 2864, 0x0024 }, + /* 0x9800 */ + { 2866, 0x0000 }, { 2866, 0x8030 }, { 2869, 0x4008 }, { 2871, 0x0018 }, + { 2873, 0x0880 }, { 2875, 0x0000 }, { 2875, 0x1040 }, { 2877, 0x0020 }, + { 2878, 0x0000 }, { 2878, 0x0000 }, { 2878, 0x0000 }, { 2878, 0x0290 }, + { 2881, 0x4588 }, { 2886, 0x5000 }, { 2888, 0x1043 }, { 2892, 0x0022 }, + /* 0x9900 */ + { 2894, 0x4000 }, { 2895, 0x1200 }, { 2897, 0x0000 }, { 2897, 0x0b80 }, + { 2901, 0x2405 }, { 2905, 0x2000 }, { 2906, 0x000c }, { 2908, 0x0000 }, + { 2908, 0x0000 }, { 2908, 0x0800 }, { 2909, 0x0410 }, { 2911, 0x1100 }, + { 2913, 0x0030 }, { 2915, 0x0400 }, { 2916, 0x0042 }, { 2918, 0x0020 }, + /* 0x9a00 */ + { 2919, 0x1000 }, { 2920, 0x8001 }, { 2922, 0x8042 }, { 2925, 0x1800 }, + { 2927, 0x0000 }, { 2927, 0x1100 }, { 2929, 0x1008 }, { 2931, 0x0000 }, + { 2931, 0x8000 }, { 2932, 0x0000 }, { 2932, 0x0000 }, { 2932, 0x2444 }, + { 2936, 0x0000 }, { 2936, 0x0080 }, { 2937, 0x0005 }, { 2939, 0x8010 }, + /* 0x9b00 */ + { 2941, 0x8204 }, { 2944, 0x0010 }, { 2945, 0x2400 }, { 2947, 0x0210 }, + { 2949, 0x0001 }, { 2950, 0x0001 }, { 2951, 0x0200 }, { 2952, 0x8000 }, + { 2953, 0xe80a }, { 2959, 0xa080 }, { 2962, 0x0000 }, { 2962, 0x0001 }, + { 2963, 0x8000 }, { 2964, 0x2000 }, { 2965, 0x2200 }, { 2967, 0x8012 }, + /* 0x9c00 */ + { 2970, 0x1404 }, { 2973, 0x8821 }, { 2977, 0x8041 }, { 2980, 0x0420 }, + { 2982, 0x8020 }, { 2984, 0x2008 }, { 2986, 0x0000 }, { 2986, 0x1804 }, + { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, + { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, + /* 0x9d00 */ + { 2989, 0x1004 }, { 2991, 0x0040 }, { 2992, 0x0002 }, { 2993, 0x0210 }, + { 2995, 0x4210 }, { 2998, 0x4001 }, { 3000, 0x6000 }, { 3002, 0x5000 }, + { 3004, 0x0008 }, { 3005, 0x0008 }, { 3006, 0x0820 }, { 3008, 0x2000 }, + { 3009, 0x0211 }, { 3012, 0x0010 }, { 3013, 0x0000 }, { 3013, 0x1000 }, + /* 0x9e00 */ + { 3014, 0x5400 }, { 3017, 0x9100 }, { 3020, 0x0000 }, { 3020, 0x0000 }, + { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0800 }, + { 3021, 0x0032 }, { 3024, 0x4161 }, { 3029, 0x9d44 }, { 3036, 0xa002 }, + { 3039, 0x00d2 }, { 3043, 0x0000 }, { 3043, 0x0004 }, { 3044, 0x4102 }, + /* 0x9f00 */ + { 3047, 0x0104 }, { 3049, 0x0080 }, { 3050, 0x00c0 }, { 3052, 0x0200 }, + { 3053, 0x0030 }, { 3055, 0x0409 }, { 3058, 0x0204 }, { 3060, 0x8000 }, + { 3061, 0x4000 }, { 3062, 0x8200 }, { 3064, 0x0020 }, { 3065, 0x0003 }, +}; +static const Summary16 hkscs1999_uni2indx_pagef9[1] = { + /* 0xf900 */ + { 3067, 0x0080 }, +}; +static const Summary16 hkscs1999_uni2indx_pageff[15] = { + /* 0xff00 */ + { 3068, 0x0084 }, { 3070, 0x0000 }, { 3070, 0x0000 }, { 3070, 0x2800 }, + { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, + { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, + { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x2014 }, +}; +static const Summary16 hkscs1999_uni2indx_page200[2335] = { + /* 0x20000 */ + { 3075, 0x0000 }, { 3075, 0x0000 }, { 3075, 0x0002 }, { 3076, 0x4000 }, + { 3077, 0x4040 }, { 3079, 0x0000 }, { 3079, 0x0100 }, { 3080, 0x0000 }, + { 3080, 0x04c0 }, { 3083, 0x0010 }, { 3084, 0x0000 }, { 3084, 0x0000 }, + { 3084, 0x3c00 }, { 3088, 0x0002 }, { 3089, 0x4000 }, { 3090, 0x0000 }, + /* 0x20100 */ + { 3090, 0x5000 }, { 3092, 0x0100 }, { 3093, 0x0000 }, { 3093, 0x0000 }, + { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, + { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0a00 }, { 3095, 0x0000 }, + { 3095, 0x0002 }, { 3096, 0x0010 }, { 3097, 0x0000 }, { 3097, 0x0004 }, + /* 0x20200 */ + { 3098, 0x1010 }, { 3100, 0x0010 }, { 3101, 0x0000 }, { 3101, 0x0000 }, + { 3101, 0x0000 }, { 3101, 0x0800 }, { 3102, 0x0000 }, { 3102, 0x0030 }, + { 3104, 0x0000 }, { 3104, 0x4200 }, { 3106, 0x0001 }, { 3107, 0x8080 }, + { 3109, 0x0001 }, { 3110, 0x0000 }, { 3110, 0x0020 }, { 3111, 0x0000 }, + /* 0x20300 */ + { 3111, 0x0400 }, { 3112, 0x0000 }, { 3112, 0x0020 }, { 3113, 0x0000 }, + { 3113, 0x00e2 }, { 3117, 0x0000 }, { 3117, 0x0000 }, { 3117, 0xc000 }, + { 3119, 0x0001 }, { 3120, 0x0000 }, { 3120, 0x0081 }, { 3122, 0x0020 }, + { 3123, 0x0a00 }, { 3125, 0x0000 }, { 3125, 0x0000 }, { 3125, 0x1020 }, + /* 0x20400 */ + { 3127, 0x0000 }, { 3127, 0x8018 }, { 3130, 0x0000 }, { 3130, 0x0000 }, + { 3130, 0x0000 }, { 3130, 0x0000 }, { 3130, 0x0020 }, { 3131, 0x0000 }, + { 3131, 0x4080 }, { 3133, 0x0006 }, { 3135, 0x0008 }, { 3136, 0x0000 }, + { 3136, 0x0000 }, { 3136, 0x0080 }, { 3137, 0x0000 }, { 3137, 0x5000 }, + /* 0x20500 */ + { 3139, 0x0000 }, { 3139, 0x0000 }, { 3139, 0x0000 }, { 3139, 0x0000 }, + { 3139, 0x0080 }, { 3140, 0x0000 }, { 3140, 0x0000 }, { 3140, 0x0000 }, + { 3140, 0x4000 }, { 3141, 0x0000 }, { 3141, 0x0020 }, { 3142, 0x0008 }, + { 3143, 0x0408 }, { 3145, 0x8021 }, { 3148, 0x0801 }, { 3150, 0x0000 }, + /* 0x20600 */ + { 3150, 0x0000 }, { 3150, 0x0622 }, { 3154, 0x0000 }, { 3154, 0x0001 }, + { 3155, 0x0000 }, { 3155, 0x0040 }, { 3156, 0x0000 }, { 3156, 0x0040 }, + { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, + { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, + /* 0x20700 */ + { 3157, 0x4000 }, { 3158, 0x0000 }, { 3158, 0x0000 }, { 3158, 0x0002 }, + { 3159, 0x0000 }, { 3159, 0x0000 }, { 3159, 0x0000 }, { 3159, 0x0200 }, + { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, + { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, + /* 0x20800 */ + { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x1000 }, { 3161, 0x0000 }, + { 3161, 0x0000 }, { 3161, 0x0000 }, { 3161, 0x0000 }, { 3161, 0x0008 }, + { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0000 }, + { 3162, 0x0000 }, { 3162, 0x0020 }, { 3163, 0x0000 }, { 3163, 0x0000 }, + /* 0x20900 */ + { 3163, 0x0000 }, { 3163, 0x0040 }, { 3164, 0x0008 }, { 3165, 0x0000 }, + { 3165, 0x0000 }, { 3165, 0x0010 }, { 3166, 0x0000 }, { 3166, 0x0200 }, + { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, + { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0080 }, { 3168, 0x0000 }, + /* 0x20a00 */ + { 3168, 0x0000 }, { 3168, 0x0002 }, { 3169, 0x0000 }, { 3169, 0x0000 }, + { 3169, 0x0000 }, { 3169, 0x0001 }, { 3170, 0x0000 }, { 3170, 0x0000 }, + { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0010 }, + { 3171, 0x2004 }, { 3173, 0x0000 }, { 3173, 0x0000 }, { 3173, 0x0000 }, + /* 0x20b00 */ + { 3173, 0x2000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, + { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, + { 3174, 0x8000 }, { 3175, 0x0000 }, { 3175, 0x0300 }, { 3177, 0x8000 }, + { 3178, 0x0840 }, { 3180, 0x0000 }, { 3180, 0x0804 }, { 3182, 0x8800 }, + /* 0x20c00 */ + { 3184, 0x2800 }, { 3186, 0x0000 }, { 3186, 0x0001 }, { 3187, 0x0c10 }, + { 3190, 0x000e }, { 3193, 0x0008 }, { 3194, 0x0020 }, { 3195, 0x1180 }, + { 3198, 0x2000 }, { 3199, 0x1040 }, { 3201, 0x0000 }, { 3201, 0x0120 }, + { 3203, 0x8000 }, { 3204, 0x2078 }, { 3209, 0x2000 }, { 3210, 0x8000 }, + /* 0x20d00 */ + { 3211, 0x0000 }, { 3211, 0x0020 }, { 3212, 0x0100 }, { 3213, 0x0006 }, + { 3215, 0x73c0 }, { 3222, 0x0000 }, { 3222, 0x8000 }, { 3223, 0xd012 }, + { 3228, 0x0000 }, { 3228, 0x1040 }, { 3230, 0x0080 }, { 3231, 0x0004 }, + { 3232, 0x0100 }, { 3233, 0x0000 }, { 3233, 0x0000 }, { 3233, 0x0000 }, + /* 0x20e00 */ + { 3233, 0xe610 }, { 3239, 0x2043 }, { 3243, 0x0000 }, { 3243, 0x0000 }, + { 3243, 0x1000 }, { 3244, 0x0000 }, { 3244, 0x2000 }, { 3245, 0x0fe8 }, + { 3253, 0x1000 }, { 3254, 0x2140 }, { 3257, 0x1c04 }, { 3261, 0x0040 }, + { 3262, 0x0000 }, { 3262, 0x2180 }, { 3265, 0x0000 }, { 3265, 0x0f00 }, + /* 0x20f00 */ + { 3269, 0x0000 }, { 3269, 0x2000 }, { 3270, 0x6040 }, { 3273, 0x0803 }, + { 3276, 0x1000 }, { 3277, 0x0000 }, { 3277, 0x0010 }, { 3278, 0x0000 }, + { 3278, 0x2000 }, { 3279, 0x0001 }, { 3280, 0x2000 }, { 3281, 0x1070 }, + { 3285, 0x0000 }, { 3285, 0x8000 }, { 3286, 0x3c00 }, { 3290, 0x0000 }, + /* 0x21000 */ + { 3290, 0x0000 }, { 3290, 0x6010 }, { 3293, 0x0000 }, { 3293, 0x0000 }, + { 3293, 0x8000 }, { 3294, 0x1000 }, { 3295, 0x8000 }, { 3296, 0x09e0 }, + { 3301, 0x0100 }, { 3302, 0x2040 }, { 3304, 0x0000 }, { 3304, 0x8010 }, + { 3306, 0x8383 }, { 3312, 0x0008 }, { 3313, 0x0010 }, { 3314, 0x0070 }, + /* 0x21100 */ + { 3317, 0x0000 }, { 3317, 0x0000 }, { 3317, 0x8000 }, { 3318, 0x2800 }, + { 3320, 0x8120 }, { 3323, 0x0000 }, { 3323, 0x0000 }, { 3323, 0x0000 }, + { 3323, 0x0081 }, { 3325, 0x0000 }, { 3325, 0x0000 }, { 3325, 0x0000 }, + { 3325, 0x0000 }, { 3325, 0x0200 }, { 3326, 0x0000 }, { 3326, 0x0000 }, + /* 0x21200 */ + { 3326, 0x0000 }, { 3326, 0x0000 }, { 3326, 0x0000 }, { 3326, 0x1000 }, + { 3327, 0x8000 }, { 3328, 0x0000 }, { 3328, 0x0000 }, { 3328, 0x1000 }, + { 3329, 0x0000 }, { 3329, 0x0000 }, { 3329, 0x0300 }, { 3331, 0x0001 }, + { 3332, 0x0000 }, { 3332, 0x0000 }, { 3332, 0x0008 }, { 3333, 0x4000 }, + /* 0x21300 */ + { 3334, 0x003c }, { 3338, 0x0000 }, { 3338, 0x0000 }, { 3338, 0x0440 }, + { 3340, 0x0000 }, { 3340, 0x0000 }, { 3340, 0x0000 }, { 3340, 0x0060 }, + { 3342, 0x4000 }, { 3343, 0x1100 }, { 3345, 0x0000 }, { 3345, 0x0000 }, + { 3345, 0x0060 }, { 3347, 0x0000 }, { 3347, 0x2000 }, { 3348, 0x4000 }, + /* 0x21400 */ + { 3349, 0x0000 }, { 3349, 0x0048 }, { 3351, 0x0010 }, { 3352, 0x0000 }, + { 3352, 0x0000 }, { 3352, 0x0034 }, { 3355, 0x0000 }, { 3355, 0x0000 }, + { 3355, 0x0400 }, { 3356, 0x0080 }, { 3357, 0x0000 }, { 3357, 0x0040 }, + { 3358, 0x0000 }, { 3358, 0x0000 }, { 3358, 0x0100 }, { 3359, 0x2000 }, + /* 0x21500 */ + { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, + { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0080 }, + { 3361, 0x0004 }, { 3362, 0x0040 }, { 3363, 0x0000 }, { 3363, 0x0000 }, + { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, + /* 0x21600 */ + { 3363, 0x0400 }, { 3364, 0x0208 }, { 3366, 0x0000 }, { 3366, 0x4000 }, + { 3367, 0x0000 }, { 3367, 0x0000 }, { 3367, 0x0002 }, { 3368, 0x0000 }, + { 3368, 0x0000 }, { 3368, 0x0004 }, { 3369, 0x0000 }, { 3369, 0x0500 }, + { 3371, 0x0007 }, { 3374, 0x8028 }, { 3377, 0x01c0 }, { 3380, 0x5c00 }, + /* 0x21700 */ + { 3384, 0x2000 }, { 3385, 0x0001 }, { 3386, 0x0040 }, { 3387, 0x1c00 }, + { 3390, 0x0000 }, { 3390, 0x0080 }, { 3391, 0xf000 }, { 3395, 0x001b }, + { 3399, 0x0000 }, { 3399, 0x0000 }, { 3399, 0x0800 }, { 3400, 0x003f }, + { 3406, 0x0088 }, { 3408, 0x9e00 }, { 3413, 0x8000 }, { 3414, 0x1f60 }, + /* 0x21800 */ + { 3421, 0x0000 }, { 3421, 0x0000 }, { 3421, 0x2701 }, { 3426, 0x0e00 }, + { 3429, 0x0021 }, { 3431, 0x4004 }, { 3433, 0x001e }, { 3437, 0x0880 }, + { 3439, 0x0038 }, { 3442, 0xc000 }, { 3444, 0x0007 }, { 3447, 0xc000 }, + { 3449, 0x0000 }, { 3449, 0x03c2 }, { 3454, 0x0000 }, { 3454, 0x0400 }, + /* 0x21900 */ + { 3455, 0x0038 }, { 3458, 0x1027 }, { 3463, 0x0084 }, { 3465, 0x0800 }, + { 3466, 0x0010 }, { 3467, 0x0100 }, { 3468, 0x0400 }, { 3469, 0x1000 }, + { 3470, 0x0108 }, { 3472, 0x0040 }, { 3473, 0x0000 }, { 3473, 0x0000 }, + { 3473, 0x0000 }, { 3473, 0x0800 }, { 3474, 0x0000 }, { 3474, 0x0008 }, + /* 0x21a00 */ + { 3475, 0x0000 }, { 3475, 0x0000 }, { 3475, 0x2000 }, { 3476, 0x0010 }, + { 3477, 0x0820 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, + { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, + { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, + /* 0x21b00 */ + { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, + { 3479, 0x0010 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, + { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, + { 3480, 0x0006 }, { 3482, 0x0000 }, { 3482, 0x0000 }, { 3482, 0x0000 }, + /* 0x21c00 */ + { 3482, 0x0000 }, { 3482, 0x0000 }, { 3482, 0x0400 }, { 3483, 0x0000 }, + { 3483, 0x0000 }, { 3483, 0x0000 }, { 3483, 0x0000 }, { 3483, 0x0001 }, + { 3484, 0x0000 }, { 3484, 0x0000 }, { 3484, 0x1024 }, { 3487, 0x0000 }, + { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, + /* 0x21d00 */ + { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, + { 3487, 0x0040 }, { 3488, 0x0000 }, { 3488, 0x0000 }, { 3488, 0x0000 }, + { 3488, 0x0000 }, { 3488, 0x0001 }, { 3489, 0x0000 }, { 3489, 0x0400 }, + { 3490, 0x0400 }, { 3491, 0x0002 }, { 3492, 0x0800 }, { 3493, 0x0200 }, + /* 0x21e00 */ + { 3494, 0x0000 }, { 3494, 0x1000 }, { 3495, 0x0000 }, { 3495, 0x2080 }, + { 3497, 0x0000 }, { 3497, 0x0000 }, { 3497, 0x0000 }, { 3497, 0x0000 }, + { 3497, 0x0200 }, { 3498, 0x0000 }, { 3498, 0x0110 }, { 3500, 0x0000 }, + { 3500, 0x0100 }, { 3501, 0x0020 }, { 3502, 0x0000 }, { 3502, 0x0000 }, + /* 0x21f00 */ + { 3502, 0x8000 }, { 3503, 0x0020 }, { 3504, 0x0000 }, { 3504, 0x0000 }, + { 3504, 0x0000 }, { 3504, 0x0000 }, { 3504, 0x0400 }, { 3505, 0x0000 }, + { 3505, 0x0000 }, { 3505, 0x4000 }, { 3506, 0x0002 }, { 3507, 0x0000 }, + { 3507, 0x0000 }, { 3507, 0x0000 }, { 3507, 0x0100 }, { 3508, 0x0000 }, + /* 0x22000 */ + { 3508, 0x0000 }, { 3508, 0x0000 }, { 3508, 0x0000 }, { 3508, 0x0000 }, + { 3508, 0x0220 }, { 3510, 0x0000 }, { 3510, 0x0000 }, { 3510, 0x0000 }, + { 3510, 0x0000 }, { 3510, 0x0400 }, { 3511, 0x0000 }, { 3511, 0x0000 }, + { 3511, 0x0080 }, { 3512, 0x0000 }, { 3512, 0x0000 }, { 3512, 0x1000 }, + /* 0x22100 */ + { 3513, 0x0000 }, { 3513, 0x0000 }, { 3513, 0x0400 }, { 3514, 0x0000 }, + { 3514, 0x0000 }, { 3514, 0x0800 }, { 3515, 0x0000 }, { 3515, 0x0408 }, + { 3517, 0x0000 }, { 3517, 0x0000 }, { 3517, 0x0002 }, { 3518, 0x0000 }, + { 3518, 0x0008 }, { 3519, 0x0000 }, { 3519, 0x0000 }, { 3519, 0x0000 }, + /* 0x22200 */ + { 3519, 0x0100 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, + { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x1000 }, + { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, + { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, + /* 0x22300 */ + { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0022 }, { 3523, 0x0000 }, + { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, + { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x2000 }, + { 3524, 0x0000 }, { 3524, 0x0081 }, { 3526, 0x0000 }, { 3526, 0x0400 }, + /* 0x22400 */ + { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, + { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0020 }, { 3528, 0x0002 }, + { 3529, 0x0800 }, { 3530, 0x0002 }, { 3531, 0x0000 }, { 3531, 0x0001 }, + { 3532, 0x0000 }, { 3532, 0x0000 }, { 3532, 0x2000 }, { 3533, 0x0000 }, + /* 0x22500 */ + { 3533, 0x0000 }, { 3533, 0x0808 }, { 3535, 0x0000 }, { 3535, 0x0001 }, + { 3536, 0x0000 }, { 3536, 0x0010 }, { 3537, 0x0000 }, { 3537, 0x0000 }, + { 3537, 0x2000 }, { 3538, 0x0000 }, { 3538, 0x8000 }, { 3539, 0x4000 }, + { 3540, 0x0000 }, { 3540, 0x0000 }, { 3540, 0x0000 }, { 3540, 0x0000 }, + /* 0x22600 */ + { 3540, 0x0000 }, { 3540, 0x1800 }, { 3542, 0x0800 }, { 3543, 0x0000 }, + { 3543, 0x0000 }, { 3543, 0x0000 }, { 3543, 0x0100 }, { 3544, 0x0400 }, + { 3545, 0x0000 }, { 3545, 0x0140 }, { 3547, 0x0000 }, { 3547, 0x0000 }, + { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0070 }, + /* 0x22700 */ + { 3550, 0x0000 }, { 3550, 0x8810 }, { 3553, 0x0400 }, { 3554, 0x0000 }, + { 3554, 0x0000 }, { 3554, 0x0000 }, { 3554, 0x0000 }, { 3554, 0x0020 }, + { 3555, 0x0002 }, { 3556, 0x0000 }, { 3556, 0x0000 }, { 3556, 0x0030 }, + { 3558, 0x2000 }, { 3559, 0x0000 }, { 3559, 0x0000 }, { 3559, 0x0000 }, + /* 0x22800 */ + { 3559, 0x0008 }, { 3560, 0x0000 }, { 3560, 0x0000 }, { 3560, 0x0000 }, + { 3560, 0x0000 }, { 3560, 0x8000 }, { 3561, 0x0001 }, { 3562, 0x0002 }, + { 3563, 0x0000 }, { 3563, 0x0000 }, { 3563, 0x2000 }, { 3564, 0x0000 }, + { 3564, 0x0002 }, { 3565, 0x0000 }, { 3565, 0x0000 }, { 3565, 0x0080 }, + /* 0x22900 */ + { 3566, 0x0000 }, { 3566, 0x0000 }, { 3566, 0x0040 }, { 3567, 0x0200 }, + { 3568, 0x8000 }, { 3569, 0x0000 }, { 3569, 0x0880 }, { 3571, 0x0000 }, + { 3571, 0x0001 }, { 3572, 0x0008 }, { 3573, 0x0000 }, { 3573, 0x0000 }, + { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, + /* 0x22a00 */ + { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, + { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0040 }, { 3574, 0x0000 }, + { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x0000 }, + { 3574, 0x8000 }, { 3575, 0x0020 }, { 3576, 0x0140 }, { 3578, 0x0000 }, + /* 0x22b00 */ + { 3578, 0x4000 }, { 3579, 0x0000 }, { 3579, 0x0004 }, { 3580, 0x8000 }, + { 3581, 0x0008 }, { 3582, 0x0000 }, { 3582, 0x0400 }, { 3583, 0x0000 }, + { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x0000 }, + { 3583, 0x4400 }, { 3585, 0x0000 }, { 3585, 0x0000 }, { 3585, 0x0000 }, + /* 0x22c00 */ + { 3585, 0x0000 }, { 3585, 0x0000 }, { 3585, 0x00c0 }, { 3587, 0x0100 }, + { 3588, 0x1000 }, { 3589, 0x0022 }, { 3591, 0x0004 }, { 3592, 0x0000 }, + { 3592, 0x0100 }, { 3593, 0x0800 }, { 3594, 0x0202 }, { 3596, 0x0084 }, + { 3598, 0x0244 }, { 3601, 0x0000 }, { 3601, 0x0000 }, { 3601, 0x0000 }, + /* 0x22d00 */ + { 3601, 0x0180 }, { 3603, 0x0004 }, { 3604, 0x0000 }, { 3604, 0x0000 }, + { 3604, 0x1010 }, { 3606, 0x0000 }, { 3606, 0x0080 }, { 3607, 0x0000 }, + { 3607, 0x2000 }, { 3608, 0x0020 }, { 3609, 0x0019 }, { 3612, 0x0080 }, + { 3613, 0x0000 }, { 3613, 0x0000 }, { 3613, 0x4000 }, { 3614, 0x0000 }, + /* 0x22e00 */ + { 3614, 0x2000 }, { 3615, 0x0000 }, { 3615, 0x0000 }, { 3615, 0x0040 }, + { 3616, 0x0004 }, { 3617, 0x0000 }, { 3617, 0x0000 }, { 3617, 0x0100 }, + { 3618, 0x0800 }, { 3619, 0x0000 }, { 3619, 0x0000 }, { 3619, 0x0008 }, + { 3620, 0x0000 }, { 3620, 0x0000 }, { 3620, 0x8000 }, { 3621, 0x0000 }, + /* 0x22f00 */ + { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, + { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0010 }, + { 3622, 0x0000 }, { 3622, 0x0000 }, { 3622, 0x0000 }, { 3622, 0x0000 }, + { 3622, 0x1000 }, { 3623, 0x0000 }, { 3623, 0x0008 }, { 3624, 0x0000 }, + /* 0x23000 */ + { 3624, 0x0000 }, { 3624, 0x0000 }, { 3624, 0x0000 }, { 3624, 0x0008 }, + { 3625, 0x0810 }, { 3627, 0x0000 }, { 3627, 0x0040 }, { 3628, 0x6000 }, + { 3630, 0x4000 }, { 3631, 0x0000 }, { 3631, 0x0000 }, { 3631, 0x1080 }, + { 3633, 0x0000 }, { 3633, 0x0400 }, { 3634, 0x0000 }, { 3634, 0x0000 }, + /* 0x23100 */ + { 3634, 0x0008 }, { 3635, 0x0000 }, { 3635, 0x0000 }, { 3635, 0x2000 }, + { 3636, 0x0000 }, { 3636, 0x0000 }, { 3636, 0x0000 }, { 3636, 0x2000 }, + { 3637, 0x0004 }, { 3638, 0x0000 }, { 3638, 0x0030 }, { 3640, 0x0008 }, + { 3641, 0x0300 }, { 3643, 0x0000 }, { 3643, 0x0000 }, { 3643, 0x0380 }, + /* 0x23200 */ + { 3646, 0x8000 }, { 3647, 0x0000 }, { 3647, 0x8020 }, { 3649, 0x001e }, + { 3653, 0x0000 }, { 3653, 0x0000 }, { 3653, 0x0004 }, { 3654, 0x0000 }, + { 3654, 0x0600 }, { 3656, 0x0000 }, { 3656, 0x3800 }, { 3659, 0x0000 }, + { 3659, 0x0000 }, { 3659, 0x0004 }, { 3660, 0x0003 }, { 3662, 0x0000 }, + /* 0x23300 */ + { 3662, 0x0401 }, { 3664, 0x8000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, + { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, + { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0010 }, + { 3666, 0x1000 }, { 3667, 0x4000 }, { 3668, 0x0040 }, { 3669, 0x4430 }, + /* 0x23400 */ + { 3673, 0x0001 }, { 3674, 0x0000 }, { 3674, 0x0000 }, { 3674, 0x8000 }, + { 3675, 0x0000 }, { 3675, 0x0001 }, { 3676, 0x8000 }, { 3677, 0x0004 }, + { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, + { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0020 }, { 3679, 0x0000 }, + /* 0x23500 */ + { 3679, 0x0000 }, { 3679, 0x0200 }, { 3680, 0x0000 }, { 3680, 0x0001 }, + { 3681, 0x0000 }, { 3681, 0x0400 }, { 3682, 0x0080 }, { 3683, 0x0000 }, + { 3683, 0x0000 }, { 3683, 0x1220 }, { 3686, 0x0000 }, { 3686, 0x0000 }, + { 3686, 0xe000 }, { 3689, 0x0000 }, { 3689, 0x0000 }, { 3689, 0x0008 }, + /* 0x23600 */ + { 3690, 0x0001 }, { 3691, 0x0400 }, { 3692, 0x0000 }, { 3692, 0x1000 }, + { 3693, 0x0001 }, { 3694, 0x8200 }, { 3696, 0x0000 }, { 3696, 0x0080 }, + { 3697, 0x0000 }, { 3697, 0x0000 }, { 3697, 0x2040 }, { 3699, 0x0400 }, + { 3700, 0x0000 }, { 3700, 0x8000 }, { 3701, 0x4000 }, { 3702, 0x0000 }, + /* 0x23700 */ + { 3702, 0x0008 }, { 3703, 0x0040 }, { 3704, 0xa001 }, { 3707, 0x8000 }, + { 3708, 0x0000 }, { 3708, 0x0000 }, { 3708, 0x0040 }, { 3709, 0x0000 }, + { 3709, 0x0002 }, { 3710, 0x0000 }, { 3710, 0x0004 }, { 3711, 0x1000 }, + { 3712, 0x0004 }, { 3713, 0x00e0 }, { 3716, 0x0000 }, { 3716, 0x0000 }, + /* 0x23800 */ + { 3716, 0x0000 }, { 3716, 0x0000 }, { 3716, 0x0000 }, { 3716, 0x0400 }, + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + /* 0x23900 */ + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, + { 3717, 0x0004 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, + /* 0x23a00 */ + { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, + { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, + { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0080 }, { 3719, 0x0000 }, + { 3719, 0x0000 }, { 3719, 0x0800 }, { 3720, 0x4000 }, { 3721, 0x0400 }, + /* 0x23b00 */ + { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0000 }, + { 3722, 0x0000 }, { 3722, 0x0400 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + /* 0x23c00 */ + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + { 3723, 0x0000 }, { 3723, 0x0e00 }, { 3726, 0x0000 }, { 3726, 0x00a0 }, + { 3728, 0x0380 }, { 3731, 0x0000 }, { 3731, 0x0000 }, { 3731, 0xf000 }, + /* 0x23d00 */ + { 3735, 0x0000 }, { 3735, 0x0000 }, { 3735, 0x0000 }, { 3735, 0x0000 }, + { 3735, 0x0001 }, { 3736, 0x0800 }, { 3737, 0x0000 }, { 3737, 0x4000 }, + { 3738, 0x8000 }, { 3739, 0x0000 }, { 3739, 0x0000 }, { 3739, 0x3fc0 }, + { 3747, 0x0000 }, { 3747, 0x0000 }, { 3747, 0x0008 }, { 3748, 0x0100 }, + /* 0x23e00 */ + { 3749, 0x0000 }, { 3749, 0x0002 }, { 3750, 0xf000 }, { 3754, 0x0203 }, + { 3757, 0x0000 }, { 3757, 0x0000 }, { 3757, 0x0000 }, { 3757, 0x0000 }, + { 3757, 0x0f00 }, { 3761, 0x0000 }, { 3761, 0x0000 }, { 3761, 0x8200 }, + { 3763, 0x0000 }, { 3763, 0x0080 }, { 3764, 0x0000 }, { 3764, 0x1f80 }, + /* 0x23f00 */ + { 3770, 0x0000 }, { 3770, 0x0000 }, { 3770, 0x0000 }, { 3770, 0x0020 }, + { 3771, 0x0402 }, { 3773, 0x0000 }, { 3773, 0x0000 }, { 3773, 0x8000 }, + { 3774, 0x8007 }, { 3778, 0x0000 }, { 3778, 0x0000 }, { 3778, 0x0090 }, + { 3780, 0x0021 }, { 3782, 0x0000 }, { 3782, 0xf800 }, { 3787, 0x0001 }, + /* 0x24000 */ + { 3788, 0x0000 }, { 3788, 0x0002 }, { 3789, 0x0000 }, { 3789, 0x3e00 }, + { 3794, 0x0000 }, { 3794, 0x0080 }, { 3795, 0x0000 }, { 3795, 0x0000 }, + { 3795, 0x3820 }, { 3799, 0x0002 }, { 3800, 0x0000 }, { 3800, 0x0000 }, + { 3800, 0x0200 }, { 3801, 0x0000 }, { 3801, 0x0002 }, { 3802, 0x0000 }, + /* 0x24100 */ + { 3802, 0x8010 }, { 3804, 0x0200 }, { 3805, 0x0000 }, { 3805, 0x8000 }, + { 3806, 0x0011 }, { 3808, 0x90e0 }, { 3813, 0x0000 }, { 3813, 0x0480 }, + { 3815, 0x0000 }, { 3815, 0x0000 }, { 3815, 0x1038 }, { 3819, 0x0020 }, + { 3820, 0x2000 }, { 3821, 0x0000 }, { 3821, 0x0004 }, { 3822, 0x1000 }, + /* 0x24200 */ + { 3823, 0x0000 }, { 3823, 0x0800 }, { 3824, 0x0000 }, { 3824, 0x0000 }, + { 3824, 0x0800 }, { 3825, 0x0240 }, { 3827, 0x0000 }, { 3827, 0x01c0 }, + { 3830, 0x0010 }, { 3831, 0x0028 }, { 3833, 0x0020 }, { 3834, 0x0000 }, + { 3834, 0x0602 }, { 3837, 0x0000 }, { 3837, 0x4000 }, { 3838, 0x0400 }, + /* 0x24300 */ + { 3839, 0x2000 }, { 3840, 0x0400 }, { 3841, 0x0000 }, { 3841, 0x0010 }, + { 3842, 0x0100 }, { 3843, 0x0000 }, { 3843, 0x003c }, { 3847, 0x0000 }, + { 3847, 0x1000 }, { 3848, 0x1040 }, { 3850, 0x0000 }, { 3850, 0x2000 }, + { 3851, 0x0002 }, { 3852, 0x0000 }, { 3852, 0x0600 }, { 3854, 0x0104 }, + /* 0x24400 */ + { 3856, 0x0010 }, { 3857, 0x0000 }, { 3857, 0x0000 }, { 3857, 0x0060 }, + { 3859, 0x0000 }, { 3859, 0x0c00 }, { 3861, 0x0000 }, { 3861, 0x0008 }, + { 3862, 0x0180 }, { 3864, 0x0000 }, { 3864, 0x0000 }, { 3864, 0x1200 }, + { 3866, 0x4000 }, { 3867, 0x0048 }, { 3869, 0x0000 }, { 3869, 0x0000 }, + /* 0x24500 */ + { 3869, 0x0000 }, { 3869, 0x0000 }, { 3869, 0x0002 }, { 3870, 0x0000 }, + { 3870, 0x0000 }, { 3870, 0x0000 }, { 3870, 0x0000 }, { 3870, 0x0100 }, + { 3871, 0x0000 }, { 3871, 0x0000 }, { 3871, 0x0000 }, { 3871, 0x0000 }, + { 3871, 0x0100 }, { 3872, 0x0000 }, { 3872, 0x0000 }, { 3872, 0x0000 }, + /* 0x24600 */ + { 3872, 0x0000 }, { 3872, 0x0100 }, { 3873, 0x0400 }, { 3874, 0x0000 }, + { 3874, 0x0000 }, { 3874, 0x0000 }, { 3874, 0x0020 }, { 3875, 0x0010 }, + { 3876, 0x0000 }, { 3876, 0x0080 }, { 3877, 0x0000 }, { 3877, 0x0000 }, + { 3877, 0x0000 }, { 3877, 0x0010 }, { 3878, 0x0000 }, { 3878, 0x0000 }, + /* 0x24700 */ + { 3878, 0x0040 }, { 3879, 0x0000 }, { 3879, 0x8020 }, { 3881, 0x0000 }, + { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x0000 }, + { 3881, 0x8000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, + { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0001 }, { 3883, 0x0000 }, + /* 0x24800 */ + { 3883, 0x0000 }, { 3883, 0x0004 }, { 3884, 0x0008 }, { 3885, 0x0000 }, + { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0000 }, + { 3885, 0x0004 }, { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0000 }, + { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0200 }, { 3887, 0x880f }, + /* 0x24900 */ + { 3893, 0x1003 }, { 3896, 0x02c0 }, { 3899, 0x8000 }, { 3900, 0xc018 }, + { 3904, 0x000f }, { 3908, 0x0000 }, { 3908, 0x000c }, { 3910, 0x8070 }, + { 3914, 0xff04 }, { 3923, 0x0010 }, { 3924, 0x3a90 }, { 3930, 0x0f80 }, + { 3935, 0x0020 }, { 3936, 0xc401 }, { 3940, 0x3028 }, { 3944, 0x0bc0 }, + /* 0x24a00 */ + { 3949, 0x4000 }, { 3950, 0x0024 }, { 3952, 0x07fe }, { 3962, 0x4000 }, + { 3963, 0xc424 }, { 3968, 0x2003 }, { 3971, 0x00e0 }, { 3974, 0x0782 }, + { 3979, 0x1000 }, { 3980, 0x0078 }, { 3984, 0x00f0 }, { 3988, 0x1c0e }, + { 3994, 0x0481 }, { 3997, 0x8002 }, { 3999, 0x0204 }, { 4001, 0x0000 }, + /* 0x24b00 */ + { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, + { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x4000 }, { 4002, 0x0000 }, + { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, + { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0020 }, + /* 0x24c00 */ + { 4003, 0x0200 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, + { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, + { 4004, 0x0000 }, { 4004, 0xc000 }, { 4006, 0x0000 }, { 4006, 0x0000 }, + { 4006, 0x0200 }, { 4007, 0x0200 }, { 4008, 0x0000 }, { 4008, 0x0000 }, + /* 0x24d00 */ + { 4008, 0x0040 }, { 4009, 0x0008 }, { 4010, 0x0000 }, { 4010, 0x0000 }, + { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, + { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0100 }, + { 4011, 0x0000 }, { 4011, 0x0000 }, { 4011, 0x0c00 }, { 4013, 0x0000 }, + /* 0x24e00 */ + { 4013, 0x0000 }, { 4013, 0x0000 }, { 4013, 0x0000 }, { 4013, 0x0800 }, + { 4014, 0x0000 }, { 4014, 0x0001 }, { 4015, 0x0000 }, { 4015, 0x0000 }, + { 4015, 0x0000 }, { 4015, 0x0000 }, { 4015, 0x00a0 }, { 4017, 0x0000 }, + { 4017, 0x0000 }, { 4017, 0x0000 }, { 4017, 0x0000 }, { 4017, 0x0000 }, + /* 0x24f00 */ + { 4017, 0x4000 }, { 4018, 0x0000 }, { 4018, 0x0000 }, { 4018, 0x0000 }, + { 4018, 0x0000 }, { 4018, 0x1000 }, { 4019, 0x0000 }, { 4019, 0x0000 }, + { 4019, 0x0044 }, { 4021, 0x0480 }, { 4023, 0x0200 }, { 4024, 0x0100 }, + { 4025, 0x0004 }, { 4026, 0x0000 }, { 4026, 0x0000 }, { 4026, 0x0000 }, + /* 0x25000 */ + { 4026, 0x0000 }, { 4026, 0x0000 }, { 4026, 0x1000 }, { 4027, 0x0000 }, + { 4027, 0x0000 }, { 4027, 0x0004 }, { 4028, 0x0000 }, { 4028, 0x0000 }, + { 4028, 0x0000 }, { 4028, 0x2000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, + { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, + /* 0x25100 */ + { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0800 }, { 4030, 0x0000 }, + { 4030, 0x0100 }, { 4031, 0x0000 }, { 4031, 0x0000 }, { 4031, 0x6000 }, + { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, + { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x00c8 }, { 4036, 0x0000 }, + /* 0x25200 */ + { 4036, 0x0000 }, { 4036, 0x0000 }, { 4036, 0x0003 }, { 4038, 0x0000 }, + { 4038, 0x0000 }, { 4038, 0x0001 }, { 4039, 0x0000 }, { 4039, 0x0000 }, + { 4039, 0x0000 }, { 4039, 0x0200 }, { 4040, 0x0000 }, { 4040, 0x0000 }, + { 4040, 0x0080 }, { 4041, 0x0100 }, { 4042, 0x0000 }, { 4042, 0x0000 }, + /* 0x25300 */ + { 4042, 0x4000 }, { 4043, 0x000a }, { 4045, 0x0000 }, { 4045, 0x0000 }, + { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, + { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, + { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, + /* 0x25400 */ + { 4045, 0x0000 }, { 4045, 0x0200 }, { 4046, 0x8020 }, { 4048, 0x0001 }, + { 4049, 0x0040 }, { 4050, 0x0000 }, { 4050, 0x5000 }, { 4052, 0x0000 }, + { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, + { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, + /* 0x25500 */ + { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x8022 }, + { 4055, 0x0000 }, { 4055, 0x7800 }, { 4059, 0x0064 }, { 4062, 0x0000 }, + { 4062, 0x8012 }, { 4065, 0x0000 }, { 4065, 0x0000 }, { 4065, 0x0200 }, + { 4066, 0x0000 }, { 4066, 0x0820 }, { 4068, 0x0001 }, { 4069, 0x0000 }, + /* 0x25600 */ + { 4069, 0x0020 }, { 4070, 0x0000 }, { 4070, 0x0000 }, { 4070, 0x0020 }, + { 4071, 0x0000 }, { 4071, 0x0002 }, { 4072, 0x0000 }, { 4072, 0x0000 }, + { 4072, 0x0008 }, { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0000 }, + { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0008 }, { 4074, 0x0040 }, + /* 0x25700 */ + { 4075, 0x0040 }, { 4076, 0x2000 }, { 4077, 0x0020 }, { 4078, 0x2000 }, + { 4079, 0x0000 }, { 4079, 0x0000 }, { 4079, 0x0000 }, { 4079, 0x0004 }, + { 4080, 0x0000 }, { 4080, 0x0000 }, { 4080, 0x0000 }, { 4080, 0x0000 }, + { 4080, 0x0080 }, { 4081, 0x8000 }, { 4082, 0x0003 }, { 4084, 0x0000 }, + /* 0x25800 */ + { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x0000 }, + { 4084, 0x0000 }, { 4084, 0x2080 }, { 4086, 0x0000 }, { 4086, 0x0004 }, + { 4087, 0x0000 }, { 4087, 0x0000 }, { 4087, 0x0000 }, { 4087, 0x0000 }, + { 4087, 0x0100 }, { 4088, 0x0000 }, { 4088, 0x0002 }, { 4089, 0x0000 }, + /* 0x25900 */ + { 4089, 0x0008 }, { 4090, 0x0000 }, { 4090, 0x0000 }, { 4090, 0x0000 }, + { 4090, 0x0040 }, { 4091, 0x0040 }, { 4092, 0x0000 }, { 4092, 0x0000 }, + { 4092, 0x0000 }, { 4092, 0x0000 }, { 4092, 0x1000 }, { 4093, 0x0000 }, + { 4093, 0x1000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, + /* 0x25a00 */ + { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, + { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, + { 4094, 0x0000 }, { 4094, 0x1020 }, { 4096, 0xc000 }, { 4098, 0x0000 }, + { 4098, 0x0000 }, { 4098, 0x0000 }, { 4098, 0x0200 }, { 4099, 0x0000 }, + /* 0x25b00 */ + { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, + { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0010 }, + { 4100, 0x0200 }, { 4101, 0x0000 }, { 4101, 0x0000 }, { 4101, 0x0018 }, + { 4103, 0x0040 }, { 4104, 0x0000 }, { 4104, 0x0110 }, { 4106, 0x0000 }, + /* 0x25c00 */ + { 4106, 0x0042 }, { 4108, 0x0000 }, { 4108, 0x0002 }, { 4109, 0x0000 }, + { 4109, 0x0400 }, { 4110, 0x0000 }, { 4110, 0x0020 }, { 4111, 0x0000 }, + { 4111, 0x0000 }, { 4111, 0x0002 }, { 4112, 0x0000 }, { 4112, 0x0000 }, + { 4112, 0x0003 }, { 4114, 0x0000 }, { 4114, 0x0000 }, { 4114, 0x4000 }, + /* 0x25d00 */ + { 4115, 0x0000 }, { 4115, 0x0000 }, { 4115, 0x0001 }, { 4116, 0x0000 }, + { 4116, 0x0008 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, + { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, + { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, + /* 0x25e00 */ + { 4117, 0x4000 }, { 4118, 0x0000 }, { 4118, 0x0000 }, { 4118, 0x0000 }, + { 4118, 0x0200 }, { 4119, 0x0000 }, { 4119, 0x0000 }, { 4119, 0x0000 }, + { 4119, 0x000e }, { 4122, 0x0000 }, { 4122, 0x0040 }, { 4123, 0x1000 }, + { 4124, 0x0000 }, { 4124, 0x0180 }, { 4126, 0x0000 }, { 4126, 0x0000 }, + /* 0x25f00 */ + { 4126, 0x0000 }, { 4126, 0x0400 }, { 4127, 0x0000 }, { 4127, 0x0000 }, + { 4127, 0x0800 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, + { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, + { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0006 }, { 4130, 0x0000 }, + /* 0x26000 */ + { 4130, 0x0000 }, { 4130, 0x0000 }, { 4130, 0x0200 }, { 4131, 0x0000 }, + { 4131, 0x0100 }, { 4132, 0x0000 }, { 4132, 0x0010 }, { 4133, 0x0000 }, + { 4133, 0x0008 }, { 4134, 0x0080 }, { 4135, 0x0030 }, { 4137, 0x0000 }, + { 4137, 0x0000 }, { 4137, 0x0000 }, { 4137, 0x0000 }, { 4137, 0x0000 }, + /* 0x26100 */ + { 4137, 0x0004 }, { 4138, 0x0000 }, { 4138, 0x0002 }, { 4139, 0x0000 }, + { 4139, 0x0000 }, { 4139, 0x1e00 }, { 4143, 0x0000 }, { 4143, 0x0000 }, + { 4143, 0x0000 }, { 4143, 0x0000 }, { 4143, 0x6000 }, { 4145, 0x0004 }, + { 4146, 0x0000 }, { 4146, 0x2000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, + /* 0x26200 */ + { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, + { 4147, 0x0000 }, { 4147, 0x0100 }, { 4148, 0x0c02 }, { 4151, 0x0000 }, + { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, + { 4151, 0x0000 }, { 4151, 0x0001 }, { 4152, 0x0000 }, { 4152, 0x0000 }, + /* 0x26300 */ + { 4152, 0x0000 }, { 4152, 0x0000 }, { 4152, 0x0000 }, { 4152, 0x0020 }, + { 4153, 0x1800 }, { 4155, 0x0002 }, { 4156, 0x0000 }, { 4156, 0x0000 }, + { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x4000 }, + { 4157, 0x0000 }, { 4157, 0x0000 }, { 4157, 0x0000 }, { 4157, 0x0120 }, + /* 0x26400 */ + { 4159, 0x0004 }, { 4160, 0x0007 }, { 4163, 0x0000 }, { 4163, 0x0000 }, + { 4163, 0x0400 }, { 4164, 0x0000 }, { 4164, 0x0200 }, { 4165, 0x0000 }, + { 4165, 0x2310 }, { 4169, 0x0100 }, { 4170, 0x0000 }, { 4170, 0x0000 }, + { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, + /* 0x26500 */ + { 4170, 0x0000 }, { 4170, 0x0004 }, { 4171, 0x0000 }, { 4171, 0x0000 }, + { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0004 }, + { 4172, 0x0000 }, { 4172, 0x0000 }, { 4172, 0x2001 }, { 4174, 0x8000 }, + { 4175, 0x0000 }, { 4175, 0x0000 }, { 4175, 0x0000 }, { 4175, 0x0000 }, + /* 0x26600 */ + { 4175, 0x0000 }, { 4175, 0x0004 }, { 4176, 0x0040 }, { 4177, 0x0000 }, + { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, + { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x8000 }, { 4178, 0x0022 }, + { 4180, 0x0000 }, { 4180, 0x0400 }, { 4181, 0x0100 }, { 4182, 0x1000 }, + /* 0x26700 */ + { 4183, 0x0000 }, { 4183, 0x0040 }, { 4184, 0x0000 }, { 4184, 0x0000 }, + { 4184, 0x0002 }, { 4185, 0x0000 }, { 4185, 0x0000 }, { 4185, 0x0000 }, + { 4185, 0x0000 }, { 4185, 0x0200 }, { 4186, 0x0000 }, { 4186, 0x0018 }, + { 4188, 0x1000 }, { 4189, 0x0000 }, { 4189, 0x0000 }, { 4189, 0x0000 }, + /* 0x26800 */ + { 4189, 0x0000 }, { 4189, 0x1000 }, { 4190, 0x0000 }, { 4190, 0x0000 }, + { 4190, 0x0040 }, { 4191, 0x4000 }, { 4192, 0x4000 }, { 4193, 0x0000 }, + { 4193, 0x0500 }, { 4195, 0x0008 }, { 4196, 0x0000 }, { 4196, 0x0000 }, + { 4196, 0x0080 }, { 4197, 0x0000 }, { 4197, 0x0000 }, { 4197, 0x0000 }, + /* 0x26900 */ + { 4197, 0x4000 }, { 4198, 0x0002 }, { 4199, 0x0040 }, { 4200, 0x0200 }, + { 4201, 0x0000 }, { 4201, 0x0002 }, { 4202, 0x0000 }, { 4202, 0x0000 }, + { 4202, 0x0000 }, { 4202, 0x0000 }, { 4202, 0x0100 }, { 4203, 0x0020 }, + { 4204, 0x0000 }, { 4204, 0x0000 }, { 4204, 0x0000 }, { 4204, 0x0404 }, + /* 0x26a00 */ + { 4206, 0x0000 }, { 4206, 0x0000 }, { 4206, 0x6000 }, { 4208, 0x0010 }, + { 4209, 0x0004 }, { 4210, 0x0006 }, { 4212, 0x0000 }, { 4212, 0x0000 }, + { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, + { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, + /* 0x26b00 */ + { 4212, 0x0420 }, { 4214, 0x0008 }, { 4215, 0x0100 }, { 4216, 0x0000 }, + { 4216, 0x0000 }, { 4216, 0x080f }, { 4221, 0x0000 }, { 4221, 0x0020 }, + { 4222, 0x0004 }, { 4223, 0x20c0 }, { 4226, 0x0000 }, { 4226, 0x0008 }, + { 4227, 0x0001 }, { 4228, 0x0000 }, { 4228, 0x0000 }, { 4228, 0x0080 }, + /* 0x26c00 */ + { 4229, 0x0000 }, { 4229, 0x0000 }, { 4229, 0x0002 }, { 4230, 0x0000 }, + { 4230, 0x0001 }, { 4231, 0x0000 }, { 4231, 0x0000 }, { 4231, 0xc000 }, + { 4233, 0x0007 }, { 4236, 0x0000 }, { 4236, 0x0010 }, { 4237, 0x2180 }, + { 4240, 0x0009 }, { 4242, 0x0002 }, { 4243, 0x0000 }, { 4243, 0x0000 }, + /* 0x26d00 */ + { 4243, 0x0000 }, { 4243, 0x0000 }, { 4243, 0x07fc }, { 4252, 0x0000 }, + { 4252, 0x0000 }, { 4252, 0x0002 }, { 4253, 0x0000 }, { 4253, 0x0000 }, + { 4253, 0x0000 }, { 4253, 0x0000 }, { 4253, 0x40ff }, { 4262, 0x0000 }, + { 4262, 0x0000 }, { 4262, 0x1000 }, { 4263, 0x0c00 }, { 4265, 0x0001 }, + /* 0x26e00 */ + { 4266, 0x00a1 }, { 4269, 0x0004 }, { 4270, 0x0000 }, { 4270, 0x0000 }, + { 4270, 0x003c }, { 4274, 0x0000 }, { 4274, 0x4000 }, { 4275, 0x0084 }, + { 4277, 0x0010 }, { 4278, 0x0200 }, { 4279, 0x0000 }, { 4279, 0x0000 }, + { 4279, 0x0000 }, { 4279, 0x00ff }, { 4287, 0x0000 }, { 4287, 0x0000 }, + /* 0x26f00 */ + { 4287, 0x0000 }, { 4287, 0x0000 }, { 4287, 0x0040 }, { 4288, 0x0000 }, + { 4288, 0x0000 }, { 4288, 0x0000 }, { 4288, 0x0000 }, { 4288, 0x0018 }, + { 4290, 0x0000 }, { 4290, 0x8000 }, { 4291, 0x0002 }, { 4292, 0x0000 }, + { 4292, 0x0000 }, { 4292, 0xc000 }, { 4294, 0x0000 }, { 4294, 0x0000 }, + /* 0x27000 */ + { 4294, 0x4000 }, { 4295, 0x0000 }, { 4295, 0x0000 }, { 4295, 0x0000 }, + { 4295, 0x0800 }, { 4296, 0x000c }, { 4298, 0x0000 }, { 4298, 0x0000 }, + { 4298, 0x0100 }, { 4299, 0x0000 }, { 4299, 0xe000 }, { 4302, 0x0000 }, + { 4302, 0x2000 }, { 4303, 0x0000 }, { 4303, 0x0000 }, { 4303, 0x0100 }, + /* 0x27100 */ + { 4304, 0x1200 }, { 4306, 0x0000 }, { 4306, 0x00c0 }, { 4308, 0x0000 }, + { 4308, 0x0000 }, { 4308, 0x0000 }, { 4308, 0x0030 }, { 4310, 0x0020 }, + { 4311, 0x0000 }, { 4311, 0x0000 }, { 4311, 0x0000 }, { 4311, 0x0000 }, + { 4311, 0x2000 }, { 4312, 0x0000 }, { 4312, 0x0000 }, { 4312, 0x0000 }, + /* 0x27200 */ + { 4312, 0x0000 }, { 4312, 0x0800 }, { 4313, 0x0000 }, { 4313, 0x0000 }, + { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, + { 4313, 0x0821 }, { 4316, 0x0000 }, { 4316, 0x0000 }, { 4316, 0x0044 }, + { 4318, 0x0000 }, { 4318, 0x0000 }, { 4318, 0x0040 }, { 4319, 0x0000 }, + /* 0x27300 */ + { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, + { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, + { 4319, 0x0000 }, { 4319, 0x0400 }, { 4320, 0x0000 }, { 4320, 0x0000 }, + { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, + /* 0x27400 */ + { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0004 }, { 4321, 0x0000 }, + { 4321, 0x0000 }, { 4321, 0x0001 }, { 4322, 0x0000 }, { 4322, 0x0000 }, + { 4322, 0x0050 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, + { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, + /* 0x27500 */ + { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, + { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0010 }, + { 4325, 0x0000 }, { 4325, 0x0000 }, { 4325, 0x0008 }, { 4326, 0x0000 }, + { 4326, 0x0000 }, { 4326, 0x0000 }, { 4326, 0x0011 }, { 4328, 0x6000 }, + /* 0x27600 */ + { 4330, 0x1080 }, { 4332, 0x0000 }, { 4332, 0x0000 }, { 4332, 0x0204 }, + { 4334, 0x0000 }, { 4334, 0x00e0 }, { 4337, 0x0000 }, { 4337, 0x0000 }, + { 4337, 0x0000 }, { 4337, 0x0010 }, { 4338, 0x0000 }, { 4338, 0x0000 }, + { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, + /* 0x27700 */ + { 4338, 0x8000 }, { 4339, 0x0000 }, { 4339, 0x0000 }, { 4339, 0x0060 }, + { 4341, 0x0002 }, { 4342, 0x4000 }, { 4343, 0x0000 }, { 4343, 0x0000 }, + { 4343, 0x0030 }, { 4345, 0x0000 }, { 4345, 0x0000 }, { 4345, 0x0000 }, + { 4345, 0x1000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, + /* 0x27800 */ + { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, + { 4346, 0x0000 }, { 4346, 0x0100 }, { 4347, 0x0000 }, { 4347, 0x0001 }, + { 4348, 0x0000 }, { 4348, 0x2000 }, { 4349, 0x0000 }, { 4349, 0x0004 }, + { 4350, 0x0100 }, { 4351, 0x0000 }, { 4351, 0x0000 }, { 4351, 0x0000 }, + /* 0x27900 */ + { 4351, 0x0000 }, { 4351, 0x0000 }, { 4351, 0x0010 }, { 4352, 0x0000 }, + { 4352, 0x0000 }, { 4352, 0x0000 }, { 4352, 0x0080 }, { 4353, 0x0400 }, + { 4354, 0x0000 }, { 4354, 0x0000 }, { 4354, 0x0001 }, { 4355, 0x0000 }, + { 4355, 0x0000 }, { 4355, 0x2000 }, { 4356, 0x0000 }, { 4356, 0x2000 }, + /* 0x27a00 */ + { 4357, 0x4400 }, { 4359, 0x0000 }, { 4359, 0x0000 }, { 4359, 0x4000 }, + { 4360, 0x0000 }, { 4360, 0x0208 }, { 4362, 0x0000 }, { 4362, 0x0200 }, + { 4363, 0x0010 }, { 4364, 0x0000 }, { 4364, 0x0000 }, { 4364, 0x6000 }, + { 4366, 0x0000 }, { 4366, 0x0000 }, { 4366, 0x0000 }, { 4366, 0x0010 }, + /* 0x27b00 */ + { 4367, 0x0840 }, { 4369, 0x0100 }, { 4370, 0x0000 }, { 4370, 0x0700 }, + { 4373, 0x0100 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, + { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, + { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0010 }, + /* 0x27c00 */ + { 4375, 0x0000 }, { 4375, 0x0004 }, { 4376, 0x0000 }, { 4376, 0x0000 }, + { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, + { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, + { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, + /* 0x27d00 */ + { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x8000 }, { 4377, 0x0000 }, + { 4377, 0x0000 }, { 4377, 0x0018 }, { 4379, 0x0040 }, { 4380, 0x0008 }, + { 4381, 0x8010 }, { 4383, 0x0100 }, { 4384, 0x0000 }, { 4384, 0x2000 }, + { 4385, 0x0000 }, { 4385, 0x1000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, + /* 0x27e00 */ + { 4386, 0x0000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, + { 4386, 0xa000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, + { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, + { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, + /* 0x27f00 */ + { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x4000 }, { 4389, 0x0000 }, + { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, + { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, + { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0200 }, + /* 0x28000 */ + { 4390, 0x0204 }, { 4392, 0x4000 }, { 4393, 0x0018 }, { 4395, 0x0000 }, + { 4395, 0x0100 }, { 4396, 0x0000 }, { 4396, 0x0000 }, { 4396, 0x0000 }, + { 4396, 0x0008 }, { 4397, 0x0001 }, { 4398, 0x0000 }, { 4398, 0x6000 }, + { 4400, 0x0000 }, { 4400, 0x0000 }, { 4400, 0x0300 }, { 4402, 0x0010 }, + /* 0x28100 */ + { 4403, 0x0000 }, { 4403, 0x0000 }, { 4403, 0x4000 }, { 4404, 0x0000 }, + { 4404, 0x8000 }, { 4405, 0x2000 }, { 4406, 0x8000 }, { 4407, 0x0000 }, + { 4407, 0x0200 }, { 4408, 0x0000 }, { 4408, 0x8000 }, { 4409, 0x1000 }, + { 4410, 0x0000 }, { 4410, 0x0000 }, { 4410, 0x0000 }, { 4410, 0x0000 }, + /* 0x28200 */ + { 4410, 0x0080 }, { 4411, 0x0500 }, { 4413, 0x0000 }, { 4413, 0x0000 }, + { 4413, 0x0000 }, { 4413, 0x0040 }, { 4414, 0x0000 }, { 4414, 0x1000 }, + { 4415, 0x0000 }, { 4415, 0x0800 }, { 4416, 0x0000 }, { 4416, 0x0000 }, + { 4416, 0x2000 }, { 4417, 0x0000 }, { 4417, 0x0004 }, { 4418, 0x0000 }, + /* 0x28300 */ + { 4418, 0x0040 }, { 4419, 0x0100 }, { 4420, 0x8000 }, { 4421, 0x0400 }, + { 4422, 0x0000 }, { 4422, 0x0000 }, { 4422, 0x2020 }, { 4424, 0x2000 }, + { 4425, 0x0400 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, + { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, + /* 0x28400 */ + { 4426, 0x0000 }, { 4426, 0x0004 }, { 4427, 0x0000 }, { 4427, 0x0000 }, + { 4427, 0x0000 }, { 4427, 0x0000 }, { 4427, 0x1100 }, { 4429, 0x0008 }, + { 4430, 0x0004 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, + { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, + /* 0x28500 */ + { 4431, 0x0002 }, { 4432, 0x0000 }, { 4432, 0x0000 }, { 4432, 0x3000 }, + { 4434, 0x0000 }, { 4434, 0x0000 }, { 4434, 0x1000 }, { 4435, 0x0000 }, + { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, + { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0100 }, { 4436, 0x0010 }, + /* 0x28600 */ + { 4437, 0x0801 }, { 4439, 0x0000 }, { 4439, 0x0020 }, { 4440, 0x0800 }, + { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, + { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0c00 }, { 4443, 0x1000 }, + { 4444, 0x0000 }, { 4444, 0x0100 }, { 4445, 0x0040 }, { 4446, 0x0000 }, + /* 0x28700 */ + { 4446, 0x0000 }, { 4446, 0x0008 }, { 4447, 0x0000 }, { 4447, 0x0000 }, + { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, + { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, + { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, + /* 0x28800 */ + { 4447, 0x0010 }, { 4448, 0x0000 }, { 4448, 0x0800 }, { 4449, 0x0000 }, + { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, + { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, + { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, + /* 0x28900 */ + { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0008 }, + { 4450, 0x0300 }, { 4452, 0x0040 }, { 4453, 0x1110 }, { 4456, 0x4000 }, + { 4457, 0x0200 }, { 4458, 0x0000 }, { 4458, 0x0d00 }, { 4461, 0x1100 }, + { 4463, 0x0001 }, { 4464, 0x5000 }, { 4466, 0x0192 }, { 4470, 0x1e00 }, + /* 0x28a00 */ + { 4474, 0x8000 }, { 4475, 0x0040 }, { 4476, 0x0220 }, { 4478, 0x0040 }, + { 4479, 0x0ff0 }, { 4487, 0x0600 }, { 4489, 0x0000 }, { 4489, 0x0000 }, + { 4489, 0x000e }, { 4492, 0x1c00 }, { 4495, 0x0000 }, { 4495, 0x0000 }, + { 4495, 0x5841 }, { 4500, 0xc000 }, { 4502, 0x002f }, { 4507, 0x1000 }, + /* 0x28b00 */ + { 4508, 0x1000 }, { 4509, 0x0008 }, { 4510, 0xb806 }, { 4516, 0x0000 }, + { 4516, 0x5040 }, { 4519, 0x0001 }, { 4520, 0x1078 }, { 4525, 0x0000 }, + { 4525, 0x8000 }, { 4526, 0x3200 }, { 4529, 0x0000 }, { 4529, 0x0000 }, + { 4529, 0x0024 }, { 4531, 0x0690 }, { 4535, 0x1f80 }, { 4541, 0x8020 }, + /* 0x28c00 */ + { 4543, 0x0208 }, { 4545, 0x3000 }, { 4547, 0x0848 }, { 4550, 0x0a01 }, + { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, + { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, + { 4553, 0x2400 }, { 4555, 0x0004 }, { 4556, 0x0000 }, { 4556, 0x0000 }, + /* 0x28d00 */ + { 4556, 0x0000 }, { 4556, 0x0000 }, { 4556, 0x0000 }, { 4556, 0x0010 }, + { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0000 }, + { 4557, 0x0000 }, { 4557, 0x0200 }, { 4558, 0x0000 }, { 4558, 0x0000 }, + { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, + /* 0x28e00 */ + { 4558, 0x8000 }, { 4559, 0x0000 }, { 4559, 0x0000 }, { 4559, 0x0240 }, + { 4561, 0x0000 }, { 4561, 0x0000 }, { 4561, 0x0060 }, { 4563, 0x0000 }, + { 4563, 0x0000 }, { 4563, 0x0080 }, { 4564, 0x1000 }, { 4565, 0x000c }, + { 4567, 0x0000 }, { 4567, 0x0200 }, { 4568, 0x0080 }, { 4569, 0x0000 }, + /* 0x28f00 */ + { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, + { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, + { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, + { 4569, 0x0020 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, + /* 0x29000 */ + { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, + { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, + { 4570, 0x0900 }, { 4572, 0x0008 }, { 4573, 0x8000 }, { 4574, 0x0003 }, + { 4576, 0x0001 }, { 4577, 0x0000 }, { 4577, 0x3030 }, { 4581, 0x0000 }, + /* 0x29100 */ + { 4581, 0x2000 }, { 4582, 0x0001 }, { 4583, 0x0000 }, { 4583, 0x1000 }, + { 4584, 0x2000 }, { 4585, 0x4800 }, { 4587, 0x0000 }, { 4587, 0x0001 }, + { 4588, 0x0000 }, { 4588, 0x1000 }, { 4589, 0x0100 }, { 4590, 0x0000 }, + { 4590, 0x0000 }, { 4590, 0x0020 }, { 4591, 0x0800 }, +}; +static const Summary16 hkscs1999_uni2indx_page294[32] = { + /* 0x29400 */ + { 4592, 0x0000 }, { 4592, 0x2000 }, { 4593, 0x0001 }, { 4594, 0x8008 }, + { 4596, 0x0100 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, + { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, + { 4597, 0x0000 }, { 4597, 0x0601 }, { 4600, 0x00a0 }, { 4602, 0x0000 }, + /* 0x29500 */ + { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, + { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, + { 4602, 0x0000 }, { 4602, 0x4000 }, { 4603, 0x0000 }, { 4603, 0x0101 }, + { 4605, 0x0000 }, { 4605, 0x0080 }, { 4606, 0x0200 }, { 4607, 0x0010 }, +}; +static const Summary16 hkscs1999_uni2indx_page297[251] = { + /* 0x29700 */ + { 4608, 0x0000 }, { 4608, 0x0000 }, { 4608, 0x0001 }, { 4609, 0x0004 }, + { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, + { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, + { 4610, 0x0000 }, { 4610, 0x0010 }, { 4611, 0x0000 }, { 4611, 0x0000 }, + /* 0x29800 */ + { 4611, 0x0000 }, { 4611, 0x0001 }, { 4612, 0x0000 }, { 4612, 0x0000 }, + { 4612, 0x0000 }, { 4612, 0x0080 }, { 4613, 0x0000 }, { 4613, 0x0000 }, + { 4613, 0x0000 }, { 4613, 0x0000 }, { 4613, 0x0010 }, { 4614, 0x0000 }, + { 4614, 0x0000 }, { 4614, 0x0002 }, { 4615, 0x0400 }, { 4616, 0x0002 }, + /* 0x29900 */ + { 4617, 0x0028 }, { 4619, 0x0000 }, { 4619, 0x8000 }, { 4620, 0x0000 }, + { 4620, 0x0300 }, { 4622, 0x2000 }, { 4623, 0x0400 }, { 4624, 0x0000 }, + { 4624, 0x0000 }, { 4624, 0x2000 }, { 4625, 0x0000 }, { 4625, 0x0000 }, + { 4625, 0x0208 }, { 4627, 0x0000 }, { 4627, 0x0000 }, { 4627, 0x0000 }, + /* 0x29a00 */ + { 4627, 0x0000 }, { 4627, 0x0000 }, { 4627, 0x0100 }, { 4628, 0x0000 }, + { 4628, 0x2000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, + { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, + { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, + /* 0x29b00 */ + { 4629, 0x4020 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, + { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, + { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, + { 4631, 0x0000 }, { 4631, 0x0020 }, { 4632, 0x0000 }, { 4632, 0x0000 }, + /* 0x29c00 */ + { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, + { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, + { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x2000 }, { 4633, 0x0000 }, + { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, + /* 0x29d00 */ + { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x4000 }, + { 4634, 0x0000 }, { 4634, 0x0400 }, { 4635, 0x0000 }, { 4635, 0x1000 }, + { 4636, 0x0000 }, { 4636, 0x0900 }, { 4638, 0x0000 }, { 4638, 0x0000 }, + { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0040 }, + /* 0x29e00 */ + { 4639, 0x0040 }, { 4640, 0x0000 }, { 4640, 0x2000 }, { 4641, 0x0000 }, + { 4641, 0x0000 }, { 4641, 0x0000 }, { 4641, 0x0100 }, { 4642, 0x0000 }, + { 4642, 0x0000 }, { 4642, 0x0000 }, { 4642, 0x1000 }, { 4643, 0x0000 }, + { 4643, 0x0008 }, { 4644, 0x0000 }, { 4644, 0x0000 }, { 4644, 0x0100 }, + /* 0x29f00 */ + { 4645, 0x0000 }, { 4645, 0x0000 }, { 4645, 0x0008 }, { 4646, 0x0001 }, + { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, + { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0080 }, + { 4648, 0x0000 }, { 4648, 0x4000 }, { 4649, 0x0000 }, { 4649, 0x0000 }, + /* 0x2a000 */ + { 4649, 0x0000 }, { 4649, 0x0010 }, { 4650, 0x0000 }, { 4650, 0x0000 }, + { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, + { 4650, 0x0080 }, { 4651, 0x0000 }, { 4651, 0x0000 }, { 4651, 0x0200 }, + { 4652, 0x0000 }, { 4652, 0x0000 }, { 4652, 0x2002 }, { 4654, 0x4108 }, + /* 0x2a100 */ + { 4657, 0x0000 }, { 4657, 0x0000 }, { 4657, 0x0008 }, { 4658, 0x0018 }, + { 4660, 0x0000 }, { 4660, 0x0001 }, { 4661, 0x0000 }, { 4661, 0x0000 }, + { 4661, 0x0000 }, { 4661, 0x000c }, { 4663, 0x0800 }, { 4664, 0x0010 }, + { 4665, 0x0000 }, { 4665, 0x8000 }, { 4666, 0x0000 }, { 4666, 0x0020 }, + /* 0x2a200 */ + { 4667, 0x0000 }, { 4667, 0x0000 }, { 4667, 0x0001 }, { 4668, 0x0008 }, + { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x0000 }, + { 4669, 0x0000 }, { 4669, 0x8008 }, { 4671, 0x0000 }, { 4671, 0x2054 }, + { 4675, 0x0000 }, { 4675, 0x8000 }, { 4676, 0x0000 }, { 4676, 0x8000 }, + /* 0x2a300 */ + { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, + { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, + { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0200 }, { 4678, 0x0000 }, + { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, + /* 0x2a400 */ + { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0010 }, + { 4679, 0x0000 }, { 4679, 0x0800 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + /* 0x2a500 */ + { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, + { 4680, 0x0840 }, { 4682, 0x0000 }, { 4682, 0x0000 }, { 4682, 0x0000 }, + /* 0x2a600 */ + { 4682, 0x0002 }, { 4683, 0x0000 }, { 4683, 0x0000 }, { 4683, 0x0004 }, + { 4684, 0x0400 }, { 4685, 0x0800 }, { 4686, 0x0000 }, { 4686, 0x0000 }, + { 4686, 0x0000 }, { 4686, 0x0000 }, { 4686, 0x0200 }, +}; +static const Summary16 hkscs1999_uni2indx_page2f8[30] = { + /* 0x2f800 */ + { 4687, 0x0000 }, { 4687, 0x0000 }, { 4687, 0x0020 }, { 4688, 0x0800 }, + { 4689, 0x0001 }, { 4690, 0x0000 }, { 4690, 0x0000 }, { 4690, 0x0100 }, + { 4691, 0x0000 }, { 4691, 0x0010 }, { 4692, 0x0040 }, { 4693, 0x0000 }, + { 4693, 0x2000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, + /* 0x2f900 */ + { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, + { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, + { 4694, 0x0000 }, { 4694, 0x0010 }, { 4695, 0x0000 }, { 4695, 0x1004 }, + { 4697, 0x0000 }, { 4697, 0x0010 }, +}; + +static int +hkscs1999_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x02d0) + summary = &hkscs1999_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x0400 && wc < 0x0460) + summary = &hkscs1999_uni2indx_page04[(wc>>4)-0x040]; + else if (wc >= 0x1e00 && wc < 0x1ed0) + summary = &hkscs1999_uni2indx_page1e[(wc>>4)-0x1e0]; + else if (wc >= 0x2100 && wc < 0x21f0) + summary = &hkscs1999_uni2indx_page21[(wc>>4)-0x210]; + else if (wc >= 0x2300 && wc < 0x2580) + summary = &hkscs1999_uni2indx_page23[(wc>>4)-0x230]; + else if (wc >= 0x2700 && wc < 0x2740) + summary = &hkscs1999_uni2indx_page27[(wc>>4)-0x270]; + else if (wc >= 0x2e00 && wc < 0x3240) + summary = &hkscs1999_uni2indx_page2e[(wc>>4)-0x2e0]; + else if (wc >= 0x3400 && wc < 0x9fc0) + summary = &hkscs1999_uni2indx_page34[(wc>>4)-0x340]; + else if (wc >= 0xf900 && wc < 0xf910) + summary = &hkscs1999_uni2indx_pagef9[(wc>>4)-0xf90]; + else if (wc >= 0xff00 && wc < 0xfff0) + summary = &hkscs1999_uni2indx_pageff[(wc>>4)-0xff0]; + else if (wc >= 0x20000 && wc < 0x291f0) + summary = &hkscs1999_uni2indx_page200[(wc>>4)-0x2000]; + else if (wc >= 0x29400 && wc < 0x29600) + summary = &hkscs1999_uni2indx_page294[(wc>>4)-0x2940]; + else if (wc >= 0x29700 && wc < 0x2a6b0) + summary = &hkscs1999_uni2indx_page297[(wc>>4)-0x2970]; + else if (wc >= 0x2f800 && wc < 0x2f9e0) + summary = &hkscs1999_uni2indx_page2f8[(wc>>4)-0x2f80]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = hkscs1999_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/hkscs2001.h b/Externals/libiconv-1.14/lib/hkscs2001.h new file mode 100644 index 0000000000..66642cf9cc --- /dev/null +++ b/Externals/libiconv-1.14/lib/hkscs2001.h @@ -0,0 +1,683 @@ +/* + * Copyright (C) 1999-2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HKSCS:2001 + */ + +static const unsigned short hkscs2001_2uni_page8c[123] = { + /* 0x8c */ + 0x0a3b, 0x1cfe, 0x5273, 0x37a6, 0x02c9, 0x2d8f, 0x414e, 0x1d77, + 0x12f5, 0x0620, 0x45cd, 0x0059, 0x4830, 0x1622, 0x4f32, 0x30a7, + 0x31f6, 0x1e91, 0x1819, 0x20ba, 0x3e81, 0x5307, 0x018b, 0x3a80, + 0x0610, 0x24e4, 0x2102, 0x0bae, 0x4d0f, 0x0409, 0x1a63, 0x54ba, + 0x0523, 0x2c0f, 0x38fd, 0x252a, 0x5147, 0x4fea, 0x3455, 0x1d4d, + 0x0c24, 0x3c7e, 0x33f4, 0x22d9, 0x4ee3, 0x37a7, 0x23dd, 0x08a3, + 0x09f0, 0x0abc, 0x082f, 0x0917, 0x37a8, 0x0d34, 0x288b, 0x0f92, + 0x0fd0, 0x3bb6, 0x1492, 0x1499, 0x15c2, 0x3d12, 0x178b, 0x3ff9, + 0x1919, 0x1a43, 0x4063, 0x1bff, 0x38fd, 0x1f00, 0x4205, 0x208c, + 0x03db, 0x4413, 0x1115, 0x21b9, 0x2e83, 0x47a4, 0x4695, 0x2593, + 0x26ec, 0x27c3, 0x296c, 0x2af8, 0x2b97, 0x37a9, 0x2d90, 0x37aa, + 0x2fb9, 0x37ab, 0x30cf, 0x2b5f, 0x36e0, 0x3221, 0x37ac, 0x50b9, + 0x393f, 0x0471, 0x05a2, 0x101a, 0x38fd, 0x38fd, 0x38fd, 0x3568, + 0x186b, 0x0576, 0x0e3d, 0x38fd, 0x2bd6, 0x437b, 0x2abf, 0x4c0d, + 0x0781, 0x4a74, 0x137b, 0x4915, 0x4bbe, 0x37ad, 0x37ae, 0x1196, + 0x37af, 0x38fd, 0x295b, +}; + +static const ucs4_t hkscs2001_2uni_upages[85] = { + 0x03500, 0x03c00, 0x03d00, 0x03e00, 0x04000, 0x04200, 0x04b00, 0x04c00, + 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05300, 0x05400, 0x05700, 0x05800, + 0x05a00, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06100, 0x06500, + 0x06700, 0x06900, 0x06a00, 0x06c00, 0x06d00, 0x07000, 0x07100, 0x07200, + 0x07300, 0x07400, 0x07600, 0x07700, 0x07800, 0x07a00, 0x07b00, 0x07c00, + 0x07d00, 0x07e00, 0x08200, 0x08500, 0x08600, 0x08800, 0x08b00, 0x08e00, + 0x08f00, 0x09100, 0x09200, 0x09300, 0x09700, 0x09800, 0x09900, 0x09f00, + 0x0ff00, 0x21400, 0x21900, 0x21d00, 0x22000, 0x22700, 0x23200, 0x23300, + 0x23c00, 0x24100, 0x24500, 0x24900, 0x24a00, 0x25100, 0x25600, 0x25c00, + 0x25d00, 0x26b00, 0x26d00, 0x26f00, 0x27100, 0x28700, 0x28900, 0x28a00, + 0x28d00, 0x29900, 0x29c00, 0x2a100, 0x2a200, +}; + +static int +hkscs2001_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x8c)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 2007) + swc = hkscs2001_2uni_page8c[i-1884], + wc = hkscs2001_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short hkscs2001_2charset[116] = { + 0x8c4b, 0x8c56, 0x8c44, 0x8caa, 0x8c5d, 0x8cc3, 0x8c60, 0x8ccb, + 0x8cc4, 0x8c58, 0x8c49, 0x8cd2, 0x8c72, 0x8c6f, 0x8c73, 0x8c70, + 0x8c40, 0x8c71, 0x8c5b, 0x8c68, 0x8c75, 0x8ccc, 0x8c77, 0x8c78, + 0x8cc5, 0x8cac, 0x8cd9, 0x8c48, 0x8cd4, 0x8c7a, 0x8c7b, 0x8c7c, + 0x8c4d, 0x8c7e, 0x8c52, 0x8cca, 0x8ca2, 0x8ca3, 0x8c5e, 0x8ca5, + 0x8c41, 0x8c67, 0x8c47, 0x8c51, 0x8ca7, 0x8ca9, 0x8c53, 0x8c5a, + 0x8cad, 0x8c6b, 0x8c6e, 0x8c59, 0x8c63, 0x8cb1, 0x8cb2, 0x8cb3, + 0x8c76, 0x8cdc, 0x8cb4, 0x8cd0, 0x8cb5, 0x8cbd, 0x8cb6, 0x8cce, + 0x8c61, 0x8c45, 0x8cb8, 0x8cae, 0x8cba, 0x8c4f, 0x8cbc, 0x8c50, + 0x8cbf, 0x8c6a, 0x8c66, 0x8cc9, 0x8cbe, 0x8c43, 0x8c6d, 0x8c74, + 0x8cb7, 0x8cb9, 0x8cbb, 0x8cc0, 0x8cd7, 0x8cd8, 0x8cda, 0x8cc2, + 0x8c57, 0x8c79, 0x8c69, 0x8c7d, 0x8c54, 0x8ca1, 0x8ca4, 0x8c46, + 0x8ca8, 0x8ccf, 0x8cab, 0x8c4a, 0x8cb0, 0x8caf, 0x8c4c, 0x8cd5, + 0x8cd3, 0x8cd6, 0x8cd1, 0x8c5c, 0x8c6c, 0x8c4e, 0x8c65, 0x8cc1, + 0x8c64, 0x8c42, 0x8c55, 0x8c5f, +}; + +static const Summary16 hkscs2001_uni2indx_page35[6] = { + /* 0x3500 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0200 }, +}; +static const Summary16 hkscs2001_uni2indx_page3c[46] = { + /* 0x3c00 */ + { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, + { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, + { 1, 0x0800 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + /* 0x3d00 */ + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0200 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + /* 0x3e00 */ + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0800 }, +}; +static const Summary16 hkscs2001_uni2indx_page40[8] = { + /* 0x4000 */ + { 4, 0x0200 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0002 }, +}; +static const Summary16 hkscs2001_uni2indx_page42[11] = { + /* 0x4200 */ + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0008 }, { 7, 0x0000 }, + { 7, 0x0000 }, { 7, 0x0000 }, { 7, 0x0000 }, { 7, 0x0040 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0004 }, +}; +static const Summary16 hkscs2001_uni2indx_page4b[25] = { + /* 0x4b00 */ + { 9, 0x0000 }, { 9, 0x0001 }, { 10, 0x0001 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + /* 0x4c00 */ + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0002 }, +}; +static const Summary16 hkscs2001_uni2indx_page4e[59] = { + /* 0x4e00 */ + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x8000 }, { 13, 0x0000 }, + { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, + { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0008 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + /* 0x4f00 */ + { 14, 0x0000 }, { 14, 0x0080 }, { 15, 0x0000 }, { 15, 0x0000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0001 }, + /* 0x5000 */ + { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0800 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x1000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + /* 0x5100 */ + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x4000 }, +}; +static const Summary16 hkscs2001_uni2indx_page53[20] = { + /* 0x5300 */ + { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0010 }, { 20, 0x0000 }, + { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, + { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, + { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, + /* 0x5400 */ + { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0010 }, +}; +static const Summary16 hkscs2001_uni2indx_page57[30] = { + /* 0x5700 */ + { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x2000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + /* 0x5800 */ + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0004 }, { 23, 0x0000 }, { 23, 0x0000 }, + { 23, 0x0000 }, { 23, 0x0001 }, +}; +static const Summary16 hkscs2001_uni2indx_page5a[93] = { + /* 0x5a00 */ + { 24, 0x0000 }, { 24, 0x0400 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + /* 0x5b00 */ + { 25, 0x0000 }, { 25, 0x0020 }, { 26, 0x0000 }, { 26, 0x0000 }, + { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, + { 26, 0x0000 }, { 26, 0x0040 }, { 27, 0x0000 }, { 27, 0x0000 }, + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, + /* 0x5c00 */ + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0020 }, + /* 0x5d00 */ + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0800 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, + /* 0x5e00 */ + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, + { 29, 0x0000 }, { 29, 0x0204 }, { 31, 0x0000 }, { 31, 0x0000 }, + { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, + /* 0x5f00 */ + { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, + { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, + { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, + { 31, 0x0004 }, +}; +static const Summary16 hkscs2001_uni2indx_page61[3] = { + /* 0x6100 */ + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0004 }, +}; +static const Summary16 hkscs2001_uni2indx_page65[9] = { + /* 0x6500 */ + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0800 }, +}; +static const Summary16 hkscs2001_uni2indx_page67[7] = { + /* 0x6700 */ + { 34, 0x0000 }, { 34, 0x0200 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0800 }, +}; +static const Summary16 hkscs2001_uni2indx_page69[23] = { + /* 0x6900 */ + { 36, 0x0000 }, { 36, 0x0200 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + /* 0x6a00 */ + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0008 }, { 38, 0x0000 }, { 38, 0x0008 }, +}; +static const Summary16 hkscs2001_uni2indx_page6c[32] = { + /* 0x6c00 */ + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x8000 }, + /* 0x6d00 */ + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x4000 }, +}; +static const Summary16 hkscs2001_uni2indx_page70[76] = { + /* 0x7000 */ + { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, + { 41, 0x2000 }, { 42, 0x0000 }, { 42, 0x0000 }, { 42, 0x0080 }, + { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, + { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, + /* 0x7100 */ + { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, + { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, + { 43, 0x0000 }, { 43, 0x0002 }, { 44, 0x0000 }, { 44, 0x0000 }, + { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, + /* 0x7200 */ + { 44, 0x0001 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + /* 0x7300 */ + { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, + { 45, 0x1000 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0400 }, + { 47, 0x0000 }, { 47, 0x0000 }, { 47, 0x0000 }, { 47, 0x0000 }, + /* 0x7400 */ + { 47, 0x0004 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, + { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, + { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0200 }, +}; +static const Summary16 hkscs2001_uni2indx_page76[47] = { + /* 0x7600 */ + { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, + { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, + { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, + { 49, 0x0000 }, { 49, 0x0200 }, { 50, 0x0000 }, { 50, 0x0000 }, + /* 0x7700 */ + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x2000 }, { 51, 0x0000 }, { 51, 0x0000 }, + /* 0x7800 */ + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0010 }, +}; +static const Summary16 hkscs2001_uni2indx_page7a[71] = { + /* 0x7a00 */ + { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0400 }, { 53, 0x0000 }, + { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, + { 53, 0x0000 }, { 53, 0x0008 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + /* 0x7b00 */ + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x1000 }, { 55, 0x0000 }, + /* 0x7c00 */ + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0008 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, + /* 0x7d00 */ + { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, + { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, + { 56, 0x0800 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + /* 0x7e00 */ + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0800 }, { 58, 0x1000 }, +}; +static const Summary16 hkscs2001_uni2indx_page82[16] = { + /* 0x8200 */ + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x8000 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0100 }, +}; +static const Summary16 hkscs2001_uni2indx_page85[17] = { + /* 0x8500 */ + { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, + { 61, 0x0000 }, { 61, 0x8000 }, { 62, 0x0000 }, { 62, 0x0000 }, + { 62, 0x0000 }, { 62, 0x0080 }, { 63, 0x0000 }, { 63, 0x0000 }, + { 63, 0x0000 }, { 63, 0x0040 }, { 64, 0x0000 }, { 64, 0x0000 }, + /* 0x8600 */ + { 64, 0x8000 }, +}; +static const Summary16 hkscs2001_uni2indx_page88[10] = { + /* 0x8800 */ + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + { 65, 0x8000 }, { 66, 0x0001 }, +}; +static const Summary16 hkscs2001_uni2indx_page8b[9] = { + /* 0x8b00 */ + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0008 }, +}; +static const Summary16 hkscs2001_uni2indx_page8e[29] = { + /* 0x8e00 */ + { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, + { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, + { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0200 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + /* 0x8f00 */ + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0080 }, { 70, 0x0000 }, + { 70, 0x8000 }, +}; +static const Summary16 hkscs2001_uni2indx_page91[48] = { + /* 0x9100 */ + { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, + { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, + { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, + { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0040 }, + /* 0x9200 */ + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0002 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + /* 0x9300 */ + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0010 }, +}; +static const Summary16 hkscs2001_uni2indx_page97[47] = { + /* 0x9700 */ + { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, + { 74, 0x0000 }, { 74, 0x0020 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, + /* 0x9800 */ + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0100 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + /* 0x9900 */ + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0001 }, +}; +static const Summary16 hkscs2001_uni2indx_page9f[11] = { + /* 0x9f00 */ + { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, + { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, + { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0xffc0 }, +}; +static const Summary16 hkscs2001_uni2indx_page214[4] = { + /* 0x21400 */ + { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x8000 }, +}; +static const Summary16 hkscs2001_uni2indx_page219[9] = { + /* 0x21900 */ + { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, + { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, + { 88, 0x0001 }, +}; +static const Summary16 hkscs2001_uni2indx_page21d[12] = { + /* 0x21d00 */ + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0040 }, +}; +static const Summary16 hkscs2001_uni2indx_page220[8] = { + /* 0x22000 */ + { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, + { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x4000 }, +}; +static const Summary16 hkscs2001_uni2indx_page227[2] = { + /* 0x22700 */ + { 91, 0x0000 }, { 91, 0x0004 }, +}; +static const Summary16 hkscs2001_uni2indx_page232[32] = { + /* 0x23200 */ + { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, + { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, + { 92, 0x0002 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + /* 0x23300 */ + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0200 }, +}; +static const Summary16 hkscs2001_uni2indx_page23c[7] = { + /* 0x23c00 */ + { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, + { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0008 }, +}; +static const Summary16 hkscs2001_uni2indx_page241[5] = { + /* 0x24100 */ + { 95, 0x0000 }, { 95, 0x0000 }, { 95, 0x0000 }, { 95, 0x0000 }, + { 95, 0x4000 }, +}; +static const Summary16 hkscs2001_uni2indx_page245[1] = { + /* 0x24500 */ + { 96, 0x0020 }, +}; +static const Summary16 hkscs2001_uni2indx_page249[18] = { + /* 0x24900 */ + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0800 }, + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, + /* 0x24a00 */ + { 98, 0x0000 }, { 98, 0x0008 }, +}; +static const Summary16 hkscs2001_uni2indx_page251[13] = { + /* 0x25100 */ + { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, + { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, + { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, + { 99, 0x2000 }, +}; +static const Summary16 hkscs2001_uni2indx_page256[10] = { + /* 0x25600 */ + { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, + { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, + { 100, 0x0000 }, { 100, 0x0020 }, +}; +static const Summary16 hkscs2001_uni2indx_page25c[20] = { + /* 0x25c00 */ + { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, + { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, + { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0010 }, { 102, 0x0000 }, + { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, + /* 0x25d00 */ + { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0001 }, +}; +static const Summary16 hkscs2001_uni2indx_page26b[2] = { + /* 0x26b00 */ + { 103, 0x0000 }, { 103, 0x0020 }, +}; +static const Summary16 hkscs2001_uni2indx_page26d[8] = { + /* 0x26d00 */ + { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, + { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0010 }, +}; +static const Summary16 hkscs2001_uni2indx_page26f[12] = { + /* 0x26f00 */ + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x4000 }, +}; +static const Summary16 hkscs2001_uni2indx_page271[1] = { + /* 0x27100 */ + { 106, 0x2000 }, +}; +static const Summary16 hkscs2001_uni2indx_page287[1] = { + /* 0x28700 */ + { 107, 0x8000 }, +}; +static const Summary16 hkscs2001_uni2indx_page289[31] = { + /* 0x28900 */ + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0008 }, { 109, 0x0000 }, + /* 0x28a00 */ + { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0004 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0400 }, +}; +static const Summary16 hkscs2001_uni2indx_page28d[12] = { + /* 0x28d00 */ + { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, + { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, + { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0200 }, +}; +static const Summary16 hkscs2001_uni2indx_page299[5] = { + /* 0x29900 */ + { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, + { 112, 0x0080 }, +}; +static const Summary16 hkscs2001_uni2indx_page29c[8] = { + /* 0x29c00 */ + { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, + { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0008 }, +}; +static const Summary16 hkscs2001_uni2indx_page2a1[28] = { + /* 0x2a100 */ + { 114, 0x0080 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + /* 0x2a200 */ + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0400 }, +}; + +static int +hkscs2001_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc < 0x9f00) { + if (wc < 0x6900) { + if (wc >= 0x3500 && wc < 0x3560) + summary = &hkscs2001_uni2indx_page35[(wc>>4)-0x350]; + else if (wc >= 0x3c00 && wc < 0x3ee0) + summary = &hkscs2001_uni2indx_page3c[(wc>>4)-0x3c0]; + else if (wc >= 0x4000 && wc < 0x4080) + summary = &hkscs2001_uni2indx_page40[(wc>>4)-0x400]; + else if (wc >= 0x4200 && wc < 0x42b0) + summary = &hkscs2001_uni2indx_page42[(wc>>4)-0x420]; + else if (wc >= 0x4b00 && wc < 0x4c90) + summary = &hkscs2001_uni2indx_page4b[(wc>>4)-0x4b0]; + else if (wc >= 0x4e00 && wc < 0x51b0) + summary = &hkscs2001_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0x5300 && wc < 0x5440) + summary = &hkscs2001_uni2indx_page53[(wc>>4)-0x530]; + else if (wc >= 0x5700 && wc < 0x58e0) + summary = &hkscs2001_uni2indx_page57[(wc>>4)-0x570]; + else if (wc >= 0x5a00 && wc < 0x5fd0) + summary = &hkscs2001_uni2indx_page5a[(wc>>4)-0x5a0]; + else if (wc >= 0x6100 && wc < 0x6130) + summary = &hkscs2001_uni2indx_page61[(wc>>4)-0x610]; + else if (wc >= 0x6500 && wc < 0x6590) + summary = &hkscs2001_uni2indx_page65[(wc>>4)-0x650]; + else if (wc >= 0x6700 && wc < 0x6770) + summary = &hkscs2001_uni2indx_page67[(wc>>4)-0x670]; + } else { + if (wc >= 0x6900 && wc < 0x6a70) + summary = &hkscs2001_uni2indx_page69[(wc>>4)-0x690]; + else if (wc >= 0x6c00 && wc < 0x6e00) + summary = &hkscs2001_uni2indx_page6c[(wc>>4)-0x6c0]; + else if (wc >= 0x7000 && wc < 0x74c0) + summary = &hkscs2001_uni2indx_page70[(wc>>4)-0x700]; + else if (wc >= 0x7600 && wc < 0x78f0) + summary = &hkscs2001_uni2indx_page76[(wc>>4)-0x760]; + else if (wc >= 0x7a00 && wc < 0x7e70) + summary = &hkscs2001_uni2indx_page7a[(wc>>4)-0x7a0]; + else if (wc >= 0x8200 && wc < 0x8300) + summary = &hkscs2001_uni2indx_page82[(wc>>4)-0x820]; + else if (wc >= 0x8500 && wc < 0x8610) + summary = &hkscs2001_uni2indx_page85[(wc>>4)-0x850]; + else if (wc >= 0x8800 && wc < 0x88a0) + summary = &hkscs2001_uni2indx_page88[(wc>>4)-0x880]; + else if (wc >= 0x8b00 && wc < 0x8b90) + summary = &hkscs2001_uni2indx_page8b[(wc>>4)-0x8b0]; + else if (wc >= 0x8e00 && wc < 0x8fd0) + summary = &hkscs2001_uni2indx_page8e[(wc>>4)-0x8e0]; + else if (wc >= 0x9100 && wc < 0x9400) + summary = &hkscs2001_uni2indx_page91[(wc>>4)-0x910]; + else if (wc >= 0x9700 && wc < 0x99f0) + summary = &hkscs2001_uni2indx_page97[(wc>>4)-0x970]; + } + } else { + if (wc < 0x25600) { + if (wc >= 0x9f00 && wc < 0x9fb0) + summary = &hkscs2001_uni2indx_page9f[(wc>>4)-0x9f0]; + else if (wc >= 0x21400 && wc < 0x21440) + summary = &hkscs2001_uni2indx_page214[(wc>>4)-0x2140]; + else if (wc >= 0x21900 && wc < 0x21990) + summary = &hkscs2001_uni2indx_page219[(wc>>4)-0x2190]; + else if (wc >= 0x21d00 && wc < 0x21dc0) + summary = &hkscs2001_uni2indx_page21d[(wc>>4)-0x21d0]; + else if (wc >= 0x22000 && wc < 0x22080) + summary = &hkscs2001_uni2indx_page220[(wc>>4)-0x2200]; + else if (wc >= 0x22700 && wc < 0x22720) + summary = &hkscs2001_uni2indx_page227[(wc>>4)-0x2270]; + else if (wc >= 0x23200 && wc < 0x23400) + summary = &hkscs2001_uni2indx_page232[(wc>>4)-0x2320]; + else if (wc >= 0x23c00 && wc < 0x23c70) + summary = &hkscs2001_uni2indx_page23c[(wc>>4)-0x23c0]; + else if (wc >= 0x24100 && wc < 0x24150) + summary = &hkscs2001_uni2indx_page241[(wc>>4)-0x2410]; + else if (wc >= 0x24500 && wc < 0x24510) + summary = &hkscs2001_uni2indx_page245[(wc>>4)-0x2450]; + else if (wc >= 0x24900 && wc < 0x24a20) + summary = &hkscs2001_uni2indx_page249[(wc>>4)-0x2490]; + else if (wc >= 0x25100 && wc < 0x251d0) + summary = &hkscs2001_uni2indx_page251[(wc>>4)-0x2510]; + } else { + if (wc >= 0x25600 && wc < 0x256a0) + summary = &hkscs2001_uni2indx_page256[(wc>>4)-0x2560]; + else if (wc >= 0x25c00 && wc < 0x25d40) + summary = &hkscs2001_uni2indx_page25c[(wc>>4)-0x25c0]; + else if (wc >= 0x26b00 && wc < 0x26b20) + summary = &hkscs2001_uni2indx_page26b[(wc>>4)-0x26b0]; + else if (wc >= 0x26d00 && wc < 0x26d80) + summary = &hkscs2001_uni2indx_page26d[(wc>>4)-0x26d0]; + else if (wc >= 0x26f00 && wc < 0x26fc0) + summary = &hkscs2001_uni2indx_page26f[(wc>>4)-0x26f0]; + else if (wc >= 0x27100 && wc < 0x27110) + summary = &hkscs2001_uni2indx_page271[(wc>>4)-0x2710]; + else if (wc >= 0x28700 && wc < 0x28710) + summary = &hkscs2001_uni2indx_page287[(wc>>4)-0x2870]; + else if (wc >= 0x28900 && wc < 0x28af0) + summary = &hkscs2001_uni2indx_page289[(wc>>4)-0x2890]; + else if (wc >= 0x28d00 && wc < 0x28dc0) + summary = &hkscs2001_uni2indx_page28d[(wc>>4)-0x28d0]; + else if (wc >= 0x29900 && wc < 0x29950) + summary = &hkscs2001_uni2indx_page299[(wc>>4)-0x2990]; + else if (wc >= 0x29c00 && wc < 0x29c80) + summary = &hkscs2001_uni2indx_page29c[(wc>>4)-0x29c0]; + else if (wc >= 0x2a100 && wc < 0x2a2c0) + summary = &hkscs2001_uni2indx_page2a1[(wc>>4)-0x2a10]; + } + } + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = hkscs2001_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/hkscs2004.h b/Externals/libiconv-1.14/lib/hkscs2004.h new file mode 100644 index 0000000000..d5ab99748c --- /dev/null +++ b/Externals/libiconv-1.14/lib/hkscs2004.h @@ -0,0 +1,679 @@ +/* + * Copyright (C) 1999-2006 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HKSCS:2004 + */ + +static const unsigned short hkscs2004_2uni_page87[58] = { + /* 0x87 */ + 0x0af0, 0x1032, 0x0d03, 0x0ca6, 0x0c78, 0x4167, 0x1177, 0x0cb3, + 0x44b1, 0x10e2, 0x44c5, 0x0595, 0x0e36, 0x0e44, 0x1047, 0x1040, + 0x39bf, 0x3417, 0x4252, 0x3f8b, 0x40d2, 0x1057, 0x4d51, 0x0e4f, + 0x0cda, 0x1085, 0x446c, 0x1107, 0x0fa4, 0x0da1, 0x3d23, 0x1e25, + 0x3c54, 0x2d63, 0x3606, 0x3761, 0x1a4d, 0x13fb, 0x28fd, 0x2195, + 0x141d, 0x47b9, 0x06f4, 0x2534, 0x43ef, 0x16db, 0x2e5e, 0x15a4, + 0x0125, 0x4bb0, 0x15d1, 0x16b7, 0x17fc, 0x1b6e, 0x2393, 0x4a45, + 0x1f61, 0x1f9d, +}; +static const unsigned short hkscs2004_2uni_page8c[189] = { + /* 0x8c */ + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x2b6f, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, + 0x28fd, 0x1ae7, 0x28fd, 0x1c57, 0x20ca, 0x0688, 0x0bc3, 0x3256, + 0x3196, 0x0a9a, 0x0c36, 0x28fd, 0x17d5, 0x351a, 0x24f9, 0x1778, + 0x0612, 0x3351, 0x1878, 0x27b2, 0x1d57, 0x0c58, 0x38ec, 0x2f23, + 0x1077, 0x0478, 0x004a, 0x29a4, 0x3e41, 0x24cc, 0x12b4, 0x2a39, + 0x14bf, 0x226c, 0x2656, 0x49fa, 0x193b, + /* 0x8d */ + 0x2c9f, 0x28fd, 0x30c1, 0x466d, 0x0902, 0x0dbb, 0x4879, 0x0707, + 0x27b3, 0x4cb5, 0x08f8, 0x02d6, 0x0df7, 0x3e46, 0x097c, 0x45b2, + 0x42ff, 0x0c6d, 0x03d4, 0x3b9a, 0x0c61, 0x0c1b, 0x1189, 0x107b, + 0x1176, 0x0cea, 0x07c8, 0x3a0f, 0x0161, 0x0bde, 0x0bbd, 0x09ed, +}; + +static const ucs4_t hkscs2004_2uni_upages[78] = { + 0x03400, 0x03600, 0x03700, 0x03800, 0x03900, 0x03b00, 0x03d00, 0x03f00, + 0x04000, 0x04100, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04a00, + 0x04c00, 0x04d00, 0x04f00, 0x05600, 0x05900, 0x05a00, 0x05b00, 0x05c00, + 0x05d00, 0x05f00, 0x06600, 0x06700, 0x06e00, 0x07100, 0x07200, 0x07400, + 0x07900, 0x07d00, 0x08100, 0x08500, 0x08a00, 0x09700, 0x09800, 0x09f00, + 0x0ff00, 0x20100, 0x20200, 0x20a00, 0x20b00, 0x21a00, 0x21d00, 0x21e00, + 0x22100, 0x22700, 0x23200, 0x23500, 0x23600, 0x23b00, 0x23e00, 0x23f00, + 0x24000, 0x24200, 0x24b00, 0x25400, 0x25a00, 0x26b00, 0x26c00, 0x26e00, + 0x27000, 0x27200, 0x27300, 0x27b00, 0x27c00, 0x28600, 0x28900, 0x28b00, + 0x29000, 0x29800, 0x29900, 0x29e00, 0x2a100, 0x2a300, +}; + +static int +hkscs2004_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x87) || (c1 >= 0x8c && c1 <= 0x8d)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + ucs4_t wc = 0xfffd; + unsigned short swc; + if (i < 1884) { + if (i < 1157) + swc = hkscs2004_2uni_page87[i-1099], + wc = hkscs2004_2uni_upages[swc>>8] | (swc & 0xff); + } else { + if (i < 2073) + swc = hkscs2004_2uni_page8c[i-1884], + wc = hkscs2004_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short hkscs2004_2charset[123] = { + 0x8cf4, 0x8770, 0x8d5c, 0x8d4b, 0x8d52, 0x8cf3, 0x874b, 0x8cea, + 0x8cdf, 0x876a, 0x8d47, 0x8d5a, 0x8d4a, 0x8d44, 0x8d4e, 0x8d5f, + 0x8ce3, 0x8740, 0x8d5e, 0x8ce0, 0x8d5d, 0x8d55, 0x8ce4, 0x8cef, + 0x8d54, 0x8d51, 0x8744, 0x8743, 0x8747, 0x8758, 0x8d59, 0x8742, + 0x875d, 0x8d45, 0x8d4c, 0x874c, 0x874d, 0x8757, 0x875c, 0x8741, + 0x874f, 0x874e, 0x8755, 0x8cf2, 0x8d57, 0x8759, 0x8749, 0x875b, + 0x8d58, 0x8746, 0x8d56, 0x8cf8, 0x8765, 0x8768, 0x8cfa, 0x876f, + 0x8772, 0x8773, 0x876d, 0x8ce9, 0x8ce6, 0x8774, 0x8cec, 0x8cfe, + 0x8764, 0x8cdb, 0x8775, 0x8cdd, 0x8cee, 0x875f, 0x8778, 0x8779, + 0x8cde, 0x8767, 0x8cfb, 0x8776, 0x8cf7, 0x8ce8, 0x876b, 0x8cfc, + 0x8ced, 0x8d48, 0x8cf5, 0x8cf9, 0x8c62, 0x8d40, 0x8761, 0x876e, + 0x8cf1, 0x8d42, 0x8ce2, 0x8ce1, 0x8ceb, 0x8751, 0x8ce7, 0x8762, + 0x8763, 0x8cf0, 0x8750, 0x8d5b, 0x8d53, 0x8760, 0x875e, 0x8cf6, + 0x8d4d, 0x8753, 0x8754, 0x8745, 0x8752, 0x8d50, 0x876c, 0x875a, + 0x8748, 0x874a, 0x8d4f, 0x8d43, 0x8769, 0x8d46, 0x8cfd, 0x8777, + 0x8771, 0x8d49, 0x8756, +}; + +static const Summary16 hkscs2004_uni2indx_page34[5] = { + /* 0x3400 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0400 }, +}; +static const Summary16 hkscs2004_uni2indx_page36[56] = { + /* 0x3600 */ + { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0020 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0002 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + /* 0x3700 */ + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0040 }, { 4, 0x0000 }, { 4, 0x0000 }, + /* 0x3800 */ + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, + { 4, 0x0000 }, { 4, 0x0010 }, { 5, 0x0000 }, { 5, 0x0000 }, + /* 0x3900 */ + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0100 }, +}; +static const Summary16 hkscs2004_uni2indx_page3b[10] = { + /* 0x3b00 */ + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0000 }, { 6, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page3d[16] = { + /* 0x3d00 */ + { 7, 0x0000 }, { 7, 0x0004 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0100 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0010 }, +}; +static const Summary16 hkscs2004_uni2indx_page3f[47] = { + /* 0x3f00 */ + { 10, 0x0080 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0100 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, + /* 0x4000 */ + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0100 }, + /* 0x4100 */ + { 13, 0x0004 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x1000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x2000 }, +}; +static const Summary16 hkscs2004_uni2indx_page43[69] = { + /* 0x4300 */ + { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, + { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, + { 16, 0x0000 }, { 16, 0x0400 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0001 }, + /* 0x4400 */ + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x2000 }, + { 19, 0x0008 }, { 20, 0x4000 }, { 21, 0x0000 }, { 21, 0x0000 }, + /* 0x4500 */ + { 21, 0x0000 }, { 21, 0x0800 }, { 22, 0x0000 }, { 22, 0x0040 }, + { 23, 0x0000 }, { 23, 0x0100 }, { 24, 0x2002 }, { 26, 0x0100 }, + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0040 }, { 28, 0x0008 }, + { 29, 0x0000 }, { 29, 0x0400 }, { 30, 0x0400 }, { 31, 0x0000 }, + /* 0x4600 */ + { 31, 0x0008 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0002 }, { 33, 0x0800 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0080 }, + /* 0x4700 */ + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0040 }, + { 36, 0x8010 }, +}; +static const Summary16 hkscs2004_uni2indx_page4a[11] = { + /* 0x4a00 */ + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, + { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0010 }, +}; +static const Summary16 hkscs2004_uni2indx_page4c[25] = { + /* 0x4c00 */ + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0004 }, + { 40, 0x0081 }, { 42, 0x0080 }, { 43, 0x0000 }, { 43, 0x0880 }, + { 45, 0x0020 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0000 }, + { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0004 }, { 47, 0x0000 }, + /* 0x4d00 */ + { 47, 0x0080 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, + { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x00c0 }, + { 50, 0x0200 }, +}; +static const Summary16 hkscs2004_uni2indx_page4f[12] = { + /* 0x4f00 */ + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, + { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0010 }, +}; +static const Summary16 hkscs2004_uni2indx_page56[16] = { + /* 0x5600 */ + { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, + { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, + { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, + { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0800 }, +}; +static const Summary16 hkscs2004_uni2indx_page59[72] = { + /* 0x5900 */ + { 53, 0x0000 }, { 53, 0x2000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x8000 }, + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + /* 0x5a00 */ + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0010 }, { 56, 0x0000 }, + { 56, 0x0000 }, { 56, 0x0002 }, { 57, 0x0000 }, { 57, 0x0000 }, + /* 0x5b00 */ + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0080 }, + { 58, 0x0000 }, { 58, 0x0800 }, { 59, 0x0000 }, { 59, 0x0000 }, + /* 0x5c00 */ + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0100 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, + { 60, 0x0000 }, { 60, 0x0020 }, { 61, 0x0000 }, { 61, 0x1000 }, + /* 0x5d00 */ + { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, + { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0100 }, +}; +static const Summary16 hkscs2004_uni2indx_page5f[4] = { + /* 0x5f00 */ + { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0800 }, +}; +static const Summary16 hkscs2004_uni2indx_page66[23] = { + /* 0x6600 */ + { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, + { 64, 0x2000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0080 }, { 66, 0x0000 }, + /* 0x6700 */ + { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, + { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x4000 }, +}; +static const Summary16 hkscs2004_uni2indx_page6e[6] = { + /* 0x6e00 */ + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0000 }, { 67, 0x0080 }, +}; +static const Summary16 hkscs2004_uni2indx_page71[19] = { + /* 0x7100 */ + { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, + { 68, 0x0000 }, { 68, 0x0080 }, { 69, 0x0000 }, { 69, 0x0000 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + /* 0x7200 */ + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page74[10] = { + /* 0x7400 */ + { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, + { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0002 }, { 71, 0x0000 }, + { 71, 0x0000 }, { 71, 0x2000 }, +}; +static const Summary16 hkscs2004_uni2indx_page79[13] = { + /* 0x7900 */ + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, + { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, + { 72, 0x0400 }, +}; +static const Summary16 hkscs2004_uni2indx_page7d[10] = { + /* 0x7d00 */ + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, + { 73, 0x0000 }, { 73, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page81[7] = { + /* 0x8100 */ + { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, + { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x1000 }, +}; +static const Summary16 hkscs2004_uni2indx_page85[10] = { + /* 0x8500 */ + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, + { 75, 0x0000 }, { 75, 0x0008 }, +}; +static const Summary16 hkscs2004_uni2indx_page8a[16] = { + /* 0x8a00 */ + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, + { 76, 0x1000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0200 }, +}; +static const Summary16 hkscs2004_uni2indx_page97[22] = { + /* 0x9700 */ + { 78, 0x0000 }, { 78, 0x0000 }, { 78, 0x0000 }, { 78, 0x0010 }, + { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, + { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, + { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, + /* 0x9800 */ + { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, + { 79, 0x0000 }, { 79, 0x0040 }, +}; +static const Summary16 hkscs2004_uni2indx_page9f[12] = { + /* 0x9f00 */ + { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, + { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, + { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x000c }, +}; +static const Summary16 hkscs2004_uni2indx_page201[20] = { + /* 0x20100 */ + { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, + { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, + { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0010 }, { 83, 0x0000 }, + { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, + /* 0x20200 */ + { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0200 }, +}; +static const Summary16 hkscs2004_uni2indx_page20a[26] = { + /* 0x20a00 */ + { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, + { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x8000 }, { 85, 0x0000 }, + { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, + { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, + /* 0x20b00 */ + { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, + { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, + { 85, 0x0000 }, { 85, 0x8000 }, +}; +static const Summary16 hkscs2004_uni2indx_page21a[7] = { + /* 0x21a00 */ + { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, + { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0008 }, +}; +static const Summary16 hkscs2004_uni2indx_page21d[19] = { + /* 0x21d00 */ + { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, + { 87, 0x0000 }, { 87, 0x4000 }, { 88, 0x0000 }, { 88, 0x0000 }, + { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, + { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, + /* 0x21e00 */ + { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0008 }, +}; +static const Summary16 hkscs2004_uni2indx_page221[13] = { + /* 0x22100 */ + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, + { 89, 0x0002 }, +}; +static const Summary16 hkscs2004_uni2indx_page227[10] = { + /* 0x22700 */ + { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, + { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, + { 90, 0x0000 }, { 90, 0x0040 }, +}; +static const Summary16 hkscs2004_uni2indx_page232[6] = { + /* 0x23200 */ + { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0000 }, + { 91, 0x0000 }, { 91, 0x0040 }, +}; +static const Summary16 hkscs2004_uni2indx_page235[18] = { + /* 0x23500 */ + { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, + { 92, 0x0000 }, { 92, 0x0002 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, + /* 0x23600 */ + { 93, 0x0000 }, { 93, 0x0080 }, +}; +static const Summary16 hkscs2004_uni2indx_page23b[2] = { + /* 0x23b00 */ + { 94, 0x0000 }, { 94, 0x0400 }, +}; +static const Summary16 hkscs2004_uni2indx_page23e[47] = { + /* 0x23e00 */ + { 95, 0x0040 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, + { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, + { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, + { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, + /* 0x23f00 */ + { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, + { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0002 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + /* 0x24000 */ + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, + { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x1000 }, +}; +static const Summary16 hkscs2004_uni2indx_page242[12] = { + /* 0x24200 */ + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, + { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x8000 }, +}; +static const Summary16 hkscs2004_uni2indx_page24b[1] = { + /* 0x24b00 */ + { 99, 0x8000 }, +}; +static const Summary16 hkscs2004_uni2indx_page254[10] = { + /* 0x25400 */ + { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, + { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, + { 100, 0x0000 }, { 100, 0x0400 }, +}; +static const Summary16 hkscs2004_uni2indx_page25a[6] = { + /* 0x25a00 */ + { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, + { 101, 0x0000 }, { 101, 0x0010 }, +}; +static const Summary16 hkscs2004_uni2indx_page26b[21] = { + /* 0x26b00 */ + { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0008 }, { 103, 0x0000 }, + { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, + { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, + { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, + /* 0x26c00 */ + { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, + { 103, 0x0042 }, +}; +static const Summary16 hkscs2004_uni2indx_page26e[9] = { + /* 0x26e00 */ + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, + { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, + { 105, 0x0800 }, +}; +static const Summary16 hkscs2004_uni2indx_page270[14] = { + /* 0x27000 */ + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, + { 106, 0x0000 }, { 106, 0x0004 }, +}; +static const Summary16 hkscs2004_uni2indx_page272[32] = { + /* 0x27200 */ + { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, + { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0080 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + /* 0x27300 */ + { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, + { 108, 0x0000 }, { 108, 0x0004 }, { 109, 0x0000 }, { 109, 0x0000 }, + { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, + { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x8000 }, +}; +static const Summary16 hkscs2004_uni2indx_page27b[29] = { + /* 0x27b00 */ + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, + { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x8000 }, { 111, 0x0000 }, + /* 0x27c00 */ + { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, + { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x1000 }, { 112, 0x0000 }, + { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0002 }, + { 113, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page286[12] = { + /* 0x28600 */ + { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, + { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, + { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0004 }, +}; +static const Summary16 hkscs2004_uni2indx_page289[7] = { + /* 0x28900 */ + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, + { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x2000 }, +}; +static const Summary16 hkscs2004_uni2indx_page28b[12] = { + /* 0x28b00 */ + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0200 }, +}; +static const Summary16 hkscs2004_uni2indx_page290[8] = { + /* 0x29000 */ + { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, + { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0200 }, +}; +static const Summary16 hkscs2004_uni2indx_page298[21] = { + /* 0x29800 */ + { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, + { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, + { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, + { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0400 }, + /* 0x29900 */ + { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, + { 119, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page29e[12] = { + /* 0x29e00 */ + { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, + { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, + { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0001 }, +}; +static const Summary16 hkscs2004_uni2indx_page2a1[12] = { + /* 0x2a100 */ + { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, + { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, + { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0020 }, +}; +static const Summary16 hkscs2004_uni2indx_page2a3[6] = { + /* 0x2a300 */ + { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, + { 122, 0x0000 }, { 122, 0x0002 }, +}; + +static int +hkscs2004_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc < 0x21a00) { + if (wc < 0x6e00) { + if (wc >= 0x3400 && wc < 0x3450) + summary = &hkscs2004_uni2indx_page34[(wc>>4)-0x340]; + else if (wc >= 0x3600 && wc < 0x3980) + summary = &hkscs2004_uni2indx_page36[(wc>>4)-0x360]; + else if (wc >= 0x3b00 && wc < 0x3ba0) + summary = &hkscs2004_uni2indx_page3b[(wc>>4)-0x3b0]; + else if (wc >= 0x3d00 && wc < 0x3e00) + summary = &hkscs2004_uni2indx_page3d[(wc>>4)-0x3d0]; + else if (wc >= 0x3f00 && wc < 0x41f0) + summary = &hkscs2004_uni2indx_page3f[(wc>>4)-0x3f0]; + else if (wc >= 0x4300 && wc < 0x4750) + summary = &hkscs2004_uni2indx_page43[(wc>>4)-0x430]; + else if (wc >= 0x4a00 && wc < 0x4ab0) + summary = &hkscs2004_uni2indx_page4a[(wc>>4)-0x4a0]; + else if (wc >= 0x4c00 && wc < 0x4d90) + summary = &hkscs2004_uni2indx_page4c[(wc>>4)-0x4c0]; + else if (wc >= 0x4f00 && wc < 0x4fc0) + summary = &hkscs2004_uni2indx_page4f[(wc>>4)-0x4f0]; + else if (wc >= 0x5600 && wc < 0x5700) + summary = &hkscs2004_uni2indx_page56[(wc>>4)-0x560]; + else if (wc >= 0x5900 && wc < 0x5d80) + summary = &hkscs2004_uni2indx_page59[(wc>>4)-0x590]; + else if (wc >= 0x5f00 && wc < 0x5f40) + summary = &hkscs2004_uni2indx_page5f[(wc>>4)-0x5f0]; + else if (wc >= 0x6600 && wc < 0x6770) + summary = &hkscs2004_uni2indx_page66[(wc>>4)-0x660]; + } else { + if (wc >= 0x6e00 && wc < 0x6e60) + summary = &hkscs2004_uni2indx_page6e[(wc>>4)-0x6e0]; + else if (wc >= 0x7100 && wc < 0x7230) + summary = &hkscs2004_uni2indx_page71[(wc>>4)-0x710]; + else if (wc >= 0x7400 && wc < 0x74a0) + summary = &hkscs2004_uni2indx_page74[(wc>>4)-0x740]; + else if (wc >= 0x7900 && wc < 0x79d0) + summary = &hkscs2004_uni2indx_page79[(wc>>4)-0x790]; + else if (wc >= 0x7d00 && wc < 0x7da0) + summary = &hkscs2004_uni2indx_page7d[(wc>>4)-0x7d0]; + else if (wc >= 0x8100 && wc < 0x8170) + summary = &hkscs2004_uni2indx_page81[(wc>>4)-0x810]; + else if (wc >= 0x8500 && wc < 0x85a0) + summary = &hkscs2004_uni2indx_page85[(wc>>4)-0x850]; + else if (wc >= 0x8a00 && wc < 0x8b00) + summary = &hkscs2004_uni2indx_page8a[(wc>>4)-0x8a0]; + else if (wc >= 0x9700 && wc < 0x9860) + summary = &hkscs2004_uni2indx_page97[(wc>>4)-0x970]; + else if (wc >= 0x9f00 && wc < 0x9fc0) + summary = &hkscs2004_uni2indx_page9f[(wc>>4)-0x9f0]; + else if (wc >= 0x20100 && wc < 0x20240) + summary = &hkscs2004_uni2indx_page201[(wc>>4)-0x2010]; + else if (wc >= 0x20a00 && wc < 0x20ba0) + summary = &hkscs2004_uni2indx_page20a[(wc>>4)-0x20a0]; + } + } else { + if (wc < 0x26b00) { + if (wc >= 0x21a00 && wc < 0x21a70) + summary = &hkscs2004_uni2indx_page21a[(wc>>4)-0x21a0]; + else if (wc >= 0x21d00 && wc < 0x21e30) + summary = &hkscs2004_uni2indx_page21d[(wc>>4)-0x21d0]; + else if (wc >= 0x22100 && wc < 0x221d0) + summary = &hkscs2004_uni2indx_page221[(wc>>4)-0x2210]; + else if (wc >= 0x22700 && wc < 0x227a0) + summary = &hkscs2004_uni2indx_page227[(wc>>4)-0x2270]; + else if (wc >= 0x23200 && wc < 0x23260) + summary = &hkscs2004_uni2indx_page232[(wc>>4)-0x2320]; + else if (wc >= 0x23500 && wc < 0x23620) + summary = &hkscs2004_uni2indx_page235[(wc>>4)-0x2350]; + else if (wc >= 0x23b00 && wc < 0x23b20) + summary = &hkscs2004_uni2indx_page23b[(wc>>4)-0x23b0]; + else if (wc >= 0x23e00 && wc < 0x240f0) + summary = &hkscs2004_uni2indx_page23e[(wc>>4)-0x23e0]; + else if (wc >= 0x24200 && wc < 0x242c0) + summary = &hkscs2004_uni2indx_page242[(wc>>4)-0x2420]; + else if (wc >= 0x24b00 && wc < 0x24b10) + summary = &hkscs2004_uni2indx_page24b[(wc>>4)-0x24b0]; + else if (wc >= 0x25400 && wc < 0x254a0) + summary = &hkscs2004_uni2indx_page254[(wc>>4)-0x2540]; + else if (wc >= 0x25a00 && wc < 0x25a60) + summary = &hkscs2004_uni2indx_page25a[(wc>>4)-0x25a0]; + } else { + if (wc >= 0x26b00 && wc < 0x26c50) + summary = &hkscs2004_uni2indx_page26b[(wc>>4)-0x26b0]; + else if (wc >= 0x26e00 && wc < 0x26e90) + summary = &hkscs2004_uni2indx_page26e[(wc>>4)-0x26e0]; + else if (wc >= 0x27000 && wc < 0x270e0) + summary = &hkscs2004_uni2indx_page270[(wc>>4)-0x2700]; + else if (wc >= 0x27200 && wc < 0x27400) + summary = &hkscs2004_uni2indx_page272[(wc>>4)-0x2720]; + else if (wc >= 0x27b00 && wc < 0x27cd0) + summary = &hkscs2004_uni2indx_page27b[(wc>>4)-0x27b0]; + else if (wc >= 0x28600 && wc < 0x286c0) + summary = &hkscs2004_uni2indx_page286[(wc>>4)-0x2860]; + else if (wc >= 0x28900 && wc < 0x28970) + summary = &hkscs2004_uni2indx_page289[(wc>>4)-0x2890]; + else if (wc >= 0x28b00 && wc < 0x28bc0) + summary = &hkscs2004_uni2indx_page28b[(wc>>4)-0x28b0]; + else if (wc >= 0x29000 && wc < 0x29080) + summary = &hkscs2004_uni2indx_page290[(wc>>4)-0x2900]; + else if (wc >= 0x29800 && wc < 0x29950) + summary = &hkscs2004_uni2indx_page298[(wc>>4)-0x2980]; + else if (wc >= 0x29e00 && wc < 0x29ec0) + summary = &hkscs2004_uni2indx_page29e[(wc>>4)-0x29e0]; + else if (wc >= 0x2a100 && wc < 0x2a1c0) + summary = &hkscs2004_uni2indx_page2a1[(wc>>4)-0x2a10]; + else if (wc >= 0x2a300 && wc < 0x2a360) + summary = &hkscs2004_uni2indx_page2a3[(wc>>4)-0x2a30]; + } + } + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = hkscs2004_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/hkscs2008.h b/Externals/libiconv-1.14/lib/hkscs2008.h new file mode 100644 index 0000000000..ee6235c0d1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/hkscs2008.h @@ -0,0 +1,467 @@ +/* + * Copyright (C) 1999-2010 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HKSCS:2008 + */ + +static const unsigned short hkscs2008_2uni_page87[126] = { + /* 0x87 */ + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, + 0x22fd, 0x22fd, 0x0175, 0x2453, 0x299e, 0x2d21, 0x03ec, 0x2bde, + 0x02f5, 0x16fc, 0x2197, 0x2a61, 0x300d, 0x26ea, 0x238a, 0x275e, + 0x060a, 0x1884, 0x2196, 0x1f2f, 0x0930, 0x1a13, 0x0d96, 0x204a, + 0x1e18, 0x15d0, 0x1632, 0x0f60, 0x1129, 0x1b9d, 0x144c, 0x17c5, + 0x1082, 0x162c, 0x0a4f, 0x1d46, 0x00e6, 0x13c4, 0x2cb9, 0x14c6, + 0x21c7, 0x0cb3, 0x092f, 0x0b4c, 0x0531, 0x298e, 0x0d18, 0x1672, + 0x2f65, 0x1c8f, 0x08ae, 0x2e88, 0x0581, 0x2c99, 0x17ae, 0x25bc, + 0x21c8, 0x25c1, 0x25c9, 0x25cc, 0x21c9, 0x1904, 0x28bb, 0x04b4, + 0x21ca, 0x07e1, 0x31ff, 0x0ec1, 0x126e, 0x21cb, +}; + +static const ucs4_t hkscs2008_2uni_upages[50] = { + 0x03400, 0x03800, 0x03a00, 0x03e00, 0x04000, 0x04100, 0x04300, 0x04400, + 0x04600, 0x04900, 0x05200, 0x05400, 0x05700, 0x05800, 0x06200, 0x06600, + 0x06700, 0x06a00, 0x07000, 0x07300, 0x07400, 0x07900, 0x07a00, 0x07b00, + 0x08400, 0x08500, 0x08600, 0x08800, 0x08b00, 0x09000, 0x09200, 0x09400, + 0x09700, 0x09f00, 0x0ff00, 0x20a00, 0x21d00, 0x22400, 0x23100, 0x23200, + 0x23500, 0x23600, 0x24100, 0x25800, 0x25d00, 0x26000, 0x26e00, 0x27b00, + 0x28900, 0x2ad00, +}; + +static int +hkscs2008_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x87)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { + unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); + ucs4_t wc = 0xfffd; + unsigned short swc; + { + if (i < 1225) + swc = hkscs2008_2uni_page87[i-1099], + wc = hkscs2008_2uni_upages[swc>>8] | (swc & 0xff); + } + if (wc != 0xfffd) { + *pwc = wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short hkscs2008_2charset[68] = { + 0x87be, 0x877a, 0x87a2, 0x877e, 0x87d9, 0x87c6, 0x87ce, 0x87aa, + 0x87db, 0x87cc, 0x87c4, 0x87ae, 0x87bc, 0x87c5, 0x87c3, 0x87c8, + 0x87b0, 0x87dd, 0x87b5, 0x87ba, 0x87b6, 0x87de, 0x87bf, 0x87b8, + 0x87c1, 0x87b3, 0x87bb, 0x87b4, 0x87c9, 0x87a3, 0x87d0, 0x87b9, + 0x87ab, 0x87d7, 0x87af, 0x87b7, 0x87cb, 0x87bd, 0x87b2, 0x87ad, + 0x87b1, 0x87ac, 0x87a4, 0x87c2, 0x87d2, 0x87d6, 0x87da, 0x87df, + 0x87a8, 0x877b, 0x87d1, 0x87d3, 0x87d4, 0x87d5, 0x87a7, 0x87a9, + 0x87d8, 0x87c7, 0x877c, 0x87a5, 0x87a1, 0x87cf, 0x87c0, 0x877d, + 0x87cd, 0x87ca, 0x87a6, 0x87dc, +}; + +static const Summary16 hkscs2008_uni2indx_page34[15] = { + /* 0x3400 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0040 }, +}; +static const Summary16 hkscs2008_uni2indx_page38[8] = { + /* 0x3800 */ + { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, + { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0020 }, +}; +static const Summary16 hkscs2008_uni2indx_page3a[16] = { + /* 0x3a00 */ + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, + { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0020 }, +}; +static const Summary16 hkscs2008_uni2indx_page3e[15] = { + /* 0x3e00 */ + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, + { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x1000 }, +}; +static const Summary16 hkscs2008_uni2indx_page40[25] = { + /* 0x4000 */ + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, + { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0010 }, + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, + /* 0x4100 */ + { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0002 }, + { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, + { 6, 0x0002 }, +}; +static const Summary16 hkscs2008_uni2indx_page43[31] = { + /* 0x4300 */ + { 7, 0x0400 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + /* 0x4400 */ + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, + { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0002 }, +}; +static const Summary16 hkscs2008_uni2indx_page46[11] = { + /* 0x4600 */ + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, + { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x4000 }, +}; +static const Summary16 hkscs2008_uni2indx_page49[4] = { + /* 0x4900 */ + { 10, 0x0000 }, { 10, 0x0000 }, { 10, 0x8000 }, { 11, 0x0001 }, +}; +static const Summary16 hkscs2008_uni2indx_page52[5] = { + /* 0x5200 */ + { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, + { 12, 0x8000 }, +}; +static const Summary16 hkscs2008_uni2indx_page54[5] = { + /* 0x5400 */ + { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, + { 13, 0x1000 }, +}; +static const Summary16 hkscs2008_uni2indx_page57[26] = { + /* 0x5700 */ + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, + { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0008 }, + { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, + /* 0x5800 */ + { 15, 0x0000 }, { 15, 0x0100 }, { 16, 0x0000 }, { 16, 0x0000 }, + { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, + { 16, 0x0000 }, { 16, 0x0040 }, +}; +static const Summary16 hkscs2008_uni2indx_page62[13] = { + /* 0x6200 */ + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0002 }, +}; +static const Summary16 hkscs2008_uni2indx_page66[25] = { + /* 0x6600 */ + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, + { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0001 }, { 19, 0x0000 }, + { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, + { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, + /* 0x6700 */ + { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, + { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, + { 19, 0x0004 }, +}; +static const Summary16 hkscs2008_uni2indx_page6a[3] = { + /* 0x6a00 */ + { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0200 }, +}; +static const Summary16 hkscs2008_uni2indx_page70[7] = { + /* 0x7000 */ + { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, + { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x4000 }, +}; +static const Summary16 hkscs2008_uni2indx_page73[29] = { + /* 0x7300 */ + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, + { 22, 0x0010 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, + /* 0x7400 */ + { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, + { 23, 0x1000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, + { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, + { 24, 0x0040 }, +}; +static const Summary16 hkscs2008_uni2indx_page79[45] = { + /* 0x7900 */ + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0001 }, { 26, 0x0000 }, { 26, 0x0000 }, + /* 0x7a00 */ + { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x1000 }, { 27, 0x0004 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0004 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x1000 }, + /* 0x7b00 */ + { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, + { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, + { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x4000 }, { 31, 0x0000 }, + { 31, 0x0020 }, +}; +static const Summary16 hkscs2008_uni2indx_page84[34] = { + /* 0x8400 */ + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0010 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, + /* 0x8500 */ + { 33, 0x0010 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, + /* 0x8600 */ + { 34, 0x0000 }, { 34, 0x0008 }, +}; +static const Summary16 hkscs2008_uni2indx_page88[10] = { + /* 0x8800 */ + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, + { 35, 0x0000 }, { 35, 0x2000 }, +}; +static const Summary16 hkscs2008_uni2indx_page8b[9] = { + /* 0x8b00 */ + { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, + { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, + { 36, 0x8000 }, +}; +static const Summary16 hkscs2008_uni2indx_page90[5] = { + /* 0x9000 */ + { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, + { 37, 0x0040 }, +}; +static const Summary16 hkscs2008_uni2indx_page92[2] = { + /* 0x9200 */ + { 38, 0x0000 }, { 38, 0x0100 }, +}; +static const Summary16 hkscs2008_uni2indx_page94[3] = { + /* 0x9400 */ + { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x8000 }, +}; +static const Summary16 hkscs2008_uni2indx_page97[5] = { + /* 0x9700 */ + { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, + { 40, 0x0400 }, +}; +static const Summary16 hkscs2008_uni2indx_page9f[13] = { + /* 0x9f00 */ + { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, + { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, + { 41, 0x0000 }, { 41, 0x00c0 }, { 43, 0x0000 }, { 43, 0x0000 }, + { 43, 0x0f80 }, +}; +static const Summary16 hkscs2008_uni2indx_page20a[9] = { + /* 0x20a00 */ + { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, + { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, + { 48, 0x0400 }, +}; +static const Summary16 hkscs2008_uni2indx_page21d[6] = { + /* 0x21d00 */ + { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, + { 49, 0x0000 }, { 49, 0x0008 }, +}; +static const Summary16 hkscs2008_uni2indx_page224[13] = { + /* 0x22400 */ + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x1000 }, + { 51, 0x1202 }, +}; +static const Summary16 hkscs2008_uni2indx_page231[22] = { + /* 0x23100 */ + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, + { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0400 }, { 55, 0x0000 }, + /* 0x23200 */ + { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, + { 55, 0x0000 }, { 55, 0x4000 }, +}; +static const Summary16 hkscs2008_uni2indx_page235[26] = { + /* 0x23500 */ + { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, + { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, + { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0800 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + /* 0x23600 */ + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x4000 }, { 58, 0x4000 }, +}; +static const Summary16 hkscs2008_uni2indx_page241[7] = { + /* 0x24100 */ + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, + { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0002 }, +}; +static const Summary16 hkscs2008_uni2indx_page258[14] = { + /* 0x25800 */ + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, + { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, + { 60, 0x0000 }, { 60, 0x4000 }, +}; +static const Summary16 hkscs2008_uni2indx_page25d[12] = { + /* 0x25d00 */ + { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, + { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, + { 61, 0x0000 }, { 61, 0x0200 }, { 62, 0x0000 }, { 62, 0x0200 }, +}; +static const Summary16 hkscs2008_uni2indx_page260[3] = { + /* 0x26000 */ + { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0002 }, +}; +static const Summary16 hkscs2008_uni2indx_page26e[9] = { + /* 0x26e00 */ + { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, + { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, + { 64, 0x0100 }, +}; +static const Summary16 hkscs2008_uni2indx_page27b[7] = { + /* 0x27b00 */ + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, + { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0020 }, +}; +static const Summary16 hkscs2008_uni2indx_page289[1] = { + /* 0x28900 */ + { 66, 0x2000 }, +}; +static const Summary16 hkscs2008_uni2indx_page2ad[16] = { + /* 0x2ad00 */ + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, + { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x8000 }, +}; + +static int +hkscs2008_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x3400 && wc < 0x34f0) + summary = &hkscs2008_uni2indx_page34[(wc>>4)-0x340]; + else if (wc >= 0x3800 && wc < 0x3880) + summary = &hkscs2008_uni2indx_page38[(wc>>4)-0x380]; + else if (wc >= 0x3a00 && wc < 0x3b00) + summary = &hkscs2008_uni2indx_page3a[(wc>>4)-0x3a0]; + else if (wc >= 0x3e00 && wc < 0x3ef0) + summary = &hkscs2008_uni2indx_page3e[(wc>>4)-0x3e0]; + else if (wc >= 0x4000 && wc < 0x4190) + summary = &hkscs2008_uni2indx_page40[(wc>>4)-0x400]; + else if (wc >= 0x4300 && wc < 0x44f0) + summary = &hkscs2008_uni2indx_page43[(wc>>4)-0x430]; + else if (wc >= 0x4600 && wc < 0x46b0) + summary = &hkscs2008_uni2indx_page46[(wc>>4)-0x460]; + else if (wc >= 0x4900 && wc < 0x4940) + summary = &hkscs2008_uni2indx_page49[(wc>>4)-0x490]; + else if (wc >= 0x5200 && wc < 0x5250) + summary = &hkscs2008_uni2indx_page52[(wc>>4)-0x520]; + else if (wc >= 0x5400 && wc < 0x5450) + summary = &hkscs2008_uni2indx_page54[(wc>>4)-0x540]; + else if (wc >= 0x5700 && wc < 0x58a0) + summary = &hkscs2008_uni2indx_page57[(wc>>4)-0x570]; + else if (wc >= 0x6200 && wc < 0x62d0) + summary = &hkscs2008_uni2indx_page62[(wc>>4)-0x620]; + else if (wc >= 0x6600 && wc < 0x6790) + summary = &hkscs2008_uni2indx_page66[(wc>>4)-0x660]; + else if (wc >= 0x6a00 && wc < 0x6a30) + summary = &hkscs2008_uni2indx_page6a[(wc>>4)-0x6a0]; + else if (wc >= 0x7000 && wc < 0x7070) + summary = &hkscs2008_uni2indx_page70[(wc>>4)-0x700]; + else if (wc >= 0x7300 && wc < 0x74d0) + summary = &hkscs2008_uni2indx_page73[(wc>>4)-0x730]; + else if (wc >= 0x7900 && wc < 0x7bd0) + summary = &hkscs2008_uni2indx_page79[(wc>>4)-0x790]; + else if (wc >= 0x8400 && wc < 0x8620) + summary = &hkscs2008_uni2indx_page84[(wc>>4)-0x840]; + else if (wc >= 0x8800 && wc < 0x88a0) + summary = &hkscs2008_uni2indx_page88[(wc>>4)-0x880]; + else if (wc >= 0x8b00 && wc < 0x8b90) + summary = &hkscs2008_uni2indx_page8b[(wc>>4)-0x8b0]; + else if (wc >= 0x9000 && wc < 0x9050) + summary = &hkscs2008_uni2indx_page90[(wc>>4)-0x900]; + else if (wc >= 0x9200 && wc < 0x9220) + summary = &hkscs2008_uni2indx_page92[(wc>>4)-0x920]; + else if (wc >= 0x9400 && wc < 0x9430) + summary = &hkscs2008_uni2indx_page94[(wc>>4)-0x940]; + else if (wc >= 0x9700 && wc < 0x9750) + summary = &hkscs2008_uni2indx_page97[(wc>>4)-0x970]; + else if (wc >= 0x9f00 && wc < 0x9fd0) + summary = &hkscs2008_uni2indx_page9f[(wc>>4)-0x9f0]; + else if (wc >= 0x20a00 && wc < 0x20a90) + summary = &hkscs2008_uni2indx_page20a[(wc>>4)-0x20a0]; + else if (wc >= 0x21d00 && wc < 0x21d60) + summary = &hkscs2008_uni2indx_page21d[(wc>>4)-0x21d0]; + else if (wc >= 0x22400 && wc < 0x224d0) + summary = &hkscs2008_uni2indx_page224[(wc>>4)-0x2240]; + else if (wc >= 0x23100 && wc < 0x23260) + summary = &hkscs2008_uni2indx_page231[(wc>>4)-0x2310]; + else if (wc >= 0x23500 && wc < 0x236a0) + summary = &hkscs2008_uni2indx_page235[(wc>>4)-0x2350]; + else if (wc >= 0x24100 && wc < 0x24170) + summary = &hkscs2008_uni2indx_page241[(wc>>4)-0x2410]; + else if (wc >= 0x25800 && wc < 0x258e0) + summary = &hkscs2008_uni2indx_page258[(wc>>4)-0x2580]; + else if (wc >= 0x25d00 && wc < 0x25dc0) + summary = &hkscs2008_uni2indx_page25d[(wc>>4)-0x25d0]; + else if (wc >= 0x26000 && wc < 0x26030) + summary = &hkscs2008_uni2indx_page260[(wc>>4)-0x2600]; + else if (wc >= 0x26e00 && wc < 0x26e90) + summary = &hkscs2008_uni2indx_page26e[(wc>>4)-0x26e0]; + else if (wc >= 0x27b00 && wc < 0x27b70) + summary = &hkscs2008_uni2indx_page27b[(wc>>4)-0x27b0]; + else if (wc >= 0x28900 && wc < 0x28910) + summary = &hkscs2008_uni2indx_page289[(wc>>4)-0x2890]; + else if (wc >= 0x2ad00 && wc < 0x2ae00) + summary = &hkscs2008_uni2indx_page2ad[(wc>>4)-0x2ad0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = hkscs2008_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/hp_roman8.h b/Externals/libiconv-1.14/lib/hp_roman8.h new file mode 100644 index 0000000000..da776ed087 --- /dev/null +++ b/Externals/libiconv-1.14/lib/hp_roman8.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HP-ROMAN8 + */ + +static const unsigned short hp_roman8_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x00c0, 0x00c2, 0x00c8, 0x00ca, 0x00cb, 0x00ce, 0x00cf, + 0x00b4, 0x02cb, 0x02c6, 0x00a8, 0x02dc, 0x00d9, 0x00db, 0x20a4, + /* 0xb0 */ + 0x00af, 0x00dd, 0x00fd, 0x00b0, 0x00c7, 0x00e7, 0x00d1, 0x00f1, + 0x00a1, 0x00bf, 0x00a4, 0x00a3, 0x00a5, 0x00a7, 0x0192, 0x00a2, + /* 0xc0 */ + 0x00e2, 0x00ea, 0x00f4, 0x00fb, 0x00e1, 0x00e9, 0x00f3, 0x00fa, + 0x00e0, 0x00e8, 0x00f2, 0x00f9, 0x00e4, 0x00eb, 0x00f6, 0x00fc, + /* 0xd0 */ + 0x00c5, 0x00ee, 0x00d8, 0x00c6, 0x00e5, 0x00ed, 0x00f8, 0x00e6, + 0x00c4, 0x00ec, 0x00d6, 0x00dc, 0x00c9, 0x00ef, 0x00df, 0x00d4, + /* 0xe0 */ + 0x00c1, 0x00c3, 0x00e3, 0x00d0, 0x00f0, 0x00cd, 0x00cc, 0x00d3, + 0x00d2, 0x00d5, 0x00f5, 0x0160, 0x0161, 0x00da, 0x0178, 0x00ff, + /* 0xf0 */ + 0x00de, 0x00fe, 0x00b7, 0x00b5, 0x00b6, 0x00be, 0x2014, 0x00bc, + 0x00bd, 0x00aa, 0x00ba, 0x00ab, 0x25a0, 0x00bb, 0x00b1, 0xfffd, +}; + +static int +hp_roman8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = hp_roman8_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char hp_roman8_page00[96] = { + 0xa0, 0xb8, 0xbf, 0xbb, 0xba, 0xbc, 0x00, 0xbd, /* 0xa0-0xa7 */ + 0xab, 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xb0, /* 0xa8-0xaf */ + 0xb3, 0xfe, 0x00, 0x00, 0xa8, 0xf3, 0xf4, 0xf2, /* 0xb0-0xb7 */ + 0x00, 0x00, 0xfa, 0xfd, 0xf7, 0xf8, 0xf5, 0xb9, /* 0xb8-0xbf */ + 0xa1, 0xe0, 0xa2, 0xe1, 0xd8, 0xd0, 0xd3, 0xb4, /* 0xc0-0xc7 */ + 0xa3, 0xdc, 0xa4, 0xa5, 0xe6, 0xe5, 0xa6, 0xa7, /* 0xc8-0xcf */ + 0xe3, 0xb6, 0xe8, 0xe7, 0xdf, 0xe9, 0xda, 0x00, /* 0xd0-0xd7 */ + 0xd2, 0xad, 0xed, 0xae, 0xdb, 0xb1, 0xf0, 0xde, /* 0xd8-0xdf */ + 0xc8, 0xc4, 0xc0, 0xe2, 0xcc, 0xd4, 0xd7, 0xb5, /* 0xe0-0xe7 */ + 0xc9, 0xc5, 0xc1, 0xcd, 0xd9, 0xd5, 0xd1, 0xdd, /* 0xe8-0xef */ + 0xe4, 0xb7, 0xca, 0xc6, 0xc2, 0xea, 0xce, 0x00, /* 0xf0-0xf7 */ + 0xd6, 0xcb, 0xc7, 0xc3, 0xcf, 0xb2, 0xf1, 0xef, /* 0xf8-0xff */ +}; +static const unsigned char hp_roman8_page01[56] = { + 0xeb, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char hp_roman8_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +hp_roman8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = hp_roman8_page00[wc-0x00a0]; + else if (wc >= 0x0160 && wc < 0x0198) + c = hp_roman8_page01[wc-0x0160]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = hp_roman8_page02[wc-0x02c0]; + else if (wc == 0x2014) + c = 0xf6; + else if (wc == 0x20a4) + c = 0xaf; + else if (wc == 0x25a0) + c = 0xfc; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/hz.h b/Externals/libiconv-1.14/lib/hz.h new file mode 100644 index 0000000000..db0b4b11dc --- /dev/null +++ b/Externals/libiconv-1.14/lib/hz.h @@ -0,0 +1,163 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * HZ + */ + +/* Specification: RFC 1842, RFC 1843 */ + +/* + * The state is 1 in GB mode, 0 in ASCII mode. + */ + +static int +hz_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + unsigned int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == '~') { + if (n < count+2) + goto none; + c = s[1]; + if (state == 0) { + if (c == '~') { + *pwc = (ucs4_t) '~'; + conv->istate = state; + return count+2; + } + if (c == '{') { + state = 1; + s += 2; count += 2; + if (n < count+1) + goto none; + continue; + } + if (c == '\n') { + s += 2; count += 2; + if (n < count+1) + goto none; + continue; + } + } else { + if (c == '}') { + state = 0; + s += 2; count += 2; + if (n < count+1) + goto none; + continue; + } + } + goto ilseq; + } + break; + } + if (state == 0) { + *pwc = (ucs4_t) c; + conv->istate = state; + return count+1; + } else { + int ret; + if (n < count+2) + goto none; + ret = gb2312_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + conv->istate = state; + return count+2; + } + +none: + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +hz_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + unsigned char buf[2]; + int ret; + + /* Code set 0 (ASCII or GB 1988-89) */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state ? 3 : 1); + if (n < count) + return RET_TOOSMALL; + if (state) { + r[0] = '~'; + r[1] = '}'; + r += 2; + state = 0; + } + r[0] = buf[0]; + conv->ostate = state; + return count; + } + } + + /* Code set 1 (GB 2312-1980) */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state ? 2 : 4); + if (n < count) + return RET_TOOSMALL; + if (!state) { + r[0] = '~'; + r[1] = '{'; + r += 2; + state = 1; + } + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +hz_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + if (state) { + if (n < 2) + return RET_TOOSMALL; + r[0] = '~'; + r[1] = '}'; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/iconv.c b/Externals/libiconv-1.14/lib/iconv.c new file mode 100644 index 0000000000..37852968a8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iconv.c @@ -0,0 +1,610 @@ +/* + * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include +#include "config.h" +#include "localcharset.h" + +#ifdef __CYGWIN__ +#include +#endif + +#if ENABLE_EXTRA +/* + * Consider all system dependent encodings, for any system, + * and the extra encodings. + */ +#define USE_AIX +#define USE_OSF1 +#define USE_DOS +#define USE_EXTRA +#else +/* + * Consider those system dependent encodings that are needed for the + * current system. + */ +#ifdef _AIX +#define USE_AIX +#endif +#if defined(__osf__) || defined(VMS) +#define USE_OSF1 +#endif +#if defined(__DJGPP__) || (defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))) +#define USE_DOS +#endif +#endif + +/* + * Data type for general conversion loop. + */ +struct loop_funcs { + size_t (*loop_convert) (iconv_t icd, + const char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft); + size_t (*loop_reset) (iconv_t icd, + char* * outbuf, size_t *outbytesleft); +}; + +/* + * Converters. + */ +#include "converters.h" + +/* + * Transliteration tables. + */ +#include "cjk_variants.h" +#include "translit.h" + +/* + * Table of all supported encodings. + */ +struct encoding { + struct mbtowc_funcs ifuncs; /* conversion multibyte -> unicode */ + struct wctomb_funcs ofuncs; /* conversion unicode -> multibyte */ + int oflags; /* flags for unicode -> multibyte conversion */ +}; +#define DEFALIAS(xxx_alias,xxx) /* nothing */ +enum { +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + ei_##xxx , +#include "encodings.def" +#ifdef USE_AIX +# include "encodings_aix.def" +#endif +#ifdef USE_OSF1 +# include "encodings_osf1.def" +#endif +#ifdef USE_DOS +# include "encodings_dos.def" +#endif +#ifdef USE_EXTRA +# include "encodings_extra.def" +#endif +#include "encodings_local.def" +#undef DEFENCODING +ei_for_broken_compilers_that_dont_like_trailing_commas +}; +#include "flags.h" +static struct encoding const all_encodings[] = { +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + { xxx_ifuncs1,xxx_ifuncs2, xxx_ofuncs1,xxx_ofuncs2, ei_##xxx##_oflags }, +#include "encodings.def" +#ifdef USE_AIX +# include "encodings_aix.def" +#endif +#ifdef USE_OSF1 +# include "encodings_osf1.def" +#endif +#ifdef USE_DOS +# include "encodings_dos.def" +#endif +#ifdef USE_EXTRA +# include "encodings_extra.def" +#endif +#undef DEFENCODING +#define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ + { xxx_ifuncs1,xxx_ifuncs2, xxx_ofuncs1,xxx_ofuncs2, 0 }, +#include "encodings_local.def" +#undef DEFENCODING +}; +#undef DEFALIAS + +/* + * Conversion loops. + */ +#include "loops.h" + +/* + * Alias lookup function. + * Defines + * struct alias { int name; unsigned int encoding_index; }; + * const struct alias * aliases_lookup (const char *str, unsigned int len); + * #define MAX_WORD_LENGTH ... + */ +#if defined _AIX +# include "aliases_sysaix.h" +#elif defined hpux || defined __hpux +# include "aliases_syshpux.h" +#elif defined __osf__ +# include "aliases_sysosf1.h" +#elif defined __sun +# include "aliases_syssolaris.h" +#else +# include "aliases.h" +#endif + +/* + * System dependent alias lookup function. + * Defines + * const struct alias * aliases2_lookup (const char *str); + */ +#if defined(USE_AIX) || defined(USE_OSF1) || defined(USE_DOS) || defined(USE_EXTRA) /* || ... */ +struct stringpool2_t { +#define S(tag,name,encoding_index) char stringpool_##tag[sizeof(name)]; +#include "aliases2.h" +#undef S +}; +static const struct stringpool2_t stringpool2_contents = { +#define S(tag,name,encoding_index) name, +#include "aliases2.h" +#undef S +}; +#define stringpool2 ((const char *) &stringpool2_contents) +static const struct alias sysdep_aliases[] = { +#define S(tag,name,encoding_index) { (int)(long)&((struct stringpool2_t *)0)->stringpool_##tag, encoding_index }, +#include "aliases2.h" +#undef S +}; +#ifdef __GNUC__ +__inline +#endif +const struct alias * +aliases2_lookup (register const char *str) +{ + const struct alias * ptr; + unsigned int count; + for (ptr = sysdep_aliases, count = sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]); count > 0; ptr++, count--) + if (!strcmp(str, stringpool2 + ptr->name)) + return ptr; + return NULL; +} +#else +#define aliases2_lookup(str) NULL +#define stringpool2 NULL +#endif + +#if 0 +/* Like !strcasecmp, except that the both strings can be assumed to be ASCII + and the first string can be assumed to be in uppercase. */ +static int strequal (const char* str1, const char* str2) +{ + unsigned char c1; + unsigned char c2; + for (;;) { + c1 = * (unsigned char *) str1++; + c2 = * (unsigned char *) str2++; + if (c1 == 0) + break; + if (c2 >= 'a' && c2 <= 'z') + c2 -= 'a'-'A'; + if (c1 != c2) + break; + } + return (c1 == c2); +} +#endif + +iconv_t iconv_open (const char* tocode, const char* fromcode) +{ + struct conv_struct * cd; + unsigned int from_index; + int from_wchar; + unsigned int to_index; + int to_wchar; + int transliterate; + int discard_ilseq; + +#include "iconv_open1.h" + + cd = (struct conv_struct *) malloc(from_wchar != to_wchar + ? sizeof(struct wchar_conv_struct) + : sizeof(struct conv_struct)); + if (cd == NULL) { + errno = ENOMEM; + return (iconv_t)(-1); + } + +#include "iconv_open2.h" + + return (iconv_t)cd; +invalid: + errno = EINVAL; + return (iconv_t)(-1); +} + +size_t iconv (iconv_t icd, + ICONV_CONST char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft) +{ + conv_t cd = (conv_t) icd; + if (inbuf == NULL || *inbuf == NULL) + return cd->lfuncs.loop_reset(icd,outbuf,outbytesleft); + else + return cd->lfuncs.loop_convert(icd, + (const char* *)inbuf,inbytesleft, + outbuf,outbytesleft); +} + +int iconv_close (iconv_t icd) +{ + conv_t cd = (conv_t) icd; + free(cd); + return 0; +} + +#ifndef LIBICONV_PLUG + +/* + * Verify that a 'struct conv_struct' and a 'struct wchar_conv_struct' each + * fit in an iconv_allocation_t. + * If this verification fails, iconv_allocation_t must be made larger and + * the major version in LIBICONV_VERSION_INFO must be bumped. + * Currently 'struct conv_struct' has 21 integer/pointer fields, and + * 'struct wchar_conv_struct' additionally has an 'mbstate_t' field. + */ +typedef int verify_size_1[2 * (sizeof (struct conv_struct) <= sizeof (iconv_allocation_t)) - 1]; +typedef int verify_size_2[2 * (sizeof (struct wchar_conv_struct) <= sizeof (iconv_allocation_t)) - 1]; + +int iconv_open_into (const char* tocode, const char* fromcode, + iconv_allocation_t* resultp) +{ + struct conv_struct * cd; + unsigned int from_index; + int from_wchar; + unsigned int to_index; + int to_wchar; + int transliterate; + int discard_ilseq; + +#include "iconv_open1.h" + + cd = (struct conv_struct *) resultp; + +#include "iconv_open2.h" + + return 0; +invalid: + errno = EINVAL; + return -1; +} + +int iconvctl (iconv_t icd, int request, void* argument) +{ + conv_t cd = (conv_t) icd; + switch (request) { + case ICONV_TRIVIALP: + *(int *)argument = + ((cd->lfuncs.loop_convert == unicode_loop_convert + && cd->iindex == cd->oindex) + || cd->lfuncs.loop_convert == wchar_id_loop_convert + ? 1 : 0); + return 0; + case ICONV_GET_TRANSLITERATE: + *(int *)argument = cd->transliterate; + return 0; + case ICONV_SET_TRANSLITERATE: + cd->transliterate = (*(const int *)argument ? 1 : 0); + return 0; + case ICONV_GET_DISCARD_ILSEQ: + *(int *)argument = cd->discard_ilseq; + return 0; + case ICONV_SET_DISCARD_ILSEQ: + cd->discard_ilseq = (*(const int *)argument ? 1 : 0); + return 0; + case ICONV_SET_HOOKS: + if (argument != NULL) { + cd->hooks = *(const struct iconv_hooks *)argument; + } else { + cd->hooks.uc_hook = NULL; + cd->hooks.wc_hook = NULL; + cd->hooks.data = NULL; + } + return 0; + case ICONV_SET_FALLBACKS: + if (argument != NULL) { + cd->fallbacks = *(const struct iconv_fallbacks *)argument; + } else { + cd->fallbacks.mb_to_uc_fallback = NULL; + cd->fallbacks.uc_to_mb_fallback = NULL; + cd->fallbacks.mb_to_wc_fallback = NULL; + cd->fallbacks.wc_to_mb_fallback = NULL; + cd->fallbacks.data = NULL; + } + return 0; + default: + errno = EINVAL; + return -1; + } +} + +/* An alias after its name has been converted from 'int' to 'const char*'. */ +struct nalias { const char* name; unsigned int encoding_index; }; + +static int compare_by_index (const void * arg1, const void * arg2) +{ + const struct nalias * alias1 = (const struct nalias *) arg1; + const struct nalias * alias2 = (const struct nalias *) arg2; + return (int)alias1->encoding_index - (int)alias2->encoding_index; +} + +static int compare_by_name (const void * arg1, const void * arg2) +{ + const char * name1 = *(const char **)arg1; + const char * name2 = *(const char **)arg2; + /* Compare alphabetically, but put "CS" names at the end. */ + int sign = strcmp(name1,name2); + if (sign != 0) { + sign = ((name1[0]=='C' && name1[1]=='S') - (name2[0]=='C' && name2[1]=='S')) + * 4 + (sign >= 0 ? 1 : -1); + } + return sign; +} + +void iconvlist (int (*do_one) (unsigned int namescount, + const char * const * names, + void* data), + void* data) +{ +#define aliascount1 sizeof(aliases)/sizeof(aliases[0]) +#ifndef aliases2_lookup +#define aliascount2 sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]) +#else +#define aliascount2 0 +#endif +#define aliascount (aliascount1+aliascount2) + struct nalias aliasbuf[aliascount]; + const char * namesbuf[aliascount]; + size_t num_aliases; + { + /* Put all existing aliases into a buffer. */ + size_t i; + size_t j; + j = 0; + for (i = 0; i < aliascount1; i++) { + const struct alias * p = &aliases[i]; + if (p->name >= 0 + && p->encoding_index != ei_local_char + && p->encoding_index != ei_local_wchar_t) { + aliasbuf[j].name = stringpool + p->name; + aliasbuf[j].encoding_index = p->encoding_index; + j++; + } + } +#ifndef aliases2_lookup + for (i = 0; i < aliascount2; i++) { + aliasbuf[j].name = stringpool2 + sysdep_aliases[i].name; + aliasbuf[j].encoding_index = sysdep_aliases[i].encoding_index; + j++; + } +#endif + num_aliases = j; + } + /* Sort by encoding_index. */ + if (num_aliases > 1) + qsort(aliasbuf, num_aliases, sizeof(struct nalias), compare_by_index); + { + /* Process all aliases with the same encoding_index together. */ + size_t j; + j = 0; + while (j < num_aliases) { + unsigned int ei = aliasbuf[j].encoding_index; + size_t i = 0; + do + namesbuf[i++] = aliasbuf[j++].name; + while (j < num_aliases && aliasbuf[j].encoding_index == ei); + if (i > 1) + qsort(namesbuf, i, sizeof(const char *), compare_by_name); + /* Call the callback. */ + if (do_one(i,namesbuf,data)) + break; + } + } +#undef aliascount +#undef aliascount2 +#undef aliascount1 +} + +/* + * Table of canonical names of encodings. + * Instead of strings, it contains offsets into stringpool and stringpool2. + */ +static const unsigned short all_canonical[] = { +#if defined _AIX +# include "canonical_sysaix.h" +#elif defined hpux || defined __hpux +# include "canonical_syshpux.h" +#elif defined __osf__ +# include "canonical_sysosf1.h" +#elif defined __sun +# include "canonical_syssolaris.h" +#else +# include "canonical.h" +#endif +#ifdef USE_AIX +# if defined _AIX +# include "canonical_aix_sysaix.h" +# else +# include "canonical_aix.h" +# endif +#endif +#ifdef USE_OSF1 +# if defined __osf__ +# include "canonical_osf1_sysosf1.h" +# else +# include "canonical_osf1.h" +# endif +#endif +#ifdef USE_DOS +# include "canonical_dos.h" +#endif +#ifdef USE_EXTRA +# include "canonical_extra.h" +#endif +#if defined _AIX +# include "canonical_local_sysaix.h" +#elif defined hpux || defined __hpux +# include "canonical_local_syshpux.h" +#elif defined __osf__ +# include "canonical_local_sysosf1.h" +#elif defined __sun +# include "canonical_local_syssolaris.h" +#else +# include "canonical_local.h" +#endif +}; + +const char * iconv_canonicalize (const char * name) +{ + const char* code; + char buf[MAX_WORD_LENGTH+10+1]; + const char* cp; + char* bp; + const struct alias * ap; + unsigned int count; + unsigned int index; + const char* pool; + + /* Before calling aliases_lookup, convert the input string to upper case, + * and check whether it's entirely ASCII (we call gperf with option "-7" + * to achieve a smaller table) and non-empty. If it's not entirely ASCII, + * or if it's too long, it is not a valid encoding name. + */ + for (code = name;;) { + /* Search code in the table. */ + for (cp = code, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { + unsigned char c = * (unsigned char *) cp; + if (c >= 0x80) + goto invalid; + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + *bp = c; + if (c == '\0') + break; + if (--count == 0) + goto invalid; + } + for (;;) { + if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { + bp -= 10; + *bp = '\0'; + continue; + } + if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { + bp -= 8; + *bp = '\0'; + continue; + } + break; + } + if (buf[0] == '\0') { + code = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (code[0] == '\0') + goto invalid; + continue; + } + pool = stringpool; + ap = aliases_lookup(buf,bp-buf); + if (ap == NULL) { + pool = stringpool2; + ap = aliases2_lookup(buf); + if (ap == NULL) + goto invalid; + } + if (ap->encoding_index == ei_local_char) { + code = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (code[0] == '\0') + goto invalid; + continue; + } + if (ap->encoding_index == ei_local_wchar_t) { + /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. + This is also the case on native Woe32 systems and Cygwin >= 1.7, where + we know that it is UTF-16. */ +#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) + if (sizeof(wchar_t) == 4) { + index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { +# if WORDS_LITTLEENDIAN + index = ei_utf16le; +# else + index = ei_utf16be; +# endif + break; + } +#elif __STDC_ISO_10646__ + if (sizeof(wchar_t) == 4) { + index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { + index = ei_ucs2internal; + break; + } + if (sizeof(wchar_t) == 1) { + index = ei_iso8859_1; + break; + } +#endif + } + index = ap->encoding_index; + break; + } + return all_canonical[index] + pool; + invalid: + return name; +} + +int _libiconv_version = _LIBICONV_VERSION; + +#if defined __FreeBSD__ && !defined __gnu_freebsd__ +/* GNU libiconv is the native FreeBSD iconv implementation since 2002. + It wants to define the symbols 'iconv_open', 'iconv', 'iconv_close'. */ +#define strong_alias(name, aliasname) _strong_alias(name, aliasname) +#define _strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); +#undef iconv_open +#undef iconv +#undef iconv_close +strong_alias (libiconv_open, iconv_open) +strong_alias (libiconv, iconv) +strong_alias (libiconv_close, iconv_close) +#endif + +#endif diff --git a/Externals/libiconv-1.14/lib/iconv_open1.h b/Externals/libiconv-1.14/lib/iconv_open1.h new file mode 100644 index 0000000000..acee5a4a09 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iconv_open1.h @@ -0,0 +1,229 @@ +/* + * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* Part 1 of iconv_open. + Input: const char* tocode, const char* fromcode. + Output: + unsigned int from_index; + int from_wchar; + unsigned int to_index; + int to_wchar; + int transliterate; + int discard_ilseq; + Jumps to 'invalid' in case of errror. + */ +{ + char buf[MAX_WORD_LENGTH+10+1]; + const char* cp; + char* bp; + const struct alias * ap; + unsigned int count; + + transliterate = 0; + discard_ilseq = 0; + + /* Before calling aliases_lookup, convert the input string to upper case, + * and check whether it's entirely ASCII (we call gperf with option "-7" + * to achieve a smaller table) and non-empty. If it's not entirely ASCII, + * or if it's too long, it is not a valid encoding name. + */ + for (to_wchar = 0;;) { + /* Search tocode in the table. */ + for (cp = tocode, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { + unsigned char c = * (unsigned char *) cp; + if (c >= 0x80) + goto invalid; + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + *bp = c; + if (c == '\0') + break; + if (--count == 0) + goto invalid; + } + for (;;) { + if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { + bp -= 10; + *bp = '\0'; + transliterate = 1; + continue; + } + if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { + bp -= 8; + *bp = '\0'; + discard_ilseq = 1; + continue; + } + break; + } + if (buf[0] == '\0') { + tocode = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (tocode[0] == '\0') + goto invalid; + continue; + } + ap = aliases_lookup(buf,bp-buf); + if (ap == NULL) { + ap = aliases2_lookup(buf); + if (ap == NULL) + goto invalid; + } + if (ap->encoding_index == ei_local_char) { + tocode = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (tocode[0] == '\0') + goto invalid; + continue; + } + if (ap->encoding_index == ei_local_wchar_t) { + /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. + This is also the case on native Woe32 systems and Cygwin >= 1.7, where + we know that it is UTF-16. */ +#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) + if (sizeof(wchar_t) == 4) { + to_index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { +# if WORDS_LITTLEENDIAN + to_index = ei_utf16le; +# else + to_index = ei_utf16be; +# endif + break; + } +#elif __STDC_ISO_10646__ + if (sizeof(wchar_t) == 4) { + to_index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { + to_index = ei_ucs2internal; + break; + } + if (sizeof(wchar_t) == 1) { + to_index = ei_iso8859_1; + break; + } +#endif +#if HAVE_MBRTOWC + to_wchar = 1; + tocode = locale_charset(); + continue; +#endif + goto invalid; + } + to_index = ap->encoding_index; + break; + } + for (from_wchar = 0;;) { + /* Search fromcode in the table. */ + for (cp = fromcode, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { + unsigned char c = * (unsigned char *) cp; + if (c >= 0x80) + goto invalid; + if (c >= 'a' && c <= 'z') + c -= 'a'-'A'; + *bp = c; + if (c == '\0') + break; + if (--count == 0) + goto invalid; + } + for (;;) { + if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { + bp -= 10; + *bp = '\0'; + continue; + } + if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { + bp -= 8; + *bp = '\0'; + continue; + } + break; + } + if (buf[0] == '\0') { + fromcode = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (fromcode[0] == '\0') + goto invalid; + continue; + } + ap = aliases_lookup(buf,bp-buf); + if (ap == NULL) { + ap = aliases2_lookup(buf); + if (ap == NULL) + goto invalid; + } + if (ap->encoding_index == ei_local_char) { + fromcode = locale_charset(); + /* Avoid an endless loop that could occur when using an older version + of localcharset.c. */ + if (fromcode[0] == '\0') + goto invalid; + continue; + } + if (ap->encoding_index == ei_local_wchar_t) { + /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. + This is also the case on native Woe32 systems and Cygwin >= 1.7, where + we know that it is UTF-16. */ +#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) + if (sizeof(wchar_t) == 4) { + from_index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { +# if WORDS_LITTLEENDIAN + from_index = ei_utf16le; +# else + from_index = ei_utf16be; +# endif + break; + } +#elif __STDC_ISO_10646__ + if (sizeof(wchar_t) == 4) { + from_index = ei_ucs4internal; + break; + } + if (sizeof(wchar_t) == 2) { + from_index = ei_ucs2internal; + break; + } + if (sizeof(wchar_t) == 1) { + from_index = ei_iso8859_1; + break; + } +#endif +#if HAVE_WCRTOMB + from_wchar = 1; + fromcode = locale_charset(); + continue; +#endif + goto invalid; + } + from_index = ap->encoding_index; + break; + } +} diff --git a/Externals/libiconv-1.14/lib/iconv_open2.h b/Externals/libiconv-1.14/lib/iconv_open2.h new file mode 100644 index 0000000000..6d6296f05b --- /dev/null +++ b/Externals/libiconv-1.14/lib/iconv_open2.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 1999-2009 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* Part 2 of iconv_open. + Input: + struct conv_struct * cd; + unsigned int from_index; + int from_wchar; + unsigned int to_index; + int to_wchar; + int transliterate; + int discard_ilseq; + Output: none. + Side effects: Fills cd. + */ + + cd->iindex = from_index; + cd->ifuncs = all_encodings[from_index].ifuncs; + cd->oindex = to_index; + cd->ofuncs = all_encodings[to_index].ofuncs; + cd->oflags = all_encodings[to_index].oflags; + /* Initialize the loop functions. */ +#if HAVE_MBRTOWC + if (to_wchar) { +#if HAVE_WCRTOMB + if (from_wchar) { + cd->lfuncs.loop_convert = wchar_id_loop_convert; + cd->lfuncs.loop_reset = wchar_id_loop_reset; + } else +#endif + { + cd->lfuncs.loop_convert = wchar_to_loop_convert; + cd->lfuncs.loop_reset = wchar_to_loop_reset; + } + } else +#endif + { +#if HAVE_WCRTOMB + if (from_wchar) { + cd->lfuncs.loop_convert = wchar_from_loop_convert; + cd->lfuncs.loop_reset = wchar_from_loop_reset; + } else +#endif + { + cd->lfuncs.loop_convert = unicode_loop_convert; + cd->lfuncs.loop_reset = unicode_loop_reset; + } + } + /* Initialize the states. */ + memset(&cd->istate,'\0',sizeof(state_t)); + memset(&cd->ostate,'\0',sizeof(state_t)); + /* Initialize the operation flags. */ + cd->transliterate = transliterate; + cd->discard_ilseq = discard_ilseq; + #ifndef LIBICONV_PLUG + cd->fallbacks.mb_to_uc_fallback = NULL; + cd->fallbacks.uc_to_mb_fallback = NULL; + cd->fallbacks.mb_to_wc_fallback = NULL; + cd->fallbacks.wc_to_mb_fallback = NULL; + cd->fallbacks.data = NULL; + cd->hooks.uc_hook = NULL; + cd->hooks.wc_hook = NULL; + cd->hooks.data = NULL; + #endif + /* Initialize additional fields. */ + if (from_wchar != to_wchar) { + struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) cd; +#if HAVE_WCRTOMB || HAVE_MBRTOWC + memset(&wcd->state,'\0',sizeof(mbstate_t)); +#endif + } + /* Done. */ diff --git a/Externals/libiconv-1.14/lib/iso2022_cn.h b/Externals/libiconv-1.14/lib/iso2022_cn.h new file mode 100644 index 0000000000..d7e3e393a5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_cn.h @@ -0,0 +1,324 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-CN + */ + +/* Specification: RFC 1922 */ + +#define ESC 0x1b +#define SO 0x0e +#define SI 0x0f + +/* + * The state is composed of one of the following values + */ +#define STATE_ASCII 0 +#define STATE_TWOBYTE 1 +/* + * and one of the following values, << 8 + */ +#define STATE2_NONE 0 +#define STATE2_DESIGNATED_GB2312 1 +#define STATE2_DESIGNATED_CNS11643_1 2 +/* + * and one of the following values, << 16 + */ +#define STATE3_NONE 0 +#define STATE3_DESIGNATED_CNS11643_2 1 + +#define SPLIT_STATE \ + unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = state >> 16 +#define COMBINE_STATE \ + state = (state3 << 16) | (state2 << 8) | state1 + +static int +iso2022_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + SPLIT_STATE; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+4) + goto none; + if (s[1] == '$') { + if (s[2] == ')') { + if (s[3] == 'A') { + state2 = STATE2_DESIGNATED_GB2312; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'G') { + state2 = STATE2_DESIGNATED_CNS11643_1; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + if (s[2] == '*') { + if (s[3] == 'H') { + state3 = STATE3_DESIGNATED_CNS11643_2; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + } + if (s[1] == 'N') { + switch (state3) { + case STATE3_NONE: + goto ilseq; + case STATE3_DESIGNATED_CNS11643_2: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_2_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + default: abort(); + } + } + goto ilseq; + } + if (c == SO) { + if (state2 != STATE2_DESIGNATED_GB2312 && state2 != STATE2_DESIGNATED_CNS11643_1) + goto ilseq; + state1 = STATE_TWOBYTE; + s++; count++; + if (n < count+1) + goto none; + continue; + } + if (c == SI) { + state1 = STATE_ASCII; + s++; count++; + if (n < count+1) + goto none; + continue; + } + break; + } + switch (state1) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + if (*pwc == 0x000a || *pwc == 0x000d) { + state2 = STATE2_NONE; state3 = STATE3_NONE; + } + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_TWOBYTE: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret; + switch (state2) { + case STATE2_NONE: + goto ilseq; + case STATE2_DESIGNATED_GB2312: + ret = gb2312_mbtowc(conv,pwc,s,2); break; + case STATE2_DESIGNATED_CNS11643_1: + ret = cns11643_1_mbtowc(conv,pwc,s,2); break; + default: abort(); + } + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + COMBINE_STATE; + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + COMBINE_STATE; + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +iso2022_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + unsigned char buf[3]; + int ret; + + /* There is no need to handle Unicode 3.1 tag characters and to look for + "zh-CN" or "zh-TW" tags, because GB2312 and CNS11643 are disjoint. */ + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state1 == STATE_ASCII ? 1 : 2); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_ASCII) { + r[0] = SI; + r += 1; + state1 = STATE_ASCII; + } + r[0] = buf[0]; + if (wc == 0x000a || wc == 0x000d) { + state2 = STATE2_NONE; state3 = STATE3_NONE; + } + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try GB 2312-1980. */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_GB2312 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_GB2312) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'A'; + r += 4; + state2 = STATE2_DESIGNATED_GB2312; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + ret = cns11643_wctomb(conv,buf,wc,3); + if (ret != RET_ILUNI) { + if (ret != 3) abort(); + + /* Try CNS 11643-1992 Plane 1. */ + if (buf[0] == 1 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_CNS11643_1 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_CNS11643_1) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'G'; + r += 4; + state2 = STATE2_DESIGNATED_CNS11643_1; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[1]; + r[1] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 2. */ + if (buf[0] == 2 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state3 == STATE3_DESIGNATED_CNS11643_2 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state3 != STATE3_DESIGNATED_CNS11643_2) { + r[0] = ESC; + r[1] = '$'; + r[2] = '*'; + r[3] = 'H'; + r += 4; + state3 = STATE3_DESIGNATED_CNS11643_2; + } + r[0] = ESC; + r[1] = 'N'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_cn_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + (void)state2; + (void)state3; + if (state1 != STATE_ASCII) { + if (n < 1) + return RET_TOOSMALL; + r[0] = SI; + /* conv->ostate = 0; will be done by the caller */ + return 1; + } else + return 0; +} + +#undef COMBINE_STATE +#undef SPLIT_STATE +#undef STATE3_DESIGNATED_CNS11643_2 +#undef STATE3_NONE +#undef STATE2_DESIGNATED_CNS11643_1 +#undef STATE2_DESIGNATED_GB2312 +#undef STATE2_NONE +#undef STATE_TWOBYTE +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_cnext.h b/Externals/libiconv-1.14/lib/iso2022_cnext.h new file mode 100644 index 0000000000..f8488709db --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_cnext.h @@ -0,0 +1,590 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-CN-EXT + */ + +/* Specification: RFC 1922 */ + +#define ESC 0x1b +#define SO 0x0e +#define SI 0x0f + +/* + * The state is composed of one of the following values + */ +#define STATE_ASCII 0 +#define STATE_TWOBYTE 1 +/* + * and one of the following values, << 8 + */ +#define STATE2_NONE 0 +#define STATE2_DESIGNATED_GB2312 1 +#define STATE2_DESIGNATED_CNS11643_1 2 +#define STATE2_DESIGNATED_ISO_IR_165 3 +/* + * and one of the following values, << 16 + */ +#define STATE3_NONE 0 +#define STATE3_DESIGNATED_CNS11643_2 1 +/* + * and one of the following values, << 24 + */ +#define STATE4_NONE 0 +#define STATE4_DESIGNATED_CNS11643_3 1 +#define STATE4_DESIGNATED_CNS11643_4 2 +#define STATE4_DESIGNATED_CNS11643_5 3 +#define STATE4_DESIGNATED_CNS11643_6 4 +#define STATE4_DESIGNATED_CNS11643_7 5 + +#define SPLIT_STATE \ + unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = (state >> 16) & 0xff, state4 = state >> 24 +#define COMBINE_STATE \ + state = (state4 << 24) | (state3 << 16) | (state2 << 8) | state1 + +static int +iso2022_cn_ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + SPLIT_STATE; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+4) + goto none; + if (s[1] == '$') { + if (s[2] == ')') { + if (s[3] == 'A') { + state2 = STATE2_DESIGNATED_GB2312; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'G') { + state2 = STATE2_DESIGNATED_CNS11643_1; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'E') { + state2 = STATE2_DESIGNATED_ISO_IR_165; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + if (s[2] == '*') { + if (s[3] == 'H') { + state3 = STATE3_DESIGNATED_CNS11643_2; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + if (s[2] == '+') { + if (s[3] == 'I') { + state4 = STATE4_DESIGNATED_CNS11643_3; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'J') { + state4 = STATE4_DESIGNATED_CNS11643_4; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'K') { + state4 = STATE4_DESIGNATED_CNS11643_5; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'L') { + state4 = STATE4_DESIGNATED_CNS11643_6; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'M') { + state4 = STATE4_DESIGNATED_CNS11643_7; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + } + if (s[1] == 'N') { + switch (state3) { + case STATE3_NONE: + goto ilseq; + case STATE3_DESIGNATED_CNS11643_2: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_2_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + default: abort(); + } + } + if (s[1] == 'O') { + switch (state4) { + case STATE4_NONE: + goto ilseq; + case STATE4_DESIGNATED_CNS11643_3: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_3_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + case STATE4_DESIGNATED_CNS11643_4: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_4_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + case STATE4_DESIGNATED_CNS11643_5: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_5_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + case STATE4_DESIGNATED_CNS11643_6: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_6_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + case STATE4_DESIGNATED_CNS11643_7: + if (s[2] < 0x80 && s[3] < 0x80) { + int ret = cns11643_7_mbtowc(conv,pwc,s+2,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+4; + } else + goto ilseq; + default: abort(); + } + } + goto ilseq; + } + if (c == SO) { + if (state2 != STATE2_DESIGNATED_GB2312 && state2 != STATE2_DESIGNATED_CNS11643_1 && state2 != STATE2_DESIGNATED_ISO_IR_165) + goto ilseq; + state1 = STATE_TWOBYTE; + s++; count++; + if (n < count+1) + goto none; + continue; + } + if (c == SI) { + state1 = STATE_ASCII; + s++; count++; + if (n < count+1) + goto none; + continue; + } + break; + } + switch (state1) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + if (*pwc == 0x000a || *pwc == 0x000d) { + state2 = STATE2_NONE; state3 = STATE3_NONE; state4 = STATE3_NONE; + } + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_TWOBYTE: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret; + switch (state2) { + case STATE2_NONE: + goto ilseq; + case STATE2_DESIGNATED_GB2312: + ret = gb2312_mbtowc(conv,pwc,s,2); break; + case STATE2_DESIGNATED_CNS11643_1: + ret = cns11643_1_mbtowc(conv,pwc,s,2); break; + case STATE2_DESIGNATED_ISO_IR_165: + ret = isoir165_mbtowc(conv,pwc,s,2); break; + default: abort(); + } + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + COMBINE_STATE; + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + COMBINE_STATE; + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +iso2022_cn_ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + unsigned char buf[3]; + int ret; + + /* There is no need to handle Unicode 3.1 tag characters and to look for + "zh-CN" or "zh-TW" tags, because GB2312 and CNS11643 are disjoint. */ + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state1 == STATE_ASCII ? 1 : 2); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_ASCII) { + r[0] = SI; + r += 1; + state1 = STATE_ASCII; + } + r[0] = buf[0]; + if (wc == 0x000a || wc == 0x000d) { + state2 = STATE2_NONE; state3 = STATE3_NONE; state4 = STATE3_NONE; + } + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try GB 2312-1980. */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_GB2312 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_GB2312) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'A'; + r += 4; + state2 = STATE2_DESIGNATED_GB2312; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + ret = cns11643_wctomb(conv,buf,wc,3); + if (ret != RET_ILUNI) { + if (ret != 3) abort(); + + /* Try CNS 11643-1992 Plane 1. */ + if (buf[0] == 1 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_CNS11643_1 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_CNS11643_1) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'G'; + r += 4; + state2 = STATE2_DESIGNATED_CNS11643_1; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[1]; + r[1] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 2. */ + if (buf[0] == 2 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state3 == STATE3_DESIGNATED_CNS11643_2 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state3 != STATE3_DESIGNATED_CNS11643_2) { + r[0] = ESC; + r[1] = '$'; + r[2] = '*'; + r[3] = 'H'; + r += 4; + state3 = STATE3_DESIGNATED_CNS11643_2; + } + r[0] = ESC; + r[1] = 'N'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 3. */ + if (buf[0] == 3 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state4 == STATE4_DESIGNATED_CNS11643_3 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state4 != STATE4_DESIGNATED_CNS11643_3) { + r[0] = ESC; + r[1] = '$'; + r[2] = '+'; + r[3] = 'I'; + r += 4; + state4 = STATE4_DESIGNATED_CNS11643_3; + } + r[0] = ESC; + r[1] = 'O'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 4. */ + if (buf[0] == 4 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state4 == STATE4_DESIGNATED_CNS11643_4 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state4 != STATE4_DESIGNATED_CNS11643_4) { + r[0] = ESC; + r[1] = '$'; + r[2] = '+'; + r[3] = 'J'; + r += 4; + state4 = STATE4_DESIGNATED_CNS11643_4; + } + r[0] = ESC; + r[1] = 'O'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 5. */ + if (buf[0] == 5 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state4 == STATE4_DESIGNATED_CNS11643_5 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state4 != STATE4_DESIGNATED_CNS11643_5) { + r[0] = ESC; + r[1] = '$'; + r[2] = '+'; + r[3] = 'K'; + r += 4; + state4 = STATE4_DESIGNATED_CNS11643_5; + } + r[0] = ESC; + r[1] = 'O'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 6. */ + if (buf[0] == 6 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state4 == STATE4_DESIGNATED_CNS11643_6 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state4 != STATE4_DESIGNATED_CNS11643_6) { + r[0] = ESC; + r[1] = '$'; + r[2] = '+'; + r[3] = 'L'; + r += 4; + state4 = STATE4_DESIGNATED_CNS11643_6; + } + r[0] = ESC; + r[1] = 'O'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + /* Try CNS 11643-1992 Plane 7. */ + if (buf[0] == 7 && buf[1] < 0x80 && buf[2] < 0x80) { + int count = (state4 == STATE4_DESIGNATED_CNS11643_7 ? 0 : 4) + 4; + if (n < count) + return RET_TOOSMALL; + if (state4 != STATE4_DESIGNATED_CNS11643_7) { + r[0] = ESC; + r[1] = '$'; + r[2] = '+'; + r[3] = 'M'; + r += 4; + state4 = STATE4_DESIGNATED_CNS11643_7; + } + r[0] = ESC; + r[1] = 'O'; + r[2] = buf[1]; + r[3] = buf[2]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + + } + + /* Try ISO-IR-165. */ + ret = isoir165_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_ISO_IR_165 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_ISO_IR_165) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'E'; + r += 4; + state2 = STATE2_DESIGNATED_ISO_IR_165; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_cn_ext_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + (void)state2; + (void)state3; + (void)state4; + if (state1 != STATE_ASCII) { + if (n < 1) + return RET_TOOSMALL; + r[0] = SI; + /* conv->ostate = 0; will be done by the caller */ + return 1; + } else + return 0; +} + +#undef COMBINE_STATE +#undef SPLIT_STATE +#undef STATE4_DESIGNATED_CNS11643_7 +#undef STATE4_DESIGNATED_CNS11643_6 +#undef STATE4_DESIGNATED_CNS11643_5 +#undef STATE4_DESIGNATED_CNS11643_4 +#undef STATE4_DESIGNATED_CNS11643_3 +#undef STATE4_NONE +#undef STATE3_DESIGNATED_CNS11643_2 +#undef STATE3_NONE +#undef STATE2_DESIGNATED_ISO_IR_165 +#undef STATE2_DESIGNATED_CNS11643_1 +#undef STATE2_DESIGNATED_GB2312 +#undef STATE2_NONE +#undef STATE_TWOBYTE +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_jp.h b/Externals/libiconv-1.14/lib/iso2022_jp.h new file mode 100644 index 0000000000..1c8abec1bb --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_jp.h @@ -0,0 +1,216 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-JP + */ + +/* Specification: RFC 1468 */ + +#define ESC 0x1b + +/* + * The state can be one of the following values. + */ +#define STATE_ASCII 0 +#define STATE_JISX0201ROMAN 1 +#define STATE_JISX0208 2 + +static int +iso2022_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+3) + goto none; + if (s[1] == '(') { + if (s[2] == 'B') { + state = STATE_ASCII; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'J') { + state = STATE_JISX0201ROMAN; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + if (s[1] == '$') { + if (s[2] == '@' || s[2] == 'B') { + /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ + state = STATE_JISX0208; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + goto ilseq; + } + break; + } + switch (state) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201ROMAN: + if (c < 0x80) { + int ret = jisx0201_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0208: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0208_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +iso2022_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + unsigned char buf[2]; + int ret; + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state == STATE_ASCII ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_ASCII) { + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + r += 3; + state = STATE_ASCII; + } + r[0] = buf[0]; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0201-1976 Roman. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state == STATE_JISX0201ROMAN ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0201ROMAN) { + r[0] = ESC; + r[1] = '('; + r[2] = 'J'; + r += 3; + state = STATE_JISX0201ROMAN; + } + r[0] = buf[0]; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state == STATE_JISX0208 ? 2 : 5); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0208) { + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + state = STATE_JISX0208; + } + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_jp_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + if (state != STATE_ASCII) { + if (n < 3) + return RET_TOOSMALL; + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + /* conv->ostate = 0; will be done by the caller */ + return 3; + } else + return 0; +} + +#undef STATE_JISX0208 +#undef STATE_JISX0201ROMAN +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_jp1.h b/Externals/libiconv-1.14/lib/iso2022_jp1.h new file mode 100644 index 0000000000..c3094740f9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_jp1.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-JP-1 + */ + +/* Specification: RFC 2237 */ + +#define ESC 0x1b + +/* + * The state can be one of the following values. + */ +#define STATE_ASCII 0 +#define STATE_JISX0201ROMAN 1 +#define STATE_JISX0208 2 +#define STATE_JISX0212 3 + +static int +iso2022_jp1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+3) + goto none; + if (s[1] == '(') { + if (s[2] == 'B') { + state = STATE_ASCII; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'J') { + state = STATE_JISX0201ROMAN; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + if (s[1] == '$') { + if (s[2] == '@' || s[2] == 'B') { + /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ + state = STATE_JISX0208; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == '(') { + if (n < count+4) + goto none; + if (s[3] == 'D') { + state = STATE_JISX0212; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + goto ilseq; + } + goto ilseq; + } + break; + } + switch (state) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201ROMAN: + if (c < 0x80) { + int ret = jisx0201_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0208: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0208_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + conv->istate = state; + return count+2; + } else + goto ilseq; + case STATE_JISX0212: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0212_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +iso2022_jp1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + unsigned char buf[2]; + int ret; + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state == STATE_ASCII ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_ASCII) { + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + r += 3; + state = STATE_ASCII; + } + r[0] = buf[0]; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0201-1976 Roman. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state == STATE_JISX0201ROMAN ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0201ROMAN) { + r[0] = ESC; + r[1] = '('; + r[2] = 'J'; + r += 3; + state = STATE_JISX0201ROMAN; + } + r[0] = buf[0]; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state == STATE_JISX0208 ? 2 : 5); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0208) { + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + state = STATE_JISX0208; + } + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0212-1990. */ + ret = jisx0212_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state == STATE_JISX0212 ? 2 : 6); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0212) { + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'D'; + r += 4; + state = STATE_JISX0212; + } + r[0] = buf[0]; + r[1] = buf[1]; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_jp1_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + if (state != STATE_ASCII) { + if (n < 3) + return RET_TOOSMALL; + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + /* conv->ostate = 0; will be done by the caller */ + return 3; + } else + return 0; +} + +#undef STATE_JISX0212 +#undef STATE_JISX0208 +#undef STATE_JISX0201ROMAN +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_jp2.h b/Externals/libiconv-1.14/lib/iso2022_jp2.h new file mode 100644 index 0000000000..5e3ca41555 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_jp2.h @@ -0,0 +1,693 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-JP-2 + */ + +/* Specification: RFC 1554 */ +/* ESC '(' 'I' for JISX0201 Katakana is an extension not found in RFC 1554 or + CJK.INF, but implemented in glibc-2.1 and qt-2.0. */ + +#define ESC 0x1b + +/* + * The state is composed of one of the following values + */ +#define STATE_ASCII 0 +#define STATE_JISX0201ROMAN 1 +#define STATE_JISX0201KATAKANA 2 +#define STATE_JISX0208 3 +#define STATE_JISX0212 4 +#define STATE_GB2312 5 +#define STATE_KSC5601 6 +/* + * and one of the following values, << 8 + */ +#define STATE_G2_NONE 0 +#define STATE_G2_ISO8859_1 1 +#define STATE_G2_ISO8859_7 2 + +#define SPLIT_STATE \ + unsigned int state1 = state & 0xff, state2 = state >> 8 +#define COMBINE_STATE \ + state = (state2 << 8) | state1 + +static int +iso2022_jp2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + SPLIT_STATE; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+3) + goto none; + if (s[1] == '(') { + if (s[2] == 'B') { + state1 = STATE_ASCII; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'J') { + state1 = STATE_JISX0201ROMAN; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'I') { + state1 = STATE_JISX0201KATAKANA; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + if (s[1] == '$') { + if (s[2] == '@' || s[2] == 'B') { + /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ + state1 = STATE_JISX0208; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'A') { + state1 = STATE_GB2312; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == '(') { + if (n < count+4) + goto none; + if (s[3] == 'D') { + state1 = STATE_JISX0212; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'C') { + state1 = STATE_KSC5601; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + goto ilseq; + } + if (s[1] == '.') { + if (n < count+3) + goto none; + if (s[2] == 'A') { + state2 = STATE_G2_ISO8859_1; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'F') { + state2 = STATE_G2_ISO8859_7; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + if (s[1] == 'N') { + switch (state2) { + case STATE_G2_NONE: + goto ilseq; + case STATE_G2_ISO8859_1: + if (s[2] < 0x80) { + unsigned char buf = s[2]+0x80; + int ret = iso8859_1_mbtowc(conv,pwc,&buf,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + COMBINE_STATE; + conv->istate = state; + return count+3; + } else + goto ilseq; + case STATE_G2_ISO8859_7: + if (s[2] < 0x80) { + unsigned char buf = s[2]+0x80; + int ret = iso8859_7_mbtowc(conv,pwc,&buf,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + COMBINE_STATE; + conv->istate = state; + return count+3; + } else + goto ilseq; + default: abort(); + } + } + goto ilseq; + } + break; + } + switch (state1) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + if (*pwc == 0x000a || *pwc == 0x000d) + state2 = STATE_G2_NONE; + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201ROMAN: + if (c < 0x80) { + int ret = jisx0201_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + if (*pwc == 0x000a || *pwc == 0x000d) + state2 = STATE_G2_NONE; + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201KATAKANA: + if (c < 0x80) { + unsigned char buf = c+0x80; + int ret = jisx0201_mbtowc(conv,pwc,&buf,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0208: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0208_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + case STATE_JISX0212: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0212_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + case STATE_GB2312: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = gb2312_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + case STATE_KSC5601: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = ksc5601_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + COMBINE_STATE; + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + COMBINE_STATE; + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +#undef COMBINE_STATE +#undef SPLIT_STATE + +/* + * The state can also contain one of the following values, << 16. + * Values >= STATE_TAG_LANGUAGE are temporary tag parsing states. + */ +#define STATE_TAG_NONE 0 +#define STATE_TAG_LANGUAGE 4 +#define STATE_TAG_LANGUAGE_j 5 +#define STATE_TAG_LANGUAGE_ja 1 +#define STATE_TAG_LANGUAGE_k 6 +#define STATE_TAG_LANGUAGE_ko 2 +#define STATE_TAG_LANGUAGE_z 7 +#define STATE_TAG_LANGUAGE_zh 3 + +#define SPLIT_STATE \ + unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = state >> 16 +#define COMBINE_STATE \ + state = (state3 << 16) | (state2 << 8) | state1 + +static int +iso2022_jp2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + unsigned char buf[2]; + int ret; + /* This defines the conversion preferences depending on the current + langauge tag. */ + enum conversion { none = 0, european, japanese, chinese, korean, other }; + static const unsigned int conversion_lists[STATE_TAG_LANGUAGE] = { + /* STATE_TAG_NONE */ + japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12), + /* STATE_TAG_LANGUAGE_ja */ + japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12), + /* STATE_TAG_LANGUAGE_ko */ + korean + (european << 3) + (japanese << 6) + (chinese << 9) + (other << 12), + /* STATE_TAG_LANGUAGE_zh */ + chinese + (european << 3) + (japanese << 6) + (korean << 9) + (other << 12) + }; + unsigned int conversion_list; + + /* Handle Unicode tag characters (range U+E0000..U+E007F). */ + if ((wc >> 7) == (0xe0000 >> 7)) { + char c = wc & 0x7f; + if (c >= 'A' && c <= 'Z') + c += 'a'-'A'; + switch (c) { + case 0x01: + state3 = STATE_TAG_LANGUAGE; + COMBINE_STATE; + conv->ostate = state; + return 0; + case 'j': + if (state3 == STATE_TAG_LANGUAGE) { + state3 = STATE_TAG_LANGUAGE_j; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 'a': + if (state3 == STATE_TAG_LANGUAGE_j) { + state3 = STATE_TAG_LANGUAGE_ja; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 'k': + if (state3 == STATE_TAG_LANGUAGE) { + state3 = STATE_TAG_LANGUAGE_k; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 'o': + if (state3 == STATE_TAG_LANGUAGE_k) { + state3 = STATE_TAG_LANGUAGE_ko; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 'z': + if (state3 == STATE_TAG_LANGUAGE) { + state3 = STATE_TAG_LANGUAGE_z; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 'h': + if (state3 == STATE_TAG_LANGUAGE_z) { + state3 = STATE_TAG_LANGUAGE_zh; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + break; + case 0x7f: + state3 = STATE_TAG_NONE; + COMBINE_STATE; + conv->ostate = state; + return 0; + default: + break; + } + /* Other tag characters reset the tag parsing state or are ignored. */ + if (state3 >= STATE_TAG_LANGUAGE) + state3 = STATE_TAG_NONE; + COMBINE_STATE; + conv->ostate = state; + return 0; + } + if (state3 >= STATE_TAG_LANGUAGE) + state3 = STATE_TAG_NONE; + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state1 == STATE_ASCII ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_ASCII) { + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + r += 3; + state1 = STATE_ASCII; + } + r[0] = buf[0]; + if (wc == 0x000a || wc == 0x000d) + state2 = STATE_G2_NONE; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + conversion_list = conversion_lists[state3]; + + do { + switch (conversion_list & ((1 << 3) - 1)) { + + case european: + + /* Try ISO-8859-1. */ + ret = iso8859_1_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] >= 0x80) { + int count = (state2 == STATE_G2_ISO8859_1 ? 3 : 6); + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE_G2_ISO8859_1) { + r[0] = ESC; + r[1] = '.'; + r[2] = 'A'; + r += 3; + state2 = STATE_G2_ISO8859_1; + } + r[0] = ESC; + r[1] = 'N'; + r[2] = buf[0]-0x80; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try ISO-8859-7. */ + ret = iso8859_7_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] >= 0x80) { + int count = (state2 == STATE_G2_ISO8859_7 ? 3 : 6); + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE_G2_ISO8859_7) { + r[0] = ESC; + r[1] = '.'; + r[2] = 'F'; + r += 3; + state2 = STATE_G2_ISO8859_7; + } + r[0] = ESC; + r[1] = 'N'; + r[2] = buf[0]-0x80; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + break; + + case japanese: + + /* Try JIS X 0201-1976 Roman. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state1 == STATE_JISX0201ROMAN ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_JISX0201ROMAN) { + r[0] = ESC; + r[1] = '('; + r[2] = 'J'; + r += 3; + state1 = STATE_JISX0201ROMAN; + } + r[0] = buf[0]; + if (wc == 0x000a || wc == 0x000d) + state2 = STATE_G2_NONE; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and + JIS X 0208-1983. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state1 == STATE_JISX0208 ? 2 : 5); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_JISX0208) { + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + state1 = STATE_JISX0208; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0212-1990. */ + ret = jisx0212_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state1 == STATE_JISX0212 ? 2 : 6); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_JISX0212) { + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'D'; + r += 4; + state1 = STATE_JISX0212; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + break; + + case chinese: + + /* Try GB 2312-1980. */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state1 == STATE_GB2312 ? 2 : 5); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_GB2312) { + r[0] = ESC; + r[1] = '$'; + r[2] = 'A'; + r += 3; + state1 = STATE_GB2312; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + break; + + case korean: + + /* Try KS C 5601-1992. */ + ret = ksc5601_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state1 == STATE_KSC5601 ? 2 : 6); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_KSC5601) { + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'C'; + r += 4; + state1 = STATE_KSC5601; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + break; + + case other: + + /* Try JIS X 0201-1976 Kana. This is not officially part of + ISO-2022-JP-2, according to RFC 1554. Therefore we try this + only after all other attempts. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] >= 0x80) { + int count = (state1 == STATE_JISX0201KATAKANA ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_JISX0201KATAKANA) { + r[0] = ESC; + r[1] = '('; + r[2] = 'I'; + r += 3; + state1 = STATE_JISX0201KATAKANA; + } + r[0] = buf[0]-0x80; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + break; + + default: + abort(); + } + + conversion_list = conversion_list >> 3; + } while (conversion_list != 0); + + return RET_ILUNI; +} + +static int +iso2022_jp2_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + (void)state2; + (void)state3; + if (state1 != STATE_ASCII) { + if (n < 3) + return RET_TOOSMALL; + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + /* conv->ostate = 0; will be done by the caller */ + return 3; + } else + return 0; +} + +#undef COMBINE_STATE +#undef SPLIT_STATE +#undef STATE_TAG_LANGUAGE_zh +#undef STATE_TAG_LANGUAGE_z +#undef STATE_TAG_LANGUAGE_ko +#undef STATE_TAG_LANGUAGE_k +#undef STATE_TAG_LANGUAGE_ja +#undef STATE_TAG_LANGUAGE_j +#undef STATE_TAG_LANGUAGE +#undef STATE_TAG_NONE +#undef STATE_G2_ISO8859_7 +#undef STATE_G2_ISO8859_1 +#undef STATE_G2_NONE +#undef STATE_KSC5601 +#undef STATE_GB2312 +#undef STATE_JISX0212 +#undef STATE_JISX0208 +#undef STATE_JISX0201KATAKANA +#undef STATE_JISX0201ROMAN +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_jp3.h b/Externals/libiconv-1.14/lib/iso2022_jp3.h new file mode 100644 index 0000000000..58cea1bb34 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_jp3.h @@ -0,0 +1,538 @@ +/* + * Copyright (C) 1999-2004, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-JP-3 + */ + +#include "jisx0213.h" + +#define ESC 0x1b + +/* + * The state is composed of one of the following values + */ +#define STATE_ASCII 0 /* Esc ( B */ +#define STATE_JISX0201ROMAN 1 /* Esc ( J */ +#define STATE_JISX0201KATAKANA 2 /* Esc ( I */ +#define STATE_JISX0208 3 /* Esc $ @ or Esc $ B */ +#define STATE_JISX02131 4 /* Esc $ ( O or Esc $ ( Q*/ +#define STATE_JISX02132 5 /* Esc $ ( P */ + +/* + * In the ISO-2022-JP-3 to UCS-4 direction, the state also holds the last + * character to be output, shifted by 3 bits. + */ + +static int +iso2022_jp3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate >> 3; + if (last_wc) { + /* Output the buffered character. */ + conv->istate &= 7; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + state_t state = conv->istate; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+3) + goto none; + if (s[1] == '(') { + if (s[2] == 'B') { + state = STATE_ASCII; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'J') { + state = STATE_JISX0201ROMAN; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == 'I') { + state = STATE_JISX0201KATAKANA; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + goto ilseq; + } + if (s[1] == '$') { + if (s[2] == '@' || s[2] == 'B') { + /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ + state = STATE_JISX0208; + s += 3; count += 3; + if (n < count+1) + goto none; + continue; + } + if (s[2] == '(') { + if (n < count+4) + goto none; + if (s[3] == 'O' || s[3] == 'Q') { + state = STATE_JISX02131; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + if (s[3] == 'P') { + state = STATE_JISX02132; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + goto ilseq; + } + goto ilseq; + } + break; + } + switch (state) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201ROMAN: + if (c < 0x80) { + int ret = jisx0201_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0201KATAKANA: + if (c < 0x80) { + unsigned char buf = c+0x80; + int ret = jisx0201_mbtowc(conv,pwc,&buf,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_JISX0208: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = jisx0208_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + conv->istate = state; + return count+2; + } else + goto ilseq; + case STATE_JISX02131: + case STATE_JISX02132: + if (n < count+2) + goto none; + if (s[0] < 0x80 && s[1] < 0x80) { + ucs4_t wc = jisx0213_to_ucs4(((state-STATE_JISX02131+1)<<8)+s[0],s[1]); + if (wc) { + if (wc < 0x80) { + /* It's a combining character. */ + ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; + ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = (wc2 << 3) | state; + } else { + *pwc = wc; + conv->istate = state; + } + return count+2; + } + } + goto ilseq; + default: abort(); + } + none: + conv->istate = state; + return RET_TOOFEW(count); + + ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); + } +} + +static int +iso2022_jp3_flushwc (conv_t conv, ucs4_t *pwc) +{ + ucs4_t last_wc = conv->istate >> 3; + if (last_wc) { + /* Output the buffered character. */ + conv->istate &= 7; + *pwc = last_wc; + return 1; + } else + return 0; +} + +/* + * In the UCS-4 to ISO-2022-JP-3 direction, the state also holds the last two + * bytes to be output, shifted by 3 bits, and the STATE_xxxxx value that was + * effective before this buffered character, shifted by 19 bits. + */ + +/* Composition tables for each of the relevant combining characters. */ +static const struct { unsigned short base; unsigned short composed; } iso2022_jp3_comp_table_data[] = { +#define iso2022_jp3_comp_table02e5_idx 0 +#define iso2022_jp3_comp_table02e5_len 1 + { 0x2b64, 0x2b65 }, /* 0x12B65 = 0x12B64 U+02E5 */ +#define iso2022_jp3_comp_table02e9_idx (iso2022_jp3_comp_table02e5_idx+iso2022_jp3_comp_table02e5_len) +#define iso2022_jp3_comp_table02e9_len 1 + { 0x2b60, 0x2b66 }, /* 0x12B66 = 0x12B60 U+02E9 */ +#define iso2022_jp3_comp_table0300_idx (iso2022_jp3_comp_table02e9_idx+iso2022_jp3_comp_table02e9_len) +#define iso2022_jp3_comp_table0300_len 5 + { 0x295c, 0x2b44 }, /* 0x12B44 = 0x1295C U+0300 */ + { 0x2b38, 0x2b48 }, /* 0x12B48 = 0x12B38 U+0300 */ + { 0x2b37, 0x2b4a }, /* 0x12B4A = 0x12B37 U+0300 */ + { 0x2b30, 0x2b4c }, /* 0x12B4C = 0x12B30 U+0300 */ + { 0x2b43, 0x2b4e }, /* 0x12B4E = 0x12B43 U+0300 */ +#define iso2022_jp3_comp_table0301_idx (iso2022_jp3_comp_table0300_idx+iso2022_jp3_comp_table0300_len) +#define iso2022_jp3_comp_table0301_len 4 + { 0x2b38, 0x2b49 }, /* 0x12B49 = 0x12B38 U+0301 */ + { 0x2b37, 0x2b4b }, /* 0x12B4B = 0x12B37 U+0301 */ + { 0x2b30, 0x2b4d }, /* 0x12B4D = 0x12B30 U+0301 */ + { 0x2b43, 0x2b4f }, /* 0x12B4F = 0x12B43 U+0301 */ +#define iso2022_jp3_comp_table309a_idx (iso2022_jp3_comp_table0301_idx+iso2022_jp3_comp_table0301_len) +#define iso2022_jp3_comp_table309a_len 14 + { 0x242b, 0x2477 }, /* 0x12477 = 0x1242B U+309A */ + { 0x242d, 0x2478 }, /* 0x12478 = 0x1242D U+309A */ + { 0x242f, 0x2479 }, /* 0x12479 = 0x1242F U+309A */ + { 0x2431, 0x247a }, /* 0x1247A = 0x12431 U+309A */ + { 0x2433, 0x247b }, /* 0x1247B = 0x12433 U+309A */ + { 0x252b, 0x2577 }, /* 0x12577 = 0x1252B U+309A */ + { 0x252d, 0x2578 }, /* 0x12578 = 0x1252D U+309A */ + { 0x252f, 0x2579 }, /* 0x12579 = 0x1252F U+309A */ + { 0x2531, 0x257a }, /* 0x1257A = 0x12531 U+309A */ + { 0x2533, 0x257b }, /* 0x1257B = 0x12533 U+309A */ + { 0x253b, 0x257c }, /* 0x1257C = 0x1253B U+309A */ + { 0x2544, 0x257d }, /* 0x1257D = 0x12544 U+309A */ + { 0x2548, 0x257e }, /* 0x1257E = 0x12548 U+309A */ + { 0x2675, 0x2678 }, /* 0x12678 = 0x12675 U+309A */ +}; + +#define SPLIT_STATE \ + unsigned short lasttwo = state >> 3; state_t prevstate = state >> 19; state &= 7 +#define COMBINE_STATE \ + state |= (prevstate << 19) | (lasttwo << 3) +#define COMBINE_STATE_NO_LASTTWO \ + /* assume lasttwo == 0, then prevstate is ignored */ + +static int +iso2022_jp3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned char buf[2]; + unsigned short jch; + int ret; + state_t state = conv->ostate; + SPLIT_STATE; + + if (lasttwo) { + /* Attempt to combine the last character with this one. */ + unsigned int idx; + unsigned int len; + + if (wc == 0x02e5) + idx = iso2022_jp3_comp_table02e5_idx, + len = iso2022_jp3_comp_table02e5_len; + else if (wc == 0x02e9) + idx = iso2022_jp3_comp_table02e9_idx, + len = iso2022_jp3_comp_table02e9_len; + else if (wc == 0x0300) + idx = iso2022_jp3_comp_table0300_idx, + len = iso2022_jp3_comp_table0300_len; + else if (wc == 0x0301) + idx = iso2022_jp3_comp_table0301_idx, + len = iso2022_jp3_comp_table0301_len; + else if (wc == 0x309a) + idx = iso2022_jp3_comp_table309a_idx, + len = iso2022_jp3_comp_table309a_len; + else + goto not_combining; + + do + if (iso2022_jp3_comp_table_data[idx].base == lasttwo) + break; + while (++idx, --len > 0); + + if (len > 0) { + /* Output the combined character. */ + /* We know the combined character is in JISX0213 plane 1, but + the buffered character may have been in JISX0208 or in + JISX0213 plane 1. */ + count = (state != STATE_JISX02131 ? 4 : 0) + 2; + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX02131) { + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'Q'; + r += 4; + state = STATE_JISX02131; + } + lasttwo = iso2022_jp3_comp_table_data[idx].composed; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + + not_combining: + /* Output the buffered character. */ + /* We know it is in JISX0208 or in JISX0213 plane 1. */ + count = (prevstate != state ? 3 : 0) + 2; + if (n < count) + return RET_TOOSMALL; + if (prevstate != state) { + if (state != STATE_JISX0208) abort(); + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + } + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + r += 2; + } + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + count += (state == STATE_ASCII ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_ASCII) { + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + r += 3; + state = STATE_ASCII; + } + r[0] = buf[0]; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + } + + /* Try JIS X 0201-1976 Roman. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + count += (state == STATE_JISX0201ROMAN ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0201ROMAN) { + r[0] = ESC; + r[1] = '('; + r[2] = 'J'; + r += 3; + state = STATE_JISX0201ROMAN; + } + r[0] = buf[0]; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + } + + jch = ucs4_to_jisx0213(wc); + + /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + if (jch & 0x0080) { + /* A possible match in comp_table_data. Buffer it. */ + prevstate = state; + lasttwo = jch & 0x7f7f; + state = STATE_JISX0208; + COMBINE_STATE; + conv->ostate = state; + return count; + } else { + count += (state == STATE_JISX0208 ? 2 : 5); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0208) { + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + state = STATE_JISX0208; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + } + } + + /* Try JISX 0213 plane 1 and JISX 0213 plane 2. */ + if (jch != 0) { + if (jch & 0x8000) { + /* JISX 0213 plane 2. */ + if (state != STATE_JISX02132) { + count += 4; + if (n < count) + return RET_TOOSMALL; + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'P'; + r += 4; + state = STATE_JISX02132; + } + } else { + /* JISX 0213 plane 1. */ + if (state != STATE_JISX02131) { + count += 4; + if (n < count) + return RET_TOOSMALL; + r[0] = ESC; + r[1] = '$'; + r[2] = '('; + r[3] = 'Q'; + r += 4; + state = STATE_JISX02131; + } + } + if (jch & 0x0080) { + /* A possible match in comp_table_data. We have to buffer it. */ + /* We know it's a JISX 0213 plane 1 character. */ + if (jch & 0x8000) abort(); + prevstate = state; + lasttwo = jch & 0x7f7f; + COMBINE_STATE; + conv->ostate = state; + return count; + } + count += 2; + if (n < count) + return RET_TOOSMALL; + r[0] = (jch >> 8) & 0x7f; + r[1] = jch & 0x7f; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + + /* Try JIS X 0201-1976 Katakana. This is not officially part of + ISO-2022-JP-3. Therefore we try it after all other attempts. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] >= 0x80) { + count += (state == STATE_JISX0201KATAKANA ? 1 : 4); + if (n < count) + return RET_TOOSMALL; + if (state != STATE_JISX0201KATAKANA) { + r[0] = ESC; + r[1] = '('; + r[2] = 'I'; + r += 3; + state = STATE_JISX0201KATAKANA; + } + r[0] = buf[0]-0x80; + COMBINE_STATE_NO_LASTTWO; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_jp3_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + { + int count = + (lasttwo ? (prevstate != state ? 3 : 0) + 2 : 0) + + (state != STATE_ASCII ? 3 : 0); + if (n < count) + return RET_TOOSMALL; + if (lasttwo) { + if (prevstate != state) { + if (state != STATE_JISX0208) abort(); + r[0] = ESC; + r[1] = '$'; + r[2] = 'B'; + r += 3; + } + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + r += 2; + } + if (state != STATE_ASCII) { + r[0] = ESC; + r[1] = '('; + r[2] = 'B'; + } + /* conv->ostate = 0; will be done by the caller */ + return count; + } +} + +#undef COMBINE_STATE_NO_LASTTWO +#undef COMBINE_STATE +#undef SPLIT_STATE +#undef STATE_JISX02132 +#undef STATE_JISX02131 +#undef STATE_JISX0208 +#undef STATE_JISX0201KATAKANA +#undef STATE_JISX0201ROMAN +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso2022_kr.h b/Externals/libiconv-1.14/lib/iso2022_kr.h new file mode 100644 index 0000000000..8045d4e5e1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso2022_kr.h @@ -0,0 +1,222 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-2022-KR + */ + +/* Specification: RFC 1557 */ + +/* Note: CJK.INF says the SO designator needs to appear only once at the + beginning of a text, but to decrease the risk of ambiguities, when + producing ISO-2022-KR, we repeat the designator in every line containing + SO characters. RFC 1557 does not mandate this. */ + +#define ESC 0x1b +#define SO 0x0e +#define SI 0x0f + +/* + * The state is composed of one of the following values + */ +#define STATE_ASCII 0 +#define STATE_TWOBYTE 1 +/* + * and one of the following values, << 8 + */ +#define STATE2_NONE 0 +#define STATE2_DESIGNATED_KSC5601 1 + +#define SPLIT_STATE \ + unsigned int state1 = state & 0xff, state2 = state >> 8 +#define COMBINE_STATE \ + state = (state2 << 8) | state1 + +static int +iso2022_kr_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + SPLIT_STATE; + int count = 0; + unsigned char c; + for (;;) { + c = *s; + if (c == ESC) { + if (n < count+4) + goto none; + if (s[1] == '$') { + if (s[2] == ')') { + if (s[3] == 'C') { + state2 = STATE2_DESIGNATED_KSC5601; + s += 4; count += 4; + if (n < count+1) + goto none; + continue; + } + } + } + goto ilseq; + } + if (c == SO) { + if (state2 != STATE2_DESIGNATED_KSC5601) + goto ilseq; + state1 = STATE_TWOBYTE; + s++; count++; + if (n < count+1) + goto none; + continue; + } + if (c == SI) { + state1 = STATE_ASCII; + s++; count++; + if (n < count+1) + goto none; + continue; + } + break; + } + switch (state1) { + case STATE_ASCII: + if (c < 0x80) { + int ret = ascii_mbtowc(conv,pwc,s,1); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 1) abort(); +#if 0 /* Accept ISO-2022-KR according to CJK.INF. */ + if (*pwc == 0x000a || *pwc == 0x000d) + state2 = STATE2_NONE; +#endif + COMBINE_STATE; + conv->istate = state; + return count+1; + } else + goto ilseq; + case STATE_TWOBYTE: + if (n < count+2) + goto none; + if (state2 != STATE2_DESIGNATED_KSC5601) abort(); + if (s[0] < 0x80 && s[1] < 0x80) { + int ret = ksc5601_mbtowc(conv,pwc,s,2); + if (ret == RET_ILSEQ) + goto ilseq; + if (ret != 2) abort(); + COMBINE_STATE; + conv->istate = state; + return count+2; + } else + goto ilseq; + default: abort(); + } + +none: + COMBINE_STATE; + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + COMBINE_STATE; + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +static int +iso2022_kr_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + unsigned char buf[2]; + int ret; + + /* Try ASCII. */ + ret = ascii_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] < 0x80) { + int count = (state1 == STATE_ASCII ? 1 : 2); + if (n < count) + return RET_TOOSMALL; + if (state1 != STATE_ASCII) { + r[0] = SI; + r += 1; + state1 = STATE_ASCII; + } + r[0] = buf[0]; + if (wc == 0x000a || wc == 0x000d) + state2 = STATE2_NONE; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + /* Try KS C 5601-1992. */ + ret = ksc5601_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (buf[0] < 0x80 && buf[1] < 0x80) { + int count = (state2 == STATE2_DESIGNATED_KSC5601 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; + if (n < count) + return RET_TOOSMALL; + if (state2 != STATE2_DESIGNATED_KSC5601) { + r[0] = ESC; + r[1] = '$'; + r[2] = ')'; + r[3] = 'C'; + r += 4; + state2 = STATE2_DESIGNATED_KSC5601; + } + if (state1 != STATE_TWOBYTE) { + r[0] = SO; + r += 1; + state1 = STATE_TWOBYTE; + } + r[0] = buf[0]; + r[1] = buf[1]; + COMBINE_STATE; + conv->ostate = state; + return count; + } + } + + return RET_ILUNI; +} + +static int +iso2022_kr_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + SPLIT_STATE; + (void)state2; + if (state1 != STATE_ASCII) { + if (n < 1) + return RET_TOOSMALL; + r[0] = SI; + /* conv->ostate = 0; will be done by the caller */ + return 1; + } else + return 0; +} + +#undef COMBINE_STATE +#undef SPLIT_STATE +#undef STATE2_DESIGNATED_KSC5601 +#undef STATE2_NONE +#undef STATE_TWOBYTE +#undef STATE_ASCII diff --git a/Externals/libiconv-1.14/lib/iso646_cn.h b/Externals/libiconv-1.14/lib/iso646_cn.h new file mode 100644 index 0000000000..a571ce713a --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso646_cn.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO646-CN + * also known as GB_1988-80 + */ + +static int +iso646_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + if (c == 0x24) + *pwc = (ucs4_t) 0x00a5; + else if (c == 0x7e) + *pwc = (ucs4_t) 0x203e; + else + *pwc = (ucs4_t) c; + return 1; + } + return RET_ILSEQ; +} + +static int +iso646_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0080 && !(wc == 0x0024 || wc == 0x007e)) { + *r = wc; + return 1; + } + if (wc == 0x00a5) { + *r = 0x24; + return 1; + } + if (wc == 0x203e) { + *r = 0x7e; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso646_jp.h b/Externals/libiconv-1.14/lib/iso646_jp.h new file mode 100644 index 0000000000..7cc3abd040 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso646_jp.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO646-JP + * also known as JIS_C6220-1969-RO + */ + +/* This is the lower half of JIS_X0201. */ + +static int +iso646_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + if (c == 0x5c) + *pwc = (ucs4_t) 0x00a5; + else if (c == 0x7e) + *pwc = (ucs4_t) 0x203e; + else + *pwc = (ucs4_t) c; + return 1; + } + return RET_ILSEQ; +} + +static int +iso646_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { + *r = wc; + return 1; + } + if (wc == 0x00a5) { + *r = 0x5c; + return 1; + } + if (wc == 0x203e) { + *r = 0x7e; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_1.h b/Externals/libiconv-1.14/lib/iso8859_1.h new file mode 100644 index 0000000000..53469164b1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_1.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-1 + */ + +static int +iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + *pwc = (ucs4_t) c; + return 1; +} + +static int +iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0100) { + *r = wc; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_10.h b/Externals/libiconv-1.14/lib/iso8859_10.h new file mode 100644 index 0000000000..49b3f6ad3d --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_10.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-10 + */ + +static const unsigned short iso8859_10_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, + 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, + /* 0xb0 */ + 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, + 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, + /* 0xc0 */ + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + /* 0xe0 */ + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, +}; + +static int +iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_10_page00[224] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ + 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ + 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ + 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ + 0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ + 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */ + 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */ + 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */ +}; + +static int +iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = iso8859_10_page00[wc-0x00a0]; + else if (wc == 0x2015) + c = 0xbd; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_11.h b/Externals/libiconv-1.14/lib/iso8859_11.h new file mode 100644 index 0000000000..ef8b1a66c5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_11.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 1999-2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-11 + */ + +static int +iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa1) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { + *pwc = (ucs4_t) (c + 0x0d60); + return 1; + } + return RET_ILSEQ; +} + +static int +iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x00a1) { + *r = wc; + return 1; + } + else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { + *r = wc-0x0d60; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_13.h b/Externals/libiconv-1.14/lib/iso8859_13.h new file mode 100644 index 0000000000..2fadc7b8b4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_13.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-13 + */ + +static const unsigned short iso8859_13_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, + 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, + 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, + /* 0xc0 */ + 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, + 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, + /* 0xd0 */ + 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, + 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, + /* 0xe0 */ + 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, + 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, + /* 0xf0 */ + 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, + 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, +}; + +static int +iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_13_page00[224] = { + 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ + 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ + 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_13_page20[8] = { + 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */ +}; + +static int +iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = iso8859_13_page00[wc-0x00a0]; + else if (wc >= 0x2018 && wc < 0x2020) + c = iso8859_13_page20[wc-0x2018]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_14.h b/Externals/libiconv-1.14/lib/iso8859_14.h new file mode 100644 index 0000000000..01c9cdd950 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_14.h @@ -0,0 +1,127 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-14 + */ + +static const unsigned short iso8859_14_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, + 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, + /* 0xb0 */ + 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, +}; + +static int +iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0xa0) + *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char iso8859_14_page00[96] = { + 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ +}; +static const unsigned char iso8859_14_page01_0[32] = { + 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char iso8859_14_page01_1[16] = { + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */ + 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_14_page1e_0[136] = { + 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */ +}; +static const unsigned char iso8859_14_page1e_1[8] = { + 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ +}; + +static int +iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = iso8859_14_page00[wc-0x00a0]; + else if (wc >= 0x0108 && wc < 0x0128) + c = iso8859_14_page01_0[wc-0x0108]; + else if (wc >= 0x0170 && wc < 0x0180) + c = iso8859_14_page01_1[wc-0x0170]; + else if (wc >= 0x1e00 && wc < 0x1e88) + c = iso8859_14_page1e_0[wc-0x1e00]; + else if (wc >= 0x1ef0 && wc < 0x1ef8) + c = iso8859_14_page1e_1[wc-0x1ef0]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_15.h b/Externals/libiconv-1.14/lib/iso8859_15.h new file mode 100644 index 0000000000..24de90d7d3 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_15.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-15 + */ + +static const unsigned short iso8859_15_2uni[32] = { + /* 0xa0 */ + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, + 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, +}; + +static int +iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0xa0 && c < 0xc0) + *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char iso8859_15_page00[32] = { + 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */ +}; +static const unsigned char iso8859_15_page01[48] = { + 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ +}; + +static int +iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = iso8859_15_page00[wc-0x00a0]; + else if (wc >= 0x00c0 && wc < 0x0100) + c = wc; + else if (wc >= 0x0150 && wc < 0x0180) + c = iso8859_15_page01[wc-0x0150]; + else if (wc == 0x20ac) + c = 0xa4; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_16.h b/Externals/libiconv-1.14/lib/iso8859_16.h new file mode 100644 index 0000000000..200471840f --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_16.h @@ -0,0 +1,116 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-16 + */ + +static const unsigned short iso8859_16_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, + 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, + 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, + 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, +}; + +static int +iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_16_page00[224] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */ + 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */ + 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_16_page02[8] = { + 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char iso8859_16_page20[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */ +}; + +static int +iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = iso8859_16_page00[wc-0x00a0]; + else if (wc >= 0x0218 && wc < 0x0220) + c = iso8859_16_page02[wc-0x0218]; + else if (wc >= 0x2018 && wc < 0x2020) + c = iso8859_16_page20[wc-0x2018]; + else if (wc == 0x20ac) + c = 0xa4; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_2.h b/Externals/libiconv-1.14/lib/iso8859_2.h new file mode 100644 index 0000000000..9ad4d4aa5d --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_2.h @@ -0,0 +1,112 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-2 + */ + +static const unsigned short iso8859_2_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, + /* 0xb0 */ + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, + /* 0xc0 */ + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + /* 0xd0 */ + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + /* 0xe0 */ + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + /* 0xf0 */ + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, +}; + +static int +iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_2_page00[224] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ + 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */ + 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ + 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ + 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ + 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ + 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_2_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = iso8859_2_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = iso8859_2_page02[wc-0x02c0]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_3.h b/Externals/libiconv-1.14/lib/iso8859_3.h new file mode 100644 index 0000000000..308e0b0d64 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_3.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-3 + */ + +static const unsigned short iso8859_3_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7, + 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b, + /* 0xb0 */ + 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, + 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + /* 0xd0 */ + 0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, + 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, + 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, +}; + +static int +iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = iso8859_3_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char iso8859_3_page00[96] = { + 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ + 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ + 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char iso8859_3_page01[120] = { + 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */ + 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_3_page02[8] = { + 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = iso8859_3_page00[wc-0x00a0]; + else if (wc >= 0x0108 && wc < 0x0180) + c = iso8859_3_page01[wc-0x0108]; + else if (wc >= 0x02d8 && wc < 0x02e0) + c = iso8859_3_page02[wc-0x02d8]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_4.h b/Externals/libiconv-1.14/lib/iso8859_4.h new file mode 100644 index 0000000000..51e1778656 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_4.h @@ -0,0 +1,112 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-4 + */ + +static const unsigned short iso8859_4_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, + /* 0xb0 */ + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, + /* 0xc0 */ + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, + /* 0xd0 */ + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, + /* 0xe0 */ + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, + /* 0xf0 */ + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, +}; + +static int +iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_4_page00[224] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ + 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ + 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */ + 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */ + 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char iso8859_4_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = iso8859_4_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = iso8859_4_page02[wc-0x02c0]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_5.h b/Externals/libiconv-1.14/lib/iso8859_5.h new file mode 100644 index 0000000000..6b836055ac --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_5.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-5 + */ + +static const unsigned short iso8859_5_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + /* 0xb0 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0xc0 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xd0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xe0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + /* 0xf0 */ + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, +}; + +static int +iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0]; + return 1; +} + +static const unsigned char iso8859_5_page00[16] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ +}; +static const unsigned char iso8859_5_page04[96] = { + 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ +}; + +static int +iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b0) + c = iso8859_5_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0460) + c = iso8859_5_page04[wc-0x0400]; + else if (wc == 0x2116) + c = 0xf0; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_6.h b/Externals/libiconv-1.14/lib/iso8859_6.h new file mode 100644 index 0000000000..8d31199409 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_6.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-6 + */ + +static const unsigned short iso8859_6_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd, + /* 0xb0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, + /* 0xc0 */ + 0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + /* 0xd0 */ + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xe0 */ + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + /* 0xf0 */ + 0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +}; + +static int +iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = iso8859_6_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char iso8859_6_page00[16] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ +}; +static const unsigned char iso8859_6_page06[80] = { + 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ +}; + +static int +iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00b0) + c = iso8859_6_page00[wc-0x00a0]; + else if (wc >= 0x0608 && wc < 0x0658) + c = iso8859_6_page06[wc-0x0608]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_7.h b/Externals/libiconv-1.14/lib/iso8859_7.h new file mode 100644 index 0000000000..0825ef5cd9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_7.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 1999-2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-7 + */ + +static const unsigned short iso8859_7_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, + 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, + /* 0xc0 */ + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + /* 0xd0 */ + 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, + /* 0xe0 */ + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + /* 0xf0 */ + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, +}; + +static int +iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = iso8859_7_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char iso8859_7_page00[32] = { + 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char iso8859_7_page03[88] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */ + 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ + 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ +}; +static const unsigned char iso8859_7_page20[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ + 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; + +static int +iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = iso8859_7_page00[wc-0x00a0]; + else if (wc >= 0x0378 && wc < 0x03d0) + c = iso8859_7_page03[wc-0x0378]; + else if (wc >= 0x2010 && wc < 0x2020) + c = iso8859_7_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0xa4; + else if (wc == 0x20af) + c = 0xa5; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_8.h b/Externals/libiconv-1.14/lib/iso8859_8.h new file mode 100644 index 0000000000..6184846ea1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_8.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-8 + */ + +static const unsigned short iso8859_8_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, + /* 0xc0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xd0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, + /* 0xe0 */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + /* 0xf0 */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, +}; + +static int +iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0xa0) { + unsigned short wc = iso8859_8_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + else { + *pwc = (ucs4_t) c; + return 1; + } + return RET_ILSEQ; +} + +static const unsigned char iso8859_8_page00[88] = { + 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ +}; +static const unsigned char iso8859_8_page05[32] = { + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ + 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char iso8859_8_page20[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */ +}; + +static int +iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = iso8859_8_page00[wc-0x00a0]; + else if (wc >= 0x05d0 && wc < 0x05f0) + c = iso8859_8_page05[wc-0x05d0]; + else if (wc >= 0x2008 && wc < 0x2018) + c = iso8859_8_page20[wc-0x2008]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/iso8859_9.h b/Externals/libiconv-1.14/lib/iso8859_9.h new file mode 100644 index 0000000000..7dbd37d233 --- /dev/null +++ b/Externals/libiconv-1.14/lib/iso8859_9.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-8859-9 + */ + +static const unsigned short iso8859_9_2uni[48] = { + /* 0xd0 */ + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + /* 0xf0 */ + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, +}; + +static int +iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0xd0) + *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char iso8859_9_page00[48] = { + 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ + 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ +}; +static const unsigned char iso8859_9_page01[72] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ +}; + +static int +iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00d0) { + *r = wc; + return 1; + } + else if (wc >= 0x00d0 && wc < 0x0100) + c = iso8859_9_page00[wc-0x00d0]; + else if (wc >= 0x0118 && wc < 0x0160) + c = iso8859_9_page01[wc-0x0118]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/isoir165.h b/Externals/libiconv-1.14/lib/isoir165.h new file mode 100644 index 0000000000..4d6e9ffa03 --- /dev/null +++ b/Externals/libiconv-1.14/lib/isoir165.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-IR-165 + */ + +/* + * ISO-IR-165 is an extension of GB 2312, consisting of: + * 1. GB 6345.1-86 corrections: + * Two corrections to GB 2312, at 0x2367 and 0x6F71. + * 2. GB 6345.1-86 additions: + * - 6 new full-width pinyin characters in row 0x28. + * - ISO646-CN in row 0x2A. + * - 32 half-width pinyin characters in row 0x2B. + * 3. GB 8565.2-88 additions: + * - 50 characters in row 0x2D. + * - 92 characters in row 0x2E. + * - 93 characters in row 0x2F. + * - 470 characters in rows 0x7A-0x7E. + * 4. ISO-IR-165 additions: + * - 22 characters in row 0x26. + * - 94 characters in row 0x2C. + * - 44 new characters in row 0x2D. + * - 1 new character in row 0x2F. + * + * The conversion table was created from the following sources: + * Ad 1. The 0x2367 correction is already integrated in the unicode.org + * GB2312.TXT table. The 0x6F71 mapping is the same in the unicode.org + * GB2312.TXT and UNIHAN.TXT table and in Koichi Yasuoka's Uni2GB table, + * so we assume it's correct. + * The unicode.org UNIHAN.TXT table about GB 8565 is not usable: it has + * extraneous code points at rows 0x28, 0x2C, 0x2D. Note also that it does + * not list the 69 non-hanzi in row 0x2F. Moreover, it has the characters + * 0x2F7A-0x2F7D shifted down by one to 0x2F79-0x2F7C. + * Therefore we take the GB8565 and ISO-IR-165 data from Koichi Yasuoka's + * Uni2GB table. + * Ad 1. Yasuoka maps 0x2367 to U+0261 (small script g) and 0x2840 to U+FF47 + * (full-width small normal g). While coherent with ISO-IR's 165.pdf, + * this disagrees with Ken Lunde's book: He says that ISO-IR-165 + * includes the GB6345 correction, i.e. maps 0x2367 to U+FF47 or U+0067 + * and _not_ to U+0261 (small script g). + * To overcome the confusion, we just map both 0x2367 and 0x2840 to + * U+FF47. + * Ad 2. Row 0x28: Add a mapping from 0x283F to U+01F9. + * Row 0x2A: Mapping is well-known, also present in Koichi Yasuoka's + * table. + * Row 0x2B: Typed in by hand from appendix E in Ken Lunde's book. + * When converting from Unicode to ISO-IR-165, prefer the half-width + * range 0x2B{21..40} to the full-width range 0x28{21..40}. + * Ad 3. Rows 0x2D, 0x2E: Both Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT + * data for GB 8565 agree here. + * Row 0x2F: Taken from Koichi Yasuoka's Uni2GB table. + * Rows 0x7A-0x7E: Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT + * data for GB 8565 agree here mostly. Differences: + * 0x7C38 -> U+6F26 or U+527A ? We choose U+6F26. + * 0x7C5A -> U+7A40 or U+6996 ? We choose U+6996. + * Ad 4. Row 0x26: Mapping unknown. + * Rows 0x2C, 0x2D: Both Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT + * data for GB 8565 (!) agree here. + * Row 0x2F: Taken from Koichi Yasuoka's Uni2GB table. + */ + +#include "isoir165ext.h" + +static int +isoir165_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + int ret; + + /* Map full-width pinyin (row 0x28) like half-width pinyin (row 0x2B). */ + if (s[0] == 0x28) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 <= 0x40) { + unsigned char buf[2]; + buf[0] = 0x2b; + buf[1] = c2; + ret = isoir165ext_mbtowc(conv,pwc,buf,2); + if (ret != RET_ILSEQ) + return ret; + } + } + } + /* Try the GB2312 -> Unicode table. */ + ret = gb2312_mbtowc(conv,pwc,s,n); + if (ret != RET_ILSEQ) + return ret; + /* Row 0x2A is GB_1988-80. */ + if (s[0] == 0x2a) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + int ret = iso646_cn_mbtowc(conv,pwc,s+1,1); + if (ret != 1) abort(); + return 2; + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + /* Try the ISO-IR-165 extensions -> Unicode table. */ + ret = isoir165ext_mbtowc(conv,pwc,s,n); + return ret; +} + +static int +isoir165_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Try the Unicode -> GB2312 table. */ + ret = gb2312_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (!(buf[0] == 0x28 && buf[1] >= 0x21 && buf[1] <= 0x40)) { + if (n >= 2) { + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + return RET_TOOSMALL; + } + } + /* Row 0x2A is GB_1988-80. */ + ret = iso646_cn_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + if (ret != 1) abort(); + if (buf[0] >= 0x21 && buf[0] < 0x7f) { + if (n >= 2) { + r[0] = 0x2a; + r[1] = buf[0]; + return 2; + } + return RET_TOOSMALL; + } + } + /* Try the Unicode -> ISO-IR-165 extensions table. */ + ret = isoir165ext_wctomb(conv,r,wc,n); + return ret; +} diff --git a/Externals/libiconv-1.14/lib/isoir165ext.h b/Externals/libiconv-1.14/lib/isoir165ext.h new file mode 100644 index 0000000000..0bc811ac30 --- /dev/null +++ b/Externals/libiconv-1.14/lib/isoir165ext.h @@ -0,0 +1,800 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * ISO-IR-165 extensions + */ + +static const unsigned short isoir165ext_2uni_page2b[470] = { + /* 0x2b */ + 0x1fb1, 0x03ac, 0x1fb0, 0x1f70, 0x0113, 0x00e9, 0x011b, 0x00e8, + 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, + 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, + 0x00fc, 0x00ea, 0x03b1, 0x1e3f, 0x0144, 0x0148, 0x01f9, 0xff47, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x2c */ + 0x53be, 0x4eb8, 0x4f3e, 0x501e, 0x50c7, 0x9118, 0x6c98, 0x6cdc, + 0x6cc3, 0x6e5d, 0x6ea6, 0x6eeb, 0x6fa5, 0x6165, 0x5ea4, 0x9618, + 0x5848, 0x8453, 0x7cf5, 0x5f07, 0x6294, 0x647d, 0x725a, 0x5574, + 0x55a4, 0x5640, 0x5684, 0x5d1f, 0x72c9, 0x998c, 0x59de, 0x59fd, + 0x5a5e, 0x7ebb, 0x7ee4, 0x7ef9, 0x9a99, 0x71cf, 0x6245, 0x624a, + 0x797c, 0x739a, 0x742b, 0x7488, 0x74aa, 0x74d8, 0x6767, 0x6ab5, + 0x71ca, 0x6ba3, 0x8f80, 0x8f92, 0x8d5f, 0x9b36, 0x72a8, 0x87a3, + 0x8152, 0x6b38, 0x98d0, 0x8897, 0x88af, 0x8955, 0x770a, 0x94da, + 0x955a, 0x9560, 0x9e24, 0x9e40, 0x9e50, 0x9e5d, 0x9e60, 0x870e, + 0x7b5c, 0x7fd9, 0x7fef, 0x7e44, 0x8e45, 0x8e36, 0x8e62, 0x8e5c, + 0x9778, 0x9b46, 0x9f2b, 0x9f41, 0x7526, 0x4e26, 0x8bac, 0x8129, + 0x5091, 0x50cd, 0x52b9, 0x89d4, 0x5557, 0x94c7, + /* 0x2d */ + 0x9496, 0x9498, 0x94cf, 0x94d3, 0x94d4, 0x94e6, 0x9533, 0x951c, + 0x9520, 0x9527, 0x953d, 0x9543, 0x956e, 0x9574, 0x9c80, 0x9c84, + 0x9c8a, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9cbf, 0x9cc0, + 0x9cc1, 0x9cd2, 0x9cdb, 0x9ce0, 0x9ce3, 0x9770, 0x977a, 0x97a1, + 0x97ae, 0x97a8, 0x9964, 0x9966, 0x9978, 0x9979, 0x997b, 0x997e, + 0x9982, 0x9983, 0x998e, 0x9b10, 0x9b18, 0x65a2, 0x9e80, 0x911c, + 0x9e91, 0x9f12, 0x52f3, 0x6c96, 0x6d44, 0x6e1b, 0x6e67, 0x6f82, + 0x6fec, 0x60ae, 0x5ec8, 0x8ffa, 0x577f, 0x5586, 0x849e, 0x8460, + 0x5c05, 0x5e0b, 0x5d11, 0x5d19, 0x5dd6, 0x59b3, 0x5aae, 0x9a94, + 0x658f, 0x709e, 0x7551, 0x71ff, 0x691d, 0x6a11, 0x68bf, 0x6607, + 0x668e, 0x6673, 0x6c25, 0x7652, 0x778b, 0x76ea, 0x9895, 0x8780, + 0x882d, 0x7b87, 0x7c50, 0x8ead, 0x9575, 0x65c2, + /* 0x2e */ + 0x5390, 0x79b8, 0x4f15, 0x4f21, 0x4f3b, 0x4fa2, 0x50a4, 0x5092, + 0x530a, 0x51c3, 0x51a8, 0x8d20, 0x5787, 0x579a, 0x5795, 0x57eb, + 0x585d, 0x585a, 0x5871, 0x5895, 0x5c30, 0x5f0c, 0x5f0d, 0x5f0e, + 0x5c72, 0x5cc7, 0x5fac, 0x5f68, 0x5f5f, 0x5a12, 0x5a65, 0x5a84, + 0x5ac4, 0x7394, 0x73ea, 0x73ee, 0x7437, 0x7415, 0x7454, 0x6799, + 0x686c, 0x68f8, 0x69fe, 0x72e2, 0x6667, 0x8d52, 0x89c3, 0x89cd, + 0x6427, 0x6477, 0x6c1d, 0x813f, 0x6b54, 0x98d6, 0x707a, 0x70f1, + 0x7120, 0x6153, 0x6c87, 0x6dad, 0x6e81, 0x6eb5, 0x6f94, 0x6f9b, + 0x793d, 0x794e, 0x7806, 0x7859, 0x7894, 0x78dc, 0x7903, 0x7a16, + 0x7a5e, 0x75e0, 0x7adc, 0x7676, 0x9892, 0x7bf2, 0x7c30, 0x7c5d, + 0x9c9d, 0x7cac, 0x8278, 0x83d1, 0x84ea, 0x7fc0, 0x7f1e, 0x8e21, + 0x8e53, 0x9754, 0x9f0c, 0x94fb, 0xfffd, 0xfffd, + /* 0x2f */ + 0x32c0, 0x32c1, 0x32c2, 0x32c3, 0x32c4, 0x32c5, 0x32c6, 0x32c7, + 0x32c8, 0x32c9, 0x32ca, 0x32cb, 0x33e0, 0x33e1, 0x33e2, 0x33e3, + 0x33e4, 0x33e5, 0x33e6, 0x33e7, 0x33e8, 0x33e9, 0x33ea, 0x33eb, + 0x33ec, 0x33ed, 0x33ee, 0x33ef, 0x33f0, 0x33f1, 0x33f2, 0x33f3, + 0x33f4, 0x33f5, 0x33f6, 0x33f7, 0x33f8, 0x33f9, 0x33fa, 0x33fb, + 0x33fc, 0x33fd, 0x33fe, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, + 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, + 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, + 0x336d, 0x336e, 0x336f, 0x3370, 0x3037, 0x90a8, 0x965e, 0x5842, + 0x5803, 0x6c3e, 0x6d29, 0x6ee7, 0x8534, 0x84c6, 0x633c, 0x5d05, + 0x7f10, 0x7eec, 0x7287, 0x712e, 0x8218, 0x8216, 0x756c, 0x75f3, + 0x9b25, 0x8980, 0x7ca6, 0x4e85, 0x5570, 0x91c6, +}; +static const unsigned short isoir165ext_2uni_page7a[470] = { + /* 0x7a */ + 0x4e0f, 0x673f, 0x4e42, 0x752a, 0x592c, 0x9ee1, 0x8652, 0x531c, + 0x5187, 0x518f, 0x50f0, 0x4f0b, 0x4f23, 0x4f03, 0x4f61, 0x4f7a, + 0x4f6b, 0x4feb, 0x4ff5, 0x5034, 0x5022, 0x4ff6, 0x5072, 0x4eb6, + 0x51ae, 0x5910, 0x6bda, 0x522c, 0x5232, 0x4fb4, 0x5298, 0x52bb, + 0x52bc, 0x52cd, 0x52da, 0x52f7, 0x53c6, 0x53c7, 0x5770, 0x576c, + 0x57b1, 0x579f, 0x579e, 0x57be, 0x57cc, 0x580e, 0x580c, 0x57f5, + 0x5809, 0x583c, 0x5843, 0x5845, 0x5846, 0x583d, 0x5853, 0x5888, + 0x5884, 0x58f8, 0x56ad, 0x5940, 0x5953, 0x596d, 0x5c2a, 0x54a5, + 0x551d, 0x5536, 0x556f, 0x554d, 0x569a, 0x569c, 0x56f7, 0x5710, + 0x5719, 0x5e17, 0x5e21, 0x5e28, 0x5e6a, 0x5c74, 0x5c7c, 0x5ca8, + 0x5c9e, 0x5cc3, 0x5cd3, 0x5ce3, 0x5ce7, 0x5cff, 0x5d04, 0x5d00, + 0x5d1a, 0x5d0c, 0x5d4e, 0x5d5a, 0x5d85, 0x5d93, + /* 0x7b */ + 0x5d92, 0x5dc2, 0x5dc9, 0x8852, 0x5faf, 0x5906, 0x65a8, 0x7241, + 0x7242, 0x5ebc, 0x5ecb, 0x95ec, 0x95ff, 0x8a1a, 0x9607, 0x9613, + 0x961b, 0x5bac, 0x5ba7, 0x5c5d, 0x5f22, 0x59ee, 0x5a7c, 0x5a96, + 0x5a73, 0x5a9e, 0x5aad, 0x5ada, 0x5aea, 0x5b1b, 0x5b56, 0x9a72, + 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a95, 0x9aa6, 0x7395, 0x7399, + 0x73a0, 0x73b1, 0x73a5, 0x73a6, 0x73d6, 0x73f0, 0x73fd, 0x73e3, + 0x7424, 0x740e, 0x7407, 0x73f6, 0x73fa, 0x7432, 0x742f, 0x7444, + 0x7442, 0x7471, 0x7478, 0x7462, 0x7486, 0x749f, 0x74a0, 0x7498, + 0x74b2, 0x97e8, 0x6745, 0x679f, 0x677b, 0x67c8, 0x67ee, 0x684b, + 0x68a0, 0x6812, 0x681f, 0x686a, 0x68bc, 0x68fb, 0x686f, 0x68b1, + 0x68c1, 0x68eb, 0x6913, 0x68d1, 0x6911, 0x68d3, 0x68ec, 0x692b, + 0x68e8, 0x69be, 0x6969, 0x6940, 0x696f, 0x695f, + /* 0x7c */ + 0x6962, 0x6935, 0x6959, 0x69bc, 0x69c5, 0x69da, 0x69dc, 0x6a0b, + 0x69e5, 0x6a66, 0x6a96, 0x6ab4, 0x72dd, 0x5cf1, 0x7314, 0x733a, + 0x6b95, 0x5f67, 0x80fe, 0x74fb, 0x7503, 0x655c, 0x6569, 0x6f26, + 0x65f8, 0x65fb, 0x6609, 0x663d, 0x6662, 0x665e, 0x666c, 0x668d, + 0x668b, 0x8d51, 0x8d57, 0x7263, 0x7277, 0x63b1, 0x6261, 0x6260, + 0x6283, 0x62e4, 0x62c3, 0x631c, 0x6326, 0x63af, 0x63fe, 0x6422, + 0x6412, 0x64ed, 0x6713, 0x6718, 0x8158, 0x81d1, 0x98cf, 0x98d4, + 0x98d7, 0x6996, 0x7098, 0x70dc, 0x70fa, 0x710c, 0x711c, 0x71cb, + 0x721f, 0x70dd, 0x659d, 0x6246, 0x6017, 0x60c7, 0x60d3, 0x60b0, + 0x60d9, 0x6114, 0x6c3f, 0x6c67, 0x6c84, 0x6c9a, 0x6c6d, 0x6ca8, + 0x6cc6, 0x6cb5, 0x6d49, 0x6d38, 0x6d11, 0x6d3a, 0x6d28, 0x6d50, + 0x6d34, 0x6d55, 0x6d61, 0x6da2, 0x6d65, 0x6d5b, + /* 0x7d */ + 0x6d64, 0x6db4, 0x6e9a, 0x6e5c, 0x6e72, 0x6ea0, 0x6e87, 0x6e8e, + 0x6ec9, 0x6ec3, 0x6f37, 0x6ed8, 0x6eea, 0x6f56, 0x6f75, 0x6f5f, + 0x6fb4, 0x6fbc, 0x7014, 0x700d, 0x700c, 0x703c, 0x7943, 0x7947, + 0x794a, 0x7950, 0x7972, 0x7998, 0x79a0, 0x79a4, 0x77fc, 0x77fb, + 0x7822, 0x7820, 0x7841, 0x785a, 0x7875, 0x78b6, 0x78e1, 0x7933, + 0x8a5f, 0x76fb, 0x771b, 0x772c, 0x7786, 0x77ab, 0x77ad, 0x7564, + 0x756f, 0x6983, 0x7f7d, 0x76dd, 0x76e6, 0x76ec, 0x7521, 0x79fe, + 0x7a44, 0x767f, 0x769e, 0x9e27, 0x9e2e, 0x9e30, 0x9e34, 0x9e4d, + 0x9e52, 0x9e53, 0x9e54, 0x9e56, 0x9e59, 0x9e61, 0x9e62, 0x9e65, + 0x9e6f, 0x9e74, 0x75a2, 0x7604, 0x7608, 0x761d, 0x7ad1, 0x7a85, + 0x7a8e, 0x7aa3, 0x7ab8, 0x7abe, 0x77de, 0x8030, 0x988b, 0x988e, + 0x9899, 0x98a3, 0x8683, 0x8705, 0x8758, 0x87cf, + /* 0x7e */ + 0x87e2, 0x880b, 0x80d4, 0x7f4d, 0x7b4a, 0x7b4e, 0x7b7f, 0x7b93, + 0x7bef, 0x7c09, 0x7bf0, 0x7c15, 0x7c03, 0x7c20, 0x823a, 0x8886, + 0x88aa, 0x88c0, 0x88c8, 0x8926, 0x8976, 0x7f91, 0x8283, 0x82bc, + 0x82a7, 0x8313, 0x82fe, 0x8300, 0x835d, 0x8345, 0x8344, 0x831d, + 0x83a6, 0x8399, 0x83fe, 0x841a, 0x83fc, 0x8429, 0x8439, 0x84a8, + 0x84cf, 0x849f, 0x84c2, 0x84f7, 0x8570, 0x85b3, 0x85a2, 0x96d8, + 0x85b8, 0x85e0, 0x7fda, 0x7eae, 0x7eb4, 0x7ebc, 0x7ed6, 0x7f0a, + 0x5b43, 0x8d6a, 0x5245, 0x8c68, 0x8c6e, 0x8c6d, 0x8e16, 0x8e26, + 0x8e27, 0x8e50, 0x9098, 0x90a0, 0x90bd, 0x90c8, 0x90c3, 0x90da, + 0x90ff, 0x911a, 0x910c, 0x9120, 0x9142, 0x8fb5, 0x90e4, 0x8c86, + 0x89f1, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bea, 0x8c09, 0x8c1e, 0x9702, + 0x68d0, 0x7306, 0x9f81, 0x9f82, 0x92c6, 0x9491, +}; + +static int +isoir165ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x2b && c1 <= 0x2f) || (c1 >= 0x7a && c1 <= 0x7e)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 8366) { + if (i < 1410) + wc = isoir165ext_2uni_page2b[i-940]; + } else { + if (i < 8836) + wc = isoir165ext_2uni_page7a[i-8366]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short isoir165ext_2charset[876] = { + 0x2b28, 0x2b26, 0x2b3a, 0x2b2c, 0x2b2a, 0x2b30, 0x2b2e, 0x2b34, + 0x2b32, 0x2b39, 0x2b25, 0x2b27, 0x2b29, 0x2b3d, 0x2b3e, 0x2b2d, + 0x2b31, 0x2b2b, 0x2b2f, 0x2b33, 0x2b35, 0x2b36, 0x2b37, 0x2b38, + 0x2b3f, 0x2b22, 0x2b3b, 0x2b3c, 0x2b24, 0x2b23, 0x2b21, 0x2f65, + 0x2f21, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f26, 0x2f27, 0x2f28, + 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, + 0x2f50, 0x2f51, 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f57, + 0x2f58, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5d, 0x2f5e, 0x2f5f, + 0x2f60, 0x2f61, 0x2f62, 0x2f63, 0x2f64, 0x2f2d, 0x2f2e, 0x2f2f, + 0x2f30, 0x2f31, 0x2f32, 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, + 0x2f38, 0x2f39, 0x2f3a, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3f, + 0x2f40, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f46, 0x2f47, + 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x7a21, 0x2c76, 0x7a23, 0x2f7c, + 0x7a38, 0x2c22, 0x7a2e, 0x7a2c, 0x2e23, 0x2e24, 0x7a2d, 0x2e25, + 0x2c23, 0x7a2f, 0x7a31, 0x7a30, 0x2e26, 0x7a3e, 0x7a32, 0x7a33, + 0x7a36, 0x2c24, 0x7a35, 0x7a34, 0x7a37, 0x2c79, 0x2e28, 0x2e27, + 0x2c25, 0x2c7a, 0x7a2b, 0x7a29, 0x7a2a, 0x2e2b, 0x7a39, 0x2e2a, + 0x7a3c, 0x7a3d, 0x7e5b, 0x7a3f, 0x2c7b, 0x7a40, 0x7a41, 0x7a42, + 0x7a43, 0x2d53, 0x7a44, 0x2e29, 0x7a28, 0x2e21, 0x2c21, 0x7a45, + 0x7a46, 0x7a60, 0x7a61, 0x7a62, 0x7a64, 0x2c7d, 0x7a63, 0x2f7d, + 0x2c38, 0x2d5e, 0x2c39, 0x2c3a, 0x2c3b, 0x7a65, 0x7a66, 0x7a5b, + 0x7a67, 0x7a68, 0x7a69, 0x7a48, 0x7a47, 0x2d5d, 0x2e2d, 0x2e2f, + 0x2e2e, 0x7a4b, 0x7a4a, 0x7a49, 0x7a4c, 0x7a4d, 0x2e30, 0x7a50, + 0x2f69, 0x7a51, 0x7a4f, 0x7a4e, 0x7a52, 0x7a56, 0x2f68, 0x7a53, + 0x7a54, 0x7a55, 0x2c31, 0x7a57, 0x2e32, 0x2e31, 0x2e33, 0x7a59, + 0x7a58, 0x2e34, 0x7a5a, 0x7b26, 0x7a3a, 0x7a25, 0x7a5c, 0x7a5d, + 0x7a5e, 0x2d66, 0x2c3f, 0x7b36, 0x2c40, 0x2e3e, 0x2c41, 0x2e3f, + 0x7b39, 0x7b37, 0x2e40, 0x7b38, 0x7b3a, 0x7b3b, 0x2d67, 0x2e41, + 0x7b3c, 0x7b3d, 0x7b3e, 0x7e59, 0x7b3f, 0x7b33, 0x7b32, 0x2d61, + 0x7a5f, 0x2e35, 0x7b34, 0x2e39, 0x7a6e, 0x7a6f, 0x7a71, 0x7a70, + 0x7a72, 0x2e3a, 0x7a73, 0x7a74, 0x7a75, 0x7c2e, 0x7a76, 0x7a78, + 0x7a77, 0x2f70, 0x7a7a, 0x2d63, 0x2d64, 0x7a79, 0x2c3c, 0x7a7b, + 0x7a7c, 0x7a7d, 0x7b21, 0x7a7e, 0x7b22, 0x7b23, 0x2d65, 0x2d62, + 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x2c2f, 0x7b2a, 0x2d5b, 0x7b2b, + 0x2c34, 0x2e36, 0x2e37, 0x2e38, 0x7b35, 0x2e3d, 0x7c32, 0x2e3c, + 0x2e3b, 0x7b25, 0x7c65, 0x2d5a, 0x7c68, 0x7c66, 0x7c67, 0x7c69, + 0x7c6a, 0x2e5a, 0x2c2e, 0x2c47, 0x7c64, 0x2c48, 0x7c48, 0x7c47, + 0x7c49, 0x2c35, 0x7c4b, 0x7c4a, 0x7c4c, 0x7c4d, 0x2f6f, 0x7c4e, + 0x7c46, 0x7c4f, 0x7c51, 0x7c50, 0x2e51, 0x2e52, 0x2c36, 0x7c52, + 0x7c36, 0x7c37, 0x2d69, 0x7c63, 0x2d4e, 0x7b27, 0x2d7e, 0x7c39, + 0x7c3a, 0x2d70, 0x7c3b, 0x7c3c, 0x7c3e, 0x7c3d, 0x2e4d, 0x7c3f, + 0x2d72, 0x7c41, 0x7c40, 0x2d71, 0x7c53, 0x7c54, 0x7a22, 0x7b63, + 0x2c4f, 0x7b65, 0x2e48, 0x7b64, 0x7b66, 0x7b67, 0x7b6a, 0x7b6b, + 0x7b68, 0x7b6c, 0x2e49, 0x7b6f, 0x7b69, 0x7b70, 0x7b6d, 0x2d6f, + 0x7b71, 0x7e79, 0x7b74, 0x7b76, 0x7b79, 0x7b72, 0x7b77, 0x2e4a, + 0x7b6e, 0x7b75, 0x7b73, 0x2d6d, 0x7b78, 0x7c22, 0x7b7c, 0x7c23, + 0x7b7e, 0x7c21, 0x7b7b, 0x7b7d, 0x7d52, 0x7c5a, 0x7c24, 0x7b7a, + 0x7c25, 0x7c26, 0x7c27, 0x7c29, 0x2e4b, 0x7c28, 0x2d6e, 0x7c2a, + 0x7c2b, 0x7c2c, 0x2c50, 0x2c5a, 0x2e55, 0x7c31, 0x2c52, 0x7a3b, + 0x2e53, 0x2d73, 0x2f6a, 0x7c6b, 0x7c6c, 0x7c6f, 0x7c6d, 0x2e5b, + 0x2d54, 0x2c27, 0x7c6e, 0x7c70, 0x7c72, 0x2c29, 0x7c71, 0x2c28, + 0x7c75, 0x7c77, 0x2f6b, 0x7c79, 0x7c74, 0x7c76, 0x2d55, 0x7c73, + 0x7c78, 0x7c7a, 0x7c7e, 0x7c7b, 0x7d21, 0x7c7d, 0x7c7c, 0x2e5c, + 0x7d22, 0x2d56, 0x7d24, 0x2c2a, 0x2d57, 0x7d25, 0x2e5d, 0x7d27, + 0x7d28, 0x7d23, 0x7d26, 0x2c2b, 0x2e5e, 0x7d2a, 0x7d29, 0x7d2c, + 0x2f6c, 0x7d2d, 0x2c2c, 0x7c38, 0x7d2b, 0x7d2e, 0x7d30, 0x7d2f, + 0x2d58, 0x2e5f, 0x2e60, 0x2c2d, 0x7d31, 0x7d32, 0x2d59, 0x7d35, + 0x7d34, 0x7d33, 0x7d36, 0x2e57, 0x7c5b, 0x2d6a, 0x7c5c, 0x7c62, + 0x2e58, 0x7c5d, 0x7c5e, 0x7c5f, 0x2e59, 0x2f74, 0x2c51, 0x7c60, + 0x2c46, 0x2d6c, 0x7c61, 0x7b28, 0x7b29, 0x2c37, 0x7c44, 0x7c45, + 0x2f73, 0x2c57, 0x2c3d, 0x7c2d, 0x2e4c, 0x7e7a, 0x7c2f, 0x7c30, + 0x2e42, 0x7b47, 0x7b48, 0x2c4a, 0x7b49, 0x7b4b, 0x7b4c, 0x7b4a, + 0x7b4d, 0x7b50, 0x2e43, 0x2e44, 0x7b4e, 0x7b54, 0x7b55, 0x7b4f, + 0x7b53, 0x7b52, 0x2e46, 0x7b51, 0x2c4b, 0x7b57, 0x7b56, 0x2e45, + 0x7b59, 0x7b58, 0x2e47, 0x7b5c, 0x7b5a, 0x7b5b, 0x7b5d, 0x2c4c, + 0x7b60, 0x7b5e, 0x7b5f, 0x2c4d, 0x7b61, 0x2c4e, 0x7c34, 0x7c35, + 0x7d57, 0x2c75, 0x7a24, 0x2d6b, 0x7d50, 0x2f77, 0x7d51, 0x7d6b, + 0x2e6a, 0x2f78, 0x7d6c, 0x7d6d, 0x7d6e, 0x2d74, 0x2e6c, 0x7d5a, + 0x7d5b, 0x7d54, 0x7d55, 0x2d76, 0x7d56, 0x7d4a, 0x2c5f, 0x7d4b, + 0x7d4c, 0x7d4d, 0x2d75, 0x7d4e, 0x7d4f, 0x7d75, 0x7d40, 0x7d3f, + 0x2e63, 0x7d42, 0x7d41, 0x7d43, 0x2e64, 0x7d44, 0x7d45, 0x2e65, + 0x7d46, 0x2e66, 0x7d47, 0x2e67, 0x7d48, 0x2e61, 0x7d37, 0x7d38, + 0x7d39, 0x2e62, 0x7d3a, 0x7d3b, 0x2c49, 0x7d3c, 0x7d3d, 0x7d3e, + 0x2e22, 0x7d58, 0x2e68, 0x7d59, 0x2e69, 0x7d70, 0x7d71, 0x7d72, + 0x7d73, 0x7d74, 0x7d6f, 0x2e6b, 0x7e25, 0x7e26, 0x2c69, 0x7e27, + 0x2d7a, 0x7e28, 0x7e29, 0x7e2b, 0x2e6e, 0x7e2d, 0x7e2a, 0x7e2c, + 0x7e2e, 0x2e6f, 0x2d7b, 0x2e70, 0x2f7b, 0x2e72, 0x2c33, 0x2c6c, + 0x7e54, 0x7e55, 0x2c42, 0x7e56, 0x7e57, 0x2c43, 0x2f72, 0x2c44, + 0x7e58, 0x2f71, 0x2e77, 0x7e24, 0x7d53, 0x7e36, 0x2e76, 0x2c6a, + 0x7e53, 0x2c6b, 0x7d76, 0x7e23, 0x7c33, 0x2c78, 0x2e54, 0x2c59, + 0x7c55, 0x7c56, 0x2f76, 0x2f75, 0x7e2f, 0x2e73, 0x7e37, 0x7e39, + 0x7e38, 0x7e3b, 0x7e3c, 0x7e3a, 0x7e40, 0x7e3f, 0x7e3e, 0x7e3d, + 0x7e42, 0x7e41, 0x2e74, 0x7e45, 0x7e43, 0x7e44, 0x7e46, 0x7e47, + 0x2c32, 0x2d60, 0x2d5f, 0x7e4a, 0x7e48, 0x7e4b, 0x2f6e, 0x7e49, + 0x2e75, 0x7e4c, 0x2f6d, 0x7e4d, 0x7e4f, 0x7e4e, 0x7e51, 0x7e52, + 0x7a27, 0x7d7b, 0x7d7c, 0x2c68, 0x7d7d, 0x2d78, 0x2c58, 0x7d7e, + 0x7e21, 0x7e22, 0x2d79, 0x7b24, 0x7e30, 0x2c5c, 0x7e31, 0x2c5d, + 0x7e32, 0x7e33, 0x7e34, 0x2c5e, 0x7e35, 0x2f7a, 0x2e4f, 0x2e50, + 0x2c7c, 0x7e71, 0x7b2e, 0x7d49, 0x2c77, 0x7e72, 0x7e73, 0x7e74, + 0x7e75, 0x7e76, 0x7e77, 0x7e5c, 0x7e5e, 0x7e5d, 0x7e70, 0x2e2c, + 0x7c42, 0x2e4e, 0x7c43, 0x2c55, 0x7e5a, 0x7e5f, 0x2e78, 0x7e60, + 0x7e61, 0x2c6e, 0x2c6d, 0x7e62, 0x2e79, 0x2c70, 0x2c6f, 0x2d7c, + 0x2c53, 0x2c54, 0x7e6e, 0x2d5c, 0x7e63, 0x7e64, 0x2f66, 0x7e65, + 0x7e67, 0x7e66, 0x7e68, 0x7e6f, 0x7e69, 0x7e6b, 0x2c26, 0x7e6a, + 0x2d50, 0x7e6c, 0x7e6d, 0x2f7e, 0x7e7d, 0x7e7e, 0x2d21, 0x2d22, + 0x2c7e, 0x2d23, 0x2d24, 0x2d25, 0x2c60, 0x2d26, 0x2e7c, 0x2d28, + 0x2d29, 0x2d2a, 0x2d27, 0x2d2b, 0x2d2c, 0x2c61, 0x2c62, 0x2d2d, + 0x2d2e, 0x2d7d, 0x7b2c, 0x7b2d, 0x7b2f, 0x7b30, 0x2c30, 0x7b31, + 0x2f67, 0x7e50, 0x7e78, 0x2e7a, 0x2d3e, 0x2c71, 0x2d3f, 0x2d40, + 0x2d42, 0x2d41, 0x7b62, 0x7d77, 0x7d78, 0x2e6d, 0x2d77, 0x7d79, + 0x7d7a, 0x7c57, 0x2c5b, 0x7c58, 0x2e56, 0x7c59, 0x2d43, 0x2d44, + 0x2d45, 0x2d46, 0x2d47, 0x2d48, 0x2d49, 0x2d4a, 0x2c3e, 0x2d4b, + 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x2d68, 0x7b45, 0x2c45, + 0x7b46, 0x2d4c, 0x2d4d, 0x2f79, 0x2c56, 0x2c72, 0x2d2f, 0x2d30, + 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x2d35, 0x2d36, 0x2e71, 0x2d37, + 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2c63, 0x7d5c, + 0x7d5d, 0x7d5e, 0x7d5f, 0x2c64, 0x7d60, 0x2c65, 0x7d61, 0x7d62, + 0x7d63, 0x7d64, 0x7d65, 0x2c66, 0x2c67, 0x7d66, 0x7d67, 0x7d68, + 0x7d69, 0x7d6a, 0x2d4f, 0x2d51, 0x7a26, 0x2e7b, 0x2d52, 0x2c73, + 0x2c74, 0x7e7b, 0x7e7c, 0x2b40, +}; + +static const Summary16 isoir165ext_uni2indx_page00[32] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x3700 }, { 5, 0x160c }, + /* 0x0100 */ + { 10, 0x0000 }, { 10, 0x0808 }, { 12, 0x0800 }, { 13, 0x0000 }, + { 13, 0x2110 }, { 16, 0x0000 }, { 16, 0x0800 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, + { 17, 0x0000 }, { 17, 0x1555 }, { 24, 0x0000 }, { 24, 0x0200 }, +}; +static const Summary16 isoir165ext_uni2indx_page03[12] = { + /* 0x0300 */ + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, + { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x1000 }, { 26, 0x0002 }, +}; +static const Summary16 isoir165ext_uni2indx_page1e[28] = { + /* 0x1e00 */ + { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x8000 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, + /* 0x1f00 */ + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, + { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0001 }, + { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0003 }, +}; +static const Summary16 isoir165ext_uni2indx_page30[4] = { + /* 0x3000 */ + { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0080 }, +}; +static const Summary16 isoir165ext_uni2indx_page32[32] = { + /* 0x3200 */ + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, + { 32, 0x0fff }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, + /* 0x3300 */ + { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, + { 44, 0x0000 }, { 44, 0xff00 }, { 52, 0xffff }, { 68, 0x0001 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, + { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0xffff }, { 85, 0x7fff }, +}; +static const Summary16 isoir165ext_uni2indx_page4e[752] = { + /* 0x4e00 */ + { 100, 0x8000 }, { 101, 0x0000 }, { 101, 0x0040 }, { 102, 0x0000 }, + { 102, 0x0004 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, + { 103, 0x0020 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0140 }, + { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, + /* 0x4f00 */ + { 106, 0x0808 }, { 108, 0x0020 }, { 109, 0x000a }, { 111, 0x4800 }, + { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0802 }, { 115, 0x0400 }, + { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0004 }, { 117, 0x0010 }, + { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0800 }, { 119, 0x0060 }, + /* 0x5000 */ + { 121, 0x0000 }, { 121, 0x4000 }, { 122, 0x0004 }, { 123, 0x0010 }, + { 124, 0x0000 }, { 124, 0x0000 }, { 124, 0x0000 }, { 124, 0x0004 }, + { 125, 0x0000 }, { 125, 0x0006 }, { 127, 0x0010 }, { 128, 0x0000 }, + { 128, 0x2080 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0001 }, + /* 0x5100 */ + { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, + { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, + { 131, 0x8080 }, { 133, 0x0000 }, { 133, 0x4100 }, { 135, 0x0000 }, + { 135, 0x0008 }, { 136, 0x0000 }, { 136, 0x0000 }, { 136, 0x0000 }, + /* 0x5200 */ + { 136, 0x0000 }, { 136, 0x0000 }, { 136, 0x1000 }, { 137, 0x0004 }, + { 138, 0x0020 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, + { 139, 0x0000 }, { 139, 0x0100 }, { 140, 0x0000 }, { 140, 0x1a00 }, + { 143, 0x2000 }, { 144, 0x0400 }, { 145, 0x0000 }, { 145, 0x0088 }, + /* 0x5300 */ + { 147, 0x0400 }, { 148, 0x1000 }, { 149, 0x0000 }, { 149, 0x0000 }, + { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, + { 149, 0x0000 }, { 149, 0x0001 }, { 150, 0x0000 }, { 150, 0x4000 }, + { 151, 0x00c0 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, + /* 0x5400 */ + { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, + { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, + { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0020 }, { 154, 0x0000 }, + { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, + /* 0x5500 */ + { 154, 0x0000 }, { 154, 0x2000 }, { 155, 0x0000 }, { 155, 0x0040 }, + { 156, 0x2000 }, { 157, 0x0080 }, { 158, 0x8000 }, { 159, 0x0011 }, + { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0010 }, { 163, 0x0000 }, + { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, + /* 0x5600 */ + { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, + { 163, 0x0001 }, { 164, 0x0000 }, { 164, 0x0000 }, { 164, 0x0000 }, + { 164, 0x0010 }, { 165, 0x1400 }, { 167, 0x2000 }, { 168, 0x0000 }, + { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0080 }, + /* 0x5700 */ + { 169, 0x0000 }, { 169, 0x0201 }, { 171, 0x0000 }, { 171, 0x0000 }, + { 171, 0x0000 }, { 171, 0x0000 }, { 171, 0x1000 }, { 172, 0x8001 }, + { 174, 0x0080 }, { 175, 0xc420 }, { 179, 0x0000 }, { 179, 0x4002 }, + { 181, 0x1000 }, { 182, 0x0000 }, { 182, 0x0800 }, { 183, 0x0020 }, + /* 0x5800 */ + { 184, 0x5208 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x3000 }, + { 190, 0x016c }, { 195, 0x2408 }, { 198, 0x0000 }, { 198, 0x0002 }, + { 199, 0x0110 }, { 201, 0x0020 }, { 202, 0x0000 }, { 202, 0x0000 }, + { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0100 }, + /* 0x5900 */ + { 203, 0x0040 }, { 204, 0x0001 }, { 205, 0x1000 }, { 206, 0x0000 }, + { 206, 0x0001 }, { 207, 0x0008 }, { 208, 0x2000 }, { 209, 0x0000 }, + { 209, 0x0000 }, { 209, 0x0000 }, { 209, 0x0000 }, { 209, 0x0008 }, + { 210, 0x0000 }, { 210, 0x4000 }, { 211, 0x4000 }, { 212, 0x2000 }, + /* 0x5a00 */ + { 213, 0x0000 }, { 213, 0x0004 }, { 214, 0x0000 }, { 214, 0x0000 }, + { 214, 0x0000 }, { 214, 0x4000 }, { 215, 0x0020 }, { 216, 0x1008 }, + { 218, 0x0010 }, { 219, 0x4040 }, { 221, 0x6000 }, { 223, 0x0000 }, + { 223, 0x0010 }, { 224, 0x0400 }, { 225, 0x0400 }, { 226, 0x0000 }, + /* 0x5b00 */ + { 226, 0x0000 }, { 226, 0x0800 }, { 227, 0x0000 }, { 227, 0x0000 }, + { 227, 0x0008 }, { 228, 0x0040 }, { 229, 0x0000 }, { 229, 0x0000 }, + { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x1080 }, { 231, 0x0000 }, + { 231, 0x0000 }, { 231, 0x0000 }, { 231, 0x0000 }, { 231, 0x0000 }, + /* 0x5c00 */ + { 231, 0x0020 }, { 232, 0x0000 }, { 232, 0x0400 }, { 233, 0x0001 }, + { 234, 0x0000 }, { 234, 0x2000 }, { 235, 0x0000 }, { 235, 0x1014 }, + { 238, 0x0000 }, { 238, 0x4000 }, { 239, 0x0100 }, { 240, 0x0000 }, + { 240, 0x0088 }, { 242, 0x0008 }, { 243, 0x0088 }, { 245, 0x8002 }, + /* 0x5d00 */ + { 247, 0x1031 }, { 251, 0x8602 }, { 255, 0x0000 }, { 255, 0x0000 }, + { 255, 0x4000 }, { 256, 0x0400 }, { 257, 0x0000 }, { 257, 0x0000 }, + { 257, 0x0020 }, { 258, 0x000c }, { 260, 0x0000 }, { 260, 0x0000 }, + { 260, 0x0204 }, { 262, 0x0040 }, { 263, 0x0000 }, { 263, 0x0000 }, + /* 0x5e00 */ + { 263, 0x0800 }, { 264, 0x0080 }, { 265, 0x0102 }, { 267, 0x0000 }, + { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0400 }, { 268, 0x0000 }, + { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0010 }, { 269, 0x1000 }, + { 270, 0x0900 }, { 272, 0x0000 }, { 272, 0x0000 }, { 272, 0x0000 }, + /* 0x5f00 */ + { 272, 0x7080 }, { 276, 0x0000 }, { 276, 0x0004 }, { 277, 0x0000 }, + { 277, 0x0000 }, { 277, 0x8000 }, { 278, 0x0180 }, { 280, 0x0000 }, + { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x9000 }, { 282, 0x0000 }, + { 282, 0x0000 }, { 282, 0x0000 }, { 282, 0x0000 }, { 282, 0x0000 }, + /* 0x6000 */ + { 282, 0x0000 }, { 282, 0x0080 }, { 283, 0x0000 }, { 283, 0x0000 }, + { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, + { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x4000 }, { 284, 0x0001 }, + { 285, 0x0080 }, { 286, 0x0208 }, { 288, 0x0000 }, { 288, 0x0000 }, + /* 0x6100 */ + { 288, 0x0000 }, { 288, 0x0010 }, { 289, 0x0000 }, { 289, 0x0000 }, + { 289, 0x0000 }, { 289, 0x0008 }, { 290, 0x0020 }, { 291, 0x0000 }, + { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, + { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, + /* 0x6200 */ + { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, + { 291, 0x0460 }, { 294, 0x0000 }, { 294, 0x0003 }, { 296, 0x0000 }, + { 296, 0x0008 }, { 297, 0x0010 }, { 298, 0x0000 }, { 298, 0x0000 }, + { 298, 0x0008 }, { 299, 0x0000 }, { 299, 0x0010 }, { 300, 0x0000 }, + /* 0x6300 */ + { 300, 0x0000 }, { 300, 0x1000 }, { 301, 0x0040 }, { 302, 0x1000 }, + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, + { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x8000 }, { 304, 0x0002 }, + { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x4000 }, + /* 0x6400 */ + { 306, 0x0000 }, { 306, 0x0004 }, { 307, 0x0084 }, { 309, 0x0000 }, + { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x2080 }, + { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, + { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x2000 }, { 312, 0x0000 }, + /* 0x6500 */ + { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x0000 }, + { 312, 0x0000 }, { 312, 0x1000 }, { 313, 0x0200 }, { 314, 0x0000 }, + { 314, 0x8000 }, { 315, 0x2000 }, { 316, 0x0104 }, { 318, 0x0000 }, + { 318, 0x0004 }, { 319, 0x0000 }, { 319, 0x0000 }, { 319, 0x0900 }, + /* 0x6600 */ + { 321, 0x0280 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x2000 }, + { 324, 0x0000 }, { 324, 0x4000 }, { 325, 0x1084 }, { 328, 0x0008 }, + { 329, 0x6800 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, + { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, + /* 0x6700 */ + { 332, 0x0000 }, { 332, 0x0108 }, { 334, 0x0000 }, { 334, 0x8000 }, + { 335, 0x0020 }, { 336, 0x0000 }, { 336, 0x0080 }, { 337, 0x0800 }, + { 338, 0x0000 }, { 338, 0x8200 }, { 340, 0x0000 }, { 340, 0x0000 }, + { 340, 0x0100 }, { 341, 0x0000 }, { 341, 0x4000 }, { 342, 0x0000 }, + /* 0x6800 */ + { 342, 0x0000 }, { 342, 0x8004 }, { 344, 0x0000 }, { 344, 0x0000 }, + { 344, 0x0800 }, { 345, 0x0000 }, { 345, 0x9400 }, { 348, 0x0000 }, + { 348, 0x0000 }, { 348, 0x0000 }, { 348, 0x0001 }, { 349, 0x9002 }, + { 352, 0x0002 }, { 353, 0x000b }, { 356, 0x1900 }, { 359, 0x0900 }, + /* 0x6900 */ + { 361, 0x0000 }, { 361, 0x200a }, { 364, 0x0800 }, { 365, 0x0020 }, + { 366, 0x0001 }, { 367, 0x8200 }, { 369, 0x8204 }, { 372, 0x0000 }, + { 372, 0x0008 }, { 373, 0x0040 }, { 374, 0x0000 }, { 374, 0x5000 }, + { 376, 0x0020 }, { 377, 0x1400 }, { 379, 0x0020 }, { 380, 0x4000 }, + /* 0x6a00 */ + { 381, 0x0800 }, { 382, 0x0002 }, { 383, 0x0000 }, { 383, 0x0000 }, + { 383, 0x0000 }, { 383, 0x0000 }, { 383, 0x0040 }, { 384, 0x0000 }, + { 384, 0x0000 }, { 384, 0x0040 }, { 385, 0x0000 }, { 385, 0x0030 }, + { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, + /* 0x6b00 */ + { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0100 }, + { 388, 0x0000 }, { 388, 0x0010 }, { 389, 0x0000 }, { 389, 0x0000 }, + { 389, 0x0000 }, { 389, 0x0020 }, { 390, 0x0008 }, { 391, 0x0000 }, + { 391, 0x0000 }, { 391, 0x0400 }, { 392, 0x0000 }, { 392, 0x0000 }, + /* 0x6c00 */ + { 392, 0x0000 }, { 392, 0x2000 }, { 393, 0x0020 }, { 394, 0xc000 }, + { 396, 0x0000 }, { 396, 0x0000 }, { 396, 0x2080 }, { 398, 0x0000 }, + { 398, 0x0090 }, { 400, 0x0540 }, { 403, 0x0100 }, { 404, 0x0020 }, + { 405, 0x0048 }, { 407, 0x1000 }, { 408, 0x0000 }, { 408, 0x0000 }, + /* 0x6d00 */ + { 408, 0x0000 }, { 408, 0x0002 }, { 409, 0x0300 }, { 411, 0x0510 }, + { 414, 0x0210 }, { 416, 0x0821 }, { 419, 0x0032 }, { 422, 0x0000 }, + { 422, 0x0000 }, { 422, 0x0000 }, { 422, 0x2004 }, { 424, 0x0010 }, + { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, + /* 0x6e00 */ + { 425, 0x0000 }, { 425, 0x0800 }, { 426, 0x0000 }, { 426, 0x0000 }, + { 426, 0x0000 }, { 426, 0x3000 }, { 428, 0x0080 }, { 429, 0x0004 }, + { 430, 0x4082 }, { 433, 0x0400 }, { 434, 0x0041 }, { 436, 0x0020 }, + { 437, 0x0208 }, { 439, 0x0100 }, { 440, 0x0c80 }, { 443, 0x0000 }, + /* 0x6f00 */ + { 443, 0x0000 }, { 443, 0x0000 }, { 443, 0x0040 }, { 444, 0x0080 }, + { 445, 0x0000 }, { 445, 0x8040 }, { 447, 0x0000 }, { 447, 0x0020 }, + { 448, 0x0004 }, { 449, 0x0810 }, { 451, 0x0020 }, { 452, 0x1010 }, + { 454, 0x0000 }, { 454, 0x0000 }, { 454, 0x1000 }, { 455, 0x0000 }, + /* 0x7000 */ + { 455, 0x3000 }, { 457, 0x0010 }, { 458, 0x0000 }, { 458, 0x1000 }, + { 459, 0x0000 }, { 459, 0x0000 }, { 459, 0x0000 }, { 459, 0x0400 }, + { 460, 0x0000 }, { 460, 0x4100 }, { 462, 0x0000 }, { 462, 0x0000 }, + { 462, 0x0000 }, { 462, 0x3000 }, { 464, 0x0000 }, { 464, 0x0402 }, + /* 0x7100 */ + { 466, 0x1000 }, { 467, 0x1000 }, { 468, 0x4001 }, { 470, 0x0000 }, + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, + { 470, 0x8c00 }, { 473, 0x0000 }, { 473, 0x0000 }, { 473, 0x8000 }, + /* 0x7200 */ + { 474, 0x0000 }, { 474, 0x8000 }, { 475, 0x0000 }, { 475, 0x0000 }, + { 475, 0x0006 }, { 477, 0x0400 }, { 478, 0x0008 }, { 479, 0x0080 }, + { 480, 0x0080 }, { 481, 0x0000 }, { 481, 0x0100 }, { 482, 0x0000 }, + { 482, 0x0200 }, { 483, 0x2000 }, { 484, 0x0004 }, { 485, 0x0000 }, + /* 0x7300 */ + { 485, 0x0040 }, { 486, 0x0010 }, { 487, 0x0000 }, { 487, 0x0400 }, + { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0000 }, + { 488, 0x0000 }, { 488, 0x0630 }, { 492, 0x0061 }, { 495, 0x0002 }, + { 496, 0x0000 }, { 496, 0x0040 }, { 497, 0x4408 }, { 500, 0x2441 }, + /* 0x7400 */ + { 504, 0x4080 }, { 506, 0x0020 }, { 507, 0x8810 }, { 510, 0x0084 }, + { 512, 0x0014 }, { 514, 0x0010 }, { 515, 0x0004 }, { 516, 0x0102 }, + { 518, 0x0140 }, { 520, 0x8100 }, { 522, 0x0401 }, { 524, 0x0004 }, + { 525, 0x0000 }, { 525, 0x0100 }, { 526, 0x0000 }, { 526, 0x0800 }, + /* 0x7500 */ + { 527, 0x0008 }, { 528, 0x0000 }, { 528, 0x0442 }, { 531, 0x0000 }, + { 531, 0x0000 }, { 531, 0x0002 }, { 532, 0x9010 }, { 535, 0x0000 }, + { 535, 0x0000 }, { 535, 0x0000 }, { 535, 0x0004 }, { 536, 0x0000 }, + { 536, 0x0000 }, { 536, 0x0000 }, { 536, 0x0001 }, { 537, 0x0008 }, + /* 0x7600 */ + { 538, 0x0110 }, { 540, 0x2000 }, { 541, 0x0000 }, { 541, 0x0000 }, + { 541, 0x0000 }, { 541, 0x0004 }, { 542, 0x0000 }, { 542, 0x8040 }, + { 544, 0x0000 }, { 544, 0x4000 }, { 545, 0x0000 }, { 545, 0x0000 }, + { 545, 0x0000 }, { 545, 0x2000 }, { 546, 0x1440 }, { 549, 0x0800 }, + /* 0x7700 */ + { 550, 0x0400 }, { 551, 0x0800 }, { 552, 0x1000 }, { 553, 0x0000 }, + { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0000 }, + { 553, 0x0840 }, { 555, 0x0000 }, { 555, 0x2800 }, { 557, 0x0000 }, + { 557, 0x0000 }, { 557, 0x4000 }, { 558, 0x0000 }, { 558, 0x1800 }, + /* 0x7800 */ + { 560, 0x0040 }, { 561, 0x0000 }, { 561, 0x0005 }, { 563, 0x0000 }, + { 563, 0x0002 }, { 564, 0x0600 }, { 566, 0x0000 }, { 566, 0x0020 }, + { 567, 0x0000 }, { 567, 0x0010 }, { 568, 0x0000 }, { 568, 0x0040 }, + { 569, 0x0000 }, { 569, 0x1000 }, { 570, 0x0002 }, { 571, 0x0000 }, + /* 0x7900 */ + { 571, 0x0008 }, { 572, 0x0000 }, { 572, 0x0000 }, { 572, 0x2008 }, + { 574, 0x4488 }, { 578, 0x0001 }, { 579, 0x0000 }, { 579, 0x1004 }, + { 581, 0x0000 }, { 581, 0x0100 }, { 582, 0x0011 }, { 584, 0x0100 }, + { 585, 0x0000 }, { 585, 0x0000 }, { 585, 0x0000 }, { 585, 0x4000 }, + /* 0x7a00 */ + { 586, 0x0000 }, { 586, 0x0040 }, { 587, 0x0000 }, { 587, 0x0000 }, + { 587, 0x0010 }, { 588, 0x4000 }, { 589, 0x0000 }, { 589, 0x0000 }, + { 589, 0x4020 }, { 591, 0x0000 }, { 591, 0x0008 }, { 592, 0x4100 }, + { 594, 0x0000 }, { 594, 0x1002 }, { 596, 0x0000 }, { 596, 0x0000 }, + /* 0x7b00 */ + { 596, 0x0000 }, { 596, 0x0000 }, { 596, 0x0000 }, { 596, 0x0000 }, + { 596, 0x4400 }, { 598, 0x1000 }, { 599, 0x0000 }, { 599, 0x8000 }, + { 600, 0x0080 }, { 601, 0x0008 }, { 602, 0x0000 }, { 602, 0x0000 }, + { 602, 0x0000 }, { 602, 0x0000 }, { 602, 0x8000 }, { 603, 0x0005 }, + /* 0x7c00 */ + { 605, 0x0208 }, { 607, 0x0020 }, { 608, 0x0001 }, { 609, 0x0001 }, + { 610, 0x0000 }, { 610, 0x2001 }, { 612, 0x0000 }, { 612, 0x0000 }, + { 612, 0x0000 }, { 612, 0x0000 }, { 612, 0x1040 }, { 614, 0x0000 }, + { 614, 0x0000 }, { 614, 0x0000 }, { 614, 0x0000 }, { 614, 0x0020 }, +}; +static const Summary16 isoir165ext_uni2indx_page7e[333] = { + /* 0x7e00 */ + { 615, 0x0000 }, { 615, 0x0000 }, { 615, 0x0000 }, { 615, 0x0000 }, + { 615, 0x0010 }, { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x0000 }, + { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x4000 }, { 617, 0x1810 }, + { 620, 0x0000 }, { 620, 0x0040 }, { 621, 0x1010 }, { 623, 0x0200 }, + /* 0x7f00 */ + { 624, 0x0400 }, { 625, 0x4001 }, { 627, 0x0000 }, { 627, 0x0000 }, + { 627, 0x2000 }, { 628, 0x0000 }, { 628, 0x0000 }, { 628, 0x2000 }, + { 629, 0x0000 }, { 629, 0x0002 }, { 630, 0x0000 }, { 630, 0x0000 }, + { 630, 0x0001 }, { 631, 0x0600 }, { 633, 0x8000 }, { 634, 0x0000 }, + /* 0x8000 */ + { 634, 0x0000 }, { 634, 0x0000 }, { 634, 0x0000 }, { 634, 0x0001 }, + { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, + { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, + { 635, 0x0000 }, { 635, 0x0010 }, { 636, 0x0000 }, { 636, 0x4000 }, + /* 0x8100 */ + { 637, 0x0000 }, { 637, 0x0000 }, { 637, 0x0200 }, { 638, 0x8000 }, + { 639, 0x0000 }, { 639, 0x0104 }, { 641, 0x0000 }, { 641, 0x0000 }, + { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, + { 641, 0x0000 }, { 641, 0x0002 }, { 642, 0x0000 }, { 642, 0x0000 }, + /* 0x8200 */ + { 642, 0x0000 }, { 642, 0x0140 }, { 644, 0x0000 }, { 644, 0x0400 }, + { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0100 }, + { 646, 0x0008 }, { 647, 0x0000 }, { 647, 0x0080 }, { 648, 0x1000 }, + { 649, 0x0000 }, { 649, 0x0000 }, { 649, 0x0000 }, { 649, 0x4000 }, + /* 0x8300 */ + { 650, 0x0001 }, { 651, 0x2008 }, { 653, 0x0000 }, { 653, 0x0000 }, + { 653, 0x0030 }, { 655, 0x2000 }, { 656, 0x0000 }, { 656, 0x0000 }, + { 656, 0x0000 }, { 656, 0x0200 }, { 657, 0x0040 }, { 658, 0x0000 }, + { 658, 0x0000 }, { 658, 0x0002 }, { 659, 0x0000 }, { 659, 0x5000 }, + /* 0x8400 */ + { 661, 0x0000 }, { 661, 0x0400 }, { 662, 0x0200 }, { 663, 0x0200 }, + { 664, 0x0000 }, { 664, 0x0008 }, { 665, 0x0001 }, { 666, 0x0000 }, + { 666, 0x0000 }, { 666, 0xc000 }, { 668, 0x0100 }, { 669, 0x0000 }, + { 669, 0x8044 }, { 672, 0x0000 }, { 672, 0x0400 }, { 673, 0x0080 }, + /* 0x8500 */ + { 674, 0x0000 }, { 674, 0x0000 }, { 674, 0x0000 }, { 674, 0x0010 }, + { 675, 0x0000 }, { 675, 0x0000 }, { 675, 0x0000 }, { 675, 0x0001 }, + { 676, 0x0000 }, { 676, 0x0000 }, { 676, 0x0004 }, { 677, 0x0108 }, + { 679, 0x0000 }, { 679, 0x0000 }, { 679, 0x0001 }, { 680, 0x0000 }, + /* 0x8600 */ + { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0000 }, + { 680, 0x0000 }, { 680, 0x0004 }, { 681, 0x0000 }, { 681, 0x0000 }, + { 681, 0x0008 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, + { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, + /* 0x8700 */ + { 682, 0x4020 }, { 684, 0x0000 }, { 684, 0x0000 }, { 684, 0x0000 }, + { 684, 0x0000 }, { 684, 0x0100 }, { 685, 0x0000 }, { 685, 0x0000 }, + { 685, 0x0001 }, { 686, 0x0000 }, { 686, 0x0008 }, { 687, 0x0000 }, + { 687, 0x8000 }, { 688, 0x0000 }, { 688, 0x0004 }, { 689, 0x0000 }, + /* 0x8800 */ + { 689, 0x0800 }, { 690, 0x0000 }, { 690, 0x2000 }, { 691, 0x0000 }, + { 691, 0x0000 }, { 691, 0x0004 }, { 692, 0x0000 }, { 692, 0x0000 }, + { 692, 0x0040 }, { 693, 0x0080 }, { 694, 0x8400 }, { 696, 0x0000 }, + { 696, 0x0101 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, + /* 0x8900 */ + { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0040 }, { 699, 0x0000 }, + { 699, 0x0000 }, { 699, 0x0020 }, { 700, 0x0000 }, { 700, 0x0040 }, + { 701, 0x0001 }, { 702, 0x0000 }, { 702, 0x0000 }, { 702, 0x0000 }, + { 702, 0x2008 }, { 704, 0x0010 }, { 705, 0x0000 }, { 705, 0x0002 }, + /* 0x8a00 */ + { 706, 0x0000 }, { 706, 0x0400 }, { 707, 0x0000 }, { 707, 0x0000 }, + { 707, 0x0000 }, { 707, 0x8000 }, { 708, 0x0000 }, { 708, 0x0000 }, + { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, + { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, + /* 0x8b00 */ + { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, + { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, + { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x1000 }, { 709, 0x0802 }, + { 711, 0x0080 }, { 712, 0x0000 }, { 712, 0x0400 }, { 713, 0x0000 }, + /* 0x8c00 */ + { 713, 0x0200 }, { 714, 0x4000 }, { 715, 0x0000 }, { 715, 0x0000 }, + { 715, 0x0000 }, { 715, 0x0000 }, { 715, 0x6100 }, { 718, 0x0000 }, + { 718, 0x0040 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, + { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, + /* 0x8d00 */ + { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0001 }, { 720, 0x0000 }, + { 720, 0x0000 }, { 720, 0x8086 }, { 724, 0x0400 }, { 725, 0x0000 }, + { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, + { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, + /* 0x8e00 */ + { 725, 0x0000 }, { 725, 0x0040 }, { 726, 0x00c2 }, { 729, 0x0040 }, + { 730, 0x0020 }, { 731, 0x1009 }, { 734, 0x0004 }, { 735, 0x0000 }, + { 735, 0x0000 }, { 735, 0x0000 }, { 735, 0x2000 }, { 736, 0x0000 }, + { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, + /* 0x8f00 */ + { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, + { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, + { 736, 0x0001 }, { 737, 0x0004 }, { 738, 0x0000 }, { 738, 0x0020 }, + { 739, 0x0000 }, { 739, 0x0000 }, { 739, 0x0000 }, { 739, 0x0400 }, + /* 0x9000 */ + { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, + { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, + { 740, 0x0000 }, { 740, 0x0100 }, { 741, 0x0101 }, { 743, 0x2000 }, + { 744, 0x0108 }, { 746, 0x0400 }, { 747, 0x0010 }, { 748, 0x8000 }, + /* 0x9100 */ + { 749, 0x1000 }, { 750, 0x1500 }, { 753, 0x0001 }, { 754, 0x0000 }, + { 754, 0x0004 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, + { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, + { 755, 0x0040 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, + /* 0x9200 */ + { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, + { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, + { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, + { 756, 0x0040 }, +}; +static const Summary16 isoir165ext_uni2indx_page94[143] = { + /* 0x9400 */ + { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, + { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, + { 757, 0x0000 }, { 757, 0x0142 }, { 760, 0x0000 }, { 760, 0x0000 }, + { 760, 0x8080 }, { 762, 0x0418 }, { 765, 0x0040 }, { 766, 0x0800 }, + /* 0x9500 */ + { 767, 0x0000 }, { 767, 0x1000 }, { 768, 0x0081 }, { 770, 0x2008 }, + { 772, 0x0008 }, { 773, 0x0400 }, { 774, 0x4001 }, { 776, 0x0030 }, + { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, + { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x1000 }, { 779, 0x8000 }, + /* 0x9600 */ + { 780, 0x0080 }, { 781, 0x0908 }, { 784, 0x0000 }, { 784, 0x0000 }, + { 784, 0x0000 }, { 784, 0x4000 }, { 785, 0x0000 }, { 785, 0x0000 }, + { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, + { 785, 0x0000 }, { 785, 0x0100 }, { 786, 0x0000 }, { 786, 0x0000 }, + /* 0x9700 */ + { 786, 0x0004 }, { 787, 0x0000 }, { 787, 0x0000 }, { 787, 0x0000 }, + { 787, 0x0000 }, { 787, 0x0010 }, { 788, 0x0000 }, { 788, 0x0501 }, + { 791, 0x0000 }, { 791, 0x0000 }, { 791, 0x4102 }, { 794, 0x0000 }, + { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x0100 }, { 795, 0x0000 }, + /* 0x9800 */ + { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, + { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, + { 795, 0x4800 }, { 797, 0x0224 }, { 800, 0x0008 }, { 801, 0x0000 }, + { 801, 0x8000 }, { 802, 0x00d1 }, { 806, 0x0000 }, { 806, 0x0000 }, + /* 0x9900 */ + { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, + { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0050 }, { 808, 0x4b00 }, + { 812, 0x500c }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, + { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, + /* 0x9a00 */ + { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, + { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0004 }, + { 817, 0x6208 }, { 821, 0x0230 }, { 824, 0x0040 }, { 825, 0x0000 }, + { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, + /* 0x9b00 */ + { 825, 0x0000 }, { 825, 0x0101 }, { 827, 0x0020 }, { 828, 0x0040 }, + { 829, 0x0040 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, + { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, + { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, + /* 0x9c00 */ + { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, + { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, + { 830, 0x0411 }, { 833, 0x23c8 }, { 839, 0x0000 }, { 839, 0x8000 }, + { 840, 0x0003 }, { 842, 0x0804 }, { 844, 0x0009 }, +}; +static const Summary16 isoir165ext_uni2indx_page9e[25] = { + /* 0x9e00 */ + { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x4090 }, { 849, 0x0011 }, + { 851, 0x2001 }, { 853, 0x225d }, { 860, 0x8027 }, { 865, 0x0010 }, + { 866, 0x0001 }, { 867, 0x0002 }, { 868, 0x0000 }, { 868, 0x0000 }, + { 868, 0x0000 }, { 868, 0x0000 }, { 868, 0x0002 }, { 869, 0x0000 }, + /* 0x9f00 */ + { 869, 0x1000 }, { 870, 0x0004 }, { 871, 0x0800 }, { 872, 0x0000 }, + { 872, 0x0002 }, { 873, 0x0000 }, { 873, 0x0000 }, { 873, 0x0000 }, + { 873, 0x0006 }, +}; +static const Summary16 isoir165ext_uni2indx_pageff[5] = { + /* 0xff00 */ + { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, + { 875, 0x0080 }, +}; + +static int +isoir165ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0200) + summary = &isoir165ext_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x0300 && wc < 0x03c0) + summary = &isoir165ext_uni2indx_page03[(wc>>4)-0x030]; + else if (wc >= 0x1e00 && wc < 0x1fc0) + summary = &isoir165ext_uni2indx_page1e[(wc>>4)-0x1e0]; + else if (wc >= 0x3000 && wc < 0x3040) + summary = &isoir165ext_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x3200 && wc < 0x3400) + summary = &isoir165ext_uni2indx_page32[(wc>>4)-0x320]; + else if (wc >= 0x4e00 && wc < 0x7d00) + summary = &isoir165ext_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0x7e00 && wc < 0x92d0) + summary = &isoir165ext_uni2indx_page7e[(wc>>4)-0x7e0]; + else if (wc >= 0x9400 && wc < 0x9cf0) + summary = &isoir165ext_uni2indx_page94[(wc>>4)-0x940]; + else if (wc >= 0x9e00 && wc < 0x9f90) + summary = &isoir165ext_uni2indx_page9e[(wc>>4)-0x9e0]; + else if (wc >= 0xff00 && wc < 0xff50) + summary = &isoir165ext_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = isoir165ext_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/java.h b/Externals/libiconv-1.14/lib/java.h new file mode 100644 index 0000000000..4d4485f54f --- /dev/null +++ b/Externals/libiconv-1.14/lib/java.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JAVA + * This is ISO 8859-1 with \uXXXX escape sequences, denoting Unicode BMP + * characters. Consecutive pairs of \uXXXX escape sequences in the surrogate + * range, as in UTF-16, denote Unicode characters outside the BMP. + */ + +static int +java_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c; + ucs4_t wc, wc2; + int i; + + c = s[0]; + if (c != '\\') { + *pwc = c; + return 1; + } + if (n < 2) + return RET_TOOFEW(0); + if (s[1] != 'u') + goto simply_backslash; + wc = 0; + for (i = 2; i < 6; i++) { + if (n <= i) + return RET_TOOFEW(0); + c = s[i]; + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A'-10; + else if (c >= 'a' && c <= 'z') + c -= 'a'-10; + else + goto simply_backslash; + wc |= (ucs4_t) c << (4 * (5-i)); + } + if (!(wc >= 0xd800 && wc < 0xe000)) { + *pwc = wc; + return 6; + } + if (wc >= 0xdc00) + goto simply_backslash; + if (n < 7) + return RET_TOOFEW(0); + if (s[6] != '\\') + goto simply_backslash; + if (n < 8) + return RET_TOOFEW(0); + if (s[7] != 'u') + goto simply_backslash; + wc2 = 0; + for (i = 8; i < 12; i++) { + if (n <= i) + return RET_TOOFEW(0); + c = s[i]; + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A'-10; + else if (c >= 'a' && c <= 'z') + c -= 'a'-10; + else + goto simply_backslash; + wc2 |= (ucs4_t) c << (4 * (11-i)); + } + if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) + goto simply_backslash; + *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); + return 12; +simply_backslash: + *pwc = '\\'; + return 1; +} + +static int +java_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x80) { + *r = wc; + return 1; + } else if (wc < 0x10000) { + if (n >= 6) { + unsigned int i; + r[0] = '\\'; + r[1] = 'u'; + i = (wc >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc >> 8) & 0x0f; r[3] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc >> 4) & 0x0f; r[4] = (i < 10 ? '0'+i : 'a'-10+i); + i = wc & 0x0f; r[5] = (i < 10 ? '0'+i : 'a'-10+i); + return 6; + } else + return RET_TOOSMALL; + } else if (wc < 0x110000) { + if (n >= 12) { + ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); + ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); + unsigned int i; + r[0] = '\\'; + r[1] = 'u'; + i = (wc1 >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc1 >> 8) & 0x0f; r[3] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc1 >> 4) & 0x0f; r[4] = (i < 10 ? '0'+i : 'a'-10+i); + i = wc1 & 0x0f; r[5] = (i < 10 ? '0'+i : 'a'-10+i); + r[6] = '\\'; + r[7] = 'u'; + i = (wc2 >> 12) & 0x0f; r[8] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc2 >> 8) & 0x0f; r[9] = (i < 10 ? '0'+i : 'a'-10+i); + i = (wc2 >> 4) & 0x0f; r[10] = (i < 10 ? '0'+i : 'a'-10+i); + i = wc2 & 0x0f; r[11] = (i < 10 ? '0'+i : 'a'-10+i); + return 12; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/jisx0201.h b/Externals/libiconv-1.14/lib/jisx0201.h new file mode 100644 index 0000000000..d58c1d5956 --- /dev/null +++ b/Externals/libiconv-1.14/lib/jisx0201.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JISX0201.1976-0 + */ + +static int +jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + if (c == 0x5c) + *pwc = (ucs4_t) 0x00a5; + else if (c == 0x7e) + *pwc = (ucs4_t) 0x203e; + else + *pwc = (ucs4_t) c; + return 1; + } else { + if (c >= 0xa1 && c < 0xe0) { + *pwc = (ucs4_t) c + 0xfec0; + return 1; + } + } + return RET_ILSEQ; +} + +static int +jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { + *r = wc; + return 1; + } + if (wc == 0x00a5) { + *r = 0x5c; + return 1; + } + if (wc == 0x203e) { + *r = 0x7e; + return 1; + } + if (wc >= 0xff61 && wc < 0xffa0) { + *r = wc - 0xfec0; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/jisx0208.h b/Externals/libiconv-1.14/lib/jisx0208.h new file mode 100644 index 0000000000..755b8ba6a5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/jisx0208.h @@ -0,0 +1,2415 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JISX0208.1990-0 + */ + +static const unsigned short jisx0208_2uni_page21[690] = { + /* 0x21 */ + 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, + 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, + 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, + 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c, + 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c, + 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, + 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, + 0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7, + 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, + 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, + 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, + 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, + /* 0x22 */ + 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, + 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, + 0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, + 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, + 0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, + 0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef, + /* 0x23 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10, + 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, + 0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, + 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, + 0xff39, 0xff3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, + 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, + 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, + 0xff59, 0xff5a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x24 */ + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, + 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, + 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, + 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, + 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, + 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, + 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x25 */ + 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, + 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, + 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, + 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, + 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, + 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, + 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, + 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, + 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, + 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, + 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x26 */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x27 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, + 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, + 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, + 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, + 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x28 */ + 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, + 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, + 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, + 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, +}; +static const unsigned short jisx0208_2uni_page30[6398] = { + /* 0x30 */ + 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, + 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, + 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, + 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, + 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, + 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, + 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, + 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, + 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, + 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, + 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, + 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, + /* 0x31 */ + 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, + 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, + 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, + 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, + 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, + 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, + 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, + 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, + 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, + 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, + 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, + 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, + /* 0x32 */ + 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, + 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, + 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, + 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, + 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, + 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, + 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, + 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, + 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, + 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, + 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, + 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, + /* 0x33 */ + 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, + 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, + 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, + 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, + 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, + 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, + 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, + 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, + 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, + 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, + 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, + 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, + /* 0x34 */ + 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, + 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, + 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, + 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, + 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, + 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, + 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, + 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, + 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, + 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, + 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, + 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, + /* 0x35 */ + 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, + 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, + 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, + 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, + 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, + 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, + 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, + 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, + 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, + 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, + 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, + 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, + /* 0x36 */ + 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, + 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, + 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, + 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, + 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, + 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, + 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, + 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, + 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, + 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, + 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, + 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, + /* 0x37 */ + 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, + 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, + 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, + 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, + 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, + 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, + 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, + 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, + 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, + 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, + 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, + 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, + /* 0x38 */ + 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, + 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, + 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, + 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, + 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, + 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, + 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, + 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, + 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, + 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, + 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, + 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, + /* 0x39 */ + 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, + 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, + 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, + 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, + 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, + 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, + 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, + 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, + 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, + 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, + 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, + 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, + /* 0x3a */ + 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, + 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, + 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, + 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, + 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, + 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, + 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, + 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, + 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, + 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, + 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, + 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, + /* 0x3b */ + 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, + 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, + 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, + 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, + 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, + 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, + 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, + 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, + 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, + 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, + 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, + 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, + /* 0x3c */ + 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, + 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, + 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, + 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, + 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, + 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, + 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, + 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, + 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, + 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, + 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, + 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, + /* 0x3d */ + 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, + 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, + 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, + 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, + 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, + 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, + 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, + 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, + 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, + 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, + 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, + 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, + /* 0x3e */ + 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, + 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, + 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, + 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, + 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, + 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, + 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, + 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, + 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, + 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, + 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, + 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, + /* 0x3f */ + 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, + 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, + 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, + 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, + 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, + 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, + 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, + 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, + 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, + 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, + 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, + 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, + /* 0x40 */ + 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, + 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, + 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, + 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, + 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, + 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, + 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, + 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, + 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, + 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, + 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, + 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, + /* 0x41 */ + 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, + 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, + 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, + 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, + 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, + 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, + 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, + 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, + 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, + 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, + 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, + 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, + /* 0x42 */ + 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, + 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, + 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, + 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, + 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, + 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, + 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, + 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, + 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, + 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, + 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, + 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, + /* 0x43 */ + 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, + 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, + 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, + 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, + 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, + 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, + 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, + 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, + 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, + 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, + 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, + 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, + /* 0x44 */ + 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, + 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, + 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, + 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, + 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, + 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, + 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, + 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, + 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, + 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, + 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, + 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, + /* 0x45 */ + 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, + 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, + 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, + 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, + 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, + 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, + 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, + 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, + 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, + 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, + 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, + 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, + /* 0x46 */ + 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, + 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, + 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, + 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, + 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, + 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, + 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, + 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, + 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, + 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, + 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, + 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, + /* 0x47 */ + 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, + 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, + 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, + 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, + 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, + 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, + 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, + 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, + 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, + 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, + 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, + 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, + /* 0x48 */ + 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, + 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, + 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, + 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, + 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, + 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, + 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, + 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, + 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, + 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, + 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, + 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, + /* 0x49 */ + 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, + 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, + 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, + 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, + 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, + 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, + 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, + 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, + 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, + 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, + 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, + 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, + /* 0x4a */ + 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, + 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, + 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, + 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, + 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, + 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, + 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, + 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, + 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, + 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, + 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, + 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, + /* 0x4b */ + 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, + 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, + 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, + 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, + 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, + 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, + 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, + 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, + 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, + 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, + 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, + 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, + /* 0x4c */ + 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, + 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, + 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, + 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, + 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, + 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, + 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, + 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, + 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, + 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, + 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, + 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, + /* 0x4d */ + 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, + 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, + 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, + 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, + 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, + 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, + 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, + 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, + 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, + 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, + 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, + 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, + /* 0x4e */ + 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, + 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, + 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, + 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, + 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, + 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, + 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, + 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, + 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, + 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, + 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, + 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, + /* 0x4f */ + 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, + 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, + 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, + 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, + 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, + 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, + 0x6e7e, 0x7897, 0x8155, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x50 */ + 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, + 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, + 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, + 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, + 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, + 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, + 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, + 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, + 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, + 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, + 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, + 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, + /* 0x51 */ + 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, + 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, + 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, + 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, + 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, + 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, + 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, + 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, + 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, + 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, + 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, + 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, + /* 0x52 */ + 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, + 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, + 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, + 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, + 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, + 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, + 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, + 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, + 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, + 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, + 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, + 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, + /* 0x53 */ + 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, + 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, + 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, + 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, + 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, + 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, + 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, + 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, + 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, + 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, + 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, + 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, + /* 0x54 */ + 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, + 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, + 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, + 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, + 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, + 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, + 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, + 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, + 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, + 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, + 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, + 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, + /* 0x55 */ + 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, + 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, + 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, + 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, + 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, + 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, + 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, + 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, + 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, + 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, + 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, + 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, + /* 0x56 */ + 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, + 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, + 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, + 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, + 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, + 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, + 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, + 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, + 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, + 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, + 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, + 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, + /* 0x57 */ + 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, + 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, + 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, + 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, + 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, + 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, + 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, + 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, + 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, + 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, + 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, + 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, + /* 0x58 */ + 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, + 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, + 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, + 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, + 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, + 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, + 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, + 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, + 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, + 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, + 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, + 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, + /* 0x59 */ + 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, + 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, + 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, + 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, + 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, + 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, + 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, + 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, + 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, + 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, + 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, + 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, + /* 0x5a */ + 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, + 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, + 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, + 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, + 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, + 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, + 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, + 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, + 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, + 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, + 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, + 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, + /* 0x5b */ + 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, + 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, + 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, + 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, + 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, + 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, + 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, + 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, + 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, + 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, + 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, + 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, + /* 0x5c */ + 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, + 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, + 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, + 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, + 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, + 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, + 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, + 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, + 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, + 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, + 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, + 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, + /* 0x5d */ + 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, + 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, + 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, + 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, + 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, + 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, + 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, + 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, + 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, + 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, + 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, + 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, + /* 0x5e */ + 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, + 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, + 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, + 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, + 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, + 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, + 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, + 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, + 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, + 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, + 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, + 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, + /* 0x5f */ + 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, + 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, + 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, + 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, + 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, + 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, + 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, + 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, + 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, + 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, + 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, + 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, + /* 0x60 */ + 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, + 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, + 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, + 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, + 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, + 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, + 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, + 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, + 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, + 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, + 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, + 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, + /* 0x61 */ + 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, + 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, + 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, + 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, + 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, + 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, + 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, + 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, + 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, + 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, + 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, + 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, + /* 0x62 */ + 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, + 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, + 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, + 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, + 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, + 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, + 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, + 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, + 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, + 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, + 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, + 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, + /* 0x63 */ + 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, + 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, + 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, + 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, + 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, + 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, + 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, + 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, + 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, + 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, + 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, + 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, + /* 0x64 */ + 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, + 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, + 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, + 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, + 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, + 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, + 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, + 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, + 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, + 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, + 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, + 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, + /* 0x65 */ + 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, + 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, + 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, + 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, + 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, + 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, + 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, + 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, + 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, + 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, + 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, + 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, + /* 0x66 */ + 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, + 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, + 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, + 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, + 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, + 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, + 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, + 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, + 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, + 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, + 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, + 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, + /* 0x67 */ + 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, + 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, + 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, + 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, + 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, + 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, + 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, + 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, + 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, + 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, + 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, + 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, + /* 0x68 */ + 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, + 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, + 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, + 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, + 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, + 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, + 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, + 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, + 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, + 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, + 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, + 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, + /* 0x69 */ + 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, + 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, + 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, + 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, + 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, + 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, + 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, + 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, + 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, + 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, + 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, + 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, + /* 0x6a */ + 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, + 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, + 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, + 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, + 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, + 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, + 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, + 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, + 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, + 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, + 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, + 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, + /* 0x6b */ + 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, + 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, + 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, + 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, + 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, + 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, + 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, + 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, + 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, + 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, + 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, + 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, + /* 0x6c */ + 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, + 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, + 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, + 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, + 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, + 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, + 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, + 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, + 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, + 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, + 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, + 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, + /* 0x6d */ + 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, + 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, + 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, + 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, + 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, + 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, + 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, + 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, + 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, + 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, + 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, + 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, + /* 0x6e */ + 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, + 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, + 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, + 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, + 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, + 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, + 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, + 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, + 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, + 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, + 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, + 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, + /* 0x6f */ + 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, + 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, + 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, + 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, + 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, + 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, + 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, + 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, + 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, + 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, + 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, + 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, + /* 0x70 */ + 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, + 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, + 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, + 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, + 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, + 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, + 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, + 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, + 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, + 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, + 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, + 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, + /* 0x71 */ + 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, + 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, + 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, + 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, + 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, + 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, + 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, + 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, + 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, + 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, + 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, + 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, + /* 0x72 */ + 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, + 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, + 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, + 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, + 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, + 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, + 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, + 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, + 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, + 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, + 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, + 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, + /* 0x73 */ + 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, + 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, + 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, + 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, + 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, + 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, + 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, + 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, + 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, + 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, + 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, + 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, + /* 0x74 */ + 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, +}; + +static int +jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 1410) { + if (i < 690) + wc = jisx0208_2uni_page21[i]; + } else { + if (i < 7808) + wc = jisx0208_2uni_page30[i-1410]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short jisx0208_2charset[6879] = { + 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e, 0x212d, + 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, + 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, + 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, + 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, + 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, + 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, + 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, + 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, + 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, + 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, + 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, + 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, + 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, + 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, + 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x213e, 0x213d, 0x2142, + 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145, 0x2144, + 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b, 0x222c, + 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250, 0x2260, + 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c, 0x224a, + 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268, 0x2266, + 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264, 0x223e, + 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c, 0x2822, + 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, + 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, + 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, + 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222, 0x2225, + 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d, 0x217c, + 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275, 0x2274, + 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, + 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, + 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 0x2421, 0x2422, + 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, + 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, + 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, + 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, + 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, + 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, + 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, + 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, + 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, + 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, + 0x2473, 0x212b, 0x212c, 0x2135, 0x2136, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, + 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, + 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, + 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, + 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, + 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, + 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, + 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, + 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, + 0x2574, 0x2575, 0x2576, 0x2126, 0x213c, 0x2133, 0x2134, 0x306c, + 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, + 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, + 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025, 0x367a, + 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029, 0x4735, + 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a, 0x3e68, + 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70, 0x467d, + 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, + 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, + 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, + 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, + 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e, 0x503c, + 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0x3b46, + 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040, 0x5042, + 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367, 0x376f, + 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c, 0x497a, + 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, + 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322, 0x504a, + 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f, 0x5049, + 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050, 0x5053, + 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48, 0x3426, + 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055, 0x504e, + 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, + 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53, 0x5059, + 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, + 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d, 0x4750, + 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f, 0x4152, + 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876, 0x3875, + 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x5062, + 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770, 0x5070, + 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077, 0x5076, + 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, + 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877, 0x507b, + 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0x3739, + 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623, 0x4b4d, + 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128, 0x512a, + 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f, 0x512d, + 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e, 0x5134, + 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, 0x513a, + 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, + 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x455e, + 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, + 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x3773, + 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146, 0x3a46, + 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, + 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, + 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, + 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a, 0x515a, + 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x515c, + 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160, 0x332e, + 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, 0x4561, + 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, + 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, + 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, + 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e, 0x516f, + 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775, 0x3a5e, + 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, + 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c, 0x4e2d, + 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243, 0x4e74, + 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b, 0x5225, + 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26, 0x4a59, + 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21, 0x5229, + 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x372e, + 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e, 0x4c68, + 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236, 0x5238, + 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629, 0x523a, + 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668, 0x3065, + 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, + 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, + 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247, 0x5248, + 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, + 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c, 0x3836, + 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, + 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, + 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75, 0x3d76, + 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, + 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, + 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d, 0x525e, + 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, + 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663, 0x4b4a, + 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, + 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24, 0x4a72, + 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e, 0x3c76, + 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, + 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b, 0x5269, + 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321, 0x527b, + 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324, 0x3025, + 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, + 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c, 0x452f, + 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562, 0x532a, + 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330, 0x4243, + 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c, 0x5337, + 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342, 0x533d, + 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343, 0x533c, + 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, + 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e, 0x534c, + 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350, 0x5353, + 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354, 0x3e28, + 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c, 0x535d, + 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361, 0x346f, + 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366, 0x5365, + 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b, 0x536c, + 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372, 0x5374, + 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, + 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a, 0x3847, + 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x5422, + 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428, 0x455a, + 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b, 0x542d, + 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41, 0x3923, + 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62, 0x5432, + 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439, 0x543a, + 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b, 0x543f, + 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443, 0x3e7d, + 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778, 0x424f, + 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469, 0x342e, + 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e, 0x4a3d, + 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, + 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b, 0x5447, + 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d, 0x4446, + 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451, 0x5454, + 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d, 0x545b, + 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455, 0x5462, + 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, + 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x5469, + 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249, 0x3d48, + 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537, 0x4240, + 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, + 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, + 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b, 0x547a, + 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33, 0x3d77, + 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, + 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526, 0x4245, + 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528, 0x3b50, + 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, + 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079, 0x3b51, + 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531, 0x552f, + 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b, 0x5534, + 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a, 0x5535, + 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d, 0x3247, + 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0x4364, + 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549, 0x5548, + 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e, 0x554f, + 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554, 0x3b7a, + 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, + 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a, 0x555b, + 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69, 0x3042, + 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431, 0x4368, + 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, + 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, + 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, + 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566, 0x3432, + 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, + 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570, 0x437e, + 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c, 0x3c4d, + 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, + 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576, 0x5577, + 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, + 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f, 0x557c, + 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, + 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a, 0x5624, + 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474, 0x562a, + 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252, 0x3359, + 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632, 0x5634, + 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, + 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c, 0x3a6a, + 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, + 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a, 0x4d72, + 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e, 0x5651, + 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652, 0x5654, + 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460, 0x565b, + 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64, 0x4163, + 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a, 0x5661, + 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, 0x3b54, + 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665, 0x5664, + 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522, 0x4422, + 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a, 0x497d, + 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670, 0x4828, + 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, + 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, + 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, + 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b, 0x446d, + 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751, 0x567c, + 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724, 0x5725, + 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, + 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, + 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731, 0x4f2e, + 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675, 0x5736, + 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0x446f, + 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x4425, + 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630, 0x573d, + 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734, 0x5733, + 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, + 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a, 0x317d, + 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x574b, + 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, + 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b, 0x5754, + 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34, 0x492c, + 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, + 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759, 0x5757, + 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766, 0x495d, + 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e, 0x5768, + 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x576a, + 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772, 0x3632, + 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, + 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, + 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821, 0x3c3d, + 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824, 0x577e, + 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a, 0x302d, + 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, + 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b, 0x404b, + 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246, 0x583d, + 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c, 0x5837, + 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, + 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842, 0x5847, + 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b, 0x5840, + 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, + 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437, 0x5854, + 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, + 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c, 0x5860, + 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f, 0x4a30, + 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231, 0x586b, + 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, + 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873, 0x5871, + 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, 0x5878, + 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, + 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, + 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, + 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070, 0x6e3d, + 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271, 0x592c, + 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e, 0x4863, + 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36, 0x5931, + 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, + 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a, 0x4471, + 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e, 0x5945, + 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, + 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, + 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, + 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d, 0x594c, + 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634, 0x594b, + 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e, 0x422a, + 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c, 0x4a7b, + 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, + 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, + 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, + 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, + 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237, 0x5969, + 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48, 0x3439, + 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49, 0x596c, + 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e, 0x5972, + 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d, 0x5977, + 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022, 0x3762, + 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531, 0x597b, + 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, + 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22, 0x593f, + 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24, 0x5a29, + 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34, 0x5a36, + 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b, 0x5a3a, + 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, + 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43, 0x5a46, + 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, + 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a, 0x4030, + 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d, 0x4046, + 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, + 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, + 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55, 0x5a53, + 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58, 0x347a, + 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, + 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61, 0x3937, + 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, + 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72, 0x3e3c, + 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a, 0x3b7e, + 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c, 0x5a6b, + 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x4961, + 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73, 0x5a77, + 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045, 0x5a78, + 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22, 0x5a7b, + 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23, 0x3d6c, + 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29, 0x364a, + 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258, 0x413e, + 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e, 0x497e, + 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b, 0x5b2e, + 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, + 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, + 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60, 0x423c, + 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a, 0x3e72, + 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755, 0x5b3f, + 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e, 0x4844, + 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d, 0x4e53, + 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, + 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x4248, + 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x4077, + 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, + 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46, 0x3a74, + 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072, 0x4034, + 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x5b5e, + 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765, 0x374b, + 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x343c, + 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0x5b6f, + 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f, 0x5b74, + 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66, 0x5b71, + 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323, 0x3a2d, + 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e, 0x5c32, + 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23, 0x5c27, + 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22, 0x3f39, + 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26, 0x3058, + 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, + 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, + 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d, 0x4458, + 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35, 0x5c42, + 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648, 0x5c3a, + 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0x4f30, + 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0x4f31, + 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63, 0x5c45, + 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422, 0x5c4e, + 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d, 0x4b6a, + 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60, 0x5c5f, + 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, + 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64, 0x3e40, + 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0x3e41, + 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72, 0x5c76, + 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75, 0x5c6f, + 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79, 0x5d21, + 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d, 0x5d27, + 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26, 0x5d2d, + 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f, 0x4d73, + 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767, 0x3c21, + 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, + 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f, 0x343f, + 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035, 0x3a21, + 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45, 0x5d46, + 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, + 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f, 0x5d50, + 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, + 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58, 0x5d59, + 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53, 0x5d5b, + 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31, 0x5d62, + 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939, 0x314a, + 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68, 0x3440, + 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71, 0x5d6a, + 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e, 0x5d6b, + 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0x322d, + 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c, 0x5d7d, + 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, + 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867, 0x5d77, + 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748, 0x3563, + 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x4d4e, + 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0x4445, + 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28, 0x5e2b, + 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36, 0x5e34, + 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, + 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30, 0x5e37, + 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155, 0x5e3e, + 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54, 0x5e45, + 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338, 0x5e4b, + 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, + 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369, 0x3a51, + 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d, 0x383a, + 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f, 0x3132, + 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62, 0x5e5d, + 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45, 0x4339, + 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, + 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60, 0x5e65, + 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a, 0x5e6c, + 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47, 0x5e66, + 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c, 0x425a, + 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78, 0x5e60, + 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22, 0x3169, + 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b, 0x5e7d, + 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f, 0x5f2a, + 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29, 0x4459, + 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d, 0x4021, + 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37, 0x5f3a, + 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, + 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728, 0x5e39, + 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69, 0x5f45, + 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, + 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d, 0x4025, + 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54, 0x3250, + 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66, 0x316a, + 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b, 0x5f5a, + 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f, 0x5f5d, + 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32, 0x5f63, + 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079, 0x5f66, + 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x4851, + 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d, 0x4d50, + 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74, 0x5f75, + 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78, 0x316d, + 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, + 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a, 0x6023, + 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029, 0x602a, + 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, + 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0x6031, + 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52, 0x4a2a, + 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035, 0x6034, + 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824, 0x4848, + 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e, 0x6040, + 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, + 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35, 0x4762, + 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, + 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31, 0x4d32, + 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055, 0x3d43, + 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c, 0x605b, + 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68, 0x605e, + 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f, 0x6064, + 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0x383d, + 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a, 0x4e56, + 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c, 0x606f, + 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074, 0x7424, + 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077, 0x4d7e, + 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b, 0x607c, + 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, + 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0x612c, + 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, + 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179, 0x6134, + 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, + 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a, 0x6139, + 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31, 0x613d, + 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, + 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76, 0x6147, + 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146, 0x6149, + 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c, 0x614d, + 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153, 0x6155, + 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942, 0x3e49, + 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, + 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165, 0x4354, + 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166, 0x6167, + 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170, 0x616f, + 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e, 0x4a4a, + 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a, 0x617b, + 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, + 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, + 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d, 0x4869, + 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, 0x6233, + 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235, 0x4570, + 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, + 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x3d62, + 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829, 0x6246, + 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0x6247, + 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d, 0x3f67, + 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250, 0x624f, + 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56, 0x4e46, + 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, + 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70, 0x6263, + 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050, 0x6265, + 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556, 0x3a56, + 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b, 0x4e32, + 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e, 0x4476, + 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52, 0x6270, + 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e, 0x627b, + 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858, 0x6276, + 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324, 0x6323, + 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268, 0x626a, + 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737, 0x3540, + 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0x632f, + 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c, 0x3a57, + 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, + 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338, 0x6339, + 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645, 0x3d28, + 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b, 0x4145, + 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340, 0x3e4e, + 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d, 0x4923, + 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f, 0x634a, + 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, + 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a, 0x302c, + 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355, 0x376a, + 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060, 0x3a75, + 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, + 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e, 0x6363, + 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0x6367, + 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, + 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0x4328, + 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33, 0x3448, + 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, + 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0x637c, + 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e, 0x4826, + 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e, 0x457b, + 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e, 0x642b, + 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435, 0x6432, + 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, + 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822, 0x643e, + 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b, 0x643a, + 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, + 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d, 0x6442, + 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f, 0x6450, + 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, 0x645a, + 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f, 0x645c, + 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462, 0x4c62, + 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464, 0x4e33, + 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467, 0x6465, + 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, + 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472, 0x3852, + 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c, 0x3947, + 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65, 0x647d, + 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e, 0x6524, + 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, + 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67, 0x445d, + 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, + 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526, 0x3750, + 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d, 0x303c, + 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c, 0x3328, + 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751, 0x4233, + 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a, 0x305d, + 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0x6545, + 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b, 0x486c, + 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544, 0x6549, + 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b, 0x305e, + 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556, 0x6550, + 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558, 0x6551, + 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, + 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559, 0x4121, + 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, + 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b, 0x6568, + 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572, 0x6573, + 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578, 0x6579, + 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, + 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833, 0x3d70, + 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65, 0x6631, + 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639, 0x6638, + 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b, 0x663c, + 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643, 0x6644, + 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648, 0x6649, + 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54, 0x4f37, + 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251, 0x6650, + 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x3c2a, + 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a, 0x403b, + 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f, 0x4e7e, + 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664, 0x6665, + 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, + 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e, 0x3854, + 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, + 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758, 0x425b, + 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855, 0x307d, + 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d, 0x3b69, + 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553, 0x667a, + 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723, 0x6722, + 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, + 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, + 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d, 0x672e, + 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, + 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b, 0x673f, + 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745, 0x6740, + 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747, 0x6748, + 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a, 0x4357, + 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, + 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, + 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0x6755, + 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775, 0x383f, + 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d, 0x675c, + 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, + 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768, 0x3072, + 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032, 0x676b, + 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c, 0x676d, + 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944, 0x677e, + 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63, 0x366c, + 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775, 0x6778, + 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754, 0x6823, + 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a, 0x6825, + 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826, 0x6829, + 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a, 0x683b, + 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837, 0x6835, + 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832, 0x683e, + 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b, 0x3546, + 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551, 0x684a, + 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, + 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28, 0x684c, + 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, + 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a, 0x4378, + 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859, 0x4172, + 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861, 0x4978, + 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947, 0x6867, + 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173, 0x6866, + 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0x686c, + 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873, 0x687a, + 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, + 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e, 0x4222, + 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, + 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f, 0x4622, + 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f, 0x6927, + 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, + 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x4c79, + 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936, 0x6938, + 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e, 0x3d73, + 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149, 0x693e, + 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76, 0x623c, + 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d, 0x3575, + 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a, 0x303a, + 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742, 0x6950, + 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957, 0x3c58, + 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961, 0x695d, + 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, + 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964, 0x6965, + 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974, 0x4c2a, + 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066, 0x4f39, + 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976, 0x6975, + 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433, 0x6977, + 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28, 0x6a30, + 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, + 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b, 0x332a, + 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e, 0x6a40, + 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44, 0x6a45, + 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27, 0x6a4a, + 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955, 0x6a4d, + 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, + 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, + 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f, 0x6a59, + 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b, 0x4e76, + 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64, 0x6a65, + 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58, 0x6a6a, + 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d, 0x4a23, + 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72, 0x6a73, + 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71, 0x6a77, + 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22, 0x6b21, + 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, + 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b, 0x352c, + 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30, 0x4d77, + 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34, 0x6b35, + 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x3f28, + 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, + 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d, 0x6b42, + 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, + 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49, 0x6b4a, + 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c, 0x3153, + 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, + 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51, 0x6b4f, + 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342, 0x4d36, + 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, + 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543, 0x4434, + 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x4e4a, + 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b, 0x6b64, + 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, + 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062, 0x4625, + 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, + 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, + 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77, 0x6b79, + 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21, 0x3759, + 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0x386e, + 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32, 0x6c29, + 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30, 0x6c2f, + 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x465a, + 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f, 0x6c39, + 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, + 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0x494f, + 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, + 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, + 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, + 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0x6c4f, + 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d, 0x496a, + 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53, 0x6c54, + 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59, 0x6c5b, + 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60, 0x4176, + 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b, 0x6c64, + 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d, 0x6c6b, + 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, + 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72, 0x6c75, + 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77, 0x6c79, + 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21, 0x6d25, + 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058, 0x6d28, + 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f, 0x6d32, + 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, + 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c, 0x6d3e, + 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, + 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0x6d46, + 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49, 0x6d52, + 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, + 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22, 0x6d56, + 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, + 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725, 0x6d60, + 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0x5221, + 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x6d68, + 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57, 0x375e, + 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676, 0x6d6c, + 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e, 0x6d71, + 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555, 0x6d79, + 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, + 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, + 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, + 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b, 0x4359, + 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, + 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, + 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, + 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, + 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, + 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661, 0x4b2e, + 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a, 0x3959, + 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354, 0x4d39, + 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43, 0x6e42, + 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, + 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, + 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66, 0x6e4d, + 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f, 0x3e5f, + 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55, 0x6e56, + 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, + 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e, 0x3378, + 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60, 0x6e61, + 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66, 0x6e62, + 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a, 0x6e6d, + 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68, 0x482d, + 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c, 0x412d, + 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72, 0x412c, + 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f, 0x3154, + 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b, 0x3f6d, + 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653, 0x4945, + 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, + 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28, 0x6f29, + 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30, 0x3a3f, + 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, + 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0x6f38, + 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41, 0x6f3e, + 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44, 0x6f42, + 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, + 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, + 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67, 0x6f59, + 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457, 0x3456, + 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355, 0x395e, + 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65, 0x6f64, + 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e, 0x6f6d, + 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c, 0x6f74, + 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024, 0x424b, + 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x4a45, + 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c, 0x3459, + 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, + 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728, 0x4262, + 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, + 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e, 0x702a, + 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, + 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, + 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a, 0x6a2d, + 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063, 0x3c36, + 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b, 0x703c, + 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, + 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38, 0x7046, + 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e, 0x704b, + 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050, 0x4873, + 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0x7056, + 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b, 0x3373, + 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64, 0x7061, + 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065, 0x7066, + 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c, 0x4723, + 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47, 0x443a, + 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42, 0x3468, + 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075, 0x4b4b, + 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, 0x7079, + 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832, 0x346a, + 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121, 0x7123, + 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129, 0x7128, + 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c, 0x522c, + 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e, 0x712d, + 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, + 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, + 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f, 0x7142, + 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144, 0x7145, + 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, + 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373, 0x714e, + 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158, 0x714f, + 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155, 0x7157, + 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a, 0x462d, + 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162, 0x7161, + 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, + 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e, 0x716f, + 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174, 0x7175, + 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, + 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, + 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, + 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32, 0x7231, + 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, + 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b, 0x7238, + 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d, 0x3a7a, + 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242, 0x7245, + 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249, 0x7248, + 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a, 0x7256, + 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, + 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949, 0x725b, + 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264, 0x7263, + 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267, 0x7268, + 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0x4b31, + 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0x322a, + 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, + 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277, 0x727d, + 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322, 0x3974, + 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329, 0x7328, + 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330, 0x4461, + 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336, 0x7337, + 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b, 0x426b, + 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834, 0x7344, + 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, + 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e, 0x734f, + 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x5d60, + 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x3975, + 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0x735c, + 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, + 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a, 0x414d, + 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a, 0x706d, + 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, + 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36, 0x737c, + 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173, 0x2175, + 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2125, 0x213f, 0x2330, + 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, + 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, + 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, + 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, + 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, + 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, + 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, + 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, + 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, + 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2131, 0x216f, +}; + +static const Summary16 jisx0208_uni2indx_page00[16] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 }, + { 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 }, +}; +static const Summary16 jisx0208_uni2indx_page03[22] = { + /* 0x0300 */ + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, + { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, + { 50, 0x03fb }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, + /* 0x0400 */ + { 59, 0x0002 }, { 60, 0xffff }, { 76, 0xffff }, { 92, 0xffff }, + { 108, 0xffff }, { 124, 0x0002 }, +}; +static const Summary16 jisx0208_uni2indx_page20[50] = { + /* 0x2000 */ + { 125, 0x0000 }, { 125, 0x3361 }, { 132, 0x0063 }, { 136, 0x080d }, + { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, + { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, + { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, + /* 0x2100 */ + { 140, 0x0008 }, { 141, 0x0000 }, { 141, 0x0800 }, { 142, 0x0000 }, + { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, + { 142, 0x0000 }, { 142, 0x000f }, { 146, 0x0000 }, { 146, 0x0000 }, + { 146, 0x0000 }, { 146, 0x0014 }, { 148, 0x0000 }, { 148, 0x0000 }, + /* 0x2200 */ + { 148, 0x098d }, { 154, 0x6404 }, { 158, 0x1f81 }, { 165, 0x2030 }, + { 168, 0x0000 }, { 168, 0x0004 }, { 169, 0x0cc3 }, { 175, 0x0000 }, + { 175, 0x00cc }, { 179, 0x0000 }, { 179, 0x0020 }, { 180, 0x0000 }, + { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, + /* 0x2300 */ + { 180, 0x0000 }, { 180, 0x0004 }, +}; +static const Summary16 jisx0208_uni2indx_page25[23] = { + /* 0x2500 */ + { 181, 0x900f }, { 187, 0x3999 }, { 195, 0x9939 }, { 203, 0x9999 }, + { 211, 0x0804 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, + { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0003 }, { 215, 0x300c }, + { 219, 0xc8c0 }, { 224, 0x0000 }, { 224, 0x8000 }, { 225, 0x0000 }, + /* 0x2600 */ + { 225, 0x0060 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, + { 227, 0x0005 }, { 229, 0x0000 }, { 229, 0xa400 }, +}; +static const Summary16 jisx0208_uni2indx_page30[16] = { + /* 0x3000 */ + { 232, 0xffef }, { 247, 0x103f }, { 254, 0x0000 }, { 254, 0x0000 }, + { 254, 0xfffe }, { 269, 0xffff }, { 285, 0xffff }, { 301, 0xffff }, + { 317, 0xffff }, { 333, 0x780f }, { 341, 0xfffe }, { 356, 0xffff }, + { 372, 0xffff }, { 388, 0xffff }, { 404, 0xffff }, { 420, 0x787f }, +}; +static const Summary16 jisx0208_uni2indx_page4e[1307] = { + /* 0x4e00 */ + { 431, 0x6f8b }, { 441, 0x43f3 }, { 450, 0x2442 }, { 454, 0x9b46 }, + { 462, 0xe82c }, { 469, 0xe3e0 }, { 477, 0x0004 }, { 478, 0x400a }, + { 481, 0x5f65 }, { 491, 0xdb36 }, { 501, 0x7977 }, { 512, 0x0449 }, + { 516, 0xecd7 }, { 527, 0xe3f0 }, { 536, 0x6038 }, { 541, 0x08c5 }, + /* 0x4f00 */ + { 546, 0xe602 }, { 552, 0x3403 }, { 557, 0x8000 }, { 558, 0x3551 }, + { 565, 0xe0c8 }, { 571, 0x7eab }, { 582, 0x8200 }, { 584, 0x9869 }, + { 591, 0xa948 }, { 597, 0x2942 }, { 602, 0xe803 }, { 608, 0x8060 }, + { 611, 0x441c }, { 616, 0xad93 }, { 625, 0xc03a }, { 631, 0x4568 }, + /* 0x5000 */ + { 637, 0xaa60 }, { 643, 0x8656 }, { 650, 0x3f7a }, { 661, 0x0240 }, + { 663, 0x8388 }, { 668, 0x1461 }, { 673, 0x1020 }, { 675, 0x2174 }, + { 681, 0x2021 }, { 684, 0x0702 }, { 688, 0x3000 }, { 690, 0x40bc }, + { 696, 0xa624 }, { 702, 0x4462 }, { 707, 0x60a8 }, { 712, 0x0a20 }, + /* 0x5100 */ + { 715, 0x0217 }, { 720, 0x8574 }, { 727, 0x0402 }, { 729, 0x9c84 }, + { 735, 0x7bfb }, { 748, 0x1415 }, { 753, 0x7f24 }, { 762, 0x11e2 }, + { 768, 0xb665 }, { 777, 0x02ef }, { 785, 0x1f75 }, { 795, 0x20ff }, + { 804, 0x3a70 }, { 811, 0x3840 }, { 815, 0x26c3 }, { 822, 0x6763 }, + /* 0x5200 */ + { 831, 0x4dd9 }, { 840, 0x2092 }, { 844, 0x46b0 }, { 850, 0x0fc9 }, + { 858, 0xbc98 }, { 866, 0x4850 }, { 870, 0x8638 }, { 876, 0xa03f }, + { 884, 0x2388 }, { 889, 0x8816 }, { 894, 0x3e09 }, { 901, 0x5232 }, + { 907, 0x22aa }, { 913, 0xe3a4 }, { 921, 0x00dd }, { 927, 0xc72c }, + /* 0x5300 */ + { 935, 0xa166 }, { 942, 0x26e1 }, { 949, 0x840b }, { 954, 0x8f0a }, + { 961, 0x27eb }, { 971, 0x559e }, { 980, 0xc241 }, { 985, 0x89bb }, + { 994, 0x0014 }, { 996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 }, + { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf }, + /* 0x5400 */ + { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 }, + { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb }, + { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c }, + { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 }, + /* 0x5500 */ + { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a }, + { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 }, + { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 }, + { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 }, + /* 0x5600 */ + { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 }, + { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 }, + { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 }, + { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d }, + /* 0x5700 */ + { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 }, + { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 }, + { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 }, + { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 }, + /* 0x5800 */ + { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 }, + { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 }, + { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 }, + { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 }, + /* 0x5900 */ + { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 }, + { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 }, + { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 }, + { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 }, + /* 0x5a00 */ + { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 }, + { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 }, + { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 }, + { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 }, + /* 0x5b00 */ + { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 }, + { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b }, + { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 }, + { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 }, + /* 0x5c00 */ + { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 }, + { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 }, + { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca }, + { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 }, + /* 0x5d00 */ + { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 }, + { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 }, + { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 }, + { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be }, + /* 0x5e00 */ + { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 }, + { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c }, + { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 }, + { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb }, + /* 0x5f00 */ + { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 }, + { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b }, + { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 }, + { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 }, + /* 0x6000 */ + { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 }, + { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 }, + { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c }, + { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb }, + /* 0x6100 */ + { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 }, + { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb }, + { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 }, + { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 }, + /* 0x6200 */ + { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d }, + { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 }, + { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 }, + { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea }, + /* 0x6300 */ + { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 }, + { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 }, + { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 }, + { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 }, + /* 0x6400 */ + { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 }, + { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 }, + { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 }, + { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 }, + /* 0x6500 */ + { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 }, + { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 }, + { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 }, + { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 }, + /* 0x6600 */ + { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 }, + { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 }, + { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 }, + { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd }, + /* 0x6700 */ + { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 }, + { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af }, + { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 }, + { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a }, + /* 0x6800 */ + { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 }, + { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 }, + { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b }, + { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 }, + /* 0x6900 */ + { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 }, + { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 }, + { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 }, + { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 }, + /* 0x6a00 */ + { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 }, + { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 }, + { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 }, + { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 }, + /* 0x6b00 */ + { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 }, + { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 }, + { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe }, + { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 }, + /* 0x6c00 */ + { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 }, + { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d }, + { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a }, + { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b }, + /* 0x6d00 */ + { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c }, + { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 }, + { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 }, + { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa }, + /* 0x6e00 */ + { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 }, + { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 }, + { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 }, + { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 }, + /* 0x6f00 */ + { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 }, + { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 }, + { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a }, + { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a }, + /* 0x7000 */ + { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 }, + { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 }, + { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 }, + { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 }, + /* 0x7100 */ + { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 }, + { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 }, + { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 }, + { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 }, + /* 0x7200 */ + { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 }, + { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 }, + { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 }, + { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 }, + /* 0x7300 */ + { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 }, + { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 }, + { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c }, + { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 }, + /* 0x7400 */ + { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c }, + { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 }, + { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 }, + { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 }, + /* 0x7500 */ + { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f }, + { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 }, + { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e }, + { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d }, + /* 0x7600 */ + { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 }, + { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 }, + { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 }, + { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 }, + /* 0x7700 */ + { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 }, + { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 }, + { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 }, + { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 }, + /* 0x7800 */ + { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 }, + { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 }, + { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 }, + { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 }, + /* 0x7900 */ + { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 }, + { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 }, + { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 }, + { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 }, + /* 0x7a00 */ + { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 }, + { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 }, + { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 }, + { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 }, + /* 0x7b00 */ + { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 }, + { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 }, + { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 }, + { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 }, + /* 0x7c00 */ + { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 }, + { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 }, + { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e }, + { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 }, + /* 0x7d00 */ + { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d }, + { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e }, + { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 }, + { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 }, + /* 0x7e00 */ + { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 }, + { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 }, + { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 }, + { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, + /* 0x7f00 */ + { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 }, + { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 }, + { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 }, + { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 }, + /* 0x8000 */ + { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 }, + { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd }, + { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 }, + { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 }, + /* 0x8100 */ + { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a }, + { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 }, + { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 }, + { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 }, + /* 0x8200 */ + { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 }, + { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 }, + { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a }, + { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a }, + /* 0x8300 */ + { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 }, + { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 }, + { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 }, + { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 }, + /* 0x8400 */ + { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 }, + { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 }, + { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 }, + { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 }, + /* 0x8500 */ + { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 }, + { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 }, + { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 }, + { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 }, + /* 0x8600 */ + { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 }, + { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 }, + { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 }, + { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 }, + /* 0x8700 */ + { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 }, + { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 }, + { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 }, + { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 }, + /* 0x8800 */ + { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 }, + { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 }, + { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 }, + { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c }, + /* 0x8900 */ + { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 }, + { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 }, + { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c }, + { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 }, + /* 0x8a00 */ + { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a }, + { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f }, + { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 }, + { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a }, + /* 0x8b00 */ + { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 }, + { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 }, + { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 }, + { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, + /* 0x8c00 */ + { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 }, + { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 }, + { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd }, + { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 }, + /* 0x8d00 */ + { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 }, + { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b }, + { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 }, + { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 }, + /* 0x8e00 */ + { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 }, + { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 }, + { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 }, + { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 }, + /* 0x8f00 */ + { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 }, + { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 }, + { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 }, + { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 }, + /* 0x9000 */ + { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 }, + { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 }, + { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 }, + { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 }, + /* 0x9100 */ + { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 }, + { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac }, + { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 }, + { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 }, + /* 0x9200 */ + { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 }, + { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 }, + { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 }, + { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c }, + /* 0x9300 */ + { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 }, + { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 }, + { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 }, + { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 }, + /* 0x9400 */ + { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 }, + { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 }, + { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, + { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, + /* 0x9500 */ + { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, + { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 }, + { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 }, + { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 }, + /* 0x9600 */ + { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 }, + { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed }, + { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 }, + { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 }, + /* 0x9700 */ + { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 }, + { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 }, + { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 }, + { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c }, + /* 0x9800 */ + { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 }, + { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b }, + { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 }, + { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 }, + /* 0x9900 */ + { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 }, + { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 }, + { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 }, + { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 }, + /* 0x9a00 */ + { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 }, + { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 }, + { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 }, + { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 }, + /* 0x9b00 */ + { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 }, + { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 }, + { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 }, + { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 }, + /* 0x9c00 */ + { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 }, + { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 }, + { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, + { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 }, + /* 0x9d00 */ + { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 }, + { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 }, + { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 }, + { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 }, + /* 0x9e00 */ + { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 }, + { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 }, + { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 }, + { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 }, + /* 0x9f00 */ + { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 }, + { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 }, + { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 }, +}; +static const Summary16 jisx0208_uni2indx_pageff[15] = { + /* 0xff00 */ + { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff }, + { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 }, + { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, + { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 }, +}; + +static int +jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0100) + summary = &jisx0208_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x0300 && wc < 0x0460) + summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030]; + else if (wc >= 0x2000 && wc < 0x2320) + summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x2500 && wc < 0x2670) + summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250]; + else if (wc >= 0x3000 && wc < 0x3100) + summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x4e00 && wc < 0x9fb0) + summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xff00 && wc < 0xfff0) + summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = jisx0208_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/jisx0212.h b/Externals/libiconv-1.14/lib/jisx0212.h new file mode 100644 index 0000000000..371dbb152c --- /dev/null +++ b/Externals/libiconv-1.14/lib/jisx0212.h @@ -0,0 +1,2189 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JISX0212.1990-0 + */ + +static const unsigned short jisx0212_2uni_page22[81] = { + /* 0x22 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x02d8, 0x02c7, + 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0xff5e, 0x0384, + 0x0385, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x00a1, 0x00a6, 0x00bf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122, 0x00a4, + 0x2116, +}; +static const unsigned short jisx0212_2uni_page26[188] = { + /* 0x26 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0xfffd, 0x038c, 0xfffd, + 0x038e, 0x03ab, 0xfffd, 0x038f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03c2, + 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0xfffd, 0xfffd, + /* 0x27 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, + 0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, + 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f, +}; +static const unsigned short jisx0212_2uni_page29[275] = { + /* 0x29 */ + 0x00c6, 0x0110, 0xfffd, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x0141, + 0x013f, 0xfffd, 0x014a, 0x00d8, 0x0152, 0xfffd, 0x0166, 0x00de, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, + 0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167, 0x00fe, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x2a */ + 0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100, 0x0104, + 0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a, 0x010e, + 0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112, 0x0118, + 0xfffd, 0x011c, 0x011e, 0x0122, 0x0120, 0x0124, 0x00cd, 0x00cc, + 0x00cf, 0x00ce, 0x01cf, 0x0130, 0x012a, 0x012e, 0x0128, 0x0134, + 0x0136, 0x0139, 0x013d, 0x013b, 0x0143, 0x0147, 0x0145, 0x00d1, + 0x00d3, 0x00d2, 0x00d6, 0x00d4, 0x01d1, 0x0150, 0x014c, 0x00d5, + 0x0154, 0x0158, 0x0156, 0x015a, 0x015c, 0x0160, 0x015e, 0x0164, + 0x0162, 0x00da, 0x00d9, 0x00dc, 0x00db, 0x016c, 0x01d3, 0x0170, + 0x016a, 0x0172, 0x016e, 0x0168, 0x01d7, 0x01db, 0x01d9, 0x01d5, + 0x0174, 0x00dd, 0x0178, 0x0176, 0x0179, 0x017d, 0x017b, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x2b */ + 0x00e1, 0x00e0, 0x00e4, 0x00e2, 0x0103, 0x01ce, 0x0101, 0x0105, + 0x00e5, 0x00e3, 0x0107, 0x0109, 0x010d, 0x00e7, 0x010b, 0x010f, + 0x00e9, 0x00e8, 0x00eb, 0x00ea, 0x011b, 0x0117, 0x0113, 0x0119, + 0x01f5, 0x011d, 0x011f, 0xfffd, 0x0121, 0x0125, 0x00ed, 0x00ec, + 0x00ef, 0x00ee, 0x01d0, 0xfffd, 0x012b, 0x012f, 0x0129, 0x0135, + 0x0137, 0x013a, 0x013e, 0x013c, 0x0144, 0x0148, 0x0146, 0x00f1, + 0x00f3, 0x00f2, 0x00f6, 0x00f4, 0x01d2, 0x0151, 0x014d, 0x00f5, + 0x0155, 0x0159, 0x0157, 0x015b, 0x015d, 0x0161, 0x015f, 0x0165, + 0x0163, 0x00fa, 0x00f9, 0x00fc, 0x00fb, 0x016d, 0x01d4, 0x0171, + 0x016b, 0x0173, 0x016f, 0x0169, 0x01d8, 0x01dc, 0x01da, 0x01d6, + 0x0175, 0x00fd, 0x00ff, 0x0177, 0x017a, 0x017e, 0x017c, +}; +static const unsigned short jisx0212_2uni_page30[5801] = { + /* 0x30 */ + 0x4e02, 0x4e04, 0x4e05, 0x4e0c, 0x4e12, 0x4e1f, 0x4e23, 0x4e24, + 0x4e28, 0x4e2b, 0x4e2e, 0x4e2f, 0x4e30, 0x4e35, 0x4e40, 0x4e41, + 0x4e44, 0x4e47, 0x4e51, 0x4e5a, 0x4e5c, 0x4e63, 0x4e68, 0x4e69, + 0x4e74, 0x4e75, 0x4e79, 0x4e7f, 0x4e8d, 0x4e96, 0x4e97, 0x4e9d, + 0x4eaf, 0x4eb9, 0x4ec3, 0x4ed0, 0x4eda, 0x4edb, 0x4ee0, 0x4ee1, + 0x4ee2, 0x4ee8, 0x4eef, 0x4ef1, 0x4ef3, 0x4ef5, 0x4efd, 0x4efe, + 0x4eff, 0x4f00, 0x4f02, 0x4f03, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, + 0x4f15, 0x4f16, 0x4f17, 0x4f19, 0x4f2e, 0x4f31, 0x4f60, 0x4f33, + 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f40, 0x4f42, 0x4f48, + 0x4f49, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f58, 0x4f5f, + 0x4f63, 0x4f6a, 0x4f6c, 0x4f6e, 0x4f71, 0x4f77, 0x4f78, 0x4f79, + 0x4f7a, 0x4f7d, 0x4f7e, 0x4f81, 0x4f82, 0x4f84, + /* 0x31 */ + 0x4f85, 0x4f89, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, + 0x4f94, 0x4f97, 0x4f99, 0x4f9a, 0x4f9e, 0x4f9f, 0x4fb2, 0x4fb7, + 0x4fb9, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc5, + 0x4fc6, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fcf, 0x4fd2, + 0x4fdc, 0x4fe0, 0x4fe2, 0x4ff0, 0x4ff2, 0x4ffc, 0x4ffd, 0x4fff, + 0x5000, 0x5001, 0x5004, 0x5007, 0x500a, 0x500c, 0x500e, 0x5010, + 0x5013, 0x5017, 0x5018, 0x501b, 0x501c, 0x501d, 0x501e, 0x5022, + 0x5027, 0x502e, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041, + 0x5042, 0x5045, 0x5046, 0x504a, 0x504c, 0x504e, 0x5051, 0x5052, + 0x5053, 0x5057, 0x5059, 0x505f, 0x5060, 0x5062, 0x5063, 0x5066, + 0x5067, 0x506a, 0x506d, 0x5070, 0x5071, 0x503b, 0x5081, 0x5083, + 0x5084, 0x5086, 0x508a, 0x508e, 0x508f, 0x5090, + /* 0x32 */ + 0x5092, 0x5093, 0x5094, 0x5096, 0x509b, 0x509c, 0x509e, 0x509f, + 0x50a0, 0x50a1, 0x50a2, 0x50aa, 0x50af, 0x50b0, 0x50b9, 0x50ba, + 0x50bd, 0x50c0, 0x50c3, 0x50c4, 0x50c7, 0x50cc, 0x50ce, 0x50d0, + 0x50d3, 0x50d4, 0x50d8, 0x50dc, 0x50dd, 0x50df, 0x50e2, 0x50e4, + 0x50e6, 0x50e8, 0x50e9, 0x50ef, 0x50f1, 0x50f6, 0x50fa, 0x50fe, + 0x5103, 0x5106, 0x5107, 0x5108, 0x510b, 0x510c, 0x510d, 0x510e, + 0x50f2, 0x5110, 0x5117, 0x5119, 0x511b, 0x511c, 0x511d, 0x511e, + 0x5123, 0x5127, 0x5128, 0x512c, 0x512d, 0x512f, 0x5131, 0x5133, + 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514a, 0x514f, 0x5153, + 0x5155, 0x5157, 0x5158, 0x515f, 0x5164, 0x5166, 0x517e, 0x5183, + 0x5184, 0x518b, 0x518e, 0x5198, 0x519d, 0x51a1, 0x51a3, 0x51ad, + 0x51b8, 0x51ba, 0x51bc, 0x51be, 0x51bf, 0x51c2, + /* 0x33 */ + 0x51c8, 0x51cf, 0x51d1, 0x51d2, 0x51d3, 0x51d5, 0x51d8, 0x51de, + 0x51e2, 0x51e5, 0x51ee, 0x51f2, 0x51f3, 0x51f4, 0x51f7, 0x5201, + 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222, + 0x5228, 0x5231, 0x5232, 0x5235, 0x523c, 0x5245, 0x5249, 0x5255, + 0x5257, 0x5258, 0x525a, 0x525c, 0x525f, 0x5260, 0x5261, 0x5266, + 0x526e, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528a, + 0x528c, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529a, 0x529c, + 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52af, 0x52b0, 0x52b6, 0x52b7, + 0x52b8, 0x52ba, 0x52bb, 0x52bd, 0x52c0, 0x52c4, 0x52c6, 0x52c8, + 0x52cc, 0x52cf, 0x52d1, 0x52d4, 0x52d6, 0x52db, 0x52dc, 0x52e1, + 0x52e5, 0x52e8, 0x52e9, 0x52ea, 0x52ec, 0x52f0, 0x52f1, 0x52f4, + 0x52f6, 0x52f7, 0x5300, 0x5303, 0x530a, 0x530b, + /* 0x34 */ + 0x530c, 0x5311, 0x5313, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, + 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x5330, + 0x5332, 0x5335, 0x533c, 0x533d, 0x533e, 0x5342, 0x534c, 0x534b, + 0x5359, 0x535b, 0x5361, 0x5363, 0x5365, 0x536c, 0x536d, 0x5372, + 0x5379, 0x537e, 0x5383, 0x5387, 0x5388, 0x538e, 0x5393, 0x5394, + 0x5399, 0x539d, 0x53a1, 0x53a4, 0x53aa, 0x53ab, 0x53af, 0x53b2, + 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53ba, 0x53bd, 0x53c0, 0x53c5, + 0x53cf, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dd, 0x53de, 0x53e0, + 0x53e6, 0x53e7, 0x53f5, 0x5402, 0x5413, 0x541a, 0x5421, 0x5427, + 0x5428, 0x542a, 0x542f, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444, + 0x5447, 0x544d, 0x544f, 0x545e, 0x5462, 0x5464, 0x5466, 0x5467, + 0x5469, 0x546b, 0x546d, 0x546e, 0x5474, 0x547f, + /* 0x35 */ + 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548d, 0x5491, 0x5495, + 0x5496, 0x549c, 0x549f, 0x54a1, 0x54a6, 0x54a7, 0x54a9, 0x54aa, + 0x54ad, 0x54ae, 0x54b1, 0x54b7, 0x54b9, 0x54ba, 0x54bb, 0x54bf, + 0x54c6, 0x54ca, 0x54cd, 0x54ce, 0x54e0, 0x54ea, 0x54ec, 0x54ef, + 0x54f6, 0x54fc, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5505, 0x5508, + 0x5509, 0x550c, 0x550d, 0x550e, 0x5515, 0x552a, 0x552b, 0x5532, + 0x5535, 0x5536, 0x553b, 0x553c, 0x553d, 0x5541, 0x5547, 0x5549, + 0x554a, 0x554d, 0x5550, 0x5551, 0x5558, 0x555a, 0x555b, 0x555e, + 0x5560, 0x5561, 0x5564, 0x5566, 0x557f, 0x5581, 0x5582, 0x5586, + 0x5588, 0x558e, 0x558f, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597, + 0x55a3, 0x55a4, 0x55ad, 0x55b2, 0x55bf, 0x55c1, 0x55c3, 0x55c6, + 0x55c9, 0x55cb, 0x55cc, 0x55ce, 0x55d1, 0x55d2, + /* 0x36 */ + 0x55d3, 0x55d7, 0x55d8, 0x55db, 0x55de, 0x55e2, 0x55e9, 0x55f6, + 0x55ff, 0x5605, 0x5608, 0x560a, 0x560d, 0x560e, 0x560f, 0x5610, + 0x5611, 0x5612, 0x5619, 0x562c, 0x5630, 0x5633, 0x5635, 0x5637, + 0x5639, 0x563b, 0x563c, 0x563d, 0x563f, 0x5640, 0x5641, 0x5643, + 0x5644, 0x5646, 0x5649, 0x564b, 0x564d, 0x564f, 0x5654, 0x565e, + 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566d, 0x566f, + 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568b, 0x568c, + 0x5695, 0x5699, 0x569a, 0x569d, 0x569e, 0x569f, 0x56a6, 0x56a7, + 0x56a8, 0x56a9, 0x56ab, 0x56ac, 0x56ad, 0x56b1, 0x56b3, 0x56b7, + 0x56be, 0x56c5, 0x56c9, 0x56ca, 0x56cb, 0x56cf, 0x56d0, 0x56cc, + 0x56cd, 0x56d9, 0x56dc, 0x56dd, 0x56df, 0x56e1, 0x56e4, 0x56e5, + 0x56e6, 0x56e7, 0x56e8, 0x56f1, 0x56eb, 0x56ed, + /* 0x37 */ + 0x56f6, 0x56f7, 0x5701, 0x5702, 0x5707, 0x570a, 0x570c, 0x5711, + 0x5715, 0x571a, 0x571b, 0x571d, 0x5720, 0x5722, 0x5723, 0x5724, + 0x5725, 0x5729, 0x572a, 0x572c, 0x572e, 0x572f, 0x5733, 0x5734, + 0x573d, 0x573e, 0x573f, 0x5745, 0x5746, 0x574c, 0x574d, 0x5752, + 0x5762, 0x5765, 0x5767, 0x5768, 0x576b, 0x576d, 0x576e, 0x576f, + 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577a, + 0x577b, 0x577c, 0x577e, 0x5781, 0x5783, 0x578c, 0x5794, 0x5797, + 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a1, 0x5795, + 0x57a7, 0x57a8, 0x57a9, 0x57ac, 0x57b8, 0x57bd, 0x57c7, 0x57c8, + 0x57cc, 0x57cf, 0x57d5, 0x57dd, 0x57de, 0x57e4, 0x57e6, 0x57e7, + 0x57e9, 0x57ed, 0x57f0, 0x57f5, 0x57f6, 0x57f8, 0x57fd, 0x57fe, + 0x57ff, 0x5803, 0x5804, 0x5808, 0x5809, 0x57e1, + /* 0x38 */ + 0x580c, 0x580d, 0x581b, 0x581e, 0x581f, 0x5820, 0x5826, 0x5827, + 0x582d, 0x5832, 0x5839, 0x583f, 0x5849, 0x584c, 0x584d, 0x584f, + 0x5850, 0x5855, 0x585f, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878, + 0x587c, 0x587f, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588a, + 0x588c, 0x588d, 0x588f, 0x5890, 0x5894, 0x5896, 0x589d, 0x58a0, + 0x58a1, 0x58a2, 0x58a6, 0x58a9, 0x58b1, 0x58b2, 0x58c4, 0x58bc, + 0x58c2, 0x58c8, 0x58cd, 0x58ce, 0x58d0, 0x58d2, 0x58d4, 0x58d6, + 0x58da, 0x58dd, 0x58e1, 0x58e2, 0x58e9, 0x58f3, 0x5905, 0x5906, + 0x590b, 0x590c, 0x5912, 0x5913, 0x5914, 0x8641, 0x591d, 0x5921, + 0x5923, 0x5924, 0x5928, 0x592f, 0x5930, 0x5933, 0x5935, 0x5936, + 0x593f, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595b, 0x595d, + 0x595e, 0x595f, 0x5961, 0x5963, 0x596b, 0x596d, + /* 0x39 */ + 0x596f, 0x5972, 0x5975, 0x5976, 0x5979, 0x597b, 0x597c, 0x598b, + 0x598c, 0x598e, 0x5992, 0x5995, 0x5997, 0x599f, 0x59a4, 0x59a7, + 0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b3, 0x59b7, 0x59ba, 0x59bc, + 0x59c1, 0x59c3, 0x59c4, 0x59c8, 0x59ca, 0x59cd, 0x59d2, 0x59dd, + 0x59de, 0x59df, 0x59e3, 0x59e4, 0x59e7, 0x59ee, 0x59ef, 0x59f1, + 0x59f2, 0x59f4, 0x59f7, 0x5a00, 0x5a04, 0x5a0c, 0x5a0d, 0x5a0e, + 0x5a12, 0x5a13, 0x5a1e, 0x5a23, 0x5a24, 0x5a27, 0x5a28, 0x5a2a, + 0x5a2d, 0x5a30, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4c, 0x5a50, + 0x5a55, 0x5a5e, 0x5a63, 0x5a65, 0x5a67, 0x5a6d, 0x5a77, 0x5a7a, + 0x5a7b, 0x5a7e, 0x5a8b, 0x5a90, 0x5a93, 0x5a96, 0x5a99, 0x5a9c, + 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa2, 0x5aa7, 0x5aac, 0x5ab1, 0x5ab2, + 0x5ab3, 0x5ab5, 0x5ab8, 0x5aba, 0x5abb, 0x5abf, + /* 0x3a */ + 0x5ac4, 0x5ac6, 0x5ac8, 0x5acf, 0x5ada, 0x5adc, 0x5ae0, 0x5ae5, + 0x5aea, 0x5aee, 0x5af5, 0x5af6, 0x5afd, 0x5b00, 0x5b01, 0x5b08, + 0x5b17, 0x5b34, 0x5b19, 0x5b1b, 0x5b1d, 0x5b21, 0x5b25, 0x5b2d, + 0x5b38, 0x5b41, 0x5b4b, 0x5b4c, 0x5b52, 0x5b56, 0x5b5e, 0x5b68, + 0x5b6e, 0x5b6f, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b81, 0x5b84, + 0x5b86, 0x5b8a, 0x5b8e, 0x5b90, 0x5b91, 0x5b93, 0x5b94, 0x5b96, + 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, + 0x5bba, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bcd, 0x5bcf, 0x5bd6, 0x5bd7, + 0x5bd8, 0x5bd9, 0x5bda, 0x5be0, 0x5bef, 0x5bf1, 0x5bf4, 0x5bfd, + 0x5c0c, 0x5c17, 0x5c1e, 0x5c1f, 0x5c23, 0x5c26, 0x5c29, 0x5c2b, + 0x5c2c, 0x5c2e, 0x5c30, 0x5c32, 0x5c35, 0x5c36, 0x5c59, 0x5c5a, + 0x5c5c, 0x5c62, 0x5c63, 0x5c67, 0x5c68, 0x5c69, + /* 0x3b */ + 0x5c6d, 0x5c70, 0x5c74, 0x5c75, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, + 0x5c87, 0x5c88, 0x5c8a, 0x5c8f, 0x5c92, 0x5c9d, 0x5c9f, 0x5ca0, + 0x5ca2, 0x5ca3, 0x5ca6, 0x5caa, 0x5cb2, 0x5cb4, 0x5cb5, 0x5cba, + 0x5cc9, 0x5ccb, 0x5cd2, 0x5cdd, 0x5cd7, 0x5cee, 0x5cf1, 0x5cf2, + 0x5cf4, 0x5d01, 0x5d06, 0x5d0d, 0x5d12, 0x5d2b, 0x5d23, 0x5d24, + 0x5d26, 0x5d27, 0x5d31, 0x5d34, 0x5d39, 0x5d3d, 0x5d3f, 0x5d42, + 0x5d43, 0x5d46, 0x5d48, 0x5d55, 0x5d51, 0x5d59, 0x5d4a, 0x5d5f, + 0x5d60, 0x5d61, 0x5d62, 0x5d64, 0x5d6a, 0x5d6d, 0x5d70, 0x5d79, + 0x5d7a, 0x5d7e, 0x5d7f, 0x5d81, 0x5d83, 0x5d88, 0x5d8a, 0x5d92, + 0x5d93, 0x5d94, 0x5d95, 0x5d99, 0x5d9b, 0x5d9f, 0x5da0, 0x5da7, + 0x5dab, 0x5db0, 0x5db4, 0x5db8, 0x5db9, 0x5dc3, 0x5dc7, 0x5dcb, + 0x5dd0, 0x5dce, 0x5dd8, 0x5dd9, 0x5de0, 0x5de4, + /* 0x3c */ + 0x5de9, 0x5df8, 0x5df9, 0x5e00, 0x5e07, 0x5e0d, 0x5e12, 0x5e14, + 0x5e15, 0x5e18, 0x5e1f, 0x5e20, 0x5e2e, 0x5e28, 0x5e32, 0x5e35, + 0x5e3e, 0x5e4b, 0x5e50, 0x5e49, 0x5e51, 0x5e56, 0x5e58, 0x5e5b, + 0x5e5c, 0x5e5e, 0x5e68, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, + 0x5e70, 0x5e80, 0x5e8b, 0x5e8e, 0x5ea2, 0x5ea4, 0x5ea5, 0x5ea8, + 0x5eaa, 0x5eac, 0x5eb1, 0x5eb3, 0x5ebd, 0x5ebe, 0x5ebf, 0x5ec6, + 0x5ecc, 0x5ecb, 0x5ece, 0x5ed1, 0x5ed2, 0x5ed4, 0x5ed5, 0x5edc, + 0x5ede, 0x5ee5, 0x5eeb, 0x5f02, 0x5f06, 0x5f07, 0x5f08, 0x5f0e, + 0x5f19, 0x5f1c, 0x5f1d, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, + 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f34, 0x5f36, 0x5f3b, 0x5f3d, + 0x5f3f, 0x5f40, 0x5f44, 0x5f45, 0x5f47, 0x5f4d, 0x5f50, 0x5f54, + 0x5f58, 0x5f5b, 0x5f60, 0x5f63, 0x5f64, 0x5f67, + /* 0x3d */ + 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, + 0x5f89, 0x5f8d, 0x5f8f, 0x5f96, 0x5f9c, 0x5f9d, 0x5fa2, 0x5fa7, + 0x5fab, 0x5fa4, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb8, 0x5fc4, + 0x5fc7, 0x5fc8, 0x5fc9, 0x5fcb, 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3, + 0x5fd4, 0x5fde, 0x5fe1, 0x5fe2, 0x5fe8, 0x5fe9, 0x5fea, 0x5fec, + 0x5fed, 0x5fee, 0x5fef, 0x5ff2, 0x5ff3, 0x5ff6, 0x5ffa, 0x5ffc, + 0x6007, 0x600a, 0x600d, 0x6013, 0x6014, 0x6017, 0x6018, 0x601a, + 0x601f, 0x6024, 0x602d, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048, + 0x6049, 0x604c, 0x6051, 0x6054, 0x6056, 0x6057, 0x605d, 0x6061, + 0x6067, 0x6071, 0x607e, 0x607f, 0x6082, 0x6086, 0x6088, 0x608a, + 0x608e, 0x6091, 0x6093, 0x6095, 0x6098, 0x609d, 0x609e, 0x60a2, + 0x60a4, 0x60a5, 0x60a8, 0x60b0, 0x60b1, 0x60b7, + /* 0x3e */ + 0x60bb, 0x60be, 0x60c2, 0x60c4, 0x60c8, 0x60c9, 0x60ca, 0x60cb, + 0x60ce, 0x60cf, 0x60d4, 0x60d5, 0x60d9, 0x60db, 0x60dd, 0x60de, + 0x60e2, 0x60e5, 0x60f2, 0x60f5, 0x60f8, 0x60fc, 0x60fd, 0x6102, + 0x6107, 0x610a, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, + 0x6116, 0x6117, 0x6119, 0x611c, 0x611e, 0x6122, 0x612a, 0x612b, + 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145, + 0x6146, 0x6149, 0x615e, 0x6160, 0x616c, 0x6172, 0x6178, 0x617b, + 0x617c, 0x617f, 0x6180, 0x6181, 0x6183, 0x6184, 0x618b, 0x618d, + 0x6192, 0x6193, 0x6197, 0x6198, 0x619c, 0x619d, 0x619f, 0x61a0, + 0x61a5, 0x61a8, 0x61aa, 0x61ad, 0x61b8, 0x61b9, 0x61bc, 0x61c0, + 0x61c1, 0x61c2, 0x61ce, 0x61cf, 0x61d5, 0x61dc, 0x61dd, 0x61de, + 0x61df, 0x61e1, 0x61e2, 0x61e7, 0x61e9, 0x61e5, + /* 0x3f */ + 0x61ec, 0x61ed, 0x61ef, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213, + 0x6215, 0x621c, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622b, + 0x6239, 0x623d, 0x6242, 0x6243, 0x6244, 0x6246, 0x624c, 0x6250, + 0x6251, 0x6252, 0x6254, 0x6256, 0x625a, 0x625c, 0x6264, 0x626d, + 0x626f, 0x6273, 0x627a, 0x627d, 0x628d, 0x628e, 0x628f, 0x6290, + 0x62a6, 0x62a8, 0x62b3, 0x62b6, 0x62b7, 0x62ba, 0x62be, 0x62bf, + 0x62c4, 0x62ce, 0x62d5, 0x62d6, 0x62da, 0x62ea, 0x62f2, 0x62f4, + 0x62fc, 0x62fd, 0x6303, 0x6304, 0x630a, 0x630b, 0x630d, 0x6310, + 0x6313, 0x6316, 0x6318, 0x6329, 0x632a, 0x632d, 0x6335, 0x6336, + 0x6339, 0x633c, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634a, + 0x634b, 0x634e, 0x6352, 0x6353, 0x6354, 0x6358, 0x635b, 0x6365, + 0x6366, 0x636c, 0x636d, 0x6371, 0x6374, 0x6375, + /* 0x40 */ + 0x6378, 0x637c, 0x637d, 0x637f, 0x6382, 0x6384, 0x6387, 0x638a, + 0x6390, 0x6394, 0x6395, 0x6399, 0x639a, 0x639e, 0x63a4, 0x63a6, + 0x63ad, 0x63ae, 0x63af, 0x63bd, 0x63c1, 0x63c5, 0x63c8, 0x63ce, + 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63dc, 0x63e0, 0x63e5, 0x63ea, + 0x63ec, 0x63f2, 0x63f3, 0x63f5, 0x63f8, 0x63f9, 0x6409, 0x640a, + 0x6410, 0x6412, 0x6414, 0x6418, 0x641e, 0x6420, 0x6422, 0x6424, + 0x6425, 0x6429, 0x642a, 0x642f, 0x6430, 0x6435, 0x643d, 0x643f, + 0x644b, 0x644f, 0x6451, 0x6452, 0x6453, 0x6454, 0x645a, 0x645b, + 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6463, 0x646d, 0x6473, + 0x6474, 0x647b, 0x647d, 0x6485, 0x6487, 0x648f, 0x6490, 0x6491, + 0x6498, 0x6499, 0x649b, 0x649d, 0x649f, 0x64a1, 0x64a3, 0x64a6, + 0x64a8, 0x64ac, 0x64b3, 0x64bd, 0x64be, 0x64bf, + /* 0x41 */ + 0x64c4, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64ce, 0x64d0, 0x64d1, + 0x64d5, 0x64d7, 0x64e4, 0x64e5, 0x64e9, 0x64ea, 0x64ed, 0x64f0, + 0x64f5, 0x64f7, 0x64fb, 0x64ff, 0x6501, 0x6504, 0x6508, 0x6509, + 0x650a, 0x650f, 0x6513, 0x6514, 0x6516, 0x6519, 0x651b, 0x651e, + 0x651f, 0x6522, 0x6526, 0x6529, 0x652e, 0x6531, 0x653a, 0x653c, + 0x653d, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655f, + 0x6560, 0x6567, 0x656b, 0x657a, 0x657d, 0x6581, 0x6585, 0x658a, + 0x6592, 0x6595, 0x6598, 0x659d, 0x65a0, 0x65a3, 0x65a6, 0x65ae, + 0x65b2, 0x65b3, 0x65b4, 0x65bf, 0x65c2, 0x65c8, 0x65c9, 0x65ce, + 0x65d0, 0x65d4, 0x65d6, 0x65d8, 0x65df, 0x65f0, 0x65f2, 0x65f4, + 0x65f5, 0x65f9, 0x65fe, 0x65ff, 0x6600, 0x6604, 0x6608, 0x6609, + 0x660d, 0x6611, 0x6612, 0x6615, 0x6616, 0x661d, + /* 0x42 */ + 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, + 0x662b, 0x662c, 0x662e, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637, + 0x6640, 0x6645, 0x6646, 0x664a, 0x664c, 0x6651, 0x664e, 0x6657, + 0x6658, 0x6659, 0x665b, 0x665c, 0x6660, 0x6661, 0x66fb, 0x666a, + 0x666b, 0x666c, 0x667e, 0x6673, 0x6675, 0x667f, 0x6677, 0x6678, + 0x6679, 0x667b, 0x6680, 0x667c, 0x668b, 0x668c, 0x668d, 0x6690, + 0x6692, 0x6699, 0x669a, 0x669b, 0x669c, 0x669f, 0x66a0, 0x66a4, + 0x66ad, 0x66b1, 0x66b2, 0x66b5, 0x66bb, 0x66bf, 0x66c0, 0x66c2, + 0x66c3, 0x66c8, 0x66cc, 0x66ce, 0x66cf, 0x66d4, 0x66db, 0x66df, + 0x66e8, 0x66eb, 0x66ec, 0x66ee, 0x66fa, 0x6705, 0x6707, 0x670e, + 0x6713, 0x6719, 0x671c, 0x6720, 0x6722, 0x6733, 0x673e, 0x6745, + 0x6747, 0x6748, 0x674c, 0x6754, 0x6755, 0x675d, + /* 0x43 */ + 0x6766, 0x676c, 0x676e, 0x6774, 0x6776, 0x677b, 0x6781, 0x6784, + 0x678e, 0x678f, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679b, + 0x67b0, 0x67b1, 0x67b2, 0x67b5, 0x67bb, 0x67bc, 0x67bd, 0x67f9, + 0x67c0, 0x67c2, 0x67c3, 0x67c5, 0x67c8, 0x67c9, 0x67d2, 0x67d7, + 0x67d9, 0x67dc, 0x67e1, 0x67e6, 0x67f0, 0x67f2, 0x67f6, 0x67f7, + 0x6852, 0x6814, 0x6819, 0x681d, 0x681f, 0x6828, 0x6827, 0x682c, + 0x682d, 0x682f, 0x6830, 0x6831, 0x6833, 0x683b, 0x683f, 0x6844, + 0x6845, 0x684a, 0x684c, 0x6855, 0x6857, 0x6858, 0x685b, 0x686b, + 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687a, + 0x687b, 0x687c, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898, + 0x689a, 0x689c, 0x68a1, 0x68a3, 0x68a5, 0x68a9, 0x68aa, 0x68ae, + 0x68b2, 0x68bb, 0x68c5, 0x68c8, 0x68cc, 0x68cf, + /* 0x44 */ + 0x68d0, 0x68d1, 0x68d3, 0x68d6, 0x68d9, 0x68dc, 0x68dd, 0x68e5, + 0x68e8, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68f0, 0x68f1, 0x68f5, + 0x68f6, 0x68fb, 0x68fc, 0x68fd, 0x6906, 0x6909, 0x690a, 0x6910, + 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938, + 0x693b, 0x6942, 0x6945, 0x6949, 0x694e, 0x6957, 0x695b, 0x6963, + 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696c, 0x6970, 0x6971, + 0x6972, 0x697a, 0x697b, 0x697f, 0x6980, 0x698d, 0x6992, 0x6996, + 0x6998, 0x69a1, 0x69a5, 0x69a6, 0x69a8, 0x69ab, 0x69ad, 0x69af, + 0x69b7, 0x69b8, 0x69ba, 0x69bc, 0x69c5, 0x69c8, 0x69d1, 0x69d6, + 0x69d7, 0x69e2, 0x69e5, 0x69ee, 0x69ef, 0x69f1, 0x69f3, 0x69f5, + 0x69fe, 0x6a00, 0x6a01, 0x6a03, 0x6a0f, 0x6a11, 0x6a15, 0x6a1a, + 0x6a1d, 0x6a20, 0x6a24, 0x6a28, 0x6a30, 0x6a32, + /* 0x45 */ + 0x6a34, 0x6a37, 0x6a3b, 0x6a3e, 0x6a3f, 0x6a45, 0x6a46, 0x6a49, + 0x6a4a, 0x6a4e, 0x6a50, 0x6a51, 0x6a52, 0x6a55, 0x6a56, 0x6a5b, + 0x6a64, 0x6a67, 0x6a6a, 0x6a71, 0x6a73, 0x6a7e, 0x6a81, 0x6a83, + 0x6a86, 0x6a87, 0x6a89, 0x6a8b, 0x6a91, 0x6a9b, 0x6a9d, 0x6a9e, + 0x6a9f, 0x6aa5, 0x6aab, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab4, 0x6abd, + 0x6abe, 0x6abf, 0x6ac6, 0x6ac9, 0x6ac8, 0x6acc, 0x6ad0, 0x6ad4, + 0x6ad5, 0x6ad6, 0x6adc, 0x6add, 0x6ae4, 0x6ae7, 0x6aec, 0x6af0, + 0x6af1, 0x6af2, 0x6afc, 0x6afd, 0x6b02, 0x6b03, 0x6b06, 0x6b07, + 0x6b09, 0x6b0f, 0x6b10, 0x6b11, 0x6b17, 0x6b1b, 0x6b1e, 0x6b24, + 0x6b28, 0x6b2b, 0x6b2c, 0x6b2f, 0x6b35, 0x6b36, 0x6b3b, 0x6b3f, + 0x6b46, 0x6b4a, 0x6b4d, 0x6b52, 0x6b56, 0x6b58, 0x6b5d, 0x6b60, + 0x6b67, 0x6b6b, 0x6b6e, 0x6b70, 0x6b75, 0x6b7d, + /* 0x46 */ + 0x6b7e, 0x6b82, 0x6b85, 0x6b97, 0x6b9b, 0x6b9f, 0x6ba0, 0x6ba2, + 0x6ba3, 0x6ba8, 0x6ba9, 0x6bac, 0x6bad, 0x6bae, 0x6bb0, 0x6bb8, + 0x6bb9, 0x6bbd, 0x6bbe, 0x6bc3, 0x6bc4, 0x6bc9, 0x6bcc, 0x6bd6, + 0x6bda, 0x6be1, 0x6be3, 0x6be6, 0x6be7, 0x6bee, 0x6bf1, 0x6bf7, + 0x6bf9, 0x6bff, 0x6c02, 0x6c04, 0x6c05, 0x6c09, 0x6c0d, 0x6c0e, + 0x6c10, 0x6c12, 0x6c19, 0x6c1f, 0x6c26, 0x6c27, 0x6c28, 0x6c2c, + 0x6c2e, 0x6c33, 0x6c35, 0x6c36, 0x6c3a, 0x6c3b, 0x6c3f, 0x6c4a, + 0x6c4b, 0x6c4d, 0x6c4f, 0x6c52, 0x6c54, 0x6c59, 0x6c5b, 0x6c5c, + 0x6c6b, 0x6c6d, 0x6c6f, 0x6c74, 0x6c76, 0x6c78, 0x6c79, 0x6c7b, + 0x6c85, 0x6c86, 0x6c87, 0x6c89, 0x6c94, 0x6c95, 0x6c97, 0x6c98, + 0x6c9c, 0x6c9f, 0x6cb0, 0x6cb2, 0x6cb4, 0x6cc2, 0x6cc6, 0x6ccd, + 0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd4, 0x6cd6, + /* 0x47 */ + 0x6cda, 0x6cdc, 0x6ce0, 0x6ce7, 0x6ce9, 0x6ceb, 0x6cec, 0x6cee, + 0x6cf2, 0x6cf4, 0x6d04, 0x6d07, 0x6d0a, 0x6d0e, 0x6d0f, 0x6d11, + 0x6d13, 0x6d1a, 0x6d26, 0x6d27, 0x6d28, 0x6c67, 0x6d2e, 0x6d2f, + 0x6d31, 0x6d39, 0x6d3c, 0x6d3f, 0x6d57, 0x6d5e, 0x6d5f, 0x6d61, + 0x6d65, 0x6d67, 0x6d6f, 0x6d70, 0x6d7c, 0x6d82, 0x6d87, 0x6d91, + 0x6d92, 0x6d94, 0x6d96, 0x6d97, 0x6d98, 0x6daa, 0x6dac, 0x6db4, + 0x6db7, 0x6db9, 0x6dbd, 0x6dbf, 0x6dc4, 0x6dc8, 0x6dca, 0x6dce, + 0x6dcf, 0x6dd6, 0x6ddb, 0x6ddd, 0x6ddf, 0x6de0, 0x6de2, 0x6de5, + 0x6de9, 0x6def, 0x6df0, 0x6df4, 0x6df6, 0x6dfc, 0x6e00, 0x6e04, + 0x6e1e, 0x6e22, 0x6e27, 0x6e32, 0x6e36, 0x6e39, 0x6e3b, 0x6e3c, + 0x6e44, 0x6e45, 0x6e48, 0x6e49, 0x6e4b, 0x6e4f, 0x6e51, 0x6e52, + 0x6e53, 0x6e54, 0x6e57, 0x6e5c, 0x6e5d, 0x6e5e, + /* 0x48 */ + 0x6e62, 0x6e63, 0x6e68, 0x6e73, 0x6e7b, 0x6e7d, 0x6e8d, 0x6e93, + 0x6e99, 0x6ea0, 0x6ea7, 0x6ead, 0x6eae, 0x6eb1, 0x6eb3, 0x6ebb, + 0x6ebf, 0x6ec0, 0x6ec1, 0x6ec3, 0x6ec7, 0x6ec8, 0x6eca, 0x6ecd, + 0x6ece, 0x6ecf, 0x6eeb, 0x6eed, 0x6eee, 0x6ef9, 0x6efb, 0x6efd, + 0x6f04, 0x6f08, 0x6f0a, 0x6f0c, 0x6f0d, 0x6f16, 0x6f18, 0x6f1a, + 0x6f1b, 0x6f26, 0x6f29, 0x6f2a, 0x6f2f, 0x6f30, 0x6f33, 0x6f36, + 0x6f3b, 0x6f3c, 0x6f2d, 0x6f4f, 0x6f51, 0x6f52, 0x6f53, 0x6f57, + 0x6f59, 0x6f5a, 0x6f5d, 0x6f5e, 0x6f61, 0x6f62, 0x6f68, 0x6f6c, + 0x6f7d, 0x6f7e, 0x6f83, 0x6f87, 0x6f88, 0x6f8b, 0x6f8c, 0x6f8d, + 0x6f90, 0x6f92, 0x6f93, 0x6f94, 0x6f96, 0x6f9a, 0x6f9f, 0x6fa0, + 0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fae, 0x6faf, 0x6fb0, 0x6fb5, + 0x6fb6, 0x6fbc, 0x6fc5, 0x6fc7, 0x6fc8, 0x6fca, + /* 0x49 */ + 0x6fda, 0x6fde, 0x6fe8, 0x6fe9, 0x6ff0, 0x6ff5, 0x6ff9, 0x6ffc, + 0x6ffd, 0x7000, 0x7005, 0x7006, 0x7007, 0x700d, 0x7017, 0x7020, + 0x7023, 0x702f, 0x7034, 0x7037, 0x7039, 0x703c, 0x7043, 0x7044, + 0x7048, 0x7049, 0x704a, 0x704b, 0x7054, 0x7055, 0x705d, 0x705e, + 0x704e, 0x7064, 0x7065, 0x706c, 0x706e, 0x7075, 0x7076, 0x707e, + 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, + 0x709b, 0x70a4, 0x70ab, 0x70b0, 0x70b1, 0x70b4, 0x70b7, 0x70ca, + 0x70d1, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d8, 0x70dc, 0x70e4, + 0x70fa, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710b, 0x710c, + 0x710f, 0x711e, 0x7120, 0x712b, 0x712d, 0x712f, 0x7130, 0x7131, + 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714a, 0x714b, 0x7150, + 0x7152, 0x7157, 0x715a, 0x715c, 0x715e, 0x7160, + /* 0x4a */ + 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718c, 0x7192, 0x719a, + 0x719b, 0x71a0, 0x71a2, 0x71af, 0x71b0, 0x71b2, 0x71b3, 0x71ba, + 0x71bf, 0x71c0, 0x71c1, 0x71c4, 0x71cb, 0x71cc, 0x71d3, 0x71d6, + 0x71d9, 0x71da, 0x71dc, 0x71f8, 0x71fe, 0x7200, 0x7207, 0x7208, + 0x7209, 0x7213, 0x7217, 0x721a, 0x721d, 0x721f, 0x7224, 0x722b, + 0x722f, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245, + 0x724e, 0x724f, 0x7250, 0x7253, 0x7255, 0x7256, 0x725a, 0x725c, + 0x725e, 0x7260, 0x7263, 0x7268, 0x726b, 0x726e, 0x726f, 0x7271, + 0x7277, 0x7278, 0x727b, 0x727c, 0x727f, 0x7284, 0x7289, 0x728d, + 0x728e, 0x7293, 0x729b, 0x72a8, 0x72ad, 0x72ae, 0x72b1, 0x72b4, + 0x72be, 0x72c1, 0x72c7, 0x72c9, 0x72cc, 0x72d5, 0x72d6, 0x72d8, + 0x72df, 0x72e5, 0x72f3, 0x72f4, 0x72fa, 0x72fb, + /* 0x4b */ + 0x72fe, 0x7302, 0x7304, 0x7305, 0x7307, 0x730b, 0x730d, 0x7312, + 0x7313, 0x7318, 0x7319, 0x731e, 0x7322, 0x7324, 0x7327, 0x7328, + 0x732c, 0x7331, 0x7332, 0x7335, 0x733a, 0x733b, 0x733d, 0x7343, + 0x734d, 0x7350, 0x7352, 0x7356, 0x7358, 0x735d, 0x735e, 0x735f, + 0x7360, 0x7366, 0x7367, 0x7369, 0x736b, 0x736c, 0x736e, 0x736f, + 0x7371, 0x7377, 0x7379, 0x737c, 0x7380, 0x7381, 0x7383, 0x7385, + 0x7386, 0x738e, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739c, + 0x739e, 0x739f, 0x73a0, 0x73a2, 0x73a5, 0x73a6, 0x73aa, 0x73ab, + 0x73ad, 0x73b5, 0x73b7, 0x73b9, 0x73bc, 0x73bd, 0x73bf, 0x73c5, + 0x73c6, 0x73c9, 0x73cb, 0x73cc, 0x73cf, 0x73d2, 0x73d3, 0x73d6, + 0x73d9, 0x73dd, 0x73e1, 0x73e3, 0x73e6, 0x73e7, 0x73e9, 0x73f4, + 0x73f5, 0x73f7, 0x73f9, 0x73fa, 0x73fb, 0x73fd, + /* 0x4c */ + 0x73ff, 0x7400, 0x7401, 0x7404, 0x7407, 0x740a, 0x7411, 0x741a, + 0x741b, 0x7424, 0x7426, 0x7428, 0x7429, 0x742a, 0x742b, 0x742c, + 0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443, + 0x7444, 0x7446, 0x7447, 0x744b, 0x744d, 0x7451, 0x7452, 0x7457, + 0x745d, 0x7462, 0x7466, 0x7467, 0x7468, 0x746b, 0x746d, 0x746e, + 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489, + 0x748f, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749a, 0x749c, + 0x749f, 0x74a0, 0x74a1, 0x74a3, 0x74a6, 0x74a8, 0x74a9, 0x74aa, + 0x74ab, 0x74ae, 0x74af, 0x74b1, 0x74b2, 0x74b5, 0x74b9, 0x74bb, + 0x74bf, 0x74c8, 0x74c9, 0x74cc, 0x74d0, 0x74d3, 0x74d8, 0x74da, + 0x74db, 0x74de, 0x74df, 0x74e4, 0x74e8, 0x74ea, 0x74eb, 0x74ef, + 0x74f4, 0x74fa, 0x74fb, 0x74fc, 0x74ff, 0x7506, + /* 0x4d */ + 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529, + 0x752a, 0x752f, 0x7536, 0x7539, 0x753d, 0x753e, 0x753f, 0x7540, + 0x7543, 0x7547, 0x7548, 0x754e, 0x7550, 0x7552, 0x7557, 0x755e, + 0x755f, 0x7561, 0x756f, 0x7571, 0x7579, 0x757a, 0x757b, 0x757c, + 0x757d, 0x757e, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595, + 0x7599, 0x759c, 0x75a2, 0x75a4, 0x75b4, 0x75ba, 0x75bf, 0x75c0, + 0x75c1, 0x75c4, 0x75c6, 0x75cc, 0x75ce, 0x75cf, 0x75d7, 0x75dc, + 0x75df, 0x75e0, 0x75e1, 0x75e4, 0x75e7, 0x75ec, 0x75ee, 0x75ef, + 0x75f1, 0x75f9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608, + 0x760a, 0x760c, 0x760f, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619, + 0x761b, 0x761c, 0x761d, 0x761e, 0x7623, 0x7625, 0x7626, 0x7629, + 0x762d, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639, + /* 0x4e */ + 0x763a, 0x763c, 0x764a, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645, + 0x7649, 0x764b, 0x7655, 0x7659, 0x765f, 0x7664, 0x7665, 0x766d, + 0x766e, 0x766f, 0x7671, 0x7674, 0x7681, 0x7685, 0x768c, 0x768d, + 0x7695, 0x769b, 0x769c, 0x769d, 0x769f, 0x76a0, 0x76a2, 0x76a3, + 0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76aa, 0x76ad, 0x76bd, + 0x76c1, 0x76c5, 0x76c9, 0x76cb, 0x76cc, 0x76ce, 0x76d4, 0x76d9, + 0x76e0, 0x76e6, 0x76e8, 0x76ec, 0x76f0, 0x76f1, 0x76f6, 0x76f9, + 0x76fc, 0x7700, 0x7706, 0x770a, 0x770e, 0x7712, 0x7714, 0x7715, + 0x7717, 0x7719, 0x771a, 0x771c, 0x7722, 0x7728, 0x772d, 0x772e, + 0x772f, 0x7734, 0x7735, 0x7736, 0x7739, 0x773d, 0x773e, 0x7742, + 0x7745, 0x7746, 0x774a, 0x774d, 0x774e, 0x774f, 0x7752, 0x7756, + 0x7757, 0x775c, 0x775e, 0x775f, 0x7760, 0x7762, + /* 0x4f */ + 0x7764, 0x7767, 0x776a, 0x776c, 0x7770, 0x7772, 0x7773, 0x7774, + 0x777a, 0x777d, 0x7780, 0x7784, 0x778c, 0x778d, 0x7794, 0x7795, + 0x7796, 0x779a, 0x779f, 0x77a2, 0x77a7, 0x77aa, 0x77ae, 0x77af, + 0x77b1, 0x77b5, 0x77be, 0x77c3, 0x77c9, 0x77d1, 0x77d2, 0x77d5, + 0x77d9, 0x77de, 0x77df, 0x77e0, 0x77e4, 0x77e6, 0x77ea, 0x77ec, + 0x77f0, 0x77f1, 0x77f4, 0x77f8, 0x77fb, 0x7805, 0x7806, 0x7809, + 0x780d, 0x780e, 0x7811, 0x781d, 0x7821, 0x7822, 0x7823, 0x782d, + 0x782e, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848, + 0x784c, 0x784e, 0x7852, 0x785c, 0x785e, 0x7860, 0x7861, 0x7863, + 0x7864, 0x7868, 0x786a, 0x786e, 0x787a, 0x787e, 0x788a, 0x788f, + 0x7894, 0x7898, 0x78a1, 0x789d, 0x789e, 0x789f, 0x78a4, 0x78a8, + 0x78ac, 0x78ad, 0x78b0, 0x78b1, 0x78b2, 0x78b3, + /* 0x50 */ + 0x78bb, 0x78bd, 0x78bf, 0x78c7, 0x78c8, 0x78c9, 0x78cc, 0x78ce, + 0x78d2, 0x78d3, 0x78d5, 0x78d6, 0x78e4, 0x78db, 0x78df, 0x78e0, + 0x78e1, 0x78e6, 0x78ea, 0x78f2, 0x78f3, 0x7900, 0x78f6, 0x78f7, + 0x78fa, 0x78fb, 0x78ff, 0x7906, 0x790c, 0x7910, 0x791a, 0x791c, + 0x791e, 0x791f, 0x7920, 0x7925, 0x7927, 0x7929, 0x792d, 0x7931, + 0x7934, 0x7935, 0x793b, 0x793d, 0x793f, 0x7944, 0x7945, 0x7946, + 0x794a, 0x794b, 0x794f, 0x7951, 0x7954, 0x7958, 0x795b, 0x795c, + 0x7967, 0x7969, 0x796b, 0x7972, 0x7979, 0x797b, 0x797c, 0x797e, + 0x798b, 0x798c, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998, + 0x799b, 0x799c, 0x79a1, 0x79a8, 0x79a9, 0x79ab, 0x79af, 0x79b1, + 0x79b4, 0x79b8, 0x79bb, 0x79c2, 0x79c4, 0x79c7, 0x79c8, 0x79ca, + 0x79cf, 0x79d4, 0x79d6, 0x79da, 0x79dd, 0x79de, + /* 0x51 */ + 0x79e0, 0x79e2, 0x79e5, 0x79ea, 0x79eb, 0x79ed, 0x79f1, 0x79f8, + 0x79fc, 0x7a02, 0x7a03, 0x7a07, 0x7a09, 0x7a0a, 0x7a0c, 0x7a11, + 0x7a15, 0x7a1b, 0x7a1e, 0x7a21, 0x7a27, 0x7a2b, 0x7a2d, 0x7a2f, + 0x7a30, 0x7a34, 0x7a35, 0x7a38, 0x7a39, 0x7a3a, 0x7a44, 0x7a45, + 0x7a47, 0x7a48, 0x7a4c, 0x7a55, 0x7a56, 0x7a59, 0x7a5c, 0x7a5d, + 0x7a5f, 0x7a60, 0x7a65, 0x7a67, 0x7a6a, 0x7a6d, 0x7a75, 0x7a78, + 0x7a7e, 0x7a80, 0x7a82, 0x7a85, 0x7a86, 0x7a8a, 0x7a8b, 0x7a90, + 0x7a91, 0x7a94, 0x7a9e, 0x7aa0, 0x7aa3, 0x7aac, 0x7ab3, 0x7ab5, + 0x7ab9, 0x7abb, 0x7abc, 0x7ac6, 0x7ac9, 0x7acc, 0x7ace, 0x7ad1, + 0x7adb, 0x7ae8, 0x7ae9, 0x7aeb, 0x7aec, 0x7af1, 0x7af4, 0x7afb, + 0x7afd, 0x7afe, 0x7b07, 0x7b14, 0x7b1f, 0x7b23, 0x7b27, 0x7b29, + 0x7b2a, 0x7b2b, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30, + /* 0x52 */ + 0x7b31, 0x7b34, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b47, 0x7b4e, + 0x7b55, 0x7b60, 0x7b64, 0x7b66, 0x7b69, 0x7b6a, 0x7b6d, 0x7b6f, + 0x7b72, 0x7b73, 0x7b77, 0x7b84, 0x7b89, 0x7b8e, 0x7b90, 0x7b91, + 0x7b96, 0x7b9b, 0x7b9e, 0x7ba0, 0x7ba5, 0x7bac, 0x7baf, 0x7bb0, + 0x7bb2, 0x7bb5, 0x7bb6, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bc2, + 0x7bc5, 0x7bc8, 0x7bca, 0x7bd4, 0x7bd6, 0x7bd7, 0x7bd9, 0x7bda, + 0x7bdb, 0x7be8, 0x7bea, 0x7bf2, 0x7bf4, 0x7bf5, 0x7bf8, 0x7bf9, + 0x7bfa, 0x7bfc, 0x7bfe, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c06, + 0x7c09, 0x7c0b, 0x7c0c, 0x7c0e, 0x7c0f, 0x7c19, 0x7c1b, 0x7c20, + 0x7c25, 0x7c26, 0x7c28, 0x7c2c, 0x7c31, 0x7c33, 0x7c34, 0x7c36, + 0x7c39, 0x7c3a, 0x7c46, 0x7c4a, 0x7c55, 0x7c51, 0x7c52, 0x7c53, + 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, + /* 0x53 */ + 0x7c61, 0x7c63, 0x7c67, 0x7c69, 0x7c6d, 0x7c6e, 0x7c70, 0x7c72, + 0x7c79, 0x7c7c, 0x7c7d, 0x7c86, 0x7c87, 0x7c8f, 0x7c94, 0x7c9e, + 0x7ca0, 0x7ca6, 0x7cb0, 0x7cb6, 0x7cb7, 0x7cba, 0x7cbb, 0x7cbc, + 0x7cbf, 0x7cc4, 0x7cc7, 0x7cc8, 0x7cc9, 0x7ccd, 0x7ccf, 0x7cd3, + 0x7cd4, 0x7cd5, 0x7cd7, 0x7cd9, 0x7cda, 0x7cdd, 0x7ce6, 0x7ce9, + 0x7ceb, 0x7cf5, 0x7d03, 0x7d07, 0x7d08, 0x7d09, 0x7d0f, 0x7d11, + 0x7d12, 0x7d13, 0x7d16, 0x7d1d, 0x7d1e, 0x7d23, 0x7d26, 0x7d2a, + 0x7d2d, 0x7d31, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d40, 0x7d41, 0x7d47, + 0x7d48, 0x7d4d, 0x7d51, 0x7d53, 0x7d57, 0x7d59, 0x7d5a, 0x7d5c, + 0x7d5d, 0x7d65, 0x7d67, 0x7d6a, 0x7d70, 0x7d78, 0x7d7a, 0x7d7b, + 0x7d7f, 0x7d81, 0x7d82, 0x7d83, 0x7d85, 0x7d86, 0x7d88, 0x7d8b, + 0x7d8c, 0x7d8d, 0x7d91, 0x7d96, 0x7d97, 0x7d9d, + /* 0x54 */ + 0x7d9e, 0x7da6, 0x7da7, 0x7daa, 0x7db3, 0x7db6, 0x7db7, 0x7db9, + 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dcc, 0x7dcd, 0x7dce, + 0x7dd7, 0x7dd9, 0x7e00, 0x7de2, 0x7de5, 0x7de6, 0x7dea, 0x7deb, + 0x7ded, 0x7df1, 0x7df5, 0x7df6, 0x7df9, 0x7dfa, 0x7e08, 0x7e10, + 0x7e11, 0x7e15, 0x7e17, 0x7e1c, 0x7e1d, 0x7e20, 0x7e27, 0x7e28, + 0x7e2c, 0x7e2d, 0x7e2f, 0x7e33, 0x7e36, 0x7e3f, 0x7e44, 0x7e45, + 0x7e47, 0x7e4e, 0x7e50, 0x7e52, 0x7e58, 0x7e5f, 0x7e61, 0x7e62, + 0x7e65, 0x7e6b, 0x7e6e, 0x7e6f, 0x7e73, 0x7e78, 0x7e7e, 0x7e81, + 0x7e86, 0x7e87, 0x7e8a, 0x7e8d, 0x7e91, 0x7e95, 0x7e98, 0x7e9a, + 0x7e9d, 0x7e9e, 0x7f3c, 0x7f3b, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f43, + 0x7f44, 0x7f47, 0x7f4f, 0x7f52, 0x7f53, 0x7f5b, 0x7f5c, 0x7f5d, + 0x7f61, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f6d, + /* 0x55 */ + 0x7f71, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f8b, 0x7f8d, 0x7f8f, + 0x7f90, 0x7f91, 0x7f96, 0x7f97, 0x7f9c, 0x7fa1, 0x7fa2, 0x7fa6, + 0x7faa, 0x7fad, 0x7fb4, 0x7fbc, 0x7fbf, 0x7fc0, 0x7fc3, 0x7fc8, + 0x7fce, 0x7fcf, 0x7fdb, 0x7fdf, 0x7fe3, 0x7fe5, 0x7fe8, 0x7fec, + 0x7fee, 0x7fef, 0x7ff2, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8007, + 0x8008, 0x800a, 0x800d, 0x800e, 0x800f, 0x8011, 0x8013, 0x8014, + 0x8016, 0x801d, 0x801e, 0x801f, 0x8020, 0x8024, 0x8026, 0x802c, + 0x802e, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803a, 0x803c, + 0x803e, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806d, 0x8071, + 0x8075, 0x8081, 0x8088, 0x808e, 0x809c, 0x809e, 0x80a6, 0x80a7, + 0x80ab, 0x80b8, 0x80b9, 0x80c8, 0x80cd, 0x80cf, 0x80d2, 0x80d4, + 0x80d5, 0x80d7, 0x80d8, 0x80e0, 0x80ed, 0x80ee, + /* 0x56 */ + 0x80f0, 0x80f2, 0x80f3, 0x80f6, 0x80f9, 0x80fa, 0x80fe, 0x8103, + 0x810b, 0x8116, 0x8117, 0x8118, 0x811c, 0x811e, 0x8120, 0x8124, + 0x8127, 0x812c, 0x8130, 0x8135, 0x813a, 0x813c, 0x8145, 0x8147, + 0x814a, 0x814c, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168, + 0x8169, 0x816d, 0x816f, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185, + 0x8186, 0x818b, 0x818e, 0x8196, 0x8198, 0x819b, 0x819e, 0x81a2, + 0x81ae, 0x81b2, 0x81b4, 0x81bb, 0x81cb, 0x81c3, 0x81c5, 0x81ca, + 0x81ce, 0x81cf, 0x81d5, 0x81d7, 0x81db, 0x81dd, 0x81de, 0x81e1, + 0x81e4, 0x81eb, 0x81ec, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, + 0x81f8, 0x81f9, 0x81fd, 0x81ff, 0x8200, 0x8203, 0x820f, 0x8213, + 0x8214, 0x8219, 0x821a, 0x821d, 0x8221, 0x8222, 0x8228, 0x8232, + 0x8234, 0x823a, 0x8243, 0x8244, 0x8245, 0x8246, + /* 0x57 */ + 0x824b, 0x824e, 0x824f, 0x8251, 0x8256, 0x825c, 0x8260, 0x8263, + 0x8267, 0x826d, 0x8274, 0x827b, 0x827d, 0x827f, 0x8280, 0x8281, + 0x8283, 0x8284, 0x8287, 0x8289, 0x828a, 0x828e, 0x8291, 0x8294, + 0x8296, 0x8298, 0x829a, 0x829b, 0x82a0, 0x82a1, 0x82a3, 0x82a4, + 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ae, 0x82b0, 0x82b2, 0x82b4, + 0x82b7, 0x82ba, 0x82bc, 0x82be, 0x82bf, 0x82c6, 0x82d0, 0x82d5, + 0x82da, 0x82e0, 0x82e2, 0x82e4, 0x82e8, 0x82ea, 0x82ed, 0x82ef, + 0x82f6, 0x82f7, 0x82fd, 0x82fe, 0x8300, 0x8301, 0x8307, 0x8308, + 0x830a, 0x830b, 0x8354, 0x831b, 0x831d, 0x831e, 0x831f, 0x8321, + 0x8322, 0x832c, 0x832d, 0x832e, 0x8330, 0x8333, 0x8337, 0x833a, + 0x833c, 0x833d, 0x8342, 0x8343, 0x8344, 0x8347, 0x834d, 0x834e, + 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378, + /* 0x58 */ + 0x837d, 0x837f, 0x8380, 0x8382, 0x8384, 0x8386, 0x838d, 0x8392, + 0x8394, 0x8395, 0x8398, 0x8399, 0x839b, 0x839c, 0x839d, 0x83a6, + 0x83a7, 0x83a9, 0x83ac, 0x83be, 0x83bf, 0x83c0, 0x83c7, 0x83c9, + 0x83cf, 0x83d0, 0x83d1, 0x83d4, 0x83dd, 0x8353, 0x83e8, 0x83ea, + 0x83f6, 0x83f8, 0x83f9, 0x83fc, 0x8401, 0x8406, 0x840a, 0x840f, + 0x8411, 0x8415, 0x8419, 0x83ad, 0x842f, 0x8439, 0x8445, 0x8447, + 0x8448, 0x844a, 0x844d, 0x844f, 0x8451, 0x8452, 0x8456, 0x8458, + 0x8459, 0x845a, 0x845c, 0x8460, 0x8464, 0x8465, 0x8467, 0x846a, + 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847c, 0x847d, 0x8481, + 0x8485, 0x8492, 0x8493, 0x8495, 0x849e, 0x84a6, 0x84a8, 0x84a9, + 0x84aa, 0x84af, 0x84b1, 0x84b4, 0x84ba, 0x84bd, 0x84be, 0x84c0, + 0x84c2, 0x84c7, 0x84c8, 0x84cc, 0x84cf, 0x84d3, + /* 0x59 */ + 0x84dc, 0x84e7, 0x84ea, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f7, + 0x8532, 0x84fa, 0x84fb, 0x84fd, 0x8502, 0x8503, 0x8507, 0x850c, + 0x850e, 0x8510, 0x851c, 0x851e, 0x8522, 0x8523, 0x8524, 0x8525, + 0x8527, 0x852a, 0x852b, 0x852f, 0x8533, 0x8534, 0x8536, 0x853f, + 0x8546, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559, + 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8564, + 0x856b, 0x856f, 0x8579, 0x857a, 0x857b, 0x857d, 0x857f, 0x8581, + 0x8585, 0x8586, 0x8589, 0x858b, 0x858c, 0x858f, 0x8593, 0x8598, + 0x859d, 0x859f, 0x85a0, 0x85a2, 0x85a5, 0x85a7, 0x85b4, 0x85b6, + 0x85b7, 0x85b8, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c2, 0x85c7, + 0x85ca, 0x85cb, 0x85ce, 0x85ad, 0x85d8, 0x85da, 0x85df, 0x85e0, + 0x85e6, 0x85e8, 0x85ed, 0x85f3, 0x85f6, 0x85fc, + /* 0x5a */ + 0x85ff, 0x8600, 0x8604, 0x8605, 0x860d, 0x860e, 0x8610, 0x8611, + 0x8612, 0x8618, 0x8619, 0x861b, 0x861e, 0x8621, 0x8627, 0x8629, + 0x8636, 0x8638, 0x863a, 0x863c, 0x863d, 0x8640, 0x8642, 0x8646, + 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865d, 0x8660, + 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866c, 0x866f, 0x8675, + 0x8676, 0x8677, 0x867a, 0x868d, 0x8691, 0x8696, 0x8698, 0x869a, + 0x869c, 0x86a1, 0x86a6, 0x86a7, 0x86a8, 0x86ad, 0x86b1, 0x86b3, + 0x86b4, 0x86b5, 0x86b7, 0x86b8, 0x86b9, 0x86bf, 0x86c0, 0x86c1, + 0x86c3, 0x86c5, 0x86d1, 0x86d2, 0x86d5, 0x86d7, 0x86da, 0x86dc, + 0x86e0, 0x86e3, 0x86e5, 0x86e7, 0x8688, 0x86fa, 0x86fc, 0x86fd, + 0x8704, 0x8705, 0x8707, 0x870b, 0x870e, 0x870f, 0x8710, 0x8713, + 0x8714, 0x8719, 0x871e, 0x871f, 0x8721, 0x8723, + /* 0x5b */ + 0x8728, 0x872e, 0x872f, 0x8731, 0x8732, 0x8739, 0x873a, 0x873c, + 0x873d, 0x873e, 0x8740, 0x8743, 0x8745, 0x874d, 0x8758, 0x875d, + 0x8761, 0x8764, 0x8765, 0x876f, 0x8771, 0x8772, 0x877b, 0x8783, + 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878b, 0x878c, + 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879e, 0x87a0, + 0x87a3, 0x87a7, 0x87ac, 0x87ad, 0x87ae, 0x87b1, 0x87b5, 0x87be, + 0x87bf, 0x87c1, 0x87c8, 0x87c9, 0x87ca, 0x87ce, 0x87d5, 0x87d6, + 0x87d9, 0x87da, 0x87dc, 0x87df, 0x87e2, 0x87e3, 0x87e4, 0x87ea, + 0x87eb, 0x87ed, 0x87f1, 0x87f3, 0x87f8, 0x87fa, 0x87ff, 0x8801, + 0x8803, 0x8806, 0x8809, 0x880a, 0x880b, 0x8810, 0x8819, 0x8812, + 0x8813, 0x8814, 0x8818, 0x881a, 0x881b, 0x881c, 0x881e, 0x881f, + 0x8828, 0x882d, 0x882e, 0x8830, 0x8832, 0x8835, + /* 0x5c */ + 0x883a, 0x883c, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884a, + 0x884b, 0x884e, 0x8851, 0x8855, 0x8856, 0x8858, 0x885a, 0x885c, + 0x885f, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887b, 0x8880, + 0x8898, 0x889a, 0x889b, 0x889c, 0x889f, 0x88a0, 0x88a8, 0x88aa, + 0x88ba, 0x88bd, 0x88be, 0x88c0, 0x88ca, 0x88cb, 0x88cc, 0x88cd, + 0x88ce, 0x88d1, 0x88d2, 0x88d3, 0x88db, 0x88de, 0x88e7, 0x88ef, + 0x88f0, 0x88f1, 0x88f5, 0x88f7, 0x8901, 0x8906, 0x890d, 0x890e, + 0x890f, 0x8915, 0x8916, 0x8918, 0x8919, 0x891a, 0x891c, 0x8920, + 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939, + 0x893a, 0x893e, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894f, + 0x8952, 0x8957, 0x895a, 0x895b, 0x895c, 0x8961, 0x8962, 0x8963, + 0x896b, 0x896e, 0x8970, 0x8973, 0x8975, 0x897a, + /* 0x5d */ + 0x897b, 0x897c, 0x897d, 0x8989, 0x898d, 0x8990, 0x8994, 0x8995, + 0x899b, 0x899c, 0x899f, 0x89a0, 0x89a5, 0x89b0, 0x89b4, 0x89b5, + 0x89b6, 0x89b7, 0x89bc, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, + 0x89e5, 0x89e9, 0x89eb, 0x89ed, 0x89f1, 0x89f3, 0x89f6, 0x89f9, + 0x89fd, 0x89ff, 0x8a04, 0x8a05, 0x8a07, 0x8a0f, 0x8a11, 0x8a12, + 0x8a14, 0x8a15, 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a2b, + 0x8a2c, 0x8a2f, 0x8a35, 0x8a37, 0x8a3d, 0x8a3e, 0x8a40, 0x8a43, + 0x8a45, 0x8a47, 0x8a49, 0x8a4d, 0x8a4e, 0x8a53, 0x8a56, 0x8a57, + 0x8a58, 0x8a5c, 0x8a5d, 0x8a61, 0x8a65, 0x8a67, 0x8a75, 0x8a76, + 0x8a77, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7e, 0x8a7f, 0x8a80, 0x8a83, + 0x8a86, 0x8a8b, 0x8a8f, 0x8a90, 0x8a92, 0x8a96, 0x8a97, 0x8a99, + 0x8a9f, 0x8aa7, 0x8aa9, 0x8aae, 0x8aaf, 0x8ab3, + /* 0x5e */ + 0x8ab6, 0x8ab7, 0x8abb, 0x8abe, 0x8ac3, 0x8ac6, 0x8ac8, 0x8ac9, + 0x8aca, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad7, 0x8add, 0x8adf, + 0x8aec, 0x8af0, 0x8af4, 0x8af5, 0x8af6, 0x8afc, 0x8aff, 0x8b05, + 0x8b06, 0x8b0b, 0x8b11, 0x8b1c, 0x8b1e, 0x8b1f, 0x8b0a, 0x8b2d, + 0x8b30, 0x8b37, 0x8b3c, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, + 0x8b48, 0x8b52, 0x8b53, 0x8b54, 0x8b59, 0x8b4d, 0x8b5e, 0x8b63, + 0x8b6d, 0x8b76, 0x8b78, 0x8b79, 0x8b7c, 0x8b7e, 0x8b81, 0x8b84, + 0x8b85, 0x8b8b, 0x8b8d, 0x8b8f, 0x8b94, 0x8b95, 0x8b9c, 0x8b9e, + 0x8b9f, 0x8c38, 0x8c39, 0x8c3d, 0x8c3e, 0x8c45, 0x8c47, 0x8c49, + 0x8c4b, 0x8c4f, 0x8c51, 0x8c53, 0x8c54, 0x8c57, 0x8c58, 0x8c5b, + 0x8c5d, 0x8c59, 0x8c63, 0x8c64, 0x8c66, 0x8c68, 0x8c69, 0x8c6d, + 0x8c73, 0x8c75, 0x8c76, 0x8c7b, 0x8c7e, 0x8c86, + /* 0x5f */ + 0x8c87, 0x8c8b, 0x8c90, 0x8c92, 0x8c93, 0x8c99, 0x8c9b, 0x8c9c, + 0x8ca4, 0x8cb9, 0x8cba, 0x8cc5, 0x8cc6, 0x8cc9, 0x8ccb, 0x8ccf, + 0x8cd6, 0x8cd5, 0x8cd9, 0x8cdd, 0x8ce1, 0x8ce8, 0x8cec, 0x8cef, + 0x8cf0, 0x8cf2, 0x8cf5, 0x8cf7, 0x8cf8, 0x8cfe, 0x8cff, 0x8d01, + 0x8d03, 0x8d09, 0x8d12, 0x8d17, 0x8d1b, 0x8d65, 0x8d69, 0x8d6c, + 0x8d6e, 0x8d7f, 0x8d82, 0x8d84, 0x8d88, 0x8d8d, 0x8d90, 0x8d91, + 0x8d95, 0x8d9e, 0x8d9f, 0x8da0, 0x8da6, 0x8dab, 0x8dac, 0x8daf, + 0x8db2, 0x8db5, 0x8db7, 0x8db9, 0x8dbb, 0x8dc0, 0x8dc5, 0x8dc6, + 0x8dc7, 0x8dc8, 0x8dca, 0x8dce, 0x8dd1, 0x8dd4, 0x8dd5, 0x8dd7, + 0x8dd9, 0x8de4, 0x8de5, 0x8de7, 0x8dec, 0x8df0, 0x8dbc, 0x8df1, + 0x8df2, 0x8df4, 0x8dfd, 0x8e01, 0x8e04, 0x8e05, 0x8e06, 0x8e0b, + 0x8e11, 0x8e14, 0x8e16, 0x8e20, 0x8e21, 0x8e22, + /* 0x60 */ + 0x8e23, 0x8e26, 0x8e27, 0x8e31, 0x8e33, 0x8e36, 0x8e37, 0x8e38, + 0x8e39, 0x8e3d, 0x8e40, 0x8e41, 0x8e4b, 0x8e4d, 0x8e4e, 0x8e4f, + 0x8e54, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e61, 0x8e62, 0x8e69, + 0x8e6c, 0x8e6d, 0x8e6f, 0x8e70, 0x8e71, 0x8e79, 0x8e7a, 0x8e7b, + 0x8e82, 0x8e83, 0x8e89, 0x8e90, 0x8e92, 0x8e95, 0x8e9a, 0x8e9b, + 0x8e9d, 0x8e9e, 0x8ea2, 0x8ea7, 0x8ea9, 0x8ead, 0x8eae, 0x8eb3, + 0x8eb5, 0x8eba, 0x8ebb, 0x8ec0, 0x8ec1, 0x8ec3, 0x8ec4, 0x8ec7, + 0x8ecf, 0x8ed1, 0x8ed4, 0x8edc, 0x8ee8, 0x8eee, 0x8ef0, 0x8ef1, + 0x8ef7, 0x8ef9, 0x8efa, 0x8eed, 0x8f00, 0x8f02, 0x8f07, 0x8f08, + 0x8f0f, 0x8f10, 0x8f16, 0x8f17, 0x8f18, 0x8f1e, 0x8f20, 0x8f21, + 0x8f23, 0x8f25, 0x8f27, 0x8f28, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f34, + 0x8f35, 0x8f36, 0x8f37, 0x8f3a, 0x8f40, 0x8f41, + /* 0x61 */ + 0x8f43, 0x8f47, 0x8f4f, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, + 0x8f58, 0x8f5d, 0x8f5e, 0x8f65, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa4, + 0x8fa5, 0x8fa6, 0x8fb5, 0x8fb6, 0x8fb8, 0x8fbe, 0x8fc0, 0x8fc1, + 0x8fc6, 0x8fca, 0x8fcb, 0x8fcd, 0x8fd0, 0x8fd2, 0x8fd3, 0x8fd5, + 0x8fe0, 0x8fe3, 0x8fe4, 0x8fe8, 0x8fee, 0x8ff1, 0x8ff5, 0x8ff6, + 0x8ffb, 0x8ffe, 0x9002, 0x9004, 0x9008, 0x900c, 0x9018, 0x901b, + 0x9028, 0x9029, 0x902f, 0x902a, 0x902c, 0x902d, 0x9033, 0x9034, + 0x9037, 0x903f, 0x9043, 0x9044, 0x904c, 0x905b, 0x905d, 0x9062, + 0x9066, 0x9067, 0x906c, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088, + 0x908b, 0x908c, 0x908e, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099, + 0x909b, 0x90a0, 0x90a1, 0x90a2, 0x90a5, 0x90b0, 0x90b2, 0x90b3, + 0x90b4, 0x90b6, 0x90bd, 0x90cc, 0x90be, 0x90c3, + /* 0x62 */ + 0x90c4, 0x90c5, 0x90c7, 0x90c8, 0x90d5, 0x90d7, 0x90d8, 0x90d9, + 0x90dc, 0x90dd, 0x90df, 0x90e5, 0x90d2, 0x90f6, 0x90eb, 0x90ef, + 0x90f0, 0x90f4, 0x90fe, 0x90ff, 0x9100, 0x9104, 0x9105, 0x9106, + 0x9108, 0x910d, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911a, + 0x911c, 0x911e, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129, + 0x912e, 0x912f, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913a, + 0x913c, 0x913d, 0x9143, 0x9147, 0x9148, 0x914f, 0x9153, 0x9157, + 0x9159, 0x915a, 0x915b, 0x9161, 0x9164, 0x9167, 0x916d, 0x9174, + 0x9179, 0x917a, 0x917b, 0x9181, 0x9183, 0x9185, 0x9186, 0x918a, + 0x918e, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919e, 0x91a1, + 0x91a6, 0x91a8, 0x91ac, 0x91ad, 0x91ae, 0x91b0, 0x91b1, 0x91b2, + 0x91b3, 0x91b6, 0x91bb, 0x91bc, 0x91bd, 0x91bf, + /* 0x63 */ + 0x91c2, 0x91c3, 0x91c5, 0x91d3, 0x91d4, 0x91d7, 0x91d9, 0x91da, + 0x91de, 0x91e4, 0x91e5, 0x91e9, 0x91ea, 0x91ec, 0x91ed, 0x91ee, + 0x91ef, 0x91f0, 0x91f1, 0x91f7, 0x91f9, 0x91fb, 0x91fd, 0x9200, + 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920a, 0x920c, + 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921c, 0x921d, 0x9223, + 0x9224, 0x9225, 0x9226, 0x9228, 0x922e, 0x922f, 0x9230, 0x9233, + 0x9235, 0x9236, 0x9238, 0x9239, 0x923a, 0x923c, 0x923e, 0x9240, + 0x9242, 0x9243, 0x9246, 0x9247, 0x924a, 0x924d, 0x924e, 0x924f, + 0x9251, 0x9258, 0x9259, 0x925c, 0x925d, 0x9260, 0x9261, 0x9265, + 0x9267, 0x9268, 0x9269, 0x926e, 0x926f, 0x9270, 0x9275, 0x9276, + 0x9277, 0x9278, 0x9279, 0x927b, 0x927c, 0x927d, 0x927f, 0x9288, + 0x9289, 0x928a, 0x928d, 0x928e, 0x9292, 0x9297, + /* 0x64 */ + 0x9299, 0x929f, 0x92a0, 0x92a4, 0x92a5, 0x92a7, 0x92a8, 0x92ab, + 0x92af, 0x92b2, 0x92b6, 0x92b8, 0x92ba, 0x92bb, 0x92bc, 0x92bd, + 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c5, 0x92c6, 0x92c7, + 0x92c8, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92d0, 0x92d3, 0x92d5, + 0x92d7, 0x92d8, 0x92d9, 0x92dc, 0x92dd, 0x92df, 0x92e0, 0x92e1, + 0x92e3, 0x92e5, 0x92e7, 0x92e8, 0x92ec, 0x92ee, 0x92f0, 0x92f9, + 0x92fb, 0x92ff, 0x9300, 0x9302, 0x9308, 0x930d, 0x9311, 0x9314, + 0x9315, 0x931c, 0x931d, 0x931e, 0x931f, 0x9321, 0x9324, 0x9325, + 0x9327, 0x9329, 0x932a, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347, + 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358, + 0x935a, 0x935e, 0x9364, 0x9365, 0x9367, 0x9369, 0x936a, 0x936d, + 0x936f, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376, + /* 0x65 */ + 0x937a, 0x937d, 0x937f, 0x9380, 0x9381, 0x9382, 0x9388, 0x938a, + 0x938b, 0x938d, 0x938f, 0x9392, 0x9395, 0x9398, 0x939b, 0x939e, + 0x93a1, 0x93a3, 0x93a4, 0x93a6, 0x93a8, 0x93ab, 0x93b4, 0x93b5, + 0x93b6, 0x93ba, 0x93a9, 0x93c1, 0x93c4, 0x93c5, 0x93c6, 0x93c7, + 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93d3, 0x93d9, 0x93dc, + 0x93de, 0x93df, 0x93e2, 0x93e6, 0x93e7, 0x93f9, 0x93f7, 0x93f8, + 0x93fa, 0x93fb, 0x93fd, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409, + 0x940d, 0x940e, 0x940f, 0x9415, 0x9416, 0x9417, 0x941f, 0x942e, + 0x942f, 0x9431, 0x9432, 0x9433, 0x9434, 0x943b, 0x943f, 0x943d, + 0x9443, 0x9445, 0x9448, 0x944a, 0x944c, 0x9455, 0x9459, 0x945c, + 0x945f, 0x9461, 0x9463, 0x9468, 0x946b, 0x946d, 0x946e, 0x946f, + 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579, + /* 0x66 */ + 0x957e, 0x9584, 0x9588, 0x958c, 0x958d, 0x958e, 0x959d, 0x959e, + 0x959f, 0x95a1, 0x95a6, 0x95a9, 0x95ab, 0x95ac, 0x95b4, 0x95b6, + 0x95ba, 0x95bd, 0x95bf, 0x95c6, 0x95c8, 0x95c9, 0x95cb, 0x95d0, + 0x95d1, 0x95d2, 0x95d3, 0x95d9, 0x95da, 0x95dd, 0x95de, 0x95df, + 0x95e0, 0x95e4, 0x95e6, 0x961d, 0x961e, 0x9622, 0x9624, 0x9625, + 0x9626, 0x962c, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963a, + 0x963c, 0x963d, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658, + 0x9661, 0x966e, 0x9674, 0x967b, 0x967c, 0x967e, 0x967f, 0x9681, + 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969a, 0x969d, + 0x969f, 0x96a4, 0x96a5, 0x96a6, 0x96a9, 0x96ae, 0x96af, 0x96b3, + 0x96ba, 0x96ca, 0x96d2, 0x5db2, 0x96d8, 0x96da, 0x96dd, 0x96de, + 0x96df, 0x96e9, 0x96ef, 0x96f1, 0x96fa, 0x9702, + /* 0x67 */ + 0x9703, 0x9705, 0x9709, 0x971a, 0x971b, 0x971d, 0x9721, 0x9722, + 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974a, 0x974e, + 0x974f, 0x9755, 0x9757, 0x9758, 0x975a, 0x975b, 0x9763, 0x9767, + 0x976a, 0x976e, 0x9773, 0x9776, 0x9777, 0x9778, 0x977b, 0x977d, + 0x977f, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, + 0x979e, 0x979f, 0x97a2, 0x97ac, 0x97ae, 0x97b1, 0x97b2, 0x97b5, + 0x97b6, 0x97b8, 0x97b9, 0x97ba, 0x97bc, 0x97be, 0x97bf, 0x97c1, + 0x97c4, 0x97c5, 0x97c7, 0x97c9, 0x97ca, 0x97cc, 0x97cd, 0x97ce, + 0x97d0, 0x97d1, 0x97d4, 0x97d7, 0x97d8, 0x97d9, 0x97dd, 0x97de, + 0x97e0, 0x97db, 0x97e1, 0x97e4, 0x97ef, 0x97f1, 0x97f4, 0x97f7, + 0x97f8, 0x97fa, 0x9807, 0x980a, 0x9819, 0x980d, 0x980e, 0x9814, + 0x9816, 0x981c, 0x981e, 0x9820, 0x9823, 0x9826, + /* 0x68 */ + 0x982b, 0x982e, 0x982f, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825, + 0x983e, 0x9844, 0x9847, 0x984a, 0x9851, 0x9852, 0x9853, 0x9856, + 0x9857, 0x9859, 0x985a, 0x9862, 0x9863, 0x9865, 0x9866, 0x986a, + 0x986c, 0x98ab, 0x98ad, 0x98ae, 0x98b0, 0x98b4, 0x98b7, 0x98b8, + 0x98ba, 0x98bb, 0x98bf, 0x98c2, 0x98c5, 0x98c8, 0x98cc, 0x98e1, + 0x98e3, 0x98e5, 0x98e6, 0x98e7, 0x98ea, 0x98f3, 0x98f6, 0x9902, + 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991a, 0x991b, + 0x991c, 0x991f, 0x9922, 0x9926, 0x9927, 0x992b, 0x9931, 0x9932, + 0x9933, 0x9934, 0x9935, 0x9939, 0x993a, 0x993b, 0x993c, 0x9940, + 0x9941, 0x9946, 0x9947, 0x9948, 0x994d, 0x994e, 0x9954, 0x9958, + 0x9959, 0x995b, 0x995c, 0x995e, 0x995f, 0x9960, 0x999b, 0x999d, + 0x999f, 0x99a6, 0x99b0, 0x99b1, 0x99b2, 0x99b5, + /* 0x69 */ + 0x99b9, 0x99ba, 0x99bd, 0x99bf, 0x99c3, 0x99c9, 0x99d3, 0x99d4, + 0x99d9, 0x99da, 0x99dc, 0x99de, 0x99e7, 0x99ea, 0x99eb, 0x99ec, + 0x99f0, 0x99f4, 0x99f5, 0x99f9, 0x99fd, 0x99fe, 0x9a02, 0x9a03, + 0x9a04, 0x9a0b, 0x9a0c, 0x9a10, 0x9a11, 0x9a16, 0x9a1e, 0x9a20, + 0x9a22, 0x9a23, 0x9a24, 0x9a27, 0x9a2d, 0x9a2e, 0x9a33, 0x9a35, + 0x9a36, 0x9a38, 0x9a47, 0x9a41, 0x9a44, 0x9a4a, 0x9a4b, 0x9a4c, + 0x9a4e, 0x9a51, 0x9a54, 0x9a56, 0x9a5d, 0x9aaa, 0x9aac, 0x9aae, + 0x9aaf, 0x9ab2, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab9, 0x9abb, 0x9abe, + 0x9abf, 0x9ac1, 0x9ac3, 0x9ac6, 0x9ac8, 0x9ace, 0x9ad0, 0x9ad2, + 0x9ad5, 0x9ad6, 0x9ad7, 0x9adb, 0x9adc, 0x9ae0, 0x9ae4, 0x9ae5, + 0x9ae7, 0x9ae9, 0x9aec, 0x9af2, 0x9af3, 0x9af5, 0x9af9, 0x9afa, + 0x9afd, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03, + /* 0x6a */ + 0x9b04, 0x9b05, 0x9b08, 0x9b09, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, + 0x9b10, 0x9b12, 0x9b16, 0x9b19, 0x9b1b, 0x9b1c, 0x9b20, 0x9b26, + 0x9b2b, 0x9b2d, 0x9b33, 0x9b34, 0x9b35, 0x9b37, 0x9b39, 0x9b3a, + 0x9b3d, 0x9b48, 0x9b4b, 0x9b4c, 0x9b55, 0x9b56, 0x9b57, 0x9b5b, + 0x9b5e, 0x9b61, 0x9b63, 0x9b65, 0x9b66, 0x9b68, 0x9b6a, 0x9b6b, + 0x9b6c, 0x9b6d, 0x9b6e, 0x9b73, 0x9b75, 0x9b77, 0x9b78, 0x9b79, + 0x9b7f, 0x9b80, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b89, 0x9b8a, + 0x9b8b, 0x9b8d, 0x9b8f, 0x9b90, 0x9b94, 0x9b9a, 0x9b9d, 0x9b9e, + 0x9ba6, 0x9ba7, 0x9ba9, 0x9bac, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb7, + 0x9bb8, 0x9bbb, 0x9bbc, 0x9bbe, 0x9bbf, 0x9bc1, 0x9bc7, 0x9bc8, + 0x9bce, 0x9bd0, 0x9bd7, 0x9bd8, 0x9bdd, 0x9bdf, 0x9be5, 0x9be7, + 0x9bea, 0x9beb, 0x9bef, 0x9bf3, 0x9bf7, 0x9bf8, + /* 0x6b */ + 0x9bf9, 0x9bfa, 0x9bfd, 0x9bff, 0x9c00, 0x9c02, 0x9c0b, 0x9c0f, + 0x9c11, 0x9c16, 0x9c18, 0x9c19, 0x9c1a, 0x9c1c, 0x9c1e, 0x9c22, + 0x9c23, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c31, 0x9c35, + 0x9c36, 0x9c37, 0x9c3d, 0x9c41, 0x9c43, 0x9c44, 0x9c45, 0x9c49, + 0x9c4a, 0x9c4e, 0x9c4f, 0x9c50, 0x9c53, 0x9c54, 0x9c56, 0x9c58, + 0x9c5b, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c63, 0x9c69, 0x9c6a, 0x9c5c, + 0x9c6b, 0x9c68, 0x9c6e, 0x9c70, 0x9c72, 0x9c75, 0x9c77, 0x9c7b, + 0x9ce6, 0x9cf2, 0x9cf7, 0x9cf9, 0x9d0b, 0x9d02, 0x9d11, 0x9d17, + 0x9d18, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d2f, 0x9d30, 0x9d32, 0x9d33, + 0x9d34, 0x9d3a, 0x9d3c, 0x9d45, 0x9d3d, 0x9d42, 0x9d43, 0x9d47, + 0x9d4a, 0x9d53, 0x9d54, 0x9d5f, 0x9d63, 0x9d62, 0x9d65, 0x9d69, + 0x9d6a, 0x9d6b, 0x9d70, 0x9d76, 0x9d77, 0x9d7b, + /* 0x6c */ + 0x9d7c, 0x9d7e, 0x9d83, 0x9d84, 0x9d86, 0x9d8a, 0x9d8d, 0x9d8e, + 0x9d92, 0x9d93, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9da1, 0x9daa, + 0x9dac, 0x9dae, 0x9db1, 0x9db5, 0x9db9, 0x9dbc, 0x9dbf, 0x9dc3, + 0x9dc7, 0x9dc9, 0x9dca, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dda, + 0x9dde, 0x9ddf, 0x9de0, 0x9de5, 0x9de7, 0x9de9, 0x9deb, 0x9dee, + 0x9df0, 0x9df3, 0x9df4, 0x9dfe, 0x9e0a, 0x9e02, 0x9e07, 0x9e0e, + 0x9e10, 0x9e11, 0x9e12, 0x9e15, 0x9e16, 0x9e19, 0x9e1c, 0x9e1d, + 0x9e7a, 0x9e7b, 0x9e7c, 0x9e80, 0x9e82, 0x9e83, 0x9e84, 0x9e85, + 0x9e87, 0x9e8e, 0x9e8f, 0x9e96, 0x9e98, 0x9e9b, 0x9e9e, 0x9ea4, + 0x9ea8, 0x9eac, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb3, 0x9eb4, 0x9eb5, + 0x9ec6, 0x9ec8, 0x9ecb, 0x9ed5, 0x9edf, 0x9ee4, 0x9ee7, 0x9eec, + 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef5, + /* 0x6d */ + 0x9ef8, 0x9eff, 0x9f02, 0x9f03, 0x9f09, 0x9f0f, 0x9f10, 0x9f11, + 0x9f12, 0x9f14, 0x9f16, 0x9f17, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1f, + 0x9f22, 0x9f26, 0x9f2a, 0x9f2b, 0x9f2f, 0x9f31, 0x9f32, 0x9f34, + 0x9f37, 0x9f39, 0x9f3a, 0x9f3c, 0x9f3d, 0x9f3f, 0x9f41, 0x9f43, + 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f53, 0x9f55, 0x9f56, 0x9f57, + 0x9f58, 0x9f5a, 0x9f5d, 0x9f5e, 0x9f68, 0x9f69, 0x9f6d, 0x9f6e, + 0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f75, 0x9f7a, 0x9f7d, 0x9f8f, + 0x9f90, 0x9f91, 0x9f92, 0x9f94, 0x9f96, 0x9f97, 0x9f9e, 0x9fa1, + 0x9fa2, 0x9fa3, 0x9fa5, +}; + +static int +jisx0212_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 == 0x22) || (c1 >= 0x26 && c1 <= 0x27) || (c1 >= 0x29 && c1 <= 0x2b) || (c1 >= 0x30 && c1 <= 0x6d)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 470) { + if (i < 175) + wc = jisx0212_2uni_page22[i-94]; + } else if (i < 752) { + if (i < 658) + wc = jisx0212_2uni_page26[i-470]; + } else if (i < 1410) { + if (i < 1027) + wc = jisx0212_2uni_page29[i-752]; + } else { + if (i < 7211) + wc = jisx0212_2uni_page30[i-1410]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short jisx0212_2charset[6067] = { + 0x2242, 0x2270, 0x2243, 0x226d, 0x226c, 0x226e, 0x2234, 0x2231, + 0x226b, 0x2244, 0x2a22, 0x2a21, 0x2a24, 0x2a2a, 0x2a23, 0x2a29, + 0x2921, 0x2a2e, 0x2a32, 0x2a31, 0x2a34, 0x2a33, 0x2a40, 0x2a3f, + 0x2a42, 0x2a41, 0x2a50, 0x2a52, 0x2a51, 0x2a54, 0x2a58, 0x2a53, + 0x292c, 0x2a63, 0x2a62, 0x2a65, 0x2a64, 0x2a72, 0x2930, 0x294e, + 0x2b22, 0x2b21, 0x2b24, 0x2b2a, 0x2b23, 0x2b29, 0x2941, 0x2b2e, + 0x2b32, 0x2b31, 0x2b34, 0x2b33, 0x2b40, 0x2b3f, 0x2b42, 0x2b41, + 0x2943, 0x2b50, 0x2b52, 0x2b51, 0x2b54, 0x2b58, 0x2b53, 0x294c, + 0x2b63, 0x2b62, 0x2b65, 0x2b64, 0x2b72, 0x2950, 0x2b73, 0x2a27, + 0x2b27, 0x2a25, 0x2b25, 0x2a28, 0x2b28, 0x2a2b, 0x2b2b, 0x2a2c, + 0x2b2c, 0x2a2f, 0x2b2f, 0x2a2d, 0x2b2d, 0x2a30, 0x2b30, 0x2922, + 0x2942, 0x2a37, 0x2b37, 0x2a36, 0x2b36, 0x2a38, 0x2b38, 0x2a35, + 0x2b35, 0x2a3a, 0x2b3a, 0x2a3b, 0x2b3b, 0x2a3d, 0x2b3d, 0x2a3c, + 0x2a3e, 0x2b3e, 0x2924, 0x2944, 0x2a47, 0x2b47, 0x2a45, 0x2b45, + 0x2a46, 0x2b46, 0x2a44, 0x2945, 0x2926, 0x2946, 0x2a48, 0x2b48, + 0x2a49, 0x2b49, 0x2947, 0x2a4a, 0x2b4a, 0x2a4c, 0x2b4c, 0x2a4b, + 0x2b4b, 0x2929, 0x2949, 0x2928, 0x2948, 0x2a4d, 0x2b4d, 0x2a4f, + 0x2b4f, 0x2a4e, 0x2b4e, 0x294a, 0x292b, 0x294b, 0x2a57, 0x2b57, + 0x2a56, 0x2b56, 0x292d, 0x294d, 0x2a59, 0x2b59, 0x2a5b, 0x2b5b, + 0x2a5a, 0x2b5a, 0x2a5c, 0x2b5c, 0x2a5d, 0x2b5d, 0x2a5f, 0x2b5f, + 0x2a5e, 0x2b5e, 0x2a61, 0x2b61, 0x2a60, 0x2b60, 0x292f, 0x294f, + 0x2a6c, 0x2b6c, 0x2a69, 0x2b69, 0x2a66, 0x2b66, 0x2a6b, 0x2b6b, + 0x2a68, 0x2b68, 0x2a6a, 0x2b6a, 0x2a71, 0x2b71, 0x2a74, 0x2b74, + 0x2a73, 0x2a75, 0x2b75, 0x2a77, 0x2b77, 0x2a76, 0x2b76, 0x2a26, + 0x2b26, 0x2a43, 0x2b43, 0x2a55, 0x2b55, 0x2a67, 0x2b67, 0x2a70, + 0x2b70, 0x2a6d, 0x2b6d, 0x2a6f, 0x2b6f, 0x2a6e, 0x2b6e, 0x2b39, + 0x2230, 0x222f, 0x2232, 0x2236, 0x2235, 0x2233, 0x2238, 0x2239, + 0x2661, 0x2662, 0x2663, 0x2664, 0x2667, 0x2669, 0x266c, 0x2676, + 0x2665, 0x266a, 0x2671, 0x2672, 0x2673, 0x2674, 0x267b, 0x2678, + 0x2675, 0x267a, 0x2677, 0x2679, 0x267c, 0x2742, 0x2743, 0x2744, + 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, + 0x274d, 0x274e, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777, + 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, 0x2271, + 0x226f, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e, 0x302f, + 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, + 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e, 0x303f, + 0x3040, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, + 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, + 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x305f, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x3121, + 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, + 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, 0x3130, 0x3131, + 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, + 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, + 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, + 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, + 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, + 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x3176, 0x315f, 0x3160, + 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, + 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, + 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3177, 0x3178, 0x3179, + 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x3221, 0x3222, 0x3223, + 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a, 0x322b, + 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232, 0x3233, + 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a, 0x323b, + 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242, 0x3243, + 0x3244, 0x3245, 0x3251, 0x3246, 0x3247, 0x3248, 0x3249, 0x324a, + 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3252, 0x3253, + 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, 0x325b, + 0x325c, 0x325d, 0x325e, 0x325f, 0x3260, 0x3261, 0x3262, 0x3263, + 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, + 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, + 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, + 0x327c, 0x327d, 0x327e, 0x3321, 0x3322, 0x3323, 0x3324, 0x3325, + 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c, 0x332d, + 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, + 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c, 0x333d, + 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344, 0x3345, + 0x3346, 0x3347, 0x3348, 0x3349, 0x334a, 0x334b, 0x334c, 0x334d, + 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, + 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, + 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, + 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, + 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374, 0x3375, + 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c, 0x337d, + 0x337e, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, + 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e, 0x342f, + 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3438, + 0x3437, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e, 0x343f, + 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, 0x3447, + 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e, 0x344f, + 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, + 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e, 0x345f, + 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, + 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e, 0x346f, + 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476, 0x3477, + 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e, 0x3521, + 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528, 0x3529, + 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530, 0x3531, + 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, + 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540, 0x3541, + 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548, 0x3549, + 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550, 0x3551, + 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558, 0x3559, + 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560, 0x3561, + 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568, 0x3569, + 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570, 0x3571, + 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, + 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x3621, 0x3622, 0x3623, + 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a, 0x362b, + 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632, 0x3633, + 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a, 0x363b, + 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642, 0x3643, + 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364a, 0x364b, + 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652, 0x3653, + 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a, 0x365b, + 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662, 0x3663, + 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a, 0x366b, + 0x366c, 0x366d, 0x3670, 0x3671, 0x366e, 0x366f, 0x3672, 0x3673, + 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a, 0x367b, + 0x367d, 0x367e, 0x367c, 0x3721, 0x3722, 0x3723, 0x3724, 0x3725, + 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c, 0x372d, + 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, + 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c, 0x373d, + 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, + 0x3746, 0x3747, 0x3748, 0x3749, 0x374a, 0x374b, 0x374c, 0x374d, + 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, + 0x3756, 0x3757, 0x3760, 0x3758, 0x3759, 0x375a, 0x375b, 0x375c, + 0x375d, 0x375e, 0x375f, 0x3761, 0x3762, 0x3763, 0x3764, 0x3765, + 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c, 0x376d, + 0x377e, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774, + 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b, 0x377c, + 0x377d, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, + 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e, 0x382f, + 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, + 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e, 0x383f, + 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846, 0x3847, + 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e, 0x3850, + 0x3851, 0x384f, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, + 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e, 0x385f, + 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3867, 0x3868, + 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e, 0x386f, 0x3870, + 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, + 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e, 0x3921, 0x3922, + 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392a, + 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930, 0x3931, 0x3932, + 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393a, + 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940, 0x3941, 0x3942, + 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394a, + 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950, 0x3951, 0x3952, + 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395a, + 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960, 0x3961, 0x3962, + 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396a, + 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970, 0x3971, 0x3972, + 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979, 0x397a, + 0x397b, 0x397c, 0x397d, 0x397e, 0x3a21, 0x3a22, 0x3a23, 0x3a24, + 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2c, + 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a33, 0x3a34, 0x3a35, + 0x3a36, 0x3a37, 0x3a38, 0x3a32, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3c, + 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42, 0x3a43, 0x3a44, + 0x3a45, 0x3a46, 0x3a47, 0x3a48, 0x3a49, 0x3a4a, 0x3a4b, 0x3a4c, + 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52, 0x3a53, 0x3a54, + 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a, 0x3a5b, 0x3a5c, + 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62, 0x3a63, 0x3a64, + 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a, 0x3a6b, 0x3a6c, + 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72, 0x3a73, 0x3a74, + 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a, 0x3a7b, 0x3a7c, + 0x3a7d, 0x3a7e, 0x3b21, 0x3b22, 0x3b23, 0x3b24, 0x3b25, 0x3b26, + 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d, 0x3b2e, + 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34, 0x3b35, 0x3b36, + 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3d, 0x3b3c, 0x3b3e, + 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b47, + 0x3b48, 0x3b49, 0x3b4a, 0x3b46, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, + 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b57, 0x3b55, 0x3b54, + 0x3b56, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, + 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, + 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, + 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x6674, 0x3b73, 0x3b74, 0x3b75, + 0x3b76, 0x3b77, 0x3b78, 0x3b7a, 0x3b79, 0x3b7b, 0x3b7c, 0x3b7d, + 0x3b7e, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26, 0x3c27, + 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2e, 0x3c2d, 0x3c2f, + 0x3c30, 0x3c31, 0x3c34, 0x3c32, 0x3c33, 0x3c35, 0x3c36, 0x3c37, + 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, + 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46, 0x3c47, + 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e, 0x3c4f, + 0x3c50, 0x3c52, 0x3c51, 0x3c53, 0x3c54, 0x3c55, 0x3c56, 0x3c57, + 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e, 0x3c5f, + 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66, 0x3c67, + 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e, 0x3c6f, + 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76, 0x3c77, + 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e, 0x3d21, + 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28, 0x3d29, + 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d32, 0x3d30, + 0x3d31, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38, 0x3d39, + 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, + 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, 0x3d48, 0x3d49, + 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50, 0x3d51, + 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58, 0x3d59, + 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60, 0x3d61, + 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68, 0x3d69, + 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70, 0x3d71, + 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78, 0x3d79, + 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3e21, 0x3e22, 0x3e23, + 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a, 0x3e2b, + 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32, 0x3e33, + 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a, 0x3e3b, + 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42, 0x3e43, + 0x3e44, 0x3e45, 0x3e46, 0x3e47, 0x3e48, 0x3e49, 0x3e4a, 0x3e4b, + 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52, 0x3e53, + 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a, 0x3e5b, + 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62, 0x3e63, + 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a, 0x3e6b, + 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72, 0x3e73, + 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a, 0x3e7b, + 0x3e7e, 0x3e7c, 0x3e7d, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, + 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, + 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, + 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, + 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, + 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, + 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, + 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, + 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, + 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, + 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, + 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, + 0x3f7e, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026, 0x4027, + 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e, 0x402f, + 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036, 0x4037, + 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e, 0x403f, + 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0x4047, + 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e, 0x404f, + 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x4057, + 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e, 0x405f, + 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, + 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e, 0x406f, + 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, + 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e, 0x4121, + 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128, 0x4129, + 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130, 0x4131, + 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, + 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140, 0x4141, + 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, 0x4148, 0x4149, + 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150, 0x4151, + 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158, 0x4159, + 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160, 0x4161, + 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168, 0x4169, + 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170, 0x4171, + 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178, 0x4179, + 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x4221, 0x4222, 0x4223, + 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a, 0x422b, + 0x422c, 0x422d, 0x422e, 0x4230, 0x422f, 0x4231, 0x4232, 0x4233, + 0x4234, 0x4235, 0x4237, 0x4236, 0x4238, 0x4239, 0x423a, 0x423b, + 0x423c, 0x423d, 0x423e, 0x4240, 0x4241, 0x4242, 0x4244, 0x4245, + 0x4247, 0x4248, 0x4249, 0x424a, 0x424c, 0x4243, 0x4246, 0x424b, + 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, + 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a, 0x425b, 0x425c, + 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, + 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a, 0x426b, 0x426c, + 0x426d, 0x423f, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272, 0x4273, + 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a, 0x427b, + 0x427c, 0x427d, 0x427e, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, + 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c, 0x432d, + 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, + 0x4336, 0x4337, 0x4339, 0x433a, 0x433b, 0x433c, 0x433d, 0x433e, + 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, + 0x4347, 0x4348, 0x4338, 0x434a, 0x434b, 0x434c, 0x434d, 0x434f, + 0x434e, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, + 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x4349, 0x435c, 0x435d, + 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, + 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c, 0x436d, + 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, + 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c, 0x437d, + 0x437e, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, + 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x442f, + 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, + 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e, 0x443f, + 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, + 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, + 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, + 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e, 0x445f, + 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, + 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, + 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, + 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e, 0x4521, + 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, + 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530, 0x4531, + 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, + 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, + 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, + 0x454a, 0x454b, 0x454d, 0x454c, 0x454e, 0x454f, 0x4550, 0x4551, + 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, + 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, + 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, + 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, + 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, + 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x4621, 0x4622, 0x4623, + 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a, 0x462b, + 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632, 0x4633, + 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a, 0x463b, + 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642, 0x4643, + 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464a, 0x464b, + 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652, 0x4653, + 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a, 0x465b, + 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4736, 0x4661, 0x4662, + 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, 0x466a, + 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671, 0x4672, + 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679, 0x467a, + 0x467b, 0x467c, 0x467d, 0x467e, 0x4721, 0x4722, 0x4723, 0x4724, + 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b, 0x472c, + 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, + 0x4735, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c, 0x473d, + 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, + 0x4746, 0x4747, 0x4748, 0x4749, 0x474a, 0x474b, 0x474c, 0x474d, + 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, + 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c, 0x475d, + 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, + 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c, 0x476d, + 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, + 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c, 0x477d, + 0x477e, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, + 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e, 0x482f, + 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, + 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e, 0x483f, + 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, + 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x4853, 0x484d, 0x484e, + 0x484f, 0x4850, 0x4851, 0x4852, 0x4854, 0x4855, 0x4856, 0x4857, + 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e, 0x485f, + 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, + 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e, 0x486f, + 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, + 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e, 0x4921, + 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929, + 0x492a, 0x492b, 0x492c, 0x492d, 0x492e, 0x492f, 0x4930, 0x4931, + 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939, + 0x493a, 0x493b, 0x493c, 0x4941, 0x493d, 0x493e, 0x493f, 0x4940, + 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4947, 0x4948, 0x4949, + 0x494a, 0x494b, 0x494c, 0x494d, 0x494e, 0x494f, 0x4950, 0x4951, + 0x4952, 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, + 0x495a, 0x495b, 0x495c, 0x495d, 0x495e, 0x495f, 0x4960, 0x4961, + 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, + 0x496a, 0x496b, 0x496c, 0x496d, 0x496e, 0x496f, 0x4970, 0x4971, + 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, + 0x497a, 0x497b, 0x497c, 0x497d, 0x497e, 0x4a21, 0x4a22, 0x4a23, + 0x4a24, 0x4a25, 0x4a26, 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, + 0x4a2c, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a32, 0x4a33, + 0x4a34, 0x4a35, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, + 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a42, 0x4a43, + 0x4a44, 0x4a45, 0x4a46, 0x4a47, 0x4a48, 0x4a49, 0x4a4a, 0x4a4b, + 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, 0x4a50, 0x4a51, 0x4a52, 0x4a53, + 0x4a54, 0x4a55, 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a5a, 0x4a5b, + 0x4a5c, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a63, + 0x4a64, 0x4a65, 0x4a66, 0x4a67, 0x4a68, 0x4a69, 0x4a6a, 0x4a6b, + 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6f, 0x4a70, 0x4a71, 0x4a72, 0x4a73, + 0x4a74, 0x4a75, 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7b, + 0x4a7c, 0x4a7d, 0x4a7e, 0x4b21, 0x4b22, 0x4b23, 0x4b24, 0x4b25, + 0x4b26, 0x4b27, 0x4b28, 0x4b29, 0x4b2a, 0x4b2b, 0x4b2c, 0x4b2d, + 0x4b2e, 0x4b2f, 0x4b30, 0x4b31, 0x4b32, 0x4b33, 0x4b34, 0x4b35, + 0x4b36, 0x4b37, 0x4b38, 0x4b39, 0x4b3a, 0x4b3b, 0x4b3c, 0x4b3d, + 0x4b3e, 0x4b3f, 0x4b40, 0x4b41, 0x4b42, 0x4b43, 0x4b44, 0x4b45, + 0x4b46, 0x4b47, 0x4b48, 0x4b49, 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4d, + 0x4b4e, 0x4b4f, 0x4b50, 0x4b51, 0x4b52, 0x4b53, 0x4b54, 0x4b55, + 0x4b56, 0x4b57, 0x4b58, 0x4b59, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5d, + 0x4b5e, 0x4b5f, 0x4b60, 0x4b61, 0x4b62, 0x4b63, 0x4b64, 0x4b65, + 0x4b66, 0x4b67, 0x4b68, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6c, 0x4b6d, + 0x4b6e, 0x4b6f, 0x4b70, 0x4b71, 0x4b72, 0x4b73, 0x4b74, 0x4b75, + 0x4b76, 0x4b77, 0x4b78, 0x4b79, 0x4b7a, 0x4b7b, 0x4b7c, 0x4b7d, + 0x4b7e, 0x4c21, 0x4c22, 0x4c23, 0x4c24, 0x4c25, 0x4c26, 0x4c27, + 0x4c28, 0x4c29, 0x4c2a, 0x4c2b, 0x4c2c, 0x4c2d, 0x4c2e, 0x4c2f, + 0x4c30, 0x4c31, 0x4c32, 0x4c33, 0x4c34, 0x4c35, 0x4c36, 0x4c37, + 0x4c38, 0x4c39, 0x4c3a, 0x4c3b, 0x4c3c, 0x4c3d, 0x4c3e, 0x4c3f, + 0x4c40, 0x4c41, 0x4c42, 0x4c43, 0x4c44, 0x4c45, 0x4c46, 0x4c47, + 0x4c48, 0x4c49, 0x4c4a, 0x4c4b, 0x4c4c, 0x4c4d, 0x4c4e, 0x4c4f, + 0x4c50, 0x4c51, 0x4c52, 0x4c53, 0x4c54, 0x4c55, 0x4c56, 0x4c57, + 0x4c58, 0x4c59, 0x4c5a, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c5e, 0x4c5f, + 0x4c60, 0x4c61, 0x4c62, 0x4c63, 0x4c64, 0x4c65, 0x4c66, 0x4c67, + 0x4c68, 0x4c69, 0x4c6a, 0x4c6b, 0x4c6c, 0x4c6d, 0x4c6e, 0x4c6f, + 0x4c70, 0x4c71, 0x4c72, 0x4c73, 0x4c74, 0x4c75, 0x4c76, 0x4c77, + 0x4c78, 0x4c79, 0x4c7a, 0x4c7b, 0x4c7c, 0x4c7d, 0x4c7e, 0x4d21, + 0x4d22, 0x4d23, 0x4d24, 0x4d25, 0x4d26, 0x4d27, 0x4d28, 0x4d29, + 0x4d2a, 0x4d2b, 0x4d2c, 0x4d2d, 0x4d2e, 0x4d2f, 0x4d30, 0x4d31, + 0x4d32, 0x4d33, 0x4d34, 0x4d35, 0x4d36, 0x4d37, 0x4d38, 0x4d39, + 0x4d3a, 0x4d3b, 0x4d3c, 0x4d3d, 0x4d3e, 0x4d3f, 0x4d40, 0x4d41, + 0x4d42, 0x4d43, 0x4d44, 0x4d45, 0x4d46, 0x4d47, 0x4d48, 0x4d49, + 0x4d4a, 0x4d4b, 0x4d4c, 0x4d4d, 0x4d4e, 0x4d4f, 0x4d50, 0x4d51, + 0x4d52, 0x4d53, 0x4d54, 0x4d55, 0x4d56, 0x4d57, 0x4d58, 0x4d59, + 0x4d5a, 0x4d5b, 0x4d5c, 0x4d5d, 0x4d5e, 0x4d5f, 0x4d60, 0x4d61, + 0x4d62, 0x4d63, 0x4d64, 0x4d65, 0x4d66, 0x4d67, 0x4d68, 0x4d69, + 0x4d6a, 0x4d6b, 0x4d6c, 0x4d6d, 0x4d6e, 0x4d6f, 0x4d70, 0x4d71, + 0x4d72, 0x4d73, 0x4d74, 0x4d75, 0x4d76, 0x4d77, 0x4d78, 0x4d79, + 0x4d7a, 0x4d7b, 0x4d7c, 0x4d7d, 0x4d7e, 0x4e21, 0x4e22, 0x4e24, + 0x4e25, 0x4e26, 0x4e27, 0x4e28, 0x4e29, 0x4e23, 0x4e2a, 0x4e2b, + 0x4e2c, 0x4e2d, 0x4e2e, 0x4e2f, 0x4e30, 0x4e31, 0x4e32, 0x4e33, + 0x4e34, 0x4e35, 0x4e36, 0x4e37, 0x4e38, 0x4e39, 0x4e3a, 0x4e3b, + 0x4e3c, 0x4e3d, 0x4e3e, 0x4e3f, 0x4e40, 0x4e41, 0x4e42, 0x4e43, + 0x4e44, 0x4e45, 0x4e46, 0x4e47, 0x4e48, 0x4e49, 0x4e4a, 0x4e4b, + 0x4e4c, 0x4e4d, 0x4e4e, 0x4e4f, 0x4e50, 0x4e51, 0x4e52, 0x4e53, + 0x4e54, 0x4e55, 0x4e56, 0x4e57, 0x4e58, 0x4e59, 0x4e5a, 0x4e5b, + 0x4e5c, 0x4e5d, 0x4e5e, 0x4e5f, 0x4e60, 0x4e61, 0x4e62, 0x4e63, + 0x4e64, 0x4e65, 0x4e66, 0x4e67, 0x4e68, 0x4e69, 0x4e6a, 0x4e6b, + 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e70, 0x4e71, 0x4e72, 0x4e73, + 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, + 0x4e7c, 0x4e7d, 0x4e7e, 0x4f21, 0x4f22, 0x4f23, 0x4f24, 0x4f25, + 0x4f26, 0x4f27, 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c, 0x4f2d, + 0x4f2e, 0x4f2f, 0x4f30, 0x4f31, 0x4f32, 0x4f33, 0x4f34, 0x4f35, + 0x4f36, 0x4f37, 0x4f38, 0x4f39, 0x4f3a, 0x4f3b, 0x4f3c, 0x4f3d, + 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f43, 0x4f44, 0x4f45, + 0x4f46, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f4d, + 0x4f4e, 0x4f4f, 0x4f50, 0x4f51, 0x4f52, 0x4f53, 0x4f54, 0x4f55, + 0x4f56, 0x4f57, 0x4f58, 0x4f59, 0x4f5a, 0x4f5b, 0x4f5c, 0x4f5d, + 0x4f5e, 0x4f5f, 0x4f60, 0x4f61, 0x4f62, 0x4f63, 0x4f64, 0x4f65, + 0x4f66, 0x4f67, 0x4f68, 0x4f69, 0x4f6a, 0x4f6b, 0x4f6c, 0x4f6d, + 0x4f6e, 0x4f6f, 0x4f70, 0x4f71, 0x4f72, 0x4f74, 0x4f75, 0x4f76, + 0x4f73, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7b, 0x4f7c, 0x4f7d, + 0x4f7e, 0x5021, 0x5022, 0x5023, 0x5024, 0x5025, 0x5026, 0x5027, + 0x5028, 0x5029, 0x502a, 0x502b, 0x502c, 0x502e, 0x502f, 0x5030, + 0x5031, 0x502d, 0x5032, 0x5033, 0x5034, 0x5035, 0x5037, 0x5038, + 0x5039, 0x503a, 0x503b, 0x5036, 0x503c, 0x503d, 0x503e, 0x503f, + 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, 0x5046, 0x5047, + 0x5048, 0x5049, 0x504a, 0x504b, 0x504c, 0x504d, 0x504e, 0x504f, + 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, 0x5056, 0x5057, + 0x5058, 0x5059, 0x505a, 0x505b, 0x505c, 0x505d, 0x505e, 0x505f, + 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5065, 0x5066, 0x5067, + 0x5068, 0x5069, 0x506a, 0x506b, 0x506c, 0x506d, 0x506e, 0x506f, + 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5076, 0x5077, + 0x5078, 0x5079, 0x507a, 0x507b, 0x507c, 0x507d, 0x507e, 0x5121, + 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, + 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, + 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, + 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x513f, 0x5140, 0x5141, + 0x5142, 0x5143, 0x5144, 0x5145, 0x5146, 0x5147, 0x5148, 0x5149, + 0x514a, 0x514b, 0x514c, 0x514d, 0x514e, 0x514f, 0x5150, 0x5151, + 0x5152, 0x5153, 0x5154, 0x5155, 0x5156, 0x5157, 0x5158, 0x5159, + 0x515a, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, + 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5167, 0x5168, 0x5169, + 0x516a, 0x516b, 0x516c, 0x516d, 0x516e, 0x516f, 0x5170, 0x5171, + 0x5172, 0x5173, 0x5174, 0x5175, 0x5176, 0x5177, 0x5178, 0x5179, + 0x517a, 0x517b, 0x517c, 0x517d, 0x517e, 0x5221, 0x5222, 0x5223, + 0x5224, 0x5225, 0x5226, 0x5227, 0x5228, 0x5229, 0x522a, 0x522b, + 0x522c, 0x522d, 0x522e, 0x522f, 0x5230, 0x5231, 0x5232, 0x5233, + 0x5234, 0x5235, 0x5236, 0x5237, 0x5238, 0x5239, 0x523a, 0x523b, + 0x523c, 0x523d, 0x523e, 0x523f, 0x5240, 0x5241, 0x5242, 0x5243, + 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524a, 0x524b, + 0x524c, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252, 0x5253, + 0x5254, 0x5255, 0x5256, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, + 0x525c, 0x525d, 0x525e, 0x525f, 0x5260, 0x5261, 0x5262, 0x5263, + 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269, 0x526a, 0x526b, + 0x526c, 0x526d, 0x526e, 0x526f, 0x5270, 0x5271, 0x5272, 0x5273, + 0x5274, 0x5276, 0x5277, 0x5278, 0x5275, 0x5279, 0x527a, 0x527b, + 0x527c, 0x527d, 0x527e, 0x5321, 0x5322, 0x5323, 0x5324, 0x5325, + 0x5326, 0x5327, 0x5328, 0x5329, 0x532a, 0x532b, 0x532c, 0x532d, + 0x532e, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, + 0x5336, 0x5337, 0x5338, 0x5339, 0x533a, 0x533b, 0x533c, 0x533d, + 0x533e, 0x533f, 0x5340, 0x5341, 0x5342, 0x5343, 0x5344, 0x5345, + 0x5346, 0x5347, 0x5348, 0x5349, 0x534a, 0x534b, 0x534c, 0x534d, + 0x534e, 0x534f, 0x5350, 0x5351, 0x5352, 0x5353, 0x5354, 0x5355, + 0x5356, 0x5357, 0x5358, 0x5359, 0x535a, 0x535b, 0x535c, 0x535d, + 0x535e, 0x535f, 0x5360, 0x5361, 0x5362, 0x5363, 0x5364, 0x5365, + 0x5366, 0x5367, 0x5368, 0x5369, 0x536a, 0x536b, 0x536c, 0x536d, + 0x536e, 0x536f, 0x5370, 0x5371, 0x5372, 0x5373, 0x5374, 0x5375, + 0x5376, 0x5377, 0x5378, 0x5379, 0x537a, 0x537b, 0x537c, 0x537d, + 0x537e, 0x5421, 0x5422, 0x5423, 0x5424, 0x5425, 0x5426, 0x5427, + 0x5428, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x542e, 0x542f, + 0x5430, 0x5431, 0x5432, 0x5434, 0x5435, 0x5436, 0x5437, 0x5438, + 0x5439, 0x543a, 0x543b, 0x543c, 0x543d, 0x543e, 0x5433, 0x543f, + 0x5440, 0x5441, 0x5442, 0x5443, 0x5444, 0x5445, 0x5446, 0x5447, + 0x5448, 0x5449, 0x544a, 0x544b, 0x544c, 0x544d, 0x544e, 0x544f, + 0x5450, 0x5451, 0x5452, 0x5453, 0x5454, 0x5455, 0x5456, 0x5457, + 0x5458, 0x5459, 0x545a, 0x545b, 0x545c, 0x545d, 0x545e, 0x545f, + 0x5460, 0x5461, 0x5462, 0x5463, 0x5464, 0x5465, 0x5466, 0x5467, + 0x5468, 0x5469, 0x546a, 0x546c, 0x546b, 0x546d, 0x546e, 0x546f, + 0x5470, 0x5471, 0x5472, 0x5473, 0x5474, 0x5475, 0x5476, 0x5477, + 0x5478, 0x5479, 0x547a, 0x547b, 0x547c, 0x547d, 0x547e, 0x5521, + 0x5522, 0x5523, 0x5524, 0x5525, 0x5526, 0x5527, 0x5528, 0x5529, + 0x552a, 0x552b, 0x552c, 0x552d, 0x552e, 0x552f, 0x5530, 0x5531, + 0x5532, 0x5533, 0x5534, 0x5535, 0x5536, 0x5537, 0x5538, 0x5539, + 0x553a, 0x553b, 0x553c, 0x553d, 0x553e, 0x553f, 0x5540, 0x5541, + 0x5542, 0x5543, 0x5544, 0x5545, 0x5546, 0x5547, 0x5548, 0x5549, + 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550, 0x5551, + 0x5552, 0x5553, 0x5554, 0x5555, 0x5556, 0x5557, 0x5558, 0x5559, + 0x555a, 0x555b, 0x555c, 0x555d, 0x555e, 0x555f, 0x5560, 0x5561, + 0x5562, 0x5563, 0x5564, 0x5565, 0x5566, 0x5567, 0x5568, 0x5569, + 0x556a, 0x556b, 0x556c, 0x556d, 0x556e, 0x556f, 0x5570, 0x5571, + 0x5572, 0x5573, 0x5574, 0x5575, 0x5576, 0x5577, 0x5578, 0x5579, + 0x557a, 0x557b, 0x557c, 0x557d, 0x557e, 0x5621, 0x5622, 0x5623, + 0x5624, 0x5625, 0x5626, 0x5627, 0x5628, 0x5629, 0x562a, 0x562b, + 0x562c, 0x562d, 0x562e, 0x562f, 0x5630, 0x5631, 0x5632, 0x5633, + 0x5634, 0x5635, 0x5636, 0x5637, 0x5638, 0x5639, 0x563a, 0x563b, + 0x563c, 0x563d, 0x563e, 0x563f, 0x5640, 0x5641, 0x5642, 0x5643, + 0x5644, 0x5645, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b, 0x5646, + 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, + 0x5654, 0x5656, 0x5657, 0x5658, 0x5655, 0x5659, 0x565a, 0x565b, + 0x565c, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5662, 0x5663, + 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x566a, 0x566b, + 0x566c, 0x566d, 0x566e, 0x566f, 0x5670, 0x5671, 0x5672, 0x5673, + 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679, 0x567a, 0x567b, + 0x567c, 0x567d, 0x567e, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, + 0x5726, 0x5727, 0x5728, 0x5729, 0x572a, 0x572b, 0x572c, 0x572d, + 0x572e, 0x572f, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734, 0x5735, + 0x5736, 0x5737, 0x5738, 0x5739, 0x573a, 0x573b, 0x573c, 0x573d, + 0x573e, 0x573f, 0x5740, 0x5741, 0x5742, 0x5743, 0x5744, 0x5745, + 0x5746, 0x5747, 0x5748, 0x5749, 0x574a, 0x574b, 0x574c, 0x574d, + 0x574e, 0x574f, 0x5750, 0x5751, 0x5752, 0x5753, 0x5754, 0x5755, + 0x5756, 0x5757, 0x5758, 0x5759, 0x575a, 0x575b, 0x575c, 0x575d, + 0x575e, 0x575f, 0x5760, 0x5761, 0x5762, 0x5764, 0x5765, 0x5766, + 0x5767, 0x5768, 0x5769, 0x576a, 0x576b, 0x576c, 0x576d, 0x576e, + 0x576f, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775, 0x5776, + 0x5777, 0x5778, 0x5779, 0x583e, 0x5763, 0x577a, 0x577b, 0x577c, + 0x577d, 0x577e, 0x5821, 0x5822, 0x5823, 0x5824, 0x5825, 0x5826, + 0x5827, 0x5828, 0x5829, 0x582a, 0x582b, 0x582c, 0x582d, 0x582e, + 0x582f, 0x5830, 0x5831, 0x5832, 0x5833, 0x584c, 0x5834, 0x5835, + 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, + 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584d, 0x584e, 0x584f, + 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, 0x5856, 0x5857, + 0x5858, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585e, 0x585f, + 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, + 0x5868, 0x5869, 0x586a, 0x586b, 0x586c, 0x586d, 0x586e, 0x586f, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587e, 0x5921, + 0x5922, 0x5923, 0x5924, 0x5925, 0x5926, 0x5927, 0x5928, 0x592a, + 0x592b, 0x592c, 0x592d, 0x592e, 0x592f, 0x5930, 0x5931, 0x5932, + 0x5933, 0x5934, 0x5935, 0x5936, 0x5937, 0x5938, 0x5939, 0x593a, + 0x593b, 0x593c, 0x5929, 0x593d, 0x593e, 0x593f, 0x5940, 0x5941, + 0x5942, 0x5943, 0x5944, 0x5945, 0x5946, 0x5947, 0x5948, 0x5949, + 0x594a, 0x594b, 0x594c, 0x594d, 0x594e, 0x594f, 0x5950, 0x5951, + 0x5952, 0x5953, 0x5954, 0x5955, 0x5956, 0x5957, 0x5958, 0x5959, + 0x595a, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5960, 0x5961, + 0x5962, 0x5963, 0x5964, 0x5965, 0x5966, 0x5974, 0x5967, 0x5968, + 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, + 0x5971, 0x5972, 0x5973, 0x5975, 0x5976, 0x5977, 0x5978, 0x5979, + 0x597a, 0x597b, 0x597c, 0x597d, 0x597e, 0x5a21, 0x5a22, 0x5a23, + 0x5a24, 0x5a25, 0x5a26, 0x5a27, 0x5a28, 0x5a29, 0x5a2a, 0x5a2b, + 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a31, 0x5a32, 0x5a33, + 0x5a34, 0x5a35, 0x5a36, 0x3866, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, + 0x5a3b, 0x5a3c, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a40, 0x5a41, 0x5a42, + 0x5a43, 0x5a44, 0x5a45, 0x5a46, 0x5a47, 0x5a48, 0x5a49, 0x5a4a, + 0x5a4b, 0x5a6d, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, + 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x5a56, 0x5a57, 0x5a58, 0x5a59, + 0x5a5a, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, 0x5a61, + 0x5a62, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a67, 0x5a68, 0x5a69, + 0x5a6a, 0x5a6b, 0x5a6c, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, + 0x5a73, 0x5a74, 0x5a75, 0x5a76, 0x5a77, 0x5a78, 0x5a79, 0x5a7a, + 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5b21, 0x5b22, 0x5b23, 0x5b24, + 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, + 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b32, 0x5b33, 0x5b34, + 0x5b35, 0x5b36, 0x5b37, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, + 0x5b3d, 0x5b3e, 0x5b3f, 0x5b40, 0x5b41, 0x5b42, 0x5b43, 0x5b44, + 0x5b45, 0x5b46, 0x5b47, 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, + 0x5b4d, 0x5b4e, 0x5b4f, 0x5b50, 0x5b51, 0x5b52, 0x5b53, 0x5b54, + 0x5b55, 0x5b56, 0x5b57, 0x5b58, 0x5b59, 0x5b5a, 0x5b5b, 0x5b5c, + 0x5b5d, 0x5b5e, 0x5b5f, 0x5b60, 0x5b61, 0x5b62, 0x5b63, 0x5b64, + 0x5b65, 0x5b66, 0x5b67, 0x5b68, 0x5b69, 0x5b6a, 0x5b6b, 0x5b6c, + 0x5b6d, 0x5b6e, 0x5b70, 0x5b71, 0x5b72, 0x5b73, 0x5b6f, 0x5b74, + 0x5b75, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7a, 0x5b7b, 0x5b7c, + 0x5b7d, 0x5b7e, 0x5c21, 0x5c22, 0x5c23, 0x5c24, 0x5c25, 0x5c26, + 0x5c27, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2c, 0x5c2d, 0x5c2e, + 0x5c2f, 0x5c30, 0x5c31, 0x5c32, 0x5c33, 0x5c34, 0x5c35, 0x5c36, + 0x5c37, 0x5c38, 0x5c39, 0x5c3a, 0x5c3b, 0x5c3c, 0x5c3d, 0x5c3e, + 0x5c3f, 0x5c40, 0x5c41, 0x5c42, 0x5c43, 0x5c44, 0x5c45, 0x5c46, + 0x5c47, 0x5c48, 0x5c49, 0x5c4a, 0x5c4b, 0x5c4c, 0x5c4d, 0x5c4e, + 0x5c4f, 0x5c50, 0x5c51, 0x5c52, 0x5c53, 0x5c54, 0x5c55, 0x5c56, + 0x5c57, 0x5c58, 0x5c59, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5e, + 0x5c5f, 0x5c60, 0x5c61, 0x5c62, 0x5c63, 0x5c64, 0x5c65, 0x5c66, + 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c6e, + 0x5c6f, 0x5c70, 0x5c71, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, + 0x5c77, 0x5c78, 0x5c79, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, + 0x5d21, 0x5d22, 0x5d23, 0x5d24, 0x5d25, 0x5d26, 0x5d27, 0x5d28, + 0x5d29, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2d, 0x5d2e, 0x5d2f, 0x5d30, + 0x5d31, 0x5d32, 0x5d33, 0x5d34, 0x5d35, 0x5d36, 0x5d37, 0x5d38, + 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3d, 0x5d3e, 0x5d3f, 0x5d40, + 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d47, 0x5d48, + 0x5d49, 0x5d4a, 0x5d4b, 0x5d4c, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, + 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d58, + 0x5d59, 0x5d5a, 0x5d5b, 0x5d5c, 0x5d5d, 0x5d5e, 0x5d5f, 0x5d60, + 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, + 0x5d69, 0x5d6a, 0x5d6b, 0x5d6c, 0x5d6d, 0x5d6e, 0x5d6f, 0x5d70, + 0x5d71, 0x5d72, 0x5d73, 0x5d74, 0x5d75, 0x5d76, 0x5d77, 0x5d78, + 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5e21, 0x5e22, + 0x5e23, 0x5e24, 0x5e25, 0x5e26, 0x5e27, 0x5e28, 0x5e29, 0x5e2a, + 0x5e2b, 0x5e2c, 0x5e2d, 0x5e2e, 0x5e2f, 0x5e30, 0x5e31, 0x5e32, + 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5e38, 0x5e39, 0x5e3f, + 0x5e3a, 0x5e3b, 0x5e3c, 0x5e3d, 0x5e3e, 0x5e40, 0x5e41, 0x5e42, + 0x5e43, 0x5e44, 0x5e45, 0x5e46, 0x5e47, 0x5e48, 0x5e49, 0x5e4e, + 0x5e4a, 0x5e4b, 0x5e4c, 0x5e4d, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, + 0x5e53, 0x5e54, 0x5e55, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, + 0x5e5b, 0x5e5c, 0x5e5d, 0x5e5e, 0x5e5f, 0x5e60, 0x5e61, 0x5e62, + 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, + 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e72, 0x5e70, 0x5e71, + 0x5e73, 0x5e74, 0x5e75, 0x5e76, 0x5e77, 0x5e78, 0x5e79, 0x5e7a, + 0x5e7b, 0x5e7c, 0x5e7d, 0x5e7e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, + 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, 0x5f2a, 0x5f2b, 0x5f2c, + 0x5f2d, 0x5f2e, 0x5f2f, 0x5f30, 0x5f32, 0x5f31, 0x5f33, 0x5f34, + 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f39, 0x5f3a, 0x5f3b, 0x5f3c, + 0x5f3d, 0x5f3e, 0x5f3f, 0x5f40, 0x5f41, 0x5f42, 0x5f43, 0x5f44, + 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, + 0x5f4d, 0x5f4e, 0x5f4f, 0x5f50, 0x5f51, 0x5f52, 0x5f53, 0x5f54, + 0x5f55, 0x5f56, 0x5f57, 0x5f58, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, + 0x5f5d, 0x5f6f, 0x5f5e, 0x5f5f, 0x5f60, 0x5f61, 0x5f62, 0x5f63, + 0x5f64, 0x5f65, 0x5f66, 0x5f67, 0x5f68, 0x5f69, 0x5f6a, 0x5f6b, + 0x5f6c, 0x5f6d, 0x5f6e, 0x5f70, 0x5f71, 0x5f72, 0x5f73, 0x5f74, + 0x5f75, 0x5f76, 0x5f77, 0x5f78, 0x5f79, 0x5f7a, 0x5f7b, 0x5f7c, + 0x5f7d, 0x5f7e, 0x6021, 0x6022, 0x6023, 0x6024, 0x6025, 0x6026, + 0x6027, 0x6028, 0x6029, 0x602a, 0x602b, 0x602c, 0x602d, 0x602e, + 0x602f, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6035, 0x6036, + 0x6037, 0x6038, 0x6039, 0x603a, 0x603b, 0x603c, 0x603d, 0x603e, + 0x603f, 0x6040, 0x6041, 0x6042, 0x6043, 0x6044, 0x6045, 0x6046, + 0x6047, 0x6048, 0x6049, 0x604a, 0x604b, 0x604c, 0x604d, 0x604e, + 0x604f, 0x6050, 0x6051, 0x6052, 0x6053, 0x6054, 0x6055, 0x6056, + 0x6057, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d, 0x6064, + 0x605e, 0x605f, 0x6060, 0x6061, 0x6062, 0x6063, 0x6065, 0x6066, + 0x6067, 0x6068, 0x6069, 0x606a, 0x606b, 0x606c, 0x606d, 0x606e, + 0x606f, 0x6070, 0x6071, 0x6072, 0x6073, 0x6074, 0x6075, 0x6076, + 0x6077, 0x6078, 0x6079, 0x607a, 0x607b, 0x607c, 0x607d, 0x607e, + 0x6121, 0x6122, 0x6123, 0x6124, 0x6125, 0x6126, 0x6127, 0x6128, + 0x6129, 0x612a, 0x612b, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, + 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, + 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x613f, 0x6140, + 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0x6147, 0x6148, + 0x6149, 0x614a, 0x614b, 0x614c, 0x614d, 0x614e, 0x614f, 0x6150, + 0x6151, 0x6152, 0x6154, 0x6155, 0x6156, 0x6153, 0x6157, 0x6158, + 0x6159, 0x615a, 0x615b, 0x615c, 0x615d, 0x615e, 0x615f, 0x6160, + 0x6161, 0x6162, 0x6163, 0x6164, 0x6165, 0x6166, 0x6167, 0x6168, + 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6170, + 0x6171, 0x6172, 0x6173, 0x6174, 0x6175, 0x6176, 0x6177, 0x6178, + 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, + 0x6224, 0x617c, 0x622d, 0x6225, 0x6226, 0x6227, 0x6228, 0x6229, + 0x622a, 0x622b, 0x622c, 0x622f, 0x6230, 0x6231, 0x6232, 0x622e, + 0x6233, 0x6234, 0x6235, 0x6236, 0x6237, 0x6238, 0x6239, 0x623a, + 0x623b, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x6242, + 0x6243, 0x6245, 0x6246, 0x6244, 0x6247, 0x6248, 0x6249, 0x624a, + 0x624b, 0x624c, 0x624d, 0x624e, 0x624f, 0x6250, 0x6251, 0x6252, + 0x6253, 0x6254, 0x6255, 0x6256, 0x6257, 0x6258, 0x6259, 0x625a, + 0x625b, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, + 0x6263, 0x6264, 0x6265, 0x6266, 0x6267, 0x6268, 0x6269, 0x626a, + 0x626b, 0x626c, 0x626d, 0x626e, 0x626f, 0x6270, 0x6271, 0x6272, + 0x6273, 0x6274, 0x6275, 0x6276, 0x6277, 0x6278, 0x6279, 0x627a, + 0x627b, 0x627c, 0x627d, 0x627e, 0x6321, 0x6322, 0x6323, 0x6324, + 0x6325, 0x6326, 0x6327, 0x6328, 0x6329, 0x632a, 0x632b, 0x632c, + 0x632d, 0x632e, 0x632f, 0x6330, 0x6331, 0x6332, 0x6333, 0x6334, + 0x6335, 0x6336, 0x6337, 0x6338, 0x6339, 0x633a, 0x633b, 0x633c, + 0x633d, 0x633e, 0x633f, 0x6340, 0x6341, 0x6342, 0x6343, 0x6344, + 0x6345, 0x6346, 0x6347, 0x6348, 0x6349, 0x634a, 0x634b, 0x634c, + 0x634d, 0x634e, 0x634f, 0x6350, 0x6351, 0x6352, 0x6353, 0x6354, + 0x6355, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, + 0x635d, 0x635e, 0x635f, 0x6360, 0x6361, 0x6362, 0x6363, 0x6364, + 0x6365, 0x6366, 0x6367, 0x6368, 0x6369, 0x636a, 0x636b, 0x636c, + 0x636d, 0x636e, 0x636f, 0x6370, 0x6371, 0x6372, 0x6373, 0x6374, + 0x6375, 0x6376, 0x6377, 0x6378, 0x6379, 0x637a, 0x637b, 0x637c, + 0x637d, 0x637e, 0x6421, 0x6422, 0x6423, 0x6424, 0x6425, 0x6426, + 0x6427, 0x6428, 0x6429, 0x642a, 0x642b, 0x642c, 0x642d, 0x642e, + 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6434, 0x6435, 0x6436, + 0x6437, 0x6438, 0x6439, 0x643a, 0x643b, 0x643c, 0x643d, 0x643e, + 0x643f, 0x6440, 0x6441, 0x6442, 0x6443, 0x6444, 0x6445, 0x6446, + 0x6447, 0x6448, 0x6449, 0x644a, 0x644b, 0x644c, 0x644d, 0x644e, + 0x644f, 0x6450, 0x6451, 0x6452, 0x6453, 0x6454, 0x6455, 0x6456, + 0x6457, 0x6458, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645e, + 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, + 0x6467, 0x6468, 0x6469, 0x646a, 0x646b, 0x646c, 0x646d, 0x646e, + 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, + 0x6477, 0x6478, 0x6479, 0x647a, 0x647b, 0x647c, 0x647d, 0x647e, + 0x6521, 0x6522, 0x6523, 0x6524, 0x6525, 0x6526, 0x6527, 0x6528, + 0x6529, 0x652a, 0x652b, 0x652c, 0x652d, 0x652e, 0x652f, 0x6530, + 0x6531, 0x6532, 0x6533, 0x6534, 0x6535, 0x653b, 0x6536, 0x6537, + 0x6538, 0x6539, 0x653a, 0x653c, 0x653d, 0x653e, 0x653f, 0x6540, + 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x6546, 0x6547, 0x6548, + 0x6549, 0x654a, 0x654b, 0x654c, 0x654d, 0x654f, 0x6550, 0x654e, + 0x6551, 0x6552, 0x6553, 0x6554, 0x6555, 0x6556, 0x6557, 0x6558, + 0x6559, 0x655a, 0x655b, 0x655c, 0x655d, 0x655e, 0x655f, 0x6560, + 0x6561, 0x6562, 0x6563, 0x6564, 0x6565, 0x6566, 0x6568, 0x6567, + 0x6569, 0x656a, 0x656b, 0x656c, 0x656d, 0x656e, 0x656f, 0x6570, + 0x6571, 0x6572, 0x6573, 0x6574, 0x6575, 0x6576, 0x6577, 0x6578, + 0x6579, 0x657a, 0x657c, 0x657b, 0x657d, 0x657e, 0x6621, 0x6622, + 0x6623, 0x6624, 0x6625, 0x6626, 0x6627, 0x6628, 0x6629, 0x662a, + 0x662b, 0x662c, 0x662d, 0x662e, 0x662f, 0x6630, 0x6631, 0x6632, + 0x6633, 0x6634, 0x6635, 0x6636, 0x6637, 0x6638, 0x6639, 0x663a, + 0x663b, 0x663c, 0x663d, 0x663e, 0x663f, 0x6640, 0x6641, 0x6642, + 0x6643, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664a, + 0x664b, 0x664c, 0x664d, 0x664e, 0x664f, 0x6650, 0x6651, 0x6652, + 0x6653, 0x6654, 0x6655, 0x6656, 0x6657, 0x6658, 0x6659, 0x665a, + 0x665b, 0x665c, 0x665d, 0x665e, 0x665f, 0x6660, 0x6661, 0x6662, + 0x6663, 0x6664, 0x6665, 0x6666, 0x6667, 0x6668, 0x6669, 0x666a, + 0x666b, 0x666c, 0x666d, 0x666e, 0x666f, 0x6670, 0x6671, 0x6672, + 0x6673, 0x6675, 0x6676, 0x6677, 0x6678, 0x6679, 0x667a, 0x667b, + 0x667c, 0x667d, 0x667e, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, + 0x6726, 0x6727, 0x6728, 0x6729, 0x672a, 0x672b, 0x672c, 0x672d, + 0x672e, 0x672f, 0x6730, 0x6731, 0x6732, 0x6733, 0x6734, 0x6735, + 0x6736, 0x6737, 0x6738, 0x6739, 0x673a, 0x673b, 0x673c, 0x673d, + 0x673e, 0x673f, 0x6740, 0x6741, 0x6742, 0x6743, 0x6744, 0x6745, + 0x6746, 0x6747, 0x6748, 0x6749, 0x674a, 0x674b, 0x674c, 0x674d, + 0x674e, 0x674f, 0x6750, 0x6751, 0x6752, 0x6753, 0x6754, 0x6755, + 0x6756, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675c, 0x675d, + 0x675e, 0x675f, 0x6760, 0x6761, 0x6762, 0x6763, 0x6764, 0x6765, + 0x6766, 0x676a, 0x6767, 0x6768, 0x6769, 0x676b, 0x676c, 0x676d, + 0x676e, 0x676f, 0x6770, 0x6771, 0x6772, 0x6773, 0x6774, 0x6776, + 0x6777, 0x6778, 0x6779, 0x6775, 0x677a, 0x677b, 0x677c, 0x677d, + 0x6828, 0x677e, 0x6821, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, + 0x6827, 0x6829, 0x682a, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, + 0x6830, 0x6831, 0x6832, 0x6833, 0x6834, 0x6835, 0x6836, 0x6837, + 0x6838, 0x6839, 0x683a, 0x683b, 0x683c, 0x683d, 0x683e, 0x683f, + 0x6840, 0x6841, 0x6842, 0x6843, 0x6844, 0x6845, 0x6846, 0x6847, + 0x6848, 0x6849, 0x684a, 0x684b, 0x684c, 0x684d, 0x684e, 0x684f, + 0x6850, 0x6851, 0x6852, 0x6853, 0x6854, 0x6855, 0x6856, 0x6857, + 0x6858, 0x6859, 0x685a, 0x685b, 0x685c, 0x685d, 0x685e, 0x685f, + 0x6860, 0x6861, 0x6862, 0x6863, 0x6864, 0x6865, 0x6866, 0x6867, + 0x6868, 0x6869, 0x686a, 0x686b, 0x686c, 0x686d, 0x686e, 0x686f, + 0x6870, 0x6871, 0x6872, 0x6873, 0x6874, 0x6875, 0x6876, 0x6877, + 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x6921, + 0x6922, 0x6923, 0x6924, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, + 0x692a, 0x692b, 0x692c, 0x692d, 0x692e, 0x692f, 0x6930, 0x6931, + 0x6932, 0x6933, 0x6934, 0x6935, 0x6936, 0x6937, 0x6938, 0x6939, + 0x693a, 0x693b, 0x693c, 0x693d, 0x693e, 0x693f, 0x6940, 0x6941, + 0x6942, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, + 0x694a, 0x694c, 0x694d, 0x694b, 0x694e, 0x694f, 0x6950, 0x6951, + 0x6952, 0x6953, 0x6954, 0x6955, 0x6956, 0x6957, 0x6958, 0x6959, + 0x695a, 0x695b, 0x695c, 0x695d, 0x695e, 0x695f, 0x6960, 0x6961, + 0x6962, 0x6963, 0x6964, 0x6965, 0x6966, 0x6967, 0x6968, 0x6969, + 0x696a, 0x696b, 0x696c, 0x696d, 0x696e, 0x696f, 0x6970, 0x6971, + 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x6977, 0x6978, 0x6979, + 0x697a, 0x697b, 0x697c, 0x697d, 0x697e, 0x6a21, 0x6a22, 0x6a23, + 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a28, 0x6a29, 0x6a2a, 0x6a2b, + 0x6a2c, 0x6a2d, 0x6a2e, 0x6a2f, 0x6a30, 0x6a31, 0x6a32, 0x6a33, + 0x6a34, 0x6a35, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, + 0x6a3c, 0x6a3d, 0x6a3e, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, + 0x6a44, 0x6a45, 0x6a46, 0x6a47, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, + 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a50, 0x6a51, 0x6a52, 0x6a53, + 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a58, 0x6a59, 0x6a5a, 0x6a5b, + 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a61, 0x6a62, 0x6a63, + 0x6a64, 0x6a65, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, + 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a71, 0x6a72, 0x6a73, + 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, + 0x6a7c, 0x6a7d, 0x6a7e, 0x6b21, 0x6b22, 0x6b23, 0x6b24, 0x6b25, + 0x6b26, 0x6b27, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, + 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34, 0x6b35, + 0x6b36, 0x6b37, 0x6b38, 0x6b39, 0x6b3a, 0x6b3b, 0x6b3c, 0x6b3d, + 0x6b3e, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b43, 0x6b44, 0x6b45, + 0x6b46, 0x6b47, 0x6b48, 0x6b49, 0x6b50, 0x6b4a, 0x6b4b, 0x6b4c, + 0x6b4d, 0x6b52, 0x6b4e, 0x6b4f, 0x6b51, 0x6b53, 0x6b54, 0x6b55, + 0x6b56, 0x6b57, 0x6b58, 0x6b59, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5e, + 0x6b5d, 0x6b5f, 0x6b60, 0x6b61, 0x6b62, 0x6b63, 0x6b64, 0x6b65, + 0x6b66, 0x6b67, 0x6b68, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6d, 0x6b6e, + 0x6b6f, 0x6b6c, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b76, + 0x6b75, 0x6b77, 0x6b78, 0x6b79, 0x6b7a, 0x6b7b, 0x6b7c, 0x6b7d, + 0x6b7e, 0x6c21, 0x6c22, 0x6c23, 0x6c24, 0x6c25, 0x6c26, 0x6c27, + 0x6c28, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c2e, 0x6c2f, + 0x6c30, 0x6c31, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x6c36, 0x6c37, + 0x6c38, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3d, 0x6c3e, 0x6c3f, + 0x6c40, 0x6c41, 0x6c42, 0x6c43, 0x6c44, 0x6c45, 0x6c46, 0x6c47, + 0x6c48, 0x6c49, 0x6c4a, 0x6c4b, 0x6c4c, 0x6c4e, 0x6c4f, 0x6c4d, + 0x6c50, 0x6c51, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c56, 0x6c57, + 0x6c58, 0x6c59, 0x6c5a, 0x6c5b, 0x6c5c, 0x6c5d, 0x6c5e, 0x6c5f, + 0x6c60, 0x6c61, 0x6c62, 0x6c63, 0x6c64, 0x6c65, 0x6c66, 0x6c67, + 0x6c68, 0x6c69, 0x6c6a, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, + 0x6c70, 0x6c71, 0x6c72, 0x6c73, 0x6c74, 0x6c75, 0x6c76, 0x6c77, + 0x6c78, 0x6c79, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7d, 0x6c7e, 0x6d21, + 0x6d22, 0x6d23, 0x6d24, 0x6d25, 0x6d26, 0x6d27, 0x6d28, 0x6d29, + 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30, 0x6d31, + 0x6d32, 0x6d33, 0x6d34, 0x6d35, 0x6d36, 0x6d37, 0x6d38, 0x6d39, + 0x6d3a, 0x6d3b, 0x6d3c, 0x6d3d, 0x6d3e, 0x6d3f, 0x6d40, 0x6d41, + 0x6d42, 0x6d43, 0x6d44, 0x6d45, 0x6d46, 0x6d47, 0x6d48, 0x6d49, + 0x6d4a, 0x6d4b, 0x6d4c, 0x6d4d, 0x6d4e, 0x6d4f, 0x6d50, 0x6d51, + 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d59, + 0x6d5a, 0x6d5b, 0x6d5c, 0x6d5d, 0x6d5e, 0x6d5f, 0x6d60, 0x6d61, + 0x6d62, 0x6d63, 0x2237, +}; + +static const Summary16 jisx0212_uni2indx_page00[70] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xc652 }, { 7, 0x8500 }, + { 10, 0xffff }, { 26, 0xff7e }, { 40, 0xffff }, { 56, 0xff7f }, + /* 0x0100 */ + { 71, 0xffff }, { 87, 0xffcf }, { 101, 0xcff7 }, { 114, 0xffff }, + { 130, 0x3fff }, { 144, 0xffff }, { 160, 0xffff }, { 176, 0x7fff }, + { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, + { 191, 0xe000 }, { 194, 0x1fff }, { 207, 0x0000 }, { 207, 0x0020 }, + /* 0x0200 */ + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, + { 208, 0x0080 }, { 209, 0x2f00 }, { 214, 0x0000 }, { 214, 0x0000 }, + /* 0x0300 */ + { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, + { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, + { 214, 0xd770 }, { 223, 0x0001 }, { 224, 0xfc00 }, { 230, 0x0001 }, + { 231, 0x7c04 }, { 237, 0x0000 }, { 237, 0x0000 }, { 237, 0x0000 }, + /* 0x0400 */ + { 237, 0xdffc }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0x0000 }, + { 250, 0x0000 }, { 250, 0xdffc }, +}; +static const Summary16 jisx0212_uni2indx_page21[3] = { + /* 0x2100 */ + { 263, 0x0000 }, { 263, 0x0040 }, { 264, 0x0004 }, +}; +static const Summary16 jisx0212_uni2indx_page4e[1307] = { + /* 0x4e00 */ + { 265, 0x1034 }, { 269, 0x8004 }, { 271, 0xc918 }, { 277, 0x0021 }, + { 279, 0x0093 }, { 283, 0x1402 }, { 286, 0x0308 }, { 289, 0x8230 }, + { 293, 0x2000 }, { 294, 0x20c0 }, { 297, 0x8000 }, { 298, 0x0200 }, + { 299, 0x0008 }, { 300, 0x0c01 }, { 303, 0x8107 }, { 308, 0xe02a }, + /* 0x4f00 */ + { 314, 0x190d }, { 320, 0x02e4 }, { 325, 0x4000 }, { 326, 0x4aaa }, + { 333, 0x1b05 }, { 339, 0x8154 }, { 344, 0x5409 }, { 349, 0x6782 }, + { 356, 0x5636 }, { 364, 0xc69d }, { 373, 0x0000 }, { 373, 0x7a84 }, + { 380, 0xbb63 }, { 390, 0x1004 }, { 392, 0x0005 }, { 394, 0xb005 }, + /* 0x5000 */ + { 399, 0x5493 }, { 406, 0x7989 }, { 414, 0x4084 }, { 417, 0x082d }, + { 422, 0x5467 }, { 430, 0x828e }, { 436, 0x24cd }, { 443, 0x0003 }, + { 445, 0xc45a }, { 452, 0xd85d }, { 461, 0x8407 }, { 466, 0x2601 }, + { 470, 0x5099 }, { 476, 0xb119 }, { 483, 0x8354 }, { 489, 0x4446 }, + /* 0x5100 */ + { 494, 0x79c8 }, { 502, 0x7a81 }, { 509, 0xb188 }, { 515, 0x033a }, + { 521, 0x8404 }, { 524, 0x81a8 }, { 529, 0x0050 }, { 531, 0x4000 }, + { 532, 0x4818 }, { 536, 0x2100 }, { 538, 0x200a }, { 541, 0xd500 }, + { 546, 0x8104 }, { 549, 0x412e }, { 555, 0x4024 }, { 558, 0x009c }, + /* 0x5200 */ + { 562, 0x0026 }, { 565, 0x016c }, { 570, 0x0104 }, { 572, 0x1026 }, + { 576, 0x0220 }, { 578, 0x95a0 }, { 584, 0x4043 }, { 588, 0x0380 }, + { 591, 0x1425 }, { 596, 0x15e8 }, { 603, 0x80f0 }, { 608, 0x2dc1 }, + { 615, 0x9151 }, { 621, 0x1852 }, { 626, 0x1722 }, { 632, 0x00d3 }, + /* 0x5300 */ + { 637, 0x1c09 }, { 642, 0xd90a }, { 649, 0x3ba0 }, { 656, 0x7025 }, + { 662, 0x1804 }, { 665, 0x0a00 }, { 667, 0x302a }, { 672, 0x4204 }, + { 675, 0x4188 }, { 679, 0x2218 }, { 683, 0x8c12 }, { 688, 0x25b4 }, + { 695, 0x8021 }, { 698, 0x642c }, { 704, 0x00c1 }, { 707, 0x0020 }, + /* 0x5400 */ + { 708, 0x0004 }, { 709, 0x0408 }, { 711, 0x8582 }, { 716, 0x0032 }, + { 719, 0xa098 }, { 724, 0x4000 }, { 725, 0x6ad4 }, { 733, 0x8010 }, + { 735, 0x232a }, { 741, 0x9062 }, { 746, 0x66c2 }, { 753, 0x8e82 }, + { 759, 0x6440 }, { 763, 0x0000 }, { 763, 0x9401 }, { 767, 0xd040 }, + /* 0x5500 */ + { 771, 0x7323 }, { 779, 0x0020 }, { 780, 0x0c00 }, { 782, 0x3864 }, + { 788, 0x2682 }, { 793, 0x4d03 }, { 799, 0x0053 }, { 803, 0x8000 }, + { 804, 0xc146 }, { 810, 0x009e }, { 815, 0x2018 }, { 818, 0x8004 }, + { 820, 0x5a4a }, { 827, 0x498e }, { 834, 0x0204 }, { 836, 0x8040 }, + /* 0x5600 */ + { 838, 0xe520 }, { 844, 0x0207 }, { 848, 0x1000 }, { 849, 0xbaa9 }, + { 858, 0xaa5b }, { 867, 0x4010 }, { 869, 0xa24f }, { 877, 0x0026 }, + { 880, 0x1930 }, { 885, 0xe620 }, { 891, 0x3bc0 }, { 898, 0x408a }, + { 902, 0xbe20 }, { 909, 0xb201 }, { 914, 0x29f2 }, { 922, 0x00c2 }, + /* 0x5700 */ + { 925, 0x1486 }, { 930, 0x2c22 }, { 935, 0xd63d }, { 945, 0xe018 }, + { 950, 0x3060 }, { 954, 0x0004 }, { 955, 0xe9a4 }, { 963, 0x5ebb }, + { 974, 0x100a }, { 977, 0xf6b0 }, { 986, 0x1382 }, { 991, 0x2100 }, + { 993, 0x9180 }, { 997, 0x6020 }, { 1000, 0x22d2 }, { 1006, 0xe161 }, + /* 0x5800 */ + { 1013, 0x3318 }, { 1019, 0xc800 }, { 1022, 0x20c1 }, { 1026, 0x8204 }, + { 1029, 0xb200 }, { 1033, 0x8021 }, { 1036, 0x0192 }, { 1040, 0x9100 }, + { 1043, 0xb783 }, { 1052, 0x2051 }, { 1056, 0x0247 }, { 1061, 0x1006 }, + { 1064, 0x6114 }, { 1069, 0x2455 }, { 1075, 0x0206 }, { 1078, 0x0008 }, + /* 0x5900 */ + { 1079, 0x1860 }, { 1083, 0x201c }, { 1087, 0x811a }, { 1092, 0x8069 }, + { 1097, 0x0048 }, { 1099, 0xea0c }, { 1106, 0xa80a }, { 1111, 0x1a64 }, + { 1117, 0x5800 }, { 1120, 0x80a4 }, { 1124, 0xe090 }, { 1129, 0x1489 }, + { 1134, 0x251a }, { 1140, 0xe004 }, { 1144, 0xc098 }, { 1149, 0x0096 }, + /* 0x5a00 */ + { 1153, 0x7011 }, { 1158, 0x400c }, { 1161, 0x2598 }, { 1167, 0x0001 }, + { 1168, 0x11b0 }, { 1173, 0x4021 }, { 1176, 0x20a8 }, { 1180, 0x4c80 }, + { 1184, 0x0800 }, { 1185, 0xd249 }, { 1192, 0x1085 }, { 1196, 0x8d2e }, + { 1204, 0x8150 }, { 1208, 0x1400 }, { 1210, 0x4421 }, { 1214, 0x2060 }, + /* 0x5b00 */ + { 1217, 0x0103 }, { 1220, 0x2a80 }, { 1224, 0x2022 }, { 1227, 0x0110 }, + { 1229, 0x1802 }, { 1232, 0x4044 }, { 1235, 0xc100 }, { 1238, 0xf000 }, + { 1242, 0x4452 }, { 1247, 0x005b }, { 1252, 0xb300 }, { 1257, 0x1486 }, + { 1262, 0xa003 }, { 1266, 0x07c0 }, { 1271, 0x8001 }, { 1273, 0x2012 }, + /* 0x5c00 */ + { 1276, 0x1000 }, { 1277, 0xc080 }, { 1280, 0x5a48 }, { 1286, 0x0065 }, + { 1290, 0x0000 }, { 1290, 0x1600 }, { 1293, 0x238c }, { 1299, 0x3c31 }, + { 1306, 0x8580 }, { 1310, 0xa004 }, { 1313, 0x044d }, { 1318, 0x0434 }, + { 1322, 0x0a00 }, { 1324, 0x2084 }, { 1327, 0x4000 }, { 1328, 0x0016 }, + /* 0x5d00 */ + { 1331, 0x2042 }, { 1334, 0x0004 }, { 1335, 0x08d8 }, { 1340, 0xa212 }, + { 1345, 0x054c }, { 1350, 0x8222 }, { 1354, 0x2417 }, { 1360, 0xc601 }, + { 1365, 0x050a }, { 1369, 0x8a3c }, { 1376, 0x0881 }, { 1379, 0x0315 }, + { 1384, 0x4888 }, { 1388, 0x0301 }, { 1391, 0x0211 }, { 1394, 0x0300 }, + /* 0x5e00 */ + { 1396, 0x2081 }, { 1399, 0x8134 }, { 1404, 0x4101 }, { 1407, 0x4024 }, + { 1410, 0x0a00 }, { 1412, 0x5943 }, { 1419, 0x7d00 }, { 1425, 0x0001 }, + { 1426, 0x4801 }, { 1429, 0x0000 }, { 1429, 0x1534 }, { 1435, 0xe00a }, + { 1440, 0x5840 }, { 1444, 0x5036 }, { 1450, 0x0820 }, { 1452, 0x0000 }, + /* 0x5f00 */ + { 1452, 0x41c4 }, { 1457, 0x3200 }, { 1460, 0x591e }, { 1468, 0xa851 }, + { 1474, 0x20b1 }, { 1479, 0x0911 }, { 1483, 0x8099 }, { 1488, 0x6534 }, + { 1495, 0xa200 }, { 1498, 0x3040 }, { 1501, 0x9894 }, { 1507, 0x0103 }, + { 1510, 0x0b90 }, { 1515, 0x401f }, { 1521, 0xf706 }, { 1530, 0x144c }, + /* 0x6000 */ + { 1535, 0x2480 }, { 1538, 0x8598 }, { 1544, 0x2010 }, { 1546, 0x0028 }, + { 1548, 0x1381 }, { 1553, 0x20d2 }, { 1558, 0x0082 }, { 1560, 0xc002 }, + { 1563, 0x4544 }, { 1568, 0x612a }, { 1574, 0x0134 }, { 1578, 0x4883 }, + { 1583, 0xcf14 }, { 1591, 0x6a30 }, { 1597, 0x0024 }, { 1599, 0x3124 }, + /* 0x6100 */ + { 1604, 0x1484 }, { 1608, 0x52df }, { 1618, 0x0c04 }, { 1621, 0x02e3 }, + { 1627, 0x0262 }, { 1631, 0x4000 }, { 1632, 0x1001 }, { 1634, 0x9904 }, + { 1639, 0x281b }, { 1645, 0xb18c }, { 1652, 0x2521 }, { 1657, 0x1300 }, + { 1660, 0xc007 }, { 1665, 0xf020 }, { 1670, 0xb2a6 }, { 1678, 0x0000 }, + /* 0x6200 */ + { 1678, 0x009a }, { 1682, 0x1028 }, { 1685, 0x0a8d }, { 1691, 0x2200 }, + { 1693, 0x105c }, { 1698, 0x1457 }, { 1705, 0xa010 }, { 1708, 0x2408 }, + { 1711, 0xe000 }, { 1714, 0x0001 }, { 1715, 0x0140 }, { 1717, 0xc4c8 }, + { 1723, 0x4010 }, { 1725, 0x0460 }, { 1728, 0x0400 }, { 1729, 0x3014 }, + /* 0x6300 */ + { 1733, 0x2c18 }, { 1738, 0x0149 }, { 1742, 0x2600 }, { 1745, 0x1260 }, + { 1749, 0x4c5e }, { 1757, 0x091c }, { 1762, 0x3060 }, { 1766, 0xb132 }, + { 1773, 0x0494 }, { 1777, 0x4631 }, { 1783, 0xe050 }, { 1788, 0x2000 }, + { 1789, 0x4122 }, { 1793, 0x103a }, { 1798, 0x1421 }, { 1802, 0x032c }, + /* 0x6400 */ + { 1807, 0x0600 }, { 1809, 0x4115 }, { 1814, 0x8635 }, { 1821, 0xa021 }, + { 1825, 0x8800 }, { 1827, 0xbc1e }, { 1836, 0x200b }, { 1840, 0x2818 }, + { 1844, 0x80a0 }, { 1847, 0xab03 }, { 1854, 0x114a }, { 1859, 0xe008 }, + { 1863, 0x5e10 }, { 1869, 0x00a3 }, { 1873, 0x2630 }, { 1878, 0x88a1 }, + /* 0x6500 */ + { 1883, 0x8712 }, { 1889, 0xca58 }, { 1896, 0x4244 }, { 1900, 0x3402 }, + { 1904, 0x0288 }, { 1907, 0x8015 }, { 1911, 0x0881 }, { 1914, 0x2400 }, + { 1916, 0x0422 }, { 1919, 0x2124 }, { 1923, 0x4049 }, { 1927, 0x801c }, + { 1931, 0x4304 }, { 1935, 0x8151 }, { 1940, 0x0000 }, { 1940, 0xc235 }, + /* 0x6600 */ + { 1947, 0x2311 }, { 1952, 0x6066 }, { 1958, 0x5e5e }, { 1968, 0x028b }, + { 1973, 0x5461 }, { 1979, 0x1b82 }, { 1985, 0x1c03 }, { 1990, 0xdba8 }, + { 1999, 0x3801 }, { 2003, 0x9e05 }, { 2010, 0x2011 }, { 2013, 0x8826 }, + { 2018, 0xd10d }, { 2025, 0x8810 }, { 2028, 0x5900 }, { 2032, 0x0c00 }, + /* 0x6700 */ + { 2034, 0x40a0 }, { 2037, 0x1208 }, { 2040, 0x0005 }, { 2042, 0x4008 }, + { 2044, 0x11a0 }, { 2048, 0x2030 }, { 2051, 0x5040 }, { 2054, 0x0850 }, + { 2057, 0xc012 }, { 2061, 0x0b4a }, { 2067, 0x0000 }, { 2067, 0x3827 }, + { 2074, 0x032d }, { 2080, 0x1284 }, { 2084, 0x0042 }, { 2086, 0x02c5 }, + /* 0x6800 */ + { 2091, 0x0000 }, { 2091, 0xa210 }, { 2095, 0xb180 }, { 2100, 0x880b }, + { 2105, 0x1430 }, { 2109, 0x09a4 }, { 2114, 0xc800 }, { 2117, 0x1e27 }, + { 2125, 0x0154 }, { 2129, 0x1540 }, { 2133, 0x462a }, { 2139, 0x0804 }, + { 2141, 0x9120 }, { 2145, 0x324b }, { 2152, 0x3d20 }, { 2158, 0x3863 }, + /* 0x6900 */ + { 2165, 0x0640 }, { 2168, 0x00cb }, { 2173, 0x0000 }, { 2173, 0x092a }, + { 2178, 0x4224 }, { 2182, 0x0880 }, { 2184, 0x1378 }, { 2191, 0x8c07 }, + { 2197, 0x2001 }, { 2199, 0x0144 }, { 2202, 0xa962 }, { 2209, 0x1580 }, + { 2213, 0x0120 }, { 2215, 0x00c2 }, { 2218, 0xc024 }, { 2222, 0x402a }, + /* 0x6a00 */ + { 2226, 0x800b }, { 2230, 0x2422 }, { 2234, 0x0111 }, { 2237, 0xc895 }, + { 2244, 0x4660 }, { 2249, 0x0867 }, { 2255, 0x0490 }, { 2258, 0x400a }, + { 2261, 0x0aca }, { 2267, 0xe802 }, { 2272, 0x8820 }, { 2275, 0xe013 }, + { 2281, 0x1340 }, { 2285, 0x3071 }, { 2291, 0x1090 }, { 2294, 0x3007 }, + /* 0x6b00 */ + { 2299, 0x82cc }, { 2305, 0x4883 }, { 2310, 0x9910 }, { 2315, 0x8860 }, + { 2319, 0x2440 }, { 2322, 0x2144 }, { 2326, 0x4881 }, { 2330, 0x6021 }, + { 2334, 0x0024 }, { 2336, 0x8880 }, { 2339, 0x730d }, { 2347, 0x6301 }, + { 2352, 0x1218 }, { 2356, 0x0440 }, { 2358, 0x40ca }, { 2363, 0x8282 }, + /* 0x6c00 */ + { 2367, 0x6234 }, { 2373, 0x8205 }, { 2377, 0x51c0 }, { 2382, 0x8c68 }, + { 2388, 0xac00 }, { 2392, 0x1a14 }, { 2397, 0xa880 }, { 2401, 0x0b50 }, + { 2406, 0x02e0 }, { 2410, 0x91b0 }, { 2416, 0x0000 }, { 2416, 0x0015 }, + { 2419, 0xa044 }, { 2423, 0x1457 }, { 2430, 0x5a81 }, { 2436, 0x0014 }, + /* 0x6d00 */ + { 2438, 0xc490 }, { 2443, 0x040a }, { 2446, 0xc1c0 }, { 2451, 0x9202 }, + { 2455, 0x0000 }, { 2455, 0xc080 }, { 2458, 0x80a2 }, { 2462, 0x1001 }, + { 2464, 0x0084 }, { 2466, 0x01d6 }, { 2472, 0x1400 }, { 2474, 0xa290 }, + { 2479, 0xc510 }, { 2484, 0xa840 }, { 2488, 0x8225 }, { 2493, 0x1051 }, + /* 0x6e00 */ + { 2497, 0x0011 }, { 2499, 0x4000 }, { 2500, 0x0084 }, { 2502, 0x1a44 }, + { 2507, 0x8b30 }, { 2513, 0x709e }, { 2521, 0x010c }, { 2524, 0x2808 }, + { 2527, 0x2000 }, { 2528, 0x0208 }, { 2530, 0x6081 }, { 2534, 0x880a }, + { 2538, 0xe58b }, { 2547, 0x0000 }, { 2547, 0x6800 }, { 2550, 0x2a00 }, + /* 0x6f00 */ + { 2553, 0x3510 }, { 2558, 0x0d40 }, { 2562, 0xa640 }, { 2567, 0x1849 }, + { 2572, 0x8000 }, { 2573, 0x668e }, { 2581, 0x1106 }, { 2585, 0x6000 }, + { 2587, 0x3988 }, { 2593, 0x845d }, { 2600, 0xc1e1 }, { 2607, 0x1061 }, + { 2611, 0x05a0 }, { 2615, 0x4400 }, { 2617, 0x0300 }, { 2619, 0x3221 }, + /* 0x7000 */ + { 2624, 0x20e1 }, { 2629, 0x0080 }, { 2630, 0x8009 }, { 2633, 0x1290 }, + { 2637, 0x4f18 }, { 2644, 0x6030 }, { 2648, 0x5030 }, { 2652, 0x4060 }, + { 2655, 0x0062 }, { 2658, 0x09f0 }, { 2664, 0x0810 }, { 2666, 0x0093 }, + { 2670, 0x0400 }, { 2671, 0x117a }, { 2678, 0x0010 }, { 2679, 0x0400 }, + /* 0x7100 */ + { 2680, 0x98f8 }, { 2688, 0x4000 }, { 2689, 0xa801 }, { 2693, 0x0103 }, + { 2696, 0x0ce2 }, { 2702, 0x5485 }, { 2708, 0x0101 }, { 2710, 0x0200 }, + { 2711, 0x10a1 }, { 2715, 0x0c04 }, { 2718, 0x8005 }, { 2721, 0x840d }, + { 2726, 0x1813 }, { 2731, 0x1648 }, { 2736, 0x0000 }, { 2736, 0x4100 }, + /* 0x7200 */ + { 2738, 0x0381 }, { 2742, 0xa488 }, { 2747, 0x8810 }, { 2750, 0x0310 }, + { 2753, 0xc02e }, { 2759, 0x5469 }, { 2766, 0xc909 }, { 2772, 0x9982 }, + { 2778, 0x6210 }, { 2782, 0x0808 }, { 2784, 0x6100 }, { 2787, 0x4012 }, + { 2790, 0x1282 }, { 2794, 0x8160 }, { 2798, 0x0020 }, { 2799, 0x4c18 }, + /* 0x7300 */ + { 2804, 0x28b4 }, { 2810, 0x430c }, { 2815, 0x1194 }, { 2820, 0x2c26 }, + { 2826, 0x2008 }, { 2828, 0xe145 }, { 2835, 0xdac1 }, { 2843, 0x1282 }, + { 2847, 0x406b }, { 2853, 0xd1a9 }, { 2861, 0x2c65 }, { 2868, 0xb2a0 }, + { 2874, 0x9a60 }, { 2880, 0x224c }, { 2885, 0x02ca }, { 2890, 0xaeb0 }, + /* 0x7400 */ + { 2898, 0x0493 }, { 2903, 0x0c02 }, { 2906, 0xff50 }, { 2916, 0x0203 }, + { 2919, 0x28d9 }, { 2926, 0x2086 }, { 2930, 0x69c4 }, { 2937, 0x0006 }, + { 2939, 0x82e3 }, { 2946, 0x9707 }, { 2954, 0xcf4b }, { 2964, 0x8a26 }, + { 2970, 0x1300 }, { 2973, 0xcd09 }, { 2980, 0x8d10 }, { 2985, 0x9c10 }, + /* 0x7500 */ + { 2990, 0x0040 }, { 2991, 0x00c4 }, { 2994, 0x8693 }, { 3001, 0xe240 }, + { 3006, 0x4189 }, { 3011, 0xc085 }, { 3016, 0x8002 }, { 3018, 0x7e02 }, + { 3025, 0x0022 }, { 3027, 0x122d }, { 3033, 0x0014 }, { 3035, 0x8410 }, + { 3038, 0xd053 }, { 3045, 0x9080 }, { 3048, 0xd093 }, { 3055, 0x0202 }, + /* 0x7600 */ + { 3057, 0x959d }, { 3066, 0x7a6c }, { 3075, 0x2268 }, { 3080, 0x172c }, + { 3087, 0x0e3b }, { 3095, 0x8220 }, { 3098, 0xe030 }, { 3103, 0x0012 }, + { 3105, 0x3022 }, { 3109, 0xb820 }, { 3114, 0x25fd }, { 3124, 0x2000 }, + { 3125, 0x5a22 }, { 3131, 0x0210 }, { 3133, 0x1141 }, { 3137, 0x1243 }, + /* 0x7700 */ + { 3142, 0x4441 }, { 3146, 0x16b4 }, { 3153, 0xe104 }, { 3158, 0x6270 }, + { 3164, 0xe464 }, { 3171, 0xd0c4 }, { 3177, 0x1495 }, { 3183, 0x241d }, + { 3189, 0x3011 }, { 3193, 0x8470 }, { 3198, 0xc484 }, { 3203, 0x4022 }, + { 3206, 0x0208 }, { 3208, 0xc226 }, { 3214, 0x1451 }, { 3219, 0x0913 }, + /* 0x7800 */ + { 3224, 0x6260 }, { 3229, 0x2002 }, { 3231, 0x600e }, { 3236, 0x00a1 }, + { 3239, 0x5198 }, { 3245, 0x5004 }, { 3248, 0x451b }, { 3255, 0x4400 }, + { 3257, 0x8400 }, { 3259, 0xe110 }, { 3264, 0x3112 }, { 3269, 0xa80f }, + { 3276, 0x5380 }, { 3281, 0x886c }, { 3287, 0x0453 }, { 3292, 0x8ccc }, + /* 0x7900 */ + { 3299, 0x1041 }, { 3302, 0xd401 }, { 3307, 0x22a1 }, { 3312, 0xa832 }, + { 3318, 0x8c70 }, { 3324, 0x1912 }, { 3329, 0x0a80 }, { 3332, 0x5a04 }, + { 3337, 0x1800 }, { 3339, 0x197a }, { 3347, 0x8b02 }, { 3352, 0x0912 }, + { 3356, 0x8594 }, { 3362, 0x6450 }, { 3367, 0x2c25 }, { 3373, 0x1102 }, + /* 0x7a00 */ + { 3376, 0x168c }, { 3382, 0x4822 }, { 3386, 0xa882 }, { 3391, 0x0731 }, + { 3397, 0x11b0 }, { 3402, 0xb260 }, { 3408, 0x24a1 }, { 3413, 0x4120 }, + { 3416, 0x0c65 }, { 3422, 0x4013 }, { 3426, 0x1009 }, { 3429, 0x1a28 }, + { 3434, 0x5240 }, { 3438, 0x0802 }, { 3440, 0x1b00 }, { 3444, 0x6812 }, + /* 0x7b00 */ + { 3449, 0x0080 }, { 3450, 0x8010 }, { 3452, 0xee88 }, { 3460, 0xa013 }, + { 3465, 0x4083 }, { 3469, 0x0020 }, { 3470, 0xa651 }, { 3477, 0x008c }, + { 3480, 0x4210 }, { 3483, 0x4843 }, { 3488, 0x9021 }, { 3492, 0x3c65 }, + { 3500, 0x0524 }, { 3504, 0x0ed0 }, { 3510, 0x0500 }, { 3512, 0x5734 }, + /* 0x7c00 */ + { 3520, 0xda5e }, { 3530, 0x0a00 }, { 3532, 0x1161 }, { 3537, 0x065a }, + { 3543, 0x0440 }, { 3545, 0x7e2e }, { 3555, 0x628a }, { 3561, 0x3205 }, + { 3566, 0x80c0 }, { 3569, 0x4010 }, { 3571, 0x0041 }, { 3573, 0x9cc1 }, + { 3580, 0xa390 }, { 3586, 0x26b8 }, { 3593, 0x0a40 }, { 3596, 0x0020 }, + /* 0x7d00 */ + { 3597, 0x8388 }, { 3602, 0x604e }, { 3608, 0x2448 }, { 3612, 0x7002 }, + { 3616, 0x2183 }, { 3621, 0x368a }, { 3628, 0x04a0 }, { 3631, 0x8d01 }, + { 3636, 0x396e }, { 3645, 0x60c2 }, { 3650, 0x04c0 }, { 3653, 0x02c8 }, + { 3657, 0x707c }, { 3665, 0x0280 }, { 3667, 0x2c64 }, { 3673, 0x0662 }, + /* 0x7e00 */ + { 3678, 0x0101 }, { 3680, 0x30a3 }, { 3686, 0xb181 }, { 3692, 0x8048 }, + { 3695, 0x40b0 }, { 3699, 0x8105 }, { 3703, 0xc826 }, { 3709, 0x4108 }, + { 3712, 0x24c2 }, { 3717, 0x6522 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, + /* 0x7f00 */ + { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0xf800 }, + { 3728, 0x8098 }, { 3732, 0x380c }, { 3737, 0x207a }, { 3743, 0xe002 }, + { 3747, 0xa801 }, { 3751, 0x10c3 }, { 3756, 0x2446 }, { 3761, 0x9010 }, + { 3764, 0xc109 }, { 3769, 0x8800 }, { 3771, 0xd128 }, { 3777, 0xe404 }, + /* 0x8000 */ + { 3782, 0xe580 }, { 3788, 0xe05a }, { 3795, 0x5051 }, { 3800, 0x56b1 }, + { 3808, 0x0011 }, { 3810, 0x0000 }, { 3810, 0x2051 }, { 3814, 0x0022 }, + { 3816, 0x4102 }, { 3819, 0x5000 }, { 3821, 0x08c0 }, { 3824, 0x0300 }, + { 3826, 0xa100 }, { 3829, 0x01b4 }, { 3834, 0x6001 }, { 3837, 0x464d }, + /* 0x8100 */ + { 3844, 0x0808 }, { 3846, 0x51c0 }, { 3851, 0x1091 }, { 3855, 0x1421 }, + { 3859, 0x14a0 }, { 3863, 0x0084 }, { 3865, 0xa383 }, { 3872, 0x0080 }, + { 3873, 0x4872 }, { 3879, 0x4941 }, { 3884, 0x4004 }, { 3886, 0x0814 }, + { 3889, 0xcc28 }, { 3895, 0x68a0 }, { 3900, 0x1812 }, { 3904, 0xa367 }, + /* 0x8200 */ + { 3913, 0x8009 }, { 3916, 0x2618 }, { 3921, 0x0106 }, { 3924, 0x0414 }, + { 3927, 0xc878 }, { 3934, 0x1042 }, { 3937, 0x2089 }, { 3941, 0xa810 }, + { 3945, 0x469b }, { 3953, 0x0d52 }, { 3959, 0x479b }, { 3968, 0xd495 }, + { 3976, 0x0040 }, { 3977, 0x0421 }, { 3980, 0xa515 }, { 3987, 0x60c0 }, + /* 0x8300 */ + { 3991, 0x0d83 }, { 3997, 0xe800 }, { 4001, 0x7006 }, { 4006, 0x3489 }, + { 4012, 0x609c }, { 4018, 0x00fa }, { 4024, 0x0000 }, { 4024, 0xa101 }, + { 4028, 0x2055 }, { 4033, 0x3b34 }, { 4041, 0x32c0 }, { 4046, 0xc000 }, + { 4048, 0x8281 }, { 4052, 0x2013 }, { 4056, 0x0500 }, { 4058, 0x1340 }, + /* 0x8400 */ + { 4062, 0x8442 }, { 4066, 0x0222 }, { 4069, 0x8000 }, { 4070, 0x0200 }, + { 4071, 0xa5a0 }, { 4077, 0x1746 }, { 4084, 0x04b1 }, { 4089, 0x3159 }, + { 4096, 0x0022 }, { 4098, 0x402c }, { 4102, 0x8740 }, { 4107, 0x6412 }, + { 4112, 0x9185 }, { 4118, 0x1008 }, { 4120, 0x8480 }, { 4123, 0x2c87 }, + /* 0x8500 */ + { 4130, 0x508c }, { 4135, 0x5001 }, { 4138, 0x8cbc }, { 4146, 0x805c }, + { 4151, 0x8040 }, { 4153, 0xf24f }, { 4163, 0x8817 }, { 4169, 0xae00 }, + { 4174, 0x9a62 }, { 4181, 0xa108 }, { 4185, 0x20a5 }, { 4190, 0xf1d0 }, + { 4198, 0x4c84 }, { 4203, 0x8500 }, { 4206, 0x2141 }, { 4210, 0x9048 }, + /* 0x8600 */ + { 4214, 0x6031 }, { 4219, 0x4b07 }, { 4226, 0x0282 }, { 4229, 0x3540 }, + { 4234, 0x0047 }, { 4238, 0x23cc }, { 4245, 0x921f }, { 4253, 0x04e0 }, + { 4257, 0x2100 }, { 4259, 0x1542 }, { 4264, 0x21c2 }, { 4269, 0x83ba }, + { 4277, 0x002b }, { 4281, 0x14a6 }, { 4287, 0x00a9 }, { 4291, 0x3400 }, + /* 0x8700 */ + { 4294, 0xc8b0 }, { 4300, 0xc219 }, { 4306, 0xc10a }, { 4311, 0x7606 }, + { 4318, 0x2029 }, { 4322, 0x2100 }, { 4324, 0x8032 }, { 4328, 0x0806 }, + { 4331, 0x1bf8 }, { 4340, 0x43a9 }, { 4347, 0x7089 }, { 4353, 0xc022 }, + { 4357, 0x4702 }, { 4362, 0x9660 }, { 4368, 0x2c1c }, { 4374, 0x850a }, + /* 0x8800 */ + { 4379, 0x0e4a }, { 4385, 0xdf1d }, { 4396, 0x6100 }, { 4399, 0x1425 }, + { 4404, 0x4f2a }, { 4412, 0x9562 }, { 4419, 0x0211 }, { 4422, 0x0a02 }, + { 4425, 0x0001 }, { 4426, 0x9d00 }, { 4431, 0x0501 }, { 4434, 0x6400 }, + { 4437, 0x7c01 }, { 4443, 0x480e }, { 4448, 0x8080 }, { 4450, 0x00a3 }, + /* 0x8900 */ + { 4454, 0xe042 }, { 4459, 0x1760 }, { 4465, 0x01c1 }, { 4469, 0x4627 }, + { 4476, 0x8265 }, { 4482, 0x1c84 }, { 4487, 0x480e }, { 4492, 0x3c29 }, + { 4499, 0x2200 }, { 4501, 0x9831 }, { 4507, 0x0021 }, { 4509, 0x10f1 }, + { 4515, 0x0000 }, { 4515, 0x01f0 }, { 4520, 0x2a20 }, { 4524, 0xa24a }, + /* 0x8a00 */ + { 4530, 0x80b0 }, { 4534, 0x4036 }, { 4539, 0x9855 }, { 4546, 0x60a0 }, + { 4550, 0x62a9 }, { 4557, 0x31c8 }, { 4563, 0x00a2 }, { 4566, 0xcee0 }, + { 4574, 0x8849 }, { 4579, 0x82c5 }, { 4585, 0xc280 }, { 4589, 0x48c8 }, + { 4594, 0x0748 }, { 4599, 0xa0ba }, { 4606, 0x1000 }, { 4607, 0x9071 }, + /* 0x8b00 */ + { 4613, 0x0c60 }, { 4617, 0xd002 }, { 4621, 0x2000 }, { 4622, 0x1081 }, + { 4625, 0x217c }, { 4632, 0x421c }, { 4637, 0x2008 }, { 4639, 0x5340 }, + { 4644, 0xa832 }, { 4650, 0xd030 }, { 4655, 0x0000 }, { 4655, 0x0000 }, + { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, + /* 0x8c00 */ + { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x6300 }, + { 4659, 0x8aa0 }, { 4664, 0x2b9a }, { 4672, 0x2358 }, { 4678, 0x4868 }, + { 4683, 0x08c0 }, { 4686, 0x1a0d }, { 4692, 0x0010 }, { 4693, 0x0600 }, + { 4695, 0x8a60 }, { 4700, 0x2260 }, { 4704, 0x9102 }, { 4708, 0xc1a5 }, + /* 0x8d00 */ + { 4715, 0x020a }, { 4718, 0x0884 }, { 4721, 0x0000 }, { 4721, 0x0000 }, + { 4721, 0x0000 }, { 4721, 0x0000 }, { 4721, 0x5220 }, { 4725, 0x8000 }, + { 4726, 0x2114 }, { 4730, 0xc023 }, { 4735, 0x9841 }, { 4740, 0x1aa4 }, + { 4746, 0x45e1 }, { 4753, 0x02b2 }, { 4758, 0x10b0 }, { 4762, 0x2017 }, + /* 0x8e00 */ + { 4767, 0x0872 }, { 4772, 0x0052 }, { 4775, 0x00cf }, { 4781, 0x23ca }, + { 4788, 0xe803 }, { 4794, 0x7810 }, { 4799, 0xb206 }, { 4805, 0x0e03 }, + { 4810, 0x020c }, { 4813, 0x6c25 }, { 4820, 0x6284 }, { 4825, 0x0c28 }, + { 4829, 0x809b }, { 4835, 0x1012 }, { 4838, 0x6100 }, { 4841, 0x0683 }, + /* 0x8f00 */ + { 4846, 0x8185 }, { 4851, 0x41c1 }, { 4856, 0x71ab }, { 4865, 0x04f0 }, + { 4870, 0x808b }, { 4875, 0x613e }, { 4883, 0x0020 }, { 4884, 0x0000 }, + { 4884, 0x0000 }, { 4884, 0x2000 }, { 4885, 0x0073 }, { 4890, 0x4160 }, + { 4894, 0x2c43 }, { 4900, 0x002d }, { 4904, 0x4119 }, { 4909, 0x4862 }, + /* 0x9000 */ + { 4914, 0x1114 }, { 4918, 0x0900 }, { 4920, 0xb700 }, { 4926, 0x8098 }, + { 4930, 0x1018 }, { 4933, 0x2800 }, { 4935, 0x10c4 }, { 4939, 0x0211 }, + { 4942, 0x5920 }, { 4947, 0x0ba1 }, { 4953, 0x0027 }, { 4957, 0x605d }, + { 4964, 0x11b8 }, { 4970, 0xb3a4 }, { 4978, 0x8820 }, { 4981, 0xc051 }, + /* 0x9100 */ + { 4986, 0x2171 }, { 4992, 0x55d1 }, { 5000, 0xc2ad }, { 5008, 0x36d2 }, + { 5016, 0x8188 }, { 5020, 0x0e88 }, { 5025, 0x2092 }, { 5029, 0x0e10 }, + { 5033, 0x446a }, { 5039, 0x413a }, { 5045, 0x7142 }, { 5051, 0xb84f }, + { 5060, 0x002c }, { 5063, 0x4698 }, { 5069, 0xf630 }, { 5077, 0x2a83 }, + /* 0x9200 */ + { 5083, 0x16f3 }, { 5092, 0x314d }, { 5099, 0xc178 }, { 5106, 0x5769 }, + { 5115, 0xe4cd }, { 5124, 0x3302 }, { 5129, 0xc3a3 }, { 5137, 0xbbe1 }, + { 5147, 0x6700 }, { 5152, 0x8284 }, { 5156, 0x89b1 }, { 5163, 0xbd44 }, + { 5171, 0x79ef }, { 5183, 0xb3a9 }, { 5192, 0x51ab }, { 5200, 0x8a01 }, + /* 0x9300 */ + { 5204, 0x2105 }, { 5208, 0xf032 }, { 5215, 0x06b2 }, { 5221, 0x00d8 }, + { 5225, 0x0380 }, { 5228, 0x45a7 }, { 5236, 0xa6b0 }, { 5243, 0xa45b }, + { 5251, 0xad07 }, { 5259, 0x4924 }, { 5264, 0x0b5a }, { 5271, 0x0470 }, + { 5275, 0x3ef2 }, { 5285, 0xd208 }, { 5290, 0x00c4 }, { 5293, 0x2f80 }, + /* 0x9400 */ + { 5299, 0xe316 }, { 5307, 0x80e0 }, { 5311, 0xc000 }, { 5313, 0xa81e }, + { 5320, 0x1528 }, { 5325, 0x9220 }, { 5329, 0xe90a }, { 5336, 0x0006 }, + { 5338, 0x0018 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, + { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, + /* 0x9500 */ + { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, + { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x4300 }, + { 5343, 0x7110 }, { 5348, 0xe000 }, { 5351, 0x1a42 }, { 5356, 0xa450 }, + { 5361, 0x0b40 }, { 5365, 0xe60f }, { 5374, 0x0051 }, { 5377, 0x0000 }, + /* 0x9600 */ + { 5377, 0x0000 }, { 5377, 0x6000 }, { 5379, 0x1074 }, { 5384, 0x378a }, + { 5392, 0x0002 }, { 5393, 0x01d4 }, { 5398, 0x4002 }, { 5400, 0xd810 }, + { 5405, 0x021e }, { 5410, 0xa442 }, { 5415, 0xc270 }, { 5421, 0x0408 }, + { 5423, 0x0400 }, { 5424, 0xe504 }, { 5430, 0x8200 }, { 5432, 0x0402 }, + /* 0x9700 */ + { 5434, 0x022c }, { 5438, 0x2c00 }, { 5441, 0x010e }, { 5445, 0x000a }, + { 5447, 0xc40a }, { 5452, 0x0da0 }, { 5457, 0x4488 }, { 5461, 0xa9c8 }, + { 5468, 0x0201 }, { 5470, 0xc6e0 }, { 5477, 0x5004 }, { 5480, 0xd766 }, + { 5490, 0x76b2 }, { 5499, 0x6b93 }, { 5508, 0x8013 }, { 5512, 0x0592 }, + /* 0x9800 */ + { 5517, 0x6480 }, { 5521, 0x5250 }, { 5526, 0xc869 }, { 5533, 0x402d }, + { 5538, 0x0490 }, { 5541, 0x06ce }, { 5548, 0x146c }, { 5554, 0x0000 }, + { 5554, 0x0000 }, { 5554, 0x0000 }, { 5554, 0x6800 }, { 5557, 0x8d91 }, + { 5564, 0x1124 }, { 5568, 0x0000 }, { 5568, 0x04ea }, { 5574, 0x0048 }, + /* 0x9900 */ + { 5576, 0x0184 }, { 5579, 0x9ce2 }, { 5587, 0x08c4 }, { 5591, 0x1e3e }, + { 5600, 0x61c3 }, { 5607, 0xdb10 }, { 5614, 0x0001 }, { 5615, 0x0000 }, + { 5615, 0x0000 }, { 5615, 0xa800 }, { 5618, 0x0040 }, { 5619, 0xa627 }, + { 5627, 0x0208 }, { 5629, 0x5618 }, { 5635, 0x1c80 }, { 5639, 0x6231 }, + /* 0x9a00 */ + { 5645, 0x181c }, { 5650, 0x4043 }, { 5654, 0x609d }, { 5661, 0x0168 }, + { 5665, 0x5c92 }, { 5672, 0x2052 }, { 5676, 0x0000 }, { 5676, 0x0000 }, + { 5676, 0x0000 }, { 5676, 0x0000 }, { 5676, 0xd400 }, { 5680, 0xca74 }, + { 5688, 0x414a }, { 5693, 0x18e5 }, { 5700, 0x12b1 }, { 5706, 0xa62c }, + /* 0x9b00 */ + { 5713, 0x7b3f }, { 5725, 0x1a45 }, { 5731, 0x2841 }, { 5735, 0x26b8 }, + { 5742, 0x1900 }, { 5745, 0x48e0 }, { 5750, 0x7d6a }, { 5760, 0x83a8 }, + { 5766, 0xaef1 }, { 5776, 0x6411 }, { 5781, 0x12c0 }, { 5785, 0xd987 }, + { 5794, 0x4182 }, { 5798, 0xa181 }, { 5803, 0x8ca0 }, { 5808, 0xa788 }, + /* 0x9c00 */ + { 5815, 0x8805 }, { 5819, 0x5742 }, { 5826, 0x07cc }, { 5833, 0x20e2 }, + { 5838, 0xc63a }, { 5846, 0xf959 }, { 5856, 0x4f08 }, { 5862, 0x08a5 }, + { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, + { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0040 }, { 5868, 0x0284 }, + /* 0x9d00 */ + { 5871, 0x0804 }, { 5873, 0x7182 }, { 5879, 0x8000 }, { 5880, 0x341d }, + { 5887, 0x04ac }, { 5892, 0x8018 }, { 5895, 0x0e2c }, { 5901, 0x58c1 }, + { 5907, 0x6458 }, { 5913, 0x01ec }, { 5919, 0x5402 }, { 5923, 0x9222 }, + { 5928, 0x0688 }, { 5932, 0xc4f0 }, { 5939, 0x4aa1 }, { 5945, 0x4019 }, + /* 0x9e00 */ + { 5949, 0x4484 }, { 5953, 0x3267 }, { 5961, 0x0000 }, { 5961, 0x0000 }, + { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x1c00 }, + { 5964, 0xc0bd }, { 5972, 0x4940 }, { 5976, 0xd110 }, { 5981, 0x0039 }, + { 5985, 0x0940 }, { 5988, 0x8020 }, { 5990, 0x7090 }, { 5995, 0x8127 }, + /* 0x9f00 */ + { 6001, 0x820c }, { 6005, 0x8ed7 }, { 6015, 0x8c44 }, { 6020, 0xb696 }, + { 6029, 0x00fa }, { 6035, 0x65e8 }, { 6043, 0xe300 }, { 6048, 0x242b }, + { 6054, 0x8000 }, { 6055, 0x40d7 }, { 6062, 0x002e }, +}; +static const Summary16 jisx0212_uni2indx_pageff[6] = { + /* 0xff00 */ + { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x0000 }, + { 6066, 0x0000 }, { 6066, 0x4000 }, +}; + +static int +jisx0212_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0460) + summary = &jisx0212_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x2100 && wc < 0x2130) + summary = &jisx0212_uni2indx_page21[(wc>>4)-0x210]; + else if (wc >= 0x4e00 && wc < 0x9fb0) + summary = &jisx0212_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xff00 && wc < 0xff60) + summary = &jisx0212_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = jisx0212_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/jisx0213.h b/Externals/libiconv-1.14/lib/jisx0213.h new file mode 100644 index 0000000000..98468c4644 --- /dev/null +++ b/Externals/libiconv-1.14/lib/jisx0213.h @@ -0,0 +1,5924 @@ +/* + * Copyright (C) 1999-2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JISX0213:2000 + */ + +#ifndef _JISX0213_H +#define _JISX0213_H + +/* JISX0213 plane 1 (= ISO-IR-233) characters are in the range + 0x{21..7E}{21..7E}. + JISX0213 plane 2 (= ISO-IR-229) characters are in the range + 0x{21,23..25,28,2C..2F,6E..7E}{21..7E}. + Together this makes 120 rows of 94 characters. +*/ + +static const unsigned short jisx0213_to_ucs_combining[][2] = { + { 0x304b, 0x309a }, + { 0x304d, 0x309a }, + { 0x304f, 0x309a }, + { 0x3051, 0x309a }, + { 0x3053, 0x309a }, + { 0x30ab, 0x309a }, + { 0x30ad, 0x309a }, + { 0x30af, 0x309a }, + { 0x30b1, 0x309a }, + { 0x30b3, 0x309a }, + { 0x30bb, 0x309a }, + { 0x30c4, 0x309a }, + { 0x30c8, 0x309a }, + { 0x31f7, 0x309a }, + { 0x00e6, 0x0300 }, + { 0x0254, 0x0300 }, + { 0x0254, 0x0301 }, + { 0x028c, 0x0300 }, + { 0x028c, 0x0301 }, + { 0x0259, 0x0300 }, + { 0x0259, 0x0301 }, + { 0x025a, 0x0300 }, + { 0x025a, 0x0301 }, + { 0x02e9, 0x02e5 }, + { 0x02e5, 0x02e9 }, +}; + +static const unsigned short jisx0213_to_ucs_main[120 * 94] = { + /* 0x12121..0x1217E */ + 0x1000, 0x1001, 0x1002, 0x830c, 0x830e, 0x10fb, 0x831a, 0x831b, + 0x831f, 0x8301, 0x109b, 0x109c, 0x00b4, 0x8340, 0x00a8, 0x833e, + 0x83e3, 0x833f, 0x10fd, 0x10fe, 0x109d, 0x109e, 0x1003, 0x2edd, + 0x1005, 0x1006, 0x1007, 0x10fc, 0x0714, 0x0710, 0x830f, 0x833c, + 0x101c, 0x0716, 0x835c, 0x0726, 0x0725, 0x0718, 0x0719, 0x071c, + 0x071d, 0x8308, 0x8309, 0x1014, 0x1015, 0x833b, 0x833d, 0x835b, + 0x835d, 0x1008, 0x1009, 0x100a, 0x100b, 0x100c, 0x100d, 0x100e, + 0x100f, 0x1010, 0x1011, 0x830b, 0x0912, 0x00b1, 0x00d7, 0x00f7, + 0x831d, 0x0960, 0x831c, 0x831e, 0x0966, 0x0967, 0x091e, 0x0934, + 0x0d42, 0x0d40, 0x00b0, 0x0732, 0x0733, 0x0803, 0x83e5, 0x8304, + 0x00a2, 0x00a3, 0x8305, 0x8303, 0x8306, 0x830a, 0x8320, 0x00a7, + 0x0d06, 0x0d05, 0x0ccb, 0x0ccf, 0x0cce, 0x0cc7, + /* 0x12221..0x1227E */ + 0x0cc6, 0x0ca1, 0x0ca0, 0x0cb3, 0x0cb2, 0x0cbd, 0x0cbc, 0x073b, + 0x1012, 0x0892, 0x0890, 0x0891, 0x0893, 0x1013, 0x8307, 0x8302, + 0x830d, 0x835e, 0x1033, 0x1034, 0x1035, 0x103b, 0x103c, 0x10ff, + 0x109f, 0x0908, 0x090b, 0x0986, 0x0987, 0x0982, 0x0983, 0x092a, + 0x0929, 0x0984, 0x0985, 0x098a, 0x098b, 0x0909, 0x0905, 0x0a05, + 0x0a06, 0x0927, 0x0928, 0x00ac, 0x08d2, 0x08d4, 0x0900, 0x0903, + 0x0995, 0x0996, 0x0997, 0x0925, 0x0926, 0x835f, 0x8360, 0x1018, + 0x1019, 0x1016, 0x1017, 0x0920, 0x09a5, 0x0a12, 0x0902, 0x0907, + 0x0961, 0x0952, 0x096a, 0x096b, 0x091a, 0x093d, 0x091d, 0x0935, + 0x092b, 0x092c, 0x0962, 0x0943, 0x0945, 0x0948, 0x0976, 0x0977, + 0x0894, 0x082b, 0x0730, 0x0d6f, 0x0d6d, 0x0d6a, 0x0720, 0x0721, + 0x00b6, 0x0d6e, 0x0d6b, 0x0d6c, 0x0d69, 0x0cef, + /* 0x12321..0x1237E */ + 0x0cb7, 0x0cb6, 0x0cc1, 0x0cc0, 0x0897, 0x0898, 0x0896, 0x0899, + 0x08c4, 0x08e8, 0x08e6, 0x08e7, 0x08e9, 0x0f34, 0x0f35, 0x8310, + 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, + 0x8319, 0x0fbf, 0x0cc9, 0x103d, 0x8246, 0x8245, 0x0ce6, 0x0722, + 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, + 0x8329, 0x832a, 0x832b, 0x832c, 0x832d, 0x832e, 0x832f, 0x8330, + 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, + 0x8339, 0x833a, 0x0913, 0x0835, 0x080f, 0x13cb, 0x0813, 0x0827, + 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, + 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, + 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, + 0x8359, 0x835a, 0x10a0, 0x0713, 0x0ffa, 0x0ffb, + /* 0x12421..0x1247E */ + 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, + 0x1049, 0x104a, 0x104b, 0x104c, 0x104d, 0x104e, 0x104f, 0x1050, + 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, + 0x1059, 0x105a, 0x105b, 0x105c, 0x105d, 0x105e, 0x105f, 0x1060, + 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, 0x1068, + 0x1069, 0x106a, 0x106b, 0x106c, 0x106d, 0x106e, 0x106f, 0x1070, + 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, 0x1078, + 0x1079, 0x107a, 0x107b, 0x107c, 0x107d, 0x107e, 0x107f, 0x1080, + 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, + 0x1089, 0x108a, 0x108b, 0x108c, 0x108d, 0x108e, 0x108f, 0x1090, + 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0000, 0x0000, 0x0000, + /* 0x12521..0x1257E */ + 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, + 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, + 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, + 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, + 0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, 0x10c6, 0x10c7, 0x10c8, + 0x10c9, 0x10ca, 0x10cb, 0x10cc, 0x10cd, 0x10ce, 0x10cf, 0x10d0, + 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, 0x10d8, + 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, 0x10e0, + 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, 0x10e8, + 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, 0x10f0, + 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, + /* 0x12621..0x1267E */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0x0d64, 0x0d60, 0x0d62, 0x0d66, 0x0d61, 0x0d65, 0x0d67, 0x0d63, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + 0x03c2, 0x0bf5, 0x0bf6, 0x0bf7, 0x0bf8, 0x0bf9, 0x0bfa, 0x0bfb, + 0x0bfc, 0x0bfd, 0x0bfe, 0x0d16, 0x0d17, 0x1020, 0x0d0e, 0x0d00, + 0x0d01, 0x0d02, 0x0d03, 0x0d68, 0x0cb1, 0x11f0, 0x11f1, 0x11f2, + 0x11f3, 0x11f4, 0x11f5, 0x11f6, 0x11f7, 0x11f8, 0x11f9, 0x000e, + 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, 0x11ff, + /* 0x12721..0x1277E */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, + 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, + 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, + 0x042f, 0x0abe, 0x0abf, 0x0ac0, 0x0ac1, 0x0ac2, 0x0ac3, 0x0ac4, + 0x0ac5, 0x0ac6, 0x0ac7, 0x0ac8, 0x0ac9, 0x0aca, 0x0acb, 0x0acc, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, + 0x044f, 0x10f7, 0x10f8, 0x10f9, 0x10fa, 0x09da, 0x09db, 0x0853, + 0x0854, 0x0855, 0x0e13, 0x0a18, 0x0b23, 0x0ace, + /* 0x12821..0x1287E */ + 0x0c00, 0x0c02, 0x0c0c, 0x0c10, 0x0c18, 0x0c14, 0x0c1c, 0x0c2c, + 0x0c24, 0x0c34, 0x0c3c, 0x0c01, 0x0c03, 0x0c0f, 0x0c13, 0x0c1b, + 0x0c17, 0x0c23, 0x0c33, 0x0c2b, 0x0c3b, 0x0c4b, 0x0c20, 0x0c2f, + 0x0c28, 0x0c37, 0x0c3f, 0x0c1d, 0x0c30, 0x0c25, 0x0c38, 0x0c42, + 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, 0x1256, 0x1257, 0x1258, + 0x1259, 0x125a, 0x125b, 0x125c, 0x125d, 0x125e, 0x125f, 0x12b1, + 0x12b2, 0x12b3, 0x12b4, 0x12b5, 0x12b6, 0x12b7, 0x12b8, 0x12b9, + 0x12ba, 0x12bb, 0x12bc, 0x12bd, 0x12be, 0x12bf, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0cd0, 0x0cd1, + 0x0cd2, 0x0cd3, 0x073c, 0x0747, 0x0748, 0x0749, 0x01cd, 0x01ce, + 0x01d0, 0x053e, 0x053f, 0x01f8, 0x01f9, 0x01d1, 0x01d2, 0x01d4, + 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x0000, 0x0000, + /* 0x12921..0x1297E */ + 0x07ac, 0x00a0, 0x00a1, 0x00a4, 0x00a6, 0x00a9, 0x00aa, 0x00ab, + 0x00ad, 0x00ae, 0x00af, 0x00b2, 0x00b3, 0x00b7, 0x00b8, 0x00b9, + 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, + 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, + 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, + 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d8, 0x00d9, 0x00da, + 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, + 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, + 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, + 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f8, 0x00f9, 0x00fa, 0x00fb, + 0x00fc, 0x00fd, 0x00fe, 0x00ff, 0x0100, 0x012a, 0x016a, 0x0112, + 0x014c, 0x0101, 0x012b, 0x016b, 0x0113, 0x014d, + /* 0x12A21..0x12A7E */ + 0x0104, 0x02d8, 0x0141, 0x013d, 0x015a, 0x0160, 0x015e, 0x0164, + 0x0179, 0x017d, 0x017b, 0x0105, 0x02db, 0x0142, 0x013e, 0x015b, + 0x02c7, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, + 0x0154, 0x0102, 0x0139, 0x0106, 0x010c, 0x0118, 0x011a, 0x010e, + 0x0143, 0x0147, 0x0150, 0x0158, 0x016e, 0x0170, 0x0162, 0x0155, + 0x0103, 0x013a, 0x0107, 0x010d, 0x0119, 0x011b, 0x010f, 0x0111, + 0x0144, 0x0148, 0x0151, 0x0159, 0x016f, 0x0171, 0x0163, 0x02d9, + 0x0108, 0x011c, 0x0124, 0x0134, 0x015c, 0x016c, 0x0109, 0x011d, + 0x0125, 0x0135, 0x015d, 0x016d, 0x0271, 0x028b, 0x027e, 0x0283, + 0x0292, 0x026c, 0x026e, 0x0279, 0x0288, 0x0256, 0x0273, 0x027d, + 0x0282, 0x0290, 0x027b, 0x026d, 0x025f, 0x0272, 0x029d, 0x028e, + 0x0261, 0x014b, 0x0270, 0x0281, 0x0127, 0x0295, + /* 0x12B21..0x12B7E */ + 0x0294, 0x0266, 0x0298, 0x01c2, 0x0253, 0x0257, 0x0284, 0x0260, + 0x0193, 0x0153, 0x0152, 0x0268, 0x0289, 0x0258, 0x0275, 0x0259, + 0x025c, 0x025e, 0x0250, 0x026f, 0x028a, 0x0264, 0x028c, 0x0254, + 0x0251, 0x0252, 0x028d, 0x0265, 0x02a2, 0x02a1, 0x0255, 0x0291, + 0x027a, 0x0267, 0x025a, 0x000f, 0x01fd, 0x0670, 0x0671, 0x0010, + 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0672, + 0x0673, 0x0361, 0x02c8, 0x02cc, 0x02d0, 0x02d1, 0x0306, 0x073f, + 0x030b, 0x0301, 0x0304, 0x0300, 0x030f, 0x030c, 0x0302, 0x02e5, + 0x02e6, 0x02e7, 0x02e8, 0x02e9, 0x0018, 0x0019, 0x0325, 0x032c, + 0x0339, 0x031c, 0x031f, 0x0320, 0x0308, 0x033d, 0x0329, 0x032f, + 0x02de, 0x0324, 0x0330, 0x033c, 0x0334, 0x031d, 0x031e, 0x0318, + 0x0319, 0x032a, 0x033a, 0x033b, 0x0303, 0x031a, + /* 0x12C21..0x12C7E */ + 0x0e76, 0x0e77, 0x0e78, 0x0e79, 0x0e7a, 0x0e7b, 0x0e7c, 0x0e7d, + 0x0e7e, 0x0e7f, 0x0beb, 0x0bec, 0x0bed, 0x0bee, 0x0bef, 0x0bf0, + 0x0bf1, 0x0bf2, 0x0bf3, 0x0bf4, 0x0870, 0x0871, 0x0872, 0x0873, + 0x0874, 0x0875, 0x0876, 0x0877, 0x0878, 0x0879, 0x087a, 0x087b, + 0x0bd0, 0x0bd1, 0x0bd2, 0x0bd3, 0x0bd4, 0x0bd5, 0x0bd6, 0x0bd7, + 0x0bd8, 0x0bd9, 0x0bda, 0x0bdb, 0x0bdc, 0x0bdd, 0x0bde, 0x0bdf, + 0x0be0, 0x0be1, 0x0be2, 0x0be3, 0x0be4, 0x0be5, 0x0be6, 0x0be7, + 0x0be8, 0x0be9, 0x12d0, 0x12d1, 0x12d2, 0x12d3, 0x12d4, 0x12d5, + 0x12d6, 0x12d7, 0x12d8, 0x12d9, 0x12da, 0x12db, 0x12dc, 0x12dd, + 0x12de, 0x12df, 0x12e0, 0x12e1, 0x12e2, 0x12e3, 0x12fa, 0x12e9, + 0x12e5, 0x12ed, 0x12ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0751, 0x0742, + /* 0x12D21..0x12D7E */ + 0x0b60, 0x0b61, 0x0b62, 0x0b63, 0x0b64, 0x0b65, 0x0b66, 0x0b67, + 0x0b68, 0x0b69, 0x0b6a, 0x0b6b, 0x0b6c, 0x0b6d, 0x0b6e, 0x0b6f, + 0x0b70, 0x0b71, 0x0b72, 0x0b73, 0x0860, 0x0861, 0x0862, 0x0863, + 0x0864, 0x0865, 0x0866, 0x0867, 0x0868, 0x0869, 0x086a, 0x1349, + 0x1314, 0x1322, 0x134d, 0x1318, 0x1327, 0x1303, 0x1336, 0x1351, + 0x1357, 0x130d, 0x1326, 0x1323, 0x132b, 0x134a, 0x133b, 0x139c, + 0x139d, 0x139e, 0x138e, 0x138f, 0x13c4, 0x13a1, 0x086b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x137b, 0x101d, + 0x101f, 0x0816, 0x13cd, 0x0821, 0x12a4, 0x12a5, 0x12a6, 0x12a7, + 0x12a8, 0x1231, 0x1232, 0x1239, 0x137e, 0x137d, 0x137c, 0x0000, + 0x0000, 0x0000, 0x092e, 0x0000, 0x0000, 0x0000, 0x0000, 0x091f, + 0x09bf, 0x0000, 0x0000, 0x0000, 0x0e56, 0x0d1e, + /* 0x12E21..0x12E7E */ + 0x2ff1, 0x840b, 0x1402, 0x2e28, 0x2e2f, 0x2e30, 0x2e8d, 0x2ee1, + 0x2efd, 0x2eff, 0x2f03, 0x2f0b, 0x2f60, 0x2f48, 0x2f49, 0x2f56, + 0x2f5f, 0x2f6a, 0x2f6c, 0x2f7e, 0x2f8a, 0x2f94, 0x2f97, 0x8130, + 0x2fc9, 0x2fe0, 0x3001, 0x3002, 0x300e, 0x3018, 0x3027, 0x302e, + 0x3040, 0x303b, 0x3041, 0x3094, 0x30cc, 0x30f2, 0x30d0, 0x30e6, + 0x8131, 0x3106, 0x3103, 0x310b, 0x311e, 0x3135, 0x314a, 0x8132, + 0x3155, 0x3157, 0x14b5, 0x319d, 0x31c3, 0x31ca, 0x31de, 0x31e2, + 0x31ee, 0x3201, 0x14db, 0x3213, 0x3215, 0x3249, 0x3257, 0x3261, + 0x3293, 0x32c8, 0x8133, 0x32cc, 0x32d0, 0x32d6, 0x32db, 0x8134, + 0x32f0, 0x32fb, 0x3300, 0x3307, 0x331c, 0x8135, 0x3361, 0x3363, + 0x337d, 0x3393, 0x339d, 0x33b2, 0x3412, 0x3427, 0x344d, 0x349c, + 0x346b, 0x3474, 0x347f, 0x3488, 0x3496, 0x34a1, + /* 0x12F21..0x12F7E */ + 0x34a9, 0x34c6, 0x34ff, 0x350e, 0x352b, 0x3535, 0x3550, 0x355e, + 0x3581, 0x3586, 0x358e, 0x8136, 0x35ad, 0x35ce, 0x8137, 0x3608, + 0x360e, 0x363b, 0x3649, 0x3676, 0x3666, 0x8138, 0x366f, 0x3671, + 0x3672, 0x3699, 0x369e, 0x36a9, 0x36ac, 0x36b3, 0x36c9, 0x36ca, + 0x370a, 0x923d, 0x3721, 0x372f, 0x3733, 0x3734, 0x3770, 0x3777, + 0x377c, 0x379c, 0x810f, 0x931b, 0x37b8, 0x37c7, 0x37c8, 0x37cf, + 0x37e4, 0x37ed, 0x37f5, 0x37f6, 0x37ff, 0x3809, 0x8110, 0x3861, + 0x3864, 0x8139, 0x387c, 0x3889, 0x389e, 0x813a, 0x38a9, 0x946e, + 0x38d2, 0x38ce, 0x38d4, 0x38da, 0x38e0, 0x38e9, 0x390c, 0x6641, + 0x395d, 0x396d, 0x398b, 0x3992, 0x39a4, 0x39c3, 0x39d2, 0x39dd, + 0x3a13, 0x3a23, 0x3a67, 0x3a6d, 0x3a77, 0x3a7e, 0x3a84, 0x3a9e, + 0x3aa7, 0x3ac4, 0x98bd, 0x3b19, 0x3b25, 0x325d, + /* 0x13021..0x1307E */ + 0x2e9c, 0x3516, 0x3a03, 0x763f, 0x34c0, 0x411b, 0x4328, 0x39f6, + 0x7022, 0x6475, 0x631c, 0x5a50, 0x40aa, 0x43e1, 0x4e25, 0x45ed, + 0x6466, 0x62a6, 0x7bf5, 0x4893, 0x3727, 0x45a1, 0x4271, 0x3b9b, + 0x39d0, 0x667b, 0x78f4, 0x5d62, 0x5dbe, 0x7b8e, 0x4216, 0x5c9f, + 0x68b7, 0x3b89, 0x3eb5, 0x4309, 0x4697, 0x4848, 0x75c7, 0x778d, + 0x474f, 0x2ee5, 0x2f0a, 0x2f4d, 0x2f9d, 0x3049, 0x36f2, 0x3937, + 0x39d4, 0x3a01, 0x3c09, 0x40df, 0x410f, 0x4170, 0x4613, 0x4905, + 0x50ba, 0x554f, 0x5570, 0x59fb, 0x5dad, 0x5def, 0x60c3, 0x640e, + 0x6863, 0x6b02, 0x7055, 0x707a, 0x333b, 0x2e95, 0x2ea5, 0x37df, + 0x60b2, 0x70c1, 0x58ef, 0x2e00, 0x38f1, 0x4ea2, 0x7038, 0x5a32, + 0x6328, 0x628b, 0x7c2f, 0x3141, 0x3370, 0x34bd, 0x34e1, 0x36e0, + 0x39fb, 0x3f15, 0x78f2, 0x4deb, 0x60e4, 0x652d, + /* 0x13121..0x1317E */ + 0x7662, 0x7670, 0x76a0, 0x77fb, 0x340b, 0x33f3, 0x3b87, 0x50cf, + 0x5fbd, 0x6fc2, 0x76e8, 0x336f, 0x7d5c, 0x5aba, 0x2e11, 0x5893, + 0x61fc, 0x4e26, 0x3618, 0x3504, 0x4b1d, 0x651a, 0x7c3b, 0x39e5, + 0x33a9, 0x4d66, 0x54dc, 0x758f, 0x3642, 0x2e91, 0x704b, 0x76f2, + 0x634f, 0x790c, 0x33e1, 0x35b6, 0x3b30, 0x3f71, 0x4620, 0x46f3, + 0x4804, 0x4c38, 0x4cf3, 0x4d29, 0x545b, 0x56c8, 0x5a4e, 0x7834, + 0x62f1, 0x685b, 0x6a60, 0x72ed, 0x4db2, 0x55ab, 0x56ca, 0x79c5, + 0x40a6, 0x6b01, 0x6d8a, 0x75b2, 0x498e, 0x33ad, 0x3186, 0x3712, + 0x3830, 0x3944, 0x3bb4, 0x3ef6, 0x4028, 0x43a9, 0x43f4, 0x4cbf, + 0x4f14, 0x508e, 0x5114, 0x5159, 0x51d5, 0x533f, 0x5e01, 0x6276, + 0x62d1, 0x6597, 0x7060, 0x725b, 0x7d1b, 0x3869, 0x45bc, 0x4c5a, + 0x5525, 0x31f9, 0x392e, 0x3965, 0x3f80, 0x3fdc, + /* 0x13221..0x1327E */ + 0x42bc, 0x45fa, 0x4a2a, 0x4b27, 0x4bb4, 0x538b, 0x5fc1, 0x6956, + 0x7d2c, 0x7d0e, 0x7ec4, 0x3ca1, 0x4c96, 0x637b, 0x3104, 0x3c4b, + 0x41b6, 0x61c6, 0x4876, 0x5261, 0x2e59, 0x2ffa, 0x3378, 0x4069, + 0x4e29, 0x5a4f, 0x77f3, 0x2e0b, 0x3316, 0x2eee, 0x2f55, 0x2f3d, + 0x2fa1, 0x2f73, 0x32a0, 0x33ef, 0x3609, 0x390f, 0x3ac1, 0x3bb6, + 0x3be1, 0x59d1, 0x4687, 0x479c, 0x47b6, 0x4b4c, 0x4cb3, 0x506b, + 0x53c2, 0x598d, 0x59be, 0x5a3c, 0x5b87, 0x62b1, 0x62db, 0x6304, + 0x6377, 0x63ef, 0x63d3, 0x6766, 0x6ab2, 0x3629, 0x6ca8, 0x6fe6, + 0x704e, 0x771e, 0x668a, 0x2fc4, 0x3ce8, 0x4211, 0x5259, 0x553b, + 0x61e5, 0x62bd, 0x66fe, 0x6cc0, 0x76c5, 0x7913, 0x79d5, 0x2ecb, + 0x2f1a, 0x69e3, 0x36de, 0x384a, 0x38ca, 0x3efb, 0x3feb, 0x402a, + 0x4094, 0x4062, 0x41d0, 0x4212, 0x42d0, 0x4539, + /* 0x13321..0x1337E */ + 0x7b41, 0x4666, 0x48b0, 0x4d77, 0x5070, 0x554c, 0x5686, 0x5d75, + 0x62a5, 0x67f9, 0x758b, 0x768e, 0x6c9d, 0x31f1, 0x32be, 0x3916, + 0x34b3, 0x3bb3, 0x3d16, 0x4168, 0x4982, 0x4daf, 0x588d, 0x64cb, + 0x6857, 0x6a72, 0x73a7, 0x7ab8, 0x4d6c, 0x79a8, 0x66d9, 0x37a3, + 0x47ff, 0x66ce, 0x720e, 0x3283, 0x3687, 0x3404, 0x3ed3, 0x42e1, + 0x44b9, 0x483c, 0x4838, 0x4bbb, 0x5372, 0x58ba, 0x5a6b, 0x699a, + 0x69d2, 0x6d6b, 0x6f03, 0x70ed, 0x75a3, 0x7694, 0x7769, 0x3b66, + 0x3cb3, 0x497d, 0x784d, 0x784e, 0x439b, 0x5b20, 0x4a2b, 0x4a7f, + 0x48b6, 0x7c0d, 0x4f5f, 0x3272, 0x359d, 0x4070, 0x42ec, 0x4d3b, + 0x4e07, 0x4ed1, 0x645b, 0x6910, 0x6f44, 0x2e14, 0x7c39, 0x33f6, + 0x491b, 0x4a3a, 0x7784, 0x482a, 0x315c, 0x5ac3, 0x64b2, 0x71dc, + 0x738c, 0x365b, 0x7d28, 0x4822, 0x6305, 0x6431, + /* 0x13421..0x1347E */ + 0x5ca5, 0x3208, 0x62c5, 0x54e6, 0x2e7e, 0x2f83, 0x31a0, 0x3bd2, + 0x320a, 0x32d8, 0x32e7, 0x3dfb, 0x359a, 0x382a, 0x39e6, 0x3b8c, + 0x3b98, 0x3bdb, 0x3e72, 0x3e79, 0x40a3, 0x411f, 0x4163, 0x41be, + 0x43db, 0x4562, 0x47d1, 0x4853, 0x48fa, 0x4b3e, 0x4b53, 0x4c57, + 0x4f22, 0x4f97, 0x4f45, 0x54b0, 0x5518, 0x56e3, 0x570b, 0x5aff, + 0x5ba1, 0x5c21, 0x5de9, 0x5f36, 0x5ff0, 0x609d, 0x6266, 0x639e, + 0x69b3, 0x6acc, 0x6cab, 0x7084, 0x7451, 0x7593, 0x7591, 0x75a2, + 0x7665, 0x77d3, 0x7928, 0x6218, 0x2e38, 0x342b, 0x3cb8, 0x3dcc, + 0x53a9, 0x564c, 0x573c, 0x3ca9, 0x5feb, 0x6d0b, 0x76c1, 0x7811, + 0x7854, 0x7858, 0x2f01, 0x2f0e, 0x3371, 0x359c, 0x3668, 0x37fa, + 0x3947, 0x3b09, 0x3bc4, 0x3c90, 0x3e0c, 0x3e7e, 0x3fcc, 0x43ee, + 0x473a, 0x45d7, 0x45e2, 0x471f, 0x48cb, 0x48c4, + /* 0x13521..0x1357E */ + 0x4a5f, 0x3e30, 0x4bc5, 0x4c17, 0x4c7d, 0x557f, 0x5948, 0x3b63, + 0x5a00, 0x5d00, 0x3fbd, 0x698f, 0x6a18, 0x6cb4, 0x6d77, 0x6ecc, + 0x6f1d, 0x78e2, 0x7a0e, 0x7b3c, 0x2e80, 0x307d, 0x3100, 0x3993, + 0x3b9c, 0x422f, 0x4280, 0x44ec, 0x4b3a, 0x52a0, 0x5591, 0x5947, + 0x5fa9, 0x67fb, 0x6abc, 0x6b70, 0x43ac, 0x63ca, 0x77a0, 0x3409, + 0x3403, 0x35ab, 0x4854, 0x4a58, 0x6a70, 0x5827, 0x4775, 0x7ecd, + 0x3374, 0x3ba2, 0x611a, 0x6650, 0x7006, 0x2e18, 0x2e45, 0x2ec7, + 0x2f11, 0x33ca, 0x3438, 0x3bae, 0x3f13, 0x4025, 0x4551, 0x473d, + 0x4c42, 0x4c72, 0x4ce3, 0x5078, 0x5403, 0x5a76, 0x5aae, 0x5b08, + 0x5d1a, 0x5cfe, 0x5d66, 0x45e7, 0x525b, 0x33bb, 0x3c45, 0x3de8, + 0x42d2, 0x42e0, 0x4319, 0x4e20, 0x665a, 0x6a31, 0x6ddd, 0x72f8, + 0x4f01, 0x59a6, 0x7b5a, 0x2ea8, 0x2eab, 0x2eac, + /* 0x13621..0x1367E */ + 0x2f9b, 0x2fa0, 0x30d1, 0x3147, 0x5af6, 0x3171, 0x31f6, 0x3354, + 0x3321, 0x337f, 0x33eb, 0x35ac, 0x3883, 0x3ce1, 0x3f37, 0x3f4a, + 0x402f, 0x4050, 0x406d, 0x431f, 0x4559, 0x4a4b, 0x4cc1, 0x52c2, + 0x52ed, 0x57ef, 0x60f8, 0x6105, 0x6208, 0x654e, 0x70f7, 0x73e1, + 0x77ff, 0x7957, 0x7a5a, 0x2ef0, 0x31dd, 0x3c2d, 0x4681, 0x496d, + 0x3c40, 0x46f2, 0x4975, 0x5389, 0x4850, 0x5c81, 0x30c5, 0x32e4, + 0x3747, 0x3dfe, 0x7326, 0x45a4, 0x4b23, 0x4b3d, 0x5434, 0x5981, + 0x59bd, 0x5b4b, 0x5dca, 0x62b9, 0x63cc, 0x687f, 0x695f, 0x6b39, + 0x6fd1, 0x71d1, 0x341f, 0x7280, 0x2e5d, 0x3036, 0x33e5, 0x333a, + 0x52d7, 0x5396, 0x57e9, 0x62e6, 0x6eaf, 0x79c6, 0x79c8, 0x79d2, + 0x3177, 0x411a, 0x665e, 0x35b0, 0x5a7a, 0x3076, 0x3bd3, 0x7047, + 0x7685, 0x2e32, 0x4adb, 0x71e7, 0x3c51, 0x3c48, + /* 0x13721..0x1377E */ + 0x4398, 0x5a9f, 0x4c93, 0x7774, 0x6f61, 0x5aaa, 0x518a, 0x7688, + 0x5c82, 0x4817, 0x5e70, 0x4851, 0x736c, 0x32f2, 0x341b, 0x65ab, + 0x6a13, 0x5fa4, 0x6ecd, 0x70e1, 0x3366, 0x6888, 0x5941, 0x2fc2, + 0x30be, 0x3211, 0x3144, 0x3553, 0x372d, 0x53ea, 0x378b, 0x3951, + 0x3f62, 0x3f84, 0x4075, 0x4176, 0x4167, 0x41a9, 0x43b2, 0x443a, + 0x456c, 0x466f, 0x4842, 0x4e13, 0x5566, 0x5a3d, 0x5cfb, 0x5d4c, + 0x5d99, 0x5e4b, 0x5f6b, 0x630e, 0x634a, 0x66cd, 0x6a08, 0x6a63, + 0x6b66, 0x6efd, 0x781a, 0x7d8f, 0x62b8, 0x6fce, 0x7be8, 0x3287, + 0x421f, 0x4483, 0x4fc0, 0x7699, 0x4841, 0x3091, 0x4b20, 0x4c7a, + 0x4f54, 0x5a74, 0x5d50, 0x6840, 0x6a23, 0x4708, 0x2ef6, 0x3039, + 0x3026, 0x3065, 0x317c, 0x3238, 0x3263, 0x35a7, 0x370f, 0x3805, + 0x3acc, 0x3efa, 0x41b2, 0x41f8, 0x42f3, 0x4372, + /* 0x13821..0x1387E */ + 0x491c, 0x4a29, 0x527d, 0x52ac, 0x532e, 0x5814, 0x586f, 0x5d79, + 0x570c, 0x60a9, 0x698b, 0x6b19, 0x6ce2, 0x6ed2, 0x7063, 0x7375, + 0x767a, 0x7855, 0x7a13, 0x7e78, 0x3143, 0x339f, 0x33b3, 0x3e7b, + 0x3f26, 0x4e1b, 0x4e90, 0x5384, 0x53fe, 0x5d43, 0x6237, 0x6a00, + 0x6afa, 0x7650, 0x2e4e, 0x300b, 0x33e4, 0x347c, 0x36fa, 0x39d1, + 0x3b64, 0x3df1, 0x3eab, 0x3f27, 0x4238, 0x4545, 0x47af, 0x4e56, + 0x52d0, 0x5cca, 0x68b4, 0x60a1, 0x60e1, 0x63f0, 0x664e, 0x6a87, + 0x6de8, 0x7237, 0x76c7, 0x7867, 0x7f13, 0x2e94, 0x2e92, 0x2f0d, + 0x3348, 0x3449, 0x343e, 0x3a2f, 0x3f8c, 0x3fa1, 0x409f, 0x48a7, + 0x4a8e, 0x545a, 0x5881, 0x6a9e, 0x6aa4, 0x6b77, 0x7190, 0x2e5e, + 0x7bc9, 0x2ea4, 0x2f7c, 0x2faf, 0x3019, 0x3016, 0x3149, 0x316c, + 0x329f, 0x32b9, 0x32fe, 0x339a, 0x33e3, 0x3411, + /* 0x13921..0x1397E */ + 0x340e, 0x3589, 0x3751, 0x37a2, 0x397d, 0x3b54, 0x3b5d, 0x3b8f, + 0x3de5, 0x3de7, 0x3df7, 0x3e78, 0x3e83, 0x3e9a, 0x3eb7, 0x3f18, + 0x4052, 0x414c, 0x4297, 0x42d8, 0x43a7, 0x453b, 0x4602, 0x4643, + 0x46f4, 0x476d, 0x4821, 0x4897, 0x49cb, 0x4c5f, 0x4d2a, 0x4d69, + 0x4e2f, 0x4e9d, 0x5532, 0x5687, 0x586c, 0x5a3f, 0x5ce0, 0x5d05, + 0x5d18, 0x5d5e, 0x5db1, 0x6015, 0x6003, 0x60af, 0x60b1, 0x6154, + 0x618f, 0x622a, 0x6352, 0x684c, 0x6861, 0x6b1b, 0x6ca2, 0x6cfc, + 0x70ca, 0x7175, 0x7271, 0x583f, 0x72fc, 0x75a4, 0x764d, 0x7805, + 0x7999, 0x7ad8, 0x7d3b, 0x325b, 0x32ab, 0x33f7, 0x3408, 0x38d5, + 0x42f7, 0x4fe0, 0x6c6a, 0x6f5f, 0x7eb9, 0x314b, 0x323b, 0x344a, + 0x36fd, 0x5a40, 0x7177, 0x7d60, 0x7ed2, 0x5344, 0x4f09, 0x6170, + 0x5511, 0x3ffd, 0x40da, 0x7aa8, 0x52db, 0x6fbc, + /* 0x13A21..0x13A7E */ + 0x4b64, 0x7803, 0x2eca, 0x36f0, 0x3764, 0x38be, 0x3a5a, 0x4068, + 0x41c7, 0x460f, 0x4606, 0x4839, 0x48b1, 0x4df7, 0x55d5, 0x5d3a, + 0x626e, 0x7b42, 0x2e9b, 0x2f50, 0x33c9, 0x3506, 0x3d6f, 0x3de6, + 0x3dee, 0x47fb, 0x4c99, 0x5473, 0x5802, 0x6a50, 0x7396, 0x68df, + 0x3750, 0x3ea7, 0x432b, 0x30b5, 0x30ac, 0x318d, 0x4700, 0x34c9, + 0x385e, 0x39bb, 0x3bb0, 0x3f69, 0x424d, 0x43a1, 0x483d, 0x4b73, + 0x4e08, 0x507d, 0x71c7, 0x5280, 0x5815, 0x5826, 0x596d, 0x458e, + 0x5d30, 0x63dc, 0x68c1, 0x6f09, 0x769b, 0x3264, 0x3728, 0x4750, + 0x5f6a, 0x6ca1, 0x31b4, 0x3742, 0x762a, 0x383a, 0x498a, 0x60b4, + 0x34b2, 0x3d0e, 0x37fc, 0x5895, 0x7dfa, 0x2f5c, 0x324a, 0x348b, + 0x443e, 0x4628, 0x4714, 0x47f5, 0x5a84, 0x5b56, 0x5d22, 0x732f, + 0x485c, 0x7bad, 0x5b39, 0x3319, 0x318a, 0x3237, + /* 0x13B21..0x13B7E */ + 0x3bdf, 0x42f6, 0x44ae, 0x44e6, 0x472d, 0x4bba, 0x65a9, 0x76d1, + 0x5690, 0x7bd6, 0x434c, 0x7306, 0x7bab, 0x56bf, 0x4652, 0x2e09, + 0x3098, 0x33c2, 0x3c71, 0x40e8, 0x4492, 0x4563, 0x485f, 0x51e6, + 0x53ca, 0x5523, 0x5b97, 0x5e82, 0x6695, 0x6b83, 0x6cdb, 0x7178, + 0x7910, 0x45ac, 0x46ab, 0x4b8b, 0x2ed5, 0x2ed4, 0x2f3a, 0x2f7f, + 0x323a, 0x33f8, 0x33f2, 0x35e3, 0x36db, 0x38eb, 0x39cb, 0x39c9, + 0x39ff, 0x3b50, 0x3c4d, 0x3e02, 0x3e2b, 0x3fd7, 0x401d, 0x4307, + 0x452f, 0x3b5c, 0x45af, 0x45bd, 0x45e8, 0x479d, 0x4b62, 0x4b7b, + 0x4c0f, 0x5345, 0x5949, 0x59c1, 0x5cf8, 0x5d19, 0x5d2b, 0x60a2, + 0x6102, 0x61f3, 0x6996, 0x6a5e, 0x6a69, 0x6a66, 0x6a8c, 0x6aee, + 0x6cc7, 0x6cdc, 0x76cc, 0x78fc, 0x4b6f, 0x2e8b, 0x2f3c, 0x2f8d, + 0x3150, 0x3b57, 0x3bfa, 0x4148, 0x4301, 0x4642, + /* 0x13C21..0x13C7E */ + 0x4b21, 0x4ecb, 0x4cbb, 0x523e, 0x54bd, 0x55d4, 0x58c1, 0x593a, + 0x600c, 0x6033, 0x61ea, 0x6494, 0x6f9e, 0x4c50, 0x7e7f, 0x3f0f, + 0x6b58, 0x7d2b, 0x5afa, 0x6ef8, 0x3b8d, 0x76eb, 0x2e03, 0x33f1, + 0x37f7, 0x3931, 0x3ac9, 0x3ba4, 0x4089, 0x4e7f, 0x4f06, 0x55be, + 0x6cea, 0x3b9f, 0x6500, 0x5be0, 0x3072, 0x47f4, 0x629d, 0x3c61, + 0x654a, 0x5e1e, 0x620e, 0x3199, 0x3c04, 0x4368, 0x6d66, 0x459c, + 0x516e, 0x593e, 0x5d17, 0x6005, 0x6b1d, 0x6eca, 0x706e, 0x66c7, + 0x70aa, 0x301f, 0x32fa, 0x3c3a, 0x4753, 0x507c, 0x5235, 0x714c, + 0x71c8, 0x732b, 0x62e5, 0x3bc2, 0x3f31, 0x40f9, 0x2e3b, 0x33d6, + 0x3b88, 0x424b, 0x4731, 0x4b8a, 0x52e9, 0x53e0, 0x5a2e, 0x616b, + 0x6da3, 0x7152, 0x7996, 0x3112, 0x33d7, 0x346a, 0x3bff, 0x4388, + 0x4a39, 0x5dac, 0x7700, 0x36da, 0x33ce, 0x3468, + /* 0x13D21..0x13D7E */ + 0x3b97, 0x3c31, 0x3dde, 0x2fee, 0x4101, 0x42fe, 0x4d32, 0x59c0, + 0x59cb, 0x5d42, 0x5e4d, 0x5fd2, 0x61ed, 0x621f, 0x6490, 0x6846, + 0x6972, 0x6b90, 0x6e74, 0x6f2f, 0x7031, 0x714b, 0x716c, 0x76c6, + 0x719c, 0x2ec0, 0x2f4f, 0x3145, 0x3341, 0x3f93, 0x420e, 0x47d4, + 0x4c41, 0x4e0b, 0x5363, 0x5e26, 0x71cd, 0x7283, 0x33d4, 0x3919, + 0x3bbf, 0x4dd1, 0x595d, 0x5e2e, 0x5c9b, 0x387e, 0x519f, 0x31fa, + 0x6853, 0x6ff0, 0x2fca, 0x3cfb, 0x4625, 0x57ac, 0x5ae3, 0x621c, + 0x79ff, 0x31c6, 0x3faa, 0x45ec, 0x496f, 0x4b89, 0x4df3, 0x4e96, + 0x4f64, 0x56fe, 0x5d14, 0x3de1, 0x7075, 0x7187, 0x7806, 0x31e6, + 0x321d, 0x4240, 0x4691, 0x46d9, 0x4e1a, 0x3eb6, 0x5dd2, 0x5f72, + 0x46f8, 0x65af, 0x65f7, 0x6af8, 0x32a9, 0x33d9, 0x3973, 0x3e8f, + 0x3f90, 0x4055, 0x72e4, 0x7664, 0x30b7, 0x311f, + /* 0x13E21..0x13E7E */ + 0x32dd, 0x3320, 0x3347, 0x33ec, 0x34e8, 0x3546, 0x3531, 0x3617, + 0x3968, 0x39be, 0x3a3c, 0x3bb5, 0x3c06, 0x3c0f, 0x3c11, 0x3c1a, + 0x3e84, 0x3e8a, 0x3ee0, 0x3f70, 0x427f, 0x4284, 0x42db, 0x438c, + 0x4377, 0x4607, 0x460c, 0x462d, 0x4676, 0x477e, 0x48a2, 0x4a1f, + 0x4a35, 0x4cbc, 0x4d88, 0x4e09, 0x4e58, 0x513c, 0x5126, 0x5167, + 0x55c7, 0x5701, 0x585d, 0x5901, 0x5965, 0x59f0, 0x5ae0, 0x5b11, + 0x5ca7, 0x5d39, 0x6096, 0x63d6, 0x648b, 0x6549, 0x685d, 0x68f3, + 0x6a1f, 0x6a3c, 0x6a54, 0x6a73, 0x6c61, 0x6cde, 0x71a4, 0x7266, + 0x737e, 0x7418, 0x769c, 0x7798, 0x2e0a, 0x2e08, 0x2e1e, 0x2e57, + 0x3197, 0x3270, 0x37ce, 0x3834, 0x38cc, 0x3b22, 0x3e38, 0x40c5, + 0x44fe, 0x4761, 0x4756, 0x4d44, 0x52b6, 0x5573, 0x5a63, 0x64b8, + 0x6b72, 0x71b8, 0x7320, 0x3631, 0x37f4, 0x78fe, + /* 0x13F21..0x13F7E */ + 0x42ed, 0x490d, 0x4b96, 0x51ed, 0x5e54, 0x6077, 0x6272, 0x69e6, + 0x78df, 0x6755, 0x6fb1, 0x3c3b, 0x2f38, 0x2fe1, 0x2fb5, 0x3507, + 0x3a20, 0x3bdd, 0x3be9, 0x3fc3, 0x414e, 0x432f, 0x45b0, 0x464b, + 0x48ee, 0x499b, 0x4d78, 0x4df1, 0x5533, 0x55b9, 0x571f, 0x595e, + 0x59e6, 0x5d33, 0x61e3, 0x62af, 0x65aa, 0x69aa, 0x6a3a, 0x6eab, + 0x6f9b, 0x7032, 0x71dd, 0x7707, 0x2eba, 0x2ec1, 0x3203, 0x3875, + 0x38ec, 0x3c0b, 0x551a, 0x3c3d, 0x614e, 0x6a0a, 0x6fc5, 0x7663, + 0x776d, 0x5b25, 0x6acf, 0x7808, 0x7162, 0x36f3, 0x33a8, 0x7017, + 0x3439, 0x3782, 0x3e25, 0x43a8, 0x4c34, 0x508a, 0x5761, 0x5c8b, + 0x5fe0, 0x6870, 0x7042, 0x7154, 0x7310, 0x7318, 0x768f, 0x545e, + 0x7ac4, 0x3d07, 0x3d69, 0x4570, 0x47a2, 0x6da8, 0x76db, 0x436e, + 0x4749, 0x4919, 0x63c5, 0x7817, 0x76c0, 0x68fe, + /* 0x14021..0x1407E */ + 0x4f84, 0x447a, 0x3bf8, 0x2e16, 0x502c, 0x555d, 0x462f, 0x31c4, + 0x3236, 0x32e2, 0x39d3, 0x3f81, 0x4027, 0x4210, 0x453f, 0x4574, + 0x461f, 0x4674, 0x48f2, 0x4816, 0x4b63, 0x4e05, 0x5272, 0x551f, + 0x56db, 0x5cbe, 0x6056, 0x38f0, 0x68fd, 0x697f, 0x6aa0, 0x6a93, + 0x6acb, 0x701d, 0x7192, 0x7752, 0x7759, 0x4589, 0x5a0e, 0x6106, + 0x76bb, 0x3e2d, 0x40dc, 0x421a, 0x45a5, 0x4614, 0x4790, 0x57f3, + 0x5a4d, 0x5c4d, 0x5e3e, 0x610a, 0x6cac, 0x6d64, 0x6de1, 0x6e5f, + 0x58a9, 0x3207, 0x42d9, 0x43a5, 0x4442, 0x4298, 0x6a2d, 0x5a83, + 0x5bc0, 0x6aac, 0x76ea, 0x5d76, 0x620c, 0x6749, 0x2ed9, 0x3148, + 0x3343, 0x3360, 0x3ba3, 0x3c02, 0x3c16, 0x3ddd, 0x4226, 0x4247, + 0x44b0, 0x4813, 0x4834, 0x4cc9, 0x4d45, 0x4d17, 0x47d3, 0x4f5c, + 0x514e, 0x517d, 0x45cb, 0x5a7f, 0x5bad, 0x5dda, + /* 0x14121..0x1417E */ + 0x5e4a, 0x5fa8, 0x617a, 0x621b, 0x6239, 0x65a6, 0x6a6e, 0x6cce, + 0x6df5, 0x7078, 0x7077, 0x72ad, 0x7291, 0x7583, 0x7bae, 0x324d, + 0x3584, 0x4f38, 0x5136, 0x3168, 0x5985, 0x5e55, 0x61b3, 0x5cce, + 0x364c, 0x3851, 0x3ca8, 0x43aa, 0x46fe, 0x46fd, 0x495a, 0x52d9, + 0x558f, 0x558e, 0x590e, 0x5956, 0x59df, 0x5c97, 0x5d20, 0x5d44, + 0x6607, 0x6a34, 0x763b, 0x7061, 0x7f20, 0x30e7, 0x3275, 0x33cc, + 0x33e2, 0x3009, 0x35aa, 0x38ee, 0x394f, 0x523d, 0x3b8b, 0x3c64, + 0x331d, 0x40e3, 0x40f3, 0x435c, 0x4383, 0x433f, 0x43bb, 0x44cd, + 0x45e9, 0x46f9, 0x3de3, 0x49cd, 0x49fd, 0x4f15, 0x51e5, 0x2e89, + 0x55e9, 0x56f8, 0x5a93, 0x5cdf, 0x5dcf, 0x5d9c, 0x6061, 0x6349, + 0x6358, 0x646c, 0x64bc, 0x65fb, 0x68c5, 0x6d70, 0x7001, 0x706d, + 0x7397, 0x771c, 0x7a12, 0x30cf, 0x3897, 0x418e, + /* 0x14221..0x1427E */ + 0x61d3, 0x6535, 0x6d08, 0x7020, 0x2fc3, 0x3074, 0x3247, 0x3373, + 0x406f, 0x4349, 0x475f, 0x4e2c, 0x6db3, 0x701f, 0x2fd7, 0x3c5e, + 0x6cca, 0x45cf, 0x5d9a, 0x3352, 0x6896, 0x3176, 0x43c3, 0x3b58, + 0x3b6b, 0x3c0a, 0x440d, 0x4751, 0x705c, 0x2ed6, 0x391a, 0x392a, + 0x4c70, 0x6a51, 0x353e, 0x3815, 0x39a5, 0x40f0, 0x4253, 0x47c1, + 0x6235, 0x4955, 0x7640, 0x79c4, 0x7a28, 0x2f53, 0x3806, 0x3bfe, + 0x6010, 0x3cb1, 0x3e2f, 0x3f85, 0x4020, 0x414b, 0x4234, 0x46ff, + 0x4cf0, 0x4ede, 0x60ce, 0x617f, 0x62d4, 0x688b, 0x6cb8, 0x7000, + 0x702e, 0x768a, 0x7edb, 0x7bdb, 0x2ee3, 0x33f0, 0x3927, 0x5b2c, + 0x718d, 0x784c, 0x7df9, 0x4edd, 0x5027, 0x3353, 0x3544, 0x3b85, + 0x4258, 0x429e, 0x42d3, 0x4ca2, 0x4fef, 0x5422, 0x6a17, 0x7438, + 0x4fc1, 0x6afe, 0x6338, 0x31e7, 0x66f8, 0x33ea, + /* 0x14321..0x1437E */ + 0x33e9, 0x2f46, 0x7054, 0x6fb0, 0x396a, 0x6131, 0x3dfd, 0x5aea, + 0x6fbf, 0x48da, 0x6c37, 0x52f8, 0x7c48, 0x4a3d, 0x6ab0, 0x2e39, + 0x3358, 0x3606, 0x3766, 0x42c5, 0x43a2, 0x45e6, 0x4b4e, 0x4de1, + 0x4e5b, 0x50ad, 0x57ed, 0x5aef, 0x5baa, 0x5dbb, 0x603d, 0x60c6, + 0x66cb, 0x6a95, 0x735b, 0x36e3, 0x38c7, 0x3f3e, 0x45ad, 0x4696, + 0x4a80, 0x4bb5, 0x5537, 0x6ac7, 0x3024, 0x57e5, 0x3730, 0x3f1b, + 0x4065, 0x467a, 0x4c60, 0x55f4, 0x5a1a, 0x5f6e, 0x61f4, 0x6718, + 0x7045, 0x79b3, 0x5bc9, 0x555c, 0x5af9, 0x5b51, 0x64c4, 0x7010, + 0x59e9, 0x5a92, 0x6336, 0x3ae1, 0x5740, 0x2e2d, 0x2ef2, 0x3b99, + 0x3fe0, 0x42bd, 0x463c, 0x47f1, 0x4ce8, 0x666b, 0x6877, 0x6a3b, + 0x714e, 0x72f3, 0x79d0, 0x4a17, 0x5026, 0x532a, 0x62e7, 0x6457, + 0x6caf, 0x2e01, 0x3146, 0x31cb, 0x358b, 0x3bf5, + /* 0x14421..0x1447E */ + 0x3e16, 0x3e33, 0x3e81, 0x3f14, 0x3f35, 0x3f6b, 0x3fb4, 0x41f2, + 0x4311, 0x46a2, 0x471d, 0x4f6e, 0x5252, 0x553a, 0x573a, 0x6074, + 0x6139, 0x6178, 0x6776, 0x6abf, 0x6adc, 0x6d85, 0x6df3, 0x729a, + 0x7577, 0x7802, 0x7ce5, 0x32c5, 0x4357, 0x56f4, 0x4715, 0x4c88, + 0x53cd, 0x6cc3, 0x73ae, 0x7673, 0x4d25, 0x389c, 0x490e, 0x49cc, + 0x6ffd, 0x739a, 0x55db, 0x701a, 0x385a, 0x4802, 0x43b4, 0x49fb, + 0x2f43, 0x4f2c, 0x47d8, 0x6fbb, 0x6526, 0x5db4, 0x7354, 0x493f, + 0x4f70, 0x376a, 0x38f7, 0x3b2c, 0x5d2c, 0x522a, 0x340a, 0x71e3, + 0x7db4, 0x2ead, 0x2f4e, 0x305c, 0x3075, 0x3243, 0x6c9e, 0x3448, + 0x3824, 0x3b9a, 0x3e1d, 0x3e95, 0x3ead, 0x3ef7, 0x3f1f, 0x408c, + 0x42b5, 0x433a, 0x43d0, 0x48af, 0x4c40, 0x5887, 0x598e, 0x5a0b, + 0x5de0, 0x6247, 0x6a02, 0x6ae6, 0x6e44, 0x7013, + /* 0x14521..0x1457E */ + 0x70b8, 0x712d, 0x71d8, 0x7f0e, 0x4ce5, 0x4458, 0x44e2, 0x4575, + 0x4ef4, 0x5684, 0x5b1b, 0x7069, 0x73d1, 0x4eba, 0x34f2, 0x3fb9, + 0x44a4, 0x6f4d, 0x6fed, 0x7244, 0x3178, 0x386b, 0x3929, 0x3c55, + 0x3e97, 0x4dfb, 0x5e8f, 0x551c, 0x6cbc, 0x6ee2, 0x785b, 0x50b9, + 0x2f1d, 0x4bbf, 0x4fb1, 0x5530, 0x76fb, 0x314e, 0x3410, 0x3835, + 0x3857, 0x39ac, 0x3c60, 0x3f92, 0x4597, 0x475c, 0x4e21, 0x567b, + 0x63df, 0x6ced, 0x7014, 0x70fd, 0x734d, 0x5825, 0x583a, 0x32aa, + 0x3ea6, 0x371f, 0x3974, 0x4012, 0x3012, 0x315a, 0x31ac, 0x31cd, + 0x3200, 0x3510, 0x3854, 0x3858, 0x3957, 0x3b95, 0x3cf6, 0x3d8b, + 0x40bc, 0x4295, 0x442d, 0x4771, 0x4843, 0x48bc, 0x48df, 0x56d7, + 0x4dd8, 0x4e6f, 0x4d9b, 0x506f, 0x51c8, 0x3f53, 0x55d8, 0x5977, + 0x5b49, 0x5b54, 0x5b52, 0x5cd6, 0x5d71, 0x3230, + /* 0x14621..0x1467E */ + 0x6463, 0x6569, 0x65e4, 0x6a0e, 0x6b04, 0x6c46, 0x6e0f, 0x7003, + 0x700f, 0x7419, 0x7676, 0x782d, 0x7a30, 0x75d8, 0x30cd, 0x32d5, + 0x340c, 0x3802, 0x3c0e, 0x41a7, 0x449e, 0x4d1e, 0x57b3, 0x5ae5, + 0x60f4, 0x6404, 0x7053, 0x7285, 0x3ce0, 0x7d07, 0x333f, 0x3f97, + 0x3fb3, 0x4d9c, 0x5279, 0x5763, 0x59bf, 0x5be4, 0x4bd2, 0x52ec, + 0x6aad, 0x4803, 0x4a61, 0x31f8, 0x5a81, 0x4934, 0x3c4a, 0x7cf6, + 0x62eb, 0x3bc5, 0x7149, 0x501e, 0x3678, 0x3c6f, 0x40c7, 0x4566, + 0x4c8c, 0x6c5a, 0x7041, 0x7813, 0x3451, 0x46c7, 0x720d, 0x3948, + 0x70a3, 0x3185, 0x2e4d, 0x31ea, 0x6599, 0x6b0e, 0x5058, 0x437a, + 0x734b, 0x4962, 0x79b4, 0x5e04, 0x5577, 0x3357, 0x4960, 0x6edf, + 0x76e3, 0x4c5d, 0x2e8c, 0x3c3c, 0x3f10, 0x6fe9, 0x3302, 0x6cd1, + 0x6089, 0x6679, 0x3eff, 0x45e5, 0x2e73, 0x3165, + /* 0x14721..0x1477E */ + 0x3982, 0x3c3f, 0x77ee, 0x2efb, 0x398a, 0x3fcd, 0x6a8d, 0x4fe1, + 0x59b0, 0x5962, 0x3be7, 0x6471, 0x532b, 0x51b1, 0x3e74, 0x3ff5, + 0x437b, 0x449a, 0x51c3, 0x5c98, 0x2e43, 0x3efc, 0x2e4b, 0x37dc, + 0x36a2, 0x40a9, 0x4fc3, 0x5d0d, 0x60fd, 0x6133, 0x61bf, 0x6fb2, + 0x6997, 0x66a4, 0x3df4, 0x428a, 0x44ad, 0x6987, 0x4777, 0x4ce2, + 0x4d3e, 0x5436, 0x5834, 0x3a46, 0x5f75, 0x62ad, 0x79ac, 0x2ff3, + 0x3ec3, 0x42dd, 0x4392, 0x4557, 0x476f, 0x56c3, 0x524c, 0x60cc, + 0x60ba, 0x6f29, 0x714d, 0x300d, 0x37f9, 0x3a92, 0x4885, 0x4973, + 0x5164, 0x52fd, 0x6cb7, 0x38f2, 0x6ce0, 0x766a, 0x7019, 0x677f, + 0x59e4, 0x57e7, 0x6429, 0x2f2f, 0x3265, 0x335a, 0x42cd, 0x47cf, + 0x4cca, 0x567d, 0x5b94, 0x5c95, 0x6236, 0x6584, 0x6feb, 0x46dd, + 0x4f20, 0x5206, 0x5e1b, 0x63ab, 0x79c1, 0x7ea6, + /* 0x14821..0x1487E */ + 0x31fd, 0x5bb1, 0x5872, 0x5bb8, 0x6087, 0x5b48, 0x4ae8, 0x3e61, + 0x608c, 0x5551, 0x5560, 0x316b, 0x7262, 0x4e8c, 0x567a, 0x7197, + 0x7aea, 0x2f10, 0x5f70, 0x429c, 0x5b4f, 0x75a5, 0x7ce9, 0x367a, + 0x3859, 0x66e4, 0x76bc, 0x2f34, 0x3224, 0x334a, 0x33cd, 0x33db, + 0x3e06, 0x442c, 0x4591, 0x477f, 0x4c3e, 0x4c4e, 0x5248, 0x52af, + 0x53ed, 0x5554, 0x5e41, 0x622c, 0x65e9, 0x6ca9, 0x5bc4, 0x71c6, + 0x5169, 0x7812, 0x78ef, 0x433d, 0x4669, 0x556a, 0x56e4, 0x58d0, + 0x6543, 0x66ee, 0x332a, 0x3351, 0x3426, 0x3983, 0x3e87, 0x3f7c, + 0x40b2, 0x4249, 0x4279, 0x42ab, 0x4590, 0x4bd4, 0x4ccc, 0x55b2, + 0x56ae, 0x5891, 0x59d8, 0x5dcb, 0x5f77, 0x60a5, 0x68ab, 0x6ab9, + 0x6cbb, 0x707f, 0x775e, 0x78db, 0x4a0b, 0x5c38, 0x3099, 0x3c3e, + 0x3fae, 0x4787, 0x4bd8, 0x5435, 0x5709, 0x5f8e, + /* 0x14921..0x1497E */ + 0x7f3b, 0x47ca, 0x5a17, 0x3339, 0x558b, 0x7aed, 0x3f66, 0x619d, + 0x63f1, 0x6098, 0x3f3c, 0x3fc5, 0x5562, 0x5b46, 0x703c, 0x4867, + 0x39eb, 0x3a9b, 0x5d10, 0x567e, 0x6b2c, 0x2ff5, 0x3f6a, 0x4a19, + 0x4c37, 0x4f02, 0x54e2, 0x5968, 0x6868, 0x6a55, 0x6c79, 0x3edf, + 0x43cf, 0x55c5, 0x59d2, 0x62d7, 0x7328, 0x72f2, 0x649c, 0x66ed, + 0x7c2d, 0x34c1, 0x3f6c, 0x458c, 0x4d5c, 0x5015, 0x6ca7, 0x6cd3, + 0x783b, 0x454f, 0x54f6, 0x2e0d, 0x2ed8, 0x37e0, 0x392b, 0x3a66, + 0x3bcc, 0x31a8, 0x3e03, 0x3e9c, 0x4016, 0x4276, 0x4577, 0x45a7, + 0x466e, 0x4d6e, 0x5236, 0x5b26, 0x6150, 0x619a, 0x6299, 0x6b5c, + 0x6ca0, 0x6ce6, 0x6d74, 0x761c, 0x7644, 0x2fae, 0x44ab, 0x4b66, + 0x621e, 0x6461, 0x656a, 0x70e8, 0x3c01, 0x4953, 0x78a8, 0x647a, + 0x6557, 0x2f0f, 0x326f, 0x3fa9, 0x3e45, 0x470d, + /* 0x14A21..0x14A7E */ + 0x598f, 0x6179, 0x6907, 0x6986, 0x4df5, 0x3f17, 0x4255, 0x4cb8, + 0x2ecf, 0x5269, 0x7b92, 0x3206, 0x343b, 0x3674, 0x38b3, 0x41a4, + 0x426e, 0x511a, 0x396e, 0x5c89, 0x5cde, 0x5d1b, 0x76f0, 0x4587, + 0x605e, 0x2e19, 0x2f75, 0x3175, 0x3840, 0x3e63, 0x3e73, 0x3f0a, + 0x47c4, 0x2e26, 0x653d, 0x7589, 0x765b, 0x5c73, 0x7801, 0x30fb, + 0x38c1, 0x5656, 0x58a7, 0x3225, 0x57a5, 0x6511, 0x5b86, 0x304f, + 0x3909, 0x5247, 0x5bc7, 0x5de8, 0x6fba, 0x6fd4, 0x704d, 0x2fbf, + 0x32c9, 0x3a29, 0x3f01, 0x77ad, 0x2fdd, 0x6217, 0x72ea, 0x3703, + 0x4355, 0x4b69, 0x552b, 0x68dc, 0x6f14, 0x5a42, 0x32df, 0x3893, + 0x4155, 0x420a, 0x46ae, 0x4bcd, 0x5c3f, 0x63e9, 0x3023, 0x2ff8, + 0x3305, 0x3446, 0x3831, 0x3949, 0x3b9d, 0x3cf0, 0x3cef, 0x3d29, + 0x3e96, 0x42b1, 0x4367, 0x453e, 0x45b9, 0x470b, + /* 0x14B21..0x14B7E */ + 0x4cd5, 0x4ce1, 0x50f9, 0x5832, 0x5e2b, 0x60de, 0x62b3, 0x640c, + 0x64ec, 0x6702, 0x6912, 0x6a2a, 0x6c4a, 0x70a6, 0x72d2, 0x78fd, + 0x7cf3, 0x7d6c, 0x2e4f, 0x2ea1, 0x308d, 0x3256, 0x374a, 0x39a8, + 0x3e3d, 0x3fd8, 0x3fd9, 0x423f, 0x46b4, 0x471b, 0x47d0, 0x48d2, + 0x3192, 0x5d21, 0x60aa, 0x61a8, 0x6b00, 0x6c8c, 0x6cbf, 0x727e, + 0x7632, 0x3420, 0x782c, 0x3317, 0x30d5, 0x335c, 0x38a8, 0x44b2, + 0x4734, 0x5267, 0x5766, 0x5a46, 0x71e6, 0x32c3, 0x4ca1, 0x4b86, + 0x3800, 0x3e4c, 0x3954, 0x472c, 0x5ffb, 0x31e1, 0x56c6, 0x4469, + 0x58e8, 0x7b54, 0x7ebb, 0x37cb, 0x39b9, 0x4627, 0x479a, 0x4bce, + 0x34e9, 0x49d9, 0x3e55, 0x619c, 0x4795, 0x7baa, 0x47fe, 0x7c52, + 0x485d, 0x2ea6, 0x2fe3, 0x33c8, 0x42b9, 0x472b, 0x4cab, 0x6fc4, + 0x2fad, 0x5e6d, 0x7ebf, 0x2e07, 0x4162, 0x4e80, + /* 0x14C21..0x14C7E */ + 0x4f2b, 0x6513, 0x3473, 0x472a, 0x7b45, 0x3df3, 0x5b95, 0x3cac, + 0x3bc6, 0x671c, 0x4e4a, 0x64d1, 0x5a14, 0x6108, 0x3999, 0x5c8d, + 0x4c11, 0x5720, 0x32d9, 0x3922, 0x5121, 0x525f, 0x57db, 0x7727, + 0x7d61, 0x490b, 0x3a7f, 0x3a18, 0x31a5, 0x340d, 0x347d, 0x460e, + 0x56df, 0x6ff7, 0x7298, 0x7cf4, 0x39ea, 0x525d, 0x4ec5, 0x314d, + 0x48c9, 0x5dbf, 0x5dec, 0x7762, 0x7eba, 0x4478, 0x4a21, 0x6302, + 0x3984, 0x3b5f, 0x4bdb, 0x531b, 0x56f2, 0x5db2, 0x6017, 0x6499, + 0x3132, 0x4728, 0x7ed9, 0x56ee, 0x4762, 0x32ff, 0x7905, 0x3c24, + 0x423b, 0x5c7e, 0x6cb0, 0x354f, 0x40b6, 0x5d0b, 0x7580, 0x3301, + 0x2e5f, 0x31b6, 0x391c, 0x523a, 0x6036, 0x71ce, 0x3f25, 0x57e2, + 0x3384, 0x3f79, 0x5d04, 0x65ac, 0x6a33, 0x6e8d, 0x7756, 0x47f3, + 0x65ae, 0x7453, 0x4109, 0x4108, 0x4cb9, 0x5652, + /* 0x14D21..0x14D7E */ + 0x6aed, 0x6f38, 0x352f, 0x2f51, 0x312a, 0x32c7, 0x33cb, 0x3ba5, + 0x3e7d, 0x40a0, 0x4182, 0x43d6, 0x4709, 0x47da, 0x4e67, 0x4d8c, + 0x5336, 0x5337, 0x5531, 0x5950, 0x68d5, 0x6a98, 0x704a, 0x7091, + 0x70f5, 0x76c4, 0x678d, 0x3915, 0x2e88, 0x2f59, 0x2e0e, 0x6a89, + 0x6f3f, 0x7810, 0x30ad, 0x3e7c, 0x3996, 0x3bb9, 0x3eb8, 0x43da, + 0x43fa, 0x44c1, 0x46dc, 0x494a, 0x49d8, 0x4d0b, 0x4eb6, 0x5194, + 0x5528, 0x5aaf, 0x5f8a, 0x6000, 0x6449, 0x64c9, 0x6981, 0x6b21, + 0x6e0a, 0x7065, 0x767d, 0x790a, 0x417e, 0x4291, 0x4b32, 0x4c83, + 0x4d74, 0x5fcc, 0x5ffc, 0x4dc0, 0x5f85, 0x67ba, 0x68f8, 0x4765, + 0x63b1, 0x783c, 0x76f7, 0x4d1b, 0x5d61, 0x643d, 0x716a, 0x2e71, + 0x3375, 0x3d50, 0x4b04, 0x4feb, 0x65cd, 0x662d, 0x69a7, 0x3229, + 0x340f, 0x3c65, 0x474e, 0x48a8, 0x5406, 0x5483, + /* 0x14E21..0x14E7E */ + 0x55e2, 0x68cf, 0x68e1, 0x71cc, 0x76e2, 0x7678, 0x3f8b, 0x5387, + 0x5acb, 0x644e, 0x43a0, 0x5565, 0x3289, 0x4d41, 0x4e9c, 0x5409, + 0x5559, 0x586b, 0x5c92, 0x7686, 0x5adc, 0x7f8d, 0x2fb6, 0x416e, + 0x45c5, 0x665c, 0x2e86, 0x2eae, 0x30da, 0x2e21, 0x31cc, 0x3bee, + 0x4599, 0x4881, 0x4dbc, 0x531f, 0x5642, 0x57ad, 0x5a1c, 0x5ce7, + 0x626f, 0x6ad2, 0x707c, 0x71cf, 0x7675, 0x7818, 0x329b, 0x5dd1, + 0x302b, 0x3398, 0x4797, 0x4dcb, 0x51d0, 0x5433, 0x61e8, 0x6f2a, + 0x76a3, 0x7c57, 0x7e9f, 0x5460, 0x3841, 0x4d99, 0x5d2f, 0x785e, + 0x2ee4, 0x2f36, 0x2f8b, 0x31b7, 0x32b1, 0x3dba, 0x401c, 0x53b2, + 0x593c, 0x62d3, 0x7234, 0x76b7, 0x76f6, 0x770a, 0x7e97, 0x7f62, + 0x46a6, 0x4b74, 0x3217, 0x32a3, 0x50c8, 0x68c2, 0x3ec9, 0x404b, + 0x4190, 0x4f23, 0x5149, 0x5c3e, 0x5df4, 0x606f, + /* 0x14F21..0x14F7E */ + 0x64ee, 0x7023, 0x732c, 0x3442, 0x7b6f, 0x4ad3, 0x5089, 0x6cc2, + 0x6def, 0x7732, 0x32b4, 0x3a41, 0x3eca, 0x3f04, 0x4717, 0x497c, + 0x4994, 0x4d6a, 0x4f0f, 0x5262, 0x52fc, 0x5bed, 0x6001, 0x607e, + 0x674b, 0x70ce, 0x316d, 0x7e93, 0x5984, 0x608b, 0x7332, 0x6ad6, + 0x302d, 0x348c, 0x6a71, 0x4b6a, 0x6cc4, 0x6107, 0x40d1, 0x47a0, + 0x7df2, 0x2e99, 0x2e98, 0x7c10, 0x6a6b, 0x65c1, 0x6568, 0x4900, + 0x4e7e, 0x5897, 0x6155, 0x8e9f, 0x3b41, 0x3b56, 0x3b7d, 0x3b93, + 0x3bd8, 0x3bec, 0x3c12, 0x3c1e, 0x3c23, 0x3c2b, 0x178d, 0x3c62, + 0x813b, 0x813c, 0x96b4, 0x3c7a, 0x3c8f, 0x3c9f, 0x3ca3, 0x3caa, + 0x3cba, 0x3ccb, 0x3cd0, 0x3cd2, 0x3cf4, 0x9c34, 0x17e2, 0x3d0d, + 0x3d27, 0x8111, 0x3d46, 0x3d47, 0x3d53, 0x3d4a, 0x3d6d, 0x3d81, + 0x3da0, 0x3da4, 0x3da7, 0x3db8, 0x3dcb, 0x341e, + /* 0x15021..0x1507E */ + 0x3f0c, 0x2e10, 0x2e15, 0x2e2a, 0x2e31, 0x2e36, 0x2e3c, 0x2e3f, + 0x2e42, 0x2e56, 0x2e58, 0x2e82, 0x2e85, 0x6c6b, 0x2e8a, 0x6212, + 0x3f0d, 0x2e8e, 0x2e9e, 0x2e9f, 0x2ea0, 0x2ea2, 0x2eb0, 0x2eb3, + 0x2eb6, 0x2ece, 0x2ecd, 0x2ec4, 0x2ec6, 0x2ec2, 0x2ed7, 0x2ede, + 0x2eed, 0x2edf, 0x2ef7, 0x2f09, 0x2f5a, 0x2f30, 0x2f5b, 0x2f5d, + 0x2f57, 0x2f47, 0x2f76, 0x2f88, 0x2f8f, 0x2f98, 0x2f7b, 0x2f69, + 0x2f70, 0x2f91, 0x2f6f, 0x2f86, 0x2f96, 0x3118, 0x2fd4, 0x2fdf, + 0x2fce, 0x2fd8, 0x2fdb, 0x2fd1, 0x2fda, 0x2fd0, 0x2fe4, 0x2fe5, + 0x301a, 0x3028, 0x3014, 0x302a, 0x3025, 0x3005, 0x2f1c, 0x2ff6, + 0x3021, 0x3029, 0x302c, 0x2ffe, 0x2fef, 0x3011, 0x3006, 0x3043, + 0x3047, 0x4703, 0x3055, 0x3050, 0x3048, 0x305a, 0x3056, 0x306c, + 0x3078, 0x3080, 0x309a, 0x3085, 0x30b4, 0x30b2, + /* 0x15121..0x1517E */ + 0x30c9, 0x30ca, 0x30b3, 0x30c2, 0x30d6, 0x30de, 0x30e5, 0x30ed, + 0x30e3, 0x30ee, 0x30f9, 0x30f5, 0x3109, 0x3101, 0x3102, 0x3116, + 0x3115, 0x3114, 0x311a, 0x3121, 0x313a, 0x3137, 0x313c, 0x313b, + 0x313f, 0x3140, 0x3152, 0x314c, 0x3154, 0x3162, 0x5af8, 0x3169, + 0x316a, 0x316e, 0x3180, 0x3182, 0x36d8, 0x318c, 0x3189, 0x318f, + 0x3191, 0x3193, 0x3195, 0x3196, 0x31a4, 0x31a6, 0x31a2, 0x31a9, + 0x31aa, 0x31ab, 0x31b3, 0x31b1, 0x31b2, 0x31b0, 0x31b5, 0x31bd, + 0x31c5, 0x31c9, 0x31db, 0x31e0, 0x6655, 0x31e9, 0x31ed, 0x31f0, + 0x31f5, 0x31fe, 0x3204, 0x320b, 0x3214, 0x320e, 0x3227, 0x322a, + 0x322e, 0x3233, 0x3239, 0x324f, 0x3244, 0x324b, 0x324c, 0x325e, + 0x3254, 0x326a, 0x3274, 0x3269, 0x3273, 0x327f, 0x327d, 0x328d, + 0x3294, 0x3292, 0x3271, 0x3288, 0x3291, 0x6fa8, + /* 0x15221..0x1527E */ + 0x6fa7, 0x32ac, 0x32ad, 0x32bc, 0x32b5, 0x32c1, 0x32cd, 0x32d7, + 0x32de, 0x32e3, 0x32e6, 0x78ed, 0x32e0, 0x32f3, 0x32f5, 0x32f8, + 0x32f9, 0x3306, 0x3308, 0x5538, 0x330d, 0x3310, 0x330f, 0x3315, + 0x331a, 0x3323, 0x332f, 0x3331, 0x3333, 0x3338, 0x3340, 0x3346, + 0x3345, 0x2e17, 0x3349, 0x334d, 0x31d6, 0x335e, 0x3369, 0x336e, + 0x3918, 0x337b, 0x3377, 0x3382, 0x3396, 0x33a0, 0x33a6, 0x33a5, + 0x33ae, 0x33b0, 0x33b6, 0x33c3, 0x5c12, 0x76d9, 0x33df, 0x46fc, + 0x51ee, 0x33ee, 0x33e8, 0x33ed, 0x33fa, 0x3401, 0x343d, 0x3440, + 0x342c, 0x342d, 0x343c, 0x342e, 0x3436, 0x3429, 0x341d, 0x344e, + 0x348f, 0x3475, 0x348e, 0x345f, 0x3471, 0x3477, 0x3470, 0x3492, + 0x347b, 0x3480, 0x3476, 0x3484, 0x3490, 0x3486, 0x34c7, 0x34a2, + 0x34b8, 0x34a5, 0x34ac, 0x34c4, 0x34c8, 0x34a8, + /* 0x15321..0x1537E */ + 0x34ab, 0x34c2, 0x34a4, 0x34be, 0x34bc, 0x34d8, 0x34e5, 0x34e6, + 0x350f, 0x3514, 0x34fd, 0x34ee, 0x34ed, 0x34fa, 0x34e2, 0x3539, + 0x3540, 0x3563, 0x354c, 0x352e, 0x355c, 0x3545, 0x3556, 0x3557, + 0x3538, 0x3533, 0x355d, 0x3599, 0x3580, 0x34af, 0x358a, 0x359f, + 0x357b, 0x357e, 0x3598, 0x359e, 0x35ae, 0x357c, 0x3583, 0x35a9, + 0x3587, 0x35a8, 0x35da, 0x35c5, 0x35df, 0x35c4, 0x35dc, 0x35e4, + 0x35d4, 0x3614, 0x35f7, 0x3616, 0x35fe, 0x35fd, 0x361b, 0x35f9, + 0x364e, 0x3650, 0x51df, 0x3634, 0x3636, 0x3632, 0x3638, 0x366b, + 0x3664, 0x362f, 0x366c, 0x366a, 0x3686, 0x3680, 0x368a, 0x36a0, + 0x3694, 0x368f, 0x36a5, 0x36ae, 0x36b6, 0x36b4, 0x36c2, 0x36bc, + 0x36c1, 0x36c3, 0x36c0, 0x36c8, 0x36ce, 0x36d1, 0x36d3, 0x36d7, + 0x36ee, 0x36f9, 0x3700, 0x36ff, 0x3704, 0x3709, + /* 0x15421..0x1547E */ + 0x3708, 0x370b, 0x370d, 0x3713, 0x3718, 0x3716, 0x35c7, 0x371c, + 0x3726, 0x3737, 0x3738, 0x374e, 0x373b, 0x3740, 0x374f, 0x3769, + 0x37c0, 0x3788, 0x3761, 0x377f, 0x3789, 0x3793, 0x37a0, 0x37b3, + 0x37a4, 0x37aa, 0x37b0, 0x37c3, 0x37c6, 0x37d4, 0x37d2, 0x37d3, + 0x380a, 0x37d6, 0x37e3, 0x380b, 0x3819, 0x381d, 0x3872, 0x3821, + 0x3862, 0x384b, 0x3870, 0x4bc0, 0x3852, 0x383d, 0x3879, 0x3885, + 0x38b9, 0x389f, 0x38ab, 0x38ba, 0x38de, 0x38bb, 0x38b8, 0x38ae, + 0x38c5, 0x38d3, 0x38d1, 0x38d7, 0x38d9, 0x38d8, 0x38e5, 0x38dc, + 0x38e4, 0x38df, 0x38ef, 0x38fa, 0x38f9, 0x38fb, 0x38fc, 0x38fd, + 0x3902, 0x390a, 0x3910, 0x391b, 0x48a6, 0x3925, 0x392c, 0x392d, + 0x3932, 0x3938, 0x393e, 0x5ad2, 0x3955, 0x3950, 0x394e, 0x395a, + 0x3958, 0x3962, 0x3960, 0x3967, 0x396c, 0x3969, + /* 0x15521..0x1557E */ + 0x3978, 0x3981, 0x399d, 0x2f5e, 0x2fab, 0x39a3, 0x39b2, 0x39c6, + 0x39e8, 0x39dc, 0x398d, 0x39d9, 0x39da, 0x3a25, 0x3a1f, 0x3a11, + 0x3a1c, 0x3a09, 0x3a1a, 0x3a40, 0x3a6c, 0x3a49, 0x3a35, 0x3a36, + 0x3a62, 0x3a6a, 0x3a9a, 0x3abc, 0x3abe, 0x3acb, 0x3ac2, 0x3abd, + 0x3ae3, 0x3ad7, 0x3ae6, 0x3ae9, 0x3ad6, 0x3afa, 0x3afb, 0x3b0c, + 0x3b0b, 0x3b16, 0x3b32, 0x3ad0, 0x3b2a, 0x3b36, 0x3b3e, 0x3b43, + 0x3b45, 0x3b40, 0x3b51, 0x3b55, 0x3b5a, 0x3b5b, 0x3b65, 0x3b69, + 0x3b70, 0x3b73, 0x3b75, 0x3b78, 0x4588, 0x3b7a, 0x3b80, 0x3b83, + 0x3ba6, 0x3bb8, 0x3bc3, 0x3bc7, 0x3bc9, 0x3bd4, 0x3bd0, 0x3be4, + 0x3be6, 0x3be2, 0x3bde, 0x3be5, 0x3beb, 0x3bf0, 0x3bf6, 0x3bf3, + 0x3c05, 0x3c07, 0x3c08, 0x3c0d, 0x3c13, 0x3c20, 0x3c22, 0x3c28, + 0x3c38, 0x3c39, 0x3c41, 0x3c46, 0x3c4e, 0x3c53, + /* 0x15621..0x1567E */ + 0x3c50, 0x3c4f, 0x3b71, 0x3c6c, 0x3c6e, 0x2e62, 0x3c76, 0x3c79, + 0x3c8c, 0x3c91, 0x3c94, 0x399b, 0x3cab, 0x3cbb, 0x3cb6, 0x3cbc, + 0x3cb7, 0x3cc5, 0x3cbe, 0x3cc7, 0x3cd9, 0x3ce9, 0x3cfd, 0x3cfa, + 0x3ced, 0x3d8c, 0x3cea, 0x3d0b, 0x3d15, 0x3d17, 0x3d5c, 0x3d1f, + 0x3d1b, 0x3d11, 0x3d14, 0x3d22, 0x3d1a, 0x3d19, 0x3d18, 0x3d4c, + 0x3d52, 0x3d4e, 0x3d4b, 0x3d6c, 0x3d73, 0x3d76, 0x3d87, 0x3d84, + 0x3d82, 0x3da2, 0x3d9d, 0x3dac, 0x3dae, 0x3dbd, 0x3d90, 0x3db7, + 0x3dbc, 0x3dc9, 0x3dcd, 0x3dd3, 0x3dd2, 0x3dd6, 0x3ddb, 0x3deb, + 0x3df2, 0x3df5, 0x3e0b, 0x3e1a, 0x3e19, 0x3e11, 0x3e1b, 0x3e36, + 0x3e37, 0x3e44, 0x3e43, 0x3e40, 0x3e4e, 0x3e57, 0x3e54, 0x3e5f, + 0x3e62, 0x3e64, 0x3e47, 0x3e75, 0x3e76, 0x3e7a, 0x7ebc, 0x3e7f, + 0x3ea0, 0x3ec1, 0x3ec2, 0x3ec8, 0x3ed0, 0x3ecf, + /* 0x15721..0x1577E */ + 0x3ed6, 0x3ee3, 0x3edd, 0x3eda, 0x3edb, 0x3ee2, 0x3ee1, 0x3ee8, + 0x3ee9, 0x3eec, 0x3ef1, 0x3ef3, 0x3ef0, 0x3ef4, 0x3ef8, 0x3efe, + 0x3f03, 0x3f09, 0x3f5d, 0x3f5c, 0x3f0b, 0x3f11, 0x3f16, 0x3f29, + 0x3f2d, 0x3f38, 0x3f41, 0x3f48, 0x3f4c, 0x3f4e, 0x3f2f, 0x3f51, + 0x3f56, 0x3f57, 0x3f59, 0x3f61, 0x3f6d, 0x3f73, 0x3f77, 0x3f83, + 0x3f82, 0x3f7f, 0x3f8a, 0x3f88, 0x3f91, 0x3f87, 0x3f9e, 0x3f99, + 0x3f98, 0x3fa0, 0x3fa8, 0x3fad, 0x3fbc, 0x3fd6, 0x3ffb, 0x3fe4, + 0x3ff8, 0x3ff1, 0x3fdd, 0x40b3, 0x3fff, 0x4021, 0x4060, 0x4019, + 0x4010, 0x4029, 0x400e, 0x4031, 0x401b, 0x4015, 0x402b, 0x4026, + 0x400f, 0x403a, 0x405a, 0x4041, 0x406a, 0x4077, 0x405f, 0x404a, + 0x4046, 0x404d, 0x4063, 0x4043, 0x4064, 0x4042, 0x406c, 0x406b, + 0x4059, 0x4081, 0x408d, 0x40e7, 0x4083, 0x409a, + /* 0x15821..0x1587E */ + 0x4084, 0x409b, 0x4096, 0x4097, 0x4092, 0x40a7, 0x408b, 0x40e1, + 0x40b8, 0x40e0, 0x40d3, 0x40b4, 0x3ff0, 0x40bd, 0x40c6, 0x40b5, + 0x40d8, 0x414d, 0x4115, 0x4106, 0x40f6, 0x40f7, 0x4100, 0x40f4, + 0x40fa, 0x4103, 0x4121, 0x40fb, 0x40f1, 0x410d, 0x410e, 0x4147, + 0x413e, 0x4128, 0x4127, 0x414a, 0x413f, 0x413c, 0x412c, 0x4134, + 0x413d, 0x4142, 0x4144, 0x4173, 0x4177, 0x4158, 0x4159, 0x415a, + 0x416b, 0x4174, 0x416f, 0x4165, 0x4171, 0x415f, 0x415d, 0x4153, + 0x4175, 0x4199, 0x4196, 0x4187, 0x41ac, 0x4194, 0x419a, 0x418a, + 0x4191, 0x41ab, 0x41ae, 0x41cc, 0x41ca, 0x41c9, 0x41f7, 0x41c8, + 0x41c3, 0x41c6, 0x41ba, 0x41cb, 0x5f79, 0x41cd, 0x41e6, 0x41e3, + 0x41f6, 0x41fa, 0x41f4, 0x41ff, 0x41fd, 0x41fc, 0x41fe, 0x4200, + 0x4208, 0x4209, 0x420d, 0x420c, 0x4214, 0x421b, + /* 0x15921..0x1597E */ + 0x421e, 0x4221, 0x422a, 0x422e, 0x4230, 0x4232, 0x4233, 0x4241, + 0x424e, 0x425e, 0x4263, 0x425b, 0x4260, 0x4268, 0x427c, 0x4282, + 0x4289, 0x427e, 0x4292, 0x4293, 0x4296, 0x42d4, 0x4283, 0x4294, + 0x42d7, 0x42d1, 0x42bb, 0x42cf, 0x42ff, 0x42c6, 0x44d4, 0x42c8, + 0x42dc, 0x42cc, 0x42ca, 0x42c2, 0x42c7, 0x429b, 0x42c9, 0x430c, + 0x42ee, 0x42f1, 0x4327, 0x4302, 0x4308, 0x42ef, 0x42f5, 0x4350, + 0x433e, 0x434d, 0x441c, 0x434f, 0x4396, 0x438e, 0x4380, 0x43ab, + 0x4376, 0x43a3, 0x438f, 0x4389, 0x439f, 0x43b5, 0x436b, 0x4369, + 0x43be, 0x43e9, 0x43c0, 0x43c6, 0x43e3, 0x43c9, 0x43d2, 0x43f6, + 0x43c4, 0x4416, 0x4434, 0x4406, 0x4413, 0x4426, 0x4436, 0x451d, + 0x4417, 0x4428, 0x440f, 0x4467, 0x446f, 0x4476, 0x444e, 0x452a, + 0x4495, 0x4493, 0x44a5, 0x44a9, 0x4488, 0x44bc, + /* 0x15A21..0x15A7E */ + 0x44da, 0x44d2, 0x44c5, 0x44c7, 0x44bb, 0x44d8, 0x44c2, 0x44f1, + 0x44e7, 0x6209, 0x44e0, 0x44e1, 0x42ac, 0x44e3, 0x44ef, 0x452c, + 0x44f6, 0x44f4, 0x44f2, 0x44fa, 0x4500, 0x44fd, 0x4518, 0x451c, + 0x4505, 0x4524, 0x4523, 0x452b, 0x4534, 0x4535, 0x4537, 0x4536, + 0x4538, 0x554b, 0x4548, 0x4556, 0x4555, 0x454d, 0x4558, 0x455e, + 0x455d, 0x4572, 0x4578, 0x4582, 0x4583, 0x6b8a, 0x459b, 0x459f, + 0x45ab, 0x45b7, 0x45c3, 0x45c6, 0x45c1, 0x45c4, 0x45cc, 0x45d2, + 0x45db, 0x45d9, 0x45e0, 0x45e1, 0x45f1, 0x4772, 0x460a, 0x4603, + 0x45fb, 0x4773, 0x4635, 0x4636, 0x4634, 0x461c, 0x464f, 0x4644, + 0x4649, 0x4641, 0x465e, 0x465d, 0x4664, 0x4667, 0x4668, 0x465f, + 0x4662, 0x4670, 0x4683, 0x4688, 0x468e, 0x4689, 0x4684, 0x4698, + 0x469d, 0x46c1, 0x46b9, 0x46c9, 0x46be, 0x46bc, + /* 0x15B21..0x15B7E */ + 0x46c4, 0x46b8, 0x46d6, 0x46da, 0x46e0, 0x463f, 0x46e6, 0x46e9, + 0x46f0, 0x46f5, 0x46f7, 0x470f, 0x4716, 0x471e, 0x4726, 0x4727, + 0x7738, 0x472e, 0x473f, 0x4736, 0x4741, 0x4738, 0x4737, 0x4746, + 0x475e, 0x4760, 0x4759, 0x4763, 0x4764, 0x4789, 0x4770, 0x47a9, + 0x477c, 0x476a, 0x478c, 0x478b, 0x47a6, 0x47a1, 0x4785, 0x47b7, + 0x47ef, 0x47b4, 0x47ec, 0x47b3, 0x47e9, 0x47b8, 0x47e4, 0x47de, + 0x47dd, 0x47e2, 0x47ee, 0x47b9, 0x47ce, 0x47c6, 0x47e7, 0x4a9c, + 0x481e, 0x4846, 0x4829, 0x4840, 0x484d, 0x4832, 0x484e, 0x48b3, + 0x482b, 0x4859, 0x4863, 0x4877, 0x487f, 0x489f, 0x488f, 0x48ad, + 0x4894, 0x489d, 0x489b, 0x4883, 0x4aae, 0x48b9, 0x4874, 0x48b5, + 0x48a0, 0x48ba, 0x490f, 0x488d, 0x487e, 0x4901, 0x48ca, 0x4908, + 0x48d8, 0x4922, 0x4926, 0x48e1, 0x490c, 0x48cd, + /* 0x15C21..0x15C7E */ + 0x48d4, 0x48e7, 0x48d5, 0x4936, 0x4912, 0x4904, 0x48d7, 0x48e3, + 0x4925, 0x48f9, 0x48e0, 0x48ef, 0x4928, 0x492a, 0x491a, 0x4923, + 0x4921, 0x48c6, 0x4979, 0x4977, 0x495c, 0x4978, 0x496b, 0x4954, + 0x497e, 0x496e, 0x4939, 0x4974, 0x493d, 0x4959, 0x4930, 0x4961, + 0x495e, 0x495d, 0x4981, 0x496a, 0x49b2, 0x49ae, 0x49d0, 0x49bf, + 0x49c1, 0x49d3, 0x49be, 0x49ce, 0x3be8, 0x49ca, 0x49dd, 0x49bb, + 0x49c3, 0x49a7, 0x4a2e, 0x4991, 0x49a0, 0x499c, 0x4995, 0x49b4, + 0x49de, 0x49e8, 0x4a02, 0x4a1b, 0x49ff, 0x4b0a, 0x49f9, 0x49f2, + 0x49e7, 0x4a05, 0x49b1, 0x4a1e, 0x49ed, 0x4a14, 0x49eb, 0x4a0a, + 0x4a12, 0x4ac1, 0x4a23, 0x4a13, 0x4a44, 0x4a0c, 0x4a72, 0x4a36, + 0x4a78, 0x4a47, 0x4a62, 0x4a59, 0x4a66, 0x4a48, 0x4a38, 0x4a22, + 0x4a90, 0x4a8d, 0x4aa0, 0x4a84, 0x4aa2, 0x4aa3, + /* 0x15D21..0x15D7E */ + 0x4a97, 0x6617, 0x4abb, 0x4ac3, 0x4ac2, 0x4ab8, 0x4ab3, 0x4aac, + 0x4ade, 0x4ad1, 0x4adf, 0x4aaa, 0x4ada, 0x4aea, 0x4afb, 0x4b05, + 0x6616, 0x4afa, 0x4b12, 0x4b16, 0x7b31, 0x4b1f, 0x4b38, 0x4b37, + 0x56dc, 0x4b39, 0x78ee, 0x4b47, 0x4b43, 0x4b49, 0x4b50, 0x4b59, + 0x4b54, 0x4b5b, 0x4b5f, 0x4b61, 0x4b78, 0x4b79, 0x4b7f, 0x4b80, + 0x4b84, 0x4b83, 0x4b8d, 0x4b98, 0x4b95, 0x4b9e, 0x4ba4, 0x4baa, + 0x4bab, 0x4baf, 0x4bb2, 0x4bb1, 0x4bb3, 0x4bb7, 0x4bbc, 0x4bc6, + 0x4bcb, 0x4bd3, 0x4bdf, 0x4bec, 0x4beb, 0x4bf3, 0x4bef, 0x7ebe, + 0x4c08, 0x4c13, 0x4c14, 0x4c1b, 0x4c24, 0x4c23, 0x4c5e, 0x4c55, + 0x4c62, 0x4c6a, 0x4c82, 0x4c8d, 0x4c9a, 0x4c81, 0x4c9b, 0x4c7e, + 0x4c68, 0x4c73, 0x4c92, 0x4c90, 0x4cc4, 0x4cf1, 0x4cd3, 0x4cbd, + 0x4cd7, 0x4cc5, 0x4cdd, 0x4cae, 0x4cb1, 0x4cbe, + /* 0x15E21..0x15E7E */ + 0x4cba, 0x4cdb, 0x4cef, 0x4cd9, 0x4cea, 0x4d1f, 0x684d, 0x4d36, + 0x4d2b, 0x4d3d, 0x4d38, 0x4d19, 0x4d35, 0x4d33, 0x4d12, 0x4d0c, + 0x4d63, 0x4d93, 0x4d64, 0x4d5a, 0x4d79, 0x4d59, 0x4d8e, 0x4d95, + 0x4fe4, 0x4d85, 0x4df9, 0x4e15, 0x4e0a, 0x4db5, 0x4dc7, 0x4de6, + 0x4db8, 0x4dc6, 0x4dec, 0x4dde, 0x4dcc, 0x4de8, 0x4dd2, 0x4dc5, + 0x4dfa, 0x4dd9, 0x4de4, 0x4dd5, 0x4dea, 0x4dee, 0x4e2d, 0x4e6e, + 0x4e2e, 0x4e19, 0x4e72, 0x4e5f, 0x4e3e, 0x4e23, 0x4e6b, 0x4e2b, + 0x4e76, 0x4e4d, 0x4e1f, 0x4e43, 0x4e3a, 0x4e4e, 0x4e24, 0x4eff, + 0x4e1d, 0x4e38, 0x4e82, 0x4eaa, 0x4e98, 0x4ec9, 0x4eb7, 0x4ed3, + 0x4ebd, 0x4eaf, 0x4ec4, 0x4eb2, 0x4ed4, 0x4ed5, 0x4e8f, 0x4ea5, + 0x4ec2, 0x4e9f, 0x4f41, 0x4f11, 0x504c, 0x4eec, 0x4ef8, 0x4efe, + 0x4f3f, 0x4ef2, 0x4f31, 0x4eef, 0x4f32, 0x4ecc, + /* 0x15F21..0x15F7E */ + 0x4f3e, 0x4f13, 0x4ef7, 0x4f86, 0x4f7a, 0x4f78, 0x4f81, 0x4f80, + 0x4f6f, 0x4f5b, 0x4ff3, 0x4f6d, 0x4f82, 0x4f7c, 0x4f58, 0x4f8e, + 0x4f91, 0x4fc2, 0x4f66, 0x4fb3, 0x4fa3, 0x4fa1, 0x4fa4, 0x4fb9, + 0x4fc6, 0x4faa, 0x4fdf, 0x4fd5, 0x4fec, 0x4fd4, 0x4fd8, 0x4ff1, + 0x4fee, 0x4fdb, 0x5009, 0x500b, 0x4ffa, 0x5011, 0x5001, 0x500f, + 0x4ffe, 0x501b, 0x501a, 0x4f74, 0x501d, 0x5018, 0x501f, 0x5030, + 0x503e, 0x5032, 0x5051, 0x5063, 0x5099, 0x5092, 0x50af, 0x50f1, + 0x50ac, 0x50b8, 0x50b3, 0x50ae, 0x50df, 0x50cb, 0x50dd, 0x50d9, + 0x5109, 0x50fd, 0x511c, 0x5119, 0x5165, 0x5155, 0x5188, 0x5166, + 0x5162, 0x514c, 0x5156, 0x516c, 0x518f, 0x51fb, 0x5184, 0x5195, + 0x51a8, 0x51ac, 0x51d7, 0x51b9, 0x51be, 0x51d2, 0x51c9, 0x51d4, + 0x51ce, 0x51e0, 0x51ec, 0x51e7, 0x51f5, 0x51fc, + /* 0x16021..0x1607E */ + 0x51f9, 0x51ff, 0x520d, 0x5210, 0x521b, 0x5228, 0x522d, 0x522c, + 0x5230, 0x5232, 0x523b, 0x523c, 0x523f, 0x5240, 0x5246, 0x524b, + 0x5258, 0x5274, 0x527e, 0x5282, 0x5281, 0x5287, 0x5292, 0x5296, + 0x52a2, 0x52a7, 0x52b9, 0x52b2, 0x52c3, 0x52c6, 0x52c4, 0x52ce, + 0x52d2, 0x52e2, 0x52e0, 0x52e1, 0x52f9, 0x52f7, 0x300f, 0x5317, + 0x530a, 0x531c, 0x5316, 0x531d, 0x5334, 0x532f, 0x5329, 0x5325, + 0x533e, 0x534e, 0x534f, 0x7ed8, 0x5357, 0x536a, 0x5368, 0x5370, + 0x5378, 0x5375, 0x537b, 0x537a, 0x53c8, 0x53b3, 0x53ce, 0x53bb, + 0x53c0, 0x53e5, 0x53ee, 0x53de, 0x54a2, 0x5405, 0x546f, 0x5425, + 0x53f8, 0x5432, 0x543a, 0x5455, 0x543f, 0x545f, 0x5459, 0x5441, + 0x545c, 0x5469, 0x5470, 0x5463, 0x546a, 0x5476, 0x547e, 0x548b, + 0x549e, 0x54a7, 0x54ca, 0x54cf, 0x54d4, 0x53f1, + /* 0x16121..0x1617E */ + 0x54e0, 0x54e3, 0x54e7, 0x54e9, 0x54ee, 0x54f2, 0x54f0, 0x54f1, + 0x54f8, 0x54f7, 0x5504, 0x5503, 0x5505, 0x550c, 0x550e, 0x550d, + 0x5515, 0x5513, 0x551e, 0x5526, 0x552c, 0x553c, 0x5544, 0x554d, + 0x554a, 0x5549, 0x555b, 0x5546, 0x555a, 0x5569, 0x5564, 0x5567, + 0x556b, 0x556d, 0x5578, 0x5576, 0x5586, 0x5587, 0x5574, 0x558a, + 0x5589, 0x5582, 0x5594, 0x559a, 0x559d, 0x55a5, 0x55a3, 0x55c2, + 0x55b3, 0x55c3, 0x55b5, 0x55bd, 0x55b8, 0x55bc, 0x55b1, 0x55cd, + 0x55ca, 0x55d2, 0x55d9, 0x55e3, 0x55de, 0x55fe, 0x55ff, 0x55fc, + 0x5601, 0x55f0, 0x55fa, 0x55f2, 0x55f3, 0x560b, 0x560d, 0x5609, + 0x561f, 0x5627, 0x5620, 0x5621, 0x5622, 0x5624, 0x5634, 0x5630, + 0x563b, 0x5647, 0x5648, 0x5646, 0x565c, 0x5658, 0x5661, 0x5662, + 0x5668, 0x5669, 0x566a, 0x5667, 0x566c, 0x5670, + /* 0x16221..0x1627E */ + 0x5672, 0x5676, 0x5678, 0x567c, 0x5680, 0x5683, 0x5688, 0x568b, + 0x568e, 0x5696, 0x5693, 0x5699, 0x569a, 0x56b0, 0x56b4, 0x56b8, + 0x56b9, 0x56ba, 0x56c2, 0x56cd, 0x56d6, 0x56d2, 0x56de, 0x56e1, + 0x56e5, 0x56e7, 0x56ea, 0x662f, 0x56fb, 0x5708, 0x5707, 0x5704, + 0x5729, 0x5724, 0x571e, 0x5725, 0x5726, 0x571b, 0x5737, 0x5738, + 0x5747, 0x575a, 0x5768, 0x576b, 0x575b, 0x5765, 0x577f, 0x577e, + 0x5779, 0x578e, 0x578b, 0x5791, 0x57a0, 0x579e, 0x57b0, 0x57b6, + 0x57b9, 0x57bf, 0x57bc, 0x57bd, 0x57bb, 0x57c7, 0x57cd, 0x57d7, + 0x57da, 0x57dc, 0x57e3, 0x57ee, 0x57fc, 0x580c, 0x5812, 0x5926, + 0x5820, 0x592a, 0x5845, 0x588e, 0x5874, 0x5886, 0x587c, 0x589a, + 0x588c, 0x58a3, 0x58b5, 0x58aa, 0x58af, 0x58d1, 0x58c6, 0x58cb, + 0x58d4, 0x58be, 0x58bc, 0x58c5, 0x58ca, 0x58ec, + /* 0x16321..0x1637E */ + 0x58e7, 0x58da, 0x58fd, 0x58f4, 0x5907, 0x5912, 0x5911, 0x5919, + 0x592c, 0x592b, 0x5940, 0x5960, 0x5957, 0x595f, 0x595a, 0x5955, + 0x5953, 0x597a, 0x597f, 0x598a, 0x599d, 0x59a7, 0x7f4b, 0x59aa, + 0x59ae, 0x59b3, 0x59b9, 0x59ba, 0x59c9, 0x59d5, 0x59e7, 0x59ec, + 0x59e1, 0x59e3, 0x5a08, 0x5a0d, 0x5a18, 0x5a19, 0x5a20, 0x5a1f, + 0x5980, 0x5a31, 0x5a3b, 0x5a3e, 0x5a37, 0x5a43, 0x5a57, 0x5a49, + 0x5a61, 0x5a62, 0x5a69, 0x7f9d, 0x5a70, 0x5a79, 0x5a7d, 0x5a88, + 0x5a97, 0x5a95, 0x5a98, 0x5a96, 0x5aa9, 0x5ac8, 0x5ab0, 0x5ab6, + 0x5ac5, 0x5ac4, 0x5abf, 0x7083, 0x5ac7, 0x5aca, 0x5acd, 0x5acf, + 0x5ad5, 0x5ad3, 0x5ad9, 0x5ada, 0x5add, 0x5ae1, 0x5ae2, 0x5ae6, + 0x5aed, 0x5af0, 0x5b02, 0x5b0f, 0x5b0a, 0x5b06, 0x5b33, 0x5b18, + 0x5b19, 0x5b1e, 0x5b35, 0x5b28, 0x5b36, 0x5b50, + /* 0x16421..0x1647E */ + 0x5b7a, 0x5b04, 0x5b4d, 0x5b0b, 0x5b4c, 0x5b45, 0x5b75, 0x5b65, + 0x5b74, 0x5b67, 0x5b70, 0x5b71, 0x5b6c, 0x5b6e, 0x5b9d, 0x5b98, + 0x5b9f, 0x5b8d, 0x5b9c, 0x5b9a, 0x5b8b, 0x5b92, 0x5b8f, 0x5b5d, + 0x5b99, 0x5bcb, 0x5bc1, 0x5bcc, 0x5bcf, 0x5bb4, 0x5bc6, 0x5bdd, + 0x5be9, 0x5c11, 0x5c14, 0x5be6, 0x5be5, 0x5c60, 0x5c00, 0x5c07, + 0x5c13, 0x5bf3, 0x5bf7, 0x5c17, 0x5c0d, 0x5bf6, 0x5c23, 0x5c27, + 0x5c2a, 0x5c1f, 0x5c37, 0x5c2b, 0x5c3d, 0x5c4c, 0x5c43, 0x5c54, + 0x5c4f, 0x5c40, 0x5c50, 0x5c58, 0x5c5f, 0x5c64, 0x5c56, 0x5c65, + 0x5c6c, 0x5c75, 0x5c83, 0x5c90, 0x5ca4, 0x5cad, 0x5ca2, 0x5cab, + 0x5ca1, 0x5ca8, 0x5cb3, 0x5cb2, 0x5cb1, 0x5cae, 0x5cb9, 0x5cbd, + 0x5cc0, 0x5cc5, 0x5cc2, 0x5cd8, 0x5cd2, 0x5cdc, 0x5ce2, 0x7b3b, + 0x5cef, 0x5cf2, 0x5cf4, 0x5cf6, 0x5cfa, 0x5d06, + /* 0x16521..0x1657E */ + 0x5d02, 0x5d1c, 0x5d15, 0x5d0a, 0x5d45, 0x5d4b, 0x5d2e, 0x5d32, + 0x5d3f, 0x5d35, 0x5d46, 0x5d73, 0x5d56, 0x5d4e, 0x5d72, 0x5d68, + 0x5d6e, 0x5d4f, 0x5d63, 0x5d93, 0x5d89, 0x5d5b, 0x5d8f, 0x5d7d, + 0x5d9b, 0x5dba, 0x5dae, 0x5da3, 0x5db5, 0x5dc7, 0x5dbd, 0x5dab, + 0x5e3d, 0x5da2, 0x5daf, 0x5ddc, 0x5db8, 0x5d9f, 0x5db0, 0x5dd8, + 0x5ddd, 0x5de4, 0x5dde, 0x5dfb, 0x5df2, 0x5de1, 0x5e05, 0x5e0a, + 0x5e23, 0x5e21, 0x5e12, 0x5e31, 0x5e1f, 0x5e09, 0x5e0b, 0x5e22, + 0x5e46, 0x5e66, 0x5e3b, 0x5e35, 0x5e39, 0x5e43, 0x5e37, 0x5e32, + 0x5e3a, 0x5e67, 0x5e5d, 0x5e56, 0x5e5e, 0x5e59, 0x5e5a, 0x5e79, + 0x5e6a, 0x5e69, 0x5e7c, 0x5e7b, 0x5e83, 0x5dd5, 0x5e7d, 0x6fae, + 0x5e7f, 0x5e88, 0x5e89, 0x5e8c, 0x5e92, 0x5e90, 0x5e93, 0x5e94, + 0x5e96, 0x5e8e, 0x5e9b, 0x5e9c, 0x5f38, 0x5f3a, + /* 0x16621..0x1667E */ + 0x5f45, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f50, 0x5f51, 0x5f55, 0x5f54, + 0x5f58, 0x5f5f, 0x5f60, 0x5f68, 0x5f69, 0x5f67, 0x5f78, 0x5f82, + 0x5f86, 0x5f83, 0x5f88, 0x5f87, 0x5f8c, 0x5f94, 0x5f9e, 0x5f9d, + 0x5f9a, 0x5fa3, 0x5faf, 0x5fb2, 0x5fb9, 0x5fae, 0x5fb6, 0x5fb8, + 0x6b71, 0x5fc5, 0x5fc6, 0x5fca, 0x5fd5, 0x5fd4, 0x5fe1, 0x5fe6, + 0x5fe9, 0x5ff3, 0x5ff9, 0x78dc, 0x6006, 0x6004, 0x600b, 0x6012, + 0x6018, 0x6019, 0x601c, 0x6021, 0x6028, 0x603f, 0x603b, 0x604a, + 0x6046, 0x6052, 0x6058, 0x605a, 0x605f, 0x6062, 0x6068, 0x6073, + 0x6072, 0x6070, 0x6076, 0x6079, 0x607d, 0x607f, 0x6084, 0x6086, + 0x6085, 0x609b, 0x6093, 0x609a, 0x60ad, 0x3190, 0x60ac, 0x60db, + 0x60e5, 0x60d9, 0x60dd, 0x60c4, 0x60da, 0x60d6, 0x6109, 0x60ef, + 0x60f1, 0x611b, 0x6129, 0x6123, 0x612f, 0x614b, + /* 0x16721..0x1677E */ + 0x768b, 0x6146, 0x613e, 0x6153, 0x6151, 0x60fc, 0x6171, 0x616e, + 0x6165, 0x6166, 0x6174, 0x6183, 0x6188, 0x618a, 0x6180, 0x6182, + 0x61a0, 0x6195, 0x61a4, 0x61a3, 0x615f, 0x6193, 0x61a9, 0x61b0, + 0x61b5, 0x61be, 0x61b8, 0x61bd, 0x61c0, 0x61c2, 0x61ba, 0x61c9, + 0x61cd, 0x61d1, 0x61d9, 0x61d8, 0x61c8, 0x61da, 0x61df, 0x61e0, + 0x61e7, 0x61fa, 0x61fb, 0x61fe, 0x6201, 0x6202, 0x6205, 0x6207, + 0x620a, 0x620d, 0x6210, 0x6216, 0x6229, 0x622b, 0x6238, 0x6233, + 0x6240, 0x6259, 0x6258, 0x625d, 0x625a, 0x625f, 0x6264, 0x6262, + 0x6268, 0x626a, 0x626b, 0x622e, 0x6271, 0x6277, 0x6278, 0x627e, + 0x628d, 0x6292, 0x62ab, 0x629f, 0x62bb, 0x62ac, 0x62e1, 0x62e3, + 0x62df, 0x62d2, 0x62f4, 0x62f3, 0x62fa, 0x6393, 0x6303, 0x62fb, + 0x62f9, 0x62de, 0x6306, 0x62dc, 0x6309, 0x62d9, + /* 0x16821..0x1687E */ + 0x6335, 0x6334, 0x6316, 0x6332, 0x6331, 0x6340, 0x6339, 0x6350, + 0x6345, 0x632f, 0x632b, 0x6317, 0x6318, 0x6385, 0x639a, 0x63aa, + 0x639f, 0x63a2, 0x6396, 0x6323, 0x638e, 0x6387, 0x638a, 0x637c, + 0x63b5, 0x6373, 0x6375, 0x63a0, 0x6389, 0x63a8, 0x63f4, 0x6413, + 0x63eb, 0x63ce, 0x63fd, 0x6403, 0x63d8, 0x640b, 0x63c1, 0x63f7, + 0x6407, 0x63e0, 0x63f2, 0x640d, 0x6422, 0x6420, 0x63bd, 0x6438, + 0x6506, 0x63fb, 0x646d, 0x642a, 0x643c, 0x655a, 0x6484, 0x6477, + 0x646b, 0x64ad, 0x646e, 0x6482, 0x6469, 0x6446, 0x642c, 0x646f, + 0x6479, 0x6435, 0x64ca, 0x6462, 0x64b9, 0x64bf, 0x649f, 0x64d9, + 0x64cd, 0x64bb, 0x64da, 0x64d0, 0x64c1, 0x64c6, 0x64d6, 0x64a1, + 0x6521, 0x64ff, 0x64f4, 0x6517, 0x6518, 0x652c, 0x651f, 0x6515, + 0x6514, 0x64fc, 0x6540, 0x6563, 0x6558, 0x6548, + /* 0x16921..0x1697E */ + 0x6541, 0x6602, 0x654b, 0x6555, 0x6580, 0x65a4, 0x6588, 0x6591, + 0x658a, 0x65a8, 0x656d, 0x6594, 0x659b, 0x65ea, 0x6587, 0x659c, + 0x6577, 0x657e, 0x6590, 0x65c9, 0x65ba, 0x65cf, 0x65b9, 0x65d0, + 0x65d5, 0x65dd, 0x65e5, 0x65dc, 0x65f9, 0x660a, 0x6613, 0x660b, + 0x65fe, 0x65fa, 0x6606, 0x6622, 0x661a, 0x6630, 0x663f, 0x664d, + 0x2e55, 0x6654, 0x665f, 0x6667, 0x6671, 0x6693, 0x66a3, 0x66a9, + 0x66aa, 0x668b, 0x668c, 0x66b6, 0x66af, 0x66c4, 0x66c6, 0x66b0, + 0x66c9, 0x6823, 0x66ab, 0x66d4, 0x66de, 0x66e9, 0x66ec, 0x66df, + 0x66db, 0x66ef, 0x6712, 0x6706, 0x6708, 0x6700, 0x6703, 0x66fb, + 0x6711, 0x6709, 0x670d, 0x66f9, 0x670a, 0x6734, 0x673f, 0x6737, + 0x673b, 0x6725, 0x6729, 0x671a, 0x6760, 0x675f, 0x6778, 0x674c, + 0x674e, 0x6774, 0x6757, 0x6768, 0x676e, 0x6759, + /* 0x16A21..0x16A7E */ + 0x6753, 0x6763, 0x676a, 0x6805, 0x67a2, 0x679f, 0x6782, 0x67af, + 0x67cb, 0x67bd, 0x67c0, 0x67d0, 0x76d6, 0x67ab, 0x67c4, 0x67b3, + 0x67c7, 0x67c6, 0x67bb, 0x67ef, 0x67f2, 0x67e0, 0x680f, 0x680d, + 0x67fe, 0x67f6, 0x67f7, 0x680e, 0x67d2, 0x6811, 0x6816, 0x6815, + 0x6822, 0x6821, 0x6831, 0x6836, 0x6839, 0x6827, 0x683b, 0x6844, + 0x6842, 0x6852, 0x6859, 0x685e, 0x6862, 0x686b, 0x6881, 0x687e, + 0x689e, 0x6875, 0x687d, 0x68b5, 0x6872, 0x6882, 0x6897, 0x6892, + 0x68ae, 0x6899, 0x68a2, 0x688d, 0x68a4, 0x68b0, 0x68bf, 0x68b1, + 0x68c3, 0x68c4, 0x68d4, 0x68d8, 0x68d9, 0x68dd, 0x68f9, 0x6902, + 0x68fc, 0x68f4, 0x68e8, 0x68f2, 0x6904, 0x690c, 0x690a, 0x6913, + 0x6943, 0x691e, 0x6925, 0x692a, 0x692b, 0x6941, 0x6944, 0x693b, + 0x6936, 0x6938, 0x694c, 0x691d, 0x6960, 0x695e, + /* 0x16B21..0x16B7E */ + 0x6966, 0x6964, 0x696d, 0x696a, 0x696f, 0x6974, 0x6977, 0x697e, + 0x6983, 0x6988, 0x698a, 0x6993, 0x6998, 0x69a1, 0x69a9, 0x69a6, + 0x69ac, 0x69af, 0x69b2, 0x69ba, 0x69bd, 0x69bf, 0x69c0, 0x69da, + 0x69dc, 0x69dd, 0x69e7, 0x69f4, 0x69f8, 0x6a03, 0x6a16, 0x6a10, + 0x6a0c, 0x6a1b, 0x6a1d, 0x6a25, 0x6a36, 0x6a41, 0x6a5b, 0x6a52, + 0x6a46, 0x6a48, 0x6a7c, 0x6a6d, 0x6a6c, 0x6a62, 0x6a85, 0x6a82, + 0x6a84, 0x6aa8, 0x6aa1, 0x6a91, 0x6aa5, 0x6aa6, 0x6a9a, 0x6aa3, + 0x6ac4, 0x6acd, 0x6ac2, 0x6ada, 0x6aeb, 0x6af3, 0x6ae7, 0x6ae4, + 0x6af1, 0x6b14, 0x6ae0, 0x6ae2, 0x6af7, 0x6ade, 0x6adb, 0x6b0c, + 0x6b07, 0x6b1a, 0x6ae1, 0x6b16, 0x6b10, 0x6b17, 0x6b20, 0x6b33, + 0x77ab, 0x6b26, 0x6b2b, 0x6b3e, 0x6b28, 0x6b41, 0x6b4c, 0x6b4f, + 0x6b4e, 0x6b49, 0x6b56, 0x6b5b, 0x6b5a, 0x6b6b, + /* 0x16C21..0x16C7E */ + 0x6b5f, 0x6b6c, 0x6b6f, 0x6b74, 0x6b7d, 0x6b80, 0x6b8c, 0x6b8e, + 0x6b92, 0x6b93, 0x6b96, 0x6b99, 0x6b9a, 0x6c3a, 0x6c41, 0x6c3f, + 0x6c48, 0x6c4c, 0x6c4e, 0x6c50, 0x6c55, 0x6c62, 0x6c6c, 0x6c78, + 0x6c7a, 0x6c82, 0x6c89, 0x6c85, 0x6c8a, 0x6c8d, 0x6c8e, 0x6c94, + 0x6c7c, 0x6c98, 0x421d, 0x6cad, 0x6caa, 0x6cbd, 0x6cb2, 0x6cb3, + 0x6cae, 0x6cb6, 0x6cc8, 0x6cc1, 0x6ce4, 0x6ce3, 0x6cda, 0x6cfd, + 0x6cfa, 0x6cfb, 0x6d04, 0x6d05, 0x6d0a, 0x6d07, 0x6d0f, 0x6d0d, + 0x6d10, 0x7f4e, 0x6d13, 0x6ccd, 0x6d14, 0x6d16, 0x6d67, 0x6d6d, + 0x6d71, 0x6d73, 0x6d81, 0x6d99, 0x6dc2, 0x6dbe, 0x6dba, 0x6dcf, + 0x6dda, 0x6dd6, 0x6dcc, 0x6ddb, 0x6dcb, 0x6dea, 0x6deb, 0x6ddf, + 0x6de3, 0x6dfc, 0x6e08, 0x6e09, 0x6dff, 0x6e1d, 0x6e1e, 0x6e10, + 0x6e1f, 0x6e42, 0x6e35, 0x6e30, 0x6e34, 0x6e4a, + /* 0x16D21..0x16D7E */ + 0x6e47, 0x6e49, 0x6e4c, 0x6e50, 0x6e48, 0x6e59, 0x6e64, 0x6e60, + 0x6e2a, 0x6e63, 0x6e55, 0x6e76, 0x6e72, 0x6e7c, 0x6e81, 0x6e87, + 0x6e85, 0x6e84, 0x6e8b, 0x6e8a, 0x6e93, 0x6e91, 0x6e94, 0x6e99, + 0x6eaa, 0x6ea1, 0x6eac, 0x6eb0, 0x6ec6, 0x6eb1, 0x6ebe, 0x6ec5, + 0x6ec8, 0x6ecb, 0x6edb, 0x6ee3, 0x6efc, 0x6efb, 0x6eeb, 0x6efe, + 0x6f0a, 0x6f05, 0x6f15, 0x6f12, 0x6f19, 0x6f13, 0x6f1c, 0x6f1f, + 0x6f1b, 0x6f0c, 0x6f26, 0x6f33, 0x6f3b, 0x6f39, 0x6f45, 0x6f42, + 0x6f3e, 0x6f4c, 0x6f49, 0x6f46, 0x6f4e, 0x6f57, 0x6f5c, 0x6f62, + 0x6f63, 0x6f64, 0x6f9c, 0x6f9f, 0x6fa3, 0x6fad, 0x6faf, 0x6fb7, + 0x6fda, 0x6fe5, 0x6fe2, 0x6fea, 0x6fef, 0x7087, 0x6ff4, 0x7005, + 0x6ff9, 0x6ffa, 0x7011, 0x7015, 0x7021, 0x700d, 0x701e, 0x7016, + 0x700b, 0x7027, 0x7036, 0x7035, 0x7039, 0x6ff8, + /* 0x16E21..0x16E7E */ + 0x704f, 0x7050, 0x7051, 0x7052, 0x700e, 0x7049, 0x703e, 0x7056, + 0x7058, 0x705e, 0x7068, 0x706f, 0x7076, 0x76a8, 0x7072, 0x7082, + 0x707d, 0x7081, 0x7080, 0x708a, 0x7089, 0x708f, 0x70a8, 0x70af, + 0x70b1, 0x70b5, 0x70e2, 0x70e4, 0x4248, 0x70db, 0x7102, 0x7112, + 0x7119, 0x7132, 0x7130, 0x714a, 0x7156, 0x7158, 0x7163, 0x7165, + 0x7169, 0x7173, 0x7172, 0x718b, 0x7189, 0x7182, 0x71a2, 0x71ab, + 0x71af, 0x71aa, 0x71b5, 0x71b4, 0x71ba, 0x71c0, 0x71c1, 0x71c9, + 0x71cb, 0x71d0, 0x71d6, 0x71df, 0x71e1, 0x71db, 0x71fc, 0x71f5, + 0x71f6, 0x721e, 0x71ff, 0x7214, 0x722c, 0x7215, 0x7211, 0x725e, + 0x7257, 0x7245, 0x7249, 0x7264, 0x7248, 0x7295, 0x723f, 0x724b, + 0x7250, 0x729c, 0x7296, 0x7293, 0x729b, 0x725a, 0x72cf, 0x72b9, + 0x72b7, 0x72e9, 0x730f, 0x72fa, 0x7344, 0x732e, + /* 0x16F21..0x16F7E */ + 0x7319, 0x7322, 0x731a, 0x7323, 0x733a, 0x7335, 0x733b, 0x735c, + 0x7360, 0x737c, 0x736e, 0x7356, 0x73b0, 0x73ac, 0x73ad, 0x7394, + 0x73b9, 0x73d6, 0x73d7, 0x73e8, 0x73e5, 0x73d8, 0x73c3, 0x73dd, + 0x73d0, 0x73c8, 0x73e4, 0x741a, 0x7414, 0x7413, 0x7403, 0x7407, + 0x7410, 0x7436, 0x742b, 0x7435, 0x7421, 0x743a, 0x7441, 0x7452, + 0x7444, 0x745b, 0x7460, 0x7462, 0x745e, 0x746a, 0x7229, 0x7470, + 0x7475, 0x7477, 0x747d, 0x745a, 0x747c, 0x747e, 0x7481, 0x747f, + 0x7582, 0x7587, 0x758a, 0x7594, 0x7596, 0x7598, 0x7599, 0x75a0, + 0x75a8, 0x75a7, 0x75ad, 0x75bc, 0x75bb, 0x75b9, 0x75be, 0x75ca, + 0x4ff6, 0x75c3, 0x75cd, 0x75cc, 0x75d5, 0x75d4, 0x75d6, 0x75dc, + 0x75e1, 0x75e5, 0x75e2, 0x7621, 0x7628, 0x762e, 0x762f, 0x7642, + 0x764c, 0x764f, 0x764b, 0x7677, 0x765c, 0x765e, + /* 0x17021..0x1707E */ + 0x765d, 0x765f, 0x7666, 0x7672, 0x766c, 0x768d, 0x7698, 0x7695, + 0x7697, 0x76aa, 0x76a7, 0x76b1, 0x76b2, 0x76b0, 0x76b4, 0x76b6, + 0x76b8, 0x76b9, 0x76ce, 0x76cb, 0x76c9, 0x76cd, 0x694d, 0x76dc, + 0x770d, 0x76d5, 0x76f9, 0x7704, 0x7706, 0x7708, 0x7713, 0x770e, + 0x7711, 0x770f, 0x7716, 0x7719, 0x7724, 0x772a, 0x7730, 0x7739, + 0x773d, 0x773e, 0x7744, 0x7746, 0x7748, 0x7742, 0x7749, 0x775c, + 0x7760, 0x7764, 0x7766, 0x7768, 0x32d2, 0x776b, 0x7771, 0x7779, + 0x7785, 0x777c, 0x7781, 0x777a, 0x7786, 0x778b, 0x778f, 0x7790, + 0x779c, 0x77a8, 0x77a6, 0x77a3, 0x77b3, 0x77b4, 0x77c3, 0x77c6, + 0x77c8, 0x77cb, 0x77dc, 0x77ed, 0x7f4f, 0x77f2, 0x5adf, 0x77f6, + 0x77f5, 0x780f, 0x780c, 0x7838, 0x7824, 0x7821, 0x7837, 0x783d, + 0x7846, 0x784f, 0x784b, 0x786b, 0x786f, 0x7870, + /* 0x17121..0x1717E */ + 0x7871, 0x7874, 0x7873, 0x78aa, 0x78af, 0x78b1, 0x78b6, 0x78c4, + 0x78c3, 0x78c6, 0x78e9, 0x78eb, 0x7903, 0x7909, 0x7912, 0x7914, + 0x7918, 0x7921, 0x791d, 0x791e, 0x7924, 0x7920, 0x792c, 0x792e, + 0x793d, 0x793e, 0x7942, 0x7949, 0x7945, 0x7950, 0x794b, 0x7951, + 0x7952, 0x794c, 0x7955, 0x7997, 0x7998, 0x79a5, 0x79ad, 0x79ae, + 0x79bc, 0x79df, 0x79db, 0x79dd, 0x79d8, 0x79d1, 0x79ed, 0x79ee, + 0x79f1, 0x79f2, 0x79fb, 0x79f8, 0x7a01, 0x7a0f, 0x7a05, 0x79e2, + 0x7a19, 0x7a2b, 0x7a37, 0x7a45, 0x7a42, 0x7a40, 0x7a43, 0x7a3e, + 0x7a55, 0x7a4d, 0x7a5b, 0x7a57, 0x7a5f, 0x7a62, 0x7a65, 0x7a64, + 0x7a69, 0x7a6b, 0x7a6a, 0x7aad, 0x7ab0, 0x7abc, 0x7ac0, 0x7acf, + 0x7ad1, 0x7ad3, 0x7ad4, 0x7ade, 0x7adf, 0x7ae2, 0x7ae3, 0x7ae6, + 0x7aef, 0x7aeb, 0x7aee, 0x7af4, 0x7af1, 0x7af7, + /* 0x17221..0x1727E */ + 0x7afb, 0x7b06, 0x7b18, 0x7b1a, 0x7b1f, 0x7b22, 0x7b23, 0x7b25, + 0x7b27, 0x7b28, 0x7b29, 0x7b2a, 0x7b2e, 0x7b2f, 0x7b32, 0x7b44, + 0x7b43, 0x7b4f, 0x7b4d, 0x7b4e, 0x7b51, 0x7b58, 0x7b74, 0x7b93, + 0x7b83, 0x7b91, 0x7b96, 0x7b97, 0x7b9f, 0x7ba0, 0x7ba8, 0x7bb4, + 0x7bc0, 0x7bca, 0x7bb9, 0x7bc6, 0x7bcf, 0x7bd1, 0x7bd2, 0x7be3, + 0x7be2, 0x7be4, 0x7bd4, 0x7be1, 0x7c3a, 0x7bf2, 0x7bf1, 0x7bf0, + 0x7c15, 0x7c14, 0x7c09, 0x7c13, 0x7c0c, 0x7c06, 0x7c08, 0x7c12, + 0x7c0a, 0x7c04, 0x7c2e, 0x7c1b, 0x7c25, 0x7c24, 0x7c21, 0x7c30, + 0x7c47, 0x7c32, 0x7c46, 0x7c3e, 0x7c5a, 0x7c60, 0x7c67, 0x7c76, + 0x7c78, 0x7ce7, 0x7cec, 0x7cf0, 0x7d09, 0x7d08, 0x7ceb, 0x7d03, + 0x7d06, 0x7d2a, 0x7d26, 0x7daf, 0x7d23, 0x7d1f, 0x7d44, 0x7d15, + 0x7d12, 0x7d41, 0x7d3f, 0x7d3e, 0x7d46, 0x7d48, + /* 0x17321..0x1737E */ + 0x7d5d, 0x7d5e, 0x7d64, 0x7d51, 0x7d50, 0x7d59, 0x7d72, 0x7d89, + 0x7d87, 0x7dab, 0x7d6f, 0x7d7a, 0x7d9a, 0x7da4, 0x7da9, 0x7db2, + 0x7dc4, 0x7dc1, 0x7dbb, 0x7db8, 0x7dba, 0x7dc6, 0x7dcf, 0x7dc2, + 0x7dd9, 0x7dd3, 0x7df8, 0x7de6, 0x7ded, 0x7def, 0x7dfd, 0x7e1a, + 0x7e1b, 0x7e1e, 0x7e75, 0x7e79, 0x7e7d, 0x7e81, 0x7e88, 0x7e8b, + 0x7e8c, 0x7e92, 0x7e95, 0x7e91, 0x7e9d, 0x7ea5, 0x7ea9, 0x7eb8, + 0x7eaa, 0x7ead, 0x7761, 0x7ecc, 0x7ece, 0x7ecf, 0x7ed0, 0x7ed4, + 0x7edc, 0x7ede, 0x7edd, 0x7ee0, 0x7ee5, 0x7ee8, 0x7eef, 0x7ef4, + 0x7ef6, 0x7ef7, 0x7ef9, 0x7efb, 0x7efc, 0x7efd, 0x7f07, 0x7f08, + 0x56b7, 0x7f15, 0x7f21, 0x7f2c, 0x7f3e, 0x7f4a, 0x7f52, 0x7f54, + 0x7f63, 0x7f5f, 0x7f60, 0x7f61, 0x7f66, 0x7f67, 0x7f6c, 0x7f6a, + 0x7f77, 0x7f72, 0x7f76, 0x7f95, 0x7f9c, 0x7fa0, + /* 0x17421..0x1747E */ + 0x382f, 0x49c7, 0x7059, 0x5464, 0x31dc, 0x5199, 0x3653, 0x3de2, + 0x3e14, 0x3e18, 0x3e58, 0x3e5e, 0x3ebe, 0x8028, 0x3ecb, 0x3ef9, + 0x3f00, 0x3f02, 0x3f07, 0x3f1d, 0x3f23, 0x3f34, 0x3f36, 0x3f3d, + 0x3f40, 0x3f45, 0x3f54, 0x3f58, 0x3f64, 0x3f67, 0x3f7d, 0x3f89, + 0x3f9c, 0x3fa7, 0x3faf, 0x3fb5, 0x3fb7, 0x3fc9, 0x3fde, 0x3fe1, + 0x3fe9, 0x400d, 0x4014, 0x4018, 0x4033, 0x4035, 0x4047, 0x813d, + 0x409d, 0x409e, 0x40cb, 0x40d4, 0x40d5, 0x40dd, 0x40f8, 0x411c, + 0x412b, 0x4130, 0x4137, 0x813e, 0x418d, 0x813f, 0x41bc, 0x41b9, + 0x8140, 0x4222, 0x423e, 0x4243, 0x4256, 0x425a, 0x426f, 0x4285, + 0x42c4, 0x42d6, 0x42fc, 0x430a, 0x4318, 0x4339, 0x4343, 0x4365, + 0x437c, 0x43e5, 0x43ed, 0x43f5, 0x4410, 0x4414, 0x4422, 0x4479, + 0x4451, 0x4460, 0x446d, 0x44ce, 0x44be, 0x44bf, + /* 0x17521..0x1757E */ + 0x44c4, 0x44ca, 0x44d0, 0x44f7, 0x44fb, 0x4522, 0x4529, 0x8141, + 0x4567, 0x459d, 0x8142, 0x4600, 0x4609, 0x4615, 0x461e, 0x463a, + 0x4622, 0x4624, 0x462b, 0x4630, 0x4631, 0x4633, 0x46fb, 0x4648, + 0x464c, 0xa8c4, 0x4659, 0x465a, 0x4661, 0x4665, 0x4673, 0x4677, + 0x4678, 0x468d, 0x8143, 0x46a0, 0x46b2, 0x46bb, 0x46c6, 0x46c8, + 0x1b22, 0x46db, 0x46e8, 0x46fa, 0x4713, 0x8029, 0x4733, 0x4766, + 0x4747, 0x4748, 0x477b, 0x4781, 0x4793, 0x4798, 0x479b, 0x47bb, + 0x47f9, 0x47c0, 0x47d7, 0x47fc, 0x4801, 0x4852, 0x481d, 0x482c, + 0x4831, 0x485b, 0x4872, 0x4875, 0x8144, 0x48a3, 0x48a5, 0x48b2, + 0x48c8, 0x48d0, 0x48e8, 0x48ed, 0x48f0, 0x48f1, 0x48fc, 0x490a, + 0x4949, 0xabc4, 0x4935, 0x4942, 0x4957, 0x4963, 0x4964, 0x4968, + 0x4980, 0x8114, 0x49a5, 0x49ad, 0x49cf, 0x1bb6, + /* 0x17621..0x1767E */ + 0x1bc3, 0x49e2, 0x49e9, 0x49ea, 0x49f5, 0x49f6, 0x4a0f, 0x4a15, + 0xad3f, 0x4a3b, 0x4a3e, 0x4a45, 0x4a50, 0x4a56, 0x4a5b, 0x4a6b, + 0x4a73, 0xad63, 0x4a89, 0x4a94, 0x4a9d, 0x4a9e, 0x4aa5, 0x4ae4, + 0x4ae7, 0x1c0f, 0x801d, 0x4b1b, 0x4b1e, 0x4b2c, 0x4b35, 0x4b46, + 0x4b56, 0x4b60, 0x4b65, 0x4b67, 0x4b77, 0x4b82, 0x4ba9, 0x4bad, + 0x8070, 0x4bcf, 0x4bd6, 0x4bd7, 0x4bff, 0x4c05, 0x4c10, 0x4c33, + 0x4c59, 0x4c5c, 0x4caa, 0x4c74, 0x4c76, 0x4c85, 0x4c86, 0x4c98, + 0x4c9c, 0x4cfb, 0x4cc6, 0x4cd4, 0x4ce0, 0x4ceb, 0x4cee, 0xb0fe, + 0x4d04, 0x4d0e, 0x4d2e, 0x4d31, 0x4d39, 0x4d3f, 0x4d58, 0x4d65, + 0x8145, 0x4d82, 0x4d87, 0x4d89, 0x4d94, 0x4daa, 0x4dac, 0x4dbf, + 0x4dc4, 0x4dd6, 0x4dda, 0x4ddb, 0x4ddd, 0x4dfc, 0x8146, 0x4e34, + 0x4e44, 0x4e5c, 0x4e5e, 0x4eab, 0x4eb1, 0x4ec1, + /* 0x17721..0x1777E */ + 0x4ec7, 0x4ece, 0x4f10, 0x4f1a, 0x8147, 0x4f2a, 0x4f2f, 0x4f33, + 0x4f51, 0x4f59, 0x4f5e, 0x4f61, 0x4f62, 0x4f7e, 0x4f88, 0x4f8c, + 0x4f8d, 0x4f94, 0x4fa0, 0x4fa7, 0x4fb6, 0x4fbc, 0x4fc7, 0x4fca, + 0x4ff9, 0x4ff0, 0x4ff5, 0x5005, 0x5006, 0x5028, 0x504a, 0x505d, + 0x505e, 0x504e, 0x5064, 0x5075, 0x5085, 0x50a4, 0x50ab, 0x50b7, + 0x50d4, 0x50d8, 0x50e4, 0x510f, 0x512b, 0x511e, 0x5120, 0x512e, + 0x5130, 0x5146, 0x5147, 0x5151, 0x8148, 0x5152, 0x515c, 0x5160, + 0x5168, 0x8115, 0x5185, 0x5187, 0x5192, 0x51c1, 0x51ba, 0x51c4, + 0x51fe, 0x5200, 0x5215, 0x5255, 0x5256, 0x1e3f, 0x528d, 0x529b, + 0x52be, 0x52c0, 0x52fb, 0xb7f1, 0x5327, 0x5328, 0x8116, 0x5350, + 0x5366, 0x537c, 0x5395, 0x539f, 0x53a0, 0x53a2, 0x53a6, 0x53ab, + 0x53c9, 0x53cf, 0x53d6, 0x53d9, 0x53e3, 0x53e9, + /* 0x17821..0x1787E */ + 0x5407, 0x540a, 0x541a, 0x541b, 0x814a, 0x5426, 0x5428, 0x542a, + 0x542b, 0x542c, 0x542e, 0x542f, 0x5430, 0x5444, 0x5446, 0x5447, + 0x544b, 0x5457, 0x5462, 0x546b, 0x546d, 0x5486, 0x5487, 0x5489, + 0x5498, 0x549c, 0x549f, 0x54a3, 0x5490, 0x54a6, 0x54a8, 0x54a9, + 0x54b5, 0x54bf, 0x54c8, 0x54c9, 0x54da, 0x54ff, 0x5501, 0x5517, + 0x552f, 0x556f, 0x5579, 0x5592, 0x1f72, 0x55ce, 0x55e4, 0x5600, + 0x5602, 0x5608, 0x5615, 0x5616, 0x5619, 0x561e, 0x562d, 0x5635, + 0x5643, 0x564b, 0x5664, 0x5665, 0x566d, 0x566f, 0x5671, 0x5681, + 0x569b, 0x569d, 0x569e, 0x56a6, 0x56aa, 0x56b6, 0x56c5, 0x56cc, + 0x56ce, 0x56d4, 0x56e6, 0x56f1, 0x56fc, 0x570a, 0x5719, 0x5734, + 0x5736, 0x5746, 0x574d, 0x574e, 0x575c, 0x575f, 0x5762, 0x577a, + 0x5780, 0x5794, 0x57aa, 0x57e0, 0x582d, 0xc18e, + /* 0x17921..0x1797E */ + 0x5843, 0x584e, 0x584f, 0x5851, 0x5868, 0x586e, 0x814b, 0x58b0, + 0xc20e, 0x58ad, 0x58e4, 0x58f2, 0x5900, 0x58f7, 0x591c, 0x592e, + 0x5931, 0x5934, 0x814c, 0x814d, 0x5945, 0x5946, 0x814e, 0x814f, + 0x8150, 0x595c, 0x8151, 0x8119, 0x811a, 0x5979, 0x8152, 0x8153, + 0x811b, 0x5998, 0x59b1, 0x59b8, 0x59c8, 0x59ca, 0xc371, 0x59d4, + 0x59de, 0x59eb, 0x59ed, 0x5a03, 0x8154, 0x5a39, 0x5a5d, 0x5a6d, + 0x8155, 0x5a85, 0x5aa0, 0xc4c4, 0x5ab3, 0x5abb, 0x5ace, 0x5aeb, + 0x5afd, 0x5b12, 0x5b2d, 0x5b3b, 0x5b47, 0x5b4e, 0x5b60, 0x5b6d, + 0x5b6f, 0x5b72, 0x5b9e, 0x8156, 0x5bd7, 0x5bd9, 0x5c01, 0x5c31, + 0x5c1e, 0x5c20, 0x5c33, 0x5c36, 0x2264, 0xc7a1, 0x5c59, 0x5c6d, + 0x5c79, 0x5c8f, 0x5c94, 0x5ca0, 0x5cbc, 0x5cd5, 0x5cd9, 0x5cdd, + 0x5d07, 0x5d08, 0x5d13, 0x5d1d, 0x5d23, 0x5d31, + /* 0x17A21..0x17A7E */ + 0x5d41, 0x5d48, 0x5d53, 0x5d5c, 0x5d7a, 0x5d83, 0x5d8b, 0x5da0, + 0x5da6, 0x5dc2, 0x5dcc, 0x5dd6, 0x5de3, 0x8157, 0x5e28, 0x5e08, + 0x5e11, 0x5e15, 0x8159, 0x5e47, 0x5e52, 0x5e61, 0x5e8a, 0x5e8d, + 0x5f47, 0x815a, 0x5f91, 0x5f97, 0x5fbf, 0x5fce, 0x5fdb, 0x5fdf, + 0x5fec, 0x5fee, 0x5ffa, 0x815b, 0x6014, 0x6026, 0x6035, 0x6037, + 0x603c, 0x60ca, 0x60d7, 0x60e0, 0x60f3, 0x6118, 0x614a, 0x6160, + 0x6167, 0x6168, 0x616d, 0x61bb, 0x61ca, 0x61cf, 0x61d7, 0x815c, + 0x2453, 0x245b, 0x6260, 0x6274, 0xd2ff, 0x628e, 0x62a1, 0x62a3, + 0x62a4, 0x62a9, 0x62ae, 0x62b7, 0x62be, 0x62bf, 0x62c6, 0x62d5, + 0x62fd, 0x62fe, 0x6300, 0x6301, 0x6362, 0x6322, 0x632d, 0x633a, + 0x6343, 0x6347, 0x6351, 0x6355, 0x637d, 0x6386, 0x6392, 0x6398, + 0x63a7, 0x63a9, 0x63bf, 0x63c0, 0x63c7, 0x63cf, + /* 0x17B21..0x17B7E */ + 0x63d1, 0x63e1, 0x63ea, 0x6401, 0x6406, 0x640a, 0x815f, 0x6448, + 0x645f, 0x6470, 0x6473, 0x6485, 0x649e, 0x64af, 0x64b4, 0x64ba, + 0x64c0, 0x64c2, 0xd440, 0x6532, 0x651e, 0x6523, 0x652f, 0x6559, + 0x6564, 0x811f, 0x65ad, 0x657a, 0x658c, 0x658f, 0x65a2, 0x65b0, + 0x65cb, 0x65ce, 0x65ed, 0x6612, 0x65ff, 0x6604, 0x6605, 0x6610, + 0xd674, 0x6618, 0x6629, 0x6638, 0x6657, 0x665b, 0x8036, 0x6662, + 0x259d, 0x666c, 0x6675, 0x6698, 0x66b8, 0x66fa, 0x66fc, 0x66fd, + 0x670b, 0x6771, 0x6787, 0x6788, 0x67ac, 0x67ad, 0x67b5, 0x25ea, + 0x67d6, 0x67ec, 0x6806, 0x680a, 0x6810, 0x6814, 0x681f, 0x6898, + 0x68aa, 0x68ca, 0x68ce, 0xd884, 0x68f5, 0x691c, 0x8160, 0x6918, + 0x6919, 0x691a, 0x6927, 0x6930, 0x6932, 0x6939, 0x6940, 0x6994, + 0x8161, 0x69d4, 0x69e5, 0x69f6, 0x6a12, 0x6a15, + /* 0x17C21..0x17C7E */ + 0x6a22, 0x6a37, 0x6a47, 0x6a4e, 0x6a5d, 0x6a61, 0x6a75, 0x6a79, + 0x6aa7, 0x6ad0, 0x6adf, 0x6af4, 0x6af6, 0x8122, 0x8162, 0x8163, + 0x6b46, 0x6b54, 0x6b59, 0x6b69, 0x6b9d, 0x6c49, 0x6c68, 0x8164, + 0x6ce1, 0x6cf4, 0x6cf8, 0x6cfe, 0x8165, 0x6d12, 0x6d1b, 0x6daf, + 0x6dce, 0x6dd1, 0x6dd7, 0x6e20, 0x6e23, 0x6e3d, 0x6e70, 0x6e7b, + 0xe177, 0x6ec0, 0x2844, 0x6efa, 0x6f1e, 0x6f2d, 0x6f36, 0x6f54, + 0xe24d, 0x6fa6, 0x6fb5, 0x6fe4, 0x6fe8, 0x6fee, 0x7008, 0x702d, + 0x8167, 0x7088, 0x7095, 0x7097, 0x7099, 0x709b, 0x70a2, 0x70b3, + 0x70be, 0x70c4, 0x70c5, 0x70c7, 0x70d7, 0x70dd, 0x70de, 0x70ef, + 0x70f4, 0x8126, 0x7114, 0x7115, 0x7116, 0x7122, 0x7123, 0x7127, + 0x712f, 0x7131, 0x7134, 0x713d, 0x7148, 0x715b, 0x7183, 0x719e, + 0x71ac, 0x71b1, 0x71bc, 0x71d7, 0x71fb, 0x71e4, + /* 0x17D21..0x17D7E */ + 0x71e5, 0x71ed, 0x71f1, 0x7207, 0x7210, 0x7238, 0x7239, 0x723a, + 0x723c, 0x7240, 0x7243, 0x724f, 0x7278, 0x7288, 0x72c2, 0x72cb, + 0x72cc, 0x72d3, 0x72e0, 0x72ff, 0x7304, 0x731f, 0x7321, 0x7325, + 0x7348, 0x7349, 0x734a, 0x7364, 0x7365, 0x736a, 0x7370, 0x739b, + 0x73a3, 0x73ba, 0x73c6, 0x73de, 0x73df, 0x7404, 0x73fd, 0x7433, + 0x744a, 0x7463, 0x746b, 0x7471, 0x7472, 0x758e, 0x759f, 0x75a6, + 0x75a9, 0x75ac, 0x75b6, 0x75bd, 0x75cb, 0x75d0, 0x75d3, 0x29b0, + 0x75da, 0x75de, 0x7658, 0x7684, 0x80dc, 0x769d, 0x76a4, 0x76a5, + 0x76d2, 0x76de, 0x8168, 0x76e9, 0x76ef, 0x7733, 0x773b, 0x774d, + 0x774e, 0x774f, 0x775a, 0x776e, 0x7773, 0x7795, 0x77ae, 0x77ba, + 0x77c1, 0x77c9, 0x77de, 0x77db, 0x77f4, 0x8169, 0x780a, 0x781e, + 0x782b, 0x7830, 0x816a, 0x7852, 0x7853, 0x7856, + /* 0x17E21..0x17E7E */ + 0x7857, 0x7859, 0x785a, 0x80d0, 0x7865, 0x786c, 0x78ba, 0x78c8, + 0x78e7, 0x7958, 0x799e, 0x7a02, 0x7a03, 0x7a24, 0x7a2d, 0x7a2e, + 0x7a38, 0x7a4a, 0x7a4e, 0x7a52, 0x7ab6, 0x7ac1, 0x7ac3, 0x7ace, + 0x7ad6, 0x7af9, 0x7b02, 0x7b08, 0x7b20, 0x2c17, 0x7b2d, 0x7b5e, + 0x7b79, 0x7b66, 0x7b72, 0x7b75, 0x7b84, 0x7b8a, 0x7b8f, 0x7b9e, + 0x7ba7, 0x7bc1, 0x7bce, 0x7be5, 0x7bf8, 0x7bfd, 0x7c00, 0x7c23, + 0x7c41, 0x7c4f, 0x7c50, 0x7c53, 0x7c63, 0x7c65, 0x7c77, 0x7d1d, + 0x7d1e, 0x7d43, 0x7d47, 0x7d52, 0x7d63, 0x7d70, 0x7d7c, 0x7d8a, + 0x7d96, 0x7dc0, 0x7dac, 0x7dbc, 0x7dd7, 0xf690, 0x7de7, 0x7e07, + 0x7e15, 0x7e7c, 0x7e9e, 0x7ea4, 0x7eac, 0x7eaf, 0x7eb4, 0x7eb5, + 0x7ec3, 0x7ed1, 0x7f10, 0x7f39, 0x7f57, 0x7f90, 0x7f94, 0x7f97, + 0x7fa2, 0x39f8, 0x3c5b, 0x3e77, 0x5626, 0x5e6b, + /* 0x22121..0x2217E */ + 0x8489, 0x2e02, 0x2e0f, 0x2e12, 0x2e29, 0x2e2b, 0x2e2e, 0x2e40, + 0x2e47, 0x2e48, 0x84a2, 0x2e51, 0x1406, 0x84a4, 0x2e5a, 0x2e69, + 0x2e9d, 0x142c, 0x142e, 0x2eb9, 0x2ebb, 0x8522, 0x2ebc, 0x2ec3, + 0x2ec8, 0x2ed0, 0x2eeb, 0x2eda, 0x2ef1, 0x2ef5, 0x2f00, 0x2f16, + 0x2f64, 0x2f37, 0x2f3e, 0x2f54, 0x2f58, 0x8593, 0x2f77, 0x2f78, + 0x2f7a, 0x2f7d, 0x2f82, 0x2f85, 0x2f92, 0x2f9a, 0x2fe6, 0x2fb2, + 0x2fbe, 0x2fc5, 0x2fcb, 0x2fcf, 0x2fd2, 0x146a, 0x2ff2, 0x3000, + 0x3010, 0x3013, 0x301c, 0x301e, 0x3022, 0x1468, 0x3042, 0x3046, + 0x304e, 0x3053, 0x3057, 0x3063, 0x3066, 0x306a, 0x3070, 0x30a3, + 0x3088, 0x3092, 0x3093, 0x3095, 0x3096, 0x309c, 0x30aa, 0x862b, + 0x30b1, 0x30ba, 0x30bb, 0x30c4, 0x30c7, 0x30f3, 0x8681, 0x30ce, + 0x8671, 0x30d4, 0x30d9, 0x30e1, 0x30e9, 0x1492, + /* 0x22321..0x2237E */ + 0x3108, 0x86f9, 0x3117, 0x311b, 0x874a, 0x3160, 0x8809, 0x3173, + 0x3183, 0x318b, 0x14bc, 0x3198, 0x31a3, 0x31ad, 0x14c7, 0x31bc, + 0x88d6, 0x8928, 0x31f3, 0x31f4, 0x3202, 0x3212, 0x3216, 0x8a4f, + 0x3255, 0x325c, 0x326c, 0x3277, 0x3284, 0x3282, 0x8b07, 0x3298, + 0x8b3a, 0x32a4, 0x32a6, 0x32af, 0x32ba, 0x32bb, 0x32ca, 0x151f, + 0x32d1, 0x8bb9, 0x32f7, 0x330a, 0x330b, 0x3324, 0x3335, 0x333e, + 0x3342, 0x8c7c, 0x8c9d, 0x3367, 0x336c, 0x337a, 0x33a4, 0x33b4, + 0x8dd3, 0x33b7, 0x33c0, 0x8e1d, 0x155d, 0x155e, 0x33d5, 0x33da, + 0x1563, 0x33f4, 0x33f5, 0x3455, 0x3424, 0x3428, 0x156e, 0x3443, + 0x3462, 0x3466, 0x346c, 0x348a, 0x348d, 0x3495, 0x34a0, 0x34a6, + 0x34ad, 0x34ae, 0x34b7, 0x34ba, 0x34bf, 0x34c3, 0x8f45, 0x34ec, + 0x34ef, 0x34f1, 0x34f3, 0x3500, 0x3501, 0x3509, + /* 0x22421..0x2247E */ + 0x353c, 0x3541, 0x15a6, 0x3547, 0x354a, 0x15a8, 0x3560, 0x3561, + 0x3564, 0x8fe1, 0x357d, 0x3582, 0x3588, 0x3591, 0x15c5, 0x35d2, + 0x9095, 0x906d, 0x35bf, 0x35c9, 0x35cc, 0x35d1, 0x35dd, 0x15da, + 0x35e2, 0x9064, 0x35e9, 0x3628, 0x915f, 0x3607, 0x3610, 0x3630, + 0x3637, 0x15f4, 0x363d, 0x363f, 0x3640, 0x3647, 0x365e, 0x3660, + 0x366d, 0x1605, 0x3688, 0x368c, 0x3695, 0x369a, 0x369d, 0x36a8, + 0x36ad, 0x36b2, 0x36c5, 0x36cd, 0x36df, 0x36e8, 0x36f6, 0x36f7, + 0x9201, 0x3715, 0x3723, 0x9255, 0x3729, 0x927b, 0x3745, 0x3746, + 0x374c, 0x374d, 0x9274, 0x3768, 0x376f, 0x3773, 0x3774, 0x3775, + 0x377b, 0x92e4, 0x92d7, 0x37ac, 0x379a, 0x379d, 0x379e, 0x37a8, + 0x37d7, 0x92fd, 0x37cc, 0x9336, 0x9344, 0x37de, 0x37e6, 0x37f0, + 0x164a, 0x37f8, 0x37fb, 0x37fd, 0x3804, 0x381e, + /* 0x22521..0x2257E */ + 0x3820, 0x3827, 0x3832, 0x3839, 0x93c4, 0x3849, 0x384c, 0x3867, + 0x388a, 0x388b, 0x388d, 0x388f, 0x3890, 0x3894, 0x389d, 0x38aa, + 0x38b1, 0x946d, 0x38c3, 0x38cd, 0x38e2, 0x38f3, 0x38f4, 0x3905, + 0x3906, 0x390b, 0x390d, 0x3914, 0x3924, 0x95d7, 0x1691, 0x393d, + 0x1699, 0x3946, 0x1696, 0xd329, 0x395b, 0x395f, 0x9647, 0x3975, + 0x3976, 0x397c, 0x399f, 0x39ae, 0x39bc, 0x39c8, 0x39cd, 0x39de, + 0x39e3, 0x39e4, 0x39e7, 0x39ee, 0x9706, 0x9742, 0x16cf, 0x3a0c, + 0x3a0d, 0x3a17, 0x3a27, 0x3a2d, 0x3a55, 0x3a65, 0x3a7a, 0x3a8b, + 0x3a9c, 0x3a9f, 0x3aa0, 0x3aa2, 0x3ab1, 0x3ab3, 0x3ab5, 0x3aba, + 0x3abf, 0x3ada, 0x3adc, 0x3ae0, 0x3ae5, 0x3af0, 0x3aee, 0x3af5, + 0x3b00, 0x3b08, 0x3b17, 0x3b34, 0x3b2d, 0x3b4c, 0x3b52, 0x3b68, + 0x3b6f, 0x3b7c, 0x3b7f, 0x3b81, 0x3b84, 0x99c3, + /* 0x22821..0x2287E */ + 0x3b96, 0x3bac, 0x1761, 0x3bc0, 0x1762, 0x3bce, 0x3bd6, 0x176c, + 0x176b, 0x3bf1, 0x3bfd, 0x1775, 0x3c03, 0x3c29, 0x3c30, 0x9a56, + 0x3c5f, 0x3c63, 0x3c67, 0x3c68, 0x3c69, 0x3c70, 0x9b2d, 0x9b45, + 0x3c7c, 0x9b78, 0x9b62, 0x3c88, 0x3c8a, 0x17c1, 0x9ba1, 0x9b9c, + 0x3ca0, 0x3ca2, 0x3ca6, 0x3ca7, 0x9b92, 0x3cad, 0x3cb5, 0x9bb7, + 0x3cc9, 0x9be0, 0x9c33, 0x3d06, 0x3d10, 0x3d2b, 0x3d1d, 0x3d20, + 0x3d24, 0x3d26, 0x3d31, 0x3d39, 0x3d42, 0x17e8, 0x3d61, 0x3d6a, + 0x17f4, 0x3d70, 0x9d1e, 0x17fd, 0x3d88, 0x1800, 0x3d92, 0x3d94, + 0x3d97, 0x3d99, 0x3db0, 0x3db2, 0x3db4, 0x9d76, 0x3db9, 0x3dd1, + 0x3dd7, 0x3dd8, 0x3de0, 0x9dfa, 0x3de4, 0x3de9, 0x182f, 0x3e00, + 0x1836, 0x3e12, 0x3e15, 0x1840, 0x3e1f, 0x3e2e, 0x3e3e, 0x3e49, + 0x185c, 0x3e56, 0x1861, 0x3e6b, 0x3e6c, 0x3e6d, + /* 0x22C21..0x22C7E */ + 0x3e6e, 0x9e7b, 0x3ea5, 0x3eaa, 0x3eac, 0x3eb9, 0x3ebf, 0x3ec6, + 0x3ed2, 0x3ed9, 0xa01e, 0x3efd, 0x3f08, 0x3f0e, 0x3f1c, 0xa0ad, + 0x3f1e, 0x3f47, 0x3f63, 0x3f72, 0x3f7e, 0x3f8f, 0x3fa2, 0x3fa4, + 0x3fb8, 0x3fc4, 0x18fa, 0x3fc7, 0x3fcb, 0x3fd2, 0x3fd3, 0x3fd4, + 0x3fe2, 0x3fee, 0x3fef, 0x3ff3, 0x3ffc, 0x1917, 0x4017, 0x4022, + 0x4024, 0x191a, 0x404c, 0x407f, 0x408a, 0x4095, 0x40a8, 0xa1f3, + 0x40b0, 0x40b1, 0x40be, 0x40c8, 0x40d9, 0x40db, 0x40ee, 0x40f2, + 0x40f5, 0x4110, 0x4112, 0x4113, 0x4119, 0x411e, 0x413a, 0x196f, + 0x4141, 0x4146, 0x4160, 0x417c, 0xa25b, 0x4192, 0x4193, 0x4197, + 0x4198, 0x41a5, 0x41a8, 0x41ad, 0xa2ab, 0x41d5, 0x41dd, 0x41df, + 0x41f5, 0xa38f, 0x4215, 0x4223, 0x4229, 0x4246, 0x424c, 0x4251, + 0x4252, 0x4261, 0x4264, 0x427b, 0x426d, 0x4273, + /* 0x22D21..0x22D7E */ + 0x4299, 0x42a6, 0x42d5, 0xa4b8, 0x42fd, 0x4303, 0x430d, 0x4310, + 0xa54f, 0xa550, 0x4332, 0x4335, 0x433b, 0x433c, 0x4341, 0x4344, + 0x434e, 0xa546, 0x4359, 0xa61d, 0xa5a6, 0x436c, 0x4384, 0x4399, + 0xa624, 0x4394, 0x43bd, 0x43f7, 0x43d4, 0x43d5, 0x43dc, 0x43e0, + 0x43eb, 0x43ec, 0x43f2, 0x4409, 0x441e, 0x4425, 0x4429, 0x442f, + 0x445a, 0x445b, 0x445d, 0x4473, 0x447d, 0x4487, 0x4491, 0x449d, + 0x449f, 0x44cb, 0x44cc, 0x44d5, 0x44d7, 0xa7e1, 0x44e4, 0x44e5, + 0x44ff, 0x4504, 0x1a6e, 0x450f, 0x4514, 0x4516, 0x1a73, 0x451e, + 0x4532, 0x4544, 0x4554, 0x456b, 0x457a, 0x4581, 0x4584, 0x4585, + 0x458a, 0x45b2, 0x45b5, 0x45b8, 0x45bf, 0x45c2, 0x45c9, 0x45d4, + 0x1ad6, 0x45f2, 0x45f9, 0x45fc, 0x4604, 0x4608, 0x4621, 0x462a, + 0x4645, 0x4651, 0x464e, 0x1aea, 0xa8c3, 0x4657, + /* 0x22E21..0x22E7E */ + 0x465b, 0x4663, 0xa8f5, 0xa8b6, 0x466a, 0x466b, 0x466c, 0x466d, + 0x467b, 0x4680, 0x4690, 0x4692, 0x4699, 0x1b0e, 0x46ad, 0x46b1, + 0x46b5, 0x1b1a, 0x46bf, 0x1b1c, 0x46ec, 0x1ad7, 0x4701, 0x4705, + 0x4712, 0xa972, 0x4719, 0xa9d3, 0xa9d2, 0x474c, 0x474d, 0x4754, + 0x475d, 0xa9d0, 0xa9e4, 0xa9d5, 0x4774, 0x4776, 0xa9da, 0x4792, + 0xa9df, 0x6363, 0x4810, 0x47b0, 0x47b2, 0x47c3, 0x47c8, 0x47d2, + 0x47d9, 0x47db, 0x47f0, 0x47f7, 0xaa4a, 0xaa51, 0xaa4b, 0x4818, + 0x481f, 0x482d, 0xaa65, 0x4833, 0x483b, 0x483e, 0x4844, 0x4845, + 0x4849, 0x484c, 0x4855, 0x4857, 0x1b77, 0x486b, 0x486e, 0x487a, + 0x487c, 0x4882, 0x4890, 0x4896, 0x1b6d, 0x4898, 0x4899, 0x489a, + 0x489c, 0x48aa, 0x48ab, 0x48b4, 0x48bb, 0x48fb, 0xaae4, 0xab5a, + 0x8113, 0x48c3, 0x48c5, 0x48cc, 0x48cf, 0x48d6, + /* 0x22F21..0x22F7E */ + 0x48d9, 0x48e4, 0x48e5, 0x48ec, 0x48f7, 0x4903, 0x4907, 0x1b87, + 0x1b88, 0xab94, 0x493b, 0x1b8d, 0x4946, 0x4969, 0x496c, 0x4972, + 0x497a, 0x497f, 0x4992, 0x1ba4, 0x4996, 0x4998, 0x49a6, 0x49b0, + 0x49b7, 0x49ba, 0x49bc, 0x49c0, 0x49d1, 0x49d6, 0xac39, 0xac47, + 0x4a30, 0xac38, 0xac3a, 0x49e3, 0x49ee, 0x49ef, 0x49f3, 0x1bcd, + 0x49f4, 0x49fe, 0x4a11, 0x4a1a, 0x4a1d, 0xad1c, 0x4a32, 0x4a33, + 0x4a34, 0x4a3f, 0x4a46, 0x4a49, 0x4a7a, 0x4a4e, 0x4a52, 0x4a64, + 0xad0c, 0x4a7e, 0x4a83, 0x4a8b, 0x1bf0, 0x4a91, 0x4a9f, 0x4aa1, + 0xad64, 0x4aab, 0x4abd, 0x4ac6, 0x4ad4, 0x4ad0, 0x4adc, 0x4add, + 0xadff, 0xade7, 0x4aec, 0x4af1, 0x4af2, 0x4af3, 0x4afd, 0xae24, + 0x4b0b, 0x4b0f, 0x4b10, 0x4b11, 0xae3d, 0x4b17, 0x1c26, 0x4b2f, + 0x4b4a, 0x4b58, 0x4b6c, 0x4b75, 0x4b7a, 0x4b81, + /* 0x26E21..0x26E7E */ + 0x4b9b, 0x4bae, 0xaf98, 0x4bbd, 0x4bbe, 0x4bc7, 0x4bc8, 0x4bc9, + 0x4bda, 0x4be6, 0x4be7, 0x4bee, 0x4bf1, 0x4c02, 0x4c0a, 0x4c0e, + 0x4c35, 0x4c36, 0x4c3a, 0xb07f, 0x4c3f, 0x4c4d, 0x4c5b, 0x4c6d, + 0x4c84, 0x4c89, 0x1cc3, 0x4c94, 0x4c95, 0x4c97, 0x4cad, 0x4cc2, + 0x4cd0, 0x1cd2, 0x4cd6, 0x4cda, 0x4cdc, 0x4ce9, 0x4cec, 0x4ced, + 0xb100, 0x4d00, 0x4d0a, 0x4d24, 0x4d26, 0x4d27, 0x4c67, 0x4d2f, + 0x4d3c, 0x4d5b, 0x4d5e, 0x4d60, 0x4d70, 0x4d80, 0x4d81, 0x4d8a, + 0x4d8d, 0x4d91, 0x4d98, 0xb140, 0x4e17, 0xb1fa, 0xb1f9, 0xb1d3, + 0x4dab, 0x4dae, 0x4db4, 0x4dc2, 0x4d34, 0x4dc8, 0x4dce, 0x4dcf, + 0x4dd0, 0x4ddf, 0x4de9, 0x4df6, 0x4e36, 0x4e1e, 0x4e22, 0x4e27, + 0x1d11, 0x4e32, 0x4e3c, 0x4e48, 0x4e49, 0x4e4b, 0x4e4c, 0x4e4f, + 0x4e51, 0x4e53, 0x4e54, 0x4e57, 0x4e63, 0x1d1e, + /* 0x26F21..0x26F7E */ + 0x4e93, 0x4ea7, 0x4eb4, 0x4ebf, 0x4ec3, 0x4eca, 0x4ed9, 0x4f35, + 0x4eeb, 0x4ef9, 0x4efb, 0x4f0a, 0x4f0c, 0x4f18, 0x4f25, 0x4f36, + 0x4f3c, 0xb27e, 0x4f52, 0x4f57, 0x4f5a, 0x4f60, 0x4f68, 0x4f98, + 0x4f7d, 0x4f90, 0x4f96, 0x4fbe, 0x4f9f, 0x4fa5, 0x4faf, 0x1d64, + 0x4fb5, 0x4fc8, 0x4fc9, 0x4fda, 0x4fde, 0x4fe9, 0xb396, 0x4ffc, + 0x5000, 0x5007, 0x500a, 0x5023, 0xb403, 0x5039, 0x503a, 0x503c, + 0x5043, 0x5047, 0x504b, 0x1d9a, 0x5054, 0x5065, 0x5069, 0x506c, + 0x506e, 0x5076, 0x507e, 0x5081, 0x5086, 0x5095, 0x5097, 0x50bb, + 0xb4c6, 0x509f, 0x50b1, 0xb4fe, 0x50ec, 0x50ca, 0x50d1, 0x50d3, + 0x50dc, 0x5103, 0x5104, 0x5106, 0x5107, 0x5108, 0x510c, 0x1dc0, + 0x512f, 0x5131, 0x5150, 0x514a, 0x5153, 0x515e, 0x1dd4, 0x5196, + 0x5180, 0x519b, 0x51a0, 0x51a2, 0x51ae, 0x51af, + /* 0x27021..0x2707E */ + 0x51b3, 0xb5bc, 0x51cb, 0x51d3, 0x51d9, 0x51dc, 0x5207, 0x1e05, + 0x8149, 0x522b, 0x5234, 0x5238, 0x5239, 0x2e2c, 0x5242, 0x5253, + 0x5257, 0x5263, 0xb629, 0x526e, 0x526f, 0x5278, 0x527f, 0x528e, + 0xb6a5, 0x52ad, 0x52ae, 0x52b0, 0x52b1, 0x52c1, 0x1e60, 0x52cc, + 0x1e66, 0x1e68, 0x52f3, 0x52fa, 0x5307, 0x5312, 0x5318, 0x5319, + 0x1e83, 0x5339, 0x532c, 0x5331, 0x5333, 0x533d, 0x5352, 0x1e94, + 0x536b, 0x536c, 0xb896, 0x536e, 0x536f, 0x5371, 0x5377, 0x5381, + 0x5385, 0x538a, 0x5394, 0x5398, 0x539c, 0x539e, 0x53a5, 0x53a8, + 0x53b5, 0x53b7, 0x53b9, 0x53bc, 0x53bf, 0x53c5, 0x53cb, 0x53e1, + 0x53e7, 0x53f9, 0x5413, 0x53fa, 0x5401, 0x5424, 0x5431, 0x5439, + 0x5453, 0x5440, 0x5443, 0x544d, 0x5452, 0x545d, 0x5471, 0x5481, + 0x5485, 0x5488, 0xb94d, 0x5492, 0x5497, 0x5499, + /* 0x27121..0x2717E */ + 0x54a0, 0x54a1, 0x54a5, 0x54aa, 0x54ab, 0x54b9, 0x54bb, 0x54ba, + 0x54d6, 0x54d8, 0x54de, 0x54ef, 0x54eb, 0xba56, 0x54fa, 0xba6f, + 0x5520, 0x5524, 0x552a, 0x1f57, 0xbb16, 0x553d, 0x553e, 0x5540, + 0x5548, 0x554e, 0x5550, 0x5552, 0x556c, 0x5572, 0x5571, 0x557a, + 0x557d, 0x557e, 0x5581, 0xbc14, 0x558c, 0x1f75, 0x55a2, 0x1f77, + 0x55b0, 0x55b7, 0x55bf, 0x55c0, 0x55c6, 0x55cf, 0x55d3, 0x55dd, + 0x55df, 0x55e0, 0x55e7, 0x55ec, 0x55ee, 0x55f1, 0x55f9, 0x5603, + 0x5618, 0x5607, 0x560f, 0x1fae, 0xbd0e, 0x5613, 0x561b, 0x561c, + 0xbd37, 0x5625, 0x5628, 0x563c, 0x5633, 0xbd6a, 0x1fc9, 0x5641, + 0xbd8b, 0x5649, 0x5655, 0x1fd7, 0x566e, 0x5695, 0x569c, 0x56a1, + 0x56a0, 0x56a7, 0x56a8, 0x56af, 0xbe4a, 0x56c9, 0xbe55, 0x56e8, + 0x56ec, 0xbf22, 0x5717, 0x571a, 0x572d, 0x5735, + /* 0x27221..0x2727E */ + 0xbfa9, 0x2039, 0xbfe5, 0xbfcd, 0x5758, 0x5760, 0x576a, 0xc01e, + 0x5772, 0x577c, 0x577d, 0xc04c, 0x2058, 0x579a, 0x579f, 0x57a2, + 0x57a4, 0x57a9, 0x57de, 0x57df, 0x57e4, 0x57e6, 0x57ea, 0x57ec, + 0x2093, 0x57f0, 0x57f4, 0x57fb, 0xc12e, 0x5805, 0x5806, 0x5809, + 0x580d, 0x5819, 0x5821, 0x582c, 0x5847, 0x5864, 0x586a, 0xc1d9, + 0x588a, 0x5894, 0x58a4, 0x589d, 0x589e, 0x589f, 0x58bb, 0x58c8, + 0x58cc, 0x58ce, 0x58d5, 0x58e0, 0x58e1, 0x58e6, 0x58f9, 0x58fa, + 0x58fb, 0x58fe, 0xc2a7, 0x5910, 0x591b, 0x5930, 0x5925, 0x593b, + 0x594a, 0x5958, 0x595b, 0x2105, 0x5967, 0x5972, 0x5994, 0x5995, + 0x5996, 0x599b, 0x59a1, 0x59a9, 0x59b4, 0x59bb, 0x59c2, 0x59c7, + 0x59cc, 0x59cd, 0x59d6, 0x2148, 0xc3a9, 0xc3b4, 0x214f, 0x5a0a, + 0x5a11, 0x5a15, 0x5a1b, 0x5a1e, 0x2163, 0x5a2d, + /* 0x27321..0x2737E */ + 0x5a38, 0x5a47, 0x5a4c, 0x5a56, 0x5a59, 0x5a5c, 0x5a5f, 0x5a60, + 0x5a67, 0x5a6a, 0x5a75, 0x5a78, 0x5a82, 0x5a8a, 0x5a90, 0x5aa3, + 0x5aac, 0xc4d4, 0x21b4, 0x5ab9, 0x5abc, 0x5abe, 0x21bf, 0x5acc, + 0x5ad1, 0x5ae7, 0x5ae8, 0x5af4, 0xc5e4, 0xc5e3, 0x5b07, 0xc5f1, + 0x5b3d, 0x5b27, 0x5b2a, 0x5b2e, 0x5b2f, 0x5b31, 0x21e6, 0x21f3, + 0x5b7f, 0x5b41, 0x21ee, 0x5b55, 0x5b79, 0x5b64, 0x5b66, 0x5b69, + 0x5b73, 0xc632, 0x2207, 0x5b90, 0x5b91, 0x5b9b, 0x220e, 0x5baf, + 0x5bb5, 0x5bbc, 0x5bc5, 0x5bca, 0xc6cb, 0xc6e4, 0x5bd4, 0x5bd6, + 0x5bda, 0x5bea, 0x5bf0, 0x5c03, 0x5c0b, 0x5c0e, 0x5c0f, 0x5c26, + 0x5c45, 0x5c4a, 0x5c51, 0x5c57, 0x5c5e, 0x5c61, 0x5c69, 0x5c6e, + 0x5c6f, 0x5c70, 0xc82e, 0xc856, 0xc865, 0x5ca6, 0xc862, 0x5cb6, + 0x5cb7, 0x5cbf, 0xc8d8, 0x5cc4, 0xc8c2, 0x5cc8, + /* 0x27421..0x2747E */ + 0x5ccd, 0xc8e8, 0x5cd7, 0xc923, 0x5ce6, 0x5ceb, 0xc95c, 0x5cf5, + 0x5d03, 0x5d09, 0x22c6, 0x5d12, 0x5d1e, 0xc9e0, 0xc9d4, 0x5d3d, + 0x5d3e, 0x5d40, 0x5d47, 0xca0c, 0xc9fb, 0x22d6, 0x5d59, 0x5d5a, + 0x5d6a, 0x5d70, 0x22dd, 0x5d7f, 0xca17, 0x5d86, 0x5d88, 0x5d8c, + 0x5d97, 0xca60, 0x5d9d, 0x5da7, 0x5daa, 0x5db6, 0x5db7, 0x5dc0, + 0x5dd7, 0x5dd9, 0x5de6, 0x5df1, 0x5df9, 0x2302, 0xcaed, 0x8158, + 0x5e10, 0x5e17, 0x5e1d, 0x5e20, 0x5e27, 0x5e2c, 0x5e45, 0x5e73, + 0x5e75, 0x5e7e, 0x5e86, 0x5e87, 0x232b, 0x5e91, 0x5e98, 0x5e9a, + 0x2343, 0x5f3c, 0x5f3b, 0x5f3e, 0x5f43, 0x5f44, 0x5f4f, 0x14c1, + 0xcb70, 0x5f52, 0xcb86, 0x5f61, 0x5f63, 0x5f64, 0x5f6d, 0x5f7d, + 0x5f7e, 0xcc4c, 0x5f90, 0x317b, 0xb10e, 0x5f96, 0x5f9c, 0x5fad, + 0xcd02, 0x5fc3, 0x5fcf, 0x5fe3, 0x5fe5, 0x5fef, + /* 0x27521..0x2757E */ + 0x5ff2, 0x6002, 0x600a, 0x6008, 0x600e, 0x6011, 0x6016, 0x6024, + 0x602c, 0x6030, 0x6043, 0x6066, 0x6071, 0x6075, 0x607b, 0x6099, + 0x609c, 0x60a4, 0x60a7, 0x60b8, 0xce7e, 0x60c5, 0x60d5, 0x60d8, + 0x60e6, 0xceb0, 0x610d, 0x60f5, 0x60fb, 0x23ee, 0x6135, 0x6116, + 0x611e, 0x23f0, 0x6124, 0x6127, 0x612c, 0xcf1d, 0x613d, 0x2408, + 0x6169, 0x2417, 0x6181, 0x241c, 0x6184, 0x6185, 0x2422, 0x6198, + 0x61b2, 0x61c1, 0x61c3, 0x61d6, 0x61db, 0xd0dd, 0x61e4, 0xd0ea, + 0x61ec, 0xd151, 0x61fd, 0x61ff, 0xd16f, 0x6204, 0xd1dd, 0x6219, + 0x6221, 0x6222, 0xd21e, 0x6232, 0x6234, 0x623c, 0x6246, 0x6249, + 0x6245, 0xd258, 0x624b, 0x2476, 0x624f, 0x247a, 0x6257, 0xd28c, + 0x625c, 0x6263, 0xd2b7, 0x815d, 0x815e, 0x6279, 0x2491, 0x627d, + 0x627f, 0x6283, 0x628a, 0x6293, 0x62a7, 0x62a8, + /* 0x27621..0x2767E */ + 0x62b2, 0x62b4, 0x62ba, 0x62bc, 0x62e2, 0x62e8, 0x62f7, 0x6307, + 0x6308, 0x630c, 0x6354, 0x631b, 0x631d, 0x6330, 0x633c, 0x6344, + 0x6357, 0x24be, 0x637f, 0x24d4, 0x24b3, 0x638d, 0x6394, 0x6395, + 0x639b, 0x639d, 0x63c9, 0x63d0, 0x63d4, 0x63dd, 0x63e5, 0x63f9, + 0x640f, 0x6411, 0x6415, 0xd373, 0x6417, 0x6439, 0x644a, 0x644f, + 0x6451, 0x6452, 0x6459, 0x645a, 0x645c, 0xd3dd, 0x6465, 0x6476, + 0x6478, 0x647c, 0x6481, 0x250d, 0x64dc, 0x6497, 0x64a6, 0x64be, + 0x2508, 0x64ce, 0x64cf, 0x64d3, 0xd465, 0x64e7, 0x64ea, 0x64ef, + 0x64f0, 0x64f1, 0x64fa, 0x64fd, 0x650c, 0x651b, 0x6524, 0x6525, + 0x652b, 0x6534, 0x654f, 0x656f, 0x2525, 0x2543, 0x653e, 0x6551, + 0x6553, 0x655e, 0x6561, 0x6562, 0xd594, 0x657b, 0x657d, 0x657f, + 0x6581, 0x6586, 0x6593, 0x659d, 0x659f, 0xd5f8, + /* 0x27721..0x2777E */ + 0xd5f6, 0xd5f7, 0x65b7, 0x65bc, 0x65c7, 0x65ca, 0x65d8, 0x65d9, + 0x65df, 0x65e1, 0x65e6, 0x65f6, 0x6600, 0x6611, 0x661e, 0x6621, + 0x6624, 0x6627, 0xd68d, 0x6639, 0x663c, 0xd6b9, 0x6640, 0x8120, + 0x6653, 0x6656, 0x666f, 0x6677, 0x667a, 0x6687, 0x6689, 0x668d, + 0x6691, 0x669c, 0x669d, 0x66a8, 0x8121, 0x66b1, 0x66b3, 0x66c1, + 0x66c3, 0x66d1, 0x66d5, 0x66d7, 0x66e3, 0x66e6, 0x25b8, 0x6705, + 0x6707, 0x670e, 0x6710, 0x6713, 0x6719, 0x671f, 0x6721, 0x6723, + 0x6731, 0x673a, 0x673e, 0x6740, 0x6743, 0x6751, 0x6758, 0x6764, + 0x6765, 0x6772, 0x677c, 0xd75b, 0xd75a, 0x67a7, 0x6789, 0x678b, + 0x6793, 0x67a0, 0xd77e, 0x25e5, 0x67be, 0xd790, 0x67c1, 0x67ce, + 0x67f5, 0x67df, 0xd7c9, 0x67e3, 0x67e5, 0x67e6, 0x67ea, 0x67eb, + 0x67ed, 0x6801, 0x6803, 0x680b, 0x6813, 0x6828, + /* 0x27821..0x2787E */ + 0x682e, 0x6832, 0x683c, 0x260f, 0x684a, 0x6858, 0x685f, 0x6864, + 0xd815, 0xd814, 0x6869, 0xd831, 0x686f, 0x68a0, 0x68bc, 0x68bd, + 0x68be, 0x68c0, 0x68d2, 0xd893, 0x68d1, 0x68d3, 0x68db, 0x68f0, + 0x68f1, 0x2641, 0x6901, 0xd90e, 0x6937, 0xd923, 0x6942, 0x6945, + 0x6949, 0xd952, 0x2665, 0x6962, 0x6980, 0x6989, 0x6990, 0x699f, + 0x69b0, 0x69b7, 0x69d6, 0x69d8, 0x69eb, 0x26a1, 0x69f1, 0x69f3, + 0x69fd, 0x69ff, 0x26af, 0x6a11, 0x6a14, 0xda85, 0x6a21, 0x6a35, + 0x6a3e, 0x6a45, 0x6a4d, 0x6a58, 0x6aae, 0x6a90, 0x6ab7, 0x6abe, + 0x6ad7, 0x6afc, 0xdb84, 0x6b0a, 0x6b05, 0x6b0d, 0x6b1c, 0x6b1f, + 0x6b2d, 0x6b43, 0x270c, 0x6b51, 0x6b5e, 0x6b76, 0x6b7f, 0x6b81, + 0x6b8b, 0x6b94, 0x6b95, 0x6b9c, 0x6b9e, 0x6c39, 0xdcb3, 0x6c3d, + 0xdcbe, 0xdcc7, 0x6c45, 0x6c47, 0x6c4f, 0x6c54, + /* 0x27921..0x2797E */ + 0x6c57, 0x6c69, 0x6c6d, 0x6c73, 0xddb8, 0x6c93, 0x6c92, 0x6c99, + 0x2764, 0x6c9b, 0x6ca4, 0x6cd6, 0x6cd5, 0x6cd9, 0xde20, 0x6cf0, + 0x6cf1, 0xde90, 0x6d09, 0x6d0e, 0x6d6c, 0x6d84, 0x6d95, 0x6da6, + 0xdfb7, 0x6dc6, 0x6dc8, 0x6dd9, 0x6dec, 0x6e0c, 0x27fd, 0x6dfd, + 0x6e06, 0xe08a, 0x6e14, 0x6e16, 0x6e21, 0x6e22, 0x6e27, 0xe0bb, + 0x2816, 0x6e36, 0x6e39, 0x6e4b, 0x6e54, 0x6e62, 0x6e6c, 0x6e6d, + 0x6e6f, 0x6e98, 0x6e9e, 0x6eae, 0x6eb3, 0x6eb5, 0x6eb6, 0x6ebb, + 0xe182, 0x6ed1, 0x6ed4, 0x284e, 0x6ef9, 0xe1f3, 0x6f00, 0x6f08, + 0x6f17, 0x6f2b, 0x6f40, 0x6f4a, 0x6f58, 0xe28c, 0x6fa4, 0x6fb4, + 0x8166, 0x6fb6, 0xe2d5, 0x6fc1, 0x6fc6, 0x8124, 0x6fca, 0x6fcd, + 0x6fd3, 0x6fd5, 0x6fe0, 0x6ff1, 0x6ff5, 0x6ffb, 0x7002, 0x700c, + 0x7037, 0xe36b, 0x7043, 0x7044, 0x705d, 0xe3c8, + /* 0x27A21..0x27A7E */ + 0xe3c9, 0x7085, 0x708c, 0x7090, 0x761d, 0x70a1, 0x28b5, 0x70b0, + 0x70b6, 0x70c3, 0x70c8, 0xe4d7, 0x70dc, 0x70df, 0xe4fa, 0x70f6, + 0x70f2, 0x7100, 0x70eb, 0x70fe, 0x70ff, 0x7104, 0x7106, 0x7118, + 0x711c, 0x711e, 0x7137, 0x7139, 0x713a, 0x7146, 0x7147, 0x7157, + 0x7159, 0x7161, 0x7164, 0x7174, 0x7179, 0x7185, 0x718e, 0x71a8, + 0x71ae, 0x71b3, 0x71b6, 0x71c3, 0x71c4, 0x71da, 0xe549, 0xe546, + 0x71ec, 0x71ee, 0x7201, 0x720a, 0x7216, 0x7217, 0xe56b, 0x7233, + 0x7242, 0x7247, 0x724a, 0x724e, 0x7251, 0x7256, 0x7259, 0x7260, + 0x7261, 0x7265, 0x7267, 0x7268, 0xe587, 0xe588, 0x727c, 0x727d, + 0x727f, 0x7289, 0x728d, 0x7297, 0x7299, 0x729f, 0x72a7, 0x72ab, + 0xe5ba, 0xe5bb, 0x72b2, 0x72bf, 0x72c0, 0x72c6, 0x72ce, 0x72d0, + 0x72d7, 0x72d9, 0x72e5, 0x72e7, 0x7311, 0xe61e, + /* 0x27B21..0x27B7E */ + 0xe629, 0x72f7, 0x72f9, 0x72fb, 0x7302, 0x730d, 0x7315, 0x731d, + 0x731e, 0x7327, 0x7329, 0xe671, 0xe643, 0x7347, 0x7351, 0x7357, + 0x735a, 0x736b, 0x7371, 0x7373, 0x73a1, 0xe699, 0xe6cd, 0x7388, + 0x738b, 0x738f, 0x739e, 0x73f5, 0xe6e4, 0xe6dd, 0x73f1, 0x73c1, + 0x73c7, 0x73dc, 0x73e2, 0x73e7, 0x7409, 0x740f, 0x7416, 0x7417, + 0x73fb, 0x7432, 0x7434, 0x743b, 0x7445, 0xe7c1, 0xe7ef, 0x746d, + 0x746f, 0x7578, 0x7579, 0x7586, 0x758c, 0x758d, 0xe810, 0x75ab, + 0x75b4, 0xe871, 0x75c8, 0xe8fb, 0xe91f, 0x762c, 0x7633, 0x7634, + 0xe936, 0x763c, 0x7641, 0x7661, 0xe989, 0x7682, 0xe9eb, 0x769a, + 0xea32, 0x29e7, 0x76a9, 0x76af, 0x76b3, 0x76ba, 0x76bd, 0x29fa, + 0xeaf8, 0x76d8, 0x76da, 0x76dd, 0x2a04, 0x7714, 0x7723, 0x2a29, + 0x7736, 0x7741, 0x7747, 0x7755, 0x7757, 0x775b, + /* 0x27C21..0x27C7E */ + 0x776a, 0xeba0, 0xebb1, 0x7796, 0x779a, 0x779e, 0x77a2, 0x77b1, + 0x77b2, 0x77be, 0x77cc, 0x77d1, 0x77d4, 0x77d8, 0x77d9, 0x77e1, + 0x77f1, 0x7804, 0x780d, 0x780e, 0x7814, 0x7816, 0x2abc, 0xec90, + 0x7823, 0x7832, 0x7833, 0x7825, 0x7847, 0x7866, 0x78ab, 0x78ad, + 0x78b0, 0xedcf, 0x78b7, 0x78b8, 0x78bb, 0x78bc, 0x78bf, 0x78c2, + 0x78c7, 0x78cb, 0x78e0, 0xee7f, 0x78e1, 0x78e3, 0x78e5, 0x78ea, + 0x78f0, 0x78f1, 0x78f3, 0x7908, 0x2b3b, 0xeef0, 0x7916, 0x7917, + 0xef19, 0x791a, 0x791b, 0x791c, 0xef50, 0x7931, 0x7932, 0x7933, + 0x793a, 0x793b, 0x793c, 0x7940, 0x7941, 0x7946, 0x794d, 0x794e, + 0x795c, 0x795f, 0x7960, 0x79a3, 0x79a6, 0x79b9, 0x79bd, 0x79bf, + 0x79c3, 0x79c9, 0x79d4, 0x79d9, 0x79de, 0xf0c6, 0x79f0, 0x79f9, + 0x79fc, 0x7a0a, 0x7a11, 0x7a16, 0x7a1a, 0x7a20, + /* 0x27D21..0x27D7E */ + 0x7a31, 0x7a36, 0x7a44, 0x7a4c, 0x7a58, 0x2bc2, 0x7aaf, 0x2bca, + 0x7ab7, 0x2bd2, 0x7ab9, 0xf172, 0x7ac6, 0x7ad0, 0x7ad2, 0x7ad5, + 0x2be8, 0x7adc, 0x7ae0, 0x7ae5, 0x7ae9, 0x7b03, 0x7b0c, 0x7b10, + 0x7b12, 0x7b16, 0x7b1c, 0x7b2b, 0x7b33, 0x7b3d, 0x2c20, 0x7b4b, + 0x7b63, 0x7b65, 0x7b6b, 0x7b6c, 0x7b73, 0x7b76, 0x7b77, 0x7ba6, + 0x7bac, 0x7bb1, 0xf2db, 0xf33d, 0x7bb2, 0x7bb8, 0x7bbe, 0x7bc7, + 0x7bf3, 0x7bd8, 0x7bdd, 0x7be7, 0x7bea, 0x7beb, 0x7bef, 0x7bee, + 0xf315, 0x7bfa, 0xf38a, 0x7bf7, 0xf349, 0x7c16, 0x7c18, 0x7c19, + 0x7c1a, 0x7c1d, 0x7c22, 0x7c27, 0x7c29, 0x7c2a, 0xf3c4, 0x7c31, + 0x7c36, 0x7c37, 0x7c45, 0x7c5c, 0xf3e9, 0x7c49, 0x7c4a, 0xf3db, + 0x7c54, 0x7c58, 0x7c5b, 0x7c5d, 0x7c5f, 0x7c69, 0x7c6a, 0x7c6b, + 0x7c6d, 0x7c6e, 0x7c70, 0x7c72, 0x7c75, 0x7c7a, + /* 0x27E21..0x27E7E */ + 0x7ce6, 0x7cf2, 0x7d0b, 0x7d02, 0xf4ce, 0x7d11, 0x7d17, 0x7d18, + 0xf52f, 0x2cc4, 0xf51a, 0x7d32, 0x2cd1, 0x7d42, 0x7d4a, 0x7d5f, + 0x7d62, 0xf5f9, 0x7d69, 0x7d6b, 0xf582, 0x7d73, 0x7d76, 0x7d77, + 0x7d7e, 0x7d84, 0x7d8d, 0x7d99, 0x7da1, 0x7dbf, 0x7db5, 0x7db9, + 0x7dbd, 0x7dc3, 0x7dc7, 0x7dc9, 0x7dd6, 0x7dda, 0x7ddf, 0x7de0, + 0x7de3, 0x7df4, 0x2d07, 0x7e0a, 0x7e02, 0x7e0d, 0x7e19, 0x7e1c, + 0x7e1d, 0x7e7b, 0x9f18, 0x7e80, 0x7e85, 0x7e9b, 0x7ea8, 0xf70c, + 0x7ebd, 0xf7b7, 0x7edf, 0x7ee7, 0x7eee, 0x7eff, 0x7f02, 0x2d77, + 0x7f03, 0x7f17, 0x7f19, 0x7f2f, 0x7f37, 0x7f3a, 0x7f3d, 0x7f41, + 0x7f45, 0x7f46, 0x7f53, 0x7f55, 0x7f58, 0xf8f1, 0x7f5d, 0xf902, + 0x7f69, 0xf91a, 0x7f6d, 0x7f70, 0x7f75, 0xf9b2, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const ucs4_t jisx0213_to_ucs_pagestart[] = { + 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x1e00, 0x1f00, 0x2000, + 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2600, 0x2700, 0x2900, + 0x3000, 0x3100, 0x3200, 0x3300, 0x3400, 0x3500, 0x3600, 0x3700, + 0x3800, 0x3900, 0x3a00, 0x3b00, 0x3c00, 0x3d00, 0x3e00, 0x3f00, + 0x4000, 0x4100, 0x4200, 0x4300, 0x4400, 0x4500, 0x4600, 0x4700, + 0x4800, 0x4900, 0x4a00, 0x4b00, 0x4c00, 0x4d00, 0x4e00, 0x4f00, + 0x5000, 0x5100, 0x5200, 0x5300, 0x5400, 0x5500, 0x5600, 0x5700, + 0x5800, 0x5900, 0x5a00, 0x5b00, 0x5c00, 0x5d00, 0x5e00, 0x5f00, + 0x6000, 0x6100, 0x6200, 0x6300, 0x6400, 0x6500, 0x6600, 0x6700, + 0x6800, 0x6900, 0x6a00, 0x6b00, 0x6c00, 0x6d00, 0x6e00, 0x6f00, + 0x7000, 0x7100, 0x7200, 0x7300, 0x7400, 0x7500, 0x7600, 0x7700, + 0x7800, 0x7900, 0x7a00, 0x7b00, 0x7c00, 0x7d00, 0x7e00, 0x7f00, + 0x8000, 0x8100, 0x8200, 0x8300, 0x8400, 0x8500, 0x8600, 0x8700, + 0x8800, 0x8900, 0x8a00, 0x8b00, 0x8c00, 0x8d00, 0x8e00, 0x8f00, + 0x9000, 0x9100, 0x9200, 0x9300, 0x9400, 0x9500, 0x9600, 0x9700, + 0x9800, 0x9900, 0x9a00, 0x9b00, 0x9c00, 0x9d00, 0x9e00, 0x9f00, + 0xf900, 0xfa00, 0xfe00, 0xff00, 0x20000, 0x20180, 0x20300, 0x20400, + 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20d00, + 0x20e00, 0x20f00, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21700, + 0x21800, 0x21900, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22100, 0x22200, + 0x22300, 0x22600, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, + 0x23100, 0x23300, 0x23400, 0x23500, 0x23600, 0x23700, 0x23800, 0x23a00, + 0x23c00, 0x23d00, 0x23f00, 0x24000, 0x24100, 0x24300, 0x24600, 0x24700, + 0x24800, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x25000, 0x25100, + 0x25200, 0x25400, 0x25500, 0x25700, 0x25900, 0x25a00, 0x25b80, 0x25d00, + 0x25e00, 0x25f00, 0x26000, 0x26200, 0x26300, 0x26400, 0x26600, 0x26700, + 0x26800, 0x26900, 0x26a00, 0x26c00, 0x26e00, 0x26f00, 0x27080, 0x27380, + 0x27600, 0x27700, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d80, 0x27f00, + 0x28000, 0x28200, 0x28380, 0x28500, 0x28600, 0x28900, 0x28a00, 0x28b00, + 0x28d00, 0x28e00, 0x28f00, 0x29200, 0x29400, 0x29500, 0x29600, 0x29700, + 0x29800, 0x29a00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a380, + 0x2a500, 0x2a600, +}; + +static const short jisx0213_from_ucs_level1[2715] = { + -1, -1, 0, 1, 2, 3, 4, 5, + -1, 6, 7, 8, 9, 10, 11, 12, + 13, 14, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 15, -1, -1, -1, -1, 16, -1, -1, + 17, 18, 19, -1, 20, 21, 22, 23, + 24, 25, 26, 27, 28, -1, 29, 30, + 31, 32, -1, 33, 34, 35, 36, 37, + 38, 39, -1, -1, 40, 41, -1, -1, + -1, -1, -1, -1, 42, -1, 43, 44, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, 48, -1, -1, -1, 49, + 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, -1, 70, 71, 72, + 73, 74, -1, 75, 76, 77, -1, -1, + -1, 78, -1, 79, 80, 81, 82, 83, + 84, -1, -1, 85, 86, 87, 88, 89, + 90, 91, 92, -1, -1, 93, 94, 95, + 96, 97, 98, -1, 99, 100, 101, 102, + 103, 104, -1, 105, 106, 107, -1, 108, + 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, -1, 120, 121, -1, 122, + 123, 124, 125, -1, -1, -1, 126, 127, + 128, -1, 129, -1, 130, -1, -1, 131, + 132, -1, -1, 133, 134, 135, -1, -1, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, -1, + 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, -1, -1, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, -1, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 458, 459, -1, 460, + 461, 462, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 463, -1, -1, 464, 465, -1, 466, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 467, -1, 468, -1, -1, -1, 469, -1, + 470, -1, -1, -1, 471, 472, 473, 474, + -1, 475, -1, -1, 476, -1, -1, 477, + 478, -1, -1, -1, -1, 479, -1, -1, + 480, -1, 481, -1, -1, 482, 483, -1, + -1, -1, -1, 484, 485, -1, 486, -1, + -1, -1, -1, -1, -1, 487, -1, 488, + -1, 489, 490, -1, -1, 491, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 492, 493, -1, 494, 495, 496, -1, 497, + -1, 498, -1, -1, -1, -1, -1, 499, + -1, 500, 501, -1, 502, 503, -1, -1, + -1, -1, 504, -1, -1, -1, -1, 505, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 506, -1, -1, 507, 508, 509, 510, + 511, -1, -1, -1, 512, 513, -1, 514, + -1, -1, -1, -1, -1, 515, -1, -1, + 516, -1, -1, -1, 517, -1, 518, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 519, -1, -1, -1, -1, + -1, 520, 521, -1, -1, -1, 522, -1, + -1, -1, 523, -1, -1, 524, 525, -1, + 526, -1, -1, -1, -1, -1, -1, 527, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 528, 529, + -1, -1, -1, -1, -1, 530, -1, 531, + -1, 532, -1, 533, -1, 534, 535, 536, + 537, 538, -1, -1, 539, 540, -1, 541, + 542, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 543, -1, -1, -1, -1, -1, + -1, 544, -1, 545, 546, 547, -1, 548, + -1, -1, -1, -1, -1, 549, -1, -1, + -1, -1, 550, -1, 551, -1, -1, 552, + -1, -1, -1, -1, -1, -1, 553, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 554, -1, 555, -1, -1, -1, -1, 556, + -1, -1, 557, -1, -1, -1, -1, -1, + -1, 558, -1, -1, -1, 559, -1, -1, + 560, -1, -1, -1, 561, -1, -1, -1, + 562, 563, 564, -1, -1, -1, -1, -1, + -1, 565, -1, -1, 566, -1, 567, 568, + 569, 570, -1, -1, -1, -1, -1, -1, + 571, -1, 572, 573, 574, -1, 575, -1, + -1, -1, -1, -1, -1, 576, 577, -1, + -1, -1, -1, -1, -1, -1, -1, 578, + -1, -1, -1, 579, -1, -1, 580, -1, + -1, 581, -1, -1, -1, -1, 582, -1, + 583, 584, -1, 585, 586, 587, -1, 588, + 589, 590, -1, 591, -1, -1, -1, -1, + -1, 592, 593, -1, -1, 594, -1, -1, + 595, -1, -1, -1, -1, -1, -1, -1, + -1, 596, 597, -1, 598, -1, -1, -1, + -1, -1, -1, 599, -1, 600, -1, 601, + 602, 603, 604, 605, -1, -1, -1, -1, + 606, 607, -1, 608, -1, -1, -1, -1, + -1, 609, -1, -1, -1, -1, 610, 611, + -1, -1, -1, 612, 613, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 614, + 615, 616, -1, -1, -1, -1, -1, -1, + 617, -1, 618, -1, 619, 620, -1, -1, + -1, -1, -1, -1, -1, -1, 621, -1, + -1, -1, 622, -1, -1, -1, 623, 624, + -1, -1, 625, -1, -1, -1, 626, -1, + 627, -1, -1, -1, -1, -1, 628, -1, + -1, -1, 629, -1, -1, -1, -1, -1, + -1, 630, 631, 632, -1, -1, -1, 633, + 634, 635, -1, -1, -1, 636, -1, 637, + -1, -1, -1, 638, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 639, 640, -1, + 641, 642, 643, 644, -1, -1, -1, 645, + -1, -1, -1, -1, 646, 647, -1, 648, + 649, -1, 650, 651, 652, -1, -1, 653, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 654, -1, -1, -1, -1, -1, + -1, -1, 655, -1, -1, -1, -1, 656, + -1, 657, -1, 658, 659, 660, -1, -1, + -1, -1, -1, 661, -1, -1, -1, -1, + -1, 662, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 663, + 664, 665, 666, 667, -1, -1, -1, 668, + 669, -1, 670, 671, -1, -1, 672, -1, + -1, -1, -1, -1, -1, -1, 673, -1, + 674, -1, -1, -1, -1, -1, -1, 675, + 676, -1, 677, +}; + +static const unsigned short jisx0213_from_ucs_level2_data[] = { + /* 0x0080 */ + 0x2922, 0x2923, 0x2171, 0x2172, 0x2924, 0x2925, 0x2178, 0x212f, + 0x2926, 0x2927, 0x2928, 0x224c, 0x2929, 0x292a, 0x292b, 0x216b, + 0x215e, 0x292c, 0x292d, 0x212d, 0x2279, 0x292e, 0x292f, 0x2930, + 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, + /* 0x00C0 */ + 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, + 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, + 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x215f, + 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, + 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x29dc, 0x295d, + 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, + 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x2160, + 0x296d, 0x296e, 0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, + /* 0x0100 */ + 0x2975, 0x297a, 0x2a3a, 0x2a49, 0x2a21, 0x2a2c, 0x2a3c, 0x2a4b, + 0x2a59, 0x2a5f, 0x2a3d, 0x2a4c, 0x2a40, 0x2a4f, 0x2a50, 0x2978, + 0x297d, 0x2a3e, 0x2a4d, 0x2a3f, 0x2a4e, 0x2a5a, 0x2a60, 0x2a5b, + 0x2a61, 0x2a7d, 0x2976, 0x297b, 0x2a5c, 0x2a62, 0x2a3b, 0x2a4a, + 0x2a24, 0x2a2f, + /* 0x0140 */ + 0x2a23, 0x2a2e, 0x2a41, 0x2a51, 0x2a42, 0x2a52, 0x2a7a, 0x2979, + 0x297e, 0x2a43, 0x2a53, 0x2b2b, 0x2b2a, 0x2a39, 0x2a48, 0x2a44, + 0x2a54, 0x2a25, 0x2a30, 0x2a5d, 0x2a63, 0x2a27, 0x2a33, 0x2a26, + 0x2a32, 0x2a47, 0x2a57, 0x2a28, 0x2a34, 0x2977, 0x297c, 0x2a5e, + 0x2a64, 0x2a45, 0x2a55, 0x2a46, 0x2a56, 0x2a29, 0x2a35, 0x2a2b, + 0x2a38, 0x2a2a, 0x2a37, + /* 0x0180 */ + 0x2b29, + /* 0x01C0 */ + 0x2b24, 0x286f, 0x2870, 0x2871, 0x2876, 0x2877, 0x2878, 0x2879, + 0x287a, 0x287b, 0x287c, 0x2874, 0x2875, 0x2b45, + /* 0x0240 */ + 0x2b33, 0x2b39, 0x2b3a, 0x2b25, 0x2bb8, 0x2b3f, 0x2a6e, 0x2b26, + 0x2b2e, 0x2bb0, 0x2bc3, 0x2b31, 0x2b32, 0x2a75, 0x2b28, 0x2a79, + 0x2b36, 0x2b3c, 0x2b22, 0x2b42, 0x2b2c, 0x2a6a, 0x2a74, 0x2a6b, + 0x2b34, 0x2a7b, 0x2a65, 0x2a76, 0x2a6f, 0x2b2f, 0x2a6c, 0x2b41, + 0x2a73, 0x2a70, 0x2a67, + /* 0x0280 */ + 0x2a7c, 0x2a71, 0x2a68, 0x2b27, 0x2a6d, 0x2b2d, 0x2b35, 0x2a66, + 0x2bb7, 0x2b3b, 0x2a78, 0x2a72, 0x2b40, 0x2a69, 0x2b21, 0x2a7e, + 0x2b23, 0x2a77, 0x2b3e, 0x2b3d, + /* 0x02C0 */ + 0x2a31, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2a22, 0x2a58, 0x2a2d, + 0x2a36, 0x2b71, 0x2be0, 0x2b61, 0x2b62, 0x2b63, 0x2be4, + /* 0x0300 */ + 0x2b5c, 0x2b5a, 0x2b5f, 0x2b7d, 0x2b5b, 0x2b57, 0x2b6d, 0x2b59, + 0x2b5e, 0x2b5d, 0x2b78, 0x2b79, 0x2b7e, 0x2b6a, 0x2b76, 0x2b77, + 0x2b6b, 0x2b6c, 0x2b72, 0x2b67, 0x2b6f, 0x2b7a, 0x2b68, 0x2b70, + 0x2b73, 0x2b75, 0x2b69, 0x2b7b, 0x2b7c, 0x2b74, 0x2b6e, + /* 0x0340 */ + 0x2b52, + /* 0x0380 */ + 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, + 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, + 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, + 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, + 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, + /* 0x03C0 */ + 0x2650, 0x2651, 0x2659, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, + 0x2657, 0x2658, + /* 0x0400 */ + 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, + 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, + 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, + 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, + 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, + 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, + 0x2761, + /* 0x0440 */ + 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, + 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, + 0x2757, + /* 0x1E00 */ + 0x2872, 0x2873, + /* 0x1F40 */ + 0x2b46, 0x2b47, 0x2b50, 0x2b51, + /* 0x2000 */ + 0x213e, 0x237c, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, + 0x2277, 0x2278, 0x2340, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, + 0x2228, 0x286b, 0x2b58, + /* 0x2040 */ + 0x2c7e, 0x286c, 0x286d, 0x286e, 0x2c7d, + /* 0x2080 */ + 0x2921, + /* 0x2100 */ + 0x216e, 0x235d, 0x235f, 0x2d62, 0x2d64, 0x2360, 0x2272, 0x235c, + /* 0x2140 */ + 0x2778, 0x2779, 0x277a, 0x2d35, 0x2d36, 0x2d37, 0x2d38, 0x2d39, + 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2d3e, 0x2d3f, 0x2d57, 0x2c35, + 0x2c36, 0x2c37, 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, + 0x2c3e, 0x2c3f, 0x2c40, + /* 0x2180 */ + 0x222b, 0x222c, 0x222a, 0x222d, 0x2271, 0x2327, 0x2325, 0x2326, + 0x2328, + /* 0x21C0 */ + 0x2329, 0x224d, 0x224e, 0x232b, 0x232c, 0x232a, 0x232d, + /* 0x2200 */ + 0x224f, 0x225f, 0x2250, 0x2247, 0x2260, 0x223a, 0x2246, 0x223b, + 0x215d, 0x235b, 0x2265, 0x2267, 0x2167, 0x2d78, 0x225c, 0x2254, + 0x2255, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2d73, + 0x2168, 0x2268, 0x2266, + /* 0x2240 */ + 0x226c, 0x226d, 0x226e, 0x2262, 0x2162, 0x2261, 0x226b, 0x2165, + 0x2166, 0x2263, 0x2264, 0x226f, 0x2270, + /* 0x2280 */ + 0x223e, 0x223f, 0x2242, 0x2243, 0x223c, 0x223d, 0x2244, 0x2245, + 0x2251, 0x2252, 0x2253, 0x225d, 0x2d79, + /* 0x22C0 */ + 0x2776, 0x2777, + /* 0x2300 */ + 0x2248, 0x2249, 0x225e, 0x277c, + /* 0x2380 */ + 0x2742, 0x2743, + /* 0x23C0 */ + 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, + 0x274c, 0x274d, 0x274e, 0x274f, 0x2750, 0x277e, + /* 0x2400 */ + 0x277d, + /* 0x2440 */ + 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x2d26, 0x2d27, 0x2d28, + 0x2d29, 0x2d2a, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e, 0x2d2f, 0x2d30, + 0x2d31, 0x2d32, 0x2d33, 0x2d34, + /* 0x24C0 */ + 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, + 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, + 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, + 0x2c59, 0x2c5a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, 0x2c30, + 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x265a, 0x265b, 0x265c, 0x265d, + 0x265e, 0x265f, 0x2660, 0x2661, 0x2662, 0x2663, + /* 0x2500 */ + 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, + 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, + 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, + 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, + /* 0x2540 */ + 0x2840, 0x2836, + /* 0x2580 */ + 0x2223, 0x2222, 0x266d, 0x2225, 0x2224, 0x2322, 0x2321, 0x2227, + 0x2226, + /* 0x25C0 */ + 0x2324, 0x2323, 0x2221, 0x217e, 0x233b, 0x217b, 0x217d, 0x217c, + 0x2867, 0x2868, 0x2869, 0x286a, 0x233f, 0x227e, + /* 0x2600 */ + 0x2668, 0x2669, 0x266a, 0x266b, 0x217a, 0x2179, 0x2667, 0x2664, + 0x2665, 0x2d7e, + /* 0x2640 */ + 0x216a, 0x2169, 0x263a, 0x263d, 0x263b, 0x2640, 0x2639, 0x263e, + 0x263c, 0x263f, 0x266c, 0x227d, 0x2276, 0x227b, 0x227c, 0x2275, + 0x227a, 0x2274, + /* 0x2700 */ + 0x277b, + /* 0x2740 */ + 0x2d7d, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, + 0x2c28, 0x2c29, 0x2c2a, + /* 0x2900 */ + 0x232e, 0x232f, + /* 0x2980 */ + 0x233a, + /* 0x29C0 */ + 0x237d, 0x237e, + /* 0x3000 */ + 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, + 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, + 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x225a, 0x225b, 0x2258, + 0x2259, 0x2141, 0x2d60, 0x2d61, 0x2666, 0x2233, 0x2234, 0x2235, + 0x2236, 0x2237, 0x233c, + /* 0x3040 */ + 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, + 0x2429, 0x242a, 0x24ab, 0x242c, 0x24ad, 0x242e, 0x24af, 0x2430, + 0x24b1, 0x2432, 0x24b3, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, + 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, + 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, + 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, + 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, + 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, + /* 0x3080 */ + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x212b, + 0x212c, 0x2135, 0x2136, 0x2239, 0x237b, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x25ab, + 0x252c, 0x25ad, 0x252e, 0x25af, 0x2530, 0x25b1, 0x2532, 0x25b3, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x25bb, + 0x253c, 0x253d, 0x253e, 0x253f, + /* 0x30C0 */ + 0x2540, 0x2541, 0x2542, 0x2543, 0x25c4, 0x2545, 0x2546, 0x2547, + 0x25c8, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, + 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, + 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, + 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, + 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, + 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2772, + 0x2773, 0x2774, 0x2775, 0x2126, 0x213c, 0x2133, 0x2134, 0x2238, + /* 0x31C0 */ + 0x266e, 0x266f, 0x2670, 0x2671, 0x2672, 0x2673, 0x2674, 0x26f5, + 0x2676, 0x2677, 0x2679, 0x267a, 0x267b, 0x267c, 0x267d, 0x267e, + /* 0x3200 */ + 0x2d6a, 0x2d6b, 0x2d6c, + /* 0x3240 */ + 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847, 0x2848, + 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, + /* 0x3280 */ + 0x2d65, 0x2d66, 0x2d67, 0x2d68, 0x2d69, 0x2850, 0x2851, 0x2852, + 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, + 0x285b, 0x285c, 0x285d, 0x285e, + /* 0x32C0 */ + 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, 0x2c60, 0x2c61, 0x2c62, + 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c68, 0x2c69, 0x2c6a, + 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c71, 0x2c70, 0x2c73, 0x2c72, + 0x2c6f, + /* 0x3300 */ + 0x2d46, 0x2d4a, 0x2d41, 0x2d44, 0x2d42, 0x2d4c, 0x2d4b, 0x2d45, + 0x2d4d, 0x2d47, 0x2d4f, + /* 0x3340 */ + 0x2d40, 0x2d4e, 0x2d43, 0x2d48, 0x2d49, 0x2d5f, 0x2d6f, 0x2d6e, + 0x2d6d, + /* 0x3380 */ + 0x2d53, 0x2d54, 0x2d50, 0x2d51, 0x2d52, 0x2d56, + /* 0x33C0 */ + 0x2d55, 0x235e, 0x2d63, + /* 0x3400 */ + 0x2e23, 0xa12d, 0xa132, 0xa133, + /* 0x3440 */ + 0xa15e, 0xa156, + /* 0x3480 */ + 0xa17e, 0x2e53, 0xa32b, + /* 0x34C0 */ + 0xf468, 0xa32f, 0x2e5b, + /* 0x3500 */ + 0xa348, + /* 0x3540 */ + 0xa35d, 0xa35e, 0xa361, 0xa367, + /* 0x3580 */ + 0xa423, 0xa426, + /* 0x35C0 */ + 0xa42f, 0xa438, 0xa442, + /* 0x3600 */ + 0xa44a, + /* 0x3640 */ + 0xa479, + /* 0x3680 */ + 0xa53f, 0xa543, 0xa541, + /* 0x36C0 */ + 0xa557, + /* 0x3740 */ + 0xa823, 0xa825, 0xa829, 0xa828, 0xa82c, + /* 0x3780 */ + 0x4f5f, + /* 0x37C0 */ + 0xa83e, 0x4f6f, 0xa856, 0xa859, 0xa85c, + /* 0x3800 */ + 0xa85e, 0xa86f, 0xa871, + /* 0x3840 */ + 0xa874, 0xa879, 0xa87b, + /* 0x38C0 */ + 0xac3b, + /* 0x3900 */ + 0xac46, 0xac4a, + /* 0x3940 */ + 0xac60, + /* 0x3A40 */ + 0xad5b, 0xad5f, + /* 0x3AC0 */ + 0xad71, 0xae36, 0xad7c, + /* 0x3B00 */ + 0xae2e, 0xae32, 0xae34, 0x7549, + /* 0x3B40 */ + 0xae6d, 0xae65, + /* 0x3B80 */ + 0xaf28, 0xaf29, 0xaf2c, 0xaf34, 0x757e, + /* 0x3BC0 */ + 0x7621, 0xaf48, 0xaf5d, + /* 0x3C00 */ + 0x763a, 0xaf77, + /* 0x3CC0 */ + 0xee3b, 0xee42, + /* 0x3D00 */ + 0xee71, 0xee7e, + /* 0x3D40 */ + 0xef40, + /* 0x3D80 */ + 0xef54, + /* 0x3DC0 */ + 0xef70, 0xef77, + /* 0x3E00 */ + 0xf028, 0x7766, + /* 0x3E40 */ + 0xf03f, 0xf041, 0xf042, + /* 0x3E80 */ + 0xf049, 0xf050, + /* 0x3F40 */ + 0xf134, 0x784d, 0xf146, 0xf148, + /* 0x3F80 */ + 0xf15c, + /* 0x3FC0 */ + 0xf167, 0xf16c, + /* 0x4000 */ + 0xf222, + /* 0x4040 */ + 0xf22d, + /* 0x4080 */ + 0xf239, + /* 0x4100 */ + 0xf264, + /* 0x4140 */ + 0xf274, 0xf277, 0xf27d, + /* 0x4180 */ + 0xf333, 0xf337, + /* 0x41C0 */ + 0xf347, 0xf34b, 0xf348, + /* 0x4200 */ + 0xf353, 0xf357, + /* 0x4240 */ + 0x796d, + /* 0x42C0 */ + 0xf42b, 0xf436, 0xf43b, + /* 0x4300 */ + 0xf44e, 0xf45d, + /* 0x4340 */ + 0xf461, + /* 0x43C0 */ + 0xf53e, 0xf542, + /* 0x4400 */ + 0xf548, 0xf54a, 0xf54c, 0xf54f, + /* 0x4440 */ + 0x7a59, 0x7a5a, 0xf56c, 0xf56e, + /* 0x4480 */ + 0xf577, 0xf635, 0xf632, + /* 0x44C0 */ + 0xf634, + /* 0x4500 */ + 0xf659, 0xf654, 0xf66d, + /* 0x4540 */ + 0xf66e, + /* 0x4580 */ + 0x7b51, 0xf74f, + /* 0x45C0 */ + 0xf76c, 0x7b60, + /* 0x4600 */ + 0xf824, + /* 0x4640 */ + 0xf83a, 0xf843, + /* 0x4680 */ + 0xf84e, 0xf853, + /* 0x4700 */ + 0xf86b, + /* 0x4740 */ + 0xf929, + /* 0x47C0 */ + 0xf93f, + /* 0x4800 */ + 0xf949, + /* 0x4840 */ + 0x7c4b, 0xf95c, + /* 0x4880 */ + 0xfa27, + /* 0x4980 */ + 0x7d58, + /* 0x49C0 */ + 0xfb6a, 0xfb70, + /* 0x4A00 */ + 0xfb75, 0xfb78, + /* 0x4A80 */ + 0xfc37, + /* 0x4B00 */ + 0xfc55, + /* 0x4BC0 */ + 0xfd26, 0xfd28, 0xfd2a, 0xfd31, + /* 0x4C00 */ + 0x7e3e, 0xfd3f, + /* 0x4CC0 */ + 0xfe2a, 0xfe2d, + /* 0x4D00 */ + 0xfe4b, + /* 0x4D40 */ + 0xfe60, + /* 0x4E00 */ + 0x306c, 0x437a, 0xa122, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, + 0x323c, 0x4954, 0x4d3f, 0xa123, 0x5022, 0x312f, 0xa124, 0x336e, + 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, + 0x2e24, 0xa125, 0x5024, 0xa126, 0xf02e, 0x4366, 0xa127, 0x2e25, + 0x2e26, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, + 0x5028, + /* 0x4E40 */ + 0xa128, 0x5029, 0x4735, 0x3557, 0xa129, 0xa12a, 0x4737, 0x4663, + 0x3843, 0x4b33, 0xa12c, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, + 0xa12f, 0x3665, 0x3870, 0x4c69, 0x5626, 0xa130, 0x4d70, 0x467d, + 0x3425, + /* 0x4E80 */ + 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, + 0x4673, 0x2e27, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, + 0x4f4a, 0x3a33, 0x3021, 0xa131, 0x5033, 0x5034, 0x5035, 0x4b34, + 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, + 0x4e3c, 0x5037, 0x5038, 0x5039, 0xa134, 0x3f4d, 0xa135, 0xa137, + /* 0x4EC0 */ + 0x3d3a, 0x3f4e, 0x503e, 0xa138, 0x503c, 0x503d, 0x3558, 0xa139, + 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0xa13a, 0x3b46, 0x3b45, + 0x423e, 0x503f, 0x4955, 0x4067, 0xa13c, 0x2138, 0x5040, 0x5042, + 0x2e28, 0x4265, 0x4e61, 0x304a, 0xa13b, 0x5041, 0x323e, 0x3644, + 0xa13d, 0x4367, 0xa13e, 0x376f, 0x5043, 0x4724, 0x2e29, 0x2e2a, + /* 0x4F00 */ + 0xa13f, 0x346b, 0x2e2b, 0x5044, 0x304b, 0x2e2c, 0x3860, 0x346c, + 0x497a, 0x4832, 0x3559, 0xa140, 0x3271, 0x5067, 0x4541, 0x476c, + 0x5046, 0x483c, 0x4e62, 0xa142, 0x3f2d, 0x3b47, 0x3b77, 0x3240, + 0xa143, + /* 0x4F40 */ + 0x4451, 0x4322, 0x504a, 0x2e2e, 0x2e2f, 0x304c, 0x4463, 0x3d3b, + 0x3a34, 0x4d24, 0x424e, 0xa144, 0x323f, 0x2e30, 0x5049, 0xa145, + 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x2e31, 0x2e2d, + 0xa141, 0x5050, 0x2e32, 0x2e33, 0x5053, 0x5051, 0x3242, 0x4a3b, + 0x504b, 0xa147, 0xa148, 0xa149, 0x504f, 0x3873, 0xa14a, 0x2e34, + 0x3b48, + /* 0x4F80 */ + 0xa14b, 0x3426, 0xa14c, 0x5054, 0x504c, 0x2e35, 0x4e63, 0x3b78, + 0x504d, 0x5052, 0xa14d, 0x2e36, 0x5055, 0x2e37, 0x504e, 0xa14e, + 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, + 0xa150, 0x3f2f, 0x4e37, 0xa151, 0x4a58, + /* 0x4FC0 */ + 0x3738, 0x4225, 0x3264, 0xa152, 0x2e39, 0x3d53, 0xa153, 0x5059, + 0xa154, 0x505e, 0x505c, 0xa155, 0x5057, 0x422f, 0x505a, 0x505d, + 0x505b, 0x4a5d, 0x5058, 0x2e3a, 0x3f2e, 0x4b73, 0x505f, 0x5060, + 0xa14f, 0x3d24, 0x506d, 0x2e21, 0xa157, 0x4750, 0x4936, 0x5068, + 0x4a70, 0x3236, 0x506c, + /* 0x5000 */ + 0xa158, 0x2e3b, 0x2e3c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, + 0x2e3d, 0x6047, 0xa159, 0x506e, 0x455d, 0xa15a, 0x5063, 0x3876, + 0x2e3e, 0x3875, 0x5061, 0xa15b, 0xa15c, 0x3c5a, 0x5069, 0xa15d, + 0x4a6f, 0x434d, 0x5065, 0x3771, 0x2e3f, 0x5062, 0x506a, 0x5064, + 0x4e51, 0x506b, 0x4f41, 0x2e40, 0x3666, 0x3770, 0x2e42, + /* 0x5040 */ + 0x2e41, 0x2e43, 0xa15f, 0x5070, 0xa160, 0x5071, 0x5075, 0x304e, + 0xa161, 0x4a50, 0x5074, 0xa162, 0x5073, 0x5077, 0xa163, 0x5076, + 0x4464, 0xa164, 0x3772, 0xa165, 0xa166, 0x5078, 0xa167, 0x3c45, + 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, + /* 0x5080 */ + 0x507a, 0x507c, 0xa169, 0x4b35, 0x3766, 0xa16a, 0xa16b, 0x2e44, + 0xa16c, 0xa16d, 0x3b31, 0x4877, 0x507b, 0xa16e, 0xa168, 0xa16f, + 0x3a45, 0x4d43, 0xa171, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, + 0xa172, 0xa173, 0x3739, + /* 0x50C0 */ + 0x5124, 0xa174, 0x364f, 0xa175, 0x5121, 0x5122, 0x2e45, 0x462f, + 0xa178, 0x417c, 0x2e47, 0x3623, 0xa17a, 0x4b4d, 0x5125, 0xa17b, + 0x4e3d, 0x5126, 0xa17c, 0x5129, 0x5127, 0x2e48, 0x414e, 0xa17d, + 0x5128, 0x512a, 0x2e46, 0xa176, 0x512c, 0x512b, 0x4a48, + /* 0x5100 */ + 0x3537, 0x512e, 0x512f, 0x2e4b, 0x322f, 0x2e4a, 0xa321, 0x512d, + 0x2e4c, 0x3c74, 0x5132, 0x5131, 0x5130, 0xa323, 0x5056, 0x5133, + 0xa324, 0x2e4d, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x2e4e, 0x5136, + 0x5135, 0x5138, 0x5137, 0x5139, + /* 0x5140 */ + 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, + 0x3877, 0x2e4f, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, + 0x513d, 0x2e51, 0x2e52, 0x455e, 0x3375, 0xa326, 0x513e, 0x467e, + 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, + 0xa328, 0x4a3c, 0x4236, 0x3671, 0x4535, 0xf474, 0x3773, + /* 0x5180 */ + 0x5143, 0x5144, 0xa329, 0x4662, 0x315f, 0x5147, 0x3a7d, 0xa32a, + 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, + 0x514c, 0x3e69, 0xa32c, 0x3c4c, 0x2e54, 0x3427, 0x514f, 0xa32d, + 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, + 0xa32e, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, + 0x4e64, 0xa330, 0x5158, + /* 0x51C0 */ + 0x2e55, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x2e56, 0x437c, 0x4e3f, + 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x2e57, 0x515c, 0x4b5e, + 0x2e58, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x2e59, 0x5160, + 0x332e, 0xa333, 0xa334, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, + 0x4821, 0x5162, + /* 0x5200 */ + 0x4561, 0x2e5a, 0xa335, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, + 0x3429, 0x5164, 0x5166, 0x373a, 0xa336, 0x2e5c, 0x5165, 0x2e5d, + 0xa337, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, + 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, + 0x396f, + /* 0x5240 */ + 0x4466, 0x516d, 0x4227, 0x2e5e, 0x3a6f, 0x516e, 0x516f, 0x4130, + 0x516c, 0x5171, 0xa339, 0x4b36, 0x2e5f, 0x3964, 0xa33a, 0x2f7e, + 0x5170, 0x2e60, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0xa33b, + 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0xa33c, + 0x5177, 0x5176, + /* 0x5280 */ + 0xa33e, 0x3344, 0xa33d, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, + 0x517a, 0x2e61, 0x5179, 0xa340, 0x4e4f, 0x3879, 0x3243, 0x4e74, + 0xa342, 0xa343, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0xa344, + 0x4e65, 0x4f2b, 0x5225, 0x387a, 0xa345, 0xa346, 0x5224, 0x332f, + /* 0x52C0 */ + 0x5226, 0x4b56, 0x443c, 0x4d26, 0x2e62, 0x4a59, 0xa347, 0x2e64, + 0x5227, 0x2e65, 0xa349, 0x7055, 0x4630, 0x2e66, 0x5228, 0x342a, + 0x4c33, 0x2e67, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, + 0x3650, 0x522b, 0x342b, 0x2e69, 0x372e, 0x522e, 0x522f, 0xa34b, + 0x5230, 0x5231, 0x3c5b, 0x2e6a, 0x387b, 0x4c5e, + /* 0x5300 */ + 0x2e6b, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x2e6c, 0x5233, 0xa34c, + 0xa34d, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, + 0x5239, 0x2e6d, 0x4159, 0x3e22, 0x3629, 0x523a, 0xa34e, 0x485b, + 0x523b, 0x523c, 0x523d, 0xa34f, 0x523e, 0x4924, 0x3668, 0x3065, + 0xa350, 0x463f, + /* 0x5340 */ + 0x523f, 0x3d3d, 0xa351, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, + 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, + 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x2e6f, 0x2e70, 0x3735, + 0xa354, 0x5247, 0xa355, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, + 0x3551, 0x4d71, 0x524b, 0x3237, 0xa356, 0x524a, 0x2e71, 0x362a, + /* 0x5380 */ + 0x524c, 0x4c71, 0x2e72, 0x524d, 0x4e52, 0x387c, 0x2e73, 0x3836, + 0x524e, 0xa357, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, + 0x5252, 0x2e74, 0x3837, 0xa358, 0x5253, 0xa35a, 0x356e, + /* 0x53C0 */ + 0xa35b, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, + 0x483f, 0x3c7d, 0x3d47, 0xa35f, 0x3c68, 0x3c75, 0x3d76, 0xa360, + 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, + 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, + 0x3c38, 0x3b4b, 0x3126, 0xa362, 0xa363, 0x3370, 0x3966, 0x3b4a, + 0x525d, + /* 0x5400 */ + 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, + 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x2e75, 0x372f, 0x5267, + 0x4f7e, 0x3663, 0x4b4a, 0xa365, 0x485d, 0x2e76, 0xa366, 0x5266, + 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, + 0x5263, 0x525f, 0x3863, + /* 0x5440 */ + 0x5260, 0x4f24, 0xa368, 0x4a72, 0x4468, 0x3862, 0x3970, 0x2e77, + 0x5268, 0x465d, 0xa364, 0x526c, 0xa369, 0xa36a, 0x3c7e, 0x3c76, + 0x2e79, 0xa36b, 0x526f, 0x526d, 0x4c23, 0x2e7a, 0x526a, 0x5273, + 0x526e, 0x5271, 0x3846, 0x4c3f, 0x2e7b, + /* 0x5480 */ + 0x5272, 0x5274, 0x5276, 0x2e7c, 0xa36c, 0x3a70, 0x4f42, 0xa36d, + 0x526b, 0x5269, 0x5275, 0x5270, 0xa36e, 0x2e7d, 0x2e78, 0xa36f, + 0x2e7e, 0x5278, 0x5323, 0x527a, 0xa370, 0x527e, 0x2f21, 0x5321, + 0x527b, 0xa371, 0xa372, 0x533e, 0x3a69, 0x3331, 0xa373, 0x5279, + 0xa374, 0x5325, 0x3076, 0x5324, 0xa375, + /* 0x54C0 */ + 0x3025, 0x494a, 0x5322, 0xa376, 0x527c, 0x2f22, 0x5277, 0x527d, + 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, + 0xa378, 0x532d, 0x532c, 0xa379, 0xa37a, 0x452f, 0xa37b, 0x532e, + 0x532b, 0x2f23, + /* 0x5500 */ + 0xa37c, 0xa37d, 0x3134, 0x3a36, 0x3f30, 0xa37e, 0x2f24, 0x5329, + 0x4562, 0x532a, 0x3022, 0x2f25, 0x5334, 0x4d23, 0x3e27, 0x533a, + 0x2f26, 0x5339, 0x5330, 0xa421, 0x4243, + /* 0x5540 */ + 0x5331, 0xa422, 0x426f, 0x5336, 0x3e26, 0xa424, 0xa425, 0x5333, + 0x4c64, 0x2f27, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x2f28, + 0xa427, 0xa428, 0x5332, 0xa429, 0x5341, 0x5346, 0xa42b, 0x5342, + /* 0x5580 */ + 0x533d, 0x2f29, 0xa42c, 0x5347, 0x4131, 0x2f2a, 0x5349, 0xa42d, + 0x3922, 0x533f, 0x437d, 0x2f2b, 0xa42e, 0x5343, 0x533c, 0x342d, + 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, + 0x354a, 0x362c, 0x2f2d, 0x5345, 0x3674, 0x3144, 0xa433, + /* 0x55C0 */ + 0x534e, 0x534c, 0x5427, 0xa434, 0xa435, 0x2f2e, 0xa436, 0xa430, + 0x5351, 0x534b, 0x534f, 0xa437, 0x534d, 0xa439, 0x3b4c, 0x5350, + 0xa43b, 0x5353, 0x5358, 0x5356, 0x5355, + /* 0x5600 */ + 0x4332, 0xa43e, 0x2f30, 0x3245, 0x2f31, 0xa43f, 0x5352, 0x5354, + 0x3e28, 0x3133, 0x5357, 0xa43c, 0x325e, 0x5362, 0xa440, 0x3e7c, + 0x535e, 0x535c, 0x535d, 0xa441, 0x535f, 0x2f32, 0xa443, 0xa444, + /* 0x5640 */ + 0xa445, 0x313d, 0xa446, 0x2f33, 0x4139, 0x5359, 0x535a, 0x7427, + 0x337a, 0xa447, 0xa448, 0x5361, 0x2f35, 0x346f, 0x5364, 0x5360, + 0x5363, 0xa449, 0x2f37, 0x2f38, 0x2f39, 0x4a2e, 0x2f34, 0x4655, + 0x4838, + /* 0x5680 */ + 0x5366, 0x5365, 0x3345, 0xa44b, 0x5367, 0xa44c, 0x536a, 0x5369, + 0xa44d, 0x2f3a, 0xa44e, 0xa44f, 0x2f3b, 0x5368, 0x4739, 0x536b, + 0xa450, 0x2f3c, 0x2f3d, 0xa451, 0x536c, 0xa452, 0x2f3e, 0x536e, + 0x536d, 0x5370, + /* 0x56C0 */ + 0x5373, 0x5371, 0x536f, 0x5372, 0xa453, 0x5374, 0x2f3f, 0x2f40, + 0xa454, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, + 0x3273, 0xa455, 0x3078, 0x4344, 0xa456, 0x5379, 0x3a24, 0x304f, + 0x3f5e, 0xa457, 0xa458, 0x537a, 0x3847, 0x3971, 0x537c, + /* 0x5700 */ + 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x2f41, 0x5422, 0x5423, + 0x3777, 0x3160, 0x5424, 0xa45a, 0x5426, 0x5425, 0x5428, 0x455a, + 0x2f43, 0xa45b, 0x5429, 0x3035, 0x3a5f, 0xa45d, 0x373d, 0x2f44, + 0x434f, 0x2f45, 0x2f46, 0x542a, 0x542b, 0x542d, + /* 0x5740 */ + 0x542e, 0x3a64, 0xa45f, 0xa460, 0x3651, 0x4b37, 0xa461, 0xa462, + 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0xa464, + 0x5430, 0x445a, 0xa465, 0x2f47, 0xa466, 0xa467, 0xa468, 0x2f48, + 0xa469, 0x2f49, 0x5434, + /* 0x5780 */ + 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0xa46d, 0x2f4a, 0xa46e, + 0xa46f, 0x5437, 0x3924, 0x3340, 0x5439, 0xa470, 0x543a, 0xa46c, + 0x543b, 0x5438, 0x2f4d, + /* 0x57C0 */ + 0x5431, 0x543c, 0x543d, 0x2f4e, 0x2f4f, 0x4b64, 0xa473, 0x3e6b, + 0x2f50, 0x543f, 0x5440, 0x543e, 0x5442, 0xa471, 0x4738, 0xa476, + 0x3068, 0x4956, 0x5443, 0x2f51, 0xa477, 0x2f52, 0xa478, 0x3e7d, + 0x2f53, 0x2f54, 0x3c39, 0xa47a, 0x475d, 0x3470, 0xa47b, 0x3a6b, + 0xa47c, 0x2f55, + /* 0x5800 */ + 0x4b59, 0x4632, 0xa47d, 0x3778, 0x424f, 0x2f56, 0x5441, 0x5444, + 0x4244, 0x5445, 0x5446, 0xa47e, 0xa521, 0x5448, 0x4469, 0xa522, + 0x342e, 0x7421, 0x3161, 0x4a73, 0xa523, 0x3e6c, 0x4548, 0xa524, + 0x3a66, 0x544e, + /* 0x5840 */ + 0x4a3d, 0x4e5d, 0xa526, 0x3274, 0x544a, 0xa527, 0x413a, 0x544d, + 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x2f58, 0x5449, + 0x2f59, 0xa528, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, + 0x2f5b, 0x3d4e, + /* 0x5880 */ + 0x362d, 0x5450, 0x2f5c, 0xa529, 0xa52a, 0xa52b, 0xa52c, 0xa52d, + 0x4a68, 0xa52e, 0x417d, 0x4446, 0xa52f, 0x2f5d, 0x5452, 0x4b4f, + 0x2f5f, 0xa530, 0x5453, 0x5458, 0xa531, 0x4a2f, 0x5457, 0x5451, + 0x5454, 0x5456, 0x3a26, + /* 0x58C0 */ + 0x4a49, 0xa533, 0x5459, 0x4345, 0x3275, 0x3e6d, 0xa534, 0x2f62, + 0x545b, 0x2f61, 0x545a, 0x2f63, 0x3968, 0x545c, 0x545e, 0x545d, + 0x2f64, 0x5460, 0x5455, 0x5462, 0x2f65, 0xa535, 0x5461, 0x545f, + 0x2f66, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, + 0xa536, 0xa537, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, + /* 0x5900 */ + 0x5469, 0xa538, 0xa539, 0x4a51, 0x546a, 0xa53a, 0x2f67, 0xa53b, + 0x3246, 0x546b, 0xa53c, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, + 0x546c, 0x4c6b, 0x4c34, 0xa53d, 0x546e, 0x4267, 0x4537, 0x4240, + 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, + 0xa540, 0x5473, + /* 0x5940 */ + 0x3162, 0xa542, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, + 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0xa545, 0x2f69, + 0xa546, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, + 0x547d, 0x2f6a, 0x4a33, 0x3d77, 0x455b, 0xa548, 0xa549, 0x5521, + 0xa54a, 0x3925, + /* 0x5980 */ + 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x2f6b, 0x552b, 0x2f6c, + 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0xa54b, 0x5526, 0x2f6d, + 0x4245, 0x4b38, 0x454a, 0xa54c, 0x5527, 0x4b65, 0x3a4a, 0xa54d, + 0x3e2a, + /* 0x59C0 */ + 0x2f6e, 0x5528, 0xa54e, 0x3b50, 0x3b4f, 0xa54f, 0x3039, 0x3848, + 0x2f6f, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x2f70, 0xa550, + 0xa551, 0xa552, 0x3138, 0x342f, 0xa553, 0x5529, 0x4c45, 0x4931, + 0xa554, 0x3028, 0x7e7a, 0x3079, 0x3b51, + /* 0x5A00 */ + 0x3052, 0x3023, 0x5532, 0xa558, 0xa559, 0x5530, 0x2f71, 0xa55a, + 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x2f72, 0x552e, 0xa55b, + 0x4a5a, 0xa55c, 0x3864, 0x5537, 0x5538, 0x3e2b, + /* 0x5A40 */ + 0x5534, 0x4f2c, 0x474c, 0x5536, 0xa55d, 0x3a27, 0x5539, 0xa55e, + 0x4958, 0x2f73, 0x553a, 0x5535, 0x2f74, 0x2f75, 0xa55f, 0x2f76, + 0x4c3b, + /* 0x5A80 */ + 0x2f77, 0xa560, 0x475e, 0x553b, 0x4932, 0xa561, 0x2f78, 0xa562, + 0xa563, 0xa564, 0x2f79, 0xa565, 0xa566, 0xa567, 0xa568, 0x553c, + 0x5540, 0x553d, 0xa569, + /* 0x5AC0 */ + 0x3247, 0x553f, 0x2f7a, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, + 0x5542, 0xa56a, 0xa56b, 0xa56c, 0x4364, 0x5541, 0xa56d, 0x5543, + 0x5544, 0xa56f, 0xa56e, 0xa570, 0x5546, 0x5547, + /* 0x5B00 */ + 0xa571, 0xa572, 0x3472, 0x5549, 0x5548, 0x554a, 0xa573, 0x2f7c, + 0x3e6e, 0x2f7d, 0x554d, 0x445c, 0xa575, 0x3145, 0x554b, 0xa574, + 0x554e, 0x554f, + /* 0x5B40 */ + 0x5552, 0x4f55, 0x5550, 0x5551, 0xa576, 0x3b52, 0x5553, 0xa577, + 0x3926, 0x5554, 0x4f56, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, + 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0xa578, 0x5558, + 0x4239, 0xa579, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, + 0xa57a, 0x4f57, 0xa57b, + /* 0x5B80 */ + 0x555f, 0xa57c, 0x5560, 0xa57d, 0x4270, 0x3127, 0x3c69, 0x3042, + 0x4157, 0x3430, 0x3c35, 0x3928, 0x4f58, 0x4566, 0xa821, 0x3d21, + 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, + 0x406b, 0x3c3c, 0x4d28, 0x5561, 0xa822, 0x355c, 0x3a4b, 0x3332, + 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, + /* 0x5BC0 */ + 0xa824, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, + 0x4959, 0xa826, 0x5567, 0x3428, 0x3677, 0x5566, 0xa827, 0x4f59, + 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, + 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4f5a, 0x4e40, 0x556e, + 0xa82a, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0xa82b, 0x4250, + 0x3c77, + /* 0x5C00 */ + 0x4975, 0x406c, 0xa82d, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, + 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x4f5b, + 0x5575, 0x406d, 0x3e30, 0x4f5c, 0x5576, 0x5577, 0x4f5d, 0x4c60, + 0x5578, 0xa82e, 0x4f5e, 0x3646, 0xa82f, 0x3d22, 0x5579, 0x557a, + 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, + /* 0x5C40 */ + 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, + 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x7e7b, 0x4230, + 0xa831, 0x454b, 0x3c48, 0x4f60, 0xa832, 0x4158, 0x4d7a, 0xa833, + 0xa834, 0xa835, 0x5624, 0x5625, 0x4656, 0xa836, 0x3b33, 0x5627, + 0x5628, 0x4f64, 0xa839, + /* 0x5C80 */ + 0xa83c, 0xa83d, 0x5629, 0x4f65, 0x3474, 0x562a, 0x562b, 0x4f66, + 0xa841, 0x322c, 0xa842, 0x4f67, 0xa843, 0xa844, 0x413b, 0x3464, + 0x4f68, 0x562d, 0x4c28, 0xa846, 0x4252, 0x3359, 0xa847, 0x562f, + 0x5631, 0x345f, 0x4f69, 0x562e, 0x5630, 0x5633, + /* 0x5CC0 */ + 0x5632, 0x5634, 0xa849, 0x4f6a, 0x4f6b, 0x4f6c, 0x5635, 0x463d, + 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4f6d, + 0x4567, 0x5638, 0x3d54, 0x5637, + /* 0x5D00 */ + 0xa84c, 0x3f72, 0x563c, 0x4f70, 0x3a6a, 0xa84d, 0x5642, 0x5643, + 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0xa84f, + 0x5640, 0xa850, 0x5644, 0xa851, 0xa852, 0x4f71, 0x4a78, 0xa84e, + 0xa853, 0xa854, + /* 0x5D40 */ + 0xa855, 0x4f73, 0x4f74, 0x4f76, 0x564b, 0x5648, 0x564a, 0x4d72, + 0x5649, 0x4f75, 0x563f, 0xa857, 0x3f73, 0xa858, 0x564c, 0x4f77, + 0x3a37, 0xa85a, 0x564d, 0x564e, + /* 0x5D80 */ + 0x4f78, 0x5651, 0x5650, 0x564f, 0xa85d, 0x4568, 0x563a, 0x5657, + 0xa85f, 0xa860, 0xa861, 0xa862, 0x5653, 0x4f79, 0x5652, 0x4f7a, + 0x4f7b, 0x5654, 0x5655, 0xa863, 0xa864, 0xa865, 0x5658, 0x4f7c, + 0xa867, 0x4e66, 0x5659, 0x5656, + /* 0x5DC0 */ + 0x565a, 0x4f7d, 0x3460, 0x565b, 0xa868, 0x565d, 0x565c, 0x565e, + 0xa869, 0xa86a, 0x565f, 0x406e, 0x3d23, 0xa86b, 0x3d64, 0x7428, + 0x4163, 0xa86d, 0x3929, 0x3a38, 0x392a, 0x3570, 0xa86e, 0x5660, + 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, + 0x4327, 0x3652, + /* 0x5E00 */ + 0xa870, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0xa872, + 0x7429, 0xa873, 0x4421, 0x742a, 0x5665, 0x5664, 0x5667, 0x446b, + 0xa875, 0x3f63, 0x3b55, 0x404a, 0xa876, 0x4253, 0x3522, 0x4422, + 0x5668, 0x5669, 0x3e6f, 0x4b39, 0xa877, + /* 0x5E40 */ + 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0xa878, 0x4b5a, 0x566d, + 0x566f, 0x4b6b, 0xa87a, 0x566e, 0x742b, 0x742c, 0x5670, 0x4828, + 0x5671, 0x4a3e, 0x5672, 0xa87c, 0xa87d, 0xa87e, 0xac21, 0x3433, + 0x4a3f, 0x472f, 0x5674, 0x5675, 0x7e7c, 0x392c, 0x3434, 0x5676, + 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, + /* 0x5E80 */ + 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, + 0x4539, 0x392e, 0x495c, 0x5679, 0xac23, 0x4559, 0x3a42, 0xac24, + 0x384b, 0xac25, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0xac26, + 0x742d, 0xac27, + /* 0x5EC0 */ + 0x567a, 0x567b, 0x4751, 0xac28, 0x567c, 0x4e77, 0x4f2d, 0x742f, + 0x567e, 0x567d, 0xac29, 0x3347, 0x5721, 0xac2a, 0x5724, 0x5725, + 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, + 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, + 0x7430, 0x377a, 0x3276, 0x4736, 0xac2c, 0x5730, 0x467b, + /* 0x5F00 */ + 0x7431, 0x4a5b, 0x7432, 0x5731, 0x4f2e, 0x7433, 0xac2d, 0x5732, + 0x4a40, 0x5735, 0x5021, 0x5031, 0xac2e, 0x3c30, 0x4675, 0x5736, + 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0xac2f, + 0x7434, 0xac31, 0x446f, 0x7435, 0x4c6f, 0x3839, 0x384c, 0x5738, + 0x5739, 0x573f, 0x3c65, 0x7436, 0x4425, 0x7437, 0x362f, 0x573a, + 0x492b, 0x7438, 0x4346, + /* 0x5F40 */ + 0x7439, 0x573b, 0x743a, 0xac32, 0x573c, 0x3630, 0x573d, 0x573e, + 0x5740, 0x4576, 0x743b, 0x5741, 0x5742, 0x743c, 0x5743, 0x5734, + 0x5733, 0x5744, 0x3741, 0xac33, 0x743d, 0x4927, 0x743e, 0x3a4c, + 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0xac34, 0x5746, + 0x5747, 0x4c72, 0x4860, 0x743f, 0xac35, 0x574a, + /* 0x5F80 */ + 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, + 0x7440, 0x574b, 0x4e27, 0x3865, 0xac36, 0x3d79, 0x574d, 0x454c, + 0x3d3e, 0x4640, 0x5751, 0x5750, 0x7441, 0x574f, 0x5752, 0x3866, + 0xac37, 0xac38, 0x7442, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, + 0x7443, 0x4641, 0x4427, 0x7444, 0x7445, 0xac39, 0x4530, 0x5755, + 0x352b, + /* 0x5FC0 */ + 0x3f34, 0xac3a, 0x492c, 0xac3c, 0x7446, 0xac3d, 0x3477, 0x4726, + 0xac3e, 0xac3f, 0xac40, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, + 0x575b, 0x7447, 0x4369, 0x7448, 0xac41, 0x5758, 0x7449, 0x3277, + 0xac42, 0xac43, 0x582d, 0x575a, 0xac44, 0x4730, 0x5759, 0x5757, + 0xac45, 0x397a, 0x575d, + /* 0x6000 */ + 0x744a, 0x5763, 0x5769, 0x5761, 0x455c, 0x744b, 0x5766, 0x495d, + 0xac47, 0x744c, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, + 0xac48, 0xac49, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, + 0x5767, 0x3631, 0x5764, 0x744d, 0x744e, 0x576a, + /* 0x6040 */ + 0x576c, 0x5776, 0x5774, 0x5771, 0x744f, 0x5770, 0x4e78, 0xac4b, + 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, + 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, + 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0xac4c, + /* 0x6080 */ + 0x577a, 0x577d, 0x5821, 0x3c3d, 0xac4d, 0x5827, 0x4470, 0x577b, + 0x5825, 0x3279, 0xac4e, 0x5823, 0x5824, 0x577e, 0x5822, 0x7451, + 0x7452, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0xac4f, 0x473a, + 0x302d, 0xac51, 0xac52, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, + 0x5829, 0x4569, 0x582e, 0xac53, + /* 0x60C0 */ + 0x3e70, 0x582f, 0x4657, 0xac54, 0x7453, 0x4f47, 0x582b, 0x7454, + 0x7455, 0x5831, 0xac55, 0x397b, 0xac56, 0x404b, 0x7456, 0x3054, + 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0xac57, 0x4246, 0x583d, + 0xac58, 0x415b, 0x5838, 0xac59, 0x5835, 0x5836, 0x7457, 0x3c66, + 0x5839, 0x583c, + /* 0x6100 */ + 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, + 0x3055, 0xac5a, 0xac5b, 0xac5c, 0x5833, 0xac5d, 0x3672, 0x3026, + 0x7458, 0xac5e, 0x3436, 0x583b, 0x5843, 0x5842, 0x7459, 0x5847, + 0x745a, 0x5848, 0x745b, 0xac5f, 0x5846, 0x5849, 0x5841, 0x5845, + /* 0x6140 */ + 0xac61, 0x584a, 0x584b, 0xac62, 0x5840, 0x3b7c, 0x5844, 0x4256, + 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, + 0x5857, 0x5856, 0xac63, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, + 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, + 0x3744, 0x584d, 0xac64, 0x4d5d, + /* 0x6180 */ + 0x4d2b, 0x585c, 0x5860, 0x745d, 0x417e, 0x4e79, 0x5861, 0xac66, + 0xac67, 0x585e, 0x585b, 0xac68, 0xac69, 0x585a, 0x585f, 0x4a30, + 0xac6a, 0x4634, 0xac6b, 0x3746, 0x5862, 0x585d, 0xac6c, 0x5863, + 0x377b, 0x3231, 0x7460, 0x586b, 0x745f, 0x3438, + /* 0x61C0 */ + 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, + 0x586e, 0x327b, 0xac6e, 0xac6f, 0xac70, 0x5870, 0x586f, 0x4428, + 0x5873, 0xac71, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, + 0x5877, 0x5874, + /* 0x6200 */ + 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, + 0x3266, 0x327c, 0x587d, 0xac73, 0x303f, 0x404c, 0x587e, 0x6c43, + 0x5921, 0x3761, 0x5922, 0x7462, 0xac74, 0x406f, 0xac75, 0x5923, + 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, + 0x7463, 0x4b3c, + /* 0x6240 */ + 0x3d6a, 0x5928, 0x7464, 0xac76, 0x4070, 0x6e3d, 0x4862, 0x3c6a, + 0xac77, 0x3a4d, 0x5929, 0xac78, 0xac79, 0x4247, 0x4a27, 0x7465, + 0x4271, 0x7466, 0x592c, 0x592a, 0x592d, 0xac7a, 0x592b, 0xac7b, + 0x592e, 0xac7d, 0x4a31, 0x7467, 0x3037, 0xac7e, 0x495e, 0x4863, + 0xac7c, 0x592f, 0x5932, 0x3e35, + /* 0x6280 */ + 0x353b, 0x5930, 0x5937, 0x3e36, 0x7468, 0x5931, 0x4744, 0x4d5e, + 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0xad21, + 0x5946, 0x4834, 0x4272, 0xad22, 0x4864, 0x5a2d, 0x4a7a, 0x4471, + 0x4b75, 0x593b, 0x3221, 0x436a, + /* 0x62C0 */ + 0x5944, 0x7469, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, + 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, + 0xad23, 0x746a, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, + 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, + 0x594f, 0x3b22, 0x3969, 0x746b, 0xad25, 0x3d26, 0x593d, + /* 0x6300 */ + 0x3b7d, 0x594c, 0xad26, 0x3b58, 0x594d, 0x3044, 0x746c, 0x5948, + 0xad27, 0xad28, 0x4429, 0x746d, 0x3573, 0x3634, 0x594b, 0x3027, + 0x3a43, 0x3f36, 0xad2b, 0xad2c, 0x746e, 0x4472, 0xad2d, 0xad2e, + 0x4854, 0x5951, 0x415e, + /* 0x6340 */ + 0xad2f, 0x746f, 0xad30, 0x422a, 0x3b2b, 0x5952, 0xad31, 0x5954, + 0x5950, 0x4a61, 0x443d, 0xad33, 0x415c, 0x7470, 0x4a7b, 0x3c4e, + 0x5960, 0x595f, 0xad36, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, + 0x4731, 0x7471, + /* 0x6380 */ + 0x5957, 0x415d, 0xad37, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, + 0x4753, 0xad3a, 0x5955, 0x3721, 0xad38, 0x335d, 0x595d, 0x4e2b, + 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, + 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0xad3b, 0x5961, + /* 0x63C0 */ + 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, + 0xad3d, 0xad3e, 0x4d2c, 0x4d48, 0x3439, 0xad3f, 0xad40, 0x302e, + 0x5965, 0x7472, 0x5962, 0xad41, 0xad42, 0x7473, 0x3478, 0xad43, + 0x3167, 0x7474, 0x5968, 0xad3c, 0x4d49, + /* 0x6400 */ + 0x596c, 0xad44, 0x423b, 0x5973, 0x7475, 0x596d, 0x7476, 0x596a, + 0x5971, 0x5953, 0xad45, 0x7477, 0xad46, 0x596e, 0x5972, 0xad47, + 0x4842, 0x456b, 0xad48, 0x596b, 0x596f, 0x3748, 0x3a71, + /* 0x6440 */ + 0x405d, 0x5977, 0x7479, 0x4526, 0xad49, 0xad4a, 0xad4b, 0x747a, + 0x5974, 0x4b60, 0x747b, 0x5975, 0xad4c, 0x5976, 0x4c4e, 0x7478, + 0x4022, 0xad4d, + /* 0x6480 */ + 0x3762, 0xad4e, 0x597d, 0xad4f, 0x3b35, 0x597a, 0x5979, 0x4732, + 0xad50, 0x4635, 0xad51, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, + 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x747d, 0x747e, + /* 0x64C0 */ + 0x4d4a, 0x5a27, 0x7521, 0x5a23, 0x5a24, 0x7522, 0xad52, 0xad53, + 0x4160, 0x747c, 0x7523, 0x5a22, 0x593f, 0xad54, 0xad55, 0x5a26, + 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0xad57, 0xad58, 0x3b24, + 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x7524, + 0x5a34, 0x7525, 0x5a36, 0x3e71, 0xad59, + /* 0x6500 */ + 0x5a35, 0xad5a, 0x5a39, 0xad5c, 0xad5d, 0xad5e, 0x5a37, 0x5a38, + 0x5970, 0xad60, 0x7526, 0x5a3b, 0x5a3a, 0x7527, 0x5978, 0x5a3c, + 0x5a30, 0x3b59, 0xad61, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, + 0x327e, 0x3936, 0x4a7c, 0x402f, + /* 0x6540 */ + 0xad62, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0xad63, 0x5a45, + 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, + 0x4658, 0x7529, 0xad64, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, + 0x495f, 0x5a4b, 0xad65, + /* 0x6580 */ + 0xad66, 0x5a4c, 0x5a4d, 0xad67, 0xad68, 0x4a38, 0x555d, 0x4046, + 0xad69, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, + 0x3c50, 0x752a, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, + 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0xad6a, 0xad6b, 0x5a52, 0xad6c, + 0x4a7d, 0x3177, 0x3b5c, 0xad6d, + /* 0x65C0 */ + 0x5a55, 0xad6e, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0xad6f, 0x407b, + 0x5a57, 0x4232, 0x5a58, 0xad70, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, + 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, + 0x3030, 0x5a5d, 0xad72, 0xad73, 0x3222, 0x5a61, 0xad74, + /* 0x6600 */ + 0x752c, 0x3937, 0x5a60, 0xad75, 0x3a2b, 0x3e3a, 0xad76, 0x752d, + 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x752e, 0x5a66, + 0x752f, 0x4031, 0x3147, 0xad77, 0x7531, 0x7532, 0x3d55, 0x4b66, + 0x3a72, 0xad78, 0x7533, 0x3e3c, 0x4027, 0x7534, 0x7535, 0x7536, + 0x5a65, 0x5a63, 0x5a64, 0x7530, 0x436b, 0x5b26, + /* 0x6640 */ + 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0xad79, 0x7538, 0x5a69, 0x3f38, + 0x7539, 0xad7b, 0x5a67, 0xad7a, 0x3b2f, 0xad7e, 0x753b, 0x753c, + 0xae21, 0x5a6c, 0x5a6b, 0x5a70, 0x753d, 0x5a71, 0xae22, 0x5a6d, + 0x753e, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0xae25, 0xae26, 0xae27, + 0xae28, 0x4961, 0x374a, 0x5a72, 0x753f, 0x4032, 0x3e3d, 0x7540, + 0x7541, 0x4352, 0xae29, + /* 0x6680 */ + 0xae2a, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x7542, + 0x5a75, 0xae2b, 0x3d6b, 0xae2c, 0x4348, 0x3045, 0x5a78, 0xae2d, + 0x5a79, 0x7544, 0x442a, 0x4e71, 0x3b43, 0xae2f, 0x4a6b, 0xae30, + 0x7545, 0x4b3d, 0xae31, 0x5b22, 0x5a7b, 0x7546, 0x5a7e, 0x5a7d, + 0xae33, + /* 0x66C0 */ + 0x5a7a, 0x5b21, 0x7547, 0x465e, 0x7548, 0x5a7c, 0x5b23, 0x3d6c, + 0x5b24, 0x754a, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x754b, 0x5b28, + 0xae35, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, + 0x4162, 0x754c, 0x7537, 0x5258, 0x413e, 0x413d, 0x4258, + /* 0x6700 */ + 0x3a47, 0xae37, 0x5072, 0xae38, 0x376e, 0x4d2d, 0x4a7e, 0x497e, + 0x5b2c, 0xae39, 0x754d, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0xae3b, + 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, + 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x754f, 0x4b51, 0x5b34, + 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, + /* 0x6740 */ + 0x5b35, 0x5b38, 0x7551, 0x7552, 0x3f79, 0xae3e, 0xae3f, 0x4d7b, + 0x3049, 0x3a60, 0x423c, 0x3c5d, 0xae40, 0x3e73, 0x5b3b, 0x454e, + 0xae41, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, + 0x4d68, 0x7550, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, + 0x5a62, 0xae45, 0x354f, 0xae46, 0x4747, 0x7553, 0x5b41, 0x3e3e, + 0x4844, + /* 0x6780 */ + 0x7554, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0xae48, + 0x7555, 0x4b6d, 0x4e53, 0x7556, 0x4b67, 0x7557, 0x324c, 0x3b5e, + 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0xae4c, 0xae4d, + 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x7558, + /* 0x67C0 */ + 0x755a, 0x4248, 0xae4e, 0x4a41, 0x5b56, 0xae4f, 0x4922, 0x5b55, + 0x4770, 0x4b3f, 0x343b, 0xae50, 0x4077, 0x3d40, 0x755b, 0x4453, + 0xae51, 0x4d2e, 0xae52, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, + 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0xae53, 0x436c, 0x4c78, 0x3c46, + 0x3a74, 0xae54, 0x7559, 0x3a3a, 0x755c, 0x4b6f, 0x3341, + /* 0x6800 */ + 0x755d, 0x444e, 0x464a, 0x3149, 0xae4b, 0x4072, 0x4034, 0x372a, + 0xae58, 0x755f, 0x5b59, 0xae59, 0x393b, 0x337c, 0x5b5b, 0x3374, + 0x5b61, 0x7560, 0xae5a, 0x7561, 0x5b5e, 0xae5c, 0x4073, 0x334b, + 0x3a2c, 0xae5d, 0x334a, 0x3a4f, 0xae5e, + /* 0x6840 */ + 0x5b5c, 0x3765, 0x374b, 0x456d, 0xae5f, 0xae60, 0x5b5a, 0x3046, + 0xae61, 0xae62, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x755e, 0x343c, + 0x354b, 0xae63, 0xae64, 0x5b62, 0x7562, 0x3a79, 0x4b71, 0x3b37, + 0x5b63, 0x4930, 0xae66, 0xae67, 0x7563, 0x5b6f, 0x7564, 0x3233, + 0x5b64, 0xae68, 0xae69, 0x5b75, 0x5b65, + /* 0x6880 */ + 0x4e42, 0xae6a, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0xae6b, 0x3034, + 0x5b69, 0xae6c, 0x393c, 0xae6e, 0xae6f, 0xae70, 0x5b6b, 0xae71, + 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x7566, 0x7567, 0x546d, 0x3868, + 0x4d7c, 0xae72, 0xae73, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x7568, + 0x5b60, 0xae74, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0xae75, 0x456e, + /* 0x68C0 */ + 0xae7a, 0x347e, 0xae7b, 0x5c32, 0x7569, 0x4c49, 0x5b77, 0x347d, + 0xae7c, 0x5b7e, 0xae7d, 0x756a, 0x4b40, 0x5c21, 0x5c23, 0xae7e, + 0x5c27, 0x5b79, 0xaf21, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, + 0xaf22, 0xaf23, 0x5c22, 0x756b, 0xaf24, 0x756c, 0x3f39, 0x5c2c, + 0x756d, 0x756e, 0x4033, 0xaf25, 0x5c2a, 0x343d, 0xae76, 0x756f, + /* 0x6900 */ + 0x4f50, 0x5b76, 0xaf26, 0x5c26, 0x3058, 0xaf27, 0x5b78, 0x7570, + 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, + 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, + 0x5c2e, 0x5c3f, 0x464e, 0x7573, 0x5c24, 0x5c3b, 0xaf2b, 0x5c3d, + 0x4458, + /* 0x6940 */ + 0x7574, 0xaf2d, 0x7571, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x7575, + 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, + 0x7576, 0x7577, 0x7578, 0xaf2e, 0x5c44, 0x5c37, 0xaf2f, 0x3648, + 0x5c3a, 0x3d5d, 0xaf30, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, + 0x5c33, 0xaf31, 0x4f30, 0x335a, 0x5c39, 0xaf32, + /* 0x6980 */ + 0x7579, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0xaf33, 0x4f31, + 0x5c57, 0xaf35, 0xaf36, 0x3f3a, 0x5c56, 0x5c55, 0x757b, 0xaf37, + 0x5c52, 0x757c, 0x5c46, 0xaf38, 0x5c63, 0x5c45, 0x5c58, 0xaf39, + 0xaf3a, 0x5c50, 0xaf3b, 0x5c4b, 0x5c48, + /* 0x69C0 */ + 0xaf3c, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, + 0x5c4c, 0x757d, 0x5c47, 0xaf3d, 0x5c4a, 0xaf3e, 0x4d4d, 0x4b6a, + 0x5c4f, 0x5c59, 0x7622, 0xaf44, 0x5c61, 0x5c5a, 0x7623, 0x7624, + 0x5c67, 0x5c65, 0xaf45, 0xaf46, 0x5c60, 0xaf47, 0xaf49, 0x7625, + 0x7626, 0x5c5f, 0x4450, 0x4165, 0xaf4a, 0x5c5d, + /* 0x6A00 */ + 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x7627, 0xaf4b, 0x5c69, + 0x5c6c, 0x5c66, 0x7628, 0x4374, 0x4938, 0xaf4c, 0x5c5c, 0xaf4d, + 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, + 0x5c53, 0xaf41, 0xaf4f, 0xaf50, 0xaf51, 0x3e41, 0x5c70, 0x5c77, + 0x3c79, 0x3372, 0x762a, 0x432e, 0x762b, 0xaf52, + /* 0x6A40 */ + 0x5c6d, 0x762c, 0xaf53, 0x5c72, 0x5c76, 0xaf54, 0x3636, 0xaf56, + 0x762d, 0xaf57, 0x762e, 0x354c, 0x5c74, 0x762f, 0x3521, 0x464b, + 0x5c73, 0xaf58, 0x5c75, 0x7630, 0x5c6f, 0x7631, 0x5c71, 0xaf55, + 0xaf5a, 0x3360, + /* 0x6A80 */ + 0x4349, 0xaf5b, 0x5c7c, 0x7633, 0xaf5c, 0x5c7a, 0x3869, 0x5c79, + 0xaf5e, 0x7634, 0x5d21, 0x5b58, 0x7635, 0x7636, 0xaf5f, 0x5c7b, + 0xaf60, 0x5c7d, 0x5c7e, 0x7637, 0x5d2c, 0xaf62, 0x5d28, 0x5b6d, + 0x5d27, 0x5d26, 0x5d23, 0xaf63, + /* 0x6AC0 */ + 0x5c6a, 0x5d25, 0x5d24, 0xaf64, 0xaf66, 0x5d2a, 0x4f26, 0xaf65, + 0x5d2d, 0x367b, 0xaf67, 0xaf68, 0x5d29, 0x5d2b, 0x7638, 0x7639, + 0x4827, 0x5d2e, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0x5d32, 0x5d2f, + 0xaf6f, + /* 0x6B00 */ + 0x4d73, 0x5d30, 0x5c5e, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0x5d33, + 0x5d34, 0xaf76, 0x763c, 0x3135, 0x763d, 0x5d36, 0x3767, 0x3c21, + 0x3655, 0x3224, 0x763e, 0xaf78, 0x4d5f, 0x763f, 0x5d38, 0x5d37, + 0x5d3a, 0x353d, 0x3656, 0x343e, + /* 0x6B40 */ + 0x5d3d, 0x7640, 0x5d3c, 0x5d3e, 0xaf79, 0x324e, 0x4337, 0x5d3f, + 0x343f, 0x5d41, 0x7641, 0xaf7a, 0x5d40, 0x5d42, 0x5d43, 0x7642, + 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x7643, 0x4970, 0x7644, 0x4a62, + 0x4f44, 0xaf7b, 0x3b75, 0x3a50, 0x4e72, 0xaf7c, 0x7645, 0x5d45, + 0x5d46, 0xaf7d, 0x3b60, 0x5d47, + /* 0x6B80 */ + 0x5d48, 0xaf7e, 0x7646, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, + 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0xee21, 0x5d4e, 0x5d4f, + 0x7647, 0x5d50, 0x5d51, 0x7648, 0xee22, 0x5d52, 0x5d54, 0x5d53, + 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0xee24, + 0xee25, 0x4542, + /* 0x6BC0 */ + 0x544c, 0x3523, 0x5d58, 0xee26, 0xee27, 0xee28, 0x5d59, 0x4a6c, + 0x4b68, 0x764a, 0x4647, 0x5d5a, 0x4866, 0x764b, 0x764c, 0x487b, + 0xee29, 0x4c53, 0x5d5b, 0xee2a, 0xee2b, 0x5d5d, 0x5d5c, 0xee2c, + 0x5d5f, 0xee2d, 0x5d5e, 0x764d, + /* 0x6C00 */ + 0xee2e, 0x764e, 0x5d61, 0xee2f, 0xee30, 0x3b61, 0x764f, 0x4c31, + 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x7650, 0x3f65, + 0xee31, 0xee32, 0x4939, 0x314a, 0xee33, 0x4845, 0xee35, + /* 0x6C40 */ + 0x4475, 0x3d41, 0x3561, 0xee36, 0x4846, 0x3c2e, 0x5d68, 0x3440, + 0x7651, 0x3178, 0xee37, 0x7652, 0x4672, 0x5d67, 0x393e, 0x4353, + 0x5d69, 0xee4f, 0x5d71, 0x5d6a, 0xee38, 0x4241, 0x3562, 0x5d72, + 0x7654, 0x7655, 0x3768, 0x3525, 0x5d70, + /* 0x6C80 */ + 0x5d6e, 0x5d6b, 0x4d60, 0xee39, 0x7656, 0x7657, 0x4440, 0xee3a, + 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0xee3c, 0xee3d, 0x322d, + 0xee3e, 0x7658, 0x3a3b, 0x5d6d, 0x5d6f, 0x7659, 0x4b57, 0x4274, + 0x7653, 0x4b77, 0xee3f, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, + 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, + /* 0x6CC0 */ + 0x3637, 0xee40, 0x5d75, 0x5d7a, 0x765b, 0x4074, 0x4771, 0x4867, + 0xee41, 0x5d77, 0x765c, 0x4b21, 0xee43, 0x5d79, 0x5e24, 0xee44, + 0x5e22, 0xee45, 0x5d7b, 0x765d, 0x4b22, 0x4748, 0x3563, 0x4525, + 0x436d, 0xee46, 0x5e25, 0x765e, 0xee47, 0xee48, 0x765f, 0x5e23, + 0x4259, 0x5d76, 0x314b, 0x765a, + /* 0x6D00 */ + 0xee4a, 0x7661, 0xee4b, 0x4d4e, 0x5e30, 0x7662, 0x5e2f, 0x4076, + 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0xee4c, 0x4445, 0xee4d, 0xee4e, + 0x314c, 0x393f, 0x5e29, 0x7663, 0xee50, 0x7664, 0x3d27, 0x5e2e, + 0xee65, 0x5e2d, 0x5e28, 0x5e2b, 0x7665, 0x3368, 0xee51, 0x5e2a, + 0x4749, 0x7666, + /* 0x6D40 */ + 0x4e2e, 0x3e74, 0x4075, 0x7667, 0x5e36, 0x5e34, 0xee52, 0x494d, + 0xee53, 0xee54, 0x5e31, 0x5e33, 0x7668, 0x313a, 0x3940, 0x4f32, + 0x333d, 0x4962, 0xee55, 0x4d61, 0x3324, 0x3f3b, 0x5e35, + /* 0x6D80 */ + 0xee56, 0xee57, 0x766a, 0x5e3a, 0x766b, 0x3e43, 0x766c, 0xee58, + 0x4d30, 0xee59, 0x5e37, 0xee5a, 0x5e32, 0x766d, 0x5e38, 0xee5b, + 0x4e5e, 0x4573, 0x4642, 0x766e, 0xee61, 0x766f, 0xee62, 0x3336, + 0x3155, 0xee63, 0x5e3e, 0x5e41, 0x4e43, 0x7670, + /* 0x6DC0 */ + 0x4d64, 0xee64, 0x7671, 0x5e48, 0x5e42, 0x5e3f, 0xee66, 0x4e54, + 0x5e45, 0xee67, 0xee68, 0xee69, 0x3d4a, 0x5e47, 0x5e4c, 0x7672, + 0x4571, 0x5e4a, 0x7673, 0x7674, 0x7675, 0x5e44, 0xee6a, 0x4338, + 0x5e4b, 0x5e40, 0x5e46, 0xee6b, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, + 0x3f3c, 0x3d5f, 0x4a25, 0xee6c, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, + 0x7676, + /* 0x6E00 */ + 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, + 0xee5d, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0xee6e, 0x5e5b, 0x3574, + 0x454f, 0xee6f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0xee70, 0x3239, + 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0xee72, 0x7678, 0xee6d, + 0x5e62, 0x5e5d, 0xee73, 0x5e55, + /* 0x6E40 */ + 0x5e5c, 0x7679, 0xee74, 0xee75, 0x4c2b, 0xee76, 0xee77, 0x5e5a, + 0x5e5e, 0xee78, 0xee79, 0xee7a, 0xee7b, 0x3850, 0xee7c, 0x3e45, + 0x4339, 0x767a, 0x767b, 0x5e54, 0xee7d, 0x4d2f, 0x5e57, 0x5e50, + 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, + /* 0x6E80 */ + 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0xef21, 0x3d60, 0x5e65, + 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0xef22, 0x5e64, 0x767c, + 0x5e6a, 0x767d, 0x5e6c, 0xef23, 0x4d4f, 0x5e67, 0x452e, 0x5e69, + 0xef24, + /* 0x6EC0 */ + 0x767e, 0x5e71, 0xef25, 0x5e6b, 0x4c47, 0x7721, 0x5e66, 0xef26, + 0x3c22, 0x5e7e, 0x7722, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0xef27, + 0x426c, 0x425a, 0xef29, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, + 0x5e77, 0xef2a, 0xef2b, 0x5e78, 0x5e60, + /* 0x6F00 */ + 0x3579, 0x493a, 0x3c3f, 0x3977, 0xef2c, 0xef2d, 0x4f33, 0x7723, + 0x5e74, 0x5f22, 0x3169, 0x4166, 0xef2e, 0x7724, 0x4779, 0x3441, + 0x4e7a, 0xef2f, 0x7726, 0x4c21, 0x4452, 0x7727, 0x5e7b, 0x5e7d, + 0x7728, 0xef28, 0xef30, 0x4132, 0xef31, 0x5f21, 0x5e79, + /* 0x6F40 */ + 0x5e73, 0x3443, 0x7729, 0xef33, 0x3769, 0xef34, 0x5f2f, 0x772a, + 0xef35, 0x5f2a, 0x4078, 0x772b, 0x3363, 0xef36, 0x772c, 0x772d, + 0x3d61, 0x5f33, 0xef37, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, + 0x5f26, 0x5f25, 0x5f2e, 0xef39, 0x772e, + /* 0x6F80 */ + 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x772f, 0x7730, 0x7731, + 0x5f30, 0xef3a, 0x5f31, 0x7732, 0xef3b, 0x3442, 0xef38, 0xef3d, + 0x7733, 0x5f36, 0x5f35, 0x5f37, 0xef3e, 0x7734, 0x5f3a, 0xef3f, + 0x4543, 0x5f34, 0xef41, 0x7735, 0x5f38, 0x7736, 0xef3c, + /* 0x6FC0 */ + 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x7737, 0xef42, 0xef43, + 0x7738, 0x5f3e, 0x5f3c, 0x5f3f, 0xef44, 0x5f42, 0xef45, 0x5f3b, + 0x396a, 0x4728, 0x5e39, 0xef46, 0x4d74, 0x5f3d, 0x5f41, 0x4275, + 0x773a, 0x5f40, 0x5f2b, 0x773b, 0x6f69, 0x7739, 0x5f45, 0xef48, + 0x5f49, + /* 0x7000 */ + 0xef49, 0x5f47, 0x773c, 0x773d, 0xef4a, 0x5f43, 0xef4b, 0x5f44, + 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, + 0x5f4f, 0xef4c, 0x4375, 0x426d, 0x773e, 0x4025, 0x5f50, 0x5f52, + 0xef4e, 0xef4f, 0xef50, 0x5f51, + /* 0x7040 */ + 0xef51, 0xef52, 0x773f, 0xef53, 0x5e75, 0x7742, 0x5f53, 0xef55, + 0x4667, 0x7740, 0x7741, 0x5f54, 0x7743, 0xef56, 0xef57, 0x3250, + 0xef58, 0xef59, 0x4574, 0x3325, 0x7744, 0xef5a, 0x3564, 0x3c5e, + 0x3a52, 0xef5b, + /* 0x7080 */ + 0xef5c, 0x7745, 0xef5d, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0xef5e, + 0xef5f, 0x5f55, 0xef62, 0x7746, 0x7747, 0x5f59, 0x433a, 0x5f5c, + 0x5f57, 0xef63, 0x5f5b, 0x7748, 0x5f5a, 0x4540, 0x3059, 0xef60, + /* 0x70C0 */ + 0x4e75, 0xef66, 0x5f5e, 0x3128, 0xef67, 0xef68, 0x7749, 0x774a, + 0x5f60, 0xef69, 0x5f5f, 0x5f5d, 0x774b, 0xef65, 0x5f58, 0x4b23, + 0x5f62, + /* 0x7100 */ + 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0x5f61, 0xef6f, 0x774c, + 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x774e, 0x774f, 0x4c35, 0x3e47, + 0x774d, 0x7750, 0xef71, 0x7751, 0xef72, 0x4133, 0x3e46, + /* 0x7140 */ + 0x7752, 0x7753, 0x4e7b, 0xef74, 0x5f6a, 0x4079, 0xef73, 0x7754, + 0x7756, 0xef75, 0x5f66, 0x5f6b, 0x316c, 0x7757, 0xef76, 0x7758, + 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x7759, 0x4851, 0x5f6c, + 0x3c51, 0x407a, + /* 0x7180 */ + 0xef79, 0x5f6f, 0x775b, 0x775c, 0x5f67, 0x3727, 0x5f6d, 0x775d, + 0x4d50, 0x5f70, 0xef78, 0x7426, 0xef7a, 0x3d4f, 0xef7b, 0xef7c, + 0x5f71, 0x5f72, 0xef7d, 0xef7e, 0x472e, 0xf021, 0x5f74, 0x775f, + 0x5f75, + /* 0x71C0 */ + 0x775e, 0x4733, 0x7760, 0x4575, 0x5f77, 0xf023, 0x5f79, 0x4e55, + 0x5f76, 0xf024, 0x5f78, 0x316d, 0x5f73, 0xf025, 0xf026, 0x535b, + 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, + 0x6021, 0x5f6e, 0x5f7e, 0x7761, 0x6022, + /* 0x7200 */ + 0x7762, 0x477a, 0xf027, 0x6023, 0x6024, 0x7763, 0x6025, 0x6026, + 0x445e, 0xf02a, 0x6028, 0x6027, 0x6029, 0x602a, 0xf02b, 0x3c5f, + 0x4963, 0xf02c, 0xf02d, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, + 0x602d, + /* 0x7240 */ + 0x602e, 0xf02f, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, + 0xf030, 0x7764, 0x7765, 0xf031, 0x6031, 0x3267, 0x356d, 0x4c46, + 0x4c36, 0x3234, 0x4f34, 0xf032, 0x4b52, 0x4a2a, 0xf034, 0xf035, + 0x4037, 0x6032, 0xf036, 0x4643, 0x3823, 0x6033, 0xf037, + /* 0x7280 */ + 0x3a54, 0x6035, 0x6034, 0x6036, 0x7767, 0xf038, 0x6037, 0x6038, + 0x7768, 0x353e, 0x6039, 0x603a, 0x3824, 0xf03a, 0xf03b, 0x4848, + 0xf03c, 0xf03d, 0x603c, 0x3e75, 0x603b, 0x7769, + /* 0x72C0 */ + 0x776a, 0xf03e, 0x3638, 0x603d, 0x603f, 0x603e, 0xf040, 0x6040, + 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, + 0x3c6d, 0x4648, 0x3639, 0xf043, 0x6046, 0x432c, 0x6045, 0xf044, + 0x776b, 0x4f35, 0x4762, + /* 0x7300 */ + 0xf045, 0x6049, 0xf046, 0x604b, 0x6048, 0xf047, 0xf048, 0x4c54, + 0x604a, 0x604c, 0x4e44, 0x6050, 0x776d, 0x776e, 0x604f, 0x4376, + 0x472d, 0xf04b, 0x3825, 0x604e, 0xf04c, 0xf04d, 0x604d, 0x4d31, + 0x4d32, 0xf04a, 0xf04e, 0x6051, 0x316e, + /* 0x7340 */ + 0x3976, 0x3b62, 0x6052, 0x6053, 0x7770, 0xf04f, 0x6055, 0x3d43, + 0x7771, 0x6057, 0x6056, 0xf051, 0xf052, 0xf054, 0xf055, 0x6058, + 0xf056, 0x334d, 0x605a, 0xf057, 0x6059, 0x605c, 0x605b, 0x7772, + /* 0x7380 */ + 0xf058, 0x383c, 0xf059, 0x4e28, 0x364c, 0xf05a, 0x3226, 0xf05b, + 0x7773, 0x366a, 0xf05c, 0xf05d, 0xf05e, 0x7774, 0x7775, 0x7776, + 0xf05f, 0x7777, 0xf060, 0x3461, 0x7778, 0x4e68, 0x605e, 0xf061, + 0xf062, 0xf063, 0x6060, 0xf064, 0xf065, + /* 0x73C0 */ + 0x6061, 0x3251, 0xf066, 0x605d, 0x7779, 0x3b39, 0xf067, 0x4441, + 0x605f, 0x777a, 0x777b, 0x777c, 0x6064, 0x3c6e, 0xf068, 0x777d, + 0x6062, 0xf069, 0x777e, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, + 0xf06a, 0xf06c, 0x383d, + /* 0x7400 */ + 0xf06d, 0x3565, 0x6066, 0x4d7d, 0x7821, 0x4e30, 0x7822, 0xf06b, + 0x7823, 0x7824, 0x4276, 0xf06e, 0x6068, 0x7826, 0x7827, 0x7828, + 0x7829, 0x782a, 0x782b, 0x782c, 0x782d, 0xf06f, 0x606a, 0x4e56, + 0x3657, 0x487c, 0x474a, 0xf070, 0x606b, 0x606d, + /* 0x7440 */ + 0xf072, 0x6070, 0xf073, 0x782e, 0x782f, 0x7830, 0x7831, 0xf074, + 0xf075, 0xf071, 0x606c, 0x7832, 0x606f, 0x386a, 0x314d, 0x6071, + 0xf076, 0x3f70, 0x606e, 0x4e5c, 0x7833, 0x6074, 0x7424, 0x6072, + 0x6075, 0x7834, 0x7835, 0x6067, 0x6073, 0xf077, 0x3a3c, 0x6076, + 0x6077, + /* 0x7480 */ + 0xf078, 0x4d7e, 0xf079, 0x7836, 0x7837, 0xf07a, 0x7838, 0x6078, + 0x783d, 0xf07c, 0xf07d, 0x7839, 0xf07e, 0x783a, 0x6079, 0x783b, + 0xf121, 0xf122, 0x6065, 0x783c, 0xf123, 0x783e, 0x607a, 0x783f, + 0x7840, 0xf124, 0xf125, 0x3444, 0x7841, 0xf126, 0xf128, 0xf127, + 0x3c25, 0x7842, + /* 0x74C0 */ + 0x7843, 0x7844, 0x607b, 0x607c, 0x607d, 0xf129, 0xf12a, 0x7845, + 0x313b, 0xf12b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, + 0xf12d, 0x6125, 0xf12c, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, + 0x6129, 0xf12f, 0x7846, + /* 0x7500 */ + 0x7847, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, + 0x6132, 0x6131, 0x7848, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, + 0xf131, 0x3b3a, 0xf132, 0x3179, 0x6134, 0x4d51, 0xf133, 0x4a63, + 0x6135, 0x7849, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, + 0x442e, 0x3268, 0x6136, 0xf136, 0xf137, + /* 0x7540 */ + 0xf138, 0x6137, 0x613c, 0xf139, 0x613a, 0x6139, 0x5a42, 0x3326, + 0x6138, 0xf13a, 0x305a, 0xf13b, 0x482a, 0xf13c, 0x484a, 0x4e31, + 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, + 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0xf13d, 0x6142, 0x784a, + 0x305b, 0xf13f, 0xf13e, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, + 0x784b, 0xf140, 0xf141, 0xf142, 0x3526, + /* 0x7580 */ + 0xf143, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0xf145, + 0x4142, 0x4141, 0x353f, 0x784c, 0x614b, 0x614c, 0x614d, 0xf147, + 0x614f, 0x614e, 0x3156, 0xf149, 0x6157, 0x4868, 0x6151, 0x6153, + 0xf14a, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0xf14b, + /* 0x75C0 */ + 0xf14c, 0x6150, 0x6152, 0x4942, 0xf14d, 0x3e49, 0x6159, 0x6158, + 0x784e, 0xf14e, 0x615a, 0xf14f, 0x3c26, 0x3a2f, 0x4577, 0x615b, + 0x444b, 0xf150, 0x615d, 0xf151, 0xf152, 0x4e21, 0x615c, 0x784f, + 0xf153, 0x4169, 0xf154, 0xf155, 0x6162, 0xf156, 0x6164, 0x6165, + 0x4354, 0xf157, 0x6163, 0x6160, 0x615e, 0x615f, + /* 0x7600 */ + 0x7850, 0x6161, 0x7851, 0xf158, 0xf15a, 0x7852, 0x6168, 0x6166, + 0x6167, 0xf15b, 0xf15e, 0x7853, 0x7854, 0xf159, 0x7855, 0xf15f, + 0xf160, 0x7856, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0xf162, + 0x7e7d, 0x616a, 0xf163, 0x7857, 0x6170, 0xf165, 0x616f, 0x7858, + 0x6171, 0xf164, + /* 0x7640 */ + 0xf168, 0x4e45, 0x7859, 0x6174, 0x6172, 0x6173, 0xf16a, 0x785a, + 0x3462, 0x4c7e, 0xf16b, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, + 0x785b, 0x785c, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x785d, + 0xf16d, 0x785e, 0x617e, 0x785f, 0x6221, 0x6222, 0x6223, 0x482f, + 0x4550, 0x6224, 0x4772, 0x4934, + /* 0x7680 */ + 0x6225, 0x7860, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, + 0x6229, 0x3b29, 0x622b, 0xf16e, 0x622a, 0x622c, 0x622d, 0x7861, + 0xf16f, 0x7862, 0x7863, 0xf171, 0xf170, 0x7864, 0xf172, 0xf173, + 0x7865, 0x4869, 0xf174, 0x622e, 0x622f, 0x7866, 0x7369, 0x6230, + 0x6231, 0x6232, 0x3b2e, + /* 0x76C0 */ + 0x6233, 0x4756, 0x7867, 0x4b5f, 0x314e, 0xf176, 0x3157, 0x7868, + 0x6234, 0x7869, 0x6236, 0x786a, 0x6235, 0x4570, 0x4039, 0x5d39, + 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x786b, 0x623a, + 0xf178, 0x623b, 0xf179, 0x4c5c, 0x786c, 0x4c55, 0x443e, 0x416a, + 0x623d, 0x786d, 0x3d62, + /* 0x7700 */ + 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x786e, 0x3447, 0x3829, + 0xf17b, 0x786f, 0xf17c, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, + 0x6244, 0x6245, 0x6241, 0xf17d, 0x7870, 0xf17e, 0x7871, 0x6247, + 0x6248, 0x442f, 0x3463, + /* 0x7740 */ + 0x4365, 0x7872, 0x6249, 0x7873, 0x7874, 0xf225, 0x624a, 0x624d, + 0x7875, 0x7876, 0xf226, 0x3f67, 0x7877, 0x4644, 0x624e, 0x4b53, + 0x624b, 0xf227, 0x624c, 0xf229, 0x6251, 0x7878, 0xf22a, 0xf22b, + 0x6250, 0x624f, + /* 0x7780 */ + 0x7879, 0x6253, 0x6252, 0x6254, 0x787a, 0xf22e, 0x6256, 0xf22f, + 0x6255, 0xf230, 0xf231, 0x4a4d, 0xf232, 0x787b, 0x3d56, 0x4e46, + 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, + /* 0x77C0 */ + 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0xf233, 0xf234, + 0x787c, 0x4c70, 0x6263, 0xf235, 0x434e, 0xf236, 0x476a, 0x366b, + 0xf237, 0xf238, 0x433b, 0x6264, 0x363a, 0xf23a, 0x4050, 0xf23b, + 0xf23c, 0x6265, + /* 0x7800 */ + 0x3a3d, 0xf23e, 0xf23f, 0xf240, 0x6266, 0xf241, 0x6267, 0x3826, + 0x3a55, 0xf242, 0x6269, 0xf243, 0x4556, 0x3a56, 0x354e, 0xf244, + 0x787d, 0x4b24, 0x474b, 0x4557, 0x395c, + /* 0x7840 */ + 0x7921, 0x626b, 0xf245, 0x7922, 0x7923, 0x7924, 0x3e4b, 0xf246, + 0x7925, 0xf247, 0x4e32, 0x3945, 0x7926, 0x3827, 0x4823, 0x626d, + 0x626f, + /* 0x7880 */ + 0x386b, 0x626e, 0x4476, 0xf249, 0x6271, 0x3337, 0x626c, 0x486a, + 0x3130, 0xf24a, 0x3a6c, 0x4f52, 0x6270, 0xf24c, 0xf24d, 0xf24e, + 0x6272, 0xf24b, 0x4a4b, 0x4059, 0x6274, 0x792a, 0x6275, 0x7928, + 0x6273, 0x334e, 0xf24f, 0x627b, 0x627a, + /* 0x78C0 */ + 0x3c27, 0x627c, 0x6277, 0xf250, 0x627d, 0x6278, 0xf251, 0xf252, + 0x4858, 0x6276, 0x6279, 0xf253, 0x6322, 0xf254, 0xf255, 0x792b, + 0xf256, 0x6321, 0x4b61, 0x627e, 0x306b, 0x792c, 0x6324, 0x792e, + 0xf257, 0xf258, 0xf259, 0x6323, 0xf25a, + /* 0x7900 */ + 0x792d, 0x3e4c, 0x6325, 0x4143, 0xf25c, 0x6327, 0x6326, 0x6328, + 0xf25d, 0x792f, 0xf25f, 0x6268, 0x626a, 0x632a, 0x6329, 0x7930, + 0xf25e, 0x7931, 0x7932, 0x3c28, 0xf260, 0x4e69, 0x3c52, + /* 0x7940 */ + 0x632b, 0x3737, 0x7935, 0x7936, 0x3540, 0x3527, 0x3b63, 0xf261, + 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0xf262, 0x632f, 0xf263, + 0x793a, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0xf265, + 0x493c, 0x3a57, 0xf266, 0x4578, 0x793e, 0x6332, 0x6333, + /* 0x7980 */ + 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, + 0xf267, 0xf268, 0xf269, 0x7942, 0xf26a, 0x6335, 0xf26b, 0x357a, + 0x6336, 0xf26c, 0x6338, 0x6339, 0x4729, 0x7943, 0x633a, 0xf26d, + 0x7944, 0x633b, 0x633c, 0xf26e, 0x3659, 0x3253, 0x4645, + /* 0x79C0 */ + 0x3d28, 0x3b64, 0xf26f, 0xf270, 0x7945, 0x633d, 0x7946, 0x3d29, + 0xf271, 0xf272, 0x324a, 0x4943, 0x7948, 0x633e, 0xf273, 0x486b, + 0x7949, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, + 0x794a, 0x6340, 0x794b, 0x3e4e, 0x305c, + /* 0x7A00 */ + 0x3529, 0x794c, 0x6343, 0xf278, 0x4478, 0x6344, 0x4047, 0xf279, + 0x4c2d, 0xf27a, 0x4923, 0x6345, 0x6346, 0x4355, 0xf27b, 0x4e47, + 0xf27c, 0x6348, 0x6347, 0xf27e, 0x3c6f, 0x634a, 0x3070, 0x634d, + 0xf321, 0x794e, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, + /* 0x7A40 */ + 0x3972, 0x4a66, 0x634e, 0x4b54, 0xf322, 0x6350, 0xf323, 0x4051, + 0x314f, 0x323a, 0x302c, 0xf324, 0x634f, 0xf325, 0xf326, 0x794f, + 0xf327, 0xf328, 0x6351, 0x6352, 0x3e77, 0xf329, 0x6353, 0xf32a, + 0x334f, 0x7950, 0x6355, 0x376a, 0xf32b, 0x3566, 0xf32c, 0x6356, + 0x3675, 0x6357, 0x407c, + /* 0x7A80 */ + 0x464d, 0xf32d, 0x4060, 0x3a75, 0x7952, 0x6358, 0xf32e, 0xf32f, + 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x7953, + 0xf330, 0x635d, 0x3726, 0xf331, 0x3567, 0x4d52, 0x635f, 0x7955, + 0x6360, 0xf334, 0x312e, 0x7956, 0xf335, 0xf336, 0x6363, + /* 0x7AC0 */ + 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0xf338, + 0x6367, 0x7957, 0x6368, 0xf339, 0x5474, 0x636a, 0x6369, 0x636b, + 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, + 0x4638, 0x6370, 0xf33a, 0xf33b, 0x4328, 0x7958, 0x6371, 0x433c, + 0x6372, 0xf33c, 0x3625, 0x513f, 0x435d, 0x3c33, 0x7959, 0x3448, + /* 0x7B00 */ + 0x6373, 0x6422, 0x6376, 0xf33f, 0x3568, 0x6375, 0x6424, 0x6374, + 0x3e50, 0x795a, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, + 0x4964, 0xf342, 0x637c, 0xf343, 0x4268, 0x795b, 0xf344, 0xf345, + 0xf346, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x795c, 0xf341, + /* 0x7B40 */ + 0xf34a, 0x6426, 0x492e, 0x795d, 0x4826, 0x4579, 0x365a, 0x6425, + 0x6423, 0x795e, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0xf34c, + 0x3a76, 0x6438, 0x795f, 0xf34e, 0x6428, 0xf34f, 0x642a, 0xf350, + 0x642d, 0x7960, 0x642e, 0x7961, 0x642b, 0x642c, 0x7962, 0xf351, + 0x6429, 0x6427, 0xf34d, 0x6421, 0xf349, + /* 0x7B80 */ + 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0xf354, 0xf355, 0x6436, + 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0xf356, 0x6433, + 0x642f, 0x7963, 0x6431, 0x3449, 0x433d, 0x407d, 0xf358, 0x4822, + 0x643e, 0xf359, 0x4824, 0xf35a, + /* 0x7BC0 */ + 0x4061, 0x643b, 0x484f, 0xf35b, 0x643f, 0x4a53, 0x435b, 0xf35c, + 0x643a, 0x643c, 0x643d, 0xf35f, 0xf360, 0x7965, 0x7966, 0xf361, + 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0xf362, 0x4f36, + 0xf363, 0x644a, 0x644e, 0x644b, + /* 0x7C00 */ + 0x6447, 0x7967, 0xf364, 0x6448, 0xf365, 0x644d, 0xf366, 0xf367, + 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x7969, 0x6452, 0x796a, + 0x344a, 0x644f, 0xf368, 0x6450, 0x6451, 0x6454, 0x7968, 0x796b, + 0x796c, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, + /* 0x7C40 */ + 0x645a, 0x6457, 0xf369, 0xf36a, 0x6456, 0x4052, 0x6459, 0x645b, + 0xf36b, 0x6458, 0x645f, 0xf36c, 0x645c, 0x796f, 0xf36d, 0x645d, + 0x6446, 0xf36e, 0x645e, 0x6460, 0xf36f, 0x6461, 0x7970, 0xf370, + 0xf371, 0xf372, 0x4a46, 0x6462, 0x7971, 0x4c62, + /* 0x7C80 */ + 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x7972, 0x6464, + 0x4e33, 0x7973, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x7974, + 0x6469, 0x6467, 0x6465, 0x3421, 0xf376, 0x3e51, 0x646a, 0x6468, + 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0xf378, 0xf379, 0x646f, + 0x7975, 0x6470, 0x403a, 0xf37a, + /* 0x7CC0 */ + 0x6471, 0x6473, 0xf37c, 0x6472, 0xf37e, 0x3852, 0xf421, 0x4138, + 0x6475, 0x7976, 0x457c, 0xf423, 0x6474, 0x7977, 0x6476, 0x7978, + 0x4a35, 0x416c, 0x3947, 0x6477, 0xf425, 0x4e48, 0xf426, 0x6479, + 0x647a, 0x647b, 0xf428, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, + /* 0x7D00 */ + 0x352a, 0x6521, 0xf429, 0x4c73, 0x3948, 0x647e, 0x7979, 0x797a, + 0xf42a, 0x6524, 0x4c66, 0x473c, 0x4933, 0xf42c, 0x797b, 0x3d63, + 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x797c, + 0xf42d, 0x4147, 0x4b42, 0x3a77, 0x797d, 0x3b67, 0x445d, 0x6527, + 0x4e5f, 0x3a59, 0x797e, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, + 0xf430, 0xf431, 0x6529, + /* 0x7D40 */ + 0xf432, 0x7a21, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0xf433, + 0x7a22, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x7a23, 0x652d, + 0xf437, 0xf438, 0x6536, 0x7a24, 0x394a, 0x4d6d, 0x303c, 0x6533, + 0x356b, 0x6530, 0xf439, 0x6531, 0xf43a, 0x457d, 0x652f, 0x652c, + 0x3328, 0x4064, 0x3828, 0x7a25, 0x6538, 0xf43c, + /* 0x7D80 */ + 0x7a26, 0xf43e, 0xf43f, 0x6535, 0x7a27, 0xf440, 0x6537, 0x6534, + 0xf441, 0x3751, 0x4233, 0x6539, 0x416e, 0xf443, 0x6546, 0x7a28, + 0x6542, 0x653c, 0x7a29, 0xf444, 0xf445, 0x6540, 0x3c7a, 0x305d, + 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0xf446, + 0xf447, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, + /* 0x7DC0 */ + 0xf448, 0x7a2a, 0x653e, 0x365b, 0x486c, 0x7a2b, 0x416d, 0x4e50, + 0x3d6f, 0x656e, 0x7a2c, 0xf449, 0x6548, 0xf44a, 0x407e, 0x6544, + 0x6549, 0x654b, 0x4479, 0x654e, 0x7a2d, 0x654a, 0xf44b, 0x4a54, + 0x344b, 0x4c4b, 0x305e, 0xf44c, 0x654d, 0x4e7d, 0xf44d, 0x654c, + /* 0x7E00 */ + 0x316f, 0x466c, 0x654f, 0x7a30, 0x6556, 0x6550, 0x6557, 0xf451, + 0x7a31, 0x6553, 0x7a32, 0xf452, 0x477b, 0xf453, 0x3c4a, 0x6555, + 0xf454, 0x6552, 0x6558, 0x6551, 0x3d44, 0xf455, 0x7a2f, 0x4b25, + 0xf456, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, + 0x655b, 0x6541, 0x4053, + /* 0x7E40 */ + 0x484b, 0x655e, 0xf457, 0x6559, 0x7a34, 0x4121, 0x3752, 0x3d2b, + 0x7a35, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, + 0x7a36, 0x655a, 0x6562, 0x656a, 0x6569, 0x7e7e, 0x4b7a, 0x372b, + 0xf458, 0xf459, 0x6568, 0x656c, 0x656b, 0x656f, 0xf45a, 0x6571, + /* 0x7E80 */ + 0x3b3c, 0x656d, 0xf45b, 0xf45c, 0x6572, 0x6573, 0x7a37, 0x6574, + 0x7a38, 0x657a, 0x453b, 0x6576, 0xf45e, 0x6575, 0x6577, 0x6578, + 0x6579, 0xf45f, 0xf460, 0x657b, 0x657c, + /* 0x7F00 */ + 0x344c, 0x657d, 0x657e, 0xf463, 0xf462, 0xf464, + /* 0x7F40 */ + 0xf465, 0xf466, 0x6621, 0x7a39, 0x6622, 0x6623, 0x6624, 0xf467, + 0x6625, 0x6626, 0xf46a, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, + 0xf46c, 0xf46d, 0xf46e, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, + 0xf46f, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, + 0xf470, 0xf471, + /* 0x7F80 */ + 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, + 0x487e, 0xf473, 0x7a3b, 0x6636, 0xf476, 0x7a3c, 0x6639, 0xf477, + 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0xf478, 0x663e, + 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x7a3d, + /* 0x7FC0 */ + 0x3227, 0xf47a, 0x6642, 0x6643, 0x6644, 0x4d62, 0x7a3e, 0xf47b, + 0x3d2c, 0x6646, 0x6645, 0x7a3f, 0x7a40, 0x3f69, 0x6647, 0xf47c, + 0xf47d, 0x6648, 0x6649, 0x3465, 0x7a41, 0x7a42, 0xf47e, 0x344d, + 0xf521, 0x664a, 0x664b, 0x7a43, 0x4b5d, 0x4d63, + /* 0x8000 */ + 0x4d54, 0x4f37, 0xf522, 0x394d, 0x664e, 0x3c54, 0x664d, 0xf524, + 0xf523, 0x664f, 0x3c29, 0xf525, 0x4251, 0xf526, 0x6650, 0x7a45, + 0x394c, 0xf527, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0xf528, + 0x7a46, 0x6655, 0xf529, 0xf52a, 0x3c2a, 0x7a47, 0x4c6d, 0x7a48, + 0x6657, 0x7a49, 0x433f, 0x6656, + /* 0x8040 */ + 0xf52b, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, + 0x665d, 0x416f, 0x665e, 0xf52c, 0x665f, 0x4e7e, 0x6662, 0xf52d, + 0x6661, 0x6660, 0x4430, 0xf52e, 0x6663, 0x3f26, 0x6664, 0xf52f, + 0x6665, 0x4f38, 0x6666, + /* 0x8080 */ + 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, + 0x3e53, 0x492a, 0xf530, 0x666c, 0x666a, 0xf531, 0x344e, 0x3854, + 0x3b68, 0xf532, 0x486e, 0xf533, 0x382a, 0x4b43, 0x666f, 0x666d, + 0x394e, 0x394f, 0x3069, 0x3a68, 0xf534, 0x4759, + /* 0x80C0 */ + 0x305f, 0x6674, 0xf536, 0x4340, 0x7a4a, 0x4758, 0x425b, 0xf537, + 0x6676, 0x7a4b, 0xf538, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, + 0x7a4c, 0x3855, 0x307d, 0x6671, 0xf539, 0x6678, 0x6679, 0x7a4d, + 0x4639, 0xf53c, 0x363b, 0xf53d, 0x6726, 0x473d, + /* 0x8100 */ + 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0xf53b, + 0xf540, 0x7a4e, 0x3553, 0x667a, 0xf541, 0x667c, 0xf543, 0xf544, + 0x667b, 0xf545, 0x667d, 0x4326, 0x473e, 0xf53f, 0x4431, 0xf547, + 0x6723, + /* 0x8140 */ + 0x6722, 0x7a4f, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, + 0x4f53, 0x6735, 0x7a50, 0x6729, 0x672a, 0x7a51, 0x7a52, 0xf549, + 0x3c70, 0x7a53, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, + 0x4123, 0x425c, + /* 0x8180 */ + 0x672f, 0xf54b, 0x6730, 0x672c, 0xf54d, 0xf54e, 0x672d, 0x672e, + 0x3951, 0x6736, 0x6732, 0xf550, 0x4966, 0x4b6c, 0x4928, 0x6731, + 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0xf551, 0x4137, 0x6739, + 0x673b, 0x673f, 0x7a54, 0x673c, 0x673a, 0x473f, + /* 0x81C0 */ + 0x673d, 0xf552, 0x673e, 0xf553, 0x3232, 0x6745, 0x6740, 0x7a55, + 0x6741, 0x7a56, 0x6742, 0x4221, 0xf554, 0x7a57, 0x6744, 0x6743, + 0x6746, 0xf555, 0x6747, 0x6748, 0x3f43, 0xf557, 0x3269, 0x6749, + 0x4e57, 0x3c2b, 0xf559, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, + 0x3131, 0xf55b, 0x674c, 0xf55c, + /* 0x8200 */ + 0x674d, 0x674e, 0xf55e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, + 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, + 0xf560, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0xf561, 0xf562, 0x6755, + 0x3952, 0x6756, 0x484c, 0x6764, 0xf564, 0x6758, 0xf565, 0x4249, + 0x4775, 0x383f, 0x6757, 0x4125, 0xf566, + /* 0x8240 */ + 0x6759, 0xf569, 0xf567, 0x447a, 0xf568, 0xf56b, 0xf56d, 0xf56f, + 0x675b, 0x675a, 0x675d, 0xf571, 0x675c, 0x675e, 0x7a5b, 0x6760, + 0xf572, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, + 0x6765, 0x3f27, 0x7a5c, 0x3170, 0x6766, 0x6767, 0xf576, 0xf578, + 0x6768, 0xf579, + /* 0x8280 */ + 0xf57a, 0xf57b, 0x3072, 0x6769, 0x7a5e, 0x676a, 0xf57c, 0x4967, + 0x3c47, 0x676c, 0x7a5f, 0x7a60, 0x7a61, 0x3329, 0x3032, 0xf57d, + 0xf57e, 0x7a62, 0x676b, 0x676e, 0x474e, 0x7a63, 0x3f44, 0x3256, + 0xf621, 0x4b27, 0xf622, 0x7a64, 0x375d, 0x365c, 0xf623, 0x676d, + 0xf624, 0x326a, 0x7a65, 0x7a66, + /* 0x82C0 */ + 0x3423, 0x7a67, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x7a68, 0x4944, + 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0xf625, 0x6770, + 0x3c63, 0x366c, 0x4377, 0xf626, 0x4651, 0x3151, 0x6774, 0x6773, + 0xf627, 0x6779, 0x6775, 0x6778, 0x7a69, 0x7a6a, + /* 0x8300 */ + 0x7a6b, 0x7a6c, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0xf628, + 0xf629, 0x677d, 0xf62a, 0x3754, 0x6823, 0x682c, 0x682d, 0xf62c, + 0x302b, 0xf62d, 0x7a6e, 0x6834, 0x3071, 0x682b, 0x7a6f, 0x682a, + 0xf62e, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, + 0x7a70, 0xf62f, + /* 0x8340 */ + 0x6826, 0x7a71, 0xf630, 0x6829, 0x7a72, 0x4170, 0x3755, 0x3141, + 0x6828, 0x7a73, 0x3953, 0xf62b, 0x7a74, 0xf631, 0x4171, 0x7a6d, + 0xae4a, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x7a75, 0xf633, + /* 0x8380 */ + 0x682e, 0x7a76, 0x6836, 0x683d, 0x6837, 0xf636, 0x6835, 0x7a77, + 0x6776, 0xf637, 0xf638, 0x6833, 0x7a78, 0x682f, 0xf639, 0xf63a, + 0x3450, 0x6831, 0x683c, 0x6832, 0x7a79, 0x683e, 0x7a7a, 0x6830, + 0x477c, 0x4d69, 0x6839, 0x684f, 0x7a7b, + /* 0x83C0 */ + 0x7a7c, 0x6847, 0x3f7b, 0x7a7d, 0xf63b, 0x3546, 0x365d, 0x6842, + 0x7a7e, 0xf63c, 0x7b21, 0x325b, 0xf63d, 0x3e54, 0x6845, 0x3a5a, + 0xf63e, 0x4551, 0x684a, 0x7b22, 0xf63f, 0x4a6e, 0x7b23, 0x6841, + 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0xf640, 0x6852, + 0x6843, + /* 0x8400 */ + 0x7b24, 0x6844, 0x463a, 0x7b25, 0x6849, 0x7b26, 0x6846, 0x4b28, + 0x684c, 0x3060, 0xf641, 0xf642, 0x6840, 0xf643, 0xf645, 0x684e, + 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0xf646, + 0x6855, 0x4d6e, + /* 0x8440 */ + 0x685e, 0x7b28, 0x4d55, 0xf647, 0x4e2a, 0xf648, 0xf649, 0xf64a, + 0x4378, 0xf64b, 0xf64c, 0x336b, 0xf64d, 0x7b29, 0x4972, 0x6864, + 0x4621, 0xf64f, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, + 0x6860, 0x7b2a, 0x472c, 0x7b2b, 0x302a, 0xf650, 0x6858, 0xf651, + 0x6861, 0x4978, 0xf652, + /* 0x8480 */ + 0xf653, 0x685c, 0x6857, 0x7b2c, 0x3e55, 0x3d2f, 0x3c2c, 0xf656, + 0x4c58, 0x4947, 0x7b2d, 0x6867, 0x6870, 0xf657, 0x685a, 0x7b2e, + 0x3377, 0x7b2f, 0x3e78, 0x6865, 0x7b30, 0x686a, 0x4173, 0xf658, + 0x6866, + /* 0x84C0 */ + 0x7b31, 0x686d, 0x7b32, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, + 0x6869, 0xf65a, 0xf65b, 0x686c, 0x4c2c, 0xf65c, 0x686f, 0x6868, + 0x686b, 0xf655, 0xf65e, 0xf65f, 0x4b29, 0x4f21, 0xf660, 0xf661, + 0xf662, 0x6873, 0xf663, 0x687a, 0xf664, 0x6872, + /* 0x8500 */ + 0x3c43, 0x6851, 0xf665, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, + 0x6875, 0x3136, 0xf666, 0x7b35, 0x6877, 0x6871, 0x7b36, 0xf667, + 0xf668, 0x4455, 0xf669, 0x6876, 0x307e, 0x7b37, 0x7b34, 0xf66a, + 0x4222, 0x4a43, 0xf66f, + /* 0x8540 */ + 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, + 0xf66b, 0xf670, 0xf671, 0x6924, 0x4979, 0x687d, 0x7b38, 0x6856, + 0xf672, 0xf673, 0xf674, 0x687c, 0x7b39, 0x4f4f, 0x4622, 0x4973, + 0x692b, 0xf66c, 0x6931, 0x7b3c, 0xf676, 0xf677, 0x6932, 0xf678, + /* 0x8580 */ + 0x6925, 0xf679, 0x4776, 0xf67a, 0x692f, 0x6927, 0x6929, 0x7b3d, + 0x7b3e, 0x6933, 0x6928, 0xf67b, 0x692c, 0x3172, 0x4665, 0x692d, + 0x6930, 0xf67c, 0xf67d, 0x7b3f, 0x6926, 0x4126, 0x692a, 0x3b27, + 0x3f45, 0x3730, 0x4c74, 0x7b3b, 0x4c79, 0x3d72, 0x7b40, 0xf723, + 0x6937, 0x6935, 0xf724, + /* 0x85C0 */ + 0x4f4e, 0xf725, 0x6934, 0xf726, 0x7b41, 0x4d75, 0x7b42, 0x6936, + 0x6938, 0x6939, 0xf727, 0xf728, 0x693c, 0x693a, 0xf729, 0xf72a, + 0x4623, 0x693b, 0xf72b, 0x484d, 0x692e, 0x7b43, 0xf72c, 0x3d73, + 0x693d, 0x6942, 0x4174, 0x6941, 0x7b45, + /* 0x8600 */ + 0xf72d, 0x6922, 0x7b46, 0x7b47, 0x6943, 0x4149, 0x693e, 0x6940, + 0x7b48, 0xf72e, 0x7b44, 0x693f, 0x5d31, 0x5d22, 0x7b4a, 0x6945, + 0xf72f, 0xf730, 0x6944, 0xf731, 0xf732, 0x7b4b, 0x4d76, 0x623c, + 0x6946, 0x7b4c, 0xf734, 0xf735, 0x6947, + /* 0x8640 */ + 0xf737, 0x2f68, 0x6948, 0x3857, 0x3554, 0xf739, 0x694a, 0x515d, + 0xf73a, 0x7b4d, 0x3575, 0x7b4e, 0x4e3a, 0x3673, 0x694b, 0x7b50, + 0x694c, 0x436e, 0x7b52, 0xf73b, 0x694d, 0x7b53, 0xf73c, 0x467a, + 0xf73d, 0x303a, + /* 0x8680 */ + 0xf73e, 0xf73f, 0x3263, 0x6952, 0x6953, 0xf740, 0xf741, 0x694e, + 0x3b3d, 0x7b54, 0xf742, 0xf743, 0x694f, 0x4742, 0xf744, 0x6950, + 0x6951, 0x695b, 0x6955, 0x6958, 0xf746, 0xf747, 0x6954, 0x7b55, + /* 0x86C0 */ + 0xf748, 0xf749, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, + 0x3342, 0xf74a, 0x695c, 0xf74b, 0xf74c, 0x333f, 0x6961, 0x695d, + 0x6960, 0xf74d, 0x483a, 0xf74e, 0x695e, 0x695f, 0x4948, 0x485a, + 0x6962, 0x427d, 0x696c, 0x7b56, 0x6968, 0x7b57, 0x7b58, 0x326b, + /* 0x8700 */ + 0x6966, 0x4b2a, 0x6967, 0xf750, 0x6964, 0xf751, 0x6965, 0x696a, + 0x696d, 0x7b59, 0x696b, 0xf752, 0xf753, 0x6969, 0x6963, 0xf754, + 0x4358, 0xf755, 0x6974, 0x4c2a, 0xf756, 0xf757, 0xf758, 0x6972, + 0x6973, 0xf759, 0x696e, 0x6970, 0xf75a, 0x6971, 0xf75b, 0x696f, + /* 0x8740 */ + 0xf75c, 0xf75d, 0x4066, 0x4f39, 0x6978, 0x6979, 0xf75e, 0x6a21, + 0x3f2a, 0x697b, 0xf75f, 0x697e, 0x6976, 0x6975, 0x6a22, 0xf760, + 0xf761, 0x325c, 0x697c, 0x6a23, 0x697d, 0x7b5a, 0xf762, 0x697a, + 0x4433, 0x6977, 0xf763, 0x4768, + /* 0x8780 */ + 0x6a27, 0x7b5b, 0x7b5c, 0xf767, 0xf768, 0x4d3b, 0xf769, 0x6a26, + 0xf76a, 0x6a25, 0xf766, 0x6a2e, 0x7b5d, 0x7b5e, 0x6a28, 0x6a30, + 0x7b5f, 0x4d66, 0x6a33, 0x6a2a, 0xf76d, + /* 0x87C0 */ + 0x6a2b, 0xf76f, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0xf770, 0x6a2c, + 0x6a3d, 0x7b61, 0xf772, 0x6a36, 0xf774, 0xf775, 0xf776, 0xf777, + 0xf778, 0x7b62, 0xf779, 0x6a34, 0x6a35, 0xf771, 0x6a3a, 0x6a3b, + 0x332a, 0x3542, 0x6a39, + /* 0x8800 */ + 0xf77a, 0xf77b, 0x6a24, 0x7b63, 0x7b64, 0xf77c, 0x6a38, 0x6a3c, + 0x6a37, 0x7b65, 0x6a3e, 0xf77d, 0x7b66, 0x6a40, 0x6a3f, 0x7b67, + 0x6a42, 0x6a41, 0x695a, 0x6a46, 0xf77e, 0xf821, 0x6a43, 0xf822, + 0x6a44, 0x6a45, 0x6a47, 0xf823, + /* 0x8840 */ + 0x376c, 0x6a49, 0x6a48, 0x3d30, 0xf825, 0x3954, 0x5e27, 0x6a4a, + 0x3d51, 0x3339, 0xf826, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0xf827, + 0x3955, 0x6a4d, 0x3061, 0xf828, 0x493d, 0xf82b, 0x6a4e, 0xf82d, + 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, + /* 0x8880 */ + 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, + 0x7b68, 0x6a5a, 0x6a51, 0xf82e, 0x6a5b, 0x6a5d, 0x7b69, 0x486f, + 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0xf82f, 0xf830, + 0xf831, 0x6a5f, + /* 0x88C0 */ + 0xf832, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x7b6a, 0x7b6b, + 0x4e22, 0xf835, 0xf833, 0xf836, 0x6a63, 0x4d35, 0x6a64, 0x6a65, + 0xf837, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0xf838, 0xf839, + 0x6a6c, 0x3e58, 0x6a6a, 0x7b6d, 0x4d67, 0x6a67, 0x6a69, 0x403d, + 0x3f7e, + /* 0x8900 */ + 0xf83b, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, + 0x6a70, 0x7b70, 0x7b71, 0x7b72, 0x7b6e, 0x6a7c, 0x6a72, 0x6a73, + 0x7b73, 0x6a74, 0x6a75, 0x7b74, 0x7b75, 0x6a79, 0xf83d, 0x6a7a, + 0x7b76, 0x6a78, + /* 0x8940 */ + 0x7b77, 0x6a76, 0xf83f, 0x6a71, 0x6a77, 0xf840, 0xf841, 0x6a7b, + 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0xf844, 0x6b22, 0x6b21, + 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, + /* 0x8980 */ + 0xf845, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0xf846, 0x6b2b, + 0x382b, 0x352c, 0xf847, 0x6b2c, 0x7b78, 0x3b6b, 0x4741, 0x6b2d, + 0x3350, 0xf848, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, + 0x6b32, 0xf849, 0x6b33, 0x3451, 0xf84a, 0x6b34, 0x6b35, 0x6b36, + /* 0x89C0 */ + 0x6b37, 0x3351, 0x7b7a, 0xf84b, 0xf84c, 0x6b38, 0x6b39, 0x6b3a, + 0x3272, 0x7b7b, 0x3f28, 0x6b3b, 0xf84d, 0xf84f, 0xf850, 0x6b3c, + 0x7b7c, 0x6b3d, 0xf851, 0xf852, + /* 0x8A00 */ + 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, + 0xf854, 0x7b7d, 0x3731, 0xf855, 0x7b7e, 0x6b3f, 0x4277, 0x352d, + 0x6b42, 0x6b43, 0x3e59, 0xf857, 0x7c21, 0x376d, 0x6b44, 0x4b2c, + 0x405f, 0x3576, 0x4c75, 0x414a, 0xf858, 0x6b45, 0x7c22, 0x3f47, + 0x4370, 0x3e5a, 0xf859, + /* 0x8A40 */ + 0x6b46, 0xf85a, 0x6b49, 0x7c23, 0x6b4a, 0xf85b, 0x7c24, 0x3a3e, + 0x4242, 0x6b48, 0x3e5b, 0x493e, 0xf85c, 0x6b47, 0x7c25, 0x3b6c, + 0x3153, 0x7c26, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, + 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x7c27, 0x7c28, + 0x6b4b, + /* 0x8A80 */ + 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0xf85e, + 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, + 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x7c29, 0x6b52, 0x4062, 0x4649, + 0xf85d, 0x432f, 0x325d, 0xf85f, 0x4870, 0x3543, 0xf860, 0x4434, + /* 0x8AC0 */ + 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x7c2a, + 0x4e4a, 0x4f40, 0xf861, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x7c2b, + 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, + 0x3b70, 0x6b61, 0x6b5e, 0x7c2c, 0x7c2d, 0x6b65, 0x3d74, 0x3841, + 0xf862, 0x427a, + /* 0x8B00 */ + 0x4b45, 0x315a, 0x3062, 0x4625, 0xf865, 0x6b69, 0xf864, 0x6b68, + 0xf866, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, + 0x3956, 0xf867, 0x3c55, 0xf868, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, + 0x6b73, 0x4935, 0xf869, 0x6b70, 0x3660, 0x6b74, + /* 0x8B40 */ + 0x6b76, 0xf86a, 0x7c31, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0xf86c, + 0x7c32, 0x6b7b, 0x3c31, 0x7c33, 0x6b7d, 0x6b7c, 0x4968, 0xf86d, + 0x6c21, 0x3759, 0x7c34, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, + 0x3e79, 0x6c24, 0xf86e, 0x386e, 0x6c25, 0xf86f, + /* 0x8B80 */ + 0x6c26, 0xf870, 0x3b3e, 0x5a4e, 0xf871, 0x6c27, 0x6c28, 0x3d32, + 0x6c29, 0x6c2a, 0xf872, 0xf873, 0x6c2b, 0x6c2c, 0x6c2d, 0xf874, + 0x7c35, 0xf875, + /* 0x8C00 */ + 0x432b, 0xf876, 0x6c2e, 0xf878, 0x6c30, + /* 0x8C40 */ + 0x6c2f, 0xf87b, 0x4626, 0xf87c, 0x6c31, 0x7c36, 0x4b2d, 0x6c32, + 0x6c33, 0xf87d, 0x6c34, 0xf87e, 0x6c35, 0xf921, 0x465a, 0x3e5d, + 0x6c36, 0x7c37, 0xf922, 0x396b, 0x502e, 0x6c37, 0xf923, 0xf924, + 0x6c38, 0x493f, 0x6c39, 0x6c41, + /* 0x8C80 */ + 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0xf927, + 0xf926, 0x6c40, 0x6c42, 0xf928, 0xf92a, 0x332d, 0x4467, 0x4969, + 0x3a62, 0x3957, 0xf92b, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, + 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, + 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, + /* 0x8CC0 */ + 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, + 0x6c5c, 0x4128, 0x4678, 0x4950, 0xf92d, 0xf92c, 0xf92e, 0x6c4f, + 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x7c39, 0x382d, 0x6c4e, 0x6c4d, + 0x496a, 0x3c41, 0x4552, 0xf930, 0xf931, 0x7c3a, 0x7c3b, 0x6c51, + 0x6c52, 0x3958, 0x6c50, 0x7c3c, + /* 0x8D00 */ + 0x6c53, 0x6c54, 0x6c56, 0x4223, 0xf933, 0x6c55, 0x3466, 0x6c58, + 0xf934, 0x6c57, 0x6c59, 0x7c3e, 0x6c5b, 0x6c5d, 0x6c5e, 0x7c3f, + /* 0x8D40 */ + 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0xf935, 0x6c60, 0x4176, 0x6c61, + 0x6c62, 0x496b, 0x352f, + /* 0x8D80 */ + 0x6c63, 0xf936, 0x4436, 0x315b, 0xf937, 0x6c64, 0x3c71, 0xf938, + 0x3f76, 0x7c40, 0x422d, 0x6c67, 0x6c66, + /* 0x8DC0 */ + 0x6c65, 0xf93a, 0xf93b, 0x6c6d, 0x6c6b, 0x7c41, 0x6c68, 0x7c42, + 0x6c6a, 0x7c43, 0xf93c, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, + 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0xf93d, 0x4f29, 0x4437, 0x4129, + 0x6c72, 0xf940, 0x6c75, + /* 0x8E00 */ + 0xf941, 0x6c73, 0x6c74, 0x4d59, 0xf93e, 0x4627, 0x6c78, 0xf943, + 0xf944, 0x6c76, 0x6c77, 0x6c79, 0x7c44, 0xf945, 0xf946, 0x7c45, + 0xf947, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0xf94a, 0xf94b, 0x7c46, + /* 0x8E40 */ + 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0xf94c, 0x6d23, + 0x6d24, 0xf94d, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0xf94e, 0x6d2a, + 0x6d27, 0xf94f, 0xf950, 0xf951, 0x7c47, 0x6d2d, 0x3d33, 0x6d2c, + 0x7c48, 0x6d2e, + /* 0x8E80 */ + 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, + 0x6d35, 0x6d37, 0xf952, 0x6d38, 0xf953, 0x6d3a, 0x6d39, 0x3f48, + 0x6d3b, 0xf954, 0x366d, 0x6d3c, 0x6d3e, 0xf955, 0xf956, 0xf957, + 0xf958, 0x6d3f, + /* 0x8EC0 */ + 0x7c4a, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, + 0xf95a, 0x382e, 0xf95b, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, + 0x3c34, 0xf95d, 0x7c4c, 0x6d46, 0x6d45, 0x375a, 0x6d48, + /* 0x8F00 */ + 0xf95f, 0x3353, 0x6d4a, 0xf960, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, + 0x6d4e, 0x4a65, 0x6d4b, 0xf961, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, + 0x7c4d, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0xf962, 0x7c4e, 0x3d34, + 0x6d54, 0x7c4f, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, + /* 0x8F40 */ + 0xf963, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0xf964, 0x6d5a, + 0x4532, 0x6d5d, 0x7c50, 0x6d5e, 0xf965, 0x6d5f, 0x396c, 0x3725, + 0x6d60, 0x6d61, 0x6d62, + /* 0x8F80 */ + 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0xf967, 0x7c52, 0x5221, + 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0xf968, + 0x7c53, 0xf96a, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, + /* 0x8FC0 */ + 0xf96c, 0x312a, 0x4b78, 0x3f57, 0xf96d, 0xf96f, 0xf970, 0x375e, + 0x3661, 0xf971, 0x4a56, 0xf972, 0x6d69, 0xf973, 0x6d6b, 0x7c54, + 0x6d6a, 0x3260, 0x7c55, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x7c56, + 0x6d6d, 0x3d52, 0xf974, 0x6d6f, 0xf975, 0x4c42, 0x6d7e, 0x6d71, + 0x6d72, 0xf976, 0x4449, + /* 0x9000 */ + 0x4260, 0x4177, 0xf977, 0x4628, 0x6d70, 0x3555, 0x7c57, 0x6d79, + 0xf978, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, + 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, + 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x7c58, 0x4261, 0x3d35, + 0x3f4a, 0x6d7c, 0x6d7b, 0xf979, 0x306f, 0x6d7d, 0x492f, 0x6e27, + /* 0x9040 */ + 0x465b, 0x3f6b, 0xf97b, 0xf97c, 0x4359, 0x3678, 0x6e26, 0x4d37, + 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, + 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0xf97d, 0x6e2a, + 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, + 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, + 0x6e31, 0x4872, + /* 0x9080 */ + 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0xfa22, 0x6d6e, 0x7c5a, + 0x6e35, 0x6e34, 0xfa23, 0x6e36, 0xfa24, 0x4d38, 0x7c5b, 0x7c5c, + 0x7c5d, 0x7c5e, 0xfa26, 0x7c5f, 0x4661, 0x4b2e, 0x6e37, 0x3c59, + 0x6e38, 0xfa28, 0x6e39, 0x7c60, 0x6e3a, 0xfa29, 0x4521, 0x7c61, + /* 0x90C0 */ + 0x306a, 0xfa2a, 0x7c62, 0x7c63, 0x7c64, 0xfa2b, 0x3959, 0x4f3a, + 0x7c65, 0x6e3e, 0xfa2d, 0x7c66, 0x7c67, 0xfa2e, 0x3734, 0x6e3b, + 0x6e3c, 0x4974, 0xfa33, 0x3354, 0x7c68, 0xfa31, 0x7c69, 0x4d39, + 0xfa30, 0x363f, 0x4554, 0xfa34, 0xfa35, + /* 0x9100 */ + 0xfa32, 0x6e3f, 0xfa36, 0xfa37, 0x6e40, 0x7c6b, 0x7c6c, 0x7c6d, + 0xfa38, 0x6e41, 0xfa39, 0xfa3a, 0x7c6e, 0x7c6f, 0x7c70, 0x4522, + 0x7c71, 0x6e43, 0x7c72, 0x6e42, 0x7c73, 0xfa3b, 0xfa3c, 0xfa3d, + 0x7c74, + /* 0x9140 */ + 0xfa3e, 0xfa3f, 0x7c75, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, + 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0xfa40, 0x6e46, 0xfa41, 0x7c76, + 0xfa42, 0x3f5d, 0x6e47, 0xfa43, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, + 0x6e4b, 0x6e4a, 0xfa44, 0x395a, 0x3973, 0x3b40, 0xfa45, + /* 0x9180 */ + 0x6e4e, 0x7c77, 0xfa46, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0xfa47, + 0x386f, 0x4043, 0x4830, 0x3d39, 0x7c78, 0x6e4f, 0x3e5f, 0xfa48, + 0x6e52, 0x6e50, 0x7c79, 0xfa49, 0x6e51, 0x7c7a, 0xfa4a, 0x6e54, + 0x6e53, 0xfa4b, 0x3e7a, 0x6e55, 0x7c7b, + /* 0x91C0 */ + 0x6e56, 0x6e57, 0xfa4c, 0xfa4d, 0x4850, 0x3a53, 0x3c61, 0x6e58, + 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, + 0x7c7c, 0x4523, 0xfa4e, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, + 0x4460, 0x7c7e, 0x7d21, 0x4b55, 0x367c, 0xfa51, 0x7d22, 0xfa52, + 0x7d23, 0x6e60, 0x6e61, 0x7c7d, 0x6e5f, 0x6e63, + /* 0x9200 */ + 0xfa53, 0x7d24, 0xfa54, 0x465f, 0x3343, 0x7d25, 0x6e67, 0x6e64, + 0x6e66, 0xfa55, 0xfa56, 0x6e62, 0x6f4f, 0x6e65, 0xfa58, 0x4e6b, + 0x385a, 0x7d26, 0x7d27, 0x7d28, 0x7d29, 0x6e6f, + /* 0x9240 */ + 0x7d2a, 0xfa59, 0x7d2b, 0x4534, 0x6e6a, 0xfa5a, 0x6e6d, 0x6e6b, + 0xfa5b, 0x6e70, 0xfa5c, 0x7d2c, 0x6e71, 0xfa5d, 0xfa5e, 0x6e69, + 0xfa5f, 0x6e76, 0x3174, 0x6e68, 0xfa60, 0xfa61, 0x482d, 0x6e6c, + 0xfa62, 0x3e60, 0xfa63, 0xfa64, 0x395b, 0x7d2d, 0xfa67, 0xfa68, + 0x4b48, 0xfa69, + /* 0x9280 */ + 0x3664, 0x3d46, 0x463c, 0x7d2e, 0xfa6a, 0xfa6b, 0x412d, 0x6e74, + 0x6e6e, 0x6e73, 0xfa6c, 0x4c43, 0xfa6d, 0x4438, 0x6e75, 0x6e72, + 0xfa6e, 0xfa6f, 0xfa70, 0x412c, 0xfa73, 0x6e79, 0x6e78, 0xfa74, + /* 0x92C0 */ + 0xfa75, 0x7d2f, 0xfa76, 0x7d30, 0x7d31, 0xfa77, 0x6e77, 0xfa78, + 0x4b2f, 0x7d32, 0xfa79, 0xfa7a, 0x7d33, 0x3d7b, 0xfa7b, 0xfa7c, + 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0xfb22, 0x3578, 0xfb23, + 0x6e7c, 0xfb24, 0x395d, 0x7d34, + /* 0x9300 */ + 0xfb25, 0x7d35, 0x3b2c, 0xfb26, 0x6e7b, 0x3f6d, 0xfa7d, 0xfb27, + 0x3f6e, 0x6f21, 0x6f23, 0xfb28, 0xfb29, 0x7d36, 0x3e7b, 0x7d37, + 0x6f22, 0x6f24, 0x7d38, 0x3653, 0xfb2a, 0x4945, 0xfb2b, 0x3c62, + 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, + /* 0x9340 */ + 0x6e7d, 0xfb2e, 0x7d39, 0x7d3a, 0x7d3b, 0x4669, 0x4555, 0xfb2f, + 0x4457, 0x6f2c, 0xfb30, 0xfb31, 0x4343, 0x6f28, 0x6f29, 0x7d3c, + 0x7d3d, 0x7d3e, 0xfb32, 0x372d, 0x6f2b, 0x7d3f, 0xfb33, 0xfb34, + 0x3830, 0x6f2a, 0x3e61, + /* 0x9380 */ + 0xfb38, 0xfb39, 0x3379, 0xfb3a, 0x6f30, 0x3a3f, 0x4179, 0x444a, + 0x7d40, 0xfb3b, 0xfb35, 0x7d41, 0x333b, 0x6f2e, 0x6f2f, 0x4443, + 0x6f2d, 0x6f31, 0x7d42, + /* 0x93C0 */ + 0xfb40, 0x6f37, 0x7d43, 0xfb41, 0x6f3a, 0x6f39, 0x452d, 0x6f32, + 0x6f33, 0x6f36, 0xfb42, 0x6f38, 0x7d44, 0x7d45, 0x3640, 0xfb43, + 0x6f3b, 0x6f35, 0xfb44, 0x6f34, 0xfb3f, 0xfb3c, 0xfb49, 0x7d47, + /* 0x9400 */ + 0x6f3f, 0x7d46, 0x6f40, 0xfb45, 0xfb46, 0x6f41, 0x6f3e, 0x6f3d, + 0xfb47, 0xfb48, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0xfb4a, + 0x7d48, 0xfb4b, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0xfb4c, + /* 0x9440 */ + 0x6f47, 0x6f49, 0xfb4d, 0x7d49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, + 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x7d4a, 0x6f4e, 0x7d4b, 0xfb50, + 0xfb51, 0x6f50, 0x7d4c, 0x7d4d, 0x6f51, 0x6f52, 0x6f55, 0x6f53, + 0x6f56, 0x6f58, + /* 0x9480 */ + 0x6f57, + /* 0x9540 */ + 0x4439, 0xfb52, 0xfb53, + /* 0x9580 */ + 0x4c67, 0x6f59, 0x412e, 0xfb54, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, + 0xfb55, 0xfb56, 0x7d4e, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, + 0x6f5e, 0x6f5f, 0x7d4f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, + 0x7d50, 0x6f62, 0x6f61, 0x7d51, 0xfb58, 0x7d52, 0x6f63, 0x315c, + 0xfb59, 0x7d53, 0x6f66, 0x6f65, 0x6f64, 0x7d54, 0x6f67, + /* 0x95C0 */ + 0x6f6a, 0x3047, 0xfb5b, 0x6f68, 0x7d55, 0x6f6c, 0x6f6b, 0x7d56, + 0x7d57, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x7d59, 0x6f70, 0x7d5a, + 0x6f71, 0x6f73, 0x6f72, + /* 0x9600 */ + 0x496c, 0xfa25, 0x6f74, 0x6f75, 0x3a65, 0xfb5e, 0x6f76, 0x6f77, + 0x4b49, 0xfb5f, 0xfb60, 0x414b, 0xfb62, 0x3024, + /* 0x9640 */ + 0x424b, 0xfb63, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, + 0x3842, 0x7d5b, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0xfb64, + 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, + 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, + /* 0x9680 */ + 0xfb66, 0x7d5c, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, + 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0xfb68, + 0x3a5d, 0x3e63, 0x7d5e, 0x3123, 0x4e59, 0x7d5f, 0x7d60, 0x702b, + 0x6e2e, 0xfb6b, 0x702a, 0xfb6c, 0x702e, 0x702c, 0x702d, 0xfb6d, + 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0xfb6e, 0x4049, 0x483b, + 0xfb6f, + /* 0x96C0 */ + 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, + 0x3b73, 0x7036, 0x7033, 0x3b28, 0x7d61, 0x703a, 0x6a2d, 0xfb72, + 0x5256, 0xfb73, 0x3f77, 0x7038, 0xfb74, 0x7d62, 0x4e25, 0x4671, + 0x312b, 0x7d64, 0x4063, 0x3c36, 0x7d65, 0x4a37, 0x3140, 0x4e6d, + 0x4d6b, 0x703b, 0x4545, + /* 0x9700 */ + 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, + 0x7042, 0x7041, 0x703f, 0xfb76, 0x7043, 0x7044, 0x417a, 0x3262, + 0xfb77, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x7d66, 0xfb79, + 0x5b31, 0x7048, 0x7d67, 0x7049, 0x704a, + /* 0x9740 */ + 0xfb7a, 0x704e, 0x704b, 0x704c, 0xfb7b, 0x704d, 0x704f, 0x7d68, + 0x7d69, 0x7d6a, 0x4044, 0xfb7c, 0x4c77, 0xfb7d, 0x4045, 0x7d6b, + 0xfb7e, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, + 0x7054, 0x3357, 0xfc21, 0x7056, 0x3f59, 0x7d6c, 0x7057, 0x7d6d, + 0x3724, 0x7058, 0x705c, 0x705a, + /* 0x9780 */ + 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, + 0x7d6e, 0xfc24, 0x3e64, 0xfc25, 0x7061, 0xfc26, 0x3547, 0xfc27, + 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7d6f, 0xfc28, 0xfc29, + 0x7065, 0x7066, 0x7d70, 0xfc2a, + /* 0x97C0 */ + 0x7d71, 0x7067, 0x7068, 0x7069, 0x7d72, 0x706a, 0xfc2b, 0xfc2c, + 0x345a, 0xfc2d, 0xfc2e, 0xfc2f, 0x7d74, 0x706b, 0x7d73, 0xfc30, + 0x706c, 0x4723, 0xfc31, 0x706e, 0x323b, 0x7d75, 0x7071, 0x7070, + 0x3124, 0x3641, + /* 0x9800 */ + 0x4a47, 0x443a, 0x3a22, 0xfc32, 0x3960, 0x3d67, 0x3f5c, 0x7d77, + 0x7073, 0xfc33, 0xfc34, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, + 0xfc35, 0xfc36, 0x3f7c, 0x4e4e, 0x375b, 0x7d78, 0x7076, 0xfc39, + 0x7075, 0xfc3c, 0x7d79, 0x4b4b, 0x462c, 0x7d7a, 0xfc3a, 0xfc3b, + 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, + /* 0x9840 */ + 0x7079, 0xfc3d, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x7d7c, + 0x7d7d, 0x3469, 0x3832, 0x7d7e, 0x7e21, 0x346a, 0x7e22, 0x7e23, + 0x453f, 0x4e60, 0x7e25, 0xfc3e, 0x385c, 0x707c, 0x7e26, 0x707d, + 0x707e, 0x7121, 0x7123, 0x7122, + /* 0x9880 */ + 0x4977, 0x7124, 0xfc3f, 0xfc40, 0x7125, 0xfc41, 0x7126, 0x7127, + 0xfc43, 0xfc44, 0x7e27, 0xfc45, 0xfc46, 0xfc47, + /* 0x98C0 */ + 0xfc48, 0x7129, 0x7128, 0x712a, 0xfc49, 0x7e28, 0xfc4a, 0x4874, + 0x664c, 0x3f29, 0xfc4b, 0xfc4d, 0x3532, 0xfc4e, 0xfc4f, 0x7e29, + 0x712b, 0xfc50, 0x712c, 0x522c, 0x5d3b, 0x4853, 0xfc51, 0xfc52, + 0x307b, 0xfc53, 0x303b, 0x3b74, 0x4b30, 0x3e7e, + /* 0x9900 */ + 0x712d, 0x4c5f, 0xfc54, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, + 0x326e, 0x7130, 0xfc57, 0xfc58, 0x7131, 0xfc5a, 0xfc5b, 0xfc5c, + 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, + 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0x7139, 0x713a, + /* 0x9940 */ + 0xfc64, 0xfc65, 0x713b, 0x713d, 0xfc66, 0x713c, 0x713f, 0x7142, + 0xfc67, 0xfc68, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x7e2a, + 0xfc69, 0xfc6a, 0xfc6b, + /* 0x9980 */ + 0x3c73, 0x7144, 0x7145, 0x3961, 0x7e2b, 0xfc6c, 0x7146, 0xfc6d, + 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0xfc6e, 0x7149, + 0xfc6f, 0xfc70, + /* 0x99C0 */ + 0x477d, 0xfc71, 0x424c, 0x3158, 0x366e, 0x366f, 0xfc72, 0x4373, + 0x714e, 0x3670, 0xfc73, 0x326f, 0x714d, 0xfc74, 0x714b, 0x714c, + 0xfc75, 0x714a, 0x7158, 0x714f, 0x7150, 0xfc77, 0x7151, 0x7152, + 0x7154, 0xfc78, 0x7153, 0xfc79, 0x3d59, + /* 0x9A00 */ + 0x7155, 0x7e2c, 0x7e2d, 0x7157, 0xfc7a, 0x3533, 0x7156, 0xfc7b, + 0x417b, 0x3833, 0xfc7c, 0x7159, 0xfc7d, 0xfc7e, 0x7e2e, 0x424d, + 0x715a, 0x7e2f, 0x7e30, 0x462d, 0xfd21, 0xfd22, 0x715b, 0x7e31, + 0x7160, + /* 0x9A40 */ + 0x715e, 0x715d, 0x715f, 0xfd23, 0x715c, 0x7e32, 0xfd24, 0x7162, + 0x7e33, 0x7e34, 0x7161, 0x7164, 0xfd25, 0x3643, 0x7163, 0x7165, + 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, + /* 0x9A80 */ + 0x397c, 0x716c, 0xfd27, 0x716d, 0x7e35, 0xfd29, 0x333c, 0xfd2b, + 0x716e, + /* 0x9AC0 */ + 0x716f, 0x7e36, 0x7e37, 0x3f71, 0xfd2d, 0x7e38, 0x7170, 0xfd2e, + 0x7171, 0xfd2f, 0x7172, 0x7173, 0xfd30, 0x7e39, 0x3962, 0xfd32, + 0x7174, 0x7175, 0xfd33, 0x7176, 0x7177, 0xfd34, 0x7178, 0xfd35, + 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, + 0x7e3a, 0x7221, + /* 0x9B00 */ + 0x7e3b, 0xfd36, 0x7222, 0x7e3c, 0xfd37, 0xfd38, 0xfd39, 0xfd3a, + 0x7223, 0x7224, 0xfd3b, 0x7225, 0x7e3d, 0x7226, 0x7227, 0x7228, + 0x7229, 0x722a, 0x722b, 0x722c, 0xfd3c, 0x7e3f, 0x722d, 0x722e, + 0x5d35, 0x722f, 0xfd3d, 0x6478, 0x3534, 0xfd3e, + /* 0x9B40 */ + 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0xfd40, 0x7233, 0x7234, + 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x7e40, 0xfd41, 0xfd42, + 0x7e42, 0xfd43, 0xfd44, 0x4f25, 0x7e43, 0xfd45, 0x7237, 0x7e44, + 0xfd46, 0xfd47, 0x7e41, + /* 0x9B80 */ + 0x7239, 0x7e45, 0x7e46, 0x303e, 0x7e47, 0x723a, 0x4a2b, 0x7238, + 0x723b, 0x723c, 0x7e48, 0x723d, 0x723e, 0xfd48, 0x7e49, 0x723f, + 0x4b6e, 0x3b2d, 0xfd49, 0x3a7a, 0x412f, 0xfd4a, 0xfd4d, 0x7240, + 0xfd4e, 0x7243, 0xfd4f, + /* 0x9BC0 */ + 0x7241, 0x7e4a, 0x7244, 0xfd50, 0x3871, 0x7242, 0x7e4b, 0x7245, + 0x7246, 0x7247, 0x724b, 0x3b2a, 0xfd52, 0x4264, 0xfd53, 0x724c, + 0x7249, 0x7248, 0x724a, 0x7e4c, 0xfd54, 0x375f, 0xfd55, 0xfd56, + 0xfd58, 0xfd57, 0x7250, 0x724f, 0x724e, 0xfd51, 0x3033, 0xfd5c, + 0x7e4d, 0xfd5a, 0x7e4e, + /* 0x9C00 */ + 0x7e4f, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, + 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0xfd5e, 0xfd5f, 0xfd60, + 0xfd61, 0x725c, 0xfd62, 0x725f, 0xfd63, 0x7e50, 0x725e, 0x725d, + 0xfd64, 0xfd65, 0xfd66, 0x4949, 0x725b, 0x3073, 0x7260, 0xfd68, + 0x7262, 0xfd69, 0xfd6a, 0x336f, 0x724d, 0x3137, 0x7264, + /* 0x9C40 */ + 0x7e51, 0xfd6b, 0x7263, 0x7261, 0x432d, 0xfd6e, 0xfd6f, 0x7e52, + 0x7e53, 0x4b70, 0x7e54, 0xfd71, 0x4e5a, 0xfd72, 0x7265, 0xfd73, + 0xfd6c, 0xfd74, 0xfd75, 0x7266, 0x7e55, 0x7e56, 0x7267, 0xfd76, + 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0x7268, + 0x7e57, 0x7269, 0xfd7e, + /* 0x9CC0 */ + 0x443b, 0xfe21, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0xfe22, + 0x4b31, 0x4c44, 0x4650, + /* 0x9D00 */ + 0xfe24, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0xfe23, 0x322a, + 0xfe26, 0x7279, 0x7278, 0xfe27, 0xfe28, 0x3175, 0x7e58, 0x7e59, + 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0xfe2c, + 0x3963, 0x727c, 0x727b, + /* 0x9D40 */ + 0x727a, 0xfe2e, 0x7e5a, 0x7277, 0x727d, 0x7e5b, 0x727e, 0xfe2f, + 0x7325, 0x7324, 0x7e5c, 0x7326, 0x312d, 0x7321, 0x7322, 0xfe30, + 0x3974, 0x4c39, 0xfe31, 0x7e5d, 0x7323, 0xfe33, 0xfe34, 0x4b32, + 0x732b, 0x7e5e, 0x7327, 0xfe36, 0xfe37, 0xfe38, 0x732c, 0x7e5f, + 0xfe39, + /* 0x9D80 */ + 0xfe3a, 0x7329, 0x7328, 0x7e60, 0xfe3b, 0x375c, 0x7e61, 0xfe3c, + 0x732d, 0xfe3d, 0x732e, 0x732f, 0x732a, 0x7e63, 0x7274, 0x7330, + 0x4461, 0xfe3f, 0x7334, 0xfe40, 0x7335, 0x7333, 0x7e64, 0xfe41, + 0xfe3e, + /* 0x9DC0 */ + 0x7e62, 0x7332, 0x7338, 0xfe42, 0x7331, 0x7336, 0xfe43, 0xfe44, + 0x7337, 0x733a, 0xfe45, 0x7e65, 0x7339, 0xfe46, 0xfe47, 0xfe48, + 0xfe49, 0x733c, 0x7e67, 0x733d, 0x733e, 0x4f49, 0xfe4a, 0x733b, + 0x426b, 0x3a6d, 0x733f, + /* 0x9E00 */ + 0xfe4d, 0x7e68, 0xfe4c, 0xfe4e, 0x7e69, 0xfe4f, 0x7340, 0x7341, + 0xfe50, 0xfe51, 0x7342, + /* 0x9E40 */ + 0x7343, 0x3834, 0x7344, 0xfe52, 0x7e6a, 0x7345, 0x3c2f, + /* 0x9E80 */ + 0xfe54, 0x7346, 0xfe55, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, + 0x4f3c, 0x734b, 0x4e6f, 0xfe56, 0x734d, 0x7e6b, 0x4e5b, 0x7e6c, + 0x734e, 0x477e, 0xfe57, 0x734f, 0x7351, 0x7e6d, 0x7352, 0x7e6e, + 0x7e6f, 0x7e70, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0xfe59, + 0x5d60, 0x4b7b, + /* 0x9EC0 */ + 0x7e71, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x7e72, + 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, + 0xfe5b, 0x735c, 0x735d, 0xfe5c, 0x735e, 0xfe5d, 0x735f, 0x7360, + 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0xfe5e, + /* 0x9F00 */ + 0xfe5f, 0xfe61, 0x7367, 0x7368, 0x4524, 0x7e73, 0x385d, 0x736a, + 0xfe62, 0xfe63, 0x414d, 0x736b, 0x736c, 0xfe64, 0xfe65, 0x7e74, + 0xfe66, 0x4921, 0xfe67, 0x736d, + /* 0x9F40 */ + 0xfe68, 0xfe69, 0xfe6a, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, + 0xfe6b, 0x7370, 0xfe6c, 0x7e75, 0xfe6d, 0xfe6f, 0x7372, 0x7373, + 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0xfe71, 0x7378, 0x7377, + 0xfe73, 0xfe74, 0x737a, 0xfe75, 0x737b, 0x7379, + /* 0x9F80 */ + 0x4e36, 0x7e76, 0x7e77, 0x737c, 0x7e78, 0x737d, 0x6354, 0x737e, + 0x7e79, + /* 0xF900 */ + 0x763b, 0x742e, 0x754e, 0x7b4f, + /* 0xF940 */ + 0x7649, + /* 0xF9C0 */ + 0x7e24, 0x7d5d, + /* 0xFA00 */ + 0x2f4b, 0x2f57, 0x4f72, 0xae79, 0x757a, 0x775a, 0x776f, 0x793c, + 0x793d, 0x7941, 0x7b3a, 0xf738, 0xf745, 0x7c2e, 0xf96e, 0x7c6a, + 0x2e38, 0x2e49, 0x2e50, 0x2e63, 0x2e68, 0x2e6e, 0x2f2c, 0x2f2f, + 0x2f36, 0x2f5a, 0x2f5e, 0x4f61, 0x4f62, 0x7450, 0x745c, 0x745e, + /* 0xFA40 */ + 0x7461, 0x7528, 0x752b, 0x7543, 0x7565, 0x7669, 0x7677, 0x7725, + 0x7755, 0xf029, 0x7825, 0x7927, 0x7933, 0x7934, 0x7937, 0x7938, + 0x7939, 0x793b, 0x793f, 0x7940, 0x794d, 0x7951, 0x7964, 0x7a2e, + 0xf450, 0x7a33, 0x7a3a, 0x7a44, 0x7a58, 0xf574, 0xf575, 0x7b27, + 0x7b6f, 0x7b79, 0x7c2f, 0x7c30, 0x7c38, 0x7c3d, 0xf969, 0x7c59, + 0x7d63, 0x7d76, 0x7d7b, + /* 0xFE40 */ + 0x233e, 0x233d, + /* 0xFF00 */ + 0x212a, 0x2230, 0x2174, 0x2170, 0x2173, 0x2175, 0x222f, 0x214a, + 0x214b, 0x2176, 0x215c, 0x2124, 0x2231, 0x2125, 0x213f, 0x2330, + 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, + 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, + 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, + 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, + 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, + 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, + /* 0xFF40 */ + 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, + 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, + 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, + 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2232, 0x2256, + 0x2257, + /* 0xFFC0 */ + 0x2131, 0x216f, + /* 0x20000 */ + 0x2e22, + /* 0x20080 */ + 0xa121, 0xa12b, 0xa12e, + /* 0x20180 */ + 0xa136, + /* 0x20200 */ + 0xa146, + /* 0x20300 */ + 0xa170, + /* 0x20340 */ + 0xa179, + /* 0x20380 */ + 0xa177, + /* 0x203C0 */ + 0xa322, + /* 0x20440 */ + 0xa325, + /* 0x20500 */ + 0xa327, + /* 0x205C0 */ + 0xa331, + /* 0x20600 */ + 0xa332, + /* 0x20740 */ + 0xa338, + /* 0x20800 */ + 0xa33f, 0xa341, + /* 0x20880 */ + 0xa34a, + /* 0x20940 */ + 0xa352, + /* 0x20980 */ + 0xa353, + /* 0x20AC0 */ + 0xa359, + /* 0x20B00 */ + 0xa35c, + /* 0x20B80 */ + 0x4f54, + /* 0x20D40 */ + 0xa377, + /* 0x20DC0 */ + 0xa42a, + /* 0x20E40 */ + 0xa43a, 0xa432, + /* 0x20E80 */ + 0xa431, + /* 0x20F40 */ + 0xa43d, + /* 0x21200 */ + 0xa459, 0x2f42, + /* 0x21240 */ + 0xa45c, 0xa463, 0xa45e, + /* 0x212C0 */ + 0xa46b, 0xa46a, 0xa472, + /* 0x21300 */ + 0x2f4c, 0xa474, + /* 0x21340 */ + 0xa475, + /* 0x213C0 */ + 0xa525, + /* 0x21440 */ + 0xa532, 0x2f60, + /* 0x215C0 */ + 0xa53e, + /* 0x21640 */ + 0xa547, + /* 0x21680 */ + 0x4f63, + /* 0x21700 */ + 0xa555, + /* 0x21740 */ + 0xa556, + /* 0x21880 */ + 0x2f7b, + /* 0x219C0 */ + 0xa57e, + /* 0x21C40 */ + 0xa830, + /* 0x21D00 */ + 0xa837, + /* 0x21D40 */ + 0xa838, 0xa83b, 0xa83a, + /* 0x21D80 */ + 0xa845, 0xa840, 0xa83f, 0xa848, + /* 0x21DC0 */ + 0xa84a, + /* 0x21E00 */ + 0xa84b, 0x4f6e, + /* 0x21F00 */ + 0xa85b, + /* 0x21F40 */ + 0xa866, + /* 0x21FC0 */ + 0xa86c, + /* 0x22140 */ + 0xac22, + /* 0x22200 */ + 0xfe53, + /* 0x22300 */ + 0xac2b, + /* 0x22380 */ + 0xac30, + /* 0x226C0 */ + 0xac50, + /* 0x22840 */ + 0xac65, + /* 0x22880 */ + 0xac6d, + /* 0x22980 */ + 0xac72, + /* 0x22A80 */ + 0xad24, + /* 0x22B40 */ + 0xad32, 0xad29, 0xad2a, + /* 0x22B80 */ + 0xad35, + /* 0x22C00 */ + 0xad34, 0xad39, + /* 0x22DC0 */ + 0xad56, + /* 0x23180 */ + 0xae24, + /* 0x231C0 */ + 0xad7d, 0x753a, 0xae23, + /* 0x23340 */ + 0xae3a, + /* 0x233C0 */ + 0xae42, 0xae3d, 0xae3c, 0xae44, 0xae47, 0xae49, 0xae43, + /* 0x23440 */ + 0xae55, 0xae57, 0xae56, 0xae5b, + /* 0x234C0 */ + 0xae77, + /* 0x23540 */ + 0xae78, + /* 0x23580 */ + 0xaf2a, + /* 0x235C0 */ + 0x7572, + /* 0x23600 */ + 0xaf42, 0xaf3f, 0xaf43, + /* 0x23640 */ + 0xaf40, + /* 0x23700 */ + 0xaf59, 0xaf4e, 0x7629, + /* 0x23740 */ + 0x7632, 0xaf61, + /* 0x237C0 */ + 0xaf6a, 0xaf69, + /* 0x23800 */ + 0xaf70, 0xaf75, + /* 0x23A80 */ + 0xee23, + /* 0x23C40 */ + 0xee34, + /* 0x23CC0 */ + 0x7660, + /* 0x23D00 */ + 0xee49, 0xf475, + /* 0x23D40 */ + 0xee5c, + /* 0x23DC0 */ + 0xee60, 0xee5f, 0xee5e, + /* 0x23F40 */ + 0xef32, + /* 0x24080 */ + 0xef47, + /* 0x24100 */ + 0xef4d, + /* 0x241C0 */ + 0xef61, 0xef64, + /* 0x24380 */ + 0xf022, + /* 0x24600 */ + 0xf033, + /* 0x24680 */ + 0xf039, + /* 0x247C0 */ + 0x776c, + /* 0x24880 */ + 0xf053, + /* 0x24A40 */ + 0xf07b, + /* 0x24B40 */ + 0xf12e, 0xf130, + /* 0x24C00 */ + 0xf135, + /* 0x24D00 */ + 0xf144, + /* 0x24E00 */ + 0xf15d, 0xf161, + /* 0x24E40 */ + 0xf166, + /* 0x24E80 */ + 0xf169, + /* 0x25040 */ + 0xf175, 0xf177, + /* 0x25100 */ + 0xf17a, + /* 0x25180 */ + 0xf221, + /* 0x251C0 */ + 0xf224, 0xf223, + /* 0x25200 */ + 0xf228, + /* 0x25240 */ + 0xf22c, + /* 0x25400 */ + 0xf23d, + /* 0x25480 */ + 0x787e, + /* 0x254C0 */ + 0xf248, + /* 0x25500 */ + 0x7929, + /* 0x25580 */ + 0xf25b, + /* 0x25740 */ + 0x7947, + /* 0x25780 */ + 0xf275, 0xf276, + /* 0x259C0 */ + 0x7954, 0xf332, + /* 0x25AC0 */ + 0xf33e, 0xf33d, 0xf340, + /* 0x25B80 */ + 0xf352, + /* 0x25C40 */ + 0xf35d, 0xf35e, + /* 0x25D80 */ + 0x796e, + /* 0x25E00 */ + 0xf373, + /* 0x25E40 */ + 0xf374, 0xf377, 0xf375, + /* 0x25EC0 */ + 0xf37d, 0xf37b, 0xf422, + /* 0x25F00 */ + 0xf424, + /* 0x25F40 */ + 0xf427, + /* 0x25FC0 */ + 0xf42f, 0xf42e, 0xf435, + /* 0x26000 */ + 0xf434, 0xf43d, + /* 0x26040 */ + 0xf442, + /* 0x260C0 */ + 0xf44f, + /* 0x26240 */ + 0xf469, + /* 0x26280 */ + 0xf46b, + /* 0x26340 */ + 0xf472, + /* 0x26400 */ + 0xf479, + /* 0x26640 */ + 0xf535, + /* 0x26680 */ + 0xf53a, + /* 0x26700 */ + 0xf546, + /* 0x268C0 */ + 0xf556, 0xf558, + /* 0x26940 */ + 0xf55a, 0xf55d, + /* 0x269C0 */ + 0xf55f, + /* 0x26A00 */ + 0xf563, + /* 0x26A40 */ + 0xf56a, + /* 0x26A80 */ + 0xf570, 0xf573, + /* 0x26AC0 */ + 0x7a5d, + /* 0x26C00 */ + 0xa544, + /* 0x26C40 */ + 0xf644, + /* 0x26CC0 */ + 0xf64e, + /* 0x26E40 */ + 0x7b33, 0xf65d, + /* 0x26F80 */ + 0xf675, + /* 0x26FC0 */ + 0xf721, 0xf722, 0xf67e, + /* 0x270C0 */ + 0x7b49, + /* 0x27100 */ + 0xf733, 0xf736, + /* 0x273C0 */ + 0xf765, 0xf764, 0xf76b, + /* 0x27400 */ + 0xf76e, + /* 0x27440 */ + 0xf773, + /* 0x27600 */ + 0xf82a, 0xf829, 0xf82c, + /* 0x27680 */ + 0x7b6c, 0xf834, + /* 0x27700 */ + 0xf83c, 0xf83e, + /* 0x27740 */ + 0xf842, + /* 0x27980 */ + 0xf856, + /* 0x27A80 */ + 0xf863, + /* 0x27B80 */ + 0xf877, 0xf879, + /* 0x27BC0 */ + 0xf87a, + /* 0x27C80 */ + 0xf925, + /* 0x27D80 */ + 0xf92f, + /* 0x27E00 */ + 0xf932, + /* 0x27F80 */ + 0xf939, + /* 0x28080 */ + 0xf942, 0xf948, + /* 0x28240 */ + 0x7c49, + /* 0x28280 */ + 0xf959, + /* 0x282C0 */ + 0xf95e, + /* 0x283C0 */ + 0x7c51, + /* 0x28400 */ + 0xf966, + /* 0x28440 */ + 0xf96b, + /* 0x28540 */ + 0xf97a, + /* 0x285C0 */ + 0xf97e, 0xfa21, + /* 0x286C0 */ + 0xfa2c, 0xfa2f, + /* 0x28940 */ + 0xfa50, 0xfa4f, 0xfa57, + /* 0x28980 */ + 0xfa65, 0xfa66, 0xfa71, 0xfa72, + /* 0x28A00 */ + 0xfa7e, 0xfb21, + /* 0x28A40 */ + 0xfb2d, 0xfb2c, + /* 0x28A80 */ + 0xfb36, + /* 0x28AC0 */ + 0xfb37, 0xfb3e, 0xfb3d, + /* 0x28BC0 */ + 0xfb4e, 0xfb4f, + /* 0x28D00 */ + 0xfb57, + /* 0x28D40 */ + 0xfb5a, + /* 0x28DC0 */ + 0xfb5c, + /* 0x28E00 */ + 0xfb5d, 0xfb61, + /* 0x28E80 */ + 0xfb65, + /* 0x28EC0 */ + 0xfb67, + /* 0x28F00 */ + 0xfb69, + /* 0x28FC0 */ + 0xfb71, + /* 0x29280 */ + 0xfc22, 0xfc23, + /* 0x29480 */ + 0xfc38, + /* 0x295C0 */ + 0xfc42, + /* 0x29640 */ + 0xfc4c, + /* 0x296C0 */ + 0xfc56, + /* 0x29700 */ + 0xfc59, + /* 0x29740 */ + 0xfc5d, + /* 0x298C0 */ + 0xfc76, + /* 0x29A40 */ + 0xfd2c, + /* 0x29DC0 */ + 0xfd4b, + /* 0x29E00 */ + 0xfd59, 0xfd4c, + /* 0x29E40 */ + 0xfd5d, + /* 0x29E80 */ + 0xfd5b, + /* 0x29EC0 */ + 0xfd67, 0xfd70, 0xfd6d, + /* 0x29FC0 */ + 0xfe25, + /* 0x2A000 */ + 0xfe2b, 0xfe29, + /* 0x2A080 */ + 0xfe35, + /* 0x2A0C0 */ + 0xfe32, + /* 0x2A180 */ + 0x7e66, + /* 0x2A380 */ + 0xfe58, + /* 0x2A400 */ + 0xfe5a, + /* 0x2A5C0 */ + 0xfe6e, + /* 0x2A600 */ + 0xfe70, 0xfe72, + /* 0x2A680 */ + 0xfe76, +}; + +static const Summary16 jisx0213_from_ucs_level2_2indx[] = { + /* 0x0080 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xffdf }, { 15, 0xffdf }, + /* 0x00C0 */ + { 30, 0xffff }, { 46, 0xffff }, { 62, 0xffff }, { 78, 0xffff }, + /* 0x0100 */ + { 94, 0xf3ff }, { 108, 0x3f0e }, { 117, 0x0cb0 }, { 122, 0x6630 }, + /* 0x0140 */ + { 128, 0x399e }, { 137, 0xff3f }, { 151, 0xfc3f }, { 163, 0x7e03 }, + /* 0x0180 */ + { 171, 0x0000 }, { 171, 0x0008 }, { 172, 0x0000 }, { 172, 0x0000 }, + /* 0x01C0 */ + { 172, 0x6004 }, { 175, 0x1557 }, { 183, 0x0000 }, { 183, 0x2300 }, + /* 0x0240 */ + { 186, 0x0000 }, { 186, 0xd7ff }, { 200, 0xf1f3 }, { 211, 0x6e2f }, + /* 0x0280 */ + { 221, 0x7f1e }, { 232, 0x2137 }, { 239, 0x0006 }, { 241, 0x0000 }, + /* 0x02C0 */ + { 241, 0x1180 }, { 244, 0x6b03 }, { 251, 0x03e0 }, { 256, 0x0000 }, + /* 0x0300 */ + { 256, 0x995f }, { 266, 0xf700 }, { 273, 0x9631 }, { 280, 0x3e11 }, + /* 0x0340 */ + { 287, 0x0000 }, { 287, 0x0000 }, { 287, 0x0002 }, { 288, 0x0000 }, + /* 0x0380 */ + { 288, 0x0000 }, { 288, 0xfffe }, { 303, 0x03fb }, { 312, 0xfffe }, + /* 0x03C0 */ + { 327, 0x03ff }, { 337, 0x0000 }, { 337, 0x0000 }, { 337, 0x0000 }, + /* 0x0400 */ + { 337, 0x0002 }, { 338, 0xffff }, { 354, 0xffff }, { 370, 0xffff }, + /* 0x0440 */ + { 386, 0xffff }, { 402, 0x0002 }, { 403, 0x0000 }, { 403, 0x0000 }, + /* 0x1E00 */ + { 403, 0x0000 }, { 403, 0x0000 }, { 403, 0x0000 }, { 403, 0xc000 }, + /* 0x1F40 */ + { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x000f }, + /* 0x2000 */ + { 409, 0x0000 }, { 409, 0x3359 }, { 417, 0x0067 }, { 422, 0x980d }, + /* 0x2040 */ + { 428, 0x0384 }, { 432, 0x0002 }, { 433, 0x0000 }, { 433, 0x0000 }, + /* 0x2080 */ + { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x1000 }, { 434, 0x0000 }, + /* 0x2100 */ + { 434, 0x8008 }, { 436, 0x0048 }, { 438, 0x0882 }, { 441, 0x0020 }, + /* 0x2140 */ + { 442, 0x0000 }, { 442, 0x0038 }, { 445, 0x0fff }, { 457, 0x0fff }, + /* 0x2180 */ + { 469, 0x0000 }, { 469, 0x03df }, { 478, 0x0000 }, { 478, 0x0000 }, + /* 0x21C0 */ + { 478, 0x0010 }, { 479, 0x0014 }, { 481, 0x03c0 }, { 485, 0x0000 }, + /* 0x2200 */ + { 485, 0x0bad }, { 493, 0xe40c }, { 499, 0x5fe1 }, { 509, 0x2030 }, + /* 0x2240 */ + { 512, 0x0128 }, { 515, 0x0004 }, { 516, 0x0cc7 }, { 523, 0x00c0 }, + /* 0x2280 */ + { 525, 0x0cfc }, { 533, 0x00e0 }, { 536, 0x0020 }, { 537, 0x8000 }, + /* 0x22C0 */ + { 538, 0x0000 }, { 538, 0x0c00 }, { 540, 0x0000 }, { 540, 0x0000 }, + /* 0x2300 */ + { 540, 0x0060 }, { 542, 0x0104 }, { 544, 0x0000 }, { 544, 0x0000 }, + /* 0x2380 */ + { 544, 0x0000 }, { 544, 0x0000 }, { 544, 0x0000 }, { 544, 0xc000 }, + /* 0x23C0 */ + { 546, 0x5fff }, { 560, 0x0000 }, { 560, 0x0000 }, { 560, 0x0000 }, + /* 0x2400 */ + { 560, 0x0000 }, { 560, 0x0000 }, { 560, 0x0008 }, { 561, 0x0000 }, + /* 0x2440 */ + { 561, 0x0000 }, { 561, 0x0000 }, { 561, 0xffff }, { 577, 0x000f }, + /* 0x24C0 */ + { 581, 0x0000 }, { 581, 0xffff }, { 597, 0xfbff }, { 612, 0x7fff }, + /* 0x2500 */ + { 627, 0x900f }, { 633, 0x3999 }, { 641, 0x9939 }, { 649, 0x9999 }, + /* 0x2540 */ + { 657, 0x0804 }, { 659, 0x0000 }, { 659, 0x0000 }, { 659, 0x0000 }, + /* 0x2580 */ + { 659, 0x0000 }, { 659, 0x0000 }, { 659, 0x0003 }, { 661, 0x30ce }, + /* 0x25C0 */ + { 668, 0xcac3 }, { 676, 0x000f }, { 680, 0x8040 }, { 682, 0x0000 }, + /* 0x2600 */ + { 682, 0x406f }, { 689, 0x40c0 }, { 692, 0x0000 }, { 692, 0x0000 }, + /* 0x2640 */ + { 692, 0x0005 }, { 694, 0x0000 }, { 694, 0xffff }, { 710, 0x0000 }, + /* 0x2700 */ + { 710, 0x0000 }, { 710, 0x0008 }, { 711, 0x0000 }, { 711, 0x0000 }, + /* 0x2740 */ + { 711, 0x0000 }, { 711, 0x0040 }, { 712, 0x0000 }, { 712, 0xffc0 }, + /* 0x2900 */ + { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0030 }, + /* 0x2980 */ + { 724, 0x0000 }, { 724, 0x0000 }, { 724, 0x0000 }, { 724, 0x8000 }, + /* 0x29C0 */ + { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0c00 }, + /* 0x3000 */ + { 727, 0xffef }, { 742, 0xb3ff }, { 755, 0x0001 }, { 756, 0x3838 }, + /* 0x3040 */ + { 762, 0xfffe }, { 777, 0xffff }, { 793, 0xffff }, { 809, 0xffff }, + /* 0x3080 */ + { 825, 0xffff }, { 841, 0xf87f }, { 853, 0xffff }, { 869, 0xffff }, + /* 0x30C0 */ + { 885, 0xffff }, { 901, 0xffff }, { 917, 0xffff }, { 933, 0xffff }, + /* 0x31C0 */ + { 949, 0x0000 }, { 949, 0x0000 }, { 949, 0x0000 }, { 949, 0xffff }, + /* 0x3200 */ + { 965, 0x0000 }, { 965, 0x0000 }, { 965, 0x0000 }, { 965, 0x0206 }, + /* 0x3240 */ + { 968, 0x0000 }, { 968, 0xfffe }, { 983, 0x0000 }, { 983, 0x0000 }, + /* 0x3280 */ + { 983, 0x0000 }, { 983, 0x0000 }, { 983, 0x01f0 }, { 988, 0xfffe }, + /* 0x32C0 */ + { 1003, 0x0000 }, { 1003, 0xffff }, { 1019, 0x322f }, { 1027, 0x0400 }, + /* 0x3300 */ + { 1028, 0x2008 }, { 1030, 0x0110 }, { 1032, 0x08cc }, { 1037, 0x0840 }, + /* 0x3340 */ + { 1039, 0x2600 }, { 1042, 0x0082 }, { 1044, 0x0000 }, { 1044, 0x7800 }, + /* 0x3380 */ + { 1048, 0xc000 }, { 1050, 0x7000 }, { 1053, 0x0002 }, { 1054, 0x0000 }, + /* 0x33C0 */ + { 1054, 0x2810 }, { 1057, 0x0000 }, { 1057, 0x0000 }, { 1057, 0x0000 }, + /* 0x3400 */ + { 1057, 0x0044 }, { 1059, 0x0000 }, { 1059, 0x5000 }, { 1061, 0x0000 }, + /* 0x3440 */ + { 1061, 0x0000 }, { 1061, 0x0000 }, { 1061, 0x0500 }, { 1063, 0x0000 }, + /* 0x3480 */ + { 1063, 0x0000 }, { 1063, 0x0004 }, { 1064, 0x0000 }, { 1064, 0x1020 }, + /* 0x34C0 */ + { 1066, 0x0082 }, { 1068, 0x0800 }, { 1069, 0x0000 }, { 1069, 0x0000 }, + /* 0x3500 */ + { 1069, 0x0000 }, { 1069, 0x8000 }, { 1070, 0x0000 }, { 1070, 0x0000 }, + /* 0x3540 */ + { 1070, 0x0000 }, { 1070, 0x6000 }, { 1072, 0x4008 }, { 1074, 0x0000 }, + /* 0x3580 */ + { 1074, 0x0000 }, { 1074, 0x0000 }, { 1074, 0x0140 }, { 1076, 0x0000 }, + /* 0x35C0 */ + { 1076, 0x0020 }, { 1077, 0x0400 }, { 1078, 0x0000 }, { 1078, 0x0010 }, + /* 0x3600 */ + { 1079, 0x0020 }, { 1080, 0x0000 }, { 1080, 0x0000 }, { 1080, 0x0000 }, + /* 0x3640 */ + { 1080, 0x0400 }, { 1081, 0x0000 }, { 1081, 0x0000 }, { 1081, 0x0000 }, + /* 0x3680 */ + { 1081, 0x0000 }, { 1081, 0x0242 }, { 1084, 0x0000 }, { 1084, 0x0000 }, + /* 0x36C0 */ + { 1084, 0x8000 }, { 1085, 0x0000 }, { 1085, 0x0000 }, { 1085, 0x0000 }, + /* 0x3740 */ + { 1085, 0x0000 }, { 1085, 0x0000 }, { 1085, 0x1806 }, { 1089, 0x0020 }, + /* 0x3780 */ + { 1090, 0x2000 }, { 1091, 0x0000 }, { 1091, 0x0000 }, { 1091, 0x0000 }, + /* 0x37C0 */ + { 1091, 0x0002 }, { 1092, 0x0000 }, { 1092, 0x0104 }, { 1094, 0x2010 }, + /* 0x3800 */ + { 1096, 0x0001 }, { 1097, 0x0000 }, { 1097, 0x8000 }, { 1098, 0x0040 }, + /* 0x3840 */ + { 1099, 0x0001 }, { 1100, 0x1000 }, { 1101, 0x0002 }, { 1102, 0x0000 }, + /* 0x38C0 */ + { 1102, 0x0000 }, { 1102, 0x0000 }, { 1102, 0x0000 }, { 1102, 0x0400 }, + /* 0x3900 */ + { 1103, 0x0000 }, { 1103, 0x0480 }, { 1105, 0x0000 }, { 1105, 0x0000 }, + /* 0x3940 */ + { 1105, 0x0000 }, { 1105, 0x0000 }, { 1105, 0x8000 }, { 1106, 0x0000 }, + /* 0x3A40 */ + { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x4000 }, { 1107, 0x0008 }, + /* 0x3AC0 */ + { 1108, 0x0000 }, { 1108, 0x00c0 }, { 1110, 0x0400 }, { 1111, 0x0000 }, + /* 0x3B00 */ + { 1111, 0x4000 }, { 1112, 0x1400 }, { 1114, 0x0004 }, { 1115, 0x0000 }, + /* 0x3B40 */ + { 1115, 0x0000 }, { 1115, 0x0000 }, { 1115, 0x2000 }, { 1116, 0x0080 }, + /* 0x3B80 */ + { 1117, 0x2180 }, { 1120, 0x0000 }, { 1120, 0x0010 }, { 1121, 0x0040 }, + /* 0x3BC0 */ + { 1122, 0x2008 }, { 1124, 0x0000 }, { 1124, 0x0000 }, { 1124, 0x0001 }, + /* 0x3C00 */ + { 1125, 0x8000 }, { 1126, 0x0000 }, { 1126, 0x0040 }, { 1127, 0x0000 }, + /* 0x3CC0 */ + { 1127, 0x0008 }, { 1128, 0x0004 }, { 1129, 0x0000 }, { 1129, 0x0000 }, + /* 0x3D00 */ + { 1129, 0x0000 }, { 1129, 0x4002 }, { 1131, 0x0000 }, { 1131, 0x0000 }, + /* 0x3D40 */ + { 1131, 0x0000 }, { 1131, 0x0000 }, { 1131, 0x0010 }, { 1132, 0x0000 }, + /* 0x3D80 */ + { 1132, 0x0000 }, { 1132, 0x0400 }, { 1133, 0x0000 }, { 1133, 0x0000 }, + /* 0x3DC0 */ + { 1133, 0x0001 }, { 1134, 0x0010 }, { 1135, 0x0000 }, { 1135, 0x0000 }, + /* 0x3E00 */ + { 1135, 0x0020 }, { 1136, 0x0000 }, { 1136, 0x0000 }, { 1136, 0x8000 }, + /* 0x3E40 */ + { 1137, 0x0000 }, { 1137, 0x0000 }, { 1137, 0x0141 }, { 1140, 0x0000 }, + /* 0x3E80 */ + { 1140, 0x0008 }, { 1141, 0x0010 }, { 1142, 0x0000 }, { 1142, 0x0000 }, + /* 0x3F40 */ + { 1142, 0x0000 }, { 1142, 0x0080 }, { 1143, 0x0000 }, { 1143, 0x00a4 }, + /* 0x3F80 */ + { 1146, 0x0000 }, { 1146, 0x0000 }, { 1146, 0x4000 }, { 1147, 0x0000 }, + /* 0x3FC0 */ + { 1147, 0x0200 }, { 1148, 0x0080 }, { 1149, 0x0000 }, { 1149, 0x0000 }, + /* 0x4000 */ + { 1149, 0x0000 }, { 1149, 0x0000 }, { 1149, 0x0000 }, { 1149, 0x0200 }, + /* 0x4040 */ + { 1150, 0x0000 }, { 1150, 0x0100 }, { 1151, 0x0000 }, { 1151, 0x0000 }, + /* 0x4080 */ + { 1151, 0x0000 }, { 1151, 0x0008 }, { 1152, 0x0000 }, { 1152, 0x0000 }, + /* 0x4100 */ + { 1152, 0x0020 }, { 1153, 0x0000 }, { 1153, 0x0000 }, { 1153, 0x0000 }, + /* 0x4140 */ + { 1153, 0x8100 }, { 1155, 0x0000 }, { 1155, 0x0008 }, { 1156, 0x0000 }, + /* 0x4180 */ + { 1156, 0x0000 }, { 1156, 0x0000 }, { 1156, 0x0000 }, { 1156, 0x8010 }, + /* 0x41C0 */ + { 1158, 0x0000 }, { 1158, 0x0000 }, { 1158, 0x4040 }, { 1160, 0x0008 }, + /* 0x4200 */ + { 1161, 0x4080 }, { 1163, 0x0000 }, { 1163, 0x0000 }, { 1163, 0x0000 }, + /* 0x4240 */ + { 1163, 0x0000 }, { 1163, 0x0000 }, { 1163, 0x0010 }, { 1164, 0x0000 }, + /* 0x42C0 */ + { 1164, 0x0040 }, { 1165, 0x2040 }, { 1167, 0x0000 }, { 1167, 0x0000 }, + /* 0x4300 */ + { 1167, 0x0004 }, { 1168, 0x0000 }, { 1168, 0x0800 }, { 1169, 0x0000 }, + /* 0x4340 */ + { 1169, 0x0008 }, { 1170, 0x0000 }, { 1170, 0x0000 }, { 1170, 0x0000 }, + /* 0x43C0 */ + { 1170, 0x0000 }, { 1170, 0x0000 }, { 1170, 0x4000 }, { 1171, 0x0001 }, + /* 0x4400 */ + { 1172, 0x0100 }, { 1173, 0x1080 }, { 1175, 0x0004 }, { 1176, 0x0000 }, + /* 0x4440 */ + { 1176, 0x0000 }, { 1176, 0x0808 }, { 1178, 0x0000 }, { 1178, 0x0440 }, + /* 0x4480 */ + { 1180, 0x0000 }, { 1180, 0x0002 }, { 1181, 0x0000 }, { 1181, 0x4008 }, + /* 0x44C0 */ + { 1183, 0x0000 }, { 1183, 0x0010 }, { 1184, 0x0000 }, { 1184, 0x0000 }, + /* 0x4500 */ + { 1184, 0x2100 }, { 1186, 0x0000 }, { 1186, 0x0020 }, { 1187, 0x0000 }, + /* 0x4540 */ + { 1187, 0x0008 }, { 1188, 0x0000 }, { 1188, 0x0000 }, { 1188, 0x0000 }, + /* 0x4580 */ + { 1188, 0x0000 }, { 1188, 0x2000 }, { 1189, 0x0000 }, { 1189, 0x0100 }, + /* 0x45C0 */ + { 1190, 0x0000 }, { 1190, 0x0000 }, { 1190, 0x0420 }, { 1192, 0x0000 }, + /* 0x4600 */ + { 1192, 0x8000 }, { 1193, 0x0000 }, { 1193, 0x0000 }, { 1193, 0x0000 }, + /* 0x4640 */ + { 1193, 0x0002 }, { 1194, 0x0000 }, { 1194, 0x0020 }, { 1195, 0x0000 }, + /* 0x4680 */ + { 1195, 0x0000 }, { 1195, 0x0000 }, { 1195, 0x8002 }, { 1197, 0x0000 }, + /* 0x4700 */ + { 1197, 0x1000 }, { 1198, 0x0000 }, { 1198, 0x0000 }, { 1198, 0x0000 }, + /* 0x4740 */ + { 1198, 0x0000 }, { 1198, 0x0000 }, { 1198, 0x0010 }, { 1199, 0x0000 }, + /* 0x47C0 */ + { 1199, 0x0000 }, { 1199, 0x0000 }, { 1199, 0x0000 }, { 1199, 0x2000 }, + /* 0x4800 */ + { 1200, 0x0000 }, { 1200, 0x0040 }, { 1201, 0x0000 }, { 1201, 0x0000 }, + /* 0x4840 */ + { 1201, 0x4010 }, { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0000 }, + /* 0x4880 */ + { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0020 }, + /* 0x4980 */ + { 1204, 0x0000 }, { 1204, 0x0000 }, { 1204, 0x0000 }, { 1204, 0x0001 }, + /* 0x49C0 */ + { 1205, 0x0000 }, { 1205, 0x0000 }, { 1205, 0x0080 }, { 1206, 0x0400 }, + /* 0x4A00 */ + { 1207, 0x0010 }, { 1208, 0x0000 }, { 1208, 0x0200 }, { 1209, 0x0000 }, + /* 0x4A80 */ + { 1209, 0x0000 }, { 1209, 0x0000 }, { 1209, 0x0000 }, { 1209, 0x1000 }, + /* 0x4B00 */ + { 1210, 0x0000 }, { 1210, 0x0000 }, { 1210, 0x0000 }, { 1210, 0x0800 }, + /* 0x4BC0 */ + { 1211, 0x0404 }, { 1213, 0x0004 }, { 1214, 0x0100 }, { 1215, 0x0000 }, + /* 0x4C00 */ + { 1215, 0x0000 }, { 1215, 0x0080 }, { 1216, 0x0001 }, { 1217, 0x0000 }, + /* 0x4CC0 */ + { 1217, 0x0010 }, { 1218, 0x0002 }, { 1219, 0x0000 }, { 1219, 0x0000 }, + /* 0x4D00 */ + { 1219, 0x0080 }, { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0000 }, + /* 0x4D40 */ + { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0080 }, + /* 0x4E00 */ + { 1221, 0xef8f }, { 1233, 0x43f7 }, { 1243, 0xff42 }, { 1253, 0x9b47 }, + /* 0x4E40 */ + { 1262, 0xe9ad }, { 1272, 0xe7e2 }, { 1282, 0x0204 }, { 1284, 0x400a }, + /* 0x4E80 */ + { 1287, 0x7f65 }, { 1298, 0xfb36 }, { 1309, 0x7977 }, { 1320, 0x1e49 }, + /* 0x4EC0 */ + { 1327, 0xeddf }, { 1340, 0xe7f1 }, { 1351, 0x683a }, { 1358, 0xa8e7 }, + /* 0x4F00 */ + { 1367, 0xee0b }, { 1376, 0x3443 }, { 1382, 0x8000 }, { 1383, 0x75d1 }, + /* 0x4F40 */ + { 1392, 0xe3c8 }, { 1400, 0xfffb }, { 1415, 0x9611 }, { 1421, 0xfde9 }, + /* 0x4F80 */ + { 1433, 0xad6c }, { 1442, 0x2dd6 }, { 1451, 0xe803 }, { 1457, 0xc064 }, + /* 0x4FC0 */ + { 1462, 0xce3c }, { 1471, 0xad97 }, { 1481, 0xc07b }, { 1489, 0x456e }, + /* 0x5000 */ + { 1497, 0xea67 }, { 1507, 0xd75f }, { 1519, 0x7ffe }, { 1533, 0x0a40 }, + /* 0x5040 */ + { 1536, 0xc3cf }, { 1546, 0x14e9 }, { 1553, 0x1468 }, { 1558, 0x2175 }, + /* 0x5080 */ + { 1565, 0x2121 }, { 1569, 0x177e }, { 1579, 0x3408 }, { 1583, 0x4cbe }, + /* 0x50C0 */ + { 1592, 0xf6b4 }, { 1602, 0x4673 }, { 1610, 0x62ea }, { 1618, 0x0a2c }, + /* 0x5100 */ + { 1623, 0x0b5f }, { 1632, 0xcdf4 }, { 1642, 0x0402 }, { 1644, 0x9ca4 }, + /* 0x5140 */ + { 1651, 0x7ffb }, { 1665, 0x14b5 }, { 1672, 0x7f25 }, { 1682, 0x19ea }, + /* 0x5180 */ + { 1690, 0xbe6d }, { 1701, 0x23ef }, { 1711, 0x3f7d }, { 1723, 0x30ff }, + /* 0x51C0 */ + { 1733, 0x3e78 }, { 1742, 0x7840 }, { 1747, 0x66c7 }, { 1756, 0x677b }, + /* 0x5200 */ + { 1767, 0x4ddf }, { 1778, 0x20fe }, { 1786, 0x46b0 }, { 1792, 0x0fc9 }, + /* 0x5240 */ + { 1800, 0xbe98 }, { 1809, 0x78f0 }, { 1817, 0x963a }, { 1825, 0xa0bf }, + /* 0x5280 */ + { 1834, 0x239c }, { 1841, 0x891e }, { 1848, 0xbe59 }, { 1858, 0x5e32 }, + /* 0x52C0 */ + { 1866, 0x37aa }, { 1875, 0xebe7 }, { 1887, 0x00dd }, { 1893, 0xcfad }, + /* 0x5300 */ + { 1904, 0xade7 }, { 1915, 0x36e1 }, { 1923, 0x841b }, { 1929, 0xcf2a }, + /* 0x5340 */ + { 1938, 0x27ef }, { 1949, 0x559e }, { 1958, 0xd2cb }, { 1967, 0xadbb }, + /* 0x5380 */ + { 1978, 0x0014 }, { 1980, 0xa548 }, { 1986, 0x6371 }, { 1994, 0x08dd }, + /* 0x53C0 */ + { 2001, 0x7f0d }, { 2011, 0x8ef0 }, { 2019, 0xff3e }, { 2032, 0x05ff }, + /* 0x5400 */ + { 2042, 0xff1a }, { 2053, 0xe807 }, { 2060, 0x7bd1 }, { 2070, 0x7b40 }, + /* 0x5440 */ + { 2077, 0x674d }, { 2086, 0x8022 }, { 2089, 0x1d44 }, { 2095, 0xb8fb }, + /* 0x5480 */ + { 2106, 0xfd51 }, { 2116, 0x1065 }, { 2121, 0xfb77 }, { 2134, 0xf58c }, + /* 0x54C0 */ + { 2143, 0x03df }, { 2152, 0x0100 }, { 2153, 0xf366 }, { 2163, 0xa40e }, + /* 0x5500 */ + { 2169, 0xc2d3 }, { 2177, 0x0051 }, { 2180, 0xc800 }, { 2183, 0x532a }, + /* 0x5540 */ + { 2190, 0x94f3 }, { 2199, 0x70c9 }, { 2206, 0x001b }, { 2210, 0x7800 }, + /* 0x5580 */ + { 2214, 0x4fdf }, { 2226, 0xf702 }, { 2234, 0x7f80 }, { 2242, 0x8041 }, + /* 0x55C0 */ + { 2245, 0x52b0 }, { 2251, 0xb416 }, { 2258, 0x021c }, { 2262, 0x6280 }, + /* 0x5600 */ + { 2266, 0x43c0 }, { 2271, 0x09d1 }, { 2277, 0x8300 }, { 2280, 0xa9d7 }, + /* 0x5640 */ + { 2290, 0x5285 }, { 2296, 0x4809 }, { 2300, 0xbd51 }, { 2309, 0x0556 }, + /* 0x5680 */ + { 2315, 0x95c1 }, { 2322, 0x6630 }, { 2328, 0x7325 }, { 2336, 0x105c }, + /* 0x56C0 */ + { 2341, 0x672f }, { 2351, 0xcd8a }, { 2359, 0x4109 }, { 2363, 0xa6cd }, + /* 0x5700 */ + { 2372, 0xaf19 }, { 2381, 0x916c }, { 2388, 0xa3ca }, { 2396, 0x0999 }, + /* 0x5740 */ + { 2402, 0xf4e5 }, { 2412, 0x0003 }, { 2414, 0x8752 }, { 2421, 0x98b9 }, + /* 0x5780 */ + { 2429, 0x0b04 }, { 2433, 0x7408 }, { 2438, 0x151d }, { 2445, 0x0109 }, + /* 0x57C0 */ + { 2448, 0xd9c9 }, { 2457, 0xd0dc }, { 2465, 0x2059 }, { 2470, 0xbff1 }, + /* 0x5800 */ + { 2482, 0x0e75 }, { 2490, 0x6220 }, { 2494, 0x8493 }, { 2500, 0x2637 }, + /* 0x5840 */ + { 2508, 0x1e03 }, { 2514, 0x4796 }, { 2522, 0x0a96 }, { 2528, 0x5225 }, + /* 0x5880 */ + { 2534, 0xae28 }, { 2541, 0xf099 }, { 2549, 0x4f00 }, { 2554, 0x4f0a }, + /* 0x58C0 */ + { 2561, 0x74aa }, { 2569, 0xd7be }, { 2581, 0xda35 }, { 2590, 0x3e9f }, + /* 0x5900 */ + { 2601, 0xbe64 }, { 2610, 0x1f71 }, { 2619, 0x7eb4 }, { 2629, 0x6186 }, + /* 0x5940 */ + { 2635, 0xc3d0 }, { 2642, 0xadb3 }, { 2652, 0x77a5 }, { 2662, 0x3178 }, + /* 0x5980 */ + { 2669, 0x2c1e }, { 2676, 0xaa4c }, { 2683, 0x5138 }, { 2689, 0x5a04 }, + /* 0x59C0 */ + { 2694, 0x2b48 }, { 2700, 0x761f }, { 2710, 0x4df8 }, { 2719, 0x8940 }, + /* 0x5A00 */ + { 2723, 0x320a }, { 2728, 0x958a }, { 2735, 0xa2a9 }, { 2742, 0x1060 }, + /* 0x5A40 */ + { 2745, 0x0243 }, { 2749, 0x0420 }, { 2751, 0x34e4 }, { 2758, 0xc480 }, + /* 0x5A80 */ + { 2762, 0x0810 }, { 2764, 0xdc04 }, { 2770, 0x0085 }, { 2773, 0xf42a }, + /* 0x5AC0 */ + { 2781, 0x1a16 }, { 2787, 0x14c1 }, { 2792, 0x426b }, { 2799, 0x0c21 }, + /* 0x5B00 */ + { 2803, 0x1b01 }, { 2808, 0x02c0 }, { 2811, 0x3424 }, { 2816, 0x4055 }, + /* 0x5B40 */ + { 2821, 0x102b }, { 2826, 0xbdf7 }, { 2839, 0x8b78 }, { 2847, 0xb52b }, + /* 0x5B80 */ + { 2856, 0xbbbb }, { 2868, 0xbfe8 }, { 2879, 0x507c }, { 2886, 0x8379 }, + /* 0x5BC0 */ + { 2894, 0x52fd }, { 2904, 0xe95d }, { 2914, 0x5bf6 }, { 2925, 0xe56b }, + /* 0x5C00 */ + { 2935, 0xeffe }, { 2949, 0x444e }, { 2955, 0x2b1d }, { 2963, 0xff03 }, + /* 0x5C40 */ + { 2973, 0xed63 }, { 2983, 0xc82b }, { 2990, 0xd3bf }, { 3002, 0x1643 }, + /* 0x5C80 */ + { 3008, 0x9500 }, { 3012, 0x8013 }, { 3016, 0x3fcf }, { 3028, 0x5dea }, + /* 0x5CC0 */ + { 3038, 0x0aa0 }, { 3042, 0x0205 }, { 3045, 0xa703 }, { 3052, 0x2c51 }, + /* 0x5D00 */ + { 3058, 0x68c0 }, { 3063, 0xaff3 }, { 3075, 0x0ad5 }, { 3082, 0x0202 }, + /* 0x5D40 */ + { 3084, 0x5cc4 }, { 3091, 0x100d }, { 3095, 0xb602 }, { 3101, 0x0049 }, + /* 0x5D80 */ + { 3104, 0x1996 }, { 3111, 0x2295 }, { 3117, 0x5095 }, { 3123, 0x3795 }, + /* 0x5DC0 */ + { 3132, 0x3a00 }, { 3136, 0x69ce }, { 3145, 0x4bff }, { 3157, 0x68be }, + /* 0x5E00 */ + { 3166, 0x184d }, { 3172, 0xaf76 }, { 3183, 0xe820 }, { 3188, 0x61c9 }, + /* 0x5E40 */ + { 3195, 0x52b9 }, { 3203, 0xc1f0 }, { 3210, 0x781e }, { 3218, 0xfffc }, + /* 0x5E80 */ + { 3232, 0x849a }, { 3238, 0x14e0 }, { 3243, 0x3ce1 }, { 3251, 0xc3e0 }, + /* 0x5EC0 */ + { 3258, 0x8f4e }, { 3267, 0xae4d }, { 3276, 0x130f }, { 3283, 0xffdb }, + /* 0x5F00 */ + { 3297, 0xff9f }, { 3311, 0xf9fb }, { 3324, 0xa2e8 }, { 3331, 0x71f2 }, + /* 0x5F40 */ + { 3340, 0x55a3 }, { 3348, 0x33da }, { 3357, 0x3ede }, { 3368, 0xf28f }, + /* 0x5F80 */ + { 3378, 0x9fbf }, { 3391, 0x538f }, { 3400, 0xe797 }, { 3411, 0x33b8 }, + /* 0x5FC0 */ + { 3419, 0x3ab8 }, { 3427, 0x73dc }, { 3437, 0xca17 }, { 3445, 0xb92b }, + /* 0x6000 */ + { 3454, 0xe000 }, { 3457, 0x3bf5 }, { 3468, 0x8ff7 }, { 3480, 0x042a }, + /* 0x6040 */ + { 3484, 0x3cce }, { 3493, 0x8625 }, { 3499, 0xbf3d }, { 3511, 0x80a1 }, + /* 0x6080 */ + { 3515, 0x3e1a }, { 3523, 0xecf4 }, { 3533, 0x07c9 }, { 3540, 0x717f }, + /* 0x60C0 */ + { 3551, 0x09e0 }, { 3556, 0xbf3a }, { 3567, 0x418b }, { 3573, 0x0fff }, + /* 0x6100 */ + { 3585, 0xe34b }, { 3594, 0xde2d }, { 3604, 0x1982 }, { 3609, 0xf491 }, + /* 0x6140 */ + { 3617, 0x7dd6 }, { 3628, 0xa728 }, { 3635, 0xc9ad }, { 3644, 0x50fb }, + /* 0x6180 */ + { 3653, 0x6484 }, { 3658, 0x07df }, { 3668, 0x7bb0 }, { 3677, 0x5644 }, + /* 0x61C0 */ + { 3683, 0x3fc8 }, { 3692, 0xa021 }, { 3696, 0x0048 }, { 3698, 0xf5f4 }, + /* 0x6200 */ + { 3709, 0x7701 }, { 3716, 0xec77 }, { 3727, 0xc64e }, { 3735, 0xc91d }, + /* 0x6240 */ + { 3743, 0x7bcb }, { 3754, 0x4d6e }, { 3763, 0xe11b }, { 3771, 0xda4a }, + /* 0x6280 */ + { 3779, 0x063d }, { 3786, 0x5bfe }, { 3798, 0x1840 }, { 3801, 0x3a22 }, + /* 0x62C0 */ + { 3807, 0xb7f4 }, { 3818, 0x3bff }, { 3831, 0xf003 }, { 3837, 0xf0ea }, + /* 0x6300 */ + { 3846, 0x378e }, { 3855, 0x8303 }, { 3860, 0x8980 }, { 3864, 0xfe24 }, + /* 0x6340 */ + { 3873, 0xf21a }, { 3881, 0x12a1 }, { 3886, 0x5ba0 }, { 3893, 0x1cc4 }, + /* 0x6380 */ + { 3899, 0xd319 }, { 3907, 0x8b54 }, { 3914, 0x1faf }, { 3925, 0x6834 }, + /* 0x63C0 */ + { 3931, 0x8259 }, { 3937, 0x1c75 }, { 3945, 0x7a2b }, { 3954, 0x04f4 }, + /* 0x6400 */ + { 3960, 0xa240 }, { 3964, 0x50d9 }, { 3971, 0xb364 }, { 3979, 0x4450 }, + /* 0x6440 */ + { 3983, 0x4004 }, { 3985, 0x2d02 }, { 3990, 0xa281 }, { 3995, 0x2748 }, + /* 0x6480 */ + { 4001, 0x0188 }, { 4004, 0xe42e }, { 4012, 0x6a30 }, { 4018, 0xda05 }, + /* 0x64C0 */ + { 4025, 0x7cb6 }, { 4035, 0x05b5 }, { 4042, 0x90ff }, { 4052, 0xecd6 }, + /* 0x6500 */ + { 4062, 0x8031 }, { 4066, 0x7150 }, { 4072, 0x9e1c }, { 4080, 0xcbf4 }, + /* 0x6540 */ + { 4090, 0xa130 }, { 4095, 0x63f2 }, { 4104, 0x18cc }, { 4110, 0x05b5 }, + /* 0x6580 */ + { 4117, 0x57be }, { 4128, 0xba83 }, { 4136, 0xb8b2 }, { 4144, 0xb3a5 }, + /* 0x65C0 */ + { 4153, 0x9a7e }, { 4163, 0x0a94 }, { 4168, 0x33e7 }, { 4178, 0x1e06 }, + /* 0x6600 */ + { 4184, 0xd7dd }, { 4196, 0xd038 }, { 4202, 0xadb7 }, { 4213, 0x947b }, + /* 0x6640 */ + { 4222, 0xdb3e }, { 4233, 0xee86 }, { 4242, 0xfffe }, { 4257, 0x0dd9 }, + /* 0x6680 */ + { 4265, 0x639b }, { 4274, 0x23c7 }, { 4282, 0x6845 }, { 4288, 0xdb36 }, + /* 0x66C0 */ + { 4298, 0x03d2 }, { 4304, 0x3e40 }, { 4310, 0x1341 }, { 4315, 0xffbd }, + /* 0x6700 */ + { 4329, 0xab2b }, { 4338, 0xeafc }, { 4349, 0x7dc0 }, { 4357, 0xa5da }, + /* 0x6740 */ + { 4366, 0xf3c2 }, { 4375, 0xf25b }, { 4385, 0xa47f }, { 4395, 0xd8ff }, + /* 0x6780 */ + { 4407, 0x1aa2 }, { 4413, 0x3dad }, { 4423, 0x8247 }, { 4429, 0x0bdd }, + /* 0x67C0 */ + { 4438, 0xc55b }, { 4447, 0x6f9f }, { 4459, 0xd294 }, { 4466, 0xdabb }, + /* 0x6800 */ + { 4477, 0x001e }, { 4481, 0xe1c9 }, { 4489, 0x3e06 }, { 4496, 0x7b1e }, + /* 0x6840 */ + { 4506, 0x737f }, { 4518, 0xbabf }, { 4530, 0x4888 }, { 4534, 0xd4f4 }, + /* 0x6880 */ + { 4543, 0xa02e }, { 4549, 0xbfd9 }, { 4561, 0xaded }, { 4572, 0x1e7f }, + /* 0x68C0 */ + { 4583, 0xbf78 }, { 4594, 0x87f5 }, { 4604, 0xf1bb }, { 4615, 0x1e87 }, + /* 0x6900 */ + { 4623, 0xfdbb }, { 4636, 0x1e04 }, { 4641, 0x056e }, { 4648, 0xaa71 }, + /* 0x6940 */ + { 4656, 0x0644 }, { 4660, 0x76b8 }, { 4669, 0xff1f }, { 4682, 0xf7bc }, + /* 0x6980 */ + { 4694, 0x4407 }, { 4699, 0x1976 }, { 4707, 0x60e1 }, { 4713, 0xdc97 }, + /* 0x69C0 */ + { 4723, 0xfc8b }, { 4733, 0x634b }, { 4741, 0xef8c }, { 4751, 0xea7c }, + /* 0x6A00 */ + { 4761, 0x9c24 }, { 4767, 0xeebe }, { 4779, 0x4e0e }, { 4786, 0xef7d }, + /* 0x6A40 */ + { 4799, 0x4bf0 }, { 4807, 0x8b45 }, { 4814, 0x0856 }, { 4819, 0xc50c }, + /* 0x6A80 */ + { 4825, 0x6a19 }, { 4832, 0xf093 }, { 4840, 0x5c2f }, { 4849, 0x2908 }, + /* 0x6AC0 */ + { 4853, 0x004e }, { 4857, 0xfc1b }, { 4867, 0x1590 }, { 4872, 0x2c0e }, + /* 0x6B00 */ + { 4878, 0x8c30 }, { 4883, 0xe8c7 }, { 4892, 0x908b }, { 4898, 0x67a4 }, + /* 0x6B40 */ + { 4906, 0x56c8 }, { 4913, 0x8b59 }, { 4921, 0x96ff }, { 4933, 0x8fb8 }, + /* 0x6B80 */ + { 4942, 0x2e5f }, { 4952, 0x4960 }, { 4957, 0xee10 }, { 4964, 0xfcbe }, + /* 0x6BC0 */ + { 4976, 0xebe1 }, { 4986, 0x8ddc }, { 4995, 0xd8c0 }, { 5001, 0x800a }, + /* 0x6C00 */ + { 5004, 0xc524 }, { 5010, 0x089b }, { 5016, 0x0018 }, { 5018, 0xc5f8 }, + /* 0x6C40 */ + { 5027, 0x6007 }, { 5032, 0xfea1 }, { 5042, 0x2585 }, { 5048, 0x645d }, + /* 0x6C80 */ + { 5056, 0x337e }, { 5066, 0x1ffd }, { 5078, 0x6c06 }, { 5084, 0xff0a }, + /* 0x6CC0 */ + { 5094, 0x1676 }, { 5102, 0x3ef9 }, { 5113, 0xff2f }, { 5126, 0x080b }, + /* 0x6D00 */ + { 5130, 0x5c11 }, { 5136, 0xca84 }, { 5142, 0xcef0 }, { 5151, 0xfb7e }, + /* 0x6D40 */ + { 5164, 0x0032 }, { 5167, 0x5f00 }, { 5173, 0x5679 }, { 5182, 0x0391 }, + /* 0x6D80 */ + { 5187, 0x77a7 }, { 5198, 0x1b3a }, { 5206, 0xdc00 }, { 5211, 0x9134 }, + /* 0x6DC0 */ + { 5217, 0xd9f5 }, { 5228, 0xef67 }, { 5240, 0x5f52 }, { 5249, 0x1eea }, + /* 0x6E00 */ + { 5258, 0x0fa0 }, { 5264, 0xeea8 }, { 5273, 0xfaff }, { 5287, 0x5554 }, + /* 0x6E40 */ + { 5294, 0xff18 }, { 5304, 0xd9da }, { 5314, 0xc888 }, { 5319, 0xc044 }, + /* 0x6E80 */ + { 5323, 0x9005 }, { 5327, 0xb149 }, { 5334, 0x8ca4 }, { 5340, 0xa4d6 }, + /* 0x6EC0 */ + { 5348, 0x5ebe }, { 5359, 0x623a }, { 5366, 0x9800 }, { 5369, 0xcb94 }, + /* 0x6F00 */ + { 5377, 0x9646 }, { 5384, 0x053b }, { 5391, 0x9c2d }, { 5399, 0xd16e }, + /* 0x6F40 */ + { 5408, 0x0022 }, { 5410, 0xdf96 }, { 5421, 0xe157 }, { 5430, 0x7511 }, + /* 0x6F80 */ + { 5437, 0x7157 }, { 5446, 0x81d3 }, { 5453, 0x84bb }, { 5461, 0x526a }, + /* 0x6FC0 */ + { 5468, 0x07cf }, { 5477, 0xcd30 }, { 5484, 0xda13 }, { 5492, 0x566b }, + /* 0x7000 */ + { 5501, 0x8ee3 }, { 5510, 0xed22 }, { 5518, 0x11c8 }, { 5523, 0x5605 }, + /* 0x7040 */ + { 5529, 0x5c88 }, { 5535, 0x6112 }, { 5540, 0xda38 }, { 5548, 0x7161 }, + /* 0x7080 */ + { 5555, 0x4662 }, { 5561, 0x82a4 }, { 5566, 0xf810 }, { 5572, 0x0f8a }, + /* 0x70C0 */ + { 5579, 0x8d00 }, { 5583, 0xb31a }, { 5591, 0x1010 }, { 5593, 0x2202 }, + /* 0x7100 */ + { 5596, 0x93d8 }, { 5604, 0x5610 }, { 5609, 0xc843 }, { 5615, 0x1043 }, + /* 0x7140 */ + { 5619, 0x56c0 }, { 5625, 0x526f }, { 5634, 0x53f5 }, { 5644, 0x2000 }, + /* 0x7180 */ + { 5645, 0x85b1 }, { 5652, 0x8a74 }, { 5659, 0xd105 }, { 5665, 0x460a }, + /* 0x71C0 */ + { 5670, 0x4b1a }, { 5677, 0x92bd }, { 5686, 0x70e1 }, { 5693, 0xda20 }, + /* 0x7200 */ + { 5699, 0x20c1 }, { 5703, 0x0821 }, { 5706, 0x3d00 }, { 5711, 0xff75 }, + /* 0x7240 */ + { 5724, 0x19c5 }, { 5731, 0xabec }, { 5741, 0xc28e }, { 5748, 0xe314 }, + /* 0x7280 */ + { 5755, 0x6087 }, { 5761, 0x0844 }, { 5764, 0xf085 }, { 5771, 0x4247 }, + /* 0x72C0 */ + { 5777, 0x505f }, { 5785, 0x0a85 }, { 5790, 0x3207 }, { 5796, 0x3f88 }, + /* 0x7300 */ + { 5804, 0x0480 }, { 5806, 0xbbc4 }, { 5815, 0xdfa0 }, { 5824, 0xe2da }, + /* 0x7340 */ + { 5833, 0xc030 }, { 5837, 0x0085 }, { 5840, 0xdd48 }, { 5848, 0x1da7 }, + /* 0x7380 */ + { 5857, 0x0eb2 }, { 5864, 0xd170 }, { 5871, 0x0b65 }, { 5878, 0x9aac }, + /* 0x73C0 */ + { 5886, 0xef25 }, { 5896, 0x4240 }, { 5899, 0x66ab }, { 5908, 0x4702 }, + /* 0x7400 */ + { 5913, 0x06ea }, { 5920, 0x0c08 }, { 5923, 0xdd74 }, { 5933, 0x867f }, + /* 0x7440 */ + { 5943, 0x28db }, { 5951, 0xfeac }, { 5962, 0xae1d }, { 5971, 0x404b }, + /* 0x7480 */ + { 5976, 0x0bea }, { 5984, 0xd385 }, { 5992, 0x0fef }, { 6003, 0xae21 }, + /* 0x74C0 */ + { 6010, 0x8700 }, { 6014, 0x5550 }, { 6020, 0xcacd }, { 6029, 0x85c7 }, + /* 0x7500 */ + { 6037, 0x703a }, { 6044, 0xd5aa }, { 6053, 0x9d79 }, { 6063, 0x7d8f }, + /* 0x7540 */ + { 6074, 0xff51 }, { 6085, 0x3e17 }, { 6094, 0xbef5 }, { 6106, 0xe7df }, + /* 0x7580 */ + { 6119, 0xdec6 }, { 6129, 0x2416 }, { 6134, 0x082c }, { 6138, 0xf3af }, + /* 0x75C0 */ + { 6150, 0xe4ed }, { 6160, 0xeb3c }, { 6170, 0x529d }, { 6178, 0xd61f }, + /* 0x7600 */ + { 6188, 0xab8f }, { 6198, 0xdb68 }, { 6207, 0x21f7 }, { 6216, 0x1839 }, + /* 0x7640 */ + { 6222, 0x1bce }, { 6231, 0x1164 }, { 6236, 0xf7b6 }, { 6248, 0x7d47 }, + /* 0x7680 */ + { 6258, 0x49db }, { 6267, 0x7e69 }, { 6277, 0xc5c3 }, { 6285, 0x87d1 }, + /* 0x76C0 */ + { 6293, 0x776c }, { 6303, 0xd8d4 }, { 6311, 0x55fa }, { 6321, 0x5916 }, + /* 0x7700 */ + { 6328, 0x1f92 }, { 6336, 0xce80 }, { 6342, 0x2271 }, { 6348, 0x15f0 }, + /* 0x7740 */ + { 6355, 0x60c1 }, { 6360, 0x9d00 }, { 6365, 0x0d6f }, { 6374, 0xf604 }, + /* 0x7780 */ + { 6381, 0x4801 }, { 6384, 0xc412 }, { 6389, 0x3635 }, { 6397, 0xba49 }, + /* 0x77C0 */ + { 6405, 0x2080 }, { 6407, 0xdc80 }, { 6413, 0xf6fd }, { 6426, 0x1819 }, + /* 0x7800 */ + { 6431, 0x3264 }, { 6437, 0x0234 }, { 6441, 0x30e3 }, { 6448, 0x8414 }, + /* 0x7840 */ + { 6452, 0xc0a8 }, { 6457, 0x2002 }, { 6459, 0xdd10 }, { 6466, 0x1014 }, + /* 0x7880 */ + { 6469, 0x74c2 }, { 6476, 0xe4ba }, { 6485, 0xa698 }, { 6492, 0x5c21 }, + /* 0x78C0 */ + { 6498, 0x5d62 }, { 6506, 0x0433 }, { 6511, 0x91d3 }, { 6519, 0x6e94 }, + /* 0x7900 */ + { 6527, 0x4083 }, { 6531, 0x1a07 }, { 6537, 0x5c60 }, { 6543, 0x5c13 }, + /* 0x7940 */ + { 6550, 0x07e3 }, { 6558, 0xfde9 }, { 6570, 0x21a5 }, { 6576, 0x8684 }, + /* 0x7980 */ + { 6581, 0xe433 }, { 6589, 0x2970 }, { 6595, 0x46c2 }, { 6601, 0xef1b }, + /* 0x79C0 */ + { 6612, 0x3f87 }, { 6622, 0xc176 }, { 6630, 0x3ada }, { 6639, 0x0801 }, + /* 0x7A00 */ + { 6641, 0x6d09 }, { 6648, 0xdfb2 }, { 6659, 0x6001 }, { 6662, 0xfb86 }, + /* 0x7A40 */ + { 6672, 0xf2cd }, { 6682, 0xb2c1 }, { 6689, 0x2e8f }, { 6698, 0xa771 }, + /* 0x7A80 */ + { 6707, 0x053e }, { 6714, 0x81ed }, { 6722, 0xd609 }, { 6729, 0xde49 }, + /* 0x7AC0 */ + { 6738, 0xfdb8 }, { 6749, 0xb62e }, { 6758, 0xadef }, { 6770, 0xa751 }, + /* 0x7B00 */ + { 6778, 0x8dd4 }, { 6786, 0x4b06 }, { 6792, 0xf5e1 }, { 6802, 0x2a6a }, + /* 0x7B40 */ + { 6809, 0xfbe2 }, { 6820, 0x2077 }, { 6827, 0xf2f1 }, { 6837, 0x863f }, + /* 0x7B80 */ + { 6846, 0xa8c0 }, { 6851, 0xffb7 }, { 6865, 0xa402 }, { 6869, 0x1132 }, + /* 0x7BC0 */ + { 6874, 0x9ef3 }, { 6885, 0x26d0 }, { 6891, 0x2671 }, { 6898, 0x00c9 }, + /* 0x7C00 */ + { 6902, 0xe88b }, { 6910, 0xc09e }, { 6917, 0x0ccb }, { 6924, 0xe1ca }, + /* 0x7C40 */ + { 6932, 0xb429 }, { 6939, 0xc3d3 }, { 6948, 0xf233 }, { 6957, 0x4229 }, + /* 0x7C80 */ + { 6962, 0xaa0e }, { 6969, 0x89b5 }, { 6977, 0x69f7 }, { 6988, 0xf2ce }, + /* 0x7CC0 */ + { 6998, 0x6535 }, { 7006, 0xf3e4 }, { 7016, 0x88c5 }, { 7022, 0x4d74 }, + /* 0x7D00 */ + { 7030, 0x2ffd }, { 7042, 0x7fbd }, { 7055, 0xd80f }, { 7063, 0xe62f }, + /* 0x7D40 */ + { 7073, 0xd9ff }, { 7086, 0x5e49 }, { 7094, 0x454e }, { 7101, 0xa66f }, + /* 0x7D80 */ + { 7111, 0x9b48 }, { 7118, 0xbe88 }, { 7126, 0xfccd }, { 7137, 0xedf7 }, + /* 0x7DC0 */ + { 7150, 0x9c85 }, { 7157, 0x77e6 }, { 7168, 0x935b }, { 7177, 0x0a16 }, + /* 0x7E00 */ + { 7182, 0x0f32 }, { 7189, 0xe8a7 }, { 7198, 0x59cf }, { 7208, 0x6ea6 }, + /* 0x7E40 */ + { 7217, 0x2cea }, { 7225, 0x6674 }, { 7233, 0x2ec2 }, { 7240, 0xfa29 }, + /* 0x7E80 */ + { 7249, 0xf7cc }, { 7260, 0x1d5f }, { 7270, 0x0000 }, { 7270, 0x0000 }, + /* 0x7F00 */ + { 7270, 0x0000 }, { 7270, 0x0000 }, { 7270, 0x0000 }, { 7270, 0x5d40 }, + /* 0x7F40 */ + { 7276, 0xf0b8 }, { 7284, 0x8137 }, { 7291, 0x6f9b }, { 7302, 0x63a5 }, + /* 0x7F80 */ + { 7310, 0x55ec }, { 7319, 0x74d3 }, { 7328, 0xe318 }, { 7335, 0xa344 }, + /* 0x7FC0 */ + { 7341, 0xd46a }, { 7349, 0x8834 }, { 7354, 0xda6b }, { 7364, 0x1e0d }, + /* 0x8000 */ + { 7371, 0x5d7f }, { 7383, 0x13f7 }, { 7393, 0x1152 }, { 7398, 0xb8e9 }, + /* 0x8040 */ + { 7407, 0x0448 }, { 7410, 0xc544 }, { 7416, 0x8146 }, { 7421, 0xeaff }, + /* 0x8080 */ + { 7434, 0x1af0 }, { 7441, 0x3f48 }, { 7449, 0xb6b6 }, { 7459, 0x0516 }, + /* 0x80C0 */ + { 7464, 0x5478 }, { 7471, 0x6fe0 }, { 7480, 0x8073 }, { 7486, 0x393a }, + /* 0x8100 */ + { 7494, 0x27e4 }, { 7502, 0x4d40 }, { 7507, 0x9298 }, { 7513, 0x622a }, + /* 0x8140 */ + { 7519, 0x4c40 }, { 7523, 0x803b }, { 7529, 0x6be1 }, { 7538, 0x8713 }, + /* 0x8180 */ + { 7545, 0x853f }, { 7554, 0x3528 }, { 7560, 0x0319 }, { 7565, 0xed2d }, + /* 0x81C0 */ + { 7575, 0xa74f }, { 7585, 0x8fca }, { 7594, 0x35b9 }, { 7603, 0xfc18 }, + /* 0x8200 */ + { 7611, 0x77b6 }, { 7622, 0xdbc5 }, { 7632, 0x5e06 }, { 7639, 0x13fc }, + /* 0x8240 */ + { 7648, 0x8ae1 }, { 7655, 0xb780 }, { 7662, 0xcd5d }, { 7672, 0xe3d6 }, + /* 0x8280 */ + { 7682, 0x6c08 }, { 7687, 0xa20c }, { 7692, 0xfbfa }, { 7705, 0xff9e }, + /* 0x82C0 */ + { 7718, 0x0060 }, { 7720, 0xdabe }, { 7731, 0x09ee }, { 7739, 0x6e9a }, + /* 0x8300 */ + { 7748, 0x53ff }, { 7760, 0x39c0 }, { 7766, 0xa90c }, { 7772, 0x1777 }, + /* 0x8340 */ + { 7782, 0x86b9 }, { 7790, 0x01b7 }, { 7797, 0x000c }, { 7799, 0xb8a8 }, + /* 0x8380 */ + { 7806, 0x66e0 }, { 7813, 0xed7c }, { 7824, 0x0f85 }, { 7831, 0xa022 }, + /* 0x83C0 */ + { 7835, 0xd6a3 }, { 7844, 0xb15b }, { 7853, 0x8e23 }, { 7860, 0x2a97 }, + /* 0x8400 */ + { 7868, 0xfcda }, { 7879, 0x00aa }, { 7883, 0x1605 }, { 7888, 0x3322 }, + /* 0x8440 */ + { 7894, 0xc740 }, { 7900, 0x9e86 }, { 7908, 0xfa6e }, { 7919, 0x17eb }, + /* 0x8480 */ + { 7929, 0x0836 }, { 7934, 0xd291 }, { 7941, 0xa042 }, { 7945, 0xdf14 }, + /* 0x84C0 */ + { 7954, 0xee57 }, { 7965, 0x164b }, { 7972, 0xd480 }, { 7977, 0xb413 }, + /* 0x8500 */ + { 7984, 0x1041 }, { 7987, 0xcdba }, { 7997, 0xb87a }, { 8006, 0x6034 }, + /* 0x8540 */ + { 8011, 0xcf0b }, { 8020, 0x47aa }, { 8028, 0xa71e }, { 8037, 0xec80 }, + /* 0x8580 */ + { 8043, 0x95d3 }, { 8052, 0xba9b }, { 8062, 0xff54 }, { 8073, 0x1681 }, + /* 0x85C0 */ + { 8078, 0xee82 }, { 8086, 0xb321 }, { 8093, 0x2672 }, { 8100, 0xcec0 }, + /* 0x8600 */ + { 8107, 0x0cf5 }, { 8115, 0x45cf }, { 8124, 0xa296 }, { 8131, 0x9301 }, + /* 0x8640 */ + { 8136, 0x6003 }, { 8140, 0xdcf9 }, { 8151, 0x9884 }, { 8156, 0x0ea2 }, + /* 0x8680 */ + { 8162, 0x3e80 }, { 8168, 0x312a }, { 8174, 0x8f18 }, { 8181, 0x014b }, + /* 0x86C0 */ + { 8186, 0x6ada }, { 8195, 0xcab2 }, { 8203, 0xf258 }, { 8211, 0x7f00 }, + /* 0x8700 */ + { 8218, 0x6fed }, { 8230, 0x970f }, { 8239, 0x022a }, { 8243, 0xcc92 }, + /* 0x8740 */ + { 8250, 0x5a09 }, { 8256, 0x83aa }, { 8263, 0x4579 }, { 8271, 0x9156 }, + /* 0x8780 */ + { 8278, 0x2b84 }, { 8284, 0x8008 }, { 8286, 0xb885 }, { 8293, 0x6c28 }, + /* 0x87C0 */ + { 8299, 0x48d3 }, { 8306, 0x8045 }, { 8310, 0xbc69 }, { 8319, 0x4ae4 }, + /* 0x8800 */ + { 8326, 0xec6a }, { 8335, 0x807b }, { 8342, 0x418e }, { 8348, 0x1a46 }, + /* 0x8840 */ + { 8354, 0x3455 }, { 8361, 0xeb8c }, { 8370, 0x8b1e }, { 8378, 0xe0a5 }, + /* 0x8880 */ + { 8385, 0x2906 }, { 8390, 0x43c4 }, { 8396, 0x4c15 }, { 8402, 0xf0b3 }, + /* 0x88C0 */ + { 8411, 0xc43f }, { 8420, 0xbb3e }, { 8431, 0x0102 }, { 8433, 0x733f }, + /* 0x8900 */ + { 8444, 0x1496 }, { 8450, 0x770d }, { 8459, 0x0ca0 }, { 8463, 0x0bc5 }, + /* 0x8940 */ + { 8470, 0x323f }, { 8479, 0xc040 }, { 8482, 0xa455 }, { 8489, 0xc094 }, + /* 0x8980 */ + { 8494, 0x8fcb }, { 8504, 0x85d9 }, { 8512, 0x96c2 }, { 8519, 0xa48d }, + /* 0x89C0 */ + { 8526, 0x0001 }, { 8527, 0x3554 }, { 8534, 0x08e8 }, { 8539, 0xa15a }, + /* 0x8A00 */ + { 8546, 0x550d }, { 8553, 0xa9ff }, { 8565, 0x242e }, { 8571, 0x5cfa }, + /* 0x8A40 */ + { 8581, 0x61e2 }, { 8588, 0x6937 }, { 8597, 0x7a4f }, { 8607, 0x122f }, + /* 0x8A80 */ + { 8614, 0x32b4 }, { 8621, 0x452b }, { 8628, 0x71fb }, { 8639, 0xd285 }, + /* 0x8AC0 */ + { 8646, 0xb894 }, { 8653, 0xdcc5 }, { 8662, 0x68d7 }, { 8671, 0x55da }, + /* 0x8B00 */ + { 8680, 0x74b7 }, { 8690, 0xbed1 }, { 8700, 0x3943 }, { 8707, 0x4208 }, + /* 0x8B40 */ + { 8710, 0xd24a }, { 8717, 0xdf52 }, { 8727, 0x9a40 }, { 8732, 0xa0d7 }, + /* 0x8B80 */ + { 8740, 0x5c0b }, { 8747, 0x767d }, { 8758, 0x0000 }, { 8758, 0x0000 }, + /* 0x8C00 */ + { 8758, 0x0000 }, { 8758, 0x0000 }, { 8758, 0x0000 }, { 8758, 0xa680 }, + /* 0x8C40 */ + { 8763, 0xd7e2 }, { 8773, 0x04b1 }, { 8778, 0x3f06 }, { 8786, 0x1708 }, + /* 0x8C80 */ + { 8791, 0x7624 }, { 8798, 0x6b1c }, { 8806, 0xff97 }, { 8819, 0xb9dd }, + /* 0x8CC0 */ + { 8830, 0x659f }, { 8840, 0x5e6a }, { 8849, 0x245f }, { 8857, 0x7d13 }, + /* 0x8D00 */ + { 8866, 0xefb0 }, { 8876, 0x085d }, { 8882, 0x0000 }, { 8882, 0x0000 }, + /* 0x8D40 */ + { 8882, 0x0000 }, { 8882, 0x0000 }, { 8882, 0x38d0 }, { 8888, 0x009b }, + /* 0x8D80 */ + { 8893, 0x0432 }, { 8897, 0x0220 }, { 8899, 0x8148 }, { 8903, 0x4408 }, + /* 0x8DC0 */ + { 8906, 0xd944 }, { 8913, 0xaec2 }, { 8921, 0x9d0a }, { 8928, 0xb028 }, + /* 0x8E00 */ + { 8933, 0x9740 }, { 8939, 0xe051 }, { 8945, 0x048f }, { 8951, 0x2271 }, + /* 0x8E40 */ + { 8957, 0x1f94 }, { 8965, 0x8231 }, { 8970, 0xb01d }, { 8977, 0x1855 }, + /* 0x8E80 */ + { 8983, 0x2cb2 }, { 8990, 0x431a }, { 8996, 0xdc02 }, { 9002, 0x486b }, + /* 0x8EC0 */ + { 9009, 0x3d61 }, { 9017, 0x8816 }, { 9022, 0x080c }, { 9025, 0x7f00 }, + /* 0x8F00 */ + { 9032, 0x1729 }, { 9039, 0xfabc }, { 9050, 0xae40 }, { 9056, 0xcb48 }, + /* 0x8F40 */ + { 9063, 0x7675 }, { 9073, 0x9190 }, { 9078, 0x001e }, { 9082, 0x0000 }, + /* 0x8F80 */ + { 9082, 0x0000 }, { 9082, 0xd800 }, { 9086, 0xe1d8 }, { 9094, 0x9cf7 }, + /* 0x8FC0 */ + { 9105, 0x6476 }, { 9113, 0x043a }, { 9118, 0xef75 }, { 9130, 0x2fb3 }, + /* 0x9000 */ + { 9140, 0xf96f }, { 9152, 0xe6fb }, { 9164, 0x608f }, { 9171, 0x53e6 }, + /* 0x9040 */ + { 9180, 0xeebe }, { 9192, 0x737f }, { 9204, 0xe32b }, { 9213, 0xb5e4 }, + /* 0x9080 */ + { 9222, 0x97bf }, { 9234, 0x0aa3 }, { 9240, 0x854e }, { 9247, 0x416b }, + /* 0x90C0 */ + { 9254, 0x45ba }, { 9262, 0xf880 }, { 9268, 0xa916 }, { 9275, 0xe0f4 }, + /* 0x9100 */ + { 9283, 0x0055 }, { 9287, 0x5374 }, { 9295, 0xa08c }, { 9300, 0x2697 }, + /* 0x9140 */ + { 9308, 0x7fc0 }, { 9317, 0x0bd4 }, { 9324, 0x163e }, { 9332, 0x03bc }, + /* 0x9180 */ + { 9339, 0x6aac }, { 9347, 0x5085 }, { 9352, 0xdd14 }, { 9360, 0x157a }, + /* 0x91C0 */ + { 9368, 0xfbdb }, { 9381, 0xbdc3 }, { 9391, 0x70fa }, { 9400, 0x9862 }, + /* 0x9200 */ + { 9406, 0x6482 }, { 9411, 0x40f3 }, { 9418, 0x1200 }, { 9420, 0x9798 }, + /* 0x9240 */ + { 9428, 0xcfbd }, { 9440, 0x4ec3 }, { 9448, 0x01f7 }, { 9456, 0xf102 }, + /* 0x9280 */ + { 9462, 0x2329 }, { 9468, 0x9fea }, { 9479, 0x2880 }, { 9482, 0x8284 }, + /* 0x92C0 */ + { 9486, 0xd845 }, { 9493, 0x028d }, { 9498, 0x26b1 }, { 9505, 0x9f8c }, + /* 0x9300 */ + { 9514, 0xa054 }, { 9519, 0xe723 }, { 9528, 0xdbef }, { 9541, 0x0c24 }, + /* 0x9340 */ + { 9545, 0x2f90 }, { 9552, 0x1cd2 }, { 9559, 0x5c31 }, { 9566, 0x502b }, + /* 0x9380 */ + { 9572, 0x9900 }, { 9576, 0x4cd0 }, { 9582, 0x708a }, { 9588, 0x0601 }, + /* 0x93C0 */ + { 9591, 0x01ca }, { 9596, 0xf1c3 }, { 9605, 0x01b6 }, { 9611, 0x2822 }, + /* 0x9400 */ + { 9615, 0x8298 }, { 9620, 0x07d9 }, { 9628, 0x0802 }, { 9630, 0x0d7c }, + /* 0x9440 */ + { 9638, 0x0432 }, { 9642, 0x4c0e }, { 9648, 0xac0d }, { 9655, 0xf0a7 }, + /* 0x9480 */ + { 9664, 0x0002 }, { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0000 }, + /* 0x9540 */ + { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0380 }, + /* 0x9580 */ + { 9668, 0xfecd }, { 9680, 0x835a }, { 9687, 0x3bfd }, { 9699, 0x7a54 }, + /* 0x95C0 */ + { 9707, 0x3d88 }, { 9714, 0x5579 }, { 9723, 0x0026 }, { 9726, 0x0000 }, + /* 0x9600 */ + { 9726, 0x0000 }, { 9726, 0x3000 }, { 9728, 0xd502 }, { 9734, 0x981c }, + /* 0x9640 */ + { 9740, 0xb817 }, { 9748, 0xf901 }, { 9755, 0x147e }, { 9763, 0x25ed }, + /* 0x9680 */ + { 9772, 0xed74 }, { 9782, 0x3fb0 }, { 9791, 0x87b9 }, { 9800, 0x3fdf }, + /* 0x96C0 */ + { 9813, 0x7af3 }, { 9824, 0x7f66 }, { 9835, 0x8f0c }, { 9842, 0x0ac5 }, + /* 0x9700 */ + { 9848, 0xe5d1 }, { 9857, 0x525a }, { 9864, 0x0498 }, { 9868, 0x6b4d }, + /* 0x9740 */ + { 9877, 0xe3d6 }, { 9887, 0x5ee4 }, { 9896, 0x6f57 }, { 9907, 0x161a }, + /* 0x9780 */ + { 9913, 0xa872 }, { 9920, 0x5561 }, { 9927, 0x694d }, { 9935, 0x441e }, + /* 0x97C0 */ + { 9941, 0x1b4a }, { 9948, 0x5b1a }, { 9956, 0x6002 }, { 9959, 0x887e }, + /* 0x9800 */ + { 9967, 0xf57e }, { 9979, 0x45df }, { 9989, 0x383a }, { 9996, 0x399d }, + /* 0x9840 */ + { 10005, 0xf8c0 }, { 10012, 0x4ffc }, { 10023, 0x98e0 }, { 10029, 0x001b }, + /* 0x9880 */ + { 10033, 0x0000 }, { 10033, 0x0000 }, { 10033, 0xad00 }, { 10038, 0x9dc3 }, + /* 0x98C0 */ + { 10047, 0x09dc }, { 10054, 0x9800 }, { 10057, 0xeeaf }, { 10069, 0x701f }, + /* 0x9900 */ + { 10077, 0x1728 }, { 10083, 0x7ddd }, { 10095, 0x5113 }, { 10101, 0x7c0e }, + /* 0x9940 */ + { 10109, 0x7a67 }, { 10119, 0x91a7 }, { 10127, 0x0001 }, { 10128, 0x0000 }, + /* 0x9980 */ + { 10128, 0x0000 }, { 10128, 0x43c0 }, { 10133, 0x7168 }, { 10140, 0xb218 }, + /* 0x99C0 */ + { 10146, 0x037a }, { 10153, 0xeb37 }, { 10164, 0x6004 }, { 10167, 0x9b07 }, + /* 0x9A00 */ + { 10175, 0xc42e }, { 10182, 0x064e }, { 10188, 0x6911 }, { 10194, 0x41c3 }, + /* 0x9A40 */ + { 10200, 0x743d }, { 10209, 0x8da4 }, { 10216, 0x0e34 }, { 10222, 0x0000 }, + /* 0x9A80 */ + { 10222, 0x0000 }, { 10222, 0x0000 }, { 10222, 0xa100 }, { 10225, 0x13c1 }, + /* 0x9AC0 */ + { 10231, 0xc05b }, { 10238, 0xd17f }, { 10249, 0xee6d }, { 10260, 0x0a92 }, + /* 0x9B00 */ + { 10265, 0x114c }, { 10270, 0x9545 }, { 10277, 0xefad }, { 10289, 0x380e }, + /* 0x9B40 */ + { 10295, 0xe83e }, { 10304, 0x4512 }, { 10309, 0x9868 }, { 10315, 0x02fc }, + /* 0x9B80 */ + { 10322, 0xc418 }, { 10327, 0xc0ce }, { 10334, 0x7dc1 }, { 10343, 0x4316 }, + /* 0x9BC0 */ + { 10349, 0xc6c3 }, { 10357, 0x2956 }, { 10364, 0xcdbe }, { 10375, 0x25af }, + /* 0x9C00 */ + { 10384, 0x3751 }, { 10392, 0x2f7d }, { 10403, 0xe6be }, { 10414, 0x4ec7 }, + /* 0x9C40 */ + { 10423, 0x87e2 }, { 10431, 0xbd9d }, { 10442, 0x6ea9 }, { 10451, 0x05e5 }, + /* 0x9CC0 */ + { 10458, 0x0000 }, { 10458, 0x0000 }, { 10458, 0x1ae0 }, { 10464, 0x005d }, + /* 0x9D00 */ + { 10469, 0x4bcc }, { 10477, 0xe9a6 }, { 10486, 0x1d48 }, { 10492, 0xc804 }, + /* 0x9D40 */ + { 10496, 0x05de }, { 10504, 0xf207 }, { 10512, 0x9a1f }, { 10521, 0x54cd }, + /* 0x9D80 */ + { 10529, 0xa690 }, { 10535, 0x0640 }, { 10538, 0x9a12 }, { 10544, 0xbf34 }, + /* 0x9DC0 */ + { 10554, 0x82df }, { 10563, 0x86c8 }, { 10569, 0xa0c9 }, { 10575, 0x2714 }, + /* 0x9E00 */ + { 10581, 0x2484 }, { 10585, 0x7e20 }, { 10592, 0x0000 }, { 10592, 0x0000 }, + /* 0x9E40 */ + { 10592, 0x0000 }, { 10592, 0x0000 }, { 10592, 0x0000 }, { 10592, 0xbb20 }, + /* 0x9E80 */ + { 10599, 0x1923 }, { 10605, 0xe8ae }, { 10614, 0xb770 }, { 10623, 0xff30 }, + /* 0x9EC0 */ + { 10633, 0xf018 }, { 10639, 0xfb17 }, { 10650, 0xc1a1 }, { 10656, 0xbad0 }, + /* 0x9F00 */ + { 10664, 0x418c }, { 10669, 0x02a9 }, { 10674, 0x9003 }, { 10678, 0x6e80 }, + /* 0x9F40 */ + { 10684, 0xcc62 }, { 10691, 0xa1bc }, { 10699, 0x36cf }, { 10709, 0x00e5 }, + /* 0x9F80 */ + { 10714, 0x2000 }, { 10715, 0x30b1 }, { 10721, 0x0005 }, { 10723, 0x0000 }, + /* 0xF900 */ + { 10723, 0x0000 }, { 10723, 0x2000 }, { 10724, 0x0300 }, { 10726, 0x0040 }, + /* 0xF940 */ + { 10727, 0x0000 }, { 10727, 0x0000 }, { 10727, 0x0000 }, { 10727, 0x0001 }, + /* 0xF9C0 */ + { 10728, 0x0000 }, { 10728, 0x1001 }, { 10730, 0x0000 }, { 10730, 0x0000 }, + /* 0xFA00 */ + { 10730, 0x8000 }, { 10731, 0x8e7b }, { 10741, 0x0057 }, { 10746, 0xffff }, + /* 0xFA40 */ + { 10762, 0xffff }, { 10778, 0xffff }, { 10794, 0x07ff }, { 10805, 0x0000 }, + /* 0xFE40 */ + { 10805, 0x0060 }, { 10807, 0x0000 }, { 10807, 0x0000 }, { 10807, 0x0000 }, + /* 0xFF00 */ + { 10807, 0xfffe }, { 10822, 0xffff }, { 10838, 0xffff }, { 10854, 0xffff }, + /* 0xFF40 */ + { 10870, 0xffff }, { 10886, 0xffff }, { 10902, 0x0001 }, { 10903, 0x0000 }, + /* 0xFFC0 */ + { 10903, 0x0000 }, { 10903, 0x0000 }, { 10903, 0x0028 }, { 10905, 0x0000 }, + /* 0x20000 */ + { 10905, 0x0800 }, { 10906, 0x0000 }, { 10906, 0x0000 }, { 10906, 0x0000 }, + /* 0x20080 */ + { 10906, 0x0200 }, { 10907, 0x0000 }, { 10907, 0x0014 }, { 10909, 0x0000 }, + /* 0x20180 */ + { 10909, 0x0000 }, { 10909, 0x0000 }, { 10909, 0x0004 }, { 10910, 0x0000 }, + /* 0x20200 */ + { 10910, 0x0000 }, { 10910, 0x0008 }, { 10911, 0x0000 }, { 10911, 0x0000 }, + /* 0x20300 */ + { 10911, 0x0000 }, { 10911, 0x0000 }, { 10911, 0x0800 }, { 10912, 0x0000 }, + /* 0x20340 */ + { 10912, 0x0000 }, { 10912, 0x0000 }, { 10912, 0x0000 }, { 10912, 0x0002 }, + /* 0x20380 */ + { 10913, 0x0002 }, { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0000 }, + /* 0x203C0 */ + { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0200 }, + /* 0x20440 */ + { 10915, 0x0400 }, { 10916, 0x0000 }, { 10916, 0x0000 }, { 10916, 0x0000 }, + /* 0x20500 */ + { 10916, 0x0200 }, { 10917, 0x0000 }, { 10917, 0x0000 }, { 10917, 0x0000 }, + /* 0x205C0 */ + { 10917, 0x0000 }, { 10917, 0x0040 }, { 10918, 0x0000 }, { 10918, 0x0000 }, + /* 0x20600 */ + { 10918, 0x0000 }, { 10918, 0x0000 }, { 10918, 0x0100 }, { 10919, 0x0000 }, + /* 0x20740 */ + { 10919, 0x8000 }, { 10920, 0x0000 }, { 10920, 0x0000 }, { 10920, 0x0000 }, + /* 0x20800 */ + { 10920, 0x0080 }, { 10921, 0x0000 }, { 10921, 0x0000 }, { 10921, 0x0400 }, + /* 0x20880 */ + { 10922, 0x0000 }, { 10922, 0x0000 }, { 10922, 0x0000 }, { 10922, 0x0200 }, + /* 0x20940 */ + { 10923, 0x0000 }, { 10923, 0x0000 }, { 10923, 0x0000 }, { 10923, 0x1000 }, + /* 0x20980 */ + { 10924, 0x0000 }, { 10924, 0x2000 }, { 10925, 0x0000 }, { 10925, 0x0000 }, + /* 0x20AC0 */ + { 10925, 0x0000 }, { 10925, 0x0008 }, { 10926, 0x0000 }, { 10926, 0x0000 }, + /* 0x20B00 */ + { 10926, 0x0000 }, { 10926, 0x2000 }, { 10927, 0x0000 }, { 10927, 0x0000 }, + /* 0x20B80 */ + { 10927, 0x0000 }, { 10927, 0x8000 }, { 10928, 0x0000 }, { 10928, 0x0000 }, + /* 0x20D40 */ + { 10928, 0x0020 }, { 10929, 0x0000 }, { 10929, 0x0000 }, { 10929, 0x0000 }, + /* 0x20DC0 */ + { 10929, 0x0000 }, { 10929, 0x0000 }, { 10929, 0x0002 }, { 10930, 0x0000 }, + /* 0x20E40 */ + { 10930, 0x0000 }, { 10930, 0x0000 }, { 10930, 0x2010 }, { 10932, 0x0000 }, + /* 0x20E80 */ + { 10932, 0x0000 }, { 10932, 0x0020 }, { 10933, 0x0000 }, { 10933, 0x0000 }, + /* 0x20F40 */ + { 10933, 0x0000 }, { 10933, 0x8000 }, { 10934, 0x0000 }, { 10934, 0x0000 }, + /* 0x21200 */ + { 10934, 0x0002 }, { 10935, 0x0000 }, { 10935, 0x0000 }, { 10935, 0x2000 }, + /* 0x21240 */ + { 10936, 0x0000 }, { 10936, 0x0020 }, { 10937, 0x0000 }, { 10937, 0x0810 }, + /* 0x212C0 */ + { 10939, 0x0000 }, { 10939, 0x0080 }, { 10940, 0x0010 }, { 10941, 0x2000 }, + /* 0x21300 */ + { 10942, 0x0000 }, { 10942, 0x0800 }, { 10943, 0x0000 }, { 10943, 0x0040 }, + /* 0x21340 */ + { 10944, 0x0010 }, { 10945, 0x0000 }, { 10945, 0x0000 }, { 10945, 0x0000 }, + /* 0x213C0 */ + { 10945, 0x0010 }, { 10946, 0x0000 }, { 10946, 0x0000 }, { 10946, 0x0000 }, + /* 0x21440 */ + { 10946, 0x0000 }, { 10946, 0x0000 }, { 10946, 0x6000 }, { 10948, 0x0000 }, + /* 0x215C0 */ + { 10948, 0x0000 }, { 10948, 0x0080 }, { 10949, 0x0000 }, { 10949, 0x0000 }, + /* 0x21640 */ + { 10949, 0x0080 }, { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0000 }, + /* 0x21680 */ + { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0010 }, + /* 0x21700 */ + { 10951, 0x0040 }, { 10952, 0x0000 }, { 10952, 0x0000 }, { 10952, 0x0000 }, + /* 0x21740 */ + { 10952, 0x0004 }, { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x0000 }, + /* 0x21880 */ + { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x2000 }, + /* 0x219C0 */ + { 10954, 0x0008 }, { 10955, 0x0000 }, { 10955, 0x0000 }, { 10955, 0x0000 }, + /* 0x21C40 */ + { 10955, 0x0000 }, { 10955, 0x0040 }, { 10956, 0x0000 }, { 10956, 0x0000 }, + /* 0x21D00 */ + { 10956, 0x0000 }, { 10956, 0x0000 }, { 10956, 0x2000 }, { 10957, 0x0000 }, + /* 0x21D40 */ + { 10957, 0x0020 }, { 10958, 0x0000 }, { 10958, 0x0004 }, { 10959, 0x0100 }, + /* 0x21D80 */ + { 10960, 0x0000 }, { 10960, 0x1004 }, { 10962, 0x0002 }, { 10963, 0x0080 }, + /* 0x21DC0 */ + { 10964, 0x0000 }, { 10964, 0x0000 }, { 10964, 0x0001 }, { 10965, 0x0000 }, + /* 0x21E00 */ + { 10965, 0x0000 }, { 10965, 0x0000 }, { 10965, 0x0000 }, { 10965, 0x0018 }, + /* 0x21F00 */ + { 10967, 0x0000 }, { 10967, 0x4000 }, { 10968, 0x0000 }, { 10968, 0x0000 }, + /* 0x21F40 */ + { 10968, 0x0000 }, { 10968, 0x0000 }, { 10968, 0x0000 }, { 10968, 0x0040 }, + /* 0x21FC0 */ + { 10969, 0x0000 }, { 10969, 0x0000 }, { 10969, 0x0000 }, { 10969, 0x0400 }, + /* 0x22140 */ + { 10970, 0x0000 }, { 10970, 0x0000 }, { 10970, 0x0000 }, { 10970, 0x0800 }, + /* 0x22200 */ + { 10971, 0x0000 }, { 10971, 0x0100 }, { 10972, 0x0000 }, { 10972, 0x0000 }, + /* 0x22300 */ + { 10972, 0x0000 }, { 10972, 0x4000 }, { 10973, 0x0000 }, { 10973, 0x0000 }, + /* 0x22380 */ + { 10973, 0x0000 }, { 10973, 0x0000 }, { 10973, 0x2000 }, { 10974, 0x0000 }, + /* 0x226C0 */ + { 10974, 0x0000 }, { 10974, 0x0000 }, { 10974, 0x0000 }, { 10974, 0x0008 }, + /* 0x22840 */ + { 10975, 0x0000 }, { 10975, 0x0800 }, { 10976, 0x0000 }, { 10976, 0x0000 }, + /* 0x22880 */ + { 10976, 0x0000 }, { 10976, 0x0000 }, { 10976, 0x0800 }, { 10977, 0x0000 }, + /* 0x22980 */ + { 10977, 0x8000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, + /* 0x22A80 */ + { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0100 }, + /* 0x22B40 */ + { 10979, 0x8040 }, { 10981, 0x0001 }, { 10982, 0x0000 }, { 10982, 0x0000 }, + /* 0x22B80 */ + { 10982, 0x0000 }, { 10982, 0x0000 }, { 10982, 0x0040 }, { 10983, 0x0000 }, + /* 0x22C00 */ + { 10983, 0x0000 }, { 10983, 0x2000 }, { 10984, 0x0010 }, { 10985, 0x0000 }, + /* 0x22DC0 */ + { 10985, 0x0000 }, { 10985, 0x0000 }, { 10985, 0x0002 }, { 10986, 0x0000 }, + /* 0x23180 */ + { 10986, 0x0000 }, { 10986, 0x0000 }, { 10986, 0x0000 }, { 10986, 0x0040 }, + /* 0x231C0 */ + { 10987, 0x0018 }, { 10989, 0x0000 }, { 10989, 0x0000 }, { 10989, 0x0020 }, + /* 0x23340 */ + { 10990, 0x0000 }, { 10990, 0x0000 }, { 10990, 0x0000 }, { 10990, 0x0004 }, + /* 0x233C0 */ + { 10991, 0x0000 }, { 10991, 0x842d }, { 10997, 0x0010 }, { 10998, 0x0000 }, + /* 0x23440 */ + { 10998, 0x0c00 }, { 11000, 0x0002 }, { 11001, 0x0020 }, { 11002, 0x0000 }, + /* 0x234C0 */ + { 11002, 0x0000 }, { 11002, 0x0000 }, { 11002, 0x0010 }, { 11003, 0x0000 }, + /* 0x23540 */ + { 11003, 0x0000 }, { 11003, 0x0400 }, { 11004, 0x0000 }, { 11004, 0x0000 }, + /* 0x23580 */ + { 11004, 0x0000 }, { 11004, 0x0010 }, { 11005, 0x0000 }, { 11005, 0x0000 }, + /* 0x235C0 */ + { 11005, 0x0010 }, { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0000 }, + /* 0x23600 */ + { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0700 }, + /* 0x23640 */ + { 11009, 0x0080 }, { 11010, 0x0000 }, { 11010, 0x0000 }, { 11010, 0x0000 }, + /* 0x23700 */ + { 11010, 0x1000 }, { 11011, 0x1000 }, { 11012, 0x0000 }, { 11012, 0x8000 }, + /* 0x23740 */ + { 11013, 0x0000 }, { 11013, 0x0000 }, { 11013, 0x0018 }, { 11015, 0x0000 }, + /* 0x237C0 */ + { 11015, 0x0000 }, { 11015, 0x0000 }, { 11015, 0x0080 }, { 11016, 0x8000 }, + /* 0x23800 */ + { 11017, 0x0000 }, { 11017, 0x0000 }, { 11017, 0x0010 }, { 11018, 0x2000 }, + /* 0x23A80 */ + { 11019, 0x0000 }, { 11019, 0x0100 }, { 11020, 0x0000 }, { 11020, 0x0000 }, + /* 0x23C40 */ + { 11020, 0x0000 }, { 11020, 0x0000 }, { 11020, 0x0000 }, { 11020, 0x8000 }, + /* 0x23CC0 */ + { 11021, 0x0000 }, { 11021, 0x0000 }, { 11021, 0x0000 }, { 11021, 0x4000 }, + /* 0x23D00 */ + { 11022, 0x4001 }, { 11024, 0x0000 }, { 11024, 0x0000 }, { 11024, 0x0000 }, + /* 0x23D40 */ + { 11024, 0x0001 }, { 11025, 0x0000 }, { 11025, 0x0000 }, { 11025, 0x0000 }, + /* 0x23DC0 */ + { 11025, 0x0000 }, { 11025, 0x0008 }, { 11026, 0x0000 }, { 11026, 0x0600 }, + /* 0x23F40 */ + { 11028, 0x0000 }, { 11028, 0x0000 }, { 11028, 0x0000 }, { 11028, 0x4000 }, + /* 0x24080 */ + { 11029, 0x0000 }, { 11029, 0x0040 }, { 11030, 0x0000 }, { 11030, 0x0000 }, + /* 0x24100 */ + { 11030, 0x0008 }, { 11031, 0x0000 }, { 11031, 0x0000 }, { 11031, 0x0000 }, + /* 0x241C0 */ + { 11031, 0x0040 }, { 11032, 0x0000 }, { 11032, 0x0000 }, { 11032, 0x4000 }, + /* 0x24380 */ + { 11033, 0x0000 }, { 11033, 0x0000 }, { 11033, 0x0000 }, { 11033, 0x1000 }, + /* 0x24600 */ + { 11034, 0x0000 }, { 11034, 0x0000 }, { 11034, 0x0200 }, { 11035, 0x0000 }, + /* 0x24680 */ + { 11035, 0x0000 }, { 11035, 0x0000 }, { 11035, 0x0020 }, { 11036, 0x0000 }, + /* 0x247C0 */ + { 11036, 0x0000 }, { 11036, 0x0000 }, { 11036, 0x0000 }, { 11036, 0x0002 }, + /* 0x24880 */ + { 11037, 0x0000 }, { 11037, 0x0040 }, { 11038, 0x0000 }, { 11038, 0x0000 }, + /* 0x24A40 */ + { 11038, 0x2000 }, { 11039, 0x0000 }, { 11039, 0x0000 }, { 11039, 0x0000 }, + /* 0x24B40 */ + { 11039, 0x0000 }, { 11039, 0x0040 }, { 11040, 0x8000 }, { 11041, 0x0000 }, + /* 0x24C00 */ + { 11041, 0x0000 }, { 11041, 0x0040 }, { 11042, 0x0000 }, { 11042, 0x0000 }, + /* 0x24D00 */ + { 11042, 0x0000 }, { 11042, 0x0010 }, { 11043, 0x0000 }, { 11043, 0x0000 }, + /* 0x24E00 */ + { 11043, 0x4000 }, { 11044, 0x0000 }, { 11044, 0x0000 }, { 11044, 0x0080 }, + /* 0x24E40 */ + { 11045, 0x0000 }, { 11045, 0x0000 }, { 11045, 0x0400 }, { 11046, 0x0000 }, + /* 0x24E80 */ + { 11046, 0x0800 }, { 11047, 0x0000 }, { 11047, 0x0000 }, { 11047, 0x0000 }, + /* 0x25040 */ + { 11047, 0x0400 }, { 11048, 0x0020 }, { 11049, 0x0000 }, { 11049, 0x0000 }, + /* 0x25100 */ + { 11049, 0x0000 }, { 11049, 0x0000 }, { 11049, 0x0004 }, { 11050, 0x0000 }, + /* 0x25180 */ + { 11050, 0x0000 }, { 11050, 0x0000 }, { 11050, 0x0200 }, { 11051, 0x0000 }, + /* 0x251C0 */ + { 11051, 0x2000 }, { 11052, 0x0000 }, { 11052, 0x0020 }, { 11053, 0x0000 }, + /* 0x25200 */ + { 11053, 0x0000 }, { 11053, 0x4000 }, { 11054, 0x0000 }, { 11054, 0x0000 }, + /* 0x25240 */ + { 11054, 0x1000 }, { 11055, 0x0000 }, { 11055, 0x0000 }, { 11055, 0x0000 }, + /* 0x25400 */ + { 11055, 0x0000 }, { 11055, 0x0000 }, { 11055, 0x4000 }, { 11056, 0x0000 }, + /* 0x25480 */ + { 11056, 0x4000 }, { 11057, 0x0000 }, { 11057, 0x0000 }, { 11057, 0x0000 }, + /* 0x254C0 */ + { 11057, 0x0000 }, { 11057, 0x0200 }, { 11058, 0x0000 }, { 11058, 0x0000 }, + /* 0x25500 */ + { 11058, 0x4000 }, { 11059, 0x0000 }, { 11059, 0x0000 }, { 11059, 0x0000 }, + /* 0x25580 */ + { 11059, 0x0000 }, { 11059, 0x0000 }, { 11059, 0x0080 }, { 11060, 0x0000 }, + /* 0x25740 */ + { 11060, 0x0000 }, { 11060, 0x0000 }, { 11060, 0x0000 }, { 11060, 0x0002 }, + /* 0x25780 */ + { 11061, 0x0000 }, { 11061, 0x0000 }, { 11061, 0x0200 }, { 11062, 0x0010 }, + /* 0x259C0 */ + { 11063, 0x0010 }, { 11064, 0x0010 }, { 11065, 0x0000 }, { 11065, 0x0000 }, + /* 0x25AC0 */ + { 11065, 0x0000 }, { 11065, 0x0000 }, { 11065, 0x0018 }, { 11067, 0x0002 }, + /* 0x25B80 */ + { 11068, 0x0000 }, { 11068, 0x0000 }, { 11068, 0x0000 }, { 11068, 0x0004 }, + /* 0x25C40 */ + { 11069, 0x0800 }, { 11070, 0x0000 }, { 11070, 0x0010 }, { 11071, 0x0000 }, + /* 0x25D80 */ + { 11071, 0x0000 }, { 11071, 0x0000 }, { 11071, 0x0002 }, { 11072, 0x0000 }, + /* 0x25E00 */ + { 11072, 0x0000 }, { 11072, 0x0000 }, { 11072, 0x4000 }, { 11073, 0x0000 }, + /* 0x25E40 */ + { 11073, 0x0000 }, { 11073, 0x0040 }, { 11074, 0x0024 }, { 11076, 0x0000 }, + /* 0x25EC0 */ + { 11076, 0x0004 }, { 11077, 0x0100 }, { 11078, 0x0100 }, { 11079, 0x0000 }, + /* 0x25F00 */ + { 11079, 0x0000 }, { 11079, 0x0000 }, { 11079, 0x0008 }, { 11080, 0x0000 }, + /* 0x25F40 */ + { 11080, 0x0000 }, { 11080, 0x1000 }, { 11081, 0x0000 }, { 11081, 0x0000 }, + /* 0x25FC0 */ + { 11081, 0x0000 }, { 11081, 0x0010 }, { 11082, 0x0001 }, { 11083, 0x0800 }, + /* 0x26000 */ + { 11084, 0x1000 }, { 11085, 0x0080 }, { 11086, 0x0000 }, { 11086, 0x0000 }, + /* 0x26040 */ + { 11086, 0x0000 }, { 11086, 0x0000 }, { 11086, 0x0001 }, { 11087, 0x0000 }, + /* 0x260C0 */ + { 11087, 0x0000 }, { 11087, 0x0000 }, { 11087, 0x2000 }, { 11088, 0x0000 }, + /* 0x26240 */ + { 11088, 0x0000 }, { 11088, 0x0000 }, { 11088, 0x0000 }, { 11088, 0x0001 }, + /* 0x26280 */ + { 11089, 0x0040 }, { 11090, 0x0000 }, { 11090, 0x0000 }, { 11090, 0x0000 }, + /* 0x26340 */ + { 11090, 0x1000 }, { 11091, 0x0000 }, { 11091, 0x0000 }, { 11091, 0x0000 }, + /* 0x26400 */ + { 11091, 0x0004 }, { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x0000 }, + /* 0x26640 */ + { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x4000 }, + /* 0x26680 */ + { 11093, 0x0000 }, { 11093, 0x0000 }, { 11093, 0x0000 }, { 11093, 0x0001 }, + /* 0x26700 */ + { 11094, 0x0000 }, { 11094, 0x2000 }, { 11095, 0x0000 }, { 11095, 0x0000 }, + /* 0x268C0 */ + { 11095, 0x0000 }, { 11095, 0x2000 }, { 11096, 0x0400 }, { 11097, 0x0000 }, + /* 0x26940 */ + { 11097, 0x0000 }, { 11097, 0x0002 }, { 11098, 0x8000 }, { 11099, 0x0000 }, + /* 0x269C0 */ + { 11099, 0x0000 }, { 11099, 0x2000 }, { 11100, 0x0000 }, { 11100, 0x0000 }, + /* 0x26A00 */ + { 11100, 0x0000 }, { 11100, 0x4000 }, { 11101, 0x0000 }, { 11101, 0x0000 }, + /* 0x26A40 */ + { 11101, 0x0000 }, { 11101, 0x0100 }, { 11102, 0x0000 }, { 11102, 0x0000 }, + /* 0x26A80 */ + { 11102, 0x1000 }, { 11103, 0x0000 }, { 11103, 0x0000 }, { 11103, 0x0080 }, + /* 0x26AC0 */ + { 11104, 0x0000 }, { 11104, 0x0000 }, { 11104, 0x0000 }, { 11104, 0x8000 }, + /* 0x26C00 */ + { 11105, 0x0000 }, { 11105, 0x0000 }, { 11105, 0x0200 }, { 11106, 0x0000 }, + /* 0x26C40 */ + { 11106, 0x0000 }, { 11106, 0x0000 }, { 11106, 0x0000 }, { 11106, 0x0008 }, + /* 0x26CC0 */ + { 11107, 0x0000 }, { 11107, 0x2000 }, { 11108, 0x0000 }, { 11108, 0x0000 }, + /* 0x26E40 */ + { 11108, 0x0001 }, { 11109, 0x0000 }, { 11109, 0x0020 }, { 11110, 0x0000 }, + /* 0x26F80 */ + { 11110, 0x0000 }, { 11110, 0x0010 }, { 11111, 0x0000 }, { 11111, 0x0000 }, + /* 0x26FC0 */ + { 11111, 0x0000 }, { 11111, 0x0000 }, { 11111, 0x0000 }, { 11111, 0x01c0 }, + /* 0x270C0 */ + { 11114, 0x0000 }, { 11114, 0x0000 }, { 11114, 0x0000 }, { 11114, 0x0010 }, + /* 0x27100 */ + { 11115, 0x2000 }, { 11116, 0x0000 }, { 11116, 0x0000 }, { 11116, 0x0200 }, + /* 0x273C0 */ + { 11117, 0x0000 }, { 11117, 0x0c00 }, { 11119, 0x0000 }, { 11119, 0x4000 }, + /* 0x27400 */ + { 11120, 0x0000 }, { 11120, 0x0001 }, { 11121, 0x0000 }, { 11121, 0x0000 }, + /* 0x27440 */ + { 11121, 0x0200 }, { 11122, 0x0000 }, { 11122, 0x0000 }, { 11122, 0x0000 }, + /* 0x27600 */ + { 11122, 0x0000 }, { 11122, 0x0030 }, { 11124, 0x0000 }, { 11124, 0x0002 }, + /* 0x27680 */ + { 11125, 0x0010 }, { 11126, 0x0008 }, { 11127, 0x0000 }, { 11127, 0x0000 }, + /* 0x27700 */ + { 11127, 0x4000 }, { 11128, 0x0000 }, { 11128, 0x0008 }, { 11129, 0x0000 }, + /* 0x27740 */ + { 11129, 0x0000 }, { 11129, 0x0004 }, { 11130, 0x0000 }, { 11130, 0x0000 }, + /* 0x27980 */ + { 11130, 0x0020 }, { 11131, 0x0000 }, { 11131, 0x0000 }, { 11131, 0x0000 }, + /* 0x27A80 */ + { 11131, 0x0010 }, { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x0000 }, + /* 0x27B80 */ + { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x4008 }, + /* 0x27BC0 */ + { 11134, 0x0080 }, { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0000 }, + /* 0x27C80 */ + { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0100 }, + /* 0x27D80 */ + { 11136, 0x0000 }, { 11136, 0x0000 }, { 11136, 0x0001 }, { 11137, 0x0000 }, + /* 0x27E00 */ + { 11137, 0x0000 }, { 11137, 0x0001 }, { 11138, 0x0000 }, { 11138, 0x0000 }, + /* 0x27F80 */ + { 11138, 0x0000 }, { 11138, 0x0000 }, { 11138, 0x0000 }, { 11138, 0x0080 }, + /* 0x28080 */ + { 11139, 0x0400 }, { 11140, 0x0000 }, { 11140, 0x0000 }, { 11140, 0x0800 }, + /* 0x28240 */ + { 11141, 0x0000 }, { 11141, 0x0000 }, { 11141, 0x0000 }, { 11141, 0x0080 }, + /* 0x28280 */ + { 11142, 0x0004 }, { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0000 }, + /* 0x282C0 */ + { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0008 }, + /* 0x283C0 */ + { 11144, 0x2000 }, { 11145, 0x0000 }, { 11145, 0x0000 }, { 11145, 0x0000 }, + /* 0x28400 */ + { 11145, 0x1000 }, { 11146, 0x0000 }, { 11146, 0x0000 }, { 11146, 0x0000 }, + /* 0x28440 */ + { 11146, 0x0000 }, { 11146, 0x0020 }, { 11147, 0x0000 }, { 11147, 0x0000 }, + /* 0x28540 */ + { 11147, 0x0000 }, { 11147, 0x0000 }, { 11147, 0x0800 }, { 11148, 0x0000 }, + /* 0x285C0 */ + { 11148, 0x0300 }, { 11150, 0x0000 }, { 11150, 0x0000 }, { 11150, 0x0000 }, + /* 0x286C0 */ + { 11150, 0x0000 }, { 11150, 0x0080 }, { 11151, 0x0000 }, { 11151, 0x0400 }, + /* 0x28940 */ + { 11152, 0x0240 }, { 11154, 0x0000 }, { 11154, 0x0800 }, { 11155, 0x0000 }, + /* 0x28980 */ + { 11155, 0x0180 }, { 11157, 0x0000 }, { 11157, 0x0000 }, { 11157, 0x0c00 }, + /* 0x28A00 */ + { 11159, 0x0000 }, { 11159, 0x4000 }, { 11160, 0x0200 }, { 11161, 0x0000 }, + /* 0x28A40 */ + { 11161, 0x0008 }, { 11162, 0x0000 }, { 11162, 0x0000 }, { 11162, 0x0002 }, + /* 0x28A80 */ + { 11163, 0x0000 }, { 11163, 0x0200 }, { 11164, 0x0000 }, { 11164, 0x0000 }, + /* 0x28AC0 */ + { 11164, 0x2000 }, { 11165, 0x2000 }, { 11166, 0x0010 }, { 11167, 0x0000 }, + /* 0x28BC0 */ + { 11167, 0x0002 }, { 11168, 0x0000 }, { 11168, 0x8000 }, { 11169, 0x0000 }, + /* 0x28D00 */ + { 11169, 0x0000 }, { 11169, 0x0001 }, { 11170, 0x0000 }, { 11170, 0x0000 }, + /* 0x28D40 */ + { 11170, 0x0000 }, { 11170, 0x0000 }, { 11170, 0x0000 }, { 11170, 0x0002 }, + /* 0x28DC0 */ + { 11171, 0x0000 }, { 11171, 0x0000 }, { 11171, 0x0000 }, { 11171, 0x0800 }, + /* 0x28E00 */ + { 11172, 0x0000 }, { 11172, 0x8000 }, { 11173, 0x0000 }, { 11173, 0x0040 }, + /* 0x28E80 */ + { 11174, 0x0200 }, { 11175, 0x0000 }, { 11175, 0x0000 }, { 11175, 0x0000 }, + /* 0x28EC0 */ + { 11175, 0x0000 }, { 11175, 0x0000 }, { 11175, 0x0800 }, { 11176, 0x0000 }, + /* 0x28F00 */ + { 11176, 0x0000 }, { 11176, 0x0000 }, { 11176, 0x0000 }, { 11176, 0x0004 }, + /* 0x28FC0 */ + { 11177, 0x0000 }, { 11177, 0x0000 }, { 11177, 0x0000 }, { 11177, 0x0100 }, + /* 0x29280 */ + { 11178, 0x0000 }, { 11178, 0x0000 }, { 11178, 0x0001 }, { 11179, 0x0002 }, + /* 0x29480 */ + { 11180, 0x0000 }, { 11180, 0x0001 }, { 11181, 0x0000 }, { 11181, 0x0000 }, + /* 0x295C0 */ + { 11181, 0x8000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, + /* 0x29640 */ + { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x8000 }, + /* 0x296C0 */ + { 11183, 0x0000 }, { 11183, 0x0000 }, { 11183, 0x0000 }, { 11183, 0x0001 }, + /* 0x29700 */ + { 11184, 0x0000 }, { 11184, 0x0200 }, { 11185, 0x0000 }, { 11185, 0x0000 }, + /* 0x29740 */ + { 11185, 0x0000 }, { 11185, 0x0001 }, { 11186, 0x0000 }, { 11186, 0x0000 }, + /* 0x298C0 */ + { 11186, 0x0040 }, { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0000 }, + /* 0x29A40 */ + { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0004 }, + /* 0x29DC0 */ + { 11188, 0x0000 }, { 11188, 0x0800 }, { 11189, 0x0000 }, { 11189, 0x0000 }, + /* 0x29E00 */ + { 11189, 0x0000 }, { 11189, 0x0020 }, { 11190, 0x0000 }, { 11190, 0x2000 }, + /* 0x29E40 */ + { 11191, 0x0200 }, { 11192, 0x0000 }, { 11192, 0x0000 }, { 11192, 0x0000 }, + /* 0x29E80 */ + { 11192, 0x0400 }, { 11193, 0x0000 }, { 11193, 0x0000 }, { 11193, 0x0000 }, + /* 0x29EC0 */ + { 11193, 0x0010 }, { 11194, 0x0800 }, { 11195, 0x0200 }, { 11196, 0x0000 }, + /* 0x29FC0 */ + { 11196, 0x4000 }, { 11197, 0x0000 }, { 11197, 0x0000 }, { 11197, 0x0000 }, + /* 0x2A000 */ + { 11197, 0x0000 }, { 11197, 0x0400 }, { 11198, 0x8000 }, { 11199, 0x0000 }, + /* 0x2A080 */ + { 11199, 0x0004 }, { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0000 }, + /* 0x2A0C0 */ + { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0200 }, + /* 0x2A180 */ + { 11201, 0x0000 }, { 11201, 0x0001 }, { 11202, 0x0000 }, { 11202, 0x0000 }, + /* 0x2A380 */ + { 11202, 0x1000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, + /* 0x2A400 */ + { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0080 }, + /* 0x2A5C0 */ + { 11204, 0x0000 }, { 11204, 0x0000 }, { 11204, 0x0000 }, { 11204, 0x0002 }, + /* 0x2A600 */ + { 11205, 0x0004 }, { 11206, 0x0400 }, { 11207, 0x0000 }, { 11207, 0x0000 }, + /* 0x2A680 */ + { 11207, 0x0000 }, { 11207, 0x0000 }, { 11207, 0x0000 }, { 11207, 0x0004 }, +}; + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static ucs4_t jisx0213_to_ucs4 (unsigned int row, unsigned int col) +{ + ucs4_t val; + + if (row >= 0x121 && row <= 0x17e) + row -= 289; + else if (row == 0x221) + row -= 451; + else if (row >= 0x223 && row <= 0x225) + row -= 452; + else if (row == 0x228) + row -= 454; + else if (row >= 0x22c && row <= 0x22f) + row -= 457; + else if (row >= 0x26e && row <= 0x27e) + row -= 519; + else + return 0x0000; + + if (col >= 0x21 && col <= 0x7e) + col -= 0x21; + else + return 0x0000; + + val = jisx0213_to_ucs_main[row * 94 + col]; + val = jisx0213_to_ucs_pagestart[val >> 8] + (val & 0xff); + if (val == 0xfffd) + val = 0x0000; + return val; +} + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned short ucs4_to_jisx0213 (ucs4_t ucs) +{ + if (ucs < (sizeof(jisx0213_from_ucs_level1)/sizeof(jisx0213_from_ucs_level1[0])) << 6) { + int index1 = jisx0213_from_ucs_level1[ucs >> 6]; + if (index1 >= 0) { + const Summary16 *summary = &jisx0213_from_ucs_level2_2indx[((index1 << 6) + (ucs & 0x3f)) >> 4]; + unsigned short used = summary->used; + unsigned int i = ucs & 0x0f; + if (used & ((unsigned short) 1 << i)) { + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + return jisx0213_from_ucs_level2_data[summary->indx + used]; + }; + }; + } + return 0x0000; +} + +#endif /* _JISX0213_H */ diff --git a/Externals/libiconv-1.14/lib/johab.h b/Externals/libiconv-1.14/lib/johab.h new file mode 100644 index 0000000000..fb2c17f59e --- /dev/null +++ b/Externals/libiconv-1.14/lib/johab.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1999-2001, 2007 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JOHAB + */ + +/* + Conversion between JOHAB codes (s1,s2) and KSX1001 codes (c1,c2): + Example. (s1,s2) = 0xD931, (c1,c2) = 0x2121. + (s1,s2) = 0xDEF1, (c1,c2) = 0x2C71. + (s1,s2) = 0xE031, (c1,c2) = 0x4A21. + (s1,s2) = 0xF9FE, (c1,c2) = 0x7D7E. + 0xD9 <= s1 <= 0xDE || 0xE0 <= s1 <= 0xF9, + 0x31 <= s2 <= 0x7E || 0x91 <= s2 <= 0xFE, + 0x21 <= c1 <= 0x2C || 0x4A <= c1 <= 0x7D, + 0x21 <= c2 <= 0x7E. + Invariant: + 94*(s1 < 0xE0 ? 2*s1-0x1B2 : 2*s1-0x197) + (s2 < 0x91 ? s2-0x31 : s2-0x43) + = 94*(c1-0x21)+(c2-0x21) + Conversion (s1,s2) -> (c1,c2): + t1 := (s1 < 0xE0 ? 2*s1-0x1B2 : 2*s1-0x197) + t2 := (s2 < 0x91 ? s2-0x31 : s2-0x43) + c1 := t1 + (t2 < 0x5E ? 0 : 1) + 0x21 + c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 + Conversion (c1,c2) -> (s1,s2): + t := (c1 < 0x4A ? (c1-0x21+0x1B2) : (c1-0x21+0x197)) + s1 := t >> 1 + t2 := (t & 1) * 0x5E + (c2 - 0x21) + s2 := (t2 < 0x4E ? t2+0x31 : t2+0x43) + */ + +static int +johab_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + if (c == 0x5c) + *pwc = (ucs4_t) 0x20a9; + else + *pwc = (ucs4_t) c; + return 1; + } else if (c < 0xd8) { + return johab_hangul_mbtowc(conv,pwc,s,n); + } else { + unsigned char s1, s2; + s1 = c; + if ((s1 >= 0xd9 && s1 <= 0xde) || (s1 >= 0xe0 && s1 <= 0xf9)) { + if (n < 2) + return RET_TOOFEW(0); + s2 = s[1]; + if ((s2 >= 0x31 && s2 <= 0x7e) || (s2 >= 0x91 && s2 <= 0xfe)) { + /* In KSC 5601, now KS X 1001, the region s1 = 0xDA, 0xA1 <= s2 <= 0xD3 + contains the 51 Jamo (Hangul letters). But in the Johab encoding, + they have been moved to the Hangul section, see + johab_hangul_page31. */ + if (!(s1 == 0xda && (s2 >= 0xa1 && s2 <= 0xd3))) { + unsigned char t1 = (s1 < 0xe0 ? 2*(s1-0xd9) : 2*s1-0x197); + unsigned char t2 = (s2 < 0x91 ? s2-0x31 : s2-0x43); + unsigned char buf[2]; + buf[0] = t1 + (t2 < 0x5e ? 0 : 1) + 0x21; + buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; + return ksc5601_mbtowc(conv,pwc,buf,2); + } + } + } + return RET_ILSEQ; + } +} + +static int +johab_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Try ASCII variation. */ + if (wc < 0x0080 && wc != 0x005c) { + *r = wc; + return 1; + } + if (wc == 0x20a9) { + *r = 0x5c; + return 1; + } + + /* Try JOHAB Hangul table before KSC5601 table, because the KSC5601 table + contains some (2350 out of 11172) Hangul syllables (rows 0x30XX..0x48XX), + and we want the search to return the JOHAB Hangul table entry. */ + + /* Try JOHAB Hangul. */ + ret = johab_hangul_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + r[0] = buf[0]; + r[1] = buf[1]; + return 2; + } + + /* Try KSC5601, now KS X 1001. */ + ret = ksc5601_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + unsigned char c1, c2; + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + c1 = buf[0]; + c2 = buf[1]; + if (((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x4a && c1 <= 0x7d)) + && (c2 >= 0x21 && c2 <= 0x7e)) { + unsigned int t = (c1 < 0x4A ? (c1-0x21+0x1B2) : (c1-0x21+0x197)); + unsigned char t2 = ((t & 1) ? 0x5e : 0) + (c2 - 0x21); + r[0] = t >> 1; + r[1] = (t2 < 0x4e ? t2+0x31 : t2+0x43); + return 2; + } + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/johab_hangul.h b/Externals/libiconv-1.14/lib/johab_hangul.h new file mode 100644 index 0000000000..68368dff1e --- /dev/null +++ b/Externals/libiconv-1.14/lib/johab_hangul.h @@ -0,0 +1,262 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * JOHAB Hangul + * + * Ken Lunde writes in his "CJKV Information Processing" book, p. 114: + * "Hangul can be composed of two or three jamo (some jamo are considered + * compound). Johab uses 19 initial jamo (consonants), 21 medial jamo (vowels) + * and 27 final jamo (consonants; 28 when you include the "fill" character + * for Hangul containing only two jamo). Multiplying these numbers results in + * 11172." + * + * Structure of the Johab encoding (see p. 181-184): + * bit 15 = 1 + * bit 14..10 = initial jamo, only 19+1 out of 32 possible values are used + * bit 9..5 = medial jamo, only 21+1 out of 32 possible values are used + * bit 4..0 = final jamo, only 27+1 out of 32 possible values are used + * + * Structure of the Unicode encoding: + * grep '^0x\([8-C]...\|D[0-7]..\)' unicode.org-mappings/EASTASIA/KSC/JOHAB.TXT + * You see that all characters there are marked "HANGUL LETTER" or "HANGUL + * SYLLABLE". If you eliminate the "HANGUL LETTER"s, the table is sorted + * in ascending order according to Johab encoding and according to the Unicode + * encoding. Now look a little more carefully, and you see that the following + * formula holds: + * unicode == 0xAC00 + * + 21 * 28 * (jamo_initial_index[(johab >> 10) & 31] - 1) + * + 28 * (jamo_medial_index[(johab >> 5) & 31] - 1) + * + jamo_final_index[johab & 31] + * where the index tables are defined as below. + */ + +/* Tables mapping 5-bit groups to jamo letters. */ +/* Note that Jamo XX = UHC 0xA4A0+XX = Unicode 0x3130+XX */ +#define NONE 0xfd +#define FILL 0xff +static const unsigned char jamo_initial[32] = { + NONE, FILL, 0x01, 0x02, 0x04, 0x07, 0x08, 0x09, + 0x11, 0x12, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, NONE, NONE, NONE, + NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, +}; +static const unsigned char jamo_medial[32] = { + NONE, NONE, FILL, 0x1f, 0x20, 0x21, 0x22, 0x23, + NONE, NONE, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + NONE, NONE, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + NONE, NONE, 0x30, 0x31, 0x32, 0x33, NONE, NONE, +}; +static const unsigned char jamo_final[32] = { + NONE, FILL, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, NONE, 0x12, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, NONE, NONE, +}; +/* Same as jamo_final, except that it excludes characters already + contained in jamo_initial. 11 characters instead of 27. */ +static const unsigned char jamo_final_notinitial[32] = { + NONE, NONE, NONE, NONE, 0x03, NONE, 0x05, 0x06, + NONE, NONE, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, NONE, NONE, NONE, 0x14, NONE, NONE, NONE, + NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, +}; + +/* Tables mapping 5-bit groups to packed indices. */ +#define none -1 +#define fill 0 +static const signed char jamo_initial_index[32] = { + none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, none, none, none, + none, none, none, none, none, none, none, none, +}; +static const signed char jamo_medial_index[32] = { + none, none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, + none, none, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + none, none, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + none, none, 0x12, 0x13, 0x14, 0x15, none, none, +}; +static const signed char jamo_final_index[32] = { + none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, none, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, none, none, +}; + +static int +johab_hangul_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x84 && c1 <= 0xd3)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x41 && c2 < 0x7f) || (c2 >= 0x81 && c2 < 0xff)) { + unsigned int johab = (c1 << 8) | c2; + unsigned int bitspart1 = (johab >> 10) & 31; + unsigned int bitspart2 = (johab >> 5) & 31; + unsigned int bitspart3 = johab & 31; + int index1 = jamo_initial_index[bitspart1]; + int index2 = jamo_medial_index[bitspart2]; + int index3 = jamo_final_index[bitspart3]; + /* Exclude "none" values. */ + if (index1 >= 0 && index2 >= 0 && index3 >= 0) { + /* Deal with "fill" values in initial or medial position. */ + if (index1 == fill) { + if (index2 == fill) { + unsigned char jamo3 = jamo_final_notinitial[bitspart3]; + if (jamo3 != NONE) { + *pwc = (ucs4_t) 0x3130 + jamo3; + return 2; + } + } else if (index3 == fill) { + unsigned char jamo2 = jamo_medial[bitspart2]; + if (jamo2 != NONE && jamo2 != FILL) { + *pwc = (ucs4_t) 0x3130 + jamo2; + return 2; + } + } + /* Syllables composed only of medial and final don't exist. */ + } else if (index2 == fill) { + if (index3 == fill) { + unsigned char jamo1 = jamo_initial[bitspart1]; + if (jamo1 != NONE && jamo1 != FILL) { + *pwc = (ucs4_t) 0x3130 + jamo1; + return 2; + } + } + /* Syllables composed only of initial and final don't exist. */ + } else { + /* index1 and index2 are not fill, but index3 may be fill. */ + /* Nothing more to exclude. All 11172 code points are valid. */ + *pwc = 0xac00 + ((index1 - 1) * 21 + (index2 - 1)) * 28 + index3; + return 2; + } + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +/* 51 Jamo: 19 initial, 21 medial, 11 final not initial. */ +static const unsigned short johab_hangul_page31[51] = { + 0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441, /*0x30-0x37*/ + 0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, /*0x38-0x3f*/ + 0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441, /*0x40-0x47*/ + 0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461, /*0x48-0x4f*/ + 0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1, /*0x50-0x57*/ + 0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1, /*0x58-0x5f*/ + 0x8741, 0x8761, 0x8781, 0x87a1, /*0x60-0x67*/ +}; + +/* Tables mapping packed indices to 5-bit groups. */ +/* index1+1 = jamo_initial_index[bitspart1] <==> + bitspart1 = jamo_initial_index_inverse[index1] */ +static const char jamo_initial_index_inverse[19] = { + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, +}; +/* index2+1 = jamo_medial_index[bitspart2] <==> + bitspart2 = jamo_medial_index_inverse[index2] */ +static const char jamo_medial_index_inverse[21] = { + 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1a, 0x1b, 0x1c, 0x1d, +}; +/* index3 = jamo_final_index[bitspart3] <==> + bitspart3 = jamo_final_index_inverse[index3] */ +static const char jamo_final_index_inverse[28] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, +}; + +static int +johab_hangul_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + if (wc >= 0x3131 && wc < 0x3164) { + unsigned short c = johab_hangul_page31[wc-0x3131]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } else if (wc >= 0xac00 && wc < 0xd7a4) { + unsigned int index1; + unsigned int index2; + unsigned int index3; + unsigned short c; + unsigned int tmp = wc - 0xac00; + index3 = tmp % 28; tmp = tmp / 28; + index2 = tmp % 21; tmp = tmp / 21; + index1 = tmp; + c = (((((1 << 5) + | jamo_initial_index_inverse[index1]) << 5) + | jamo_medial_index_inverse[index2]) << 5) + | jamo_final_index_inverse[index3]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} + +/* + * Decomposition of JOHAB Hangul in one to three Johab Jamo elements. + */ + +/* Decompose wc into r[0..2], and return the number of resulting Jamo elements. + Return RET_ILUNI if decomposition is not possible. */ + +static int johab_hangul_decompose (conv_t conv, ucs4_t* r, ucs4_t wc) +{ + unsigned char buf[2]; + int ret = johab_hangul_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + unsigned int hangul = (buf[0] << 8) | buf[1]; + unsigned char jamo1 = jamo_initial[(hangul >> 10) & 31]; + unsigned char jamo2 = jamo_medial[(hangul >> 5) & 31]; + unsigned char jamo3 = jamo_final[hangul & 31]; + if ((hangul >> 15) != 1) abort(); + if (jamo1 != NONE && jamo2 != NONE && jamo3 != NONE) { + /* They are not all three == FILL because that would correspond to + johab = 0x8441, which doesn't exist. */ + ucs4_t* p = r; + if (jamo1 != FILL) + *p++ = 0x3130 + jamo1; + if (jamo2 != FILL) + *p++ = 0x3130 + jamo2; + if (jamo3 != FILL) + *p++ = 0x3130 + jamo3; + return p-r; + } + } + return RET_ILUNI; +} + +#undef fill +#undef none +#undef FILL +#undef NONE diff --git a/Externals/libiconv-1.14/lib/koi8_r.h b/Externals/libiconv-1.14/lib/koi8_r.h new file mode 100644 index 0000000000..3e435368f1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/koi8_r.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * KOI8-R + */ + +/* Specification: RFC 1489 */ + +static const unsigned short koi8_r_2uni[128] = { + /* 0x80 */ + 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, + 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, + /* 0x90 */ + 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, + 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, + /* 0xa0 */ + 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, + /* 0xb0 */ + 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, + /* 0xc0 */ + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + /* 0xd0 */ + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, + /* 0xe0 */ + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + /* 0xf0 */ + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, +}; + +static int +koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) koi8_r_2uni[c-0x80]; + return 1; +} + +static const unsigned char koi8_r_page00[88] = { + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ +}; +static const unsigned char koi8_r_page04[88] = { + 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ + 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ + 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ + 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ + 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ + 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ + 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ + 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ + 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ +}; +static const unsigned char koi8_r_page22[80] = { + 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char koi8_r_page23[8] = { + 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char koi8_r_page25[168] = { + 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */ + 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ + 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */ + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = koi8_r_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0458) + c = koi8_r_page04[wc-0x0400]; + else if (wc >= 0x2218 && wc < 0x2268) + c = koi8_r_page22[wc-0x2218]; + else if (wc >= 0x2320 && wc < 0x2328) + c = koi8_r_page23[wc-0x2320]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = koi8_r_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/koi8_ru.h b/Externals/libiconv-1.14/lib/koi8_ru.h new file mode 100644 index 0000000000..e43ae72032 --- /dev/null +++ b/Externals/libiconv-1.14/lib/koi8_ru.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * KOI8-RU + */ + +static const unsigned short koi8_ru_2uni[128] = { + /* 0x80 */ + 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, + 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, + /* 0x90 */ + 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, + 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, + /* 0xa0 */ + 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x045e, 0x255e, + /* 0xb0 */ + 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x040e, 0x00a9, + /* 0xc0 */ + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + /* 0xd0 */ + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, + /* 0xe0 */ + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + /* 0xf0 */ + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, +}; + +static int +koi8_ru_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) koi8_ru_2uni[c-0x80]; + return 1; +} + +static const unsigned char koi8_ru_page00[88] = { + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ +}; +static const unsigned char koi8_ru_page04[152] = { + 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, /* 0x08-0x0f */ + 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ + 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ + 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ + 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ + 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ + 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ + 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ + 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ + 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char koi8_ru_page22[80] = { + 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char koi8_ru_page23[8] = { + 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char koi8_ru_page25[168] = { + 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ + 0xa9, 0xaa, 0xab, 0xac, 0x00, 0x00, 0xaf, 0xb0, /* 0x58-0x5f */ + 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ + 0xba, 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +koi8_ru_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = koi8_ru_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = koi8_ru_page04[wc-0x0400]; + else if (wc >= 0x2218 && wc < 0x2268) + c = koi8_ru_page22[wc-0x2218]; + else if (wc >= 0x2320 && wc < 0x2328) + c = koi8_ru_page23[wc-0x2320]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = koi8_ru_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/koi8_t.h b/Externals/libiconv-1.14/lib/koi8_t.h new file mode 100644 index 0000000000..0f7a568529 --- /dev/null +++ b/Externals/libiconv-1.14/lib/koi8_t.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * KOI8-T + */ + +static const unsigned short koi8_t_2uni[128] = { + /* 0x80 */ + 0x049b, 0x0493, 0x201a, 0x0492, 0x201e, 0x2026, 0x2020, 0x2021, + 0xfffd, 0x2030, 0x04b3, 0x2039, 0x04b2, 0x04b7, 0x04b6, 0xfffd, + /* 0x90 */ + 0x049a, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xa0 */ + 0xfffd, 0x04ef, 0x04ee, 0x0451, 0x00a4, 0x04e3, 0x00a6, 0x00a7, + 0xfffd, 0xfffd, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0xfffd, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x00b2, 0x0401, 0xfffd, 0x04e2, 0x00b6, 0x00b7, + 0xfffd, 0x2116, 0xfffd, 0x00bb, 0xfffd, 0xfffd, 0xfffd, 0x00a9, + /* 0xc0 */ + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + /* 0xd0 */ + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, + /* 0xe0 */ + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + /* 0xf0 */ + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, +}; + +static int +koi8_t_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = koi8_t_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char koi8_t_page00[32] = { + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xbf, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char koi8_t_page04[240] = { + 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ + 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ + 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ + 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ + 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ + 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ + 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ + 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ + 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x90, 0x80, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x8c, 0x8a, 0x00, 0x00, 0x8e, 0x8d, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0xb5, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa1, /* 0xe8-0xef */ +}; +static const unsigned char koi8_t_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; +static const unsigned char koi8_t_page21[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; + +static int +koi8_t_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = koi8_t_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x04f0) + c = koi8_t_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2040) + c = koi8_t_page20[wc-0x2010]; + else if (wc >= 0x2110 && wc < 0x2128) + c = koi8_t_page21[wc-0x2110]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/koi8_u.h b/Externals/libiconv-1.14/lib/koi8_u.h new file mode 100644 index 0000000000..0637d5854f --- /dev/null +++ b/Externals/libiconv-1.14/lib/koi8_u.h @@ -0,0 +1,161 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * KOI8-U + */ + +/* Specification: RFC 2319 */ + +static const unsigned short koi8_u_2uni[128] = { + /* 0x80 */ + 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, + 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, + /* 0x90 */ + 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, + 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, + /* 0xa0 */ + 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, + /* 0xb0 */ + 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, + /* 0xc0 */ + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + /* 0xd0 */ + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, + /* 0xe0 */ + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + /* 0xf0 */ + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, +}; + +static int +koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) koi8_u_2uni[c-0x80]; + return 1; +} + +static const unsigned char koi8_u_page00[88] = { + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ +}; +static const unsigned char koi8_u_page04[152] = { + 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ + 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ + 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ + 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ + 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ + 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ + 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ + 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ + 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char koi8_u_page22[80] = { + 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char koi8_u_page23[8] = { + 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char koi8_u_page25[168] = { + 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ + 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ + 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ + 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ +}; + +static int +koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00f8) + c = koi8_u_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x0498) + c = koi8_u_page04[wc-0x0400]; + else if (wc >= 0x2218 && wc < 0x2268) + c = koi8_u_page22[wc-0x2218]; + else if (wc >= 0x2320 && wc < 0x2328) + c = koi8_u_page23[wc-0x2320]; + else if (wc >= 0x2500 && wc < 0x25a8) + c = koi8_u_page25[wc-0x2500]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ksc5601.h b/Externals/libiconv-1.14/lib/ksc5601.h new file mode 100644 index 0000000000..fd16623217 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ksc5601.h @@ -0,0 +1,3022 @@ +/* + * Copyright (C) 1999-2007 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * KSC5601.1987-0, now KS X 1001:2002 + */ + +static const unsigned short ksc5601_2uni_page21[1115] = { + /* 0x21 */ + 0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003, + 0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c, + 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, + 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, + 0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033, + 0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220, + 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b, + 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, + 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191, + 0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, + 0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, + 0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, + /* 0x22 */ + 0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8, + 0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0, + 0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0, + 0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, + 0x2299, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5, + 0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c, + 0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, + 0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116, + 0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 0x20ac, 0x00ae, 0x327e, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x23 */ + 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, + 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, + 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, + 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, + 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, + 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, + 0xff39, 0xff3a, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40, + 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, + 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, + 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, + 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, + /* 0x24 */ + 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, + 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, + 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, + 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, + 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, + 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, + 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, + 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, + 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, + 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180, + 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, + 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, + /* 0x25 */ + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2160, + 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, + 0x2169, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x26 */ + 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, + 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, + 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, + 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, + 0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d, + 0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a, + 0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a, + 0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, + 0x2547, 0x2548, 0x2549, 0x254a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x27 */ + 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4, + 0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, + 0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f, + 0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1, + 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9, + 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc, + 0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, + 0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5, + 0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac, + 0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x33c6, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x28 */ + 0x00c6, 0x00d0, 0x00aa, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x013f, + 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0xfffd, + 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, + 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, + 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, + 0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3, + 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, + 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3, + 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154, + 0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, + /* 0x29 */ + 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, + 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149, + 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, + 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f, + 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, + 0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f, + 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, + 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, + 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475, + 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, + 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3, + 0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084, + /* 0x2a */ + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, + 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, + 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, + 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, + 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, + 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, + 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x2b */ + 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, + 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, + 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, + 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, + 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, + 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, + 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, + 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, + 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, + 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, + 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0x2c */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, + 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, + 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, + 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, + 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, + 0x044f, +}; +static const unsigned short ksc5601_2uni_page30[2350] = { + /* 0x30 */ + 0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10, + 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19, + 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d, + 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b, + 0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77, + 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86, + 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d, + 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf, + 0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4, + 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7, + 0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5, + 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, + /* 0x31 */ + 0xad0c, 0xad0d, 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29, + 0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, + 0xad47, 0xad49, 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, + 0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, + 0xad7d, 0xad7f, 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, + 0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, + 0xadd0, 0xadd1, 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, + 0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, + 0xae14, 0xae30, 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, + 0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, + 0xae50, 0xae54, 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, + 0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78, + /* 0x32 */ + 0xae79, 0xae7b, 0xae7c, 0xae7d, 0xae84, 0xae85, 0xae8c, 0xaebc, + 0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0, + 0xaed1, 0xaed8, 0xaed9, 0xaedc, 0xaee8, 0xaeeb, 0xaeed, 0xaef4, + 0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, + 0xaf30, 0xaf32, 0xaf34, 0xaf3c, 0xaf3d, 0xaf3f, 0xaf41, 0xaf42, + 0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, + 0xaf79, 0xaf80, 0xaf84, 0xaf88, 0xaf90, 0xaf91, 0xaf95, 0xaf9c, + 0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb, + 0xafcd, 0xafce, 0xafd4, 0xafdc, 0xafe8, 0xafe9, 0xaff0, 0xaff1, + 0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014, + 0xb01c, 0xb01d, 0xb028, 0xb044, 0xb045, 0xb048, 0xb04a, 0xb04c, + 0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059, + /* 0x33 */ + 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c, 0xb08d, 0xb08f, + 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1, + 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, + 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5, + 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4, 0xb0d8, 0xb0e0, + 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113, + 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123, 0xb124, 0xb125, + 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140, + 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154, 0xb155, 0xb158, + 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188, + 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194, 0xb198, 0xb19c, + 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd, + /* 0x34 */ + 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd, + 0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217, + 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268, + 0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290, + 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3, + 0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9, + 0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2, + 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, + 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa, + 0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311, + 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358, + 0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, + /* 0x35 */ + 0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, + 0xb380, 0xb381, 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, + 0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, + 0xb3cc, 0xb3ce, 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, + 0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, + 0xb420, 0xb428, 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, + 0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, + 0xb49d, 0xb4a4, 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, + 0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, + 0xb4e4, 0xb4e6, 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, + 0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, + 0xb529, 0xb52a, 0xb530, 0xb531, 0xb534, 0xb538, + /* 0x36 */ + 0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d, + 0xb550, 0xb554, 0xb55c, 0xb55d, 0xb55f, 0xb560, 0xb561, 0xb5a0, + 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, + 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, + 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611, + 0xb614, 0xb618, 0xb625, 0xb62c, 0xb634, 0xb648, 0xb664, 0xb668, + 0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, + 0xb6f0, 0xb6f4, 0xb6f8, 0xb700, 0xb701, 0xb705, 0xb728, 0xb729, + 0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748, + 0xb74c, 0xb754, 0xb755, 0xb760, 0xb764, 0xb768, 0xb770, 0xb771, + 0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d, + 0xb78f, 0xb790, 0xb791, 0xb792, 0xb796, 0xb797, + /* 0x37 */ + 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac, + 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9, 0xb7ec, 0xb7ed, + 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807, + 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819, 0xb81b, 0xb81d, + 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838, + 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c, 0xb85d, 0xb860, + 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d, + 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1, 0xb8c3, 0xb8c5, + 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9, + 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd, 0xb904, 0xb918, + 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951, + 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969, + /* 0x38 */ + 0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985, + 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0, + 0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc, + 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db, + 0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec, + 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01, + 0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48, + 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58, + 0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71, + 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8, + 0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb, + 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, + /* 0x39 */ + 0xbb00, 0xbb04, 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, + 0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, + 0xbb3d, 0xbb3e, 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, + 0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, + 0xbb90, 0xbba4, 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, + 0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, + 0xbc02, 0xbc08, 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, + 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, + 0xbc1e, 0xbc1f, 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, + 0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, + 0xbc49, 0xbc4c, 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, + 0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97, + /* 0x3a */ + 0xbc99, 0xbc9a, 0xbca0, 0xbca1, 0xbca4, 0xbca7, 0xbca8, 0xbcb0, + 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, + 0xbccd, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, + 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09, + 0xbd10, 0xbd14, 0xbd24, 0xbd2c, 0xbd40, 0xbd48, 0xbd49, 0xbd4c, + 0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84, + 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd90, 0xbd91, 0xbd93, 0xbd95, + 0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, + 0xbdd8, 0xbddc, 0xbde9, 0xbdf0, 0xbdf4, 0xbdf8, 0xbe00, 0xbe03, + 0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, + 0xbe44, 0xbe45, 0xbe48, 0xbe4c, 0xbe4e, 0xbe54, 0xbe55, 0xbe57, + 0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64, + /* 0x3b */ + 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75, 0xbe7b, + 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90, + 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1, 0xbed4, 0xbed7, + 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08, + 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf40, 0xbf41, + 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5, + 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf, 0xbfe1, 0xc03c, + 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091, + 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5, 0xc0ac, 0xc0ad, + 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd, + 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9, 0xc0cc, 0xc0d0, + 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4, + /* 0x3c */ + 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100, + 0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f, + 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f, + 0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148, + 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c, + 0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178, + 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c, + 0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0, + 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0, + 0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200, + 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c, + 0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, + /* 0x3d */ + 0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, + 0xc258, 0xc260, 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, + 0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, + 0xc29d, 0xc2a4, 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, + 0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, + 0xc2ec, 0xc2ed, 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, + 0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, + 0xc315, 0xc318, 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, + 0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, + 0xc37d, 0xc384, 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc, + 0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, + 0xc3f8, 0xc408, 0xc410, 0xc424, 0xc42c, 0xc430, + /* 0x3e */ + 0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c, + 0xc474, 0xc475, 0xc479, 0xc480, 0xc494, 0xc49c, 0xc4b8, 0xc4bc, + 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, + 0xc501, 0xc50c, 0xc510, 0xc514, 0xc51c, 0xc528, 0xc529, 0xc52c, + 0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548, + 0xc549, 0xc54a, 0xc54c, 0xc54d, 0xc54e, 0xc553, 0xc554, 0xc555, + 0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564, + 0xc568, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575, 0xc57c, 0xc57d, + 0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595, + 0xc597, 0xc598, 0xc59c, 0xc5a0, 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, + 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, + 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cc, 0xc5ce, + /* 0x3f */ + 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5, + 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6, 0xc5f7, 0xc5fc, + 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607, + 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b, 0xc61c, 0xc624, + 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634, + 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641, 0xc644, 0xc648, + 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660, + 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c, 0xc680, 0xc688, + 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4, + 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4, 0xc6b8, 0xc6b9, + 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0, + 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8, + /* 0x40 */ + 0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705, + 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721, + 0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c, + 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751, + 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c, + 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d, + 0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a, + 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a, + 0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad, + 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8, + 0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8, + 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, + /* 0x41 */ + 0xc810, 0xc811, 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, + 0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, + 0xc848, 0xc849, 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, + 0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, + 0xc88b, 0xc88c, 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, + 0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, + 0xc8d9, 0xc8e0, 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, + 0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, + 0xc92c, 0xc934, 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, + 0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, + 0xc990, 0xc998, 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, + 0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, + /* 0x42 */ + 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da, 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, + 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, + 0xc9f9, 0xc9fc, 0xca00, 0xca08, 0xca09, 0xca0b, 0xca0c, 0xca0d, + 0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c, + 0xca5d, 0xca5f, 0xca60, 0xca61, 0xca68, 0xca7d, 0xca84, 0xca98, + 0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1, + 0xcad3, 0xcad8, 0xcad9, 0xcae0, 0xcaec, 0xcaf4, 0xcb08, 0xcb10, + 0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c, + 0xcb50, 0xcb58, 0xcb59, 0xcb5d, 0xcb64, 0xcb78, 0xcb79, 0xcb9c, + 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, + 0xcc14, 0xcc1c, 0xcc1d, 0xcc21, 0xcc22, 0xcc27, 0xcc28, 0xcc29, + 0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b, + /* 0x43 */ + 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48, 0xcc4c, 0xcc54, + 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68, + 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0, 0xcca8, 0xcca9, + 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4, + 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4, 0xccec, 0xccf0, + 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b, + 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c, 0xcd60, 0xcd64, + 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95, + 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9, 0xcdb0, 0xcdc4, + 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb, + 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19, 0xce20, 0xce21, + 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35, + /* 0x44 */ + 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69, + 0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85, + 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1, + 0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5, + 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9, + 0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15, + 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31, + 0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67, + 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c, + 0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8, + 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011, + 0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, + /* 0x45 */ + 0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, + 0xd06c, 0xd06d, 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, + 0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, + 0xd0c1, 0xd0c4, 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, + 0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, + 0xd0f0, 0xd0f1, 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, + 0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, + 0xd150, 0xd154, 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, + 0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, + 0xd1b1, 0xd1b3, 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, + 0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, + 0xd23c, 0xd23d, 0xd23f, 0xd241, 0xd248, 0xd25c, + /* 0x46 */ + 0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295, + 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac, 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, + 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, + 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0, 0xd2f1, 0xd2f4, 0xd2f8, 0xd300, + 0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314, + 0xd316, 0xd31c, 0xd31d, 0xd31f, 0xd320, 0xd321, 0xd325, 0xd328, + 0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d, + 0xd344, 0xd345, 0xd37c, 0xd37d, 0xd380, 0xd384, 0xd38c, 0xd38d, + 0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8, + 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4, 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, + 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, + 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd, 0xd3ff, 0xd401, + /* 0x47 */ + 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d, + 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480, 0xd482, 0xd488, + 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4, + 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8, 0xd4fb, 0xd4fd, + 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d, + 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551, 0xd558, 0xd559, + 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574, + 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587, 0xd588, 0xd589, + 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8, + 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8, 0xd5ec, 0xd5f4, + 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610, + 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620, + /* 0x48 */ + 0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648, + 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c, + 0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c, + 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac, + 0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1, + 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5, + 0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c, + 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738, + 0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756, + 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769, + 0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789, + 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d, +}; +static const unsigned short ksc5601_2uni_page4a[4888] = { + /* 0x4a */ + 0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5, + 0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c, + 0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36, + 0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404, + 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3, + 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7, + 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5, + 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593, + 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, + 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be, + 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3, + 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95, + /* 0x4b */ + 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808, + 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f, + 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221, + 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7, + 0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea, + 0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0xf900, + 0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, + 0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da, + 0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0xf902, 0x907d, + 0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106, + 0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091, + 0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2, + /* 0x4c */ + 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9, + 0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, + 0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, + 0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, + 0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, + 0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, + 0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, + 0x66bb, 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, + 0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, + 0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, + 0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x5951, + 0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0, + /* 0x4d */ + 0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b, + 0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9, + 0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7, + 0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc, + 0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6, + 0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0xf903, 0x8f9c, + 0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2, + 0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, + 0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904, + 0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, + 0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, + 0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc, + /* 0x4e */ + 0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846, + 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec, + 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, + 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, + 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, + 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b, + 0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0, + 0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1, + 0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821, + 0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e, + 0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18, + 0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe, + /* 0x4f */ + 0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7, + 0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb, + 0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396, + 0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205, + 0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1, + 0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b, + 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4, + 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae, + 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8, + 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5, + 0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d, + 0x8ecc, 0x994b, 0xf906, 0x6677, 0x6b78, 0x8cb4, + /* 0x50 */ + 0x9b3c, 0xf907, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea, + 0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035, + 0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908, + 0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, + 0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, + 0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909, + 0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, + 0x82a9, 0x887e, 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca, + 0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, + 0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x5668, 0x573b, + 0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e, + 0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3, + /* 0x51 */ + 0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23, + 0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3, + 0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a, + 0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18, + 0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e, + 0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854, + 0x91d1, 0x55ab, 0x513a, 0xf90b, 0xf90c, 0x5a1c, 0x61e6, 0xf90d, + 0x62cf, 0x62ff, 0xf90e, 0xf90f, 0xf910, 0xf911, 0xf912, 0xf913, + 0x90a3, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919, + 0xf91a, 0xf91b, 0xf91c, 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f, + 0x96e3, 0xf920, 0x634f, 0x637a, 0x5357, 0xf921, 0x678f, 0x6960, + 0x6e73, 0xf922, 0x7537, 0xf923, 0xf924, 0xf925, + /* 0x52 */ + 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, 0x5a18, 0xf928, 0xf929, + 0xf92a, 0xf92b, 0xf92c, 0x4e43, 0xf92d, 0x5167, 0x5948, 0x67f0, + 0x8010, 0xf92e, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c, + 0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0xf92f, 0x5974, 0x5f29, + 0x6012, 0xf930, 0xf931, 0xf932, 0x7459, 0xf933, 0xf934, 0xf935, + 0xf936, 0xf937, 0xf938, 0x99d1, 0xf939, 0xf93a, 0xf93b, 0xf93c, + 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0x6fc3, + 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x60f1, 0xf946, 0xf947, 0x8166, + 0xf948, 0xf949, 0x5c3f, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, + 0xf94f, 0xf950, 0xf951, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0xf952, + 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, 0xf959, + 0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336, + /* 0x53 */ + 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7, + 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde, + 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8, + 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b, + 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7, + 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510, + 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6, + 0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1, + 0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8, + 0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230, + 0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6, + 0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843, + /* 0x54 */ + 0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc, + 0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48, + 0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2, + 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b, + 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e, + 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd, + 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c, + 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597, + 0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0xf95a, 0x8c46, 0x9017, + 0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, + 0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, + 0x9a30, 0x5587, 0x61f6, 0xf95b, 0x7669, 0x7f85, + /* 0x55 */ + 0x863f, 0x87ba, 0x88f8, 0x908f, 0xf95c, 0x6d1b, 0x70d9, 0x73de, + 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, 0xf95e, 0x4e82, 0x5375, + 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, 0x9e1e, 0x524c, 0x8fa3, + 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, 0x7c43, 0x7e9c, 0x85cd, + 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, 0x5eca, 0x6717, 0x6d6a, + 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, 0x4f86, 0x5d0d, 0x5fa0, + 0x840a, 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, + 0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, + 0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e, + 0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62, + 0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, + 0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23, + /* 0x56 */ + 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a, + 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582, + 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0xf95f, + 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046, + 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7, + 0x79ae, 0x91b4, 0x96b7, 0x52de, 0xf960, 0x6488, 0x64c4, 0x6ad3, + 0x6f5e, 0x7018, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def, + 0x8f05, 0x9732, 0x9b6f, 0x9dfa, 0x9e75, 0x788c, 0x797f, 0x7da0, + 0x83c9, 0x9304, 0x9e7f, 0x9e93, 0x8ad6, 0x58df, 0x5f04, 0x6727, + 0x7027, 0x74cf, 0x7c60, 0x807e, 0x5121, 0x7028, 0x7262, 0x78ca, + 0x8cc2, 0x8cda, 0x8cf4, 0x96f7, 0x4e86, 0x50da, 0x5bee, 0x5ed6, + 0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc, + /* 0x57 */ + 0x907c, 0x9b27, 0x9f8d, 0x58d8, 0x5a41, 0x5c62, 0x6a13, 0x6dda, + 0x6f0f, 0x763b, 0x7d2f, 0x7e37, 0x851e, 0x8938, 0x93e4, 0x964b, + 0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409, + 0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e, + 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b, + 0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, 0x808b, 0x51dc, 0x51cc, + 0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, 0x4fda, 0x5229, 0x5398, + 0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281, + 0x72f8, 0x7406, 0x7483, 0xf962, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8, + 0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d, + 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f, + 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, + /* 0x58 */ + 0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8, + 0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, + 0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, + 0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, + 0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, + 0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, + 0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb, + 0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164, + 0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c, + 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, 0x840c, + 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704, + 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, + /* 0x59 */ + 0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, + 0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, + 0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478, + 0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261, + 0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28, + 0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, + 0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999, + 0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7, + 0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab, + 0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46, + 0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8, + 0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587, + /* 0x5a */ + 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff, + 0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae, + 0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e, + 0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d, + 0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, + 0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, + 0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, + 0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, + 0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, + 0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, + 0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, + 0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, + /* 0x5b */ + 0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, + 0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, + 0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, + 0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, + 0x9632, 0x9f90, 0x500d, 0x4ff3, 0xf963, 0x57f9, 0x5f98, 0x62dc, + 0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4, + 0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70, + 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a, + 0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, 0x98dc, + 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e, + 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb, + 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, + /* 0x5c */ + 0x78a7, 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a, + 0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, + 0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, + 0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, + 0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a, + 0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14, + 0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, + 0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, + 0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, + 0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, + 0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256, + 0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66, + /* 0x5d */ + 0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0xf966, 0x6276, 0x6577, 0x65a7, + 0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151, + 0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb, + 0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7, + 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff, + 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde, + 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, 0x5f17, 0x5f7f, + 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15, + 0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2, + 0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6, + 0x6bd7, 0x6bd8, 0x6cb8, 0xf968, 0x7435, 0x75fa, 0x7812, 0x7891, + 0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5, + /* 0x5e */ + 0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb, + 0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, + 0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, + 0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b, + 0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2, + 0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb, + 0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c, + 0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23, + 0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9, + 0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df, + 0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc, + 0x99df, 0x9e9d, 0x524a, 0xf969, 0x6714, 0xf96a, + /* 0x5f */ + 0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, + 0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, + 0x85a9, 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, + 0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, + 0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, + 0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, + 0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, + 0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7, + 0xf96c, 0x7a61, 0x7d22, 0x8272, 0x7272, 0x751f, 0x7525, 0xf96d, + 0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055, + 0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2, + 0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72, + /* 0x60 */ + 0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd, + 0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790, + 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b, + 0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e, + 0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c, + 0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a, + 0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae, + 0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, + 0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2, + 0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x6d89, 0x71ee, + 0xf96e, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f, + 0x665f, 0x7329, 0x73f9, 0x76db, 0x7701, 0x7b6c, + /* 0x61 */ + 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72, + 0x6d17, 0x7a05, 0x7b39, 0x7d30, 0xf96f, 0x8cb0, 0x53ec, 0x562f, + 0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414, + 0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2, + 0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20, + 0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5, + 0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f, + 0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0, + 0x905c, 0x98e1, 0x7387, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f, + 0x8aa6, 0x9001, 0x980c, 0x5237, 0xf970, 0x7051, 0x788e, 0x9396, + 0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd, + 0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101, + /* 0x62 */ + 0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x6578, 0x6a39, 0x6b8a, + 0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2, + 0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac, + 0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896, + 0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9, + 0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3, + 0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, + 0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, + 0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, + 0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, + 0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, + 0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27, + /* 0x63 */ + 0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936, + 0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607, + 0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4, + 0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f, + 0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494, + 0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4, + 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, + 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, + 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, + 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, + 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, + 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, + /* 0x64 */ + 0xf972, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, + 0xf973, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25, + 0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d, + 0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd, + 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, 0x6e25, 0x9102, 0x9354, + 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848, + 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb, + 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4, + 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f, + 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x57c3, 0x5d16, + 0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384, + 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, + /* 0x65 */ + 0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c, + 0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0xf974, 0x91ce, 0x5f31, + 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, 0x84bb, 0x85e5, 0x8e8d, + 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, 0x5b43, 0x6059, 0x63da, + 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, 0x6a23, 0x6d0b, 0x7001, + 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0xf97b, 0x7f8a, 0xf97c, + 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, 0xf97e, 0x990a, 0x5704, + 0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a, + 0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830, + 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c, + 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88, + 0x4f59, 0xf97f, 0xf980, 0xf981, 0x5982, 0xf982, + /* 0x66 */ + 0xf983, 0x6b5f, 0x6c5d, 0xf984, 0x74b5, 0x7916, 0xf985, 0x8207, + 0x8245, 0x8339, 0x8f3f, 0x8f5d, 0xf986, 0x9918, 0xf987, 0xf988, + 0xf989, 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c, + 0x75ab, 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827, + 0x59f8, 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350, + 0x633b, 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, + 0x6f14, 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5, + 0xf994, 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f, + 0xf997, 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b, + 0x9cf6, 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, + 0xf9a0, 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3, + 0xf9a5, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, + /* 0x67 */ + 0xf9a6, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, + 0xf9a8, 0xf9a9, 0x584b, 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, + 0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, + 0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, + 0xf9ae, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, + 0x8a60, 0x8fce, 0xf9b1, 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, + 0x4e42, 0x502a, 0xf9b5, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca, + 0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0xf9b6, 0x88d4, + 0x8a63, 0x8b7d, 0x8c6b, 0xf9b7, 0x92b3, 0xf9b8, 0x9713, 0x9810, + 0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da, + 0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0xf9b9, 0x61ca, + 0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3, + /* 0x68 */ + 0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07, + 0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, + 0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, + 0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9, + 0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b, + 0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, + 0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, + 0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a, + 0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0xf9ba, 0xf9bb, + 0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x5be5, 0xf9bc, + 0xf9bd, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0xf9be, 0x66dc, + 0xf9bf, 0x6a48, 0xf9c0, 0x71ff, 0x7464, 0xf9c1, + /* 0x69 */ + 0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0xf9c2, 0x87ef, + 0x8981, 0x8b20, 0x9059, 0xf9c3, 0x9080, 0x9952, 0x617e, 0x6b32, + 0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7, + 0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67, + 0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9, + 0x8e0a, 0x9394, 0x93de, 0xf9c4, 0x4e8e, 0x4f51, 0x5076, 0x512a, + 0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182, + 0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9, + 0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5, + 0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631, + 0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0xf9c5, 0x6a52, + 0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553, + /* 0x6a */ + 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a, + 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b, + 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72, + 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060, + 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d, + 0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170, + 0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466, + 0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f, + 0x4e73, 0x4f91, 0x5112, 0x516a, 0xf9c7, 0x552f, 0x55a9, 0x5b7a, + 0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109, + 0x63c4, 0x6538, 0x6709, 0xf9c8, 0x67d4, 0x67da, 0xf9c9, 0x6961, + 0x6962, 0x6cb9, 0x6d27, 0xf9ca, 0x6e38, 0xf9cb, + /* 0x6b */ + 0x6fe1, 0x7336, 0x7337, 0xf9cc, 0x745c, 0x7531, 0xf9cd, 0x7652, + 0xf9ce, 0xf9cf, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb, + 0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9, + 0x936e, 0xf9d0, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, + 0xf9d3, 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, + 0x73a7, 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, + 0xf9da, 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, + 0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, + 0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, + 0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100, + 0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3, + 0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc, + /* 0x6c */ + 0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0xf9dd, 0xf9de, 0x5937, + 0x59e8, 0xf9df, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0xf9e0, 0xf9e1, + 0xf9e2, 0xf9e3, 0x723e, 0x73e5, 0xf9e4, 0x7570, 0x75cd, 0xf9e5, + 0x79fb, 0xf9e6, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0xf9e7, + 0xf9e8, 0x8cbd, 0x8cb3, 0x9087, 0xf9e9, 0xf9ea, 0x98f4, 0x990c, + 0xf9eb, 0xf9ec, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, + 0x4eba, 0x4ec1, 0x5203, 0x5370, 0xf9ed, 0x54bd, 0x56e0, 0x59fb, + 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, + 0xf9f0, 0x8693, 0x8a8d, 0xf9f1, 0x976d, 0x9777, 0xf9f2, 0xf9f3, + 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, + 0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0xf9f4, 0xf9f5, + 0x7a14, 0xf9f6, 0x834f, 0x8cc3, 0x5165, 0x5344, + /* 0x6d */ + 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4, + 0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063, + 0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1, + 0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7, + 0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, + 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, + 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, + 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, + 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, + 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b, + 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, + 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, + /* 0x6e */ + 0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d, + 0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09, + 0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e, + 0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17, + 0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7, + 0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8, + 0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575, + 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e, + 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea, + 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178, + 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb, + 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, + /* 0x6f */ + 0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, + 0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, + 0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, + 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, + 0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, + 0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, + 0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, + 0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, + 0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, + 0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, + 0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, + 0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, + /* 0x70 */ + 0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d, + 0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd, + 0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d, + 0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14, + 0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d, + 0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a, + 0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97, + 0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf, + 0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5, + 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, + 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, + 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, + /* 0x71 */ + 0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7, + 0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4, + 0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d, + 0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7, + 0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db, + 0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152, + 0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, + 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, + 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, + 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, + 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, + 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea, + /* 0x72 */ + 0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f, + 0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c, + 0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3, + 0x829d, 0x82b7, 0x8718, 0x8a8c, 0xf9fc, 0x8d04, 0x8dbe, 0x9072, + 0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875, + 0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25, + 0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e, + 0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a, + 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707, + 0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be, + 0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f, + 0x6715, 0xf9fd, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f, + /* 0x73 */ + 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f, + 0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a, + 0xf9fe, 0x8e49, 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84, + 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da, + 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d, + 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed, + 0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92, + 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70, + 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32, + 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5, + 0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc, + 0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56, + /* 0x74 */ + 0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0xf9ff, 0x5254, + 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620, + 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929, + 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6, + 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8, + 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d, + 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d, + 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252, + 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8, + 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0xfa00, 0x5243, 0x66ff, + 0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d, + 0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2, + /* 0x75 */ + 0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e, + 0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82, + 0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7, + 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a, + 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283, + 0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e, + 0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf, + 0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a, + 0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, + 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, + 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, + 0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403, + /* 0x76 */ + 0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0, + 0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074, + 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4, + 0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4, + 0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4, + 0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed, + 0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x6c88, + 0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31, + 0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253, + 0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c, + 0x5353, 0x5544, 0x577c, 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b, + 0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17, + /* 0x77 */ + 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058, + 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d, + 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0xfa03, + 0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70, + 0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0xfa04, + 0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e, + 0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806, + 0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac, + 0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46, + 0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c, + 0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742, + 0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211, + /* 0x78 */ + 0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557, + 0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d, + 0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247, + 0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, + 0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2, + 0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305, + 0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b, + 0x62b1, 0x6355, 0xfa06, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de, + 0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea, + 0x98fd, 0x9b91, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, 0xfa07, + 0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2, + 0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43, + /* 0x79 */ + 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c, + 0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c, + 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, + 0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630, + 0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15, + 0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d, + 0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591, + 0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8, + 0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677, + 0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c, + 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d, + 0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a, + /* 0x7a */ + 0xfa08, 0xfa09, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a, + 0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3, + 0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016, + 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6, + 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b, + 0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57, + 0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, + 0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d, + 0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0xfa0a, 0x8ce2, 0x9249, + 0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354, + 0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2, + 0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b, + /* 0x7b */ + 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9, + 0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8, + 0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af, + 0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5, + 0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf, + 0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425, + 0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6, + 0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac, + 0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, + 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, + 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, + 0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575, + /* 0x7c */ + 0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774, + 0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, + 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, + 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, + 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, + 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, + 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, + 0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a, + 0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae, + 0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x8aa8, 0x8cc4, + 0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d, + 0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6, + /* 0x7d */ + 0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e, + 0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd, + 0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, + 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, + 0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147, + 0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667, + 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, + 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, + 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, + 0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09, + 0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9, + 0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70, +}; + +static int +ksc5601_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x30 && c1 <= 0x48) || (c1 >= 0x4a && c1 <= 0x7d)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if (c2 >= 0x21 && c2 < 0x7f) { + unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); + unsigned short wc = 0xfffd; + if (i < 1410) { + if (i < 1115) + wc = ksc5601_2uni_page21[i]; + } else if (i < 3854) { + if (i < 3760) + wc = ksc5601_2uni_page30[i-1410]; + } else { + if (i < 8742) + wc = ksc5601_2uni_page4a[i-3854]; + } + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short ksc5601_2charset[8227] = { + 0x222e, 0x2234, 0x2157, 0x2127, 0x2823, 0x2129, 0x2267, 0x2146, + 0x213e, 0x2977, 0x2978, 0x2225, 0x2252, 0x2124, 0x222c, 0x2976, + 0x282c, 0x2879, 0x2876, 0x287a, 0x222f, 0x2821, 0x2822, 0x213f, + 0x282a, 0x282d, 0x292c, 0x2921, 0x2923, 0x2140, 0x292a, 0x292d, + 0x2922, 0x2824, 0x2924, 0x2925, 0x2826, 0x2926, 0x2927, 0x2828, + 0x2928, 0x2829, 0x2929, 0x2930, 0x282f, 0x292f, 0x282b, 0x292b, + 0x282e, 0x292e, 0x2227, 0x2230, 0x2228, 0x222b, 0x222a, 0x222d, + 0x2229, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, + 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, + 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, + 0x2558, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, + 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, + 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, + 0x2578, 0x2c27, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, + 0x2c28, 0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, + 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, + 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, + 0x2c40, 0x2c41, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, + 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, + 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, + 0x2c68, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c6f, + 0x2c70, 0x2c71, 0x2c57, 0x212a, 0x212e, 0x212f, 0x2130, 0x2131, + 0x2253, 0x2254, 0x2125, 0x2126, 0x2236, 0x2147, 0x2148, 0x2158, + 0x2979, 0x297a, 0x297b, 0x297c, 0x297d, 0x297e, 0x2266, 0x2149, + 0x2235, 0x2724, 0x2260, 0x2265, 0x2262, 0x2759, 0x214a, 0x2877, + 0x2878, 0x287b, 0x287c, 0x287d, 0x287e, 0x2530, 0x2531, 0x2532, + 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x2521, + 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, + 0x252a, 0x2167, 0x2168, 0x2166, 0x2169, 0x216a, 0x2255, 0x2258, + 0x2256, 0x2259, 0x2257, 0x2221, 0x2222, 0x2223, 0x2153, 0x2224, + 0x2154, 0x2174, 0x2175, 0x2233, 0x2232, 0x216e, 0x2170, 0x2144, + 0x2150, 0x212b, 0x217c, 0x217d, 0x217b, 0x217a, 0x2172, 0x2173, + 0x2231, 0x2145, 0x2171, 0x212d, 0x216f, 0x2156, 0x2141, 0x2155, + 0x2142, 0x2143, 0x216c, 0x216d, 0x2178, 0x2179, 0x2176, 0x2177, + 0x2241, 0x2151, 0x2152, 0x2867, 0x2868, 0x2869, 0x286a, 0x286b, + 0x286c, 0x286d, 0x286e, 0x286f, 0x2870, 0x2871, 0x2872, 0x2873, + 0x2874, 0x2875, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, + 0x296d, 0x296e, 0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, + 0x2975, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, + 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, + 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, + 0x2964, 0x2965, 0x2966, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, + 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, + 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, + 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2621, 0x262c, 0x2622, + 0x262d, 0x2623, 0x2648, 0x2647, 0x262e, 0x2624, 0x2642, 0x2641, + 0x262f, 0x2626, 0x2646, 0x2645, 0x2631, 0x2625, 0x2644, 0x2643, + 0x2630, 0x2627, 0x263c, 0x2649, 0x264a, 0x2637, 0x264b, 0x264c, + 0x2632, 0x2629, 0x263e, 0x264d, 0x264e, 0x2639, 0x264f, 0x2650, + 0x2634, 0x2628, 0x2651, 0x2652, 0x2638, 0x263d, 0x2653, 0x2654, + 0x2633, 0x262a, 0x2655, 0x2656, 0x263a, 0x263f, 0x2657, 0x2658, + 0x2635, 0x262b, 0x2659, 0x265a, 0x263b, 0x265b, 0x265c, 0x2640, + 0x265d, 0x265e, 0x265f, 0x2660, 0x2661, 0x2662, 0x2663, 0x2664, + 0x2636, 0x2246, 0x2161, 0x2160, 0x2243, 0x2247, 0x2248, 0x224b, + 0x224a, 0x2249, 0x224c, 0x2163, 0x2162, 0x223a, 0x2239, 0x2165, + 0x2164, 0x2238, 0x2237, 0x215f, 0x215e, 0x2242, 0x215b, 0x215d, + 0x215c, 0x2244, 0x2245, 0x215a, 0x2159, 0x224f, 0x224e, 0x2250, + 0x2251, 0x214f, 0x214e, 0x223c, 0x223d, 0x2240, 0x223b, 0x223e, + 0x223f, 0x224d, 0x225b, 0x225c, 0x225d, 0x225a, 0x2121, 0x2122, + 0x2123, 0x2128, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, + 0x213a, 0x213b, 0x213c, 0x213d, 0x216b, 0x2132, 0x2133, 0x2a21, + 0x2a22, 0x2a23, 0x2a24, 0x2a25, 0x2a26, 0x2a27, 0x2a28, 0x2a29, + 0x2a2a, 0x2a2b, 0x2a2c, 0x2a2d, 0x2a2e, 0x2a2f, 0x2a30, 0x2a31, + 0x2a32, 0x2a33, 0x2a34, 0x2a35, 0x2a36, 0x2a37, 0x2a38, 0x2a39, + 0x2a3a, 0x2a3b, 0x2a3c, 0x2a3d, 0x2a3e, 0x2a3f, 0x2a40, 0x2a41, + 0x2a42, 0x2a43, 0x2a44, 0x2a45, 0x2a46, 0x2a47, 0x2a48, 0x2a49, + 0x2a4a, 0x2a4b, 0x2a4c, 0x2a4d, 0x2a4e, 0x2a4f, 0x2a50, 0x2a51, + 0x2a52, 0x2a53, 0x2a54, 0x2a55, 0x2a56, 0x2a57, 0x2a58, 0x2a59, + 0x2a5a, 0x2a5b, 0x2a5c, 0x2a5d, 0x2a5e, 0x2a5f, 0x2a60, 0x2a61, + 0x2a62, 0x2a63, 0x2a64, 0x2a65, 0x2a66, 0x2a67, 0x2a68, 0x2a69, + 0x2a6a, 0x2a6b, 0x2a6c, 0x2a6d, 0x2a6e, 0x2a6f, 0x2a70, 0x2a71, + 0x2a72, 0x2a73, 0x2b21, 0x2b22, 0x2b23, 0x2b24, 0x2b25, 0x2b26, + 0x2b27, 0x2b28, 0x2b29, 0x2b2a, 0x2b2b, 0x2b2c, 0x2b2d, 0x2b2e, + 0x2b2f, 0x2b30, 0x2b31, 0x2b32, 0x2b33, 0x2b34, 0x2b35, 0x2b36, + 0x2b37, 0x2b38, 0x2b39, 0x2b3a, 0x2b3b, 0x2b3c, 0x2b3d, 0x2b3e, + 0x2b3f, 0x2b40, 0x2b41, 0x2b42, 0x2b43, 0x2b44, 0x2b45, 0x2b46, + 0x2b47, 0x2b48, 0x2b49, 0x2b4a, 0x2b4b, 0x2b4c, 0x2b4d, 0x2b4e, + 0x2b4f, 0x2b50, 0x2b51, 0x2b52, 0x2b53, 0x2b54, 0x2b55, 0x2b56, + 0x2b57, 0x2b58, 0x2b59, 0x2b5a, 0x2b5b, 0x2b5c, 0x2b5d, 0x2b5e, + 0x2b5f, 0x2b60, 0x2b61, 0x2b62, 0x2b63, 0x2b64, 0x2b65, 0x2b66, + 0x2b67, 0x2b68, 0x2b69, 0x2b6a, 0x2b6b, 0x2b6c, 0x2b6d, 0x2b6e, + 0x2b6f, 0x2b70, 0x2b71, 0x2b72, 0x2b73, 0x2b74, 0x2b75, 0x2b76, + 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, + 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, + 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, + 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, + 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, + 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, + 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, + 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, + 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, + 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, + 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, + 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x2931, 0x2932, + 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, + 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, + 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, + 0x294b, 0x294c, 0x225f, 0x2831, 0x2832, 0x2833, 0x2834, 0x2835, + 0x2836, 0x2837, 0x2838, 0x2839, 0x283a, 0x283b, 0x283c, 0x283d, + 0x283e, 0x283f, 0x2840, 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, + 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x2268, + 0x225e, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x273a, 0x273b, + 0x275c, 0x275d, 0x275e, 0x2736, 0x2737, 0x2738, 0x2754, 0x2755, + 0x2756, 0x2757, 0x2758, 0x2721, 0x2722, 0x2723, 0x2725, 0x272b, + 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, + 0x2734, 0x2727, 0x2728, 0x2729, 0x272a, 0x273d, 0x273e, 0x2765, + 0x2766, 0x2767, 0x2768, 0x2761, 0x2762, 0x2763, 0x273f, 0x2740, + 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, + 0x274e, 0x274f, 0x2750, 0x2751, 0x2752, 0x2753, 0x275a, 0x275b, + 0x2263, 0x276c, 0x2726, 0x2760, 0x276f, 0x2261, 0x273c, 0x276d, + 0x2735, 0x2739, 0x276a, 0x276b, 0x275f, 0x2264, 0x2764, 0x276e, + 0x2769, 0x6c69, 0x6f4b, 0x7652, 0x5832, 0x6d5b, 0x5f32, 0x5f3e, + 0x793b, 0x5c74, 0x7564, 0x7326, 0x5d60, 0x6126, 0x4e78, 0x5c30, + 0x632a, 0x7169, 0x4d7a, 0x7c2f, 0x5321, 0x712b, 0x6751, 0x522c, + 0x4e79, 0x717d, 0x5e3f, 0x7b3a, 0x7939, 0x4e52, 0x632b, 0x6b60, + 0x4e7a, 0x4b77, 0x6525, 0x4a61, 0x544c, 0x6a61, 0x5c63, 0x5f2d, + 0x4b6b, 0x552f, 0x5675, 0x6578, 0x5e40, 0x6c23, 0x694d, 0x6a27, + 0x6976, 0x7b3b, 0x6769, 0x6f4c, 0x5066, 0x5e41, 0x642c, 0x584c, + 0x7971, 0x4e5f, 0x7a24, 0x6632, 0x7a7b, 0x7a3d, 0x4c48, 0x6f4d, + 0x5555, 0x5322, 0x6c51, 0x6427, 0x6c52, 0x7631, 0x4e7b, 0x5051, + 0x4b3f, 0x6d24, 0x6d28, 0x5e42, 0x7662, 0x6d5c, 0x5c75, 0x6039, + 0x544e, 0x7435, 0x535b, 0x5635, 0x6c24, 0x6466, 0x716a, 0x4b6c, + 0x4b40, 0x6c72, 0x506a, 0x7972, 0x6c25, 0x505f, 0x676a, 0x506b, + 0x5c51, 0x5b69, 0x7d4c, 0x5b57, 0x5a61, 0x5636, 0x635f, 0x5e43, + 0x5e44, 0x4a21, 0x6e6c, 0x5323, 0x6e37, 0x784f, 0x6a48, 0x6e38, + 0x712c, 0x7125, 0x694e, 0x793c, 0x6579, 0x6c6a, 0x5d56, 0x6d42, + 0x7825, 0x653a, 0x5b58, 0x4a22, 0x514d, 0x6e6d, 0x6c6b, 0x5e45, + 0x6360, 0x4a49, 0x7269, 0x554e, 0x7636, 0x4e42, 0x5647, 0x6334, + 0x712d, 0x6a62, 0x5742, 0x7327, 0x4d6a, 0x6b6e, 0x5932, 0x7d25, + 0x7655, 0x5562, 0x7835, 0x4c75, 0x7535, 0x642d, 0x676b, 0x7155, + 0x703b, 0x6935, 0x4c49, 0x7a55, 0x6154, 0x5756, 0x5c41, 0x5e46, + 0x7a6f, 0x6361, 0x6173, 0x5c76, 0x4e7c, 0x5b44, 0x7871, 0x5c64, + 0x656f, 0x5c31, 0x5556, 0x735a, 0x4b41, 0x5b43, 0x597a, 0x536e, + 0x7a38, 0x7d26, 0x6b6f, 0x7426, 0x4c4a, 0x7328, 0x735b, 0x5b27, + 0x7637, 0x4f66, 0x7072, 0x4b5a, 0x6752, 0x5743, 0x7670, 0x685e, + 0x6526, 0x6567, 0x4a23, 0x4c27, 0x6a49, 0x7836, 0x7a25, 0x712e, + 0x6f4e, 0x4b6d, 0x7630, 0x6f4f, 0x694f, 0x775e, 0x4e53, 0x5c77, + 0x5b28, 0x4b78, 0x5f21, 0x5d61, 0x754a, 0x6936, 0x676c, 0x6e6e, + 0x7370, 0x5f3f, 0x4c4b, 0x5041, 0x7452, 0x603a, 0x5f40, 0x4e60, + 0x5c52, 0x7d6a, 0x5676, 0x6a4a, 0x6869, 0x632c, 0x7350, 0x4a24, + 0x5b78, 0x5e47, 0x6b70, 0x7156, 0x6562, 0x4c4c, 0x4b7b, 0x6a63, + 0x5f41, 0x566d, 0x6950, 0x6e39, 0x5563, 0x5153, 0x6570, 0x6834, + 0x6b43, 0x6a2a, 0x7a7c, 0x7576, 0x703c, 0x7d54, 0x603b, 0x4e43, + 0x503a, 0x773a, 0x5873, 0x774d, 0x642e, 0x545f, 0x5067, 0x6c7d, + 0x522e, 0x6e6f, 0x5557, 0x6a64, 0x7822, 0x4d6b, 0x573f, 0x7b31, + 0x4d6c, 0x5c32, 0x506c, 0x4e7d, 0x6e70, 0x4c42, 0x506d, 0x6577, + 0x737c, 0x6e22, 0x5933, 0x5874, 0x6937, 0x4e2e, 0x5922, 0x5871, + 0x544f, 0x6527, 0x5552, 0x5629, 0x7422, 0x7157, 0x5558, 0x703d, + 0x5750, 0x5450, 0x574f, 0x6b6a, 0x7d6b, 0x5b6d, 0x7c45, 0x4b42, + 0x7d55, 0x7448, 0x686a, 0x7573, 0x795e, 0x536f, 0x6c53, 0x5d42, + 0x6f37, 0x6754, 0x4a4a, 0x597b, 0x7a7d, 0x562a, 0x7478, 0x7777, + 0x5c2c, 0x5757, 0x5f22, 0x4e3e, 0x5370, 0x7024, 0x616c, 0x4f67, + 0x734b, 0x6d29, 0x4a3e, 0x746f, 0x764e, 0x5e7b, 0x503b, 0x5537, + 0x6e71, 0x7428, 0x5c78, 0x4b27, 0x5a4e, 0x6066, 0x6d25, 0x6e72, + 0x5c79, 0x795c, 0x735c, 0x7872, 0x7479, 0x7c71, 0x503c, 0x5b79, + 0x5731, 0x4b7c, 0x7025, 0x4b7d, 0x5574, 0x4d6d, 0x4a25, 0x562b, + 0x5042, 0x703e, 0x523d, 0x4c24, 0x7a36, 0x4c4d, 0x5a7a, 0x764f, + 0x6938, 0x5875, 0x4c4e, 0x574d, 0x5451, 0x696d, 0x4a6b, 0x5962, + 0x7d32, 0x632d, 0x564c, 0x5934, 0x6127, 0x6e53, 0x5043, 0x7d33, + 0x5564, 0x4f68, 0x6d43, 0x5032, 0x4e7e, 0x5a28, 0x7850, 0x7d56, + 0x7851, 0x7852, 0x5c53, 0x5d62, 0x7b79, 0x5d41, 0x6335, 0x6d5d, + 0x4e44, 0x4b21, 0x5d63, 0x7c5d, 0x792f, 0x527b, 0x4f21, 0x6428, + 0x7436, 0x6c7e, 0x632e, 0x676d, 0x7d41, 0x5a62, 0x5833, 0x5d64, + 0x706f, 0x7671, 0x7a70, 0x5175, 0x5a4f, 0x5c54, 0x5c26, 0x6f3f, + 0x4e4f, 0x6059, 0x5956, 0x6c54, 0x6a4b, 0x4a3f, 0x5530, 0x4f69, + 0x716d, 0x4c4f, 0x6478, 0x646d, 0x5758, 0x7d27, 0x6a2b, 0x7632, + 0x4f70, 0x793d, 0x6674, 0x4b5b, 0x7351, 0x6951, 0x7329, 0x5060, + 0x6952, 0x5a63, 0x6252, 0x7622, 0x6174, 0x5a64, 0x6755, 0x753f, + 0x4f22, 0x4d2f, 0x4f23, 0x4d30, 0x717e, 0x5023, 0x612f, 0x7823, + 0x4a26, 0x773b, 0x726a, 0x5e48, 0x6953, 0x5e49, 0x7d5e, 0x4a40, + 0x796a, 0x514e, 0x6e54, 0x5452, 0x5923, 0x7d28, 0x5759, 0x774e, + 0x7a3e, 0x4f56, 0x5770, 0x6b61, 0x7845, 0x5c7a, 0x5d43, 0x795f, + 0x676f, 0x7d65, 0x7623, 0x597c, 0x7d29, 0x676e, 0x5565, 0x6f50, + 0x4d31, 0x7722, 0x7132, 0x7131, 0x4d32, 0x5a2b, 0x4a27, 0x6362, + 0x7b3c, 0x5924, 0x6e3a, 0x7853, 0x7b7a, 0x4f24, 0x5c7b, 0x7663, + 0x6d2a, 0x7221, 0x4e61, 0x7a26, 0x7960, 0x6c56, 0x646e, 0x7921, + 0x7b6f, 0x796b, 0x6e23, 0x6a2c, 0x4a28, 0x747a, 0x4d56, 0x7c76, + 0x7449, 0x7854, 0x7826, 0x5e4a, 0x7246, 0x575a, 0x5350, 0x5845, + 0x6a66, 0x735d, 0x645a, 0x7664, 0x7672, 0x5f42, 0x597d, 0x4c76, + 0x533a, 0x642f, 0x7961, 0x7026, 0x4b53, 0x603c, 0x744a, 0x547a, + 0x7d2a, 0x7962, 0x7437, 0x7d42, 0x7c30, 0x7d6c, 0x4a62, 0x7d3d, + 0x6a67, 0x5f43, 0x5152, 0x4e62, 0x5324, 0x7d2b, 0x5f60, 0x7247, + 0x6770, 0x506e, 0x732a, 0x5e4b, 0x7638, 0x6175, 0x7133, 0x7723, + 0x4a29, 0x4f25, 0x5f44, 0x6130, 0x703f, 0x7624, 0x6336, 0x7a46, + 0x506f, 0x7d6d, 0x5d44, 0x7c77, 0x663f, 0x5e2d, 0x7a3f, 0x6571, + 0x6d44, 0x5225, 0x7d6e, 0x7536, 0x6176, 0x5e4c, 0x7c5e, 0x6c57, + 0x4d5d, 0x5637, 0x4d33, 0x7855, 0x6558, 0x4f6a, 0x4f50, 0x6a4c, + 0x6a2e, 0x6a2d, 0x5371, 0x5325, 0x774f, 0x6e24, 0x5024, 0x7222, + 0x5070, 0x7223, 0x7778, 0x5033, 0x5b29, 0x533b, 0x4a6c, 0x7126, + 0x4b55, 0x7767, 0x4d5e, 0x7724, 0x7840, 0x535d, 0x4c50, 0x4f26, + 0x7673, 0x6177, 0x535c, 0x7a7e, 0x7a27, 0x6b59, 0x4f27, 0x6a2f, + 0x646f, 0x6939, 0x7158, 0x5858, 0x6072, 0x6634, 0x5c7c, 0x7371, + 0x6350, 0x727b, 0x5b46, 0x5071, 0x5072, 0x4f5c, 0x5351, 0x4c31, + 0x7758, 0x4b28, 0x6b3c, 0x643e, 0x745c, 0x5c42, 0x7027, 0x6640, + 0x4a6d, 0x686b, 0x6568, 0x5c43, 0x6d5e, 0x5372, 0x4c77, 0x4e54, + 0x672b, 0x4b43, 0x6131, 0x7732, 0x5373, 0x5352, 0x7540, 0x5f5d, + 0x6e73, 0x6771, 0x7d34, 0x7248, 0x7352, 0x6e74, 0x6253, 0x4c51, + 0x5f6a, 0x693a, 0x5957, 0x754d, 0x7172, 0x7a47, 0x5978, 0x5442, + 0x7665, 0x5d45, 0x6772, 0x6d5f, 0x4a4b, 0x5b7a, 0x6835, 0x5326, + 0x7d35, 0x7949, 0x6462, 0x7b3d, 0x5724, 0x4e45, 0x4e55, 0x5666, + 0x653d, 0x5e4d, 0x6c73, 0x6d60, 0x6c6c, 0x7b3e, 0x5f6b, 0x6178, + 0x793e, 0x5073, 0x602a, 0x6862, 0x6254, 0x527d, 0x6528, 0x5953, + 0x535e, 0x7438, 0x773c, 0x5c7d, 0x686c, 0x6467, 0x6377, 0x6c28, + 0x7a71, 0x6572, 0x5074, 0x522f, 0x5c65, 0x5025, 0x7134, 0x7c31, + 0x4c78, 0x5d46, 0x7a51, 0x775f, 0x7a28, 0x6e75, 0x5e4e, 0x6773, + 0x772c, 0x6b44, 0x6d61, 0x602b, 0x5d47, 0x5233, 0x523f, 0x4a4c, + 0x7b3f, 0x657d, 0x5d65, 0x584d, 0x6c74, 0x5075, 0x686d, 0x5052, + 0x5958, 0x7666, 0x5b2a, 0x7760, 0x5859, 0x7423, 0x745d, 0x6f51, + 0x5935, 0x6d2b, 0x6337, 0x6e3b, 0x4d34, 0x6073, 0x6a4d, 0x6c75, + 0x686e, 0x4b29, 0x712f, 0x4a4d, 0x6c29, 0x726b, 0x7d6f, 0x7973, + 0x6641, 0x6c58, 0x6d2c, 0x6a4e, 0x685f, 0x5e4f, 0x5226, 0x6774, + 0x5156, 0x6642, 0x6363, 0x6430, 0x5834, 0x7625, 0x735e, 0x5725, + 0x7768, 0x6846, 0x7b66, 0x5d66, 0x5c7e, 0x585a, 0x5a2c, 0x6a30, + 0x6338, 0x4a2a, 0x6179, 0x6a31, 0x726c, 0x7a6e, 0x6e55, 0x7974, + 0x526c, 0x7b7b, 0x7d70, 0x603d, 0x4e63, 0x7846, 0x5e2e, 0x5f45, + 0x653e, 0x6d2d, 0x7a6a, 0x4d6e, 0x6d26, 0x6d2e, 0x706d, 0x5d21, + 0x6d2f, 0x7c78, 0x586b, 0x4c79, 0x4d35, 0x7a29, 0x615d, 0x6255, + 0x6d4f, 0x5d22, 0x794a, 0x6a68, 0x656d, 0x536b, 0x6954, 0x617a, + 0x644c, 0x6164, 0x6847, 0x4e5b, 0x5c55, 0x7735, 0x7c73, 0x7073, + 0x4e2f, 0x7135, 0x6f52, 0x6848, 0x6b71, 0x4b54, 0x603e, 0x6378, + 0x6a69, 0x7c32, 0x6074, 0x4f60, 0x6e25, 0x7a2a, 0x6643, 0x6132, + 0x4a2b, 0x6364, 0x693b, 0x6256, 0x7372, 0x6e56, 0x6a32, 0x5076, + 0x6c59, 0x5a4b, 0x4f28, 0x5d23, 0x585b, 0x794e, 0x6955, 0x6351, + 0x523c, 0x582c, 0x734c, 0x4d7b, 0x7656, 0x6775, 0x686f, 0x6379, + 0x523b, 0x7373, 0x637b, 0x5e50, 0x4e30, 0x5677, 0x7159, 0x7541, + 0x5c44, 0x753b, 0x5e51, 0x5c66, 0x5e52, 0x6d62, 0x6e76, 0x6a4f, + 0x706e, 0x637c, 0x535f, 0x5374, 0x6133, 0x6134, 0x7453, 0x5f46, + 0x6956, 0x5b2b, 0x7626, 0x6339, 0x6b45, 0x7429, 0x4d36, 0x5279, + 0x5a2d, 0x5263, 0x4f51, 0x4b5c, 0x4c7a, 0x4f5d, 0x6829, 0x633b, + 0x633a, 0x605a, 0x6e77, 0x5c33, 0x5375, 0x5726, 0x7635, 0x575b, + 0x6155, 0x546a, 0x5f23, 0x7d5f, 0x5077, 0x6d54, 0x4b2a, 0x645b, + 0x617b, 0x4b22, 0x5360, 0x643f, 0x7b40, 0x5a3e, 0x644d, 0x5639, + 0x6f40, 0x617c, 0x7639, 0x5f47, 0x6431, 0x5c67, 0x5c68, 0x7a56, + 0x5376, 0x715a, 0x7a72, 0x627d, 0x554f, 0x5078, 0x4d5f, 0x754b, + 0x6470, 0x4b2b, 0x5744, 0x627e, 0x5d5a, 0x5a2e, 0x4a6e, 0x5539, + 0x6321, 0x6863, 0x732b, 0x4f29, 0x5377, 0x5471, 0x4e64, 0x6872, + 0x6575, 0x672e, 0x563a, 0x5f6c, 0x6440, 0x6864, 0x5835, 0x645c, + 0x7439, 0x7136, 0x625e, 0x6135, 0x4d6f, 0x7127, 0x4e65, 0x4b5d, + 0x5963, 0x732c, 0x5079, 0x6c2b, 0x5e53, 0x7769, 0x7975, 0x615e, + 0x4b6e, 0x633c, 0x7856, 0x5b6e, 0x7d71, 0x7736, 0x745e, 0x726d, + 0x5b59, 0x7028, 0x617d, 0x5e54, 0x602c, 0x6d63, 0x5361, 0x5f48, + 0x5936, 0x7d2c, 0x6f53, 0x6441, 0x786b, 0x5b2c, 0x7c46, 0x582d, + 0x763a, 0x5b5f, 0x5353, 0x7847, 0x4a4e, 0x7841, 0x5234, 0x5c34, + 0x7a39, 0x4a4f, 0x7c33, 0x6a6a, 0x6a6b, 0x507a, 0x6d64, 0x5d67, + 0x5f49, 0x5f6d, 0x6e3c, 0x6f41, 0x4c52, 0x5d24, 0x5f4a, 0x5378, + 0x7128, 0x4d37, 0x6f54, 0x645d, 0x5f6e, 0x4b2c, 0x693c, 0x6a6c, + 0x5f4b, 0x793f, 0x562f, 0x5546, 0x4f2a, 0x4e29, 0x5678, 0x7137, + 0x6e78, 0x5959, 0x735f, 0x7848, 0x4e46, 0x5566, 0x7466, 0x6645, + 0x6f55, 0x4b6f, 0x7c5f, 0x5c27, 0x5667, 0x7849, 0x6352, 0x633d, + 0x4f61, 0x7040, 0x6c5a, 0x5d57, 0x7b70, 0x6c2c, 0x7029, 0x7a57, + 0x7b41, 0x5240, 0x6530, 0x6d65, 0x4b2d, 0x7930, 0x7725, 0x4b2e, + 0x5a2f, 0x5836, 0x5327, 0x7b32, 0x7d44, 0x6c2d, 0x7b21, 0x6569, + 0x696e, 0x7374, 0x7873, 0x7041, 0x5e2f, 0x7830, 0x7360, 0x672f, + 0x5b2d, 0x6635, 0x7928, 0x5d58, 0x6859, 0x6f56, 0x5362, 0x625f, + 0x7c60, 0x5748, 0x7d2d, 0x5f6f, 0x4c53, 0x5379, 0x5470, 0x5b47, + 0x5e55, 0x7074, 0x5550, 0x6559, 0x7c47, 0x5c56, 0x6260, 0x5a30, + 0x7323, 0x536c, 0x744b, 0x7d45, 0x637d, 0x7931, 0x507b, 0x6c5b, + 0x753c, 0x7224, 0x584e, 0x584f, 0x7577, 0x7661, 0x5237, 0x7b6c, + 0x5d48, 0x6468, 0x5241, 0x7857, 0x563b, 0x5e56, 0x773d, 0x6c2e, + 0x5061, 0x6075, 0x6a33, 0x4e56, 0x4c25, 0x6c76, 0x6261, 0x633e, + 0x7c48, 0x4d70, 0x7976, 0x5f70, 0x653f, 0x4e3f, 0x7c61, 0x6d30, + 0x7d51, 0x763b, 0x794f, 0x6b5a, 0x4a41, 0x5238, 0x4d71, 0x6353, + 0x7d66, 0x666d, 0x637a, 0x702a, 0x7950, 0x7c62, 0x7827, 0x6165, + 0x6e79, 0x6776, 0x6a6d, 0x7c34, 0x7542, 0x575c, 0x7075, 0x5d68, + 0x536d, 0x757c, 0x5a3f, 0x4c7b, 0x537a, 0x7424, 0x6f57, 0x5443, + 0x7b63, 0x7b6d, 0x602d, 0x6a6e, 0x7b33, 0x6442, 0x7667, 0x525d, + 0x5f4c, 0x7c49, 0x6529, 0x6076, 0x7633, 0x617e, 0x4b70, 0x6a6f, + 0x6a70, 0x5a40, 0x7834, 0x6b72, 0x6443, 0x6957, 0x6471, 0x4a6f, + 0x4e57, 0x7c4a, 0x7361, 0x4b44, 0x6365, 0x4b45, 0x6a34, 0x693d, + 0x5749, 0x6b5b, 0x6d31, 0x4c43, 0x773e, 0x7c4b, 0x7874, 0x5937, + 0x7353, 0x7354, 0x7764, 0x7751, 0x5837, 0x4e31, 0x4a42, 0x7b34, + 0x4b46, 0x7076, 0x5567, 0x6a50, 0x4c54, 0x4b2f, 0x742a, 0x692f, + 0x7543, 0x6958, 0x5d69, 0x7173, 0x557b, 0x5e3b, 0x747b, 0x7d73, + 0x7d72, 0x7726, 0x5d49, 0x5453, 0x4c28, 0x5a41, 0x4c55, 0x5964, + 0x7a4a, 0x6563, 0x533c, 0x4a70, 0x5044, 0x4a50, 0x7a2b, 0x6b6b, + 0x6778, 0x5965, 0x5157, 0x7324, 0x547b, 0x7c63, 0x7a58, 0x7355, + 0x4f2b, 0x6b73, 0x557c, 0x5354, 0x4d7c, 0x5966, 0x6279, 0x6221, + 0x6b54, 0x6077, 0x6432, 0x4c7c, 0x7b64, 0x742b, 0x503d, 0x4a71, + 0x6f38, 0x5740, 0x6e7a, 0x7d74, 0x5363, 0x7b42, 0x5568, 0x5b2e, + 0x6136, 0x7837, 0x603f, 0x7b43, 0x5d6a, 0x6222, 0x6e26, 0x7668, + 0x7675, 0x5d4a, 0x5062, 0x5d26, 0x5d6b, 0x6479, 0x632f, 0x507c, + 0x747c, 0x4c3c, 0x776a, 0x6564, 0x5f71, 0x7761, 0x7977, 0x6f39, + 0x7858, 0x7929, 0x7859, 0x6e3d, 0x5846, 0x6463, 0x754e, 0x5d59, + 0x5967, 0x5239, 0x5543, 0x5a65, 0x5a50, 0x5159, 0x4e58, 0x4b5e, + 0x742c, 0x5a7b, 0x7669, 0x6873, 0x4f2c, 0x7070, 0x747d, 0x5b48, + 0x4e40, 0x6354, 0x514f, 0x7175, 0x4d72, 0x4f6b, 0x4d38, 0x6326, + 0x515a, 0x7225, 0x7226, 0x644e, 0x537b, 0x7129, 0x7249, 0x6f58, + 0x6649, 0x5838, 0x7a73, 0x7335, 0x7824, 0x5173, 0x6648, 0x785a, + 0x5c69, 0x5e57, 0x4b5f, 0x4f6c, 0x745f, 0x5174, 0x523a, 0x5f72, + 0x6137, 0x6223, 0x537c, 0x6d66, 0x5b49, 0x647a, 0x4f5e, 0x4e50, + 0x5553, 0x7375, 0x772e, 0x6f48, 0x4d73, 0x754f, 0x6573, 0x7042, + 0x4a51, 0x6a71, 0x5026, 0x595a, 0x702b, 0x6b67, 0x6540, 0x7c35, + 0x6444, 0x4c29, 0x7d46, 0x6a35, 0x652a, 0x5f3a, 0x615f, 0x5a51, + 0x6138, 0x6874, 0x537d, 0x6224, 0x724a, 0x5a66, 0x7733, 0x7d4d, + 0x7336, 0x6e57, 0x7544, 0x5824, 0x7227, 0x5938, 0x5939, 0x6f49, + 0x564e, 0x774b, 0x5f2e, 0x6875, 0x5235, 0x5355, 0x744c, 0x5a7c, + 0x5968, 0x776b, 0x7549, 0x733c, 0x5a52, 0x5335, 0x6836, 0x564f, + 0x743a, 0x7749, 0x4c2a, 0x7043, 0x4c56, 0x5053, 0x533d, 0x5b7b, + 0x4b60, 0x5364, 0x7677, 0x553a, 0x734d, 0x4b61, 0x6b74, 0x742d, + 0x7c2a, 0x776c, 0x6876, 0x5a67, 0x774c, 0x6541, 0x606e, 0x557d, + 0x4e66, 0x7c2b, 0x553b, 0x7228, 0x6225, 0x4d39, 0x6a72, 0x4b47, + 0x4d74, 0x5b2f, 0x6f59, 0x4d3a, 0x7c79, 0x5f73, 0x4e67, 0x5a42, + 0x4f2d, 0x6779, 0x7828, 0x7362, 0x4a72, 0x5f24, 0x5444, 0x4c57, + 0x6542, 0x4d3b, 0x6f5a, 0x6e58, 0x5d27, 0x6226, 0x6040, 0x5630, + 0x784a, 0x7c7a, 0x597e, 0x5e30, 0x5d6c, 0x5a68, 0x5460, 0x5679, + 0x4d57, 0x5e58, 0x7278, 0x6456, 0x5045, 0x742e, 0x5d28, 0x6d45, + 0x7356, 0x5e59, 0x6366, 0x5328, 0x5b30, 0x655a, 0x633f, 0x5b31, + 0x5569, 0x6041, 0x6f5b, 0x7069, 0x5732, 0x507d, 0x5969, 0x507e, + 0x6c6d, 0x5329, 0x7229, 0x7044, 0x6262, 0x696f, 0x7951, 0x6959, + 0x685a, 0x5a43, 0x5a44, 0x5445, 0x677a, 0x4d60, 0x6330, 0x5b32, + 0x7b44, 0x7363, 0x5925, 0x7b67, 0x5d4b, 0x5054, 0x6636, 0x602e, + 0x7d5a, 0x5c35, 0x6078, 0x6731, 0x7570, 0x585c, 0x6d46, 0x6139, + 0x6340, 0x7940, 0x6970, 0x595b, 0x7364, 0x5c36, 0x6469, 0x7045, + 0x6341, 0x7c4c, 0x7c4d, 0x724b, 0x724c, 0x644f, 0x715b, 0x7a59, + 0x7138, 0x7d75, 0x6079, 0x677b, 0x7c37, 0x7c64, 0x7b45, 0x6367, + 0x5839, 0x7678, 0x5c45, 0x4c58, 0x602f, 0x7467, 0x6f5c, 0x4f7c, + 0x6f5d, 0x722a, 0x7d3e, 0x4a2c, 0x7d3b, 0x7d47, 0x6732, 0x6a51, + 0x5f74, 0x516c, 0x645e, 0x6543, 0x5926, 0x4d3c, 0x7365, 0x6d55, + 0x593a, 0x6d67, 0x7b35, 0x786c, 0x6067, 0x4c59, 0x5446, 0x6725, + 0x5575, 0x533e, 0x7c7b, 0x6472, 0x5f75, 0x6878, 0x786d, 0x4e47, + 0x7d76, 0x6858, 0x4d58, 0x6756, 0x4c5a, 0x4a63, 0x5f76, 0x7047, + 0x7046, 0x583a, 0x7174, 0x7470, 0x754c, 0x7c65, 0x6a45, 0x6a73, + 0x5d5b, 0x5c57, 0x5e7d, 0x7279, 0x5547, 0x5850, 0x7048, 0x5121, + 0x5122, 0x5954, 0x5668, 0x594a, 0x5a31, 0x5847, 0x5c62, 0x734e, + 0x7574, 0x7139, 0x5a53, 0x766a, 0x4f75, 0x7d2e, 0x4a52, 0x5f34, + 0x575d, 0x7a3a, 0x6e27, 0x753d, 0x7875, 0x6d68, 0x5461, 0x5123, + 0x6156, 0x7978, 0x5b4a, 0x4b79, 0x5454, 0x595c, 0x6e3e, 0x776d, + 0x526e, 0x6166, 0x7779, 0x5d6d, 0x685b, 0x5b33, 0x5177, 0x6030, + 0x5462, 0x7657, 0x5779, 0x585d, 0x4d7d, 0x722b, 0x4d3d, 0x7842, + 0x722c, 0x4a2d, 0x4a2e, 0x4f2e, 0x6342, 0x5c37, 0x5b5a, 0x593b, + 0x4a73, 0x7653, 0x6678, 0x6a75, 0x6a76, 0x7679, 0x4f2f, 0x4a53, + 0x4a2f, 0x5230, 0x713a, 0x5733, 0x6343, 0x737d, 0x5e5a, 0x5e5b, + 0x6f5e, 0x6263, 0x6e7b, 0x5f77, 0x574a, 0x4e68, 0x5b5b, 0x713b, + 0x6971, 0x7a37, 0x5046, 0x4c2b, 0x6e28, 0x4b7a, 0x7979, 0x4c7d, + 0x537e, 0x6450, 0x726e, 0x5455, 0x5f4d, 0x7c38, 0x5150, 0x724d, + 0x7752, 0x4a54, 0x5559, 0x585e, 0x4d59, 0x6e29, 0x763c, 0x4c5b, + 0x7049, 0x7c7c, 0x6849, 0x747e, 0x677c, 0x575e, 0x5e5c, 0x702c, + 0x4c7e, 0x4d61, 0x613a, 0x5b6f, 0x5a32, 0x5125, 0x5c38, 0x5876, + 0x5124, 0x4d62, 0x5c6a, 0x7077, 0x704a, 0x503e, 0x5d5c, 0x5456, + 0x5356, 0x6d50, 0x4d21, 0x5f35, 0x5f78, 0x5421, 0x4e32, 0x684a, + 0x6b75, 0x6355, 0x7550, 0x7521, 0x5927, 0x652b, 0x664b, 0x7571, + 0x6545, 0x7923, 0x605b, 0x766b, 0x4b71, 0x596a, 0x7522, 0x5751, + 0x5178, 0x6a78, 0x6a79, 0x5a33, 0x6f5f, 0x716f, 0x6576, 0x6e3f, + 0x6264, 0x503f, 0x7a2c, 0x7551, 0x6733, 0x693e, 0x724e, 0x5b34, + 0x7c4e, 0x5d6e, 0x6734, 0x5734, 0x7734, 0x4d3e, 0x5a69, 0x4f30, + 0x7759, 0x7366, 0x4e59, 0x4e2a, 0x4b48, 0x5027, 0x704b, 0x5047, + 0x6445, 0x5b60, 0x555a, 0x5727, 0x6e40, 0x7876, 0x7552, 0x6d69, + 0x593c, 0x6546, 0x7523, 0x5a54, 0x6227, 0x7b7c, 0x715c, 0x4a74, + 0x687a, 0x4e69, 0x6978, 0x6265, 0x5039, 0x5472, 0x5126, 0x5f4e, + 0x7c74, 0x532a, 0x4c2c, 0x6f60, 0x6565, 0x5055, 0x5b7c, 0x7c66, + 0x4b7e, 0x6d6a, 0x5e31, 0x7963, 0x5422, 0x4f76, 0x5650, 0x556a, + 0x716e, 0x7a4b, 0x6521, 0x5531, 0x4f6d, 0x6d6b, 0x5532, 0x553c, + 0x7d62, 0x732d, 0x7d5b, 0x6930, 0x5127, 0x7d63, 0x4e33, 0x7d64, + 0x7a4e, 0x4a30, 0x7727, 0x4f31, 0x6622, 0x7c36, 0x722d, 0x6f61, + 0x732e, 0x5c46, 0x596b, 0x6860, 0x6128, 0x5576, 0x4f7d, 0x5e5d, + 0x5951, 0x646a, 0x724f, 0x773f, 0x6266, 0x6228, 0x6356, 0x6d51, + 0x6979, 0x5631, 0x5e32, 0x6068, 0x532b, 0x6b5c, 0x5f2f, 0x4a43, + 0x6e7c, 0x7d43, 0x6b76, 0x4f32, 0x596c, 0x593d, 0x585f, 0x5438, + 0x6b3e, 0x5d6f, 0x5d70, 0x5d71, 0x5d72, 0x593e, 0x7b46, 0x4f33, + 0x6e7d, 0x642b, 0x5a45, 0x586c, 0x5128, 0x6229, 0x5e3c, 0x6735, + 0x5b70, 0x6f62, 0x7170, 0x4f34, 0x5b71, 0x6031, 0x5f25, 0x7952, + 0x677d, 0x6623, 0x7b71, 0x4b30, 0x722e, 0x4d67, 0x685c, 0x6757, + 0x7740, 0x5063, 0x5a21, 0x4c3d, 0x5129, 0x5d4c, 0x637e, 0x512a, + 0x682a, 0x6a36, 0x797a, 0x664c, 0x7658, 0x5447, 0x594b, 0x5952, + 0x534b, 0x5877, 0x5a29, 0x7578, 0x5e5e, 0x722f, 0x7829, 0x5848, + 0x6e41, 0x7941, 0x5d73, 0x6a7a, 0x763d, 0x613b, 0x4d3f, 0x7454, + 0x664d, 0x7c4f, 0x7b22, 0x605c, 0x743b, 0x5a55, 0x7932, 0x7b72, + 0x5b76, 0x5e5f, 0x5b72, 0x785c, 0x776e, 0x6b68, 0x527a, 0x713c, + 0x7a5a, 0x5a6a, 0x5a46, 0x7741, 0x6736, 0x6547, 0x562c, 0x5c47, + 0x6129, 0x622a, 0x5526, 0x5457, 0x7250, 0x6a7b, 0x605d, 0x7b73, + 0x713d, 0x6267, 0x7d57, 0x4e48, 0x6a37, 0x7c40, 0x7d67, 0x776f, + 0x5735, 0x6f3a, 0x715d, 0x5e33, 0x684b, 0x785d, 0x7b47, 0x5548, + 0x575f, 0x5d29, 0x6931, 0x7a2d, 0x7659, 0x7a74, 0x782a, 0x666e, + 0x4c5c, 0x613c, 0x606f, 0x693f, 0x7c7d, 0x664e, 0x6157, 0x664f, + 0x7471, 0x6473, 0x647b, 0x7964, 0x6f63, 0x4f6e, 0x763e, 0x6032, + 0x7c7e, 0x512b, 0x577a, 0x7b48, 0x6257, 0x5423, 0x7078, 0x5728, + 0x6167, 0x533f, 0x6f64, 0x5745, 0x6b62, 0x7c67, 0x6422, 0x6268, + 0x6650, 0x7b68, 0x7468, 0x6574, 0x743c, 0x7455, 0x5f36, 0x7c39, + 0x6e42, 0x4a75, 0x6f65, 0x4b62, 0x5424, 0x5e60, 0x5a7d, 0x6446, + 0x683e, 0x605e, 0x7634, 0x6a52, 0x797b, 0x6042, 0x4a64, 0x6737, + 0x6a7d, 0x595d, 0x5a34, 0x6e2a, 0x7b69, 0x5b4b, 0x5a35, 0x713e, + 0x532c, 0x7b49, 0x5f4f, 0x5340, 0x6357, 0x6f66, 0x7c50, 0x6940, + 0x7553, 0x6c5c, 0x7737, 0x6a38, 0x5179, 0x5c48, 0x6a39, 0x715e, + 0x5736, 0x4f35, 0x5928, 0x6c6e, 0x5d2a, 0x4d22, 0x682e, 0x613d, + 0x7251, 0x6941, 0x527c, 0x5b35, 0x7367, 0x587e, 0x7c51, 0x6d32, + 0x742f, 0x7b23, 0x7c41, 0x6e2b, 0x5425, 0x7472, 0x6e59, 0x7b4a, + 0x4d63, 0x583b, 0x655b, 0x7877, 0x7654, 0x5729, 0x4b49, 0x6651, + 0x704c, 0x582e, 0x7953, 0x557e, 0x583c, 0x7230, 0x622b, 0x7368, + 0x6f42, 0x6d6c, 0x6738, 0x5a7e, 0x4c3e, 0x727c, 0x5a6b, 0x6258, + 0x6d56, 0x5651, 0x6033, 0x7c52, 0x6b48, 0x5341, 0x704d, 0x4f77, + 0x6d52, 0x5458, 0x5c49, 0x5771, 0x5f3b, 0x7325, 0x744d, 0x713f, + 0x7831, 0x697a, 0x7b4b, 0x4a55, 0x7954, 0x774a, 0x5648, 0x7c68, + 0x733d, 0x6e7e, 0x677e, 0x5342, 0x5336, 0x4c2d, 0x767a, 0x5632, + 0x5258, 0x6758, 0x6325, 0x6739, 0x702d, 0x7b4c, 0x6b21, 0x5426, + 0x7b4d, 0x553d, 0x715f, 0x767b, 0x5e34, 0x556b, 0x6548, 0x7b24, + 0x5439, 0x5e61, 0x6423, 0x5737, 0x786e, 0x5e35, 0x5652, 0x7955, + 0x673a, 0x6b55, 0x5577, 0x6f67, 0x613e, 0x7a2e, 0x5669, 0x566e, + 0x673b, 0x6c4b, 0x5533, 0x4e34, 0x7b25, 0x616e, 0x7728, 0x7b4e, + 0x583d, 0x7b7d, 0x7c69, 0x4f36, 0x6d47, 0x6e2c, 0x4c5d, 0x7627, + 0x667a, 0x7524, 0x7d5c, 0x6d33, 0x4e49, 0x6f68, 0x613f, 0x7a5b, + 0x4b63, 0x7729, 0x7b26, 0x5c39, 0x7140, 0x6d48, 0x6f43, 0x562d, + 0x7d4e, 0x6821, 0x7b74, 0x5527, 0x7176, 0x6653, 0x4c5e, 0x7832, + 0x5c6b, 0x7d36, 0x656a, 0x7160, 0x5b4c, 0x5d4d, 0x5448, 0x596d, + 0x7525, 0x667b, 0x6654, 0x7d48, 0x5621, 0x7d3f, 0x7c53, 0x6f21, + 0x673c, 0x516e, 0x6655, 0x6972, 0x5f30, 0x5860, 0x7c3a, 0x7d2f, + 0x704e, 0x5b61, 0x6549, 0x6d34, 0x6043, 0x6358, 0x697b, 0x6a28, + 0x7d37, 0x7b27, 0x6942, 0x7d77, 0x6259, 0x5c6c, 0x6822, 0x6670, + 0x7d78, 0x7d79, 0x763f, 0x6727, 0x6657, 0x5473, 0x5449, 0x567a, + 0x5772, 0x6140, 0x5b62, 0x6658, 0x673d, 0x704f, 0x733e, 0x622c, + 0x7537, 0x6070, 0x7d38, 0x6368, 0x5427, 0x687c, 0x7a52, 0x786f, + 0x5653, 0x5534, 0x7050, 0x7770, 0x6e33, 0x6a3a, 0x6a53, 0x6d49, + 0x5d2b, 0x652c, 0x7d21, 0x5f50, 0x6c33, 0x5f51, 0x6d6d, 0x7838, + 0x777a, 0x782b, 0x7460, 0x543a, 0x6433, 0x695a, 0x5e36, 0x593f, + 0x5940, 0x566f, 0x594c, 0x5a2a, 0x5f65, 0x7765, 0x4c32, 0x5f79, + 0x5760, 0x543b, 0x7d7a, 0x4c33, 0x5b73, 0x5f52, 0x4e4a, 0x6e5a, + 0x6464, 0x7b4f, 0x4f37, 0x6e43, 0x4e6a, 0x622d, 0x5761, 0x7a75, + 0x5549, 0x782c, 0x6759, 0x7369, 0x586d, 0x6344, 0x7071, 0x6865, + 0x607a, 0x6e44, 0x595e, 0x6b22, 0x6b23, 0x7c42, 0x6a3b, 0x682b, + 0x5e62, 0x6d6f, 0x6823, 0x4f71, 0x543c, 0x7c6a, 0x673e, 0x7c72, + 0x5634, 0x622e, 0x5337, 0x7a4c, 0x7a5c, 0x6d35, 0x6163, 0x682c, + 0x685d, 0x6f69, 0x743d, 0x4f38, 0x695b, 0x512c, 0x5a47, 0x6b49, + 0x684c, 0x5e37, 0x563c, 0x5365, 0x7a5d, 0x5a56, 0x4a31, 0x5a48, + 0x5f26, 0x7933, 0x7252, 0x4a44, 0x4e4b, 0x4d75, 0x7d30, 0x5528, + 0x7141, 0x6269, 0x5c4a, 0x6c34, 0x7a40, 0x7b28, 0x5028, 0x5a6c, + 0x596e, 0x607b, 0x6f6a, 0x7a5e, 0x6044, 0x4f39, 0x554a, 0x5762, + 0x622f, 0x5738, 0x684d, 0x765a, 0x6f22, 0x625a, 0x767c, 0x7b50, + 0x512d, 0x4d64, 0x512e, 0x5c6d, 0x684e, 0x7079, 0x4e35, 0x667c, + 0x577b, 0x5056, 0x5d75, 0x7771, 0x767d, 0x5b77, 0x7b6a, 0x695c, + 0x5941, 0x7572, 0x6045, 0x6a54, 0x7942, 0x6a3c, 0x5245, 0x7b51, + 0x6740, 0x6b25, 0x5f7a, 0x6322, 0x5739, 0x6943, 0x687d, 0x682f, + 0x7253, 0x7b29, 0x5825, 0x554b, 0x5048, 0x512f, 0x5763, 0x6046, + 0x5622, 0x6d70, 0x5773, 0x7c54, 0x5a57, 0x4c5f, 0x7254, 0x5130, + 0x4c60, 0x5b7d, 0x733f, 0x7051, 0x7c3b, 0x6230, 0x6625, 0x625b, + 0x5f5e, 0x6047, 0x726f, 0x4c61, 0x566a, 0x6742, 0x4e36, 0x7340, + 0x4d7e, 0x7b52, 0x7878, 0x777b, 0x683f, 0x6837, 0x6d36, 0x5c3a, + 0x4c34, 0x7177, 0x6838, 0x4a76, 0x6424, 0x7456, 0x5f66, 0x5f27, + 0x5f67, 0x6141, 0x6944, 0x5c4b, 0x6945, 0x6f23, 0x6b26, 0x4b23, + 0x6369, 0x517b, 0x6f24, 0x6f6b, 0x5034, 0x4d23, 0x6866, 0x6f25, + 0x534c, 0x5a6d, 0x573a, 0x7255, 0x7565, 0x596f, 0x7934, 0x5554, + 0x7d4f, 0x5b63, 0x7161, 0x6c36, 0x7b7e, 0x5357, 0x5131, 0x4b31, + 0x5132, 0x4b32, 0x7142, 0x7461, 0x7935, 0x6143, 0x6142, 0x6b77, + 0x5f28, 0x4b4a, 0x6639, 0x785e, 0x792a, 0x4a77, 0x6d37, 0x5338, + 0x7256, 0x5459, 0x6e45, 0x7270, 0x4a32, 0x5c3b, 0x7178, 0x6c37, + 0x654a, 0x7640, 0x7d5d, 0x5463, 0x4c62, 0x7754, 0x5765, 0x5343, + 0x5826, 0x7641, 0x5d76, 0x4d40, 0x655c, 0x654b, 0x6144, 0x6830, + 0x7430, 0x736a, 0x5a6e, 0x573b, 0x6231, 0x572a, 0x567b, 0x645f, + 0x4a56, 0x6b28, 0x5b7e, 0x7642, 0x6f3b, 0x547d, 0x6048, 0x6839, + 0x6f26, 0x4d24, 0x5474, 0x5b21, 0x5b5c, 0x5b5d, 0x6e5c, 0x4b4b, + 0x7c55, 0x4e6b, 0x4d41, 0x7b53, 0x792b, 0x7554, 0x5929, 0x695d, + 0x5b4d, 0x5d4e, 0x6743, 0x6c4c, 0x796c, 0x4b4c, 0x607c, 0x5428, + 0x6d53, 0x586f, 0x7257, 0x4a78, 0x5a6f, 0x5654, 0x594d, 0x586e, + 0x7241, 0x5f53, 0x5a70, 0x626a, 0x607d, 0x5878, 0x772f, 0x5a36, + 0x4a57, 0x7258, 0x5879, 0x7a5f, 0x4f6f, 0x5942, 0x7052, 0x6451, + 0x7337, 0x7a60, 0x6f6c, 0x6232, 0x543d, 0x594e, 0x7462, 0x5429, + 0x4d42, 0x675a, 0x7259, 0x592a, 0x583e, 0x5c2d, 0x626b, 0x567c, + 0x4a79, 0x545a, 0x7457, 0x4c21, 0x4f3a, 0x7538, 0x5943, 0x5068, + 0x6345, 0x6b78, 0x7231, 0x4f3b, 0x532d, 0x6861, 0x4e6c, 0x6034, + 0x5e63, 0x5d77, 0x7232, 0x7376, 0x765b, 0x577e, 0x785f, 0x7772, + 0x5029, 0x665a, 0x7526, 0x573c, 0x4c63, 0x665b, 0x5d5d, 0x5133, + 0x6f6d, 0x565e, 0x6474, 0x616f, 0x5d78, 0x684f, 0x4a65, 0x5c21, + 0x6035, 0x7c2c, 0x7c2d, 0x5827, 0x6d38, 0x5b36, 0x5670, 0x732f, + 0x4d25, 0x5a71, 0x5828, 0x4c64, 0x5134, 0x4a58, 0x5a72, 0x7527, + 0x7528, 0x6626, 0x556c, 0x5578, 0x5a73, 0x6346, 0x5e64, 0x5e65, + 0x5135, 0x5136, 0x5137, 0x7233, 0x695e, 0x7053, 0x7234, 0x7054, + 0x4b64, 0x7b54, 0x7566, 0x636a, 0x5e66, 0x5f54, 0x7879, 0x702e, + 0x5138, 0x565f, 0x5057, 0x7c21, 0x6f6e, 0x5c58, 0x695f, 0x655d, + 0x7d7b, 0x6049, 0x5649, 0x542a, 0x654c, 0x6960, 0x5058, 0x7c22, + 0x543e, 0x6233, 0x5e67, 0x5c3c, 0x5236, 0x7555, 0x4e21, 0x7529, + 0x5d79, 0x5d7a, 0x7055, 0x765f, 0x725a, 0x646b, 0x7271, 0x6c39, + 0x7d7c, 0x612a, 0x4a59, 0x6f6f, 0x752a, 0x6c79, 0x782d, 0x7242, + 0x7643, 0x5752, 0x7922, 0x7056, 0x707a, 0x7660, 0x6973, 0x7243, + 0x542b, 0x4a33, 0x4d26, 0x4d43, 0x4d5a, 0x594f, 0x7644, 0x6e5d, + 0x6744, 0x6234, 0x5f62, 0x675b, 0x6831, 0x7c2e, 0x654d, 0x7a6b, + 0x4f3c, 0x4f62, 0x4d76, 0x6f70, 0x743e, 0x544d, 0x7338, 0x6921, + 0x7272, 0x736b, 0x7057, 0x4f57, 0x4f5f, 0x6840, 0x6841, 0x4f63, + 0x6922, 0x502a, 0x7341, 0x502b, 0x5464, 0x6f3c, 0x5821, 0x595f, + 0x7357, 0x5c3d, 0x4c65, 0x6d71, 0x7162, 0x545b, 0x6235, 0x4a66, + 0x532e, 0x4c66, 0x7153, 0x7567, 0x4a5a, 0x7b6e, 0x6145, 0x5f69, + 0x6e5e, 0x7742, 0x5822, 0x5d2c, 0x702f, 0x563d, 0x612b, 0x7936, + 0x5475, 0x5049, 0x6f27, 0x626c, 0x5b6a, 0x4e4c, 0x7568, 0x7755, + 0x534d, 0x737e, 0x5035, 0x607e, 0x5f7b, 0x665d, 0x6824, 0x4b4d, + 0x6f28, 0x6e34, 0x5a58, 0x5139, 0x5f29, 0x7330, 0x4c44, 0x4e37, + 0x6f29, 0x5f55, 0x6d57, 0x6e46, 0x6f3d, 0x7c56, 0x5b74, 0x6f2a, + 0x7839, 0x7569, 0x6359, 0x6146, 0x543f, 0x5e68, 0x706a, 0x7342, + 0x532f, 0x4a5b, 0x7c57, 0x6d58, 0x6147, 0x7458, 0x5633, 0x5d2d, + 0x553e, 0x7143, 0x6e5f, 0x566b, 0x7459, 0x5766, 0x5a37, 0x5d7b, + 0x5d4f, 0x5823, 0x5a59, 0x7058, 0x6f44, 0x6158, 0x7154, 0x6d72, + 0x555b, 0x555c, 0x7344, 0x4b57, 0x6236, 0x6f71, 0x7b55, 0x5358, + 0x5d50, 0x7059, 0x4b33, 0x555d, 0x4d27, 0x502c, 0x513a, 0x7144, + 0x6533, 0x7b75, 0x6961, 0x7d60, 0x7c3c, 0x5a22, 0x5a23, 0x5221, + 0x526f, 0x626d, 0x5e69, 0x4e5c, 0x7235, 0x5064, 0x5d51, 0x6148, + 0x5b37, 0x5f63, 0x6d39, 0x7145, 0x734f, 0x572b, 0x612c, 0x636b, + 0x6e47, 0x6149, 0x4a7a, 0x707b, 0x7a61, 0x705a, 0x4c67, 0x5a74, + 0x4c3f, 0x4e6d, 0x5529, 0x7a62, 0x5065, 0x6b56, 0x6c5f, 0x5f7c, + 0x7756, 0x5e6a, 0x4b34, 0x6f3e, 0x4c35, 0x4f3d, 0x6f72, 0x6237, + 0x4c68, 0x707c, 0x5660, 0x7146, 0x6238, 0x6b2b, 0x4b35, 0x5851, + 0x744e, 0x7377, 0x5746, 0x513b, 0x772a, 0x6d4a, 0x5753, 0x587a, + 0x7645, 0x514c, 0x5d7c, 0x5f7d, 0x7965, 0x604a, 0x727d, 0x5330, + 0x7473, 0x5a49, 0x665e, 0x783a, 0x6850, 0x587b, 0x6a55, 0x5623, + 0x7646, 0x725b, 0x647c, 0x6832, 0x5a5a, 0x725c, 0x7b56, 0x6932, + 0x6e2d, 0x7a63, 0x5c6e, 0x756a, 0x6660, 0x707d, 0x572c, 0x7545, + 0x6e60, 0x5b65, 0x5d5e, 0x5970, 0x6923, 0x7179, 0x7244, 0x604b, + 0x6924, 0x6239, 0x6331, 0x7c6b, 0x4d28, 0x4c36, 0x705b, 0x663a, + 0x4d29, 0x7343, 0x6159, 0x6f2b, 0x6745, 0x6069, 0x7345, 0x5440, + 0x553f, 0x5d2e, 0x797c, 0x4c40, 0x6522, 0x4e38, 0x5852, 0x7956, + 0x712a, 0x4e51, 0x7647, 0x5b6b, 0x5f7e, 0x5861, 0x7773, 0x5767, + 0x547e, 0x513c, 0x654f, 0x4b36, 0x5a38, 0x4d44, 0x563e, 0x623a, + 0x4f58, 0x604c, 0x6b79, 0x7d7d, 0x5768, 0x4b58, 0x6962, 0x683a, + 0x6347, 0x6c4d, 0x6c4e, 0x563f, 0x6327, 0x5f56, 0x7d68, 0x6e61, + 0x7628, 0x5d7d, 0x783b, 0x6851, 0x7957, 0x4e6e, 0x6c4f, 0x6925, + 0x5655, 0x4d45, 0x6d3a, 0x513d, 0x4f3e, 0x6c3b, 0x5231, 0x4c69, + 0x5944, 0x697c, 0x513e, 0x6c3c, 0x652d, 0x7730, 0x4c6a, 0x5344, + 0x5640, 0x567d, 0x6121, 0x5e3d, 0x7629, 0x5a24, 0x5624, 0x7546, + 0x6122, 0x6946, 0x7245, 0x7469, 0x566c, 0x6b53, 0x6c3d, 0x625c, + 0x5e6b, 0x705c, 0x6b3f, 0x574e, 0x513f, 0x752b, 0x797d, 0x4a5c, + 0x4d46, 0x7236, 0x5d7e, 0x4c37, 0x5b38, 0x5069, 0x4e5d, 0x6b40, + 0x7d22, 0x784b, 0x6a56, 0x7130, 0x5b4e, 0x7743, 0x5b4f, 0x4b24, + 0x7860, 0x7b57, 0x6b4a, 0x6021, 0x4e4d, 0x545c, 0x7d58, 0x5276, + 0x7237, 0x7a76, 0x762a, 0x7a77, 0x5866, 0x7431, 0x6852, 0x4a45, + 0x4c6b, 0x626e, 0x623b, 0x772d, 0x7861, 0x736c, 0x5e21, 0x647d, + 0x636c, 0x5d2f, 0x5d30, 0x4b37, 0x6853, 0x6123, 0x5260, 0x707e, + 0x6926, 0x4b72, 0x6d73, 0x5c59, 0x604d, 0x775a, 0x5b39, 0x4c2e, + 0x5a5b, 0x4d47, 0x5d31, 0x582f, 0x6323, 0x4e6f, 0x7273, 0x7833, + 0x604e, 0x757d, 0x6b6c, 0x5345, 0x7c6c, 0x525b, 0x546b, 0x5e22, + 0x6566, 0x7030, 0x5544, 0x6d74, 0x636d, 0x6842, 0x6d75, 0x577c, + 0x6d3b, 0x762b, 0x7238, 0x7648, 0x5366, 0x725d, 0x4f3f, 0x6b2c, + 0x4f40, 0x6628, 0x7d69, 0x4f41, 0x605f, 0x5e6c, 0x6022, 0x743f, + 0x626f, 0x5971, 0x7147, 0x4b38, 0x797e, 0x5b3a, 0x5a75, 0x766c, + 0x5a5c, 0x7a64, 0x604f, 0x5d32, 0x6629, 0x6f73, 0x736d, 0x6b7a, + 0x7966, 0x4a5d, 0x555e, 0x4a5e, 0x5f64, 0x667d, 0x752c, 0x6475, + 0x6963, 0x6d4b, 0x4f64, 0x5853, 0x5d33, 0x546c, 0x7239, 0x5f37, + 0x4b4e, 0x7b58, 0x5059, 0x5d52, 0x7774, 0x675c, 0x6425, 0x7c23, + 0x5b3b, 0x723a, 0x697d, 0x504a, 0x7556, 0x5945, 0x6434, 0x6d27, + 0x6a3d, 0x667e, 0x7744, 0x752d, 0x5960, 0x4a34, 0x7862, 0x4f42, + 0x6c3e, 0x6534, 0x4d48, 0x6e48, 0x6748, 0x4d49, 0x7937, 0x7168, + 0x5972, 0x5b75, 0x4a35, 0x5946, 0x5849, 0x592b, 0x6d3c, 0x5854, + 0x5c5a, 0x623c, 0x7c6d, 0x6c60, 0x527e, 0x6947, 0x662a, 0x6270, + 0x7a3b, 0x752e, 0x7b2a, 0x6c7b, 0x6c3f, 0x7c58, 0x5465, 0x7943, + 0x6e62, 0x5769, 0x6d76, 0x5e6d, 0x4c6c, 0x636e, 0x6854, 0x7a78, + 0x5d34, 0x6435, 0x5830, 0x5855, 0x746a, 0x4e39, 0x5661, 0x4f52, + 0x5036, 0x4e22, 0x736e, 0x7378, 0x5c4c, 0x504b, 0x7c24, 0x4d4a, + 0x5754, 0x5e23, 0x6460, 0x6e49, 0x625d, 0x757e, 0x542c, 0x5551, + 0x5870, 0x7843, 0x6a57, 0x7557, 0x583f, 0x7d40, 0x6b2d, 0x552a, + 0x6728, 0x6e4a, 0x4a67, 0x7863, 0x545d, 0x6a58, 0x7b59, 0x6d77, + 0x6535, 0x502d, 0x7171, 0x623d, 0x6348, 0x5955, 0x5f2a, 0x5b3c, + 0x7864, 0x717a, 0x6536, 0x736f, 0x7b5a, 0x6160, 0x592c, 0x756b, + 0x6036, 0x6948, 0x4b4f, 0x6349, 0x5e6e, 0x623e, 0x5c6f, 0x5625, + 0x6271, 0x567e, 0x5921, 0x5840, 0x5c5b, 0x6d3d, 0x5f38, 0x6a25, + 0x572d, 0x7379, 0x6d78, 0x7547, 0x614a, 0x6b63, 0x725e, 0x784c, + 0x6a59, 0x5346, 0x5b66, 0x752f, 0x4e70, 0x697e, 0x7b36, 0x6272, + 0x4f72, 0x7739, 0x5973, 0x614b, 0x5a5d, 0x5a39, 0x6b7b, 0x4b39, + 0x6d79, 0x6060, 0x7440, 0x7d3c, 0x5f31, 0x636f, 0x6023, 0x7d39, + 0x7031, 0x4d4b, 0x6d3e, 0x5540, 0x6370, 0x6d7a, 0x6964, 0x556d, + 0x675d, 0x5476, 0x6537, 0x5b67, 0x623f, 0x6e4b, 0x5774, 0x705d, + 0x4e2b, 0x675e, 0x5656, 0x614c, 0x6833, 0x656e, 0x5c22, 0x6050, + 0x5535, 0x5521, 0x7b5b, 0x794b, 0x4b73, 0x7425, 0x7a48, 0x5657, + 0x6965, 0x7b5c, 0x7d50, 0x7b76, 0x5a25, 0x5b3d, 0x6c62, 0x4d77, + 0x705e, 0x7649, 0x5e6f, 0x5331, 0x7c6e, 0x6843, 0x7148, 0x4e71, + 0x796d, 0x7274, 0x6436, 0x7539, 0x5c70, 0x6371, 0x6825, 0x723b, + 0x5e24, 0x5a4c, 0x4a69, 0x635a, 0x7c59, 0x6a5a, 0x7944, 0x6324, + 0x7b5d, 0x6f4a, 0x6844, 0x554c, 0x6b57, 0x592d, 0x7b2b, 0x5359, + 0x5522, 0x765e, 0x5a76, 0x6051, 0x6928, 0x7579, 0x7a2f, 0x6b7c, + 0x606a, 0x6332, 0x5545, 0x7163, 0x556e, 0x4d4c, 0x6d59, 0x5841, + 0x7a6c, 0x716b, 0x7a3c, 0x6662, 0x7a65, 0x627a, 0x4a36, 0x6437, + 0x6a5b, 0x757a, 0x7b2c, 0x4f43, 0x6b7d, 0x787a, 0x5f39, 0x6171, + 0x5224, 0x757b, 0x505a, 0x505b, 0x6a3e, 0x5931, 0x4a37, 0x5367, + 0x7865, 0x5332, 0x6240, 0x725f, 0x4d65, 0x792c, 0x4d4d, 0x6e2e, + 0x562e, 0x576a, 0x6760, 0x6b2e, 0x4f59, 0x5c4d, 0x6d7b, 0x5e70, + 0x576b, 0x5e25, 0x5f57, 0x5b50, 0x5b51, 0x5523, 0x7032, 0x5c5c, + 0x4a68, 0x7866, 0x5c4e, 0x6a5c, 0x5b52, 0x6933, 0x775b, 0x6328, + 0x572e, 0x6061, 0x4b3a, 0x6551, 0x505c, 0x5541, 0x584a, 0x6329, + 0x6024, 0x6929, 0x5347, 0x5c5d, 0x782e, 0x4c38, 0x502e, 0x5872, + 0x634a, 0x4c2f, 0x542d, 0x7651, 0x504c, 0x4a46, 0x5542, 0x4e3a, + 0x4a47, 0x7a30, 0x5f58, 0x753a, 0x656b, 0x6f74, 0x5d35, 0x4d2a, + 0x6372, 0x7b77, 0x7750, 0x7d3a, 0x7d61, 0x767e, 0x5140, 0x6845, + 0x6438, 0x6168, 0x4c41, 0x526d, 0x5b3e, 0x6062, 0x7a49, 0x614d, + 0x4a38, 0x7260, 0x7149, 0x5e71, 0x705f, 0x7844, 0x6e4c, 0x5e72, + 0x6749, 0x6273, 0x6761, 0x634b, 0x634c, 0x4f78, 0x6f2c, 0x7d7e, + 0x7c25, 0x7a31, 0x5f59, 0x6052, 0x745a, 0x714a, 0x4e23, 0x723c, + 0x6c63, 0x6025, 0x772b, 0x6b2f, 0x655e, 0x6124, 0x4d2b, 0x5974, + 0x6826, 0x4d4e, 0x6169, 0x7c6f, 0x6063, 0x6241, 0x4e24, 0x5e26, + 0x6b7e, 0x6b5d, 0x7060, 0x745b, 0x6274, 0x5348, 0x746b, 0x6e35, + 0x7558, 0x555f, 0x5665, 0x6b30, 0x7463, 0x634d, 0x7474, 0x7a32, + 0x6f75, 0x4a5f, 0x6b31, 0x6d3f, 0x7d49, 0x6426, 0x7924, 0x7033, + 0x656c, 0x5167, 0x5947, 0x6457, 0x6a5d, 0x5477, 0x5a3a, 0x5a4d, + 0x794c, 0x615a, 0x5b3f, 0x4c45, 0x6c50, 0x4b3b, 0x5e73, 0x692a, + 0x5948, 0x6e63, 0x573d, 0x4f44, 0x504d, 0x7c26, 0x717b, 0x7d52, + 0x5141, 0x635b, 0x5349, 0x5c4f, 0x4c6d, 0x5e27, 0x663b, 0x6c21, + 0x4c39, 0x7b5e, 0x6762, 0x5441, 0x5c28, 0x6242, 0x7358, 0x6553, + 0x7359, 0x7346, 0x4d5b, 0x4d2c, 0x7c43, 0x5467, 0x5142, 0x7925, + 0x6855, 0x634e, 0x544a, 0x5f5a, 0x7b5f, 0x6763, 0x787b, 0x634f, + 0x7530, 0x5867, 0x5949, 0x782f, 0x6f76, 0x5d36, 0x6e2f, 0x4d78, + 0x5e38, 0x7c27, 0x777c, 0x7731, 0x4e3b, 0x7421, 0x6e4d, 0x612e, + 0x6c43, 0x4f7e, 0x783f, 0x5862, 0x5368, 0x5e28, 0x7464, 0x6c42, + 0x5975, 0x7945, 0x5d53, 0x5671, 0x6c7c, 0x7c70, 0x6d40, 0x4a39, + 0x6e64, 0x7261, 0x5e39, 0x5672, 0x5e74, 0x5f5b, 0x5b53, 0x7a67, + 0x5863, 0x7441, 0x5d37, 0x7275, 0x542e, 0x5673, 0x5d38, 0x4f45, + 0x5f5f, 0x723e, 0x7621, 0x6b4b, 0x717c, 0x7347, 0x606b, 0x6d7c, + 0x615b, 0x6e65, 0x5e75, 0x7a53, 0x714b, 0x502f, 0x5d39, 0x5143, + 0x7531, 0x6a46, 0x7061, 0x762c, 0x7559, 0x706b, 0x5d3a, 0x723f, + 0x7745, 0x5b22, 0x7276, 0x4a3a, 0x7775, 0x4b65, 0x6e66, 0x6053, + 0x4e25, 0x5658, 0x542f, 0x6949, 0x534e, 0x7442, 0x4b66, 0x7121, + 0x6b32, 0x7122, 0x6b33, 0x7034, 0x4b74, 0x5430, 0x7332, 0x7b37, + 0x756c, 0x6e67, 0x7432, 0x756d, 0x4f73, 0x7062, 0x6e4e, 0x714c, + 0x6538, 0x5775, 0x6373, 0x4f65, 0x4f46, 0x7333, 0x6458, 0x4f79, + 0x4f5a, 0x7a4d, 0x6663, 0x7262, 0x756e, 0x4a3b, 0x635c, 0x4e72, + 0x5659, 0x6e30, 0x7465, 0x5842, 0x5c50, 0x4c6e, 0x5560, 0x764a, + 0x7d4a, 0x5856, 0x744f, 0x5626, 0x5c3e, 0x5b54, 0x5747, 0x727e, + 0x714d, 0x6243, 0x5c5e, 0x5c5f, 0x6f2d, 0x662b, 0x795d, 0x6a3f, + 0x6f2e, 0x7450, 0x4e73, 0x662c, 0x4e5e, 0x5579, 0x6374, 0x4d50, + 0x5538, 0x777d, 0x5c29, 0x5e76, 0x5c2a, 0x7263, 0x6934, 0x525c, + 0x6966, 0x6376, 0x674a, 0x504e, 0x5a77, 0x4a3c, 0x6e68, 0x5a5e, + 0x7277, 0x627b, 0x4c26, 0x5a3b, 0x6e69, 0x755a, 0x775c, 0x616a, + 0x4e41, 0x5431, 0x7d31, 0x663d, 0x7b2d, 0x7867, 0x614e, 0x7762, + 0x756f, 0x4f47, 0x5432, 0x4c6f, 0x5468, 0x6e4f, 0x7757, 0x6026, + 0x5641, 0x615c, 0x7063, 0x7164, 0x5c71, 0x5627, 0x7475, 0x714e, + 0x7264, 0x5030, 0x6c6f, 0x793a, 0x6b35, 0x546d, 0x6244, 0x6967, + 0x6b34, 0x6a21, 0x783c, 0x4e26, 0x7946, 0x7c5a, 0x5433, 0x5339, + 0x6a5e, 0x692b, 0x6161, 0x534f, 0x7476, 0x6a40, 0x614f, 0x4c3a, + 0x6e6a, 0x7064, 0x7334, 0x546e, 0x7240, 0x7165, 0x7443, 0x6054, + 0x6b36, 0x5721, 0x4b68, 0x792d, 0x692d, 0x5864, 0x7a33, 0x6245, + 0x7c3d, 0x6c44, 0x5831, 0x5c2b, 0x5524, 0x6b69, 0x683b, 0x5857, + 0x7b2e, 0x5161, 0x5b40, 0x753e, 0x5e77, 0x4a7b, 0x7746, 0x4f48, + 0x6150, 0x6e50, 0x6974, 0x4e74, 0x554d, 0x4f5b, 0x5d3b, 0x4e2c, + 0x6968, 0x5434, 0x6447, 0x755b, 0x7a41, 0x5e29, 0x5478, 0x6f77, + 0x5333, 0x6b37, 0x6f78, 0x755c, 0x6d4c, 0x5b55, 0x714f, 0x7150, + 0x7532, 0x592e, 0x552c, 0x6246, 0x7d23, 0x7b65, 0x5f2b, 0x6275, + 0x762d, 0x7533, 0x7035, 0x6125, 0x755d, 0x6c22, 0x6d7d, 0x7534, + 0x7b38, 0x5b23, 0x564a, 0x4b59, 0x6554, 0x737a, 0x6b38, 0x6037, + 0x576c, 0x716c, 0x652f, 0x5561, 0x576d, 0x5151, 0x6172, 0x6f79, + 0x5d3c, 0x765c, 0x7065, 0x7444, 0x6969, 0x737b, 0x546f, 0x4c22, + 0x777e, 0x5f3c, 0x6b4d, 0x5037, 0x5642, 0x682d, 0x6f2f, 0x4b25, + 0x4b69, 0x7a68, 0x4c46, 0x6667, 0x6a47, 0x5b24, 0x4f49, 0x627c, + 0x6f7a, 0x6b5e, 0x7548, 0x545e, 0x6055, 0x6f30, 0x6247, 0x592f, + 0x7967, 0x6765, 0x4f4a, 0x6151, 0x6248, 0x6f7b, 0x7a79, 0x5c72, + 0x6027, 0x7868, 0x4b6a, 0x4b3c, 0x5662, 0x755e, 0x755f, 0x6e36, + 0x6276, 0x534a, 0x6f7c, 0x5144, 0x6f31, 0x5145, 0x505e, 0x5961, + 0x6038, 0x4d51, 0x7339, 0x674c, 0x5628, 0x4e27, 0x5435, 0x6448, + 0x5334, 0x6b39, 0x4b75, 0x765d, 0x7123, 0x4c47, 0x694a, 0x6170, + 0x7560, 0x7b2f, 0x4b51, 0x7b60, 0x7265, 0x6c70, 0x706c, 0x6e6b, + 0x694b, 0x4c70, 0x572f, 0x7321, 0x7c75, 0x7124, 0x6056, 0x6f32, + 0x7451, 0x7721, 0x7151, 0x4a7c, 0x4a7d, 0x4e4e, 0x7348, 0x733a, + 0x6d7e, 0x5a26, 0x606c, 0x784d, 0x4b52, 0x6b4e, 0x7958, 0x7959, + 0x4a60, 0x5a4a, 0x4b26, 0x4a48, 0x796e, 0x5b6c, 0x5031, 0x556f, + 0x6673, 0x6722, 0x6459, 0x6461, 0x7c44, 0x796f, 0x4f74, 0x7766, + 0x4e3c, 0x7445, 0x5c23, 0x5d3d, 0x7446, 0x7821, 0x6856, 0x5b41, + 0x7066, 0x6439, 0x766d, 0x792e, 0x5d3e, 0x5730, 0x5868, 0x4b3d, + 0x795a, 0x784e, 0x7970, 0x606d, 0x6333, 0x7433, 0x6a42, 0x7266, + 0x7036, 0x5b56, 0x6b64, 0x7267, 0x5755, 0x5436, 0x7968, 0x5741, + 0x6555, 0x696a, 0x574c, 0x5369, 0x6249, 0x7c5b, 0x4d2d, 0x4c30, + 0x6a22, 0x6476, 0x5040, 0x7037, 0x6e21, 0x5776, 0x624a, 0x624b, + 0x7a4f, 0x6b5f, 0x564b, 0x7434, 0x6d4d, 0x6452, 0x6a29, 0x643a, + 0x7322, 0x4d52, 0x764b, 0x7166, 0x6d41, 0x683c, 0x6e51, 0x7067, + 0x624c, 0x642a, 0x7561, 0x6d5a, 0x576e, 0x5171, 0x696b, 0x696c, + 0x6064, 0x5a27, 0x5d54, 0x6a23, 0x5643, 0x5674, 0x5a5f, 0x6f33, + 0x624d, 0x6f7d, 0x7268, 0x6f45, 0x6767, 0x577d, 0x674e, 0x5f5c, + 0x7947, 0x5976, 0x5f2c, 0x565a, 0x5c24, 0x7038, 0x557a, 0x6477, + 0x5644, 0x746c, 0x6f7e, 0x7021, 0x5e2a, 0x5a3c, 0x587c, 0x7a54, + 0x6c65, 0x7c28, 0x6c66, 0x584b, 0x7b39, 0x6453, 0x4d79, 0x4f53, + 0x4a6a, 0x4f54, 0x783d, 0x7447, 0x6a5f, 0x795b, 0x5437, 0x6b65, + 0x6152, 0x6a24, 0x7a42, 0x7b61, 0x7a6d, 0x7022, 0x4c71, 0x7a23, + 0x6277, 0x624e, 0x6975, 0x616b, 0x6768, 0x6857, 0x5a78, 0x544b, + 0x7776, 0x5645, 0x5469, 0x7a7a, 0x4c72, 0x775d, 0x5e3a, 0x4e28, + 0x7039, 0x647e, 0x6449, 0x6454, 0x6a43, 0x6f34, 0x573e, 0x7b62, + 0x4d53, 0x6f35, 0x7a69, 0x7926, 0x5f3d, 0x7747, 0x787d, 0x787c, + 0x5e2b, 0x5b68, 0x635d, 0x6162, 0x5146, 0x7650, 0x6b66, 0x5a79, + 0x6c47, 0x5e78, 0x7869, 0x635e, 0x4e75, 0x7a43, 0x6557, 0x6c48, + 0x7349, 0x643b, 0x662e, 0x6f36, 0x5c3f, 0x4e3d, 0x5843, 0x504f, + 0x4f7a, 0x734a, 0x6057, 0x5147, 0x692e, 0x683d, 0x7a44, 0x624f, + 0x7a45, 0x7938, 0x5c60, 0x7b30, 0x5829, 0x655f, 0x7927, 0x766e, + 0x764c, 0x6278, 0x6c71, 0x5a60, 0x7152, 0x524c, 0x4f4b, 0x4a3d, + 0x5d3f, 0x766f, 0x5e79, 0x7a34, 0x552d, 0x7167, 0x5e3e, 0x5c40, + 0x5148, 0x5149, 0x783e, 0x4b76, 0x5479, 0x7562, 0x6153, 0x5869, + 0x787e, 0x4f4c, 0x7d24, 0x4e76, 0x7a50, 0x4c73, 0x663e, 0x762e, + 0x5570, 0x514a, 0x7c3e, 0x5571, 0x4d69, 0x7a35, 0x6250, 0x7477, + 0x4d54, 0x6723, 0x5b25, 0x6251, 0x5722, 0x7763, 0x6a26, 0x5021, + 0x4e5a, 0x7b6b, 0x5b26, 0x5b5e, 0x5865, 0x6a60, 0x582a, 0x6560, + 0x565b, 0x6f46, 0x786a, 0x6455, 0x4e77, 0x6058, 0x576f, 0x746d, + 0x4d66, 0x4c74, 0x7563, 0x644a, 0x5c61, 0x7948, 0x7c3f, 0x6827, + 0x5844, 0x4b3e, 0x5c2e, 0x5777, 0x7068, 0x5d40, 0x4f4d, 0x5c73, + 0x5930, 0x6669, 0x643c, 0x6a44, 0x646c, 0x6465, 0x7b78, 0x4c3b, + 0x643d, 0x4d5c, 0x5977, 0x5d5f, 0x6d4e, 0x5950, 0x6523, 0x794d, + 0x4d2e, 0x4f4e, 0x762f, 0x7d53, 0x6b6d, 0x565c, 0x6524, 0x5536, + 0x565d, 0x7969, 0x6724, 0x5663, 0x514b, 0x5664, 0x5572, 0x5e7a, + 0x5778, 0x586a, 0x4f55, 0x587d, 0x582b, 0x7d4b, 0x7c5c, 0x6028, + 0x5573, 0x7d59, 0x4c23, 0x5979, 0x536a, 0x7575, 0x6f47, 0x535a, + 0x5a3d, 0x6828, 0x5c2f, 0x7023, 0x4d55, 0x6029, 0x5e2c, 0x703a, + 0x6e31, 0x6e32, 0x764d, 0x6e52, 0x5646, 0x6065, 0x733b, 0x6561, + 0x644b, 0x5723, 0x5b42, 0x4a7e, 0x4f4f, 0x3021, 0x3022, 0x3023, + 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x302a, 0x302b, + 0x302c, 0x302d, 0x302e, 0x302f, 0x3030, 0x3031, 0x3032, 0x3033, + 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, 0x303a, 0x303b, + 0x303c, 0x303d, 0x303e, 0x303f, 0x3040, 0x3041, 0x3042, 0x3043, + 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, + 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, + 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, + 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, + 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, + 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, + 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, + 0x307c, 0x307d, 0x307e, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, + 0x3126, 0x3127, 0x3128, 0x3129, 0x312a, 0x312b, 0x312c, 0x312d, + 0x312e, 0x312f, 0x3130, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, + 0x3136, 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, + 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, + 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, + 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, + 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, + 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, + 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, + 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, + 0x3176, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, + 0x317e, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, + 0x3228, 0x3229, 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, + 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, + 0x3238, 0x3239, 0x323a, 0x323b, 0x323c, 0x323d, 0x323e, 0x323f, + 0x3240, 0x3241, 0x3242, 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, + 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, + 0x3250, 0x3251, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, + 0x3258, 0x3259, 0x325a, 0x325b, 0x325c, 0x325d, 0x325e, 0x325f, + 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, + 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, + 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, + 0x3278, 0x3279, 0x327a, 0x327b, 0x327c, 0x327d, 0x327e, 0x3321, + 0x3322, 0x3323, 0x3324, 0x3325, 0x3326, 0x3327, 0x3328, 0x3329, + 0x332a, 0x332b, 0x332c, 0x332d, 0x332e, 0x332f, 0x3330, 0x3331, + 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339, + 0x333a, 0x333b, 0x333c, 0x333d, 0x333e, 0x333f, 0x3340, 0x3341, + 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, 0x3347, 0x3348, 0x3349, + 0x334a, 0x334b, 0x334c, 0x334d, 0x334e, 0x334f, 0x3350, 0x3351, + 0x3352, 0x3353, 0x3354, 0x3355, 0x3356, 0x3357, 0x3358, 0x3359, + 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, + 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, + 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, 0x3370, 0x3371, + 0x3372, 0x3373, 0x3374, 0x3375, 0x3376, 0x3377, 0x3378, 0x3379, + 0x337a, 0x337b, 0x337c, 0x337d, 0x337e, 0x3421, 0x3422, 0x3423, + 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, 0x3429, 0x342a, 0x342b, + 0x342c, 0x342d, 0x342e, 0x342f, 0x3430, 0x3431, 0x3432, 0x3433, + 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439, 0x343a, 0x343b, + 0x343c, 0x343d, 0x343e, 0x343f, 0x3440, 0x3441, 0x3442, 0x3443, + 0x3444, 0x3445, 0x3446, 0x3447, 0x3448, 0x3449, 0x344a, 0x344b, + 0x344c, 0x344d, 0x344e, 0x344f, 0x3450, 0x3451, 0x3452, 0x3453, + 0x3454, 0x3455, 0x3456, 0x3457, 0x3458, 0x3459, 0x345a, 0x345b, + 0x345c, 0x345d, 0x345e, 0x345f, 0x3460, 0x3461, 0x3462, 0x3463, + 0x3464, 0x3465, 0x3466, 0x3467, 0x3468, 0x3469, 0x346a, 0x346b, + 0x346c, 0x346d, 0x346e, 0x346f, 0x3470, 0x3471, 0x3472, 0x3473, + 0x3474, 0x3475, 0x3476, 0x3477, 0x3478, 0x3479, 0x347a, 0x347b, + 0x347c, 0x347d, 0x347e, 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, + 0x3526, 0x3527, 0x3528, 0x3529, 0x352a, 0x352b, 0x352c, 0x352d, + 0x352e, 0x352f, 0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, + 0x3536, 0x3537, 0x3538, 0x3539, 0x353a, 0x353b, 0x353c, 0x353d, + 0x353e, 0x353f, 0x3540, 0x3541, 0x3542, 0x3543, 0x3544, 0x3545, + 0x3546, 0x3547, 0x3548, 0x3549, 0x354a, 0x354b, 0x354c, 0x354d, + 0x354e, 0x354f, 0x3550, 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, + 0x3556, 0x3557, 0x3558, 0x3559, 0x355a, 0x355b, 0x355c, 0x355d, + 0x355e, 0x355f, 0x3560, 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, + 0x3566, 0x3567, 0x3568, 0x3569, 0x356a, 0x356b, 0x356c, 0x356d, + 0x356e, 0x356f, 0x3570, 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, + 0x3576, 0x3577, 0x3578, 0x3579, 0x357a, 0x357b, 0x357c, 0x357d, + 0x357e, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, + 0x3628, 0x3629, 0x362a, 0x362b, 0x362c, 0x362d, 0x362e, 0x362f, + 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, + 0x3638, 0x3639, 0x363a, 0x363b, 0x363c, 0x363d, 0x363e, 0x363f, + 0x3640, 0x3641, 0x3642, 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, + 0x3648, 0x3649, 0x364a, 0x364b, 0x364c, 0x364d, 0x364e, 0x364f, + 0x3650, 0x3651, 0x3652, 0x3653, 0x3654, 0x3655, 0x3656, 0x3657, + 0x3658, 0x3659, 0x365a, 0x365b, 0x365c, 0x365d, 0x365e, 0x365f, + 0x3660, 0x3661, 0x3662, 0x3663, 0x3664, 0x3665, 0x3666, 0x3667, + 0x3668, 0x3669, 0x366a, 0x366b, 0x366c, 0x366d, 0x366e, 0x366f, + 0x3670, 0x3671, 0x3672, 0x3673, 0x3674, 0x3675, 0x3676, 0x3677, + 0x3678, 0x3679, 0x367a, 0x367b, 0x367c, 0x367d, 0x367e, 0x3721, + 0x3722, 0x3723, 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, + 0x372a, 0x372b, 0x372c, 0x372d, 0x372e, 0x372f, 0x3730, 0x3731, + 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, + 0x373a, 0x373b, 0x373c, 0x373d, 0x373e, 0x373f, 0x3740, 0x3741, + 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, + 0x374a, 0x374b, 0x374c, 0x374d, 0x374e, 0x374f, 0x3750, 0x3751, + 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, + 0x375a, 0x375b, 0x375c, 0x375d, 0x375e, 0x375f, 0x3760, 0x3761, + 0x3762, 0x3763, 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, + 0x376a, 0x376b, 0x376c, 0x376d, 0x376e, 0x376f, 0x3770, 0x3771, + 0x3772, 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, + 0x377a, 0x377b, 0x377c, 0x377d, 0x377e, 0x3821, 0x3822, 0x3823, + 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382a, 0x382b, + 0x382c, 0x382d, 0x382e, 0x382f, 0x3830, 0x3831, 0x3832, 0x3833, + 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383a, 0x383b, + 0x383c, 0x383d, 0x383e, 0x383f, 0x3840, 0x3841, 0x3842, 0x3843, + 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384a, 0x384b, + 0x384c, 0x384d, 0x384e, 0x384f, 0x3850, 0x3851, 0x3852, 0x3853, + 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385a, 0x385b, + 0x385c, 0x385d, 0x385e, 0x385f, 0x3860, 0x3861, 0x3862, 0x3863, + 0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386a, 0x386b, + 0x386c, 0x386d, 0x386e, 0x386f, 0x3870, 0x3871, 0x3872, 0x3873, + 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387a, 0x387b, + 0x387c, 0x387d, 0x387e, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, + 0x3926, 0x3927, 0x3928, 0x3929, 0x392a, 0x392b, 0x392c, 0x392d, + 0x392e, 0x392f, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, + 0x3936, 0x3937, 0x3938, 0x3939, 0x393a, 0x393b, 0x393c, 0x393d, + 0x393e, 0x393f, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, + 0x3946, 0x3947, 0x3948, 0x3949, 0x394a, 0x394b, 0x394c, 0x394d, + 0x394e, 0x394f, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, + 0x3956, 0x3957, 0x3958, 0x3959, 0x395a, 0x395b, 0x395c, 0x395d, + 0x395e, 0x395f, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, + 0x3966, 0x3967, 0x3968, 0x3969, 0x396a, 0x396b, 0x396c, 0x396d, + 0x396e, 0x396f, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, + 0x3976, 0x3977, 0x3978, 0x3979, 0x397a, 0x397b, 0x397c, 0x397d, + 0x397e, 0x3a21, 0x3a22, 0x3a23, 0x3a24, 0x3a25, 0x3a26, 0x3a27, + 0x3a28, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, + 0x3a30, 0x3a31, 0x3a32, 0x3a33, 0x3a34, 0x3a35, 0x3a36, 0x3a37, + 0x3a38, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, + 0x3a40, 0x3a41, 0x3a42, 0x3a43, 0x3a44, 0x3a45, 0x3a46, 0x3a47, + 0x3a48, 0x3a49, 0x3a4a, 0x3a4b, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, + 0x3a50, 0x3a51, 0x3a52, 0x3a53, 0x3a54, 0x3a55, 0x3a56, 0x3a57, + 0x3a58, 0x3a59, 0x3a5a, 0x3a5b, 0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, + 0x3a60, 0x3a61, 0x3a62, 0x3a63, 0x3a64, 0x3a65, 0x3a66, 0x3a67, + 0x3a68, 0x3a69, 0x3a6a, 0x3a6b, 0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, + 0x3a70, 0x3a71, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a77, + 0x3a78, 0x3a79, 0x3a7a, 0x3a7b, 0x3a7c, 0x3a7d, 0x3a7e, 0x3b21, + 0x3b22, 0x3b23, 0x3b24, 0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x3b29, + 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d, 0x3b2e, 0x3b2f, 0x3b30, 0x3b31, + 0x3b32, 0x3b33, 0x3b34, 0x3b35, 0x3b36, 0x3b37, 0x3b38, 0x3b39, + 0x3b3a, 0x3b3b, 0x3b3c, 0x3b3d, 0x3b3e, 0x3b3f, 0x3b40, 0x3b41, + 0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b46, 0x3b47, 0x3b48, 0x3b49, + 0x3b4a, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51, + 0x3b52, 0x3b53, 0x3b54, 0x3b55, 0x3b56, 0x3b57, 0x3b58, 0x3b59, + 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, 0x3b5f, 0x3b60, 0x3b61, + 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, 0x3b67, 0x3b68, 0x3b69, + 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, 0x3b6f, 0x3b70, 0x3b71, + 0x3b72, 0x3b73, 0x3b74, 0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b79, + 0x3b7a, 0x3b7b, 0x3b7c, 0x3b7d, 0x3b7e, 0x3c21, 0x3c22, 0x3c23, + 0x3c24, 0x3c25, 0x3c26, 0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, + 0x3c2c, 0x3c2d, 0x3c2e, 0x3c2f, 0x3c30, 0x3c31, 0x3c32, 0x3c33, + 0x3c34, 0x3c35, 0x3c36, 0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, + 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, + 0x3c44, 0x3c45, 0x3c46, 0x3c47, 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, + 0x3c4c, 0x3c4d, 0x3c4e, 0x3c4f, 0x3c50, 0x3c51, 0x3c52, 0x3c53, + 0x3c54, 0x3c55, 0x3c56, 0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, + 0x3c5c, 0x3c5d, 0x3c5e, 0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, + 0x3c64, 0x3c65, 0x3c66, 0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, + 0x3c6c, 0x3c6d, 0x3c6e, 0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, + 0x3c74, 0x3c75, 0x3c76, 0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, + 0x3c7c, 0x3c7d, 0x3c7e, 0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, + 0x3d26, 0x3d27, 0x3d28, 0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, + 0x3d2e, 0x3d2f, 0x3d30, 0x3d31, 0x3d32, 0x3d33, 0x3d34, 0x3d35, + 0x3d36, 0x3d37, 0x3d38, 0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, + 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, + 0x3d46, 0x3d47, 0x3d48, 0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, + 0x3d4e, 0x3d4f, 0x3d50, 0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, + 0x3d56, 0x3d57, 0x3d58, 0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, + 0x3d5e, 0x3d5f, 0x3d60, 0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, + 0x3d66, 0x3d67, 0x3d68, 0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, + 0x3d6e, 0x3d6f, 0x3d70, 0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, + 0x3d76, 0x3d77, 0x3d78, 0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, + 0x3d7e, 0x3e21, 0x3e22, 0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, + 0x3e28, 0x3e29, 0x3e2a, 0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, + 0x3e30, 0x3e31, 0x3e32, 0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, + 0x3e38, 0x3e39, 0x3e3a, 0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, + 0x3e40, 0x3e41, 0x3e42, 0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, + 0x3e48, 0x3e49, 0x3e4a, 0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, + 0x3e50, 0x3e51, 0x3e52, 0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, + 0x3e58, 0x3e59, 0x3e5a, 0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, + 0x3e60, 0x3e61, 0x3e62, 0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, + 0x3e68, 0x3e69, 0x3e6a, 0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, + 0x3e70, 0x3e71, 0x3e72, 0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, + 0x3e78, 0x3e79, 0x3e7a, 0x3e7b, 0x3e7c, 0x3e7d, 0x3e7e, 0x3f21, + 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, + 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, + 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, + 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, + 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, + 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, + 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, + 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, + 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, + 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, + 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, + 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x4021, 0x4022, 0x4023, + 0x4024, 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402a, 0x402b, + 0x402c, 0x402d, 0x402e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, + 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, + 0x403c, 0x403d, 0x403e, 0x403f, 0x4040, 0x4041, 0x4042, 0x4043, + 0x4044, 0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a, 0x404b, + 0x404c, 0x404d, 0x404e, 0x404f, 0x4050, 0x4051, 0x4052, 0x4053, + 0x4054, 0x4055, 0x4056, 0x4057, 0x4058, 0x4059, 0x405a, 0x405b, + 0x405c, 0x405d, 0x405e, 0x405f, 0x4060, 0x4061, 0x4062, 0x4063, + 0x4064, 0x4065, 0x4066, 0x4067, 0x4068, 0x4069, 0x406a, 0x406b, + 0x406c, 0x406d, 0x406e, 0x406f, 0x4070, 0x4071, 0x4072, 0x4073, + 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407a, 0x407b, + 0x407c, 0x407d, 0x407e, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, + 0x4126, 0x4127, 0x4128, 0x4129, 0x412a, 0x412b, 0x412c, 0x412d, + 0x412e, 0x412f, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135, + 0x4136, 0x4137, 0x4138, 0x4139, 0x413a, 0x413b, 0x413c, 0x413d, + 0x413e, 0x413f, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145, + 0x4146, 0x4147, 0x4148, 0x4149, 0x414a, 0x414b, 0x414c, 0x414d, + 0x414e, 0x414f, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155, + 0x4156, 0x4157, 0x4158, 0x4159, 0x415a, 0x415b, 0x415c, 0x415d, + 0x415e, 0x415f, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, + 0x4166, 0x4167, 0x4168, 0x4169, 0x416a, 0x416b, 0x416c, 0x416d, + 0x416e, 0x416f, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, + 0x4176, 0x4177, 0x4178, 0x4179, 0x417a, 0x417b, 0x417c, 0x417d, + 0x417e, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227, + 0x4228, 0x4229, 0x422a, 0x422b, 0x422c, 0x422d, 0x422e, 0x422f, + 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236, 0x4237, + 0x4238, 0x4239, 0x423a, 0x423b, 0x423c, 0x423d, 0x423e, 0x423f, + 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246, 0x4247, + 0x4248, 0x4249, 0x424a, 0x424b, 0x424c, 0x424d, 0x424e, 0x424f, + 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256, 0x4257, + 0x4258, 0x4259, 0x425a, 0x425b, 0x425c, 0x425d, 0x425e, 0x425f, + 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266, 0x4267, + 0x4268, 0x4269, 0x426a, 0x426b, 0x426c, 0x426d, 0x426e, 0x426f, + 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276, 0x4277, + 0x4278, 0x4279, 0x427a, 0x427b, 0x427c, 0x427d, 0x427e, 0x4321, + 0x4322, 0x4323, 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, + 0x432a, 0x432b, 0x432c, 0x432d, 0x432e, 0x432f, 0x4330, 0x4331, + 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4338, 0x4339, + 0x433a, 0x433b, 0x433c, 0x433d, 0x433e, 0x433f, 0x4340, 0x4341, + 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, 0x4348, 0x4349, + 0x434a, 0x434b, 0x434c, 0x434d, 0x434e, 0x434f, 0x4350, 0x4351, + 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, 0x4358, 0x4359, + 0x435a, 0x435b, 0x435c, 0x435d, 0x435e, 0x435f, 0x4360, 0x4361, + 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, + 0x436a, 0x436b, 0x436c, 0x436d, 0x436e, 0x436f, 0x4370, 0x4371, + 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, + 0x437a, 0x437b, 0x437c, 0x437d, 0x437e, 0x4421, 0x4422, 0x4423, + 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, + 0x442c, 0x442d, 0x442e, 0x442f, 0x4430, 0x4431, 0x4432, 0x4433, + 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, + 0x443c, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4442, 0x4443, + 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, + 0x444c, 0x444d, 0x444e, 0x444f, 0x4450, 0x4451, 0x4452, 0x4453, + 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445a, 0x445b, + 0x445c, 0x445d, 0x445e, 0x445f, 0x4460, 0x4461, 0x4462, 0x4463, + 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446a, 0x446b, + 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, + 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, + 0x447c, 0x447d, 0x447e, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, + 0x4526, 0x4527, 0x4528, 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, + 0x452e, 0x452f, 0x4530, 0x4531, 0x4532, 0x4533, 0x4534, 0x4535, + 0x4536, 0x4537, 0x4538, 0x4539, 0x453a, 0x453b, 0x453c, 0x453d, + 0x453e, 0x453f, 0x4540, 0x4541, 0x4542, 0x4543, 0x4544, 0x4545, + 0x4546, 0x4547, 0x4548, 0x4549, 0x454a, 0x454b, 0x454c, 0x454d, + 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, + 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, 0x455b, 0x455c, 0x455d, + 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, + 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, 0x456b, 0x456c, 0x456d, + 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, + 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, 0x457b, 0x457c, 0x457d, + 0x457e, 0x4621, 0x4622, 0x4623, 0x4624, 0x4625, 0x4626, 0x4627, + 0x4628, 0x4629, 0x462a, 0x462b, 0x462c, 0x462d, 0x462e, 0x462f, + 0x4630, 0x4631, 0x4632, 0x4633, 0x4634, 0x4635, 0x4636, 0x4637, + 0x4638, 0x4639, 0x463a, 0x463b, 0x463c, 0x463d, 0x463e, 0x463f, + 0x4640, 0x4641, 0x4642, 0x4643, 0x4644, 0x4645, 0x4646, 0x4647, + 0x4648, 0x4649, 0x464a, 0x464b, 0x464c, 0x464d, 0x464e, 0x464f, + 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, + 0x4658, 0x4659, 0x465a, 0x465b, 0x465c, 0x465d, 0x465e, 0x465f, + 0x4660, 0x4661, 0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, + 0x4668, 0x4669, 0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, + 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, + 0x4678, 0x4679, 0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x4721, + 0x4722, 0x4723, 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, + 0x472a, 0x472b, 0x472c, 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, + 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737, 0x4738, 0x4739, + 0x473a, 0x473b, 0x473c, 0x473d, 0x473e, 0x473f, 0x4740, 0x4741, + 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, 0x4748, 0x4749, + 0x474a, 0x474b, 0x474c, 0x474d, 0x474e, 0x474f, 0x4750, 0x4751, + 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, 0x4758, 0x4759, + 0x475a, 0x475b, 0x475c, 0x475d, 0x475e, 0x475f, 0x4760, 0x4761, + 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767, 0x4768, 0x4769, + 0x476a, 0x476b, 0x476c, 0x476d, 0x476e, 0x476f, 0x4770, 0x4771, + 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777, 0x4778, 0x4779, + 0x477a, 0x477b, 0x477c, 0x477d, 0x477e, 0x4821, 0x4822, 0x4823, + 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829, 0x482a, 0x482b, + 0x482c, 0x482d, 0x482e, 0x482f, 0x4830, 0x4831, 0x4832, 0x4833, + 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x483a, 0x483b, + 0x483c, 0x483d, 0x483e, 0x483f, 0x4840, 0x4841, 0x4842, 0x4843, + 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849, 0x484a, 0x484b, + 0x484c, 0x484d, 0x484e, 0x484f, 0x4850, 0x4851, 0x4852, 0x4853, + 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859, 0x485a, 0x485b, + 0x485c, 0x485d, 0x485e, 0x485f, 0x4860, 0x4861, 0x4862, 0x4863, + 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x486a, 0x486b, + 0x486c, 0x486d, 0x486e, 0x486f, 0x4870, 0x4871, 0x4872, 0x4873, + 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, 0x487a, 0x487b, + 0x487c, 0x487d, 0x487e, 0x4b50, 0x4b56, 0x4b67, 0x4d4f, 0x4d68, + 0x4e2d, 0x4f7b, 0x5022, 0x5038, 0x5050, 0x505d, 0x5154, 0x5155, + 0x5158, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160, 0x5162, + 0x5163, 0x5164, 0x5165, 0x5166, 0x5168, 0x5169, 0x516a, 0x516b, + 0x516d, 0x516f, 0x5170, 0x5172, 0x5176, 0x517a, 0x517c, 0x517d, + 0x517e, 0x5222, 0x5223, 0x5227, 0x5228, 0x5229, 0x522a, 0x522b, + 0x522d, 0x5232, 0x523e, 0x5242, 0x5243, 0x5244, 0x5246, 0x5247, + 0x5248, 0x5249, 0x524a, 0x524b, 0x524d, 0x524e, 0x524f, 0x5250, + 0x5251, 0x5252, 0x5253, 0x5254, 0x5255, 0x5256, 0x5257, 0x5259, + 0x525a, 0x525e, 0x525f, 0x5261, 0x5262, 0x5264, 0x5265, 0x5266, + 0x5267, 0x5268, 0x5269, 0x526a, 0x526b, 0x5270, 0x5271, 0x5272, + 0x5273, 0x5274, 0x5275, 0x5277, 0x5278, 0x5466, 0x547c, 0x5525, + 0x552b, 0x552e, 0x5638, 0x564d, 0x574b, 0x5764, 0x5b45, 0x5b64, + 0x5c25, 0x5d25, 0x5d55, 0x5d74, 0x5e7c, 0x5e7e, 0x5f33, 0x5f61, + 0x5f68, 0x6071, 0x612d, 0x616d, 0x6375, 0x6421, 0x6429, 0x652e, + 0x6531, 0x6532, 0x6539, 0x653b, 0x653c, 0x6544, 0x654e, 0x6550, + 0x6552, 0x6556, 0x657a, 0x657b, 0x657c, 0x657e, 0x6621, 0x6624, + 0x6627, 0x662d, 0x662f, 0x6630, 0x6631, 0x6633, 0x6637, 0x6638, + 0x663c, 0x6644, 0x6646, 0x6647, 0x664a, 0x6652, 0x6656, 0x6659, + 0x665c, 0x665f, 0x6661, 0x6664, 0x6665, 0x6666, 0x6668, 0x666a, + 0x666b, 0x666c, 0x666f, 0x6671, 0x6672, 0x6675, 0x6676, 0x6677, + 0x6679, 0x6721, 0x6726, 0x6729, 0x672a, 0x672c, 0x672d, 0x6730, + 0x673f, 0x6741, 0x6746, 0x6747, 0x674b, 0x674d, 0x674f, 0x6750, + 0x6753, 0x675f, 0x6764, 0x6766, 0x6777, 0x6867, 0x6868, 0x6870, + 0x6871, 0x6877, 0x6879, 0x687b, 0x687e, 0x6927, 0x692c, 0x694c, + 0x6977, 0x6a41, 0x6a65, 0x6a74, 0x6a77, 0x6a7c, 0x6a7e, 0x6b24, + 0x6b27, 0x6b29, 0x6b2a, 0x6b3a, 0x6b3b, 0x6b3d, 0x6b41, 0x6b42, + 0x6b46, 0x6b47, 0x6b4c, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b58, + 0x6c26, 0x6c27, 0x6c2a, 0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c35, + 0x6c38, 0x6c3a, 0x6c40, 0x6c41, 0x6c45, 0x6c46, 0x6c49, 0x6c4a, + 0x6c55, 0x6c5d, 0x6c5e, 0x6c61, 0x6c64, 0x6c67, 0x6c68, 0x6c77, + 0x6c78, 0x6c7a, 0x6d21, 0x6d22, 0x6d23, 0x6d6e, 0x6e5b, 0x723d, + 0x727a, 0x7331, 0x7427, 0x746e, 0x7674, 0x7676, 0x7738, 0x7748, + 0x7753, 0x785b, 0x7870, 0x7a21, 0x7a22, 0x7a66, 0x7c29, 0x2321, + 0x2322, 0x2323, 0x2324, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, + 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, + 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, + 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 0x2341, + 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, + 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, + 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, + 0x235a, 0x235b, 0x212c, 0x235d, 0x235e, 0x235f, 0x2360, 0x2361, + 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, + 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, + 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, + 0x237a, 0x237b, 0x237c, 0x237d, 0x2226, 0x214b, 0x214c, 0x217e, + 0x237e, 0x214d, 0x235c, +}; + +static const Summary16 ksc5601_uni2indx_page00[70] = { + /* 0x0000 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x6592 }, { 7, 0xf7df }, + { 21, 0x0040 }, { 22, 0xc181 }, { 27, 0x0040 }, { 28, 0x4181 }, + /* 0x0100 */ + { 32, 0x0000 }, { 32, 0x0002 }, { 33, 0x00c0 }, { 35, 0x810e }, + { 40, 0x0e07 }, { 46, 0x000c }, { 48, 0x00c0 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + /* 0x0200 */ + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, + { 50, 0x0080 }, { 51, 0x2f01 }, { 57, 0x0000 }, { 57, 0x0000 }, + /* 0x0300 */ + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, + { 57, 0x0000 }, { 57, 0xfffe }, { 72, 0x03fb }, { 81, 0xfffe }, + { 96, 0x03fb }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, + /* 0x0400 */ + { 105, 0x0002 }, { 106, 0xffff }, { 122, 0xffff }, { 138, 0xffff }, + { 154, 0xffff }, { 170, 0x0002 }, +}; +static const Summary16 ksc5601_uni2indx_page20[103] = { + /* 0x2000 */ + { 171, 0x0000 }, { 171, 0x3320 }, { 176, 0x0063 }, { 180, 0x080d }, + { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x8010 }, + { 186, 0x001e }, { 190, 0x0000 }, { 190, 0x1000 }, { 191, 0x0000 }, + { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, + /* 0x2100 */ + { 191, 0x0208 }, { 193, 0x0048 }, { 195, 0x0846 }, { 199, 0x0000 }, + { 199, 0x0000 }, { 199, 0x7818 }, { 205, 0x03ff }, { 215, 0x03ff }, + { 225, 0x0000 }, { 225, 0x03ff }, { 235, 0x0000 }, { 235, 0x0000 }, + { 235, 0x0000 }, { 235, 0x0014 }, { 237, 0x0000 }, { 237, 0x0000 }, + /* 0x2200 */ + { 237, 0x898d }, { 244, 0x6402 }, { 248, 0x5fa1 }, { 257, 0x3030 }, + { 261, 0x0000 }, { 261, 0x0004 }, { 262, 0x0c33 }, { 268, 0x0000 }, + { 268, 0x00cc }, { 272, 0x0200 }, { 273, 0x0020 }, { 274, 0x0000 }, + { 274, 0x0000 }, { 274, 0x0000 }, { 274, 0x0000 }, { 274, 0x0000 }, + /* 0x2300 */ + { 274, 0x0000 }, { 274, 0x0004 }, { 275, 0x0000 }, { 275, 0x0000 }, + { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, + { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, + { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, + /* 0x2400 */ + { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, + { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x7fff }, { 290, 0xfff0 }, + { 302, 0x0007 }, { 305, 0xf000 }, { 309, 0xffff }, { 325, 0x003f }, + { 331, 0x0000 }, { 331, 0xffff }, { 347, 0x03ff }, { 357, 0x0000 }, + /* 0x2500 */ + { 357, 0xf00f }, { 365, 0xffff }, { 381, 0xffff }, { 397, 0xffff }, + { 413, 0x0fff }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, + { 425, 0x0000 }, { 425, 0x0004 }, { 426, 0x03fb }, { 435, 0x30cc }, + { 441, 0xc9c3 }, { 449, 0x0003 }, { 451, 0x0000 }, { 451, 0x0000 }, + /* 0x2600 */ + { 451, 0xc060 }, { 455, 0x5000 }, { 457, 0x0000 }, { 457, 0x0000 }, + { 457, 0x0005 }, { 459, 0x0000 }, { 459, 0x37bb }, +}; +static const Summary16 ksc5601_uni2indx_page30[62] = { + /* 0x3000 */ + { 470, 0xff0f }, { 482, 0x003b }, { 487, 0x0000 }, { 487, 0x0000 }, + { 487, 0xfffe }, { 502, 0xffff }, { 518, 0xffff }, { 534, 0xffff }, + { 550, 0xffff }, { 566, 0x000f }, { 570, 0xfffe }, { 585, 0xffff }, + { 601, 0xffff }, { 617, 0xffff }, { 633, 0xffff }, { 649, 0x007f }, + /* 0x3100 */ + { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0xfffe }, + { 671, 0xffff }, { 687, 0xffff }, { 703, 0xffff }, { 719, 0xffff }, + { 735, 0x7fff }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, + { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, + /* 0x3200 */ + { 750, 0xffff }, { 766, 0x1fff }, { 779, 0x0000 }, { 779, 0x0000 }, + { 779, 0x0000 }, { 779, 0x0000 }, { 779, 0xffff }, { 795, 0xcfff }, + { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, + { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, + /* 0x3300 */ + { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, + { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, + { 809, 0xff1f }, { 822, 0xffff }, { 838, 0xffff }, { 854, 0xffff }, + { 870, 0x87ff }, { 882, 0x3949 }, +}; +static const Summary16 ksc5601_uni2indx_page4e[1306] = { + /* 0x4e00 */ + { 889, 0x2f8b }, { 898, 0x4372 }, { 905, 0x2000 }, { 906, 0x0b04 }, + { 910, 0xe82c }, { 917, 0xe340 }, { 923, 0x2800 }, { 925, 0x40c8 }, + { 929, 0x5944 }, { 935, 0x4937 }, { 943, 0x7976 }, { 953, 0x0440 }, + { 955, 0x2c93 }, { 962, 0xa3f0 }, { 970, 0x0038 }, { 973, 0x08c5 }, + /* 0x4f00 */ + { 978, 0xee02 }, { 985, 0x0003 }, { 987, 0x8000 }, { 988, 0x3550 }, + { 994, 0xe1c8 }, { 1001, 0x1e23 }, { 1008, 0x8200 }, { 1010, 0xc449 }, + { 1016, 0xad5a }, { 1025, 0x2942 }, { 1030, 0xc000 }, { 1032, 0x8060 }, + { 1035, 0x461c }, { 1041, 0xa49a }, { 1048, 0xc003 }, { 1052, 0x052a }, + /* 0x5000 */ + { 1057, 0x2a44 }, { 1062, 0xd646 }, { 1070, 0x3dda }, { 1080, 0x0800 }, + { 1081, 0x8388 }, { 1086, 0x1420 }, { 1089, 0x0020 }, { 1090, 0x0170 }, + { 1094, 0x2021 }, { 1097, 0x0302 }, { 1100, 0x3000 }, { 1102, 0x40ac }, + { 1107, 0x8620 }, { 1111, 0x4462 }, { 1116, 0x20a0 }, { 1119, 0x8a00 }, + /* 0x5100 */ + { 1122, 0x0253 }, { 1127, 0x8004 }, { 1129, 0x0402 }, { 1131, 0x1484 }, + { 1135, 0x7bfb }, { 1148, 0x1004 }, { 1150, 0x7fa4 }, { 1160, 0x11e2 }, + { 1166, 0x2441 }, { 1170, 0x00a4 }, { 1173, 0x1421 }, { 1177, 0x20c0 }, + { 1180, 0x3a50 }, { 1186, 0x7000 }, { 1189, 0x0002 }, { 1190, 0x2743 }, + /* 0x5200 */ + { 1197, 0x45c9 }, { 1204, 0x2082 }, { 1207, 0x4630 }, { 1212, 0x0fc1 }, + { 1219, 0x3c88 }, { 1225, 0x2850 }, { 1229, 0x8602 }, { 1233, 0xa024 }, + { 1237, 0x2388 }, { 1242, 0x8806 }, { 1246, 0x0e19 }, { 1252, 0x4000 }, + { 1253, 0x22aa }, { 1259, 0xeb64 }, { 1268, 0x001c }, { 1271, 0xcd28 }, + /* 0x5300 */ + { 1278, 0xa120 }, { 1282, 0x02e1 }, { 1287, 0x840b }, { 1292, 0x8200 }, + { 1294, 0x279b }, { 1303, 0x549e }, { 1311, 0x8141 }, { 1315, 0xa0b3 }, + { 1322, 0x0010 }, { 1323, 0x8508 }, { 1327, 0x2061 }, { 1331, 0x0800 }, + { 1332, 0x2f08 }, { 1338, 0x08d0 }, { 1342, 0xbe3e }, { 1353, 0x010f }, + /* 0x5400 */ + { 1358, 0xf718 }, { 1367, 0xa803 }, { 1372, 0x0a41 }, { 1376, 0x5b08 }, + { 1382, 0x0504 }, { 1385, 0x0002 }, { 1386, 0x0500 }, { 1388, 0x382a }, + { 1394, 0x5041 }, { 1398, 0x0001 }, { 1399, 0x1910 }, { 1403, 0x2108 }, + { 1406, 0x0313 }, { 1411, 0x0000 }, { 1411, 0x6122 }, { 1416, 0x0404 }, + /* 0x5500 */ + { 1418, 0x40d0 }, { 1422, 0x1001 }, { 1424, 0x8000 }, { 1425, 0x4022 }, + { 1428, 0x8050 }, { 1431, 0x4048 }, { 1434, 0x0008 }, { 1435, 0x1000 }, + { 1436, 0x06d1 }, { 1442, 0x3700 }, { 1447, 0x5e80 }, { 1453, 0x0000 }, + { 1453, 0x00a0 }, { 1455, 0x9410 }, { 1459, 0x0018 }, { 1461, 0x6000 }, + /* 0x5600 */ + { 1463, 0x0240 }, { 1465, 0x0090 }, { 1467, 0x8000 }, { 1468, 0x0054 }, + { 1471, 0x0000 }, { 1471, 0x0008 }, { 1472, 0x0900 }, { 1474, 0x0010 }, + { 1475, 0x0040 }, { 1476, 0x0000 }, { 1476, 0x5020 }, { 1479, 0x1010 }, + { 1481, 0x2400 }, { 1483, 0x4c02 }, { 1487, 0x0001 }, { 1488, 0x0601 }, + /* 0x5700 */ + { 1491, 0x2918 }, { 1496, 0x814c }, { 1501, 0x2100 }, { 1503, 0x0801 }, + { 1505, 0x6485 }, { 1511, 0x0003 }, { 1513, 0x4452 }, { 1518, 0x1021 }, + { 1521, 0x0904 }, { 1524, 0x0008 }, { 1525, 0x000d }, { 1528, 0x0000 }, + { 1528, 0x4988 }, { 1533, 0x8000 }, { 1534, 0x0001 }, { 1535, 0x1691 }, + /* 0x5800 */ + { 1541, 0x0765 }, { 1548, 0x4000 }, { 1549, 0x8492 }, { 1554, 0x0433 }, + { 1559, 0x8c00 }, { 1562, 0x4592 }, { 1568, 0x0016 }, { 1571, 0x5220 }, + { 1575, 0x0228 }, { 1578, 0xd008 }, { 1582, 0x4300 }, { 1585, 0x4c08 }, + { 1589, 0x40a2 }, { 1593, 0xc32a }, { 1600, 0x9810 }, { 1604, 0x2e00 }, + /* 0x5900 */ + { 1608, 0x8000 }, { 1609, 0x1670 }, { 1615, 0x6e84 }, { 1622, 0x4082 }, + { 1625, 0xc390 }, { 1631, 0x04b3 }, { 1637, 0x7c85 }, { 1645, 0x2118 }, + { 1649, 0x041c }, { 1653, 0x02c8 }, { 1657, 0x1120 }, { 1660, 0x4a00 }, + { 1663, 0x0a48 }, { 1667, 0x361b }, { 1675, 0x5540 }, { 1680, 0x8900 }, + /* 0x5a00 */ + { 1683, 0x000a }, { 1685, 0x9902 }, { 1690, 0x0221 }, { 1693, 0x1040 }, + { 1695, 0x0242 }, { 1698, 0x0400 }, { 1699, 0x0044 }, { 1701, 0x0000 }, + { 1701, 0x0000 }, { 1701, 0x0c04 }, { 1704, 0x0010 }, { 1705, 0x0000 }, + { 1705, 0x1216 }, { 1710, 0x0000 }, { 1710, 0x0242 }, { 1713, 0x0000 }, + /* 0x5b00 */ + { 1713, 0x1a20 }, { 1717, 0x0040 }, { 1718, 0x0400 }, { 1719, 0x0000 }, + { 1719, 0x0009 }, { 1721, 0xb5b3 }, { 1731, 0x0a18 }, { 1735, 0x1523 }, + { 1741, 0x9ba0 }, { 1748, 0x1fe8 }, { 1757, 0x507c }, { 1764, 0x8379 }, + { 1772, 0x10fd }, { 1780, 0xc09d }, { 1787, 0xdbf6 }, { 1799, 0x0560 }, + /* 0x5c00 */ + { 1803, 0xef92 }, { 1813, 0x0242 }, { 1816, 0x0110 }, { 1818, 0xdf02 }, + { 1826, 0x6961 }, { 1833, 0x0822 }, { 1836, 0x9035 }, { 1842, 0x0202 }, + { 1844, 0x0000 }, { 1844, 0x0003 }, { 1846, 0x1a02 }, { 1850, 0x45aa }, + { 1857, 0x0001 }, { 1858, 0x0200 }, { 1859, 0x8101 }, { 1862, 0x2851 }, + /* 0x5d00 */ + { 1867, 0x6080 }, { 1870, 0x02d2 }, { 1875, 0x0280 }, { 1877, 0x0000 }, + { 1877, 0x1800 }, { 1879, 0x0001 }, { 1880, 0x9200 }, { 1883, 0x0000 }, + { 1883, 0x0880 }, { 1885, 0x2000 }, { 1886, 0x0405 }, { 1889, 0x3500 }, + { 1893, 0x2000 }, { 1894, 0x6044 }, { 1898, 0x49e6 }, { 1906, 0x609e }, + /* 0x5e00 */ + { 1913, 0x104c }, { 1917, 0x2a42 }, { 1922, 0x2820 }, { 1925, 0xa148 }, + { 1930, 0x10b1 }, { 1935, 0x8020 }, { 1937, 0x000e }, { 1940, 0x7b9c }, + { 1950, 0x8490 }, { 1954, 0x14a0 }, { 1958, 0x28c1 }, { 1963, 0x41e0 }, + { 1968, 0x0704 }, { 1972, 0x8c49 }, { 1978, 0x100d }, { 1982, 0x0cc8 }, + /* 0x5f00 */ + { 1987, 0x8412 }, { 1991, 0x89ba }, { 1999, 0x02c0 }, { 2002, 0x1422 }, + { 2006, 0x5500 }, { 2010, 0x0ac0 }, { 2014, 0x3ec4 }, { 2022, 0x9283 }, + { 2028, 0x1ca3 }, { 2035, 0x4387 }, { 2042, 0x4703 }, { 2048, 0x22a0 }, + { 2052, 0x3028 }, { 2056, 0x03c0 }, { 2060, 0x0801 }, { 2062, 0xa020 }, + /* 0x6000 */ + { 2065, 0x8000 }, { 2066, 0x3044 }, { 2070, 0x85a3 }, { 2077, 0x0000 }, + { 2077, 0x200e }, { 2081, 0x2225 }, { 2086, 0xb73c }, { 2096, 0x0001 }, + { 2097, 0x3220 }, { 2101, 0x8c50 }, { 2106, 0x0099 }, { 2110, 0x315d }, + { 2118, 0x00a0 }, { 2120, 0x9402 }, { 2124, 0x0003 }, { 2126, 0x0e4b }, + /* 0x6100 */ + { 2133, 0xe342 }, { 2140, 0x8c20 }, { 2144, 0x0080 }, { 2145, 0xd091 }, + { 2151, 0x1d94 }, { 2158, 0xa328 }, { 2164, 0x499c }, { 2171, 0x60c1 }, + { 2176, 0x4406 }, { 2180, 0x0713 }, { 2186, 0x5a90 }, { 2192, 0x4444 }, + { 2196, 0x0f88 }, { 2202, 0x0000 }, { 2202, 0x0040 }, { 2203, 0x95c4 }, + /* 0x6200 */ + { 2210, 0x7581 }, { 2217, 0x8447 }, { 2223, 0x4402 }, { 2226, 0xc053 }, + { 2232, 0x2b83 }, { 2239, 0x0108 }, { 2241, 0x4000 }, { 2242, 0x9242 }, + { 2247, 0x0611 }, { 2251, 0x09a6 }, { 2257, 0x0800 }, { 2258, 0x3222 }, + { 2263, 0xb384 }, { 2270, 0x1bdd }, { 2280, 0xf000 }, { 2284, 0xc08a }, + /* 0x6300 */ + { 2289, 0x0282 }, { 2292, 0x0002 }, { 2293, 0x8800 }, { 2295, 0x6c00 }, + { 2299, 0x9200 }, { 2302, 0x0021 }, { 2304, 0x4180 }, { 2307, 0x8c84 }, + { 2312, 0x1308 }, { 2316, 0x0944 }, { 2320, 0x07a7 }, { 2328, 0x0000 }, + { 2328, 0x8051 }, { 2332, 0x0c41 }, { 2336, 0x6002 }, { 2339, 0x00d0 }, + /* 0x6400 */ + { 2342, 0xa000 }, { 2344, 0x10d0 }, { 2348, 0x3004 }, { 2351, 0x4400 }, + { 2353, 0x0000 }, { 2353, 0x0100 }, { 2354, 0x8201 }, { 2357, 0x0700 }, + { 2360, 0x0100 }, { 2361, 0x440e }, { 2366, 0x6830 }, { 2371, 0x0805 }, + { 2374, 0x64b2 }, { 2381, 0x0514 }, { 2385, 0x10e6 }, { 2391, 0x4414 }, + /* 0x6500 */ + { 2395, 0x0011 }, { 2397, 0x2100 }, { 2399, 0x9c08 }, { 2404, 0xcbc0 }, + { 2411, 0xe120 }, { 2416, 0x40c2 }, { 2420, 0x304c }, { 2425, 0x41b4 }, + { 2431, 0x10ac }, { 2436, 0x9a83 }, { 2443, 0x98b2 }, { 2450, 0x3281 }, + { 2455, 0x9822 }, { 2460, 0x0084 }, { 2462, 0x3369 }, { 2470, 0xbc12 }, + /* 0x6600 */ + { 2477, 0xd6c0 }, { 2484, 0xc03b }, { 2491, 0xa1a1 }, { 2497, 0x0c53 }, + { 2503, 0x8a1e }, { 2510, 0xea00 }, { 2515, 0xcbf0 }, { 2524, 0x05d8 }, + { 2530, 0x4390 }, { 2535, 0x21c3 }, { 2541, 0x4805 }, { 2545, 0x4a1c }, + { 2551, 0x02d0 }, { 2555, 0x3240 }, { 2559, 0x0041 }, { 2561, 0xd79d }, + /* 0x6700 */ + { 2572, 0x2b09 }, { 2578, 0xe8b0 }, { 2585, 0x7dc0 }, { 2593, 0x2452 }, + { 2598, 0xc240 }, { 2602, 0xd04b }, { 2609, 0xa000 }, { 2611, 0xc8ab }, + { 2619, 0x8a80 }, { 2623, 0x34a9 }, { 2630, 0x8000 }, { 2631, 0x41c9 }, + { 2637, 0x8010 }, { 2639, 0x241f }, { 2646, 0x9200 }, { 2649, 0x487b }, + /* 0x6800 */ + { 2657, 0x0000 }, { 2657, 0x00cc }, { 2661, 0x8406 }, { 2665, 0x3300 }, + { 2669, 0x410f }, { 2675, 0x001b }, { 2679, 0x2000 }, { 2680, 0x8040 }, + { 2682, 0x8022 }, { 2685, 0xa098 }, { 2690, 0xa186 }, { 2696, 0x006b }, + { 2701, 0x2a30 }, { 2706, 0x85a4 }, { 2712, 0x4181 }, { 2716, 0x0604 }, + /* 0x6900 */ + { 2719, 0x6021 }, { 2723, 0x0004 }, { 2724, 0x0080 }, { 2725, 0xa001 }, + { 2728, 0x0400 }, { 2729, 0x46b8 }, { 2736, 0xe90f }, { 2745, 0x03a0 }, + { 2749, 0x0000 }, { 2749, 0x1820 }, { 2752, 0x40a0 }, { 2755, 0x0810 }, + { 2757, 0x380a }, { 2762, 0x0001 }, { 2763, 0x0500 }, { 2765, 0xa800 }, + /* 0x6a00 */ + { 2768, 0x0404 }, { 2770, 0xc28a }, { 2776, 0x000a }, { 2778, 0x2720 }, + { 2783, 0x0910 }, { 2786, 0x830c }, { 2791, 0x0802 }, { 2793, 0x0000 }, + { 2793, 0x6211 }, { 2798, 0x1080 }, { 2800, 0x000c }, { 2802, 0x0808 }, + { 2804, 0x000c }, { 2806, 0x0c08 }, { 2809, 0x0000 }, { 2809, 0x0840 }, + /* 0x6b00 */ + { 2811, 0x1410 }, { 2814, 0x0044 }, { 2816, 0x000b }, { 2819, 0x6404 }, + { 2823, 0x50c0 }, { 2827, 0x8001 }, { 2829, 0x047e }, { 2836, 0x8984 }, + { 2841, 0x0658 }, { 2846, 0x4140 }, { 2849, 0xc000 }, { 2851, 0x94a4 }, + { 2857, 0xa862 }, { 2863, 0x09dc }, { 2870, 0x1800 }, { 2872, 0x0000 }, + /* 0x6c00 */ + { 2872, 0x8100 }, { 2874, 0x000a }, { 2876, 0x0008 }, { 2877, 0x4190 }, + { 2881, 0x4007 }, { 2885, 0xe4a1 }, { 2892, 0x2501 }, { 2896, 0x6445 }, + { 2902, 0x11ee }, { 2910, 0x0e7d }, { 2919, 0x4800 }, { 2921, 0xfb08 }, + { 2929, 0x1616 }, { 2935, 0x08a8 }, { 2939, 0xc92e }, { 2947, 0x0009 }, + /* 0x6d00 */ + { 2949, 0x1800 }, { 2951, 0x4a82 }, { 2956, 0x06a0 }, { 2960, 0x6b64 }, + { 2968, 0x0002 }, { 2969, 0x1600 }, { 2972, 0x5648 }, { 2978, 0x8390 }, + { 2983, 0x73a0 }, { 2990, 0x002a }, { 2993, 0x8000 }, { 2994, 0x0024 }, + { 2996, 0x88f9 }, { 3004, 0x4702 }, { 3009, 0x4d02 }, { 3014, 0x0faa }, + /* 0x6e00 */ + { 3022, 0x0000 }, { 3022, 0x8e80 }, { 3027, 0xb87b }, { 3037, 0x7554 }, + { 3045, 0x2418 }, { 3049, 0xd940 }, { 3055, 0xc880 }, { 3059, 0x040c }, + { 3062, 0x0000 }, { 3062, 0xb041 }, { 3067, 0x8c24 }, { 3072, 0x0442 }, + { 3075, 0x5a34 }, { 3082, 0x001a }, { 3085, 0x8000 }, { 3086, 0xc110 }, + /* 0x6f00 */ + { 3090, 0x8046 }, { 3094, 0x0032 }, { 3097, 0x180d }, { 3102, 0x8106 }, + { 3106, 0x0002 }, { 3107, 0xcd92 }, { 3115, 0x6014 }, { 3119, 0x7401 }, + { 3124, 0x6112 }, { 3129, 0x0091 }, { 3132, 0xc098 }, { 3137, 0x420a }, + { 3141, 0x040f }, { 3146, 0x8420 }, { 3149, 0x9a13 }, { 3156, 0x4002 }, + /* 0x7000 */ + { 3158, 0x8a62 }, { 3164, 0xfd22 }, { 3173, 0x8188 }, { 3177, 0x4080 }, + { 3179, 0x1000 }, { 3180, 0x2103 }, { 3184, 0x0808 }, { 3186, 0x3101 }, + { 3190, 0x4420 }, { 3193, 0x0704 }, { 3197, 0xb812 }, { 3203, 0x0388 }, + { 3207, 0x8900 }, { 3210, 0xa300 }, { 3214, 0x0000 }, { 3214, 0x2202 }, + /* 0x7100 */ + { 3217, 0x1210 }, { 3220, 0x4600 }, { 3223, 0x0042 }, { 3225, 0x0041 }, + { 3227, 0x5680 }, { 3232, 0x5241 }, { 3237, 0x52f0 }, { 3244, 0x2000 }, + { 3245, 0x8610 }, { 3249, 0x8214 }, { 3253, 0x1004 }, { 3255, 0x4602 }, + { 3259, 0x430a }, { 3264, 0x8035 }, { 3269, 0x60e0 }, { 3274, 0xd800 }, + /* 0x7200 */ + { 3278, 0x0041 }, { 3280, 0x0801 }, { 3282, 0x3400 }, { 3285, 0x6c65 }, + { 3293, 0x11c1 }, { 3298, 0xab04 }, { 3304, 0x0286 }, { 3308, 0x2204 }, + { 3311, 0x0003 }, { 3313, 0x0000 }, { 3313, 0x9084 }, { 3317, 0x0000 }, + { 3317, 0x4015 }, { 3321, 0x0281 }, { 3324, 0x0202 }, { 3326, 0x3300 }, + /* 0x7300 */ + { 3330, 0x0400 }, { 3331, 0x3840 }, { 3335, 0x0e20 }, { 3339, 0xc0c0 }, + { 3343, 0x0030 }, { 3345, 0x0085 }, { 3348, 0x0500 }, { 3350, 0x0d25 }, + { 3356, 0x4ad0 }, { 3362, 0x81d0 }, { 3367, 0x2280 }, { 3370, 0x020c }, + { 3373, 0xb605 }, { 3380, 0x6240 }, { 3384, 0x2679 }, { 3392, 0x6280 }, + /* 0x7400 */ + { 3396, 0x02ea }, { 3402, 0x0808 }, { 3404, 0xdd67 }, { 3415, 0x8579 }, + { 3423, 0x081b }, { 3428, 0xdea0 }, { 3436, 0x8735 }, { 3444, 0x4000 }, + { 3445, 0x0a8c }, { 3450, 0xd100 }, { 3454, 0x05aa }, { 3460, 0xa225 }, + { 3466, 0x8440 }, { 3469, 0x1510 }, { 3473, 0x404d }, { 3478, 0x0080 }, + /* 0x7500 */ + { 3479, 0x0012 }, { 3481, 0x8d22 }, { 3487, 0x1968 }, { 3493, 0x058f }, + { 3500, 0x9080 }, { 3503, 0x3a1a }, { 3510, 0x8464 }, { 3515, 0x8561 }, + { 3521, 0xccc0 }, { 3527, 0x2002 }, { 3529, 0x0820 }, { 3531, 0x732e }, + { 3540, 0x20a4 }, { 3544, 0x0b34 }, { 3550, 0x0004 }, { 3551, 0x1415 }, + /* 0x7600 */ + { 3556, 0x2001 }, { 3558, 0x8200 }, { 3560, 0x0057 }, { 3565, 0x0800 }, + { 3566, 0x5004 }, { 3569, 0x0044 }, { 3571, 0x1212 }, { 3575, 0x7905 }, + { 3582, 0x40d0 }, { 3586, 0x0009 }, { 3588, 0x4000 }, { 3589, 0x8400 }, + { 3591, 0x054c }, { 3596, 0xd844 }, { 3602, 0x409a }, { 3607, 0x5114 }, + /* 0x7700 */ + { 3612, 0x0b12 }, { 3617, 0x4000 }, { 3618, 0x0201 }, { 3620, 0x1580 }, + { 3624, 0x2001 }, { 3626, 0x0800 }, { 3627, 0x084a }, { 3631, 0xc200 }, + { 3634, 0x0800 }, { 3635, 0x4002 }, { 3637, 0x3020 }, { 3640, 0x9809 }, + { 3645, 0x0000 }, { 3645, 0x1880 }, { 3648, 0xe22c }, { 3655, 0x0008 }, + /* 0x7800 */ + { 3656, 0x0004 }, { 3657, 0x0004 }, { 3658, 0x10e0 }, { 3662, 0x0014 }, + { 3664, 0x8020 }, { 3666, 0x2000 }, { 3667, 0x9800 }, { 3670, 0x1000 }, + { 3671, 0x7082 }, { 3676, 0x0082 }, { 3678, 0x0288 }, { 3681, 0x1c00 }, + { 3684, 0x4c22 }, { 3689, 0x0001 }, { 3690, 0x9100 }, { 3693, 0x0820 }, + /* 0x7900 */ + { 3695, 0x4002 }, { 3697, 0x0040 }, { 3698, 0x1c00 }, { 3701, 0x4400 }, + { 3703, 0x0383 }, { 3708, 0x7cc1 }, { 3716, 0x2121 }, { 3720, 0x8400 }, + { 3722, 0xe002 }, { 3726, 0x0002 }, { 3727, 0x44c0 }, { 3731, 0xe20a }, + { 3737, 0x0e03 }, { 3742, 0x8126 }, { 3747, 0x02d0 }, { 3751, 0x0800 }, + /* 0x7a00 */ + { 3752, 0x2921 }, { 3757, 0x9690 }, { 3763, 0x4001 }, { 3765, 0xb8c2 }, + { 3772, 0x6241 }, { 3777, 0x0080 }, { 3778, 0x0a06 }, { 3782, 0xa651 }, + { 3789, 0x0112 }, { 3792, 0x812c }, { 3797, 0xc600 }, { 3801, 0x0400 }, + { 3802, 0x0cb0 }, { 3807, 0xa280 }, { 3811, 0xa429 }, { 3817, 0x8640 }, + /* 0x7b00 */ + { 3821, 0x8000 }, { 3822, 0x4a02 }, { 3826, 0x3041 }, { 3830, 0x0200 }, + { 3831, 0xba40 }, { 3837, 0x0057 }, { 3842, 0x5001 }, { 3845, 0x2020 }, + { 3847, 0x8880 }, { 3850, 0x24b0 }, { 3855, 0x2002 }, { 3857, 0x0112 }, + { 3860, 0x02d3 }, { 3866, 0x0004 }, { 3867, 0x0211 }, { 3870, 0x0000 }, + /* 0x7c00 */ + { 3870, 0x0080 }, { 3871, 0x4004 }, { 3873, 0x0c82 }, { 3877, 0xe000 }, + { 3880, 0x3008 }, { 3883, 0x0000 }, { 3883, 0x1011 }, { 3886, 0x0008 }, + { 3887, 0x0208 }, { 3889, 0x81a4 }, { 3894, 0x40a0 }, { 3897, 0x420e }, + { 3902, 0x0400 }, { 3903, 0xc040 }, { 3906, 0x0081 }, { 3908, 0x4800 }, + /* 0x7d00 */ + { 3910, 0x2df5 }, { 3920, 0x0f91 }, { 3927, 0xd807 }, { 3934, 0x0629 }, + { 3939, 0x007c }, { 3944, 0x4001 }, { 3946, 0x4546 }, { 3952, 0x824e }, + { 3958, 0xc000 }, { 3960, 0x1008 }, { 3962, 0x3005 }, { 3966, 0xed36 }, + { 3976, 0x0c80 }, { 3979, 0x6540 }, { 3984, 0x930b }, { 3991, 0x0810 }, + /* 0x7e00 */ + { 3993, 0x0600 }, { 3995, 0xe820 }, { 4000, 0xc80a }, { 4005, 0x6082 }, + { 4009, 0x00ca }, { 4013, 0x4034 }, { 4017, 0x2e02 }, { 4022, 0x1201 }, + { 4025, 0x9004 }, { 4028, 0x1948 }, { 4033, 0x0000 }, { 4033, 0x0000 }, + { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, + /* 0x7f00 */ + { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0540 }, + { 4036, 0x1000 }, { 4037, 0x0031 }, { 4040, 0x4c00 }, { 4043, 0x02a5 }, + { 4048, 0x5520 }, { 4053, 0x4410 }, { 4056, 0x0310 }, { 4059, 0x2304 }, + { 4063, 0x5422 }, { 4068, 0x8034 }, { 4072, 0x0a03 }, { 4076, 0x1201 }, + /* 0x8000 */ + { 4079, 0x126b }, { 4086, 0x01a1 }, { 4090, 0x2000 }, { 4091, 0xa048 }, + { 4095, 0x0448 }, { 4098, 0x4540 }, { 4102, 0x8000 }, { 4103, 0xe08d }, + { 4110, 0x1af0 }, { 4117, 0x2840 }, { 4120, 0x8626 }, { 4126, 0x0416 }, + { 4130, 0x5018 }, { 4134, 0x4c00 }, { 4137, 0x0032 }, { 4140, 0x2112 }, + /* 0x8100 */ + { 4144, 0x05e4 }, { 4150, 0x0d00 }, { 4153, 0x8a08 }, { 4157, 0x4200 }, + { 4159, 0x4800 }, { 4161, 0x0033 }, { 4165, 0x0860 }, { 4168, 0x8703 }, + { 4174, 0x8501 }, { 4178, 0x3400 }, { 4181, 0x0109 }, { 4184, 0xe428 }, + { 4190, 0x2045 }, { 4194, 0x8100 }, { 4196, 0x25a8 }, { 4202, 0x5c18 }, + /* 0x8200 */ + { 4208, 0x35a0 }, { 4214, 0xd804 }, { 4219, 0x1c02 }, { 4223, 0x02e0 }, + { 4227, 0x00a1 }, { 4230, 0x0200 }, { 4231, 0xc050 }, { 4235, 0x4146 }, + { 4240, 0x6800 }, { 4243, 0xa604 }, { 4248, 0xf260 }, { 4255, 0xbb8a }, + { 4264, 0x0000 }, { 4264, 0xc8b6 }, { 4272, 0x00e2 }, { 4276, 0x6002 }, + /* 0x8300 */ + { 4279, 0x023e }, { 4285, 0x0080 }, { 4286, 0x8900 }, { 4289, 0x0372 }, + { 4295, 0x8681 }, { 4300, 0x0006 }, { 4302, 0x0000 }, { 4302, 0x0888 }, + { 4305, 0x4600 }, { 4308, 0x4140 }, { 4311, 0x0e04 }, { 4315, 0x2000 }, + { 4316, 0x1622 }, { 4321, 0x1048 }, { 4324, 0x8a00 }, { 4327, 0x2217 }, + /* 0x8400 */ + { 4333, 0x7418 }, { 4339, 0x0000 }, { 4339, 0x1200 }, { 4341, 0x2102 }, + { 4344, 0x0200 }, { 4345, 0x0880 }, { 4347, 0x984a }, { 4353, 0x0420 }, + { 4355, 0x0000 }, { 4355, 0x1211 }, { 4359, 0x0002 }, { 4360, 0x9904 }, + { 4365, 0x2a55 }, { 4372, 0x0402 }, { 4374, 0x5000 }, { 4376, 0x1010 }, + /* 0x8500 */ + { 4378, 0x0000 }, { 4378, 0x459a }, { 4385, 0xb02a }, { 4391, 0xa000 }, + { 4393, 0x420a }, { 4397, 0x0208 }, { 4399, 0x2708 }, { 4404, 0x0000 }, + { 4404, 0x8090 }, { 4407, 0x0812 }, { 4410, 0x8740 }, { 4415, 0x0401 }, + { 4417, 0xe202 }, { 4422, 0x3020 }, { 4425, 0x0630 }, { 4429, 0x8c80 }, + /* 0x8600 */ + { 4433, 0x04c4 }, { 4437, 0x04c0 }, { 4440, 0x2000 }, { 4441, 0x8000 }, + { 4442, 0x4000 }, { 4443, 0xd831 }, { 4450, 0x0080 }, { 4451, 0x0200 }, + { 4452, 0x1400 }, { 4454, 0x0008 }, { 4455, 0x0218 }, { 4458, 0x0000 }, + { 4458, 0x0880 }, { 4460, 0x8a10 }, { 4464, 0x2010 }, { 4466, 0x4000 }, + /* 0x8700 */ + { 4467, 0x010d }, { 4471, 0x1500 }, { 4474, 0x0000 }, { 4474, 0x0000 }, + { 4474, 0x4000 }, { 4475, 0x80a0 }, { 4478, 0x0140 }, { 4480, 0x0150 }, + { 4483, 0x2004 }, { 4485, 0x8000 }, { 4486, 0x0004 }, { 4487, 0x0408 }, + { 4489, 0x0010 }, { 4490, 0x0000 }, { 4490, 0x9001 }, { 4493, 0x4a04 }, + /* 0x8800 */ + { 4497, 0x0020 }, { 4498, 0x8000 }, { 4499, 0x000c }, { 4501, 0x0842 }, + { 4504, 0x3041 }, { 4508, 0x2a8c }, { 4514, 0x090e }, { 4519, 0xc085 }, + { 4524, 0x2906 }, { 4529, 0x40c4 }, { 4533, 0x0800 }, { 4534, 0x0010 }, + { 4535, 0x8006 }, { 4538, 0xb230 }, { 4544, 0x0102 }, { 4546, 0x2138 }, + /* 0x8900 */ + { 4551, 0x0080 }, { 4552, 0x030d }, { 4557, 0x0420 }, { 4559, 0x0940 }, + { 4562, 0x0012 }, { 4564, 0x8000 }, { 4565, 0x0410 }, { 4567, 0x8004 }, + { 4569, 0x88ca }, { 4575, 0x0048 }, { 4577, 0x0602 }, { 4580, 0x2404 }, + { 4583, 0x0001 }, { 4584, 0x0004 }, { 4585, 0x0008 }, { 4586, 0x0110 }, + /* 0x8a00 */ + { 4588, 0x550d }, { 4595, 0xa9c8 }, { 4602, 0x2428 }, { 4606, 0x0c52 }, + { 4611, 0x0000 }, { 4611, 0x4831 }, { 4616, 0x624d }, { 4623, 0x022f }, + { 4629, 0x30a0 }, { 4633, 0x4128 }, { 4637, 0x057b }, { 4645, 0xd205 }, + { 4651, 0xa894 }, { 4657, 0x1844 }, { 4661, 0x6cc2 }, { 4668, 0x45c2 }, + /* 0x8b00 */ + { 4674, 0x4017 }, { 4679, 0x2ed1 }, { 4687, 0x1901 }, { 4691, 0x0208 }, + { 4693, 0xc202 }, { 4697, 0x1500 }, { 4700, 0x9040 }, { 4703, 0x2091 }, + { 4707, 0x0401 }, { 4709, 0x044d }, { 4714, 0x0000 }, { 4714, 0x0000 }, + { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, + /* 0x8c00 */ + { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x8080 }, + { 4716, 0x1542 }, { 4721, 0x0420 }, { 4723, 0x0c02 }, { 4726, 0x0600 }, + { 4728, 0x1404 }, { 4731, 0x6000 }, { 4733, 0x9f87 }, { 4743, 0xb9d9 }, + { 4753, 0x059f }, { 4761, 0x540a }, { 4766, 0x245d }, { 4773, 0x3810 }, + /* 0x8d00 */ + { 4777, 0x25b0 }, { 4783, 0x0048 }, { 4785, 0x0000 }, { 4785, 0x0000 }, + { 4785, 0x0000 }, { 4785, 0x0000 }, { 4785, 0x0850 }, { 4788, 0x0099 }, + { 4792, 0x0420 }, { 4794, 0x0200 }, { 4795, 0x0108 }, { 4797, 0x4408 }, + { 4800, 0x9840 }, { 4804, 0x2800 }, { 4806, 0x810a }, { 4810, 0x0008 }, + /* 0x8e00 */ + { 4811, 0x8400 }, { 4813, 0x4001 }, { 4815, 0x0400 }, { 4816, 0x0021 }, + { 4818, 0x0794 }, { 4824, 0x8200 }, { 4826, 0x0001 }, { 4827, 0x0050 }, + { 4829, 0x2482 }, { 4833, 0x0000 }, { 4833, 0x1c00 }, { 4836, 0x0000 }, + { 4836, 0x3c01 }, { 4841, 0x8004 }, { 4843, 0x0800 }, { 4844, 0x4900 }, + /* 0x8f00 */ + { 4847, 0x0228 }, { 4850, 0xf83c }, { 4859, 0x86c0 }, { 4864, 0xcb08 }, + { 4870, 0x6230 }, { 4875, 0xa000 }, { 4877, 0x0004 }, { 4878, 0x0000 }, + { 4878, 0x0000 }, { 4878, 0x1800 }, { 4880, 0xa148 }, { 4885, 0x0007 }, + { 4888, 0x4024 }, { 4891, 0x0012 }, { 4893, 0x2c40 }, { 4897, 0x2285 }, + /* 0x9000 */ + { 4902, 0xa96f }, { 4912, 0xe6b3 }, { 4922, 0x400f }, { 4927, 0x5126 }, + { 4933, 0x6c86 }, { 4940, 0x723b }, { 4949, 0xe20b }, { 4956, 0xb5a4 }, + { 4964, 0x859f }, { 4973, 0x0222 }, { 4976, 0x854c }, { 4982, 0x0123 }, + { 4986, 0x0402 }, { 4988, 0x4000 }, { 4989, 0x2102 }, { 4992, 0x2020 }, + /* 0x9100 */ + { 4994, 0x0004 }, { 4995, 0x0224 }, { 4998, 0x2080 }, { 5000, 0x0004 }, + { 5001, 0x7e00 }, { 5007, 0x0004 }, { 5008, 0x1604 }, { 5012, 0x01a0 }, + { 5015, 0x2a80 }, { 5019, 0x1004 }, { 5021, 0xd800 }, { 5025, 0x0032 }, + { 5028, 0xfa81 }, { 5036, 0x3183 }, { 5042, 0x0488 }, { 5045, 0x0020 }, + /* 0x9200 */ + { 5046, 0x2000 }, { 5047, 0x4087 }, { 5052, 0x0000 }, { 5052, 0x8410 }, + { 5055, 0x0221 }, { 5058, 0x4880 }, { 5061, 0x0074 }, { 5065, 0x0000 }, + { 5065, 0x0029 }, { 5068, 0x114a }, { 5073, 0x0000 }, { 5073, 0x02c8 }, + { 5077, 0x9000 }, { 5079, 0x0004 }, { 5080, 0x0410 }, { 5082, 0x1100 }, + /* 0x9300 */ + { 5084, 0x0010 }, { 5085, 0xc501 }, { 5090, 0xc957 }, { 5099, 0x0000 }, + { 5099, 0x2d00 }, { 5103, 0x0810 }, { 5105, 0x4000 }, { 5106, 0x5020 }, + { 5109, 0x1000 }, { 5110, 0x0450 }, { 5113, 0x3088 }, { 5117, 0x0001 }, + { 5118, 0x0008 }, { 5119, 0x4002 }, { 5121, 0x0012 }, { 5123, 0x0040 }, + /* 0x9400 */ + { 5124, 0x0010 }, { 5125, 0x0100 }, { 5126, 0x0820 }, { 5128, 0x0120 }, + { 5130, 0x0010 }, { 5131, 0x0806 }, { 5134, 0x0000 }, { 5134, 0xa000 }, + { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, + { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, + /* 0x9500 */ + { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, + { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0080 }, + { 5137, 0x8a09 }, { 5142, 0x011e }, { 5147, 0x2138 }, { 5152, 0x1802 }, + { 5155, 0x0480 }, { 5157, 0x1070 }, { 5161, 0x0006 }, { 5163, 0x0000 }, + /* 0x9600 */ + { 5163, 0x0000 }, { 5163, 0x1000 }, { 5164, 0x4402 }, { 5167, 0x8804 }, + { 5170, 0x3815 }, { 5176, 0xf801 }, { 5182, 0x041c }, { 5186, 0x21e9 }, + { 5193, 0x6c60 }, { 5199, 0x1b30 }, { 5205, 0x0588 }, { 5209, 0x0882 }, + { 5212, 0x7af3 }, { 5223, 0x1a60 }, { 5228, 0x870c }, { 5234, 0x0ac5 }, + /* 0x9700 */ + { 5240, 0x00c1 }, { 5243, 0x524a }, { 5249, 0x0080 }, { 5250, 0x2205 }, + { 5254, 0x0114 }, { 5257, 0x5042 }, { 5261, 0x2206 }, { 5265, 0x0490 }, + { 5268, 0xa800 }, { 5271, 0x0000 }, { 5271, 0x2901 }, { 5275, 0x0000 }, + { 5275, 0x0840 }, { 5277, 0x1008 }, { 5279, 0x0000 }, { 5279, 0x8848 }, + /* 0x9800 */ + { 5283, 0x156f }, { 5292, 0x018f }, { 5298, 0x2000 }, { 5299, 0x0b01 }, + { 5303, 0x7040 }, { 5307, 0x4510 }, { 5311, 0x88a0 }, { 5315, 0x0000 }, + { 5315, 0x0000 }, { 5315, 0x0000 }, { 5315, 0x8100 }, { 5317, 0x0002 }, + { 5318, 0x0090 }, { 5320, 0x9800 }, { 5323, 0xe006 }, { 5328, 0x7010 }, + /* 0x9900 */ + { 5332, 0x1608 }, { 5336, 0x4109 }, { 5340, 0x0101 }, { 5342, 0x0000 }, + { 5342, 0x3a20 }, { 5347, 0x0096 }, { 5351, 0x0000 }, { 5351, 0x0000 }, + { 5351, 0x0000 }, { 5351, 0x2240 }, { 5354, 0x7120 }, { 5359, 0x021a }, + { 5363, 0x0002 }, { 5364, 0xa227 }, { 5371, 0x2000 }, { 5372, 0x8002 }, + /* 0x9a00 */ + { 5374, 0xc102 }, { 5378, 0x0200 }, { 5379, 0x0800 }, { 5380, 0x00c1 }, + { 5383, 0x2029 }, { 5387, 0x8ca0 }, { 5392, 0x0624 }, { 5396, 0x0000 }, + { 5396, 0x0000 }, { 5396, 0x0000 }, { 5396, 0x0100 }, { 5397, 0x0100 }, + { 5398, 0x0000 }, { 5398, 0x0118 }, { 5401, 0x4020 }, { 5403, 0x0000 }, + /* 0x9b00 */ + { 5403, 0x0000 }, { 5403, 0x0400 }, { 5404, 0x0480 }, { 5406, 0x1002 }, + { 5408, 0x803e }, { 5414, 0x0410 }, { 5416, 0x8000 }, { 5417, 0x0000 }, + { 5417, 0x4000 }, { 5418, 0x8002 }, { 5420, 0x4800 }, { 5422, 0x0000 }, + { 5422, 0x0200 }, { 5423, 0x0040 }, { 5424, 0x0110 }, { 5426, 0x0000 }, + /* 0x9c00 */ + { 5426, 0x2000 }, { 5427, 0x0025 }, { 5430, 0x0020 }, { 5431, 0x0804 }, + { 5433, 0x0280 }, { 5435, 0x0080 }, { 5436, 0x0000 }, { 5436, 0x0000 }, + { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, + { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x02a0 }, { 5439, 0x0058 }, + /* 0x9d00 */ + { 5442, 0x0200 }, { 5443, 0x0800 }, { 5444, 0x0140 }, { 5446, 0x0800 }, + { 5447, 0x0000 }, { 5447, 0x2002 }, { 5449, 0x1003 }, { 5452, 0x0004 }, + { 5453, 0x0000 }, { 5453, 0x0000 }, { 5453, 0x8200 }, { 5455, 0x0010 }, + { 5456, 0x0010 }, { 5457, 0x0080 }, { 5458, 0x0000 }, { 5458, 0x0704 }, + /* 0x9e00 */ + { 5462, 0x0000 }, { 5462, 0x4400 }, { 5464, 0x0000 }, { 5464, 0x0000 }, + { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0xa220 }, + { 5468, 0x0000 }, { 5468, 0xa08c }, { 5473, 0x0020 }, { 5474, 0x4830 }, + { 5478, 0x6008 }, { 5481, 0x5912 }, { 5487, 0x0100 }, { 5488, 0x0010 }, + /* 0x9f00 */ + { 5489, 0x4180 }, { 5492, 0x0008 }, { 5493, 0x0001 }, { 5494, 0x0800 }, + { 5495, 0x4c00 }, { 5498, 0x8004 }, { 5500, 0x1482 }, { 5504, 0x0080 }, + { 5505, 0x2000 }, { 5506, 0x1021 }, +}; +static const Summary16 ksc5601_uni2indx_pageac[698] = { + /* 0xac00 */ + { 5509, 0x0793 }, { 5516, 0x3eff }, { 5529, 0xb011 }, { 5534, 0x1303 }, + { 5539, 0x2801 }, { 5542, 0x1110 }, { 5545, 0x0000 }, { 5545, 0x0593 }, + { 5551, 0x1e7b }, { 5561, 0xb011 }, { 5566, 0x9703 }, { 5573, 0x3b01 }, + { 5579, 0x1112 }, { 5583, 0x00a0 }, { 5585, 0x9593 }, { 5593, 0x306b }, + /* 0xad00 */ + { 5600, 0xb051 }, { 5606, 0x1102 }, { 5609, 0x3201 }, { 5613, 0x1130 }, + { 5617, 0x02b0 }, { 5621, 0x0111 }, { 5624, 0x300a }, { 5628, 0xb879 }, + { 5637, 0x1306 }, { 5642, 0x3001 }, { 5645, 0x0010 }, { 5646, 0x0080 }, + { 5647, 0x0113 }, { 5651, 0x100b }, { 5655, 0x0011 }, { 5657, 0x9300 }, + /* 0xae00 */ + { 5661, 0x2b03 }, { 5667, 0x0010 }, { 5668, 0x0000 }, { 5668, 0x0593 }, + { 5674, 0x746b }, { 5683, 0xb051 }, { 5689, 0x1323 }, { 5695, 0x3b01 }, + { 5701, 0x1030 }, { 5704, 0x0000 }, { 5704, 0x0000 }, { 5704, 0x7000 }, + { 5707, 0xb011 }, { 5712, 0x1303 }, { 5717, 0x2900 }, { 5720, 0x1110 }, + /* 0xaf00 */ + { 5723, 0x2180 }, { 5726, 0x0001 }, { 5727, 0x3000 }, { 5729, 0xb015 }, + { 5735, 0x030e }, { 5740, 0x3001 }, { 5743, 0x0030 }, { 5745, 0x0200 }, + { 5746, 0x0111 }, { 5749, 0x1023 }, { 5753, 0x0000 }, { 5753, 0x1300 }, + { 5756, 0x6b81 }, { 5763, 0x1010 }, { 5765, 0x0300 }, { 5767, 0x0113 }, + /* 0xb000 */ + { 5771, 0x1013 }, { 5775, 0x3011 }, { 5779, 0x0100 }, { 5780, 0x0000 }, + { 5780, 0x5530 }, { 5786, 0x22b8 }, { 5792, 0x0000 }, { 5792, 0x3000 }, + { 5794, 0xb011 }, { 5799, 0x9702 }, { 5805, 0xfb07 }, { 5815, 0x113a }, + { 5821, 0x03b0 }, { 5826, 0x0113 }, { 5830, 0x0021 }, { 5832, 0x0000 }, + /* 0xb100 */ + { 5832, 0x1b00 }, { 5836, 0x3b0d }, { 5844, 0x1138 }, { 5849, 0x03b0 }, + { 5854, 0x0113 }, { 5858, 0x1133 }, { 5864, 0x0001 }, { 5865, 0x1300 }, + { 5868, 0x2b05 }, { 5874, 0x111c }, { 5879, 0x0100 }, { 5880, 0x0000 }, + { 5880, 0x1000 }, { 5881, 0xb011 }, { 5886, 0x1300 }, { 5889, 0x2a01 }, + /* 0xb200 */ + { 5893, 0x1930 }, { 5898, 0x02b0 }, { 5902, 0x0001 }, { 5903, 0x1010 }, + { 5905, 0x0000 }, { 5905, 0x1100 }, { 5907, 0x0301 }, { 5910, 0x1030 }, + { 5913, 0x0230 }, { 5916, 0x0713 }, { 5922, 0x146b }, { 5929, 0x0011 }, + { 5931, 0x1300 }, { 5934, 0x2b05 }, { 5940, 0xf974 }, { 5950, 0x8fb8 }, + /* 0xb300 */ + { 5959, 0x0113 }, { 5963, 0x103b }, { 5969, 0x0000 }, { 5969, 0x0000 }, + { 5969, 0x0000 }, { 5969, 0xd970 }, { 5977, 0x4ab0 }, { 5983, 0x0113 }, + { 5987, 0x103b }, { 5993, 0x0011 }, { 5995, 0x1103 }, { 5999, 0x0000 }, + { 5999, 0x5930 }, { 6005, 0x2ab1 }, { 6012, 0x0111 }, { 6015, 0x1000 }, + /* 0xb400 */ + { 6016, 0x0000 }, { 6016, 0x1101 }, { 6019, 0x0b01 }, { 6023, 0x0010 }, + { 6024, 0x0000 }, { 6024, 0x0113 }, { 6028, 0x102b }, { 6033, 0x0000 }, + { 6033, 0x0101 }, { 6035, 0x2000 }, { 6036, 0x1110 }, { 6039, 0x02a0 }, + { 6042, 0x0111 }, { 6045, 0x3021 }, { 6049, 0xb059 }, { 6056, 0x0102 }, + /* 0xb500 */ + { 6058, 0x0000 }, { 6058, 0x1930 }, { 6063, 0x07b0 }, { 6069, 0x0113 }, + { 6073, 0x383b }, { 6081, 0xb011 }, { 6086, 0x0003 }, { 6088, 0x0000 }, + { 6088, 0x0000 }, { 6088, 0x0000 }, { 6088, 0x0d13 }, { 6094, 0x383b }, + { 6102, 0xb011 }, { 6107, 0x0103 }, { 6110, 0x1000 }, { 6111, 0x0000 }, + /* 0xb600 */ + { 6111, 0x0000 }, { 6111, 0x0113 }, { 6115, 0x1020 }, { 6117, 0x0010 }, + { 6118, 0x0100 }, { 6119, 0x0000 }, { 6119, 0x0110 }, { 6121, 0x0000 }, + { 6121, 0x0000 }, { 6121, 0x3000 }, { 6123, 0x1811 }, { 6127, 0x0002 }, + { 6128, 0x0000 }, { 6128, 0x0010 }, { 6129, 0x0000 }, { 6129, 0x0111 }, + /* 0xb700 */ + { 6132, 0x0023 }, { 6135, 0x0000 }, { 6135, 0x9300 }, { 6139, 0x0b01 }, + { 6143, 0x1110 }, { 6146, 0x0030 }, { 6148, 0x0111 }, { 6151, 0x302b }, + { 6157, 0xb011 }, { 6162, 0x13c7 }, { 6170, 0x3b01 }, { 6176, 0x0130 }, + { 6179, 0x0280 }, { 6181, 0x0000 }, { 6181, 0x3000 }, { 6183, 0xb011 }, + /* 0xb800 */ + { 6188, 0x1383 }, { 6194, 0x2b01 }, { 6199, 0x1130 }, { 6203, 0x03b0 }, + { 6208, 0x0011 }, { 6210, 0x300a }, { 6214, 0xb011 }, { 6219, 0x1102 }, + { 6222, 0x2000 }, { 6223, 0x0000 }, { 6223, 0x0100 }, { 6224, 0x0111 }, + { 6227, 0x102b }, { 6232, 0xa011 }, { 6236, 0x1302 }, { 6240, 0x2b01 }, + /* 0xb900 */ + { 6245, 0x0010 }, { 6246, 0x0100 }, { 6247, 0x0001 }, { 6248, 0x3000 }, + { 6250, 0x9011 }, { 6254, 0x1302 }, { 6258, 0x2b01 }, { 6263, 0x1130 }, + { 6267, 0x66b0 }, { 6274, 0x0000 }, { 6274, 0x3000 }, { 6276, 0xb011 }, + { 6281, 0xd302 }, { 6287, 0x6b07 }, { 6295, 0x113a }, { 6301, 0x07b0 }, + /* 0xba00 */ + { 6307, 0x0103 }, { 6310, 0x0020 }, { 6311, 0x0000 }, { 6311, 0x1300 }, + { 6314, 0x6b05 }, { 6321, 0x1138 }, { 6326, 0x03b0 }, { 6331, 0x0113 }, + { 6335, 0x10b8 }, { 6340, 0x0000 }, { 6340, 0x1b00 }, { 6344, 0x2b05 }, + { 6350, 0x0110 }, { 6352, 0x0300 }, { 6354, 0x0000 }, { 6354, 0x1000 }, + /* 0xbb00 */ + { 6355, 0xa011 }, { 6359, 0x1102 }, { 6362, 0x0a01 }, { 6365, 0x7970 }, + { 6373, 0xa2b0 }, { 6379, 0x0111 }, { 6382, 0x100a }, { 6385, 0x0000 }, + { 6385, 0x1100 }, { 6387, 0x0001 }, { 6388, 0x1110 }, { 6391, 0x0090 }, + { 6393, 0x0111 }, { 6396, 0x0009 }, { 6398, 0x0000 }, { 6398, 0x9300 }, + /* 0xbc00 */ + { 6402, 0xbb05 }, { 6410, 0xf9f2 }, { 6421, 0x22b0 }, { 6426, 0x0113 }, + { 6430, 0x323b }, { 6438, 0x2001 }, { 6440, 0x0000 }, { 6440, 0x0000 }, + { 6440, 0x5930 }, { 6446, 0x06b0 }, { 6451, 0x0193 }, { 6456, 0x303b }, + { 6463, 0xa011 }, { 6467, 0x1123 }, { 6472, 0x0000 }, { 6472, 0x1170 }, + /* 0xbd00 */ + { 6477, 0x02b0 }, { 6481, 0x0011 }, { 6483, 0x1010 }, { 6485, 0x0000 }, + { 6485, 0x1301 }, { 6489, 0x0301 }, { 6492, 0x0110 }, { 6494, 0x0000 }, + { 6494, 0x0793 }, { 6501, 0x162b }, { 6508, 0x0010 }, { 6509, 0x0101 }, + { 6511, 0x0000 }, { 6511, 0x1130 }, { 6515, 0x0200 }, { 6516, 0x0111 }, + /* 0xbe00 */ + { 6519, 0x3029 }, { 6524, 0xb011 }, { 6529, 0x0000 }, { 6529, 0x0000 }, + { 6529, 0x5130 }, { 6534, 0x0eb0 }, { 6540, 0x0513 }, { 6545, 0x383b }, + { 6553, 0xb011 }, { 6558, 0x0303 }, { 6562, 0x0100 }, { 6563, 0x0000 }, + { 6563, 0x0000 }, { 6563, 0x0193 }, { 6568, 0x1039 }, { 6573, 0x0000 }, + /* 0xbf00 */ + { 6573, 0x0302 }, { 6576, 0x3b00 }, { 6581, 0x0000 }, { 6581, 0x0000 }, + { 6581, 0x0113 }, { 6585, 0x0023 }, { 6588, 0x0000 }, { 6588, 0x0000 }, + { 6588, 0x0000 }, { 6588, 0x0010 }, { 6589, 0x0000 }, { 6589, 0x0001 }, + { 6590, 0x3020 }, { 6593, 0x9011 }, { 6597, 0x0002 }, { 6598, 0x0000 }, + /* 0xc000 */ + { 6598, 0x0000 }, { 6598, 0x0000 }, { 6598, 0x0000 }, { 6598, 0x1000 }, + { 6599, 0x0000 }, { 6599, 0x1102 }, { 6602, 0x0301 }, { 6605, 0x0000 }, + { 6605, 0x0000 }, { 6605, 0x0113 }, { 6609, 0xb02b }, { 6616, 0xb079 }, + { 6624, 0x1323 }, { 6630, 0x3b01 }, { 6636, 0x1130 }, { 6640, 0x02b0 }, + /* 0xc100 */ + { 6644, 0x0111 }, { 6647, 0xf021 }, { 6653, 0xb0d9 }, { 6661, 0x1343 }, + { 6667, 0x3b01 }, { 6673, 0x1130 }, { 6677, 0x03b0 }, { 6682, 0x0111 }, + { 6685, 0x7020 }, { 6689, 0xb051 }, { 6695, 0x1322 }, { 6700, 0x2001 }, + { 6702, 0x1110 }, { 6705, 0x0190 }, { 6708, 0x0111 }, { 6711, 0x300b }, + /* 0xc200 */ + { 6716, 0xb011 }, { 6721, 0x9302 }, { 6726, 0xab01 }, { 6732, 0x0016 }, + { 6735, 0x0100 }, { 6736, 0x0113 }, { 6740, 0x3021 }, { 6744, 0xb011 }, + { 6749, 0x0302 }, { 6752, 0x2901 }, { 6756, 0x3130 }, { 6761, 0x02b0 }, + { 6765, 0x0000 }, { 6765, 0x3000 }, { 6767, 0xb819 }, { 6774, 0x1b42 }, + /* 0xc300 */ + { 6780, 0x3301 }, { 6785, 0x1138 }, { 6790, 0x0330 }, { 6794, 0x0000 }, + { 6794, 0x0020 }, { 6795, 0x0000 }, { 6795, 0x1300 }, { 6798, 0x3305 }, + { 6804, 0x1110 }, { 6807, 0x0000 }, { 6807, 0x0000 }, { 6807, 0x0000 }, + { 6807, 0x0001 }, { 6808, 0x9300 }, { 6812, 0x2305 }, { 6817, 0x0130 }, + /* 0xc400 */ + { 6820, 0x0100 }, { 6821, 0x0001 }, { 6822, 0x1010 }, { 6824, 0x3011 }, + { 6828, 0x0100 }, { 6829, 0x0000 }, { 6829, 0x1130 }, { 6833, 0x0230 }, + { 6836, 0x0001 }, { 6837, 0x1010 }, { 6839, 0x0000 }, { 6839, 0x1100 }, + { 6841, 0x0000 }, { 6841, 0x0000 }, { 6841, 0x0200 }, { 6842, 0x8513 }, + /* 0xc500 */ + { 6848, 0x1003 }, { 6851, 0x1011 }, { 6854, 0x1300 }, { 6857, 0x2b01 }, + { 6862, 0x7730 }, { 6870, 0x63b8 }, { 6878, 0x0113 }, { 6882, 0x303b }, + { 6889, 0xb091 }, { 6895, 0x11a2 }, { 6900, 0x0201 }, { 6902, 0x7b30 }, + { 6910, 0x57f0 }, { 6919, 0x0113 }, { 6923, 0x702b }, { 6930, 0xf0d1 }, + /* 0xc600 */ + { 6938, 0x11e3 }, { 6945, 0x1b01 }, { 6950, 0x7130 }, { 6956, 0x0ab9 }, + { 6963, 0x0113 }, { 6967, 0x303b }, { 6974, 0x9001 }, { 6977, 0x1302 }, + { 6981, 0x2b01 }, { 6986, 0x1130 }, { 6990, 0x02b0 }, { 6994, 0x0713 }, + { 7000, 0x302b }, { 7006, 0x3011 }, { 7010, 0x1303 }, { 7015, 0x2301 }, + /* 0xc700 */ + { 7019, 0x1130 }, { 7023, 0x02b0 }, { 7027, 0x0113 }, { 7031, 0x30ab }, + { 7038, 0xb411 }, { 7044, 0x11fe }, { 7053, 0x0901 }, { 7056, 0x7130 }, + { 7062, 0x47b8 }, { 7070, 0x05d3 }, { 7077, 0x307b }, { 7085, 0xb011 }, + { 7090, 0x5303 }, { 7096, 0x2101 }, { 7099, 0x1110 }, { 7102, 0x0000 }, + /* 0xc800 */ + { 7102, 0x0513 }, { 7107, 0x306b }, { 7114, 0xb011 }, { 7119, 0x1102 }, + { 7122, 0x3301 }, { 7127, 0x0010 }, { 7128, 0x0000 }, { 7128, 0x0513 }, + { 7133, 0x38eb }, { 7142, 0xa010 }, { 7145, 0x0102 }, { 7147, 0x3000 }, + { 7149, 0x1110 }, { 7152, 0x02b0 }, { 7156, 0x0013 }, { 7159, 0x3020 }, + /* 0xc900 */ + { 7162, 0xb071 }, { 7169, 0x0102 }, { 7171, 0x1000 }, { 7172, 0x0010 }, + { 7173, 0x0000 }, { 7173, 0x0113 }, { 7177, 0x100b }, { 7181, 0x1011 }, + { 7184, 0x1300 }, { 7187, 0x2b01 }, { 7192, 0x0000 }, { 7192, 0x0000 }, + { 7192, 0x0593 }, { 7198, 0x366b }, { 7207, 0xb095 }, { 7214, 0x1303 }, + /* 0xca00 */ + { 7219, 0x3b01 }, { 7225, 0x0110 }, { 7227, 0x0200 }, { 7228, 0x0000 }, + { 7228, 0x3000 }, { 7230, 0xb011 }, { 7235, 0x0103 }, { 7238, 0x2000 }, + { 7239, 0x0010 }, { 7240, 0x0100 }, { 7241, 0x0000 }, { 7241, 0x3000 }, + { 7243, 0xb011 }, { 7248, 0x030a }, { 7252, 0x1001 }, { 7254, 0x0010 }, + /* 0xcb00 */ + { 7255, 0x0100 }, { 7256, 0x0111 }, { 7259, 0x0003 }, { 7261, 0x0000 }, + { 7261, 0x1302 }, { 7265, 0x2301 }, { 7269, 0x0010 }, { 7270, 0x0300 }, + { 7272, 0x0000 }, { 7272, 0x1000 }, { 7273, 0x0000 }, { 7273, 0x0100 }, + { 7274, 0x0000 }, { 7274, 0x0010 }, { 7275, 0x0290 }, { 7278, 0x0000 }, + /* 0xcc00 */ + { 7278, 0x3000 }, { 7280, 0x3011 }, { 7284, 0x5386 }, { 7291, 0x7b01 }, + { 7298, 0x1130 }, { 7302, 0x03b0 }, { 7307, 0x0151 }, { 7311, 0x0021 }, + { 7313, 0x0000 }, { 7313, 0x1300 }, { 7316, 0x3b01 }, { 7322, 0x1130 }, + { 7326, 0x02b0 }, { 7330, 0x0011 }, { 7332, 0x1010 }, { 7334, 0x0001 }, + /* 0xcd00 */ + { 7335, 0x1302 }, { 7339, 0x2b01 }, { 7344, 0x1110 }, { 7347, 0x0200 }, + { 7348, 0x0000 }, { 7348, 0x1000 }, { 7349, 0xb011 }, { 7354, 0x0102 }, + { 7356, 0x0100 }, { 7357, 0x1130 }, { 7361, 0x02b0 }, { 7365, 0x0001 }, + { 7366, 0x1010 }, { 7368, 0x0001 }, { 7369, 0x1100 }, { 7371, 0x2b01 }, + /* 0xce00 */ + { 7376, 0x1110 }, { 7379, 0x0210 }, { 7381, 0x0113 }, { 7385, 0x002b }, + { 7389, 0x0000 }, { 7389, 0x9300 }, { 7393, 0x2b03 }, { 7399, 0x1130 }, + { 7403, 0x02b0 }, { 7407, 0x0113 }, { 7411, 0x303b }, { 7418, 0x0000 }, + { 7418, 0x0002 }, { 7419, 0x0000 }, { 7419, 0x1930 }, { 7424, 0x03b0 }, + /* 0xcf00 */ + { 7429, 0x0113 }, { 7433, 0x102b }, { 7438, 0xb011 }, { 7443, 0x0103 }, + { 7446, 0x0000 }, { 7446, 0x1130 }, { 7450, 0x02b0 }, { 7454, 0x0113 }, + { 7458, 0x1021 }, { 7461, 0x0000 }, { 7461, 0x0102 }, { 7463, 0x0001 }, + { 7464, 0x0010 }, { 7465, 0x0000 }, { 7465, 0x0113 }, { 7469, 0x102b }, + /* 0xd000 */ + { 7474, 0x0011 }, { 7476, 0x0102 }, { 7478, 0x2000 }, { 7479, 0x1130 }, + { 7483, 0x02b0 }, { 7487, 0x0111 }, { 7490, 0x3001 }, { 7493, 0x3011 }, + { 7497, 0x0002 }, { 7498, 0x0000 }, { 7498, 0x1130 }, { 7502, 0x02b0 }, + { 7506, 0x0313 }, { 7511, 0x303b }, { 7518, 0xb011 }, { 7523, 0x0103 }, + /* 0xd100 */ + { 7526, 0x2000 }, { 7527, 0x0000 }, { 7527, 0x0000 }, { 7527, 0x0513 }, + { 7532, 0x303b }, { 7539, 0xb011 }, { 7544, 0x1102 }, { 7547, 0x1000 }, + { 7548, 0x0110 }, { 7550, 0x0000 }, { 7550, 0x0113 }, { 7554, 0x142b }, + { 7560, 0x0001 }, { 7561, 0x0100 }, { 7562, 0x0000 }, { 7562, 0x0110 }, + /* 0xd200 */ + { 7564, 0x0280 }, { 7566, 0x0001 }, { 7567, 0x3000 }, { 7569, 0xb011 }, + { 7574, 0x0102 }, { 7576, 0x1000 }, { 7577, 0x0010 }, { 7578, 0x0000 }, + { 7578, 0x0113 }, { 7582, 0x1023 }, { 7586, 0x1011 }, { 7589, 0x9302 }, + { 7594, 0x0b05 }, { 7599, 0x1110 }, { 7602, 0x0030 }, { 7604, 0x0113 }, + /* 0xd300 */ + { 7608, 0x702b }, { 7615, 0xb051 }, { 7621, 0x1323 }, { 7627, 0x3b01 }, + { 7633, 0x0030 }, { 7635, 0x0000 }, { 7635, 0x0000 }, { 7635, 0x3000 }, + { 7637, 0xb011 }, { 7642, 0x1303 }, { 7647, 0x2b01 }, { 7652, 0x1110 }, + { 7655, 0x0330 }, { 7659, 0x0101 }, { 7661, 0x300a }, { 7665, 0xb011 }, + /* 0xd400 */ + { 7670, 0x0102 }, { 7672, 0x2000 }, { 7673, 0x0000 }, { 7673, 0x0000 }, + { 7673, 0x0011 }, { 7675, 0x1000 }, { 7676, 0xa011 }, { 7680, 0x9300 }, + { 7684, 0x2b05 }, { 7690, 0x0010 }, { 7691, 0x0200 }, { 7692, 0x0000 }, + { 7692, 0x1000 }, { 7693, 0x9011 }, { 7697, 0x1100 }, { 7699, 0x2901 }, + /* 0xd500 */ + { 7703, 0x1110 }, { 7706, 0x00b0 }, { 7709, 0x0000 }, { 7709, 0x3000 }, + { 7711, 0xb011 }, { 7716, 0x1302 }, { 7720, 0x2b21 }, { 7726, 0x1130 }, + { 7730, 0x03b0 }, { 7735, 0x0001 }, { 7736, 0x0020 }, { 7737, 0x0000 }, + { 7737, 0x1300 }, { 7740, 0x2b05 }, { 7746, 0x1130 }, { 7750, 0x02b0 }, + /* 0xd600 */ + { 7754, 0x0113 }, { 7758, 0x103b }, { 7764, 0x2011 }, { 7767, 0x1300 }, + { 7770, 0x2b21 }, { 7776, 0x1132 }, { 7781, 0x0280 }, { 7783, 0x0013 }, + { 7786, 0x3028 }, { 7790, 0xa011 }, { 7794, 0x1102 }, { 7797, 0x0a01 }, + { 7800, 0x1130 }, { 7804, 0x0292 }, { 7808, 0x0111 }, { 7811, 0x3021 }, + /* 0xd700 */ + { 7815, 0x0011 }, { 7817, 0x1302 }, { 7821, 0x2b01 }, { 7826, 0x1130 }, + { 7830, 0x0290 }, { 7833, 0x03d3 }, { 7840, 0x122b }, { 7846, 0x3011 }, + { 7850, 0x1302 }, { 7854, 0x2b01 }, +}; +static const Summary16 ksc5601_uni2indx_pagef9[17] = { + /* 0xf900 */ + { 7859, 0xffff }, { 7875, 0xffff }, { 7891, 0xffff }, { 7907, 0xffff }, + { 7923, 0xffff }, { 7939, 0xffff }, { 7955, 0xffff }, { 7971, 0xffff }, + { 7987, 0xffff }, { 8003, 0xffff }, { 8019, 0xffff }, { 8035, 0xffff }, + { 8051, 0xffff }, { 8067, 0xffff }, { 8083, 0xffff }, { 8099, 0xffff }, + /* 0xfa00 */ + { 8115, 0x0fff }, +}; +static const Summary16 ksc5601_uni2indx_pageff[15] = { + /* 0xff00 */ + { 8127, 0xfffe }, { 8142, 0xffff }, { 8158, 0xffff }, { 8174, 0xffff }, + { 8190, 0xffff }, { 8206, 0x7fff }, { 8221, 0x0000 }, { 8221, 0x0000 }, + { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, + { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x006f }, +}; + +static int +ksc5601_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + const Summary16 *summary = NULL; + if (wc >= 0x0000 && wc < 0x0460) + summary = &ksc5601_uni2indx_page00[(wc>>4)]; + else if (wc >= 0x2000 && wc < 0x2670) + summary = &ksc5601_uni2indx_page20[(wc>>4)-0x200]; + else if (wc >= 0x3000 && wc < 0x33e0) + summary = &ksc5601_uni2indx_page30[(wc>>4)-0x300]; + else if (wc >= 0x4e00 && wc < 0x9fa0) + summary = &ksc5601_uni2indx_page4e[(wc>>4)-0x4e0]; + else if (wc >= 0xac00 && wc < 0xd7a0) + summary = &ksc5601_uni2indx_pageac[(wc>>4)-0xac0]; + else if (wc >= 0xf900 && wc < 0xfa10) + summary = &ksc5601_uni2indx_pagef9[(wc>>4)-0xf90]; + else if (wc >= 0xff00 && wc < 0xfff0) + summary = &ksc5601_uni2indx_pageff[(wc>>4)-0xff0]; + if (summary) { + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + c = ksc5601_2charset[summary->indx + used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/loop_unicode.h b/Externals/libiconv-1.14/lib/loop_unicode.h new file mode 100644 index 0000000000..1c787b5f7d --- /dev/null +++ b/Externals/libiconv-1.14/lib/loop_unicode.h @@ -0,0 +1,527 @@ +/* + * Copyright (C) 1999-2003, 2005-2006, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This file defines the conversion loop via Unicode as a pivot encoding. */ + +/* Attempt to transliterate wc. Return code as in xxx_wctomb. */ +static int unicode_transliterate (conv_t cd, ucs4_t wc, + unsigned char* outptr, size_t outleft) +{ + if (cd->oflags & HAVE_HANGUL_JAMO) { + /* Decompose Hangul into Jamo. Use double-width Jamo (contained + in all Korean encodings and ISO-2022-JP-2), not half-width Jamo + (contained in Unicode only). */ + ucs4_t buf[3]; + int ret = johab_hangul_decompose(cd,buf,wc); + if (ret != RET_ILUNI) { + /* we know 1 <= ret <= 3 */ + state_t backup_state = cd->ostate; + unsigned char* backup_outptr = outptr; + size_t backup_outleft = outleft; + int i, sub_outcount; + for (i = 0; i < ret; i++) { + if (outleft == 0) { + sub_outcount = RET_TOOSMALL; + goto johab_hangul_failed; + } + sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,buf[i],outleft); + if (sub_outcount <= RET_ILUNI) + goto johab_hangul_failed; + if (!(sub_outcount <= outleft)) abort(); + outptr += sub_outcount; outleft -= sub_outcount; + } + return outptr-backup_outptr; + johab_hangul_failed: + cd->ostate = backup_state; + outptr = backup_outptr; + outleft = backup_outleft; + if (sub_outcount != RET_ILUNI) + return RET_TOOSMALL; + } + } + { + /* Try to use a variant, but postfix it with + U+303E IDEOGRAPHIC VARIATION INDICATOR + (cf. Ken Lunde's "CJKV information processing", p. 188). */ + int indx = -1; + if (wc == 0x3006) + indx = 0; + else if (wc == 0x30f6) + indx = 1; + else if (wc >= 0x4e00 && wc < 0xa000) + indx = cjk_variants_indx[wc-0x4e00]; + if (indx >= 0) { + for (;; indx++) { + ucs4_t buf[2]; + unsigned short variant = cjk_variants[indx]; + unsigned short last = variant & 0x8000; + variant &= 0x7fff; + variant += 0x3000; + buf[0] = variant; buf[1] = 0x303e; + { + state_t backup_state = cd->ostate; + unsigned char* backup_outptr = outptr; + size_t backup_outleft = outleft; + int i, sub_outcount; + for (i = 0; i < 2; i++) { + if (outleft == 0) { + sub_outcount = RET_TOOSMALL; + goto variant_failed; + } + sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,buf[i],outleft); + if (sub_outcount <= RET_ILUNI) + goto variant_failed; + if (!(sub_outcount <= outleft)) abort(); + outptr += sub_outcount; outleft -= sub_outcount; + } + return outptr-backup_outptr; + variant_failed: + cd->ostate = backup_state; + outptr = backup_outptr; + outleft = backup_outleft; + if (sub_outcount != RET_ILUNI) + return RET_TOOSMALL; + } + if (last) + break; + } + } + } + if (wc >= 0x2018 && wc <= 0x201a) { + /* Special case for quotation marks 0x2018, 0x2019, 0x201a */ + ucs4_t substitute = + (cd->oflags & HAVE_QUOTATION_MARKS + ? (wc == 0x201a ? 0x2018 : wc) + : (cd->oflags & HAVE_ACCENTS + ? (wc==0x2019 ? 0x00b4 : 0x0060) /* use accents */ + : 0x0027 /* use apostrophe */ + ) ); + int outcount = cd->ofuncs.xxx_wctomb(cd,outptr,substitute,outleft); + if (outcount != RET_ILUNI) + return outcount; + } + { + /* Use the transliteration table. */ + int indx = translit_index(wc); + if (indx >= 0) { + const unsigned int * cp = &translit_data[indx]; + unsigned int num = *cp++; + state_t backup_state = cd->ostate; + unsigned char* backup_outptr = outptr; + size_t backup_outleft = outleft; + unsigned int i; + int sub_outcount; + for (i = 0; i < num; i++) { + if (outleft == 0) { + sub_outcount = RET_TOOSMALL; + goto translit_failed; + } + sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,cp[i],outleft); + if (sub_outcount == RET_ILUNI) + /* Recursive transliteration. */ + sub_outcount = unicode_transliterate(cd,cp[i],outptr,outleft); + if (sub_outcount <= RET_ILUNI) + goto translit_failed; + if (!(sub_outcount <= outleft)) abort(); + outptr += sub_outcount; outleft -= sub_outcount; + } + return outptr-backup_outptr; + translit_failed: + cd->ostate = backup_state; + outptr = backup_outptr; + outleft = backup_outleft; + if (sub_outcount != RET_ILUNI) + return RET_TOOSMALL; + } + } + return RET_ILUNI; +} + +#ifndef LIBICONV_PLUG + +struct uc_to_mb_fallback_locals { + unsigned char* l_outbuf; + size_t l_outbytesleft; + int l_errno; +}; + +static void uc_to_mb_write_replacement (const char *buf, size_t buflen, + void* callback_arg) +{ + struct uc_to_mb_fallback_locals * plocals = + (struct uc_to_mb_fallback_locals *) callback_arg; + /* Do nothing if already encountered an error in a previous call. */ + if (plocals->l_errno == 0) { + /* Attempt to copy the passed buffer to the output buffer. */ + if (plocals->l_outbytesleft < buflen) + plocals->l_errno = E2BIG; + else { + memcpy(plocals->l_outbuf, buf, buflen); + plocals->l_outbuf += buflen; + plocals->l_outbytesleft -= buflen; + } + } +} + +struct mb_to_uc_fallback_locals { + conv_t l_cd; + unsigned char* l_outbuf; + size_t l_outbytesleft; + int l_errno; +}; + +static void mb_to_uc_write_replacement (const unsigned int *buf, size_t buflen, + void* callback_arg) +{ + struct mb_to_uc_fallback_locals * plocals = + (struct mb_to_uc_fallback_locals *) callback_arg; + /* Do nothing if already encountered an error in a previous call. */ + if (plocals->l_errno == 0) { + /* Attempt to convert the passed buffer to the target encoding. */ + conv_t cd = plocals->l_cd; + unsigned char* outptr = plocals->l_outbuf; + size_t outleft = plocals->l_outbytesleft; + for (; buflen > 0; buf++, buflen--) { + ucs4_t wc = *buf; + int outcount; + if (outleft == 0) { + plocals->l_errno = E2BIG; + break; + } + outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + /* Handle Unicode tag characters (range U+E0000..U+E007F). */ + if ((wc >> 7) == (0xe0000 >> 7)) + goto outcount_zero; + /* Try transliteration. */ + if (cd->transliterate) { + outcount = unicode_transliterate(cd,wc,outptr,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + } + if (cd->discard_ilseq) { + outcount = 0; + goto outcount_ok; + } + #ifndef LIBICONV_PLUG + else if (cd->fallbacks.uc_to_mb_fallback != NULL) { + struct uc_to_mb_fallback_locals locals; + locals.l_outbuf = outptr; + locals.l_outbytesleft = outleft; + locals.l_errno = 0; + cd->fallbacks.uc_to_mb_fallback(wc, + uc_to_mb_write_replacement, + &locals, + cd->fallbacks.data); + if (locals.l_errno != 0) { + plocals->l_errno = locals.l_errno; + break; + } + outptr = locals.l_outbuf; + outleft = locals.l_outbytesleft; + outcount = 0; + goto outcount_ok; + } + #endif + outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + plocals->l_errno = EILSEQ; + break; + outcount_ok: + if (outcount < 0) { + plocals->l_errno = E2BIG; + break; + } + #ifndef LIBICONV_PLUG + if (cd->hooks.uc_hook) + (*cd->hooks.uc_hook)(wc, cd->hooks.data); + #endif + if (!(outcount <= outleft)) abort(); + outptr += outcount; outleft -= outcount; + outcount_zero: ; + } + plocals->l_outbuf = outptr; + plocals->l_outbytesleft = outleft; + } +} + +#endif /* !LIBICONV_PLUG */ + +static size_t unicode_loop_convert (iconv_t icd, + const char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft) +{ + conv_t cd = (conv_t) icd; + size_t result = 0; + const unsigned char* inptr = (const unsigned char*) *inbuf; + size_t inleft = *inbytesleft; + unsigned char* outptr = (unsigned char*) *outbuf; + size_t outleft = *outbytesleft; + while (inleft > 0) { + state_t last_istate = cd->istate; + ucs4_t wc; + int incount; + int outcount; + incount = cd->ifuncs.xxx_mbtowc(cd,&wc,inptr,inleft); + if (incount < 0) { + if ((unsigned int)(-1-incount) % 2 == (unsigned int)(-1-RET_ILSEQ) % 2) { + /* Case 1: invalid input, possibly after a shift sequence */ + incount = DECODE_SHIFT_ILSEQ(incount); + if (cd->discard_ilseq) { + switch (cd->iindex) { + case ei_ucs4: case ei_ucs4be: case ei_ucs4le: + case ei_utf32: case ei_utf32be: case ei_utf32le: + case ei_ucs4internal: case ei_ucs4swapped: + incount += 4; break; + case ei_ucs2: case ei_ucs2be: case ei_ucs2le: + case ei_utf16: case ei_utf16be: case ei_utf16le: + case ei_ucs2internal: case ei_ucs2swapped: + incount += 2; break; + default: + incount += 1; break; + } + goto outcount_zero; + } + #ifndef LIBICONV_PLUG + else if (cd->fallbacks.mb_to_uc_fallback != NULL) { + unsigned int incount2; + struct mb_to_uc_fallback_locals locals; + switch (cd->iindex) { + case ei_ucs4: case ei_ucs4be: case ei_ucs4le: + case ei_utf32: case ei_utf32be: case ei_utf32le: + case ei_ucs4internal: case ei_ucs4swapped: + incount2 = 4; break; + case ei_ucs2: case ei_ucs2be: case ei_ucs2le: + case ei_utf16: case ei_utf16be: case ei_utf16le: + case ei_ucs2internal: case ei_ucs2swapped: + incount2 = 2; break; + default: + incount2 = 1; break; + } + locals.l_cd = cd; + locals.l_outbuf = outptr; + locals.l_outbytesleft = outleft; + locals.l_errno = 0; + cd->fallbacks.mb_to_uc_fallback((const char*)inptr+incount, incount2, + mb_to_uc_write_replacement, + &locals, + cd->fallbacks.data); + if (locals.l_errno != 0) { + inptr += incount; inleft -= incount; + errno = locals.l_errno; + result = -1; + break; + } + incount += incount2; + outptr = locals.l_outbuf; + outleft = locals.l_outbytesleft; + result += 1; + goto outcount_zero; + } + #endif + inptr += incount; inleft -= incount; + errno = EILSEQ; + result = -1; + break; + } + if (incount == RET_TOOFEW(0)) { + /* Case 2: not enough bytes available to detect anything */ + errno = EINVAL; + result = -1; + break; + } + /* Case 3: k bytes read, but only a shift sequence */ + incount = DECODE_TOOFEW(incount); + } else { + /* Case 4: k bytes read, making up a wide character */ + if (outleft == 0) { + cd->istate = last_istate; + errno = E2BIG; + result = -1; + break; + } + outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + /* Handle Unicode tag characters (range U+E0000..U+E007F). */ + if ((wc >> 7) == (0xe0000 >> 7)) + goto outcount_zero; + /* Try transliteration. */ + result++; + if (cd->transliterate) { + outcount = unicode_transliterate(cd,wc,outptr,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + } + if (cd->discard_ilseq) { + outcount = 0; + goto outcount_ok; + } + #ifndef LIBICONV_PLUG + else if (cd->fallbacks.uc_to_mb_fallback != NULL) { + struct uc_to_mb_fallback_locals locals; + locals.l_outbuf = outptr; + locals.l_outbytesleft = outleft; + locals.l_errno = 0; + cd->fallbacks.uc_to_mb_fallback(wc, + uc_to_mb_write_replacement, + &locals, + cd->fallbacks.data); + if (locals.l_errno != 0) { + cd->istate = last_istate; + errno = locals.l_errno; + return -1; + } + outptr = locals.l_outbuf; + outleft = locals.l_outbytesleft; + outcount = 0; + goto outcount_ok; + } + #endif + outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + cd->istate = last_istate; + errno = EILSEQ; + result = -1; + break; + outcount_ok: + if (outcount < 0) { + cd->istate = last_istate; + errno = E2BIG; + result = -1; + break; + } + #ifndef LIBICONV_PLUG + if (cd->hooks.uc_hook) + (*cd->hooks.uc_hook)(wc, cd->hooks.data); + #endif + if (!(outcount <= outleft)) abort(); + outptr += outcount; outleft -= outcount; + } + outcount_zero: + if (!(incount <= inleft)) abort(); + inptr += incount; inleft -= incount; + } + *inbuf = (const char*) inptr; + *inbytesleft = inleft; + *outbuf = (char*) outptr; + *outbytesleft = outleft; + return result; +} + +static size_t unicode_loop_reset (iconv_t icd, + char* * outbuf, size_t *outbytesleft) +{ + conv_t cd = (conv_t) icd; + if (outbuf == NULL || *outbuf == NULL) { + /* Reset the states. */ + memset(&cd->istate,'\0',sizeof(state_t)); + memset(&cd->ostate,'\0',sizeof(state_t)); + return 0; + } else { + size_t result = 0; + if (cd->ifuncs.xxx_flushwc) { + state_t last_istate = cd->istate; + ucs4_t wc; + if (cd->ifuncs.xxx_flushwc(cd, &wc)) { + unsigned char* outptr = (unsigned char*) *outbuf; + size_t outleft = *outbytesleft; + int outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + /* Handle Unicode tag characters (range U+E0000..U+E007F). */ + if ((wc >> 7) == (0xe0000 >> 7)) + goto outcount_zero; + /* Try transliteration. */ + result++; + if (cd->transliterate) { + outcount = unicode_transliterate(cd,wc,outptr,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + } + if (cd->discard_ilseq) { + outcount = 0; + goto outcount_ok; + } + #ifndef LIBICONV_PLUG + else if (cd->fallbacks.uc_to_mb_fallback != NULL) { + struct uc_to_mb_fallback_locals locals; + locals.l_outbuf = outptr; + locals.l_outbytesleft = outleft; + locals.l_errno = 0; + cd->fallbacks.uc_to_mb_fallback(wc, + uc_to_mb_write_replacement, + &locals, + cd->fallbacks.data); + if (locals.l_errno != 0) { + cd->istate = last_istate; + errno = locals.l_errno; + return -1; + } + outptr = locals.l_outbuf; + outleft = locals.l_outbytesleft; + outcount = 0; + goto outcount_ok; + } + #endif + outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); + if (outcount != RET_ILUNI) + goto outcount_ok; + cd->istate = last_istate; + errno = EILSEQ; + return -1; + outcount_ok: + if (outcount < 0) { + cd->istate = last_istate; + errno = E2BIG; + return -1; + } + #ifndef LIBICONV_PLUG + if (cd->hooks.uc_hook) + (*cd->hooks.uc_hook)(wc, cd->hooks.data); + #endif + if (!(outcount <= outleft)) abort(); + outptr += outcount; + outleft -= outcount; + outcount_zero: + *outbuf = (char*) outptr; + *outbytesleft = outleft; + } + } + if (cd->ofuncs.xxx_reset) { + unsigned char* outptr = (unsigned char*) *outbuf; + size_t outleft = *outbytesleft; + int outcount = cd->ofuncs.xxx_reset(cd,outptr,outleft); + if (outcount < 0) { + errno = E2BIG; + return -1; + } + if (!(outcount <= outleft)) abort(); + *outbuf = (char*) (outptr + outcount); + *outbytesleft = outleft - outcount; + } + memset(&cd->istate,'\0',sizeof(state_t)); + memset(&cd->ostate,'\0',sizeof(state_t)); + return result; + } +} diff --git a/Externals/libiconv-1.14/lib/loop_wchar.h b/Externals/libiconv-1.14/lib/loop_wchar.h new file mode 100644 index 0000000000..6dc011b3e4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/loop_wchar.h @@ -0,0 +1,474 @@ +/* + * Copyright (C) 2000-2002, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This file defines three conversion loops: + - from wchar_t to anything else, + - from anything else to wchar_t, + - from wchar_t to wchar_t. + */ + +#if HAVE_WCRTOMB || HAVE_MBRTOWC +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . + In some builds of uClibc, is nonexistent and wchar_t is defined + by . */ +# include +# include +# include +# include +# define BUF_SIZE 64 /* assume MB_LEN_MAX <= 64 */ + /* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ + extern size_t mbrtowc (); +# ifdef mbstate_t +# define mbrtowc(pwc, s, n, ps) (mbrtowc)(pwc, s, n, 0) +# define mbsinit(ps) 1 +# endif +# ifndef mbsinit +# if !HAVE_MBSINIT +# define mbsinit(ps) 1 +# endif +# endif +#endif + +/* + * The first two conversion loops have an extended conversion descriptor. + */ +struct wchar_conv_struct { + struct conv_struct parent; +#if HAVE_WCRTOMB || HAVE_MBRTOWC + mbstate_t state; +#endif +}; + + +#if HAVE_WCRTOMB + +/* From wchar_t to anything else. */ + +#ifndef LIBICONV_PLUG + +#if 0 + +struct wc_to_mb_fallback_locals { + struct wchar_conv_struct * l_wcd; + char* l_outbuf; + size_t l_outbytesleft; + int l_errno; +}; + +/* A callback that writes a string given in the locale encoding. */ +static void wc_to_mb_write_replacement (const char *buf, size_t buflen, + void* callback_arg) +{ + struct wc_to_mb_fallback_locals * plocals = + (struct wc_to_mb_fallback_locals *) callback_arg; + /* Do nothing if already encountered an error in a previous call. */ + if (plocals->l_errno == 0) { + /* Attempt to convert the passed buffer to the target encoding. + Here we don't support characters split across multiple calls. */ + const char* bufptr = buf; + size_t bufleft = buflen; + size_t res = unicode_loop_convert(&plocals->l_wcd->parent, + &bufptr,&bufleft, + &plocals->l_outbuf,&plocals->l_outbytesleft); + if (res == (size_t)(-1)) { + if (errno == EILSEQ || errno == EINVAL) + /* Invalid buf contents. */ + plocals->l_errno = EILSEQ; + else if (errno == E2BIG) + /* Output buffer too small. */ + plocals->l_errno = E2BIG; + else + abort(); + } else { + /* Successful conversion. */ + if (bufleft > 0) + abort(); + } + } +} + +#else + +struct wc_to_mb_fallback_locals { + char* l_outbuf; + size_t l_outbytesleft; + int l_errno; +}; + +/* A callback that writes a string given in the target encoding. */ +static void wc_to_mb_write_replacement (const char *buf, size_t buflen, + void* callback_arg) +{ + struct wc_to_mb_fallback_locals * plocals = + (struct wc_to_mb_fallback_locals *) callback_arg; + /* Do nothing if already encountered an error in a previous call. */ + if (plocals->l_errno == 0) { + /* Attempt to copy the passed buffer to the output buffer. */ + if (plocals->l_outbytesleft < buflen) + plocals->l_errno = E2BIG; + else { + memcpy(plocals->l_outbuf, buf, buflen); + plocals->l_outbuf += buflen; + plocals->l_outbytesleft -= buflen; + } + } +} + +#endif + +#endif /* !LIBICONV_PLUG */ + +static size_t wchar_from_loop_convert (iconv_t icd, + const char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft) +{ + struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; + size_t result = 0; + while (*inbytesleft >= sizeof(wchar_t)) { + const wchar_t * inptr = (const wchar_t *) *inbuf; + size_t inleft = *inbytesleft; + char buf[BUF_SIZE]; + mbstate_t state = wcd->state; + size_t bufcount = 0; + while (inleft >= sizeof(wchar_t)) { + /* Convert one wchar_t to multibyte representation. */ + size_t count = wcrtomb(buf+bufcount,*inptr,&state); + if (count == (size_t)(-1)) { + /* Invalid input. */ + if (wcd->parent.discard_ilseq) { + count = 0; + } + #ifndef LIBICONV_PLUG + else if (wcd->parent.fallbacks.wc_to_mb_fallback != NULL) { + /* Drop the contents of buf[] accumulated so far, and instead + pass all queued wide characters to the fallback handler. */ + struct wc_to_mb_fallback_locals locals; + const wchar_t * fallback_inptr; + #if 0 + locals.l_wcd = wcd; + #endif + locals.l_outbuf = *outbuf; + locals.l_outbytesleft = *outbytesleft; + locals.l_errno = 0; + for (fallback_inptr = (const wchar_t *) *inbuf; + fallback_inptr <= inptr; + fallback_inptr++) + wcd->parent.fallbacks.wc_to_mb_fallback(*fallback_inptr, + wc_to_mb_write_replacement, + &locals, + wcd->parent.fallbacks.data); + if (locals.l_errno != 0) { + errno = locals.l_errno; + return -1; + } + wcd->state = state; + *inbuf = (const char *) (inptr + 1); + *inbytesleft = inleft - sizeof(wchar_t); + *outbuf = locals.l_outbuf; + *outbytesleft = locals.l_outbytesleft; + result += 1; + break; + } + #endif + else { + errno = EILSEQ; + return -1; + } + } + inptr++; + inleft -= sizeof(wchar_t); + bufcount += count; + if (count == 0) { + /* Continue, append next wchar_t. */ + } else { + /* Attempt to convert the accumulated multibyte representations + to the target encoding. */ + const char* bufptr = buf; + size_t bufleft = bufcount; + char* outptr = *outbuf; + size_t outleft = *outbytesleft; + size_t res = unicode_loop_convert(&wcd->parent, + &bufptr,&bufleft, + &outptr,&outleft); + if (res == (size_t)(-1)) { + if (errno == EILSEQ) + /* Invalid input. */ + return -1; + else if (errno == E2BIG) + /* Output buffer too small. */ + return -1; + else if (errno == EINVAL) { + /* Continue, append next wchar_t, but avoid buffer overrun. */ + if (bufcount + MB_CUR_MAX > BUF_SIZE) + abort(); + } else + abort(); + } else { + /* Successful conversion. */ + wcd->state = state; + *inbuf = (const char *) inptr; + *inbytesleft = inleft; + *outbuf = outptr; + *outbytesleft = outleft; + result += res; + break; + } + } + } + } + return result; +} + +static size_t wchar_from_loop_reset (iconv_t icd, + char* * outbuf, size_t *outbytesleft) +{ + struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; + if (outbuf == NULL || *outbuf == NULL) { + /* Reset the states. */ + memset(&wcd->state,'\0',sizeof(mbstate_t)); + return unicode_loop_reset(&wcd->parent,NULL,NULL); + } else { + if (!mbsinit(&wcd->state)) { + mbstate_t state = wcd->state; + char buf[BUF_SIZE]; + size_t bufcount = wcrtomb(buf,(wchar_t)0,&state); + if (bufcount == (size_t)(-1) || bufcount == 0 || buf[bufcount-1] != '\0') + abort(); + else { + const char* bufptr = buf; + size_t bufleft = bufcount-1; + char* outptr = *outbuf; + size_t outleft = *outbytesleft; + size_t res = unicode_loop_convert(&wcd->parent, + &bufptr,&bufleft, + &outptr,&outleft); + if (res == (size_t)(-1)) { + if (errno == E2BIG) + return -1; + else + abort(); + } else { + res = unicode_loop_reset(&wcd->parent,&outptr,&outleft); + if (res == (size_t)(-1)) + return res; + else { + /* Successful. */ + wcd->state = state; + *outbuf = outptr; + *outbytesleft = outleft; + return 0; + } + } + } + } else + return unicode_loop_reset(&wcd->parent,outbuf,outbytesleft); + } +} + +#endif + + +#if HAVE_MBRTOWC + +/* From anything else to wchar_t. */ + +#ifndef LIBICONV_PLUG + +struct mb_to_wc_fallback_locals { + char* l_outbuf; + size_t l_outbytesleft; + int l_errno; +}; + +static void mb_to_wc_write_replacement (const wchar_t *buf, size_t buflen, + void* callback_arg) +{ + struct mb_to_wc_fallback_locals * plocals = + (struct mb_to_wc_fallback_locals *) callback_arg; + /* Do nothing if already encountered an error in a previous call. */ + if (plocals->l_errno == 0) { + /* Attempt to copy the passed buffer to the output buffer. */ + if (plocals->l_outbytesleft < sizeof(wchar_t)*buflen) + plocals->l_errno = E2BIG; + else { + for (; buflen > 0; buf++, buflen--) { + *(wchar_t*) plocals->l_outbuf = *buf; + plocals->l_outbuf += sizeof(wchar_t); + plocals->l_outbytesleft -= sizeof(wchar_t); + } + } + } +} + +#endif /* !LIBICONV_PLUG */ + +static size_t wchar_to_loop_convert (iconv_t icd, + const char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft) +{ + struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; + size_t result = 0; + while (*inbytesleft > 0) { + size_t incount; + for (incount = 1; ; ) { + /* Here incount <= *inbytesleft. */ + char buf[BUF_SIZE]; + const char* inptr = *inbuf; + size_t inleft = incount; + char* bufptr = buf; + size_t bufleft = BUF_SIZE; + size_t res = unicode_loop_convert(&wcd->parent, + &inptr,&inleft, + &bufptr,&bufleft); + if (res == (size_t)(-1)) { + if (errno == EILSEQ) + /* Invalid input. */ + return -1; + else if (errno == EINVAL) { + /* Incomplete input. Next try with one more input byte. */ + } else + /* E2BIG shouldn't occur. */ + abort(); + } else { + /* Successful conversion. */ + size_t bufcount = bufptr-buf; /* = BUF_SIZE-bufleft */ + mbstate_t state = wcd->state; + wchar_t wc; + res = mbrtowc(&wc,buf,bufcount,&state); + if (res == (size_t)(-2)) { + /* Next try with one more input byte. */ + } else { + if (res == (size_t)(-1)) { + /* Invalid input. */ + if (wcd->parent.discard_ilseq) { + } + #ifndef LIBICONV_PLUG + else if (wcd->parent.fallbacks.mb_to_wc_fallback != NULL) { + /* Drop the contents of buf[] accumulated so far, and instead + pass all queued chars to the fallback handler. */ + struct mb_to_wc_fallback_locals locals; + locals.l_outbuf = *outbuf; + locals.l_outbytesleft = *outbytesleft; + locals.l_errno = 0; + wcd->parent.fallbacks.mb_to_wc_fallback(*inbuf, incount, + mb_to_wc_write_replacement, + &locals, + wcd->parent.fallbacks.data); + if (locals.l_errno != 0) { + errno = locals.l_errno; + return -1; + } + /* Restoring the state is not needed because it is the initial + state anyway: For all known locale encodings, the multibyte + to wchar_t conversion doesn't have shift state, and we have + excluded partial accumulated characters. */ + /* wcd->state = state; */ + *inbuf += incount; + *inbytesleft -= incount; + *outbuf = locals.l_outbuf; + *outbytesleft = locals.l_outbytesleft; + result += 1; + break; + } + #endif + else + return -1; + } else { + if (*outbytesleft < sizeof(wchar_t)) { + errno = E2BIG; + return -1; + } + *(wchar_t*) *outbuf = wc; + /* Restoring the state is not needed because it is the initial + state anyway: For all known locale encodings, the multibyte + to wchar_t conversion doesn't have shift state, and we have + excluded partial accumulated characters. */ + /* wcd->state = state; */ + *outbuf += sizeof(wchar_t); + *outbytesleft -= sizeof(wchar_t); + } + *inbuf += incount; + *inbytesleft -= incount; + result += res; + break; + } + } + incount++; + if (incount > *inbytesleft) { + /* Incomplete input. */ + errno = EINVAL; + return -1; + } + } + } + return result; +} + +static size_t wchar_to_loop_reset (iconv_t icd, + char* * outbuf, size_t *outbytesleft) +{ + struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; + size_t res = unicode_loop_reset(&wcd->parent,outbuf,outbytesleft); + if (res == (size_t)(-1)) + return res; + memset(&wcd->state,0,sizeof(mbstate_t)); + return 0; +} + +#endif + + +/* From wchar_t to wchar_t. */ + +static size_t wchar_id_loop_convert (iconv_t icd, + const char* * inbuf, size_t *inbytesleft, + char* * outbuf, size_t *outbytesleft) +{ + struct conv_struct * cd = (struct conv_struct *) icd; + const wchar_t* inptr = (const wchar_t*) *inbuf; + size_t inleft = *inbytesleft / sizeof(wchar_t); + wchar_t* outptr = (wchar_t*) *outbuf; + size_t outleft = *outbytesleft / sizeof(wchar_t); + size_t count = (inleft <= outleft ? inleft : outleft); + if (count > 0) { + *inbytesleft -= count * sizeof(wchar_t); + *outbytesleft -= count * sizeof(wchar_t); + do { + wchar_t wc = *inptr++; + *outptr++ = wc; + #ifndef LIBICONV_PLUG + if (cd->hooks.wc_hook) + (*cd->hooks.wc_hook)(wc, cd->hooks.data); + #endif + } while (--count > 0); + *inbuf = (const char*) inptr; + *outbuf = (char*) outptr; + } + return 0; +} + +static size_t wchar_id_loop_reset (iconv_t icd, + char* * outbuf, size_t *outbytesleft) +{ + return 0; +} diff --git a/Externals/libiconv-1.14/lib/loops.h b/Externals/libiconv-1.14/lib/loops.h new file mode 100644 index 0000000000..782cc0926d --- /dev/null +++ b/Externals/libiconv-1.14/lib/loops.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This file defines all the loops. */ + +#include "loop_unicode.h" +#include "loop_wchar.h" + diff --git a/Externals/libiconv-1.14/lib/mac_arabic.h b/Externals/libiconv-1.14/lib/mac_arabic.h new file mode 100644 index 0000000000..9d05a1ab63 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_arabic.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacArabic + */ + +static const unsigned short mac_arabic_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00a0, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x06ba, 0x00ab, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x2026, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00bb, 0x00f4, 0x00f6, 0x00f7, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x066a, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0xfffd, 0xfffd, 0xfffd, + /* 0xb0 */ + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, + /* 0xc0 */ + 0x066d, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + /* 0xd0 */ + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xe0 */ + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + /* 0xf0 */ + 0x0650, 0x0651, 0x0652, 0x067e, 0x0679, 0x0686, 0x06d5, 0x06a4, + 0x06af, 0x0688, 0x0691, 0xfffd, 0xfffd, 0xfffd, 0x0698, 0x06d2, +}; + +static int +mac_arabic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_arabic_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_arabic_page00[96] = { + 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, /* 0xc0-0xc7 */ + 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x00, 0x8a, 0x00, 0x00, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x00, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x00, 0x97, 0x99, 0x00, 0x9a, 0x9b, /* 0xf0-0xf7 */ + 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char mac_arabic_page06[208] = { + 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ + 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ + 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ + 0xb8, 0xb9, 0xa5, 0x00, 0x00, 0xc0, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0xf4, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00, /* 0x80-0x87 */ + 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0xff, 0x00, 0x00, 0xf6, 0x00, 0x00, /* 0xd0-0xd7 */ +}; + +static int +mac_arabic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_arabic_page00[wc-0x00a0]; + else if (wc >= 0x0608 && wc < 0x06d8) + c = mac_arabic_page06[wc-0x0608]; + else if (wc == 0x2026) + c = 0x93; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_centraleurope.h b/Externals/libiconv-1.14/lib/mac_centraleurope.h new file mode 100644 index 0000000000..be030cfc81 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_centraleurope.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacCentralEurope + */ + +static const unsigned short mac_centraleurope_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x0100, 0x0101, 0x00c9, 0x0104, 0x00d6, 0x00dc, 0x00e1, + 0x0105, 0x010c, 0x00e4, 0x010d, 0x0106, 0x0107, 0x00e9, 0x0179, + /* 0x90 */ + 0x017a, 0x010e, 0x00ed, 0x010f, 0x0112, 0x0113, 0x0116, 0x00f3, + 0x0117, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x011a, 0x011b, 0x00fc, + /* 0xa0 */ + 0x2020, 0x00b0, 0x0118, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x0119, 0x00a8, 0x2260, 0x0123, 0x012e, + /* 0xb0 */ + 0x012f, 0x012a, 0x2264, 0x2265, 0x012b, 0x0136, 0x2202, 0x2211, + 0x0142, 0x013b, 0x013c, 0x013d, 0x013e, 0x0139, 0x013a, 0x0145, + /* 0xc0 */ + 0x0146, 0x0143, 0x00ac, 0x221a, 0x0144, 0x0147, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x0148, 0x0150, 0x00d5, 0x0151, 0x014c, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x014d, 0x0154, 0x0155, 0x0158, 0x2039, 0x203a, 0x0159, 0x0156, + /* 0xe0 */ + 0x0157, 0x0160, 0x201a, 0x201e, 0x0161, 0x015a, 0x015b, 0x00c1, + 0x0164, 0x0165, 0x00cd, 0x017d, 0x017e, 0x016a, 0x00d3, 0x00d4, + /* 0xf0 */ + 0x016b, 0x016e, 0x00da, 0x016f, 0x0170, 0x0171, 0x0172, 0x0173, + 0x00dd, 0x00fd, 0x0137, 0x017b, 0x0141, 0x017c, 0x0122, 0x02c7, +}; + +static int +mac_centraleurope_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) mac_centraleurope_2uni[c-0x80]; + return 1; +} + +static const unsigned char mac_centraleurope_page00[224] = { + 0xca, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ + 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0xe7, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x83, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0xf2, 0x00, 0x86, 0xf8, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x00, 0x87, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0x00, 0x8e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0x00, 0x00, 0x9c, 0x00, 0x9f, 0xf9, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x81, 0x82, 0x00, 0x00, 0x84, 0x88, 0x8c, 0x8d, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x89, 0x8b, 0x91, 0x93, /* 0x08-0x0f */ + 0x00, 0x00, 0x94, 0x95, 0x00, 0x00, 0x96, 0x98, /* 0x10-0x17 */ + 0xa2, 0xab, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xfe, 0xae, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0xb1, 0xb4, 0x00, 0x00, 0xaf, 0xb0, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xfa, /* 0x30-0x37 */ + 0x00, 0xbd, 0xbe, 0xb9, 0xba, 0xbb, 0xbc, 0x00, /* 0x38-0x3f */ + 0x00, 0xfc, 0xb8, 0xc1, 0xc4, 0xbf, 0xc0, 0xc5, /* 0x40-0x47 */ + 0xcb, 0x00, 0x00, 0x00, 0xcf, 0xd8, 0x00, 0x00, /* 0x48-0x4f */ + 0xcc, 0xce, 0x00, 0x00, 0xd9, 0xda, 0xdf, 0xe0, /* 0x50-0x57 */ + 0xdb, 0xde, 0xe5, 0xe6, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xe1, 0xe4, 0x00, 0x00, 0xe8, 0xe9, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0xed, 0xf0, 0x00, 0x00, 0xf1, 0xf3, /* 0x68-0x6f */ + 0xf4, 0xf5, 0xf6, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x8f, 0x90, 0xfb, 0xfd, 0xeb, 0xec, 0x00, /* 0x78-0x7f */ +}; +static const unsigned char mac_centraleurope_page20[48] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; +static const unsigned char mac_centraleurope_page22[32] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; +static const unsigned char mac_centraleurope_page22_1[8] = { + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_centraleurope_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0180) + c = mac_centraleurope_page00[wc-0x00a0]; + else if (wc == 0x02c7) + c = 0xff; + else if (wc >= 0x2010 && wc < 0x2040) + c = mac_centraleurope_page20[wc-0x2010]; + else if (wc == 0x2122) + c = 0xaa; + else if (wc >= 0x2200 && wc < 0x2220) + c = mac_centraleurope_page22[wc-0x2200]; + else if (wc >= 0x2260 && wc < 0x2268) + c = mac_centraleurope_page22_1[wc-0x2260]; + else if (wc == 0x25ca) + c = 0xd7; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_croatian.h b/Externals/libiconv-1.14/lib/mac_croatian.h new file mode 100644 index 0000000000..582f3e05c0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_croatian.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacCroatian + */ + +static const unsigned short mac_croatian_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x0160, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x017d, 0x00d8, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x2206, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x0161, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x017e, 0x00f8, + /* 0xc0 */ + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x0106, 0x00ab, + 0x010c, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + /* 0xd0 */ + 0x0110, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0xfffd, 0x00a9, 0x2044, 0x00a4, 0x2039, 0x203a, 0x00c6, 0x00bb, + /* 0xe0 */ + 0x2013, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x0107, 0x00c1, + 0x010d, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + /* 0xf0 */ + 0x0111, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x03c0, 0x00cb, 0x02da, 0x00b8, 0x00ca, 0x00e6, 0x02c7, +}; + +static int +mac_croatian_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_croatian_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_croatian_page00[248] = { + 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xd9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ + 0xfc, 0x00, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ + 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xde, 0x82, /* 0xc0-0xc7 */ + 0xe9, 0x83, 0xfd, 0xfa, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ + 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xfe, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_croatian_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0xfb, 0x00, 0xf7, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char mac_croatian_page20[56] = { + 0x00, 0x00, 0x00, 0xe0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ +}; +static const unsigned char mac_croatian_page21[8] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_croatian_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_croatian_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0198) + c = mac_croatian_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = mac_croatian_page02[wc-0x02c0]; + else if (wc == 0x03c0) + c = 0xf9; + else if (wc >= 0x2010 && wc < 0x2048) + c = mac_croatian_page20[wc-0x2010]; + else if (wc >= 0x2120 && wc < 0x2128) + c = mac_croatian_page21[wc-0x2120]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_croatian_page22[wc-0x2200]; + else if (wc == 0x25ca) + c = 0xd7; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_cyrillic.h b/Externals/libiconv-1.14/lib/mac_cyrillic.h new file mode 100644 index 0000000000..a5b5972f28 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_cyrillic.h @@ -0,0 +1,136 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacCyrillic + */ + +static const unsigned short mac_cyrillic_2uni[128] = { + /* 0x80 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0x90 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xa0 */ + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, + 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x2202, 0x0408, + 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, + /* 0xc0 */ + 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, + 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, + /* 0xe0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xf0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, +}; + +static int +mac_cyrillic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0x80) + *pwc = (ucs4_t) mac_cyrillic_2uni[c-0x80]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char mac_cyrillic_page00[32] = { + 0xca, 0x00, 0xa2, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char mac_cyrillic_page04[96] = { + 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ + 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ + 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ + 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ +}; +static const unsigned char mac_cyrillic_page20[24] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ + 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_cyrillic_page21[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_cyrillic_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_cyrillic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = mac_cyrillic_page00[wc-0x00a0]; + else if (wc == 0x00f7) + c = 0xd6; + else if (wc == 0x0192) + c = 0xc4; + else if (wc >= 0x0400 && wc < 0x0460) + c = mac_cyrillic_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2028) + c = mac_cyrillic_page20[wc-0x2010]; + else if (wc >= 0x2110 && wc < 0x2128) + c = mac_cyrillic_page21[wc-0x2110]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_cyrillic_page22[wc-0x2200]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_greek.h b/Externals/libiconv-1.14/lib/mac_greek.h new file mode 100644 index 0000000000..3cc4ac29f8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_greek.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacGreek + */ + +static const unsigned short mac_greek_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00b9, 0x00b2, 0x00c9, 0x00b3, 0x00d6, 0x00dc, 0x0385, + 0x00e0, 0x00e2, 0x00e4, 0x0384, 0x00a8, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00a3, 0x2122, 0x00ee, 0x00ef, 0x2022, 0x00bd, + 0x2030, 0x00f4, 0x00f6, 0x00a6, 0x00ad, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x2020, 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x00df, + 0x00ae, 0x00a9, 0x03a3, 0x03aa, 0x00a7, 0x2260, 0x00b0, 0x0387, + /* 0xb0 */ + 0x0391, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x0392, 0x0395, 0x0396, + 0x0397, 0x0399, 0x039a, 0x039c, 0x03a6, 0x03ab, 0x03a8, 0x03a9, + /* 0xc0 */ + 0x03ac, 0x039d, 0x00ac, 0x039f, 0x03a1, 0x2248, 0x03a4, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x03a5, 0x03a7, 0x0386, 0x0388, 0x0153, + /* 0xd0 */ + 0x2013, 0x2015, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0389, + 0x038a, 0x038c, 0x038e, 0x03ad, 0x03ae, 0x03af, 0x03cc, 0x038f, + /* 0xe0 */ + 0x03cd, 0x03b1, 0x03b2, 0x03c8, 0x03b4, 0x03b5, 0x03c6, 0x03b3, + 0x03b7, 0x03b9, 0x03be, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, + /* 0xf0 */ + 0x03c0, 0x03ce, 0x03c1, 0x03c3, 0x03c4, 0x03b8, 0x03c9, 0x03c2, + 0x03c7, 0x03c5, 0x03b6, 0x03ca, 0x03cb, 0x0390, 0x03b0, 0xfffd, +}; + +static int +mac_greek_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_greek_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_greek_page00[96] = { + 0xca, 0x00, 0x00, 0x92, 0x00, 0xb4, 0x9b, 0xac, /* 0xa0-0xa7 */ + 0x8c, 0xa9, 0x00, 0xc7, 0xc2, 0x9c, 0xa8, 0x00, /* 0xa8-0xaf */ + 0xae, 0xb1, 0x82, 0x84, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x81, 0x00, 0xc8, 0x00, 0x97, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x00, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x00, 0x00, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0x00, 0x9d, 0x00, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char mac_greek_page03[80] = { + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x87, 0xcd, 0xaf, /* 0x80-0x87 */ + 0xce, 0xd7, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0xdf, /* 0x88-0x8f */ + 0xfd, 0xb0, 0xb5, 0xa1, 0xa2, 0xb6, 0xb7, 0xb8, /* 0x90-0x97 */ + 0xa3, 0xb9, 0xba, 0xa4, 0xbb, 0xc1, 0xa5, 0xc3, /* 0x98-0x9f */ + 0xa6, 0xc4, 0x00, 0xaa, 0xc6, 0xcb, 0xbc, 0xcc, /* 0xa0-0xa7 */ + 0xbe, 0xbf, 0xab, 0xbd, 0xc0, 0xdb, 0xdc, 0xdd, /* 0xa8-0xaf */ + 0xfe, 0xe1, 0xe2, 0xe7, 0xe4, 0xe5, 0xfa, 0xe8, /* 0xb0-0xb7 */ + 0xf5, 0xe9, 0xeb, 0xec, 0xed, 0xee, 0xea, 0xef, /* 0xb8-0xbf */ + 0xf0, 0xf2, 0xf7, 0xf3, 0xf4, 0xf9, 0xe6, 0xf8, /* 0xc0-0xc7 */ + 0xe3, 0xf6, 0xfb, 0xfc, 0xde, 0xe0, 0xf1, 0x00, /* 0xc8-0xcf */ +}; +static const unsigned char mac_greek_page20[40] = { + 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ + 0xa0, 0x00, 0x96, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ +}; +static const unsigned char mac_greek_page22[32] = { + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_greek_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_greek_page00[wc-0x00a0]; + else if (wc == 0x0153) + c = 0xcf; + else if (wc >= 0x0380 && wc < 0x03d0) + c = mac_greek_page03[wc-0x0380]; + else if (wc >= 0x2010 && wc < 0x2038) + c = mac_greek_page20[wc-0x2010]; + else if (wc == 0x2122) + c = 0x93; + else if (wc >= 0x2248 && wc < 0x2268) + c = mac_greek_page22[wc-0x2248]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_hebrew.h b/Externals/libiconv-1.14/lib/mac_hebrew.h new file mode 100644 index 0000000000..c7f97bb6b1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_hebrew.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacHebrew + */ + +static const unsigned short mac_hebrew_2uni[128] = { + /* 0x80 */ + 0x00c4, 0xfb1f, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x20aa, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xb0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, + /* 0xc0 */ + 0xfffd, 0x201e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x05bc, 0xfb4b, + 0xfb35, 0x2026, 0x00a0, 0x05b8, 0x05b7, 0x05b5, 0x05b6, 0x05b4, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xfb2a, 0xfb2b, + 0x05bf, 0x05b0, 0x05b2, 0x05b1, 0x05bb, 0x05b9, 0xfffd, 0x05b3, + /* 0xe0 */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + /* 0xf0 */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +}; + +static int +mac_hebrew_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c >= 0x80) { + unsigned short wc = mac_hebrew_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_hebrew_page00[96] = { + 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, /* 0xc0-0xc7 */ + 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0x00, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0x00, /* 0xf0-0xf7 */ + 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char mac_hebrew_page05[64] = { + 0xd9, 0xdb, 0xda, 0xdf, 0xcf, 0xcd, 0xce, 0xcc, /* 0xb0-0xb7 */ + 0xcb, 0xdd, 0x00, 0xdc, 0xc6, 0x00, 0x00, 0xd8, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ + 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char mac_hebrew_page20[24] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xc1, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_hebrew_pagefb[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0xd6, 0xd7, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ +}; + +static int +mac_hebrew_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_hebrew_page00[wc-0x00a0]; + else if (wc >= 0x05b0 && wc < 0x05f0) + c = mac_hebrew_page05[wc-0x05b0]; + else if (wc >= 0x2010 && wc < 0x2028) + c = mac_hebrew_page20[wc-0x2010]; + else if (wc == 0x20aa) + c = 0xa6; + else if (wc >= 0xfb18 && wc < 0xfb50) + c = mac_hebrew_pagefb[wc-0xfb18]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_iceland.h b/Externals/libiconv-1.14/lib/mac_iceland.h new file mode 100644 index 0000000000..b49f1642af --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_iceland.h @@ -0,0 +1,162 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacIceland + */ + +static const unsigned short mac_iceland_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x00dd, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, + /* 0xc0 */ + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x00a4, 0x00d0, 0x00f0, 0x00de, 0x00fe, + /* 0xe0 */ + 0x00fd, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + /* 0xf0 */ + 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, +}; + +static int +mac_iceland_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_iceland_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_iceland_page00[96] = { + 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ + 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ + 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ + 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ + 0xdc, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xa0, 0xde, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0xdd, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xe0, 0xdf, 0xd8, /* 0xf8-0xff */ +}; +static const unsigned char mac_iceland_page01[104] = { + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_iceland_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char mac_iceland_page20[56] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ +}; +static const unsigned char mac_iceland_page21[8] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_iceland_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_iceland_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_iceland_page00[wc-0x00a0]; + else if (wc >= 0x0130 && wc < 0x0198) + c = mac_iceland_page01[wc-0x0130]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = mac_iceland_page02[wc-0x02c0]; + else if (wc == 0x03c0) + c = 0xb9; + else if (wc >= 0x2010 && wc < 0x2048) + c = mac_iceland_page20[wc-0x2010]; + else if (wc >= 0x2120 && wc < 0x2128) + c = mac_iceland_page21[wc-0x2120]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_iceland_page22[wc-0x2200]; + else if (wc == 0x25ca) + c = 0xd7; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_roman.h b/Externals/libiconv-1.14/lib/mac_roman.h new file mode 100644 index 0000000000..7a6d51aa0b --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_roman.h @@ -0,0 +1,167 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacRoman + */ + +static const unsigned short mac_roman_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, + /* 0xc0 */ + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0xfb01, 0xfb02, + /* 0xe0 */ + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + /* 0xf0 */ + 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, +}; + +static int +mac_roman_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_roman_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_roman_page00[96] = { + 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ + 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ + 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ + 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ + 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ +}; +static const unsigned char mac_roman_page01[104] = { + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_roman_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char mac_roman_page20[56] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ +}; +static const unsigned char mac_roman_page21[8] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_roman_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; +static const unsigned char mac_roman_pagefb[8] = { + 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ +}; + +static int +mac_roman_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_roman_page00[wc-0x00a0]; + else if (wc >= 0x0130 && wc < 0x0198) + c = mac_roman_page01[wc-0x0130]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = mac_roman_page02[wc-0x02c0]; + else if (wc == 0x03c0) + c = 0xb9; + else if (wc >= 0x2010 && wc < 0x2048) + c = mac_roman_page20[wc-0x2010]; + else if (wc >= 0x2120 && wc < 0x2128) + c = mac_roman_page21[wc-0x2120]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_roman_page22[wc-0x2200]; + else if (wc == 0x25ca) + c = 0xd7; + else if (wc >= 0xfb00 && wc < 0xfb08) + c = mac_roman_pagefb[wc-0xfb00]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_romania.h b/Externals/libiconv-1.14/lib/mac_romania.h new file mode 100644 index 0000000000..2d35562d89 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_romania.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacRomania + */ + +static const unsigned short mac_romania_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x0102, 0x015e, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x0103, 0x015f, + /* 0xc0 */ + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0x0162, 0x0163, + /* 0xe0 */ + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + /* 0xf0 */ + 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, +}; + +static int +mac_romania_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_romania_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_romania_page00[248] = { + 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ + 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ + 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0x00, 0x82, /* 0xc0-0xc7 */ + 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ + 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0x00, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0x00, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, /* 0x58-0x5f */ + 0x00, 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_romania_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char mac_romania_page20[56] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ +}; +static const unsigned char mac_romania_page21[8] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_romania_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_romania_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0198) + c = mac_romania_page00[wc-0x00a0]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = mac_romania_page02[wc-0x02c0]; + else if (wc == 0x03c0) + c = 0xb9; + else if (wc >= 0x2010 && wc < 0x2048) + c = mac_romania_page20[wc-0x2010]; + else if (wc >= 0x2120 && wc < 0x2128) + c = mac_romania_page21[wc-0x2120]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_romania_page22[wc-0x2200]; + else if (wc == 0x25ca) + c = 0xd7; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_thai.h b/Externals/libiconv-1.14/lib/mac_thai.h new file mode 100644 index 0000000000..74d15aaf7f --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_thai.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacThai + */ + +static const unsigned short mac_thai_2uni[128] = { + /* 0x80 */ + 0x00ab, 0x00bb, 0x2026, 0xf88c, 0xf88f, 0xf892, 0xf895, 0xf898, + 0xf88b, 0xf88e, 0xf891, 0xf894, 0xf897, 0x201c, 0x201d, 0xf899, + /* 0x90 */ + 0xfffd, 0x2022, 0xf884, 0xf889, 0xf885, 0xf886, 0xf887, 0xf888, + 0xf88a, 0xf88d, 0xf890, 0xf893, 0xf896, 0x2018, 0x2019, 0xfffd, + /* 0xa0 */ + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + /* 0xb0 */ + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + /* 0xc0 */ + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + /* 0xd0 */ + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0xfeff, 0x200b, 0x2013, 0x2014, 0x0e3f, + /* 0xe0 */ + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x2122, 0x0e4f, + /* 0xf0 */ + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x00ae, 0x00a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +}; + +static int +mac_thai_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_thai_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_thai_page00[32] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0xfb, 0x00, 0x80, 0x00, 0x00, 0xfa, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char mac_thai_page0e[96] = { + 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ + 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x00, 0xef, /* 0x48-0x4f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ + 0xf8, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ +}; +static const unsigned char mac_thai_page20[32] = { + 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0xdd, 0xde, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x9d, 0x9e, 0x00, 0x00, 0x8d, 0x8e, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x82, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_thai_pagef8[32] = { + 0x00, 0x00, 0x00, 0x00, 0x92, 0x94, 0x95, 0x96, /* 0x80-0x87 */ + 0x97, 0x93, 0x98, 0x88, 0x83, 0x99, 0x89, 0x84, /* 0x88-0x8f */ + 0x9a, 0x8a, 0x85, 0x9b, 0x8b, 0x86, 0x9c, 0x8c, /* 0x90-0x97 */ + 0x87, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ +}; + +static int +mac_thai_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = mac_thai_page00[wc-0x00a0]; + else if (wc >= 0x0e00 && wc < 0x0e60) + c = mac_thai_page0e[wc-0x0e00]; + else if (wc >= 0x2008 && wc < 0x2028) + c = mac_thai_page20[wc-0x2008]; + else if (wc == 0x2122) + c = 0xee; + else if (wc >= 0xf880 && wc < 0xf8a0) + c = mac_thai_pagef8[wc-0xf880]; + else if (wc == 0xfeff) + c = 0xdb; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_turkish.h b/Externals/libiconv-1.14/lib/mac_turkish.h new file mode 100644 index 0000000000..94f7d376b9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_turkish.h @@ -0,0 +1,163 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacTurkish + */ + +static const unsigned short mac_turkish_2uni[128] = { + /* 0x80 */ + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + /* 0x90 */ + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + /* 0xa0 */ + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, + /* 0xc0 */ + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x011e, 0x011f, 0x0130, 0x0131, 0x015e, 0x015f, + /* 0xe0 */ + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + /* 0xf0 */ + 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0xfffd, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, +}; + +static int +mac_turkish_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mac_turkish_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mac_turkish_page00[96] = { + 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ + 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ + 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ + 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ + 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ + 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ + 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ + 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ + 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ + 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ +}; +static const unsigned char mac_turkish_page01[128] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xdb, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdf, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_turkish_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char mac_turkish_page20[40] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ + 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ +}; +static const unsigned char mac_turkish_page21[8] = { + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_turkish_page22[104] = { + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ + 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_turkish_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = mac_turkish_page00[wc-0x00a0]; + else if (wc >= 0x0118 && wc < 0x0198) + c = mac_turkish_page01[wc-0x0118]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = mac_turkish_page02[wc-0x02c0]; + else if (wc == 0x03c0) + c = 0xb9; + else if (wc >= 0x2010 && wc < 0x2038) + c = mac_turkish_page20[wc-0x2010]; + else if (wc >= 0x2120 && wc < 0x2128) + c = mac_turkish_page21[wc-0x2120]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_turkish_page22[wc-0x2200]; + else if (wc == 0x25ca) + c = 0xd7; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mac_ukraine.h b/Externals/libiconv-1.14/lib/mac_ukraine.h new file mode 100644 index 0000000000..8ea17b09c9 --- /dev/null +++ b/Externals/libiconv-1.14/lib/mac_ukraine.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MacUkraine + */ + +static const unsigned short mac_ukraine_2uni[128] = { + /* 0x80 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0x90 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xa0 */ + 0x2020, 0x00b0, 0x0490, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, + 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, + /* 0xb0 */ + 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x0491, 0x0408, + 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, + /* 0xc0 */ + 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, + /* 0xd0 */ + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, + 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, + /* 0xe0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xf0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, +}; + +static int +mac_ukraine_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0x80) + *pwc = (ucs4_t) mac_ukraine_2uni[c-0x80]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char mac_ukraine_page00[32] = { + 0xca, 0x00, 0x00, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ + 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char mac_ukraine_page04[152] = { + 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ + 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ + 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ + 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0xa2, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char mac_ukraine_page20[24] = { + 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ + 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_ukraine_page21[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char mac_ukraine_page22[104] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ +}; + +static int +mac_ukraine_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = mac_ukraine_page00[wc-0x00a0]; + else if (wc == 0x00f7) + c = 0xd6; + else if (wc == 0x0192) + c = 0xc4; + else if (wc >= 0x0400 && wc < 0x0498) + c = mac_ukraine_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2028) + c = mac_ukraine_page20[wc-0x2010]; + else if (wc >= 0x2110 && wc < 0x2128) + c = mac_ukraine_page21[wc-0x2110]; + else if (wc >= 0x2200 && wc < 0x2268) + c = mac_ukraine_page22[wc-0x2200]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/mulelao.h b/Externals/libiconv-1.14/lib/mulelao.h new file mode 100644 index 0000000000..abfb5cf0ee --- /dev/null +++ b/Externals/libiconv-1.14/lib/mulelao.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * MULELAO-1 + */ + +static const unsigned short mulelao_2uni[96] = { + /* 0xa0 */ + 0x00a0, 0x0e81, 0x0e82, 0xfffd, 0x0e84, 0xfffd, 0xfffd, 0x0e87, + 0x0e88, 0xfffd, 0x0e8a, 0xfffd, 0xfffd, 0x0e8d, 0xfffd, 0xfffd, + /* 0xb0 */ + 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e94, 0x0e95, 0x0e96, 0x0e97, + 0xfffd, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, + /* 0xc0 */ + 0xfffd, 0x0ea1, 0x0ea2, 0x0ea3, 0xfffd, 0x0ea5, 0xfffd, 0x0ea7, + 0xfffd, 0xfffd, 0x0eaa, 0x0eab, 0xfffd, 0x0ead, 0x0eae, 0x0eaf, + /* 0xd0 */ + 0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, + 0x0eb8, 0x0eb9, 0xfffd, 0x0ebb, 0x0ebc, 0x0ebd, 0xfffd, 0xfffd, + /* 0xe0 */ + 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0xfffd, 0x0ec6, 0xfffd, + 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0xfffd, 0xfffd, + /* 0xf0 */ + 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, + 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x0edc, 0x0edd, 0xfffd, 0xfffd, +}; + +static int +mulelao_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0xa0) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = mulelao_2uni[c-0xa0]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char mulelao_page0e[96] = { + 0x00, 0xa1, 0xa2, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0x80-0x87 */ + 0xa8, 0x00, 0xaa, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x90-0x97 */ + 0x00, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x98-0x9f */ + 0x00, 0xc1, 0xc2, 0xc3, 0x00, 0xc5, 0x00, 0xc7, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xa8-0xaf */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xb0-0xb7 */ + 0xd8, 0xd9, 0x00, 0xdb, 0xdc, 0xdd, 0x00, 0x00, /* 0xb8-0xbf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x00, 0xe6, 0x00, /* 0xc0-0xc7 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x00, 0x00, /* 0xc8-0xcf */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */ + 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ +}; + +static int +mulelao_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x00a0) { + *r = wc; + return 1; + } + else if (wc == 0x00a0) + c = 0xa0; + else if (wc >= 0x0e80 && wc < 0x0ee0) + c = mulelao_page0e[wc-0x0e80]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/nextstep.h b/Externals/libiconv-1.14/lib/nextstep.h new file mode 100644 index 0000000000..ffe41b9170 --- /dev/null +++ b/Externals/libiconv-1.14/lib/nextstep.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * NEXTSTEP + */ + +static const unsigned short nextstep_2uni[128] = { + /* 0x80 */ + 0x00a0, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + /* 0x90 */ + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d9, + 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00b5, 0x00d7, 0x00f7, + /* 0xa0 */ + 0x00a9, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, + 0x00a4, 0x2019, 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, + /* 0xb0 */ + 0x00ae, 0x2013, 0x2020, 0x2021, 0x00b7, 0x00a6, 0x00b6, 0x2022, + 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, 0x00ac, 0x00bf, + /* 0xc0 */ + 0x00b9, 0x02cb, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, + 0x00a8, 0x00b2, 0x02da, 0x00b8, 0x00b3, 0x02dd, 0x02db, 0x02c7, + /* 0xd0 */ + 0x2014, 0x00b1, 0x00bc, 0x00bd, 0x00be, 0x00e0, 0x00e1, 0x00e2, + 0x00e3, 0x00e4, 0x00e5, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, + /* 0xe0 */ + 0x00ec, 0x00c6, 0x00ed, 0x00aa, 0x00ee, 0x00ef, 0x00f0, 0x00f1, + 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00f2, 0x00f3, 0x00f4, 0x00f5, + /* 0xf0 */ + 0x00f6, 0x00e6, 0x00f9, 0x00fa, 0x00fb, 0x0131, 0x00fc, 0x00fd, + 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x00ff, 0xfffd, 0xfffd, +}; + +static int +nextstep_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = nextstep_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char nextstep_page00[96] = { + 0x80, 0xa1, 0xa2, 0xa3, 0xa8, 0xa5, 0xb5, 0xa7, /* 0xa0-0xa7 */ + 0xc8, 0xa0, 0xe3, 0xab, 0xbe, 0x00, 0xb0, 0xc5, /* 0xa8-0xaf */ + 0x00, 0xd1, 0xc9, 0xcc, 0xc2, 0x9d, 0xb6, 0xb4, /* 0xb0-0xb7 */ + 0xcb, 0xc0, 0xeb, 0xbb, 0xd2, 0xd3, 0xd4, 0xbf, /* 0xb8-0xbf */ + 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xe1, 0x87, /* 0xc0-0xc7 */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0xc8-0xcf */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x9e, /* 0xd0-0xd7 */ + 0xe9, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0xfb, /* 0xd8-0xdf */ + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xf1, 0xdb, /* 0xe0-0xe7 */ + 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe4, 0xe5, /* 0xe8-0xef */ + 0xe6, 0xe7, 0xec, 0xed, 0xee, 0xef, 0xf0, 0x9f, /* 0xf0-0xf7 */ + 0xf9, 0xf2, 0xf3, 0xf4, 0xf6, 0xf7, 0xfc, 0xfd, /* 0xf8-0xff */ +}; +static const unsigned char nextstep_page01[104] = { + 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0xe8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0xea, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ +}; +static const unsigned char nextstep_page02[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xcf, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xc6, 0xc7, 0xca, 0xce, 0xc4, 0xcd, 0x00, 0x00, /* 0xd8-0xdf */ +}; +static const unsigned char nextstep_page20[56] = { + 0x00, 0x00, 0x00, 0xb1, 0xd0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0xa9, 0xb8, 0x00, 0xaa, 0xba, 0xb9, 0x00, /* 0x18-0x1f */ + 0xb2, 0xb3, 0xb7, 0x00, 0x00, 0x00, 0xbc, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0xac, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0x40-0x47 */ +}; +static const unsigned char nextstep_pagefb[8] = { + 0x00, 0xae, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ +}; + +static int +nextstep_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x0100) + c = nextstep_page00[wc-0x00a0]; + else if (wc >= 0x0130 && wc < 0x0198) + c = nextstep_page01[wc-0x0130]; + else if (wc >= 0x02c0 && wc < 0x02e0) + c = nextstep_page02[wc-0x02c0]; + else if (wc >= 0x2010 && wc < 0x2048) + c = nextstep_page20[wc-0x2010]; + else if (wc >= 0xfb00 && wc < 0xfb08) + c = nextstep_pagefb[wc-0xfb00]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/pt154.h b/Externals/libiconv-1.14/lib/pt154.h new file mode 100644 index 0000000000..36a5d84fc2 --- /dev/null +++ b/Externals/libiconv-1.14/lib/pt154.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 1999-2005 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * PT154 + */ + +static const unsigned short pt154_2uni[64] = { + /* 0x80 */ + 0x0496, 0x0492, 0x04ee, 0x0493, 0x201e, 0x2026, 0x04b6, 0x04ae, + 0x04b2, 0x04af, 0x04a0, 0x04e2, 0x04a2, 0x049a, 0x04ba, 0x04b8, + /* 0x90 */ + 0x0497, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x04b3, 0x04b7, 0x04a1, 0x04e3, 0x04a3, 0x049b, 0x04bb, 0x04b9, + /* 0xa0 */ + 0x00a0, 0x040e, 0x045e, 0x0408, 0x04e8, 0x0498, 0x04b0, 0x00a7, + 0x0401, 0x00a9, 0x04d8, 0x00ab, 0x00ac, 0x04ef, 0x00ae, 0x049c, + /* 0xb0 */ + 0x00b0, 0x04b1, 0x0406, 0x0456, 0x0499, 0x04e9, 0x00b6, 0x00b7, + 0x0451, 0x2116, 0x04d9, 0x00bb, 0x0458, 0x04aa, 0x04ab, 0x049d, +}; + +static int +pt154_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) + *pwc = (ucs4_t) c; + else if (c >= 0xc0) + *pwc = (ucs4_t) c + 0x0350; + else + *pwc = (ucs4_t) pt154_2uni[c-0x80]; + return 1; +} + +static const unsigned char pt154_page00[32] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xab, 0xac, 0x00, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char pt154_page04[240] = { + 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x00, /* 0x00-0x07 */ + 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, /* 0x08-0x0f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ + 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x00, /* 0x50-0x57 */ + 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x81, 0x83, 0x00, 0x00, 0x80, 0x90, /* 0x90-0x97 */ + 0xa5, 0xb4, 0x8d, 0x9d, 0xaf, 0xbf, 0x00, 0x00, /* 0x98-0x9f */ + 0x8a, 0x9a, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x87, 0x89, /* 0xa8-0xaf */ + 0xa6, 0xb1, 0x88, 0x98, 0x00, 0x00, 0x86, 0x99, /* 0xb0-0xb7 */ + 0x8f, 0x9f, 0x8e, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0xa4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x82, 0xad, /* 0xe8-0xef */ +}; +static const unsigned char pt154_page20[24] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ +}; + +static int +pt154_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = pt154_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x04f0) + c = pt154_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2028) + c = pt154_page20[wc-0x2010]; + else if (wc == 0x2116) + c = 0xb9; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/relocatable.c b/Externals/libiconv-1.14/lib/relocatable.c new file mode 100644 index 0000000000..f4c5eb2d7a --- /dev/null +++ b/Externals/libiconv-1.14/lib/relocatable.c @@ -0,0 +1,483 @@ +/* Provide relocatable packages. + Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + + +/* Tell glibc's to provide a prototype for getline(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#define _GL_USE_STDLIB_ALLOC 1 +#include "config.h" + +/* Specification. */ +#include "relocatable.h" + +#if ENABLE_RELOCATABLE + +#include +#include +#include +#include + +#ifdef NO_XMALLOC +# define xmalloc malloc +#else +# include "xalloc.h" +#endif + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#if DEPENDS_ON_LIBCHARSET +# include +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV +# include +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS +# include +#endif + +/* Faked cheap 'bool'. */ +#undef bool +#undef false +#undef true +#define bool int +#define false 0 +#define true 1 + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +# define FILE_SYSTEM_PREFIX_LEN(P) 0 +#endif + +/* Original installation prefix. */ +static char *orig_prefix; +static size_t orig_prefix_len; +/* Current installation prefix. */ +static char *curr_prefix; +static size_t curr_prefix_len; +/* These prefixes do not end in a slash. Anything that will be concatenated + to them must start with a slash. */ + +/* Sets the original and the current installation prefix of this module. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +static void +set_this_relocation_prefix (const char *orig_prefix_arg, + const char *curr_prefix_arg) +{ + if (orig_prefix_arg != NULL && curr_prefix_arg != NULL + /* Optimization: if orig_prefix and curr_prefix are equal, the + relocation is a nop. */ + && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) + { + /* Duplicate the argument strings. */ + char *memory; + + orig_prefix_len = strlen (orig_prefix_arg); + curr_prefix_len = strlen (curr_prefix_arg); + memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (memory != NULL) +#endif + { + memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); + orig_prefix = memory; + memory += orig_prefix_len + 1; + memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); + curr_prefix = memory; + return; + } + } + orig_prefix = NULL; + curr_prefix = NULL; + /* Don't worry about wasted memory here - this function is usually only + called once. */ +} + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +void +set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) +{ + set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); + + /* Now notify all dependent libraries. */ +#if DEPENDS_ON_LIBCHARSET + libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 + libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix + libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +} + +#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. + Returns it, freshly allocated. Returns NULL upon failure. */ +#ifdef IN_LIBRARY +#define compute_curr_prefix local_compute_curr_prefix +static +#endif +char * +compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname) +{ + char *curr_installdir; + const char *rel_installdir; + + if (curr_pathname == NULL) + return NULL; + + /* Determine the relative installation directory, relative to the prefix. + This is simply the difference between orig_installprefix and + orig_installdir. */ + if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) + != 0) + /* Shouldn't happen - nothing should be installed outside $(prefix). */ + return NULL; + rel_installdir = orig_installdir + strlen (orig_installprefix); + + /* Determine the current installation directory. */ + { + const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname); + const char *p = curr_pathname + strlen (curr_pathname); + char *q; + + while (p > p_base) + { + p--; + if (ISSLASH (*p)) + break; + } + + q = (char *) xmalloc (p - curr_pathname + 1); +#ifdef NO_XMALLOC + if (q == NULL) + return NULL; +#endif + memcpy (q, curr_pathname, p - curr_pathname); + q[p - curr_pathname] = '\0'; + curr_installdir = q; + } + + /* Compute the current installation prefix by removing the trailing + rel_installdir from it. */ + { + const char *rp = rel_installdir + strlen (rel_installdir); + const char *cp = curr_installdir + strlen (curr_installdir); + const char *cp_base = + curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir); + + while (rp > rel_installdir && cp > cp_base) + { + bool same = false; + const char *rpi = rp; + const char *cpi = cp; + + while (rpi > rel_installdir && cpi > cp_base) + { + rpi--; + cpi--; + if (ISSLASH (*rpi) || ISSLASH (*cpi)) + { + if (ISSLASH (*rpi) && ISSLASH (*cpi)) + same = true; + break; + } + /* Do case-insensitive comparison if the file system is always or + often case-insensitive. It's better to accept the comparison + if the difference is only in case, rather than to fail. */ +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ + /* Win32, Cygwin, OS/2, DOS - case insignificant file system */ + if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) + != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) + break; +#else + if (*rpi != *cpi) + break; +#endif + } + if (!same) + break; + /* The last pathname component was the same. opi and cpi now point + to the slash before it. */ + rp = rpi; + cp = cpi; + } + + if (rp > rel_installdir) + { + /* Unexpected: The curr_installdir does not end with rel_installdir. */ + free (curr_installdir); + return NULL; + } + + { + size_t curr_prefix_len = cp - curr_installdir; + char *curr_prefix; + + curr_prefix = (char *) xmalloc (curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (curr_prefix == NULL) + { + free (curr_installdir); + return NULL; + } +#endif + memcpy (curr_prefix, curr_installdir, curr_prefix_len); + curr_prefix[curr_prefix_len] = '\0'; + + free (curr_installdir); + + return curr_prefix; + } + } +} + +#endif /* !IN_LIBRARY || PIC */ + +#if defined PIC && defined INSTALLDIR + +/* Full pathname of shared library, or NULL. */ +static char *shared_library_fullname; + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +/* Native Win32 only. + On Cygwin, it is better to use the Cygwin provided /proc interface, than + to use native Win32 API and cygwin_conv_to_posix_path, because it supports + longer file names + (see ). */ + +/* Determine the full pathname of the shared library when it is loaded. */ + +BOOL WINAPI +DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) +{ + (void) reserved; + + if (event == DLL_PROCESS_ATTACH) + { + /* The DLL is being loaded into an application's address range. */ + static char location[MAX_PATH]; + + if (!GetModuleFileName (module_handle, location, sizeof (location))) + /* Shouldn't happen. */ + return FALSE; + + if (!IS_PATH_WITH_DIR (location)) + /* Shouldn't happen. */ + return FALSE; + + shared_library_fullname = strdup (location); + } + + return TRUE; +} + +#else /* Unix */ + +static void +find_shared_library_fullname () +{ +#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__ + /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline() + function. + Cygwin >= 1.5 has /proc/self/maps and the getline() function too. */ + FILE *fp; + + /* Open the current process' maps file. It describes one VMA per line. */ + fp = fopen ("/proc/self/maps", "r"); + if (fp) + { + unsigned long address = (unsigned long) &find_shared_library_fullname; + for (;;) + { + unsigned long start, end; + int c; + + if (fscanf (fp, "%lx-%lx", &start, &end) != 2) + break; + if (address >= start && address <= end - 1) + { + /* Found it. Now see if this line contains a filename. */ + while (c = getc (fp), c != EOF && c != '\n' && c != '/') + continue; + if (c == '/') + { + size_t size; + int len; + + ungetc (c, fp); + shared_library_fullname = NULL; size = 0; + len = getline (&shared_library_fullname, &size, fp); + if (len >= 0) + { + /* Success: filled shared_library_fullname. */ + if (len > 0 && shared_library_fullname[len - 1] == '\n') + shared_library_fullname[len - 1] = '\0'; + } + } + break; + } + while (c = getc (fp), c != EOF && c != '\n') + continue; + } + fclose (fp); + } +#endif +} + +#endif /* WIN32 / Unix */ + +/* Return the full pathname of the current shared library. + Return NULL if unknown. + Guaranteed to work only on Linux, Cygwin and Woe32. */ +static char * +get_shared_library_fullname () +{ +#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) + static bool tried_find_shared_library_fullname; + if (!tried_find_shared_library_fullname) + { + find_shared_library_fullname (); + tried_find_shared_library_fullname = true; + } +#endif + return shared_library_fullname; +} + +#endif /* PIC */ + +/* Returns the pathname, relocated according to the current installation + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ +const char * +relocate (const char *pathname) +{ +#if defined PIC && defined INSTALLDIR + static int initialized; + + /* Initialization code for a shared library. */ + if (!initialized) + { + /* At this point, orig_prefix and curr_prefix likely have already been + set through the main program's set_program_name_and_installdir + function. This is sufficient in the case that the library has + initially been installed in the same orig_prefix. But we can do + better, to also cover the cases that 1. it has been installed + in a different prefix before being moved to orig_prefix and (later) + to curr_prefix, 2. unlike the program, it has not moved away from + orig_prefix. */ + const char *orig_installprefix = INSTALLPREFIX; + const char *orig_installdir = INSTALLDIR; + char *curr_prefix_better; + + curr_prefix_better = + compute_curr_prefix (orig_installprefix, orig_installdir, + get_shared_library_fullname ()); + + set_relocation_prefix (orig_installprefix, + curr_prefix_better != NULL + ? curr_prefix_better + : curr_prefix); + + if (curr_prefix_better != NULL) + free (curr_prefix_better); + + initialized = 1; + } +#endif + + /* Note: It is not necessary to perform case insensitive comparison here, + even for DOS-like file systems, because the pathname argument was + typically created from the same Makefile variable as orig_prefix came + from. */ + if (orig_prefix != NULL && curr_prefix != NULL + && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) + { + if (pathname[orig_prefix_len] == '\0') + { + /* pathname equals orig_prefix. */ + char *result = (char *) xmalloc (strlen (curr_prefix) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + strcpy (result, curr_prefix); + return result; + } + } + else if (ISSLASH (pathname[orig_prefix_len])) + { + /* pathname starts with orig_prefix. */ + const char *pathname_tail = &pathname[orig_prefix_len]; + char *result = + (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + memcpy (result, curr_prefix, curr_prefix_len); + strcpy (result + curr_prefix_len, pathname_tail); + return result; + } + } + } + /* Nothing to relocate. */ + return pathname; +} + +#endif diff --git a/Externals/libiconv-1.14/lib/relocatable.h b/Externals/libiconv-1.14/lib/relocatable.h new file mode 100644 index 0000000000..68fe83ebd4 --- /dev/null +++ b/Externals/libiconv-1.14/lib/relocatable.h @@ -0,0 +1,83 @@ +/* Provide relocatable packages. + Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _RELOCATABLE_H +#define _RELOCATABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* This can be enabled through the configure --enable-relocatable option. */ +#if ENABLE_RELOCATABLE + +/* When building a DLL, we must export some functions. Note that because + this is a private .h file, we don't need to use __declspec(dllimport) + in any case. */ +#if HAVE_VISIBILITY && BUILDING_DLL +# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default"))) +#elif defined _MSC_VER && BUILDING_DLL +# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) +#else +# define RELOCATABLE_DLL_EXPORTED +#endif + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +extern RELOCATABLE_DLL_EXPORTED void + set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + +/* Returns the pathname, relocated according to the current installation + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ +extern const char * relocate (const char *pathname); + +/* Memory management: relocate() potentially allocates memory, because it has + to construct a fresh pathname. If this is a problem because your program + calls relocate() frequently, think about caching the result. Or free the + return value if it was different from the argument pathname. */ + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. + Returns it, freshly allocated. Returns NULL upon failure. */ +extern char * compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname); + +#else + +/* By default, we use the hardwired pathnames. */ +#define relocate(pathname) (pathname) + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _RELOCATABLE_H */ diff --git a/Externals/libiconv-1.14/lib/riscos1.h b/Externals/libiconv-1.14/lib/riscos1.h new file mode 100644 index 0000000000..2ebc751341 --- /dev/null +++ b/Externals/libiconv-1.14/lib/riscos1.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * RISCOS-LATIN1 + */ + +static const unsigned short riscos1_2uni[32] = { + /* 0x80 */ + 0x221a, 0x0174, 0x0175, 0x0083, 0x2573, 0x0176, 0x0177, 0x0087, + 0x21e6, 0x21e8, 0x21e9, 0x21e7, 0x2026, 0x2122, 0x2030, 0x2022, + /* 0x90 */ + 0x2018, 0x2019, 0x2039, 0x203a, 0x201c, 0x201d, 0x201e, 0x2013, + 0x2014, 0x2212, 0x0152, 0x0153, 0x2020, 0x2021, 0xfb01, 0xfb02, +}; + +static int +riscos1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c >= 0x80 && c < 0xa0) + *pwc = (ucs4_t) riscos1_2uni[c-0x80]; + else + *pwc = (ucs4_t) c; + return 1; +} + +static const unsigned char riscos1_page01[40] = { + 0x00, 0x00, 0x9a, 0x9b, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x81, 0x82, 0x85, 0x86, /* 0x70-0x77 */ +}; +static const unsigned char riscos1_page20[48] = { + 0x00, 0x00, 0x00, 0x97, 0x98, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x90, 0x91, 0x00, 0x00, 0x94, 0x95, 0x96, 0x00, /* 0x18-0x1f */ + 0x9c, 0x9d, 0x8f, 0x00, 0x00, 0x00, 0x8c, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x92, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; +static const unsigned char riscos1_page21[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x8b, /* 0xe0-0xe7 */ + 0x89, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char riscos1_page22[16] = { + 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ +}; + +static int +riscos1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080 || wc == 0x0083 || wc == 0x0087 || (wc >= 0x00a0 && wc < 0x0100)) { + *r = wc; + return 1; + } + else if (wc >= 0x0150 && wc < 0x0178) + c = riscos1_page01[wc-0x0150]; + else if (wc >= 0x2010 && wc < 0x2040) + c = riscos1_page20[wc-0x2010]; + else if (wc == 0x2122) + c = 0x8d; + else if (wc >= 0x21e0 && wc < 0x21f0) + c = riscos1_page21[wc-0x21e0]; + else if (wc >= 0x2210 && wc < 0x2220) + c = riscos1_page22[wc-0x2210]; + else if (wc == 0x2573) + c = 0x84; + else if (wc >= 0xfb01 && wc < 0xfb03) + c = wc-0xfa63; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/rk1048.h b/Externals/libiconv-1.14/lib/rk1048.h new file mode 100644 index 0000000000..0e1fde8971 --- /dev/null +++ b/Externals/libiconv-1.14/lib/rk1048.h @@ -0,0 +1,145 @@ +/* + * Copyright (C) 1999-2007 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * RK1048 + */ + +static const unsigned short rk1048_2uni[128] = { + /* 0x80 */ + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, + 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x049a, 0x04ba, 0x040f, + /* 0x90 */ + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x049b, 0x04bb, 0x045f, + /* 0xa0 */ + 0x00a0, 0x04b0, 0x04b1, 0x04d8, 0x00a4, 0x04e8, 0x00a6, 0x00a7, + 0x0401, 0x00a9, 0x0492, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x04ae, + /* 0xb0 */ + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x04e9, 0x00b5, 0x00b6, 0x00b7, + 0x0451, 0x2116, 0x0493, 0x00bb, 0x04d9, 0x04a2, 0x04a3, 0x04af, + /* 0xc0 */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + /* 0xd0 */ + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + /* 0xe0 */ + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + /* 0xf0 */ + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, +}; + +static int +rk1048_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else { + unsigned short wc = rk1048_2uni[c-0x80]; + if (wc != 0xfffd) { + *pwc = (ucs4_t) wc; + return 1; + } + } + return RET_ILSEQ; +} + +static const unsigned char rk1048_page00[32] = { + 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ + 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ + 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ +}; +static const unsigned char rk1048_page04[240] = { + 0x00, 0xa8, 0x80, 0x81, 0x00, 0x00, 0xb2, 0x00, /* 0x00-0x07 */ + 0x00, 0x8a, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x8f, /* 0x08-0x0f */ + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ + 0x00, 0xb8, 0x90, 0x83, 0x00, 0x00, 0xb3, 0x00, /* 0x50-0x57 */ + 0x00, 0x9a, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x8d, 0x9d, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, /* 0xa8-0xaf */ + 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x8e, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ + 0xa3, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ +}; +static const unsigned char rk1048_page20[48] = { + 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ + 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ +}; +static const unsigned char rk1048_page21[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; + +static int +rk1048_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x00c0) + c = rk1048_page00[wc-0x00a0]; + else if (wc >= 0x0400 && wc < 0x04f0) + c = rk1048_page04[wc-0x0400]; + else if (wc >= 0x2010 && wc < 0x2040) + c = rk1048_page20[wc-0x2010]; + else if (wc == 0x20ac) + c = 0x88; + else if (wc >= 0x2110 && wc < 0x2128) + c = rk1048_page21[wc-0x2110]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/shift_jisx0213.h b/Externals/libiconv-1.14/lib/shift_jisx0213.h new file mode 100644 index 0000000000..05f00b00b0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/shift_jisx0213.h @@ -0,0 +1,310 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * SHIFT_JISX0213 + */ + +/* The structure of Shift_JISX0213 is as follows: + + 0x00..0x7F: ISO646-JP, an ASCII variant + + 0x{A1..DF}: JISX0201 Katakana. + + 0x{81..9F,E0..EF}{40..7E,80..FC}: JISX0213 plane 1. + + 0x{F0..FC}{40..7E,80..FC}: JISX0213 plane 2, with irregular row mapping. + + Note that some JISX0213 characters are not contained in Unicode 3.2 + and are therefore best represented as sequences of Unicode characters. +*/ + +#include "jisx0213.h" +#include "flushwc.h" + +static int +shift_jisx0213_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + ucs4_t last_wc = conv->istate; + if (last_wc) { + /* Output the buffered character. */ + conv->istate = 0; + *pwc = last_wc; + return 0; /* Don't advance the input pointer. */ + } else { + unsigned char c = *s; + if (c < 0x80) { + /* Plain ISO646-JP character. */ + if (c == 0x5c) + *pwc = (ucs4_t) 0x00a5; + else if (c == 0x7e) + *pwc = (ucs4_t) 0x203e; + else + *pwc = (ucs4_t) c; + return 1; + } else if (c >= 0xa1 && c <= 0xdf) { + *pwc = c + 0xfec0; + return 1; + } else { + if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)) { + /* Two byte character. */ + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x40 && c2 <= 0x7e) || (c2 >= 0x80 && c2 <= 0xfc)) { + unsigned int c1; + ucs4_t wc; + /* Convert to row and column. */ + if (c < 0xe0) + c -= 0x81; + else + c -= 0xc1; + if (c2 < 0x80) + c2 -= 0x40; + else + c2 -= 0x41; + /* Now 0 <= c <= 0x3b, 0 <= c2 <= 0xbb. */ + c1 = 2 * c; + if (c2 >= 0x5e) + c2 -= 0x5e, c1++; + c2 += 0x21; + if (c1 >= 0x5e) { + /* Handling of JISX 0213 plane 2 rows. */ + if (c1 >= 0x67) + c1 += 230; + else if (c1 >= 0x63 || c1 == 0x5f) + c1 += 168; + else + c1 += 162; + } + wc = jisx0213_to_ucs4(0x121+c1,c2); + if (wc) { + if (wc < 0x80) { + /* It's a combining character. */ + ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; + ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; + /* We cannot output two Unicode characters at once. So, + output the first character and buffer the second one. */ + *pwc = wc1; + conv->istate = wc2; + } else + *pwc = wc; + return 2; + } + } + } else + return RET_TOOFEW(0); + } + return RET_ILSEQ; + } + } +} + +#define shift_jisx0213_flushwc normal_flushwc + +/* Composition tables for each of the relevant combining characters. */ +static const struct { unsigned short base; unsigned short composed; } shift_jisx0213_comp_table_data[] = { +#define shift_jisx0213_comp_table02e5_idx 0 +#define shift_jisx0213_comp_table02e5_len 1 + { 0x8684, 0x8685 }, /* 0x12B65 = 0x12B64 U+02E5 */ +#define shift_jisx0213_comp_table02e9_idx (shift_jisx0213_comp_table02e5_idx+shift_jisx0213_comp_table02e5_len) +#define shift_jisx0213_comp_table02e9_len 1 + { 0x8680, 0x8686 }, /* 0x12B66 = 0x12B60 U+02E9 */ +#define shift_jisx0213_comp_table0300_idx (shift_jisx0213_comp_table02e9_idx+shift_jisx0213_comp_table02e9_len) +#define shift_jisx0213_comp_table0300_len 5 + { 0x857b, 0x8663 }, /* 0x12B44 = 0x1295C U+0300 */ + { 0x8657, 0x8667 }, /* 0x12B48 = 0x12B38 U+0300 */ + { 0x8656, 0x8669 }, /* 0x12B4A = 0x12B37 U+0300 */ + { 0x864f, 0x866b }, /* 0x12B4C = 0x12B30 U+0300 */ + { 0x8662, 0x866d }, /* 0x12B4E = 0x12B43 U+0300 */ +#define shift_jisx0213_comp_table0301_idx (shift_jisx0213_comp_table0300_idx+shift_jisx0213_comp_table0300_len) +#define shift_jisx0213_comp_table0301_len 4 + { 0x8657, 0x8668 }, /* 0x12B49 = 0x12B38 U+0301 */ + { 0x8656, 0x866a }, /* 0x12B4B = 0x12B37 U+0301 */ + { 0x864f, 0x866c }, /* 0x12B4D = 0x12B30 U+0301 */ + { 0x8662, 0x866e }, /* 0x12B4F = 0x12B43 U+0301 */ +#define shift_jisx0213_comp_table309a_idx (shift_jisx0213_comp_table0301_idx+shift_jisx0213_comp_table0301_len) +#define shift_jisx0213_comp_table309a_len 14 + { 0x82a9, 0x82f5 }, /* 0x12477 = 0x1242B U+309A */ + { 0x82ab, 0x82f6 }, /* 0x12478 = 0x1242D U+309A */ + { 0x82ad, 0x82f7 }, /* 0x12479 = 0x1242F U+309A */ + { 0x82af, 0x82f8 }, /* 0x1247A = 0x12431 U+309A */ + { 0x82b1, 0x82f9 }, /* 0x1247B = 0x12433 U+309A */ + { 0x834a, 0x8397 }, /* 0x12577 = 0x1252B U+309A */ + { 0x834c, 0x8398 }, /* 0x12578 = 0x1252D U+309A */ + { 0x834e, 0x8399 }, /* 0x12579 = 0x1252F U+309A */ + { 0x8350, 0x839a }, /* 0x1257A = 0x12531 U+309A */ + { 0x8352, 0x839b }, /* 0x1257B = 0x12533 U+309A */ + { 0x835a, 0x839c }, /* 0x1257C = 0x1253B U+309A */ + { 0x8363, 0x839d }, /* 0x1257D = 0x12544 U+309A */ + { 0x8367, 0x839e }, /* 0x1257E = 0x12548 U+309A */ + { 0x83f3, 0x83f6 }, /* 0x12678 = 0x12675 U+309A */ +}; + +static int +shift_jisx0213_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + int count = 0; + unsigned short lasttwo = conv->ostate; + + if (lasttwo) { + /* Attempt to combine the last character with this one. */ + unsigned int idx; + unsigned int len; + + if (wc == 0x02e5) + idx = shift_jisx0213_comp_table02e5_idx, + len = shift_jisx0213_comp_table02e5_len; + else if (wc == 0x02e9) + idx = shift_jisx0213_comp_table02e9_idx, + len = shift_jisx0213_comp_table02e9_len; + else if (wc == 0x0300) + idx = shift_jisx0213_comp_table0300_idx, + len = shift_jisx0213_comp_table0300_len; + else if (wc == 0x0301) + idx = shift_jisx0213_comp_table0301_idx, + len = shift_jisx0213_comp_table0301_len; + else if (wc == 0x309a) + idx = shift_jisx0213_comp_table309a_idx, + len = shift_jisx0213_comp_table309a_len; + else + goto not_combining; + + do + if (shift_jisx0213_comp_table_data[idx].base == lasttwo) + break; + while (++idx, --len > 0); + + if (len > 0) { + /* Output the combined character. */ + if (n >= 2) { + lasttwo = shift_jisx0213_comp_table_data[idx].composed; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + conv->ostate = 0; + return 2; + } else + return RET_TOOSMALL; + } + + not_combining: + /* Output the buffered character. */ + if (n < 2) + return RET_TOOSMALL; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + r += 2; + count = 2; + } + + if (wc < 0x80 && wc != 0x5c && wc != 0x7e) { + /* Plain ISO646-JP character. */ + if (n > count) { + r[0] = (unsigned char) wc; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else if (wc == 0x00a5) { + if (n > count) { + r[0] = 0x5c; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else if (wc == 0x203e) { + if (n > count) { + r[0] = 0x7e; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else if (wc >= 0xff61 && wc <= 0xff9f) { + /* Half-width katakana. */ + if (n > count) { + r[0] = wc - 0xfec0; + conv->ostate = 0; + return count+1; + } else + return RET_TOOSMALL; + } else { + unsigned int s1, s2; + unsigned short jch = ucs4_to_jisx0213(wc); + if (jch != 0) { + /* Convert it to shifted representation. */ + s1 = jch >> 8; + s2 = jch & 0x7f; + s1 -= 0x21; + s2 -= 0x21; + if (s1 >= 0x5e) { + /* Handling of JISX 0213 plane 2 rows. */ + if (s1 >= 0xcd) /* rows 0x26E..0x27E */ + s1 -= 102; + else if (s1 >= 0x8b || s1 == 0x87) /* rows 0x228, 0x22C..0x22F */ + s1 -= 40; + else /* rows 0x221, 0x223..0x225 */ + s1 -= 34; + /* Now 0x5e <= s1 <= 0x77. */ + } + if (s1 & 1) + s2 += 0x5e; + s1 = s1 >> 1; + if (s1 < 0x1f) + s1 += 0x81; + else + s1 += 0xc1; + if (s2 < 0x3f) + s2 += 0x40; + else + s2 += 0x41; + if (jch & 0x0080) { + /* A possible match in comp_table_data. We have to buffer it. */ + /* We know it's a JISX 0213 plane 1 character. */ + if (jch & 0x8000) abort(); + conv->ostate = (s1 << 8) | s2; + return count+0; + } + /* Output the shifted representation. */ + if (n >= count+2) { + r[0] = s1; + r[1] = s2; + conv->ostate = 0; + return count+2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; + } +} + +static int +shift_jisx0213_reset (conv_t conv, unsigned char *r, int n) +{ + state_t lasttwo = conv->ostate; + + if (lasttwo) { + if (n < 2) + return RET_TOOSMALL; + r[0] = (lasttwo >> 8) & 0xff; + r[1] = lasttwo & 0xff; + /* conv->ostate = 0; will be done by the caller */ + return 2; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/sjis.h b/Externals/libiconv-1.14/lib/sjis.h new file mode 100644 index 0000000000..8244e3a87c --- /dev/null +++ b/Externals/libiconv-1.14/lib/sjis.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * SHIFT_JIS + */ + +/* + Conversion between SJIS codes (s1,s2) and JISX0208 codes (c1,c2): + Example. (s1,s2) = 0x8140, (c1,c2) = 0x2121. + 0x81 <= s1 <= 0x9F || 0xE0 <= s1 <= 0xEA, + 0x40 <= s2 <= 0x7E || 0x80 <= s2 <= 0xFC, + 0x21 <= c1 <= 0x74, 0x21 <= c2 <= 0x7E. + Invariant: + 94*2*(s1 < 0xE0 ? s1-0x81 : s1-0xC1) + (s2 < 0x80 ? s2-0x40 : s2-0x41) + = 94*(c1-0x21)+(c2-0x21) + Conversion (s1,s2) -> (c1,c2): + t1 := (s1 < 0xE0 ? s1-0x81 : s1-0xC1) + t2 := (s2 < 0x80 ? s2-0x40 : s2-0x41) + c1 := 2*t1 + (t2 < 0x5E ? 0 : 1) + 0x21 + c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 + Conversion (c1,c2) -> (s1,s2): + t1 := (c1 - 0x21) >> 1 + t2 := ((c1 - 0x21) & 1) * 0x5E + (c2 - 0x21) + s1 := (t1 < 0x1F ? t1+0x81 : t1+0xC1) + s2 := (t2 < 0x3F ? t2+0x40 : t2+0x41) + */ + +static int +sjis_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80 || (c >= 0xa1 && c <= 0xdf)) + return jisx0201_mbtowc(conv,pwc,s,n); + else { + unsigned char s1, s2; + s1 = c; + if ((s1 >= 0x81 && s1 <= 0x9f) || (s1 >= 0xe0 && s1 <= 0xea)) { + if (n < 2) + return RET_TOOFEW(0); + s2 = s[1]; + if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { + unsigned char t1 = (s1 < 0xe0 ? s1-0x81 : s1-0xc1); + unsigned char t2 = (s2 < 0x80 ? s2-0x40 : s2-0x41); + unsigned char buf[2]; + buf[0] = 2*t1 + (t2 < 0x5e ? 0 : 1) + 0x21; + buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; + return jisx0208_mbtowc(conv,pwc,buf,2); + } + } else if (s1 >= 0xf0 && s1 <= 0xf9) { + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + if (n < 2) + return RET_TOOFEW(0); + s2 = s[1]; + if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { + *pwc = 0xe000 + 188*(s1 - 0xf0) + (s2 < 0x80 ? s2-0x40 : s2-0x41); + return 2; + } + } + return RET_ILSEQ; + } +} + +static int +sjis_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char buf[2]; + int ret; + + /* Try JIS X 0201-1976. */ + ret = jisx0201_wctomb(conv,buf,wc,1); + if (ret != RET_ILUNI) { + unsigned char c; + if (ret != 1) abort(); + c = buf[0]; + if (c < 0x80 || (c >= 0xa1 && c <= 0xdf)) { + r[0] = c; + return 1; + } + } + + /* Try JIS X 0208-1990. */ + ret = jisx0208_wctomb(conv,buf,wc,2); + if (ret != RET_ILUNI) { + unsigned char c1, c2; + if (ret != 2) abort(); + if (n < 2) + return RET_TOOSMALL; + c1 = buf[0]; + c2 = buf[1]; + if ((c1 >= 0x21 && c1 <= 0x74) && (c2 >= 0x21 && c2 <= 0x7e)) { + unsigned char t1 = (c1 - 0x21) >> 1; + unsigned char t2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21); + r[0] = (t1 < 0x1f ? t1+0x81 : t1+0xc1); + r[1] = (t2 < 0x3f ? t2+0x40 : t2+0x41); + return 2; + } + } + + /* User-defined range. See + * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ + if (wc >= 0xe000 && wc < 0xe758) { + unsigned char c1, c2; + if (n < 2) + return RET_TOOSMALL; + c1 = (unsigned int) (wc - 0xe000) / 188; + c2 = (unsigned int) (wc - 0xe000) % 188; + r[0] = c1+0xf0; + r[1] = (c2 < 0x3f ? c2+0x40 : c2+0x41); + return 2; + } + + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/tcvn.h b/Externals/libiconv-1.14/lib/tcvn.h new file mode 100644 index 0000000000..abd5def22c --- /dev/null +++ b/Externals/libiconv-1.14/lib/tcvn.h @@ -0,0 +1,291 @@ +/* + * Copyright (C) 1999-2002, 2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * TCVN-5712 + */ + +#include "flushwc.h" +#include "vietcomb.h" + +static const unsigned char tcvn_comb_table[] = { + 0xb0, 0xb3, 0xb2, 0xb1, 0xb4, +}; + +/* The possible bases in viet_comp_table_data: + 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, + 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, + 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00C2, 0x00CA, 0x00D3..0x00D6, + 0x00DA, 0x00E2, 0x00EA, 0x00F3..0x00F6, 0x00FA, 0x0102..0x0103, + 0x0168..0x0169, 0x01A0..0x01A1, 0x01AF..0x01B0. */ +static const unsigned int tcvn_comp_bases[] = { + 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000020, 0x04780404, 0x04780404, + 0x0000000c, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00018003 +}; + +static const unsigned short tcvn_2uni_1[24] = { + /* 0x00 */ + 0x0000, 0x00da, 0x1ee4, 0x0003, 0x1eea, 0x1eec, 0x1eee, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + /* 0x10 */ + 0x0010, 0x1ee8, 0x1ef0, 0x1ef2, 0x1ef6, 0x1ef8, 0x00dd, 0x1ef4, +}; +static const unsigned short tcvn_2uni_2[128] = { + /* 0x80 */ + 0x00c0, 0x1ea2, 0x00c3, 0x00c1, 0x1ea0, 0x1eb6, 0x1eac, 0x00c8, + 0x1eba, 0x1ebc, 0x00c9, 0x1eb8, 0x1ec6, 0x00cc, 0x1ec8, 0x0128, + /* 0x90 */ + 0x00cd, 0x1eca, 0x00d2, 0x1ece, 0x00d5, 0x00d3, 0x1ecc, 0x1ed8, + 0x1edc, 0x1ede, 0x1ee0, 0x1eda, 0x1ee2, 0x00d9, 0x1ee6, 0x0168, + /* 0xa0 */ + 0x00a0, 0x0102, 0x00c2, 0x00ca, 0x00d4, 0x01a0, 0x01af, 0x0110, + 0x0103, 0x00e2, 0x00ea, 0x00f4, 0x01a1, 0x01b0, 0x0111, 0x1eb0, + /* 0xb0 */ + 0x0300, 0x0309, 0x0303, 0x0301, 0x0323, 0x00e0, 0x1ea3, 0x00e3, + 0x00e1, 0x1ea1, 0x1eb2, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eaf, 0x1eb4, + /* 0xc0 */ + 0x1eae, 0x1ea6, 0x1ea8, 0x1eaa, 0x1ea4, 0x1ec0, 0x1eb7, 0x1ea7, + 0x1ea9, 0x1eab, 0x1ea5, 0x1ead, 0x00e8, 0x1ec2, 0x1ebb, 0x1ebd, + /* 0xd0 */ + 0x00e9, 0x1eb9, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ebf, 0x1ec7, 0x00ec, + 0x1ec9, 0x1ec4, 0x1ebe, 0x1ed2, 0x0129, 0x00ed, 0x1ecb, 0x00f2, + /* 0xe0 */ + 0x1ed4, 0x1ecf, 0x00f5, 0x00f3, 0x1ecd, 0x1ed3, 0x1ed5, 0x1ed7, + 0x1ed1, 0x1ed9, 0x1edd, 0x1edf, 0x1ee1, 0x1edb, 0x1ee3, 0x00f9, + /* 0xf0 */ + 0x1ed6, 0x1ee7, 0x0169, 0x00fa, 0x1ee5, 0x1eeb, 0x1eed, 0x1eef, + 0x1ee9, 0x1ef1, 0x1ef3, 0x1ef7, 0x1ef9, 0x00fd, 0x1ef5, 0x1ed0, +}; + +/* In the TCVN to Unicode direction, the state contains a buffered + character, or 0 if none. */ + +static int +tcvn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + unsigned short wc; + unsigned short last_wc; + if (c < 0x18) + wc = tcvn_2uni_1[c]; + else if (c < 0x80) + wc = c; + else + wc = tcvn_2uni_2[c-0x80]; + last_wc = conv->istate; + if (last_wc) { + if (wc >= 0x0300 && wc < 0x0340) { + /* See whether last_wc and wc can be combined. */ + unsigned int k; + unsigned int i1, i2; + switch (wc) { + case 0x0300: k = 0; break; + case 0x0301: k = 1; break; + case 0x0303: k = 2; break; + case 0x0309: k = 3; break; + case 0x0323: k = 4; break; + default: abort(); + } + i1 = viet_comp_table[k].idx; + i2 = i1 + viet_comp_table[k].len-1; + if (last_wc >= viet_comp_table_data[i1].base + && last_wc <= viet_comp_table_data[i2].base) { + unsigned int i; + for (;;) { + i = (i1+i2)>>1; + if (last_wc == viet_comp_table_data[i].base) + break; + if (last_wc < viet_comp_table_data[i].base) { + if (i1 == i) + goto not_combining; + i2 = i; + } else { + if (i1 != i) + i1 = i; + else { + i = i2; + if (last_wc == viet_comp_table_data[i].base) + break; + goto not_combining; + } + } + } + last_wc = viet_comp_table_data[i].composed; + /* Output the combined character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 1; + } + } + not_combining: + /* Output the buffered character. */ + conv->istate = 0; + *pwc = (ucs4_t) last_wc; + return 0; /* Don't advance the input pointer. */ + } + if (wc >= 0x0041 && wc <= 0x01b0 + && ((tcvn_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { + /* wc is a possible match in viet_comp_table_data. Buffer it. */ + conv->istate = wc; + return RET_TOOFEW(1); + } else { + /* Output wc immediately. */ + *pwc = (ucs4_t) wc; + return 1; + } +} + +#define tcvn_flushwc normal_flushwc + +static const unsigned char tcvn_page00[96+184] = { + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ + 0x80, 0x83, 0xa2, 0x82, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0x87, 0x8a, 0xa3, 0x00, 0x8d, 0x90, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x92, 0x95, 0xa4, 0x94, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x9d, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00, /* 0xd8-0xdf */ + 0xb5, 0xb8, 0xa9, 0xb7, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0xcc, 0xd0, 0xaa, 0x00, 0xd7, 0xdd, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0xdf, 0xe3, 0xab, 0xe2, 0x00, 0x00, /* 0xf0-0xf7 */ + 0x00, 0xef, 0xf3, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xa1, 0xa8, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xa7, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0x8f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x9f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xa5, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, /* 0xa8-0xaf */ + 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ +}; +static const unsigned char tcvn_page03[40] = { + 0xb0, 0xb3, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ +}; +static const unsigned char tcvn_page1e[96] = { + 0x84, 0xb9, 0x81, 0xb6, 0xc4, 0xca, 0xc1, 0xc7, /* 0xa0-0xa7 */ + 0xc2, 0xc8, 0xc3, 0xc9, 0x86, 0xcb, 0xc0, 0xbe, /* 0xa8-0xaf */ + 0xaf, 0xbb, 0xba, 0xbc, 0xbf, 0xbd, 0x85, 0xc6, /* 0xb0-0xb7 */ + 0x8b, 0xd1, 0x88, 0xce, 0x89, 0xcf, 0xda, 0xd5, /* 0xb8-0xbf */ + 0xc5, 0xd2, 0xcd, 0xd3, 0xd9, 0xd4, 0x8c, 0xd6, /* 0xc0-0xc7 */ + 0x8e, 0xd8, 0x91, 0xde, 0x96, 0xe4, 0x93, 0xe1, /* 0xc8-0xcf */ + 0xff, 0xe8, 0xdb, 0xe5, 0xe0, 0xe6, 0xf0, 0xe7, /* 0xd0-0xd7 */ + 0x97, 0xe9, 0x9b, 0xed, 0x98, 0xea, 0x99, 0xeb, /* 0xd8-0xdf */ + 0x9a, 0xec, 0x9c, 0xee, 0x02, 0xf4, 0x9e, 0xf1, /* 0xe0-0xe7 */ + 0x11, 0xf8, 0x04, 0xf5, 0x05, 0xf6, 0x06, 0xf7, /* 0xe8-0xef */ + 0x12, 0xf9, 0x13, 0xfa, 0x17, 0xfe, 0x14, 0xfb, /* 0xf0-0xf7 */ + 0x15, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; + +static int +tcvn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080 && (wc >= 0x0020 || (0x00fe0076 & (1 << wc)) == 0)) { + *r = wc; + return 1; + } + else if (wc >= 0x00a0 && wc < 0x01b8) + c = tcvn_page00[wc-0x00a0]; + else if (wc >= 0x0300 && wc < 0x0328) + c = tcvn_page03[wc-0x0300]; + else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ + c = tcvn_page03[wc-0x0340]; + else if (wc >= 0x1ea0 && wc < 0x1f00) + c = tcvn_page1e[wc-0x1ea0]; + if (c != 0) { + *r = c; + return 1; + } + /* Try compatibility or canonical decomposition. */ + { + /* Binary search through viet_decomp_table. */ + unsigned int i1 = 0; + unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; + if (wc >= viet_decomp_table[i1].composed + && wc <= viet_decomp_table[i2].composed) { + unsigned int i; + for (;;) { + /* Here i2 - i1 > 0. */ + i = (i1+i2)>>1; + if (wc == viet_decomp_table[i].composed) + break; + if (wc < viet_decomp_table[i].composed) { + if (i1 == i) + return RET_ILUNI; + /* Here i1 < i < i2. */ + i2 = i; + } else { + /* Here i1 <= i < i2. */ + if (i1 != i) + i1 = i; + else { + /* Here i2 - i1 = 1. */ + i = i2; + if (wc == viet_decomp_table[i].composed) + break; + else + return RET_ILUNI; + } + } + } + /* Found a compatibility or canonical decomposition. */ + wc = viet_decomp_table[i].base; + /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, + 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, + 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, + 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, + 0x01a1, 0x01af, 0x01b0. */ + if (wc < 0x0080) + c = wc; + else { + c = tcvn_page00[wc-0x00a0]; + if (c == 0) + return RET_ILUNI; + } + if (n < 2) + return RET_TOOSMALL; + r[0] = c; + r[1] = tcvn_comb_table[viet_decomp_table[i].comb1]; + return 2; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/tds565.h b/Externals/libiconv-1.14/lib/tds565.h new file mode 100644 index 0000000000..479513fedf --- /dev/null +++ b/Externals/libiconv-1.14/lib/tds565.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 1999-2002 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * TDS565 + */ + +static const unsigned short tds565_2uni[64] = { + /* 0x40 */ + 0x0040, 0x0041, 0x0042, 0x00c7, 0x0044, 0x0045, 0x00c4, 0x0046, + 0x0047, 0x0048, 0x0049, 0x004a, 0x017d, 0x004b, 0x004c, 0x004d, + /* 0x50 */ + 0x004e, 0x0147, 0x004f, 0x00d6, 0x0050, 0x0052, 0x0053, 0x015e, + 0x0054, 0x0055, 0x00dc, 0x0057, 0x0059, 0x00dd, 0x005a, 0x005f, + /* 0x60 */ + 0x2116, 0x0061, 0x0062, 0x00e7, 0x0064, 0x0065, 0x00e4, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006a, 0x017e, 0x006b, 0x006c, 0x006d, + /* 0x70 */ + 0x006e, 0x0148, 0x006f, 0x00f6, 0x0070, 0x0072, 0x0073, 0x015f, + 0x0074, 0x0075, 0x00fc, 0x0077, 0x0079, 0x00fd, 0x007a, 0x007f, +}; + +static int +tds565_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x40) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c < 0x80) { + *pwc = (ucs4_t) tds565_2uni[c-0x40]; + return 1; + } + return RET_ILSEQ; +} + +static const unsigned char tds565_page00[64] = { + 0x40, 0x41, 0x42, 0x00, 0x44, 0x45, 0x47, 0x48, /* 0x40-0x47 */ + 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x52, /* 0x48-0x4f */ + 0x54, 0x00, 0x55, 0x56, 0x58, 0x59, 0x00, 0x5b, /* 0x50-0x57 */ + 0x00, 0x5c, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x5f, /* 0x58-0x5f */ + 0x00, 0x61, 0x62, 0x00, 0x64, 0x65, 0x67, 0x68, /* 0x60-0x67 */ + 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70, 0x72, /* 0x68-0x6f */ + 0x74, 0x00, 0x75, 0x76, 0x78, 0x79, 0x00, 0x7b, /* 0x70-0x77 */ + 0x00, 0x7c, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7f, /* 0x78-0x7f */ +}; +static const unsigned char tds565_page00_1[64] = { + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x43, /* 0xc0-0xc7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, /* 0xd0-0xd7 */ + 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5d, 0x00, 0x00, /* 0xd8-0xdf */ + 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x63, /* 0xe0-0xe7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, /* 0xf0-0xf7 */ + 0x00, 0x00, 0x00, 0x00, 0x7a, 0x7d, 0x00, 0x00, /* 0xf8-0xff */ +}; +static const unsigned char tds565_page01[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, /* 0x40-0x47 */ + 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x77, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6c, 0x00, /* 0x78-0x7f */ +}; + +static int +tds565_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0040) { + *r = wc; + return 1; + } + else if (wc >= 0x0040 && wc < 0x0080) + c = tds565_page00[wc-0x0040]; + else if (wc >= 0x00c0 && wc < 0x0100) + c = tds565_page00_1[wc-0x00c0]; + else if (wc >= 0x0140 && wc < 0x0180) + c = tds565_page01[wc-0x0140]; + else if (wc == 0x2116) + c = 0x60; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/tis620.h b/Externals/libiconv-1.14/lib/tis620.h new file mode 100644 index 0000000000..125e6dc80e --- /dev/null +++ b/Externals/libiconv-1.14/lib/tis620.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * TIS620.2533-1 + */ + +static int +tis620_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x80) { + *pwc = (ucs4_t) c; + return 1; + } + else if (c >= 0xa1 && c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { + *pwc = (ucs4_t) (c + 0x0d60); + return 1; + } + return RET_ILSEQ; +} + +static int +tis620_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x0080) { + *r = wc; + return 1; + } + else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { + *r = wc-0x0d60; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/translit.h b/Externals/libiconv-1.14/lib/translit.h new file mode 100644 index 0000000000..15aa447264 --- /dev/null +++ b/Externals/libiconv-1.14/lib/translit.h @@ -0,0 +1,4411 @@ +/* + * Copyright (C) 1999-2003 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * Transliteration table + */ + +static const unsigned int translit_data[9116] = { + 1, ' ', + 1, '!', + 1, 'c', + 2, 'l', 'b', + 3, 'y', 'e', 'n', + 1, '|', + 2, 'S', 'S', + 1, '"', + 3, '(', 'c', ')', + 1, 'a', + 2, '<', '<', + 3, 'n', 'o', 't', + 1, '-', + 3, '(', 'R', ')', + 2, '^', '0', + 3, '+', '/', '-', + 2, '^', '2', + 2, '^', '3', + 1,'\'', + 1, 'u', + 1, 'P', + 1, '.', + 1, ',', + 2, '^', '1', + 1, 'o', + 2, '>', '>', + 5, ' ', '1',0x2044, '4', ' ', + 5, ' ', '1',0x2044, '2', ' ', + 5, ' ', '3',0x2044, '4', ' ', + 1, '?', + 2, '`', 'A', + 2,0xB4, 'A', + 2, '^', 'A', + 2, '~', 'A', + 2, '"', 'A', + 1, 'A', + 2, 'A', 'E', + 1, 'C', + 2, '`', 'E', + 2,0xB4, 'E', + 2, '^', 'E', + 2, '"', 'E', + 2, '`', 'I', + 2,0xB4, 'I', + 2, '^', 'I', + 2, '"', 'I', + 1, 'D', + 2, '~', 'N', + 2, '`', 'O', + 2,0xB4, 'O', + 2, '^', 'O', + 2, '~', 'O', + 2, '"', 'O', + 1, 'x', + 1, 'O', + 2, '`', 'U', + 2,0xB4, 'U', + 2, '^', 'U', + 2, '"', 'U', + 2,0xB4, 'Y', + 2, 'T', 'h', + 2, 's', 's', + 2, '`', 'a', + 2,0xB4, 'a', + 2, '^', 'a', + 2, '~', 'a', + 2, '"', 'a', + 1, 'a', + 2, 'a', 'e', + 1, 'c', + 2, '`', 'e', + 2,0xB4, 'e', + 2, '^', 'e', + 2, '"', 'e', + 2, '`', 'i', + 2,0xB4, 'i', + 2, '^', 'i', + 2, '"', 'i', + 1, 'd', + 2, '~', 'n', + 2, '`', 'o', + 2,0xB4, 'o', + 2, '^', 'o', + 2, '~', 'o', + 2, '"', 'o', + 1, ':', + 1, 'o', + 2, '`', 'u', + 2,0xB4, 'u', + 2, '^', 'u', + 2, '"', 'u', + 2,0xB4, 'y', + 2, 't', 'h', + 2, '"', 'y', + 1, 'A', + 1, 'a', + 1, 'A', + 1, 'a', + 1, 'A', + 1, 'a', + 2,0xB4, 'C', + 2,0xB4, 'c', + 2, '^', 'C', + 2, '^', 'c', + 1, 'C', + 1, 'c', + 1, 'C', + 1, 'c', + 1, 'D', + 1, 'd', + 1, 'D', + 1, 'd', + 1, 'E', + 1, 'e', + 1, 'E', + 1, 'e', + 1, 'E', + 1, 'e', + 1, 'E', + 1, 'e', + 1, 'E', + 1, 'e', + 2, '^', 'G', + 2, '^', 'g', + 1, 'G', + 1, 'g', + 1, 'G', + 1, 'g', + 1, 'G', + 1, 'g', + 2, '^', 'H', + 2, '^', 'h', + 1, 'H', + 1, 'h', + 2, '~', 'I', + 2, '~', 'i', + 1, 'I', + 1, 'i', + 1, 'I', + 1, 'i', + 1, 'I', + 1, 'i', + 1, 'I', + 1, 'i', + 2, 'I', 'J', + 2, 'i', 'j', + 2, '^', 'J', + 2, '^', 'j', + 1, 'K', + 1, 'k', + 1, 'L', + 1, 'l', + 1, 'L', + 1, 'l', + 1, 'L', + 1, 'l', + 1, 'L', + 1, 'l', + 1, 'L', + 1, 'l', + 2,0xB4, 'N', + 2,0xB4, 'n', + 1, 'N', + 1, 'n', + 1, 'N', + 1, 'n', + 2,'\'', 'n', + 1, 'O', + 1, 'o', + 1, 'O', + 1, 'o', + 2, '"', 'O', + 2, '"', 'o', + 2, 'O', 'E', + 2, 'o', 'e', + 2,0xB4, 'R', + 2,0xB4, 'r', + 1, 'R', + 1, 'r', + 1, 'R', + 1, 'r', + 2,0xB4, 'S', + 2,0xB4, 's', + 2, '^', 'S', + 2, '^', 's', + 1, 'S', + 1, 's', + 1, 'S', + 1, 's', + 1, 'T', + 1, 't', + 1, 'T', + 1, 't', + 1, 'T', + 1, 't', + 2, '~', 'U', + 2, '~', 'u', + 1, 'U', + 1, 'u', + 1, 'U', + 1, 'u', + 1, 'U', + 1, 'u', + 2, '"', 'U', + 2, '"', 'u', + 1, 'U', + 1, 'u', + 2, '^', 'W', + 2, '^', 'w', + 2, '^', 'Y', + 2, '^', 'y', + 2, '"', 'Y', + 2,0xB4, 'Z', + 2,0xB4, 'z', + 1, 'Z', + 1, 'z', + 1, 'Z', + 1, 'z', + 1, 's', + 1, 'f', + 2, 'D',0x017D, + 2, 'D',0x017E, + 2, 'd',0x017E, + 2, 'L', 'J', + 2, 'L', 'j', + 2, 'l', 'j', + 2, 'N', 'J', + 2, 'N', 'j', + 2, 'n', 'j', + 2, 'D', 'Z', + 2, 'D', 'z', + 2, 'd', 'z', + 1, 'S', + 1, 's', + 1, 'T', + 1, 't', + 1,0x2032, + 1,0x2033, + 1,0x2018, + 1,0x2019, + 1,0x201B, + 1, '^', + 1,'\'', + 1,0xAF, + 1,0xB4, + 1, '`', + 1, '_', + 1, '~', + 1, '"', + 1,0x03B2, + 1,0x03B8, + 1,0x03A5, + 1,0x03C6, + 1,0x03C0, + 1,0x03BA, + 1,0x03C1, + 1,0x03C2, + 1,0x0398, + 1,0x03B5, + 1,0x03A3, + 2,0x0565,0x0582, + 2,0x05D5,0x05D5, + 2,0x05D5,0x05D9, + 2,0x05D9,0x05D9, + 2,0x0627,0x0674, + 2,0x0648,0x0674, + 2,0x06C7,0x0674, + 2,0x064A,0x0674, + 2,0x0E4D,0x0E32, + 2,0x0ECD,0x0EB2, + 2,0x0EAB,0x0E99, + 2,0x0EAB,0x0EA1, + 2,0x0FB2,0x0F81, + 2,0x0FB3,0x0F81, + 1, 'B', + 1, 'b', + 1, 'D', + 1, 'd', + 1, 'F', + 1, 'f', + 1, 'M', + 1, 'm', + 1, 'P', + 1, 'p', + 1, 'S', + 1, 's', + 1, 'T', + 1, 't', + 2, '`', 'W', + 2, '`', 'w', + 2,0xB4, 'W', + 2,0xB4, 'w', + 2, '"', 'W', + 2, '"', 'w', + 2, 'a',0x02BE, + 2, '`', 'Y', + 2, '`', 'y', + 1, ' ', + 1, ' ', + 1, ' ', + 1, ' ', + 1, ' ', + 1, ' ', + 1, ' ', + 1, ' ', + 1, '-', + 1, '-', + 1, '-', + 1, '-', + 1, '-', + 1, '-', + 1,'\'', + 1,'\'', + 1, ',', + 1,'\'', + 1, '"', + 1, '"', + 1, '"', + 1, '"', + 1, '+', + 1, 'o', + 1, '.', + 2, '.', '.', + 3, '.', '.', '.', + 4, 'o', '/', 'o', 'o', + 1,0xB4, + 2,0xB4,0xB4, + 3,0xB4,0xB4,0xB4, + 2,0x2035,0x2035, + 3,0x2035,0x2035,0x2035, + 1, '<', + 1, '>', + 2, '!', '!', + 1, '/', + 2, '?', '?', + 2, '?', '!', + 2, '!', '?', + 4,0xB4,0xB4,0xB4,0xB4, + 2, 'R', 's', + 4,0x0110,0x1ED3, 'n', 'g', + 3, 'E', 'U', 'R', + 3, 'a', '/', 'c', + 3, 'a', '/', 's', + 1, 'C', + 2,0xB0, 'C', + 3, 'c', '/', 'o', + 3, 'c', '/', 'u', + 1,0x0190, + 2,0xB0, 'F', + 1, 'g', + 1, 'H', + 1, 'H', + 1, 'H', + 1, 'h', + 1,0x0127, + 1, 'I', + 1, 'I', + 1, 'L', + 1, 'l', + 1, 'N', + 2, 'N', 'o', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'R', + 1, 'R', + 3, 'T', 'E', 'L', + 2, 'T', 'M', + 1, 'Z', + 3, 'O', 'h', 'm', + 1, 'Z', + 1, 'B', + 1, 'C', + 1, 'e', + 1, 'e', + 1, 'E', + 1, 'F', + 1, 'M', + 1, 'o', + 1,0x05D0, + 1,0x05D1, + 1,0x05D2, + 1,0x05D3, + 1, 'i', + 3, 'F', 'A', 'X', + 1,0x03B3, + 1,0x0393, + 1,0x03A0, + 1,0x2211, + 1, 'D', + 1, 'd', + 1, 'e', + 1, 'i', + 1, 'j', + 5, ' ', '1',0x2044, '3', ' ', + 5, ' ', '2',0x2044, '3', ' ', + 5, ' ', '1',0x2044, '5', ' ', + 5, ' ', '2',0x2044, '5', ' ', + 5, ' ', '3',0x2044, '5', ' ', + 5, ' ', '4',0x2044, '5', ' ', + 5, ' ', '1',0x2044, '6', ' ', + 5, ' ', '5',0x2044, '6', ' ', + 5, ' ', '1',0x2044, '8', ' ', + 5, ' ', '3',0x2044, '8', ' ', + 5, ' ', '5',0x2044, '8', ' ', + 5, ' ', '7',0x2044, '8', ' ', + 3, ' ', '1',0x2044, + 1, 'I', + 2, 'I', 'I', + 3, 'I', 'I', 'I', + 2, 'I', 'V', + 1, 'V', + 2, 'V', 'I', + 3, 'V', 'I', 'I', + 4, 'V', 'I', 'I', 'I', + 2, 'I', 'X', + 1, 'X', + 2, 'X', 'I', + 3, 'X', 'I', 'I', + 1, 'L', + 1, 'C', + 1, 'D', + 1, 'M', + 1, 'i', + 2, 'i', 'i', + 3, 'i', 'i', 'i', + 2, 'i', 'v', + 1, 'v', + 2, 'v', 'i', + 3, 'v', 'i', 'i', + 4, 'v', 'i', 'i', 'i', + 2, 'i', 'x', + 1, 'x', + 2, 'x', 'i', + 3, 'x', 'i', 'i', + 1, 'l', + 1, 'c', + 1, 'd', + 1, 'm', + 2, '<', '-', + 1, '^', + 2, '-', '>', + 1, 'V', + 3, '<', '-', '>', + 2, '<', '=', + 2, '=', '>', + 3, '<', '=', '>', + 1, '-', + 1, '/', + 1,'\\', + 1, '*', + 1,0x2022, + 1, '|', + 2,0x222B,0x222B, + 3,0x222B,0x222B,0x222B, + 2,0x222E,0x222E, + 3,0x222E,0x222E,0x222E, + 1, ':', + 1, '~', + 2, '/', '=', + 2, '<', '=', + 2, '>', '=', + 2, '<', '<', + 2, '>', '>', + 1,0xB7, + 3, '<', '<', '<', + 3, '>', '>', '>', + 3,0xB7,0xB7,0xB7, + 5, '[', 'N', 'U', 'L', ']', + 5, '[', 'S', 'O', 'H', ']', + 5, '[', 'S', 'T', 'X', ']', + 5, '[', 'E', 'T', 'X', ']', + 5, '[', 'E', 'O', 'T', ']', + 5, '[', 'E', 'N', 'Q', ']', + 5, '[', 'A', 'C', 'K', ']', + 5, '[', 'B', 'E', 'L', ']', + 4, '[', 'B', 'S', ']', + 4, '[', 'H', 'T', ']', + 4, '[', 'L', 'F', ']', + 4, '[', 'V', 'T', ']', + 4, '[', 'F', 'F', ']', + 4, '[', 'C', 'R', ']', + 4, '[', 'S', 'O', ']', + 4, '[', 'S', 'I', ']', + 5, '[', 'D', 'L', 'E', ']', + 5, '[', 'D', 'C', '1', ']', + 5, '[', 'D', 'C', '2', ']', + 5, '[', 'D', 'C', '3', ']', + 5, '[', 'D', 'C', '4', ']', + 5, '[', 'N', 'A', 'K', ']', + 5, '[', 'S', 'Y', 'N', ']', + 5, '[', 'E', 'T', 'B', ']', + 5, '[', 'C', 'A', 'N', ']', + 4, '[', 'E', 'M', ']', + 5, '[', 'S', 'U', 'B', ']', + 5, '[', 'E', 'S', 'C', ']', + 4, '[', 'F', 'S', ']', + 4, '[', 'G', 'S', ']', + 4, '[', 'R', 'S', ']', + 4, '[', 'U', 'S', ']', + 4, '[', 'S', 'P', ']', + 5, '[', 'D', 'E', 'L', ']', + 4, '[', 'N', 'L', ']', + 3, '(', '1', ')', + 3, '(', '2', ')', + 3, '(', '3', ')', + 3, '(', '4', ')', + 3, '(', '5', ')', + 3, '(', '6', ')', + 3, '(', '7', ')', + 3, '(', '8', ')', + 3, '(', '9', ')', + 4, '(', '1', '0', ')', + 4, '(', '1', '1', ')', + 4, '(', '1', '2', ')', + 4, '(', '1', '3', ')', + 4, '(', '1', '4', ')', + 4, '(', '1', '5', ')', + 4, '(', '1', '6', ')', + 4, '(', '1', '7', ')', + 4, '(', '1', '8', ')', + 4, '(', '1', '9', ')', + 4, '(', '2', '0', ')', + 3, '(', '1', ')', + 3, '(', '2', ')', + 3, '(', '3', ')', + 3, '(', '4', ')', + 3, '(', '5', ')', + 3, '(', '6', ')', + 3, '(', '7', ')', + 3, '(', '8', ')', + 3, '(', '9', ')', + 4, '(', '1', '0', ')', + 4, '(', '1', '1', ')', + 4, '(', '1', '2', ')', + 4, '(', '1', '3', ')', + 4, '(', '1', '4', ')', + 4, '(', '1', '5', ')', + 4, '(', '1', '6', ')', + 4, '(', '1', '7', ')', + 4, '(', '1', '8', ')', + 4, '(', '1', '9', ')', + 4, '(', '2', '0', ')', + 2, '1', '.', + 2, '2', '.', + 2, '3', '.', + 2, '4', '.', + 2, '5', '.', + 2, '6', '.', + 2, '7', '.', + 2, '8', '.', + 2, '9', '.', + 3, '1', '0', '.', + 3, '1', '1', '.', + 3, '1', '2', '.', + 3, '1', '3', '.', + 3, '1', '4', '.', + 3, '1', '5', '.', + 3, '1', '6', '.', + 3, '1', '7', '.', + 3, '1', '8', '.', + 3, '1', '9', '.', + 3, '2', '0', '.', + 3, '(', 'a', ')', + 3, '(', 'b', ')', + 3, '(', 'c', ')', + 3, '(', 'd', ')', + 3, '(', 'e', ')', + 3, '(', 'f', ')', + 3, '(', 'g', ')', + 3, '(', 'h', ')', + 3, '(', 'i', ')', + 3, '(', 'j', ')', + 3, '(', 'k', ')', + 3, '(', 'l', ')', + 3, '(', 'm', ')', + 3, '(', 'n', ')', + 3, '(', 'o', ')', + 3, '(', 'p', ')', + 3, '(', 'q', ')', + 3, '(', 'r', ')', + 3, '(', 's', ')', + 3, '(', 't', ')', + 3, '(', 'u', ')', + 3, '(', 'v', ')', + 3, '(', 'w', ')', + 3, '(', 'x', ')', + 3, '(', 'y', ')', + 3, '(', 'z', ')', + 3, '(', 'A', ')', + 3, '(', 'B', ')', + 3, '(', 'C', ')', + 3, '(', 'D', ')', + 3, '(', 'E', ')', + 3, '(', 'F', ')', + 3, '(', 'G', ')', + 3, '(', 'H', ')', + 3, '(', 'I', ')', + 3, '(', 'J', ')', + 3, '(', 'K', ')', + 3, '(', 'L', ')', + 3, '(', 'M', ')', + 3, '(', 'N', ')', + 3, '(', 'O', ')', + 3, '(', 'P', ')', + 3, '(', 'Q', ')', + 3, '(', 'R', ')', + 3, '(', 'S', ')', + 3, '(', 'T', ')', + 3, '(', 'U', ')', + 3, '(', 'V', ')', + 3, '(', 'W', ')', + 3, '(', 'X', ')', + 3, '(', 'Y', ')', + 3, '(', 'Z', ')', + 3, '(', 'a', ')', + 3, '(', 'b', ')', + 3, '(', 'c', ')', + 3, '(', 'd', ')', + 3, '(', 'e', ')', + 3, '(', 'f', ')', + 3, '(', 'g', ')', + 3, '(', 'h', ')', + 3, '(', 'i', ')', + 3, '(', 'j', ')', + 3, '(', 'k', ')', + 3, '(', 'l', ')', + 3, '(', 'm', ')', + 3, '(', 'n', ')', + 3, '(', 'o', ')', + 3, '(', 'p', ')', + 3, '(', 'q', ')', + 3, '(', 'r', ')', + 3, '(', 's', ')', + 3, '(', 't', ')', + 3, '(', 'u', ')', + 3, '(', 'v', ')', + 3, '(', 'w', ')', + 3, '(', 'x', ')', + 3, '(', 'y', ')', + 3, '(', 'z', ')', + 3, '(', '0', ')', + 1, '-', + 1, '|', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, '+', + 1, 'o', + 4,0x222B,0x222B,0x222B,0x222B, + 3, ':', ':', '=', + 2, '=', '=', + 3, '=', '=', '=', + 1,0x6BCD, + 1,0x9F9F, + 1,0x4E00, + 1,0x4E28, + 1,0x4E36, + 1,0x4E3F, + 1,0x4E59, + 1,0x4E85, + 1,0x4E8C, + 1,0x4EA0, + 1,0x4EBA, + 1,0x513F, + 1,0x5165, + 1,0x516B, + 1,0x5182, + 1,0x5196, + 1,0x51AB, + 1,0x51E0, + 1,0x51F5, + 1,0x5200, + 1,0x529B, + 1,0x52F9, + 1,0x5315, + 1,0x531A, + 1,0x5338, + 1,0x5341, + 1,0x535C, + 1,0x5369, + 1,0x5382, + 1,0x53B6, + 1,0x53C8, + 1,0x53E3, + 1,0x56D7, + 1,0x571F, + 1,0x58EB, + 1,0x5902, + 1,0x590A, + 1,0x5915, + 1,0x5927, + 1,0x5973, + 1,0x5B50, + 1,0x5B80, + 1,0x5BF8, + 1,0x5C0F, + 1,0x5C22, + 1,0x5C38, + 1,0x5C6E, + 1,0x5C71, + 1,0x5DDB, + 1,0x5DE5, + 1,0x5DF1, + 1,0x5DFE, + 1,0x5E72, + 1,0x5E7A, + 1,0x5E7F, + 1,0x5EF4, + 1,0x5EFE, + 1,0x5F0B, + 1,0x5F13, + 1,0x5F50, + 1,0x5F61, + 1,0x5F73, + 1,0x5FC3, + 1,0x6208, + 1,0x6236, + 1,0x624B, + 1,0x652F, + 1,0x6534, + 1,0x6587, + 1,0x6597, + 1,0x65A4, + 1,0x65B9, + 1,0x65E0, + 1,0x65E5, + 1,0x66F0, + 1,0x6708, + 1,0x6728, + 1,0x6B20, + 1,0x6B62, + 1,0x6B79, + 1,0x6BB3, + 1,0x6BCB, + 1,0x6BD4, + 1,0x6BDB, + 1,0x6C0F, + 1,0x6C14, + 1,0x6C34, + 1,0x706B, + 1,0x722A, + 1,0x7236, + 1,0x723B, + 1,0x723F, + 1,0x7247, + 1,0x7259, + 1,0x725B, + 1,0x72AC, + 1,0x7384, + 1,0x7389, + 1,0x74DC, + 1,0x74E6, + 1,0x7518, + 1,0x751F, + 1,0x7528, + 1,0x7530, + 1,0x758B, + 1,0x7592, + 1,0x7676, + 1,0x767D, + 1,0x76AE, + 1,0x76BF, + 1,0x76EE, + 1,0x77DB, + 1,0x77E2, + 1,0x77F3, + 1,0x793A, + 1,0x79B8, + 1,0x79BE, + 1,0x7A74, + 1,0x7ACB, + 1,0x7AF9, + 1,0x7C73, + 1,0x7CF8, + 1,0x7F36, + 1,0x7F51, + 1,0x7F8A, + 1,0x7FBD, + 1,0x8001, + 1,0x800C, + 1,0x8012, + 1,0x8033, + 1,0x807F, + 1,0x8089, + 1,0x81E3, + 1,0x81EA, + 1,0x81F3, + 1,0x81FC, + 1,0x820C, + 1,0x821B, + 1,0x821F, + 1,0x826E, + 1,0x8272, + 1,0x8278, + 1,0x864D, + 1,0x866B, + 1,0x8840, + 1,0x884C, + 1,0x8863, + 1,0x897E, + 1,0x898B, + 1,0x89D2, + 1,0x8A00, + 1,0x8C37, + 1,0x8C46, + 1,0x8C55, + 1,0x8C78, + 1,0x8C9D, + 1,0x8D64, + 1,0x8D70, + 1,0x8DB3, + 1,0x8EAB, + 1,0x8ECA, + 1,0x8F9B, + 1,0x8FB0, + 1,0x8FB5, + 1,0x9091, + 1,0x9149, + 1,0x91C6, + 1,0x91CC, + 1,0x91D1, + 1,0x9577, + 1,0x9580, + 1,0x961C, + 1,0x96B6, + 1,0x96B9, + 1,0x96E8, + 1,0x9751, + 1,0x975E, + 1,0x9762, + 1,0x9769, + 1,0x97CB, + 1,0x97ED, + 1,0x97F3, + 1,0x9801, + 1,0x98A8, + 1,0x98DB, + 1,0x98DF, + 1,0x9996, + 1,0x9999, + 1,0x99AC, + 1,0x9AA8, + 1,0x9AD8, + 1,0x9ADF, + 1,0x9B25, + 1,0x9B2F, + 1,0x9B32, + 1,0x9B3C, + 1,0x9B5A, + 1,0x9CE5, + 1,0x9E75, + 1,0x9E7F, + 1,0x9EA5, + 1,0x9EBB, + 1,0x9EC3, + 1,0x9ECD, + 1,0x9ED1, + 1,0x9EF9, + 1,0x9EFD, + 1,0x9F0E, + 1,0x9F13, + 1,0x9F20, + 1,0x9F3B, + 1,0x9F4A, + 1,0x9F52, + 1,0x9F8D, + 1,0x9F9C, + 1,0x9FA0, + 1, ' ', + 1,0x3012, + 1,0x5341, + 1,0x5344, + 1,0x5345, + 1,0x3042, + 1,0x3044, + 1,0x3046, + 1,0x3048, + 1,0x304A, + 1,0x3064, + 1,0x3084, + 1,0x3086, + 1,0x3088, + 1,0x308F, + 1,0x304B, + 1,0x3051, + 2, ' ',0x3099, + 2, ' ',0x309A, + 1, '=', + 1,0x30A2, + 1,0x30A4, + 1,0x30A6, + 1,0x30A8, + 1,0x30AA, + 1,0x30C4, + 1,0x30E4, + 1,0x30E6, + 1,0x30E8, + 1,0x30EF, + 1,0x30AB, + 1,0x30B1, + 1,0x1100, + 1,0x1101, + 1,0x11AA, + 1,0x1102, + 1,0x11AC, + 1,0x11AD, + 1,0x1103, + 1,0x1104, + 1,0x1105, + 1,0x11B0, + 1,0x11B1, + 1,0x11B2, + 1,0x11B3, + 1,0x11B4, + 1,0x11B5, + 1,0x111A, + 1,0x1106, + 1,0x1107, + 1,0x1108, + 1,0x1121, + 1,0x1109, + 1,0x110A, + 1,0x110B, + 1,0x110C, + 1,0x110D, + 1,0x110E, + 1,0x110F, + 1,0x1110, + 1,0x1111, + 1,0x1112, + 1,0x1161, + 1,0x1162, + 1,0x1163, + 1,0x1164, + 1,0x1165, + 1,0x1166, + 1,0x1167, + 1,0x1168, + 1,0x1169, + 1,0x116A, + 1,0x116B, + 1,0x116C, + 1,0x116D, + 1,0x116E, + 1,0x116F, + 1,0x1170, + 1,0x1171, + 1,0x1172, + 1,0x1173, + 1,0x1174, + 1,0x1175, + 1,0x1160, + 1,0x1114, + 1,0x1115, + 1,0x11C7, + 1,0x11C8, + 1,0x11CC, + 1,0x11CE, + 1,0x11D3, + 1,0x11D7, + 1,0x11D9, + 1,0x111C, + 1,0x11DD, + 1,0x11DF, + 1,0x111D, + 1,0x111E, + 1,0x1120, + 1,0x1122, + 1,0x1123, + 1,0x1127, + 1,0x1129, + 1,0x112B, + 1,0x112C, + 1,0x112D, + 1,0x112E, + 1,0x112F, + 1,0x1132, + 1,0x1136, + 1,0x1140, + 1,0x1147, + 1,0x114C, + 1,0x11F1, + 1,0x11F2, + 1,0x1157, + 1,0x1158, + 1,0x1159, + 1,0x1184, + 1,0x1185, + 1,0x1188, + 1,0x1191, + 1,0x1192, + 1,0x1194, + 1,0x119E, + 1,0x11A1, + 1,0x30AF, + 1,0x30B7, + 1,0x30B9, + 1,0x30C8, + 1,0x30CC, + 1,0x30CF, + 1,0x30D2, + 1,0x30D5, + 1,0x30D8, + 1,0x30DB, + 1,0x30E0, + 1,0x30E9, + 1,0x30EA, + 1,0x30EB, + 1,0x30EC, + 1,0x30ED, + 3, '(',0x1100, ')', + 3, '(',0x1102, ')', + 3, '(',0x1103, ')', + 3, '(',0x1105, ')', + 3, '(',0x1106, ')', + 3, '(',0x1107, ')', + 3, '(',0x1109, ')', + 3, '(',0x110B, ')', + 3, '(',0x110C, ')', + 3, '(',0x110E, ')', + 3, '(',0x110F, ')', + 3, '(',0x1110, ')', + 3, '(',0x1111, ')', + 3, '(',0x1112, ')', + 4, '(',0x1100,0x1161, ')', + 4, '(',0x1102,0x1161, ')', + 4, '(',0x1103,0x1161, ')', + 4, '(',0x1105,0x1161, ')', + 4, '(',0x1106,0x1161, ')', + 4, '(',0x1107,0x1161, ')', + 4, '(',0x1109,0x1161, ')', + 4, '(',0x110B,0x1161, ')', + 4, '(',0x110C,0x1161, ')', + 4, '(',0x110E,0x1161, ')', + 4, '(',0x110F,0x1161, ')', + 4, '(',0x1110,0x1161, ')', + 4, '(',0x1111,0x1161, ')', + 4, '(',0x1112,0x1161, ')', + 4, '(',0x110C,0x116E, ')', + 7, '(',0x110B,0x1169,0x110C,0x1165,0x11AB, ')', + 6, '(',0x110B,0x1169,0x1112,0x116E, ')', + 3, '(',0x4E00, ')', + 3, '(',0x4E8C, ')', + 3, '(',0x4E09, ')', + 3, '(',0x56DB, ')', + 3, '(',0x4E94, ')', + 3, '(',0x516D, ')', + 3, '(',0x4E03, ')', + 3, '(',0x516B, ')', + 3, '(',0x4E5D, ')', + 3, '(',0x5341, ')', + 3, '(',0x6708, ')', + 3, '(',0x706B, ')', + 3, '(',0x6C34, ')', + 3, '(',0x6728, ')', + 3, '(',0x91D1, ')', + 3, '(',0x571F, ')', + 3, '(',0x65E5, ')', + 3, '(',0x682A, ')', + 3, '(',0x6709, ')', + 3, '(',0x793E, ')', + 3, '(',0x540D, ')', + 3, '(',0x7279, ')', + 3, '(',0x8CA1, ')', + 3, '(',0x795D, ')', + 3, '(',0x52B4, ')', + 3, '(',0x4EE3, ')', + 3, '(',0x547C, ')', + 3, '(',0x5B66, ')', + 3, '(',0x76E3, ')', + 3, '(',0x4F01, ')', + 3, '(',0x8CC7, ')', + 3, '(',0x5354, ')', + 3, '(',0x796D, ')', + 3, '(',0x4F11, ')', + 3, '(',0x81EA, ')', + 3, '(',0x81F3, ')', + 3, 'P', 'T', 'E', + 4, '(', '2', '1', ')', + 4, '(', '2', '2', ')', + 4, '(', '2', '3', ')', + 4, '(', '2', '4', ')', + 4, '(', '2', '5', ')', + 4, '(', '2', '6', ')', + 4, '(', '2', '7', ')', + 4, '(', '2', '8', ')', + 4, '(', '2', '9', ')', + 4, '(', '3', '0', ')', + 4, '(', '3', '1', ')', + 4, '(', '3', '2', ')', + 4, '(', '3', '3', ')', + 4, '(', '3', '4', ')', + 4, '(', '3', '5', ')', + 3, '(',0x1100, ')', + 3, '(',0x1102, ')', + 3, '(',0x1103, ')', + 3, '(',0x1105, ')', + 3, '(',0x1106, ')', + 3, '(',0x1107, ')', + 3, '(',0x1109, ')', + 3, '(',0x110B, ')', + 3, '(',0x110C, ')', + 3, '(',0x110E, ')', + 3, '(',0x110F, ')', + 3, '(',0x1110, ')', + 3, '(',0x1111, ')', + 3, '(',0x1112, ')', + 4, '(',0x1100,0x1161, ')', + 4, '(',0x1102,0x1161, ')', + 4, '(',0x1103,0x1161, ')', + 4, '(',0x1105,0x1161, ')', + 4, '(',0x1106,0x1161, ')', + 4, '(',0x1107,0x1161, ')', + 4, '(',0x1109,0x1161, ')', + 4, '(',0x110B,0x1161, ')', + 4, '(',0x110C,0x1161, ')', + 4, '(',0x110E,0x1161, ')', + 4, '(',0x110F,0x1161, ')', + 4, '(',0x1110,0x1161, ')', + 4, '(',0x1111,0x1161, ')', + 4, '(',0x1112,0x1161, ')', + 7, '(',0x110E,0x1161,0x11B7,0x1100,0x1169, ')', + 6, '(',0x110C,0x116E,0x110B,0x1174, ')', + 3, '(',0x4E00, ')', + 3, '(',0x4E8C, ')', + 3, '(',0x4E09, ')', + 3, '(',0x56DB, ')', + 3, '(',0x4E94, ')', + 3, '(',0x516D, ')', + 3, '(',0x4E03, ')', + 3, '(',0x516B, ')', + 3, '(',0x4E5D, ')', + 3, '(',0x5341, ')', + 3, '(',0x6708, ')', + 3, '(',0x706B, ')', + 3, '(',0x6C34, ')', + 3, '(',0x6728, ')', + 3, '(',0x91D1, ')', + 3, '(',0x571F, ')', + 3, '(',0x65E5, ')', + 3, '(',0x682A, ')', + 3, '(',0x6709, ')', + 3, '(',0x793E, ')', + 3, '(',0x540D, ')', + 3, '(',0x7279, ')', + 3, '(',0x8CA1, ')', + 3, '(',0x795D, ')', + 3, '(',0x52B4, ')', + 3, '(',0x79D8, ')', + 3, '(',0x7537, ')', + 3, '(',0x5973, ')', + 3, '(',0x9069, ')', + 3, '(',0x512A, ')', + 3, '(',0x5370, ')', + 3, '(',0x6CE8, ')', + 3, '(',0x9805, ')', + 3, '(',0x4F11, ')', + 3, '(',0x5199, ')', + 3, '(',0x6B63, ')', + 3, '(',0x4E0A, ')', + 3, '(',0x4E2D, ')', + 3, '(',0x4E0B, ')', + 3, '(',0x5DE6, ')', + 3, '(',0x53F3, ')', + 3, '(',0x533B, ')', + 3, '(',0x5B97, ')', + 3, '(',0x5B66, ')', + 3, '(',0x76E3, ')', + 3, '(',0x4F01, ')', + 3, '(',0x8CC7, ')', + 3, '(',0x5354, ')', + 3, '(',0x591C, ')', + 4, '(', '3', '6', ')', + 4, '(', '3', '7', ')', + 4, '(', '3', '8', ')', + 4, '(', '3', '9', ')', + 4, '(', '4', '0', ')', + 4, '(', '4', '1', ')', + 4, '(', '4', '2', ')', + 4, '(', '4', '3', ')', + 4, '(', '4', '4', ')', + 4, '(', '4', '5', ')', + 4, '(', '4', '6', ')', + 4, '(', '4', '7', ')', + 4, '(', '4', '8', ')', + 4, '(', '4', '9', ')', + 4, '(', '5', '0', ')', + 2, '1',0x6708, + 2, '2',0x6708, + 2, '3',0x6708, + 2, '4',0x6708, + 2, '5',0x6708, + 2, '6',0x6708, + 2, '7',0x6708, + 2, '8',0x6708, + 2, '9',0x6708, + 3, '1', '0',0x6708, + 3, '1', '1',0x6708, + 3, '1', '2',0x6708, + 2, 'H', 'g', + 3, 'e', 'r', 'g', + 2, 'e', 'V', + 3, 'L', 'T', 'D', + 3, '(',0x30A2, ')', + 3, '(',0x30A4, ')', + 3, '(',0x30A6, ')', + 3, '(',0x30A8, ')', + 3, '(',0x30AA, ')', + 3, '(',0x30AB, ')', + 3, '(',0x30AD, ')', + 3, '(',0x30AF, ')', + 3, '(',0x30B1, ')', + 3, '(',0x30B3, ')', + 3, '(',0x30B5, ')', + 3, '(',0x30B7, ')', + 3, '(',0x30B9, ')', + 3, '(',0x30BB, ')', + 3, '(',0x30BD, ')', + 3, '(',0x30BF, ')', + 3, '(',0x30C1, ')', + 3, '(',0x30C4, ')', + 3, '(',0x30C6, ')', + 3, '(',0x30C8, ')', + 3, '(',0x30CA, ')', + 3, '(',0x30CB, ')', + 3, '(',0x30CC, ')', + 3, '(',0x30CD, ')', + 3, '(',0x30CE, ')', + 3, '(',0x30CF, ')', + 3, '(',0x30D2, ')', + 3, '(',0x30D5, ')', + 3, '(',0x30D8, ')', + 3, '(',0x30DB, ')', + 3, '(',0x30DE, ')', + 3, '(',0x30DF, ')', + 3, '(',0x30E0, ')', + 3, '(',0x30E1, ')', + 3, '(',0x30E2, ')', + 3, '(',0x30E4, ')', + 3, '(',0x30E6, ')', + 3, '(',0x30E8, ')', + 3, '(',0x30E9, ')', + 3, '(',0x30EA, ')', + 3, '(',0x30EB, ')', + 3, '(',0x30EC, ')', + 3, '(',0x30ED, ')', + 3, '(',0x30EF, ')', + 3, '(',0x30F0, ')', + 3, '(',0x30F1, ')', + 3, '(',0x30F2, ')', + 4,0x30A2,0x30D1,0x30FC,0x30C8, + 4,0x30A2,0x30EB,0x30D5,0x30A1, + 4,0x30A2,0x30F3,0x30DA,0x30A2, + 3,0x30A2,0x30FC,0x30EB, + 4,0x30A4,0x30CB,0x30F3,0x30B0, + 3,0x30A4,0x30F3,0x30C1, + 3,0x30A6,0x30A9,0x30F3, + 5,0x30A8,0x30B9,0x30AF,0x30FC,0x30C9, + 4,0x30A8,0x30FC,0x30AB,0x30FC, + 3,0x30AA,0x30F3,0x30B9, + 3,0x30AA,0x30FC,0x30E0, + 3,0x30AB,0x30A4,0x30EA, + 4,0x30AB,0x30E9,0x30C3,0x30C8, + 4,0x30AB,0x30ED,0x30EA,0x30FC, + 3,0x30AC,0x30ED,0x30F3, + 3,0x30AC,0x30F3,0x30DE, + 2,0x30AE,0x30AC, + 3,0x30AE,0x30CB,0x30FC, + 4,0x30AD,0x30E5,0x30EA,0x30FC, + 4,0x30AE,0x30EB,0x30C0,0x30FC, + 2,0x30AD,0x30ED, + 5,0x30AD,0x30ED,0x30B0,0x30E9,0x30E0, + 6,0x30AD,0x30ED,0x30E1,0x30FC,0x30C8,0x30EB, + 5,0x30AD,0x30ED,0x30EF,0x30C3,0x30C8, + 3,0x30B0,0x30E9,0x30E0, + 5,0x30B0,0x30E9,0x30E0,0x30C8,0x30F3, + 5,0x30AF,0x30EB,0x30BC,0x30A4,0x30ED, + 4,0x30AF,0x30ED,0x30FC,0x30CD, + 3,0x30B1,0x30FC,0x30B9, + 3,0x30B3,0x30EB,0x30CA, + 3,0x30B3,0x30FC,0x30DD, + 4,0x30B5,0x30A4,0x30AF,0x30EB, + 5,0x30B5,0x30F3,0x30C1,0x30FC,0x30E0, + 4,0x30B7,0x30EA,0x30F3,0x30B0, + 3,0x30BB,0x30F3,0x30C1, + 3,0x30BB,0x30F3,0x30C8, + 3,0x30C0,0x30FC,0x30B9, + 2,0x30C7,0x30B7, + 2,0x30C9,0x30EB, + 2,0x30C8,0x30F3, + 2,0x30CA,0x30CE, + 3,0x30CE,0x30C3,0x30C8, + 3,0x30CF,0x30A4,0x30C4, + 5,0x30D1,0x30FC,0x30BB,0x30F3,0x30C8, + 3,0x30D1,0x30FC,0x30C4, + 4,0x30D0,0x30FC,0x30EC,0x30EB, + 5,0x30D4,0x30A2,0x30B9,0x30C8,0x30EB, + 3,0x30D4,0x30AF,0x30EB, + 2,0x30D4,0x30B3, + 2,0x30D3,0x30EB, + 5,0x30D5,0x30A1,0x30E9,0x30C3,0x30C9, + 4,0x30D5,0x30A3,0x30FC,0x30C8, + 5,0x30D6,0x30C3,0x30B7,0x30A7,0x30EB, + 3,0x30D5,0x30E9,0x30F3, + 5,0x30D8,0x30AF,0x30BF,0x30FC,0x30EB, + 2,0x30DA,0x30BD, + 3,0x30DA,0x30CB,0x30D2, + 3,0x30D8,0x30EB,0x30C4, + 3,0x30DA,0x30F3,0x30B9, + 3,0x30DA,0x30FC,0x30B8, + 3,0x30D9,0x30FC,0x30BF, + 4,0x30DD,0x30A4,0x30F3,0x30C8, + 3,0x30DC,0x30EB,0x30C8, + 2,0x30DB,0x30F3, + 3,0x30DD,0x30F3,0x30C9, + 3,0x30DB,0x30FC,0x30EB, + 3,0x30DB,0x30FC,0x30F3, + 4,0x30DE,0x30A4,0x30AF,0x30ED, + 3,0x30DE,0x30A4,0x30EB, + 3,0x30DE,0x30C3,0x30CF, + 3,0x30DE,0x30EB,0x30AF, + 5,0x30DE,0x30F3,0x30B7,0x30E7,0x30F3, + 4,0x30DF,0x30AF,0x30ED,0x30F3, + 2,0x30DF,0x30EA, + 5,0x30DF,0x30EA,0x30D0,0x30FC,0x30EB, + 2,0x30E1,0x30AC, + 4,0x30E1,0x30AC,0x30C8,0x30F3, + 4,0x30E1,0x30FC,0x30C8,0x30EB, + 3,0x30E4,0x30FC,0x30C9, + 3,0x30E4,0x30FC,0x30EB, + 3,0x30E6,0x30A2,0x30F3, + 4,0x30EA,0x30C3,0x30C8,0x30EB, + 2,0x30EA,0x30E9, + 3,0x30EB,0x30D4,0x30FC, + 4,0x30EB,0x30FC,0x30D6,0x30EB, + 2,0x30EC,0x30E0, + 5,0x30EC,0x30F3,0x30C8,0x30B2,0x30F3, + 3,0x30EF,0x30C3,0x30C8, + 2, '0',0x70B9, + 2, '1',0x70B9, + 2, '2',0x70B9, + 2, '3',0x70B9, + 2, '4',0x70B9, + 2, '5',0x70B9, + 2, '6',0x70B9, + 2, '7',0x70B9, + 2, '8',0x70B9, + 2, '9',0x70B9, + 3, '1', '0',0x70B9, + 3, '1', '1',0x70B9, + 3, '1', '2',0x70B9, + 3, '1', '3',0x70B9, + 3, '1', '4',0x70B9, + 3, '1', '5',0x70B9, + 3, '1', '6',0x70B9, + 3, '1', '7',0x70B9, + 3, '1', '8',0x70B9, + 3, '1', '9',0x70B9, + 3, '2', '0',0x70B9, + 3, '2', '1',0x70B9, + 3, '2', '2',0x70B9, + 3, '2', '3',0x70B9, + 3, '2', '4',0x70B9, + 3, 'h', 'P', 'a', + 2, 'd', 'a', + 2, 'A', 'U', + 3, 'b', 'a', 'r', + 2, 'o', 'V', + 2, 'p', 'c', + 2, 'd', 'm', + 4, 'd', 'm', '^', '2', + 4, 'd', 'm', '^', '3', + 2, 'I', 'U', + 2,0x5E73,0x6210, + 2,0x662D,0x548C, + 2,0x5927,0x6B63, + 2,0x660E,0x6CBB, + 4,0x682A,0x5F0F,0x4F1A,0x793E, + 2, 'p', 'A', + 2, 'n', 'A', + 2,0x03BC, 'A', + 2, 'm', 'A', + 2, 'k', 'A', + 2, 'K', 'B', + 2, 'M', 'B', + 2, 'G', 'B', + 3, 'c', 'a', 'l', + 4, 'k', 'c', 'a', 'l', + 2, 'p', 'F', + 2, 'n', 'F', + 2,0x03BC, 'F', + 2,0x03BC, 'g', + 2, 'm', 'g', + 2, 'k', 'g', + 2, 'H', 'z', + 3, 'k', 'H', 'z', + 3, 'M', 'H', 'z', + 3, 'G', 'H', 'z', + 3, 'T', 'H', 'z', + 2,0x03BC, 'l', + 2, 'm', 'l', + 2, 'd', 'l', + 2, 'k', 'l', + 2, 'f', 'm', + 2, 'n', 'm', + 2,0x03BC, 'm', + 2, 'm', 'm', + 2, 'c', 'm', + 2, 'k', 'm', + 4, 'm', 'm', '^', '2', + 4, 'c', 'm', '^', '2', + 3, 'm', '^', '2', + 4, 'k', 'm', '^', '2', + 4, 'm', 'm', '^', '3', + 4, 'c', 'm', '^', '3', + 3, 'm', '^', '3', + 4, 'k', 'm', '^', '3', + 3, 'm', '/', 's', + 5, 'm', '/', 's', '^', '2', + 2, 'P', 'a', + 3, 'k', 'P', 'a', + 3, 'M', 'P', 'a', + 3, 'G', 'P', 'a', + 3, 'r', 'a', 'd', + 5, 'r', 'a', 'd', '/', 's', + 7, 'r', 'a', 'd', '/', 's', '^', '2', + 2, 'p', 's', + 2, 'n', 's', + 2,0x03BC, 's', + 2, 'm', 's', + 2, 'p', 'V', + 2, 'n', 'V', + 2,0x03BC, 'V', + 2, 'm', 'V', + 2, 'k', 'V', + 2, 'M', 'V', + 2, 'p', 'W', + 2, 'n', 'W', + 2,0x03BC, 'W', + 2, 'm', 'W', + 2, 'k', 'W', + 2, 'M', 'W', + 2, 'k',0x03A9, + 2, 'M',0x03A9, + 4, 'a', '.', 'm', '.', + 2, 'B', 'q', + 2, 'c', 'c', + 2, 'c', 'd', + 4, 'C', '/', 'k', 'g', + 3, 'C', 'o', '.', + 2, 'd', 'B', + 2, 'G', 'y', + 2, 'h', 'a', + 2, 'H', 'P', + 2, 'i', 'n', + 2, 'K', 'K', + 2, 'K', 'M', + 2, 'k', 't', + 2, 'l', 'm', + 2, 'l', 'n', + 3, 'l', 'o', 'g', + 2, 'l', 'x', + 2, 'm', 'b', + 3, 'm', 'i', 'l', + 3, 'm', 'o', 'l', + 2, 'P', 'H', + 4, 'p', '.', 'm', '.', + 3, 'P', 'P', 'M', + 2, 'P', 'R', + 2, 's', 'r', + 2, 'S', 'v', + 2, 'W', 'b', + 3, 'V', '/', 'm', + 3, 'A', '/', 'm', + 3, 'g', 'a', 'l', + 2, '1',0x65E5, + 2, '2',0x65E5, + 2, '3',0x65E5, + 2, '4',0x65E5, + 2, '5',0x65E5, + 2, '6',0x65E5, + 2, '7',0x65E5, + 2, '8',0x65E5, + 2, '9',0x65E5, + 3, '1', '0',0x65E5, + 3, '1', '1',0x65E5, + 3, '1', '2',0x65E5, + 3, '1', '3',0x65E5, + 3, '1', '4',0x65E5, + 3, '1', '5',0x65E5, + 3, '1', '6',0x65E5, + 3, '1', '7',0x65E5, + 3, '1', '8',0x65E5, + 3, '1', '9',0x65E5, + 3, '2', '0',0x65E5, + 3, '2', '1',0x65E5, + 3, '2', '2',0x65E5, + 3, '2', '3',0x65E5, + 3, '2', '4',0x65E5, + 3, '2', '5',0x65E5, + 3, '2', '6',0x65E5, + 3, '2', '7',0x65E5, + 3, '2', '8',0x65E5, + 3, '2', '9',0x65E5, + 3, '3', '0',0x65E5, + 3, '3', '1',0x65E5, + 1,0x8C48, + 1,0x66F4, + 1,0x8ECA, + 1,0x8CC8, + 1,0x6ED1, + 1,0x4E32, + 1,0x53E5, + 1,0x9F9C, + 1,0x9F9C, + 1,0x5951, + 1,0x91D1, + 1,0x5587, + 1,0x5948, + 1,0x61F6, + 1,0x7669, + 1,0x7F85, + 1,0x863F, + 1,0x87BA, + 1,0x88F8, + 1,0x908F, + 1,0x6A02, + 1,0x6D1B, + 1,0x70D9, + 1,0x73DE, + 1,0x843D, + 1,0x916A, + 1,0x99F1, + 1,0x4E82, + 1,0x5375, + 1,0x6B04, + 1,0x721B, + 1,0x862D, + 1,0x9E1E, + 1,0x5D50, + 1,0x6FEB, + 1,0x85CD, + 1,0x8964, + 1,0x62C9, + 1,0x81D8, + 1,0x881F, + 1,0x5ECA, + 1,0x6717, + 1,0x6D6A, + 1,0x72FC, + 1,0x90CE, + 1,0x4F86, + 1,0x51B7, + 1,0x52DE, + 1,0x64C4, + 1,0x6AD3, + 1,0x7210, + 1,0x76E7, + 1,0x8001, + 1,0x8606, + 1,0x865C, + 1,0x8DEF, + 1,0x9732, + 1,0x9B6F, + 1,0x9DFA, + 1,0x788C, + 1,0x797F, + 1,0x7DA0, + 1,0x83C9, + 1,0x9304, + 1,0x9E7F, + 1,0x8AD6, + 1,0x58DF, + 1,0x5F04, + 1,0x7C60, + 1,0x807E, + 1,0x7262, + 1,0x78CA, + 1,0x8CC2, + 1,0x96F7, + 1,0x58D8, + 1,0x5C62, + 1,0x6A13, + 1,0x6DDA, + 1,0x6F0F, + 1,0x7D2F, + 1,0x7E37, + 1,0x964B, + 1,0x52D2, + 1,0x808B, + 1,0x51DC, + 1,0x51CC, + 1,0x7A1C, + 1,0x7DBE, + 1,0x83F1, + 1,0x9675, + 1,0x8B80, + 1,0x62CF, + 1,0x6A02, + 1,0x8AFE, + 1,0x4E39, + 1,0x5BE7, + 1,0x6012, + 1,0x7387, + 1,0x7570, + 1,0x5317, + 1,0x78FB, + 1,0x4FBF, + 1,0x5FA9, + 1,0x4E0D, + 1,0x6CCC, + 1,0x6578, + 1,0x7D22, + 1,0x53C3, + 1,0x585E, + 1,0x7701, + 1,0x8449, + 1,0x8AAA, + 1,0x6BBA, + 1,0x8FB0, + 1,0x6C88, + 1,0x62FE, + 1,0x82E5, + 1,0x63A0, + 1,0x7565, + 1,0x4EAE, + 1,0x5169, + 1,0x51C9, + 1,0x6881, + 1,0x7CE7, + 1,0x826F, + 1,0x8AD2, + 1,0x91CF, + 1,0x52F5, + 1,0x5442, + 1,0x5973, + 1,0x5EEC, + 1,0x65C5, + 1,0x6FFE, + 1,0x792A, + 1,0x95AD, + 1,0x9A6A, + 1,0x9E97, + 1,0x9ECE, + 1,0x529B, + 1,0x66C6, + 1,0x6B77, + 1,0x8F62, + 1,0x5E74, + 1,0x6190, + 1,0x6200, + 1,0x649A, + 1,0x6F23, + 1,0x7149, + 1,0x7489, + 1,0x79CA, + 1,0x7DF4, + 1,0x806F, + 1,0x8F26, + 1,0x84EE, + 1,0x9023, + 1,0x934A, + 1,0x5217, + 1,0x52A3, + 1,0x54BD, + 1,0x70C8, + 1,0x88C2, + 1,0x8AAA, + 1,0x5EC9, + 1,0x5FF5, + 1,0x637B, + 1,0x6BAE, + 1,0x7C3E, + 1,0x7375, + 1,0x4EE4, + 1,0x56F9, + 1,0x5BE7, + 1,0x5DBA, + 1,0x601C, + 1,0x73B2, + 1,0x7469, + 1,0x7F9A, + 1,0x8046, + 1,0x9234, + 1,0x96F6, + 1,0x9748, + 1,0x9818, + 1,0x4F8B, + 1,0x79AE, + 1,0x91B4, + 1,0x96B8, + 1,0x60E1, + 1,0x4E86, + 1,0x50DA, + 1,0x5BEE, + 1,0x5C3F, + 1,0x6599, + 1,0x6A02, + 1,0x71CE, + 1,0x7642, + 1,0x84FC, + 1,0x907C, + 1,0x9F8D, + 1,0x6688, + 1,0x962E, + 1,0x5289, + 1,0x677B, + 1,0x67F3, + 1,0x6D41, + 1,0x6E9C, + 1,0x7409, + 1,0x7559, + 1,0x786B, + 1,0x7D10, + 1,0x985E, + 1,0x516D, + 1,0x622E, + 1,0x9678, + 1,0x502B, + 1,0x5D19, + 1,0x6DEA, + 1,0x8F2A, + 1,0x5F8B, + 1,0x6144, + 1,0x6817, + 1,0x7387, + 1,0x9686, + 1,0x5229, + 1,0x540F, + 1,0x5C65, + 1,0x6613, + 1,0x674E, + 1,0x68A8, + 1,0x6CE5, + 1,0x7406, + 1,0x75E2, + 1,0x7F79, + 1,0x88CF, + 1,0x88E1, + 1,0x91CC, + 1,0x96E2, + 1,0x533F, + 1,0x6EBA, + 1,0x541D, + 1,0x71D0, + 1,0x7498, + 1,0x85FA, + 1,0x96A3, + 1,0x9C57, + 1,0x9E9F, + 1,0x6797, + 1,0x6DCB, + 1,0x81E8, + 1,0x7ACB, + 1,0x7B20, + 1,0x7C92, + 1,0x72C0, + 1,0x7099, + 1,0x8B58, + 1,0x4EC0, + 1,0x8336, + 1,0x523A, + 1,0x5207, + 1,0x5EA6, + 1,0x62D3, + 1,0x7CD6, + 1,0x5B85, + 1,0x6D1E, + 1,0x66B4, + 1,0x8F3B, + 1,0x884C, + 1,0x964D, + 1,0x898B, + 1,0x5ED3, + 1,0x5140, + 1,0x55C0, + 1,0x585A, + 1,0x6674, + 1,0x51DE, + 1,0x732A, + 1,0x76CA, + 1,0x793C, + 1,0x795E, + 1,0x7965, + 1,0x798F, + 1,0x9756, + 1,0x7CBE, + 1,0x7FBD, + 1,0x8612, + 1,0x8AF8, + 1,0x9038, + 1,0x90FD, + 1,0x98EF, + 1,0x98FC, + 1,0x9928, + 1,0x9DB4, + 1,0x4FAE, + 1,0x50E7, + 1,0x514D, + 1,0x52C9, + 1,0x52E4, + 1,0x5351, + 1,0x559D, + 1,0x5606, + 1,0x5668, + 1,0x5840, + 1,0x58A8, + 1,0x5C64, + 1,0x5C6E, + 1,0x6094, + 1,0x6168, + 1,0x618E, + 1,0x61F2, + 1,0x654F, + 1,0x65E2, + 1,0x6691, + 1,0x6885, + 1,0x6D77, + 1,0x6E1A, + 1,0x6F22, + 1,0x716E, + 1,0x722B, + 1,0x7422, + 1,0x7891, + 1,0x793E, + 1,0x7949, + 1,0x7948, + 1,0x7950, + 1,0x7956, + 1,0x795D, + 1,0x798D, + 1,0x798E, + 1,0x7A40, + 1,0x7A81, + 1,0x7BC0, + 1,0x7DF4, + 1,0x7E09, + 1,0x7E41, + 1,0x7F72, + 1,0x8005, + 1,0x81ED, + 1,0x8279, + 1,0x8279, + 1,0x8457, + 1,0x8910, + 1,0x8996, + 1,0x8B01, + 1,0x8B39, + 1,0x8CD3, + 1,0x8D08, + 1,0x8FB6, + 1,0x9038, + 1,0x96E3, + 1,0x97FF, + 1,0x983B, + 2, 'f', 'f', + 2, 'f', 'i', + 2, 'f', 'l', + 3, 'f', 'f', 'i', + 3, 'f', 'f', 'l', + 2,0x017F, 't', + 2, 's', 't', + 2,0x0574,0x0576, + 2,0x0574,0x0565, + 2,0x0574,0x056B, + 2,0x057E,0x0576, + 2,0x0574,0x056D, + 1,0x05E2, + 1,0x05D0, + 1,0x05D3, + 1,0x05D4, + 1,0x05DB, + 1,0x05DC, + 1,0x05DD, + 1,0x05E8, + 1,0x05EA, + 1, '+', + 2,0x05D0,0x05DC, + 1,0x203E, + 1,0x203E, + 1,0x203E, + 1,0x203E, + 1, '_', + 1, '_', + 1, '_', + 1, ',', + 1,0x3001, + 1, '.', + 1, ';', + 1, ':', + 1, '?', + 1, '!', + 1,0x2014, + 1, '(', + 1, ')', + 1, '{', + 1, '}', + 1,0x3014, + 1,0x3015, + 1, '#', + 1, '&', + 1, '*', + 1, '+', + 1, '-', + 1, '<', + 1, '>', + 1, '=', + 1,'\\', + 1, '$', + 1, '%', + 1, '@', + 1, '!', + 1, '"', + 1, '#', + 1, '$', + 1, '%', + 1, '&', + 1,'\'', + 1, '(', + 1, ')', + 1, '*', + 1, '+', + 1, ',', + 1, '-', + 1, '.', + 1, '/', + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1, ':', + 1, ';', + 1, '<', + 1, '=', + 1, '>', + 1, '?', + 1, '@', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, '[', + 1,'\\', + 1, ']', + 1, '^', + 1, '_', + 1, '`', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, '{', + 1, '|', + 1, '}', + 1, '~', + 1,0x2985, + 1,0x2986, + 1,0x3002, + 1,0x300C, + 1,0x300D, + 1,0x3001, + 1,0x30FB, + 1,0x30F2, + 1,0x30A1, + 1,0x30A3, + 1,0x30A5, + 1,0x30A7, + 1,0x30A9, + 1,0x30E3, + 1,0x30E5, + 1,0x30E7, + 1,0x30C3, + 1,0x30FC, + 1,0x30A2, + 1,0x30A4, + 1,0x30A6, + 1,0x30A8, + 1,0x30AA, + 1,0x30AB, + 1,0x30AD, + 1,0x30AF, + 1,0x30B1, + 1,0x30B3, + 1,0x30B5, + 1,0x30B7, + 1,0x30B9, + 1,0x30BB, + 1,0x30BD, + 1,0x30BF, + 1,0x30C1, + 1,0x30C4, + 1,0x30C6, + 1,0x30C8, + 1,0x30CA, + 1,0x30CB, + 1,0x30CC, + 1,0x30CD, + 1,0x30CE, + 1,0x30CF, + 1,0x30D2, + 1,0x30D5, + 1,0x30D8, + 1,0x30DB, + 1,0x30DE, + 1,0x30DF, + 1,0x30E0, + 1,0x30E1, + 1,0x30E2, + 1,0x30E4, + 1,0x30E6, + 1,0x30E8, + 1,0x30E9, + 1,0x30EA, + 1,0x30EB, + 1,0x30EC, + 1,0x30ED, + 1,0x30EF, + 1,0x30F3, + 1,0x3099, + 1,0x309A, + 1,0x3164, + 1,0x3131, + 1,0x3132, + 1,0x3133, + 1,0x3134, + 1,0x3135, + 1,0x3136, + 1,0x3137, + 1,0x3138, + 1,0x3139, + 1,0x313A, + 1,0x313B, + 1,0x313C, + 1,0x313D, + 1,0x313E, + 1,0x313F, + 1,0x3140, + 1,0x3141, + 1,0x3142, + 1,0x3143, + 1,0x3144, + 1,0x3145, + 1,0x3146, + 1,0x3147, + 1,0x3148, + 1,0x3149, + 1,0x314A, + 1,0x314B, + 1,0x314C, + 1,0x314D, + 1,0x314E, + 1,0x314F, + 1,0x3150, + 1,0x3151, + 1,0x3152, + 1,0x3153, + 1,0x3154, + 1,0x3155, + 1,0x3156, + 1,0x3157, + 1,0x3158, + 1,0x3159, + 1,0x315A, + 1,0x315B, + 1,0x315C, + 1,0x315D, + 1,0x315E, + 1,0x315F, + 1,0x3160, + 1,0x3161, + 1,0x3162, + 1,0x3163, + 1,0xA2, + 1,0xA3, + 1,0xAC, + 1,0xAF, + 1,0xA6, + 1,0xA5, + 1,0x20A9, + 1,0x2502, + 1,0x2190, + 1,0x2191, + 1,0x2192, + 1,0x2193, + 1,0x25A0, + 1,0x25CB, + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'C', + 1, 'D', + 1, 'G', + 1, 'J', + 1, 'K', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'f', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'O', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1, 'A', + 1, 'B', + 1, 'C', + 1, 'D', + 1, 'E', + 1, 'F', + 1, 'G', + 1, 'H', + 1, 'I', + 1, 'J', + 1, 'K', + 1, 'L', + 1, 'M', + 1, 'N', + 1, 'O', + 1, 'P', + 1, 'Q', + 1, 'R', + 1, 'S', + 1, 'T', + 1, 'U', + 1, 'V', + 1, 'W', + 1, 'X', + 1, 'Y', + 1, 'Z', + 1, 'a', + 1, 'b', + 1, 'c', + 1, 'd', + 1, 'e', + 1, 'f', + 1, 'g', + 1, 'h', + 1, 'i', + 1, 'j', + 1, 'k', + 1, 'l', + 1, 'm', + 1, 'n', + 1, 'o', + 1, 'p', + 1, 'q', + 1, 'r', + 1, 's', + 1, 't', + 1, 'u', + 1, 'v', + 1, 'w', + 1, 'x', + 1, 'y', + 1, 'z', + 1,0x0391, + 1,0x0392, + 1,0x0393, + 1,0x0394, + 1,0x0395, + 1,0x0396, + 1,0x0397, + 1,0x0398, + 1,0x0399, + 1,0x039A, + 1,0x039B, + 1,0x039C, + 1,0x039D, + 1,0x039E, + 1,0x039F, + 1,0x03A0, + 1,0x03A1, + 1,0x03F4, + 1,0x03A3, + 1,0x03A4, + 1,0x03A5, + 1,0x03A6, + 1,0x03A7, + 1,0x03A8, + 1,0x03A9, + 1,0x2207, + 1,0x03B1, + 1,0x03B2, + 1,0x03B3, + 1,0x03B4, + 1,0x03B5, + 1,0x03B6, + 1,0x03B7, + 1,0x03B8, + 1,0x03B9, + 1,0x03BA, + 1,0x03BB, + 1,0x03BC, + 1,0x03BD, + 1,0x03BE, + 1,0x03BF, + 1,0x03C0, + 1,0x03C1, + 1,0x03C2, + 1,0x03C3, + 1,0x03C4, + 1,0x03C5, + 1,0x03C6, + 1,0x03C7, + 1,0x03C8, + 1,0x03C9, + 1,0x2202, + 1,0x03F5, + 1,0x03D1, + 1,0x03F0, + 1,0x03D5, + 1,0x03F1, + 1,0x03D6, + 1,0x0391, + 1,0x0392, + 1,0x0393, + 1,0x0394, + 1,0x0395, + 1,0x0396, + 1,0x0397, + 1,0x0398, + 1,0x0399, + 1,0x039A, + 1,0x039B, + 1,0x039C, + 1,0x039D, + 1,0x039E, + 1,0x039F, + 1,0x03A0, + 1,0x03A1, + 1,0x03F4, + 1,0x03A3, + 1,0x03A4, + 1,0x03A5, + 1,0x03A6, + 1,0x03A7, + 1,0x03A8, + 1,0x03A9, + 1,0x2207, + 1,0x03B1, + 1,0x03B2, + 1,0x03B3, + 1,0x03B4, + 1,0x03B5, + 1,0x03B6, + 1,0x03B7, + 1,0x03B8, + 1,0x03B9, + 1,0x03BA, + 1,0x03BB, + 1,0x03BC, + 1,0x03BD, + 1,0x03BE, + 1,0x03BF, + 1,0x03C0, + 1,0x03C1, + 1,0x03C2, + 1,0x03C3, + 1,0x03C4, + 1,0x03C5, + 1,0x03C6, + 1,0x03C7, + 1,0x03C8, + 1,0x03C9, + 1,0x2202, + 1,0x03F5, + 1,0x03D1, + 1,0x03F0, + 1,0x03D5, + 1,0x03F1, + 1,0x03D6, + 1,0x0391, + 1,0x0392, + 1,0x0393, + 1,0x0394, + 1,0x0395, + 1,0x0396, + 1,0x0397, + 1,0x0398, + 1,0x0399, + 1,0x039A, + 1,0x039B, + 1,0x039C, + 1,0x039D, + 1,0x039E, + 1,0x039F, + 1,0x03A0, + 1,0x03A1, + 1,0x03F4, + 1,0x03A3, + 1,0x03A4, + 1,0x03A5, + 1,0x03A6, + 1,0x03A7, + 1,0x03A8, + 1,0x03A9, + 1,0x2207, + 1,0x03B1, + 1,0x03B2, + 1,0x03B3, + 1,0x03B4, + 1,0x03B5, + 1,0x03B6, + 1,0x03B7, + 1,0x03B8, + 1,0x03B9, + 1,0x03BA, + 1,0x03BB, + 1,0x03BC, + 1,0x03BD, + 1,0x03BE, + 1,0x03BF, + 1,0x03C0, + 1,0x03C1, + 1,0x03C2, + 1,0x03C3, + 1,0x03C4, + 1,0x03C5, + 1,0x03C6, + 1,0x03C7, + 1,0x03C8, + 1,0x03C9, + 1,0x2202, + 1,0x03F5, + 1,0x03D1, + 1,0x03F0, + 1,0x03D5, + 1,0x03F1, + 1,0x03D6, + 1,0x0391, + 1,0x0392, + 1,0x0393, + 1,0x0394, + 1,0x0395, + 1,0x0396, + 1,0x0397, + 1,0x0398, + 1,0x0399, + 1,0x039A, + 1,0x039B, + 1,0x039C, + 1,0x039D, + 1,0x039E, + 1,0x039F, + 1,0x03A0, + 1,0x03A1, + 1,0x03F4, + 1,0x03A3, + 1,0x03A4, + 1,0x03A5, + 1,0x03A6, + 1,0x03A7, + 1,0x03A8, + 1,0x03A9, + 1,0x2207, + 1,0x03B1, + 1,0x03B2, + 1,0x03B3, + 1,0x03B4, + 1,0x03B5, + 1,0x03B6, + 1,0x03B7, + 1,0x03B8, + 1,0x03B9, + 1,0x03BA, + 1,0x03BB, + 1,0x03BC, + 1,0x03BD, + 1,0x03BE, + 1,0x03BF, + 1,0x03C0, + 1,0x03C1, + 1,0x03C2, + 1,0x03C3, + 1,0x03C4, + 1,0x03C5, + 1,0x03C6, + 1,0x03C7, + 1,0x03C8, + 1,0x03C9, + 1,0x2202, + 1,0x03F5, + 1,0x03D1, + 1,0x03F0, + 1,0x03D5, + 1,0x03F1, + 1,0x03D6, + 1,0x0391, + 1,0x0392, + 1,0x0393, + 1,0x0394, + 1,0x0395, + 1,0x0396, + 1,0x0397, + 1,0x0398, + 1,0x0399, + 1,0x039A, + 1,0x039B, + 1,0x039C, + 1,0x039D, + 1,0x039E, + 1,0x039F, + 1,0x03A0, + 1,0x03A1, + 1,0x03F4, + 1,0x03A3, + 1,0x03A4, + 1,0x03A5, + 1,0x03A6, + 1,0x03A7, + 1,0x03A8, + 1,0x03A9, + 1,0x2207, + 1,0x03B1, + 1,0x03B2, + 1,0x03B3, + 1,0x03B4, + 1,0x03B5, + 1,0x03B6, + 1,0x03B7, + 1,0x03B8, + 1,0x03B9, + 1,0x03BA, + 1,0x03BB, + 1,0x03BC, + 1,0x03BD, + 1,0x03BE, + 1,0x03BF, + 1,0x03C0, + 1,0x03C1, + 1,0x03C2, + 1,0x03C3, + 1,0x03C4, + 1,0x03C5, + 1,0x03C6, + 1,0x03C7, + 1,0x03C8, + 1,0x03C9, + 1,0x2202, + 1,0x03F5, + 1,0x03D1, + 1,0x03F0, + 1,0x03D5, + 1,0x03F1, + 1,0x03D6, + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1, '0', + 1, '1', + 1, '2', + 1, '3', + 1, '4', + 1, '5', + 1, '6', + 1, '7', + 1, '8', + 1, '9', + 1,0x4E3D, + 1,0x4E38, + 1,0x4E41, + 1,0x20122, + 1,0x4F60, + 1,0x4FAE, + 1,0x4FBB, + 1,0x5002, + 1,0x507A, + 1,0x5099, + 1,0x50E7, + 1,0x50CF, + 1,0x349E, + 1,0x2063A, + 1,0x514D, + 1,0x5154, + 1,0x5164, + 1,0x5177, + 1,0x2051C, + 1,0x34B9, + 1,0x5167, + 1,0x518D, + 1,0x2054B, + 1,0x5197, + 1,0x51A4, + 1,0x4ECC, + 1,0x51AC, + 1,0x51B5, + 1,0x291DF, + 1,0x51F5, + 1,0x5203, + 1,0x34DF, + 1,0x523B, + 1,0x5246, + 1,0x5272, + 1,0x5277, + 1,0x3515, + 1,0x52C7, + 1,0x52C9, + 1,0x52E4, + 1,0x52FA, + 1,0x5305, + 1,0x5306, + 1,0x5317, + 1,0x5349, + 1,0x5351, + 1,0x535A, + 1,0x5373, + 1,0x537D, + 1,0x537F, + 1,0x537F, + 1,0x537F, + 1,0x20A2C, + 1,0x7070, + 1,0x53CA, + 1,0x53DF, + 1,0x20B63, + 1,0x53EB, + 1,0x53F1, + 1,0x5406, + 1,0x549E, + 1,0x5438, + 1,0x5448, + 1,0x5468, + 1,0x54A2, + 1,0x54F6, + 1,0x5510, + 1,0x5553, + 1,0x5563, + 1,0x5584, + 1,0x5584, + 1,0x5599, + 1,0x55AB, + 1,0x55B3, + 1,0x55C2, + 1,0x5716, + 1,0x5606, + 1,0x5717, + 1,0x5651, + 1,0x5674, + 1,0x5207, + 1,0x58EE, + 1,0x57CE, + 1,0x57F4, + 1,0x580D, + 1,0x578B, + 1,0x5832, + 1,0x5831, + 1,0x58AC, + 1,0x214E4, + 1,0x58F2, + 1,0x58F7, + 1,0x5906, + 1,0x591A, + 1,0x5922, + 1,0x5962, + 1,0x216A8, + 1,0x216EA, + 1,0x59EC, + 1,0x5A1B, + 1,0x5A27, + 1,0x59D8, + 1,0x5A66, + 1,0x36EE, + 1,0x36FC, + 1,0x5B08, + 1,0x5B3E, + 1,0x5B3E, + 1,0x219C8, + 1,0x5BC3, + 1,0x5BD8, + 1,0x5BE7, + 1,0x5BF3, + 1,0x21B18, + 1,0x5BFF, + 1,0x5C06, + 1,0x5F53, + 1,0x5C22, + 1,0x3781, + 1,0x5C60, + 1,0x5C6E, + 1,0x5CC0, + 1,0x5C8D, + 1,0x21DE4, + 1,0x5D43, + 1,0x21DE6, + 1,0x5D6E, + 1,0x5D6B, + 1,0x5D7C, + 1,0x5DE1, + 1,0x5DE2, + 1,0x382F, + 1,0x5DFD, + 1,0x5E28, + 1,0x5E3D, + 1,0x5E69, + 1,0x3862, + 1,0x22183, + 1,0x387C, + 1,0x5EB0, + 1,0x5EB3, + 1,0x5EB6, + 1,0x5ECA, + 1,0x2A392, + 1,0x5EFE, + 1,0x22331, + 1,0x22331, + 1,0x8201, + 1,0x5F22, + 1,0x5F22, + 1,0x38C7, + 1,0x232B8, + 1,0x261DA, + 1,0x5F62, + 1,0x5F6B, + 1,0x38E3, + 1,0x5F9A, + 1,0x5FCD, + 1,0x5FD7, + 1,0x5FF9, + 1,0x6081, + 1,0x393A, + 1,0x391C, + 1,0x6094, + 1,0x226D4, + 1,0x60C7, + 1,0x6148, + 1,0x614C, + 1,0x614E, + 1,0x614C, + 1,0x617A, + 1,0x618E, + 1,0x61B2, + 1,0x61A4, + 1,0x61AF, + 1,0x61DE, + 1,0x61F2, + 1,0x61F6, + 1,0x6210, + 1,0x621B, + 1,0x625D, + 1,0x62B1, + 1,0x62D4, + 1,0x6350, + 1,0x22B0C, + 1,0x633D, + 1,0x62FC, + 1,0x6368, + 1,0x6383, + 1,0x63E4, + 1,0x22BF1, + 1,0x6422, + 1,0x63C5, + 1,0x63A9, + 1,0x3A2E, + 1,0x6469, + 1,0x647E, + 1,0x649D, + 1,0x6477, + 1,0x3A6C, + 1,0x654F, + 1,0x656C, + 1,0x2300A, + 1,0x65E3, + 1,0x66F8, + 1,0x6649, + 1,0x3B19, + 1,0x6691, + 1,0x3B08, + 1,0x3AE4, + 1,0x5192, + 1,0x5195, + 1,0x6700, + 1,0x669C, + 1,0x80AD, + 1,0x43D9, + 1,0x6717, + 1,0x671B, + 1,0x6721, + 1,0x675E, + 1,0x6753, + 1,0x233C3, + 1,0x3B49, + 1,0x67FA, + 1,0x6785, + 1,0x6852, + 1,0x6885, + 1,0x2346D, + 1,0x688E, + 1,0x681F, + 1,0x6914, + 1,0x3B9D, + 1,0x6942, + 1,0x69A3, + 1,0x69EA, + 1,0x6AA8, + 1,0x236A3, + 1,0x6ADB, + 1,0x3C18, + 1,0x6B21, + 1,0x238A7, + 1,0x6B54, + 1,0x3C4E, + 1,0x6B72, + 1,0x6B9F, + 1,0x6BBA, + 1,0x6BBB, + 1,0x23A8D, + 1,0x21D0B, + 1,0x23AFA, + 1,0x6C4E, + 1,0x23CBC, + 1,0x6CBF, + 1,0x6CCD, + 1,0x6C67, + 1,0x6D16, + 1,0x6D3E, + 1,0x6D77, + 1,0x6D41, + 1,0x6D69, + 1,0x6D78, + 1,0x6D85, + 1,0x23D1E, + 1,0x6D34, + 1,0x6E2F, + 1,0x6E6E, + 1,0x3D33, + 1,0x6ECB, + 1,0x6EC7, + 1,0x23ED1, + 1,0x6DF9, + 1,0x6F6E, + 1,0x23F5E, + 1,0x23F8E, + 1,0x6FC6, + 1,0x7039, + 1,0x701E, + 1,0x701B, + 1,0x3D96, + 1,0x704A, + 1,0x707D, + 1,0x7077, + 1,0x70AD, + 1,0x20525, + 1,0x7145, + 1,0x24263, + 1,0x719C, + 1,0x243AB, + 1,0x7228, + 1,0x7235, + 1,0x7250, + 1,0x24608, + 1,0x7280, + 1,0x7295, + 1,0x24735, + 1,0x24814, + 1,0x737A, + 1,0x738B, + 1,0x3EAC, + 1,0x73A5, + 1,0x3EB8, + 1,0x3EB8, + 1,0x7447, + 1,0x745C, + 1,0x7471, + 1,0x7485, + 1,0x74CA, + 1,0x3F1B, + 1,0x7524, + 1,0x24C36, + 1,0x753E, + 1,0x24C92, + 1,0x7570, + 1,0x2219F, + 1,0x7610, + 1,0x24FA1, + 1,0x24FB8, + 1,0x25044, + 1,0x3FFC, + 1,0x4008, + 1,0x76F4, + 1,0x250F3, + 1,0x250F2, + 1,0x25119, + 1,0x25133, + 1,0x771E, + 1,0x771F, + 1,0x771F, + 1,0x774A, + 1,0x4039, + 1,0x778B, + 1,0x4046, + 1,0x4096, + 1,0x2541D, + 1,0x784E, + 1,0x788C, + 1,0x78CC, + 1,0x40E3, + 1,0x25626, + 1,0x7956, + 1,0x2569A, + 1,0x256C5, + 1,0x798F, + 1,0x79EB, + 1,0x412F, + 1,0x7A40, + 1,0x7A4A, + 1,0x7A4F, + 1,0x2597C, + 1,0x25AA7, + 1,0x25AA7, + 1,0x7AEE, + 1,0x4202, + 1,0x25BAB, + 1,0x7BC6, + 1,0x7BC9, + 1,0x4227, + 1,0x25C80, + 1,0x7CD2, + 1,0x42A0, + 1,0x7CE8, + 1,0x7CE3, + 1,0x7D00, + 1,0x25F86, + 1,0x7D63, + 1,0x4301, + 1,0x7DC7, + 1,0x7E02, + 1,0x7E45, + 1,0x4334, + 1,0x26228, + 1,0x26247, + 1,0x4359, + 1,0x262D9, + 1,0x7F7A, + 1,0x2633E, + 1,0x7F95, + 1,0x7FFA, + 1,0x8005, + 1,0x264DA, + 1,0x26523, + 1,0x8060, + 1,0x265A8, + 1,0x8070, + 1,0x2335F, + 1,0x43D5, + 1,0x80B2, + 1,0x8103, + 1,0x440B, + 1,0x813E, + 1,0x5AB5, + 1,0x267A7, + 1,0x267B5, + 1,0x23393, + 1,0x2339C, + 1,0x8201, + 1,0x8204, + 1,0x8F9E, + 1,0x446B, + 1,0x8291, + 1,0x828B, + 1,0x829D, + 1,0x52B3, + 1,0x82B1, + 1,0x82B3, + 1,0x82BD, + 1,0x82E6, + 1,0x26B3C, + 1,0x82E5, + 1,0x831D, + 1,0x8363, + 1,0x83AD, + 1,0x8323, + 1,0x83BD, + 1,0x83E7, + 1,0x8457, + 1,0x8353, + 1,0x83CA, + 1,0x83CC, + 1,0x83DC, + 1,0x26C36, + 1,0x26D6B, + 1,0x26CD5, + 1,0x452B, + 1,0x84F1, + 1,0x84F3, + 1,0x8516, + 1,0x273CA, + 1,0x8564, + 1,0x26F2C, + 1,0x455D, + 1,0x4561, + 1,0x26FB1, + 1,0x270D2, + 1,0x456B, + 1,0x8650, + 1,0x865C, + 1,0x8667, + 1,0x8669, + 1,0x86A9, + 1,0x8688, + 1,0x870E, + 1,0x86E2, + 1,0x8779, + 1,0x8728, + 1,0x876B, + 1,0x8786, + 1,0x45D7, + 1,0x87E1, + 1,0x8801, + 1,0x45F9, + 1,0x8860, + 1,0x8863, + 1,0x27667, + 1,0x88D7, + 1,0x88DE, + 1,0x4635, + 1,0x88FA, + 1,0x34BB, + 1,0x278AE, + 1,0x27966, + 1,0x46BE, + 1,0x46C7, + 1,0x8AA0, + 1,0x8AED, + 1,0x8B8A, + 1,0x8C55, + 1,0x27CA8, + 1,0x8CAB, + 1,0x8CC1, + 1,0x8D1B, + 1,0x8D77, + 1,0x27F2F, + 1,0x20804, + 1,0x8DCB, + 1,0x8DBC, + 1,0x8DF0, + 1,0x208DE, + 1,0x8ED4, + 1,0x8F38, + 1,0x285D2, + 1,0x285ED, + 1,0x9094, + 1,0x90F1, + 1,0x9111, + 1,0x2872E, + 1,0x911B, + 1,0x9238, + 1,0x92D7, + 1,0x92D8, + 1,0x927C, + 1,0x93F9, + 1,0x9415, + 1,0x28BFA, + 1,0x958B, + 1,0x4995, + 1,0x95B7, + 1,0x28D77, + 1,0x49E6, + 1,0x96C3, + 1,0x5DB2, + 1,0x9723, + 1,0x29145, + 1,0x2921A, + 1,0x4A6E, + 1,0x4A76, + 1,0x97E0, + 1,0x2940A, + 1,0x4AB2, + 1,0x29496, + 1,0x980B, + 1,0x980B, + 1,0x9829, + 1,0x295B6, + 1,0x98E2, + 1,0x4B33, + 1,0x9929, + 1,0x99A7, + 1,0x99C2, + 1,0x99FE, + 1,0x4BCE, + 1,0x29B30, + 1,0x9B12, + 1,0x9C40, + 1,0x9CFD, + 1,0x4CCE, + 1,0x4CED, + 1,0x9D67, + 1,0x2A0CE, + 1,0x4CF8, + 1,0x2A105, + 1,0x2A20E, + 1,0x2A291, + 1,0x9EBB, + 1,0x4D56, + 1,0x9EF9, + 1,0x9EFE, + 1,0x9F05, + 1,0x9F0F, + 1,0x9F16, + 1,0x9F3B, + 1,0x2A600, +}; + +static const short translit_page00[344] = { + 0, 2, 4, 6, -1, 9, 13, 15, /* 0xa0-0xa7 */ + 18, 20, 24, 26, 29, 33, 35, -1, /* 0xa8-0xaf */ + 39, 42, 46, 49, 52, 54, 56, 58, /* 0xb0-0xb7 */ + 60, 62, 65, 67, 70, 76, 82, 88, /* 0xb8-0xbf */ + 90, 93, 96, 99, 102, 105, 107, 110, /* 0xc0-0xc7 */ + 112, 115, 118, 121, 124, 127, 130, 133, /* 0xc8-0xcf */ + 136, 138, 141, 144, 147, 150, 153, 156, /* 0xd0-0xd7 */ + 158, 160, 163, 166, 169, 172, 175, 178, /* 0xd8-0xdf */ + 181, 184, 187, 190, 193, 196, 198, 201, /* 0xe0-0xe7 */ + 203, 206, 209, 212, 215, 218, 221, 224, /* 0xe8-0xef */ + 227, 229, 232, 235, 238, 241, 244, 247, /* 0xf0-0xf7 */ + 249, 251, 254, 257, 260, 263, 266, 269, /* 0xf8-0xff */ + /* 0x0100 */ + 272, 274, 276, 278, 280, 282, 284, 287, /* 0x00-0x07 */ + 290, 293, 296, 298, 300, 302, 304, 306, /* 0x08-0x0f */ + 308, 310, 312, 314, 316, 318, 320, 322, /* 0x10-0x17 */ + 324, 326, 328, 330, 332, 335, 338, 340, /* 0x18-0x1f */ + 342, 344, 346, 348, 350, 353, 356, 358, /* 0x20-0x27 */ + 360, 363, 366, 368, 370, 372, 374, 376, /* 0x28-0x2f */ + 378, 380, 382, 385, 388, 391, 394, 396, /* 0x30-0x37 */ + -1, 398, 400, 402, 404, 406, 408, 410, /* 0x38-0x3f */ + 412, 414, 416, 418, 421, 424, 426, 428, /* 0x40-0x47 */ + 430, 432, -1, -1, 435, 437, 439, 441, /* 0x48-0x4f */ + 443, 446, 449, 452, 455, 458, 461, 463, /* 0x50-0x57 */ + 465, 467, 469, 472, 475, 478, 481, 483, /* 0x58-0x5f */ + 485, 487, 489, 491, 493, 495, 497, 499, /* 0x60-0x67 */ + 501, 504, 507, 509, 511, 513, 515, 517, /* 0x68-0x6f */ + 519, 522, 525, 527, 529, 532, 535, 538, /* 0x70-0x77 */ + 541, 544, 547, 550, 552, 554, 556, 558, /* 0x78-0x7f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x87 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ + -1, -1, 560, -1, -1, -1, -1, -1, /* 0x90-0x97 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x98-0x9f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xa7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ + -1, -1, -1, -1, 562, 565, 568, 571, /* 0xc0-0xc7 */ + 574, 577, 580, 583, 586, -1, -1, -1, /* 0xc8-0xcf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe8-0xef */ + -1, 589, 592, 595, -1, -1, -1, -1, /* 0xf0-0xf7 */ +}; +static const short translit_page02[8] = { + 598, 600, 602, 604, -1, -1, -1, -1, /* 0x18-0x1f */ +}; +static const short translit_page02_1[40] = { + -1, 606, 608, 610, 612, 614, -1, -1, /* 0xb8-0xbf */ + -1, -1, -1, -1, -1, -1, 616, -1, /* 0xc0-0xc7 */ + 618, 620, 622, 624, -1, 626, -1, -1, /* 0xc8-0xcf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ + -1, -1, -1, -1, 628, 630, -1, -1, /* 0xd8-0xdf */ +}; +static const short translit_page03[48] = { + 632, 634, 636, -1, -1, 638, 640, -1, /* 0xd0-0xd7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe8-0xef */ + 642, 644, 646, -1, 648, 650, -1, -1, /* 0xf0-0xf7 */ + -1, 652, -1, -1, -1, -1, -1, -1, /* 0xf8-0xff */ +}; +static const short translit_page05[8] = { + 657, 660, 663, -1, -1, -1, -1, -1, /* 0xf0-0xf7 */ +}; +static const short translit_page06[16] = { + -1, -1, -1, -1, -1, 666, 669, 672, /* 0x70-0x77 */ + 675, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ +}; +static const short translit_page0e[48] = { + -1, -1, -1, 681, -1, -1, -1, -1, /* 0xb0-0xb7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xc7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ + -1, -1, -1, -1, 684, 687, -1, -1, /* 0xd8-0xdf */ +}; +static const short translit_page0f[16] = { + -1, -1, -1, -1, -1, -1, -1, 690, /* 0x70-0x77 */ + -1, 693, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ +}; +static const short translit_page1e[160] = { + -1, -1, 696, 698, -1, -1, -1, -1, /* 0x00-0x07 */ + -1, -1, 700, 702, -1, -1, -1, -1, /* 0x08-0x0f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x17 */ + -1, -1, -1, -1, -1, -1, 704, 706, /* 0x18-0x1f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ + 708, 710, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, -1, -1, -1, 712, 714, /* 0x50-0x57 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ + 716, 718, -1, -1, -1, -1, -1, -1, /* 0x60-0x67 */ + -1, -1, 720, 722, -1, -1, -1, -1, /* 0x68-0x6f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x77 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ + 724, 727, 730, 733, 736, 739, -1, -1, /* 0x80-0x87 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x97 */ + -1, -1, 742, -1, -1, -1, -1, -1, /* 0x98-0x9f */ +}; +static const short translit_page1e_2[8] = { + -1, -1, 745, 748, -1, -1, -1, -1, /* 0xf0-0xf7 */ +}; +static const short translit_page20[88] = { + -1, -1, 751, 753, 755, 757, 759, -1, /* 0x00-0x07 */ + 761, 763, 765, -1, -1, -1, -1, -1, /* 0x08-0x0f */ + 767, 769, 771, 773, 775, 777, -1, -1, /* 0x10-0x17 */ + 779, 781, 783, 785, 787, 789, 791, 793, /* 0x18-0x1f */ + 795, -1, 797, -1, 799, 801, 804, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ + 808, -1, 813, 815, 818, -1, 822, 825, /* 0x30-0x37 */ + -1, 829, 831, -1, 833, -1, -1, -1, /* 0x38-0x3f */ + -1, -1, -1, -1, 836, -1, -1, 838, /* 0x40-0x47 */ + 841, 844, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, -1, -1, -1, -1, 847, /* 0x50-0x57 */ +}; +static const short translit_page20_3[8] = { + 852, -1, -1, 855, 860, -1, -1, -1, /* 0xa8-0xaf */ +}; +static const short translit_page21[216] = { + 864, 868, 872, 874, -1, 877, 881, 885, /* 0x00-0x07 */ + -1, 887, 890, 892, 894, 896, 898, 900, /* 0x08-0x0f */ + 902, 904, 906, 908, -1, 910, 912, -1, /* 0x10-0x17 */ + -1, 915, 917, 919, 921, 923, -1, -1, /* 0x18-0x1f */ + -1, 925, 929, -1, 932, -1, 934, -1, /* 0x20-0x27 */ + 938, -1, -1, -1, 940, 942, 944, 946, /* 0x28-0x2f */ + 948, 950, -1, 952, 954, 956, 958, 960, /* 0x30-0x37 */ + 962, 964, -1, 966, -1, 970, 972, 974, /* 0x38-0x3f */ + 976, -1, -1, -1, -1, 978, 980, 982, /* 0x40-0x47 */ + 984, 986, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, 988, 994, 1000, 1006, 1012, /* 0x50-0x57 */ + 1018, 1024, 1030, 1036, 1042, 1048, 1054, 1060, /* 0x58-0x5f */ + 1064, 1066, 1069, 1073, 1076, 1078, 1081, 1085, /* 0x60-0x67 */ + 1090, 1093, 1095, 1098, 1102, 1104, 1106, 1108, /* 0x68-0x6f */ + 1110, 1112, 1115, 1119, 1122, 1124, 1127, 1131, /* 0x70-0x77 */ + 1136, 1139, 1141, 1144, 1148, 1150, 1152, 1154, /* 0x78-0x7f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x87 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ + 1156, 1159, 1161, 1164, 1166, -1, -1, -1, /* 0x90-0x97 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x98-0x9f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xa7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xc7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ + 1170, -1, 1173, -1, 1176, -1, -1, -1, /* 0xd0-0xd7 */ +}; +static const short translit_page22[96] = { + -1, -1, 1180, -1, -1, 1182, 1184, 1186, /* 0x10-0x17 */ + -1, 1188, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ + -1, -1, -1, 1190, -1, -1, -1, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, 1192, 1195, -1, 1199, /* 0x28-0x2f */ + 1202, -1, -1, -1, -1, -1, 1206, -1, /* 0x30-0x37 */ + -1, -1, -1, -1, 1208, -1, -1, -1, /* 0x38-0x3f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ + 1210, -1, -1, -1, 1213, 1216, -1, -1, /* 0x60-0x67 */ + -1, -1, 1219, 1222, -1, -1, -1, -1, /* 0x68-0x6f */ +}; +static const short translit_page22_4[48] = { + -1, -1, -1, -1, -1, 1225, -1, -1, /* 0xc0-0xc7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ + 1227, 1231, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ + -1, -1, -1, -1, -1, -1, -1, 1235, /* 0xe8-0xef */ +}; +static const short translit_page24[240] = { + 1239, 1245, 1251, 1257, 1263, 1269, 1275, 1281, /* 0x00-0x07 */ + 1287, 1292, 1297, 1302, 1307, 1312, 1317, 1322, /* 0x08-0x0f */ + 1327, 1333, 1339, 1345, 1351, 1357, 1363, 1369, /* 0x10-0x17 */ + 1375, 1381, 1386, 1392, 1398, 1403, 1408, 1413, /* 0x18-0x1f */ + 1418, 1423, -1, -1, 1429, -1, -1, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ + 1434, 1438, 1442, 1446, 1450, 1454, 1458, 1462, /* 0x60-0x67 */ + 1466, 1470, 1475, 1480, 1485, 1490, 1495, 1500, /* 0x68-0x6f */ + 1505, 1510, 1515, 1520, 1525, 1529, 1533, 1537, /* 0x70-0x77 */ + 1541, 1545, 1549, 1553, 1557, 1561, 1566, 1571, /* 0x78-0x7f */ + 1576, 1581, 1586, 1591, 1596, 1601, 1606, 1611, /* 0x80-0x87 */ + 1616, 1619, 1622, 1625, 1628, 1631, 1634, 1637, /* 0x88-0x8f */ + 1640, 1643, 1647, 1651, 1655, 1659, 1663, 1667, /* 0x90-0x97 */ + 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1699, /* 0x98-0x9f */ + 1703, 1707, 1711, 1715, 1719, 1723, 1727, 1731, /* 0xa0-0xa7 */ + 1735, 1739, 1743, 1747, 1751, 1755, 1759, 1763, /* 0xa8-0xaf */ + 1767, 1771, 1775, 1779, 1783, 1787, 1791, 1795, /* 0xb0-0xb7 */ + 1799, 1803, 1807, 1811, 1815, 1819, 1823, 1827, /* 0xb8-0xbf */ + 1831, 1835, 1839, 1843, 1847, 1851, 1855, 1859, /* 0xc0-0xc7 */ + 1863, 1867, 1871, 1875, 1879, 1883, 1887, 1891, /* 0xc8-0xcf */ + 1895, 1899, 1903, 1907, 1911, 1915, 1919, 1923, /* 0xd0-0xd7 */ + 1927, 1931, 1935, 1939, 1943, 1947, 1951, 1955, /* 0xd8-0xdf */ + 1959, 1963, 1967, 1971, 1975, 1979, 1983, 1987, /* 0xe0-0xe7 */ + 1991, 1995, 1999, -1, -1, -1, -1, -1, /* 0xe8-0xef */ +}; +static const short translit_page25[64] = { + 2003, -1, 2005, -1, -1, -1, -1, -1, /* 0x00-0x07 */ + -1, -1, -1, -1, 2007, -1, -1, -1, /* 0x08-0x0f */ + 2009, -1, -1, -1, 2011, -1, -1, -1, /* 0x10-0x17 */ + 2013, -1, -1, -1, 2015, -1, -1, -1, /* 0x18-0x1f */ + -1, -1, -1, -1, 2017, -1, -1, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, 2019, -1, -1, -1, /* 0x28-0x2f */ + -1, -1, -1, -1, 2021, -1, -1, -1, /* 0x30-0x37 */ + -1, -1, -1, -1, 2023, -1, -1, -1, /* 0x38-0x3f */ +}; +static const short translit_page2a[8] = { + -1, -1, -1, -1, 2032, 2036, 2039, -1, /* 0x70-0x77 */ +}; +static const short translit_page2f[216] = { + 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, /* 0x00-0x07 */ + 2063, 2065, 2067, 2069, 2071, 2073, 2075, 2077, /* 0x08-0x0f */ + 2079, 2081, 2083, 2085, 2087, 2089, 2091, 2093, /* 0x10-0x17 */ + 2095, 2097, 2099, 2101, 2103, 2105, 2107, 2109, /* 0x18-0x1f */ + 2111, 2113, 2115, 2117, 2119, 2121, 2123, 2125, /* 0x20-0x27 */ + 2127, 2129, 2131, 2133, 2135, 2137, 2139, 2141, /* 0x28-0x2f */ + 2143, 2145, 2147, 2149, 2151, 2153, 2155, 2157, /* 0x30-0x37 */ + 2159, 2161, 2163, 2165, 2167, 2169, 2171, 2173, /* 0x38-0x3f */ + 2175, 2177, 2179, 2181, 2183, 2185, 2187, 2189, /* 0x40-0x47 */ + 2191, 2193, 2195, 2197, 2199, 2201, 2203, 2205, /* 0x48-0x4f */ + 2207, 2209, 2211, 2213, 2215, 2217, 2219, 2221, /* 0x50-0x57 */ + 2223, 2225, 2227, 2229, 2231, 2233, 2235, 2237, /* 0x58-0x5f */ + 2239, 2241, 2243, 2245, 2247, 2249, 2251, 2253, /* 0x60-0x67 */ + 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, /* 0x68-0x6f */ + 2271, 2273, 2275, 2277, 2279, 2281, 2283, 2285, /* 0x70-0x77 */ + 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, /* 0x78-0x7f */ + 2303, 2305, 2307, 2309, 2311, 2313, 2315, 2317, /* 0x80-0x87 */ + 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, /* 0x88-0x8f */ + 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, /* 0x90-0x97 */ + 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2365, /* 0x98-0x9f */ + 2367, 2369, 2371, 2373, 2375, 2377, 2379, 2381, /* 0xa0-0xa7 */ + 2383, 2385, 2387, 2389, 2391, 2393, 2395, 2397, /* 0xa8-0xaf */ + 2399, 2401, 2403, 2405, 2407, 2409, 2411, 2413, /* 0xb0-0xb7 */ + 2415, 2417, 2419, 2421, 2423, 2425, 2427, 2429, /* 0xb8-0xbf */ + 2431, 2433, 2435, 2437, 2439, 2441, 2443, 2445, /* 0xc0-0xc7 */ + 2447, 2449, 2451, 2453, 2455, 2457, 2459, 2461, /* 0xc8-0xcf */ + 2463, 2465, 2467, 2469, 2471, 2473, -1, -1, /* 0xd0-0xd7 */ +}; +static const short translit_page30[248] = { + 2475, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x07 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x08-0x0f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x17 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x27 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ + -1, -1, -1, -1, -1, -1, 2477, -1, /* 0x30-0x37 */ + 2479, 2481, 2483, -1, -1, -1, -1, -1, /* 0x38-0x3f */ + -1, 2485, -1, 2487, -1, 2489, -1, 2491, /* 0x40-0x47 */ + -1, 2493, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ + -1, -1, -1, 2495, -1, -1, -1, -1, /* 0x60-0x67 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x68-0x6f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x77 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ + -1, -1, -1, 2497, -1, 2499, -1, 2501, /* 0x80-0x87 */ + -1, -1, -1, -1, -1, -1, 2503, -1, /* 0x88-0x8f */ + -1, -1, -1, -1, -1, 2505, 2507, -1, /* 0x90-0x97 */ + -1, -1, -1, 2509, 2512, -1, -1, -1, /* 0x98-0x9f */ + 2515, 2517, -1, 2519, -1, 2521, -1, 2523, /* 0xa0-0xa7 */ + -1, 2525, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ + -1, -1, -1, 2527, -1, -1, -1, -1, /* 0xc0-0xc7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ + -1, -1, -1, 2529, -1, 2531, -1, 2533, /* 0xe0-0xe7 */ + -1, -1, -1, -1, -1, -1, 2535, -1, /* 0xe8-0xef */ + -1, -1, -1, -1, -1, 2537, 2539, -1, /* 0xf0-0xf7 */ +}; +static const short translit_page31[96] = { + -1, 2541, 2543, 2545, 2547, 2549, 2551, 2553, /* 0x30-0x37 */ + 2555, 2557, 2559, 2561, 2563, 2565, 2567, 2569, /* 0x38-0x3f */ + 2571, 2573, 2575, 2577, 2579, 2581, 2583, 2585, /* 0x40-0x47 */ + 2587, 2589, 2591, 2593, 2595, 2597, 2599, 2601, /* 0x48-0x4f */ + 2603, 2605, 2607, 2609, 2611, 2613, 2615, 2617, /* 0x50-0x57 */ + 2619, 2621, 2623, 2625, 2627, 2629, 2631, 2633, /* 0x58-0x5f */ + 2635, 2637, 2639, 2641, 2643, 2645, 2647, 2649, /* 0x60-0x67 */ + 2651, 2653, 2655, 2657, 2659, 2661, 2663, 2665, /* 0x68-0x6f */ + 2667, 2669, 2671, 2673, 2675, 2677, 2679, 2681, /* 0x70-0x77 */ + 2683, 2685, 2687, 2689, 2691, 2693, 2695, 2697, /* 0x78-0x7f */ + 2699, 2701, 2703, 2705, 2707, 2709, 2711, 2713, /* 0x80-0x87 */ + 2715, 2717, 2719, 2721, 2723, 2725, 2727, -1, /* 0x88-0x8f */ +}; +static const short translit_page31_5[528] = { + 2729, 2731, 2733, 2735, 2737, 2739, 2741, 2743, /* 0xf0-0xf7 */ + 2745, 2747, 2749, 2751, 2753, 2755, 2757, 2759, /* 0xf8-0xff */ + /* 0x3200 */ + 2761, 2765, 2769, 2773, 2777, 2781, 2785, 2789, /* 0x00-0x07 */ + 2793, 2797, 2801, 2805, 2809, 2813, 2817, 2822, /* 0x08-0x0f */ + 2827, 2832, 2837, 2842, 2847, 2852, 2857, 2862, /* 0x10-0x17 */ + 2867, 2872, 2877, 2882, 2887, 2892, 2900, -1, /* 0x18-0x1f */ + 2907, 2911, 2915, 2919, 2923, 2927, 2931, 2935, /* 0x20-0x27 */ + 2939, 2943, 2947, 2951, 2955, 2959, 2963, 2967, /* 0x28-0x2f */ + 2971, 2975, 2979, 2983, 2987, 2991, 2995, 2999, /* 0x30-0x37 */ + 3003, 3007, 3011, 3015, 3019, 3023, 3027, 3031, /* 0x38-0x3f */ + 3035, 3039, 3043, 3047, -1, -1, -1, -1, /* 0x40-0x47 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ + 3051, 3055, 3060, 3065, 3070, 3075, 3080, 3085, /* 0x50-0x57 */ + 3090, 3095, 3100, 3105, 3110, 3115, 3120, 3125, /* 0x58-0x5f */ + 3130, 3134, 3138, 3142, 3146, 3150, 3154, 3158, /* 0x60-0x67 */ + 3162, 3166, 3170, 3174, 3178, 3182, 3186, 3191, /* 0x68-0x6f */ + 3196, 3201, 3206, 3211, 3216, 3221, 3226, 3231, /* 0x70-0x77 */ + 3236, 3241, 3246, 3251, 3256, 3264, -1, -1, /* 0x78-0x7f */ + 3271, 3275, 3279, 3283, 3287, 3291, 3295, 3299, /* 0x80-0x87 */ + 3303, 3307, 3311, 3315, 3319, 3323, 3327, 3331, /* 0x88-0x8f */ + 3335, 3339, 3343, 3347, 3351, 3355, 3359, 3363, /* 0x90-0x97 */ + 3367, 3371, 3375, 3379, 3383, 3387, 3391, 3395, /* 0x98-0x9f */ + 3399, 3403, 3407, 3411, 3415, 3419, 3423, 3427, /* 0xa0-0xa7 */ + 3431, 3435, 3439, 3443, 3447, 3451, 3455, 3459, /* 0xa8-0xaf */ + 3463, 3467, 3472, 3477, 3482, 3487, 3492, 3497, /* 0xb0-0xb7 */ + 3502, 3507, 3512, 3517, 3522, 3527, 3532, 3537, /* 0xb8-0xbf */ + 3542, 3545, 3548, 3551, 3554, 3557, 3560, 3563, /* 0xc0-0xc7 */ + 3566, 3569, 3573, 3577, 3581, 3584, 3588, 3591, /* 0xc8-0xcf */ + 3595, 3599, 3603, 3607, 3611, 3615, 3619, 3623, /* 0xd0-0xd7 */ + 3627, 3631, 3635, 3639, 3643, 3647, 3651, 3655, /* 0xd8-0xdf */ + 3659, 3663, 3667, 3671, 3675, 3679, 3683, 3687, /* 0xe0-0xe7 */ + 3691, 3695, 3699, 3703, 3707, 3711, 3715, 3719, /* 0xe8-0xef */ + 3723, 3727, 3731, 3735, 3739, 3743, 3747, 3751, /* 0xf0-0xf7 */ + 3755, 3759, 3763, 3767, 3771, 3775, 3779, -1, /* 0xf8-0xff */ + /* 0x3300 */ + 3783, 3788, 3793, 3798, 3802, 3807, 3811, 3815, /* 0x00-0x07 */ + 3821, 3826, 3830, 3834, 3838, 3843, 3848, 3852, /* 0x08-0x0f */ + 3856, 3859, 3863, 3868, 3873, 3876, 3882, 3889, /* 0x10-0x17 */ + 3895, 3899, 3905, 3911, 3916, 3920, 3924, 3928, /* 0x18-0x1f */ + 3933, 3939, 3944, 3948, 3952, 3956, 3959, 3962, /* 0x20-0x27 */ + 3965, 3968, 3972, 3976, 3982, 3986, 3991, 3997, /* 0x28-0x2f */ + 4001, 4004, 4007, 4013, 4018, 4024, 4028, 4034, /* 0x30-0x37 */ + 4037, 4041, 4045, 4049, 4053, 4057, 4062, 4066, /* 0x38-0x3f */ + 4069, 4073, 4077, 4081, 4086, 4090, 4094, 4098, /* 0x40-0x47 */ + 4104, 4109, 4112, 4118, 4121, 4126, 4131, 4135, /* 0x48-0x4f */ + 4139, 4143, 4148, 4151, 4155, 4160, 4163, 4169, /* 0x50-0x57 */ + 4173, 4176, 4179, 4182, 4185, 4188, 4191, 4194, /* 0x58-0x5f */ + 4197, 4200, 4203, 4207, 4211, 4215, 4219, 4223, /* 0x60-0x67 */ + 4227, 4231, 4235, 4239, 4243, 4247, 4251, 4255, /* 0x68-0x6f */ + 4259, 4263, 4267, 4270, 4273, 4277, 4280, 4283, /* 0x70-0x77 */ + 4286, 4291, 4296, 4299, 4302, 4305, 4308, 4311, /* 0x78-0x7f */ + 4316, 4319, 4322, 4325, 4328, 4331, 4334, 4337, /* 0x80-0x87 */ + 4340, 4344, 4349, 4352, 4355, 4358, 4361, 4364, /* 0x88-0x8f */ + 4367, 4370, 4374, 4378, 4382, 4386, 4389, 4392, /* 0x90-0x97 */ + 4395, 4398, 4401, 4404, 4407, 4410, 4413, 4416, /* 0x98-0x9f */ + 4421, 4426, 4430, 4435, 4440, 4445, 4449, 4454, /* 0xa0-0xa7 */ + 4458, 4464, 4467, 4471, 4475, 4479, 4483, 4489, /* 0xa8-0xaf */ + 4497, 4500, 4503, 4506, 4509, 4512, 4515, 4518, /* 0xb0-0xb7 */ + 4521, 4524, 4527, 4530, 4533, 4536, 4539, 4542, /* 0xb8-0xbf */ + 4545, 4548, 4551, 4556, 4559, 4562, 4565, 4570, /* 0xc0-0xc7 */ + 4574, 4577, 4580, 4583, 4586, 4589, 4592, 4595, /* 0xc8-0xcf */ + 4598, 4601, 4604, 4608, 4611, 4614, 4618, 4622, /* 0xd0-0xd7 */ + 4625, 4630, 4634, 4637, 4640, 4643, 4646, 4650, /* 0xd8-0xdf */ + 4658, 4661, 4664, 4667, 4670, 4673, 4676, 4679, /* 0xe0-0xe7 */ + 4682, 4685, 4689, 4693, 4697, 4701, 4705, 4709, /* 0xe8-0xef */ + 4713, 4717, 4721, 4725, 4729, 4733, 4737, 4741, /* 0xf0-0xf7 */ + 4745, 4749, 4753, 4757, 4761, 4765, 4769, 4654, /* 0xf8-0xff */ +}; +static const short translit_pagef9[368] = { + 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, /* 0x00-0x07 */ + 4789, 4791, 4793, 4795, 4797, 4799, 4801, 4803, /* 0x08-0x0f */ + 4805, 4807, 4809, 4811, 4813, 4815, 4817, 4819, /* 0x10-0x17 */ + 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, /* 0x18-0x1f */ + 4837, 4839, 4841, 4843, 4845, 4847, 4849, 4851, /* 0x20-0x27 */ + 4853, 4855, 4857, 4859, 4861, 4863, 4865, 4867, /* 0x28-0x2f */ + 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, /* 0x30-0x37 */ + 4885, 4887, 4889, 4891, 4893, 4895, 4897, 4899, /* 0x38-0x3f */ + 4901, 4903, 4905, 4907, 4909, 4911, 4913, 4915, /* 0x40-0x47 */ + 4917, 4919, 4921, 4923, 4925, 4927, 4929, 4931, /* 0x48-0x4f */ + 4933, 4935, 4937, 4939, 4941, 4943, 4945, 4947, /* 0x50-0x57 */ + 4949, 4951, 4953, 4955, 4957, 4959, 4961, 4963, /* 0x58-0x5f */ + 4965, 4967, 4969, 4971, 4973, 4975, 4977, 4979, /* 0x60-0x67 */ + 4981, 4983, 4985, 4987, 4989, 4991, 4993, 4995, /* 0x68-0x6f */ + 4997, 4999, 5001, 5003, 5005, 5007, 5009, 5011, /* 0x70-0x77 */ + 5013, 5015, 5017, 5019, 5021, 5023, 5025, 5027, /* 0x78-0x7f */ + 5029, 5031, 5033, 5035, 5037, 5039, 5041, 5043, /* 0x80-0x87 */ + 5045, 5047, 5049, 5051, 5053, 5055, 5057, 5059, /* 0x88-0x8f */ + 5061, 5063, 5065, 5067, 5069, 5071, 5073, 5075, /* 0x90-0x97 */ + 5077, 5079, 5081, 5083, 5085, 5087, 5089, 5091, /* 0x98-0x9f */ + 5093, 5095, 5097, 5099, 5101, 5103, 5105, 5107, /* 0xa0-0xa7 */ + 5109, 5111, 5113, 5115, 5117, 5119, 5121, 5123, /* 0xa8-0xaf */ + 5125, 5127, 5129, 5131, 5133, 5135, 5137, 5139, /* 0xb0-0xb7 */ + 5141, 5143, 5145, 5147, 5149, 5151, 5153, 5155, /* 0xb8-0xbf */ + 5157, 5159, 5161, 5163, 5165, 5167, 5169, 5171, /* 0xc0-0xc7 */ + 5173, 5175, 5177, 5179, 5181, 5183, 5185, 5187, /* 0xc8-0xcf */ + 5189, 5191, 5193, 5195, 5197, 5199, 5201, 5203, /* 0xd0-0xd7 */ + 5205, 5207, 5209, 5211, 5213, 5215, 5217, 5219, /* 0xd8-0xdf */ + 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, /* 0xe0-0xe7 */ + 5237, 5239, 5241, 5243, 5245, 5247, 5249, 5251, /* 0xe8-0xef */ + 5253, 5255, 5257, 5259, 5261, 5263, 5265, 5267, /* 0xf0-0xf7 */ + 5269, 5271, 5273, 5275, 5277, 5279, 5281, 5283, /* 0xf8-0xff */ + /* 0xfa00 */ + 5285, 5287, 5289, 5291, 5293, 5295, 5297, 5299, /* 0x00-0x07 */ + 5301, 5303, 5305, 5307, 5309, 5311, -1, -1, /* 0x08-0x0f */ + 5313, -1, 5315, -1, -1, 5317, 5319, 5321, /* 0x10-0x17 */ + 5323, 5325, 5327, 5329, 5331, 5333, 5335, -1, /* 0x18-0x1f */ + 5337, -1, 5339, -1, -1, 5341, 5343, -1, /* 0x20-0x27 */ + -1, -1, 5345, 5347, 5349, 5351, -1, -1, /* 0x28-0x2f */ + 5353, 5355, 5357, 5359, 5361, 5363, 5365, 5367, /* 0x30-0x37 */ + 5369, 5371, 5373, 5375, 5377, 5379, 5381, 5383, /* 0x38-0x3f */ + 5385, 5387, 5389, 5391, 5393, 5395, 5397, 5399, /* 0x40-0x47 */ + 5401, 5403, 5405, 5407, 5409, 5411, 5413, 5415, /* 0x48-0x4f */ + 5417, 5419, 5421, 5423, 5425, 5427, 5429, 5431, /* 0x50-0x57 */ + 5433, 5435, 5437, 5439, 5441, 5443, 5445, 5447, /* 0x58-0x5f */ + 5449, 5451, 5453, 5455, 5457, 5459, 5461, 5463, /* 0x60-0x67 */ + 5465, 5467, 5469, -1, -1, -1, -1, -1, /* 0x68-0x6f */ +}; +static const short translit_pagefb[80] = { + 5471, 5474, 5477, 5480, 5484, 5488, 5491, -1, /* 0x00-0x07 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x08-0x0f */ + -1, -1, -1, 5494, 5497, 5500, 5503, 5506, /* 0x10-0x17 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ + 5509, 5511, 5513, 5515, 5517, 5519, 5521, 5523, /* 0x20-0x27 */ + 5525, 5527, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ + -1, -1, -1, -1, -1, -1, -1, 5529, /* 0x48-0x4f */ +}; +static const short translit_pagefe[40] = { + -1, 5532, 5534, 5536, 5538, 5540, 5542, 5544, /* 0x48-0x4f */ + 5546, 5548, 5550, -1, 5552, 5554, 5556, 5558, /* 0x50-0x57 */ + 5560, 5562, 5564, 5566, 5568, 5570, 5572, 5574, /* 0x58-0x5f */ + 5576, 5578, 5580, 5582, 5584, 5586, 5588, -1, /* 0x60-0x67 */ + 5590, 5592, 5594, 5596, -1, -1, -1, -1, /* 0x68-0x6f */ +}; +static const short translit_pageff[240] = { + -1, 5598, 5600, 5602, 5604, 5606, 5608, 5610, /* 0x00-0x07 */ + 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, /* 0x08-0x0f */ + 5628, 5630, 5632, 5634, 5636, 5638, 5640, 5642, /* 0x10-0x17 */ + 5644, 5646, 5648, 5650, 5652, 5654, 5656, 5658, /* 0x18-0x1f */ + 5660, 5662, 5664, 5666, 5668, 5670, 5672, 5674, /* 0x20-0x27 */ + 5676, 5678, 5680, 5682, 5684, 5686, 5688, 5690, /* 0x28-0x2f */ + 5692, 5694, 5696, 5698, 5700, 5702, 5704, 5706, /* 0x30-0x37 */ + 5708, 5710, 5712, 5714, 5716, 5718, 5720, 5722, /* 0x38-0x3f */ + 5724, 5726, 5728, 5730, 5732, 5734, 5736, 5738, /* 0x40-0x47 */ + 5740, 5742, 5744, 5746, 5748, 5750, 5752, 5754, /* 0x48-0x4f */ + 5756, 5758, 5760, 5762, 5764, 5766, 5768, 5770, /* 0x50-0x57 */ + 5772, 5774, 5776, 5778, 5780, 5782, 5784, 5786, /* 0x58-0x5f */ + 5788, 5790, 5792, 5794, 5796, 5798, 5800, 5802, /* 0x60-0x67 */ + 5804, 5806, 5808, 5810, 5812, 5814, 5816, 5818, /* 0x68-0x6f */ + 5820, 5822, 5824, 5826, 5828, 5830, 5832, 5834, /* 0x70-0x77 */ + 5836, 5838, 5840, 5842, 5844, 5846, 5848, 5850, /* 0x78-0x7f */ + 5852, 5854, 5856, 5858, 5860, 5862, 5864, 5866, /* 0x80-0x87 */ + 5868, 5870, 5872, 5874, 5876, 5878, 5880, 5882, /* 0x88-0x8f */ + 5884, 5886, 5888, 5890, 5892, 5894, 5896, 5898, /* 0x90-0x97 */ + 5900, 5902, 5904, 5906, 5908, 5910, 5912, 5914, /* 0x98-0x9f */ + 5916, 5918, 5920, 5922, 5924, 5926, 5928, 5930, /* 0xa0-0xa7 */ + 5932, 5934, 5936, 5938, 5940, 5942, 5944, 5946, /* 0xa8-0xaf */ + 5948, 5950, 5952, 5954, 5956, 5958, 5960, 5962, /* 0xb0-0xb7 */ + 5964, 5966, 5968, 5970, 5972, 5974, 5976, -1, /* 0xb8-0xbf */ + -1, -1, 5978, 5980, 5982, 5984, 5986, 5988, /* 0xc0-0xc7 */ + -1, -1, 5990, 5992, 5994, 5996, 5998, 6000, /* 0xc8-0xcf */ + -1, -1, 6002, 6004, 6006, 6008, 6010, 6012, /* 0xd0-0xd7 */ + -1, -1, 6014, 6016, 6018, -1, -1, -1, /* 0xd8-0xdf */ + 6020, 6022, 6024, 6026, 6028, 6030, 6032, -1, /* 0xe0-0xe7 */ + 6034, 6036, 6038, 6040, 6042, 6044, 6046, -1, /* 0xe8-0xef */ +}; +static const short translit_page1d4[1024] = { + 6048, 6050, 6052, 6054, 6056, 6058, 6060, 6062, /* 0x00-0x07 */ + 6064, 6066, 6068, 6070, 6072, 6074, 6076, 6078, /* 0x08-0x0f */ + 6080, 6082, 6084, 6086, 6088, 6090, 6092, 6094, /* 0x10-0x17 */ + 6096, 6098, 6100, 6102, 6104, 6106, 6108, 6110, /* 0x18-0x1f */ + 6112, 6114, 6116, 6118, 6120, 6122, 6124, 6126, /* 0x20-0x27 */ + 6128, 6130, 6132, 6134, 6136, 6138, 6140, 6142, /* 0x28-0x2f */ + 6144, 6146, 6148, 6150, 6152, 6154, 6156, 6158, /* 0x30-0x37 */ + 6160, 6162, 6164, 6166, 6168, 6170, 6172, 6174, /* 0x38-0x3f */ + 6176, 6178, 6180, 6182, 6184, 6186, 6188, 6190, /* 0x40-0x47 */ + 6192, 6194, 6196, 6198, 6200, 6202, 6204, 6206, /* 0x48-0x4f */ + 6208, 6210, 6212, 6214, 6216, -1, 6218, 6220, /* 0x50-0x57 */ + 6222, 6224, 6226, 6228, 6230, 6232, 6234, 6236, /* 0x58-0x5f */ + 6238, 6240, 6242, 6244, 6246, 6248, 6250, 6252, /* 0x60-0x67 */ + 6254, 6256, 6258, 6260, 6262, 6264, 6266, 6268, /* 0x68-0x6f */ + 6270, 6272, 6274, 6276, 6278, 6280, 6282, 6284, /* 0x70-0x77 */ + 6286, 6288, 6290, 6292, 6294, 6296, 6298, 6300, /* 0x78-0x7f */ + 6302, 6304, 6306, 6308, 6310, 6312, 6314, 6316, /* 0x80-0x87 */ + 6318, 6320, 6322, 6324, 6326, 6328, 6330, 6332, /* 0x88-0x8f */ + 6334, 6336, 6338, 6340, 6342, 6344, 6346, 6348, /* 0x90-0x97 */ + 6350, 6352, 6354, 6356, 6358, -1, 6360, 6362, /* 0x98-0x9f */ + -1, -1, 6364, -1, -1, 6366, 6368, -1, /* 0xa0-0xa7 */ + -1, 6370, 6372, 6374, 6376, -1, 6378, 6380, /* 0xa8-0xaf */ + 6382, 6384, 6386, 6388, 6390, 6392, 6394, 6396, /* 0xb0-0xb7 */ + 6398, 6400, -1, 6402, -1, 6404, 6406, 6408, /* 0xb8-0xbf */ + 6410, 6412, 6414, 6416, -1, 6418, 6420, 6422, /* 0xc0-0xc7 */ + 6424, 6426, 6428, 6430, 6432, 6434, 6436, 6438, /* 0xc8-0xcf */ + 6440, 6442, 6444, 6446, 6448, 6450, 6452, 6454, /* 0xd0-0xd7 */ + 6456, 6458, 6460, 6462, 6464, 6466, 6468, 6470, /* 0xd8-0xdf */ + 6472, 6474, 6476, 6478, 6480, 6482, 6484, 6486, /* 0xe0-0xe7 */ + 6488, 6490, 6492, 6494, 6496, 6498, 6500, 6502, /* 0xe8-0xef */ + 6504, 6506, 6508, 6510, 6512, 6514, 6516, 6518, /* 0xf0-0xf7 */ + 6520, 6522, 6524, 6526, 6528, 6530, 6532, 6534, /* 0xf8-0xff */ + /* 0x1d500 */ + 6536, 6538, 6540, 6542, 6544, 6546, -1, 6548, /* 0x00-0x07 */ + 6550, 6552, 6554, -1, -1, 6556, 6558, 6560, /* 0x08-0x0f */ + 6562, 6564, 6566, 6568, 6570, -1, 6572, 6574, /* 0x10-0x17 */ + 6576, 6578, 6580, 6582, 6584, -1, 6586, 6588, /* 0x18-0x1f */ + 6590, 6592, 6594, 6596, 6598, 6600, 6602, 6604, /* 0x20-0x27 */ + 6606, 6608, 6610, 6612, 6614, 6616, 6618, 6620, /* 0x28-0x2f */ + 6622, 6624, 6626, 6628, 6630, 6632, 6634, 6636, /* 0x30-0x37 */ + 6638, 6640, -1, 6642, 6644, 6646, 6648, -1, /* 0x38-0x3f */ + 6650, 6652, 6654, 6656, 6658, -1, 6660, -1, /* 0x40-0x47 */ + -1, -1, 6662, 6664, 6666, 6668, 6670, 6672, /* 0x48-0x4f */ + 6674, -1, 6676, 6678, 6680, 6682, 6684, 6686, /* 0x50-0x57 */ + 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, /* 0x58-0x5f */ + 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, /* 0x60-0x67 */ + 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, /* 0x68-0x6f */ + 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, /* 0x70-0x77 */ + 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, /* 0x78-0x7f */ + 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782, /* 0x80-0x87 */ + 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, /* 0x88-0x8f */ + 6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, /* 0x90-0x97 */ + 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830, /* 0x98-0x9f */ + 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, /* 0xa0-0xa7 */ + 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, /* 0xa8-0xaf */ + 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878, /* 0xb0-0xb7 */ + 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, /* 0xb8-0xbf */ + 6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, /* 0xc0-0xc7 */ + 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926, /* 0xc8-0xcf */ + 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, /* 0xd0-0xd7 */ + 6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, /* 0xd8-0xdf */ + 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974, /* 0xe0-0xe7 */ + 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, /* 0xe8-0xef */ + 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, /* 0xf0-0xf7 */ + 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022, /* 0xf8-0xff */ + /* 0x1d600 */ + 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, /* 0x00-0x07 */ + 7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, /* 0x08-0x0f */ + 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070, /* 0x10-0x17 */ + 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, /* 0x18-0x1f */ + 7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, /* 0x20-0x27 */ + 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118, /* 0x28-0x2f */ + 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, /* 0x30-0x37 */ + 7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, /* 0x38-0x3f */ + 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166, /* 0x40-0x47 */ + 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, /* 0x48-0x4f */ + 7184, 7186, 7188, 7190, 7192, 7194, 7196, 7198, /* 0x50-0x57 */ + 7200, 7202, 7204, 7206, 7208, 7210, 7212, 7214, /* 0x58-0x5f */ + 7216, 7218, 7220, 7222, 7224, 7226, 7228, 7230, /* 0x60-0x67 */ + 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246, /* 0x68-0x6f */ + 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, /* 0x70-0x77 */ + 7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, /* 0x78-0x7f */ + 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, /* 0x80-0x87 */ + 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, /* 0x88-0x8f */ + 7312, 7314, 7316, 7318, 7320, 7322, 7324, 7326, /* 0x90-0x97 */ + 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, /* 0x98-0x9f */ + 7344, 7346, 7348, 7350, -1, -1, -1, -1, /* 0xa0-0xa7 */ + 7352, 7354, 7356, 7358, 7360, 7362, 7364, 7366, /* 0xa8-0xaf */ + 7368, 7370, 7372, 7374, 7376, 7378, 7380, 7382, /* 0xb0-0xb7 */ + 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, /* 0xb8-0xbf */ + 7400, 7402, 7404, 7406, 7408, 7410, 7412, 7414, /* 0xc0-0xc7 */ + 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, /* 0xc8-0xcf */ + 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, /* 0xd0-0xd7 */ + 7448, 7450, 7452, 7454, 7456, 7458, 7460, 7462, /* 0xd8-0xdf */ + 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, /* 0xe0-0xe7 */ + 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, /* 0xe8-0xef */ + 7496, 7498, 7500, 7502, 7504, 7506, 7508, 7510, /* 0xf0-0xf7 */ + 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, /* 0xf8-0xff */ + /* 0x1d700 */ + 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, /* 0x00-0x07 */ + 7544, 7546, 7548, 7550, 7552, 7554, 7556, 7558, /* 0x08-0x0f */ + 7560, 7562, 7564, 7566, 7568, 7570, 7572, 7574, /* 0x10-0x17 */ + 7576, 7578, 7580, 7582, 7584, 7586, 7588, 7590, /* 0x18-0x1f */ + 7592, 7594, 7596, 7598, 7600, 7602, 7604, 7606, /* 0x20-0x27 */ + 7608, 7610, 7612, 7614, 7616, 7618, 7620, 7622, /* 0x28-0x2f */ + 7624, 7626, 7628, 7630, 7632, 7634, 7636, 7638, /* 0x30-0x37 */ + 7640, 7642, 7644, 7646, 7648, 7650, 7652, 7654, /* 0x38-0x3f */ + 7656, 7658, 7660, 7662, 7664, 7666, 7668, 7670, /* 0x40-0x47 */ + 7672, 7674, 7676, 7678, 7680, 7682, 7684, 7686, /* 0x48-0x4f */ + 7688, 7690, 7692, 7694, 7696, 7698, 7700, 7702, /* 0x50-0x57 */ + 7704, 7706, 7708, 7710, 7712, 7714, 7716, 7718, /* 0x58-0x5f */ + 7720, 7722, 7724, 7726, 7728, 7730, 7732, 7734, /* 0x60-0x67 */ + 7736, 7738, 7740, 7742, 7744, 7746, 7748, 7750, /* 0x68-0x6f */ + 7752, 7754, 7756, 7758, 7760, 7762, 7764, 7766, /* 0x70-0x77 */ + 7768, 7770, 7772, 7774, 7776, 7778, 7780, 7782, /* 0x78-0x7f */ + 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, /* 0x80-0x87 */ + 7800, 7802, 7804, 7806, 7808, 7810, 7812, 7814, /* 0x88-0x8f */ + 7816, 7818, 7820, 7822, 7824, 7826, 7828, 7830, /* 0x90-0x97 */ + 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, /* 0x98-0x9f */ + 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862, /* 0xa0-0xa7 */ + 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878, /* 0xa8-0xaf */ + 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, /* 0xb0-0xb7 */ + 7896, 7898, 7900, 7902, 7904, 7906, 7908, 7910, /* 0xb8-0xbf */ + 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, /* 0xc0-0xc7 */ + 7928, 7930, -1, -1, -1, -1, 7932, 7934, /* 0xc8-0xcf */ + 7936, 7938, 7940, 7942, 7944, 7946, 7948, 7950, /* 0xd0-0xd7 */ + 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, /* 0xd8-0xdf */ + 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, /* 0xe0-0xe7 */ + 7984, 7986, 7988, 7990, 7992, 7994, 7996, 7998, /* 0xe8-0xef */ + 8000, 8002, 8004, 8006, 8008, 8010, 8012, 8014, /* 0xf0-0xf7 */ + 8016, 8018, 8020, 8022, 8024, 8026, 8028, 8030, /* 0xf8-0xff */ +}; +static const short translit_page2f8[544] = { + 8032, 8034, 8036, 8038, 8040, 8042, 8044, 8046, /* 0x00-0x07 */ + 8048, 8050, 8052, 8054, 8056, 8058, 8060, 8062, /* 0x08-0x0f */ + 8064, 8066, 8068, 8070, 8072, 8074, 8076, 8078, /* 0x10-0x17 */ + 8080, 8082, 8084, 8086, 8088, 8090, 8092, 8094, /* 0x18-0x1f */ + 8096, 8098, 8100, 8102, 8104, 8106, 8108, 8110, /* 0x20-0x27 */ + 8112, 8114, 8116, 8118, 8120, 8122, 8124, 8126, /* 0x28-0x2f */ + 8128, 8130, 8132, 8134, 8136, 8138, 8140, 8142, /* 0x30-0x37 */ + 8144, 8146, 8148, 8150, 8152, 8154, 8156, 8158, /* 0x38-0x3f */ + 8160, 8162, 8164, 8166, 8168, 8170, 8172, 8174, /* 0x40-0x47 */ + 8176, 8178, 8180, 8182, 8184, 8186, 8188, 8190, /* 0x48-0x4f */ + 8192, 8194, 8196, 8198, 8200, 8202, 8204, 8206, /* 0x50-0x57 */ + 8208, 8210, 8212, 8214, 8216, 8218, 8220, 8222, /* 0x58-0x5f */ + 8224, 8226, 8228, 8230, 8232, 8234, 8236, 8238, /* 0x60-0x67 */ + 8240, 8242, 8244, 8246, 8248, 8250, 8252, 8254, /* 0x68-0x6f */ + 8256, 8258, 8260, 8262, 8264, 8266, 8268, 8270, /* 0x70-0x77 */ + 8272, 8274, 8276, 8278, 8280, 8282, 8284, 8286, /* 0x78-0x7f */ + 8288, 8290, 8292, 8294, 8296, 8298, 8300, 8302, /* 0x80-0x87 */ + 8304, 8306, 8308, 8310, 8312, 8314, 8316, 8318, /* 0x88-0x8f */ + 8320, 8322, 8324, 8326, 8328, 8330, 8332, 8334, /* 0x90-0x97 */ + 8336, 8338, 8340, 8342, 8344, 8346, 8348, 8350, /* 0x98-0x9f */ + 8352, 8354, 8356, 8358, 8360, 8362, 8364, 8366, /* 0xa0-0xa7 */ + 8368, 8370, 8372, 8374, 8376, 8378, 8380, 8382, /* 0xa8-0xaf */ + 8384, 8386, 8388, 8390, 8392, 8394, 8396, 8398, /* 0xb0-0xb7 */ + 8400, 8402, 8404, 8406, 8408, 8410, 8412, 8414, /* 0xb8-0xbf */ + 8416, 8418, 8420, 8422, 8424, 8426, 8428, 8430, /* 0xc0-0xc7 */ + 8432, 8434, 8436, 8438, 8440, 8442, 8444, 8446, /* 0xc8-0xcf */ + 8448, 8450, 8452, 8454, 8456, 8458, 8460, 8462, /* 0xd0-0xd7 */ + 8464, 8466, 8468, 8470, 8472, 8474, 8476, 8478, /* 0xd8-0xdf */ + 8480, 8482, 8484, 8486, 8488, 8490, 8492, 8494, /* 0xe0-0xe7 */ + 8496, 8498, 8500, 8502, 8504, 8506, 8508, 8510, /* 0xe8-0xef */ + 8512, 8514, 8516, 8518, 8520, 8522, 8524, 8526, /* 0xf0-0xf7 */ + 8528, 8530, 8532, 8534, 8536, 8538, 8540, 8542, /* 0xf8-0xff */ + /* 0x2f900 */ + 8544, 8546, 8548, 8550, 8552, 8554, 8556, 8558, /* 0x00-0x07 */ + 8560, 8562, 8564, 8566, 8568, 8570, 8572, 8574, /* 0x08-0x0f */ + 8576, 8578, 8580, 8582, 8584, 8586, 8588, 8590, /* 0x10-0x17 */ + 8592, 8594, 8596, 8598, 8600, 8602, 8604, 8606, /* 0x18-0x1f */ + 8608, 8610, 8612, 8614, 8616, 8618, 8620, 8622, /* 0x20-0x27 */ + 8624, 8626, 8628, 8630, 8632, 8634, 8636, 8638, /* 0x28-0x2f */ + 8640, 8642, 8644, 8646, 8648, 8650, 8652, 8654, /* 0x30-0x37 */ + 8656, 8658, 8660, 8662, 8664, 8666, 8668, 8670, /* 0x38-0x3f */ + 8672, 8674, 8676, 8678, 8680, 8682, 8684, 8686, /* 0x40-0x47 */ + 8688, 8690, 8692, 8694, 8696, 8698, 8700, 8702, /* 0x48-0x4f */ + 8704, 8706, 8708, 8710, 8712, 8714, 8716, 8718, /* 0x50-0x57 */ + 8720, 8722, 8724, 8726, 8728, 8730, 8732, 8734, /* 0x58-0x5f */ + 8736, 8738, 8740, 8742, 8744, 8746, 8748, 8750, /* 0x60-0x67 */ + 8752, 8754, 8756, 8758, 8760, 8762, 8764, 8766, /* 0x68-0x6f */ + 8768, 8770, 8772, 8774, 8776, 8778, 8780, 8782, /* 0x70-0x77 */ + 8784, 8786, 8788, 8790, 8792, 8794, 8796, 8798, /* 0x78-0x7f */ + 8800, 8802, 8804, 8806, 8808, 8810, 8812, 8814, /* 0x80-0x87 */ + 8816, 8818, 8820, 8822, 8824, 8826, 8828, 8830, /* 0x88-0x8f */ + 8832, 8834, 8836, 8838, 8840, 8842, 8844, 8846, /* 0x90-0x97 */ + 8848, 8850, 8852, 8854, 8856, 8858, 8860, 8862, /* 0x98-0x9f */ + 8864, 8866, 8868, 8870, 8872, 8874, 8876, 8878, /* 0xa0-0xa7 */ + 8880, 8882, 8884, 8886, 8888, 8890, 8892, 8894, /* 0xa8-0xaf */ + 8896, 8898, 8900, 8902, 8904, 8906, 8908, 8910, /* 0xb0-0xb7 */ + 8912, 8914, 8916, 8918, 8920, 8922, 8924, 8926, /* 0xb8-0xbf */ + 8928, 8930, 8932, 8934, 8936, 8938, 8940, 8942, /* 0xc0-0xc7 */ + 8944, 8946, 8948, 8950, 8952, 8954, 8956, 8958, /* 0xc8-0xcf */ + 8960, 8962, 8964, 8966, 8968, 8970, 8972, 8974, /* 0xd0-0xd7 */ + 8976, 8978, 8980, 8982, 8984, 8986, 8988, 8990, /* 0xd8-0xdf */ + 8992, 8994, 8996, 8998, 9000, 9002, 9004, 9006, /* 0xe0-0xe7 */ + 9008, 9010, 9012, 9014, 9016, 9018, 9020, 9022, /* 0xe8-0xef */ + 9024, 9026, 9028, 9030, 9032, 9034, 9036, 9038, /* 0xf0-0xf7 */ + 9040, 9042, 9044, 9046, 9048, 9050, 9052, 9054, /* 0xf8-0xff */ + /* 0x2fa00 */ + 9056, 9058, 9060, 9062, 9064, 9066, 9068, 9070, /* 0x00-0x07 */ + 9072, 9074, 9076, 9078, 9080, 9082, 9084, 9086, /* 0x08-0x0f */ + 9088, 9090, 9092, 9094, 9096, 9098, 9100, 9102, /* 0x10-0x17 */ + 9104, 9106, 9108, 9110, 9112, 9114, -1, -1, /* 0x18-0x1f */ +}; + +#define translit_index(wc) \ + (wc >= 0x00a0 && wc < 0x01f8 ? translit_page00[wc-0x00a0] : \ + wc >= 0x0218 && wc < 0x0220 ? translit_page02[wc-0x0218] : \ + wc >= 0x02b8 && wc < 0x02e0 ? translit_page02_1[wc-0x02b8] : \ + wc >= 0x03d0 && wc < 0x0400 ? translit_page03[wc-0x03d0] : \ + wc == 0x0587 ? 654 : \ + wc >= 0x05f0 && wc < 0x05f8 ? translit_page05[wc-0x05f0] : \ + wc >= 0x0670 && wc < 0x0680 ? translit_page06[wc-0x0670] : \ + wc == 0x0e33 ? 678 : \ + wc >= 0x0eb0 && wc < 0x0ee0 ? translit_page0e[wc-0x0eb0] : \ + wc >= 0x0f70 && wc < 0x0f80 ? translit_page0f[wc-0x0f70] : \ + wc >= 0x1e00 && wc < 0x1ea0 ? translit_page1e[wc-0x1e00] : \ + wc >= 0x1ef0 && wc < 0x1ef8 ? translit_page1e_2[wc-0x1ef0] : \ + wc >= 0x2000 && wc < 0x2058 ? translit_page20[wc-0x2000] : \ + wc >= 0x20a8 && wc < 0x20b0 ? translit_page20_3[wc-0x20a8] : \ + wc >= 0x2100 && wc < 0x21d8 ? translit_page21[wc-0x2100] : \ + wc >= 0x2210 && wc < 0x2270 ? translit_page22[wc-0x2210] : \ + wc >= 0x22c0 && wc < 0x22f0 ? translit_page22_4[wc-0x22c0] : \ + wc >= 0x2400 && wc < 0x24f0 ? translit_page24[wc-0x2400] : \ + wc >= 0x2500 && wc < 0x2540 ? translit_page25[wc-0x2500] : \ + wc == 0x25e6 ? 2025 : \ + wc == 0x2a0c ? 2027 : \ + wc >= 0x2a70 && wc < 0x2a78 ? translit_page2a[wc-0x2a70] : \ + wc == 0x2e9f ? 2043 : \ + wc == 0x2ef3 ? 2045 : \ + wc >= 0x2f00 && wc < 0x2fd8 ? translit_page2f[wc-0x2f00] : \ + wc >= 0x3000 && wc < 0x30f8 ? translit_page30[wc-0x3000] : \ + wc >= 0x3130 && wc < 0x3190 ? translit_page31[wc-0x3130] : \ + wc >= 0x31f0 && wc < 0x3400 ? translit_page31_5[wc-0x31f0] : \ + wc >= 0xf900 && wc < 0xfa70 ? translit_pagef9[wc-0xf900] : \ + wc >= 0xfb00 && wc < 0xfb50 ? translit_pagefb[wc-0xfb00] : \ + wc >= 0xfe48 && wc < 0xfe70 ? translit_pagefe[wc-0xfe48] : \ + wc >= 0xff00 && wc < 0xfff0 ? translit_pageff[wc-0xff00] : \ + wc >= 0x1d400 && wc < 0x1d800 ? translit_page1d4[wc-0x1d400] : \ + wc >= 0x2f800 && wc < 0x2fa20 ? translit_page2f8[wc-0x2f800] : \ + -1) diff --git a/Externals/libiconv-1.14/lib/ucs2.h b/Externals/libiconv-1.14/lib/ucs2.h new file mode 100644 index 0000000000..206b8ccaea --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs2.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-2 + */ + +/* Here we accept FFFE/FEFF marks as endianness indicators everywhere + in the stream, not just at the beginning. The default is big-endian. */ +/* The state is 0 if big-endian, 1 if little-endian. */ +static int +ucs2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + for (; n >= 2;) { + ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); + s += 2; n -= 2; count += 2; + if (wc == 0xfeff) { + } else if (wc == 0xfffe) { + state ^= 1; + } else if (wc >= 0xd800 && wc < 0xe000) { + conv->istate = state; + return RET_SHIFT_ILSEQ(count); + } else { + *pwc = wc; + conv->istate = state; + return count; + } + } + conv->istate = state; + return RET_TOOFEW(count); +} + +/* But we output UCS-2 in big-endian order, without byte-order mark. */ +/* RFC 2152 says: + "ISO/IEC 10646-1:1993(E) specifies that when characters the UCS-2 form are + serialized as octets, that the most significant octet appear first." */ +static int +ucs2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x10000 && wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 2) { + r[0] = (unsigned char) (wc >> 8); + r[1] = (unsigned char) wc; + return 2; + } else + return RET_TOOSMALL; + } else + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs2be.h b/Externals/libiconv-1.14/lib/ucs2be.h new file mode 100644 index 0000000000..150c0a36ba --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs2be.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-2BE = UCS-2 big endian + */ + +static int +ucs2be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 2) { + if (s[0] >= 0xd8 && s[0] < 0xe0) { + return RET_ILSEQ; + } else { + *pwc = (s[0] << 8) + s[1]; + return 2; + } + } + return RET_TOOFEW(0); +} + +static int +ucs2be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 2) { + r[0] = (unsigned char) (wc >> 8); + r[1] = (unsigned char) wc; + return 2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs2internal.h b/Externals/libiconv-1.14/lib/ucs2internal.h new file mode 100644 index 0000000000..d482aeac40 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs2internal.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-2-INTERNAL = UCS-2 with machine dependent endianness and alignment + */ + +static int +ucs2internal_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 2) { + unsigned short x = *(const unsigned short *)s; + if (x >= 0xd800 && x < 0xe000) { + return RET_ILSEQ; + } else { + *pwc = x; + return 2; + } + } + return RET_TOOFEW(0); +} + +static int +ucs2internal_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 2) { + *(unsigned short *)r = wc; + return 2; + } else + return RET_TOOSMALL; + } else + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs2le.h b/Externals/libiconv-1.14/lib/ucs2le.h new file mode 100644 index 0000000000..49018612b5 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs2le.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-2LE = UCS-2 little endian + */ + +static int +ucs2le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 2) { + if (s[1] >= 0xd8 && s[1] < 0xe0) { + return RET_ILSEQ; + } else { + *pwc = s[0] + (s[1] << 8); + return 2; + } + } + return RET_TOOFEW(0); +} + +static int +ucs2le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 2) { + r[0] = (unsigned char) wc; + r[1] = (unsigned char) (wc >> 8); + return 2; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs2swapped.h b/Externals/libiconv-1.14/lib/ucs2swapped.h new file mode 100644 index 0000000000..f426f406f1 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs2swapped.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-2-SWAPPED = UCS-2-INTERNAL with inverted endianness + */ + +static int +ucs2swapped_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + /* This function assumes that 'unsigned short' has exactly 16 bits. */ + if (sizeof(unsigned short) != 2) abort(); + + if (n >= 2) { + unsigned short x = *(const unsigned short *)s; + x = (x >> 8) | (x << 8); + if (x >= 0xd800 && x < 0xe000) { + return RET_ILSEQ; + } else { + *pwc = x; + return 2; + } + } + return RET_TOOFEW(0); +} + +static int +ucs2swapped_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + /* This function assumes that 'unsigned short' has exactly 16 bits. */ + if (sizeof(unsigned short) != 2) abort(); + + if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 2) { + unsigned short x = wc; + x = (x >> 8) | (x << 8); + *(unsigned short *)r = x; + return 2; + } else + return RET_TOOSMALL; + } else + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs4.h b/Externals/libiconv-1.14/lib/ucs4.h new file mode 100644 index 0000000000..00d08d2517 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs4.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-4 + */ + +/* Here we accept FFFE0000/0000FEFF marks as endianness indicators everywhere + in the stream, not just at the beginning. The default is big-endian. */ +/* The state is 0 if big-endian, 1 if little-endian. */ +static int +ucs4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + for (; n >= 4;) { + ucs4_t wc = (state + ? s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) + : (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]); + s += 4; n -= 4; count += 4; + if (wc == 0x0000feff) { + } else if (wc == 0xfffe0000u) { + state ^= 1; + } else if (wc <= 0x7fffffff) { + *pwc = wc; + conv->istate = state; + return count; + } else { + conv->istate = state; + return RET_SHIFT_ILSEQ(count); + } + } + conv->istate = state; + return RET_TOOFEW(count); +} + +/* But we output UCS-4 in big-endian order, without byte-order mark. */ +static int +ucs4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc <= 0x7fffffff) { + if (n >= 4) { + r[0] = (unsigned char) (wc >> 24); + r[1] = (unsigned char) (wc >> 16); + r[2] = (unsigned char) (wc >> 8); + r[3] = (unsigned char) wc; + return 4; + } else + return RET_TOOSMALL; + } else + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/ucs4be.h b/Externals/libiconv-1.14/lib/ucs4be.h new file mode 100644 index 0000000000..241bc158dc --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs4be.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-4BE = UCS-4 big endian + */ + +static int +ucs4be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 4) { + *pwc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]; + return 4; + } + return RET_TOOFEW(0); +} + +static int +ucs4be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 4) { + r[0] = (unsigned char) (wc >> 24); + r[1] = (unsigned char) (wc >> 16); + r[2] = (unsigned char) (wc >> 8); + r[3] = (unsigned char) wc; + return 4; + } else + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/ucs4internal.h b/Externals/libiconv-1.14/lib/ucs4internal.h new file mode 100644 index 0000000000..bd793a3f0a --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs4internal.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-4-INTERNAL = UCS-4 with machine dependent endianness and alignment + */ + +static int +ucs4internal_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 4) { + *pwc = *(const unsigned int *)s; + return 4; + } + return RET_TOOFEW(0); +} + +static int +ucs4internal_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 4) { + *(unsigned int *)r = wc; + return 4; + } else + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/ucs4le.h b/Externals/libiconv-1.14/lib/ucs4le.h new file mode 100644 index 0000000000..0c762fec59 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs4le.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-4LE = UCS-4 little endian + */ + +static int +ucs4le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 4) { + *pwc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24); + return 4; + } + return RET_TOOFEW(0); +} + +static int +ucs4le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 4) { + r[0] = (unsigned char) wc; + r[1] = (unsigned char) (wc >> 8); + r[2] = (unsigned char) (wc >> 16); + r[3] = (unsigned char) (wc >> 24); + return 4; + } else + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/ucs4swapped.h b/Externals/libiconv-1.14/lib/ucs4swapped.h new file mode 100644 index 0000000000..6a292ecda6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/ucs4swapped.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 1999-2000 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UCS-4-SWAPPED = UCS-4-INTERNAL with inverted endianness + */ + +static int +ucs4swapped_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + /* This function assumes that 'unsigned int' has exactly 32 bits. */ + if (sizeof(unsigned int) != 4) abort(); + + if (n >= 4) { + unsigned int x = *(const unsigned int *)s; + x = (x >> 24) | ((x >> 8) & 0xff00) | ((x & 0xff00) << 8) | (x << 24); + *pwc = x; + return 4; + } + return RET_TOOFEW(0); +} + +static int +ucs4swapped_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + /* This function assumes that 'unsigned int' has exactly 32 bits. */ + if (sizeof(unsigned int) != 4) abort(); + + if (n >= 4) { + unsigned int x = wc; + x = (x >> 24) | ((x >> 8) & 0xff00) | ((x & 0xff00) << 8) | (x << 24); + *(unsigned int *)r = x; + return 4; + } else + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/uhc_1.h b/Externals/libiconv-1.14/lib/uhc_1.h new file mode 100644 index 0000000000..7b0c725819 --- /dev/null +++ b/Externals/libiconv-1.14/lib/uhc_1.h @@ -0,0 +1,1725 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * Unified Hangul Code part 1 + */ + +static const unsigned short uhc_1_2uni_main_page81[64] = { + 0xac02, 0xac8d, 0xad14, 0xad91, 0xadfa, 0xae7a, 0xaee6, 0xaf57, + 0xafbf, 0xb030, 0xb0a5, 0xb122, 0xb19e, 0xb207, 0xb26f, 0xb2f0, + 0xb366, 0xb3e1, 0xb445, 0xb4ad, 0xb51e, 0xb590, 0xb600, 0xb661, + 0xb6c3, 0xb723, 0xb79f, 0xb811, 0xb885, 0xb8f1, 0xb95a, 0xb9d4, + 0xba47, 0xbac2, 0xbb28, 0xbb9a, 0xbc03, 0xbc80, 0xbcfe, 0xbd67, + 0xbdd2, 0xbe3d, 0xbeb8, 0xbf23, 0xbf83, 0xbfe6, 0xc040, 0xc0a7, + 0xc132, 0xc1b1, 0xc224, 0xc297, 0xc310, 0xc37a, 0xc3db, 0xc446, + 0xc4aa, 0xc50f, 0xc596, 0xc626, 0xc6a8, 0xc726, 0xc7b8, 0xc832, +}; +static const unsigned char uhc_1_2uni_page81[5696] = { + /* 0x81 */ + 0x00, 0x01, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0c, + 0x0d, 0x16, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, + 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x53, 0x54, 0x55, 0x57, 0x58, + 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, 0x74, + 0x77, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x80, 0x85, + 0x86, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x11, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1e, 0x20, 0x21, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, + 0x31, 0x32, 0x33, 0x35, 0x36, 0x38, 0x39, 0x3a, + 0x3c, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x55, 0x56, 0x58, 0x59, + 0x5c, 0x5e, 0x60, 0x61, 0x65, 0x67, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x71, 0x72, 0x74, 0x75, 0x76, + 0x78, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, 0x83, + 0x85, 0x86, + /* 0x82 */ + 0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, + 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x16, 0x17, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x34, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3d, 0x3e, + 0x3f, 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4e, 0x50, 0x51, 0x52, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5b, 0x5d, + 0x5e, 0x63, 0x64, 0x65, 0x66, 0x6a, 0x6c, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x76, 0x77, 0x79, 0x7a, + 0x7b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2d, 0x2e, 0x31, 0x32, 0x34, 0x35, + 0x36, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4c, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, + 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, + 0x65, 0x66, + /* 0x83 */ + 0x00, 0x01, 0x03, 0x04, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, + 0x3c, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x48, + 0x4a, 0x4d, 0x4e, 0x4f, 0x51, 0x55, 0x57, 0x58, + 0x59, 0x5b, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, + 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x70, 0x71, 0x73, + 0x74, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, + 0x7d, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, + 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x45, 0x47, 0x48, + 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x54, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, + 0x61, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, + /* 0x84 */ + 0x00, 0x01, 0x03, 0x04, 0x06, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, + 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x23, 0x24, 0x25, 0x26, 0x28, + 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x48, 0x49, 0x4b, 0x4d, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x58, + 0x5a, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2c, + 0x2e, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x64, + 0x66, 0x67, + /* 0x85 */ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0b, + 0x0d, 0x10, 0x11, 0x12, 0x13, 0x14, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x34, + 0x36, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4b, 0x4c, 0x4e, 0x4f, 0x50, 0x52, 0x53, + 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, + 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, + 0x1b, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x26, 0x28, + 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x4b, 0x4e, 0x4f, 0x51, 0x52, 0x53, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5e, 0x60, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x6b, 0x6d, 0x6e, + 0x73, 0x74, + /* 0x86 */ + 0x00, 0x01, 0x02, 0x05, 0x0b, 0x0d, 0x11, 0x12, + 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x1e, 0x21, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, + 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x65, 0x68, 0x69, 0x6a, 0x6c, + 0x6f, 0x70, 0x71, 0x72, 0x75, 0x79, 0x7a, 0x7b, + 0x7c, 0x00, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x23, + 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x30, 0x31, 0x34, 0x35, 0x37, 0x38, 0x39, + 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5f, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x68, 0x6a, 0x6c, + 0x6d, 0x6e, 0x6f, 0x73, 0x74, 0x75, 0x77, 0x78, + 0x79, 0x7b, + /* 0x87 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, + 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4f, 0x50, 0x51, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x5c, 0x5e, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x68, 0x00, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0f, 0x11, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x64, 0x65, + 0x66, 0x67, + /* 0x88 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x23, 0x24, 0x26, 0x27, 0x28, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x35, 0x38, + 0x39, 0x3a, 0x3c, 0x3e, 0x3f, 0x40, 0x42, 0x43, + 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x5b, 0x5c, 0x5e, 0x5f, + 0x60, 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6b, + 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x78, 0x7a, + 0x7b, 0x00, 0x01, 0x02, 0x06, 0x0c, 0x0d, 0x0e, + 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x67, 0x69, 0x6a, 0x6d, 0x70, 0x71, + 0x72, 0x73, + /* 0x89 */ + 0x00, 0x02, 0x04, 0x06, 0x07, 0x09, 0x0c, 0x0d, + 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1c, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x60, 0x61, 0x63, 0x64, 0x67, 0x69, + 0x6b, 0x6c, 0x6d, 0x70, 0x72, 0x74, 0x76, 0x78, + 0x79, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3c, + 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, + /* 0x8a */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x10, 0x11, 0x12, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1d, + 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x60, 0x61, 0x62, 0x64, 0x65, + 0x66, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, + 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0x25, + 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x31, 0x32, 0x34, 0x35, 0x38, 0x3a, 0x3b, 0x3c, + 0x3d, 0x3e, 0x41, 0x43, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x69, 0x6a, 0x6c, + 0x6d, 0x70, + /* 0x8b */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, + 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x24, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x30, 0x31, + 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x40, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1c, + 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3e, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x49, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, + /* 0x8c */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4e, + 0x4f, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, + /* 0x8d */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x32, + 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, + 0x0a, 0x0b, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x46, + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4f, 0x51, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x5b, 0x5c, + 0x5e, 0x5f, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x6b, 0x70, 0x71, 0x72, 0x77, 0x78, + 0x7a, 0x7b, + /* 0x8e */ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x0b, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, + 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x29, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x4b, 0x4c, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5f, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x6b, 0x6c, 0x6e, 0x6f, + 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x25, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4d, 0x4e, 0x50, 0x51, 0x52, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5d, + 0x5f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x68, + 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, + /* 0x8f */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x48, 0x49, + 0x4a, 0x4c, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x59, 0x5b, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x62, 0x65, 0x66, 0x68, 0x69, + 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4d, 0x4e, 0x50, + 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5c, 0x5d, 0x5f, 0x61, 0x62, 0x63, 0x64, + 0x65, 0x66, + /* 0x90 */ + 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, + 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2c, 0x2e, 0x31, 0x32, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, + 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x66, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, + 0x79, 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0b, + 0x0c, 0x0e, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x66, 0x67, 0x69, 0x6a, 0x6b, 0x6d, 0x6f, 0x70, + 0x71, 0x72, + /* 0x91 */ + 0x00, 0x03, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0f, + 0x10, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1f, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x63, 0x66, 0x67, 0x68, 0x6a, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x73, 0x75, 0x77, 0x78, 0x79, + 0x7a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3b, + 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4c, 0x4e, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, + 0x5b, 0x5c, 0x5d, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, + /* 0x92 */ + 0x00, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0f, 0x11, 0x12, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1e, 0x20, 0x22, 0x23, 0x24, 0x26, + 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3a, 0x3c, + 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, + 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, 0x61, 0x63, + 0x64, 0x67, + /* 0x93 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x0b, 0x0d, + 0x0f, 0x10, 0x16, 0x17, 0x1d, 0x1e, 0x1f, 0x20, + 0x23, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2f, + 0x30, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3f, 0x43, 0x44, 0x45, 0x47, + 0x48, 0x4b, 0x4c, 0x4e, 0x4f, 0x50, 0x51, 0x52, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x09, + 0x0a, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, + 0x18, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x23, + 0x25, 0x26, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x32, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3e, 0x3f, 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4e, 0x52, 0x53, + 0x54, 0x56, 0x57, 0x59, 0x5a, 0x5b, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x77, 0x79, 0x7a, + 0x7b, 0x7d, + /* 0x94 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0a, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, + 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4c, 0x4d, 0x4f, 0x50, 0x51, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, + 0x68, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x2b, 0x2d, 0x2f, 0x30, 0x31, 0x34, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, + /* 0x95 */ + 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, + 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3c, + 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4c, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x10, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x19, 0x1b, 0x1f, 0x20, 0x21, + 0x22, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2c, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x35, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x41, 0x42, 0x44, 0x45, 0x46, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x51, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, + /* 0x96 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1a, 0x1b, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, + 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, + 0x5d, 0x5e, 0x5f, 0x62, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1f, 0x20, + 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, + /* 0x97 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4b, 0x4c, + 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x5a, 0x5b, 0x5d, 0x5f, 0x60, 0x61, + 0x62, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, + 0x58, 0x59, + /* 0x98 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, + 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x52, 0x53, 0x55, 0x56, 0x57, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x62, 0x64, + 0x66, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x0a, + 0x0b, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x1b, + 0x1c, 0x1d, 0x1f, 0x20, 0x23, 0x24, 0x26, 0x27, + 0x28, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x33, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3f, + 0x40, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4b, 0x4c, 0x4f, 0x51, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5e, 0x5f, + 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6f, 0x70, 0x71, 0x72, + 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x81, 0x82, 0x83, + 0x84, 0x87, + /* 0x99 */ + 0x00, 0x01, 0x02, 0x03, 0x05, 0x08, 0x09, 0x0b, + 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x18, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x34, 0x38, 0x39, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, + 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5d, 0x5f, 0x60, 0x61, 0x63, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6c, 0x6e, 0x70, + 0x71, 0x72, 0x74, 0x75, 0x78, 0x79, 0x7b, 0x7c, + 0x7d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, + 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x24, 0x25, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x38, + 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x41, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4d, + 0x4e, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5d, 0x5f, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x69, 0x6a, 0x6c, 0x6d, 0x70, + 0x71, 0x72, + /* 0x9a */ + 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0c, + 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2e, 0x2f, 0x31, 0x32, 0x33, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3d, + 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x51, 0x52, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5c, 0x5e, + 0x5f, 0x60, 0x61, 0x62, 0x63, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x00, 0x02, 0x03, 0x05, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0f, 0x10, 0x12, 0x13, 0x14, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1f, 0x21, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, + 0x43, 0x44, 0x47, 0x48, 0x4a, 0x4b, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x57, 0x59, 0x5b, 0x5c, + 0x5d, 0x5e, 0x60, 0x63, 0x66, 0x67, 0x68, 0x6a, + 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x73, 0x74, + 0x77, 0x78, + /* 0x9b */ + 0x00, 0x01, 0x02, 0x06, 0x07, 0x09, 0x0a, 0x0b, + 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, + 0x17, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5b, + 0x5d, 0x5e, 0x5f, 0x61, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, + 0x5d, 0x60, + /* 0x9c */ + 0x00, 0x02, 0x03, 0x06, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, + 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, + 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, + /* 0x9d */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x40, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x48, 0x49, 0x4b, 0x4c, 0x4d, + 0x4f, 0x51, 0x52, 0x53, 0x54, 0x58, 0x59, 0x5a, + 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, + 0x64, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, + 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x2b, 0x2d, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x37, 0x38, 0x3c, 0x40, 0x41, + 0x42, 0x43, 0x47, 0x4b, 0x4c, 0x4d, 0x50, 0x53, + 0x54, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x63, 0x67, 0x68, 0x69, 0x6a, + 0x6b, 0x6c, 0x6f, 0x70, 0x72, 0x73, 0x74, 0x76, + 0x77, 0x79, 0x7a, 0x7b, 0x7c, 0x7f, 0x81, 0x83, + 0x84, 0x85, + /* 0x9e */ + 0x00, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x20, 0x21, 0x24, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x35, 0x37, 0x39, 0x3c, 0x3d, 0x3f, 0x40, + 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4c, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x59, 0x5b, 0x5c, 0x5d, 0x5f, 0x62, 0x63, 0x64, + 0x65, 0x6c, 0x6d, 0x6e, 0x73, 0x74, 0x75, 0x77, + 0x78, 0x79, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, + 0x81, 0x84, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, + 0x8d, 0x00, 0x01, 0x03, 0x04, 0x05, 0x09, 0x0b, + 0x0c, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x19, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x47, 0x48, 0x4a, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, + 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x66, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, + 0x74, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, + 0x7d, 0x80, + /* 0x9f */ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, + 0x0b, 0x0d, 0x0e, 0x0f, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x1a, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x23, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x36, 0x37, 0x3a, + 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x42, 0x43, 0x45, + 0x46, 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5e, 0x5f, 0x61, 0x62, 0x63, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6e, 0x70, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x7a, 0x7b, + 0x7d, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0c, 0x0e, 0x10, 0x12, 0x13, 0x14, + 0x15, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x25, 0x28, 0x2a, 0x33, 0x34, + 0x35, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x43, 0x44, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x50, 0x51, 0x53, + 0x54, 0x55, 0x59, 0x5a, 0x5b, 0x5c, 0x60, 0x65, + 0x66, 0x67, 0x69, 0x6c, 0x6d, 0x6f, 0x73, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7c, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8f, + 0x90, 0x91, + /* 0xa0 */ + 0x00, 0x01, 0x02, 0x03, 0x06, 0x0a, 0x0b, 0x0c, + 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x17, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21, 0x22, + 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x51, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5c, 0x5f, 0x60, + 0x61, 0x62, 0x63, 0x66, 0x67, 0x69, 0x6a, 0x6b, + 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x76, + 0x78, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, + 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x40, + 0x41, 0x43, 0x44, 0x45, 0x47, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x50, 0x52, 0x56, 0x57, 0x58, 0x5c, + 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6c, 0x6e, 0x70, + 0x71, 0x72, +}; + +static int +uhc_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0x81 && c1 <= 0xa0)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x41 && c2 < 0x5b) || (c2 >= 0x61 && c2 < 0x7b) || (c2 >= 0x81 && c2 < 0xff)) { + unsigned int row = c1 - 0x81; + unsigned int col = c2 - (c2 >= 0x81 ? 0x4d : c2 >= 0x61 ? 0x47 : 0x41); + unsigned int i = 178 * row + col; + if (i < 5696) { + *pwc = (ucs4_t) (uhc_1_2uni_main_page81[2*row+(col>=89?1:0)] + uhc_1_2uni_page81[i]); + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short uhc_1_2charset_main[45] = { + 0x8141, 0x81cd, 0x829b, 0x8363, 0x83e9, 0x84b7, 0x8585, 0x8647, + 0x86d3, 0x87a1, 0x8869, 0x88ef, 0x89bd, 0x8a8b, 0x8b4d, 0x8bd9, + 0x8ca7, 0x8d6f, 0x8df5, 0x8ec3, 0x8f91, 0x9053, 0x90df, 0x91ad, + 0x9275, 0x92fb, 0x93c9, 0x9497, 0x9559, 0x95e5, 0x96b3, 0x9781, + 0x9843, 0x98cf, 0x999d, 0x9a65, 0x9aeb, 0x9bb9, 0x9c87, 0x9d49, + 0x9dd5, 0x9ea3, 0x9f6b, 0x9ff1, 0xa0bf, +}; +static const unsigned char uhc_1_2charset[5696] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0xb6, 0xb7, 0xb8, 0xb9, + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8c, 0x8d, + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, + 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x8e, 0x8f, 0x90, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0xc0, 0xc1, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x8b, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, + 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, + 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, + 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, + 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, +}; + +static const Summary16 uhc_1_uni2indx_pageac[459] = { + /* 0xac00 */ + { 0, 0xf86c }, { 9, 0xc100 }, { 12, 0x4fee }, { 23, 0xecfc }, + { 34, 0xd7fe }, { 47, 0xeeef }, { 60, 0xffff }, { 76, 0xfa6c }, + { 86, 0xe184 }, { 92, 0x4fee }, { 103, 0x68fc }, { 112, 0xc4fe }, + { 122, 0xeeed }, { 134, 0xff5f }, { 148, 0x6a6c }, { 156, 0xcf94 }, + /* 0xad00 */ + { 165, 0x4fae }, { 175, 0xeefd }, { 188, 0xcdfe }, { 200, 0xeecf }, + { 212, 0xfd4f }, { 224, 0xfeee }, { 237, 0xcff5 }, { 249, 0x4786 }, + { 256, 0xecf9 }, { 267, 0xcffe }, { 280, 0xffef }, { 295, 0xff7f }, + { 310, 0xfeec }, { 322, 0xeff4 }, { 334, 0xffee }, { 348, 0x6cff }, + /* 0xae00 */ + { 360, 0xd4fc }, { 370, 0xffef }, { 385, 0xffff }, { 401, 0xfa6c }, + { 411, 0x8b94 }, { 418, 0x4fae }, { 428, 0xecdc }, { 438, 0xc4fe }, + { 448, 0xefcf }, { 461, 0xffff }, { 477, 0xffff }, { 493, 0x8fff }, + { 506, 0x4fee }, { 517, 0xecfc }, { 528, 0xd6ff }, { 541, 0xeeef }, + /* 0xaf00 */ + { 554, 0xde7f }, { 567, 0xfffe }, { 582, 0xcfff }, { 596, 0x4fea }, + { 606, 0xfcf1 }, { 617, 0xcffe }, { 630, 0xffcf }, { 644, 0xfdff }, + { 659, 0xfeee }, { 672, 0xefdc }, { 684, 0xffff }, { 700, 0xecff }, + { 713, 0x947e }, { 722, 0xefef }, { 736, 0xfcff }, { 750, 0xfeec }, + /* 0xb000 */ + { 762, 0xefec }, { 774, 0xcfee }, { 786, 0xfeff }, { 801, 0xffff }, + { 817, 0xaacf }, { 827, 0xdd47 }, { 837, 0xffff }, { 853, 0xcfff }, + { 867, 0x4fee }, { 878, 0x68fd }, { 888, 0x04f8 }, { 894, 0xeec5 }, + { 904, 0xfc4f }, { 915, 0xfeec }, { 927, 0xffde }, { 941, 0xffff }, + /* 0xb100 */ + { 957, 0xe4ff }, { 969, 0xc4f2 }, { 977, 0xeec7 }, { 988, 0xfc4f }, + { 999, 0xfeec }, { 1011, 0xeecc }, { 1021, 0xfffe }, { 1036, 0xecff }, + { 1049, 0xd4fa }, { 1059, 0xeee3 }, { 1070, 0xfeff }, { 1085, 0xffff }, + { 1101, 0xefff }, { 1116, 0x4fee }, { 1127, 0xecff }, { 1140, 0xd5fe }, + /* 0xb200 */ + { 1152, 0xe6cf }, { 1163, 0xfd4f }, { 1175, 0xfffe }, { 1190, 0xefef }, + { 1204, 0xffff }, { 1220, 0xeeff }, { 1234, 0xfcfe }, { 1247, 0xefcf }, + { 1260, 0xfdcf }, { 1273, 0xf8ec }, { 1283, 0xeb94 }, { 1292, 0xffee }, + { 1306, 0xecff }, { 1319, 0xd4fa }, { 1329, 0x068b }, { 1335, 0x7047 }, + /* 0xb300 */ + { 1342, 0xfeec }, { 1354, 0xefc4 }, { 1364, 0xffff }, { 1380, 0xffff }, + { 1396, 0xffff }, { 1412, 0x268f }, { 1420, 0xb54f }, { 1430, 0xfeec }, + { 1442, 0xefc4 }, { 1452, 0xffee }, { 1466, 0xeefc }, { 1478, 0xffff }, + { 1494, 0xa6cf }, { 1504, 0xd54e }, { 1513, 0xfeee }, { 1526, 0xefff }, + /* 0xb400 */ + { 1541, 0xffff }, { 1557, 0xeefe }, { 1570, 0xf4fe }, { 1582, 0xffef }, + { 1597, 0xffff }, { 1613, 0xfeec }, { 1625, 0xefd4 }, { 1636, 0xffff }, + { 1652, 0xfefe }, { 1666, 0xdfff }, { 1681, 0xeeef }, { 1694, 0xfd5f }, + { 1707, 0xfeee }, { 1720, 0xcfde }, { 1732, 0x4fa6 }, { 1741, 0xfefd }, + /* 0xb500 */ + { 1755, 0xffff }, { 1771, 0xe6cf }, { 1782, 0xf84f }, { 1792, 0xfeec }, + { 1804, 0xc7c4 }, { 1812, 0x4fee }, { 1823, 0xfffc }, { 1837, 0xffff }, + { 1853, 0xffff }, { 1869, 0xffff }, { 1885, 0xf2ec }, { 1895, 0xc7c4 }, + { 1903, 0x4fee }, { 1914, 0xfefc }, { 1927, 0xefff }, { 1942, 0xffff }, + /* 0xb600 */ + { 1958, 0xffff }, { 1974, 0xfeec }, { 1986, 0xefdf }, { 2000, 0xffef }, + { 2015, 0xfeff }, { 2030, 0xffff }, { 2046, 0xfeef }, { 2060, 0xffff }, + { 2076, 0xffff }, { 2092, 0xcfff }, { 2106, 0xe7ee }, { 2118, 0xfffd }, + { 2133, 0xffff }, { 2149, 0xffef }, { 2164, 0xffff }, { 2180, 0xfeee }, + /* 0xb700 */ + { 2193, 0xffdc }, { 2206, 0xffff }, { 2222, 0x6cff }, { 2234, 0xf4fe }, + { 2246, 0xeeef }, { 2259, 0xffcf }, { 2273, 0xfeee }, { 2286, 0xcfd4 }, + { 2296, 0x4fee }, { 2307, 0xec38 }, { 2315, 0xc4fe }, { 2325, 0xfecf }, + { 2338, 0xfd7f }, { 2352, 0xffff }, { 2368, 0xcfff }, { 2382, 0x4fee }, + /* 0xb800 */ + { 2393, 0xec7c }, { 2403, 0xd4fe }, { 2414, 0xeecf }, { 2426, 0xfc4f }, + { 2437, 0xffee }, { 2451, 0xcff5 }, { 2463, 0x4fee }, { 2474, 0xeefd }, + { 2487, 0xdfff }, { 2502, 0xffff }, { 2518, 0xfeff }, { 2533, 0xfeee }, + { 2546, 0xefd4 }, { 2557, 0x5fee }, { 2569, 0xecfd }, { 2581, 0xd4fe }, + /* 0xb900 */ + { 2592, 0xffef }, { 2607, 0xfeff }, { 2622, 0xfffe }, { 2637, 0xcfff }, + { 2651, 0x6fee }, { 2663, 0xecfd }, { 2675, 0xd4fe }, { 2686, 0xeecf }, + { 2698, 0x994f }, { 2707, 0xffff }, { 2723, 0xcfff }, { 2737, 0x4fee }, + { 2748, 0x2cfd }, { 2758, 0x94f8 }, { 2766, 0xeec5 }, { 2776, 0xf84f }, + /* 0xba00 */ + { 2786, 0xfefc }, { 2799, 0xffdf }, { 2814, 0xffff }, { 2830, 0xecff }, + { 2843, 0x94fa }, { 2852, 0xeec7 }, { 2863, 0xfc4f }, { 2874, 0xfeec }, + { 2886, 0xef47 }, { 2897, 0xffff }, { 2913, 0xe4ff }, { 2925, 0xd4fa }, + { 2935, 0xfeef }, { 2949, 0xfcff }, { 2963, 0xffff }, { 2979, 0xefff }, + /* 0xbb00 */ + { 2994, 0x5fee }, { 3006, 0xeefd }, { 3019, 0xf5fe }, { 3032, 0x868f }, + { 3040, 0x5d4f }, { 3050, 0xfeee }, { 3063, 0xeff5 }, { 3076, 0xffff }, + { 3092, 0xeeff }, { 3106, 0xfffe }, { 3121, 0xeeef }, { 3134, 0xff6f }, + { 3148, 0xfeee }, { 3161, 0xfff6 }, { 3175, 0xffff }, { 3191, 0x6cff }, + /* 0xbc00 */ + { 3203, 0x44fa }, { 3211, 0x060d }, { 3216, 0xdd4f }, { 3227, 0xfeec }, + { 3239, 0xcdc4 }, { 3247, 0xdffe }, { 3261, 0xffff }, { 3277, 0xffff }, + { 3293, 0xa6cf }, { 3303, 0xf94f }, { 3314, 0xfe6c }, { 3325, 0xcfc4 }, + { 3334, 0x5fee }, { 3346, 0xeedc }, { 3357, 0xffff }, { 3373, 0xee8f }, + /* 0xbd00 */ + { 3384, 0xfd4f }, { 3396, 0xffee }, { 3410, 0xefef }, { 3424, 0xffff }, + { 3440, 0xecfe }, { 3452, 0xfcfe }, { 3465, 0xfeef }, { 3479, 0xffff }, + { 3495, 0xf86c }, { 3504, 0xe9d4 }, { 3513, 0xffef }, { 3528, 0xfefe }, + { 3542, 0xffff }, { 3558, 0xeecf }, { 3570, 0xfdff }, { 3585, 0xfeee }, + /* 0xbe00 */ + { 3598, 0xcfd6 }, { 3609, 0x4fee }, { 3620, 0xffff }, { 3636, 0xffff }, + { 3652, 0xaecf }, { 3663, 0xf14f }, { 3673, 0xfaec }, { 3684, 0xc7c4 }, + { 3692, 0x4fee }, { 3703, 0xfcfc }, { 3715, 0xfeff }, { 3730, 0xffff }, + { 3746, 0xffff }, { 3762, 0xfe6c }, { 3773, 0xefc6 }, { 3784, 0xffff }, + /* 0xbf00 */ + { 3800, 0xfcfd }, { 3813, 0xc4ff }, { 3824, 0xffff }, { 3840, 0xffff }, + { 3856, 0xfeec }, { 3868, 0xffdc }, { 3881, 0xffff }, { 3897, 0xffff }, + { 3913, 0xffff }, { 3929, 0xffef }, { 3944, 0xffff }, { 3960, 0xfffe }, + { 3975, 0xcfdf }, { 3988, 0x6fee }, { 4000, 0xfffd }, { 4015, 0xffff }, + /* 0xc000 */ + { 4031, 0xffff }, { 4047, 0xffff }, { 4063, 0xffff }, { 4079, 0xefff }, + { 4094, 0xffff }, { 4110, 0xeefd }, { 4123, 0xfcfe }, { 4136, 0xffff }, + { 4152, 0xffff }, { 4168, 0xfeec }, { 4180, 0x4fd4 }, { 4189, 0x4f86 }, + { 4197, 0xecdc }, { 4207, 0xc4fe }, { 4217, 0xeecf }, { 4229, 0xfd4f }, + /* 0xc100 */ + { 4241, 0xfeee }, { 4254, 0x0fde }, { 4264, 0x4f26 }, { 4272, 0xecbc }, + { 4282, 0xc4fe }, { 4292, 0xeecf }, { 4304, 0xfc4f }, { 4315, 0xfeee }, + { 4328, 0x8fdf }, { 4340, 0x4fae }, { 4350, 0xecdd }, { 4361, 0xdffe }, + { 4375, 0xeeef }, { 4388, 0xfe6f }, { 4401, 0xfeee }, { 4414, 0xcff4 }, + /* 0xc200 */ + { 4425, 0x4fee }, { 4436, 0x6cfd }, { 4447, 0x54fe }, { 4457, 0xffe9 }, + { 4470, 0xfeff }, { 4485, 0xfeec }, { 4497, 0xcfde }, { 4509, 0x4fee }, + { 4520, 0xfcfd }, { 4533, 0xd6fe }, { 4545, 0xcecf }, { 4556, 0xfd4f }, + { 4568, 0xffff }, { 4584, 0xcfff }, { 4598, 0x47e6 }, { 4607, 0xe4bd }, + /* 0xc300 */ + { 4617, 0xccfe }, { 4628, 0xeec7 }, { 4639, 0xfccf }, { 4651, 0xffff }, + { 4667, 0xffdf }, { 4682, 0xffff }, { 4698, 0xecff }, { 4711, 0xccfa }, + { 4721, 0xeeef }, { 4734, 0xffff }, { 4750, 0xffff }, { 4766, 0xffff }, + { 4782, 0xfffe }, { 4797, 0x6cff }, { 4809, 0xdcfa }, { 4820, 0xfecf }, + /* 0xc400 */ + { 4833, 0xfeff }, { 4848, 0xfffe }, { 4863, 0xefef }, { 4877, 0xcfee }, + { 4889, 0xfeff }, { 4904, 0xffff }, { 4920, 0xeecf }, { 4932, 0xfdcf }, + { 4945, 0xfffe }, { 4960, 0xefef }, { 4974, 0xffff }, { 4990, 0xeeff }, + { 5004, 0xffff }, { 5020, 0xffff }, { 5036, 0xfdff }, { 5051, 0x7aec }, + /* 0xc500 */ + { 5061, 0xeffc }, { 5074, 0xefee }, { 5087, 0xecff }, { 5100, 0xd4fe }, + { 5111, 0x88cf }, { 5119, 0x9c47 }, { 5127, 0xfeec }, { 5139, 0xcfc4 }, + { 5148, 0x4f6e }, { 5158, 0xee5d }, { 5169, 0xfdfe }, { 5183, 0x84cf }, + { 5191, 0xa80f }, { 5198, 0xfeec }, { 5210, 0x8fd4 }, { 5219, 0x0f2e }, + /* 0xc600 */ + { 5227, 0xee1c }, { 5236, 0xe4fe }, { 5247, 0x8ecf }, { 5257, 0xf546 }, + { 5266, 0xfeec }, { 5278, 0xcfc4 }, { 5287, 0x6ffe }, { 5300, 0xecfd }, + { 5312, 0xd4fe }, { 5323, 0xeecf }, { 5335, 0xfd4f }, { 5347, 0xf8ec }, + { 5357, 0xcfd4 }, { 5367, 0xcfee }, { 5379, 0xecfc }, { 5390, 0xdcfe }, + /* 0xc700 */ + { 5402, 0xeecf }, { 5414, 0xfd4f }, { 5426, 0xfeec }, { 5438, 0xcf54 }, + { 5447, 0x4bee }, { 5457, 0xee01 }, { 5464, 0xf6fe }, { 5477, 0x8ecf }, + { 5487, 0xb847 }, { 5495, 0xfa2c }, { 5504, 0xcf84 }, { 5512, 0x4fee }, + { 5523, 0xacfc }, { 5533, 0xdefe }, { 5546, 0xeeef }, { 5559, 0xffff }, + /* 0xc800 */ + { 5575, 0xfaec }, { 5586, 0xcf94 }, { 5595, 0x4fee }, { 5606, 0xeefd }, + { 5619, 0xccfe }, { 5630, 0xffef }, { 5645, 0xffff }, { 5661, 0xfaec }, + { 5672, 0xc714 }, { 5679, 0x5fef }, { 5692, 0x001d }, +}; + +static int +uhc_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + if (wc >= 0xac00 && wc < 0xc8b0) { + const Summary16 *summary = &uhc_1_uni2indx_pageac[(wc>>4)-0xac0]; + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + used += summary->indx; + c = uhc_1_2charset_main[used>>7] + uhc_1_2charset[used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/uhc_2.h b/Externals/libiconv-1.14/lib/uhc_2.h new file mode 100644 index 0000000000..4aa290a943 --- /dev/null +++ b/Externals/libiconv-1.14/lib/uhc_2.h @@ -0,0 +1,1022 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * Unified Hangul Code part 2 + */ + +static const unsigned short uhc_2_2uni_main_pagea1[76] = { + 0xc8a5, 0xc8d8, 0xc910, 0xc93e, 0xc971, 0xc9a5, 0xc9de, 0xca1c, + 0xca47, 0xca7b, 0xcaa8, 0xcadd, 0xcb0b, 0xcb3a, 0xcb6d, 0xcb99, + 0xcbc5, 0xcbf3, 0xcc25, 0xcc67, 0xcc94, 0xcccf, 0xccfe, 0xcd34, + 0xcd61, 0xcd92, 0xcdc6, 0xcdf5, 0xce2c, 0xce5d, 0xce9a, 0xcecc, + 0xcf02, 0xcf3b, 0xcf6d, 0xcf9e, 0xcfcc, 0xcfff, 0xd02e, 0xd064, + 0xd095, 0xd0cc, 0xd105, 0xd132, 0xd16e, 0xd19b, 0xd1d0, 0xd1fd, + 0xd22a, 0xd25e, 0xd28d, 0xd2c5, 0xd2fb, 0xd33e, 0xd36a, 0xd3a1, + 0xd3d7, 0xd40d, 0xd438, 0xd467, 0xd49e, 0xd4c9, 0xd4fe, 0xd52e, + 0xd564, 0xd59d, 0xd5ca, 0xd606, 0xd63d, 0xd677, 0xd6ab, 0xd6e2, + 0xd715, 0xd74e, 0xd78d, 0xfffd, +}; +static const unsigned char uhc_2_2uni_pagea1[3126] = { + /* 0xa1 */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, + 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x31, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x23, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x36, + /* 0xa2 */ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, + 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2f, 0x30, 0x31, + /* 0xa3 */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1a, 0x1c, + 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x29, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1d, 0x1e, 0x20, + 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, + 0x2f, 0x32, 0x33, 0x36, + /* 0xa4 */ + 0x00, 0x01, 0x03, 0x05, 0x07, 0x08, 0x0a, 0x0b, + 0x0c, 0x0d, 0x10, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3b, + 0x3c, 0x3d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, + /* 0xa5 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x0a, + 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x17, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, + /* 0xa6 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, 0x1a, + 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x26, 0x28, 0x2a, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, + 0x33, 0x34, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2c, 0x2d, + /* 0xa7 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, + 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x22, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, + /* 0xa8 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, + /* 0xa9 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, + 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, + 0x2c, 0x2d, 0x30, 0x31, + /* 0xaa */ + 0x00, 0x01, 0x05, 0x06, 0x08, 0x0a, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x15, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x24, 0x25, 0x26, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x31, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3c, 0x3d, + 0x3e, 0x40, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, + /* 0xab */ + 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x09, 0x0a, + 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x16, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, + 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x32, 0x34, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2d, 0x2e, + /* 0xac */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1e, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, + 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x29, 0x2a, 0x2b, + /* 0xad */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, + 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x14, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x33, + /* 0xae */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, + 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, + 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x05, 0x07, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, + 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, + 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, + 0x32, 0x34, 0x35, 0x36, + /* 0xaf */ + 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2e, 0x2f, 0x00, 0x01, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x29, 0x2b, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x35, 0x36, + 0x38, 0x39, 0x3a, 0x3c, + /* 0xb0 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0c, + 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x1a, 0x1b, 0x1d, 0x1e, 0x21, 0x22, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, + /* 0xb1 */ + 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, + 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2c, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x37, 0x38, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, + 0x2d, 0x2f, 0x30, 0x31, + /* 0xb2 */ + 0x00, 0x01, 0x02, 0x05, 0x06, 0x08, 0x09, 0x0a, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, + 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, + /* 0xb3 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, 0x1a, + 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x31, 0x32, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, + /* 0xb4 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, + 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x18, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, + 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, + 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, + /* 0xb5 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x11, + 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x21, 0x23, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, + 0x35, 0x36, 0x00, 0x01, 0x02, 0x03, 0x06, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, + 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x35, 0x36, 0x37, 0x38, + /* 0xb6 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, + 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2c, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x37, 0x38, 0x39, 0x3b, + /* 0xb7 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, + 0x08, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x17, 0x19, 0x1b, 0x1c, 0x1d, + 0x1e, 0x20, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0x34, + /* 0xb8 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, + 0x2b, 0x2c, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, + /* 0xb9 */ + 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x16, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x33, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x24, 0x25, 0x27, 0x28, 0x29, + 0x2b, 0x2c, 0x2d, 0x2e, + /* 0xba */ + 0x00, 0x01, 0x02, 0x05, 0x06, 0x07, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, + 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x34, + 0x36, 0x37, 0x00, 0x01, 0x02, 0x05, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, + 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, + 0x31, 0x32, 0x34, 0x35, + /* 0xbb */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x09, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x14, 0x16, 0x17, + 0x18, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x23, + 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2f, 0x30, 0x32, + 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, + /* 0xbc */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x30, 0x31, 0x33, + 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, + 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x25, 0x26, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, + /* 0xbd */ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x27, 0x29, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x32, 0x33, + 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, + /* 0xbe */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, + 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x13, 0x14, 0x16, 0x17, 0x1a, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x23, 0x25, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x33, 0x34, 0x35, 0x36, + /* 0xbf */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, + 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, + 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x30, 0x31, 0x33, + /* 0xc0 */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, + 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x15, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x22, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2c, 0x2d, 0x2f, 0x30, + 0x31, 0x33, 0x34, 0x35, + /* 0xc1 */ + 0x00, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0b, 0x0c, + 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2a, + /* 0xc2 */ + 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, + 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, + 0x39, 0x3b, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0c, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, + 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x34, 0x35, + /* 0xc3 */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x09, + 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x15, 0x16, + 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2b, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x35, 0x36, + 0x38, 0x39, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x1a, + 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x32, 0x33, + /* 0xc4 */ + 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, + 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, + 0x2a, 0x2b, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x36, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, + 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x30, 0x31, 0x32, + /* 0xc5 */ + 0x00, 0x01, 0x02, 0x05, 0x06, 0x08, 0x09, 0x0a, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x15, + 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, + 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x33, 0x35, 0x36, + 0x37, 0x38, 0x00, 0x01, 0x04, 0x05, 0x07, 0x0c, + 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x16, 0x18, + 0x19, 0x1a, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, + 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3c, 0x3d, + /* 0xc6 */ + 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, +}; + +static int +uhc_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c1 = s[0]; + if ((c1 >= 0xa1 && c1 <= 0xc6)) { + if (n >= 2) { + unsigned char c2 = s[1]; + if ((c2 >= 0x41 && c2 < 0x5b) || (c2 >= 0x61 && c2 < 0x7b) || (c2 >= 0x81 && c2 < 0xa1)) { + unsigned int row = c1 - 0xa1; + unsigned int col = c2 - (c2 >= 0x81 ? 0x4d : c2 >= 0x61 ? 0x47 : 0x41); + unsigned int i = 84 * row + col; + if (i < 3126) { + *pwc = (ucs4_t) (uhc_2_2uni_main_pagea1[2*row+(col>=42?1:0)] + uhc_2_2uni_pagea1[i]); + return 2; + } + } + return RET_ILSEQ; + } + return RET_TOOFEW(0); + } + return RET_ILSEQ; +} + +static const unsigned short uhc_2_2charset_main[49] = { + 0xa141, 0xa18d, 0xa273, 0xa359, 0xa445, 0xa491, 0xa577, 0xa663, + 0xa749, 0xa795, 0xa881, 0xa967, 0xaa4d, 0xaa99, 0xab85, 0xac6b, + 0xad51, 0xad9d, 0xae89, 0xaf6f, 0xb055, 0xb141, 0xb18d, 0xb273, + 0xb359, 0xb445, 0xb491, 0xb577, 0xb663, 0xb749, 0xb795, 0xb881, + 0xb967, 0xba4d, 0xba99, 0xbb85, 0xbc6b, 0xbd51, 0xbd9d, 0xbe89, + 0xbf6f, 0xc055, 0xc141, 0xc18d, 0xc273, 0xc359, 0xc445, 0xc491, + 0xc577, +}; +static const unsigned char uhc_2_2charset[3126] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, + 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, +}; + +static const Summary16 uhc_2_uni2indx_pagec8[251] = { + /* 0xc800 */ + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, + { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xfee0 }, { 10, 0xcfff }, + { 24, 0xeeef }, { 37, 0xfd4f }, { 49, 0xffec }, { 62, 0xcfdf }, + /* 0xc900 */ + { 75, 0x4f8e }, { 84, 0xfefd }, { 98, 0xefff }, { 113, 0xffef }, + { 128, 0xffff }, { 144, 0xfeec }, { 156, 0xeff4 }, { 168, 0xefee }, + { 181, 0xecff }, { 194, 0xd4fe }, { 205, 0xffff }, { 221, 0xffff }, + { 237, 0xfa6c }, { 247, 0xc994 }, { 254, 0x4f6a }, { 263, 0xecfc }, + /* 0xca00 */ + { 274, 0xc4fe }, { 284, 0xfeef }, { 298, 0xfdff }, { 313, 0xffff }, + { 329, 0xcfff }, { 343, 0x4fee }, { 354, 0xfefc }, { 367, 0xdfff }, + { 382, 0xffef }, { 397, 0xfeff }, { 412, 0xffff }, { 428, 0xcfff }, + { 442, 0x4fee }, { 453, 0xfcf5 }, { 465, 0xeffe }, { 479, 0xffef }, + /* 0xcb00 */ + { 494, 0xfeff }, { 509, 0xfeee }, { 522, 0xfffc }, { 536, 0xffff }, + { 552, 0xecfd }, { 564, 0xdcfe }, { 576, 0xffef }, { 591, 0xfcff }, + { 605, 0xffff }, { 621, 0xefff }, { 636, 0xffff }, { 652, 0xfeff }, + { 667, 0xffff }, { 683, 0xffef }, { 698, 0xfd6f }, { 711, 0xffff }, + /* 0xcc00 */ + { 727, 0xcfff }, { 741, 0xcfee }, { 753, 0xac79 }, { 762, 0x84fe }, + { 771, 0xeecf }, { 783, 0xfc4f }, { 794, 0xfeae }, { 806, 0xffde }, + { 820, 0xffff }, { 836, 0xecff }, { 849, 0xc4fe }, { 859, 0xeecf }, + { 871, 0xfd4f }, { 883, 0xffee }, { 897, 0xefef }, { 911, 0xfffe }, + /* 0xcd00 */ + { 926, 0xecfd }, { 938, 0xd4fe }, { 949, 0xeeef }, { 962, 0xfdff }, + { 977, 0xffff }, { 993, 0xefff }, { 1008, 0x4fee }, { 1019, 0xfefd }, + { 1033, 0xfeff }, { 1048, 0xeecf }, { 1060, 0xfd4f }, { 1072, 0xfffe }, + { 1087, 0xefef }, { 1101, 0xfffe }, { 1116, 0xeeff }, { 1130, 0xd4fe }, + /* 0xce00 */ + { 1141, 0xeeef }, { 1154, 0xfdef }, { 1168, 0xfeec }, { 1180, 0xffd4 }, + { 1192, 0xffff }, { 1208, 0x6cff }, { 1220, 0xd4fc }, { 1230, 0xeecf }, + { 1242, 0xfd4f }, { 1254, 0xfeec }, { 1266, 0xcfc4 }, { 1275, 0xffff }, + { 1291, 0xfffd }, { 1306, 0xffff }, { 1322, 0xe6cf }, { 1333, 0xfc4f }, + /* 0xcf00 */ + { 1344, 0xfeec }, { 1356, 0xefd4 }, { 1367, 0x4fee }, { 1378, 0xfefc }, + { 1391, 0xffff }, { 1407, 0xeecf }, { 1419, 0xfd4f }, { 1431, 0xfeec }, + { 1443, 0xefde }, { 1456, 0xffff }, { 1472, 0xfefd }, { 1486, 0xfffe }, + { 1501, 0xffef }, { 1516, 0xffff }, { 1532, 0xfeec }, { 1544, 0xefd4 }, + /* 0xd000 */ + { 1555, 0xffee }, { 1569, 0xfefd }, { 1583, 0xdfff }, { 1598, 0xeecf }, + { 1610, 0xfd4f }, { 1622, 0xfeee }, { 1635, 0xcffe }, { 1648, 0xcfee }, + { 1660, 0xfffd }, { 1675, 0xffff }, { 1691, 0xeecf }, { 1703, 0xfd4f }, + { 1715, 0xfcec }, { 1726, 0xcfc4 }, { 1735, 0x4fee }, { 1746, 0xfefc }, + /* 0xd100 */ + { 1759, 0xdfff }, { 1774, 0xffff }, { 1790, 0xffff }, { 1806, 0xfaec }, + { 1817, 0xcfc4 }, { 1826, 0x4fee }, { 1837, 0xeefd }, { 1850, 0xefff }, + { 1865, 0xfeef }, { 1879, 0xffff }, { 1895, 0xfeec }, { 1907, 0xebd4 }, + { 1917, 0xfffe }, { 1932, 0xfeff }, { 1947, 0xffff }, { 1963, 0xfeef }, + /* 0xd200 */ + { 1977, 0xfd7f }, { 1991, 0xfffe }, { 2006, 0xcfff }, { 2020, 0x4fee }, + { 2031, 0xfefd }, { 2045, 0xefff }, { 2060, 0xffef }, { 2075, 0xffff }, + { 2091, 0xfeec }, { 2103, 0xefdc }, { 2115, 0xefee }, { 2128, 0x6cfd }, + { 2139, 0xf4fa }, { 2150, 0xeeef }, { 2163, 0xffcf }, { 2177, 0xfeec }, + /* 0xd300 */ + { 2189, 0x8fd4 }, { 2198, 0x4fae }, { 2208, 0xecdc }, { 2218, 0xc4fe }, + { 2228, 0xffcf }, { 2242, 0xffff }, { 2258, 0xffff }, { 2274, 0xcfff }, + { 2288, 0x4fee }, { 2299, 0xecfc }, { 2310, 0xd4fe }, { 2321, 0xeeef }, + { 2334, 0xfccf }, { 2346, 0xfefe }, { 2360, 0xcff5 }, { 2372, 0x4fee }, + /* 0xd400 */ + { 2383, 0xfefd }, { 2397, 0xdfff }, { 2412, 0xffff }, { 2428, 0xffff }, + { 2444, 0xffee }, { 2458, 0xefff }, { 2473, 0x5fee }, { 2485, 0x6cff }, + { 2497, 0xd4fa }, { 2507, 0xffef }, { 2522, 0xfdff }, { 2537, 0xffff }, + { 2553, 0xefff }, { 2568, 0x6fee }, { 2580, 0xeeff }, { 2594, 0xd6fe }, + /* 0xd500 */ + { 2606, 0xeeef }, { 2619, 0xff4f }, { 2632, 0xffff }, { 2648, 0xcfff }, + { 2662, 0x4fee }, { 2673, 0xecfd }, { 2685, 0xd4de }, { 2695, 0xeecf }, + { 2707, 0xfc4f }, { 2718, 0xfffe }, { 2733, 0xffdf }, { 2748, 0xffff }, + { 2764, 0xecff }, { 2777, 0xd4fa }, { 2787, 0xeecf }, { 2799, 0xfd4f }, + /* 0xd600 */ + { 2811, 0xfeec }, { 2823, 0xefc4 }, { 2833, 0xdfee }, { 2846, 0xecff }, + { 2859, 0xd4de }, { 2869, 0xeecd }, { 2880, 0xfd7f }, { 2894, 0xffec }, + { 2907, 0xcfd7 }, { 2919, 0x5fee }, { 2931, 0xeefd }, { 2944, 0xf5fe }, + { 2957, 0xeecf }, { 2969, 0xfd6d }, { 2981, 0xfeee }, { 2994, 0xcfde }, + /* 0xd700 */ + { 3006, 0xffee }, { 3020, 0xecfd }, { 3032, 0xd4fe }, { 3043, 0xeecf }, + { 3055, 0xfd6f }, { 3068, 0xfc2c }, { 3077, 0xedd4 }, { 3087, 0xcfee }, + { 3099, 0xecfd }, { 3111, 0xd4fe }, { 3122, 0x000f }, +}; + +static int +uhc_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (n >= 2) { + if (wc >= 0xc800 && wc < 0xd7b0) { + const Summary16 *summary = &uhc_2_uni2indx_pagec8[(wc>>4)-0xc80]; + unsigned short used = summary->used; + unsigned int i = wc & 0x0f; + if (used & ((unsigned short) 1 << i)) { + unsigned short c; + /* Keep in `used' only the bits 0..i-1. */ + used &= ((unsigned short) 1 << i) - 1; + /* Add `summary->indx' and the number of bits set in `used'. */ + used = (used & 0x5555) + ((used & 0xaaaa) >> 1); + used = (used & 0x3333) + ((used & 0xcccc) >> 2); + used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); + used = (used & 0x00ff) + (used >> 8); + used += summary->indx; + c = uhc_2_2charset_main[used>>6] + uhc_2_2charset[used]; + r[0] = (c >> 8); r[1] = (c & 0xff); + return 2; + } + } + return RET_ILUNI; + } + return RET_TOOSMALL; +} diff --git a/Externals/libiconv-1.14/lib/utf16.h b/Externals/libiconv-1.14/lib/utf16.h new file mode 100644 index 0000000000..99b5e2c2d8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf16.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-16 + */ + +/* Specification: RFC 2781 */ + +/* Here we accept FFFE/FEFF marks as endianness indicators everywhere + in the stream, not just at the beginning. (This is contrary to what + RFC 2781 section 3.2 specifies, but it allows concatenation of byte + sequences to work flawlessly, while disagreeing with the RFC behaviour + only for strings containing U+FEFF characters, which is quite rare.) + The default is big-endian. */ +/* The state is 0 if big-endian, 1 if little-endian. */ +static int +utf16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + for (; n >= 2;) { + ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); + if (wc == 0xfeff) { + } else if (wc == 0xfffe) { + state ^= 1; + } else if (wc >= 0xd800 && wc < 0xdc00) { + if (n >= 4) { + ucs4_t wc2 = (state ? s[2] + (s[3] << 8) : (s[2] << 8) + s[3]); + if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) + goto ilseq; + *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); + conv->istate = state; + return count+4; + } else + break; + } else if (wc >= 0xdc00 && wc < 0xe000) { + goto ilseq; + } else { + *pwc = wc; + conv->istate = state; + return count+2; + } + s += 2; n -= 2; count += 2; + } + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +/* We output UTF-16 in big-endian order, with byte-order mark. + See RFC 2781 section 3.3 for a rationale: Some document formats + mandate a BOM; the file concatenation issue is not so severe as + long as the above utf16_mbtowc function is used. */ +/* The state is 0 at the beginning, 1 after the BOM has been written. */ +static int +utf16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { + int count = 0; + if (!conv->ostate) { + if (n >= 2) { + r[0] = 0xFE; + r[1] = 0xFF; + r += 2; n -= 2; count += 2; + } else + return RET_TOOSMALL; + } + if (wc < 0x10000) { + if (n >= 2) { + r[0] = (unsigned char) (wc >> 8); + r[1] = (unsigned char) wc; + conv->ostate = 1; + return count+2; + } else + return RET_TOOSMALL; + } + else if (wc < 0x110000) { + if (n >= 4) { + ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); + ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); + r[0] = (unsigned char) (wc1 >> 8); + r[1] = (unsigned char) wc1; + r[2] = (unsigned char) (wc2 >> 8); + r[3] = (unsigned char) wc2; + conv->ostate = 1; + return count+4; + } else + return RET_TOOSMALL; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf16be.h b/Externals/libiconv-1.14/lib/utf16be.h new file mode 100644 index 0000000000..a6d90ffb91 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf16be.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-16BE + */ + +/* Specification: RFC 2781 */ + +static int +utf16be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + int count = 0; + if (n >= 2) { + ucs4_t wc = (s[0] << 8) + s[1]; + if (wc >= 0xd800 && wc < 0xdc00) { + if (n >= 4) { + ucs4_t wc2 = (s[2] << 8) + s[3]; + if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) + goto ilseq; + *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); + return count+4; + } + } else if (wc >= 0xdc00 && wc < 0xe000) { + goto ilseq; + } else { + *pwc = wc; + return count+2; + } + } + return RET_TOOFEW(count); + +ilseq: + return RET_SHIFT_ILSEQ(count); +} + +static int +utf16be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (!(wc >= 0xd800 && wc < 0xe000)) { + if (wc < 0x10000) { + if (n >= 2) { + r[0] = (unsigned char) (wc >> 8); + r[1] = (unsigned char) wc; + return 2; + } else + return RET_TOOSMALL; + } + else if (wc < 0x110000) { + if (n >= 4) { + ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); + ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); + r[0] = (unsigned char) (wc1 >> 8); + r[1] = (unsigned char) wc1; + r[2] = (unsigned char) (wc2 >> 8); + r[3] = (unsigned char) wc2; + return 4; + } else + return RET_TOOSMALL; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf16le.h b/Externals/libiconv-1.14/lib/utf16le.h new file mode 100644 index 0000000000..5bb2b02696 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf16le.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-16LE + */ + +/* Specification: RFC 2781 */ + +static int +utf16le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + int count = 0; + if (n >= 2) { + ucs4_t wc = s[0] + (s[1] << 8); + if (wc >= 0xd800 && wc < 0xdc00) { + if (n >= 4) { + ucs4_t wc2 = s[2] + (s[3] << 8); + if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) + goto ilseq; + *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); + return count+4; + } + } else if (wc >= 0xdc00 && wc < 0xe000) { + goto ilseq; + } else { + *pwc = wc; + return count+2; + } + } + return RET_TOOFEW(count); + +ilseq: + return RET_SHIFT_ILSEQ(count); +} + +static int +utf16le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (!(wc >= 0xd800 && wc < 0xe000)) { + if (wc < 0x10000) { + if (n >= 2) { + r[0] = (unsigned char) wc; + r[1] = (unsigned char) (wc >> 8); + return 2; + } else + return RET_TOOSMALL; + } + else if (wc < 0x110000) { + if (n >= 4) { + ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); + ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); + r[0] = (unsigned char) wc1; + r[1] = (unsigned char) (wc1 >> 8); + r[2] = (unsigned char) wc2; + r[3] = (unsigned char) (wc2 >> 8); + return 4; + } else + return RET_TOOSMALL; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf32.h b/Externals/libiconv-1.14/lib/utf32.h new file mode 100644 index 0000000000..bc579ae0b8 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf32.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-32 + */ + +/* Specification: Unicode 3.1 Standard Annex #19 */ + +/* Here we accept FFFE0000/0000FEFF marks as endianness indicators + everywhere in the stream, not just at the beginning. (This is contrary + to what #19 D36c specifies, but it allows concatenation of byte + sequences to work flawlessly, while disagreeing with #19 behaviour + only for strings containing U+FEFF characters, which is quite rare.) + The default is big-endian. */ +/* The state is 0 if big-endian, 1 if little-endian. */ +static int +utf32_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; + for (; n >= 4;) { + ucs4_t wc = (state + ? s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) + : (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]); + count += 4; + if (wc == 0x0000feff) { + } else if (wc == 0xfffe0000u) { + state ^= 1; + } else { + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + *pwc = wc; + conv->istate = state; + return count; + } else { + conv->istate = state; + return RET_SHIFT_ILSEQ(count); + } + } + s += 4; n -= 4; + } + conv->istate = state; + return RET_TOOFEW(count); +} + +/* We output UTF-32 in big-endian order, with byte-order mark. */ +/* The state is 0 at the beginning, 1 after the BOM has been written. */ +static int +utf32_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + int count = 0; + if (!conv->ostate) { + if (n >= 4) { + r[0] = 0x00; + r[1] = 0x00; + r[2] = 0xFE; + r[3] = 0xFF; + r += 4; n -= 4; count += 4; + } else + return RET_TOOSMALL; + } + if (wc < 0x110000) { + if (n >= 4) { + r[0] = 0; + r[1] = (unsigned char) (wc >> 16); + r[2] = (unsigned char) (wc >> 8); + r[3] = (unsigned char) wc; + conv->ostate = 1; + return count+4; + } else + return RET_TOOSMALL; + } + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf32be.h b/Externals/libiconv-1.14/lib/utf32be.h new file mode 100644 index 0000000000..50811298d6 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf32be.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-32BE + */ + +/* Specification: Unicode 3.1 Standard Annex #19 */ + +static int +utf32be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 4) { + ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]; + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + *pwc = wc; + return 4; + } else + return RET_ILSEQ; + } + return RET_TOOFEW(0); +} + +static int +utf32be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 4) { + r[0] = 0; + r[1] = (unsigned char) (wc >> 16); + r[2] = (unsigned char) (wc >> 8); + r[3] = (unsigned char) wc; + return 4; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf32le.h b/Externals/libiconv-1.14/lib/utf32le.h new file mode 100644 index 0000000000..9d3699bc98 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf32le.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-32LE + */ + +/* Specification: Unicode 3.1 Standard Annex #19 */ + +static int +utf32le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + if (n >= 4) { + ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24); + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + *pwc = wc; + return 4; + } else + return RET_ILSEQ; + } + return RET_TOOFEW(0); +} + +static int +utf32le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { + if (n >= 4) { + r[0] = (unsigned char) wc; + r[1] = (unsigned char) (wc >> 8); + r[2] = (unsigned char) (wc >> 16); + r[3] = 0; + return 4; + } else + return RET_TOOSMALL; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/lib/utf7.h b/Externals/libiconv-1.14/lib/utf7.h new file mode 100644 index 0000000000..888bfb4d65 --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf7.h @@ -0,0 +1,355 @@ +/* + * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-7 + */ + +/* Specification: RFC 2152 (and old RFC 1641, RFC 1642) */ +/* The original Base64 encoding is defined in RFC 2045. */ + +/* Set of direct characters: + * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr + */ +static const unsigned char direct_tab[128/8] = { + 0x00, 0x26, 0x00, 0x00, 0x81, 0xf3, 0xff, 0x87, + 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, +}; +#define isdirect(ch) ((ch) < 128 && ((direct_tab[(ch)>>3] >> (ch & 7)) & 1)) + +/* Set of direct and optional direct characters: + * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr + * ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } + */ +static const unsigned char xdirect_tab[128/8] = { + 0x00, 0x26, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x3f, +}; +#define isxdirect(ch) ((ch) < 128 && ((xdirect_tab[(ch)>>3] >> (ch & 7)) & 1)) + +/* Set of base64 characters, extended: + * A-Z a-z 0-9 + / - + */ +static const unsigned char xbase64_tab[128/8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x03, + 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, +}; +#define isxbase64(ch) ((ch) < 128 && ((xbase64_tab[(ch)>>3] >> (ch & 7)) & 1)) + +/* + * The state is structured as follows: + * bit 1..0: shift + * bit 7..2: data + * Precise meaning: + * shift data + * 0 0 not inside base64 encoding + * 1 0 inside base64, no pending bits + * 2 XXXX00 inside base64, 4 bits remain from 2nd byte + * 3 XX0000 inside base64, 2 bits remain from 3rd byte + */ + +static int +utf7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + state_t state = conv->istate; + int count = 0; /* number of input bytes already read */ + if (state & 3) + goto active; + else + goto inactive; + +inactive: + { + /* Here (state & 3) == 0 */ + if (n < count+1) + goto none; + { + unsigned char c = *s; + if (isxdirect(c)) { + *pwc = (ucs4_t) c; + conv->istate = state; + return count+1; + } + if (c == '+') { + if (n < count+2) + goto none; + if (s[1] == '-') { + *pwc = (ucs4_t) '+'; + conv->istate = state; + return count+2; + } + s++; count++; + state = 1; + goto active; + } + goto ilseq; + } + } + +active: + { + /* base64 encoding active */ + unsigned int wc = 0; + state_t base64state = state; + unsigned int kmax = 2; /* number of payload bytes to read */ + unsigned int k = 0; /* number of payload bytes already read */ + unsigned int base64count = 0; /* number of base64 bytes already read */ + for (;;) { + unsigned char c = *s; + unsigned int i; + if (c >= 'A' && c <= 'Z') + i = c-'A'; + else if (c >= 'a' && c <= 'z') + i = c-'a'+26; + else if (c >= '0' && c <= '9') + i = c-'0'+52; + else if (c == '+') + i = 62; + else if (c == '/') + i = 63; + else { + /* c terminates base64 encoding */ + if (base64state & -4) + goto ilseq; /* data must be 0, otherwise illegal */ + if (base64count) + goto ilseq; /* partial UTF-16 characters are invalid */ + if (c == '-') { + s++; count++; + } + state = 0; + goto inactive; + } + s++; base64count++; + /* read 6 bits: 0 <= i < 64 */ + switch (base64state & 3) { + case 1: /* inside base64, no pending bits */ + base64state = (i << 2) | 0; break; + case 0: /* inside base64, 6 bits remain from 1st byte */ + wc = (wc << 8) | (base64state & -4) | (i >> 4); k++; + base64state = ((i & 15) << 4) | 2; break; + case 2: /* inside base64, 4 bits remain from 2nd byte */ + wc = (wc << 8) | (base64state & -4) | (i >> 2); k++; + base64state = ((i & 3) << 6) | 3; break; + case 3: /* inside base64, 2 bits remain from 3rd byte */ + wc = (wc << 8) | (base64state & -4) | i; k++; + base64state = 1; break; + } + if (k == kmax) { + /* UTF-16: When we see a High Surrogate, we must also decode + the following Low Surrogate. */ + if (kmax == 2 && (wc >= 0xd800 && wc < 0xdc00)) + kmax = 4; + else + break; + } + if (n < count+base64count+1) + goto none; + } + /* Here k = kmax > 0, hence base64count > 0. */ + if ((base64state & 3) == 0) abort(); + if (kmax == 4) { + ucs4_t wc1 = wc >> 16; + ucs4_t wc2 = wc & 0xffff; + if (!(wc1 >= 0xd800 && wc1 < 0xdc00)) abort(); + if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto ilseq; + *pwc = 0x10000 + ((wc1 - 0xd800) << 10) + (wc2 - 0xdc00); + } else { + *pwc = wc; + } + conv->istate = base64state; + return count+base64count; + } + +none: + conv->istate = state; + return RET_TOOFEW(count); + +ilseq: + conv->istate = state; + return RET_SHIFT_ILSEQ(count); +} + +/* + * The state is structured as follows: + * bit 1..0: shift + * bit 7..2: data + * Precise meaning: + * shift data + * 0 0 not inside base64 encoding + * 1 0 inside base64, no pending bits + * 2 XX00 inside base64, 2 bits known for 2nd byte + * 3 XXXX inside base64, 4 bits known for 3rd byte + */ + +/* Define this to 1 if you want the so-called "optional direct" characters + ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } + to be encoded. Define to 0 if you want them to be passed straight through, + like the so-called "direct" characters. + We set this to 1 because it's safer. + */ +#define UTF7_ENCODE_OPTIONAL_CHARS 1 + +static int +utf7_wctomb (conv_t conv, unsigned char *r, ucs4_t iwc, int n) +{ + state_t state = conv->ostate; + unsigned int wc = iwc; + int count = 0; + if (state & 3) + goto active; + +/*inactive:*/ + { + if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { + r[0] = (unsigned char) wc; + /*conv->ostate = state;*/ + return 1; + } else { + *r++ = '+'; + if (wc == '+') { + if (n < 2) + return RET_TOOSMALL; + *r = '-'; + /*conv->ostate = state;*/ + return 2; + } + count = 1; + state = 1; + goto active; + } + } + +active: + { + /* base64 encoding active */ + if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { + /* deactivate base64 encoding */ + count += ((state & 3) >= 2 ? 1 : 0) + (isxbase64(wc) ? 1 : 0) + 1; + if (n < count) + return RET_TOOSMALL; + if ((state & 3) >= 2) { + unsigned int i = state & -4; + unsigned char c; + if (i < 26) + c = i+'A'; + else if (i < 52) + c = i-26+'a'; + else if (i < 62) + c = i-52+'0'; + else if (i == 62) + c = '+'; + else if (i == 63) + c = '/'; + else + abort(); + *r++ = c; + } + if (isxbase64(wc)) + *r++ = '-'; + state = 0; + *r++ = (unsigned char) wc; + conv->ostate = state; + return count; + } else { + unsigned int k; /* number of payload bytes to write */ + if (wc < 0x10000) { + k = 2; + count += ((state & 3) >= 2 ? 3 : 2); + } else if (wc < 0x110000) { + unsigned int wc1 = 0xd800 + ((wc - 0x10000) >> 10); + unsigned int wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); + wc = (wc1 << 16) | wc2; + k = 4; + count += ((state & 3) >= 3 ? 6 : 5); + } else + return RET_ILUNI; + if (n < count) + return RET_TOOSMALL; + for (;;) { + unsigned int i; + unsigned char c; + switch (state & 3) { + case 0: /* inside base64, 6 bits known for 4th byte */ + c = (state & -4) >> 2; state = 1; break; + case 1: /* inside base64, no pending bits */ + i = (wc >> (8 * --k)) & 0xff; + c = i >> 2; state = ((i & 3) << 4) | 2; break; + case 2: /* inside base64, 2 bits known for 2nd byte */ + i = (wc >> (8 * --k)) & 0xff; + c = (state & -4) | (i >> 4); state = ((i & 15) << 2) | 3; break; + case 3: /* inside base64, 4 bits known for 3rd byte */ + i = (wc >> (8 * --k)) & 0xff; + c = (state & -4) | (i >> 6); state = ((i & 63) << 2) | 0; break; + default: abort(); /* stupid gcc */ + } + if (c < 26) + c = c+'A'; + else if (c < 52) + c = c-26+'a'; + else if (c < 62) + c = c-52+'0'; + else if (c == 62) + c = '+'; + else if (c == 63) + c = '/'; + else + abort(); + *r++ = c; + if ((state & 3) && (k == 0)) + break; + } + conv->ostate = state; + return count; + } + } +} + +static int +utf7_reset (conv_t conv, unsigned char *r, int n) +{ + state_t state = conv->ostate; + if (state & 3) { + /* deactivate base64 encoding */ + unsigned int count = ((state & 3) >= 2 ? 1 : 0) + 1; + if (n < count) + return RET_TOOSMALL; + if ((state & 3) >= 2) { + unsigned int i = state & -4; + unsigned char c; + if (i < 26) + c = i+'A'; + else if (i < 52) + c = i-26+'a'; + else if (i < 62) + c = i-52+'0'; + else if (i == 62) + c = '+'; + else if (i == 63) + c = '/'; + else + abort(); + *r++ = c; + } + *r++ = '-'; + /* conv->ostate = 0; will be done by the caller */ + return count; + } else + return 0; +} diff --git a/Externals/libiconv-1.14/lib/utf8.h b/Externals/libiconv-1.14/lib/utf8.h new file mode 100644 index 0000000000..9d07219c8a --- /dev/null +++ b/Externals/libiconv-1.14/lib/utf8.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * UTF-8 + */ + +/* Specification: RFC 3629 */ + +static int +utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = s[0]; + + if (c < 0x80) { + *pwc = c; + return 1; + } else if (c < 0xc2) { + return RET_ILSEQ; + } else if (c < 0xe0) { + if (n < 2) + return RET_TOOFEW(0); + if (!((s[1] ^ 0x80) < 0x40)) + return RET_ILSEQ; + *pwc = ((ucs4_t) (c & 0x1f) << 6) + | (ucs4_t) (s[1] ^ 0x80); + return 2; + } else if (c < 0xf0) { + if (n < 3) + return RET_TOOFEW(0); + if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 + && (c >= 0xe1 || s[1] >= 0xa0))) + return RET_ILSEQ; + *pwc = ((ucs4_t) (c & 0x0f) << 12) + | ((ucs4_t) (s[1] ^ 0x80) << 6) + | (ucs4_t) (s[2] ^ 0x80); + return 3; + } else if (c < 0xf8 && sizeof(ucs4_t)*8 >= 32) { + if (n < 4) + return RET_TOOFEW(0); + if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 + && (s[3] ^ 0x80) < 0x40 + && (c >= 0xf1 || s[1] >= 0x90))) + return RET_ILSEQ; + *pwc = ((ucs4_t) (c & 0x07) << 18) + | ((ucs4_t) (s[1] ^ 0x80) << 12) + | ((ucs4_t) (s[2] ^ 0x80) << 6) + | (ucs4_t) (s[3] ^ 0x80); + return 4; + } else if (c < 0xfc && sizeof(ucs4_t)*8 >= 32) { + if (n < 5) + return RET_TOOFEW(0); + if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 + && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 + && (c >= 0xf9 || s[1] >= 0x88))) + return RET_ILSEQ; + *pwc = ((ucs4_t) (c & 0x03) << 24) + | ((ucs4_t) (s[1] ^ 0x80) << 18) + | ((ucs4_t) (s[2] ^ 0x80) << 12) + | ((ucs4_t) (s[3] ^ 0x80) << 6) + | (ucs4_t) (s[4] ^ 0x80); + return 5; + } else if (c < 0xfe && sizeof(ucs4_t)*8 >= 32) { + if (n < 6) + return RET_TOOFEW(0); + if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 + && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 + && (s[5] ^ 0x80) < 0x40 + && (c >= 0xfd || s[1] >= 0x84))) + return RET_ILSEQ; + *pwc = ((ucs4_t) (c & 0x01) << 30) + | ((ucs4_t) (s[1] ^ 0x80) << 24) + | ((ucs4_t) (s[2] ^ 0x80) << 18) + | ((ucs4_t) (s[3] ^ 0x80) << 12) + | ((ucs4_t) (s[4] ^ 0x80) << 6) + | (ucs4_t) (s[5] ^ 0x80); + return 6; + } else + return RET_ILSEQ; +} + +static int +utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */ +{ + int count; + if (wc < 0x80) + count = 1; + else if (wc < 0x800) + count = 2; + else if (wc < 0x10000) + count = 3; + else if (wc < 0x200000) + count = 4; + else if (wc < 0x4000000) + count = 5; + else if (wc <= 0x7fffffff) + count = 6; + else + return RET_ILUNI; + if (n < count) + return RET_TOOSMALL; + switch (count) { /* note: code falls through cases! */ + case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; + case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; + case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; + case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; + case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; + case 1: r[0] = wc; + } + return count; +} diff --git a/Externals/libiconv-1.14/lib/vietcomb.h b/Externals/libiconv-1.14/lib/vietcomb.h new file mode 100644 index 0000000000..023b5e32f0 --- /dev/null +++ b/Externals/libiconv-1.14/lib/vietcomb.h @@ -0,0 +1,466 @@ +/* + * Copyright (C) 2001, 2004, 2011 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* Combining characters used in Vietnamese encodings CP1258, TCVN. */ + +#ifndef _VIETCOMB_H +#define _VIETCOMB_H + +/* Relevant combining characters: + 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ + +/* Composition tables for each of the relevant combining characters. */ +static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { +#define viet_comp_table0300_idx 0 +#define viet_comp_table0300_len 31 + { 0x0041, 0x00C0 }, + { 0x0045, 0x00C8 }, + { 0x0049, 0x00CC }, + { 0x004E, 0x01F8 }, + { 0x004F, 0x00D2 }, + { 0x0055, 0x00D9 }, + { 0x0057, 0x1E80 }, + { 0x0059, 0x1EF2 }, + { 0x0061, 0x00E0 }, + { 0x0065, 0x00E8 }, + { 0x0069, 0x00EC }, + { 0x006E, 0x01F9 }, + { 0x006F, 0x00F2 }, + { 0x0075, 0x00F9 }, + { 0x0077, 0x1E81 }, + { 0x0079, 0x1EF3 }, + { 0x00A8, 0x1FED }, + { 0x00C2, 0x1EA6 }, + { 0x00CA, 0x1EC0 }, + { 0x00D4, 0x1ED2 }, + { 0x00DC, 0x01DB }, + { 0x00E2, 0x1EA7 }, + { 0x00EA, 0x1EC1 }, + { 0x00F4, 0x1ED3 }, + { 0x00FC, 0x01DC }, + { 0x0102, 0x1EB0 }, + { 0x0103, 0x1EB1 }, +/*{ 0x0112, 0x1E14 },*/ +/*{ 0x0113, 0x1E15 },*/ +/*{ 0x014C, 0x1E50 },*/ +/*{ 0x014D, 0x1E51 },*/ + { 0x01A0, 0x1EDC }, + { 0x01A1, 0x1EDD }, + { 0x01AF, 0x1EEA }, + { 0x01B0, 0x1EEB }, +#define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) +#define viet_comp_table0301_len 63 + { 0x0041, 0x00C1 }, + { 0x0043, 0x0106 }, + { 0x0045, 0x00C9 }, + { 0x0047, 0x01F4 }, + { 0x0049, 0x00CD }, + { 0x004B, 0x1E30 }, + { 0x004C, 0x0139 }, + { 0x004D, 0x1E3E }, + { 0x004E, 0x0143 }, + { 0x004F, 0x00D3 }, + { 0x0050, 0x1E54 }, + { 0x0052, 0x0154 }, + { 0x0053, 0x015A }, + { 0x0055, 0x00DA }, + { 0x0057, 0x1E82 }, + { 0x0059, 0x00DD }, + { 0x005A, 0x0179 }, + { 0x0061, 0x00E1 }, + { 0x0063, 0x0107 }, + { 0x0065, 0x00E9 }, + { 0x0067, 0x01F5 }, + { 0x0069, 0x00ED }, + { 0x006B, 0x1E31 }, + { 0x006C, 0x013A }, + { 0x006D, 0x1E3F }, + { 0x006E, 0x0144 }, + { 0x006F, 0x00F3 }, + { 0x0070, 0x1E55 }, + { 0x0072, 0x0155 }, + { 0x0073, 0x015B }, + { 0x0075, 0x00FA }, + { 0x0077, 0x1E83 }, + { 0x0079, 0x00FD }, + { 0x007A, 0x017A }, + { 0x00A8, 0x0385 }, /* prefer U+0385 over U+1FEE */ + { 0x00C2, 0x1EA4 }, + { 0x00C5, 0x01FA }, + { 0x00C6, 0x01FC }, + { 0x00C7, 0x1E08 }, + { 0x00CA, 0x1EBE }, + { 0x00CF, 0x1E2E }, + { 0x00D4, 0x1ED0 }, + { 0x00D5, 0x1E4C }, + { 0x00D8, 0x01FE }, + { 0x00DC, 0x01D7 }, + { 0x00E2, 0x1EA5 }, + { 0x00E5, 0x01FB }, + { 0x00E6, 0x01FD }, + { 0x00E7, 0x1E09 }, + { 0x00EA, 0x1EBF }, + { 0x00EF, 0x1E2F }, + { 0x00F4, 0x1ED1 }, + { 0x00F5, 0x1E4D }, + { 0x00F8, 0x01FF }, + { 0x00FC, 0x01D8 }, + { 0x0102, 0x1EAE }, + { 0x0103, 0x1EAF }, +/*{ 0x0112, 0x1E16 },*/ +/*{ 0x0113, 0x1E17 },*/ +/*{ 0x014C, 0x1E52 },*/ +/*{ 0x014D, 0x1E53 },*/ + { 0x0168, 0x1E78 }, + { 0x0169, 0x1E79 }, + { 0x01A0, 0x1EDA }, + { 0x01A1, 0x1EDB }, + { 0x01AF, 0x1EE8 }, + { 0x01B0, 0x1EE9 }, +#define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) +#define viet_comp_table0303_len 34 + { 0x0041, 0x00C3 }, + { 0x0045, 0x1EBC }, + { 0x0049, 0x0128 }, + { 0x004E, 0x00D1 }, + { 0x004F, 0x00D5 }, + { 0x0055, 0x0168 }, + { 0x0056, 0x1E7C }, + { 0x0059, 0x1EF8 }, + { 0x0061, 0x00E3 }, + { 0x0065, 0x1EBD }, + { 0x0069, 0x0129 }, + { 0x006E, 0x00F1 }, + { 0x006F, 0x00F5 }, + { 0x0075, 0x0169 }, + { 0x0076, 0x1E7D }, + { 0x0079, 0x1EF9 }, + { 0x00C2, 0x1EAA }, + { 0x00CA, 0x1EC4 }, + { 0x00D3, 0x1E4C }, + { 0x00D4, 0x1ED6 }, + { 0x00D6, 0x1E4E }, + { 0x00DA, 0x1E78 }, + { 0x00E2, 0x1EAB }, + { 0x00EA, 0x1EC5 }, + { 0x00F3, 0x1E4D }, + { 0x00F4, 0x1ED7 }, + { 0x00F6, 0x1E4F }, + { 0x00FA, 0x1E79 }, + { 0x0102, 0x1EB4 }, + { 0x0103, 0x1EB5 }, + { 0x01A0, 0x1EE0 }, + { 0x01A1, 0x1EE1 }, + { 0x01AF, 0x1EEE }, + { 0x01B0, 0x1EEF }, +#define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) +#define viet_comp_table0309_len 24 + { 0x0041, 0x1EA2 }, + { 0x0045, 0x1EBA }, + { 0x0049, 0x1EC8 }, + { 0x004F, 0x1ECE }, + { 0x0055, 0x1EE6 }, + { 0x0059, 0x1EF6 }, + { 0x0061, 0x1EA3 }, + { 0x0065, 0x1EBB }, + { 0x0069, 0x1EC9 }, + { 0x006F, 0x1ECF }, + { 0x0075, 0x1EE7 }, + { 0x0079, 0x1EF7 }, + { 0x00C2, 0x1EA8 }, + { 0x00CA, 0x1EC2 }, + { 0x00D4, 0x1ED4 }, + { 0x00E2, 0x1EA9 }, + { 0x00EA, 0x1EC3 }, + { 0x00F4, 0x1ED5 }, + { 0x0102, 0x1EB2 }, + { 0x0103, 0x1EB3 }, + { 0x01A0, 0x1EDE }, + { 0x01A1, 0x1EDF }, + { 0x01AF, 0x1EEC }, + { 0x01B0, 0x1EED }, +#define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) +#define viet_comp_table0323_len 50 + { 0x0041, 0x1EA0 }, + { 0x0042, 0x1E04 }, + { 0x0044, 0x1E0C }, + { 0x0045, 0x1EB8 }, + { 0x0048, 0x1E24 }, + { 0x0049, 0x1ECA }, + { 0x004B, 0x1E32 }, + { 0x004C, 0x1E36 }, + { 0x004D, 0x1E42 }, + { 0x004E, 0x1E46 }, + { 0x004F, 0x1ECC }, + { 0x0052, 0x1E5A }, + { 0x0053, 0x1E62 }, + { 0x0054, 0x1E6C }, + { 0x0055, 0x1EE4 }, + { 0x0056, 0x1E7E }, + { 0x0057, 0x1E88 }, + { 0x0059, 0x1EF4 }, + { 0x005A, 0x1E92 }, + { 0x0061, 0x1EA1 }, + { 0x0062, 0x1E05 }, + { 0x0064, 0x1E0D }, + { 0x0065, 0x1EB9 }, + { 0x0068, 0x1E25 }, + { 0x0069, 0x1ECB }, + { 0x006B, 0x1E33 }, + { 0x006C, 0x1E37 }, + { 0x006D, 0x1E43 }, + { 0x006E, 0x1E47 }, + { 0x006F, 0x1ECD }, + { 0x0072, 0x1E5B }, + { 0x0073, 0x1E63 }, + { 0x0074, 0x1E6D }, + { 0x0075, 0x1EE5 }, + { 0x0076, 0x1E7F }, + { 0x0077, 0x1E89 }, + { 0x0079, 0x1EF5 }, + { 0x007A, 0x1E93 }, + { 0x00C2, 0x1EAC }, + { 0x00CA, 0x1EC6 }, + { 0x00D4, 0x1ED8 }, + { 0x00E2, 0x1EAD }, + { 0x00EA, 0x1EC7 }, + { 0x00F4, 0x1ED9 }, + { 0x0102, 0x1EB6 }, + { 0x0103, 0x1EB7 }, + { 0x01A0, 0x1EE2 }, + { 0x01A1, 0x1EE3 }, + { 0x01AF, 0x1EF0 }, + { 0x01B0, 0x1EF1 }, +}; +static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { + { viet_comp_table0300_len, viet_comp_table0300_idx }, + { viet_comp_table0301_len, viet_comp_table0301_idx }, + { viet_comp_table0303_len, viet_comp_table0303_idx }, + { viet_comp_table0309_len, viet_comp_table0309_idx }, + { viet_comp_table0323_len, viet_comp_table0323_idx }, +}; + +/* Decomposition table for the relevant Unicode characters. */ +struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; +static const struct viet_decomp viet_decomp_table[] = { + { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ + { 0x00C0, 0x0041, 0 }, + { 0x00C1, 0x0041, 1 }, + { 0x00C3, 0x0041, 2 }, + { 0x00C8, 0x0045, 0 }, + { 0x00C9, 0x0045, 1 }, + { 0x00CC, 0x0049, 0 }, + { 0x00CD, 0x0049, 1 }, + { 0x00D1, 0x004E, 2 }, + { 0x00D2, 0x004F, 0 }, + { 0x00D3, 0x004F, 1 }, + { 0x00D5, 0x004F, 2 }, + { 0x00D9, 0x0055, 0 }, + { 0x00DA, 0x0055, 1 }, + { 0x00DD, 0x0059, 1 }, + { 0x00E0, 0x0061, 0 }, + { 0x00E1, 0x0061, 1 }, + { 0x00E3, 0x0061, 2 }, + { 0x00E8, 0x0065, 0 }, + { 0x00E9, 0x0065, 1 }, + { 0x00EC, 0x0069, 0 }, + { 0x00ED, 0x0069, 1 }, + { 0x00F1, 0x006E, 2 }, + { 0x00F2, 0x006F, 0 }, + { 0x00F3, 0x006F, 1 }, + { 0x00F5, 0x006F, 2 }, + { 0x00F9, 0x0075, 0 }, + { 0x00FA, 0x0075, 1 }, + { 0x00FD, 0x0079, 1 }, + { 0x0106, 0x0043, 1 }, + { 0x0107, 0x0063, 1 }, + { 0x0128, 0x0049, 2 }, + { 0x0129, 0x0069, 2 }, + { 0x0139, 0x004C, 1 }, + { 0x013A, 0x006C, 1 }, + { 0x0143, 0x004E, 1 }, + { 0x0144, 0x006E, 1 }, + { 0x0154, 0x0052, 1 }, + { 0x0155, 0x0072, 1 }, + { 0x015A, 0x0053, 1 }, + { 0x015B, 0x0073, 1 }, + { 0x0168, 0x0055, 2 }, + { 0x0169, 0x0075, 2 }, + { 0x0179, 0x005A, 1 }, + { 0x017A, 0x007A, 1 }, + { 0x01D7, 0x00DC, 1 }, + { 0x01D8, 0x00FC, 1 }, + { 0x01DB, 0x00DC, 0 }, + { 0x01DC, 0x00FC, 0 }, + { 0x01F4, 0x0047, 1 }, + { 0x01F5, 0x0067, 1 }, + { 0x01F8, 0x004E, 0 }, + { 0x01F9, 0x006E, 0 }, + { 0x01FA, 0x00C5, 1 }, + { 0x01FB, 0x00E5, 1 }, + { 0x01FC, 0x00C6, 1 }, + { 0x01FD, 0x00E6, 1 }, + { 0x01FE, 0x00D8, 1 }, + { 0x01FF, 0x00F8, 1 }, + { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ + { 0x0385, 0x00A8, 1 }, + { 0x1E04, 0x0042, 4 }, + { 0x1E05, 0x0062, 4 }, + { 0x1E08, 0x00C7, 1 }, + { 0x1E09, 0x00E7, 1 }, + { 0x1E0C, 0x0044, 4 }, + { 0x1E0D, 0x0064, 4 }, + { 0x1E24, 0x0048, 4 }, + { 0x1E25, 0x0068, 4 }, + { 0x1E2E, 0x00CF, 1 }, + { 0x1E2F, 0x00EF, 1 }, + { 0x1E30, 0x004B, 1 }, + { 0x1E31, 0x006B, 1 }, + { 0x1E32, 0x004B, 4 }, + { 0x1E33, 0x006B, 4 }, + { 0x1E36, 0x004C, 4 }, + { 0x1E37, 0x006C, 4 }, + { 0x1E3E, 0x004D, 1 }, + { 0x1E3F, 0x006D, 1 }, + { 0x1E42, 0x004D, 4 }, + { 0x1E43, 0x006D, 4 }, + { 0x1E46, 0x004E, 4 }, + { 0x1E47, 0x006E, 4 }, + { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ + { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ + { 0x1E4E, 0x00D6, 2 }, + { 0x1E4F, 0x00F6, 2 }, + { 0x1E54, 0x0050, 1 }, + { 0x1E55, 0x0070, 1 }, + { 0x1E5A, 0x0052, 4 }, + { 0x1E5B, 0x0072, 4 }, + { 0x1E62, 0x0053, 4 }, + { 0x1E63, 0x0073, 4 }, + { 0x1E6C, 0x0054, 4 }, + { 0x1E6D, 0x0074, 4 }, + { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ + { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ + { 0x1E7C, 0x0056, 2 }, + { 0x1E7D, 0x0076, 2 }, + { 0x1E7E, 0x0056, 4 }, + { 0x1E7F, 0x0076, 4 }, + { 0x1E80, 0x0057, 0 }, + { 0x1E81, 0x0077, 0 }, + { 0x1E82, 0x0057, 1 }, + { 0x1E83, 0x0077, 1 }, + { 0x1E88, 0x0057, 4 }, + { 0x1E89, 0x0077, 4 }, + { 0x1E92, 0x005A, 4 }, + { 0x1E93, 0x007A, 4 }, + { 0x1EA0, 0x0041, 4 }, + { 0x1EA1, 0x0061, 4 }, + { 0x1EA2, 0x0041, 3 }, + { 0x1EA3, 0x0061, 3 }, + { 0x1EA4, 0x00C2, 1 }, + { 0x1EA5, 0x00E2, 1 }, + { 0x1EA6, 0x00C2, 0 }, + { 0x1EA7, 0x00E2, 0 }, + { 0x1EA8, 0x00C2, 3 }, + { 0x1EA9, 0x00E2, 3 }, + { 0x1EAA, 0x00C2, 2 }, + { 0x1EAB, 0x00E2, 2 }, + { 0x1EAC, 0x00C2, 4 }, + { 0x1EAD, 0x00E2, 4 }, + { 0x1EAE, 0x0102, 1 }, + { 0x1EAF, 0x0103, 1 }, + { 0x1EB0, 0x0102, 0 }, + { 0x1EB1, 0x0103, 0 }, + { 0x1EB2, 0x0102, 3 }, + { 0x1EB3, 0x0103, 3 }, + { 0x1EB4, 0x0102, 2 }, + { 0x1EB5, 0x0103, 2 }, + { 0x1EB6, 0x0102, 4 }, + { 0x1EB7, 0x0103, 4 }, + { 0x1EB8, 0x0045, 4 }, + { 0x1EB9, 0x0065, 4 }, + { 0x1EBA, 0x0045, 3 }, + { 0x1EBB, 0x0065, 3 }, + { 0x1EBC, 0x0045, 2 }, + { 0x1EBD, 0x0065, 2 }, + { 0x1EBE, 0x00CA, 1 }, + { 0x1EBF, 0x00EA, 1 }, + { 0x1EC0, 0x00CA, 0 }, + { 0x1EC1, 0x00EA, 0 }, + { 0x1EC2, 0x00CA, 3 }, + { 0x1EC3, 0x00EA, 3 }, + { 0x1EC4, 0x00CA, 2 }, + { 0x1EC5, 0x00EA, 2 }, + { 0x1EC6, 0x00CA, 4 }, + { 0x1EC7, 0x00EA, 4 }, + { 0x1EC8, 0x0049, 3 }, + { 0x1EC9, 0x0069, 3 }, + { 0x1ECA, 0x0049, 4 }, + { 0x1ECB, 0x0069, 4 }, + { 0x1ECC, 0x004F, 4 }, + { 0x1ECD, 0x006F, 4 }, + { 0x1ECE, 0x004F, 3 }, + { 0x1ECF, 0x006F, 3 }, + { 0x1ED0, 0x00D4, 1 }, + { 0x1ED1, 0x00F4, 1 }, + { 0x1ED2, 0x00D4, 0 }, + { 0x1ED3, 0x00F4, 0 }, + { 0x1ED4, 0x00D4, 3 }, + { 0x1ED5, 0x00F4, 3 }, + { 0x1ED6, 0x00D4, 2 }, + { 0x1ED7, 0x00F4, 2 }, + { 0x1ED8, 0x00D4, 4 }, + { 0x1ED9, 0x00F4, 4 }, + { 0x1EDA, 0x01A0, 1 }, + { 0x1EDB, 0x01A1, 1 }, + { 0x1EDC, 0x01A0, 0 }, + { 0x1EDD, 0x01A1, 0 }, + { 0x1EDE, 0x01A0, 3 }, + { 0x1EDF, 0x01A1, 3 }, + { 0x1EE0, 0x01A0, 2 }, + { 0x1EE1, 0x01A1, 2 }, + { 0x1EE2, 0x01A0, 4 }, + { 0x1EE3, 0x01A1, 4 }, + { 0x1EE4, 0x0055, 4 }, + { 0x1EE5, 0x0075, 4 }, + { 0x1EE6, 0x0055, 3 }, + { 0x1EE7, 0x0075, 3 }, + { 0x1EE8, 0x01AF, 1 }, + { 0x1EE9, 0x01B0, 1 }, + { 0x1EEA, 0x01AF, 0 }, + { 0x1EEB, 0x01B0, 0 }, + { 0x1EEC, 0x01AF, 3 }, + { 0x1EED, 0x01B0, 3 }, + { 0x1EEE, 0x01AF, 2 }, + { 0x1EEF, 0x01B0, 2 }, + { 0x1EF0, 0x01AF, 4 }, + { 0x1EF1, 0x01B0, 4 }, + { 0x1EF2, 0x0059, 0 }, + { 0x1EF3, 0x0079, 0 }, + { 0x1EF4, 0x0059, 4 }, + { 0x1EF5, 0x0079, 4 }, + { 0x1EF6, 0x0059, 3 }, + { 0x1EF7, 0x0079, 3 }, + { 0x1EF8, 0x0059, 2 }, + { 0x1EF9, 0x0079, 2 }, + { 0x1FED, 0x00A8, 0 }, + { 0x1FEE, 0x00A8, 1 }, /* U+1FEE => U+0385 => U+00A8 U+0301 */ +}; + +#endif /* _VIETCOMB_H */ diff --git a/Externals/libiconv-1.14/lib/viscii.h b/Externals/libiconv-1.14/lib/viscii.h new file mode 100644 index 0000000000..04e68fa815 --- /dev/null +++ b/Externals/libiconv-1.14/lib/viscii.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 1999-2001 Free Software Foundation, Inc. + * This file is part of the GNU LIBICONV Library. + * + * The GNU LIBICONV Library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * The GNU LIBICONV Library is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the GNU LIBICONV Library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * VISCII1.1-1 + */ + +/* Specification: RFC 1456 */ + +static const unsigned short viscii_2uni_1[32] = { + /* 0x00 */ + 0x0000, 0x0001, 0x1eb2, 0x0003, 0x0004, 0x1eb4, 0x1eaa, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + /* 0x10 */ + 0x0010, 0x0011, 0x0012, 0x0013, 0x1ef6, 0x0015, 0x0016, 0x0017, + 0x0018, 0x1ef8, 0x001a, 0x001b, 0x001c, 0x001d, 0x1ef4, 0x001f, +}; +static const unsigned short viscii_2uni_2[128] = { + /* 0x80 */ + 0x1ea0, 0x1eae, 0x1eb0, 0x1eb6, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eac, + 0x1ebc, 0x1eb8, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ed0, + /* 0x90 */ + 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1ee2, 0x1eda, 0x1edc, 0x1ede, + 0x1eca, 0x1ece, 0x1ecc, 0x1ec8, 0x1ee6, 0x0168, 0x1ee4, 0x1ef2, + /* 0xa0 */ + 0x00d5, 0x1eaf, 0x1eb1, 0x1eb7, 0x1ea5, 0x1ea7, 0x1ea9, 0x1ead, + 0x1ebd, 0x1eb9, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ed1, + /* 0xb0 */ + 0x1ed3, 0x1ed5, 0x1ed7, 0x1ee0, 0x01a0, 0x1ed9, 0x1edd, 0x1edf, + 0x1ecb, 0x1ef0, 0x1ee8, 0x1eea, 0x1eec, 0x01a1, 0x1edb, 0x01af, + /* 0xc0 */ + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x1ea2, 0x0102, 0x1eb3, 0x1eb5, + 0x00c8, 0x00c9, 0x00ca, 0x1eba, 0x00cc, 0x00cd, 0x0128, 0x1ef3, + /* 0xd0 */ + 0x0110, 0x1ee9, 0x00d2, 0x00d3, 0x00d4, 0x1ea1, 0x1ef7, 0x1eeb, + 0x1eed, 0x00d9, 0x00da, 0x1ef9, 0x1ef5, 0x00dd, 0x1ee1, 0x01b0, + /* 0xe0 */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x1ea3, 0x0103, 0x1eef, 0x1eab, + 0x00e8, 0x00e9, 0x00ea, 0x1ebb, 0x00ec, 0x00ed, 0x0129, 0x1ec9, + /* 0xf0 */ + 0x0111, 0x1ef1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x1ecf, 0x1ecd, + 0x1ee5, 0x00f9, 0x00fa, 0x0169, 0x1ee7, 0x00fd, 0x1ee3, 0x1eee, +}; + +static int +viscii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) +{ + unsigned char c = *s; + if (c < 0x20) + *pwc = (ucs4_t) viscii_2uni_1[c]; + else if (c < 0x80) + *pwc = (ucs4_t) c; + else + *pwc = (ucs4_t) viscii_2uni_2[c-0x80]; + return 1; +} + +static const unsigned char viscii_page00[64+184] = { + 0xc0, 0xc1, 0xc2, 0xc3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ + 0xc8, 0xc9, 0xca, 0x00, 0xcc, 0xcd, 0x00, 0x00, /* 0xc8-0xcf */ + 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0xa0, 0x00, 0x00, /* 0xd0-0xd7 */ + 0x00, 0xd9, 0xda, 0x00, 0x00, 0xdd, 0x00, 0x00, /* 0xd8-0xdf */ + 0xe0, 0xe1, 0xe2, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ + 0xe8, 0xe9, 0xea, 0x00, 0xec, 0xed, 0x00, 0x00, /* 0xe8-0xef */ + 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0xf5, 0x00, 0x00, /* 0xf0-0xf7 */ + 0x00, 0xf9, 0xfa, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ + /* 0x0100 */ + 0x00, 0x00, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ + 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ + 0xce, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ + 0x9d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ + 0xb4, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, /* 0xa8-0xaf */ + 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ +}; +static const unsigned char viscii_page1e[96] = { + 0x80, 0xd5, 0xc4, 0xe4, 0x84, 0xa4, 0x85, 0xa5, /* 0xa0-0xa7 */ + 0x86, 0xa6, 0x06, 0xe7, 0x87, 0xa7, 0x81, 0xa1, /* 0xa8-0xaf */ + 0x82, 0xa2, 0x02, 0xc6, 0x05, 0xc7, 0x83, 0xa3, /* 0xb0-0xb7 */ + 0x89, 0xa9, 0xcb, 0xeb, 0x88, 0xa8, 0x8a, 0xaa, /* 0xb8-0xbf */ + 0x8b, 0xab, 0x8c, 0xac, 0x8d, 0xad, 0x8e, 0xae, /* 0xc0-0xc7 */ + 0x9b, 0xef, 0x98, 0xb8, 0x9a, 0xf7, 0x99, 0xf6, /* 0xc8-0xcf */ + 0x8f, 0xaf, 0x90, 0xb0, 0x91, 0xb1, 0x92, 0xb2, /* 0xd0-0xd7 */ + 0x93, 0xb5, 0x95, 0xbe, 0x96, 0xb6, 0x97, 0xb7, /* 0xd8-0xdf */ + 0xb3, 0xde, 0x94, 0xfe, 0x9e, 0xf8, 0x9c, 0xfc, /* 0xe0-0xe7 */ + 0xba, 0xd1, 0xbb, 0xd7, 0xbc, 0xd8, 0xff, 0xe6, /* 0xe8-0xef */ + 0xb9, 0xf1, 0x9f, 0xcf, 0x1e, 0xdc, 0x14, 0xd6, /* 0xf0-0xf7 */ + 0x19, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ +}; + +static int +viscii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) +{ + unsigned char c = 0; + if (wc < 0x0080 && (wc >= 0x0020 || (0x42100064 & (1 << wc)) == 0)) { + *r = wc; + return 1; + } + else if (wc >= 0x00c0 && wc < 0x01b8) + c = viscii_page00[wc-0x00c0]; + else if (wc >= 0x1ea0 && wc < 0x1f00) + c = viscii_page1e[wc-0x1ea0]; + if (c != 0) { + *r = c; + return 1; + } + return RET_ILUNI; +} diff --git a/Externals/libiconv-1.14/libcharset/include/export.h b/Externals/libiconv-1.14/libcharset/include/export.h new file mode 100644 index 0000000000..84e74aa39c --- /dev/null +++ b/Externals/libiconv-1.14/libcharset/include/export.h @@ -0,0 +1,6 @@ + +#if @HAVE_VISIBILITY@ && BUILDING_LIBCHARSET +#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default"))) +#else +#define LIBCHARSET_DLL_EXPORTED +#endif diff --git a/Externals/libiconv-1.14/libcharset/include/localcharset.h b/Externals/libiconv-1.14/libcharset/include/localcharset.h new file mode 100644 index 0000000000..bf2ce21c2b --- /dev/null +++ b/Externals/libiconv-1.14/libcharset/include/localcharset.h @@ -0,0 +1,48 @@ +/* Determine a canonical name for the current locale's character encoding. + Copyright (C) 2000-2003 Free Software Foundation, Inc. + This file is part of the GNU CHARSET Library. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LOCALCHARSET_H +#define _LOCALCHARSET_H + +#if 1 && BUILDING_LIBCHARSET +#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default"))) +#else +#define LIBCHARSET_DLL_EXPORTED +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +extern LIBCHARSET_DLL_EXPORTED const char * locale_charset (void); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _LOCALCHARSET_H */ diff --git a/Externals/libiconv-1.14/libcharset/lib/localcharset.c b/Externals/libiconv-1.14/libcharset/lib/localcharset.c new file mode 100644 index 0000000000..9f27779c07 --- /dev/null +++ b/Externals/libiconv-1.14/libcharset/lib/localcharset.c @@ -0,0 +1,550 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Written by Bruno Haible . */ + + +/* Specification. */ +#include "localcharset.h" + +#include +#include +#include +#include +#include + +#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET +# define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */ +#endif + +#if defined _WIN32 || defined __WIN32__ +# define WIN32_NATIVE +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# ifndef OS2 +# define OS2 +# endif +#endif + +#if !defined WIN32_NATIVE +# include +# if HAVE_LANGINFO_CODESET +# include +# else +# if 0 /* see comment below */ +# include +# endif +# endif +# ifdef __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +# endif +#elif defined WIN32_NATIVE +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +/* Get LIBDIR. */ +#ifndef LIBDIR +#define LIBDIR "" +#endif + +/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */ +#ifndef O_NOFOLLOW +# define O_NOFOLLOW 0 +#endif +#ifndef HAVE_WORKING_O_NOFOLLOW +#define HAVE_WORKING_O_NOFOLLOW 0 +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ + /* Win32, Cygwin, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#if HAVE_DECL_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases (void) +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) + const char *dir; + const char *base = "charset.alias"; + char *file_name; + + /* Make it possible to override the charset.alias location. This is + necessary for running the testsuite before "make install". */ + dir = getenv ("CHARSETALIASDIR"); + if (dir == NULL || dir[0] == '\0') + dir = relocate (LIBDIR); + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL) + /* Out of memory. Treat the file as empty. */ + cp = ""; + else + { + int fd; + + /* Open the file. Reject symbolic links on platforms that support + O_NOFOLLOW. This is a security feature. Without it, an attacker + could retrieve parts of the contents (namely, the tail of the + first line that starts with "* ") of an arbitrary file by placing + a symbolic link to that file under the name "charset.alias" in + some writable directory and defining the environment variable + CHARSETALIASDIR to point to that directory. */ + fd = open (file_name, + O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0)); + if (fd < 0) + /* File not found. Treat it as empty. */ + cp = ""; + else + { + FILE *fp; + + fp = fdopen (fd, "r"); + if (fp == NULL) + { + /* Out of memory. Treat the file as empty. */ + close (fd); + cp = ""; + } + else + { + /* Parse the file's contents. */ + char *res_ptr = NULL; + size_t res_size = 0; + + for (;;) + { + int c; + char buf1[50+1]; + char buf2[50+1]; + size_t l1, l2; + char *old_res_ptr; + + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + old_res_ptr = res_ptr; + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + free (old_res_ptr); + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + } + + free (file_name); + } + +#else + +# if defined DARWIN7 + /* To avoid the trouble of installing a file that is shared by many + GNU packages -- many packaging systems have problems with this --, + simply inline the aliases here. */ + cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" + "ISO8859-2" "\0" "ISO-8859-2" "\0" + "ISO8859-4" "\0" "ISO-8859-4" "\0" + "ISO8859-5" "\0" "ISO-8859-5" "\0" + "ISO8859-7" "\0" "ISO-8859-7" "\0" + "ISO8859-9" "\0" "ISO-8859-9" "\0" + "ISO8859-13" "\0" "ISO-8859-13" "\0" + "ISO8859-15" "\0" "ISO-8859-15" "\0" + "KOI8-R" "\0" "KOI8-R" "\0" + "KOI8-U" "\0" "KOI8-U" "\0" + "CP866" "\0" "CP866" "\0" + "CP949" "\0" "CP949" "\0" + "CP1131" "\0" "CP1131" "\0" + "CP1251" "\0" "CP1251" "\0" + "eucCN" "\0" "GB2312" "\0" + "GB2312" "\0" "GB2312" "\0" + "eucJP" "\0" "EUC-JP" "\0" + "eucKR" "\0" "EUC-KR" "\0" + "Big5" "\0" "BIG5" "\0" + "Big5HKSCS" "\0" "BIG5-HKSCS" "\0" + "GBK" "\0" "GBK" "\0" + "GB18030" "\0" "GB18030" "\0" + "SJIS" "\0" "SHIFT_JIS" "\0" + "ARMSCII-8" "\0" "ARMSCII-8" "\0" + "PT154" "\0" "PT154" "\0" + /*"ISCII-DEV" "\0" "?" "\0"*/ + "*" "\0" "UTF-8" "\0"; +# endif + +# if defined VMS + /* To avoid the troubles of an extra file charset.alias_vms in the + sources of many GNU packages, simply inline the aliases here. */ + /* The list of encodings is taken from the OpenVMS 7.3-1 documentation + "Compaq C Run-Time Library Reference Manual for OpenVMS systems" + section 10.7 "Handling Different Character Sets". */ + cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" + "ISO8859-2" "\0" "ISO-8859-2" "\0" + "ISO8859-5" "\0" "ISO-8859-5" "\0" + "ISO8859-7" "\0" "ISO-8859-7" "\0" + "ISO8859-8" "\0" "ISO-8859-8" "\0" + "ISO8859-9" "\0" "ISO-8859-9" "\0" + /* Japanese */ + "eucJP" "\0" "EUC-JP" "\0" + "SJIS" "\0" "SHIFT_JIS" "\0" + "DECKANJI" "\0" "DEC-KANJI" "\0" + "SDECKANJI" "\0" "EUC-JP" "\0" + /* Chinese */ + "eucTW" "\0" "EUC-TW" "\0" + "DECHANYU" "\0" "DEC-HANYU" "\0" + "DECHANZI" "\0" "GB2312" "\0" + /* Korean */ + "DECKOREAN" "\0" "EUC-KR" "\0"; +# endif + +# if defined WIN32_NATIVE || defined __CYGWIN__ + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP20936" "\0" "GB2312" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0" + "CP38598" "\0" "ISO-8859-8" "\0" + "CP51932" "\0" "EUC-JP" "\0" + "CP51936" "\0" "GB2312" "\0" + "CP51949" "\0" "EUC-KR" "\0" + "CP51950" "\0" "EUC-TW" "\0" + "CP54936" "\0" "GB18030" "\0" + "CP65001" "\0" "UTF-8" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset (void) +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32_NATIVE || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# ifdef __CYGWIN__ + /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always + returns "US-ASCII". Return the suffix of the locale name from the + environment variables (if present) or the codepage as a number. */ + if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) + { + const char *locale; + static char buf[2 + 10 + 1]; + + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return + it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + } + + /* Woe32 has a function returning the locale's codepage as a number: + GetACP(). This encoding is used by Cygwin, unless the user has set + the environment variable CYGWIN=codepage:oem (which very few people + do). + Output directed to console windows needs to be converted (to + GetOEMCP() if the console is using a raster font, or to + GetConsoleOutputCP() if it is using a TrueType font). Cygwin does + this conversion transparently (see winsup/cygwin/fhandler_console.cc), + converting to GetConsoleOutputCP(). This leads to correct results, + except when SetConsoleOutputCP has been called and a raster font is + in use. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + } +# endif + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32_NATIVE + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number: + GetACP(). + When the output goes to a console window, it needs to be provided in + GetOEMCP() encoding if the console is using a raster font, or in + GetConsoleOutputCP() encoding if it is using a TrueType font. + But in GUI programs and for output sent to files and pipes, GetACP() + encoding is the best bet. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/Externals/libiconv-1.14/libcharset/lib/relocatable.c b/Externals/libiconv-1.14/libcharset/lib/relocatable.c new file mode 100644 index 0000000000..a7bbd99dca --- /dev/null +++ b/Externals/libiconv-1.14/libcharset/lib/relocatable.c @@ -0,0 +1,483 @@ +/* Provide relocatable packages. + Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + + +/* Tell glibc's to provide a prototype for getline(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#define _GL_USE_STDLIB_ALLOC 1 +#include + +/* Specification. */ +#include "relocatable.h" + +#if ENABLE_RELOCATABLE + +#include +#include +#include +#include + +#ifdef NO_XMALLOC +# define xmalloc malloc +#else +# include "xalloc.h" +#endif + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#if DEPENDS_ON_LIBCHARSET +# include +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV +# include +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS +# include +#endif + +/* Faked cheap 'bool'. */ +#undef bool +#undef false +#undef true +#define bool int +#define false 0 +#define true 1 + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +# define FILE_SYSTEM_PREFIX_LEN(P) 0 +#endif + +/* Original installation prefix. */ +static char *orig_prefix; +static size_t orig_prefix_len; +/* Current installation prefix. */ +static char *curr_prefix; +static size_t curr_prefix_len; +/* These prefixes do not end in a slash. Anything that will be concatenated + to them must start with a slash. */ + +/* Sets the original and the current installation prefix of this module. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +static void +set_this_relocation_prefix (const char *orig_prefix_arg, + const char *curr_prefix_arg) +{ + if (orig_prefix_arg != NULL && curr_prefix_arg != NULL + /* Optimization: if orig_prefix and curr_prefix are equal, the + relocation is a nop. */ + && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) + { + /* Duplicate the argument strings. */ + char *memory; + + orig_prefix_len = strlen (orig_prefix_arg); + curr_prefix_len = strlen (curr_prefix_arg); + memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (memory != NULL) +#endif + { + memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); + orig_prefix = memory; + memory += orig_prefix_len + 1; + memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); + curr_prefix = memory; + return; + } + } + orig_prefix = NULL; + curr_prefix = NULL; + /* Don't worry about wasted memory here - this function is usually only + called once. */ +} + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +void +set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) +{ + set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); + + /* Now notify all dependent libraries. */ +#if DEPENDS_ON_LIBCHARSET + libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 + libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix + libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +} + +#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. + Returns it, freshly allocated. Returns NULL upon failure. */ +#ifdef IN_LIBRARY +#define compute_curr_prefix local_compute_curr_prefix +static +#endif +char * +compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname) +{ + char *curr_installdir; + const char *rel_installdir; + + if (curr_pathname == NULL) + return NULL; + + /* Determine the relative installation directory, relative to the prefix. + This is simply the difference between orig_installprefix and + orig_installdir. */ + if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) + != 0) + /* Shouldn't happen - nothing should be installed outside $(prefix). */ + return NULL; + rel_installdir = orig_installdir + strlen (orig_installprefix); + + /* Determine the current installation directory. */ + { + const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname); + const char *p = curr_pathname + strlen (curr_pathname); + char *q; + + while (p > p_base) + { + p--; + if (ISSLASH (*p)) + break; + } + + q = (char *) xmalloc (p - curr_pathname + 1); +#ifdef NO_XMALLOC + if (q == NULL) + return NULL; +#endif + memcpy (q, curr_pathname, p - curr_pathname); + q[p - curr_pathname] = '\0'; + curr_installdir = q; + } + + /* Compute the current installation prefix by removing the trailing + rel_installdir from it. */ + { + const char *rp = rel_installdir + strlen (rel_installdir); + const char *cp = curr_installdir + strlen (curr_installdir); + const char *cp_base = + curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir); + + while (rp > rel_installdir && cp > cp_base) + { + bool same = false; + const char *rpi = rp; + const char *cpi = cp; + + while (rpi > rel_installdir && cpi > cp_base) + { + rpi--; + cpi--; + if (ISSLASH (*rpi) || ISSLASH (*cpi)) + { + if (ISSLASH (*rpi) && ISSLASH (*cpi)) + same = true; + break; + } + /* Do case-insensitive comparison if the file system is always or + often case-insensitive. It's better to accept the comparison + if the difference is only in case, rather than to fail. */ +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ + /* Win32, Cygwin, OS/2, DOS - case insignificant file system */ + if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) + != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) + break; +#else + if (*rpi != *cpi) + break; +#endif + } + if (!same) + break; + /* The last pathname component was the same. opi and cpi now point + to the slash before it. */ + rp = rpi; + cp = cpi; + } + + if (rp > rel_installdir) + { + /* Unexpected: The curr_installdir does not end with rel_installdir. */ + free (curr_installdir); + return NULL; + } + + { + size_t curr_prefix_len = cp - curr_installdir; + char *curr_prefix; + + curr_prefix = (char *) xmalloc (curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (curr_prefix == NULL) + { + free (curr_installdir); + return NULL; + } +#endif + memcpy (curr_prefix, curr_installdir, curr_prefix_len); + curr_prefix[curr_prefix_len] = '\0'; + + free (curr_installdir); + + return curr_prefix; + } + } +} + +#endif /* !IN_LIBRARY || PIC */ + +#if defined PIC && defined INSTALLDIR + +/* Full pathname of shared library, or NULL. */ +static char *shared_library_fullname; + +#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +/* Native Win32 only. + On Cygwin, it is better to use the Cygwin provided /proc interface, than + to use native Win32 API and cygwin_conv_to_posix_path, because it supports + longer file names + (see ). */ + +/* Determine the full pathname of the shared library when it is loaded. */ + +BOOL WINAPI +DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) +{ + (void) reserved; + + if (event == DLL_PROCESS_ATTACH) + { + /* The DLL is being loaded into an application's address range. */ + static char location[MAX_PATH]; + + if (!GetModuleFileName (module_handle, location, sizeof (location))) + /* Shouldn't happen. */ + return FALSE; + + if (!IS_PATH_WITH_DIR (location)) + /* Shouldn't happen. */ + return FALSE; + + shared_library_fullname = strdup (location); + } + + return TRUE; +} + +#else /* Unix */ + +static void +find_shared_library_fullname () +{ +#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__ + /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline() + function. + Cygwin >= 1.5 has /proc/self/maps and the getline() function too. */ + FILE *fp; + + /* Open the current process' maps file. It describes one VMA per line. */ + fp = fopen ("/proc/self/maps", "r"); + if (fp) + { + unsigned long address = (unsigned long) &find_shared_library_fullname; + for (;;) + { + unsigned long start, end; + int c; + + if (fscanf (fp, "%lx-%lx", &start, &end) != 2) + break; + if (address >= start && address <= end - 1) + { + /* Found it. Now see if this line contains a filename. */ + while (c = getc (fp), c != EOF && c != '\n' && c != '/') + continue; + if (c == '/') + { + size_t size; + int len; + + ungetc (c, fp); + shared_library_fullname = NULL; size = 0; + len = getline (&shared_library_fullname, &size, fp); + if (len >= 0) + { + /* Success: filled shared_library_fullname. */ + if (len > 0 && shared_library_fullname[len - 1] == '\n') + shared_library_fullname[len - 1] = '\0'; + } + } + break; + } + while (c = getc (fp), c != EOF && c != '\n') + continue; + } + fclose (fp); + } +#endif +} + +#endif /* WIN32 / Unix */ + +/* Return the full pathname of the current shared library. + Return NULL if unknown. + Guaranteed to work only on Linux, Cygwin and Woe32. */ +static char * +get_shared_library_fullname () +{ +#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) + static bool tried_find_shared_library_fullname; + if (!tried_find_shared_library_fullname) + { + find_shared_library_fullname (); + tried_find_shared_library_fullname = true; + } +#endif + return shared_library_fullname; +} + +#endif /* PIC */ + +/* Returns the pathname, relocated according to the current installation + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ +const char * +relocate (const char *pathname) +{ +#if defined PIC && defined INSTALLDIR + static int initialized; + + /* Initialization code for a shared library. */ + if (!initialized) + { + /* At this point, orig_prefix and curr_prefix likely have already been + set through the main program's set_program_name_and_installdir + function. This is sufficient in the case that the library has + initially been installed in the same orig_prefix. But we can do + better, to also cover the cases that 1. it has been installed + in a different prefix before being moved to orig_prefix and (later) + to curr_prefix, 2. unlike the program, it has not moved away from + orig_prefix. */ + const char *orig_installprefix = INSTALLPREFIX; + const char *orig_installdir = INSTALLDIR; + char *curr_prefix_better; + + curr_prefix_better = + compute_curr_prefix (orig_installprefix, orig_installdir, + get_shared_library_fullname ()); + + set_relocation_prefix (orig_installprefix, + curr_prefix_better != NULL + ? curr_prefix_better + : curr_prefix); + + if (curr_prefix_better != NULL) + free (curr_prefix_better); + + initialized = 1; + } +#endif + + /* Note: It is not necessary to perform case insensitive comparison here, + even for DOS-like file systems, because the pathname argument was + typically created from the same Makefile variable as orig_prefix came + from. */ + if (orig_prefix != NULL && curr_prefix != NULL + && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) + { + if (pathname[orig_prefix_len] == '\0') + { + /* pathname equals orig_prefix. */ + char *result = (char *) xmalloc (strlen (curr_prefix) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + strcpy (result, curr_prefix); + return result; + } + } + else if (ISSLASH (pathname[orig_prefix_len])) + { + /* pathname starts with orig_prefix. */ + const char *pathname_tail = &pathname[orig_prefix_len]; + char *result = + (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + memcpy (result, curr_prefix, curr_prefix_len); + strcpy (result + curr_prefix_len, pathname_tail); + return result; + } + } + } + /* Nothing to relocate. */ + return pathname; +} + +#endif diff --git a/Externals/libiconv-1.14/libcharset/lib/relocatable.h b/Externals/libiconv-1.14/libcharset/lib/relocatable.h new file mode 100644 index 0000000000..68fe83ebd4 --- /dev/null +++ b/Externals/libiconv-1.14/libcharset/lib/relocatable.h @@ -0,0 +1,83 @@ +/* Provide relocatable packages. + Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _RELOCATABLE_H +#define _RELOCATABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* This can be enabled through the configure --enable-relocatable option. */ +#if ENABLE_RELOCATABLE + +/* When building a DLL, we must export some functions. Note that because + this is a private .h file, we don't need to use __declspec(dllimport) + in any case. */ +#if HAVE_VISIBILITY && BUILDING_DLL +# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default"))) +#elif defined _MSC_VER && BUILDING_DLL +# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) +#else +# define RELOCATABLE_DLL_EXPORTED +#endif + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +extern RELOCATABLE_DLL_EXPORTED void + set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + +/* Returns the pathname, relocated according to the current installation + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ +extern const char * relocate (const char *pathname); + +/* Memory management: relocate() potentially allocates memory, because it has + to construct a fresh pathname. If this is a problem because your program + calls relocate() frequently, think about caching the result. Or free the + return value if it was different from the argument pathname. */ + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. + Returns it, freshly allocated. Returns NULL upon failure. */ +extern char * compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname); + +#else + +/* By default, we use the hardwired pathnames. */ +#define relocate(pathname) (pathname) + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _RELOCATABLE_H */ diff --git a/Externals/libiconv-1.14/src/Makefile b/Externals/libiconv-1.14/src/Makefile new file mode 100644 index 0000000000..8877b22b4f --- /dev/null +++ b/Externals/libiconv-1.14/src/Makefile @@ -0,0 +1,148 @@ +# Makefile for libiconv/src + +#### Start of system configuration section. #### + +# Directories used by "make": +srcdir = . +top_srcdir = .. + +# Directories used by "make install": +prefix = /usr/local +local_prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +libdir = ${exec_prefix}/lib +datarootdir = ${prefix}/share +datadir = ${datarootdir} +localedir = ${datarootdir}/locale + +# Programs used by "make": +CC = gcc +CFLAGS = -g -O2 +CPPFLAGS = +LDFLAGS = +INCLUDES = -I. -I$(srcdir) -I.. -I../include -I$(srcdir)/../include -I../srclib -I$(srcdir)/../srclib +LIBTOOL = /bin/bash $(top_builddir)/libtool +LIBTOOL_COMPILE = $(LIBTOOL) --mode=compile +LIBTOOL_LINK = $(LIBTOOL) --mode=link +LIBTOOL_INSTALL = $(LIBTOOL) --mode=install +LIBTOOL_UNINSTALL = $(LIBTOOL) --mode=uninstall +WINDRES = +RM = rm -f + + +# Programs used by "make install": +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +mkinstalldirs = $(SHELL) ../build-aux/mkinstalldirs + +# Programs used by "make install-strip": +STRIP = /usr/bin/strip +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +install_sh = ${SHELL} /home/sonicadvance1/dolphin-emu/Externals/libiconv-1.14/build-aux/install-sh + +#### End of system configuration section. #### + +SHELL = /bin/sh + +PACKAGE_VERSION = 1.14 + +# Needed by $(LIBTOOL). +top_builddir = .. + +# Needed by SET_RELOCATABLE. +EXEEXT = + +# Needed by RELOCATABLE_LDFLAGS. +host = x86_64-unknown-linux-gnu + +OBJECTS_RES_yes = iconv.res +OBJECTS_RES_no = + +# We cannot link with libintl until libiconv is installed. (When we call +# libtool with arguments "../lib/libiconv.la -lintl", libtool will call ld +# with "../lib/.libs/libiconv.so $libdir/libintl.so $libdir/libiconv.so", +# (remember that $libdir/libintl.la lists $libdir/libiconv.so as a dependency), +# and this gives a fatal linker error on Solaris because the two libiconv.so +# files are different but have the same soname. +# So we can link the iconv executable only after we have installed libiconv, +# i.e. during "make install". The intermediate 'iconv' executable is built +# without internationalization and not linked with libintl. + +all : iconv_no_i18n$(EXEEXT) iconv.o $(OBJECTS_RES_no) + test `ls -ld . | sed -e 's/^d\(.........\).*/\1/'` = rwxrwxrwx || chmod 777 . + +# This is the temporary iconv executable, without internationalization. +iconv_no_i18n$(EXEEXT) : iconv_no_i18n.o ../lib/libiconv.la $(OBJECTS_RES_no) + $(LIBTOOL_LINK) $(CC) $(LDFLAGS) $(CFLAGS) iconv_no_i18n.o ../srclib/libicrt.a ../lib/libiconv.la $(OBJECTS_RES_no) -o $@ + +iconv_no_i18n.o : $(srcdir)/iconv_no_i18n.c $(srcdir)/iconv.c + $(CC) -c $(INCLUDES) -I../lib $(CFLAGS) $(CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" -DLOCALEDIR=\"$(localedir)\" $(srcdir)/iconv_no_i18n.c + +iconv.o : $(srcdir)/iconv.c + $(CC) -c $(INCLUDES) -I../lib $(CFLAGS) $(CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" -DLOCALEDIR=\"$(localedir)\" $(srcdir)/iconv.c + +iconv.res : $(srcdir)/../windows/iconv.rc + $(WINDRES) `$(SHELL) $(srcdir)/../windows/windres-options --escape $(PACKAGE_VERSION)` -i $(srcdir)/../windows/iconv.rc -o iconv.res --output-format=coff + +# The following rule is necessary to avoid a toplevel "make -n check" failure. +../lib/libiconv.la : + cd ../lib && $(MAKE) libiconv.la + +# Support for relocatability. +RELOCATABLE_LIBRARY_PATH = $(libdir) +RELOCATABLE_SRC_DIR = $(top_srcdir)/srclib +RELOCATABLE_BUILD_DIR = ../srclib +RELOCATABLE_CONFIG_H_DIR = .. +RELOCATABLE_LDFLAGS = +RELOCATABLE_STRIP = : +INSTALL_PROGRAM_ENV = +iconv_LDFLAGS = `if test -n '$(RELOCATABLE_LDFLAGS)'; then $(RELOCATABLE_LDFLAGS) $(bindir); fi` + +# During "make install", we can build the final iconv executable. +# On HP-UX, in order to ensure that the new libiconv.sl will override the old +# one that is hardcoded in libintl.sl, we need to mention libiconv.sl before +# libintl.sl on the link command line. We have to bypass libtool in order to +# achieve this. +# On Solaris, the linker gives an error if we are using libintl.so and it +# refers to a libiconv.so in $prefix/lib since then it sees two libiconv.so's, +# one in $prefix/lib and one in ../lib/.libs. So we have to avoid using +# ../lib/libiconv.la entirely. +install : all force + if [ ! -d $(DESTDIR)$(bindir) ] ; then $(mkinstalldirs) $(DESTDIR)$(bindir) ; fi + case "linux-gnu" in \ + hpux*) $(CC) $(LDFLAGS) $(CFLAGS) $(iconv_LDFLAGS) iconv.o ../srclib/libicrt.a -L$(DESTDIR)$(libdir) -liconv $(OBJECTS_RES_no) `if test -n '$(DESTDIR)'; then echo " -Wl,+b -Wl,$(libdir)"; fi` -o iconv$(EXEEXT);; \ + *) $(LIBTOOL_LINK) $(CC) $(LDFLAGS) $(CFLAGS) $(iconv_LDFLAGS) iconv.o ../srclib/libicrt.a $(DESTDIR)$(libdir)/libiconv.la $(OBJECTS_RES_no) -o iconv$(EXEEXT);; \ + esac + $(INSTALL_PROGRAM_ENV) $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) iconv$(EXEEXT) $(DESTDIR)$(bindir)/iconv$(EXEEXT) + +install-strip : force + case '$(INSTALL_PROGRAM)' in \ + */install-reloc) \ + $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)' RELOCATABLE_STRIP='$(STRIP)' ;; \ + *) \ + $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)' INSTALL_PROGRAM='$(INSTALL_STRIP_PROGRAM)' ;; \ + esac + +installdirs : force + if [ ! -d $(DESTDIR)$(bindir) ] ; then $(mkinstalldirs) $(DESTDIR)$(bindir) ; fi + +uninstall : force + $(LIBTOOL_UNINSTALL) $(RM) $(DESTDIR)$(bindir)/iconv$(EXEEXT) + +check : all + +mostlyclean : clean + +clean : force + $(RM) *.o *.lo iconv.res iconv_no_i18n iconv_no_i18n$(EXEEXT) iconv$(EXEEXT) core *.stackdump + $(RM) -r .libs _libs + +distclean : clean + $(RM) Makefile + +maintainer-clean : distclean + +force : + diff --git a/Externals/libiconv-1.14/src/Makefile.in b/Externals/libiconv-1.14/src/Makefile.in new file mode 100644 index 0000000000..bea1e2cba3 --- /dev/null +++ b/Externals/libiconv-1.14/src/Makefile.in @@ -0,0 +1,148 @@ +# Makefile for libiconv/src + +#### Start of system configuration section. #### + +# Directories used by "make": +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ + +# Directories used by "make install": +prefix = @prefix@ +local_prefix = /usr/local +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = @localedir@ + +# Programs used by "make": +CC = @CC@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +INCLUDES = -I. -I$(srcdir) -I.. -I../include -I$(srcdir)/../include -I../srclib -I$(srcdir)/../srclib +LIBTOOL = @LIBTOOL@ +LIBTOOL_COMPILE = $(LIBTOOL) --mode=compile +LIBTOOL_LINK = $(LIBTOOL) --mode=link +LIBTOOL_INSTALL = $(LIBTOOL) --mode=install +LIBTOOL_UNINSTALL = $(LIBTOOL) --mode=uninstall +WINDRES = @WINDRES@ +RM = rm -f +@SET_MAKE@ + +# Programs used by "make install": +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +mkinstalldirs = $(SHELL) @top_srcdir@/build-aux/mkinstalldirs + +# Programs used by "make install-strip": +STRIP = @STRIP@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +install_sh = @install_sh@ + +#### End of system configuration section. #### + +SHELL = /bin/sh + +PACKAGE_VERSION = @VERSION@ + +# Needed by $(LIBTOOL). +top_builddir = .. + +# Needed by SET_RELOCATABLE. +EXEEXT = @EXEEXT@ + +# Needed by RELOCATABLE_LDFLAGS. +host = @host@ + +OBJECTS_RES_yes = iconv.res +OBJECTS_RES_no = + +# We cannot link with libintl until libiconv is installed. (When we call +# libtool with arguments "../lib/libiconv.la -lintl", libtool will call ld +# with "../lib/.libs/libiconv.so $libdir/libintl.so $libdir/libiconv.so", +# (remember that $libdir/libintl.la lists $libdir/libiconv.so as a dependency), +# and this gives a fatal linker error on Solaris because the two libiconv.so +# files are different but have the same soname. +# So we can link the iconv executable only after we have installed libiconv, +# i.e. during "make install". The intermediate 'iconv' executable is built +# without internationalization and not linked with libintl. + +all : iconv_no_i18n$(EXEEXT) iconv.@OBJEXT@ $(OBJECTS_RES_@WOE32@) + test `ls -ld . | sed -e 's/^d\(.........\).*/\1/'` = rwxrwxrwx || chmod 777 . + +# This is the temporary iconv executable, without internationalization. +iconv_no_i18n$(EXEEXT) : iconv_no_i18n.@OBJEXT@ ../lib/libiconv.la $(OBJECTS_RES_@WOE32@) + $(LIBTOOL_LINK) $(CC) $(LDFLAGS) $(CFLAGS) iconv_no_i18n.@OBJEXT@ ../srclib/libicrt.a ../lib/libiconv.la $(OBJECTS_RES_@WOE32@) -o $@ + +iconv_no_i18n.@OBJEXT@ : $(srcdir)/iconv_no_i18n.c $(srcdir)/iconv.c + $(CC) -c $(INCLUDES) -I../lib $(CFLAGS) $(CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" -DLOCALEDIR=\"$(localedir)\" $(srcdir)/iconv_no_i18n.c + +iconv.@OBJEXT@ : $(srcdir)/iconv.c + $(CC) -c $(INCLUDES) -I../lib $(CFLAGS) $(CPPFLAGS) -DINSTALLDIR=\"$(bindir)\" -DLOCALEDIR=\"$(localedir)\" $(srcdir)/iconv.c + +iconv.res : $(srcdir)/../windows/iconv.rc + $(WINDRES) `$(SHELL) $(srcdir)/../windows/windres-options --escape $(PACKAGE_VERSION)` -i $(srcdir)/../windows/iconv.rc -o iconv.res --output-format=coff + +# The following rule is necessary to avoid a toplevel "make -n check" failure. +../lib/libiconv.la : + cd ../lib && $(MAKE) libiconv.la + +# Support for relocatability. +RELOCATABLE_LIBRARY_PATH = $(libdir) +RELOCATABLE_SRC_DIR = $(top_srcdir)/srclib +RELOCATABLE_BUILD_DIR = ../srclib +RELOCATABLE_CONFIG_H_DIR = .. +RELOCATABLE_LDFLAGS = @RELOCATABLE_LDFLAGS@ +RELOCATABLE_STRIP = : +INSTALL_PROGRAM_ENV = @INSTALL_PROGRAM_ENV@ +iconv_LDFLAGS = `if test -n '$(RELOCATABLE_LDFLAGS)'; then $(RELOCATABLE_LDFLAGS) $(bindir); fi` + +# During "make install", we can build the final iconv executable. +# On HP-UX, in order to ensure that the new libiconv.sl will override the old +# one that is hardcoded in libintl.sl, we need to mention libiconv.sl before +# libintl.sl on the link command line. We have to bypass libtool in order to +# achieve this. +# On Solaris, the linker gives an error if we are using libintl.so and it +# refers to a libiconv.so in $prefix/lib since then it sees two libiconv.so's, +# one in $prefix/lib and one in ../lib/.libs. So we have to avoid using +# ../lib/libiconv.la entirely. +install : all force + if [ ! -d $(DESTDIR)$(bindir) ] ; then $(mkinstalldirs) $(DESTDIR)$(bindir) ; fi + case "@host_os@" in \ + hpux*) $(CC) $(LDFLAGS) $(CFLAGS) $(iconv_LDFLAGS) iconv.@OBJEXT@ ../srclib/libicrt.a -L$(DESTDIR)$(libdir) -liconv @LIBINTL@ $(OBJECTS_RES_@WOE32@) `if test -n '$(DESTDIR)'; then echo " -Wl,+b -Wl,$(libdir)"; fi` -o iconv$(EXEEXT);; \ + *) $(LIBTOOL_LINK) $(CC) $(LDFLAGS) $(CFLAGS) $(iconv_LDFLAGS) iconv.@OBJEXT@ ../srclib/libicrt.a $(DESTDIR)$(libdir)/libiconv.la @LTLIBINTL@ $(OBJECTS_RES_@WOE32@) -o iconv$(EXEEXT);; \ + esac + $(INSTALL_PROGRAM_ENV) $(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) iconv$(EXEEXT) $(DESTDIR)$(bindir)/iconv$(EXEEXT) + +install-strip : force + case '$(INSTALL_PROGRAM)' in \ + */install-reloc) \ + $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)' RELOCATABLE_STRIP='$(STRIP)' ;; \ + *) \ + $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)' INSTALL_PROGRAM='$(INSTALL_STRIP_PROGRAM)' ;; \ + esac + +installdirs : force + if [ ! -d $(DESTDIR)$(bindir) ] ; then $(mkinstalldirs) $(DESTDIR)$(bindir) ; fi + +uninstall : force + $(LIBTOOL_UNINSTALL) $(RM) $(DESTDIR)$(bindir)/iconv$(EXEEXT) + +check : all + +mostlyclean : clean + +clean : force + $(RM) *.@OBJEXT@ *.lo iconv.res iconv_no_i18n iconv_no_i18n$(EXEEXT) iconv$(EXEEXT) core *.stackdump + $(RM) -r .libs _libs + +distclean : clean + $(RM) Makefile + +maintainer-clean : distclean + +force : + diff --git a/Externals/libiconv-1.14/src/iconv.c b/Externals/libiconv-1.14/src/iconv.c new file mode 100644 index 0000000000..825ef2229e --- /dev/null +++ b/Externals/libiconv-1.14/src/iconv.c @@ -0,0 +1,1118 @@ +/* Copyright (C) 2000-2009, 2011 Free Software Foundation, Inc. + This file is part of the GNU LIBICONV Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "config.h" +#ifndef ICONV_CONST +# define ICONV_CONST +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Ensure that iconv_no_i18n does not depend on libintl. */ +#ifdef NO_I18N +# undef ENABLE_NLS +# undef ENABLE_RELOCATABLE +#endif + +#include "binary-io.h" +#include "progname.h" +#include "relocatable.h" +#include "safe-read.h" +#include "xalloc.h" +#include "uniwidth.h" +#include "uniwidth/cjk.h" + +/* Ensure that iconv_no_i18n does not depend on libintl. */ +#ifdef NO_I18N +#include +static void +error (int status, int errnum, const char *message, ...) +{ + va_list args; + + fflush(stdout); + fprintf(stderr,"%s: ",program_name); + va_start(args,message); + vfprintf(stderr,message,args); + va_end(args); + if (errnum) { + const char *s = strerror(errnum); + if (s == NULL) + s = "Unknown system error"; + } + putc('\n',stderr); + fflush(stderr); + if (status) + exit(status); +} +#else +# include "error.h" +#endif + +#include "gettext.h" + +#define _(str) gettext(str) + +/* Ensure that iconv_no_i18n does not depend on libintl. */ +#ifdef NO_I18N +# define xmalloc malloc +# define xalloc_die abort +#endif + +/* Locale independent test for a decimal digit. + Argument can be 'char' or 'unsigned char'. (Whereas the argument of + isdigit must be an 'unsigned char'.) */ +#undef isdigit +#define isdigit(c) ((unsigned int) ((c) - '0') < 10) + +/* Locale independent test for a printable character. + Argument can be 'char' or 'unsigned char'. (Whereas the argument of + isdigit must be an 'unsigned char'.) */ +#define c_isprint(c) ((c) >= ' ' && (c) <= '~') + +/* ========================================================================= */ + +static int discard_unconvertible = 0; +static int silent = 0; + +static void usage (int exitcode) +{ + if (exitcode != 0) { + const char* helpstring1 = + /* TRANSLATORS: The first line of the short usage message. */ + _("Usage: iconv [-c] [-s] [-f fromcode] [-t tocode] [file ...]"); + const char* helpstring2 = + /* TRANSLATORS: The second line of the short usage message. + Align it correctly against the first line. */ + _("or: iconv -l"); + fprintf(stderr, "%s\n%s\n", helpstring1, helpstring2); + fprintf(stderr, _("Try `%s --help' for more information.\n"), program_name); + } else { + /* xgettext: no-wrap */ + /* TRANSLATORS: The first line of the long usage message. + The %s placeholder expands to the program name. */ + printf(_("\ +Usage: %s [OPTION...] [-f ENCODING] [-t ENCODING] [INPUTFILE...]\n"), + program_name); + /* xgettext: no-wrap */ + /* TRANSLATORS: The second line of the long usage message. + Align it correctly against the first line. + The %s placeholder expands to the program name. */ + printf(_("\ +or: %s -l\n"), + program_name); + printf("\n"); + /* xgettext: no-wrap */ + /* TRANSLATORS: Description of the iconv program. */ + printf(_("\ +Converts text from one encoding to another encoding.\n")); + printf("\n"); + /* xgettext: no-wrap */ + printf(_("\ +Options controlling the input and output format:\n")); + /* xgettext: no-wrap */ + printf(_("\ + -f ENCODING, --from-code=ENCODING\n\ + the encoding of the input\n")); + /* xgettext: no-wrap */ + printf(_("\ + -t ENCODING, --to-code=ENCODING\n\ + the encoding of the output\n")); + printf("\n"); + /* xgettext: no-wrap */ + printf(_("\ +Options controlling conversion problems:\n")); + /* xgettext: no-wrap */ + printf(_("\ + -c discard unconvertible characters\n")); + /* xgettext: no-wrap */ + printf(_("\ + --unicode-subst=FORMATSTRING\n\ + substitution for unconvertible Unicode characters\n")); + /* xgettext: no-wrap */ + printf(_("\ + --byte-subst=FORMATSTRING substitution for unconvertible bytes\n")); + /* xgettext: no-wrap */ + printf(_("\ + --widechar-subst=FORMATSTRING\n\ + substitution for unconvertible wide characters\n")); + printf("\n"); + /* xgettext: no-wrap */ + printf(_("\ +Options controlling error output:\n")); + /* xgettext: no-wrap */ + printf(_("\ + -s, --silent suppress error messages about conversion problems\n")); + printf("\n"); + /* xgettext: no-wrap */ + printf(_("\ +Informative output:\n")); + /* xgettext: no-wrap */ + printf(_("\ + -l, --list list the supported encodings\n")); + /* xgettext: no-wrap */ + printf(_("\ + --help display this help and exit\n")); + /* xgettext: no-wrap */ + printf(_("\ + --version output version information and exit\n")); + printf("\n"); + /* TRANSLATORS: The placeholder indicates the bug-reporting address + for this package. Please add _another line_ saying + "Report translation bugs to <...>\n" with the address for translation + bugs (typically your translation team's web or email address). */ + fputs(_("Report bugs to .\n"),stdout); + } + exit(exitcode); +} + +static void print_version (void) +{ + printf("iconv (GNU libiconv %d.%d)\n", + _libiconv_version >> 8, _libiconv_version & 0xff); + printf("Copyright (C) %s Free Software Foundation, Inc.\n", "2000-2011"); + /* xgettext: no-wrap */ + fputs (_("\ +License GPLv3+: GNU GPL version 3 or later \n\ +This is free software: you are free to change and redistribute it.\n\ +There is NO WARRANTY, to the extent permitted by law.\n\ +"),stdout); + /* TRANSLATORS: The %s placeholder expands to an author's name. */ + printf(_("Written by %s.\n"),"Bruno Haible"); + exit(EXIT_SUCCESS); +} + +static int print_one (unsigned int namescount, const char * const * names, + void* data) +{ + unsigned int i; + (void)data; + for (i = 0; i < namescount; i++) { + if (i > 0) + putc(' ',stdout); + fputs(names[i],stdout); + } + putc('\n',stdout); + return 0; +} + +/* ========================================================================= */ + +/* Line number and column position. */ +static unsigned int line; +static unsigned int column; +static const char* cjkcode; +/* Update the line number and column position after a character was + successfully converted. */ +static void update_line_column (unsigned int uc, void* data) +{ + if (uc == 0x000A) { + line++; + column = 0; + } else { + int width = uc_width(uc, cjkcode); + if (width >= 0) + column += width; + else if (uc == 0x0009) + column += 8 - (column % 8); + } +} + +/* ========================================================================= */ + +/* Production of placeholder strings as fallback for unconvertible + characters. */ + +/* Check that the argument is a format string taking either no argument + or exactly one unsigned integer argument. Returns the maximum output + size of the format string. */ +static size_t check_subst_formatstring (const char *format, const char *param_name) +{ + /* C format strings are described in POSIX (IEEE P1003.1 2001), section + XSH 3 fprintf(). See also Linux fprintf(3) manual page. + For simplicity, we don't accept + - the '%m$' reordering syntax, + - the 'I' flag, + - width specifications referring to an argument, + - precision specifications referring to an argument, + - size specifiers, + - format specifiers other than 'o', 'u', 'x', 'X'. + What remains? + A directive + - starts with '%', + - is optionally followed by any of the characters '#', '0', '-', ' ', + '+', "'", each of which acts as a flag, + - is optionally followed by a width specification: a nonempty digit + sequence, + - is optionally followed by '.' and a precision specification: a + nonempty digit sequence, + - is finished by a specifier + - '%', that needs no argument, + - 'o', 'u', 'x', 'X', that need an unsigned integer argument. + */ + size_t maxsize = 0; + unsigned int unnumbered_arg_count = 0; + + for (; *format != '\0';) { + if (*format++ == '%') { + /* A directive. */ + unsigned int width = 0; + unsigned int precision = 0; + unsigned int length; + /* Parse flags. */ + for (;;) { + if (*format == ' ' || *format == '+' || *format == '-' + || *format == '#' || *format == '0' || *format == '\'') + format++; + else + break; + } + /* Parse width. */ + if (*format == '*') + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. */ + _("%s argument: A format directive with a variable width is not allowed here."), + param_name); + if (isdigit (*format)) { + do { + width = 10*width + (*format - '0'); + format++; + } while (isdigit (*format)); + } + /* Parse precision. */ + if (*format == '.') { + format++; + if (*format == '*') + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. */ + _("%s argument: A format directive with a variable precision is not allowed here."), + param_name); + if (isdigit (*format)) { + do { + precision = 10*precision + (*format - '0'); + format++; + } while (isdigit (*format)); + } + } + /* Parse size. */ + switch (*format) { + case 'h': case 'l': case 'L': case 'q': + case 'j': case 'z': case 'Z': case 't': + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. */ + _("%s argument: A format directive with a size is not allowed here."), + param_name); + } + /* Parse end of directive. */ + switch (*format) { + case '%': + length = 1; + break; + case 'u': case 'o': case 'x': case 'X': + if (*format == 'u') { + length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + if (length < precision) + length = precision; + length *= 2; /* estimate for FLAG_GROUP */ + length += 1; /* account for leading sign */ + } else if (*format == 'o') { + length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + if (length < precision) + length = precision; + length += 1; /* account for leading sign */ + } else { /* 'x', 'X' */ + length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + if (length < precision) + length = precision; + length += 2; /* account for leading sign or alternate form */ + } + unnumbered_arg_count++; + break; + default: + if (*format == '\0') + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. */ + _("%s argument: The string ends in the middle of a directive."), + param_name); + else if (c_isprint(*format)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. + The %c placeholder expands to an unknown format directive. */ + _("%s argument: The character '%c' is not a valid conversion specifier."), + param_name,*format); + else + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. */ + _("%s argument: The character that terminates the format directive is not a valid conversion specifier."), + param_name); + abort(); /*NOTREACHED*/ + } + format++; + if (length < width) + length = width; + maxsize += length; + } else + maxsize++; + } + if (unnumbered_arg_count > 1) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a command-line option. + The %u placeholder expands to the number of arguments consumed by the format string. */ + ngettext("%s argument: The format string consumes more than one argument: %u argument.", + "%s argument: The format string consumes more than one argument: %u arguments.", + unnumbered_arg_count), + param_name,unnumbered_arg_count); + return maxsize; +} + +/* Format strings. */ +static const char* ilseq_byte_subst; +static const char* ilseq_wchar_subst; +static const char* ilseq_unicode_subst; + +/* Maximum result size for each format string. */ +static size_t ilseq_byte_subst_size; +static size_t ilseq_wchar_subst_size; +static size_t ilseq_unicode_subst_size; + +/* Buffer of size ilseq_byte_subst_size+1. */ +static char* ilseq_byte_subst_buffer; +#if HAVE_WCHAR_T +/* Buffer of size ilseq_wchar_subst_size+1. */ +static char* ilseq_wchar_subst_buffer; +#endif +/* Buffer of size ilseq_unicode_subst_size+1. */ +static char* ilseq_unicode_subst_buffer; + +/* Auxiliary variables for subst_mb_to_uc_fallback. */ +/* Converter from locale encoding to UCS-4. */ +static iconv_t subst_mb_to_uc_cd; +/* Buffer of size ilseq_byte_subst_size. */ +static unsigned int* subst_mb_to_uc_temp_buffer; + +static void subst_mb_to_uc_fallback + (const char* inbuf, size_t inbufsize, + void (*write_replacement) (const unsigned int *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data) +{ + for (; inbufsize > 0; inbuf++, inbufsize--) { + const char* inptr; + size_t inbytesleft; + char* outptr; + size_t outbytesleft; + sprintf(ilseq_byte_subst_buffer, + ilseq_byte_subst, (unsigned int)(unsigned char)*inbuf); + inptr = ilseq_byte_subst_buffer; + inbytesleft = strlen(ilseq_byte_subst_buffer); + outptr = (char*)subst_mb_to_uc_temp_buffer; + outbytesleft = ilseq_byte_subst_size*sizeof(unsigned int); + iconv(subst_mb_to_uc_cd,NULL,NULL,NULL,NULL); + if (iconv(subst_mb_to_uc_cd, (ICONV_CONST char**)&inptr,&inbytesleft, &outptr,&outbytesleft) + == (size_t)(-1) + || iconv(subst_mb_to_uc_cd, NULL,NULL, &outptr,&outbytesleft) + == (size_t)(-1)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a piece of text, specified through --byte-subst. */ + _("cannot convert byte substitution to Unicode: %s"), + ilseq_byte_subst_buffer); + if (!(outbytesleft%sizeof(unsigned int) == 0)) + abort(); + write_replacement(subst_mb_to_uc_temp_buffer, + ilseq_byte_subst_size-(outbytesleft/sizeof(unsigned int)), + callback_arg); + } +} + +/* Auxiliary variables for subst_uc_to_mb_fallback. */ +/* Converter from locale encoding to target encoding. */ +static iconv_t subst_uc_to_mb_cd; +/* Buffer of size ilseq_unicode_subst_size*4. */ +static char* subst_uc_to_mb_temp_buffer; + +static void subst_uc_to_mb_fallback + (unsigned int code, + void (*write_replacement) (const char *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data) +{ + const char* inptr; + size_t inbytesleft; + char* outptr; + size_t outbytesleft; + sprintf(ilseq_unicode_subst_buffer, ilseq_unicode_subst, code); + inptr = ilseq_unicode_subst_buffer; + inbytesleft = strlen(ilseq_unicode_subst_buffer); + outptr = subst_uc_to_mb_temp_buffer; + outbytesleft = ilseq_unicode_subst_size*4; + iconv(subst_uc_to_mb_cd,NULL,NULL,NULL,NULL); + if (iconv(subst_uc_to_mb_cd, (ICONV_CONST char**)&inptr,&inbytesleft, &outptr,&outbytesleft) + == (size_t)(-1) + || iconv(subst_uc_to_mb_cd, NULL,NULL, &outptr,&outbytesleft) + == (size_t)(-1)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a piece of text, specified through --unicode-subst. */ + _("cannot convert unicode substitution to target encoding: %s"), + ilseq_unicode_subst_buffer); + write_replacement(subst_uc_to_mb_temp_buffer, + ilseq_unicode_subst_size*4-outbytesleft, + callback_arg); +} + +#if HAVE_WCHAR_T + +/* Auxiliary variables for subst_mb_to_wc_fallback. */ +/* Converter from locale encoding to wchar_t. */ +static iconv_t subst_mb_to_wc_cd; +/* Buffer of size ilseq_byte_subst_size. */ +static wchar_t* subst_mb_to_wc_temp_buffer; + +static void subst_mb_to_wc_fallback + (const char* inbuf, size_t inbufsize, + void (*write_replacement) (const wchar_t *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data) +{ + for (; inbufsize > 0; inbuf++, inbufsize--) { + const char* inptr; + size_t inbytesleft; + char* outptr; + size_t outbytesleft; + sprintf(ilseq_byte_subst_buffer, + ilseq_byte_subst, (unsigned int)(unsigned char)*inbuf); + inptr = ilseq_byte_subst_buffer; + inbytesleft = strlen(ilseq_byte_subst_buffer); + outptr = (char*)subst_mb_to_wc_temp_buffer; + outbytesleft = ilseq_byte_subst_size*sizeof(wchar_t); + iconv(subst_mb_to_wc_cd,NULL,NULL,NULL,NULL); + if (iconv(subst_mb_to_wc_cd, (ICONV_CONST char**)&inptr,&inbytesleft, &outptr,&outbytesleft) + == (size_t)(-1) + || iconv(subst_mb_to_wc_cd, NULL,NULL, &outptr,&outbytesleft) + == (size_t)(-1)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a piece of text, specified through --byte-subst. */ + _("cannot convert byte substitution to wide string: %s"), + ilseq_byte_subst_buffer); + if (!(outbytesleft%sizeof(wchar_t) == 0)) + abort(); + write_replacement(subst_mb_to_wc_temp_buffer, + ilseq_byte_subst_size-(outbytesleft/sizeof(wchar_t)), + callback_arg); + } +} + +/* Auxiliary variables for subst_wc_to_mb_fallback. */ +/* Converter from locale encoding to target encoding. */ +static iconv_t subst_wc_to_mb_cd; +/* Buffer of size ilseq_wchar_subst_size*4. + Hardcode factor 4, because MB_LEN_MAX is not reliable on some platforms. */ +static char* subst_wc_to_mb_temp_buffer; + +static void subst_wc_to_mb_fallback + (wchar_t code, + void (*write_replacement) (const char *buf, size_t buflen, + void* callback_arg), + void* callback_arg, + void* data) +{ + const char* inptr; + size_t inbytesleft; + char* outptr; + size_t outbytesleft; + sprintf(ilseq_wchar_subst_buffer, ilseq_wchar_subst, (unsigned int) code); + inptr = ilseq_wchar_subst_buffer; + inbytesleft = strlen(ilseq_wchar_subst_buffer); + outptr = subst_wc_to_mb_temp_buffer; + outbytesleft = ilseq_wchar_subst_size*4; + iconv(subst_wc_to_mb_cd,NULL,NULL,NULL,NULL); + if (iconv(subst_wc_to_mb_cd, (ICONV_CONST char**)&inptr,&inbytesleft, &outptr,&outbytesleft) + == (size_t)(-1) + || iconv(subst_wc_to_mb_cd, NULL,NULL, &outptr,&outbytesleft) + == (size_t)(-1)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a piece of text, specified through --widechar-subst. */ + _("cannot convert widechar substitution to target encoding: %s"), + ilseq_wchar_subst_buffer); + write_replacement(subst_wc_to_mb_temp_buffer, + ilseq_wchar_subst_size*4-outbytesleft, + callback_arg); +} + +#else + +#define subst_mb_to_wc_fallback NULL +#define subst_wc_to_mb_fallback NULL + +#endif + +/* Auxiliary variables for subst_mb_to_mb_fallback. */ +/* Converter from locale encoding to target encoding. */ +static iconv_t subst_mb_to_mb_cd; +/* Buffer of size ilseq_byte_subst_size*4. */ +static char* subst_mb_to_mb_temp_buffer; + +static void subst_mb_to_mb_fallback (const char* inbuf, size_t inbufsize) +{ + for (; inbufsize > 0; inbuf++, inbufsize--) { + const char* inptr; + size_t inbytesleft; + char* outptr; + size_t outbytesleft; + sprintf(ilseq_byte_subst_buffer, + ilseq_byte_subst, (unsigned int)(unsigned char)*inbuf); + inptr = ilseq_byte_subst_buffer; + inbytesleft = strlen(ilseq_byte_subst_buffer); + outptr = subst_mb_to_mb_temp_buffer; + outbytesleft = ilseq_byte_subst_size*4; + iconv(subst_mb_to_mb_cd,NULL,NULL,NULL,NULL); + if (iconv(subst_mb_to_mb_cd, (ICONV_CONST char**)&inptr,&inbytesleft, &outptr,&outbytesleft) + == (size_t)(-1) + || iconv(subst_mb_to_mb_cd, NULL,NULL, &outptr,&outbytesleft) + == (size_t)(-1)) + error(EXIT_FAILURE,0, + /* TRANSLATORS: An error message. + The %s placeholder expands to a piece of text, specified through --byte-subst. */ + _("cannot convert byte substitution to target encoding: %s"), + ilseq_byte_subst_buffer); + fwrite(subst_mb_to_mb_temp_buffer,1,ilseq_byte_subst_size*4-outbytesleft, + stdout); + } +} + +/* ========================================================================= */ + +/* Error messages during conversion. */ + +static void conversion_error_EILSEQ (const char* infilename) +{ + fflush(stdout); + if (column > 0) + putc('\n',stderr); + error(0,0, + /* TRANSLATORS: An error message. + The placeholders expand to the input file name, a line number, and a column number. */ + _("%s:%u:%u: cannot convert"), + infilename,line,column); +} + +static void conversion_error_EINVAL (const char* infilename) +{ + fflush(stdout); + if (column > 0) + putc('\n',stderr); + error(0,0, + /* TRANSLATORS: An error message. + The placeholders expand to the input file name, a line number, and a column number. + A "shift sequence" is a sequence of bytes that changes the state of the converter; + this concept exists only for "stateful" encodings like ISO-2022-JP. */ + _("%s:%u:%u: incomplete character or shift sequence"), + infilename,line,column); +} + +static void conversion_error_other (int errnum, const char* infilename) +{ + fflush(stdout); + if (column > 0) + putc('\n',stderr); + error(0,errnum, + /* TRANSLATORS: The first part of an error message. + It is followed by a colon and a detail message. + The placeholders expand to the input file name, a line number, and a column number. */ + _("%s:%u:%u"), + infilename,line,column); +} + +/* Convert the input given in infile. */ + +static int convert (iconv_t cd, int infile, const char* infilename) +{ + char inbuf[4096+4096]; + size_t inbufrest = 0; + int infile_error = 0; + char initial_outbuf[4096]; + char *outbuf = initial_outbuf; + size_t outbufsize = sizeof(initial_outbuf); + int status = 0; + +#if O_BINARY + SET_BINARY(infile); +#endif + line = 1; column = 0; + iconv(cd,NULL,NULL,NULL,NULL); + for (;;) { + size_t inbufsize; + /* Transfer the accumulated output to its destination, in case the + safe_read() call will block. */ + fflush(stdout); + inbufsize = safe_read(infile,inbuf+4096,4096); + if (inbufsize == 0 || inbufsize == SAFE_READ_ERROR) { + infile_error = (inbufsize == SAFE_READ_ERROR ? errno : 0); + if (inbufrest == 0) + break; + else { + if (ilseq_byte_subst != NULL) + subst_mb_to_mb_fallback(inbuf+4096-inbufrest, inbufrest); + if (!silent) + conversion_error_EINVAL(infilename); + status = 1; + goto done; + } + } else { + const char* inptr = inbuf+4096-inbufrest; + size_t insize = inbufrest+inbufsize; + inbufrest = 0; + while (insize > 0) { + char* outptr = outbuf; + size_t outsize = outbufsize; + size_t res = iconv(cd,(ICONV_CONST char**)&inptr,&insize,&outptr,&outsize); + if (outptr != outbuf) { + int saved_errno = errno; + if (fwrite(outbuf,1,outptr-outbuf,stdout) < outptr-outbuf) { + status = 1; + goto done; + } + errno = saved_errno; + } + if (res == (size_t)(-1)) { + if (errno == EILSEQ) { + if (discard_unconvertible == 1) { + int one = 1; + iconvctl(cd,ICONV_SET_DISCARD_ILSEQ,&one); + discard_unconvertible = 2; + status = 1; + } else { + if (!silent) + conversion_error_EILSEQ(infilename); + status = 1; + goto done; + } + } else if (errno == EINVAL) { + if (inbufsize == 0 || insize > 4096) { + if (!silent) + conversion_error_EINVAL(infilename); + status = 1; + goto done; + } else { + inbufrest = insize; + if (insize > 0) { + /* Like memcpy(inbuf+4096-insize,inptr,insize), except that + we cannot use memcpy here, because source and destination + regions may overlap. */ + char* restptr = inbuf+4096-insize; + do { *restptr++ = *inptr++; } while (--insize > 0); + } + break; + } + } else if (errno == E2BIG) { + if (outptr==outbuf) { + /* outbuf is too small. Double its size. */ + if (outbuf != initial_outbuf) + free(outbuf); + outbufsize = 2*outbufsize; + if (outbufsize==0) /* integer overflow? */ + xalloc_die(); + outbuf = (char*)xmalloc(outbufsize); + } + } else { + if (!silent) + conversion_error_other(errno,infilename); + status = 1; + goto done; + } + } + } + } + } + for (;;) { + char* outptr = outbuf; + size_t outsize = outbufsize; + size_t res = iconv(cd,NULL,NULL,&outptr,&outsize); + if (outptr != outbuf) { + int saved_errno = errno; + if (fwrite(outbuf,1,outptr-outbuf,stdout) < outptr-outbuf) { + status = 1; + goto done; + } + errno = saved_errno; + } + if (res == (size_t)(-1)) { + if (errno == EILSEQ) { + if (discard_unconvertible == 1) { + int one = 1; + iconvctl(cd,ICONV_SET_DISCARD_ILSEQ,&one); + discard_unconvertible = 2; + status = 1; + } else { + if (!silent) + conversion_error_EILSEQ(infilename); + status = 1; + goto done; + } + } else if (errno == EINVAL) { + if (!silent) + conversion_error_EINVAL(infilename); + status = 1; + goto done; + } else if (errno == E2BIG) { + if (outptr==outbuf) { + /* outbuf is too small. Double its size. */ + if (outbuf != initial_outbuf) + free(outbuf); + outbufsize = 2*outbufsize; + if (outbufsize==0) /* integer overflow? */ + xalloc_die(); + outbuf = (char*)xmalloc(outbufsize); + } + } else { + if (!silent) + conversion_error_other(errno,infilename); + status = 1; + goto done; + } + } else + break; + } + if (infile_error) { + fflush(stdout); + if (column > 0) + putc('\n',stderr); + error(0,infile_error, + /* TRANSLATORS: An error message. + The placeholder expands to the input file name. */ + _("%s: I/O error"), + infilename); + status = 1; + goto done; + } + done: + if (outbuf != initial_outbuf) + free(outbuf); + return status; +} + +/* ========================================================================= */ + +int main (int argc, char* argv[]) +{ + const char* fromcode = NULL; + const char* tocode = NULL; + int do_list = 0; + iconv_t cd; + struct iconv_fallbacks fallbacks; + struct iconv_hooks hooks; + int i; + int status; + + set_program_name (argv[0]); +#if HAVE_SETLOCALE + /* Needed for the locale dependent encodings, "char" and "wchar_t", + and for gettext. */ + setlocale(LC_CTYPE,""); +#if ENABLE_NLS + /* Needed for gettext. */ + setlocale(LC_MESSAGES,""); +#endif +#endif +#if ENABLE_NLS + bindtextdomain("libiconv",relocate(LOCALEDIR)); +#endif + textdomain("libiconv"); + for (i = 1; i < argc;) { + size_t len = strlen(argv[i]); + if (!strcmp(argv[i],"--")) { + i++; + break; + } + if (!strcmp(argv[i],"-f") + /* --f ... --from-code */ + || (len >= 3 && len <= 11 && !strncmp(argv[i],"--from-code",len)) + /* --from-code=... */ + || (len >= 12 && !strncmp(argv[i],"--from-code=",12))) { + if (len < 12) + if (i == argc-1) usage(1); + if (fromcode != NULL) usage(1); + if (len < 12) { + fromcode = argv[i+1]; + i += 2; + } else { + fromcode = argv[i]+12; + i++; + } + continue; + } + if (!strcmp(argv[i],"-t") + /* --t ... --to-code */ + || (len >= 3 && len <= 9 && !strncmp(argv[i],"--to-code",len)) + /* --from-code=... */ + || (len >= 10 && !strncmp(argv[i],"--to-code=",10))) { + if (len < 10) + if (i == argc-1) usage(1); + if (tocode != NULL) usage(1); + if (len < 10) { + tocode = argv[i+1]; + i += 2; + } else { + tocode = argv[i]+10; + i++; + } + continue; + } + if (!strcmp(argv[i],"-l") + /* --l ... --list */ + || (len >= 3 && len <= 6 && !strncmp(argv[i],"--list",len))) { + do_list = 1; + i++; + continue; + } + if (/* --by ... --byte-subst */ + (len >= 4 && len <= 12 && !strncmp(argv[i],"--byte-subst",len)) + /* --byte-subst=... */ + || (len >= 13 && !strncmp(argv[i],"--byte-subst=",13))) { + if (len < 13) { + if (i == argc-1) usage(1); + ilseq_byte_subst = argv[i+1]; + i += 2; + } else { + ilseq_byte_subst = argv[i]+13; + i++; + } + ilseq_byte_subst_size = + check_subst_formatstring(ilseq_byte_subst, "--byte-subst"); + continue; + } + if (/* --w ... --widechar-subst */ + (len >= 3 && len <= 16 && !strncmp(argv[i],"--widechar-subst",len)) + /* --widechar-subst=... */ + || (len >= 17 && !strncmp(argv[i],"--widechar-subst=",17))) { + if (len < 17) { + if (i == argc-1) usage(1); + ilseq_wchar_subst = argv[i+1]; + i += 2; + } else { + ilseq_wchar_subst = argv[i]+17; + i++; + } + ilseq_wchar_subst_size = + check_subst_formatstring(ilseq_wchar_subst, "--widechar-subst"); + continue; + } + if (/* --u ... --unicode-subst */ + (len >= 3 && len <= 15 && !strncmp(argv[i],"--unicode-subst",len)) + /* --unicode-subst=... */ + || (len >= 16 && !strncmp(argv[i],"--unicode-subst=",16))) { + if (len < 16) { + if (i == argc-1) usage(1); + ilseq_unicode_subst = argv[i+1]; + i += 2; + } else { + ilseq_unicode_subst = argv[i]+16; + i++; + } + ilseq_unicode_subst_size = + check_subst_formatstring(ilseq_unicode_subst, "--unicode-subst"); + continue; + } + if /* --s ... --silent */ + (len >= 3 && len <= 8 && !strncmp(argv[i],"--silent",len)) { + silent = 1; + continue; + } + if /* --h ... --help */ + (len >= 3 && len <= 6 && !strncmp(argv[i],"--help",len)) { + usage(0); + } + if /* --v ... --version */ + (len >= 3 && len <= 9 && !strncmp(argv[i],"--version",len)) { + print_version(); + } +#if O_BINARY + /* Backward compatibility with iconv <= 1.9.1. */ + if /* --bi ... --binary */ + (len >= 4 && len <= 8 && !strncmp(argv[i],"--binary",len)) { + i++; + continue; + } +#endif + if (argv[i][0] == '-') { + const char *option = argv[i] + 1; + if (*option == '\0') + usage(1); + for (; *option; option++) + switch (*option) { + case 'c': discard_unconvertible = 1; break; + case 's': silent = 1; break; + default: usage(1); + } + i++; + continue; + } + break; + } + if (do_list) { + if (i != 2 || i != argc) + usage(1); + iconvlist(print_one,NULL); + status = 0; + } else { +#if O_BINARY + SET_BINARY(fileno(stdout)); +#endif + if (fromcode == NULL) + fromcode = "char"; + if (tocode == NULL) + tocode = "char"; + cd = iconv_open(tocode,fromcode); + if (cd == (iconv_t)(-1)) { + if (iconv_open("UCS-4",fromcode) == (iconv_t)(-1)) + error(0,0, + /* TRANSLATORS: An error message. + The placeholder expands to the encoding name, specified through --from-code. */ + _("conversion from %s unsupported"), + fromcode); + else if (iconv_open(tocode,"UCS-4") == (iconv_t)(-1)) + error(0,0, + /* TRANSLATORS: An error message. + The placeholder expands to the encoding name, specified through --to-code. */ + _("conversion to %s unsupported"), + tocode); + else + error(0,0, + /* TRANSLATORS: An error message. + The placeholders expand to the encoding names, specified through --from-code and --to-code, respectively. */ + _("conversion from %s to %s unsupported"), + fromcode,tocode); + error(EXIT_FAILURE,0, + /* TRANSLATORS: Additional advice after an error message. + The %s placeholder expands to the program name. */ + _("try '%s -l' to get the list of supported encodings"), + program_name); + } + /* Look at fromcode and tocode, to determine whether character widths + should be determined according to legacy CJK conventions. */ + cjkcode = iconv_canonicalize(tocode); + if (!is_cjk_encoding(cjkcode)) + cjkcode = iconv_canonicalize(fromcode); + /* Set up fallback routines for handling impossible conversions. */ + if (ilseq_byte_subst != NULL) + ilseq_byte_subst_buffer = (char*)xmalloc((ilseq_byte_subst_size+1)*sizeof(char)); + if (!discard_unconvertible) { + #if HAVE_WCHAR_T + if (ilseq_wchar_subst != NULL) + ilseq_wchar_subst_buffer = (char*)xmalloc((ilseq_wchar_subst_size+1)*sizeof(char)); + #endif + if (ilseq_unicode_subst != NULL) + ilseq_unicode_subst_buffer = (char*)xmalloc((ilseq_unicode_subst_size+1)*sizeof(char)); + if (ilseq_byte_subst != NULL) { + subst_mb_to_uc_cd = iconv_open("UCS-4-INTERNAL","char"); + subst_mb_to_uc_temp_buffer = (unsigned int*)xmalloc(ilseq_byte_subst_size*sizeof(unsigned int)); + #if HAVE_WCHAR_T + subst_mb_to_wc_cd = iconv_open("wchar_t","char"); + subst_mb_to_wc_temp_buffer = (wchar_t*)xmalloc(ilseq_byte_subst_size*sizeof(wchar_t)); + #endif + subst_mb_to_mb_cd = iconv_open(tocode,"char"); + subst_mb_to_mb_temp_buffer = (char*)xmalloc(ilseq_byte_subst_size*4); + } + #if HAVE_WCHAR_T + if (ilseq_wchar_subst != NULL) { + subst_wc_to_mb_cd = iconv_open(tocode,"char"); + subst_wc_to_mb_temp_buffer = (char*)xmalloc(ilseq_wchar_subst_size*4); + } + #endif + if (ilseq_unicode_subst != NULL) { + subst_uc_to_mb_cd = iconv_open(tocode,"char"); + subst_uc_to_mb_temp_buffer = (char*)xmalloc(ilseq_unicode_subst_size*4); + } + fallbacks.mb_to_uc_fallback = + (ilseq_byte_subst != NULL ? subst_mb_to_uc_fallback : NULL); + fallbacks.uc_to_mb_fallback = + (ilseq_unicode_subst != NULL ? subst_uc_to_mb_fallback : NULL); + fallbacks.mb_to_wc_fallback = + (ilseq_byte_subst != NULL ? subst_mb_to_wc_fallback : NULL); + fallbacks.wc_to_mb_fallback = + (ilseq_wchar_subst != NULL ? subst_wc_to_mb_fallback : NULL); + fallbacks.data = NULL; + iconvctl(cd, ICONV_SET_FALLBACKS, &fallbacks); + } + /* Set up hooks for updating the line and column position. */ + hooks.uc_hook = update_line_column; + hooks.wc_hook = NULL; + hooks.data = NULL; + iconvctl(cd, ICONV_SET_HOOKS, &hooks); + if (i == argc) + status = convert(cd,fileno(stdin), + /* TRANSLATORS: A filename substitute denoting standard input. */ + _("(stdin)")); + else { + status = 0; + for (; i < argc; i++) { + const char* infilename = argv[i]; + FILE* infile = fopen(infilename,"r"); + if (infile == NULL) { + int saved_errno = errno; + error(0,saved_errno, + /* TRANSLATORS: The first part of an error message. + It is followed by a colon and a detail message. + The %s placeholder expands to the input file name. */ + _("%s"), + infilename); + status = 1; + } else { + status |= convert(cd,fileno(infile),infilename); + fclose(infile); + } + } + } + iconv_close(cd); + } + if (ferror(stdout) || fclose(stdout)) { + error(0,0, + /* TRANSLATORS: An error message. */ + _("I/O error")); + status = 1; + } + exit(status); +} diff --git a/Externals/libiconv-1.14/src/iconv_no_i18n.c b/Externals/libiconv-1.14/src/iconv_no_i18n.c new file mode 100644 index 0000000000..88e943bfbd --- /dev/null +++ b/Externals/libiconv-1.14/src/iconv_no_i18n.c @@ -0,0 +1,2 @@ +#define NO_I18N +#include "iconv.c" diff --git a/Externals/libjpeg/jconfig.h b/Externals/libjpeg/jconfig.h deleted file mode 100644 index 679404da4e..0000000000 --- a/Externals/libjpeg/jconfig.h +++ /dev/null @@ -1,45 +0,0 @@ -/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ -/* see jconfig.txt for explanations */ - -#define HAVE_PROTOTYPES -#define HAVE_UNSIGNED_CHAR -#define HAVE_UNSIGNED_SHORT -/* #define void char */ -/* #define const */ -#undef CHAR_IS_UNSIGNED -#define HAVE_STDDEF_H -#define HAVE_STDLIB_H -#undef NEED_BSD_STRINGS -#undef NEED_SYS_TYPES_H -#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ -#undef NEED_SHORT_EXTERNAL_NAMES -#undef INCOMPLETE_TYPES_BROKEN - -/* Define "boolean" as unsigned char, not int, per Windows custom */ -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ - - -#ifdef JPEG_INTERNALS - -#undef RIGHT_SHIFT_IS_UNSIGNED - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -#undef RLE_SUPPORTED /* Utah RLE image file format */ -#define TARGA_SUPPORTED /* Targa image file format */ - -#define TWO_FILE_COMMANDLINE /* optional */ -#define USE_SETMODE /* Microsoft has setmode() */ -#undef NEED_SIGNAL_CATCHER -#undef DONT_USE_B_MODE -#undef PROGRESS_REPORT /* optional */ - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/Externals/libjpeg/jmorecfg.h b/Externals/libjpeg/jmorecfg.h deleted file mode 100644 index 928d052c83..0000000000 --- a/Externals/libjpeg/jmorecfg.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 1997-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ -#ifndef _BASETSD_H /* MinGW is slightly different */ -#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ -typedef long INT32; -#endif -#endif -#endif -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifndef FAR -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/Externals/libjpeg/jpeglib.h b/Externals/libjpeg/jpeglib.h deleted file mode 100644 index 1eb1fac033..0000000000 --- a/Externals/libjpeg/jpeglib.h +++ /dev/null @@ -1,1160 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2010 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -extern "C" { -#endif -#endif - -/* Version IDs for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". - */ - -#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ -#define JPEG_LIB_VERSION_MAJOR 8 -#define JPEG_LIB_VERSION_MINOR 3 - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples, - * reflecting any scaling we choose to apply during the DCT step. - * Values from 1 to 16 are supported. - * Note that different components may receive different DCT scalings. - */ - int DCT_h_scaled_size; - int DCT_v_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface); - * DCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) - * and similarly for height. - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - JDIMENSION jpeg_width; /* scaled JPEG image width */ - JDIMENSION jpeg_height; /* scaled JPEG image height */ - /* Dimensions of actual JPEG image that will be written to file, - * derived from input dimensions by scaling factors above. - * These fields are computed by jpeg_start_compress(). - * You can also use jpeg_calc_jpeg_dimensions() to determine these values - * in advance of calling jpeg_start_compress(). - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - int q_scale_factor[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined, - * and corresponding scale factors (percentage, initialized 100). - */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* These fields are derived from Se of first SOS marker. - */ - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array for entropy decode */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_mem_dest jMemDest -#define jpeg_mem_src jMemSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_default_qtables jDefQTables -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_calc_jpeg_dimensions jCjpegDimensions -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_core_output_dimensions jCoreDimensions -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Data source and destination managers: memory buffers. */ -EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, - unsigned char ** outbuffer, - unsigned long * outsize)); -EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, - unsigned char * inbuffer, - unsigned long insize)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Precalculate JPEG dimensions for current compression parameters. */ -EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.txt concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -} -#endif -#endif - -#endif /* JPEGLIB_H */ diff --git a/Externals/libjpeg/libjpeg.lib b/Externals/libjpeg/libjpeg.lib deleted file mode 100644 index a75d080166..0000000000 Binary files a/Externals/libjpeg/libjpeg.lib and /dev/null differ diff --git a/Externals/libjpeg/libjpeg64.lib b/Externals/libjpeg/libjpeg64.lib deleted file mode 100644 index 9211ddea4a..0000000000 Binary files a/Externals/libjpeg/libjpeg64.lib and /dev/null differ diff --git a/Externals/libpng/png/png.vcxproj b/Externals/libpng/png/png.vcxproj index e272b07452..9065fabf93 100644 --- a/Externals/libpng/png/png.vcxproj +++ b/Externals/libpng/png/png.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -26,12 +18,36 @@ x64 + + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + - + + @@ -40,7 +56,9 @@ + + @@ -55,153 +73,11 @@ - - {01573C36-AC6E-49F6-94BA-572517EB9740} - Win32Proj - png - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Disabled - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - - - - - Disabled - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - - - - - MaxSpeed - true - true - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - - - - MaxSpeed - true - true - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - - - - MaxSpeed - true - true - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - - - - MaxSpeed - true - true - ..\..\zlib;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - - + + + {ff213b23-2c26-4214-9f88-85271e557e87} + + diff --git a/Externals/libpng/png/png.vcxproj.filters b/Externals/libpng/png/png.vcxproj.filters deleted file mode 100644 index 5bccb29842..0000000000 --- a/Externals/libpng/png/png.vcxproj.filters +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Externals/libusbx/AUTHORS b/Externals/libusbx/AUTHORS new file mode 100644 index 0000000000..6c29e218fe --- /dev/null +++ b/Externals/libusbx/AUTHORS @@ -0,0 +1,60 @@ +Copyright © 2001 Johannes Erdfelt +Copyright © 2007-2009 Daniel Drake +Copyright © 2010-2012 Peter Stuge +Copyright © 2008-2011 Nathan Hjelm +Copyright © 2009-2012 Pete Batard +Copyright © 2009-2012 Ludovic Rousseau +Copyright © 2010-2012 Michael Plante +Copyright © 2011-2012 Hans de Goede +Copyright © 2012 Martin Pieuchot +Copyright © 2012-2013 Toby Gray + +Other contributors: +Alan Ott +Alan Stern +Alex Vatchenko +Anthony Clay +Artem Egorkine +Aurelien Jarno +Bastien Nocera +Benjamin Dobell +Chris Dickens +Colin Walters +Dave Camarillo +David Engraf +David Moore +Davidlohr Bueso +Federico Manzan +Felipe Balbi +Francesco Montorsi +Graeme Gill +Hans Ulrich Niedermann +Hector Martin +Hoi-Ho Chan +Ilya Konstantinov +James Hanko +Konrad Rzepecki +Lars Wirzenius +Luca Longinotti +Martin Koegler +Matthias Bolte +Mike Frysinger +Mikhail Gusarov +Nicholas Corgan +Orin Eman +Pekka Nikander +Rob Walker +Sean McBride +Sebastian Pipping +Simon Haggett +Thomas Röfer +Tim Roberts +Toby Peterson +Trygve Laugstøl +Uri Lublin +Vasily Khoruzhick +Vegard Storheil Eriksen +Vitali Lovich +Xiaofan Chen +Zoltán Kovács +Роман Донченко diff --git a/Externals/libusbx/COPYING b/Externals/libusbx/COPYING new file mode 100644 index 0000000000..5ab7695ab8 --- /dev/null +++ b/Externals/libusbx/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/Externals/libusbx/ChangeLog b/Externals/libusbx/ChangeLog new file mode 100644 index 0000000000..a3304a62d9 --- /dev/null +++ b/Externals/libusbx/ChangeLog @@ -0,0 +1,174 @@ +For detailed information about the changes below, please see the git log or +visit: http://log.libusbx.org + +2013-07-11: v1.0.16 +* Add hotplug support for Darwin and Linux (#9) +* Add superspeed endpoint companion descriptor support (#15) +* Add BOS descriptor support (#15) +* Make descriptor parsing code more robust +* New libusb_get_port_numbers API, this is libusb_get_port_path without + the unnecessary context parameter, libusb_get_port_path is now deprecated +* New libusb_strerror API (#14) +* New libusb_set_auto_detach_kernel_driver API (#17) +* Improve topology API docs (#95) +* Logging now use a single write call per log-message, avoiding log-message + "interlacing" when using multiple threads. +* Android: use Android logging when building on Android (#101) +* Darwin: make libusb_reset reenumerate device on descriptors change (#89) +* Darwin: add support for the LIBUSB_TRANSFER_ADD_ZERO_PACKET flag (#91) +* Darwin: add a device cache (#112, #114) +* Examples: Add sam3u_benchmark isochronous example by Harald Welte (#109) +* Many other bug fixes and improvements +The (#xx) numbers are libusbx issue numbers, see ie: +https://github.com/libusbx/libusbx/issues/9 + +2013-04-15: v1.0.15 +* Improve transfer cancellation and avoid short read failures on broken descriptors +* Filter out 8-bit characters in libusb_get_string_descriptor_ascii() +* Add WinCE support +* Add library stress tests +* Add Cypress FX3 firmware upload support for fxload sample +* Add HID and kernel driver detach support capabilities detection +* Add SuperSpeed detection on OS X +* Fix bInterval value interpretation on OS X +* Fix issues with autoclaim, composite HID devices, interface autoclaim and + early abort in libusb_close() on Windows. Also add VS2012 solution files. +* Improve fd event handling on Linux +* Other bug fixes and improvements + +2012-09-26: v1.0.14 +* Reverts the previous API change with regards to bMaxPower. + If this doesn't matter to you, you are encouraged to keep using v1.0.13, + as it will use the same attribute as v2.0, to be released soon. +* Note that LIBUSBX_API_VERSION is *decreased* to 0x010000FF and the previous + guidelines with regards to concurrent use of MaxPower/bMaxPower still apply. + +2012-09-20: v1.0.13 +* [MAJOR] Fix a typo in the API with struct libusb_config_descriptor where + MaxPower was used instead of bMaxPower, as defined in the specs. If your + application was accessing the MaxPower attribute, and you need to maintain + compatibility with libusb or older versions, see APPENDIX A below. +* Fix broken support for the 0.1 -> 1.0 libusb-compat layer +* Fix unwanted cancellation of pending timeouts as well as major timeout related bugs +* Fix handling of HID and composite devices on Windows +* Introduce LIBUSBX_API_VERSION macro +* Add Cypress FX/FX2 firmware upload sample, based on fxload from + http://linux-hotplug.sourceforge.net +* Add libusb0 (libusb-win32) and libusbK driver support on Windows. Note that while + the drivers allow it, isochronous transfers are not supported yet in libusbx. Also + not supported yet is the use of libusb-win32 filter drivers on composite interfaces +* Add support for the new get_capabilities ioctl on Linux and avoid unnecessary + splitting of bulk transfers +* Improve support for newer Intel and Renesas USB 3.0 controllers on Windows +* Harmonize the device number for root hubs across platforms +* Other bug fixes and improvements + +2012-06-15: v1.0.12 +* Fix a potential major regression with pthread on Linux +* Fix missing thread ID from debug log output on cygwin +* Fix possible crash when using longjmp and MinGW's gcc 4.6 +* Add topology calls: libusb_get_port_number(), libusb_get_parent() & libusb_get_port_path() +* Add toggleable debug, using libusb_set_debug() or the LIBUSB_DEBUG environment variable +* Define log levels in libusb.h and set timestamp origin to first libusb_init() call +* All logging is now sent to to stderr (info was sent to stdout previously) +* Update log messages severity and avoid polluting log output on OS-X +* Add HID driver support on Windows +* Enable interchangeability of MSVC and MinGW DLLs +* Additional bug fixes and improvements + +2012-05-08: v1.0.11 +* Revert removal of critical Windows event handling that was introduced in 1.0.10 +* Fix a possible deadlock in Windows when submitting transfers +* Add timestamped logging +* Add NetBSD support (experimental) and BSD libusb_get_device_speed() data +* Add bootstrap.sh alongside autogen.sh (bootstrap.sh doesn't invoke configure) +* Search for device nodes in /dev for Android support +* Other bug fixes + +2012-04-17: v1.0.10 +* Public release +* Add libusb_get_version +* Add Visual Studio 2010 project files +* Some Windows code cleanup +* Fix xusb sample warnings + +2012-04-02: v1.0.9 +* First libusbx release +* Add libusb_get_device_speed (all, except BSD) and libusb_error_name +* Add Windows support (WinUSB driver only) +* Add OpenBSD support +* Add xusb sample +* Tons of bug fixes + +2010-05-07: v1.0.8 +* Bug fixes + +2010-04-19: v1.0.7 +* Bug fixes and documentation tweaks +* Add more interface class definitions + +2009-11-22: v1.0.6 +* Bug fixes +* Increase libusb_handle_events() timeout to 60s for powersaving + +2009-11-15: v1.0.5 + * Use timerfd when available for timer management + * Small fixes/updates + +2009-11-06: v1.0.4 release + * Bug fixes including transfer locking to fix some potential threading races + * More flexibility with clock types on Linux + * Use new bulk continuation tracking in Linux 2.6.32 for improved handling + of short/failed transfers + +2009-08-27: v1.0.3 release + * Bug fixes + * Add libusb_get_max_iso_packet_size() + +2009-06-13: v1.0.2 release + * Bug fixes + +2009-05-12: v1.0.1 release + * Bug fixes + * Darwin backend + +2008-12-13: v1.0.0 release + * Bug fixes + +2008-11-21: v0.9.4 release + * Bug fixes + * Add libusb_attach_kernel_driver() + +2008-08-23: v0.9.3 release + * Bug fixes + +2008-07-19: v0.9.2 release + * Bug fixes + +2008-06-28: v0.9.1 release + * Bug fixes + * Introduce contexts to the API + * Compatibility with new Linux kernel features + +2008-05-25: v0.9.0 release + * First libusb-1.0 beta release + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +APPENDIX A - How to maintain code compatibility with versions of libusb and +libusbx that use MaxPower: + +If you must to maintain compatibility with versions of the library that aren't +using the bMaxPower attribute in struct libusb_config_descriptor, the +recommended way is to use the new LIBUSBX_API_VERSION macro with an #ifdef. +For instance, if your code was written as follows: + + if (dev->config[0].MaxPower < 250) + +Then you should modify it to have: + +#if defined(LIBUSBX_API_VERSION) && (LIBUSBX_API_VERSION >= 0x01000100) + if (dev->config[0].bMaxPower < 250) +#else + if (dev->config[0].MaxPower < 250) +#endif diff --git a/Externals/libusbx/INSTALL b/Externals/libusbx/INSTALL new file mode 100644 index 0000000000..5458714e1e --- /dev/null +++ b/Externals/libusbx/INSTALL @@ -0,0 +1,234 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Externals/libusbx/Makefile.am b/Externals/libusbx/Makefile.am new file mode 100644 index 0000000000..93ce9414fd --- /dev/null +++ b/Externals/libusbx/Makefile.am @@ -0,0 +1,27 @@ +AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip +ACLOCAL_AMFLAGS = -I m4 +DISTCLEANFILES = libusb-1.0.pc +EXTRA_DIST = TODO PORTING msvc libusb/libusb-1.0.def libusb/version_nano.h \ + examples/getopt/getopt.c examples/getopt/getopt1.c examples/getopt/getopt.h +SUBDIRS = libusb doc + +if BUILD_EXAMPLES +SUBDIRS += examples +endif + +if BUILD_TESTS +SUBDIRS += tests +endif + +pkgconfigdir=$(libdir)/pkgconfig +pkgconfig_DATA=libusb-1.0.pc + +.PHONY: dist-up + +reldir = .release/$(distdir) +dist-up: dist + rm -rf $(reldir) + mkdir -p $(reldir) + cp $(distdir).tar.bz2 $(reldir) + rsync -rv $(reldir) frs.sourceforge.net:/home/frs/project/l/li/libusb/libusb-1.0/ + rm -rf $(reldir) diff --git a/Externals/libusbx/Makefile.in b/Externals/libusbx/Makefile.in new file mode 100644 index 0000000000..05bfacf0f1 --- /dev/null +++ b/Externals/libusbx/Makefile.in @@ -0,0 +1,875 @@ +# Makefile.in generated by automake 1.13.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_EXAMPLES_TRUE@am__append_1 = examples +@BUILD_TESTS_TRUE@am__append_2 = tests +subdir = . +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/config.h.in $(srcdir)/libusb-1.0.pc.in COPYING \ + THANKS TODO compile config.guess config.sub depcomp install-sh \ + missing ltmain.sh +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/libusb/version.h $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = libusb-1.0.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgconfigdir)" +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = libusb doc examples tests +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.bz2 +DIST_TARGETS = dist-bzip2 +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLDFLAGS = @LTLDFLAGS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OS_DARWIN = @OS_DARWIN@ +OS_LINUX = @OS_LINUX@ +OS_OPENBSD = @OS_OPENBSD@ +OS_WINDOWS = @OS_WINDOWS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_UDEV = @USE_UDEV@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip +ACLOCAL_AMFLAGS = -I m4 +DISTCLEANFILES = libusb-1.0.pc +EXTRA_DIST = TODO PORTING msvc libusb/libusb-1.0.def libusb/version_nano.h \ + examples/getopt/getopt.c examples/getopt/getopt1.c examples/getopt/getopt.h + +SUBDIRS = libusb doc $(am__append_1) $(am__append_2) +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libusb-1.0.pc +reldir = .release/$(distdir) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +libusb-1.0.pc: $(top_builddir)/config.status $(srcdir)/libusb-1.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-pkgconfigDATA + + +.PHONY: dist-up +dist-up: dist + rm -rf $(reldir) + mkdir -p $(reldir) + cp $(distdir).tar.bz2 $(reldir) + rsync -rv $(reldir) frs.sourceforge.net:/home/frs/project/l/li/libusb/libusb-1.0/ + rm -rf $(reldir) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Externals/libusbx/NEWS b/Externals/libusbx/NEWS new file mode 100644 index 0000000000..1620253883 --- /dev/null +++ b/Externals/libusbx/NEWS @@ -0,0 +1,2 @@ +For the latest libusbx news, please refer to the ChangeLog file, or visit: +http://libusbx.org diff --git a/Externals/libusbx/PORTING b/Externals/libusbx/PORTING new file mode 100644 index 0000000000..9185c37f5a --- /dev/null +++ b/Externals/libusbx/PORTING @@ -0,0 +1,94 @@ +PORTING LIBUSBX TO OTHER PLATFORMS + +Introduction +============ + +This document is aimed at developers wishing to port libusbx to unsupported +platforms. I believe the libusbx API is OS-independent, so by supporting +multiple operating systems we pave the way for cross-platform USB device +drivers. + +Implementation-wise, the basic idea is that you provide an interface to +libusbx's internal "backend" API, which performs the appropriate operations on +your target platform. + +In terms of USB I/O, your backend provides functionality to submit +asynchronous transfers (synchronous transfers are implemented in the higher +layers, based on the async interface). Your backend must also provide +functionality to cancel those transfers. + +Your backend must also provide an event handling function to "reap" ongoing +transfers and process their results. + +The backend must also provide standard functions for other USB operations, +e.g. setting configuration, obtaining descriptors, etc. + + +File descriptors for I/O polling +================================ + +For libusbx to work, your event handling function obviously needs to be called +at various points in time. Your backend must provide a set of file descriptors +which libusbx and its users can pass to poll() or select() to determine when +it is time to call the event handling function. + +On Linux, this is easy: the usbfs kernel interface exposes a file descriptor +which can be passed to poll(). If something similar is not true for your +platform, you can emulate this using an internal library thread to reap I/O as +necessary, and a pipe() with the main library to raise events. The file +descriptor of the pipe can then be provided to libusbx as an event source. + + +Interface semantics and documentation +===================================== + +Documentation of the backend interface can be found in libusbi.h inside the +usbi_os_backend structure definition. + +Your implementations of these functions will need to call various internal +libusbx functions, prefixed with "usbi_". Documentation for these functions +can be found in the .c files where they are implemented. + +You probably want to skim over *all* the documentation before starting your +implementation. For example, you probably need to allocate and store private +OS-specific data for device handles, but the documentation for the mechanism +for doing so is probably not the first thing you will see. + +The Linux backend acts as a good example - view it as a reference +implementation which you should try to match the behaviour of. + + +Getting started +=============== + +1. Modify configure.ac to detect your platform appropriately (see the OS_LINUX +stuff for an example). + +2. Implement your backend in the libusb/os/ directory, modifying +libusb/os/Makefile.am appropriately. + +3. Add preprocessor logic to the top of libusb/core.c to statically assign the +right usbi_backend for your platform. + +4. Produce and test your implementation. + +5. Send your implementation to libusbx-devel mailing list. + + +Implementation difficulties? Questions? +======================================= + +If you encounter difficulties porting libusbx to your platform, please raise +these issues on the libusbx-devel mailing list. Where possible and sensible, I +am interested in solving problems preventing libusbx from operating on other +platforms. + +The libusbx-devel mailing list is also a good place to ask questions and +make suggestions about the internal API. Hopefully we can produce some +better documentation based on your questions and other input. + +You are encouraged to get involved in the process; if the library needs +some infrastructure additions/modifications to better support your platform, +you are encouraged to make such changes (in cleanly distinct patch +submissions). Even if you do not make such changes yourself, please do raise +the issues on the mailing list at the very minimum. diff --git a/Externals/libusbx/README b/Externals/libusbx/README new file mode 100644 index 0000000000..3add73110f --- /dev/null +++ b/Externals/libusbx/README @@ -0,0 +1,28 @@ +libusbx +======= + +libusbx is a library for USB device access from Linux, Mac OS X, +Windows and OpenBSD/NetBSD userspace, with OpenBSD/NetBSD, and to a +lesser extent some of the newest features of Windows (such as libusbK +and libusb-win32 driver support) being EXPERIMENTAL. +It is written in C and licensed under the GNU Lesser General Public +License version 2.1 or, at your option, any later version (see COPYING). + +libusbx is abstracted internally in such a way that it can hopefully +be ported to other operating systems. Please see the PORTING file +for more information. + +libusbx homepage: +http://libusbx.org/ + +Developers will wish to consult the API documentation: +http://api.libusbx.org + +Use the mailing list for questions, comments, etc: +http://mailing-list.libusbx.org + +- Pete Batard +- Hans de Goede +- Xiaofan Chen +- Ludovic Rousseau +(use the mailing list rather than mailing developers directly) diff --git a/Externals/libusbx/THANKS b/Externals/libusbx/THANKS new file mode 100644 index 0000000000..4189af2cb5 --- /dev/null +++ b/Externals/libusbx/THANKS @@ -0,0 +1,7 @@ +Development contributors are listed in the AUTHORS file. Community members who +have also made significant contributions in other areas are listed below: + +Alan Stern +Ludovic Rousseau +Tim Roberts +Xiaofan Chen diff --git a/Externals/libusbx/TODO b/Externals/libusbx/TODO new file mode 100644 index 0000000000..e64b279154 --- /dev/null +++ b/Externals/libusbx/TODO @@ -0,0 +1,2 @@ +Please see the libusbx roadmap by visiting: +https://github.com/libusbx/libusbx/issues/milestones?direction=asc&sort=due_date \ No newline at end of file diff --git a/Externals/libusbx/aclocal.m4 b/Externals/libusbx/aclocal.m4 new file mode 100644 index 0000000000..b839727512 --- /dev/null +++ b/Externals/libusbx/aclocal.m4 @@ -0,0 +1,1112 @@ +# generated automatically by aclocal 1.13.4 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.13' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.13.4], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.13.4])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/Externals/libusbx/compile b/Externals/libusbx/compile new file mode 100644 index 0000000000..531136b068 --- /dev/null +++ b/Externals/libusbx/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/Externals/libusbx/config.guess b/Externals/libusbx/config.guess new file mode 100644 index 0000000000..1804e9fcdc --- /dev/null +++ b/Externals/libusbx/config.guess @@ -0,0 +1,1535 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012, 2013 Free Software Foundation, Inc. + +timestamp='2012-12-29' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +2012, 2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/Externals/libusbx/config.h.in b/Externals/libusbx/config.h.in new file mode 100644 index 0000000000..41c7f0f7fc --- /dev/null +++ b/Externals/libusbx/config.h.in @@ -0,0 +1,134 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Default visibility */ +#undef DEFAULT_VISIBILITY + +/* Start with debug message logging enabled */ +#undef ENABLE_DEBUG_LOGGING + +/* Message logging */ +#undef ENABLE_LOGGING + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `udev' library (-ludev). */ +#undef HAVE_LIBUDEV + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUDEV_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_FILTER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_NETLINK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if the system has the type `struct timespec'. */ +#undef HAVE_STRUCT_TIMESPEC + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Darwin backend */ +#undef OS_DARWIN + +/* Linux backend */ +#undef OS_LINUX + +/* OpenBSD/NetBSD backend */ +#undef OS_OPENBSD + +/* Windows backend */ +#undef OS_WINDOWS + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* type of second poll() argument */ +#undef POLL_NFDS_TYPE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Use POSIX Threads */ +#undef THREADS_POSIX + +/* timerfd headers available */ +#undef USBI_TIMERFD_AVAILABLE + +/* Use udev for device enumeration/hotplug */ +#undef USE_UDEV + +/* Version number of package */ +#undef VERSION + +/* Use GNU extensions */ +#undef _GNU_SOURCE + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/Externals/libusbx/config.sub b/Externals/libusbx/config.sub new file mode 100644 index 0000000000..52f04bcd71 --- /dev/null +++ b/Externals/libusbx/config.sub @@ -0,0 +1,1790 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012, 2013 Free Software Foundation, Inc. + +timestamp='2012-12-29' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +2012, 2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i386-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/Externals/libusbx/configure b/Externals/libusbx/configure new file mode 100644 index 0000000000..fcf943c2a0 --- /dev/null +++ b/Externals/libusbx/configure @@ -0,0 +1,15137 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for libusbx 1.0.16. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: libusbx-devel@lists.sourceforge.net about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='libusbx' +PACKAGE_TARNAME='libusbx' +PACKAGE_VERSION='1.0.16' +PACKAGE_STRING='libusbx 1.0.16' +PACKAGE_BUGREPORT='libusbx-devel@lists.sourceforge.net' +PACKAGE_URL='http://libusbx.org' + +ac_unique_file="libusb/core.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +LTLDFLAGS +AM_CFLAGS +HAVE_SIGACTION_FALSE +HAVE_SIGACTION_TRUE +BUILD_TESTS_FALSE +BUILD_TESTS_TRUE +BUILD_EXAMPLES_FALSE +BUILD_EXAMPLES_TRUE +USE_UDEV_FALSE +USE_UDEV_TRUE +CREATE_IMPORT_LIB_FALSE +CREATE_IMPORT_LIB_TRUE +THREADS_POSIX_FALSE +THREADS_POSIX_TRUE +OS_WINDOWS_FALSE +OS_WINDOWS_TRUE +OS_OPENBSD_FALSE +OS_OPENBSD_TRUE +OS_DARWIN_FALSE +OS_DARWIN_TRUE +OS_LINUX_FALSE +OS_LINUX_TRUE +OS_WINDOWS +OS_OPENBSD +OS_DARWIN +USE_UDEV +OS_LINUX +RC +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_udev +enable_timerfd +enable_log +enable_debug_log +enable_examples_build +enable_tests_build +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures libusbx 1.0.16 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libusbx] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of libusbx 1.0.16:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-udev use udev for device enumeration and hotplug support + (recommended, default: yes) + --enable-timerfd use timerfd for timing (default auto) + --disable-log disable all logging + --enable-debug-log start with debug message logging enabled (default n) + --enable-examples-build build example applications (default n) + --enable-tests-build build test applications (default n) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +libusbx home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +libusbx configure 1.0.16 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## -------------------------------------------------- ## +## Report this to libusbx-devel@lists.sourceforge.net ## +## -------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libusbx $as_me 1.0.16, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Library versioning +# These numbers should be tweaked on every release. Read carefully: +# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +# http://sourceware.org/autobook/autobook/autobook_91.html +lt_current="1" +lt_revision="0" +lt_age="1" +LTLDFLAGS="-version-info ${lt_current}:${lt_revision}:${lt_age}" + +am__api_version='1.13' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='libusbx' + VERSION='1.0.16' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + + + +ac_config_headers="$ac_config_headers config.h" + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. +set dummy ${ac_tool_prefix}windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RC"; then + ac_cv_prog_RC="$RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RC="${ac_tool_prefix}windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RC=$ac_cv_prog_RC +if test -n "$RC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 +$as_echo "$RC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RC"; then + ac_ct_RC=$RC + # Extract the first word of "windres", so it can be a program name with args. +set dummy windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RC"; then + ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RC="windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RC=$ac_cv_prog_ac_ct_RC +if test -n "$ac_ct_RC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 +$as_echo "$ac_ct_RC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RC" = x; then + RC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RC=$ac_ct_RC + fi +else + RC="$ac_cv_prog_RC" +fi + + + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +if test -n "$compiler"; then + : + + + +fi + +GCC=$lt_save_GCC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + +$as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + +LTLDFLAGS="${LTLDFLAGS} -no-undefined" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking operating system" >&5 +$as_echo_n "checking operating system... " >&6; } + +case $host in +*-linux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5 +$as_echo "Linux" >&6; } + backend="linux" + threads="posix" + ;; +*-darwin*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin/Mac OS X" >&5 +$as_echo "Darwin/Mac OS X" >&6; } + backend="darwin" + threads="posix" + ;; +*-openbsd*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OpenBSD" >&5 +$as_echo "OpenBSD" >&6; } + backend="bsd" + threads="posix" + ;; +*-netbsd*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: NetBSD (using OpenBSD backend)" >&5 +$as_echo "NetBSD (using OpenBSD backend)" >&6; } + backend="bsd" + threads="posix" + ;; +*-mingw*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5 +$as_echo "Windows" >&6; } + backend="windows" + threads="windows" + create_import_lib="yes" + AM_CFLAGS="${AM_CFLAGS} -fno-omit-frame-pointer" + ;; +*-cygwin*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin (using Windows backend)" >&5 +$as_echo "Cygwin (using Windows backend)" >&6; } + backend="windows" + threads="posix" + ;; +*) + as_fn_error $? "unsupported operating system" "$LINENO" 5 +esac + +case $backend in +linux) + +$as_echo "#define OS_LINUX 1" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +$as_echo_n "checking for library containing clock_gettime... " >&6; } +if ${ac_cv_search_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib -pthread $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_clock_gettime=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_clock_gettime+:} false; then : + break +fi +done +if ${ac_cv_search_clock_gettime+:} false; then : + +else + ac_cv_search_clock_gettime=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +$as_echo "$ac_cv_search_clock_gettime" >&6; } +ac_res=$ac_cv_search_clock_gettime +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + # Check whether --enable-udev was given. +if test "${enable_udev+set}" = set; then : + enableval=$enable_udev; +else + enable_udev="yes" +fi + + if test "x$enable_udev" = "xyes" ; then + # system has udev. use it or fail! + for ac_header in libudev.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libudev.h" "ac_cv_header_libudev_h" "$ac_includes_default" +if test "x$ac_cv_header_libudev_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUDEV_H 1 +_ACEOF + +else + as_fn_error $? "\"udev support requested but libudev not installed\"" "$LINENO" 5 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for udev_new in -ludev" >&5 +$as_echo_n "checking for udev_new in -ludev... " >&6; } +if ${ac_cv_lib_udev_udev_new+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ludev $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char udev_new (); +int +main () +{ +return udev_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_udev_udev_new=yes +else + ac_cv_lib_udev_udev_new=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_udev_udev_new" >&5 +$as_echo "$ac_cv_lib_udev_udev_new" >&6; } +if test "x$ac_cv_lib_udev_udev_new" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUDEV 1 +_ACEOF + + LIBS="-ludev $LIBS" + +else + as_fn_error $? "\"udev support requested but libudev not installed\"" "$LINENO" 5 +fi + + +$as_echo "#define USE_UDEV 1" >>confdefs.h + + else + for ac_header in linux/netlink.h linux/filter.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +else + as_fn_error $? "\"Linux netlink headers not found\"" "$LINENO" 5 +fi + +done + + fi + + THREAD_CFLAGS="-pthread" + LIBS="${LIBS} -pthread" + for ac_header in poll.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POLL_H 1 +_ACEOF + +fi + +done + + +$as_echo "#define POLL_NFDS_TYPE nfds_t" >>confdefs.h + + ;; +darwin) + +$as_echo "#define OS_DARWIN 1" >>confdefs.h + + + LIBS="-lobjc -Wl,-framework,IOKit -Wl,-framework,CoreFoundation" + LTLDFLAGS="${LTLDFLAGS} -Wl,-prebind" + for ac_header in poll.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POLL_H 1 +_ACEOF + +fi + +done + + ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" "#include +" +if test "x$ac_cv_type_nfds_t" = xyes; then : + +$as_echo "#define POLL_NFDS_TYPE nfds_t" >>confdefs.h + +else + +$as_echo "#define POLL_NFDS_TYPE unsigned int" >>confdefs.h + +fi + + ;; +bsd) + +$as_echo "#define OS_OPENBSD 1" >>confdefs.h + + + THREAD_CFLAGS="-pthread" + LIBS="-pthread" + for ac_header in poll.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POLL_H 1 +_ACEOF + +fi + +done + + +$as_echo "#define POLL_NFDS_TYPE nfds_t" >>confdefs.h + + ;; +windows) + +$as_echo "#define OS_WINDOWS 1" >>confdefs.h + + + LIBS="" + LTLDFLAGS="${LTLDFLAGS} -avoid-version -Wl,--add-stdcall-alias" + +$as_echo "#define POLL_NFDS_TYPE unsigned int" >>confdefs.h + + ;; +esac + + + + if test "x$backend" = xlinux; then + OS_LINUX_TRUE= + OS_LINUX_FALSE='#' +else + OS_LINUX_TRUE='#' + OS_LINUX_FALSE= +fi + + if test "x$backend" = xdarwin; then + OS_DARWIN_TRUE= + OS_DARWIN_FALSE='#' +else + OS_DARWIN_TRUE='#' + OS_DARWIN_FALSE= +fi + + if test "x$backend" = xbsd; then + OS_OPENBSD_TRUE= + OS_OPENBSD_FALSE='#' +else + OS_OPENBSD_TRUE='#' + OS_OPENBSD_FALSE= +fi + + if test "x$backend" = xwindows; then + OS_WINDOWS_TRUE= + OS_WINDOWS_FALSE='#' +else + OS_WINDOWS_TRUE='#' + OS_WINDOWS_FALSE= +fi + + if test "x$threads" = xposix; then + THREADS_POSIX_TRUE= + THREADS_POSIX_FALSE='#' +else + THREADS_POSIX_TRUE='#' + THREADS_POSIX_FALSE= +fi + + if test "x$create_import_lib" = "xyes"; then + CREATE_IMPORT_LIB_TRUE= + CREATE_IMPORT_LIB_FALSE='#' +else + CREATE_IMPORT_LIB_TRUE='#' + CREATE_IMPORT_LIB_FALSE= +fi + + if test "x$enable_udev" = xyes; then + USE_UDEV_TRUE= + USE_UDEV_FALSE='#' +else + USE_UDEV_TRUE='#' + USE_UDEV_FALSE= +fi + +if test "$threads" = posix; then + +$as_echo "#define THREADS_POSIX 1" >>confdefs.h + +fi + +# timerfd +ac_fn_c_check_header_mongrel "$LINENO" "sys/timerfd.h" "ac_cv_header_sys_timerfd_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_timerfd_h" = xyes; then : + timerfd_h=1 +else + timerfd_h=0 +fi + + +# Check whether --enable-timerfd was given. +if test "${enable_timerfd+set}" = set; then : + enableval=$enable_timerfd; use_timerfd=$enableval +else + use_timerfd='auto' +fi + + +if test "x$use_timerfd" = "xyes" -a "x$timerfd_h" = "x0"; then + as_fn_error $? "timerfd header not available; glibc 2.9+ required" "$LINENO" 5 +fi + +ac_fn_c_check_decl "$LINENO" "TFD_NONBLOCK" "ac_cv_have_decl_TFD_NONBLOCK" "#include +" +if test "x$ac_cv_have_decl_TFD_NONBLOCK" = xyes; then : + tfd_hdr_ok=yes +else + tfd_hdr_ok=no +fi + +if test "x$use_timerfd" = "xyes" -a "x$tfd_hdr_ok" = "xno"; then + as_fn_error $? "timerfd header not usable; glibc 2.9+ required" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use timerfd for timing" >&5 +$as_echo_n "checking whether to use timerfd for timing... " >&6; } +if test "x$use_timerfd" = "xno"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (disabled by user)" >&5 +$as_echo "no (disabled by user)" >&6; } +else + if test "x$timerfd_h" = "x1" -a "x$tfd_hdr_ok" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define USBI_TIMERFD_AVAILABLE 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (header not available)" >&5 +$as_echo "no (header not available)" >&6; } + fi +fi + +ac_fn_c_check_type "$LINENO" "struct timespec" "ac_cv_type_struct_timespec" "$ac_includes_default" +if test "x$ac_cv_type_struct_timespec" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_TIMESPEC 1 +_ACEOF + + +fi + + +# Message logging +# Check whether --enable-log was given. +if test "${enable_log+set}" = set; then : + enableval=$enable_log; log_enabled=$enableval +else + log_enabled='yes' +fi + +if test "x$log_enabled" != "xno"; then + +$as_echo "#define ENABLE_LOGGING 1" >>confdefs.h + +fi + +# Check whether --enable-debug-log was given. +if test "${enable_debug_log+set}" = set; then : + enableval=$enable_debug_log; debug_log_enabled=$enableval +else + debug_log_enabled='no' +fi + +if test "x$debug_log_enabled" != "xno"; then + +$as_echo "#define ENABLE_DEBUG_LOGGING 1" >>confdefs.h + +fi + +# Examples build +# Check whether --enable-examples-build was given. +if test "${enable_examples_build+set}" = set; then : + enableval=$enable_examples_build; build_examples=$enableval +else + build_examples='no' +fi + + if test "x$build_examples" != "xno"; then + BUILD_EXAMPLES_TRUE= + BUILD_EXAMPLES_FALSE='#' +else + BUILD_EXAMPLES_TRUE='#' + BUILD_EXAMPLES_FALSE= +fi + + +# Tests build +# Check whether --enable-tests-build was given. +if test "${enable_tests_build+set}" = set; then : + enableval=$enable_tests_build; build_tests=$enableval +else + build_tests='no' +fi + + if test "x$build_tests" != "xno"; then + BUILD_TESTS_TRUE= + BUILD_TESTS_FALSE='#' +else + BUILD_TESTS_TRUE='#' + BUILD_TESTS_FALSE= +fi + + +# check for -fvisibility=hidden compiler support (GCC >= 3.4) +saved_cflags="$CFLAGS" +# -Werror required for cygwin +CFLAGS="$CFLAGS -Werror -fvisibility=hidden" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + VISIBILITY_CFLAGS="-fvisibility=hidden" + +$as_echo "#define DEFAULT_VISIBILITY __attribute__((visibility(\"default\")))" >>confdefs.h + +else + VISIBILITY_CFLAGS="" + +$as_echo "#define DEFAULT_VISIBILITY /**/" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$saved_cflags" + +# check for -Wno-pointer-sign compiler support (GCC >= 4) +saved_cflags="$CFLAGS" +CFLAGS="$CFLAGS -Wno-pointer-sign" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + nopointersign_cflags="-Wno-pointer-sign" +else + nopointersign_cflags="" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$saved_cflags" + +# sigaction not available on MinGW +ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" +if test "x$ac_cv_func_sigaction" = xyes; then : + have_sigaction=yes +else + have_sigaction=no +fi + + if test "x$have_sigaction" = "xyes"; then + HAVE_SIGACTION_TRUE= + HAVE_SIGACTION_FALSE='#' +else + HAVE_SIGACTION_TRUE='#' + HAVE_SIGACTION_FALSE= +fi + + +# headers not available on all platforms but required on others +for ac_header in sys/time.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_TIME_H 1 +_ACEOF + +fi + +done + +for ac_func in gettimeofday +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETTIMEOFDAY 1 +_ACEOF + +fi +done + +for ac_header in signal.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default" +if test "x$ac_cv_header_signal_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SIGNAL_H 1 +_ACEOF + +fi + +done + + +AM_CFLAGS="${AM_CFLAGS} -std=gnu99 -Wall -Wundef -Wunused -Wstrict-prototypes -Werror-implicit-function-declaration $nopointersign_cflags -Wshadow ${THREAD_CFLAGS} ${VISIBILITY_CFLAGS}" + + + + +ac_config_files="$ac_config_files libusb-1.0.pc" + +ac_config_files="$ac_config_files Makefile" + +ac_config_files="$ac_config_files libusb/Makefile" + +ac_config_files="$ac_config_files examples/Makefile" + +ac_config_files="$ac_config_files tests/Makefile" + +ac_config_files="$ac_config_files doc/Makefile" + +ac_config_files="$ac_config_files doc/doxygen.cfg" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_LINUX_TRUE}" && test -z "${OS_LINUX_FALSE}"; then + as_fn_error $? "conditional \"OS_LINUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_DARWIN_TRUE}" && test -z "${OS_DARWIN_FALSE}"; then + as_fn_error $? "conditional \"OS_DARWIN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_OPENBSD_TRUE}" && test -z "${OS_OPENBSD_FALSE}"; then + as_fn_error $? "conditional \"OS_OPENBSD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_WINDOWS_TRUE}" && test -z "${OS_WINDOWS_FALSE}"; then + as_fn_error $? "conditional \"OS_WINDOWS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${THREADS_POSIX_TRUE}" && test -z "${THREADS_POSIX_FALSE}"; then + as_fn_error $? "conditional \"THREADS_POSIX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CREATE_IMPORT_LIB_TRUE}" && test -z "${CREATE_IMPORT_LIB_FALSE}"; then + as_fn_error $? "conditional \"CREATE_IMPORT_LIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_UDEV_TRUE}" && test -z "${USE_UDEV_FALSE}"; then + as_fn_error $? "conditional \"USE_UDEV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then + as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_TESTS_TRUE}" && test -z "${BUILD_TESTS_FALSE}"; then + as_fn_error $? "conditional \"BUILD_TESTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SIGACTION_TRUE}" && test -z "${HAVE_SIGACTION_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SIGACTION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libusbx $as_me 1.0.16, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +libusbx home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +libusbx config.status 1.0.16 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +LD_RC='`$ECHO "$LD_RC" | $SED "$delay_single_quote_subst"`' +reload_flag_RC='`$ECHO "$reload_flag_RC" | $SED "$delay_single_quote_subst"`' +reload_cmds_RC='`$ECHO "$reload_cmds_RC" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_RC='`$ECHO "$old_archive_cmds_RC" | $SED "$delay_single_quote_subst"`' +compiler_RC='`$ECHO "$compiler_RC" | $SED "$delay_single_quote_subst"`' +GCC_RC='`$ECHO "$GCC_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_RC='`$ECHO "$lt_prog_compiler_no_builtin_flag_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_RC='`$ECHO "$lt_prog_compiler_pic_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_RC='`$ECHO "$lt_prog_compiler_wl_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_RC='`$ECHO "$lt_prog_compiler_static_RC" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_RC='`$ECHO "$lt_cv_prog_compiler_c_o_RC" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_RC='`$ECHO "$archive_cmds_need_lc_RC" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_RC='`$ECHO "$enable_shared_with_static_runtimes_RC" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_RC='`$ECHO "$export_dynamic_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_RC='`$ECHO "$whole_archive_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_RC='`$ECHO "$compiler_needs_object_RC" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_RC='`$ECHO "$old_archive_from_new_cmds_RC" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_RC='`$ECHO "$old_archive_from_expsyms_cmds_RC" | $SED "$delay_single_quote_subst"`' +archive_cmds_RC='`$ECHO "$archive_cmds_RC" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_RC='`$ECHO "$archive_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' +module_cmds_RC='`$ECHO "$module_cmds_RC" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_RC='`$ECHO "$module_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_RC='`$ECHO "$with_gnu_ld_RC" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_RC='`$ECHO "$allow_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_RC='`$ECHO "$no_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_RC='`$ECHO "$hardcode_libdir_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_RC='`$ECHO "$hardcode_libdir_separator_RC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_RC='`$ECHO "$hardcode_direct_RC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_RC='`$ECHO "$hardcode_direct_absolute_RC" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_RC='`$ECHO "$hardcode_minus_L_RC" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_RC='`$ECHO "$hardcode_shlibpath_var_RC" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_RC='`$ECHO "$hardcode_automatic_RC" | $SED "$delay_single_quote_subst"`' +inherit_rpath_RC='`$ECHO "$inherit_rpath_RC" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_RC='`$ECHO "$link_all_deplibs_RC" | $SED "$delay_single_quote_subst"`' +always_export_symbols_RC='`$ECHO "$always_export_symbols_RC" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_RC='`$ECHO "$export_symbols_cmds_RC" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_RC='`$ECHO "$exclude_expsyms_RC" | $SED "$delay_single_quote_subst"`' +include_expsyms_RC='`$ECHO "$include_expsyms_RC" | $SED "$delay_single_quote_subst"`' +prelink_cmds_RC='`$ECHO "$prelink_cmds_RC" | $SED "$delay_single_quote_subst"`' +postlink_cmds_RC='`$ECHO "$postlink_cmds_RC" | $SED "$delay_single_quote_subst"`' +file_list_spec_RC='`$ECHO "$file_list_spec_RC" | $SED "$delay_single_quote_subst"`' +hardcode_action_RC='`$ECHO "$hardcode_action_RC" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +LD_RC \ +reload_flag_RC \ +compiler_RC \ +lt_prog_compiler_no_builtin_flag_RC \ +lt_prog_compiler_pic_RC \ +lt_prog_compiler_wl_RC \ +lt_prog_compiler_static_RC \ +lt_cv_prog_compiler_c_o_RC \ +export_dynamic_flag_spec_RC \ +whole_archive_flag_spec_RC \ +compiler_needs_object_RC \ +with_gnu_ld_RC \ +allow_undefined_flag_RC \ +no_undefined_flag_RC \ +hardcode_libdir_flag_spec_RC \ +hardcode_libdir_separator_RC \ +exclude_expsyms_RC \ +include_expsyms_RC \ +file_list_spec_RC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_RC \ +old_archive_cmds_RC \ +old_archive_from_new_cmds_RC \ +old_archive_from_expsyms_cmds_RC \ +archive_cmds_RC \ +archive_expsym_cmds_RC \ +module_cmds_RC \ +module_expsym_cmds_RC \ +export_symbols_cmds_RC \ +prelink_cmds_RC \ +postlink_cmds_RC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "libusb-1.0.pc") CONFIG_FILES="$CONFIG_FILES libusb-1.0.pc" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "libusb/Makefile") CONFIG_FILES="$CONFIG_FILES libusb/Makefile" ;; + "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/doxygen.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen.cfg" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="RC " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: RC + +# The linker used to build libraries. +LD=$lt_LD_RC + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_RC +reload_cmds=$lt_reload_cmds_RC + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_RC + +# A language specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU compiler? +with_gcc=$GCC_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_RC + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_RC + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_RC + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_RC + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_RC + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_RC + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_RC + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_RC + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# ### END LIBTOOL TAG CONFIG: RC +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/Externals/libusbx/configure.ac b/Externals/libusbx/configure.ac new file mode 100644 index 0000000000..6d6b35d6e4 --- /dev/null +++ b/Externals/libusbx/configure.ac @@ -0,0 +1,249 @@ +dnl These m4 macros are whitespace sensitive and break if moved around much. +m4_define([LU_VERSION_H], m4_include([libusb/version.h])) +m4_define([LU_DEFINE_VERSION_ATOM], + [m4_define([$1], m4_bregexp(LU_VERSION_H, + [^#define\s*$1\s*\([0-9]*\).*], [\1]))]) +m4_define([LU_DEFINE_VERSION_RC_ATOM], + [m4_define([$1], m4_bregexp(LU_VERSION_H, + [^#define\s*$1\s*"\(-rc[0-9]*\)".*], [\1]))]) +dnl The m4_bregexp() returns (only) the numbers following the #define named +dnl in the first macro parameter. m4_define() then defines the name for use +dnl in AC_INIT. + +LU_DEFINE_VERSION_ATOM([LIBUSB_MAJOR]) +LU_DEFINE_VERSION_ATOM([LIBUSB_MINOR]) +LU_DEFINE_VERSION_ATOM([LIBUSB_MICRO]) +LU_DEFINE_VERSION_RC_ATOM([LIBUSB_RC]) + +AC_INIT([libusbx],[LIBUSB_MAJOR[.]LIBUSB_MINOR[.]LIBUSB_MICRO[]LIBUSB_RC],[libusbx-devel@lists.sourceforge.net],[libusbx],[http://libusbx.org]) + +# Library versioning +# These numbers should be tweaked on every release. Read carefully: +# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +# http://sourceware.org/autobook/autobook/autobook_91.html +lt_current="1" +lt_revision="0" +lt_age="1" +LTLDFLAGS="-version-info ${lt_current}:${lt_revision}:${lt_age}" + +AM_INIT_AUTOMAKE +AM_MAINTAINER_MODE + +AC_CONFIG_SRCDIR([libusb/core.c]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([config.h]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) + +AC_PREREQ([2.50]) +AC_PROG_CC +LT_INIT +LT_LANG([Windows Resource]) +AC_C_INLINE +AM_PROG_CC_C_O +AC_DEFINE([_GNU_SOURCE], 1, [Use GNU extensions]) + +LTLDFLAGS="${LTLDFLAGS} -no-undefined" + +AC_MSG_CHECKING([operating system]) + +case $host in +*-linux*) + AC_MSG_RESULT([Linux]) + backend="linux" + threads="posix" + ;; +*-darwin*) + AC_MSG_RESULT([Darwin/Mac OS X]) + backend="darwin" + threads="posix" + ;; +*-openbsd*) + AC_MSG_RESULT([OpenBSD]) + backend="bsd" + threads="posix" + ;; +*-netbsd*) + AC_MSG_RESULT([NetBSD (using OpenBSD backend)]) + backend="bsd" + threads="posix" + ;; +*-mingw*) + AC_MSG_RESULT([Windows]) + backend="windows" + threads="windows" + create_import_lib="yes" + AM_CFLAGS="${AM_CFLAGS} -fno-omit-frame-pointer" + ;; +*-cygwin*) + AC_MSG_RESULT([Cygwin (using Windows backend)]) + backend="windows" + threads="posix" + ;; +*) + AC_MSG_ERROR([unsupported operating system]) +esac + +case $backend in +linux) + AC_DEFINE(OS_LINUX, 1, [Linux backend]) + AC_SUBST(OS_LINUX) + AC_SEARCH_LIBS(clock_gettime, rt, [], [], -pthread) + AC_ARG_ENABLE([udev], + [AC_HELP_STRING([--enable-udev], [use udev for device enumeration and hotplug support (recommended, default: yes)])], + [], [enable_udev="yes"]) + if test "x$enable_udev" = "xyes" ; then + # system has udev. use it or fail! + AC_CHECK_HEADERS([libudev.h],[],[AC_ERROR(["udev support requested but libudev not installed"])]) + AC_CHECK_LIB([udev], [udev_new], [], [AC_ERROR(["udev support requested but libudev not installed"])]) + AC_DEFINE(USE_UDEV, 1, [Use udev for device enumeration/hotplug]) + else + AC_CHECK_HEADERS([linux/netlink.h linux/filter.h], [], [AC_ERROR(["Linux netlink headers not found"])]) + fi + AC_SUBST(USE_UDEV) + THREAD_CFLAGS="-pthread" + LIBS="${LIBS} -pthread" + AC_CHECK_HEADERS([poll.h]) + AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument]) + ;; +darwin) + AC_DEFINE(OS_DARWIN, 1, [Darwin backend]) + AC_SUBST(OS_DARWIN) + LIBS="-lobjc -Wl,-framework,IOKit -Wl,-framework,CoreFoundation" + LTLDFLAGS="${LTLDFLAGS} -Wl,-prebind" + AC_CHECK_HEADERS([poll.h]) + AC_CHECK_TYPE([nfds_t], + [AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])], + [AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument])], + [#include ]) + ;; +bsd) + AC_DEFINE(OS_OPENBSD, 1, [OpenBSD/NetBSD backend]) + AC_SUBST(OS_OPENBSD) + THREAD_CFLAGS="-pthread" + LIBS="-pthread" + AC_CHECK_HEADERS([poll.h]) + AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument]) + ;; +windows) + AC_DEFINE(OS_WINDOWS, 1, [Windows backend]) + AC_SUBST(OS_WINDOWS) + LIBS="" + LTLDFLAGS="${LTLDFLAGS} -avoid-version -Wl,--add-stdcall-alias" + AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument]) + ;; +esac + +AC_SUBST(LIBS) + +AM_CONDITIONAL(OS_LINUX, test "x$backend" = xlinux) +AM_CONDITIONAL(OS_DARWIN, test "x$backend" = xdarwin) +AM_CONDITIONAL(OS_OPENBSD, test "x$backend" = xbsd) +AM_CONDITIONAL(OS_WINDOWS, test "x$backend" = xwindows) +AM_CONDITIONAL(THREADS_POSIX, test "x$threads" = xposix) +AM_CONDITIONAL(CREATE_IMPORT_LIB, test "x$create_import_lib" = "xyes") +AM_CONDITIONAL(USE_UDEV, test "x$enable_udev" = xyes) +if test "$threads" = posix; then + AC_DEFINE(THREADS_POSIX, 1, [Use POSIX Threads]) +fi + +# timerfd +AC_CHECK_HEADER([sys/timerfd.h], [timerfd_h=1], [timerfd_h=0]) +AC_ARG_ENABLE([timerfd], + [AS_HELP_STRING([--enable-timerfd], + [use timerfd for timing (default auto)])], + [use_timerfd=$enableval], [use_timerfd='auto']) + +if test "x$use_timerfd" = "xyes" -a "x$timerfd_h" = "x0"; then + AC_MSG_ERROR([timerfd header not available; glibc 2.9+ required]) +fi + +AC_CHECK_DECL([TFD_NONBLOCK], [tfd_hdr_ok=yes], [tfd_hdr_ok=no], [#include ]) +if test "x$use_timerfd" = "xyes" -a "x$tfd_hdr_ok" = "xno"; then + AC_MSG_ERROR([timerfd header not usable; glibc 2.9+ required]) +fi + +AC_MSG_CHECKING([whether to use timerfd for timing]) +if test "x$use_timerfd" = "xno"; then + AC_MSG_RESULT([no (disabled by user)]) +else + if test "x$timerfd_h" = "x1" -a "x$tfd_hdr_ok" = "xyes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE(USBI_TIMERFD_AVAILABLE, 1, [timerfd headers available]) + else + AC_MSG_RESULT([no (header not available)]) + fi +fi + +AC_CHECK_TYPES(struct timespec) + +# Message logging +AC_ARG_ENABLE([log], [AS_HELP_STRING([--disable-log], [disable all logging])], + [log_enabled=$enableval], + [log_enabled='yes']) +if test "x$log_enabled" != "xno"; then + AC_DEFINE([ENABLE_LOGGING], 1, [Message logging]) +fi + +AC_ARG_ENABLE([debug-log], [AS_HELP_STRING([--enable-debug-log], + [start with debug message logging enabled (default n)])], + [debug_log_enabled=$enableval], + [debug_log_enabled='no']) +if test "x$debug_log_enabled" != "xno"; then + AC_DEFINE([ENABLE_DEBUG_LOGGING], 1, [Start with debug message logging enabled]) +fi + +# Examples build +AC_ARG_ENABLE([examples-build], [AS_HELP_STRING([--enable-examples-build], + [build example applications (default n)])], + [build_examples=$enableval], + [build_examples='no']) +AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$build_examples" != "xno"]) + +# Tests build +AC_ARG_ENABLE([tests-build], [AS_HELP_STRING([--enable-tests-build], + [build test applications (default n)])], + [build_tests=$enableval], + [build_tests='no']) +AM_CONDITIONAL([BUILD_TESTS], [test "x$build_tests" != "xno"]) + +# check for -fvisibility=hidden compiler support (GCC >= 3.4) +saved_cflags="$CFLAGS" +# -Werror required for cygwin +CFLAGS="$CFLAGS -Werror -fvisibility=hidden" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], + [VISIBILITY_CFLAGS="-fvisibility=hidden" + AC_DEFINE([DEFAULT_VISIBILITY], [__attribute__((visibility("default")))], [Default visibility]) ], + [ VISIBILITY_CFLAGS="" + AC_DEFINE([DEFAULT_VISIBILITY], [], [Default visibility]) ], + ]) +CFLAGS="$saved_cflags" + +# check for -Wno-pointer-sign compiler support (GCC >= 4) +saved_cflags="$CFLAGS" +CFLAGS="$CFLAGS -Wno-pointer-sign" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], + nopointersign_cflags="-Wno-pointer-sign", nopointersign_cflags="") +CFLAGS="$saved_cflags" + +# sigaction not available on MinGW +AC_CHECK_FUNC([sigaction], [have_sigaction=yes], [have_sigaction=no]) +AM_CONDITIONAL([HAVE_SIGACTION], [test "x$have_sigaction" = "xyes"]) + +# headers not available on all platforms but required on others +AC_CHECK_HEADERS([sys/time.h]) +AC_CHECK_FUNCS(gettimeofday) +AC_CHECK_HEADERS([signal.h]) + +AM_CFLAGS="${AM_CFLAGS} -std=gnu99 -Wall -Wundef -Wunused -Wstrict-prototypes -Werror-implicit-function-declaration $nopointersign_cflags -Wshadow ${THREAD_CFLAGS} ${VISIBILITY_CFLAGS}" + +AC_SUBST(AM_CFLAGS) +AC_SUBST(LTLDFLAGS) + +AC_CONFIG_FILES([libusb-1.0.pc]) +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([libusb/Makefile]) +AC_CONFIG_FILES([examples/Makefile]) +AC_CONFIG_FILES([tests/Makefile]) +AC_CONFIG_FILES([doc/Makefile]) +AC_CONFIG_FILES([doc/doxygen.cfg]) +AC_OUTPUT diff --git a/Externals/libusbx/depcomp b/Externals/libusbx/depcomp new file mode 100644 index 0000000000..06b0882dd0 --- /dev/null +++ b/Externals/libusbx/depcomp @@ -0,0 +1,790 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2012-10-18.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/Externals/libusbx/install-sh b/Externals/libusbx/install-sh new file mode 100644 index 0000000000..377bb8687f --- /dev/null +++ b/Externals/libusbx/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-11-20.07; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# 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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/Externals/libusbx/libusb-1.0.pc.in b/Externals/libusbx/libusb-1.0.pc.in new file mode 100644 index 0000000000..7bc33c1210 --- /dev/null +++ b/Externals/libusbx/libusb-1.0.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libusbx-1.0 +Description: C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace +Version: @VERSION@ +Libs: -L${libdir} -lusb-1.0 +Libs.private: @LIBS@ +Cflags: -I${includedir}/libusb-1.0 diff --git a/Externals/libusbx/libusb/Makefile.am b/Externals/libusbx/libusb/Makefile.am new file mode 100644 index 0000000000..7f9c1f9093 --- /dev/null +++ b/Externals/libusbx/libusb/Makefile.am @@ -0,0 +1,68 @@ +all: libusb-1.0.la libusb-1.0.dll + +lib_LTLIBRARIES = libusb-1.0.la + +POSIX_POLL_SRC = os/poll_posix.c +LINUX_USBFS_SRC = os/linux_usbfs.c +DARWIN_USB_SRC = os/darwin_usb.c +OPENBSD_USB_SRC = os/openbsd_usb.c +WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def +WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h + +EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \ + $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \ + $(POSIX_POLL_SRC) \ + os/threads_posix.c os/threads_windows.c \ + os/linux_udev.c os/linux_netlink.c + +if OS_LINUX + +if USE_UDEV +OS_SRC = $(LINUX_USBFS_SRC) $(POSIX_POLL_SRC) \ + os/linux_udev.c +else +OS_SRC = $(LINUX_USBFS_SRC) $(POSIX_POLL_SRC) \ + os/linux_netlink.c +endif + +endif + +if OS_DARWIN +OS_SRC = $(DARWIN_USB_SRC) $(POSIX_POLL_SRC) +AM_CFLAGS_EXT = -no-cpp-precomp +endif + +if OS_OPENBSD +OS_SRC = $(OPENBSD_USB_SRC) $(POSIX_POLL_SRC) +endif + +if OS_WINDOWS +OS_SRC = $(WINDOWS_USB_SRC) + +.rc.lo: + $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ + +libusb-1.0.rc: version.h version_nano.h +endif + +libusb-1.0.dll: libusb-1.0.def +if CREATE_IMPORT_LIB +# Rebuild the import lib from the .def so that MS and MinGW DLLs can be interchanged + $(AM_V_GEN)$(DLLTOOL) $(DLLTOOLFLAGS) --kill-at --input-def $(srcdir)/libusb-1.0.def --dllname $@ --output-lib .libs/$@.a +endif + +if THREADS_POSIX +THREADS_SRC = os/threads_posix.h os/threads_posix.c +else +THREADS_SRC = os/threads_windows.h os/threads_windows.c +endif + +libusb_1_0_la_CFLAGS = $(AM_CFLAGS) +libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) +libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \ + os/linux_usbfs.h os/darwin_usb.h os/windows_usb.h os/windows_common.h \ + hotplug.h hotplug.c $(THREADS_SRC) $(OS_SRC) \ + os/poll_posix.h os/poll_windows.h + +hdrdir = $(includedir)/libusb-1.0 +hdr_HEADERS = libusb.h diff --git a/Externals/libusbx/libusb/Makefile.in b/Externals/libusbx/libusb/Makefile.in new file mode 100644 index 0000000000..2461c45a80 --- /dev/null +++ b/Externals/libusbx/libusb/Makefile.in @@ -0,0 +1,860 @@ +# Makefile.in generated by automake 1.13.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libusb +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp $(hdr_HEADERS) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/libusb/version.h $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libusb_1_0_la_LIBADD = +am__libusb_1_0_la_SOURCES_DIST = libusbi.h core.c descriptor.c io.c \ + strerror.c sync.c os/linux_usbfs.h os/darwin_usb.h \ + os/windows_usb.h os/windows_common.h hotplug.h hotplug.c \ + os/threads_windows.h os/threads_windows.c os/threads_posix.h \ + os/threads_posix.c os/darwin_usb.c os/poll_posix.c \ + os/linux_usbfs.c os/linux_netlink.c os/linux_udev.c \ + os/openbsd_usb.c os/poll_windows.c os/windows_usb.c \ + libusb-1.0.rc libusb-1.0.def os/poll_posix.h os/poll_windows.h +@THREADS_POSIX_FALSE@am__objects_1 = libusb_1_0_la-threads_windows.lo +@THREADS_POSIX_TRUE@am__objects_1 = libusb_1_0_la-threads_posix.lo +am__objects_2 = libusb_1_0_la-darwin_usb.lo +am__objects_3 = libusb_1_0_la-poll_posix.lo +am__objects_4 = libusb_1_0_la-linux_usbfs.lo +am__objects_5 = libusb_1_0_la-openbsd_usb.lo +am__objects_6 = libusb_1_0_la-poll_windows.lo \ + libusb_1_0_la-windows_usb.lo libusb-1.0.lo +@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_OPENBSD_FALSE@@OS_WINDOWS_TRUE@am__objects_7 = $(am__objects_6) +@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_OPENBSD_TRUE@am__objects_7 = $(am__objects_5) \ +@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_OPENBSD_TRUE@ $(am__objects_3) +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@am__objects_7 = $(am__objects_4) \ +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ $(am__objects_3) \ +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_FALSE@ libusb_1_0_la-linux_netlink.lo +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@am__objects_7 = $(am__objects_4) \ +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ $(am__objects_3) \ +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@@USE_UDEV_TRUE@ libusb_1_0_la-linux_udev.lo +@OS_DARWIN_TRUE@am__objects_7 = $(am__objects_2) $(am__objects_3) +am_libusb_1_0_la_OBJECTS = libusb_1_0_la-core.lo \ + libusb_1_0_la-descriptor.lo libusb_1_0_la-io.lo \ + libusb_1_0_la-strerror.lo libusb_1_0_la-sync.lo \ + libusb_1_0_la-hotplug.lo $(am__objects_1) $(am__objects_7) +libusb_1_0_la_OBJECTS = $(am_libusb_1_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libusb_1_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libusb_1_0_la_CFLAGS) \ + $(CFLAGS) $(libusb_1_0_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libusb_1_0_la_SOURCES) +DIST_SOURCES = $(am__libusb_1_0_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(hdr_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLDFLAGS = @LTLDFLAGS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OS_DARWIN = @OS_DARWIN@ +OS_LINUX = @OS_LINUX@ +OS_OPENBSD = @OS_OPENBSD@ +OS_WINDOWS = @OS_WINDOWS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_UDEV = @USE_UDEV@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +lib_LTLIBRARIES = libusb-1.0.la +POSIX_POLL_SRC = os/poll_posix.c +LINUX_USBFS_SRC = os/linux_usbfs.c +DARWIN_USB_SRC = os/darwin_usb.c +OPENBSD_USB_SRC = os/openbsd_usb.c +WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def +WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h +EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \ + $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \ + $(POSIX_POLL_SRC) \ + os/threads_posix.c os/threads_windows.c \ + os/linux_udev.c os/linux_netlink.c + +@OS_DARWIN_TRUE@OS_SRC = $(DARWIN_USB_SRC) $(POSIX_POLL_SRC) +@OS_LINUX_TRUE@@USE_UDEV_FALSE@OS_SRC = $(LINUX_USBFS_SRC) $(POSIX_POLL_SRC) \ +@OS_LINUX_TRUE@@USE_UDEV_FALSE@ os/linux_netlink.c + +@OS_LINUX_TRUE@@USE_UDEV_TRUE@OS_SRC = $(LINUX_USBFS_SRC) $(POSIX_POLL_SRC) \ +@OS_LINUX_TRUE@@USE_UDEV_TRUE@ os/linux_udev.c + +@OS_OPENBSD_TRUE@OS_SRC = $(OPENBSD_USB_SRC) $(POSIX_POLL_SRC) +@OS_WINDOWS_TRUE@OS_SRC = $(WINDOWS_USB_SRC) +@OS_DARWIN_TRUE@AM_CFLAGS_EXT = -no-cpp-precomp +@THREADS_POSIX_FALSE@THREADS_SRC = os/threads_windows.h os/threads_windows.c +@THREADS_POSIX_TRUE@THREADS_SRC = os/threads_posix.h os/threads_posix.c +libusb_1_0_la_CFLAGS = $(AM_CFLAGS) +libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) +libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \ + os/linux_usbfs.h os/darwin_usb.h os/windows_usb.h os/windows_common.h \ + hotplug.h hotplug.c $(THREADS_SRC) $(OS_SRC) \ + os/poll_posix.h os/poll_windows.h + +hdrdir = $(includedir)/libusb-1.0 +hdr_HEADERS = libusb.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj .rc +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libusb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu libusb/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libusb-1.0.la: $(libusb_1_0_la_OBJECTS) $(libusb_1_0_la_DEPENDENCIES) $(EXTRA_libusb_1_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libusb_1_0_la_LINK) -rpath $(libdir) $(libusb_1_0_la_OBJECTS) $(libusb_1_0_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-darwin_usb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-descriptor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-hotplug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-io.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-linux_netlink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-linux_udev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-linux_usbfs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-openbsd_usb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-poll_posix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-poll_windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-strerror.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-sync.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-threads_posix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-threads_windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-windows_usb.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libusb_1_0_la-core.lo: core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-core.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-core.Tpo -c -o libusb_1_0_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-core.Tpo $(DEPDIR)/libusb_1_0_la-core.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core.c' object='libusb_1_0_la-core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c + +libusb_1_0_la-descriptor.lo: descriptor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-descriptor.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-descriptor.Tpo -c -o libusb_1_0_la-descriptor.lo `test -f 'descriptor.c' || echo '$(srcdir)/'`descriptor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-descriptor.Tpo $(DEPDIR)/libusb_1_0_la-descriptor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='descriptor.c' object='libusb_1_0_la-descriptor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-descriptor.lo `test -f 'descriptor.c' || echo '$(srcdir)/'`descriptor.c + +libusb_1_0_la-io.lo: io.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-io.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-io.Tpo -c -o libusb_1_0_la-io.lo `test -f 'io.c' || echo '$(srcdir)/'`io.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-io.Tpo $(DEPDIR)/libusb_1_0_la-io.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='io.c' object='libusb_1_0_la-io.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-io.lo `test -f 'io.c' || echo '$(srcdir)/'`io.c + +libusb_1_0_la-strerror.lo: strerror.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-strerror.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-strerror.Tpo -c -o libusb_1_0_la-strerror.lo `test -f 'strerror.c' || echo '$(srcdir)/'`strerror.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-strerror.Tpo $(DEPDIR)/libusb_1_0_la-strerror.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strerror.c' object='libusb_1_0_la-strerror.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-strerror.lo `test -f 'strerror.c' || echo '$(srcdir)/'`strerror.c + +libusb_1_0_la-sync.lo: sync.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-sync.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-sync.Tpo -c -o libusb_1_0_la-sync.lo `test -f 'sync.c' || echo '$(srcdir)/'`sync.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-sync.Tpo $(DEPDIR)/libusb_1_0_la-sync.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sync.c' object='libusb_1_0_la-sync.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-sync.lo `test -f 'sync.c' || echo '$(srcdir)/'`sync.c + +libusb_1_0_la-hotplug.lo: hotplug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-hotplug.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-hotplug.Tpo -c -o libusb_1_0_la-hotplug.lo `test -f 'hotplug.c' || echo '$(srcdir)/'`hotplug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-hotplug.Tpo $(DEPDIR)/libusb_1_0_la-hotplug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hotplug.c' object='libusb_1_0_la-hotplug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-hotplug.lo `test -f 'hotplug.c' || echo '$(srcdir)/'`hotplug.c + +libusb_1_0_la-threads_windows.lo: os/threads_windows.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-threads_windows.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-threads_windows.Tpo -c -o libusb_1_0_la-threads_windows.lo `test -f 'os/threads_windows.c' || echo '$(srcdir)/'`os/threads_windows.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-threads_windows.Tpo $(DEPDIR)/libusb_1_0_la-threads_windows.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/threads_windows.c' object='libusb_1_0_la-threads_windows.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-threads_windows.lo `test -f 'os/threads_windows.c' || echo '$(srcdir)/'`os/threads_windows.c + +libusb_1_0_la-threads_posix.lo: os/threads_posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-threads_posix.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-threads_posix.Tpo -c -o libusb_1_0_la-threads_posix.lo `test -f 'os/threads_posix.c' || echo '$(srcdir)/'`os/threads_posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-threads_posix.Tpo $(DEPDIR)/libusb_1_0_la-threads_posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/threads_posix.c' object='libusb_1_0_la-threads_posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-threads_posix.lo `test -f 'os/threads_posix.c' || echo '$(srcdir)/'`os/threads_posix.c + +libusb_1_0_la-darwin_usb.lo: os/darwin_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-darwin_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-darwin_usb.Tpo -c -o libusb_1_0_la-darwin_usb.lo `test -f 'os/darwin_usb.c' || echo '$(srcdir)/'`os/darwin_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-darwin_usb.Tpo $(DEPDIR)/libusb_1_0_la-darwin_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/darwin_usb.c' object='libusb_1_0_la-darwin_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-darwin_usb.lo `test -f 'os/darwin_usb.c' || echo '$(srcdir)/'`os/darwin_usb.c + +libusb_1_0_la-poll_posix.lo: os/poll_posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-poll_posix.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-poll_posix.Tpo -c -o libusb_1_0_la-poll_posix.lo `test -f 'os/poll_posix.c' || echo '$(srcdir)/'`os/poll_posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-poll_posix.Tpo $(DEPDIR)/libusb_1_0_la-poll_posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/poll_posix.c' object='libusb_1_0_la-poll_posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-poll_posix.lo `test -f 'os/poll_posix.c' || echo '$(srcdir)/'`os/poll_posix.c + +libusb_1_0_la-linux_usbfs.lo: os/linux_usbfs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-linux_usbfs.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-linux_usbfs.Tpo -c -o libusb_1_0_la-linux_usbfs.lo `test -f 'os/linux_usbfs.c' || echo '$(srcdir)/'`os/linux_usbfs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-linux_usbfs.Tpo $(DEPDIR)/libusb_1_0_la-linux_usbfs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/linux_usbfs.c' object='libusb_1_0_la-linux_usbfs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-linux_usbfs.lo `test -f 'os/linux_usbfs.c' || echo '$(srcdir)/'`os/linux_usbfs.c + +libusb_1_0_la-linux_netlink.lo: os/linux_netlink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-linux_netlink.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-linux_netlink.Tpo -c -o libusb_1_0_la-linux_netlink.lo `test -f 'os/linux_netlink.c' || echo '$(srcdir)/'`os/linux_netlink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-linux_netlink.Tpo $(DEPDIR)/libusb_1_0_la-linux_netlink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/linux_netlink.c' object='libusb_1_0_la-linux_netlink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-linux_netlink.lo `test -f 'os/linux_netlink.c' || echo '$(srcdir)/'`os/linux_netlink.c + +libusb_1_0_la-linux_udev.lo: os/linux_udev.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-linux_udev.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-linux_udev.Tpo -c -o libusb_1_0_la-linux_udev.lo `test -f 'os/linux_udev.c' || echo '$(srcdir)/'`os/linux_udev.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-linux_udev.Tpo $(DEPDIR)/libusb_1_0_la-linux_udev.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/linux_udev.c' object='libusb_1_0_la-linux_udev.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-linux_udev.lo `test -f 'os/linux_udev.c' || echo '$(srcdir)/'`os/linux_udev.c + +libusb_1_0_la-openbsd_usb.lo: os/openbsd_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-openbsd_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-openbsd_usb.Tpo -c -o libusb_1_0_la-openbsd_usb.lo `test -f 'os/openbsd_usb.c' || echo '$(srcdir)/'`os/openbsd_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-openbsd_usb.Tpo $(DEPDIR)/libusb_1_0_la-openbsd_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/openbsd_usb.c' object='libusb_1_0_la-openbsd_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-openbsd_usb.lo `test -f 'os/openbsd_usb.c' || echo '$(srcdir)/'`os/openbsd_usb.c + +libusb_1_0_la-poll_windows.lo: os/poll_windows.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-poll_windows.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-poll_windows.Tpo -c -o libusb_1_0_la-poll_windows.lo `test -f 'os/poll_windows.c' || echo '$(srcdir)/'`os/poll_windows.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-poll_windows.Tpo $(DEPDIR)/libusb_1_0_la-poll_windows.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/poll_windows.c' object='libusb_1_0_la-poll_windows.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-poll_windows.lo `test -f 'os/poll_windows.c' || echo '$(srcdir)/'`os/poll_windows.c + +libusb_1_0_la-windows_usb.lo: os/windows_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-windows_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-windows_usb.Tpo -c -o libusb_1_0_la-windows_usb.lo `test -f 'os/windows_usb.c' || echo '$(srcdir)/'`os/windows_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-windows_usb.Tpo $(DEPDIR)/libusb_1_0_la-windows_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='os/windows_usb.c' object='libusb_1_0_la-windows_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-windows_usb.lo `test -f 'os/windows_usb.c' || echo '$(srcdir)/'`os/windows_usb.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-hdrHEADERS: $(hdr_HEADERS) + @$(NORMAL_INSTALL) + @list='$(hdr_HEADERS)'; test -n "$(hdrdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(hdrdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(hdrdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(hdrdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(hdrdir)" || exit $$?; \ + done + +uninstall-hdrHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(hdr_HEADERS)'; test -n "$(hdrdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(hdrdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-hdrHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-hdrHEADERS uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-hdrHEADERS install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-hdrHEADERS \ + uninstall-libLTLIBRARIES + +all: libusb-1.0.la libusb-1.0.dll + +@OS_WINDOWS_TRUE@.rc.lo: +@OS_WINDOWS_TRUE@ $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ + +@OS_WINDOWS_TRUE@libusb-1.0.rc: version.h version_nano.h + +libusb-1.0.dll: libusb-1.0.def +# Rebuild the import lib from the .def so that MS and MinGW DLLs can be interchanged +@CREATE_IMPORT_LIB_TRUE@ $(AM_V_GEN)$(DLLTOOL) $(DLLTOOLFLAGS) --kill-at --input-def $(srcdir)/libusb-1.0.def --dllname $@ --output-lib .libs/$@.a + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Externals/libusbx/libusb/core.c b/Externals/libusbx/libusb/core.c new file mode 100644 index 0000000000..e29e8df254 --- /dev/null +++ b/Externals/libusbx/libusb/core.c @@ -0,0 +1,2228 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Core functions for libusbx + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2007-2008 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#ifdef __ANDROID__ +#include +#endif + +#include "libusbi.h" +#include "hotplug.h" + +#if defined(OS_LINUX) +const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; +#elif defined(OS_DARWIN) +const struct usbi_os_backend * const usbi_backend = &darwin_backend; +#elif defined(OS_OPENBSD) +const struct usbi_os_backend * const usbi_backend = &openbsd_backend; +#elif defined(OS_WINDOWS) +const struct usbi_os_backend * const usbi_backend = &windows_backend; +#elif defined(OS_WINCE) +const struct usbi_os_backend * const usbi_backend = &wince_backend; +#else +#error "Unsupported OS" +#endif + +struct libusb_context *usbi_default_context = NULL; +const struct libusb_version libusb_version_internal = + { LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, + LIBUSB_RC, "http://libusbx.org" }; +static int default_context_refcnt = 0; +static usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER; +static struct timeval timestamp_origin = { 0, 0 }; + +usbi_mutex_static_t active_contexts_lock = USBI_MUTEX_INITIALIZER; +struct list_head active_contexts_list; + +/** + * \mainpage libusbx-1.0 API Reference + * + * \section intro Introduction + * + * libusbx is an open source library that allows you to communicate with USB + * devices from userspace. For more info, see the + * libusbx homepage. + * + * This documentation is aimed at application developers wishing to + * communicate with USB peripherals from their own software. After reviewing + * this documentation, feedback and questions can be sent to the + * libusbx-devel mailing list. + * + * This documentation assumes knowledge of how to operate USB devices from + * a software standpoint (descriptors, configurations, interfaces, endpoints, + * control/bulk/interrupt/isochronous transfers, etc). Full information + * can be found in the USB 3.0 + * Specification which is available for free download. You can probably + * find less verbose introductions by searching the web. + * + * \section features Library features + * + * - All transfer types supported (control/bulk/interrupt/isochronous) + * - 2 transfer interfaces: + * -# Synchronous (simple) + * -# Asynchronous (more complicated, but more powerful) + * - Thread safe (although the asynchronous interface means that you + * usually won't need to thread) + * - Lightweight with lean API + * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer + * - Hotplug support (on some platforms). See \ref hotplug. + * + * \section gettingstarted Getting Started + * + * To begin reading the API documentation, start with the Modules page which + * links to the different categories of libusbx's functionality. + * + * One decision you will have to make is whether to use the synchronous + * or the asynchronous data transfer interface. The \ref io documentation + * provides some insight into this topic. + * + * Some example programs can be found in the libusbx source distribution under + * the "examples" subdirectory. The libusbx homepage includes a list of + * real-life project examples which use libusbx. + * + * \section errorhandling Error handling + * + * libusbx functions typically return 0 on success or a negative error code + * on failure. These negative error codes relate to LIBUSB_ERROR constants + * which are listed on the \ref misc "miscellaneous" documentation page. + * + * \section msglog Debug message logging + * + * libusbx uses stderr for all logging. By default, logging is set to NONE, + * which means that no output will be produced. However, unless the library + * has been compiled with logging disabled, then any application calls to + * libusb_set_debug(), or the setting of the environmental variable + * LIBUSB_DEBUG outside of the application, can result in logging being + * produced. Your application should therefore not close stderr, but instead + * direct it to the null device if its output is undesireable. + * + * The libusb_set_debug() function can be used to enable logging of certain + * messages. Under standard configuration, libusbx doesn't really log much + * so you are advised to use this function to enable all error/warning/ + * informational messages. It will help debug problems with your software. + * + * The logged messages are unstructured. There is no one-to-one correspondence + * between messages being logged and success or failure return codes from + * libusbx functions. There is no format to the messages, so you should not + * try to capture or parse them. They are not and will not be localized. + * These messages are not intended to being passed to your application user; + * instead, you should interpret the error codes returned from libusbx functions + * and provide appropriate notification to the user. The messages are simply + * there to aid you as a programmer, and if you're confused because you're + * getting a strange error code from a libusbx function, enabling message + * logging may give you a suitable explanation. + * + * The LIBUSB_DEBUG environment variable can be used to enable message logging + * at run-time. This environment variable should be set to a log level number, + * which is interpreted the same as the libusb_set_debug() parameter. When this + * environment variable is set, the message logging verbosity level is fixed + * and libusb_set_debug() effectively does nothing. + * + * libusbx can be compiled without any logging functions, useful for embedded + * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment + * variable have no effects. + * + * libusbx can also be compiled with verbose debugging messages always. When + * the library is compiled in this way, all messages of all verbosities are + * always logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable + * have no effects. + * + * \section remarks Other remarks + * + * libusbx does have imperfections. The \ref caveats "caveats" page attempts + * to document these. + */ + +/** + * \page caveats Caveats + * + * \section devresets Device resets + * + * The libusb_reset_device() function allows you to reset a device. If your + * program has to call such a function, it should obviously be aware that + * the reset will cause device state to change (e.g. register values may be + * reset). + * + * The problem is that any other program could reset the device your program + * is working with, at any time. libusbx does not offer a mechanism to inform + * you when this has happened, so if someone else resets your device it will + * not be clear to your own program why the device state has changed. + * + * Ultimately, this is a limitation of writing drivers in userspace. + * Separation from the USB stack in the underlying kernel makes it difficult + * for the operating system to deliver such notifications to your program. + * The Linux kernel USB stack allows such reset notifications to be delivered + * to in-kernel USB drivers, but it is not clear how such notifications could + * be delivered to second-class drivers that live in userspace. + * + * \section blockonly Blocking-only functionality + * + * The functionality listed below is only available through synchronous, + * blocking functions. There are no asynchronous/non-blocking alternatives, + * and no clear ways of implementing these. + * + * - Configuration activation (libusb_set_configuration()) + * - Interface/alternate setting activation (libusb_set_interface_alt_setting()) + * - Releasing of interfaces (libusb_release_interface()) + * - Clearing of halt/stall condition (libusb_clear_halt()) + * - Device resets (libusb_reset_device()) + * + * \section configsel Configuration selection and handling + * + * When libusbx presents a device handle to an application, there is a chance + * that the corresponding device may be in unconfigured state. For devices + * with multiple configurations, there is also a chance that the configuration + * currently selected is not the one that the application wants to use. + * + * The obvious solution is to add a call to libusb_set_configuration() early + * on during your device initialization routines, but there are caveats to + * be aware of: + * -# If the device is already in the desired configuration, calling + * libusb_set_configuration() using the same configuration value will cause + * a lightweight device reset. This may not be desirable behaviour. + * -# libusbx will be unable to change configuration if the device is in + * another configuration and other programs or drivers have claimed + * interfaces under that configuration. + * -# In the case where the desired configuration is already active, libusbx + * may not even be able to perform a lightweight device reset. For example, + * take my USB keyboard with fingerprint reader: I'm interested in driving + * the fingerprint reader interface through libusbx, but the kernel's + * USB-HID driver will almost always have claimed the keyboard interface. + * Because the kernel has claimed an interface, it is not even possible to + * perform the lightweight device reset, so libusb_set_configuration() will + * fail. (Luckily the device in question only has a single configuration.) + * + * One solution to some of the above problems is to consider the currently + * active configuration. If the configuration we want is already active, then + * we don't have to select any configuration: +\code +cfg = libusb_get_configuration(dev); +if (cfg != desired) + libusb_set_configuration(dev, desired); +\endcode + * + * This is probably suitable for most scenarios, but is inherently racy: + * another application or driver may change the selected configuration + * after the libusb_get_configuration() call. + * + * Even in cases where libusb_set_configuration() succeeds, consider that other + * applications or drivers may change configuration after your application + * calls libusb_set_configuration(). + * + * One possible way to lock your device into a specific configuration is as + * follows: + * -# Set the desired configuration (or use the logic above to realise that + * it is already in the desired configuration) + * -# Claim the interface that you wish to use + * -# Check that the currently active configuration is the one that you want + * to use. + * + * The above method works because once an interface is claimed, no application + * or driver is able to select another configuration. + * + * \section earlycomp Early transfer completion + * + * NOTE: This section is currently Linux-centric. I am not sure if any of these + * considerations apply to Darwin or other platforms. + * + * When a transfer completes early (i.e. when less data is received/sent in + * any one packet than the transfer buffer allows for) then libusbx is designed + * to terminate the transfer immediately, not transferring or receiving any + * more data unless other transfers have been queued by the user. + * + * On legacy platforms, libusbx is unable to do this in all situations. After + * the incomplete packet occurs, "surplus" data may be transferred. For recent + * versions of libusbx, this information is kept (the data length of the + * transfer is updated) and, for device-to-host transfers, any surplus data was + * added to the buffer. Still, this is not a nice solution because it loses the + * information about the end of the short packet, and the user probably wanted + * that surplus data to arrive in the next logical transfer. + * + * + * \section zlp Zero length packets + * + * - libusbx is able to send a packet of zero length to an endpoint simply by + * submitting a transfer of zero length. + * - The \ref libusb_transfer_flags::LIBUSB_TRANSFER_ADD_ZERO_PACKET + * "LIBUSB_TRANSFER_ADD_ZERO_PACKET" flag is currently only supported on Linux. + */ + +/** + * \page contexts Contexts + * + * It is possible that libusbx may be used simultaneously from two independent + * libraries linked into the same executable. For example, if your application + * has a plugin-like system which allows the user to dynamically load a range + * of modules into your program, it is feasible that two independently + * developed modules may both use libusbx. + * + * libusbx is written to allow for these multiple user scenarios. The two + * "instances" of libusbx will not interfere: libusb_set_debug() calls + * from one user will not affect the same settings for other users, other + * users can continue using libusbx after one of them calls libusb_exit(), etc. + * + * This is made possible through libusbx's context concept. When you + * call libusb_init(), you are (optionally) given a context. You can then pass + * this context pointer back into future libusbx functions. + * + * In order to keep things simple for more simplistic applications, it is + * legal to pass NULL to all functions requiring a context pointer (as long as + * you're sure no other code will attempt to use libusbx from the same process). + * When you pass NULL, the default context will be used. The default context + * is created the first time a process calls libusb_init() when no other + * context is alive. Contexts are destroyed during libusb_exit(). + * + * The default context is reference-counted and can be shared. That means that + * if libusb_init(NULL) is called twice within the same process, the two + * users end up sharing the same context. The deinitialization and freeing of + * the default context will only happen when the last user calls libusb_exit(). + * In other words, the default context is created and initialized when its + * reference count goes from 0 to 1, and is deinitialized and destroyed when + * its reference count goes from 1 to 0. + * + * You may be wondering why only a subset of libusbx functions require a + * context pointer in their function definition. Internally, libusbx stores + * context pointers in other objects (e.g. libusb_device instances) and hence + * can infer the context from those objects. + */ + +/** + * @defgroup lib Library initialization/deinitialization + * This page details how to initialize and deinitialize libusbx. Initialization + * must be performed before using any libusbx functionality, and similarly you + * must not call any libusbx functions after deinitialization. + */ + +/** + * @defgroup dev Device handling and enumeration + * The functionality documented below is designed to help with the following + * operations: + * - Enumerating the USB devices currently attached to the system + * - Choosing a device to operate from your software + * - Opening and closing the chosen device + * + * \section nutshell In a nutshell... + * + * The description below really makes things sound more complicated than they + * actually are. The following sequence of function calls will be suitable + * for almost all scenarios and does not require you to have such a deep + * understanding of the resource management issues: + * \code +// discover devices +libusb_device **list; +libusb_device *found = NULL; +ssize_t cnt = libusb_get_device_list(NULL, &list); +ssize_t i = 0; +int err = 0; +if (cnt < 0) + error(); + +for (i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + if (is_interesting(device)) { + found = device; + break; + } +} + +if (found) { + libusb_device_handle *handle; + + err = libusb_open(found, &handle); + if (err) + error(); + // etc +} + +libusb_free_device_list(list, 1); +\endcode + * + * The two important points: + * - You asked libusb_free_device_list() to unreference the devices (2nd + * parameter) + * - You opened the device before freeing the list and unreferencing the + * devices + * + * If you ended up with a handle, you can now proceed to perform I/O on the + * device. + * + * \section devshandles Devices and device handles + * libusbx has a concept of a USB device, represented by the + * \ref libusb_device opaque type. A device represents a USB device that + * is currently or was previously connected to the system. Using a reference + * to a device, you can determine certain information about the device (e.g. + * you can read the descriptor data). + * + * The libusb_get_device_list() function can be used to obtain a list of + * devices currently connected to the system. This is known as device + * discovery. + * + * Just because you have a reference to a device does not mean it is + * necessarily usable. The device may have been unplugged, you may not have + * permission to operate such device, or another program or driver may be + * using the device. + * + * When you've found a device that you'd like to operate, you must ask + * libusbx to open the device using the libusb_open() function. Assuming + * success, libusbx then returns you a device handle + * (a \ref libusb_device_handle pointer). All "real" I/O operations then + * operate on the handle rather than the original device pointer. + * + * \section devref Device discovery and reference counting + * + * Device discovery (i.e. calling libusb_get_device_list()) returns a + * freshly-allocated list of devices. The list itself must be freed when + * you are done with it. libusbx also needs to know when it is OK to free + * the contents of the list - the devices themselves. + * + * To handle these issues, libusbx provides you with two separate items: + * - A function to free the list itself + * - A reference counting system for the devices inside + * + * New devices presented by the libusb_get_device_list() function all have a + * reference count of 1. You can increase and decrease reference count using + * libusb_ref_device() and libusb_unref_device(). A device is destroyed when + * its reference count reaches 0. + * + * With the above information in mind, the process of opening a device can + * be viewed as follows: + * -# Discover devices using libusb_get_device_list(). + * -# Choose the device that you want to operate, and call libusb_open(). + * -# Unref all devices in the discovered device list. + * -# Free the discovered device list. + * + * The order is important - you must not unreference the device before + * attempting to open it, because unreferencing it may destroy the device. + * + * For convenience, the libusb_free_device_list() function includes a + * parameter to optionally unreference all the devices in the list before + * freeing the list itself. This combines steps 3 and 4 above. + * + * As an implementation detail, libusb_open() actually adds a reference to + * the device in question. This is because the device remains available + * through the handle via libusb_get_device(). The reference is deleted during + * libusb_close(). + */ + +/** @defgroup misc Miscellaneous */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +#define DISCOVERED_DEVICES_SIZE_STEP 8 + +static struct discovered_devs *discovered_devs_alloc(void) +{ + struct discovered_devs *ret = + malloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP)); + + if (ret) { + ret->len = 0; + ret->capacity = DISCOVERED_DEVICES_SIZE_STEP; + } + return ret; +} + +/* append a device to the discovered devices collection. may realloc itself, + * returning new discdevs. returns NULL on realloc failure. */ +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev) +{ + size_t len = discdevs->len; + size_t capacity; + + /* if there is space, just append the device */ + if (len < discdevs->capacity) { + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + return discdevs; + } + + /* exceeded capacity, need to grow */ + usbi_dbg("need to increase capacity"); + capacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP; + discdevs = usbi_reallocf(discdevs, + sizeof(*discdevs) + (sizeof(void *) * capacity)); + if (discdevs) { + discdevs->capacity = capacity; + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + } + + return discdevs; +} + +static void discovered_devs_free(struct discovered_devs *discdevs) +{ + size_t i; + + for (i = 0; i < discdevs->len; i++) + libusb_unref_device(discdevs->devices[i]); + + free(discdevs); +} + +/* Allocate a new device with a specific session ID. The returned device has + * a reference count of 1. */ +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id) +{ + size_t priv_size = usbi_backend->device_priv_size; + struct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size); + int r; + + if (!dev) + return NULL; + + r = usbi_mutex_init(&dev->lock, NULL); + if (r) { + free(dev); + return NULL; + } + + dev->ctx = ctx; + dev->refcnt = 1; + dev->session_data = session_id; + dev->speed = LIBUSB_SPEED_UNKNOWN; + + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + usbi_connect_device (dev); + } + + return dev; +} + +void usbi_connect_device(struct libusb_device *dev) +{ + libusb_hotplug_message message; + ssize_t ret; + + memset(&message, 0, sizeof(message)); + message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED; + message.device = dev; + dev->attached = 1; + + usbi_mutex_lock(&dev->ctx->usb_devs_lock); + list_add(&dev->list, &dev->ctx->usb_devs); + usbi_mutex_unlock(&dev->ctx->usb_devs_lock); + + /* Signal that an event has occurred for this device if we support hotplug AND + * the hotplug pipe is ready. This prevents an event from getting raised during + * initial enumeration. */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_pipe[1] > 0) { + ret = usbi_write(dev->ctx->hotplug_pipe[1], &message, sizeof(message)); + if (sizeof (message) != ret) { + usbi_err(DEVICE_CTX(dev), "error writing hotplug message"); + } + } +} + +void usbi_disconnect_device(struct libusb_device *dev) +{ + libusb_hotplug_message message; + struct libusb_context *ctx = dev->ctx; + ssize_t ret; + + memset(&message, 0, sizeof(message)); + message.event = LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT; + message.device = dev; + usbi_mutex_lock(&dev->lock); + dev->attached = 0; + usbi_mutex_unlock(&dev->lock); + + /* Signal that an event has occurred for this device if we support hotplug AND + * the hotplug pipe is ready. This prevents an event from getting raised during + * initial enumeration. libusb_handle_events will take care of dereferencing the + * device. */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_pipe[1] > 0) { + ret = usbi_write(dev->ctx->hotplug_pipe[1], &message, sizeof(message)); + if (sizeof(message) != ret) { + usbi_err(DEVICE_CTX(dev), "error writing hotplug message"); + } + } + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_del(&dev->list); + usbi_mutex_unlock(&ctx->usb_devs_lock); +} + +/* Perform some final sanity checks on a newly discovered device. If this + * function fails (negative return code), the device should not be added + * to the discovered device list. */ +int usbi_sanitize_device(struct libusb_device *dev) +{ + int r; + uint8_t num_configurations; + + r = usbi_device_cache_descriptor(dev); + if (r < 0) + return r; + + num_configurations = dev->device_descriptor.bNumConfigurations; + if (num_configurations > USB_MAXCONFIG) { + usbi_err(DEVICE_CTX(dev), "too many configurations"); + return LIBUSB_ERROR_IO; + } else if (0 == num_configurations) + usbi_dbg("zero configurations, maybe an unauthorized device"); + + dev->num_configurations = num_configurations; + return 0; +} + +/* Examine libusbx's internal list of known devices, looking for one with + * a specific session ID. Returns the matching device if it was found, and + * NULL otherwise. */ +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id) +{ + struct libusb_device *dev; + struct libusb_device *ret = NULL; + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) + if (dev->session_data == session_id) { + ret = dev; + break; + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + return ret; +} + +/** @ingroup dev + * Returns a list of USB devices currently attached to the system. This is + * your entry point into finding a USB device to operate. + * + * You are expected to unreference all the devices when you are done with + * them, and then free the list with libusb_free_device_list(). Note that + * libusb_free_device_list() can unref all the devices for you. Be careful + * not to unreference a device you are about to open until after you have + * opened it. + * + * This return value of this function indicates the number of devices in + * the resultant list. The list is actually one element larger, as it is + * NULL-terminated. + * + * \param ctx the context to operate on, or NULL for the default context + * \param list output location for a list of devices. Must be later freed with + * libusb_free_device_list(). + * \returns the number of devices in the outputted list, or any + * \ref libusb_error according to errors encountered by the backend. + */ +ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, + libusb_device ***list) +{ + struct discovered_devs *discdevs = discovered_devs_alloc(); + struct libusb_device **ret; + int r = 0; + ssize_t i, len; + USBI_GET_CONTEXT(ctx); + usbi_dbg(""); + + if (!discdevs) + return LIBUSB_ERROR_NO_MEM; + + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + /* backend provides hotplug support */ + struct libusb_device *dev; + + if (usbi_backend->hotplug_poll) + usbi_backend->hotplug_poll(); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) { + discdevs = discovered_devs_append(discdevs, dev); + + if (!discdevs) { + r = LIBUSB_ERROR_NO_MEM; + break; + } + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + } else { + /* backend does not provide hotplug support */ + r = usbi_backend->get_device_list(ctx, &discdevs); + } + + if (r < 0) { + len = r; + goto out; + } + + /* convert discovered_devs into a list */ + len = discdevs->len; + ret = calloc(len + 1, sizeof(struct libusb_device *)); + if (!ret) { + len = LIBUSB_ERROR_NO_MEM; + goto out; + } + + ret[len] = NULL; + for (i = 0; i < len; i++) { + struct libusb_device *dev = discdevs->devices[i]; + ret[i] = libusb_ref_device(dev); + } + *list = ret; + +out: + discovered_devs_free(discdevs); + return len; +} + +/** \ingroup dev + * Frees a list of devices previously discovered using + * libusb_get_device_list(). If the unref_devices parameter is set, the + * reference count of each device in the list is decremented by 1. + * \param list the list to free + * \param unref_devices whether to unref the devices in the list + */ +void API_EXPORTED libusb_free_device_list(libusb_device **list, + int unref_devices) +{ + if (!list) + return; + + if (unref_devices) { + int i = 0; + struct libusb_device *dev; + + while ((dev = list[i++]) != NULL) + libusb_unref_device(dev); + } + free(list); +} + +/** \ingroup dev + * Get the number of the bus that a device is connected to. + * \param dev a device + * \returns the bus number + */ +uint8_t API_EXPORTED libusb_get_bus_number(libusb_device *dev) +{ + return dev->bus_number; +} + +/** \ingroup dev + * Get the number of the port that a device is connected to. + * Unless the OS does something funky, or you are hot-plugging USB extension cards, + * the port number returned by this call is usually guaranteed to be uniquely tied + * to a physical port, meaning that different devices plugged on the same physical + * port should return the same port number. + * + * But outside of this, there is no guarantee that the port number returned by this + * call will remain the same, or even match the order in which ports have been + * numbered by the HUB/HCD manufacturer. + * + * \param dev a device + * \returns the port number (0 if not available) + */ +uint8_t API_EXPORTED libusb_get_port_number(libusb_device *dev) +{ + return dev->port_number; +} + +/** \ingroup dev + * Get the list of all port numbers from root for the specified device + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * \param dev a device + * \param port_numbers the array that should contain the port numbers + * \param port_numbers_len the maximum length of the array. As per the USB 3.0 + * specs, the current maximum limit for the depth is 7. + * \returns the number of elements filled + * \returns LIBUSB_ERROR_OVERFLOW if the array is too small + */ +int API_EXPORTED libusb_get_port_numbers(libusb_device *dev, + uint8_t* port_numbers, int port_numbers_len) +{ + int i = port_numbers_len; + + while(dev) { + // HCDs can be listed as devices and would have port #0 + // TODO: see how the other backends want to implement HCDs as parents + if (dev->port_number == 0) + break; + i--; + if (i < 0) { + usbi_warn(DEVICE_CTX(dev), + "port numbers array too small"); + return LIBUSB_ERROR_OVERFLOW; + } + port_numbers[i] = dev->port_number; + dev = dev->parent_dev; + } + memmove(port_numbers, &port_numbers[i], port_numbers_len - i); + return port_numbers_len - i; +} + +/** \ingroup dev + * Deprecated please use libusb_get_port_numbers instead. + */ +int API_EXPORTED libusb_get_port_path(libusb_context *ctx, libusb_device *dev, + uint8_t* port_numbers, uint8_t port_numbers_len) +{ + UNUSED(ctx); + + return libusb_get_port_numbers(dev, port_numbers, port_numbers_len); +} + +/** \ingroup dev + * Get the the parent from the specified device. + * \param dev a device + * \returns the device parent or NULL if not available + * You should issue a \ref libusb_get_device_list() before calling this + * function and make sure that you only access the parent before issuing + * \ref libusb_free_device_list(). The reason is that libusbx currently does + * not maintain a permanent list of device instances, and therefore can + * only guarantee that parents are fully instantiated within a + * libusb_get_device_list() - libusb_free_device_list() block. + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev) +{ + return dev->parent_dev; +} + +/** \ingroup dev + * Get the address of the device on the bus it is connected to. + * \param dev a device + * \returns the device address + */ +uint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev) +{ + return dev->device_address; +} + +/** \ingroup dev + * Get the negotiated connection speed for a device. + * \param dev a device + * \returns a \ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that + * the OS doesn't know or doesn't support returning the negotiated speed. + */ +int API_EXPORTED libusb_get_device_speed(libusb_device *dev) +{ + return dev->speed; +} + +static const struct libusb_endpoint_descriptor *find_endpoint( + struct libusb_config_descriptor *config, unsigned char endpoint) +{ + int iface_idx; + for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { + const struct libusb_interface *iface = &config->interface[iface_idx]; + int altsetting_idx; + + for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; + altsetting_idx++) { + const struct libusb_interface_descriptor *altsetting + = &iface->altsetting[altsetting_idx]; + int ep_idx; + + for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) { + const struct libusb_endpoint_descriptor *ep = + &altsetting->endpoint[ep_idx]; + if (ep->bEndpointAddress == endpoint) + return ep; + } + } + } + return NULL; +} + +/** \ingroup dev + * Convenience function to retrieve the wMaxPacketSize value for a particular + * endpoint in the active device configuration. + * + * This function was originally intended to be of assistance when setting up + * isochronous transfers, but a design mistake resulted in this function + * instead. It simply returns the wMaxPacketSize value without considering + * its contents. If you're dealing with isochronous transfers, you probably + * want libusb_get_max_iso_packet_size() instead. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the wMaxPacketSize value + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) + return LIBUSB_ERROR_NOT_FOUND; + + r = ep->wMaxPacketSize; + libusb_free_config_descriptor(config); + return r; +} + +/** \ingroup dev + * Calculate the maximum packet size which a specific endpoint is capable is + * sending or receiving in the duration of 1 microframe + * + * Only the active configuration is examined. The calculation is based on the + * wMaxPacketSize field in the endpoint descriptor as described in section + * 9.6.6 in the USB 2.0 specifications. + * + * If acting on an isochronous or interrupt endpoint, this function will + * multiply the value found in bits 0:10 by the number of transactions per + * microframe (determined by bits 11:12). Otherwise, this function just + * returns the numeric value found in bits 0:10. + * + * This function is useful for setting up isochronous transfers, for example + * you might pass the return value from this function to + * libusb_set_iso_packet_lengths() in order to set the length field of every + * isochronous packet in a transfer. + * + * Since v1.0.3. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the maximum packet size which can be sent/received on this endpoint + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + enum libusb_transfer_type ep_type; + uint16_t val; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) + return LIBUSB_ERROR_NOT_FOUND; + + val = ep->wMaxPacketSize; + ep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3); + libusb_free_config_descriptor(config); + + r = val & 0x07ff; + if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) + r *= (1 + ((val >> 11) & 3)); + return r; +} + +/** \ingroup dev + * Increment the reference count of a device. + * \param dev the device to reference + * \returns the same device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev) +{ + usbi_mutex_lock(&dev->lock); + dev->refcnt++; + usbi_mutex_unlock(&dev->lock); + return dev; +} + +/** \ingroup dev + * Decrement the reference count of a device. If the decrement operation + * causes the reference count to reach zero, the device shall be destroyed. + * \param dev the device to unreference + */ +void API_EXPORTED libusb_unref_device(libusb_device *dev) +{ + int refcnt; + + if (!dev) + return; + + usbi_mutex_lock(&dev->lock); + refcnt = --dev->refcnt; + usbi_mutex_unlock(&dev->lock); + + if (refcnt == 0) { + usbi_dbg("destroy device %d.%d", dev->bus_number, dev->device_address); + + libusb_unref_device(dev->parent_dev); + + if (usbi_backend->destroy_device) + usbi_backend->destroy_device(dev); + + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + /* backend does not support hotplug */ + usbi_disconnect_device(dev); + } + + usbi_mutex_destroy(&dev->lock); + free(dev); + } +} + +/* + * Interrupt the iteration of the event handling thread, so that it picks + * up the new fd. + */ +void usbi_fd_notification(struct libusb_context *ctx) +{ + unsigned char dummy = 1; + ssize_t r; + + if (ctx == NULL) + return; + + /* record that we are messing with poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify++; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* write some data on control pipe to interrupt event handlers */ + r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); + if (r <= 0) { + usbi_warn(ctx, "internal signalling write failed"); + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + return; + } + + /* take event handling lock */ + libusb_lock_events(ctx); + + /* read the dummy data */ + r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(ctx, "internal signalling read failed"); + + /* we're done with modifying poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* Release event handling lock and wake up event waiters */ + libusb_unlock_events(ctx); +} + +/** \ingroup dev + * Open a device and obtain a device handle. A handle allows you to perform + * I/O on the device in question. + * + * Internally, this function adds a reference to the device and makes it + * available to you through libusb_get_device(). This reference is removed + * during libusb_close(). + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev the device to open + * \param handle output location for the returned device handle pointer. Only + * populated when the return code is 0. + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_MEM on memory allocation failure + * \returns LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_open(libusb_device *dev, + libusb_device_handle **handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device_handle *_handle; + size_t priv_size = usbi_backend->device_handle_priv_size; + int r; + usbi_dbg("open %d.%d", dev->bus_number, dev->device_address); + + if (!dev->attached) { + return LIBUSB_ERROR_NO_DEVICE; + } + + _handle = malloc(sizeof(*_handle) + priv_size); + if (!_handle) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_mutex_init(&_handle->lock, NULL); + if (r) { + free(_handle); + return LIBUSB_ERROR_OTHER; + } + + _handle->dev = libusb_ref_device(dev); + _handle->auto_detach_kernel_driver = 0; + _handle->claimed_interfaces = 0; + memset(&_handle->os_priv, 0, priv_size); + + r = usbi_backend->open(_handle); + if (r < 0) { + usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r); + libusb_unref_device(dev); + usbi_mutex_destroy(&_handle->lock); + free(_handle); + return r; + } + + usbi_mutex_lock(&ctx->open_devs_lock); + list_add(&_handle->list, &ctx->open_devs); + usbi_mutex_unlock(&ctx->open_devs_lock); + *handle = _handle; + + /* At this point, we want to interrupt any existing event handlers so + * that they realise the addition of the new device's poll fd. One + * example when this is desirable is if the user is running a separate + * dedicated libusbx events handling thread, which is running with a long + * or infinite timeout. We want to interrupt that iteration of the loop, + * so that it picks up the new fd, and then continues. */ + usbi_fd_notification(ctx); + + return 0; +} + +/** \ingroup dev + * Convenience function for finding a device with a particular + * idVendor/idProduct combination. This function is intended + * for those scenarios where you are using libusbx to knock up a quick test + * application - it allows you to avoid calling libusb_get_device_list() and + * worrying about traversing/freeing the list. + * + * This function has limitations and is hence not intended for use in real + * applications: if multiple devices have the same IDs it will only + * give you the first one, etc. + * + * \param ctx the context to operate on, or NULL for the default context + * \param vendor_id the idVendor value to search for + * \param product_id the idProduct value to search for + * \returns a handle for the first found device, or NULL on error or if the + * device could not be found. */ +DEFAULT_VISIBILITY +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id) +{ + struct libusb_device **devs; + struct libusb_device *found = NULL; + struct libusb_device *dev; + struct libusb_device_handle *handle = NULL; + size_t i = 0; + int r; + + if (libusb_get_device_list(ctx, &devs) < 0) + return NULL; + + while ((dev = devs[i++]) != NULL) { + struct libusb_device_descriptor desc; + r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) + goto out; + if (desc.idVendor == vendor_id && desc.idProduct == product_id) { + found = dev; + break; + } + } + + if (found) { + r = libusb_open(found, &handle); + if (r < 0) + handle = NULL; + } + +out: + libusb_free_device_list(devs, 1); + return handle; +} + +static void do_close(struct libusb_context *ctx, + struct libusb_device_handle *dev_handle) +{ + struct usbi_transfer *itransfer; + struct usbi_transfer *tmp; + + libusb_lock_events(ctx); + + /* remove any transfers in flight that are for this device */ + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* safe iteration because transfers may be being deleted */ + list_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) { + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + if (transfer->dev_handle != dev_handle) + continue; + + if (!(itransfer->flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) { + usbi_err(ctx, "Device handle closed while transfer was still being processed, but the device is still connected as far as we know"); + + if (itransfer->flags & USBI_TRANSFER_CANCELLING) + usbi_warn(ctx, "A cancellation for an in-flight transfer hasn't completed but closing the device handle"); + else + usbi_err(ctx, "A cancellation hasn't even been scheduled on the transfer for which the device is closing"); + } + + /* remove from the list of in-flight transfers and make sure + * we don't accidentally use the device handle in the future + * (or that such accesses will be easily caught and identified as a crash) + */ + usbi_mutex_lock(&itransfer->lock); + list_del(&itransfer->list); + transfer->dev_handle = NULL; + usbi_mutex_unlock(&itransfer->lock); + + /* it is up to the user to free up the actual transfer struct. this is + * just making sure that we don't attempt to process the transfer after + * the device handle is invalid + */ + usbi_dbg("Removed transfer %p from the in-flight list because device handle %p closed", + transfer, dev_handle); + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + libusb_unlock_events(ctx); + + usbi_mutex_lock(&ctx->open_devs_lock); + list_del(&dev_handle->list); + usbi_mutex_unlock(&ctx->open_devs_lock); + + usbi_backend->close(dev_handle); + libusb_unref_device(dev_handle->dev); + usbi_mutex_destroy(&dev_handle->lock); + free(dev_handle); +} + +/** \ingroup dev + * Close a device handle. Should be called on all open handles before your + * application exits. + * + * Internally, this function destroys the reference that was added by + * libusb_open() on the given device. + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev_handle the handle to close + */ +void API_EXPORTED libusb_close(libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx; + unsigned char dummy = 1; + ssize_t r; + + if (!dev_handle) + return; + usbi_dbg(""); + + ctx = HANDLE_CTX(dev_handle); + + /* Similarly to libusb_open(), we want to interrupt all event handlers + * at this point. More importantly, we want to perform the actual close of + * the device while holding the event handling lock (preventing any other + * thread from doing event handling) because we will be removing a file + * descriptor from the polling loop. */ + + /* record that we are messing with poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify++; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* write some data on control pipe to interrupt event handlers */ + r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); + if (r <= 0) { + usbi_warn(ctx, "internal signalling write failed, closing anyway"); + do_close(ctx, dev_handle); + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + return; + } + + /* take event handling lock */ + libusb_lock_events(ctx); + + /* read the dummy data */ + r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(ctx, "internal signalling read failed, closing anyway"); + + /* Close the device */ + do_close(ctx, dev_handle); + + /* we're done with modifying poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* Release event handling lock and wake up event waiters */ + libusb_unlock_events(ctx); +} + +/** \ingroup dev + * Get the underlying device for a handle. This function does not modify + * the reference count of the returned device, so do not feel compelled to + * unreference it when you are done. + * \param dev_handle a device handle + * \returns the underlying device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle) +{ + return dev_handle->dev; +} + +/** \ingroup dev + * Determine the bConfigurationValue of the currently active configuration. + * + * You could formulate your own control request to obtain this information, + * but this function has the advantage that it may be able to retrieve the + * information from operating system caches (no I/O involved). + * + * If the OS does not cache this information, then this function will block + * while a control transfer is submitted to retrieve the information. + * + * This function will return a value of 0 in the config output + * parameter if the device is in unconfigured state. + * + * \param dev a device handle + * \param config output location for the bConfigurationValue of the active + * configuration (only valid for return code 0) + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev, + int *config) +{ + int r = LIBUSB_ERROR_NOT_SUPPORTED; + + usbi_dbg(""); + if (usbi_backend->get_configuration) + r = usbi_backend->get_configuration(dev, config); + + if (r == LIBUSB_ERROR_NOT_SUPPORTED) { + uint8_t tmp = 0; + usbi_dbg("falling back to control message"); + r = libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_CONFIGURATION, 0, 0, &tmp, 1, 1000); + if (r == 0) { + usbi_err(HANDLE_CTX(dev), "zero bytes returned in ctrl transfer?"); + r = LIBUSB_ERROR_IO; + } else if (r == 1) { + r = 0; + *config = tmp; + } else { + usbi_dbg("control failed, error %d", r); + } + } + + if (r == 0) + usbi_dbg("active config %d", *config); + + return r; +} + +/** \ingroup dev + * Set the active configuration for a device. + * + * The operating system may or may not have already set an active + * configuration on the device. It is up to your application to ensure the + * correct configuration is selected before you attempt to claim interfaces + * and perform other operations. + * + * If you call this function on a device already configured with the selected + * configuration, then this function will act as a lightweight device reset: + * it will issue a SET_CONFIGURATION request using the current configuration, + * causing most USB-related device state to be reset (altsetting reset to zero, + * endpoint halts cleared, toggles reset). + * + * You cannot change/reset configuration if your application has claimed + * interfaces. It is advised to set the desired configuration before claiming + * interfaces. + * + * Alternatively you can call libusb_release_interface() first. Note if you + * do things this way you must ensure that auto_detach_kernel_driver for + * dev is 0, otherwise the kernel driver will be re-attached when you + * release the interface(s). + * + * You cannot change/reset configuration if other applications or drivers have + * claimed interfaces. + * + * A configuration value of -1 will put the device in unconfigured state. + * The USB specifications state that a configuration value of 0 does this, + * however buggy devices exist which actually have a configuration 0. + * + * You should always use this function rather than formulating your own + * SET_CONFIGURATION control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev a device handle + * \param configuration the bConfigurationValue of the configuration you + * wish to activate, or -1 if you wish to put the device in unconfigured state + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist + * \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_set_configuration(libusb_device_handle *dev, + int configuration) +{ + usbi_dbg("configuration %d", configuration); + return usbi_backend->set_configuration(dev, configuration); +} + +/** \ingroup dev + * Claim an interface on a given device handle. You must claim the interface + * you wish to use before you can perform I/O on any of its endpoints. + * + * It is legal to attempt to claim an already-claimed interface, in which + * case libusbx just returns 0 without doing anything. + * + * If auto_detach_kernel_driver is set to 1 for dev, the kernel driver + * will be detached if necessary, on failure the detach error is returned. + * + * Claiming of interfaces is a purely logical operation; it does not cause + * any requests to be sent over the bus. Interface claiming is used to + * instruct the underlying operating system that your application wishes + * to take ownership of the interface. + * + * This is a non-blocking function. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the interface you + * wish to claim + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist + * \returns LIBUSB_ERROR_BUSY if another program or driver has claimed the + * interface + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns a LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_claim_interface(libusb_device_handle *dev, + int interface_number) +{ + int r = 0; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_mutex_lock(&dev->lock); + if (dev->claimed_interfaces & (1 << interface_number)) + goto out; + + r = usbi_backend->claim_interface(dev, interface_number); + if (r == 0) + dev->claimed_interfaces |= 1 << interface_number; + +out: + usbi_mutex_unlock(&dev->lock); + return r; +} + +/** \ingroup dev + * Release an interface previously claimed with libusb_claim_interface(). You + * should release all claimed interfaces before closing a device handle. + * + * This is a blocking function. A SET_INTERFACE control request will be sent + * to the device, resetting interface state to the first alternate setting. + * + * If auto_detach_kernel_driver is set to 1 for dev, the kernel + * driver will be re-attached after releasing the interface. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_release_interface(libusb_device_handle *dev, + int interface_number) +{ + int r; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev->lock); + if (!(dev->claimed_interfaces & (1 << interface_number))) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + r = usbi_backend->release_interface(dev, interface_number); + if (r == 0) + dev->claimed_interfaces &= ~(1 << interface_number); + +out: + usbi_mutex_unlock(&dev->lock); + return r; +} + +/** \ingroup dev + * Activate an alternate setting for an interface. The interface must have + * been previously claimed with libusb_claim_interface(). + * + * You should always use this function rather than formulating your own + * SET_INTERFACE control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \param alternate_setting the bAlternateSetting of the alternate + * setting to activate + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, or the + * requested alternate setting does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev, + int interface_number, int alternate_setting) +{ + usbi_dbg("interface %d altsetting %d", + interface_number, alternate_setting); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev->lock); + if (!dev->dev->attached) { + usbi_mutex_unlock(&dev->lock); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (!(dev->claimed_interfaces & (1 << interface_number))) { + usbi_mutex_unlock(&dev->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_mutex_unlock(&dev->lock); + + return usbi_backend->set_interface_altsetting(dev, interface_number, + alternate_setting); +} + +/** \ingroup dev + * Clear the halt/stall condition for an endpoint. Endpoints with halt status + * are unable to receive or transmit data until the halt condition is stalled. + * + * You should cancel all pending transfers before attempting to clear the halt + * condition. + * + * This is a blocking function. + * + * \param dev a device handle + * \param endpoint the endpoint to clear halt status + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_clear_halt(libusb_device_handle *dev, + unsigned char endpoint) +{ + usbi_dbg("endpoint %x", endpoint); + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + return usbi_backend->clear_halt(dev, endpoint); +} + +/** \ingroup dev + * Perform a USB port reset to reinitialize a device. The system will attempt + * to restore the previous configuration and alternate settings after the + * reset has completed. + * + * If the reset fails, the descriptors change, or the previous state cannot be + * restored, the device will appear to be disconnected and reconnected. This + * means that the device handle is no longer valid (you should close it) and + * rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates + * when this is the case. + * + * This is a blocking function which usually incurs a noticeable delay. + * + * \param dev a handle of the device to reset + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the + * device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_reset_device(libusb_device_handle *dev) +{ + usbi_dbg(""); + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + return usbi_backend->reset_device(dev); +} + +/** \ingroup dev + * Determine if a kernel driver is active on an interface. If a kernel driver + * is active, you cannot claim the interface, and libusbx will be unable to + * perform I/O. + * + * This functionality is not available on Windows. + * + * \param dev a device handle + * \param interface_number the interface to check + * \returns 0 if no kernel driver is active + * \returns 1 if a kernel driver is active + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_detach_kernel_driver() + */ +int API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->kernel_driver_active) + return usbi_backend->kernel_driver_active(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup dev + * Detach a kernel driver from an interface. If successful, you will then be + * able to claim the interface and perform I/O. + * + * This functionality is not available on Darwin or Windows. + * + * Note that libusbx itself also talks to the device through a special kernel + * driver, if this driver is already attached to the device, this call will + * not detach it and return LIBUSB_ERROR_NOT_FOUND. + * + * \param dev a device handle + * \param interface_number the interface to detach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->detach_kernel_driver) + return usbi_backend->detach_kernel_driver(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup dev + * Re-attach an interface's kernel driver, which was previously detached + * using libusb_detach_kernel_driver(). This call is only effective on + * Linux and returns LIBUSB_ERROR_NOT_SUPPORTED on all other platforms. + * + * This functionality is not available on Darwin or Windows. + * + * \param dev a device handle + * \param interface_number the interface to attach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns LIBUSB_ERROR_BUSY if the driver cannot be attached because the + * interface is claimed by a program or driver + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->attach_kernel_driver) + return usbi_backend->attach_kernel_driver(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup dev + * Enable/disable libusbx's automatic kernel driver detachment. When this is + * enabled libusbx will automatically detach the kernel driver on an interface + * when claiming the interface, and attach it when releasing the interface. + * + * Automatic kernel driver detachment is disabled on newly opened device + * handles by default. + * + * On platforms which do not have LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER + * this function will return LIBUSB_ERROR_NOT_SUPPORTED, and libusbx will + * continue as if this function was never called. + * + * \param dev a device handle + * \param enable whether to enable or disable auto kernel driver detachment + * + * \returns LIBUSB_SUCCESS on success + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \see libusb_claim_interface() + * \see libusb_release_interface() + * \see libusb_set_configuration() + */ +int API_EXPORTED libusb_set_auto_detach_kernel_driver( + libusb_device_handle *dev, int enable) +{ + if (!(usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) + return LIBUSB_ERROR_NOT_SUPPORTED; + + dev->auto_detach_kernel_driver = enable; + return LIBUSB_SUCCESS; +} + +/** \ingroup lib + * Set log message verbosity. + * + * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever + * printed. If you choose to increase the message verbosity level, ensure + * that your application does not close the stdout/stderr file descriptors. + * + * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusbx is conservative + * with its message logging and most of the time, will only log messages that + * explain error conditions and other oddities. This will help you debug + * your software. + * + * If the LIBUSB_DEBUG environment variable was set when libusbx was + * initialized, this function does nothing: the message verbosity is fixed + * to the value in the environment variable. + * + * If libusbx was compiled without any message logging, this function does + * nothing: you'll never get any messages. + * + * If libusbx was compiled with verbose debug message logging, this function + * does nothing: you'll always get messages from all levels. + * + * \param ctx the context to operate on, or NULL for the default context + * \param level debug level to set + */ +void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) +{ + USBI_GET_CONTEXT(ctx); + if (!ctx->debug_fixed) + ctx->debug = level; +} + +/** \ingroup lib + * Initialize libusb. This function must be called before calling any other + * libusbx function. + * + * If you do not provide an output location for a context pointer, a default + * context will be created. If there was already a default context, it will + * be reused (and nothing will be initialized/reinitialized). + * + * \param context Optional output location for context pointer. + * Only valid on return code 0. + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see contexts + */ +int API_EXPORTED libusb_init(libusb_context **context) +{ + struct libusb_device *dev, *next; + char *dbg = getenv("LIBUSB_DEBUG"); + struct libusb_context *ctx; + static int first_init = 1; + int r = 0; + + usbi_mutex_static_lock(&default_context_lock); + + if (!timestamp_origin.tv_sec) { + usbi_gettimeofday(×tamp_origin, NULL); + } + + if (!context && usbi_default_context) { + usbi_dbg("reusing default context"); + default_context_refcnt++; + usbi_mutex_static_unlock(&default_context_lock); + return 0; + } + + ctx = calloc(1, sizeof(*ctx)); + if (!ctx) { + r = LIBUSB_ERROR_NO_MEM; + goto err_unlock; + } + +#ifdef ENABLE_DEBUG_LOGGING + ctx->debug = LIBUSB_LOG_LEVEL_DEBUG; +#endif + + if (dbg) { + ctx->debug = atoi(dbg); + if (ctx->debug) + ctx->debug_fixed = 1; + } + + /* default context should be initialized before calling usbi_dbg */ + if (!usbi_default_context) { + usbi_default_context = ctx; + default_context_refcnt++; + usbi_dbg("created default context"); + } + + usbi_dbg("libusbx v%d.%d.%d.%d", libusb_version_internal.major, libusb_version_internal.minor, + libusb_version_internal.micro, libusb_version_internal.nano); + + usbi_mutex_init(&ctx->usb_devs_lock, NULL); + usbi_mutex_init(&ctx->open_devs_lock, NULL); + usbi_mutex_init(&ctx->hotplug_cbs_lock, NULL); + list_init(&ctx->usb_devs); + list_init(&ctx->open_devs); + list_init(&ctx->hotplug_cbs); + + usbi_mutex_static_lock(&active_contexts_lock); + if (first_init) { + first_init = 0; + list_init (&active_contexts_list); + } + list_add (&ctx->list, &active_contexts_list); + usbi_mutex_static_unlock(&active_contexts_lock); + + if (usbi_backend->init) { + r = usbi_backend->init(ctx); + if (r) + goto err_free_ctx; + } + + r = usbi_io_init(ctx); + if (r < 0) + goto err_backend_exit; + + usbi_mutex_static_unlock(&default_context_lock); + + if (context) + *context = ctx; + + return 0; + +err_backend_exit: + if (usbi_backend->exit) + usbi_backend->exit(); +err_free_ctx: + if (ctx == usbi_default_context) + usbi_default_context = NULL; + + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); + usbi_mutex_destroy(&ctx->hotplug_cbs_lock); + + usbi_mutex_static_lock(&active_contexts_lock); + list_del (&ctx->list); + usbi_mutex_static_unlock(&active_contexts_lock); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { + list_del(&dev->list); + libusb_unref_device(dev); + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + free(ctx); +err_unlock: + usbi_mutex_static_unlock(&default_context_lock); + return r; +} + +/** \ingroup lib + * Deinitialize libusb. Should be called after closing all open devices and + * before your application terminates. + * \param ctx the context to deinitialize, or NULL for the default context + */ +void API_EXPORTED libusb_exit(struct libusb_context *ctx) +{ + struct libusb_device *dev, *next; + + usbi_dbg(""); + USBI_GET_CONTEXT(ctx); + + /* if working with default context, only actually do the deinitialization + * if we're the last user */ + usbi_mutex_static_lock(&default_context_lock); + if (ctx == usbi_default_context) { + if (--default_context_refcnt > 0) { + usbi_dbg("not destroying default context"); + usbi_mutex_static_unlock(&default_context_lock); + return; + } + usbi_dbg("destroying default context"); + usbi_default_context = NULL; + } + usbi_mutex_static_unlock(&default_context_lock); + + usbi_mutex_static_lock(&active_contexts_lock); + list_del (&ctx->list); + usbi_mutex_static_unlock(&active_contexts_lock); + + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + usbi_hotplug_deregister_all(ctx); + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { + list_del(&dev->list); + libusb_unref_device(dev); + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + } + + /* a few sanity checks. don't bother with locking because unless + * there is an application bug, nobody will be accessing these. */ + if (!list_empty(&ctx->usb_devs)) + usbi_warn(ctx, "some libusb_devices were leaked"); + if (!list_empty(&ctx->open_devs)) + usbi_warn(ctx, "application left some devices open"); + + usbi_io_exit(ctx); + if (usbi_backend->exit) + usbi_backend->exit(); + + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); + usbi_mutex_destroy(&ctx->hotplug_cbs_lock); + free(ctx); +} + +/** \ingroup misc + * Check at runtime if the loaded library has a given capability. + * This call should be performed after \ref libusb_init(), to ensure the + * backend has updated its capability set. + * + * \param capability the \ref libusb_capability to check for + * \returns nonzero if the running library has the capability, 0 otherwise + */ +int API_EXPORTED libusb_has_capability(uint32_t capability) +{ + switch (capability) { + case LIBUSB_CAP_HAS_CAPABILITY: + return 1; + case LIBUSB_CAP_HAS_HOTPLUG: + return !(usbi_backend->get_device_list); + case LIBUSB_CAP_HAS_HID_ACCESS: + return (usbi_backend->caps & USBI_CAP_HAS_HID_ACCESS); + case LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER: + return (usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER); + } + return 0; +} + +/* this is defined in libusbi.h if needed */ +#ifdef LIBUSB_GETTIMEOFDAY_WIN32 +/* + * gettimeofday + * Implementation according to: + * The Open Group Base Specifications Issue 6 + * IEEE Std 1003.1, 2004 Edition + */ + +/* + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Contributed by: + * Danny Smith + */ + +/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */ +#define _W32_FT_OFFSET (116444736000000000) + +int usbi_gettimeofday(struct timeval *tp, void *tzp) +{ + union { + unsigned __int64 ns100; /* Time since 1 Jan 1601, in 100ns units */ + FILETIME ft; + } _now; + UNUSED(tzp); + + if(tp) { +#if defined(OS_WINCE) + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &_now.ft); +#else + GetSystemTimeAsFileTime (&_now.ft); +#endif + tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 ); + tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000); + } + /* Always return 0 as per Open Group Base Specifications Issue 6. + Do not set errno on error. */ + return 0; +} +#endif + +static void usbi_log_str(struct libusb_context *ctx, const char * str) +{ + UNUSED(ctx); + fputs(str, stderr); +} + +void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, va_list args) +{ + const char *prefix = ""; + char buf[USBI_MAX_LOG_LEN]; + struct timeval now; + int global_debug, header_len, text_len; + static int has_debug_header_been_displayed = 0; + +#ifdef ENABLE_DEBUG_LOGGING + global_debug = 1; + UNUSED(ctx); +#else + USBI_GET_CONTEXT(ctx); + if (ctx == NULL) + return; + global_debug = (ctx->debug == LIBUSB_LOG_LEVEL_DEBUG); + if (!ctx->debug) + return; + if (level == LIBUSB_LOG_LEVEL_WARNING && ctx->debug < LIBUSB_LOG_LEVEL_WARNING) + return; + if (level == LIBUSB_LOG_LEVEL_INFO && ctx->debug < LIBUSB_LOG_LEVEL_INFO) + return; + if (level == LIBUSB_LOG_LEVEL_DEBUG && ctx->debug < LIBUSB_LOG_LEVEL_DEBUG) + return; +#endif + +#ifdef __ANDROID__ + int prio; + switch (level) { + case LOG_LEVEL_INFO: + prio = ANDROID_LOG_INFO; + break; + case LOG_LEVEL_WARNING: + prio = ANDROID_LOG_WARN; + break; + case LOG_LEVEL_ERROR: + prio = ANDROID_LOG_ERROR; + break; + case LOG_LEVEL_DEBUG: + prio = ANDROID_LOG_DEBUG; + break; + default: + prio = ANDROID_LOG_UNKNOWN; + break; + } + + __android_log_vprint(prio, "LibUsb", format, args); +#else + usbi_gettimeofday(&now, NULL); + if ((global_debug) && (!has_debug_header_been_displayed)) { + has_debug_header_been_displayed = 1; + usbi_log_str(ctx, "[timestamp] [threadID] facility level [function call] \n"); + usbi_log_str(ctx, "--------------------------------------------------------------------------------\n"); + } + if (now.tv_usec < timestamp_origin.tv_usec) { + now.tv_sec--; + now.tv_usec += 1000000; + } + now.tv_sec -= timestamp_origin.tv_sec; + now.tv_usec -= timestamp_origin.tv_usec; + + switch (level) { + case LIBUSB_LOG_LEVEL_INFO: + prefix = "info"; + break; + case LIBUSB_LOG_LEVEL_WARNING: + prefix = "warning"; + break; + case LIBUSB_LOG_LEVEL_ERROR: + prefix = "error"; + break; + case LIBUSB_LOG_LEVEL_DEBUG: + prefix = "debug"; + break; + case LIBUSB_LOG_LEVEL_NONE: + break; + default: + prefix = "unknown"; + break; + } + + if (global_debug) { + header_len = snprintf(buf, sizeof(buf), + "[%2d.%06d] [%08x] libusbx: %s [%s] ", + (int)now.tv_sec, (int)now.tv_usec, usbi_get_tid(), prefix, function); + } else { + header_len = snprintf(buf, sizeof(buf), + "libusbx: %s [%s] ", prefix, function); + } + + if (header_len < 0 || header_len >= sizeof(buf)) { + /* Somehow snprintf failed to write to the buffer, + * remove the header so something useful is output. */ + header_len = 0; + } + /* Make sure buffer is NUL terminated */ + buf[header_len] = '\0'; + text_len = vsnprintf(buf + header_len, sizeof(buf) - header_len, + format, args); + if (text_len < 0 || text_len + header_len >= sizeof(buf)) { + /* Truncated log output. On some platforms a -1 return value means + * that the output was truncated. */ + text_len = sizeof(buf) - header_len; + } + if (header_len + text_len + sizeof(USBI_LOG_LINE_END) >= sizeof(buf)) { + /* Need to truncate the text slightly to fit on the terminator. */ + text_len -= (header_len + text_len + sizeof(USBI_LOG_LINE_END)) - sizeof(buf); + } + strcpy(buf + header_len + text_len, USBI_LOG_LINE_END); + + usbi_log_str(ctx, buf); +#endif +} + +void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, ...) +{ + va_list args; + + va_start (args, format); + usbi_log_v(ctx, level, function, format, args); + va_end (args); +} + +/** \ingroup misc + * Returns a constant NULL-terminated string with the ASCII name of a libusbx + * error or transfer status code. The caller must not free() the returned + * string. + * + * \param error_code The \ref libusb_error or libusb_transfer_status code to + * return the name of. + * \returns The error name, or the string **UNKNOWN** if the value of + * error_code is not a known error / status code. + */ +DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_error_name(int error_code) +{ + switch (error_code) { + case LIBUSB_ERROR_IO: + return "LIBUSB_ERROR_IO"; + case LIBUSB_ERROR_INVALID_PARAM: + return "LIBUSB_ERROR_INVALID_PARAM"; + case LIBUSB_ERROR_ACCESS: + return "LIBUSB_ERROR_ACCESS"; + case LIBUSB_ERROR_NO_DEVICE: + return "LIBUSB_ERROR_NO_DEVICE"; + case LIBUSB_ERROR_NOT_FOUND: + return "LIBUSB_ERROR_NOT_FOUND"; + case LIBUSB_ERROR_BUSY: + return "LIBUSB_ERROR_BUSY"; + case LIBUSB_ERROR_TIMEOUT: + return "LIBUSB_ERROR_TIMEOUT"; + case LIBUSB_ERROR_OVERFLOW: + return "LIBUSB_ERROR_OVERFLOW"; + case LIBUSB_ERROR_PIPE: + return "LIBUSB_ERROR_PIPE"; + case LIBUSB_ERROR_INTERRUPTED: + return "LIBUSB_ERROR_INTERRUPTED"; + case LIBUSB_ERROR_NO_MEM: + return "LIBUSB_ERROR_NO_MEM"; + case LIBUSB_ERROR_NOT_SUPPORTED: + return "LIBUSB_ERROR_NOT_SUPPORTED"; + case LIBUSB_ERROR_OTHER: + return "LIBUSB_ERROR_OTHER"; + + case LIBUSB_TRANSFER_ERROR: + return "LIBUSB_TRANSFER_ERROR"; + case LIBUSB_TRANSFER_TIMED_OUT: + return "LIBUSB_TRANSFER_TIMED_OUT"; + case LIBUSB_TRANSFER_CANCELLED: + return "LIBUSB_TRANSFER_CANCELLED"; + case LIBUSB_TRANSFER_STALL: + return "LIBUSB_TRANSFER_STALL"; + case LIBUSB_TRANSFER_NO_DEVICE: + return "LIBUSB_TRANSFER_NO_DEVICE"; + case LIBUSB_TRANSFER_OVERFLOW: + return "LIBUSB_TRANSFER_OVERFLOW"; + + case 0: + return "LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"; + default: + return "**UNKNOWN**"; + } +} + +/** \ingroup misc + * Returns a pointer to const struct libusb_version with the version + * (major, minor, micro, nano and rc) of the running library. + */ +DEFAULT_VISIBILITY +const struct libusb_version * LIBUSB_CALL libusb_get_version(void) +{ + return &libusb_version_internal; +} diff --git a/Externals/libusbx/libusb/descriptor.c b/Externals/libusbx/libusb/descriptor.c new file mode 100644 index 0000000000..ba6d1467d7 --- /dev/null +++ b/Externals/libusbx/libusb/descriptor.c @@ -0,0 +1,1197 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * USB descriptor handling functions for libusbx + * Copyright © 2007 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#include "libusbi.h" + +#define DESC_HEADER_LENGTH 2 +#define DEVICE_DESC_LENGTH 18 +#define CONFIG_DESC_LENGTH 9 +#define INTERFACE_DESC_LENGTH 9 +#define ENDPOINT_DESC_LENGTH 7 +#define ENDPOINT_AUDIO_DESC_LENGTH 9 + +/** @defgroup desc USB descriptors + * This page details how to examine the various standard USB descriptors + * for detected devices + */ + +/* set host_endian if the w values are already in host endian format, + * as opposed to bus endian. */ +int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, + void *dest, int host_endian) +{ + const unsigned char *sp = source; + unsigned char *dp = dest; + uint16_t w; + const char *cp; + uint32_t d; + + for (cp = descriptor; *cp; cp++) { + switch (*cp) { + case 'b': /* 8-bit byte */ + *dp++ = *sp++; + break; + case 'w': /* 16-bit word, convert from little endian to CPU */ + dp += ((uintptr_t)dp & 1); /* Align to word boundary */ + + if (host_endian) { + memcpy(dp, sp, 2); + } else { + w = (sp[1] << 8) | sp[0]; + *((uint16_t *)dp) = w; + } + sp += 2; + dp += 2; + break; + case 'd': /* 32-bit word, convert from little endian to CPU */ + dp += ((uintptr_t)dp & 1); /* Align to word boundary */ + + if (host_endian) { + memcpy(dp, sp, 4); + } else { + d = (sp[3] << 24) | (sp[2] << 16) | + (sp[1] << 8) | sp[0]; + *((uint32_t *)dp) = d; + } + sp += 4; + dp += 4; + break; + case 'u': /* 16 byte UUID */ + memcpy(dp, sp, 16); + sp += 16; + dp += 16; + break; + } + } + + return (int) (sp - source); +} + +static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint) +{ + if (endpoint->extra) + free((unsigned char *) endpoint->extra); +} + +static int parse_endpoint(struct libusb_context *ctx, + struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer, + int size, int host_endian) +{ + struct usb_descriptor_header header; + unsigned char *extra; + unsigned char *begin; + int parsed = 0; + int len; + + if (size < DESC_HEADER_LENGTH) { + usbi_err(ctx, "short endpoint descriptor read %d/%d", + size, DESC_HEADER_LENGTH); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + header.bDescriptorType, LIBUSB_DT_ENDPOINT); + return parsed; + } + if (header.bLength > size) { + usbi_warn(ctx, "short endpoint descriptor read %d/%d", + size, header.bLength); + return parsed; + } + if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian); + else if (header.bLength >= ENDPOINT_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian); + else { + usbi_err(ctx, "invalid endpoint bLength (%d)", header.bLength); + return LIBUSB_ERROR_IO; + } + + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + + /* Skip over the rest of the Class Specific or Vendor Specific */ + /* descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, "invalid extra ep desc len (%d)", + header.bLength); + return LIBUSB_ERROR_IO; + } else if (header.bLength > size) { + usbi_warn(ctx, "short extra ep desc read %d/%d", + size, header.bLength); + return parsed; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor %x", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + } + + /* Copy any unknown descriptors into a storage area for drivers */ + /* to later parse */ + len = (int)(buffer - begin); + if (!len) { + endpoint->extra = NULL; + endpoint->extra_length = 0; + return parsed; + } + + extra = malloc(len); + endpoint->extra = extra; + if (!extra) { + endpoint->extra_length = 0; + return LIBUSB_ERROR_NO_MEM; + } + + memcpy(extra, begin, len); + endpoint->extra_length = len; + + return parsed; +} + +static void clear_interface(struct libusb_interface *usb_interface) +{ + int i; + int j; + + if (usb_interface->altsetting) { + for (i = 0; i < usb_interface->num_altsetting; i++) { + struct libusb_interface_descriptor *ifp = + (struct libusb_interface_descriptor *) + usb_interface->altsetting + i; + if (ifp->extra) + free((void *) ifp->extra); + if (ifp->endpoint) { + for (j = 0; j < ifp->bNumEndpoints; j++) + clear_endpoint((struct libusb_endpoint_descriptor *) + ifp->endpoint + j); + free((void *) ifp->endpoint); + } + } + free((void *) usb_interface->altsetting); + usb_interface->altsetting = NULL; + } + +} + +static int parse_interface(libusb_context *ctx, + struct libusb_interface *usb_interface, unsigned char *buffer, int size, + int host_endian) +{ + int i; + int len; + int r; + int parsed = 0; + int interface_number = -1; + size_t tmp; + struct usb_descriptor_header header; + struct libusb_interface_descriptor *ifp; + unsigned char *begin; + + usb_interface->num_altsetting = 0; + + while (size >= INTERFACE_DESC_LENGTH) { + struct libusb_interface_descriptor *altsetting = + (struct libusb_interface_descriptor *) usb_interface->altsetting; + altsetting = usbi_reallocf(altsetting, + sizeof(struct libusb_interface_descriptor) * + (usb_interface->num_altsetting + 1)); + if (!altsetting) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + usb_interface->altsetting = altsetting; + + ifp = altsetting + usb_interface->num_altsetting; + usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0); + if (ifp->bDescriptorType != LIBUSB_DT_INTERFACE) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + ifp->bDescriptorType, LIBUSB_DT_INTERFACE); + return parsed; + } + if (ifp->bLength < INTERFACE_DESC_LENGTH) { + usbi_err(ctx, "invalid interface bLength (%d)", + ifp->bLength); + r = LIBUSB_ERROR_IO; + goto err; + } + if (ifp->bLength > size) { + usbi_warn(ctx, "short intf descriptor read %d/%d", + size, ifp->bLength); + return parsed; + } + if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { + usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints); + r = LIBUSB_ERROR_IO; + goto err; + } + + usb_interface->num_altsetting++; + ifp->extra = NULL; + ifp->extra_length = 0; + ifp->endpoint = NULL; + + if (interface_number == -1) + interface_number = ifp->bInterfaceNumber; + + /* Skip over the interface */ + buffer += ifp->bLength; + parsed += ifp->bLength; + size -= ifp->bLength; + + begin = buffer; + + /* Skip over any interface, class or vendor descriptors */ + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, + "invalid extra intf desc len (%d)", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } else if (header.bLength > size) { + usbi_warn(ctx, + "short extra intf desc read %d/%d", + size, header.bLength); + return parsed; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + buffer += header.bLength; + parsed += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + ifp->extra = malloc(len); + if (!ifp->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + memcpy((unsigned char *) ifp->extra, begin, len); + ifp->extra_length = len; + } + + if (ifp->bNumEndpoints > 0) { + struct libusb_endpoint_descriptor *endpoint; + tmp = ifp->bNumEndpoints * sizeof(struct libusb_endpoint_descriptor); + endpoint = malloc(tmp); + ifp->endpoint = endpoint; + if (!endpoint) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + memset(endpoint, 0, tmp); + for (i = 0; i < ifp->bNumEndpoints; i++) { + r = parse_endpoint(ctx, endpoint + i, buffer, size, + host_endian); + if (r < 0) + goto err; + if (r == 0) { + ifp->bNumEndpoints = (uint8_t)i; + break;; + } + + buffer += r; + parsed += r; + size -= r; + } + } + + /* We check to see if it's an alternate to this one */ + ifp = (struct libusb_interface_descriptor *) buffer; + if (size < LIBUSB_DT_INTERFACE_SIZE || + ifp->bDescriptorType != LIBUSB_DT_INTERFACE || + ifp->bInterfaceNumber != interface_number) + return parsed; + } + + return parsed; +err: + clear_interface(usb_interface); + return r; +} + +static void clear_configuration(struct libusb_config_descriptor *config) +{ + if (config->interface) { + int i; + for (i = 0; i < config->bNumInterfaces; i++) + clear_interface((struct libusb_interface *) + config->interface + i); + free((void *) config->interface); + } + if (config->extra) + free((void *) config->extra); +} + +static int parse_configuration(struct libusb_context *ctx, + struct libusb_config_descriptor *config, unsigned char *buffer, + int size, int host_endian) +{ + int i; + int r; + size_t tmp; + struct usb_descriptor_header header; + struct libusb_interface *usb_interface; + + if (size < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "short config descriptor read %d/%d", + size, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian); + if (config->bDescriptorType != LIBUSB_DT_CONFIG) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + config->bDescriptorType, LIBUSB_DT_CONFIG); + return LIBUSB_ERROR_IO; + } + if (config->bLength < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "invalid config bLength (%d)", config->bLength); + return LIBUSB_ERROR_IO; + } + if (config->bLength > size) { + usbi_err(ctx, "short config descriptor read %d/%d", + size, config->bLength); + return LIBUSB_ERROR_IO; + } + if (config->bNumInterfaces > USB_MAXINTERFACES) { + usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces); + return LIBUSB_ERROR_IO; + } + + tmp = config->bNumInterfaces * sizeof(struct libusb_interface); + usb_interface = malloc(tmp); + config->interface = usb_interface; + if (!config->interface) + return LIBUSB_ERROR_NO_MEM; + + memset(usb_interface, 0, tmp); + buffer += config->bLength; + size -= config->bLength; + + config->extra = NULL; + config->extra_length = 0; + + for (i = 0; i < config->bNumInterfaces; i++) { + int len; + unsigned char *begin; + + /* Skip over the rest of the Class Specific or Vendor */ + /* Specific descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, + "invalid extra config desc len (%d)", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } else if (header.bLength > size) { + usbi_warn(ctx, + "short extra config desc read %d/%d", + size, header.bLength); + config->bNumInterfaces = (uint8_t)i; + return size; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor 0x%x\n", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + /* FIXME: We should realloc and append here */ + if (!config->extra_length) { + config->extra = malloc(len); + if (!config->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + memcpy((unsigned char *) config->extra, begin, len); + config->extra_length = len; + } + } + + r = parse_interface(ctx, usb_interface + i, buffer, size, host_endian); + if (r < 0) + goto err; + if (r == 0) { + config->bNumInterfaces = (uint8_t)i; + break; + } + + buffer += r; + size -= r; + } + + return size; + +err: + clear_configuration(config); + return r; +} + +static int raw_desc_to_config(struct libusb_context *ctx, + unsigned char *buf, int size, int host_endian, + struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor *_config = malloc(sizeof(*_config)); + int r; + + if (!_config) + return LIBUSB_ERROR_NO_MEM; + + r = parse_configuration(ctx, _config, buf, size, host_endian); + if (r < 0) { + usbi_err(ctx, "parse_configuration failed with error %d", r); + free(_config); + return r; + } else if (r > 0) { + usbi_warn(ctx, "still %d bytes of descriptor data left", r); + } + + *config = _config; + return LIBUSB_SUCCESS; +} + +int usbi_device_cache_descriptor(libusb_device *dev) +{ + int r, host_endian = 0; + + r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, + &host_endian); + if (r < 0) + return r; + + if (!host_endian) { + dev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB); + dev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor); + dev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct); + dev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice); + } + + return LIBUSB_SUCCESS; +} + +/** \ingroup desc + * Get the USB device descriptor for a given device. + * + * This is a non-blocking function; the device descriptor is cached in memory. + * + * Note since libusbx-1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102, this + * function always succeeds. + * + * \param dev the device + * \param desc output location for the descriptor data + * \returns 0 on success or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc) +{ + usbi_dbg(""); + memcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor, + sizeof (dev->device_descriptor)); + return 0; +} + +/** \ingroup desc + * Get the USB configuration descriptor for the currently active configuration. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_config_descriptor + */ +int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor _config; + unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + r = usbi_backend->get_active_config_descriptor(dev, tmp, + LIBUSB_DT_CONFIG_SIZE, &host_endian); + if (r < 0) + return r; + if (r < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(dev->ctx, "short config descriptor read %d/%d", + r, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); + buf = malloc(_config.wTotalLength); + if (!buf) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_active_config_descriptor(dev, buf, + _config.wTotalLength, &host_endian); + if (r >= 0) + r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + + free(buf); + return r; +} + +/** \ingroup desc + * Get a USB configuration descriptor based on its index. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config_index the index of the configuration you wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor_by_value() + */ +int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor _config; + unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + usbi_dbg("index %d", config_index); + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_NOT_FOUND; + + r = usbi_backend->get_config_descriptor(dev, config_index, tmp, + LIBUSB_DT_CONFIG_SIZE, &host_endian); + if (r < 0) + return r; + if (r < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(dev->ctx, "short config descriptor read %d/%d", + r, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); + buf = malloc(_config.wTotalLength); + if (!buf) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_config_descriptor(dev, config_index, buf, + _config.wTotalLength, &host_endian); + if (r >= 0) + r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + + free(buf); + return r; +} + +/* iterate through all configurations, returning the index of the configuration + * matching a specific bConfigurationValue in the idx output parameter, or -1 + * if the config was not found. + * returns 0 or a LIBUSB_ERROR code + */ +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx) +{ + uint8_t i; + + usbi_dbg("value %d", bConfigurationValue); + for (i = 0; i < dev->num_configurations; i++) { + unsigned char tmp[6]; + int host_endian; + int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), + &host_endian); + if (r < 0) + return r; + if (tmp[5] == bConfigurationValue) { + *idx = i; + return 0; + } + } + + *idx = -1; + return 0; +} + +/** \ingroup desc + * Get a USB configuration descriptor with a specific bConfigurationValue. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param bConfigurationValue the bConfigurationValue of the configuration you + * wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor() + */ +int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config) +{ + int r, idx, host_endian; + unsigned char *buf = NULL; + + if (usbi_backend->get_config_descriptor_by_value) { + r = usbi_backend->get_config_descriptor_by_value(dev, + bConfigurationValue, &buf, &host_endian); + if (r < 0) + return r; + return raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + } + + r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx); + if (r < 0) + return r; + else if (idx == -1) + return LIBUSB_ERROR_NOT_FOUND; + else + return libusb_get_config_descriptor(dev, (uint8_t) idx, config); +} + +/** \ingroup desc + * Free a configuration descriptor obtained from + * libusb_get_active_config_descriptor() or libusb_get_config_descriptor(). + * It is safe to call this function with a NULL config parameter, in which + * case the function simply returns. + * + * \param config the configuration descriptor to free + */ +void API_EXPORTED libusb_free_config_descriptor( + struct libusb_config_descriptor *config) +{ + if (!config) + return; + + clear_configuration(config); + free(config); +} + +/** \ingroup desc + * Get an endpoints superspeed endpoint companion descriptor (if any) + * + * \param ctx the context to operate on, or NULL for the default context + * \param endpoint endpoint descriptor from which to get the superspeed + * endpoint companion descriptor + * \param ep_comp output location for the superspeed endpoint companion + * descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_ss_endpoint_companion_descriptor() after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_ss_endpoint_companion_descriptor( + struct libusb_context *ctx, + const struct libusb_endpoint_descriptor *endpoint, + struct libusb_ss_endpoint_companion_descriptor **ep_comp) +{ + struct usb_descriptor_header header; + int size = endpoint->extra_length; + const unsigned char *buffer = endpoint->extra; + + *ep_comp = NULL; + + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < 2 || header.bLength > size) { + usbi_err(ctx, "invalid descriptor length %d", + header.bLength); + return LIBUSB_ERROR_IO; + } + if (header.bDescriptorType != LIBUSB_DT_SS_ENDPOINT_COMPANION) { + buffer += header.bLength; + size -= header.bLength; + continue; + } + if (header.bLength < LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE) { + usbi_err(ctx, "invalid ss-ep-comp-desc length %d", + header.bLength); + return LIBUSB_ERROR_IO; + } + *ep_comp = malloc(sizeof(**ep_comp)); + if (*ep_comp == NULL) + return LIBUSB_ERROR_NO_MEM; + usbi_parse_descriptor(buffer, "bbbbw", *ep_comp, 0); + return LIBUSB_SUCCESS; + } + return LIBUSB_ERROR_NOT_FOUND; +} + +/** \ingroup desc + * Free a superspeed endpoint companion descriptor obtained from + * libusb_get_ss_endpoint_companion_descriptor(). + * It is safe to call this function with a NULL ep_comp parameter, in which + * case the function simply returns. + * + * \param ep_comp the superspeed endpoint companion descriptor to free + */ +void API_EXPORTED libusb_free_ss_endpoint_companion_descriptor( + struct libusb_ss_endpoint_companion_descriptor *ep_comp) +{ + free(ep_comp); +} + +static int parse_bos(struct libusb_context *ctx, + struct libusb_bos_descriptor **bos, + unsigned char *buffer, int size, int host_endian) +{ + struct libusb_bos_descriptor bos_header, *_bos; + struct libusb_bos_dev_capability_descriptor dev_cap; + int i; + + if (size < LIBUSB_DT_BOS_SIZE) { + usbi_err(ctx, "short bos descriptor read %d/%d", + size, LIBUSB_DT_BOS_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwb", &bos_header, host_endian); + if (bos_header.bDescriptorType != LIBUSB_DT_BOS) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + bos_header.bDescriptorType, LIBUSB_DT_BOS); + return LIBUSB_ERROR_IO; + } + if (bos_header.bLength < LIBUSB_DT_BOS_SIZE) { + usbi_err(ctx, "invalid bos bLength (%d)", bos_header.bLength); + return LIBUSB_ERROR_IO; + } + if (bos_header.bLength > size) { + usbi_err(ctx, "short bos descriptor read %d/%d", + size, bos_header.bLength); + return LIBUSB_ERROR_IO; + } + + _bos = calloc (1, + sizeof(*_bos) + bos_header.bNumDeviceCaps * sizeof(void *)); + if (!_bos) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor(buffer, "bbwb", _bos, host_endian); + buffer += bos_header.bLength; + size -= bos_header.bLength; + + /* Get the device capability descriptors */ + for (i = 0; i < bos_header.bNumDeviceCaps; i++) { + if (size < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { + usbi_warn(ctx, "short dev-cap descriptor read %d/%d", + size, LIBUSB_DT_DEVICE_CAPABILITY_SIZE); + break; + } + usbi_parse_descriptor(buffer, "bbb", &dev_cap, host_endian); + if (dev_cap.bDescriptorType != LIBUSB_DT_DEVICE_CAPABILITY) { + usbi_warn(ctx, "unexpected descriptor %x (expected %x)", + dev_cap.bDescriptorType, LIBUSB_DT_DEVICE_CAPABILITY); + break; + } + if (dev_cap.bLength < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { + usbi_err(ctx, "invalid dev-cap bLength (%d)", + dev_cap.bLength); + libusb_free_bos_descriptor(_bos); + return LIBUSB_ERROR_IO; + } + if (dev_cap.bLength > size) { + usbi_warn(ctx, "short dev-cap descriptor read %d/%d", + size, dev_cap.bLength); + break; + } + + _bos->dev_capability[i] = malloc(dev_cap.bLength); + if (!_bos->dev_capability[i]) { + libusb_free_bos_descriptor(_bos); + return LIBUSB_ERROR_NO_MEM; + } + memcpy(_bos->dev_capability[i], buffer, dev_cap.bLength); + buffer += dev_cap.bLength; + size -= dev_cap.bLength; + } + _bos->bNumDeviceCaps = (uint8_t)i; + *bos = _bos; + + return LIBUSB_SUCCESS; +} + +/** \ingroup desc + * Get a Binary Object Store (BOS) descriptor + * This is a BLOCKING function, which will send requests to the device. + * + * \param handle the handle of an open libusb device + * \param bos output location for the BOS descriptor. Only valid if 0 was returned. + * Must be freed with \ref libusb_free_bos_descriptor() after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the device doesn't have a BOS descriptor + * \returns another LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_bos_descriptor(libusb_device_handle *handle, + struct libusb_bos_descriptor **bos) +{ + struct libusb_bos_descriptor _bos; + uint8_t bos_header[LIBUSB_DT_BOS_SIZE] = {0}; + unsigned char *bos_data = NULL; + const int host_endian = 0; + int r; + + /* Read the BOS. This generates 2 requests on the bus, + * one for the header, and one for the full BOS */ + r = libusb_get_descriptor(handle, LIBUSB_DT_BOS, 0, bos_header, + LIBUSB_DT_BOS_SIZE); + if (r < 0) { + if (r != LIBUSB_ERROR_PIPE) + usbi_err(handle->dev->ctx, "failed to read BOS (%d)", r); + return r; + } + if (r < LIBUSB_DT_BOS_SIZE) { + usbi_err(handle->dev->ctx, "short BOS read %d/%d", + r, LIBUSB_DT_BOS_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(bos_header, "bbwb", &_bos, host_endian); + usbi_dbg("found BOS descriptor: size %d bytes, %d capabilities", + _bos.wTotalLength, _bos.bNumDeviceCaps); + bos_data = calloc(_bos.wTotalLength, 1); + if (bos_data == NULL) + return LIBUSB_ERROR_NO_MEM; + + r = libusb_get_descriptor(handle, LIBUSB_DT_BOS, 0, bos_data, + _bos.wTotalLength); + if (r >= 0) + r = parse_bos(handle->dev->ctx, bos, bos_data, r, host_endian); + else + usbi_err(handle->dev->ctx, "failed to read BOS (%d)", r); + + free(bos_data); + return r; +} + +/** \ingroup desc + * Free a BOS descriptor obtained from libusb_get_bos_descriptor(). + * It is safe to call this function with a NULL bos parameter, in which + * case the function simply returns. + * + * \param bos the BOS descriptor to free + */ +void API_EXPORTED libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos) +{ + int i; + + if (!bos) + return; + + for (i = 0; i < bos->bNumDeviceCaps; i++) + free(bos->dev_capability[i]); + free(bos); +} + +/** \ingroup desc + * Get an USB 2.0 Extension descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION + * LIBUSB_BT_USB_2_0_EXTENSION + * \param usb_2_0_extension output location for the USB 2.0 Extension + * descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_usb_2_0_extension_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_usb_2_0_extension_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension) +{ + struct libusb_usb_2_0_extension_descriptor *_usb_2_0_extension; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_USB_2_0_EXTENSION) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_USB_2_0_EXTENSION); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_USB_2_0_EXTENSION_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_USB_2_0_EXTENSION_SIZE); + return LIBUSB_ERROR_IO; + } + + _usb_2_0_extension = malloc(sizeof(*_usb_2_0_extension)); + if (!_usb_2_0_extension) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbd", + _usb_2_0_extension, host_endian); + + *usb_2_0_extension = _usb_2_0_extension; + return LIBUSB_SUCCESS; +} + +/** \ingroup desc + * Free a USB 2.0 Extension descriptor obtained from + * libusb_get_usb_2_0_extension_descriptor(). + * It is safe to call this function with a NULL usb_2_0_extension parameter, + * in which case the function simply returns. + * + * \param usb_2_0_extension the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_usb_2_0_extension_descriptor( + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension) +{ + free(usb_2_0_extension); +} + +/** \ingroup desc + * Get a SuperSpeed USB Device Capability descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * \param ss_usb_device_cap output location for the SuperSpeed USB Device + * Capability descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_ss_usb_device_capability_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_ss_usb_device_capability_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap) +{ + struct libusb_ss_usb_device_capability_descriptor *_ss_usb_device_cap; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE); + return LIBUSB_ERROR_IO; + } + + _ss_usb_device_cap = malloc(sizeof(*_ss_usb_device_cap)); + if (!_ss_usb_device_cap) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbwbbw", + _ss_usb_device_cap, host_endian); + + *ss_usb_device_cap = _ss_usb_device_cap; + return LIBUSB_SUCCESS; +} + +/** \ingroup desc + * Free a SuperSpeed USB Device Capability descriptor obtained from + * libusb_get_ss_usb_device_capability_descriptor(). + * It is safe to call this function with a NULL ss_usb_device_cap + * parameter, in which case the function simply returns. + * + * \param ss_usb_device_cap the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_ss_usb_device_capability_descriptor( + struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap) +{ + free(ss_usb_device_cap); +} + +/** \ingroup desc + * Get a Container ID descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID + * LIBUSB_BT_CONTAINER_ID + * \param container_id output location for the Container ID descriptor. + * Only valid if 0 was returned. Must be freed with + * libusb_free_container_id_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_container_id_descriptor **container_id) +{ + struct libusb_container_id_descriptor *_container_id; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_CONTAINER_ID) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_CONTAINER_ID); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_CONTAINER_ID_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_CONTAINER_ID_SIZE); + return LIBUSB_ERROR_IO; + } + + _container_id = malloc(sizeof(*_container_id)); + if (!_container_id) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbu", + _container_id, host_endian); + + *container_id = _container_id; + return LIBUSB_SUCCESS; +} + +/** \ingroup desc + * Free a Container ID descriptor obtained from + * libusb_get_container_id_descriptor(). + * It is safe to call this function with a NULL container_id parameter, + * in which case the function simply returns. + * + * \param container_id the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_container_id_descriptor( + struct libusb_container_id_descriptor *container_id) +{ + free(container_id); +} + +/** \ingroup desc + * Retrieve a string descriptor in C style ASCII. + * + * Wrapper around libusb_get_string_descriptor(). Uses the first language + * supported by the device. + * + * \param dev a device handle + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for ASCII string descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + uint8_t desc_index, unsigned char *data, int length) +{ + unsigned char tbuf[255]; /* Some devices choke on size > 255 */ + int r, si, di; + uint16_t langid; + + /* Asking for the zero'th index is special - it returns a string + * descriptor that contains all the language IDs supported by the + * device. Typically there aren't many - often only one. Language + * IDs are 16 bit numbers, and they start at the third byte in the + * descriptor. There's also no point in trying to read descriptor 0 + * with this function. See USB 2.0 specification section 9.6.7 for + * more information. + */ + + if (desc_index == 0) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_get_string_descriptor(dev, 0, 0, tbuf, sizeof(tbuf)); + if (r < 0) + return r; + + if (r < 4) + return LIBUSB_ERROR_IO; + + langid = tbuf[2] | (tbuf[3] << 8); + + r = libusb_get_string_descriptor(dev, desc_index, langid, tbuf, + sizeof(tbuf)); + if (r < 0) + return r; + + if (tbuf[1] != LIBUSB_DT_STRING) + return LIBUSB_ERROR_IO; + + if (tbuf[0] > r) + return LIBUSB_ERROR_IO; + + for (di = 0, si = 2; si < tbuf[0]; si += 2) { + if (di >= (length - 1)) + break; + + if ((tbuf[si] & 0x80) || (tbuf[si + 1])) /* non-ASCII */ + data[di++] = '?'; + else + data[di++] = tbuf[si]; + } + + data[di] = 0; + return di; +} diff --git a/Externals/libusbx/libusb/hotplug.c b/Externals/libusbx/libusb/hotplug.c new file mode 100644 index 0000000000..6b04342f08 --- /dev/null +++ b/Externals/libusbx/libusb/hotplug.c @@ -0,0 +1,320 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Hotplug functions for libusbx + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2012-2013 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include + +#include "libusbi.h" +#include "hotplug.h" + +/** + * @defgroup hotplug Device hotplug event notification + * This page details how to use the libusb hotplug interface, where available. + * + * Be mindful that not all platforms currently implement hotplug notification and + * that you should first call on \ref libusb_has_capability() with parameter + * \ref LIBUSB_CAP_HAS_HOTPLUG to confirm that hotplug support is available. + * + * \page hotplug Device hotplug event notification + * + * \section intro Introduction + * + * Version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102, has added support + * for hotplug events on some platforms (you should test if your platform + * supports hotplug notification by calling \ref libusb_has_capability() with + * parameter \ref LIBUSB_CAP_HAS_HOTPLUG). + * + * This interface allows you to request notification for the arrival and departure + * of matching USB devices. + * + * To receive hotplug notification you register a callback by calling + * \ref libusb_hotplug_register_callback(). This function will optionally return + * a handle that can be passed to \ref libusb_hotplug_deregister_callback(). + * + * A callback function must return an int (0 or 1) indicating whether the callback is + * expecting additional events. Returning 0 will rearm the callback and 1 will cause + * the callback to be deregistered. + * + * Callbacks for a particular context are automatically deregistered by libusb_exit(). + * + * As of 1.0.16 there are two supported hotplug events: + * - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: A device has arrived and is ready to use + * - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: A device has left and is no longer available + * + * A hotplug event can listen for either or both of these events. + * + * Note: If you receive notification that a device has left and you have any + * a libusb_device_handles for the device it is up to you to call libusb_close() + * on each handle to free up any remaining resources associated with the device. + * Once a device has left any libusb_device_handle associated with the device + * are invalid and will remain so even if the device comes back. + * + * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED event it is considered + * safe to call any libusbx function that takes a libusb_device. On the other hand, + * when handling a LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT event the only safe function + * is libusb_get_device_descriptor(). + * + * The following code provides an example of the usage of the hotplug interface: +\code +static int count = 0; + +int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event, void *user_data) { + static libusb_device_handle *handle = NULL; + struct libusb_device_descriptor desc; + int rc; + + (void)libusb_get_device_descriptor(dev, &desc); + + if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { + rc = libusb_open(dev, &handle); + if (LIBUSB_SUCCESS != rc) { + printf("Could not open USB device\n"); + } + } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { + if (handle) { + libusb_close(handle); + handle = NULL; + } + } else { + printf("Unhandled event %d\n", event); + } + count++; + + return 0; +} + +int main (void) { + libusb_hotplug_callback_handle handle; + int rc; + + libusb_init(NULL); + + rc = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, 0x045a, 0x5005, + LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, + &handle); + if (LIBUSB_SUCCESS != rc) { + printf("Error creating a hotplug callback\n"); + libusb_exit(NULL); + return EXIT_FAILURE; + } + + while (count < 2) { + usleep(10000); + } + + libusb_hotplug_deregister_callback(handle); + libusb_exit(NULL); + + return 0; +} +\endcode + */ + +static int usbi_hotplug_match_cb (struct libusb_context *ctx, + struct libusb_device *dev, libusb_hotplug_event event, + struct libusb_hotplug_callback *hotplug_cb) +{ + /* Handle lazy deregistration of callback */ + if (hotplug_cb->needs_free) { + /* Free callback */ + return 1; + } + + if (!(hotplug_cb->events & event)) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id && + hotplug_cb->vendor_id != dev->device_descriptor.idVendor) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id && + hotplug_cb->product_id != dev->device_descriptor.idProduct) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class && + hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) { + return 0; + } + + return hotplug_cb->cb (ctx == usbi_default_context ? NULL : ctx, + dev, event, hotplug_cb->user_data); +} + +void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event) +{ + struct libusb_hotplug_callback *hotplug_cb, *next; + int ret; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + ret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb); + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + if (ret) { + list_del(&hotplug_cb->list); + free(hotplug_cb); + } + } + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + /* loop through and disconnect all open handles for this device */ + if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { + struct libusb_device_handle *handle; + + usbi_mutex_lock(&ctx->open_devs_lock); + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + if (dev == handle->dev) { + usbi_handle_disconnect (handle); + } + } + usbi_mutex_unlock(&ctx->open_devs_lock); + } +} + +int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx, + libusb_hotplug_event events, libusb_hotplug_flag flags, + int vendor_id, int product_id, int dev_class, + libusb_hotplug_callback_fn cb_fn, void *user_data, + libusb_hotplug_callback_handle *handle) +{ + libusb_hotplug_callback *new_callback; + static int handle_id = 1; + + /* check for hotplug support */ + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + /* check for sane values */ + if ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) || + (LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) || + (LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) || + !cb_fn) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + USBI_GET_CONTEXT(ctx); + + new_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback)); + if (!new_callback) { + return LIBUSB_ERROR_NO_MEM; + } + + new_callback->ctx = ctx; + new_callback->vendor_id = vendor_id; + new_callback->product_id = product_id; + new_callback->dev_class = dev_class; + new_callback->flags = flags; + new_callback->events = events; + new_callback->cb = cb_fn; + new_callback->user_data = user_data; + new_callback->needs_free = 0; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + /* protect the handle by the context hotplug lock. it doesn't matter if the same handle + * is used for different contexts only that the handle is unique for this context */ + new_callback->handle = handle_id++; + + list_add(&new_callback->list, &ctx->hotplug_cbs); + + if (flags & LIBUSB_HOTPLUG_ENUMERATE) { + struct libusb_device *dev; + + usbi_mutex_lock(&ctx->usb_devs_lock); + + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) { + (void) usbi_hotplug_match_cb (ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, new_callback); + } + + usbi_mutex_unlock(&ctx->usb_devs_lock); + } + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + if (handle) { + *handle = new_callback->handle; + } + + return LIBUSB_SUCCESS; +} + +void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx, + libusb_hotplug_callback_handle handle) +{ + struct libusb_hotplug_callback *hotplug_cb; + libusb_hotplug_message message; + ssize_t ret; + + /* check for hotplug support */ + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + return; + } + + USBI_GET_CONTEXT(ctx); + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, + struct libusb_hotplug_callback) { + if (handle == hotplug_cb->handle) { + /* Mark this callback for deregistration */ + hotplug_cb->needs_free = 1; + } + } + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + /* wakeup handle_events to do the actual free */ + memset(&message, 0, sizeof(message)); + ret = usbi_write(ctx->hotplug_pipe[1], &message, sizeof(message)); + if (sizeof(message) != ret) { + usbi_err(ctx, "error writing hotplug message"); + } +} + +void usbi_hotplug_deregister_all(struct libusb_context *ctx) { + struct libusb_hotplug_callback *hotplug_cb, *next; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, + struct libusb_hotplug_callback) { + list_del(&hotplug_cb->list); + free(hotplug_cb); + } + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); +} diff --git a/Externals/libusbx/libusb/hotplug.h b/Externals/libusbx/libusb/hotplug.h new file mode 100644 index 0000000000..614ddbcff0 --- /dev/null +++ b/Externals/libusbx/libusb/hotplug.h @@ -0,0 +1,82 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Hotplug support for libusbx + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2012-2013 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(USBI_HOTPLUG_H) +#define USBI_HOTPLUG_H + +#ifndef LIBUSBI_H +#include "libusbi.h" +#endif + +/** \ingroup hotplug + * The hotplug callback structure. The user populates this structure with + * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback() + * to receive notification of hotplug events. + */ +struct libusb_hotplug_callback { + /** Context this callback is associated with */ + struct libusb_context *ctx; + + /** Vendor ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int vendor_id; + + /** Product ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int product_id; + + /** Device class to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int dev_class; + + /** Hotplug callback flags */ + libusb_hotplug_flag flags; + + /** Event(s) that will trigger this callback */ + libusb_hotplug_event events; + + /** Callback function to invoke for matching event/device */ + libusb_hotplug_callback_fn cb; + + /** Handle for this callback (used to match on deregister) */ + libusb_hotplug_callback_handle handle; + + /** User data that will be passed to the callback function */ + void *user_data; + + /** Callback is marked for deletion */ + int needs_free; + + /** List this callback is registered in (ctx->hotplug_cbs) */ + struct list_head list; +}; + +typedef struct libusb_hotplug_callback libusb_hotplug_callback; + +struct libusb_hotplug_message { + libusb_hotplug_event event; + struct libusb_device *device; +}; + +typedef struct libusb_hotplug_message libusb_hotplug_message; + +void usbi_hotplug_deregister_all(struct libusb_context *ctx); +void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event); + +#endif diff --git a/Externals/libusbx/libusb/io.c b/Externals/libusbx/libusb/io.c new file mode 100644 index 0000000000..4368b99457 --- /dev/null +++ b/Externals/libusbx/libusb/io.c @@ -0,0 +1,2566 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * I/O functions for libusbx + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include +#include +#ifdef HAVE_SIGNAL_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef USBI_TIMERFD_AVAILABLE +#include +#endif + +#include "libusbi.h" +#include "hotplug.h" + +/** + * \page io Synchronous and asynchronous device I/O + * + * \section intro Introduction + * + * If you're using libusbx in your application, you're probably wanting to + * perform I/O with devices - you want to perform USB data transfers. + * + * libusbx offers two separate interfaces for device I/O. This page aims to + * introduce the two in order to help you decide which one is more suitable + * for your application. You can also choose to use both interfaces in your + * application by considering each transfer on a case-by-case basis. + * + * Once you have read through the following discussion, you should consult the + * detailed API documentation pages for the details: + * - \ref syncio + * - \ref asyncio + * + * \section theory Transfers at a logical level + * + * At a logical level, USB transfers typically happen in two parts. For + * example, when reading data from a endpoint: + * -# A request for data is sent to the device + * -# Some time later, the incoming data is received by the host + * + * or when writing data to an endpoint: + * + * -# The data is sent to the device + * -# Some time later, the host receives acknowledgement from the device that + * the data has been transferred. + * + * There may be an indefinite delay between the two steps. Consider a + * fictional USB input device with a button that the user can press. In order + * to determine when the button is pressed, you would likely submit a request + * to read data on a bulk or interrupt endpoint and wait for data to arrive. + * Data will arrive when the button is pressed by the user, which is + * potentially hours later. + * + * libusbx offers both a synchronous and an asynchronous interface to performing + * USB transfers. The main difference is that the synchronous interface + * combines both steps indicated above into a single function call, whereas + * the asynchronous interface separates them. + * + * \section sync The synchronous interface + * + * The synchronous I/O interface allows you to perform a USB transfer with + * a single function call. When the function call returns, the transfer has + * completed and you can parse the results. + * + * If you have used the libusb-0.1 before, this I/O style will seem familar to + * you. libusb-0.1 only offered a synchronous interface. + * + * In our input device example, to read button presses you might write code + * in the following style: +\code +unsigned char data[4]; +int actual_length; +int r = libusb_bulk_transfer(handle, LIBUSB_ENDPOINT_IN, data, sizeof(data), &actual_length, 0); +if (r == 0 && actual_length == sizeof(data)) { + // results of the transaction can now be found in the data buffer + // parse them here and report button press +} else { + error(); +} +\endcode + * + * The main advantage of this model is simplicity: you did everything with + * a single simple function call. + * + * However, this interface has its limitations. Your application will sleep + * inside libusb_bulk_transfer() until the transaction has completed. If it + * takes the user 3 hours to press the button, your application will be + * sleeping for that long. Execution will be tied up inside the library - + * the entire thread will be useless for that duration. + * + * Another issue is that by tieing up the thread with that single transaction + * there is no possibility of performing I/O with multiple endpoints and/or + * multiple devices simultaneously, unless you resort to creating one thread + * per transaction. + * + * Additionally, there is no opportunity to cancel the transfer after the + * request has been submitted. + * + * For details on how to use the synchronous API, see the + * \ref syncio "synchronous I/O API documentation" pages. + * + * \section async The asynchronous interface + * + * Asynchronous I/O is the most significant new feature in libusb-1.0. + * Although it is a more complex interface, it solves all the issues detailed + * above. + * + * Instead of providing which functions that block until the I/O has complete, + * libusbx's asynchronous interface presents non-blocking functions which + * begin a transfer and then return immediately. Your application passes a + * callback function pointer to this non-blocking function, which libusbx will + * call with the results of the transaction when it has completed. + * + * Transfers which have been submitted through the non-blocking functions + * can be cancelled with a separate function call. + * + * The non-blocking nature of this interface allows you to be simultaneously + * performing I/O to multiple endpoints on multiple devices, without having + * to use threads. + * + * This added flexibility does come with some complications though: + * - In the interest of being a lightweight library, libusbx does not create + * threads and can only operate when your application is calling into it. Your + * application must call into libusbx from it's main loop when events are ready + * to be handled, or you must use some other scheme to allow libusbx to + * undertake whatever work needs to be done. + * - libusbx also needs to be called into at certain fixed points in time in + * order to accurately handle transfer timeouts. + * - Memory handling becomes more complex. You cannot use stack memory unless + * the function with that stack is guaranteed not to return until the transfer + * callback has finished executing. + * - You generally lose some linearity from your code flow because submitting + * the transfer request is done in a separate function from where the transfer + * results are handled. This becomes particularly obvious when you want to + * submit a second transfer based on the results of an earlier transfer. + * + * Internally, libusbx's synchronous interface is expressed in terms of function + * calls to the asynchronous interface. + * + * For details on how to use the asynchronous API, see the + * \ref asyncio "asynchronous I/O API" documentation pages. + */ + + +/** + * \page packetoverflow Packets and overflows + * + * \section packets Packet abstraction + * + * The USB specifications describe how data is transmitted in packets, with + * constraints on packet size defined by endpoint descriptors. The host must + * not send data payloads larger than the endpoint's maximum packet size. + * + * libusbx and the underlying OS abstract out the packet concept, allowing you + * to request transfers of any size. Internally, the request will be divided + * up into correctly-sized packets. You do not have to be concerned with + * packet sizes, but there is one exception when considering overflows. + * + * \section overflow Bulk/interrupt transfer overflows + * + * When requesting data on a bulk endpoint, libusbx requires you to supply a + * buffer and the maximum number of bytes of data that libusbx can put in that + * buffer. However, the size of the buffer is not communicated to the device - + * the device is just asked to send any amount of data. + * + * There is no problem if the device sends an amount of data that is less than + * or equal to the buffer size. libusbx reports this condition to you through + * the \ref libusb_transfer::actual_length "libusb_transfer.actual_length" + * field. + * + * Problems may occur if the device attempts to send more data than can fit in + * the buffer. libusbx reports LIBUSB_TRANSFER_OVERFLOW for this condition but + * other behaviour is largely undefined: actual_length may or may not be + * accurate, the chunk of data that can fit in the buffer (before overflow) + * may or may not have been transferred. + * + * Overflows are nasty, but can be avoided. Even though you were told to + * ignore packets above, think about the lower level details: each transfer is + * split into packets (typically small, with a maximum size of 512 bytes). + * Overflows can only happen if the final packet in an incoming data transfer + * is smaller than the actual packet that the device wants to transfer. + * Therefore, you will never see an overflow if your transfer buffer size is a + * multiple of the endpoint's packet size: the final packet will either + * fill up completely or will be only partially filled. + */ + +/** + * @defgroup asyncio Asynchronous device I/O + * + * This page details libusbx's asynchronous (non-blocking) API for USB device + * I/O. This interface is very powerful but is also quite complex - you will + * need to read this page carefully to understand the necessary considerations + * and issues surrounding use of this interface. Simplistic applications + * may wish to consider the \ref syncio "synchronous I/O API" instead. + * + * The asynchronous interface is built around the idea of separating transfer + * submission and handling of transfer completion (the synchronous model + * combines both of these into one). There may be a long delay between + * submission and completion, however the asynchronous submission function + * is non-blocking so will return control to your application during that + * potentially long delay. + * + * \section asyncabstraction Transfer abstraction + * + * For the asynchronous I/O, libusbx implements the concept of a generic + * transfer entity for all types of I/O (control, bulk, interrupt, + * isochronous). The generic transfer object must be treated slightly + * differently depending on which type of I/O you are performing with it. + * + * This is represented by the public libusb_transfer structure type. + * + * \section asynctrf Asynchronous transfers + * + * We can view asynchronous I/O as a 5 step process: + * -# Allocation: allocate a libusb_transfer + * -# Filling: populate the libusb_transfer instance with information + * about the transfer you wish to perform + * -# Submission: ask libusbx to submit the transfer + * -# Completion handling: examine transfer results in the + * libusb_transfer structure + * -# Deallocation: clean up resources + * + * + * \subsection asyncalloc Allocation + * + * This step involves allocating memory for a USB transfer. This is the + * generic transfer object mentioned above. At this stage, the transfer + * is "blank" with no details about what type of I/O it will be used for. + * + * Allocation is done with the libusb_alloc_transfer() function. You must use + * this function rather than allocating your own transfers. + * + * \subsection asyncfill Filling + * + * This step is where you take a previously allocated transfer and fill it + * with information to determine the message type and direction, data buffer, + * callback function, etc. + * + * You can either fill the required fields yourself or you can use the + * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer() + * and libusb_fill_interrupt_transfer(). + * + * \subsection asyncsubmit Submission + * + * When you have allocated a transfer and filled it, you can submit it using + * libusb_submit_transfer(). This function returns immediately but can be + * regarded as firing off the I/O request in the background. + * + * \subsection asynccomplete Completion handling + * + * After a transfer has been submitted, one of four things can happen to it: + * + * - The transfer completes (i.e. some data was transferred) + * - The transfer has a timeout and the timeout expires before all data is + * transferred + * - The transfer fails due to an error + * - The transfer is cancelled + * + * Each of these will cause the user-specified transfer callback function to + * be invoked. It is up to the callback function to determine which of the + * above actually happened and to act accordingly. + * + * The user-specified callback is passed a pointer to the libusb_transfer + * structure which was used to setup and submit the transfer. At completion + * time, libusbx has populated this structure with results of the transfer: + * success or failure reason, number of bytes of data transferred, etc. See + * the libusb_transfer structure documentation for more information. + * + * \subsection Deallocation + * + * When a transfer has completed (i.e. the callback function has been invoked), + * you are advised to free the transfer (unless you wish to resubmit it, see + * below). Transfers are deallocated with libusb_free_transfer(). + * + * It is undefined behaviour to free a transfer which has not completed. + * + * \section asyncresubmit Resubmission + * + * You may be wondering why allocation, filling, and submission are all + * separated above where they could reasonably be combined into a single + * operation. + * + * The reason for separation is to allow you to resubmit transfers without + * having to allocate new ones every time. This is especially useful for + * common situations dealing with interrupt endpoints - you allocate one + * transfer, fill and submit it, and when it returns with results you just + * resubmit it for the next interrupt. + * + * \section asynccancel Cancellation + * + * Another advantage of using the asynchronous interface is that you have + * the ability to cancel transfers which have not yet completed. This is + * done by calling the libusb_cancel_transfer() function. + * + * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the + * cancellation actually completes, the transfer's callback function will + * be invoked, and the callback function should check the transfer status to + * determine that it was cancelled. + * + * Freeing the transfer after it has been cancelled but before cancellation + * has completed will result in undefined behaviour. + * + * When a transfer is cancelled, some of the data may have been transferred. + * libusbx will communicate this to you in the transfer callback. Do not assume + * that no data was transferred. + * + * \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints + * + * If your device does not have predictable transfer sizes (or it misbehaves), + * your application may submit a request for data on an IN endpoint which is + * smaller than the data that the device wishes to send. In some circumstances + * this will cause an overflow, which is a nasty condition to deal with. See + * the \ref packetoverflow page for discussion. + * + * \section asyncctrl Considerations for control transfers + * + * The libusb_transfer structure is generic and hence does not + * include specific fields for the control-specific setup packet structure. + * + * In order to perform a control transfer, you must place the 8-byte setup + * packet at the start of the data buffer. To simplify this, you could + * cast the buffer pointer to type struct libusb_control_setup, or you can + * use the helper function libusb_fill_control_setup(). + * + * The wLength field placed in the setup packet must be the length you would + * expect to be sent in the setup packet: the length of the payload that + * follows (or the expected maximum number of bytes to receive). However, + * the length field of the libusb_transfer object must be the length of + * the data buffer - i.e. it should be wLength plus the size of + * the setup packet (LIBUSB_CONTROL_SETUP_SIZE). + * + * If you use the helper functions, this is simplified for you: + * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the + * data you are sending/requesting. + * -# Call libusb_fill_control_setup() on the data buffer, using the transfer + * request size as the wLength value (i.e. do not include the extra space you + * allocated for the control setup). + * -# If this is a host-to-device transfer, place the data to be transferred + * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE. + * -# Call libusb_fill_control_transfer() to associate the data buffer with + * the transfer (and to set the remaining details such as callback and timeout). + * - Note that there is no parameter to set the length field of the transfer. + * The length is automatically inferred from the wLength field of the setup + * packet. + * -# Submit the transfer. + * + * The multi-byte control setup fields (wValue, wIndex and wLength) must + * be given in little-endian byte order (the endianness of the USB bus). + * Endianness conversion is transparently handled by + * libusb_fill_control_setup() which is documented to accept host-endian + * values. + * + * Further considerations are needed when handling transfer completion in + * your callback function: + * - As you might expect, the setup packet will still be sitting at the start + * of the data buffer. + * - If this was a device-to-host transfer, the received data will be sitting + * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer. + * - The actual_length field of the transfer structure is relative to the + * wLength of the setup packet, rather than the size of the data buffer. So, + * if your wLength was 4, your transfer's length was 12, then you + * should expect an actual_length of 4 to indicate that the data was + * transferred in entirity. + * + * To simplify parsing of setup packets and obtaining the data from the + * correct offset, you may wish to use the libusb_control_transfer_get_data() + * and libusb_control_transfer_get_setup() functions within your transfer + * callback. + * + * Even though control endpoints do not halt, a completed control transfer + * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control + * request was not supported. + * + * \section asyncintr Considerations for interrupt transfers + * + * All interrupt transfers are performed using the polling interval presented + * by the bInterval value of the endpoint descriptor. + * + * \section asynciso Considerations for isochronous transfers + * + * Isochronous transfers are more complicated than transfers to + * non-isochronous endpoints. + * + * To perform I/O to an isochronous endpoint, allocate the transfer by calling + * libusb_alloc_transfer() with an appropriate number of isochronous packets. + * + * During filling, set \ref libusb_transfer::type "type" to + * \ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + * "LIBUSB_TRANSFER_TYPE_ISOCHRONOUS", and set + * \ref libusb_transfer::num_iso_packets "num_iso_packets" to a value less than + * or equal to the number of packets you requested during allocation. + * libusb_alloc_transfer() does not set either of these fields for you, given + * that you might not even use the transfer on an isochronous endpoint. + * + * Next, populate the length field for the first num_iso_packets entries in + * the \ref libusb_transfer::iso_packet_desc "iso_packet_desc" array. Section + * 5.6.3 of the USB2 specifications describe how the maximum isochronous + * packet length is determined by the wMaxPacketSize field in the endpoint + * descriptor. + * Two functions can help you here: + * + * - libusb_get_max_iso_packet_size() is an easy way to determine the max + * packet size for an isochronous endpoint. Note that the maximum packet + * size is actually the maximum number of bytes that can be transmitted in + * a single microframe, therefore this function multiplies the maximum number + * of bytes per transaction by the number of transaction opportunities per + * microframe. + * - libusb_set_iso_packet_lengths() assigns the same length to all packets + * within a transfer, which is usually what you want. + * + * For outgoing transfers, you'll obviously fill the buffer and populate the + * packet descriptors in hope that all the data gets transferred. For incoming + * transfers, you must ensure the buffer has sufficient capacity for + * the situation where all packets transfer the full amount of requested data. + * + * Completion handling requires some extra consideration. The + * \ref libusb_transfer::actual_length "actual_length" field of the transfer + * is meaningless and should not be examined; instead you must refer to the + * \ref libusb_iso_packet_descriptor::actual_length "actual_length" field of + * each individual packet. + * + * The \ref libusb_transfer::status "status" field of the transfer is also a + * little misleading: + * - If the packets were submitted and the isochronous data microframes + * completed normally, status will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED + * "LIBUSB_TRANSFER_COMPLETED". Note that bus errors and software-incurred + * delays are not counted as transfer errors; the transfer.status field may + * indicate COMPLETED even if some or all of the packets failed. Refer to + * the \ref libusb_iso_packet_descriptor::status "status" field of each + * individual packet to determine packet failures. + * - The status field will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR + * "LIBUSB_TRANSFER_ERROR" only when serious errors were encountered. + * - Other transfer status codes occur with normal behaviour. + * + * The data for each packet will be found at an offset into the buffer that + * can be calculated as if each prior packet completed in full. The + * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple() + * functions may help you here. + * + * \section asyncmem Memory caveats + * + * In most circumstances, it is not safe to use stack memory for transfer + * buffers. This is because the function that fired off the asynchronous + * transfer may return before libusbx has finished using the buffer, and when + * the function returns it's stack gets destroyed. This is true for both + * host-to-device and device-to-host transfers. + * + * The only case in which it is safe to use stack memory is where you can + * guarantee that the function owning the stack space for the buffer does not + * return until after the transfer's callback function has completed. In every + * other case, you need to use heap memory instead. + * + * \section asyncflags Fine control + * + * Through using this asynchronous interface, you may find yourself repeating + * a few simple operations many times. You can apply a bitwise OR of certain + * flags to a transfer to simplify certain things: + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK + * "LIBUSB_TRANSFER_SHORT_NOT_OK" results in transfers which transferred + * less than the requested amount of data being marked with status + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR" + * (they would normally be regarded as COMPLETED) + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusbx to free the transfer + * buffer when freeing the transfer. + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER + * "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusbx to automatically free the + * transfer after the transfer callback returns. + * + * \section asyncevent Event handling + * + * An asynchronous model requires that libusbx perform work at various + * points in time - namely processing the results of previously-submitted + * transfers and invoking the user-supplied callback function. + * + * This gives rise to the libusb_handle_events() function which your + * application must call into when libusbx has work do to. This gives libusbx + * the opportunity to reap pending transfers, invoke callbacks, etc. + * + * There are 2 different approaches to dealing with libusb_handle_events: + * + * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated + * thread. + * -# Integrate libusbx with your application's main event loop. libusbx + * exposes a set of file descriptors which allow you to do this. + * + * The first approach has the big advantage that it will also work on Windows + * were libusbx' poll API for select / poll integration is not available. So + * if you want to support Windows and use the async API, you must use this + * approach, see the \ref eventthread "Using an event handling thread" section + * below for details. + * + * If you prefer a single threaded approach with a single central event loop, + * see the \ref poll "polling and timing" section for how to integrate libusbx + * into your application's main event loop. + * + * \section eventthread Using an event handling thread + * + * Lets begin with stating the obvious: If you're going to use a separate + * thread for libusbx event handling, your callback functions MUST be + * threadsafe. + * + * Other then that doing event handling from a separate thread, is mostly + * simple. You can use an event thread function as follows: +\code +void *event_thread_func(void *ctx) +{ + while (event_thread_run) + libusb_handle_events(ctx); + + return NULL; +} +\endcode + * + * There is one caveat though, stopping this thread requires setting the + * event_thread_run variable to 0, and after that libusb_handle_events() needs + * to return control to event_thread_func. But unless some event happens, + * libusb_handle_events() will not return. + * + * There are 2 different ways of dealing with this, depending on if your + * application uses libusbx' \ref hotplug "hotplug" support or not. + * + * Applications which do not use hotplug support, should not start the event + * thread until after their first call to libusb_open(), and should stop the + * thread when closing the last open device as follows: +\code +void my_close_handle(libusb_device_handle *handle) +{ + if (open_devs == 1) + event_thread_run = 0; + + libusb_close(handle); // This wakes up libusb_handle_events() + + if (open_devs == 1) + pthread_join(event_thread); + + open_devs--; +} +\endcode + * + * Applications using hotplug support should start the thread at program init, + * after having successfully called libusb_hotplug_register_callback(), and + * should stop the thread at program exit as follows: +\code +void my_libusb_exit(void) +{ + event_thread_run = 0; + libusb_hotplug_deregister_callback(ctx, hotplug_cb_handle); // This wakes up libusb_handle_events() + pthread_join(event_thread); + libusb_exit(ctx); +} +\endcode + */ + +/** + * @defgroup poll Polling and timing + * + * This page documents libusbx's functions for polling events and timing. + * These functions are only necessary for users of the + * \ref asyncio "asynchronous API". If you are only using the simpler + * \ref syncio "synchronous API" then you do not need to ever call these + * functions. + * + * The justification for the functionality described here has already been + * discussed in the \ref asyncevent "event handling" section of the + * asynchronous API documentation. In summary, libusbx does not create internal + * threads for event processing and hence relies on your application calling + * into libusbx at certain points in time so that pending events can be handled. + * + * Your main loop is probably already calling poll() or select() or a + * variant on a set of file descriptors for other event sources (e.g. keyboard + * button presses, mouse movements, network sockets, etc). You then add + * libusbx's file descriptors to your poll()/select() calls, and when activity + * is detected on such descriptors you know it is time to call + * libusb_handle_events(). + * + * There is one final event handling complication. libusbx supports + * asynchronous transfers which time out after a specified time period. + * + * On some platforms a timerfd is used, so the timeout handling is just another + * fd, on other platforms this requires that libusbx is called into at or after + * the timeout to handle it. So, in addition to considering libusbx's file + * descriptors in your main event loop, you must also consider that libusbx + * sometimes needs to be called into at fixed points in time even when there + * is no file descriptor activity, see \ref polltime details. + * + * In order to know precisely when libusbx needs to be called into, libusbx + * offers you a set of pollable file descriptors and information about when + * the next timeout expires. + * + * If you are using the asynchronous I/O API, you must take one of the two + * following options, otherwise your I/O will not complete. + * + * \section pollsimple The simple option + * + * If your application revolves solely around libusbx and does not need to + * handle other event sources, you can have a program structure as follows: +\code +// initialize libusbx +// find and open device +// maybe fire off some initial async I/O + +while (user_has_not_requested_exit) + libusb_handle_events(ctx); + +// clean up and exit +\endcode + * + * With such a simple main loop, you do not have to worry about managing + * sets of file descriptors or handling timeouts. libusb_handle_events() will + * handle those details internally. + * + * \section pollmain The more advanced option + * + * \note This functionality is currently only available on Unix-like platforms. + * On Windows, libusb_get_pollfds() simply returns NULL. Applications which + * want to support Windows are advised to use an \ref eventthread + * "event handling thread" instead. + * + * In more advanced applications, you will already have a main loop which + * is monitoring other event sources: network sockets, X11 events, mouse + * movements, etc. Through exposing a set of file descriptors, libusbx is + * designed to cleanly integrate into such main loops. + * + * In addition to polling file descriptors for the other event sources, you + * take a set of file descriptors from libusbx and monitor those too. When you + * detect activity on libusbx's file descriptors, you call + * libusb_handle_events_timeout() in non-blocking mode. + * + * What's more, libusbx may also need to handle events at specific moments in + * time. No file descriptor activity is generated at these times, so your + * own application needs to be continually aware of when the next one of these + * moments occurs (through calling libusb_get_next_timeout()), and then it + * needs to call libusb_handle_events_timeout() in non-blocking mode when + * these moments occur. This means that you need to adjust your + * poll()/select() timeout accordingly. + * + * libusbx provides you with a set of file descriptors to poll and expects you + * to poll all of them, treating them as a single entity. The meaning of each + * file descriptor in the set is an internal implementation detail, + * platform-dependent and may vary from release to release. Don't try and + * interpret the meaning of the file descriptors, just do as libusbx indicates, + * polling all of them at once. + * + * In pseudo-code, you want something that looks like: +\code +// initialise libusbx + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + libusb_get_next_timeout(ctx); + poll(on libusbx file descriptors plus any other event sources of interest, + using a timeout no larger than the value libusbx just suggested) + if (poll() indicated activity on libusbx file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + if (time has elapsed to or beyond the libusbx timeout) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * \subsection polltime Notes on time-based events + * + * The above complication with having to track time and call into libusbx at + * specific moments is a bit of a headache. For maximum compatibility, you do + * need to write your main loop as above, but you may decide that you can + * restrict the supported platforms of your application and get away with + * a more simplistic scheme. + * + * These time-based event complications are \b not required on the following + * platforms: + * - Darwin + * - Linux, provided that the following version requirements are satisfied: + * - Linux v2.6.27 or newer, compiled with timerfd support + * - glibc v2.9 or newer + * - libusbx v1.0.5 or newer + * + * Under these configurations, libusb_get_next_timeout() will \em always return + * 0, so your main loop can be simplified to: +\code +// initialise libusbx + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + poll(on libusbx file descriptors plus any other event sources of interest, + using any timeout that you like) + if (poll() indicated activity on libusbx file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * Do remember that if you simplify your main loop to the above, you will + * lose compatibility with some platforms (including legacy Linux platforms, + * and any future platforms supported by libusbx which may have time-based + * event requirements). The resultant problems will likely appear as + * strange bugs in your application. + * + * You can use the libusb_pollfds_handle_timeouts() function to do a runtime + * check to see if it is safe to ignore the time-based event complications. + * If your application has taken the shortcut of ignoring libusbx's next timeout + * in your main loop, then you are advised to check the return value of + * libusb_pollfds_handle_timeouts() during application startup, and to abort + * if the platform does suffer from these timing complications. + * + * \subsection fdsetchange Changes in the file descriptor set + * + * The set of file descriptors that libusbx uses as event sources may change + * during the life of your application. Rather than having to repeatedly + * call libusb_get_pollfds(), you can set up notification functions for when + * the file descriptor set changes using libusb_set_pollfd_notifiers(). + * + * \subsection mtissues Multi-threaded considerations + * + * Unfortunately, the situation is complicated further when multiple threads + * come into play. If two threads are monitoring the same file descriptors, + * the fact that only one thread will be woken up when an event occurs causes + * some headaches. + * + * The events lock, event waiters lock, and libusb_handle_events_locked() + * entities are added to solve these problems. You do not need to be concerned + * with these entities otherwise. + * + * See the extra documentation: \ref mtasync + */ + +/** \page mtasync Multi-threaded applications and asynchronous I/O + * + * libusbx is a thread-safe library, but extra considerations must be applied + * to applications which interact with libusbx from multiple threads. + * + * The underlying issue that must be addressed is that all libusbx I/O + * revolves around monitoring file descriptors through the poll()/select() + * system calls. This is directly exposed at the + * \ref asyncio "asynchronous interface" but it is important to note that the + * \ref syncio "synchronous interface" is implemented on top of the + * asynchonrous interface, therefore the same considerations apply. + * + * The issue is that if two or more threads are concurrently calling poll() + * or select() on libusbx's file descriptors then only one of those threads + * will be woken up when an event arrives. The others will be completely + * oblivious that anything has happened. + * + * Consider the following pseudo-code, which submits an asynchronous transfer + * then waits for its completion. This style is one way you could implement a + * synchronous interface on top of the asynchronous interface (and libusbx + * does something similar, albeit more advanced due to the complications + * explained on this page). + * +\code +void cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; +} + +void myfunc() { + struct libusb_transfer *transfer; + unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE]; + int completed = 0; + + transfer = libusb_alloc_transfer(0); + libusb_fill_control_setup(buffer, + LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0); + libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000); + libusb_submit_transfer(transfer); + + while (!completed) { + poll(libusbx file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + printf("completed!"); + // other code here +} +\endcode + * + * Here we are serializing completion of an asynchronous event + * against a condition - the condition being completion of a specific transfer. + * The poll() loop has a long timeout to minimize CPU usage during situations + * when nothing is happening (it could reasonably be unlimited). + * + * If this is the only thread that is polling libusbx's file descriptors, there + * is no problem: there is no danger that another thread will swallow up the + * event that we are interested in. On the other hand, if there is another + * thread polling the same descriptors, there is a chance that it will receive + * the event that we were interested in. In this situation, myfunc() + * will only realise that the transfer has completed on the next iteration of + * the loop, up to 120 seconds later. Clearly a two-minute delay is + * undesirable, and don't even think about using short timeouts to circumvent + * this issue! + * + * The solution here is to ensure that no two threads are ever polling the + * file descriptors at the same time. A naive implementation of this would + * impact the capabilities of the library, so libusbx offers the scheme + * documented below to ensure no loss of functionality. + * + * Before we go any further, it is worth mentioning that all libusb-wrapped + * event handling procedures fully adhere to the scheme documented below. + * This includes libusb_handle_events() and its variants, and all the + * synchronous I/O functions - libusbx hides this headache from you. + * + * \section Using libusb_handle_events() from multiple threads + * + * Even when only using libusb_handle_events() and synchronous I/O functions, + * you can still have a race condition. You might be tempted to solve the + * above with libusb_handle_events() like so: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events(ctx); + } + printf("completed!"); +\endcode + * + * This however has a race between the checking of completed and + * libusb_handle_events() acquiring the events lock, so another thread + * could have completed the transfer, resulting in this thread hanging + * until either a timeout or another event occurs. See also commit + * 6696512aade99bb15d6792af90ae329af270eba6 which fixes this in the + * synchronous API implementation of libusb. + * + * Fixing this race requires checking the variable completed only after + * taking the event lock, which defeats the concept of just calling + * libusb_handle_events() without worrying about locking. This is why + * libusb-1.0.9 introduces the new libusb_handle_events_timeout_completed() + * and libusb_handle_events_completed() functions, which handles doing the + * completion check for you after they have acquired the lock: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events_completed(ctx, &completed); + } + printf("completed!"); +\endcode + * + * This nicely fixes the race in our example. Note that if all you want to + * do is submit a single transfer and wait for its completion, then using + * one of the synchronous I/O functions is much easier. + * + * \section eventlock The events lock + * + * The problem is when we consider the fact that libusbx exposes file + * descriptors to allow for you to integrate asynchronous USB I/O into + * existing main loops, effectively allowing you to do some work behind + * libusbx's back. If you do take libusbx's file descriptors and pass them to + * poll()/select() yourself, you need to be aware of the associated issues. + * + * The first concept to be introduced is the events lock. The events lock + * is used to serialize threads that want to handle events, such that only + * one thread is handling events at any one time. + * + * You must take the events lock before polling libusbx file descriptors, + * using libusb_lock_events(). You must release the lock as soon as you have + * aborted your poll()/select() loop, using libusb_unlock_events(). + * + * \section threadwait Letting other threads do the work for you + * + * Although the events lock is a critical part of the solution, it is not + * enough on it's own. You might wonder if the following is sufficient... +\code + libusb_lock_events(ctx); + while (!completed) { + poll(libusbx file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + libusb_unlock_events(ctx); +\endcode + * ...and the answer is that it is not. This is because the transfer in the + * code shown above may take a long time (say 30 seconds) to complete, and + * the lock is not released until the transfer is completed. + * + * Another thread with similar code that wants to do event handling may be + * working with a transfer that completes after a few milliseconds. Despite + * having such a quick completion time, the other thread cannot check that + * status of its transfer until the code above has finished (30 seconds later) + * due to contention on the lock. + * + * To solve this, libusbx offers you a mechanism to determine when another + * thread is handling events. It also offers a mechanism to block your thread + * until the event handling thread has completed an event (and this mechanism + * does not involve polling of file descriptors). + * + * After determining that another thread is currently handling events, you + * obtain the event waiters lock using libusb_lock_event_waiters(). + * You then re-check that some other thread is still handling events, and if + * so, you call libusb_wait_for_event(). + * + * libusb_wait_for_event() puts your application to sleep until an event + * occurs, or until a thread releases the events lock. When either of these + * things happen, your thread is woken up, and should re-check the condition + * it was waiting on. It should also re-check that another thread is handling + * events, and if not, it should start handling events itself. + * + * This looks like the following, as pseudo-code: +\code +retry: +if (libusb_try_lock_events(ctx) == 0) { + // we obtained the event lock: do our own event handling + while (!completed) { + if (!libusb_event_handling_ok(ctx)) { + libusb_unlock_events(ctx); + goto retry; + } + poll(libusbx file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_locked(ctx, 0); + } + libusb_unlock_events(ctx); +} else { + // another thread is doing event handling. wait for it to signal us that + // an event has completed + libusb_lock_event_waiters(ctx); + + while (!completed) { + // now that we have the event waiters lock, double check that another + // thread is still handling events for us. (it may have ceased handling + // events in the time it took us to reach this point) + if (!libusb_event_handler_active(ctx)) { + // whoever was handling events is no longer doing so, try again + libusb_unlock_event_waiters(ctx); + goto retry; + } + + libusb_wait_for_event(ctx, NULL); + } + libusb_unlock_event_waiters(ctx); +} +printf("completed!\n"); +\endcode + * + * A naive look at the above code may suggest that this can only support + * one event waiter (hence a total of 2 competing threads, the other doing + * event handling), because the event waiter seems to have taken the event + * waiters lock while waiting for an event. However, the system does support + * multiple event waiters, because libusb_wait_for_event() actually drops + * the lock while waiting, and reaquires it before continuing. + * + * We have now implemented code which can dynamically handle situations where + * nobody is handling events (so we should do it ourselves), and it can also + * handle situations where another thread is doing event handling (so we can + * piggyback onto them). It is also equipped to handle a combination of + * the two, for example, another thread is doing event handling, but for + * whatever reason it stops doing so before our condition is met, so we take + * over the event handling. + * + * Four functions were introduced in the above pseudo-code. Their importance + * should be apparent from the code shown above. + * -# libusb_try_lock_events() is a non-blocking function which attempts + * to acquire the events lock but returns a failure code if it is contended. + * -# libusb_event_handling_ok() checks that libusbx is still happy for your + * thread to be performing event handling. Sometimes, libusbx needs to + * interrupt the event handler, and this is how you can check if you have + * been interrupted. If this function returns 0, the correct behaviour is + * for you to give up the event handling lock, and then to repeat the cycle. + * The following libusb_try_lock_events() will fail, so you will become an + * events waiter. For more information on this, read \ref fullstory below. + * -# libusb_handle_events_locked() is a variant of + * libusb_handle_events_timeout() that you can call while holding the + * events lock. libusb_handle_events_timeout() itself implements similar + * logic to the above, so be sure not to call it when you are + * "working behind libusbx's back", as is the case here. + * -# libusb_event_handler_active() determines if someone is currently + * holding the events lock + * + * You might be wondering why there is no function to wake up all threads + * blocked on libusb_wait_for_event(). This is because libusbx can do this + * internally: it will wake up all such threads when someone calls + * libusb_unlock_events() or when a transfer completes (at the point after its + * callback has returned). + * + * \subsection fullstory The full story + * + * The above explanation should be enough to get you going, but if you're + * really thinking through the issues then you may be left with some more + * questions regarding libusbx's internals. If you're curious, read on, and if + * not, skip to the next section to avoid confusing yourself! + * + * The immediate question that may spring to mind is: what if one thread + * modifies the set of file descriptors that need to be polled while another + * thread is doing event handling? + * + * There are 2 situations in which this may happen. + * -# libusb_open() will add another file descriptor to the poll set, + * therefore it is desirable to interrupt the event handler so that it + * restarts, picking up the new descriptor. + * -# libusb_close() will remove a file descriptor from the poll set. There + * are all kinds of race conditions that could arise here, so it is + * important that nobody is doing event handling at this time. + * + * libusbx handles these issues internally, so application developers do not + * have to stop their event handlers while opening/closing devices. Here's how + * it works, focusing on the libusb_close() situation first: + * + * -# During initialization, libusbx opens an internal pipe, and it adds the read + * end of this pipe to the set of file descriptors to be polled. + * -# During libusb_close(), libusbx writes some dummy data on this control pipe. + * This immediately interrupts the event handler. libusbx also records + * internally that it is trying to interrupt event handlers for this + * high-priority event. + * -# At this point, some of the functions described above start behaving + * differently: + * - libusb_event_handling_ok() starts returning 1, indicating that it is NOT + * OK for event handling to continue. + * - libusb_try_lock_events() starts returning 1, indicating that another + * thread holds the event handling lock, even if the lock is uncontended. + * - libusb_event_handler_active() starts returning 1, indicating that + * another thread is doing event handling, even if that is not true. + * -# The above changes in behaviour result in the event handler stopping and + * giving up the events lock very quickly, giving the high-priority + * libusb_close() operation a "free ride" to acquire the events lock. All + * threads that are competing to do event handling become event waiters. + * -# With the events lock held inside libusb_close(), libusbx can safely remove + * a file descriptor from the poll set, in the safety of knowledge that + * nobody is polling those descriptors or trying to access the poll set. + * -# After obtaining the events lock, the close operation completes very + * quickly (usually a matter of milliseconds) and then immediately releases + * the events lock. + * -# At the same time, the behaviour of libusb_event_handling_ok() and friends + * reverts to the original, documented behaviour. + * -# The release of the events lock causes the threads that are waiting for + * events to be woken up and to start competing to become event handlers + * again. One of them will succeed; it will then re-obtain the list of poll + * descriptors, and USB I/O will then continue as normal. + * + * libusb_open() is similar, and is actually a more simplistic case. Upon a + * call to libusb_open(): + * + * -# The device is opened and a file descriptor is added to the poll set. + * -# libusbx sends some dummy data on the control pipe, and records that it + * is trying to modify the poll descriptor set. + * -# The event handler is interrupted, and the same behaviour change as for + * libusb_close() takes effect, causing all event handling threads to become + * event waiters. + * -# The libusb_open() implementation takes its free ride to the events lock. + * -# Happy that it has successfully paused the events handler, libusb_open() + * releases the events lock. + * -# The event waiter threads are all woken up and compete to become event + * handlers again. The one that succeeds will obtain the list of poll + * descriptors again, which will include the addition of the new device. + * + * \subsection concl Closing remarks + * + * The above may seem a little complicated, but hopefully I have made it clear + * why such complications are necessary. Also, do not forget that this only + * applies to applications that take libusbx's file descriptors and integrate + * them into their own polling loops. + * + * You may decide that it is OK for your multi-threaded application to ignore + * some of the rules and locks detailed above, because you don't think that + * two threads can ever be polling the descriptors at the same time. If that + * is the case, then that's good news for you because you don't have to worry. + * But be careful here; remember that the synchronous I/O functions do event + * handling internally. If you have one thread doing event handling in a loop + * (without implementing the rules and locking semantics documented above) + * and another trying to send a synchronous USB transfer, you will end up with + * two threads monitoring the same descriptors, and the above-described + * undesirable behaviour occuring. The solution is for your polling thread to + * play by the rules; the synchronous I/O functions do so, and this will result + * in them getting along in perfect harmony. + * + * If you do have a dedicated thread doing event handling, it is perfectly + * legal for it to take the event handling lock for long periods of time. Any + * synchronous I/O functions you call from other threads will transparently + * fall back to the "event waiters" mechanism detailed above. The only + * consideration that your event handling thread must apply is the one related + * to libusb_event_handling_ok(): you must call this before every poll(), and + * give up the events lock if instructed. + */ + +int usbi_io_init(struct libusb_context *ctx) +{ + int r; + + usbi_mutex_init(&ctx->flying_transfers_lock, NULL); + usbi_mutex_init(&ctx->pollfds_lock, NULL); + usbi_mutex_init(&ctx->pollfd_modify_lock, NULL); + usbi_mutex_init_recursive(&ctx->events_lock, NULL); + usbi_mutex_init(&ctx->event_waiters_lock, NULL); + usbi_cond_init(&ctx->event_waiters_cond, NULL); + list_init(&ctx->flying_transfers); + list_init(&ctx->pollfds); + + /* FIXME should use an eventfd on kernels that support it */ + r = usbi_pipe(ctx->ctrl_pipe); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto err; + } + + r = usbi_add_pollfd(ctx, ctx->ctrl_pipe[0], POLLIN); + if (r < 0) + goto err_close_pipe; + + /* create hotplug pipe */ + r = usbi_pipe(ctx->hotplug_pipe); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto err; + } + + r = usbi_add_pollfd(ctx, ctx->hotplug_pipe[0], POLLIN); + if (r < 0) + goto err_close_hp_pipe; + +#ifdef USBI_TIMERFD_AVAILABLE + ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(), + TFD_NONBLOCK); + if (ctx->timerfd >= 0) { + usbi_dbg("using timerfd for timeouts"); + r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN); + if (r < 0) { + usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]); + close(ctx->timerfd); + goto err_close_hp_pipe; + } + } else { + usbi_dbg("timerfd not available (code %d error %d)", ctx->timerfd, errno); + ctx->timerfd = -1; + } +#endif + + return 0; + +err_close_hp_pipe: + usbi_close(ctx->hotplug_pipe[0]); + usbi_close(ctx->hotplug_pipe[1]); +err_close_pipe: + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); +err: + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->pollfds_lock); + usbi_mutex_destroy(&ctx->pollfd_modify_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); + return r; +} + +void usbi_io_exit(struct libusb_context *ctx) +{ + usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); + usbi_remove_pollfd(ctx, ctx->hotplug_pipe[0]); + usbi_close(ctx->hotplug_pipe[0]); + usbi_close(ctx->hotplug_pipe[1]); +#ifdef USBI_TIMERFD_AVAILABLE + if (usbi_using_timerfd(ctx)) { + usbi_remove_pollfd(ctx, ctx->timerfd); + close(ctx->timerfd); + } +#endif + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->pollfds_lock); + usbi_mutex_destroy(&ctx->pollfd_modify_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); +} + +static int calculate_timeout(struct usbi_transfer *transfer) +{ + int r; + struct timespec current_time; + unsigned int timeout = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout; + + if (!timeout) + return 0; + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); + if (r < 0) { + usbi_err(ITRANSFER_CTX(transfer), + "failed to read monotonic clock, errno=%d", errno); + return r; + } + + current_time.tv_sec += timeout / 1000; + current_time.tv_nsec += (timeout % 1000) * 1000000; + + while (current_time.tv_nsec >= 1000000000) { + current_time.tv_nsec -= 1000000000; + current_time.tv_sec++; + } + + TIMESPEC_TO_TIMEVAL(&transfer->timeout, ¤t_time); + return 0; +} + +/* add a transfer to the (timeout-sorted) active transfers list. + * Callers of this function must hold the flying_transfers_lock. + * This function *always* adds the transfer to the flying_transfers list, + * it will return non 0 if it fails to update the timer, but even then the + * transfer is added to the flying_transfers list. */ +static int add_to_flying_list(struct usbi_transfer *transfer) +{ + struct usbi_transfer *cur; + struct timeval *timeout = &transfer->timeout; + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + int r = 0; + int first = 1; + + /* if we have no other flying transfers, start the list with this one */ + if (list_empty(&ctx->flying_transfers)) { + list_add(&transfer->list, &ctx->flying_transfers); + goto out; + } + + /* if we have infinite timeout, append to end of list */ + if (!timerisset(timeout)) { + list_add_tail(&transfer->list, &ctx->flying_transfers); + /* first is irrelevant in this case */ + goto out; + } + + /* otherwise, find appropriate place in list */ + list_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) { + /* find first timeout that occurs after the transfer in question */ + struct timeval *cur_tv = &cur->timeout; + + if (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) || + (cur_tv->tv_sec == timeout->tv_sec && + cur_tv->tv_usec > timeout->tv_usec)) { + list_add_tail(&transfer->list, &cur->list); + goto out; + } + first = 0; + } + /* first is 0 at this stage (list not empty) */ + + /* otherwise we need to be inserted at the end */ + list_add_tail(&transfer->list, &ctx->flying_transfers); +out: +#ifdef USBI_TIMERFD_AVAILABLE + if (first && usbi_using_timerfd(ctx) && timerisset(timeout)) { + /* if this transfer has the lowest timeout of all active transfers, + * rearm the timerfd with this transfer's timeout */ + const struct itimerspec it = { {0, 0}, + { timeout->tv_sec, timeout->tv_usec * 1000 } }; + usbi_dbg("arm timerfd for timeout in %dms (first in line)", + USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) { + usbi_warn(ctx, "failed to arm first timerfd (errno %d)", errno); + r = LIBUSB_ERROR_OTHER; + } + } +#else + UNUSED(first); +#endif + + return r; +} + +/** \ingroup asyncio + * Allocate a libusbx transfer with a specified number of isochronous packet + * descriptors. The returned transfer is pre-initialized for you. When the new + * transfer is no longer needed, it should be freed with + * libusb_free_transfer(). + * + * Transfers intended for non-isochronous endpoints (e.g. control, bulk, + * interrupt) should specify an iso_packets count of zero. + * + * For transfers intended for isochronous endpoints, specify an appropriate + * number of packet descriptors to be allocated as part of the transfer. + * The returned transfer is not specially initialized for isochronous I/O; + * you are still required to set the + * \ref libusb_transfer::num_iso_packets "num_iso_packets" and + * \ref libusb_transfer::type "type" fields accordingly. + * + * It is safe to allocate a transfer with some isochronous packets and then + * use it on a non-isochronous endpoint. If you do this, ensure that at time + * of submission, num_iso_packets is 0 and that type is set appropriately. + * + * \param iso_packets number of isochronous packet descriptors to allocate + * \returns a newly allocated transfer, or NULL on error + */ +DEFAULT_VISIBILITY +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer( + int iso_packets) +{ + size_t os_alloc_size = usbi_backend->transfer_priv_size + + (usbi_backend->add_iso_packet_size * iso_packets); + size_t alloc_size = sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (sizeof(struct libusb_iso_packet_descriptor) * iso_packets) + + os_alloc_size; + struct usbi_transfer *itransfer = calloc(1, alloc_size); + if (!itransfer) + return NULL; + + itransfer->num_iso_packets = iso_packets; + usbi_mutex_init(&itransfer->lock, NULL); + return USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); +} + +/** \ingroup asyncio + * Free a transfer structure. This should be called for all transfers + * allocated with libusb_alloc_transfer(). + * + * If the \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" flag is set and the transfer buffer is + * non-NULL, this function will also free the transfer buffer using the + * standard system memory allocator (e.g. free()). + * + * It is legal to call this function with a NULL transfer. In this case, + * the function will simply return safely. + * + * It is not legal to free an active transfer (one which has been submitted + * and has not yet completed). + * + * \param transfer the transfer to free + */ +void API_EXPORTED libusb_free_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer; + if (!transfer) + return; + + if (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer) + free(transfer->buffer); + + itransfer = LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + usbi_mutex_destroy(&itransfer->lock); + free(itransfer); +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int disarm_timerfd(struct libusb_context *ctx) +{ + const struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } }; + int r; + + usbi_dbg(""); + r = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + else + return 0; +} + +/* iterates through the flying transfers, and rearms the timerfd based on the + * next upcoming timeout. + * must be called with flying_list locked. + * returns 0 if there was no timeout to arm, 1 if the next timeout was armed, + * or a LIBUSB_ERROR code on failure. + */ +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + struct usbi_transfer *transfer; + + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, then we have no + * arming to do */ + if (!timerisset(cur_tv)) + goto disarm; + + /* act on first transfer that is not already cancelled */ + if (!(transfer->flags & USBI_TRANSFER_TIMED_OUT)) { + int r; + const struct itimerspec it = { {0, 0}, + { cur_tv->tv_sec, cur_tv->tv_usec * 1000 } }; + usbi_dbg("next timeout originally %dms", USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + return 1; + } + } + +disarm: + return disarm_timerfd(ctx); +} +#else +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + (void)ctx; + return 0; +} +#endif + +/** \ingroup asyncio + * Submit a transfer. This function will fire off the USB transfer and then + * return immediately. + * + * \param transfer the transfer to submit + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if the transfer has already been submitted. + * \returns LIBUSB_ERROR_NOT_SUPPORTED if the transfer flags are not supported + * by the operating system. + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer) +{ + struct libusb_context *ctx = TRANSFER_CTX(transfer); + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + int r; + int updated_fds; + + usbi_mutex_lock(&itransfer->lock); + itransfer->transferred = 0; + itransfer->flags = 0; + r = calculate_timeout(itransfer); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto out; + } + + usbi_mutex_lock(&ctx->flying_transfers_lock); + r = add_to_flying_list(itransfer); + if (r == LIBUSB_SUCCESS) { + r = usbi_backend->submit_transfer(itransfer); + } + if (r != LIBUSB_SUCCESS) { + list_del(&itransfer->list); + arm_timerfd_for_next_timeout(ctx); + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + +out: + updated_fds = (itransfer->flags & USBI_TRANSFER_UPDATED_FDS); + usbi_mutex_unlock(&itransfer->lock); + if (updated_fds) + usbi_fd_notification(ctx); + return r; +} + +/** \ingroup asyncio + * Asynchronously cancel a previously submitted transfer. + * This function returns immediately, but this does not indicate cancellation + * is complete. Your callback function will be invoked at some later time + * with a transfer status of + * \ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED + * "LIBUSB_TRANSFER_CANCELLED." + * + * \param transfer the transfer to cancel + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the transfer is already complete or + * cancelled. + * \returns a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + int r; + + usbi_dbg(""); + usbi_mutex_lock(&itransfer->lock); + r = usbi_backend->cancel_transfer(itransfer); + if (r < 0) { + if (r != LIBUSB_ERROR_NOT_FOUND && + r != LIBUSB_ERROR_NO_DEVICE) + usbi_err(TRANSFER_CTX(transfer), + "cancel transfer failed error %d", r); + else + usbi_dbg("cancel transfer failed error %d", r); + + if (r == LIBUSB_ERROR_NO_DEVICE) + itransfer->flags |= USBI_TRANSFER_DEVICE_DISAPPEARED; + } + + itransfer->flags |= USBI_TRANSFER_CANCELLING; + + usbi_mutex_unlock(&itransfer->lock); + return r; +} + +/* Handle completion of a transfer (completion might be an error condition). + * This will invoke the user-supplied callback function, which may end up + * freeing the transfer. Therefore you cannot use the transfer structure + * after calling this function, and you should free all backend-specific + * data before calling it. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + uint8_t flags; + int r = 0; + + /* FIXME: could be more intelligent with the timerfd here. we don't need + * to disarm the timerfd if there was no timer running, and we only need + * to rearm the timerfd if the transfer that expired was the one with + * the shortest timeout. */ + + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_del(&itransfer->list); + if (usbi_using_timerfd(ctx)) + r = arm_timerfd_for_next_timeout(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + if (usbi_using_timerfd(ctx) && (r < 0)) + return r; + + if (status == LIBUSB_TRANSFER_COMPLETED + && transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) { + int rqlen = transfer->length; + if (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL) + rqlen -= LIBUSB_CONTROL_SETUP_SIZE; + if (rqlen != itransfer->transferred) { + usbi_dbg("interpreting short transfer as error"); + status = LIBUSB_TRANSFER_ERROR; + } + } + + flags = transfer->flags; + transfer->status = status; + transfer->actual_length = itransfer->transferred; + usbi_dbg("transfer %p has callback %p", transfer, transfer->callback); + if (transfer->callback) + transfer->callback(transfer); + /* transfer might have been freed by the above call, do not use from + * this point. */ + if (flags & LIBUSB_TRANSFER_FREE_TRANSFER) + libusb_free_transfer(transfer); + usbi_mutex_lock(&ctx->event_waiters_lock); + usbi_cond_broadcast(&ctx->event_waiters_cond); + usbi_mutex_unlock(&ctx->event_waiters_lock); + return 0; +} + +/* Similar to usbi_handle_transfer_completion() but exclusively for transfers + * that were asynchronously cancelled. The same concerns w.r.t. freeing of + * transfers exist here. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer) +{ + /* if the URB was cancelled due to timeout, report timeout to the user */ + if (transfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout cancellation"); + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT); + } + + /* otherwise its a normal async cancel */ + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED); +} + +/** \ingroup poll + * Attempt to acquire the event handling lock. This lock is used to ensure that + * only one thread is monitoring libusbx event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusbx's file descriptors directly. + * If you stick to libusbx's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if the lock was obtained successfully + * \returns 1 if the lock was not obtained (i.e. another thread holds the lock) + * \see \ref mtasync + */ +int API_EXPORTED libusb_try_lock_events(libusb_context *ctx) +{ + int r; + unsigned int ru; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * start event handling */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ru = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (ru) { + usbi_dbg("someone else is modifying poll fds"); + return 1; + } + + r = usbi_mutex_trylock(&ctx->events_lock); + if (r) + return 1; + + ctx->event_handler_active = 1; + return 0; +} + +/** \ingroup poll + * Acquire the event handling lock, blocking until successful acquisition if + * it is contended. This lock is used to ensure that only one thread is + * monitoring libusbx event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusbx's file descriptors directly. + * If you stick to libusbx's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_lock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->events_lock); + ctx->event_handler_active = 1; +} + +/** \ingroup poll + * Release the lock previously acquired with libusb_try_lock_events() or + * libusb_lock_events(). Releasing this lock will wake up any threads blocked + * on libusb_wait_for_event(). + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_unlock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + ctx->event_handler_active = 0; + usbi_mutex_unlock(&ctx->events_lock); + + /* FIXME: perhaps we should be a bit more efficient by not broadcasting + * the availability of the events lock when we are modifying pollfds + * (check ctx->pollfd_modify)? */ + usbi_mutex_lock(&ctx->event_waiters_lock); + usbi_cond_broadcast(&ctx->event_waiters_cond); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Determine if it is still OK for this thread to be doing event handling. + * + * Sometimes, libusbx needs to temporarily pause all event handlers, and this + * is the function you should use before polling file descriptors to see if + * this is the case. + * + * If this function instructs your thread to give up the events lock, you + * should just continue the usual logic that is documented in \ref mtasync. + * On the next iteration, your thread will fail to obtain the events lock, + * and will hence become an event waiter. + * + * This function should be called while the events lock is held: you don't + * need to worry about the results of this function if your thread is not + * the current event handler. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if event handling can start or continue + * \returns 0 if this thread must give up the events lock + * \see \ref fullstory "Multi-threaded I/O: the full story" + */ +int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx) +{ + unsigned int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * continue event handling */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + r = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (r) { + usbi_dbg("someone else is modifying poll fds"); + return 0; + } + + return 1; +} + + +/** \ingroup poll + * Determine if an active thread is handling events (i.e. if anyone is holding + * the event handling lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if a thread is handling events + * \returns 0 if there are no threads currently handling events + * \see \ref mtasync + */ +int API_EXPORTED libusb_event_handler_active(libusb_context *ctx) +{ + unsigned int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * start event handling -- indicate that event handling is happening */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + r = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (r) { + usbi_dbg("someone else is modifying poll fds"); + return 1; + } + + return ctx->event_handler_active; +} + +/** \ingroup poll + * Acquire the event waiters lock. This lock is designed to be obtained under + * the situation where you want to be aware when events are completed, but + * some other thread is event handling so calling libusb_handle_events() is not + * allowed. + * + * You then obtain this lock, re-check that another thread is still handling + * events, then call libusb_wait_for_event(). + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusbx's file descriptors directly, + * and may potentially be handling events from 2 threads simultaenously. + * If you stick to libusbx's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Release the event waiters lock. + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Wait for another thread to signal completion of an event. Must be called + * with the event waiters lock held, see libusb_lock_event_waiters(). + * + * This function will block until any of the following conditions are met: + * -# The timeout expires + * -# A transfer completes + * -# A thread releases the event handling lock through libusb_unlock_events() + * + * Condition 1 is obvious. Condition 2 unblocks your thread after + * the callback for the transfer has completed. Condition 3 is important + * because it means that the thread that was previously handling events is no + * longer doing so, so if any events are to complete, another thread needs to + * step up and start event handling. + * + * This function releases the event waiters lock before putting your thread + * to sleep, and reacquires the lock as it is being woken up. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv maximum timeout for this blocking function. A NULL value + * indicates unlimited timeout. + * \returns 0 after a transfer completes or another thread stops event handling + * \returns 1 if the timeout expired + * \see \ref mtasync + */ +int API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv) +{ + struct timespec timeout; + int r; + + USBI_GET_CONTEXT(ctx); + if (tv == NULL) { + usbi_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock); + return 0; + } + + r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout); + if (r < 0) { + usbi_err(ctx, "failed to read realtime clock, error %d", errno); + return LIBUSB_ERROR_OTHER; + } + + timeout.tv_sec += tv->tv_sec; + timeout.tv_nsec += tv->tv_usec * 1000; + while (timeout.tv_nsec >= 1000000000) { + timeout.tv_nsec -= 1000000000; + timeout.tv_sec++; + } + + r = usbi_cond_timedwait(&ctx->event_waiters_cond, + &ctx->event_waiters_lock, &timeout); + return (r == ETIMEDOUT); +} + +static void handle_timeout(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int r; + + itransfer->flags |= USBI_TRANSFER_TIMED_OUT; + r = libusb_cancel_transfer(transfer); + if (r < 0) + usbi_warn(TRANSFER_CTX(transfer), + "async cancel failed %d errno=%d", r, errno); +} + +static int handle_timeouts_locked(struct libusb_context *ctx) +{ + int r; + struct timespec systime_ts; + struct timeval systime; + struct usbi_transfer *transfer; + + if (list_empty(&ctx->flying_transfers)) + return 0; + + /* get current time */ + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); + if (r < 0) + return r; + + TIMESPEC_TO_TIMEVAL(&systime, &systime_ts); + + /* iterate through flying transfers list, finding all transfers that + * have expired timeouts */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, we're all done */ + if (!timerisset(cur_tv)) + return 0; + + /* ignore timeouts we've already handled */ + if (transfer->flags & (USBI_TRANSFER_TIMED_OUT | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* if transfer has non-expired timeout, nothing more to do */ + if ((cur_tv->tv_sec > systime.tv_sec) || + (cur_tv->tv_sec == systime.tv_sec && + cur_tv->tv_usec > systime.tv_usec)) + return 0; + + /* otherwise, we've got an expired timeout to handle */ + handle_timeout(transfer); + } + return 0; +} + +static int handle_timeouts(struct libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->flying_transfers_lock); + r = handle_timeouts_locked(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int handle_timerfd_trigger(struct libusb_context *ctx) +{ + int r; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* process the timeout that just happened */ + r = handle_timeouts_locked(ctx); + if (r < 0) + goto out; + + /* arm for next timeout*/ + r = arm_timerfd_for_next_timeout(ctx); + +out: + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} +#endif + +/* do the actual event handling. assumes that no other thread is concurrently + * doing the same thing. */ +static int handle_events(struct libusb_context *ctx, struct timeval *tv) +{ + int r; + struct usbi_pollfd *ipollfd; + POLL_NFDS_TYPE nfds = 0; + struct pollfd *fds = NULL; + int i = -1; + int timeout_ms; + + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + nfds++; + + /* TODO: malloc when number of fd's changes, not on every poll */ + if (nfds != 0) + fds = malloc(sizeof(*fds) * nfds); + if (!fds) { + usbi_mutex_unlock(&ctx->pollfds_lock); + return LIBUSB_ERROR_NO_MEM; + } + + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) { + struct libusb_pollfd *pollfd = &ipollfd->pollfd; + int fd = pollfd->fd; + i++; + fds[i].fd = fd; + fds[i].events = pollfd->events; + fds[i].revents = 0; + } + usbi_mutex_unlock(&ctx->pollfds_lock); + + timeout_ms = (int)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); + + /* round up to next millisecond */ + if (tv->tv_usec % 1000) + timeout_ms++; + + usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); + r = usbi_poll(fds, nfds, timeout_ms); + usbi_dbg("poll() returned %d", r); + if (r == 0) { + free(fds); + return handle_timeouts(ctx); + } else if (r == -1 && errno == EINTR) { + free(fds); + return LIBUSB_ERROR_INTERRUPTED; + } else if (r < 0) { + free(fds); + usbi_err(ctx, "poll failed %d err=%d\n", r, errno); + return LIBUSB_ERROR_IO; + } + + /* fd[0] is always the ctrl pipe */ + if (fds[0].revents) { + /* another thread wanted to interrupt event handling, and it succeeded! + * handle any other events that cropped up at the same time, and + * simply return */ + usbi_dbg("caught a fish on the control pipe"); + + if (r == 1) { + r = 0; + goto handled; + } else { + /* prevent OS backend from trying to handle events on ctrl pipe */ + fds[0].revents = 0; + r--; + } + } + + /* fd[1] is always the hotplug pipe */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && fds[1].revents) { + libusb_hotplug_message message; + ssize_t ret; + + usbi_dbg("caught a fish on the hotplug pipe"); + + /* read the message from the hotplug thread */ + ret = usbi_read(ctx->hotplug_pipe[0], &message, sizeof (message)); + if (ret < sizeof(message)) { + usbi_err(ctx, "hotplug pipe read error %d < %d", + ret, sizeof(message)); + r = LIBUSB_ERROR_OTHER; + goto handled; + } + + usbi_hotplug_match(ctx, message.device, message.event); + + /* the device left. dereference the device */ + if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == message.event) + libusb_unref_device(message.device); + + fds[1].revents = 0; + if (1 == r--) + goto handled; + } /* else there shouldn't be anything on this pipe */ + +#ifdef USBI_TIMERFD_AVAILABLE + /* on timerfd configurations, fds[2] is the timerfd */ + if (usbi_using_timerfd(ctx) && fds[2].revents) { + /* timerfd indicates that a timeout has expired */ + int ret; + usbi_dbg("timerfd triggered"); + + ret = handle_timerfd_trigger(ctx); + if (ret < 0) { + /* return error code */ + r = ret; + goto handled; + } else if (r == 1) { + /* no more active file descriptors, nothing more to do */ + r = 0; + goto handled; + } else { + /* more events pending... + * prevent OS backend from trying to handle events on timerfd */ + fds[2].revents = 0; + r--; + } + } +#endif + + r = usbi_backend->handle_events(ctx, fds, nfds, r); + if (r) + usbi_err(ctx, "backend handle_events failed with error %d", r); + +handled: + free(fds); + return r; +} + +/* returns the smallest of: + * 1. timeout of next URB + * 2. user-supplied timeout + * returns 1 if there is an already-expired timeout, otherwise returns 0 + * and populates out + */ +static int get_next_timeout(libusb_context *ctx, struct timeval *tv, + struct timeval *out) +{ + struct timeval timeout; + int r = libusb_get_next_timeout(ctx, &timeout); + if (r) { + /* timeout already expired? */ + if (!timerisset(&timeout)) + return 1; + + /* choose the smallest of next URB timeout or user specified timeout */ + if (timercmp(&timeout, tv, <)) + *out = timeout; + else + *out = *tv; + } else { + *out = *tv; + } + return 0; +} + +/** \ingroup poll + * Handle any pending events. + * + * libusbx determines "pending events" by checking if any timeouts have expired + * and by checking the set of file descriptors for activity. + * + * If a zero timeval is passed, this function will handle any already-pending + * events and then immediately return in non-blocking style. + * + * If a non-zero timeval is passed and no events are currently pending, this + * function will block waiting for events to handle up until the specified + * timeout. If an event arrives or a signal is raised, this function will + * return early. + * + * If the parameter completed is not NULL then after obtaining the event + * handling lock this function will return immediately if the integer + * pointed to is not 0. This allows for race free waiting for the completion + * of a specific transfer. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + +retry: + if (libusb_try_lock_events(ctx) == 0) { + if (completed == NULL || !*completed) { + /* we obtained the event lock: do our own event handling */ + usbi_dbg("doing our own event handling"); + r = handle_events(ctx, &poll_timeout); + } + libusb_unlock_events(ctx); + return r; + } + + /* another thread is doing event handling. wait for thread events that + * notify event completion. */ + libusb_lock_event_waiters(ctx); + + if (completed && *completed) + goto already_done; + + if (!libusb_event_handler_active(ctx)) { + /* we hit a race: whoever was event handling earlier finished in the + * time it took us to reach this point. try the cycle again. */ + libusb_unlock_event_waiters(ctx); + usbi_dbg("event handler was active but went away, retrying"); + goto retry; + } + + usbi_dbg("another thread is doing event handling"); + r = libusb_wait_for_event(ctx, &poll_timeout); + +already_done: + libusb_unlock_event_waiters(ctx); + + if (r < 0) + return r; + else if (r == 1) + return handle_timeouts(ctx); + else + return 0; +} + +/** \ingroup poll + * Handle any pending events + * + * Like libusb_handle_events_timeout_completed(), but without the completed + * parameter, calling this function is equivalent to calling + * libusb_handle_events_timeout_completed() with a NULL completed parameter. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv) +{ + return libusb_handle_events_timeout_completed(ctx, tv, NULL); +} + +/** \ingroup poll + * Handle any pending events in blocking mode. There is currently a timeout + * hardcoded at 60 seconds but we plan to make it unlimited in future. For + * finer control over whether this function is blocking or non-blocking, or + * for control over the timeout, use libusb_handle_events_timeout_completed() + * instead. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events(libusb_context *ctx) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, NULL); +} + +/** \ingroup poll + * Handle any pending events in blocking mode. + * + * Like libusb_handle_events(), with the addition of a completed parameter + * to allow for race free waiting for the completion of a specific transfer. + * + * See libusb_handle_events_timeout_completed() for details on the completed + * parameter. + * + * \param ctx the context to operate on, or NULL for the default context + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx, + int *completed) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, completed); +} + +/** \ingroup poll + * Handle any pending events by polling file descriptors, without checking if + * any other threads are already doing so. Must be called with the event lock + * held, see libusb_lock_events(). + * + * This function is designed to be called under the situation where you have + * taken the event lock and are calling poll()/select() directly on libusbx's + * file descriptors (as opposed to using libusb_handle_events() or similar). + * You detect events on libusbx's descriptors, so you then call this function + * with a zero timeout value (while still holding the event lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or zero for + * non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + + return handle_events(ctx, &poll_timeout); +} + +/** \ingroup poll + * Determines whether your application must apply special timing considerations + * when monitoring libusbx's file descriptors. + * + * This function is only useful for applications which retrieve and poll + * libusbx's file descriptors in their own main loop (\ref pollmain). + * + * Ordinarily, libusbx's event handler needs to be called into at specific + * moments in time (in addition to times when there is activity on the file + * descriptor set). The usual approach is to use libusb_get_next_timeout() + * to learn about when the next timeout occurs, and to adjust your + * poll()/select() timeout accordingly so that you can make a call into the + * library at that time. + * + * Some platforms supported by libusbx do not come with this baggage - any + * events relevant to timing will be represented by activity on the file + * descriptor set, and libusb_get_next_timeout() will always return 0. + * This function allows you to detect whether you are running on such a + * platform. + * + * Since v1.0.5. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if you must call into libusbx at times determined by + * libusb_get_next_timeout(), or 1 if all timeout events are handled internally + * or through regular activity on the file descriptors. + * \see \ref pollmain "Polling libusbx file descriptors for event handling" + */ +int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx) +{ +#if defined(USBI_TIMERFD_AVAILABLE) + USBI_GET_CONTEXT(ctx); + return usbi_using_timerfd(ctx); +#else + (void)ctx; + return 0; +#endif +} + +/** \ingroup poll + * Determine the next internal timeout that libusbx needs to handle. You only + * need to use this function if you are calling poll() or select() or similar + * on libusbx's file descriptors yourself - you do not need to use it if you + * are calling libusb_handle_events() or a variant directly. + * + * You should call this function in your main loop in order to determine how + * long to wait for select() or poll() to return results. libusbx needs to be + * called into at this timeout, so you should use it as an upper bound on + * your select() or poll() call. + * + * When the timeout has expired, call into libusb_handle_events_timeout() + * (perhaps in non-blocking mode) so that libusbx can handle the timeout. + * + * This function may return 1 (success) and an all-zero timeval. If this is + * the case, it indicates that libusbx has a timeout that has already expired + * so you should call libusb_handle_events_timeout() or similar immediately. + * A return code of 0 indicates that there are no pending timeouts. + * + * On some platforms, this function will always returns 0 (no pending + * timeouts). See \ref polltime. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv output location for a relative time against the current + * clock in which libusbx must be called into in order to process timeout events + * \returns 0 if there are no pending timeouts, 1 if a timeout was returned, + * or LIBUSB_ERROR_OTHER on failure + */ +int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv) +{ + struct usbi_transfer *transfer; + struct timespec cur_ts; + struct timeval cur_tv; + struct timeval *next_timeout; + int r; + int found = 0; + + USBI_GET_CONTEXT(ctx); + if (usbi_using_timerfd(ctx)) + return 0; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + if (list_empty(&ctx->flying_transfers)) { + usbi_mutex_unlock(&ctx->flying_transfers_lock); + usbi_dbg("no URBs, no timeout!"); + return 0; + } + + /* find next transfer which hasn't already been processed as timed out */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + if (transfer->flags & (USBI_TRANSFER_TIMED_OUT | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* no timeout for this transfer? */ + if (!timerisset(&transfer->timeout)) + continue; + + found = 1; + break; + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (!found) { + usbi_dbg("no URB with timeout or all handled by OS; no timeout!"); + return 0; + } + + next_timeout = &transfer->timeout; + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); + if (r < 0) { + usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno); + return 0; + } + TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts); + + if (!timercmp(&cur_tv, next_timeout, <)) { + usbi_dbg("first timeout already expired"); + timerclear(tv); + } else { + timersub(next_timeout, &cur_tv, tv); + usbi_dbg("next timeout in %d.%06ds", tv->tv_sec, tv->tv_usec); + } + + return 1; +} + +/** \ingroup poll + * Register notification functions for file descriptor additions/removals. + * These functions will be invoked for every new or removed file descriptor + * that libusbx uses as an event source. + * + * To remove notifiers, pass NULL values for the function pointers. + * + * Note that file descriptors may have been added even before you register + * these notifiers (e.g. at libusb_init() time). + * + * Additionally, note that the removal notifier may be called during + * libusb_exit() (e.g. when it is closing file descriptors that were opened + * and added to the poll set at libusb_init() time). If you don't want this, + * remove the notifiers immediately before calling libusb_exit(). + * + * \param ctx the context to operate on, or NULL for the default context + * \param added_cb pointer to function for addition notifications + * \param removed_cb pointer to function for removal notifications + * \param user_data User data to be passed back to callbacks (useful for + * passing context information) + */ +void API_EXPORTED libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data) +{ + USBI_GET_CONTEXT(ctx); + ctx->fd_added_cb = added_cb; + ctx->fd_removed_cb = removed_cb; + ctx->fd_cb_user_data = user_data; +} + +/* Add a file descriptor to the list of file descriptors to be monitored. + * events should be specified as a bitmask of events passed to poll(), e.g. + * POLLIN and/or POLLOUT. */ +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events) +{ + struct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd)); + if (!ipollfd) + return LIBUSB_ERROR_NO_MEM; + + usbi_dbg("add fd %d events %d", fd, events); + ipollfd->pollfd.fd = fd; + ipollfd->pollfd.events = events; + usbi_mutex_lock(&ctx->pollfds_lock); + list_add_tail(&ipollfd->list, &ctx->pollfds); + usbi_mutex_unlock(&ctx->pollfds_lock); + + if (ctx->fd_added_cb) + ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data); + return 0; +} + +/* Remove a file descriptor from the list of file descriptors to be polled. */ +void usbi_remove_pollfd(struct libusb_context *ctx, int fd) +{ + struct usbi_pollfd *ipollfd; + int found = 0; + + usbi_dbg("remove fd %d", fd); + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + if (ipollfd->pollfd.fd == fd) { + found = 1; + break; + } + + if (!found) { + usbi_dbg("couldn't find fd %d to remove", fd); + usbi_mutex_unlock(&ctx->pollfds_lock); + return; + } + + list_del(&ipollfd->list); + usbi_mutex_unlock(&ctx->pollfds_lock); + free(ipollfd); + if (ctx->fd_removed_cb) + ctx->fd_removed_cb(fd, ctx->fd_cb_user_data); +} + +/** \ingroup poll + * Retrieve a list of file descriptors that should be polled by your main loop + * as libusbx event sources. + * + * The returned list is NULL-terminated and should be freed with free() when + * done. The actual list contents must not be touched. + * + * As file descriptors are a Unix-specific concept, this function is not + * available on Windows and will always return NULL. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns a NULL-terminated list of libusb_pollfd structures + * \returns NULL on error + * \returns NULL on platforms where the functionality is not available + */ +DEFAULT_VISIBILITY +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx) +{ +#ifndef OS_WINDOWS + struct libusb_pollfd **ret = NULL; + struct usbi_pollfd *ipollfd; + size_t i = 0; + size_t cnt = 0; + USBI_GET_CONTEXT(ctx); + + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + cnt++; + + ret = calloc(cnt + 1, sizeof(struct libusb_pollfd *)); + if (!ret) + goto out; + + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + ret[i++] = (struct libusb_pollfd *) ipollfd; + ret[cnt] = NULL; + +out: + usbi_mutex_unlock(&ctx->pollfds_lock); + return (const struct libusb_pollfd **) ret; +#else + usbi_err(ctx, "external polling of libusbx's internal descriptors "\ + "is not yet supported on Windows platforms"); + return NULL; +#endif +} + +/* Backends may call this from handle_events to report disconnection of a + * device. This function ensures transfers get cancelled appropriately. + * Callers of this function must hold the events_lock. + */ +void usbi_handle_disconnect(struct libusb_device_handle *handle) +{ + struct usbi_transfer *cur; + struct usbi_transfer *to_cancel; + + usbi_dbg("device %d.%d", + handle->dev->bus_number, handle->dev->device_address); + + /* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE + * status code. + * + * this is a bit tricky because: + * 1. we can't do transfer completion while holding flying_transfers_lock + * because the completion handler may try to re-submit the transfer + * 2. the transfers list can change underneath us - if we were to build a + * list of transfers to complete (while holding lock), the situation + * might be different by the time we come to free them + * + * so we resort to a loop-based approach as below + * + * This is safe because transfers are only removed from the + * flying_transfer list by usbi_handle_transfer_completion and + * libusb_close, both of which hold the events_lock while doing so, + * so usbi_handle_disconnect cannot be running at the same time. + * + * Note that libusb_submit_transfer also removes the transfer from + * the flying_transfer list on submission failure, but it keeps the + * flying_transfer list locked between addition and removal, so + * usbi_handle_disconnect never sees such transfers. + */ + + while (1) { + usbi_mutex_lock(&HANDLE_CTX(handle)->flying_transfers_lock); + to_cancel = NULL; + list_for_each_entry(cur, &HANDLE_CTX(handle)->flying_transfers, list, struct usbi_transfer) + if (USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == handle) { + to_cancel = cur; + break; + } + usbi_mutex_unlock(&HANDLE_CTX(handle)->flying_transfers_lock); + + if (!to_cancel) + break; + + usbi_dbg("cancelling transfer %p from disconnect", + USBI_TRANSFER_TO_LIBUSB_TRANSFER(to_cancel)); + + usbi_backend->clear_transfer_priv(to_cancel); + usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE); + } + +} diff --git a/Externals/libusbx/libusb/libusb-1.0.def b/Externals/libusbx/libusb/libusb-1.0.def new file mode 100644 index 0000000000..cb0e32ab93 --- /dev/null +++ b/Externals/libusbx/libusb/libusb-1.0.def @@ -0,0 +1,158 @@ +LIBRARY "libusb-1.0.dll" +EXPORTS + libusb_alloc_transfer + libusb_alloc_transfer@4 = libusb_alloc_transfer + libusb_attach_kernel_driver + libusb_attach_kernel_driver@8 = libusb_attach_kernel_driver + libusb_bulk_transfer + libusb_bulk_transfer@24 = libusb_bulk_transfer + libusb_cancel_transfer + libusb_cancel_transfer@4 = libusb_cancel_transfer + libusb_claim_interface + libusb_claim_interface@8 = libusb_claim_interface + libusb_clear_halt + libusb_clear_halt@8 = libusb_clear_halt + libusb_close + libusb_close@4 = libusb_close + libusb_control_transfer + libusb_control_transfer@32 = libusb_control_transfer + libusb_detach_kernel_driver + libusb_detach_kernel_driver@8 = libusb_detach_kernel_driver + libusb_error_name + libusb_error_name@4 = libusb_error_name + libusb_event_handler_active + libusb_event_handler_active@4 = libusb_event_handler_active + libusb_event_handling_ok + libusb_event_handling_ok@4 = libusb_event_handling_ok + libusb_exit + libusb_exit@4 = libusb_exit + libusb_free_bos_descriptor + libusb_free_bos_descriptor@4 = libusb_free_bos_descriptor + libusb_free_config_descriptor + libusb_free_config_descriptor@4 = libusb_free_config_descriptor + libusb_free_container_id_descriptor + libusb_free_container_id_descriptor@4 = libusb_free_container_id_descriptor + libusb_free_device_list + libusb_free_device_list@8 = libusb_free_device_list + libusb_free_ss_endpoint_companion_descriptor + libusb_free_ss_endpoint_companion_descriptor@4 = libusb_free_ss_endpoint_companion_descriptor + libusb_free_ss_usb_device_capability_descriptor + libusb_free_ss_usb_device_capability_descriptor@4 = libusb_free_ss_usb_device_capability_descriptor + libusb_free_transfer + libusb_free_transfer@4 = libusb_free_transfer + libusb_free_usb_2_0_extension_descriptor + libusb_free_usb_2_0_extension_descriptor@4 = libusb_free_usb_2_0_extension_descriptor + libusb_get_active_config_descriptor + libusb_get_active_config_descriptor@8 = libusb_get_active_config_descriptor + libusb_get_bos_descriptor + libusb_get_bos_descriptor@8 = libusb_get_bos_descriptor + libusb_get_bus_number + libusb_get_bus_number@4 = libusb_get_bus_number + libusb_get_config_descriptor + libusb_get_config_descriptor@12 = libusb_get_config_descriptor + libusb_get_config_descriptor_by_value + libusb_get_config_descriptor_by_value@12 = libusb_get_config_descriptor_by_value + libusb_get_configuration + libusb_get_configuration@8 = libusb_get_configuration + libusb_get_container_id_descriptor + libusb_get_container_id_descriptor@12 = libusb_get_container_id_descriptor + libusb_get_device + libusb_get_device@4 = libusb_get_device + libusb_get_device_address + libusb_get_device_address@4 = libusb_get_device_address + libusb_get_device_descriptor + libusb_get_device_descriptor@8 = libusb_get_device_descriptor + libusb_get_device_list + libusb_get_device_list@8 = libusb_get_device_list + libusb_get_device_speed + libusb_get_device_speed@4 = libusb_get_device_speed + libusb_get_max_iso_packet_size + libusb_get_max_iso_packet_size@8 = libusb_get_max_iso_packet_size + libusb_get_max_packet_size + libusb_get_max_packet_size@8 = libusb_get_max_packet_size + libusb_get_next_timeout + libusb_get_next_timeout@8 = libusb_get_next_timeout + libusb_get_parent + libusb_get_parent@4 = libusb_get_parent + libusb_get_pollfds + libusb_get_pollfds@4 = libusb_get_pollfds + libusb_get_port_number + libusb_get_port_number@4 = libusb_get_port_number + libusb_get_port_numbers + libusb_get_port_numbers@12 = libusb_get_port_numbers + libusb_get_port_path + libusb_get_port_path@16 = libusb_get_port_path + libusb_get_ss_endpoint_companion_descriptor + libusb_get_ss_endpoint_companion_descriptor@12 = libusb_get_ss_endpoint_companion_descriptor + libusb_get_ss_usb_device_capability_descriptor + libusb_get_ss_usb_device_capability_descriptor@12 = libusb_get_ss_usb_device_capability_descriptor + libusb_get_string_descriptor_ascii + libusb_get_string_descriptor_ascii@16 = libusb_get_string_descriptor_ascii + libusb_get_usb_2_0_extension_descriptor + libusb_get_usb_2_0_extension_descriptor@12 = libusb_get_usb_2_0_extension_descriptor + libusb_get_version + libusb_get_version@0 = libusb_get_version + libusb_handle_events + libusb_handle_events@4 = libusb_handle_events + libusb_handle_events_completed + libusb_handle_events_completed@8 = libusb_handle_events_completed + libusb_handle_events_locked + libusb_handle_events_locked@8 = libusb_handle_events_locked + libusb_handle_events_timeout + libusb_handle_events_timeout@8 = libusb_handle_events_timeout + libusb_handle_events_timeout_completed + libusb_handle_events_timeout_completed@12 = libusb_handle_events_timeout_completed + libusb_has_capability + libusb_has_capability@4 = libusb_has_capability + libusb_hotplug_deregister_callback + libusb_hotplug_deregister_callback@8 = libusb_hotplug_deregister_callback + libusb_hotplug_register_callback + libusb_hotplug_register_callback@36 = libusb_hotplug_register_callback + libusb_init + libusb_init@4 = libusb_init + libusb_interrupt_transfer + libusb_interrupt_transfer@24 = libusb_interrupt_transfer + libusb_kernel_driver_active + libusb_kernel_driver_active@8 = libusb_kernel_driver_active + libusb_lock_event_waiters + libusb_lock_event_waiters@4 = libusb_lock_event_waiters + libusb_lock_events + libusb_lock_events@4 = libusb_lock_events + libusb_open + libusb_open@8 = libusb_open + libusb_open_device_with_vid_pid + libusb_open_device_with_vid_pid@12 = libusb_open_device_with_vid_pid + libusb_pollfds_handle_timeouts + libusb_pollfds_handle_timeouts@4 = libusb_pollfds_handle_timeouts + libusb_ref_device + libusb_ref_device@4 = libusb_ref_device + libusb_release_interface + libusb_release_interface@8 = libusb_release_interface + libusb_reset_device + libusb_reset_device@4 = libusb_reset_device + libusb_set_auto_detach_kernel_driver + libusb_set_auto_detach_kernel_driver@8 = libusb_set_auto_detach_kernel_driver + libusb_set_configuration + libusb_set_configuration@8 = libusb_set_configuration + libusb_set_debug + libusb_set_debug@8 = libusb_set_debug + libusb_set_interface_alt_setting + libusb_set_interface_alt_setting@12 = libusb_set_interface_alt_setting + libusb_set_pollfd_notifiers + libusb_set_pollfd_notifiers@16 = libusb_set_pollfd_notifiers + libusb_setlocale + libusb_setlocale@4 = libusb_setlocale + libusb_strerror + libusb_strerror@4 = libusb_strerror + libusb_submit_transfer + libusb_submit_transfer@4 = libusb_submit_transfer + libusb_try_lock_events + libusb_try_lock_events@4 = libusb_try_lock_events + libusb_unlock_event_waiters + libusb_unlock_event_waiters@4 = libusb_unlock_event_waiters + libusb_unlock_events + libusb_unlock_events@4 = libusb_unlock_events + libusb_unref_device + libusb_unref_device@4 = libusb_unref_device + libusb_wait_for_event + libusb_wait_for_event@8 = libusb_wait_for_event diff --git a/Externals/libusbx/libusb/libusb-1.0.rc b/Externals/libusbx/libusb/libusb-1.0.rc new file mode 100644 index 0000000000..ae49757cc1 --- /dev/null +++ b/Externals/libusbx/libusb/libusb-1.0.rc @@ -0,0 +1,61 @@ +/* + * For Windows: input this file to the Resoure Compiler to produce a binary + * .res file. This is then embedded in the resultant library (like any other + * compilation object). + * The information can then be queried using standard APIs and can also be + * viewed with utilities such as Windows Explorer. + */ +#ifndef _WIN32_WCE +#include "winresrc.h" +#endif + +#include "version.h" +#ifndef LIBUSB_VERSIONSTRING +#define LU_STR(s) #s +#define LU_XSTR(s) LU_STR(s) +#if LIBUSB_NANO > 0 +#define LIBUSB_VERSIONSTRING \ + LU_XSTR(LIBUSB_MAJOR) "." LU_XSTR(LIBUSB_MINOR) "." \ + LU_XSTR(LIBUSB_MICRO) "." LU_XSTR(LIBUSB_NANO) LIBUSB_RC "\0" +#else +#define LIBUSB_VERSIONSTRING \ + LU_XSTR(LIBUSB_MAJOR) "." LU_XSTR(LIBUSB_MINOR) "." \ + LU_XSTR(LIBUSB_MICRO) LIBUSB_RC "\0" +#endif +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION LIBUSB_MAJOR,LIBUSB_MINOR,LIBUSB_MICRO,LIBUSB_NANO + PRODUCTVERSION LIBUSB_MAJOR,LIBUSB_MINOR,LIBUSB_MICRO,LIBUSB_NANO + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "libusbx.org\0" + VALUE "FileDescription", "C library for writing portable USB drivers in userspace\0" + VALUE "FileVersion", LIBUSB_VERSIONSTRING + VALUE "InternalName", "libusb\0" + VALUE "LegalCopyright", "See individual source files, GNU LGPL v2.1 or later.\0" + VALUE "LegalTrademarks", "http://www.gnu.org/licenses/lgpl-2.1.html\0" + VALUE "OriginalFilename", "libusb-1.0.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "libusb-1.0\0" + VALUE "ProductVersion", LIBUSB_VERSIONSTRING + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/Externals/libusbx/libusb/libusb.h b/Externals/libusbx/libusb/libusb.h new file mode 100644 index 0000000000..e8e120162f --- /dev/null +++ b/Externals/libusbx/libusb/libusb.h @@ -0,0 +1,1941 @@ +/* + * Public libusbx header file + * Copyright © 2001 Johannes Erdfelt + * Copyright © 2007-2008 Daniel Drake + * Copyright © 2012 Pete Batard + * Copyright © 2012 Nathan Hjelm + * For more information, please visit: http://libusbx.org + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_H +#define LIBUSB_H + +#ifdef _MSC_VER +/* on MS environments, the inline keyword is available in C++ only */ +#if !defined(__cplusplus) +#define inline __inline +#endif +/* ssize_t is also not available (copy/paste from MinGW) */ +#ifndef _SSIZE_T_DEFINED +#define _SSIZE_T_DEFINED +#undef ssize_t +#ifdef _WIN64 + typedef __int64 ssize_t; +#else + typedef int ssize_t; +#endif /* _WIN64 */ +#endif /* _SSIZE_T_DEFINED */ +#endif /* _MSC_VER */ + +/* stdint.h is not available on older MSVC */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#else +#include +#endif + +#if !defined(_WIN32_WCE) +#include +#endif + +#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) +#include +#endif + +#include +#include + +/* 'interface' might be defined as a macro on Windows, so we need to + * undefine it so as not to break the current libusbx API, because + * libusb_config_descriptor has an 'interface' member + * As this can be problematic if you include windows.h after libusb.h + * in your sources, we force windows.h to be included first. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#include +#if defined(interface) +#undef interface +#endif +#if !defined(__CYGWIN__) +#include +#endif +#endif + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define LIBUSB_DEPRECATED_FOR(f) \ + __attribute__((deprecated("Use " #f " instead"))) +#else +#define LIBUSB_DEPRECATED_FOR(f) +#endif /* __GNUC__ */ + +/** \def LIBUSB_CALL + * \ingroup misc + * libusbx's Windows calling convention. + * + * Under Windows, the selection of available compilers and configurations + * means that, unlike other platforms, there is not one true calling + * convention (calling convention: the manner in which parameters are + * passed to funcions in the generated assembly code). + * + * Matching the Windows API itself, libusbx uses the WINAPI convention (which + * translates to the stdcall convention) and guarantees that the + * library is compiled in this way. The public header file also includes + * appropriate annotations so that your own software will use the right + * convention, even if another convention is being used by default within + * your codebase. + * + * The one consideration that you must apply in your software is to mark + * all functions which you use as libusbx callbacks with this LIBUSB_CALL + * annotation, so that they too get compiled for the correct calling + * convention. + * + * On non-Windows operating systems, this macro is defined as nothing. This + * means that you can apply it to your code without worrying about + * cross-platform compatibility. + */ +/* LIBUSB_CALL must be defined on both definition and declaration of libusbx + * functions. You'd think that declaration would be enough, but cygwin will + * complain about conflicting types unless both are marked this way. + * The placement of this macro is important too; it must appear after the + * return type, before the function name. See internal documentation for + * API_EXPORTED. + */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#define LIBUSB_CALL WINAPI +#else +#define LIBUSB_CALL +#endif + +/** \def LIBUSBX_API_VERSION + * \ingroup misc + * libusbx's API version. + * + * Since version 1.0.13, to help with feature detection, libusbx defines + * a LIBUSBX_API_VERSION macro that gets increased every time there is a + * significant change to the API, such as the introduction of a new call, + * the definition of a new macro/enum member, or any other element that + * libusbx applications may want to detect at compilation time. + * + * The macro is typically used in an application as follows: + * \code + * #if defined(LIBUSBX_API_VERSION) && (LIBUSBX_API_VERSION >= 0x01001234) + * // Use one of the newer features from the libusbx API + * #endif + * \endcode + * + * Another feature of LIBUSBX_API_VERSION is that it can be used to detect + * whether you are compiling against the libusb or the libusbx library. + * + * Internally, LIBUSBX_API_VERSION is defined as follows: + * (libusbx major << 24) | (libusbx minor << 16) | (16 bit incremental) + */ +#define LIBUSBX_API_VERSION 0x01000102 + +#ifdef __cplusplus +extern "C" { +#endif + +/** \def libusb_cpu_to_le16 + * \ingroup misc + * Convert a 16-bit value from host-endian to little-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the host-endian value to convert + * \returns the value in little-endian byte order + */ +static inline uint16_t libusb_cpu_to_le16(const uint16_t x) +{ + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + _tmp.b8[1] = (uint8_t) (x >> 8); + _tmp.b8[0] = (uint8_t) (x & 0xff); + return _tmp.b16; +} + +/** \def libusb_le16_to_cpu + * \ingroup misc + * Convert a 16-bit value from little-endian to host-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the little-endian value to convert + * \returns the value in host-endian byte order + */ +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +/* standard USB stuff */ + +/** \ingroup desc + * Device and/or Interface Class codes */ +enum libusb_class_code { + /** In the context of a \ref libusb_device_descriptor "device descriptor", + * this bDeviceClass value indicates that each interface specifies its + * own class information and all interfaces operate independently. + */ + LIBUSB_CLASS_PER_INTERFACE = 0, + + /** Audio class */ + LIBUSB_CLASS_AUDIO = 1, + + /** Communications class */ + LIBUSB_CLASS_COMM = 2, + + /** Human Interface Device class */ + LIBUSB_CLASS_HID = 3, + + /** Physical */ + LIBUSB_CLASS_PHYSICAL = 5, + + /** Printer class */ + LIBUSB_CLASS_PRINTER = 7, + + /** Image class */ + LIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ + LIBUSB_CLASS_IMAGE = 6, + + /** Mass storage class */ + LIBUSB_CLASS_MASS_STORAGE = 8, + + /** Hub class */ + LIBUSB_CLASS_HUB = 9, + + /** Data class */ + LIBUSB_CLASS_DATA = 10, + + /** Smart Card */ + LIBUSB_CLASS_SMART_CARD = 0x0b, + + /** Content Security */ + LIBUSB_CLASS_CONTENT_SECURITY = 0x0d, + + /** Video */ + LIBUSB_CLASS_VIDEO = 0x0e, + + /** Personal Healthcare */ + LIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f, + + /** Diagnostic Device */ + LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, + + /** Wireless class */ + LIBUSB_CLASS_WIRELESS = 0xe0, + + /** Application class */ + LIBUSB_CLASS_APPLICATION = 0xfe, + + /** Class is vendor-specific */ + LIBUSB_CLASS_VENDOR_SPEC = 0xff +}; + +/** \ingroup desc + * Descriptor types as defined by the USB specification. */ +enum libusb_descriptor_type { + /** Device descriptor. See libusb_device_descriptor. */ + LIBUSB_DT_DEVICE = 0x01, + + /** Configuration descriptor. See libusb_config_descriptor. */ + LIBUSB_DT_CONFIG = 0x02, + + /** String descriptor */ + LIBUSB_DT_STRING = 0x03, + + /** Interface descriptor. See libusb_interface_descriptor. */ + LIBUSB_DT_INTERFACE = 0x04, + + /** Endpoint descriptor. See libusb_endpoint_descriptor. */ + LIBUSB_DT_ENDPOINT = 0x05, + + /** BOS descriptor */ + LIBUSB_DT_BOS = 0x0f, + + /** Device Capability descriptor */ + LIBUSB_DT_DEVICE_CAPABILITY = 0x10, + + /** HID descriptor */ + LIBUSB_DT_HID = 0x21, + + /** HID report descriptor */ + LIBUSB_DT_REPORT = 0x22, + + /** Physical descriptor */ + LIBUSB_DT_PHYSICAL = 0x23, + + /** Hub descriptor */ + LIBUSB_DT_HUB = 0x29, + + /** SuperSpeed Hub descriptor */ + LIBUSB_DT_SUPERSPEED_HUB = 0x2a, + + /** SuperSpeed Endpoint Companion descriptor */ + LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30 +}; + +/* Descriptor sizes per descriptor type */ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 +#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 +#define LIBUSB_DT_BOS_SIZE 5 +#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE 3 + +/* BOS descriptor sizes */ +#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE 7 +#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE 10 +#define LIBUSB_BT_CONTAINER_ID_SIZE 20 + +/* We unwrap the BOS => define its max size */ +#define LIBUSB_DT_BOS_MAX_SIZE ((LIBUSB_DT_BOS_SIZE) +\ + (LIBUSB_BT_USB_2_0_EXTENSION_SIZE) +\ + (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) +\ + (LIBUSB_BT_CONTAINER_ID_SIZE)) + +#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define LIBUSB_ENDPOINT_DIR_MASK 0x80 + +/** \ingroup desc + * Endpoint direction. Values for bit 7 of the + * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. + */ +enum libusb_endpoint_direction { + /** In: device-to-host */ + LIBUSB_ENDPOINT_IN = 0x80, + + /** Out: host-to-device */ + LIBUSB_ENDPOINT_OUT = 0x00 +}; + +#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ + +/** \ingroup desc + * Endpoint transfer type. Values for bits 0:1 of the + * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. + */ +enum libusb_transfer_type { + /** Control endpoint */ + LIBUSB_TRANSFER_TYPE_CONTROL = 0, + + /** Isochronous endpoint */ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, + + /** Bulk endpoint */ + LIBUSB_TRANSFER_TYPE_BULK = 2, + + /** Interrupt endpoint */ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3 +}; + +/** \ingroup misc + * Standard requests, as defined in table 9-5 of the USB 3.0 specifications */ +enum libusb_standard_request { + /** Request status of the specific recipient */ + LIBUSB_REQUEST_GET_STATUS = 0x00, + + /** Clear or disable a specific feature */ + LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, + + /* 0x02 is reserved */ + + /** Set or enable a specific feature */ + LIBUSB_REQUEST_SET_FEATURE = 0x03, + + /* 0x04 is reserved */ + + /** Set device address for all future accesses */ + LIBUSB_REQUEST_SET_ADDRESS = 0x05, + + /** Get the specified descriptor */ + LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, + + /** Used to update existing descriptors or add new descriptors */ + LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, + + /** Get the current device configuration value */ + LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, + + /** Set device configuration */ + LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, + + /** Return the selected alternate setting for the specified interface */ + LIBUSB_REQUEST_GET_INTERFACE = 0x0A, + + /** Select an alternate interface for the specified interface */ + LIBUSB_REQUEST_SET_INTERFACE = 0x0B, + + /** Set then report an endpoint's synchronization frame */ + LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, + + /** Sets both the U1 and U2 Exit Latency */ + LIBUSB_REQUEST_SET_SEL = 0x30, + + /** Delay from the time a host transmits a packet to the time it is + * received by the device. */ + LIBUSB_SET_ISOCH_DELAY = 0x31, +}; + +/** \ingroup misc + * Request type bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. */ +enum libusb_request_type { + /** Standard */ + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + + /** Class */ + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + + /** Vendor */ + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + + /** Reserved */ + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) +}; + +/** \ingroup misc + * Recipient bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. Values 4 through 31 are reserved. */ +enum libusb_request_recipient { + /** Device */ + LIBUSB_RECIPIENT_DEVICE = 0x00, + + /** Interface */ + LIBUSB_RECIPIENT_INTERFACE = 0x01, + + /** Endpoint */ + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + + /** Other */ + LIBUSB_RECIPIENT_OTHER = 0x03, +}; + +#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C + +/** \ingroup desc + * Synchronization type for isochronous endpoints. Values for bits 2:3 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_sync_type { + /** No synchronization */ + LIBUSB_ISO_SYNC_TYPE_NONE = 0, + + /** Asynchronous */ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, + + /** Adaptive */ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, + + /** Synchronous */ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +}; + +#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 + +/** \ingroup desc + * Usage type for isochronous endpoints. Values for bits 4:5 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_usage_type { + /** Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_DATA = 0, + + /** Feedback endpoint */ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, + + /** Implicit feedback Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, +}; + +/** \ingroup desc + * A structure representing the standard USB device descriptor. This + * descriptor is documented in section 9.6.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_device_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this + * context. */ + uint8_t bDescriptorType; + + /** USB specification release number in binary-coded decimal. A value of + * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ + uint16_t bcdUSB; + + /** USB-IF class code for the device. See \ref libusb_class_code. */ + uint8_t bDeviceClass; + + /** USB-IF subclass code for the device, qualified by the bDeviceClass + * value */ + uint8_t bDeviceSubClass; + + /** USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values */ + uint8_t bDeviceProtocol; + + /** Maximum packet size for endpoint 0 */ + uint8_t bMaxPacketSize0; + + /** USB-IF vendor ID */ + uint16_t idVendor; + + /** USB-IF product ID */ + uint16_t idProduct; + + /** Device release number in binary-coded decimal */ + uint16_t bcdDevice; + + /** Index of string descriptor describing manufacturer */ + uint8_t iManufacturer; + + /** Index of string descriptor describing product */ + uint8_t iProduct; + + /** Index of string descriptor containing device serial number */ + uint8_t iSerialNumber; + + /** Number of possible configurations */ + uint8_t bNumConfigurations; +}; + +/** \ingroup desc + * A structure representing the standard USB endpoint descriptor. This + * descriptor is documented in section 9.6.6 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_endpoint_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in + * this context. */ + uint8_t bDescriptorType; + + /** The address of the endpoint described by this descriptor. Bits 0:3 are + * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, + * see \ref libusb_endpoint_direction. + */ + uint8_t bEndpointAddress; + + /** Attributes which apply to the endpoint when it is configured using + * the bConfigurationValue. Bits 0:1 determine the transfer type and + * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for + * isochronous endpoints and correspond to \ref libusb_iso_sync_type. + * Bits 4:5 are also only used for isochronous endpoints and correspond to + * \ref libusb_iso_usage_type. Bits 6:7 are reserved. + */ + uint8_t bmAttributes; + + /** Maximum packet size this endpoint is capable of sending/receiving. */ + uint16_t wMaxPacketSize; + + /** Interval for polling endpoint for data transfers. */ + uint8_t bInterval; + + /** For audio devices only: the rate at which synchronization feedback + * is provided. */ + uint8_t bRefresh; + + /** For audio devices only: the address if the synch endpoint */ + uint8_t bSynchAddress; + + /** Extra descriptors. If libusbx encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A structure representing the standard USB interface descriptor. This + * descriptor is documented in section 9.6.5 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_interface_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE + * in this context. */ + uint8_t bDescriptorType; + + /** Number of this interface */ + uint8_t bInterfaceNumber; + + /** Value used to select this alternate setting for this interface */ + uint8_t bAlternateSetting; + + /** Number of endpoints used by this interface (excluding the control + * endpoint). */ + uint8_t bNumEndpoints; + + /** USB-IF class code for this interface. See \ref libusb_class_code. */ + uint8_t bInterfaceClass; + + /** USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value */ + uint8_t bInterfaceSubClass; + + /** USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values */ + uint8_t bInterfaceProtocol; + + /** Index of string descriptor describing this interface */ + uint8_t iInterface; + + /** Array of endpoint descriptors. This length of this array is determined + * by the bNumEndpoints field. */ + const struct libusb_endpoint_descriptor *endpoint; + + /** Extra descriptors. If libusbx encounters unknown interface descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A collection of alternate settings for a particular USB interface. + */ +struct libusb_interface { + /** Array of interface descriptors. The length of this array is determined + * by the num_altsetting field. */ + const struct libusb_interface_descriptor *altsetting; + + /** The number of alternate settings that belong to this interface */ + int num_altsetting; +}; + +/** \ingroup desc + * A structure representing the standard USB configuration descriptor. This + * descriptor is documented in section 9.6.3 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_config_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG + * in this context. */ + uint8_t bDescriptorType; + + /** Total length of data returned for this configuration */ + uint16_t wTotalLength; + + /** Number of interfaces supported by this configuration */ + uint8_t bNumInterfaces; + + /** Identifier value for this configuration */ + uint8_t bConfigurationValue; + + /** Index of string descriptor describing this configuration */ + uint8_t iConfiguration; + + /** Configuration characteristics */ + uint8_t bmAttributes; + + /** Maximum power consumption of the USB device from this bus in this + * configuration when the device is fully opreation. Expressed in units + * of 2 mA. */ + uint8_t MaxPower; + + /** Array of interfaces supported by this configuration. The length of + * this array is determined by the bNumInterfaces field. */ + const struct libusb_interface *interface; + + /** Extra descriptors. If libusbx encounters unknown configuration + * descriptors, it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A structure representing the superspeed endpoint companion + * descriptor. This descriptor is documented in section 9.6.7 of + * the USB 3.0 specification. All multiple-byte fields are represented in + * host-endian format. + */ +struct libusb_ss_endpoint_companion_descriptor { + + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_SS_ENDPOINT_COMPANION in + * this context. */ + uint8_t bDescriptorType; + + + /** The maximum number of packets the endpoint can send or + * recieve as part of a burst. */ + uint8_t bMaxBurst; + + /** In bulk EP: bits 4:0 represents the maximum number of + * streams the EP supports. In isochronous EP: bits 1:0 + * represents the Mult - a zero based value that determines + * the maximum number of packets within a service interval */ + uint8_t bmAttributes; + + /** The total number of bytes this EP will transfer every + * service interval. valid only for periodic EPs. */ + uint16_t wBytesPerInterval; +}; + +/** \ingroup desc + * A generic representation of a BOS Device Capability descriptor. It is + * advised to check bDevCapabilityType and call the matching + * libusb_get_*_descriptor function to get a structure fully matching the type. + */ +struct libusb_bos_dev_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + /** Device Capability type */ + uint8_t bDevCapabilityType; + /** Device Capability data (bLength - 3 bytes) */ + uint8_t dev_capability_data +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup desc + * A structure representing the Binary Device Object Store (BOS) descriptor. + * This descriptor is documented in section 9.6.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_bos_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_BOS LIBUSB_DT_BOS + * in this context. */ + uint8_t bDescriptorType; + + /** Length of this descriptor and all of its sub descriptors */ + uint16_t wTotalLength; + + /** The number of separate device capability descriptors in + * the BOS */ + uint8_t bNumDeviceCaps; + + /** bNumDeviceCap Device Capability Descriptors */ + struct libusb_bos_dev_capability_descriptor *dev_capability +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup desc + * A structure representing the USB 2.0 Extension descriptor + * This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_usb_2_0_extension_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION + * LIBUSB_BT_USB_2_0_EXTENSION in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_usb_2_0_extension_attributes. */ + uint32_t bmAttributes; +}; + +/** \ingroup desc + * A structure representing the SuperSpeed USB Device Capability descriptor + * This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_ss_usb_device_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_ss_usb_device_capability_attributes. */ + uint8_t bmAttributes; + + /** Bitmap encoding of the speed supported by this device when + * operating in SuperSpeed mode. See \ref libusb_supported_speed. */ + uint16_t wSpeedSupported; + + /** The lowest speed at which all the functionality supported + * by the device is available to the user. For example if the + * device supports all its functionality when connected at + * full speed and above then it sets this value to 1. */ + uint8_t bFunctionalitySupport; + + /** U1 Device Exit Latency. */ + uint8_t bU1DevExitLat; + + /** U2 Device Exit Latency. */ + uint16_t bU2DevExitLat; +}; + +/** \ingroup desc + * A structure representing the Container ID descriptor. + * This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification. + * All multiple-byte fields, except UUIDs, are represented in host-endian format. + */ +struct libusb_container_id_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID + * LIBUSB_BT_CONTAINER_ID in this context. */ + uint8_t bDevCapabilityType; + + /** Reserved field */ + uint8_t bReserved; + + /** 128 bit UUID */ + uint8_t ContainerID[16]; +}; + +/** \ingroup asyncio + * Setup packet for control transfers. */ +struct libusb_control_setup { + /** Request type. Bits 0:4 determine recipient, see + * \ref libusb_request_recipient. Bits 5:6 determine type, see + * \ref libusb_request_type. Bit 7 determines data transfer direction, see + * \ref libusb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref libusb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +}; + +#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) + +/* libusbx */ + +struct libusb_context; +struct libusb_device; +struct libusb_device_handle; +struct libusb_hotplug_callback; + +/** \ingroup lib + * Structure providing the version of the libusbx runtime + */ +struct libusb_version { + /** Library major version. */ + const uint16_t major; + + /** Library minor version. */ + const uint16_t minor; + + /** Library micro version. */ + const uint16_t micro; + + /** Library nano version. */ + const uint16_t nano; + + /** Library release candidate suffix string, e.g. "-rc4". */ + const char *rc; + + /** For ABI compatibility only. */ + const char* describe; +}; + +/** \ingroup lib + * Structure representing a libusbx session. The concept of individual libusbx + * sessions allows for your program to use two libraries (or dynamically + * load two modules) which both independently use libusb. This will prevent + * interference between the individual libusbx users - for example + * libusb_set_debug() will not affect the other user of the library, and + * libusb_exit() will not destroy resources that the other user is still + * using. + * + * Sessions are created by libusb_init() and destroyed through libusb_exit(). + * If your application is guaranteed to only ever include a single libusbx + * user (i.e. you), you do not have to worry about contexts: pass NULL in + * every function call where a context is required. The default context + * will be used. + * + * For more information, see \ref contexts. + */ +typedef struct libusb_context libusb_context; + +/** \ingroup dev + * Structure representing a USB device detected on the system. This is an + * opaque type for which you are only ever provided with a pointer, usually + * originating from libusb_get_device_list(). + * + * Certain operations can be performed on a device, but in order to do any + * I/O you will have to first obtain a device handle using libusb_open(). + * + * Devices are reference counted with libusb_ref_device() and + * libusb_unref_device(), and are freed when the reference count reaches 0. + * New devices presented by libusb_get_device_list() have a reference count of + * 1, and libusb_free_device_list() can optionally decrease the reference count + * on all devices in the list. libusb_open() adds another reference which is + * later destroyed by libusb_close(). + */ +typedef struct libusb_device libusb_device; + + +/** \ingroup dev + * Structure representing a handle on a USB device. This is an opaque type for + * which you are only ever provided with a pointer, usually originating from + * libusb_open(). + * + * A device handle is used to perform I/O and other operations. When finished + * with a device handle, you should call libusb_close(). + */ +typedef struct libusb_device_handle libusb_device_handle; + +/** \ingroup dev + * Speed codes. Indicates the speed at which the device is operating. + */ +enum libusb_speed { + /** The OS doesn't report or know the device speed. */ + LIBUSB_SPEED_UNKNOWN = 0, + + /** The device is operating at low speed (1.5MBit/s). */ + LIBUSB_SPEED_LOW = 1, + + /** The device is operating at full speed (12MBit/s). */ + LIBUSB_SPEED_FULL = 2, + + /** The device is operating at high speed (480MBit/s). */ + LIBUSB_SPEED_HIGH = 3, + + /** The device is operating at super speed (5000MBit/s). */ + LIBUSB_SPEED_SUPER = 4, +}; + +/** \ingroup dev + * Supported speeds (wSpeedSupported) bitfield. Indicates what + * speeds the device supports. + */ +enum libusb_supported_speed { + /** Low speed operation supported (1.5MBit/s). */ + LIBUSB_LOW_SPEED_OPERATION = 1, + + /** Full speed operation supported (12MBit/s). */ + LIBUSB_FULL_SPEED_OPERATION = 2, + + /** High speed operation supported (480MBit/s). */ + LIBUSB_HIGH_SPEED_OPERATION = 4, + + /** Superspeed operation supported (5000MBit/s). */ + LIBUSB_SUPER_SPEED_OPERATION = 8, +}; + +/** \ingroup dev + * Masks for the bits of the + * \ref libusb_usb_2_0_extension_descriptor::bmAttributes "bmAttributes" field + * of the USB 2.0 Extension descriptor. + */ +enum libusb_usb_2_0_extension_attributes { + /** Supports Link Power Management (LPM) */ + LIBUSB_BM_LPM_SUPPORT = 2, +}; + +/** \ingroup dev + * Masks for the bits of the + * \ref libusb_ss_usb_device_capability_descriptor::bmAttributes "bmAttributes" field + * field of the SuperSpeed USB Device Capability descriptor. + */ +enum libusb_ss_usb_device_capability_attributes { + /** Supports Latency Tolerance Messages (LTM) */ + LIBUSB_BM_LTM_SUPPORT = 2, +}; + +/** \ingroup dev + * USB capability types + */ +enum libusb_bos_type { + /** Wireless USB device capability */ + LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY = 1, + + /** USB 2.0 extensions */ + LIBUSB_BT_USB_2_0_EXTENSION = 2, + + /** SuperSpeed USB device capability */ + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY = 3, + + /** Container ID type */ + LIBUSB_BT_CONTAINER_ID = 4, +}; + +/** \ingroup misc + * Error codes. Most libusbx functions return 0 on success or one of these + * codes on failure. + * You can call libusb_error_name() to retrieve a string representation of an + * error code or libusb_strerror() to get an end-user suitable description of + * an error code. + */ +enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the + message strings in strerror.c when adding new error codes here. */ + + /** Other error */ + LIBUSB_ERROR_OTHER = -99, +}; + +/* Total number of error codes in enum libusb_error */ +#define LIBUSB_ERROR_COUNT 14 + +/** \ingroup asyncio + * Transfer status codes */ +enum libusb_transfer_status { + /** Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. */ + LIBUSB_TRANSFER_COMPLETED, + + /** Transfer failed */ + LIBUSB_TRANSFER_ERROR, + + /** Transfer timed out */ + LIBUSB_TRANSFER_TIMED_OUT, + + /** Transfer was cancelled */ + LIBUSB_TRANSFER_CANCELLED, + + /** For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. */ + LIBUSB_TRANSFER_STALL, + + /** Device was disconnected */ + LIBUSB_TRANSFER_NO_DEVICE, + + /** Device sent more data than requested */ + LIBUSB_TRANSFER_OVERFLOW, + + /* NB! Remember to update libusb_error_name() + when adding new status codes here. */ +}; + +/** \ingroup asyncio + * libusb_transfer.flags values */ +enum libusb_transfer_flags { + /** Report short frames as errors */ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, + + /** Automatically free() transfer buffer during libusb_free_transfer() */ + LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, + + /** Automatically call libusb_free_transfer() after callback returns. + * If this flag is set, it is illegal to call libusb_free_transfer() + * from your transfer callback, as this will result in a double-free + * when this flag is acted upon. */ + LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2, + + /** Terminate transfers that are a multiple of the endpoint's + * wMaxPacketSize with an extra zero length packet. This is useful + * when a device protocol mandates that each logical request is + * terminated by an incomplete packet (i.e. the logical requests are + * not separated by other means). + * + * This flag only affects host-to-device transfers to bulk and interrupt + * endpoints. In other situations, it is ignored. + * + * This flag only affects transfers with a length that is a multiple of + * the endpoint's wMaxPacketSize. On transfers of other lengths, this + * flag has no effect. Therefore, if you are working with a device that + * needs a ZLP whenever the end of the logical request falls on a packet + * boundary, then it is sensible to set this flag on every + * transfer (you do not have to worry about only setting it on transfers + * that end on the boundary). + * + * This flag is currently only supported on Linux. + * On other systems, libusb_submit_transfer() will return + * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set. + * + * Available since libusb-1.0.9. + */ + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, +}; + +/** \ingroup asyncio + * Isochronous packet descriptor. */ +struct libusb_iso_packet_descriptor { + /** Length of data to request in this packet */ + unsigned int length; + + /** Amount of data that was actually transferred */ + unsigned int actual_length; + + /** Status code for this packet */ + enum libusb_transfer_status status; +}; + +struct libusb_transfer; + +/** \ingroup asyncio + * Asynchronous transfer callback function type. When submitting asynchronous + * transfers, you pass a pointer to a callback function of this type via the + * \ref libusb_transfer::callback "callback" member of the libusb_transfer + * structure. libusbx will call this function later, when the transfer has + * completed or failed. See \ref asyncio for more information. + * \param transfer The libusb_transfer struct the callback function is being + * notified about. + */ +typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * The generic USB transfer structure. The user populates this structure and + * then submits it in order to request a transfer. After the transfer has + * completed, the library populates the transfer with the results and passes + * it back to the user. + */ +struct libusb_transfer { + /** Handle of the device that this transfer will be submitted to */ + libusb_device_handle *dev_handle; + + /** A bitwise OR combination of \ref libusb_transfer_flags. */ + uint8_t flags; + + /** Address of the endpoint where this transfer will be sent. */ + unsigned char endpoint; + + /** Type of the endpoint from \ref libusb_transfer_type */ + unsigned char type; + + /** Timeout for this transfer in millseconds. A value of 0 indicates no + * timeout. */ + unsigned int timeout; + + /** The status of the transfer. Read-only, and only for use within + * transfer callback function. + * + * If this is an isochronous transfer, this field may read COMPLETED even + * if there were errors in the frames. Use the + * \ref libusb_iso_packet_descriptor::status "status" field in each packet + * to determine if errors occurred. */ + enum libusb_transfer_status status; + + /** Length of the data buffer */ + int length; + + /** Actual length of data that was transferred. Read-only, and only for + * use within transfer callback function. Not valid for isochronous + * endpoint transfers. */ + int actual_length; + + /** Callback function. This will be invoked when the transfer completes, + * fails, or is cancelled. */ + libusb_transfer_cb_fn callback; + + /** User context data to pass to the callback function. */ + void *user_data; + + /** Data buffer */ + unsigned char *buffer; + + /** Number of isochronous packets. Only used for I/O with isochronous + * endpoints. */ + int num_iso_packets; + + /** Isochronous packet descriptors, for isochronous transfers only. */ + struct libusb_iso_packet_descriptor iso_packet_desc +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup misc + * Capabilities supported by an instance of libusb on the current running + * platform. Test if the loaded library supports a given capability by calling + * \ref libusb_has_capability(). + */ +enum libusb_capability { + /** The libusb_has_capability() API is available. */ + LIBUSB_CAP_HAS_CAPABILITY = 0x0000, + /** Hotplug support is available on this platform. */ + LIBUSB_CAP_HAS_HOTPLUG = 0x0001, + /** The library can access HID devices without requiring user intervention. + * Note that before being able to actually access an HID device, you may + * still have to call additional libusbx functions such as + * \ref libusb_detach_kernel_driver(). */ + LIBUSB_CAP_HAS_HID_ACCESS = 0x0100, + /** The library supports detaching of the default USB driver, using + * \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */ + LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101 +}; + +/** \ingroup lib + * Log message levels. + * - LIBUSB_LOG_LEVEL_NONE (0) : no messages ever printed by the library (default) + * - LIBUSB_LOG_LEVEL_ERROR (1) : error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stdout, warning + * and error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stdout, + * warnings and errors to stderr + */ +enum libusb_log_level { + LIBUSB_LOG_LEVEL_NONE = 0, + LIBUSB_LOG_LEVEL_ERROR, + LIBUSB_LOG_LEVEL_WARNING, + LIBUSB_LOG_LEVEL_INFO, + LIBUSB_LOG_LEVEL_DEBUG, +}; + +int LIBUSB_CALL libusb_init(libusb_context **ctx); +void LIBUSB_CALL libusb_exit(libusb_context *ctx); +void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); +const struct libusb_version * LIBUSB_CALL libusb_get_version(void); +int LIBUSB_CALL libusb_has_capability(uint32_t capability); +const char * LIBUSB_CALL libusb_error_name(int errcode); +int LIBUSB_CALL libusb_setlocale(const char *locale); +const char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode); + +ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, + libusb_device ***list); +void LIBUSB_CALL libusb_free_device_list(libusb_device **list, + int unref_devices); +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); +void LIBUSB_CALL libusb_unref_device(libusb_device *dev); + +int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, + int *config); +int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc); +int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config); +void LIBUSB_CALL libusb_free_config_descriptor( + struct libusb_config_descriptor *config); +int LIBUSB_CALL libusb_get_ss_endpoint_companion_descriptor( + struct libusb_context *ctx, + const struct libusb_endpoint_descriptor *endpoint, + struct libusb_ss_endpoint_companion_descriptor **ep_comp); +void LIBUSB_CALL libusb_free_ss_endpoint_companion_descriptor( + struct libusb_ss_endpoint_companion_descriptor *ep_comp); +int LIBUSB_CALL libusb_get_bos_descriptor(libusb_device_handle *handle, + struct libusb_bos_descriptor **bos); +void LIBUSB_CALL libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos); +int LIBUSB_CALL libusb_get_usb_2_0_extension_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension); +void LIBUSB_CALL libusb_free_usb_2_0_extension_descriptor( + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension); +int LIBUSB_CALL libusb_get_ss_usb_device_capability_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap); +void LIBUSB_CALL libusb_free_ss_usb_device_capability_descriptor( + struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap); +int LIBUSB_CALL libusb_get_container_id_descriptor(struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_container_id_descriptor **container_id); +void LIBUSB_CALL libusb_free_container_id_descriptor( + struct libusb_container_id_descriptor *container_id); +uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_port_number(libusb_device *dev); +int LIBUSB_CALL libusb_get_port_numbers(libusb_device *dev, uint8_t* port_numbers, int port_numbers_len); +LIBUSB_DEPRECATED_FOR(libusb_get_port_numbers) +int LIBUSB_CALL libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t* path, uint8_t path_length); +libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); +int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev); +int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint); + +int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **handle); +void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev, + int configuration); +int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev, + int interface_number); + +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); + +int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev, + int interface_number, int alternate_setting); +int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev); + +int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_set_auto_detach_kernel_driver( + libusb_device_handle *dev, int enable); + +/* async I/O */ + +/** \ingroup asyncio + * Get the data section of a control transfer. This convenience function is here + * to remind you that the data does not start until 8 bytes into the actual + * buffer, as the setup packet comes first. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns pointer to the first byte of the data section + */ +static inline unsigned char *libusb_control_transfer_get_data( + struct libusb_transfer *transfer) +{ + return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; +} + +/** \ingroup asyncio + * Get the control setup packet of a control transfer. This convenience + * function is here to remind you that the control setup occupies the first + * 8 bytes of the transfer data buffer. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns a casted pointer to the start of the transfer data buffer + */ +static inline struct libusb_control_setup *libusb_control_transfer_get_setup( + struct libusb_transfer *transfer) +{ + return (struct libusb_control_setup *) transfer->buffer; +} + +/** \ingroup asyncio + * Helper function to populate the setup packet (first 8 bytes of the data + * buffer) for a control transfer. The wIndex, wValue and wLength values should + * be given in host-endian byte order. + * + * \param buffer buffer to output the setup packet into + * \param bmRequestType see the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field of + * \ref libusb_control_setup + * \param bRequest see the + * \ref libusb_control_setup::bRequest "bRequest" field of + * \ref libusb_control_setup + * \param wValue see the + * \ref libusb_control_setup::wValue "wValue" field of + * \ref libusb_control_setup + * \param wIndex see the + * \ref libusb_control_setup::wIndex "wIndex" field of + * \ref libusb_control_setup + * \param wLength see the + * \ref libusb_control_setup::wLength "wLength" field of + * \ref libusb_control_setup + */ +static inline void libusb_fill_control_setup(unsigned char *buffer, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + setup->bmRequestType = bmRequestType; + setup->bRequest = bRequest; + setup->wValue = libusb_cpu_to_le16(wValue); + setup->wIndex = libusb_cpu_to_le16(wIndex); + setup->wLength = libusb_cpu_to_le16(wLength); +} + +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); +int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); +int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a control transfer. + * + * If you pass a transfer buffer to this function, the first 8 bytes will + * be interpreted as a control setup packet, and the wLength field will be + * used to automatically populate the \ref libusb_transfer::length "length" + * field of the transfer. Therefore the recommended approach is: + * -# Allocate a suitably sized data buffer (including space for control setup) + * -# Call libusb_fill_control_setup() + * -# If this is a host-to-device transfer with a data stage, put the data + * in place after the setup packet + * -# Call this function + * -# Call libusb_submit_transfer() + * + * It is also legal to pass a NULL buffer to this function, in which case this + * function will not attempt to populate the length field. Remember that you + * must then populate the buffer and length fields later. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param buffer data buffer. If provided, this function will interpret the + * first 8 bytes as a setup packet and infer the transfer length from that. + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_control_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, + unsigned int timeout) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + transfer->dev_handle = dev_handle; + transfer->endpoint = 0; + transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; + transfer->timeout = timeout; + transfer->buffer = buffer; + if (setup) + transfer->length = (int) (LIBUSB_CONTROL_SETUP_SIZE + + libusb_le16_to_cpu(setup->wLength)); + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_BULK; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an interrupt transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_interrupt_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an isochronous transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param num_iso_packets the number of isochronous packets + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, int num_iso_packets, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->num_iso_packets = num_iso_packets; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Convenience function to set the length of all packets in an isochronous + * transfer, based on the num_iso_packets field in the transfer structure. + * + * \param transfer a transfer + * \param length the length to set in each isochronous packet descriptor + * \see libusb_get_max_packet_size() + */ +static inline void libusb_set_iso_packet_lengths( + struct libusb_transfer *transfer, unsigned int length) +{ + int i; + for (i = 0; i < transfer->num_iso_packets; i++) + transfer->iso_packet_desc[i].length = length; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer. + * + * This is a thorough function which loops through all preceding packets, + * accumulating their lengths to find the position of the specified packet. + * Typically you will assign equal lengths to each packet in the transfer, + * and hence the above method is sub-optimal. You may wish to use + * libusb_get_iso_packet_buffer_simple() instead. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer_simple() + */ +static inline unsigned char *libusb_get_iso_packet_buffer( + struct libusb_transfer *transfer, unsigned int packet) +{ + int i; + size_t offset = 0; + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + for (i = 0; i < _packet; i++) + offset += transfer->iso_packet_desc[i].length; + + return transfer->buffer + offset; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer, for transfers where each + * packet is of identical size. + * + * This function relies on the assumption that every packet within the transfer + * is of identical size to the first packet. Calculating the location of + * the packet buffer is then just a simple calculation: + * buffer + (packet_size * packet) + * + * Do not use this function on transfers other than those that have identical + * packet lengths for each packet. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer() + */ +static inline unsigned char *libusb_get_iso_packet_buffer_simple( + struct libusb_transfer *transfer, unsigned int packet) +{ + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + return transfer->buffer + ((int) transfer->iso_packet_desc[0].length * _packet); +} + +/* sync I/O */ + +int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout); + +int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +/** \ingroup desc + * Retrieve a descriptor from the default control pipe. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. + * + * \param dev a device handle + * \param desc_type the descriptor type, see \ref libusb_descriptor_type + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +static inline int libusb_get_descriptor(libusb_device_handle *dev, + uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index), + 0, data, (uint16_t) length, 1000); +} + +/** \ingroup desc + * Retrieve a descriptor from a device. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. The string returned is Unicode, as + * detailed in the USB specifications. + * + * \param dev a device handle + * \param desc_index the index of the descriptor to retrieve + * \param langid the language ID for the string descriptor + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + * \see libusb_get_string_descriptor_ascii() + */ +static inline int libusb_get_string_descriptor(libusb_device_handle *dev, + uint8_t desc_index, uint16_t langid, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index), + langid, data, (uint16_t) length, 1000); +} + +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + uint8_t desc_index, unsigned char *data, int length); + +/* polling and timeouts */ + +int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); +int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + +int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed); +int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); +int LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed); +int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); +int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv); + +/** \ingroup poll + * File descriptor for polling + */ +struct libusb_pollfd { + /** Numeric file descriptor */ + int fd; + + /** Event flags to poll for from . POLLIN indicates that you + * should monitor this file descriptor for becoming ready to read from, + * and POLLOUT indicates that you should monitor this file descriptor for + * nonblocking write readiness. */ + short events; +}; + +/** \ingroup poll + * Callback function, invoked when a new file descriptor should be added + * to the set of file descriptors monitored for events. + * \param fd the new file descriptor + * \param events events to monitor for, see \ref libusb_pollfd for a + * description + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, + void *user_data); + +/** \ingroup poll + * Callback function, invoked when a file descriptor should be removed from + * the set of file descriptors being monitored for events. After returning + * from this callback, do not use that file descriptor again. + * \param fd the file descriptor to stop monitoring + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); + +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx); +void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data); + +/** \ingroup hotplug + * Callback handle. + * + * Callbacks handles are generated by libusb_hotplug_register_callback() + * and can be used to deregister callbacks. Callback handles are unique + * per libusb_context and it is safe to call libusb_hotplug_deregister_callback() + * on an already deregisted callback. + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * For more information, see \ref hotplug. + */ +typedef int libusb_hotplug_callback_handle; + +/** \ingroup hotplug + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * Flags for hotplug events */ +typedef enum { + /** Arm the callback and fire it for all matching currently attached devices. */ + LIBUSB_HOTPLUG_ENUMERATE = 1, +} libusb_hotplug_flag; + +/** \ingroup hotplug + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * Hotplug events */ +typedef enum { + /** A device has been plugged in and is ready to use */ + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01, + + /** A device has left and is no longer available. + * It is the user's responsibility to call libusb_close on any handle associated with a disconnected device. + * It is safe to call libusb_get_device_descriptor on a device that has left */ + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 0x02, +} libusb_hotplug_event; + +/** \ingroup hotplug + * Wildcard matching for hotplug events */ +#define LIBUSB_HOTPLUG_MATCH_ANY -1 + +/** \ingroup hotplug + * Hotplug callback function type. When requesting hotplug event notifications, + * you pass a pointer to a callback function of this type. + * + * This callback may be called by an internal event thread and as such it is + * recommended the callback do minimal processing before returning. + * + * libusbx will call this function later, when a matching event had happened on + * a matching device. See \ref hotplug for more information. + * + * It is safe to call either libusb_hotplug_register_callback() or + * libusb_hotplug_deregister_callback() from within a callback function. + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * \param libusb_context context of this notification + * \param device libusb_device this event occurred on + * \param event event that occurred + * \param user_data user data provided when this callback was registered + * \returns bool whether this callback is finished processing events. + * returning 1 will cause this callback to be deregistered + */ +typedef int (LIBUSB_CALL *libusb_hotplug_callback_fn)(libusb_context *ctx, + libusb_device *device, + libusb_hotplug_event event, + void *user_data); + +/** \ingroup hotplug + * Register a hotplug callback function + * + * Register a callback with the libusb_context. The callback will fire + * when a matching event occurs on a matching device. The callback is + * armed until either it is deregistered with libusb_hotplug_deregister_callback() + * or the supplied callback returns 1 to indicate it is finished processing events. + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * \param[in] ctx context to register this callback with + * \param[in] events bitwise or of events that will trigger this callback. See \ref + * libusb_hotplug_event + * \param[in] flags hotplug callback flags. See \ref libusb_hotplug_flag + * \param[in] vendor_id the vendor id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] product_id the product id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] dev_class the device class to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] cb_fn the function to be invoked on a matching event/device + * \param[in] user_data user data to pass to the callback function + * \param[out] handle pointer to store the handle of the allocated callback (can be NULL) + * \returns LIBUSB_SUCCESS on success LIBUSB_ERROR code on failure + */ +int LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx, + libusb_hotplug_event events, + libusb_hotplug_flag flags, + int vendor_id, int product_id, + int dev_class, + libusb_hotplug_callback_fn cb_fn, + void *user_data, + libusb_hotplug_callback_handle *handle); + +/** \ingroup hotplug + * Deregisters a hotplug callback. + * + * Deregister a callback from a libusb_context. This function is safe to call from within + * a hotplug callback. + * + * Since version 1.0.16, \ref LIBUSBX_API_VERSION >= 0x01000102 + * + * \param[in] ctx context this callback is registered with + * \param[in] handle the handle of the callback to deregister + */ +void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, + libusb_hotplug_callback_handle handle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/libusbx/libusb/libusbi.h b/Externals/libusbx/libusb/libusbi.h new file mode 100644 index 0000000000..02efae300d --- /dev/null +++ b/Externals/libusbx/libusb/libusbi.h @@ -0,0 +1,1004 @@ +/* + * Internal header for libusbx + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSBI_H +#define LIBUSBI_H + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_POLL_H +#include +#endif + +#ifdef HAVE_MISSING_H +#include "missing.h" +#endif +#include "libusb.h" +#include "version.h" + +/* Inside the libusbx code, mark all public functions as follows: + * return_type API_EXPORTED function_name(params) { ... } + * But if the function returns a pointer, mark it as follows: + * DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... } + * In the libusbx public header, mark all declarations as: + * return_type LIBUSB_CALL function_name(params); + */ +#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY + +#define DEVICE_DESC_LENGTH 18 + +#define USB_MAXENDPOINTS 32 +#define USB_MAXINTERFACES 32 +#define USB_MAXCONFIG 8 + +/* Backend specific capabilities */ +#define USBI_CAP_HAS_HID_ACCESS 0x00010000 +#define USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER 0x00020000 + +/* Maximum number of bytes in a log line */ +#define USBI_MAX_LOG_LEN 1024 +/* Terminator for log lines */ +#define USBI_LOG_LINE_END "\n" + +/* The following is used to silence warnings for unused variables */ +#define UNUSED(var) do { (void)(var); } while(0) + +#if !defined(ARRAYSIZE) +#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) +#endif + +struct list_head { + struct list_head *prev, *next; +}; + +/* Get an entry from the list + * ptr - the address of this list_head element in "type" + * type - the data type that contains "member" + * member - the list_head element in "type" + */ +#define list_entry(ptr, type, member) \ + ((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member))) + +/* Get each entry from a list + * pos - A structure pointer has a "member" element + * head - list head + * member - the list_head element in "pos" + * type - the type of the first parameter + */ +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_entry((head)->next, type, member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, type, member)) + +#define list_for_each_entry_safe(pos, n, head, member, type) \ + for (pos = list_entry((head)->next, type, member), \ + n = list_entry(pos->member.next, type, member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, type, member)) + +#define list_empty(entry) ((entry)->next == (entry)) + +static inline void list_init(struct list_head *entry) +{ + entry->prev = entry->next = entry; +} + +static inline void list_add(struct list_head *entry, struct list_head *head) +{ + entry->next = head->next; + entry->prev = head; + + head->next->prev = entry; + head->next = entry; +} + +static inline void list_add_tail(struct list_head *entry, + struct list_head *head) +{ + entry->next = head; + entry->prev = head->prev; + + head->prev->next = entry; + head->prev = entry; +} + +static inline void list_del(struct list_head *entry) +{ + entry->next->prev = entry->prev; + entry->prev->next = entry->next; + entry->next = entry->prev = NULL; +} + +static inline void *usbi_reallocf(void *ptr, size_t size) +{ + void *ret = realloc(ptr, size); + if (!ret) + free(ptr); + return ret; +} + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *mptr = (ptr); \ + (type *)( (char *)mptr - offsetof(type,member) );}) + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) + +void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, ...); + +void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, va_list args); + +#if !defined(_MSC_VER) || _MSC_VER >= 1400 + +#ifdef ENABLE_LOGGING +#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) +#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__) +#else +#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0) +#define usbi_dbg(...) do {} while(0) +#endif + +#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__) +#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__) +#define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__) + +#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +#ifdef ENABLE_LOGGING +#define LOG_BODY(ctxt, level) \ +{ \ + va_list args; \ + va_start (args, format); \ + usbi_log_v(ctxt, level, "", format, args); \ + va_end(args); \ +} +#else +#define LOG_BODY(ctxt, level) do { (void)(ctxt); } while(0) +#endif + +static inline void usbi_info(struct libusb_context *ctx, const char *format, + ...) + LOG_BODY(ctx,LIBUSB_LOG_LEVEL_INFO) +static inline void usbi_warn(struct libusb_context *ctx, const char *format, + ...) + LOG_BODY(ctx,LIBUSB_LOG_LEVEL_WARNING) +static inline void usbi_err( struct libusb_context *ctx, const char *format, + ...) + LOG_BODY(ctx,LIBUSB_LOG_LEVEL_ERROR) + +static inline void usbi_dbg(const char *format, ...) + LOG_BODY(NULL,LIBUSB_LOG_LEVEL_DEBUG) + +#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +#define USBI_GET_CONTEXT(ctx) if (!(ctx)) (ctx) = usbi_default_context +#define DEVICE_CTX(dev) ((dev)->ctx) +#define HANDLE_CTX(handle) (DEVICE_CTX((handle)->dev)) +#define TRANSFER_CTX(transfer) (HANDLE_CTX((transfer)->dev_handle)) +#define ITRANSFER_CTX(transfer) \ + (TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer))) + +#define IS_EPIN(ep) (0 != ((ep) & LIBUSB_ENDPOINT_IN)) +#define IS_EPOUT(ep) (!IS_EPIN(ep)) +#define IS_XFERIN(xfer) (0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN)) +#define IS_XFEROUT(xfer) (!IS_XFERIN(xfer)) + +/* Internal abstraction for thread synchronization */ +#if defined(THREADS_POSIX) +#include "os/threads_posix.h" +#elif defined(OS_WINDOWS) || defined(OS_WINCE) +#include +#endif + +extern struct libusb_context *usbi_default_context; + +struct libusb_context { + int debug; + int debug_fixed; + + /* internal control pipe, used for interrupting event handling when + * something needs to modify poll fds. */ + int ctrl_pipe[2]; + + struct list_head usb_devs; + usbi_mutex_t usb_devs_lock; + + /* A list of open handles. Backends are free to traverse this if required. + */ + struct list_head open_devs; + usbi_mutex_t open_devs_lock; + + /* A list of registered hotplug callbacks */ + struct list_head hotplug_cbs; + usbi_mutex_t hotplug_cbs_lock; + int hotplug_pipe[2]; + + /* this is a list of in-flight transfer handles, sorted by timeout + * expiration. URBs to timeout the soonest are placed at the beginning of + * the list, URBs that will time out later are placed after, and urbs with + * infinite timeout are always placed at the very end. */ + struct list_head flying_transfers; + usbi_mutex_t flying_transfers_lock; + + /* list of poll fds */ + struct list_head pollfds; + usbi_mutex_t pollfds_lock; + + /* a counter that is set when we want to interrupt event handling, in order + * to modify the poll fd set. and a lock to protect it. */ + unsigned int pollfd_modify; + usbi_mutex_t pollfd_modify_lock; + + /* user callbacks for pollfd changes */ + libusb_pollfd_added_cb fd_added_cb; + libusb_pollfd_removed_cb fd_removed_cb; + void *fd_cb_user_data; + + /* ensures that only one thread is handling events at any one time */ + usbi_mutex_t events_lock; + + /* used to see if there is an active thread doing event handling */ + int event_handler_active; + + /* used to wait for event completion in threads other than the one that is + * event handling */ + usbi_mutex_t event_waiters_lock; + usbi_cond_t event_waiters_cond; + +#ifdef USBI_TIMERFD_AVAILABLE + /* used for timeout handling, if supported by OS. + * this timerfd is maintained to trigger on the next pending timeout */ + int timerfd; +#endif + + struct list_head list; +}; + +#ifdef USBI_TIMERFD_AVAILABLE +#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0) +#else +#define usbi_using_timerfd(ctx) (0) +#endif + +struct libusb_device { + /* lock protects refcnt, everything else is finalized at initialization + * time */ + usbi_mutex_t lock; + int refcnt; + + struct libusb_context *ctx; + + uint8_t bus_number; + uint8_t port_number; + struct libusb_device* parent_dev; + uint8_t device_address; + uint8_t num_configurations; + enum libusb_speed speed; + + struct list_head list; + unsigned long session_data; + + struct libusb_device_descriptor device_descriptor; + int attached; + + unsigned char os_priv +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +struct libusb_device_handle { + /* lock protects claimed_interfaces */ + usbi_mutex_t lock; + unsigned long claimed_interfaces; + + struct list_head list; + struct libusb_device *dev; + int auto_detach_kernel_driver; + unsigned char os_priv +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +enum { + USBI_CLOCK_MONOTONIC, + USBI_CLOCK_REALTIME +}; + +/* in-memory transfer layout: + * + * 1. struct usbi_transfer + * 2. struct libusb_transfer (which includes iso packets) [variable size] + * 3. os private data [variable size] + * + * from a libusb_transfer, you can get the usbi_transfer by rewinding the + * appropriate number of bytes. + * the usbi_transfer includes the number of allocated packets, so you can + * determine the size of the transfer and hence the start and length of the + * OS-private data. + */ + +struct usbi_transfer { + int num_iso_packets; + struct list_head list; + struct timeval timeout; + int transferred; + uint8_t flags; + + /* this lock is held during libusb_submit_transfer() and + * libusb_cancel_transfer() (allowing the OS backend to prevent duplicate + * cancellation, submission-during-cancellation, etc). the OS backend + * should also take this lock in the handle_events path, to prevent the user + * cancelling the transfer from another thread while you are processing + * its completion (presumably there would be races within your OS backend + * if this were possible). */ + usbi_mutex_t lock; +}; + +enum usbi_transfer_flags { + /* The transfer has timed out */ + USBI_TRANSFER_TIMED_OUT = 1 << 0, + + /* Set by backend submit_transfer() if the OS handles timeout */ + USBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 1, + + /* Cancellation was requested via libusb_cancel_transfer() */ + USBI_TRANSFER_CANCELLING = 1 << 2, + + /* Operation on the transfer failed because the device disappeared */ + USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 3, + + /* Set by backend submit_transfer() if the fds in use have been updated */ + USBI_TRANSFER_UPDATED_FDS = 1 << 4, +}; + +#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ + ((struct libusb_transfer *)(((unsigned char *)(transfer)) \ + + sizeof(struct usbi_transfer))) +#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ + ((struct usbi_transfer *)(((unsigned char *)(transfer)) \ + - sizeof(struct usbi_transfer))) + +static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) +{ + return ((unsigned char *)transfer) + sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (transfer->num_iso_packets + * sizeof(struct libusb_iso_packet_descriptor)); +} + +/* bus structures */ + +/* All standard descriptors have these 2 fields in common */ +struct usb_descriptor_header { + uint8_t bLength; + uint8_t bDescriptorType; +}; + +/* shared data and functions */ + +int usbi_io_init(struct libusb_context *ctx); +void usbi_io_exit(struct libusb_context *ctx); + +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id); +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id); +int usbi_sanitize_device(struct libusb_device *dev); +void usbi_handle_disconnect(struct libusb_device_handle *handle); + +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status); +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); + +int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, + void *dest, int host_endian); +int usbi_device_cache_descriptor(libusb_device *dev); +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx); + +void usbi_connect_device (struct libusb_device *dev); +void usbi_disconnect_device (struct libusb_device *dev); + +/* Internal abstraction for poll (needs struct usbi_transfer on Windows) */ +#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) +#include +#include "os/poll_posix.h" +#elif defined(OS_WINDOWS) || defined(OS_WINCE) +#include "os/poll_windows.h" +#endif + +#if (defined(OS_WINDOWS) || defined(OS_WINCE)) && !defined(__GNUC__) +#define snprintf _snprintf +#define vsnprintf _vsnprintf +int usbi_gettimeofday(struct timeval *tp, void *tzp); +#define LIBUSB_GETTIMEOFDAY_WIN32 +#define HAVE_USBI_GETTIMEOFDAY +#else +#ifdef HAVE_GETTIMEOFDAY +#define usbi_gettimeofday(tv, tz) gettimeofday((tv), (tz)) +#define HAVE_USBI_GETTIMEOFDAY +#endif +#endif + +struct usbi_pollfd { + /* must come first */ + struct libusb_pollfd pollfd; + + struct list_head list; +}; + +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events); +void usbi_remove_pollfd(struct libusb_context *ctx, int fd); +void usbi_fd_notification(struct libusb_context *ctx); + +/* device discovery */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +struct discovered_devs { + size_t len; + size_t capacity; + struct libusb_device *devices +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev); + +/* OS abstraction */ + +/* This is the interface that OS backends need to implement. + * All fields are mandatory, except ones explicitly noted as optional. */ +struct usbi_os_backend { + /* A human-readable name for your backend, e.g. "Linux usbfs" */ + const char *name; + + /* Binary mask for backend specific capabilities */ + uint32_t caps; + + /* Perform initialization of your backend. You might use this function + * to determine specific capabilities of the system, allocate required + * data structures for later, etc. + * + * This function is called when a libusbx user initializes the library + * prior to use. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*init)(struct libusb_context *ctx); + + /* Deinitialization. Optional. This function should destroy anything + * that was set up by init. + * + * This function is called when the user deinitializes the library. + */ + void (*exit)(void); + + /* Enumerate all the USB devices on the system, returning them in a list + * of discovered devices. + * + * Your implementation should enumerate all devices on the system, + * regardless of whether they have been seen before or not. + * + * When you have found a device, compute a session ID for it. The session + * ID should uniquely represent that particular device for that particular + * connection session since boot (i.e. if you disconnect and reconnect a + * device immediately after, it should be assigned a different session ID). + * If your OS cannot provide a unique session ID as described above, + * presenting a session ID of (bus_number << 8 | device_address) should + * be sufficient. Bus numbers and device addresses wrap and get reused, + * but that is an unlikely case. + * + * After computing a session ID for a device, call + * usbi_get_device_by_session_id(). This function checks if libusbx already + * knows about the device, and if so, it provides you with a libusb_device + * structure for it. + * + * If usbi_get_device_by_session_id() returns NULL, it is time to allocate + * a new device structure for the device. Call usbi_alloc_device() to + * obtain a new libusb_device structure with reference count 1. Populate + * the bus_number and device_address attributes of the new device, and + * perform any other internal backend initialization you need to do. At + * this point, you should be ready to provide device descriptors and so + * on through the get_*_descriptor functions. Finally, call + * usbi_sanitize_device() to perform some final sanity checks on the + * device. Assuming all of the above succeeded, we can now continue. + * If any of the above failed, remember to unreference the device that + * was returned by usbi_alloc_device(). + * + * At this stage we have a populated libusb_device structure (either one + * that was found earlier, or one that we have just allocated and + * populated). This can now be added to the discovered devices list + * using discovered_devs_append(). Note that discovered_devs_append() + * may reallocate the list, returning a new location for it, and also + * note that reallocation can fail. Your backend should handle these + * error conditions appropriately. + * + * This function should not generate any bus I/O and should not block. + * If I/O is required (e.g. reading the active configuration value), it is + * OK to ignore these suggestions :) + * + * This function is executed when the user wishes to retrieve a list + * of USB devices connected to the system. + * + * If the backend has hotplug support, this function is not used! + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*get_device_list)(struct libusb_context *ctx, + struct discovered_devs **discdevs); + + /* Apps which were written before hotplug support, may listen for + * hotplug events on their own and call libusb_get_device_list on + * device addition. In this case libusb_get_device_list will likely + * return a list without the new device in there, as the hotplug + * event thread will still be busy enumerating the device, which may + * take a while, or may not even have seen the event yet. + * + * To avoid this libusb_get_device_list will call this optional + * function for backends with hotplug support before copying + * ctx->usb_devs to the user. In this function the backend should + * ensure any pending hotplug events are fully processed before + * returning. + * + * Optional, should be implemented by backends with hotplug support. + */ + void (*hotplug_poll)(void); + + /* Open a device for I/O and other USB operations. The device handle + * is preallocated for you, you can retrieve the device in question + * through handle->dev. + * + * Your backend should allocate any internal resources required for I/O + * and other operations so that those operations can happen (hopefully) + * without hiccup. This is also a good place to inform libusbx that it + * should monitor certain file descriptors related to this device - + * see the usbi_add_pollfd() function. + * + * This function should not generate any bus I/O and should not block. + * + * This function is called when the user attempts to obtain a device + * handle for a device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since + * discovery + * - another LIBUSB_ERROR code on other failure + * + * Do not worry about freeing the handle on failed open, the upper layers + * do this for you. + */ + int (*open)(struct libusb_device_handle *handle); + + /* Close a device such that the handle cannot be used again. Your backend + * should destroy any resources that were allocated in the open path. + * This may also be a good place to call usbi_remove_pollfd() to inform + * libusbx of any file descriptors associated with this device that should + * no longer be monitored. + * + * This function is called when the user closes a device handle. + */ + void (*close)(struct libusb_device_handle *handle); + + /* Retrieve the device descriptor from a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. Alternatively, you may be able + * to retrieve it from a kernel interface (some Linux setups can do this) + * still without generating bus I/O. + * + * This function is expected to write DEVICE_DESC_LENGTH (18) bytes into + * buffer, which is guaranteed to be big enough. + * + * This function is called when sanity-checking a device before adding + * it to the list of discovered devices, and also when the user requests + * to read the device descriptor. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return 0 on success or a LIBUSB_ERROR code on failure. + */ + int (*get_device_descriptor)(struct libusb_device *device, + unsigned char *buffer, int *host_endian); + + /* Get the ACTIVE configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. You may also have to keep track + * of which configuration is active when the user changes it. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * - another LIBUSB_ERROR code on other failure + */ + int (*get_active_config_descriptor)(struct libusb_device *device, + unsigned char *buffer, size_t len, int *host_endian); + + /* Get a specific configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. + * + * The requested descriptor is expressed as a zero-based index (i.e. 0 + * indicates that we are requesting the first descriptor). The index does + * not (necessarily) equal the bConfigurationValue of the configuration + * being requested. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return 0 on success or a LIBUSB_ERROR code on failure. + */ + int (*get_config_descriptor)(struct libusb_device *device, + uint8_t config_index, unsigned char *buffer, size_t len, + int *host_endian); + + /* Like get_config_descriptor but then by bConfigurationValue instead + * of by index. + * + * Optional, if not present the core will call get_config_descriptor + * for all configs until it finds the desired bConfigurationValue. + * + * Returns a pointer to the raw-descriptor in *buffer, this memory + * is valid as long as device is valid. + * + * Returns the length of the returned raw-descriptor on success, + * or a LIBUSB_ERROR code on failure. + */ + int (*get_config_descriptor_by_value)(struct libusb_device *device, + uint8_t bConfigurationValue, unsigned char **buffer, + int *host_endian); + + /* Get the bConfigurationValue for the active configuration for a device. + * Optional. This should only be implemented if you can retrieve it from + * cache (don't generate I/O). + * + * If you cannot retrieve this from cache, either do not implement this + * function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause + * libusbx to retrieve the information through a standard control transfer. + * + * This function must be non-blocking. + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without + * blocking + * - another LIBUSB_ERROR code on other failure. + */ + int (*get_configuration)(struct libusb_device_handle *handle, int *config); + + /* Set the active configuration for a device. + * + * A configuration value of -1 should put the device in unconfigured state. + * + * This function can block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence + * configuration cannot be changed) + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure. + */ + int (*set_configuration)(struct libusb_device_handle *handle, int config); + + /* Claim an interface. When claimed, the application can then perform + * I/O to an interface's endpoints. + * + * This function should not generate any bus I/O and should not block. + * Interface claiming is a logical operation that simply ensures that + * no other drivers/applications are using the interface, and after + * claiming, no other drivers/applicatiosn can use the interface because + * we now "own" it. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the interface does not exist + * - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*claim_interface)(struct libusb_device_handle *handle, int interface_number); + + /* Release a previously claimed interface. + * + * This function should also generate a SET_INTERFACE control request, + * resetting the alternate setting of that interface to 0. It's OK for + * this function to block as a result. + * + * You will only ever be asked to release an interface which was + * successfully claimed earlier. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*release_interface)(struct libusb_device_handle *handle, int interface_number); + + /* Set the alternate setting for an interface. + * + * You will only ever be asked to set the alternate setting for an + * interface which was successfully claimed earlier. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*set_interface_altsetting)(struct libusb_device_handle *handle, + int interface_number, int altsetting); + + /* Clear a halt/stall condition on an endpoint. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*clear_halt)(struct libusb_device_handle *handle, + unsigned char endpoint); + + /* Perform a USB port reset to reinitialize a device. + * + * If possible, the handle should still be usable after the reset + * completes, assuming that the device descriptors did not change during + * reset and all previous interface state can be restored. + * + * If something changes, or you cannot easily locate/verify the resetted + * device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application + * to close the old handle and re-enumerate the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device + * has been disconnected since it was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*reset_device)(struct libusb_device_handle *handle); + + /* Determine if a kernel driver is active on an interface. Optional. + * + * The presence of a kernel driver on an interface indicates that any + * calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code. + * + * Return: + * - 0 if no driver is active + * - 1 if a driver is active + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*kernel_driver_active)(struct libusb_device_handle *handle, + int interface_number); + + /* Detach a kernel driver from an interface. Optional. + * + * After detaching a kernel driver, the interface should be available + * for claim. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*detach_kernel_driver)(struct libusb_device_handle *handle, + int interface_number); + + /* Attach a kernel driver to an interface. Optional. + * + * Reattach a kernel driver to the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, + * preventing reattachment + * - another LIBUSB_ERROR code on other failure + */ + int (*attach_kernel_driver)(struct libusb_device_handle *handle, + int interface_number); + + /* Destroy a device. Optional. + * + * This function is called when the last reference to a device is + * destroyed. It should free any resources allocated in the get_device_list + * path. + */ + void (*destroy_device)(struct libusb_device *dev); + + /* Submit a transfer. Your implementation should take the transfer, + * morph it into whatever form your platform requires, and submit it + * asynchronously. + * + * This function must not block. + * + * This function gets called with the flying_transfers_lock locked! + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * - another LIBUSB_ERROR code on other failure + */ + int (*submit_transfer)(struct usbi_transfer *itransfer); + + /* Cancel a previously submitted transfer. + * + * This function must not block. The transfer cancellation must complete + * later, resulting in a call to usbi_handle_transfer_cancellation() + * from the context of handle_events. + */ + int (*cancel_transfer)(struct usbi_transfer *itransfer); + + /* Clear a transfer as if it has completed or cancelled, but do not + * report any completion/cancellation to the library. You should free + * all private data from the transfer as if you were just about to report + * completion or cancellation. + * + * This function might seem a bit out of place. It is used when libusbx + * detects a disconnected device - it calls this function for all pending + * transfers before reporting completion (with the disconnect code) to + * the user. Maybe we can improve upon this internal interface in future. + */ + void (*clear_transfer_priv)(struct usbi_transfer *itransfer); + + /* Handle any pending events. This involves monitoring any active + * transfers and processing their completion or cancellation. + * + * The function is passed an array of pollfd structures (size nfds) + * as a result of the poll() system call. The num_ready parameter + * indicates the number of file descriptors that have reported events + * (i.e. the poll() return value). This should be enough information + * for you to determine which actions need to be taken on the currently + * active transfers. + * + * For any cancelled transfers, call usbi_handle_transfer_cancellation(). + * For completed transfers, call usbi_handle_transfer_completion(). + * For control/bulk/interrupt transfers, populate the "transferred" + * element of the appropriate usbi_transfer structure before calling the + * above functions. For isochronous transfers, populate the status and + * transferred fields of the iso packet descriptors of the transfer. + * + * This function should also be able to detect disconnection of the + * device, reporting that situation with usbi_handle_disconnect(). + * + * When processing an event related to a transfer, you probably want to + * take usbi_transfer.lock to prevent races. See the documentation for + * the usbi_transfer structure. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*handle_events)(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + + /* Get time from specified clock. At least two clocks must be implemented + by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC. + + Description of clocks: + USBI_CLOCK_REALTIME : clock returns time since system epoch. + USBI_CLOCK_MONOTONIC: clock returns time since unspecified start + time (usually boot). + */ + int (*clock_gettime)(int clkid, struct timespec *tp); + +#ifdef USBI_TIMERFD_AVAILABLE + /* clock ID of the clock that should be used for timerfd */ + clockid_t (*get_timerfd_clockid)(void); +#endif + + /* Number of bytes to reserve for per-device private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_priv_size; + + /* Number of bytes to reserve for per-handle private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_handle_priv_size; + + /* Number of bytes to reserve for per-transfer private backend data. + * This private data area is accessible by calling + * usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance. + */ + size_t transfer_priv_size; + + /* Mumber of additional bytes for os_priv for each iso packet. + * Can your backend use this? */ + /* FIXME: linux can't use this any more. if other OS's cannot either, + * then remove this */ + size_t add_iso_packet_size; +}; + +extern const struct usbi_os_backend * const usbi_backend; + +extern const struct usbi_os_backend linux_usbfs_backend; +extern const struct usbi_os_backend darwin_backend; +extern const struct usbi_os_backend openbsd_backend; +extern const struct usbi_os_backend windows_backend; +extern const struct usbi_os_backend wince_backend; + +extern struct list_head active_contexts_list; +extern usbi_mutex_static_t active_contexts_lock; + +#endif diff --git a/Externals/libusbx/libusb/os/darwin_usb.c b/Externals/libusbx/libusb/os/darwin_usb.c new file mode 100644 index 0000000000..a24558cb59 --- /dev/null +++ b/Externals/libusbx/libusb/os/darwin_usb.c @@ -0,0 +1,1903 @@ +/* -*- Mode: C; indent-tabs-mode:nil -*- */ +/* + * darwin backend for libusbx 1.0 + * Copyright © 2008-2013 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + #include +#endif + +#include "darwin_usb.h" + +/* async event thread */ +static pthread_mutex_t libusb_darwin_at_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER; + +static clock_serv_t clock_realtime; +static clock_serv_t clock_monotonic; + +static CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */ +static volatile int32_t initCount = 0; + +static usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER; +static struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices}; + +#define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev)) + +/* async event thread */ +static pthread_t libusb_darwin_at; + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian); +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_reset_device(struct libusb_device_handle *dev_handle); +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0); + +static int darwin_scan_devices(struct libusb_context *ctx); +static int process_new_device (struct libusb_context *ctx, io_service_t service); + +#if defined(ENABLE_LOGGING) +static const char *darwin_error_str (int result) { + switch (result) { + case kIOReturnSuccess: + return "no error"; + case kIOReturnNotOpen: + return "device not opened for exclusive access"; + case kIOReturnNoDevice: + return "no connection to an IOService"; + case kIOUSBNoAsyncPortErr: + return "no async port has been opened for interface"; + case kIOReturnExclusiveAccess: + return "another process has device opened for exclusive access"; + case kIOUSBPipeStalled: + return "pipe is stalled"; + case kIOReturnError: + return "could not establish a connection to the Darwin kernel"; + case kIOUSBTransactionTimeout: + return "transaction timed out"; + case kIOReturnBadArgument: + return "invalid argument"; + case kIOReturnAborted: + return "transaction aborted"; + case kIOReturnNotResponding: + return "device not responding"; + case kIOReturnOverrun: + return "data overrun"; + case kIOReturnCannotWire: + return "physical memory can not be wired down"; + case kIOReturnNoResources: + return "out of resources"; + case kIOUSBHighSpeedSplitError: + return "high speed split error"; + default: + return "unknown error"; + } +} +#endif + +static int darwin_to_libusb (int result) { + switch (result) { + case kIOReturnUnderrun: + case kIOReturnSuccess: + return LIBUSB_SUCCESS; + case kIOReturnNotOpen: + case kIOReturnNoDevice: + return LIBUSB_ERROR_NO_DEVICE; + case kIOReturnExclusiveAccess: + return LIBUSB_ERROR_ACCESS; + case kIOUSBPipeStalled: + return LIBUSB_ERROR_PIPE; + case kIOReturnBadArgument: + return LIBUSB_ERROR_INVALID_PARAM; + case kIOUSBTransactionTimeout: + return LIBUSB_ERROR_TIMEOUT; + case kIOReturnNotResponding: + case kIOReturnAborted: + case kIOReturnError: + case kIOUSBNoAsyncPortErr: + default: + return LIBUSB_ERROR_OTHER; + } +} + +/* this function must be called with the darwin_cached_devices_lock held */ +static void darwin_deref_cached_device(struct darwin_cached_device *cached_dev) { + cached_dev->refcount--; + /* free the device and remove it from the cache */ + if (0 == cached_dev->refcount) { + list_del(&cached_dev->list); + + (*(cached_dev->device))->Release(cached_dev->device); + free (cached_dev); + } +} + +static void darwin_ref_cached_device(struct darwin_cached_device *cached_dev) { + cached_dev->refcount++; +} + +static int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface; + + int8_t i, iface; + + usbi_dbg ("converting ep address 0x%02x to pipeRef and interface", ep); + + for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) { + cInterface = &priv->interfaces[iface]; + + if (dev_handle->claimed_interfaces & (1 << iface)) { + for (i = 0 ; i < cInterface->num_endpoints ; i++) { + if (cInterface->endpoint_addrs[i] == ep) { + *pipep = i + 1; + *ifcp = iface; + usbi_dbg ("pipe %d on interface %d matches", *pipep, *ifcp); + return 0; + } + } + } + } + + /* No pipe found with the correct endpoint address */ + usbi_warn (HANDLE_CTX(dev_handle), "no pipeRef found with endpoint address 0x%02x.", ep); + + return -1; +} + +static int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 location) { + CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName); + + if (!matchingDict) + return kIOReturnError; + + if (location) { + CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (propertyMatchDict) { + /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this + internally (CFNumberType of locationID is 3) */ + CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location); + + CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF); + /* release our reference to the CFNumber (CFDictionarySetValue retains it) */ + CFRelease (locationCF); + + CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict); + /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */ + CFRelease (propertyMatchDict); + } + /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */ + } + + return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator); +} + +static int get_ioregistry_value_number (io_service_t service, CFStringRef property, CFNumberType type, void *p) { + CFTypeRef cfNumber = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0); + int ret = 0; + + if (cfNumber) { + if (CFGetTypeID(cfNumber) == CFNumberGetTypeID()) { + ret = CFNumberGetValue(cfNumber, type, p); + } + + CFRelease (cfNumber); + } + + return ret; +} + +static usb_device_t **darwin_device_from_service (io_service_t service) +{ + io_cf_plugin_ref_t *plugInInterface = NULL; + usb_device_t **device; + kern_return_t result; + SInt32 score; + + result = IOCreatePlugInInterfaceForService(service, kIOUSBDeviceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, + &score); + + if (kIOReturnSuccess != result || !plugInInterface) { + usbi_dbg ("could not set up plugin for service: %s\n", darwin_error_str (result)); + return NULL; + } + + (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID), + (LPVOID)&device); + /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ + (*plugInInterface)->Release (plugInInterface); + + return device; +} + +static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { + struct libusb_context *ctx; + io_service_t service; + + usbi_mutex_lock(&active_contexts_lock); + + while ((service = IOIteratorNext(add_devices))) { + /* add this device to each active context's device list */ + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + process_new_device (ctx, service);; + } + + IOObjectRelease(service); + } + + usbi_mutex_unlock(&active_contexts_lock); +} + +static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) { + struct libusb_device *dev = NULL; + struct libusb_context *ctx; + + io_service_t device; + UInt64 session; + int ret; + + while ((device = IOIteratorNext (rem_devices)) != 0) { + /* get the location from the i/o registry */ + ret = get_ioregistry_value_number (device, CFSTR("sessionID"), kCFNumberSInt64Type, &session); + IOObjectRelease (device); + if (!ret) + continue; + + usbi_mutex_lock(&active_contexts_lock); + + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + usbi_dbg ("notifying context %p of device disconnect", ctx); + + dev = usbi_get_device_by_session_id(ctx, session); + if (dev) { + /* signal the core that this device has been disconnected. the core will tear down this device + when the reference count reaches 0 */ + usbi_disconnect_device(dev); + } + } + + usbi_mutex_unlock(&active_contexts_lock); + } +} + +static void darwin_clear_iterator (io_iterator_t iter) { + io_service_t device; + + while ((device = IOIteratorNext (iter)) != 0) + IOObjectRelease (device); +} + +static void *darwin_event_thread_main (void *arg0) { + IOReturn kresult; + struct libusb_context *ctx = (struct libusb_context *)arg0; + CFRunLoopRef runloop; + + /* Set this thread's name, so it can be seen in the debugger + and crash reports. */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + pthread_setname_np ("org.libusb.device-hotplug"); + + /* Tell the Objective-C garbage collector about this thread. + This is required because, unlike NSThreads, pthreads are + not automatically registered. Although we don't use + Objective-C, we use CoreFoundation, which does. */ + objc_registerThreadWithCollector(); +#endif + + /* hotplug (device arrival/removal) sources */ + CFRunLoopSourceRef libusb_notification_cfsource; + io_notification_port_t libusb_notification_port; + io_iterator_t libusb_rem_device_iterator; + io_iterator_t libusb_add_device_iterator; + + usbi_dbg ("creating hotplug event source"); + + runloop = CFRunLoopGetCurrent (); + CFRetain (runloop); + + /* add the notification port to the run loop */ + libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault); + libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port); + CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); + + /* create notifications for removed devices */ + kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification, + IOServiceMatching(kIOUSBDeviceClassName), + (IOServiceMatchingCallback)darwin_devices_detached, + (void *)ctx, &libusb_rem_device_iterator); + + if (kresult != kIOReturnSuccess) { + usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); + + pthread_exit (NULL); + } + + /* create notifications for attached devices */ + kresult = IOServiceAddMatchingNotification(libusb_notification_port, kIOFirstMatchNotification, + IOServiceMatching(kIOUSBDeviceClassName), + (IOServiceMatchingCallback)darwin_devices_attached, + (void *)ctx, &libusb_add_device_iterator); + + if (kresult != kIOReturnSuccess) { + usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); + + pthread_exit (NULL); + } + + /* arm notifiers */ + darwin_clear_iterator (libusb_rem_device_iterator); + darwin_clear_iterator (libusb_add_device_iterator); + + usbi_dbg ("darwin event thread ready to receive events"); + + /* signal the main thread that the hotplug runloop has been created. */ + pthread_mutex_lock (&libusb_darwin_at_mutex); + libusb_darwin_acfl = runloop; + pthread_cond_signal (&libusb_darwin_at_cond); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + + /* run the runloop */ + CFRunLoopRun(); + + usbi_dbg ("darwin event thread exiting"); + + /* remove the notification cfsource */ + CFRunLoopRemoveSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); + + /* delete notification port */ + IONotificationPortDestroy (libusb_notification_port); + + /* delete iterators */ + IOObjectRelease (libusb_rem_device_iterator); + IOObjectRelease (libusb_add_device_iterator); + + CFRelease (runloop); + + libusb_darwin_acfl = NULL; + + pthread_exit (NULL); +} + +static void _darwin_finalize(void) { + struct darwin_cached_device *dev, *next; + + usbi_mutex_lock(&darwin_cached_devices_lock); + list_for_each_entry_safe(dev, next, &darwin_cached_devices, list, struct darwin_cached_device) { + darwin_deref_cached_device(dev); + } + usbi_mutex_unlock(&darwin_cached_devices_lock); +} + +static int darwin_init(struct libusb_context *ctx) { + host_name_port_t host_self; + static int initted = 0; + int rc; + + rc = darwin_scan_devices (ctx); + if (LIBUSB_SUCCESS != rc) { + return rc; + } + + if (OSAtomicIncrement32Barrier(&initCount) == 1) { + /* create the clocks that will be used */ + + if (!initted) { + initted = 1; + atexit(_darwin_finalize); + } + + host_self = mach_host_self(); + host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime); + host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic); + mach_port_deallocate(mach_task_self(), host_self); + + pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, (void *)ctx); + + pthread_mutex_lock (&libusb_darwin_at_mutex); + while (!libusb_darwin_acfl) + pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + } + + return rc; +} + +static void darwin_exit (void) { + if (OSAtomicDecrement32Barrier(&initCount) == 0) { + mach_port_deallocate(mach_task_self(), clock_realtime); + mach_port_deallocate(mach_task_self(), clock_monotonic); + + /* stop the event runloop and wait for the thread to terminate. */ + CFRunLoopStop (libusb_darwin_acfl); + pthread_join (libusb_darwin_at, NULL); + } +} + +static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + + /* return cached copy */ + memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return 0; +} + +static int get_configuration_index (struct libusb_device *dev, int config_value) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + UInt8 i, numConfig; + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + + /* is there a simpler way to determine the index? */ + kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + for (i = 0 ; i < numConfig ; i++) { + (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc); + + if (desc->bConfigurationValue == config_value) + return i; + } + + /* configuration not found */ + return LIBUSB_ERROR_NOT_FOUND; +} + +static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + int config_index; + + if (0 == priv->active_config) + return LIBUSB_ERROR_NOT_FOUND; + + config_index = get_configuration_index (dev, priv->active_config); + if (config_index < 0) + return config_index; + + return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian); +} + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + int ret; + + if (!priv || !priv->device) + return LIBUSB_ERROR_OTHER; + + kresult = (*priv->device)->GetConfigurationDescriptorPtr (priv->device, config_index, &desc); + if (kresult == kIOReturnSuccess) { + /* copy descriptor */ + if (libusb_le16_to_cpu(desc->wTotalLength) < len) + len = libusb_le16_to_cpu(desc->wTotalLength); + + memmove (buffer, desc, len); + + /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */ + *host_endian = 0; + } + + ret = darwin_to_libusb (kresult); + if (ret != LIBUSB_SUCCESS) + return ret; + + return len; +} + +/* check whether the os has configured the device */ +static int darwin_check_configuration (struct libusb_context *ctx, struct darwin_cached_device *dev) { + usb_device_t **darwin_device = dev->device; + + IOUSBConfigurationDescriptorPtr configDesc; + IOUSBFindInterfaceRequest request; + kern_return_t kresult; + io_iterator_t interface_iterator; + io_service_t firstInterface; + + if (dev->dev_descriptor.bNumConfigurations < 1) { + usbi_err (ctx, "device has no configurations"); + return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */ + } + + /* find the first configuration */ + kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc); + dev->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1; + + /* check if the device is already configured. there is probably a better way than iterating over the + to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices + might lock up on the device request) */ + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return darwin_to_libusb (kresult); + + /* iterate once */ + firstInterface = IOIteratorNext(interface_iterator); + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + if (firstInterface) { + IOObjectRelease (firstInterface); + + /* device is configured */ + if (dev->dev_descriptor.bNumConfigurations == 1) + /* to avoid problems with some devices get the configurations value from the configuration descriptor */ + dev->active_config = dev->first_config; + else + /* devices with more than one configuration should work with GetConfiguration */ + (*darwin_device)->GetConfiguration (darwin_device, &dev->active_config); + } else + /* not configured */ + dev->active_config = 0; + + usbi_dbg ("active config: %u, first config: %u", dev->active_config, dev->first_config); + + return 0; +} + +static int darwin_request_descriptor (usb_device_t **device, UInt8 desc, UInt8 desc_index, void *buffer, size_t buffer_size) { + IOUSBDevRequestTO req; + + memset (buffer, 0, buffer_size); + + /* Set up request for descriptor/ */ + req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); + req.bRequest = kUSBRqGetDescriptor; + req.wValue = desc << 8; + req.wIndex = desc_index; + req.wLength = buffer_size; + req.pData = buffer; + req.noDataTimeout = 20; + req.completionTimeout = 100; + + return (*device)->DeviceRequestTO (device, &req); +} + +static int darwin_cache_device_descriptor (struct libusb_context *ctx, struct darwin_cached_device *dev) { + usb_device_t **device = dev->device; + int retries = 1, delay = 30000; + int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1; + int is_open = 0; + int ret = 0, ret2; + UInt8 bDeviceClass; + UInt16 idProduct, idVendor; + + dev->can_enumerate = 0; + + (*device)->GetDeviceClass (device, &bDeviceClass); + (*device)->GetDeviceProduct (device, &idProduct); + (*device)->GetDeviceVendor (device, &idVendor); + + /* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some + * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still, + * to follow the spec as closely as possible, try opening the device */ + is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess); + + do { + /**** retrieve device descriptor ****/ + ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor)); + + if (kIOReturnOverrun == ret && kUSBDeviceDesc == dev->dev_descriptor.bDescriptorType) + /* received an overrun error but we still received a device descriptor */ + ret = kIOReturnSuccess; + + if (kIOUSBVendorIDAppleComputer == idVendor) { + /* NTH: don't bother retrying or unsuspending Apple devices */ + break; + } + + if (kIOReturnSuccess == ret && (0 == dev->dev_descriptor.bNumConfigurations || + 0 == dev->dev_descriptor.bcdUSB)) { + /* work around for incorrectly configured devices */ + if (try_reconfigure && is_open) { + usbi_dbg("descriptor appears to be invalid. resetting configuration before trying again..."); + + /* set the first configuration */ + (*device)->SetConfiguration(device, 1); + + /* don't try to reconfigure again */ + try_reconfigure = 0; + } + + ret = kIOUSBPipeStalled; + } + + if (kIOReturnSuccess != ret && is_open && try_unsuspend) { + /* device may be suspended. unsuspend it and try again */ +#if DeviceVersion >= 320 + UInt32 info = 0; + + /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */ + (void)(*device)->GetUSBDeviceInformation (device, &info); + + /* note that the device was suspended */ + if (info & (1 << kUSBInformationDeviceIsSuspendedBit) || 0 == info) + try_unsuspend = 1; +#endif + + if (try_unsuspend) { + /* try to unsuspend the device */ + ret2 = (*device)->USBDeviceSuspend (device, 0); + if (kIOReturnSuccess != ret2) { + /* prevent log spew from poorly behaving devices. this indicates the + os actually had trouble communicating with the device */ + usbi_dbg("could not retrieve device descriptor. failed to unsuspend: %s",darwin_error_str(ret2)); + } else + unsuspended = 1; + + try_unsuspend = 0; + } + } + + if (kIOReturnSuccess != ret) { + usbi_dbg("kernel responded with code: 0x%08x. sleeping for %d ms before trying again", ret, delay/1000); + /* sleep for a little while before trying again */ + usleep (delay); + } + } while (kIOReturnSuccess != ret && retries--); + + if (unsuspended) + /* resuspend the device */ + (void)(*device)->USBDeviceSuspend (device, 1); + + if (is_open) + (void) (*device)->USBDeviceClose (device); + + if (ret != kIOReturnSuccess) { + /* a debug message was already printed out for this error */ + if (LIBUSB_CLASS_HUB == bDeviceClass) + usbi_dbg ("could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", + idVendor, idProduct, darwin_error_str (ret), ret); + else + usbi_warn (ctx, "could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", + idVendor, idProduct, darwin_error_str (ret), ret); + return -1; + } + + /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */ + if (libusb_le16_to_cpu (dev->dev_descriptor.idProduct) != idProduct) { + /* not a valid device */ + usbi_warn (ctx, "idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device", + idProduct, libusb_le16_to_cpu (dev->dev_descriptor.idProduct)); + return -1; + } + + usbi_dbg ("cached device descriptor:"); + usbi_dbg (" bDescriptorType: 0x%02x", dev->dev_descriptor.bDescriptorType); + usbi_dbg (" bcdUSB: 0x%04x", dev->dev_descriptor.bcdUSB); + usbi_dbg (" bDeviceClass: 0x%02x", dev->dev_descriptor.bDeviceClass); + usbi_dbg (" bDeviceSubClass: 0x%02x", dev->dev_descriptor.bDeviceSubClass); + usbi_dbg (" bDeviceProtocol: 0x%02x", dev->dev_descriptor.bDeviceProtocol); + usbi_dbg (" bMaxPacketSize0: 0x%02x", dev->dev_descriptor.bMaxPacketSize0); + usbi_dbg (" idVendor: 0x%04x", dev->dev_descriptor.idVendor); + usbi_dbg (" idProduct: 0x%04x", dev->dev_descriptor.idProduct); + usbi_dbg (" bcdDevice: 0x%04x", dev->dev_descriptor.bcdDevice); + usbi_dbg (" iManufacturer: 0x%02x", dev->dev_descriptor.iManufacturer); + usbi_dbg (" iProduct: 0x%02x", dev->dev_descriptor.iProduct); + usbi_dbg (" iSerialNumber: 0x%02x", dev->dev_descriptor.iSerialNumber); + usbi_dbg (" bNumConfigurations: 0x%02x", dev->dev_descriptor.bNumConfigurations); + + dev->can_enumerate = 1; + + return 0; +} + +static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service, + struct darwin_cached_device **cached_out) { + struct darwin_cached_device *new_device; + UInt64 sessionID, parent_sessionID; + int ret = LIBUSB_SUCCESS; + usb_device_t **device; + io_service_t parent; + kern_return_t result; + UInt8 port = 0; + + *cached_out = NULL; + + /* get some info from the io registry */ + (void) get_ioregistry_value_number (service, CFSTR("sessionID"), kCFNumberSInt64Type, &sessionID); + (void) get_ioregistry_value_number (service, CFSTR("PortNum"), kCFNumberSInt8Type, &port); + + usbi_dbg("finding cached device for sessionID 0x\n" PRIx64, sessionID); + + result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent); + + if (kIOReturnSuccess == result) { + (void) get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, &parent_sessionID); + IOObjectRelease(parent); + } + + usbi_mutex_lock(&darwin_cached_devices_lock); + do { + list_for_each_entry(new_device, &darwin_cached_devices, list, struct darwin_cached_device) { + usbi_dbg("matching sessionID 0x%x against cached device with sessionID 0x%x", sessionID, new_device->session); + if (new_device->session == sessionID) { + usbi_dbg("using cached device for device"); + *cached_out = new_device; + break; + } + } + + if (*cached_out) + break; + + usbi_dbg("caching new device with sessionID 0x%x\n", sessionID); + + new_device = calloc (1, sizeof (*new_device)); + if (!new_device) { + ret = LIBUSB_ERROR_NO_MEM; + break; + } + + device = darwin_device_from_service (service); + if (!device) { + ret = LIBUSB_ERROR_NO_DEVICE; + free (new_device); + new_device = NULL; + break; + } + + /* add this device to the cached device list */ + list_add(&new_device->list, &darwin_cached_devices); + + (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&new_device->address); + + /* keep a reference to this device */ + darwin_ref_cached_device(new_device); + + new_device->device = device; + new_device->session = sessionID; + (*device)->GetLocationID (device, &new_device->location); + new_device->port = port; + new_device->parent_session = parent_sessionID; + + /* cache the device descriptor */ + ret = darwin_cache_device_descriptor(ctx, new_device); + if (ret) + break; + + if (new_device->can_enumerate) { + snprintf(new_device->sys_path, 20, "%03i-%04x-%04x-%02x-%02x", new_device->address, + new_device->dev_descriptor.idVendor, new_device->dev_descriptor.idProduct, + new_device->dev_descriptor.bDeviceClass, new_device->dev_descriptor.bDeviceSubClass); + } + } while (0); + + usbi_mutex_unlock(&darwin_cached_devices_lock); + + /* keep track of devices regardless of if we successfully enumerate them to + prevent them from being enumerated multiple times */ + + *cached_out = new_device; + + return ret; +} + +static int process_new_device (struct libusb_context *ctx, io_service_t service) { + struct darwin_device_priv *priv; + struct libusb_device *dev = NULL; + struct darwin_cached_device *cached_device; + UInt8 devSpeed; + int ret = 0; + + do { + ret = darwin_get_cached_device (ctx, service, &cached_device); + + if (ret < 0 || (cached_device && !cached_device->can_enumerate)) { + return ret; + } + + /* check current active configuration (and cache the first configuration value-- + which may be used by claim_interface) */ + ret = darwin_check_configuration (ctx, cached_device); + if (ret) + break; + + usbi_dbg ("allocating new device in context %p for with session 0x%08x", + ctx, cached_device->session); + + dev = usbi_alloc_device(ctx, cached_device->session); + if (!dev) { + return LIBUSB_ERROR_NO_MEM; + } + + priv = (struct darwin_device_priv *)dev->os_priv; + + priv->dev = cached_device; + darwin_ref_cached_device (priv->dev); + + if (cached_device->parent_session > 0) { + dev->parent_dev = usbi_get_device_by_session_id (ctx, cached_device->parent_session); + } else { + dev->parent_dev = NULL; + } + dev->port_number = cached_device->port; + dev->bus_number = cached_device->location >> 24; + dev->device_address = cached_device->address; + + /* need to add a reference to the parent device */ + if (dev->parent_dev) { + libusb_ref_device(dev->parent_dev); + } + + (*(priv->dev->device))->GetDeviceSpeed (priv->dev->device, &devSpeed); + + switch (devSpeed) { + case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break; + case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break; + case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break; +#if DeviceVersion >= 500 + case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break; +#endif + default: + usbi_warn (ctx, "Got unknown device speed %d", devSpeed); + } + + ret = usbi_sanitize_device (dev); + if (ret < 0) + break; + + usbi_dbg ("found device with address %d port = %d parent = %p at %p", dev->device_address, + dev->port_number, (void *) dev->parent_dev, priv->dev->sys_path); + } while (0); + + if (0 == ret) { + usbi_connect_device (dev); + } else { + libusb_unref_device (dev); + } + + return ret; +} + +static int darwin_scan_devices(struct libusb_context *ctx) { + io_iterator_t deviceIterator; + io_service_t service; + kern_return_t kresult; + + kresult = usb_setup_device_iterator (&deviceIterator, 0); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + while ((service = IOIteratorNext (deviceIterator))) { + (void) process_new_device (ctx, service); + + IOObjectRelease(service); + } + + IOObjectRelease(deviceIterator); + + return 0; +} + +static int darwin_open (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + + if (0 == dpriv->open_count) { + /* try to open the device */ + kresult = (*(dpriv->device))->USBDeviceOpenSeize (dpriv->device); + if (kresult != kIOReturnSuccess) { + usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceOpen: %s", darwin_error_str(kresult)); + + if (kIOReturnExclusiveAccess != kresult) { + return darwin_to_libusb (kresult); + } + + /* it is possible to perform some actions on a device that is not open so do not return an error */ + priv->is_open = 0; + } else { + priv->is_open = 1; + } + + /* create async event source */ + kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "CreateDeviceAsyncEventSource: %s", darwin_error_str(kresult)); + + if (priv->is_open) { + (*(dpriv->device))->USBDeviceClose (dpriv->device); + } + + priv->is_open = 0; + + return darwin_to_libusb (kresult); + } + + CFRetain (libusb_darwin_acfl); + + /* add the cfSource to the aync run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes); + } + + /* device opened successfully */ + dpriv->open_count++; + + /* create a file descriptor for notifications */ + pipe (priv->fds); + + /* set the pipe to be non-blocking */ + fcntl (priv->fds[1], F_SETFD, O_NONBLOCK); + + usbi_add_pollfd(HANDLE_CTX(dev_handle), priv->fds[0], POLLIN); + + usbi_dbg ("device open for access"); + + return 0; +} + +static void darwin_close (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + int i; + + if (dpriv->open_count == 0) { + /* something is probably very wrong if this is the case */ + usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!\n"); + return; + } + + dpriv->open_count--; + + /* make sure all interfaces are released */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + libusb_release_interface (dev_handle, i); + + if (0 == dpriv->open_count) { + /* delete the device's async event source */ + if (priv->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode); + CFRelease (priv->cfSource); + priv->cfSource = NULL; + CFRelease (libusb_darwin_acfl); + } + + if (priv->is_open) { + /* close the device */ + kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device); + if (kresult) { + /* Log the fact that we had a problem closing the file, however failing a + * close isn't really an error, so return success anyway */ + usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceClose: %s", darwin_error_str(kresult)); + } + } + } + + /* file descriptors are maintained per-instance */ + usbi_remove_pollfd (HANDLE_CTX (dev_handle), priv->fds[0]); + close (priv->fds[1]); + close (priv->fds[0]); + + priv->fds[0] = priv->fds[1] = -1; +} + +static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + + *config = (int) dpriv->active_config; + + return 0; +} + +static int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + int i; + + /* Setting configuration will invalidate the interface, so we need + to reclaim it. First, dispose of existing interfaces, if any. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_release_interface (dev_handle, i); + + kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* Reclaim any interfaces. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_claim_interface (dev_handle, i); + + dpriv->active_config = config; + + return 0; +} + +static int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) { + IOUSBFindInterfaceRequest request; + kern_return_t kresult; + io_iterator_t interface_iterator; + UInt8 bInterfaceNumber; + int ret; + + *usbInterfacep = IO_OBJECT_NULL; + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return kresult; + + while ((*usbInterfacep = IOIteratorNext(interface_iterator))) { + /* find the interface number */ + ret = get_ioregistry_value_number (*usbInterfacep, CFSTR("bInterfaceNumber"), kCFNumberSInt8Type, + &bInterfaceNumber); + + if (ret && bInterfaceNumber == ifc) { + break; + } + + (void) IOObjectRelease (*usbInterfacep); + } + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + return 0; +} + +static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kern_return_t kresult; + + u_int8_t numep, direction, number; + u_int8_t dont_care1, dont_care3; + u_int16_t dont_care2; + int i; + + usbi_dbg ("building table of endpoints."); + + /* retrieve the total number of endpoints on this interface */ + kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "can't get number of endpoints for interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* iterate through pipe references */ + for (i = 1 ; i <= numep ; i++) { + kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1, + &dont_care2, &dont_care3); + + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "error getting pipe information for pipe %d: %s", i, darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); + } + + usbi_dbg ("interface: %i pipe %i: dir: %i number: %i", iface, i, direction, number); + + cInterface->endpoint_addrs[i - 1] = ((direction << 7 & LIBUSB_ENDPOINT_DIR_MASK) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK)); + } + + cInterface->num_endpoints = numep; + + return 0; +} + +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + io_service_t usbInterface = IO_OBJECT_NULL; + IOReturn kresult; + IOCFPlugInInterface **plugInInterface = NULL; + SInt32 score; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* make sure we have an interface */ + if (!usbInterface && dpriv->first_config != 0) { + usbi_info (HANDLE_CTX (dev_handle), "no interface found; setting configuration: %d", dpriv->first_config); + + /* set the configuration */ + kresult = darwin_set_configuration (dev_handle, dpriv->first_config); + if (kresult != LIBUSB_SUCCESS) { + usbi_err (HANDLE_CTX (dev_handle), "could not set configuration"); + return kresult; + } + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + } + + if (!usbInterface) { + usbi_err (HANDLE_CTX (dev_handle), "interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* get an interface to the device's interface */ + kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, &score); + + /* ignore release error */ + (void)IOObjectRelease (usbInterface); + + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "IOCreatePlugInInterfaceForService: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + if (!plugInInterface) { + usbi_err (HANDLE_CTX (dev_handle), "plugin interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* Do the actual claim */ + kresult = (*plugInInterface)->QueryInterface(plugInInterface, + CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), + (LPVOID)&cInterface->interface); + /* We no longer need the intermediate plug-in */ + /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ + (*plugInInterface)->Release (plugInInterface); + if (kresult || !cInterface->interface) { + usbi_err (HANDLE_CTX (dev_handle), "QueryInterface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* claim the interface */ + kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceOpen: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + cInterface->cfSource = NULL; + + /* create async event source */ + kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "could not create async event source"); + + /* can't continue without an async event source */ + (void)darwin_release_interface (dev_handle, iface); + + return darwin_to_libusb (kresult); + } + + /* add the cfSource to the async thread's run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + + usbi_dbg ("interface opened"); + + return 0; +} + +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + /* Check to see if an interface is open */ + if (!cInterface->interface) + return LIBUSB_SUCCESS; + + /* clean up endpoint data */ + cInterface->num_endpoints = 0; + + /* delete the interface's async event source */ + if (cInterface->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + CFRelease (cInterface->cfSource); + } + + kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface); + if (kresult) + usbi_warn (HANDLE_CTX (dev_handle), "USBInterfaceClose: %s", darwin_error_str(kresult)); + + kresult = (*(cInterface->interface))->Release(cInterface->interface); + if (kresult != kIOReturnSuccess) + usbi_warn (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult)); + + cInterface->interface = IO_OBJECT_NULL; + + return darwin_to_libusb (kresult); +} + +static int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + if (!cInterface->interface) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting); + if (kresult != kIOReturnSuccess) + darwin_reset_device (dev_handle); + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + return darwin_to_libusb (kresult); +} + +static int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + IOReturn kresult; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, &iface) != 0) { + usbi_err (HANDLE_CTX (dev_handle), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); + if (kresult) + usbi_warn (HANDLE_CTX (dev_handle), "ClearPipeStall: %s", darwin_error_str (kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_reset_device(struct libusb_device_handle *dev_handle) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOUSBDeviceDescriptor descriptor; + IOUSBConfigurationDescriptorPtr cached_configuration; + IOUSBConfigurationDescriptor configuration; + bool reenumerate = false; + IOReturn kresult; + int i; + + kresult = (*(dpriv->device))->ResetDevice (dpriv->device); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "ResetDevice: %s", darwin_error_str (kresult)); + return darwin_to_libusb (kresult); + } + + do { + usbi_dbg ("darwin/reset_device: checking if device descriptor changed"); + + /* ignore return code. if we can't get a descriptor it might be worthwhile re-enumerating anway */ + (void) darwin_request_descriptor (dpriv->device, kUSBDeviceDesc, 0, &descriptor, sizeof (descriptor)); + + /* check if the device descriptor has changed */ + if (0 != memcmp (&dpriv->dev_descriptor, &descriptor, sizeof (descriptor))) { + reenumerate = true; + break; + } + + /* check if any configuration descriptor has changed */ + for (i = 0 ; i < descriptor.bNumConfigurations ; ++i) { + usbi_dbg ("darwin/reset_device: checking if configuration descriptor %d changed", i); + + (void) darwin_request_descriptor (dpriv->device, kUSBConfDesc, i, &configuration, sizeof (configuration)); + (*(dpriv->device))->GetConfigurationDescriptorPtr (dpriv->device, i, &cached_configuration); + + if (!cached_configuration || 0 != memcmp (cached_configuration, &configuration, sizeof (configuration))) { + reenumerate = true; + break; + } + } + } while (0); + + if (reenumerate) { + usbi_dbg ("darwin/reset_device: device requires reenumeration"); + (void) (*(dpriv->device))->USBDeviceReEnumerate (dpriv->device, 0); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg ("darwin/reset_device: device reset complete"); + + return LIBUSB_SUCCESS; +} + +static int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + io_service_t usbInterface; + CFTypeRef driver; + IOReturn kresult; + + kresult = darwin_get_interface (dpriv->device, interface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); + } + + driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0); + IOObjectRelease (usbInterface); + + if (driver) { + CFRelease (driver); + + return 1; + } + + /* no driver */ + return 0; +} + +/* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */ +static int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + (void)dev_handle; + (void)interface; + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + (void)dev_handle; + (void)interface; + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void darwin_destroy_device(struct libusb_device *dev) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *) dev->os_priv; + + if (dpriv->dev) { + /* need to hold the lock in case this is the last reference to the device */ + usbi_mutex_lock(&darwin_cached_devices_lock); + darwin_deref_cached_device (dpriv->dev); + dpriv->dev = NULL; + usbi_mutex_unlock(&darwin_cached_devices_lock); + } +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + + IOReturn ret; + uint8_t transferType; + /* None of the values below are used in libusbx for bulk transfers */ + uint8_t direction, number, interval, pipeRef, iface; + uint16_t maxPacketSize; + + struct darwin_interface *cInterface; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + if (0 != (transfer->length % maxPacketSize)) { + /* do not need a zero packet */ + transfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET; + } + + /* submit the request */ + /* timeouts are unavailable on interrupt endpoints */ + if (transferType == kUSBInterrupt) { + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + } else { + itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + } + + if (ret) + usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(ret), ret); + + return darwin_to_libusb (ret); +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + + IOReturn kresult; + uint8_t direction, number, interval, pipeRef, iface, transferType; + uint16_t maxPacketSize; + UInt64 frame; + AbsoluteTime atTime; + int i; + + struct darwin_interface *cInterface; + + /* construct an array of IOUSBIsocFrames, reuse the old one if possible */ + if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) { + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + if (!tpriv->isoc_framelist) { + tpriv->num_iso_packets = transfer->num_iso_packets; + tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); + if (!tpriv->isoc_framelist) + return LIBUSB_ERROR_NO_MEM; + } + + /* copy the frame list from the libusbx descriptor (the structures differ only is member order) */ + for (i = 0 ; i < transfer->num_iso_packets ; i++) + tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + /* determine the properties of this endpoint and the speed of the device */ + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* Last but not least we need the bus frame number */ + kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime); + if (kresult) { + usbi_err (TRANSFER_CTX (transfer), "failed to get bus frame number: %d", kresult); + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + + return darwin_to_libusb (kresult); + } + + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* schedule for a frame a little in the future */ + frame += 4; + + if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint]) + frame = cInterface->frames[transfer->endpoint]; + + /* submit the request */ + if (IS_XFERIN(transfer)) + kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + else + kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + + if (LIBUSB_SPEED_FULL == transfer->dev_handle->dev->speed) + /* Full speed */ + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)); + else + /* High/super speed */ + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)) / 8; + + if (kresult != kIOReturnSuccess) { + usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(kresult)); + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + return darwin_to_libusb (kresult); +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + IOReturn kresult; + + bzero(&tpriv->req, sizeof(tpriv->req)); + + /* IOUSBDeviceInterface expects the request in cpu endianess */ + tpriv->req.bmRequestType = setup->bmRequestType; + tpriv->req.bRequest = setup->bRequest; + /* these values should be in bus order from libusb_fill_control_setup */ + tpriv->req.wValue = OSSwapLittleToHostInt16 (setup->wValue); + tpriv->req.wIndex = OSSwapLittleToHostInt16 (setup->wIndex); + tpriv->req.wLength = OSSwapLittleToHostInt16 (setup->wLength); + /* data is stored after the libusbx control block */ + tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + tpriv->req.completionTimeout = transfer->timeout; + tpriv->req.noDataTimeout = transfer->timeout; + + itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + /* all transfers in libusb-1.0 are async */ + + if (transfer->endpoint) { + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer); + } else + /* control request on endpoint 0 */ + kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer); + + if (kresult != kIOReturnSuccess) + usbi_err (TRANSFER_CTX (transfer), "control request failed: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_submit_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int cancel_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + IOReturn kresult; + + usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions control pipe"); + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device); + + return darwin_to_libusb (kresult); +} + +static int darwin_abort_transfers (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + IOReturn kresult; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions on interface %d pipe %d", iface, pipeRef); + + /* abort transactions */ + (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef); + + usbi_dbg ("calling clear pipe stall to clear the data toggle bit"); + + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); + + return darwin_to_libusb (kresult); +} + +static int darwin_cancel_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return cancel_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return darwin_abort_transfers (itransfer); + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) { + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } +} + +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) { + struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon; + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + struct darwin_msg_async_io_complete message = {.itransfer = itransfer, .result = result, + .size = (UInt32) (uintptr_t) arg0}; + + usbi_dbg ("an async io operation has completed"); + + /* if requested write a zero packet */ + if (kIOReturnSuccess == result && IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + struct darwin_interface *cInterface; + uint8_t iface, pipeRef; + + (void) ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface); + cInterface = &priv->interfaces[iface]; + + (*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0); + } + + /* send a completion message to the device's file descriptor */ + write (priv->fds[1], &message, sizeof (message)); +} + +static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) { + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) + result = kIOUSBTransactionTimeout; + + switch (result) { + case kIOReturnUnderrun: + case kIOReturnSuccess: + return LIBUSB_TRANSFER_COMPLETED; + case kIOReturnAborted: + return LIBUSB_TRANSFER_CANCELLED; + case kIOUSBPipeStalled: + usbi_dbg ("transfer error: pipe is stalled"); + return LIBUSB_TRANSFER_STALL; + case kIOReturnOverrun: + usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: data overrun"); + return LIBUSB_TRANSFER_OVERFLOW; + case kIOUSBTransactionTimeout: + usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: timed out"); + itransfer->flags |= USBI_TRANSFER_TIMED_OUT; + return LIBUSB_TRANSFER_TIMED_OUT; + default: + usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result); + return LIBUSB_TRANSFER_ERROR; + } +} + +static void darwin_handle_callback (struct usbi_transfer *itransfer, kern_return_t result, UInt32 io_size) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type; + int isBulk = LIBUSB_TRANSFER_TYPE_BULK == transfer->type; + int isControl = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type; + int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type; + int i; + + if (!isIsoc && !isBulk && !isControl && !isInterrupt) { + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return; + } + + usbi_dbg ("handling %s completion with kernel status %d", + isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", result); + + if (kIOReturnSuccess == result || kIOReturnUnderrun == result) { + if (isIsoc && tpriv->isoc_framelist) { + /* copy isochronous results back */ + + for (i = 0; i < transfer->num_iso_packets ; i++) { + struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i]; + lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus); + lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount; + } + } else if (!isIsoc) + itransfer->transferred += io_size; + } + + /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */ + usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, result)); +} + +static int op_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) { + struct darwin_msg_async_io_complete message; + POLL_NFDS_TYPE i = 0; + ssize_t ret; + + usbi_mutex_lock(&ctx->open_devs_lock); + + for (i = 0; i < nfds && num_ready > 0; i++) { + struct pollfd *pollfd = &fds[i]; + + usbi_dbg ("checking fd %i with revents = %x", pollfd->fd, pollfd->revents); + + if (!pollfd->revents) + continue; + + num_ready--; + + if (pollfd->revents & POLLERR) { + /* this probably will never happen so ignore the error an move on. */ + continue; + } + + /* there is only one type of message */ + ret = read (pollfd->fd, &message, sizeof (message)); + if (ret < (ssize_t) sizeof (message)) { + usbi_dbg ("WARNING: short read on async io completion pipe\n"); + continue; + } + + darwin_handle_callback (message.itransfer, message.result, message.size); + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + + return 0; +} + +static int darwin_clock_gettime(int clk_id, struct timespec *tp) { + mach_timespec_t sys_time; + clock_serv_t clock_ref; + + switch (clk_id) { + case USBI_CLOCK_REALTIME: + /* CLOCK_REALTIME represents time since the epoch */ + clock_ref = clock_realtime; + break; + case USBI_CLOCK_MONOTONIC: + /* use system boot time as reference for the monotonic clock */ + clock_ref = clock_monotonic; + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + clock_get_time (clock_ref, &sys_time); + + tp->tv_sec = sys_time.tv_sec; + tp->tv_nsec = sys_time.tv_nsec; + + return 0; +} + +const struct usbi_os_backend darwin_backend = { + .name = "Darwin", + .caps = 0, + .init = darwin_init, + .exit = darwin_exit, + .get_device_list = NULL, /* not needed */ + .get_device_descriptor = darwin_get_device_descriptor, + .get_active_config_descriptor = darwin_get_active_config_descriptor, + .get_config_descriptor = darwin_get_config_descriptor, + + .open = darwin_open, + .close = darwin_close, + .get_configuration = darwin_get_configuration, + .set_configuration = darwin_set_configuration, + .claim_interface = darwin_claim_interface, + .release_interface = darwin_release_interface, + + .set_interface_altsetting = darwin_set_interface_altsetting, + .clear_halt = darwin_clear_halt, + .reset_device = darwin_reset_device, + + .kernel_driver_active = darwin_kernel_driver_active, + .detach_kernel_driver = darwin_detach_kernel_driver, + .attach_kernel_driver = darwin_attach_kernel_driver, + + .destroy_device = darwin_destroy_device, + + .submit_transfer = darwin_submit_transfer, + .cancel_transfer = darwin_cancel_transfer, + .clear_transfer_priv = darwin_clear_transfer_priv, + + .handle_events = op_handle_events, + + .clock_gettime = darwin_clock_gettime, + + .device_priv_size = sizeof(struct darwin_device_priv), + .device_handle_priv_size = sizeof(struct darwin_device_handle_priv), + .transfer_priv_size = sizeof(struct darwin_transfer_priv), + .add_iso_packet_size = 0, +}; diff --git a/Externals/libusbx/libusb/os/darwin_usb.h b/Externals/libusbx/libusb/os/darwin_usb.h new file mode 100644 index 0000000000..53b8542b13 --- /dev/null +++ b/Externals/libusbx/libusb/os/darwin_usb.h @@ -0,0 +1,162 @@ +/* + * darwin backend for libusbx 1.0 + * Copyright © 2008-2013 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(LIBUSB_DARWIN_H) +#define LIBUSB_DARWIN_H + +#include "libusbi.h" + +#include +#include +#include +#include + +/* IOUSBInterfaceInferface */ +#if defined (kIOUSBInterfaceInterfaceID550) + +#define usb_interface_t IOUSBInterfaceInterface550 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550 +#define InterfaceVersion 550 + +#elif defined (kIOUSBInterfaceInterfaceID500) + +#define usb_interface_t IOUSBInterfaceInterface500 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500 +#define InterfaceVersion 500 + +#elif defined (kIOUSBInterfaceInterfaceID300) + +#define usb_interface_t IOUSBInterfaceInterface300 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 +#define InterfaceVersion 300 + +#elif defined (kIOUSBInterfaceInterfaceID245) + +#define usb_interface_t IOUSBInterfaceInterface245 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 +#define InterfaceVersion 245 + +#elif defined (kIOUSBInterfaceInterfaceID220) + +#define usb_interface_t IOUSBInterfaceInterface220 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 +#define InterfaceVersion 220 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +/* IOUSBDeviceInterface */ +#if defined (kIOUSBDeviceInterfaceID500) + +#define usb_device_t IOUSBDeviceInterface500 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID500 +#define DeviceVersion 500 + +#elif defined (kIOUSBDeviceInterfaceID320) + +#define usb_device_t IOUSBDeviceInterface320 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 +#define DeviceVersion 320 + +#elif defined (kIOUSBDeviceInterfaceID300) + +#define usb_device_t IOUSBDeviceInterface300 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 +#define DeviceVersion 300 + +#elif defined (kIOUSBDeviceInterfaceID245) + +#define usb_device_t IOUSBDeviceInterface245 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 +#define DeviceVersion 245 + +#elif defined (kIOUSBDeviceInterfaceID220) +#define usb_device_t IOUSBDeviceInterface197 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 +#define DeviceVersion 197 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +#if !defined(IO_OBJECT_NULL) +#define IO_OBJECT_NULL ((io_object_t) 0) +#endif + +typedef IOCFPlugInInterface *io_cf_plugin_ref_t; +typedef IONotificationPortRef io_notification_port_t; + +/* private structures */ +struct darwin_cached_device { + struct list_head list; + IOUSBDeviceDescriptor dev_descriptor; + UInt32 location; + UInt64 parent_session; + UInt64 session; + UInt16 address; + char sys_path[21]; + usb_device_t **device; + int open_count; + UInt8 first_config, active_config, port; + int can_enumerate; + int refcount; +}; + +struct darwin_device_priv { + struct darwin_cached_device *dev; +}; + +struct darwin_device_handle_priv { + int is_open; + CFRunLoopSourceRef cfSource; + int fds[2]; + + struct darwin_interface { + usb_interface_t **interface; + uint8_t num_endpoints; + CFRunLoopSourceRef cfSource; + uint64_t frames[256]; + uint8_t endpoint_addrs[USB_MAXENDPOINTS]; + } interfaces[USB_MAXINTERFACES]; +}; + +struct darwin_transfer_priv { + /* Isoc */ + IOUSBIsocFrame *isoc_framelist; + int num_iso_packets; + + /* Control */ + IOUSBDevRequestTO req; + + /* Bulk */ +}; + +/* structure for signaling io completion */ +struct darwin_msg_async_io_complete { + struct usbi_transfer *itransfer; + IOReturn result; + UInt32 size; +}; + +#endif diff --git a/Externals/libusbx/libusb/os/linux_netlink.c b/Externals/libusbx/libusb/os/linux_netlink.c new file mode 100644 index 0000000000..3a68f69d9c --- /dev/null +++ b/Externals/libusbx/libusb/os/linux_netlink.c @@ -0,0 +1,254 @@ +/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ +/* + * Linux usbfs backend for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * Copyright (c) 2013 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusb.h" +#include "libusbi.h" +#include "linux_usbfs.h" + +#include +#include + +#define KERNEL 1 + +static int linux_netlink_socket = -1; +static pthread_t libusb_linux_event_thread; + +static void *linux_netlink_event_thread_main(void *arg); + +struct sockaddr_nl snl = { .nl_family=AF_NETLINK, .nl_groups=KERNEL }; + +int linux_netlink_start_event_monitor(void) +{ + int ret; + + snl.nl_groups = KERNEL; + + linux_netlink_socket = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT); + if (-1 == linux_netlink_socket) { + return LIBUSB_ERROR_OTHER; + } + + ret = bind(linux_netlink_socket, (struct sockaddr *) &snl, sizeof(snl)); + if (0 != ret) { + return LIBUSB_ERROR_OTHER; + } + + /* TODO -- add authentication */ + /* setsockopt(linux_netlink_socket, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)); */ + + ret = pthread_create(&libusb_linux_event_thread, NULL, linux_netlink_event_thread_main, NULL); + if (0 != ret) { + return LIBUSB_ERROR_OTHER; + } + + return LIBUSB_SUCCESS; +} + +int linux_netlink_stop_event_monitor(void) +{ + int r; + + if (-1 == linux_netlink_socket) { + /* already closed. nothing to do */ + return LIBUSB_SUCCESS; + } + + r = close(linux_netlink_socket); + if (0 > r) { + usbi_err(NULL, "error closing netlink socket. %s", strerror(errno)); + return LIBUSB_ERROR_OTHER; + } + + pthread_cancel(libusb_linux_event_thread); + + linux_netlink_socket = -1; + + return LIBUSB_SUCCESS; +} + +static const char *netlink_message_parse (const char *buffer, size_t len, const char *key) +{ + size_t keylen = strlen(key); + size_t offset; + + for (offset = 0 ; offset < len && '\0' != buffer[offset] ; offset += strlen(buffer + offset) + 1) { + if (0 == strncmp(buffer + offset, key, keylen) && + '=' == buffer[offset + keylen]) { + return buffer + offset + keylen + 1; + } + } + + return NULL; +} + +/* parse parts of netlink message common to both libudev and the kernel */ +static int linux_netlink_parse(char *buffer, size_t len, int *detached, const char **sys_name, + uint8_t *busnum, uint8_t *devaddr) { + const char *tmp; + int i; + + errno = 0; + + *sys_name = NULL; + *detached = 0; + *busnum = 0; + *devaddr = 0; + + tmp = netlink_message_parse((const char *) buffer, len, "ACTION"); + if (tmp == NULL) + return -1; + if (0 == strcmp(tmp, "remove")) { + *detached = 1; + } else if (0 != strcmp(tmp, "add")) { + usbi_dbg("unknown device action %s", tmp); + return -1; + } + + /* check that this is a usb message */ + tmp = netlink_message_parse(buffer, len, "SUBSYSTEM"); + if (NULL == tmp || 0 != strcmp(tmp, "usb")) { + /* not usb. ignore */ + return -1; + } + + tmp = netlink_message_parse(buffer, len, "BUSNUM"); + if (NULL == tmp) { + /* no bus number (likely a usb interface). ignore*/ + return -1; + } + + *busnum = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + + tmp = netlink_message_parse(buffer, len, "DEVNUM"); + if (NULL == tmp) { + return -1; + } + + *devaddr = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + + tmp = netlink_message_parse(buffer, len, "DEVPATH"); + if (NULL == tmp) { + return -1; + } + + for (i = strlen(tmp) - 1 ; i ; --i) { + if ('/' ==tmp[i]) { + *sys_name = tmp + i + 1; + break; + } + } + + /* found a usb device */ + return 0; +} + +static int linux_netlink_read_message(void) +{ + unsigned char buffer[1024]; + struct iovec iov = {.iov_base = buffer, .iov_len = sizeof(buffer)}; + struct msghdr meh = { .msg_iov=&iov, .msg_iovlen=1, + .msg_name=&snl, .msg_namelen=sizeof(snl) }; + const char *sys_name = NULL; + uint8_t busnum, devaddr; + int detached, r; + size_t len; + + /* read netlink message */ + memset(buffer, 0, sizeof(buffer)); + len = recvmsg(linux_netlink_socket, &meh, 0); + if (len < 32) { + if (errno != EAGAIN) + usbi_dbg("error recieving message from netlink"); + return -1; + } + + /* TODO -- authenticate this message is from the kernel or udevd */ + + r = linux_netlink_parse(buffer, len, &detached, &sys_name, + &busnum, &devaddr); + if (r) + return r; + + usbi_dbg("netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s", + busnum, devaddr, sys_name, detached ? "yes" : "no"); + + /* signal device is available (or not) to all contexts */ + if (detached) + linux_hotplug_disconnected(busnum, devaddr, sys_name); + else + linux_hotplug_enumerate(busnum, devaddr, sys_name); + + return 0; +} + +static void *linux_netlink_event_thread_main(void *arg) +{ + struct pollfd fds = {.fd = linux_netlink_socket, + .events = POLLIN}; + + /* silence compiler warning */ + (void) arg; + + while (1 == poll(&fds, 1, -1)) { + if (POLLIN != fds.revents) { + break; + } + + usbi_mutex_static_lock(&linux_hotplug_lock); + linux_netlink_read_message(); + usbi_mutex_static_unlock(&linux_hotplug_lock); + } + + return NULL; +} + +void linux_netlink_hotplug_poll(void) +{ + int r; + + usbi_mutex_static_lock(&linux_hotplug_lock); + do { + r = linux_netlink_read_message(); + } while (r == 0); + usbi_mutex_static_unlock(&linux_hotplug_lock); +} diff --git a/Externals/libusbx/libusb/os/linux_udev.c b/Externals/libusbx/libusb/os/linux_udev.c new file mode 100644 index 0000000000..5a2aadfd44 --- /dev/null +++ b/Externals/libusbx/libusb/os/linux_udev.c @@ -0,0 +1,273 @@ +/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ +/* + * Linux usbfs backend for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * Copyright (c) 2012-2013 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusb.h" +#include "libusbi.h" +#include "linux_usbfs.h" + +/* udev context */ +static struct udev *udev_ctx = NULL; +static int udev_monitor_fd = -1; +static struct udev_monitor *udev_monitor = NULL; +static pthread_t linux_event_thread; + +static void udev_hotplug_event(struct udev_device* udev_dev); +static void *linux_udev_event_thread_main(void *arg); + +int linux_udev_start_event_monitor(void) +{ + int r; + + assert(udev_ctx == NULL); + udev_ctx = udev_new(); + if (!udev_ctx) { + usbi_err(NULL, "could not create udev context"); + return LIBUSB_ERROR_OTHER; + } + + udev_monitor = udev_monitor_new_from_netlink(udev_ctx, "udev"); + if (!udev_monitor) { + usbi_err(NULL, "could not initialize udev monitor"); + goto err_free_ctx; + } + + r = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", 0); + if (r) { + usbi_err(NULL, "could not initialize udev monitor filter for \"usb\" subsystem"); + goto err_free_monitor; + } + + if (udev_monitor_enable_receiving(udev_monitor)) { + usbi_err(NULL, "failed to enable the udev monitor"); + goto err_free_monitor; + } + + udev_monitor_fd = udev_monitor_get_fd(udev_monitor); + + /* Some older versions of udev are not non-blocking by default, + * so make sure this is set */ + r = fcntl(udev_monitor_fd, F_GETFL); + if (r == -1) { + usbi_err(NULL, "getting udev monitor fd flags (%d)", errno); + goto err_free_monitor; + } + r = fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK); + if (r) { + usbi_err(NULL, "setting udev monitor fd flags (%d)", errno); + goto err_free_monitor; + } + + r = pthread_create(&linux_event_thread, NULL, linux_udev_event_thread_main, NULL); + if (r) { + usbi_err(NULL, "creating hotplug event thread (%d)", r); + goto err_free_monitor; + } + + return LIBUSB_SUCCESS; + +err_free_monitor: + udev_monitor_unref(udev_monitor); + udev_monitor = NULL; + udev_monitor_fd = -1; +err_free_ctx: + udev_unref(udev_ctx); + udev_ctx = NULL; + return LIBUSB_ERROR_OTHER; +} + +int linux_udev_stop_event_monitor(void) +{ + assert(udev_ctx != NULL); + assert(udev_monitor != NULL); + assert(udev_monitor_fd != -1); + + /* Cancel the event thread. This is the only way to guarantee the + thread exits since closing the monitor fd won't necessarily cause + poll to return. */ + pthread_cancel(linux_event_thread); + pthread_join(linux_event_thread, NULL); + + /* Release the udev monitor */ + udev_monitor_unref(udev_monitor); + udev_monitor = NULL; + udev_monitor_fd = -1; + + /* Clean up the udev context */ + udev_unref(udev_ctx); + udev_ctx = NULL; + + return LIBUSB_SUCCESS; +} + +static void *linux_udev_event_thread_main(void *arg) +{ + struct udev_device* udev_dev; + struct pollfd fds = {.fd = udev_monitor_fd, + .events = POLLIN}; + + usbi_dbg("udev event thread entering."); + + while (1 == poll(&fds, 1, -1)) { + if (NULL == udev_monitor || POLLIN != fds.revents) { + break; + } + + usbi_mutex_static_lock(&linux_hotplug_lock); + udev_dev = udev_monitor_receive_device(udev_monitor); + if (udev_dev) + udev_hotplug_event(udev_dev); + usbi_mutex_static_unlock(&linux_hotplug_lock); + } + + usbi_dbg("udev event thread exiting"); + + return NULL; +} + +static int udev_device_info(struct libusb_context *ctx, int detached, + struct udev_device *udev_dev, uint8_t *busnum, + uint8_t *devaddr, const char **sys_name) { + const char *dev_node; + + dev_node = udev_device_get_devnode(udev_dev); + if (!dev_node) { + return LIBUSB_ERROR_OTHER; + } + + *sys_name = udev_device_get_sysname(udev_dev); + if (!*sys_name) { + return LIBUSB_ERROR_OTHER; + } + + return linux_get_device_address(ctx, detached, busnum, devaddr, + dev_node, *sys_name); +} + +static void udev_hotplug_event(struct udev_device* udev_dev) +{ + const char* udev_action; + const char* sys_name = NULL; + uint8_t busnum = 0, devaddr = 0; + int detached; + int r; + + do { + udev_action = udev_device_get_action(udev_dev); + if (!udev_action) { + break; + } + + detached = !strncmp(udev_action, "remove", 6); + + r = udev_device_info(NULL, detached, udev_dev, &busnum, &devaddr, &sys_name); + if (LIBUSB_SUCCESS != r) { + break; + } + + usbi_dbg("udev hotplug event. action: %s.", udev_action); + + if (strncmp(udev_action, "add", 3) == 0) { + linux_hotplug_enumerate(busnum, devaddr, sys_name); + } else if (detached) { + linux_hotplug_disconnected(busnum, devaddr, sys_name); + } else { + usbi_err(NULL, "ignoring udev action %s", udev_action); + } + } while (0); + + udev_device_unref(udev_dev); +} + +int linux_udev_scan_devices(struct libusb_context *ctx) +{ + struct udev_enumerate *enumerator; + struct udev_list_entry *devices, *entry; + struct udev_device *udev_dev; + const char *sys_name; + int r; + + assert(udev_ctx != NULL); + + enumerator = udev_enumerate_new(udev_ctx); + if (NULL == enumerator) { + usbi_err(ctx, "error creating udev enumerator"); + return LIBUSB_ERROR_OTHER; + } + + udev_enumerate_add_match_subsystem(enumerator, "usb"); + udev_enumerate_scan_devices(enumerator); + devices = udev_enumerate_get_list_entry(enumerator); + + udev_list_entry_foreach(entry, devices) { + const char *path = udev_list_entry_get_name(entry); + uint8_t busnum = 0, devaddr = 0; + + udev_dev = udev_device_new_from_syspath(udev_ctx, path); + + r = udev_device_info(ctx, 0, udev_dev, &busnum, &devaddr, &sys_name); + if (r) { + udev_device_unref(udev_dev); + continue; + } + + linux_enumerate_device(ctx, busnum, devaddr, sys_name); + udev_device_unref(udev_dev); + } + + udev_enumerate_unref(enumerator); + + return LIBUSB_SUCCESS; +} + +void linux_udev_hotplug_poll(void) +{ + struct udev_device* udev_dev; + + usbi_mutex_static_lock(&linux_hotplug_lock); + do { + udev_dev = udev_monitor_receive_device(udev_monitor); + if (udev_dev) { + usbi_dbg("Handling hotplug event from hotplug_poll"); + udev_hotplug_event(udev_dev); + } + } while (udev_dev); + usbi_mutex_static_unlock(&linux_hotplug_lock); +} diff --git a/Externals/libusbx/libusb/os/linux_usbfs.c b/Externals/libusbx/libusb/os/linux_usbfs.c new file mode 100644 index 0000000000..09288af719 --- /dev/null +++ b/Externals/libusbx/libusb/os/linux_usbfs.c @@ -0,0 +1,2568 @@ +/* + * Linux usbfs backend for libusbx + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * Copyright © 2013 Nathan Hjelm + * Copyright © 2012-2013 Hans de Goede + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusb.h" +#include "libusbi.h" +#include "linux_usbfs.h" + +/* sysfs vs usbfs: + * opening a usbfs node causes the device to be resumed, so we attempt to + * avoid this during enumeration. + * + * sysfs allows us to read the kernel's in-memory copies of device descriptors + * and so forth, avoiding the need to open the device: + * - The binary "descriptors" file contains all config descriptors since + * 2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed + * - The binary "descriptors" file was added in 2.6.23, commit + * 69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the + * active config descriptors + * - The "busnum" file was added in 2.6.22, commit + * 83f7d958eab2fbc6b159ee92bf1493924e1d0f72 + * - The "devnum" file has been present since pre-2.6.18 + * - the "bConfigurationValue" file has been present since pre-2.6.18 + * + * If we have bConfigurationValue, busnum, and devnum, then we can determine + * the active configuration without having to open the usbfs node in RDWR mode. + * The busnum file is important as that is the only way we can relate sysfs + * devices to usbfs nodes. + * + * If we also have all descriptors, we can obtain the device descriptor and + * configuration without touching usbfs at all. + */ + +/* endianness for multi-byte fields: + * + * Descriptors exposed by usbfs have the multi-byte fields in the device + * descriptor as host endian. Multi-byte fields in the other descriptors are + * bus-endian. The kernel documentation says otherwise, but it is wrong. + * + * In sysfs all descriptors are bus-endian. + */ + +static const char *usbfs_path = NULL; + +/* use usbdev*.* device names in /dev instead of the usbfs bus directories */ +static int usbdev_names = 0; + +/* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically + * allows us to mark URBs as being part of a specific logical transfer when + * we submit them to the kernel. then, on any error except a cancellation, all + * URBs within that transfer will be cancelled and no more URBs will be + * accepted for the transfer, meaning that no more data can creep in. + * + * The BULK_CONTINUATION flag must be set on all URBs within a bulk transfer + * (in either direction) except the first. + * For IN transfers, we must also set SHORT_NOT_OK on all URBs except the + * last; it means that the kernel should treat a short reply as an error. + * For OUT transfers, SHORT_NOT_OK must not be set. it isn't needed (OUT + * transfers can't be short unless there's already some sort of error), and + * setting this flag is disallowed (a kernel with USB debugging enabled will + * reject such URBs). + */ +static int supports_flag_bulk_continuation = -1; + +/* Linux 2.6.31 fixes support for the zero length packet URB flag. This + * allows us to mark URBs that should be followed by a zero length data + * packet, which can be required by device- or class-specific protocols. + */ +static int supports_flag_zero_packet = -1; + +/* clock ID for monotonic clock, as not all clock sources are available on all + * systems. appropriate choice made at initialization time. */ +static clockid_t monotonic_clkid = -1; + +/* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum + * to sysfs, so we can relate devices. This also implies that we can read + * the active configuration through bConfigurationValue */ +static int sysfs_can_relate_devices = -1; + +/* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all + * config descriptors (rather then just the active config) to the sysfs + * descriptors file, so from then on we can use them. */ +static int sysfs_has_descriptors = -1; + +/* how many times have we initted (and not exited) ? */ +static volatile int init_count = 0; + +/* Serialize hotplug start/stop, scan-devices, event-thread, and poll */ +usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER; + +static int linux_start_event_monitor(void); +static int linux_stop_event_monitor(void); +static int linux_scan_devices(struct libusb_context *ctx); +static int sysfs_scan_device(struct libusb_context *ctx, const char *devname); +static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int); + +#if !defined(USE_UDEV) +static int linux_default_scan_devices (struct libusb_context *ctx); +#endif + +struct linux_device_priv { + char *sysfs_dir; + unsigned char *descriptors; + int descriptors_len; + int active_config; /* cache val for !sysfs_can_relate_devices */ +}; + +struct linux_device_handle_priv { + int fd; + uint32_t caps; +}; + +enum reap_action { + NORMAL = 0, + /* submission failed after the first URB, so await cancellation/completion + * of all the others */ + SUBMIT_FAILED, + + /* cancelled by user or timeout */ + CANCELLED, + + /* completed multi-URB transfer in non-final URB */ + COMPLETED_EARLY, + + /* one or more urbs encountered a low-level error */ + ERROR, +}; + +struct linux_transfer_priv { + union { + struct usbfs_urb *urbs; + struct usbfs_urb **iso_urbs; + }; + + enum reap_action reap_action; + int num_urbs; + int num_retired; + enum libusb_transfer_status reap_status; + + /* next iso packet in user-supplied transfer to be populated */ + int iso_packet_offset; +}; + +static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + char path[PATH_MAX]; + int fd; + + if (usbdev_names) + snprintf(path, PATH_MAX, "%s/usbdev%d.%d", + usbfs_path, dev->bus_number, dev->device_address); + else + snprintf(path, PATH_MAX, "%s/%03d/%03d", + usbfs_path, dev->bus_number, dev->device_address); + + fd = open(path, mode); + if (fd != -1) + return fd; /* Success */ + + if (!silent) { + usbi_err(ctx, "libusbx couldn't open USB device %s: %s", + path, strerror(errno)); + if (errno == EACCES && mode == O_RDWR) + usbi_err(ctx, "libusbx requires write access to USB " + "device nodes."); + } + + if (errno == EACCES) + return LIBUSB_ERROR_ACCESS; + if (errno == ENOENT) + return LIBUSB_ERROR_NO_DEVICE; + return LIBUSB_ERROR_IO; +} + +static struct linux_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct linux_device_priv *) dev->os_priv; +} + +static struct linux_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct linux_device_handle_priv *) handle->os_priv; +} + +/* check dirent for a /dev/usbdev%d.%d name + * optionally return bus/device on success */ +static int _is_usbdev_entry(struct dirent *entry, int *bus_p, int *dev_p) +{ + int busnum, devnum; + + if (sscanf(entry->d_name, "usbdev%d.%d", &busnum, &devnum) != 2) + return 0; + + usbi_dbg("found: %s", entry->d_name); + if (bus_p != NULL) + *bus_p = busnum; + if (dev_p != NULL) + *dev_p = devnum; + return 1; +} + +static int check_usb_vfs(const char *dirname) +{ + DIR *dir; + struct dirent *entry; + int found = 0; + + dir = opendir(dirname); + if (!dir) + return 0; + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] == '.') + continue; + + /* We assume if we find any files that it must be the right place */ + found = 1; + break; + } + + closedir(dir); + return found; +} + +static const char *find_usbfs_path(void) +{ + const char *path = "/dev/bus/usb"; + const char *ret = NULL; + + if (check_usb_vfs(path)) { + ret = path; + } else { + path = "/proc/bus/usb"; + if (check_usb_vfs(path)) + ret = path; + } + + /* look for /dev/usbdev*.* if the normal places fail */ + if (ret == NULL) { + struct dirent *entry; + DIR *dir; + + path = "/dev"; + dir = opendir(path); + if (dir != NULL) { + while ((entry = readdir(dir)) != NULL) { + if (_is_usbdev_entry(entry, NULL, NULL)) { + /* found one; that's enough */ + ret = path; + usbdev_names = 1; + break; + } + } + closedir(dir); + } + } + + if (ret != NULL) + usbi_dbg("found usbfs at %s", ret); + + return ret; +} + +/* the monotonic clock is not usable on all systems (e.g. embedded ones often + * seem to lack it). fall back to REALTIME if we have to. */ +static clockid_t find_monotonic_clock(void) +{ +#ifdef CLOCK_MONOTONIC + struct timespec ts; + int r; + + /* Linux 2.6.28 adds CLOCK_MONOTONIC_RAW but we don't use it + * because it's not available through timerfd */ + r = clock_gettime(CLOCK_MONOTONIC, &ts); + if (r == 0) + return CLOCK_MONOTONIC; + usbi_dbg("monotonic clock doesn't work, errno %d", errno); +#endif + + return CLOCK_REALTIME; +} + +static int kernel_version_ge(int major, int minor, int sublevel) +{ + struct utsname uts; + int atoms, kmajor, kminor, ksublevel; + + if (uname(&uts) < 0) + return -1; + atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); + if (atoms < 1) + return -1; + + if (kmajor > major) + return 1; + if (kmajor < major) + return 0; + + /* kmajor == major */ + if (atoms < 2) + return 0 == minor && 0 == sublevel; + if (kminor > minor) + return 1; + if (kminor < minor) + return 0; + + /* kminor == minor */ + if (atoms < 3) + return 0 == sublevel; + + return ksublevel >= sublevel; +} + +static int op_init(struct libusb_context *ctx) +{ + struct stat statbuf; + int r; + + usbfs_path = find_usbfs_path(); + if (!usbfs_path) { + usbi_err(ctx, "could not find usbfs"); + return LIBUSB_ERROR_OTHER; + } + + if (monotonic_clkid == -1) + monotonic_clkid = find_monotonic_clock(); + + if (supports_flag_bulk_continuation == -1) { + /* bulk continuation URB flag available from Linux 2.6.32 */ + supports_flag_bulk_continuation = kernel_version_ge(2,6,32); + if (supports_flag_bulk_continuation == -1) { + usbi_err(ctx, "error checking for bulk continuation support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_bulk_continuation) + usbi_dbg("bulk continuation flag supported"); + + if (-1 == supports_flag_zero_packet) { + /* zero length packet URB flag fixed since Linux 2.6.31 */ + supports_flag_zero_packet = kernel_version_ge(2,6,31); + if (-1 == supports_flag_zero_packet) { + usbi_err(ctx, "error checking for zero length packet support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_zero_packet) + usbi_dbg("zero length packet flag supported"); + + if (-1 == sysfs_has_descriptors) { + /* sysfs descriptors has all descriptors since Linux 2.6.26 */ + sysfs_has_descriptors = kernel_version_ge(2,6,26); + if (-1 == sysfs_has_descriptors) { + usbi_err(ctx, "error checking for sysfs descriptors"); + return LIBUSB_ERROR_OTHER; + } + } + + if (-1 == sysfs_can_relate_devices) { + /* sysfs has busnum since Linux 2.6.22 */ + sysfs_can_relate_devices = kernel_version_ge(2,6,22); + if (-1 == sysfs_can_relate_devices) { + usbi_err(ctx, "error checking for sysfs busnum"); + return LIBUSB_ERROR_OTHER; + } + } + + if (sysfs_can_relate_devices || sysfs_has_descriptors) { + r = stat(SYSFS_DEVICE_PATH, &statbuf); + if (r != 0 || !S_ISDIR(statbuf.st_mode)) { + usbi_warn(ctx, "sysfs not mounted"); + sysfs_can_relate_devices = 0; + sysfs_has_descriptors = 0; + } + } + + if (sysfs_can_relate_devices) + usbi_dbg("sysfs can relate devices"); + + if (sysfs_has_descriptors) + usbi_dbg("sysfs has complete descriptors"); + + usbi_mutex_static_lock(&linux_hotplug_lock); + r = LIBUSB_SUCCESS; + if (init_count == 0) { + /* start up hotplug event handler */ + r = linux_start_event_monitor(); + } + if (r == LIBUSB_SUCCESS) { + r = linux_scan_devices(ctx); + if (r == LIBUSB_SUCCESS) + init_count++; + else if (init_count == 0) + linux_stop_event_monitor(); + } else + usbi_err(ctx, "error starting hotplug event monitor"); + usbi_mutex_static_unlock(&linux_hotplug_lock); + + return r; +} + +static void op_exit(void) +{ + usbi_mutex_static_lock(&linux_hotplug_lock); + assert(init_count != 0); + if (!--init_count) { + /* tear down event handler */ + (void)linux_stop_event_monitor(); + } + usbi_mutex_static_unlock(&linux_hotplug_lock); +} + +static int linux_start_event_monitor(void) +{ +#if defined(USE_UDEV) + return linux_udev_start_event_monitor(); +#else + return linux_netlink_start_event_monitor(); +#endif +} + +static int linux_stop_event_monitor(void) +{ +#if defined(USE_UDEV) + return linux_udev_stop_event_monitor(); +#else + return linux_netlink_stop_event_monitor(); +#endif +} + +static int linux_scan_devices(struct libusb_context *ctx) +{ +#if defined(USE_UDEV) + return linux_udev_scan_devices(ctx); +#else + return linux_default_scan_devices(ctx); +#endif +} + +static void op_hotplug_poll(void) +{ +#if defined(USE_UDEV) + linux_udev_hotplug_poll(); +#else + linux_netlink_hotplug_poll(); +#endif +} + +static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) +{ + struct linux_device_priv *priv = _device_priv(dev); + char filename[PATH_MAX]; + int fd; + + snprintf(filename, PATH_MAX, "%s/%s/%s", + SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); + fd = open(filename, O_RDONLY); + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), + "open %s failed ret=%d errno=%d", filename, fd, errno); + return LIBUSB_ERROR_IO; + } + + return fd; +} + +/* Note only suitable for attributes which always read >= 0, < 0 is error */ +static int __read_sysfs_attr(struct libusb_context *ctx, + const char *devname, const char *attr) +{ + char filename[PATH_MAX]; + FILE *f; + int r, value; + + snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, + devname, attr); + f = fopen(filename, "r"); + if (f == NULL) { + if (errno == ENOENT) { + /* File doesn't exist. Assume the device has been + disconnected (see trac ticket #70). */ + return LIBUSB_ERROR_NO_DEVICE; + } + usbi_err(ctx, "open %s failed errno=%d", filename, errno); + return LIBUSB_ERROR_IO; + } + + r = fscanf(f, "%d", &value); + fclose(f); + if (r != 1) { + usbi_err(ctx, "fscanf %s returned %d, errno=%d", attr, r, errno); + return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ + } + if (value < 0) { + usbi_err(ctx, "%s contains a negative value", filename); + return LIBUSB_ERROR_IO; + } + + return value; +} + +static int op_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer, int *host_endian) +{ + struct linux_device_priv *priv = _device_priv(dev); + + *host_endian = sysfs_has_descriptors ? 0 : 1; + memcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH); + + return 0; +} + +/* read the bConfigurationValue for a device */ +static int sysfs_get_active_config(struct libusb_device *dev, int *config) +{ + char *endptr; + char tmp[4] = {0, 0, 0, 0}; + long num; + int fd; + ssize_t r; + + fd = _open_sysfs_attr(dev, "bConfigurationValue"); + if (fd < 0) + return fd; + + r = read(fd, tmp, sizeof(tmp)); + close(fd); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "read bConfigurationValue failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } else if (r == 0) { + usbi_dbg("device unconfigured"); + *config = -1; + return 0; + } + + if (tmp[sizeof(tmp) - 1] != 0) { + usbi_err(DEVICE_CTX(dev), "not null-terminated?"); + return LIBUSB_ERROR_IO; + } else if (tmp[0] == 0) { + usbi_err(DEVICE_CTX(dev), "no configuration value?"); + return LIBUSB_ERROR_IO; + } + + num = strtol(tmp, &endptr, 10); + if (endptr == tmp) { + usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tmp); + return LIBUSB_ERROR_IO; + } + + *config = (int) num; + return 0; +} + +int linux_get_device_address (struct libusb_context *ctx, int detached, + uint8_t *busnum, uint8_t *devaddr,const char *dev_node, + const char *sys_name) +{ + usbi_dbg("getting address for device: %s detached: %d", sys_name, detached); + /* can't use sysfs to read the bus and device number if the + * device has been detached */ + if (!sysfs_can_relate_devices || detached || NULL == sys_name) { + if (NULL == dev_node) { + return LIBUSB_ERROR_OTHER; + } + + /* will this work with all supported kernel versions? */ + if (!strncmp(dev_node, "/dev/bus/usb", 12)) { + sscanf (dev_node, "/dev/bus/usb/%hhd/%hhd", busnum, devaddr); + } else if (!strncmp(dev_node, "/proc/bus/usb", 13)) { + sscanf (dev_node, "/proc/bus/usb/%hhd/%hhd", busnum, devaddr); + } + + return LIBUSB_SUCCESS; + } + + usbi_dbg("scan %s", sys_name); + + *busnum = __read_sysfs_attr(ctx, sys_name, "busnum"); + if (0 > *busnum) + return *busnum; + + *devaddr = __read_sysfs_attr(ctx, sys_name, "devnum"); + if (0 > *devaddr) + return *devaddr; + + usbi_dbg("bus=%d dev=%d", *busnum, *devaddr); + if (*busnum > 255 || *devaddr > 255) + return LIBUSB_ERROR_INVALID_PARAM; + + return LIBUSB_SUCCESS; +} + +/* Return offset of the next descriptor with the given type */ +static int seek_to_next_descriptor(struct libusb_context *ctx, + uint8_t descriptor_type, unsigned char *buffer, int size) +{ + struct usb_descriptor_header header; + int i; + + for (i = 0; size >= 0; i += header.bLength, size -= header.bLength) { + if (size == 0) + return LIBUSB_ERROR_NOT_FOUND; + + if (size < 2) { + usbi_err(ctx, "short descriptor read %d/2", size); + return LIBUSB_ERROR_IO; + } + usbi_parse_descriptor(buffer + i, "bb", &header, 0); + + if (i && header.bDescriptorType == descriptor_type) + return i; + } + usbi_err(ctx, "bLength overflow by %d bytes", -size); + return LIBUSB_ERROR_IO; +} + +/* Return offset to next config */ +static int seek_to_next_config(struct libusb_context *ctx, + unsigned char *buffer, int size) +{ + struct libusb_config_descriptor config; + + if (size == 0) + return LIBUSB_ERROR_NOT_FOUND; + + if (size < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "short descriptor read %d/%d", + size, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwbbbbb", &config, 0); + if (config.bDescriptorType != LIBUSB_DT_CONFIG) { + usbi_err(ctx, "descriptor is not a config desc (type 0x%02x)", + config.bDescriptorType); + return LIBUSB_ERROR_IO; + } + + /* + * In usbfs the config descriptors are config.wTotalLength bytes apart, + * with any short reads from the device appearing as holes in the file. + * + * In sysfs wTotalLength is ignored, instead the kernel returns a + * config descriptor with verified bLength fields, with descriptors + * with an invalid bLength removed. + */ + if (sysfs_has_descriptors) { + int next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG, + buffer, size); + if (next == LIBUSB_ERROR_NOT_FOUND) + next = size; + if (next < 0) + return next; + + if (next != config.wTotalLength) + usbi_warn(ctx, "config length mismatch wTotalLength " + "%d real %d", config.wTotalLength, next); + return next; + } else { + if (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "invalid wTotalLength %d", + config.wTotalLength); + return LIBUSB_ERROR_IO; + } else if (config.wTotalLength > size) { + usbi_warn(ctx, "short descriptor read %d/%d", + size, config.wTotalLength); + return size; + } else + return config.wTotalLength; + } +} + +static int op_get_config_descriptor_by_value(struct libusb_device *dev, + uint8_t value, unsigned char **buffer, int *host_endian) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct linux_device_priv *priv = _device_priv(dev); + unsigned char *descriptors = priv->descriptors; + int size = priv->descriptors_len; + struct libusb_config_descriptor *config; + + *buffer = NULL; + /* Unlike the device desc. config descs. are always in raw format */ + *host_endian = 0; + + /* Skip device header */ + descriptors += DEVICE_DESC_LENGTH; + size -= DEVICE_DESC_LENGTH; + + /* Seek till the config is found, or till "EOF" */ + while (1) { + int next = seek_to_next_config(ctx, descriptors, size); + if (next < 0) + return next; + config = (struct libusb_config_descriptor *)descriptors; + if (config->bConfigurationValue == value) { + *buffer = descriptors; + return next; + } + size -= next; + descriptors += next; + } +} + +static int op_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len, int *host_endian) +{ + int r, config; + unsigned char *config_desc; + + if (sysfs_can_relate_devices) { + r = sysfs_get_active_config(dev, &config); + if (r < 0) + return r; + } else { + /* Use cached bConfigurationValue */ + struct linux_device_priv *priv = _device_priv(dev); + config = priv->active_config; + } + if (config == -1) + return LIBUSB_ERROR_NOT_FOUND; + + r = op_get_config_descriptor_by_value(dev, config, &config_desc, + host_endian); + if (r < 0) + return r; + + len = MIN(len, r); + memcpy(buffer, config_desc, len); + return len; +} + +static int op_get_config_descriptor(struct libusb_device *dev, + uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct linux_device_priv *priv = _device_priv(dev); + unsigned char *descriptors = priv->descriptors; + int i, r, size = priv->descriptors_len; + + /* Unlike the device desc. config descs. are always in raw format */ + *host_endian = 0; + + /* Skip device header */ + descriptors += DEVICE_DESC_LENGTH; + size -= DEVICE_DESC_LENGTH; + + /* Seek till the config is found, or till "EOF" */ + for (i = 0; ; i++) { + r = seek_to_next_config(DEVICE_CTX(dev), descriptors, size); + if (r < 0) + return r; + if (i == config_index) + break; + size -= r; + descriptors += r; + } + + len = MIN(len, r); + memcpy(buffer, descriptors, len); + return len; +} + +/* send a control message to retrieve active configuration */ +static int usbfs_get_active_config(struct libusb_device *dev, int fd) +{ + unsigned char active_config = 0; + int r; + + struct usbfs_ctrltransfer ctrl = { + .bmRequestType = LIBUSB_ENDPOINT_IN, + .bRequest = LIBUSB_REQUEST_GET_CONFIGURATION, + .wValue = 0, + .wIndex = 0, + .wLength = 1, + .timeout = 1000, + .data = &active_config + }; + + r = ioctl(fd, IOCTL_USBFS_CONTROL, &ctrl); + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + /* we hit this error path frequently with buggy devices :( */ + usbi_warn(DEVICE_CTX(dev), + "get_configuration failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } + + return active_config; +} + +static int initialize_device(struct libusb_device *dev, uint8_t busnum, + uint8_t devaddr, const char *sysfs_dir) +{ + struct linux_device_priv *priv = _device_priv(dev); + struct libusb_context *ctx = DEVICE_CTX(dev); + int descriptors_size = 512; /* Begin with a 1024 byte alloc */ + int fd, speed; + ssize_t r; + + dev->bus_number = busnum; + dev->device_address = devaddr; + + if (sysfs_dir) { + priv->sysfs_dir = malloc(strlen(sysfs_dir) + 1); + if (!priv->sysfs_dir) + return LIBUSB_ERROR_NO_MEM; + strcpy(priv->sysfs_dir, sysfs_dir); + + /* Note speed can contain 1.5, in this case __read_sysfs_attr + will stop parsing at the '.' and return 1 */ + speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); + if (speed >= 0) { + switch (speed) { + case 1: dev->speed = LIBUSB_SPEED_LOW; break; + case 12: dev->speed = LIBUSB_SPEED_FULL; break; + case 480: dev->speed = LIBUSB_SPEED_HIGH; break; + case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed); + } + } + } + + /* cache descriptors in memory */ + if (sysfs_has_descriptors) + fd = _open_sysfs_attr(dev, "descriptors"); + else + fd = _get_usbfs_fd(dev, O_RDONLY, 0); + if (fd < 0) + return fd; + + do { + descriptors_size *= 2; + priv->descriptors = usbi_reallocf(priv->descriptors, + descriptors_size); + if (!priv->descriptors) { + close(fd); + return LIBUSB_ERROR_NO_MEM; + } + /* usbfs has holes in the file */ + if (!sysfs_has_descriptors) { + memset(priv->descriptors + priv->descriptors_len, + 0, descriptors_size - priv->descriptors_len); + } + r = read(fd, priv->descriptors + priv->descriptors_len, + descriptors_size - priv->descriptors_len); + if (r < 0) { + usbi_err(ctx, "read descriptor failed ret=%d errno=%d", + fd, errno); + close(fd); + return LIBUSB_ERROR_IO; + } + priv->descriptors_len += r; + } while (priv->descriptors_len == descriptors_size); + + close(fd); + + if (priv->descriptors_len < DEVICE_DESC_LENGTH) { + usbi_err(ctx, "short descriptor read (%d)", + priv->descriptors_len); + return LIBUSB_ERROR_IO; + } + + if (sysfs_can_relate_devices) + return LIBUSB_SUCCESS; + + /* cache active config */ + fd = _get_usbfs_fd(dev, O_RDWR, 1); + if (fd < 0) { + /* cannot send a control message to determine the active + * config. just assume the first one is active. */ + usbi_warn(ctx, "Missing rw usbfs access; cannot determine " + "active configuration descriptor"); + if (priv->descriptors_len >= + (DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) { + struct libusb_config_descriptor config; + usbi_parse_descriptor( + priv->descriptors + DEVICE_DESC_LENGTH, + "bbwbbbbb", &config, 0); + priv->active_config = config.bConfigurationValue; + } else + priv->active_config = -1; /* No config dt */ + + return LIBUSB_SUCCESS; + } + + r = usbfs_get_active_config(dev, fd); + if (r > 0) { + priv->active_config = r; + r = LIBUSB_SUCCESS; + } else if (r == 0) { + /* some buggy devices have a configuration 0, but we're + * reaching into the corner of a corner case here, so let's + * not support buggy devices in these circumstances. + * stick to the specs: a configuration value of 0 means + * unconfigured. */ + usbi_dbg("active cfg 0? assuming unconfigured device"); + priv->active_config = -1; + r = LIBUSB_SUCCESS; + } else if (r == LIBUSB_ERROR_IO) { + /* buggy devices sometimes fail to report their active config. + * assume unconfigured and continue the probing */ + usbi_warn(ctx, "couldn't query active configuration, assuming" + " unconfigured"); + priv->active_config = -1; + r = LIBUSB_SUCCESS; + } /* else r < 0, just return the error code */ + + close(fd); + return r; +} + +static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_dir) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device *it; + char *parent_sysfs_dir, *tmp; + int ret, add_parent = 1; + + /* XXX -- can we figure out the topology when using usbfs? */ + if (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, "usb", 3)) { + /* either using usbfs or finding the parent of a root hub */ + return LIBUSB_SUCCESS; + } + + parent_sysfs_dir = strdup(sysfs_dir); + if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) || + NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) { + dev->port_number = atoi(tmp + 1); + *tmp = '\0'; + } else { + usbi_warn(ctx, "Can not parse sysfs_dir: %s, no parent info", + parent_sysfs_dir); + free (parent_sysfs_dir); + return LIBUSB_SUCCESS; + } + + /* is the parent a root hub? */ + if (NULL == strchr(parent_sysfs_dir, '-')) { + tmp = parent_sysfs_dir; + ret = asprintf (&parent_sysfs_dir, "usb%s", tmp); + free (tmp); + if (0 > ret) { + return LIBUSB_ERROR_NO_MEM; + } + } + +retry: + /* find the parent in the context */ + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) { + struct linux_device_priv *priv = _device_priv(it); + if (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) { + dev->parent_dev = libusb_ref_device(it); + break; + } + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + if (!dev->parent_dev && add_parent) { + usbi_dbg("parent_dev %s not enumerated yet, enumerating now", + parent_sysfs_dir); + sysfs_scan_device(ctx, parent_sysfs_dir); + add_parent = 0; + goto retry; + } + + usbi_dbg("Dev %p (%s) has parent %p (%s) port %d", dev, sysfs_dir, + dev->parent_dev, parent_sysfs_dir, dev->port_number); + + free (parent_sysfs_dir); + + return LIBUSB_SUCCESS; +} + +int linux_enumerate_device(struct libusb_context *ctx, + uint8_t busnum, uint8_t devaddr, const char *sysfs_dir) +{ + unsigned long session_id; + struct libusb_device *dev; + int r = 0; + + /* FIXME: session ID is not guaranteed unique as addresses can wrap and + * will be reused. instead we should add a simple sysfs attribute with + * a session ID. */ + session_id = busnum << 8 | devaddr; + usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, + session_id); + + if (usbi_get_device_by_session_id(ctx, session_id)) { + /* device already exists in the context */ + usbi_dbg("session_id %ld already exists", session_id); + return LIBUSB_SUCCESS; + } + + usbi_dbg("allocating new device for %d/%d (session %ld)", + busnum, devaddr, session_id); + dev = usbi_alloc_device(ctx, session_id); + if (!dev) + return LIBUSB_ERROR_NO_MEM; + + r = initialize_device(dev, busnum, devaddr, sysfs_dir); + if (r < 0) + goto out; + r = usbi_sanitize_device(dev); + if (r < 0) + goto out; + + r = linux_get_parent_info(dev, sysfs_dir); + if (r < 0) + goto out; +out: + if (r < 0) + libusb_unref_device(dev); + else + usbi_connect_device(dev); + + return r; +} + +void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name) +{ + struct libusb_context *ctx; + + usbi_mutex_static_lock(&active_contexts_lock); + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + linux_enumerate_device(ctx, busnum, devaddr, sys_name); + } + usbi_mutex_static_unlock(&active_contexts_lock); +} + +void linux_hotplug_disconnected(uint8_t busnum, uint8_t devaddr, const char *sys_name) +{ + struct libusb_context *ctx; + struct libusb_device *dev; + unsigned long session_id = busnum << 8 | devaddr; + + usbi_mutex_static_lock(&active_contexts_lock); + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + dev = usbi_get_device_by_session_id (ctx, session_id); + if (NULL != dev) { + usbi_disconnect_device (dev); + } else { + usbi_dbg("device not found for session %x", session_id); + } + } + usbi_mutex_static_unlock(&active_contexts_lock); +} + +#if !defined(USE_UDEV) +/* open a bus directory and adds all discovered devices to the context */ +static int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum) +{ + DIR *dir; + char dirpath[PATH_MAX]; + struct dirent *entry; + int r = LIBUSB_ERROR_IO; + + snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); + usbi_dbg("%s", dirpath); + dir = opendir(dirpath); + if (!dir) { + usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); + /* FIXME: should handle valid race conditions like hub unplugged + * during directory iteration - this is not an error */ + return r; + } + + while ((entry = readdir(dir))) { + int devaddr; + + if (entry->d_name[0] == '.') + continue; + + devaddr = atoi(entry->d_name); + if (devaddr == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + if (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + } + + closedir(dir); + return r; +} + +static int usbfs_get_device_list(struct libusb_context *ctx) +{ + struct dirent *entry; + DIR *buses = opendir(usbfs_path); + int r = 0; + + if (!buses) { + usbi_err(ctx, "opendir buses failed errno=%d", errno); + return LIBUSB_ERROR_IO; + } + + while ((entry = readdir(buses))) { + int busnum; + + if (entry->d_name[0] == '.') + continue; + + if (usbdev_names) { + int devaddr; + if (!_is_usbdev_entry(entry, &busnum, &devaddr)) + continue; + + r = linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL); + if (r < 0) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + } else { + busnum = atoi(entry->d_name); + if (busnum == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + r = usbfs_scan_busdir(ctx, busnum); + if (r < 0) + break; + } + } + + closedir(buses); + return r; + +} +#endif + +static int sysfs_scan_device(struct libusb_context *ctx, const char *devname) +{ + uint8_t busnum, devaddr; + int ret; + + ret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname); + if (LIBUSB_SUCCESS != ret) { + return ret; + } + + return linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff, + devname); +} + +#if !defined(USE_UDEV) +static int sysfs_get_device_list(struct libusb_context *ctx) +{ + DIR *devices = opendir(SYSFS_DEVICE_PATH); + struct dirent *entry; + int r = LIBUSB_ERROR_IO; + + if (!devices) { + usbi_err(ctx, "opendir devices failed errno=%d", errno); + return r; + } + + while ((entry = readdir(devices))) { + if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb", 3)) + || strchr(entry->d_name, ':')) + continue; + + if (sysfs_scan_device(ctx, entry->d_name)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + } + + closedir(devices); + return r; +} + +static int linux_default_scan_devices (struct libusb_context *ctx) +{ + /* we can retrieve device list and descriptors from sysfs or usbfs. + * sysfs is preferable, because if we use usbfs we end up resuming + * any autosuspended USB devices. however, sysfs is not available + * everywhere, so we need a usbfs fallback too. + * + * as described in the "sysfs vs usbfs" comment at the top of this + * file, sometimes we have sysfs but not enough information to + * relate sysfs devices to usbfs nodes. op_init() determines the + * adequacy of sysfs and sets sysfs_can_relate_devices. + */ + if (sysfs_can_relate_devices != 0) + return sysfs_get_device_list(ctx); + else + return usbfs_get_device_list(ctx); +} +#endif + +static int op_open(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + int r; + + hpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0); + if (hpriv->fd < 0) + return hpriv->fd; + + r = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps); + if (r < 0) { + if (errno == ENOTTY) + usbi_dbg("getcap not available"); + else + usbi_err(HANDLE_CTX(handle), "getcap failed (%d)", errno); + hpriv->caps = 0; + if (supports_flag_zero_packet) + hpriv->caps |= USBFS_CAP_ZERO_PACKET; + if (supports_flag_bulk_continuation) + hpriv->caps |= USBFS_CAP_BULK_CONTINUATION; + } + + return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); +} + +static void op_close(struct libusb_device_handle *dev_handle) +{ + int fd = _device_handle_priv(dev_handle)->fd; + usbi_remove_pollfd(HANDLE_CTX(dev_handle), fd); + close(fd); +} + +static int op_get_configuration(struct libusb_device_handle *handle, + int *config) +{ + int r; + + if (sysfs_can_relate_devices) { + r = sysfs_get_active_config(handle->dev, config); + } else { + r = usbfs_get_active_config(handle->dev, + _device_handle_priv(handle)->fd); + } + if (r < 0) + return r; + + if (*config == -1) { + usbi_err(HANDLE_CTX(handle), "device unconfigured"); + *config = 0; + } + + return 0; +} + +static int op_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct linux_device_priv *priv = _device_priv(handle->dev); + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + /* update our cached active config descriptor */ + priv->active_config = config; + + return LIBUSB_SUCCESS; +} + +static int claim_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "claim interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int release_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); + if (r) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "release interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int op_set_interface(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_setinterface setintf; + int r; + + setintf.interface = iface; + setintf.altsetting = altsetting; + r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "setintf failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_clear_halt(struct libusb_device_handle *handle, + unsigned char endpoint) +{ + int fd = _device_handle_priv(handle)->fd; + unsigned int _endpoint = endpoint; + int r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "clear_halt failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_reset_device(struct libusb_device_handle *handle) +{ + int fd = _device_handle_priv(handle)->fd; + int i, r, ret = 0; + + /* Doing a device reset will cause the usbfs driver to get unbound + from any interfaces it is bound to. By voluntarily unbinding + the usbfs driver ourself, we stop the kernel from rebinding + the interface after reset (which would end up with the interface + getting bound to the in kernel driver if any). */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + release_interface(handle, i); + } + } + + usbi_mutex_lock(&handle->lock); + r = ioctl(fd, IOCTL_USBFS_RESET, NULL); + if (r) { + if (errno == ENODEV) { + ret = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + usbi_err(HANDLE_CTX(handle), + "reset failed error %d errno %d", r, errno); + ret = LIBUSB_ERROR_OTHER; + goto out; + } + + /* And re-claim any interfaces which were claimed before the reset */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + /* + * A driver may have completed modprobing during + * IOCTL_USBFS_RESET, and bound itself as soon as + * IOCTL_USBFS_RESET released the device lock + */ + r = detach_kernel_driver_and_claim(handle, i); + if (r) { + usbi_warn(HANDLE_CTX(handle), + "failed to re-claim interface %d after reset: %s", + i, libusb_error_name(r)); + handle->claimed_interfaces &= ~(1L << i); + ret = LIBUSB_ERROR_NOT_FOUND; + } + } + } +out: + usbi_mutex_unlock(&handle->lock); + return ret; +} + +static int op_kernel_driver_active(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_getdriver getdrv; + int r; + + getdrv.interface = interface; + r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); + if (r) { + if (errno == ENODATA) + return 0; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "get driver failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return (strcmp(getdrv.driver, "usbfs") == 0) ? 0 : 1; +} + +static int op_detach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + struct usbfs_getdriver getdrv; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_DISCONNECT; + command.data = NULL; + + getdrv.interface = interface; + r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); + if (r == 0 && strcmp(getdrv.driver, "usbfs") == 0) + return LIBUSB_ERROR_NOT_FOUND; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "detach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_attach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_CONNECT; + command.data = NULL; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r < 0) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + + usbi_err(HANDLE_CTX(handle), + "attach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } else if (r == 0) { + return LIBUSB_ERROR_NOT_FOUND; + } + + return 0; +} + +static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, + int interface) +{ + struct usbfs_disconnect_claim dc; + int r, fd = _device_handle_priv(handle)->fd; + + dc.interface = interface; + strcpy(dc.driver, "usbfs"); + dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER; + r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc); + if (r == 0 || (r != 0 && errno != ENOTTY)) { + if (r == 0) + return 0; + + switch (errno) { + case EBUSY: + return LIBUSB_ERROR_BUSY; + case EINVAL: + return LIBUSB_ERROR_INVALID_PARAM; + case ENODEV: + return LIBUSB_ERROR_NO_DEVICE; + } + usbi_err(HANDLE_CTX(handle), + "disconnect-and-claim failed errno %d", errno); + return LIBUSB_ERROR_OTHER; + } + + /* Fallback code for kernels which don't support the + disconnect-and-claim ioctl */ + r = op_detach_kernel_driver(handle, interface); + if (r != 0 && r != LIBUSB_ERROR_NOT_FOUND) + return r; + + return claim_interface(handle, interface); +} + +static int op_claim_interface(struct libusb_device_handle *handle, int iface) +{ + if (handle->auto_detach_kernel_driver) + return detach_kernel_driver_and_claim(handle, iface); + else + return claim_interface(handle, iface); +} + +static int op_release_interface(struct libusb_device_handle *handle, int iface) +{ + int r; + + r = release_interface(handle, iface); + if (r) + return r; + + if (handle->auto_detach_kernel_driver) + op_attach_kernel_driver(handle, iface); + + return 0; +} + +static void op_destroy_device(struct libusb_device *dev) +{ + struct linux_device_priv *priv = _device_priv(dev); + if (priv->descriptors) + free(priv->descriptors); + if (priv->sysfs_dir) + free(priv->sysfs_dir); +} + +/* URBs are discarded in reverse order of submission to avoid races. */ +static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plus_one) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = + usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + int i, ret = 0; + struct usbfs_urb *urb; + + for (i = last_plus_one - 1; i >= first; i--) { + if (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type) + urb = tpriv->iso_urbs[i]; + else + urb = &tpriv->urbs[i]; + + if (0 == ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urb)) + continue; + + if (EINVAL == errno) { + usbi_dbg("URB not found --> assuming ready to be reaped"); + if (i == (last_plus_one - 1)) + ret = LIBUSB_ERROR_NOT_FOUND; + } else if (ENODEV == errno) { + usbi_dbg("Device not found for URB --> assuming ready to be reaped"); + ret = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised discard errno %d", errno); + ret = LIBUSB_ERROR_OTHER; + } + } + return ret; +} + +static void free_iso_urbs(struct linux_transfer_priv *tpriv) +{ + int i; + for (i = 0; i < tpriv->num_urbs; i++) { + struct usbfs_urb *urb = tpriv->iso_urbs[i]; + if (!urb) + break; + free(urb); + } + + free(tpriv->iso_urbs); + tpriv->iso_urbs = NULL; +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer, + unsigned char urb_type) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urbs; + int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) + == LIBUSB_ENDPOINT_OUT; + int bulk_buffer_len, use_bulk_continuation; + int r; + int i; + size_t alloc_size; + + if (tpriv->urbs) + return LIBUSB_ERROR_BUSY; + + if (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) && + !(dpriv->caps & USBFS_CAP_ZERO_PACKET)) + return LIBUSB_ERROR_NOT_SUPPORTED; + + /* + * Older versions of usbfs place a 16kb limit on bulk URBs. We work + * around this by splitting large transfers into 16k blocks, and then + * submit all urbs at once. it would be simpler to submit one urb at + * a time, but there is a big performance gain doing it this way. + * + * Newer versions lift the 16k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), + * using arbritary large transfers can still be a bad idea though, as + * the kernel needs to allocate physical contiguous memory for this, + * which may fail for large buffers. + * + * The kernel solves this problem by splitting the transfer into + * blocks itself when the host-controller is scatter-gather capable + * (USBFS_CAP_BULK_SCATTER_GATHER), which most controllers are. + * + * Last, there is the issue of short-transfers when splitting, for + * short split-transfers to work reliable USBFS_CAP_BULK_CONTINUATION + * is needed, but this is not always available. + */ + if (dpriv->caps & USBFS_CAP_BULK_SCATTER_GATHER) { + /* Good! Just submit everything in one go */ + bulk_buffer_len = transfer->length ? transfer->length : 1; + use_bulk_continuation = 0; + } else if (dpriv->caps & USBFS_CAP_BULK_CONTINUATION) { + /* Split the transfers and use bulk-continuation to + avoid issues with short-transfers */ + bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; + use_bulk_continuation = 1; + } else if (dpriv->caps & USBFS_CAP_NO_PACKET_SIZE_LIM) { + /* Don't split, assume the kernel can alloc the buffer + (otherwise the submit will fail with -ENOMEM) */ + bulk_buffer_len = transfer->length ? transfer->length : 1; + use_bulk_continuation = 0; + } else { + /* Bad, splitting without bulk-continuation, short transfers + which end before the last urb will not work reliable! */ + /* Note we don't warn here as this is "normal" on kernels < + 2.6.32 and not a problem for most applications */ + bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; + use_bulk_continuation = 0; + } + + int num_urbs = transfer->length / bulk_buffer_len; + int last_urb_partial = 0; + + if (transfer->length == 0) { + num_urbs = 1; + } else if ((transfer->length % bulk_buffer_len) > 0) { + last_urb_partial = 1; + num_urbs++; + } + usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, + transfer->length); + alloc_size = num_urbs * sizeof(struct usbfs_urb); + urbs = calloc(1, alloc_size); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + tpriv->urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; + + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb = &urbs[i]; + urb->usercontext = itransfer; + urb->type = urb_type; + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer + (i * bulk_buffer_len); + /* don't set the short not ok flag for the last URB */ + if (use_bulk_continuation && !is_out && (i < num_urbs - 1)) + urb->flags = USBFS_URB_SHORT_NOT_OK; + if (i == num_urbs - 1 && last_urb_partial) + urb->buffer_length = transfer->length % bulk_buffer_len; + else if (transfer->length == 0) + urb->buffer_length = 0; + else + urb->buffer_length = bulk_buffer_len; + + if (i > 0 && use_bulk_continuation) + urb->flags |= USBFS_URB_BULK_CONTINUATION; + + /* we have already checked that the flag is supported */ + if (is_out && i == num_urbs - 1 && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + urb->flags |= USBFS_URB_ZERO_PACKET; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free(urbs); + tpriv->urbs = NULL; + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we may need to discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusbx will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * - this URB failing may be no error; EREMOTEIO means that + * this transfer simply didn't need all the URBs we submitted + * so, we report that the transfer was submitted successfully and + * in case of error we discard all previous URBs. later when + * the final reap completes we can report error to the user, + * or success if an earlier URB was completed successfully. + */ + tpriv->reap_action = EREMOTEIO == errno ? COMPLETED_EARLY : SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired += num_urbs - i; + + /* If we completed short then don't try to discard. */ + if (COMPLETED_EARLY == tpriv->reap_action) + return 0; + + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb **urbs; + size_t alloc_size; + int num_packets = transfer->num_iso_packets; + int i; + int this_urb_len = 0; + int num_urbs = 1; + int packet_offset = 0; + unsigned int packet_len; + unsigned char *urb_buffer = transfer->buffer; + + if (tpriv->iso_urbs) + return LIBUSB_ERROR_BUSY; + + /* usbfs places a 32kb limit on iso URBs. we divide up larger requests + * into smaller units to meet such restriction, then fire off all the + * units at once. it would be simpler if we just fired one unit at a time, + * but there is a big performance gain through doing it this way. + * + * Newer kernels lift the 32k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), + * using arbritary large transfers is still be a bad idea though, as + * the kernel needs to allocate physical contiguous memory for this, + * which may fail for large buffers. + */ + + /* calculate how many URBs we need */ + for (i = 0; i < num_packets; i++) { + unsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; + packet_len = transfer->iso_packet_desc[i].length; + + if (packet_len > space_remaining) { + num_urbs++; + this_urb_len = packet_len; + } else { + this_urb_len += packet_len; + } + } + usbi_dbg("need %d 32k URBs for transfer", num_urbs); + + alloc_size = num_urbs * sizeof(*urbs); + urbs = calloc(1, alloc_size); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + + tpriv->iso_urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->iso_packet_offset = 0; + + /* allocate + initialize each URB with the correct number of packets */ + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb; + unsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; + int urb_packet_offset = 0; + unsigned char *urb_buffer_orig = urb_buffer; + int j; + int k; + + /* swallow up all the packets we can fit into this URB */ + while (packet_offset < transfer->num_iso_packets) { + packet_len = transfer->iso_packet_desc[packet_offset].length; + if (packet_len <= space_remaining_in_urb) { + /* throw it in */ + urb_packet_offset++; + packet_offset++; + space_remaining_in_urb -= packet_len; + urb_buffer += packet_len; + } else { + /* it can't fit, save it for the next URB */ + break; + } + } + + alloc_size = sizeof(*urb) + + (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc)); + urb = calloc(1, alloc_size); + if (!urb) { + free_iso_urbs(tpriv); + return LIBUSB_ERROR_NO_MEM; + } + urbs[i] = urb; + + /* populate packet lengths */ + for (j = 0, k = packet_offset - urb_packet_offset; + k < packet_offset; k++, j++) { + packet_len = transfer->iso_packet_desc[k].length; + urb->iso_frame_desc[j].length = packet_len; + } + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_ISO; + /* FIXME: interface for non-ASAP data? */ + urb->flags = USBFS_URB_ISO_ASAP; + urb->endpoint = transfer->endpoint; + urb->number_of_packets = urb_packet_offset; + urb->buffer = urb_buffer_orig; + } + + /* submit URBs */ + for (i = 0; i < num_urbs; i++) { + int r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free_iso_urbs(tpriv); + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we must discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusbx will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * so, in this case we discard all the previous URBs BUT we report + * that the transfer was submitted successfully. then later when + * the final discard completes we can report error to the user. + */ + tpriv->reap_action = SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired = num_urbs - i; + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urb; + int r; + + if (tpriv->urbs) + return LIBUSB_ERROR_BUSY; + + if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + urb = calloc(1, sizeof(struct usbfs_urb)); + if (!urb) + return LIBUSB_ERROR_NO_MEM; + tpriv->urbs = urb; + tpriv->num_urbs = 1; + tpriv->reap_action = NORMAL; + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_CONTROL; + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer; + urb->buffer_length = transfer->length; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + free(urb); + tpriv->urbs = NULL; + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } + return 0; +} + +static int op_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + return submit_bulk_transfer(itransfer, USBFS_URB_TYPE_BULK); + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer, USBFS_URB_TYPE_INTERRUPT); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int op_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_BULK: + if (tpriv->reap_action == ERROR) + break; + /* else, fall through */ + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + tpriv->reap_action = CANCELLED; + break; + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (!tpriv->urbs) + return LIBUSB_ERROR_NOT_FOUND; + + return discard_urbs(itransfer, 0, tpriv->num_urbs); +} + +static void op_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + /* urbs can be freed also in submit_transfer so lock mutex first */ + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + usbi_mutex_lock(&itransfer->lock); + if (tpriv->urbs) + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + usbi_mutex_lock(&itransfer->lock); + if (tpriv->iso_urbs) + free_iso_urbs(tpriv); + usbi_mutex_unlock(&itransfer->lock); + break; + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + } +} + +static int handle_bulk_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int urb_idx = urb - tpriv->urbs; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d of bulk urb %d/%d", urb->status, + urb_idx + 1, tpriv->num_urbs); + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { + /* cancelled, submit_fail, or completed early */ + usbi_dbg("abnormal reap: urb status %d", urb->status); + + /* even though we're in the process of cancelling, it's possible that + * we may receive some data in these URBs that we don't want to lose. + * examples: + * 1. while the kernel is cancelling all the packets that make up an + * URB, a few of them might complete. so we get back a successful + * cancellation *and* some data. + * 2. we receive a short URB which marks the early completion condition, + * so we start cancelling the remaining URBs. however, we're too + * slow and another URB completes (or at least completes partially). + * (this can't happen since we always use BULK_CONTINUATION.) + * + * When this happens, our objectives are not to lose any "surplus" data, + * and also to stick it at the end of the previously-received data + * (closing any holes), so that libusbx reports the total amount of + * transferred data and presents it in a contiguous chunk. + */ + if (urb->actual_length > 0) { + unsigned char *target = transfer->buffer + itransfer->transferred; + usbi_dbg("received %d bytes of surplus data", urb->actual_length); + if (urb->buffer != target) { + usbi_dbg("moving surplus data from offset %d to offset %d", + (unsigned char *) urb->buffer - transfer->buffer, + target - transfer->buffer); + memmove(target, urb->buffer, urb->actual_length); + } + itransfer->transferred += urb->actual_length; + } + + if (tpriv->num_retired == tpriv->num_urbs) { + usbi_dbg("abnormal reap: last URB handled, reporting"); + if (tpriv->reap_action != COMPLETED_EARLY && + tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + goto completed; + } + goto out_unlock; + } + + itransfer->transferred += urb->actual_length; + + /* Many of these errors can occur on *any* urb of a multi-urb + * transfer. When they do, we tear down the rest of the transfer. + */ + switch (urb->status) { + case 0: + break; + case -EREMOTEIO: /* short transfer */ + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + tpriv->reap_status = LIBUSB_TRANSFER_NO_DEVICE; + goto cancel_remaining; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_STALL; + goto cancel_remaining; + case -EOVERFLOW: + /* overflow can only ever occur in the last urb */ + usbi_dbg("overflow, actual_length=%d", urb->actual_length); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_OVERFLOW; + goto completed; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low level error %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + } + + /* if we're the last urb or we got less data than requested then we're + * done */ + if (urb_idx == tpriv->num_urbs - 1) { + usbi_dbg("last URB in transfer --> complete!"); + goto completed; + } else if (urb->actual_length < urb->buffer_length) { + usbi_dbg("short transfer %d/%d --> complete!", + urb->actual_length, urb->buffer_length); + if (tpriv->reap_action == NORMAL) + tpriv->reap_action = COMPLETED_EARLY; + } else + goto out_unlock; + +cancel_remaining: + if (ERROR == tpriv->reap_action && LIBUSB_TRANSFER_COMPLETED == tpriv->reap_status) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + + if (tpriv->num_retired == tpriv->num_urbs) /* nothing to cancel */ + goto completed; + + /* cancel remaining urbs and wait for their completion before + * reporting results */ + discard_urbs(itransfer, urb_idx + 1, tpriv->num_urbs); + +out_unlock: + usbi_mutex_unlock(&itransfer->lock); + return 0; + +completed: + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return CANCELLED == tpriv->reap_action ? + usbi_handle_transfer_cancellation(itransfer) : + usbi_handle_transfer_completion(itransfer, tpriv->reap_status); +} + +static int handle_iso_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int num_urbs = tpriv->num_urbs; + int urb_idx = 0; + int i; + enum libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; + + usbi_mutex_lock(&itransfer->lock); + for (i = 0; i < num_urbs; i++) { + if (urb == tpriv->iso_urbs[i]) { + urb_idx = i + 1; + break; + } + } + if (urb_idx == 0) { + usbi_err(TRANSFER_CTX(transfer), "could not locate urb!"); + usbi_mutex_unlock(&itransfer->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("handling completion status %d of iso urb %d/%d", urb->status, + urb_idx, num_urbs); + + /* copy isochronous results back in */ + + for (i = 0; i < urb->number_of_packets; i++) { + struct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i]; + struct libusb_iso_packet_descriptor *lib_desc = + &transfer->iso_packet_desc[tpriv->iso_packet_offset++]; + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; + switch (urb_desc->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + lib_desc->status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + lib_desc->status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("overflow error"); + lib_desc->status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + case -EXDEV: + usbi_dbg("low-level USB error %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + } + lib_desc->actual_length = urb_desc->actual_length; + } + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { /* cancelled or submit_fail */ + usbi_dbg("CANCEL: urb status %d", urb->status); + + if (tpriv->num_retired == num_urbs) { + usbi_dbg("CANCEL: last URB handled, reporting"); + free_iso_urbs(tpriv); + if (tpriv->reap_action == CANCELLED) { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } else { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, + LIBUSB_TRANSFER_ERROR); + } + } + goto out; + } + + switch (urb->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + /* if we're the last urb then we're done */ + if (urb_idx == num_urbs) { + usbi_dbg("last URB in transfer --> complete!"); + free_iso_urbs(tpriv); + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); + } + +out: + usbi_mutex_unlock(&itransfer->lock); + return 0; +} + +static int handle_control_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int status; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d", urb->status); + + itransfer->transferred += urb->actual_length; + + if (tpriv->reap_action == CANCELLED) { + if (urb->status != 0 && urb->status != -ENOENT) + usbi_warn(ITRANSFER_CTX(itransfer), + "cancel: unrecognised urb status %d", urb->status); + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } + + switch (urb->status) { + case 0: + status = LIBUSB_TRANSFER_COMPLETED; + break; + case -ENOENT: /* cancelled */ + status = LIBUSB_TRANSFER_CANCELLED; + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("unsupported control request"); + status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("control overflow error"); + status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low-level bus error occurred"); + status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); +} + +static int reap_for_handle(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + int r; + struct usbfs_urb *urb; + struct usbi_transfer *itransfer; + struct libusb_transfer *transfer; + + r = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb); + if (r == -1 && errno == EAGAIN) + return 1; + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "reap failed error %d errno=%d", + r, errno); + return LIBUSB_ERROR_IO; + } + + itransfer = urb->usercontext; + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_dbg("urb type=%d status=%d transferred=%d", urb->type, urb->status, + urb->actual_length); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return handle_iso_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return handle_bulk_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_CONTROL: + return handle_control_completion(itransfer, urb); + default: + usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", + transfer->type); + return LIBUSB_ERROR_OTHER; + } +} + +static int op_handle_events(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + int r; + unsigned int i = 0; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + struct pollfd *pollfd = &fds[i]; + struct libusb_device_handle *handle; + struct linux_device_handle_priv *hpriv = NULL; + + if (!pollfd->revents) + continue; + + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + hpriv = _device_handle_priv(handle); + if (hpriv->fd == pollfd->fd) + break; + } + + if (pollfd->revents & POLLERR) { + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); + usbi_handle_disconnect(handle); + continue; + } + + do { + r = reap_for_handle(handle); + } while (r == 0); + if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) + continue; + else if (r < 0) + goto out; + } + + r = 0; +out: + usbi_mutex_unlock(&ctx->open_devs_lock); + return r; +} + +static int op_clock_gettime(int clk_id, struct timespec *tp) +{ + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + return clock_gettime(monotonic_clkid, tp); + case USBI_CLOCK_REALTIME: + return clock_gettime(CLOCK_REALTIME, tp); + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +#ifdef USBI_TIMERFD_AVAILABLE +static clockid_t op_get_timerfd_clockid(void) +{ + return monotonic_clkid; + +} +#endif + +const struct usbi_os_backend linux_usbfs_backend = { + .name = "Linux usbfs", + .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER, + .init = op_init, + .exit = op_exit, + .get_device_list = NULL, + .hotplug_poll = op_hotplug_poll, + .get_device_descriptor = op_get_device_descriptor, + .get_active_config_descriptor = op_get_active_config_descriptor, + .get_config_descriptor = op_get_config_descriptor, + .get_config_descriptor_by_value = op_get_config_descriptor_by_value, + + .open = op_open, + .close = op_close, + .get_configuration = op_get_configuration, + .set_configuration = op_set_configuration, + .claim_interface = op_claim_interface, + .release_interface = op_release_interface, + + .set_interface_altsetting = op_set_interface, + .clear_halt = op_clear_halt, + .reset_device = op_reset_device, + + .kernel_driver_active = op_kernel_driver_active, + .detach_kernel_driver = op_detach_kernel_driver, + .attach_kernel_driver = op_attach_kernel_driver, + + .destroy_device = op_destroy_device, + + .submit_transfer = op_submit_transfer, + .cancel_transfer = op_cancel_transfer, + .clear_transfer_priv = op_clear_transfer_priv, + + .handle_events = op_handle_events, + + .clock_gettime = op_clock_gettime, + +#ifdef USBI_TIMERFD_AVAILABLE + .get_timerfd_clockid = op_get_timerfd_clockid, +#endif + + .device_priv_size = sizeof(struct linux_device_priv), + .device_handle_priv_size = sizeof(struct linux_device_handle_priv), + .transfer_priv_size = sizeof(struct linux_transfer_priv), + .add_iso_packet_size = 0, +}; diff --git a/Externals/libusbx/libusb/os/linux_usbfs.h b/Externals/libusbx/libusb/os/linux_usbfs.h new file mode 100644 index 0000000000..499bab78e8 --- /dev/null +++ b/Externals/libusbx/libusb/os/linux_usbfs.h @@ -0,0 +1,181 @@ +/* + * usbfs header structures + * Copyright © 2007 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_USBFS_H +#define LIBUSB_USBFS_H + +#include + +#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices" + +struct usbfs_ctrltransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + + uint32_t timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_bulktransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ + unsigned int ep; + unsigned int len; + unsigned int timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_setinterface { + /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ + unsigned int interface; + unsigned int altsetting; +}; + +#define USBFS_MAXDRIVERNAME 255 + +struct usbfs_getdriver { + unsigned int interface; + char driver[USBFS_MAXDRIVERNAME + 1]; +}; + +#define USBFS_URB_SHORT_NOT_OK 0x01 +#define USBFS_URB_ISO_ASAP 0x02 +#define USBFS_URB_BULK_CONTINUATION 0x04 +#define USBFS_URB_QUEUE_BULK 0x10 +#define USBFS_URB_ZERO_PACKET 0x40 + +enum usbfs_urb_type { + USBFS_URB_TYPE_ISO = 0, + USBFS_URB_TYPE_INTERRUPT = 1, + USBFS_URB_TYPE_CONTROL = 2, + USBFS_URB_TYPE_BULK = 3, +}; + +struct usbfs_iso_packet_desc { + unsigned int length; + unsigned int actual_length; + unsigned int status; +}; + +#define MAX_ISO_BUFFER_LENGTH 32768 +#define MAX_BULK_BUFFER_LENGTH 16384 +#define MAX_CTRL_BUFFER_LENGTH 4096 + +struct usbfs_urb { + unsigned char type; + unsigned char endpoint; + int status; + unsigned int flags; + void *buffer; + int buffer_length; + int actual_length; + int start_frame; + int number_of_packets; + int error_count; + unsigned int signr; + void *usercontext; + struct usbfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbfs_connectinfo { + unsigned int devnum; + unsigned char slow; +}; + +struct usbfs_ioctl { + int ifno; /* interface 0..N ; negative numbers reserved */ + int ioctl_code; /* MUST encode size + direction of data so the + * macros in give correct values */ + void *data; /* param buffer (in, or out) */ +}; + +struct usbfs_hub_portinfo { + unsigned char numports; + unsigned char port[127]; /* port to device num mapping */ +}; + +#define USBFS_CAP_ZERO_PACKET 0x01 +#define USBFS_CAP_BULK_CONTINUATION 0x02 +#define USBFS_CAP_NO_PACKET_SIZE_LIM 0x04 +#define USBFS_CAP_BULK_SCATTER_GATHER 0x08 + +#define USBFS_DISCONNECT_CLAIM_IF_DRIVER 0x01 +#define USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02 + +struct usbfs_disconnect_claim { + unsigned int interface; + unsigned int flags; + char driver[USBFS_MAXDRIVERNAME + 1]; +}; + +#define IOCTL_USBFS_CONTROL _IOWR('U', 0, struct usbfs_ctrltransfer) +#define IOCTL_USBFS_BULK _IOWR('U', 2, struct usbfs_bulktransfer) +#define IOCTL_USBFS_RESETEP _IOR('U', 3, unsigned int) +#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface) +#define IOCTL_USBFS_SETCONFIG _IOR('U', 5, unsigned int) +#define IOCTL_USBFS_GETDRIVER _IOW('U', 8, struct usbfs_getdriver) +#define IOCTL_USBFS_SUBMITURB _IOR('U', 10, struct usbfs_urb) +#define IOCTL_USBFS_DISCARDURB _IO('U', 11) +#define IOCTL_USBFS_REAPURB _IOW('U', 12, void *) +#define IOCTL_USBFS_REAPURBNDELAY _IOW('U', 13, void *) +#define IOCTL_USBFS_CLAIMINTF _IOR('U', 15, unsigned int) +#define IOCTL_USBFS_RELEASEINTF _IOR('U', 16, unsigned int) +#define IOCTL_USBFS_CONNECTINFO _IOW('U', 17, struct usbfs_connectinfo) +#define IOCTL_USBFS_IOCTL _IOWR('U', 18, struct usbfs_ioctl) +#define IOCTL_USBFS_HUB_PORTINFO _IOR('U', 19, struct usbfs_hub_portinfo) +#define IOCTL_USBFS_RESET _IO('U', 20) +#define IOCTL_USBFS_CLEAR_HALT _IOR('U', 21, unsigned int) +#define IOCTL_USBFS_DISCONNECT _IO('U', 22) +#define IOCTL_USBFS_CONNECT _IO('U', 23) +#define IOCTL_USBFS_CLAIM_PORT _IOR('U', 24, unsigned int) +#define IOCTL_USBFS_RELEASE_PORT _IOR('U', 25, unsigned int) +#define IOCTL_USBFS_GET_CAPABILITIES _IOR('U', 26, __u32) +#define IOCTL_USBFS_DISCONNECT_CLAIM _IOR('U', 27, struct usbfs_disconnect_claim) + +extern usbi_mutex_static_t linux_hotplug_lock; + +#if defined(HAVE_LIBUDEV) +int linux_udev_start_event_monitor(void); +int linux_udev_stop_event_monitor(void); +int linux_udev_scan_devices(struct libusb_context *ctx); +void linux_udev_hotplug_poll(void); +#else +int linux_netlink_start_event_monitor(void); +int linux_netlink_stop_event_monitor(void); +void linux_netlink_hotplug_poll(void); +#endif + +void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name); +void linux_hotplug_disconnected(uint8_t busnum, uint8_t devaddr, const char *sys_name); + +int linux_get_device_address (struct libusb_context *ctx, int detached, + uint8_t *busnum, uint8_t *devaddr, const char *dev_node, + const char *sys_name); +int linux_enumerate_device(struct libusb_context *ctx, + uint8_t busnum, uint8_t devaddr, const char *sysfs_dir); + +#endif diff --git a/Externals/libusbx/libusb/os/openbsd_usb.c b/Externals/libusbx/libusb/os/openbsd_usb.c new file mode 100644 index 0000000000..f4fd4543a6 --- /dev/null +++ b/Externals/libusbx/libusb/os/openbsd_usb.c @@ -0,0 +1,734 @@ +/* + * Copyright © 2011 Martin Pieuchot + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "libusb.h" +#include "libusbi.h" + +struct device_priv { + char devnode[16]; + int fd; + + unsigned char *cdesc; /* active config descriptor */ + usb_device_descriptor_t ddesc; /* usb device descriptor */ +}; + +struct handle_priv { + int pipe[2]; /* for event notification */ + int endpoints[USB_MAX_ENDPOINTS]; +}; + +/* + * Backend functions + */ +static int obsd_get_device_list(struct libusb_context *, + struct discovered_devs **); +static int obsd_open(struct libusb_device_handle *); +static void obsd_close(struct libusb_device_handle *); + +static int obsd_get_device_descriptor(struct libusb_device *, unsigned char *, + int *); +static int obsd_get_active_config_descriptor(struct libusb_device *, + unsigned char *, size_t, int *); +static int obsd_get_config_descriptor(struct libusb_device *, uint8_t, + unsigned char *, size_t, int *); + +static int obsd_get_configuration(struct libusb_device_handle *, int *); +static int obsd_set_configuration(struct libusb_device_handle *, int); + +static int obsd_claim_interface(struct libusb_device_handle *, int); +static int obsd_release_interface(struct libusb_device_handle *, int); + +static int obsd_set_interface_altsetting(struct libusb_device_handle *, int, + int); +static int obsd_clear_halt(struct libusb_device_handle *, unsigned char); +static int obsd_reset_device(struct libusb_device_handle *); +static void obsd_destroy_device(struct libusb_device *); + +static int obsd_submit_transfer(struct usbi_transfer *); +static int obsd_cancel_transfer(struct usbi_transfer *); +static void obsd_clear_transfer_priv(struct usbi_transfer *); +static int obsd_handle_events(struct libusb_context *ctx, struct pollfd *, + nfds_t, int); +static int obsd_clock_gettime(int, struct timespec *); + +/* + * Private functions + */ +static int _errno_to_libusb(int); +static int _cache_active_config_descriptor(struct libusb_device *, int); +static int _sync_control_transfer(struct usbi_transfer *); +static int _sync_gen_transfer(struct usbi_transfer *); +static int _access_endpoint(struct libusb_transfer *); + +const struct usbi_os_backend openbsd_backend = { + "Synchronous OpenBSD backend", + 0, + NULL, /* init() */ + NULL, /* exit() */ + obsd_get_device_list, + NULL, /* hotplug_poll */ + obsd_open, + obsd_close, + + obsd_get_device_descriptor, + obsd_get_active_config_descriptor, + obsd_get_config_descriptor, + NULL, /* get_config_descriptor_by_value() */ + + obsd_get_configuration, + obsd_set_configuration, + + obsd_claim_interface, + obsd_release_interface, + + obsd_set_interface_altsetting, + obsd_clear_halt, + obsd_reset_device, + + NULL, /* kernel_driver_active() */ + NULL, /* detach_kernel_driver() */ + NULL, /* attach_kernel_driver() */ + + obsd_destroy_device, + + obsd_submit_transfer, + obsd_cancel_transfer, + obsd_clear_transfer_priv, + + obsd_handle_events, + + obsd_clock_gettime, + sizeof(struct device_priv), + sizeof(struct handle_priv), + 0, /* transfer_priv_size */ + 0, /* add_iso_packet_size */ +}; + +int +obsd_get_device_list(struct libusb_context * ctx, + struct discovered_devs **discdevs) +{ + struct libusb_device *dev; + struct device_priv *dpriv; + struct usb_device_info di; + unsigned long session_id; + char devnode[16]; + int fd, err, i; + + usbi_dbg(""); + + /* Only ugen(4) is supported */ + for (i = 0; i < USB_MAX_DEVICES; i++) { + /* Control endpoint is always .00 */ + snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); + + if ((fd = open(devnode, O_RDONLY)) < 0) { + if (errno != ENOENT && errno != ENXIO) + usbi_err(ctx, "could not open %s", devnode); + continue; + } + + if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) + continue; + + session_id = (di.udi_bus << 8 | di.udi_addr); + dev = usbi_get_device_by_session_id(ctx, session_id); + + if (dev) { + dev = libusb_ref_device(dev); + } else { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) + return (LIBUSB_ERROR_NO_MEM); + + dev->bus_number = di.udi_bus; + dev->device_address = di.udi_addr; + dev->speed = di.udi_speed; + + dpriv = (struct device_priv *)dev->os_priv; + strlcpy(dpriv->devnode, devnode, sizeof(devnode)); + dpriv->fd = -1; + + if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { + err = errno; + goto error; + } + + dpriv->cdesc = NULL; + if (_cache_active_config_descriptor(dev, fd)) { + err = errno; + goto error; + } + + if ((err = usbi_sanitize_device(dev))) + goto error; + } + close(fd); + + if (discovered_devs_append(*discdevs, dev) == NULL) + return (LIBUSB_ERROR_NO_MEM); + + libusb_unref_device(dev); + } + + return (LIBUSB_SUCCESS); + +error: + close(fd); + libusb_unref_device(dev); + return _errno_to_libusb(err); +} + +int +obsd_open(struct libusb_device_handle *handle) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + dpriv->fd = open(dpriv->devnode, O_RDWR); + if (dpriv->fd < 0) { + dpriv->fd = open(dpriv->devnode, O_RDONLY); + if (dpriv->fd < 0) + return _errno_to_libusb(errno); + } + + usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); + + if (pipe(hpriv->pipe) < 0) + return _errno_to_libusb(errno); + + return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN); +} + +void +obsd_close(struct libusb_device_handle *handle) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("close: fd %d", dpriv->fd); + + close(dpriv->fd); + dpriv->fd = -1; + + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); + + close(hpriv->pipe[0]); + close(hpriv->pipe[1]); +} + +int +obsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, + int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return (LIBUSB_SUCCESS); +} + +int +obsd_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + usb_config_descriptor_t *ucd; + + ucd = (usb_config_descriptor_t *) dpriv->cdesc; + len = MIN(len, UGETW(ucd->wTotalLength)); + + usbi_dbg("len %d", len); + + memcpy(buf, dpriv->cdesc, len); + + *host_endian = 0; + + return len; +} + +int +obsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_full_desc ufd; + int fd, err; + + usbi_dbg("index %d, len %d", idx, len); + + /* A config descriptor may be requested before opening the device */ + if (dpriv->fd >= 0) { + fd = dpriv->fd; + } else { + fd = open(dpriv->devnode, O_RDONLY); + if (fd < 0) + return _errno_to_libusb(errno); + } + + ufd.ufd_config_index = idx; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { + err = errno; + if (dpriv->fd < 0) + close(fd); + return _errno_to_libusb(err); + } + + if (dpriv->fd < 0) + close(fd); + + *host_endian = 0; + + return len; +} + +int +obsd_get_configuration(struct libusb_device_handle *handle, int *config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg(""); + + if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("configuration %d", *config); + + return (LIBUSB_SUCCESS); +} + +int +obsd_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("configuration %d", config); + + if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) + return _errno_to_libusb(errno); + + return _cache_active_config_descriptor(handle->dev, dpriv->fd); +} + +int +obsd_claim_interface(struct libusb_device_handle *handle, int iface) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + int i; + + for (i = 0; i < USB_MAX_ENDPOINTS; i++) + hpriv->endpoints[i] = -1; + + return (LIBUSB_SUCCESS); +} + +int +obsd_release_interface(struct libusb_device_handle *handle, int iface) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + int i; + + for (i = 0; i < USB_MAX_ENDPOINTS; i++) + if (hpriv->endpoints[i] >= 0) + close(hpriv->endpoints[i]); + + return (LIBUSB_SUCCESS); +} + +int +obsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_alt_interface intf; + + usbi_dbg("iface %d, setting %d", iface, altsetting); + + memset(&intf, 0, sizeof(intf)); + + intf.uai_interface_index = iface; + intf.uai_alt_no = altsetting; + + if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_ctl_request req; + + usbi_dbg(""); + + req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; + req.ucr_request.bRequest = UR_CLEAR_FEATURE; + USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); + USETW(req.ucr_request.wIndex, endpoint); + USETW(req.ucr_request.wLength, 0); + + if (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_reset_device(struct libusb_device_handle *handle) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +obsd_destroy_device(struct libusb_device *dev) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + free(dpriv->cdesc); +} + +int +obsd_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct handle_priv *hpriv; + int err = 0; + + usbi_dbg(""); + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + err = _sync_control_transfer(itransfer); + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + if (IS_XFEROUT(transfer)) { + /* Isochronous write is not supported */ + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + err = _sync_gen_transfer(itransfer); + break; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + err = _sync_gen_transfer(itransfer); + break; + } + + if (err) + return (err); + + if (write(hpriv->pipe[1], &itransfer, sizeof(itransfer)) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_cancel_transfer(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +obsd_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + /* Nothing to do */ +} + +int +obsd_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds, + int num_ready) +{ + struct libusb_device_handle *handle; + struct handle_priv *hpriv = NULL; + struct usbi_transfer *itransfer; + struct pollfd *pollfd; + int i, err = 0; + + usbi_dbg(""); + + pthread_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + pollfd = &fds[i]; + + if (!pollfd->revents) + continue; + + hpriv = NULL; + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, + struct libusb_device_handle) { + hpriv = (struct handle_priv *)handle->os_priv; + + if (hpriv->pipe[0] == pollfd->fd) + break; + + hpriv = NULL; + } + + if (NULL == hpriv) { + usbi_dbg("fd %d is not an event pipe!", pollfd->fd); + err = ENOENT; + break; + } + + if (pollfd->revents & POLLERR) { + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); + usbi_handle_disconnect(handle); + continue; + } + + if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) { + err = errno; + break; + } + + if ((err = usbi_handle_transfer_completion(itransfer, + LIBUSB_TRANSFER_COMPLETED))) + break; + } + pthread_mutex_unlock(&ctx->open_devs_lock); + + if (err) + return _errno_to_libusb(err); + + return (LIBUSB_SUCCESS); +} + +int +obsd_clock_gettime(int clkid, struct timespec *tp) +{ + usbi_dbg("clock %d", clkid); + + if (clkid == USBI_CLOCK_REALTIME) + return clock_gettime(CLOCK_REALTIME, tp); + + if (clkid == USBI_CLOCK_MONOTONIC) + return clock_gettime(CLOCK_MONOTONIC, tp); + + return (LIBUSB_ERROR_INVALID_PARAM); +} + +int +_errno_to_libusb(int err) +{ + switch (err) { + case EIO: + return (LIBUSB_ERROR_IO); + case EACCES: + return (LIBUSB_ERROR_ACCESS); + case ENOENT: + return (LIBUSB_ERROR_NO_DEVICE); + case ENOMEM: + return (LIBUSB_ERROR_NO_MEM); + } + + usbi_dbg("error: %s", strerror(err)); + + return (LIBUSB_ERROR_OTHER); +} + +int +_cache_active_config_descriptor(struct libusb_device *dev, int fd) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_config_desc ucd; + struct usb_full_desc ufd; + unsigned char* buf; + int len; + + usbi_dbg("fd %d", fd); + + ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; + + if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); + + len = UGETW(ucd.ucd_desc.wTotalLength); + buf = malloc(len); + if (buf == NULL) + return (LIBUSB_ERROR_NO_MEM); + + ufd.ufd_config_index = ucd.ucd_config_index; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { + free(buf); + return _errno_to_libusb(errno); + } + + if (dpriv->cdesc) + free(dpriv->cdesc); + dpriv->cdesc = buf; + + return (0); +} + +int +_sync_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct libusb_control_setup *setup; + struct device_priv *dpriv; + struct usb_ctl_request req; + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + setup = (struct libusb_control_setup *)transfer->buffer; + + usbi_dbg("type %d request %d value %d index %d length %d timeout %d", + setup->bmRequestType, setup->bRequest, + libusb_le16_to_cpu(setup->wValue), + libusb_le16_to_cpu(setup->wIndex), + libusb_le16_to_cpu(setup->wLength), transfer->timeout); + + req.ucr_request.bmRequestType = setup->bmRequestType; + req.ucr_request.bRequest = setup->bRequest; + /* Don't use USETW, libusbx already deals with the endianness */ + (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; + (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; + (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; + req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + req.ucr_flags = USBD_SHORT_XFER_OK; + + if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) + return _errno_to_libusb(errno); + + itransfer->transferred = req.ucr_actlen; + + usbi_dbg("transferred %d", itransfer->transferred); + + return (0); +} + +int +_access_endpoint(struct libusb_transfer *transfer) +{ + struct handle_priv *hpriv; + struct device_priv *dpriv; + char *s, devnode[16]; + int fd, endpt; + mode_t mode; + + hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + + endpt = UE_GET_ADDR(transfer->endpoint); + mode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY; + + usbi_dbg("endpoint %d mode %d", endpt, mode); + + if (hpriv->endpoints[endpt] < 0) { + /* Pick the right node given the control one */ + strlcpy(devnode, dpriv->devnode, sizeof(devnode)); + s = strchr(devnode, '.'); + snprintf(s, 4, ".%02d", endpt); + + /* We may need to read/write to the same endpoint later. */ + if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) + if ((fd = open(devnode, mode)) < 0) + return (-1); + + hpriv->endpoints[endpt] = fd; + } + + return (hpriv->endpoints[endpt]); +} + +int +_sync_gen_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + int fd, nr = 1; + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + /* + * Bulk, Interrupt or Isochronous transfer depends on the + * endpoint and thus the node to open. + */ + if ((fd = _access_endpoint(transfer)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if (IS_XFERIN(transfer)) { + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) + return _errno_to_libusb(errno); + + nr = read(fd, transfer->buffer, transfer->length); + } else { + nr = write(fd, transfer->buffer, transfer->length); + } + + if (nr < 0) + return _errno_to_libusb(errno); + + itransfer->transferred = nr; + + return (0); +} diff --git a/Externals/libusbx/libusb/os/poll_posix.c b/Externals/libusbx/libusb/os/poll_posix.c new file mode 100644 index 0000000000..eeaf5dce49 --- /dev/null +++ b/Externals/libusbx/libusb/os/poll_posix.c @@ -0,0 +1,51 @@ +/* + * poll_posix: poll compatibility wrapper for POSIX systems + * Copyright © 2013 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include + +#include "libusbi.h" + +int usbi_pipe(int pipefd[2]) +{ + int ret = pipe(pipefd); + if (ret != 0) { + return ret; + } + ret = fcntl(pipefd[1], F_GETFL); + if (ret == -1) { + usbi_dbg("Failed to get pipe fd flags: %d", errno); + goto err_close_pipe; + } + ret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK); + if (ret != 0) { + usbi_dbg("Failed to set non-blocking on new pipe: %d", errno); + goto err_close_pipe; + } + + return 0; + +err_close_pipe: + usbi_close(pipefd[0]); + usbi_close(pipefd[1]); + return ret; +} diff --git a/Externals/libusbx/libusb/os/poll_posix.h b/Externals/libusbx/libusb/os/poll_posix.h new file mode 100644 index 0000000000..5b4b2c905e --- /dev/null +++ b/Externals/libusbx/libusb/os/poll_posix.h @@ -0,0 +1,11 @@ +#ifndef LIBUSB_POLL_POSIX_H +#define LIBUSB_POLL_POSIX_H + +#define usbi_write write +#define usbi_read read +#define usbi_close close +#define usbi_poll poll + +int usbi_pipe(int pipefd[2]); + +#endif /* LIBUSB_POLL_POSIX_H */ diff --git a/Externals/libusbx/libusb/os/poll_windows.c b/Externals/libusbx/libusb/os/poll_windows.c new file mode 100644 index 0000000000..7ed19ba324 --- /dev/null +++ b/Externals/libusbx/libusb/os/poll_windows.c @@ -0,0 +1,726 @@ +/* + * poll_windows: poll compatibility wrapper for Windows + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + * poll() and pipe() Windows compatibility layer for libusbx 1.0 + * + * The way this layer works is by using OVERLAPPED with async I/O transfers, as + * OVERLAPPED have an associated event which is flagged for I/O completion. + * + * For USB pollable async I/O, you would typically: + * - obtain a Windows HANDLE to a file or device that has been opened in + * OVERLAPPED mode + * - call usbi_create_fd with this handle to obtain a custom fd. + * Note that if you need simultaneous R/W access, you need to call create_fd + * twice, once in RW_READ and once in RW_WRITE mode to obtain 2 separate + * pollable fds + * - leave the core functions call the poll routine and flag POLLIN/POLLOUT + * + * The pipe pollable synchronous I/O works using the overlapped event associated + * with a fake pipe. The read/write functions are only meant to be used in that + * context. + */ +#include +#include +#include + +#include "libusbi.h" + +// Uncomment to debug the polling layer +//#define DEBUG_POLL_WINDOWS +#if defined(DEBUG_POLL_WINDOWS) +#define poll_dbg usbi_dbg +#else +// MSVC++ < 2005 cannot use a variadic argument and non MSVC +// compilers produce warnings if parenthesis are ommitted. +#if defined(_MSC_VER) && (_MSC_VER < 1400) +#define poll_dbg +#else +#define poll_dbg(...) +#endif +#endif + +#if defined(_PREFAST_) +#pragma warning(disable:28719) +#endif + +#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0) + +// public fd data +const struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, NULL, NULL, RW_NONE}; +struct winfd poll_fd[MAX_FDS]; +// internal fd data +struct { + CRITICAL_SECTION mutex; // lock for fds + // Additional variables for XP CancelIoEx partial emulation + HANDLE original_handle; + DWORD thread_id; +} _poll_fd[MAX_FDS]; + +// globals +BOOLEAN is_polling_set = FALSE; +LONG pipe_number = 0; +static volatile LONG compat_spinlock = 0; + +#if !defined(_WIN32_WCE) +// CancelIoEx, available on Vista and later only, provides the ability to cancel +// a single transfer (OVERLAPPED) when used. As it may not be part of any of the +// platform headers, we hook into the Kernel32 system DLL directly to seek it. +static BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; +#define Use_Duplicate_Handles (pCancelIoEx == NULL) + +static inline void setup_cancel_io(void) +{ + HMODULE hKernel32 = GetModuleHandleA("KERNEL32"); + if (hKernel32 != NULL) { + pCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED)) + GetProcAddress(hKernel32, "CancelIoEx"); + } + usbi_dbg("Will use CancelIo%s for I/O cancellation", + Use_Duplicate_Handles?"":"Ex"); +} + +static inline BOOL cancel_io(int _index) +{ + if ((_index < 0) || (_index >= MAX_FDS)) { + return FALSE; + } + + if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) + || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { + return TRUE; + } + if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { + // Cancel outstanding transfer via the specific callback + (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); + return TRUE; + } + if (pCancelIoEx != NULL) { + return (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped); + } + if (_poll_fd[_index].thread_id == GetCurrentThreadId()) { + return CancelIo(poll_fd[_index].handle); + } + usbi_warn(NULL, "Unable to cancel I/O that was started from another thread"); + return FALSE; +} +#else +#define Use_Duplicate_Handles FALSE + +static __inline void setup_cancel_io() +{ + // No setup needed on WinCE +} + +static __inline BOOL cancel_io(int _index) +{ + if ((_index < 0) || (_index >= MAX_FDS)) { + return FALSE; + } + if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) + || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { + return TRUE; + } + if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { + // Cancel outstanding transfer via the specific callback + (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); + } + return TRUE; +} +#endif + +// Init +void init_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (!is_polling_set) { + setup_cancel_io(); + for (i=0; ihEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(overlapped->hEvent == NULL) { + free (overlapped); + return NULL; + } + return overlapped; +} + +static void free_overlapped(OVERLAPPED *overlapped) +{ + if (overlapped == NULL) + return; + + if ( (overlapped->hEvent != 0) + && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) { + CloseHandle(overlapped->hEvent); + } + free(overlapped); +} + +void exit_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (is_polling_set) { + is_polling_set = FALSE; + + for (i=0; iInternal = STATUS_PENDING; + overlapped->InternalHigh = 0; + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + + // Use index as the unique fd number + poll_fd[i].fd = i; + // Read end of the "pipe" + filedes[0] = poll_fd[i].fd; + // We can use the same handle for both ends + filedes[1] = filedes[0]; + + poll_fd[i].handle = DUMMY_HANDLE; + poll_fd[i].overlapped = overlapped; + // There's no polling on the write end, so we just use READ for our needs + poll_fd[i].rw = RW_READ; + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + LeaveCriticalSection(&_poll_fd[i].mutex); + return 0; + } + } + free_overlapped(overlapped); + return -1; +} + +/* + * Create both an fd and an OVERLAPPED from an open Windows handle, so that + * it can be used with our polling function + * The handle MUST support overlapped transfers (usually requires CreateFile + * with FILE_FLAG_OVERLAPPED) + * Return a pollable file descriptor struct, or INVALID_WINFD on error + * + * Note that the fd returned by this function is a per-transfer fd, rather + * than a per-session fd and cannot be used for anything else but our + * custom functions (the fd itself points to the NUL: device) + * if you plan to do R/W on the same handle, you MUST create 2 fds: one for + * read and one for write. Using a single R/W fd is unsupported and will + * produce unexpected results + */ +struct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer *itransfer, cancel_transfer *cancel_fn) +{ + int i; + struct winfd wfd = INVALID_WINFD; + OVERLAPPED* overlapped = NULL; + + CHECK_INIT_POLLING; + + if ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) { + return INVALID_WINFD; + } + + wfd.itransfer = itransfer; + wfd.cancel_fn = cancel_fn; + + if ((access_mode != RW_READ) && (access_mode != RW_WRITE)) { + usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported.\n" + "If you want to poll for R/W simultaneously, create multiple fds from the same handle."); + return INVALID_WINFD; + } + if (access_mode == RW_READ) { + wfd.rw = RW_READ; + } else { + wfd.rw = RW_WRITE; + } + + overlapped = create_overlapped(); + if(overlapped == NULL) { + return INVALID_WINFD; + } + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + // Use index as the unique fd number + wfd.fd = i; + // Attempt to emulate some of the CancelIoEx behaviour on platforms + // that don't have it + if (Use_Duplicate_Handles) { + _poll_fd[i].thread_id = GetCurrentThreadId(); + if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), + &wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { + usbi_dbg("could not duplicate handle for CancelIo - using original one"); + wfd.handle = handle; + // Make sure we won't close the original handle on fd deletion then + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + } else { + _poll_fd[i].original_handle = handle; + } + } else { + wfd.handle = handle; + } + wfd.overlapped = overlapped; + memcpy(&poll_fd[i], &wfd, sizeof(struct winfd)); + LeaveCriticalSection(&_poll_fd[i].mutex); + return wfd; + } + } + free_overlapped(overlapped); + return INVALID_WINFD; +} + +static void _free_index(int _index) +{ + // Cancel any async IO (Don't care about the validity of our handles for this) + cancel_io(_index); + // close the duplicate handle (if we have an actual duplicate) + if (Use_Duplicate_Handles) { + if (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) { + CloseHandle(poll_fd[_index].handle); + } + _poll_fd[_index].original_handle = INVALID_HANDLE_VALUE; + _poll_fd[_index].thread_id = 0; + } + free_overlapped(poll_fd[_index].overlapped); + poll_fd[_index] = INVALID_WINFD; +} + +/* + * Release a pollable file descriptor. + * + * Note that the associated Windows handle is not closed by this call + */ +void usbi_free_fd(struct winfd *wfd) +{ + int _index; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(wfd->fd); + if (_index < 0) { + return; + } + _free_index(_index); + *wfd = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[_index].mutex); +} + +/* + * The functions below perform various conversions between fd, handle and OVERLAPPED + */ +struct winfd fd_to_winfd(int fd) +{ + int i; + struct winfd wfd; + + CHECK_INIT_POLLING; + + if (fd <= 0) + return INVALID_WINFD; + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + usbi_warn(NULL, "invalid fd"); + triggered = -1; + goto poll_exit; + } + + // IN or OUT must match our fd direction + if ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLIN on fd without READ access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + if ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLOUT on fd without WRITE access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + // The following macro only works if overlapped I/O was reported pending + if ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped)) + || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) { + poll_dbg(" completed"); + // checks above should ensure this works: + fds[i].revents = fds[i].events; + triggered++; + } else { + handles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent; + handle_to_index[nb_handles_to_wait_on] = i; + nb_handles_to_wait_on++; + } + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + + // If nothing was triggered, wait on all fds that require it + if ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) { + if (timeout < 0) { + poll_dbg("starting infinite wait for %d handles...", (int)nb_handles_to_wait_on); + } else { + poll_dbg("starting %d ms wait for %d handles...", timeout, (int)nb_handles_to_wait_on); + } + ret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on, + FALSE, (timeout<0)?INFINITE:(DWORD)timeout); + object_index = ret-WAIT_OBJECT_0; + if ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) { + poll_dbg(" completed after wait"); + i = handle_to_index[object_index]; + _index = _fd_to_index_and_lock(fds[i].fd); + fds[i].revents = fds[i].events; + triggered++; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + } else if (ret == WAIT_TIMEOUT) { + poll_dbg(" timed out"); + triggered = 0; // 0 = timeout + } else { + errno = EIO; + triggered = -1; // error + } + } + +poll_exit: + if (handles_to_wait_on != NULL) { + free(handles_to_wait_on); + } + if (handle_to_index != NULL) { + free(handle_to_index); + } + return triggered; +} + +/* + * close a fake pipe fd + */ +int usbi_close(int fd) +{ + int _index; + int r = -1; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + } else { + free_overlapped(poll_fd[_index].overlapped); + poll_fd[_index] = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return r; +} + +/* + * synchronous write for fake "pipe" signaling + */ +ssize_t usbi_write(int fd, const void *buf, size_t count) +{ + int _index; + UNUSED(buf); + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) { + errno = EBADF; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return -1; + } + + poll_dbg("set pipe event (fd = %d, thread = %08X)", _index, GetCurrentThreadId()); + SetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_WAIT_0; + // If two threads write on the pipe at the same time, we need to + // process two separate reads => use the overlapped as a counter + poll_fd[_index].overlapped->InternalHigh++; + + LeaveCriticalSection(&_poll_fd[_index].mutex); + return sizeof(unsigned char); +} + +/* + * synchronous read for fake "pipe" signaling + */ +ssize_t usbi_read(int fd, void *buf, size_t count) +{ + int _index; + ssize_t r = -1; + UNUSED(buf); + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + return -1; + } + + if (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) { + usbi_warn(NULL, "waiting for event failed: %d", (int)GetLastError()); + errno = EIO; + goto out; + } + + poll_dbg("clr pipe event (fd = %d, thread = %08X)", _index, GetCurrentThreadId()); + poll_fd[_index].overlapped->InternalHigh--; + // Don't reset unless we don't have any more events to process + if (poll_fd[_index].overlapped->InternalHigh <= 0) { + ResetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_PENDING; + } + + r = sizeof(unsigned char); + +out: + LeaveCriticalSection(&_poll_fd[_index].mutex); + return r; +} diff --git a/Externals/libusbx/libusb/os/poll_windows.h b/Externals/libusbx/libusb/os/poll_windows.h new file mode 100644 index 0000000000..deed206444 --- /dev/null +++ b/Externals/libusbx/libusb/os/poll_windows.h @@ -0,0 +1,125 @@ +/* + * Windows compat: POSIX compatibility wrapper + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#pragma once + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#endif + +// Handle synchronous completion through the overlapped structure +#if !defined(STATUS_REPARSE) // reuse the REPARSE status code +#define STATUS_REPARSE ((LONG)0x00000104L) +#endif +#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE +#if defined(_WIN32_WCE) +// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it +#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) +#endif +#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) + +#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) + +enum windows_version { + WINDOWS_UNSUPPORTED, + WINDOWS_CE, + WINDOWS_XP, + WINDOWS_2003, // also includes XP 64 + WINDOWS_VISTA_AND_LATER, +}; +extern enum windows_version windows_version; + +#define MAX_FDS 256 + +#define POLLIN 0x0001 /* There is data to read */ +#define POLLPRI 0x0002 /* There is urgent data to read */ +#define POLLOUT 0x0004 /* Writing now will not block */ +#define POLLERR 0x0008 /* Error condition */ +#define POLLHUP 0x0010 /* Hung up */ +#define POLLNVAL 0x0020 /* Invalid request: fd not open */ + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; + +// access modes +enum rw_type { + RW_NONE, + RW_READ, + RW_WRITE, +}; + +// fd struct that can be used for polling on Windows +typedef int cancel_transfer(struct usbi_transfer *itransfer); + +struct winfd { + int fd; // what's exposed to libusb core + HANDLE handle; // what we need to attach overlapped to the I/O op, so we can poll it + OVERLAPPED* overlapped; // what will report our I/O status + struct usbi_transfer *itransfer; // Associated transfer, or NULL if completed + cancel_transfer *cancel_fn; // Function pointer to cancel transfer API + enum rw_type rw; // I/O transfer direction: read *XOR* write (NOT BOTH) +}; +extern const struct winfd INVALID_WINFD; + +int usbi_pipe(int pipefd[2]); +int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); +ssize_t usbi_write(int fd, const void *buf, size_t count); +ssize_t usbi_read(int fd, void *buf, size_t count); +int usbi_close(int fd); + +void init_polling(void); +void exit_polling(void); +struct winfd usbi_create_fd(HANDLE handle, int access_mode, + struct usbi_transfer *transfer, cancel_transfer *cancel_fn); +void usbi_free_fd(struct winfd* winfd); +struct winfd fd_to_winfd(int fd); +struct winfd handle_to_winfd(HANDLE handle); +struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); + +/* + * Timeval operations + */ +#if defined(DDKBUILD) +#include // defines timeval functions on DDK +#endif + +#if !defined(TIMESPEC_TO_TIMEVAL) +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (long)(ts)->tv_sec; \ + (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ +} +#endif +#if !defined(timersub) +#define timersub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ +} while (0) +#endif diff --git a/Externals/libusbx/libusb/os/threads_posix.c b/Externals/libusbx/libusb/os/threads_posix.c new file mode 100644 index 0000000000..9769f58367 --- /dev/null +++ b/Externals/libusbx/libusb/os/threads_posix.c @@ -0,0 +1,80 @@ +/* + * libusbx synchronization using POSIX Threads + * + * Copyright © 2011 Vitali Lovich + * Copyright © 2011 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if defined(__linux__) || defined(__OpenBSD__) +# if defined(__linux__) +# define _GNU_SOURCE +# else +# define _BSD_SOURCE +# endif +# include +# include +#elif defined(__APPLE__) +# include +#elif defined(__CYGWIN__) +# include +#endif + +#include "threads_posix.h" + +int usbi_mutex_init_recursive(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) +{ + int err; + pthread_mutexattr_t stack_attr; + if (!attr) { + attr = &stack_attr; + err = pthread_mutexattr_init(&stack_attr); + if (err != 0) + return err; + } + + /* mutexattr_settype requires _GNU_SOURCE or _XOPEN_SOURCE >= 500 on Linux */ + err = pthread_mutexattr_settype(attr, PTHREAD_MUTEX_RECURSIVE); + if (err != 0) + goto finish; + + err = pthread_mutex_init(mutex, attr); + +finish: + if (attr == &stack_attr) + pthread_mutexattr_destroy(&stack_attr); + + return err; +} + +int usbi_get_tid(void) +{ + int ret = -1; +#if defined(__linux__) + ret = syscall(SYS_gettid); +#elif defined(__OpenBSD__) + /* The following only works with OpenBSD > 5.1 as it requires + real thread support. For 5.1 and earlier, -1 is returned. */ + ret = syscall(SYS_getthrid); +#elif defined(__APPLE__) + ret = mach_thread_self(); + mach_port_deallocate(mach_task_self(), ret); +#elif defined(__CYGWIN__) + ret = GetCurrentThreadId(); +#endif +/* TODO: NetBSD thread ID support */ + return ret; +} diff --git a/Externals/libusbx/libusb/os/threads_posix.h b/Externals/libusbx/libusb/os/threads_posix.h new file mode 100644 index 0000000000..0b6a71a552 --- /dev/null +++ b/Externals/libusbx/libusb/os/threads_posix.h @@ -0,0 +1,50 @@ +/* + * libusbx synchronization using POSIX Threads + * + * Copyright © 2010 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_POSIX_H +#define LIBUSB_THREADS_POSIX_H + +#include + +#define usbi_mutex_static_t pthread_mutex_t +#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define usbi_mutex_static_lock pthread_mutex_lock +#define usbi_mutex_static_unlock pthread_mutex_unlock + +#define usbi_mutex_t pthread_mutex_t +#define usbi_mutex_init pthread_mutex_init +#define usbi_mutex_lock pthread_mutex_lock +#define usbi_mutex_unlock pthread_mutex_unlock +#define usbi_mutex_trylock pthread_mutex_trylock +#define usbi_mutex_destroy pthread_mutex_destroy + +#define usbi_cond_t pthread_cond_t +#define usbi_cond_init pthread_cond_init +#define usbi_cond_wait pthread_cond_wait +#define usbi_cond_timedwait pthread_cond_timedwait +#define usbi_cond_broadcast pthread_cond_broadcast +#define usbi_cond_destroy pthread_cond_destroy +#define usbi_cond_signal pthread_cond_signal + +extern int usbi_mutex_init_recursive(pthread_mutex_t *mutex, pthread_mutexattr_t *attr); + +int usbi_get_tid(void); + +#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/Externals/libusbx/libusb/os/threads_windows.c b/Externals/libusbx/libusb/os/threads_windows.c new file mode 100644 index 0000000000..cad27e9ea0 --- /dev/null +++ b/Externals/libusbx/libusb/os/threads_windows.c @@ -0,0 +1,212 @@ +/* + * libusbx synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#include "libusbi.h" + +extern const uint64_t epoch_time; + +int usbi_mutex_init(usbi_mutex_t *mutex, + const usbi_mutexattr_t *attr) { + UNUSED(attr); + if(! mutex) return ((errno=EINVAL)); + *mutex = CreateMutex(NULL, FALSE, NULL); + if(!*mutex) return ((errno=ENOMEM)); + return 0; +} +int usbi_mutex_destroy(usbi_mutex_t *mutex) { + // It is not clear if CloseHandle failure is due to failure to unlock. + // If so, this should be errno=EBUSY. + if(!mutex || !CloseHandle(*mutex)) return ((errno=EINVAL)); + *mutex = NULL; + return 0; +} +int usbi_mutex_trylock(usbi_mutex_t *mutex) { + DWORD result; + if(!mutex) return ((errno=EINVAL)); + result = WaitForSingleObject(*mutex, 0); + if(result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + if(result == WAIT_TIMEOUT) + return ((errno=EBUSY)); + return ((errno=EINVAL)); // don't know how this would happen + // so don't know proper errno +} +int usbi_mutex_lock(usbi_mutex_t *mutex) { + DWORD result; + if(!mutex) return ((errno=EINVAL)); + result = WaitForSingleObject(*mutex, INFINITE); + if(result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + return ((errno=EINVAL)); // don't know how this would happen + // so don't know proper errno +} +int usbi_mutex_unlock(usbi_mutex_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + if(!ReleaseMutex(*mutex)) return ((errno=EPERM )); + return 0; +} + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + while (InterlockedExchange((LONG *)mutex, 1) == 1) { + SleepEx(0, TRUE); + } + return 0; +} +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + *mutex = 0; + return 0; +} + +int usbi_cond_init(usbi_cond_t *cond, + const usbi_condattr_t *attr) { + UNUSED(attr); + if(!cond) return ((errno=EINVAL)); + list_init(&cond->waiters ); + list_init(&cond->not_waiting); + return 0; +} +int usbi_cond_destroy(usbi_cond_t *cond) { + // This assumes no one is using this anymore. The check MAY NOT BE safe. + struct usbi_cond_perthread *pos, *next_pos = NULL; + if(!cond) return ((errno=EINVAL)); + if(!list_empty(&cond->waiters)) return ((errno=EBUSY )); // (!see above!) + list_for_each_entry_safe(pos, next_pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + CloseHandle(pos->event); + list_del(&pos->list); + free(pos); + } + + return 0; +} + +int usbi_cond_broadcast(usbi_cond_t *cond) { + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + int fail = 0; + struct usbi_cond_perthread *pos; + if(!cond) return ((errno=EINVAL)); + list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) { + if(!SetEvent(pos->event)) + fail = 1; + } + // The wait function will remove its respective item from the list. + return fail ? ((errno=EINVAL)) : 0; +} +int usbi_cond_signal(usbi_cond_t *cond) { + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + struct usbi_cond_perthread *pos; + if(!cond) return ((errno=EINVAL)); + if(list_empty(&cond->waiters)) return 0; // no one to wakeup. + pos = list_entry(&cond->waiters.next, struct usbi_cond_perthread, list); + // The wait function will remove its respective item from the list. + return SetEvent(pos->event) ? 0 : ((errno=EINVAL)); +} +__inline static int usbi_cond_intwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + DWORD timeout_ms) { + struct usbi_cond_perthread *pos; + int found = 0, r; + DWORD r2,tid = GetCurrentThreadId(); + if(!cond || !mutex) return ((errno=EINVAL)); + list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + if(tid == pos->tid) { + found = 1; + break; + } + } + if(!found) { + pos = (struct usbi_cond_perthread*) calloc(1, sizeof(struct usbi_cond_perthread)); + if(!pos) return ((errno=ENOMEM)); // This errno is not POSIX-allowed. + pos->tid = tid; + pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. + if(!pos->event) { + free(pos); + return ((errno=ENOMEM)); + } + list_add(&pos->list, &cond->not_waiting); + } + + list_del(&pos->list); // remove from not_waiting list. + list_add(&pos->list, &cond->waiters); + + r = usbi_mutex_unlock(mutex); + if(r) return r; + r2 = WaitForSingleObject(pos->event, timeout_ms); + r = usbi_mutex_lock(mutex); + if(r) return r; + + list_del(&pos->list); + list_add(&pos->list, &cond->not_waiting); + + if(r2 == WAIT_TIMEOUT) return ((errno=ETIMEDOUT)); + + return 0; +} +// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) { + return usbi_cond_intwait(cond, mutex, INFINITE); +} +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + const struct timespec *abstime) { + FILETIME filetime; + ULARGE_INTEGER rtime; + struct timeval targ_time, cur_time, delta_time; + struct timespec cur_time_ns; + DWORD millis; + + // GetSystemTimeAsFileTime() is not available on CE + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + cur_time_ns.tv_sec = (long)(rtime.QuadPart / 10000000); + cur_time_ns.tv_nsec = (long)((rtime.QuadPart % 10000000)*100); + TIMESPEC_TO_TIMEVAL(&cur_time, &cur_time_ns); + + TIMESPEC_TO_TIMEVAL(&targ_time, abstime); + timersub(&targ_time, &cur_time, &delta_time); + if(delta_time.tv_sec < 0) // abstime already passed? + millis = 0; + else { + millis = delta_time.tv_usec/1000; + millis += delta_time.tv_sec *1000; + if (delta_time.tv_usec % 1000) // round up to next millisecond + millis++; + } + + return usbi_cond_intwait(cond, mutex, millis); +} + +int usbi_get_tid(void) { + return GetCurrentThreadId(); +} diff --git a/Externals/libusbx/libusb/os/threads_windows.h b/Externals/libusbx/libusb/os/threads_windows.h new file mode 100644 index 0000000000..df8a0eeb03 --- /dev/null +++ b/Externals/libusbx/libusb/os/threads_windows.h @@ -0,0 +1,87 @@ +/* + * libusbx synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_WINDOWS_H +#define LIBUSB_THREADS_WINDOWS_H + +#define usbi_mutex_static_t volatile LONG +#define USBI_MUTEX_INITIALIZER 0 + +#define usbi_mutex_t HANDLE + +struct usbi_cond_perthread { + struct list_head list; + DWORD tid; + HANDLE event; +}; +struct usbi_cond_t_ { + // Every time a thread touches the CV, it winds up in one of these lists. + // It stays there until the CV is destroyed, even if the thread + // terminates. + struct list_head waiters; + struct list_head not_waiting; +}; +typedef struct usbi_cond_t_ usbi_cond_t; + +// We *were* getting timespec from pthread.h: +#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) +#define HAVE_STRUCT_TIMESPEC 1 +#define _TIMESPEC_DEFINED 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ + +// We *were* getting ETIMEDOUT from pthread.h: +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +#define usbi_mutexattr_t void +#define usbi_condattr_t void + +// all Windows mutexes are recursive +#define usbi_mutex_init_recursive(mutex, attr) usbi_mutex_init((mutex), (attr)) + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); + + +int usbi_mutex_init(usbi_mutex_t *mutex, + const usbi_mutexattr_t *attr); +int usbi_mutex_lock(usbi_mutex_t *mutex); +int usbi_mutex_unlock(usbi_mutex_t *mutex); +int usbi_mutex_trylock(usbi_mutex_t *mutex); +int usbi_mutex_destroy(usbi_mutex_t *mutex); + +int usbi_cond_init(usbi_cond_t *cond, + const usbi_condattr_t *attr); +int usbi_cond_destroy(usbi_cond_t *cond); +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + const struct timespec *abstime); +int usbi_cond_broadcast(usbi_cond_t *cond); +int usbi_cond_signal(usbi_cond_t *cond); + +int usbi_get_tid(void); + +#endif /* LIBUSB_THREADS_WINDOWS_H */ diff --git a/Externals/libusbx/libusb/os/wince_usb.c b/Externals/libusbx/libusb/os/wince_usb.c new file mode 100644 index 0000000000..e4a66331e5 --- /dev/null +++ b/Externals/libusbx/libusb/os/wince_usb.c @@ -0,0 +1,1015 @@ +/* + * Windows CE backend for libusbx 1.0 + * Copyright © 2011-2013 RealVNC Ltd. + * Large portions taken from Windows backend, which is + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include + +#include "wince_usb.h" + +// Forward declares +static int wince_clock_gettime(int clk_id, struct timespec *tp); +unsigned __stdcall wince_clock_gettime_threaded(void* param); + +// Global variables +uint64_t hires_frequency, hires_ticks_to_ps; +int errno; +const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime +enum windows_version windows_version = WINDOWS_CE; +static int concurrent_usage = -1; +// Timer thread +// NB: index 0 is for monotonic and 1 is for the thread exit event +HANDLE timer_thread = NULL; +HANDLE timer_mutex = NULL; +struct timespec timer_tp; +volatile LONG request_count[2] = {0, 1}; // last one must be > 0 +HANDLE timer_request[2] = { NULL, NULL }; +HANDLE timer_response = NULL; +HANDLE driver_handle = INVALID_HANDLE_VALUE; + +/* + * Converts a windows error to human readable string + * uses retval as errorcode, or, if 0, use GetLastError() + */ +#if defined(ENABLE_LOGGING) +static char* windows_error_str(uint32_t retval) +{ + static TCHAR wErr_string[ERR_BUFFER_SIZE]; + static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + size_t i; + uint32_t error_code, format_error; + + error_code = retval?retval:GetLastError(); + + safe_stprintf(wErr_string, ERR_BUFFER_SIZE, _T("[%d] "), error_code); + + size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &wErr_string[safe_tcslen(wErr_string)], + ERR_BUFFER_SIZE - (DWORD)safe_tcslen(wErr_string), NULL); + if (size == 0) { + format_error = GetLastError(); + if (format_error) + safe_stprintf(wErr_string, ERR_BUFFER_SIZE, + _T("Windows error code %u (FormatMessage error code %u)"), error_code, format_error); + else + safe_stprintf(wErr_string, ERR_BUFFER_SIZE, _T("Unknown error code %u"), error_code); + } else { + // Remove CR/LF terminators + for (i=safe_tcslen(wErr_string)-1; ((wErr_string[i]==0x0A) || (wErr_string[i]==0x0D)); i--) { + wErr_string[i] = 0; + } + } + if (WideCharToMultiByte(CP_ACP, 0, wErr_string, -1, err_string, ERR_BUFFER_SIZE, NULL, NULL) < 0) + { + strcpy(err_string, "Unable to convert error string"); + } + return err_string; +} +#endif + +static struct wince_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct wince_device_priv *) dev->os_priv; +} + +// ceusbkwrapper to libusb error code mapping +static int translate_driver_error(int error) +{ + switch (error) { + case ERROR_INVALID_PARAMETER: + return LIBUSB_ERROR_INVALID_PARAM; + case ERROR_CALL_NOT_IMPLEMENTED: + case ERROR_NOT_SUPPORTED: + return LIBUSB_ERROR_NOT_SUPPORTED; + case ERROR_NOT_ENOUGH_MEMORY: + return LIBUSB_ERROR_NO_MEM; + case ERROR_INVALID_HANDLE: + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_BUSY: + return LIBUSB_ERROR_BUSY; + + // Error codes that are either unexpected, or have + // no suitable LIBUSB_ERROR equivilant. + case ERROR_CANCELLED: + case ERROR_INTERNAL_ERROR: + default: + return LIBUSB_ERROR_OTHER; + } +} + +static int init_dllimports() +{ + DLL_LOAD(ceusbkwrapper.dll, UkwOpenDriver, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceList, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwReleaseDeviceList, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceAddress, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceDescriptor, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwGetConfigDescriptor, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwCloseDriver, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwCancelTransfer, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwIssueControlTransfer, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwClaimInterface, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwReleaseInterface, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwSetInterfaceAlternateSetting, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwClearHaltHost, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwClearHaltDevice, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwGetConfig, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwSetConfig, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwResetDevice, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwKernelDriverActive, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwAttachKernelDriver, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwDetachKernelDriver, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwIssueBulkTransfer, TRUE); + DLL_LOAD(ceusbkwrapper.dll, UkwIsPipeHalted, TRUE); + return LIBUSB_SUCCESS; +} + +static int init_device(struct libusb_device *dev, UKW_DEVICE drv_dev, + unsigned char bus_addr, unsigned char dev_addr) +{ + struct wince_device_priv *priv = _device_priv(dev); + int r = LIBUSB_SUCCESS; + + dev->bus_number = bus_addr; + dev->device_address = dev_addr; + priv->dev = drv_dev; + + if (!UkwGetDeviceDescriptor(priv->dev, &(priv->desc))) { + r = translate_driver_error(GetLastError()); + } + return r; +} + +// Internal API functions +static int wince_init(struct libusb_context *ctx) +{ + int i, r = LIBUSB_ERROR_OTHER; + HANDLE semaphore; + TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) + + _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); + semaphore = CreateSemaphore(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_MEM; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore's release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); + CloseHandle(semaphore); + return LIBUSB_ERROR_NO_MEM; + } + + // NB: concurrent usage supposes that init calls are equally balanced with + // exit calls. If init is called more than exit, we will not exit properly + if ( ++concurrent_usage == 0 ) { // First init? + // Initialize pollable file descriptors + init_polling(); + + // Load DLL imports + if (init_dllimports() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + // try to open a handle to the driver + driver_handle = UkwOpenDriver(); + if (driver_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not connect to driver"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + // Windows CE doesn't have a way of specifying thread affinity, so this code + // just has to hope QueryPerformanceCounter doesn't report different values when + // running on different cores. + r = LIBUSB_ERROR_NO_MEM; + for (i = 0; i < 2; i++) { + timer_request[i] = CreateEvent(NULL, TRUE, FALSE, NULL); + if (timer_request[i] == NULL) { + usbi_err(ctx, "could not create timer request event %d - aborting", i); + goto init_exit; + } + } + timer_response = CreateSemaphore(NULL, 0, MAX_TIMER_SEMAPHORES, NULL); + if (timer_response == NULL) { + usbi_err(ctx, "could not create timer response semaphore - aborting"); + goto init_exit; + } + timer_mutex = CreateMutex(NULL, FALSE, NULL); + if (timer_mutex == NULL) { + usbi_err(ctx, "could not create timer mutex - aborting"); + goto init_exit; + } + timer_thread = CreateThread(NULL, 0, wince_clock_gettime_threaded, NULL, 0, NULL); + if (timer_thread == NULL) { + usbi_err(ctx, "Unable to create timer thread - aborting"); + goto init_exit; + } + } + // At this stage, either we went through full init successfully, or didn't need to + r = LIBUSB_SUCCESS; + +init_exit: // Holds semaphore here. + if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? + if (driver_handle != INVALID_HANDLE_VALUE) { + UkwCloseDriver(driver_handle); + driver_handle = INVALID_HANDLE_VALUE; + } + if (timer_thread) { + SetEvent(timer_request[1]); // actually the signal to quit the thread. + if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) { + usbi_warn(ctx, "could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); // shouldn't happen, but we're destroying + // all objects it might have held anyway. + } + CloseHandle(timer_thread); + timer_thread = NULL; + } + for (i = 0; i < 2; i++) { + if (timer_request[i]) { + CloseHandle(timer_request[i]); + timer_request[i] = NULL; + } + } + if (timer_response) { + CloseHandle(timer_response); + timer_response = NULL; + } + if (timer_mutex) { + CloseHandle(timer_mutex); + timer_mutex = NULL; + } + } + + if (r != LIBUSB_SUCCESS) + --concurrent_usage; // Not expected to call libusb_exit if we failed. + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); + return r; +} + +static void wince_exit(void) +{ + int i; + HANDLE semaphore; + TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) + + _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); + semaphore = CreateSemaphore(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + return; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + CloseHandle(semaphore); + return; + } + + // Only works if exits and inits are balanced exactly + if (--concurrent_usage < 0) { // Last exit + exit_polling(); + + if (timer_thread) { + SetEvent(timer_request[1]); // actually the signal to quit the thread. + if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) { + usbi_dbg("could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); + } + CloseHandle(timer_thread); + timer_thread = NULL; + } + for (i = 0; i < 2; i++) { + if (timer_request[i]) { + CloseHandle(timer_request[i]); + timer_request[i] = NULL; + } + } + if (timer_response) { + CloseHandle(timer_response); + timer_response = NULL; + } + if (timer_mutex) { + CloseHandle(timer_mutex); + timer_mutex = NULL; + } + if (driver_handle != INVALID_HANDLE_VALUE) { + UkwCloseDriver(driver_handle); + driver_handle = INVALID_HANDLE_VALUE; + } + } + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); +} + +static int wince_get_device_list( + struct libusb_context *ctx, + struct discovered_devs **discdevs) +{ + UKW_DEVICE devices[MAX_DEVICE_COUNT]; + struct discovered_devs * new_devices = *discdevs; + DWORD count = 0, i; + struct libusb_device *dev = NULL; + unsigned char bus_addr, dev_addr; + unsigned long session_id; + BOOL success; + DWORD release_list_offset = 0; + int r = LIBUSB_SUCCESS; + + success = UkwGetDeviceList(driver_handle, devices, MAX_DEVICE_COUNT, &count); + if (!success) { + int libusbErr = translate_driver_error(GetLastError()); + usbi_err(ctx, "could not get devices: %s", windows_error_str(0)); + return libusbErr; + } + for(i = 0; i < count; ++i) { + release_list_offset = i; + success = UkwGetDeviceAddress(devices[i], &bus_addr, &dev_addr, &session_id); + if (!success) { + r = translate_driver_error(GetLastError()); + usbi_err(ctx, "could not get device address for %d: %s", i, windows_error_str(0)); + goto err_out; + } + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev) { + usbi_dbg("using existing device for %d/%d (session %ld)", + bus_addr, dev_addr, session_id); + libusb_ref_device(dev); + // Release just this element in the device list (as we already hold a + // reference to it). + UkwReleaseDeviceList(driver_handle, &devices[i], 1); + release_list_offset++; + } else { + usbi_dbg("allocating new device for %d/%d (session %ld)", + bus_addr, dev_addr, session_id); + dev = usbi_alloc_device(ctx, session_id); + if (!dev) { + r = LIBUSB_ERROR_NO_MEM; + goto err_out; + } + r = init_device(dev, devices[i], bus_addr, dev_addr); + if (r < 0) + goto err_out; + r = usbi_sanitize_device(dev); + if (r < 0) + goto err_out; + } + new_devices = discovered_devs_append(new_devices, dev); + if (!discdevs) { + r = LIBUSB_ERROR_NO_MEM; + goto err_out; + } + safe_unref_device(dev); + } + *discdevs = new_devices; + return r; +err_out: + *discdevs = new_devices; + safe_unref_device(dev); + // Release the remainder of the unprocessed device list. + // The devices added to new_devices already will still be passed up to libusb, + // which can dispose of them at its leisure. + UkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset); + return r; +} + +static int wince_open(struct libusb_device_handle *handle) +{ + // Nothing to do to open devices as a handle to it has + // been retrieved by wince_get_device_list + return LIBUSB_SUCCESS; +} + +static void wince_close(struct libusb_device_handle *handle) +{ + // Nothing to do as wince_open does nothing. +} + +static int wince_get_device_descriptor( + struct libusb_device *device, + unsigned char *buffer, int *host_endian) +{ + struct wince_device_priv *priv = _device_priv(device); + + *host_endian = 1; + memcpy(buffer, &priv->desc, DEVICE_DESC_LENGTH); + return LIBUSB_SUCCESS; +} + +static int wince_get_active_config_descriptor( + struct libusb_device *device, + unsigned char *buffer, size_t len, int *host_endian) +{ + struct wince_device_priv *priv = _device_priv(device); + DWORD actualSize = len; + *host_endian = 0; + if (!UkwGetConfigDescriptor(priv->dev, UKW_ACTIVE_CONFIGURATION, buffer, len, &actualSize)) { + return translate_driver_error(GetLastError()); + } + return actualSize; +} + +static int wince_get_config_descriptor( + struct libusb_device *device, + uint8_t config_index, + unsigned char *buffer, size_t len, int *host_endian) +{ + struct wince_device_priv *priv = _device_priv(device); + DWORD actualSize = len; + *host_endian = 0; + if (!UkwGetConfigDescriptor(priv->dev, config_index, buffer, len, &actualSize)) { + return translate_driver_error(GetLastError()); + } + return actualSize; +} + +static int wince_get_configuration( + struct libusb_device_handle *handle, + int *config) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + UCHAR cv = 0; + if (!UkwGetConfig(priv->dev, &cv)) { + return translate_driver_error(GetLastError()); + } + (*config) = cv; + return LIBUSB_SUCCESS; +} + +static int wince_set_configuration( + struct libusb_device_handle *handle, + int config) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + // Setting configuration 0 places the device in Address state. + // This should correspond to the "unconfigured state" required by + // libusb when the specified configuration is -1. + UCHAR cv = (config < 0) ? 0 : config; + if (!UkwSetConfig(priv->dev, cv)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_claim_interface( + struct libusb_device_handle *handle, + int interface_number) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwClaimInterface(priv->dev, interface_number)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_release_interface( + struct libusb_device_handle *handle, + int interface_number) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, 0)) { + return translate_driver_error(GetLastError()); + } + if (!UkwReleaseInterface(priv->dev, interface_number)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_set_interface_altsetting( + struct libusb_device_handle *handle, + int interface_number, int altsetting) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, altsetting)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_clear_halt( + struct libusb_device_handle *handle, + unsigned char endpoint) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwClearHaltHost(priv->dev, endpoint)) { + return translate_driver_error(GetLastError()); + } + if (!UkwClearHaltDevice(priv->dev, endpoint)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_reset_device( + struct libusb_device_handle *handle) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwResetDevice(priv->dev)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_kernel_driver_active( + struct libusb_device_handle *handle, + int interface_number) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + BOOL result = FALSE; + if (!UkwKernelDriverActive(priv->dev, interface_number, &result)) { + return translate_driver_error(GetLastError()); + } + return result ? 1 : 0; +} + +static int wince_detach_kernel_driver( + struct libusb_device_handle *handle, + int interface_number) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwDetachKernelDriver(priv->dev, interface_number)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_attach_kernel_driver( + struct libusb_device_handle *handle, + int interface_number) +{ + struct wince_device_priv *priv = _device_priv(handle->dev); + if (!UkwAttachKernelDriver(priv->dev, interface_number)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static void wince_destroy_device( + struct libusb_device *dev) +{ + struct wince_device_priv *priv = _device_priv(dev); + UkwReleaseDeviceList(driver_handle, &priv->dev, 1); +} + +static void wince_clear_transfer_priv( + struct usbi_transfer *itransfer) +{ + struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd); + // No need to cancel transfer as it is either complete or abandoned + wfd.itransfer = NULL; + CloseHandle(wfd.handle); + usbi_free_fd(&transfer_priv->pollable_fd); +} + +static int wince_cancel_transfer( + struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + + if (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT)) { + return translate_driver_error(GetLastError()); + } + return LIBUSB_SUCCESS; +} + +static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); + BOOL direction_in, ret; + struct winfd wfd; + DWORD flags; + HANDLE eventHandle; + PUKW_CONTROL_HEADER setup = NULL; + const BOOL control_transfer = transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL; + + transfer_priv->pollable_fd = INVALID_WINFD; + if (control_transfer) { + setup = (PUKW_CONTROL_HEADER) transfer->buffer; + direction_in = setup->bmRequestType & LIBUSB_ENDPOINT_IN; + } else { + direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; + } + flags = direction_in ? UKW_TF_IN_TRANSFER : UKW_TF_OUT_TRANSFER; + flags |= UKW_TF_SHORT_TRANSFER_OK; + + eventHandle = CreateEvent(NULL, FALSE, FALSE, NULL); + if (eventHandle == NULL) { + usbi_err(ctx, "Failed to create event for async transfer"); + return LIBUSB_ERROR_NO_MEM; + } + + wfd = usbi_create_fd(eventHandle, direction_in ? RW_READ : RW_WRITE, itransfer, &wince_cancel_transfer); + if (wfd.fd < 0) { + CloseHandle(eventHandle); + return LIBUSB_ERROR_NO_MEM; + } + + transfer_priv->pollable_fd = wfd; + if (control_transfer) { + // Split out control setup header and data buffer + DWORD bufLen = transfer->length - sizeof(UKW_CONTROL_HEADER); + PVOID buf = (PVOID) &transfer->buffer[sizeof(UKW_CONTROL_HEADER)]; + + ret = UkwIssueControlTransfer(priv->dev, flags, setup, buf, bufLen, &transfer->actual_length, wfd.overlapped); + } else { + ret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer, + transfer->length, &transfer->actual_length, wfd.overlapped); + } + if (!ret) { + int libusbErr = translate_driver_error(GetLastError()); + usbi_err(ctx, "UkwIssue%sTransfer failed: error %d", + control_transfer ? "Control" : "Bulk", GetLastError()); + wince_clear_transfer_priv(itransfer); + return libusbErr; + } + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT); + itransfer->flags |= USBI_TRANSFER_UPDATED_FDS; + + return LIBUSB_SUCCESS; +} + +static int wince_submit_iso_transfer(struct usbi_transfer *itransfer) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int wince_submit_transfer( + struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return wince_submit_control_or_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return wince_submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int status; + + usbi_dbg("handling I/O completion with errcode %d", io_result); + + if (io_result == ERROR_NOT_SUPPORTED && + transfer->type != LIBUSB_TRANSFER_TYPE_CONTROL) { + /* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper + * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the + * endpoint isn't actually stalled. + * + * One example of this is that some devices will occasionally fail to reply to an IN + * token. The WinCE USB layer carries on with the transaction until it is completed + * (or cancelled) but then completes it with USB_ERROR_STALL. + * + * This code therefore needs to confirm that there really is a stall error, by both + * checking the pipe status and requesting the endpoint status from the device. + */ + BOOL halted = FALSE; + usbi_dbg("checking I/O completion with errcode ERROR_NOT_SUPPORTED is really a stall"); + if (UkwIsPipeHalted(priv->dev, transfer->endpoint, &halted)) { + /* Pipe status retrieved, so now request endpoint status by sending a GET_STATUS + * control request to the device. This is done synchronously, which is a bit + * naughty, but this is a special corner case. + */ + WORD wStatus = 0; + DWORD written = 0; + UKW_CONTROL_HEADER ctrlHeader; + ctrlHeader.bmRequestType = LIBUSB_REQUEST_TYPE_STANDARD | + LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_ENDPOINT; + ctrlHeader.bRequest = LIBUSB_REQUEST_GET_STATUS; + ctrlHeader.wValue = 0; + ctrlHeader.wIndex = transfer->endpoint; + ctrlHeader.wLength = sizeof(wStatus); + if (UkwIssueControlTransfer(priv->dev, + UKW_TF_IN_TRANSFER | UKW_TF_SEND_TO_ENDPOINT, + &ctrlHeader, &wStatus, sizeof(wStatus), &written, NULL)) { + if (written == sizeof(wStatus) && + (wStatus & STATUS_HALT_FLAG) == 0) { + if (!halted || UkwClearHaltHost(priv->dev, transfer->endpoint)) { + usbi_dbg("Endpoint doesn't appear to be stalled, overriding error with success"); + io_result = ERROR_SUCCESS; + } else { + usbi_dbg("Endpoint doesn't appear to be stalled, but the host is halted, changing error"); + io_result = ERROR_IO_DEVICE; + } + } + } + } + } + + switch(io_result) { + case ERROR_SUCCESS: + itransfer->transferred += io_size; + status = LIBUSB_TRANSFER_COMPLETED; + break; + case ERROR_CANCELLED: + usbi_dbg("detected transfer cancel"); + status = LIBUSB_TRANSFER_CANCELLED; + break; + case ERROR_NOT_SUPPORTED: + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + } else { + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + } + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error: %s", windows_error_str(io_result)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + wince_clear_transfer_priv(itransfer); + if (status == LIBUSB_TRANSFER_CANCELLED) { + usbi_handle_transfer_cancellation(itransfer); + } else { + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); + } +} + +static void wince_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + wince_transfer_callback (itransfer, io_result, io_size); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +static int wince_handle_events( + struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + struct wince_transfer_priv* transfer_priv = NULL; + POLL_NFDS_TYPE i = 0; + BOOL found = FALSE; + struct usbi_transfer *transfer; + DWORD io_size, io_result; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) { + continue; + } + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + transfer_priv = usbi_transfer_get_os_priv(transfer); + if (transfer_priv->pollable_fd.fd == fds[i].fd) { + found = TRUE; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found && HasOverlappedIoCompleted(transfer_priv->pollable_fd.overlapped)) { + io_result = (DWORD)transfer_priv->pollable_fd.overlapped->Internal; + io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; + usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + wince_handle_callback(transfer, io_result, io_size); + } else if (found) { + usbi_err(ctx, "matching transfer for fd %x has not completed", fds[i]); + return LIBUSB_ERROR_OTHER; + } else { + usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + return LIBUSB_SUCCESS; +} + +/* + * Monotonic and real time functions + */ +unsigned __stdcall wince_clock_gettime_threaded(void* param) +{ + LARGE_INTEGER hires_counter, li_frequency; + LONG nb_responses; + int timer_index; + + // Init - find out if we have access to a monotonic (hires) timer + if (!QueryPerformanceFrequency(&li_frequency)) { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } else { + hires_frequency = li_frequency.QuadPart; + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + } + + // Main loop - wait for requests + while (1) { + timer_index = WaitForMultipleObjects(2, timer_request, FALSE, INFINITE) - WAIT_OBJECT_0; + if ( (timer_index != 0) && (timer_index != 1) ) { + usbi_dbg("failure to wait on requests: %s", windows_error_str(0)); + continue; + } + if (request_count[timer_index] == 0) { + // Request already handled + ResetEvent(timer_request[timer_index]); + // There's still a possiblity that a thread sends a request between the + // time we test request_count[] == 0 and we reset the event, in which case + // the request would be ignored. The simple solution to that is to test + // request_count again and process requests if non zero. + if (request_count[timer_index] == 0) + continue; + } + switch (timer_index) { + case 0: + WaitForSingleObject(timer_mutex, INFINITE); + // Requests to this thread are for hires always + if (QueryPerformanceCounter(&hires_counter) != 0) { + timer_tp.tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + timer_tp.tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps); + } else { + // Fallback to real-time if we can't get monotonic value + // Note that real-time clock does not wait on the mutex or this thread. + wince_clock_gettime(USBI_CLOCK_REALTIME, &timer_tp); + } + ReleaseMutex(timer_mutex); + + nb_responses = InterlockedExchange((LONG*)&request_count[0], 0); + if ( (nb_responses) + && (ReleaseSemaphore(timer_response, nb_responses, NULL) == 0) ) { + usbi_dbg("unable to release timer semaphore %d: %s", windows_error_str(0)); + } + continue; + case 1: // time to quit + usbi_dbg("timer thread quitting"); + return 0; + } + } + usbi_dbg("ERROR: broken timer thread"); + return 1; +} + +static int wince_clock_gettime(int clk_id, struct timespec *tp) +{ + FILETIME filetime; + ULARGE_INTEGER rtime; + DWORD r; + SYSTEMTIME st; + switch(clk_id) { + case USBI_CLOCK_MONOTONIC: + if (hires_frequency != 0) { + while (1) { + InterlockedIncrement((LONG*)&request_count[0]); + SetEvent(timer_request[0]); + r = WaitForSingleObject(timer_response, TIMER_REQUEST_RETRY_MS); + switch(r) { + case WAIT_OBJECT_0: + WaitForSingleObject(timer_mutex, INFINITE); + *tp = timer_tp; + ReleaseMutex(timer_mutex); + return LIBUSB_SUCCESS; + case WAIT_TIMEOUT: + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + break; // Retry until successful + default: + usbi_dbg("WaitForSingleObject failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + } + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTime(&st); + SystemTimeToFileTime(&st, &filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +const struct usbi_os_backend wince_backend = { + "Windows CE", + 0, + wince_init, + wince_exit, + + wince_get_device_list, + NULL, /* hotplug_poll */ + wince_open, + wince_close, + + wince_get_device_descriptor, + wince_get_active_config_descriptor, + wince_get_config_descriptor, + NULL, /* get_config_descriptor_by_value() */ + + wince_get_configuration, + wince_set_configuration, + wince_claim_interface, + wince_release_interface, + + wince_set_interface_altsetting, + wince_clear_halt, + wince_reset_device, + + wince_kernel_driver_active, + wince_detach_kernel_driver, + wince_attach_kernel_driver, + + wince_destroy_device, + + wince_submit_transfer, + wince_cancel_transfer, + wince_clear_transfer_priv, + + wince_handle_events, + + wince_clock_gettime, + sizeof(struct wince_device_priv), + sizeof(struct wince_device_handle_priv), + sizeof(struct wince_transfer_priv), + 0, +}; diff --git a/Externals/libusbx/libusb/os/wince_usb.h b/Externals/libusbx/libusb/os/wince_usb.h new file mode 100644 index 0000000000..3db9693a13 --- /dev/null +++ b/Externals/libusbx/libusb/os/wince_usb.h @@ -0,0 +1,131 @@ +/* + * Windows CE backend for libusbx 1.0 + * Copyright © 2011-2013 RealVNC Ltd. + * Portions taken from Windows backend, which is + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#pragma once + +#include "windows_common.h" + +#include +#include "poll_windows.h" + +#define MAX_DEVICE_COUNT 256 + +// This is a modified dump of the types in the ceusbkwrapper.h library header +// with functions transformed into extern pointers. +// +// This backend dynamically loads ceusbkwrapper.dll and doesn't include +// ceusbkwrapper.h directly to simplify the build process. The kernel +// side wrapper driver is built using the platform image build tools, +// which makes it difficult to reference directly from the libusbx build +// system. +struct UKW_DEVICE_PRIV; +typedef struct UKW_DEVICE_PRIV *UKW_DEVICE; +typedef UKW_DEVICE *PUKW_DEVICE, *LPUKW_DEVICE; + +typedef struct { + UINT8 bLength; + UINT8 bDescriptorType; + UINT16 bcdUSB; + UINT8 bDeviceClass; + UINT8 bDeviceSubClass; + UINT8 bDeviceProtocol; + UINT8 bMaxPacketSize0; + UINT16 idVendor; + UINT16 idProduct; + UINT16 bcdDevice; + UINT8 iManufacturer; + UINT8 iProduct; + UINT8 iSerialNumber; + UINT8 bNumConfigurations; +} UKW_DEVICE_DESCRIPTOR, *PUKW_DEVICE_DESCRIPTOR, *LPUKW_DEVICE_DESCRIPTOR; + +typedef struct { + UINT8 bmRequestType; + UINT8 bRequest; + UINT16 wValue; + UINT16 wIndex; + UINT16 wLength; +} UKW_CONTROL_HEADER, *PUKW_CONTROL_HEADER, *LPUKW_CONTROL_HEADER; + +// Collection of flags which can be used when issuing transfer requests +/* Indicates that the transfer direction is 'in' */ +#define UKW_TF_IN_TRANSFER 0x00000001 +/* Indicates that the transfer direction is 'out' */ +#define UKW_TF_OUT_TRANSFER 0x00000000 +/* Specifies that the transfer should complete as soon as possible, + * even if no OVERLAPPED structure has been provided. */ +#define UKW_TF_NO_WAIT 0x00000100 +/* Indicates that transfers shorter than the buffer are ok */ +#define UKW_TF_SHORT_TRANSFER_OK 0x00000200 +#define UKW_TF_SEND_TO_DEVICE 0x00010000 +#define UKW_TF_SEND_TO_INTERFACE 0x00020000 +#define UKW_TF_SEND_TO_ENDPOINT 0x00040000 +/* Don't block when waiting for memory allocations */ +#define UKW_TF_DONT_BLOCK_FOR_MEM 0x00080000 + +/* Value to use when dealing with configuration values, such as UkwGetConfigDescriptor, + * to specify the currently active configuration for the device. */ +#define UKW_ACTIVE_CONFIGURATION -1 + +DLL_DECLARE(WINAPI, HANDLE, UkwOpenDriver, ()); +DLL_DECLARE(WINAPI, BOOL, UkwGetDeviceList, (HANDLE, LPUKW_DEVICE, DWORD, LPDWORD)); +DLL_DECLARE(WINAPI, void, UkwReleaseDeviceList, (HANDLE, LPUKW_DEVICE, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwGetDeviceAddress, (UKW_DEVICE, unsigned char*, unsigned char*, unsigned long*)); +DLL_DECLARE(WINAPI, BOOL, UkwGetDeviceDescriptor, (UKW_DEVICE, LPUKW_DEVICE_DESCRIPTOR)); +DLL_DECLARE(WINAPI, BOOL, UkwGetConfigDescriptor, (UKW_DEVICE, DWORD, LPVOID, DWORD, LPDWORD)); +DLL_DECLARE(WINAPI, void, UkwCloseDriver, (HANDLE)); +DLL_DECLARE(WINAPI, BOOL, UkwCancelTransfer, (UKW_DEVICE, LPOVERLAPPED, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwIssueControlTransfer, (UKW_DEVICE, DWORD, LPUKW_CONTROL_HEADER, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); +DLL_DECLARE(WINAPI, BOOL, UkwClaimInterface, (UKW_DEVICE, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwReleaseInterface, (UKW_DEVICE, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwSetInterfaceAlternateSetting, (UKW_DEVICE, DWORD, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwClearHaltHost, (UKW_DEVICE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, UkwClearHaltDevice, (UKW_DEVICE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, UkwGetConfig, (UKW_DEVICE, PUCHAR)); +DLL_DECLARE(WINAPI, BOOL, UkwSetConfig, (UKW_DEVICE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, UkwResetDevice, (UKW_DEVICE)); +DLL_DECLARE(WINAPI, BOOL, UkwKernelDriverActive, (UKW_DEVICE, DWORD, PBOOL)); +DLL_DECLARE(WINAPI, BOOL, UkwAttachKernelDriver, (UKW_DEVICE, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwDetachKernelDriver, (UKW_DEVICE, DWORD)); +DLL_DECLARE(WINAPI, BOOL, UkwIssueBulkTransfer, (UKW_DEVICE, DWORD, UCHAR, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); +DLL_DECLARE(WINAPI, BOOL, UkwIsPipeHalted, (UKW_DEVICE, UCHAR, LPBOOL)); + +// Used to determine if an endpoint status really is halted on a failed transfer. +#define STATUS_HALT_FLAG 0x1 + +struct wince_device_priv { + UKW_DEVICE dev; + UKW_DEVICE_DESCRIPTOR desc; +}; + +struct wince_device_handle_priv { + // This member isn't used, but only exists to avoid an empty structure + // for private data for the device handle. + int reserved; +}; + +struct wince_transfer_priv { + struct winfd pollable_fd; + uint8_t interface_number; +}; + diff --git a/Externals/libusbx/libusb/os/windows_common.h b/Externals/libusbx/libusb/os/windows_common.h new file mode 100644 index 0000000000..1da72bd9f8 --- /dev/null +++ b/Externals/libusbx/libusb/os/windows_common.h @@ -0,0 +1,108 @@ +/* + * Windows backend common header for libusbx 1.0 + * + * This file brings together header code common between + * the desktop Windows and Windows CE backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +// Windows API default is uppercase - ugh! +#if !defined(bool) +#define bool BOOL +#endif +#if !defined(true) +#define true TRUE +#endif +#if !defined(false) +#define false FALSE +#endif + +#define safe_free(p) do {if (p != NULL) {free((void*)p); p = NULL;}} while(0) +#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) +#define safe_min(a, b) min((size_t)(a), (size_t)(b)) +#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \ + ((char*)dst)[safe_min(count, dst_max)-1] = 0;} while(0) +#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1) +#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, dst_max - safe_strlen(dst) - 1)) +#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1) +#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"":str1), ((str2==NULL)?"":str2)) +#define safe_stricmp(str1, str2) _stricmp(((str1==NULL)?"":str1), ((str2==NULL)?"":str2)) +#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"":str1), ((str2==NULL)?"":str2), count) +#define safe_strlen(str) ((str==NULL)?0:strlen(str)) +#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0) +#define safe_stprintf _sntprintf +#define safe_tcslen(str) ((str==NULL)?0:_tcslen(str)) +#define safe_unref_device(dev) do {if (dev != NULL) {libusb_unref_device(dev); dev = NULL;}} while(0) +#define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL) +#ifndef ARRAYSIZE +#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) +#endif + +#define ERR_BUFFER_SIZE 256 +#define TIMER_REQUEST_RETRY_MS 100 +#define MAX_TIMER_SEMAPHORES 128 + + +/* + * API macros - from libusb-win32 1.x + */ +#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args) \ + typedef ret (api * __dll_##name##_t)args; \ + static __dll_##name##_t prefixname = NULL + +#ifndef _WIN32_WCE +#define DLL_STRINGIFY(dll) #dll +#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandleA(DLL_STRINGIFY(dll)) +#define DLL_LOAD_LIBRARY(dll) LoadLibraryA(DLL_STRINGIFY(dll)) +#else +#define DLL_STRINGIFY(dll) L#dll +#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandle(DLL_STRINGIFY(dll)) +#define DLL_LOAD_LIBRARY(dll) LoadLibrary(DLL_STRINGIFY(dll)) +#endif + +#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ + do { \ + HMODULE h = DLL_GET_MODULE_HANDLE(dll); \ + if (!h) \ + h = DLL_LOAD_LIBRARY(dll); \ + if (!h) { \ + if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; } \ + else { break; } \ + } \ + prefixname = (__dll_##name##_t)GetProcAddress(h, \ + DLL_STRINGIFY(name)); \ + if (prefixname) break; \ + prefixname = (__dll_##name##_t)GetProcAddress(h, \ + DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \ + if (prefixname) break; \ + prefixname = (__dll_##name##_t)GetProcAddress(h, \ + DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \ + if (prefixname) break; \ + if(ret_on_failure) \ + return LIBUSB_ERROR_NOT_FOUND; \ + } while(0) + +#define DLL_DECLARE(api, ret, name, args) DLL_DECLARE_PREFIXNAME(api, ret, name, name, args) +#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure) +#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args) DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args) +#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure) diff --git a/Externals/libusbx/libusb/os/windows_usb.c b/Externals/libusbx/libusb/os/windows_usb.c new file mode 100644 index 0000000000..63357b1a21 --- /dev/null +++ b/Externals/libusbx/libusb/os/windows_usb.c @@ -0,0 +1,4393 @@ +/* + * windows backend for libusbx 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusbi.h" +#include "poll_windows.h" +#include "windows_usb.h" + +// The 2 macros below are used in conjunction with safe loops. +#define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; } +#define LOOP_BREAK(err) { r=err; continue; } + +// Helper prototypes +static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian); +static int windows_clock_gettime(int clk_id, struct timespec *tp); +unsigned __stdcall windows_clock_gettime_threaded(void* param); +// Common calls +static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); + +// WinUSB-like API prototypes +static int winusbx_init(int sub_api, struct libusb_context *ctx); +static int winusbx_exit(int sub_api); +static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle); +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +// HID API prototypes +static int hid_init(int sub_api, struct libusb_context *ctx); +static int hid_exit(int sub_api); +static int hid_open(int sub_api, struct libusb_device_handle *dev_handle); +static void hid_close(int sub_api, struct libusb_device_handle *dev_handle); +static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +// Composite API prototypes +static int composite_init(int sub_api, struct libusb_context *ctx); +static int composite_exit(int sub_api); +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle); +static void composite_close(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); + + +// Global variables +uint64_t hires_frequency, hires_ticks_to_ps; +const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime +enum windows_version windows_version = WINDOWS_UNSUPPORTED; +// Concurrency +static int concurrent_usage = -1; +usbi_mutex_t autoclaim_lock; +// Timer thread +// NB: index 0 is for monotonic and 1 is for the thread exit event +HANDLE timer_thread = NULL; +HANDLE timer_mutex = NULL; +struct timespec timer_tp; +volatile LONG request_count[2] = {0, 1}; // last one must be > 0 +HANDLE timer_request[2] = { NULL, NULL }; +HANDLE timer_response = NULL; +// API globals +#define CHECK_WINUSBX_AVAILABLE(sub_api) do { if (sub_api == SUB_API_NOTSET) sub_api = priv->sub_api; \ + if (!WinUSBX[sub_api].initialized) return LIBUSB_ERROR_ACCESS; } while(0) +static struct winusb_interface WinUSBX[SUB_API_MAX]; +const char* sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES; +bool api_hid_available = false; +#define CHECK_HID_AVAILABLE do { if (!api_hid_available) return LIBUSB_ERROR_ACCESS; } while (0) + +static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) { + if ((guid1 != NULL) && (guid2 != NULL)) { + return (memcmp(guid1, guid2, sizeof(GUID)) == 0); + } + return false; +} + +#if defined(ENABLE_LOGGING) +static char* guid_to_string(const GUID* guid) +{ + static char guid_string[MAX_GUID_STRING_LENGTH]; + + if (guid == NULL) return NULL; + sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + (unsigned int)guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); + return guid_string; +} +#endif + +/* + * Converts a windows error to human readable string + * uses retval as errorcode, or, if 0, use GetLastError() + */ +#if defined(ENABLE_LOGGING) +static char *windows_error_str(uint32_t retval) +{ +static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + ssize_t i; + uint32_t error_code, format_error; + + error_code = retval?retval:GetLastError(); + + safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code); + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], + ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); + if (size == 0) { + format_error = GetLastError(); + if (format_error) + safe_sprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", error_code, format_error); + else + safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); + } else { + // Remove CR/LF terminators + for (i=safe_strlen(err_string)-1; (i>=0) && ((err_string[i]==0x0A) || (err_string[i]==0x0D)); i--) { + err_string[i] = 0; + } + } + return err_string; +} +#endif + +/* + * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. + * Return an allocated sanitized string or NULL on error. + */ +static char* sanitize_path(const char* path) +{ + const char root_prefix[] = "\\\\.\\"; + size_t j, size, root_size; + char* ret_path = NULL; + size_t add_root = 0; + + if (path == NULL) + return NULL; + + size = safe_strlen(path)+1; + root_size = sizeof(root_prefix)-1; + + // Microsoft indiscriminatly uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. + if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) || + ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { + add_root = root_size; + size += add_root; + } + + if ((ret_path = (char*) calloc(size, 1)) == NULL) + return NULL; + + safe_strcpy(&ret_path[add_root], size-add_root, path); + + // Ensure consistancy with root prefix + for (j=0; jcbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return false; + } + return true; +} + +/* + * enumerate interfaces for a specific GUID + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * guid: the GUID for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID* guid, unsigned _index) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + DWORD size; + + if (_index <= 0) { + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + } + + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + + if ((dev_interface_details = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) calloc(size, 1)) == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, + dev_interface_details, size, &size, NULL)) { + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + } + + return dev_interface_details; + +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; +} + +/* For libusb0 filter */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID* guid, unsigned _index, char* filter_path){ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + DWORD size; + if (_index <= 0) { + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + } + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + if ((dev_interface_details = malloc(size)) == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, + dev_interface_details, size, &size, NULL)) { + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + } + // [trobinso] lookup the libusb0 symbolic index. + if (dev_interface_details) { + HKEY hkey_device_interface=pSetupDiOpenDeviceInterfaceRegKey(*dev_info,&dev_interface_data,0,KEY_READ); + if (hkey_device_interface != INVALID_HANDLE_VALUE) { + DWORD libusb0_symboliclink_index=0; + DWORD value_length=sizeof(DWORD); + DWORD value_type=0; + LONG status; + status = pRegQueryValueExW(hkey_device_interface, L"LUsb0", NULL, &value_type, + (LPBYTE) &libusb0_symboliclink_index, &value_length); + if (status == ERROR_SUCCESS) { + if (libusb0_symboliclink_index < 256) { + // libusb0.sys is connected to this device instance. + // If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter. + safe_sprintf(filter_path, sizeof("\\\\.\\libusb0-0000"), "\\\\.\\libusb0-%04d", libusb0_symboliclink_index); + usbi_dbg("assigned libusb0 symbolic link %s", filter_path); + } else { + // libusb0.sys was connected to this device instance at one time; but not anymore. + } + } + pRegCloseKey(hkey_device_interface); + } + } + return dev_interface_details; +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL;} + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ +typedef struct htab_entry { + unsigned long used; + char* str; +} htab_entry; +htab_entry* htab_table = NULL; +usbi_mutex_t htab_write_mutex = NULL; +unsigned long htab_size, htab_filled; + +/* For the used double hash method the table size has to be a prime. To + correct the user given table size we need a prime test. This trivial + algorithm is adequate because the code is called only during init and + the number is likely to be small */ +static int isprime(unsigned long number) +{ + // no even number will be passed + unsigned int divider = 3; + + while((divider * divider < number) && (number % divider != 0)) + divider += 2; + + return (number % divider != 0); +} + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +static int htab_create(struct libusb_context *ctx, unsigned long nel) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + } + + // Create a mutex + usbi_mutex_init(&htab_write_mutex, NULL); + + // Change nel to the first prime number not smaller as nel. + nel |= 1; + while(!isprime(nel)) + nel += 2; + + htab_size = nel; + usbi_dbg("using %d entries hash table", nel); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = (htab_entry*) calloc(htab_size + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return 0; + } + + return 1; +} + +/* After using the hash table it has to be destroyed. */ +static void htab_destroy(void) +{ + size_t i; + if (htab_table == NULL) { + return; + } + + for (i=0; i New entry + + // If the table is full return an error + if (htab_filled >= htab_size) { + usbi_err(NULL, "hash table is full (%d entries)", htab_size); + return 0; + } + + // Concurrent threads might be storing the same entry at the same time + // (eg. "simultaneous" enums from different threads) => use a mutex + usbi_mutex_lock(&htab_write_mutex); + // Just free any previously allocated string (which should be the same as + // new one). The possibility of concurrent threads storing a collision + // string (same hash, different string) at the same time is extremely low + safe_free(htab_table[idx].str); + htab_table[idx].used = hval; + htab_table[idx].str = (char*) malloc(safe_strlen(str)+1); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + usbi_mutex_unlock(&htab_write_mutex); + return 0; + } + memcpy(htab_table[idx].str, str, safe_strlen(str)+1); + ++htab_filled; + usbi_mutex_unlock(&htab_write_mutex); + + return idx; +} + +/* + * Returns the session ID of a device's nth level ancestor + * If there's no device at the nth level, return 0 + */ +static unsigned long get_ancestor_session_id(DWORD devinst, unsigned level) +{ + DWORD parent_devinst; + unsigned long session_id = 0; + char* sanitized_path = NULL; + char path[MAX_PATH_LENGTH]; + unsigned i; + + if (level < 1) return 0; + for (i = 0; idev); + struct libusb_config_descriptor *conf_desc; + const struct libusb_interface_descriptor *if_desc; + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + r = libusb_get_config_descriptor(dev_handle->dev, 0, &conf_desc); + if (r != LIBUSB_SUCCESS) { + usbi_warn(ctx, "could not read config descriptor: error %d", r); + return r; + } + + if_desc = &conf_desc->interface[iface].altsetting[altsetting]; + safe_free(priv->usb_interface[iface].endpoint); + + if (if_desc->bNumEndpoints == 0) { + usbi_dbg("no endpoints found for interface %d", iface); + return LIBUSB_SUCCESS; + } + + priv->usb_interface[iface].endpoint = (uint8_t*) malloc(if_desc->bNumEndpoints); + if (priv->usb_interface[iface].endpoint == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + + priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; + for (i=0; ibNumEndpoints; i++) { + priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; + usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); + } + libusb_free_config_descriptor(conf_desc); + + // Extra init may be required to configure endpoints + return priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface); +} + +// Lookup for a match in the list of API driver names +// return -1 if not found, driver match number otherwise +static int get_sub_api(char* driver, int api){ + int i; + const char sep_str[2] = {LIST_SEPARATOR, 0}; + char *tok, *tmp_str; + size_t len = safe_strlen(driver); + + if (len == 0) return SUB_API_NOTSET; + tmp_str = (char*) calloc(len+1, 1); + if (tmp_str == NULL) return SUB_API_NOTSET; + memcpy(tmp_str, driver, len+1); + tok = strtok(tmp_str, sep_str); + while (tok != NULL) { + for (i=0; idev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = *interface_number; + int r = LIBUSB_SUCCESS; + + switch(api_type) { + case USB_API_WINUSBX: + case USB_API_HID: + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + usbi_mutex_lock(&autoclaim_lock); + if (current_interface < 0) // No serviceable interface was found + { + for (current_interface=0; current_interfaceusb_interface[current_interface].apib->id == api_type) + && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS) ) { + usbi_dbg("auto-claimed interface %d for control request", current_interface); + if (handle_priv->autoclaim_count[current_interface] != 0) { + usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); + } + handle_priv->autoclaim_count[current_interface]++; + break; + } + } + if (current_interface == USB_MAXINTERFACES) { + usbi_err(ctx, "could not auto-claim any interface"); + r = LIBUSB_ERROR_NOT_FOUND; + } + } else { + // If we have a valid interface that was autoclaimed, we must increment + // its autoclaim count so that we can prevent an early release. + if (handle_priv->autoclaim_count[current_interface] != 0) { + handle_priv->autoclaim_count[current_interface]++; + } + } + usbi_mutex_unlock(&autoclaim_lock); + + *interface_number = current_interface; + return r; + +} + +static void auto_release(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + libusb_device_handle *dev_handle = transfer->dev_handle; + struct windows_device_handle_priv* handle_priv = _device_handle_priv(dev_handle); + int r; + + usbi_mutex_lock(&autoclaim_lock); + if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { + handle_priv->autoclaim_count[transfer_priv->interface_number]--; + if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { + r = libusb_release_interface(dev_handle, transfer_priv->interface_number); + if (r == LIBUSB_SUCCESS) { + usbi_dbg("auto-released interface %d", transfer_priv->interface_number); + } else { + usbi_dbg("failed to auto-release interface %d (%s)", + transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); + } + } + } + usbi_mutex_unlock(&autoclaim_lock); +} + +/* + * init: libusbx backend init function + * + * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list + * In our implementation, we equate Windows' "HCD" to libusbx's "bus". Note that bus is zero indexed. + * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?) + */ +static int windows_init(struct libusb_context *ctx) +{ + int i, r = LIBUSB_ERROR_OTHER; + OSVERSIONINFO os_version; + HANDLE semaphore; + char sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) + + sprintf(sem_name, "libusb_init%08X", (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_MEM; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore's release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); + CloseHandle(semaphore); + return LIBUSB_ERROR_NO_MEM; + } + + // NB: concurrent usage supposes that init calls are equally balanced with + // exit calls. If init is called more than exit, we will not exit properly + if ( ++concurrent_usage == 0 ) { // First init? + // Detect OS version + memset(&os_version, 0, sizeof(OSVERSIONINFO)); + os_version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + windows_version = WINDOWS_UNSUPPORTED; + if ((GetVersionEx(&os_version) != 0) && (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)) { + if ((os_version.dwMajorVersion == 5) && (os_version.dwMinorVersion == 1)) { + windows_version = WINDOWS_XP; + } else if ((os_version.dwMajorVersion == 5) && (os_version.dwMinorVersion == 2)) { + windows_version = WINDOWS_2003; // also includes XP 64 + } else if (os_version.dwMajorVersion >= 6) { + windows_version = WINDOWS_VISTA_AND_LATER; + } + } + if (windows_version == WINDOWS_UNSUPPORTED) { + usbi_err(ctx, "This version of Windows is NOT supported"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + // We need a lock for proper auto-release + usbi_mutex_init(&autoclaim_lock, NULL); + + // Initialize pollable file descriptors + init_polling(); + + // Load DLL imports + if (init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + return LIBUSB_ERROR_NOT_FOUND; + } + + // Initialize the low level APIs (we don't care about errors at this stage) + for (i=0; inum_configurations = 1; + priv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR); + priv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE; + priv->dev_descriptor.bNumConfigurations = 1; + priv->active_config = 1; + + if (priv->parent_dev == NULL) { + usbi_err(ctx, "program assertion failed - HCD hub has no parent"); + return LIBUSB_ERROR_NO_DEVICE; + } + parent_priv = _device_priv(priv->parent_dev); + if (sscanf(parent_priv->path, "\\\\.\\PCI#VEN_%04x&DEV_%04x%*s", &vid, &pid) == 2) { + priv->dev_descriptor.idVendor = (uint16_t)vid; + priv->dev_descriptor.idProduct = (uint16_t)pid; + } else { + usbi_warn(ctx, "could not infer VID/PID of HCD hub from '%s'", parent_priv->path); + priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub + priv->dev_descriptor.idProduct = 1; + } + return LIBUSB_SUCCESS; +} + +/* + * fetch and cache all the config descriptors through I/O + */ +static int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char* device_id) +{ + DWORD size, ret_size; + struct libusb_context *ctx = DEVICE_CTX(dev); + struct windows_device_priv *priv = _device_priv(dev); + int r; + uint8_t i; + + USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request + PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request + PUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL; + + if (dev->num_configurations == 0) + return LIBUSB_ERROR_INVALID_PARAM; + + priv->config_descriptor = (unsigned char**) calloc(dev->num_configurations, sizeof(unsigned char*)); + if (priv->config_descriptor == NULL) + return LIBUSB_ERROR_NO_MEM; + for (i=0; inum_configurations; i++) + priv->config_descriptor[i] = NULL; + + for (i=0, r=LIBUSB_SUCCESS; ; i++) + { + // safe loop: release all dynamic resources + safe_free(cd_buf_actual); + + // safe loop: end of loop condition + if ((i >= dev->num_configurations) || (r != LIBUSB_SUCCESS)) + break; + + size = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT); + memset(&cd_buf_short, 0, size); + + cd_buf_short.req.ConnectionIndex = (ULONG)priv->port; + cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_short.req.SetupPacket.wIndex = i; + cd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + // Dummy call to get the required data size. Initial failures are reported as info rather + // than error as they can occur for non-penalizing situations, such as with some hubs. + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, + &cd_buf_short, size, &ret_size, NULL)) { + usbi_info(ctx, "could not access configuration descriptor (dummy) for '%s': %s", device_id, windows_error_str(0)); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + if ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { + usbi_info(ctx, "unexpected configuration descriptor size (dummy) for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength; + if ((cd_buf_actual = (PUSB_DESCRIPTOR_REQUEST) calloc(1, size)) == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor buffer for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + memset(cd_buf_actual, 0, size); + + // Actual call + cd_buf_actual->ConnectionIndex = (ULONG)priv->port; + cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_actual->SetupPacket.wIndex = i; + cd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, + cd_buf_actual, size, &ret_size, NULL)) { + usbi_err(ctx, "could not access configuration descriptor (actual) for '%s': %s", device_id, windows_error_str(0)); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR*)cd_buf_actual+sizeof(USB_DESCRIPTOR_REQUEST)); + + if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) { + usbi_err(ctx, "unexpected configuration descriptor size (actual) for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + if (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) { + usbi_err(ctx, "not a configuration descriptor for '%s'", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + usbi_dbg("cached config descriptor %d (bConfigurationValue=%d, %d bytes)", + i, cd_data->bConfigurationValue, cd_data->wTotalLength); + + // Cache the descriptor + priv->config_descriptor[i] = (unsigned char*) malloc(cd_data->wTotalLength); + if (priv->config_descriptor[i] == NULL) + return LIBUSB_ERROR_NO_MEM; + memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); + } + return LIBUSB_SUCCESS; +} + +/* + * Populate a libusbx device structure + */ +static int init_device(struct libusb_device* dev, struct libusb_device* parent_dev, + uint8_t port_number, char* device_id, DWORD devinst) +{ + HANDLE handle; + DWORD size; + USB_NODE_CONNECTION_INFORMATION_EX conn_info; + struct windows_device_priv *priv, *parent_priv; + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device* tmp_dev; + unsigned i; + + if ((dev == NULL) || (parent_dev == NULL)) { + return LIBUSB_ERROR_NOT_FOUND; + } + priv = _device_priv(dev); + parent_priv = _device_priv(parent_dev); + if (parent_priv->apib->id != USB_API_HUB) { + usbi_warn(ctx, "parent for device '%s' is not a hub", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + // It is possible for the parent hub not to have been initialized yet + // If that's the case, lookup the ancestors to set the bus number + if (parent_dev->bus_number == 0) { + for (i=2; ; i++) { + tmp_dev = usbi_get_device_by_session_id(ctx, get_ancestor_session_id(devinst, i)); + if (tmp_dev == NULL) break; + if (tmp_dev->bus_number != 0) { + usbi_dbg("got bus number from ancestor #%d", i); + parent_dev->bus_number = tmp_dev->bus_number; + break; + } + } + } + if (parent_dev->bus_number == 0) { + usbi_err(ctx, "program assertion failed: unable to find ancestor bus number for '%s'", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + dev->bus_number = parent_dev->bus_number; + priv->port = port_number; + dev->port_number = port_number; + priv->depth = parent_priv->depth + 1; + priv->parent_dev = parent_dev; + dev->parent_dev = libusb_ref_device(parent_dev); + + // If the device address is already set, we can stop here + if (dev->device_address != 0) { + return LIBUSB_SUCCESS; + } + memset(&conn_info, 0, sizeof(conn_info)); + if (priv->depth != 0) { // Not a HCD hub + handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, NULL); + if (handle == INVALID_HANDLE_VALUE) { + usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + size = sizeof(conn_info); + conn_info.ConnectionIndex = (ULONG)port_number; + if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size, + &conn_info, size, &size, NULL)) { + usbi_warn(ctx, "could not get node connection information for device '%s': %s", + device_id, windows_error_str(0)); + safe_closehandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + if (conn_info.ConnectionStatus == NoDeviceConnected) { + usbi_err(ctx, "device '%s' is no longer connected!", device_id); + safe_closehandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); + dev->num_configurations = priv->dev_descriptor.bNumConfigurations; + priv->active_config = conn_info.CurrentConfigurationValue; + usbi_dbg("found %d configurations (active conf: %d)", dev->num_configurations, priv->active_config); + // If we can't read the config descriptors, just set the number of confs to zero + if (cache_config_descriptors(dev, handle, device_id) != LIBUSB_SUCCESS) { + dev->num_configurations = 0; + priv->dev_descriptor.bNumConfigurations = 0; + } + safe_closehandle(handle); + + if (conn_info.DeviceAddress > UINT8_MAX) { + usbi_err(ctx, "program assertion failed: device address overflow"); + } + dev->device_address = (uint8_t)conn_info.DeviceAddress + 1; + if (dev->device_address == 1) { + usbi_err(ctx, "program assertion failed: device address collision with root hub"); + } + switch (conn_info.Speed) { + case 0: dev->speed = LIBUSB_SPEED_LOW; break; + case 1: dev->speed = LIBUSB_SPEED_FULL; break; + case 2: dev->speed = LIBUSB_SPEED_HIGH; break; + case 3: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(ctx, "Got unknown device speed %d", conn_info.Speed); + break; + } + } else { + dev->device_address = 1; // root hubs are set to use device number 1 + force_hcd_device_descriptor(dev); + } + + usbi_sanitize_device(dev); + + usbi_dbg("(bus: %d, addr: %d, depth: %d, port: %d): '%s'", + dev->bus_number, dev->device_address, priv->depth, priv->port, device_id); + + return LIBUSB_SUCCESS; +} + +// Returns the api type, or 0 if not found/unsupported +static void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info, + SP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api) +{ + // Precedence for filter drivers vs driver is in the order of this array + struct driver_lookup lookup[3] = { + {"\0\0", SPDRP_SERVICE, "driver"}, + {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, + {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} + }; + DWORD size, reg_type; + unsigned k, l; + int i, j; + + *api = USB_API_UNSUPPORTED; + *sub_api = SUB_API_NOTSET; + // Check the service & filter names to know the API we should use + for (k=0; k<3; k++) { + if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, + ®_type, (BYTE*)lookup[k].list, MAX_KEY_LENGTH, &size)) { + // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ + if (lookup[k].reg_prop == SPDRP_SERVICE) { + // our buffers are MAX_KEY_LENGTH+1 so we can overflow if needed + lookup[k].list[safe_strlen(lookup[k].list)+1] = 0; + } + // MULTI_SZ is a pain to work with. Turn it into something much more manageable + // NB: none of the driver names we check against contain LIST_SEPARATOR, + // (currently ';'), so even if an unsuported one does, it's not an issue + for (l=0; (lookup[k].list[l] != 0) || (lookup[k].list[l+1] != 0); l++) { + if (lookup[k].list[l] == 0) { + lookup[k].list[l] = LIST_SEPARATOR; + } + } + usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); + } else { + if (GetLastError() != ERROR_INVALID_DATA) { + usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); + } + lookup[k].list[0] = 0; + } + } + + for (i=1; i= 0) { + usbi_dbg("matched %s name against %s API", + lookup[k].designation, (i!=USB_API_WINUSBX)?usb_api_backend[i].designation:sub_api_name[j]); + *api = i; + *sub_api = j; + return; + } + } + } +} + +static int set_composite_interface(struct libusb_context* ctx, struct libusb_device* dev, + char* dev_interface_path, char* device_id, int api, int sub_api) +{ + unsigned i; + struct windows_device_priv *priv = _device_priv(dev); + int interface_number; + + if (priv->apib->id != USB_API_COMPOSITE) { + usbi_err(ctx, "program assertion failed: '%s' is not composite", device_id); + return LIBUSB_ERROR_NO_DEVICE; + } + + // Because MI_## are not necessarily in sequential order (some composite + // devices will have only MI_00 & MI_03 for instance), we retrieve the actual + // interface number from the path's MI value + interface_number = 0; + for (i=0; device_id[i] != 0; ) { + if ( (device_id[i++] == 'M') && (device_id[i++] == 'I') + && (device_id[i++] == '_') ) { + interface_number = (device_id[i++] - '0')*10; + interface_number += device_id[i] - '0'; + break; + } + } + + if (device_id[i] == 0) { + usbi_warn(ctx, "failure to read interface number for %s. Using default value %d", + device_id, interface_number); + } + + if (priv->usb_interface[interface_number].path != NULL) { + if (api == USB_API_HID) { + // HID devices can have multiple collections (COL##) for each MI_## interface + usbi_dbg("interface[%d] already set - ignoring HID collection: %s", + interface_number, device_id); + return LIBUSB_ERROR_ACCESS; + } + // In other cases, just use the latest data + safe_free(priv->usb_interface[interface_number].path); + } + + usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); + priv->usb_interface[interface_number].path = dev_interface_path; + priv->usb_interface[interface_number].apib = &usb_api_backend[api]; + priv->usb_interface[interface_number].sub_api = sub_api; + if ((api == USB_API_HID) && (priv->hid == NULL)) { + priv->hid = (struct hid_device_priv*) calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) + return LIBUSB_ERROR_NO_MEM; + } + + return LIBUSB_SUCCESS; +} + +static int set_hid_interface(struct libusb_context* ctx, struct libusb_device* dev, + char* dev_interface_path) +{ + int i; + struct windows_device_priv *priv = _device_priv(dev); + + if (priv->hid == NULL) { + usbi_err(ctx, "program assertion failed: parent is not HID"); + return LIBUSB_ERROR_NO_DEVICE; + } + if (priv->hid->nb_interfaces == USB_MAXINTERFACES) { + usbi_err(ctx, "program assertion failed: max USB interfaces reached for HID device"); + return LIBUSB_ERROR_NO_DEVICE; + } + for (i=0; ihid->nb_interfaces; i++) { + if (safe_strcmp(priv->usb_interface[i].path, dev_interface_path) == 0) { + usbi_dbg("interface[%d] already set to %s", i, dev_interface_path); + return LIBUSB_SUCCESS; + } + } + + priv->usb_interface[priv->hid->nb_interfaces].path = dev_interface_path; + priv->usb_interface[priv->hid->nb_interfaces].apib = &usb_api_backend[USB_API_HID]; + usbi_dbg("interface[%d] = %s", priv->hid->nb_interfaces, dev_interface_path); + priv->hid->nb_interfaces++; + return LIBUSB_SUCCESS; +} + +/* + * get_device_list: libusbx backend device enumeration function + */ +static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + struct discovered_devs *discdevs; + HDEVINFO dev_info = { 0 }; + const char* usb_class[] = {"USB", "NUSB3", "IUSB3"}; + SP_DEVINFO_DATA dev_info_data = { 0 }; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + GUID hid_guid; +#define MAX_ENUM_GUIDS 64 + const GUID* guid[MAX_ENUM_GUIDS]; +#define HCD_PASS 0 +#define HUB_PASS 1 +#define GEN_PASS 2 +#define DEV_PASS 3 +#define HID_PASS 4 + int r = LIBUSB_SUCCESS; + int api, sub_api; + size_t class_index = 0; + unsigned int nb_guids, pass, i, j, ancestor; + char path[MAX_PATH_LENGTH]; + char strbuf[MAX_PATH_LENGTH]; + struct libusb_device *dev, *parent_dev; + struct windows_device_priv *priv, *parent_priv; + char* dev_interface_path = NULL; + char* dev_id_path = NULL; + unsigned long session_id; + DWORD size, reg_type, port_nr, install_state; + HKEY key; + WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; + GUID* if_guid; + LONG s; + // Keep a list of newly allocated devs to unref + libusb_device** unref_list; + unsigned int unref_size = 64; + unsigned int unref_cur = 0; + + // PASS 1 : (re)enumerate HCDs (allows for HCD hotplug) + // PASS 2 : (re)enumerate HUBS + // PASS 3 : (re)enumerate generic USB devices (including driverless) + // and list additional USB device interface GUIDs to explore + // PASS 4 : (re)enumerate master USB devices that have a device interface + // PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and + // set the device interfaces. + + // Init the GUID table + guid[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER; + guid[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB; + guid[GEN_PASS] = NULL; + guid[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE; + HidD_GetHidGuid(&hid_guid); + guid[HID_PASS] = &hid_guid; + nb_guids = HID_PASS+1; + + unref_list = (libusb_device**) calloc(unref_size, sizeof(libusb_device*)); + if (unref_list == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + + for (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) { +//#define ENUM_DEBUG +#ifdef ENUM_DEBUG + const char *passname[] = { "HCD", "HUB", "GEN", "DEV", "HID", "EXT" }; + usbi_dbg("\n#### PROCESSING %ss %s", passname[(pass<=HID_PASS)?pass:HID_PASS+1], + (pass!=GEN_PASS)?guid_to_string(guid[pass]):""); +#endif + for (i = 0; ; i++) { + // safe loop: free up any (unprotected) dynamic resource + // NB: this is always executed before breaking the loop + safe_free(dev_interface_details); + safe_free(dev_interface_path); + safe_free(dev_id_path); + priv = parent_priv = NULL; + dev = parent_dev = NULL; + + // Safe loop: end of loop conditions + if (r != LIBUSB_SUCCESS) { + break; + } + if ((pass == HCD_PASS) && (i == UINT8_MAX)) { + usbi_warn(ctx, "program assertion failed - found more than %d buses, skipping the rest.", UINT8_MAX); + break; + } + if (pass != GEN_PASS) { + // Except for GEN, all passes deal with device interfaces + dev_interface_details = get_interface_details(ctx, &dev_info, &dev_info_data, guid[pass], i); + if (dev_interface_details == NULL) { + break; + } else { + dev_interface_path = sanitize_path(dev_interface_details->DevicePath); + if (dev_interface_path == NULL) { + usbi_warn(ctx, "could not sanitize device interface path for '%s'", dev_interface_details->DevicePath); + continue; + } + } + } else { + // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are + // being listed under the "NUSB3" PnP Symbolic Name rather than "USB". + // The Intel USB 3.0 driver behaves similar, but uses "IUSB3" + for (; class_index < ARRAYSIZE(usb_class); class_index++) { + if (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i)) + break; + i = 0; + } + if (class_index >= ARRAYSIZE(usb_class)) + break; + } + + // Read the Device ID path. This is what we'll use as UID + // Note that if the device is plugged in a different port or hub, the Device ID changes + if (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) { + usbi_warn(ctx, "could not read the device id path for devinst %X, skipping", + dev_info_data.DevInst); + continue; + } + dev_id_path = sanitize_path(path); + if (dev_id_path == NULL) { + usbi_warn(ctx, "could not sanitize device id path for devinst %X, skipping", + dev_info_data.DevInst); + continue; + } +#ifdef ENUM_DEBUG + usbi_dbg("PRO: %s", dev_id_path); +#endif + + // The SPDRP_ADDRESS for USB devices is the device port number on the hub + port_nr = 0; + if ((pass >= HUB_PASS) && (pass <= GEN_PASS)) { + if ( (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS, + ®_type, (BYTE*)&port_nr, 4, &size)) + || (size != 4) ) { + usbi_warn(ctx, "could not retrieve port number for device '%s', skipping: %s", + dev_id_path, windows_error_str(0)); + continue; + } + } + + // Set API to use or get additional data from generic pass + api = USB_API_UNSUPPORTED; + sub_api = SUB_API_NOTSET; + switch (pass) { + case HCD_PASS: + break; + case GEN_PASS: + // We use the GEN pass to detect driverless devices... + size = sizeof(strbuf); + if (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER, + ®_type, (BYTE*)strbuf, size, &size)) { + usbi_info(ctx, "The following device has no driver: '%s'", dev_id_path); + usbi_info(ctx, "libusbx will not be able to access it."); + } + // ...and to add the additional device interface GUIDs + key = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + if (key != INVALID_HANDLE_VALUE) { + size = sizeof(guid_string_w); + s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, + (BYTE*)guid_string_w, &size); + pRegCloseKey(key); + if (s == ERROR_SUCCESS) { + if (nb_guids >= MAX_ENUM_GUIDS) { + // If this assert is ever reported, grow a GUID table dynamically + usbi_err(ctx, "program assertion failed: too many GUIDs"); + LOOP_BREAK(LIBUSB_ERROR_OVERFLOW); + } + if_guid = (GUID*) calloc(1, sizeof(GUID)); + pCLSIDFromString(guid_string_w, if_guid); + guid[nb_guids++] = if_guid; + usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); + } + } + break; + case HID_PASS: + api = USB_API_HID; + break; + default: + // Get the API type (after checking that the driver installation is OK) + if ( (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE, + ®_type, (BYTE*)&install_state, 4, &size)) + || (size != 4) ){ + usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", + dev_id_path, windows_error_str(0)); + } else if (install_state != 0) { + usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %d) - skipping", + dev_id_path, install_state); + continue; + } + get_api_type(ctx, &dev_info, &dev_info_data, &api, &sub_api); + break; + } + + // Find parent device (for the passes that need it) + switch (pass) { + case HCD_PASS: + case DEV_PASS: + case HUB_PASS: + break; + default: + // Go through the ancestors until we see a face we recognize + parent_dev = NULL; + for (ancestor = 1; parent_dev == NULL; ancestor++) { + session_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor); + if (session_id == 0) { + break; + } + parent_dev = usbi_get_device_by_session_id(ctx, session_id); + } + if (parent_dev == NULL) { + usbi_dbg("unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring", dev_id_path); + continue; + } + parent_priv = _device_priv(parent_dev); + // virtual USB devices are also listed during GEN - don't process these yet + if ( (pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB) ) { + continue; + } + break; + } + + // Create new or match existing device, using the (hashed) device_id as session id + if (pass <= DEV_PASS) { // For subsequent passes, we'll lookup the parent + // These are the passes that create "new" devices + session_id = htab_hash(dev_id_path); + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + if (pass == DEV_PASS) { + // This can occur if the OS only reports a newly plugged device after we started enum + usbi_warn(ctx, "'%s' was only detected in late pass (newly connected device?)" + " - ignoring", dev_id_path); + continue; + } + usbi_dbg("allocating new device for session [%X]", session_id); + if ((dev = usbi_alloc_device(ctx, session_id)) == NULL) { + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + windows_device_priv_init(dev); + // Keep track of devices that need unref + unref_list[unref_cur++] = dev; + if (unref_cur >= unref_size) { + unref_size += 64; + unref_list = usbi_reallocf(unref_list, unref_size*sizeof(libusb_device*)); + if (unref_list == NULL) { + usbi_err(ctx, "could not realloc list for unref - aborting."); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + } + } else { + usbi_dbg("found existing device for session [%X] (%d.%d)", + session_id, dev->bus_number, dev->device_address); + } + priv = _device_priv(dev); + } + + // Setup device + switch (pass) { + case HCD_PASS: + dev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected + dev->device_address = 0; + dev->num_configurations = 0; + priv->apib = &usb_api_backend[USB_API_HUB]; + priv->sub_api = SUB_API_NOTSET; + priv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs + priv->path = dev_interface_path; dev_interface_path = NULL; + break; + case HUB_PASS: + case DEV_PASS: + // If the device has already been setup, don't do it again + if (priv->path != NULL) + break; + // Take care of API initialization + priv->path = dev_interface_path; dev_interface_path = NULL; + priv->apib = &usb_api_backend[api]; + priv->sub_api = sub_api; + switch(api) { + case USB_API_COMPOSITE: + case USB_API_HUB: + break; + case USB_API_HID: + priv->hid = calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) { + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + priv->hid->nb_interfaces = 0; + break; + default: + // For other devices, the first interface is the same as the device + priv->usb_interface[0].path = (char*) calloc(safe_strlen(priv->path)+1, 1); + if (priv->usb_interface[0].path != NULL) { + safe_strcpy(priv->usb_interface[0].path, safe_strlen(priv->path)+1, priv->path); + } else { + usbi_warn(ctx, "could not duplicate interface path '%s'", priv->path); + } + // The following is needed if we want API calls to work for both simple + // and composite devices. + for(j=0; jusb_interface[j].apib = &usb_api_backend[api]; + } + break; + } + break; + case GEN_PASS: + r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst); + if (r == LIBUSB_SUCCESS) { + // Append device to the list of discovered devices + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) { + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + *_discdevs = discdevs; + } else if (r == LIBUSB_ERROR_NO_DEVICE) { + // This can occur if the device was disconnected but Windows hasn't + // refreshed its enumeration yet - in that case, we ignore the device + r = LIBUSB_SUCCESS; + } + break; + default: // HID_PASS and later + if (parent_priv->apib->id == USB_API_HID) { + usbi_dbg("setting HID interface for [%lX]:", parent_dev->session_data); + r = set_hid_interface(ctx, parent_dev, dev_interface_path); + if (r != LIBUSB_SUCCESS) LOOP_BREAK(r); + dev_interface_path = NULL; + } else if (parent_priv->apib->id == USB_API_COMPOSITE) { + usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); + switch (set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api, sub_api)) { + case LIBUSB_SUCCESS: + dev_interface_path = NULL; + break; + case LIBUSB_ERROR_ACCESS: + // interface has already been set => make sure dev_interface_path is freed then + break; + default: + LOOP_BREAK(r); + break; + } + } + break; + } + } + } + + // Free any additional GUIDs + for (pass = HID_PASS+1; pass < nb_guids; pass++) { + safe_free(guid[pass]); + } + + // Unref newly allocated devs + for (i=0; i any concurent wait stalls until the semaphore release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + CloseHandle(semaphore); + return; + } + + // Only works if exits and inits are balanced exactly + if (--concurrent_usage < 0) { // Last exit + for (i=0; idev_descriptor), DEVICE_DESC_LENGTH); + *host_endian = 0; + + return LIBUSB_SUCCESS; +} + +static int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + // config index is zero based + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) + return LIBUSB_ERROR_NOT_FOUND; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index]; + + size = min(config_header->wTotalLength, len); + memcpy(buffer, priv->config_descriptor[config_index], size); + *host_endian = 0; + + return size; +} + +/* + * return the cached copy of the active config descriptor + */ +static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + + if (priv->active_config == 0) + return LIBUSB_ERROR_NOT_FOUND; + + // config index is zero based + return windows_get_config_descriptor(dev, (uint8_t)(priv->active_config-1), buffer, len, host_endian); +} + +static int windows_open(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + if (priv->apib == NULL) { + usbi_err(ctx, "program assertion failed - device is not initialized"); + return LIBUSB_ERROR_NO_DEVICE; + } + + return priv->apib->open(SUB_API_NOTSET, dev_handle); +} + +static void windows_close(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + priv->apib->close(SUB_API_NOTSET, dev_handle); +} + +static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + if (priv->active_config == 0) { + *config = 0; + return LIBUSB_ERROR_NOT_FOUND; + } + + *config = priv->active_config; + return LIBUSB_SUCCESS; +} + +/* + * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver + * does not currently expose a service that allows higher-level drivers to set + * the configuration." + */ +static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_SUCCESS; + + if (config >= USB_MAXCONFIG) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | + LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, + LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, + 0, NULL, 0, 1000); + + if (r == LIBUSB_SUCCESS) { + priv->active_config = (uint8_t)config; + } + return r; +} + +static int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + if (iface >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints= 0; + + r = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface); + + if (r == LIBUSB_SUCCESS) { + r = windows_assign_endpoints(dev_handle, iface, 0); + } + + return r; +} + +static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints= 0; + + r = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting); + + if (r == LIBUSB_SUCCESS) { + r = windows_assign_endpoints(dev_handle, iface, altsetting); + } + + return r; +} + +static int windows_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface); +} + +static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint); +} + +static int windows_reset_device(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->reset_device(SUB_API_NOTSET, dev_handle); +} + +// The 3 functions below are unlikely to ever get supported on Windows +static int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void windows_destroy_device(struct libusb_device *dev) +{ + windows_device_priv_release(dev); +} + +static void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + + usbi_free_fd(&transfer_priv->pollable_fd); + safe_free(transfer_priv->hid_buffer); + // When auto claim is in use, attempt to release the auto-claimed interface + auto_release(itransfer); +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_bulk_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + itransfer->flags |= USBI_TRANSFER_UPDATED_FDS; + return LIBUSB_SUCCESS; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_iso_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + itransfer->flags |= USBI_TRANSFER_UPDATED_FDS; + return LIBUSB_SUCCESS; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_control_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); + + itransfer->flags |= USBI_TRANSFER_UPDATED_FDS; + return LIBUSB_SUCCESS; + +} + +static int windows_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + return LIBUSB_ERROR_NOT_SUPPORTED; + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int windows_abort_control(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_control(SUB_API_NOTSET, itransfer); +} + +static int windows_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer); +} + +static int windows_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return windows_abort_control(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return windows_abort_transfers(itransfer); + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int status, istatus; + + usbi_dbg("handling I/O completion with errcode %d, size %d", io_result, io_size); + + switch(io_result) { + case NO_ERROR: + status = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + istatus = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); + if (istatus != LIBUSB_TRANSFER_COMPLETED) { + usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); + } + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + } else { + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + } + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %d: %s", io_result, windows_error_str(0)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + windows_clear_transfer_priv(itransfer); // Cancel polling + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +static void windows_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + windows_transfer_callback (itransfer, io_result, io_size); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + struct windows_transfer_priv* transfer_priv = NULL; + POLL_NFDS_TYPE i = 0; + bool found = false; + struct usbi_transfer *transfer; + DWORD io_size, io_result; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) { + continue; + } + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + transfer_priv = usbi_transfer_get_os_priv(transfer); + if (transfer_priv->pollable_fd.fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + // Handle async requests that completed synchronously first + if (HasOverlappedIoCompletedSync(transfer_priv->pollable_fd.overlapped)) { + io_result = NO_ERROR; + io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; + // Regular async overlapped + } else if (GetOverlappedResult(transfer_priv->pollable_fd.handle, + transfer_priv->pollable_fd.overlapped, &io_size, false)) { + io_result = NO_ERROR; + } else { + io_result = GetLastError(); + } + usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + windows_handle_callback(transfer, io_result, io_size); + } else { + usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + return LIBUSB_SUCCESS; +} + +/* + * Monotonic and real time functions + */ +unsigned __stdcall windows_clock_gettime_threaded(void* param) +{ + LARGE_INTEGER hires_counter, li_frequency; + LONG nb_responses; + int timer_index; + + // Init - find out if we have access to a monotonic (hires) timer + if (!QueryPerformanceFrequency(&li_frequency)) { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } else { + hires_frequency = li_frequency.QuadPart; + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + } + + // Main loop - wait for requests + while (1) { + timer_index = WaitForMultipleObjects(2, timer_request, FALSE, INFINITE) - WAIT_OBJECT_0; + if ( (timer_index != 0) && (timer_index != 1) ) { + usbi_dbg("failure to wait on requests: %s", windows_error_str(0)); + continue; + } + if (request_count[timer_index] == 0) { + // Request already handled + ResetEvent(timer_request[timer_index]); + // There's still a possiblity that a thread sends a request between the + // time we test request_count[] == 0 and we reset the event, in which case + // the request would be ignored. The simple solution to that is to test + // request_count again and process requests if non zero. + if (request_count[timer_index] == 0) + continue; + } + switch (timer_index) { + case 0: + WaitForSingleObject(timer_mutex, INFINITE); + // Requests to this thread are for hires always + if (QueryPerformanceCounter(&hires_counter) != 0) { + timer_tp.tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + timer_tp.tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps); + } else { + // Fallback to real-time if we can't get monotonic value + // Note that real-time clock does not wait on the mutex or this thread. + windows_clock_gettime(USBI_CLOCK_REALTIME, &timer_tp); + } + ReleaseMutex(timer_mutex); + + nb_responses = InterlockedExchange((LONG*)&request_count[0], 0); + if ( (nb_responses) + && (ReleaseSemaphore(timer_response, nb_responses, NULL) == 0) ) { + usbi_dbg("unable to release timer semaphore %d: %s", windows_error_str(0)); + } + continue; + case 1: // time to quit + usbi_dbg("timer thread quitting"); + return 0; + } + } +} + +static int windows_clock_gettime(int clk_id, struct timespec *tp) +{ + FILETIME filetime; + ULARGE_INTEGER rtime; + DWORD r; + switch(clk_id) { + case USBI_CLOCK_MONOTONIC: + if (hires_frequency != 0) { + while (1) { + InterlockedIncrement((LONG*)&request_count[0]); + SetEvent(timer_request[0]); + r = WaitForSingleObject(timer_response, TIMER_REQUEST_RETRY_MS); + switch(r) { + case WAIT_OBJECT_0: + WaitForSingleObject(timer_mutex, INFINITE); + *tp = timer_tp; + ReleaseMutex(timer_mutex); + return LIBUSB_SUCCESS; + case WAIT_TIMEOUT: + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + break; // Retry until successful + default: + usbi_dbg("WaitForSingleObject failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + } + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + + +// NB: MSVC6 does not support named initializers. +const struct usbi_os_backend windows_backend = { + "Windows", + USBI_CAP_HAS_HID_ACCESS, + windows_init, + windows_exit, + + windows_get_device_list, + NULL, /* hotplug_poll */ + windows_open, + windows_close, + + windows_get_device_descriptor, + windows_get_active_config_descriptor, + windows_get_config_descriptor, + NULL, /* get_config_descriptor_by_value() */ + + windows_get_configuration, + windows_set_configuration, + windows_claim_interface, + windows_release_interface, + + windows_set_interface_altsetting, + windows_clear_halt, + windows_reset_device, + + windows_kernel_driver_active, + windows_detach_kernel_driver, + windows_attach_kernel_driver, + + windows_destroy_device, + + windows_submit_transfer, + windows_cancel_transfer, + windows_clear_transfer_priv, + + windows_handle_events, + + windows_clock_gettime, +#if defined(USBI_TIMERFD_AVAILABLE) + NULL, +#endif + sizeof(struct windows_device_priv), + sizeof(struct windows_device_handle_priv), + sizeof(struct windows_transfer_priv), + 0, +}; + + +/* + * USB API backends + */ +static int unsupported_init(int sub_api, struct libusb_context *ctx) { + return LIBUSB_SUCCESS; +} +static int unsupported_exit(int sub_api) { + return LIBUSB_SUCCESS; +} +static int unsupported_open(int sub_api, struct libusb_device_handle *dev_handle) { + PRINT_UNSUPPORTED_API(open); +} +static void unsupported_close(int sub_api, struct libusb_device_handle *dev_handle) { + usbi_dbg("unsupported API call for 'close'"); +} +static int unsupported_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) { + PRINT_UNSUPPORTED_API(configure_endpoints); +} +static int unsupported_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) { + PRINT_UNSUPPORTED_API(claim_interface); +} +static int unsupported_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) { + PRINT_UNSUPPORTED_API(set_interface_altsetting); +} +static int unsupported_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) { + PRINT_UNSUPPORTED_API(release_interface); +} +static int unsupported_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) { + PRINT_UNSUPPORTED_API(clear_halt); +} +static int unsupported_reset_device(int sub_api, struct libusb_device_handle *dev_handle) { + PRINT_UNSUPPORTED_API(reset_device); +} +static int unsupported_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_bulk_transfer); +} +static int unsupported_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_iso_transfer); +} +static int unsupported_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_control_transfer); +} +static int unsupported_abort_control(int sub_api, struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(abort_control); +} +static int unsupported_abort_transfers(int sub_api, struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(abort_transfers); +} +static int unsupported_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) { + PRINT_UNSUPPORTED_API(copy_transfer_data); +} +static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) { + return LIBUSB_SUCCESS; +} +// These names must be uppercase +const char* hub_driver_names[] = {"USBHUB", "USBHUB3", "NUSB3HUB", "RUSB3HUB", "FLXHCIH", "TIHUB3", "ETRONHUB3", "VIAHUB3", "ASMTHUB3", "IUSB3HUB"}; +const char* composite_driver_names[] = {"USBCCGP"}; +const char* winusbx_driver_names[] = WINUSBX_DRV_NAMES; +const char* hid_driver_names[] = {"HIDUSB", "MOUHID", "KBDHID"}; +const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { + { + USB_API_UNSUPPORTED, + "Unsupported API", + NULL, + 0, + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_configure_endpoints, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, { + USB_API_HUB, + "HUB API", + hub_driver_names, + ARRAYSIZE(hub_driver_names), + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_configure_endpoints, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, { + USB_API_COMPOSITE, + "Composite API", + composite_driver_names, + ARRAYSIZE(composite_driver_names), + composite_init, + composite_exit, + composite_open, + composite_close, + common_configure_endpoints, + composite_claim_interface, + composite_set_interface_altsetting, + composite_release_interface, + composite_clear_halt, + composite_reset_device, + composite_submit_bulk_transfer, + composite_submit_iso_transfer, + composite_submit_control_transfer, + composite_abort_control, + composite_abort_transfers, + composite_copy_transfer_data, + }, { + USB_API_WINUSBX, + "WinUSB-like APIs", + winusbx_driver_names, + ARRAYSIZE(winusbx_driver_names), + winusbx_init, + winusbx_exit, + winusbx_open, + winusbx_close, + winusbx_configure_endpoints, + winusbx_claim_interface, + winusbx_set_interface_altsetting, + winusbx_release_interface, + winusbx_clear_halt, + winusbx_reset_device, + winusbx_submit_bulk_transfer, + unsupported_submit_iso_transfer, + winusbx_submit_control_transfer, + winusbx_abort_control, + winusbx_abort_transfers, + winusbx_copy_transfer_data, + }, { + USB_API_HID, + "HID API", + hid_driver_names, + ARRAYSIZE(hid_driver_names), + hid_init, + hid_exit, + hid_open, + hid_close, + common_configure_endpoints, + hid_claim_interface, + hid_set_interface_altsetting, + hid_release_interface, + hid_clear_halt, + hid_reset_device, + hid_submit_bulk_transfer, + unsupported_submit_iso_transfer, + hid_submit_control_transfer, + hid_abort_transfers, + hid_abort_transfers, + hid_copy_transfer_data, + }, +}; + + +/* + * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions + */ +#define WinUSBX_Set(fn) do { if (native_winusb) WinUSBX[i].fn = (WinUsb_##fn##_t) GetProcAddress(h, "WinUsb_" #fn); \ + else pLibK_GetProcAddress((PVOID*)&WinUSBX[i].fn, i, KUSB_FNID_##fn); } while (0) + +static int winusbx_init(int sub_api, struct libusb_context *ctx) +{ + HMODULE h = NULL; + bool native_winusb = false; + int i; + KLIB_VERSION LibK_Version; + LibK_GetProcAddress_t pLibK_GetProcAddress = NULL; + LibK_GetVersion_t pLibK_GetVersion = NULL; + + h = GetModuleHandleA("libusbK"); + if (h == NULL) { + h = LoadLibraryA("libusbK"); + } + if (h == NULL) { + usbi_info(ctx, "libusbK DLL is not available, will use native WinUSB"); + h = GetModuleHandleA("WinUSB"); + if (h == NULL) { + h = LoadLibraryA("WinUSB"); + } if (h == NULL) { + usbi_warn(ctx, "WinUSB DLL is not available either,\n" + "you will not be able to access devices outside of enumeration"); + return LIBUSB_ERROR_NOT_FOUND; + } + } else { + usbi_dbg("using libusbK DLL for universal access"); + pLibK_GetVersion = (LibK_GetVersion_t) GetProcAddress(h, "LibK_GetVersion"); + if (pLibK_GetVersion != NULL) { + pLibK_GetVersion(&LibK_Version); + usbi_dbg("libusbK version: %d.%d.%d.%d", LibK_Version.Major, LibK_Version.Minor, + LibK_Version.Micro, LibK_Version.Nano); + } + pLibK_GetProcAddress = (LibK_GetProcAddress_t) GetProcAddress(h, "LibK_GetProcAddress"); + if (pLibK_GetProcAddress == NULL) { + usbi_err(ctx, "LibK_GetProcAddress() not found in libusbK DLL"); + return LIBUSB_ERROR_NOT_FOUND; + } + } + native_winusb = (pLibK_GetProcAddress == NULL); + for (i=SUB_API_LIBUSBK; idev); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + + HANDLE file_handle; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // WinUSB requires a seperate handle for each interface + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ( (priv->usb_interface[i].path != NULL) + && (priv->usb_interface[i].apib->id == USB_API_WINUSBX) ) { + file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); + switch(GetLastError()) { + case ERROR_FILE_NOT_FOUND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ACCESS_DENIED: + return LIBUSB_ERROR_ACCESS; + default: + return LIBUSB_ERROR_IO; + } + } + handle_priv->interface_handle[i].dev_handle = file_handle; + } + } + + return LIBUSB_SUCCESS; +} + +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE file_handle; + int i; + + if (sub_api == SUB_API_NOTSET) + sub_api = priv->sub_api; + if (!WinUSBX[sub_api].initialized) + return; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (priv->usb_interface[i].apib->id == USB_API_WINUSBX) { + file_handle = handle_priv->interface_handle[i].dev_handle; + if ( (file_handle != 0) && (file_handle != INVALID_HANDLE_VALUE)) { + CloseHandle(file_handle); + } + } + } +} + +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; + UCHAR policy; + ULONG timeout = 0; + uint8_t endpoint_address; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // With handle and enpoints set (in parent), we can setup the default pipe properties + // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx + for (i=-1; iusb_interface[iface].nb_endpoints; i++) { + endpoint_address =(i==-1)?0:priv->usb_interface[iface].endpoint[i]; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) { + usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); + } + if ((i == -1) || (sub_api == SUB_API_LIBUSB0)) { + continue; // Other policies don't apply to control endpoint or libusb0 + } + policy = false; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); + } + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); + } + policy = true; + /* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See: + https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */ + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to enable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); + } + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); + } + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); + HANDLE file_handle, winusb_handle; + DWORD err; + int i; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + HDEVINFO dev_info = INVALID_HANDLE_VALUE; + SP_DEVINFO_DATA dev_info_data; + char* dev_path_no_guid = NULL; + char filter_path[] = "\\\\.\\libusb0-0000"; + bool found_filter = false; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // If the device is composite, but using the default Windows composite parent driver (usbccgp) + // or if it's the first WinUSB-like interface, we get a handle through Initialize(). + if ((is_using_usbccgp) || (iface == 0)) { + // composite device (independent interfaces) or interface 0 + file_handle = handle_priv->interface_handle[iface].dev_handle; + if ((file_handle == 0) || (file_handle == INVALID_HANDLE_VALUE)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + err = GetLastError(); + switch(err) { + case ERROR_BAD_COMMAND: + // The device was disconnected + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + default: + // it may be that we're using the libusb0 filter driver. + // TODO: can we move this whole business into the K/0 DLL? + for (i = 0; ; i++) { + safe_free(dev_interface_details); + safe_free(dev_path_no_guid); + dev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path); + if ((found_filter) || (dev_interface_details == NULL)) { + break; + } + // ignore GUID part + dev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, "{")); + if (safe_strncmp(dev_path_no_guid, priv->usb_interface[iface].path, safe_strlen(dev_path_no_guid)) == 0) { + file_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s: %s", filter_path, windows_error_str(0)); + } else { + WinUSBX[sub_api].Free(winusb_handle); + if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + continue; + } + found_filter = true; + break; + } + } + } + if (!found_filter) { + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(err)); + return LIBUSB_ERROR_ACCESS; + } + } + } + handle_priv->interface_handle[iface].api_handle = winusb_handle; + } else { + // For all other interfaces, use GetAssociatedInterface() + winusb_handle = handle_priv->interface_handle[0].api_handle; + // It is a requirement for multiple interface devices on Windows that, to you + // must first claim the first interface before you claim the others + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + file_handle = handle_priv->interface_handle[0].dev_handle; + if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[0].api_handle = winusb_handle; + usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); + } else { + usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB): %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + if (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface-1), + &handle_priv->interface_handle[iface].api_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + switch(GetLastError()) { + case ERROR_NO_MORE_ITEMS: // invalid iface + return LIBUSB_ERROR_NOT_FOUND; + case ERROR_BAD_COMMAND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ALREADY_EXISTS: // already claimed + return LIBUSB_ERROR_BUSY; + default: + usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + } + usbi_dbg("claimed interface %d", iface); + handle_priv->active_interface = iface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + WinUSBX[sub_api].Free(winusb_handle); + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + + return LIBUSB_SUCCESS; +} + +/* + * Return the first valid interface (of the same API type), for control transfers + */ +static int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int i; + + if ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) { + usbi_dbg("unsupported API ID"); + return -1; + } + + for (i=0; iinterface_handle[i].dev_handle != 0) + && (handle_priv->interface_handle[i].dev_handle != INVALID_HANDLE_VALUE) + && (handle_priv->interface_handle[i].api_handle != 0) + && (handle_priv->interface_handle[i].api_handle != INVALID_HANDLE_VALUE) + && (priv->usb_interface[i].apib->id == api_id) ) { + return i; + } + } + return -1; +} + +/* + * Lookup interface by endpoint address. -1 if not found + */ +static int interface_by_endpoint(struct windows_device_priv *priv, + struct windows_device_handle_priv *handle_priv, uint8_t endpoint_address) +{ + int i, j; + for (i=0; iinterface_handle[i].api_handle == INVALID_HANDLE_VALUE) + continue; + if (handle_priv->interface_handle[i].api_handle == 0) + continue; + if (priv->usb_interface[i].endpoint == NULL) + continue; + for (j=0; jusb_interface[i].nb_endpoints; j++) { + if (priv->usb_interface[i].endpoint[j] == endpoint_address) { + return i; + } + } + } + return -1; +} + +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *) transfer->buffer; + ULONG size; + HANDLE winusb_handle; + int current_interface; + struct winfd wfd; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + transfer_priv->pollable_fd = INVALID_WINFD; + size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + if (size > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + current_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX); + if (current_interface < 0) { + if (auto_claim(transfer, ¤t_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS) { + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_dbg("will use interface %d", current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, RW_READ, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + // Sending of set configuration control requests from WinUSB creates issues + if ( ((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD) + && (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION) ) { + if (setup->value != priv->active_config) { + usbi_warn(ctx, "cannot set configuration other than the default one"); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_INVALID_PARAM; + } + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = 0; + } else { + if (!WinUSBX[sub_api].ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) { + if(GetLastError() != ERROR_IO_PENDING) { + usbi_warn(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)size; + } + } + + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + if (altsetting > 255) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + usbi_err(ctx, "interface must be claimed first"); + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { + usbi_err(ctx, "SetCurrentAlternateSetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + bool ret; + int current_interface; + struct winfd wfd; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + transfer_priv->pollable_fd = INVALID_WINFD; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + usbi_dbg("reading %d bytes", transfer->length); + ret = WinUSBX[sub_api].ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } else { + usbi_dbg("writing %d bytes", transfer->length); + ret = WinUSBX[sub_api].WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } + if (!ret) { + if(GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)transfer->length; + } + + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed + * through testing as well): + * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel + * the control transfer using CancelIo" + */ +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + // Cancelling of the I/O is done in the parent + return LIBUSB_SUCCESS; +} + +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = transfer_priv->interface_number; + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(ctx, "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_dbg("will use interface %d", current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUSBX[sub_api].AbortPipe(winusb_handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper + * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): + * "WinUSB does not support host-initiated reset port and cycle port operations" and + * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the + * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is + * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) + */ +// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct winfd wfd; + HANDLE winusb_handle; + int i, j; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // Reset any available pipe (except control) + for (i=0; iinterface_handle[i].api_handle; + for (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0;) + { + // Cancel any pollable I/O + usbi_remove_pollfd(ctx, wfd.fd); + usbi_free_fd(&wfd); + wfd = handle_to_winfd(winusb_handle); + } + + if ( (winusb_handle != 0) && (winusb_handle != INVALID_HANDLE_VALUE)) { + for (j=0; jusb_interface[i].nb_endpoints; j++) { + usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); + if (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) { + usbi_err(ctx, "AbortPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + // FlushPipe seems to fail on OUT pipes + if (IS_EPIN(priv->usb_interface[i].endpoint[j]) + && (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) ) { + usbi_err(ctx, "FlushPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) { + usbi_err(ctx, "ResetPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + } + } + } + + // libusbK & libusb0 have the ability to issue an actual device reset + if (WinUSBX[sub_api].ResetDevice != NULL) { + winusb_handle = handle_priv->interface_handle[0].api_handle; + if ( (winusb_handle != 0) && (winusb_handle != INVALID_HANDLE_VALUE)) { + WinUSBX[sub_api].ResetDevice(winusb_handle); + } + } + return LIBUSB_SUCCESS; +} + +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +/* + * Internal HID Support functions (from libusb-win32) + * Note that functions that complete data transfer synchronously must return + * LIBUSB_COMPLETED instead of LIBUSB_SUCCESS + */ +static int _hid_get_hid_descriptor(struct hid_device_priv* dev, void *data, size_t *size); +static int _hid_get_report_descriptor(struct hid_device_priv* dev, void *data, size_t *size); + +static int _hid_wcslen(WCHAR *str) +{ + int i = 0; + while (str[i] && (str[i] != 0x409)) { + i++; + } + return i; +} + +static int _hid_get_device_descriptor(struct hid_device_priv* dev, void *data, size_t *size) +{ + struct libusb_device_descriptor d; + + d.bLength = LIBUSB_DT_DEVICE_SIZE; + d.bDescriptorType = LIBUSB_DT_DEVICE; + d.bcdUSB = 0x0200; /* 2.00 */ + d.bDeviceClass = 0; + d.bDeviceSubClass = 0; + d.bDeviceProtocol = 0; + d.bMaxPacketSize0 = 64; /* fix this! */ + d.idVendor = (uint16_t)dev->vid; + d.idProduct = (uint16_t)dev->pid; + d.bcdDevice = 0x0100; + d.iManufacturer = dev->string_index[0]; + d.iProduct = dev->string_index[1]; + d.iSerialNumber = dev->string_index[2]; + d.bNumConfigurations = 1; + + if (*size > LIBUSB_DT_DEVICE_SIZE) + *size = LIBUSB_DT_DEVICE_SIZE; + memcpy(data, &d, *size); + return LIBUSB_COMPLETED; +} + +static int _hid_get_config_descriptor(struct hid_device_priv* dev, void *data, size_t *size) +{ + char num_endpoints = 0; + size_t config_total_len = 0; + char tmp[HID_MAX_CONFIG_DESC_SIZE]; + struct libusb_config_descriptor *cd; + struct libusb_interface_descriptor *id; + struct libusb_hid_descriptor *hd; + struct libusb_endpoint_descriptor *ed; + size_t tmp_size; + + if (dev->input_report_size) + num_endpoints++; + if (dev->output_report_size) + num_endpoints++; + + config_total_len = LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE + + LIBUSB_DT_HID_SIZE + num_endpoints * LIBUSB_DT_ENDPOINT_SIZE; + + + cd = (struct libusb_config_descriptor *)tmp; + id = (struct libusb_interface_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE); + hd = (struct libusb_hid_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE + + LIBUSB_DT_INTERFACE_SIZE); + ed = (struct libusb_endpoint_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE + + LIBUSB_DT_INTERFACE_SIZE + + LIBUSB_DT_HID_SIZE); + + cd->bLength = LIBUSB_DT_CONFIG_SIZE; + cd->bDescriptorType = LIBUSB_DT_CONFIG; + cd->wTotalLength = (uint16_t) config_total_len; + cd->bNumInterfaces = 1; + cd->bConfigurationValue = 1; + cd->iConfiguration = 0; + cd->bmAttributes = 1 << 7; /* bus powered */ + cd->MaxPower = 50; + + id->bLength = LIBUSB_DT_INTERFACE_SIZE; + id->bDescriptorType = LIBUSB_DT_INTERFACE; + id->bInterfaceNumber = 0; + id->bAlternateSetting = 0; + id->bNumEndpoints = num_endpoints; + id->bInterfaceClass = 3; + id->bInterfaceSubClass = 0; + id->bInterfaceProtocol = 0; + id->iInterface = 0; + + tmp_size = LIBUSB_DT_HID_SIZE; + _hid_get_hid_descriptor(dev, hd, &tmp_size); + + if (dev->input_report_size) { + ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; + ed->bDescriptorType = LIBUSB_DT_ENDPOINT; + ed->bEndpointAddress = HID_IN_EP; + ed->bmAttributes = 3; + ed->wMaxPacketSize = dev->input_report_size - 1; + ed->bInterval = 10; + ed = (struct libusb_endpoint_descriptor *)((char*)ed + LIBUSB_DT_ENDPOINT_SIZE); + } + + if (dev->output_report_size) { + ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; + ed->bDescriptorType = LIBUSB_DT_ENDPOINT; + ed->bEndpointAddress = HID_OUT_EP; + ed->bmAttributes = 3; + ed->wMaxPacketSize = dev->output_report_size - 1; + ed->bInterval = 10; + } + + if (*size > config_total_len) + *size = config_total_len; + memcpy(data, tmp, *size); + return LIBUSB_COMPLETED; +} + +static int _hid_get_string_descriptor(struct hid_device_priv* dev, int _index, + void *data, size_t *size) +{ + void *tmp = NULL; + size_t tmp_size = 0; + int i; + + /* language ID, EN-US */ + char string_langid[] = { + 0x09, + 0x04 + }; + + if ((*size < 2) || (*size > 255)) { + return LIBUSB_ERROR_OVERFLOW; + } + + if (_index == 0) { + tmp = string_langid; + tmp_size = sizeof(string_langid)+2; + } else { + for (i=0; i<3; i++) { + if (_index == (dev->string_index[i])) { + tmp = dev->string[i]; + tmp_size = (_hid_wcslen(dev->string[i])+1) * sizeof(WCHAR); + break; + } + } + if (i == 3) { // not found + return LIBUSB_ERROR_INVALID_PARAM; + } + } + + if(!tmp_size) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (tmp_size < *size) { + *size = tmp_size; + } + // 2 byte header + ((uint8_t*)data)[0] = (uint8_t)*size; + ((uint8_t*)data)[1] = LIBUSB_DT_STRING; + memcpy((uint8_t*)data+2, tmp, *size-2); + return LIBUSB_COMPLETED; +} + +static int _hid_get_hid_descriptor(struct hid_device_priv* dev, void *data, size_t *size) +{ + struct libusb_hid_descriptor d; + uint8_t tmp[MAX_HID_DESCRIPTOR_SIZE]; + size_t report_len = MAX_HID_DESCRIPTOR_SIZE; + + _hid_get_report_descriptor(dev, tmp, &report_len); + + d.bLength = LIBUSB_DT_HID_SIZE; + d.bDescriptorType = LIBUSB_DT_HID; + d.bcdHID = 0x0110; /* 1.10 */ + d.bCountryCode = 0; + d.bNumDescriptors = 1; + d.bClassDescriptorType = LIBUSB_DT_REPORT; + d.wClassDescriptorLength = (uint16_t)report_len; + + if (*size > LIBUSB_DT_HID_SIZE) + *size = LIBUSB_DT_HID_SIZE; + memcpy(data, &d, *size); + return LIBUSB_COMPLETED; +} + +static int _hid_get_report_descriptor(struct hid_device_priv* dev, void *data, size_t *size) +{ + uint8_t d[MAX_HID_DESCRIPTOR_SIZE]; + size_t i = 0; + + /* usage page (0xFFA0 == vendor defined) */ + d[i++] = 0x06; d[i++] = 0xA0; d[i++] = 0xFF; + /* usage (vendor defined) */ + d[i++] = 0x09; d[i++] = 0x01; + /* start collection (application) */ + d[i++] = 0xA1; d[i++] = 0x01; + /* input report */ + if (dev->input_report_size) { + /* usage (vendor defined) */ + d[i++] = 0x09; d[i++] = 0x01; + /* logical minimum (0) */ + d[i++] = 0x15; d[i++] = 0x00; + /* logical maximum (255) */ + d[i++] = 0x25; d[i++] = 0xFF; + /* report size (8 bits) */ + d[i++] = 0x75; d[i++] = 0x08; + /* report count */ + d[i++] = 0x95; d[i++] = (uint8_t)dev->input_report_size - 1; + /* input (data, variable, absolute) */ + d[i++] = 0x81; d[i++] = 0x00; + } + /* output report */ + if (dev->output_report_size) { + /* usage (vendor defined) */ + d[i++] = 0x09; d[i++] = 0x02; + /* logical minimum (0) */ + d[i++] = 0x15; d[i++] = 0x00; + /* logical maximum (255) */ + d[i++] = 0x25; d[i++] = 0xFF; + /* report size (8 bits) */ + d[i++] = 0x75; d[i++] = 0x08; + /* report count */ + d[i++] = 0x95; d[i++] = (uint8_t)dev->output_report_size - 1; + /* output (data, variable, absolute) */ + d[i++] = 0x91; d[i++] = 0x00; + } + /* feature report */ + if (dev->feature_report_size) { + /* usage (vendor defined) */ + d[i++] = 0x09; d[i++] = 0x03; + /* logical minimum (0) */ + d[i++] = 0x15; d[i++] = 0x00; + /* logical maximum (255) */ + d[i++] = 0x25; d[i++] = 0xFF; + /* report size (8 bits) */ + d[i++] = 0x75; d[i++] = 0x08; + /* report count */ + d[i++] = 0x95; d[i++] = (uint8_t)dev->feature_report_size - 1; + /* feature (data, variable, absolute) */ + d[i++] = 0xb2; d[i++] = 0x02; d[i++] = 0x01; + } + + /* end collection */ + d[i++] = 0xC0; + + if (*size > i) + *size = i; + memcpy(data, d, *size); + return LIBUSB_COMPLETED; +} + +static int _hid_get_descriptor(struct hid_device_priv* dev, HANDLE hid_handle, int recipient, + int type, int _index, void *data, size_t *size) +{ + switch(type) { + case LIBUSB_DT_DEVICE: + usbi_dbg("LIBUSB_DT_DEVICE"); + return _hid_get_device_descriptor(dev, data, size); + case LIBUSB_DT_CONFIG: + usbi_dbg("LIBUSB_DT_CONFIG"); + if (!_index) + return _hid_get_config_descriptor(dev, data, size); + return LIBUSB_ERROR_INVALID_PARAM; + case LIBUSB_DT_STRING: + usbi_dbg("LIBUSB_DT_STRING"); + return _hid_get_string_descriptor(dev, _index, data, size); + case LIBUSB_DT_HID: + usbi_dbg("LIBUSB_DT_HID"); + if (!_index) + return _hid_get_hid_descriptor(dev, data, size); + return LIBUSB_ERROR_INVALID_PARAM; + case LIBUSB_DT_REPORT: + usbi_dbg("LIBUSB_DT_REPORT"); + if (!_index) + return _hid_get_report_descriptor(dev, data, size); + return LIBUSB_ERROR_INVALID_PARAM; + case LIBUSB_DT_PHYSICAL: + usbi_dbg("LIBUSB_DT_PHYSICAL"); + if (HidD_GetPhysicalDescriptor(hid_handle, data, (ULONG)*size)) + return LIBUSB_COMPLETED; + return LIBUSB_ERROR_OTHER; + } + usbi_dbg("unsupported"); + return LIBUSB_ERROR_INVALID_PARAM; +} + +static int _hid_get_report(struct hid_device_priv* dev, HANDLE hid_handle, int id, void *data, + struct windows_transfer_priv *tp, size_t *size, OVERLAPPED* overlapped, + int report_type) +{ + uint8_t *buf; + DWORD ioctl_code, read_size, expected_size = (DWORD)*size; + int r = LIBUSB_SUCCESS; + + if (tp->hid_buffer != NULL) { + usbi_dbg("program assertion failed: hid_buffer is not NULL"); + } + + if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { + usbi_dbg("invalid size (%d)", *size); + return LIBUSB_ERROR_INVALID_PARAM; + } + + switch (report_type) { + case HID_REPORT_TYPE_INPUT: + ioctl_code = IOCTL_HID_GET_INPUT_REPORT; + break; + case HID_REPORT_TYPE_FEATURE: + ioctl_code = IOCTL_HID_GET_FEATURE; + break; + default: + usbi_dbg("unknown HID report type %d", report_type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + // Add a trailing byte to detect overflows + buf = (uint8_t*)calloc(expected_size+1, 1); + if (buf == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + buf[0] = (uint8_t)id; // Must be set always + usbi_dbg("report ID: 0x%02X", buf[0]); + + tp->hid_expected_size = expected_size; + read_size = expected_size; + + // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) + if (!DeviceIoControl(hid_handle, ioctl_code, buf, expected_size+1, + buf, expected_size+1, &read_size, overlapped)) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_dbg("Failed to Read HID Report: %s", windows_error_str(0)); + safe_free(buf); + return LIBUSB_ERROR_IO; + } + // Asynchronous wait + tp->hid_buffer = buf; + tp->hid_dest = (uint8_t*)data; // copy dest, as not necessarily the start of the transfer buffer + return LIBUSB_SUCCESS; + } + + // Transfer completed synchronously => copy and discard extra buffer + if (read_size == 0) { + usbi_warn(NULL, "program assertion failed - read completed synchronously, but no data was read"); + *size = 0; + } else { + if (buf[0] != id) { + usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); + } + if ((size_t)read_size > expected_size) { + r = LIBUSB_ERROR_OVERFLOW; + usbi_dbg("OVERFLOW!"); + } else { + r = LIBUSB_COMPLETED; + } + + *size = MIN((size_t)read_size, *size); + if (id == 0) { + // Discard report ID + memcpy(data, buf+1, *size); + } else { + memcpy(data, buf, *size); + } + } + safe_free(buf); + return r; +} + +static int _hid_set_report(struct hid_device_priv* dev, HANDLE hid_handle, int id, void *data, + struct windows_transfer_priv *tp, size_t *size, OVERLAPPED* overlapped, + int report_type) +{ + uint8_t *buf = NULL; + DWORD ioctl_code, write_size= (DWORD)*size; + + if (tp->hid_buffer != NULL) { + usbi_dbg("program assertion failed: hid_buffer is not NULL"); + } + + if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { + usbi_dbg("invalid size (%d)", *size); + return LIBUSB_ERROR_INVALID_PARAM; + } + + switch (report_type) { + case HID_REPORT_TYPE_OUTPUT: + ioctl_code = IOCTL_HID_SET_OUTPUT_REPORT; + break; + case HID_REPORT_TYPE_FEATURE: + ioctl_code = IOCTL_HID_SET_FEATURE; + break; + default: + usbi_dbg("unknown HID report type %d", report_type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + usbi_dbg("report ID: 0x%02X", id); + // When report IDs are not used (i.e. when id == 0), we must add + // a null report ID. Otherwise, we just use original data buffer + if (id == 0) { + write_size++; + } + buf = (uint8_t*) malloc(write_size); + if (buf == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + if (id == 0) { + buf[0] = 0; + memcpy(buf + 1, data, *size); + } else { + // This seems like a waste, but if we don't duplicate the + // data, we'll get issues when freeing hid_buffer + memcpy(buf, data, *size); + if (buf[0] != id) { + usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); + } + } + + // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) + if (!DeviceIoControl(hid_handle, ioctl_code, buf, write_size, + buf, write_size, &write_size, overlapped)) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_dbg("Failed to Write HID Output Report: %s", windows_error_str(0)); + safe_free(buf); + return LIBUSB_ERROR_IO; + } + tp->hid_buffer = buf; + tp->hid_dest = NULL; + return LIBUSB_SUCCESS; + } + + // Transfer completed synchronously + *size = write_size; + if (write_size == 0) { + usbi_dbg("program assertion failed - write completed synchronously, but no data was written"); + } + safe_free(buf); + return LIBUSB_COMPLETED; +} + +static int _hid_class_request(struct hid_device_priv* dev, HANDLE hid_handle, int request_type, + int request, int value, int _index, void *data, struct windows_transfer_priv *tp, + size_t *size, OVERLAPPED* overlapped) +{ + int report_type = (value >> 8) & 0xFF; + int report_id = value & 0xFF; + + if ( (LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_INTERFACE) + && (LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_DEVICE) ) + return LIBUSB_ERROR_INVALID_PARAM; + + if (LIBUSB_REQ_OUT(request_type) && request == HID_REQ_SET_REPORT) + return _hid_set_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); + + if (LIBUSB_REQ_IN(request_type) && request == HID_REQ_GET_REPORT) + return _hid_get_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); + + return LIBUSB_ERROR_INVALID_PARAM; +} + + +/* + * HID API functions + */ +static int hid_init(int sub_api, struct libusb_context *ctx) +{ + DLL_LOAD(hid.dll, HidD_GetAttributes, TRUE); + DLL_LOAD(hid.dll, HidD_GetHidGuid, TRUE); + DLL_LOAD(hid.dll, HidD_GetPreparsedData, TRUE); + DLL_LOAD(hid.dll, HidD_FreePreparsedData, TRUE); + DLL_LOAD(hid.dll, HidD_GetManufacturerString, TRUE); + DLL_LOAD(hid.dll, HidD_GetProductString, TRUE); + DLL_LOAD(hid.dll, HidD_GetSerialNumberString, TRUE); + DLL_LOAD(hid.dll, HidP_GetCaps, TRUE); + DLL_LOAD(hid.dll, HidD_SetNumInputBuffers, TRUE); + DLL_LOAD(hid.dll, HidD_SetFeature, TRUE); + DLL_LOAD(hid.dll, HidD_GetFeature, TRUE); + DLL_LOAD(hid.dll, HidD_GetPhysicalDescriptor, TRUE); + DLL_LOAD(hid.dll, HidD_GetInputReport, FALSE); + DLL_LOAD(hid.dll, HidD_SetOutputReport, FALSE); + DLL_LOAD(hid.dll, HidD_FlushQueue, TRUE); + DLL_LOAD(hid.dll, HidP_GetValueCaps, TRUE); + + api_hid_available = true; + return LIBUSB_SUCCESS; +} + +static int hid_exit(int sub_api) +{ + return LIBUSB_SUCCESS; +} + +// NB: open and close must ensure that they only handle interface of +// the right API type, as these functions can be called wholesale from +// composite_open(), with interfaces belonging to different APIs +static int hid_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + + HIDD_ATTRIBUTES hid_attributes; + PHIDP_PREPARSED_DATA preparsed_data = NULL; + HIDP_CAPS capabilities; + HIDP_VALUE_CAPS *value_caps; + + HANDLE hid_handle = INVALID_HANDLE_VALUE; + int i, j; + // report IDs handling + ULONG size[3]; + const char* type[3] = {"input", "output", "feature"}; + int nb_ids[2]; // zero and nonzero report IDs + + CHECK_HID_AVAILABLE; + if (priv->hid == NULL) { + usbi_err(ctx, "program assertion failed - private HID structure is unitialized"); + return LIBUSB_ERROR_NOT_FOUND; + } + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ( (priv->usb_interface[i].path != NULL) + && (priv->usb_interface[i].apib->id == USB_API_HID) ) { + hid_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + /* + * http://www.lvr.com/hidfaq.htm: Why do I receive "Access denied" when attempting to access my HID? + * "Windows 2000 and later have exclusive read/write access to HIDs that are configured as a system + * keyboards or mice. An application can obtain a handle to a system keyboard or mouse by not + * requesting READ or WRITE access with CreateFile. Applications can then use HidD_SetFeature and + * HidD_GetFeature (if the device supports Feature reports)." + */ + if (hid_handle == INVALID_HANDLE_VALUE) { + usbi_warn(ctx, "could not open HID device in R/W mode (keyboard or mouse?) - trying without"); + hid_handle = CreateFileA(priv->usb_interface[i].path, 0, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (hid_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s (interface %d): %s", priv->path, i, windows_error_str(0)); + switch(GetLastError()) { + case ERROR_FILE_NOT_FOUND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ACCESS_DENIED: + return LIBUSB_ERROR_ACCESS; + default: + return LIBUSB_ERROR_IO; + } + } + priv->usb_interface[i].restricted_functionality = true; + } + handle_priv->interface_handle[i].api_handle = hid_handle; + } + } + + hid_attributes.Size = sizeof(hid_attributes); + do { + if (!HidD_GetAttributes(hid_handle, &hid_attributes)) { + usbi_err(ctx, "could not gain access to HID top collection (HidD_GetAttributes)"); + break; + } + + priv->hid->vid = hid_attributes.VendorID; + priv->hid->pid = hid_attributes.ProductID; + + // Set the maximum available input buffer size + for (i=32; HidD_SetNumInputBuffers(hid_handle, i); i*=2); + usbi_dbg("set maximum input buffer size to %d", i/2); + + // Get the maximum input and output report size + if (!HidD_GetPreparsedData(hid_handle, &preparsed_data) || !preparsed_data) { + usbi_err(ctx, "could not read HID preparsed data (HidD_GetPreparsedData)"); + break; + } + if (HidP_GetCaps(preparsed_data, &capabilities) != HIDP_STATUS_SUCCESS) { + usbi_err(ctx, "could not parse HID capabilities (HidP_GetCaps)"); + break; + } + + // Find out if interrupt will need report IDs + size[0] = capabilities.NumberInputValueCaps; + size[1] = capabilities.NumberOutputValueCaps; + size[2] = capabilities.NumberFeatureValueCaps; + for (j=HidP_Input; j<=HidP_Feature; j++) { + usbi_dbg("%d HID %s report value(s) found", size[j], type[j]); + priv->hid->uses_report_ids[j] = false; + if (size[j] > 0) { + value_caps = (HIDP_VALUE_CAPS*) calloc(size[j], sizeof(HIDP_VALUE_CAPS)); + if ( (value_caps != NULL) + && (HidP_GetValueCaps((HIDP_REPORT_TYPE)j, value_caps, &size[j], preparsed_data) == HIDP_STATUS_SUCCESS) + && (size[j] >= 1) ) { + nb_ids[0] = 0; + nb_ids[1] = 0; + for (i=0; i<(int)size[j]; i++) { + usbi_dbg(" Report ID: 0x%02X", value_caps[i].ReportID); + if (value_caps[i].ReportID != 0) { + nb_ids[1]++; + } else { + nb_ids[0]++; + } + } + if (nb_ids[1] != 0) { + if (nb_ids[0] != 0) { + usbi_warn(ctx, "program assertion failed: zero and nonzero report IDs used for %s", + type[j]); + } + priv->hid->uses_report_ids[j] = true; + } + } else { + usbi_warn(ctx, " could not process %s report IDs", type[j]); + } + safe_free(value_caps); + } + } + + // Set the report sizes + priv->hid->input_report_size = capabilities.InputReportByteLength; + priv->hid->output_report_size = capabilities.OutputReportByteLength; + priv->hid->feature_report_size = capabilities.FeatureReportByteLength; + + // Fetch string descriptors + priv->hid->string_index[0] = priv->dev_descriptor.iManufacturer; + if (priv->hid->string_index[0] != 0) { + HidD_GetManufacturerString(hid_handle, priv->hid->string[0], + sizeof(priv->hid->string[0])); + } else { + priv->hid->string[0][0] = 0; + } + priv->hid->string_index[1] = priv->dev_descriptor.iProduct; + if (priv->hid->string_index[1] != 0) { + HidD_GetProductString(hid_handle, priv->hid->string[1], + sizeof(priv->hid->string[1])); + } else { + priv->hid->string[1][0] = 0; + } + priv->hid->string_index[2] = priv->dev_descriptor.iSerialNumber; + if (priv->hid->string_index[2] != 0) { + HidD_GetSerialNumberString(hid_handle, priv->hid->string[2], + sizeof(priv->hid->string[2])); + } else { + priv->hid->string[2][0] = 0; + } + } while(0); + + if (preparsed_data) { + HidD_FreePreparsedData(preparsed_data); + } + + return LIBUSB_SUCCESS; +} + +static void hid_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + HANDLE file_handle; + int i; + + if (!api_hid_available) + return; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (priv->usb_interface[i].apib->id == USB_API_HID) { + file_handle = handle_priv->interface_handle[i].api_handle; + if ( (file_handle != 0) && (file_handle != INVALID_HANDLE_VALUE)) { + CloseHandle(file_handle); + } + } + } +} + +static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_HID_AVAILABLE; + + // NB: Disconnection detection is not possible in this function + if (priv->usb_interface[iface].path == NULL) { + return LIBUSB_ERROR_NOT_FOUND; // invalid iface + } + + // We use dev_handle as a flag for interface claimed + if (handle_priv->interface_handle[iface].dev_handle == INTERFACE_CLAIMED) { + return LIBUSB_ERROR_BUSY; // already claimed + } + + handle_priv->interface_handle[iface].dev_handle = INTERFACE_CLAIMED; + + usbi_dbg("claimed interface %d", iface); + handle_priv->active_interface = iface; + + return LIBUSB_SUCCESS; +} + +static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_HID_AVAILABLE; + + if (priv->usb_interface[iface].path == NULL) { + return LIBUSB_ERROR_NOT_FOUND; // invalid iface + } + + if (handle_priv->interface_handle[iface].dev_handle != INTERFACE_CLAIMED) { + return LIBUSB_ERROR_NOT_FOUND; // invalid iface + } + + handle_priv->interface_handle[iface].dev_handle = INVALID_HANDLE_VALUE; + + return LIBUSB_SUCCESS; +} + +static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + CHECK_HID_AVAILABLE; + + if (altsetting > 255) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (altsetting != 0) { + usbi_err(ctx, "set interface altsetting not supported for altsetting >0"); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + return LIBUSB_SUCCESS; +} + +static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *) transfer->buffer; + HANDLE hid_handle; + struct winfd wfd; + int current_interface, config; + size_t size; + int r = LIBUSB_ERROR_INVALID_PARAM; + + CHECK_HID_AVAILABLE; + + transfer_priv->pollable_fd = INVALID_WINFD; + safe_free(transfer_priv->hid_buffer); + transfer_priv->hid_dest = NULL; + size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + if (size > MAX_CTRL_BUFFER_LENGTH) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + current_interface = get_valid_interface(transfer->dev_handle, USB_API_HID); + if (current_interface < 0) { + if (auto_claim(transfer, ¤t_interface, USB_API_HID) != LIBUSB_SUCCESS) { + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_dbg("will use interface %d", current_interface); + hid_handle = handle_priv->interface_handle[current_interface].api_handle; + // Always use the handle returned from usbi_create_fd (wfd.handle) + wfd = usbi_create_fd(hid_handle, RW_READ, NULL, NULL); + if (wfd.fd < 0) { + return LIBUSB_ERROR_NOT_FOUND; + } + + switch(LIBUSB_REQ_TYPE(setup->request_type)) { + case LIBUSB_REQUEST_TYPE_STANDARD: + switch(setup->request) { + case LIBUSB_REQUEST_GET_DESCRIPTOR: + r = _hid_get_descriptor(priv->hid, wfd.handle, LIBUSB_REQ_RECIPIENT(setup->request_type), + (setup->value >> 8) & 0xFF, setup->value & 0xFF, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, &size); + break; + case LIBUSB_REQUEST_GET_CONFIGURATION: + r = windows_get_configuration(transfer->dev_handle, &config); + if (r == LIBUSB_SUCCESS) { + size = 1; + ((uint8_t*)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = (uint8_t)config; + r = LIBUSB_COMPLETED; + } + break; + case LIBUSB_REQUEST_SET_CONFIGURATION: + if (setup->value == priv->active_config) { + r = LIBUSB_COMPLETED; + } else { + usbi_warn(ctx, "cannot set configuration other than the default one"); + r = LIBUSB_ERROR_INVALID_PARAM; + } + break; + case LIBUSB_REQUEST_GET_INTERFACE: + size = 1; + ((uint8_t*)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = 0; + r = LIBUSB_COMPLETED; + break; + case LIBUSB_REQUEST_SET_INTERFACE: + r = hid_set_interface_altsetting(0, transfer->dev_handle, setup->index, setup->value); + if (r == LIBUSB_SUCCESS) { + r = LIBUSB_COMPLETED; + } + break; + default: + usbi_warn(ctx, "unsupported HID control request"); + r = LIBUSB_ERROR_INVALID_PARAM; + break; + } + break; + case LIBUSB_REQUEST_TYPE_CLASS: + r =_hid_class_request(priv->hid, wfd.handle, setup->request_type, setup->request, setup->value, + setup->index, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, transfer_priv, + &size, wfd.overlapped); + break; + default: + usbi_warn(ctx, "unsupported HID control request"); + r = LIBUSB_ERROR_INVALID_PARAM; + break; + } + + if (r == LIBUSB_COMPLETED) { + // Force request to be completed synchronously. Transferred size has been set by previous call + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + // http://msdn.microsoft.com/en-us/library/ms684342%28VS.85%29.aspx + // set InternalHigh to the number of bytes transferred + wfd.overlapped->InternalHigh = (DWORD)size; + r = LIBUSB_SUCCESS; + } + + if (r == LIBUSB_SUCCESS) { + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + } else { + usbi_free_fd(&wfd); + } + + return r; +} + +static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct winfd wfd; + HANDLE hid_handle; + bool direction_in, ret; + int current_interface, length; + DWORD size; + int r = LIBUSB_SUCCESS; + + CHECK_HID_AVAILABLE; + + transfer_priv->pollable_fd = INVALID_WINFD; + transfer_priv->hid_dest = NULL; + safe_free(transfer_priv->hid_buffer); + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + hid_handle = handle_priv->interface_handle[current_interface].api_handle; + direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; + + wfd = usbi_create_fd(hid_handle, direction_in?RW_READ:RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + // If report IDs are not in use, an extra prefix byte must be added + if ( ((direction_in) && (!priv->hid->uses_report_ids[0])) + || ((!direction_in) && (!priv->hid->uses_report_ids[1])) ) { + length = transfer->length+1; + } else { + length = transfer->length; + } + // Add a trailing byte to detect overflows on input + transfer_priv->hid_buffer = (uint8_t*)calloc(length+1, 1); + if (transfer_priv->hid_buffer == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + transfer_priv->hid_expected_size = length; + + if (direction_in) { + transfer_priv->hid_dest = transfer->buffer; + usbi_dbg("reading %d bytes (report ID: 0x00)", length); + ret = ReadFile(wfd.handle, transfer_priv->hid_buffer, length+1, &size, wfd.overlapped); + } else { + if (!priv->hid->uses_report_ids[1]) { + memcpy(transfer_priv->hid_buffer+1, transfer->buffer, transfer->length); + } else { + // We could actually do without the calloc and memcpy in this case + memcpy(transfer_priv->hid_buffer, transfer->buffer, transfer->length); + } + usbi_dbg("writing %d bytes (report ID: 0x%02X)", length, transfer_priv->hid_buffer[0]); + ret = WriteFile(wfd.handle, transfer_priv->hid_buffer, length, &size, wfd.overlapped); + } + if (!ret) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "HID transfer failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + safe_free(transfer_priv->hid_buffer); + return LIBUSB_ERROR_IO; + } + } else { + // Only write operations that completed synchronously need to free up + // hid_buffer. For reads, copy_transfer_data() handles that process. + if (!direction_in) { + safe_free(transfer_priv->hid_buffer); + } + if (size == 0) { + usbi_err(ctx, "program assertion failed - no data was transferred"); + size = 1; + } + if (size > (size_t)length) { + usbi_err(ctx, "OVERFLOW!"); + r = LIBUSB_ERROR_OVERFLOW; + } + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = size; + } + + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return r; +} + +static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + HANDLE hid_handle; + int current_interface; + + CHECK_HID_AVAILABLE; + + current_interface = transfer_priv->interface_number; + hid_handle = handle_priv->interface_handle[current_interface].api_handle; + CancelIo(hid_handle); + + return LIBUSB_SUCCESS; +} + +static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + HANDLE hid_handle; + int current_interface; + + CHECK_HID_AVAILABLE; + + // Flushing the queues on all interfaces is the best we can achieve + for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { + hid_handle = handle_priv->interface_handle[current_interface].api_handle; + if ((hid_handle != 0) && (hid_handle != INVALID_HANDLE_VALUE)) { + HidD_FlushQueue(hid_handle); + } + } + return LIBUSB_SUCCESS; +} + +static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE hid_handle; + int current_interface; + + CHECK_HID_AVAILABLE; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); + hid_handle = handle_priv->interface_handle[current_interface].api_handle; + + // No endpoint selection with Microsoft's implementation, so we try to flush the + // whole interface. Should be OK for most case scenarios + if (!HidD_FlushQueue(hid_handle)) { + usbi_err(ctx, "Flushing of HID queue failed: %s", windows_error_str(0)); + // Device was probably disconnected + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +// This extra function is only needed for HID +static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + int r = LIBUSB_TRANSFER_COMPLETED; + uint32_t corrected_size = io_size; + + if (transfer_priv->hid_buffer != NULL) { + // If we have a valid hid_buffer, it means the transfer was async + if (transfer_priv->hid_dest != NULL) { // Data readout + // First, check for overflow + if (corrected_size > transfer_priv->hid_expected_size) { + usbi_err(ctx, "OVERFLOW!"); + corrected_size = (uint32_t)transfer_priv->hid_expected_size; + r = LIBUSB_TRANSFER_OVERFLOW; + } + + if (transfer_priv->hid_buffer[0] == 0) { + // Discard the 1 byte report ID prefix + corrected_size--; + memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer+1, corrected_size); + } else { + memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size); + } + transfer_priv->hid_dest = NULL; + } + // For write, we just need to free the hid buffer + safe_free(transfer_priv->hid_buffer); + } + itransfer->transferred += corrected_size; + return r; +} + + +/* + * Composite API functions + */ +static int composite_init(int sub_api, struct libusb_context *ctx) +{ + return LIBUSB_SUCCESS; +} + +static int composite_exit(int sub_api) +{ + return LIBUSB_SUCCESS; +} + +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_ERROR_NOT_FOUND; + uint8_t i; + // SUB_API_MAX+1 as the SUB_API_MAX pos is used to indicate availability of HID + bool available[SUB_API_MAX+1] = {0}; + + for (i=0; iusb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) + available[priv->usb_interface[i].sub_api] = true; + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; + } + } + + for (i=0; idev); + uint8_t i; + bool available[SUB_API_MAX]; + + for (i = 0; iusb_interface[i].apib->id == USB_API_WINUSBX) + && (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) { + available[priv->usb_interface[i].sub_api] = true; + } + } + + for (i=0; idev); + return priv->usb_interface[iface].apib-> + claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->usb_interface[iface].apib-> + set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting); +} + +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->usb_interface[iface].apib-> + release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int i, pass; + + // Interface shouldn't matter for control, but it does in practice, with Windows' + // restrictions with regards to accessing HID keyboards and mice. Try a 2 pass approach + for (pass = 0; pass < 2; pass++) { + for (i=0; iusb_interface[i].path != NULL) { + if ((pass == 0) && (priv->usb_interface[i].restricted_functionality)) { + usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", i); + continue; + } + usbi_dbg("using interface %d", i); + return priv->usb_interface[i].apib->submit_control_transfer(priv->usb_interface[i].sub_api, itransfer); + } + } + } + + usbi_err(ctx, "no libusbx supported interfaces to complete request"); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer);} + +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer);} + +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint);} + +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + abort_control(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer);} + +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + abort_transfers(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer);} + +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r; + uint8_t i; + bool available[SUB_API_MAX]; + for (i = 0; iusb_interface[i].apib->id == USB_API_WINUSBX) + && (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) { + available[priv->usb_interface[i].sub_api] = true; + } + } + for (i=0; idev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); +} diff --git a/Externals/libusbx/libusb/os/windows_usb.h b/Externals/libusbx/libusb/os/windows_usb.h new file mode 100644 index 0000000000..5d67a562e8 --- /dev/null +++ b/Externals/libusbx/libusb/os/windows_usb.h @@ -0,0 +1,918 @@ +/* + * Windows backend for libusbx 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include "windows_common.h" + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4100) // unreferenced formal parameter +#pragma warning(disable:4214) // bit field types other than int +#pragma warning(disable:4201) // nameless struct/union +#endif + +// Missing from MSVC6 setupapi.h +#if !defined(SPDRP_ADDRESS) +#define SPDRP_ADDRESS 28 +#endif +#if !defined(SPDRP_INSTALL_STATE) +#define SPDRP_INSTALL_STATE 34 +#endif + +#if defined(__CYGWIN__ ) +#define _stricmp stricmp +// cygwin produces a warning unless these prototypes are defined +extern int _snprintf(char *buffer, size_t count, const char *format, ...); +extern char *_strdup(const char *strSource); +// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread +#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, f) +#endif + +#define MAX_CTRL_BUFFER_LENGTH 4096 +#define MAX_USB_DEVICES 256 +#define MAX_USB_STRING_LENGTH 128 +#define MAX_HID_REPORT_SIZE 1024 +#define MAX_HID_DESCRIPTOR_SIZE 256 +#define MAX_GUID_STRING_LENGTH 40 +#define MAX_PATH_LENGTH 128 +#define MAX_KEY_LENGTH 256 +#define LIST_SEPARATOR ';' +#define HTAB_SIZE 1021 + +// Handle code for HID interface that have been claimed ("dibs") +#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) +// Additional return code for HID operations that completed synchronously +#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) + +// http://msdn.microsoft.com/en-us/library/ff545978.aspx +// http://msdn.microsoft.com/en-us/library/ff545972.aspx +// http://msdn.microsoft.com/en-us/library/ff545982.aspx +#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) +const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; +#endif +#if !defined(GUID_DEVINTERFACE_USB_DEVICE) +const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; +#endif +#if !defined(GUID_DEVINTERFACE_USB_HUB) +const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; +#endif +#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) +const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; +#endif + + +/* + * Multiple USB API backend support + */ +#define USB_API_UNSUPPORTED 0 +#define USB_API_HUB 1 +#define USB_API_COMPOSITE 2 +#define USB_API_WINUSBX 3 +#define USB_API_HID 4 +#define USB_API_MAX 5 +// The following is used to indicate if the HID or composite extra props have already been set. +#define USB_API_SET (1<os_priv; +} + +static inline void windows_device_priv_init(libusb_device* dev) { + struct windows_device_priv* p = _device_priv(dev); + int i; + p->depth = 0; + p->port = 0; + p->parent_dev = NULL; + p->path = NULL; + p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->sub_api = SUB_API_NOTSET; + p->hid = NULL; + p->active_config = 0; + p->config_descriptor = NULL; + memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR)); + for (i=0; iusb_interface[i].path = NULL; + p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->usb_interface[i].sub_api = SUB_API_NOTSET; + p->usb_interface[i].nb_endpoints = 0; + p->usb_interface[i].endpoint = NULL; + p->usb_interface[i].restricted_functionality = false; + } +} + +static inline void windows_device_priv_release(libusb_device* dev) { + struct windows_device_priv* p = _device_priv(dev); + int i; + safe_free(p->path); + if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { + for (i=0; i < dev->num_configurations; i++) + safe_free(p->config_descriptor[i]); + } + safe_free(p->config_descriptor); + safe_free(p->hid); + for (i=0; iusb_interface[i].path); + safe_free(p->usb_interface[i].endpoint); + } +} + +struct interface_handle_t { + HANDLE dev_handle; // WinUSB needs an extra handle for the file + HANDLE api_handle; // used by the API to communicate with the device +}; + +struct windows_device_handle_priv { + int active_interface; + struct interface_handle_t interface_handle[USB_MAXINTERFACES]; + int autoclaim_count[USB_MAXINTERFACES]; // For auto-release +}; + +static inline struct windows_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct windows_device_handle_priv *) handle->os_priv; +} + +// used for async polling functions +struct windows_transfer_priv { + struct winfd pollable_fd; + uint8_t interface_number; + uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID + uint8_t *hid_dest; // transfer buffer destination, required for HID + size_t hid_expected_size; +}; + +// used to match a device driver (including filter drivers) against a supported API +struct driver_lookup { + char list[MAX_KEY_LENGTH+1];// REG_MULTI_SZ list of services (driver) names + const DWORD reg_prop; // SPDRP registry key to use to retreive list + const char* designation; // internal designation (for debug output) +}; + +/* OLE32 dependency */ +DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); + +/* SetupAPI dependencies */ +DLL_DECLARE_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, + const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, + PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); +DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, + PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); +DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); +DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); +DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); + +/* + * Windows DDK API definitions. Most of it copied from MinGW's includes + */ +typedef DWORD DEVNODE, DEVINST; +typedef DEVNODE *PDEVNODE, *PDEVINST; +typedef DWORD RETURN_TYPE; +typedef RETURN_TYPE CONFIGRET; + +#define CR_SUCCESS 0x00000000 +#define CR_NO_SUCH_DEVNODE 0x0000000D + +#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE +#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG +#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING +#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE +#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT + +#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS +#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE +#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE +#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS +#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR +#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR +#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION +#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION +#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE +#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE +#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME + +#define USB_GET_NODE_INFORMATION 258 +#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 +#define USB_GET_NODE_CONNECTION_NAME 261 +#define USB_GET_HUB_CAPABILITIES 271 +#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) +#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 +#endif +#if !defined(USB_GET_HUB_CAPABILITIES_EX) +#define USB_GET_HUB_CAPABILITIES_EX 276 +#endif + +#ifndef METHOD_BUFFERED +#define METHOD_BUFFERED 0 +#endif +#ifndef FILE_ANY_ACCESS +#define FILE_ANY_ACCESS 0x00000000 +#endif +#ifndef FILE_DEVICE_UNKNOWN +#define FILE_DEVICE_UNKNOWN 0x00000022 +#endif +#ifndef FILE_DEVICE_USB +#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN +#endif + +#ifndef CTL_CODE +#define CTL_CODE(DeviceType, Function, Method, Access)( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) +#endif + +typedef enum USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +typedef enum USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +/* Cfgmgr32.dll interface */ +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); + +#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ + CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_HUB_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_ROOT_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// Most of the structures below need to be packed +#pragma pack(push, 1) + +typedef struct USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { + struct { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; + } req; + USB_CONFIGURATION_DESCRIPTOR data; +} USB_CONFIGURATION_DESCRIPTOR_SHORT; + +typedef struct USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +typedef struct USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; +// UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +typedef struct USB_HUB_DESCRIPTOR { + UCHAR bDescriptorLength; + UCHAR bDescriptorType; + UCHAR bNumberOfPorts; + USHORT wHubCharacteristics; + UCHAR bPowerOnToPowerGood; + UCHAR bHubControlCurrent; + UCHAR bRemoveAndPowerMask[64]; +} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; + +typedef struct USB_ROOT_HUB_NAME { + ULONG ActualLength; + WCHAR RootHubName[1]; +} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; + +typedef struct USB_ROOT_HUB_NAME_FIXED { + ULONG ActualLength; + WCHAR RootHubName[MAX_PATH_LENGTH]; +} USB_ROOT_HUB_NAME_FIXED; + +typedef struct USB_NODE_CONNECTION_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[1]; +} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; + +typedef struct USB_NODE_CONNECTION_NAME_FIXED { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[MAX_PATH_LENGTH]; +} USB_NODE_CONNECTION_NAME_FIXED; + +typedef struct USB_HUB_NAME_FIXED { + union { + USB_ROOT_HUB_NAME_FIXED root; + USB_NODE_CONNECTION_NAME_FIXED node; + } u; +} USB_HUB_NAME_FIXED; + +typedef struct USB_HUB_INFORMATION { + USB_HUB_DESCRIPTOR HubDescriptor; + BOOLEAN HubIsBusPowered; +} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; + +typedef struct USB_MI_PARENT_INFORMATION { + ULONG NumberOfInterfaces; +} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; + +typedef struct USB_NODE_INFORMATION { + USB_HUB_NODE NodeType; + union { + USB_HUB_INFORMATION HubInformation; + USB_MI_PARENT_INFORMATION MiParentInformation; + } u; +} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; + +typedef struct USB_PIPE_INFO { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + ULONG ScheduleOffset; +} USB_PIPE_INFO, *PUSB_PIPE_INFO; + +typedef struct USB_NODE_CONNECTION_INFORMATION_EX { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR Speed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; +// USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; + +typedef struct USB_HUB_CAP_FLAGS { + ULONG HubIsHighSpeedCapable:1; + ULONG HubIsHighSpeed:1; + ULONG HubIsMultiTtCapable:1; + ULONG HubIsMultiTt:1; + ULONG HubIsRoot:1; + ULONG HubIsArmedWakeOnConnect:1; + ULONG ReservedMBZ:26; +} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; + +typedef struct USB_HUB_CAPABILITIES { + ULONG HubIs2xCapable : 1; +} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; + +typedef struct USB_HUB_CAPABILITIES_EX { + USB_HUB_CAP_FLAGS CapabilityFlags; +} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; + +#pragma pack(pop) + +/* winusb.dll interface */ + +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 +#define DEVICE_SPEED 0x01 +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +typedef enum USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +typedef struct { + USBD_PIPE_TYPE PipeType; + UCHAR PipeId; + USHORT MaximumPacketSize; + UCHAR Interval; +} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; + +#pragma pack(1) +typedef struct { + UCHAR request_type; + UCHAR request; + USHORT value; + USHORT index; + USHORT length; +} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; +#pragma pack() + +typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; + +typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + WINUSB_SETUP_PACKET SetupPacket, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_Free_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AssociatedInterfaceIndex, + PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + PUCHAR AlternateSetting +); +typedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR DescriptorType, + UCHAR Index, + USHORT LanguageID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred +); +typedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + LPOVERLAPPED lpOverlapped, + LPDWORD lpNumberOfBytesTransferred, + BOOL bWait +); +typedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + ULONG PolicyType, + PULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG PolicyType, + PULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_Initialize_t)( + HANDLE DeviceHandle, + PWINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG InformationType, + PULONG BufferLength, + PVOID Buffer +); +typedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateSettingNumber, + PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor +); +typedef BOOL (WINAPI *WinUsb_QueryPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateInterfaceNumber, + UCHAR PipeIndex, + PWINUSB_PIPE_INFORMATION PipeInformation +); +typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateSetting +); +typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + ULONG PolicyType, + ULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG PolicyType, + ULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_WritePipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); + +/* /!\ These must match the ones from the official libusbk.h */ +typedef enum _KUSB_FNID +{ + KUSB_FNID_Init, + KUSB_FNID_Free, + KUSB_FNID_ClaimInterface, + KUSB_FNID_ReleaseInterface, + KUSB_FNID_SetAltInterface, + KUSB_FNID_GetAltInterface, + KUSB_FNID_GetDescriptor, + KUSB_FNID_ControlTransfer, + KUSB_FNID_SetPowerPolicy, + KUSB_FNID_GetPowerPolicy, + KUSB_FNID_SetConfiguration, + KUSB_FNID_GetConfiguration, + KUSB_FNID_ResetDevice, + KUSB_FNID_Initialize, + KUSB_FNID_SelectInterface, + KUSB_FNID_GetAssociatedInterface, + KUSB_FNID_Clone, + KUSB_FNID_QueryInterfaceSettings, + KUSB_FNID_QueryDeviceInformation, + KUSB_FNID_SetCurrentAlternateSetting, + KUSB_FNID_GetCurrentAlternateSetting, + KUSB_FNID_QueryPipe, + KUSB_FNID_SetPipePolicy, + KUSB_FNID_GetPipePolicy, + KUSB_FNID_ReadPipe, + KUSB_FNID_WritePipe, + KUSB_FNID_ResetPipe, + KUSB_FNID_AbortPipe, + KUSB_FNID_FlushPipe, + KUSB_FNID_IsoReadPipe, + KUSB_FNID_IsoWritePipe, + KUSB_FNID_GetCurrentFrameNumber, + KUSB_FNID_GetOverlappedResult, + KUSB_FNID_GetProperty, + KUSB_FNID_COUNT, +} KUSB_FNID; + +typedef struct _KLIB_VERSION { + INT Major; + INT Minor; + INT Micro; + INT Nano; +} KLIB_VERSION; +typedef KLIB_VERSION* PKLIB_VERSION; + +typedef BOOL (WINAPI *LibK_GetProcAddress_t)( + PVOID* ProcAddress, + ULONG DriverID, + ULONG FunctionID +); + +typedef VOID (WINAPI *LibK_GetVersion_t)( + PKLIB_VERSION Version +); + +struct winusb_interface { + bool initialized; + WinUsb_AbortPipe_t AbortPipe; + WinUsb_ControlTransfer_t ControlTransfer; + WinUsb_FlushPipe_t FlushPipe; + WinUsb_Free_t Free; + WinUsb_GetAssociatedInterface_t GetAssociatedInterface; + WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; + WinUsb_GetDescriptor_t GetDescriptor; + WinUsb_GetOverlappedResult_t GetOverlappedResult; + WinUsb_GetPipePolicy_t GetPipePolicy; + WinUsb_GetPowerPolicy_t GetPowerPolicy; + WinUsb_Initialize_t Initialize; + WinUsb_QueryDeviceInformation_t QueryDeviceInformation; + WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; + WinUsb_QueryPipe_t QueryPipe; + WinUsb_ReadPipe_t ReadPipe; + WinUsb_ResetPipe_t ResetPipe; + WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; + WinUsb_SetPipePolicy_t SetPipePolicy; + WinUsb_SetPowerPolicy_t SetPowerPolicy; + WinUsb_WritePipe_t WritePipe; + WinUsb_ResetDevice_t ResetDevice; +}; + +/* hid.dll interface */ + +#define HIDP_STATUS_SUCCESS 0x110000 +typedef void* PHIDP_PREPARSED_DATA; + +#pragma pack(1) +typedef struct { + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; +#pragma pack() + +typedef USHORT USAGE; +typedef struct { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT NumberLinkCollectionNodes; + USHORT NumberInputButtonCaps; + USHORT NumberInputValueCaps; + USHORT NumberInputDataIndices; + USHORT NumberOutputButtonCaps; + USHORT NumberOutputValueCaps; + USHORT NumberOutputDataIndices; + USHORT NumberFeatureButtonCaps; + USHORT NumberFeatureValueCaps; + USHORT NumberFeatureDataIndices; +} HIDP_CAPS, *PHIDP_CAPS; + +typedef enum _HIDP_REPORT_TYPE { + HidP_Input, + HidP_Output, + HidP_Feature +} HIDP_REPORT_TYPE; + +typedef struct _HIDP_VALUE_CAPS { + USAGE UsagePage; + UCHAR ReportID; + BOOLEAN IsAlias; + USHORT BitField; + USHORT LinkCollection; + USAGE LinkUsage; + USAGE LinkUsagePage; + BOOLEAN IsRange; + BOOLEAN IsStringRange; + BOOLEAN IsDesignatorRange; + BOOLEAN IsAbsolute; + BOOLEAN HasNull; + UCHAR Reserved; + USHORT BitSize; + USHORT ReportCount; + USHORT Reserved2[5]; + ULONG UnitsExp; + ULONG Units; + LONG LogicalMin, LogicalMax; + LONG PhysicalMin, PhysicalMax; + union { + struct { + USAGE UsageMin, UsageMax; + USHORT StringMin, StringMax; + USHORT DesignatorMin, DesignatorMax; + USHORT DataIndexMin, DataIndexMax; + } Range; + struct { + USAGE Usage, Reserved1; + USHORT StringIndex, Reserved2; + USHORT DesignatorIndex, Reserved3; + USHORT DataIndex, Reserved4; + } NotRange; + } u; +} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; + +DLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); +DLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *)); +DLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); +DLL_DECLARE(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); +DLL_DECLARE(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); diff --git a/Externals/libusbx/libusb/strerror.c b/Externals/libusbx/libusb/strerror.c new file mode 100644 index 0000000000..a3c3afa3fc --- /dev/null +++ b/Externals/libusbx/libusb/strerror.c @@ -0,0 +1,184 @@ +/* + * libusb strerror code + * Copyright © 2013 Hans de Goede + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "config.h" + +#include +#include +#include + +#include "libusb.h" +#include "libusbi.h" + +#if defined(_MSC_VER) +#define strncasecmp _strnicmp +#endif + +static size_t usbi_locale = 0; + +/** \ingroup misc + * How to add a new \ref libusb_strerror() translation: + *
    + *
  1. Download the latest \c strerror.c from:
    + * https://raw.github.com/libusbx/libusbx/master/libusb/sterror.c
  2. + *
  3. Open the file in an UTF-8 capable editor
  4. + *
  5. Add the 2 letter ISO 639-1 + * code for your locale at the end of \c usbi_locale_supported[]
    + * Eg. for Chinese, you would add "zh" so that: + * \code... usbi_locale_supported[] = { "en", "nl", "fr" };\endcode + * becomes: + * \code... usbi_locale_supported[] = { "en", "nl", "fr", "zh" };\endcode
  6. + *
  7. Copy the { / * English (en) * / ... } section and add it at the end of \c usbi_localized_errors
    + * Eg. for Chinese, the last section of \c usbi_localized_errors could look like: + * \code + * }, { / * Chinese (zh) * / + * "Success", + * ... + * "Other error", + * } + * };\endcode
  8. + *
  9. Translate each of the English messages from the section you copied into your language
  10. + *
  11. Save the file (in UTF-8 format) and send it to \c libusbx-devel@lists.sourceforge.net
  12. + *
+ */ + +static const char* usbi_locale_supported[] = { "en", "nl", "fr" }; +static const char* usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = { + { /* English (en) */ + "Success", + "Input/Output Error", + "Invalid parameter", + "Access denied (insufficient permissions)", + "No such device (it may have been disconnected)", + "Entity not found", + "Resource busy", + "Operation timed out", + "Overflow", + "Pipe error", + "System call interrupted (perhaps due to signal)", + "Insufficient memory", + "Operation not supported or unimplemented on this platform", + "Other error", + }, { /* Dutch (nl) */ + "Gelukt", + "Invoer-/uitvoerfout", + "Ongeldig argument", + "Toegang geweigerd (onvoldoende toegangsrechten)", + "Apparaat bestaat niet (verbinding met apparaat verbroken?)", + "Niet gevonden", + "Apparaat of hulpbron is bezig", + "Bewerking verlopen", + "Waarde is te groot", + "Gebroken pijp", + "Onderbroken systeemaanroep", + "Onvoldoende geheugen beschikbaar", + "Bewerking wordt niet ondersteund", + "Andere fout", + }, { /* French (fr) */ + "Succès", + "Erreur d'entrée/sortie", + "Paramètre invalide", + "Accès refusé (permissions insuffisantes)", + "Périphérique introuvable (peut-être déconnecté)", + "Elément introuvable", + "Resource déjà occupée", + "Operation expirée", + "Débordement", + "Erreur de pipe", + "Appel système abandonné (peut-être à cause d’un signal)", + "Mémoire insuffisante", + "Opération non supportée or non implémentée sur cette plateforme", + "Autre erreur" + } +}; + +/** \ingroup misc + * Set the language, and only the language, not the encoding! used for + * translatable libusb messages. + * + * This takes a locale string in the default setlocale format: lang[-region] + * or lang[_country_region][.codeset]. Only the lang part of the string is + * used, and only 2 letter ISO 639-1 codes are accepted for it, such as "de". + * The optional region, country_region or codeset parts are ignored. This + * means that functions which return translatable strings will NOT honor the + * specified encoding. + * All strings returned are encoded as UTF-8 strings. + * + * If libusb_setlocale() is not called, all messages will be in English. + * + * The following functions return translatable strings: libusb_strerror(). + * Note that the libusb log messages controlled through libusb_set_debug() + * are not translated, they are always in English. + * + * For POSIX UTF-8 environments if you want libusb to follow the standard + * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)), + * after your app has done its locale setup. + * + * \param locale locale-string in the form of lang[_country_region][.codeset] + * or lang[-region], where lang is a 2 letter ISO 639-1 code + * \returns LIBUSB_SUCCESS on success + * \returns LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements + * \returns LIBUSB_ERROR_NOT_FOUND if the requested language is not supported + * \returns a LIBUSB_ERROR code on other errors + */ + +int API_EXPORTED libusb_setlocale(const char *locale) +{ + size_t i; + + if ( (locale == NULL) || (strlen(locale) < 2) + || ((strlen(locale) > 2) && (locale[2] != '-') && (locale[2] != '_') && (locale[2] != '.')) ) + return LIBUSB_ERROR_INVALID_PARAM; + + for (i=0; i= ARRAYSIZE(usbi_locale_supported)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_locale = i; + + return LIBUSB_SUCCESS; +} + +/** \ingroup misc + * Returns a constant string with a short description of the given error code, + * this description is intended for displaying to the end user and will be in + * the language set by libusb_setlocale(). + * + * The returned string is encoded in UTF-8. + * + * The messages always start with a capital letter and end without any dot. + * The caller must not free() the returned string. + * + * \param errcode the error code whose description is desired + * \returns a short description of the error code in UTF-8 encoding + */ +DEFAULT_VISIBILITY const char* LIBUSB_CALL libusb_strerror(enum libusb_error errcode) +{ + int errcode_index = -errcode; + + if ((errcode_index < 0) || (errcode_index >= LIBUSB_ERROR_COUNT)) { + /* "Other Error", which should always be our last message, is returned */ + errcode_index = LIBUSB_ERROR_COUNT - 1; + } + + return usbi_localized_errors[usbi_locale][errcode_index]; +} diff --git a/Externals/libusbx/libusb/sync.c b/Externals/libusbx/libusb/sync.c new file mode 100644 index 0000000000..42e486db39 --- /dev/null +++ b/Externals/libusbx/libusb/sync.c @@ -0,0 +1,307 @@ +/* + * Synchronous I/O functions for libusbx + * Copyright © 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include + +#include "libusbi.h" + +/** + * @defgroup syncio Synchronous device I/O + * + * This page documents libusbx's synchronous (blocking) API for USB device I/O. + * This interface is easy to use but has some limitations. More advanced users + * may wish to consider using the \ref asyncio "asynchronous I/O API" instead. + */ + +static void LIBUSB_CALL sync_transfer_cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; + usbi_dbg("actual_length=%d", transfer->actual_length); + /* caller interprets result and frees transfer */ +} + +static void sync_transfer_wait_for_completion(struct libusb_transfer *transfer) +{ + int r, *completed = transfer->user_data; + struct libusb_context *ctx = HANDLE_CTX(transfer->dev_handle); + + while (!*completed) { + r = libusb_handle_events_completed(ctx, completed); + if (r < 0) { + if (r == LIBUSB_ERROR_INTERRUPTED) + continue; + usbi_err(ctx, "libusb_handle_events failed: %s, cancelling transfer and retrying", + libusb_error_name(r)); + libusb_cancel_transfer(transfer); + continue; + } + } +} + +/** \ingroup syncio + * Perform a USB control transfer. + * + * The direction of the transfer is inferred from the bmRequestType field of + * the setup packet. + * + * The wValue, wIndex and wLength fields values should be given in host-endian + * byte order. + * + * \param dev_handle a handle for the device to communicate with + * \param bmRequestType the request type field for the setup packet + * \param bRequest the request field for the setup packet + * \param wValue the value field for the setup packet + * \param wIndex the index field for the setup packet + * \param data a suitably-sized data buffer for either input or output + * (depending on direction bits within bmRequestType) + * \param wLength the length field for the setup packet. The data buffer should + * be at least this size. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * \returns on success, the number of bytes actually transferred + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the control request was not supported by the + * device + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout) +{ + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + unsigned char *buffer; + int completed = 0; + int r; + + if (!transfer) + return LIBUSB_ERROR_NO_MEM; + + buffer = (unsigned char*) malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength); + if (!buffer) { + libusb_free_transfer(transfer); + return LIBUSB_ERROR_NO_MEM; + } + + libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, + wLength); + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) + memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength); + + libusb_fill_control_transfer(transfer, dev_handle, buffer, + sync_transfer_cb, &completed, timeout); + transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER; + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + return r; + } + + sync_transfer_wait_for_completion(transfer); + + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) + memcpy(data, libusb_control_transfer_get_data(transfer), + transfer->actual_length); + + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + r = transfer->actual_length; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + r = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + r = LIBUSB_ERROR_OVERFLOW; + break; + case LIBUSB_TRANSFER_ERROR: + case LIBUSB_TRANSFER_CANCELLED: + r = LIBUSB_ERROR_IO; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + libusb_free_transfer(transfer); + return r; +} + +static int do_sync_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + int *transferred, unsigned int timeout, unsigned char type) +{ + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + int completed = 0; + int r; + + if (!transfer) + return LIBUSB_ERROR_NO_MEM; + + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, length, + sync_transfer_cb, &completed, timeout); + transfer->type = type; + + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + return r; + } + + sync_transfer_wait_for_completion(transfer); + + *transferred = transfer->actual_length; + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + r = 0; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + r = LIBUSB_ERROR_OVERFLOW; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + r = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_ERROR: + case LIBUSB_TRANSFER_CANCELLED: + r = LIBUSB_ERROR_IO; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + libusb_free_transfer(transfer); + return r; +} + +/** \ingroup syncio + * Perform a USB bulk transfer. The direction of the transfer is inferred from + * the direction bits of the endpoint address. + * + * For bulk reads, the length field indicates the maximum length of + * data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for bulk writes. + * Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusbx may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusbx is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out (and populates + * transferred) + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, int *transferred, + unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_BULK); +} + +/** \ingroup syncio + * Perform a USB interrupt transfer. The direction of the transfer is inferred + * from the direction bits of the endpoint address. + * + * For interrupt reads, the length field indicates the maximum length + * of data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for interrupt + * writes. Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusbx may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusbx is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * The default endpoint bInterval value is used as the polling interval. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other error + */ +int API_EXPORTED libusb_interrupt_transfer( + struct libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *data, int length, int *transferred, unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT); +} diff --git a/Externals/libusbx/libusb/version.h b/Externals/libusbx/libusb/version.h new file mode 100644 index 0000000000..cf37de97a5 --- /dev/null +++ b/Externals/libusbx/libusb/version.h @@ -0,0 +1,18 @@ +/* This file is parsed by m4 and windres and RC.EXE so please keep it simple. */ +#include "version_nano.h" +#ifndef LIBUSB_MAJOR +#define LIBUSB_MAJOR 1 +#endif +#ifndef LIBUSB_MINOR +#define LIBUSB_MINOR 0 +#endif +#ifndef LIBUSB_MICRO +#define LIBUSB_MICRO 16 +#endif +#ifndef LIBUSB_NANO +#define LIBUSB_NANO 0 +#endif +/* LIBUSB_RC is the release candidate suffix. Should normally be empty. */ +#ifndef LIBUSB_RC +#define LIBUSB_RC "" +#endif diff --git a/Externals/libusbx/libusb/version_nano.h b/Externals/libusbx/libusb/version_nano.h new file mode 100644 index 0000000000..525cd7d52d --- /dev/null +++ b/Externals/libusbx/libusb/version_nano.h @@ -0,0 +1 @@ +#define LIBUSB_NANO 10774 diff --git a/Externals/libusbx/ltmain.sh b/Externals/libusbx/ltmain.sh new file mode 100644 index 0000000000..63ae69dc6f --- /dev/null +++ b/Externals/libusbx/ltmain.sh @@ -0,0 +1,9655 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.2 +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3
/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/Externals/libusbx/m4/libtool.m4 b/Externals/libusbx/m4/libtool.m4 new file mode 100644 index 0000000000..56666f0ece --- /dev/null +++ b/Externals/libusbx/m4/libtool.m4 @@ -0,0 +1,7986 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/Externals/libusbx/m4/ltoptions.m4 b/Externals/libusbx/m4/ltoptions.m4 new file mode 100644 index 0000000000..5d9acd8e23 --- /dev/null +++ b/Externals/libusbx/m4/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/Externals/libusbx/m4/ltsugar.m4 b/Externals/libusbx/m4/ltsugar.m4 new file mode 100644 index 0000000000..9000a057d3 --- /dev/null +++ b/Externals/libusbx/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/Externals/libusbx/m4/ltversion.m4 b/Externals/libusbx/m4/ltversion.m4 new file mode 100644 index 0000000000..07a8602d48 --- /dev/null +++ b/Externals/libusbx/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/Externals/libusbx/m4/lt~obsolete.m4 b/Externals/libusbx/m4/lt~obsolete.m4 new file mode 100644 index 0000000000..c573da90c5 --- /dev/null +++ b/Externals/libusbx/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/Externals/libusbx/missing b/Externals/libusbx/missing new file mode 100644 index 0000000000..cdea514931 --- /dev/null +++ b/Externals/libusbx/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2012-06-26.16; # UTC + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'automa4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/Externals/libusbx/msvc/config.h b/Externals/libusbx/msvc/config.h new file mode 100644 index 0000000000..bb542c5dc8 --- /dev/null +++ b/Externals/libusbx/msvc/config.h @@ -0,0 +1,39 @@ +/* config.h. Manual config for MSVC. */ + +#ifndef _MSC_VER +#warn "msvc/config.h shouldn't be included for your development environment." +#error "Please make sure the msvc/ directory is removed from your build path." +#endif + +/* Disable: warning C4200: nonstandard extension used : zero-sized array in struct/union */ +#pragma warning(disable:4200) +/* Disable: warning C6258: Using TerminateThread does not allow proper thread clean up */ +#pragma warning(disable: 6258) +#if defined(_PREFAST_) +/* Disable "Banned API" errors when using the MS's WDK OACR/Prefast */ +#pragma warning(disable:28719) +/* Disable "The function 'InitializeCriticalSection' must be called from within a try/except block" */ +#pragma warning(disable:28125) +#endif + +/* Default visibility */ +#define DEFAULT_VISIBILITY /**/ + +/* Enable global message logging */ +#define ENABLE_LOGGING 1 + +/* Uncomment to start with debug message logging enabled */ +// #define ENABLE_DEBUG_LOGGING 1 + +/* type of second poll() argument */ +#define POLL_NFDS_TYPE unsigned int + +/* Windows/WinCE backend */ +#if defined(_WIN32_WCE) +#define OS_WINCE 1 +#define HAVE_MISSING_H +#else +#define OS_WINDOWS 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_SYS_TYPES_H 1 +#endif diff --git a/Externals/libusbx/msvc/ddk_build.cmd b/Externals/libusbx/msvc/ddk_build.cmd new file mode 100644 index 0000000000..aadab502e4 --- /dev/null +++ b/Externals/libusbx/msvc/ddk_build.cmd @@ -0,0 +1,175 @@ +@echo off +::# default builds static library. +::# you can pass the following arguments (case insensitive): +::# - "DLL" to build a DLL instead of a static library +::# - "/MT" to build a static library compatible with MSVC's /MT option (LIBCMT vs MSVCRT) + +if Test%BUILD_ALT_DIR%==Test goto usage + +::# process commandline parameters +set TARGET=LIBRARY +set STATIC_LIBC= +set version=1.0 +set PWD=%~dp0 +set BUILD_CMD=build -bcwgZ -M2 + +if "%1" == "" goto no_more_args +::# /I for case insensitive +if /I Test%1==TestDLL set TARGET=DYNLINK +if /I Test%1==Test/MT set STATIC_LIBC=1 +:no_more_args + +cd ..\libusb\os +echo TARGETTYPE=%TARGET% > target +copy target+..\..\msvc\libusb_sources sources >NUL 2>&1 +del target +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set cpudir=i386 +set destType=Win32 +if %_BUILDARCH%==x86 goto isI386 +set cpudir=amd64 +set destType=x64 +:isI386 + +set srcPath=libusb\os\obj%BUILD_ALT_DIR%\%cpudir% + +set dstPath=%destType%\Debug +if %DDKBUILDENV%==chk goto isDebug +set dstPath=%destType%\Release +:isDebug + +if exist %destType% goto md2 +mkdir %destType% +:md2 +if exist %dstPath% goto md3 +mkdir %dstPath% +:md3 +if exist %dstPath%\dll goto md4 +mkdir %dstPath%\dll +:md4 +if exist %dstPath%\lib goto md5 +md %dstPath%\lib +:md5 +if exist %dstPath%\examples goto md6 +md %dstPath%\examples +:md6 +@echo on + +@if /I NOT Test%1==TestDLL goto copylib +copy %srcPath%\libusb-%version%.dll %dstPath%\dll +copy %srcPath%\libusb-%version%.pdb %dstPath%\dll +:copylib +copy %srcPath%\libusb-%version%.lib %dstPath%\lib + +@echo off + +if exist examples\listdevs_ddkbuild goto md7 +md examples\listdevs_ddkbuild +:md7 + +cd examples\listdevs_ddkbuild +copy ..\..\msvc\listdevs_sources sources >NUL 2>&1 +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set srcPath=examples\listdevs_ddkbuild\obj%BUILD_ALT_DIR%\%cpudir% +@echo on + +copy %srcPath%\listdevs.exe %dstPath%\examples +copy %srcPath%\listdevs.pdb %dstPath%\examples + +@echo off + +if exist examples\xusb_ddkbuild goto md8 +md examples\xusb_ddkbuild +:md8 + +cd examples\xusb_ddkbuild +copy ..\..\msvc\xusb_sources sources >NUL 2>&1 +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set srcPath=examples\xusb_ddkbuild\obj%BUILD_ALT_DIR%\%cpudir% +@echo on + +copy %srcPath%\xusb.exe %dstPath%\examples +copy %srcPath%\xusb.pdb %dstPath%\examples + +@echo off + +if exist examples\getopt\getopt_ddkbuild goto md9 +md examples\getopt\getopt_ddkbuild +:md9 + +cd examples\getopt\getopt_ddkbuild +copy ..\..\..\msvc\getopt_sources sources >NUL 2>&1 +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\..\.. + +if exist examples\fxload_ddkbuild goto md10 +md examples\fxload_ddkbuild +:md10 + +cd examples\fxload_ddkbuild +copy ..\..\msvc\fxload_sources sources >NUL 2>&1 +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set srcPath=examples\fxload_ddkbuild\obj%BUILD_ALT_DIR%\%cpudir% +@echo on + +copy %srcPath%\fxload.exe %dstPath%\examples +copy %srcPath%\fxload.pdb %dstPath%\examples + +@echo off + +if exist examples\hotplugtest_ddkbuild goto md11 +md examples\hotplugtest_ddkbuild +:md11 + +cd examples\hotplugtest_ddkbuild +copy ..\..\msvc\hotplugtest_sources sources >NUL 2>&1 +@echo on +%BUILD_CMD% +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set srcPath=examples\hotplugtest_ddkbuild\obj%BUILD_ALT_DIR%\%cpudir% +@echo on + +copy %srcPath%\hotplugtest.exe %dstPath%\examples +copy %srcPath%\hotplugtest.pdb %dstPath%\examples + +@echo off + +cd msvc +goto done + +:usage +echo ddk_build must be run in a WDK build environment +pause +goto done + +:builderror +echo Build failed + +:done +cd %PWD% diff --git a/Externals/libusbx/msvc/libusb_sources b/Externals/libusbx/msvc/libusb_sources new file mode 100644 index 0000000000..308a6663f3 --- /dev/null +++ b/Externals/libusbx/msvc/libusb_sources @@ -0,0 +1,38 @@ +#TARGETTYPE is not defined, to allow selection between static lib or DLL with ddk_build +TARGETNAME=libusb-1.0 +DLLDEF=..\libusb-1.0.def + +!IFNDEF MSC_WARNING_LEVEL +MSC_WARNING_LEVEL=/W3 +!ENDIF + +!IFDEF STATIC_LIBC +USE_LIBCMT=1 +!ELSE +USE_MSVCRT=1 +!ENDIF + +INCLUDES=..;..\..\msvc;$(DDK_INC_PATH) +C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) /DDDKBUILD + +# http://jpassing.com/2009/10/21/ltcg-issues-with-the-win7amd64-environment-of-wdk-7600/ +# prevents the following error when using the 64 bit static lib with Visual Studio 2010: +# "fatal error C1001: An internal error has occurred in the compiler. +# (compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 1823)" +# and the following with Visual Studio 2010: +# "fatal error C1047: The object or library file 'libusb-1.0.lib' was created with +# an older compiler than other objects; rebuild old objects and libraries" +USER_C_FLAGS=/GL- + +TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib + +SOURCES=..\core.c \ + ..\descriptor.c \ + ..\io.c \ + ..\strerror.c \ + ..\sync.c \ + ..\hotplug.c \ + threads_windows.c \ + poll_windows.c \ + windows_usb.c \ + ..\libusb-1.0.rc diff --git a/Externals/libusbx/msvc/libusb_static.dsp b/Externals/libusbx/msvc/libusb_static.dsp new file mode 100644 index 0000000000..afdbbeddb2 --- /dev/null +++ b/Externals/libusbx/msvc/libusb_static.dsp @@ -0,0 +1,174 @@ +# Microsoft Developer Studio Project File - Name="libusb_static" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libusb_static - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libusb_static.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libusb_static.mak" CFG="libusb_static - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libusb_static - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libusb_static - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libusb_static - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../Win32/Release/lib" +# PROP Intermediate_Dir "../Win32/Release/lib" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../libusb" /D "WIN32" /D "NDEBUG" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_LIB" /FR /FD /EHsc /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../Win32/Release/lib/libusb-1.0.lib" + +!ELSEIF "$(CFG)" == "libusb_static - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../Win32/Debug/lib" +# PROP Intermediate_Dir "../Win32/Debug/lib" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../libusb" /D "WIN32" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_LIB" /FR /FD /GZ /EHsc /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /n +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../Win32/Debug/lib/libusb-1.0.lib" + +!ENDIF + +# Begin Target + +# Name "libusb_static - Win32 Release" +# Name "libusb_static - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\libusb\core.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\descriptor.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\io.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\sync.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusbi.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_common.h +# End Source File +# End Group +# End Target +# End Project diff --git a/Externals/libusbx/msvc/libusb_static_2013.vcxproj b/Externals/libusbx/msvc/libusb_static_2013.vcxproj new file mode 100644 index 0000000000..b3a79c645c --- /dev/null +++ b/Externals/libusbx/msvc/libusb_static_2013.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {349EE8F9-7D25-4909-AAF5-FF3FADE72187} + libusb-1.0 + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + .;..\libusb;%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Externals/libusbx/msvc/libusb_static_2013.vcxproj.filters b/Externals/libusbx/msvc/libusb_static_2013.vcxproj.filters new file mode 100644 index 0000000000..5cd8060659 --- /dev/null +++ b/Externals/libusbx/msvc/libusb_static_2013.vcxproj.filters @@ -0,0 +1,74 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/Externals/libusbx/msvc/libusb_static_wince.vcproj b/Externals/libusbx/msvc/libusb_static_wince.vcproj new file mode 100644 index 0000000000..a595319848 --- /dev/null +++ b/Externals/libusbx/msvc/libusb_static_wince.vcproj @@ -0,0 +1,1185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Externals/libusbx/msvc/missing.c b/Externals/libusbx/msvc/missing.c new file mode 100644 index 0000000000..85d9d6f344 --- /dev/null +++ b/Externals/libusbx/msvc/missing.c @@ -0,0 +1,80 @@ +/* + * Source file for missing WinCE functionality + * Copyright © 2012 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "missing.h" + +#include +#include + +#include + +// The registry path to store environment variables +#define ENVIRONMENT_REG_PATH _T("Software\\libusb\\environment") + +/* Workaround getenv not being available on WinCE. + * Instead look in HKLM\Software\libusb\environment */ +char *getenv(const char *name) +{ + static char value[MAX_PATH]; + TCHAR wValue[MAX_PATH]; + WCHAR wName[MAX_PATH]; + DWORD dwType, dwData; + HKEY hkey; + LONG rc; + + if (!name) + return NULL; + + if (MultiByteToWideChar(CP_UTF8, 0, name, -1, wName, MAX_PATH) <= 0) { + usbi_dbg("Failed to convert environment variable name to wide string"); + return NULL; + } + wName[MAX_PATH - 1] = 0; // Be sure it's NUL terminated + + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ENVIRONMENT_REG_PATH, 0, KEY_QUERY_VALUE, &hkey); + if (rc != ERROR_SUCCESS) { + usbi_dbg("Failed to open registry key for getenv with error %d", rc); + return NULL; + } + + // Attempt to read the key + dwData = sizeof(wValue); + rc = RegQueryValueEx(hkey, wName, NULL, &dwType, + (LPBYTE)&wValue, &dwData); + RegCloseKey(hkey); + if (rc != ERROR_SUCCESS) { + usbi_dbg("Failed to read registry key value for getenv with error %d", rc); + return NULL; + } + if (dwType != REG_SZ) { + usbi_dbg("Registry value was of type %d instead of REG_SZ", dwType); + return NULL; + } + + // Success in reading the key, convert from WCHAR to char + if (WideCharToMultiByte(CP_UTF8, 0, + wValue, dwData / sizeof(*wValue), + value, MAX_PATH, + NULL, NULL) <= 0) { + usbi_dbg("Failed to convert environment variable value to narrow string"); + return NULL; + } + value[MAX_PATH - 1] = 0; // Be sure it's NUL terminated + return value; +} diff --git a/Externals/libusbx/msvc/missing.h b/Externals/libusbx/msvc/missing.h new file mode 100644 index 0000000000..183b9d35a2 --- /dev/null +++ b/Externals/libusbx/msvc/missing.h @@ -0,0 +1,32 @@ +/* + * Header file for missing WinCE functionality + * Copyright © 2012-2013 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef MISSING_H +#define MISSING_H + +/* Windows CE doesn't have SleepEx() - Fallback to Sleep() */ +#define SleepEx(m, a) Sleep(m) + +/* Windows CE doesn't have any APIs to query environment variables. + * + * This contains a registry based implementation of getenv. + */ +char *getenv(const char *name); + +#endif diff --git a/Externals/miniupnpc/miniupnpc.vcxproj b/Externals/miniupnpc/miniupnpc.vcxproj index db92cd61f9..b2b8d568e8 100644 --- a/Externals/miniupnpc/miniupnpc.vcxproj +++ b/Externals/miniupnpc/miniupnpc.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -19,112 +19,28 @@ - {A680190D-0764-485B-9CF3-A82C5EDD5715} - miniupnpc + {31643FDB-1BB8-4965-9DE7-000FC88D35AE} - + StaticLibrary + v120 + Unicode + + true - MultiByte - - StaticLibrary - true - MultiByte - - - StaticLibrary + false - true - MultiByte - - - StaticLibrary - false - true - MultiByte - + - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - _WIN32_WINNT=0x0501;STATICLIB;DEBUG - - - true - ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) - - - - - Level3 - Disabled - _WIN32_WINNT=0x0501;STATICLIB;DEBUG - - - true - ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) - - - - - Level3 - MaxSpeed - true - true - _WIN32_WINNT=0x0501;STATICLIB - - - true - true - true - ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) - - - - - Level3 - MaxSpeed - true - true - _WIN32_WINNT=0x0501;STATICLIB - - - true - true - true - ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) - - @@ -158,6 +74,17 @@ + + + + + + + + + + + diff --git a/Externals/miniupnpc/miniupnpc.vcxproj.filters b/Externals/miniupnpc/miniupnpc.vcxproj.filters deleted file mode 100644 index 1b4bfa312a..0000000000 --- a/Externals/miniupnpc/miniupnpc.vcxproj.filters +++ /dev/null @@ -1,108 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/Externals/msvcrt/Win32/msvcp120.dll b/Externals/msvcrt/Win32/msvcp120.dll new file mode 100644 index 0000000000..a237d2d778 Binary files /dev/null and b/Externals/msvcrt/Win32/msvcp120.dll differ diff --git a/Externals/msvcrt/Win32/msvcr120.dll b/Externals/msvcrt/Win32/msvcr120.dll new file mode 100644 index 0000000000..8c36149a65 Binary files /dev/null and b/Externals/msvcrt/Win32/msvcr120.dll differ diff --git a/Externals/msvcrt/Win32/vcomp120.dll b/Externals/msvcrt/Win32/vcomp120.dll new file mode 100644 index 0000000000..727a120287 Binary files /dev/null and b/Externals/msvcrt/Win32/vcomp120.dll differ diff --git a/Externals/msvcrt/x64/msvcp120.dll b/Externals/msvcrt/x64/msvcp120.dll new file mode 100644 index 0000000000..4ea1efa734 Binary files /dev/null and b/Externals/msvcrt/x64/msvcp120.dll differ diff --git a/Externals/msvcrt/x64/msvcr120.dll b/Externals/msvcrt/x64/msvcr120.dll new file mode 100644 index 0000000000..d711c92232 Binary files /dev/null and b/Externals/msvcrt/x64/msvcr120.dll differ diff --git a/Externals/msvcrt/x64/vcomp120.dll b/Externals/msvcrt/x64/vcomp120.dll new file mode 100644 index 0000000000..34e1fb09dc Binary files /dev/null and b/Externals/msvcrt/x64/vcomp120.dll differ diff --git a/Externals/polarssl/.gitignore b/Externals/polarssl/.gitignore new file mode 100644 index 0000000000..07374ec899 --- /dev/null +++ b/Externals/polarssl/.gitignore @@ -0,0 +1,5 @@ +CMakeCache.txt +CMakeFiles +CTestTestfile.cmake +cmake_install.cmake +Testing diff --git a/Externals/polarssl/CMakeLists.txt b/Externals/polarssl/CMakeLists.txt new file mode 100644 index 0000000000..54aa012fdb --- /dev/null +++ b/Externals/polarssl/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 2.6) +project(POLARSSL C) + +if(CMAKE_COMPILER_IS_GNUCC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra -W -Wdeclaration-after-statement") + set(CMAKE_C_FLAGS_DEBUG "-g3 -O0") + set(CMAKE_C_FLAGS_COVERAGE "-g3 -O0 -fprofile-arcs -ftest-coverage -lgcov") +endif(CMAKE_COMPILER_IS_GNUCC) + +if(CMAKE_BUILD_TYPE STREQUAL "Coverage") + if(CMAKE_COMPILER_IS_GNUCC) + set(CMAKE_SHARED_LINKER_FLAGS "-fprofile-arcs -ftest-coverage") + endif(CMAKE_COMPILER_IS_GNUCC) +endif(CMAKE_BUILD_TYPE STREQUAL "Coverage") + +option(USE_PKCS11_HELPER_LIBRARY "Build PolarSSL with the pkcs11-helper library." OFF) + +option(ENABLE_ZLIB_SUPPORT "Build PolarSSL with zlib library." OFF) + +if(LIB_INSTALL_DIR) +else() +set(LIB_INSTALL_DIR lib) +endif() + +include_directories(include/) + +if(ENABLE_ZLIB_SUPPORT) + find_package(ZLIB) + + if(ZLIB_FOUND) + include_directories(ZLIB_INCLUDE_DIR) + endif(ZLIB_FOUND) +endif(ENABLE_ZLIB_SUPPORT) + +add_subdirectory(library) + + diff --git a/Externals/polarssl/ChangeLog b/Externals/polarssl/ChangeLog new file mode 100644 index 0000000000..21c91df93b --- /dev/null +++ b/Externals/polarssl/ChangeLog @@ -0,0 +1,746 @@ +PolarSSL ChangeLog + += Version 1.2.8 released 2013-06-19 +Features + * Parsing of PKCS#8 encrypted private key files + * PKCS#12 PBE and derivation functions + * Centralized module option values in config.h to allow user-defined + settings without editing header files by using POLARSSL_CONFIG_OPTIONS + +Changes + * HAVEGE random generator disabled by default + * Internally split up x509parse_key() into a (PEM) handler function + and specific DER parser functions for the PKCS#1 and unencrypted + PKCS#8 private key formats + * Added mechanism to provide alternative implementations for all + symmetric cipher and hash algorithms (e.g. POLARSSL_AES_ALT in + config.h) + * PKCS#5 module added. Moved PBKDF2 functionality inside and deprecated + old PBKDF2 module + +Bugfix + * Secure renegotiation extension should only be sent in case client + supports secure renegotiation + * Fixed offset for cert_type list in ssl_parse_certificate_request() + * Fixed const correctness issues that have no impact on the ABI + * x509parse_crt() now better handles PEM error situations + * ssl_parse_certificate() now calls x509parse_crt_der() directly + instead of the x509parse_crt() wrapper that can also parse PEM + certificates + * x509parse_crtpath() is now reentrant and uses more portable stat() + * Fixed bignum.c and bn_mul.h to support Thumb2 and LLVM compiler + * Fixed values for 2-key Triple DES in cipher layer + * ssl_write_certificate_request() can handle empty ca_chain + +Security + * A possible DoS during the SSL Handshake, due to faulty parsing of + PEM-encoded certificates has been fixed (found by Jack Lloyd) + += Version 1.2.7 released 2013-04-13 +Features + * Ability to specify allowed ciphersuites based on the protocol version. + +Changes + * Default Blowfish keysize is now 128-bits + * Test suites made smaller to accommodate Raspberry Pi + +Bugfix + * Fix for MPI assembly for ARM + * GCM adapted to support sizes > 2^29 + += Version 1.2.6 released 2013-03-11 +Bugfix + * Fixed memory leak in ssl_free() and ssl_reset() for active session + * Corrected GCM counter incrementation to use only 32-bits instead of + 128-bits (found by Yawning Angel) + * Fixes for 64-bit compilation with MS Visual Studio + * Fixed net_bind() for specified IP addresses on little endian systems + * Fixed assembly code for ARM (Thumb and regular) for some compilers + +Changes + * Internally split up rsa_pkcs1_encrypt(), rsa_pkcs1_decrypt(), + rsa_pkcs1_sign() and rsa_pkcs1_verify() to separate PKCS#1 v1.5 and + PKCS#1 v2.1 functions + * Added support for custom labels when using rsa_rsaes_oaep_encrypt() + or rsa_rsaes_oaep_decrypt() + * Re-added handling for SSLv2 Client Hello when the define + POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO is set + * The SSL session cache module (ssl_cache) now also retains peer_cert + information (not the entire chain) + +Security + * Removed further timing differences during SSL message decryption in + ssl_decrypt_buf() + * Removed timing differences due to bad padding from + rsa_rsaes_pkcs1_v15_decrypt() and rsa_pkcs1_decrypt() for PKCS#1 v1.5 + operations + += Version 1.2.5 released 2013-02-02 +Changes + * Allow enabling of dummy error_strerror() to support some use-cases + * Debug messages about padding errors during SSL message decryption are + disabled by default and can be enabled with POLARSSL_SSL_DEBUG_ALL + * Sending of security-relevant alert messages that do not break + interoperability can be switched on/off with the flag + POLARSSL_SSL_ALL_ALERT_MESSAGES + +Security + * Removed timing differences during SSL message decryption in + ssl_decrypt_buf() due to badly formatted padding + += Version 1.2.4 released 2013-01-25 +Changes + * Added ssl_handshake_step() to allow single stepping the handshake process + +Bugfix + * Memory leak when using RSA_PKCS_V21 operations fixed + * Handle future version properly in ssl_write_certificate_request() + * Correctly handle CertificateRequest message in client for <= TLS 1.1 + without DN list + += Version 1.2.3 released 2012-11-26 +Bugfix + * Server not always sending correct CertificateRequest message + += Version 1.2.2 released 2012-11-24 +Changes + * Added p_hw_data to ssl_context for context specific hardware acceleration + data + * During verify trust-CA is only checked for expiration and CRL presence + +Bugfixes + * Fixed client authentication compatibility + * Fixed dependency on POLARSSL_SHA4_C in SSL modules + += Version 1.2.1 released 2012-11-20 +Changes + * Depth that the certificate verify callback receives is now numbered + bottom-up (Peer cert depth is 0) + +Bugfixes + * Fixes for MSVC6 + * Moved mpi_inv_mod() outside POLARSSL_GENPRIME + * Allow R and A to point to same mpi in mpi_div_mpi (found by Manuel + Pégourié-Gonnard) + * Fixed possible segfault in mpi_shift_r() (found by Manuel + Pégourié-Gonnard) + * Added max length check for rsa_pkcs1_sign with PKCS#1 v2.1 + += Version 1.2.0 released 2012-10-31 +Features + * Added support for NULL cipher (POLARSSL_CIPHER_NULL_CIPHER) and weak + ciphersuites (POLARSSL_ENABLE_WEAK_CIPHERSUITES). They are disabled by + default! + * Added support for wildcard certificates + * Added support for multi-domain certificates through the X509 Subject + Alternative Name extension + * Added preliminary ASN.1 buffer writing support + * Added preliminary X509 Certificate Request writing support + * Added key_app_writer example application + * Added cert_req example application + * Added base Galois Counter Mode (GCM) for AES + * Added TLS 1.2 support (RFC 5246) + * Added GCM suites to TLS 1.2 (RFC 5288) + * Added commandline error code convertor (util/strerror) + * Added support for Hardware Acceleration hooking in SSL/TLS + * Added OpenSSL / PolarSSL compatibility script (tests/compat.sh) and + example application (programs/ssl/o_p_test) (requires OpenSSL) + * Added X509 CA Path support + * Added Thumb assembly optimizations + * Added DEFLATE compression support as per RFC3749 (requires zlib) + * Added blowfish algorithm (Generic and cipher layer) + * Added PKCS#5 PBKDF2 key derivation function + * Added Secure Renegotiation (RFC 5746) + * Added predefined DHM groups from RFC 5114 + * Added simple SSL session cache implementation + * Added ServerName extension parsing (SNI) at server side + * Added option to add minimum accepted SSL/TLS protocol version + +Changes + * Removed redundant POLARSSL_DEBUG_MSG define + * AES code only check for Padlock once + * Fixed const-correctness mpi_get_bit() + * Documentation for mpi_lsb() and mpi_msb() + * Moved out_msg to out_hdr + 32 to support hardware acceleration + * Changed certificate verify behaviour to comply with RFC 6125 section 6.3 + to not match CN if subjectAltName extension is present (Closes ticket #56) + * Cipher layer cipher_mode_t POLARSSL_MODE_CFB128 is renamed to + POLARSSL_MODE_CFB, to also handle different block size CFB modes. + * Removed handling for SSLv2 Client Hello (as per RFC 5246 recommendation) + * Revamped session resumption handling + * Generalized external private key implementation handling (like PKCS#11) + in SSL/TLS + * Revamped x509_verify() and the SSL f_vrfy callback implementations + * Moved from unsigned long to fixed width uint32_t types throughout code + * Renamed ciphersuites naming scheme to IANA reserved names + +Bugfix + * Fixed handling error in mpi_cmp_mpi() on longer B values (found by + Hui Dong) + * Fixed potential heap corruption in x509_name allocation + * Fixed single RSA test that failed on Big Endian systems (Closes ticket #54) + * mpi_exp_mod() now correctly handles negative base numbers (Closes ticket + #52) + * Handle encryption with private key and decryption with public key as per + RFC 2313 + * Handle empty certificate subject names + * Prevent reading over buffer boundaries on X509 certificate parsing + * mpi_add_abs() now correctly handles adding short numbers to long numbers + with carry rollover (found by Ruslan Yushchenko) + * Handle existence of OpenSSL Trust Extensions at end of X.509 DER blob + * Fixed MPI assembly for SPARC64 platform + +Security + * Fixed potential memory zeroization on miscrafted RSA key (found by Eloi + Vanderbeken) + += Version 1.1.5 released on 2013-01-16 +Bugfix + * Fixed MPI assembly for SPARC64 platform + * Handle existence of OpenSSL Trust Extensions at end of X.509 DER blob + * mpi_add_abs() now correctly handles adding short numbers to long numbers + with carry rollover + * Moved mpi_inv_mod() outside POLARSSL_GENPRIME + * Prevent reading over buffer boundaries on X509 certificate parsing + * mpi_exp_mod() now correctly handles negative base numbers (Closes ticket + #52) + * Fixed possible segfault in mpi_shift_r() (found by Manuel + Pégourié-Gonnard) + * Allow R and A to point to same mpi in mpi_div_mpi (found by Manuel + Pégourié-Gonnard) + * Added max length check for rsa_pkcs1_sign with PKCS#1 v2.1 + * Memory leak when using RSA_PKCS_V21 operations fixed + * Handle encryption with private key and decryption with public key as per + RFC 2313 + * Fixes for MSVC6 + +Security + * Fixed potential memory zeroization on miscrafted RSA key (found by Eloi + Vanderbeken) + += Version 1.1.4 released on 2012-05-31 +Bugfix + * Correctly handle empty SSL/TLS packets (Found by James Yonan) + * Fixed potential heap corruption in x509_name allocation + * Fixed single RSA test that failed on Big Endian systems (Closes ticket #54) + += Version 1.1.3 released on 2012-04-29 +Bugfix + * Fixed random MPI generation to not generate more size than requested. + += Version 1.1.2 released on 2012-04-26 +Bugfix + * Fixed handling error in mpi_cmp_mpi() on longer B values (found by + Hui Dong) + +Security + * Fixed potential memory corruption on miscrafted client messages (found by + Frama-C team at CEA LIST) + * Fixed generation of DHM parameters to correct length (found by Ruslan + Yushchenko) + += Version 1.1.1 released on 2012-01-23 +Bugfix + * Check for failed malloc() in ssl_set_hostname() and x509_get_entries() + (Closes ticket #47, found by Hugo Leisink) + * Fixed issues with Intel compiler on 64-bit systems (Closes ticket #50) + * Fixed multiple compiler warnings for VS6 and armcc + * Fixed bug in CTR_CRBG selftest + += Version 1.1.0 released on 2011-12-22 +Features + * Added ssl_session_reset() to allow better multi-connection pools of + SSL contexts without needing to set all non-connection-specific + data and pointers again. Adapted ssl_server to use this functionality. + * Added ssl_set_max_version() to allow clients to offer a lower maximum + supported version to a server to help buggy server implementations. + (Closes ticket #36) + * Added cipher_get_cipher_mode() and cipher_get_cipher_operation() + introspection functions (Closes ticket #40) + * Added CTR_DRBG based on AES-256-CTR (NIST SP 800-90) random generator + * Added a generic entropy accumulator that provides support for adding + custom entropy sources and added some generic and platform dependent + entropy sources + +Changes + * Documentation for AES and Camellia in modes CTR and CFB128 clarified. + * Fixed rsa_encrypt and rsa_decrypt examples to use public key for + encryption and private key for decryption. (Closes ticket #34) + * Inceased maximum size of ASN1 length reads to 32-bits. + * Added an EXPLICIT tag number parameter to x509_get_ext() + * Added a separate CRL entry extension parsing function + * Separated the ASN.1 parsing code from the X.509 specific parsing code. + So now there is a module that is controlled with POLARSSL_ASN1_PARSE_C. + * Changed the defined key-length of DES ciphers in cipher.h to include the + parity bits, to prevent mistakes in copying data. (Closes ticket #33) + * Loads of minimal changes to better support WINCE as a build target + (Credits go to Marco Lizza) + * Added POLARSSL_MPI_WINDOW_SIZE definition to allow easier time to memory + trade-off + * Introduced POLARSSL_MPI_MAX_SIZE and POLARSSL_MPI_MAX_BITS for MPI size + management (Closes ticket #44) + * Changed the used random function pointer to more flexible format. Renamed + havege_rand() to havege_random() to prevent mistakes. Lots of changes as + a consequence in library code and programs + * Moved all examples programs to use the new entropy and CTR_DRBG + * Added permissive certificate parsing to x509parse_crt() and + x509parse_crtfile(). With permissive parsing the parsing does not stop on + encountering a parse-error. Beware that the meaning of return values has + changed! + * All error codes are now negative. Even on mermory failures and IO errors. + +Bugfix + * Fixed faulty HMAC-MD2 implementation. Found by dibac. (Closes + ticket #37) + * Fixed a bug where the CRL parser expected an EXPLICIT ASN.1 tag + before version numbers + * Allowed X509 key usage parsing to accept 4 byte values instead of the + standard 1 byte version sometimes used by Microsoft. (Closes ticket #38) + * Fixed incorrect behaviour in case of RSASSA-PSS with a salt length + smaller than the hash length. (Closes ticket #41) + * If certificate serial is longer than 32 octets, serial number is now + appended with '....' after first 28 octets + * Improved build support for s390x and sparc64 in bignum.h + * Fixed MS Visual C++ name clash with int64 in sha4.h + * Corrected removal of leading "00:" in printing serial numbers in + certificates and CRLs + += Version 1.0.0 released on 2011-07-27 +Features + * Expanded cipher layer with support for CFB128 and CTR mode + * Added rsa_encrypt and rsa_decrypt simple example programs. + +Changes + * The generic cipher and message digest layer now have normal error + codes instead of integers + +Bugfix + * Undid faulty bug fix in ssl_write() when flushing old data (Ticket + #18) + += Version 0.99-pre5 released on 2011-05-26 +Features + * Added additional Cipher Block Modes to symmetric ciphers + (AES CTR, Camellia CTR, XTEA CBC) including the option to + enable and disable individual modes when needed + * Functions requiring File System functions can now be disabled + by undefining POLARSSL_FS_IO + * A error_strerror function() has been added to translate between + error codes and their description. + * Added mpi_get_bit() and mpi_set_bit() individual bit setter/getter + functions. + * Added ssl_mail_client and ssl_fork_server as example programs. + +Changes + * Major argument / variable rewrite. Introduced use of size_t + instead of int for buffer lengths and loop variables for + better unsigned / signed use. Renamed internal bigint types + t_int and t_dbl to t_uint and t_udbl in the process + * mpi_init() and mpi_free() now only accept a single MPI + argument and do not accept variable argument lists anymore. + * The error codes have been remapped and combining error codes + is now done with a PLUS instead of an OR as error codes + used are negative. + * Changed behaviour of net_read(), ssl_fetch_input() and ssl_recv(). + net_recv() now returns 0 on EOF instead of + POLARSSL_ERR_NET_CONN_RESET. ssl_fetch_input() returns + POLARSSL_ERR_SSL_CONN_EOF on an EOF from its f_recv() function. + ssl_read() returns 0 if a POLARSSL_ERR_SSL_CONN_EOF is received + after the handshake. + * Network functions now return POLARSSL_ERR_NET_WANT_READ or + POLARSSL_ERR_NET_WANT_WRITE instead of the ambiguous + POLARSSL_ERR_NET_TRY_AGAIN + += Version 0.99-pre4 released on 2011-04-01 +Features + * Added support for PKCS#1 v2.1 encoding and thus support + for the RSAES-OAEP and RSASSA-PSS operations. + * Reading of Public Key files incorporated into default x509 + functionality as well. + * Added mpi_fill_random() for centralized filling of big numbers + with random data (Fixed ticket #10) + +Changes + * Debug print of MPI now removes leading zero octets and + displays actual bit size of the value. + * x509parse_key() (and as a consequence x509parse_keyfile()) + does not zeroize memory in advance anymore. Use rsa_init() + before parsing a key or keyfile! + +Bugfix + * Debug output of MPI's now the same independent of underlying + platform (32-bit / 64-bit) (Fixes ticket #19, found by Mads + Kiilerich and Mihai Militaru) + * Fixed bug in ssl_write() when flushing old data (Fixed ticket + #18, found by Nikolay Epifanov) + * Fixed proper handling of RSASSA-PSS verification with variable + length salt lengths + += Version 0.99-pre3 released on 2011-02-28 +This release replaces version 0.99-pre2 which had possible copyright issues. +Features + * Parsing PEM private keys encrypted with DES and AES + are now supported as well (Fixes ticket #5) + * Added crl_app program to allow easy reading and + printing of X509 CRLs from file + +Changes + * Parsing of PEM files moved to separate module (Fixes + ticket #13). Also possible to remove PEM support for + systems only using DER encoding + +Bugfixes + * Corrected parsing of UTCTime dates before 1990 and + after 1950 + * Support more exotic OID's when parsing certificates + (found by Mads Kiilerich) + * Support more exotic name representations when parsing + certificates (found by Mads Kiilerich) + * Replaced the expired test certificates + * Do not bail out if no client certificate specified. Try + to negotiate anonymous connection (Fixes ticket #12, + found by Boris Krasnovskiy) + +Security fixes + * Fixed a possible Man-in-the-Middle attack on the + Diffie Hellman key exchange (thanks to Larry Highsmith, + Subreption LLC) + += Version 0.99-pre1 released on 2011-01-30 +Features +Note: Most of these features have been donated by Fox-IT + * Added Doxygen source code documentation parts + * Added reading of DHM context from memory and file + * Improved X509 certificate parsing to include extended + certificate fields, including Key Usage + * Improved certificate verification and verification + against the available CRLs + * Detection for DES weak keys and parity bits added + * Improvements to support integration in other + applications: + + Added generic message digest and cipher wrapper + + Improved information about current capabilities, + status, objects and configuration + + Added verification callback on certificate chain + verification to allow external blacklisting + + Additional example programs to show usage + * Added support for PKCS#11 through the use of the + libpkcs11-helper library + +Changes + * x509parse_time_expired() checks time in addition to + the existing date check + * The ciphers member of ssl_context and the cipher member + of ssl_session have been renamed to ciphersuites and + ciphersuite respectively. This clarifies the difference + with the generic cipher layer and is better naming + altogether + += Version 0.14.0 released on 2010-08-16 +Features + * Added support for SSL_EDH_RSA_AES_128_SHA and + SSL_EDH_RSA_CAMELLIA_128_SHA ciphersuites + * Added compile-time and run-time version information + * Expanded ssl_client2 arguments for more flexibility + * Added support for TLS v1.1 + +Changes + * Made Makefile cleaner + * Removed dependency on rand() in rsa_pkcs1_encrypt(). + Now using random fuction provided to function and + changed the prototype of rsa_pkcs1_encrypt(), + rsa_init() and rsa_gen_key(). + * Some SSL defines were renamed in order to avoid + future confusion + +Bug fixes + * Fixed CMake out of source build for tests (found by + kkert) + * rsa_check_private() now supports PKCS1v2 keys as well + * Fixed deadlock in rsa_pkcs1_encrypt() on failing random + generator + += Version 0.13.1 released on 2010-03-24 +Bug fixes + * Fixed Makefile in library that was mistakenly merged + * Added missing const string fixes + += Version 0.13.0 released on 2010-03-21 +Features + * Added option parsing for host and port selection to + ssl_client2 + * Added support for GeneralizedTime in X509 parsing + * Added cert_app program to allow easy reading and + printing of X509 certificates from file or SSL + connection. + +Changes + * Added const correctness for main code base + * X509 signature algorithm determination is now + in a function to allow easy future expansion + * Changed symmetric cipher functions to + identical interface (returning int result values) + * Changed ARC4 to use seperate input/output buffer + * Added reset function for HMAC context as speed-up + for specific use-cases + +Bug fixes + * Fixed bug resulting in failure to send the last + certificate in the chain in ssl_write_certificate() and + ssl_write_certificate_request() (found by fatbob) + * Added small fixes for compiler warnings on a Mac + (found by Frank de Brabander) + * Fixed algorithmic bug in mpi_is_prime() (found by + Smbat Tonoyan) + += Version 0.12.1 released on 2009-10-04 +Changes + * Coverage test definitions now support 'depends_on' + tagging system. + * Tests requiring specific hashing algorithms now honor + the defines. + +Bug fixes + * Changed typo in #ifdef in x509parse.c (found + by Eduardo) + += Version 0.12.0 released on 2009-07-28 +Features + * Added CMake makefiles as alternative to regular Makefiles. + * Added preliminary Code Coverage tests for AES, ARC4, + Base64, MPI, SHA-family, MD-family, HMAC-SHA-family, + Camellia, DES, 3-DES, RSA PKCS#1, XTEA, Diffie-Hellman + and X509parse. + +Changes + * Error codes are not (necessarily) negative. Keep + this is mind when checking for errors. + * RSA_RAW renamed to SIG_RSA_RAW for consistency. + * Fixed typo in name of POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE. + * Changed interface for AES and Camellia setkey functions + to indicate invalid key lengths. + +Bug fixes + * Fixed include location of endian.h on FreeBSD (found by + Gabriel) + * Fixed include location of endian.h and name clash on + Apples (found by Martin van Hensbergen) + * Fixed HMAC-MD2 by modifying md2_starts(), so that the + required HMAC ipad and opad variables are not cleared. + (found by code coverage tests) + * Prevented use of long long in bignum if + POLARSSL_HAVE_LONGLONG not defined (found by Giles + Bathgate). + * Fixed incorrect handling of negative strings in + mpi_read_string() (found by code coverage tests). + * Fixed segfault on handling empty rsa_context in + rsa_check_pubkey() and rsa_check_privkey() (found by + code coverage tests). + * Fixed incorrect handling of one single negative input + value in mpi_add_abs() (found by code coverage tests). + * Fixed incorrect handling of negative first input + value in mpi_sub_abs() (found by code coverage tests). + * Fixed incorrect handling of negative first input + value in mpi_mod_mpi() and mpi_mod_int(). Resulting + change also affects mpi_write_string() (found by code + coverage tests). + * Corrected is_prime() results for 0, 1 and 2 (found by + code coverage tests). + * Fixed Camellia and XTEA for 64-bit Windows systems. + += Version 0.11.1 released on 2009-05-17 + * Fixed missing functionality for SHA-224, SHA-256, SHA384, + SHA-512 in rsa_pkcs1_sign() + += Version 0.11.0 released on 2009-05-03 + * Fixed a bug in mpi_gcd() so that it also works when both + input numbers are even and added testcases to check + (found by Pierre Habouzit). + * Added support for SHA-224, SHA-256, SHA-384 and SHA-512 + one way hash functions with the PKCS#1 v1.5 signing and + verification. + * Fixed minor bug regarding mpi_gcd located within the + POLARSSL_GENPRIME block. + * Fixed minor memory leak in x509parse_crt() and added better + handling of 'full' certificate chains (found by Mathias + Olsson). + * Centralized file opening and reading for x509 files into + load_file() + * Made definition of net_htons() endian-clean for big endian + systems (Found by Gernot). + * Undefining POLARSSL_HAVE_ASM now also handles prevents asm in + padlock and timing code. + * Fixed an off-by-one buffer allocation in ssl_set_hostname() + responsible for crashes and unwanted behaviour. + * Added support for Certificate Revocation List (CRL) parsing. + * Added support for CRL revocation to x509parse_verify() and + SSL/TLS code. + * Fixed compatibility of XTEA and Camellia on a 64-bit system + (found by Felix von Leitner). + += Version 0.10.0 released on 2009-01-12 + * Migrated XySSL to PolarSSL + * Added XTEA symmetric cipher + * Added Camellia symmetric cipher + * Added support for ciphersuites: SSL_RSA_CAMELLIA_128_SHA, + SSL_RSA_CAMELLIA_256_SHA and SSL_EDH_RSA_CAMELLIA_256_SHA + * Fixed dangerous bug that can cause a heap overflow in + rsa_pkcs1_decrypt (found by Christophe Devine) + +================================================================ +XySSL ChangeLog + += Version 0.9 released on 2008-03-16 + + * Added support for ciphersuite: SSL_RSA_AES_128_SHA + * Enabled support for large files by default in aescrypt2.c + * Preliminary openssl wrapper contributed by David Barrett + * Fixed a bug in ssl_write() that caused the same payload to + be sent twice in non-blocking mode when send returns EAGAIN + * Fixed ssl_parse_client_hello(): session id and challenge must + not be swapped in the SSLv2 ClientHello (found by Greg Robson) + * Added user-defined callback debug function (Krystian Kolodziej) + * Before freeing a certificate, properly zero out all cert. data + * Fixed the "mode" parameter so that encryption/decryption are + not swapped on PadLock; also fixed compilation on older versions + of gcc (bug reported by David Barrett) + * Correctly handle the case in padlock_xcryptcbc() when input or + ouput data is non-aligned by falling back to the software + implementation, as VIA Nehemiah cannot handle non-aligned buffers + * Fixed a memory leak in x509parse_crt() which was reported by Greg + Robson-Garth; some x509write.c fixes by Pascal Vizeli, thanks to + Matthew Page who reported several bugs + * Fixed x509_get_ext() to accept some rare certificates which have + an INTEGER instead of a BOOLEAN for BasicConstraints::cA. + * Added support on the client side for the TLS "hostname" extension + (patch contributed by David Patino) + * Make x509parse_verify() return BADCERT_CN_MISMATCH when an empty + string is passed as the CN (bug reported by spoofy) + * Added an option to enable/disable the BN assembly code + * Updated rsa_check_privkey() to verify that (D*E) = 1 % (P-1)*(Q-1) + * Disabled obsolete hash functions by default (MD2, MD4); updated + selftest and benchmark to not test ciphers that have been disabled + * Updated x509parse_cert_info() to correctly display byte 0 of the + serial number, setup correct server port in the ssl client example + * Fixed a critical denial-of-service with X.509 cert. verification: + peer may cause xyssl to loop indefinitely by sending a certificate + for which the RSA signature check fails (bug reported by Benoit) + * Added test vectors for: AES-CBC, AES-CFB, DES-CBC and 3DES-CBC, + HMAC-MD5, HMAC-SHA1, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 + * Fixed HMAC-SHA-384 and HMAC-SHA-512 (thanks to Josh Sinykin) + * Modified ssl_parse_client_key_exchange() to protect against + Daniel Bleichenbacher attack on PKCS#1 v1.5 padding, as well + as the Klima-Pokorny-Rosa extension of Bleichenbacher's attack + * Updated rsa_gen_key() so that ctx->N is always nbits in size + * Fixed assembly PPC compilation errors on Mac OS X, thanks to + David Barrett and Dusan Semen + += Version 0.8 released on 2007-10-20 + + * Modified the HMAC functions to handle keys larger + than 64 bytes, thanks to Stephane Desneux and gary ng + * Fixed ssl_read_record() to properly update the handshake + message digests, which fixes IE6/IE7 client authentication + * Cleaned up the XYSSL* #defines, suggested by Azriel Fasten + * Fixed net_recv(), thanks to Lorenz Schori and Egon Kocjan + * Added user-defined callbacks for handling I/O and sessions + * Added lots of debugging output in the SSL/TLS functions + * Added preliminary X.509 cert. writing by Pascal Vizeli + * Added preliminary support for the VIA PadLock routines + * Added AES-CFB mode of operation, contributed by chmike + * Added an SSL/TLS stress testing program (ssl_test.c) + * Updated the RSA PKCS#1 code to allow choosing between + RSA_PUBLIC and RSA_PRIVATE, as suggested by David Barrett + * Updated ssl_read() to skip 0-length records from OpenSSL + * Fixed the make install target to comply with *BSD make + * Fixed a bug in mpi_read_binary() on 64-bit platforms + * mpi_is_prime() speedups, thanks to Kevin McLaughlin + * Fixed a long standing memory leak in mpi_is_prime() + * Replaced realloc with malloc in mpi_grow(), and set + the sign of zero as positive in mpi_init() (reported + by Jonathan M. McCune) + += Version 0.7 released on 2007-07-07 + + * Added support for the MicroBlaze soft-core processor + * Fixed a bug in ssl_tls.c which sometimes prevented SSL + connections from being established with non-blocking I/O + * Fixed a couple bugs in the VS6 and UNIX Makefiles + * Fixed the "PIC register ebx clobbered in asm" bug + * Added HMAC starts/update/finish support functions + * Added the SHA-224, SHA-384 and SHA-512 hash functions + * Fixed the net_set_*block routines, thanks to Andreas + * Added a few demonstration programs: md5sum, sha1sum, + dh_client, dh_server, rsa_genkey, rsa_sign, rsa_verify + * Added new bignum import and export helper functions + * Rewrote README.txt in program/ssl/ca to better explain + how to create a test PKI + += Version 0.6 released on 2007-04-01 + + * Ciphers used in SSL/TLS can now be disabled at compile + time, to reduce the memory footprint on embedded systems + * Added multiply assembly code for the TriCore and modified + havege_struct for this processor, thanks to David Patiño + * Added multiply assembly code for 64-bit PowerPCs, + thanks to Peking University and the OSU Open Source Lab + * Added experimental support of Quantum Cryptography + * Added support for autoconf, contributed by Arnaud Cornet + * Fixed "long long" compilation issues on IA-64 and PPC64 + * Fixed a bug introduced in xyssl-0.5/timing.c: hardclock + was not being correctly defined on ARM and MIPS + += Version 0.5 released on 2007-03-01 + + * Added multiply assembly code for SPARC and Alpha + * Added (beta) support for non-blocking I/O operations + * Implemented session resuming and client authentication + * Fixed some portability issues on WinCE, MINIX 3, Plan9 + (thanks to Benjamin Newman), HP-UX, FreeBSD and Solaris + * Improved the performance of the EDH key exchange + * Fixed a bug that caused valid packets with a payload + size of 16384 bytes to be rejected + += Version 0.4 released on 2007-02-01 + + * Added support for Ephemeral Diffie-Hellman key exchange + * Added multiply asm code for SSE2, ARM, PPC, MIPS and M68K + * Various improvement to the modular exponentiation code + * Rewrote the headers to generate the API docs with doxygen + * Fixed a bug in ssl_encrypt_buf (incorrect padding was + generated) and in ssl_parse_client_hello (max. client + version was not properly set), thanks to Didier Rebeix + * Fixed another bug in ssl_parse_client_hello: clients with + cipherlists larger than 96 bytes were incorrectly rejected + * Fixed a couple memory leak in x509_read.c + += Version 0.3 released on 2007-01-01 + + * Added server-side SSLv3 and TLSv1.0 support + * Multiple fixes to enhance the compatibility with g++, + thanks to Xosé Antón Otero Ferreira + * Fixed a bug in the CBC code, thanks to dowst; also, + the bignum code is no longer dependant on long long + * Updated rsa_pkcs1_sign to handle arbitrary large inputs + * Updated timing.c for improved compatibility with i386 + and 486 processors, thanks to Arnaud Cornet + += Version 0.2 released on 2006-12-01 + + * Updated timing.c to support ARM and MIPS arch + * Updated the MPI code to support 8086 on MSVC 1.5 + * Added the copyright notice at the top of havege.h + * Fixed a bug in sha2_hmac, thanks to newsoft/Wenfang Zhang + * Fixed a bug reported by Adrian Rüegsegger in x509_read_key + * Fixed a bug reported by Torsten Lauter in ssl_read_record + * Fixed a bug in rsa_check_privkey that would wrongly cause + valid RSA keys to be dismissed (thanks to oldwolf) + * Fixed a bug in mpi_is_prime that caused some primes to fail + the Miller-Rabin primality test + + I'd also like to thank Younès Hafri for the CRUX linux port, + Khalil Petit who added XySSL into pkgsrc and Arnaud Cornet + who maintains the Debian package :-) + += Version 0.1 released on 2006-11-01 + diff --git a/Externals/polarssl/LICENSE b/Externals/polarssl/LICENSE new file mode 100644 index 0000000000..d511905c16 --- /dev/null +++ b/Externals/polarssl/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Externals/polarssl/README b/Externals/polarssl/README new file mode 100644 index 0000000000..7f7d0b66db --- /dev/null +++ b/Externals/polarssl/README @@ -0,0 +1,40 @@ +README for PolarSSL + +-- COMPILING +There are currently three active build systems within the PolarSSL releases: + - Make + - CMake + - Microsoft Visual Studio + +The main system used for development is CMake. That system is always the most up-to-date. The others should reflect all changes present in the CMake build system, but some features are not ported there by default. + +--- Make +In order to build the source using Make, just enter at the command line: +make + +In order to run the tests, enter: +make check + +--- CMake +In order to build the source using CMake, just enter at the command line: +cmake . +make + +There are 3 different active build modes specified within the CMake buildsystem: + - Release + This generates the default code without any unnecessary information in the binary files. + - Debug + This generates debug information and disables optimization of the code. + - Coverage + This generates code coverage information in addition to debug information. + +Switching build modes in CMake is simple. For debug mode, enter at the command line: +cmake -D CMAKE_BUILD_TYPE:String="Debug" . + +In order to run the tests, enter: +make test + +--- Microsoft Visual Studio +The build files for Microsoft Visual Studio are generated for Visual Studio 6.0 all future Visual Studio's should be able to open and use this older version of the build files. + +The workspace 'polarssl.dsw' contains all the basic projects needed to build the library and all the programs. The files in tests are not generated and compiled, as these need a perl environment as well. diff --git a/Externals/polarssl/include/.gitignore b/Externals/polarssl/include/.gitignore new file mode 100644 index 0000000000..f3c7a7c5da --- /dev/null +++ b/Externals/polarssl/include/.gitignore @@ -0,0 +1 @@ +Makefile diff --git a/Externals/polarssl/include/polarssl/aes.h b/Externals/polarssl/include/polarssl/aes.h new file mode 100644 index 0000000000..30fdf617a6 --- /dev/null +++ b/Externals/polarssl/include/polarssl/aes.h @@ -0,0 +1,202 @@ +/** + * \file aes.h + * + * \brief AES block cipher + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_AES_H +#define POLARSSL_AES_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ +#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ + +#if !defined(POLARSSL_AES_ALT) +// Regular implementation +// + +/** + * \brief AES context structure + */ +typedef struct +{ + int nr; /*!< number of rounds */ + uint32_t *rk; /*!< AES round keys */ + uint32_t buf[68]; /*!< unaligned data */ +} +aes_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief AES key schedule (encryption) + * + * \param ctx AES context to be initialized + * \param key encryption key + * \param keysize must be 128, 192 or 256 + * + * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_KEY_LENGTH + */ +int aes_setkey_enc( aes_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief AES key schedule (decryption) + * + * \param ctx AES context to be initialized + * \param key decryption key + * \param keysize must be 128, 192 or 256 + * + * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_KEY_LENGTH + */ +int aes_setkey_dec( aes_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief AES-ECB block encryption/decryption + * + * \param ctx AES context + * \param mode AES_ENCRYPT or AES_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 if successful + */ +int aes_crypt_ecb( aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ); + +/** + * \brief AES-CBC buffer encryption/decryption + * Length should be a multiple of the block + * size (16 bytes) + * + * \param ctx AES context + * \param mode AES_ENCRYPT or AES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_INPUT_LENGTH + */ +int aes_crypt_cbc( aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief AES-CFB128 buffer encryption/decryption. + * + * Note: Due to the nature of CFB you should use the same key schedule for + * both encryption and decryption. So a context initialized with + * aes_setkey_enc() for both AES_ENCRYPT and AES_DECRYPT. + * + * both + * \param ctx AES context + * \param mode AES_ENCRYPT or AES_DECRYPT + * \param length length of the input data + * \param iv_off offset in IV (updated after use) + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful + */ +int aes_crypt_cfb128( aes_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief AES-CTR buffer encryption/decryption + * + * Warning: You have to keep the maximum use of your counter in mind! + * + * Note: Due to the nature of CTR you should use the same key schedule for + * both encryption and decryption. So a context initialized with + * aes_setkey_enc() for both AES_ENCRYPT and AES_DECRYPT. + * + * \param length The length of the data + * \param nc_off The offset in the current stream_block (for resuming + * within current cipher stream). The offset pointer to + * should be 0 at the start of a stream. + * \param nonce_counter The 128-bit nonce and counter. + * \param stream_block The saved stream-block for resuming. Is overwritten + * by the function. + * \param input The input data stream + * \param output The output data stream + * + * \return 0 if successful + */ +int aes_crypt_ctr( aes_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_AES_ALT */ +#include "aes_alt.h" +#endif /* POLARSSL_AES_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int aes_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* aes.h */ diff --git a/Externals/polarssl/include/polarssl/arc4.h b/Externals/polarssl/include/polarssl/arc4.h new file mode 100644 index 0000000000..1672fa2334 --- /dev/null +++ b/Externals/polarssl/include/polarssl/arc4.h @@ -0,0 +1,98 @@ +/** + * \file arc4.h + * + * \brief The ARCFOUR stream cipher + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ARC4_H +#define POLARSSL_ARC4_H + +#include "config.h" + +#include + +#if !defined(POLARSSL_ARC4_ALT) +// Regular implementation +// + +/** + * \brief ARC4 context structure + */ +typedef struct +{ + int x; /*!< permutation index */ + int y; /*!< permutation index */ + unsigned char m[256]; /*!< permutation table */ +} +arc4_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief ARC4 key schedule + * + * \param ctx ARC4 context to be initialized + * \param key the secret key + * \param keylen length of the key + */ +void arc4_setup( arc4_context *ctx, const unsigned char *key, unsigned int keylen ); + +/** + * \brief ARC4 cipher function + * + * \param ctx ARC4 context + * \param length length of the input data + * \param input buffer holding the input data + * \param output buffer for the output data + * + * \return 0 if successful + */ +int arc4_crypt( arc4_context *ctx, size_t length, const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_ARC4_ALT */ +#include "arc4_alt.h" +#endif /* POLARSSL_ARC4_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int arc4_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* arc4.h */ diff --git a/Externals/polarssl/include/polarssl/asn1.h b/Externals/polarssl/include/polarssl/asn1.h new file mode 100644 index 0000000000..893292dfa6 --- /dev/null +++ b/Externals/polarssl/include/polarssl/asn1.h @@ -0,0 +1,246 @@ +/** + * \file asn1.h + * + * \brief Generic ASN.1 parsing + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ASN1_H +#define POLARSSL_ASN1_H + +#include "config.h" + +#if defined(POLARSSL_BIGNUM_C) +#include "bignum.h" +#endif + +#include + +/** + * \addtogroup asn1_module + * \{ + */ + +/** + * \name ASN1 Error codes + * These error codes are OR'ed to X509 error codes for + * higher error granularity. + * ASN1 is a standard to specify data structures. + * \{ + */ +#define POLARSSL_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ +#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ +#define POLARSSL_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ +#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ +#define POLARSSL_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ +#define POLARSSL_ERR_ASN1_MALLOC_FAILED -0x006A /**< Memory allocation failed */ +#define POLARSSL_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ + +/* \} name */ + +/** + * \name DER constants + * These constants comply with DER encoded the ANS1 type tags. + * DER encoding uses hexadecimal representation. + * An example DER sequence is:\n + * - 0x02 -- tag indicating INTEGER + * - 0x01 -- length in octets + * - 0x05 -- value + * Such sequences are typically read into \c ::x509_buf. + * \{ + */ +#define ASN1_BOOLEAN 0x01 +#define ASN1_INTEGER 0x02 +#define ASN1_BIT_STRING 0x03 +#define ASN1_OCTET_STRING 0x04 +#define ASN1_NULL 0x05 +#define ASN1_OID 0x06 +#define ASN1_UTF8_STRING 0x0C +#define ASN1_SEQUENCE 0x10 +#define ASN1_SET 0x11 +#define ASN1_PRINTABLE_STRING 0x13 +#define ASN1_T61_STRING 0x14 +#define ASN1_IA5_STRING 0x16 +#define ASN1_UTC_TIME 0x17 +#define ASN1_GENERALIZED_TIME 0x18 +#define ASN1_UNIVERSAL_STRING 0x1C +#define ASN1_BMP_STRING 0x1E +#define ASN1_PRIMITIVE 0x00 +#define ASN1_CONSTRUCTED 0x20 +#define ASN1_CONTEXT_SPECIFIC 0x80 +/* \} name */ +/* \} addtogroup asn1_module */ + +/** Returns the size of the binary string, without the trailing \\0 */ +#define OID_SIZE(x) (sizeof(x) - 1) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Functions to parse ASN.1 data structures + * \{ + */ + +/** + * Type-length-value structure that allows for ASN1 using DER. + */ +typedef struct _asn1_buf +{ + int tag; /**< ASN1 type, e.g. ASN1_UTF8_STRING. */ + size_t len; /**< ASN1 length, e.g. in octets. */ + unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ +} +asn1_buf; + +/** + * Container for ASN1 bit strings. + */ +typedef struct _asn1_bitstring +{ + size_t len; /**< ASN1 length, e.g. in octets. */ + unsigned char unused_bits; /**< Number of unused bits at the end of the string */ + unsigned char *p; /**< Raw ASN1 data for the bit string */ +} +asn1_bitstring; + +/** + * Container for a sequence of ASN.1 items + */ +typedef struct _asn1_sequence +{ + asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ + struct _asn1_sequence *next; /**< The next entry in the sequence. */ +} +asn1_sequence; + +/** + * Get the length of an ASN.1 element. + * Updates the pointer to immediately behind the length. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param len The variable that will receive the value + * + * \return 0 if successful, POLARSSL_ERR_ASN1_OUT_OF_DATA on reaching + * end of data, POLARSSL_ERR_ASN1_INVALID_LENGTH if length is + * unparseable. + */ +int asn1_get_len( unsigned char **p, + const unsigned char *end, + size_t *len ); + +/** + * Get the tag and length of the tag. Check for the requested tag. + * Updates the pointer to immediately behind the tag and length. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param len The variable that will receive the length + * \param tag The expected tag + * + * \return 0 if successful, POLARSSL_ERR_ASN1_UNEXPECTED_TAG if tag did + * not match requested tag, or another specific ASN.1 error code. + */ +int asn1_get_tag( unsigned char **p, + const unsigned char *end, + size_t *len, int tag ); + +/** + * Retrieve a boolean ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param val The variable that will receive the value + * + * \return 0 if successful or a specific ASN.1 error code. + */ +int asn1_get_bool( unsigned char **p, + const unsigned char *end, + int *val ); + +/** + * Retrieve an integer ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param val The variable that will receive the value + * + * \return 0 if successful or a specific ASN.1 error code. + */ +int asn1_get_int( unsigned char **p, + const unsigned char *end, + int *val ); + +/** + * Retrieve a bitstring ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param bs The variable that will receive the value + * + * \return 0 if successful or a specific ASN.1 error code. + */ +int asn1_get_bitstring( unsigned char **p, const unsigned char *end, + asn1_bitstring *bs); + +/** + * Parses and splits an ASN.1 "SEQUENCE OF " + * Updated the pointer to immediately behind the full sequence tag. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param cur First variable in the chain to fill + * \param tag Type of sequence + * + * \return 0 if successful or a specific ASN.1 error code. + */ +int asn1_get_sequence_of( unsigned char **p, + const unsigned char *end, + asn1_sequence *cur, + int tag); + +#if defined(POLARSSL_BIGNUM_C) +/** + * Retrieve a MPI value from an integer ASN.1 tag. + * Updates the pointer to immediately behind the full tag. + * + * \param p The position in the ASN.1 data + * \param end End of data + * \param X The MPI that will receive the value + * + * \return 0 if successful or a specific ASN.1 or MPI error code. + */ +int asn1_get_mpi( unsigned char **p, + const unsigned char *end, + mpi *X ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* asn1.h */ diff --git a/Externals/polarssl/include/polarssl/asn1write.h b/Externals/polarssl/include/polarssl/asn1write.h new file mode 100644 index 0000000000..52b9baa96a --- /dev/null +++ b/Externals/polarssl/include/polarssl/asn1write.h @@ -0,0 +1,46 @@ +/** + * \file asn1write.h + * + * \brief ASN.1 buffer writing functionality + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ASN1_WRITE_H +#define POLARSSL_ASN1_WRITE_H + +#include "asn1.h" + +#define ASN1_CHK_ADD(g, f) if( ( ret = f ) < 0 ) return( ret ); else g += ret + +int asn1_write_len( unsigned char **p, unsigned char *start, size_t len ); +int asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ); +int asn1_write_mpi( unsigned char **p, unsigned char *start, mpi *X ); +int asn1_write_null( unsigned char **p, unsigned char *start ); +int asn1_write_oid( unsigned char **p, unsigned char *start, char *oid ); +int asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, char *algorithm_oid ); +int asn1_write_int( unsigned char **p, unsigned char *start, int val ); +int asn1_write_printable_string( unsigned char **p, unsigned char *start, + char *text ); +int asn1_write_ia5_string( unsigned char **p, unsigned char *start, + char *text ); + +#endif /* POLARSSL_ASN1_WRITE_H */ diff --git a/Externals/polarssl/include/polarssl/base64.h b/Externals/polarssl/include/polarssl/base64.h new file mode 100644 index 0000000000..fb0d753a2e --- /dev/null +++ b/Externals/polarssl/include/polarssl/base64.h @@ -0,0 +1,87 @@ +/** + * \file base64.h + * + * \brief RFC 1521 base64 encoding/decoding + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_BASE64_H +#define POLARSSL_BASE64_H + +#include + +#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ +#define POLARSSL_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encode a buffer into base64 format + * + * \param dst destination buffer + * \param dlen size of the buffer + * \param src source buffer + * \param slen amount of data to be encoded + * + * \return 0 if successful, or POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL. + * *dlen is always updated to reflect the amount + * of data that has (or would have) been written. + * + * \note Call this function with *dlen = 0 to obtain the + * required buffer size in *dlen + */ +int base64_encode( unsigned char *dst, size_t *dlen, + const unsigned char *src, size_t slen ); + +/** + * \brief Decode a base64-formatted buffer + * + * \param dst destination buffer + * \param dlen size of the buffer + * \param src source buffer + * \param slen amount of data to be decoded + * + * \return 0 if successful, POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL, or + * POLARSSL_ERR_BASE64_INVALID_CHARACTER if the input data is + * not correct. *dlen is always updated to reflect the amount + * of data that has (or would have) been written. + * + * \note Call this function with *dlen = 0 to obtain the + * required buffer size in *dlen + */ +int base64_decode( unsigned char *dst, size_t *dlen, + const unsigned char *src, size_t slen ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int base64_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* base64.h */ diff --git a/Externals/polarssl/include/polarssl/bignum.h b/Externals/polarssl/include/polarssl/bignum.h new file mode 100644 index 0000000000..afa9e61d87 --- /dev/null +++ b/Externals/polarssl/include/polarssl/bignum.h @@ -0,0 +1,685 @@ +/** + * \file bignum.h + * + * \brief Multi-precision integer library + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_BIGNUM_H +#define POLARSSL_BIGNUM_H + +#include +#include + +#include "config.h" + +#ifdef _MSC_VER +#include +#if (_MSC_VER <= 1200) +typedef signed short int16_t; +typedef unsigned short uint16_t; +#else +typedef INT16 int16_t; +typedef UINT16 uint16_t; +#endif +typedef INT32 int32_t; +typedef INT64 int64_t; +typedef UINT32 uint32_t; +typedef UINT64 uint64_t; +#else +#include +#endif + +#define POLARSSL_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ +#define POLARSSL_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ +#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ +#define POLARSSL_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ +#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ +#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ +#define POLARSSL_ERR_MPI_MALLOC_FAILED -0x0010 /**< Memory allocation failed. */ + +#define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup + +/* + * Maximum size MPIs are allowed to grow to in number of limbs. + */ +#define POLARSSL_MPI_MAX_LIMBS 10000 + +#if !defined(POLARSSL_CONFIG_OPTIONS) +/* + * Maximum window size used for modular exponentiation. Default: 6 + * Minimum value: 1. Maximum value: 6. + * + * Result is an array of ( 2 << POLARSSL_MPI_WINDOW_SIZE ) MPIs used + * for the sliding window calculation. (So 64 by default) + * + * Reduction in size, reduces speed. + */ +#define POLARSSL_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ + +/* + * Maximum size of MPIs allowed in bits and bytes for user-MPIs. + * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) + * + * Note: Calculations can results temporarily in larger MPIs. So the number + * of limbs required (POLARSSL_MPI_MAX_LIMBS) is higher. + */ +#define POLARSSL_MPI_MAX_SIZE 512 /**< Maximum number of bytes for usable MPIs. */ + +#endif /* !POLARSSL_CONFIG_OPTIONS */ + +#define POLARSSL_MPI_MAX_BITS ( 8 * POLARSSL_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ + +/* + * When reading from files with mpi_read_file() and writing to files with + * mpi_write_file() the buffer should have space + * for a (short) label, the MPI (in the provided radix), the newline + * characters and the '\0'. + * + * By default we assume at least a 10 char label, a minimum radix of 10 + * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). + * Autosized at compile time for at least a 10 char label, a minimum radix + * of 10 (decimal) for a number of POLARSSL_MPI_MAX_BITS size. + * + * This used to be statically sized to 1250 for a maximum of 4096 bit + * numbers (1234 decimal chars). + * + * Calculate using the formula: + * POLARSSL_MPI_RW_BUFFER_SIZE = ceil(POLARSSL_MPI_MAX_BITS / ln(10) * ln(2)) + + * LabelSize + 6 + */ +#define POLARSSL_MPI_MAX_BITS_SCALE100 ( 100 * POLARSSL_MPI_MAX_BITS ) +#define LN_2_DIV_LN_10_SCALE100 332 +#define POLARSSL_MPI_RW_BUFFER_SIZE ( ((POLARSSL_MPI_MAX_BITS_SCALE100 + LN_2_DIV_LN_10_SCALE100 - 1) / LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) + +/* + * Define the base integer type, architecture-wise + */ +#if defined(POLARSSL_HAVE_INT8) +typedef signed char t_sint; +typedef unsigned char t_uint; +typedef uint16_t t_udbl; +#define POLARSSL_HAVE_UDBL +#else +#if defined(POLARSSL_HAVE_INT16) +typedef int16_t t_sint; +typedef uint16_t t_uint; +typedef uint32_t t_udbl; +#define POLARSSL_HAVE_UDBL +#else + #if ( defined(_MSC_VER) && defined(_M_AMD64) ) + typedef int64_t t_sint; + typedef uint64_t t_uint; + #else + #if ( defined(__GNUC__) && ( \ + defined(__amd64__) || defined(__x86_64__) || \ + defined(__ppc64__) || defined(__powerpc64__) || \ + defined(__ia64__) || defined(__alpha__) || \ + (defined(__sparc__) && defined(__arch64__)) || \ + defined(__s390x__) ) ) + typedef int64_t t_sint; + typedef uint64_t t_uint; + typedef unsigned int t_udbl __attribute__((mode(TI))); + #define POLARSSL_HAVE_UDBL + #else + typedef int32_t t_sint; + typedef uint32_t t_uint; + #if ( defined(_MSC_VER) && defined(_M_IX86) ) + typedef uint64_t t_udbl; + #define POLARSSL_HAVE_UDBL + #else + #if defined( POLARSSL_HAVE_LONGLONG ) + typedef unsigned long long t_udbl; + #define POLARSSL_HAVE_UDBL + #endif + #endif + #endif + #endif +#endif /* POLARSSL_HAVE_INT16 */ +#endif /* POLARSSL_HAVE_INT8 */ + +/** + * \brief MPI structure + */ +typedef struct +{ + int s; /*!< integer sign */ + size_t n; /*!< total # of limbs */ + t_uint *p; /*!< pointer to limbs */ +} +mpi; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initialize one MPI + * + * \param X One MPI to initialize. + */ +void mpi_init( mpi *X ); + +/** + * \brief Unallocate one MPI + * + * \param X One MPI to unallocate. + */ +void mpi_free( mpi *X ); + +/** + * \brief Enlarge to the specified number of limbs + * + * \param X MPI to grow + * \param nblimbs The target number of limbs + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_grow( mpi *X, size_t nblimbs ); + +/** + * \brief Copy the contents of Y into X + * + * \param X Destination MPI + * \param Y Source MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_copy( mpi *X, const mpi *Y ); + +/** + * \brief Swap the contents of X and Y + * + * \param X First MPI value + * \param Y Second MPI value + */ +void mpi_swap( mpi *X, mpi *Y ); + +/** + * \brief Set value from integer + * + * \param X MPI to set + * \param z Value to use + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_lset( mpi *X, t_sint z ); + +/** + * \brief Get a specific bit from X + * + * \param X MPI to use + * \param pos Zero-based index of the bit in X + * + * \return Either a 0 or a 1 + */ +int mpi_get_bit( const mpi *X, size_t pos ); + +/** + * \brief Set a bit of X to a specific value of 0 or 1 + * + * \note Will grow X if necessary to set a bit to 1 in a not yet + * existing limb. Will not grow if bit should be set to 0 + * + * \param X MPI to use + * \param pos Zero-based index of the bit in X + * \param val The value to set the bit to (0 or 1) + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 + */ +int mpi_set_bit( mpi *X, size_t pos, unsigned char val ); + +/** + * \brief Return the number of zero-bits before the least significant + * '1' bit + * + * Note: Thus also the zero-based index of the least significant '1' bit + * + * \param X MPI to use + */ +size_t mpi_lsb( const mpi *X ); + +/** + * \brief Return the number of bits up to and including the most + * significant '1' bit' + * + * Note: Thus also the one-based index of the most significant '1' bit + * + * \param X MPI to use + */ +size_t mpi_msb( const mpi *X ); + +/** + * \brief Return the total size in bytes + * + * \param X MPI to use + */ +size_t mpi_size( const mpi *X ); + +/** + * \brief Import from an ASCII string + * + * \param X Destination MPI + * \param radix Input numeric base + * \param s Null-terminated string buffer + * + * \return 0 if successful, or a POLARSSL_ERR_MPI_XXX error code + */ +int mpi_read_string( mpi *X, int radix, const char *s ); + +/** + * \brief Export into an ASCII string + * + * \param X Source MPI + * \param radix Output numeric base + * \param s String buffer + * \param slen String buffer size + * + * \return 0 if successful, or a POLARSSL_ERR_MPI_XXX error code. + * *slen is always updated to reflect the amount + * of data that has (or would have) been written. + * + * \note Call this function with *slen = 0 to obtain the + * minimum required buffer size in *slen. + */ +int mpi_write_string( const mpi *X, int radix, char *s, size_t *slen ); + +#if defined(POLARSSL_FS_IO) +/** + * \brief Read X from an opened file + * + * \param X Destination MPI + * \param radix Input numeric base + * \param fin Input file handle + * + * \return 0 if successful, POLARSSL_ERR_MPI_BUFFER_TOO_SMALL if + * the file read buffer is too small or a + * POLARSSL_ERR_MPI_XXX error code + */ +int mpi_read_file( mpi *X, int radix, FILE *fin ); + +/** + * \brief Write X into an opened file, or stdout if fout is NULL + * + * \param p Prefix, can be NULL + * \param X Source MPI + * \param radix Output numeric base + * \param fout Output file handle (can be NULL) + * + * \return 0 if successful, or a POLARSSL_ERR_MPI_XXX error code + * + * \note Set fout == NULL to print X on the console. + */ +int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout ); +#endif /* POLARSSL_FS_IO */ + +/** + * \brief Import X from unsigned binary data, big endian + * + * \param X Destination MPI + * \param buf Input buffer + * \param buflen Input buffer size + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_read_binary( mpi *X, const unsigned char *buf, size_t buflen ); + +/** + * \brief Export X into unsigned binary data, big endian + * + * \param X Source MPI + * \param buf Output buffer + * \param buflen Output buffer size + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough + */ +int mpi_write_binary( const mpi *X, unsigned char *buf, size_t buflen ); + +/** + * \brief Left-shift: X <<= count + * + * \param X MPI to shift + * \param count Amount to shift + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_shift_l( mpi *X, size_t count ); + +/** + * \brief Right-shift: X >>= count + * + * \param X MPI to shift + * \param count Amount to shift + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_shift_r( mpi *X, size_t count ); + +/** + * \brief Compare unsigned values + * + * \param X Left-hand MPI + * \param Y Right-hand MPI + * + * \return 1 if |X| is greater than |Y|, + * -1 if |X| is lesser than |Y| or + * 0 if |X| is equal to |Y| + */ +int mpi_cmp_abs( const mpi *X, const mpi *Y ); + +/** + * \brief Compare signed values + * + * \param X Left-hand MPI + * \param Y Right-hand MPI + * + * \return 1 if X is greater than Y, + * -1 if X is lesser than Y or + * 0 if X is equal to Y + */ +int mpi_cmp_mpi( const mpi *X, const mpi *Y ); + +/** + * \brief Compare signed values + * + * \param X Left-hand MPI + * \param z The integer value to compare to + * + * \return 1 if X is greater than z, + * -1 if X is lesser than z or + * 0 if X is equal to z + */ +int mpi_cmp_int( const mpi *X, t_sint z ); + +/** + * \brief Unsigned addition: X = |A| + |B| + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_add_abs( mpi *X, const mpi *A, const mpi *B ); + +/** + * \brief Unsigned substraction: X = |A| - |B| + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B is greater than A + */ +int mpi_sub_abs( mpi *X, const mpi *A, const mpi *B ); + +/** + * \brief Signed addition: X = A + B + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_add_mpi( mpi *X, const mpi *A, const mpi *B ); + +/** + * \brief Signed substraction: X = A - B + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_sub_mpi( mpi *X, const mpi *A, const mpi *B ); + +/** + * \brief Signed addition: X = A + b + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param b The integer value to add + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_add_int( mpi *X, const mpi *A, t_sint b ); + +/** + * \brief Signed substraction: X = A - b + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param b The integer value to subtract + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_sub_int( mpi *X, const mpi *A, t_sint b ); + +/** + * \brief Baseline multiplication: X = A * B + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_mul_mpi( mpi *X, const mpi *A, const mpi *B ); + +/** + * \brief Baseline multiplication: X = A * b + * Note: b is an unsigned integer type, thus + * Negative values of b are ignored. + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param b The integer value to multiply with + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_mul_int( mpi *X, const mpi *A, t_sint b ); + +/** + * \brief Division by mpi: A = Q * B + R + * + * \param Q Destination MPI for the quotient + * \param R Destination MPI for the rest value + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0 + * + * \note Either Q or R can be NULL. + */ +int mpi_div_mpi( mpi *Q, mpi *R, const mpi *A, const mpi *B ); + +/** + * \brief Division by int: A = Q * b + R + * + * \param Q Destination MPI for the quotient + * \param R Destination MPI for the rest value + * \param A Left-hand MPI + * \param b Integer to divide by + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 + * + * \note Either Q or R can be NULL. + */ +int mpi_div_int( mpi *Q, mpi *R, const mpi *A, t_sint b ); + +/** + * \brief Modulo: R = A mod B + * + * \param R Destination MPI for the rest value + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0, + * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B < 0 + */ +int mpi_mod_mpi( mpi *R, const mpi *A, const mpi *B ); + +/** + * \brief Modulo: r = A mod b + * + * \param r Destination t_uint + * \param A Left-hand MPI + * \param b Integer to divide by + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0, + * POLARSSL_ERR_MPI_NEGATIVE_VALUE if b < 0 + */ +int mpi_mod_int( t_uint *r, const mpi *A, t_sint b ); + +/** + * \brief Sliding-window exponentiation: X = A^E mod N + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param E Exponent MPI + * \param N Modular MPI + * \param _RR Speed-up MPI used for recalculations + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or even or if + * E is negative + * + * \note _RR is used to avoid re-computing R*R mod N across + * multiple calls, which speeds up things a bit. It can + * be set to NULL if the extra performance is unneeded. + */ +int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR ); + +/** + * \brief Fill an MPI X with size bytes of random + * + * \param X Destination MPI + * \param size Size in bytes + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_fill_random( mpi *X, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Greatest common divisor: G = gcd(A, B) + * + * \param G Destination MPI + * \param A Left-hand MPI + * \param B Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed + */ +int mpi_gcd( mpi *G, const mpi *A, const mpi *B ); + +/** + * \brief Modular inverse: X = A^-1 mod N + * + * \param X Destination MPI + * \param A Left-hand MPI + * \param N Right-hand MPI + * + * \return 0 if successful, + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or nil + POLARSSL_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N + */ +int mpi_inv_mod( mpi *X, const mpi *A, const mpi *N ); + +/** + * \brief Miller-Rabin primality test + * + * \param X MPI to check + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \return 0 if successful (probably prime), + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if X is not prime + */ +int mpi_is_prime( mpi *X, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Prime number generation + * + * \param X Destination MPI + * \param nbits Required size of X in bits ( 3 <= nbits <= POLARSSL_MPI_MAX_BITS ) + * \param dh_flag If 1, then (X-1)/2 will be prime too + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \return 0 if successful (probably prime), + * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, + * POLARSSL_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 + */ +int mpi_gen_prime( mpi *X, size_t nbits, int dh_flag, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mpi_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* bignum.h */ diff --git a/Externals/polarssl/include/polarssl/blowfish.h b/Externals/polarssl/include/polarssl/blowfish.h new file mode 100644 index 0000000000..9b269b71cb --- /dev/null +++ b/Externals/polarssl/include/polarssl/blowfish.h @@ -0,0 +1,171 @@ +/** + * \file blowfish.h + * + * \brief Blowfish block cipher + * + * Copyright (C) 2012-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_BLOWFISH_H +#define POLARSSL_BLOWFISH_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define BLOWFISH_ENCRYPT 1 +#define BLOWFISH_DECRYPT 0 +#define BLOWFISH_MAX_KEY 448 +#define BLOWFISH_MIN_KEY 32 +#define BLOWFISH_ROUNDS 16 /* when increasing this value, make sure to extend the initialisation vectors */ +#define BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ + +#define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH -0x0016 /**< Invalid key length. */ +#define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 /**< Invalid data input length. */ + +#if !defined(POLARSSL_BLOWFISH_ALT) +// Regular implementation +// + +/** + * \brief Blowfish context structure + */ +typedef struct +{ + uint32_t P[BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ + uint32_t S[4][256]; /*!< key dependent S-boxes */ +} +blowfish_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Blowfish key schedule + * + * \param ctx Blowfish context to be initialized + * \param key encryption key + * \param keysize must be between 32 and 448 bits + * + * \return 0 if successful, or POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH + */ +int blowfish_setkey( blowfish_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief Blowfish-ECB block encryption/decryption + * + * \param ctx Blowfish context + * \param mode BLOWFISH_ENCRYPT or BLOWFISH_DECRYPT + * \param input 8-byte input block + * \param output 8-byte output block + * + * \return 0 if successful + */ +int blowfish_crypt_ecb( blowfish_context *ctx, + int mode, + const unsigned char input[BLOWFISH_BLOCKSIZE], + unsigned char output[BLOWFISH_BLOCKSIZE] ); + +/** + * \brief Blowfish-CBC buffer encryption/decryption + * Length should be a multiple of the block + * size (8 bytes) + * + * \param ctx Blowfish context + * \param mode BLOWFISH_ENCRYPT or BLOWFISH_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH + */ +int blowfish_crypt_cbc( blowfish_context *ctx, + int mode, + size_t length, + unsigned char iv[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Blowfish CFB buffer encryption/decryption. + * + * both + * \param ctx Blowfish context + * \param mode BLOWFISH_ENCRYPT or BLOWFISH_DECRYPT + * \param length length of the input data + * \param iv_off offset in IV (updated after use) + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful + */ +int blowfish_crypt_cfb64( blowfish_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Blowfish-CTR buffer encryption/decryption + * + * Warning: You have to keep the maximum use of your counter in mind! + * + * \param length The length of the data + * \param nc_off The offset in the current stream_block (for resuming + * within current cipher stream). The offset pointer to + * should be 0 at the start of a stream. + * \param nonce_counter The 64-bit nonce and counter. + * \param stream_block The saved stream-block for resuming. Is overwritten + * by the function. + * \param input The input data stream + * \param output The output data stream + * + * \return 0 if successful + */ +int blowfish_crypt_ctr( blowfish_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[BLOWFISH_BLOCKSIZE], + unsigned char stream_block[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_BLOWFISH_ALT */ +#include "blowfish_alt.h" +#endif /* POLARSSL_BLOWFISH_ALT */ + +#endif /* blowfish.h */ diff --git a/Externals/polarssl/include/polarssl/bn_mul.h b/Externals/polarssl/include/polarssl/bn_mul.h new file mode 100644 index 0000000000..1c2da136ab --- /dev/null +++ b/Externals/polarssl/include/polarssl/bn_mul.h @@ -0,0 +1,864 @@ +/** + * \file bn_mul.h + * + * \brief Multi-precision integer library + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * Multiply source vector [s] with b, add result + * to destination vector [d] and set carry c. + * + * Currently supports: + * + * . IA-32 (386+) . AMD64 / EM64T + * . IA-32 (SSE2) . Motorola 68000 + * . PowerPC, 32-bit . MicroBlaze + * . PowerPC, 64-bit . TriCore + * . SPARC v8 . ARM v3+ + * . Alpha . MIPS32 + * . C, longlong . C, generic + */ +#ifndef POLARSSL_BN_MUL_H +#define POLARSSL_BN_MUL_H + +#include "bignum.h" + +#if defined(POLARSSL_HAVE_ASM) + +#if defined(__GNUC__) +#if defined(__i386__) + +#define MULADDC_INIT \ + asm( " \ + movl %%ebx, %0; \ + movl %5, %%esi; \ + movl %6, %%edi; \ + movl %7, %%ecx; \ + movl %8, %%ebx; \ + " + +#define MULADDC_CORE \ + " \ + lodsl; \ + mull %%ebx; \ + addl %%ecx, %%eax; \ + adcl $0, %%edx; \ + addl (%%edi), %%eax; \ + adcl $0, %%edx; \ + movl %%edx, %%ecx; \ + stosl; \ + " + +#if defined(POLARSSL_HAVE_SSE2) + +#define MULADDC_HUIT \ + " \ + movd %%ecx, %%mm1; \ + movd %%ebx, %%mm0; \ + movd (%%edi), %%mm3; \ + paddq %%mm3, %%mm1; \ + movd (%%esi), %%mm2; \ + pmuludq %%mm0, %%mm2; \ + movd 4(%%esi), %%mm4; \ + pmuludq %%mm0, %%mm4; \ + movd 8(%%esi), %%mm6; \ + pmuludq %%mm0, %%mm6; \ + movd 12(%%esi), %%mm7; \ + pmuludq %%mm0, %%mm7; \ + paddq %%mm2, %%mm1; \ + movd 4(%%edi), %%mm3; \ + paddq %%mm4, %%mm3; \ + movd 8(%%edi), %%mm5; \ + paddq %%mm6, %%mm5; \ + movd 12(%%edi), %%mm4; \ + paddq %%mm4, %%mm7; \ + movd %%mm1, (%%edi); \ + movd 16(%%esi), %%mm2; \ + pmuludq %%mm0, %%mm2; \ + psrlq $32, %%mm1; \ + movd 20(%%esi), %%mm4; \ + pmuludq %%mm0, %%mm4; \ + paddq %%mm3, %%mm1; \ + movd 24(%%esi), %%mm6; \ + pmuludq %%mm0, %%mm6; \ + movd %%mm1, 4(%%edi); \ + psrlq $32, %%mm1; \ + movd 28(%%esi), %%mm3; \ + pmuludq %%mm0, %%mm3; \ + paddq %%mm5, %%mm1; \ + movd 16(%%edi), %%mm5; \ + paddq %%mm5, %%mm2; \ + movd %%mm1, 8(%%edi); \ + psrlq $32, %%mm1; \ + paddq %%mm7, %%mm1; \ + movd 20(%%edi), %%mm5; \ + paddq %%mm5, %%mm4; \ + movd %%mm1, 12(%%edi); \ + psrlq $32, %%mm1; \ + paddq %%mm2, %%mm1; \ + movd 24(%%edi), %%mm5; \ + paddq %%mm5, %%mm6; \ + movd %%mm1, 16(%%edi); \ + psrlq $32, %%mm1; \ + paddq %%mm4, %%mm1; \ + movd 28(%%edi), %%mm5; \ + paddq %%mm5, %%mm3; \ + movd %%mm1, 20(%%edi); \ + psrlq $32, %%mm1; \ + paddq %%mm6, %%mm1; \ + movd %%mm1, 24(%%edi); \ + psrlq $32, %%mm1; \ + paddq %%mm3, %%mm1; \ + movd %%mm1, 28(%%edi); \ + addl $32, %%edi; \ + addl $32, %%esi; \ + psrlq $32, %%mm1; \ + movd %%mm1, %%ecx; \ + " + +#define MULADDC_STOP \ + " \ + emms; \ + movl %4, %%ebx; \ + movl %%ecx, %1; \ + movl %%edi, %2; \ + movl %%esi, %3; \ + " \ + : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ + : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ + : "eax", "ecx", "edx", "esi", "edi" \ + ); + +#else + +#define MULADDC_STOP \ + " \ + movl %4, %%ebx; \ + movl %%ecx, %1; \ + movl %%edi, %2; \ + movl %%esi, %3; \ + " \ + : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ + : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ + : "eax", "ecx", "edx", "esi", "edi" \ + ); +#endif /* SSE2 */ +#endif /* i386 */ + +#if defined(__amd64__) || defined (__x86_64__) + +#define MULADDC_INIT \ + asm( "movq %0, %%rsi " :: "m" (s)); \ + asm( "movq %0, %%rdi " :: "m" (d)); \ + asm( "movq %0, %%rcx " :: "m" (c)); \ + asm( "movq %0, %%rbx " :: "m" (b)); \ + asm( "xorq %r8, %r8 " ); + +#define MULADDC_CORE \ + asm( "movq (%rsi),%rax " ); \ + asm( "mulq %rbx " ); \ + asm( "addq $8, %rsi " ); \ + asm( "addq %rcx, %rax " ); \ + asm( "movq %r8, %rcx " ); \ + asm( "adcq $0, %rdx " ); \ + asm( "nop " ); \ + asm( "addq %rax, (%rdi) " ); \ + asm( "adcq %rdx, %rcx " ); \ + asm( "addq $8, %rdi " ); + +#define MULADDC_STOP \ + asm( "movq %%rcx, %0 " : "=m" (c)); \ + asm( "movq %%rdi, %0 " : "=m" (d)); \ + asm( "movq %%rsi, %0 " : "=m" (s) :: \ + "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" ); + +#endif /* AMD64 */ + +#if defined(__mc68020__) || defined(__mcpu32__) + +#define MULADDC_INIT \ + asm( "movl %0, %%a2 " :: "m" (s)); \ + asm( "movl %0, %%a3 " :: "m" (d)); \ + asm( "movl %0, %%d3 " :: "m" (c)); \ + asm( "movl %0, %%d2 " :: "m" (b)); \ + asm( "moveq #0, %d0 " ); + +#define MULADDC_CORE \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d4:%d1 " ); \ + asm( "addl %d3, %d1 " ); \ + asm( "addxl %d0, %d4 " ); \ + asm( "moveq #0, %d3 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "addxl %d4, %d3 " ); + +#define MULADDC_STOP \ + asm( "movl %%d3, %0 " : "=m" (c)); \ + asm( "movl %%a3, %0 " : "=m" (d)); \ + asm( "movl %%a2, %0 " : "=m" (s) :: \ + "d0", "d1", "d2", "d3", "d4", "a2", "a3" ); + +#define MULADDC_HUIT \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d4:%d1 " ); \ + asm( "addxl %d3, %d1 " ); \ + asm( "addxl %d0, %d4 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d3:%d1 " ); \ + asm( "addxl %d4, %d1 " ); \ + asm( "addxl %d0, %d3 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d4:%d1 " ); \ + asm( "addxl %d3, %d1 " ); \ + asm( "addxl %d0, %d4 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d3:%d1 " ); \ + asm( "addxl %d4, %d1 " ); \ + asm( "addxl %d0, %d3 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d4:%d1 " ); \ + asm( "addxl %d3, %d1 " ); \ + asm( "addxl %d0, %d4 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d3:%d1 " ); \ + asm( "addxl %d4, %d1 " ); \ + asm( "addxl %d0, %d3 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d4:%d1 " ); \ + asm( "addxl %d3, %d1 " ); \ + asm( "addxl %d0, %d4 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "movel %a2@+, %d1 " ); \ + asm( "mulul %d2, %d3:%d1 " ); \ + asm( "addxl %d4, %d1 " ); \ + asm( "addxl %d0, %d3 " ); \ + asm( "addl %d1, %a3@+ " ); \ + asm( "addxl %d0, %d3 " ); + +#endif /* MC68000 */ + +#if defined(__powerpc__) || defined(__ppc__) +#if defined(__powerpc64__) || defined(__ppc64__) + +#if defined(__MACH__) && defined(__APPLE__) + +#define MULADDC_INIT \ + asm( "ld r3, %0 " :: "m" (s)); \ + asm( "ld r4, %0 " :: "m" (d)); \ + asm( "ld r5, %0 " :: "m" (c)); \ + asm( "ld r6, %0 " :: "m" (b)); \ + asm( "addi r3, r3, -8 " ); \ + asm( "addi r4, r4, -8 " ); \ + asm( "addic r5, r5, 0 " ); + +#define MULADDC_CORE \ + asm( "ldu r7, 8(r3) " ); \ + asm( "mulld r8, r7, r6 " ); \ + asm( "mulhdu r9, r7, r6 " ); \ + asm( "adde r8, r8, r5 " ); \ + asm( "ld r7, 8(r4) " ); \ + asm( "addze r5, r9 " ); \ + asm( "addc r8, r8, r7 " ); \ + asm( "stdu r8, 8(r4) " ); + +#define MULADDC_STOP \ + asm( "addze r5, r5 " ); \ + asm( "addi r4, r4, 8 " ); \ + asm( "addi r3, r3, 8 " ); \ + asm( "std r5, %0 " : "=m" (c)); \ + asm( "std r4, %0 " : "=m" (d)); \ + asm( "std r3, %0 " : "=m" (s) :: \ + "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); + +#else + +#define MULADDC_INIT \ + asm( "ld %%r3, %0 " :: "m" (s)); \ + asm( "ld %%r4, %0 " :: "m" (d)); \ + asm( "ld %%r5, %0 " :: "m" (c)); \ + asm( "ld %%r6, %0 " :: "m" (b)); \ + asm( "addi %r3, %r3, -8 " ); \ + asm( "addi %r4, %r4, -8 " ); \ + asm( "addic %r5, %r5, 0 " ); + +#define MULADDC_CORE \ + asm( "ldu %r7, 8(%r3) " ); \ + asm( "mulld %r8, %r7, %r6 " ); \ + asm( "mulhdu %r9, %r7, %r6 " ); \ + asm( "adde %r8, %r8, %r5 " ); \ + asm( "ld %r7, 8(%r4) " ); \ + asm( "addze %r5, %r9 " ); \ + asm( "addc %r8, %r8, %r7 " ); \ + asm( "stdu %r8, 8(%r4) " ); + +#define MULADDC_STOP \ + asm( "addze %r5, %r5 " ); \ + asm( "addi %r4, %r4, 8 " ); \ + asm( "addi %r3, %r3, 8 " ); \ + asm( "std %%r5, %0 " : "=m" (c)); \ + asm( "std %%r4, %0 " : "=m" (d)); \ + asm( "std %%r3, %0 " : "=m" (s) :: \ + "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); + +#endif + +#else /* PPC32 */ + +#if defined(__MACH__) && defined(__APPLE__) + +#define MULADDC_INIT \ + asm( "lwz r3, %0 " :: "m" (s)); \ + asm( "lwz r4, %0 " :: "m" (d)); \ + asm( "lwz r5, %0 " :: "m" (c)); \ + asm( "lwz r6, %0 " :: "m" (b)); \ + asm( "addi r3, r3, -4 " ); \ + asm( "addi r4, r4, -4 " ); \ + asm( "addic r5, r5, 0 " ); + +#define MULADDC_CORE \ + asm( "lwzu r7, 4(r3) " ); \ + asm( "mullw r8, r7, r6 " ); \ + asm( "mulhwu r9, r7, r6 " ); \ + asm( "adde r8, r8, r5 " ); \ + asm( "lwz r7, 4(r4) " ); \ + asm( "addze r5, r9 " ); \ + asm( "addc r8, r8, r7 " ); \ + asm( "stwu r8, 4(r4) " ); + +#define MULADDC_STOP \ + asm( "addze r5, r5 " ); \ + asm( "addi r4, r4, 4 " ); \ + asm( "addi r3, r3, 4 " ); \ + asm( "stw r5, %0 " : "=m" (c)); \ + asm( "stw r4, %0 " : "=m" (d)); \ + asm( "stw r3, %0 " : "=m" (s) :: \ + "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); + +#else + +#define MULADDC_INIT \ + asm( "lwz %%r3, %0 " :: "m" (s)); \ + asm( "lwz %%r4, %0 " :: "m" (d)); \ + asm( "lwz %%r5, %0 " :: "m" (c)); \ + asm( "lwz %%r6, %0 " :: "m" (b)); \ + asm( "addi %r3, %r3, -4 " ); \ + asm( "addi %r4, %r4, -4 " ); \ + asm( "addic %r5, %r5, 0 " ); + +#define MULADDC_CORE \ + asm( "lwzu %r7, 4(%r3) " ); \ + asm( "mullw %r8, %r7, %r6 " ); \ + asm( "mulhwu %r9, %r7, %r6 " ); \ + asm( "adde %r8, %r8, %r5 " ); \ + asm( "lwz %r7, 4(%r4) " ); \ + asm( "addze %r5, %r9 " ); \ + asm( "addc %r8, %r8, %r7 " ); \ + asm( "stwu %r8, 4(%r4) " ); + +#define MULADDC_STOP \ + asm( "addze %r5, %r5 " ); \ + asm( "addi %r4, %r4, 4 " ); \ + asm( "addi %r3, %r3, 4 " ); \ + asm( "stw %%r5, %0 " : "=m" (c)); \ + asm( "stw %%r4, %0 " : "=m" (d)); \ + asm( "stw %%r3, %0 " : "=m" (s) :: \ + "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); + +#endif + +#endif /* PPC32 */ +#endif /* PPC64 */ + +#if defined(__sparc__) && defined(__sparc64__) + +#define MULADDC_INIT \ + asm( \ + " \ + ldx %3, %%o0; \ + ldx %4, %%o1; \ + ld %5, %%o2; \ + ld %6, %%o3; \ + " + +#define MULADDC_CORE \ + " \ + ld [%%o0], %%o4; \ + inc 4, %%o0; \ + ld [%%o1], %%o5; \ + umul %%o3, %%o4, %%o4; \ + addcc %%o4, %%o2, %%o4; \ + rd %%y, %%g1; \ + addx %%g1, 0, %%g1; \ + addcc %%o4, %%o5, %%o4; \ + st %%o4, [%%o1]; \ + addx %%g1, 0, %%o2; \ + inc 4, %%o1; \ + " + +#define MULADDC_STOP \ + " \ + st %%o2, %0; \ + stx %%o1, %1; \ + stx %%o0, %2; \ + " \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "g1", "o0", "o1", "o2", "o3", "o4", \ + "o5" \ + ); +#endif /* SPARCv9 */ + +#if defined(__sparc__) && !defined(__sparc64__) + +#define MULADDC_INIT \ + asm( \ + " \ + ld %3, %%o0; \ + ld %4, %%o1; \ + ld %5, %%o2; \ + ld %6, %%o3; \ + " + +#define MULADDC_CORE \ + " \ + ld [%%o0], %%o4; \ + inc 4, %%o0; \ + ld [%%o1], %%o5; \ + umul %%o3, %%o4, %%o4; \ + addcc %%o4, %%o2, %%o4; \ + rd %%y, %%g1; \ + addx %%g1, 0, %%g1; \ + addcc %%o4, %%o5, %%o4; \ + st %%o4, [%%o1]; \ + addx %%g1, 0, %%o2; \ + inc 4, %%o1; \ + " + +#define MULADDC_STOP \ + " \ + st %%o2, %0; \ + st %%o1, %1; \ + st %%o0, %2; \ + " \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "g1", "o0", "o1", "o2", "o3", "o4", \ + "o5" \ + ); + +#endif /* SPARCv8 */ + +#if defined(__microblaze__) || defined(microblaze) + +#define MULADDC_INIT \ + asm( "lwi r3, %0 " :: "m" (s)); \ + asm( "lwi r4, %0 " :: "m" (d)); \ + asm( "lwi r5, %0 " :: "m" (c)); \ + asm( "lwi r6, %0 " :: "m" (b)); \ + asm( "andi r7, r6, 0xffff" ); \ + asm( "bsrli r6, r6, 16 " ); + +#define MULADDC_CORE \ + asm( "lhui r8, r3, 0 " ); \ + asm( "addi r3, r3, 2 " ); \ + asm( "lhui r9, r3, 0 " ); \ + asm( "addi r3, r3, 2 " ); \ + asm( "mul r10, r9, r6 " ); \ + asm( "mul r11, r8, r7 " ); \ + asm( "mul r12, r9, r7 " ); \ + asm( "mul r13, r8, r6 " ); \ + asm( "bsrli r8, r10, 16 " ); \ + asm( "bsrli r9, r11, 16 " ); \ + asm( "add r13, r13, r8 " ); \ + asm( "add r13, r13, r9 " ); \ + asm( "bslli r10, r10, 16 " ); \ + asm( "bslli r11, r11, 16 " ); \ + asm( "add r12, r12, r10 " ); \ + asm( "addc r13, r13, r0 " ); \ + asm( "add r12, r12, r11 " ); \ + asm( "addc r13, r13, r0 " ); \ + asm( "lwi r10, r4, 0 " ); \ + asm( "add r12, r12, r10 " ); \ + asm( "addc r13, r13, r0 " ); \ + asm( "add r12, r12, r5 " ); \ + asm( "addc r5, r13, r0 " ); \ + asm( "swi r12, r4, 0 " ); \ + asm( "addi r4, r4, 4 " ); + +#define MULADDC_STOP \ + asm( "swi r5, %0 " : "=m" (c)); \ + asm( "swi r4, %0 " : "=m" (d)); \ + asm( "swi r3, %0 " : "=m" (s) :: \ + "r3", "r4" , "r5" , "r6" , "r7" , "r8" , \ + "r9", "r10", "r11", "r12", "r13" ); + +#endif /* MicroBlaze */ + +#if defined(__tricore__) + +#define MULADDC_INIT \ + asm( "ld.a %%a2, %0 " :: "m" (s)); \ + asm( "ld.a %%a3, %0 " :: "m" (d)); \ + asm( "ld.w %%d4, %0 " :: "m" (c)); \ + asm( "ld.w %%d1, %0 " :: "m" (b)); \ + asm( "xor %d5, %d5 " ); + +#define MULADDC_CORE \ + asm( "ld.w %d0, [%a2+] " ); \ + asm( "madd.u %e2, %e4, %d0, %d1 " ); \ + asm( "ld.w %d0, [%a3] " ); \ + asm( "addx %d2, %d2, %d0 " ); \ + asm( "addc %d3, %d3, 0 " ); \ + asm( "mov %d4, %d3 " ); \ + asm( "st.w [%a3+], %d2 " ); + +#define MULADDC_STOP \ + asm( "st.w %0, %%d4 " : "=m" (c)); \ + asm( "st.a %0, %%a3 " : "=m" (d)); \ + asm( "st.a %0, %%a2 " : "=m" (s) :: \ + "d0", "d1", "e2", "d4", "a2", "a3" ); + +#endif /* TriCore */ + +#if defined(__arm__) + +#if defined(__thumb__) && !defined(__thumb2__) + +#define MULADDC_INIT \ + asm( \ + " \ + ldr r0, %3; \ + ldr r1, %4; \ + ldr r2, %5; \ + ldr r3, %6; \ + lsr r7, r3, #16; \ + mov r9, r7; \ + lsl r7, r3, #16; \ + lsr r7, r7, #16; \ + mov r8, r7; \ + " + +#define MULADDC_CORE \ + " \ + ldmia r0!, {r6}; \ + lsr r7, r6, #16; \ + lsl r6, r6, #16; \ + lsr r6, r6, #16; \ + mov r4, r8; \ + mul r4, r6; \ + mov r3, r9; \ + mul r6, r3; \ + mov r5, r9; \ + mul r5, r7; \ + mov r3, r8; \ + mul r7, r3; \ + lsr r3, r6, #16; \ + add r5, r5, r3; \ + lsr r3, r7, #16; \ + add r5, r5, r3; \ + add r4, r4, r2; \ + mov r2, #0; \ + adc r5, r2; \ + lsl r3, r6, #16; \ + add r4, r4, r3; \ + adc r5, r2; \ + lsl r3, r7, #16; \ + add r4, r4, r3; \ + adc r5, r2; \ + ldr r3, [r1]; \ + add r4, r4, r3; \ + adc r2, r5; \ + stmia r1!, {r4}; \ + " + +#define MULADDC_STOP \ + " \ + str r2, %0; \ + str r1, %1; \ + str r0, %2; \ + " \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "r8", "r9", "cc" \ + ); + +#else + +#define MULADDC_INIT \ + asm( \ + " \ + ldr r0, %3; \ + ldr r1, %4; \ + ldr r2, %5; \ + ldr r3, %6; \ + " + +#define MULADDC_CORE \ + " \ + ldr r4, [r0], #4; \ + mov r5, #0; \ + ldr r6, [r1]; \ + umlal r2, r5, r3, r4; \ + adds r7, r6, r2; \ + adc r2, r5, #0; \ + str r7, [r1], #4; \ + " + +#define MULADDC_STOP \ + " \ + str r2, %0; \ + str r1, %1; \ + str r0, %2; \ + " \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "cc" \ + ); + +#endif /* Thumb */ + +#endif /* ARMv3 */ + +#if defined(__alpha__) + +#define MULADDC_INIT \ + asm( "ldq $1, %0 " :: "m" (s)); \ + asm( "ldq $2, %0 " :: "m" (d)); \ + asm( "ldq $3, %0 " :: "m" (c)); \ + asm( "ldq $4, %0 " :: "m" (b)); + +#define MULADDC_CORE \ + asm( "ldq $6, 0($1) " ); \ + asm( "addq $1, 8, $1 " ); \ + asm( "mulq $6, $4, $7 " ); \ + asm( "umulh $6, $4, $6 " ); \ + asm( "addq $7, $3, $7 " ); \ + asm( "cmpult $7, $3, $3 " ); \ + asm( "ldq $5, 0($2) " ); \ + asm( "addq $7, $5, $7 " ); \ + asm( "cmpult $7, $5, $5 " ); \ + asm( "stq $7, 0($2) " ); \ + asm( "addq $2, 8, $2 " ); \ + asm( "addq $6, $3, $3 " ); \ + asm( "addq $5, $3, $3 " ); + +#define MULADDC_STOP \ + asm( "stq $3, %0 " : "=m" (c)); \ + asm( "stq $2, %0 " : "=m" (d)); \ + asm( "stq $1, %0 " : "=m" (s) :: \ + "$1", "$2", "$3", "$4", "$5", "$6", "$7" ); + +#endif /* Alpha */ + +#if defined(__mips__) + +#define MULADDC_INIT \ + asm( "lw $10, %0 " :: "m" (s)); \ + asm( "lw $11, %0 " :: "m" (d)); \ + asm( "lw $12, %0 " :: "m" (c)); \ + asm( "lw $13, %0 " :: "m" (b)); + +#define MULADDC_CORE \ + asm( "lw $14, 0($10) " ); \ + asm( "multu $13, $14 " ); \ + asm( "addi $10, $10, 4 " ); \ + asm( "mflo $14 " ); \ + asm( "mfhi $9 " ); \ + asm( "addu $14, $12, $14 " ); \ + asm( "lw $15, 0($11) " ); \ + asm( "sltu $12, $14, $12 " ); \ + asm( "addu $15, $14, $15 " ); \ + asm( "sltu $14, $15, $14 " ); \ + asm( "addu $12, $12, $9 " ); \ + asm( "sw $15, 0($11) " ); \ + asm( "addu $12, $12, $14 " ); \ + asm( "addi $11, $11, 4 " ); + +#define MULADDC_STOP \ + asm( "sw $12, %0 " : "=m" (c)); \ + asm( "sw $11, %0 " : "=m" (d)); \ + asm( "sw $10, %0 " : "=m" (s) :: \ + "$9", "$10", "$11", "$12", "$13", "$14", "$15" ); + +#endif /* MIPS */ +#endif /* GNUC */ + +#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) + +#define MULADDC_INIT \ + __asm mov esi, s \ + __asm mov edi, d \ + __asm mov ecx, c \ + __asm mov ebx, b + +#define MULADDC_CORE \ + __asm lodsd \ + __asm mul ebx \ + __asm add eax, ecx \ + __asm adc edx, 0 \ + __asm add eax, [edi] \ + __asm adc edx, 0 \ + __asm mov ecx, edx \ + __asm stosd + +#if defined(POLARSSL_HAVE_SSE2) + +#define EMIT __asm _emit + +#define MULADDC_HUIT \ + EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ + EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ + EMIT 0x0F EMIT 0x6E EMIT 0x1F \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x6E EMIT 0x16 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ + EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ + EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ + EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ + EMIT 0x0F EMIT 0x7E EMIT 0x0F \ + EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ + EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ + EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ + EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x7E EMIT 0xC9 + +#define MULADDC_STOP \ + EMIT 0x0F EMIT 0x77 \ + __asm mov c, ecx \ + __asm mov d, edi \ + __asm mov s, esi \ + +#else + +#define MULADDC_STOP \ + __asm mov c, ecx \ + __asm mov d, edi \ + __asm mov s, esi \ + +#endif /* SSE2 */ +#endif /* MSVC */ + +#endif /* POLARSSL_HAVE_ASM */ + +#if !defined(MULADDC_CORE) +#if defined(POLARSSL_HAVE_UDBL) + +#define MULADDC_INIT \ +{ \ + t_udbl r; \ + t_uint r0, r1; + +#define MULADDC_CORE \ + r = *(s++) * (t_udbl) b; \ + r0 = r; \ + r1 = r >> biL; \ + r0 += c; r1 += (r0 < c); \ + r0 += *d; r1 += (r0 < *d); \ + c = r1; *(d++) = r0; + +#define MULADDC_STOP \ +} + +#else +#define MULADDC_INIT \ +{ \ + t_uint s0, s1, b0, b1; \ + t_uint r0, r1, rx, ry; \ + b0 = ( b << biH ) >> biH; \ + b1 = ( b >> biH ); + +#define MULADDC_CORE \ + s0 = ( *s << biH ) >> biH; \ + s1 = ( *s >> biH ); s++; \ + rx = s0 * b1; r0 = s0 * b0; \ + ry = s1 * b0; r1 = s1 * b1; \ + r1 += ( rx >> biH ); \ + r1 += ( ry >> biH ); \ + rx <<= biH; ry <<= biH; \ + r0 += rx; r1 += (r0 < rx); \ + r0 += ry; r1 += (r0 < ry); \ + r0 += c; r1 += (r0 < c); \ + r0 += *d; r1 += (r0 < *d); \ + c = r1; *(d++) = r0; + +#define MULADDC_STOP \ +} + +#endif /* C (generic) */ +#endif /* C (longlong) */ + +#endif /* bn_mul.h */ diff --git a/Externals/polarssl/include/polarssl/camellia.h b/Externals/polarssl/include/polarssl/camellia.h new file mode 100644 index 0000000000..050c6cdb8b --- /dev/null +++ b/Externals/polarssl/include/polarssl/camellia.h @@ -0,0 +1,200 @@ +/** + * \file camellia.h + * + * \brief Camellia block cipher + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_CAMELLIA_H +#define POLARSSL_CAMELLIA_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define CAMELLIA_ENCRYPT 1 +#define CAMELLIA_DECRYPT 0 + +#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH -0x0024 /**< Invalid key length. */ +#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 /**< Invalid data input length. */ + +#if !defined(POLARSSL_CAMELLIA_ALT) +// Regular implementation +// + +/** + * \brief CAMELLIA context structure + */ +typedef struct +{ + int nr; /*!< number of rounds */ + uint32_t rk[68]; /*!< CAMELLIA round keys */ +} +camellia_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief CAMELLIA key schedule (encryption) + * + * \param ctx CAMELLIA context to be initialized + * \param key encryption key + * \param keysize must be 128, 192 or 256 + * + * \return 0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH + */ +int camellia_setkey_enc( camellia_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief CAMELLIA key schedule (decryption) + * + * \param ctx CAMELLIA context to be initialized + * \param key decryption key + * \param keysize must be 128, 192 or 256 + * + * \return 0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH + */ +int camellia_setkey_dec( camellia_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief CAMELLIA-ECB block encryption/decryption + * + * \param ctx CAMELLIA context + * \param mode CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 if successful + */ +int camellia_crypt_ecb( camellia_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ); + +/** + * \brief CAMELLIA-CBC buffer encryption/decryption + * Length should be a multiple of the block + * size (16 bytes) + * + * \param ctx CAMELLIA context + * \param mode CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH + */ +int camellia_crypt_cbc( camellia_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief CAMELLIA-CFB128 buffer encryption/decryption + * + * Note: Due to the nature of CFB you should use the same key schedule for + * both encryption and decryption. So a context initialized with + * camellia_setkey_enc() for both CAMELLIA_ENCRYPT and CAMELLIE_DECRYPT. + * + * \param ctx CAMELLIA context + * \param mode CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT + * \param length length of the input data + * \param iv_off offset in IV (updated after use) + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH + */ +int camellia_crypt_cfb128( camellia_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief CAMELLIA-CTR buffer encryption/decryption + * + * Warning: You have to keep the maximum use of your counter in mind! + * + * Note: Due to the nature of CTR you should use the same key schedule for + * both encryption and decryption. So a context initialized with + * camellia_setkey_enc() for both CAMELLIA_ENCRYPT and CAMELLIA_DECRYPT. + * + * \param length The length of the data + * \param nc_off The offset in the current stream_block (for resuming + * within current cipher stream). The offset pointer to + * should be 0 at the start of a stream. + * \param nonce_counter The 128-bit nonce and counter. + * \param stream_block The saved stream-block for resuming. Is overwritten + * by the function. + * \param input The input data stream + * \param output The output data stream + * + * \return 0 if successful + */ +int camellia_crypt_ctr( camellia_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_CAMELLIA_ALT */ +#include "camellia_alt.h" +#endif /* POLARSSL_CAMELLIA_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int camellia_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* camellia.h */ diff --git a/Externals/polarssl/include/polarssl/certs.h b/Externals/polarssl/include/polarssl/certs.h new file mode 100644 index 0000000000..5399e326d2 --- /dev/null +++ b/Externals/polarssl/include/polarssl/certs.h @@ -0,0 +1,47 @@ +/** + * \file certs.h + * + * \brief Sample certificates and DHM parameters for testing + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_CERTS_H +#define POLARSSL_CERTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char test_ca_crt[]; +extern const char test_ca_key[]; +extern const char test_ca_pwd[]; +extern const char test_srv_crt[]; +extern const char test_srv_key[]; +extern const char test_cli_crt[]; +extern const char test_cli_key[]; +extern const char test_dhm_params[]; + +#ifdef __cplusplus +} +#endif + +#endif /* certs.h */ diff --git a/Externals/polarssl/include/polarssl/cipher.h b/Externals/polarssl/include/polarssl/cipher.h new file mode 100644 index 0000000000..8224128e3d --- /dev/null +++ b/Externals/polarssl/include/polarssl/cipher.h @@ -0,0 +1,463 @@ +/** + * \file cipher.h + * + * \brief Generic cipher wrapper. + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef POLARSSL_CIPHER_H +#define POLARSSL_CIPHER_H + +#include + +#if defined(_MSC_VER) && !defined(inline) +#define inline _inline +#else +#if defined(__ARMCC_VERSION) && !defined(inline) +#define inline __inline +#endif /* __ARMCC_VERSION */ +#endif /*_MSC_VER */ + +#define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 /**< The selected feature is not available. */ +#define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA -0x6100 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_CIPHER_ALLOC_FAILED -0x6180 /**< Failed to allocate memory. */ +#define POLARSSL_ERR_CIPHER_INVALID_PADDING -0x6200 /**< Input data contains invalid padding and is rejected. */ +#define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 /**< Decryption of block requires a full block. */ + +typedef enum { + POLARSSL_CIPHER_ID_NONE = 0, + POLARSSL_CIPHER_ID_NULL, + POLARSSL_CIPHER_ID_AES, + POLARSSL_CIPHER_ID_DES, + POLARSSL_CIPHER_ID_3DES, + POLARSSL_CIPHER_ID_CAMELLIA, + POLARSSL_CIPHER_ID_BLOWFISH, +} cipher_id_t; + +typedef enum { + POLARSSL_CIPHER_NONE = 0, + POLARSSL_CIPHER_NULL, + POLARSSL_CIPHER_AES_128_CBC, + POLARSSL_CIPHER_AES_192_CBC, + POLARSSL_CIPHER_AES_256_CBC, + POLARSSL_CIPHER_AES_128_CFB128, + POLARSSL_CIPHER_AES_192_CFB128, + POLARSSL_CIPHER_AES_256_CFB128, + POLARSSL_CIPHER_AES_128_CTR, + POLARSSL_CIPHER_AES_192_CTR, + POLARSSL_CIPHER_AES_256_CTR, + POLARSSL_CIPHER_CAMELLIA_128_CBC, + POLARSSL_CIPHER_CAMELLIA_192_CBC, + POLARSSL_CIPHER_CAMELLIA_256_CBC, + POLARSSL_CIPHER_CAMELLIA_128_CFB128, + POLARSSL_CIPHER_CAMELLIA_192_CFB128, + POLARSSL_CIPHER_CAMELLIA_256_CFB128, + POLARSSL_CIPHER_CAMELLIA_128_CTR, + POLARSSL_CIPHER_CAMELLIA_192_CTR, + POLARSSL_CIPHER_CAMELLIA_256_CTR, + POLARSSL_CIPHER_DES_CBC, + POLARSSL_CIPHER_DES_EDE_CBC, + POLARSSL_CIPHER_DES_EDE3_CBC, + POLARSSL_CIPHER_BLOWFISH_CBC, + POLARSSL_CIPHER_BLOWFISH_CFB64, + POLARSSL_CIPHER_BLOWFISH_CTR, +} cipher_type_t; + +typedef enum { + POLARSSL_MODE_NONE = 0, + POLARSSL_MODE_NULL, + POLARSSL_MODE_CBC, + POLARSSL_MODE_CFB, + POLARSSL_MODE_OFB, + POLARSSL_MODE_CTR, +} cipher_mode_t; + +typedef enum { + POLARSSL_OPERATION_NONE = -1, + POLARSSL_DECRYPT = 0, + POLARSSL_ENCRYPT, +} operation_t; + +enum { + /** Undefined key length */ + POLARSSL_KEY_LENGTH_NONE = 0, + /** Key length, in bits (including parity), for DES keys */ + POLARSSL_KEY_LENGTH_DES = 64, + /** Key length, in bits (including parity), for DES in two key EDE */ + POLARSSL_KEY_LENGTH_DES_EDE = 128, + /** Key length, in bits (including parity), for DES in three-key EDE */ + POLARSSL_KEY_LENGTH_DES_EDE3 = 192, + /** Maximum length of any IV, in bytes */ + POLARSSL_MAX_IV_LENGTH = 16, +}; + +/** + * Base cipher information. The non-mode specific functions and values. + */ +typedef struct { + + /** Base Cipher type (e.g. POLARSSL_CIPHER_ID_AES) */ + cipher_id_t cipher; + + /** Encrypt using CBC */ + int (*cbc_func)( void *ctx, operation_t mode, size_t length, unsigned char *iv, + const unsigned char *input, unsigned char *output ); + + /** Encrypt using CFB (Full length) */ + int (*cfb_func)( void *ctx, operation_t mode, size_t length, size_t *iv_off, + unsigned char *iv, const unsigned char *input, unsigned char *output ); + + /** Encrypt using CTR */ + int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, + unsigned char *stream_block, const unsigned char *input, unsigned char *output ); + + /** Set key for encryption purposes */ + int (*setkey_enc_func)( void *ctx, const unsigned char *key, unsigned int key_length); + + /** Set key for decryption purposes */ + int (*setkey_dec_func)( void *ctx, const unsigned char *key, unsigned int key_length); + + /** Allocate a new context */ + void * (*ctx_alloc_func)( void ); + + /** Free the given context */ + void (*ctx_free_func)( void *ctx ); + +} cipher_base_t; + +/** + * Cipher information. Allows cipher functions to be called in a generic way. + */ +typedef struct { + /** Full cipher identifier (e.g. POLARSSL_CIPHER_AES_256_CBC) */ + cipher_type_t type; + + /** Cipher mode (e.g. POLARSSL_MODE_CBC) */ + cipher_mode_t mode; + + /** Cipher key length, in bits (default length for variable sized ciphers) + * (Includes parity bits for ciphers like DES) */ + unsigned int key_length; + + /** Name of the cipher */ + const char * name; + + /** IV size, in bytes */ + unsigned int iv_size; + + /** block size, in bytes */ + unsigned int block_size; + + /** Base cipher information and functions */ + const cipher_base_t *base; + +} cipher_info_t; + +/** + * Generic cipher context. + */ +typedef struct { + /** Information about the associated cipher */ + const cipher_info_t *cipher_info; + + /** Key length to use */ + int key_length; + + /** Operation that the context's key has been initialised for */ + operation_t operation; + + /** Buffer for data that hasn't been encrypted yet */ + unsigned char unprocessed_data[POLARSSL_MAX_IV_LENGTH]; + + /** Number of bytes that still need processing */ + size_t unprocessed_len; + + /** Current IV or NONCE_COUNTER for CTR-mode */ + unsigned char iv[POLARSSL_MAX_IV_LENGTH]; + + /** Cipher-specific context */ + void *cipher_ctx; +} cipher_context_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Returns the list of ciphers supported by the generic cipher module. + * + * \return a statically allocated array of ciphers, the last entry + * is 0. + */ +const int *cipher_list( void ); + +/** + * \brief Returns the cipher information structure associated + * with the given cipher name. + * + * \param cipher_name Name of the cipher to search for. + * + * \return the cipher information structure associated with the + * given cipher_name, or NULL if not found. + */ +const cipher_info_t *cipher_info_from_string( const char *cipher_name ); + +/** + * \brief Returns the cipher information structure associated + * with the given cipher type. + * + * \param cipher_type Type of the cipher to search for. + * + * \return the cipher information structure associated with the + * given cipher_type, or NULL if not found. + */ +const cipher_info_t *cipher_info_from_type( const cipher_type_t cipher_type ); + +/** + * \brief Initialises and fills the cipher context structure with + * the appropriate values. + * + * \param ctx context to initialise. May not be NULL. + * \param cipher_info cipher to use. + * + * \return \c 0 on success, + * \c POLARSSL_ERR_CIPHER_BAD_INPUT_DATA on parameter failure, + * \c POLARSSL_ERR_CIPHER_ALLOC_FAILED if allocation of the + * cipher-specific context failed. + */ +int cipher_init_ctx( cipher_context_t *ctx, const cipher_info_t *cipher_info ); + +/** + * \brief Free the cipher-specific context of ctx. Freeing ctx + * itself remains the responsibility of the caller. + * + * \param ctx Free the cipher-specific context + * + * \returns 0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA if + * parameter verification fails. + */ +int cipher_free_ctx( cipher_context_t *ctx ); + +/** + * \brief Returns the block size of the given cipher. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return size of the cipher's blocks, or 0 if ctx has not been + * initialised. + */ +static inline unsigned int cipher_get_block_size( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return 0; + + return ctx->cipher_info->block_size; +} + +/** + * \brief Returns the mode of operation for the cipher. + * (e.g. POLARSSL_MODE_CBC) + * + * \param ctx cipher's context. Must have been initialised. + * + * \return mode of operation, or POLARSSL_MODE_NONE if ctx + * has not been initialised. + */ +static inline cipher_mode_t cipher_get_cipher_mode( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return POLARSSL_MODE_NONE; + + return ctx->cipher_info->mode; +} + +/** + * \brief Returns the size of the cipher's IV. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return size of the cipher's IV, or 0 if ctx has not been + * initialised. + */ +static inline int cipher_get_iv_size( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return 0; + + return ctx->cipher_info->iv_size; +} + +/** + * \brief Returns the type of the given cipher. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return type of the cipher, or POLARSSL_CIPHER_NONE if ctx has + * not been initialised. + */ +static inline cipher_type_t cipher_get_type( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return POLARSSL_CIPHER_NONE; + + return ctx->cipher_info->type; +} + +/** + * \brief Returns the name of the given cipher, as a string. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return name of the cipher, or NULL if ctx was not initialised. + */ +static inline const char *cipher_get_name( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return 0; + + return ctx->cipher_info->name; +} + +/** + * \brief Returns the key length of the cipher. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return cipher's key length, in bits, or + * POLARSSL_KEY_LENGTH_NONE if ctx has not been + * initialised. + */ +static inline int cipher_get_key_size ( const cipher_context_t *ctx ) +{ + if( NULL == ctx ) + return POLARSSL_KEY_LENGTH_NONE; + + return ctx->key_length; +} + +/** + * \brief Returns the operation of the given cipher. + * + * \param ctx cipher's context. Must have been initialised. + * + * \return operation (POLARSSL_ENCRYPT or POLARSSL_DECRYPT), + * or POLARSSL_OPERATION_NONE if ctx has not been + * initialised. + */ +static inline operation_t cipher_get_operation( const cipher_context_t *ctx ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return POLARSSL_OPERATION_NONE; + + return ctx->operation; +} + +/** + * \brief Set the key to use with the given context. + * + * \param ctx generic cipher context. May not be NULL. Must have been + * initialised using cipher_context_from_type or + * cipher_context_from_string. + * \param key The key to use. + * \param key_length key length to use, in bits. + * \param operation Operation that the key will be used for, either + * POLARSSL_ENCRYPT or POLARSSL_DECRYPT. + * + * \returns 0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA if + * parameter verification fails or a cipher specific + * error code. + */ +int cipher_setkey( cipher_context_t *ctx, const unsigned char *key, int key_length, + const operation_t operation ); + +/** + * \brief Reset the given context, setting the IV to iv + * + * \param ctx generic cipher context + * \param iv IV to use or NONCE_COUNTER in the case of a CTR-mode cipher + * + * \returns 0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA + * if parameter verification fails. + */ +int cipher_reset( cipher_context_t *ctx, const unsigned char *iv ); + +/** + * \brief Generic cipher update function. Encrypts/decrypts + * using the given cipher context. Writes as many block + * size'd blocks of data as possible to output. Any data + * that cannot be written immediately will either be added + * to the next block, or flushed when cipher_final is + * called. + * + * \param ctx generic cipher context + * \param input buffer holding the input data + * \param ilen length of the input data + * \param output buffer for the output data. Should be able to hold at + * least ilen + block_size. Cannot be the same buffer as + * input! + * \param olen length of the output data, will be filled with the + * actual number of bytes written. + * + * \returns 0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA if + * parameter verification fails, + * POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE on an + * unsupported mode for a cipher or a cipher specific + * error code. + */ +int cipher_update( cipher_context_t *ctx, const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen ); + +/** + * \brief Generic cipher finalisation function. If data still + * needs to be flushed from an incomplete block, data + * contained within it will be padded with the size of + * the last block, and written to the output buffer. + * + * \param ctx Generic cipher context + * \param output buffer to write data to. Needs block_size data available. + * \param olen length of the data written to the output buffer. + * + * \returns 0 on success, POLARSSL_ERR_CIPHER_BAD_INPUT_DATA if + * parameter verification fails, + * POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption + * expected a full block but was not provided one, + * POLARSSL_ERR_CIPHER_INVALID_PADDING on invalid padding + * while decrypting or a cipher specific error code. + */ +int cipher_finish( cipher_context_t *ctx, unsigned char *output, size_t *olen); + + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int cipher_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* POLARSSL_MD_H */ diff --git a/Externals/polarssl/include/polarssl/cipher_wrap.h b/Externals/polarssl/include/polarssl/cipher_wrap.h new file mode 100644 index 0000000000..4abbc4ef29 --- /dev/null +++ b/Externals/polarssl/include/polarssl/cipher_wrap.h @@ -0,0 +1,107 @@ +/** + * \file cipher_wrap.h + * + * \brief Cipher wrappers. + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_CIPHER_WRAP_H +#define POLARSSL_CIPHER_WRAP_H + +#include "config.h" +#include "cipher.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(POLARSSL_AES_C) + +extern const cipher_info_t aes_128_cbc_info; +extern const cipher_info_t aes_192_cbc_info; +extern const cipher_info_t aes_256_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +extern const cipher_info_t aes_128_cfb128_info; +extern const cipher_info_t aes_192_cfb128_info; +extern const cipher_info_t aes_256_cfb128_info; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +extern const cipher_info_t aes_128_ctr_info; +extern const cipher_info_t aes_192_ctr_info; +extern const cipher_info_t aes_256_ctr_info; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +#endif /* defined(POLARSSL_AES_C) */ + +#if defined(POLARSSL_CAMELLIA_C) + +extern const cipher_info_t camellia_128_cbc_info; +extern const cipher_info_t camellia_192_cbc_info; +extern const cipher_info_t camellia_256_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +extern const cipher_info_t camellia_128_cfb128_info; +extern const cipher_info_t camellia_192_cfb128_info; +extern const cipher_info_t camellia_256_cfb128_info; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +extern const cipher_info_t camellia_128_ctr_info; +extern const cipher_info_t camellia_192_ctr_info; +extern const cipher_info_t camellia_256_ctr_info; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +#endif /* defined(POLARSSL_CAMELLIA_C) */ + +#if defined(POLARSSL_DES_C) + +extern const cipher_info_t des_cbc_info; +extern const cipher_info_t des_ede_cbc_info; +extern const cipher_info_t des_ede3_cbc_info; + +#endif /* defined(POLARSSL_DES_C) */ + +#if defined(POLARSSL_BLOWFISH_C) +extern const cipher_info_t blowfish_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +extern const cipher_info_t blowfish_cfb64_info; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +extern const cipher_info_t blowfish_ctr_info; +#endif /* POLARSSL_CIPHER_MODE_CTR */ +#endif /* defined(POLARSSL_BLOWFISH_C) */ + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) +extern const cipher_info_t null_cipher_info; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#ifdef __cplusplus +} +#endif + +#endif /* POLARSSL_CIPHER_WRAP_H */ diff --git a/Externals/polarssl/include/polarssl/config.h b/Externals/polarssl/include/polarssl/config.h new file mode 100644 index 0000000000..e6eb6d579f --- /dev/null +++ b/Externals/polarssl/include/polarssl/config.h @@ -0,0 +1,1012 @@ +/** + * \file config.h + * + * \brief Configuration options (set of defines) + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This set of compile-time options may be used to enable + * or disable features selectively, and reduce the global + * memory footprint. + */ +#ifndef POLARSSL_CONFIG_H +#define POLARSSL_CONFIG_H + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +/** + * \name SECTION: System support + * + * This section sets system specific settings. + * \{ + */ + +/** + * \def POLARSSL_HAVE_INT8 + * + * The system uses 8-bit wide native integers. + * + * Uncomment if native integers are 8-bit wide. +#define POLARSSL_HAVE_INT8 + */ + +/** + * \def POLARSSL_HAVE_INT16 + * + * The system uses 16-bit wide native integers. + * + * Uncomment if native integers are 16-bit wide. +#define POLARSSL_HAVE_INT16 + */ + +/** + * \def POLARSSL_HAVE_LONGLONG + * + * The compiler supports the 'long long' type. + * (Only used on 32-bit platforms) + */ +#define POLARSSL_HAVE_LONGLONG + +/** + * \def POLARSSL_HAVE_ASM + * + * The compiler has support for asm() + * + * Uncomment to enable the use of assembly code. + * + * Requires support for asm() in compiler. + * + * Used in: + * library/timing.c + * library/padlock.c + * include/polarssl/bn_mul.h + * + */ +#define POLARSSL_HAVE_ASM + +/** + * \def POLARSSL_HAVE_SSE2 + * + * CPU supports SSE2 instruction set. + * + * Uncomment if the CPU supports SSE2 (IA-32 specific). + * +#define POLARSSL_HAVE_SSE2 + */ +/* \} name */ + +/** + * \name SECTION: PolarSSL feature support + * + * This section sets support for features that are or are not needed + * within the modules that are enabled. + * \{ + */ + +/** + * \def POLARSSL_XXX_ALT + * + * Uncomment a macro to let PolarSSL use your alternate core implementation of + * a symmetric or hash algorithm (e.g. platform specific assembly optimized + * implementations). Keep in mind that the function prototypes should remain + * the same. + * + * Example: In case you uncomment POLARSSL_AES_ALT, PolarSSL will no longer + * provide the "struct aes_context" definition and omit the base function + * declarations and implementations. "aes_alt.h" will be included from + * "aes.h" to include the new function definitions. + * + * Uncomment a macro to enable alternate implementation for core algorithm + * functions +#define POLARSSL_AES_ALT +#define POLARSSL_ARC4_ALT +#define POLARSSL_BLOWFISH_ALT +#define POLARSSL_CAMELLIA_ALT +#define POLARSSL_DES_ALT +#define POLARSSL_XTEA_ALT +#define POLARSSL_MD2_ALT +#define POLARSSL_MD4_ALT +#define POLARSSL_MD5_ALT +#define POLARSSL_SHA1_ALT +#define POLARSSL_SHA2_ALT +#define POLARSSL_SHA4_ALT + */ + +/** + * \def POLARSSL_AES_ROM_TABLES + * + * Store the AES tables in ROM. + * + * Uncomment this macro to store the AES tables in ROM. + * +#define POLARSSL_AES_ROM_TABLES + */ + +/** + * \def POLARSSL_CIPHER_MODE_CFB + * + * Enable Cipher Feedback mode (CFB) for symmetric ciphers. + */ +#define POLARSSL_CIPHER_MODE_CFB + +/** + * \def POLARSSL_CIPHER_MODE_CTR + * + * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. + */ +#define POLARSSL_CIPHER_MODE_CTR + +/** + * \def POLARSSL_CIPHER_NULL_CIPHER + * + * Enable NULL cipher. + * Warning: Only do so when you know what you are doing. This allows for + * encryption or channels without any security! + * + * Requires POLARSSL_ENABLE_WEAK_CIPHERSUITES as well to enable + * the following ciphersuites: + * TLS_RSA_WITH_NULL_MD5 + * TLS_RSA_WITH_NULL_SHA + * TLS_RSA_WITH_NULL_SHA256 + * + * Uncomment this macro to enable the NULL cipher and ciphersuites +#define POLARSSL_CIPHER_NULL_CIPHER + */ + +/** + * \def POLARSSL_ENABLE_WEAK_CIPHERSUITES + * + * Enable weak ciphersuites in SSL / TLS + * Warning: Only do so when you know what you are doing. This allows for + * channels with virtually no security at all! + * + * This enables the following ciphersuites: + * TLS_RSA_WITH_DES_CBC_SHA + * TLS_DHE_RSA_WITH_DES_CBC_SHA + * + * Uncomment this macro to enable weak ciphersuites +#define POLARSSL_ENABLE_WEAK_CIPHERSUITES + */ + +/** + * \def POLARSSL_ERROR_STRERROR_DUMMY + * + * Enable a dummy error function to make use of error_strerror() in + * third party libraries easier. + * + * Disable if you run into name conflicts and want to really remove the + * error_strerror() + */ +#define POLARSSL_ERROR_STRERROR_DUMMY + +/** + * \def POLARSSL_GENPRIME + * + * Requires: POLARSSL_BIGNUM_C, POLARSSL_RSA_C + * + * Enable the RSA prime-number generation code. + */ +#define POLARSSL_GENPRIME + +/** + * \def POLARSSL_FS_IO + * + * Enable functions that use the filesystem. + */ +#define POLARSSL_FS_IO + +/** + * \def POLARSSL_NO_DEFAULT_ENTROPY_SOURCES + * + * Do not add default entropy sources. These are the platform specific, + * hardclock and HAVEGE based poll functions. + * + * This is useful to have more control over the added entropy sources in an + * application. + * + * Uncomment this macro to prevent loading of default entropy functions. +#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES + */ + +/** + * \def POLARSSL_NO_PLATFORM_ENTROPY + * + * Do not use built-in platform entropy functions. + * This is useful if your platform does not support + * standards like the /dev/urandom or Windows CryptoAPI. + * + * Uncomment this macro to disable the built-in platform entropy functions. +#define POLARSSL_NO_PLATFORM_ENTROPY + */ + +/** + * \def POLARSSL_PKCS1_V21 + * + * Requires: POLARSSL_MD_C, POLARSSL_RSA_C + * + * Enable support for PKCS#1 v2.1 encoding. + * This enables support for RSAES-OAEP and RSASSA-PSS operations. + */ +#define POLARSSL_PKCS1_V21 + +/** + * \def POLARSSL_RSA_NO_CRT + * + * Do not use the Chinese Remainder Theorem for the RSA private operation. + * + * Uncomment this macro to disable the use of CRT in RSA. + * +#define POLARSSL_RSA_NO_CRT + */ + +/** + * \def POLARSSL_SELF_TEST + * + * Enable the checkup functions (*_self_test). + */ +#define POLARSSL_SELF_TEST + +/** + * \def POLARSSL_SSL_ALL_ALERT_MESSAGES + * + * Enable sending of alert messages in case of encountered errors as per RFC. + * If you choose not to send the alert messages, PolarSSL can still communicate + * with other servers, only debugging of failures is harder. + * + * The advantage of not sending alert messages, is that no information is given + * about reasons for failures thus preventing adversaries of gaining intel. + * + * Enable sending of all alert messages + */ +#define POLARSSL_SSL_ALERT_MESSAGES + +/** + * \def POLARSSL_SSL_DEBUG_ALL + * + * Enable the debug messages in SSL module for all issues. + * Debug messages have been disabled in some places to prevent timing + * attacks due to (unbalanced) debugging function calls. + * + * If you need all error reporting you should enable this during debugging, + * but remove this for production servers that should log as well. + * + * Uncomment this macro to report all debug messages on errors introducing + * a timing side-channel. + * +#define POLARSSL_SSL_DEBUG_ALL + */ + +/** + * \def POLARSSL_SSL_HW_RECORD_ACCEL + * + * Enable hooking functions in SSL module for hardware acceleration of + * individual records. + * + * Uncomment this macro to enable hooking functions. +#define POLARSSL_SSL_HW_RECORD_ACCEL + */ + +/** + * \def POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + * + * Enable support for receiving and parsing SSLv2 Client Hello messages for the + * SSL Server module (POLARSSL_SSL_SRV_C) + * + * Comment this macro to disable support for SSLv2 Client Hello messages. + */ +#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + +/** + * \def POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + * + * If set, the X509 parser will not break-off when parsing an X509 certificate + * and encountering an unknown critical extension. + * + * Uncomment to prevent an error. + * +#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + */ + +/** + * \def POLARSSL_ZLIB_SUPPORT + * + * If set, the SSL/TLS module uses ZLIB to support compression and + * decompression of packet data. + * + * Used in: library/ssl_tls.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * This feature requires zlib library and headers to be present. + * + * Uncomment to enable use of ZLIB +#define POLARSSL_ZLIB_SUPPORT + */ +/* \} name */ + +/** + * \name SECTION: PolarSSL modules + * + * This section enables or disables entire modules in PolarSSL + * \{ + */ + +/** + * \def POLARSSL_AES_C + * + * Enable the AES block cipher. + * + * Module: library/aes.c + * Caller: library/ssl_tls.c + * library/pem.c + * library/ctr_drbg.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * TLS_RSA_WITH_AES_128_CBC_SHA + * TLS_RSA_WITH_AES_256_CBC_SHA + * TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * TLS_RSA_WITH_AES_128_CBC_SHA256 + * TLS_RSA_WITH_AES_256_CBC_SHA256 + * TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * TLS_RSA_WITH_AES_128_GCM_SHA256 + * TLS_RSA_WITH_AES_256_GCM_SHA384 + * + * PEM uses AES for decrypting encrypted keys. + */ +#define POLARSSL_AES_C + +/** + * \def POLARSSL_ARC4_C + * + * Enable the ARCFOUR stream cipher. + * + * Module: library/arc4.c + * Caller: library/ssl_tls.c + * + * This module enables the following ciphersuites: + * TLS_RSA_WITH_RC4_128_MD5 + * TLS_RSA_WITH_RC4_128_SHA + */ +#define POLARSSL_ARC4_C + +/** + * \def POLARSSL_ASN1_PARSE_C + * + * Enable the generic ASN1 parser. + * + * Module: library/asn1.c + * Caller: library/x509parse.c + */ +#define POLARSSL_ASN1_PARSE_C + +/** + * \def POLARSSL_ASN1_WRITE_C + * + * Enable the generic ASN1 writer. + * + * Module: library/asn1write.c + */ +#define POLARSSL_ASN1_WRITE_C + +/** + * \def POLARSSL_BASE64_C + * + * Enable the Base64 module. + * + * Module: library/base64.c + * Caller: library/pem.c + * + * This module is required for PEM support (required by X.509). + */ +#define POLARSSL_BASE64_C + +/** + * \def POLARSSL_BIGNUM_C + * + * Enable the multi-precision integer library. + * + * Module: library/bignum.c + * Caller: library/dhm.c + * library/rsa.c + * library/ssl_tls.c + * library/x509parse.c + * + * This module is required for RSA and DHM support. + */ +#define POLARSSL_BIGNUM_C + +/** + * \def POLARSSL_BLOWFISH_C + * + * Enable the Blowfish block cipher. + * + * Module: library/blowfish.c + */ +#define POLARSSL_BLOWFISH_C + +/** + * \def POLARSSL_CAMELLIA_C + * + * Enable the Camellia block cipher. + * + * Module: library/camellia.c + * Caller: library/ssl_tls.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA + * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA + * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + */ +#define POLARSSL_CAMELLIA_C + +/** + * \def POLARSSL_CERTS_C + * + * Enable the test certificates. + * + * Module: library/certs.c + * Caller: + * + * This module is used for testing (ssl_client/server). + */ +#define POLARSSL_CERTS_C + +/** + * \def POLARSSL_CIPHER_C + * + * Enable the generic cipher layer. + * + * Module: library/cipher.c + * Caller: + * + * Uncomment to enable generic cipher wrappers. + */ +#define POLARSSL_CIPHER_C + +/** + * \def POLARSSL_CTR_DRBG_C + * + * Enable the CTR_DRBG AES-256-based random generator + * + * Module: library/ctr_drbg.c + * Caller: + * + * Requires: POLARSSL_AES_C + * + * This module provides the CTR_DRBG AES-256 random number generator. + */ +#define POLARSSL_CTR_DRBG_C + +/** + * \def POLARSSL_DEBUG_C + * + * Enable the debug functions. + * + * Module: library/debug.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * This module provides debugging functions. + */ +#define POLARSSL_DEBUG_C + +/** + * \def POLARSSL_DES_C + * + * Enable the DES block cipher. + * + * Module: library/des.c + * Caller: library/pem.c + * library/ssl_tls.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * TLS_RSA_WITH_3DES_EDE_CBC_SHA + * TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * + * PEM uses DES/3DES for decrypting encrypted keys. + */ +#define POLARSSL_DES_C + +/** + * \def POLARSSL_DHM_C + * + * Enable the Diffie-Hellman-Merkle key exchange. + * + * Module: library/dhm.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * TLS_DHE_RSA_WITH_DES_CBC_SHA + * TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 + * TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 + */ +#define POLARSSL_DHM_C + +/** + * \def POLARSSL_ENTROPY_C + * + * Enable the platform-specific entropy code. + * + * Module: library/entropy.c + * Caller: + * + * Requires: POLARSSL_SHA4_C + * + * This module provides a generic entropy pool + */ +#define POLARSSL_ENTROPY_C + +/** + * \def POLARSSL_ERROR_C + * + * Enable error code to error string conversion. + * + * Module: library/error.c + * Caller: + * + * This module enables err_strerror(). + */ +#define POLARSSL_ERROR_C + +/** + * \def POLARSSL_GCM_C + * + * Enable the Galois/Counter Mode (GCM) for AES + * + * Module: library/gcm.c + * + * Requires: POLARSSL_AES_C + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * TLS_RSA_WITH_AES_128_GCM_SHA256 + * TLS_RSA_WITH_AES_256_GCM_SHA384 + */ +#define POLARSSL_GCM_C + +/** + * \def POLARSSL_HAVEGE_C + * + * Enable the HAVEGE random generator. + * + * Warning: the HAVEGE random generator is not suitable for virtualized + * environments + * + * Warning: the HAVEGE random generator is dependent on timing and specific + * processor traits. It is therefore not advised to use HAVEGE as + * your applications primary random generator or primary entropy pool + * input. As a secondary input to your entropy pool, it IS able add + * the (limited) extra entropy it provides. + * + * Module: library/havege.c + * Caller: + * + * Requires: POLARSSL_TIMING_C + * + * Uncomment to enable the HAVEGE random generator. + */ +#define POLARSSL_HAVEGE_C + +/** + * \def POLARSSL_MD_C + * + * Enable the generic message digest layer. + * + * Module: library/md.c + * Caller: + * + * Uncomment to enable generic message digest wrappers. + */ +#define POLARSSL_MD_C + +/** + * \def POLARSSL_MD2_C + * + * Enable the MD2 hash algorithm + * + * Module: library/md2.c + * Caller: library/x509parse.c + * + * Uncomment to enable support for (rare) MD2-signed X.509 certs. + * +#define POLARSSL_MD2_C + */ + +/** + * \def POLARSSL_MD4_C + * + * Enable the MD4 hash algorithm + * + * Module: library/md4.c + * Caller: library/x509parse.c + * + * Uncomment to enable support for (rare) MD4-signed X.509 certs. + * +#define POLARSSL_MD4_C + */ + +/** + * \def POLARSSL_MD5_C + * + * Enable the MD5 hash algorithm + * + * Module: library/md5.c + * Caller: library/pem.c + * library/ssl_tls.c + * library/x509parse.c + * + * This module is required for SSL/TLS and X.509. + * PEM uses MD5 for decrypting encrypted keys. + */ +#define POLARSSL_MD5_C + +/** + * \def POLARSSL_NET_C + * + * Enable the TCP/IP networking routines. + * + * Module: library/net.c + * Caller: + * + * This module provides TCP/IP networking routines. + */ +#define POLARSSL_NET_C + +/** + * \def POLARSSL_PADLOCK_C + * + * Enable VIA Padlock support on x86. + * + * Module: library/padlock.c + * Caller: library/aes.c + * + * This modules adds support for the VIA PadLock on x86. + */ +#define POLARSSL_PADLOCK_C + +/** + * \def POLARSSL_PBKDF2_C + * + * Enable PKCS#5 PBKDF2 key derivation function + * DEPRECATED: Use POLARSSL_PKCS5_C instead + * + * Module: library/pbkdf2.c + * + * Requires: POLARSSL_PKCS5_C + * + * This module adds support for the PKCS#5 PBKDF2 key derivation function. +#define POLARSSL_PBKDF2_C + */ + +/** + * \def POLARSSL_PEM_C + * + * Enable PEM decoding + * + * Module: library/pem.c + * Caller: library/x509parse.c + * + * Requires: POLARSSL_BASE64_C + * + * This modules adds support for decoding PEM files. + */ +#define POLARSSL_PEM_C + +/** + * \def POLARSSL_PKCS5_C + * + * Enable PKCS#5 functions + * + * Module: library/pkcs5.c + * + * Requires: POLARSSL_MD_C + * + * This module adds support for the PKCS#5 functions. + */ +#define POLARSSL_PKCS5_C + +/** + * \def POLARSSL_PKCS11_C + * + * Enable wrapper for PKCS#11 smartcard support. + * + * Module: library/ssl_srv.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: POLARSSL_SSL_TLS_C + * + * This module enables SSL/TLS PKCS #11 smartcard support. + * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) +#define POLARSSL_PKCS11_C + */ + +/** + * \def POLARSSL_PKCS12_C + * + * Enable PKCS#12 PBE functions + * Adds algorithms for parsing PKCS#8 encrypted private keys + * + * Module: library/pkcs12.c + * Caller: library/x509parse.c + * + * Requires: POLARSSL_ASN1_PARSE_C, POLARSSL_CIPHER_C, POLARSSL_MD_C + * Can use: POLARSSL_ARC4_C + * + * This module enables PKCS#12 functions. + */ +#define POLARSSL_PKCS12_C + +/** + * \def POLARSSL_RSA_C + * + * Enable the RSA public-key cryptosystem. + * + * Module: library/rsa.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509.c + * + * Requires: POLARSSL_BIGNUM_C + * + * This module is required for SSL/TLS and MD5-signed certificates. + */ +#define POLARSSL_RSA_C + +/** + * \def POLARSSL_SHA1_C + * + * Enable the SHA1 cryptographic hash algorithm. + * + * Module: library/sha1.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509parse.c + * + * This module is required for SSL/TLS and SHA1-signed certificates. + */ +#define POLARSSL_SHA1_C + +/** + * \def POLARSSL_SHA2_C + * + * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. + * + * Module: library/sha2.c + * Caller: library/md_wrap.c + * library/x509parse.c + * + * This module adds support for SHA-224 and SHA-256. + * This module is required for the SSL/TLS 1.2 PRF function. + */ +#define POLARSSL_SHA2_C + +/** + * \def POLARSSL_SHA4_C + * + * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. + * + * Module: library/sha4.c + * Caller: library/md_wrap.c + * library/x509parse.c + * + * This module adds support for SHA-384 and SHA-512. + */ +#define POLARSSL_SHA4_C + +/** + * \def POLARSSL_SSL_CACHE_C + * + * Enable simple SSL cache implementation. + * + * Module: library/ssl_cache.c + * Caller: + * + * Requires: POLARSSL_SSL_CACHE_C + */ +#define POLARSSL_SSL_CACHE_C + +/** + * \def POLARSSL_SSL_CLI_C + * + * Enable the SSL/TLS client code. + * + * Module: library/ssl_cli.c + * Caller: + * + * Requires: POLARSSL_SSL_TLS_C + * + * This module is required for SSL/TLS client support. + */ +#define POLARSSL_SSL_CLI_C + +/** + * \def POLARSSL_SSL_SRV_C + * + * Enable the SSL/TLS server code. + * + * Module: library/ssl_srv.c + * Caller: + * + * Requires: POLARSSL_SSL_TLS_C + * + * This module is required for SSL/TLS server support. + */ +//#define POLARSSL_SSL_SRV_C + +/** + * \def POLARSSL_SSL_TLS_C + * + * Enable the generic SSL/TLS code. + * + * Module: library/ssl_tls.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: POLARSSL_MD5_C, POLARSSL_SHA1_C, POLARSSL_X509_PARSE_C + * + * This module is required for SSL/TLS. + */ +#define POLARSSL_SSL_TLS_C + +/** + * \def POLARSSL_TIMING_C + * + * Enable the portable timing interface. + * + * Module: library/timing.c + * Caller: library/havege.c + * + * This module is used by the HAVEGE random number generator. + */ +#define POLARSSL_TIMING_C + +/** + * \def POLARSSL_VERSION_C + * + * Enable run-time version information. + * + * Module: library/version.c + * + * This module provides run-time version information. + */ +#define POLARSSL_VERSION_C + +/** + * \def POLARSSL_X509_PARSE_C + * + * Enable X.509 certificate parsing. + * + * Module: library/x509parse.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * Requires: POLARSSL_ASN1_PARSE_C, POLARSSL_BIGNUM_C, POLARSSL_RSA_C + * + * This module is required for X.509 certificate parsing. + */ +#define POLARSSL_X509_PARSE_C + +/** + * \def POLARSSL_X509_WRITE_C + * + * Enable X.509 buffer writing. + * + * Module: library/x509write.c + * + * Requires: POLARSSL_BIGNUM_C, POLARSSL_RSA_C + * + * This module is required for X.509 certificate request writing. + */ +#define POLARSSL_X509_WRITE_C + +/** + * \def POLARSSL_XTEA_C + * + * Enable the XTEA block cipher. + * + * Module: library/xtea.c + * Caller: + */ +#define POLARSSL_XTEA_C +/* \} name */ + +/** + * \name SECTION: Module configuration options + * + * This section allows for the setting of module specific sizes and + * configuration options. The default values are already present in the + * relevant header files and should suffice for the regular use cases. + * Our advice is to enable POLARSSL_CONFIG_OPTIONS and change values here + * only if you have a good reason and know the consequences. + * + * If POLARSSL_CONFIG_OPTIONS is undefined here the options in the module + * header file take precedence. + * + * Please check the respective header file for documentation on these + * parameters (to prevent duplicate documentation). + * + * Uncomment POLARSSL_CONFIG_OPTIONS to enable using the values defined here. + * \{ + */ +//#define POLARSSL_CONFIG_OPTIONS /**< Enable config.h module value configuration */ + +#if defined(POLARSSL_CONFIG_OPTIONS) + +// MPI / BIGNUM options +// +#define POLARSSL_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ +#define POLARSSL_MPI_MAX_SIZE 512 /**< Maximum number of bytes for usable MPIs. */ + +// CTR_DRBG options +// +#define CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default */ +#define CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +#define CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +#define CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +#define CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ + +// Entropy options +// +#define ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ +#define ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ + +// SSL Cache options +// +#define SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ +#define SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ + +// SSL options +// +#define SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ + +#endif /* POLARSSL_CONFIG_OPTIONS */ + +/* \} name */ +#endif /* config.h */ diff --git a/Externals/polarssl/include/polarssl/ctr_drbg.h b/Externals/polarssl/include/polarssl/ctr_drbg.h new file mode 100644 index 0000000000..5a26cdee10 --- /dev/null +++ b/Externals/polarssl/include/polarssl/ctr_drbg.h @@ -0,0 +1,231 @@ +/** + * \file ctr_drbg.h + * + * \brief CTR_DRBG based on AES-256 (NIST SP 800-90) + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_CTR_DRBG_H +#define POLARSSL_CTR_DRBG_H + +#include + +#include "aes.h" + +#define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 /**< The entropy source failed. */ +#define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 /**< Too many random requested in single call. */ +#define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 /**< Input too large (Entropy + additional). */ +#define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A /**< Read/write error in file. */ + +#define CTR_DRBG_BLOCKSIZE 16 /**< Block size used by the cipher */ +#define CTR_DRBG_KEYSIZE 32 /**< Key size used by the cipher */ +#define CTR_DRBG_KEYBITS ( CTR_DRBG_KEYSIZE * 8 ) +#define CTR_DRBG_SEEDLEN ( CTR_DRBG_KEYSIZE + CTR_DRBG_BLOCKSIZE ) + /**< The seed length (counter + AES key) */ + +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default */ +#define CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +#define CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +#define CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +#define CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ +#endif /* !POLARSSL_CONFIG_OPTIONS */ + +#define CTR_DRBG_PR_OFF 0 /**< No prediction resistance */ +#define CTR_DRBG_PR_ON 1 /**< Prediction resistance enabled */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief CTR_DRBG context structure + */ +typedef struct +{ + unsigned char counter[16]; /*!< counter (V) */ + int reseed_counter; /*!< reseed counter */ + int prediction_resistance; /*!< enable prediction resistance (Automatic + reseed before every random generation) */ + size_t entropy_len; /*!< amount of entropy grabbed on each (re)seed */ + int reseed_interval; /*!< reseed interval */ + + aes_context aes_ctx; /*!< AES context */ + + /* + * Callbacks (Entropy) + */ + int (*f_entropy)(void *, unsigned char *, size_t); + + void *p_entropy; /*!< context for the entropy function */ +} +ctr_drbg_context; + +/** + * \brief CTR_DRBG initialization + * + * Note: Personalization data can be provided in addition to the more generic + * entropy source to make this instantiation as unique as possible. + * + * \param ctx CTR_DRBG context to be initialized + * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer + * length) + * \param p_entropy Entropy context + * \param custom Personalization data (Device specific identifiers) + * (Can be NULL) + * \param len Length of personalization data + * + * \return 0 if successful, or + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED + */ +int ctr_drbg_init( ctr_drbg_context *ctx, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len ); + +/** + * \brief Enable / disable prediction resistance (Default: Off) + * + * Note: If enabled, entropy is used for ctx->entropy_len before each call! + * Only use this if you have ample supply of good entropy! + * + * \param ctx CTR_DRBG context + * \param resistance CTR_DRBG_PR_ON or CTR_DRBG_PR_OFF + */ +void ctr_drbg_set_prediction_resistance( ctr_drbg_context *ctx, + int resistance ); + +/** + * \brief Set the amount of entropy grabbed on each (re)seed + * (Default: CTR_DRBG_ENTROPY_LEN) + * + * \param ctx CTR_DRBG context + * \param len Amount of entropy to grab + */ +void ctr_drbg_set_entropy_len( ctr_drbg_context *ctx, + size_t len ); + +/** + * \brief Set the reseed interval + * (Default: CTR_DRBG_RESEED_INTERVAL) + * + * \param ctx CTR_DRBG context + * \param interval Reseed interval + */ +void ctr_drbg_set_reseed_interval( ctr_drbg_context *ctx, + int interval ); + +/** + * \brief CTR_DRBG reseeding (extracts data from entropy source) + * + * \param ctx CTR_DRBG context + * \param additional Additional data to add to state (Can be NULL) + * \param len Length of additional data + * + * \return 0 if successful, or + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED + */ +int ctr_drbg_reseed( ctr_drbg_context *ctx, + const unsigned char *additional, size_t len ); + +/** + * \brief CTR_DRBG update state + * + * \param ctx CTR_DRBG context + * \param additional Additional data to update state with + * \param add_len Length of additional data + */ +void ctr_drbg_update( ctr_drbg_context *ctx, + const unsigned char *additional, size_t add_len ); + +/** + * \brief CTR_DRBG generate random with additional update input + * + * Note: Automatically reseeds if reseed_counter is reached. + * + * \param p_rng CTR_DRBG context + * \param output Buffer to fill + * \param output_len Length of the buffer + * \param additional Additional data to update with (Can be NULL) + * \param add_len Length of additional data + * + * \return 0 if successful, or + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or + * POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG + */ +int ctr_drbg_random_with_add( void *p_rng, + unsigned char *output, size_t output_len, + const unsigned char *additional, size_t add_len ); + +/** + * \brief CTR_DRBG generate random + * + * Note: Automatically reseeds if reseed_counter is reached. + * + * \param p_rng CTR_DRBG context + * \param output Buffer to fill + * \param output_len Length of the buffer + * + * \return 0 if successful, or + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or + * POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG + */ +int ctr_drbg_random( void *p_rng, + unsigned char *output, size_t output_len ); + +#if defined(POLARSSL_FS_IO) +/** + * \brief Write a seed file + * + * \param path Name of the file + * + * \return 0 if successful, 1 on file error, or + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED + */ +int ctr_drbg_write_seed_file( ctr_drbg_context *ctx, const char *path ); + +/** + * \brief Read and update a seed file. Seed is added to this + * instance + * + * \param path Name of the file + * + * \return 0 if successful, 1 on file error, + * POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or + * POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG + */ +int ctr_drbg_update_seed_file( ctr_drbg_context *ctx, const char *path ); +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int ctr_drbg_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* ctr_drbg.h */ diff --git a/Externals/polarssl/include/polarssl/debug.h b/Externals/polarssl/include/polarssl/debug.h new file mode 100644 index 0000000000..511e926eb6 --- /dev/null +++ b/Externals/polarssl/include/polarssl/debug.h @@ -0,0 +1,89 @@ +/** + * \file debug.h + * + * \brief Debug functions + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_DEBUG_H +#define POLARSSL_DEBUG_H + +#include "config.h" +#include "ssl.h" + +#if defined(POLARSSL_DEBUG_C) + +#define SSL_DEBUG_MSG( level, args ) \ + debug_print_msg( ssl, level, __FILE__, __LINE__, debug_fmt args ); + +#define SSL_DEBUG_RET( level, text, ret ) \ + debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ); + +#define SSL_DEBUG_BUF( level, text, buf, len ) \ + debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len ); + +#define SSL_DEBUG_MPI( level, text, X ) \ + debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X ); + +#define SSL_DEBUG_CRT( level, text, crt ) \ + debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt ); + +#else + +#define SSL_DEBUG_MSG( level, args ) do { } while( 0 ) +#define SSL_DEBUG_RET( level, text, ret ) do { } while( 0 ) +#define SSL_DEBUG_BUF( level, text, buf, len ) do { } while( 0 ) +#define SSL_DEBUG_MPI( level, text, X ) do { } while( 0 ) +#define SSL_DEBUG_CRT( level, text, crt ) do { } while( 0 ) + +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +char *debug_fmt( const char *format, ... ); + +void debug_print_msg( const ssl_context *ssl, int level, + const char *file, int line, const char *text ); + +void debug_print_ret( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, int ret ); + +void debug_print_buf( const ssl_context *ssl, int level, + const char *file, int line, const char *text, + unsigned char *buf, size_t len ); + +void debug_print_mpi( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mpi *X ); + +void debug_print_crt( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, const x509_cert *crt ); + +#ifdef __cplusplus +} +#endif + +#endif /* debug.h */ diff --git a/Externals/polarssl/include/polarssl/des.h b/Externals/polarssl/include/polarssl/des.h new file mode 100644 index 0000000000..d78b568c84 --- /dev/null +++ b/Externals/polarssl/include/polarssl/des.h @@ -0,0 +1,252 @@ +/** + * \file des.h + * + * \brief DES block cipher + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_DES_H +#define POLARSSL_DES_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH -0x0032 /**< The data input has an invalid length. */ + +#define DES_KEY_SIZE 8 + +#if !defined(POLARSSL_DES_ALT) +// Regular implementation +// + +/** + * \brief DES context structure + */ +typedef struct +{ + int mode; /*!< encrypt/decrypt */ + uint32_t sk[32]; /*!< DES subkeys */ +} +des_context; + +/** + * \brief Triple-DES context structure + */ +typedef struct +{ + int mode; /*!< encrypt/decrypt */ + uint32_t sk[96]; /*!< 3DES subkeys */ +} +des3_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Set key parity on the given key to odd. + * + * DES keys are 56 bits long, but each byte is padded with + * a parity bit to allow verification. + * + * \param key 8-byte secret key + */ +void des_key_set_parity( unsigned char key[DES_KEY_SIZE] ); + +/** + * \brief Check that key parity on the given key is odd. + * + * DES keys are 56 bits long, but each byte is padded with + * a parity bit to allow verification. + * + * \param key 8-byte secret key + * + * \return 0 is parity was ok, 1 if parity was not correct. + */ +int des_key_check_key_parity( const unsigned char key[DES_KEY_SIZE] ); + +/** + * \brief Check that key is not a weak or semi-weak DES key + * + * \param key 8-byte secret key + * + * \return 0 if no weak key was found, 1 if a weak key was identified. + */ +int des_key_check_weak( const unsigned char key[DES_KEY_SIZE] ); + +/** + * \brief DES key schedule (56-bit, encryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + * + * \return 0 + */ +int des_setkey_enc( des_context *ctx, const unsigned char key[DES_KEY_SIZE] ); + +/** + * \brief DES key schedule (56-bit, decryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + * + * \return 0 + */ +int des_setkey_dec( des_context *ctx, const unsigned char key[DES_KEY_SIZE] ); + +/** + * \brief Triple-DES key schedule (112-bit, encryption) + * + * \param ctx 3DES context to be initialized + * \param key 16-byte secret key + * + * \return 0 + */ +int des3_set2key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] ); + +/** + * \brief Triple-DES key schedule (112-bit, decryption) + * + * \param ctx 3DES context to be initialized + * \param key 16-byte secret key + * + * \return 0 + */ +int des3_set2key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] ); + +/** + * \brief Triple-DES key schedule (168-bit, encryption) + * + * \param ctx 3DES context to be initialized + * \param key 24-byte secret key + * + * \return 0 + */ +int des3_set3key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] ); + +/** + * \brief Triple-DES key schedule (168-bit, decryption) + * + * \param ctx 3DES context to be initialized + * \param key 24-byte secret key + * + * \return 0 + */ +int des3_set3key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] ); + +/** + * \brief DES-ECB block encryption/decryption + * + * \param ctx DES context + * \param input 64-bit input block + * \param output 64-bit output block + * + * \return 0 if successful + */ +int des_crypt_ecb( des_context *ctx, + const unsigned char input[8], + unsigned char output[8] ); + +/** + * \brief DES-CBC buffer encryption/decryption + * + * \param ctx DES context + * \param mode DES_ENCRYPT or DES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + */ +int des_crypt_cbc( des_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output ); + +/** + * \brief 3DES-ECB block encryption/decryption + * + * \param ctx 3DES context + * \param input 64-bit input block + * \param output 64-bit output block + * + * \return 0 if successful + */ +int des3_crypt_ecb( des3_context *ctx, + const unsigned char input[8], + unsigned char output[8] ); + +/** + * \brief 3DES-CBC buffer encryption/decryption + * + * \param ctx 3DES context + * \param mode DES_ENCRYPT or DES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or POLARSSL_ERR_DES_INVALID_INPUT_LENGTH + */ +int des3_crypt_cbc( des3_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_DES_ALT */ +#include "des_alt.h" +#endif /* POLARSSL_DES_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int des_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* des.h */ diff --git a/Externals/polarssl/include/polarssl/dhm.h b/Externals/polarssl/include/polarssl/dhm.h new file mode 100644 index 0000000000..48d926856d --- /dev/null +++ b/Externals/polarssl/include/polarssl/dhm.h @@ -0,0 +1,244 @@ +/** + * \file dhm.h + * + * \brief Diffie-Hellman-Merkle key exchange + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_DHM_H +#define POLARSSL_DHM_H + +#include "bignum.h" + +/* + * DHM Error codes + */ +#define POLARSSL_ERR_DHM_BAD_INPUT_DATA -0x3080 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_DHM_READ_PARAMS_FAILED -0x3100 /**< Reading of the DHM parameters failed. */ +#define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 /**< Making of the DHM parameters failed. */ +#define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED -0x3200 /**< Reading of the public values failed. */ +#define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 /**< Making of the public value failed. */ +#define POLARSSL_ERR_DHM_CALC_SECRET_FAILED -0x3300 /**< Calculation of the DHM secret failed. */ + +/** + * RFC 3526 defines a number of standardized Diffie-Hellman groups + * for IKE. + * RFC 5114 defines a number of standardized Diffie-Hellman groups + * that can be used. + * + * Some are included here for convenience. + * + * Included are: + * RFC 3526 3. 2048-bit MODP Group + * RFC 3526 4. 3072-bit MODP Group + * RFC 5114 2.1. 1024-bit MODP Group with 160-bit Prime Order Subgroup + * RFC 5114 2.2. 2048-bit MODP Group with 224-bit Prime Order Subgroup + */ +#define POLARSSL_DHM_RFC3526_MODP_2048_P \ + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ + "15728E5A8AACAA68FFFFFFFFFFFFFFFF" + +#define POLARSSL_DHM_RFC3526_MODP_2048_G "02" + +#define POLARSSL_DHM_RFC3526_MODP_3072_P \ + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ + "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF" + +#define POLARSSL_DHM_RFC3526_MODP_3072_G "02" + +#define POLARSSL_DHM_RFC5114_MODP_1024_P \ + "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6" \ + "9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0" \ + "13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70" \ + "98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0" \ + "A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708" \ + "DF1FB2BC2E4A4371" + +#define POLARSSL_DHM_RFC5114_MODP_1024_G \ + "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507F" \ + "D6406CFF14266D31266FEA1E5C41564B777E690F5504F213" \ + "160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1" \ + "909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28A" \ + "D662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24" \ + "855E6EEB22B3B2E5" + +#define POLARSSL_DHM_RFC5114_MODP_2048_P \ + "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ + "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ + "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ + "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ + "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ + "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ + "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ + "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ + "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ + "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ + "CF9DE5384E71B81C0AC4DFFE0C10E64F" + +#define POLARSSL_DHM_RFC5114_MODP_2048_G \ + "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"\ + "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA"\ + "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"\ + "C17669101999024AF4D027275AC1348BB8A762D0521BC98A"\ + "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"\ + "F180EB34118E98D119529A45D6F834566E3025E316A330EF"\ + "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"\ + "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381"\ + "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"\ + "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179"\ + "81BC087F2A7065B384B890D3191F2BFA" + +/** + * \brief DHM context structure + */ +typedef struct +{ + size_t len; /*!< size(P) in chars */ + mpi P; /*!< prime modulus */ + mpi G; /*!< generator */ + mpi X; /*!< secret value */ + mpi GX; /*!< self = G^X mod P */ + mpi GY; /*!< peer = G^Y mod P */ + mpi K; /*!< key = GY^X mod P */ + mpi RP; /*!< cached R^2 mod P */ +} +dhm_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Parse the ServerKeyExchange parameters + * + * \param ctx DHM context + * \param p &(start of input buffer) + * \param end end of buffer + * + * \return 0 if successful, or an POLARSSL_ERR_DHM_XXX error code + */ +int dhm_read_params( dhm_context *ctx, + unsigned char **p, + const unsigned char *end ); + +/** + * \brief Setup and write the ServerKeyExchange parameters + * + * \param ctx DHM context + * \param x_size private value size in bytes + * \param output destination buffer + * \param olen number of chars written + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \note This function assumes that ctx->P and ctx->G + * have already been properly set (for example + * using mpi_read_string or mpi_read_binary). + * + * \return 0 if successful, or an POLARSSL_ERR_DHM_XXX error code + */ +int dhm_make_params( dhm_context *ctx, int x_size, + unsigned char *output, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Import the peer's public value G^Y + * + * \param ctx DHM context + * \param input input buffer + * \param ilen size of buffer + * + * \return 0 if successful, or an POLARSSL_ERR_DHM_XXX error code + */ +int dhm_read_public( dhm_context *ctx, + const unsigned char *input, size_t ilen ); + +/** + * \brief Create own private value X and export G^X + * + * \param ctx DHM context + * \param x_size private value size in bytes + * \param output destination buffer + * \param olen must be equal to ctx->P.len + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \return 0 if successful, or an POLARSSL_ERR_DHM_XXX error code + */ +int dhm_make_public( dhm_context *ctx, int x_size, + unsigned char *output, size_t olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Derive and export the shared secret (G^Y)^X mod P + * + * \param ctx DHM context + * \param output destination buffer + * \param olen number of chars written + * + * \return 0 if successful, or an POLARSSL_ERR_DHM_XXX error code + */ +int dhm_calc_secret( dhm_context *ctx, + unsigned char *output, size_t *olen ); + +/** + * \brief Free the components of a DHM key + */ +void dhm_free( dhm_context *ctx ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int dhm_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/polarssl/include/polarssl/entropy.h b/Externals/polarssl/include/polarssl/entropy.h new file mode 100644 index 0000000000..039f5cd6ba --- /dev/null +++ b/Externals/polarssl/include/polarssl/entropy.h @@ -0,0 +1,153 @@ +/** + * \file entropy.h + * + * \brief Entropy accumulator implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ENTROPY_H +#define POLARSSL_ENTROPY_H + +#include + +#include "config.h" + +#include "sha4.h" +#if defined(POLARSSL_HAVEGE_C) +#include "havege.h" +#endif + +#define POLARSSL_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ +#define POLARSSL_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ +#define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ + +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ +#define ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ +#endif /* !POLARSSL_CONFIG_OPTIONS */ + +#define ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ + +#define ENTROPY_SOURCE_MANUAL ENTROPY_MAX_SOURCES + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Entropy poll callback pointer + * + * \param data Callback-specific data pointer + * \param output Data to fill + * \param len Maximum size to provide + * \param olen The actual amount of bytes put into the buffer (Can be 0) + * + * \return 0 if no critical failures occurred, + * POLARSSL_ERR_ENTROPY_SOURCE_FAILED otherwise + */ +typedef int (*f_source_ptr)(void *, unsigned char *, size_t, size_t *); + +/** + * \brief Entropy source state + */ +typedef struct +{ + f_source_ptr f_source; /**< The entropy source callback */ + void * p_source; /**< The callback data pointer */ + size_t size; /**< Amount received */ + size_t threshold; /**< Minimum level required before release */ +} +source_state; + +/** + * \brief Entropy context structure + */ +typedef struct +{ + sha4_context accumulator; + int source_count; + source_state source[ENTROPY_MAX_SOURCES]; +#if defined(POLARSSL_HAVEGE_C) + havege_state havege_data; +#endif +} +entropy_context; + +/** + * \brief Initialize the context + * + * \param ctx Entropy context to initialize + */ +void entropy_init( entropy_context *ctx ); + +/** + * \brief Adds an entropy source to poll + * + * \param ctx Entropy context + * \param f_source Entropy function + * \param p_source Function data + * \param threshold Minimum required from source before entropy is released + * ( with entropy_func() ) + * + * \return 0 if successful or POLARSSL_ERR_ENTROPY_MAX_SOURCES + */ +int entropy_add_source( entropy_context *ctx, + f_source_ptr f_source, void *p_source, + size_t threshold ); + +/** + * \brief Trigger an extra gather poll for the accumulator + * + * \param ctx Entropy context + * + * \return 0 if successful, or POLARSSL_ERR_ENTROPY_SOURCE_FAILED + */ +int entropy_gather( entropy_context *ctx ); + +/** + * \brief Retrieve entropy from the accumulator (Max ENTROPY_BLOCK_SIZE) + * + * \param data Entropy context + * \param output Buffer to fill + * \param len Length of buffer + * + * \return 0 if successful, or POLARSSL_ERR_ENTROPY_SOURCE_FAILED + */ +int entropy_func( void *data, unsigned char *output, size_t len ); + +/** + * \brief Add data to the accumulator manually + * + * \param ctx Entropy context + * \param data Data to add + * \param len Length of data + * + * \return 0 if successful + */ +int entropy_update_manual( entropy_context *ctx, + const unsigned char *data, size_t len ); + +#ifdef __cplusplus +} +#endif + +#endif /* entropy.h */ diff --git a/Externals/polarssl/include/polarssl/entropy_poll.h b/Externals/polarssl/include/polarssl/entropy_poll.h new file mode 100644 index 0000000000..0116598290 --- /dev/null +++ b/Externals/polarssl/include/polarssl/entropy_poll.h @@ -0,0 +1,75 @@ +/** + * \file entropy_poll.h + * + * \brief Platform-specific and custom entropy polling functions + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ENTROPY_POLL_H +#define POLARSSL_ENTROPY_POLL_H + +#include + +#include "config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Default thresholds for built-in sources + */ +#define ENTROPY_MIN_PLATFORM 128 /**< Minimum for platform source */ +#define ENTROPY_MIN_HAVEGE 128 /**< Minimum for HAVEGE */ +#define ENTROPY_MIN_HARDCLOCK 32 /**< Minimum for hardclock() */ + +#if !defined(POLARSSL_NO_PLATFORM_ENTROPY) +/** + * \brief Platform-specific entropy poll callback + */ +int platform_entropy_poll( void *data, + unsigned char *output, size_t len, size_t *olen ); +#endif + +#if defined(POLARSSL_HAVEGE_C) +/** + * \brief HAVEGE based entropy poll callback + * + * Requires an HAVEGE state as its data pointer. + */ +int havege_poll( void *data, + unsigned char *output, size_t len, size_t *olen ); +#endif + +#if defined(POLARSSL_TIMING_C) +/** + * \brief hardclock-based entropy poll callback + */ +int hardclock_poll( void *data, + unsigned char *output, size_t len, size_t *olen ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* entropy_poll.h */ diff --git a/Externals/polarssl/include/polarssl/error.h b/Externals/polarssl/include/polarssl/error.h new file mode 100644 index 0000000000..94c73a8f2d --- /dev/null +++ b/Externals/polarssl/include/polarssl/error.h @@ -0,0 +1,108 @@ +/** + * \file error.h + * + * \brief Error to string translation + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_ERROR_H +#define POLARSSL_ERROR_H + +#include + +/** + * Error code layout. + * + * Currently we try to keep all error codes within the negative space of 16 + * bytes signed integers to support all platforms (-0x0000 - -0x8000). In + * addition we'd like to give two layers of information on the error if + * possible. + * + * For that purpose the error codes are segmented in the following manner: + * + * 16 bit error code bit-segmentation + * + * 1 bit - Intentionally not used + * 3 bits - High level module ID + * 5 bits - Module-dependent error code + * 6 bits - Low level module errors + * 1 bit - Intentionally not used + * + * Low-level module errors (0x007E-0x0002) + * + * Module Nr Codes assigned + * MPI 7 0x0002-0x0010 + * GCM 2 0x0012-0x0014 + * BLOWFISH 2 0x0016-0x0018 + * AES 2 0x0020-0x0022 + * CAMELLIA 2 0x0024-0x0026 + * XTEA 1 0x0028-0x0028 + * BASE64 2 0x002A-0x002C + * PADLOCK 1 0x0030-0x0030 + * DES 1 0x0032-0x0032 + * CTR_DBRG 3 0x0034-0x003A + * ENTROPY 3 0x003C-0x0040 + * NET 11 0x0042-0x0056 + * ASN1 7 0x0060-0x006C + * MD2 1 0x0070-0x0070 + * MD4 1 0x0072-0x0072 + * MD5 1 0x0074-0x0074 + * SHA1 1 0x0076-0x0076 + * SHA2 1 0x0078-0x0078 + * SHA4 1 0x007A-0x007A + * + * High-level module nr (3 bits - 0x1...-0x8...) + * Name ID Nr of Errors + * PEM 1 9 + * PKCS#12 1 4 (Started from top) + * X509 2 23 + * DHM 3 6 + * PKCS5 3 4 (Started from top) + * RSA 4 9 + * MD 5 4 + * CIPHER 6 5 + * SSL 6 2 (Started from top) + * SSL 7 31 + * + * Module dependent error code (5 bits 0x.08.-0x.F8.) + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Translate a PolarSSL error code into a string representation, + * Result is truncated if necessary and always includes a terminating + * null byte. + * + * \param errnum error code + * \param buffer buffer to place representation in + * \param buflen length of the buffer + */ +void error_strerror( int errnum, char *buffer, size_t buflen ); + +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ diff --git a/Externals/polarssl/include/polarssl/gcm.h b/Externals/polarssl/include/polarssl/gcm.h new file mode 100644 index 0000000000..77baa17565 --- /dev/null +++ b/Externals/polarssl/include/polarssl/gcm.h @@ -0,0 +1,147 @@ +/** + * \file gcm.h + * + * \brief Galois/Counter mode for AES + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_GCM_H +#define POLARSSL_GCM_H + +#include "aes.h" + +#ifdef _MSC_VER +#include +typedef UINT64 uint64_t; +#else +#include +#endif + +#define GCM_ENCRYPT 1 +#define GCM_DECRYPT 0 + +#define POLARSSL_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */ +#define POLARSSL_ERR_GCM_BAD_INPUT -0x0014 /**< Bad input parameters to function. */ + +/** + * \brief GCM context structure + */ +typedef struct { + aes_context aes_ctx; /*!< AES context used */ + uint64_t HL[16]; /*!< Precalculated HTable */ + uint64_t HH[16]; /*!< Precalculated HTable */ +} +gcm_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief GCM initialization (encryption) + * + * \param ctx GCM context to be initialized + * \param key encryption key + * \param keysize must be 128, 192 or 256 + * + * \return 0 if successful, or POLARSSL_ERR_AES_INVALID_KEY_LENGTH + */ +int gcm_init( gcm_context *ctx, const unsigned char *key, unsigned int keysize ); + +/** + * \brief GCM buffer encryption/decryption using AES + * + * \note On encryption, the output buffer can be the same as the input buffer. + * On decryption, the output buffer cannot be the same as input buffer. + * If buffers overlap, the output buffer must trail at least 8 bytes + * behind the input buffer. + * + * \param ctx GCM context + * \param mode GCM_ENCRYPT or GCM_DECRYPT + * \param length length of the input data + * \param iv initialization vector + * \param iv_len length of IV + * \param add additional data + * \param add_len length of additional data + * \param input buffer holding the input data + * \param output buffer for holding the output data + * \param tag_len length of the tag to generate + * \param tag buffer for holding the tag + * + * \return 0 if successful + */ +int gcm_crypt_and_tag( gcm_context *ctx, + int mode, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *input, + unsigned char *output, + size_t tag_len, + unsigned char *tag ); + +/** + * \brief GCM buffer authenticated decryption using AES + * + * \note On decryption, the output buffer cannot be the same as input buffer. + * If buffers overlap, the output buffer must trail at least 8 bytes + * behind the input buffer. + * + * \param ctx GCM context + * \param length length of the input data + * \param iv initialization vector + * \param iv_len length of IV + * \param add additional data + * \param add_len length of additional data + * \param tag buffer holding the tag + * \param tag_len length of the tag + * \param input buffer holding the input data + * \param output buffer for holding the output data + * + * \return 0 if successful and authenticated, + * POLARSSL_ERR_GCM_AUTH_FAILED if tag does not match + */ +int gcm_auth_decrypt( gcm_context *ctx, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *tag, + size_t tag_len, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int gcm_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* gcm.h */ diff --git a/Externals/polarssl/include/polarssl/havege.h b/Externals/polarssl/include/polarssl/havege.h new file mode 100644 index 0000000000..53c4f38cf6 --- /dev/null +++ b/Externals/polarssl/include/polarssl/havege.h @@ -0,0 +1,71 @@ +/** + * \file havege.h + * + * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_HAVEGE_H +#define POLARSSL_HAVEGE_H + +#include + +#define COLLECT_SIZE 1024 + +/** + * \brief HAVEGE state structure + */ +typedef struct +{ + int PT1, PT2, offset[2]; + int pool[COLLECT_SIZE]; + int WALK[8192]; +} +havege_state; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief HAVEGE initialization + * + * \param hs HAVEGE state to be initialized + */ +void havege_init( havege_state *hs ); + +/** + * \brief HAVEGE rand function + * + * \param p_rng A HAVEGE state + * \param output Buffer to fill + * \param len Length of buffer + * + * \return 0 + */ +int havege_random( void *p_rng, unsigned char *output, size_t len ); + +#ifdef __cplusplus +} +#endif + +#endif /* havege.h */ diff --git a/Externals/polarssl/include/polarssl/md.h b/Externals/polarssl/include/polarssl/md.h new file mode 100644 index 0000000000..6a1bdd4113 --- /dev/null +++ b/Externals/polarssl/include/polarssl/md.h @@ -0,0 +1,363 @@ +/** + * \file md.h + * + * \brief Generic message digest wrapper + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_MD_H +#define POLARSSL_MD_H + +#include + +#if defined(_MSC_VER) && !defined(inline) +#define inline _inline +#else +#if defined(__ARMCC_VERSION) && !defined(inline) +#define inline __inline +#endif /* __ARMCC_VERSION */ +#endif /*_MSC_VER */ + +#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ +#define POLARSSL_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ +#define POLARSSL_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ + +typedef enum { + POLARSSL_MD_NONE=0, + POLARSSL_MD_MD2, + POLARSSL_MD_MD4, + POLARSSL_MD_MD5, + POLARSSL_MD_SHA1, + POLARSSL_MD_SHA224, + POLARSSL_MD_SHA256, + POLARSSL_MD_SHA384, + POLARSSL_MD_SHA512, +} md_type_t; + +#define POLARSSL_MD_MAX_SIZE 64 /* longest known is SHA512 */ + +/** + * Message digest information. Allows message digest functions to be called + * in a generic way. + */ +typedef struct { + /** Digest identifier */ + md_type_t type; + + /** Name of the message digest */ + const char * name; + + /** Output length of the digest function */ + int size; + + /** Digest initialisation function */ + void (*starts_func)( void *ctx ); + + /** Digest update function */ + void (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); + + /** Digest finalisation function */ + void (*finish_func)( void *ctx, unsigned char *output ); + + /** Generic digest function */ + void (*digest_func)( const unsigned char *input, size_t ilen, + unsigned char *output ); + + /** Generic file digest function */ + int (*file_func)( const char *path, unsigned char *output ); + + /** HMAC Initialisation function */ + void (*hmac_starts_func)( void *ctx, const unsigned char *key, size_t keylen ); + + /** HMAC update function */ + void (*hmac_update_func)( void *ctx, const unsigned char *input, size_t ilen ); + + /** HMAC finalisation function */ + void (*hmac_finish_func)( void *ctx, unsigned char *output); + + /** HMAC context reset function */ + void (*hmac_reset_func)( void *ctx ); + + /** Generic HMAC function */ + void (*hmac_func)( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ); + + /** Allocate a new context */ + void * (*ctx_alloc_func)( void ); + + /** Free the given context */ + void (*ctx_free_func)( void *ctx ); + +} md_info_t; + +/** + * Generic message digest context. + */ +typedef struct { + /** Information about the associated message digest */ + const md_info_t *md_info; + + /** Digest-specific context */ + void *md_ctx; +} md_context_t; + +#define MD_CONTEXT_T_INIT { \ + NULL, /* md_info */ \ + NULL, /* md_ctx */ \ +} + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Returns the list of digests supported by the generic digest module. + * + * \return a statically allocated array of digests, the last entry + * is 0. + */ +const int *md_list( void ); + +/** + * \brief Returns the message digest information associated with the + * given digest name. + * + * \param md_name Name of the digest to search for. + * + * \return The message digest information associated with md_name or + * NULL if not found. + */ +const md_info_t *md_info_from_string( const char *md_name ); + +/** + * \brief Returns the message digest information associated with the + * given digest type. + * + * \param md_type type of digest to search for. + * + * \return The message digest information associated with md_type or + * NULL if not found. + */ +const md_info_t *md_info_from_type( md_type_t md_type ); + +/** + * \brief Initialises and fills the message digest context structure with + * the appropriate values. + * + * \param ctx context to initialise. May not be NULL. The + * digest-specific context (ctx->md_ctx) must be NULL. It will + * be allocated, and must be freed using md_free_ctx() later. + * \param md_info message digest to use. + * + * \returns \c 0 on success, \c POLARSSL_ERR_MD_BAD_INPUT_DATA on + * parameter failure, \c POLARSSL_ERR_MD_ALLOC_FAILED if + * allocation of the digest-specific context failed. + */ +int md_init_ctx( md_context_t *ctx, const md_info_t *md_info ); + +/** + * \brief Free the message-specific context of ctx. Freeing ctx itself + * remains the responsibility of the caller. + * + * \param ctx Free the message-specific context + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_free_ctx( md_context_t *ctx ); + +/** + * \brief Returns the size of the message digest output. + * + * \param md_info message digest info + * + * \return size of the message digest output. + */ +static inline unsigned char md_get_size( const md_info_t *md_info ) +{ + if( md_info == NULL ) + return( 0 ); + + return md_info->size; +} + +/** + * \brief Returns the type of the message digest output. + * + * \param md_info message digest info + * + * \return type of the message digest output. + */ +static inline md_type_t md_get_type( const md_info_t *md_info ) +{ + if( md_info == NULL ) + return( POLARSSL_MD_NONE ); + + return md_info->type; +} + +/** + * \brief Returns the name of the message digest output. + * + * \param md_info message digest info + * + * \return name of the message digest output. + */ +static inline const char *md_get_name( const md_info_t *md_info ) +{ + if( md_info == NULL ) + return( NULL ); + + return md_info->name; +} + +/** + * \brief Set-up the given context for a new message digest + * + * \param ctx generic message digest context. + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_starts( md_context_t *ctx ); + +/** + * \brief Generic message digest process buffer + * + * \param ctx Generic message digest context + * \param input buffer holding the datal + * \param ilen length of the input data + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief Generic message digest final digest + * + * \param ctx Generic message digest context + * \param output Generic message digest checksum result + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_finish( md_context_t *ctx, unsigned char *output ); + +/** + * \brief Output = message_digest( input buffer ) + * + * \param md_info message digest info + * \param input buffer holding the data + * \param ilen length of the input data + * \param output Generic message digest checksum result + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md( const md_info_t *md_info, const unsigned char *input, size_t ilen, + unsigned char *output ); + +/** + * \brief Output = message_digest( file contents ) + * + * \param md_info message digest info + * \param path input file name + * \param output generic message digest checksum result + * + * \return 0 if successful, POLARSSL_ERR_MD_FILE_OPEN_FAILED if fopen + * failed, POLARSSL_ERR_MD_FILE_READ_FAILED if fread failed, + * POLARSSL_ERR_MD_BAD_INPUT_DATA if md_info was NULL. + */ +int md_file( const md_info_t *md_info, const char *path, unsigned char *output ); + +/** + * \brief Generic HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param key HMAC secret key + * \param keylen length of the HMAC key + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen ); + +/** + * \brief Generic HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief Generic HMAC final digest + * + * \param ctx HMAC context + * \param output Generic HMAC checksum result + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_hmac_finish( md_context_t *ctx, unsigned char *output); + +/** + * \brief Generic HMAC context reset + * + * \param ctx HMAC context to be reset + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_hmac_reset( md_context_t *ctx ); + +/** + * \brief Output = Generic_HMAC( hmac key, input buffer ) + * + * \param md_info message digest info + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output Generic HMAC-result + * + * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter + * verification fails. + */ +int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#endif /* POLARSSL_MD_H */ diff --git a/Externals/polarssl/include/polarssl/md2.h b/Externals/polarssl/include/polarssl/md2.h new file mode 100644 index 0000000000..94f19fce3a --- /dev/null +++ b/Externals/polarssl/include/polarssl/md2.h @@ -0,0 +1,171 @@ +/** + * \file md2.h + * + * \brief MD2 message digest algorithm (hash function) + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_MD2_H +#define POLARSSL_MD2_H + +#include "config.h" + +#include + +#define POLARSSL_ERR_MD2_FILE_IO_ERROR -0x0070 /**< Read/write error in file. */ + +#if !defined(POLARSSL_MD2_ALT) +// Regular implementation +// + +/** + * \brief MD2 context structure + */ +typedef struct +{ + unsigned char cksum[16]; /*!< checksum of the data block */ + unsigned char state[48]; /*!< intermediate digest state */ + unsigned char buffer[16]; /*!< data block being processed */ + + unsigned char ipad[16]; /*!< HMAC: inner padding */ + unsigned char opad[16]; /*!< HMAC: outer padding */ + size_t left; /*!< amount of data in buffer */ +} +md2_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief MD2 context setup + * + * \param ctx context to be initialized + */ +void md2_starts( md2_context *ctx ); + +/** + * \brief MD2 process buffer + * + * \param ctx MD2 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md2_update( md2_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief MD2 final digest + * + * \param ctx MD2 context + * \param output MD2 checksum result + */ +void md2_finish( md2_context *ctx, unsigned char output[16] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_MD2_ALT */ +#include "md2_alt.h" +#endif /* POLARSSL_MD2_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Output = MD2( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD2 checksum result + */ +void md2( const unsigned char *input, size_t ilen, unsigned char output[16] ); + +/** + * \brief Output = MD2( file contents ) + * + * \param path input file name + * \param output MD2 checksum result + * + * \return 0 if successful, or POLARSSL_ERR_MD2_FILE_IO_ERROR + */ +int md2_file( const char *path, unsigned char output[16] ); + +/** + * \brief MD2 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param key HMAC secret key + * \param keylen length of the HMAC key + */ +void md2_hmac_starts( md2_context *ctx, const unsigned char *key, size_t keylen ); + +/** + * \brief MD2 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md2_hmac_update( md2_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief MD2 HMAC final digest + * + * \param ctx HMAC context + * \param output MD2 HMAC checksum result + */ +void md2_hmac_finish( md2_context *ctx, unsigned char output[16] ); + +/** + * \brief MD2 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void md2_hmac_reset( md2_context *ctx ); + +/** + * \brief Output = HMAC-MD2( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-MD2 result + */ +void md2_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[16] ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int md2_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* md2.h */ diff --git a/Externals/polarssl/include/polarssl/md4.h b/Externals/polarssl/include/polarssl/md4.h new file mode 100644 index 0000000000..56fba2fcb7 --- /dev/null +++ b/Externals/polarssl/include/polarssl/md4.h @@ -0,0 +1,177 @@ +/** + * \file md4.h + * + * \brief MD4 message digest algorithm (hash function) + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_MD4_H +#define POLARSSL_MD4_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_MD4_FILE_IO_ERROR -0x0072 /**< Read/write error in file. */ + +#if !defined(POLARSSL_MD4_ALT) +// Regular implementation +// + +/** + * \brief MD4 context structure + */ +typedef struct +{ + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[4]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ + + unsigned char ipad[64]; /*!< HMAC: inner padding */ + unsigned char opad[64]; /*!< HMAC: outer padding */ +} +md4_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief MD4 context setup + * + * \param ctx context to be initialized + */ +void md4_starts( md4_context *ctx ); + +/** + * \brief MD4 process buffer + * + * \param ctx MD4 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md4_update( md4_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief MD4 final digest + * + * \param ctx MD4 context + * \param output MD4 checksum result + */ +void md4_finish( md4_context *ctx, unsigned char output[16] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_MD4_ALT */ +#include "md4_alt.h" +#endif /* POLARSSL_MD4_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Output = MD4( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD4 checksum result + */ +void md4( const unsigned char *input, size_t ilen, unsigned char output[16] ); + +/** + * \brief Output = MD4( file contents ) + * + * \param path input file name + * \param output MD4 checksum result + * + * \return 0 if successful, or POLARSSL_ERR_MD4_FILE_IO_ERROR + */ +int md4_file( const char *path, unsigned char output[16] ); + +/** + * \brief MD4 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param key HMAC secret key + * \param keylen length of the HMAC key + */ +void md4_hmac_starts( md4_context *ctx, const unsigned char *key, size_t keylen ); + +/** + * \brief MD4 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md4_hmac_update( md4_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief MD4 HMAC final digest + * + * \param ctx HMAC context + * \param output MD4 HMAC checksum result + */ +void md4_hmac_finish( md4_context *ctx, unsigned char output[16] ); + +/** + * \brief MD4 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void md4_hmac_reset( md4_context *ctx ); + +/** + * \brief Output = HMAC-MD4( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-MD4 result + */ +void md4_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[16] ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int md4_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* md4.h */ diff --git a/Source/Core/Common/Src/Crypto/md5.h b/Externals/polarssl/include/polarssl/md5.h similarity index 64% rename from Source/Core/Common/Src/Crypto/md5.h rename to Externals/polarssl/include/polarssl/md5.h index a69024d116..c90789d6aa 100644 --- a/Source/Core/Common/Src/Crypto/md5.h +++ b/Externals/polarssl/include/polarssl/md5.h @@ -1,10 +1,14 @@ /** * \file md5.h * - * Copyright (C) 2006-2009, Paul Bakker - * All rights reserved. + * \brief MD5 message digest algorithm (hash function) * - * Joined copyright on original XySSL code with: Christophe Devine + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,13 +27,30 @@ #ifndef POLARSSL_MD5_H #define POLARSSL_MD5_H +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_MD5_FILE_IO_ERROR -0x0074 /**< Read/write error in file. */ + +#if !defined(POLARSSL_MD5_ALT) +// Regular implementation +// + /** * \brief MD5 context structure */ typedef struct { - unsigned long total[2]; /*!< number of bytes processed */ - unsigned long state[4]; /*!< intermediate digest state */ + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[4]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ unsigned char ipad[64]; /*!< HMAC: inner padding */ @@ -55,7 +76,7 @@ void md5_starts( md5_context *ctx ); * \param input buffer holding the data * \param ilen length of the input data */ -void md5_update( md5_context *ctx, unsigned char *input, int ilen ); +void md5_update( md5_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD5 final digest @@ -65,6 +86,21 @@ void md5_update( md5_context *ctx, unsigned char *input, int ilen ); */ void md5_finish( md5_context *ctx, unsigned char output[16] ); +/* Internal use */ +void md5_process( md5_context *ctx, const unsigned char data[64] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_MD5_ALT */ +#include "md5_alt.h" +#endif /* POLARSSL_MD5_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + /** * \brief Output = MD5( input buffer ) * @@ -72,7 +108,7 @@ void md5_finish( md5_context *ctx, unsigned char output[16] ); * \param ilen length of the input data * \param output MD5 checksum result */ -void md5( unsigned char *input, int ilen, unsigned char output[16] ); +void md5( const unsigned char *input, size_t ilen, unsigned char output[16] ); /** * \brief Output = MD5( file contents ) @@ -80,10 +116,9 @@ void md5( unsigned char *input, int ilen, unsigned char output[16] ); * \param path input file name * \param output MD5 checksum result * - * \return 0 if successful, 1 if fopen failed, - * or 2 if fread failed + * \return 0 if successful, or POLARSSL_ERR_MD5_FILE_IO_ERROR */ -int md5_file( char *path, unsigned char output[16] ); +int md5_file( const char *path, unsigned char output[16] ); /** * \brief MD5 HMAC context setup @@ -92,7 +127,8 @@ int md5_file( char *path, unsigned char output[16] ); * \param key HMAC secret key * \param keylen length of the HMAC key */ -void md5_hmac_starts( md5_context *ctx, unsigned char *key, int keylen ); +void md5_hmac_starts( md5_context *ctx, + const unsigned char *key, size_t keylen ); /** * \brief MD5 HMAC process buffer @@ -101,7 +137,8 @@ void md5_hmac_starts( md5_context *ctx, unsigned char *key, int keylen ); * \param input buffer holding the data * \param ilen length of the input data */ -void md5_hmac_update( md5_context *ctx, unsigned char *input, int ilen ); +void md5_hmac_update( md5_context *ctx, + const unsigned char *input, size_t ilen ); /** * \brief MD5 HMAC final digest @@ -111,6 +148,13 @@ void md5_hmac_update( md5_context *ctx, unsigned char *input, int ilen ); */ void md5_hmac_finish( md5_context *ctx, unsigned char output[16] ); +/** + * \brief MD5 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void md5_hmac_reset( md5_context *ctx ); + /** * \brief Output = HMAC-MD5( hmac key, input buffer ) * @@ -120,8 +164,8 @@ void md5_hmac_finish( md5_context *ctx, unsigned char output[16] ); * \param ilen length of the input data * \param output HMAC-MD5 result */ -void md5_hmac( unsigned char *key, int keylen, - unsigned char *input, int ilen, +void md5_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, unsigned char output[16] ); /** diff --git a/Externals/polarssl/include/polarssl/md_wrap.h b/Externals/polarssl/include/polarssl/md_wrap.h new file mode 100644 index 0000000000..46849d0334 --- /dev/null +++ b/Externals/polarssl/include/polarssl/md_wrap.h @@ -0,0 +1,64 @@ +/** + * \file md_wrap.h + * + * \brief Message digest wrappers. + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_MD_WRAP_H +#define POLARSSL_MD_WRAP_H + +#include "config.h" +#include "md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(POLARSSL_MD2_C) +extern const md_info_t md2_info; +#endif +#if defined(POLARSSL_MD4_C) +extern const md_info_t md4_info; +#endif +#if defined(POLARSSL_MD5_C) +extern const md_info_t md5_info; +#endif +#if defined(POLARSSL_SHA1_C) +extern const md_info_t sha1_info; +#endif +#if defined(POLARSSL_SHA2_C) +extern const md_info_t sha224_info; +extern const md_info_t sha256_info; +#endif +#if defined(POLARSSL_SHA4_C) +extern const md_info_t sha384_info; +extern const md_info_t sha512_info; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* POLARSSL_MD_WRAP_H */ diff --git a/Externals/polarssl/include/polarssl/net.h b/Externals/polarssl/include/polarssl/net.h new file mode 100644 index 0000000000..88302ac0a7 --- /dev/null +++ b/Externals/polarssl/include/polarssl/net.h @@ -0,0 +1,159 @@ +/** + * \file net.h + * + * \brief Network communication functions + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_NET_H +#define POLARSSL_NET_H + +#include + +#define POLARSSL_ERR_NET_UNKNOWN_HOST -0x0056 /**< Failed to get an IP address for the given hostname. */ +#define POLARSSL_ERR_NET_SOCKET_FAILED -0x0042 /**< Failed to open a socket. */ +#define POLARSSL_ERR_NET_CONNECT_FAILED -0x0044 /**< The connection to the given server / port failed. */ +#define POLARSSL_ERR_NET_BIND_FAILED -0x0046 /**< Binding of the socket failed. */ +#define POLARSSL_ERR_NET_LISTEN_FAILED -0x0048 /**< Could not listen on the socket. */ +#define POLARSSL_ERR_NET_ACCEPT_FAILED -0x004A /**< Could not accept the incoming connection. */ +#define POLARSSL_ERR_NET_RECV_FAILED -0x004C /**< Reading information from the socket failed. */ +#define POLARSSL_ERR_NET_SEND_FAILED -0x004E /**< Sending information through the socket failed. */ +#define POLARSSL_ERR_NET_CONN_RESET -0x0050 /**< Connection was reset by peer. */ +#define POLARSSL_ERR_NET_WANT_READ -0x0052 /**< Connection requires a read call. */ +#define POLARSSL_ERR_NET_WANT_WRITE -0x0054 /**< Connection requires a write call. */ + +#define POLARSSL_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initiate a TCP connection with host:port + * + * \param fd Socket to use + * \param host Host to connect to + * \param port Port to connect to + * + * \return 0 if successful, or one of: + * POLARSSL_ERR_NET_SOCKET_FAILED, + * POLARSSL_ERR_NET_UNKNOWN_HOST, + * POLARSSL_ERR_NET_CONNECT_FAILED + */ +int net_connect( int *fd, const char *host, int port ); + +/** + * \brief Create a listening socket on bind_ip:port. + * If bind_ip == NULL, all interfaces are binded. + * + * \param fd Socket to use + * \param bind_ip IP to bind to, can be NULL + * \param port Port number to use + * + * \return 0 if successful, or one of: + * POLARSSL_ERR_NET_SOCKET_FAILED, + * POLARSSL_ERR_NET_BIND_FAILED, + * POLARSSL_ERR_NET_LISTEN_FAILED + */ +int net_bind( int *fd, const char *bind_ip, int port ); + +/** + * \brief Accept a connection from a remote client + * + * \param bind_fd Relevant socket + * \param client_fd Will contain the connected client socket + * \param client_ip Will contain the client IP address + * + * \return 0 if successful, POLARSSL_ERR_NET_ACCEPT_FAILED, or + * POLARSSL_ERR_NET_WOULD_BLOCK is bind_fd was set to + * non-blocking and accept() is blocking. + */ +int net_accept( int bind_fd, int *client_fd, void *client_ip ); + +/** + * \brief Set the socket blocking + * + * \param fd Socket to set + * + * \return 0 if successful, or a non-zero error code + */ +int net_set_block( int fd ); + +/** + * \brief Set the socket non-blocking + * + * \param fd Socket to set + * + * \return 0 if successful, or a non-zero error code + */ +int net_set_nonblock( int fd ); + +/** + * \brief Portable usleep helper + * + * \param usec Amount of microseconds to sleep + * + * \note Real amount of time slept will not be less than + * select()'s timeout granularity (typically, 10ms). + */ +void net_usleep( unsigned long usec ); + +/** + * \brief Read at most 'len' characters. If no error occurs, + * the actual amount read is returned. + * + * \param ctx Socket + * \param buf The buffer to write to + * \param len Maximum length of the buffer + * + * \return This function returns the number of bytes received, + * or a non-zero error code; POLARSSL_ERR_NET_WANT_READ + * indicates read() is blocking. + */ +int net_recv( void *ctx, unsigned char *buf, size_t len ); + +/** + * \brief Write at most 'len' characters. If no error occurs, + * the actual amount read is returned. + * + * \param ctx Socket + * \param buf The buffer to read from + * \param len The length of the buffer + * + * \return This function returns the number of bytes sent, + * or a non-zero error code; POLARSSL_ERR_NET_WANT_WRITE + * indicates write() is blocking. + */ +int net_send( void *ctx, const unsigned char *buf, size_t len ); + +/** + * \brief Gracefully shutdown the connection + * + * \param fd The socket to close + */ +void net_close( int fd ); + +#ifdef __cplusplus +} +#endif + +#endif /* net.h */ diff --git a/Externals/polarssl/include/polarssl/openssl.h b/Externals/polarssl/include/polarssl/openssl.h new file mode 100644 index 0000000000..62609a2973 --- /dev/null +++ b/Externals/polarssl/include/polarssl/openssl.h @@ -0,0 +1,136 @@ +/** + * \file openssl.h + * + * \brief OpenSSL wrapper (definitions, inline functions). + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * OpenSSL wrapper contributed by David Barett + */ +#ifndef POLARSSL_OPENSSL_H +#define POLARSSL_OPENSSL_H + +#include "aes.h" +#include "md5.h" +#include "rsa.h" +#include "sha1.h" + +#define AES_SIZE 16 +#define AES_BLOCK_SIZE 16 +#define AES_KEY aes_context +#define MD5_CTX md5_context +#define SHA_CTX sha1_context + +#define SHA1_Init( CTX ) \ + sha1_starts( (CTX) ) +#define SHA1_Update( CTX, BUF, LEN ) \ + sha1_update( (CTX), (unsigned char *)(BUF), (LEN) ) +#define SHA1_Final( OUT, CTX ) \ + sha1_finish( (CTX), (OUT) ) + +#define MD5_Init( CTX ) \ + md5_starts( (CTX) ) +#define MD5_Update( CTX, BUF, LEN ) \ + md5_update( (CTX), (unsigned char *)(BUF), (LEN) ) +#define MD5_Final( OUT, CTX ) \ + md5_finish( (CTX), (OUT) ) + +#define AES_set_encrypt_key( KEY, KEYSIZE, CTX ) \ + aes_setkey_enc( (CTX), (KEY), (KEYSIZE) ) +#define AES_set_decrypt_key( KEY, KEYSIZE, CTX ) \ + aes_setkey_dec( (CTX), (KEY), (KEYSIZE) ) +#define AES_cbc_encrypt( INPUT, OUTPUT, LEN, CTX, IV, MODE ) \ + aes_crypt_cbc( (CTX), (MODE), (LEN), (IV), (INPUT), (OUTPUT) ) + +/* + * RSA stuff follows. TODO: needs cleanup + */ +inline int __RSA_Passthrough( void *output, void *input, int size ) +{ + memcpy( output, input, size ); + return size; +} + +inline rsa_context* d2i_RSA_PUBKEY( void *ignore, unsigned char **bufptr, + int len ) +{ + unsigned char *buffer = *(unsigned char **) bufptr; + rsa_context *rsa; + + /* + * Not a general-purpose parser: only parses public key from *exactly* + * openssl genrsa -out privkey.pem 512 (or 1024) + * openssl rsa -in privkey.pem -out privatekey.der -outform der + * openssl rsa -in privkey.pem -out pubkey.der -outform der -pubout + * + * TODO: make a general-purpose parse + */ + if( ignore != 0 || ( len != 94 && len != 162 ) ) + return( 0 ); + + rsa = (rsa_context *) malloc( sizeof( rsa_rsa ) ); + if( rsa == NULL ) + return( 0 ); + + memset( rsa, 0, sizeof( rsa_context ) ); + + if( ( len == 94 && + mpi_read_binary( &rsa->N, &buffer[ 25], 64 ) == 0 && + mpi_read_binary( &rsa->E, &buffer[ 91], 3 ) == 0 ) || + ( len == 162 && + mpi_read_binary( &rsa->N, &buffer[ 29], 128 ) == 0 ) && + mpi_read_binary( &rsa->E, &buffer[159], 3 ) == 0 ) + { + /* + * key read successfully + */ + rsa->len = ( mpi_msb( &rsa->N ) + 7 ) >> 3; + return( rsa ); + } + else + { + memset( rsa, 0, sizeof( rsa_context ) ); + free( rsa ); + return( 0 ); + } +} + +#define RSA rsa_context +#define RSA_PKCS1_PADDING 1 /* ignored; always encrypt with this */ +#define RSA_size( CTX ) (CTX)->len +#define RSA_free( CTX ) rsa_free( CTX ) +#define ERR_get_error( ) "ERR_get_error() not supported" +#define RSA_blinding_off( IGNORE ) + +#define d2i_RSAPrivateKey( a, b, c ) new rsa_context /* TODO: C++ bleh */ + +inline int RSA_public_decrypt ( int size, unsigned char* input, unsigned char* output, RSA* key, int ignore ) { int outsize=size; if( !rsa_pkcs1_decrypt( key, RSA_PUBLIC, &outsize, input, output ) ) return outsize; else return -1; } +inline int RSA_private_decrypt( int size, unsigned char* input, unsigned char* output, RSA* key, int ignore ) { int outsize=size; if( !rsa_pkcs1_decrypt( key, RSA_PRIVATE, &outsize, input, output ) ) return outsize; else return -1; } +inline int RSA_public_encrypt ( int size, unsigned char* input, unsigned char* output, RSA* key, int ignore ) { if( !rsa_pkcs1_encrypt( key, RSA_PUBLIC, size, input, output ) ) return RSA_size(key); else return -1; } +inline int RSA_private_encrypt( int size, unsigned char* input, unsigned char* output, RSA* key, int ignore ) { if( !rsa_pkcs1_encrypt( key, RSA_PRIVATE, size, input, output ) ) return RSA_size(key); else return -1; } + +#ifdef __cplusplus +} +#endif + +#endif /* openssl.h */ diff --git a/Externals/polarssl/include/polarssl/padlock.h b/Externals/polarssl/include/polarssl/padlock.h new file mode 100644 index 0000000000..9df75cc7dd --- /dev/null +++ b/Externals/polarssl/include/polarssl/padlock.h @@ -0,0 +1,108 @@ +/** + * \file padlock.h + * + * \brief VIA PadLock ACE for HW encryption/decryption supported by some processors + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PADLOCK_H +#define POLARSSL_PADLOCK_H + +#include "aes.h" + +#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ + +#if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) + +#ifndef POLARSSL_HAVE_X86 +#define POLARSSL_HAVE_X86 +#endif + +#ifdef _MSC_VER +#include +typedef INT32 int32_t; +#else +#include +#endif + + +#define PADLOCK_RNG 0x000C +#define PADLOCK_ACE 0x00C0 +#define PADLOCK_PHE 0x0C00 +#define PADLOCK_PMM 0x3000 + +#define PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PadLock detection routine + * + * \param The feature to detect + * + * \return 1 if CPU has support for the feature, 0 otherwise + */ +int padlock_supports( int feature ); + +/** + * \brief PadLock AES-ECB block en(de)cryption + * + * \param ctx AES context + * \param mode AES_ENCRYPT or AES_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 if success, 1 if operation failed + */ +int padlock_xcryptecb( aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ); + +/** + * \brief PadLock AES-CBC buffer en(de)cryption + * + * \param ctx AES context + * \param mode AES_ENCRYPT or AES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if success, 1 if operation failed + */ +int padlock_xcryptcbc( aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ); + +#ifdef __cplusplus +} +#endif + +#endif /* HAVE_X86 */ + +#endif /* padlock.h */ diff --git a/Externals/polarssl/include/polarssl/pbkdf2.h b/Externals/polarssl/include/polarssl/pbkdf2.h new file mode 100644 index 0000000000..e2e61b5f1d --- /dev/null +++ b/Externals/polarssl/include/polarssl/pbkdf2.h @@ -0,0 +1,82 @@ +/** + * \file pbkdf2.h + * + * \brief Password-Based Key Derivation Function 2 (from PKCS#5) + * DEPRECATED: use pkcs5.h instead. + * + * \author Mathias Olsson + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PBKDF2_H +#define POLARSSL_PBKDF2_H + +#include + +#include "md.h" + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_PBKDF2_BAD_INPUT_DATA -0x007C /**< Bad input parameters to function. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PKCS#5 PBKDF2 using HMAC + * DEPRECATED: Use pkcs5_pbkdf2_hmac() instead! + * + * \param ctx Generic HMAC context + * \param password Password to use when generating key + * \param plen Length of password + * \param salt Salt to use when generating key + * \param slen Length of salt + * \param iteration_count Iteration count + * \param key_length Length of generated key + * \param output Generated key. Must be at least as big as key_length + * + * \returns 0 on success, or a PolarSSL error code if verification fails. + */ +int pbkdf2_hmac( md_context_t *ctx, const unsigned char *password, + size_t plen, const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output ); + +/** + * \brief Checkup routine + * DEPRECATED: Use pkcs5_self_test() instead! + * + * \return 0 if successful, or 1 if the test failed + */ +int pbkdf2_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* pbkdf2.h */ diff --git a/Externals/polarssl/include/polarssl/pem.h b/Externals/polarssl/include/polarssl/pem.h new file mode 100644 index 0000000000..e95dc10a0b --- /dev/null +++ b/Externals/polarssl/include/polarssl/pem.h @@ -0,0 +1,105 @@ +/** + * \file pem.h + * + * \brief Privacy Enhanced Mail (PEM) decoding + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PEM_H +#define POLARSSL_PEM_H + +#include + +/** + * \name PEM Error codes + * These error codes are returned in case of errors reading the + * PEM data. + * \{ + */ +#define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 /**< No PEM header or footer found. */ +#define POLARSSL_ERR_PEM_INVALID_DATA -0x1100 /**< PEM string is not as expected. */ +#define POLARSSL_ERR_PEM_MALLOC_FAILED -0x1180 /**< Failed to allocate memory. */ +#define POLARSSL_ERR_PEM_INVALID_ENC_IV -0x1200 /**< RSA IV is not in hex-format. */ +#define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 /**< Unsupported key encryption algorithm. */ +#define POLARSSL_ERR_PEM_PASSWORD_REQUIRED -0x1300 /**< Private key password can't be empty. */ +#define POLARSSL_ERR_PEM_PASSWORD_MISMATCH -0x1380 /**< Given private key password does not allow for correct decryption. */ +#define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 /**< Unavailable feature, e.g. hashing/encryption combination. */ +#define POLARSSL_ERR_PEM_BAD_INPUT_DATA -0x1480 /**< Bad input parameters to function. */ +/* \} name */ + +/** + * \brief PEM context structure + */ +typedef struct +{ + unsigned char *buf; /*!< buffer for decoded data */ + size_t buflen; /*!< length of the buffer */ + unsigned char *info; /*!< buffer for extra header information */ +} +pem_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PEM context setup + * + * \param ctx context to be initialized + */ +void pem_init( pem_context *ctx ); + +/** + * \brief Read a buffer for PEM information and store the resulting + * data into the specified context buffers. + * + * \param ctx context to use + * \param header header string to seek and expect + * \param footer footer string to seek and expect + * \param data source data to look in + * \param pwd password for decryption (can be NULL) + * \param pwdlen length of password + * \param use_len destination for total length used (set after header is + * correctly read, so unless you get + * POLARSSL_ERR_PEM_BAD_INPUT_DATA or + * POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is + * the length to skip) + * + * \return 0 on success, ior a specific PEM error code + */ +int pem_read_buffer( pem_context *ctx, char *header, char *footer, + const unsigned char *data, + const unsigned char *pwd, + size_t pwdlen, size_t *use_len ); + +/** + * \brief PEM context memory freeing + * + * \param ctx context to be freed + */ +void pem_free( pem_context *ctx ); + +#ifdef __cplusplus +} +#endif + +#endif /* pem.h */ diff --git a/Externals/polarssl/include/polarssl/pkcs11.h b/Externals/polarssl/include/polarssl/pkcs11.h new file mode 100644 index 0000000000..003d3f52df --- /dev/null +++ b/Externals/polarssl/include/polarssl/pkcs11.h @@ -0,0 +1,161 @@ +/** + * \file pkcs11.h + * + * \brief Wrapper for PKCS#11 library libpkcs11-helper + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PKCS11_H +#define POLARSSL_PKCS11_H + +#include "config.h" + +#if defined(POLARSSL_PKCS11_C) + +#include "x509.h" + +#include + +#if defined(_MSC_VER) && !defined(inline) +#define inline _inline +#else +#if defined(__ARMCC_VERSION) && !defined(inline) +#define inline __inline +#endif /* __ARMCC_VERSION */ +#endif /*_MSC_VER */ + +/** + * Context for PKCS #11 private keys. + */ +typedef struct { + pkcs11h_certificate_t pkcs11h_cert; + int len; +} pkcs11_context; + +/** + * Fill in a PolarSSL certificate, based on the given PKCS11 helper certificate. + * + * \param cert X.509 certificate to fill + * \param pkcs11h_cert PKCS #11 helper certificate + * + * \return 0 on success. + */ +int pkcs11_x509_cert_init( x509_cert *cert, pkcs11h_certificate_t pkcs11h_cert ); + +/** + * Initialise a pkcs11_context, storing the given certificate. Note that the + * pkcs11_context will take over control of the certificate, freeing it when + * done. + * + * \param priv_key Private key structure to fill. + * \param pkcs11_cert PKCS #11 helper certificate + * + * \return 0 on success + */ +int pkcs11_priv_key_init( pkcs11_context *priv_key, + pkcs11h_certificate_t pkcs11_cert ); + +/** + * Free the contents of the given private key context. Note that the structure + * itself is not freed. + * + * \param priv_key Private key structure to cleanup + */ +void pkcs11_priv_key_free( pkcs11_context *priv_key ); + +/** + * \brief Do an RSA private key decrypt, then remove the message padding + * + * \param ctx PKCS #11 context + * \param mode must be RSA_PRIVATE, for compatibility with rsa.c's signature + * \param input buffer holding the encrypted data + * \param output buffer that will hold the plaintext + * \param olen will contain the plaintext length + * \param output_max_len maximum length of the output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise + * an error is thrown. + */ +int pkcs11_decrypt( pkcs11_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ); + +/** + * \brief Do a private RSA to sign a message digest + * + * \param ctx PKCS #11 context + * \param mode must be RSA_PRIVATE, for compatibility with rsa.c's signature + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer that will hold the ciphertext + * + * \return 0 if the signing operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int pkcs11_sign( pkcs11_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * SSL/TLS wrappers for PKCS#11 functions + */ +static inline int ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len ) +{ + return pkcs11_decrypt( (pkcs11_context *) ctx, mode, olen, input, output, + output_max_len ); +} + +static inline int ssl_pkcs11_sign( void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + int mode, int hash_id, unsigned int hashlen, + const unsigned char *hash, unsigned char *sig ) +{ + ((void) f_rng); + ((void) p_rng); + return pkcs11_sign( (pkcs11_context *) ctx, mode, hash_id, + hashlen, hash, sig ); +} + +static inline size_t ssl_pkcs11_key_len( void *ctx ) +{ + return ( (pkcs11_context *) ctx )->len; +} + +#endif /* POLARSSL_PKCS11_C */ + +#endif /* POLARSSL_PKCS11_H */ diff --git a/Externals/polarssl/include/polarssl/pkcs12.h b/Externals/polarssl/include/polarssl/pkcs12.h new file mode 100644 index 0000000000..9a4577173e --- /dev/null +++ b/Externals/polarssl/include/polarssl/pkcs12.h @@ -0,0 +1,131 @@ +/** + * \file pkcs12.h + * + * \brief PKCS#12 Personal Information Exchange Syntax + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PKCS12_H +#define POLARSSL_PKCS12_H + +#include + +#include "md.h" +#include "cipher.h" +#include "asn1.h" + +#define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 /**< Feature not available, e.g. unsupported encryption scheme. */ +#define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 /**< PBE ASN.1 data not as expected. */ +#define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 /**< Given private key password does not allow for correct decryption. */ + +#define PKCS12_DERIVE_KEY 1 /*< encryption/decryption key */ +#define PKCS12_DERIVE_IV 2 /*< initialization vector */ +#define PKCS12_DERIVE_MAC_KEY 3 /*< integrity / MAC key */ + +#define PKCS12_PBE_DECRYPT 0 +#define PKCS12_PBE_ENCRYPT 1 + +/* + * PKCS#12 PBE types + */ +#define OID_PKCS12 "\x2a\x86\x48\x86\xf7\x0d\x01\x0c" +#define OID_PKCS12_PBE_SHA1_RC4_128 OID_PKCS12 "\x01\x01" +#define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC OID_PKCS12 "\x01\x03" +#define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC OID_PKCS12 "\x01\x04" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PKCS12 Password Based function (encryption / decryption) + * for pbeWithSHAAnd128BitRC4 + * + * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure + * \param mode either PKCS12_PBE_ENCRYPT or PKCS12_PBE_DECRYPT + * \param pwd the password used (may be NULL if no password is used) + * \param pwdlen length of the password (may be 0) + * \param input the input data + * \param len data length + * \param output the output buffer + * + * \return 0 if successful, or a PolarSSL error code + */ +int pkcs12_pbe_sha1_rc4_128( asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *input, size_t len, + unsigned char *output ); + +/** + * \brief PKCS12 Password Based function (encryption / decryption) + * for cipher-based and md-based PBE's + * + * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure + * \param mode either PKCS12_PBE_ENCRYPT or PKCS12_PBE_DECRYPT + * \param cipher_type the cipher used + * \param md_type the md used + * \param pwd the password used (may be NULL if no password is used) + * \param pwdlen length of the password (may be 0) + * \param input the input data + * \param len data length + * \param output the output buffer + * + * \return 0 if successful, or a PolarSSL error code + */ +int pkcs12_pbe( asn1_buf *pbe_params, int mode, + cipher_type_t cipher_type, md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *input, size_t len, + unsigned char *output ); + +/** + * \brief The PKCS#12 derivation function uses a password and a salt + * to produce pseudo-random bits for a particular "purpose". + * + * Depending on the given id, this function can produce an + * encryption/decryption key, an nitialization vector or an + * integrity key. + * + * \param data buffer to store the derived data in + * \param datalen length to fill + * \param pwd password to use (may be NULL if no password is used) + * \param pwdlen length of the password (may be 0) + * \param salt salt buffer to use + * \param saltlen length of the salt + * \param md md type to use during the derivation + * \param id id that describes the purpose (can be PKCS12_DERIVE_KEY, + * PKCS12_DERIVE_IV or PKCS12_DERIVE_MAC_KEY) + * \param iterations number of iterations + * + * \return 0 if successful, or a MD, BIGNUM type error. + */ +int pkcs12_derivation( unsigned char *data, size_t datalen, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *salt, size_t saltlen, + md_type_t md, int id, int iterations ); + +#ifdef __cplusplus +} +#endif + +#endif /* pkcs12.h */ diff --git a/Externals/polarssl/include/polarssl/pkcs5.h b/Externals/polarssl/include/polarssl/pkcs5.h new file mode 100644 index 0000000000..b8c742e97c --- /dev/null +++ b/Externals/polarssl/include/polarssl/pkcs5.h @@ -0,0 +1,122 @@ +/** + * \file pkcs#5.h + * + * \brief PKCS#5 functions + * + * \author Mathias Olsson + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_PKCS5_H +#define POLARSSL_PKCS5_H + +#include + +#include "asn1.h" +#include "md.h" + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA -0x3f80 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_PKCS5_INVALID_FORMAT -0x3f00 /**< Unexpected ASN.1 data. */ +#define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE -0x3e80 /**< Requested encryption or digest alg not available. */ +#define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH -0x3e00 /**< Given private key password does not allow for correct decryption. */ + +#define PKCS5_DECRYPT 0 +#define PKCS5_ENCRYPT 1 + +/* + * PKCS#5 OIDs + */ +#define OID_PKCS5 "\x2a\x86\x48\x86\xf7\x0d\x01\x05" +#define OID_PKCS5_PBES2 OID_PKCS5 "\x0d" +#define OID_PKCS5_PBKDF2 OID_PKCS5 "\x0c" + +/* + * Encryption Algorithm OIDs + */ +#define OID_DES_CBC "\x2b\x0e\x03\x02\x07" +#define OID_DES_EDE3_CBC "\x2a\x86\x48\x86\xf7\x0d\x03\x07" + +/* + * Digest Algorithm OIDs + */ +#define OID_HMAC_SHA1 "\x2a\x86\x48\x86\xf7\x0d\x02\x07" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PKCS#5 PBES2 function + * + * \param pbe_params the ASN.1 algorithm parameters + * \param mode either PKCS5_DECRYPT or PKCS5_ENCRYPT + * \param pwd password to use when generating key + * \param plen length of password + * \param data data to process + * \param datalen length of data + * \param output output buffer + * + * \returns 0 on success, or a PolarSSL error code if verification fails. + */ +int pkcs5_pbes2( asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output ); + +/** + * \brief PKCS#5 PBKDF2 using HMAC + * + * \param ctx Generic HMAC context + * \param password Password to use when generating key + * \param plen Length of password + * \param salt Salt to use when generating key + * \param slen Length of salt + * \param iteration_count Iteration count + * \param key_length Length of generated key + * \param output Generated key. Must be at least as big as key_length + * + * \returns 0 on success, or a PolarSSL error code if verification fails. + */ +int pkcs5_pbkdf2_hmac( md_context_t *ctx, const unsigned char *password, + size_t plen, const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int pkcs5_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* pkcs5.h */ diff --git a/Externals/polarssl/include/polarssl/rsa.h b/Externals/polarssl/include/polarssl/rsa.h new file mode 100644 index 0000000000..f9a022026d --- /dev/null +++ b/Externals/polarssl/include/polarssl/rsa.h @@ -0,0 +1,597 @@ +/** + * \file rsa.h + * + * \brief The RSA public-key cryptosystem + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_RSA_H +#define POLARSSL_RSA_H + +#include "bignum.h" + +/* + * RSA Error codes + */ +#define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x4080 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_RSA_INVALID_PADDING -0x4100 /**< Input data contains invalid padding and is rejected. */ +#define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x4180 /**< Something failed during generation of a key. */ +#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x4200 /**< Key failed to pass the libraries validity check. */ +#define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x4280 /**< The public key operation failed. */ +#define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x4300 /**< The private key operation failed. */ +#define POLARSSL_ERR_RSA_VERIFY_FAILED -0x4380 /**< The PKCS#1 verification failed. */ +#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 /**< The output buffer for decryption is not large enough. */ +#define POLARSSL_ERR_RSA_RNG_FAILED -0x4480 /**< The random generator failed to generate non-zeros. */ + +/* + * PKCS#1 constants + */ +#define SIG_RSA_RAW 0 +#define SIG_RSA_MD2 2 +#define SIG_RSA_MD4 3 +#define SIG_RSA_MD5 4 +#define SIG_RSA_SHA1 5 +#define SIG_RSA_SHA224 14 +#define SIG_RSA_SHA256 11 +#define SIG_RSA_SHA384 12 +#define SIG_RSA_SHA512 13 + +#define RSA_PUBLIC 0 +#define RSA_PRIVATE 1 + +#define RSA_PKCS_V15 0 +#define RSA_PKCS_V21 1 + +#define RSA_SIGN 1 +#define RSA_CRYPT 2 + +#define ASN1_STR_CONSTRUCTED_SEQUENCE "\x30" +#define ASN1_STR_NULL "\x05" +#define ASN1_STR_OID "\x06" +#define ASN1_STR_OCTET_STRING "\x04" + +#define OID_DIGEST_ALG_MDX "\x2A\x86\x48\x86\xF7\x0D\x02\x00" +#define OID_HASH_ALG_SHA1 "\x2b\x0e\x03\x02\x1a" +#define OID_HASH_ALG_SHA2X "\x60\x86\x48\x01\x65\x03\x04\x02\x00" + +#define OID_ISO_MEMBER_BODIES "\x2a" +#define OID_ISO_IDENTIFIED_ORG "\x2b" + +/* + * ISO Member bodies OID parts + */ +#define OID_COUNTRY_US "\x86\x48" +#define OID_RSA_DATA_SECURITY "\x86\xf7\x0d" + +/* + * ISO Identified organization OID parts + */ +#define OID_OIW_SECSIG_SHA1 "\x0e\x03\x02\x1a" + +/* + * DigestInfo ::= SEQUENCE { + * digestAlgorithm DigestAlgorithmIdentifier, + * digest Digest } + * + * DigestAlgorithmIdentifier ::= AlgorithmIdentifier + * + * Digest ::= OCTET STRING + */ +#define ASN1_HASH_MDX \ +( \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x20" \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x0C" \ + ASN1_STR_OID "\x08" \ + OID_DIGEST_ALG_MDX \ + ASN1_STR_NULL "\x00" \ + ASN1_STR_OCTET_STRING "\x10" \ +) + +#define ASN1_HASH_SHA1 \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x21" \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x09" \ + ASN1_STR_OID "\x05" \ + OID_HASH_ALG_SHA1 \ + ASN1_STR_NULL "\x00" \ + ASN1_STR_OCTET_STRING "\x14" + +#define ASN1_HASH_SHA1_ALT \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x1F" \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x07" \ + ASN1_STR_OID "\x05" \ + OID_HASH_ALG_SHA1 \ + ASN1_STR_OCTET_STRING "\x14" + +#define ASN1_HASH_SHA2X \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x11" \ + ASN1_STR_CONSTRUCTED_SEQUENCE "\x0d" \ + ASN1_STR_OID "\x09" \ + OID_HASH_ALG_SHA2X \ + ASN1_STR_NULL "\x00" \ + ASN1_STR_OCTET_STRING "\x00" + +/** + * \brief RSA context structure + */ +typedef struct +{ + int ver; /*!< always 0 */ + size_t len; /*!< size(N) in chars */ + + mpi N; /*!< public modulus */ + mpi E; /*!< public exponent */ + + mpi D; /*!< private exponent */ + mpi P; /*!< 1st prime factor */ + mpi Q; /*!< 2nd prime factor */ + mpi DP; /*!< D % (P - 1) */ + mpi DQ; /*!< D % (Q - 1) */ + mpi QP; /*!< 1 / (Q % P) */ + + mpi RN; /*!< cached R^2 mod N */ + mpi RP; /*!< cached R^2 mod P */ + mpi RQ; /*!< cached R^2 mod Q */ + + int padding; /*!< RSA_PKCS_V15 for 1.5 padding and + RSA_PKCS_v21 for OAEP/PSS */ + int hash_id; /*!< Hash identifier of md_type_t as + specified in the md.h header file + for the EME-OAEP and EMSA-PSS + encoding */ +} +rsa_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initialize an RSA context + * + * Note: Set padding to RSA_PKCS_V21 for the RSAES-OAEP + * encryption scheme and the RSASSA-PSS signature scheme. + * + * \param ctx RSA context to be initialized + * \param padding RSA_PKCS_V15 or RSA_PKCS_V21 + * \param hash_id RSA_PKCS_V21 hash identifier + * + * \note The hash_id parameter is actually ignored + * when using RSA_PKCS_V15 padding. + */ +void rsa_init( rsa_context *ctx, + int padding, + int hash_id); + +/** + * \brief Generate an RSA keypair + * + * \param ctx RSA context that will hold the key + * \param f_rng RNG function + * \param p_rng RNG parameter + * \param nbits size of the public key in bits + * \param exponent public exponent (e.g., 65537) + * + * \note rsa_init() must be called beforehand to setup + * the RSA context. + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + */ +int rsa_gen_key( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + unsigned int nbits, int exponent ); + +/** + * \brief Check a public RSA key + * + * \param ctx RSA context to be checked + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + */ +int rsa_check_pubkey( const rsa_context *ctx ); + +/** + * \brief Check a private RSA key + * + * \param ctx RSA context to be checked + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + */ +int rsa_check_privkey( const rsa_context *ctx ); + +/** + * \brief Do an RSA public key operation + * + * \param ctx RSA context + * \param input input buffer + * \param output output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note This function does NOT take care of message + * padding. Also, be sure to set input[0] = 0 or assure that + * input is smaller than N. + * + * \note The input and output buffers must be large + * enough (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_public( rsa_context *ctx, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Do an RSA private key operation + * + * \param ctx RSA context + * \param input input buffer + * \param output output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The input and output buffers must be large + * enough (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_private( rsa_context *ctx, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Generic wrapper to perform a PKCS#1 encryption using the + * mode from the context. Add the message padding, then do an + * RSA operation. + * + * \param ctx RSA context + * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding) + * \param p_rng RNG parameter + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param ilen contains the plaintext length + * \param input buffer holding the data to be encrypted + * \param output buffer that will hold the ciphertext + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_pkcs1_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Perform a PKCS#1 v1.5 encryption (RSAES-PKCS1-v1_5-ENCRYPT) + * + * \param ctx RSA context + * \param f_rng RNG function (Needed for padding) + * \param p_rng RNG parameter + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param ilen contains the plaintext length + * \param input buffer holding the data to be encrypted + * \param output buffer that will hold the ciphertext + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_rsaes_pkcs1_v15_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Perform a PKCS#1 v2.1 OAEP encryption (RSAES-OAEP-ENCRYPT) + * + * \param ctx RSA context + * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding) + * \param p_rng RNG parameter + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param label buffer holding the custom label to use + * \param label_len contains the label length + * \param ilen contains the plaintext length + * \param input buffer holding the data to be encrypted + * \param output buffer that will hold the ciphertext + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_rsaes_oaep_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t ilen, + const unsigned char *input, + unsigned char *output ); + +/** + * \brief Generic wrapper to perform a PKCS#1 decryption using the + * mode from the context. Do an RSA operation, then remove + * the message padding + * + * \param ctx RSA context + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param olen will contain the plaintext length + * \param input buffer holding the encrypted data + * \param output buffer that will hold the plaintext + * \param output_max_len maximum length of the output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise + * an error is thrown. + */ +int rsa_pkcs1_decrypt( rsa_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ); + +/** + * \brief Perform a PKCS#1 v1.5 decryption (RSAES-PKCS1-v1_5-DECRYPT) + * + * \param ctx RSA context + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param olen will contain the plaintext length + * \param input buffer holding the encrypted data + * \param output buffer that will hold the plaintext + * \param output_max_len maximum length of the output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise + * an error is thrown. + */ +int rsa_rsaes_pkcs1_v15_decrypt( rsa_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ); + +/** + * \brief Perform a PKCS#1 v2.1 OAEP decryption (RSAES-OAEP-DECRYPT) + * + * \param ctx RSA context + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param label buffer holding the custom label to use + * \param label_len contains the label length + * \param olen will contain the plaintext length + * \param input buffer holding the encrypted data + * \param output buffer that will hold the plaintext + * \param output_max_len maximum length of the output buffer + * + * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise + * an error is thrown. + */ +int rsa_rsaes_oaep_decrypt( rsa_context *ctx, + int mode, + const unsigned char *label, size_t label_len, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ); + +/** + * \brief Generic wrapper to perform a PKCS#1 signature using the + * mode from the context. Do a private RSA operation to sign + * a message digest + * + * \param ctx RSA context + * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding) + * \param p_rng RNG parameter + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer that will hold the ciphertext + * + * \return 0 if the signing operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + * + * \note In case of PKCS#1 v2.1 encoding keep in mind that + * the hash_id in the RSA context is the one used for the + * encoding. hash_id in the function call is the type of hash + * that is encoded. According to RFC 3447 it is advised to + * keep both hashes the same. + */ +int rsa_pkcs1_sign( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Perform a PKCS#1 v1.5 signature (RSASSA-PKCS1-v1_5-SIGN) + * + * \param ctx RSA context + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer that will hold the ciphertext + * + * \return 0 if the signing operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Perform a PKCS#1 v2.1 PSS signature (RSASSA-PSS-SIGN) + * + * \param ctx RSA context + * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding) + * \param p_rng RNG parameter + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer that will hold the ciphertext + * + * \return 0 if the signing operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + * + * \note In case of PKCS#1 v2.1 encoding keep in mind that + * the hash_id in the RSA context is the one used for the + * encoding. hash_id in the function call is the type of hash + * that is encoded. According to RFC 3447 it is advised to + * keep both hashes the same. + */ +int rsa_rsassa_pss_sign( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Generic wrapper to perform a PKCS#1 verification using the + * mode from the context. Do a public RSA operation and check + * the message digest + * + * \param ctx points to an RSA public key + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer holding the ciphertext + * + * \return 0 if the verify operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + * + * \note In case of PKCS#1 v2.1 encoding keep in mind that + * the hash_id in the RSA context is the one used for the + * verification. hash_id in the function call is the type of hash + * that is verified. According to RFC 3447 it is advised to + * keep both hashes the same. + */ +int rsa_pkcs1_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Perform a PKCS#1 v1.5 verification (RSASSA-PKCS1-v1_5-VERIFY) + * + * \param ctx points to an RSA public key + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer holding the ciphertext + * + * \return 0 if the verify operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +int rsa_rsassa_pkcs1_v15_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY) + * \brief Do a public RSA and check the message digest + * + * \param ctx points to an RSA public key + * \param mode RSA_PUBLIC or RSA_PRIVATE + * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512} + * \param hashlen message digest length (for SIG_RSA_RAW only) + * \param hash buffer holding the message digest + * \param sig buffer holding the ciphertext + * + * \return 0 if the verify operation was successful, + * or an POLARSSL_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + * + * \note In case of PKCS#1 v2.1 encoding keep in mind that + * the hash_id in the RSA context is the one used for the + * verification. hash_id in the function call is the type of hash + * that is verified. According to RFC 3447 it is advised to + * keep both hashes the same. + */ +int rsa_rsassa_pss_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ); + +/** + * \brief Free the components of an RSA key + * + * \param ctx RSA Context to free + */ +void rsa_free( rsa_context *ctx ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int rsa_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* rsa.h */ diff --git a/Source/Core/Common/Src/Crypto/sha1.h b/Externals/polarssl/include/polarssl/sha1.h similarity index 65% rename from Source/Core/Common/Src/Crypto/sha1.h rename to Externals/polarssl/include/polarssl/sha1.h index 01e522d5db..81ea77d978 100644 --- a/Source/Core/Common/Src/Crypto/sha1.h +++ b/Externals/polarssl/include/polarssl/sha1.h @@ -1,10 +1,14 @@ /** * \file sha1.h * - * Copyright (C) 2006-2009, Paul Bakker - * All rights reserved. + * \brief SHA-1 cryptographic hash function * - * Joined copyright on original XySSL code with: Christophe Devine + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,13 +27,30 @@ #ifndef POLARSSL_SHA1_H #define POLARSSL_SHA1_H +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_SHA1_FILE_IO_ERROR -0x0076 /**< Read/write error in file. */ + +#if !defined(POLARSSL_SHA1_ALT) +// Regular implementation +// + /** * \brief SHA-1 context structure */ typedef struct { - unsigned long total[2]; /*!< number of bytes processed */ - unsigned long state[5]; /*!< intermediate digest state */ + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[5]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ unsigned char ipad[64]; /*!< HMAC: inner padding */ @@ -55,7 +76,7 @@ void sha1_starts( sha1_context *ctx ); * \param input buffer holding the data * \param ilen length of the input data */ -void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ); +void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief SHA-1 final digest @@ -65,6 +86,21 @@ void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ); */ void sha1_finish( sha1_context *ctx, unsigned char output[20] ); +/* Internal use */ +void sha1_process( sha1_context *ctx, const unsigned char data[64] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_SHA1_ALT */ +#include "sha1_alt.h" +#endif /* POLARSSL_SHA1_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + /** * \brief Output = SHA-1( input buffer ) * @@ -72,7 +108,7 @@ void sha1_finish( sha1_context *ctx, unsigned char output[20] ); * \param ilen length of the input data * \param output SHA-1 checksum result */ -void sha1( unsigned char *input, int ilen, unsigned char output[20] ); +void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); /** * \brief Output = SHA-1( file contents ) @@ -80,10 +116,9 @@ void sha1( unsigned char *input, int ilen, unsigned char output[20] ); * \param path input file name * \param output SHA-1 checksum result * - * \return 0 if successful, 1 if fopen failed, - * or 2 if fread failed + * \return 0 if successful, or POLARSSL_ERR_SHA1_FILE_IO_ERROR */ -int sha1_file( char *path, unsigned char output[20] ); +int sha1_file( const char *path, unsigned char output[20] ); /** * \brief SHA-1 HMAC context setup @@ -92,7 +127,7 @@ int sha1_file( char *path, unsigned char output[20] ); * \param key HMAC secret key * \param keylen length of the HMAC key */ -void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ); +void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ); /** * \brief SHA-1 HMAC process buffer @@ -101,7 +136,7 @@ void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ); * \param input buffer holding the data * \param ilen length of the input data */ -void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen ); +void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief SHA-1 HMAC final digest @@ -111,6 +146,13 @@ void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen ); */ void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ); +/** + * \brief SHA-1 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void sha1_hmac_reset( sha1_context *ctx ); + /** * \brief Output = HMAC-SHA-1( hmac key, input buffer ) * @@ -120,8 +162,8 @@ void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ); * \param ilen length of the input data * \param output HMAC-SHA-1 result */ -void sha1_hmac( unsigned char *key, int keylen, - unsigned char *input, int ilen, +void sha1_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, unsigned char output[20] ); /** diff --git a/Externals/polarssl/include/polarssl/sha2.h b/Externals/polarssl/include/polarssl/sha2.h new file mode 100644 index 0000000000..795299ee69 --- /dev/null +++ b/Externals/polarssl/include/polarssl/sha2.h @@ -0,0 +1,188 @@ +/** + * \file sha2.h + * + * \brief SHA-224 and SHA-256 cryptographic hash function + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_SHA2_H +#define POLARSSL_SHA2_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define POLARSSL_ERR_SHA2_FILE_IO_ERROR -0x0078 /**< Read/write error in file. */ + +#if !defined(POLARSSL_SHA2_ALT) +// Regular implementation +// + +/** + * \brief SHA-256 context structure + */ +typedef struct +{ + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[8]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ + + unsigned char ipad[64]; /*!< HMAC: inner padding */ + unsigned char opad[64]; /*!< HMAC: outer padding */ + int is224; /*!< 0 => SHA-256, else SHA-224 */ +} +sha2_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SHA-256 context setup + * + * \param ctx context to be initialized + * \param is224 0 = use SHA256, 1 = use SHA224 + */ +void sha2_starts( sha2_context *ctx, int is224 ); + +/** + * \brief SHA-256 process buffer + * + * \param ctx SHA-256 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha2_update( sha2_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-256 final digest + * + * \param ctx SHA-256 context + * \param output SHA-224/256 checksum result + */ +void sha2_finish( sha2_context *ctx, unsigned char output[32] ); + +/* Internal use */ +void sha2_process( sha2_context *ctx, const unsigned char data[64] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_SHA2_ALT */ +#include "sha2_alt.h" +#endif /* POLARSSL_SHA2_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Output = SHA-256( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output SHA-224/256 checksum result + * \param is224 0 = use SHA256, 1 = use SHA224 + */ +void sha2( const unsigned char *input, size_t ilen, + unsigned char output[32], int is224 ); + +/** + * \brief Output = SHA-256( file contents ) + * + * \param path input file name + * \param output SHA-224/256 checksum result + * \param is224 0 = use SHA256, 1 = use SHA224 + * + * \return 0 if successful, or POLARSSL_ERR_SHA2_FILE_IO_ERROR + */ +int sha2_file( const char *path, unsigned char output[32], int is224 ); + +/** + * \brief SHA-256 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param is224 0 = use SHA256, 1 = use SHA224 + */ +void sha2_hmac_starts( sha2_context *ctx, const unsigned char *key, size_t keylen, + int is224 ); + +/** + * \brief SHA-256 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha2_hmac_update( sha2_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-256 HMAC final digest + * + * \param ctx HMAC context + * \param output SHA-224/256 HMAC checksum result + */ +void sha2_hmac_finish( sha2_context *ctx, unsigned char output[32] ); + +/** + * \brief SHA-256 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void sha2_hmac_reset( sha2_context *ctx ); + +/** + * \brief Output = HMAC-SHA-256( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-SHA-224/256 result + * \param is224 0 = use SHA256, 1 = use SHA224 + */ +void sha2_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[32], int is224 ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int sha2_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* sha2.h */ diff --git a/Externals/polarssl/include/polarssl/sha4.h b/Externals/polarssl/include/polarssl/sha4.h new file mode 100644 index 0000000000..7b0cdf66f7 --- /dev/null +++ b/Externals/polarssl/include/polarssl/sha4.h @@ -0,0 +1,186 @@ +/** + * \file sha4.h + * + * \brief SHA-384 and SHA-512 cryptographic hash function + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_SHA4_H +#define POLARSSL_SHA4_H + +#include "config.h" + +#include + +#if defined(_MSC_VER) || defined(__WATCOMC__) + #define UL64(x) x##ui64 + typedef unsigned __int64 uint64_t; +#else + #include + #define UL64(x) x##ULL +#endif + +#define POLARSSL_ERR_SHA4_FILE_IO_ERROR -0x007A /**< Read/write error in file. */ + +#if !defined(POLARSSL_SHA1_ALT) +// Regular implementation +// + +/** + * \brief SHA-512 context structure + */ +typedef struct +{ + uint64_t total[2]; /*!< number of bytes processed */ + uint64_t state[8]; /*!< intermediate digest state */ + unsigned char buffer[128]; /*!< data block being processed */ + + unsigned char ipad[128]; /*!< HMAC: inner padding */ + unsigned char opad[128]; /*!< HMAC: outer padding */ + int is384; /*!< 0 => SHA-512, else SHA-384 */ +} +sha4_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SHA-512 context setup + * + * \param ctx context to be initialized + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha4_starts( sha4_context *ctx, int is384 ); + +/** + * \brief SHA-512 process buffer + * + * \param ctx SHA-512 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha4_update( sha4_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-512 final digest + * + * \param ctx SHA-512 context + * \param output SHA-384/512 checksum result + */ +void sha4_finish( sha4_context *ctx, unsigned char output[64] ); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_SHA4_ALT */ +#include "sha4_alt.h" +#endif /* POLARSSL_SHA4_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Output = SHA-512( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output SHA-384/512 checksum result + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha4( const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ); + +/** + * \brief Output = SHA-512( file contents ) + * + * \param path input file name + * \param output SHA-384/512 checksum result + * \param is384 0 = use SHA512, 1 = use SHA384 + * + * \return 0 if successful, or POLARSSL_ERR_SHA4_FILE_IO_ERROR + */ +int sha4_file( const char *path, unsigned char output[64], int is384 ); + +/** + * \brief SHA-512 HMAC context setup + * + * \param ctx HMAC context to be initialized + * \param is384 0 = use SHA512, 1 = use SHA384 + * \param key HMAC secret key + * \param keylen length of the HMAC key + */ +void sha4_hmac_starts( sha4_context *ctx, const unsigned char *key, size_t keylen, + int is384 ); + +/** + * \brief SHA-512 HMAC process buffer + * + * \param ctx HMAC context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha4_hmac_update( sha4_context *ctx, const unsigned char *input, size_t ilen ); + +/** + * \brief SHA-512 HMAC final digest + * + * \param ctx HMAC context + * \param output SHA-384/512 HMAC checksum result + */ +void sha4_hmac_finish( sha4_context *ctx, unsigned char output[64] ); + +/** + * \brief SHA-512 HMAC context reset + * + * \param ctx HMAC context to be reset + */ +void sha4_hmac_reset( sha4_context *ctx ); + +/** + * \brief Output = HMAC-SHA-512( hmac key, input buffer ) + * + * \param key HMAC secret key + * \param keylen length of the HMAC key + * \param input buffer holding the data + * \param ilen length of the input data + * \param output HMAC-SHA-384/512 result + * \param is384 0 = use SHA512, 1 = use SHA384 + */ +void sha4_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ); + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int sha4_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* sha4.h */ diff --git a/Externals/polarssl/include/polarssl/ssl.h b/Externals/polarssl/include/polarssl/ssl.h new file mode 100644 index 0000000000..fa644fe958 --- /dev/null +++ b/Externals/polarssl/include/polarssl/ssl.h @@ -0,0 +1,1140 @@ +/** + * \file ssl.h + * + * \brief SSL/TLS functions. + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_SSL_H +#define POLARSSL_SSL_H + +#include + +#include "net.h" +#include "rsa.h" +#include "md5.h" +#include "sha1.h" +#include "sha2.h" +#include "sha4.h" +#include "x509.h" +#include "config.h" + +#if defined(POLARSSL_DHM_C) +#include "dhm.h" +#endif + +#if defined(POLARSSL_ZLIB_SUPPORT) +#include "zlib.h" +#endif + +#if defined(_MSC_VER) && !defined(inline) +#define inline _inline +#else +#if defined(__ARMCC_VERSION) && !defined(inline) +#define inline __inline +#endif /* __ARMCC_VERSION */ +#endif /*_MSC_VER */ + +/* + * SSL Error codes + */ +#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 /**< The requested feature is not available. */ +#define POLARSSL_ERR_SSL_BAD_INPUT_DATA -0x7100 /**< Bad input parameters to function. */ +#define POLARSSL_ERR_SSL_INVALID_MAC -0x7180 /**< Verification of the message MAC failed. */ +#define POLARSSL_ERR_SSL_INVALID_RECORD -0x7200 /**< An invalid SSL record was received. */ +#define POLARSSL_ERR_SSL_CONN_EOF -0x7280 /**< The connection indicated an EOF. */ +#define POLARSSL_ERR_SSL_UNKNOWN_CIPHER -0x7300 /**< An unknown cipher was received. */ +#define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 /**< The server has no ciphersuites in common with the client. */ +#define POLARSSL_ERR_SSL_NO_SESSION_FOUND -0x7400 /**< No session to recover was found. */ +#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 /**< No client certification received from the client, but required by the authentication mode. */ +#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 /**< Our own certificate(s) is/are too large to send in an SSL message.*/ +#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 /**< The own certificate is not set, but needed by the server. */ +#define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 /**< The own private key is not set, but needed. */ +#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 /**< No CA Chain is set, but required to operate. */ +#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 /**< An unexpected message was received from our peer. */ +#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 /**< A fatal alert message was received from our peer. */ +#define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED -0x7800 /**< Verification of our peer failed. */ +#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 /**< The peer notified us that the connection is going to be closed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 /**< Processing of the ClientHello handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 /**< Processing of the ServerHello handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 /**< Processing of the Certificate handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 /**< Processing of the CertificateRequest handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 /**< Processing of the ServerKeyExchange handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 /**< Processing of the ServerHelloDone handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 /**< Processing of the ClientKeyExchange handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP -0x7C80 /**< Processing of the ClientKeyExchange handshake message failed in DHM Read Public. */ +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS -0x7D00 /**< Processing of the ClientKeyExchange handshake message failed in DHM Calculate Secret. */ +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 /**< Processing of the CertificateVerify handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 /**< Processing of the ChangeCipherSpec handshake message failed. */ +#define POLARSSL_ERR_SSL_BAD_HS_FINISHED -0x7E80 /**< Processing of the Finished handshake message failed. */ +#define POLARSSL_ERR_SSL_MALLOC_FAILED -0x7F00 /**< Memory allocation failed */ +#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED -0x7F80 /**< Hardware acceleration function returned with error */ +#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 /**< Hardware acceleration function skipped / left alone data */ +#define POLARSSL_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ +#define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ + +/* + * Various constants + */ +#define SSL_MAJOR_VERSION_3 3 +#define SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ +#define SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ +#define SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ +#define SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ + +#define SSL_IS_CLIENT 0 +#define SSL_IS_SERVER 1 +#define SSL_COMPRESS_NULL 0 +#define SSL_COMPRESS_DEFLATE 1 + +#define SSL_VERIFY_NONE 0 +#define SSL_VERIFY_OPTIONAL 1 +#define SSL_VERIFY_REQUIRED 2 + +#define SSL_INITIAL_HANDSHAKE 0 +#define SSL_RENEGOTIATION 1 + +#define SSL_LEGACY_RENEGOTIATION 0 +#define SSL_SECURE_RENEGOTIATION 1 + +#define SSL_RENEGOTIATION_DISABLED 0 +#define SSL_RENEGOTIATION_ENABLED 1 + +#define SSL_LEGACY_NO_RENEGOTIATION 0 +#define SSL_LEGACY_ALLOW_RENEGOTIATION 1 +#define SSL_LEGACY_BREAK_HANDSHAKE 2 + +/* + * Size of the input / output buffer. + * Note: the RFC defines the default size of SSL / TLS messages. If you + * change the value here, other clients / servers may not be able to + * communicate with you anymore. Only change this value if you control + * both sides of the connection and have it reduced at both sides! + */ +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ +#endif /* !POLARSSL_CONFIG_OPTIONS */ + +/* + * Allow an extra 512 bytes for the record header + * and encryption overhead (counter + MAC + padding) + * and allow for a maximum of 1024 of compression expansion if + * enabled. + */ +#if defined(POLARSSL_ZLIB_SUPPORT) +#define SSL_COMPRESSION_ADD 1024 +#else +#define SSL_COMPRESSION_ADD 0 +#endif + +#define SSL_BUFFER_LEN (SSL_MAX_CONTENT_LEN + SSL_COMPRESSION_ADD + 512) + +/* + * Supported ciphersuites (Official IANA names) + */ +#define TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ +#define TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ +#define TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ +#define TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ +#define TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ + +#define TLS_RSA_WITH_RC4_128_MD5 0x04 +#define TLS_RSA_WITH_RC4_128_SHA 0x05 + +#define TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A +#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 + +#define TLS_RSA_WITH_AES_128_CBC_SHA 0x2F +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 +#define TLS_RSA_WITH_AES_256_CBC_SHA 0x35 +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 +#define TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ +#define TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ + +#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 +#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 +#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 +#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 +#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ +#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ +#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ +#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ + +#define TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C +#define TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D +#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E +#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F + +#define SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ + +/* + * Supported Signature and Hash algorithms (For TLS 1.2) + */ +#define SSL_HASH_NONE 0 +#define SSL_HASH_MD5 1 +#define SSL_HASH_SHA1 2 +#define SSL_HASH_SHA224 3 +#define SSL_HASH_SHA256 4 +#define SSL_HASH_SHA384 5 +#define SSL_HASH_SHA512 6 + +#define SSL_SIG_RSA 1 + +/* + * Client Certificate Types + */ +#define SSL_CERT_TYPE_RSA_SIGN 1 + +/* + * Message, alert and handshake types + */ +#define SSL_MSG_CHANGE_CIPHER_SPEC 20 +#define SSL_MSG_ALERT 21 +#define SSL_MSG_HANDSHAKE 22 +#define SSL_MSG_APPLICATION_DATA 23 + +#define SSL_ALERT_LEVEL_WARNING 1 +#define SSL_ALERT_LEVEL_FATAL 2 + +#define SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ +#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ +#define SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ +#define SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ +#define SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ +#define SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ +#define SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ +#define SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ +#define SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ +#define SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ +#define SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ +#define SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ +#define SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ +#define SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ +#define SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ +#define SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ +#define SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ +#define SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ +#define SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ +#define SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ +#define SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ +#define SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ +#define SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ +#define SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ +#define SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ +#define SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ + +#define SSL_HS_HELLO_REQUEST 0 +#define SSL_HS_CLIENT_HELLO 1 +#define SSL_HS_SERVER_HELLO 2 +#define SSL_HS_CERTIFICATE 11 +#define SSL_HS_SERVER_KEY_EXCHANGE 12 +#define SSL_HS_CERTIFICATE_REQUEST 13 +#define SSL_HS_SERVER_HELLO_DONE 14 +#define SSL_HS_CERTIFICATE_VERIFY 15 +#define SSL_HS_CLIENT_KEY_EXCHANGE 16 +#define SSL_HS_FINISHED 20 + +/* + * TLS extensions + */ +#define TLS_EXT_SERVERNAME 0 +#define TLS_EXT_SERVERNAME_HOSTNAME 0 + +#define TLS_EXT_SIG_ALG 13 + +#define TLS_EXT_RENEGOTIATION_INFO 0xFF01 + + +/* + * Generic function pointers for allowing external RSA private key + * implementations. + */ +typedef int (*rsa_decrypt_func)( void *ctx, int mode, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len ); +typedef int (*rsa_sign_func)( void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + int mode, int hash_id, unsigned int hashlen, + const unsigned char *hash, unsigned char *sig ); +typedef size_t (*rsa_key_len_func)( void *ctx ); + +/* + * SSL state machine + */ +typedef enum +{ + SSL_HELLO_REQUEST, + SSL_CLIENT_HELLO, + SSL_SERVER_HELLO, + SSL_SERVER_CERTIFICATE, + SSL_SERVER_KEY_EXCHANGE, + SSL_CERTIFICATE_REQUEST, + SSL_SERVER_HELLO_DONE, + SSL_CLIENT_CERTIFICATE, + SSL_CLIENT_KEY_EXCHANGE, + SSL_CERTIFICATE_VERIFY, + SSL_CLIENT_CHANGE_CIPHER_SPEC, + SSL_CLIENT_FINISHED, + SSL_SERVER_CHANGE_CIPHER_SPEC, + SSL_SERVER_FINISHED, + SSL_FLUSH_BUFFERS, + SSL_HANDSHAKE_WRAPUP, + SSL_HANDSHAKE_OVER +} +ssl_states; + +typedef struct _ssl_session ssl_session; +typedef struct _ssl_context ssl_context; +typedef struct _ssl_transform ssl_transform; +typedef struct _ssl_handshake_params ssl_handshake_params; + +/* + * This structure is used for storing current session data. + */ +struct _ssl_session +{ + time_t start; /*!< starting time */ + int ciphersuite; /*!< chosen ciphersuite */ + int compression; /*!< chosen compression */ + size_t length; /*!< session id length */ + unsigned char id[32]; /*!< session identifier */ + unsigned char master[48]; /*!< the master secret */ + x509_cert *peer_cert; /*!< peer X.509 cert chain */ +}; + +/* + * This structure contains a full set of runtime transform parameters + * either in negotiation or active. + */ +struct _ssl_transform +{ + /* + * Session specific crypto layer + */ + unsigned int keylen; /*!< symmetric key length */ + size_t minlen; /*!< min. ciphertext length */ + size_t ivlen; /*!< IV length */ + size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ + size_t maclen; /*!< MAC length */ + + unsigned char iv_enc[16]; /*!< IV (encryption) */ + unsigned char iv_dec[16]; /*!< IV (decryption) */ + + unsigned char mac_enc[32]; /*!< MAC (encryption) */ + unsigned char mac_dec[32]; /*!< MAC (decryption) */ + + uint32_t ctx_enc[136]; /*!< encryption context */ + uint32_t ctx_dec[136]; /*!< decryption context */ + + /* + * Session specific compression layer + */ +#if defined(POLARSSL_ZLIB_SUPPORT) + z_stream ctx_deflate; /*!< compression context */ + z_stream ctx_inflate; /*!< decompression context */ +#endif +}; + +/* + * This structure contains the parameters only needed during handshake. + */ +struct _ssl_handshake_params +{ + /* + * Handshake specific crypto variables + */ + int sig_alg; /*!< Signature algorithm */ + int cert_type; /*!< Requested cert type */ + int verify_sig_alg; /*!< Signature algorithm for verify */ +#if defined(POLARSSL_DHM_C) + dhm_context dhm_ctx; /*!< DHM key exchange */ +#endif + + /* + * Checksum contexts + */ + md5_context fin_md5; + sha1_context fin_sha1; + sha2_context fin_sha2; + sha4_context fin_sha4; + + void (*update_checksum)(ssl_context *, unsigned char *, size_t); + void (*calc_verify)(ssl_context *, unsigned char *); + void (*calc_finished)(ssl_context *, unsigned char *, int); + int (*tls_prf)(unsigned char *, size_t, char *, + unsigned char *, size_t, + unsigned char *, size_t); + + size_t pmslen; /*!< premaster length */ + + unsigned char randbytes[64]; /*!< random bytes */ + unsigned char premaster[POLARSSL_MPI_MAX_SIZE]; + /*!< premaster secret */ + + int resume; /*!< session resume indicator*/ +}; + +struct _ssl_context +{ + /* + * Miscellaneous + */ + int state; /*!< SSL handshake: current state */ + int renegotiation; /*!< Initial or renegotiation */ + + int major_ver; /*!< equal to SSL_MAJOR_VERSION_3 */ + int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ + + int max_major_ver; /*!< max. major version from client */ + int max_minor_ver; /*!< max. minor version from client */ + int min_major_ver; /*!< min. major version accepted */ + int min_minor_ver; /*!< min. minor version accepted */ + + /* + * Callbacks (RNG, debug, I/O, verification) + */ + int (*f_rng)(void *, unsigned char *, size_t); + void (*f_dbg)(void *, int, const char *); + int (*f_recv)(void *, unsigned char *, size_t); + int (*f_send)(void *, const unsigned char *, size_t); + int (*f_vrfy)(void *, x509_cert *, int, int *); + int (*f_get_cache)(void *, ssl_session *); + int (*f_set_cache)(void *, const ssl_session *); + int (*f_sni)(void *, ssl_context *, const unsigned char *, size_t); + + void *p_rng; /*!< context for the RNG function */ + void *p_dbg; /*!< context for the debug function */ + void *p_recv; /*!< context for reading operations */ + void *p_send; /*!< context for writing operations */ + void *p_vrfy; /*!< context for verification */ + void *p_get_cache; /*!< context for cache retrieval */ + void *p_set_cache; /*!< context for cache store */ + void *p_sni; /*!< context for SNI extension */ + void *p_hw_data; /*!< context for HW acceleration */ + + /* + * Session layer + */ + ssl_session *session_in; /*!< current session data (in) */ + ssl_session *session_out; /*!< current session data (out) */ + ssl_session *session; /*!< negotiated session data */ + ssl_session *session_negotiate; /*!< session data in negotiation */ + + ssl_handshake_params *handshake; /*!< params required only during + the handshake process */ + + /* + * Record layer transformations + */ + ssl_transform *transform_in; /*!< current transform params (in) */ + ssl_transform *transform_out; /*!< current transform params (in) */ + ssl_transform *transform; /*!< negotiated transform params */ + ssl_transform *transform_negotiate; /*!< transform params in negotiation */ + + /* + * Record layer (incoming data) + */ + unsigned char *in_ctr; /*!< 64-bit incoming message counter */ + unsigned char *in_hdr; /*!< 5-byte record header (in_ctr+8) */ + unsigned char *in_msg; /*!< the message contents (in_hdr+5) */ + unsigned char *in_offt; /*!< read offset in application data */ + + int in_msgtype; /*!< record header: message type */ + size_t in_msglen; /*!< record header: message length */ + size_t in_left; /*!< amount of data read so far */ + + size_t in_hslen; /*!< current handshake message length */ + int nb_zero; /*!< # of 0-length encrypted messages */ + + /* + * Record layer (outgoing data) + */ + unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ + unsigned char *out_hdr; /*!< 5-byte record header (out_ctr+8) */ + unsigned char *out_msg; /*!< the message contents (out_hdr+32)*/ + + int out_msgtype; /*!< record header: message type */ + size_t out_msglen; /*!< record header: message length */ + size_t out_left; /*!< amount of data not yet written */ + + /* + * PKI layer + */ + void *rsa_key; /*!< own RSA private key */ + rsa_decrypt_func rsa_decrypt; /*!< function for RSA decrypt*/ + rsa_sign_func rsa_sign; /*!< function for RSA sign */ + rsa_key_len_func rsa_key_len; /*!< function for RSA key len*/ + + x509_cert *own_cert; /*!< own X.509 certificate */ + x509_cert *ca_chain; /*!< own trusted CA chain */ + x509_crl *ca_crl; /*!< trusted CA CRLs */ + const char *peer_cn; /*!< expected peer CN */ + + /* + * User settings + */ + int endpoint; /*!< 0: client, 1: server */ + int authmode; /*!< verification mode */ + int client_auth; /*!< flag for client auth. */ + int verify_result; /*!< verification result */ + int disable_renegotiation; /*!< enable/disable renegotiation */ + int allow_legacy_renegotiation; /*!< allow legacy renegotiation */ + const int **ciphersuites; /*!< allowed ciphersuites / version */ + +#if defined(POLARSSL_DHM_C) + mpi dhm_P; /*!< prime modulus for DHM */ + mpi dhm_G; /*!< generator for DHM */ +#endif + + /* + * TLS extensions + */ + unsigned char *hostname; + size_t hostname_len; + + /* + * Secure renegotiation + */ + int secure_renegotiation; /*!< does peer support legacy or + secure renegotiation */ + size_t verify_data_len; /*!< length of verify data stored */ + char own_verify_data[36]; /*!< previous handshake verify data */ + char peer_verify_data[36]; /*!< previous handshake verify data */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern const int ssl_default_ciphersuites[]; + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) +extern int (*ssl_hw_record_init)(ssl_context *ssl, + const unsigned char *key_enc, const unsigned char *key_dec, + const unsigned char *iv_enc, const unsigned char *iv_dec, + const unsigned char *mac_enc, const unsigned char *mac_dec); +extern int (*ssl_hw_record_reset)(ssl_context *ssl); +extern int (*ssl_hw_record_write)(ssl_context *ssl); +extern int (*ssl_hw_record_read)(ssl_context *ssl); +extern int (*ssl_hw_record_finish)(ssl_context *ssl); +#endif + +/** + * \brief Returns the list of ciphersuites supported by the SSL/TLS module. + * + * \return a statically allocated array of ciphersuites, the last + * entry is 0. + */ +static inline const int *ssl_list_ciphersuites( void ) +{ + return ssl_default_ciphersuites; +} + +/** + * \brief Return the name of the ciphersuite associated with the given + * ID + * + * \param ciphersuite_id SSL ciphersuite ID + * + * \return a string containing the ciphersuite name + */ +const char *ssl_get_ciphersuite_name( const int ciphersuite_id ); + +/** + * \brief Return the ID of the ciphersuite associated with the given + * name + * + * \param ciphersuite_name SSL ciphersuite name + * + * \return the ID with the ciphersuite or 0 if not found + */ +int ssl_get_ciphersuite_id( const char *ciphersuite_name ); + +/** + * \brief Initialize an SSL context + * + * \param ssl SSL context + * + * \return 0 if successful, or POLARSSL_ERR_SSL_MALLOC_FAILED if + * memory allocation failed + */ +int ssl_init( ssl_context *ssl ); + +/** + * \brief Reset an already initialized SSL context for re-use + * while retaining application-set variables, function + * pointers and data. + * + * \param ssl SSL context + * \return 0 if successful, or POLASSL_ERR_SSL_MALLOC_FAILED, + POLARSSL_ERR_SSL_HW_ACCEL_FAILED or + * POLARSSL_ERR_SSL_COMPRESSION_FAILED + */ +int ssl_session_reset( ssl_context *ssl ); + +/** + * \brief Set the current endpoint type + * + * \param ssl SSL context + * \param endpoint must be SSL_IS_CLIENT or SSL_IS_SERVER + */ +void ssl_set_endpoint( ssl_context *ssl, int endpoint ); + +/** + * \brief Set the certificate verification mode + * + * \param ssl SSL context + * \param authmode can be: + * + * SSL_VERIFY_NONE: peer certificate is not checked (default), + * this is insecure and SHOULD be avoided. + * + * SSL_VERIFY_OPTIONAL: peer certificate is checked, however the + * handshake continues even if verification failed; + * ssl_get_verify_result() can be called after the + * handshake is complete. + * + * SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, + * handshake is aborted if verification failed. + */ +void ssl_set_authmode( ssl_context *ssl, int authmode ); + +/** + * \brief Set the verification callback (Optional). + * + * If set, the verify callback is called for each + * certificate in the chain. For implementation + * information, please see \c x509parse_verify() + * + * \param ssl SSL context + * \param f_vrfy verification function + * \param p_vrfy verification parameter + */ +void ssl_set_verify( ssl_context *ssl, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ); + +/** + * \brief Set the random number generator callback + * + * \param ssl SSL context + * \param f_rng RNG function + * \param p_rng RNG parameter + */ +void ssl_set_rng( ssl_context *ssl, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ); + +/** + * \brief Set the debug callback + * + * \param ssl SSL context + * \param f_dbg debug function + * \param p_dbg debug parameter + */ +void ssl_set_dbg( ssl_context *ssl, + void (*f_dbg)(void *, int, const char *), + void *p_dbg ); + +/** + * \brief Set the underlying BIO read and write callbacks + * + * \param ssl SSL context + * \param f_recv read callback + * \param p_recv read parameter + * \param f_send write callback + * \param p_send write parameter + */ +void ssl_set_bio( ssl_context *ssl, + int (*f_recv)(void *, unsigned char *, size_t), void *p_recv, + int (*f_send)(void *, const unsigned char *, size_t), void *p_send ); + +/** + * \brief Set the session cache callbacks (server-side only) + * If not set, no session resuming is done. + * + * The session cache has the responsibility to check for stale + * entries based on timeout. See RFC 5246 for recommendations. + * + * Warning: session.peer_cert is cleared by the SSL/TLS layer on + * connection shutdown, so do not cache the pointer! Either set + * it to NULL or make a full copy of the certificate. + * + * The get callback is called once during the initial handshake + * to enable session resuming. The get function has the + * following parameters: (void *parameter, ssl_session *session) + * If a valid entry is found, it should fill the master of + * the session object with the cached values and return 0, + * return 1 otherwise. Optionally peer_cert can be set as well + * if it is properly present in cache entry. + * + * The set callback is called once during the initial handshake + * to enable session resuming after the entire handshake has + * been finished. The set function has the following parameters: + * (void *parameter, const ssl_session *session). The function + * should create a cache entry for future retrieval based on + * the data in the session structure and should keep in mind + * that the ssl_session object presented (and all its referenced + * data) is cleared by the SSL/TLS layer when the connection is + * terminated. It is recommended to add metadata to determine if + * an entry is still valid in the future. Return 0 if + * successfully cached, return 1 otherwise. + * + * \param ssl SSL context + * \param f_get_cache session get callback + * \param p_get_cache session get parameter + * \param f_set_cache session set callback + * \param p_set_cache session set parameter + */ +void ssl_set_session_cache( ssl_context *ssl, + int (*f_get_cache)(void *, ssl_session *), void *p_get_cache, + int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache ); + +/** + * \brief Request resumption of session (client-side only) + * Session data is copied from presented session structure. + * + * Warning: session.peer_cert is cleared by the SSL/TLS layer on + * connection shutdown, so do not cache the pointer! Either set + * it to NULL or make a full copy of the certificate when + * storing the session for use in this function. + * + * \param ssl SSL context + * \param session session context + */ +void ssl_set_session( ssl_context *ssl, const ssl_session *session ); + +/** + * \brief Set the list of allowed ciphersuites + * (Default: ssl_default_ciphersuites) + * (Overrides all version specific lists) + * + * \param ssl SSL context + * \param ciphersuites 0-terminated list of allowed ciphersuites + */ +void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites ); + +/** + * \brief Set the list of allowed ciphersuites for a specific + * version of the protocol. + * (Default: ssl_default_ciphersuites) + * (Only useful on the server side) + * + * \param ssl SSL context + * \param ciphersuites 0-terminated list of allowed ciphersuites + * \param major Major version number (only SSL_MAJOR_VERSION_3 + * supported) + * \param minor Minor version number (SSL_MINOR_VERSION_0, + * SSL_MINOR_VERSION_1 and SSL_MINOR_VERSION_2, + * SSL_MINOR_VERSION_3 supported) + */ +void ssl_set_ciphersuites_for_version( ssl_context *ssl, + const int *ciphersuites, + int major, int minor ); + +/** + * \brief Set the data required to verify peer certificate + * + * \param ssl SSL context + * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) + * \param ca_crl trusted CA CRLs + * \param peer_cn expected peer CommonName (or NULL) + */ +void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain, + x509_crl *ca_crl, const char *peer_cn ); + +/** + * \brief Set own certificate chain and private key + * + * Note: own_cert should contain IN order from the bottom + * up your certificate chain. The top certificate (self-signed) + * can be omitted. + * + * \param ssl SSL context + * \param own_cert own public certificate chain + * \param rsa_key own private RSA key + */ +void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert, + rsa_context *rsa_key ); + +/** + * \brief Set own certificate and alternate non-PolarSSL private + * key and handling callbacks, such as the PKCS#11 wrappers + * or any other external private key handler. + * (see the respective RSA functions in rsa.h for documentation + * of the callback parameters, with the only change being + * that the rsa_context * is a void * in the callbacks) + * + * Note: own_cert should contain IN order from the bottom + * up your certificate chain. The top certificate (self-signed) + * can be omitted. + * + * \param ssl SSL context + * \param own_cert own public certificate chain + * \param rsa_key alternate implementation private RSA key + * \param rsa_decrypt_func alternate implementation of \c rsa_pkcs1_decrypt() + * \param rsa_sign_func alternate implementation of \c rsa_pkcs1_sign() + * \param rsa_key_len_func function returning length of RSA key in bytes + */ +void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert, + void *rsa_key, + rsa_decrypt_func rsa_decrypt, + rsa_sign_func rsa_sign, + rsa_key_len_func rsa_key_len ); + +#if defined(POLARSSL_DHM_C) +/** + * \brief Set the Diffie-Hellman public P and G values, + * read as hexadecimal strings (server-side only) + * (Default: POLARSSL_DHM_RFC5114_MODP_1024_[PG]) + * + * \param ssl SSL context + * \param dhm_P Diffie-Hellman-Merkle modulus + * \param dhm_G Diffie-Hellman-Merkle generator + * + * \return 0 if successful + */ +int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G ); + +/** + * \brief Set the Diffie-Hellman public P and G values, + * read from existing context (server-side only) + * + * \param ssl SSL context + * \param dhm_ctx Diffie-Hellman-Merkle context + * + * \return 0 if successful + */ +int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx ); +#endif + +/** + * \brief Set hostname for ServerName TLS extension + * (client-side only) + * + * + * \param ssl SSL context + * \param hostname the server hostname + * + * \return 0 if successful or POLARSSL_ERR_SSL_MALLOC_FAILED + */ +int ssl_set_hostname( ssl_context *ssl, const char *hostname ); + +/** + * \brief Set server side ServerName TLS extension callback + * (optional, server-side only). + * + * If set, the ServerName callback is called whenever the + * server receives a ServerName TLS extension from the client + * during a handshake. The ServerName callback has the + * following parameters: (void *parameter, ssl_context *ssl, + * const unsigned char *hostname, size_t len). If a suitable + * certificate is found, the callback should set the + * certificate and key to use with ssl_set_own_cert() (and + * possibly adjust the CA chain as well) and return 0. The + * callback should return -1 to abort the handshake at this + * point. + * + * \param ssl SSL context + * \param f_sni verification function + * \param p_sni verification parameter + */ +void ssl_set_sni( ssl_context *ssl, + int (*f_sni)(void *, ssl_context *, const unsigned char *, + size_t), + void *p_sni ); + +/** + * \brief Set the maximum supported version sent from the client side + * + * \param ssl SSL context + * \param major Major version number (only SSL_MAJOR_VERSION_3 supported) + * \param minor Minor version number (SSL_MINOR_VERSION_0, + * SSL_MINOR_VERSION_1 and SSL_MINOR_VERSION_2, + * SSL_MINOR_VERSION_3 supported) + */ +void ssl_set_max_version( ssl_context *ssl, int major, int minor ); + + +/** + * \brief Set the minimum accepted SSL/TLS protocol version + * (Default: SSL_MAJOR_VERSION_3, SSL_MINOR_VERSION_0) + * + * \param ssl SSL context + * \param major Major version number (only SSL_MAJOR_VERSION_3 supported) + * \param minor Minor version number (SSL_MINOR_VERSION_0, + * SSL_MINOR_VERSION_1 and SSL_MINOR_VERSION_2, + * SSL_MINOR_VERSION_3 supported) + */ +void ssl_set_min_version( ssl_context *ssl, int major, int minor ); + +/** + * \brief Enable / Disable renegotiation support for connection when + * initiated by peer + * (Default: SSL_RENEGOTIATION_DISABLED) + * + * Note: A server with support enabled is more vulnerable for a + * resource DoS by a malicious client. You should enable this on + * a client to enable server-initiated renegotiation. + * + * \param ssl SSL context + * \param renegotiation Enable or disable (SSL_RENEGOTIATION_ENABLED or + * SSL_RENEGOTIATION_DISABLED) + */ +void ssl_set_renegotiation( ssl_context *ssl, int renegotiation ); + +/** + * \brief Prevent or allow legacy renegotiation. + * (Default: SSL_LEGACY_NO_RENEGOTIATION) + * + * SSL_LEGACY_NO_RENEGOTIATION allows connections to + * be established even if the peer does not support + * secure renegotiation, but does not allow renegotiation + * to take place if not secure. + * (Interoperable and secure option) + * + * SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations + * with non-upgraded peers. Allowing legacy renegotiation + * makes the connection vulnerable to specific man in the + * middle attacks. (See RFC 5746) + * (Most interoperable and least secure option) + * + * SSL_LEGACY_BREAK_HANDSHAKE breaks off connections + * if peer does not support secure renegotiation. Results + * in interoperability issues with non-upgraded peers + * that do not support renegotiation altogether. + * (Most secure option, interoperability issues) + * + * \param ssl SSL context + * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, + * SSL_ALLOW_LEGACY_RENEGOTIATION or + * SSL_LEGACY_BREAK_HANDSHAKE) + */ +void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy ); + +/** + * \brief Return the number of data bytes available to read + * + * \param ssl SSL context + * + * \return how many bytes are available in the read buffer + */ +size_t ssl_get_bytes_avail( const ssl_context *ssl ); + +/** + * \brief Return the result of the certificate verification + * + * \param ssl SSL context + * + * \return 0 if successful, or a combination of: + * BADCERT_EXPIRED + * BADCERT_REVOKED + * BADCERT_CN_MISMATCH + * BADCERT_NOT_TRUSTED + */ +int ssl_get_verify_result( const ssl_context *ssl ); + +/** + * \brief Return the name of the current ciphersuite + * + * \param ssl SSL context + * + * \return a string containing the ciphersuite name + */ +const char *ssl_get_ciphersuite( const ssl_context *ssl ); + +/** + * \brief Return the current SSL version (SSLv3/TLSv1/etc) + * + * \param ssl SSL context + * + * \return a string containing the SSL version + */ +const char *ssl_get_version( const ssl_context *ssl ); + +/** + * \brief Return the peer certificate from the current connection + * + * Note: Can be NULL in case no certificate was sent during + * the handshake. Different calls for the same connection can + * return the same or different pointers for the same + * certificate and even a different certificate altogether. + * The peer cert CAN change in a single connection if + * renegotiation is performed. + * + * \param ssl SSL context + * + * \return the current peer certificate + */ +const x509_cert *ssl_get_peer_cert( const ssl_context *ssl ); + +/** + * \brief Perform the SSL handshake + * + * \param ssl SSL context + * + * \return 0 if successful, POLARSSL_ERR_NET_WANT_READ, + * POLARSSL_ERR_NET_WANT_WRITE, or a specific SSL error code. + */ +int ssl_handshake( ssl_context *ssl ); + +/** + * \brief Perform a single step of the SSL handshake + * + * Note: the state of the context (ssl->state) will be at + * the following state after execution of this function. + * Do not call this function if state is SSL_HANDSHAKE_OVER. + * + * \param ssl SSL context + * + * \return 0 if successful, POLARSSL_ERR_NET_WANT_READ, + * POLARSSL_ERR_NET_WANT_WRITE, or a specific SSL error code. + */ +int ssl_handshake_step( ssl_context *ssl ); + +/** + * \brief Perform an SSL renegotiation on the running connection + * + * \param ssl SSL context + * + * \return 0 if succesful, or any ssl_handshake() return value. + */ +int ssl_renegotiate( ssl_context *ssl ); + +/** + * \brief Read at most 'len' application data bytes + * + * \param ssl SSL context + * \param buf buffer that will hold the data + * \param len how many bytes must be read + * + * \return This function returns the number of bytes read, 0 for EOF, + * or a negative error code. + */ +int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len ); + +/** + * \brief Write exactly 'len' application data bytes + * + * \param ssl SSL context + * \param buf buffer holding the data + * \param len how many bytes must be written + * + * \return This function returns the number of bytes written, + * or a negative error code. + * + * \note When this function returns POLARSSL_ERR_NET_WANT_WRITE, + * it must be called later with the *same* arguments, + * until it returns a positive value. + */ +int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len ); + +/** + * \brief Send an alert message + * + * \param ssl SSL context + * \param level The alert level of the message + * (SSL_ALERT_LEVEL_WARNING or SSL_ALERT_LEVEL_FATAL) + * \param message The alert message (SSL_ALERT_MSG_*) + * + * \return 0 if successful, or a specific SSL error code. + */ +int ssl_send_alert_message( ssl_context *ssl, + unsigned char level, + unsigned char message ); +/** + * \brief Notify the peer that the connection is being closed + * + * \param ssl SSL context + */ +int ssl_close_notify( ssl_context *ssl ); + +/** + * \brief Free referenced items in an SSL context and clear memory + * + * \param ssl SSL context + */ +void ssl_free( ssl_context *ssl ); + +/** + * \brief Free referenced items in an SSL session including the + * peer certificate and clear memory + * + * \param session SSL session + */ +void ssl_session_free( ssl_session *session ); + +/** + * \brief Free referenced items in an SSL transform context and clear + * memory + * + * \param transform SSL transform context + */ +void ssl_transform_free( ssl_transform *transform ); + +/** + * \brief Free referenced items in an SSL handshake context and clear + * memory + * + * \param handshake SSL handshake context + */ +void ssl_handshake_free( ssl_handshake_params *handshake ); + +/* + * Internal functions (do not call directly) + */ +int ssl_handshake_client_step( ssl_context *ssl ); +int ssl_handshake_server_step( ssl_context *ssl ); +void ssl_handshake_wrapup( ssl_context *ssl ); + +int ssl_send_fatal_handshake_failure( ssl_context *ssl ); + +int ssl_derive_keys( ssl_context *ssl ); + +int ssl_read_record( ssl_context *ssl ); +/** + * \return 0 if successful, POLARSSL_ERR_SSL_CONN_EOF on EOF or + * another negative error code. + */ +int ssl_fetch_input( ssl_context *ssl, size_t nb_want ); + +int ssl_write_record( ssl_context *ssl ); +int ssl_flush_output( ssl_context *ssl ); + +int ssl_parse_certificate( ssl_context *ssl ); +int ssl_write_certificate( ssl_context *ssl ); + +int ssl_parse_change_cipher_spec( ssl_context *ssl ); +int ssl_write_change_cipher_spec( ssl_context *ssl ); + +int ssl_parse_finished( ssl_context *ssl ); +int ssl_write_finished( ssl_context *ssl ); + +void ssl_optimize_checksum( ssl_context *ssl, int ciphersuite ); + +#ifdef __cplusplus +} +#endif + +#endif /* ssl.h */ diff --git a/Externals/polarssl/include/polarssl/ssl_cache.h b/Externals/polarssl/include/polarssl/ssl_cache.h new file mode 100644 index 0000000000..8d66b5caf4 --- /dev/null +++ b/Externals/polarssl/include/polarssl/ssl_cache.h @@ -0,0 +1,119 @@ +/** + * \file ssl_cache.h + * + * \brief SSL session cache implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_SSL_CACHE_H +#define POLARSSL_SSL_CACHE_H + +#include "ssl.h" + +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ +#define SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ +#endif /* !POLARSSL_CONFIG_OPTIONS */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _ssl_cache_context ssl_cache_context; +typedef struct _ssl_cache_entry ssl_cache_entry; + +/** + * \brief This structure is used for storing cache entries + */ +struct _ssl_cache_entry +{ + time_t timestamp; /*!< entry timestamp */ + ssl_session session; /*!< entry session */ + x509_buf peer_cert; /*!< entry peer_cert */ + ssl_cache_entry *next; /*!< chain pointer */ +}; + +/** + * \brief Cache context + */ +struct _ssl_cache_context +{ + ssl_cache_entry *chain; /*!< start of the chain */ + int timeout; /*!< cache entry timeout */ + int max_entries; /*!< maximum entries */ +}; + +/** + * \brief Initialize an SSL cache context + * + * \param cache SSL cache context + */ +void ssl_cache_init( ssl_cache_context *cache ); + +/** + * \brief Cache get callback implementation + * + * \param data SSL cache context + * \param session session to retrieve entry for + */ +int ssl_cache_get( void *data, ssl_session *session ); + +/** + * \brief Cache set callback implementation + * + * \param data SSL cache context + * \param session session to store entry for + */ +int ssl_cache_set( void *data, const ssl_session *session ); + +/** + * \brief Set the cache timeout + * (Default: SSL_CACHE_DEFAULT_TIMEOUT (1 day)) + * + * A timeout of 0 indicates no timeout. + * + * \param cache SSL cache context + * \param timeout cache entry timeout + */ +void ssl_cache_set_timeout( ssl_cache_context *cache, int timeout ); + +/** + * \brief Set the cache timeout + * (Default: SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) + * + * \param cache SSL cache context + * \param max cache entry maximum + */ +void ssl_cache_set_max_entries( ssl_cache_context *cache, int max ); + +/** + * \brief Free referenced items in a cache context and clear memory + * + * \param cache SSL cache context + */ +void ssl_cache_free( ssl_cache_context *cache ); + +#ifdef __cplusplus +} +#endif + +#endif /* ssl_cache.h */ diff --git a/Externals/polarssl/include/polarssl/timing.h b/Externals/polarssl/include/polarssl/timing.h new file mode 100644 index 0000000000..355c63c779 --- /dev/null +++ b/Externals/polarssl/include/polarssl/timing.h @@ -0,0 +1,75 @@ +/** + * \file timing.h + * + * \brief Portable interface to the CPU cycle counter + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_TIMING_H +#define POLARSSL_TIMING_H + +/** + * \brief timer structure + */ +struct hr_time +{ + unsigned char opaque[32]; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +extern volatile int alarmed; + +/** + * \brief Return the CPU cycle counter value + */ +unsigned long hardclock( void ); + +/** + * \brief Return the elapsed time in milliseconds + * + * \param val points to a timer structure + * \param reset if set to 1, the timer is restarted + */ +unsigned long get_timer( struct hr_time *val, int reset ); + +/** + * \brief Setup an alarm clock + * + * \param seconds delay before the "alarmed" flag is set + */ +void set_alarm( int seconds ); + +/** + * \brief Sleep for a certain amount of time + * + * \param milliseconds delay in milliseconds + */ +void m_sleep( int milliseconds ); + +#ifdef __cplusplus +} +#endif + +#endif /* timing.h */ diff --git a/Externals/polarssl/include/polarssl/version.h b/Externals/polarssl/include/polarssl/version.h new file mode 100644 index 0000000000..036e2b42bb --- /dev/null +++ b/Externals/polarssl/include/polarssl/version.h @@ -0,0 +1,81 @@ +/** + * \file version.h + * + * \brief Run-time version information + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * This set of compile-time defines and run-time variables can be used to + * determine the version number of the PolarSSL library used. + */ +#ifndef POLARSSL_VERSION_H +#define POLARSSL_VERSION_H + +#include "config.h" + +/** + * The version number x.y.z is split into three parts. + * Major, Minor, Patchlevel + */ +#define POLARSSL_VERSION_MAJOR 1 +#define POLARSSL_VERSION_MINOR 2 +#define POLARSSL_VERSION_PATCH 8 + +/** + * The single version number has the following structure: + * MMNNPP00 + * Major version | Minor version | Patch version + */ +#define POLARSSL_VERSION_NUMBER 0x01020800 +#define POLARSSL_VERSION_STRING "1.2.8" +#define POLARSSL_VERSION_STRING_FULL "PolarSSL 1.2.8" + +#if defined(POLARSSL_VERSION_C) + +/** + * Get the version number. + * + * \return The constructed version number in the format + * MMNNPP00 (Major, Minor, Patch). + */ +unsigned int version_get_number( void ); + +/** + * Get the version string ("x.y.z"). + * + * \param string The string that will receive the value. + * (Should be at least 9 bytes in size) + */ +void version_get_string( char *string ); + +/** + * Get the full version string ("PolarSSL x.y.z"). + * + * \param string The string that will receive the value. + * (Should be at least 18 bytes in size) + */ +void version_get_string_full( char *string ); + +#endif /* POLARSSL_VERSION_C */ + +#endif /* version.h */ diff --git a/Externals/polarssl/include/polarssl/x509.h b/Externals/polarssl/include/polarssl/x509.h new file mode 100644 index 0000000000..6dabf37356 --- /dev/null +++ b/Externals/polarssl/include/polarssl/x509.h @@ -0,0 +1,778 @@ +/** + * \file x509.h + * + * \brief X.509 certificate and private key decoding + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_X509_H +#define POLARSSL_X509_H + +#include "asn1.h" +#include "rsa.h" +#include "dhm.h" + +/** + * \addtogroup x509_module + * \{ + */ + +/** + * \name X509 Error codes + * \{ + */ +#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE -0x2080 /**< Unavailable feature, e.g. RSA hashing/encryption combination. */ +#define POLARSSL_ERR_X509_CERT_INVALID_PEM -0x2100 /**< The PEM-encoded certificate contains invalid elements, e.g. invalid character. */ +#define POLARSSL_ERR_X509_CERT_INVALID_FORMAT -0x2180 /**< The certificate format is invalid, e.g. different type expected. */ +#define POLARSSL_ERR_X509_CERT_INVALID_VERSION -0x2200 /**< The certificate version element is invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_SERIAL -0x2280 /**< The serial tag or value is invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_ALG -0x2300 /**< The algorithm tag or value is invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_NAME -0x2380 /**< The name tag or value is invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_DATE -0x2400 /**< The date tag or value is invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_PUBKEY -0x2480 /**< The pubkey tag or value is invalid (only RSA is supported). */ +#define POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE -0x2500 /**< The signature tag or value invalid. */ +#define POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS -0x2580 /**< The extension tag or value is invalid. */ +#define POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION -0x2600 /**< Certificate or CRL has an unsupported version number. */ +#define POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG -0x2680 /**< Signature algorithm (oid) is unsupported. */ +#define POLARSSL_ERR_X509_UNKNOWN_PK_ALG -0x2700 /**< Key algorithm is unsupported (only RSA is supported). */ +#define POLARSSL_ERR_X509_CERT_SIG_MISMATCH -0x2780 /**< Certificate signature algorithms do not match. (see \c ::x509_cert sig_oid) */ +#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED -0x2800 /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */ +#define POLARSSL_ERR_X509_KEY_INVALID_VERSION -0x2880 /**< Unsupported RSA key version */ +#define POLARSSL_ERR_X509_KEY_INVALID_FORMAT -0x2900 /**< Invalid RSA key tag or value. */ +#define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT -0x2980 /**< Format not recognized as DER or PEM. */ +#define POLARSSL_ERR_X509_INVALID_INPUT -0x2A00 /**< Input invalid. */ +#define POLARSSL_ERR_X509_MALLOC_FAILED -0x2A80 /**< Allocation of memory failed. */ +#define POLARSSL_ERR_X509_FILE_IO_ERROR -0x2B00 /**< Read/write of file failed. */ +#define POLARSSL_ERR_X509_PASSWORD_REQUIRED -0x2B80 /**< Private key password can't be empty. */ +#define POLARSSL_ERR_X509_PASSWORD_MISMATCH -0x2C00 /**< Given private key password does not allow for correct decryption. */ +/* \} name */ + + +/** + * \name X509 Verify codes + * \{ + */ +#define BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ +#define BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ +#define BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ +#define BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ +#define BADCRL_NOT_TRUSTED 0x10 /**< CRL is not correctly signed by the trusted CA. */ +#define BADCRL_EXPIRED 0x20 /**< CRL is expired. */ +#define BADCERT_MISSING 0x40 /**< Certificate was missing. */ +#define BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ +#define BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ +/* \} name */ +/* \} addtogroup x509_module */ + +/* + * various object identifiers + */ +#define X520_COMMON_NAME 3 +#define X520_COUNTRY 6 +#define X520_LOCALITY 7 +#define X520_STATE 8 +#define X520_ORGANIZATION 10 +#define X520_ORG_UNIT 11 +#define PKCS9_EMAIL 1 + +#define X509_OUTPUT_DER 0x01 +#define X509_OUTPUT_PEM 0x02 +#define PEM_LINE_LENGTH 72 +#define X509_ISSUER 0x01 +#define X509_SUBJECT 0x02 + +#define OID_X520 "\x55\x04" +#define OID_CN OID_X520 "\x03" +#define OID_COUNTRY OID_X520 "\x06" +#define OID_LOCALITY OID_X520 "\x07" +#define OID_STATE OID_X520 "\x08" +#define OID_ORGANIZATION OID_X520 "\x0A" +#define OID_ORG_UNIT OID_X520 "\x0B" + +#define OID_PKCS1 "\x2A\x86\x48\x86\xF7\x0D\x01\x01" +#define OID_PKCS1_RSA OID_PKCS1 "\x01" +#define OID_PKCS1_SHA1 OID_PKCS1 "\x05" + +#define OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" + +#define OID_PKCS9 "\x2A\x86\x48\x86\xF7\x0D\x01\x09" +#define OID_PKCS9_EMAIL OID_PKCS9 "\x01" + +/** ISO arc for standard certificate and CRL extensions */ +#define OID_ID_CE "\x55\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ + +/** + * Private Internet Extensions + * { iso(1) identified-organization(3) dod(6) internet(1) + * security(5) mechanisms(5) pkix(7) } + */ +#define OID_PKIX "\x2B\x06\x01\x05\x05\x07" + +/* + * OIDs for standard certificate extensions + */ +#define OID_AUTHORITY_KEY_IDENTIFIER OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ +#define OID_SUBJECT_KEY_IDENTIFIER OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ +#define OID_KEY_USAGE OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ +#define OID_CERTIFICATE_POLICIES OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ +#define OID_POLICY_MAPPINGS OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ +#define OID_SUBJECT_ALT_NAME OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ +#define OID_ISSUER_ALT_NAME OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ +#define OID_SUBJECT_DIRECTORY_ATTRS OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ +#define OID_BASIC_CONSTRAINTS OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ +#define OID_NAME_CONSTRAINTS OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ +#define OID_POLICY_CONSTRAINTS OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ +#define OID_EXTENDED_KEY_USAGE OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ +#define OID_CRL_DISTRIBUTION_POINTS OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ +#define OID_INIHIBIT_ANYPOLICY OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ +#define OID_FRESHEST_CRL OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ + +/* + * X.509 v3 Key Usage Extension flags + */ +#define KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ +#define KU_NON_REPUDIATION (0x40) /* bit 1 */ +#define KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ +#define KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ +#define KU_KEY_AGREEMENT (0x08) /* bit 4 */ +#define KU_KEY_CERT_SIGN (0x04) /* bit 5 */ +#define KU_CRL_SIGN (0x02) /* bit 6 */ + +/* + * X.509 v3 Extended key usage OIDs + */ +#define OID_ANY_EXTENDED_KEY_USAGE OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ + +#define OID_KP OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ +#define OID_SERVER_AUTH OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ +#define OID_CLIENT_AUTH OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ +#define OID_CODE_SIGNING OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ +#define OID_EMAIL_PROTECTION OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ +#define OID_TIME_STAMPING OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ +#define OID_OCSP_SIGNING OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ + +#define STRING_SERVER_AUTH "TLS Web Server Authentication" +#define STRING_CLIENT_AUTH "TLS Web Client Authentication" +#define STRING_CODE_SIGNING "Code Signing" +#define STRING_EMAIL_PROTECTION "E-mail Protection" +#define STRING_TIME_STAMPING "Time Stamping" +#define STRING_OCSP_SIGNING "OCSP Signing" + +/* + * OIDs for CRL extensions + */ +#define OID_PRIVATE_KEY_USAGE_PERIOD OID_ID_CE "\x10" +#define OID_CRL_NUMBER OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ + +/* + * Netscape certificate extensions + */ +#define OID_NETSCAPE "\x60\x86\x48\x01\x86\xF8\x42" /**< Netscape OID */ +#define OID_NS_CERT OID_NETSCAPE "\x01" +#define OID_NS_CERT_TYPE OID_NS_CERT "\x01" +#define OID_NS_BASE_URL OID_NS_CERT "\x02" +#define OID_NS_REVOCATION_URL OID_NS_CERT "\x03" +#define OID_NS_CA_REVOCATION_URL OID_NS_CERT "\x04" +#define OID_NS_RENEWAL_URL OID_NS_CERT "\x07" +#define OID_NS_CA_POLICY_URL OID_NS_CERT "\x08" +#define OID_NS_SSL_SERVER_NAME OID_NS_CERT "\x0C" +#define OID_NS_COMMENT OID_NS_CERT "\x0D" +#define OID_NS_DATA_TYPE OID_NETSCAPE "\x02" +#define OID_NS_CERT_SEQUENCE OID_NS_DATA_TYPE "\x05" + +/* + * Netscape certificate types + * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) + */ + +#define NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ +#define NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ +#define NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ +#define NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ +#define NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ +#define NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ +#define NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ +#define NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ + +#define EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) +#define EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) +#define EXT_KEY_USAGE (1 << 2) +#define EXT_CERTIFICATE_POLICIES (1 << 3) +#define EXT_POLICY_MAPPINGS (1 << 4) +#define EXT_SUBJECT_ALT_NAME (1 << 5) +#define EXT_ISSUER_ALT_NAME (1 << 6) +#define EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) +#define EXT_BASIC_CONSTRAINTS (1 << 8) +#define EXT_NAME_CONSTRAINTS (1 << 9) +#define EXT_POLICY_CONSTRAINTS (1 << 10) +#define EXT_EXTENDED_KEY_USAGE (1 << 11) +#define EXT_CRL_DISTRIBUTION_POINTS (1 << 12) +#define EXT_INIHIBIT_ANYPOLICY (1 << 13) +#define EXT_FRESHEST_CRL (1 << 14) + +#define EXT_NS_CERT_TYPE (1 << 16) + +/* + * Storage format identifiers + * Recognized formats: PEM and DER + */ +#define X509_FORMAT_DER 1 +#define X509_FORMAT_PEM 2 + +/** + * \addtogroup x509_module + * \{ */ + +/** + * \name Structures for parsing X.509 certificates and CRLs + * \{ + */ + +/** + * Type-length-value structure that allows for ASN1 using DER. + */ +typedef asn1_buf x509_buf; + +/** + * Container for ASN1 bit strings. + */ +typedef asn1_bitstring x509_bitstring; + +/** + * Container for ASN1 named information objects. + * It allows for Relative Distinguished Names (e.g. cn=polarssl,ou=code,etc.). + */ +typedef struct _x509_name +{ + x509_buf oid; /**< The object identifier. */ + x509_buf val; /**< The named value. */ + struct _x509_name *next; /**< The next named information object. */ +} +x509_name; + +/** + * Container for a sequence of ASN.1 items + */ +typedef asn1_sequence x509_sequence; + +/** Container for date and time (precision in seconds). */ +typedef struct _x509_time +{ + int year, mon, day; /**< Date. */ + int hour, min, sec; /**< Time. */ +} +x509_time; + +/** + * Container for an X.509 certificate. The certificate may be chained. + */ +typedef struct _x509_cert +{ + x509_buf raw; /**< The raw certificate data (DER). */ + x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ + + int version; /**< The X.509 version. (0=v1, 1=v2, 2=v3) */ + x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ + x509_buf sig_oid1; /**< Signature algorithm, e.g. sha1RSA */ + + x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ + x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ + + x509_name issuer; /**< The parsed issuer data (named information object). */ + x509_name subject; /**< The parsed subject data (named information object). */ + + x509_time valid_from; /**< Start time of certificate validity. */ + x509_time valid_to; /**< End time of certificate validity. */ + + x509_buf pk_oid; /**< Subject public key info. Includes the public key algorithm and the key itself. */ + rsa_context rsa; /**< Container for the RSA context. Only RSA is supported for public keys at this time. */ + + x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ + x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ + x509_buf v3_ext; /**< Optional X.509 v3 extensions. Only Basic Contraints are supported at this time. */ + x509_sequence subject_alt_names; /**< Optional list of Subject Alternative Names (Only dNSName supported). */ + + int ext_types; /**< Bit string containing detected and parsed extensions */ + int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ + int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ + + unsigned char key_usage; /**< Optional key usage extension value: See the values below */ + + x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ + + unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values below */ + + x509_buf sig_oid2; /**< Signature algorithm. Must match sig_oid1. */ + x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ + int sig_alg; /**< Internal representation of the signature algorithm, e.g. SIG_RSA_MD2 */ + + struct _x509_cert *next; /**< Next certificate in the CA-chain. */ +} +x509_cert; + +/** + * Certificate revocation list entry. + * Contains the CA-specific serial numbers and revocation dates. + */ +typedef struct _x509_crl_entry +{ + x509_buf raw; + + x509_buf serial; + + x509_time revocation_date; + + x509_buf entry_ext; + + struct _x509_crl_entry *next; +} +x509_crl_entry; + +/** + * Certificate revocation list structure. + * Every CRL may have multiple entries. + */ +typedef struct _x509_crl +{ + x509_buf raw; /**< The raw certificate data (DER). */ + x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ + + int version; + x509_buf sig_oid1; + + x509_buf issuer_raw; /**< The raw issuer data (DER). */ + + x509_name issuer; /**< The parsed issuer data (named information object). */ + + x509_time this_update; + x509_time next_update; + + x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ + + x509_buf crl_ext; + + x509_buf sig_oid2; + x509_buf sig; + int sig_alg; + + struct _x509_crl *next; +} +x509_crl; +/** \} name Structures for parsing X.509 certificates and CRLs */ +/** \} addtogroup x509_module */ + +/** + * \name Structures for writing X.509 certificates. + * XvP: commented out as they are not used. + * - typedef struct _x509_node x509_node; + * - typedef struct _x509_raw x509_raw; + */ +/* +typedef struct _x509_node +{ + unsigned char *data; + unsigned char *p; + unsigned char *end; + + size_t len; +} +x509_node; + +typedef struct _x509_raw +{ + x509_node raw; + x509_node tbs; + + x509_node version; + x509_node serial; + x509_node tbs_signalg; + x509_node issuer; + x509_node validity; + x509_node subject; + x509_node subpubkey; + + x509_node signalg; + x509_node sign; +} +x509_raw; +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Functions to read in DHM parameters, a certificate, CRL or private RSA key + * \{ + */ + +/** \ingroup x509_module */ +/** + * \brief Parse a single DER formatted certificate and add it + * to the chained list. + * + * \param chain points to the start of the chain + * \param buf buffer holding the certificate DER data + * \param buflen size of the buffer + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_crt_der( x509_cert *chain, const unsigned char *buf, size_t buflen ); + +/** + * \brief Parse one or more certificates and add them + * to the chained list. Parses permissively. If some + * certificates can be parsed, the result is the number + * of failed certificates it encountered. If none complete + * correctly, the first error is returned. + * + * \param chain points to the start of the chain + * \param buf buffer holding the certificate data + * \param buflen size of the buffer + * + * \return 0 if all certificates parsed successfully, a positive number + * if partly successful or a specific X509 or PEM error code + */ +int x509parse_crt( x509_cert *chain, const unsigned char *buf, size_t buflen ); + +/** \ingroup x509_module */ +/** + * \brief Load one or more certificates and add them + * to the chained list. Parses permissively. If some + * certificates can be parsed, the result is the number + * of failed certificates it encountered. If none complete + * correctly, the first error is returned. + * + * \param chain points to the start of the chain + * \param path filename to read the certificates from + * + * \return 0 if all certificates parsed successfully, a positive number + * if partly successful or a specific X509 or PEM error code + */ +int x509parse_crtfile( x509_cert *chain, const char *path ); + +/** \ingroup x509_module */ +/** + * \brief Load one or more certificate files from a path and add them + * to the chained list. Parses permissively. If some + * certificates can be parsed, the result is the number + * of failed certificates it encountered. If none complete + * correctly, the first error is returned. + * + * \param chain points to the start of the chain + * \param path directory / folder to read the certificate files from + * + * \return 0 if all certificates parsed successfully, a positive number + * if partly successful or a specific X509 or PEM error code + */ +int x509parse_crtpath( x509_cert *chain, const char *path ); + +/** \ingroup x509_module */ +/** + * \brief Parse one or more CRLs and add them + * to the chained list + * + * \param chain points to the start of the chain + * \param buf buffer holding the CRL data + * \param buflen size of the buffer + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_crl( x509_crl *chain, const unsigned char *buf, size_t buflen ); + +/** \ingroup x509_module */ +/** + * \brief Load one or more CRLs and add them + * to the chained list + * + * \param chain points to the start of the chain + * \param path filename to read the CRLs from + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_crlfile( x509_crl *chain, const char *path ); + +/** \ingroup x509_module */ +/** + * \brief Parse a private RSA key + * + * \param rsa RSA context to be initialized + * \param key input buffer + * \param keylen size of the buffer + * \param pwd password for decryption (optional) + * \param pwdlen size of the password + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_key( rsa_context *rsa, + const unsigned char *key, size_t keylen, + const unsigned char *pwd, size_t pwdlen ); + +/** \ingroup x509_module */ +/** + * \brief Load and parse a private RSA key + * + * \param rsa RSA context to be initialized + * \param path filename to read the private key from + * \param password password to decrypt the file (can be NULL) + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_keyfile( rsa_context *rsa, const char *path, + const char *password ); + +/** \ingroup x509_module */ +/** + * \brief Parse a public RSA key + * + * \param rsa RSA context to be initialized + * \param key input buffer + * \param keylen size of the buffer + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_public_key( rsa_context *rsa, + const unsigned char *key, size_t keylen ); + +/** \ingroup x509_module */ +/** + * \brief Load and parse a public RSA key + * + * \param rsa RSA context to be initialized + * \param path filename to read the private key from + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_public_keyfile( rsa_context *rsa, const char *path ); + +/** \ingroup x509_module */ +/** + * \brief Parse DHM parameters + * + * \param dhm DHM context to be initialized + * \param dhmin input buffer + * \param dhminlen size of the buffer + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_dhm( dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ); + +/** \ingroup x509_module */ +/** + * \brief Load and parse DHM parameters + * + * \param dhm DHM context to be initialized + * \param path filename to read the DHM Parameters from + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int x509parse_dhmfile( dhm_context *dhm, const char *path ); + +/** \} name Functions to read in DHM parameters, a certificate, CRL or private RSA key */ + +/** + * \brief Store the certificate DN in printable form into buf; + * no more than size characters will be written. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param dn The X509 name to represent + * + * \return The amount of data written to the buffer, or -1 in + * case of an error. + */ +int x509parse_dn_gets( char *buf, size_t size, const x509_name *dn ); + +/** + * \brief Store the certificate serial in printable form into buf; + * no more than size characters will be written. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param serial The X509 serial to represent + * + * \return The amount of data written to the buffer, or -1 in + * case of an error. + */ +int x509parse_serial_gets( char *buf, size_t size, const x509_buf *serial ); + +/** + * \brief Returns an informational string about the + * certificate. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param crt The X509 certificate to represent + * + * \return The amount of data written to the buffer, or -1 in + * case of an error. + */ +int x509parse_cert_info( char *buf, size_t size, const char *prefix, + const x509_cert *crt ); + +/** + * \brief Returns an informational string about the + * CRL. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param crl The X509 CRL to represent + * + * \return The amount of data written to the buffer, or -1 in + * case of an error. + */ +int x509parse_crl_info( char *buf, size_t size, const char *prefix, + const x509_crl *crl ); + +/** + * \brief Give an known OID, return its descriptive string. + * + * \param oid buffer containing the oid + * + * \return Return a string if the OID is known, + * or NULL otherwise. + */ +const char *x509_oid_get_description( x509_buf *oid ); + +/** + * \brief Give an OID, return a string version of its OID number. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param oid Buffer containing the OID + * + * \return The amount of data written to the buffer, or -1 in + * case of an error. + */ +int x509_oid_get_numeric_string( char *buf, size_t size, x509_buf *oid ); + +/** + * \brief Check a given x509_time against the system time and check + * if it is valid. + * + * \param time x509_time to check + * + * \return Return 0 if the x509_time is still valid, + * or 1 otherwise. + */ +int x509parse_time_expired( const x509_time *time ); + +/** + * \name Functions to verify a certificate + * \{ + */ +/** \ingroup x509_module */ +/** + * \brief Verify the certificate signature + * + * The verify callback is a user-supplied callback that + * can clear / modify / add flags for a certificate. If set, + * the verification callback is called for each + * certificate in the chain (from the trust-ca down to the + * presented crt). The parameters for the callback are: + * (void *parameter, x509_cert *crt, int certificate_depth, + * int *flags). With the flags representing current flags for + * that specific certificate and the certificate depth from + * the bottom (Peer cert depth = 0). + * + * All flags left after returning from the callback + * are also returned to the application. The function should + * return 0 for anything but a fatal error. + * + * \param crt a certificate to be verified + * \param trust_ca the trusted CA chain + * \param ca_crl the CRL chain for trusted CA's + * \param cn expected Common Name (can be set to + * NULL if the CN must not be verified) + * \param flags result of the verification + * \param f_vrfy verification function + * \param p_vrfy verification parameter + * + * \return 0 if successful or POLARSSL_ERR_X509_SIG_VERIFY_FAILED, + * in which case *flags will have one or more of + * the following values set: + * BADCERT_EXPIRED -- + * BADCERT_REVOKED -- + * BADCERT_CN_MISMATCH -- + * BADCERT_NOT_TRUSTED + * or another error in case of a fatal error encountered + * during the verification process. + */ +int x509parse_verify( x509_cert *crt, + x509_cert *trust_ca, + x509_crl *ca_crl, + const char *cn, int *flags, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ); + +/** + * \brief Verify the certificate signature + * + * \param crt a certificate to be verified + * \param crl the CRL to verify against + * + * \return 1 if the certificate is revoked, 0 otherwise + * + */ +int x509parse_revoked( const x509_cert *crt, const x509_crl *crl ); + +/** \} name Functions to verify a certificate */ + + + +/** + * \name Functions to clear a certificate, CRL or private RSA key + * \{ + */ +/** \ingroup x509_module */ +/** + * \brief Unallocate all certificate data + * + * \param crt Certificate chain to free + */ +void x509_free( x509_cert *crt ); + +/** \ingroup x509_module */ +/** + * \brief Unallocate all CRL data + * + * \param crl CRL chain to free + */ +void x509_crl_free( x509_crl *crl ); + +/** \} name Functions to clear a certificate, CRL or private RSA key */ + + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int x509_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* x509.h */ diff --git a/Externals/polarssl/include/polarssl/x509write.h b/Externals/polarssl/include/polarssl/x509write.h new file mode 100644 index 0000000000..8ce3d86692 --- /dev/null +++ b/Externals/polarssl/include/polarssl/x509write.h @@ -0,0 +1,46 @@ +/** + * \file x509write.h + * + * \brief X509 buffer writing functionality + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_X509_WRITE_H +#define POLARSSL_X509_WRITE_H + +#include "rsa.h" + +typedef struct _x509_req_name +{ + char oid[128]; + char name[128]; + + struct _x509_req_name *next; +} +x509_req_name; + +int x509_write_pubkey_der( unsigned char *buf, size_t size, rsa_context *rsa ); +int x509_write_key_der( unsigned char *buf, size_t size, rsa_context *rsa ); +int x509_write_cert_req( unsigned char *buf, size_t size, rsa_context *rsa, + x509_req_name *req_name, int hash_id ); + +#endif /* POLARSSL_X509_WRITE_H */ diff --git a/Externals/polarssl/include/polarssl/xtea.h b/Externals/polarssl/include/polarssl/xtea.h new file mode 100644 index 0000000000..c95cb768cc --- /dev/null +++ b/Externals/polarssl/include/polarssl/xtea.h @@ -0,0 +1,129 @@ +/** + * \file xtea.h + * + * \brief XTEA block cipher (32-bit) + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_XTEA_H +#define POLARSSL_XTEA_H + +#include "config.h" + +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +#define XTEA_ENCRYPT 1 +#define XTEA_DECRYPT 0 + +#define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 /**< The data input has an invalid length. */ + +#if !defined(POLARSSL_XTEA_ALT) +// Regular implementation +// + +/** + * \brief XTEA context structure + */ +typedef struct +{ + uint32_t k[4]; /*!< key */ +} +xtea_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief XTEA key schedule + * + * \param ctx XTEA context to be initialized + * \param key the secret key + */ +void xtea_setup( xtea_context *ctx, unsigned char key[16] ); + +/** + * \brief XTEA cipher function + * + * \param ctx XTEA context + * \param mode XTEA_ENCRYPT or XTEA_DECRYPT + * \param input 8-byte input block + * \param output 8-byte output block + * + * \return 0 if successful + */ +int xtea_crypt_ecb( xtea_context *ctx, + int mode, + unsigned char input[8], + unsigned char output[8] ); + +/** + * \brief XTEA CBC cipher function + * + * \param ctx XTEA context + * \param mode XTEA_ENCRYPT or XTEA_DECRYPT + * \param length the length of input, multiple of 8 + * \param iv initialization vector for CBC mode + * \param input input block + * \param output output block + * + * \return 0 if successful, + * POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 + */ +int xtea_crypt_cbc( xtea_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + unsigned char *input, + unsigned char *output); + +#ifdef __cplusplus +} +#endif + +#else /* POLARSSL_XTEA_ALT */ +#include "xtea_alt.h" +#endif /* POLARSSL_XTEA_ALT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int xtea_self_test( int verbose ); + +#ifdef __cplusplus +} +#endif + +#endif /* xtea.h */ diff --git a/Externals/polarssl/library/.gitignore b/Externals/polarssl/library/.gitignore new file mode 100644 index 0000000000..9d80fa47a8 --- /dev/null +++ b/Externals/polarssl/library/.gitignore @@ -0,0 +1,2 @@ +*.o +libpolarssl* diff --git a/Externals/polarssl/library/CMakeLists.txt b/Externals/polarssl/library/CMakeLists.txt new file mode 100644 index 0000000000..8cf055e950 --- /dev/null +++ b/Externals/polarssl/library/CMakeLists.txt @@ -0,0 +1,70 @@ +option(USE_SHARED_POLARSSL_LIBRARY "Build PolarSSL as a shared library." OFF) + +set(src + aes.c + arc4.c + asn1parse.c + asn1write.c + base64.c + bignum.c + blowfish.c + camellia.c + certs.c + cipher.c + cipher_wrap.c + ctr_drbg.c + debug.c + des.c + dhm.c + entropy.c + entropy_poll.c + error.c + gcm.c + havege.c + md.c + md_wrap.c + md2.c + md4.c + md5.c + net.c + padlock.c + pbkdf2.c + pem.c + pkcs5.c + pkcs11.c + pkcs12.c + rsa.c + sha1.c + sha2.c + sha4.c + ssl_cache.c + ssl_cli.c + ssl_srv.c + ssl_tls.c + timing.c + version.c + x509parse.c + x509write.c + xtea.c +) + +if(WIN32) +set(libs ws2_32) +endif(WIN32) + +if(NOT USE_SHARED_POLARSSL_LIBRARY) + +add_library(polarssl STATIC ${src}) + +else(NOT USE_SHARED_POLARSSL_LIBRARY) + +add_library(polarssl SHARED ${src}) +set_target_properties(polarssl PROPERTIES VERSION 1.2.8 SOVERSION 2) + +endif(NOT USE_SHARED_POLARSSL_LIBRARY) + +target_link_libraries(polarssl ${libs}) + +install(TARGETS polarssl + DESTINATION ${LIB_INSTALL_DIR} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/Externals/polarssl/library/aes.c b/Externals/polarssl/library/aes.c new file mode 100644 index 0000000000..6456c54d19 --- /dev/null +++ b/Externals/polarssl/library/aes.c @@ -0,0 +1,1352 @@ +/* + * FIPS-197 compliant AES implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. + * + * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf + * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_AES_C) + +#include "polarssl/aes.h" +#if defined(POLARSSL_PADLOCK_C) +#include "polarssl/padlock.h" +#endif + +#if !defined(POLARSSL_AES_ALT) + +/* + * 32-bit integer manipulation macros (little endian) + */ +#ifndef GET_UINT32_LE +#define GET_UINT32_LE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] ) \ + | ( (uint32_t) (b)[(i) + 1] << 8 ) \ + | ( (uint32_t) (b)[(i) + 2] << 16 ) \ + | ( (uint32_t) (b)[(i) + 3] << 24 ); \ +} +#endif + +#ifndef PUT_UINT32_LE +#define PUT_UINT32_LE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ +} +#endif + +#if defined(POLARSSL_PADLOCK_C) && \ + ( defined(POLARSSL_HAVE_X86) || defined(PADLOCK_ALIGN16) ) +static int aes_padlock_ace = -1; +#endif + +#if defined(POLARSSL_AES_ROM_TABLES) +/* + * Forward S-box + */ +static const unsigned char FSb[256] = +{ + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, + 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, + 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, + 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, + 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, + 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, + 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, + 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, + 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, + 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, + 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, + 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 +}; + +/* + * Forward tables + */ +#define FT \ +\ + V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \ + V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \ + V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \ + V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \ + V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \ + V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \ + V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \ + V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \ + V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \ + V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \ + V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \ + V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \ + V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \ + V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \ + V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \ + V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \ + V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \ + V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \ + V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \ + V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \ + V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \ + V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \ + V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \ + V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \ + V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \ + V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \ + V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \ + V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \ + V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \ + V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \ + V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \ + V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \ + V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \ + V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \ + V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \ + V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \ + V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \ + V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \ + V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \ + V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \ + V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \ + V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \ + V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \ + V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \ + V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \ + V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \ + V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \ + V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \ + V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \ + V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \ + V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \ + V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \ + V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \ + V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \ + V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \ + V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \ + V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \ + V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \ + V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \ + V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \ + V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \ + V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \ + V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \ + V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C) + +#define V(a,b,c,d) 0x##a##b##c##d +static const uint32_t FT0[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##b##c##d##a +static const uint32_t FT1[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##c##d##a##b +static const uint32_t FT2[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##d##a##b##c +static const uint32_t FT3[256] = { FT }; +#undef V + +#undef FT + +/* + * Reverse S-box + */ +static const unsigned char RSb[256] = +{ + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, + 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, + 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, + 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, + 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, + 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, + 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, + 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, + 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, + 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, + 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, + 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D +}; + +/* + * Reverse tables + */ +#define RT \ +\ + V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \ + V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \ + V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \ + V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \ + V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \ + V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \ + V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \ + V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \ + V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \ + V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \ + V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \ + V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \ + V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \ + V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \ + V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \ + V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \ + V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \ + V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \ + V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \ + V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \ + V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \ + V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \ + V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \ + V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \ + V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \ + V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \ + V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \ + V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \ + V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \ + V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \ + V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \ + V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \ + V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \ + V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \ + V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \ + V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \ + V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \ + V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \ + V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \ + V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \ + V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \ + V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \ + V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \ + V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \ + V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \ + V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \ + V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \ + V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \ + V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \ + V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \ + V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \ + V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \ + V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \ + V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \ + V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \ + V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \ + V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \ + V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \ + V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \ + V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \ + V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \ + V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \ + V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \ + V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0) + +#define V(a,b,c,d) 0x##a##b##c##d +static const uint32_t RT0[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##b##c##d##a +static const uint32_t RT1[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##c##d##a##b +static const uint32_t RT2[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##d##a##b##c +static const uint32_t RT3[256] = { RT }; +#undef V + +#undef RT + +/* + * Round constants + */ +static const uint32_t RCON[10] = +{ + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x0000001B, 0x00000036 +}; + +#else + +/* + * Forward S-box & tables + */ +static unsigned char FSb[256]; +static uint32_t FT0[256]; +static uint32_t FT1[256]; +static uint32_t FT2[256]; +static uint32_t FT3[256]; + +/* + * Reverse S-box & tables + */ +static unsigned char RSb[256]; +static uint32_t RT0[256]; +static uint32_t RT1[256]; +static uint32_t RT2[256]; +static uint32_t RT3[256]; + +/* + * Round constants + */ +static uint32_t RCON[10]; + +/* + * Tables generation code + */ +#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) +#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) +#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) + +static int aes_init_done = 0; + +static void aes_gen_tables( void ) +{ + int i, x, y, z; + int pow[256]; + int log[256]; + + /* + * compute pow and log tables over GF(2^8) + */ + for( i = 0, x = 1; i < 256; i++ ) + { + pow[i] = x; + log[x] = i; + x = ( x ^ XTIME( x ) ) & 0xFF; + } + + /* + * calculate the round constants + */ + for( i = 0, x = 1; i < 10; i++ ) + { + RCON[i] = (uint32_t) x; + x = XTIME( x ) & 0xFF; + } + + /* + * generate the forward and reverse S-boxes + */ + FSb[0x00] = 0x63; + RSb[0x63] = 0x00; + + for( i = 1; i < 256; i++ ) + { + x = pow[255 - log[i]]; + + y = x; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y; y = ( (y << 1) | (y >> 7) ) & 0xFF; + x ^= y ^ 0x63; + + FSb[i] = (unsigned char) x; + RSb[x] = (unsigned char) i; + } + + /* + * generate the forward and reverse tables + */ + for( i = 0; i < 256; i++ ) + { + x = FSb[i]; + y = XTIME( x ) & 0xFF; + z = ( y ^ x ) & 0xFF; + + FT0[i] = ( (uint32_t) y ) ^ + ( (uint32_t) x << 8 ) ^ + ( (uint32_t) x << 16 ) ^ + ( (uint32_t) z << 24 ); + + FT1[i] = ROTL8( FT0[i] ); + FT2[i] = ROTL8( FT1[i] ); + FT3[i] = ROTL8( FT2[i] ); + + x = RSb[i]; + + RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^ + ( (uint32_t) MUL( 0x09, x ) << 8 ) ^ + ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^ + ( (uint32_t) MUL( 0x0B, x ) << 24 ); + + RT1[i] = ROTL8( RT0[i] ); + RT2[i] = ROTL8( RT1[i] ); + RT3[i] = ROTL8( RT2[i] ); + } +} + +#endif + +/* + * AES key schedule (encryption) + */ +int aes_setkey_enc( aes_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + unsigned int i; + uint32_t *RK; + +#if !defined(POLARSSL_AES_ROM_TABLES) + if( aes_init_done == 0 ) + { + aes_gen_tables(); + aes_init_done = 1; + + } +#endif + + switch( keysize ) + { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default : return( POLARSSL_ERR_AES_INVALID_KEY_LENGTH ); + } + +#if defined(POLARSSL_PADLOCK_C) && defined(PADLOCK_ALIGN16) + if( aes_padlock_ace == -1 ) + aes_padlock_ace = padlock_supports( PADLOCK_ACE ); + + if( aes_padlock_ace ) + ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); + else +#endif + ctx->rk = RK = ctx->buf; + + for( i = 0; i < (keysize >> 5); i++ ) + { + GET_UINT32_LE( RK[i], key, i << 2 ); + } + + switch( ctx->nr ) + { + case 10: + + for( i = 0; i < 10; i++, RK += 4 ) + { + RK[4] = RK[0] ^ RCON[i] ^ + ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 ); + + RK[5] = RK[1] ^ RK[4]; + RK[6] = RK[2] ^ RK[5]; + RK[7] = RK[3] ^ RK[6]; + } + break; + + case 12: + + for( i = 0; i < 8; i++, RK += 6 ) + { + RK[6] = RK[0] ^ RCON[i] ^ + ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 ); + + RK[7] = RK[1] ^ RK[6]; + RK[8] = RK[2] ^ RK[7]; + RK[9] = RK[3] ^ RK[8]; + RK[10] = RK[4] ^ RK[9]; + RK[11] = RK[5] ^ RK[10]; + } + break; + + case 14: + + for( i = 0; i < 7; i++, RK += 8 ) + { + RK[8] = RK[0] ^ RCON[i] ^ + ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 ); + + RK[9] = RK[1] ^ RK[8]; + RK[10] = RK[2] ^ RK[9]; + RK[11] = RK[3] ^ RK[10]; + + RK[12] = RK[4] ^ + ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 ); + + RK[13] = RK[5] ^ RK[12]; + RK[14] = RK[6] ^ RK[13]; + RK[15] = RK[7] ^ RK[14]; + } + break; + + default: + + break; + } + + return( 0 ); +} + +/* + * AES key schedule (decryption) + */ +int aes_setkey_dec( aes_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + int i, j; + aes_context cty; + uint32_t *RK; + uint32_t *SK; + int ret; + + switch( keysize ) + { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default : return( POLARSSL_ERR_AES_INVALID_KEY_LENGTH ); + } + +#if defined(POLARSSL_PADLOCK_C) && defined(PADLOCK_ALIGN16) + if( aes_padlock_ace == -1 ) + aes_padlock_ace = padlock_supports( PADLOCK_ACE ); + + if( aes_padlock_ace ) + ctx->rk = RK = PADLOCK_ALIGN16( ctx->buf ); + else +#endif + ctx->rk = RK = ctx->buf; + + ret = aes_setkey_enc( &cty, key, keysize ); + if( ret != 0 ) + return( ret ); + + SK = cty.rk + cty.nr * 4; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 ) + { + for( j = 0; j < 4; j++, SK++ ) + { + *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^ + RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^ + RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^ + RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ]; + } + } + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + memset( &cty, 0, sizeof( aes_context ) ); + + return( 0 ); +} + +#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \ + FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y3 >> 24 ) & 0xFF ]; \ + \ + X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \ + FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y0 >> 24 ) & 0xFF ]; \ + \ + X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \ + FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y1 >> 24 ) & 0xFF ]; \ + \ + X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \ + FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ + FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ + FT3[ ( Y2 >> 24 ) & 0xFF ]; \ +} + +#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \ + RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y1 >> 24 ) & 0xFF ]; \ + \ + X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \ + RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y2 >> 24 ) & 0xFF ]; \ + \ + X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \ + RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y3 >> 24 ) & 0xFF ]; \ + \ + X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \ + RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \ + RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \ + RT3[ ( Y0 >> 24 ) & 0xFF ]; \ +} + +/* + * AES-ECB block encryption/decryption + */ +int aes_crypt_ecb( aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ) +{ + int i; + uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; + +#if defined(POLARSSL_PADLOCK_C) && defined(POLARSSL_HAVE_X86) + if( aes_padlock_ace ) + { + if( padlock_xcryptecb( ctx, mode, input, output ) == 0 ) + return( 0 ); + + // If padlock data misaligned, we just fall back to + // unaccelerated mode + // + } +#endif + + RK = ctx->rk; + + GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; + GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; + GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; + GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; + + if( mode == AES_DECRYPT ) + { + for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) + { + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); + } + + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + + X0 = *RK++ ^ \ + ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^ + ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); + + X1 = *RK++ ^ \ + ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^ + ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); + + X2 = *RK++ ^ \ + ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^ + ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); + + X3 = *RK++ ^ \ + ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^ + ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); + } + else /* AES_ENCRYPT */ + { + for( i = (ctx->nr >> 1) - 1; i > 0; i-- ) + { + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); + } + + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); + + X0 = *RK++ ^ \ + ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); + + X1 = *RK++ ^ \ + ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); + + X2 = *RK++ ^ \ + ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); + + X3 = *RK++ ^ \ + ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^ + ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ + ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ + ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); + } + + PUT_UINT32_LE( X0, output, 0 ); + PUT_UINT32_LE( X1, output, 4 ); + PUT_UINT32_LE( X2, output, 8 ); + PUT_UINT32_LE( X3, output, 12 ); + + return( 0 ); +} + +/* + * AES-CBC buffer encryption/decryption + */ +int aes_crypt_cbc( aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[16]; + + if( length % 16 ) + return( POLARSSL_ERR_AES_INVALID_INPUT_LENGTH ); + +#if defined(POLARSSL_PADLOCK_C) && defined(POLARSSL_HAVE_X86) + if( aes_padlock_ace ) + { + if( padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 ) + return( 0 ); + + // If padlock data misaligned, we just fall back to + // unaccelerated mode + // + } +#endif + + if( mode == AES_DECRYPT ) + { + while( length > 0 ) + { + memcpy( temp, input, 16 ); + aes_crypt_ecb( ctx, mode, input, output ); + + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + else + { + while( length > 0 ) + { + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + aes_crypt_ecb( ctx, mode, output, output ); + memcpy( iv, output, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + + return( 0 ); +} + +#if defined(POLARSSL_CIPHER_MODE_CFB) +/* + * AES-CFB128 buffer encryption/decryption + */ +int aes_crypt_cfb128( aes_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int c; + size_t n = *iv_off; + + if( mode == AES_DECRYPT ) + { + while( length-- ) + { + if( n == 0 ) + aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); + + c = *input++; + *output++ = (unsigned char)( c ^ iv[n] ); + iv[n] = (unsigned char) c; + + n = (n + 1) & 0x0F; + } + } + else + { + while( length-- ) + { + if( n == 0 ) + aes_crypt_ecb( ctx, AES_ENCRYPT, iv, iv ); + + iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; + + return( 0 ); +} +#endif /*POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +/* + * AES-CTR buffer encryption/decryption + */ +int aes_crypt_ctr( aes_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output ) +{ + int c, i; + size_t n = *nc_off; + + while( length-- ) + { + if( n == 0 ) { + aes_crypt_ecb( ctx, AES_ENCRYPT, nonce_counter, stream_block ); + + for( i = 16; i > 0; i-- ) + if( ++nonce_counter[i - 1] != 0 ) + break; + } + c = *input++; + *output++ = (unsigned char)( c ^ stream_block[n] ); + + n = (n + 1) & 0x0F; + } + + *nc_off = n; + + return( 0 ); +} +#endif /* POLARSSL_CIPHER_MODE_CTR */ +#endif /* !POLARSSL_AES_ALT */ + +#if defined(POLARSSL_SELF_TEST) + +#include + +/* + * AES test vectors from: + * + * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip + */ +static const unsigned char aes_test_ecb_dec[3][16] = +{ + { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, + 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 }, + { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, + 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 }, + { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, + 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE } +}; + +static const unsigned char aes_test_ecb_enc[3][16] = +{ + { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, + 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F }, + { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, + 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 }, + { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, + 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 } +}; + +static const unsigned char aes_test_cbc_dec[3][16] = +{ + { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, + 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 }, + { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, + 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B }, + { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, + 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 } +}; + +static const unsigned char aes_test_cbc_enc[3][16] = +{ + { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, + 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D }, + { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, + 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 }, + { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, + 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 } +}; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +/* + * AES-CFB128 test vectors from: + * + * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + */ +static const unsigned char aes_test_cfb128_key[3][32] = +{ + { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, + { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, + 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, + 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, + { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, + 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, + 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, + 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } +}; + +static const unsigned char aes_test_cfb128_iv[16] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F +}; + +static const unsigned char aes_test_cfb128_pt[64] = +{ + 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, + 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, + 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, + 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, + 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, + 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, + 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, + 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 +}; + +static const unsigned char aes_test_cfb128_ct[3][64] = +{ + { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, + 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, + 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F, + 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B, + 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40, + 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF, + 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E, + 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 }, + { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, + 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, + 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21, + 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A, + 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1, + 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9, + 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0, + 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF }, + { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, + 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, + 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8, + 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B, + 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92, + 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9, + 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8, + 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 } +}; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +/* + * AES-CTR test vectors from: + * + * http://www.faqs.org/rfcs/rfc3686.html + */ + +static const unsigned char aes_test_ctr_key[3][16] = +{ + { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, + 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, + { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, + 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, + { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, + 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } +}; + +static const unsigned char aes_test_ctr_nonce_counter[3][16] = +{ + { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, + 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, + 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } +}; + +static const unsigned char aes_test_ctr_pt[3][48] = +{ + { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, + 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23 } +}; + +static const unsigned char aes_test_ctr_ct[3][48] = +{ + { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, + 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 }, + { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, + 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, + 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, + 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 }, + { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9, + 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7, + 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36, + 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53, + 0x25, 0xB2, 0x07, 0x2F } +}; + +static const int aes_test_ctr_len[3] = + { 16, 32, 36 }; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +/* + * Checkup routine + */ +int aes_self_test( int verbose ) +{ + int i, j, u, v; + unsigned char key[32]; + unsigned char buf[64]; + unsigned char prv[16]; + unsigned char iv[16]; +#if defined(POLARSSL_CIPHER_MODE_CTR) || defined(POLARSSL_CIPHER_MODE_CFB) + size_t offset; +#endif +#if defined(POLARSSL_CIPHER_MODE_CTR) + int len; + unsigned char nonce_counter[16]; + unsigned char stream_block[16]; +#endif + aes_context ctx; + + memset( key, 0, 32 ); + + /* + * ECB mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " AES-ECB-%3d (%s): ", 128 + u * 64, + ( v == AES_DECRYPT ) ? "dec" : "enc" ); + + memset( buf, 0, 16 ); + + if( v == AES_DECRYPT ) + { + aes_setkey_dec( &ctx, key, 128 + u * 64 ); + + for( j = 0; j < 10000; j++ ) + aes_crypt_ecb( &ctx, v, buf, buf ); + + if( memcmp( buf, aes_test_ecb_dec[u], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + else + { + aes_setkey_enc( &ctx, key, 128 + u * 64 ); + + for( j = 0; j < 10000; j++ ) + aes_crypt_ecb( &ctx, v, buf, buf ); + + if( memcmp( buf, aes_test_ecb_enc[u], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + /* + * CBC mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " AES-CBC-%3d (%s): ", 128 + u * 64, + ( v == AES_DECRYPT ) ? "dec" : "enc" ); + + memset( iv , 0, 16 ); + memset( prv, 0, 16 ); + memset( buf, 0, 16 ); + + if( v == AES_DECRYPT ) + { + aes_setkey_dec( &ctx, key, 128 + u * 64 ); + + for( j = 0; j < 10000; j++ ) + aes_crypt_cbc( &ctx, v, 16, iv, buf, buf ); + + if( memcmp( buf, aes_test_cbc_dec[u], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + else + { + aes_setkey_enc( &ctx, key, 128 + u * 64 ); + + for( j = 0; j < 10000; j++ ) + { + unsigned char tmp[16]; + + aes_crypt_cbc( &ctx, v, 16, iv, buf, buf ); + + memcpy( tmp, prv, 16 ); + memcpy( prv, buf, 16 ); + memcpy( buf, tmp, 16 ); + } + + if( memcmp( prv, aes_test_cbc_enc[u], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + +#if defined(POLARSSL_CIPHER_MODE_CFB) + /* + * CFB128 mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " AES-CFB128-%3d (%s): ", 128 + u * 64, + ( v == AES_DECRYPT ) ? "dec" : "enc" ); + + memcpy( iv, aes_test_cfb128_iv, 16 ); + memcpy( key, aes_test_cfb128_key[u], 16 + u * 8 ); + + offset = 0; + aes_setkey_enc( &ctx, key, 128 + u * 64 ); + + if( v == AES_DECRYPT ) + { + memcpy( buf, aes_test_cfb128_ct[u], 64 ); + aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf ); + + if( memcmp( buf, aes_test_cfb128_pt, 64 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + else + { + memcpy( buf, aes_test_cfb128_pt, 64 ); + aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf ); + + if( memcmp( buf, aes_test_cfb128_ct[u], 64 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + /* + * CTR mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " AES-CTR-128 (%s): ", + ( v == AES_DECRYPT ) ? "dec" : "enc" ); + + memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 ); + memcpy( key, aes_test_ctr_key[u], 16 ); + + offset = 0; + aes_setkey_enc( &ctx, key, 128 ); + + if( v == AES_DECRYPT ) + { + len = aes_test_ctr_len[u]; + memcpy( buf, aes_test_ctr_ct[u], len ); + + aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); + + if( memcmp( buf, aes_test_ctr_pt[u], len ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + else + { + len = aes_test_ctr_len[u]; + memcpy( buf, aes_test_ctr_pt[u], len ); + + aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); + + if( memcmp( buf, aes_test_ctr_ct[u], len ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); +#endif /* POLARSSL_CIPHER_MODE_CTR */ + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/arc4.c b/Externals/polarssl/library/arc4.c new file mode 100644 index 0000000000..85b78f5ba5 --- /dev/null +++ b/Externals/polarssl/library/arc4.c @@ -0,0 +1,173 @@ +/* + * An implementation of the ARCFOUR algorithm + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The ARCFOUR algorithm was publicly disclosed on 94/09. + * + * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0 + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ARC4_C) + +#include "polarssl/arc4.h" + +#if !defined(POLARSSL_ARC4_ALT) + +/* + * ARC4 key schedule + */ +void arc4_setup( arc4_context *ctx, const unsigned char *key, unsigned int keylen ) +{ + int i, j, a; + unsigned int k; + unsigned char *m; + + ctx->x = 0; + ctx->y = 0; + m = ctx->m; + + for( i = 0; i < 256; i++ ) + m[i] = (unsigned char) i; + + j = k = 0; + + for( i = 0; i < 256; i++, k++ ) + { + if( k >= keylen ) k = 0; + + a = m[i]; + j = ( j + a + key[k] ) & 0xFF; + m[i] = m[j]; + m[j] = (unsigned char) a; + } +} + +/* + * ARC4 cipher function + */ +int arc4_crypt( arc4_context *ctx, size_t length, const unsigned char *input, + unsigned char *output ) +{ + int x, y, a, b; + size_t i; + unsigned char *m; + + x = ctx->x; + y = ctx->y; + m = ctx->m; + + for( i = 0; i < length; i++ ) + { + x = ( x + 1 ) & 0xFF; a = m[x]; + y = ( y + a ) & 0xFF; b = m[y]; + + m[x] = (unsigned char) b; + m[y] = (unsigned char) a; + + output[i] = (unsigned char) + ( input[i] ^ m[(unsigned char)( a + b )] ); + } + + ctx->x = x; + ctx->y = y; + + return( 0 ); +} + +#endif /* !POLARSSL_ARC4_ALT */ + +#if defined(POLARSSL_SELF_TEST) + +#include +#include + +/* + * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994: + * + * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0 + */ +static const unsigned char arc4_test_key[3][8] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char arc4_test_pt[3][8] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char arc4_test_ct[3][8] = +{ + { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 }, + { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 }, + { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A } +}; + +/* + * Checkup routine + */ +int arc4_self_test( int verbose ) +{ + int i; + unsigned char ibuf[8]; + unsigned char obuf[8]; + arc4_context ctx; + + for( i = 0; i < 3; i++ ) + { + if( verbose != 0 ) + printf( " ARC4 test #%d: ", i + 1 ); + + memcpy( ibuf, arc4_test_pt[i], 8 ); + + arc4_setup( &ctx, arc4_test_key[i], 8 ); + arc4_crypt( &ctx, 8, ibuf, obuf ); + + if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/asn1parse.c b/Externals/polarssl/library/asn1parse.c new file mode 100644 index 0000000000..2584774a77 --- /dev/null +++ b/Externals/polarssl/library/asn1parse.c @@ -0,0 +1,260 @@ +/* + * Generic ASN.1 parsing + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ASN1_PARSE_C) + +#include "polarssl/asn1.h" + +#if defined(POLARSSL_BIGNUM_C) +#include "polarssl/bignum.h" +#endif + +#include +#include +#include + +/* + * ASN.1 DER decoding routines + */ +int asn1_get_len( unsigned char **p, + const unsigned char *end, + size_t *len ) +{ + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + if( ( **p & 0x80 ) == 0 ) + *len = *(*p)++; + else + { + switch( **p & 0x7F ) + { + case 1: + if( ( end - *p ) < 2 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + *len = (*p)[1]; + (*p) += 2; + break; + + case 2: + if( ( end - *p ) < 3 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + *len = ( (*p)[1] << 8 ) | (*p)[2]; + (*p) += 3; + break; + + case 3: + if( ( end - *p ) < 4 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + *len = ( (*p)[1] << 16 ) | ( (*p)[2] << 8 ) | (*p)[3]; + (*p) += 4; + break; + + case 4: + if( ( end - *p ) < 5 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + *len = ( (*p)[1] << 24 ) | ( (*p)[2] << 16 ) | ( (*p)[3] << 8 ) | (*p)[4]; + (*p) += 5; + break; + + default: + return( POLARSSL_ERR_ASN1_INVALID_LENGTH ); + } + } + + if( *len > (size_t) ( end - *p ) ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + return( 0 ); +} + +int asn1_get_tag( unsigned char **p, + const unsigned char *end, + size_t *len, int tag ) +{ + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + if( **p != tag ) + return( POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); + + (*p)++; + + return( asn1_get_len( p, end, len ) ); +} + +int asn1_get_bool( unsigned char **p, + const unsigned char *end, + int *val ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, ASN1_BOOLEAN ) ) != 0 ) + return( ret ); + + if( len != 1 ) + return( POLARSSL_ERR_ASN1_INVALID_LENGTH ); + + *val = ( **p != 0 ) ? 1 : 0; + (*p)++; + + return( 0 ); +} + +int asn1_get_int( unsigned char **p, + const unsigned char *end, + int *val ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 ) + return( ret ); + + if( len > sizeof( int ) || ( **p & 0x80 ) != 0 ) + return( POLARSSL_ERR_ASN1_INVALID_LENGTH ); + + *val = 0; + + while( len-- > 0 ) + { + *val = ( *val << 8 ) | **p; + (*p)++; + } + + return( 0 ); +} + +#if defined(POLARSSL_BIGNUM_C) +int asn1_get_mpi( unsigned char **p, + const unsigned char *end, + mpi *X ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 ) + return( ret ); + + ret = mpi_read_binary( X, *p, len ); + + *p += len; + + return( ret ); +} +#endif /* POLARSSL_BIGNUM_C */ + +int asn1_get_bitstring( unsigned char **p, const unsigned char *end, + asn1_bitstring *bs) +{ + int ret; + + /* Certificate type is a single byte bitstring */ + if( ( ret = asn1_get_tag( p, end, &bs->len, ASN1_BIT_STRING ) ) != 0 ) + return( ret ); + + /* Check length, subtract one for actual bit string length */ + if ( bs->len < 1 ) + return( POLARSSL_ERR_ASN1_OUT_OF_DATA ); + bs->len -= 1; + + /* Get number of unused bits, ensure unused bits <= 7 */ + bs->unused_bits = **p; + if( bs->unused_bits > 7 ) + return( POLARSSL_ERR_ASN1_INVALID_LENGTH ); + (*p)++; + + /* Get actual bitstring */ + bs->p = *p; + *p += bs->len; + + if( *p != end ) + return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return 0; +} + + +/* + * Parses and splits an ASN.1 "SEQUENCE OF " + */ +int asn1_get_sequence_of( unsigned char **p, + const unsigned char *end, + asn1_sequence *cur, + int tag) +{ + int ret; + size_t len; + asn1_buf *buf; + + /* Get main sequence tag */ + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( ret ); + + if( *p + len != end ) + return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + while( *p < end ) + { + buf = &(cur->buf); + buf->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &buf->len, tag ) ) != 0 ) + return( ret ); + + buf->p = *p; + *p += buf->len; + + /* Allocate and assign next pointer */ + if (*p < end) + { + cur->next = (asn1_sequence *) malloc( + sizeof( asn1_sequence ) ); + + if( cur->next == NULL ) + return( POLARSSL_ERR_ASN1_MALLOC_FAILED ); + + cur = cur->next; + } + } + + /* Set final sequence entry's next pointer to NULL */ + cur->next = NULL; + + if( *p != end ) + return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +#endif diff --git a/Externals/polarssl/library/asn1write.c b/Externals/polarssl/library/asn1write.c new file mode 100644 index 0000000000..e50c17c581 --- /dev/null +++ b/Externals/polarssl/library/asn1write.c @@ -0,0 +1,241 @@ +/* + * ASN.1 buffer writing functionality + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ASN1_WRITE_C) + +#include "polarssl/asn1write.h" + +int asn1_write_len( unsigned char **p, unsigned char *start, size_t len ) +{ + if( len < 0x80 ) + { + if( *p - start < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--(*p) = len; + return( 1 ); + } + + if( len <= 0xFF ) + { + if( *p - start < 2 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--(*p) = len; + *--(*p) = 0x81; + return( 2 ); + } + + if( *p - start < 3 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + // We assume we never have lengths larger than 65535 bytes + // + *--(*p) = len % 256; + *--(*p) = ( len / 256 ) % 256; + *--(*p) = 0x82; + + return( 3 ); +} + +int asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ) +{ + if( *p - start < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--(*p) = tag; + + return( 1 ); +} + +int asn1_write_mpi( unsigned char **p, unsigned char *start, mpi *X ) +{ + int ret; + size_t len = 0; + + // Write the MPI + // + len = mpi_size( X ); + + if( *p - start < (int) len ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + (*p) -= len; + mpi_write_binary( X, *p, len ); + + // DER format assumes 2s complement for numbers, so the leftmost bit + // should be 0 for positive numbers and 1 for negative numbers. + // + if ( X->s ==1 && **p & 0x80 ) + { + if( *p - start < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--(*p) = 0x00; + len += 1; + } + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_INTEGER ) ); + + return( len ); +} + +int asn1_write_null( unsigned char **p, unsigned char *start ) +{ + int ret; + size_t len = 0; + + // Write NULL + // + ASN1_CHK_ADD( len, asn1_write_len( p, start, 0) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_NULL ) ); + + return( len ); +} + +int asn1_write_oid( unsigned char **p, unsigned char *start, char *oid ) +{ + int ret; + size_t len = 0; + + // Write OID + // + len = strlen( oid ); + + if( *p - start < (int) len ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + (*p) -= len; + memcpy( *p, oid, len ); + + ASN1_CHK_ADD( len , asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len , asn1_write_tag( p, start, ASN1_OID ) ); + + return( len ); +} + +int asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, + char *algorithm_oid ) +{ + int ret; + size_t null_len = 0; + size_t oid_len = 0; + size_t len = 0; + + // Write NULL + // + ASN1_CHK_ADD( null_len, asn1_write_null( p, start ) ); + + // Write OID + // + ASN1_CHK_ADD( oid_len, asn1_write_oid( p, start, algorithm_oid ) ); + + len = oid_len + null_len; + ASN1_CHK_ADD( len, asn1_write_len( p, start, oid_len + null_len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + return( len ); +} + +int asn1_write_int( unsigned char **p, unsigned char *start, int val ) +{ + int ret; + size_t len = 0; + + // TODO negative values and values larger than 128 + // DER format assumes 2s complement for numbers, so the leftmost bit + // should be 0 for positive numbers and 1 for negative numbers. + // + if( *p - start < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + len += 1; + *--(*p) = val; + + if ( val > 0 && **p & 0x80 ) + { + if( *p - start < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--(*p) = 0x00; + len += 1; + } + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_INTEGER ) ); + + return( len ); +} + +int asn1_write_printable_string( unsigned char **p, unsigned char *start, + char *text ) +{ + int ret; + size_t len = 0; + + // Write string + // + len = strlen( text ); + + if( *p - start < (int) len ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + (*p) -= len; + memcpy( *p, text, len ); + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_PRINTABLE_STRING ) ); + + return( len ); +} + +int asn1_write_ia5_string( unsigned char **p, unsigned char *start, + char *text ) +{ + int ret; + size_t len = 0; + + // Write string + // + len = strlen( text ); + + if( *p - start < (int) len ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + (*p) -= len; + memcpy( *p, text, len ); + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_IA5_STRING ) ); + + return( len ); +} + + +#endif diff --git a/Externals/polarssl/library/base64.c b/Externals/polarssl/library/base64.c new file mode 100644 index 0000000000..06305bb5ed --- /dev/null +++ b/Externals/polarssl/library/base64.c @@ -0,0 +1,262 @@ +/* + * RFC 1521 base64 encoding/decoding + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_BASE64_C) + +#include "polarssl/base64.h" + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +static const unsigned char base64_enc_map[64] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' +}; + +static const unsigned char base64_dec_map[128] = +{ + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 62, 127, 127, 127, 63, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 127, 127, + 127, 64, 127, 127, 127, 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 127, 127, 127, 127, 127, 127, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 127, 127, 127, 127, 127 +}; + +/* + * Encode a buffer into base64 format + */ +int base64_encode( unsigned char *dst, size_t *dlen, + const unsigned char *src, size_t slen ) +{ + size_t i, n; + int C1, C2, C3; + unsigned char *p; + + if( slen == 0 ) + return( 0 ); + + n = (slen << 3) / 6; + + switch( (slen << 3) - (n * 6) ) + { + case 2: n += 3; break; + case 4: n += 2; break; + default: break; + } + + if( *dlen < n + 1 ) + { + *dlen = n + 1; + return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL ); + } + + n = (slen / 3) * 3; + + for( i = 0, p = dst; i < n; i += 3 ) + { + C1 = *src++; + C2 = *src++; + C3 = *src++; + + *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; + *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; + *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F]; + *p++ = base64_enc_map[C3 & 0x3F]; + } + + if( i < slen ) + { + C1 = *src++; + C2 = ((i + 1) < slen) ? *src++ : 0; + + *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; + *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; + + if( (i + 1) < slen ) + *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F]; + else *p++ = '='; + + *p++ = '='; + } + + *dlen = p - dst; + *p = 0; + + return( 0 ); +} + +/* + * Decode a base64-formatted buffer + */ +int base64_decode( unsigned char *dst, size_t *dlen, + const unsigned char *src, size_t slen ) +{ + size_t i, n; + uint32_t j, x; + unsigned char *p; + + for( i = j = n = 0; i < slen; i++ ) + { + if( ( slen - i ) >= 2 && + src[i] == '\r' && src[i + 1] == '\n' ) + continue; + + if( src[i] == '\n' ) + continue; + + if( src[i] == '=' && ++j > 2 ) + return( POLARSSL_ERR_BASE64_INVALID_CHARACTER ); + + if( src[i] > 127 || base64_dec_map[src[i]] == 127 ) + return( POLARSSL_ERR_BASE64_INVALID_CHARACTER ); + + if( base64_dec_map[src[i]] < 64 && j != 0 ) + return( POLARSSL_ERR_BASE64_INVALID_CHARACTER ); + + n++; + } + + if( n == 0 ) + return( 0 ); + + n = ((n * 6) + 7) >> 3; + + if( *dlen < n ) + { + *dlen = n; + return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL ); + } + + for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ ) + { + if( *src == '\r' || *src == '\n' ) + continue; + + j -= ( base64_dec_map[*src] == 64 ); + x = (x << 6) | ( base64_dec_map[*src] & 0x3F ); + + if( ++n == 4 ) + { + n = 0; + if( j > 0 ) *p++ = (unsigned char)( x >> 16 ); + if( j > 1 ) *p++ = (unsigned char)( x >> 8 ); + if( j > 2 ) *p++ = (unsigned char)( x ); + } + } + + *dlen = p - dst; + + return( 0 ); +} + +#if defined(POLARSSL_SELF_TEST) + +#include +#include + +static const unsigned char base64_test_dec[64] = +{ + 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, + 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, + 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, + 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, + 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, + 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, + 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, + 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 +}; + +static const unsigned char base64_test_enc[] = + "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" + "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; + +/* + * Checkup routine + */ +int base64_self_test( int verbose ) +{ + size_t len; + const unsigned char *src; + unsigned char buffer[128]; + + if( verbose != 0 ) + printf( " Base64 encoding test: " ); + + len = sizeof( buffer ); + src = base64_test_dec; + + if( base64_encode( buffer, &len, src, 64 ) != 0 || + memcmp( base64_test_enc, buffer, 88 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n Base64 decoding test: " ); + + len = sizeof( buffer ); + src = base64_test_enc; + + if( base64_decode( buffer, &len, src, 88 ) != 0 || + memcmp( base64_test_dec, buffer, 64 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/bignum.c b/Externals/polarssl/library/bignum.c new file mode 100644 index 0000000000..1422d50262 --- /dev/null +++ b/Externals/polarssl/library/bignum.c @@ -0,0 +1,2143 @@ +/* + * Multi-precision integer library + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * This MPI implementation is based on: + * + * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf + * http://www.stillhq.com/extracted/gnupg-api/mpi/ + * http://math.libtomcrypt.com/files/tommath.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_BIGNUM_C) + +#include "polarssl/bignum.h" +#include "polarssl/bn_mul.h" + +#include + +#define ciL (sizeof(t_uint)) /* chars in limb */ +#define biL (ciL << 3) /* bits in limb */ +#define biH (ciL << 2) /* half limb size */ + +/* + * Convert between bits/chars and number of limbs + */ +#define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL) +#define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL) + +/* + * Initialize one MPI + */ +void mpi_init( mpi *X ) +{ + if( X == NULL ) + return; + + X->s = 1; + X->n = 0; + X->p = NULL; +} + +/* + * Unallocate one MPI + */ +void mpi_free( mpi *X ) +{ + if( X == NULL ) + return; + + if( X->p != NULL ) + { + memset( X->p, 0, X->n * ciL ); + free( X->p ); + } + + X->s = 1; + X->n = 0; + X->p = NULL; +} + +/* + * Enlarge to the specified number of limbs + */ +int mpi_grow( mpi *X, size_t nblimbs ) +{ + t_uint *p; + + if( nblimbs > POLARSSL_MPI_MAX_LIMBS ) + return( POLARSSL_ERR_MPI_MALLOC_FAILED ); + + if( X->n < nblimbs ) + { + if( ( p = (t_uint *) malloc( nblimbs * ciL ) ) == NULL ) + return( POLARSSL_ERR_MPI_MALLOC_FAILED ); + + memset( p, 0, nblimbs * ciL ); + + if( X->p != NULL ) + { + memcpy( p, X->p, X->n * ciL ); + memset( X->p, 0, X->n * ciL ); + free( X->p ); + } + + X->n = nblimbs; + X->p = p; + } + + return( 0 ); +} + +/* + * Copy the contents of Y into X + */ +int mpi_copy( mpi *X, const mpi *Y ) +{ + int ret; + size_t i; + + if( X == Y ) + return( 0 ); + + for( i = Y->n - 1; i > 0; i-- ) + if( Y->p[i] != 0 ) + break; + i++; + + X->s = Y->s; + + MPI_CHK( mpi_grow( X, i ) ); + + memset( X->p, 0, X->n * ciL ); + memcpy( X->p, Y->p, i * ciL ); + +cleanup: + + return( ret ); +} + +/* + * Swap the contents of X and Y + */ +void mpi_swap( mpi *X, mpi *Y ) +{ + mpi T; + + memcpy( &T, X, sizeof( mpi ) ); + memcpy( X, Y, sizeof( mpi ) ); + memcpy( Y, &T, sizeof( mpi ) ); +} + +/* + * Set value from integer + */ +int mpi_lset( mpi *X, t_sint z ) +{ + int ret; + + MPI_CHK( mpi_grow( X, 1 ) ); + memset( X->p, 0, X->n * ciL ); + + X->p[0] = ( z < 0 ) ? -z : z; + X->s = ( z < 0 ) ? -1 : 1; + +cleanup: + + return( ret ); +} + +/* + * Get a specific bit + */ +int mpi_get_bit( const mpi *X, size_t pos ) +{ + if( X->n * biL <= pos ) + return( 0 ); + + return ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01; +} + +/* + * Set a bit to a specific value of 0 or 1 + */ +int mpi_set_bit( mpi *X, size_t pos, unsigned char val ) +{ + int ret = 0; + size_t off = pos / biL; + size_t idx = pos % biL; + + if( val != 0 && val != 1 ) + return POLARSSL_ERR_MPI_BAD_INPUT_DATA; + + if( X->n * biL <= pos ) + { + if( val == 0 ) + return ( 0 ); + + MPI_CHK( mpi_grow( X, off + 1 ) ); + } + + X->p[off] = ( X->p[off] & ~( 0x01 << idx ) ) | ( val << idx ); + +cleanup: + + return( ret ); +} + +/* + * Return the number of least significant bits + */ +size_t mpi_lsb( const mpi *X ) +{ + size_t i, j, count = 0; + + for( i = 0; i < X->n; i++ ) + for( j = 0; j < biL; j++, count++ ) + if( ( ( X->p[i] >> j ) & 1 ) != 0 ) + return( count ); + + return( 0 ); +} + +/* + * Return the number of most significant bits + */ +size_t mpi_msb( const mpi *X ) +{ + size_t i, j; + + for( i = X->n - 1; i > 0; i-- ) + if( X->p[i] != 0 ) + break; + + for( j = biL; j > 0; j-- ) + if( ( ( X->p[i] >> ( j - 1 ) ) & 1 ) != 0 ) + break; + + return( ( i * biL ) + j ); +} + +/* + * Return the total size in bytes + */ +size_t mpi_size( const mpi *X ) +{ + return( ( mpi_msb( X ) + 7 ) >> 3 ); +} + +/* + * Convert an ASCII character to digit value + */ +static int mpi_get_digit( t_uint *d, int radix, char c ) +{ + *d = 255; + + if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30; + if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37; + if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57; + + if( *d >= (t_uint) radix ) + return( POLARSSL_ERR_MPI_INVALID_CHARACTER ); + + return( 0 ); +} + +/* + * Import from an ASCII string + */ +int mpi_read_string( mpi *X, int radix, const char *s ) +{ + int ret; + size_t i, j, slen, n; + t_uint d; + mpi T; + + if( radix < 2 || radix > 16 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + mpi_init( &T ); + + slen = strlen( s ); + + if( radix == 16 ) + { + n = BITS_TO_LIMBS( slen << 2 ); + + MPI_CHK( mpi_grow( X, n ) ); + MPI_CHK( mpi_lset( X, 0 ) ); + + for( i = slen, j = 0; i > 0; i--, j++ ) + { + if( i == 1 && s[i - 1] == '-' ) + { + X->s = -1; + break; + } + + MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) ); + X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 ); + } + } + else + { + MPI_CHK( mpi_lset( X, 0 ) ); + + for( i = 0; i < slen; i++ ) + { + if( i == 0 && s[i] == '-' ) + { + X->s = -1; + continue; + } + + MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); + MPI_CHK( mpi_mul_int( &T, X, radix ) ); + + if( X->s == 1 ) + { + MPI_CHK( mpi_add_int( X, &T, d ) ); + } + else + { + MPI_CHK( mpi_sub_int( X, &T, d ) ); + } + } + } + +cleanup: + + mpi_free( &T ); + + return( ret ); +} + +/* + * Helper to write the digits high-order first + */ +static int mpi_write_hlp( mpi *X, int radix, char **p ) +{ + int ret; + t_uint r; + + if( radix < 2 || radix > 16 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + MPI_CHK( mpi_mod_int( &r, X, radix ) ); + MPI_CHK( mpi_div_int( X, NULL, X, radix ) ); + + if( mpi_cmp_int( X, 0 ) != 0 ) + MPI_CHK( mpi_write_hlp( X, radix, p ) ); + + if( r < 10 ) + *(*p)++ = (char)( r + 0x30 ); + else + *(*p)++ = (char)( r + 0x37 ); + +cleanup: + + return( ret ); +} + +/* + * Export into an ASCII string + */ +int mpi_write_string( const mpi *X, int radix, char *s, size_t *slen ) +{ + int ret = 0; + size_t n; + char *p; + mpi T; + + if( radix < 2 || radix > 16 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + n = mpi_msb( X ); + if( radix >= 4 ) n >>= 1; + if( radix >= 16 ) n >>= 1; + n += 3; + + if( *slen < n ) + { + *slen = n; + return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); + } + + p = s; + mpi_init( &T ); + + if( X->s == -1 ) + *p++ = '-'; + + if( radix == 16 ) + { + int c; + size_t i, j, k; + + for( i = X->n, k = 0; i > 0; i-- ) + { + for( j = ciL; j > 0; j-- ) + { + c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF; + + if( c == 0 && k == 0 && ( i + j + 3 ) != 0 ) + continue; + + *(p++) = "0123456789ABCDEF" [c / 16]; + *(p++) = "0123456789ABCDEF" [c % 16]; + k = 1; + } + } + } + else + { + MPI_CHK( mpi_copy( &T, X ) ); + + if( T.s == -1 ) + T.s = 1; + + MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); + } + + *p++ = '\0'; + *slen = p - s; + +cleanup: + + mpi_free( &T ); + + return( ret ); +} + +#if defined(POLARSSL_FS_IO) +/* + * Read X from an opened file + */ +int mpi_read_file( mpi *X, int radix, FILE *fin ) +{ + t_uint d; + size_t slen; + char *p; + /* + * Buffer should have space for (short) label and decimal formatted MPI, + * newline characters and '\0' + */ + char s[ POLARSSL_MPI_RW_BUFFER_SIZE ]; + + memset( s, 0, sizeof( s ) ); + if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) + return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); + + slen = strlen( s ); + if( slen == sizeof( s ) - 2 ) + return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); + + if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } + if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } + + p = s + slen; + while( --p >= s ) + if( mpi_get_digit( &d, radix, *p ) != 0 ) + break; + + return( mpi_read_string( X, radix, p + 1 ) ); +} + +/* + * Write X into an opened file (or stdout if fout == NULL) + */ +int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout ) +{ + int ret; + size_t n, slen, plen; + /* + * Buffer should have space for (short) label and decimal formatted MPI, + * newline characters and '\0' + */ + char s[ POLARSSL_MPI_RW_BUFFER_SIZE ]; + + n = sizeof( s ); + memset( s, 0, n ); + n -= 2; + + MPI_CHK( mpi_write_string( X, radix, s, (size_t *) &n ) ); + + if( p == NULL ) p = ""; + + plen = strlen( p ); + slen = strlen( s ); + s[slen++] = '\r'; + s[slen++] = '\n'; + + if( fout != NULL ) + { + if( fwrite( p, 1, plen, fout ) != plen || + fwrite( s, 1, slen, fout ) != slen ) + return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); + } + else + printf( "%s%s", p, s ); + +cleanup: + + return( ret ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * Import X from unsigned binary data, big endian + */ +int mpi_read_binary( mpi *X, const unsigned char *buf, size_t buflen ) +{ + int ret; + size_t i, j, n; + + for( n = 0; n < buflen; n++ ) + if( buf[n] != 0 ) + break; + + MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) ); + MPI_CHK( mpi_lset( X, 0 ) ); + + for( i = buflen, j = 0; i > n; i--, j++ ) + X->p[j / ciL] |= ((t_uint) buf[i - 1]) << ((j % ciL) << 3); + +cleanup: + + return( ret ); +} + +/* + * Export X into unsigned binary data, big endian + */ +int mpi_write_binary( const mpi *X, unsigned char *buf, size_t buflen ) +{ + size_t i, j, n; + + n = mpi_size( X ); + + if( buflen < n ) + return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); + + memset( buf, 0, buflen ); + + for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- ) + buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) ); + + return( 0 ); +} + +/* + * Left-shift: X <<= count + */ +int mpi_shift_l( mpi *X, size_t count ) +{ + int ret; + size_t i, v0, t1; + t_uint r0 = 0, r1; + + v0 = count / (biL ); + t1 = count & (biL - 1); + + i = mpi_msb( X ) + count; + + if( X->n * biL < i ) + MPI_CHK( mpi_grow( X, BITS_TO_LIMBS( i ) ) ); + + ret = 0; + + /* + * shift by count / limb_size + */ + if( v0 > 0 ) + { + for( i = X->n; i > v0; i-- ) + X->p[i - 1] = X->p[i - v0 - 1]; + + for( ; i > 0; i-- ) + X->p[i - 1] = 0; + } + + /* + * shift by count % limb_size + */ + if( t1 > 0 ) + { + for( i = v0; i < X->n; i++ ) + { + r1 = X->p[i] >> (biL - t1); + X->p[i] <<= t1; + X->p[i] |= r0; + r0 = r1; + } + } + +cleanup: + + return( ret ); +} + +/* + * Right-shift: X >>= count + */ +int mpi_shift_r( mpi *X, size_t count ) +{ + size_t i, v0, v1; + t_uint r0 = 0, r1; + + v0 = count / biL; + v1 = count & (biL - 1); + + if( v0 > X->n || ( v0 == X->n && v1 > 0 ) ) + return mpi_lset( X, 0 ); + + /* + * shift by count / limb_size + */ + if( v0 > 0 ) + { + for( i = 0; i < X->n - v0; i++ ) + X->p[i] = X->p[i + v0]; + + for( ; i < X->n; i++ ) + X->p[i] = 0; + } + + /* + * shift by count % limb_size + */ + if( v1 > 0 ) + { + for( i = X->n; i > 0; i-- ) + { + r1 = X->p[i - 1] << (biL - v1); + X->p[i - 1] >>= v1; + X->p[i - 1] |= r0; + r0 = r1; + } + } + + return( 0 ); +} + +/* + * Compare unsigned values + */ +int mpi_cmp_abs( const mpi *X, const mpi *Y ) +{ + size_t i, j; + + for( i = X->n; i > 0; i-- ) + if( X->p[i - 1] != 0 ) + break; + + for( j = Y->n; j > 0; j-- ) + if( Y->p[j - 1] != 0 ) + break; + + if( i == 0 && j == 0 ) + return( 0 ); + + if( i > j ) return( 1 ); + if( j > i ) return( -1 ); + + for( ; i > 0; i-- ) + { + if( X->p[i - 1] > Y->p[i - 1] ) return( 1 ); + if( X->p[i - 1] < Y->p[i - 1] ) return( -1 ); + } + + return( 0 ); +} + +/* + * Compare signed values + */ +int mpi_cmp_mpi( const mpi *X, const mpi *Y ) +{ + size_t i, j; + + for( i = X->n; i > 0; i-- ) + if( X->p[i - 1] != 0 ) + break; + + for( j = Y->n; j > 0; j-- ) + if( Y->p[j - 1] != 0 ) + break; + + if( i == 0 && j == 0 ) + return( 0 ); + + if( i > j ) return( X->s ); + if( j > i ) return( -Y->s ); + + if( X->s > 0 && Y->s < 0 ) return( 1 ); + if( Y->s > 0 && X->s < 0 ) return( -1 ); + + for( ; i > 0; i-- ) + { + if( X->p[i - 1] > Y->p[i - 1] ) return( X->s ); + if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s ); + } + + return( 0 ); +} + +/* + * Compare signed values + */ +int mpi_cmp_int( const mpi *X, t_sint z ) +{ + mpi Y; + t_uint p[1]; + + *p = ( z < 0 ) ? -z : z; + Y.s = ( z < 0 ) ? -1 : 1; + Y.n = 1; + Y.p = p; + + return( mpi_cmp_mpi( X, &Y ) ); +} + +/* + * Unsigned addition: X = |A| + |B| (HAC 14.7) + */ +int mpi_add_abs( mpi *X, const mpi *A, const mpi *B ) +{ + int ret; + size_t i, j; + t_uint *o, *p, c; + + if( X == B ) + { + const mpi *T = A; A = X; B = T; + } + + if( X != A ) + MPI_CHK( mpi_copy( X, A ) ); + + /* + * X should always be positive as a result of unsigned additions. + */ + X->s = 1; + + for( j = B->n; j > 0; j-- ) + if( B->p[j - 1] != 0 ) + break; + + MPI_CHK( mpi_grow( X, j ) ); + + o = B->p; p = X->p; c = 0; + + for( i = 0; i < j; i++, o++, p++ ) + { + *p += c; c = ( *p < c ); + *p += *o; c += ( *p < *o ); + } + + while( c != 0 ) + { + if( i >= X->n ) + { + MPI_CHK( mpi_grow( X, i + 1 ) ); + p = X->p + i; + } + + *p += c; c = ( *p < c ); i++; p++; + } + +cleanup: + + return( ret ); +} + +/* + * Helper for mpi substraction + */ +static void mpi_sub_hlp( size_t n, t_uint *s, t_uint *d ) +{ + size_t i; + t_uint c, z; + + for( i = c = 0; i < n; i++, s++, d++ ) + { + z = ( *d < c ); *d -= c; + c = ( *d < *s ) + z; *d -= *s; + } + + while( c != 0 ) + { + z = ( *d < c ); *d -= c; + c = z; i++; d++; + } +} + +/* + * Unsigned substraction: X = |A| - |B| (HAC 14.9) + */ +int mpi_sub_abs( mpi *X, const mpi *A, const mpi *B ) +{ + mpi TB; + int ret; + size_t n; + + if( mpi_cmp_abs( A, B ) < 0 ) + return( POLARSSL_ERR_MPI_NEGATIVE_VALUE ); + + mpi_init( &TB ); + + if( X == B ) + { + MPI_CHK( mpi_copy( &TB, B ) ); + B = &TB; + } + + if( X != A ) + MPI_CHK( mpi_copy( X, A ) ); + + /* + * X should always be positive as a result of unsigned substractions. + */ + X->s = 1; + + ret = 0; + + for( n = B->n; n > 0; n-- ) + if( B->p[n - 1] != 0 ) + break; + + mpi_sub_hlp( n, B->p, X->p ); + +cleanup: + + mpi_free( &TB ); + + return( ret ); +} + +/* + * Signed addition: X = A + B + */ +int mpi_add_mpi( mpi *X, const mpi *A, const mpi *B ) +{ + int ret, s = A->s; + + if( A->s * B->s < 0 ) + { + if( mpi_cmp_abs( A, B ) >= 0 ) + { + MPI_CHK( mpi_sub_abs( X, A, B ) ); + X->s = s; + } + else + { + MPI_CHK( mpi_sub_abs( X, B, A ) ); + X->s = -s; + } + } + else + { + MPI_CHK( mpi_add_abs( X, A, B ) ); + X->s = s; + } + +cleanup: + + return( ret ); +} + +/* + * Signed substraction: X = A - B + */ +int mpi_sub_mpi( mpi *X, const mpi *A, const mpi *B ) +{ + int ret, s = A->s; + + if( A->s * B->s > 0 ) + { + if( mpi_cmp_abs( A, B ) >= 0 ) + { + MPI_CHK( mpi_sub_abs( X, A, B ) ); + X->s = s; + } + else + { + MPI_CHK( mpi_sub_abs( X, B, A ) ); + X->s = -s; + } + } + else + { + MPI_CHK( mpi_add_abs( X, A, B ) ); + X->s = s; + } + +cleanup: + + return( ret ); +} + +/* + * Signed addition: X = A + b + */ +int mpi_add_int( mpi *X, const mpi *A, t_sint b ) +{ + mpi _B; + t_uint p[1]; + + p[0] = ( b < 0 ) ? -b : b; + _B.s = ( b < 0 ) ? -1 : 1; + _B.n = 1; + _B.p = p; + + return( mpi_add_mpi( X, A, &_B ) ); +} + +/* + * Signed substraction: X = A - b + */ +int mpi_sub_int( mpi *X, const mpi *A, t_sint b ) +{ + mpi _B; + t_uint p[1]; + + p[0] = ( b < 0 ) ? -b : b; + _B.s = ( b < 0 ) ? -1 : 1; + _B.n = 1; + _B.p = p; + + return( mpi_sub_mpi( X, A, &_B ) ); +} + +/* + * Helper for mpi multiplication + */ +static +#if defined(__APPLE__) && defined(__arm__) +/* + * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) + * appears to need this to prevent bad ARM code generation at -O3. + */ +__attribute__ ((noinline)) +#endif +void mpi_mul_hlp( size_t i, t_uint *s, t_uint *d, t_uint b ) +{ + t_uint c = 0, t = 0; + +#if defined(MULADDC_HUIT) + for( ; i >= 8; i -= 8 ) + { + MULADDC_INIT + MULADDC_HUIT + MULADDC_STOP + } + + for( ; i > 0; i-- ) + { + MULADDC_INIT + MULADDC_CORE + MULADDC_STOP + } +#else + for( ; i >= 16; i -= 16 ) + { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for( ; i >= 8; i -= 8 ) + { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for( ; i > 0; i-- ) + { + MULADDC_INIT + MULADDC_CORE + MULADDC_STOP + } +#endif + + t++; + + do { + *d += c; c = ( *d < c ); d++; + } + while( c != 0 ); +} + +/* + * Baseline multiplication: X = A * B (HAC 14.12) + */ +int mpi_mul_mpi( mpi *X, const mpi *A, const mpi *B ) +{ + int ret; + size_t i, j; + mpi TA, TB; + + mpi_init( &TA ); mpi_init( &TB ); + + if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; } + if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; } + + for( i = A->n; i > 0; i-- ) + if( A->p[i - 1] != 0 ) + break; + + for( j = B->n; j > 0; j-- ) + if( B->p[j - 1] != 0 ) + break; + + MPI_CHK( mpi_grow( X, i + j ) ); + MPI_CHK( mpi_lset( X, 0 ) ); + + for( i++; j > 0; j-- ) + mpi_mul_hlp( i - 1, A->p, X->p + j - 1, B->p[j - 1] ); + + X->s = A->s * B->s; + +cleanup: + + mpi_free( &TB ); mpi_free( &TA ); + + return( ret ); +} + +/* + * Baseline multiplication: X = A * b + */ +int mpi_mul_int( mpi *X, const mpi *A, t_sint b ) +{ + mpi _B; + t_uint p[1]; + + _B.s = 1; + _B.n = 1; + _B.p = p; + p[0] = b; + + return( mpi_mul_mpi( X, A, &_B ) ); +} + +/* + * Division by mpi: A = Q * B + R (HAC 14.20) + */ +int mpi_div_mpi( mpi *Q, mpi *R, const mpi *A, const mpi *B ) +{ + int ret; + size_t i, n, t, k; + mpi X, Y, Z, T1, T2; + + if( mpi_cmp_int( B, 0 ) == 0 ) + return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); + + mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); + mpi_init( &T1 ); mpi_init( &T2 ); + + if( mpi_cmp_abs( A, B ) < 0 ) + { + if( Q != NULL ) MPI_CHK( mpi_lset( Q, 0 ) ); + if( R != NULL ) MPI_CHK( mpi_copy( R, A ) ); + return( 0 ); + } + + MPI_CHK( mpi_copy( &X, A ) ); + MPI_CHK( mpi_copy( &Y, B ) ); + X.s = Y.s = 1; + + MPI_CHK( mpi_grow( &Z, A->n + 2 ) ); + MPI_CHK( mpi_lset( &Z, 0 ) ); + MPI_CHK( mpi_grow( &T1, 2 ) ); + MPI_CHK( mpi_grow( &T2, 3 ) ); + + k = mpi_msb( &Y ) % biL; + if( k < biL - 1 ) + { + k = biL - 1 - k; + MPI_CHK( mpi_shift_l( &X, k ) ); + MPI_CHK( mpi_shift_l( &Y, k ) ); + } + else k = 0; + + n = X.n - 1; + t = Y.n - 1; + MPI_CHK( mpi_shift_l( &Y, biL * (n - t) ) ); + + while( mpi_cmp_mpi( &X, &Y ) >= 0 ) + { + Z.p[n - t]++; + mpi_sub_mpi( &X, &X, &Y ); + } + mpi_shift_r( &Y, biL * (n - t) ); + + for( i = n; i > t ; i-- ) + { + if( X.p[i] >= Y.p[t] ) + Z.p[i - t - 1] = ~0; + else + { +#if defined(POLARSSL_HAVE_UDBL) + t_udbl r; + + r = (t_udbl) X.p[i] << biL; + r |= (t_udbl) X.p[i - 1]; + r /= Y.p[t]; + if( r > ((t_udbl) 1 << biL) - 1) + r = ((t_udbl) 1 << biL) - 1; + + Z.p[i - t - 1] = (t_uint) r; +#else + /* + * __udiv_qrnnd_c, from gmp/longlong.h + */ + t_uint q0, q1, r0, r1; + t_uint d0, d1, d, m; + + d = Y.p[t]; + d0 = ( d << biH ) >> biH; + d1 = ( d >> biH ); + + q1 = X.p[i] / d1; + r1 = X.p[i] - d1 * q1; + r1 <<= biH; + r1 |= ( X.p[i - 1] >> biH ); + + m = q1 * d0; + if( r1 < m ) + { + q1--, r1 += d; + while( r1 >= d && r1 < m ) + q1--, r1 += d; + } + r1 -= m; + + q0 = r1 / d1; + r0 = r1 - d1 * q0; + r0 <<= biH; + r0 |= ( X.p[i - 1] << biH ) >> biH; + + m = q0 * d0; + if( r0 < m ) + { + q0--, r0 += d; + while( r0 >= d && r0 < m ) + q0--, r0 += d; + } + r0 -= m; + + Z.p[i - t - 1] = ( q1 << biH ) | q0; +#endif + } + + Z.p[i - t - 1]++; + do + { + Z.p[i - t - 1]--; + + MPI_CHK( mpi_lset( &T1, 0 ) ); + T1.p[0] = (t < 1) ? 0 : Y.p[t - 1]; + T1.p[1] = Y.p[t]; + MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) ); + + MPI_CHK( mpi_lset( &T2, 0 ) ); + T2.p[0] = (i < 2) ? 0 : X.p[i - 2]; + T2.p[1] = (i < 1) ? 0 : X.p[i - 1]; + T2.p[2] = X.p[i]; + } + while( mpi_cmp_mpi( &T1, &T2 ) > 0 ); + + MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) ); + MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); + MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) ); + + if( mpi_cmp_int( &X, 0 ) < 0 ) + { + MPI_CHK( mpi_copy( &T1, &Y ) ); + MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); + MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) ); + Z.p[i - t - 1]--; + } + } + + if( Q != NULL ) + { + mpi_copy( Q, &Z ); + Q->s = A->s * B->s; + } + + if( R != NULL ) + { + mpi_shift_r( &X, k ); + X.s = A->s; + mpi_copy( R, &X ); + + if( mpi_cmp_int( R, 0 ) == 0 ) + R->s = 1; + } + +cleanup: + + mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); + mpi_free( &T1 ); mpi_free( &T2 ); + + return( ret ); +} + +/* + * Division by int: A = Q * b + R + */ +int mpi_div_int( mpi *Q, mpi *R, const mpi *A, t_sint b ) +{ + mpi _B; + t_uint p[1]; + + p[0] = ( b < 0 ) ? -b : b; + _B.s = ( b < 0 ) ? -1 : 1; + _B.n = 1; + _B.p = p; + + return( mpi_div_mpi( Q, R, A, &_B ) ); +} + +/* + * Modulo: R = A mod B + */ +int mpi_mod_mpi( mpi *R, const mpi *A, const mpi *B ) +{ + int ret; + + if( mpi_cmp_int( B, 0 ) < 0 ) + return POLARSSL_ERR_MPI_NEGATIVE_VALUE; + + MPI_CHK( mpi_div_mpi( NULL, R, A, B ) ); + + while( mpi_cmp_int( R, 0 ) < 0 ) + MPI_CHK( mpi_add_mpi( R, R, B ) ); + + while( mpi_cmp_mpi( R, B ) >= 0 ) + MPI_CHK( mpi_sub_mpi( R, R, B ) ); + +cleanup: + + return( ret ); +} + +/* + * Modulo: r = A mod b + */ +int mpi_mod_int( t_uint *r, const mpi *A, t_sint b ) +{ + size_t i; + t_uint x, y, z; + + if( b == 0 ) + return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); + + if( b < 0 ) + return POLARSSL_ERR_MPI_NEGATIVE_VALUE; + + /* + * handle trivial cases + */ + if( b == 1 ) + { + *r = 0; + return( 0 ); + } + + if( b == 2 ) + { + *r = A->p[0] & 1; + return( 0 ); + } + + /* + * general case + */ + for( i = A->n, y = 0; i > 0; i-- ) + { + x = A->p[i - 1]; + y = ( y << biH ) | ( x >> biH ); + z = y / b; + y -= z * b; + + x <<= biH; + y = ( y << biH ) | ( x >> biH ); + z = y / b; + y -= z * b; + } + + /* + * If A is negative, then the current y represents a negative value. + * Flipping it to the positive side. + */ + if( A->s < 0 && y != 0 ) + y = b - y; + + *r = y; + + return( 0 ); +} + +/* + * Fast Montgomery initialization (thanks to Tom St Denis) + */ +static void mpi_montg_init( t_uint *mm, const mpi *N ) +{ + t_uint x, m0 = N->p[0]; + + x = m0; + x += ( ( m0 + 2 ) & 4 ) << 1; + x *= ( 2 - ( m0 * x ) ); + + if( biL >= 16 ) x *= ( 2 - ( m0 * x ) ); + if( biL >= 32 ) x *= ( 2 - ( m0 * x ) ); + if( biL >= 64 ) x *= ( 2 - ( m0 * x ) ); + + *mm = ~x + 1; +} + +/* + * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) + */ +static void mpi_montmul( mpi *A, const mpi *B, const mpi *N, t_uint mm, const mpi *T ) +{ + size_t i, n, m; + t_uint u0, u1, *d; + + memset( T->p, 0, T->n * ciL ); + + d = T->p; + n = N->n; + m = ( B->n < n ) ? B->n : n; + + for( i = 0; i < n; i++ ) + { + /* + * T = (T + u0*B + u1*N) / 2^biL + */ + u0 = A->p[i]; + u1 = ( d[0] + u0 * B->p[0] ) * mm; + + mpi_mul_hlp( m, B->p, d, u0 ); + mpi_mul_hlp( n, N->p, d, u1 ); + + *d++ = u0; d[n + 1] = 0; + } + + memcpy( A->p, d, (n + 1) * ciL ); + + if( mpi_cmp_abs( A, N ) >= 0 ) + mpi_sub_hlp( n, N->p, A->p ); + else + /* prevent timing attacks */ + mpi_sub_hlp( n, A->p, T->p ); +} + +/* + * Montgomery reduction: A = A * R^-1 mod N + */ +static void mpi_montred( mpi *A, const mpi *N, t_uint mm, const mpi *T ) +{ + t_uint z = 1; + mpi U; + + U.n = U.s = (int) z; + U.p = &z; + + mpi_montmul( A, &U, N, mm, T ); +} + +/* + * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) + */ +int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR ) +{ + int ret; + size_t wbits, wsize, one = 1; + size_t i, j, nblimbs; + size_t bufsize, nbits; + t_uint ei, mm, state; + mpi RR, T, W[ 2 << POLARSSL_MPI_WINDOW_SIZE ], Apos; + int neg; + + if( mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + if( mpi_cmp_int( E, 0 ) < 0 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + /* + * Init temps and window size + */ + mpi_montg_init( &mm, N ); + mpi_init( &RR ); mpi_init( &T ); + memset( W, 0, sizeof( W ) ); + + i = mpi_msb( E ); + + wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : + ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; + + if( wsize > POLARSSL_MPI_WINDOW_SIZE ) + wsize = POLARSSL_MPI_WINDOW_SIZE; + + j = N->n + 1; + MPI_CHK( mpi_grow( X, j ) ); + MPI_CHK( mpi_grow( &W[1], j ) ); + MPI_CHK( mpi_grow( &T, j * 2 ) ); + + /* + * Compensate for negative A (and correct at the end) + */ + neg = ( A->s == -1 ); + + mpi_init( &Apos ); + if( neg ) + { + MPI_CHK( mpi_copy( &Apos, A ) ); + Apos.s = 1; + A = &Apos; + } + + /* + * If 1st call, pre-compute R^2 mod N + */ + if( _RR == NULL || _RR->p == NULL ) + { + MPI_CHK( mpi_lset( &RR, 1 ) ); + MPI_CHK( mpi_shift_l( &RR, N->n * 2 * biL ) ); + MPI_CHK( mpi_mod_mpi( &RR, &RR, N ) ); + + if( _RR != NULL ) + memcpy( _RR, &RR, sizeof( mpi ) ); + } + else + memcpy( &RR, _RR, sizeof( mpi ) ); + + /* + * W[1] = A * R^2 * R^-1 mod N = A * R mod N + */ + if( mpi_cmp_mpi( A, N ) >= 0 ) + mpi_mod_mpi( &W[1], A, N ); + else mpi_copy( &W[1], A ); + + mpi_montmul( &W[1], &RR, N, mm, &T ); + + /* + * X = R^2 * R^-1 mod N = R mod N + */ + MPI_CHK( mpi_copy( X, &RR ) ); + mpi_montred( X, N, mm, &T ); + + if( wsize > 1 ) + { + /* + * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) + */ + j = one << (wsize - 1); + + MPI_CHK( mpi_grow( &W[j], N->n + 1 ) ); + MPI_CHK( mpi_copy( &W[j], &W[1] ) ); + + for( i = 0; i < wsize - 1; i++ ) + mpi_montmul( &W[j], &W[j], N, mm, &T ); + + /* + * W[i] = W[i - 1] * W[1] + */ + for( i = j + 1; i < (one << wsize); i++ ) + { + MPI_CHK( mpi_grow( &W[i], N->n + 1 ) ); + MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) ); + + mpi_montmul( &W[i], &W[1], N, mm, &T ); + } + } + + nblimbs = E->n; + bufsize = 0; + nbits = 0; + wbits = 0; + state = 0; + + while( 1 ) + { + if( bufsize == 0 ) + { + if( nblimbs-- == 0 ) + break; + + bufsize = sizeof( t_uint ) << 3; + } + + bufsize--; + + ei = (E->p[nblimbs] >> bufsize) & 1; + + /* + * skip leading 0s + */ + if( ei == 0 && state == 0 ) + continue; + + if( ei == 0 && state == 1 ) + { + /* + * out of window, square X + */ + mpi_montmul( X, X, N, mm, &T ); + continue; + } + + /* + * add ei to current window + */ + state = 2; + + nbits++; + wbits |= (ei << (wsize - nbits)); + + if( nbits == wsize ) + { + /* + * X = X^wsize R^-1 mod N + */ + for( i = 0; i < wsize; i++ ) + mpi_montmul( X, X, N, mm, &T ); + + /* + * X = X * W[wbits] R^-1 mod N + */ + mpi_montmul( X, &W[wbits], N, mm, &T ); + + state--; + nbits = 0; + wbits = 0; + } + } + + /* + * process the remaining bits + */ + for( i = 0; i < nbits; i++ ) + { + mpi_montmul( X, X, N, mm, &T ); + + wbits <<= 1; + + if( (wbits & (one << wsize)) != 0 ) + mpi_montmul( X, &W[1], N, mm, &T ); + } + + /* + * X = A^E * R * R^-1 mod N = A^E mod N + */ + mpi_montred( X, N, mm, &T ); + + if( neg ) + { + X->s = -1; + mpi_add_mpi( X, N, X ); + } + +cleanup: + + for( i = (one << (wsize - 1)); i < (one << wsize); i++ ) + mpi_free( &W[i] ); + + mpi_free( &W[1] ); mpi_free( &T ); mpi_free( &Apos ); + + if( _RR == NULL ) + mpi_free( &RR ); + + return( ret ); +} + +/* + * Greatest common divisor: G = gcd(A, B) (HAC 14.54) + */ +int mpi_gcd( mpi *G, const mpi *A, const mpi *B ) +{ + int ret; + size_t lz, lzt; + mpi TG, TA, TB; + + mpi_init( &TG ); mpi_init( &TA ); mpi_init( &TB ); + + MPI_CHK( mpi_copy( &TA, A ) ); + MPI_CHK( mpi_copy( &TB, B ) ); + + lz = mpi_lsb( &TA ); + lzt = mpi_lsb( &TB ); + + if ( lzt < lz ) + lz = lzt; + + MPI_CHK( mpi_shift_r( &TA, lz ) ); + MPI_CHK( mpi_shift_r( &TB, lz ) ); + + TA.s = TB.s = 1; + + while( mpi_cmp_int( &TA, 0 ) != 0 ) + { + MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) ); + MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) ); + + if( mpi_cmp_mpi( &TA, &TB ) >= 0 ) + { + MPI_CHK( mpi_sub_abs( &TA, &TA, &TB ) ); + MPI_CHK( mpi_shift_r( &TA, 1 ) ); + } + else + { + MPI_CHK( mpi_sub_abs( &TB, &TB, &TA ) ); + MPI_CHK( mpi_shift_r( &TB, 1 ) ); + } + } + + MPI_CHK( mpi_shift_l( &TB, lz ) ); + MPI_CHK( mpi_copy( G, &TB ) ); + +cleanup: + + mpi_free( &TG ); mpi_free( &TA ); mpi_free( &TB ); + + return( ret ); +} + +int mpi_fill_random( mpi *X, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + int ret; + + MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( size ) ) ); + MPI_CHK( mpi_lset( X, 0 ) ); + + MPI_CHK( f_rng( p_rng, (unsigned char *) X->p, size ) ); + +cleanup: + return( ret ); +} + +/* + * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) + */ +int mpi_inv_mod( mpi *X, const mpi *A, const mpi *N ) +{ + int ret; + mpi G, TA, TU, U1, U2, TB, TV, V1, V2; + + if( mpi_cmp_int( N, 0 ) <= 0 ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + mpi_init( &TA ); mpi_init( &TU ); mpi_init( &U1 ); mpi_init( &U2 ); + mpi_init( &G ); mpi_init( &TB ); mpi_init( &TV ); + mpi_init( &V1 ); mpi_init( &V2 ); + + MPI_CHK( mpi_gcd( &G, A, N ) ); + + if( mpi_cmp_int( &G, 1 ) != 0 ) + { + ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; + goto cleanup; + } + + MPI_CHK( mpi_mod_mpi( &TA, A, N ) ); + MPI_CHK( mpi_copy( &TU, &TA ) ); + MPI_CHK( mpi_copy( &TB, N ) ); + MPI_CHK( mpi_copy( &TV, N ) ); + + MPI_CHK( mpi_lset( &U1, 1 ) ); + MPI_CHK( mpi_lset( &U2, 0 ) ); + MPI_CHK( mpi_lset( &V1, 0 ) ); + MPI_CHK( mpi_lset( &V2, 1 ) ); + + do + { + while( ( TU.p[0] & 1 ) == 0 ) + { + MPI_CHK( mpi_shift_r( &TU, 1 ) ); + + if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 ) + { + MPI_CHK( mpi_add_mpi( &U1, &U1, &TB ) ); + MPI_CHK( mpi_sub_mpi( &U2, &U2, &TA ) ); + } + + MPI_CHK( mpi_shift_r( &U1, 1 ) ); + MPI_CHK( mpi_shift_r( &U2, 1 ) ); + } + + while( ( TV.p[0] & 1 ) == 0 ) + { + MPI_CHK( mpi_shift_r( &TV, 1 ) ); + + if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 ) + { + MPI_CHK( mpi_add_mpi( &V1, &V1, &TB ) ); + MPI_CHK( mpi_sub_mpi( &V2, &V2, &TA ) ); + } + + MPI_CHK( mpi_shift_r( &V1, 1 ) ); + MPI_CHK( mpi_shift_r( &V2, 1 ) ); + } + + if( mpi_cmp_mpi( &TU, &TV ) >= 0 ) + { + MPI_CHK( mpi_sub_mpi( &TU, &TU, &TV ) ); + MPI_CHK( mpi_sub_mpi( &U1, &U1, &V1 ) ); + MPI_CHK( mpi_sub_mpi( &U2, &U2, &V2 ) ); + } + else + { + MPI_CHK( mpi_sub_mpi( &TV, &TV, &TU ) ); + MPI_CHK( mpi_sub_mpi( &V1, &V1, &U1 ) ); + MPI_CHK( mpi_sub_mpi( &V2, &V2, &U2 ) ); + } + } + while( mpi_cmp_int( &TU, 0 ) != 0 ); + + while( mpi_cmp_int( &V1, 0 ) < 0 ) + MPI_CHK( mpi_add_mpi( &V1, &V1, N ) ); + + while( mpi_cmp_mpi( &V1, N ) >= 0 ) + MPI_CHK( mpi_sub_mpi( &V1, &V1, N ) ); + + MPI_CHK( mpi_copy( X, &V1 ) ); + +cleanup: + + mpi_free( &TA ); mpi_free( &TU ); mpi_free( &U1 ); mpi_free( &U2 ); + mpi_free( &G ); mpi_free( &TB ); mpi_free( &TV ); + mpi_free( &V1 ); mpi_free( &V2 ); + + return( ret ); +} + +#if defined(POLARSSL_GENPRIME) + +static const int small_prime[] = +{ + 3, 5, 7, 11, 13, 17, 19, 23, + 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, + 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, + 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, + 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, + 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, + 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, + 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, + 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, + 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, + 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997, -103 +}; + +/* + * Miller-Rabin primality test (HAC 4.24) + */ +int mpi_is_prime( mpi *X, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + int ret, xs; + size_t i, j, n, s; + mpi W, R, T, A, RR; + + if( mpi_cmp_int( X, 0 ) == 0 || + mpi_cmp_int( X, 1 ) == 0 ) + return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); + + if( mpi_cmp_int( X, 2 ) == 0 ) + return( 0 ); + + mpi_init( &W ); mpi_init( &R ); mpi_init( &T ); mpi_init( &A ); + mpi_init( &RR ); + + xs = X->s; X->s = 1; + + /* + * test trivial factors first + */ + if( ( X->p[0] & 1 ) == 0 ) + return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); + + for( i = 0; small_prime[i] > 0; i++ ) + { + t_uint r; + + if( mpi_cmp_int( X, small_prime[i] ) <= 0 ) + return( 0 ); + + MPI_CHK( mpi_mod_int( &r, X, small_prime[i] ) ); + + if( r == 0 ) + return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); + } + + /* + * W = |X| - 1 + * R = W >> lsb( W ) + */ + MPI_CHK( mpi_sub_int( &W, X, 1 ) ); + s = mpi_lsb( &W ); + MPI_CHK( mpi_copy( &R, &W ) ); + MPI_CHK( mpi_shift_r( &R, s ) ); + + i = mpi_msb( X ); + /* + * HAC, table 4.4 + */ + n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 : + ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 : + ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 ); + + for( i = 0; i < n; i++ ) + { + /* + * pick a random A, 1 < A < |X| - 1 + */ + MPI_CHK( mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) ); + + if( mpi_cmp_mpi( &A, &W ) >= 0 ) + { + j = mpi_msb( &A ) - mpi_msb( &W ); + MPI_CHK( mpi_shift_r( &A, j + 1 ) ); + } + A.p[0] |= 3; + + /* + * A = A^R mod |X| + */ + MPI_CHK( mpi_exp_mod( &A, &A, &R, X, &RR ) ); + + if( mpi_cmp_mpi( &A, &W ) == 0 || + mpi_cmp_int( &A, 1 ) == 0 ) + continue; + + j = 1; + while( j < s && mpi_cmp_mpi( &A, &W ) != 0 ) + { + /* + * A = A * A mod |X| + */ + MPI_CHK( mpi_mul_mpi( &T, &A, &A ) ); + MPI_CHK( mpi_mod_mpi( &A, &T, X ) ); + + if( mpi_cmp_int( &A, 1 ) == 0 ) + break; + + j++; + } + + /* + * not prime if A != |X| - 1 or A == 1 + */ + if( mpi_cmp_mpi( &A, &W ) != 0 || + mpi_cmp_int( &A, 1 ) == 0 ) + { + ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; + break; + } + } + +cleanup: + + X->s = xs; + + mpi_free( &W ); mpi_free( &R ); mpi_free( &T ); mpi_free( &A ); + mpi_free( &RR ); + + return( ret ); +} + +/* + * Prime number generation + */ +int mpi_gen_prime( mpi *X, size_t nbits, int dh_flag, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + int ret; + size_t k, n; + mpi Y; + + if( nbits < 3 || nbits > POLARSSL_MPI_MAX_BITS ) + return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); + + mpi_init( &Y ); + + n = BITS_TO_LIMBS( nbits ); + + MPI_CHK( mpi_fill_random( X, n * ciL, f_rng, p_rng ) ); + + k = mpi_msb( X ); + if( k < nbits ) MPI_CHK( mpi_shift_l( X, nbits - k ) ); + if( k > nbits ) MPI_CHK( mpi_shift_r( X, k - nbits ) ); + + X->p[0] |= 3; + + if( dh_flag == 0 ) + { + while( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) != 0 ) + { + if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) + goto cleanup; + + MPI_CHK( mpi_add_int( X, X, 2 ) ); + } + } + else + { + MPI_CHK( mpi_sub_int( &Y, X, 1 ) ); + MPI_CHK( mpi_shift_r( &Y, 1 ) ); + + while( 1 ) + { + if( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) == 0 ) + { + if( ( ret = mpi_is_prime( &Y, f_rng, p_rng ) ) == 0 ) + break; + + if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) + goto cleanup; + } + + if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) + goto cleanup; + + MPI_CHK( mpi_add_int( &Y, X, 1 ) ); + MPI_CHK( mpi_add_int( X, X, 2 ) ); + MPI_CHK( mpi_shift_r( &Y, 1 ) ); + } + } + +cleanup: + + mpi_free( &Y ); + + return( ret ); +} + +#endif + +#if defined(POLARSSL_SELF_TEST) + +#define GCD_PAIR_COUNT 3 + +static const int gcd_pairs[GCD_PAIR_COUNT][3] = +{ + { 693, 609, 21 }, + { 1764, 868, 28 }, + { 768454923, 542167814, 1 } +}; + +/* + * Checkup routine + */ +int mpi_self_test( int verbose ) +{ + int ret, i; + mpi A, E, N, X, Y, U, V; + + mpi_init( &A ); mpi_init( &E ); mpi_init( &N ); mpi_init( &X ); + mpi_init( &Y ); mpi_init( &U ); mpi_init( &V ); + + MPI_CHK( mpi_read_string( &A, 16, + "EFE021C2645FD1DC586E69184AF4A31E" \ + "D5F53E93B5F123FA41680867BA110131" \ + "944FE7952E2517337780CB0DB80E61AA" \ + "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) ); + + MPI_CHK( mpi_read_string( &E, 16, + "B2E7EFD37075B9F03FF989C7C5051C20" \ + "34D2A323810251127E7BF8625A4F49A5" \ + "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ + "5B5C25763222FEFCCFC38B832366C29E" ) ); + + MPI_CHK( mpi_read_string( &N, 16, + "0066A198186C18C10B2F5ED9B522752A" \ + "9830B69916E535C8F047518A889A43A5" \ + "94B6BED27A168D31D4A52F88925AA8F5" ) ); + + MPI_CHK( mpi_mul_mpi( &X, &A, &N ) ); + + MPI_CHK( mpi_read_string( &U, 16, + "602AB7ECA597A3D6B56FF9829A5E8B85" \ + "9E857EA95A03512E2BAE7391688D264A" \ + "A5663B0341DB9CCFD2C4C5F421FEC814" \ + "8001B72E848A38CAE1C65F78E56ABDEF" \ + "E12D3C039B8A02D6BE593F0BBBDA56F1" \ + "ECF677152EF804370C1A305CAF3B5BF1" \ + "30879B56C61DE584A0F53A2447A51E" ) ); + + if( verbose != 0 ) + printf( " MPI test #1 (mul_mpi): " ); + + if( mpi_cmp_mpi( &X, &U ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + + MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) ); + + MPI_CHK( mpi_read_string( &U, 16, + "256567336059E52CAE22925474705F39A94" ) ); + + MPI_CHK( mpi_read_string( &V, 16, + "6613F26162223DF488E9CD48CC132C7A" \ + "0AC93C701B001B092E4E5B9F73BCD27B" \ + "9EE50D0657C77F374E903CDFA4C642" ) ); + + if( verbose != 0 ) + printf( " MPI test #2 (div_mpi): " ); + + if( mpi_cmp_mpi( &X, &U ) != 0 || + mpi_cmp_mpi( &Y, &V ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + + MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) ); + + MPI_CHK( mpi_read_string( &U, 16, + "36E139AEA55215609D2816998ED020BB" \ + "BD96C37890F65171D948E9BC7CBAA4D9" \ + "325D24D6A3C12710F10A09FA08AB87" ) ); + + if( verbose != 0 ) + printf( " MPI test #3 (exp_mod): " ); + + if( mpi_cmp_mpi( &X, &U ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + +#if defined(POLARSSL_GENPRIME) + MPI_CHK( mpi_inv_mod( &X, &A, &N ) ); + + MPI_CHK( mpi_read_string( &U, 16, + "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ + "C3DBA76456363A10869622EAC2DD84EC" \ + "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) ); + + if( verbose != 0 ) + printf( " MPI test #4 (inv_mod): " ); + + if( mpi_cmp_mpi( &X, &U ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); +#endif + + if( verbose != 0 ) + printf( " MPI test #5 (simple gcd): " ); + + for ( i = 0; i < GCD_PAIR_COUNT; i++) + { + MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) ); + MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) ); + + MPI_CHK( mpi_gcd( &A, &X, &Y ) ); + + if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 ) + { + if( verbose != 0 ) + printf( "failed at %d\n", i ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + +cleanup: + + if( ret != 0 && verbose != 0 ) + printf( "Unexpected error, return code = %08X\n", ret ); + + mpi_free( &A ); mpi_free( &E ); mpi_free( &N ); mpi_free( &X ); + mpi_free( &Y ); mpi_free( &U ); mpi_free( &V ); + + if( verbose != 0 ) + printf( "\n" ); + + return( ret ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/blowfish.c b/Externals/polarssl/library/blowfish.c new file mode 100644 index 0000000000..719aea61af --- /dev/null +++ b/Externals/polarssl/library/blowfish.c @@ -0,0 +1,632 @@ +/* + * Blowfish implementation + * + * Copyright (C) 2012-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The Blowfish block cipher was designed by Bruce Schneier in 1993. + * http://www.schneier.com/blowfish.html + * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29 + * + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_BLOWFISH_C) + +#include "polarssl/blowfish.h" + +#if !defined(POLARSSL_BLOWFISH_ALT) + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +static const uint32_t P[BLOWFISH_ROUNDS + 2] = { + 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, + 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, + 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, + 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, + 0x9216D5D9L, 0x8979FB1BL +}; + +/* declarations of data at the end of this file */ +static const uint32_t S[4][256]; + +static uint32_t F(blowfish_context *ctx, uint32_t x) +{ + unsigned short a, b, c, d; + uint32_t y; + + d = (unsigned short)(x & 0xFF); + x >>= 8; + c = (unsigned short)(x & 0xFF); + x >>= 8; + b = (unsigned short)(x & 0xFF); + x >>= 8; + a = (unsigned short)(x & 0xFF); + y = ctx->S[0][a] + ctx->S[1][b]; + y = y ^ ctx->S[2][c]; + y = y + ctx->S[3][d]; + + return y; +} + +static void blowfish_enc(blowfish_context *ctx, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl, Xr, temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = 0; i < BLOWFISH_ROUNDS; ++i) + { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[BLOWFISH_ROUNDS]; + Xl = Xl ^ ctx->P[BLOWFISH_ROUNDS + 1]; + + *xl = Xl; + *xr = Xr; +} + +static void blowfish_dec(blowfish_context *ctx, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl, Xr, temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = BLOWFISH_ROUNDS + 1; i > 1; --i) + { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[1]; + Xl = Xl ^ ctx->P[0]; + + *xl = Xl; + *xr = Xr; +} + +/* + * Blowfish key schedule + */ +int blowfish_setkey( blowfish_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + unsigned int i, j, k; + uint32_t data, datal, datar; + + if( keysize < BLOWFISH_MIN_KEY || keysize > BLOWFISH_MAX_KEY || + ( keysize % 8 ) ) + { + return POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH; + } + + keysize >>= 3; + + for( i = 0; i < 4; i++ ) + { + for( j = 0; j < 256; j++ ) + ctx->S[i][j] = S[i][j]; + } + + j = 0; + for( i = 0; i < BLOWFISH_ROUNDS + 2; ++i ) + { + data = 0x00000000; + for( k = 0; k < 4; ++k ) + { + data = ( data << 8 ) | key[j++]; + if( j >= keysize ) + j = 0; + } + ctx->P[i] = P[i] ^ data; + } + + datal = 0x00000000; + datar = 0x00000000; + + for( i = 0; i < BLOWFISH_ROUNDS + 2; i += 2 ) + { + blowfish_enc( ctx, &datal, &datar ); + ctx->P[i] = datal; + ctx->P[i + 1] = datar; + } + + for( i = 0; i < 4; i++ ) + { + for( j = 0; j < 256; j += 2 ) + { + blowfish_enc( ctx, &datal, &datar ); + ctx->S[i][j] = datal; + ctx->S[i][j + 1] = datar; + } + } + return( 0 ); +} + +/* + * Blowfish-ECB block encryption/decryption + */ +int blowfish_crypt_ecb( blowfish_context *ctx, + int mode, + const unsigned char input[BLOWFISH_BLOCKSIZE], + unsigned char output[BLOWFISH_BLOCKSIZE] ) +{ + uint32_t X0, X1; + + GET_UINT32_BE( X0, input, 0 ); + GET_UINT32_BE( X1, input, 4 ); + + if( mode == BLOWFISH_DECRYPT ) + { + blowfish_dec(ctx, &X0, &X1); + } + else /* BLOWFISH_ENCRYPT */ + { + blowfish_enc(ctx, &X0, &X1); + } + + PUT_UINT32_BE( X0, output, 0 ); + PUT_UINT32_BE( X1, output, 4 ); + + return( 0 ); +} + +/* + * Blowfish-CBC buffer encryption/decryption + */ +int blowfish_crypt_cbc( blowfish_context *ctx, + int mode, + size_t length, + unsigned char iv[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[BLOWFISH_BLOCKSIZE]; + + if( length % BLOWFISH_BLOCKSIZE ) + return( POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH ); + + if( mode == BLOWFISH_DECRYPT ) + { + while( length > 0 ) + { + memcpy( temp, input, BLOWFISH_BLOCKSIZE ); + blowfish_crypt_ecb( ctx, mode, input, output ); + + for( i = 0; i < BLOWFISH_BLOCKSIZE;i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, BLOWFISH_BLOCKSIZE ); + + input += BLOWFISH_BLOCKSIZE; + output += BLOWFISH_BLOCKSIZE; + length -= BLOWFISH_BLOCKSIZE; + } + } + else + { + while( length > 0 ) + { + for( i = 0; i < BLOWFISH_BLOCKSIZE; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + blowfish_crypt_ecb( ctx, mode, output, output ); + memcpy( iv, output, BLOWFISH_BLOCKSIZE ); + + input += BLOWFISH_BLOCKSIZE; + output += BLOWFISH_BLOCKSIZE; + length -= BLOWFISH_BLOCKSIZE; + } + } + + return( 0 ); +} + +#if defined(POLARSSL_CIPHER_MODE_CFB) +/* + * Blowfish CFB buffer encryption/decryption + */ +int blowfish_crypt_cfb64( blowfish_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ) +{ + int c; + size_t n = *iv_off; + + if( mode == BLOWFISH_DECRYPT ) + { + while( length-- ) + { + if( n == 0 ) + blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv ); + + c = *input++; + *output++ = (unsigned char)( c ^ iv[n] ); + iv[n] = (unsigned char) c; + + n = (n + 1) % BLOWFISH_BLOCKSIZE; + } + } + else + { + while( length-- ) + { + if( n == 0 ) + blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv ); + + iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); + + n = (n + 1) % BLOWFISH_BLOCKSIZE; + } + } + + *iv_off = n; + + return( 0 ); +} +#endif /*POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +/* + * Blowfish CTR buffer encryption/decryption + */ +int blowfish_crypt_ctr( blowfish_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[BLOWFISH_BLOCKSIZE], + unsigned char stream_block[BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output ) +{ + int c, i; + size_t n = *nc_off; + + while( length-- ) + { + if( n == 0 ) { + blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, nonce_counter, stream_block ); + + for( i = BLOWFISH_BLOCKSIZE; i > 0; i-- ) + if( ++nonce_counter[i - 1] != 0 ) + break; + } + c = *input++; + *output++ = (unsigned char)( c ^ stream_block[n] ); + + n = (n + 1) % BLOWFISH_BLOCKSIZE; + } + + *nc_off = n; + + return( 0 ); +} +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +static const uint32_t S[4][256] = { + { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, + 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, + 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, + 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, + 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, + 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, + 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, + 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, + 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, + 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, + 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, + 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, + 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, + 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, + 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, + 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, + 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, + 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, + 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, + 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, + 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, + 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, + 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, + 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, + 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, + 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, + 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, + 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, + 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, + 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, + 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, + 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, + 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, + 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, + 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, + 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, + 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, + 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, + 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, + 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, + 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, + 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, + 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, + 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, + 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, + 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, + 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, + 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, + 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, + 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, + 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, + 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, + 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, + 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, + 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, + 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, + 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, + 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, + 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, + 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, + 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, + 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, + 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, + 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL }, + { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, + 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, + 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, + 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, + 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, + 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, + 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, + 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, + 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, + 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, + 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, + 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, + 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, + 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, + 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, + 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, + 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, + 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, + 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, + 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, + 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, + 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, + 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, + 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, + 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, + 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, + 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, + 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, + 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, + 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, + 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, + 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, + 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, + 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, + 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, + 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, + 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, + 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, + 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, + 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, + 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, + 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, + 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, + 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, + 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, + 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, + 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, + 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, + 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, + 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, + 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, + 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, + 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, + 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, + 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, + 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, + 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, + 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, + 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, + 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, + 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, + 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, + 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, + 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L }, + { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, + 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, + 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, + 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, + 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, + 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, + 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, + 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, + 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, + 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, + 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, + 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, + 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, + 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, + 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, + 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, + 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, + 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, + 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, + 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, + 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, + 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, + 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, + 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, + 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, + 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, + 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, + 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, + 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, + 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, + 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, + 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, + 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, + 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, + 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, + 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, + 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, + 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, + 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, + 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, + 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, + 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, + 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, + 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, + 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, + 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, + 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, + 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, + 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, + 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, + 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, + 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, + 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, + 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, + 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, + 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, + 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, + 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, + 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, + 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, + 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, + 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, + 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, + 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L }, + { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, + 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, + 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, + 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, + 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, + 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, + 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, + 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, + 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, + 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, + 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, + 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, + 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, + 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, + 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, + 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, + 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, + 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, + 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, + 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, + 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, + 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, + 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, + 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, + 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, + 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, + 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, + 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, + 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, + 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, + 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, + 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, + 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, + 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, + 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, + 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, + 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, + 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, + 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, + 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, + 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, + 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, + 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, + 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, + 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, + 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, + 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, + 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, + 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, + 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, + 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, + 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, + 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, + 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, + 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, + 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, + 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, + 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, + 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, + 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, + 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, + 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, + 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, + 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L } +}; + +#endif /* !POLARSSL_BLOWFISH_ALT */ +#endif /* POLARSSL_BLOWFISH_C */ diff --git a/Externals/polarssl/library/camellia.c b/Externals/polarssl/library/camellia.c new file mode 100644 index 0000000000..bb8787503b --- /dev/null +++ b/Externals/polarssl/library/camellia.c @@ -0,0 +1,1035 @@ +/* + * Camellia implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The Camellia block cipher was designed by NTT and Mitsubishi Electric + * Corporation. + * + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_CAMELLIA_C) + +#include "polarssl/camellia.h" + +#if !defined(POLARSSL_CAMELLIA_ALT) + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +static const unsigned char SIGMA_CHARS[6][8] = +{ + { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b }, + { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 }, + { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe }, + { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c }, + { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d }, + { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd } +}; + +#if defined(POLARSSL_CAMELLIA_SMALL_MEMORY) + +static const unsigned char FSb[256] = +{ + 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65, + 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189, + 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26, + 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77, + 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153, + 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215, + 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34, + 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80, + 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210, + 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148, + 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226, + 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46, + 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89, + 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250, + 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164, + 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158 +}; + +#define SBOX1(n) FSb[(n)] +#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff) +#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff) +#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff] + +#else + +static const unsigned char FSb[256] = +{ + 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65, + 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189, + 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26, + 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77, + 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, + 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, + 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, + 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80, + 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210, + 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148, + 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226, + 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, + 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, + 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, + 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164, + 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158 +}; + +static const unsigned char FSb2[256] = +{ + 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130, + 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123, + 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52, + 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154, + 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51, + 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175, + 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68, + 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160, + 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165, + 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41, + 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197, + 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92, + 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178, + 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245, + 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73, + 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61 +}; + +static const unsigned char FSb3[256] = +{ + 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160, + 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222, + 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13, + 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166, + 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204, + 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235, + 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17, + 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40, + 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105, + 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74, + 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113, + 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23, + 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172, + 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125, + 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82, + 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79 +}; + +static const unsigned char FSb4[256] = +{ + 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146, + 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108, + 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4, + 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105, + 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221, + 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99, + 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141, + 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128, + 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189, + 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77, + 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215, + 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80, + 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148, + 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46, + 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250, + 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158 +}; + +#define SBOX1(n) FSb[(n)] +#define SBOX2(n) FSb2[(n)] +#define SBOX3(n) FSb3[(n)] +#define SBOX4(n) FSb4[(n)] + +#endif + +static const unsigned char shifts[2][4][4] = +{ + { + { 1, 1, 1, 1 }, /* KL */ + { 0, 0, 0, 0 }, /* KR */ + { 1, 1, 1, 1 }, /* KA */ + { 0, 0, 0, 0 } /* KB */ + }, + { + { 1, 0, 1, 1 }, /* KL */ + { 1, 1, 0, 1 }, /* KR */ + { 1, 1, 1, 0 }, /* KA */ + { 1, 1, 0, 1 } /* KB */ + } +}; + +static const signed char indexes[2][4][20] = +{ + { + { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39, + 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */ + { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */ + { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, + 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */ + { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */ + }, + { + { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1, + -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */ + { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17, + 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */ + { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59, + 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */ + { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21, + 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */ + } +}; + +static const signed char transposes[2][20] = +{ + { + 21, 22, 23, 20, + -1, -1, -1, -1, + 18, 19, 16, 17, + 11, 8, 9, 10, + 15, 12, 13, 14 + }, + { + 25, 26, 27, 24, + 29, 30, 31, 28, + 18, 19, 16, 17, + -1, -1, -1, -1, + -1, -1, -1, -1 + } +}; + +/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */ +#define ROTL(DEST, SRC, SHIFT) \ +{ \ + (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \ + (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \ + (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \ + (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \ +} + +#define FL(XL, XR, KL, KR) \ +{ \ + (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \ + (XL) = ((XR) | (KR)) ^ (XL); \ +} + +#define FLInv(YL, YR, KL, KR) \ +{ \ + (YL) = ((YR) | (KR)) ^ (YL); \ + (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \ +} + +#define SHIFT_AND_PLACE(INDEX, OFFSET) \ +{ \ + TK[0] = KC[(OFFSET) * 4 + 0]; \ + TK[1] = KC[(OFFSET) * 4 + 1]; \ + TK[2] = KC[(OFFSET) * 4 + 2]; \ + TK[3] = KC[(OFFSET) * 4 + 3]; \ + \ + for ( i = 1; i <= 4; i++ ) \ + if (shifts[(INDEX)][(OFFSET)][i -1]) \ + ROTL(TK + i * 4, TK, (15 * i) % 32); \ + \ + for ( i = 0; i < 20; i++ ) \ + if (indexes[(INDEX)][(OFFSET)][i] != -1) { \ + RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \ + } \ +} + +static void camellia_feistel(const uint32_t x[2], const uint32_t k[2], uint32_t z[2]) +{ + uint32_t I0, I1; + I0 = x[0] ^ k[0]; + I1 = x[1] ^ k[1]; + + I0 = (SBOX1((I0 >> 24) & 0xFF) << 24) | + (SBOX2((I0 >> 16) & 0xFF) << 16) | + (SBOX3((I0 >> 8) & 0xFF) << 8) | + (SBOX4((I0 ) & 0xFF) ); + I1 = (SBOX2((I1 >> 24) & 0xFF) << 24) | + (SBOX3((I1 >> 16) & 0xFF) << 16) | + (SBOX4((I1 >> 8) & 0xFF) << 8) | + (SBOX1((I1 ) & 0xFF) ); + + I0 ^= (I1 << 8) | (I1 >> 24); + I1 ^= (I0 << 16) | (I0 >> 16); + I0 ^= (I1 >> 8) | (I1 << 24); + I1 ^= (I0 >> 8) | (I0 << 24); + + z[0] ^= I1; + z[1] ^= I0; +} + +/* + * Camellia key schedule (encryption) + */ +int camellia_setkey_enc( camellia_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + int idx; + size_t i; + uint32_t *RK; + unsigned char t[64]; + uint32_t SIGMA[6][2]; + uint32_t KC[16]; + uint32_t TK[20]; + + RK = ctx->rk; + + memset(t, 0, 64); + memset(RK, 0, sizeof(ctx->rk)); + + switch( keysize ) + { + case 128: ctx->nr = 3; idx = 0; break; + case 192: + case 256: ctx->nr = 4; idx = 1; break; + default : return( POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH ); + } + + for( i = 0; i < keysize / 8; ++i) + t[i] = key[i]; + + if (keysize == 192) { + for (i = 0; i < 8; i++) + t[24 + i] = ~t[16 + i]; + } + + /* + * Prepare SIGMA values + */ + for (i = 0; i < 6; i++) { + GET_UINT32_BE(SIGMA[i][0], SIGMA_CHARS[i], 0); + GET_UINT32_BE(SIGMA[i][1], SIGMA_CHARS[i], 4); + } + + /* + * Key storage in KC + * Order: KL, KR, KA, KB + */ + memset(KC, 0, sizeof(KC)); + + /* Store KL, KR */ + for (i = 0; i < 8; i++) + GET_UINT32_BE(KC[i], t, i * 4); + + /* Generate KA */ + for( i = 0; i < 4; ++i) + KC[8 + i] = KC[i] ^ KC[4 + i]; + + camellia_feistel(KC + 8, SIGMA[0], KC + 10); + camellia_feistel(KC + 10, SIGMA[1], KC + 8); + + for( i = 0; i < 4; ++i) + KC[8 + i] ^= KC[i]; + + camellia_feistel(KC + 8, SIGMA[2], KC + 10); + camellia_feistel(KC + 10, SIGMA[3], KC + 8); + + if (keysize > 128) { + /* Generate KB */ + for( i = 0; i < 4; ++i) + KC[12 + i] = KC[4 + i] ^ KC[8 + i]; + + camellia_feistel(KC + 12, SIGMA[4], KC + 14); + camellia_feistel(KC + 14, SIGMA[5], KC + 12); + } + + /* + * Generating subkeys + */ + + /* Manipulating KL */ + SHIFT_AND_PLACE(idx, 0); + + /* Manipulating KR */ + if (keysize > 128) { + SHIFT_AND_PLACE(idx, 1); + } + + /* Manipulating KA */ + SHIFT_AND_PLACE(idx, 2); + + /* Manipulating KB */ + if (keysize > 128) { + SHIFT_AND_PLACE(idx, 3); + } + + /* Do transpositions */ + for ( i = 0; i < 20; i++ ) { + if (transposes[idx][i] != -1) { + RK[32 + 12 * idx + i] = RK[transposes[idx][i]]; + } + } + + return( 0 ); +} + +/* + * Camellia key schedule (decryption) + */ +int camellia_setkey_dec( camellia_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + int idx; + size_t i; + camellia_context cty; + uint32_t *RK; + uint32_t *SK; + int ret; + + switch( keysize ) + { + case 128: ctx->nr = 3; idx = 0; break; + case 192: + case 256: ctx->nr = 4; idx = 1; break; + default : return( POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH ); + } + + RK = ctx->rk; + + ret = camellia_setkey_enc(&cty, key, keysize); + if( ret != 0 ) + return( ret ); + + SK = cty.rk + 24 * 2 + 8 * idx * 2; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + for (i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4) + { + *RK++ = *SK++; + *RK++ = *SK++; + } + + SK -= 2; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + memset( &cty, 0, sizeof( camellia_context ) ); + + return( 0 ); +} + +/* + * Camellia-ECB block encryption/decryption + */ +int camellia_crypt_ecb( camellia_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ) +{ + int NR; + uint32_t *RK, X[4]; + + ( (void) mode ); + + NR = ctx->nr; + RK = ctx->rk; + + GET_UINT32_BE( X[0], input, 0 ); + GET_UINT32_BE( X[1], input, 4 ); + GET_UINT32_BE( X[2], input, 8 ); + GET_UINT32_BE( X[3], input, 12 ); + + X[0] ^= *RK++; + X[1] ^= *RK++; + X[2] ^= *RK++; + X[3] ^= *RK++; + + while (NR) { + --NR; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + + if (NR) { + FL(X[0], X[1], RK[0], RK[1]); + RK += 2; + FLInv(X[2], X[3], RK[0], RK[1]); + RK += 2; + } + } + + X[2] ^= *RK++; + X[3] ^= *RK++; + X[0] ^= *RK++; + X[1] ^= *RK++; + + PUT_UINT32_BE( X[2], output, 0 ); + PUT_UINT32_BE( X[3], output, 4 ); + PUT_UINT32_BE( X[0], output, 8 ); + PUT_UINT32_BE( X[1], output, 12 ); + + return( 0 ); +} + +/* + * Camellia-CBC buffer encryption/decryption + */ +int camellia_crypt_cbc( camellia_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[16]; + + if( length % 16 ) + return( POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH ); + + if( mode == CAMELLIA_DECRYPT ) + { + while( length > 0 ) + { + memcpy( temp, input, 16 ); + camellia_crypt_ecb( ctx, mode, input, output ); + + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + else + { + while( length > 0 ) + { + for( i = 0; i < 16; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + camellia_crypt_ecb( ctx, mode, output, output ); + memcpy( iv, output, 16 ); + + input += 16; + output += 16; + length -= 16; + } + } + + return( 0 ); +} + +#if defined(POLARSSL_CIPHER_MODE_CFB) +/* + * Camellia-CFB128 buffer encryption/decryption + */ +int camellia_crypt_cfb128( camellia_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int c; + size_t n = *iv_off; + + if( mode == CAMELLIA_DECRYPT ) + { + while( length-- ) + { + if( n == 0 ) + camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, iv, iv ); + + c = *input++; + *output++ = (unsigned char)( c ^ iv[n] ); + iv[n] = (unsigned char) c; + + n = (n + 1) & 0x0F; + } + } + else + { + while( length-- ) + { + if( n == 0 ) + camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, iv, iv ); + + iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; + + return( 0 ); +} +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +/* + * Camellia-CTR buffer encryption/decryption + */ +int camellia_crypt_ctr( camellia_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output ) +{ + int c, i; + size_t n = *nc_off; + + while( length-- ) + { + if( n == 0 ) { + camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, nonce_counter, stream_block ); + + for( i = 16; i > 0; i-- ) + if( ++nonce_counter[i - 1] != 0 ) + break; + } + c = *input++; + *output++ = (unsigned char)( c ^ stream_block[n] ); + + n = (n + 1) & 0x0F; + } + + *nc_off = n; + + return( 0 ); +} +#endif /* POLARSSL_CIPHER_MODE_CTR */ +#endif /* !POLARSSL_CAMELLIA_ALT */ + +#if defined(POLARSSL_SELF_TEST) + +#include + +/* + * Camellia test vectors from: + * + * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html: + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt + * (For each bitlength: Key 0, Nr 39) + */ +#define CAMELLIA_TESTS_ECB 2 + +static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] = +{ + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, +}; + +static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, + { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] = +{ + { + { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, + 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, + { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE, + 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 } + }, + { + { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, + 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, + { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9, + 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 } + }, + { + { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, + 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, + { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C, + 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 } + } +}; + +#define CAMELLIA_TESTS_CBC 3 + +static const unsigned char camellia_test_cbc_key[3][32] = +{ + { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } + , + { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, + 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, + 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B } + , + { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, + 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, + 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, + 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } +}; + +static const unsigned char camellia_test_cbc_iv[16] = + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F } +; + +static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] = +{ + { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, + 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }, + { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, + 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 }, + { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, + 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF } + +}; + +static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] = +{ + { + { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0, + 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB }, + { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78, + 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 }, + { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B, + 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 } + }, + { + { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2, + 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 }, + { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42, + 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 }, + { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8, + 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 } + }, + { + { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A, + 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA }, + { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40, + 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 }, + { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA, + 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 } + } +}; + +#if defined(POLARSSL_CIPHER_MODE_CTR) +/* + * Camellia-CTR test vectors from: + * + * http://www.faqs.org/rfcs/rfc5528.html + */ + +static const unsigned char camellia_test_ctr_key[3][16] = +{ + { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, + 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, + { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, + 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, + { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, + 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } +}; + +static const unsigned char camellia_test_ctr_nonce_counter[3][16] = +{ + { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, + 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, + 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } +}; + +static const unsigned char camellia_test_ctr_pt[3][48] = +{ + { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, + 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23 } +}; + +static const unsigned char camellia_test_ctr_ct[3][48] = +{ + { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A, + 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F }, + { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4, + 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44, + 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7, + 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 }, + { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88, + 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73, + 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1, + 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD, + 0xDF, 0x50, 0x86, 0x96 } +}; + +static const int camellia_test_ctr_len[3] = + { 16, 32, 36 }; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +/* + * Checkup routine + */ +int camellia_self_test( int verbose ) +{ + int i, j, u, v; + unsigned char key[32]; + unsigned char buf[64]; + unsigned char src[16]; + unsigned char dst[16]; + unsigned char iv[16]; +#if defined(POLARSSL_CIPHER_MODE_CTR) + size_t offset, len; + unsigned char nonce_counter[16]; + unsigned char stream_block[16]; +#endif + + camellia_context ctx; + + memset( key, 0, 32 ); + + for (j = 0; j < 6; j++) { + u = j >> 1; + v = j & 1; + + if( verbose != 0 ) + printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64, + (v == CAMELLIA_DECRYPT) ? "dec" : "enc"); + + for (i = 0; i < CAMELLIA_TESTS_ECB; i++ ) { + memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u); + + if (v == CAMELLIA_DECRYPT) { + camellia_setkey_dec(&ctx, key, 128 + u * 64); + memcpy(src, camellia_test_ecb_cipher[u][i], 16); + memcpy(dst, camellia_test_ecb_plain[i], 16); + } else { /* CAMELLIA_ENCRYPT */ + camellia_setkey_enc(&ctx, key, 128 + u * 64); + memcpy(src, camellia_test_ecb_plain[i], 16); + memcpy(dst, camellia_test_ecb_cipher[u][i], 16); + } + + camellia_crypt_ecb(&ctx, v, src, buf); + + if( memcmp( buf, dst, 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + /* + * CBC mode + */ + for( j = 0; j < 6; j++ ) + { + u = j >> 1; + v = j & 1; + + if( verbose != 0 ) + printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64, + ( v == CAMELLIA_DECRYPT ) ? "dec" : "enc" ); + + memcpy( src, camellia_test_cbc_iv, 16); + memcpy( dst, camellia_test_cbc_iv, 16); + memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u); + + if (v == CAMELLIA_DECRYPT) { + camellia_setkey_dec(&ctx, key, 128 + u * 64); + } else { + camellia_setkey_enc(&ctx, key, 128 + u * 64); + } + + for (i = 0; i < CAMELLIA_TESTS_CBC; i++ ) { + + if (v == CAMELLIA_DECRYPT) { + memcpy( iv , src, 16 ); + memcpy(src, camellia_test_cbc_cipher[u][i], 16); + memcpy(dst, camellia_test_cbc_plain[i], 16); + } else { /* CAMELLIA_ENCRYPT */ + memcpy( iv , dst, 16 ); + memcpy(src, camellia_test_cbc_plain[i], 16); + memcpy(dst, camellia_test_cbc_cipher[u][i], 16); + } + + camellia_crypt_cbc(&ctx, v, 16, iv, src, buf); + + if( memcmp( buf, dst, 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + +#if defined(POLARSSL_CIPHER_MODE_CTR) + /* + * CTR mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " CAMELLIA-CTR-128 (%s): ", + ( v == CAMELLIA_DECRYPT ) ? "dec" : "enc" ); + + memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 ); + memcpy( key, camellia_test_ctr_key[u], 16 ); + + offset = 0; + camellia_setkey_enc( &ctx, key, 128 ); + + if( v == CAMELLIA_DECRYPT ) + { + len = camellia_test_ctr_len[u]; + memcpy( buf, camellia_test_ctr_ct[u], len ); + + camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); + + if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + else + { + len = camellia_test_ctr_len[u]; + memcpy( buf, camellia_test_ctr_pt[u], len ); + + camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); + + if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); +#endif /* POLARSSL_CIPHER_MODE_CTR */ + + return ( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/certs.c b/Externals/polarssl/library/certs.c new file mode 100644 index 0000000000..e2d07f7628 --- /dev/null +++ b/Externals/polarssl/library/certs.c @@ -0,0 +1,196 @@ +/* + * X.509 test certificates + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_CERTS_C) + +const char test_ca_crt[] = +"-----BEGIN CERTIFICATE-----\r\n" +"MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" +"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" +"MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" +"A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" +"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" +"mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" +"50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" +"YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" +"R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" +"KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" +"gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" +"/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" +"BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" +"dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" +"SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" +"DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" +"pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" +"m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" +"7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const char test_ca_key[] = +"-----BEGIN RSA PRIVATE KEY-----\r\n" +"Proc-Type: 4,ENCRYPTED\r\n" +"DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n" +"\r\n" +"9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n" +"7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n" +"Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n" +"PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n" +"GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n" +"gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n" +"QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n" +"PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n" +"vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n" +"WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n" +"JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n" +"KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n" +"Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n" +"9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n" +"iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n" +"tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n" +"P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n" +"1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n" +"nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n" +"X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n" +"rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n" +"L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n" +"I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n" +"wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n" +"P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n" +"-----END RSA PRIVATE KEY-----\r\n"; + +const char test_ca_pwd[] = "PolarSSLTest"; + +const char test_srv_crt[] = +"-----BEGIN CERTIFICATE-----\r\n" +"MIIDPzCCAiegAwIBAgIBATANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" +"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" +"MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" +"A1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIFNlcnZlciAxMIIBIjAN\r\n" +"BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqQIfPUBq1VVTi/027oJlLhVhXom/\r\n" +"uOhFkNvuiBZS0/FDUEeWEllkh2v9K+BG+XO+3c+S4ZFb7Wagb4kpeUWA0INq1UFD\r\n" +"d185fAkER4KwVzlw7aPsFRkeqDMIR8EFQqn9TMO0390GH00QUUBncxMPQPhtgSVf\r\n" +"CrFTxjB+FTms+Vruf5KepgVb5xOXhbUjktnUJAbVCSWJdQfdphqPPwkZvq1lLGTr\r\n" +"lZvc/kFeF6babFtpzAK6FCwWJJxK3M3Q91Jnc/EtoCP9fvQxyi1wyokLBNsupk9w\r\n" +"bp7OvViJ4lNZnm5akmXiiD8MlBmj3eXonZUT7Snbq3AS3FrKaxerUoJUsQIDAQAB\r\n" +"o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBQfdNY/KcF0dEU7BRIsPai9Q1kCpjAf\r\n" +"BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQUFAAOC\r\n" +"AQEAvc+WwZUemsJu2IiI2Cp6liA+UAvIx98dQe3kZs2zAoF9VwQbXcYzWQ/BILkj\r\n" +"NImKbPL9x0g2jIDn4ZvGYFywMwIO/d++YbwYiQw42/v7RiMy94zBPnzeHi86dy/0\r\n" +"jpOOJUx3IXRsGLdyjb/1T11klcFqGnARiK+8VYolMPP6afKvLXX7K4kiUpsFQhUp\r\n" +"E5VeM5pV1Mci2ETOJau2cO40FJvI/C9W/wR+GAArMaw2fxG77E3laaa0LAOlexM6\r\n" +"A4KOb5f5cGTM5Ih6tEF5FVq3/9vzNIYMa1FqzacBLZF8zSHYLEimXBdzjBoN4qDU\r\n" +"/WzRyYRBRjAI49mzHX6raleqnw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const char test_srv_key[] = +"-----BEGIN RSA PRIVATE KEY-----\r\n" +"MIIEogIBAAKCAQEAqQIfPUBq1VVTi/027oJlLhVhXom/uOhFkNvuiBZS0/FDUEeW\r\n" +"Ellkh2v9K+BG+XO+3c+S4ZFb7Wagb4kpeUWA0INq1UFDd185fAkER4KwVzlw7aPs\r\n" +"FRkeqDMIR8EFQqn9TMO0390GH00QUUBncxMPQPhtgSVfCrFTxjB+FTms+Vruf5Ke\r\n" +"pgVb5xOXhbUjktnUJAbVCSWJdQfdphqPPwkZvq1lLGTrlZvc/kFeF6babFtpzAK6\r\n" +"FCwWJJxK3M3Q91Jnc/EtoCP9fvQxyi1wyokLBNsupk9wbp7OvViJ4lNZnm5akmXi\r\n" +"iD8MlBmj3eXonZUT7Snbq3AS3FrKaxerUoJUsQIDAQABAoIBABaJ9eiRQq4Ypv+w\r\n" +"UTcVpLC0oTueWzcpor1i1zjG4Vzqe/Ok2FqyGToGKMlFK7Hwwa+LEyeJ3xyV5yd4\r\n" +"v1Mw9bDZFdJC1eCBjoUAHtX6k9HOE0Vd6woVQ4Vi6OPI1g7B5Mnr/58rNrnN6TMs\r\n" +"x58NF6euecwTU811QJrZtLbX7j2Cr28yB2Vs8qyYlHwVw5jbDOv43D7vU5gmlIDN\r\n" +"0JQRuWAnOuPzZNoJr4SfJKqHNGxYYY6pHZ1s0dOTLIDb/B8KQWapA2kRmZyid2EH\r\n" +"nwzgLbAsHJCf+bQnhXjXuxtUsrcIL8noZLazlOMxwNEammglVWW23Ud/QRnFgJg5\r\n" +"UgcAcRECgYEA19uYetht5qmwdJ+12oC6zeO+vXLcyD9gon23T5J6w2YThld7/OW0\r\n" +"oArQJGgkAdaq0pcTyOIjtTQVMFygdVmCEJmxh/3RutPcTeydqW9fphKDMej32J8e\r\n" +"GniGmNGiclbcfNOS8E5TGp445yZb9P1+7AHng16bGg3Ykj5EA4G+HCcCgYEAyHAl\r\n" +"//ekk8YjQElm+8izLtFkymIK0aCtEe9C/RIRhFYBeFaotC5dStNhBOncn4ovMAPD\r\n" +"lX/92yDi9OP8PPLN3a4B9XpW3k/SS5GrbT5cwOivBHNllZSmu/2qz5WPGcjVCOrB\r\n" +"LYl3YWr2h3EGKICT03kEoTkiDBvCeOpW7cCGl2cCgYBD5whoXHz1+ptPlI4YVjZt\r\n" +"Xh86aU+ajpVPiEyJ84I6xXmO4SZXv8q6LaycR0ZMbcL+zBelMb4Z2nBv7jNrtuR7\r\n" +"ZF28cdPv+YVr3esaybZE/73VjXup4SQPH6r3l7qKTVi+y6+FeJ4b2Xn8/MwgnT23\r\n" +"8EFrye7wmzpthrjOgZnUMQKBgE9Lhsz/5J0Nis6Y+2Pqn3CLKEukg9Ewtqdct2y0\r\n" +"5Dcta0F3TyCRIxlCDKTL/BslqMtfAdY4H268UO0+8IAQMn9boqzBrHIgs/pvc5kx\r\n" +"TbKHmw2wtWR6vYersBKVgVpbCGSRssDYHGFu1n74qM4HJ/RGcR1zI9QUe1gopSFD\r\n" +"xDtLAoGAVAdWvrqDwgoL2hHW3scGpxdE/ygJDOwHnf+1B9goKAOP5lf2FJaiAxf3\r\n" +"ectoPOgZbCmm/iiDmigu703ld3O+VoCLDD4qx3R+KyALL78gtVJYzSRiKhzgCZ3g\r\n" +"mKsIVRBq4IfwiwyMNG2BYZQAwbSDjjPtn/kPBduPzPj7eriByhI=\r\n" +"-----END RSA PRIVATE KEY-----\r\n"; + +const char test_cli_crt[] = +"-----BEGIN CERTIFICATE-----\r\n" +"MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" +"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" +"MTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" +"A1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" +"BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" +"M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" +"1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" +"MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" +"4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" +"/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" +"o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" +"BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQUFAAOC\r\n" +"AQEAAn86isAM8X+mVwJqeItt6E9slhEQbAofyk+diH1Lh8Y9iLlWQSKbw/UXYjx5\r\n" +"LLPZcniovxIcARC/BjyZR9g3UwTHNGNm+rwrqa15viuNOFBchykX/Orsk02EH7NR\r\n" +"Alw5WLPorYjED6cdVQgBl9ot93HdJogRiXCxErM7NC8/eP511mjq+uLDjLKH8ZPQ\r\n" +"8I4ekHJnroLsDkIwXKGIsvIBHQy2ac/NwHLCQOK6mfum1pRx52V4Utu5dLLjD5bM\r\n" +"xOBC7KU4xZKuMXXZM6/93Yb51K/J4ahf1TxJlTWXtnzDr9saEYdNy2SKY/6ZiDNH\r\n" +"D+stpAKiQLAWaAusIWKYEyw9MQ==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const char test_cli_key[] = +"-----BEGIN RSA PRIVATE KEY-----\r\n" +"MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" +"B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" +"bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" +"Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" +"7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" +"dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" +"yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" +"4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" +"ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" +"zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" +"l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" +"DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" +"VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" +"Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" +"wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" +"c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" +"33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" +"ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" +"BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" +"KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" +"UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" +"7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" +"gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" +"bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" +"8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" +"-----END RSA PRIVATE KEY-----\r\n"; + +const char test_dhm_params[] = +"-----BEGIN DH PARAMETERS-----\r\n" +"MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n" +"1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n" +"9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n" +"-----END DH PARAMETERS-----\r\n"; + +#endif diff --git a/Externals/polarssl/library/cipher.c b/Externals/polarssl/library/cipher.c new file mode 100644 index 0000000000..f20cc73b48 --- /dev/null +++ b/Externals/polarssl/library/cipher.c @@ -0,0 +1,601 @@ +/** + * \file cipher.c + * + * \brief Generic cipher wrapper for PolarSSL + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_CIPHER_C) + +#include "polarssl/cipher.h" +#include "polarssl/cipher_wrap.h" + +#include + +#if defined _MSC_VER && !defined strcasecmp +#define strcasecmp _stricmp +#endif + +static const int supported_ciphers[] = { + +#if defined(POLARSSL_AES_C) + POLARSSL_CIPHER_AES_128_CBC, + POLARSSL_CIPHER_AES_192_CBC, + POLARSSL_CIPHER_AES_256_CBC, + +#if defined(POLARSSL_CIPHER_MODE_CFB) + POLARSSL_CIPHER_AES_128_CFB128, + POLARSSL_CIPHER_AES_192_CFB128, + POLARSSL_CIPHER_AES_256_CFB128, +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + POLARSSL_CIPHER_AES_128_CTR, + POLARSSL_CIPHER_AES_192_CTR, + POLARSSL_CIPHER_AES_256_CTR, +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif /* defined(POLARSSL_AES_C) */ + +#if defined(POLARSSL_CAMELLIA_C) + POLARSSL_CIPHER_CAMELLIA_128_CBC, + POLARSSL_CIPHER_CAMELLIA_192_CBC, + POLARSSL_CIPHER_CAMELLIA_256_CBC, + +#if defined(POLARSSL_CIPHER_MODE_CFB) + POLARSSL_CIPHER_CAMELLIA_128_CFB128, + POLARSSL_CIPHER_CAMELLIA_192_CFB128, + POLARSSL_CIPHER_CAMELLIA_256_CFB128, +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + POLARSSL_CIPHER_CAMELLIA_128_CTR, + POLARSSL_CIPHER_CAMELLIA_192_CTR, + POLARSSL_CIPHER_CAMELLIA_256_CTR, +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif /* defined(POLARSSL_CAMELLIA_C) */ + +#if defined(POLARSSL_DES_C) + POLARSSL_CIPHER_DES_CBC, + POLARSSL_CIPHER_DES_EDE_CBC, + POLARSSL_CIPHER_DES_EDE3_CBC, +#endif /* defined(POLARSSL_DES_C) */ + +#if defined(POLARSSL_BLOWFISH_C) + POLARSSL_CIPHER_BLOWFISH_CBC, + +#if defined(POLARSSL_CIPHER_MODE_CFB) + POLARSSL_CIPHER_BLOWFISH_CFB64, +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + POLARSSL_CIPHER_BLOWFISH_CTR, +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif /* defined(POLARSSL_BLOWFISH_C) */ + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + POLARSSL_CIPHER_NULL, +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + + 0 +}; + +const int *cipher_list( void ) +{ + return supported_ciphers; +} + +const cipher_info_t *cipher_info_from_type( const cipher_type_t cipher_type ) +{ + /* Find static cipher information */ + switch ( cipher_type ) + { +#if defined(POLARSSL_AES_C) + case POLARSSL_CIPHER_AES_128_CBC: + return &aes_128_cbc_info; + case POLARSSL_CIPHER_AES_192_CBC: + return &aes_192_cbc_info; + case POLARSSL_CIPHER_AES_256_CBC: + return &aes_256_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) + case POLARSSL_CIPHER_AES_128_CFB128: + return &aes_128_cfb128_info; + case POLARSSL_CIPHER_AES_192_CFB128: + return &aes_192_cfb128_info; + case POLARSSL_CIPHER_AES_256_CFB128: + return &aes_256_cfb128_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + case POLARSSL_CIPHER_AES_128_CTR: + return &aes_128_ctr_info; + case POLARSSL_CIPHER_AES_192_CTR: + return &aes_192_ctr_info; + case POLARSSL_CIPHER_AES_256_CTR: + return &aes_256_ctr_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif + +#if defined(POLARSSL_CAMELLIA_C) + case POLARSSL_CIPHER_CAMELLIA_128_CBC: + return &camellia_128_cbc_info; + case POLARSSL_CIPHER_CAMELLIA_192_CBC: + return &camellia_192_cbc_info; + case POLARSSL_CIPHER_CAMELLIA_256_CBC: + return &camellia_256_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) + case POLARSSL_CIPHER_CAMELLIA_128_CFB128: + return &camellia_128_cfb128_info; + case POLARSSL_CIPHER_CAMELLIA_192_CFB128: + return &camellia_192_cfb128_info; + case POLARSSL_CIPHER_CAMELLIA_256_CFB128: + return &camellia_256_cfb128_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + case POLARSSL_CIPHER_CAMELLIA_128_CTR: + return &camellia_128_ctr_info; + case POLARSSL_CIPHER_CAMELLIA_192_CTR: + return &camellia_192_ctr_info; + case POLARSSL_CIPHER_CAMELLIA_256_CTR: + return &camellia_256_ctr_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif + +#if defined(POLARSSL_DES_C) + case POLARSSL_CIPHER_DES_CBC: + return &des_cbc_info; + case POLARSSL_CIPHER_DES_EDE_CBC: + return &des_ede_cbc_info; + case POLARSSL_CIPHER_DES_EDE3_CBC: + return &des_ede3_cbc_info; +#endif + +#if defined(POLARSSL_BLOWFISH_C) + case POLARSSL_CIPHER_BLOWFISH_CBC: + return &blowfish_cbc_info; + +#if defined(POLARSSL_CIPHER_MODE_CFB) + case POLARSSL_CIPHER_BLOWFISH_CFB64: + return &blowfish_cfb64_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + case POLARSSL_CIPHER_BLOWFISH_CTR: + return &blowfish_ctr_info; +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ + +#endif + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + case POLARSSL_CIPHER_NULL: + return &null_cipher_info; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + + default: + return NULL; + } +} + +const cipher_info_t *cipher_info_from_string( const char *cipher_name ) +{ + if( NULL == cipher_name ) + return NULL; + + /* Get the appropriate cipher information */ +#if defined(POLARSSL_CAMELLIA_C) + if( !strcasecmp( "CAMELLIA-128-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CBC ); + if( !strcasecmp( "CAMELLIA-192-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CBC ); + if( !strcasecmp( "CAMELLIA-256-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CBC ); + +#if defined(POLARSSL_CIPHER_MODE_CFB) + if( !strcasecmp( "CAMELLIA-128-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CFB128 ); + if( !strcasecmp( "CAMELLIA-192-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CFB128 ); + if( !strcasecmp( "CAMELLIA-256-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CFB128 ); +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + if( !strcasecmp( "CAMELLIA-128-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CTR ); + if( !strcasecmp( "CAMELLIA-192-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CTR ); + if( !strcasecmp( "CAMELLIA-256-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CTR ); +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ +#endif + +#if defined(POLARSSL_AES_C) + if( !strcasecmp( "AES-128-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CBC ); + if( !strcasecmp( "AES-192-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CBC ); + if( !strcasecmp( "AES-256-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CBC ); + +#if defined(POLARSSL_CIPHER_MODE_CFB) + if( !strcasecmp( "AES-128-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CFB128 ); + if( !strcasecmp( "AES-192-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CFB128 ); + if( !strcasecmp( "AES-256-CFB128", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CFB128 ); +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + if( !strcasecmp( "AES-128-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CTR ); + if( !strcasecmp( "AES-192-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CTR ); + if( !strcasecmp( "AES-256-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CTR ); +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ +#endif + +#if defined(POLARSSL_DES_C) + if( !strcasecmp( "DES-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_DES_CBC ); + if( !strcasecmp( "DES-EDE-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_DES_EDE_CBC ); + if( !strcasecmp( "DES-EDE3-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_DES_EDE3_CBC ); +#endif + +#if defined(POLARSSL_BLOWFISH_C) + if( !strcasecmp( "BLOWFISH-CBC", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CBC ); + +#if defined(POLARSSL_CIPHER_MODE_CFB) + if( !strcasecmp( "BLOWFISH-CFB64", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CFB64 ); +#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) + if( !strcasecmp( "BLOWFISH-CTR", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CTR ); +#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */ +#endif + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if( !strcasecmp( "NULL", cipher_name ) ) + return cipher_info_from_type( POLARSSL_CIPHER_NULL ); +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + + return NULL; +} + +int cipher_init_ctx( cipher_context_t *ctx, const cipher_info_t *cipher_info ) +{ + if( NULL == cipher_info || NULL == ctx ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + memset( ctx, 0, sizeof( cipher_context_t ) ); + + if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) ) + return POLARSSL_ERR_CIPHER_ALLOC_FAILED; + + ctx->cipher_info = cipher_info; + + return 0; +} + +int cipher_free_ctx( cipher_context_t *ctx ) +{ + if( ctx == NULL || ctx->cipher_info == NULL ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx ); + + return 0; +} + +int cipher_setkey( cipher_context_t *ctx, const unsigned char *key, + int key_length, const operation_t operation ) +{ + if( NULL == ctx || NULL == ctx->cipher_info ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + ctx->key_length = key_length; + ctx->operation = operation; + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if( ctx->cipher_info->mode == POLARSSL_MODE_NULL ) + return 0; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + + /* + * For CFB and CTR mode always use the encryption key schedule + */ + if( POLARSSL_ENCRYPT == operation || + POLARSSL_MODE_CFB == ctx->cipher_info->mode || + POLARSSL_MODE_CTR == ctx->cipher_info->mode ) + { + return ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key, + ctx->key_length ); + } + + if( POLARSSL_DECRYPT == operation ) + return ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key, + ctx->key_length ); + + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; +} + +int cipher_reset( cipher_context_t *ctx, const unsigned char *iv ) +{ + if( NULL == ctx || NULL == ctx->cipher_info || NULL == iv ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + ctx->unprocessed_len = 0; + + memcpy( ctx->iv, iv, cipher_get_iv_size( ctx ) ); + + return 0; +} + +int cipher_update( cipher_context_t *ctx, const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen ) +{ + int ret; + size_t copy_len = 0; + + if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen || + input == output ) + { + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + } + + *olen = 0; + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if( ctx->cipher_info->mode == POLARSSL_MODE_NULL ) + { + memcpy( output, input, ilen ); + *olen = ilen; + return 0; + } +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + + if( ctx->cipher_info->mode == POLARSSL_MODE_CBC ) + { + /* + * If there is not enough data for a full block, cache it. + */ + if( ( ctx->operation == POLARSSL_DECRYPT && + ilen + ctx->unprocessed_len <= cipher_get_block_size( ctx ) ) || + ( ctx->operation == POLARSSL_ENCRYPT && + ilen + ctx->unprocessed_len < cipher_get_block_size( ctx ) ) ) + { + memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, + ilen ); + + ctx->unprocessed_len += ilen; + return 0; + } + + /* + * Process cached data first + */ + if( ctx->unprocessed_len != 0 ) + { + copy_len = cipher_get_block_size( ctx ) - ctx->unprocessed_len; + + memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, + copy_len ); + + if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, + ctx->operation, cipher_get_block_size( ctx ), ctx->iv, + ctx->unprocessed_data, output ) ) ) + { + return ret; + } + + *olen += cipher_get_block_size( ctx ); + output += cipher_get_block_size( ctx ); + ctx->unprocessed_len = 0; + + input += copy_len; + ilen -= copy_len; + } + + /* + * Cache final, incomplete block + */ + if( 0 != ilen ) + { + copy_len = ilen % cipher_get_block_size( ctx ); + if( copy_len == 0 && ctx->operation == POLARSSL_DECRYPT ) + copy_len = cipher_get_block_size(ctx); + + memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ), + copy_len ); + + ctx->unprocessed_len += copy_len; + ilen -= copy_len; + } + + /* + * Process remaining full blocks + */ + if( ilen ) + { + if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, + ctx->operation, ilen, ctx->iv, input, output ) ) ) + { + return ret; + } + *olen += ilen; + } + + return 0; + } + + if( ctx->cipher_info->mode == POLARSSL_MODE_CFB ) + { + if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx, + ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv, + input, output ) ) ) + { + return ret; + } + + *olen = ilen; + + return 0; + } + + if( ctx->cipher_info->mode == POLARSSL_MODE_CTR ) + { + if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx, + ilen, &ctx->unprocessed_len, ctx->iv, + ctx->unprocessed_data, input, output ) ) ) + { + return ret; + } + + *olen = ilen; + + return 0; + } + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +static void add_pkcs_padding( unsigned char *output, size_t output_len, + size_t data_len ) +{ + size_t padding_len = output_len - data_len; + unsigned char i = 0; + + for( i = 0; i < padding_len; i++ ) + output[data_len + i] = (unsigned char) padding_len; +} + +static int get_pkcs_padding( unsigned char *input, unsigned int input_len, + size_t *data_len) +{ + unsigned int i, padding_len = 0; + + if( NULL == input || NULL == data_len ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + padding_len = input[input_len - 1]; + + if( padding_len > input_len ) + return POLARSSL_ERR_CIPHER_INVALID_PADDING; + + for( i = input_len - padding_len; i < input_len; i++ ) + if( input[i] != padding_len ) + return POLARSSL_ERR_CIPHER_INVALID_PADDING; + + *data_len = input_len - padding_len; + + return 0; +} + +int cipher_finish( cipher_context_t *ctx, unsigned char *output, size_t *olen) +{ + int ret = 0; + + if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen ) + return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA; + + *olen = 0; + + if( POLARSSL_MODE_CFB == ctx->cipher_info->mode || + POLARSSL_MODE_CTR == ctx->cipher_info->mode || + POLARSSL_MODE_NULL == ctx->cipher_info->mode ) + { + return 0; + } + + if( POLARSSL_MODE_CBC == ctx->cipher_info->mode ) + { + if( POLARSSL_ENCRYPT == ctx->operation ) + { + add_pkcs_padding( ctx->unprocessed_data, cipher_get_iv_size( ctx ), + ctx->unprocessed_len ); + } + else if ( cipher_get_block_size( ctx ) != ctx->unprocessed_len ) + { + /* For decrypt operations, expect a full block */ + return POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED; + } + + /* cipher block */ + if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, + ctx->operation, cipher_get_block_size( ctx ), ctx->iv, + ctx->unprocessed_data, output ) ) ) + { + return ret; + } + + /* Set output size for decryption */ + if( POLARSSL_DECRYPT == ctx->operation ) + return get_pkcs_padding( output, cipher_get_block_size( ctx ), olen ); + + /* Set output size for encryption */ + *olen = cipher_get_block_size( ctx ); + return 0; + } + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +#if defined(POLARSSL_SELF_TEST) + +#include + +#define ASSERT(x) if (!(x)) { \ + printf( "failed with %i at %s\n", value, (#x) ); \ + return( 1 ); \ +} +/* + * Checkup routine + */ + +int cipher_self_test( int verbose ) +{ + ((void) verbose); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/cipher_wrap.c b/Externals/polarssl/library/cipher_wrap.c new file mode 100644 index 0000000000..9437212747 --- /dev/null +++ b/Externals/polarssl/library/cipher_wrap.c @@ -0,0 +1,711 @@ +/** + * \file md_wrap.c + * + * \brief Generic cipher wrapper for PolarSSL + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_CIPHER_C) + +#include "polarssl/cipher_wrap.h" + +#if defined(POLARSSL_AES_C) +#include "polarssl/aes.h" +#endif + +#if defined(POLARSSL_CAMELLIA_C) +#include "polarssl/camellia.h" +#endif + +#if defined(POLARSSL_DES_C) +#include "polarssl/des.h" +#endif + +#if defined(POLARSSL_BLOWFISH_C) +#include "polarssl/blowfish.h" +#endif + +#include + +#if defined(POLARSSL_AES_C) + +int aes_crypt_cbc_wrap( void *ctx, operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + return aes_crypt_cbc( (aes_context *) ctx, operation, length, iv, input, output ); +} + +int aes_crypt_cfb128_wrap( void *ctx, operation_t operation, size_t length, + size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CFB) + return aes_crypt_cfb128( (aes_context *) ctx, operation, length, iv_off, iv, input, output ); +#else + ((void) ctx); + ((void) operation); + ((void) length); + ((void) iv_off); + ((void) iv); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int aes_crypt_ctr_wrap( void *ctx, size_t length, + size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CTR) + return aes_crypt_ctr( (aes_context *) ctx, length, nc_off, nonce_counter, + stream_block, input, output ); +#else + ((void) ctx); + ((void) length); + ((void) nc_off); + ((void) nonce_counter); + ((void) stream_block); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int aes_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return aes_setkey_dec( (aes_context *) ctx, key, key_length ); +} + +int aes_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return aes_setkey_enc( (aes_context *) ctx, key, key_length ); +} + +static void * aes_ctx_alloc( void ) +{ + return malloc( sizeof( aes_context ) ); +} + +static void aes_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const cipher_base_t aes_info = { + POLARSSL_CIPHER_ID_AES, + aes_crypt_cbc_wrap, + aes_crypt_cfb128_wrap, + aes_crypt_ctr_wrap, + aes_setkey_enc_wrap, + aes_setkey_dec_wrap, + aes_ctx_alloc, + aes_ctx_free +}; + +const cipher_info_t aes_128_cbc_info = { + POLARSSL_CIPHER_AES_128_CBC, + POLARSSL_MODE_CBC, + 128, + "AES-128-CBC", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_192_cbc_info = { + POLARSSL_CIPHER_AES_192_CBC, + POLARSSL_MODE_CBC, + 192, + "AES-192-CBC", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_256_cbc_info = { + POLARSSL_CIPHER_AES_256_CBC, + POLARSSL_MODE_CBC, + 256, + "AES-256-CBC", + 16, + 16, + &aes_info +}; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +const cipher_info_t aes_128_cfb128_info = { + POLARSSL_CIPHER_AES_128_CFB128, + POLARSSL_MODE_CFB, + 128, + "AES-128-CFB128", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_192_cfb128_info = { + POLARSSL_CIPHER_AES_192_CFB128, + POLARSSL_MODE_CFB, + 192, + "AES-192-CFB128", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_256_cfb128_info = { + POLARSSL_CIPHER_AES_256_CFB128, + POLARSSL_MODE_CFB, + 256, + "AES-256-CFB128", + 16, + 16, + &aes_info +}; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +const cipher_info_t aes_128_ctr_info = { + POLARSSL_CIPHER_AES_128_CTR, + POLARSSL_MODE_CTR, + 128, + "AES-128-CTR", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_192_ctr_info = { + POLARSSL_CIPHER_AES_192_CTR, + POLARSSL_MODE_CTR, + 192, + "AES-192-CTR", + 16, + 16, + &aes_info +}; + +const cipher_info_t aes_256_ctr_info = { + POLARSSL_CIPHER_AES_256_CTR, + POLARSSL_MODE_CTR, + 256, + "AES-256-CTR", + 16, + 16, + &aes_info +}; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +#endif + +#if defined(POLARSSL_CAMELLIA_C) + +int camellia_crypt_cbc_wrap( void *ctx, operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + return camellia_crypt_cbc( (camellia_context *) ctx, operation, length, iv, input, output ); +} + +int camellia_crypt_cfb128_wrap( void *ctx, operation_t operation, size_t length, + size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CFB) + return camellia_crypt_cfb128( (camellia_context *) ctx, operation, length, iv_off, iv, input, output ); +#else + ((void) ctx); + ((void) operation); + ((void) length); + ((void) iv_off); + ((void) iv); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int camellia_crypt_ctr_wrap( void *ctx, size_t length, + size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CTR) + return camellia_crypt_ctr( (camellia_context *) ctx, length, nc_off, nonce_counter, + stream_block, input, output ); +#else + ((void) ctx); + ((void) length); + ((void) nc_off); + ((void) nonce_counter); + ((void) stream_block); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return camellia_setkey_dec( (camellia_context *) ctx, key, key_length ); +} + +int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return camellia_setkey_enc( (camellia_context *) ctx, key, key_length ); +} + +static void * camellia_ctx_alloc( void ) +{ + return malloc( sizeof( camellia_context ) ); +} + +static void camellia_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const cipher_base_t camellia_info = { + POLARSSL_CIPHER_ID_CAMELLIA, + camellia_crypt_cbc_wrap, + camellia_crypt_cfb128_wrap, + camellia_crypt_ctr_wrap, + camellia_setkey_enc_wrap, + camellia_setkey_dec_wrap, + camellia_ctx_alloc, + camellia_ctx_free +}; + +const cipher_info_t camellia_128_cbc_info = { + POLARSSL_CIPHER_CAMELLIA_128_CBC, + POLARSSL_MODE_CBC, + 128, + "CAMELLIA-128-CBC", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_192_cbc_info = { + POLARSSL_CIPHER_CAMELLIA_192_CBC, + POLARSSL_MODE_CBC, + 192, + "CAMELLIA-192-CBC", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_256_cbc_info = { + POLARSSL_CIPHER_CAMELLIA_256_CBC, + POLARSSL_MODE_CBC, + 256, + "CAMELLIA-256-CBC", + 16, + 16, + &camellia_info +}; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +const cipher_info_t camellia_128_cfb128_info = { + POLARSSL_CIPHER_CAMELLIA_128_CFB128, + POLARSSL_MODE_CFB, + 128, + "CAMELLIA-128-CFB128", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_192_cfb128_info = { + POLARSSL_CIPHER_CAMELLIA_192_CFB128, + POLARSSL_MODE_CFB, + 192, + "CAMELLIA-192-CFB128", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_256_cfb128_info = { + POLARSSL_CIPHER_CAMELLIA_256_CFB128, + POLARSSL_MODE_CFB, + 256, + "CAMELLIA-256-CFB128", + 16, + 16, + &camellia_info +}; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +const cipher_info_t camellia_128_ctr_info = { + POLARSSL_CIPHER_CAMELLIA_128_CTR, + POLARSSL_MODE_CTR, + 128, + "CAMELLIA-128-CTR", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_192_ctr_info = { + POLARSSL_CIPHER_CAMELLIA_192_CTR, + POLARSSL_MODE_CTR, + 192, + "CAMELLIA-192-CTR", + 16, + 16, + &camellia_info +}; + +const cipher_info_t camellia_256_ctr_info = { + POLARSSL_CIPHER_CAMELLIA_256_CTR, + POLARSSL_MODE_CTR, + 256, + "CAMELLIA-256-CTR", + 16, + 16, + &camellia_info +}; +#endif /* POLARSSL_CIPHER_MODE_CTR */ + +#endif + +#if defined(POLARSSL_DES_C) + +int des_crypt_cbc_wrap( void *ctx, operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + return des_crypt_cbc( (des_context *) ctx, operation, length, iv, input, output ); +} + +int des3_crypt_cbc_wrap( void *ctx, operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + return des3_crypt_cbc( (des3_context *) ctx, operation, length, iv, input, output ); +} + +int des_crypt_cfb128_wrap( void *ctx, operation_t operation, size_t length, + size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + ((void) ctx); + ((void) operation); + ((void) length); + ((void) iv_off); + ((void) iv); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +int des_crypt_ctr_wrap( void *ctx, size_t length, + size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output ) +{ + ((void) ctx); + ((void) length); + ((void) nc_off); + ((void) nonce_counter); + ((void) stream_block); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + + +int des_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des_setkey_dec( (des_context *) ctx, key ); +} + +int des_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des_setkey_enc( (des_context *) ctx, key ); +} + +int des3_set2key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des3_set2key_dec( (des3_context *) ctx, key ); +} + +int des3_set2key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des3_set2key_enc( (des3_context *) ctx, key ); +} + +int des3_set3key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des3_set3key_dec( (des3_context *) ctx, key ); +} + +int des3_set3key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + ((void) key_length); + + return des3_set3key_enc( (des3_context *) ctx, key ); +} + +static void * des_ctx_alloc( void ) +{ + return malloc( sizeof( des_context ) ); +} + +static void * des3_ctx_alloc( void ) +{ + return malloc( sizeof( des3_context ) ); +} + +static void des_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const cipher_base_t des_info = { + POLARSSL_CIPHER_ID_DES, + des_crypt_cbc_wrap, + des_crypt_cfb128_wrap, + des_crypt_ctr_wrap, + des_setkey_enc_wrap, + des_setkey_dec_wrap, + des_ctx_alloc, + des_ctx_free +}; + +const cipher_info_t des_cbc_info = { + POLARSSL_CIPHER_DES_CBC, + POLARSSL_MODE_CBC, + POLARSSL_KEY_LENGTH_DES, + "DES-CBC", + 8, + 8, + &des_info +}; + +const cipher_base_t des_ede_info = { + POLARSSL_CIPHER_ID_DES, + des3_crypt_cbc_wrap, + des_crypt_cfb128_wrap, + des_crypt_ctr_wrap, + des3_set2key_enc_wrap, + des3_set2key_dec_wrap, + des3_ctx_alloc, + des_ctx_free +}; + +const cipher_info_t des_ede_cbc_info = { + POLARSSL_CIPHER_DES_EDE_CBC, + POLARSSL_MODE_CBC, + POLARSSL_KEY_LENGTH_DES_EDE, + "DES-EDE-CBC", + 8, + 8, + &des_ede_info +}; + +const cipher_base_t des_ede3_info = { + POLARSSL_CIPHER_ID_DES, + des3_crypt_cbc_wrap, + des_crypt_cfb128_wrap, + des_crypt_ctr_wrap, + des3_set3key_enc_wrap, + des3_set3key_dec_wrap, + des3_ctx_alloc, + des_ctx_free +}; + +const cipher_info_t des_ede3_cbc_info = { + POLARSSL_CIPHER_DES_EDE3_CBC, + POLARSSL_MODE_CBC, + POLARSSL_KEY_LENGTH_DES_EDE3, + "DES-EDE3-CBC", + 8, + 8, + &des_ede3_info +}; +#endif + +#if defined(POLARSSL_BLOWFISH_C) + +int blowfish_crypt_cbc_wrap( void *ctx, operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ + return blowfish_crypt_cbc( (blowfish_context *) ctx, operation, length, iv, input, output ); +} + +int blowfish_crypt_cfb64_wrap( void *ctx, operation_t operation, size_t length, + size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CFB) + return blowfish_crypt_cfb64( (blowfish_context *) ctx, operation, length, iv_off, iv, input, output ); +#else + ((void) ctx); + ((void) operation); + ((void) length); + ((void) iv_off); + ((void) iv); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int blowfish_crypt_ctr_wrap( void *ctx, size_t length, + size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output ) +{ +#if defined(POLARSSL_CIPHER_MODE_CTR) + return blowfish_crypt_ctr( (blowfish_context *) ctx, length, nc_off, nonce_counter, + stream_block, input, output ); +#else + ((void) ctx); + ((void) length); + ((void) nc_off); + ((void) nonce_counter); + ((void) stream_block); + ((void) input); + ((void) output); + + return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif +} + +int blowfish_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return blowfish_setkey( (blowfish_context *) ctx, key, key_length ); +} + +int blowfish_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_length ) +{ + return blowfish_setkey( (blowfish_context *) ctx, key, key_length ); +} + +static void * blowfish_ctx_alloc( void ) +{ + return malloc( sizeof( blowfish_context ) ); +} + +static void blowfish_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const cipher_base_t blowfish_info = { + POLARSSL_CIPHER_ID_BLOWFISH, + blowfish_crypt_cbc_wrap, + blowfish_crypt_cfb64_wrap, + blowfish_crypt_ctr_wrap, + blowfish_setkey_enc_wrap, + blowfish_setkey_dec_wrap, + blowfish_ctx_alloc, + blowfish_ctx_free +}; + +const cipher_info_t blowfish_cbc_info = { + POLARSSL_CIPHER_BLOWFISH_CBC, + POLARSSL_MODE_CBC, + 128, + "BLOWFISH-CBC", + 8, + 8, + &blowfish_info +}; + +#if defined(POLARSSL_CIPHER_MODE_CFB) +const cipher_info_t blowfish_cfb64_info = { + POLARSSL_CIPHER_BLOWFISH_CFB64, + POLARSSL_MODE_CFB, + 128, + "BLOWFISH-CFB64", + 8, + 8, + &blowfish_info +}; +#endif /* POLARSSL_CIPHER_MODE_CFB */ + +#if defined(POLARSSL_CIPHER_MODE_CTR) +const cipher_info_t blowfish_ctr_info = { + POLARSSL_CIPHER_BLOWFISH_CTR, + POLARSSL_MODE_CTR, + 128, + "BLOWFISH-CTR", + 8, + 8, + &blowfish_info +}; +#endif /* POLARSSL_CIPHER_MODE_CTR */ +#endif /* POLARSSL_BLOWFISH_C */ + +#if defined(POLARSSL_CIPHER_NULL_CIPHER) +static void * null_ctx_alloc( void ) +{ + return (void *) 1; +} + + +static void null_ctx_free( void *ctx ) +{ + ((void) ctx); +} + +const cipher_base_t null_base_info = { + POLARSSL_CIPHER_ID_NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + null_ctx_alloc, + null_ctx_free +}; + +const cipher_info_t null_cipher_info = { + POLARSSL_CIPHER_NULL, + POLARSSL_MODE_NULL, + 0, + "NULL", + 1, + 1, + &null_base_info +}; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#endif diff --git a/Externals/polarssl/library/ctr_drbg.c b/Externals/polarssl/library/ctr_drbg.c new file mode 100644 index 0000000000..8cf03712e0 --- /dev/null +++ b/Externals/polarssl/library/ctr_drbg.c @@ -0,0 +1,562 @@ +/* + * CTR_DRBG implementation based on AES-256 (NIST SP 800-90) + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The NIST SP 800-90 DRBGs are described in the following publucation. + * + * http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_CTR_DRBG_C) + +#include "polarssl/ctr_drbg.h" + +#if defined(POLARSSL_FS_IO) +#include +#endif + +/* + * Non-public function wrapped by ctr_crbg_init(). Necessary to allow NIST + * tests to succeed (which require known length fixed entropy) + */ +int ctr_drbg_init_entropy_len( + ctr_drbg_context *ctx, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len, + size_t entropy_len ) +{ + int ret; + unsigned char key[CTR_DRBG_KEYSIZE]; + + memset( ctx, 0, sizeof(ctr_drbg_context) ); + memset( key, 0, CTR_DRBG_KEYSIZE ); + + ctx->f_entropy = f_entropy; + ctx->p_entropy = p_entropy; + + ctx->entropy_len = entropy_len; + ctx->reseed_interval = CTR_DRBG_RESEED_INTERVAL; + + /* + * Initialize with an empty key + */ + aes_setkey_enc( &ctx->aes_ctx, key, CTR_DRBG_KEYBITS ); + + if( ( ret = ctr_drbg_reseed( ctx, custom, len ) ) != 0 ) + return( ret ); + + return( 0 ); +} + +int ctr_drbg_init( ctr_drbg_context *ctx, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len ) +{ + return( ctr_drbg_init_entropy_len( ctx, f_entropy, p_entropy, custom, len, + CTR_DRBG_ENTROPY_LEN ) ); +} + +void ctr_drbg_set_prediction_resistance( ctr_drbg_context *ctx, int resistance ) +{ + ctx->prediction_resistance = resistance; +} + +void ctr_drbg_set_entropy_len( ctr_drbg_context *ctx, size_t len ) +{ + ctx->entropy_len = len; +} + +void ctr_drbg_set_reseed_interval( ctr_drbg_context *ctx, int interval ) +{ + ctx->reseed_interval = interval; +} + +int block_cipher_df( unsigned char *output, + const unsigned char *data, size_t data_len ) +{ + unsigned char buf[CTR_DRBG_MAX_SEED_INPUT + CTR_DRBG_BLOCKSIZE + 16]; + unsigned char tmp[CTR_DRBG_SEEDLEN]; + unsigned char key[CTR_DRBG_KEYSIZE]; + unsigned char chain[CTR_DRBG_BLOCKSIZE]; + unsigned char *p = buf, *iv; + aes_context aes_ctx; + + int i, j, buf_len, use_len; + + memset( buf, 0, CTR_DRBG_MAX_SEED_INPUT + CTR_DRBG_BLOCKSIZE + 16 ); + + /* + * Construct IV (16 bytes) and S in buffer + * IV = Counter (in 32-bits) padded to 16 with zeroes + * S = Length input string (in 32-bits) || Length of output (in 32-bits) || + * data || 0x80 + * (Total is padded to a multiple of 16-bytes with zeroes) + */ + p = buf + CTR_DRBG_BLOCKSIZE; + *p++ = ( data_len >> 24 ) & 0xff; + *p++ = ( data_len >> 16 ) & 0xff; + *p++ = ( data_len >> 8 ) & 0xff; + *p++ = ( data_len ) & 0xff; + p += 3; + *p++ = CTR_DRBG_SEEDLEN; + memcpy( p, data, data_len ); + p[data_len] = 0x80; + + buf_len = CTR_DRBG_BLOCKSIZE + 8 + data_len + 1; + + for( i = 0; i < CTR_DRBG_KEYSIZE; i++ ) + key[i] = i; + + aes_setkey_enc( &aes_ctx, key, CTR_DRBG_KEYBITS ); + + /* + * Reduce data to POLARSSL_CTR_DRBG_SEEDLEN bytes of data + */ + for( j = 0; j < CTR_DRBG_SEEDLEN; j += CTR_DRBG_BLOCKSIZE ) + { + p = buf; + memset( chain, 0, CTR_DRBG_BLOCKSIZE ); + use_len = buf_len; + + while( use_len > 0 ) + { + for( i = 0; i < CTR_DRBG_BLOCKSIZE; i++ ) + chain[i] ^= p[i]; + p += CTR_DRBG_BLOCKSIZE; + use_len -= CTR_DRBG_BLOCKSIZE; + + aes_crypt_ecb( &aes_ctx, AES_ENCRYPT, chain, chain ); + } + + memcpy( tmp + j, chain, CTR_DRBG_BLOCKSIZE ); + + /* + * Update IV + */ + buf[3]++; + } + + /* + * Do final encryption with reduced data + */ + aes_setkey_enc( &aes_ctx, tmp, CTR_DRBG_KEYBITS ); + iv = tmp + CTR_DRBG_KEYSIZE; + p = output; + + for( j = 0; j < CTR_DRBG_SEEDLEN; j += CTR_DRBG_BLOCKSIZE ) + { + aes_crypt_ecb( &aes_ctx, AES_ENCRYPT, iv, iv ); + memcpy( p, iv, CTR_DRBG_BLOCKSIZE ); + p += CTR_DRBG_BLOCKSIZE; + } + + return( 0 ); +} + +int ctr_drbg_update_internal( ctr_drbg_context *ctx, + const unsigned char data[CTR_DRBG_SEEDLEN] ) +{ + unsigned char tmp[CTR_DRBG_SEEDLEN]; + unsigned char *p = tmp; + int i, j; + + memset( tmp, 0, CTR_DRBG_SEEDLEN ); + + for( j = 0; j < CTR_DRBG_SEEDLEN; j += CTR_DRBG_BLOCKSIZE ) + { + /* + * Increase counter + */ + for( i = CTR_DRBG_BLOCKSIZE; i > 0; i-- ) + if( ++ctx->counter[i - 1] != 0 ) + break; + + /* + * Crypt counter block + */ + aes_crypt_ecb( &ctx->aes_ctx, AES_ENCRYPT, ctx->counter, p ); + + p += CTR_DRBG_BLOCKSIZE; + } + + for( i = 0; i < CTR_DRBG_SEEDLEN; i++ ) + tmp[i] ^= data[i]; + + /* + * Update key and counter + */ + aes_setkey_enc( &ctx->aes_ctx, tmp, CTR_DRBG_KEYBITS ); + memcpy( ctx->counter, tmp + CTR_DRBG_KEYSIZE, CTR_DRBG_BLOCKSIZE ); + + return( 0 ); +} + +void ctr_drbg_update( ctr_drbg_context *ctx, + const unsigned char *additional, size_t add_len ) +{ + unsigned char add_input[CTR_DRBG_SEEDLEN]; + + if( add_len > 0 ) + { + block_cipher_df( add_input, additional, add_len ); + ctr_drbg_update_internal( ctx, add_input ); + } +} + +int ctr_drbg_reseed( ctr_drbg_context *ctx, + const unsigned char *additional, size_t len ) +{ + unsigned char seed[CTR_DRBG_MAX_SEED_INPUT]; + size_t seedlen = 0; + + if( ctx->entropy_len + len > CTR_DRBG_MAX_SEED_INPUT ) + return( POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG ); + + memset( seed, 0, CTR_DRBG_MAX_SEED_INPUT ); + + /* + * Gather enropy_len bytes of entropy to seed state + */ + if( 0 != ctx->f_entropy( ctx->p_entropy, seed, + ctx->entropy_len ) ) + { + return( POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED ); + } + + seedlen += ctx->entropy_len; + + /* + * Add additional data + */ + if( additional && len ) + { + memcpy( seed + seedlen, additional, len ); + seedlen += len; + } + + /* + * Reduce to 384 bits + */ + block_cipher_df( seed, seed, seedlen ); + + /* + * Update state + */ + ctr_drbg_update_internal( ctx, seed ); + ctx->reseed_counter = 1; + + return( 0 ); +} + +int ctr_drbg_random_with_add( void *p_rng, + unsigned char *output, size_t output_len, + const unsigned char *additional, size_t add_len ) +{ + int ret = 0; + ctr_drbg_context *ctx = (ctr_drbg_context *) p_rng; + unsigned char add_input[CTR_DRBG_SEEDLEN]; + unsigned char *p = output; + unsigned char tmp[CTR_DRBG_BLOCKSIZE]; + int i; + size_t use_len; + + if( output_len > CTR_DRBG_MAX_REQUEST ) + return( POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG ); + + if( add_len > CTR_DRBG_MAX_INPUT ) + return( POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG ); + + memset( add_input, 0, CTR_DRBG_SEEDLEN ); + + if( ctx->reseed_counter > ctx->reseed_interval || + ctx->prediction_resistance ) + { + if( ( ret = ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 ) + return( ret ); + + add_len = 0; + } + + if( add_len > 0 ) + { + block_cipher_df( add_input, additional, add_len ); + ctr_drbg_update_internal( ctx, add_input ); + } + + while( output_len > 0 ) + { + /* + * Increase counter + */ + for( i = CTR_DRBG_BLOCKSIZE; i > 0; i-- ) + if( ++ctx->counter[i - 1] != 0 ) + break; + + /* + * Crypt counter block + */ + aes_crypt_ecb( &ctx->aes_ctx, AES_ENCRYPT, ctx->counter, tmp ); + + use_len = (output_len > CTR_DRBG_BLOCKSIZE ) ? CTR_DRBG_BLOCKSIZE : output_len; + /* + * Copy random block to destination + */ + memcpy( p, tmp, use_len ); + p += use_len; + output_len -= use_len; + } + + ctr_drbg_update_internal( ctx, add_input ); + + ctx->reseed_counter++; + + return( 0 ); +} + +int ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len ) +{ + return ctr_drbg_random_with_add( p_rng, output, output_len, NULL, 0 ); +} + +#if defined(POLARSSL_FS_IO) +int ctr_drbg_write_seed_file( ctr_drbg_context *ctx, const char *path ) +{ + int ret; + FILE *f; + unsigned char buf[ CTR_DRBG_MAX_INPUT ]; + + if( ( f = fopen( path, "wb" ) ) == NULL ) + return( POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR ); + + if( ( ret = ctr_drbg_random( ctx, buf, CTR_DRBG_MAX_INPUT ) ) != 0 ) + return( ret ); + + if( fwrite( buf, 1, CTR_DRBG_MAX_INPUT, f ) != CTR_DRBG_MAX_INPUT ) + { + fclose( f ); + return( POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} + +int ctr_drbg_update_seed_file( ctr_drbg_context *ctx, const char *path ) +{ + FILE *f; + size_t n; + unsigned char buf[ CTR_DRBG_MAX_INPUT ]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR ); + + fseek( f, 0, SEEK_END ); + n = (size_t) ftell( f ); + fseek( f, 0, SEEK_SET ); + + if( n > CTR_DRBG_MAX_INPUT ) + return( POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG ); + + if( fread( buf, 1, n, f ) != n ) + { + fclose( f ); + return( POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR ); + } + + ctr_drbg_update( ctx, buf, n ); + + fclose( f ); + + return( ctr_drbg_write_seed_file( ctx, path ) ); +} +#endif /* POLARSSL_FS_IO */ + +#if defined(POLARSSL_SELF_TEST) + +#include + +unsigned char entropy_source_pr[96] = + { 0xc1, 0x80, 0x81, 0xa6, 0x5d, 0x44, 0x02, 0x16, + 0x19, 0xb3, 0xf1, 0x80, 0xb1, 0xc9, 0x20, 0x02, + 0x6a, 0x54, 0x6f, 0x0c, 0x70, 0x81, 0x49, 0x8b, + 0x6e, 0xa6, 0x62, 0x52, 0x6d, 0x51, 0xb1, 0xcb, + 0x58, 0x3b, 0xfa, 0xd5, 0x37, 0x5f, 0xfb, 0xc9, + 0xff, 0x46, 0xd2, 0x19, 0xc7, 0x22, 0x3e, 0x95, + 0x45, 0x9d, 0x82, 0xe1, 0xe7, 0x22, 0x9f, 0x63, + 0x31, 0x69, 0xd2, 0x6b, 0x57, 0x47, 0x4f, 0xa3, + 0x37, 0xc9, 0x98, 0x1c, 0x0b, 0xfb, 0x91, 0x31, + 0x4d, 0x55, 0xb9, 0xe9, 0x1c, 0x5a, 0x5e, 0xe4, + 0x93, 0x92, 0xcf, 0xc5, 0x23, 0x12, 0xd5, 0x56, + 0x2c, 0x4a, 0x6e, 0xff, 0xdc, 0x10, 0xd0, 0x68 }; + +unsigned char entropy_source_nopr[64] = + { 0x5a, 0x19, 0x4d, 0x5e, 0x2b, 0x31, 0x58, 0x14, + 0x54, 0xde, 0xf6, 0x75, 0xfb, 0x79, 0x58, 0xfe, + 0xc7, 0xdb, 0x87, 0x3e, 0x56, 0x89, 0xfc, 0x9d, + 0x03, 0x21, 0x7c, 0x68, 0xd8, 0x03, 0x38, 0x20, + 0xf9, 0xe6, 0x5e, 0x04, 0xd8, 0x56, 0xf3, 0xa9, + 0xc4, 0x4a, 0x4c, 0xbd, 0xc1, 0xd0, 0x08, 0x46, + 0xf5, 0x98, 0x3d, 0x77, 0x1c, 0x1b, 0x13, 0x7e, + 0x4e, 0x0f, 0x9d, 0x8e, 0xf4, 0x09, 0xf9, 0x2e }; + +unsigned char nonce_pers_pr[16] = + { 0xd2, 0x54, 0xfc, 0xff, 0x02, 0x1e, 0x69, 0xd2, + 0x29, 0xc9, 0xcf, 0xad, 0x85, 0xfa, 0x48, 0x6c }; + +unsigned char nonce_pers_nopr[16] = + { 0x1b, 0x54, 0xb8, 0xff, 0x06, 0x42, 0xbf, 0xf5, + 0x21, 0xf1, 0x5c, 0x1c, 0x0b, 0x66, 0x5f, 0x3f }; + +unsigned char result_pr[16] = + { 0x34, 0x01, 0x16, 0x56, 0xb4, 0x29, 0x00, 0x8f, + 0x35, 0x63, 0xec, 0xb5, 0xf2, 0x59, 0x07, 0x23 }; + +unsigned char result_nopr[16] = + { 0xa0, 0x54, 0x30, 0x3d, 0x8a, 0x7e, 0xa9, 0x88, + 0x9d, 0x90, 0x3e, 0x07, 0x7c, 0x6f, 0x21, 0x8f }; + +int test_offset; +int ctr_drbg_self_test_entropy( void *data, unsigned char *buf, size_t len ) +{ + unsigned char *p = data; + memcpy( buf, p + test_offset, len ); + test_offset += 32; + return( 0 ); +} + +/* + * Checkup routine + */ +int ctr_drbg_self_test( int verbose ) +{ + ctr_drbg_context ctx; + unsigned char buf[16]; + + /* + * Based on a NIST CTR_DRBG test vector (PR = True) + */ + if( verbose != 0 ) + printf( " CTR_DRBG (PR = TRUE) : " ); + + test_offset = 0; + if( ctr_drbg_init_entropy_len( &ctx, ctr_drbg_self_test_entropy, entropy_source_pr, nonce_pers_pr, 16, 32 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + ctr_drbg_set_prediction_resistance( &ctx, CTR_DRBG_PR_ON ); + + if( ctr_drbg_random( &ctx, buf, CTR_DRBG_BLOCKSIZE ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( ctr_drbg_random( &ctx, buf, CTR_DRBG_BLOCKSIZE ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( memcmp( buf, result_pr, CTR_DRBG_BLOCKSIZE ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + + /* + * Based on a NIST CTR_DRBG test vector (PR = FALSE) + */ + if( verbose != 0 ) + printf( " CTR_DRBG (PR = FALSE): " ); + + test_offset = 0; + if( ctr_drbg_init_entropy_len( &ctx, ctr_drbg_self_test_entropy, entropy_source_nopr, nonce_pers_nopr, 16, 32 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( ctr_drbg_random( &ctx, buf, 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( ctr_drbg_reseed( &ctx, NULL, 0 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( ctr_drbg_random( &ctx, buf, 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( memcmp( buf, result_nopr, 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} +#endif + +#endif diff --git a/Externals/polarssl/library/debug.c b/Externals/polarssl/library/debug.c new file mode 100644 index 0000000000..81ee649074 --- /dev/null +++ b/Externals/polarssl/library/debug.c @@ -0,0 +1,238 @@ +/* + * Debugging routines + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_DEBUG_C) + +#include "polarssl/debug.h" + +#include +#include + +#if defined _MSC_VER && !defined snprintf +#define snprintf _snprintf +#endif + +#if defined _MSC_VER && !defined vsnprintf +#define vsnprintf _vsnprintf +#endif + +char *debug_fmt( const char *format, ... ) +{ + va_list argp; + static char str[512]; + int maxlen = sizeof( str ) - 1; + + va_start( argp, format ); + vsnprintf( str, maxlen, format, argp ); + va_end( argp ); + + str[maxlen] = '\0'; + return( str ); +} + +void debug_print_msg( const ssl_context *ssl, int level, + const char *file, int line, const char *text ) +{ + char str[512]; + int maxlen = sizeof( str ) - 1; + + if( ssl->f_dbg == NULL ) + return; + + snprintf( str, maxlen, "%s(%04d): %s\n", file, line, text ); + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); +} + +void debug_print_ret( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, int ret ) +{ + char str[512]; + int maxlen = sizeof( str ) - 1; + + if( ssl->f_dbg == NULL ) + return; + + snprintf( str, maxlen, "%s(%04d): %s() returned %d (0x%x)\n", + file, line, text, ret, ret ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); +} + +void debug_print_buf( const ssl_context *ssl, int level, + const char *file, int line, const char *text, + unsigned char *buf, size_t len ) +{ + char str[512]; + size_t i, maxlen = sizeof( str ) - 1; + + if( ssl->f_dbg == NULL ) + return; + + snprintf( str, maxlen, "%s(%04d): dumping '%s' (%d bytes)\n", + file, line, text, (unsigned int) len ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + + for( i = 0; i < len; i++ ) + { + if( i >= 4096 ) + break; + + if( i % 16 == 0 ) + { + if( i > 0 ) + ssl->f_dbg( ssl->p_dbg, level, "\n" ); + + snprintf( str, maxlen, "%s(%04d): %04x: ", file, line, + (unsigned int) i ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + } + + snprintf( str, maxlen, " %02x", (unsigned int) buf[i] ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + } + + if( len > 0 ) + ssl->f_dbg( ssl->p_dbg, level, "\n" ); +} + +void debug_print_mpi( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mpi *X ) +{ + char str[512]; + int j, k, maxlen = sizeof( str ) - 1, zeros = 1; + size_t i, n; + + if( ssl->f_dbg == NULL || X == NULL ) + return; + + for( n = X->n - 1; n > 0; n-- ) + if( X->p[n] != 0 ) + break; + + for( j = ( sizeof(t_uint) << 3 ) - 1; j >= 0; j-- ) + if( ( ( X->p[n] >> j ) & 1 ) != 0 ) + break; + + snprintf( str, maxlen, "%s(%04d): value of '%s' (%d bits) is:\n", + file, line, text, + (int) ( ( n * ( sizeof(t_uint) << 3 ) ) + j + 1 ) ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + + for( i = n + 1, j = 0; i > 0; i-- ) + { + if( zeros && X->p[i - 1] == 0 ) + continue; + + for( k = sizeof( t_uint ) - 1; k >= 0; k-- ) + { + if( zeros && ( ( X->p[i - 1] >> (k << 3) ) & 0xFF ) == 0 ) + continue; + else + zeros = 0; + + if( j % 16 == 0 ) + { + if( j > 0 ) + ssl->f_dbg( ssl->p_dbg, level, "\n" ); + + snprintf( str, maxlen, "%s(%04d): ", file, line ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + } + + snprintf( str, maxlen, " %02x", (unsigned int) + ( X->p[i - 1] >> (k << 3) ) & 0xFF ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + + j++; + } + + } + + if( zeros == 1 ) + { + snprintf( str, maxlen, "%s(%04d): ", file, line ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + ssl->f_dbg( ssl->p_dbg, level, " 00" ); + } + + ssl->f_dbg( ssl->p_dbg, level, "\n" ); +} + +void debug_print_crt( const ssl_context *ssl, int level, + const char *file, int line, + const char *text, const x509_cert *crt ) +{ + char str[1024], prefix[64]; + int i = 0, maxlen = sizeof( prefix ) - 1; + + if( ssl->f_dbg == NULL || crt == NULL ) + return; + + snprintf( prefix, maxlen, "%s(%04d): ", file, line ); + prefix[maxlen] = '\0'; + maxlen = sizeof( str ) - 1; + + while( crt != NULL ) + { + char buf[1024]; + x509parse_cert_info( buf, sizeof( buf ) - 1, prefix, crt ); + + snprintf( str, maxlen, "%s(%04d): %s #%d:\n%s", + file, line, text, ++i, buf ); + + str[maxlen] = '\0'; + ssl->f_dbg( ssl->p_dbg, level, str ); + + debug_print_mpi( ssl, level, file, line, + "crt->rsa.N", &crt->rsa.N ); + + debug_print_mpi( ssl, level, file, line, + "crt->rsa.E", &crt->rsa.E ); + + crt = crt->next; + } +} + +#endif diff --git a/Externals/polarssl/library/des.c b/Externals/polarssl/library/des.c new file mode 100644 index 0000000000..0cf4b3d50d --- /dev/null +++ b/Externals/polarssl/library/des.c @@ -0,0 +1,997 @@ +/* + * FIPS-46-3 compliant Triple-DES implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * DES, on which TDES is based, was originally designed by Horst Feistel + * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS). + * + * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_DES_C) + +#include "polarssl/des.h" + +#if !defined(POLARSSL_DES_ALT) + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +/* + * Expanded DES S-boxes + */ +static const uint32_t SB1[64] = +{ + 0x01010400, 0x00000000, 0x00010000, 0x01010404, + 0x01010004, 0x00010404, 0x00000004, 0x00010000, + 0x00000400, 0x01010400, 0x01010404, 0x00000400, + 0x01000404, 0x01010004, 0x01000000, 0x00000004, + 0x00000404, 0x01000400, 0x01000400, 0x00010400, + 0x00010400, 0x01010000, 0x01010000, 0x01000404, + 0x00010004, 0x01000004, 0x01000004, 0x00010004, + 0x00000000, 0x00000404, 0x00010404, 0x01000000, + 0x00010000, 0x01010404, 0x00000004, 0x01010000, + 0x01010400, 0x01000000, 0x01000000, 0x00000400, + 0x01010004, 0x00010000, 0x00010400, 0x01000004, + 0x00000400, 0x00000004, 0x01000404, 0x00010404, + 0x01010404, 0x00010004, 0x01010000, 0x01000404, + 0x01000004, 0x00000404, 0x00010404, 0x01010400, + 0x00000404, 0x01000400, 0x01000400, 0x00000000, + 0x00010004, 0x00010400, 0x00000000, 0x01010004 +}; + +static const uint32_t SB2[64] = +{ + 0x80108020, 0x80008000, 0x00008000, 0x00108020, + 0x00100000, 0x00000020, 0x80100020, 0x80008020, + 0x80000020, 0x80108020, 0x80108000, 0x80000000, + 0x80008000, 0x00100000, 0x00000020, 0x80100020, + 0x00108000, 0x00100020, 0x80008020, 0x00000000, + 0x80000000, 0x00008000, 0x00108020, 0x80100000, + 0x00100020, 0x80000020, 0x00000000, 0x00108000, + 0x00008020, 0x80108000, 0x80100000, 0x00008020, + 0x00000000, 0x00108020, 0x80100020, 0x00100000, + 0x80008020, 0x80100000, 0x80108000, 0x00008000, + 0x80100000, 0x80008000, 0x00000020, 0x80108020, + 0x00108020, 0x00000020, 0x00008000, 0x80000000, + 0x00008020, 0x80108000, 0x00100000, 0x80000020, + 0x00100020, 0x80008020, 0x80000020, 0x00100020, + 0x00108000, 0x00000000, 0x80008000, 0x00008020, + 0x80000000, 0x80100020, 0x80108020, 0x00108000 +}; + +static const uint32_t SB3[64] = +{ + 0x00000208, 0x08020200, 0x00000000, 0x08020008, + 0x08000200, 0x00000000, 0x00020208, 0x08000200, + 0x00020008, 0x08000008, 0x08000008, 0x00020000, + 0x08020208, 0x00020008, 0x08020000, 0x00000208, + 0x08000000, 0x00000008, 0x08020200, 0x00000200, + 0x00020200, 0x08020000, 0x08020008, 0x00020208, + 0x08000208, 0x00020200, 0x00020000, 0x08000208, + 0x00000008, 0x08020208, 0x00000200, 0x08000000, + 0x08020200, 0x08000000, 0x00020008, 0x00000208, + 0x00020000, 0x08020200, 0x08000200, 0x00000000, + 0x00000200, 0x00020008, 0x08020208, 0x08000200, + 0x08000008, 0x00000200, 0x00000000, 0x08020008, + 0x08000208, 0x00020000, 0x08000000, 0x08020208, + 0x00000008, 0x00020208, 0x00020200, 0x08000008, + 0x08020000, 0x08000208, 0x00000208, 0x08020000, + 0x00020208, 0x00000008, 0x08020008, 0x00020200 +}; + +static const uint32_t SB4[64] = +{ + 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802080, 0x00800081, 0x00800001, 0x00002001, + 0x00000000, 0x00802000, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00800080, 0x00800001, + 0x00000001, 0x00002000, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002001, 0x00002080, + 0x00800081, 0x00000001, 0x00002080, 0x00800080, + 0x00002000, 0x00802080, 0x00802081, 0x00000081, + 0x00800080, 0x00800001, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00000000, 0x00802000, + 0x00002080, 0x00800080, 0x00800081, 0x00000001, + 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802081, 0x00000081, 0x00000001, 0x00002000, + 0x00800001, 0x00002001, 0x00802080, 0x00800081, + 0x00002001, 0x00002080, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002000, 0x00802080 +}; + +static const uint32_t SB5[64] = +{ + 0x00000100, 0x02080100, 0x02080000, 0x42000100, + 0x00080000, 0x00000100, 0x40000000, 0x02080000, + 0x40080100, 0x00080000, 0x02000100, 0x40080100, + 0x42000100, 0x42080000, 0x00080100, 0x40000000, + 0x02000000, 0x40080000, 0x40080000, 0x00000000, + 0x40000100, 0x42080100, 0x42080100, 0x02000100, + 0x42080000, 0x40000100, 0x00000000, 0x42000000, + 0x02080100, 0x02000000, 0x42000000, 0x00080100, + 0x00080000, 0x42000100, 0x00000100, 0x02000000, + 0x40000000, 0x02080000, 0x42000100, 0x40080100, + 0x02000100, 0x40000000, 0x42080000, 0x02080100, + 0x40080100, 0x00000100, 0x02000000, 0x42080000, + 0x42080100, 0x00080100, 0x42000000, 0x42080100, + 0x02080000, 0x00000000, 0x40080000, 0x42000000, + 0x00080100, 0x02000100, 0x40000100, 0x00080000, + 0x00000000, 0x40080000, 0x02080100, 0x40000100 +}; + +static const uint32_t SB6[64] = +{ + 0x20000010, 0x20400000, 0x00004000, 0x20404010, + 0x20400000, 0x00000010, 0x20404010, 0x00400000, + 0x20004000, 0x00404010, 0x00400000, 0x20000010, + 0x00400010, 0x20004000, 0x20000000, 0x00004010, + 0x00000000, 0x00400010, 0x20004010, 0x00004000, + 0x00404000, 0x20004010, 0x00000010, 0x20400010, + 0x20400010, 0x00000000, 0x00404010, 0x20404000, + 0x00004010, 0x00404000, 0x20404000, 0x20000000, + 0x20004000, 0x00000010, 0x20400010, 0x00404000, + 0x20404010, 0x00400000, 0x00004010, 0x20000010, + 0x00400000, 0x20004000, 0x20000000, 0x00004010, + 0x20000010, 0x20404010, 0x00404000, 0x20400000, + 0x00404010, 0x20404000, 0x00000000, 0x20400010, + 0x00000010, 0x00004000, 0x20400000, 0x00404010, + 0x00004000, 0x00400010, 0x20004010, 0x00000000, + 0x20404000, 0x20000000, 0x00400010, 0x20004010 +}; + +static const uint32_t SB7[64] = +{ + 0x00200000, 0x04200002, 0x04000802, 0x00000000, + 0x00000800, 0x04000802, 0x00200802, 0x04200800, + 0x04200802, 0x00200000, 0x00000000, 0x04000002, + 0x00000002, 0x04000000, 0x04200002, 0x00000802, + 0x04000800, 0x00200802, 0x00200002, 0x04000800, + 0x04000002, 0x04200000, 0x04200800, 0x00200002, + 0x04200000, 0x00000800, 0x00000802, 0x04200802, + 0x00200800, 0x00000002, 0x04000000, 0x00200800, + 0x04000000, 0x00200800, 0x00200000, 0x04000802, + 0x04000802, 0x04200002, 0x04200002, 0x00000002, + 0x00200002, 0x04000000, 0x04000800, 0x00200000, + 0x04200800, 0x00000802, 0x00200802, 0x04200800, + 0x00000802, 0x04000002, 0x04200802, 0x04200000, + 0x00200800, 0x00000000, 0x00000002, 0x04200802, + 0x00000000, 0x00200802, 0x04200000, 0x00000800, + 0x04000002, 0x04000800, 0x00000800, 0x00200002 +}; + +static const uint32_t SB8[64] = +{ + 0x10001040, 0x00001000, 0x00040000, 0x10041040, + 0x10000000, 0x10001040, 0x00000040, 0x10000000, + 0x00040040, 0x10040000, 0x10041040, 0x00041000, + 0x10041000, 0x00041040, 0x00001000, 0x00000040, + 0x10040000, 0x10000040, 0x10001000, 0x00001040, + 0x00041000, 0x00040040, 0x10040040, 0x10041000, + 0x00001040, 0x00000000, 0x00000000, 0x10040040, + 0x10000040, 0x10001000, 0x00041040, 0x00040000, + 0x00041040, 0x00040000, 0x10041000, 0x00001000, + 0x00000040, 0x10040040, 0x00001000, 0x00041040, + 0x10001000, 0x00000040, 0x10000040, 0x10040000, + 0x10040040, 0x10000000, 0x00040000, 0x10001040, + 0x00000000, 0x10041040, 0x00040040, 0x10000040, + 0x10040000, 0x10001000, 0x10001040, 0x00000000, + 0x10041040, 0x00041000, 0x00041000, 0x00001040, + 0x00001040, 0x00040040, 0x10000000, 0x10041000 +}; + +/* + * PC1: left and right halves bit-swap + */ +static const uint32_t LHs[16] = +{ + 0x00000000, 0x00000001, 0x00000100, 0x00000101, + 0x00010000, 0x00010001, 0x00010100, 0x00010101, + 0x01000000, 0x01000001, 0x01000100, 0x01000101, + 0x01010000, 0x01010001, 0x01010100, 0x01010101 +}; + +static const uint32_t RHs[16] = +{ + 0x00000000, 0x01000000, 0x00010000, 0x01010000, + 0x00000100, 0x01000100, 0x00010100, 0x01010100, + 0x00000001, 0x01000001, 0x00010001, 0x01010001, + 0x00000101, 0x01000101, 0x00010101, 0x01010101, +}; + +/* + * Initial Permutation macro + */ +#define DES_IP(X,Y) \ +{ \ + T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ + T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ + T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ + T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ + Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \ + T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \ + X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \ +} + +/* + * Final Permutation macro + */ +#define DES_FP(X,Y) \ +{ \ + X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \ + T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \ + Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \ + T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ + T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ + T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ + T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ +} + +/* + * DES round macro + */ +#define DES_ROUND(X,Y) \ +{ \ + T = *SK++ ^ X; \ + Y ^= SB8[ (T ) & 0x3F ] ^ \ + SB6[ (T >> 8) & 0x3F ] ^ \ + SB4[ (T >> 16) & 0x3F ] ^ \ + SB2[ (T >> 24) & 0x3F ]; \ + \ + T = *SK++ ^ ((X << 28) | (X >> 4)); \ + Y ^= SB7[ (T ) & 0x3F ] ^ \ + SB5[ (T >> 8) & 0x3F ] ^ \ + SB3[ (T >> 16) & 0x3F ] ^ \ + SB1[ (T >> 24) & 0x3F ]; \ +} + +#define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; } + +static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8, + 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44, + 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81, + 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112, + 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140, + 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168, + 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196, + 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224, + 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253, + 254 }; + +void des_key_set_parity( unsigned char key[DES_KEY_SIZE] ) +{ + int i; + + for( i = 0; i < DES_KEY_SIZE; i++ ) + key[i] = odd_parity_table[key[i] / 2]; +} + +/* + * Check the given key's parity, returns 1 on failure, 0 on SUCCESS + */ +int des_key_check_key_parity( const unsigned char key[DES_KEY_SIZE] ) +{ + int i; + + for( i = 0; i < DES_KEY_SIZE; i++ ) + if ( key[i] != odd_parity_table[key[i] / 2] ) + return( 1 ); + + return( 0 ); +} + +/* + * Table of weak and semi-weak keys + * + * Source: http://en.wikipedia.org/wiki/Weak_key + * + * Weak: + * Alternating ones + zeros (0x0101010101010101) + * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE) + * '0xE0E0E0E0F1F1F1F1' + * '0x1F1F1F1F0E0E0E0E' + * + * Semi-weak: + * 0x011F011F010E010E and 0x1F011F010E010E01 + * 0x01E001E001F101F1 and 0xE001E001F101F101 + * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01 + * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E + * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E + * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1 + * + */ + +#define WEAK_KEY_COUNT 16 + +static const unsigned char weak_key_table[WEAK_KEY_COUNT][DES_KEY_SIZE] = +{ + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, + { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, + { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, + + { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, + { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, + { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, + { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, + { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, + { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, + { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, + { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, + { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, + { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, + { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, + { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } +}; + +int des_key_check_weak( const unsigned char key[DES_KEY_SIZE] ) +{ + int i; + + for( i = 0; i < WEAK_KEY_COUNT; i++ ) + if( memcmp( weak_key_table[i], key, DES_KEY_SIZE) == 0) + return( 1 ); + + return( 0 ); +} + +static void des_setkey( uint32_t SK[32], const unsigned char key[DES_KEY_SIZE] ) +{ + int i; + uint32_t X, Y, T; + + GET_UINT32_BE( X, key, 0 ); + GET_UINT32_BE( Y, key, 4 ); + + /* + * Permuted Choice 1 + */ + T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4); + T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T ); + + X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2) + | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] ) + | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6) + | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4); + + Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2) + | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] ) + | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6) + | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4); + + X &= 0x0FFFFFFF; + Y &= 0x0FFFFFFF; + + /* + * calculate subkeys + */ + for( i = 0; i < 16; i++ ) + { + if( i < 2 || i == 8 || i == 15 ) + { + X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF; + Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF; + } + else + { + X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF; + Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF; + } + + *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000) + | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000) + | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000) + | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000) + | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000) + | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000) + | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400) + | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100) + | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010) + | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004) + | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001); + + *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000) + | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000) + | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000) + | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000) + | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000) + | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000) + | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000) + | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400) + | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100) + | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011) + | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002); + } +} + +/* + * DES key schedule (56-bit, encryption) + */ +int des_setkey_enc( des_context *ctx, const unsigned char key[DES_KEY_SIZE] ) +{ + des_setkey( ctx->sk, key ); + + return( 0 ); +} + +/* + * DES key schedule (56-bit, decryption) + */ +int des_setkey_dec( des_context *ctx, const unsigned char key[DES_KEY_SIZE] ) +{ + int i; + + des_setkey( ctx->sk, key ); + + for( i = 0; i < 16; i += 2 ) + { + SWAP( ctx->sk[i ], ctx->sk[30 - i] ); + SWAP( ctx->sk[i + 1], ctx->sk[31 - i] ); + } + + return( 0 ); +} + +static void des3_set2key( uint32_t esk[96], + uint32_t dsk[96], + const unsigned char key[DES_KEY_SIZE*2] ) +{ + int i; + + des_setkey( esk, key ); + des_setkey( dsk + 32, key + 8 ); + + for( i = 0; i < 32; i += 2 ) + { + dsk[i ] = esk[30 - i]; + dsk[i + 1] = esk[31 - i]; + + esk[i + 32] = dsk[62 - i]; + esk[i + 33] = dsk[63 - i]; + + esk[i + 64] = esk[i ]; + esk[i + 65] = esk[i + 1]; + + dsk[i + 64] = dsk[i ]; + dsk[i + 65] = dsk[i + 1]; + } +} + +/* + * Triple-DES key schedule (112-bit, encryption) + */ +int des3_set2key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] ) +{ + uint32_t sk[96]; + + des3_set2key( ctx->sk, sk, key ); + memset( sk, 0, sizeof( sk ) ); + + return( 0 ); +} + +/* + * Triple-DES key schedule (112-bit, decryption) + */ +int des3_set2key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] ) +{ + uint32_t sk[96]; + + des3_set2key( sk, ctx->sk, key ); + memset( sk, 0, sizeof( sk ) ); + + return( 0 ); +} + +static void des3_set3key( uint32_t esk[96], + uint32_t dsk[96], + const unsigned char key[24] ) +{ + int i; + + des_setkey( esk, key ); + des_setkey( dsk + 32, key + 8 ); + des_setkey( esk + 64, key + 16 ); + + for( i = 0; i < 32; i += 2 ) + { + dsk[i ] = esk[94 - i]; + dsk[i + 1] = esk[95 - i]; + + esk[i + 32] = dsk[62 - i]; + esk[i + 33] = dsk[63 - i]; + + dsk[i + 64] = esk[30 - i]; + dsk[i + 65] = esk[31 - i]; + } +} + +/* + * Triple-DES key schedule (168-bit, encryption) + */ +int des3_set3key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] ) +{ + uint32_t sk[96]; + + des3_set3key( ctx->sk, sk, key ); + memset( sk, 0, sizeof( sk ) ); + + return( 0 ); +} + +/* + * Triple-DES key schedule (168-bit, decryption) + */ +int des3_set3key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] ) +{ + uint32_t sk[96]; + + des3_set3key( sk, ctx->sk, key ); + memset( sk, 0, sizeof( sk ) ); + + return( 0 ); +} + +/* + * DES-ECB block encryption/decryption + */ +int des_crypt_ecb( des_context *ctx, + const unsigned char input[8], + unsigned char output[8] ) +{ + int i; + uint32_t X, Y, T, *SK; + + SK = ctx->sk; + + GET_UINT32_BE( X, input, 0 ); + GET_UINT32_BE( Y, input, 4 ); + + DES_IP( X, Y ); + + for( i = 0; i < 8; i++ ) + { + DES_ROUND( Y, X ); + DES_ROUND( X, Y ); + } + + DES_FP( Y, X ); + + PUT_UINT32_BE( Y, output, 0 ); + PUT_UINT32_BE( X, output, 4 ); + + return( 0 ); +} + +/* + * DES-CBC buffer encryption/decryption + */ +int des_crypt_cbc( des_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[8]; + + if( length % 8 ) + return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH ); + + if( mode == DES_ENCRYPT ) + { + while( length > 0 ) + { + for( i = 0; i < 8; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + des_crypt_ecb( ctx, output, output ); + memcpy( iv, output, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + else /* DES_DECRYPT */ + { + while( length > 0 ) + { + memcpy( temp, input, 8 ); + des_crypt_ecb( ctx, input, output ); + + for( i = 0; i < 8; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + + return( 0 ); +} + +/* + * 3DES-ECB block encryption/decryption + */ +int des3_crypt_ecb( des3_context *ctx, + const unsigned char input[8], + unsigned char output[8] ) +{ + int i; + uint32_t X, Y, T, *SK; + + SK = ctx->sk; + + GET_UINT32_BE( X, input, 0 ); + GET_UINT32_BE( Y, input, 4 ); + + DES_IP( X, Y ); + + for( i = 0; i < 8; i++ ) + { + DES_ROUND( Y, X ); + DES_ROUND( X, Y ); + } + + for( i = 0; i < 8; i++ ) + { + DES_ROUND( X, Y ); + DES_ROUND( Y, X ); + } + + for( i = 0; i < 8; i++ ) + { + DES_ROUND( Y, X ); + DES_ROUND( X, Y ); + } + + DES_FP( Y, X ); + + PUT_UINT32_BE( Y, output, 0 ); + PUT_UINT32_BE( X, output, 4 ); + + return( 0 ); +} + +/* + * 3DES-CBC buffer encryption/decryption + */ +int des3_crypt_cbc( des3_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output ) +{ + int i; + unsigned char temp[8]; + + if( length % 8 ) + return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH ); + + if( mode == DES_ENCRYPT ) + { + while( length > 0 ) + { + for( i = 0; i < 8; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + des3_crypt_ecb( ctx, output, output ); + memcpy( iv, output, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + else /* DES_DECRYPT */ + { + while( length > 0 ) + { + memcpy( temp, input, 8 ); + des3_crypt_ecb( ctx, input, output ); + + for( i = 0; i < 8; i++ ) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + + return( 0 ); +} + +#endif /* !POLARSSL_DES_ALT */ + +#if defined(POLARSSL_SELF_TEST) + +#include + +/* + * DES and 3DES test vectors from: + * + * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip + */ +static const unsigned char des3_test_keys[24] = +{ + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, + 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 +}; + +static const unsigned char des3_test_iv[8] = +{ + 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, +}; + +static const unsigned char des3_test_buf[8] = +{ + 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 +}; + +static const unsigned char des3_test_ecb_dec[3][8] = +{ + { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D }, + { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB }, + { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A } +}; + +static const unsigned char des3_test_ecb_enc[3][8] = +{ + { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B }, + { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 }, + { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 } +}; + +static const unsigned char des3_test_cbc_dec[3][8] = +{ + { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 }, + { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 }, + { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C } +}; + +static const unsigned char des3_test_cbc_enc[3][8] = +{ + { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 }, + { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D }, + { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 } +}; + +/* + * Checkup routine + */ +int des_self_test( int verbose ) +{ + int i, j, u, v; + des_context ctx; + des3_context ctx3; + unsigned char key[24]; + unsigned char buf[8]; + unsigned char prv[8]; + unsigned char iv[8]; + + memset( key, 0, 24 ); + + /* + * ECB mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " DES%c-ECB-%3d (%s): ", + ( u == 0 ) ? ' ' : '3', 56 + u * 56, + ( v == DES_DECRYPT ) ? "dec" : "enc" ); + + memcpy( buf, des3_test_buf, 8 ); + + switch( i ) + { + case 0: + des_setkey_dec( &ctx, des3_test_keys ); + break; + + case 1: + des_setkey_enc( &ctx, des3_test_keys ); + break; + + case 2: + des3_set2key_dec( &ctx3, des3_test_keys ); + break; + + case 3: + des3_set2key_enc( &ctx3, des3_test_keys ); + break; + + case 4: + des3_set3key_dec( &ctx3, des3_test_keys ); + break; + + case 5: + des3_set3key_enc( &ctx3, des3_test_keys ); + break; + + default: + return( 1 ); + } + + for( j = 0; j < 10000; j++ ) + { + if( u == 0 ) + des_crypt_ecb( &ctx, buf, buf ); + else + des3_crypt_ecb( &ctx3, buf, buf ); + } + + if( ( v == DES_DECRYPT && + memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) || + ( v != DES_DECRYPT && + memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + /* + * CBC mode + */ + for( i = 0; i < 6; i++ ) + { + u = i >> 1; + v = i & 1; + + if( verbose != 0 ) + printf( " DES%c-CBC-%3d (%s): ", + ( u == 0 ) ? ' ' : '3', 56 + u * 56, + ( v == DES_DECRYPT ) ? "dec" : "enc" ); + + memcpy( iv, des3_test_iv, 8 ); + memcpy( prv, des3_test_iv, 8 ); + memcpy( buf, des3_test_buf, 8 ); + + switch( i ) + { + case 0: + des_setkey_dec( &ctx, des3_test_keys ); + break; + + case 1: + des_setkey_enc( &ctx, des3_test_keys ); + break; + + case 2: + des3_set2key_dec( &ctx3, des3_test_keys ); + break; + + case 3: + des3_set2key_enc( &ctx3, des3_test_keys ); + break; + + case 4: + des3_set3key_dec( &ctx3, des3_test_keys ); + break; + + case 5: + des3_set3key_enc( &ctx3, des3_test_keys ); + break; + + default: + return( 1 ); + } + + if( v == DES_DECRYPT ) + { + for( j = 0; j < 10000; j++ ) + { + if( u == 0 ) + des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); + else + des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); + } + } + else + { + for( j = 0; j < 10000; j++ ) + { + unsigned char tmp[8]; + + if( u == 0 ) + des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); + else + des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); + + memcpy( tmp, prv, 8 ); + memcpy( prv, buf, 8 ); + memcpy( buf, tmp, 8 ); + } + + memcpy( buf, prv, 8 ); + } + + if( ( v == DES_DECRYPT && + memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) || + ( v != DES_DECRYPT && + memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/dhm.c b/Externals/polarssl/library/dhm.c new file mode 100644 index 0000000000..90e5b4b19a --- /dev/null +++ b/Externals/polarssl/library/dhm.c @@ -0,0 +1,302 @@ +/* + * Diffie-Hellman-Merkle key exchange + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * Reference: + * + * http://www.cacr.math.uwaterloo.ca/hac/ (chapter 12) + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_DHM_C) + +#include "polarssl/dhm.h" + +/* + * helper to validate the mpi size and import it + */ +static int dhm_read_bignum( mpi *X, + unsigned char **p, + const unsigned char *end ) +{ + int ret, n; + + if( end - *p < 2 ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + n = ( (*p)[0] << 8 ) | (*p)[1]; + (*p) += 2; + + if( (int)( end - *p ) < n ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + if( ( ret = mpi_read_binary( X, *p, n ) ) != 0 ) + return( POLARSSL_ERR_DHM_READ_PARAMS_FAILED + ret ); + + (*p) += n; + + return( 0 ); +} + +/* + * Verify sanity of parameter with regards to P + * + * Parameter should be: 2 <= public_param <= P - 2 + * + * For more information on the attack, see: + * http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf + * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643 + */ +static int dhm_check_range( const mpi *param, const mpi *P ) +{ + mpi L, U; + int ret = POLARSSL_ERR_DHM_BAD_INPUT_DATA; + + mpi_init( &L ); mpi_init( &U ); + mpi_lset( &L, 2 ); + mpi_sub_int( &U, P, 2 ); + + if( mpi_cmp_mpi( param, &L ) >= 0 && + mpi_cmp_mpi( param, &U ) <= 0 ) + { + ret = 0; + } + + mpi_free( &L ); mpi_free( &U ); + + return( ret ); +} + +/* + * Parse the ServerKeyExchange parameters + */ +int dhm_read_params( dhm_context *ctx, + unsigned char **p, + const unsigned char *end ) +{ + int ret; + + memset( ctx, 0, sizeof( dhm_context ) ); + + if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 || + ( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 || + ( ret = dhm_read_bignum( &ctx->GY, p, end ) ) != 0 ) + return( ret ); + + if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) + return( ret ); + + ctx->len = mpi_size( &ctx->P ); + + if( end - *p < 2 ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + return( 0 ); +} + +/* + * Setup and write the ServerKeyExchange parameters + */ +int dhm_make_params( dhm_context *ctx, int x_size, + unsigned char *output, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + int ret, count = 0; + size_t n1, n2, n3; + unsigned char *p; + + if( mpi_cmp_int( &ctx->P, 0 ) == 0 ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + /* + * Generate X as large as possible ( < P ) + */ + do + { + mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ); + + while( mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) + mpi_shift_r( &ctx->X, 1 ); + + if( count++ > 10 ) + return( POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED ); + } + while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); + + /* + * Calculate GX = G^X mod P + */ + MPI_CHK( mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, + &ctx->P , &ctx->RP ) ); + + if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) + return( ret ); + + /* + * export P, G, GX + */ +#define DHM_MPI_EXPORT(X,n) \ + MPI_CHK( mpi_write_binary( X, p + 2, n ) ); \ + *p++ = (unsigned char)( n >> 8 ); \ + *p++ = (unsigned char)( n ); p += n; + + n1 = mpi_size( &ctx->P ); + n2 = mpi_size( &ctx->G ); + n3 = mpi_size( &ctx->GX ); + + p = output; + DHM_MPI_EXPORT( &ctx->P , n1 ); + DHM_MPI_EXPORT( &ctx->G , n2 ); + DHM_MPI_EXPORT( &ctx->GX, n3 ); + + *olen = p - output; + + ctx->len = n1; + +cleanup: + + if( ret != 0 ) + return( POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED + ret ); + + return( 0 ); +} + +/* + * Import the peer's public value G^Y + */ +int dhm_read_public( dhm_context *ctx, + const unsigned char *input, size_t ilen ) +{ + int ret; + + if( ctx == NULL || ilen < 1 || ilen > ctx->len ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + if( ( ret = mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 ) + return( POLARSSL_ERR_DHM_READ_PUBLIC_FAILED + ret ); + + return( 0 ); +} + +/* + * Create own private value X and export G^X + */ +int dhm_make_public( dhm_context *ctx, int x_size, + unsigned char *output, size_t olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + int ret, count = 0; + + if( ctx == NULL || olen < 1 || olen > ctx->len ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + if( mpi_cmp_int( &ctx->P, 0 ) == 0 ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + /* + * generate X and calculate GX = G^X mod P + */ + do + { + mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ); + + while( mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) + mpi_shift_r( &ctx->X, 1 ); + + if( count++ > 10 ) + return( POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED ); + } + while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); + + MPI_CHK( mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, + &ctx->P , &ctx->RP ) ); + + if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) + return( ret ); + + MPI_CHK( mpi_write_binary( &ctx->GX, output, olen ) ); + +cleanup: + + if( ret != 0 ) + return( POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED + ret ); + + return( 0 ); +} + +/* + * Derive and export the shared secret (G^Y)^X mod P + */ +int dhm_calc_secret( dhm_context *ctx, + unsigned char *output, size_t *olen ) +{ + int ret; + + if( ctx == NULL || *olen < ctx->len ) + return( POLARSSL_ERR_DHM_BAD_INPUT_DATA ); + + MPI_CHK( mpi_exp_mod( &ctx->K, &ctx->GY, &ctx->X, + &ctx->P, &ctx->RP ) ); + + if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) + return( ret ); + + *olen = mpi_size( &ctx->K ); + + MPI_CHK( mpi_write_binary( &ctx->K, output, *olen ) ); + +cleanup: + + if( ret != 0 ) + return( POLARSSL_ERR_DHM_CALC_SECRET_FAILED + ret ); + + return( 0 ); +} + +/* + * Free the components of a DHM key + */ +void dhm_free( dhm_context *ctx ) +{ + mpi_free( &ctx->RP ); mpi_free( &ctx->K ); mpi_free( &ctx->GY ); + mpi_free( &ctx->GX ); mpi_free( &ctx->X ); mpi_free( &ctx->G ); + mpi_free( &ctx->P ); +} + +#if defined(POLARSSL_SELF_TEST) + +/* + * Checkup routine + */ +int dhm_self_test( int verbose ) +{ + return( verbose++ ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/entropy.c b/Externals/polarssl/library/entropy.c new file mode 100644 index 0000000000..9662454721 --- /dev/null +++ b/Externals/polarssl/library/entropy.c @@ -0,0 +1,204 @@ +/* + * Entropy accumulator implementation + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ENTROPY_C) + +#include "polarssl/entropy.h" +#include "polarssl/entropy_poll.h" + +#if defined(POLARSSL_HAVEGE_C) +#include "polarssl/havege.h" +#endif + +#define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */ + +void entropy_init( entropy_context *ctx ) +{ + memset( ctx, 0, sizeof(entropy_context) ); + + sha4_starts( &ctx->accumulator, 0 ); +#if defined(POLARSSL_HAVEGE_C) + havege_init( &ctx->havege_data ); +#endif + +#if !defined(POLARSSL_NO_DEFAULT_ENTROPY_SOURCES) +#if !defined(POLARSSL_NO_PLATFORM_ENTROPY) + entropy_add_source( ctx, platform_entropy_poll, NULL, + ENTROPY_MIN_PLATFORM ); +#endif +#if defined(POLARSSL_TIMING_C) + entropy_add_source( ctx, hardclock_poll, NULL, ENTROPY_MIN_HARDCLOCK ); +#endif +#if defined(POLARSSL_HAVEGE_C) + entropy_add_source( ctx, havege_poll, &ctx->havege_data, + ENTROPY_MIN_HAVEGE ); +#endif +#endif /* POLARSSL_NO_DEFAULT_ENTROPY_SOURCES */ +} + +int entropy_add_source( entropy_context *ctx, + f_source_ptr f_source, void *p_source, + size_t threshold ) +{ + int index = ctx->source_count; + + if( index >= ENTROPY_MAX_SOURCES ) + return( POLARSSL_ERR_ENTROPY_MAX_SOURCES ); + + ctx->source[index].f_source = f_source; + ctx->source[index].p_source = p_source; + ctx->source[index].threshold = threshold; + + ctx->source_count++; + + return( 0 ); +} + +/* + * Entropy accumulator update + */ +int entropy_update( entropy_context *ctx, unsigned char source_id, + const unsigned char *data, size_t len ) +{ + unsigned char header[2]; + unsigned char tmp[ENTROPY_BLOCK_SIZE]; + size_t use_len = len; + const unsigned char *p = data; + + if( use_len > ENTROPY_BLOCK_SIZE ) + { + sha4( data, len, tmp, 0 ); + + p = tmp; + use_len = ENTROPY_BLOCK_SIZE; + } + + header[0] = source_id; + header[1] = use_len & 0xFF; + + sha4_update( &ctx->accumulator, header, 2 ); + sha4_update( &ctx->accumulator, p, use_len ); + + return( 0 ); +} + +int entropy_update_manual( entropy_context *ctx, + const unsigned char *data, size_t len ) +{ + return entropy_update( ctx, ENTROPY_SOURCE_MANUAL, data, len ); +} + +/* + * Run through the different sources to add entropy to our accumulator + */ +int entropy_gather( entropy_context *ctx ) +{ + int ret, i; + unsigned char buf[ENTROPY_MAX_GATHER]; + size_t olen; + + if( ctx->source_count == 0 ) + return( POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED ); + + /* + * Run through our entropy sources + */ + for( i = 0; i < ctx->source_count; i++ ) + { + olen = 0; + if ( ( ret = ctx->source[i].f_source( ctx->source[i].p_source, + buf, ENTROPY_MAX_GATHER, &olen ) ) != 0 ) + { + return( ret ); + } + + /* + * Add if we actually gathered something + */ + if( olen > 0 ) + { + entropy_update( ctx, (unsigned char) i, buf, olen ); + ctx->source[i].size += olen; + } + } + + return( 0 ); +} + +int entropy_func( void *data, unsigned char *output, size_t len ) +{ + int ret, count = 0, i, reached; + entropy_context *ctx = (entropy_context *) data; + unsigned char buf[ENTROPY_BLOCK_SIZE]; + + if( len > ENTROPY_BLOCK_SIZE ) + return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); + + /* + * Always gather extra entropy before a call + */ + do + { + if( count++ > ENTROPY_MAX_LOOP ) + return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); + + if( ( ret = entropy_gather( ctx ) ) != 0 ) + return( ret ); + + reached = 0; + + for( i = 0; i < ctx->source_count; i++ ) + if( ctx->source[i].size >= ctx->source[i].threshold ) + reached++; + } + while( reached != ctx->source_count ); + + memset( buf, 0, ENTROPY_BLOCK_SIZE ); + + sha4_finish( &ctx->accumulator, buf ); + + /* + * Perform second SHA-512 on entropy + */ + sha4( buf, ENTROPY_BLOCK_SIZE, buf, 0 ); + + /* + * Reset accumulator and counters and recycle existing entropy + */ + memset( &ctx->accumulator, 0, sizeof( sha4_context ) ); + sha4_starts( &ctx->accumulator, 0 ); + sha4_update( &ctx->accumulator, buf, ENTROPY_BLOCK_SIZE ); + + for( i = 0; i < ctx->source_count; i++ ) + ctx->source[i].size = 0; + + memcpy( output, buf, len ); + + return( 0 ); +} + +#endif diff --git a/Externals/polarssl/library/entropy_poll.c b/Externals/polarssl/library/entropy_poll.c new file mode 100644 index 0000000000..b5d9f787c0 --- /dev/null +++ b/Externals/polarssl/library/entropy_poll.c @@ -0,0 +1,136 @@ +/* + * Platform-specific and custom entropy polling functions + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ENTROPY_C) + +#include "polarssl/entropy.h" +#include "polarssl/entropy_poll.h" + +#if defined(POLARSSL_TIMING_C) +#include "polarssl/timing.h" +#endif +#if defined(POLARSSL_HAVEGE_C) +#include "polarssl/havege.h" +#endif + +#if !defined(POLARSSL_NO_PLATFORM_ENTROPY) +#if defined(_WIN32) + +#if !defined(_WIN32_WINNT) +#define _WIN32_WINNT 0x0400 +#endif +#include +#include + +int platform_entropy_poll( void *data, unsigned char *output, size_t len, + size_t *olen ) +{ + HCRYPTPROV provider; + ((void) data); + *olen = 0; + + if( CryptAcquireContext( &provider, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE ) + { + return POLARSSL_ERR_ENTROPY_SOURCE_FAILED; + } + + if( CryptGenRandom( provider, len, output ) == FALSE ) + return POLARSSL_ERR_ENTROPY_SOURCE_FAILED; + + CryptReleaseContext( provider, 0 ); + *olen = len; + + return( 0 ); +} +#else + +#include + +int platform_entropy_poll( void *data, + unsigned char *output, size_t len, size_t *olen ) +{ + FILE *file; + size_t ret; + ((void) data); + + *olen = 0; + + file = fopen( "/dev/urandom", "rb" ); + if( file == NULL ) + return POLARSSL_ERR_ENTROPY_SOURCE_FAILED; + + ret = fread( output, 1, len, file ); + if( ret != len ) + { + fclose( file ); + return POLARSSL_ERR_ENTROPY_SOURCE_FAILED; + } + + fclose( file ); + *olen = len; + + return( 0 ); +} +#endif +#endif + +#if defined(POLARSSL_TIMING_C) +int hardclock_poll( void *data, + unsigned char *output, size_t len, size_t *olen ) +{ + unsigned long timer = hardclock(); + ((void) data); + *olen = 0; + + if( len < sizeof(unsigned long) ) + return( 0 ); + + memcpy( output, &timer, sizeof(unsigned long) ); + *olen = sizeof(unsigned long); + + return( 0 ); +} +#endif + +#if defined(POLARSSL_HAVEGE_C) +int havege_poll( void *data, + unsigned char *output, size_t len, size_t *olen ) +{ + havege_state *hs = (havege_state *) data; + *olen = 0; + + if( havege_random( hs, output, len ) != 0 ) + return POLARSSL_ERR_ENTROPY_SOURCE_FAILED; + + *olen = len; + + return( 0 ); +} +#endif + +#endif /* POLARSSL_ENTROPY_C */ diff --git a/Externals/polarssl/library/error.c b/Externals/polarssl/library/error.c new file mode 100644 index 0000000000..036b834f1f --- /dev/null +++ b/Externals/polarssl/library/error.c @@ -0,0 +1,612 @@ +/* + * Error message information + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_ERROR_C) + +#include "polarssl/error.h" + +#if defined(POLARSSL_AES_C) +#include "polarssl/aes.h" +#endif + +#if defined(POLARSSL_BASE64_C) +#include "polarssl/base64.h" +#endif + +#if defined(POLARSSL_BIGNUM_C) +#include "polarssl/bignum.h" +#endif + +#if defined(POLARSSL_BLOWFISH_C) +#include "polarssl/blowfish.h" +#endif + +#if defined(POLARSSL_CAMELLIA_C) +#include "polarssl/camellia.h" +#endif + +#if defined(POLARSSL_CIPHER_C) +#include "polarssl/cipher.h" +#endif + +#if defined(POLARSSL_CTR_DRBG_C) +#include "polarssl/ctr_drbg.h" +#endif + +#if defined(POLARSSL_DES_C) +#include "polarssl/des.h" +#endif + +#if defined(POLARSSL_DHM_C) +#include "polarssl/dhm.h" +#endif + +#if defined(POLARSSL_ENTROPY_C) +#include "polarssl/entropy.h" +#endif + +#if defined(POLARSSL_GCM_C) +#include "polarssl/gcm.h" +#endif + +#if defined(POLARSSL_MD_C) +#include "polarssl/md.h" +#endif + +#if defined(POLARSSL_MD2_C) +#include "polarssl/md2.h" +#endif + +#if defined(POLARSSL_MD4_C) +#include "polarssl/md4.h" +#endif + +#if defined(POLARSSL_MD5_C) +#include "polarssl/md5.h" +#endif + +#if defined(POLARSSL_NET_C) +#include "polarssl/net.h" +#endif + +#if defined(POLARSSL_PADLOCK_C) +#include "polarssl/padlock.h" +#endif + +#if defined(POLARSSL_PBKDF2_C) +#include "polarssl/pbkdf2.h" +#endif + +#if defined(POLARSSL_PEM_C) +#include "polarssl/pem.h" +#endif + +#if defined(POLARSSL_PKCS12_C) +#include "polarssl/pkcs12.h" +#endif + +#if defined(POLARSSL_PKCS5_C) +#include "polarssl/pkcs5.h" +#endif + +#if defined(POLARSSL_RSA_C) +#include "polarssl/rsa.h" +#endif + +#if defined(POLARSSL_SHA1_C) +#include "polarssl/sha1.h" +#endif + +#if defined(POLARSSL_SHA2_C) +#include "polarssl/sha2.h" +#endif + +#if defined(POLARSSL_SHA4_C) +#include "polarssl/sha4.h" +#endif + +#if defined(POLARSSL_SSL_TLS_C) +#include "polarssl/ssl.h" +#endif + +#if defined(POLARSSL_X509_PARSE_C) +#include "polarssl/x509.h" +#endif + +#if defined(POLARSSL_XTEA_C) +#include "polarssl/xtea.h" +#endif + + +#include + +#if defined _MSC_VER && !defined snprintf +#define snprintf _snprintf +#endif + +void error_strerror( int ret, char *buf, size_t buflen ) +{ + size_t len; + int use_ret; + + memset( buf, 0x00, buflen ); + + if( ret < 0 ) + ret = -ret; + + if( ret & 0xFF80 ) + { + use_ret = ret & 0xFF80; + + // High level error codes + // +#if defined(POLARSSL_CIPHER_C) + if( use_ret == -(POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "CIPHER - The selected feature is not available" ); + if( use_ret == -(POLARSSL_ERR_CIPHER_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "CIPHER - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_CIPHER_ALLOC_FAILED) ) + snprintf( buf, buflen, "CIPHER - Failed to allocate memory" ); + if( use_ret == -(POLARSSL_ERR_CIPHER_INVALID_PADDING) ) + snprintf( buf, buflen, "CIPHER - Input data contains invalid padding and is rejected" ); + if( use_ret == -(POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED) ) + snprintf( buf, buflen, "CIPHER - Decryption of block requires a full block" ); +#endif /* POLARSSL_CIPHER_C */ + +#if defined(POLARSSL_DHM_C) + if( use_ret == -(POLARSSL_ERR_DHM_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "DHM - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_DHM_READ_PARAMS_FAILED) ) + snprintf( buf, buflen, "DHM - Reading of the DHM parameters failed" ); + if( use_ret == -(POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED) ) + snprintf( buf, buflen, "DHM - Making of the DHM parameters failed" ); + if( use_ret == -(POLARSSL_ERR_DHM_READ_PUBLIC_FAILED) ) + snprintf( buf, buflen, "DHM - Reading of the public values failed" ); + if( use_ret == -(POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED) ) + snprintf( buf, buflen, "DHM - Making of the public value failed" ); + if( use_ret == -(POLARSSL_ERR_DHM_CALC_SECRET_FAILED) ) + snprintf( buf, buflen, "DHM - Calculation of the DHM secret failed" ); +#endif /* POLARSSL_DHM_C */ + +#if defined(POLARSSL_MD_C) + if( use_ret == -(POLARSSL_ERR_MD_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "MD - The selected feature is not available" ); + if( use_ret == -(POLARSSL_ERR_MD_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "MD - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_MD_ALLOC_FAILED) ) + snprintf( buf, buflen, "MD - Failed to allocate memory" ); + if( use_ret == -(POLARSSL_ERR_MD_FILE_IO_ERROR) ) + snprintf( buf, buflen, "MD - Opening or reading of file failed" ); +#endif /* POLARSSL_MD_C */ + +#if defined(POLARSSL_PEM_C) + if( use_ret == -(POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT) ) + snprintf( buf, buflen, "PEM - No PEM header or footer found" ); + if( use_ret == -(POLARSSL_ERR_PEM_INVALID_DATA) ) + snprintf( buf, buflen, "PEM - PEM string is not as expected" ); + if( use_ret == -(POLARSSL_ERR_PEM_MALLOC_FAILED) ) + snprintf( buf, buflen, "PEM - Failed to allocate memory" ); + if( use_ret == -(POLARSSL_ERR_PEM_INVALID_ENC_IV) ) + snprintf( buf, buflen, "PEM - RSA IV is not in hex-format" ); + if( use_ret == -(POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG) ) + snprintf( buf, buflen, "PEM - Unsupported key encryption algorithm" ); + if( use_ret == -(POLARSSL_ERR_PEM_PASSWORD_REQUIRED) ) + snprintf( buf, buflen, "PEM - Private key password can't be empty" ); + if( use_ret == -(POLARSSL_ERR_PEM_PASSWORD_MISMATCH) ) + snprintf( buf, buflen, "PEM - Given private key password does not allow for correct decryption" ); + if( use_ret == -(POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "PEM - Unavailable feature, e.g. hashing/encryption combination" ); + if( use_ret == -(POLARSSL_ERR_PEM_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "PEM - Bad input parameters to function" ); +#endif /* POLARSSL_PEM_C */ + +#if defined(POLARSSL_PKCS12_C) + if( use_ret == -(POLARSSL_ERR_PKCS12_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "PKCS12 - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "PKCS12 - Feature not available, e.g. unsupported encryption scheme" ); + if( use_ret == -(POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT) ) + snprintf( buf, buflen, "PKCS12 - PBE ASN.1 data not as expected" ); + if( use_ret == -(POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH) ) + snprintf( buf, buflen, "PKCS12 - Given private key password does not allow for correct decryption" ); +#endif /* POLARSSL_PKCS12_C */ + +#if defined(POLARSSL_PKCS5_C) + if( use_ret == -(POLARSSL_ERR_PKCS5_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "PKCS5 - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_PKCS5_INVALID_FORMAT) ) + snprintf( buf, buflen, "PKCS5 - Unexpected ASN.1 data" ); + if( use_ret == -(POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "PKCS5 - Requested encryption or digest alg not available" ); + if( use_ret == -(POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH) ) + snprintf( buf, buflen, "PKCS5 - Given private key password does not allow for correct decryption" ); +#endif /* POLARSSL_PKCS5_C */ + +#if defined(POLARSSL_RSA_C) + if( use_ret == -(POLARSSL_ERR_RSA_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "RSA - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_RSA_INVALID_PADDING) ) + snprintf( buf, buflen, "RSA - Input data contains invalid padding and is rejected" ); + if( use_ret == -(POLARSSL_ERR_RSA_KEY_GEN_FAILED) ) + snprintf( buf, buflen, "RSA - Something failed during generation of a key" ); + if( use_ret == -(POLARSSL_ERR_RSA_KEY_CHECK_FAILED) ) + snprintf( buf, buflen, "RSA - Key failed to pass the libraries validity check" ); + if( use_ret == -(POLARSSL_ERR_RSA_PUBLIC_FAILED) ) + snprintf( buf, buflen, "RSA - The public key operation failed" ); + if( use_ret == -(POLARSSL_ERR_RSA_PRIVATE_FAILED) ) + snprintf( buf, buflen, "RSA - The private key operation failed" ); + if( use_ret == -(POLARSSL_ERR_RSA_VERIFY_FAILED) ) + snprintf( buf, buflen, "RSA - The PKCS#1 verification failed" ); + if( use_ret == -(POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE) ) + snprintf( buf, buflen, "RSA - The output buffer for decryption is not large enough" ); + if( use_ret == -(POLARSSL_ERR_RSA_RNG_FAILED) ) + snprintf( buf, buflen, "RSA - The random generator failed to generate non-zeros" ); +#endif /* POLARSSL_RSA_C */ + +#if defined(POLARSSL_SSL_TLS_C) + if( use_ret == -(POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "SSL - The requested feature is not available" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "SSL - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_SSL_INVALID_MAC) ) + snprintf( buf, buflen, "SSL - Verification of the message MAC failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_INVALID_RECORD) ) + snprintf( buf, buflen, "SSL - An invalid SSL record was received" ); + if( use_ret == -(POLARSSL_ERR_SSL_CONN_EOF) ) + snprintf( buf, buflen, "SSL - The connection indicated an EOF" ); + if( use_ret == -(POLARSSL_ERR_SSL_UNKNOWN_CIPHER) ) + snprintf( buf, buflen, "SSL - An unknown cipher was received" ); + if( use_ret == -(POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN) ) + snprintf( buf, buflen, "SSL - The server has no ciphersuites in common with the client" ); + if( use_ret == -(POLARSSL_ERR_SSL_NO_SESSION_FOUND) ) + snprintf( buf, buflen, "SSL - No session to recover was found" ); + if( use_ret == -(POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE) ) + snprintf( buf, buflen, "SSL - No client certification received from the client, but required by the authentication mode" ); + if( use_ret == -(POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE) ) + snprintf( buf, buflen, "SSL - DESCRIPTION MISSING" ); + if( use_ret == -(POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED) ) + snprintf( buf, buflen, "SSL - The own certificate is not set, but needed by the server" ); + if( use_ret == -(POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED) ) + snprintf( buf, buflen, "SSL - The own private key is not set, but needed" ); + if( use_ret == -(POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED) ) + snprintf( buf, buflen, "SSL - No CA Chain is set, but required to operate" ); + if( use_ret == -(POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE) ) + snprintf( buf, buflen, "SSL - An unexpected message was received from our peer" ); + if( use_ret == -(POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE) ) + { + snprintf( buf, buflen, "SSL - A fatal alert message was received from our peer" ); + return; + } + if( use_ret == -(POLARSSL_ERR_SSL_PEER_VERIFY_FAILED) ) + snprintf( buf, buflen, "SSL - Verification of our peer failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY) ) + snprintf( buf, buflen, "SSL - The peer notified us that the connection is going to be closed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO) ) + snprintf( buf, buflen, "SSL - Processing of the ClientHello handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO) ) + snprintf( buf, buflen, "SSL - Processing of the ServerHello handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE) ) + snprintf( buf, buflen, "SSL - Processing of the Certificate handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST) ) + snprintf( buf, buflen, "SSL - Processing of the CertificateRequest handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE) ) + snprintf( buf, buflen, "SSL - Processing of the ServerKeyExchange handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE) ) + snprintf( buf, buflen, "SSL - Processing of the ServerHelloDone handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE) ) + snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP) ) + snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM Read Public" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS) ) + snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM Calculate Secret" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY) ) + snprintf( buf, buflen, "SSL - Processing of the CertificateVerify handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC) ) + snprintf( buf, buflen, "SSL - Processing of the ChangeCipherSpec handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_FINISHED) ) + snprintf( buf, buflen, "SSL - Processing of the Finished handshake message failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_MALLOC_FAILED) ) + snprintf( buf, buflen, "SSL - Memory allocation failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_HW_ACCEL_FAILED) ) + snprintf( buf, buflen, "SSL - Hardware acceleration function returned with error" ); + if( use_ret == -(POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH) ) + snprintf( buf, buflen, "SSL - Hardware acceleration function skipped / left alone data" ); + if( use_ret == -(POLARSSL_ERR_SSL_COMPRESSION_FAILED) ) + snprintf( buf, buflen, "SSL - Processing of the compression / decompression failed" ); + if( use_ret == -(POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION) ) + snprintf( buf, buflen, "SSL - Handshake protocol not within min/max boundaries" ); +#endif /* POLARSSL_SSL_TLS_C */ + +#if defined(POLARSSL_X509_PARSE_C) + if( use_ret == -(POLARSSL_ERR_X509_FEATURE_UNAVAILABLE) ) + snprintf( buf, buflen, "X509 - Unavailable feature, e.g. RSA hashing/encryption combination" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_PEM) ) + snprintf( buf, buflen, "X509 - The PEM-encoded certificate contains invalid elements, e.g. invalid character" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_FORMAT) ) + snprintf( buf, buflen, "X509 - The certificate format is invalid, e.g. different type expected" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_VERSION) ) + snprintf( buf, buflen, "X509 - The certificate version element is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_SERIAL) ) + snprintf( buf, buflen, "X509 - The serial tag or value is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_ALG) ) + snprintf( buf, buflen, "X509 - The algorithm tag or value is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_NAME) ) + snprintf( buf, buflen, "X509 - The name tag or value is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_DATE) ) + snprintf( buf, buflen, "X509 - The date tag or value is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_PUBKEY) ) + snprintf( buf, buflen, "X509 - The pubkey tag or value is invalid (only RSA is supported)" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE) ) + snprintf( buf, buflen, "X509 - The signature tag or value invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS) ) + snprintf( buf, buflen, "X509 - The extension tag or value is invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION) ) + snprintf( buf, buflen, "X509 - Certificate or CRL has an unsupported version number" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG) ) + snprintf( buf, buflen, "X509 - Signature algorithm (oid) is unsupported" ); + if( use_ret == -(POLARSSL_ERR_X509_UNKNOWN_PK_ALG) ) + snprintf( buf, buflen, "X509 - Key algorithm is unsupported (only RSA is supported)" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_SIG_MISMATCH) ) + snprintf( buf, buflen, "X509 - Certificate signature algorithms do not match. (see \\c ::x509_cert sig_oid)" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_VERIFY_FAILED) ) + snprintf( buf, buflen, "X509 - Certificate verification failed, e.g. CRL, CA or signature check failed" ); + if( use_ret == -(POLARSSL_ERR_X509_KEY_INVALID_VERSION) ) + snprintf( buf, buflen, "X509 - Unsupported RSA key version" ); + if( use_ret == -(POLARSSL_ERR_X509_KEY_INVALID_FORMAT) ) + snprintf( buf, buflen, "X509 - Invalid RSA key tag or value" ); + if( use_ret == -(POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT) ) + snprintf( buf, buflen, "X509 - Format not recognized as DER or PEM" ); + if( use_ret == -(POLARSSL_ERR_X509_INVALID_INPUT) ) + snprintf( buf, buflen, "X509 - Input invalid" ); + if( use_ret == -(POLARSSL_ERR_X509_MALLOC_FAILED) ) + snprintf( buf, buflen, "X509 - Allocation of memory failed" ); + if( use_ret == -(POLARSSL_ERR_X509_FILE_IO_ERROR) ) + snprintf( buf, buflen, "X509 - Read/write of file failed" ); + if( use_ret == -(POLARSSL_ERR_X509_PASSWORD_REQUIRED) ) + snprintf( buf, buflen, "X509 - Private key password can't be empty" ); + if( use_ret == -(POLARSSL_ERR_X509_PASSWORD_MISMATCH) ) + snprintf( buf, buflen, "X509 - Given private key password does not allow for correct decryption" ); +#endif /* POLARSSL_X509_PARSE_C */ + + if( strlen( buf ) == 0 ) + snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); + } + + use_ret = ret & ~0xFF80; + + if( use_ret == 0 ) + return; + + // If high level code is present, make a concatenation between both + // error strings. + // + len = strlen( buf ); + + if( len > 0 ) + { + if( buflen - len < 5 ) + return; + + snprintf( buf + len, buflen - len, " : " ); + + buf += len + 3; + buflen -= len + 3; + } + + // Low level error codes + // +#if defined(POLARSSL_AES_C) + if( use_ret == -(POLARSSL_ERR_AES_INVALID_KEY_LENGTH) ) + snprintf( buf, buflen, "AES - Invalid key length" ); + if( use_ret == -(POLARSSL_ERR_AES_INVALID_INPUT_LENGTH) ) + snprintf( buf, buflen, "AES - Invalid data input length" ); +#endif /* POLARSSL_AES_C */ + +#if defined(POLARSSL_ASN1_PARSE_C) + if( use_ret == -(POLARSSL_ERR_ASN1_OUT_OF_DATA) ) + snprintf( buf, buflen, "ASN1 - Out of data when parsing an ASN1 data structure" ); + if( use_ret == -(POLARSSL_ERR_ASN1_UNEXPECTED_TAG) ) + snprintf( buf, buflen, "ASN1 - ASN1 tag was of an unexpected value" ); + if( use_ret == -(POLARSSL_ERR_ASN1_INVALID_LENGTH) ) + snprintf( buf, buflen, "ASN1 - Error when trying to determine the length or invalid length" ); + if( use_ret == -(POLARSSL_ERR_ASN1_LENGTH_MISMATCH) ) + snprintf( buf, buflen, "ASN1 - Actual length differs from expected length" ); + if( use_ret == -(POLARSSL_ERR_ASN1_INVALID_DATA) ) + snprintf( buf, buflen, "ASN1 - Data is invalid. (not used)" ); + if( use_ret == -(POLARSSL_ERR_ASN1_MALLOC_FAILED) ) + snprintf( buf, buflen, "ASN1 - Memory allocation failed" ); + if( use_ret == -(POLARSSL_ERR_ASN1_BUF_TOO_SMALL) ) + snprintf( buf, buflen, "ASN1 - Buffer too small when writing ASN.1 data structure" ); +#endif /* POLARSSL_ASN1_PARSE_C */ + +#if defined(POLARSSL_BASE64_C) + if( use_ret == -(POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL) ) + snprintf( buf, buflen, "BASE64 - Output buffer too small" ); + if( use_ret == -(POLARSSL_ERR_BASE64_INVALID_CHARACTER) ) + snprintf( buf, buflen, "BASE64 - Invalid character in input" ); +#endif /* POLARSSL_BASE64_C */ + +#if defined(POLARSSL_BIGNUM_C) + if( use_ret == -(POLARSSL_ERR_MPI_FILE_IO_ERROR) ) + snprintf( buf, buflen, "BIGNUM - An error occurred while reading from or writing to a file" ); + if( use_ret == -(POLARSSL_ERR_MPI_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "BIGNUM - Bad input parameters to function" ); + if( use_ret == -(POLARSSL_ERR_MPI_INVALID_CHARACTER) ) + snprintf( buf, buflen, "BIGNUM - There is an invalid character in the digit string" ); + if( use_ret == -(POLARSSL_ERR_MPI_BUFFER_TOO_SMALL) ) + snprintf( buf, buflen, "BIGNUM - The buffer is too small to write to" ); + if( use_ret == -(POLARSSL_ERR_MPI_NEGATIVE_VALUE) ) + snprintf( buf, buflen, "BIGNUM - The input arguments are negative or result in illegal output" ); + if( use_ret == -(POLARSSL_ERR_MPI_DIVISION_BY_ZERO) ) + snprintf( buf, buflen, "BIGNUM - The input argument for division is zero, which is not allowed" ); + if( use_ret == -(POLARSSL_ERR_MPI_NOT_ACCEPTABLE) ) + snprintf( buf, buflen, "BIGNUM - The input arguments are not acceptable" ); + if( use_ret == -(POLARSSL_ERR_MPI_MALLOC_FAILED) ) + snprintf( buf, buflen, "BIGNUM - Memory allocation failed" ); +#endif /* POLARSSL_BIGNUM_C */ + +#if defined(POLARSSL_BLOWFISH_C) + if( use_ret == -(POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH) ) + snprintf( buf, buflen, "BLOWFISH - Invalid key length" ); + if( use_ret == -(POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH) ) + snprintf( buf, buflen, "BLOWFISH - Invalid data input length" ); +#endif /* POLARSSL_BLOWFISH_C */ + +#if defined(POLARSSL_CAMELLIA_C) + if( use_ret == -(POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH) ) + snprintf( buf, buflen, "CAMELLIA - Invalid key length" ); + if( use_ret == -(POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH) ) + snprintf( buf, buflen, "CAMELLIA - Invalid data input length" ); +#endif /* POLARSSL_CAMELLIA_C */ + +#if defined(POLARSSL_CTR_DRBG_C) + if( use_ret == -(POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) ) + snprintf( buf, buflen, "CTR_DRBG - The entropy source failed" ); + if( use_ret == -(POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG) ) + snprintf( buf, buflen, "CTR_DRBG - Too many random requested in single call" ); + if( use_ret == -(POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG) ) + snprintf( buf, buflen, "CTR_DRBG - Input too large (Entropy + additional)" ); + if( use_ret == -(POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR) ) + snprintf( buf, buflen, "CTR_DRBG - Read/write error in file" ); +#endif /* POLARSSL_CTR_DRBG_C */ + +#if defined(POLARSSL_DES_C) + if( use_ret == -(POLARSSL_ERR_DES_INVALID_INPUT_LENGTH) ) + snprintf( buf, buflen, "DES - The data input has an invalid length" ); +#endif /* POLARSSL_DES_C */ + +#if defined(POLARSSL_ENTROPY_C) + if( use_ret == -(POLARSSL_ERR_ENTROPY_SOURCE_FAILED) ) + snprintf( buf, buflen, "ENTROPY - Critical entropy source failure" ); + if( use_ret == -(POLARSSL_ERR_ENTROPY_MAX_SOURCES) ) + snprintf( buf, buflen, "ENTROPY - No more sources can be added" ); + if( use_ret == -(POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED) ) + snprintf( buf, buflen, "ENTROPY - No sources have been added to poll" ); +#endif /* POLARSSL_ENTROPY_C */ + +#if defined(POLARSSL_GCM_C) + if( use_ret == -(POLARSSL_ERR_GCM_AUTH_FAILED) ) + snprintf( buf, buflen, "GCM - Authenticated decryption failed" ); + if( use_ret == -(POLARSSL_ERR_GCM_BAD_INPUT) ) + snprintf( buf, buflen, "GCM - Bad input parameters to function" ); +#endif /* POLARSSL_GCM_C */ + +#if defined(POLARSSL_MD2_C) + if( use_ret == -(POLARSSL_ERR_MD2_FILE_IO_ERROR) ) + snprintf( buf, buflen, "MD2 - Read/write error in file" ); +#endif /* POLARSSL_MD2_C */ + +#if defined(POLARSSL_MD4_C) + if( use_ret == -(POLARSSL_ERR_MD4_FILE_IO_ERROR) ) + snprintf( buf, buflen, "MD4 - Read/write error in file" ); +#endif /* POLARSSL_MD4_C */ + +#if defined(POLARSSL_MD5_C) + if( use_ret == -(POLARSSL_ERR_MD5_FILE_IO_ERROR) ) + snprintf( buf, buflen, "MD5 - Read/write error in file" ); +#endif /* POLARSSL_MD5_C */ + +#if defined(POLARSSL_NET_C) + if( use_ret == -(POLARSSL_ERR_NET_UNKNOWN_HOST) ) + snprintf( buf, buflen, "NET - Failed to get an IP address for the given hostname" ); + if( use_ret == -(POLARSSL_ERR_NET_SOCKET_FAILED) ) + snprintf( buf, buflen, "NET - Failed to open a socket" ); + if( use_ret == -(POLARSSL_ERR_NET_CONNECT_FAILED) ) + snprintf( buf, buflen, "NET - The connection to the given server / port failed" ); + if( use_ret == -(POLARSSL_ERR_NET_BIND_FAILED) ) + snprintf( buf, buflen, "NET - Binding of the socket failed" ); + if( use_ret == -(POLARSSL_ERR_NET_LISTEN_FAILED) ) + snprintf( buf, buflen, "NET - Could not listen on the socket" ); + if( use_ret == -(POLARSSL_ERR_NET_ACCEPT_FAILED) ) + snprintf( buf, buflen, "NET - Could not accept the incoming connection" ); + if( use_ret == -(POLARSSL_ERR_NET_RECV_FAILED) ) + snprintf( buf, buflen, "NET - Reading information from the socket failed" ); + if( use_ret == -(POLARSSL_ERR_NET_SEND_FAILED) ) + snprintf( buf, buflen, "NET - Sending information through the socket failed" ); + if( use_ret == -(POLARSSL_ERR_NET_CONN_RESET) ) + snprintf( buf, buflen, "NET - Connection was reset by peer" ); + if( use_ret == -(POLARSSL_ERR_NET_WANT_READ) ) + snprintf( buf, buflen, "NET - Connection requires a read call" ); + if( use_ret == -(POLARSSL_ERR_NET_WANT_WRITE) ) + snprintf( buf, buflen, "NET - Connection requires a write call" ); +#endif /* POLARSSL_NET_C */ + +#if defined(POLARSSL_PADLOCK_C) + if( use_ret == -(POLARSSL_ERR_PADLOCK_DATA_MISALIGNED) ) + snprintf( buf, buflen, "PADLOCK - Input data should be aligned" ); +#endif /* POLARSSL_PADLOCK_C */ + +#if defined(POLARSSL_PBKDF2_C) + if( use_ret == -(POLARSSL_ERR_PBKDF2_BAD_INPUT_DATA) ) + snprintf( buf, buflen, "PBKDF2 - Bad input parameters to function" ); +#endif /* POLARSSL_PBKDF2_C */ + +#if defined(POLARSSL_SHA1_C) + if( use_ret == -(POLARSSL_ERR_SHA1_FILE_IO_ERROR) ) + snprintf( buf, buflen, "SHA1 - Read/write error in file" ); +#endif /* POLARSSL_SHA1_C */ + +#if defined(POLARSSL_SHA2_C) + if( use_ret == -(POLARSSL_ERR_SHA2_FILE_IO_ERROR) ) + snprintf( buf, buflen, "SHA2 - Read/write error in file" ); +#endif /* POLARSSL_SHA2_C */ + +#if defined(POLARSSL_SHA4_C) + if( use_ret == -(POLARSSL_ERR_SHA4_FILE_IO_ERROR) ) + snprintf( buf, buflen, "SHA4 - Read/write error in file" ); +#endif /* POLARSSL_SHA4_C */ + +#if defined(POLARSSL_XTEA_C) + if( use_ret == -(POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH) ) + snprintf( buf, buflen, "XTEA - The data input has an invalid length" ); +#endif /* POLARSSL_XTEA_C */ + + if( strlen( buf ) != 0 ) + return; + + snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); +} + +#else /* POLARSSL_ERROR_C */ + +#if defined(POLARSSL_ERROR_STRERROR_DUMMY) + +#include + +/* + * Provide an non-function in case POLARSSL_ERROR_C is not defined + */ +void error_strerror( int ret, char *buf, size_t buflen ) +{ + ((void) ret); + + if( buflen > 0 ) + buf[0] = '\0'; +} + +#endif /* POLARSSL_ERROR_STRERROR_DUMMY */ +#endif /* POLARSSL_ERROR_C */ diff --git a/Externals/polarssl/library/gcm.c b/Externals/polarssl/library/gcm.c new file mode 100644 index 0000000000..60dc0cd0a4 --- /dev/null +++ b/Externals/polarssl/library/gcm.c @@ -0,0 +1,621 @@ +/* + * NIST SP800-38D compliant GCM implementation + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + */ +#include "polarssl/config.h" + +#if defined(POLARSSL_GCM_C) + +#include "polarssl/gcm.h" + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +static void gcm_gen_table( gcm_context *ctx ) +{ + int i, j; + uint64_t hi, lo; + uint64_t vl, vh; + unsigned char h[16]; + + memset( h, 0, 16 ); + aes_crypt_ecb( &ctx->aes_ctx, AES_ENCRYPT, h, h ); + + ctx->HH[0] = 0; + ctx->HL[0] = 0; + + GET_UINT32_BE( hi, h, 0 ); + GET_UINT32_BE( lo, h, 4 ); + vh = (uint64_t) hi << 32 | lo; + + GET_UINT32_BE( hi, h, 8 ); + GET_UINT32_BE( lo, h, 12 ); + vl = (uint64_t) hi << 32 | lo; + + ctx->HL[8] = vl; + ctx->HH[8] = vh; + + for( i = 4; i > 0; i >>= 1 ) + { + uint32_t T = ( vl & 1 ) * 0xe1000000U; + vl = ( vh << 63 ) | ( vl >> 1 ); + vh = ( vh >> 1 ) ^ ( (uint64_t) T << 32); + + ctx->HL[i] = vl; + ctx->HH[i] = vh; + } + + for (i = 2; i < 16; i <<= 1 ) + { + uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i; + vh = *HiH; + vl = *HiL; + for( j = 1; j < i; j++ ) + { + HiH[j] = vh ^ ctx->HH[j]; + HiL[j] = vl ^ ctx->HL[j]; + } + } + +} + +int gcm_init( gcm_context *ctx, const unsigned char *key, unsigned int keysize ) +{ + int ret; + + memset( ctx, 0, sizeof(gcm_context) ); + + if( ( ret = aes_setkey_enc( &ctx->aes_ctx, key, keysize ) ) != 0 ) + return( ret ); + + gcm_gen_table( ctx ); + + return( 0 ); +} + +static const uint64_t last4[16] = +{ + 0x0000, 0x1c20, 0x3840, 0x2460, + 0x7080, 0x6ca0, 0x48c0, 0x54e0, + 0xe100, 0xfd20, 0xd940, 0xc560, + 0x9180, 0x8da0, 0xa9c0, 0xb5e0 +}; + +void gcm_mult( gcm_context *ctx, const unsigned char x[16], unsigned char output[16] ) +{ + int i = 0; + unsigned char z[16]; + unsigned char lo, hi, rem; + uint64_t zh, zl; + + memset( z, 0x00, 16 ); + + lo = x[15] & 0xf; + hi = x[15] >> 4; + + zh = ctx->HH[lo]; + zl = ctx->HL[lo]; + + for( i = 15; i >= 0; i-- ) + { + lo = x[i] & 0xf; + hi = x[i] >> 4; + + if( i != 15 ) + { + rem = (unsigned char) zl & 0xf; + zl = ( zh << 60 ) | ( zl >> 4 ); + zh = ( zh >> 4 ); + zh ^= (uint64_t) last4[rem] << 48; + zh ^= ctx->HH[lo]; + zl ^= ctx->HL[lo]; + + } + + rem = (unsigned char) zl & 0xf; + zl = ( zh << 60 ) | ( zl >> 4 ); + zh = ( zh >> 4 ); + zh ^= (uint64_t) last4[rem] << 48; + zh ^= ctx->HH[hi]; + zl ^= ctx->HL[hi]; + } + + PUT_UINT32_BE( zh >> 32, output, 0 ); + PUT_UINT32_BE( zh, output, 4 ); + PUT_UINT32_BE( zl >> 32, output, 8 ); + PUT_UINT32_BE( zl, output, 12 ); +} + +int gcm_crypt_and_tag( gcm_context *ctx, + int mode, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *input, + unsigned char *output, + size_t tag_len, + unsigned char *tag ) +{ + unsigned char y[16]; + unsigned char ectr[16]; + unsigned char buf[16]; + unsigned char work_buf[16]; + size_t i; + const unsigned char *p; + unsigned char *out_p = output; + size_t use_len; + uint64_t orig_len = length * 8; + uint64_t orig_add_len = add_len * 8; + + memset( y, 0x00, 16 ); + memset( work_buf, 0x00, 16 ); + memset( tag, 0x00, tag_len ); + memset( buf, 0x00, 16 ); + + if( ( mode == GCM_DECRYPT && output <= input && ( input - output ) < 8 ) || + ( output > input && (size_t) ( output - input ) < length ) ) + { + return( POLARSSL_ERR_GCM_BAD_INPUT ); + } + + if( iv_len == 12 ) + { + memcpy( y, iv, iv_len ); + y[15] = 1; + } + else + { + memset( work_buf, 0x00, 16 ); + PUT_UINT32_BE( iv_len * 8, work_buf, 12 ); + + p = iv; + while( iv_len > 0 ) + { + use_len = ( iv_len < 16 ) ? iv_len : 16; + + for( i = 0; i < use_len; i++ ) + y[i] ^= p[i]; + + gcm_mult( ctx, y, y ); + + iv_len -= use_len; + p += use_len; + } + + for( i = 0; i < 16; i++ ) + y[i] ^= work_buf[i]; + + gcm_mult( ctx, y, y ); + } + + aes_crypt_ecb( &ctx->aes_ctx, AES_ENCRYPT, y, ectr ); + memcpy( tag, ectr, tag_len ); + + p = add; + while( add_len > 0 ) + { + use_len = ( add_len < 16 ) ? add_len : 16; + + for( i = 0; i < use_len; i++ ) + buf[i] ^= p[i]; + + gcm_mult( ctx, buf, buf ); + + add_len -= use_len; + p += use_len; + } + + p = input; + while( length > 0 ) + { + use_len = ( length < 16 ) ? length : 16; + + for( i = 16; i > 12; i-- ) + if( ++y[i - 1] != 0 ) + break; + + aes_crypt_ecb( &ctx->aes_ctx, AES_ENCRYPT, y, ectr ); + + for( i = 0; i < use_len; i++ ) + { + out_p[i] = ectr[i] ^ p[i]; + if( mode == GCM_ENCRYPT ) + buf[i] ^= out_p[i]; + else + buf[i] ^= p[i]; + } + + gcm_mult( ctx, buf, buf ); + + length -= use_len; + p += use_len; + out_p += use_len; + } + + if( orig_len || orig_add_len ) + { + memset( work_buf, 0x00, 16 ); + + PUT_UINT32_BE( ( orig_add_len >> 32 ), work_buf, 0 ); + PUT_UINT32_BE( ( orig_add_len ), work_buf, 4 ); + PUT_UINT32_BE( ( orig_len >> 32 ), work_buf, 8 ); + PUT_UINT32_BE( ( orig_len ), work_buf, 12 ); + + for( i = 0; i < 16; i++ ) + buf[i] ^= work_buf[i]; + + gcm_mult( ctx, buf, buf ); + + for( i = 0; i < tag_len; i++ ) + tag[i] ^= buf[i]; + } + + return( 0 ); +} + +int gcm_auth_decrypt( gcm_context *ctx, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *tag, + size_t tag_len, + const unsigned char *input, + unsigned char *output ) +{ + unsigned char check_tag[16]; + + gcm_crypt_and_tag( ctx, GCM_DECRYPT, length, iv, iv_len, add, add_len, input, output, tag_len, check_tag ); + + if( memcmp( check_tag, tag, tag_len ) == 0 ) + return( 0 ); + + memset( output, 0, length ); + + return( POLARSSL_ERR_GCM_AUTH_FAILED ); +} + +#if defined(POLARSSL_SELF_TEST) + +#include + +/* + * GCM test vectors from: + * + * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip + */ +#define MAX_TESTS 6 + +int key_index[MAX_TESTS] = + { 0, 0, 1, 1, 1, 1 }; + +unsigned char key[MAX_TESTS][32] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, + 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, + 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, + 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, +}; + +size_t iv_len[MAX_TESTS] = + { 12, 12, 12, 12, 8, 60 }; + +int iv_index[MAX_TESTS] = + { 0, 0, 1, 1, 1, 2 }; + +unsigned char iv[MAX_TESTS][64] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, + 0xde, 0xca, 0xf8, 0x88 }, + { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5, + 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa, + 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1, + 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28, + 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39, + 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54, + 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57, + 0xa6, 0x37, 0xb3, 0x9b }, +}; + +size_t add_len[MAX_TESTS] = + { 0, 0, 0, 20, 20, 20 }; + +int add_index[MAX_TESTS] = + { 0, 0, 0, 1, 1, 1 }; + +unsigned char additional[MAX_TESTS][64] = +{ + { 0x00 }, + { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xab, 0xad, 0xda, 0xd2 }, +}; + +size_t pt_len[MAX_TESTS] = + { 0, 16, 64, 60, 60, 60 }; + +int pt_index[MAX_TESTS] = + { 0, 0, 1, 1, 1, 1 }; + +unsigned char pt[MAX_TESTS][64] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, + 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, + 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, + 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, + 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, + 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, + 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, + 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, +}; + +unsigned char ct[MAX_TESTS * 3][64] = +{ + { 0x00 }, + { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, + 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 }, + { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, + 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, + 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, + 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, + 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, + 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, + 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, + 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 }, + { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, + 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, + 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, + 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, + 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, + 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, + 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, + 0x3d, 0x58, 0xe0, 0x91 }, + { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a, + 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55, + 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8, + 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23, + 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2, + 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42, + 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07, + 0xc2, 0x3f, 0x45, 0x98 }, + { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6, + 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94, + 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8, + 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7, + 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90, + 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f, + 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03, + 0x4c, 0x34, 0xae, 0xe5 }, + { 0x00 }, + { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, + 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 }, + { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, + 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, + 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, + 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, + 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, + 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, + 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, + 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 }, + { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, + 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, + 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, + 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, + 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, + 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, + 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, + 0xcc, 0xda, 0x27, 0x10 }, + { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54, + 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8, + 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f, + 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57, + 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75, + 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9, + 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f, + 0xa0, 0xf0, 0x62, 0xf7 }, + { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c, + 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff, + 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef, + 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45, + 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9, + 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3, + 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7, + 0xe9, 0xb7, 0x37, 0x3b }, + { 0x00 }, + { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, + 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 }, + { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, + 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, + 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, + 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, + 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, + 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, + 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, + 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad }, + { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, + 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, + 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, + 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, + 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, + 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, + 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, + 0xbc, 0xc9, 0xf6, 0x62 }, + { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, + 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb, + 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa, + 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, + 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0, + 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78, + 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, + 0xf4, 0x7c, 0x9b, 0x1f }, + { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1, + 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20, + 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19, + 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4, + 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45, + 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde, + 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e, + 0x44, 0xae, 0x7e, 0x3f }, +}; + +unsigned char tag[MAX_TESTS * 3][16] = +{ + { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61, + 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }, + { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, + 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }, + { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, + 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, + { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, + 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, + { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85, + 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb }, + { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa, + 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 }, + { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b, + 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 }, + { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, + 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, + { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, + 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, + { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, + 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, + { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24, + 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 }, + { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb, + 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 }, + { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, + 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b }, + { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, + 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }, + { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, + 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }, + { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, + 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }, + { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, + 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 }, + { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0, + 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a }, +}; + +int gcm_self_test( int verbose ) +{ + gcm_context ctx; + unsigned char buf[64]; + unsigned char tag_buf[16]; + int i, j, ret; + + for( j = 0; j < 3; j++ ) + { + int key_len = 128 + 64 * j; + + for( i = 0; i < MAX_TESTS; i++ ) + { + printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "enc" ); + gcm_init( &ctx, key[key_index[i]], key_len ); + + ret = gcm_crypt_and_tag( &ctx, GCM_ENCRYPT, + pt_len[i], + iv[iv_index[i]], iv_len[i], + additional[add_index[i]], add_len[i], + pt[pt_index[i]], buf, 16, tag_buf ); + + if( ret != 0 || + memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 || + memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + + printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "dec" ); + gcm_init( &ctx, key[key_index[i]], key_len ); + + ret = gcm_crypt_and_tag( &ctx, GCM_DECRYPT, + pt_len[i], + iv[iv_index[i]], iv_len[i], + additional[add_index[i]], add_len[i], + ct[j * 6 + i], buf, 16, tag_buf ); + + if( ret != 0 || + memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 || + memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + } + + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/havege.c b/Externals/polarssl/library/havege.c new file mode 100644 index 0000000000..ff302c577c --- /dev/null +++ b/Externals/polarssl/library/havege.c @@ -0,0 +1,231 @@ +/** + * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The HAVEGE RNG was designed by Andre Seznec in 2002. + * + * http://www.irisa.fr/caps/projects/hipsor/publi.php + * + * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_HAVEGE_C) + +#include "polarssl/havege.h" +#include "polarssl/timing.h" + +#include +#include + +/* ------------------------------------------------------------------------ + * On average, one iteration accesses two 8-word blocks in the havege WALK + * table, and generates 16 words in the RES array. + * + * The data read in the WALK table is updated and permuted after each use. + * The result of the hardware clock counter read is used for this update. + * + * 25 conditional tests are present. The conditional tests are grouped in + * two nested groups of 12 conditional tests and 1 test that controls the + * permutation; on average, there should be 6 tests executed and 3 of them + * should be mispredicted. + * ------------------------------------------------------------------------ + */ + +#define SWAP(X,Y) { int *T = X; X = Y; Y = T; } + +#define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; +#define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; + +#define TST1_LEAVE U1++; } +#define TST2_LEAVE U2++; } + +#define ONE_ITERATION \ + \ + PTEST = PT1 >> 20; \ + \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + \ + PTX = (PT1 >> 18) & 7; \ + PT1 &= 0x1FFF; \ + PT2 &= 0x1FFF; \ + CLK = (int) hardclock(); \ + \ + i = 0; \ + A = &WALK[PT1 ]; RES[i++] ^= *A; \ + B = &WALK[PT2 ]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \ + \ + IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \ + *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \ + *B = IN ^ U1; \ + *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \ + *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \ + B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \ + \ + if( PTEST & 1 ) SWAP( A, C ); \ + \ + IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \ + *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \ + *B = IN; CLK = (int) hardclock(); \ + *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \ + *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 4]; \ + B = &WALK[PT2 ^ 1]; \ + \ + PTEST = PT2 >> 1; \ + \ + PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \ + PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \ + PTY = (PT2 >> 10) & 7; \ + \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + \ + C = &WALK[PT1 ^ 5]; \ + D = &WALK[PT2 ^ 5]; \ + \ + RES[i++] ^= *A; \ + RES[i++] ^= *B; \ + RES[i++] ^= *C; \ + RES[i++] ^= *D; \ + \ + IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \ + *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \ + *B = IN ^ U2; \ + *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \ + *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \ + B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \ + \ + IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \ + *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \ + *B = IN; \ + *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \ + *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \ + \ + PT1 = ( RES[(i - 8) ^ PTX] ^ \ + WALK[PT1 ^ PTX ^ 7] ) & (~1); \ + PT1 ^= (PT2 ^ 0x10) & 0x10; \ + \ + for( n++, i = 0; i < 16; i++ ) \ + hs->pool[n % COLLECT_SIZE] ^= RES[i]; + +/* + * Entropy gathering function + */ +static void havege_fill( havege_state *hs ) +{ + int i, n = 0; + int U1, U2, *A, *B, *C, *D; + int PT1, PT2, *WALK, RES[16]; + int PTX, PTY, CLK, PTEST, IN; + + WALK = hs->WALK; + PT1 = hs->PT1; + PT2 = hs->PT2; + + PTX = U1 = 0; + PTY = U2 = 0; + + memset( RES, 0, sizeof( RES ) ); + + while( n < COLLECT_SIZE * 4 ) + { + ONE_ITERATION + ONE_ITERATION + ONE_ITERATION + ONE_ITERATION + } + + hs->PT1 = PT1; + hs->PT2 = PT2; + + hs->offset[0] = 0; + hs->offset[1] = COLLECT_SIZE / 2; +} + +/* + * HAVEGE initialization + */ +void havege_init( havege_state *hs ) +{ + memset( hs, 0, sizeof( havege_state ) ); + + havege_fill( hs ); +} + +/* + * HAVEGE rand function + */ +int havege_random( void *p_rng, unsigned char *buf, size_t len ) +{ + int val; + size_t use_len; + havege_state *hs = (havege_state *) p_rng; + unsigned char *p = buf; + + while( len > 0 ) + { + use_len = len; + if( use_len > sizeof(int) ) + use_len = sizeof(int); + + if( hs->offset[1] >= COLLECT_SIZE ) + havege_fill( hs ); + + val = hs->pool[hs->offset[0]++]; + val ^= hs->pool[hs->offset[1]++]; + + memcpy( p, &val, use_len ); + + len -= use_len; + p += use_len; + } + + return( 0 ); +} + +#endif diff --git a/Externals/polarssl/library/md.c b/Externals/polarssl/library/md.c new file mode 100644 index 0000000000..96065c95f0 --- /dev/null +++ b/Externals/polarssl/library/md.c @@ -0,0 +1,297 @@ +/** + * \file md.c + * + * \brief Generic message digest wrapper for PolarSSL + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_MD_C) + +#include "polarssl/md.h" +#include "polarssl/md_wrap.h" + +#include + +#if defined _MSC_VER && !defined strcasecmp +#define strcasecmp _stricmp +#endif + +static const int supported_digests[] = { + +#if defined(POLARSSL_MD2_C) + POLARSSL_MD_MD2, +#endif + +#if defined(POLARSSL_MD4_C) + POLARSSL_MD_MD4, +#endif + +#if defined(POLARSSL_MD5_C) + POLARSSL_MD_MD5, +#endif + +#if defined(POLARSSL_SHA1_C) + POLARSSL_MD_SHA1, +#endif + +#if defined(POLARSSL_SHA2_C) + POLARSSL_MD_SHA224, + POLARSSL_MD_SHA256, +#endif + +#if defined(POLARSSL_SHA4_C) + POLARSSL_MD_SHA384, + POLARSSL_MD_SHA512, +#endif + + 0 +}; + +const int *md_list( void ) +{ + return supported_digests; +} + +const md_info_t *md_info_from_string( const char *md_name ) +{ + if( NULL == md_name ) + return NULL; + + /* Get the appropriate digest information */ +#if defined(POLARSSL_MD2_C) + if( !strcasecmp( "MD2", md_name ) ) + return md_info_from_type( POLARSSL_MD_MD2 ); +#endif +#if defined(POLARSSL_MD4_C) + if( !strcasecmp( "MD4", md_name ) ) + return md_info_from_type( POLARSSL_MD_MD4 ); +#endif +#if defined(POLARSSL_MD5_C) + if( !strcasecmp( "MD5", md_name ) ) + return md_info_from_type( POLARSSL_MD_MD5 ); +#endif +#if defined(POLARSSL_SHA1_C) + if( !strcasecmp( "SHA1", md_name ) || !strcasecmp( "SHA", md_name ) ) + return md_info_from_type( POLARSSL_MD_SHA1 ); +#endif +#if defined(POLARSSL_SHA2_C) + if( !strcasecmp( "SHA224", md_name ) ) + return md_info_from_type( POLARSSL_MD_SHA224 ); + if( !strcasecmp( "SHA256", md_name ) ) + return md_info_from_type( POLARSSL_MD_SHA256 ); +#endif +#if defined(POLARSSL_SHA4_C) + if( !strcasecmp( "SHA384", md_name ) ) + return md_info_from_type( POLARSSL_MD_SHA384 ); + if( !strcasecmp( "SHA512", md_name ) ) + return md_info_from_type( POLARSSL_MD_SHA512 ); +#endif + return NULL; +} + +const md_info_t *md_info_from_type( md_type_t md_type ) +{ + switch( md_type ) + { +#if defined(POLARSSL_MD2_C) + case POLARSSL_MD_MD2: + return &md2_info; +#endif +#if defined(POLARSSL_MD4_C) + case POLARSSL_MD_MD4: + return &md4_info; +#endif +#if defined(POLARSSL_MD5_C) + case POLARSSL_MD_MD5: + return &md5_info; +#endif +#if defined(POLARSSL_SHA1_C) + case POLARSSL_MD_SHA1: + return &sha1_info; +#endif +#if defined(POLARSSL_SHA2_C) + case POLARSSL_MD_SHA224: + return &sha224_info; + case POLARSSL_MD_SHA256: + return &sha256_info; +#endif +#if defined(POLARSSL_SHA4_C) + case POLARSSL_MD_SHA384: + return &sha384_info; + case POLARSSL_MD_SHA512: + return &sha512_info; +#endif + default: + return NULL; + } +} + +int md_init_ctx( md_context_t *ctx, const md_info_t *md_info ) +{ + if( md_info == NULL || ctx == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + memset( ctx, 0, sizeof( md_context_t ) ); + + if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL ) + return POLARSSL_ERR_MD_ALLOC_FAILED; + + ctx->md_info = md_info; + + md_info->starts_func( ctx->md_ctx ); + + return 0; +} + +int md_free_ctx( md_context_t *ctx ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->ctx_free_func( ctx->md_ctx ); + ctx->md_ctx = NULL; + + return 0; +} + +int md_starts( md_context_t *ctx ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->starts_func( ctx->md_ctx ); + + return 0; +} + +int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->update_func( ctx->md_ctx, input, ilen ); + + return 0; +} + +int md_finish( md_context_t *ctx, unsigned char *output ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->finish_func( ctx->md_ctx, output ); + + return 0; +} + +int md( const md_info_t *md_info, const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + if ( md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + md_info->digest_func( input, ilen, output ); + + return 0; +} + +int md_file( const md_info_t *md_info, const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + int ret; +#endif + + if( md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + +#if defined(POLARSSL_FS_IO) + ret = md_info->file_func( path, output ); + if( ret != 0 ) + return( POLARSSL_ERR_MD_FILE_IO_ERROR + ret ); + + return( ret ); +#else + ((void) path); + ((void) output); + + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->hmac_starts_func( ctx->md_ctx, key, keylen); + + return 0; +} + +int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->hmac_update_func( ctx->md_ctx, input, ilen ); + + return 0; +} + +int md_hmac_finish( md_context_t *ctx, unsigned char *output) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->hmac_finish_func( ctx->md_ctx, output); + + return 0; +} + +int md_hmac_reset( md_context_t *ctx ) +{ + if( ctx == NULL || ctx->md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + ctx->md_info->hmac_reset_func( ctx->md_ctx); + + return 0; +} + +int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + if( md_info == NULL ) + return POLARSSL_ERR_MD_BAD_INPUT_DATA; + + md_info->hmac_func( key, keylen, input, ilen, output ); + + return 0; +} + +#endif diff --git a/Externals/polarssl/library/md2.c b/Externals/polarssl/library/md2.c new file mode 100644 index 0000000000..2c8754a8a9 --- /dev/null +++ b/Externals/polarssl/library/md2.c @@ -0,0 +1,368 @@ +/* + * RFC 1115/1319 compliant MD2 implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The MD2 algorithm was designed by Ron Rivest in 1989. + * + * http://www.ietf.org/rfc/rfc1115.txt + * http://www.ietf.org/rfc/rfc1319.txt + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_MD2_C) + +#include "polarssl/md2.h" + +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if !defined(POLARSSL_MD2_ALT) + +static const unsigned char PI_SUBST[256] = +{ + 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, + 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, + 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, + 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, + 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, + 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, + 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, + 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, + 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, + 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, + 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, + 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, + 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, + 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, + 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, + 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, + 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, + 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, + 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, + 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, + 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, + 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, + 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, + 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, + 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, + 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 +}; + +/* + * MD2 context setup + */ +void md2_starts( md2_context *ctx ) +{ + memset( ctx->cksum, 0, 16 ); + memset( ctx->state, 0, 46 ); + memset( ctx->buffer, 0, 16 ); + ctx->left = 0; +} + +static void md2_process( md2_context *ctx ) +{ + int i, j; + unsigned char t = 0; + + for( i = 0; i < 16; i++ ) + { + ctx->state[i + 16] = ctx->buffer[i]; + ctx->state[i + 32] = + (unsigned char)( ctx->buffer[i] ^ ctx->state[i]); + } + + for( i = 0; i < 18; i++ ) + { + for( j = 0; j < 48; j++ ) + { + ctx->state[j] = (unsigned char) + ( ctx->state[j] ^ PI_SUBST[t] ); + t = ctx->state[j]; + } + + t = (unsigned char)( t + i ); + } + + t = ctx->cksum[15]; + + for( i = 0; i < 16; i++ ) + { + ctx->cksum[i] = (unsigned char) + ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] ); + t = ctx->cksum[i]; + } +} + +/* + * MD2 process buffer + */ +void md2_update( md2_context *ctx, const unsigned char *input, size_t ilen ) +{ + size_t fill; + + while( ilen > 0 ) + { + if( ctx->left + ilen > 16 ) + fill = 16 - ctx->left; + else + fill = ilen; + + memcpy( ctx->buffer + ctx->left, input, fill ); + + ctx->left += fill; + input += fill; + ilen -= fill; + + if( ctx->left == 16 ) + { + ctx->left = 0; + md2_process( ctx ); + } + } +} + +/* + * MD2 final digest + */ +void md2_finish( md2_context *ctx, unsigned char output[16] ) +{ + size_t i; + unsigned char x; + + x = (unsigned char)( 16 - ctx->left ); + + for( i = ctx->left; i < 16; i++ ) + ctx->buffer[i] = x; + + md2_process( ctx ); + + memcpy( ctx->buffer, ctx->cksum, 16 ); + md2_process( ctx ); + + memcpy( output, ctx->state, 16 ); +} + +#endif /* !POLARSSL_MD2_ALT */ + +/* + * output = MD2( input buffer ) + */ +void md2( const unsigned char *input, size_t ilen, unsigned char output[16] ) +{ + md2_context ctx; + + md2_starts( &ctx ); + md2_update( &ctx, input, ilen ); + md2_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md2_context ) ); +} + +#if defined(POLARSSL_FS_IO) +/* + * output = MD2( file contents ) + */ +int md2_file( const char *path, unsigned char output[16] ) +{ + FILE *f; + size_t n; + md2_context ctx; + unsigned char buf[1024]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_MD2_FILE_IO_ERROR ); + + md2_starts( &ctx ); + + while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + md2_update( &ctx, buf, n ); + + md2_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md2_context ) ); + + if( ferror( f ) != 0 ) + { + fclose( f ); + return( POLARSSL_ERR_MD2_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * MD2 HMAC context setup + */ +void md2_hmac_starts( md2_context *ctx, const unsigned char *key, size_t keylen ) +{ + size_t i; + unsigned char sum[16]; + + if( keylen > 16 ) + { + md2( key, keylen, sum ); + keylen = 16; + key = sum; + } + + memset( ctx->ipad, 0x36, 16 ); + memset( ctx->opad, 0x5C, 16 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + md2_starts( ctx ); + md2_update( ctx, ctx->ipad, 16 ); + + memset( sum, 0, sizeof( sum ) ); +} + +/* + * MD2 HMAC process buffer + */ +void md2_hmac_update( md2_context *ctx, const unsigned char *input, size_t ilen ) +{ + md2_update( ctx, input, ilen ); +} + +/* + * MD2 HMAC final digest + */ +void md2_hmac_finish( md2_context *ctx, unsigned char output[16] ) +{ + unsigned char tmpbuf[16]; + + md2_finish( ctx, tmpbuf ); + md2_starts( ctx ); + md2_update( ctx, ctx->opad, 16 ); + md2_update( ctx, tmpbuf, 16 ); + md2_finish( ctx, output ); + + memset( tmpbuf, 0, sizeof( tmpbuf ) ); +} + +/* + * MD2 HMAC context reset + */ +void md2_hmac_reset( md2_context *ctx ) +{ + md2_starts( ctx ); + md2_update( ctx, ctx->ipad, 16 ); +} + +/* + * output = HMAC-MD2( hmac key, input buffer ) + */ +void md2_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[16] ) +{ + md2_context ctx; + + md2_hmac_starts( &ctx, key, keylen ); + md2_hmac_update( &ctx, input, ilen ); + md2_hmac_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md2_context ) ); +} + +#if defined(POLARSSL_SELF_TEST) + +/* + * RFC 1319 test vectors + */ +static const char md2_test_str[7][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012" \ + "345678901234567890" } +}; + +static const unsigned char md2_test_sum[7][16] = +{ + { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D, + 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 }, + { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72, + 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 }, + { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B, + 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB }, + { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B, + 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 }, + { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB, + 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B }, + { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39, + 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD }, + { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D, + 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 } +}; + +/* + * Checkup routine + */ +int md2_self_test( int verbose ) +{ + int i; + unsigned char md2sum[16]; + + for( i = 0; i < 7; i++ ) + { + if( verbose != 0 ) + printf( " MD2 test #%d: ", i + 1 ); + + md2( (unsigned char *) md2_test_str[i], + strlen( md2_test_str[i] ), md2sum ); + + if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/md4.c b/Externals/polarssl/library/md4.c new file mode 100644 index 0000000000..980f5e462d --- /dev/null +++ b/Externals/polarssl/library/md4.c @@ -0,0 +1,464 @@ +/* + * RFC 1186/1320 compliant MD4 implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The MD4 algorithm was designed by Ron Rivest in 1990. + * + * http://www.ietf.org/rfc/rfc1186.txt + * http://www.ietf.org/rfc/rfc1320.txt + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_MD4_C) + +#include "polarssl/md4.h" + +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if !defined(POLARSSL_MD4_ALT) + +/* + * 32-bit integer manipulation macros (little endian) + */ +#ifndef GET_UINT32_LE +#define GET_UINT32_LE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] ) \ + | ( (uint32_t) (b)[(i) + 1] << 8 ) \ + | ( (uint32_t) (b)[(i) + 2] << 16 ) \ + | ( (uint32_t) (b)[(i) + 3] << 24 ); \ +} +#endif + +#ifndef PUT_UINT32_LE +#define PUT_UINT32_LE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ +} +#endif + +/* + * MD4 context setup + */ +void md4_starts( md4_context *ctx ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; +} + +static void md4_process( md4_context *ctx, const unsigned char data[64] ) +{ + uint32_t X[16], A, B, C, D; + + GET_UINT32_LE( X[ 0], data, 0 ); + GET_UINT32_LE( X[ 1], data, 4 ); + GET_UINT32_LE( X[ 2], data, 8 ); + GET_UINT32_LE( X[ 3], data, 12 ); + GET_UINT32_LE( X[ 4], data, 16 ); + GET_UINT32_LE( X[ 5], data, 20 ); + GET_UINT32_LE( X[ 6], data, 24 ); + GET_UINT32_LE( X[ 7], data, 28 ); + GET_UINT32_LE( X[ 8], data, 32 ); + GET_UINT32_LE( X[ 9], data, 36 ); + GET_UINT32_LE( X[10], data, 40 ); + GET_UINT32_LE( X[11], data, 44 ); + GET_UINT32_LE( X[12], data, 48 ); + GET_UINT32_LE( X[13], data, 52 ); + GET_UINT32_LE( X[14], data, 56 ); + GET_UINT32_LE( X[15], data, 60 ); + +#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + +#define F(x, y, z) ((x & y) | ((~x) & z)) +#define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); } + + P( A, B, C, D, X[ 0], 3 ); + P( D, A, B, C, X[ 1], 7 ); + P( C, D, A, B, X[ 2], 11 ); + P( B, C, D, A, X[ 3], 19 ); + P( A, B, C, D, X[ 4], 3 ); + P( D, A, B, C, X[ 5], 7 ); + P( C, D, A, B, X[ 6], 11 ); + P( B, C, D, A, X[ 7], 19 ); + P( A, B, C, D, X[ 8], 3 ); + P( D, A, B, C, X[ 9], 7 ); + P( C, D, A, B, X[10], 11 ); + P( B, C, D, A, X[11], 19 ); + P( A, B, C, D, X[12], 3 ); + P( D, A, B, C, X[13], 7 ); + P( C, D, A, B, X[14], 11 ); + P( B, C, D, A, X[15], 19 ); + +#undef P +#undef F + +#define F(x,y,z) ((x & y) | (x & z) | (y & z)) +#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); } + + P( A, B, C, D, X[ 0], 3 ); + P( D, A, B, C, X[ 4], 5 ); + P( C, D, A, B, X[ 8], 9 ); + P( B, C, D, A, X[12], 13 ); + P( A, B, C, D, X[ 1], 3 ); + P( D, A, B, C, X[ 5], 5 ); + P( C, D, A, B, X[ 9], 9 ); + P( B, C, D, A, X[13], 13 ); + P( A, B, C, D, X[ 2], 3 ); + P( D, A, B, C, X[ 6], 5 ); + P( C, D, A, B, X[10], 9 ); + P( B, C, D, A, X[14], 13 ); + P( A, B, C, D, X[ 3], 3 ); + P( D, A, B, C, X[ 7], 5 ); + P( C, D, A, B, X[11], 9 ); + P( B, C, D, A, X[15], 13 ); + +#undef P +#undef F + +#define F(x,y,z) (x ^ y ^ z) +#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); } + + P( A, B, C, D, X[ 0], 3 ); + P( D, A, B, C, X[ 8], 9 ); + P( C, D, A, B, X[ 4], 11 ); + P( B, C, D, A, X[12], 15 ); + P( A, B, C, D, X[ 2], 3 ); + P( D, A, B, C, X[10], 9 ); + P( C, D, A, B, X[ 6], 11 ); + P( B, C, D, A, X[14], 15 ); + P( A, B, C, D, X[ 1], 3 ); + P( D, A, B, C, X[ 9], 9 ); + P( C, D, A, B, X[ 5], 11 ); + P( B, C, D, A, X[13], 15 ); + P( A, B, C, D, X[ 3], 3 ); + P( D, A, B, C, X[11], 9 ); + P( C, D, A, B, X[ 7], 11 ); + P( B, C, D, A, X[15], 15 ); + +#undef F +#undef P + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; +} + +/* + * MD4 process buffer + */ +void md4_update( md4_context *ctx, const unsigned char *input, size_t ilen ) +{ + size_t fill; + uint32_t left; + + if( ilen <= 0 ) + return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if( ctx->total[0] < (uint32_t) ilen ) + ctx->total[1]++; + + if( left && ilen >= fill ) + { + memcpy( (void *) (ctx->buffer + left), + (void *) input, fill ); + md4_process( ctx, ctx->buffer ); + input += fill; + ilen -= fill; + left = 0; + } + + while( ilen >= 64 ) + { + md4_process( ctx, input ); + input += 64; + ilen -= 64; + } + + if( ilen > 0 ) + { + memcpy( (void *) (ctx->buffer + left), + (void *) input, ilen ); + } +} + +static const unsigned char md4_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * MD4 final digest + */ +void md4_finish( md4_context *ctx, unsigned char output[16] ) +{ + uint32_t last, padn; + uint32_t high, low; + unsigned char msglen[8]; + + high = ( ctx->total[0] >> 29 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT32_LE( low, msglen, 0 ); + PUT_UINT32_LE( high, msglen, 4 ); + + last = ctx->total[0] & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + md4_update( ctx, (unsigned char *) md4_padding, padn ); + md4_update( ctx, msglen, 8 ); + + PUT_UINT32_LE( ctx->state[0], output, 0 ); + PUT_UINT32_LE( ctx->state[1], output, 4 ); + PUT_UINT32_LE( ctx->state[2], output, 8 ); + PUT_UINT32_LE( ctx->state[3], output, 12 ); +} + +#endif /* !POLARSSL_MD4_ALT */ + +/* + * output = MD4( input buffer ) + */ +void md4( const unsigned char *input, size_t ilen, unsigned char output[16] ) +{ + md4_context ctx; + + md4_starts( &ctx ); + md4_update( &ctx, input, ilen ); + md4_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md4_context ) ); +} + +#if defined(POLARSSL_FS_IO) +/* + * output = MD4( file contents ) + */ +int md4_file( const char *path, unsigned char output[16] ) +{ + FILE *f; + size_t n; + md4_context ctx; + unsigned char buf[1024]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_MD4_FILE_IO_ERROR ); + + md4_starts( &ctx ); + + while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + md4_update( &ctx, buf, n ); + + md4_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md4_context ) ); + + if( ferror( f ) != 0 ) + { + fclose( f ); + return( POLARSSL_ERR_MD4_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * MD4 HMAC context setup + */ +void md4_hmac_starts( md4_context *ctx, const unsigned char *key, size_t keylen ) +{ + size_t i; + unsigned char sum[16]; + + if( keylen > 64 ) + { + md4( key, keylen, sum ); + keylen = 16; + key = sum; + } + + memset( ctx->ipad, 0x36, 64 ); + memset( ctx->opad, 0x5C, 64 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + md4_starts( ctx ); + md4_update( ctx, ctx->ipad, 64 ); + + memset( sum, 0, sizeof( sum ) ); +} + +/* + * MD4 HMAC process buffer + */ +void md4_hmac_update( md4_context *ctx, const unsigned char *input, size_t ilen ) +{ + md4_update( ctx, input, ilen ); +} + +/* + * MD4 HMAC final digest + */ +void md4_hmac_finish( md4_context *ctx, unsigned char output[16] ) +{ + unsigned char tmpbuf[16]; + + md4_finish( ctx, tmpbuf ); + md4_starts( ctx ); + md4_update( ctx, ctx->opad, 64 ); + md4_update( ctx, tmpbuf, 16 ); + md4_finish( ctx, output ); + + memset( tmpbuf, 0, sizeof( tmpbuf ) ); +} + +/* + * MD4 HMAC context reset + */ +void md4_hmac_reset( md4_context *ctx ) +{ + md4_starts( ctx ); + md4_update( ctx, ctx->ipad, 64 ); +} + +/* + * output = HMAC-MD4( hmac key, input buffer ) + */ +void md4_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[16] ) +{ + md4_context ctx; + + md4_hmac_starts( &ctx, key, keylen ); + md4_hmac_update( &ctx, input, ilen ); + md4_hmac_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( md4_context ) ); +} + +#if defined(POLARSSL_SELF_TEST) + +/* + * RFC 1320 test vectors + */ +static const char md4_test_str[7][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012" \ + "345678901234567890" } +}; + +static const unsigned char md4_test_sum[7][16] = +{ + { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, + 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }, + { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46, + 0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 }, + { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52, + 0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D }, + { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8, + 0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B }, + { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD, + 0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 }, + { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35, + 0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 }, + { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19, + 0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 } +}; + +/* + * Checkup routine + */ +int md4_self_test( int verbose ) +{ + int i; + unsigned char md4sum[16]; + + for( i = 0; i < 7; i++ ) + { + if( verbose != 0 ) + printf( " MD4 test #%d: ", i + 1 ); + + md4( (unsigned char *) md4_test_str[i], + strlen( md4_test_str[i] ), md4sum ); + + if( memcmp( md4sum, md4_test_sum[i], 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Source/Core/Common/Src/Crypto/md5.cpp b/Externals/polarssl/library/md5.c similarity index 81% rename from Source/Core/Common/Src/Crypto/md5.cpp rename to Externals/polarssl/library/md5.c index 7b8dc149f4..b28461e9b2 100644 --- a/Source/Core/Common/Src/Crypto/md5.cpp +++ b/Externals/polarssl/library/md5.c @@ -1,10 +1,12 @@ /* * RFC 1321 compliant MD5 implementation * - * Copyright (C) 2006-2009, Paul Bakker - * All rights reserved. + * Copyright (C) 2006-2013, Brainspark B.V. * - * Joined copyright on original XySSL code with: Christophe Devine + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,34 +28,33 @@ * http://www.ietf.org/rfc/rfc1321.txt */ -//#include "polarssl/config.h" +#include "polarssl/config.h" #if defined(POLARSSL_MD5_C) #include "polarssl/md5.h" -#else -#include "md5.h" -#include +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) #include +#endif -#include "../FileUtil.h" +#if !defined(POLARSSL_MD5_ALT) /* * 32-bit integer manipulation macros (little endian) */ -#ifndef GET_ULONG_LE -#define GET_ULONG_LE(n,b,i) \ +#ifndef GET_UINT32_LE +#define GET_UINT32_LE(n,b,i) \ { \ - (n) = ( (unsigned long) (b)[(i) ] ) \ - | ( (unsigned long) (b)[(i) + 1] << 8 ) \ - | ( (unsigned long) (b)[(i) + 2] << 16 ) \ - | ( (unsigned long) (b)[(i) + 3] << 24 ); \ + (n) = ( (uint32_t) (b)[(i) ] ) \ + | ( (uint32_t) (b)[(i) + 1] << 8 ) \ + | ( (uint32_t) (b)[(i) + 2] << 16 ) \ + | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif -#ifndef PUT_ULONG_LE -#define PUT_ULONG_LE(n,b,i) \ +#ifndef PUT_UINT32_LE +#define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ @@ -76,26 +77,26 @@ void md5_starts( md5_context *ctx ) ctx->state[3] = 0x10325476; } -static void md5_process( md5_context *ctx, unsigned char data[64] ) +void md5_process( md5_context *ctx, const unsigned char data[64] ) { - unsigned long X[16], A, B, C, D; + uint32_t X[16], A, B, C, D; - GET_ULONG_LE( X[ 0], data, 0 ); - GET_ULONG_LE( X[ 1], data, 4 ); - GET_ULONG_LE( X[ 2], data, 8 ); - GET_ULONG_LE( X[ 3], data, 12 ); - GET_ULONG_LE( X[ 4], data, 16 ); - GET_ULONG_LE( X[ 5], data, 20 ); - GET_ULONG_LE( X[ 6], data, 24 ); - GET_ULONG_LE( X[ 7], data, 28 ); - GET_ULONG_LE( X[ 8], data, 32 ); - GET_ULONG_LE( X[ 9], data, 36 ); - GET_ULONG_LE( X[10], data, 40 ); - GET_ULONG_LE( X[11], data, 44 ); - GET_ULONG_LE( X[12], data, 48 ); - GET_ULONG_LE( X[13], data, 52 ); - GET_ULONG_LE( X[14], data, 56 ); - GET_ULONG_LE( X[15], data, 60 ); + GET_UINT32_LE( X[ 0], data, 0 ); + GET_UINT32_LE( X[ 1], data, 4 ); + GET_UINT32_LE( X[ 2], data, 8 ); + GET_UINT32_LE( X[ 3], data, 12 ); + GET_UINT32_LE( X[ 4], data, 16 ); + GET_UINT32_LE( X[ 5], data, 20 ); + GET_UINT32_LE( X[ 6], data, 24 ); + GET_UINT32_LE( X[ 7], data, 28 ); + GET_UINT32_LE( X[ 8], data, 32 ); + GET_UINT32_LE( X[ 9], data, 36 ); + GET_UINT32_LE( X[10], data, 40 ); + GET_UINT32_LE( X[11], data, 44 ); + GET_UINT32_LE( X[12], data, 48 ); + GET_UINT32_LE( X[13], data, 52 ); + GET_UINT32_LE( X[14], data, 56 ); + GET_UINT32_LE( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) @@ -202,10 +203,10 @@ static void md5_process( md5_context *ctx, unsigned char data[64] ) /* * MD5 process buffer */ -void md5_update( md5_context *ctx, unsigned char *input, int ilen ) +void md5_update( md5_context *ctx, const unsigned char *input, size_t ilen ) { - int fill; - unsigned long left; + size_t fill; + uint32_t left; if( ilen <= 0 ) return; @@ -213,16 +214,15 @@ void md5_update( md5_context *ctx, unsigned char *input, int ilen ) left = ctx->total[0] & 0x3F; fill = 64 - left; - ctx->total[0] += ilen; + ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; - if( ctx->total[0] < (unsigned long) ilen ) + if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { - memcpy( (void *) (ctx->buffer + left), - (void *) input, fill ); + memcpy( (void *) (ctx->buffer + left), input, fill ); md5_process( ctx, ctx->buffer ); input += fill; ilen -= fill; @@ -238,8 +238,7 @@ void md5_update( md5_context *ctx, unsigned char *input, int ilen ) if( ilen > 0 ) { - memcpy( (void *) (ctx->buffer + left), - (void *) input, ilen ); + memcpy( (void *) (ctx->buffer + left), input, ilen ); } } @@ -256,33 +255,35 @@ static const unsigned char md5_padding[64] = */ void md5_finish( md5_context *ctx, unsigned char output[16] ) { - unsigned long last, padn; - unsigned long high, low; + uint32_t last, padn; + uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); - PUT_ULONG_LE( low, msglen, 0 ); - PUT_ULONG_LE( high, msglen, 4 ); + PUT_UINT32_LE( low, msglen, 0 ); + PUT_UINT32_LE( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); - md5_update( ctx, (unsigned char *) md5_padding, padn ); + md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 ); - PUT_ULONG_LE( ctx->state[0], output, 0 ); - PUT_ULONG_LE( ctx->state[1], output, 4 ); - PUT_ULONG_LE( ctx->state[2], output, 8 ); - PUT_ULONG_LE( ctx->state[3], output, 12 ); + PUT_UINT32_LE( ctx->state[0], output, 0 ); + PUT_UINT32_LE( ctx->state[1], output, 4 ); + PUT_UINT32_LE( ctx->state[2], output, 8 ); + PUT_UINT32_LE( ctx->state[3], output, 12 ); } +#endif /* !POLARSSL_MD5_ALT */ + /* * output = MD5( input buffer ) */ -void md5( unsigned char *input, int ilen, unsigned char output[16] ) +void md5( const unsigned char *input, size_t ilen, unsigned char output[16] ) { md5_context ctx; @@ -293,26 +294,24 @@ void md5( unsigned char *input, int ilen, unsigned char output[16] ) memset( &ctx, 0, sizeof( md5_context ) ); } +#if defined(POLARSSL_FS_IO) /* * output = MD5( file contents ) */ -int md5_file( char *path, unsigned char output[16] ) +int md5_file( const char *path, unsigned char output[16] ) { FILE *f; size_t n; md5_context ctx; unsigned char buf[1024]; - File::IOFile file(path, "rb"); - f = file.GetHandle(); - - if (f == NULL) - return( 1 ); + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_MD5_FILE_IO_ERROR ); md5_starts( &ctx ); while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) - md5_update( &ctx, buf, (int) n ); + md5_update( &ctx, buf, n ); md5_finish( &ctx, output ); @@ -320,18 +319,21 @@ int md5_file( char *path, unsigned char output[16] ) if( ferror( f ) != 0 ) { - return( 2 ); + fclose( f ); + return( POLARSSL_ERR_MD5_FILE_IO_ERROR ); } + fclose( f ); return( 0 ); } +#endif /* POLARSSL_FS_IO */ /* * MD5 HMAC context setup */ -void md5_hmac_starts( md5_context *ctx, unsigned char *key, int keylen ) +void md5_hmac_starts( md5_context *ctx, const unsigned char *key, size_t keylen ) { - int i; + size_t i; unsigned char sum[16]; if( keylen > 64 ) @@ -359,7 +361,7 @@ void md5_hmac_starts( md5_context *ctx, unsigned char *key, int keylen ) /* * MD5 HMAC process buffer */ -void md5_hmac_update( md5_context *ctx, unsigned char *input, int ilen ) +void md5_hmac_update( md5_context *ctx, const unsigned char *input, size_t ilen ) { md5_update( ctx, input, ilen ); } @@ -380,10 +382,20 @@ void md5_hmac_finish( md5_context *ctx, unsigned char output[16] ) memset( tmpbuf, 0, sizeof( tmpbuf ) ); } +/* + * MD5 HMAC context reset + */ +void md5_hmac_reset( md5_context *ctx ) +{ + md5_starts( ctx ); + md5_update( ctx, ctx->ipad, 64 ); +} + /* * output = HMAC-MD5( hmac key, input buffer ) */ -void md5_hmac( unsigned char *key, int keylen, unsigned char *input, int ilen, +void md5_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, unsigned char output[16] ) { md5_context ctx; diff --git a/Externals/polarssl/library/md_wrap.c b/Externals/polarssl/library/md_wrap.c new file mode 100644 index 0000000000..f276db5925 --- /dev/null +++ b/Externals/polarssl/library/md_wrap.c @@ -0,0 +1,733 @@ +/** + * \file md_wrap.c + + * \brief Generic message digest wrapper for PolarSSL + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_MD_C) + +#include "polarssl/md_wrap.h" + +#if defined(POLARSSL_MD2_C) +#include "polarssl/md2.h" +#endif + +#if defined(POLARSSL_MD4_C) +#include "polarssl/md4.h" +#endif + +#if defined(POLARSSL_MD5_C) +#include "polarssl/md5.h" +#endif + +#if defined(POLARSSL_SHA1_C) +#include "polarssl/sha1.h" +#endif + +#if defined(POLARSSL_SHA2_C) +#include "polarssl/sha2.h" +#endif + +#if defined(POLARSSL_SHA4_C) +#include "polarssl/sha4.h" +#endif + +#include + +#if defined(POLARSSL_MD2_C) + +static void md2_starts_wrap( void *ctx ) +{ + md2_starts( (md2_context *) ctx ); +} + +static void md2_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md2_update( (md2_context *) ctx, input, ilen ); +} + +static void md2_finish_wrap( void *ctx, unsigned char *output ) +{ + md2_finish( (md2_context *) ctx, output ); +} + +int md2_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return md2_file( path, output ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +static void md2_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + md2_hmac_starts( (md2_context *) ctx, key, keylen ); +} + +static void md2_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md2_hmac_update( (md2_context *) ctx, input, ilen ); +} + +static void md2_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + md2_hmac_finish( (md2_context *) ctx, output ); +} + +static void md2_hmac_reset_wrap( void *ctx ) +{ + md2_hmac_reset( (md2_context *) ctx ); +} + +static void * md2_ctx_alloc( void ) +{ + return malloc( sizeof( md2_context ) ); +} + +static void md2_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t md2_info = { + POLARSSL_MD_MD2, + "MD2", + 16, + md2_starts_wrap, + md2_update_wrap, + md2_finish_wrap, + md2, + md2_file_wrap, + md2_hmac_starts_wrap, + md2_hmac_update_wrap, + md2_hmac_finish_wrap, + md2_hmac_reset_wrap, + md2_hmac, + md2_ctx_alloc, + md2_ctx_free, +}; + +#endif + +#if defined(POLARSSL_MD4_C) + +void md4_starts_wrap( void *ctx ) +{ + md4_starts( (md4_context *) ctx ); +} + +void md4_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md4_update( (md4_context *) ctx, input, ilen ); +} + +void md4_finish_wrap( void *ctx, unsigned char *output ) +{ + md4_finish( (md4_context *) ctx, output ); +} + +int md4_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return md4_file( path, output ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void md4_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + md4_hmac_starts( (md4_context *) ctx, key, keylen ); +} + +void md4_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md4_hmac_update( (md4_context *) ctx, input, ilen ); +} + +void md4_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + md4_hmac_finish( (md4_context *) ctx, output ); +} + +void md4_hmac_reset_wrap( void *ctx ) +{ + md4_hmac_reset( (md4_context *) ctx ); +} + +void *md4_ctx_alloc( void ) +{ + return malloc( sizeof( md4_context ) ); +} + +void md4_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t md4_info = { + POLARSSL_MD_MD4, + "MD4", + 16, + md4_starts_wrap, + md4_update_wrap, + md4_finish_wrap, + md4, + md4_file_wrap, + md4_hmac_starts_wrap, + md4_hmac_update_wrap, + md4_hmac_finish_wrap, + md4_hmac_reset_wrap, + md4_hmac, + md4_ctx_alloc, + md4_ctx_free, +}; + +#endif + +#if defined(POLARSSL_MD5_C) + +static void md5_starts_wrap( void *ctx ) +{ + md5_starts( (md5_context *) ctx ); +} + +static void md5_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md5_update( (md5_context *) ctx, input, ilen ); +} + +static void md5_finish_wrap( void *ctx, unsigned char *output ) +{ + md5_finish( (md5_context *) ctx, output ); +} + +int md5_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return md5_file( path, output ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +static void md5_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + md5_hmac_starts( (md5_context *) ctx, key, keylen ); +} + +static void md5_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + md5_hmac_update( (md5_context *) ctx, input, ilen ); +} + +static void md5_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + md5_hmac_finish( (md5_context *) ctx, output ); +} + +static void md5_hmac_reset_wrap( void *ctx ) +{ + md5_hmac_reset( (md5_context *) ctx ); +} + +static void * md5_ctx_alloc( void ) +{ + return malloc( sizeof( md5_context ) ); +} + +static void md5_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t md5_info = { + POLARSSL_MD_MD5, + "MD5", + 16, + md5_starts_wrap, + md5_update_wrap, + md5_finish_wrap, + md5, + md5_file_wrap, + md5_hmac_starts_wrap, + md5_hmac_update_wrap, + md5_hmac_finish_wrap, + md5_hmac_reset_wrap, + md5_hmac, + md5_ctx_alloc, + md5_ctx_free, +}; + +#endif + +#if defined(POLARSSL_SHA1_C) + +void sha1_starts_wrap( void *ctx ) +{ + sha1_starts( (sha1_context *) ctx ); +} + +void sha1_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha1_update( (sha1_context *) ctx, input, ilen ); +} + +void sha1_finish_wrap( void *ctx, unsigned char *output ) +{ + sha1_finish( (sha1_context *) ctx, output ); +} + +int sha1_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return sha1_file( path, output ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void sha1_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + sha1_hmac_starts( (sha1_context *) ctx, key, keylen ); +} + +void sha1_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha1_hmac_update( (sha1_context *) ctx, input, ilen ); +} + +void sha1_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + sha1_hmac_finish( (sha1_context *) ctx, output ); +} + +void sha1_hmac_reset_wrap( void *ctx ) +{ + sha1_hmac_reset( (sha1_context *) ctx ); +} + +void * sha1_ctx_alloc( void ) +{ + return malloc( sizeof( sha1_context ) ); +} + +void sha1_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t sha1_info = { + POLARSSL_MD_SHA1, + "SHA1", + 20, + sha1_starts_wrap, + sha1_update_wrap, + sha1_finish_wrap, + sha1, + sha1_file_wrap, + sha1_hmac_starts_wrap, + sha1_hmac_update_wrap, + sha1_hmac_finish_wrap, + sha1_hmac_reset_wrap, + sha1_hmac, + sha1_ctx_alloc, + sha1_ctx_free, +}; + +#endif + +/* + * Wrappers for generic message digests + */ +#if defined(POLARSSL_SHA2_C) + +void sha224_starts_wrap( void *ctx ) +{ + sha2_starts( (sha2_context *) ctx, 1 ); +} + +void sha224_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha2_update( (sha2_context *) ctx, input, ilen ); +} + +void sha224_finish_wrap( void *ctx, unsigned char *output ) +{ + sha2_finish( (sha2_context *) ctx, output ); +} + +void sha224_wrap( const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha2( input, ilen, output, 1 ); +} + +int sha224_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return sha2_file( path, output, 1 ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void sha224_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + sha2_hmac_starts( (sha2_context *) ctx, key, keylen, 1 ); +} + +void sha224_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha2_hmac_update( (sha2_context *) ctx, input, ilen ); +} + +void sha224_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + sha2_hmac_finish( (sha2_context *) ctx, output ); +} + +void sha224_hmac_reset_wrap( void *ctx ) +{ + sha2_hmac_reset( (sha2_context *) ctx ); +} + +void sha224_hmac_wrap( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha2_hmac( key, keylen, input, ilen, output, 1 ); +} + +void * sha224_ctx_alloc( void ) +{ + return malloc( sizeof( sha2_context ) ); +} + +void sha224_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t sha224_info = { + POLARSSL_MD_SHA224, + "SHA224", + 28, + sha224_starts_wrap, + sha224_update_wrap, + sha224_finish_wrap, + sha224_wrap, + sha224_file_wrap, + sha224_hmac_starts_wrap, + sha224_hmac_update_wrap, + sha224_hmac_finish_wrap, + sha224_hmac_reset_wrap, + sha224_hmac_wrap, + sha224_ctx_alloc, + sha224_ctx_free, +}; + +void sha256_starts_wrap( void *ctx ) +{ + sha2_starts( (sha2_context *) ctx, 0 ); +} + +void sha256_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha2_update( (sha2_context *) ctx, input, ilen ); +} + +void sha256_finish_wrap( void *ctx, unsigned char *output ) +{ + sha2_finish( (sha2_context *) ctx, output ); +} + +void sha256_wrap( const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha2( input, ilen, output, 0 ); +} + +int sha256_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return sha2_file( path, output, 0 ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void sha256_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + sha2_hmac_starts( (sha2_context *) ctx, key, keylen, 0 ); +} + +void sha256_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha2_hmac_update( (sha2_context *) ctx, input, ilen ); +} + +void sha256_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + sha2_hmac_finish( (sha2_context *) ctx, output ); +} + +void sha256_hmac_reset_wrap( void *ctx ) +{ + sha2_hmac_reset( (sha2_context *) ctx ); +} + +void sha256_hmac_wrap( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha2_hmac( key, keylen, input, ilen, output, 0 ); +} + +void * sha256_ctx_alloc( void ) +{ + return malloc( sizeof( sha2_context ) ); +} + +void sha256_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t sha256_info = { + POLARSSL_MD_SHA256, + "SHA256", + 32, + sha256_starts_wrap, + sha256_update_wrap, + sha256_finish_wrap, + sha256_wrap, + sha256_file_wrap, + sha256_hmac_starts_wrap, + sha256_hmac_update_wrap, + sha256_hmac_finish_wrap, + sha256_hmac_reset_wrap, + sha256_hmac_wrap, + sha256_ctx_alloc, + sha256_ctx_free, +}; + +#endif + +#if defined(POLARSSL_SHA4_C) + +void sha384_starts_wrap( void *ctx ) +{ + sha4_starts( (sha4_context *) ctx, 1 ); +} + +void sha384_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha4_update( (sha4_context *) ctx, input, ilen ); +} + +void sha384_finish_wrap( void *ctx, unsigned char *output ) +{ + sha4_finish( (sha4_context *) ctx, output ); +} + +void sha384_wrap( const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha4( input, ilen, output, 1 ); +} + +int sha384_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return sha4_file( path, output, 1 ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void sha384_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + sha4_hmac_starts( (sha4_context *) ctx, key, keylen, 1 ); +} + +void sha384_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha4_hmac_update( (sha4_context *) ctx, input, ilen ); +} + +void sha384_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + sha4_hmac_finish( (sha4_context *) ctx, output ); +} + +void sha384_hmac_reset_wrap( void *ctx ) +{ + sha4_hmac_reset( (sha4_context *) ctx ); +} + +void sha384_hmac_wrap( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha4_hmac( key, keylen, input, ilen, output, 1 ); +} + +void * sha384_ctx_alloc( void ) +{ + return malloc( sizeof( sha4_context ) ); +} + +void sha384_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t sha384_info = { + POLARSSL_MD_SHA384, + "SHA384", + 48, + sha384_starts_wrap, + sha384_update_wrap, + sha384_finish_wrap, + sha384_wrap, + sha384_file_wrap, + sha384_hmac_starts_wrap, + sha384_hmac_update_wrap, + sha384_hmac_finish_wrap, + sha384_hmac_reset_wrap, + sha384_hmac_wrap, + sha384_ctx_alloc, + sha384_ctx_free, +}; + +void sha512_starts_wrap( void *ctx ) +{ + sha4_starts( (sha4_context *) ctx, 0 ); +} + +void sha512_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha4_update( (sha4_context *) ctx, input, ilen ); +} + +void sha512_finish_wrap( void *ctx, unsigned char *output ) +{ + sha4_finish( (sha4_context *) ctx, output ); +} + +void sha512_wrap( const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha4( input, ilen, output, 0 ); +} + +int sha512_file_wrap( const char *path, unsigned char *output ) +{ +#if defined(POLARSSL_FS_IO) + return sha4_file( path, output, 0 ); +#else + ((void) path); + ((void) output); + return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE; +#endif +} + +void sha512_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen ) +{ + sha4_hmac_starts( (sha4_context *) ctx, key, keylen, 0 ); +} + +void sha512_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) +{ + sha4_hmac_update( (sha4_context *) ctx, input, ilen ); +} + +void sha512_hmac_finish_wrap( void *ctx, unsigned char *output ) +{ + sha4_hmac_finish( (sha4_context *) ctx, output ); +} + +void sha512_hmac_reset_wrap( void *ctx ) +{ + sha4_hmac_reset( (sha4_context *) ctx ); +} + +void sha512_hmac_wrap( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output ) +{ + sha4_hmac( key, keylen, input, ilen, output, 0 ); +} + +void * sha512_ctx_alloc( void ) +{ + return malloc( sizeof( sha4_context ) ); +} + +void sha512_ctx_free( void *ctx ) +{ + free( ctx ); +} + +const md_info_t sha512_info = { + POLARSSL_MD_SHA512, + "SHA512", + 64, + sha512_starts_wrap, + sha512_update_wrap, + sha512_finish_wrap, + sha512_wrap, + sha512_file_wrap, + sha512_hmac_starts_wrap, + sha512_hmac_update_wrap, + sha512_hmac_finish_wrap, + sha512_hmac_reset_wrap, + sha512_hmac_wrap, + sha512_ctx_alloc, + sha512_ctx_free, +}; + +#endif + +#endif diff --git a/Externals/polarssl/library/net.c b/Externals/polarssl/library/net.c new file mode 100644 index 0000000000..7a1818df0e --- /dev/null +++ b/Externals/polarssl/library/net.c @@ -0,0 +1,374 @@ +/* + * TCP networking functions + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_NET_C) + +#include "polarssl/net.h" + +#if defined(_WIN32) || defined(_WIN32_WCE) + +#include +#include + +#if defined(_WIN32_WCE) +#pragma comment( lib, "ws2.lib" ) +#else +#pragma comment( lib, "ws2_32.lib" ) +#endif + +#define read(fd,buf,len) recv(fd,(char*)buf,(int) len,0) +#define write(fd,buf,len) send(fd,(char*)buf,(int) len,0) +#define close(fd) closesocket(fd) + +static int wsa_init_done = 0; + +#else + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ + defined(__DragonflyBSD__) +#include +#elif defined(__APPLE__) +#include +#elif defined(sun) +#include +#else +#include +#endif + +#endif + +#include +#include +#include + +#ifdef _MSC_VER +#include +typedef UINT32 uint32_t; +#else +#include +#endif + +/* + * htons() is not always available. + * By default go for LITTLE_ENDIAN variant. Otherwise hope for _BYTE_ORDER and __BIG_ENDIAN + * to help determine endianess. + */ +#if defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN +#define POLARSSL_HTONS(n) (n) +#define POLARSSL_HTONL(n) (n) +#else +#define POLARSSL_HTONS(n) ((((unsigned short)(n) & 0xFF ) << 8 ) | \ + (((unsigned short)(n) & 0xFF00 ) >> 8 )) +#define POLARSSL_HTONL(n) ((((unsigned long )(n) & 0xFF ) << 24) | \ + (((unsigned long )(n) & 0xFF00 ) << 8 ) | \ + (((unsigned long )(n) & 0xFF0000 ) >> 8 ) | \ + (((unsigned long )(n) & 0xFF000000) >> 24)) +#endif + +unsigned short net_htons(unsigned short n); +unsigned long net_htonl(unsigned long n); +#define net_htons(n) POLARSSL_HTONS(n) +#define net_htonl(n) POLARSSL_HTONL(n) + +/* + * Initiate a TCP connection with host:port + */ +int net_connect( int *fd, const char *host, int port ) +{ + struct sockaddr_in server_addr; + struct hostent *server_host; + +#if defined(_WIN32) || defined(_WIN32_WCE) + WSADATA wsaData; + + if( wsa_init_done == 0 ) + { + if( WSAStartup( MAKEWORD(2,0), &wsaData ) == SOCKET_ERROR ) + return( POLARSSL_ERR_NET_SOCKET_FAILED ); + + wsa_init_done = 1; + } +#else + signal( SIGPIPE, SIG_IGN ); +#endif + + if( ( server_host = gethostbyname( host ) ) == NULL ) + return( POLARSSL_ERR_NET_UNKNOWN_HOST ); + + if( ( *fd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP ) ) < 0 ) + return( POLARSSL_ERR_NET_SOCKET_FAILED ); + + memcpy( (void *) &server_addr.sin_addr, + (void *) server_host->h_addr, + server_host->h_length ); + + server_addr.sin_family = AF_INET; + server_addr.sin_port = net_htons( port ); + + if( connect( *fd, (struct sockaddr *) &server_addr, + sizeof( server_addr ) ) < 0 ) + { + close( *fd ); + return( POLARSSL_ERR_NET_CONNECT_FAILED ); + } + + return( 0 ); +} + +/* + * Create a listening socket on bind_ip:port + */ +int net_bind( int *fd, const char *bind_ip, int port ) +{ + int n, c[4]; + struct sockaddr_in server_addr; + +#if defined(_WIN32) || defined(_WIN32_WCE) + WSADATA wsaData; + + if( wsa_init_done == 0 ) + { + if( WSAStartup( MAKEWORD(2,0), &wsaData ) == SOCKET_ERROR ) + return( POLARSSL_ERR_NET_SOCKET_FAILED ); + + wsa_init_done = 1; + } +#else + signal( SIGPIPE, SIG_IGN ); +#endif + + if( ( *fd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP ) ) < 0 ) + return( POLARSSL_ERR_NET_SOCKET_FAILED ); + + n = 1; + setsockopt( *fd, SOL_SOCKET, SO_REUSEADDR, + (const char *) &n, sizeof( n ) ); + + server_addr.sin_addr.s_addr = net_htonl( INADDR_ANY ); + server_addr.sin_family = AF_INET; + server_addr.sin_port = net_htons( port ); + + if( bind_ip != NULL ) + { + memset( c, 0, sizeof( c ) ); + sscanf( bind_ip, "%d.%d.%d.%d", &c[0], &c[1], &c[2], &c[3] ); + + for( n = 0; n < 4; n++ ) + if( c[n] < 0 || c[n] > 255 ) + break; + + if( n == 4 ) + server_addr.sin_addr.s_addr = net_htonl( + ( (uint32_t) c[0] << 24 ) | + ( (uint32_t) c[1] << 16 ) | + ( (uint32_t) c[2] << 8 ) | + ( (uint32_t) c[3] ) ); + } + + if( bind( *fd, (struct sockaddr *) &server_addr, + sizeof( server_addr ) ) < 0 ) + { + close( *fd ); + return( POLARSSL_ERR_NET_BIND_FAILED ); + } + + if( listen( *fd, POLARSSL_NET_LISTEN_BACKLOG ) != 0 ) + { + close( *fd ); + return( POLARSSL_ERR_NET_LISTEN_FAILED ); + } + + return( 0 ); +} + +/* + * Check if the current operation is blocking + */ +static int net_is_blocking( void ) +{ +#if defined(_WIN32) || defined(_WIN32_WCE) + return( WSAGetLastError() == WSAEWOULDBLOCK ); +#else + switch( errno ) + { +#if defined EAGAIN + case EAGAIN: +#endif +#if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + return( 1 ); + } + return( 0 ); +#endif +} + +/* + * Accept a connection from a remote client + */ +int net_accept( int bind_fd, int *client_fd, void *client_ip ) +{ + struct sockaddr_in client_addr; + +#if defined(__socklen_t_defined) || defined(_SOCKLEN_T) || \ + defined(_SOCKLEN_T_DECLARED) + socklen_t n = (socklen_t) sizeof( client_addr ); +#else + int n = (int) sizeof( client_addr ); +#endif + + *client_fd = accept( bind_fd, (struct sockaddr *) + &client_addr, &n ); + + if( *client_fd < 0 ) + { + if( net_is_blocking() != 0 ) + return( POLARSSL_ERR_NET_WANT_READ ); + + return( POLARSSL_ERR_NET_ACCEPT_FAILED ); + } + + if( client_ip != NULL ) + memcpy( client_ip, &client_addr.sin_addr.s_addr, + sizeof( client_addr.sin_addr.s_addr ) ); + + return( 0 ); +} + +/* + * Set the socket blocking or non-blocking + */ +int net_set_block( int fd ) +{ +#if defined(_WIN32) || defined(_WIN32_WCE) + u_long n = 0; + return( ioctlsocket( fd, FIONBIO, &n ) ); +#else + return( fcntl( fd, F_SETFL, fcntl( fd, F_GETFL ) & ~O_NONBLOCK ) ); +#endif +} + +int net_set_nonblock( int fd ) +{ +#if defined(_WIN32) || defined(_WIN32_WCE) + u_long n = 1; + return( ioctlsocket( fd, FIONBIO, &n ) ); +#else + return( fcntl( fd, F_SETFL, fcntl( fd, F_GETFL ) | O_NONBLOCK ) ); +#endif +} + +/* + * Portable usleep helper + */ +void net_usleep( unsigned long usec ) +{ + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = usec; + select( 0, NULL, NULL, NULL, &tv ); +} + +/* + * Read at most 'len' characters + */ +int net_recv( void *ctx, unsigned char *buf, size_t len ) +{ + int ret = read( *((int *) ctx), buf, len ); + + if( ret < 0 ) + { + if( net_is_blocking() != 0 ) + return( POLARSSL_ERR_NET_WANT_READ ); + +#if defined(_WIN32) || defined(_WIN32_WCE) + if( WSAGetLastError() == WSAECONNRESET ) + return( POLARSSL_ERR_NET_CONN_RESET ); +#else + if( errno == EPIPE || errno == ECONNRESET ) + return( POLARSSL_ERR_NET_CONN_RESET ); + + if( errno == EINTR ) + return( POLARSSL_ERR_NET_WANT_READ ); +#endif + + return( POLARSSL_ERR_NET_RECV_FAILED ); + } + + return( ret ); +} + +/* + * Write at most 'len' characters + */ +int net_send( void *ctx, const unsigned char *buf, size_t len ) +{ + int ret = write( *((int *) ctx), buf, len ); + + if( ret < 0 ) + { + if( net_is_blocking() != 0 ) + return( POLARSSL_ERR_NET_WANT_WRITE ); + +#if defined(_WIN32) || defined(_WIN32_WCE) + if( WSAGetLastError() == WSAECONNRESET ) + return( POLARSSL_ERR_NET_CONN_RESET ); +#else + if( errno == EPIPE || errno == ECONNRESET ) + return( POLARSSL_ERR_NET_CONN_RESET ); + + if( errno == EINTR ) + return( POLARSSL_ERR_NET_WANT_WRITE ); +#endif + + return( POLARSSL_ERR_NET_SEND_FAILED ); + } + + return( ret ); +} + +/* + * Gracefully close the connection + */ +void net_close( int fd ) +{ + shutdown( fd, 2 ); + close( fd ); +} + +#endif diff --git a/Externals/polarssl/library/padlock.c b/Externals/polarssl/library/padlock.c new file mode 100644 index 0000000000..a7b4c0c77b --- /dev/null +++ b/Externals/polarssl/library/padlock.c @@ -0,0 +1,162 @@ +/* + * VIA PadLock support functions + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * This implementation is based on the VIA PadLock Programming Guide: + * + * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ + * programming_guide.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_PADLOCK_C) + +#include "polarssl/padlock.h" + +#if defined(POLARSSL_HAVE_X86) + +/* + * PadLock detection routine + */ +int padlock_supports( int feature ) +{ + static int flags = -1; + int ebx, edx; + + if( flags == -1 ) + { + asm( "movl %%ebx, %0 \n" \ + "movl $0xC0000000, %%eax \n" \ + "cpuid \n" \ + "cmpl $0xC0000001, %%eax \n" \ + "movl $0, %%edx \n" \ + "jb unsupported \n" \ + "movl $0xC0000001, %%eax \n" \ + "cpuid \n" \ + "unsupported: \n" \ + "movl %%edx, %1 \n" \ + "movl %2, %%ebx \n" + : "=m" (ebx), "=m" (edx) + : "m" (ebx) + : "eax", "ecx", "edx" ); + + flags = edx; + } + + return( flags & feature ); +} + +/* + * PadLock AES-ECB block en(de)cryption + */ +int padlock_xcryptecb( aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16] ) +{ + int ebx; + uint32_t *rk; + uint32_t *blk; + uint32_t *ctrl; + unsigned char buf[256]; + + rk = ctx->rk; + blk = PADLOCK_ALIGN16( buf ); + memcpy( blk, input, 16 ); + + ctrl = blk + 4; + *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 ); + + asm( "pushfl; popfl \n" \ + "movl %%ebx, %0 \n" \ + "movl $1, %%ecx \n" \ + "movl %2, %%edx \n" \ + "movl %3, %%ebx \n" \ + "movl %4, %%esi \n" \ + "movl %4, %%edi \n" \ + ".byte 0xf3,0x0f,0xa7,0xc8\n" \ + "movl %1, %%ebx \n" + : "=m" (ebx) + : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) + : "ecx", "edx", "esi", "edi" ); + + memcpy( output, blk, 16 ); + + return( 0 ); +} + +/* + * PadLock AES-CBC buffer en(de)cryption + */ +int padlock_xcryptcbc( aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output ) +{ + int ebx; + size_t count; + uint32_t *rk; + uint32_t *iw; + uint32_t *ctrl; + unsigned char buf[256]; + + if( ( (long) input & 15 ) != 0 || + ( (long) output & 15 ) != 0 ) + return( POLARSSL_ERR_PADLOCK_DATA_MISALIGNED ); + + rk = ctx->rk; + iw = PADLOCK_ALIGN16( buf ); + memcpy( iw, iv, 16 ); + + ctrl = iw + 4; + *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + (mode^1) - 10 ) << 9 ); + + count = (length + 15) >> 4; + + asm( "pushfl; popfl \n" \ + "movl %%ebx, %0 \n" \ + "movl %2, %%ecx \n" \ + "movl %3, %%edx \n" \ + "movl %4, %%ebx \n" \ + "movl %5, %%esi \n" \ + "movl %6, %%edi \n" \ + "movl %7, %%eax \n" \ + ".byte 0xf3,0x0f,0xa7,0xd0\n" \ + "movl %1, %%ebx \n" + : "=m" (ebx) + : "m" (ebx), "m" (count), "m" (ctrl), + "m" (rk), "m" (input), "m" (output), "m" (iw) + : "eax", "ecx", "edx", "esi", "edi" ); + + memcpy( iv, iw, 16 ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/pbkdf2.c b/Externals/polarssl/library/pbkdf2.c new file mode 100644 index 0000000000..09e56dfa3c --- /dev/null +++ b/Externals/polarssl/library/pbkdf2.c @@ -0,0 +1,60 @@ +/** + * \file pbkdf2.c + * + * \brief Password-Based Key Derivation Function 2 (from PKCS#5) + * DEPRECATED: Use pkcs5.c instead + * + * \author Mathias Olsson + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * PBKDF2 is part of PKCS#5 + * + * http://tools.ietf.org/html/rfc2898 (Specification) + * http://tools.ietf.org/html/rfc6070 (Test vectors) + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_PBKDF2_C) + +#include "polarssl/pbkdf2.h" +#include "polarssl/pkcs5.h" + +int pbkdf2_hmac( md_context_t *ctx, const unsigned char *password, size_t plen, + const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output ) +{ + return pkcs5_pbkdf2_hmac( ctx, password, plen, salt, slen, iteration_count, + key_length, output ); +} + +#if defined(POLARSSL_SELF_TEST) +int pbkdf2_self_test( int verbose ) +{ + return pkcs5_self_test( verbose ); +} +#endif /* POLARSSL_SELF_TEST */ + +#endif /* POLARSSL_PBKDF2_C */ diff --git a/Externals/polarssl/library/pem.c b/Externals/polarssl/library/pem.c new file mode 100644 index 0000000000..e2e399801b --- /dev/null +++ b/Externals/polarssl/library/pem.c @@ -0,0 +1,355 @@ +/* + * Privacy Enhanced Mail (PEM) decoding + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_PEM_C) + +#include "polarssl/pem.h" +#include "polarssl/base64.h" +#include "polarssl/des.h" +#include "polarssl/aes.h" +#include "polarssl/md5.h" +#include "polarssl/cipher.h" + +#include + +void pem_init( pem_context *ctx ) +{ + memset( ctx, 0, sizeof( pem_context ) ); +} + +#if defined(POLARSSL_MD5_C) && (defined(POLARSSL_DES_C) || defined(POLARSSL_AES_C)) +/* + * Read a 16-byte hex string and convert it to binary + */ +static int pem_get_iv( const unsigned char *s, unsigned char *iv, size_t iv_len ) +{ + size_t i, j, k; + + memset( iv, 0, iv_len ); + + for( i = 0; i < iv_len * 2; i++, s++ ) + { + if( *s >= '0' && *s <= '9' ) j = *s - '0'; else + if( *s >= 'A' && *s <= 'F' ) j = *s - '7'; else + if( *s >= 'a' && *s <= 'f' ) j = *s - 'W'; else + return( POLARSSL_ERR_PEM_INVALID_ENC_IV ); + + k = ( ( i & 1 ) != 0 ) ? j : j << 4; + + iv[i >> 1] = (unsigned char)( iv[i >> 1] | k ); + } + + return( 0 ); +} + +static void pem_pbkdf1( unsigned char *key, size_t keylen, + unsigned char *iv, + const unsigned char *pwd, size_t pwdlen ) +{ + md5_context md5_ctx; + unsigned char md5sum[16]; + size_t use_len; + + /* + * key[ 0..15] = MD5(pwd || IV) + */ + md5_starts( &md5_ctx ); + md5_update( &md5_ctx, pwd, pwdlen ); + md5_update( &md5_ctx, iv, 8 ); + md5_finish( &md5_ctx, md5sum ); + + if( keylen <= 16 ) + { + memcpy( key, md5sum, keylen ); + + memset( &md5_ctx, 0, sizeof( md5_ctx ) ); + memset( md5sum, 0, 16 ); + return; + } + + memcpy( key, md5sum, 16 ); + + /* + * key[16..23] = MD5(key[ 0..15] || pwd || IV]) + */ + md5_starts( &md5_ctx ); + md5_update( &md5_ctx, md5sum, 16 ); + md5_update( &md5_ctx, pwd, pwdlen ); + md5_update( &md5_ctx, iv, 8 ); + md5_finish( &md5_ctx, md5sum ); + + use_len = 16; + if( keylen < 32 ) + use_len = keylen - 16; + + memcpy( key + 16, md5sum, use_len ); + + memset( &md5_ctx, 0, sizeof( md5_ctx ) ); + memset( md5sum, 0, 16 ); +} + +#if defined(POLARSSL_DES_C) +/* + * Decrypt with DES-CBC, using PBKDF1 for key derivation + */ +static void pem_des_decrypt( unsigned char des_iv[8], + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen ) +{ + des_context des_ctx; + unsigned char des_key[8]; + + pem_pbkdf1( des_key, 8, des_iv, pwd, pwdlen ); + + des_setkey_dec( &des_ctx, des_key ); + des_crypt_cbc( &des_ctx, DES_DECRYPT, buflen, + des_iv, buf, buf ); + + memset( &des_ctx, 0, sizeof( des_ctx ) ); + memset( des_key, 0, 8 ); +} + +/* + * Decrypt with 3DES-CBC, using PBKDF1 for key derivation + */ +static void pem_des3_decrypt( unsigned char des3_iv[8], + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen ) +{ + des3_context des3_ctx; + unsigned char des3_key[24]; + + pem_pbkdf1( des3_key, 24, des3_iv, pwd, pwdlen ); + + des3_set3key_dec( &des3_ctx, des3_key ); + des3_crypt_cbc( &des3_ctx, DES_DECRYPT, buflen, + des3_iv, buf, buf ); + + memset( &des3_ctx, 0, sizeof( des3_ctx ) ); + memset( des3_key, 0, 24 ); +} +#endif /* POLARSSL_DES_C */ + +#if defined(POLARSSL_AES_C) +/* + * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation + */ +static void pem_aes_decrypt( unsigned char aes_iv[16], unsigned int keylen, + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen ) +{ + aes_context aes_ctx; + unsigned char aes_key[32]; + + pem_pbkdf1( aes_key, keylen, aes_iv, pwd, pwdlen ); + + aes_setkey_dec( &aes_ctx, aes_key, keylen * 8 ); + aes_crypt_cbc( &aes_ctx, AES_DECRYPT, buflen, + aes_iv, buf, buf ); + + memset( &aes_ctx, 0, sizeof( aes_ctx ) ); + memset( aes_key, 0, keylen ); +} +#endif /* POLARSSL_AES_C */ + +#endif /* POLARSSL_MD5_C && (POLARSSL_AES_C || POLARSSL_DES_C) */ + +int pem_read_buffer( pem_context *ctx, char *header, char *footer, const unsigned char *data, const unsigned char *pwd, size_t pwdlen, size_t *use_len ) +{ + int ret, enc; + size_t len; + unsigned char *buf; + const unsigned char *s1, *s2, *end; +#if defined(POLARSSL_MD5_C) && (defined(POLARSSL_DES_C) || defined(POLARSSL_AES_C)) + unsigned char pem_iv[16]; + cipher_type_t enc_alg = POLARSSL_CIPHER_NONE; +#else + ((void) pwd); + ((void) pwdlen); +#endif /* POLARSSL_MD5_C && (POLARSSL_AES_C || POLARSSL_DES_C) */ + + if( ctx == NULL ) + return( POLARSSL_ERR_PEM_BAD_INPUT_DATA ); + + s1 = (unsigned char *) strstr( (const char *) data, header ); + + if( s1 == NULL ) + return( POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); + + s2 = (unsigned char *) strstr( (const char *) data, footer ); + + if( s2 == NULL || s2 <= s1 ) + return( POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); + + s1 += strlen( header ); + if( *s1 == '\r' ) s1++; + if( *s1 == '\n' ) s1++; + else return( POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); + + end = s2; + end += strlen( footer ); + if( *end == '\r' ) end++; + if( *end == '\n' ) end++; + *use_len = end - data; + + enc = 0; + + if( memcmp( s1, "Proc-Type: 4,ENCRYPTED", 22 ) == 0 ) + { +#if defined(POLARSSL_MD5_C) && (defined(POLARSSL_DES_C) || defined(POLARSSL_AES_C)) + enc++; + + s1 += 22; + if( *s1 == '\r' ) s1++; + if( *s1 == '\n' ) s1++; + else return( POLARSSL_ERR_PEM_INVALID_DATA ); + + +#if defined(POLARSSL_DES_C) + if( memcmp( s1, "DEK-Info: DES-EDE3-CBC,", 23 ) == 0 ) + { + enc_alg = POLARSSL_CIPHER_DES_EDE3_CBC; + + s1 += 23; + if( pem_get_iv( s1, pem_iv, 8 ) != 0 ) + return( POLARSSL_ERR_PEM_INVALID_ENC_IV ); + + s1 += 16; + } + else if( memcmp( s1, "DEK-Info: DES-CBC,", 18 ) == 0 ) + { + enc_alg = POLARSSL_CIPHER_DES_CBC; + + s1 += 18; + if( pem_get_iv( s1, pem_iv, 8) != 0 ) + return( POLARSSL_ERR_PEM_INVALID_ENC_IV ); + + s1 += 16; + } +#endif /* POLARSSL_DES_C */ + +#if defined(POLARSSL_AES_C) + if( memcmp( s1, "DEK-Info: AES-", 14 ) == 0 ) + { + if( memcmp( s1, "DEK-Info: AES-128-CBC,", 22 ) == 0 ) + enc_alg = POLARSSL_CIPHER_AES_128_CBC; + else if( memcmp( s1, "DEK-Info: AES-192-CBC,", 22 ) == 0 ) + enc_alg = POLARSSL_CIPHER_AES_192_CBC; + else if( memcmp( s1, "DEK-Info: AES-256-CBC,", 22 ) == 0 ) + enc_alg = POLARSSL_CIPHER_AES_256_CBC; + else + return( POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG ); + + s1 += 22; + if( pem_get_iv( s1, pem_iv, 16 ) != 0 ) + return( POLARSSL_ERR_PEM_INVALID_ENC_IV ); + + s1 += 32; + } +#endif /* POLARSSL_AES_C */ + + if( enc_alg == POLARSSL_CIPHER_NONE ) + return( POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG ); + + if( *s1 == '\r' ) s1++; + if( *s1 == '\n' ) s1++; + else return( POLARSSL_ERR_PEM_INVALID_DATA ); +#else + return( POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE ); +#endif /* POLARSSL_MD5_C && (POLARSSL_AES_C || POLARSSL_DES_C) */ + } + + len = 0; + ret = base64_decode( NULL, &len, s1, s2 - s1 ); + + if( ret == POLARSSL_ERR_BASE64_INVALID_CHARACTER ) + return( POLARSSL_ERR_PEM_INVALID_DATA + ret ); + + if( ( buf = (unsigned char *) malloc( len ) ) == NULL ) + return( POLARSSL_ERR_PEM_MALLOC_FAILED ); + + if( ( ret = base64_decode( buf, &len, s1, s2 - s1 ) ) != 0 ) + { + free( buf ); + return( POLARSSL_ERR_PEM_INVALID_DATA + ret ); + } + + if( enc != 0 ) + { +#if defined(POLARSSL_MD5_C) && (defined(POLARSSL_DES_C) || defined(POLARSSL_AES_C)) + if( pwd == NULL ) + { + free( buf ); + return( POLARSSL_ERR_PEM_PASSWORD_REQUIRED ); + } + +#if defined(POLARSSL_DES_C) + if( enc_alg == POLARSSL_CIPHER_DES_EDE3_CBC ) + pem_des3_decrypt( pem_iv, buf, len, pwd, pwdlen ); + else if( enc_alg == POLARSSL_CIPHER_DES_CBC ) + pem_des_decrypt( pem_iv, buf, len, pwd, pwdlen ); +#endif /* POLARSSL_DES_C */ + +#if defined(POLARSSL_AES_C) + if( enc_alg == POLARSSL_CIPHER_AES_128_CBC ) + pem_aes_decrypt( pem_iv, 16, buf, len, pwd, pwdlen ); + else if( enc_alg == POLARSSL_CIPHER_AES_192_CBC ) + pem_aes_decrypt( pem_iv, 24, buf, len, pwd, pwdlen ); + else if( enc_alg == POLARSSL_CIPHER_AES_256_CBC ) + pem_aes_decrypt( pem_iv, 32, buf, len, pwd, pwdlen ); +#endif /* POLARSSL_AES_C */ + + if( buf[0] != 0x30 || buf[1] != 0x82 || + buf[4] != 0x02 || buf[5] != 0x01 ) + { + free( buf ); + return( POLARSSL_ERR_PEM_PASSWORD_MISMATCH ); + } +#else + free( buf ); + return( POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE ); +#endif + } + + ctx->buf = buf; + ctx->buflen = len; + + return( 0 ); +} + +void pem_free( pem_context *ctx ) +{ + if( ctx->buf ) + free( ctx->buf ); + + if( ctx->info ) + free( ctx->info ); + + memset( ctx, 0, sizeof( pem_context ) ); +} + +#endif diff --git a/Externals/polarssl/library/pkcs11.c b/Externals/polarssl/library/pkcs11.c new file mode 100644 index 0000000000..b68d6881db --- /dev/null +++ b/Externals/polarssl/library/pkcs11.c @@ -0,0 +1,238 @@ +/** + * \file pkcs11.c + * + * \brief Wrapper for PKCS#11 library libpkcs11-helper + * + * \author Adriaan de Jong + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/pkcs11.h" + +#if defined(POLARSSL_PKCS11_C) + +#include + +int pkcs11_x509_cert_init( x509_cert *cert, pkcs11h_certificate_t pkcs11_cert ) +{ + int ret = 1; + unsigned char *cert_blob = NULL; + size_t cert_blob_size = 0; + + if( cert == NULL ) + { + ret = 2; + goto cleanup; + } + + if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, NULL, &cert_blob_size ) != CKR_OK ) + { + ret = 3; + goto cleanup; + } + + cert_blob = malloc( cert_blob_size ); + if( NULL == cert_blob ) + { + ret = 4; + goto cleanup; + } + + if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, cert_blob, &cert_blob_size ) != CKR_OK ) + { + ret = 5; + goto cleanup; + } + + if( 0 != x509parse_crt(cert, cert_blob, cert_blob_size ) ) + { + ret = 6; + goto cleanup; + } + + ret = 0; + +cleanup: + if( NULL != cert_blob ) + free( cert_blob ); + + return ret; +} + + +int pkcs11_priv_key_init( pkcs11_context *priv_key, + pkcs11h_certificate_t pkcs11_cert ) +{ + int ret = 1; + x509_cert cert; + + memset( &cert, 0, sizeof( cert ) ); + + if( priv_key == NULL ) + goto cleanup; + + if( 0 != pkcs11_x509_cert_init( &cert, pkcs11_cert ) ) + goto cleanup; + + priv_key->len = cert.rsa.len; + priv_key->pkcs11h_cert = pkcs11_cert; + + ret = 0; + +cleanup: + x509_free( &cert ); + + return ret; +} + +void pkcs11_priv_key_free( pkcs11_context *priv_key ) +{ + if( NULL != priv_key ) + pkcs11h_certificate_freeCertificate( priv_key->pkcs11h_cert ); +} + +int pkcs11_decrypt( pkcs11_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ) +{ + size_t input_len, output_len; + + if( NULL == ctx ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + if( RSA_PUBLIC == mode ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + output_len = input_len = ctx->len; + + if( input_len < 16 || input_len > output_max_len ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + /* Determine size of output buffer */ + if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, + input_len, NULL, &output_len ) != CKR_OK ) + { + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + if( output_len > output_max_len ) + return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE ); + + if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, + input_len, output, &output_len ) != CKR_OK ) + { + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + *olen = output_len; + return( 0 ); +} + +int pkcs11_sign( pkcs11_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + size_t olen, asn_len; + unsigned char *p = sig; + + if( NULL == ctx ) + return POLARSSL_ERR_RSA_BAD_INPUT_DATA; + + if( RSA_PUBLIC == mode ) + return POLARSSL_ERR_RSA_BAD_INPUT_DATA; + + olen = ctx->len; + + switch( hash_id ) + { + case SIG_RSA_RAW: + asn_len = 0; + memcpy( p, hash, hashlen ); + break; + + case SIG_RSA_MD2: + asn_len = OID_SIZE(ASN1_HASH_MDX); + memcpy( p, ASN1_HASH_MDX, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[13] = 2; break; + + case SIG_RSA_MD4: + asn_len = OID_SIZE(ASN1_HASH_MDX); + memcpy( p, ASN1_HASH_MDX, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[13] = 4; break; + + case SIG_RSA_MD5: + asn_len = OID_SIZE(ASN1_HASH_MDX); + memcpy( p, ASN1_HASH_MDX, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[13] = 5; break; + + case SIG_RSA_SHA1: + asn_len = OID_SIZE(ASN1_HASH_SHA1); + memcpy( p, ASN1_HASH_SHA1, asn_len ); + memcpy( p + 15, hash, hashlen ); + break; + + case SIG_RSA_SHA224: + asn_len = OID_SIZE(ASN1_HASH_SHA2X); + memcpy( p, ASN1_HASH_SHA2X, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[1] += hashlen; p[14] = 4; p[18] += hashlen; break; + + case SIG_RSA_SHA256: + asn_len = OID_SIZE(ASN1_HASH_SHA2X); + memcpy( p, ASN1_HASH_SHA2X, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[1] += hashlen; p[14] = 1; p[18] += hashlen; break; + + case SIG_RSA_SHA384: + asn_len = OID_SIZE(ASN1_HASH_SHA2X); + memcpy( p, ASN1_HASH_SHA2X, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[1] += hashlen; p[14] = 2; p[18] += hashlen; break; + + case SIG_RSA_SHA512: + asn_len = OID_SIZE(ASN1_HASH_SHA2X); + memcpy( p, ASN1_HASH_SHA2X, asn_len ); + memcpy( p + asn_len, hash, hashlen ); + p[1] += hashlen; p[14] = 3; p[18] += hashlen; break; + + default: + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + if( pkcs11h_certificate_signAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, sig, + asn_len + hashlen, sig, &olen ) != CKR_OK ) + { + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + return( 0 ); +} + +#endif /* defined(POLARSSL_PKCS11_C) */ diff --git a/Externals/polarssl/library/pkcs12.c b/Externals/polarssl/library/pkcs12.c new file mode 100644 index 0000000000..2c032edfae --- /dev/null +++ b/Externals/polarssl/library/pkcs12.c @@ -0,0 +1,330 @@ +/* + * PKCS#12 Personal Information Exchange Syntax + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The PKCS #12 Personal Information Exchange Syntax Standard v1.1 + * + * http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf + * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_PKCS12_C) + +#include "polarssl/pkcs12.h" +#include "polarssl/asn1.h" +#include "polarssl/cipher.h" + +#if defined(POLARSSL_ARC4_C) +#include "polarssl/arc4.h" +#endif + +#if defined(POLARSSL_DES_C) +#include "polarssl/des.h" +#endif + +static int pkcs12_parse_pbe_params( unsigned char **p, + const unsigned char *end, + asn1_buf *salt, int *iterations ) +{ + int ret; + size_t len = 0; + + /* + * pkcs-12PbeParams ::= SEQUENCE { + * salt OCTET STRING, + * iterations INTEGER + * } + * + */ + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); + } + + end = *p + len; + + if( ( ret = asn1_get_tag( p, end, &salt->len, ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); + + salt->p = *p; + *p += salt->len; + + if( ( ret = asn1_get_int( p, end, iterations ) ) != 0 ) + return( POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); + + if( *p != end ) + return( POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +static int pkcs12_pbe_derive_key_iv( asn1_buf *pbe_params, md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + unsigned char *key, size_t keylen, + unsigned char *iv, size_t ivlen ) +{ + int ret, iterations; + asn1_buf salt; + size_t i; + unsigned char *p, *end; + unsigned char unipwd[258]; + + memset(&salt, 0, sizeof(asn1_buf)); + memset(&unipwd, 0, sizeof(unipwd)); + + p = pbe_params->p; + end = p + pbe_params->len; + + if( ( ret = pkcs12_parse_pbe_params( &p, end, &salt, &iterations ) ) != 0 ) + return( ret ); + + for(i = 0; i < pwdlen; i++) + unipwd[i * 2 + 1] = pwd[i]; + + if( ( ret = pkcs12_derivation( key, keylen, unipwd, pwdlen * 2 + 2, + salt.p, salt.len, md_type, + PKCS12_DERIVE_KEY, iterations ) ) != 0 ) + { + return( ret ); + } + + if( iv == NULL || ivlen == 0 ) + return( 0 ); + + if( ( ret = pkcs12_derivation( iv, ivlen, unipwd, pwdlen * 2 + 2, + salt.p, salt.len, md_type, + PKCS12_DERIVE_IV, iterations ) ) != 0 ) + { + return( ret ); + } + return( 0 ); +} + +int pkcs12_pbe_sha1_rc4_128( asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output ) +{ +#if !defined(POLARSSL_ARC4_C) + ((void) pbe_params); + ((void) mode); + ((void) pwd); + ((void) pwdlen); + ((void) data); + ((void) len); + ((void) output); + return( POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE ); +#else + int ret; + unsigned char key[16]; + arc4_context ctx; + ((void) mode); + + if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, POLARSSL_MD_SHA1, + pwd, pwdlen, + key, 16, NULL, 0 ) ) != 0 ) + { + return( ret ); + } + + arc4_setup( &ctx, key, 16 ); + if( ( ret = arc4_crypt( &ctx, len, data, output ) ) != 0 ) + return( ret ); + + return( 0 ); +#endif /* POLARSSL_ARC4_C */ +} + +int pkcs12_pbe( asn1_buf *pbe_params, int mode, + cipher_type_t cipher_type, md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output ) +{ + int ret, keylen = 0; + unsigned char key[32]; + unsigned char iv[16]; + const cipher_info_t *cipher_info; + cipher_context_t cipher_ctx; + size_t olen = 0; + + cipher_info = cipher_info_from_type( cipher_type ); + if( cipher_info == NULL ) + return( POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE ); + + keylen = cipher_info->key_length / 8; + + if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, md_type, pwd, pwdlen, + key, keylen, + iv, cipher_info->iv_size ) ) != 0 ) + { + return( ret ); + } + + if( ( ret = cipher_init_ctx( &cipher_ctx, cipher_info ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_setkey( &cipher_ctx, key, keylen, mode ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_reset( &cipher_ctx, iv ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_update( &cipher_ctx, data, len, + output, &olen ) ) != 0 ) + { + return( ret ); + } + + if( ( ret = cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 ) + return( POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH ); + + return( 0 ); +} + +static void pkcs12_fill_buffer( unsigned char *data, size_t data_len, + const unsigned char *filler, size_t fill_len ) +{ + unsigned char *p = data; + size_t use_len; + + while( data_len > 0 ) + { + use_len = ( data_len > fill_len ) ? fill_len : data_len; + memcpy( p, filler, use_len ); + p += use_len; + data_len -= use_len; + } +} + +int pkcs12_derivation( unsigned char *data, size_t datalen, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *salt, size_t saltlen, + md_type_t md_type, int id, int iterations ) +{ + int ret; + unsigned int j; + + unsigned char diversifier[128]; + unsigned char salt_block[128], pwd_block[128], hash_block[128]; + unsigned char hash_output[POLARSSL_MD_MAX_SIZE]; + unsigned char *p; + unsigned char c; + + size_t hlen, use_len, v, i; + + const md_info_t *md_info; + md_context_t md_ctx; + + // This version only allows max of 64 bytes of password or salt + if( datalen > 128 || pwdlen > 64 || saltlen > 64 ) + return( POLARSSL_ERR_PKCS12_BAD_INPUT_DATA ); + + md_info = md_info_from_type( md_type ); + if( md_info == NULL ) + return( POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE ); + + if ( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 ) + return( ret ); + hlen = md_get_size( md_info ); + + if( hlen <= 32 ) + v = 64; + else + v = 128; + + memset( diversifier, (unsigned char) id, v ); + + pkcs12_fill_buffer( salt_block, v, salt, saltlen ); + pkcs12_fill_buffer( pwd_block, v, pwd, pwdlen ); + + p = data; + while( datalen > 0 ) + { + // Calculate hash( diversifier || salt_block || pwd_block ) + if( ( ret = md_starts( &md_ctx ) ) != 0 ) + return( ret ); + + if( ( ret = md_update( &md_ctx, diversifier, v ) ) != 0 ) + return( ret ); + + if( ( ret = md_update( &md_ctx, salt_block, v ) ) != 0 ) + return( ret ); + + if( ( ret = md_update( &md_ctx, pwd_block, v ) ) != 0 ) + return( ret ); + + if( ( ret = md_finish( &md_ctx, hash_output ) ) != 0 ) + return( ret ); + + // Perform remaining ( iterations - 1 ) recursive hash calculations + for( i = 1; i < iterations; i++ ) + { + if( ( ret = md( md_info, hash_output, hlen, hash_output ) ) != 0 ) + return( ret ); + } + + use_len = ( datalen > hlen ) ? hlen : datalen; + memcpy( p, hash_output, use_len ); + datalen -= use_len; + p += use_len; + + if( datalen == 0 ) + break; + + // Concatenating copies of hash_output into hash_block (B) + pkcs12_fill_buffer( hash_block, v, hash_output, hlen ); + + // B += 1 + for( i = v; i > 0; i-- ) + if( ++hash_block[i - 1] != 0 ) + break; + + // salt_block += B + c = 0; + for( i = v; i > 0; i-- ) + { + j = salt_block[i - 1] + hash_block[i - 1] + c; + c = (unsigned char) (j >> 8); + salt_block[i - 1] = j & 0xFF; + } + + // pwd_block += B + c = 0; + for( i = v; i > 0; i-- ) + { + j = pwd_block[i - 1] + hash_block[i - 1] + c; + c = (unsigned char) (j >> 8); + pwd_block[i - 1] = j & 0xFF; + } + } + + return( 0 ); +} + +#endif /* POLARSSL_PKCS12_C */ diff --git a/Externals/polarssl/library/pkcs5.c b/Externals/polarssl/library/pkcs5.c new file mode 100644 index 0000000000..8e55415bcf --- /dev/null +++ b/Externals/polarssl/library/pkcs5.c @@ -0,0 +1,415 @@ +/** + * \file pkcs5.c + * + * \brief PKCS#5 functions + * + * \author Mathias Olsson + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * PKCS#5 includes PBKDF2 and more + * + * http://tools.ietf.org/html/rfc2898 (Specification) + * http://tools.ietf.org/html/rfc6070 (Test vectors) + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_PKCS5_C) + +#include "polarssl/pkcs5.h" +#include "polarssl/asn1.h" +#include "polarssl/cipher.h" + +#define OID_CMP(oid_str, oid_buf) \ + ( ( OID_SIZE(oid_str) == (oid_buf)->len ) && \ + memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) == 0) + +static int pkcs5_parse_pbkdf2_params( unsigned char **p, + const unsigned char *end, + asn1_buf *salt, int *iterations, + int *keylen, md_type_t *md_type ) +{ + int ret; + size_t len = 0; + asn1_buf prf_alg_oid; + + /* + * PBKDF2-params ::= SEQUENCE { + * salt OCTET STRING, + * iterationCount INTEGER, + * keyLength INTEGER OPTIONAL + * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1 + * } + * + */ + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + } + + end = *p + len; + + if( ( ret = asn1_get_tag( p, end, &salt->len, ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + salt->p = *p; + *p += salt->len; + + if( ( ret = asn1_get_int( p, end, iterations ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + if( *p == end ) + return( 0 ); + + if( ( ret = asn1_get_int( p, end, keylen ) ) != 0 ) + { + if( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + } + + if( *p == end ) + return( 0 ); + + if( ( ret = asn1_get_tag( p, end, &prf_alg_oid.len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + if( !OID_CMP( OID_HMAC_SHA1, &prf_alg_oid ) ) + return( POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE ); + + *md_type = POLARSSL_MD_SHA1; + + if( *p != end ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +int pkcs5_pbes2( asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output ) +{ + int ret, iterations = 0, keylen = 0; + unsigned char *p, *end, *end2; + asn1_buf kdf_alg_oid, enc_scheme_oid, salt; + md_type_t md_type = POLARSSL_MD_SHA1; + unsigned char key[32], iv[32]; + size_t len = 0, olen = 0; + const md_info_t *md_info; + const cipher_info_t *cipher_info; + md_context_t md_ctx; + cipher_context_t cipher_ctx; + + p = pbe_params->p; + end = p + pbe_params->len; + + /* + * PBES2-params ::= SEQUENCE { + * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, + * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} + * } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + } + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + } + + end2 = p + len; + + if( ( ret = asn1_get_tag( &p, end2, &kdf_alg_oid.len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + kdf_alg_oid.p = p; + p += kdf_alg_oid.len; + + // Only PBKDF2 supported at the moment + // + if( !OID_CMP( OID_PKCS5_PBKDF2, &kdf_alg_oid ) ) + return( POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE ); + + if( ( ret = pkcs5_parse_pbkdf2_params( &p, end2, + &salt, &iterations, &keylen, + &md_type ) ) != 0 ) + { + return( ret ); + } + + md_info = md_info_from_type( md_type ); + if( md_info == NULL ) + return( POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE ); + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + } + + end2 = p + len; + + if( ( ret = asn1_get_tag( &p, end2, &enc_scheme_oid.len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + enc_scheme_oid.p = p; + p += enc_scheme_oid.len; + +#if defined(POLARSSL_DES_C) + // Only DES-CBC and DES-EDE3-CBC supported at the moment + // + if( OID_CMP( OID_DES_EDE3_CBC, &enc_scheme_oid ) ) + { + cipher_info = cipher_info_from_type( POLARSSL_CIPHER_DES_EDE3_CBC ); + } + else if( OID_CMP( OID_DES_CBC, &enc_scheme_oid ) ) + { + cipher_info = cipher_info_from_type( POLARSSL_CIPHER_DES_CBC ); + } + else +#endif /* POLARSSL_DES_C */ + return( POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE ); + + if( cipher_info == NULL ) + return( POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE ); + + keylen = cipher_info->key_length / 8; + + if( ( ret = asn1_get_tag( &p, end2, &len, ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT + ret ); + + if( len != cipher_info->iv_size ) + return( POLARSSL_ERR_PKCS5_INVALID_FORMAT ); + + memcpy( iv, p, len ); + + if( ( ret = md_init_ctx( &md_ctx, md_info ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_init_ctx( &cipher_ctx, cipher_info ) ) != 0 ) + return( ret ); + + if ( ( ret = pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len, + iterations, keylen, key ) ) != 0 ) + { + return( ret ); + } + + if( ( ret = cipher_setkey( &cipher_ctx, key, keylen, mode ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_reset( &cipher_ctx, iv ) ) != 0 ) + return( ret ); + + if( ( ret = cipher_update( &cipher_ctx, data, datalen, + output, &olen ) ) != 0 ) + { + return( ret ); + } + + if( ( ret = cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 ) + return( POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH ); + + return( 0 ); +} + +int pkcs5_pbkdf2_hmac( md_context_t *ctx, const unsigned char *password, + size_t plen, const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output ) +{ + int ret, j; + unsigned int i; + unsigned char md1[POLARSSL_MD_MAX_SIZE]; + unsigned char work[POLARSSL_MD_MAX_SIZE]; + unsigned char md_size = md_get_size( ctx->md_info ); + size_t use_len; + unsigned char *out_p = output; + unsigned char counter[4]; + + memset( counter, 0, 4 ); + counter[3] = 1; + + if( iteration_count > 0xFFFFFFFF ) + return( POLARSSL_ERR_PKCS5_BAD_INPUT_DATA ); + + while( key_length ) + { + // U1 ends up in work + // + if( ( ret = md_hmac_starts( ctx, password, plen ) ) != 0 ) + return( ret ); + + if( ( ret = md_hmac_update( ctx, salt, slen ) ) != 0 ) + return( ret ); + + if( ( ret = md_hmac_update( ctx, counter, 4 ) ) != 0 ) + return( ret ); + + if( ( ret = md_hmac_finish( ctx, work ) ) != 0 ) + return( ret ); + + memcpy( md1, work, md_size ); + + for ( i = 1; i < iteration_count; i++ ) + { + // U2 ends up in md1 + // + if( ( ret = md_hmac_starts( ctx, password, plen ) ) != 0 ) + return( ret ); + + if( ( ret = md_hmac_update( ctx, md1, md_size ) ) != 0 ) + return( ret ); + + if( ( ret = md_hmac_finish( ctx, md1 ) ) != 0 ) + return( ret ); + + // U1 xor U2 + // + for( j = 0; j < md_size; j++ ) + work[j] ^= md1[j]; + } + + use_len = ( key_length < md_size ) ? key_length : md_size; + memcpy( out_p, work, use_len ); + + key_length -= use_len; + out_p += use_len; + + for( i = 4; i > 0; i-- ) + if( ++counter[i - 1] != 0 ) + break; + } + + return( 0 ); +} + +#if defined(POLARSSL_SELF_TEST) + +#include + +#define MAX_TESTS 6 + +size_t plen[MAX_TESTS] = + { 8, 8, 8, 8, 24, 9 }; + +unsigned char password[MAX_TESTS][32] = +{ + "password", + "password", + "password", + "password", + "passwordPASSWORDpassword", + "pass\0word", +}; + +size_t slen[MAX_TESTS] = + { 4, 4, 4, 4, 36, 5 }; + +unsigned char salt[MAX_TESTS][40] = +{ + "salt", + "salt", + "salt", + "salt", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "sa\0lt", +}; + +uint32_t it_cnt[MAX_TESTS] = + { 1, 2, 4096, 16777216, 4096, 4096 }; + +uint32_t key_len[MAX_TESTS] = + { 20, 20, 20, 20, 25, 16 }; + + +unsigned char result_key[MAX_TESTS][32] = +{ + { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, + 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, + 0x2f, 0xe0, 0x37, 0xa6 }, + { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, + 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, + 0xd8, 0xde, 0x89, 0x57 }, + { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, + 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, + 0x65, 0xa4, 0x29, 0xc1 }, + { 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, + 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, + 0x26, 0x34, 0xe9, 0x84 }, + { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, + 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, + 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, + 0x38 }, + { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, + 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 }, +}; + +int pkcs5_self_test( int verbose ) +{ + md_context_t sha1_ctx; + const md_info_t *info_sha1; + int ret, i; + unsigned char key[64]; + + info_sha1 = md_info_from_type( POLARSSL_MD_SHA1 ); + if( info_sha1 == NULL ) + return( 1 ); + + if( ( ret = md_init_ctx( &sha1_ctx, info_sha1 ) ) != 0 ) + return( 1 ); + + for( i = 0; i < MAX_TESTS; i++ ) + { + printf( " PBKDF2 (SHA1) #%d: ", i ); + + ret = pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i], + slen[i], it_cnt[i], key_len[i], key ); + if( ret != 0 || + memcmp( result_key[i], key, key_len[i] ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + printf( "\n" ); + + return( 0 ); +} + +#endif /* POLARSSL_SELF_TEST */ + +#endif /* POLARSSL_PKCS5_C */ diff --git a/Externals/polarssl/library/rsa.c b/Externals/polarssl/library/rsa.c new file mode 100644 index 0000000000..e53d9a2eec --- /dev/null +++ b/Externals/polarssl/library/rsa.c @@ -0,0 +1,1466 @@ +/* + * The RSA public-key cryptosystem + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman. + * + * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf + * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_RSA_C) + +#include "polarssl/rsa.h" + +#if defined(POLARSSL_PKCS1_V21) +#include "polarssl/md.h" +#endif + +#include +#include + +/* + * Initialize an RSA context + */ +void rsa_init( rsa_context *ctx, + int padding, + int hash_id ) +{ + memset( ctx, 0, sizeof( rsa_context ) ); + + ctx->padding = padding; + ctx->hash_id = hash_id; +} + +#if defined(POLARSSL_GENPRIME) + +/* + * Generate an RSA keypair + */ +int rsa_gen_key( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + unsigned int nbits, int exponent ) +{ + int ret; + mpi P1, Q1, H, G; + + if( f_rng == NULL || nbits < 128 || exponent < 3 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G ); + + /* + * find primes P and Q with Q < P so that: + * GCD( E, (P-1)*(Q-1) ) == 1 + */ + MPI_CHK( mpi_lset( &ctx->E, exponent ) ); + + do + { + MPI_CHK( mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0, + f_rng, p_rng ) ); + + MPI_CHK( mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0, + f_rng, p_rng ) ); + + if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 ) + mpi_swap( &ctx->P, &ctx->Q ); + + if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 ) + continue; + + MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ); + if( mpi_msb( &ctx->N ) != nbits ) + continue; + + MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) ); + MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) ); + MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) ); + MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) ); + } + while( mpi_cmp_int( &G, 1 ) != 0 ); + + /* + * D = E^-1 mod ((P-1)*(Q-1)) + * DP = D mod (P - 1) + * DQ = D mod (Q - 1) + * QP = Q^-1 mod P + */ + MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) ); + MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) ); + MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) ); + MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) ); + + ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3; + +cleanup: + + mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G ); + + if( ret != 0 ) + { + rsa_free( ctx ); + return( POLARSSL_ERR_RSA_KEY_GEN_FAILED + ret ); + } + + return( 0 ); +} + +#endif + +/* + * Check a public RSA key + */ +int rsa_check_pubkey( const rsa_context *ctx ) +{ + if( !ctx->N.p || !ctx->E.p ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); + + if( ( ctx->N.p[0] & 1 ) == 0 || + ( ctx->E.p[0] & 1 ) == 0 ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); + + if( mpi_msb( &ctx->N ) < 128 || + mpi_msb( &ctx->N ) > POLARSSL_MPI_MAX_BITS ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); + + if( mpi_msb( &ctx->E ) < 2 || + mpi_msb( &ctx->E ) > 64 ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); + + return( 0 ); +} + +/* + * Check a private RSA key + */ +int rsa_check_privkey( const rsa_context *ctx ) +{ + int ret; + mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2, DP, DQ, QP; + + if( ( ret = rsa_check_pubkey( ctx ) ) != 0 ) + return( ret ); + + if( !ctx->P.p || !ctx->Q.p || !ctx->D.p ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); + + mpi_init( &PQ ); mpi_init( &DE ); mpi_init( &P1 ); mpi_init( &Q1 ); + mpi_init( &H ); mpi_init( &I ); mpi_init( &G ); mpi_init( &G2 ); + mpi_init( &L1 ); mpi_init( &L2 ); mpi_init( &DP ); mpi_init( &DQ ); + mpi_init( &QP ); + + MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) ); + MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) ); + MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) ); + MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) ); + MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) ); + MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) ); + + MPI_CHK( mpi_gcd( &G2, &P1, &Q1 ) ); + MPI_CHK( mpi_div_mpi( &L1, &L2, &H, &G2 ) ); + MPI_CHK( mpi_mod_mpi( &I, &DE, &L1 ) ); + + MPI_CHK( mpi_mod_mpi( &DP, &ctx->D, &P1 ) ); + MPI_CHK( mpi_mod_mpi( &DQ, &ctx->D, &Q1 ) ); + MPI_CHK( mpi_inv_mod( &QP, &ctx->Q, &ctx->P ) ); + /* + * Check for a valid PKCS1v2 private key + */ + if( mpi_cmp_mpi( &PQ, &ctx->N ) != 0 || + mpi_cmp_mpi( &DP, &ctx->DP ) != 0 || + mpi_cmp_mpi( &DQ, &ctx->DQ ) != 0 || + mpi_cmp_mpi( &QP, &ctx->QP ) != 0 || + mpi_cmp_int( &L2, 0 ) != 0 || + mpi_cmp_int( &I, 1 ) != 0 || + mpi_cmp_int( &G, 1 ) != 0 ) + { + ret = POLARSSL_ERR_RSA_KEY_CHECK_FAILED; + } + +cleanup: + mpi_free( &PQ ); mpi_free( &DE ); mpi_free( &P1 ); mpi_free( &Q1 ); + mpi_free( &H ); mpi_free( &I ); mpi_free( &G ); mpi_free( &G2 ); + mpi_free( &L1 ); mpi_free( &L2 ); mpi_free( &DP ); mpi_free( &DQ ); + mpi_free( &QP ); + + if( ret == POLARSSL_ERR_RSA_KEY_CHECK_FAILED ) + return( ret ); + + if( ret != 0 ) + return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED + ret ); + + return( 0 ); +} + +/* + * Do an RSA public key operation + */ +int rsa_public( rsa_context *ctx, + const unsigned char *input, + unsigned char *output ) +{ + int ret; + size_t olen; + mpi T; + + mpi_init( &T ); + + MPI_CHK( mpi_read_binary( &T, input, ctx->len ) ); + + if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) + { + mpi_free( &T ); + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + olen = ctx->len; + MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) ); + MPI_CHK( mpi_write_binary( &T, output, olen ) ); + +cleanup: + + mpi_free( &T ); + + if( ret != 0 ) + return( POLARSSL_ERR_RSA_PUBLIC_FAILED + ret ); + + return( 0 ); +} + +/* + * Do an RSA private key operation + */ +int rsa_private( rsa_context *ctx, + const unsigned char *input, + unsigned char *output ) +{ + int ret; + size_t olen; + mpi T, T1, T2; + + mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 ); + + MPI_CHK( mpi_read_binary( &T, input, ctx->len ) ); + + if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) + { + mpi_free( &T ); + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + +#if defined(POLARSSL_RSA_NO_CRT) + MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) ); +#else + /* + * faster decryption using the CRT + * + * T1 = input ^ dP mod P + * T2 = input ^ dQ mod Q + */ + MPI_CHK( mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) ); + MPI_CHK( mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) ); + + /* + * T = (T1 - T2) * (Q^-1 mod P) mod P + */ + MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) ); + MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) ); + MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) ); + + /* + * output = T2 + T * Q + */ + MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) ); + MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) ); +#endif + + olen = ctx->len; + MPI_CHK( mpi_write_binary( &T, output, olen ) ); + +cleanup: + + mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 ); + + if( ret != 0 ) + return( POLARSSL_ERR_RSA_PRIVATE_FAILED + ret ); + + return( 0 ); +} + +#if defined(POLARSSL_PKCS1_V21) +/** + * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer. + * + * \param dst buffer to mask + * \param dlen length of destination buffer + * \param src source of the mask generation + * \param slen length of the source buffer + * \param md_ctx message digest context to use + */ +static void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, size_t slen, + md_context_t *md_ctx ) +{ + unsigned char mask[POLARSSL_MD_MAX_SIZE]; + unsigned char counter[4]; + unsigned char *p; + unsigned int hlen; + size_t i, use_len; + + memset( mask, 0, POLARSSL_MD_MAX_SIZE ); + memset( counter, 0, 4 ); + + hlen = md_ctx->md_info->size; + + // Generate and apply dbMask + // + p = dst; + + while( dlen > 0 ) + { + use_len = hlen; + if( dlen < hlen ) + use_len = dlen; + + md_starts( md_ctx ); + md_update( md_ctx, src, slen ); + md_update( md_ctx, counter, 4 ); + md_finish( md_ctx, mask ); + + for( i = 0; i < use_len; ++i ) + *p++ ^= mask[i]; + + counter[3]++; + + dlen -= use_len; + } +} +#endif + +#if defined(POLARSSL_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function + */ +int rsa_rsaes_oaep_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t ilen, + const unsigned char *input, + unsigned char *output ) +{ + size_t olen; + int ret; + unsigned char *p = output; + unsigned int hlen; + const md_info_t *md_info; + md_context_t md_ctx; + + if( ctx->padding != RSA_PKCS_V21 || f_rng == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + md_info = md_info_from_type( ctx->hash_id ); + + if( md_info == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + olen = ctx->len; + hlen = md_get_size( md_info ); + + if( olen < ilen + 2 * hlen + 2 || f_rng == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + memset( output, 0, olen ); + + *p++ = 0; + + // Generate a random octet string seed + // + if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 ) + return( POLARSSL_ERR_RSA_RNG_FAILED + ret ); + + p += hlen; + + // Construct DB + // + md( md_info, label, label_len, p ); + p += hlen; + p += olen - 2 * hlen - 2 - ilen; + *p++ = 1; + memcpy( p, input, ilen ); + + md_init_ctx( &md_ctx, md_info ); + + // maskedDB: Apply dbMask to DB + // + mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen, + &md_ctx ); + + // maskedSeed: Apply seedMask to seed + // + mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1, + &md_ctx ); + + md_free_ctx( &md_ctx ); + + return( ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, output, output ) + : rsa_private( ctx, output, output ) ); +} +#endif /* POLARSSL_PKCS1_V21 */ + +/* + * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function + */ +int rsa_rsaes_pkcs1_v15_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output ) +{ + size_t nb_pad, olen; + int ret; + unsigned char *p = output; + + if( ctx->padding != RSA_PKCS_V15 || f_rng == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + olen = ctx->len; + + if( olen < ilen + 11 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + nb_pad = olen - 3 - ilen; + + *p++ = 0; + if( mode == RSA_PUBLIC ) + { + *p++ = RSA_CRYPT; + + while( nb_pad-- > 0 ) + { + int rng_dl = 100; + + do { + ret = f_rng( p_rng, p, 1 ); + } while( *p == 0 && --rng_dl && ret == 0 ); + + // Check if RNG failed to generate data + // + if( rng_dl == 0 || ret != 0) + return POLARSSL_ERR_RSA_RNG_FAILED + ret; + + p++; + } + } + else + { + *p++ = RSA_SIGN; + + while( nb_pad-- > 0 ) + *p++ = 0xFF; + } + + *p++ = 0; + memcpy( p, input, ilen ); + + return( ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, output, output ) + : rsa_private( ctx, output, output ) ); +} + +/* + * Add the message padding, then do an RSA operation + */ +int rsa_pkcs1_encrypt( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output ) +{ + switch( ctx->padding ) + { + case RSA_PKCS_V15: + return rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen, + input, output ); + +#if defined(POLARSSL_PKCS1_V21) + case RSA_PKCS_V21: + return rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0, + ilen, input, output ); +#endif + + default: + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + } +} + +#if defined(POLARSSL_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function + */ +int rsa_rsaes_oaep_decrypt( rsa_context *ctx, + int mode, + const unsigned char *label, size_t label_len, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len ) +{ + int ret; + size_t ilen; + unsigned char *p; + unsigned char buf[POLARSSL_MPI_MAX_SIZE]; + unsigned char lhash[POLARSSL_MD_MAX_SIZE]; + unsigned int hlen; + const md_info_t *md_info; + md_context_t md_ctx; + + if( ctx->padding != RSA_PKCS_V21 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ilen = ctx->len; + + if( ilen < 16 || ilen > sizeof( buf ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ret = ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, input, buf ) + : rsa_private( ctx, input, buf ); + + if( ret != 0 ) + return( ret ); + + p = buf; + + if( *p++ != 0 ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + md_info = md_info_from_type( ctx->hash_id ); + if( md_info == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + hlen = md_get_size( md_info ); + + md_init_ctx( &md_ctx, md_info ); + + // Generate lHash + // + md( md_info, label, label_len, lhash ); + + // seed: Apply seedMask to maskedSeed + // + mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1, + &md_ctx ); + + // DB: Apply dbMask to maskedDB + // + mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen, + &md_ctx ); + + p += hlen; + md_free_ctx( &md_ctx ); + + // Check validity + // + if( memcmp( lhash, p, hlen ) != 0 ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + p += hlen; + + while( *p == 0 && p < buf + ilen ) + p++; + + if( p == buf + ilen ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + if( *p++ != 0x01 ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + if (ilen - (p - buf) > output_max_len) + return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE ); + + *olen = ilen - (p - buf); + memcpy( output, p, *olen ); + + return( 0 ); +} +#endif /* POLARSSL_PKCS1_V21 */ + +/* + * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function + */ +int rsa_rsaes_pkcs1_v15_decrypt( rsa_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + int ret, correct = 1; + size_t ilen, pad_count = 0; + unsigned char *p, *q; + unsigned char bt; + unsigned char buf[POLARSSL_MPI_MAX_SIZE]; + + if( ctx->padding != RSA_PKCS_V15 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ilen = ctx->len; + + if( ilen < 16 || ilen > sizeof( buf ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ret = ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, input, buf ) + : rsa_private( ctx, input, buf ); + + if( ret != 0 ) + return( ret ); + + p = buf; + + if( *p++ != 0 ) + correct = 0; + + bt = *p++; + if( ( bt != RSA_CRYPT && mode == RSA_PRIVATE ) || + ( bt != RSA_SIGN && mode == RSA_PUBLIC ) ) + { + correct = 0; + } + + if( bt == RSA_CRYPT ) + { + while( *p != 0 && p < buf + ilen - 1 ) + pad_count += ( *p++ != 0 ); + + correct &= ( *p == 0 && p < buf + ilen - 1 ); + + q = p; + + // Also pass over all other bytes to reduce timing differences + // + while ( q < buf + ilen - 1 ) + pad_count += ( *q++ != 0 ); + + // Prevent compiler optimization of pad_count + // + correct |= pad_count & 0x100000; /* Always 0 unless 1M bit keys */ + p++; + } + else + { + while( *p == 0xFF && p < buf + ilen - 1 ) + pad_count += ( *p++ == 0xFF ); + + correct &= ( *p == 0 && p < buf + ilen - 1 ); + + q = p; + + // Also pass over all other bytes to reduce timing differences + // + while ( q < buf + ilen - 1 ) + pad_count += ( *q++ != 0 ); + + // Prevent compiler optimization of pad_count + // + correct |= pad_count & 0x100000; /* Always 0 unless 1M bit keys */ + p++; + } + + if( correct == 0 ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + if (ilen - (p - buf) > output_max_len) + return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE ); + + *olen = ilen - (p - buf); + memcpy( output, p, *olen ); + + return( 0 ); +} + +/* + * Do an RSA operation, then remove the message padding + */ +int rsa_pkcs1_decrypt( rsa_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + switch( ctx->padding ) + { + case RSA_PKCS_V15: + return rsa_rsaes_pkcs1_v15_decrypt( ctx, mode, olen, input, output, + output_max_len ); + +#if defined(POLARSSL_PKCS1_V21) + case RSA_PKCS_V21: + return rsa_rsaes_oaep_decrypt( ctx, mode, NULL, 0, olen, input, + output, output_max_len ); +#endif + + default: + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + } +} + +#if defined(POLARSSL_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function + */ +int rsa_rsassa_pss_sign( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + size_t olen; + unsigned char *p = sig; + unsigned char salt[POLARSSL_MD_MAX_SIZE]; + unsigned int slen, hlen, offset = 0; + int ret; + size_t msb; + const md_info_t *md_info; + md_context_t md_ctx; + + if( ctx->padding != RSA_PKCS_V21 || f_rng == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + olen = ctx->len; + + switch( hash_id ) + { + case SIG_RSA_MD2: + case SIG_RSA_MD4: + case SIG_RSA_MD5: + hashlen = 16; + break; + + case SIG_RSA_SHA1: + hashlen = 20; + break; + + case SIG_RSA_SHA224: + hashlen = 28; + break; + + case SIG_RSA_SHA256: + hashlen = 32; + break; + + case SIG_RSA_SHA384: + hashlen = 48; + break; + + case SIG_RSA_SHA512: + hashlen = 64; + break; + + default: + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + md_info = md_info_from_type( ctx->hash_id ); + if( md_info == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + hlen = md_get_size( md_info ); + slen = hlen; + + if( olen < hlen + slen + 2 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + memset( sig, 0, olen ); + + msb = mpi_msb( &ctx->N ) - 1; + + // Generate salt of length slen + // + if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 ) + return( POLARSSL_ERR_RSA_RNG_FAILED + ret ); + + // Note: EMSA-PSS encoding is over the length of N - 1 bits + // + msb = mpi_msb( &ctx->N ) - 1; + p += olen - hlen * 2 - 2; + *p++ = 0x01; + memcpy( p, salt, slen ); + p += slen; + + md_init_ctx( &md_ctx, md_info ); + + // Generate H = Hash( M' ) + // + md_starts( &md_ctx ); + md_update( &md_ctx, p, 8 ); + md_update( &md_ctx, hash, hashlen ); + md_update( &md_ctx, salt, slen ); + md_finish( &md_ctx, p ); + + // Compensate for boundary condition when applying mask + // + if( msb % 8 == 0 ) + offset = 1; + + // maskedDB: Apply dbMask to DB + // + mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx ); + + md_free_ctx( &md_ctx ); + + msb = mpi_msb( &ctx->N ) - 1; + sig[0] &= 0xFF >> ( olen * 8 - msb ); + + p += hlen; + *p++ = 0xBC; + + return( ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, sig, sig ) + : rsa_private( ctx, sig, sig ) ); +} +#endif /* POLARSSL_PKCS1_V21 */ + +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function + */ +/* + * Do an RSA operation to sign the message digest + */ +int rsa_rsassa_pkcs1_v15_sign( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + size_t nb_pad, olen; + unsigned char *p = sig; + + if( ctx->padding != RSA_PKCS_V15 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + olen = ctx->len; + + switch( hash_id ) + { + case SIG_RSA_RAW: + nb_pad = olen - 3 - hashlen; + break; + + case SIG_RSA_MD2: + case SIG_RSA_MD4: + case SIG_RSA_MD5: + nb_pad = olen - 3 - 34; + break; + + case SIG_RSA_SHA1: + nb_pad = olen - 3 - 35; + break; + + case SIG_RSA_SHA224: + nb_pad = olen - 3 - 47; + break; + + case SIG_RSA_SHA256: + nb_pad = olen - 3 - 51; + break; + + case SIG_RSA_SHA384: + nb_pad = olen - 3 - 67; + break; + + case SIG_RSA_SHA512: + nb_pad = olen - 3 - 83; + break; + + + default: + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + if( ( nb_pad < 8 ) || ( nb_pad > olen ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + *p++ = 0; + *p++ = RSA_SIGN; + memset( p, 0xFF, nb_pad ); + p += nb_pad; + *p++ = 0; + + switch( hash_id ) + { + case SIG_RSA_RAW: + memcpy( p, hash, hashlen ); + break; + + case SIG_RSA_MD2: + memcpy( p, ASN1_HASH_MDX, 18 ); + memcpy( p + 18, hash, 16 ); + p[13] = 2; break; + + case SIG_RSA_MD4: + memcpy( p, ASN1_HASH_MDX, 18 ); + memcpy( p + 18, hash, 16 ); + p[13] = 4; break; + + case SIG_RSA_MD5: + memcpy( p, ASN1_HASH_MDX, 18 ); + memcpy( p + 18, hash, 16 ); + p[13] = 5; break; + + case SIG_RSA_SHA1: + memcpy( p, ASN1_HASH_SHA1, 15 ); + memcpy( p + 15, hash, 20 ); + break; + + case SIG_RSA_SHA224: + memcpy( p, ASN1_HASH_SHA2X, 19 ); + memcpy( p + 19, hash, 28 ); + p[1] += 28; p[14] = 4; p[18] += 28; break; + + case SIG_RSA_SHA256: + memcpy( p, ASN1_HASH_SHA2X, 19 ); + memcpy( p + 19, hash, 32 ); + p[1] += 32; p[14] = 1; p[18] += 32; break; + + case SIG_RSA_SHA384: + memcpy( p, ASN1_HASH_SHA2X, 19 ); + memcpy( p + 19, hash, 48 ); + p[1] += 48; p[14] = 2; p[18] += 48; break; + + case SIG_RSA_SHA512: + memcpy( p, ASN1_HASH_SHA2X, 19 ); + memcpy( p + 19, hash, 64 ); + p[1] += 64; p[14] = 3; p[18] += 64; break; + + default: + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + return( ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, sig, sig ) + : rsa_private( ctx, sig, sig ) ); +} + +/* + * Do an RSA operation to sign the message digest + */ +int rsa_pkcs1_sign( rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + switch( ctx->padding ) + { + case RSA_PKCS_V15: + return rsa_rsassa_pkcs1_v15_sign( ctx, mode, hash_id, + hashlen, hash, sig ); + +#if defined(POLARSSL_PKCS1_V21) + case RSA_PKCS_V21: + return rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, hash_id, + hashlen, hash, sig ); +#endif + + default: + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + } +} + +#if defined(POLARSSL_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function + */ +int rsa_rsassa_pss_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + int ret; + size_t siglen; + unsigned char *p; + unsigned char buf[POLARSSL_MPI_MAX_SIZE]; + unsigned char result[POLARSSL_MD_MAX_SIZE]; + unsigned char zeros[8]; + unsigned int hlen; + size_t slen, msb; + const md_info_t *md_info; + md_context_t md_ctx; + + if( ctx->padding != RSA_PKCS_V21 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + siglen = ctx->len; + + if( siglen < 16 || siglen > sizeof( buf ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ret = ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, sig, buf ) + : rsa_private( ctx, sig, buf ); + + if( ret != 0 ) + return( ret ); + + p = buf; + + if( buf[siglen - 1] != 0xBC ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + switch( hash_id ) + { + case SIG_RSA_MD2: + case SIG_RSA_MD4: + case SIG_RSA_MD5: + hashlen = 16; + break; + + case SIG_RSA_SHA1: + hashlen = 20; + break; + + case SIG_RSA_SHA224: + hashlen = 28; + break; + + case SIG_RSA_SHA256: + hashlen = 32; + break; + + case SIG_RSA_SHA384: + hashlen = 48; + break; + + case SIG_RSA_SHA512: + hashlen = 64; + break; + + default: + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + } + + md_info = md_info_from_type( ctx->hash_id ); + if( md_info == NULL ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + hlen = md_get_size( md_info ); + slen = siglen - hlen - 1; + + memset( zeros, 0, 8 ); + + // Note: EMSA-PSS verification is over the length of N - 1 bits + // + msb = mpi_msb( &ctx->N ) - 1; + + // Compensate for boundary condition when applying mask + // + if( msb % 8 == 0 ) + { + p++; + siglen -= 1; + } + if( buf[0] >> ( 8 - siglen * 8 + msb ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + md_init_ctx( &md_ctx, md_info ); + + mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx ); + + buf[0] &= 0xFF >> ( siglen * 8 - msb ); + + while( *p == 0 && p < buf + siglen ) + p++; + + if( p == buf + siglen || + *p++ != 0x01 ) + { + md_free_ctx( &md_ctx ); + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + } + + slen -= p - buf; + + // Generate H = Hash( M' ) + // + md_starts( &md_ctx ); + md_update( &md_ctx, zeros, 8 ); + md_update( &md_ctx, hash, hashlen ); + md_update( &md_ctx, p, slen ); + md_finish( &md_ctx, result ); + + md_free_ctx( &md_ctx ); + + if( memcmp( p + slen, result, hlen ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); +} +#endif /* POLARSSL_PKCS1_V21 */ + +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function + */ +int rsa_rsassa_pkcs1_v15_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + int ret; + size_t len, siglen; + unsigned char *p, c; + unsigned char buf[POLARSSL_MPI_MAX_SIZE]; + + if( ctx->padding != RSA_PKCS_V15 ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + siglen = ctx->len; + + if( siglen < 16 || siglen > sizeof( buf ) ) + return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); + + ret = ( mode == RSA_PUBLIC ) + ? rsa_public( ctx, sig, buf ) + : rsa_private( ctx, sig, buf ); + + if( ret != 0 ) + return( ret ); + + p = buf; + + if( *p++ != 0 || *p++ != RSA_SIGN ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + + while( *p != 0 ) + { + if( p >= buf + siglen - 1 || *p != 0xFF ) + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + p++; + } + p++; + + len = siglen - ( p - buf ); + + if( len == 33 && hash_id == SIG_RSA_SHA1 ) + { + if( memcmp( p, ASN1_HASH_SHA1_ALT, 13 ) == 0 && + memcmp( p + 13, hash, 20 ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + } + if( len == 34 ) + { + c = p[13]; + p[13] = 0; + + if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 ) + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + + if( ( c == 2 && hash_id == SIG_RSA_MD2 ) || + ( c == 4 && hash_id == SIG_RSA_MD4 ) || + ( c == 5 && hash_id == SIG_RSA_MD5 ) ) + { + if( memcmp( p + 18, hash, 16 ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + } + } + + if( len == 35 && hash_id == SIG_RSA_SHA1 ) + { + if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 && + memcmp( p + 15, hash, 20 ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + } + if( ( len == 19 + 28 && p[14] == 4 && hash_id == SIG_RSA_SHA224 ) || + ( len == 19 + 32 && p[14] == 1 && hash_id == SIG_RSA_SHA256 ) || + ( len == 19 + 48 && p[14] == 2 && hash_id == SIG_RSA_SHA384 ) || + ( len == 19 + 64 && p[14] == 3 && hash_id == SIG_RSA_SHA512 ) ) + { + c = p[1] - 17; + p[1] = 17; + p[14] = 0; + + if( p[18] == c && + memcmp( p, ASN1_HASH_SHA2X, 18 ) == 0 && + memcmp( p + 19, hash, c ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + } + + if( len == hashlen && hash_id == SIG_RSA_RAW ) + { + if( memcmp( p, hash, hashlen ) == 0 ) + return( 0 ); + else + return( POLARSSL_ERR_RSA_VERIFY_FAILED ); + } + + return( POLARSSL_ERR_RSA_INVALID_PADDING ); +} + +/* + * Do an RSA operation and check the message digest + */ +int rsa_pkcs1_verify( rsa_context *ctx, + int mode, + int hash_id, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig ) +{ + switch( ctx->padding ) + { + case RSA_PKCS_V15: + return rsa_rsassa_pkcs1_v15_verify( ctx, mode, hash_id, + hashlen, hash, sig ); + +#if defined(POLARSSL_PKCS1_V21) + case RSA_PKCS_V21: + return rsa_rsassa_pss_verify( ctx, mode, hash_id, + hashlen, hash, sig ); +#endif + + default: + return( POLARSSL_ERR_RSA_INVALID_PADDING ); + } +} + +/* + * Free the components of an RSA key + */ +void rsa_free( rsa_context *ctx ) +{ + mpi_free( &ctx->RQ ); mpi_free( &ctx->RP ); mpi_free( &ctx->RN ); + mpi_free( &ctx->QP ); mpi_free( &ctx->DQ ); mpi_free( &ctx->DP ); + mpi_free( &ctx->Q ); mpi_free( &ctx->P ); mpi_free( &ctx->D ); + mpi_free( &ctx->E ); mpi_free( &ctx->N ); +} + +#if defined(POLARSSL_SELF_TEST) + +#include "polarssl/sha1.h" + +/* + * Example RSA-1024 keypair, for test purposes + */ +#define KEY_LEN 128 + +#define RSA_N "9292758453063D803DD603D5E777D788" \ + "8ED1D5BF35786190FA2F23EBC0848AEA" \ + "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ + "7130B9CED7ACDF54CFC7555AC14EEBAB" \ + "93A89813FBF3C4F8066D2D800F7C38A8" \ + "1AE31942917403FF4946B0A83D3D3E05" \ + "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ + "5E94BB77B07507233A0BC7BAC8F90F79" + +#define RSA_E "10001" + +#define RSA_D "24BF6185468786FDD303083D25E64EFC" \ + "66CA472BC44D253102F8B4A9D3BFA750" \ + "91386C0077937FE33FA3252D28855837" \ + "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ + "DF79C5CE07EE72C7F123142198164234" \ + "CABB724CF78B8173B9F880FC86322407" \ + "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ + "071513A1E85B5DFA031F21ECAE91A34D" + +#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ + "2C01CAD19EA484A87EA4377637E75500" \ + "FCB2005C5C7DD6EC4AC023CDA285D796" \ + "C3D9E75E1EFC42488BB4F1D13AC30A57" + +#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ + "E211C2B9E5DB1ED0BF61D0D9899620F4" \ + "910E4168387E3C30AA1E00C339A79508" \ + "8452DD96A9A5EA5D9DCA68DA636032AF" + +#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \ + "3C94D22288ACD763FD8E5600ED4A702D" \ + "F84198A5F06C2E72236AE490C93F07F8" \ + "3CC559CD27BC2D1CA488811730BB5725" + +#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \ + "D8AAEA56749EA28623272E4F7D0592AF" \ + "7C1F1313CAC9471B5C523BFE592F517B" \ + "407A1BD76C164B93DA2D32A383E58357" + +#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \ + "F38D18D2B2F0E2DD275AA977E2BF4411" \ + "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \ + "A74206CEC169D74BF5A8C50D6F48EA08" + +#define PT_LEN 24 +#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ + "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" + +static int myrand( void *rng_state, unsigned char *output, size_t len ) +{ + size_t i; + + if( rng_state != NULL ) + rng_state = NULL; + + for( i = 0; i < len; ++i ) + output[i] = rand(); + + return( 0 ); +} + +/* + * Checkup routine + */ +int rsa_self_test( int verbose ) +{ + size_t len; + rsa_context rsa; + unsigned char rsa_plaintext[PT_LEN]; + unsigned char rsa_decrypted[PT_LEN]; + unsigned char rsa_ciphertext[KEY_LEN]; +#if defined(POLARSSL_SHA1_C) + unsigned char sha1sum[20]; +#endif + + rsa_init( &rsa, RSA_PKCS_V15, 0 ); + + rsa.len = KEY_LEN; + mpi_read_string( &rsa.N , 16, RSA_N ); + mpi_read_string( &rsa.E , 16, RSA_E ); + mpi_read_string( &rsa.D , 16, RSA_D ); + mpi_read_string( &rsa.P , 16, RSA_P ); + mpi_read_string( &rsa.Q , 16, RSA_Q ); + mpi_read_string( &rsa.DP, 16, RSA_DP ); + mpi_read_string( &rsa.DQ, 16, RSA_DQ ); + mpi_read_string( &rsa.QP, 16, RSA_QP ); + + if( verbose != 0 ) + printf( " RSA key validation: " ); + + if( rsa_check_pubkey( &rsa ) != 0 || + rsa_check_privkey( &rsa ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n PKCS#1 encryption : " ); + + memcpy( rsa_plaintext, RSA_PT, PT_LEN ); + + if( rsa_pkcs1_encrypt( &rsa, &myrand, NULL, RSA_PUBLIC, PT_LEN, + rsa_plaintext, rsa_ciphertext ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n PKCS#1 decryption : " ); + + if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len, + rsa_ciphertext, rsa_decrypted, + sizeof(rsa_decrypted) ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + +#if defined(POLARSSL_SHA1_C) + if( verbose != 0 ) + printf( "passed\n PKCS#1 data sign : " ); + + sha1( rsa_plaintext, PT_LEN, sha1sum ); + + if( rsa_pkcs1_sign( &rsa, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA1, 20, + sha1sum, rsa_ciphertext ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n PKCS#1 sig. verify: " ); + + if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, SIG_RSA_SHA1, 20, + sha1sum, rsa_ciphertext ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n\n" ); +#endif /* POLARSSL_SHA1_C */ + + rsa_free( &rsa ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Source/Core/Common/Src/Crypto/sha1.cpp b/Externals/polarssl/library/sha1.c similarity index 81% rename from Source/Core/Common/Src/Crypto/sha1.cpp rename to Externals/polarssl/library/sha1.c index 45b88b2b6e..b301b09797 100644 --- a/Source/Core/Common/Src/Crypto/sha1.cpp +++ b/Externals/polarssl/library/sha1.c @@ -1,10 +1,12 @@ /* * FIPS-180-1 compliant SHA-1 implementation * - * Copyright (C) 2006-2009, Paul Bakker - * All rights reserved. + * Copyright (C) 2006-2013, Brainspark B.V. * - * Joined copyright on original XySSL code with: Christophe Devine + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,34 +27,34 @@ * * http://www.itl.nist.gov/fipspubs/fip180-1.htm */ -/* + #include "polarssl/config.h" #if defined(POLARSSL_SHA1_C) #include "polarssl/sha1.h" -*/ -#include "sha1.h" -#include -#include -#include "../FileUtil.h" +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if !defined(POLARSSL_SHA1_ALT) /* * 32-bit integer manipulation macros (big endian) */ -#ifndef GET_ULONG_BE -#define GET_ULONG_BE(n,b,i) \ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ { \ - (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ - | ( (unsigned long) (b)[(i) + 1] << 16 ) \ - | ( (unsigned long) (b)[(i) + 2] << 8 ) \ - | ( (unsigned long) (b)[(i) + 3] ); \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ } #endif -#ifndef PUT_ULONG_BE -#define PUT_ULONG_BE(n,b,i) \ +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ @@ -76,26 +78,26 @@ void sha1_starts( sha1_context *ctx ) ctx->state[4] = 0xC3D2E1F0; } -static void sha1_process( sha1_context *ctx, unsigned char data[64] ) +void sha1_process( sha1_context *ctx, const unsigned char data[64] ) { - unsigned long temp, W[16], A, B, C, D, E; + uint32_t temp, W[16], A, B, C, D, E; - GET_ULONG_BE( W[ 0], data, 0 ); - GET_ULONG_BE( W[ 1], data, 4 ); - GET_ULONG_BE( W[ 2], data, 8 ); - GET_ULONG_BE( W[ 3], data, 12 ); - GET_ULONG_BE( W[ 4], data, 16 ); - GET_ULONG_BE( W[ 5], data, 20 ); - GET_ULONG_BE( W[ 6], data, 24 ); - GET_ULONG_BE( W[ 7], data, 28 ); - GET_ULONG_BE( W[ 8], data, 32 ); - GET_ULONG_BE( W[ 9], data, 36 ); - GET_ULONG_BE( W[10], data, 40 ); - GET_ULONG_BE( W[11], data, 44 ); - GET_ULONG_BE( W[12], data, 48 ); - GET_ULONG_BE( W[13], data, 52 ); - GET_ULONG_BE( W[14], data, 56 ); - GET_ULONG_BE( W[15], data, 60 ); + GET_UINT32_BE( W[ 0], data, 0 ); + GET_UINT32_BE( W[ 1], data, 4 ); + GET_UINT32_BE( W[ 2], data, 8 ); + GET_UINT32_BE( W[ 3], data, 12 ); + GET_UINT32_BE( W[ 4], data, 16 ); + GET_UINT32_BE( W[ 5], data, 20 ); + GET_UINT32_BE( W[ 6], data, 24 ); + GET_UINT32_BE( W[ 7], data, 28 ); + GET_UINT32_BE( W[ 8], data, 32 ); + GET_UINT32_BE( W[ 9], data, 36 ); + GET_UINT32_BE( W[10], data, 40 ); + GET_UINT32_BE( W[11], data, 44 ); + GET_UINT32_BE( W[12], data, 48 ); + GET_UINT32_BE( W[13], data, 52 ); + GET_UINT32_BE( W[14], data, 56 ); + GET_UINT32_BE( W[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) @@ -235,10 +237,10 @@ static void sha1_process( sha1_context *ctx, unsigned char data[64] ) /* * SHA-1 process buffer */ -void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ) +void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) { - int fill; - unsigned long left; + size_t fill; + uint32_t left; if( ilen <= 0 ) return; @@ -246,16 +248,15 @@ void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ) left = ctx->total[0] & 0x3F; fill = 64 - left; - ctx->total[0] += ilen; + ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; - if( ctx->total[0] < (unsigned long) ilen ) + if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { - memcpy( (void *) (ctx->buffer + left), - (void *) input, fill ); + memcpy( (void *) (ctx->buffer + left), input, fill ); sha1_process( ctx, ctx->buffer ); input += fill; ilen -= fill; @@ -270,10 +271,7 @@ void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ) } if( ilen > 0 ) - { - memcpy( (void *) (ctx->buffer + left), - (void *) input, ilen ); - } + memcpy( (void *) (ctx->buffer + left), input, ilen ); } static const unsigned char sha1_padding[64] = @@ -289,34 +287,36 @@ static const unsigned char sha1_padding[64] = */ void sha1_finish( sha1_context *ctx, unsigned char output[20] ) { - unsigned long last, padn; - unsigned long high, low; + uint32_t last, padn; + uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); - PUT_ULONG_BE( high, msglen, 0 ); - PUT_ULONG_BE( low, msglen, 4 ); + PUT_UINT32_BE( high, msglen, 0 ); + PUT_UINT32_BE( low, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); - sha1_update( ctx, (unsigned char *) sha1_padding, padn ); + sha1_update( ctx, sha1_padding, padn ); sha1_update( ctx, msglen, 8 ); - PUT_ULONG_BE( ctx->state[0], output, 0 ); - PUT_ULONG_BE( ctx->state[1], output, 4 ); - PUT_ULONG_BE( ctx->state[2], output, 8 ); - PUT_ULONG_BE( ctx->state[3], output, 12 ); - PUT_ULONG_BE( ctx->state[4], output, 16 ); + PUT_UINT32_BE( ctx->state[0], output, 0 ); + PUT_UINT32_BE( ctx->state[1], output, 4 ); + PUT_UINT32_BE( ctx->state[2], output, 8 ); + PUT_UINT32_BE( ctx->state[3], output, 12 ); + PUT_UINT32_BE( ctx->state[4], output, 16 ); } +#endif /* !POLARSSL_SHA1_ALT */ + /* * output = SHA-1( input buffer ) */ -void sha1( unsigned char *input, int ilen, unsigned char output[20] ) +void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ) { sha1_context ctx; @@ -327,26 +327,24 @@ void sha1( unsigned char *input, int ilen, unsigned char output[20] ) memset( &ctx, 0, sizeof( sha1_context ) ); } +#if defined(POLARSSL_FS_IO) /* * output = SHA-1( file contents ) */ -int sha1_file( char *path, unsigned char output[20] ) +int sha1_file( const char *path, unsigned char output[20] ) { FILE *f; size_t n; sha1_context ctx; unsigned char buf[1024]; - File::IOFile file(path, "rb"); - f = file.GetHandle(); - - if (f == NULL) - return( 1 ); + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_SHA1_FILE_IO_ERROR ); sha1_starts( &ctx ); while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) - sha1_update( &ctx, buf, (int) n ); + sha1_update( &ctx, buf, n ); sha1_finish( &ctx, output ); @@ -354,18 +352,21 @@ int sha1_file( char *path, unsigned char output[20] ) if( ferror( f ) != 0 ) { - return( 2 ); + fclose( f ); + return( POLARSSL_ERR_SHA1_FILE_IO_ERROR ); } + fclose( f ); return( 0 ); } +#endif /* POLARSSL_FS_IO */ /* * SHA-1 HMAC context setup */ -void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ) +void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ) { - int i; + size_t i; unsigned char sum[20]; if( keylen > 64 ) @@ -393,7 +394,7 @@ void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ) /* * SHA-1 HMAC process buffer */ -void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen ) +void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) { sha1_update( ctx, input, ilen ); } @@ -414,11 +415,20 @@ void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ) memset( tmpbuf, 0, sizeof( tmpbuf ) ); } +/* + * SHA1 HMAC context reset + */ +void sha1_hmac_reset( sha1_context *ctx ) +{ + sha1_starts( ctx ); + sha1_update( ctx, ctx->ipad, 64 ); +} + /* * output = HMAC-SHA-1( hmac key, input buffer ) */ -void sha1_hmac( unsigned char *key, int keylen, - unsigned char *input, int ilen, +void sha1_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, unsigned char output[20] ) { sha1_context ctx; @@ -611,4 +621,4 @@ int sha1_self_test( int verbose ) #endif -//#endif +#endif diff --git a/Externals/polarssl/library/sha2.c b/Externals/polarssl/library/sha2.c new file mode 100644 index 0000000000..20772eca26 --- /dev/null +++ b/Externals/polarssl/library/sha2.c @@ -0,0 +1,705 @@ +/* + * FIPS-180-2 compliant SHA-256 implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The SHA-256 Secure Hash Standard was published by NIST in 2002. + * + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SHA2_C) + +#include "polarssl/sha2.h" + +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if !defined(POLARSSL_SHA2_ALT) + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +/* + * SHA-256 context setup + */ +void sha2_starts( sha2_context *ctx, int is224 ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + if( is224 == 0 ) + { + /* SHA-256 */ + ctx->state[0] = 0x6A09E667; + ctx->state[1] = 0xBB67AE85; + ctx->state[2] = 0x3C6EF372; + ctx->state[3] = 0xA54FF53A; + ctx->state[4] = 0x510E527F; + ctx->state[5] = 0x9B05688C; + ctx->state[6] = 0x1F83D9AB; + ctx->state[7] = 0x5BE0CD19; + } + else + { + /* SHA-224 */ + ctx->state[0] = 0xC1059ED8; + ctx->state[1] = 0x367CD507; + ctx->state[2] = 0x3070DD17; + ctx->state[3] = 0xF70E5939; + ctx->state[4] = 0xFFC00B31; + ctx->state[5] = 0x68581511; + ctx->state[6] = 0x64F98FA7; + ctx->state[7] = 0xBEFA4FA4; + } + + ctx->is224 = is224; +} + +void sha2_process( sha2_context *ctx, const unsigned char data[64] ) +{ + uint32_t temp1, temp2, W[64]; + uint32_t A, B, C, D, E, F, G, H; + + GET_UINT32_BE( W[ 0], data, 0 ); + GET_UINT32_BE( W[ 1], data, 4 ); + GET_UINT32_BE( W[ 2], data, 8 ); + GET_UINT32_BE( W[ 3], data, 12 ); + GET_UINT32_BE( W[ 4], data, 16 ); + GET_UINT32_BE( W[ 5], data, 20 ); + GET_UINT32_BE( W[ 6], data, 24 ); + GET_UINT32_BE( W[ 7], data, 28 ); + GET_UINT32_BE( W[ 8], data, 32 ); + GET_UINT32_BE( W[ 9], data, 36 ); + GET_UINT32_BE( W[10], data, 40 ); + GET_UINT32_BE( W[11], data, 44 ); + GET_UINT32_BE( W[12], data, 48 ); + GET_UINT32_BE( W[13], data, 52 ); + GET_UINT32_BE( W[14], data, 56 ); + GET_UINT32_BE( W[15], data, 60 ); + +#define SHR(x,n) ((x & 0xFFFFFFFF) >> n) +#define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) + +#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) +#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) + +#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) +#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) + +#define F0(x,y,z) ((x & y) | (z & (x | y))) +#define F1(x,y,z) (z ^ (x & (y ^ z))) + +#define R(t) \ +( \ + W[t] = S1(W[t - 2]) + W[t - 7] + \ + S0(W[t - 15]) + W[t - 16] \ +) + +#define P(a,b,c,d,e,f,g,h,x,K) \ +{ \ + temp1 = h + S3(e) + F1(e,f,g) + K + x; \ + temp2 = S2(a) + F0(a,b,c); \ + d += temp1; h = temp1 + temp2; \ +} + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + + P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 ); + P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 ); + P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF ); + P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 ); + P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B ); + P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 ); + P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 ); + P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 ); + P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 ); + P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 ); + P( G, H, A, B, C, D, E, F, W[10], 0x243185BE ); + P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 ); + P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 ); + P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE ); + P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 ); + P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 ); + P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 ); + P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 ); + P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 ); + P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC ); + P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F ); + P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA ); + P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC ); + P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA ); + P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 ); + P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D ); + P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 ); + P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 ); + P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 ); + P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 ); + P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 ); + P( B, C, D, E, F, G, H, A, R(31), 0x14292967 ); + P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 ); + P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 ); + P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC ); + P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 ); + P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 ); + P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB ); + P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E ); + P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 ); + P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 ); + P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B ); + P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 ); + P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 ); + P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 ); + P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 ); + P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 ); + P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 ); + P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 ); + P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 ); + P( G, H, A, B, C, D, E, F, R(50), 0x2748774C ); + P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 ); + P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 ); + P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A ); + P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F ); + P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 ); + P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE ); + P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F ); + P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 ); + P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 ); + P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA ); + P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB ); + P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 ); + P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 ); + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; + ctx->state[5] += F; + ctx->state[6] += G; + ctx->state[7] += H; +} + +/* + * SHA-256 process buffer + */ +void sha2_update( sha2_context *ctx, const unsigned char *input, size_t ilen ) +{ + size_t fill; + uint32_t left; + + if( ilen <= 0 ) + return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if( ctx->total[0] < (uint32_t) ilen ) + ctx->total[1]++; + + if( left && ilen >= fill ) + { + memcpy( (void *) (ctx->buffer + left), input, fill ); + sha2_process( ctx, ctx->buffer ); + input += fill; + ilen -= fill; + left = 0; + } + + while( ilen >= 64 ) + { + sha2_process( ctx, input ); + input += 64; + ilen -= 64; + } + + if( ilen > 0 ) + memcpy( (void *) (ctx->buffer + left), input, ilen ); +} + +static const unsigned char sha2_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * SHA-256 final digest + */ +void sha2_finish( sha2_context *ctx, unsigned char output[32] ) +{ + uint32_t last, padn; + uint32_t high, low; + unsigned char msglen[8]; + + high = ( ctx->total[0] >> 29 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT32_BE( high, msglen, 0 ); + PUT_UINT32_BE( low, msglen, 4 ); + + last = ctx->total[0] & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + sha2_update( ctx, sha2_padding, padn ); + sha2_update( ctx, msglen, 8 ); + + PUT_UINT32_BE( ctx->state[0], output, 0 ); + PUT_UINT32_BE( ctx->state[1], output, 4 ); + PUT_UINT32_BE( ctx->state[2], output, 8 ); + PUT_UINT32_BE( ctx->state[3], output, 12 ); + PUT_UINT32_BE( ctx->state[4], output, 16 ); + PUT_UINT32_BE( ctx->state[5], output, 20 ); + PUT_UINT32_BE( ctx->state[6], output, 24 ); + + if( ctx->is224 == 0 ) + PUT_UINT32_BE( ctx->state[7], output, 28 ); +} + +#endif /* !POLARSSL_SHA2_ALT */ + +/* + * output = SHA-256( input buffer ) + */ +void sha2( const unsigned char *input, size_t ilen, + unsigned char output[32], int is224 ) +{ + sha2_context ctx; + + sha2_starts( &ctx, is224 ); + sha2_update( &ctx, input, ilen ); + sha2_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha2_context ) ); +} + +#if defined(POLARSSL_FS_IO) +/* + * output = SHA-256( file contents ) + */ +int sha2_file( const char *path, unsigned char output[32], int is224 ) +{ + FILE *f; + size_t n; + sha2_context ctx; + unsigned char buf[1024]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_SHA2_FILE_IO_ERROR ); + + sha2_starts( &ctx, is224 ); + + while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + sha2_update( &ctx, buf, n ); + + sha2_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha2_context ) ); + + if( ferror( f ) != 0 ) + { + fclose( f ); + return( POLARSSL_ERR_SHA2_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * SHA-256 HMAC context setup + */ +void sha2_hmac_starts( sha2_context *ctx, const unsigned char *key, size_t keylen, + int is224 ) +{ + size_t i; + unsigned char sum[32]; + + if( keylen > 64 ) + { + sha2( key, keylen, sum, is224 ); + keylen = ( is224 ) ? 28 : 32; + key = sum; + } + + memset( ctx->ipad, 0x36, 64 ); + memset( ctx->opad, 0x5C, 64 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + sha2_starts( ctx, is224 ); + sha2_update( ctx, ctx->ipad, 64 ); + + memset( sum, 0, sizeof( sum ) ); +} + +/* + * SHA-256 HMAC process buffer + */ +void sha2_hmac_update( sha2_context *ctx, const unsigned char *input, size_t ilen ) +{ + sha2_update( ctx, input, ilen ); +} + +/* + * SHA-256 HMAC final digest + */ +void sha2_hmac_finish( sha2_context *ctx, unsigned char output[32] ) +{ + int is224, hlen; + unsigned char tmpbuf[32]; + + is224 = ctx->is224; + hlen = ( is224 == 0 ) ? 32 : 28; + + sha2_finish( ctx, tmpbuf ); + sha2_starts( ctx, is224 ); + sha2_update( ctx, ctx->opad, 64 ); + sha2_update( ctx, tmpbuf, hlen ); + sha2_finish( ctx, output ); + + memset( tmpbuf, 0, sizeof( tmpbuf ) ); +} + +/* + * SHA-256 HMAC context reset + */ +void sha2_hmac_reset( sha2_context *ctx ) +{ + sha2_starts( ctx, ctx->is224 ); + sha2_update( ctx, ctx->ipad, 64 ); +} + +/* + * output = HMAC-SHA-256( hmac key, input buffer ) + */ +void sha2_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[32], int is224 ) +{ + sha2_context ctx; + + sha2_hmac_starts( &ctx, key, keylen, is224 ); + sha2_hmac_update( &ctx, input, ilen ); + sha2_hmac_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha2_context ) ); +} + +#if defined(POLARSSL_SELF_TEST) +/* + * FIPS-180-2 test vectors + */ +static unsigned char sha2_test_buf[3][57] = +{ + { "abc" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { "" } +}; + +static const int sha2_test_buflen[3] = +{ + 3, 56, 1000 +}; + +static const unsigned char sha2_test_sum[6][32] = +{ + /* + * SHA-224 test vectors + */ + { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22, + 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3, + 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7, + 0xE3, 0x6C, 0x9D, 0xA7 }, + { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC, + 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50, + 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19, + 0x52, 0x52, 0x25, 0x25 }, + { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8, + 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B, + 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE, + 0x4E, 0xE7, 0xAD, 0x67 }, + + /* + * SHA-256 test vectors + */ + { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, + 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, + 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, + 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD }, + { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8, + 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39, + 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67, + 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 }, + { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92, + 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67, + 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E, + 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 } +}; + +/* + * RFC 4231 test vectors + */ +static unsigned char sha2_hmac_test_key[7][26] = +{ + { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B" + "\x0B\x0B\x0B\x0B" }, + { "Jefe" }, + { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + "\xAA\xAA\xAA\xAA" }, + { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10" + "\x11\x12\x13\x14\x15\x16\x17\x18\x19" }, + { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C" + "\x0C\x0C\x0C\x0C" }, + { "" }, /* 0xAA 131 times */ + { "" } +}; + +static const int sha2_hmac_test_keylen[7] = +{ + 20, 4, 20, 25, 20, 131, 131 +}; + +static unsigned char sha2_hmac_test_buf[7][153] = +{ + { "Hi There" }, + { "what do ya want for nothing?" }, + { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" }, + { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" }, + { "Test With Truncation" }, + { "Test Using Larger Than Block-Size Key - Hash Key First" }, + { "This is a test using a larger than block-size key " + "and a larger than block-size data. The key needs to " + "be hashed before being used by the HMAC algorithm." } +}; + +static const int sha2_hmac_test_buflen[7] = +{ + 8, 28, 50, 50, 20, 54, 152 +}; + +static const unsigned char sha2_hmac_test_sum[14][32] = +{ + /* + * HMAC-SHA-224 test vectors + */ + { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19, + 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F, + 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F, + 0x53, 0x68, 0x4B, 0x22 }, + { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF, + 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F, + 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00, + 0x8F, 0xD0, 0x5E, 0x44 }, + { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6, + 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64, + 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1, + 0xEC, 0x83, 0x33, 0xEA }, + { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC, + 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C, + 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D, + 0xE7, 0xAF, 0xEC, 0x5A }, + { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37, + 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 }, + { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD, + 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2, + 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27, + 0x3F, 0xA6, 0x87, 0x0E }, + { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02, + 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD, + 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9, + 0xF6, 0xF5, 0x65, 0xD1 }, + + /* + * HMAC-SHA-256 test vectors + */ + { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53, + 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B, + 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7, + 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 }, + { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E, + 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7, + 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83, + 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 }, + { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46, + 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7, + 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22, + 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE }, + { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E, + 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A, + 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07, + 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B }, + { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0, + 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B }, + { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F, + 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F, + 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14, + 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 }, + { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB, + 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44, + 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93, + 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 } +}; + +/* + * Checkup routine + */ +int sha2_self_test( int verbose ) +{ + int i, j, k, buflen; + unsigned char buf[1024]; + unsigned char sha2sum[32]; + sha2_context ctx; + + for( i = 0; i < 6; i++ ) + { + j = i % 3; + k = i < 3; + + if( verbose != 0 ) + printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 ); + + sha2_starts( &ctx, k ); + + if( j == 2 ) + { + memset( buf, 'a', buflen = 1000 ); + + for( j = 0; j < 1000; j++ ) + sha2_update( &ctx, buf, buflen ); + } + else + sha2_update( &ctx, sha2_test_buf[j], + sha2_test_buflen[j] ); + + sha2_finish( &ctx, sha2sum ); + + if( memcmp( sha2sum, sha2_test_sum[i], 32 - k * 4 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + for( i = 0; i < 14; i++ ) + { + j = i % 7; + k = i < 7; + + if( verbose != 0 ) + printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 ); + + if( j == 5 || j == 6 ) + { + memset( buf, '\xAA', buflen = 131 ); + sha2_hmac_starts( &ctx, buf, buflen, k ); + } + else + sha2_hmac_starts( &ctx, sha2_hmac_test_key[j], + sha2_hmac_test_keylen[j], k ); + + sha2_hmac_update( &ctx, sha2_hmac_test_buf[j], + sha2_hmac_test_buflen[j] ); + + sha2_hmac_finish( &ctx, sha2sum ); + + buflen = ( j == 4 ) ? 16 : 32 - k * 4; + + if( memcmp( sha2sum, sha2_hmac_test_sum[i], buflen ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/sha4.c b/Externals/polarssl/library/sha4.c new file mode 100644 index 0000000000..466420abf5 --- /dev/null +++ b/Externals/polarssl/library/sha4.c @@ -0,0 +1,760 @@ +/* + * FIPS-180-2 compliant SHA-384/512 implementation + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The SHA-512 Secure Hash Standard was published by NIST in 2002. + * + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SHA4_C) + +#include "polarssl/sha4.h" + +#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) +#include +#endif + +#if !defined(POLARSSL_SHA4_ALT) + +/* + * 64-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT64_BE +#define GET_UINT64_BE(n,b,i) \ +{ \ + (n) = ( (uint64_t) (b)[(i) ] << 56 ) \ + | ( (uint64_t) (b)[(i) + 1] << 48 ) \ + | ( (uint64_t) (b)[(i) + 2] << 40 ) \ + | ( (uint64_t) (b)[(i) + 3] << 32 ) \ + | ( (uint64_t) (b)[(i) + 4] << 24 ) \ + | ( (uint64_t) (b)[(i) + 5] << 16 ) \ + | ( (uint64_t) (b)[(i) + 6] << 8 ) \ + | ( (uint64_t) (b)[(i) + 7] ); \ +} +#endif + +#ifndef PUT_UINT64_BE +#define PUT_UINT64_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ + (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 7] = (unsigned char) ( (n) ); \ +} +#endif + +/* + * Round constants + */ +static const uint64_t K[80] = +{ + UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), + UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), + UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), + UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), + UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), + UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), + UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), + UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), + UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), + UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), + UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), + UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), + UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), + UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), + UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), + UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), + UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), + UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), + UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), + UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), + UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), + UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), + UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), + UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), + UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), + UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), + UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), + UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), + UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), + UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), + UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), + UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), + UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), + UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), + UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), + UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), + UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), + UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), + UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), + UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) +}; + +/* + * SHA-512 context setup + */ +void sha4_starts( sha4_context *ctx, int is384 ) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + if( is384 == 0 ) + { + /* SHA-512 */ + ctx->state[0] = UL64(0x6A09E667F3BCC908); + ctx->state[1] = UL64(0xBB67AE8584CAA73B); + ctx->state[2] = UL64(0x3C6EF372FE94F82B); + ctx->state[3] = UL64(0xA54FF53A5F1D36F1); + ctx->state[4] = UL64(0x510E527FADE682D1); + ctx->state[5] = UL64(0x9B05688C2B3E6C1F); + ctx->state[6] = UL64(0x1F83D9ABFB41BD6B); + ctx->state[7] = UL64(0x5BE0CD19137E2179); + } + else + { + /* SHA-384 */ + ctx->state[0] = UL64(0xCBBB9D5DC1059ED8); + ctx->state[1] = UL64(0x629A292A367CD507); + ctx->state[2] = UL64(0x9159015A3070DD17); + ctx->state[3] = UL64(0x152FECD8F70E5939); + ctx->state[4] = UL64(0x67332667FFC00B31); + ctx->state[5] = UL64(0x8EB44A8768581511); + ctx->state[6] = UL64(0xDB0C2E0D64F98FA7); + ctx->state[7] = UL64(0x47B5481DBEFA4FA4); + } + + ctx->is384 = is384; +} + +static void sha4_process( sha4_context *ctx, const unsigned char data[128] ) +{ + int i; + uint64_t temp1, temp2, W[80]; + uint64_t A, B, C, D, E, F, G, H; + +#define SHR(x,n) (x >> n) +#define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) + +#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) +#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) + +#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) +#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) + +#define F0(x,y,z) ((x & y) | (z & (x | y))) +#define F1(x,y,z) (z ^ (x & (y ^ z))) + +#define P(a,b,c,d,e,f,g,h,x,K) \ +{ \ + temp1 = h + S3(e) + F1(e,f,g) + K + x; \ + temp2 = S2(a) + F0(a,b,c); \ + d += temp1; h = temp1 + temp2; \ +} + + for( i = 0; i < 16; i++ ) + { + GET_UINT64_BE( W[i], data, i << 3 ); + } + + for( ; i < 80; i++ ) + { + W[i] = S1(W[i - 2]) + W[i - 7] + + S0(W[i - 15]) + W[i - 16]; + } + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + i = 0; + + do + { + P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; + P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; + P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; + P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; + P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; + P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; + P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; + P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; + } + while( i < 80 ); + + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; + ctx->state[5] += F; + ctx->state[6] += G; + ctx->state[7] += H; +} + +/* + * SHA-512 process buffer + */ +void sha4_update( sha4_context *ctx, const unsigned char *input, size_t ilen ) +{ + size_t fill; + unsigned int left; + + if( ilen <= 0 ) + return; + + left = (unsigned int) (ctx->total[0] & 0x7F); + fill = 128 - left; + + ctx->total[0] += (uint64_t) ilen; + + if( ctx->total[0] < (uint64_t) ilen ) + ctx->total[1]++; + + if( left && ilen >= fill ) + { + memcpy( (void *) (ctx->buffer + left), input, fill ); + sha4_process( ctx, ctx->buffer ); + input += fill; + ilen -= fill; + left = 0; + } + + while( ilen >= 128 ) + { + sha4_process( ctx, input ); + input += 128; + ilen -= 128; + } + + if( ilen > 0 ) + memcpy( (void *) (ctx->buffer + left), input, ilen ); +} + +static const unsigned char sha4_padding[128] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * SHA-512 final digest + */ +void sha4_finish( sha4_context *ctx, unsigned char output[64] ) +{ + size_t last, padn; + uint64_t high, low; + unsigned char msglen[16]; + + high = ( ctx->total[0] >> 61 ) + | ( ctx->total[1] << 3 ); + low = ( ctx->total[0] << 3 ); + + PUT_UINT64_BE( high, msglen, 0 ); + PUT_UINT64_BE( low, msglen, 8 ); + + last = (size_t)( ctx->total[0] & 0x7F ); + padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last ); + + sha4_update( ctx, sha4_padding, padn ); + sha4_update( ctx, msglen, 16 ); + + PUT_UINT64_BE( ctx->state[0], output, 0 ); + PUT_UINT64_BE( ctx->state[1], output, 8 ); + PUT_UINT64_BE( ctx->state[2], output, 16 ); + PUT_UINT64_BE( ctx->state[3], output, 24 ); + PUT_UINT64_BE( ctx->state[4], output, 32 ); + PUT_UINT64_BE( ctx->state[5], output, 40 ); + + if( ctx->is384 == 0 ) + { + PUT_UINT64_BE( ctx->state[6], output, 48 ); + PUT_UINT64_BE( ctx->state[7], output, 56 ); + } +} + +#endif /* !POLARSSL_SHA4_ALT */ + +/* + * output = SHA-512( input buffer ) + */ +void sha4( const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ) +{ + sha4_context ctx; + + sha4_starts( &ctx, is384 ); + sha4_update( &ctx, input, ilen ); + sha4_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha4_context ) ); +} + +#if defined(POLARSSL_FS_IO) +/* + * output = SHA-512( file contents ) + */ +int sha4_file( const char *path, unsigned char output[64], int is384 ) +{ + FILE *f; + size_t n; + sha4_context ctx; + unsigned char buf[1024]; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_SHA4_FILE_IO_ERROR ); + + sha4_starts( &ctx, is384 ); + + while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) + sha4_update( &ctx, buf, n ); + + sha4_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha4_context ) ); + + if( ferror( f ) != 0 ) + { + fclose( f ); + return( POLARSSL_ERR_SHA4_FILE_IO_ERROR ); + } + + fclose( f ); + return( 0 ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * SHA-512 HMAC context setup + */ +void sha4_hmac_starts( sha4_context *ctx, const unsigned char *key, size_t keylen, + int is384 ) +{ + size_t i; + unsigned char sum[64]; + + if( keylen > 128 ) + { + sha4( key, keylen, sum, is384 ); + keylen = ( is384 ) ? 48 : 64; + key = sum; + } + + memset( ctx->ipad, 0x36, 128 ); + memset( ctx->opad, 0x5C, 128 ); + + for( i = 0; i < keylen; i++ ) + { + ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); + ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); + } + + sha4_starts( ctx, is384 ); + sha4_update( ctx, ctx->ipad, 128 ); + + memset( sum, 0, sizeof( sum ) ); +} + +/* + * SHA-512 HMAC process buffer + */ +void sha4_hmac_update( sha4_context *ctx, + const unsigned char *input, size_t ilen ) +{ + sha4_update( ctx, input, ilen ); +} + +/* + * SHA-512 HMAC final digest + */ +void sha4_hmac_finish( sha4_context *ctx, unsigned char output[64] ) +{ + int is384, hlen; + unsigned char tmpbuf[64]; + + is384 = ctx->is384; + hlen = ( is384 == 0 ) ? 64 : 48; + + sha4_finish( ctx, tmpbuf ); + sha4_starts( ctx, is384 ); + sha4_update( ctx, ctx->opad, 128 ); + sha4_update( ctx, tmpbuf, hlen ); + sha4_finish( ctx, output ); + + memset( tmpbuf, 0, sizeof( tmpbuf ) ); +} + +/* + * SHA-512 HMAC context reset + */ +void sha4_hmac_reset( sha4_context *ctx ) +{ + sha4_starts( ctx, ctx->is384 ); + sha4_update( ctx, ctx->ipad, 128 ); +} + +/* + * output = HMAC-SHA-512( hmac key, input buffer ) + */ +void sha4_hmac( const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char output[64], int is384 ) +{ + sha4_context ctx; + + sha4_hmac_starts( &ctx, key, keylen, is384 ); + sha4_hmac_update( &ctx, input, ilen ); + sha4_hmac_finish( &ctx, output ); + + memset( &ctx, 0, sizeof( sha4_context ) ); +} + +#if defined(POLARSSL_SELF_TEST) + +/* + * FIPS-180-2 test vectors + */ +static unsigned char sha4_test_buf[3][113] = +{ + { "abc" }, + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, + { "" } +}; + +static const int sha4_test_buflen[3] = +{ + 3, 112, 1000 +}; + +static const unsigned char sha4_test_sum[6][64] = +{ + /* + * SHA-384 test vectors + */ + { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, + 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, + 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, + 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, + 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, + 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, + { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, + 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, + 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, + 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, + 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, + 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, + { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, + 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, + 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, + 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, + 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, + 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, + + /* + * SHA-512 test vectors + */ + { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, + 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, + 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, + 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, + 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, + 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, + 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, + 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, + { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, + 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, + 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, + 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, + 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, + 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, + 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, + 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, + { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, + 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, + 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, + 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, + 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, + 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, + 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, + 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } +}; + +/* + * RFC 4231 test vectors + */ +static unsigned char sha4_hmac_test_key[7][26] = +{ + { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B" + "\x0B\x0B\x0B\x0B" }, + { "Jefe" }, + { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + "\xAA\xAA\xAA\xAA" }, + { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10" + "\x11\x12\x13\x14\x15\x16\x17\x18\x19" }, + { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C" + "\x0C\x0C\x0C\x0C" }, + { "" }, /* 0xAA 131 times */ + { "" } +}; + +static const int sha4_hmac_test_keylen[7] = +{ + 20, 4, 20, 25, 20, 131, 131 +}; + +static unsigned char sha4_hmac_test_buf[7][153] = +{ + { "Hi There" }, + { "what do ya want for nothing?" }, + { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" + "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" }, + { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" + "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" }, + { "Test With Truncation" }, + { "Test Using Larger Than Block-Size Key - Hash Key First" }, + { "This is a test using a larger than block-size key " + "and a larger than block-size data. The key needs to " + "be hashed before being used by the HMAC algorithm." } +}; + +static const int sha4_hmac_test_buflen[7] = +{ + 8, 28, 50, 50, 20, 54, 152 +}; + +static const unsigned char sha4_hmac_test_sum[14][64] = +{ + /* + * HMAC-SHA-384 test vectors + */ + { 0xAF, 0xD0, 0x39, 0x44, 0xD8, 0x48, 0x95, 0x62, + 0x6B, 0x08, 0x25, 0xF4, 0xAB, 0x46, 0x90, 0x7F, + 0x15, 0xF9, 0xDA, 0xDB, 0xE4, 0x10, 0x1E, 0xC6, + 0x82, 0xAA, 0x03, 0x4C, 0x7C, 0xEB, 0xC5, 0x9C, + 0xFA, 0xEA, 0x9E, 0xA9, 0x07, 0x6E, 0xDE, 0x7F, + 0x4A, 0xF1, 0x52, 0xE8, 0xB2, 0xFA, 0x9C, 0xB6 }, + { 0xAF, 0x45, 0xD2, 0xE3, 0x76, 0x48, 0x40, 0x31, + 0x61, 0x7F, 0x78, 0xD2, 0xB5, 0x8A, 0x6B, 0x1B, + 0x9C, 0x7E, 0xF4, 0x64, 0xF5, 0xA0, 0x1B, 0x47, + 0xE4, 0x2E, 0xC3, 0x73, 0x63, 0x22, 0x44, 0x5E, + 0x8E, 0x22, 0x40, 0xCA, 0x5E, 0x69, 0xE2, 0xC7, + 0x8B, 0x32, 0x39, 0xEC, 0xFA, 0xB2, 0x16, 0x49 }, + { 0x88, 0x06, 0x26, 0x08, 0xD3, 0xE6, 0xAD, 0x8A, + 0x0A, 0xA2, 0xAC, 0xE0, 0x14, 0xC8, 0xA8, 0x6F, + 0x0A, 0xA6, 0x35, 0xD9, 0x47, 0xAC, 0x9F, 0xEB, + 0xE8, 0x3E, 0xF4, 0xE5, 0x59, 0x66, 0x14, 0x4B, + 0x2A, 0x5A, 0xB3, 0x9D, 0xC1, 0x38, 0x14, 0xB9, + 0x4E, 0x3A, 0xB6, 0xE1, 0x01, 0xA3, 0x4F, 0x27 }, + { 0x3E, 0x8A, 0x69, 0xB7, 0x78, 0x3C, 0x25, 0x85, + 0x19, 0x33, 0xAB, 0x62, 0x90, 0xAF, 0x6C, 0xA7, + 0x7A, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9C, + 0xC5, 0x57, 0x7C, 0x6E, 0x1F, 0x57, 0x3B, 0x4E, + 0x68, 0x01, 0xDD, 0x23, 0xC4, 0xA7, 0xD6, 0x79, + 0xCC, 0xF8, 0xA3, 0x86, 0xC6, 0x74, 0xCF, 0xFB }, + { 0x3A, 0xBF, 0x34, 0xC3, 0x50, 0x3B, 0x2A, 0x23, + 0xA4, 0x6E, 0xFC, 0x61, 0x9B, 0xAE, 0xF8, 0x97 }, + { 0x4E, 0xCE, 0x08, 0x44, 0x85, 0x81, 0x3E, 0x90, + 0x88, 0xD2, 0xC6, 0x3A, 0x04, 0x1B, 0xC5, 0xB4, + 0x4F, 0x9E, 0xF1, 0x01, 0x2A, 0x2B, 0x58, 0x8F, + 0x3C, 0xD1, 0x1F, 0x05, 0x03, 0x3A, 0xC4, 0xC6, + 0x0C, 0x2E, 0xF6, 0xAB, 0x40, 0x30, 0xFE, 0x82, + 0x96, 0x24, 0x8D, 0xF1, 0x63, 0xF4, 0x49, 0x52 }, + { 0x66, 0x17, 0x17, 0x8E, 0x94, 0x1F, 0x02, 0x0D, + 0x35, 0x1E, 0x2F, 0x25, 0x4E, 0x8F, 0xD3, 0x2C, + 0x60, 0x24, 0x20, 0xFE, 0xB0, 0xB8, 0xFB, 0x9A, + 0xDC, 0xCE, 0xBB, 0x82, 0x46, 0x1E, 0x99, 0xC5, + 0xA6, 0x78, 0xCC, 0x31, 0xE7, 0x99, 0x17, 0x6D, + 0x38, 0x60, 0xE6, 0x11, 0x0C, 0x46, 0x52, 0x3E }, + + /* + * HMAC-SHA-512 test vectors + */ + { 0x87, 0xAA, 0x7C, 0xDE, 0xA5, 0xEF, 0x61, 0x9D, + 0x4F, 0xF0, 0xB4, 0x24, 0x1A, 0x1D, 0x6C, 0xB0, + 0x23, 0x79, 0xF4, 0xE2, 0xCE, 0x4E, 0xC2, 0x78, + 0x7A, 0xD0, 0xB3, 0x05, 0x45, 0xE1, 0x7C, 0xDE, + 0xDA, 0xA8, 0x33, 0xB7, 0xD6, 0xB8, 0xA7, 0x02, + 0x03, 0x8B, 0x27, 0x4E, 0xAE, 0xA3, 0xF4, 0xE4, + 0xBE, 0x9D, 0x91, 0x4E, 0xEB, 0x61, 0xF1, 0x70, + 0x2E, 0x69, 0x6C, 0x20, 0x3A, 0x12, 0x68, 0x54 }, + { 0x16, 0x4B, 0x7A, 0x7B, 0xFC, 0xF8, 0x19, 0xE2, + 0xE3, 0x95, 0xFB, 0xE7, 0x3B, 0x56, 0xE0, 0xA3, + 0x87, 0xBD, 0x64, 0x22, 0x2E, 0x83, 0x1F, 0xD6, + 0x10, 0x27, 0x0C, 0xD7, 0xEA, 0x25, 0x05, 0x54, + 0x97, 0x58, 0xBF, 0x75, 0xC0, 0x5A, 0x99, 0x4A, + 0x6D, 0x03, 0x4F, 0x65, 0xF8, 0xF0, 0xE6, 0xFD, + 0xCA, 0xEA, 0xB1, 0xA3, 0x4D, 0x4A, 0x6B, 0x4B, + 0x63, 0x6E, 0x07, 0x0A, 0x38, 0xBC, 0xE7, 0x37 }, + { 0xFA, 0x73, 0xB0, 0x08, 0x9D, 0x56, 0xA2, 0x84, + 0xEF, 0xB0, 0xF0, 0x75, 0x6C, 0x89, 0x0B, 0xE9, + 0xB1, 0xB5, 0xDB, 0xDD, 0x8E, 0xE8, 0x1A, 0x36, + 0x55, 0xF8, 0x3E, 0x33, 0xB2, 0x27, 0x9D, 0x39, + 0xBF, 0x3E, 0x84, 0x82, 0x79, 0xA7, 0x22, 0xC8, + 0x06, 0xB4, 0x85, 0xA4, 0x7E, 0x67, 0xC8, 0x07, + 0xB9, 0x46, 0xA3, 0x37, 0xBE, 0xE8, 0x94, 0x26, + 0x74, 0x27, 0x88, 0x59, 0xE1, 0x32, 0x92, 0xFB }, + { 0xB0, 0xBA, 0x46, 0x56, 0x37, 0x45, 0x8C, 0x69, + 0x90, 0xE5, 0xA8, 0xC5, 0xF6, 0x1D, 0x4A, 0xF7, + 0xE5, 0x76, 0xD9, 0x7F, 0xF9, 0x4B, 0x87, 0x2D, + 0xE7, 0x6F, 0x80, 0x50, 0x36, 0x1E, 0xE3, 0xDB, + 0xA9, 0x1C, 0xA5, 0xC1, 0x1A, 0xA2, 0x5E, 0xB4, + 0xD6, 0x79, 0x27, 0x5C, 0xC5, 0x78, 0x80, 0x63, + 0xA5, 0xF1, 0x97, 0x41, 0x12, 0x0C, 0x4F, 0x2D, + 0xE2, 0xAD, 0xEB, 0xEB, 0x10, 0xA2, 0x98, 0xDD }, + { 0x41, 0x5F, 0xAD, 0x62, 0x71, 0x58, 0x0A, 0x53, + 0x1D, 0x41, 0x79, 0xBC, 0x89, 0x1D, 0x87, 0xA6 }, + { 0x80, 0xB2, 0x42, 0x63, 0xC7, 0xC1, 0xA3, 0xEB, + 0xB7, 0x14, 0x93, 0xC1, 0xDD, 0x7B, 0xE8, 0xB4, + 0x9B, 0x46, 0xD1, 0xF4, 0x1B, 0x4A, 0xEE, 0xC1, + 0x12, 0x1B, 0x01, 0x37, 0x83, 0xF8, 0xF3, 0x52, + 0x6B, 0x56, 0xD0, 0x37, 0xE0, 0x5F, 0x25, 0x98, + 0xBD, 0x0F, 0xD2, 0x21, 0x5D, 0x6A, 0x1E, 0x52, + 0x95, 0xE6, 0x4F, 0x73, 0xF6, 0x3F, 0x0A, 0xEC, + 0x8B, 0x91, 0x5A, 0x98, 0x5D, 0x78, 0x65, 0x98 }, + { 0xE3, 0x7B, 0x6A, 0x77, 0x5D, 0xC8, 0x7D, 0xBA, + 0xA4, 0xDF, 0xA9, 0xF9, 0x6E, 0x5E, 0x3F, 0xFD, + 0xDE, 0xBD, 0x71, 0xF8, 0x86, 0x72, 0x89, 0x86, + 0x5D, 0xF5, 0xA3, 0x2D, 0x20, 0xCD, 0xC9, 0x44, + 0xB6, 0x02, 0x2C, 0xAC, 0x3C, 0x49, 0x82, 0xB1, + 0x0D, 0x5E, 0xEB, 0x55, 0xC3, 0xE4, 0xDE, 0x15, + 0x13, 0x46, 0x76, 0xFB, 0x6D, 0xE0, 0x44, 0x60, + 0x65, 0xC9, 0x74, 0x40, 0xFA, 0x8C, 0x6A, 0x58 } +}; + +/* + * Checkup routine + */ +int sha4_self_test( int verbose ) +{ + int i, j, k, buflen; + unsigned char buf[1024]; + unsigned char sha4sum[64]; + sha4_context ctx; + + for( i = 0; i < 6; i++ ) + { + j = i % 3; + k = i < 3; + + if( verbose != 0 ) + printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 ); + + sha4_starts( &ctx, k ); + + if( j == 2 ) + { + memset( buf, 'a', buflen = 1000 ); + + for( j = 0; j < 1000; j++ ) + sha4_update( &ctx, buf, buflen ); + } + else + sha4_update( &ctx, sha4_test_buf[j], + sha4_test_buflen[j] ); + + sha4_finish( &ctx, sha4sum ); + + if( memcmp( sha4sum, sha4_test_sum[i], 64 - k * 16 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + for( i = 0; i < 14; i++ ) + { + j = i % 7; + k = i < 7; + + if( verbose != 0 ) + printf( " HMAC-SHA-%d test #%d: ", 512 - k * 128, j + 1 ); + + if( j == 5 || j == 6 ) + { + memset( buf, '\xAA', buflen = 131 ); + sha4_hmac_starts( &ctx, buf, buflen, k ); + } + else + sha4_hmac_starts( &ctx, sha4_hmac_test_key[j], + sha4_hmac_test_keylen[j], k ); + + sha4_hmac_update( &ctx, sha4_hmac_test_buf[j], + sha4_hmac_test_buflen[j] ); + + sha4_hmac_finish( &ctx, sha4sum ); + + buflen = ( j == 4 ) ? 16 : 64 - k * 16; + + if( memcmp( sha4sum, sha4_hmac_test_sum[i], buflen ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/library/ssl_cache.c b/Externals/polarssl/library/ssl_cache.c new file mode 100644 index 0000000000..f5686be047 --- /dev/null +++ b/Externals/polarssl/library/ssl_cache.c @@ -0,0 +1,221 @@ +/* + * SSL session cache implementation + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * These session callbacks use a simple chained list + * to store and retrieve the session information. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SSL_CACHE_C) + +#include "polarssl/ssl_cache.h" + +#include + +void ssl_cache_init( ssl_cache_context *cache ) +{ + memset( cache, 0, sizeof( ssl_cache_context ) ); + + cache->timeout = SSL_CACHE_DEFAULT_TIMEOUT; + cache->max_entries = SSL_CACHE_DEFAULT_MAX_ENTRIES; +} + +int ssl_cache_get( void *data, ssl_session *session ) +{ + time_t t = time( NULL ); + ssl_cache_context *cache = (ssl_cache_context *) data; + ssl_cache_entry *cur, *entry; + + cur = cache->chain; + entry = NULL; + + while( cur != NULL ) + { + entry = cur; + cur = cur->next; + + if( cache->timeout != 0 && + (int) ( t - entry->timestamp ) > cache->timeout ) + continue; + + if( session->ciphersuite != entry->session.ciphersuite || + session->compression != entry->session.compression || + session->length != entry->session.length ) + continue; + + if( memcmp( session->id, entry->session.id, + entry->session.length ) != 0 ) + continue; + + memcpy( session->master, entry->session.master, 48 ); + + /* + * Restore peer certificate (without rest of the original chain) + */ + if( entry->peer_cert.p != NULL ) + { + session->peer_cert = (x509_cert *) malloc( sizeof(x509_cert) ); + if( session->peer_cert == NULL ) + return( 1 ); + + memset( session->peer_cert, 0, sizeof(x509_cert) ); + if( x509parse_crt( session->peer_cert, entry->peer_cert.p, + entry->peer_cert.len ) != 0 ) + { + free( session->peer_cert ); + session->peer_cert = NULL; + return( 1 ); + } + } + + return( 0 ); + } + + return( 1 ); +} + +int ssl_cache_set( void *data, const ssl_session *session ) +{ + time_t t = time( NULL ), oldest = 0; + ssl_cache_context *cache = (ssl_cache_context *) data; + ssl_cache_entry *cur, *prv, *old = NULL; + int count = 0; + + cur = cache->chain; + prv = NULL; + + while( cur != NULL ) + { + count++; + + if( cache->timeout != 0 && + (int) ( t - cur->timestamp ) > cache->timeout ) + { + cur->timestamp = t; + break; /* expired, reuse this slot, update timestamp */ + } + + if( memcmp( session->id, cur->session.id, cur->session.length ) == 0 ) + break; /* client reconnected, keep timestamp for session id */ + + if( oldest == 0 || cur->timestamp < oldest ) + { + oldest = cur->timestamp; + old = cur; + } + + prv = cur; + cur = cur->next; + } + + if( cur == NULL ) + { + /* + * Reuse oldest entry if max_entries reached + */ + if( old != NULL && count >= cache->max_entries ) + { + cur = old; + memset( &cur->session, 0, sizeof(ssl_session) ); + if( cur->peer_cert.p != NULL ) + { + free( cur->peer_cert.p ); + memset( &cur->peer_cert, 0, sizeof(x509_buf) ); + } + } + else + { + cur = (ssl_cache_entry *) malloc( sizeof(ssl_cache_entry) ); + if( cur == NULL ) + return( 1 ); + + memset( cur, 0, sizeof(ssl_cache_entry) ); + + if( prv == NULL ) + cache->chain = cur; + else + prv->next = cur; + } + + cur->timestamp = t; + } + + memcpy( &cur->session, session, sizeof( ssl_session ) ); + + /* + * Store peer certificate + */ + if( session->peer_cert != NULL ) + { + cur->peer_cert.p = (unsigned char *) malloc( session->peer_cert->raw.len ); + if( cur->peer_cert.p == NULL ) + return( 1 ); + + memcpy( cur->peer_cert.p, session->peer_cert->raw.p, + session->peer_cert->raw.len ); + cur->peer_cert.len = session->peer_cert->raw.len; + + cur->session.peer_cert = NULL; + } + + return( 0 ); +} + +void ssl_cache_set_timeout( ssl_cache_context *cache, int timeout ) +{ + if( timeout < 0 ) timeout = 0; + + cache->timeout = timeout; +} + +void ssl_cache_set_max_entries( ssl_cache_context *cache, int max ) +{ + if( max < 0 ) max = 0; + + cache->max_entries = max; +} + +void ssl_cache_free( ssl_cache_context *cache ) +{ + ssl_cache_entry *cur, *prv; + + cur = cache->chain; + + while( cur != NULL ) + { + prv = cur; + cur = cur->next; + + ssl_session_free( &prv->session ); + + if( prv->peer_cert.p != NULL ) + free( prv->peer_cert.p ); + + free( prv ); + } +} + +#endif /* POLARSSL_SSL_CACHE_C */ diff --git a/Externals/polarssl/library/ssl_cli.c b/Externals/polarssl/library/ssl_cli.c new file mode 100644 index 0000000000..e4a102b90f --- /dev/null +++ b/Externals/polarssl/library/ssl_cli.c @@ -0,0 +1,1386 @@ +/* + * SSLv3/TLSv1 client-side functions + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SSL_CLI_C) + +#include "polarssl/debug.h" +#include "polarssl/ssl.h" + +#include +#include +#include + +#if defined(POLARSSL_SHA4_C) +#include "polarssl/sha4.h" +#endif + +static int ssl_write_client_hello( ssl_context *ssl ) +{ + int ret; + size_t i, n, ext_len = 0; + unsigned char *buf; + unsigned char *p; + time_t t; + unsigned char sig_alg_list[20]; + size_t sig_alg_len = 0; + + SSL_DEBUG_MSG( 2, ( "=> write client hello" ) ); + + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE ) + { + ssl->major_ver = ssl->min_major_ver; + ssl->minor_ver = ssl->min_minor_ver; + } + + if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 ) + { + ssl->max_major_ver = SSL_MAJOR_VERSION_3; + ssl->max_minor_ver = SSL_MINOR_VERSION_3; + } + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 highest version supported + * 6 . 9 current UNIX time + * 10 . 37 random bytes + */ + buf = ssl->out_msg; + p = buf + 4; + + *p++ = (unsigned char) ssl->max_major_ver; + *p++ = (unsigned char) ssl->max_minor_ver; + + SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]", + buf[4], buf[5] ) ); + + t = time( NULL ); + *p++ = (unsigned char)( t >> 24 ); + *p++ = (unsigned char)( t >> 16 ); + *p++ = (unsigned char)( t >> 8 ); + *p++ = (unsigned char)( t ); + + SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) ); + + if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 ) + return( ret ); + + p += 28; + + memcpy( ssl->handshake->randbytes, buf + 6, 32 ); + + SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 ); + + /* + * 38 . 38 session id length + * 39 . 39+n session id + * 40+n . 41+n ciphersuitelist length + * 42+n . .. ciphersuitelist + * .. . .. compression methods length + * .. . .. compression methods + * .. . .. extensions length + * .. . .. extensions + */ + n = ssl->session_negotiate->length; + + if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 || + ssl->handshake->resume == 0 ) + n = 0; + + *p++ = (unsigned char) n; + + for( i = 0; i < n; i++ ) + *p++ = ssl->session_negotiate->id[i]; + + SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) ); + SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n ); + + for( n = 0; ssl->ciphersuites[ssl->minor_ver][n] != 0; n++ ); + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE ) n++; + *p++ = (unsigned char)( n >> 7 ); + *p++ = (unsigned char)( n << 1 ); + + /* + * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE ) + { + *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 ); + *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO ); + n--; + } + + SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) ); + + for( i = 0; i < n; i++ ) + { + SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d", + ssl->ciphersuites[ssl->minor_ver][i] ) ); + + *p++ = (unsigned char)( ssl->ciphersuites[ssl->minor_ver][i] >> 8 ); + *p++ = (unsigned char)( ssl->ciphersuites[ssl->minor_ver][i] ); + } + +#if defined(POLARSSL_ZLIB_SUPPORT) + SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) ); + SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d", + SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) ); + + *p++ = 2; + *p++ = SSL_COMPRESS_DEFLATE; + *p++ = SSL_COMPRESS_NULL; +#else + SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) ); + SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) ); + + *p++ = 1; + *p++ = SSL_COMPRESS_NULL; +#endif + + if ( ssl->hostname != NULL ) + { + SSL_DEBUG_MSG( 3, ( "client hello, prepping for server name extension: %s", + ssl->hostname ) ); + + ext_len += ssl->hostname_len + 9; + } + + if( ssl->renegotiation == SSL_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 3, ( "client hello, prepping for renegotiation extension" ) ); + ext_len += 5 + ssl->verify_data_len; + } + + /* + * Prepare signature_algorithms extension (TLS 1.2) + */ + if( ssl->max_minor_ver == SSL_MINOR_VERSION_3 ) + { +#if defined(POLARSSL_SHA4_C) + sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; + sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; +#endif +#if defined(POLARSSL_SHA2_C) + sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; + sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; +#endif +#if defined(POLARSSL_SHA1_C) + sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; +#endif +#if defined(POLARSSL_MD5_C) + sig_alg_list[sig_alg_len++] = SSL_HASH_MD5; + sig_alg_list[sig_alg_len++] = SSL_SIG_RSA; +#endif + ext_len += 6 + sig_alg_len; + } + + SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d", + ext_len ) ); + + *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( ext_len ) & 0xFF ); + + if ( ssl->hostname != NULL ) + { + /* + * struct { + * NameType name_type; + * select (name_type) { + * case host_name: HostName; + * } name; + * } ServerName; + * + * enum { + * host_name(0), (255) + * } NameType; + * + * opaque HostName<1..2^16-1>; + * + * struct { + * ServerName server_name_list<1..2^16-1> + * } ServerNameList; + */ + SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s", + ssl->hostname ) ); + + *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF ); + + *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF ); + + *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF ); + + *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF ); + *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF ); + + memcpy( p, ssl->hostname, ssl->hostname_len ); + p += ssl->hostname_len; + } + + if( ssl->renegotiation == SSL_RENEGOTIATION ) + { + /* + * Secure renegotiation + */ + SSL_DEBUG_MSG( 3, ( "client hello, renegotiation info extension" ) ); + + *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); + + *p++ = 0x00; + *p++ = ( ssl->verify_data_len + 1 ) & 0xFF; + *p++ = ssl->verify_data_len & 0xFF; + + memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); + p += ssl->verify_data_len; + } + + if( ssl->max_minor_ver == SSL_MINOR_VERSION_3 ) + { + /* + * enum { + * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), + * sha512(6), (255) + * } HashAlgorithm; + * + * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } + * SignatureAlgorithm; + * + * struct { + * HashAlgorithm hash; + * SignatureAlgorithm signature; + * } SignatureAndHashAlgorithm; + * + * SignatureAndHashAlgorithm + * supported_signature_algorithms<2..2^16-2>; + */ + SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) ); + + *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF ); + + *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF ); + + *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF ); + + memcpy( p, sig_alg_list, sig_alg_len ); + + p += sig_alg_len; + } + + ssl->out_msglen = p - buf; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_CLIENT_HELLO; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write client hello" ) ); + + return( 0 ); +} + +static int ssl_parse_renegotiation_info( ssl_context *ssl, + unsigned char *buf, + size_t len ) +{ + int ret; + + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE ) + { + if( len != 1 || buf[0] != 0x0 ) + { + SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION; + } + else + { + if( len != 1 + ssl->verify_data_len * 2 || + buf[0] != ssl->verify_data_len * 2 || + memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 || + memcmp( buf + 1 + ssl->verify_data_len, + ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) + { + SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + } + + return( 0 ); +} + +static int ssl_parse_server_hello( ssl_context *ssl ) +{ +#if defined(POLARSSL_DEBUG_C) + time_t t; +#endif + int ret, i, comp; + size_t n; + size_t ext_len = 0; + unsigned char *buf, *ext; + int renegotiation_info_seen = 0; + int handshake_failure = 0; + + SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) ); + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 protocol version + * 6 . 9 UNIX time() + * 10 . 37 random bytes + */ + buf = ssl->in_msg; + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]", + buf[4], buf[5] ) ); + + if( ssl->in_hslen < 42 || + buf[0] != SSL_HS_SERVER_HELLO || + buf[4] != SSL_MAJOR_VERSION_3 ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + if( buf[5] > ssl->max_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + ssl->minor_ver = buf[5]; + + if( ssl->minor_ver < ssl->min_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum" + " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, + buf[4], buf[5] ) ); + + ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_PROTOCOL_VERSION ); + + return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); + } + +#if defined(POLARSSL_DEBUG_C) + t = ( (time_t) buf[6] << 24 ) + | ( (time_t) buf[7] << 16 ) + | ( (time_t) buf[8] << 8 ) + | ( (time_t) buf[9] ); +#endif + + memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 ); + + n = buf[38]; + + SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) ); + SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 ); + + if( n > 32 ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + /* + * 38 . 38 session id length + * 39 . 38+n session id + * 39+n . 40+n chosen ciphersuite + * 41+n . 41+n chosen compression alg. + * 42+n . 43+n extensions length + * 44+n . 44+n+m extensions + */ + if( ssl->in_hslen > 42 + n ) + { + ext_len = ( ( buf[42 + n] << 8 ) + | ( buf[43 + n] ) ); + + if( ( ext_len > 0 && ext_len < 4 ) || + ssl->in_hslen != 44 + n + ext_len ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + } + + i = ( buf[39 + n] << 8 ) | buf[40 + n]; + comp = buf[41 + n]; + + /* + * Initialize update checksum functions + */ + ssl_optimize_checksum( ssl, i ); + + SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); + SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n ); + + /* + * Check if the session can be resumed + */ + if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || + ssl->handshake->resume == 0 || n == 0 || + ssl->session_negotiate->ciphersuite != i || + ssl->session_negotiate->compression != comp || + ssl->session_negotiate->length != n || + memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 ) + { + ssl->state++; + ssl->handshake->resume = 0; + ssl->session_negotiate->start = time( NULL ); + ssl->session_negotiate->ciphersuite = i; + ssl->session_negotiate->compression = comp; + ssl->session_negotiate->length = n; + memcpy( ssl->session_negotiate->id, buf + 39, n ); + } + else + { + ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC; + + if( ( ret = ssl_derive_keys( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_derive_keys", ret ); + return( ret ); + } + } + + SSL_DEBUG_MSG( 3, ( "%s session has been resumed", + ssl->handshake->resume ? "a" : "no" ) ); + + SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) ); + SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) ); + + i = 0; + while( 1 ) + { + if( ssl->ciphersuites[ssl->minor_ver][i] == 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + if( ssl->ciphersuites[ssl->minor_ver][i++] == ssl->session_negotiate->ciphersuite ) + break; + } + + if( comp != SSL_COMPRESS_NULL +#if defined(POLARSSL_ZLIB_SUPPORT) + && comp != SSL_COMPRESS_DEFLATE +#endif + ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + ssl->session_negotiate->compression = comp; + + ext = buf + 44 + n; + + while( ext_len ) + { + unsigned int ext_id = ( ( ext[0] << 8 ) + | ( ext[1] ) ); + unsigned int ext_size = ( ( ext[2] << 8 ) + | ( ext[3] ) ); + + if( ext_size + 4 > ext_len ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + switch( ext_id ) + { + case TLS_EXT_RENEGOTIATION_INFO: + SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); + renegotiation_info_seen = 1; + + if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 ) + return( ret ); + + break; + + default: + SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", + ext_id ) ); + } + + ext_len -= 4 + ext_size; + ext += 4 + ext_size; + + if( ext_len > 0 && ext_len < 4 ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + } + + /* + * Renegotiation security checks + */ + if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION && + renegotiation_info_seen == 0 ) + { + SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + renegotiation_info_seen == 1 ) + { + SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); + handshake_failure = 1; + } + + if( handshake_failure == 1 ) + { + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + + SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) ); + + return( 0 ); +} + +static int ssl_parse_server_key_exchange( ssl_context *ssl ) +{ +#if defined(POLARSSL_DHM_C) + int ret; + size_t n; + unsigned char *p, *end; + unsigned char hash[64]; + md5_context md5; + sha1_context sha1; + int hash_id = SIG_RSA_RAW; + unsigned int hashlen = 0; +#endif + + SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) ); + + if( ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_DES_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) ); + ssl->state++; + return( 0 ); + } + +#if !defined(POLARSSL_DHM_C) + SSL_DEBUG_MSG( 1, ( "support for dhm in not available" ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); +#else + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE ) + { + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 ); + + /* + * Ephemeral DH parameters: + * + * struct { + * opaque dh_p<1..2^16-1>; + * opaque dh_g<1..2^16-1>; + * opaque dh_Ys<1..2^16-1>; + * } ServerDHParams; + */ + p = ssl->in_msg + 4; + end = ssl->in_msg + ssl->in_hslen; + + if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, &p, end ) ) != 0 ) + { + SSL_DEBUG_MSG( 2, ( "DHM Read Params returned -0x%x", -ret ) ); + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + if( ssl->minor_ver == SSL_MINOR_VERSION_3 ) + { + if( p[1] != SSL_SIG_RSA ) + { + SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", p[1] ) ); + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + switch( p[0] ) + { +#if defined(POLARSSL_MD5_C) + case SSL_HASH_MD5: + hash_id = SIG_RSA_MD5; + break; +#endif +#if defined(POLARSSL_SHA1_C) + case SSL_HASH_SHA1: + hash_id = SIG_RSA_SHA1; + break; +#endif +#if defined(POLARSSL_SHA2_C) + case SSL_HASH_SHA224: + hash_id = SIG_RSA_SHA224; + break; + case SSL_HASH_SHA256: + hash_id = SIG_RSA_SHA256; + break; +#endif +#if defined(POLARSSL_SHA4_C) + case SSL_HASH_SHA384: + hash_id = SIG_RSA_SHA384; + break; + case SSL_HASH_SHA512: + hash_id = SIG_RSA_SHA512; + break; +#endif + default: + SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", p[0] ) ); + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", p[1] ) ); + SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", p[0] ) ); + p += 2; + } + + n = ( p[0] << 8 ) | p[1]; + p += 2; + + if( end != p + n ) + { + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + if( (unsigned int)( end - p ) != + ssl->session_negotiate->peer_cert->rsa.len ) + { + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + if( ssl->handshake->dhm_ctx.len < 64 || ssl->handshake->dhm_ctx.len > 512 ) + { + SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); + } + + SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); + SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); + SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); + + if( ssl->minor_ver != SSL_MINOR_VERSION_3 ) + { + /* + * digitally-signed struct { + * opaque md5_hash[16]; + * opaque sha_hash[20]; + * }; + * + * md5_hash + * MD5(ClientHello.random + ServerHello.random + * + ServerParams); + * sha_hash + * SHA(ClientHello.random + ServerHello.random + * + ServerParams); + */ + n = ssl->in_hslen - ( end - p ) - 6; + + md5_starts( &md5 ); + md5_update( &md5, ssl->handshake->randbytes, 64 ); + md5_update( &md5, ssl->in_msg + 4, n ); + md5_finish( &md5, hash ); + + sha1_starts( &sha1 ); + sha1_update( &sha1, ssl->handshake->randbytes, 64 ); + sha1_update( &sha1, ssl->in_msg + 4, n ); + sha1_finish( &sha1, hash + 16 ); + + hash_id = SIG_RSA_RAW; + hashlen = 36; + } + else + { + sha2_context sha2; +#if defined(POLARSSL_SHA4_C) + sha4_context sha4; +#endif + + n = ssl->in_hslen - ( end - p ) - 8; + + /* + * digitally-signed struct { + * opaque client_random[32]; + * opaque server_random[32]; + * ServerDHParams params; + * }; + */ + switch( hash_id ) + { +#if defined(POLARSSL_MD5_C) + case SIG_RSA_MD5: + md5_starts( &md5 ); + md5_update( &md5, ssl->handshake->randbytes, 64 ); + md5_update( &md5, ssl->in_msg + 4, n ); + md5_finish( &md5, hash ); + hashlen = 16; + break; +#endif +#if defined(POLARSSL_SHA1_C) + case SIG_RSA_SHA1: + sha1_starts( &sha1 ); + sha1_update( &sha1, ssl->handshake->randbytes, 64 ); + sha1_update( &sha1, ssl->in_msg + 4, n ); + sha1_finish( &sha1, hash ); + hashlen = 20; + break; +#endif +#if defined(POLARSSL_SHA2_C) + case SIG_RSA_SHA224: + sha2_starts( &sha2, 1 ); + sha2_update( &sha2, ssl->handshake->randbytes, 64 ); + sha2_update( &sha2, ssl->in_msg + 4, n ); + sha2_finish( &sha2, hash ); + hashlen = 28; + break; + case SIG_RSA_SHA256: + sha2_starts( &sha2, 0 ); + sha2_update( &sha2, ssl->handshake->randbytes, 64 ); + sha2_update( &sha2, ssl->in_msg + 4, n ); + sha2_finish( &sha2, hash ); + hashlen = 32; + break; +#endif +#if defined(POLARSSL_SHA4_C) + case SIG_RSA_SHA384: + sha4_starts( &sha4, 1 ); + sha4_update( &sha4, ssl->handshake->randbytes, 64 ); + sha4_update( &sha4, ssl->in_msg + 4, n ); + sha4_finish( &sha4, hash ); + hashlen = 48; + break; + case SIG_RSA_SHA512: + sha4_starts( &sha4, 0 ); + sha4_update( &sha4, ssl->handshake->randbytes, 64 ); + sha4_update( &sha4, ssl->in_msg + 4, n ); + sha4_finish( &sha4, hash ); + hashlen = 64; + break; +#endif + } + } + + SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); + + if( ( ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa, + RSA_PUBLIC, + hash_id, hashlen, hash, p ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret ); + return( ret ); + } + + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) ); + + return( 0 ); +#endif +} + +static int ssl_parse_certificate_request( ssl_context *ssl ) +{ + int ret; + unsigned char *buf, *p; + size_t n = 0, m = 0; + size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0; + + SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) ); + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 4 cert type count + * 5 .. m-1 cert types + * m .. m+1 sig alg length (TLS 1.2 only) + * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) + * n .. n+1 length of all DNs + * n+2 .. n+3 length of DN 1 + * n+4 .. ... Distinguished Name #1 + * ... .. ... length of DN 2, etc. + */ + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + ssl->client_auth = 0; + ssl->state++; + + if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST ) + ssl->client_auth++; + + SSL_DEBUG_MSG( 3, ( "got %s certificate request", + ssl->client_auth ? "a" : "no" ) ); + + if( ssl->client_auth == 0 ) + goto exit; + + // TODO: handshake_failure alert for an anonymous server to request + // client authentication + + buf = ssl->in_msg; + + // Retrieve cert types + // + cert_type_len = buf[4]; + n = cert_type_len; + + if( ssl->in_hslen < 6 + n ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); + } + + p = buf + 5; + while( cert_type_len > 0 ) + { + if( *p == SSL_CERT_TYPE_RSA_SIGN ) + { + ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN; + break; + } + + cert_type_len--; + p++; + } + + if( ssl->handshake->cert_type == 0 ) + { + SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); + } + + if( ssl->minor_ver == SSL_MINOR_VERSION_3 ) + { + sig_alg_len = ( ( buf[5 + n] << 8 ) + | ( buf[6 + n] ) ); + + p = buf + 7 + n; + m += 2; + n += sig_alg_len; + + if( ssl->in_hslen < 6 + n ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); + } + } + + dn_len = ( ( buf[5 + m + n] << 8 ) + | ( buf[6 + m + n] ) ); + + n += dn_len; + if( ssl->in_hslen != 7 + m + n ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); + } + +exit: + SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) ); + + return( 0 ); +} + +static int ssl_parse_server_hello_done( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) ); + + if( ssl->client_auth != 0 ) + { + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + } + + if( ssl->in_hslen != 4 || + ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE ) + { + SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE ); + } + + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) ); + + return( 0 ); +} + +static int ssl_write_client_key_exchange( ssl_context *ssl ) +{ + int ret; + size_t i, n; + + SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) ); + + if( ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { +#if !defined(POLARSSL_DHM_C) + SSL_DEBUG_MSG( 1, ( "support for dhm in not available" ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); +#else + /* + * DHM key exchange -- send G^X mod P + */ + n = ssl->handshake->dhm_ctx.len; + + ssl->out_msg[4] = (unsigned char)( n >> 8 ); + ssl->out_msg[5] = (unsigned char)( n ); + i = 6; + + ret = dhm_make_public( &ssl->handshake->dhm_ctx, + mpi_size( &ssl->handshake->dhm_ctx.P ), + &ssl->out_msg[i], n, + ssl->f_rng, ssl->p_rng ); + if( ret != 0 ) + { + SSL_DEBUG_RET( 1, "dhm_make_public", ret ); + return( ret ); + } + + SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); + SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); + + ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len; + + if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx, + ssl->handshake->premaster, + &ssl->handshake->pmslen ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "dhm_calc_secret", ret ); + return( ret ); + } + + SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); +#endif + } + else + { + /* + * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster)) + */ + ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver; + ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver; + ssl->handshake->pmslen = 48; + + ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2, + ssl->handshake->pmslen - 2 ); + if( ret != 0 ) + return( ret ); + + i = 4; + n = ssl->session_negotiate->peer_cert->rsa.len; + + if( ssl->minor_ver != SSL_MINOR_VERSION_0 ) + { + i += 2; + ssl->out_msg[4] = (unsigned char)( n >> 8 ); + ssl->out_msg[5] = (unsigned char)( n ); + } + + ret = rsa_pkcs1_encrypt( &ssl->session_negotiate->peer_cert->rsa, + ssl->f_rng, ssl->p_rng, + RSA_PUBLIC, + ssl->handshake->pmslen, + ssl->handshake->premaster, + ssl->out_msg + i ); + if( ret != 0 ) + { + SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret ); + return( ret ); + } + } + + if( ( ret = ssl_derive_keys( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_derive_keys", ret ); + return( ret ); + } + + ssl->out_msglen = i + n; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) ); + + return( 0 ); +} + +static int ssl_write_certificate_verify( ssl_context *ssl ) +{ + int ret = 0; + size_t n = 0, offset = 0; + unsigned char hash[48]; + int hash_id = SIG_RSA_RAW; + unsigned int hashlen = 36; + + SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) ); + + if( ssl->client_auth == 0 || ssl->own_cert == NULL ) + { + SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); + ssl->state++; + return( 0 ); + } + + if( ssl->rsa_key == NULL ) + { + SSL_DEBUG_MSG( 1, ( "got no private key" ) ); + return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED ); + } + + /* + * Make an RSA signature of the handshake digests + */ + ssl->handshake->calc_verify( ssl, hash ); + + if( ssl->minor_ver != SSL_MINOR_VERSION_3 ) + { + /* + * digitally-signed struct { + * opaque md5_hash[16]; + * opaque sha_hash[20]; + * }; + * + * md5_hash + * MD5(handshake_messages); + * + * sha_hash + * SHA(handshake_messages); + */ + hashlen = 36; + hash_id = SIG_RSA_RAW; + } + else + { + /* + * digitally-signed struct { + * opaque handshake_messages[handshake_messages_length]; + * }; + * + * Taking shortcut here. We assume that the server always allows the + * PRF Hash function and has sent it in the allowed signature + * algorithms list received in the Certificate Request message. + * + * Until we encounter a server that does not, we will take this + * shortcut. + * + * Reason: Otherwise we should have running hashes for SHA512 and SHA224 + * in order to satisfy 'weird' needs from the server side. + */ + if( ssl->session_negotiate->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + hash_id = SIG_RSA_SHA384; + hashlen = 48; + ssl->out_msg[4] = SSL_HASH_SHA384; + ssl->out_msg[5] = SSL_SIG_RSA; + } + else + { + hash_id = SIG_RSA_SHA256; + hashlen = 32; + ssl->out_msg[4] = SSL_HASH_SHA256; + ssl->out_msg[5] = SSL_SIG_RSA; + } + + offset = 2; + } + + if ( ssl->rsa_key ) + n = ssl->rsa_key_len ( ssl->rsa_key ); + + ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 ); + ssl->out_msg[5 + offset] = (unsigned char)( n ); + + if( ssl->rsa_key ) + { + ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng, + RSA_PRIVATE, hash_id, + hashlen, hash, ssl->out_msg + 6 + offset ); + } + + if (ret != 0) + { + SSL_DEBUG_RET( 1, "pkcs1_sign", ret ); + return( ret ); + } + + ssl->out_msglen = 6 + n + offset; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) ); + + return( 0 ); +} + +/* + * SSL handshake -- client side -- single step + */ +int ssl_handshake_client_step( ssl_context *ssl ) +{ + int ret = 0; + + if( ssl->state == SSL_HANDSHAKE_OVER ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) ); + + if( ( ret = ssl_flush_output( ssl ) ) != 0 ) + return( ret ); + + switch( ssl->state ) + { + case SSL_HELLO_REQUEST: + ssl->state = SSL_CLIENT_HELLO; + break; + + /* + * ==> ClientHello + */ + case SSL_CLIENT_HELLO: + ret = ssl_write_client_hello( ssl ); + break; + + /* + * <== ServerHello + * Certificate + * ( ServerKeyExchange ) + * ( CertificateRequest ) + * ServerHelloDone + */ + case SSL_SERVER_HELLO: + ret = ssl_parse_server_hello( ssl ); + break; + + case SSL_SERVER_CERTIFICATE: + ret = ssl_parse_certificate( ssl ); + break; + + case SSL_SERVER_KEY_EXCHANGE: + ret = ssl_parse_server_key_exchange( ssl ); + break; + + case SSL_CERTIFICATE_REQUEST: + ret = ssl_parse_certificate_request( ssl ); + break; + + case SSL_SERVER_HELLO_DONE: + ret = ssl_parse_server_hello_done( ssl ); + break; + + /* + * ==> ( Certificate/Alert ) + * ClientKeyExchange + * ( CertificateVerify ) + * ChangeCipherSpec + * Finished + */ + case SSL_CLIENT_CERTIFICATE: + ret = ssl_write_certificate( ssl ); + break; + + case SSL_CLIENT_KEY_EXCHANGE: + ret = ssl_write_client_key_exchange( ssl ); + break; + + case SSL_CERTIFICATE_VERIFY: + ret = ssl_write_certificate_verify( ssl ); + break; + + case SSL_CLIENT_CHANGE_CIPHER_SPEC: + ret = ssl_write_change_cipher_spec( ssl ); + break; + + case SSL_CLIENT_FINISHED: + ret = ssl_write_finished( ssl ); + break; + + /* + * <== ChangeCipherSpec + * Finished + */ + case SSL_SERVER_CHANGE_CIPHER_SPEC: + ret = ssl_parse_change_cipher_spec( ssl ); + break; + + case SSL_SERVER_FINISHED: + ret = ssl_parse_finished( ssl ); + break; + + case SSL_FLUSH_BUFFERS: + SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); + ssl->state = SSL_HANDSHAKE_WRAPUP; + break; + + case SSL_HANDSHAKE_WRAPUP: + ssl_handshake_wrapup( ssl ); + break; + + default: + SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + } + + return( ret ); +} +#endif diff --git a/Externals/polarssl/library/ssl_srv.c b/Externals/polarssl/library/ssl_srv.c new file mode 100644 index 0000000000..9ba22949bc --- /dev/null +++ b/Externals/polarssl/library/ssl_srv.c @@ -0,0 +1,1623 @@ +/* + * SSLv3/TLSv1 server-side functions + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SSL_SRV_C) + +#include "polarssl/debug.h" +#include "polarssl/ssl.h" + +#include +#include +#include + +static int ssl_parse_servername_ext( ssl_context *ssl, + const unsigned char *buf, + size_t len ) +{ + int ret; + size_t servername_list_size, hostname_len; + const unsigned char *p; + + servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); + if( servername_list_size + 2 != len ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + p = buf + 2; + while( servername_list_size > 0 ) + { + hostname_len = ( ( p[1] << 8 ) | p[2] ); + if( hostname_len + 3 > servername_list_size ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + if( p[0] == TLS_EXT_SERVERNAME_HOSTNAME ) + { + ret = ssl->f_sni( ssl->p_sni, ssl, p + 3, hostname_len ); + if( ret != 0 ) + { + ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_UNRECOGNIZED_NAME ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + return( 0 ); + } + + servername_list_size -= hostname_len + 3; + p += hostname_len + 3; + } + + if( servername_list_size != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + return( 0 ); +} + +static int ssl_parse_renegotiation_info( ssl_context *ssl, + const unsigned char *buf, + size_t len ) +{ + int ret; + + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE ) + { + if( len != 1 || buf[0] != 0x0 ) + { + SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION; + } + else + { + if( len != 1 + ssl->verify_data_len || + buf[0] != ssl->verify_data_len || + memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) + { + SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + } + + return( 0 ); +} + +static int ssl_parse_signature_algorithms_ext( ssl_context *ssl, + const unsigned char *buf, + size_t len ) +{ + size_t sig_alg_list_size; + const unsigned char *p; + + sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); + if( sig_alg_list_size + 2 != len || + sig_alg_list_size %2 != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + p = buf + 2; + while( sig_alg_list_size > 0 ) + { + if( p[1] != SSL_SIG_RSA ) + { + sig_alg_list_size -= 2; + p += 2; + continue; + } +#if defined(POLARSSL_SHA4_C) + if( p[0] == SSL_HASH_SHA512 ) + { + ssl->handshake->sig_alg = SSL_HASH_SHA512; + break; + } + if( p[0] == SSL_HASH_SHA384 ) + { + ssl->handshake->sig_alg = SSL_HASH_SHA384; + break; + } +#endif +#if defined(POLARSSL_SHA2_C) + if( p[0] == SSL_HASH_SHA256 ) + { + ssl->handshake->sig_alg = SSL_HASH_SHA256; + break; + } + if( p[0] == SSL_HASH_SHA224 ) + { + ssl->handshake->sig_alg = SSL_HASH_SHA224; + break; + } +#endif + if( p[0] == SSL_HASH_SHA1 ) + { + ssl->handshake->sig_alg = SSL_HASH_SHA1; + break; + } + if( p[0] == SSL_HASH_MD5 ) + { + ssl->handshake->sig_alg = SSL_HASH_MD5; + break; + } + + sig_alg_list_size -= 2; + p += 2; + } + + SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d", + ssl->handshake->sig_alg ) ); + + return( 0 ); +} + +#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) +static int ssl_parse_client_hello_v2( ssl_context *ssl ) +{ + int ret; + unsigned int i, j; + size_t n; + unsigned int ciph_len, sess_len, chal_len; + unsigned char *buf, *p; + + SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) ); + + if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + buf = ssl->in_hdr; + + SSL_DEBUG_BUF( 4, "record header", buf, 5 ); + + SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d", + buf[2] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d", + ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]", + buf[3], buf[4] ) ); + + /* + * SSLv2 Client Hello + * + * Record layer: + * 0 . 1 message length + * + * SSL layer: + * 2 . 2 message type + * 3 . 4 protocol version + */ + if( buf[2] != SSL_HS_CLIENT_HELLO || + buf[3] != SSL_MAJOR_VERSION_3 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF; + + if( n < 17 || n > 512 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->major_ver = SSL_MAJOR_VERSION_3; + ssl->minor_ver = ( buf[4] <= SSL_MINOR_VERSION_3 ) + ? buf[4] : SSL_MINOR_VERSION_3; + + if( ssl->minor_ver < ssl->min_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" + " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, + ssl->min_major_ver, ssl->min_minor_ver ) ); + + ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_PROTOCOL_VERSION ); + return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); + } + + ssl->max_major_ver = buf[3]; + ssl->max_minor_ver = buf[4]; + + if( ( ret = ssl_fetch_input( ssl, 2 + n ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_fetch_input", ret ); + return( ret ); + } + + ssl->handshake->update_checksum( ssl, buf + 2, n ); + + buf = ssl->in_msg; + n = ssl->in_left - 5; + + /* + * 0 . 1 ciphersuitelist length + * 2 . 3 session id length + * 4 . 5 challenge length + * 6 . .. ciphersuitelist + * .. . .. session id + * .. . .. challenge + */ + SSL_DEBUG_BUF( 4, "record contents", buf, n ); + + ciph_len = ( buf[0] << 8 ) | buf[1]; + sess_len = ( buf[2] << 8 ) | buf[3]; + chal_len = ( buf[4] << 8 ) | buf[5]; + + SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d", + ciph_len, sess_len, chal_len ) ); + + /* + * Make sure each parameter length is valid + */ + if( ciph_len < 3 || ( ciph_len % 3 ) != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + if( sess_len > 32 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + if( chal_len < 8 || chal_len > 32 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + if( n != 6 + ciph_len + sess_len + chal_len ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", + buf + 6, ciph_len ); + SSL_DEBUG_BUF( 3, "client hello, session id", + buf + 6 + ciph_len, sess_len ); + SSL_DEBUG_BUF( 3, "client hello, challenge", + buf + 6 + ciph_len + sess_len, chal_len ); + + p = buf + 6 + ciph_len; + ssl->session_negotiate->length = sess_len; + memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) ); + memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->length ); + + p += sess_len; + memset( ssl->handshake->randbytes, 0, 64 ); + memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len ); + + /* + * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) + { + if( p[0] == 0 && p[1] == 0 && p[2] == SSL_EMPTY_RENEGOTIATION_INFO ) + { + SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); + if( ssl->renegotiation == SSL_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION; + break; + } + } + + for( i = 0; ssl->ciphersuites[ssl->minor_ver][i] != 0; i++ ) + { + for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) + { + if( p[0] == 0 && + p[1] == 0 && + p[2] == ssl->ciphersuites[ssl->minor_ver][i] ) + goto have_ciphersuite_v2; + } + } + + SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); + + return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN ); + +have_ciphersuite_v2: + ssl->session_negotiate->ciphersuite = ssl->ciphersuites[ssl->minor_ver][i]; + ssl_optimize_checksum( ssl, ssl->session_negotiate->ciphersuite ); + + /* + * SSLv2 Client Hello relevant renegotiation security checks + */ + if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->in_left = 0; + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) ); + + return( 0 ); +} +#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ + +static int ssl_parse_client_hello( ssl_context *ssl ) +{ + int ret; + unsigned int i, j; + size_t n; + unsigned int ciph_len, sess_len; + unsigned int comp_len; + unsigned int ext_len = 0; + unsigned char *buf, *p, *ext; + int renegotiation_info_seen = 0; + int handshake_failure = 0; + + SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) ); + + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE && + ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_fetch_input", ret ); + return( ret ); + } + + buf = ssl->in_hdr; + +#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) + if( ( buf[0] & 0x80 ) != 0 ) + return ssl_parse_client_hello_v2( ssl ); +#endif + + SSL_DEBUG_BUF( 4, "record header", buf, 5 ); + + SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d", + buf[0] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d", + ( buf[3] << 8 ) | buf[4] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]", + buf[1], buf[2] ) ); + + /* + * SSLv3 Client Hello + * + * Record layer: + * 0 . 0 message type + * 1 . 2 protocol version + * 3 . 4 message length + */ + if( buf[0] != SSL_MSG_HANDSHAKE || + buf[1] != SSL_MAJOR_VERSION_3 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + n = ( buf[3] << 8 ) | buf[4]; + + if( n < 45 || n > 512 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE && + ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_fetch_input", ret ); + return( ret ); + } + + buf = ssl->in_msg; + if( !ssl->renegotiation ) + n = ssl->in_left - 5; + else + n = ssl->in_msglen; + + ssl->handshake->update_checksum( ssl, buf, n ); + + /* + * SSL layer: + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 protocol version + * 6 . 9 UNIX time() + * 10 . 37 random bytes + * 38 . 38 session id length + * 39 . 38+x session id + * 39+x . 40+x ciphersuitelist length + * 41+x . .. ciphersuitelist + * .. . .. compression alg. + * .. . .. extensions + */ + SSL_DEBUG_BUF( 4, "record contents", buf, n ); + + SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", + buf[0] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d", + ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) ); + SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]", + buf[4], buf[5] ) ); + + /* + * Check the handshake type and protocol version + */ + if( buf[0] != SSL_HS_CLIENT_HELLO || + buf[4] != SSL_MAJOR_VERSION_3 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->major_ver = SSL_MAJOR_VERSION_3; + ssl->minor_ver = ( buf[5] <= SSL_MINOR_VERSION_3 ) + ? buf[5] : SSL_MINOR_VERSION_3; + + if( ssl->minor_ver < ssl->min_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" + " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, + ssl->min_major_ver, ssl->min_minor_ver ) ); + + ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_PROTOCOL_VERSION ); + + return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); + } + + ssl->max_major_ver = buf[4]; + ssl->max_minor_ver = buf[5]; + + memcpy( ssl->handshake->randbytes, buf + 6, 32 ); + + /* + * Check the handshake message length + */ + if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + /* + * Check the session length + */ + sess_len = buf[38]; + + if( sess_len > 32 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->session_negotiate->length = sess_len; + memset( ssl->session_negotiate->id, 0, + sizeof( ssl->session_negotiate->id ) ); + memcpy( ssl->session_negotiate->id, buf + 39, + ssl->session_negotiate->length ); + + /* + * Check the ciphersuitelist length + */ + ciph_len = ( buf[39 + sess_len] << 8 ) + | ( buf[40 + sess_len] ); + + if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + /* + * Check the compression algorithms length + */ + comp_len = buf[41 + sess_len + ciph_len]; + + if( comp_len < 1 || comp_len > 16 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + /* + * Check the extension length + */ + if( n > 42 + sess_len + ciph_len + comp_len ) + { + ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 ) + | ( buf[43 + sess_len + ciph_len + comp_len] ); + + if( ( ext_len > 0 && ext_len < 4 ) || + n != 44 + sess_len + ciph_len + comp_len + ext_len ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + } + + ssl->session_negotiate->compression = SSL_COMPRESS_NULL; +#if defined(POLARSSL_ZLIB_SUPPORT) + for( i = 0; i < comp_len; ++i ) + { + if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE ) + { + ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE; + break; + } + } +#endif + + SSL_DEBUG_BUF( 3, "client hello, random bytes", + buf + 6, 32 ); + SSL_DEBUG_BUF( 3, "client hello, session id", + buf + 38, sess_len ); + SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", + buf + 41 + sess_len, ciph_len ); + SSL_DEBUG_BUF( 3, "client hello, compression", + buf + 42 + sess_len + ciph_len, comp_len ); + + /* + * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 ) + { + if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO ) + { + SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); + if( ssl->renegotiation == SSL_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) ); + + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION; + break; + } + } + + /* + * Search for a matching ciphersuite + */ + for( i = 0; ssl->ciphersuites[ssl->minor_ver][i] != 0; i++ ) + { + for( j = 0, p = buf + 41 + sess_len; j < ciph_len; + j += 2, p += 2 ) + { + if( p[0] == 0 && p[1] == ssl->ciphersuites[ssl->minor_ver][i] ) + goto have_ciphersuite; + } + } + + SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); + + return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN ); + +have_ciphersuite: + ssl->session_negotiate->ciphersuite = ssl->ciphersuites[ssl->minor_ver][i]; + ssl_optimize_checksum( ssl, ssl->session_negotiate->ciphersuite ); + + ext = buf + 44 + sess_len + ciph_len + comp_len; + + while( ext_len ) + { + unsigned int ext_id = ( ( ext[0] << 8 ) + | ( ext[1] ) ); + unsigned int ext_size = ( ( ext[2] << 8 ) + | ( ext[3] ) ); + + if( ext_size + 4 > ext_len ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + switch( ext_id ) + { + case TLS_EXT_SERVERNAME: + SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) ); + if( ssl->f_sni == NULL ) + break; + + ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size ); + if( ret != 0 ) + return( ret ); + break; + + case TLS_EXT_RENEGOTIATION_INFO: + SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); + renegotiation_info_seen = 1; + + ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ); + if( ret != 0 ) + return( ret ); + break; + + case TLS_EXT_SIG_ALG: + SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) ); + if( ssl->renegotiation == SSL_RENEGOTIATION ) + break; + + ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size ); + if( ret != 0 ) + return( ret ); + break; + + default: + SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", + ext_id ) ); + } + + ext_len -= 4 + ext_size; + ext += 4 + ext_size; + + if( ext_len > 0 && ext_len < 4 ) + { + SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + } + + /* + * Renegotiation security checks + */ + if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION && + renegotiation_info_seen == 0 ) + { + SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); + handshake_failure = 1; + } + else if( ssl->renegotiation == SSL_RENEGOTIATION && + ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + renegotiation_info_seen == 1 ) + { + SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); + handshake_failure = 1; + } + + if( handshake_failure == 1 ) + { + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO ); + } + + ssl->in_left = 0; + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) ); + + return( 0 ); +} + +static int ssl_write_server_hello( ssl_context *ssl ) +{ + time_t t; + int ret, n; + size_t ext_len = 0; + unsigned char *buf, *p; + + SSL_DEBUG_MSG( 2, ( "=> write server hello" ) ); + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 protocol version + * 6 . 9 UNIX time() + * 10 . 37 random bytes + */ + buf = ssl->out_msg; + p = buf + 4; + + *p++ = (unsigned char) ssl->major_ver; + *p++ = (unsigned char) ssl->minor_ver; + + SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]", + buf[4], buf[5] ) ); + + t = time( NULL ); + *p++ = (unsigned char)( t >> 24 ); + *p++ = (unsigned char)( t >> 16 ); + *p++ = (unsigned char)( t >> 8 ); + *p++ = (unsigned char)( t ); + + SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) ); + + if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 ) + return( ret ); + + p += 28; + + memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 ); + + SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 ); + + /* + * 38 . 38 session id length + * 39 . 38+n session id + * 39+n . 40+n chosen ciphersuite + * 41+n . 41+n chosen compression alg. + */ + ssl->session_negotiate->length = n = 32; + *p++ = (unsigned char) ssl->session_negotiate->length; + + if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || + ssl->f_get_cache == NULL || + ssl->f_get_cache( ssl->p_get_cache, ssl->session_negotiate ) != 0 ) + { + /* + * Not found, create a new session id + */ + ssl->handshake->resume = 0; + ssl->state++; + + if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, + n ) ) != 0 ) + return( ret ); + } + else + { + /* + * Found a matching session, resuming it + */ + ssl->handshake->resume = 1; + ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC; + + if( ( ret = ssl_derive_keys( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_derive_keys", ret ); + return( ret ); + } + } + + memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length ); + p += ssl->session_negotiate->length; + + SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); + SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n ); + SSL_DEBUG_MSG( 3, ( "%s session has been resumed", + ssl->handshake->resume ? "a" : "no" ) ); + + *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 ); + *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite ); + *p++ = (unsigned char)( ssl->session_negotiate->compression ); + + SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", + ssl->session_negotiate->ciphersuite ) ); + SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", + ssl->session_negotiate->compression ) ); + + if( ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION ) + { + SSL_DEBUG_MSG( 3, ( "server hello, prepping for secure renegotiation extension" ) ); + ext_len += 5 + ssl->verify_data_len * 2; + + SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", + ext_len ) ); + + *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( ext_len ) & 0xFF ); + + /* + * Secure renegotiation + */ + SSL_DEBUG_MSG( 3, ( "client hello, secure renegotiation extension" ) ); + + *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); + *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); + + *p++ = 0x00; + *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF; + *p++ = ssl->verify_data_len * 2 & 0xFF; + + memcpy( p, ssl->peer_verify_data, ssl->verify_data_len ); + p += ssl->verify_data_len; + memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); + p += ssl->verify_data_len; + } + + ssl->out_msglen = p - buf; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_SERVER_HELLO; + + ret = ssl_write_record( ssl ); + + SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); + + return( ret ); +} + +static int ssl_write_certificate_request( ssl_context *ssl ) +{ + int ret; + size_t n = 0, dn_size, total_dn_size; + unsigned char *buf, *p; + const x509_cert *crt; + + SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); + + ssl->state++; + + if( ssl->authmode == SSL_VERIFY_NONE ) + { + SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); + return( 0 ); + } + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 4 cert type count + * 5 .. m-1 cert types + * m .. m+1 sig alg length (TLS 1.2 only) + * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) + * n .. n+1 length of all DNs + * n+2 .. n+3 length of DN 1 + * n+4 .. ... Distinguished Name #1 + * ... .. ... length of DN 2, etc. + */ + buf = ssl->out_msg; + p = buf + 4; + + /* + * At the moment, only RSA certificates are supported + */ + *p++ = 1; + *p++ = SSL_CERT_TYPE_RSA_SIGN; + + /* + * Add signature_algorithms for verify (TLS 1.2) + * Only add current running algorithm that is already required for + * requested ciphersuite. + * + * Length is always 2 + */ + if( ssl->minor_ver == SSL_MINOR_VERSION_3 ) + { + ssl->handshake->verify_sig_alg = SSL_HASH_SHA256; + + *p++ = 0; + *p++ = 2; + + if( ssl->session_negotiate->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + ssl->handshake->verify_sig_alg = SSL_HASH_SHA384; + } + + *p++ = ssl->handshake->verify_sig_alg; + *p++ = SSL_SIG_RSA; + + n += 4; + } + + p += 2; + crt = ssl->ca_chain; + + total_dn_size = 0; + while( crt != NULL && crt->version != 0) + { + if( p - buf > 4096 ) + break; + + dn_size = crt->subject_raw.len; + *p++ = (unsigned char)( dn_size >> 8 ); + *p++ = (unsigned char)( dn_size ); + memcpy( p, crt->subject_raw.p, dn_size ); + p += dn_size; + + SSL_DEBUG_BUF( 3, "requested DN", p, dn_size ); + + total_dn_size += 2 + dn_size; + crt = crt->next; + } + + ssl->out_msglen = p - buf; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST; + ssl->out_msg[6 + n] = (unsigned char)( total_dn_size >> 8 ); + ssl->out_msg[7 + n] = (unsigned char)( total_dn_size ); + + ret = ssl_write_record( ssl ); + + SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) ); + + return( ret ); +} + +static int ssl_write_server_key_exchange( ssl_context *ssl ) +{ +#if defined(POLARSSL_DHM_C) + int ret; + size_t n, rsa_key_len = 0; + unsigned char hash[64]; + int hash_id = 0; + unsigned int hashlen = 0; +#endif + + SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) ); + + if( ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_DES_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 && + ssl->session_negotiate->ciphersuite != TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) ); + ssl->state++; + return( 0 ); + } + +#if !defined(POLARSSL_DHM_C) + SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); +#else + + if( ssl->rsa_key == NULL ) + { + SSL_DEBUG_MSG( 1, ( "got no private key" ) ); + return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED ); + } + + /* + * Ephemeral DH parameters: + * + * struct { + * opaque dh_p<1..2^16-1>; + * opaque dh_g<1..2^16-1>; + * opaque dh_Ys<1..2^16-1>; + * } ServerDHParams; + */ + if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 || + ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_copy", ret ); + return( ret ); + } + + if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx, + mpi_size( &ssl->handshake->dhm_ctx.P ), + ssl->out_msg + 4, + &n, ssl->f_rng, ssl->p_rng ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "dhm_make_params", ret ); + return( ret ); + } + + SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); + SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); + SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); + SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); + + if( ssl->minor_ver != SSL_MINOR_VERSION_3 ) + { + md5_context md5; + sha1_context sha1; + + /* + * digitally-signed struct { + * opaque md5_hash[16]; + * opaque sha_hash[20]; + * }; + * + * md5_hash + * MD5(ClientHello.random + ServerHello.random + * + ServerParams); + * sha_hash + * SHA(ClientHello.random + ServerHello.random + * + ServerParams); + */ + md5_starts( &md5 ); + md5_update( &md5, ssl->handshake->randbytes, 64 ); + md5_update( &md5, ssl->out_msg + 4, n ); + md5_finish( &md5, hash ); + + sha1_starts( &sha1 ); + sha1_update( &sha1, ssl->handshake->randbytes, 64 ); + sha1_update( &sha1, ssl->out_msg + 4, n ); + sha1_finish( &sha1, hash + 16 ); + + hashlen = 36; + hash_id = SIG_RSA_RAW; + } + else + { + /* + * digitally-signed struct { + * opaque client_random[32]; + * opaque server_random[32]; + * ServerDHParams params; + * }; + */ +#if defined(POLARSSL_SHA4_C) + if( ssl->handshake->sig_alg == SSL_HASH_SHA512 ) + { + sha4_context sha4; + + sha4_starts( &sha4, 0 ); + sha4_update( &sha4, ssl->handshake->randbytes, 64 ); + sha4_update( &sha4, ssl->out_msg + 4, n ); + sha4_finish( &sha4, hash ); + + hashlen = 64; + hash_id = SIG_RSA_SHA512; + } + else if( ssl->handshake->sig_alg == SSL_HASH_SHA384 ) + { + sha4_context sha4; + + sha4_starts( &sha4, 1 ); + sha4_update( &sha4, ssl->handshake->randbytes, 64 ); + sha4_update( &sha4, ssl->out_msg + 4, n ); + sha4_finish( &sha4, hash ); + + hashlen = 48; + hash_id = SIG_RSA_SHA384; + } + else +#endif +#if defined(POLARSSL_SHA2_C) + if( ssl->handshake->sig_alg == SSL_HASH_SHA256 ) + { + sha2_context sha2; + + sha2_starts( &sha2, 0 ); + sha2_update( &sha2, ssl->handshake->randbytes, 64 ); + sha2_update( &sha2, ssl->out_msg + 4, n ); + sha2_finish( &sha2, hash ); + + hashlen = 32; + hash_id = SIG_RSA_SHA256; + } + else if( ssl->handshake->sig_alg == SSL_HASH_SHA224 ) + { + sha2_context sha2; + + sha2_starts( &sha2, 1 ); + sha2_update( &sha2, ssl->handshake->randbytes, 64 ); + sha2_update( &sha2, ssl->out_msg + 4, n ); + sha2_finish( &sha2, hash ); + + hashlen = 24; + hash_id = SIG_RSA_SHA224; + } + else +#endif + if( ssl->handshake->sig_alg == SSL_HASH_SHA1 ) + { + sha1_context sha1; + + sha1_starts( &sha1 ); + sha1_update( &sha1, ssl->handshake->randbytes, 64 ); + sha1_update( &sha1, ssl->out_msg + 4, n ); + sha1_finish( &sha1, hash ); + + hashlen = 20; + hash_id = SIG_RSA_SHA1; + } + else if( ssl->handshake->sig_alg == SSL_HASH_MD5 ) + { + md5_context md5; + + md5_starts( &md5 ); + md5_update( &md5, ssl->handshake->randbytes, 64 ); + md5_update( &md5, ssl->out_msg + 4, n ); + md5_finish( &md5, hash ); + + hashlen = 16; + hash_id = SIG_RSA_MD5; + } + } + + SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); + + if ( ssl->rsa_key ) + rsa_key_len = ssl->rsa_key_len( ssl->rsa_key ); + + if( ssl->minor_ver == SSL_MINOR_VERSION_3 ) + { + ssl->out_msg[4 + n] = ssl->handshake->sig_alg; + ssl->out_msg[5 + n] = SSL_SIG_RSA; + + n += 2; + } + + ssl->out_msg[4 + n] = (unsigned char)( rsa_key_len >> 8 ); + ssl->out_msg[5 + n] = (unsigned char)( rsa_key_len ); + + if ( ssl->rsa_key ) + { + ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng, + RSA_PRIVATE, + hash_id, hashlen, hash, + ssl->out_msg + 6 + n ); + } + + if( ret != 0 ) + { + SSL_DEBUG_RET( 1, "pkcs1_sign", ret ); + return( ret ); + } + + SSL_DEBUG_BUF( 3, "my RSA sig", ssl->out_msg + 6 + n, rsa_key_len ); + + ssl->out_msglen = 6 + n + rsa_key_len; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) ); + + return( 0 ); +#endif +} + +static int ssl_write_server_hello_done( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) ); + + ssl->out_msglen = 4; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) ); + + return( 0 ); +} + +static int ssl_parse_client_key_exchange( ssl_context *ssl ) +{ + int ret; + size_t i, n = 0; + + SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) ); + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); + } + + if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); + } + + if( ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_negotiate->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { +#if !defined(POLARSSL_DHM_C) + SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); +#else + /* + * Receive G^Y mod P, premaster = (G^Y)^X mod P + */ + n = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; + + if( n < 1 || n > ssl->handshake->dhm_ctx.len || + n + 6 != ssl->in_hslen ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); + } + + if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx, + ssl->in_msg + 6, n ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "dhm_read_public", ret ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP ); + } + + SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); + + ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len; + + if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx, + ssl->handshake->premaster, + &ssl->handshake->pmslen ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "dhm_calc_secret", ret ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS ); + } + + SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); +#endif + } + else + { + if( ssl->rsa_key == NULL ) + { + SSL_DEBUG_MSG( 1, ( "got no private key" ) ); + return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED ); + } + + /* + * Decrypt the premaster using own private RSA key + */ + i = 4; + if( ssl->rsa_key ) + n = ssl->rsa_key_len( ssl->rsa_key ); + ssl->handshake->pmslen = 48; + + if( ssl->minor_ver != SSL_MINOR_VERSION_0 ) + { + i += 2; + if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) || + ssl->in_msg[5] != ( ( n ) & 0xFF ) ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); + } + } + + if( ssl->in_hslen != i + n ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); + } + + if( ssl->rsa_key ) { + ret = ssl->rsa_decrypt( ssl->rsa_key, RSA_PRIVATE, + &ssl->handshake->pmslen, + ssl->in_msg + i, + ssl->handshake->premaster, + sizeof(ssl->handshake->premaster) ); + } + + if( ret != 0 || ssl->handshake->pmslen != 48 || + ssl->handshake->premaster[0] != ssl->max_major_ver || + ssl->handshake->premaster[1] != ssl->max_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); + + /* + * Protection against Bleichenbacher's attack: + * invalid PKCS#1 v1.5 padding must not cause + * the connection to end immediately; instead, + * send a bad_record_mac later in the handshake. + */ + ssl->handshake->pmslen = 48; + + ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster, + ssl->handshake->pmslen ); + if( ret != 0 ) + return( ret ); + } + } + + if( ( ret = ssl_derive_keys( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_derive_keys", ret ); + return( ret ); + } + + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) ); + + return( 0 ); +} + +static int ssl_parse_certificate_verify( ssl_context *ssl ) +{ + int ret; + size_t n = 0, n1, n2; + unsigned char hash[48]; + int hash_id; + unsigned int hashlen; + + SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); + + if( ssl->session_negotiate->peer_cert == NULL ) + { + SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); + ssl->state++; + return( 0 ); + } + + ssl->handshake->calc_verify( ssl, hash ); + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + ssl->state++; + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); + } + + if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); + } + + if( ssl->minor_ver == SSL_MINOR_VERSION_3 ) + { + /* + * As server we know we either have SSL_HASH_SHA384 or + * SSL_HASH_SHA256 + */ + if( ssl->in_msg[4] != ssl->handshake->verify_sig_alg || + ssl->in_msg[5] != SSL_SIG_RSA ) + { + SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg for verify message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); + } + + if( ssl->handshake->verify_sig_alg == SSL_HASH_SHA384 ) + { + hashlen = 48; + hash_id = SIG_RSA_SHA384; + } + else + { + hashlen = 32; + hash_id = SIG_RSA_SHA256; + } + + n += 2; + } + else + { + hashlen = 36; + hash_id = SIG_RSA_RAW; + } + + n1 = ssl->session_negotiate->peer_cert->rsa.len; + n2 = ( ssl->in_msg[4 + n] << 8 ) | ssl->in_msg[5 + n]; + + if( n + n1 + 6 != ssl->in_hslen || n1 != n2 ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); + } + + ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa, RSA_PUBLIC, + hash_id, hashlen, hash, ssl->in_msg + 6 + n ); + if( ret != 0 ) + { + SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) ); + + return( 0 ); +} + +/* + * SSL handshake -- server side -- single step + */ +int ssl_handshake_server_step( ssl_context *ssl ) +{ + int ret = 0; + + if( ssl->state == SSL_HANDSHAKE_OVER ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) ); + + if( ( ret = ssl_flush_output( ssl ) ) != 0 ) + return( ret ); + + switch( ssl->state ) + { + case SSL_HELLO_REQUEST: + ssl->state = SSL_CLIENT_HELLO; + break; + + /* + * <== ClientHello + */ + case SSL_CLIENT_HELLO: + ret = ssl_parse_client_hello( ssl ); + break; + + /* + * ==> ServerHello + * Certificate + * ( ServerKeyExchange ) + * ( CertificateRequest ) + * ServerHelloDone + */ + case SSL_SERVER_HELLO: + ret = ssl_write_server_hello( ssl ); + break; + + case SSL_SERVER_CERTIFICATE: + ret = ssl_write_certificate( ssl ); + break; + + case SSL_SERVER_KEY_EXCHANGE: + ret = ssl_write_server_key_exchange( ssl ); + break; + + case SSL_CERTIFICATE_REQUEST: + ret = ssl_write_certificate_request( ssl ); + break; + + case SSL_SERVER_HELLO_DONE: + ret = ssl_write_server_hello_done( ssl ); + break; + + /* + * <== ( Certificate/Alert ) + * ClientKeyExchange + * ( CertificateVerify ) + * ChangeCipherSpec + * Finished + */ + case SSL_CLIENT_CERTIFICATE: + ret = ssl_parse_certificate( ssl ); + break; + + case SSL_CLIENT_KEY_EXCHANGE: + ret = ssl_parse_client_key_exchange( ssl ); + break; + + case SSL_CERTIFICATE_VERIFY: + ret = ssl_parse_certificate_verify( ssl ); + break; + + case SSL_CLIENT_CHANGE_CIPHER_SPEC: + ret = ssl_parse_change_cipher_spec( ssl ); + break; + + case SSL_CLIENT_FINISHED: + ret = ssl_parse_finished( ssl ); + break; + + /* + * ==> ChangeCipherSpec + * Finished + */ + case SSL_SERVER_CHANGE_CIPHER_SPEC: + ret = ssl_write_change_cipher_spec( ssl ); + break; + + case SSL_SERVER_FINISHED: + ret = ssl_write_finished( ssl ); + break; + + case SSL_FLUSH_BUFFERS: + SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); + ssl->state = SSL_HANDSHAKE_WRAPUP; + break; + + case SSL_HANDSHAKE_WRAPUP: + ssl_handshake_wrapup( ssl ); + break; + + default: + SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + } + + return( ret ); +} +#endif diff --git a/Externals/polarssl/library/ssl_tls.c b/Externals/polarssl/library/ssl_tls.c new file mode 100644 index 0000000000..cde6795f99 --- /dev/null +++ b/Externals/polarssl/library/ssl_tls.c @@ -0,0 +1,3991 @@ +/* + * SSLv3/TLSv1 shared functions + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The SSL 3.0 specification was drafted by Netscape in 1996, + * and became an IETF standard in 1999. + * + * http://wp.netscape.com/eng/ssl3/ + * http://www.ietf.org/rfc/rfc2246.txt + * http://www.ietf.org/rfc/rfc4346.txt + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_SSL_TLS_C) + +#include "polarssl/aes.h" +#include "polarssl/arc4.h" +#include "polarssl/camellia.h" +#include "polarssl/des.h" +#include "polarssl/debug.h" +#include "polarssl/ssl.h" +#include "polarssl/sha2.h" + +#if defined(POLARSSL_GCM_C) +#include "polarssl/gcm.h" +#endif + +#include +#include + +#if defined _MSC_VER && !defined strcasecmp +#define strcasecmp _stricmp +#endif + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) +int (*ssl_hw_record_init)(ssl_context *ssl, + const unsigned char *key_enc, const unsigned char *key_dec, + const unsigned char *iv_enc, const unsigned char *iv_dec, + const unsigned char *mac_enc, const unsigned char *mac_dec) = NULL; +int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL; +int (*ssl_hw_record_write)(ssl_context *ssl) = NULL; +int (*ssl_hw_record_read)(ssl_context *ssl) = NULL; +int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL; +#endif + +static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len ) +{ + return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output, + output_max_len ); +} + +static int ssl_rsa_sign( void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + int mode, int hash_id, unsigned int hashlen, + const unsigned char *hash, unsigned char *sig ) +{ + return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id, + hashlen, hash, sig ); +} + +static size_t ssl_rsa_key_len( void *ctx ) +{ + return ( (rsa_context *) ctx )->len; +} + +/* + * Key material generation + */ +static int ssl3_prf( unsigned char *secret, size_t slen, char *label, + unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen ) +{ + size_t i; + md5_context md5; + sha1_context sha1; + unsigned char padding[16]; + unsigned char sha1sum[20]; + ((void)label); + + /* + * SSLv3: + * block = + * MD5( secret + SHA1( 'A' + secret + random ) ) + + * MD5( secret + SHA1( 'BB' + secret + random ) ) + + * MD5( secret + SHA1( 'CCC' + secret + random ) ) + + * ... + */ + for( i = 0; i < dlen / 16; i++ ) + { + memset( padding, 'A' + i, 1 + i ); + + sha1_starts( &sha1 ); + sha1_update( &sha1, padding, 1 + i ); + sha1_update( &sha1, secret, slen ); + sha1_update( &sha1, random, rlen ); + sha1_finish( &sha1, sha1sum ); + + md5_starts( &md5 ); + md5_update( &md5, secret, slen ); + md5_update( &md5, sha1sum, 20 ); + md5_finish( &md5, dstbuf + i * 16 ); + } + + memset( &md5, 0, sizeof( md5 ) ); + memset( &sha1, 0, sizeof( sha1 ) ); + + memset( padding, 0, sizeof( padding ) ); + memset( sha1sum, 0, sizeof( sha1sum ) ); + + return( 0 ); +} + +static int tls1_prf( unsigned char *secret, size_t slen, char *label, + unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen ) +{ + size_t nb, hs; + size_t i, j, k; + unsigned char *S1, *S2; + unsigned char tmp[128]; + unsigned char h_i[20]; + + if( sizeof( tmp ) < 20 + strlen( label ) + rlen ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + hs = ( slen + 1 ) / 2; + S1 = secret; + S2 = secret + slen - hs; + + nb = strlen( label ); + memcpy( tmp + 20, label, nb ); + memcpy( tmp + 20 + nb, random, rlen ); + nb += rlen; + + /* + * First compute P_md5(secret,label+random)[0..dlen] + */ + md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp ); + + for( i = 0; i < dlen; i += 16 ) + { + md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i ); + md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp ); + + k = ( i + 16 > dlen ) ? dlen % 16 : 16; + + for( j = 0; j < k; j++ ) + dstbuf[i + j] = h_i[j]; + } + + /* + * XOR out with P_sha1(secret,label+random)[0..dlen] + */ + sha1_hmac( S2, hs, tmp + 20, nb, tmp ); + + for( i = 0; i < dlen; i += 20 ) + { + sha1_hmac( S2, hs, tmp, 20 + nb, h_i ); + sha1_hmac( S2, hs, tmp, 20, tmp ); + + k = ( i + 20 > dlen ) ? dlen % 20 : 20; + + for( j = 0; j < k; j++ ) + dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] ); + } + + memset( tmp, 0, sizeof( tmp ) ); + memset( h_i, 0, sizeof( h_i ) ); + + return( 0 ); +} + +static int tls_prf_sha256( unsigned char *secret, size_t slen, char *label, + unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen ) +{ + size_t nb; + size_t i, j, k; + unsigned char tmp[128]; + unsigned char h_i[32]; + + if( sizeof( tmp ) < 32 + strlen( label ) + rlen ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + nb = strlen( label ); + memcpy( tmp + 32, label, nb ); + memcpy( tmp + 32 + nb, random, rlen ); + nb += rlen; + + /* + * Compute P_(secret, label + random)[0..dlen] + */ + sha2_hmac( secret, slen, tmp + 32, nb, tmp, 0 ); + + for( i = 0; i < dlen; i += 32 ) + { + sha2_hmac( secret, slen, tmp, 32 + nb, h_i, 0 ); + sha2_hmac( secret, slen, tmp, 32, tmp, 0 ); + + k = ( i + 32 > dlen ) ? dlen % 32 : 32; + + for( j = 0; j < k; j++ ) + dstbuf[i + j] = h_i[j]; + } + + memset( tmp, 0, sizeof( tmp ) ); + memset( h_i, 0, sizeof( h_i ) ); + + return( 0 ); +} + +#if defined(POLARSSL_SHA4_C) +static int tls_prf_sha384( unsigned char *secret, size_t slen, char *label, + unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen ) +{ + size_t nb; + size_t i, j, k; + unsigned char tmp[128]; + unsigned char h_i[48]; + + if( sizeof( tmp ) < 48 + strlen( label ) + rlen ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + nb = strlen( label ); + memcpy( tmp + 48, label, nb ); + memcpy( tmp + 48 + nb, random, rlen ); + nb += rlen; + + /* + * Compute P_(secret, label + random)[0..dlen] + */ + sha4_hmac( secret, slen, tmp + 48, nb, tmp, 1 ); + + for( i = 0; i < dlen; i += 48 ) + { + sha4_hmac( secret, slen, tmp, 48 + nb, h_i, 1 ); + sha4_hmac( secret, slen, tmp, 48, tmp, 1 ); + + k = ( i + 48 > dlen ) ? dlen % 48 : 48; + + for( j = 0; j < k; j++ ) + dstbuf[i + j] = h_i[j]; + } + + memset( tmp, 0, sizeof( tmp ) ); + memset( h_i, 0, sizeof( h_i ) ); + + return( 0 ); +} +#endif + +static void ssl_update_checksum_start(ssl_context *, unsigned char *, size_t); +static void ssl_update_checksum_md5sha1(ssl_context *, unsigned char *, size_t); +static void ssl_update_checksum_sha256(ssl_context *, unsigned char *, size_t); + +static void ssl_calc_verify_ssl(ssl_context *,unsigned char *); +static void ssl_calc_verify_tls(ssl_context *,unsigned char *); +static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *); + +static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int); +static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int); +static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int); + +#if defined(POLARSSL_SHA4_C) +static void ssl_update_checksum_sha384(ssl_context *, unsigned char *, size_t); +static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *); +static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int); +#endif + +int ssl_derive_keys( ssl_context *ssl ) +{ + unsigned char tmp[64]; + unsigned char keyblk[256]; + unsigned char *key1; + unsigned char *key2; + unsigned int iv_copy_len; + ssl_session *session = ssl->session_negotiate; + ssl_transform *transform = ssl->transform_negotiate; + ssl_handshake_params *handshake = ssl->handshake; + + SSL_DEBUG_MSG( 2, ( "=> derive keys" ) ); + + /* + * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions + */ + if( ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + handshake->tls_prf = ssl3_prf; + handshake->calc_verify = ssl_calc_verify_ssl; + handshake->calc_finished = ssl_calc_finished_ssl; + } + else if( ssl->minor_ver < SSL_MINOR_VERSION_3 ) + { + handshake->tls_prf = tls1_prf; + handshake->calc_verify = ssl_calc_verify_tls; + handshake->calc_finished = ssl_calc_finished_tls; + } +#if defined(POLARSSL_SHA4_C) + else if( session->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + session->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + handshake->tls_prf = tls_prf_sha384; + handshake->calc_verify = ssl_calc_verify_tls_sha384; + handshake->calc_finished = ssl_calc_finished_tls_sha384; + } +#endif + else + { + handshake->tls_prf = tls_prf_sha256; + handshake->calc_verify = ssl_calc_verify_tls_sha256; + handshake->calc_finished = ssl_calc_finished_tls_sha256; + } + + /* + * SSLv3: + * master = + * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) + + * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) + + * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) ) + * + * TLSv1: + * master = PRF( premaster, "master secret", randbytes )[0..47] + */ + if( handshake->resume == 0 ) + { + SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster, + handshake->pmslen ); + + handshake->tls_prf( handshake->premaster, handshake->pmslen, + "master secret", + handshake->randbytes, 64, session->master, 48 ); + + memset( handshake->premaster, 0, sizeof( handshake->premaster ) ); + } + else + SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) ); + + /* + * Swap the client and server random values. + */ + memcpy( tmp, handshake->randbytes, 64 ); + memcpy( handshake->randbytes, tmp + 32, 32 ); + memcpy( handshake->randbytes + 32, tmp, 32 ); + memset( tmp, 0, sizeof( tmp ) ); + + /* + * SSLv3: + * key block = + * MD5( master + SHA1( 'A' + master + randbytes ) ) + + * MD5( master + SHA1( 'BB' + master + randbytes ) ) + + * MD5( master + SHA1( 'CCC' + master + randbytes ) ) + + * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) + + * ... + * + * TLSv1: + * key block = PRF( master, "key expansion", randbytes ) + */ + handshake->tls_prf( session->master, 48, "key expansion", + handshake->randbytes, 64, keyblk, 256 ); + + SSL_DEBUG_MSG( 3, ( "ciphersuite = %s", + ssl_get_ciphersuite_name( session->ciphersuite ) ) ); + SSL_DEBUG_BUF( 3, "master secret", session->master, 48 ); + SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 ); + SSL_DEBUG_BUF( 4, "key block", keyblk, 256 ); + + memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) ); + + /* + * Determine the appropriate key, IV and MAC length. + */ + switch( session->ciphersuite ) + { +#if defined(POLARSSL_ARC4_C) + case TLS_RSA_WITH_RC4_128_MD5: + transform->keylen = 16; transform->minlen = 16; + transform->ivlen = 0; transform->maclen = 16; + break; + + case TLS_RSA_WITH_RC4_128_SHA: + transform->keylen = 16; transform->minlen = 20; + transform->ivlen = 0; transform->maclen = 20; + break; +#endif + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_3DES_EDE_CBC_SHA: + case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: + transform->keylen = 24; transform->minlen = 24; + transform->ivlen = 8; transform->maclen = 20; + break; +#endif + +#if defined(POLARSSL_AES_C) + case TLS_RSA_WITH_AES_128_CBC_SHA: + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA: + transform->keylen = 16; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 20; + break; + + case TLS_RSA_WITH_AES_256_CBC_SHA: + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA: + transform->keylen = 32; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 20; + break; + +#if defined(POLARSSL_SHA2_C) + case TLS_RSA_WITH_AES_128_CBC_SHA256: + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: + transform->keylen = 16; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 32; + break; + + case TLS_RSA_WITH_AES_256_CBC_SHA256: + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: + transform->keylen = 32; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 32; + break; +#endif +#if defined(POLARSSL_GCM_C) + case TLS_RSA_WITH_AES_128_GCM_SHA256: + case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: + transform->keylen = 16; transform->minlen = 1; + transform->ivlen = 12; transform->maclen = 0; + transform->fixed_ivlen = 4; + break; + + case TLS_RSA_WITH_AES_256_GCM_SHA384: + case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384: + transform->keylen = 32; transform->minlen = 1; + transform->ivlen = 12; transform->maclen = 0; + transform->fixed_ivlen = 4; + break; +#endif +#endif + +#if defined(POLARSSL_CAMELLIA_C) + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA: + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA: + transform->keylen = 16; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 20; + break; + + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA: + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA: + transform->keylen = 32; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 20; + break; + +#if defined(POLARSSL_SHA2_C) + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256: + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256: + transform->keylen = 16; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 32; + break; + + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256: + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256: + transform->keylen = 32; transform->minlen = 32; + transform->ivlen = 16; transform->maclen = 32; + break; +#endif +#endif + +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + case TLS_RSA_WITH_NULL_MD5: + transform->keylen = 0; transform->minlen = 0; + transform->ivlen = 0; transform->maclen = 16; + break; + + case TLS_RSA_WITH_NULL_SHA: + transform->keylen = 0; transform->minlen = 0; + transform->ivlen = 0; transform->maclen = 20; + break; + + case TLS_RSA_WITH_NULL_SHA256: + transform->keylen = 0; transform->minlen = 0; + transform->ivlen = 0; transform->maclen = 32; + break; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_DES_CBC_SHA: + case TLS_DHE_RSA_WITH_DES_CBC_SHA: + transform->keylen = 8; transform->minlen = 8; + transform->ivlen = 8; transform->maclen = 20; + break; +#endif +#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */ + + default: + SSL_DEBUG_MSG( 1, ( "ciphersuite %s is not available", + ssl_get_ciphersuite_name( session->ciphersuite ) ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + + SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d", + transform->keylen, transform->minlen, transform->ivlen, + transform->maclen ) ); + + /* + * Finally setup the cipher contexts, IVs and MAC secrets. + */ + if( ssl->endpoint == SSL_IS_CLIENT ) + { + key1 = keyblk + transform->maclen * 2; + key2 = keyblk + transform->maclen * 2 + transform->keylen; + + memcpy( transform->mac_enc, keyblk, transform->maclen ); + memcpy( transform->mac_dec, keyblk + transform->maclen, + transform->maclen ); + + /* + * This is not used in TLS v1.1. + */ + iv_copy_len = ( transform->fixed_ivlen ) ? + transform->fixed_ivlen : transform->ivlen; + memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len ); + memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len, + iv_copy_len ); + } + else + { + key1 = keyblk + transform->maclen * 2 + transform->keylen; + key2 = keyblk + transform->maclen * 2; + + memcpy( transform->mac_dec, keyblk, transform->maclen ); + memcpy( transform->mac_enc, keyblk + transform->maclen, + transform->maclen ); + + /* + * This is not used in TLS v1.1. + */ + iv_copy_len = ( transform->fixed_ivlen ) ? + transform->fixed_ivlen : transform->ivlen; + memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len ); + memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len, + iv_copy_len ); + } + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) + if( ssl_hw_record_init != NULL) + { + int ret = 0; + + SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) ); + + if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->iv_enc, + transform->iv_dec, transform->mac_enc, + transform->mac_dec ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret ); + return POLARSSL_ERR_SSL_HW_ACCEL_FAILED; + } + } +#endif + + switch( session->ciphersuite ) + { +#if defined(POLARSSL_ARC4_C) + case TLS_RSA_WITH_RC4_128_MD5: + case TLS_RSA_WITH_RC4_128_SHA: + arc4_setup( (arc4_context *) transform->ctx_enc, key1, + transform->keylen ); + arc4_setup( (arc4_context *) transform->ctx_dec, key2, + transform->keylen ); + break; +#endif + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_3DES_EDE_CBC_SHA: + case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: + des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 ); + des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 ); + break; +#endif + +#if defined(POLARSSL_AES_C) + case TLS_RSA_WITH_AES_128_CBC_SHA: + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA: + case TLS_RSA_WITH_AES_128_CBC_SHA256: + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: + aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 128 ); + aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 128 ); + break; + + case TLS_RSA_WITH_AES_256_CBC_SHA: + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA: + case TLS_RSA_WITH_AES_256_CBC_SHA256: + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: + aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 256 ); + aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 256 ); + break; + +#if defined(POLARSSL_GCM_C) + case TLS_RSA_WITH_AES_128_GCM_SHA256: + case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: + gcm_init( (gcm_context *) transform->ctx_enc, key1, 128 ); + gcm_init( (gcm_context *) transform->ctx_dec, key2, 128 ); + break; + + case TLS_RSA_WITH_AES_256_GCM_SHA384: + case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384: + gcm_init( (gcm_context *) transform->ctx_enc, key1, 256 ); + gcm_init( (gcm_context *) transform->ctx_dec, key2, 256 ); + break; +#endif +#endif + +#if defined(POLARSSL_CAMELLIA_C) + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA: + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA: + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256: + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256: + camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 128 ); + camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 128 ); + break; + + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA: + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA: + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256: + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256: + camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 256 ); + camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 256 ); + break; +#endif + +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + case TLS_RSA_WITH_NULL_MD5: + case TLS_RSA_WITH_NULL_SHA: + case TLS_RSA_WITH_NULL_SHA256: + break; +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_DES_CBC_SHA: + case TLS_DHE_RSA_WITH_DES_CBC_SHA: + des_setkey_enc( (des_context *) transform->ctx_enc, key1 ); + des_setkey_dec( (des_context *) transform->ctx_dec, key2 ); + break; +#endif +#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */ + + default: + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + + memset( keyblk, 0, sizeof( keyblk ) ); + +#if defined(POLARSSL_ZLIB_SUPPORT) + // Initialize compression + // + if( session->compression == SSL_COMPRESS_DEFLATE ) + { + SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) ); + + memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) ); + memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) ); + + if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK || + inflateInit( &transform->ctx_inflate ) != Z_OK ) + { + SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) ); + return( POLARSSL_ERR_SSL_COMPRESSION_FAILED ); + } + } +#endif /* POLARSSL_ZLIB_SUPPORT */ + + SSL_DEBUG_MSG( 2, ( "<= derive keys" ) ); + + return( 0 ); +} + +void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] ) +{ + md5_context md5; + sha1_context sha1; + unsigned char pad_1[48]; + unsigned char pad_2[48]; + + SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) ); + + memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) ); + memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) ); + + memset( pad_1, 0x36, 48 ); + memset( pad_2, 0x5C, 48 ); + + md5_update( &md5, ssl->session_negotiate->master, 48 ); + md5_update( &md5, pad_1, 48 ); + md5_finish( &md5, hash ); + + md5_starts( &md5 ); + md5_update( &md5, ssl->session_negotiate->master, 48 ); + md5_update( &md5, pad_2, 48 ); + md5_update( &md5, hash, 16 ); + md5_finish( &md5, hash ); + + sha1_update( &sha1, ssl->session_negotiate->master, 48 ); + sha1_update( &sha1, pad_1, 40 ); + sha1_finish( &sha1, hash + 16 ); + + sha1_starts( &sha1 ); + sha1_update( &sha1, ssl->session_negotiate->master, 48 ); + sha1_update( &sha1, pad_2, 40 ); + sha1_update( &sha1, hash + 16, 20 ); + sha1_finish( &sha1, hash + 16 ); + + SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); + SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); + + return; +} + +void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] ) +{ + md5_context md5; + sha1_context sha1; + + SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) ); + + memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) ); + memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) ); + + md5_finish( &md5, hash ); + sha1_finish( &sha1, hash + 16 ); + + SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); + SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); + + return; +} + +void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] ) +{ + sha2_context sha2; + + SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) ); + + memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) ); + sha2_finish( &sha2, hash ); + + SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 ); + SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); + + return; +} + +#if defined(POLARSSL_SHA4_C) +void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] ) +{ + sha4_context sha4; + + SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) ); + + memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) ); + sha4_finish( &sha4, hash ); + + SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 ); + SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); + + return; +} +#endif + +/* + * SSLv3.0 MAC functions + */ +static void ssl_mac_md5( unsigned char *secret, + unsigned char *buf, size_t len, + unsigned char *ctr, int type ) +{ + unsigned char header[11]; + unsigned char padding[48]; + md5_context md5; + + memcpy( header, ctr, 8 ); + header[ 8] = (unsigned char) type; + header[ 9] = (unsigned char)( len >> 8 ); + header[10] = (unsigned char)( len ); + + memset( padding, 0x36, 48 ); + md5_starts( &md5 ); + md5_update( &md5, secret, 16 ); + md5_update( &md5, padding, 48 ); + md5_update( &md5, header, 11 ); + md5_update( &md5, buf, len ); + md5_finish( &md5, buf + len ); + + memset( padding, 0x5C, 48 ); + md5_starts( &md5 ); + md5_update( &md5, secret, 16 ); + md5_update( &md5, padding, 48 ); + md5_update( &md5, buf + len, 16 ); + md5_finish( &md5, buf + len ); +} + +static void ssl_mac_sha1( unsigned char *secret, + unsigned char *buf, size_t len, + unsigned char *ctr, int type ) +{ + unsigned char header[11]; + unsigned char padding[40]; + sha1_context sha1; + + memcpy( header, ctr, 8 ); + header[ 8] = (unsigned char) type; + header[ 9] = (unsigned char)( len >> 8 ); + header[10] = (unsigned char)( len ); + + memset( padding, 0x36, 40 ); + sha1_starts( &sha1 ); + sha1_update( &sha1, secret, 20 ); + sha1_update( &sha1, padding, 40 ); + sha1_update( &sha1, header, 11 ); + sha1_update( &sha1, buf, len ); + sha1_finish( &sha1, buf + len ); + + memset( padding, 0x5C, 40 ); + sha1_starts( &sha1 ); + sha1_update( &sha1, secret, 20 ); + sha1_update( &sha1, padding, 40 ); + sha1_update( &sha1, buf + len, 20 ); + sha1_finish( &sha1, buf + len ); +} + +static void ssl_mac_sha2( unsigned char *secret, + unsigned char *buf, size_t len, + unsigned char *ctr, int type ) +{ + unsigned char header[11]; + unsigned char padding[32]; + sha2_context sha2; + + memcpy( header, ctr, 8 ); + header[ 8] = (unsigned char) type; + header[ 9] = (unsigned char)( len >> 8 ); + header[10] = (unsigned char)( len ); + + memset( padding, 0x36, 32 ); + sha2_starts( &sha2, 0 ); + sha2_update( &sha2, secret, 32 ); + sha2_update( &sha2, padding, 32 ); + sha2_update( &sha2, header, 11 ); + sha2_update( &sha2, buf, len ); + sha2_finish( &sha2, buf + len ); + + memset( padding, 0x5C, 32 ); + sha2_starts( &sha2, 0 ); + sha2_update( &sha2, secret, 32 ); + sha2_update( &sha2, padding, 32 ); + sha2_update( &sha2, buf + len, 32 ); + sha2_finish( &sha2, buf + len ); +} + +/* + * Encryption/decryption functions + */ +static int ssl_encrypt_buf( ssl_context *ssl ) +{ + size_t i, padlen; + + SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) ); + + /* + * Add MAC then encrypt + */ + if( ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + if( ssl->transform_out->maclen == 16 ) + ssl_mac_md5( ssl->transform_out->mac_enc, + ssl->out_msg, ssl->out_msglen, + ssl->out_ctr, ssl->out_msgtype ); + else if( ssl->transform_out->maclen == 20 ) + ssl_mac_sha1( ssl->transform_out->mac_enc, + ssl->out_msg, ssl->out_msglen, + ssl->out_ctr, ssl->out_msgtype ); + else if( ssl->transform_out->maclen == 32 ) + ssl_mac_sha2( ssl->transform_out->mac_enc, + ssl->out_msg, ssl->out_msglen, + ssl->out_ctr, ssl->out_msgtype ); + else if( ssl->transform_out->maclen != 0 ) + { + SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d", + ssl->transform_out->maclen ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + } + else + { + if( ssl->transform_out->maclen == 16 ) + { + md5_context ctx; + md5_hmac_starts( &ctx, ssl->transform_out->mac_enc, 16 ); + md5_hmac_update( &ctx, ssl->out_ctr, 13 ); + md5_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen ); + md5_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen ); + memset( &ctx, 0, sizeof(md5_context)); + } + else if( ssl->transform_out->maclen == 20 ) + { + sha1_context ctx; + sha1_hmac_starts( &ctx, ssl->transform_out->mac_enc, 20 ); + sha1_hmac_update( &ctx, ssl->out_ctr, 13 ); + sha1_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen ); + sha1_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen ); + memset( &ctx, 0, sizeof(sha1_context)); + } + else if( ssl->transform_out->maclen == 32 ) + { + sha2_context ctx; + sha2_hmac_starts( &ctx, ssl->transform_out->mac_enc, 32, 0 ); + sha2_hmac_update( &ctx, ssl->out_ctr, 13 ); + sha2_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen ); + sha2_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen ); + memset( &ctx, 0, sizeof(sha2_context)); + } + else if( ssl->transform_out->maclen != 0 ) + { + SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d", + ssl->transform_out->maclen ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + } + + SSL_DEBUG_BUF( 4, "computed mac", + ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen ); + + ssl->out_msglen += ssl->transform_out->maclen; + + if( ssl->transform_out->ivlen == 0 ) + { + padlen = 0; + + SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " + "including %d bytes of padding", + ssl->out_msglen, 0 ) ); + + SSL_DEBUG_BUF( 4, "before encrypt: output payload", + ssl->out_msg, ssl->out_msglen ); + +#if defined(POLARSSL_ARC4_C) + if( ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 || + ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_SHA ) + { + arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc, + ssl->out_msglen, ssl->out_msg, + ssl->out_msg ); + } else +#endif +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if( ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_MD5 || + ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA || + ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA256 ) + { + } else +#endif + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + else if( ssl->transform_out->ivlen == 12 ) + { + size_t enc_msglen; + unsigned char *enc_msg; + unsigned char add_data[13]; + int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE; + + padlen = 0; + enc_msglen = ssl->out_msglen; + + memcpy( add_data, ssl->out_ctr, 8 ); + add_data[8] = ssl->out_msgtype; + add_data[9] = ssl->major_ver; + add_data[10] = ssl->minor_ver; + add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF; + add_data[12] = ssl->out_msglen & 0xFF; + + SSL_DEBUG_BUF( 4, "additional data used for AEAD", + add_data, 13 ); + +#if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C) + + if( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + /* + * Generate IV + */ + ret = ssl->f_rng( ssl->p_rng, + ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen, + ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen ); + if( ret != 0 ) + return( ret ); + + /* + * Shift message for ivlen bytes and prepend IV + */ + memmove( ssl->out_msg + ssl->transform_out->ivlen - + ssl->transform_out->fixed_ivlen, + ssl->out_msg, ssl->out_msglen ); + memcpy( ssl->out_msg, + ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen, + ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen ); + + /* + * Fix pointer positions and message length with added IV + */ + enc_msg = ssl->out_msg + ssl->transform_out->ivlen - + ssl->transform_out->fixed_ivlen; + enc_msglen = ssl->out_msglen; + ssl->out_msglen += ssl->transform_out->ivlen - + ssl->transform_out->fixed_ivlen; + + SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " + "including %d bytes of padding", + ssl->out_msglen, 0 ) ); + + SSL_DEBUG_BUF( 4, "before encrypt: output payload", + ssl->out_msg, ssl->out_msglen ); + + /* + * Adjust for tag + */ + ssl->out_msglen += 16; + + gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc, + GCM_ENCRYPT, enc_msglen, + ssl->transform_out->iv_enc, ssl->transform_out->ivlen, + add_data, 13, + enc_msg, enc_msg, + 16, enc_msg + enc_msglen ); + + SSL_DEBUG_BUF( 4, "after encrypt: tag", + enc_msg + enc_msglen, 16 ); + + } else +#endif + return( ret ); + } + else + { + unsigned char *enc_msg; + size_t enc_msglen; + + padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) % + ssl->transform_out->ivlen; + if( padlen == ssl->transform_out->ivlen ) + padlen = 0; + + for( i = 0; i <= padlen; i++ ) + ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen; + + ssl->out_msglen += padlen + 1; + + enc_msglen = ssl->out_msglen; + enc_msg = ssl->out_msg; + + /* + * Prepend per-record IV for block cipher in TLS v1.1 and up as per + * Method 1 (6.2.3.2. in RFC4346 and RFC5246) + */ + if( ssl->minor_ver >= SSL_MINOR_VERSION_2 ) + { + /* + * Generate IV + */ + int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc, + ssl->transform_out->ivlen ); + if( ret != 0 ) + return( ret ); + + /* + * Shift message for ivlen bytes and prepend IV + */ + memmove( ssl->out_msg + ssl->transform_out->ivlen, ssl->out_msg, + ssl->out_msglen ); + memcpy( ssl->out_msg, ssl->transform_out->iv_enc, + ssl->transform_out->ivlen ); + + /* + * Fix pointer positions and message length with added IV + */ + enc_msg = ssl->out_msg + ssl->transform_out->ivlen; + enc_msglen = ssl->out_msglen; + ssl->out_msglen += ssl->transform_out->ivlen; + } + + SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " + "including %d bytes of IV and %d bytes of padding", + ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) ); + + SSL_DEBUG_BUF( 4, "before encrypt: output payload", + ssl->out_msg, ssl->out_msglen ); + + switch( ssl->transform_out->ivlen ) + { +#if defined(POLARSSL_DES_C) + case 8: +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) + if( ssl->session_out->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA ) + { + des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc, + DES_ENCRYPT, enc_msglen, + ssl->transform_out->iv_enc, enc_msg, enc_msg ); + } + else +#endif + des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc, + DES_ENCRYPT, enc_msglen, + ssl->transform_out->iv_enc, enc_msg, enc_msg ); + break; +#endif + + case 16: +#if defined(POLARSSL_AES_C) + if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA || + ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA || + ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 ) + { + aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc, + AES_ENCRYPT, enc_msglen, + ssl->transform_out->iv_enc, enc_msg, enc_msg); + break; + } +#endif + +#if defined(POLARSSL_CAMELLIA_C) + if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 || + ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 ) + { + camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc, + CAMELLIA_ENCRYPT, enc_msglen, + ssl->transform_out->iv_enc, enc_msg, enc_msg ); + break; + } +#endif + + default: + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + } + + for( i = 8; i > 0; i-- ) + if( ++ssl->out_ctr[i - 1] != 0 ) + break; + + SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) ); + + return( 0 ); +} + +/* + * TODO: Use digest version when integrated! + */ +#define POLARSSL_SSL_MAX_MAC_SIZE 32 + +static int ssl_decrypt_buf( ssl_context *ssl ) +{ + size_t i, padlen = 0, correct = 1; + unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE]; + + SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) ); + + if( ssl->in_msglen < ssl->transform_in->minlen ) + { + SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)", + ssl->in_msglen, ssl->transform_in->minlen ) ); + return( POLARSSL_ERR_SSL_INVALID_MAC ); + } + + if( ssl->transform_in->ivlen == 0 ) + { +#if defined(POLARSSL_ARC4_C) + if( ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 || + ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_SHA ) + { + arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec, + ssl->in_msglen, ssl->in_msg, + ssl->in_msg ); + } else +#endif +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if( ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_MD5 || + ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA || + ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA256 ) + { + } else +#endif + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + else if( ssl->transform_in->ivlen == 12 ) + { + unsigned char *dec_msg; + unsigned char *dec_msg_result; + size_t dec_msglen; + unsigned char add_data[13]; + int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE; + +#if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C) + if( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen - + ssl->transform_in->fixed_ivlen ); + dec_msglen -= 16; + dec_msg = ssl->in_msg + ( ssl->transform_in->ivlen - + ssl->transform_in->fixed_ivlen ); + dec_msg_result = ssl->in_msg; + ssl->in_msglen = dec_msglen; + + memcpy( add_data, ssl->in_ctr, 8 ); + add_data[8] = ssl->in_msgtype; + add_data[9] = ssl->major_ver; + add_data[10] = ssl->minor_ver; + add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF; + add_data[12] = ssl->in_msglen & 0xFF; + + SSL_DEBUG_BUF( 4, "additional data used for AEAD", + add_data, 13 ); + + memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen, + ssl->in_msg, + ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen ); + + SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec, + ssl->transform_in->ivlen ); + SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 ); + + memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen, + ssl->in_msg, + ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen ); + + ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec, + dec_msglen, + ssl->transform_in->iv_dec, + ssl->transform_in->ivlen, + add_data, 13, + dec_msg + dec_msglen, 16, + dec_msg, dec_msg_result ); + + if( ret != 0 ) + { + SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)", + -ret ) ); + + return( POLARSSL_ERR_SSL_INVALID_MAC ); + } + } else +#endif + return( ret ); + } + else + { + /* + * Decrypt and check the padding + */ + unsigned char *dec_msg; + unsigned char *dec_msg_result; + size_t dec_msglen; + size_t minlen = 0; + + /* + * Check immediate ciphertext sanity + */ + if( ssl->in_msglen % ssl->transform_in->ivlen != 0 ) + { + SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0", + ssl->in_msglen, ssl->transform_in->ivlen ) ); + return( POLARSSL_ERR_SSL_INVALID_MAC ); + } + + if( ssl->minor_ver >= SSL_MINOR_VERSION_2 ) + minlen += ssl->transform_in->ivlen; + + if( ssl->in_msglen < minlen + ssl->transform_in->ivlen || + ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 ) + { + SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )", + ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) ); + return( POLARSSL_ERR_SSL_INVALID_MAC ); + } + + dec_msglen = ssl->in_msglen; + dec_msg = ssl->in_msg; + dec_msg_result = ssl->in_msg; + + /* + * Initialize for prepended IV for block cipher in TLS v1.1 and up + */ + if( ssl->minor_ver >= SSL_MINOR_VERSION_2 ) + { + dec_msg += ssl->transform_in->ivlen; + dec_msglen -= ssl->transform_in->ivlen; + ssl->in_msglen -= ssl->transform_in->ivlen; + + for( i = 0; i < ssl->transform_in->ivlen; i++ ) + ssl->transform_in->iv_dec[i] = ssl->in_msg[i]; + } + + switch( ssl->transform_in->ivlen ) + { +#if defined(POLARSSL_DES_C) + case 8: +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) + if( ssl->session_in->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA ) + { + des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec, + DES_DECRYPT, dec_msglen, + ssl->transform_in->iv_dec, dec_msg, dec_msg_result ); + } + else +#endif + des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec, + DES_DECRYPT, dec_msglen, + ssl->transform_in->iv_dec, dec_msg, dec_msg_result ); + break; +#endif + + case 16: +#if defined(POLARSSL_AES_C) + if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA || + ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA || + ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 ) + { + aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec, + AES_DECRYPT, dec_msglen, + ssl->transform_in->iv_dec, dec_msg, dec_msg_result ); + break; + } +#endif + +#if defined(POLARSSL_CAMELLIA_C) + if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA || + ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA || + ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 || + ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 ) + { + camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec, + CAMELLIA_DECRYPT, dec_msglen, + ssl->transform_in->iv_dec, dec_msg, dec_msg_result ); + break; + } +#endif + + default: + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + + padlen = 1 + ssl->in_msg[ssl->in_msglen - 1]; + + if( ssl->in_msglen < ssl->transform_in->maclen + padlen ) + { +#if defined(POLARSSL_SSL_DEBUG_ALL) + SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)", + ssl->in_msglen, ssl->transform_in->maclen, padlen ) ); +#endif + padlen = 0; + correct = 0; + } + + if( ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + if( padlen > ssl->transform_in->ivlen ) + { +#if defined(POLARSSL_SSL_DEBUG_ALL) + SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, " + "should be no more than %d", + padlen, ssl->transform_in->ivlen ) ); +#endif + correct = 0; + } + } + else + { + /* + * TLSv1+: always check the padding up to the first failure + * and fake check up to 256 bytes of padding + */ + size_t pad_count = 0, fake_pad_count = 0; + size_t padding_idx = ssl->in_msglen - padlen - 1; + + for( i = 1; i <= padlen; i++ ) + pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 ); + + for( ; i <= 256; i++ ) + fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 ); + + correct &= ( pad_count == padlen ); /* Only 1 on correct padding */ + correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */ + +#if defined(POLARSSL_SSL_DEBUG_ALL) + if( padlen > 0 && correct == 0) + SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) ); +#endif + padlen &= correct * 0x1FF; + } + } + + SSL_DEBUG_BUF( 4, "raw buffer after decryption", + ssl->in_msg, ssl->in_msglen ); + + /* + * Always compute the MAC (RFC4346, CBCTIME). + */ + ssl->in_msglen -= ( ssl->transform_in->maclen + padlen ); + + ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 ); + ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen ); + + memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen ); + + if( ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + if( ssl->transform_in->maclen == 16 ) + ssl_mac_md5( ssl->transform_in->mac_dec, + ssl->in_msg, ssl->in_msglen, + ssl->in_ctr, ssl->in_msgtype ); + else if( ssl->transform_in->maclen == 20 ) + ssl_mac_sha1( ssl->transform_in->mac_dec, + ssl->in_msg, ssl->in_msglen, + ssl->in_ctr, ssl->in_msgtype ); + else if( ssl->transform_in->maclen == 32 ) + ssl_mac_sha2( ssl->transform_in->mac_dec, + ssl->in_msg, ssl->in_msglen, + ssl->in_ctr, ssl->in_msgtype ); + else if( ssl->transform_in->maclen != 0 ) + { + SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d", + ssl->transform_in->maclen ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + } + else + { + /* + * Process MAC and always update for padlen afterwards to make + * total time independent of padlen + * + * extra_run compensates MAC check for padlen + * + * Known timing attacks: + * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf) + * + * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values + * correctly. (We round down instead of up, so -56 is the correct + * value for our calculations instead of -55) + */ + int j, extra_run = 0; + extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 - + ( 13 + ssl->in_msglen + 8 ) / 64; + + extra_run &= correct * 0xFF; + + if( ssl->transform_in->maclen == 16 ) + { + md5_context ctx; + md5_hmac_starts( &ctx, ssl->transform_in->mac_dec, 16 ); + md5_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 ); + md5_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen ); + + for( j = 0; j < extra_run; j++ ) + md5_process( &ctx, ssl->in_msg ); + } + else if( ssl->transform_in->maclen == 20 ) + { + sha1_context ctx; + sha1_hmac_starts( &ctx, ssl->transform_in->mac_dec, 20 ); + sha1_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 ); + sha1_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen ); + + for( j = 0; j < extra_run; j++ ) + sha1_process( &ctx, ssl->in_msg ); + } + else if( ssl->transform_in->maclen == 32 ) + { + sha2_context ctx; + sha2_hmac_starts( &ctx, ssl->transform_in->mac_dec, 32, 0 ); + sha2_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 ); + sha2_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen ); + + for( j = 0; j < extra_run; j++ ) + sha2_process( &ctx, ssl->in_msg ); + } + else if( ssl->transform_in->maclen != 0 ) + { + SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d", + ssl->transform_in->maclen ) ); + return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE ); + } + } + + SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen ); + SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen, + ssl->transform_in->maclen ); + + if( memcmp( tmp, ssl->in_msg + ssl->in_msglen, + ssl->transform_in->maclen ) != 0 ) + { +#if defined(POLARSSL_SSL_DEBUG_ALL) + SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); +#endif + correct = 0; + } + + /* + * Finally check the correct flag + */ + if( correct == 0 ) + return( POLARSSL_ERR_SSL_INVALID_MAC ); + + if( ssl->in_msglen == 0 ) + { + ssl->nb_zero++; + + /* + * Three or more empty messages may be a DoS attack + * (excessive CPU consumption). + */ + if( ssl->nb_zero > 3 ) + { + SSL_DEBUG_MSG( 1, ( "received four consecutive empty " + "messages, possible DoS attack" ) ); + return( POLARSSL_ERR_SSL_INVALID_MAC ); + } + } + else + ssl->nb_zero = 0; + + for( i = 8; i > 0; i-- ) + if( ++ssl->in_ctr[i - 1] != 0 ) + break; + + SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) ); + + return( 0 ); +} + +#if defined(POLARSSL_ZLIB_SUPPORT) +/* + * Compression/decompression functions + */ +static int ssl_compress_buf( ssl_context *ssl ) +{ + int ret; + unsigned char *msg_post = ssl->out_msg; + size_t len_pre = ssl->out_msglen; + unsigned char *msg_pre; + + SSL_DEBUG_MSG( 2, ( "=> compress buf" ) ); + + msg_pre = (unsigned char*) malloc( len_pre ); + if( msg_pre == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + memcpy( msg_pre, ssl->out_msg, len_pre ); + + SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ", + ssl->out_msglen ) ); + + SSL_DEBUG_BUF( 4, "before compression: output payload", + ssl->out_msg, ssl->out_msglen ); + + ssl->transform_out->ctx_deflate.next_in = msg_pre; + ssl->transform_out->ctx_deflate.avail_in = len_pre; + ssl->transform_out->ctx_deflate.next_out = msg_post; + ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN; + + ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH ); + if( ret != Z_OK ) + { + SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) ); + return( POLARSSL_ERR_SSL_COMPRESSION_FAILED ); + } + + ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out; + + free( msg_pre ); + + SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ", + ssl->out_msglen ) ); + + SSL_DEBUG_BUF( 4, "after compression: output payload", + ssl->out_msg, ssl->out_msglen ); + + SSL_DEBUG_MSG( 2, ( "<= compress buf" ) ); + + return( 0 ); +} + +static int ssl_decompress_buf( ssl_context *ssl ) +{ + int ret; + unsigned char *msg_post = ssl->in_msg; + size_t len_pre = ssl->in_msglen; + unsigned char *msg_pre; + + SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) ); + + msg_pre = (unsigned char*) malloc( len_pre ); + if( msg_pre == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + memcpy( msg_pre, ssl->in_msg, len_pre ); + + SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ", + ssl->in_msglen ) ); + + SSL_DEBUG_BUF( 4, "before decompression: input payload", + ssl->in_msg, ssl->in_msglen ); + + ssl->transform_in->ctx_inflate.next_in = msg_pre; + ssl->transform_in->ctx_inflate.avail_in = len_pre; + ssl->transform_in->ctx_inflate.next_out = msg_post; + ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN; + + ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH ); + if( ret != Z_OK ) + { + SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) ); + return( POLARSSL_ERR_SSL_COMPRESSION_FAILED ); + } + + ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out; + + free( msg_pre ); + + SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ", + ssl->in_msglen ) ); + + SSL_DEBUG_BUF( 4, "after decompression: input payload", + ssl->in_msg, ssl->in_msglen ); + + SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) ); + + return( 0 ); +} +#endif /* POLARSSL_ZLIB_SUPPORT */ + +/* + * Fill the input message buffer + */ +int ssl_fetch_input( ssl_context *ssl, size_t nb_want ) +{ + int ret; + size_t len; + + SSL_DEBUG_MSG( 2, ( "=> fetch input" ) ); + + while( ssl->in_left < nb_want ) + { + len = nb_want - ssl->in_left; + ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len ); + + SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", + ssl->in_left, nb_want ) ); + SSL_DEBUG_RET( 2, "ssl->f_recv", ret ); + + if( ret == 0 ) + return( POLARSSL_ERR_SSL_CONN_EOF ); + + if( ret < 0 ) + return( ret ); + + ssl->in_left += ret; + } + + SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); + + return( 0 ); +} + +/* + * Flush any data not yet written + */ +int ssl_flush_output( ssl_context *ssl ) +{ + int ret; + unsigned char *buf; + + SSL_DEBUG_MSG( 2, ( "=> flush output" ) ); + + while( ssl->out_left > 0 ) + { + SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d", + 5 + ssl->out_msglen, ssl->out_left ) ); + + if( ssl->out_msglen < ssl->out_left ) + { + size_t header_left = ssl->out_left - ssl->out_msglen; + + buf = ssl->out_hdr + 5 - header_left; + ret = ssl->f_send( ssl->p_send, buf, header_left ); + + SSL_DEBUG_RET( 2, "ssl->f_send (header)", ret ); + + if( ret <= 0 ) + return( ret ); + + ssl->out_left -= ret; + } + + buf = ssl->out_msg + ssl->out_msglen - ssl->out_left; + ret = ssl->f_send( ssl->p_send, buf, ssl->out_left ); + + SSL_DEBUG_RET( 2, "ssl->f_send", ret ); + + if( ret <= 0 ) + return( ret ); + + ssl->out_left -= ret; + } + + SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); + + return( 0 ); +} + +/* + * Record layer functions + */ +int ssl_write_record( ssl_context *ssl ) +{ + int ret, done = 0; + size_t len = ssl->out_msglen; + + SSL_DEBUG_MSG( 2, ( "=> write record" ) ); + + if( ssl->out_msgtype == SSL_MSG_HANDSHAKE ) + { + ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 ); + ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 ); + ssl->out_msg[3] = (unsigned char)( ( len - 4 ) ); + + ssl->handshake->update_checksum( ssl, ssl->out_msg, len ); + } + +#if defined(POLARSSL_ZLIB_SUPPORT) + if( ssl->transform_out != NULL && + ssl->session_out->compression == SSL_COMPRESS_DEFLATE ) + { + if( ( ret = ssl_compress_buf( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_compress_buf", ret ); + return( ret ); + } + + len = ssl->out_msglen; + } +#endif /*POLARSSL_ZLIB_SUPPORT */ + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) + if( ssl_hw_record_write != NULL) + { + SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) ); + + ret = ssl_hw_record_write( ssl ); + if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH ) + { + SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret ); + return POLARSSL_ERR_SSL_HW_ACCEL_FAILED; + } + done = 1; + } +#endif + if( !done ) + { + ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype; + ssl->out_hdr[1] = (unsigned char) ssl->major_ver; + ssl->out_hdr[2] = (unsigned char) ssl->minor_ver; + ssl->out_hdr[3] = (unsigned char)( len >> 8 ); + ssl->out_hdr[4] = (unsigned char)( len ); + + if( ssl->transform_out != NULL ) + { + if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret ); + return( ret ); + } + + len = ssl->out_msglen; + ssl->out_hdr[3] = (unsigned char)( len >> 8 ); + ssl->out_hdr[4] = (unsigned char)( len ); + } + + ssl->out_left = 5 + ssl->out_msglen; + + SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, " + "version = [%d:%d], msglen = %d", + ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2], + ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) ); + + SSL_DEBUG_BUF( 4, "output record header sent to network", + ssl->out_hdr, 5 ); + SSL_DEBUG_BUF( 4, "output record sent to network", + ssl->out_hdr + 32, ssl->out_msglen ); + } + + if( ( ret = ssl_flush_output( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_flush_output", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write record" ) ); + + return( 0 ); +} + +int ssl_read_record( ssl_context *ssl ) +{ + int ret, done = 0; + + SSL_DEBUG_MSG( 2, ( "=> read record" ) ); + + if( ssl->in_hslen != 0 && + ssl->in_hslen < ssl->in_msglen ) + { + /* + * Get next Handshake message in the current record + */ + ssl->in_msglen -= ssl->in_hslen; + + memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen, + ssl->in_msglen ); + + ssl->in_hslen = 4; + ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3]; + + SSL_DEBUG_MSG( 3, ( "handshake message: msglen =" + " %d, type = %d, hslen = %d", + ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) ); + + if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad handshake length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->in_msglen < ssl->in_hslen ) + { + SSL_DEBUG_MSG( 1, ( "bad handshake length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen ); + + return( 0 ); + } + + ssl->in_hslen = 0; + + /* + * Read the record header and validate it + */ + if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_fetch_input", ret ); + return( ret ); + } + + ssl->in_msgtype = ssl->in_hdr[0]; + ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4]; + + SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, " + "version = [%d:%d], msglen = %d", + ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2], + ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) ); + + if( ssl->in_hdr[1] != ssl->major_ver ) + { + SSL_DEBUG_MSG( 1, ( "major version mismatch" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->in_hdr[2] > ssl->max_minor_ver ) + { + SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + /* + * Make sure the message length is acceptable + */ + if( ssl->transform_in == NULL ) + { + if( ssl->in_msglen < 1 || + ssl->in_msglen > SSL_MAX_CONTENT_LEN ) + { + SSL_DEBUG_MSG( 1, ( "bad message length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + } + else + { + if( ssl->in_msglen < ssl->transform_in->minlen ) + { + SSL_DEBUG_MSG( 1, ( "bad message length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->minor_ver == SSL_MINOR_VERSION_0 && + ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN ) + { + SSL_DEBUG_MSG( 1, ( "bad message length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + /* + * TLS encrypted messages can have up to 256 bytes of padding + */ + if( ssl->minor_ver >= SSL_MINOR_VERSION_1 && + ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 ) + { + SSL_DEBUG_MSG( 1, ( "bad message length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + } + + /* + * Read and optionally decrypt the message contents + */ + if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_fetch_input", ret ); + return( ret ); + } + + SSL_DEBUG_BUF( 4, "input record from network", + ssl->in_hdr, 5 + ssl->in_msglen ); + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) + if( ssl_hw_record_read != NULL) + { + SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) ); + + ret = ssl_hw_record_read( ssl ); + if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH ) + { + SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret ); + return POLARSSL_ERR_SSL_HW_ACCEL_FAILED; + } + done = 1; + } +#endif + if( !done && ssl->transform_in != NULL ) + { + if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 ) + { +#if defined(POLARSSL_SSL_ALERT_MESSAGES) + if( ret == POLARSSL_ERR_SSL_INVALID_MAC ) + { + ssl_send_alert_message( ssl, + SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_BAD_RECORD_MAC ); + } +#endif + SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret ); + return( ret ); + } + + SSL_DEBUG_BUF( 4, "input payload after decrypt", + ssl->in_msg, ssl->in_msglen ); + + if( ssl->in_msglen > SSL_MAX_CONTENT_LEN ) + { + SSL_DEBUG_MSG( 1, ( "bad message length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + } + +#if defined(POLARSSL_ZLIB_SUPPORT) + if( ssl->transform_in != NULL && + ssl->session_in->compression == SSL_COMPRESS_DEFLATE ) + { + if( ( ret = ssl_decompress_buf( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret ); + return( ret ); + } + + ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 ); + ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen ); + } +#endif /* POLARSSL_ZLIB_SUPPORT */ + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE && + ssl->in_msgtype != SSL_MSG_ALERT && + ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC && + ssl->in_msgtype != SSL_MSG_APPLICATION_DATA ) + { + SSL_DEBUG_MSG( 1, ( "unknown record type" ) ); + + if( ( ret = ssl_send_alert_message( ssl, + SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 ) + { + return( ret ); + } + + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->in_msgtype == SSL_MSG_HANDSHAKE ) + { + ssl->in_hslen = 4; + ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3]; + + SSL_DEBUG_MSG( 3, ( "handshake message: msglen =" + " %d, type = %d, hslen = %d", + ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) ); + + /* + * Additional checks to validate the handshake header + */ + if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad handshake length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->in_msglen < ssl->in_hslen ) + { + SSL_DEBUG_MSG( 1, ( "bad handshake length" ) ); + return( POLARSSL_ERR_SSL_INVALID_RECORD ); + } + + if( ssl->state != SSL_HANDSHAKE_OVER ) + ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen ); + } + + if( ssl->in_msgtype == SSL_MSG_ALERT ) + { + SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]", + ssl->in_msg[0], ssl->in_msg[1] ) ); + + /* + * Ignore non-fatal alerts, except close_notify + */ + if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL ) + { + SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)", + ssl->in_msg[1] ) ); + /** + * Subtract from error code as ssl->in_msg[1] is 7-bit positive + * error identifier. + */ + return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE ); + } + + if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY ) + { + SSL_DEBUG_MSG( 2, ( "is a close notify message" ) ); + return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ); + } + } + + ssl->in_left = 0; + + SSL_DEBUG_MSG( 2, ( "<= read record" ) ); + + return( 0 ); +} + +int ssl_send_fatal_handshake_failure( ssl_context *ssl ) +{ + int ret; + + if( ( ret = ssl_send_alert_message( ssl, + SSL_ALERT_LEVEL_FATAL, + SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 ) + { + return( ret ); + } + + return( 0 ); +} + +int ssl_send_alert_message( ssl_context *ssl, + unsigned char level, + unsigned char message ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> send alert message" ) ); + + ssl->out_msgtype = SSL_MSG_ALERT; + ssl->out_msglen = 2; + ssl->out_msg[0] = level; + ssl->out_msg[1] = message; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= send alert message" ) ); + + return( 0 ); +} + +/* + * Handshake functions + */ +int ssl_write_certificate( ssl_context *ssl ) +{ + int ret; + size_t i, n; + const x509_cert *crt; + + SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); + + if( ssl->endpoint == SSL_IS_CLIENT ) + { + if( ssl->client_auth == 0 ) + { + SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); + ssl->state++; + return( 0 ); + } + + /* + * If using SSLv3 and got no cert, send an Alert message + * (otherwise an empty Certificate message will be sent). + */ + if( ssl->own_cert == NULL && + ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + ssl->out_msglen = 2; + ssl->out_msgtype = SSL_MSG_ALERT; + ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING; + ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT; + + SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) ); + goto write_msg; + } + } + else /* SSL_IS_SERVER */ + { + if( ssl->own_cert == NULL ) + { + SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) ); + return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED ); + } + } + + SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert ); + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 6 length of all certs + * 7 . 9 length of cert. 1 + * 10 . n-1 peer certificate + * n . n+2 length of cert. 2 + * n+3 . ... upper level cert, etc. + */ + i = 7; + crt = ssl->own_cert; + + while( crt != NULL ) + { + n = crt->raw.len; + if( i + 3 + n > SSL_MAX_CONTENT_LEN ) + { + SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d", + i + 3 + n, SSL_MAX_CONTENT_LEN ) ); + return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE ); + } + + ssl->out_msg[i ] = (unsigned char)( n >> 16 ); + ssl->out_msg[i + 1] = (unsigned char)( n >> 8 ); + ssl->out_msg[i + 2] = (unsigned char)( n ); + + i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n ); + i += n; crt = crt->next; + } + + ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 ); + ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 ); + ssl->out_msg[6] = (unsigned char)( ( i - 7 ) ); + + ssl->out_msglen = i; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_CERTIFICATE; + +write_msg: + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write certificate" ) ); + + return( 0 ); +} + +int ssl_parse_certificate( ssl_context *ssl ) +{ + int ret; + size_t i, n; + + SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); + + if( ssl->endpoint == SSL_IS_SERVER && + ssl->authmode == SSL_VERIFY_NONE ) + { + ssl->verify_result = BADCERT_SKIP_VERIFY; + SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); + ssl->state++; + return( 0 ); + } + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + ssl->state++; + + /* + * Check if the client sent an empty certificate + */ + if( ssl->endpoint == SSL_IS_SERVER && + ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + if( ssl->in_msglen == 2 && + ssl->in_msgtype == SSL_MSG_ALERT && + ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT ) + { + SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) ); + + ssl->verify_result = BADCERT_MISSING; + if( ssl->authmode == SSL_VERIFY_OPTIONAL ) + return( 0 ); + else + return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE ); + } + } + + if( ssl->endpoint == SSL_IS_SERVER && + ssl->minor_ver != SSL_MINOR_VERSION_0 ) + { + if( ssl->in_hslen == 7 && + ssl->in_msgtype == SSL_MSG_HANDSHAKE && + ssl->in_msg[0] == SSL_HS_CERTIFICATE && + memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 ) + { + SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) ); + + ssl->verify_result = BADCERT_MISSING; + if( ssl->authmode == SSL_VERIFY_REQUIRED ) + return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE ); + else + return( 0 ); + } + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE ); + } + + /* + * Same message structure as in ssl_write_certificate() + */ + n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6]; + + if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE ); + } + + if( ( ssl->session_negotiate->peer_cert = (x509_cert *) malloc( + sizeof( x509_cert ) ) ) == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", + sizeof( x509_cert ) ) ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) ); + + i = 7; + + while( i < ssl->in_hslen ) + { + if( ssl->in_msg[i] != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE ); + } + + n = ( (unsigned int) ssl->in_msg[i + 1] << 8 ) + | (unsigned int) ssl->in_msg[i + 2]; + i += 3; + + if( n < 128 || i + n > ssl->in_hslen ) + { + SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE ); + } + + ret = x509parse_crt_der( ssl->session_negotiate->peer_cert, + ssl->in_msg + i, n ); + if( ret != 0 ) + { + SSL_DEBUG_RET( 1, " x509parse_crt", ret ); + return( ret ); + } + + i += n; + } + + SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert ); + + if( ssl->authmode != SSL_VERIFY_NONE ) + { + if( ssl->ca_chain == NULL ) + { + SSL_DEBUG_MSG( 1, ( "got no CA chain" ) ); + return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED ); + } + + ret = x509parse_verify( ssl->session_negotiate->peer_cert, + ssl->ca_chain, ssl->ca_crl, + ssl->peer_cn, &ssl->verify_result, + ssl->f_vrfy, ssl->p_vrfy ); + + if( ret != 0 ) + SSL_DEBUG_RET( 1, "x509_verify_cert", ret ); + + if( ssl->authmode != SSL_VERIFY_REQUIRED ) + ret = 0; + } + + SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) ); + + return( ret ); +} + +int ssl_write_change_cipher_spec( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) ); + + ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC; + ssl->out_msglen = 1; + ssl->out_msg[0] = 1; + + ssl->state++; + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) ); + + return( 0 ); +} + +int ssl_parse_change_cipher_spec( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) ); + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC ) + { + SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 ) + { + SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC ); + } + + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) ); + + return( 0 ); +} + +void ssl_optimize_checksum( ssl_context *ssl, int ciphersuite ) +{ +#if !defined(POLARSSL_SHA4_C) + ((void) ciphersuite); +#endif + + if( ssl->minor_ver < SSL_MINOR_VERSION_3 ) + ssl->handshake->update_checksum = ssl_update_checksum_md5sha1; +#if defined(POLARSSL_SHA4_C) + else if ( ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 || + ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ) + { + ssl->handshake->update_checksum = ssl_update_checksum_sha384; + } +#endif + else + ssl->handshake->update_checksum = ssl_update_checksum_sha256; +} + +static void ssl_update_checksum_start( ssl_context *ssl, unsigned char *buf, + size_t len ) +{ + md5_update( &ssl->handshake->fin_md5 , buf, len ); + sha1_update( &ssl->handshake->fin_sha1, buf, len ); + sha2_update( &ssl->handshake->fin_sha2, buf, len ); +#if defined(POLARSSL_SHA4_C) + sha4_update( &ssl->handshake->fin_sha4, buf, len ); +#endif +} + +static void ssl_update_checksum_md5sha1( ssl_context *ssl, unsigned char *buf, + size_t len ) +{ + md5_update( &ssl->handshake->fin_md5 , buf, len ); + sha1_update( &ssl->handshake->fin_sha1, buf, len ); +} + +static void ssl_update_checksum_sha256( ssl_context *ssl, unsigned char *buf, + size_t len ) +{ + sha2_update( &ssl->handshake->fin_sha2, buf, len ); +} + +#if defined(POLARSSL_SHA4_C) +static void ssl_update_checksum_sha384( ssl_context *ssl, unsigned char *buf, + size_t len ) +{ + sha4_update( &ssl->handshake->fin_sha4, buf, len ); +} +#endif + +static void ssl_calc_finished_ssl( + ssl_context *ssl, unsigned char *buf, int from ) +{ + const char *sender; + md5_context md5; + sha1_context sha1; + + unsigned char padbuf[48]; + unsigned char md5sum[16]; + unsigned char sha1sum[20]; + + ssl_session *session = ssl->session_negotiate; + if( !session ) + session = ssl->session; + + SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) ); + + memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) ); + memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) ); + + /* + * SSLv3: + * hash = + * MD5( master + pad2 + + * MD5( handshake + sender + master + pad1 ) ) + * + SHA1( master + pad2 + + * SHA1( handshake + sender + master + pad1 ) ) + */ + +#if !defined(POLARSSL_MD5_ALT) + SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) + md5.state, sizeof( md5.state ) ); +#endif + +#if !defined(POLARSSL_SHA1_ALT) + SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) + sha1.state, sizeof( sha1.state ) ); +#endif + + sender = ( from == SSL_IS_CLIENT ) ? "CLNT" + : "SRVR"; + + memset( padbuf, 0x36, 48 ); + + md5_update( &md5, (const unsigned char *) sender, 4 ); + md5_update( &md5, session->master, 48 ); + md5_update( &md5, padbuf, 48 ); + md5_finish( &md5, md5sum ); + + sha1_update( &sha1, (const unsigned char *) sender, 4 ); + sha1_update( &sha1, session->master, 48 ); + sha1_update( &sha1, padbuf, 40 ); + sha1_finish( &sha1, sha1sum ); + + memset( padbuf, 0x5C, 48 ); + + md5_starts( &md5 ); + md5_update( &md5, session->master, 48 ); + md5_update( &md5, padbuf, 48 ); + md5_update( &md5, md5sum, 16 ); + md5_finish( &md5, buf ); + + sha1_starts( &sha1 ); + sha1_update( &sha1, session->master, 48 ); + sha1_update( &sha1, padbuf , 40 ); + sha1_update( &sha1, sha1sum, 20 ); + sha1_finish( &sha1, buf + 16 ); + + SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 ); + + memset( &md5, 0, sizeof( md5_context ) ); + memset( &sha1, 0, sizeof( sha1_context ) ); + + memset( padbuf, 0, sizeof( padbuf ) ); + memset( md5sum, 0, sizeof( md5sum ) ); + memset( sha1sum, 0, sizeof( sha1sum ) ); + + SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); +} + +static void ssl_calc_finished_tls( + ssl_context *ssl, unsigned char *buf, int from ) +{ + int len = 12; + const char *sender; + md5_context md5; + sha1_context sha1; + unsigned char padbuf[36]; + + ssl_session *session = ssl->session_negotiate; + if( !session ) + session = ssl->session; + + SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) ); + + memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) ); + memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) ); + + /* + * TLSv1: + * hash = PRF( master, finished_label, + * MD5( handshake ) + SHA1( handshake ) )[0..11] + */ + +#if !defined(POLARSSL_MD5_ALT) + SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) + md5.state, sizeof( md5.state ) ); +#endif + +#if !defined(POLARSSL_SHA1_ALT) + SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) + sha1.state, sizeof( sha1.state ) ); +#endif + + sender = ( from == SSL_IS_CLIENT ) + ? "client finished" + : "server finished"; + + md5_finish( &md5, padbuf ); + sha1_finish( &sha1, padbuf + 16 ); + + ssl->handshake->tls_prf( session->master, 48, (char *) sender, + padbuf, 36, buf, len ); + + SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); + + memset( &md5, 0, sizeof( md5_context ) ); + memset( &sha1, 0, sizeof( sha1_context ) ); + + memset( padbuf, 0, sizeof( padbuf ) ); + + SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); +} + +static void ssl_calc_finished_tls_sha256( + ssl_context *ssl, unsigned char *buf, int from ) +{ + int len = 12; + const char *sender; + sha2_context sha2; + unsigned char padbuf[32]; + + ssl_session *session = ssl->session_negotiate; + if( !session ) + session = ssl->session; + + SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) ); + + memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) ); + + /* + * TLSv1.2: + * hash = PRF( master, finished_label, + * Hash( handshake ) )[0.11] + */ + +#if !defined(POLARSSL_SHA2_ALT) + SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *) + sha2.state, sizeof( sha2.state ) ); +#endif + + sender = ( from == SSL_IS_CLIENT ) + ? "client finished" + : "server finished"; + + sha2_finish( &sha2, padbuf ); + + ssl->handshake->tls_prf( session->master, 48, (char *) sender, + padbuf, 32, buf, len ); + + SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); + + memset( &sha2, 0, sizeof( sha2_context ) ); + + memset( padbuf, 0, sizeof( padbuf ) ); + + SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); +} + +#if defined(POLARSSL_SHA4_C) +static void ssl_calc_finished_tls_sha384( + ssl_context *ssl, unsigned char *buf, int from ) +{ + int len = 12; + const char *sender; + sha4_context sha4; + unsigned char padbuf[48]; + + ssl_session *session = ssl->session_negotiate; + if( !session ) + session = ssl->session; + + SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) ); + + memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) ); + + /* + * TLSv1.2: + * hash = PRF( master, finished_label, + * Hash( handshake ) )[0.11] + */ + +#if !defined(POLARSSL_SHA4_ALT) + SSL_DEBUG_BUF( 4, "finished sha4 state", (unsigned char *) + sha4.state, sizeof( sha4.state ) ); +#endif + + sender = ( from == SSL_IS_CLIENT ) + ? "client finished" + : "server finished"; + + sha4_finish( &sha4, padbuf ); + + ssl->handshake->tls_prf( session->master, 48, (char *) sender, + padbuf, 48, buf, len ); + + SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); + + memset( &sha4, 0, sizeof( sha4_context ) ); + + memset( padbuf, 0, sizeof( padbuf ) ); + + SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); +} +#endif + +void ssl_handshake_wrapup( ssl_context *ssl ) +{ + SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) ); + + /* + * Free our handshake params + */ + ssl_handshake_free( ssl->handshake ); + free( ssl->handshake ); + ssl->handshake = NULL; + + /* + * Switch in our now active transform context + */ + if( ssl->transform ) + { + ssl_transform_free( ssl->transform ); + free( ssl->transform ); + } + ssl->transform = ssl->transform_negotiate; + ssl->transform_negotiate = NULL; + + if( ssl->session ) + { + ssl_session_free( ssl->session ); + free( ssl->session ); + } + ssl->session = ssl->session_negotiate; + ssl->session_negotiate = NULL; + + /* + * Add cache entry + */ + if( ssl->f_set_cache != NULL ) + if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 ) + SSL_DEBUG_MSG( 1, ( "cache did not store session" ) ); + + ssl->state++; + + SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) ); +} + +int ssl_write_finished( ssl_context *ssl ) +{ + int ret, hash_len; + + SSL_DEBUG_MSG( 2, ( "=> write finished" ) ); + + ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint ); + + // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63) + hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12; + + ssl->verify_data_len = hash_len; + memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len ); + + ssl->out_msglen = 4 + hash_len; + ssl->out_msgtype = SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = SSL_HS_FINISHED; + + /* + * In case of session resuming, invert the client and server + * ChangeCipherSpec messages order. + */ + if( ssl->handshake->resume != 0 ) + { + if( ssl->endpoint == SSL_IS_CLIENT ) + ssl->state = SSL_HANDSHAKE_WRAPUP; + else + ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC; + } + else + ssl->state++; + + /* + * Switch to our negotiated transform and session parameters for outbound data. + */ + SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) ); + ssl->transform_out = ssl->transform_negotiate; + ssl->session_out = ssl->session_negotiate; + memset( ssl->out_ctr, 0, 8 ); + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= write finished" ) ); + + return( 0 ); +} + +int ssl_parse_finished( ssl_context *ssl ) +{ + int ret; + unsigned int hash_len; + unsigned char buf[36]; + + SSL_DEBUG_MSG( 2, ( "=> parse finished" ) ); + + ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 ); + + /* + * Switch to our negotiated transform and session parameters for inbound data. + */ + SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) ); + ssl->transform_in = ssl->transform_negotiate; + ssl->session_in = ssl->session_negotiate; + memset( ssl->in_ctr, 0, 8 ); + + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msgtype != SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63) + hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12; + + if( ssl->in_msg[0] != SSL_HS_FINISHED || + ssl->in_hslen != 4 + hash_len ) + { + SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_FINISHED ); + } + + if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 ) + { + SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); + return( POLARSSL_ERR_SSL_BAD_HS_FINISHED ); + } + + ssl->verify_data_len = hash_len; + memcpy( ssl->peer_verify_data, buf, hash_len ); + + if( ssl->handshake->resume != 0 ) + { + if( ssl->endpoint == SSL_IS_CLIENT ) + ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC; + + if( ssl->endpoint == SSL_IS_SERVER ) + ssl->state = SSL_HANDSHAKE_WRAPUP; + } + else + ssl->state++; + + SSL_DEBUG_MSG( 2, ( "<= parse finished" ) ); + + return( 0 ); +} + +int ssl_handshake_init( ssl_context *ssl ) +{ + if( ssl->transform_negotiate ) + ssl_transform_free( ssl->transform_negotiate ); + else + ssl->transform_negotiate = malloc( sizeof(ssl_transform) ); + + if( ssl->session_negotiate ) + ssl_session_free( ssl->session_negotiate ); + else + ssl->session_negotiate = malloc( sizeof(ssl_session) ); + + if( ssl->handshake ) + ssl_handshake_free( ssl->handshake ); + else + ssl->handshake = malloc( sizeof(ssl_handshake_params) ); + + if( ssl->handshake == NULL || + ssl->transform_negotiate == NULL || + ssl->session_negotiate == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + memset( ssl->handshake, 0, sizeof(ssl_handshake_params) ); + memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) ); + memset( ssl->session_negotiate, 0, sizeof(ssl_session) ); + + md5_starts( &ssl->handshake->fin_md5 ); + sha1_starts( &ssl->handshake->fin_sha1 ); + sha2_starts( &ssl->handshake->fin_sha2, 0 ); +#if defined(POLARSSL_SHA4_C) + sha4_starts( &ssl->handshake->fin_sha4, 1 ); +#endif + + ssl->handshake->update_checksum = ssl_update_checksum_start; + ssl->handshake->sig_alg = SSL_HASH_SHA1; + + return( 0 ); +} + +/* + * Initialize an SSL context + */ +int ssl_init( ssl_context *ssl ) +{ + int ret; + int len = SSL_BUFFER_LEN; + + memset( ssl, 0, sizeof( ssl_context ) ); + + /* + * Sane defaults + */ + ssl->rsa_decrypt = ssl_rsa_decrypt; + ssl->rsa_sign = ssl_rsa_sign; + ssl->rsa_key_len = ssl_rsa_key_len; + + ssl->min_major_ver = SSL_MAJOR_VERSION_3; + ssl->min_minor_ver = SSL_MINOR_VERSION_0; + + ssl->ciphersuites = malloc( sizeof(int *) * 4 ); + ssl_set_ciphersuites( ssl, ssl_default_ciphersuites ); + +#if defined(POLARSSL_DHM_C) + if( ( ret = mpi_read_string( &ssl->dhm_P, 16, + POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 || + ( ret = mpi_read_string( &ssl->dhm_G, 16, + POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_read_string", ret ); + return( ret ); + } +#endif + + /* + * Prepare base structures + */ + ssl->in_ctr = (unsigned char *) malloc( len ); + ssl->in_hdr = ssl->in_ctr + 8; + ssl->in_msg = ssl->in_ctr + 13; + + if( ssl->in_ctr == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + ssl->out_ctr = (unsigned char *) malloc( len ); + ssl->out_hdr = ssl->out_ctr + 8; + ssl->out_msg = ssl->out_ctr + 40; + + if( ssl->out_ctr == NULL ) + { + SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) ); + free( ssl-> in_ctr ); + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + } + + memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN ); + memset( ssl->out_ctr, 0, SSL_BUFFER_LEN ); + + ssl->hostname = NULL; + ssl->hostname_len = 0; + + if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) + return( ret ); + + return( 0 ); +} + +/* + * Reset an initialized and used SSL context for re-use while retaining + * all application-set variables, function pointers and data. + */ +int ssl_session_reset( ssl_context *ssl ) +{ + int ret; + + ssl->state = SSL_HELLO_REQUEST; + ssl->renegotiation = SSL_INITIAL_HANDSHAKE; + ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION; + + ssl->verify_data_len = 0; + memset( ssl->own_verify_data, 0, 36 ); + memset( ssl->peer_verify_data, 0, 36 ); + + ssl->in_offt = NULL; + + ssl->in_msgtype = 0; + ssl->in_msglen = 0; + ssl->in_left = 0; + + ssl->in_hslen = 0; + ssl->nb_zero = 0; + + ssl->out_msgtype = 0; + ssl->out_msglen = 0; + ssl->out_left = 0; + + ssl->transform_in = NULL; + ssl->transform_out = NULL; + + memset( ssl->out_ctr, 0, SSL_BUFFER_LEN ); + memset( ssl->in_ctr, 0, SSL_BUFFER_LEN ); + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) + if( ssl_hw_record_reset != NULL) + { + SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) ); + if( ssl_hw_record_reset( ssl ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret ); + return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED ); + } + } +#endif + + if( ssl->transform ) + { + ssl_transform_free( ssl->transform ); + free( ssl->transform ); + ssl->transform = NULL; + } + + if( ssl->session ) + { + ssl_session_free( ssl->session ); + free( ssl->session ); + ssl->session = NULL; + } + + if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) + return( ret ); + + return( 0 ); +} + +/* + * SSL set accessors + */ +void ssl_set_endpoint( ssl_context *ssl, int endpoint ) +{ + ssl->endpoint = endpoint; +} + +void ssl_set_authmode( ssl_context *ssl, int authmode ) +{ + ssl->authmode = authmode; +} + +void ssl_set_verify( ssl_context *ssl, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ) +{ + ssl->f_vrfy = f_vrfy; + ssl->p_vrfy = p_vrfy; +} + +void ssl_set_rng( ssl_context *ssl, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng ) +{ + ssl->f_rng = f_rng; + ssl->p_rng = p_rng; +} + +void ssl_set_dbg( ssl_context *ssl, + void (*f_dbg)(void *, int, const char *), + void *p_dbg ) +{ + ssl->f_dbg = f_dbg; + ssl->p_dbg = p_dbg; +} + +void ssl_set_bio( ssl_context *ssl, + int (*f_recv)(void *, unsigned char *, size_t), void *p_recv, + int (*f_send)(void *, const unsigned char *, size_t), void *p_send ) +{ + ssl->f_recv = f_recv; + ssl->f_send = f_send; + ssl->p_recv = p_recv; + ssl->p_send = p_send; +} + +void ssl_set_session_cache( ssl_context *ssl, + int (*f_get_cache)(void *, ssl_session *), void *p_get_cache, + int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache ) +{ + ssl->f_get_cache = f_get_cache; + ssl->p_get_cache = p_get_cache; + ssl->f_set_cache = f_set_cache; + ssl->p_set_cache = p_set_cache; +} + +void ssl_set_session( ssl_context *ssl, const ssl_session *session ) +{ + memcpy( ssl->session_negotiate, session, sizeof(ssl_session) ); + ssl->handshake->resume = 1; +} + +void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites ) +{ + ssl->ciphersuites[SSL_MINOR_VERSION_0] = ciphersuites; + ssl->ciphersuites[SSL_MINOR_VERSION_1] = ciphersuites; + ssl->ciphersuites[SSL_MINOR_VERSION_2] = ciphersuites; + ssl->ciphersuites[SSL_MINOR_VERSION_3] = ciphersuites; +} + +void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites, + int major, int minor ) +{ + if( major != SSL_MAJOR_VERSION_3 ) + return; + + if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 ) + return; + + ssl->ciphersuites[minor] = ciphersuites; +} + +void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain, + x509_crl *ca_crl, const char *peer_cn ) +{ + ssl->ca_chain = ca_chain; + ssl->ca_crl = ca_crl; + ssl->peer_cn = peer_cn; +} + +void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert, + rsa_context *rsa_key ) +{ + ssl->own_cert = own_cert; + ssl->rsa_key = rsa_key; +} + +void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert, + void *rsa_key, + rsa_decrypt_func rsa_decrypt, + rsa_sign_func rsa_sign, + rsa_key_len_func rsa_key_len ) +{ + ssl->own_cert = own_cert; + ssl->rsa_key = rsa_key; + ssl->rsa_decrypt = rsa_decrypt; + ssl->rsa_sign = rsa_sign; + ssl->rsa_key_len = rsa_key_len; +} + + +#if defined(POLARSSL_DHM_C) +int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G ) +{ + int ret; + + if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_read_string", ret ); + return( ret ); + } + + if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_read_string", ret ); + return( ret ); + } + + return( 0 ); +} + +int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx ) +{ + int ret; + + if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_copy", ret ); + return( ret ); + } + + if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 ) + { + SSL_DEBUG_RET( 1, "mpi_copy", ret ); + return( ret ); + } + + return( 0 ); +} +#endif /* POLARSSL_DHM_C */ + +int ssl_set_hostname( ssl_context *ssl, const char *hostname ) +{ + if( hostname == NULL ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + ssl->hostname_len = strlen( hostname ); + ssl->hostname = (unsigned char *) malloc( ssl->hostname_len + 1 ); + + if( ssl->hostname == NULL ) + return( POLARSSL_ERR_SSL_MALLOC_FAILED ); + + memcpy( ssl->hostname, (const unsigned char *) hostname, + ssl->hostname_len ); + + ssl->hostname[ssl->hostname_len] = '\0'; + + return( 0 ); +} + +void ssl_set_sni( ssl_context *ssl, + int (*f_sni)(void *, ssl_context *, + const unsigned char *, size_t), + void *p_sni ) +{ + ssl->f_sni = f_sni; + ssl->p_sni = p_sni; +} + +void ssl_set_max_version( ssl_context *ssl, int major, int minor ) +{ + ssl->max_major_ver = major; + ssl->max_minor_ver = minor; +} + +void ssl_set_min_version( ssl_context *ssl, int major, int minor ) +{ + ssl->min_major_ver = major; + ssl->min_minor_ver = minor; +} + +void ssl_set_renegotiation( ssl_context *ssl, int renegotiation ) +{ + ssl->disable_renegotiation = renegotiation; +} + +void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy ) +{ + ssl->allow_legacy_renegotiation = allow_legacy; +} + +/* + * SSL get accessors + */ +size_t ssl_get_bytes_avail( const ssl_context *ssl ) +{ + return( ssl->in_offt == NULL ? 0 : ssl->in_msglen ); +} + +int ssl_get_verify_result( const ssl_context *ssl ) +{ + return( ssl->verify_result ); +} + +const char *ssl_get_ciphersuite_name( const int ciphersuite_id ) +{ + switch( ciphersuite_id ) + { +#if defined(POLARSSL_ARC4_C) + case TLS_RSA_WITH_RC4_128_MD5: + return( "TLS-RSA-WITH-RC4-128-MD5" ); + + case TLS_RSA_WITH_RC4_128_SHA: + return( "TLS-RSA-WITH-RC4-128-SHA" ); +#endif + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_3DES_EDE_CBC_SHA: + return( "TLS-RSA-WITH-3DES-EDE-CBC-SHA" ); + + case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: + return( "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA" ); +#endif + +#if defined(POLARSSL_AES_C) + case TLS_RSA_WITH_AES_128_CBC_SHA: + return( "TLS-RSA-WITH-AES-128-CBC-SHA" ); + + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA: + return( "TLS-DHE-RSA-WITH-AES-128-CBC-SHA" ); + + case TLS_RSA_WITH_AES_256_CBC_SHA: + return( "TLS-RSA-WITH-AES-256-CBC-SHA" ); + + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA: + return( "TLS-DHE-RSA-WITH-AES-256-CBC-SHA" ); + +#if defined(POLARSSL_SHA2_C) + case TLS_RSA_WITH_AES_128_CBC_SHA256: + return( "TLS-RSA-WITH-AES-128-CBC-SHA256" ); + + case TLS_RSA_WITH_AES_256_CBC_SHA256: + return( "TLS-RSA-WITH-AES-256-CBC-SHA256" ); + + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: + return( "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256" ); + + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: + return( "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256" ); +#endif + +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C) + case TLS_RSA_WITH_AES_128_GCM_SHA256: + return( "TLS-RSA-WITH-AES-128-GCM-SHA256" ); + + case TLS_RSA_WITH_AES_256_GCM_SHA384: + return( "TLS-RSA-WITH-AES-256-GCM-SHA384" ); +#endif + +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C) + case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: + return( "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256" ); + + case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384: + return( "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384" ); +#endif +#endif /* POLARSSL_AES_C */ + +#if defined(POLARSSL_CAMELLIA_C) + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA: + return( "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA" ); + + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA: + return( "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA" ); + + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA: + return( "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA" ); + + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA: + return( "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA" ); + +#if defined(POLARSSL_SHA2_C) + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256: + return( "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256" ); + + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256: + return( "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256" ); + + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256: + return( "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256" ); + + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256: + return( "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256" ); +#endif +#endif + +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + case TLS_RSA_WITH_NULL_MD5: + return( "TLS-RSA-WITH-NULL-MD5" ); + case TLS_RSA_WITH_NULL_SHA: + return( "TLS-RSA-WITH-NULL-SHA" ); + case TLS_RSA_WITH_NULL_SHA256: + return( "TLS-RSA-WITH-NULL-SHA256" ); +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#if defined(POLARSSL_DES_C) + case TLS_RSA_WITH_DES_CBC_SHA: + return( "TLS-RSA-WITH-DES-CBC-SHA" ); + case TLS_DHE_RSA_WITH_DES_CBC_SHA: + return( "TLS-DHE-RSA-WITH-DES-CBC-SHA" ); +#endif +#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */ + + default: + break; + } + + return( "unknown" ); +} + +int ssl_get_ciphersuite_id( const char *ciphersuite_name ) +{ +#if defined(POLARSSL_ARC4_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-RC4-128-MD5")) + return( TLS_RSA_WITH_RC4_128_MD5 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-RC4-128-SHA")) + return( TLS_RSA_WITH_RC4_128_SHA ); +#endif + +#if defined(POLARSSL_DES_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-3DES-EDE-CBC-SHA")) + return( TLS_RSA_WITH_3DES_EDE_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA")) + return( TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA ); +#endif + +#if defined(POLARSSL_AES_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-CBC-SHA")) + return( TLS_RSA_WITH_AES_128_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA")) + return( TLS_DHE_RSA_WITH_AES_128_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-CBC-SHA")) + return( TLS_RSA_WITH_AES_256_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA")) + return( TLS_DHE_RSA_WITH_AES_256_CBC_SHA ); + +#if defined(POLARSSL_SHA2_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-CBC-SHA256")) + return( TLS_RSA_WITH_AES_128_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-CBC-SHA256")) + return( TLS_RSA_WITH_AES_256_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256")) + return( TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256")) + return( TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 ); +#endif + +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-GCM-SHA256")) + return( TLS_RSA_WITH_AES_128_GCM_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-GCM-SHA384")) + return( TLS_RSA_WITH_AES_256_GCM_SHA384 ); +#endif + +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256")) + return( TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384")) + return( TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ); +#endif +#endif + +#if defined(POLARSSL_CAMELLIA_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA")) + return( TLS_RSA_WITH_CAMELLIA_128_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA")) + return( TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA")) + return( TLS_RSA_WITH_CAMELLIA_256_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA")) + return( TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA ); + +#if defined(POLARSSL_SHA2_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256")) + return( TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256")) + return( TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256")) + return( TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256")) + return( TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 ); +#endif +#endif + +#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) +#if defined(POLARSSL_CIPHER_NULL_CIPHER) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-MD5")) + return( TLS_RSA_WITH_NULL_MD5 ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-SHA")) + return( TLS_RSA_WITH_NULL_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-SHA256")) + return( TLS_RSA_WITH_NULL_SHA256 ); +#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */ + +#if defined(POLARSSL_DES_C) + if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-DES-CBC-SHA")) + return( TLS_RSA_WITH_DES_CBC_SHA ); + if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-DES-CBC-SHA")) + return( TLS_DHE_RSA_WITH_DES_CBC_SHA ); +#endif +#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */ + + return( 0 ); +} + +const char *ssl_get_ciphersuite( const ssl_context *ssl ) +{ + if( ssl == NULL || ssl->session == NULL ) + return NULL; + + return ssl_get_ciphersuite_name( ssl->session->ciphersuite ); +} + +const char *ssl_get_version( const ssl_context *ssl ) +{ + switch( ssl->minor_ver ) + { + case SSL_MINOR_VERSION_0: + return( "SSLv3.0" ); + + case SSL_MINOR_VERSION_1: + return( "TLSv1.0" ); + + case SSL_MINOR_VERSION_2: + return( "TLSv1.1" ); + + case SSL_MINOR_VERSION_3: + return( "TLSv1.2" ); + + default: + break; + } + return( "unknown" ); +} + +const x509_cert *ssl_get_peer_cert( const ssl_context *ssl ) +{ + if( ssl == NULL || ssl->session == NULL ) + return NULL; + + return ssl->session->peer_cert; +} + +const int ssl_default_ciphersuites[] = +{ +#if defined(POLARSSL_DHM_C) +#if defined(POLARSSL_AES_C) +#if defined(POLARSSL_SHA2_C) + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C) + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, +#endif + TLS_DHE_RSA_WITH_AES_256_CBC_SHA, +#if defined(POLARSSL_SHA2_C) + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, +#endif +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C) + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, +#endif + TLS_DHE_RSA_WITH_AES_128_CBC_SHA, +#endif +#if defined(POLARSSL_CAMELLIA_C) +#if defined(POLARSSL_SHA2_C) + TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ + TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, +#if defined(POLARSSL_SHA2_C) + TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ + TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, +#endif +#if defined(POLARSSL_DES_C) + TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, +#endif +#endif + +#if defined(POLARSSL_AES_C) +#if defined(POLARSSL_SHA2_C) + TLS_RSA_WITH_AES_256_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C) + TLS_RSA_WITH_AES_256_GCM_SHA384, +#endif /* POLARSSL_SHA2_C */ + TLS_RSA_WITH_AES_256_CBC_SHA, +#endif +#if defined(POLARSSL_CAMELLIA_C) +#if defined(POLARSSL_SHA2_C) + TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ + TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, +#endif +#if defined(POLARSSL_AES_C) +#if defined(POLARSSL_SHA2_C) + TLS_RSA_WITH_AES_128_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ +#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C) + TLS_RSA_WITH_AES_128_GCM_SHA256, +#endif /* POLARSSL_SHA2_C */ + TLS_RSA_WITH_AES_128_CBC_SHA, +#endif +#if defined(POLARSSL_CAMELLIA_C) +#if defined(POLARSSL_SHA2_C) + TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, +#endif /* POLARSSL_SHA2_C */ + TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, +#endif +#if defined(POLARSSL_DES_C) + TLS_RSA_WITH_3DES_EDE_CBC_SHA, +#endif +#if defined(POLARSSL_ARC4_C) + TLS_RSA_WITH_RC4_128_SHA, + TLS_RSA_WITH_RC4_128_MD5, +#endif + 0 +}; + +/* + * Perform a single step of the SSL handshake + */ +int ssl_handshake_step( ssl_context *ssl ) +{ + int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE; + +#if defined(POLARSSL_SSL_CLI_C) + if( ssl->endpoint == SSL_IS_CLIENT ) + ret = ssl_handshake_client_step( ssl ); +#endif + +#if defined(POLARSSL_SSL_SRV_C) + if( ssl->endpoint == SSL_IS_SERVER ) + ret = ssl_handshake_server_step( ssl ); +#endif + + return( ret ); +} + +/* + * Perform the SSL handshake + */ +int ssl_handshake( ssl_context *ssl ) +{ + int ret = 0; + + SSL_DEBUG_MSG( 2, ( "=> handshake" ) ); + + while( ssl->state != SSL_HANDSHAKE_OVER ) + { + ret = ssl_handshake_step( ssl ); + + if( ret != 0 ) + break; + } + + SSL_DEBUG_MSG( 2, ( "<= handshake" ) ); + + return( ret ); +} + +/* + * Renegotiate current connection + */ +int ssl_renegotiate( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) ); + + if( ssl->state != SSL_HANDSHAKE_OVER ) + return( POLARSSL_ERR_SSL_BAD_INPUT_DATA ); + + ssl->state = SSL_HELLO_REQUEST; + ssl->renegotiation = SSL_RENEGOTIATION; + + if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) + return( ret ); + + if( ( ret = ssl_handshake( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_handshake", ret ); + return( ret ); + } + + SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) ); + + return( 0 ); +} + +/* + * Receive application data decrypted from the SSL layer + */ +int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len ) +{ + int ret; + size_t n; + + SSL_DEBUG_MSG( 2, ( "=> read" ) ); + + if( ssl->state != SSL_HANDSHAKE_OVER ) + { + if( ( ret = ssl_handshake( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_handshake", ret ); + return( ret ); + } + } + + if( ssl->in_offt == NULL ) + { + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + if( ret == POLARSSL_ERR_SSL_CONN_EOF ) + return( 0 ); + + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + + if( ssl->in_msglen == 0 && + ssl->in_msgtype == SSL_MSG_APPLICATION_DATA ) + { + /* + * OpenSSL sends empty messages to randomize the IV + */ + if( ( ret = ssl_read_record( ssl ) ) != 0 ) + { + if( ret == POLARSSL_ERR_SSL_CONN_EOF ) + return( 0 ); + + SSL_DEBUG_RET( 1, "ssl_read_record", ret ); + return( ret ); + } + } + + if( ssl->in_msgtype == SSL_MSG_HANDSHAKE ) + { + SSL_DEBUG_MSG( 1, ( "received handshake message" ) ); + + if( ssl->endpoint == SSL_IS_CLIENT && + ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST || + ssl->in_hslen != 4 ) ) + { + SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED || + ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && + ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) ) + { + SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) ); + + if( ssl->minor_ver == SSL_MINOR_VERSION_0 ) + { + /* + * SSLv3 does not have a "no_renegotiation" alert + */ + if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) + return( ret ); + } + else + { + if( ( ret = ssl_send_alert_message( ssl, + SSL_ALERT_LEVEL_WARNING, + SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 ) + { + return( ret ); + } + } + } + else + { + if( ( ret = ssl_renegotiate( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_renegotiate", ret ); + return( ret ); + } + + return( POLARSSL_ERR_NET_WANT_READ ); + } + } + else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA ) + { + SSL_DEBUG_MSG( 1, ( "bad application data message" ) ); + return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE ); + } + + ssl->in_offt = ssl->in_msg; + } + + n = ( len < ssl->in_msglen ) + ? len : ssl->in_msglen; + + memcpy( buf, ssl->in_offt, n ); + ssl->in_msglen -= n; + + if( ssl->in_msglen == 0 ) + /* all bytes consumed */ + ssl->in_offt = NULL; + else + /* more data available */ + ssl->in_offt += n; + + SSL_DEBUG_MSG( 2, ( "<= read" ) ); + + return( (int) n ); +} + +/* + * Send application data to be encrypted by the SSL layer + */ +int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len ) +{ + int ret; + size_t n; + + SSL_DEBUG_MSG( 2, ( "=> write" ) ); + + if( ssl->state != SSL_HANDSHAKE_OVER ) + { + if( ( ret = ssl_handshake( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_handshake", ret ); + return( ret ); + } + } + + n = ( len < SSL_MAX_CONTENT_LEN ) + ? len : SSL_MAX_CONTENT_LEN; + + if( ssl->out_left != 0 ) + { + if( ( ret = ssl_flush_output( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_flush_output", ret ); + return( ret ); + } + } + else + { + ssl->out_msglen = n; + ssl->out_msgtype = SSL_MSG_APPLICATION_DATA; + memcpy( ssl->out_msg, buf, n ); + + if( ( ret = ssl_write_record( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_write_record", ret ); + return( ret ); + } + } + + SSL_DEBUG_MSG( 2, ( "<= write" ) ); + + return( (int) n ); +} + +/* + * Notify the peer that the connection is being closed + */ +int ssl_close_notify( ssl_context *ssl ) +{ + int ret; + + SSL_DEBUG_MSG( 2, ( "=> write close notify" ) ); + + if( ( ret = ssl_flush_output( ssl ) ) != 0 ) + { + SSL_DEBUG_RET( 1, "ssl_flush_output", ret ); + return( ret ); + } + + if( ssl->state == SSL_HANDSHAKE_OVER ) + { + if( ( ret = ssl_send_alert_message( ssl, + SSL_ALERT_LEVEL_WARNING, + SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 ) + { + return( ret ); + } + } + + SSL_DEBUG_MSG( 2, ( "<= write close notify" ) ); + + return( ret ); +} + +void ssl_transform_free( ssl_transform *transform ) +{ +#if defined(POLARSSL_ZLIB_SUPPORT) + deflateEnd( &transform->ctx_deflate ); + inflateEnd( &transform->ctx_inflate ); +#endif + + memset( transform, 0, sizeof( ssl_transform ) ); +} + +void ssl_handshake_free( ssl_handshake_params *handshake ) +{ +#if defined(POLARSSL_DHM_C) + dhm_free( &handshake->dhm_ctx ); +#endif + memset( handshake, 0, sizeof( ssl_handshake_params ) ); +} + +void ssl_session_free( ssl_session *session ) +{ + if( session->peer_cert != NULL ) + { + x509_free( session->peer_cert ); + free( session->peer_cert ); + } + + memset( session, 0, sizeof( ssl_session ) ); +} + +/* + * Free an SSL context + */ +void ssl_free( ssl_context *ssl ) +{ + SSL_DEBUG_MSG( 2, ( "=> free" ) ); + + free( ssl->ciphersuites ); + + if( ssl->out_ctr != NULL ) + { + memset( ssl->out_ctr, 0, SSL_BUFFER_LEN ); + free( ssl->out_ctr ); + } + + if( ssl->in_ctr != NULL ) + { + memset( ssl->in_ctr, 0, SSL_BUFFER_LEN ); + free( ssl->in_ctr ); + } + +#if defined(POLARSSL_DHM_C) + mpi_free( &ssl->dhm_P ); + mpi_free( &ssl->dhm_G ); +#endif + + if( ssl->transform ) + { + ssl_transform_free( ssl->transform ); + free( ssl->transform ); + } + + if( ssl->handshake ) + { + ssl_handshake_free( ssl->handshake ); + ssl_transform_free( ssl->transform_negotiate ); + ssl_session_free( ssl->session_negotiate ); + + free( ssl->handshake ); + free( ssl->transform_negotiate ); + free( ssl->session_negotiate ); + } + + if( ssl->session ) + { + ssl_session_free( ssl->session ); + free( ssl->session ); + } + + if ( ssl->hostname != NULL) + { + memset( ssl->hostname, 0, ssl->hostname_len ); + free( ssl->hostname ); + ssl->hostname_len = 0; + } + +#if defined(POLARSSL_SSL_HW_RECORD_ACCEL) + if( ssl_hw_record_finish != NULL ) + { + SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) ); + ssl_hw_record_finish( ssl ); + } +#endif + + SSL_DEBUG_MSG( 2, ( "<= free" ) ); + + /* Actually clear after last debug message */ + memset( ssl, 0, sizeof( ssl_context ) ); +} + +#endif diff --git a/Externals/polarssl/library/timing.c b/Externals/polarssl/library/timing.c new file mode 100644 index 0000000000..0273d1af84 --- /dev/null +++ b/Externals/polarssl/library/timing.c @@ -0,0 +1,312 @@ +/* + * Portable interface to the CPU cycle counter + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_TIMING_C) + +#include "polarssl/timing.h" + +#if defined(_WIN32) + +#include +#include + +struct _hr_time +{ + LARGE_INTEGER start; +}; + +#else + +#include +#include +#include +#include +#include + +struct _hr_time +{ + struct timeval start; +}; + +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long tsc; + __asm rdtsc + __asm mov [tsc], eax + return( tsc ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && defined(__i386__) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long lo, hi; + asm( "rdtsc" : "=a" (lo), "=d" (hi) ); + return( lo ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__)) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long lo, hi; + asm( "rdtsc" : "=a" (lo), "=d" (hi) ); + return( lo | (hi << 32) ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long tbl, tbu0, tbu1; + + do + { + asm( "mftbu %0" : "=r" (tbu0) ); + asm( "mftb %0" : "=r" (tbl ) ); + asm( "mftbu %0" : "=r" (tbu1) ); + } + while( tbu0 != tbu1 ); + + return( tbl ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && defined(__sparc64__) + +#if defined(__OpenBSD__) +#warning OpenBSD does not allow access to tick register using software version instead +#else +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long tick; + asm( "rdpr %%tick, %0;" : "=&r" (tick) ); + return( tick ); +} +#endif +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long tick; + asm( ".byte 0x83, 0x41, 0x00, 0x00" ); + asm( "mov %%g1, %0" : "=r" (tick) ); + return( tick ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && defined(__alpha__) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long cc; + asm( "rpcc %0" : "=r" (cc) ); + return( cc & 0xFFFFFFFF ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \ + defined(__GNUC__) && defined(__ia64__) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + unsigned long itc; + asm( "mov %0 = ar.itc" : "=r" (itc) ); + return( itc ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(_MSC_VER) + +#define POLARSSL_HAVE_HARDCLOCK + +unsigned long hardclock( void ) +{ + LARGE_INTEGER offset; + + QueryPerformanceCounter( &offset ); + + return (unsigned long)( offset.QuadPart ); +} +#endif + +#if !defined(POLARSSL_HAVE_HARDCLOCK) + +#define POLARSSL_HAVE_HARDCLOCK + +static int hardclock_init = 0; +static struct timeval tv_init; + +unsigned long hardclock( void ) +{ + struct timeval tv_cur; + + if( hardclock_init == 0 ) + { + gettimeofday( &tv_init, NULL ); + hardclock_init = 1; + } + + gettimeofday( &tv_cur, NULL ); + return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000 + + ( tv_cur.tv_usec - tv_init.tv_usec ) ); +} +#endif + +volatile int alarmed = 0; + +#if defined(_WIN32) + +unsigned long get_timer( struct hr_time *val, int reset ) +{ + unsigned long delta; + LARGE_INTEGER offset, hfreq; + struct _hr_time *t = (struct _hr_time *) val; + + QueryPerformanceCounter( &offset ); + QueryPerformanceFrequency( &hfreq ); + + delta = (unsigned long)( ( 1000 * + ( offset.QuadPart - t->start.QuadPart ) ) / + hfreq.QuadPart ); + + if( reset ) + QueryPerformanceCounter( &t->start ); + + return( delta ); +} + +DWORD WINAPI TimerProc( LPVOID uElapse ) +{ + Sleep( (DWORD) uElapse ); + alarmed = 1; + return( TRUE ); +} + +void set_alarm( int seconds ) +{ + DWORD ThreadId; + + alarmed = 0; + CloseHandle( CreateThread( NULL, 0, TimerProc, + (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) ); +} + +void m_sleep( int milliseconds ) +{ + Sleep( milliseconds ); +} + +#else + +unsigned long get_timer( struct hr_time *val, int reset ) +{ + unsigned long delta; + struct timeval offset; + struct _hr_time *t = (struct _hr_time *) val; + + gettimeofday( &offset, NULL ); + + delta = ( offset.tv_sec - t->start.tv_sec ) * 1000 + + ( offset.tv_usec - t->start.tv_usec ) / 1000; + + if( reset ) + { + t->start.tv_sec = offset.tv_sec; + t->start.tv_usec = offset.tv_usec; + } + + return( delta ); +} + +#if defined(INTEGRITY) +void m_sleep( int milliseconds ) +{ + usleep( milliseconds * 1000 ); +} + +#else + +static void sighandler( int signum ) +{ + alarmed = 1; + signal( signum, sighandler ); +} + +void set_alarm( int seconds ) +{ + alarmed = 0; + signal( SIGALRM, sighandler ); + alarm( seconds ); +} + +void m_sleep( int milliseconds ) +{ + struct timeval tv; + + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = milliseconds * 1000; + + select( 0, NULL, NULL, NULL, &tv ); +} +#endif /* INTEGRITY */ + +#endif + +#endif diff --git a/Externals/polarssl/library/version.c b/Externals/polarssl/library/version.c new file mode 100644 index 0000000000..c1080b7816 --- /dev/null +++ b/Externals/polarssl/library/version.c @@ -0,0 +1,50 @@ +/* + * Version information + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_VERSION_C) + +#include "polarssl/version.h" +#include + +const char version[] = POLARSSL_VERSION_STRING; + +unsigned int version_get_number() +{ + return POLARSSL_VERSION_NUMBER; +} + +void version_get_string( char *string ) +{ + memcpy( string, POLARSSL_VERSION_STRING, sizeof( POLARSSL_VERSION_STRING ) ); +} + +void version_get_string_full( char *string ) +{ + memcpy( string, POLARSSL_VERSION_STRING_FULL, sizeof( POLARSSL_VERSION_STRING_FULL ) ); +} + +#endif /* POLARSSL_VERSION_C */ diff --git a/Externals/polarssl/library/x509parse.c b/Externals/polarssl/library/x509parse.c new file mode 100644 index 0000000000..77725e0631 --- /dev/null +++ b/Externals/polarssl/library/x509parse.c @@ -0,0 +1,3809 @@ +/* + * X.509 certificate and private key decoding + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * The ITU-T X.509 standard defines a certificate format for PKI. + * + * http://www.ietf.org/rfc/rfc3279.txt + * http://www.ietf.org/rfc/rfc3280.txt + * + * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc + * + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_X509_PARSE_C) + +#include "polarssl/x509.h" +#include "polarssl/asn1.h" +#include "polarssl/pem.h" +#include "polarssl/des.h" +#if defined(POLARSSL_MD2_C) +#include "polarssl/md2.h" +#endif +#if defined(POLARSSL_MD4_C) +#include "polarssl/md4.h" +#endif +#if defined(POLARSSL_MD5_C) +#include "polarssl/md5.h" +#endif +#if defined(POLARSSL_SHA1_C) +#include "polarssl/sha1.h" +#endif +#if defined(POLARSSL_SHA2_C) +#include "polarssl/sha2.h" +#endif +#if defined(POLARSSL_SHA4_C) +#include "polarssl/sha4.h" +#endif +#include "polarssl/dhm.h" +#if defined(POLARSSL_PKCS5_C) +#include "polarssl/pkcs5.h" +#endif +#if defined(POLARSSL_PKCS12_C) +#include "polarssl/pkcs12.h" +#endif + +#include +#include +#if defined(_WIN32) +#include +#else +#include +#endif + +#if defined(POLARSSL_FS_IO) +#include +#if !defined(_WIN32) +#include +#include +#include +#endif +#endif + +/* Compare a given OID string with an OID x509_buf * */ +#define OID_CMP(oid_str, oid_buf) \ + ( ( OID_SIZE(oid_str) == (oid_buf)->len ) && \ + memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) == 0) + +/* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + */ +static int x509_get_version( unsigned char **p, + const unsigned char *end, + int *ver ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0 ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + { + *ver = 0; + return( 0 ); + } + + return( ret ); + } + + end = *p + len; + + if( ( ret = asn1_get_int( p, end, ver ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + ret ); + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * Version ::= INTEGER { v1(0), v2(1) } + */ +static int x509_crl_get_version( unsigned char **p, + const unsigned char *end, + int *ver ) +{ + int ret; + + if( ( ret = asn1_get_int( p, end, ver ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + { + *ver = 0; + return( 0 ); + } + + return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + ret ); + } + + return( 0 ); +} + +/* + * CertificateSerialNumber ::= INTEGER + */ +static int x509_get_serial( unsigned char **p, + const unsigned char *end, + x509_buf *serial ) +{ + int ret; + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + if( **p != ( ASN1_CONTEXT_SPECIFIC | ASN1_PRIMITIVE | 2 ) && + **p != ASN1_INTEGER ) + return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL + + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); + + serial->tag = *(*p)++; + + if( ( ret = asn1_get_len( p, end, &serial->len ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL + ret ); + + serial->p = *p; + *p += serial->len; + + return( 0 ); +} + +/* + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL } + */ +static int x509_get_alg( unsigned char **p, + const unsigned char *end, + x509_buf *alg ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret ); + + end = *p + len; + alg->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &alg->len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret ); + + alg->p = *p; + *p += alg->len; + + if( *p == end ) + return( 0 ); + + /* + * assume the algorithm parameters must be NULL + */ + if( ( ret = asn1_get_tag( p, end, &len, ASN1_NULL ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret ); + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_ALG + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * AttributeTypeAndValue ::= SEQUENCE { + * type AttributeType, + * value AttributeValue } + * + * AttributeType ::= OBJECT IDENTIFIER + * + * AttributeValue ::= ANY DEFINED BY AttributeType + */ +static int x509_get_attr_type_value( unsigned char **p, + const unsigned char *end, + x509_name *cur ) +{ + int ret; + size_t len; + x509_buf *oid; + x509_buf *val; + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret ); + + oid = &cur->oid; + oid->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &oid->len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret ); + + oid->p = *p; + *p += oid->len; + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + if( **p != ASN1_BMP_STRING && **p != ASN1_UTF8_STRING && + **p != ASN1_T61_STRING && **p != ASN1_PRINTABLE_STRING && + **p != ASN1_IA5_STRING && **p != ASN1_UNIVERSAL_STRING ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); + + val = &cur->val; + val->tag = *(*p)++; + + if( ( ret = asn1_get_len( p, end, &val->len ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret ); + + val->p = *p; + *p += val->len; + + cur->next = NULL; + + return( 0 ); +} + +/* + * RelativeDistinguishedName ::= + * SET OF AttributeTypeAndValue + * + * AttributeTypeAndValue ::= SEQUENCE { + * type AttributeType, + * value AttributeValue } + * + * AttributeType ::= OBJECT IDENTIFIER + * + * AttributeValue ::= ANY DEFINED BY AttributeType + */ +static int x509_get_name( unsigned char **p, + const unsigned char *end, + x509_name *cur ) +{ + int ret; + size_t len; + const unsigned char *end2; + x509_name *use; + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SET ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret ); + + end2 = end; + end = *p + len; + use = cur; + + do + { + if( ( ret = x509_get_attr_type_value( p, end, use ) ) != 0 ) + return( ret ); + + if( *p != end ) + { + use->next = (x509_name *) malloc( + sizeof( x509_name ) ); + + if( use->next == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + memset( use->next, 0, sizeof( x509_name ) ); + + use = use->next; + } + } + while( *p != end ); + + /* + * recurse until end of SEQUENCE is reached + */ + if( *p == end2 ) + return( 0 ); + + cur->next = (x509_name *) malloc( + sizeof( x509_name ) ); + + if( cur->next == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + memset( cur->next, 0, sizeof( x509_name ) ); + + return( x509_get_name( p, end2, cur->next ) ); +} + +/* + * Time ::= CHOICE { + * utcTime UTCTime, + * generalTime GeneralizedTime } + */ +static int x509_get_time( unsigned char **p, + const unsigned char *end, + x509_time *time ) +{ + int ret; + size_t len; + char date[64]; + unsigned char tag; + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + tag = **p; + + if ( tag == ASN1_UTC_TIME ) + { + (*p)++; + ret = asn1_get_len( p, end, &len ); + + if( ret != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret ); + + memset( date, 0, sizeof( date ) ); + memcpy( date, *p, ( len < sizeof( date ) - 1 ) ? + len : sizeof( date ) - 1 ); + + if( sscanf( date, "%2d%2d%2d%2d%2d%2d", + &time->year, &time->mon, &time->day, + &time->hour, &time->min, &time->sec ) < 5 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE ); + + time->year += 100 * ( time->year < 50 ); + time->year += 1900; + + *p += len; + + return( 0 ); + } + else if ( tag == ASN1_GENERALIZED_TIME ) + { + (*p)++; + ret = asn1_get_len( p, end, &len ); + + if( ret != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret ); + + memset( date, 0, sizeof( date ) ); + memcpy( date, *p, ( len < sizeof( date ) - 1 ) ? + len : sizeof( date ) - 1 ); + + if( sscanf( date, "%4d%2d%2d%2d%2d%2d", + &time->year, &time->mon, &time->day, + &time->hour, &time->min, &time->sec ) < 5 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE ); + + *p += len; + + return( 0 ); + } + else + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); +} + + +/* + * Validity ::= SEQUENCE { + * notBefore Time, + * notAfter Time } + */ +static int x509_get_dates( unsigned char **p, + const unsigned char *end, + x509_time *from, + x509_time *to ) +{ + int ret; + size_t len; + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret ); + + end = *p + len; + + if( ( ret = x509_get_time( p, end, from ) ) != 0 ) + return( ret ); + + if( ( ret = x509_get_time( p, end, to ) ) != 0 ) + return( ret ); + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_DATE + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * SubjectPublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } + */ +static int x509_get_pubkey( unsigned char **p, + const unsigned char *end, + x509_buf *pk_alg_oid, + mpi *N, mpi *E ) +{ + int ret; + size_t len; + unsigned char *end2; + + if( ( ret = x509_get_alg( p, end, pk_alg_oid ) ) != 0 ) + return( ret ); + + /* + * only RSA public keys handled at this time + */ + if( pk_alg_oid->len != 9 || + memcmp( pk_alg_oid->p, OID_PKCS1_RSA, 9 ) != 0 ) + { + return( POLARSSL_ERR_X509_UNKNOWN_PK_ALG ); + } + + if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret ); + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + end2 = *p + len; + + if( *(*p)++ != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY ); + + /* + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + */ + if( ( ret = asn1_get_tag( p, end2, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret ); + + if( *p + len != end2 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + if( ( ret = asn1_get_mpi( p, end2, N ) ) != 0 || + ( ret = asn1_get_mpi( p, end2, E ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret ); + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +static int x509_get_sig( unsigned char **p, + const unsigned char *end, + x509_buf *sig ) +{ + int ret; + size_t len; + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + sig->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE + ret ); + + + if( --len < 1 || *(*p)++ != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE ); + + sig->len = len; + sig->p = *p; + + *p += len; + + return( 0 ); +} + +/* + * X.509 v2/v3 unique identifier (not parsed) + */ +static int x509_get_uid( unsigned char **p, + const unsigned char *end, + x509_buf *uid, int n ) +{ + int ret; + + if( *p == end ) + return( 0 ); + + uid->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &uid->len, + ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | n ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + return( 0 ); + + return( ret ); + } + + uid->p = *p; + *p += uid->len; + + return( 0 ); +} + +/* + * X.509 Extensions (No parsing of extensions, pointer should + * be either manually updated or extensions should be parsed! + */ +static int x509_get_ext( unsigned char **p, + const unsigned char *end, + x509_buf *ext, int tag ) +{ + int ret; + size_t len; + + if( *p == end ) + return( 0 ); + + ext->tag = **p; + + if( ( ret = asn1_get_tag( p, end, &ext->len, + ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | tag ) ) != 0 ) + return( ret ); + + ext->p = *p; + end = *p + ext->len; + + /* + * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + * + * Extension ::= SEQUENCE { + * extnID OBJECT IDENTIFIER, + * critical BOOLEAN DEFAULT FALSE, + * extnValue OCTET STRING } + */ + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( end != *p + len ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * X.509 CRL v2 extensions (no extensions parsed yet.) + */ +static int x509_get_crl_ext( unsigned char **p, + const unsigned char *end, + x509_buf *ext ) +{ + int ret; + size_t len = 0; + + /* Get explicit tag */ + if( ( ret = x509_get_ext( p, end, ext, 0) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + return( 0 ); + + return( ret ); + } + + while( *p < end ) + { + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + *p += len; + } + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * X.509 CRL v2 entry extensions (no extensions parsed yet.) + */ +static int x509_get_crl_entry_ext( unsigned char **p, + const unsigned char *end, + x509_buf *ext ) +{ + int ret; + size_t len = 0; + + /* OPTIONAL */ + if (end <= *p) + return( 0 ); + + ext->tag = **p; + ext->p = *p; + + /* + * Get CRL-entry extension sequence header + * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2 + */ + if( ( ret = asn1_get_tag( p, end, &ext->len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + { + ext->p = NULL; + return( 0 ); + } + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + } + + end = *p + ext->len; + + if( end != *p + ext->len ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + while( *p < end ) + { + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + *p += len; + } + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +static int x509_get_basic_constraints( unsigned char **p, + const unsigned char *end, + int *ca_istrue, + int *max_pathlen ) +{ + int ret; + size_t len; + + /* + * BasicConstraints ::= SEQUENCE { + * cA BOOLEAN DEFAULT FALSE, + * pathLenConstraint INTEGER (0..MAX) OPTIONAL } + */ + *ca_istrue = 0; /* DEFAULT FALSE */ + *max_pathlen = 0; /* endless */ + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( *p == end ) + return 0; + + if( ( ret = asn1_get_bool( p, end, ca_istrue ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + ret = asn1_get_int( p, end, ca_istrue ); + + if( ret != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( *ca_istrue != 0 ) + *ca_istrue = 1; + } + + if( *p == end ) + return 0; + + if( ( ret = asn1_get_int( p, end, max_pathlen ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + (*max_pathlen)++; + + return 0; +} + +static int x509_get_ns_cert_type( unsigned char **p, + const unsigned char *end, + unsigned char *ns_cert_type) +{ + int ret; + x509_bitstring bs = { 0, 0, NULL }; + + if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( bs.len != 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_INVALID_LENGTH ); + + /* Get actual bitstring */ + *ns_cert_type = *bs.p; + return 0; +} + +static int x509_get_key_usage( unsigned char **p, + const unsigned char *end, + unsigned char *key_usage) +{ + int ret; + x509_bitstring bs = { 0, 0, NULL }; + + if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( bs.len < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_INVALID_LENGTH ); + + /* Get actual bitstring */ + *key_usage = *bs.p; + return 0; +} + +/* + * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId + * + * KeyPurposeId ::= OBJECT IDENTIFIER + */ +static int x509_get_ext_key_usage( unsigned char **p, + const unsigned char *end, + x509_sequence *ext_key_usage) +{ + int ret; + + if( ( ret = asn1_get_sequence_of( p, end, ext_key_usage, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + /* Sequence length must be >= 1 */ + if( ext_key_usage->buf.p == NULL ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_INVALID_LENGTH ); + + return 0; +} + +/* + * SubjectAltName ::= GeneralNames + * + * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName + * + * GeneralName ::= CHOICE { + * otherName [0] OtherName, + * rfc822Name [1] IA5String, + * dNSName [2] IA5String, + * x400Address [3] ORAddress, + * directoryName [4] Name, + * ediPartyName [5] EDIPartyName, + * uniformResourceIdentifier [6] IA5String, + * iPAddress [7] OCTET STRING, + * registeredID [8] OBJECT IDENTIFIER } + * + * OtherName ::= SEQUENCE { + * type-id OBJECT IDENTIFIER, + * value [0] EXPLICIT ANY DEFINED BY type-id } + * + * EDIPartyName ::= SEQUENCE { + * nameAssigner [0] DirectoryString OPTIONAL, + * partyName [1] DirectoryString } + * + * NOTE: PolarSSL only parses and uses dNSName at this point. + */ +static int x509_get_subject_alt_name( unsigned char **p, + const unsigned char *end, + x509_sequence *subject_alt_name ) +{ + int ret; + size_t len, tag_len; + asn1_buf *buf; + unsigned char tag; + asn1_sequence *cur = subject_alt_name; + + /* Get main sequence tag */ + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( *p + len != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + while( *p < end ) + { + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + tag = **p; + (*p)++; + if( ( ret = asn1_get_len( p, end, &tag_len ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + if( ( tag & ASN1_CONTEXT_SPECIFIC ) != ASN1_CONTEXT_SPECIFIC ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); + + if( tag != ( ASN1_CONTEXT_SPECIFIC | 2 ) ) + { + *p += tag_len; + continue; + } + + buf = &(cur->buf); + buf->tag = tag; + buf->p = *p; + buf->len = tag_len; + *p += buf->len; + + /* Allocate and assign next pointer */ + if (*p < end) + { + cur->next = (asn1_sequence *) malloc( + sizeof( asn1_sequence ) ); + + if( cur->next == NULL ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_MALLOC_FAILED ); + + memset( cur->next, 0, sizeof( asn1_sequence ) ); + cur = cur->next; + } + } + + /* Set final sequence entry's next pointer to NULL */ + cur->next = NULL; + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * X.509 v3 extensions + * + * TODO: Perform all of the basic constraints tests required by the RFC + * TODO: Set values for undetected extensions to a sane default? + * + */ +static int x509_get_crt_ext( unsigned char **p, + const unsigned char *end, + x509_cert *crt ) +{ + int ret; + size_t len; + unsigned char *end_ext_data, *end_ext_octet; + + if( ( ret = x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + return( 0 ); + + return( ret ); + } + + while( *p < end ) + { + /* + * Extension ::= SEQUENCE { + * extnID OBJECT IDENTIFIER, + * critical BOOLEAN DEFAULT FALSE, + * extnValue OCTET STRING } + */ + x509_buf extn_oid = {0, 0, NULL}; + int is_critical = 0; /* DEFAULT FALSE */ + + if( ( ret = asn1_get_tag( p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + end_ext_data = *p + len; + + /* Get extension ID */ + extn_oid.tag = **p; + + if( ( ret = asn1_get_tag( p, end, &extn_oid.len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + extn_oid.p = *p; + *p += extn_oid.len; + + if( ( end - *p ) < 1 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + + /* Get optional critical */ + if( ( ret = asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 && + ( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + /* Data should be octet string type */ + if( ( ret = asn1_get_tag( p, end_ext_data, &len, + ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret ); + + end_ext_octet = *p + len; + + if( end_ext_octet != end_ext_data ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + /* + * Detect supported extensions + */ + if( ( OID_SIZE( OID_BASIC_CONSTRAINTS ) == extn_oid.len ) && + memcmp( extn_oid.p, OID_BASIC_CONSTRAINTS, extn_oid.len ) == 0 ) + { + /* Parse basic constraints */ + if( ( ret = x509_get_basic_constraints( p, end_ext_octet, + &crt->ca_istrue, &crt->max_pathlen ) ) != 0 ) + return ( ret ); + crt->ext_types |= EXT_BASIC_CONSTRAINTS; + } + else if( ( OID_SIZE( OID_NS_CERT_TYPE ) == extn_oid.len ) && + memcmp( extn_oid.p, OID_NS_CERT_TYPE, extn_oid.len ) == 0 ) + { + /* Parse netscape certificate type */ + if( ( ret = x509_get_ns_cert_type( p, end_ext_octet, + &crt->ns_cert_type ) ) != 0 ) + return ( ret ); + crt->ext_types |= EXT_NS_CERT_TYPE; + } + else if( ( OID_SIZE( OID_KEY_USAGE ) == extn_oid.len ) && + memcmp( extn_oid.p, OID_KEY_USAGE, extn_oid.len ) == 0 ) + { + /* Parse key usage */ + if( ( ret = x509_get_key_usage( p, end_ext_octet, + &crt->key_usage ) ) != 0 ) + return ( ret ); + crt->ext_types |= EXT_KEY_USAGE; + } + else if( ( OID_SIZE( OID_EXTENDED_KEY_USAGE ) == extn_oid.len ) && + memcmp( extn_oid.p, OID_EXTENDED_KEY_USAGE, extn_oid.len ) == 0 ) + { + /* Parse extended key usage */ + if( ( ret = x509_get_ext_key_usage( p, end_ext_octet, + &crt->ext_key_usage ) ) != 0 ) + return ( ret ); + crt->ext_types |= EXT_EXTENDED_KEY_USAGE; + } + else if( ( OID_SIZE( OID_SUBJECT_ALT_NAME ) == extn_oid.len ) && + memcmp( extn_oid.p, OID_SUBJECT_ALT_NAME, extn_oid.len ) == 0 ) + { + /* Parse extended key usage */ + if( ( ret = x509_get_subject_alt_name( p, end_ext_octet, + &crt->subject_alt_names ) ) != 0 ) + return ( ret ); + crt->ext_types |= EXT_SUBJECT_ALT_NAME; + } + else + { + /* No parser found, skip extension */ + *p = end_ext_octet; + +#if !defined(POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) + if( is_critical ) + { + /* Data is marked as critical: fail */ + return ( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ); + } +#endif + } + } + + if( *p != end ) + return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + + return( 0 ); +} + +/* + * X.509 CRL Entries + */ +static int x509_get_entries( unsigned char **p, + const unsigned char *end, + x509_crl_entry *entry ) +{ + int ret; + size_t entry_len; + x509_crl_entry *cur_entry = entry; + + if( *p == end ) + return( 0 ); + + if( ( ret = asn1_get_tag( p, end, &entry_len, + ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 ) + { + if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) + return( 0 ); + + return( ret ); + } + + end = *p + entry_len; + + while( *p < end ) + { + size_t len2; + const unsigned char *end2; + + if( ( ret = asn1_get_tag( p, end, &len2, + ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 ) + { + return( ret ); + } + + cur_entry->raw.tag = **p; + cur_entry->raw.p = *p; + cur_entry->raw.len = len2; + end2 = *p + len2; + + if( ( ret = x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 ) + return( ret ); + + if( ( ret = x509_get_time( p, end2, &cur_entry->revocation_date ) ) != 0 ) + return( ret ); + + if( ( ret = x509_get_crl_entry_ext( p, end2, &cur_entry->entry_ext ) ) != 0 ) + return( ret ); + + if ( *p < end ) + { + cur_entry->next = malloc( sizeof( x509_crl_entry ) ); + + if( cur_entry->next == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + cur_entry = cur_entry->next; + memset( cur_entry, 0, sizeof( x509_crl_entry ) ); + } + } + + return( 0 ); +} + +static int x509_get_sig_alg( const x509_buf *sig_oid, int *sig_alg ) +{ + if( sig_oid->len == 9 && + memcmp( sig_oid->p, OID_PKCS1, 8 ) == 0 ) + { + if( sig_oid->p[8] >= 2 && sig_oid->p[8] <= 5 ) + { + *sig_alg = sig_oid->p[8]; + return( 0 ); + } + + if ( sig_oid->p[8] >= 11 && sig_oid->p[8] <= 14 ) + { + *sig_alg = sig_oid->p[8]; + return( 0 ); + } + + return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG ); + } + if( sig_oid->len == 5 && + memcmp( sig_oid->p, OID_RSA_SHA_OBS, 5 ) == 0 ) + { + *sig_alg = SIG_RSA_SHA1; + return( 0 ); + } + + return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG ); +} + +/* + * Parse and fill a single X.509 certificate in DER format + */ +int x509parse_crt_der_core( x509_cert *crt, const unsigned char *buf, + size_t buflen ) +{ + int ret; + size_t len; + unsigned char *p, *end, *crt_end; + + /* + * Check for valid input + */ + if( crt == NULL || buf == NULL ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + p = (unsigned char *) malloc( len = buflen ); + + if( p == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + memcpy( p, buf, buflen ); + + buflen = 0; + + crt->raw.p = p; + crt->raw.len = len; + end = p + len; + + /* + * Certificate ::= SEQUENCE { + * tbsCertificate TBSCertificate, + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT ); + } + + if( len > (size_t) ( end - p ) ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + crt_end = p + len; + + /* + * TBSCertificate ::= SEQUENCE { + */ + crt->tbs.p = p; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + end = p + len; + crt->tbs.len = end - crt->tbs.p; + + /* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + * + * CertificateSerialNumber ::= INTEGER + * + * signature AlgorithmIdentifier + */ + if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 || + ( ret = x509_get_serial( &p, end, &crt->serial ) ) != 0 || + ( ret = x509_get_alg( &p, end, &crt->sig_oid1 ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + crt->version++; + + if( crt->version > 3 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION ); + } + + if( ( ret = x509_get_sig_alg( &crt->sig_oid1, &crt->sig_alg ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + /* + * issuer Name + */ + crt->issuer_raw.p = p; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + if( ( ret = x509_get_name( &p, p + len, &crt->issuer ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + crt->issuer_raw.len = p - crt->issuer_raw.p; + + /* + * Validity ::= SEQUENCE { + * notBefore Time, + * notAfter Time } + * + */ + if( ( ret = x509_get_dates( &p, end, &crt->valid_from, + &crt->valid_to ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + /* + * subject Name + */ + crt->subject_raw.p = p; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + if( len && ( ret = x509_get_name( &p, p + len, &crt->subject ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + crt->subject_raw.len = p - crt->subject_raw.p; + + /* + * SubjectPublicKeyInfo ::= SEQUENCE + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + if( ( ret = x509_get_pubkey( &p, p + len, &crt->pk_oid, + &crt->rsa.N, &crt->rsa.E ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + if( ( ret = rsa_check_pubkey( &crt->rsa ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + crt->rsa.len = mpi_size( &crt->rsa.N ); + + /* + * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, + * -- If present, version shall be v2 or v3 + * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, + * -- If present, version shall be v2 or v3 + * extensions [3] EXPLICIT Extensions OPTIONAL + * -- If present, version shall be v3 + */ + if( crt->version == 2 || crt->version == 3 ) + { + ret = x509_get_uid( &p, end, &crt->issuer_id, 1 ); + if( ret != 0 ) + { + x509_free( crt ); + return( ret ); + } + } + + if( crt->version == 2 || crt->version == 3 ) + { + ret = x509_get_uid( &p, end, &crt->subject_id, 2 ); + if( ret != 0 ) + { + x509_free( crt ); + return( ret ); + } + } + + if( crt->version == 3 ) + { + ret = x509_get_crt_ext( &p, end, crt); + if( ret != 0 ) + { + x509_free( crt ); + return( ret ); + } + } + + if( p != end ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + end = crt_end; + + /* + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING + */ + if( ( ret = x509_get_alg( &p, end, &crt->sig_oid2 ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + if( crt->sig_oid1.len != crt->sig_oid2.len || + memcmp( crt->sig_oid1.p, crt->sig_oid2.p, crt->sig_oid1.len ) != 0 ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH ); + } + + if( ( ret = x509_get_sig( &p, end, &crt->sig ) ) != 0 ) + { + x509_free( crt ); + return( ret ); + } + + if( p != end ) + { + x509_free( crt ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + return( 0 ); +} + +/* + * Parse one X.509 certificate in DER format from a buffer and add them to a + * chained list + */ +int x509parse_crt_der( x509_cert *chain, const unsigned char *buf, size_t buflen ) +{ + int ret; + x509_cert *crt = chain, *prev = NULL; + + /* + * Check for valid input + */ + if( crt == NULL || buf == NULL ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + while( crt->version != 0 && crt->next != NULL ) + { + prev = crt; + crt = crt->next; + } + + /* + * Add new certificate on the end of the chain if needed. + */ + if ( crt->version != 0 && crt->next == NULL) + { + crt->next = (x509_cert *) malloc( sizeof( x509_cert ) ); + + if( crt->next == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + prev = crt; + crt = crt->next; + memset( crt, 0, sizeof( x509_cert ) ); + } + + if( ( ret = x509parse_crt_der_core( crt, buf, buflen ) ) != 0 ) + { + if( prev ) + prev->next = NULL; + + if( crt != chain ) + free( crt ); + + return( ret ); + } + + return( 0 ); +} + +/* + * Parse one or more PEM certificates from a buffer and add them to the chained list + */ +int x509parse_crt( x509_cert *chain, const unsigned char *buf, size_t buflen ) +{ + int ret, success = 0, first_error = 0, total_failed = 0; + int buf_format = X509_FORMAT_DER; + + /* + * Check for valid input + */ + if( chain == NULL || buf == NULL ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + /* + * Determine buffer content. Buffer contains either one DER certificate or + * one or more PEM certificates. + */ +#if defined(POLARSSL_PEM_C) + if( strstr( (const char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL ) + buf_format = X509_FORMAT_PEM; +#endif + + if( buf_format == X509_FORMAT_DER ) + return x509parse_crt_der( chain, buf, buflen ); + +#if defined(POLARSSL_PEM_C) + if( buf_format == X509_FORMAT_PEM ) + { + pem_context pem; + + while( buflen > 0 ) + { + size_t use_len; + pem_init( &pem ); + + ret = pem_read_buffer( &pem, + "-----BEGIN CERTIFICATE-----", + "-----END CERTIFICATE-----", + buf, NULL, 0, &use_len ); + + if( ret == 0 ) + { + /* + * Was PEM encoded + */ + buflen -= use_len; + buf += use_len; + } + else if( ret == POLARSSL_ERR_PEM_BAD_INPUT_DATA ) + { + return( ret ); + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + { + pem_free( &pem ); + + /* + * PEM header and footer were found + */ + buflen -= use_len; + buf += use_len; + + if( first_error == 0 ) + first_error = ret; + + continue; + } + else + break; + + ret = x509parse_crt_der( chain, pem.buf, pem.buflen ); + + pem_free( &pem ); + + if( ret != 0 ) + { + /* + * Quit parsing on a memory error + */ + if( ret == POLARSSL_ERR_X509_MALLOC_FAILED ) + return( ret ); + + if( first_error == 0 ) + first_error = ret; + + total_failed++; + continue; + } + + success = 1; + } + } +#endif + + if( success ) + return( total_failed ); + else if( first_error ) + return( first_error ); + else + return( POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT ); +} + +/* + * Parse one or more CRLs and add them to the chained list + */ +int x509parse_crl( x509_crl *chain, const unsigned char *buf, size_t buflen ) +{ + int ret; + size_t len; + unsigned char *p, *end; + x509_crl *crl; +#if defined(POLARSSL_PEM_C) + size_t use_len; + pem_context pem; +#endif + + crl = chain; + + /* + * Check for valid input + */ + if( crl == NULL || buf == NULL ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + while( crl->version != 0 && crl->next != NULL ) + crl = crl->next; + + /* + * Add new CRL on the end of the chain if needed. + */ + if ( crl->version != 0 && crl->next == NULL) + { + crl->next = (x509_crl *) malloc( sizeof( x509_crl ) ); + + if( crl->next == NULL ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + } + + crl = crl->next; + memset( crl, 0, sizeof( x509_crl ) ); + } + +#if defined(POLARSSL_PEM_C) + pem_init( &pem ); + ret = pem_read_buffer( &pem, + "-----BEGIN X509 CRL-----", + "-----END X509 CRL-----", + buf, NULL, 0, &use_len ); + + if( ret == 0 ) + { + /* + * Was PEM encoded + */ + buflen -= use_len; + buf += use_len; + + /* + * Steal PEM buffer + */ + p = pem.buf; + pem.buf = NULL; + len = pem.buflen; + pem_free( &pem ); + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + { + pem_free( &pem ); + return( ret ); + } + else + { + /* + * nope, copy the raw DER data + */ + p = (unsigned char *) malloc( len = buflen ); + + if( p == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + memcpy( p, buf, buflen ); + + buflen = 0; + } +#else + p = (unsigned char *) malloc( len = buflen ); + + if( p == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + memcpy( p, buf, buflen ); + + buflen = 0; +#endif + + crl->raw.p = p; + crl->raw.len = len; + end = p + len; + + /* + * CertificateList ::= SEQUENCE { + * tbsCertList TBSCertList, + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT ); + } + + if( len != (size_t) ( end - p ) ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + /* + * TBSCertList ::= SEQUENCE { + */ + crl->tbs.p = p; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + end = p + len; + crl->tbs.len = end - crl->tbs.p; + + /* + * Version ::= INTEGER OPTIONAL { v1(0), v2(1) } + * -- if present, MUST be v2 + * + * signature AlgorithmIdentifier + */ + if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 || + ( ret = x509_get_alg( &p, end, &crl->sig_oid1 ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + crl->version++; + + if( crl->version > 2 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION ); + } + + if( ( ret = x509_get_sig_alg( &crl->sig_oid1, &crl->sig_alg ) ) != 0 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG ); + } + + /* + * issuer Name + */ + crl->issuer_raw.p = p; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + if( ( ret = x509_get_name( &p, p + len, &crl->issuer ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + crl->issuer_raw.len = p - crl->issuer_raw.p; + + /* + * thisUpdate Time + * nextUpdate Time OPTIONAL + */ + if( ( ret = x509_get_time( &p, end, &crl->this_update ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + if( ( ret = x509_get_time( &p, end, &crl->next_update ) ) != 0 ) + { + if ( ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE + + POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) && + ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE + + POLARSSL_ERR_ASN1_OUT_OF_DATA ) ) + { + x509_crl_free( crl ); + return( ret ); + } + } + + /* + * revokedCertificates SEQUENCE OF SEQUENCE { + * userCertificate CertificateSerialNumber, + * revocationDate Time, + * crlEntryExtensions Extensions OPTIONAL + * -- if present, MUST be v2 + * } OPTIONAL + */ + if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + /* + * crlExtensions EXPLICIT Extensions OPTIONAL + * -- if present, MUST be v2 + */ + if( crl->version == 2 ) + { + ret = x509_get_crl_ext( &p, end, &crl->crl_ext ); + + if( ret != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + } + + if( p != end ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + end = crl->raw.p + crl->raw.len; + + /* + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING + */ + if( ( ret = x509_get_alg( &p, end, &crl->sig_oid2 ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + if( crl->sig_oid1.len != crl->sig_oid2.len || + memcmp( crl->sig_oid1.p, crl->sig_oid2.p, crl->sig_oid1.len ) != 0 ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH ); + } + + if( ( ret = x509_get_sig( &p, end, &crl->sig ) ) != 0 ) + { + x509_crl_free( crl ); + return( ret ); + } + + if( p != end ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + if( buflen > 0 ) + { + crl->next = (x509_crl *) malloc( sizeof( x509_crl ) ); + + if( crl->next == NULL ) + { + x509_crl_free( crl ); + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + } + + crl = crl->next; + memset( crl, 0, sizeof( x509_crl ) ); + + return( x509parse_crl( crl, buf, buflen ) ); + } + + return( 0 ); +} + +#if defined(POLARSSL_FS_IO) +/* + * Load all data from a file into a given buffer. + */ +int load_file( const char *path, unsigned char **buf, size_t *n ) +{ + FILE *f; + + if( ( f = fopen( path, "rb" ) ) == NULL ) + return( POLARSSL_ERR_X509_FILE_IO_ERROR ); + + fseek( f, 0, SEEK_END ); + *n = (size_t) ftell( f ); + fseek( f, 0, SEEK_SET ); + + if( ( *buf = (unsigned char *) malloc( *n + 1 ) ) == NULL ) + return( POLARSSL_ERR_X509_MALLOC_FAILED ); + + if( fread( *buf, 1, *n, f ) != *n ) + { + fclose( f ); + free( *buf ); + return( POLARSSL_ERR_X509_FILE_IO_ERROR ); + } + + fclose( f ); + + (*buf)[*n] = '\0'; + + return( 0 ); +} + +/* + * Load one or more certificates and add them to the chained list + */ +int x509parse_crtfile( x509_cert *chain, const char *path ) +{ + int ret; + size_t n; + unsigned char *buf; + + if ( (ret = load_file( path, &buf, &n ) ) != 0 ) + return( ret ); + + ret = x509parse_crt( chain, buf, n ); + + memset( buf, 0, n + 1 ); + free( buf ); + + return( ret ); +} + +int x509parse_crtpath( x509_cert *chain, const char *path ) +{ + int ret = 0; +#if defined(_WIN32) + int w_ret; + WCHAR szDir[MAX_PATH]; + char filename[MAX_PATH]; + char *p; + int len = strlen( path ); + + WIN32_FIND_DATAW file_data; + HANDLE hFind; + + if( len > MAX_PATH - 3 ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + memset( szDir, 0, sizeof(szDir) ); + memset( filename, 0, MAX_PATH ); + memcpy( filename, path, len ); + filename[len++] = '\\'; + p = filename + len; + filename[len++] = '*'; + + w_ret = MultiByteToWideChar( CP_ACP, 0, path, len, szDir, MAX_PATH - 3 ); + + hFind = FindFirstFileW( szDir, &file_data ); + if (hFind == INVALID_HANDLE_VALUE) + return( POLARSSL_ERR_X509_FILE_IO_ERROR ); + + len = MAX_PATH - len; + do + { + memset( p, 0, len ); + + if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + continue; + + w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName, + lstrlenW(file_data.cFileName), + p, len - 1, + NULL, NULL ); + + w_ret = x509parse_crtfile( chain, filename ); + if( w_ret < 0 ) + ret++; + else + ret += w_ret; + } + while( FindNextFileW( hFind, &file_data ) != 0 ); + + if (GetLastError() != ERROR_NO_MORE_FILES) + ret = POLARSSL_ERR_X509_FILE_IO_ERROR; + +cleanup: + FindClose( hFind ); +#else + int t_ret, i; + struct stat sb; + struct dirent entry, *result = NULL; + char entry_name[255]; + DIR *dir = opendir( path ); + + if( dir == NULL) + return( POLARSSL_ERR_X509_FILE_IO_ERROR ); + + while( ( t_ret = readdir_r( dir, &entry, &result ) ) == 0 ) + { + if( result == NULL ) + break; + + snprintf( entry_name, sizeof(entry_name), "%s/%s", path, entry.d_name ); + + i = stat( entry_name, &sb ); + + if( i == -1 ) + return( POLARSSL_ERR_X509_FILE_IO_ERROR ); + + if( !S_ISREG( sb.st_mode ) ) + continue; + + // Ignore parse errors + // + t_ret = x509parse_crtfile( chain, entry_name ); + if( t_ret < 0 ) + ret++; + else + ret += t_ret; + } + closedir( dir ); +#endif + + return( ret ); +} + +/* + * Load one or more CRLs and add them to the chained list + */ +int x509parse_crlfile( x509_crl *chain, const char *path ) +{ + int ret; + size_t n; + unsigned char *buf; + + if ( (ret = load_file( path, &buf, &n ) ) != 0 ) + return( ret ); + + ret = x509parse_crl( chain, buf, n ); + + memset( buf, 0, n + 1 ); + free( buf ); + + return( ret ); +} + +/* + * Load and parse a private RSA key + */ +int x509parse_keyfile( rsa_context *rsa, const char *path, const char *pwd ) +{ + int ret; + size_t n; + unsigned char *buf; + + if ( (ret = load_file( path, &buf, &n ) ) != 0 ) + return( ret ); + + if( pwd == NULL ) + ret = x509parse_key( rsa, buf, n, NULL, 0 ); + else + ret = x509parse_key( rsa, buf, n, + (unsigned char *) pwd, strlen( pwd ) ); + + memset( buf, 0, n + 1 ); + free( buf ); + + return( ret ); +} + +/* + * Load and parse a public RSA key + */ +int x509parse_public_keyfile( rsa_context *rsa, const char *path ) +{ + int ret; + size_t n; + unsigned char *buf; + + if ( (ret = load_file( path, &buf, &n ) ) != 0 ) + return( ret ); + + ret = x509parse_public_key( rsa, buf, n ); + + memset( buf, 0, n + 1 ); + free( buf ); + + return( ret ); +} +#endif /* POLARSSL_FS_IO */ + +/* + * Parse a PKCS#1 encoded private RSA key + */ +static int x509parse_key_pkcs1_der( rsa_context *rsa, + const unsigned char *key, + size_t keylen ) +{ + int ret; + size_t len; + unsigned char *p, *end; + + p = (unsigned char *) key; + end = p + keylen; + + /* + * This function parses the RSAPrivateKey (PKCS#1) + * + * RSAPrivateKey ::= SEQUENCE { + * version Version, + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p-1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * otherPrimeInfos OtherPrimeInfos OPTIONAL + * } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + end = p + len; + + if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + if( rsa->ver != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_VERSION + ret ); + } + + if( ( ret = asn1_get_mpi( &p, end, &rsa->N ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->E ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->D ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->P ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->Q ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->DP ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->DQ ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &rsa->QP ) ) != 0 ) + { + rsa_free( rsa ); + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + rsa->len = mpi_size( &rsa->N ); + + if( p != end ) + { + rsa_free( rsa ); + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + + if( ( ret = rsa_check_privkey( rsa ) ) != 0 ) + { + rsa_free( rsa ); + return( ret ); + } + + return( 0 ); +} + +/* + * Parse an unencrypted PKCS#8 encoded private RSA key + */ +static int x509parse_key_pkcs8_unencrypted_der( + rsa_context *rsa, + const unsigned char *key, + size_t keylen ) +{ + int ret; + size_t len; + unsigned char *p, *end; + x509_buf pk_alg_oid; + + p = (unsigned char *) key; + end = p + keylen; + + /* + * This function parses the PrivatKeyInfo object (PKCS#8) + * + * PrivateKeyInfo ::= SEQUENCE { + * version Version, + * algorithm AlgorithmIdentifier, + * PrivateKey BIT STRING + * } + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL + * } + * + * The PrivateKey BIT STRING is a PKCS#1 RSAPrivateKey + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + end = p + len; + + if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + if( rsa->ver != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_VERSION + ret ); + } + + if( ( ret = x509_get_alg( &p, end, &pk_alg_oid ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + /* + * only RSA keys handled at this time + */ + if( pk_alg_oid.len != 9 || + memcmp( pk_alg_oid.p, OID_PKCS1_RSA, 9 ) != 0 ) + { + return( POLARSSL_ERR_X509_UNKNOWN_PK_ALG ); + } + + /* + * Get the OCTET STRING and parse the PKCS#1 format inside + */ + if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + + if( ( end - p ) < 1 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + + POLARSSL_ERR_ASN1_OUT_OF_DATA ); + } + + end = p + len; + + if( ( ret = x509parse_key_pkcs1_der( rsa, p, end - p ) ) != 0 ) + return( ret ); + + return( 0 ); +} + +/* + * Parse an encrypted PKCS#8 encoded private RSA key + */ +static int x509parse_key_pkcs8_encrypted_der( + rsa_context *rsa, + const unsigned char *key, + size_t keylen, + const unsigned char *pwd, + size_t pwdlen ) +{ + int ret; + size_t len; + unsigned char *p, *end, *end2; + x509_buf pbe_alg_oid, pbe_params; + unsigned char buf[2048]; + + memset(buf, 0, 2048); + + p = (unsigned char *) key; + end = p + keylen; + + if( pwdlen == 0 ) + return( POLARSSL_ERR_X509_PASSWORD_REQUIRED ); + + /* + * This function parses the EncryptedPrivatKeyInfo object (PKCS#8) + * + * EncryptedPrivateKeyInfo ::= SEQUENCE { + * encryptionAlgorithm EncryptionAlgorithmIdentifier, + * encryptedData EncryptedData + * } + * + * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier + * + * EncryptedData ::= OCTET STRING + * + * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + end = p + len; + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + end2 = p + len; + + if( ( ret = asn1_get_tag( &p, end, &pbe_alg_oid.len, ASN1_OID ) ) != 0 ) + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + + pbe_alg_oid.p = p; + p += pbe_alg_oid.len; + + /* + * Store the algorithm parameters + */ + pbe_params.p = p; + pbe_params.len = end2 - p; + p += pbe_params.len; + + if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 ) + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + + // buf has been sized to 2048 bytes + if( len > 2048 ) + return( POLARSSL_ERR_X509_INVALID_INPUT ); + + /* + * Decrypt EncryptedData with appropriate PDE + */ +#if defined(POLARSSL_PKCS12_C) + if( OID_CMP( OID_PKCS12_PBE_SHA1_DES3_EDE_CBC, &pbe_alg_oid ) ) + { + if( ( ret = pkcs12_pbe( &pbe_params, PKCS12_PBE_DECRYPT, + POLARSSL_CIPHER_DES_EDE3_CBC, POLARSSL_MD_SHA1, + pwd, pwdlen, p, len, buf ) ) != 0 ) + { + if( ret == POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH ) + return( POLARSSL_ERR_X509_PASSWORD_MISMATCH ); + + return( ret ); + } + } + else if( OID_CMP( OID_PKCS12_PBE_SHA1_DES2_EDE_CBC, &pbe_alg_oid ) ) + { + if( ( ret = pkcs12_pbe( &pbe_params, PKCS12_PBE_DECRYPT, + POLARSSL_CIPHER_DES_EDE_CBC, POLARSSL_MD_SHA1, + pwd, pwdlen, p, len, buf ) ) != 0 ) + { + if( ret == POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH ) + return( POLARSSL_ERR_X509_PASSWORD_MISMATCH ); + + return( ret ); + } + } + else if( OID_CMP( OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) ) + { + if( ( ret = pkcs12_pbe_sha1_rc4_128( &pbe_params, + PKCS12_PBE_DECRYPT, + pwd, pwdlen, + p, len, buf ) ) != 0 ) + { + return( ret ); + } + + // Best guess for password mismatch when using RC4. If first tag is + // not ASN1_CONSTRUCTED | ASN1_SEQUENCE + // + if( *buf != ( ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) + return( POLARSSL_ERR_X509_PASSWORD_MISMATCH ); + } + else +#endif /* POLARSSL_PKCS12_C */ +#if defined(POLARSSL_PKCS5_C) + if( OID_CMP( OID_PKCS5_PBES2, &pbe_alg_oid ) ) + { + if( ( ret = pkcs5_pbes2( &pbe_params, PKCS5_DECRYPT, pwd, pwdlen, + p, len, buf ) ) != 0 ) + { + if( ret == POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH ) + return( POLARSSL_ERR_X509_PASSWORD_MISMATCH ); + + return( ret ); + } + } + else +#endif /* POLARSSL_PKCS5_C */ + return( POLARSSL_ERR_X509_FEATURE_UNAVAILABLE ); + + return x509parse_key_pkcs8_unencrypted_der( rsa, buf, len ); +} + +/* + * Parse a private RSA key + */ +int x509parse_key( rsa_context *rsa, const unsigned char *key, size_t keylen, + const unsigned char *pwd, size_t pwdlen ) +{ + int ret; + +#if defined(POLARSSL_PEM_C) + size_t len; + pem_context pem; + + pem_init( &pem ); + ret = pem_read_buffer( &pem, + "-----BEGIN RSA PRIVATE KEY-----", + "-----END RSA PRIVATE KEY-----", + key, pwd, pwdlen, &len ); + if( ret == 0 ) + { + if( ( ret = x509parse_key_pkcs1_der( rsa, pem.buf, pem.buflen ) ) != 0 ) + { + rsa_free( rsa ); + } + + pem_free( &pem ); + return( ret ); + } + else if( ret == POLARSSL_ERR_PEM_PASSWORD_MISMATCH ) + return( POLARSSL_ERR_X509_PASSWORD_MISMATCH ); + else if( ret == POLARSSL_ERR_PEM_PASSWORD_REQUIRED ) + return( POLARSSL_ERR_X509_PASSWORD_REQUIRED ); + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + return( ret ); + + ret = pem_read_buffer( &pem, + "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----", + key, NULL, 0, &len ); + if( ret == 0 ) + { + if( ( ret = x509parse_key_pkcs8_unencrypted_der( rsa, + pem.buf, pem.buflen ) ) != 0 ) + { + rsa_free( rsa ); + } + + pem_free( &pem ); + return( ret ); + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + return( ret ); + + ret = pem_read_buffer( &pem, + "-----BEGIN ENCRYPTED PRIVATE KEY-----", + "-----END ENCRYPTED PRIVATE KEY-----", + key, NULL, 0, &len ); + if( ret == 0 ) + { + if( ( ret = x509parse_key_pkcs8_encrypted_der( rsa, + pem.buf, pem.buflen, + pwd, pwdlen ) ) != 0 ) + { + rsa_free( rsa ); + } + + pem_free( &pem ); + return( ret ); + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + return( ret ); +#else + ((void) pwd); + ((void) pwdlen); +#endif /* POLARSSL_PEM_C */ + + // At this point we only know it's not a PEM formatted key. Could be any + // of the known DER encoded private key formats + // + // We try the different DER format parsers to see if one passes without + // error + // + if( ( ret = x509parse_key_pkcs8_encrypted_der( rsa, key, keylen, + pwd, pwdlen ) ) == 0 ) + { + return( 0 ); + } + + rsa_free( rsa ); + + if( ret == POLARSSL_ERR_X509_PASSWORD_MISMATCH ) + { + return( ret ); + } + + if( ( ret = x509parse_key_pkcs8_unencrypted_der( rsa, key, keylen ) ) == 0 ) + return( 0 ); + + rsa_free( rsa ); + + if( ( ret = x509parse_key_pkcs1_der( rsa, key, keylen ) ) == 0 ) + return( 0 ); + + rsa_free( rsa ); + + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT ); +} + +/* + * Parse a public RSA key + */ +int x509parse_public_key( rsa_context *rsa, const unsigned char *key, size_t keylen ) +{ + int ret; + size_t len; + unsigned char *p, *end; + x509_buf alg_oid; +#if defined(POLARSSL_PEM_C) + pem_context pem; + + pem_init( &pem ); + ret = pem_read_buffer( &pem, + "-----BEGIN PUBLIC KEY-----", + "-----END PUBLIC KEY-----", + key, NULL, 0, &len ); + + if( ret == 0 ) + { + /* + * Was PEM encoded + */ + keylen = pem.buflen; + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + { + pem_free( &pem ); + return( ret ); + } + + p = ( ret == 0 ) ? pem.buf : (unsigned char *) key; +#else + p = (unsigned char *) key; +#endif + end = p + keylen; + + /* + * PublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * PublicKey BIT STRING + * } + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL + * } + * + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + */ + + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + rsa_free( rsa ); + return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret ); + } + + if( ( ret = x509_get_pubkey( &p, end, &alg_oid, &rsa->N, &rsa->E ) ) != 0 ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + rsa_free( rsa ); + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + if( ( ret = rsa_check_pubkey( rsa ) ) != 0 ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + rsa_free( rsa ); + return( ret ); + } + + rsa->len = mpi_size( &rsa->N ); + +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + + return( 0 ); +} + +#if defined(POLARSSL_DHM_C) +/* + * Parse DHM parameters + */ +int x509parse_dhm( dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ) +{ + int ret; + size_t len; + unsigned char *p, *end; +#if defined(POLARSSL_PEM_C) + pem_context pem; + + pem_init( &pem ); + + ret = pem_read_buffer( &pem, + "-----BEGIN DH PARAMETERS-----", + "-----END DH PARAMETERS-----", + dhmin, NULL, 0, &dhminlen ); + + if( ret == 0 ) + { + /* + * Was PEM encoded + */ + dhminlen = pem.buflen; + } + else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + { + pem_free( &pem ); + return( ret ); + } + + p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin; +#else + p = (unsigned char *) dhmin; +#endif + end = p + dhminlen; + + memset( dhm, 0, sizeof( dhm_context ) ); + + /* + * DHParams ::= SEQUENCE { + * prime INTEGER, -- P + * generator INTEGER, -- g + * } + */ + if( ( ret = asn1_get_tag( &p, end, &len, + ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + end = p + len; + + if( ( ret = asn1_get_mpi( &p, end, &dhm->P ) ) != 0 || + ( ret = asn1_get_mpi( &p, end, &dhm->G ) ) != 0 ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + dhm_free( dhm ); + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret ); + } + + if( p != end ) + { +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + dhm_free( dhm ); + return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + + POLARSSL_ERR_ASN1_LENGTH_MISMATCH ); + } + +#if defined(POLARSSL_PEM_C) + pem_free( &pem ); +#endif + + return( 0 ); +} + +#if defined(POLARSSL_FS_IO) +/* + * Load and parse a private RSA key + */ +int x509parse_dhmfile( dhm_context *dhm, const char *path ) +{ + int ret; + size_t n; + unsigned char *buf; + + if ( ( ret = load_file( path, &buf, &n ) ) != 0 ) + return( ret ); + + ret = x509parse_dhm( dhm, buf, n ); + + memset( buf, 0, n + 1 ); + free( buf ); + + return( ret ); +} +#endif /* POLARSSL_FS_IO */ +#endif /* POLARSSL_DHM_C */ + +#if defined _MSC_VER && !defined snprintf +#include + +#if !defined vsnprintf +#define vsnprintf _vsnprintf +#endif // vsnprintf + +/* + * Windows _snprintf and _vsnprintf are not compatible to linux versions. + * Result value is not size of buffer needed, but -1 if no fit is possible. + * + * This fuction tries to 'fix' this by at least suggesting enlarging the + * size by 20. + */ +int compat_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int res = -1; + + va_start( ap, format ); + + res = vsnprintf( str, size, format, ap ); + + va_end( ap ); + + // No quick fix possible + if ( res < 0 ) + return( (int) size + 20 ); + + return res; +} + +#define snprintf compat_snprintf +#endif + +#define POLARSSL_ERR_DEBUG_BUF_TOO_SMALL -2 + +#define SAFE_SNPRINTF() \ +{ \ + if( ret == -1 ) \ + return( -1 ); \ + \ + if ( (unsigned int) ret > n ) { \ + p[n - 1] = '\0'; \ + return POLARSSL_ERR_DEBUG_BUF_TOO_SMALL;\ + } \ + \ + n -= (unsigned int) ret; \ + p += (unsigned int) ret; \ +} + +/* + * Store the name in printable form into buf; no more + * than size characters will be written + */ +int x509parse_dn_gets( char *buf, size_t size, const x509_name *dn ) +{ + int ret; + size_t i, n; + unsigned char c; + const x509_name *name; + char s[128], *p; + + memset( s, 0, sizeof( s ) ); + + name = dn; + p = buf; + n = size; + + while( name != NULL ) + { + if( !name->oid.p ) + { + name = name->next; + continue; + } + + if( name != dn ) + { + ret = snprintf( p, n, ", " ); + SAFE_SNPRINTF(); + } + + if( name->oid.len == 3 && + memcmp( name->oid.p, OID_X520, 2 ) == 0 ) + { + switch( name->oid.p[2] ) + { + case X520_COMMON_NAME: + ret = snprintf( p, n, "CN=" ); break; + + case X520_COUNTRY: + ret = snprintf( p, n, "C=" ); break; + + case X520_LOCALITY: + ret = snprintf( p, n, "L=" ); break; + + case X520_STATE: + ret = snprintf( p, n, "ST=" ); break; + + case X520_ORGANIZATION: + ret = snprintf( p, n, "O=" ); break; + + case X520_ORG_UNIT: + ret = snprintf( p, n, "OU=" ); break; + + default: + ret = snprintf( p, n, "0x%02X=", + name->oid.p[2] ); + break; + } + SAFE_SNPRINTF(); + } + else if( name->oid.len == 9 && + memcmp( name->oid.p, OID_PKCS9, 8 ) == 0 ) + { + switch( name->oid.p[8] ) + { + case PKCS9_EMAIL: + ret = snprintf( p, n, "emailAddress=" ); break; + + default: + ret = snprintf( p, n, "0x%02X=", + name->oid.p[8] ); + break; + } + SAFE_SNPRINTF(); + } + else + { + ret = snprintf( p, n, "\?\?=" ); + SAFE_SNPRINTF(); + } + + for( i = 0; i < name->val.len; i++ ) + { + if( i >= sizeof( s ) - 1 ) + break; + + c = name->val.p[i]; + if( c < 32 || c == 127 || ( c > 128 && c < 160 ) ) + s[i] = '?'; + else s[i] = c; + } + s[i] = '\0'; + ret = snprintf( p, n, "%s", s ); + SAFE_SNPRINTF(); + name = name->next; + } + + return( (int) ( size - n ) ); +} + +/* + * Store the serial in printable form into buf; no more + * than size characters will be written + */ +int x509parse_serial_gets( char *buf, size_t size, const x509_buf *serial ) +{ + int ret; + size_t i, n, nr; + char *p; + + p = buf; + n = size; + + nr = ( serial->len <= 32 ) + ? serial->len : 28; + + for( i = 0; i < nr; i++ ) + { + if( i == 0 && nr > 1 && serial->p[i] == 0x0 ) + continue; + + ret = snprintf( p, n, "%02X%s", + serial->p[i], ( i < nr - 1 ) ? ":" : "" ); + SAFE_SNPRINTF(); + } + + if( nr != serial->len ) + { + ret = snprintf( p, n, "...." ); + SAFE_SNPRINTF(); + } + + return( (int) ( size - n ) ); +} + +/* + * Return an informational string about the certificate. + */ +int x509parse_cert_info( char *buf, size_t size, const char *prefix, + const x509_cert *crt ) +{ + int ret; + size_t n; + char *p; + + p = buf; + n = size; + + ret = snprintf( p, n, "%scert. version : %d\n", + prefix, crt->version ); + SAFE_SNPRINTF(); + ret = snprintf( p, n, "%sserial number : ", + prefix ); + SAFE_SNPRINTF(); + + ret = x509parse_serial_gets( p, n, &crt->serial); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sissuer name : ", prefix ); + SAFE_SNPRINTF(); + ret = x509parse_dn_gets( p, n, &crt->issuer ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%ssubject name : ", prefix ); + SAFE_SNPRINTF(); + ret = x509parse_dn_gets( p, n, &crt->subject ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sissued on : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crt->valid_from.year, crt->valid_from.mon, + crt->valid_from.day, crt->valid_from.hour, + crt->valid_from.min, crt->valid_from.sec ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sexpires on : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crt->valid_to.year, crt->valid_to.mon, + crt->valid_to.day, crt->valid_to.hour, + crt->valid_to.min, crt->valid_to.sec ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix ); + SAFE_SNPRINTF(); + + switch( crt->sig_alg ) + { + case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break; + case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break; + case SIG_RSA_MD5 : ret = snprintf( p, n, "MD5" ); break; + case SIG_RSA_SHA1 : ret = snprintf( p, n, "SHA1" ); break; + case SIG_RSA_SHA224 : ret = snprintf( p, n, "SHA224" ); break; + case SIG_RSA_SHA256 : ret = snprintf( p, n, "SHA256" ); break; + case SIG_RSA_SHA384 : ret = snprintf( p, n, "SHA384" ); break; + case SIG_RSA_SHA512 : ret = snprintf( p, n, "SHA512" ); break; + default: ret = snprintf( p, n, "???" ); break; + } + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sRSA key size : %d bits\n", prefix, + (int) crt->rsa.N.n * (int) sizeof( t_uint ) * 8 ); + SAFE_SNPRINTF(); + + return( (int) ( size - n ) ); +} + +/* + * Return an informational string describing the given OID + */ +const char *x509_oid_get_description( x509_buf *oid ) +{ + if ( oid == NULL ) + return ( NULL ); + + else if( OID_CMP( OID_SERVER_AUTH, oid ) ) + return( STRING_SERVER_AUTH ); + + else if( OID_CMP( OID_CLIENT_AUTH, oid ) ) + return( STRING_CLIENT_AUTH ); + + else if( OID_CMP( OID_CODE_SIGNING, oid ) ) + return( STRING_CODE_SIGNING ); + + else if( OID_CMP( OID_EMAIL_PROTECTION, oid ) ) + return( STRING_EMAIL_PROTECTION ); + + else if( OID_CMP( OID_TIME_STAMPING, oid ) ) + return( STRING_TIME_STAMPING ); + + else if( OID_CMP( OID_OCSP_SIGNING, oid ) ) + return( STRING_OCSP_SIGNING ); + + return( NULL ); +} + +/* Return the x.y.z.... style numeric string for the given OID */ +int x509_oid_get_numeric_string( char *buf, size_t size, x509_buf *oid ) +{ + int ret; + size_t i, n; + unsigned int value; + char *p; + + p = buf; + n = size; + + /* First byte contains first two dots */ + if( oid->len > 0 ) + { + ret = snprintf( p, n, "%d.%d", oid->p[0]/40, oid->p[0]%40 ); + SAFE_SNPRINTF(); + } + + /* TODO: value can overflow in value. */ + value = 0; + for( i = 1; i < oid->len; i++ ) + { + value <<= 7; + value += oid->p[i] & 0x7F; + + if( !( oid->p[i] & 0x80 ) ) + { + /* Last byte */ + ret = snprintf( p, n, ".%d", value ); + SAFE_SNPRINTF(); + value = 0; + } + } + + return( (int) ( size - n ) ); +} + +/* + * Return an informational string about the CRL. + */ +int x509parse_crl_info( char *buf, size_t size, const char *prefix, + const x509_crl *crl ) +{ + int ret; + size_t n; + char *p; + const x509_crl_entry *entry; + + p = buf; + n = size; + + ret = snprintf( p, n, "%sCRL version : %d", + prefix, crl->version ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sissuer name : ", prefix ); + SAFE_SNPRINTF(); + ret = x509parse_dn_gets( p, n, &crl->issuer ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%sthis update : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crl->this_update.year, crl->this_update.mon, + crl->this_update.day, crl->this_update.hour, + crl->this_update.min, crl->this_update.sec ); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n%snext update : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crl->next_update.year, crl->next_update.mon, + crl->next_update.day, crl->next_update.hour, + crl->next_update.min, crl->next_update.sec ); + SAFE_SNPRINTF(); + + entry = &crl->entry; + + ret = snprintf( p, n, "\n%sRevoked certificates:", + prefix ); + SAFE_SNPRINTF(); + + while( entry != NULL && entry->raw.len != 0 ) + { + ret = snprintf( p, n, "\n%sserial number: ", + prefix ); + SAFE_SNPRINTF(); + + ret = x509parse_serial_gets( p, n, &entry->serial); + SAFE_SNPRINTF(); + + ret = snprintf( p, n, " revocation date: " \ + "%04d-%02d-%02d %02d:%02d:%02d", + entry->revocation_date.year, entry->revocation_date.mon, + entry->revocation_date.day, entry->revocation_date.hour, + entry->revocation_date.min, entry->revocation_date.sec ); + SAFE_SNPRINTF(); + + entry = entry->next; + } + + ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix ); + SAFE_SNPRINTF(); + + switch( crl->sig_alg ) + { + case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break; + case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break; + case SIG_RSA_MD5 : ret = snprintf( p, n, "MD5" ); break; + case SIG_RSA_SHA1 : ret = snprintf( p, n, "SHA1" ); break; + case SIG_RSA_SHA224 : ret = snprintf( p, n, "SHA224" ); break; + case SIG_RSA_SHA256 : ret = snprintf( p, n, "SHA256" ); break; + case SIG_RSA_SHA384 : ret = snprintf( p, n, "SHA384" ); break; + case SIG_RSA_SHA512 : ret = snprintf( p, n, "SHA512" ); break; + default: ret = snprintf( p, n, "???" ); break; + } + SAFE_SNPRINTF(); + + ret = snprintf( p, n, "\n" ); + SAFE_SNPRINTF(); + + return( (int) ( size - n ) ); +} + +/* + * Return 0 if the x509_time is still valid, or 1 otherwise. + */ +int x509parse_time_expired( const x509_time *to ) +{ + int year, mon, day; + int hour, min, sec; + +#if defined(_WIN32) + SYSTEMTIME st; + + GetLocalTime(&st); + + year = st.wYear; + mon = st.wMonth; + day = st.wDay; + hour = st.wHour; + min = st.wMinute; + sec = st.wSecond; +#else + struct tm *lt; + time_t tt; + + tt = time( NULL ); + lt = localtime( &tt ); + + year = lt->tm_year + 1900; + mon = lt->tm_mon + 1; + day = lt->tm_mday; + hour = lt->tm_hour; + min = lt->tm_min; + sec = lt->tm_sec; +#endif + + if( year > to->year ) + return( 1 ); + + if( year == to->year && + mon > to->mon ) + return( 1 ); + + if( year == to->year && + mon == to->mon && + day > to->day ) + return( 1 ); + + if( year == to->year && + mon == to->mon && + day == to->day && + hour > to->hour ) + return( 1 ); + + if( year == to->year && + mon == to->mon && + day == to->day && + hour == to->hour && + min > to->min ) + return( 1 ); + + if( year == to->year && + mon == to->mon && + day == to->day && + hour == to->hour && + min == to->min && + sec > to->sec ) + return( 1 ); + + return( 0 ); +} + +/* + * Return 1 if the certificate is revoked, or 0 otherwise. + */ +int x509parse_revoked( const x509_cert *crt, const x509_crl *crl ) +{ + const x509_crl_entry *cur = &crl->entry; + + while( cur != NULL && cur->serial.len != 0 ) + { + if( crt->serial.len == cur->serial.len && + memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 ) + { + if( x509parse_time_expired( &cur->revocation_date ) ) + return( 1 ); + } + + cur = cur->next; + } + + return( 0 ); +} + +/* + * Wrapper for x509 hashes. + */ +static void x509_hash( const unsigned char *in, size_t len, int alg, + unsigned char *out ) +{ + switch( alg ) + { +#if defined(POLARSSL_MD2_C) + case SIG_RSA_MD2 : md2( in, len, out ); break; +#endif +#if defined(POLARSSL_MD4_C) + case SIG_RSA_MD4 : md4( in, len, out ); break; +#endif +#if defined(POLARSSL_MD5_C) + case SIG_RSA_MD5 : md5( in, len, out ); break; +#endif +#if defined(POLARSSL_SHA1_C) + case SIG_RSA_SHA1 : sha1( in, len, out ); break; +#endif +#if defined(POLARSSL_SHA2_C) + case SIG_RSA_SHA224 : sha2( in, len, out, 1 ); break; + case SIG_RSA_SHA256 : sha2( in, len, out, 0 ); break; +#endif +#if defined(POLARSSL_SHA4_C) + case SIG_RSA_SHA384 : sha4( in, len, out, 1 ); break; + case SIG_RSA_SHA512 : sha4( in, len, out, 0 ); break; +#endif + default: + memset( out, '\xFF', 64 ); + break; + } +} + +/* + * Check that the given certificate is valid accoring to the CRL. + */ +static int x509parse_verifycrl(x509_cert *crt, x509_cert *ca, + x509_crl *crl_list) +{ + int flags = 0; + int hash_id; + unsigned char hash[64]; + + if( ca == NULL ) + return( flags ); + + /* + * TODO: What happens if no CRL is present? + * Suggestion: Revocation state should be unknown if no CRL is present. + * For backwards compatibility this is not yet implemented. + */ + + while( crl_list != NULL ) + { + if( crl_list->version == 0 || + crl_list->issuer_raw.len != ca->subject_raw.len || + memcmp( crl_list->issuer_raw.p, ca->subject_raw.p, + crl_list->issuer_raw.len ) != 0 ) + { + crl_list = crl_list->next; + continue; + } + + /* + * Check if CRL is correctly signed by the trusted CA + */ + hash_id = crl_list->sig_alg; + + x509_hash( crl_list->tbs.p, crl_list->tbs.len, hash_id, hash ); + + if( !rsa_pkcs1_verify( &ca->rsa, RSA_PUBLIC, hash_id, + 0, hash, crl_list->sig.p ) == 0 ) + { + /* + * CRL is not trusted + */ + flags |= BADCRL_NOT_TRUSTED; + break; + } + + /* + * Check for validity of CRL (Do not drop out) + */ + if( x509parse_time_expired( &crl_list->next_update ) ) + flags |= BADCRL_EXPIRED; + + /* + * Check if certificate is revoked + */ + if( x509parse_revoked(crt, crl_list) ) + { + flags |= BADCERT_REVOKED; + break; + } + + crl_list = crl_list->next; + } + return flags; +} + +int x509_wildcard_verify( const char *cn, x509_buf *name ) +{ + size_t i; + size_t cn_idx = 0; + + if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' ) + return( 0 ); + + for( i = 0; i < strlen( cn ); ++i ) + { + if( cn[i] == '.' ) + { + cn_idx = i; + break; + } + } + + if( cn_idx == 0 ) + return( 0 ); + + if( strlen( cn ) - cn_idx == name->len - 1 && + memcmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 ) + { + return( 1 ); + } + + return( 0 ); +} + +static int x509parse_verify_top( + x509_cert *child, x509_cert *trust_ca, + x509_crl *ca_crl, int path_cnt, int *flags, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ) +{ + int hash_id, ret; + int ca_flags = 0, check_path_cnt = path_cnt + 1; + unsigned char hash[64]; + + if( x509parse_time_expired( &child->valid_to ) ) + *flags |= BADCERT_EXPIRED; + + /* + * Child is the top of the chain. Check against the trust_ca list. + */ + *flags |= BADCERT_NOT_TRUSTED; + + while( trust_ca != NULL ) + { + if( trust_ca->version == 0 || + child->issuer_raw.len != trust_ca->subject_raw.len || + memcmp( child->issuer_raw.p, trust_ca->subject_raw.p, + child->issuer_raw.len ) != 0 ) + { + trust_ca = trust_ca->next; + continue; + } + + /* + * Reduce path_len to check against if top of the chain is + * the same as the trusted CA + */ + if( child->subject_raw.len == trust_ca->subject_raw.len && + memcmp( child->subject_raw.p, trust_ca->subject_raw.p, + child->issuer_raw.len ) == 0 ) + { + check_path_cnt--; + } + + if( trust_ca->max_pathlen > 0 && + trust_ca->max_pathlen < check_path_cnt ) + { + trust_ca = trust_ca->next; + continue; + } + + hash_id = child->sig_alg; + + x509_hash( child->tbs.p, child->tbs.len, hash_id, hash ); + + if( rsa_pkcs1_verify( &trust_ca->rsa, RSA_PUBLIC, hash_id, + 0, hash, child->sig.p ) != 0 ) + { + trust_ca = trust_ca->next; + continue; + } + + /* + * Top of chain is signed by a trusted CA + */ + *flags &= ~BADCERT_NOT_TRUSTED; + break; + } + + /* + * If top of chain is not the same as the trusted CA send a verify request + * to the callback for any issues with validity and CRL presence for the + * trusted CA certificate. + */ + if( trust_ca != NULL && + ( child->subject_raw.len != trust_ca->subject_raw.len || + memcmp( child->subject_raw.p, trust_ca->subject_raw.p, + child->issuer_raw.len ) != 0 ) ) + { + /* Check trusted CA's CRL for then chain's top crt */ + *flags |= x509parse_verifycrl( child, trust_ca, ca_crl ); + + if( x509parse_time_expired( &trust_ca->valid_to ) ) + ca_flags |= BADCERT_EXPIRED; + + if( NULL != f_vrfy ) + { + if( ( ret = f_vrfy( p_vrfy, trust_ca, path_cnt + 1, &ca_flags ) ) != 0 ) + return( ret ); + } + } + + /* Call callback on top cert */ + if( NULL != f_vrfy ) + { + if( ( ret = f_vrfy(p_vrfy, child, path_cnt, flags ) ) != 0 ) + return( ret ); + } + + *flags |= ca_flags; + + return( 0 ); +} + +static int x509parse_verify_child( + x509_cert *child, x509_cert *parent, x509_cert *trust_ca, + x509_crl *ca_crl, int path_cnt, int *flags, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ) +{ + int hash_id, ret; + int parent_flags = 0; + unsigned char hash[64]; + x509_cert *grandparent; + + if( x509parse_time_expired( &child->valid_to ) ) + *flags |= BADCERT_EXPIRED; + + hash_id = child->sig_alg; + + x509_hash( child->tbs.p, child->tbs.len, hash_id, hash ); + + if( rsa_pkcs1_verify( &parent->rsa, RSA_PUBLIC, hash_id, 0, hash, + child->sig.p ) != 0 ) + *flags |= BADCERT_NOT_TRUSTED; + + /* Check trusted CA's CRL for the given crt */ + *flags |= x509parse_verifycrl(child, parent, ca_crl); + + grandparent = parent->next; + + while( grandparent != NULL ) + { + if( grandparent->version == 0 || + grandparent->ca_istrue == 0 || + parent->issuer_raw.len != grandparent->subject_raw.len || + memcmp( parent->issuer_raw.p, grandparent->subject_raw.p, + parent->issuer_raw.len ) != 0 ) + { + grandparent = grandparent->next; + continue; + } + break; + } + + if( grandparent != NULL ) + { + /* + * Part of the chain + */ + ret = x509parse_verify_child( parent, grandparent, trust_ca, ca_crl, path_cnt + 1, &parent_flags, f_vrfy, p_vrfy ); + if( ret != 0 ) + return( ret ); + } + else + { + ret = x509parse_verify_top( parent, trust_ca, ca_crl, path_cnt + 1, &parent_flags, f_vrfy, p_vrfy ); + if( ret != 0 ) + return( ret ); + } + + /* child is verified to be a child of the parent, call verify callback */ + if( NULL != f_vrfy ) + if( ( ret = f_vrfy( p_vrfy, child, path_cnt, flags ) ) != 0 ) + return( ret ); + + *flags |= parent_flags; + + return( 0 ); +} + +/* + * Verify the certificate validity + */ +int x509parse_verify( x509_cert *crt, + x509_cert *trust_ca, + x509_crl *ca_crl, + const char *cn, int *flags, + int (*f_vrfy)(void *, x509_cert *, int, int *), + void *p_vrfy ) +{ + size_t cn_len; + int ret; + int pathlen = 0; + x509_cert *parent; + x509_name *name; + x509_sequence *cur = NULL; + + *flags = 0; + + if( cn != NULL ) + { + name = &crt->subject; + cn_len = strlen( cn ); + + if( crt->ext_types & EXT_SUBJECT_ALT_NAME ) + { + cur = &crt->subject_alt_names; + + while( cur != NULL ) + { + if( cur->buf.len == cn_len && + memcmp( cn, cur->buf.p, cn_len ) == 0 ) + break; + + if( cur->buf.len > 2 && + memcmp( cur->buf.p, "*.", 2 ) == 0 && + x509_wildcard_verify( cn, &cur->buf ) ) + break; + + cur = cur->next; + } + + if( cur == NULL ) + *flags |= BADCERT_CN_MISMATCH; + } + else + { + while( name != NULL ) + { + if( name->oid.len == 3 && + memcmp( name->oid.p, OID_CN, 3 ) == 0 ) + { + if( name->val.len == cn_len && + memcmp( name->val.p, cn, cn_len ) == 0 ) + break; + + if( name->val.len > 2 && + memcmp( name->val.p, "*.", 2 ) == 0 && + x509_wildcard_verify( cn, &name->val ) ) + break; + } + + name = name->next; + } + + if( name == NULL ) + *flags |= BADCERT_CN_MISMATCH; + } + } + + /* + * Iterate upwards in the given cert chain, to find our crt parent. + * Ignore any upper cert with CA != TRUE. + */ + parent = crt->next; + + while( parent != NULL && parent->version != 0 ) + { + if( parent->ca_istrue == 0 || + crt->issuer_raw.len != parent->subject_raw.len || + memcmp( crt->issuer_raw.p, parent->subject_raw.p, + crt->issuer_raw.len ) != 0 ) + { + parent = parent->next; + continue; + } + break; + } + + if( parent != NULL ) + { + /* + * Part of the chain + */ + ret = x509parse_verify_child( crt, parent, trust_ca, ca_crl, pathlen, flags, f_vrfy, p_vrfy ); + if( ret != 0 ) + return( ret ); + } + else + { + ret = x509parse_verify_top( crt, trust_ca, ca_crl, pathlen, flags, f_vrfy, p_vrfy ); + if( ret != 0 ) + return( ret ); + } + + if( *flags != 0 ) + return( POLARSSL_ERR_X509_CERT_VERIFY_FAILED ); + + return( 0 ); +} + +/* + * Unallocate all certificate data + */ +void x509_free( x509_cert *crt ) +{ + x509_cert *cert_cur = crt; + x509_cert *cert_prv; + x509_name *name_cur; + x509_name *name_prv; + x509_sequence *seq_cur; + x509_sequence *seq_prv; + + if( crt == NULL ) + return; + + do + { + rsa_free( &cert_cur->rsa ); + + name_cur = cert_cur->issuer.next; + while( name_cur != NULL ) + { + name_prv = name_cur; + name_cur = name_cur->next; + memset( name_prv, 0, sizeof( x509_name ) ); + free( name_prv ); + } + + name_cur = cert_cur->subject.next; + while( name_cur != NULL ) + { + name_prv = name_cur; + name_cur = name_cur->next; + memset( name_prv, 0, sizeof( x509_name ) ); + free( name_prv ); + } + + seq_cur = cert_cur->ext_key_usage.next; + while( seq_cur != NULL ) + { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + memset( seq_prv, 0, sizeof( x509_sequence ) ); + free( seq_prv ); + } + + seq_cur = cert_cur->subject_alt_names.next; + while( seq_cur != NULL ) + { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + memset( seq_prv, 0, sizeof( x509_sequence ) ); + free( seq_prv ); + } + + if( cert_cur->raw.p != NULL ) + { + memset( cert_cur->raw.p, 0, cert_cur->raw.len ); + free( cert_cur->raw.p ); + } + + cert_cur = cert_cur->next; + } + while( cert_cur != NULL ); + + cert_cur = crt; + do + { + cert_prv = cert_cur; + cert_cur = cert_cur->next; + + memset( cert_prv, 0, sizeof( x509_cert ) ); + if( cert_prv != crt ) + free( cert_prv ); + } + while( cert_cur != NULL ); +} + +/* + * Unallocate all CRL data + */ +void x509_crl_free( x509_crl *crl ) +{ + x509_crl *crl_cur = crl; + x509_crl *crl_prv; + x509_name *name_cur; + x509_name *name_prv; + x509_crl_entry *entry_cur; + x509_crl_entry *entry_prv; + + if( crl == NULL ) + return; + + do + { + name_cur = crl_cur->issuer.next; + while( name_cur != NULL ) + { + name_prv = name_cur; + name_cur = name_cur->next; + memset( name_prv, 0, sizeof( x509_name ) ); + free( name_prv ); + } + + entry_cur = crl_cur->entry.next; + while( entry_cur != NULL ) + { + entry_prv = entry_cur; + entry_cur = entry_cur->next; + memset( entry_prv, 0, sizeof( x509_crl_entry ) ); + free( entry_prv ); + } + + if( crl_cur->raw.p != NULL ) + { + memset( crl_cur->raw.p, 0, crl_cur->raw.len ); + free( crl_cur->raw.p ); + } + + crl_cur = crl_cur->next; + } + while( crl_cur != NULL ); + + crl_cur = crl; + do + { + crl_prv = crl_cur; + crl_cur = crl_cur->next; + + memset( crl_prv, 0, sizeof( x509_crl ) ); + if( crl_prv != crl ) + free( crl_prv ); + } + while( crl_cur != NULL ); +} + +#if defined(POLARSSL_SELF_TEST) + +#include "polarssl/certs.h" + +/* + * Checkup routine + */ +int x509_self_test( int verbose ) +{ +#if defined(POLARSSL_CERTS_C) && defined(POLARSSL_MD5_C) + int ret; + int flags; + size_t i, j; + x509_cert cacert; + x509_cert clicert; + rsa_context rsa; +#if defined(POLARSSL_DHM_C) + dhm_context dhm; +#endif + + if( verbose != 0 ) + printf( " X.509 certificate load: " ); + + memset( &clicert, 0, sizeof( x509_cert ) ); + + ret = x509parse_crt( &clicert, (const unsigned char *) test_cli_crt, + strlen( test_cli_crt ) ); + if( ret != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( ret ); + } + + memset( &cacert, 0, sizeof( x509_cert ) ); + + ret = x509parse_crt( &cacert, (const unsigned char *) test_ca_crt, + strlen( test_ca_crt ) ); + if( ret != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( ret ); + } + + if( verbose != 0 ) + printf( "passed\n X.509 private key load: " ); + + i = strlen( test_ca_key ); + j = strlen( test_ca_pwd ); + + rsa_init( &rsa, RSA_PKCS_V15, 0 ); + + if( ( ret = x509parse_key( &rsa, + (const unsigned char *) test_ca_key, i, + (const unsigned char *) test_ca_pwd, j ) ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( ret ); + } + + if( verbose != 0 ) + printf( "passed\n X.509 signature verify: "); + + ret = x509parse_verify( &clicert, &cacert, NULL, "PolarSSL Client 2", &flags, NULL, NULL ); + if( ret != 0 ) + { + printf("%02x", flags); + if( verbose != 0 ) + printf( "failed\n" ); + + return( ret ); + } + +#if defined(POLARSSL_DHM_C) + if( verbose != 0 ) + printf( "passed\n X.509 DHM parameter load: " ); + + i = strlen( test_dhm_params ); + j = strlen( test_ca_pwd ); + + if( ( ret = x509parse_dhm( &dhm, (const unsigned char *) test_dhm_params, i ) ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( ret ); + } + + if( verbose != 0 ) + printf( "passed\n\n" ); +#endif + + x509_free( &cacert ); + x509_free( &clicert ); + rsa_free( &rsa ); +#if defined(POLARSSL_DHM_C) + dhm_free( &dhm ); +#endif + + return( 0 ); +#else + ((void) verbose); + return( POLARSSL_ERR_X509_FEATURE_UNAVAILABLE ); +#endif +} + +#endif + +#endif diff --git a/Externals/polarssl/library/x509write.c b/Externals/polarssl/library/x509write.c new file mode 100644 index 0000000000..9f5a91009b --- /dev/null +++ b/Externals/polarssl/library/x509write.c @@ -0,0 +1,285 @@ +/* + * X509 buffer writing functionality + * + * Copyright (C) 2006-2012, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_X509_WRITE_C) + +#include "polarssl/asn1write.h" +#include "polarssl/x509write.h" +#include "polarssl/x509.h" +#include "polarssl/sha1.h" +#include "polarssl/sha2.h" +#include "polarssl/sha4.h" +#include "polarssl/md4.h" +#include "polarssl/md5.h" + +int x509_write_pubkey_der( unsigned char *buf, size_t size, rsa_context *rsa ) +{ + int ret; + unsigned char *c; + size_t len = 0; + + c = buf + size - 1; + + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->E ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->N ) ); + + ASN1_CHK_ADD( len, asn1_write_len( &c, buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + if( c - buf < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--c = 0; + len += 1; + + ASN1_CHK_ADD( len, asn1_write_len( &c, buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, buf, ASN1_BIT_STRING ) ); + + ASN1_CHK_ADD( len, asn1_write_algorithm_identifier( &c, buf, OID_PKCS1_RSA ) ); + + ASN1_CHK_ADD( len, asn1_write_len( &c, buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + return( len ); +} + +int x509_write_key_der( unsigned char *buf, size_t size, rsa_context *rsa ) +{ + int ret; + unsigned char *c; + size_t len = 0; + + c = buf + size - 1; + + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->QP ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->DQ ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->DP ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->Q ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->P ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->D ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->E ) ); + ASN1_CHK_ADD( len, asn1_write_mpi( &c, buf, &rsa->N ) ); + ASN1_CHK_ADD( len, asn1_write_int( &c, buf, 0 ) ); + + ASN1_CHK_ADD( len, asn1_write_len( &c, buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + // TODO: Make NON RSA Specific variant later on +/* *--c = 0; + len += 1; + + len += asn1_write_len( &c, len); + len += asn1_write_tag( &c, ASN1_BIT_STRING ); + + len += asn1_write_oid( &c, OID_PKCS1_RSA ); + + len += asn1_write_int( &c, 0 ); + + len += asn1_write_len( &c, len); + len += asn1_write_tag( &c, ASN1_CONSTRUCTED | ASN1_SEQUENCE );*/ + +/* for(i = 0; i < len; ++i) + { + if (i % 16 == 0 ) printf("\n"); + printf("%02x ", c[i]); + } + printf("\n");*/ + + return( len ); +} + +int x509_write_name( unsigned char **p, unsigned char *start, char *oid, + char *name ) +{ + int ret; + size_t string_len = 0; + size_t oid_len = 0; + size_t len = 0; + + // Write PrintableString for all except OID_PKCS9_EMAIL + // + if( OID_SIZE( OID_PKCS9_EMAIL ) == strlen( oid ) && + memcmp( oid, OID_PKCS9_EMAIL, strlen( oid ) ) == 0 ) + { + ASN1_CHK_ADD( string_len, asn1_write_ia5_string( p, start, name ) ); + } + else + ASN1_CHK_ADD( string_len, asn1_write_printable_string( p, start, name ) ); + + // Write OID + // + ASN1_CHK_ADD( oid_len, asn1_write_oid( p, start, oid ) ); + + len = oid_len + string_len; + ASN1_CHK_ADD( len, asn1_write_len( p, start, oid_len + string_len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_CONSTRUCTED | ASN1_SET ) ); + + return( len ); +} + +/* + * Wrapper for x509 hashes. + */ +static void x509_hash( const unsigned char *in, size_t len, int alg, + unsigned char *out ) +{ + switch( alg ) + { +#if defined(POLARSSL_MD2_C) + case SIG_RSA_MD2 : md2( in, len, out ); break; +#endif +#if defined(POLARSSL_MD4_C) + case SIG_RSA_MD4 : md4( in, len, out ); break; +#endif +#if defined(POLARSSL_MD5_C) + case SIG_RSA_MD5 : md5( in, len, out ); break; +#endif +#if defined(POLARSSL_SHA1_C) + case SIG_RSA_SHA1 : sha1( in, len, out ); break; +#endif +#if defined(POLARSSL_SHA2_C) + case SIG_RSA_SHA224 : sha2( in, len, out, 1 ); break; + case SIG_RSA_SHA256 : sha2( in, len, out, 0 ); break; +#endif +#if defined(POLARSSL_SHA4_C) + case SIG_RSA_SHA384 : sha4( in, len, out, 1 ); break; + case SIG_RSA_SHA512 : sha4( in, len, out, 0 ); break; +#endif + default: + memset( out, '\xFF', 64 ); + break; + } +} + +int x509_write_sig( unsigned char **p, unsigned char *start, char *oid, + unsigned char *sig, size_t size ) +{ + int ret; + size_t len = 0; + + if( *p - start < (int) size + 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + len = size; + (*p) -= len; + memcpy( *p, sig, len ); + + *--(*p) = 0; + len += 1; + + ASN1_CHK_ADD( len, asn1_write_len( p, start, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( p, start, ASN1_BIT_STRING ) ); + + // Write OID + // + ASN1_CHK_ADD( len, asn1_write_algorithm_identifier( p, start, oid ) ); + + return( len ); +} + +int x509_write_cert_req( unsigned char *buf, size_t size, rsa_context *rsa, + x509_req_name *req_name, int hash_id ) +{ + int ret; + char sig_oid[10]; + unsigned char *c, *c2; + unsigned char hash[64]; + unsigned char sig[POLARSSL_MPI_MAX_SIZE]; + unsigned char tmp_buf[2048]; + size_t sub_len = 0, pub_len = 0, sig_len = 0; + size_t len = 0; + x509_req_name *cur = req_name; + + c = tmp_buf + 2048 - 1; + + ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, 0 ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED | ASN1_CONTEXT_SPECIFIC ) ); + + ASN1_CHK_ADD( pub_len, asn1_write_mpi( &c, tmp_buf, &rsa->E ) ); + ASN1_CHK_ADD( pub_len, asn1_write_mpi( &c, tmp_buf, &rsa->N ) ); + + ASN1_CHK_ADD( pub_len, asn1_write_len( &c, tmp_buf, pub_len ) ); + ASN1_CHK_ADD( pub_len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + if( c - tmp_buf < 1 ) + return( POLARSSL_ERR_ASN1_BUF_TOO_SMALL ); + + *--c = 0; + pub_len += 1; + + ASN1_CHK_ADD( pub_len, asn1_write_len( &c, tmp_buf, pub_len ) ); + ASN1_CHK_ADD( pub_len, asn1_write_tag( &c, tmp_buf, ASN1_BIT_STRING ) ); + + ASN1_CHK_ADD( pub_len, asn1_write_algorithm_identifier( &c, tmp_buf, OID_PKCS1_RSA ) ); + + len += pub_len; + ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, pub_len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + while( cur != NULL ) + { + ASN1_CHK_ADD( sub_len, x509_write_name( &c, tmp_buf, cur->oid, cur->name ) ); + + cur = cur->next; + } + + len += sub_len; + ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, sub_len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + ASN1_CHK_ADD( len, asn1_write_int( &c, tmp_buf, 0 ) ); + + ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + x509_hash( c, len, hash_id, hash ); + + rsa_pkcs1_sign( rsa, NULL, NULL, RSA_PRIVATE, hash_id, 0, hash, sig ); + + // Generate correct OID + // + memcpy( sig_oid, OID_PKCS1, 8 ); + sig_oid[8] = hash_id; + sig_oid[9] = '\0'; + + c2 = buf + size - 1; + ASN1_CHK_ADD( sig_len, x509_write_sig( &c2, buf, sig_oid, sig, rsa->len ) ); + + c2 -= len; + memcpy( c2, c, len ); + + len += sig_len; + ASN1_CHK_ADD( len, asn1_write_len( &c2, buf, len ) ); + ASN1_CHK_ADD( len, asn1_write_tag( &c2, buf, ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ); + + return( len ); +} + +#endif diff --git a/Externals/polarssl/library/xtea.c b/Externals/polarssl/library/xtea.c new file mode 100644 index 0000000000..f8ab014f9a --- /dev/null +++ b/Externals/polarssl/library/xtea.c @@ -0,0 +1,251 @@ +/* + * An 32-bit implementation of the XTEA algorithm + * + * Copyright (C) 2006-2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_XTEA_C) + +#include "polarssl/xtea.h" + +#if !defined(POLARSSL_XTEA_ALT) + +/* + * 32-bit integer manipulation macros (big endian) + */ +#ifndef GET_UINT32_BE +#define GET_UINT32_BE(n,b,i) \ +{ \ + (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ + | ( (uint32_t) (b)[(i) + 1] << 16 ) \ + | ( (uint32_t) (b)[(i) + 2] << 8 ) \ + | ( (uint32_t) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_UINT32_BE +#define PUT_UINT32_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +/* + * XTEA key schedule + */ +void xtea_setup( xtea_context *ctx, unsigned char key[16] ) +{ + int i; + + memset(ctx, 0, sizeof(xtea_context)); + + for( i = 0; i < 4; i++ ) + { + GET_UINT32_BE( ctx->k[i], key, i << 2 ); + } +} + +/* + * XTEA encrypt function + */ +int xtea_crypt_ecb( xtea_context *ctx, int mode, unsigned char input[8], + unsigned char output[8]) +{ + uint32_t *k, v0, v1, i; + + k = ctx->k; + + GET_UINT32_BE( v0, input, 0 ); + GET_UINT32_BE( v1, input, 4 ); + + if( mode == XTEA_ENCRYPT ) + { + uint32_t sum = 0, delta = 0x9E3779B9; + + for( i = 0; i < 32; i++ ) + { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); + } + } + else /* XTEA_DECRYPT */ + { + uint32_t delta = 0x9E3779B9, sum = delta * 32; + + for( i = 0; i < 32; i++ ) + { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); + } + } + + PUT_UINT32_BE( v0, output, 0 ); + PUT_UINT32_BE( v1, output, 4 ); + + return( 0 ); +} + +/* + * XTEA-CBC buffer encryption/decryption + */ +int xtea_crypt_cbc( xtea_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + unsigned char *input, + unsigned char *output) +{ + int i; + unsigned char temp[8]; + + if(length % 8) + return( POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH ); + + if( mode == XTEA_DECRYPT ) + { + while( length > 0 ) + { + memcpy( temp, input, 8 ); + xtea_crypt_ecb( ctx, mode, input, output ); + + for(i = 0; i < 8; i++) + output[i] = (unsigned char)( output[i] ^ iv[i] ); + + memcpy( iv, temp, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + else + { + while( length > 0 ) + { + for( i = 0; i < 8; i++ ) + output[i] = (unsigned char)( input[i] ^ iv[i] ); + + xtea_crypt_ecb( ctx, mode, output, output ); + memcpy( iv, output, 8 ); + + input += 8; + output += 8; + length -= 8; + } + } + + return( 0 ); +} +#endif /* !POLARSSL_XTEA_ALT */ + +#if defined(POLARSSL_SELF_TEST) + +#include +#include + +/* + * XTEA tests vectors (non-official) + */ + +static const unsigned char xtea_test_key[6][16] = +{ + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char xtea_test_pt[6][8] = +{ + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f }, + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 } +}; + +static const unsigned char xtea_test_ct[6][8] = +{ + { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 }, + { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 }, + { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } +}; + +/* + * Checkup routine + */ +int xtea_self_test( int verbose ) +{ + int i; + unsigned char buf[8]; + xtea_context ctx; + + for( i = 0; i < 6; i++ ) + { + if( verbose != 0 ) + printf( " XTEA test #%d: ", i + 1 ); + + memcpy( buf, xtea_test_pt[i], 8 ); + + xtea_setup( &ctx, (unsigned char *) xtea_test_key[i] ); + xtea_crypt_ecb( &ctx, XTEA_ENCRYPT, buf, buf ); + + if( memcmp( buf, xtea_test_ct[i], 8 ) != 0 ) + { + if( verbose != 0 ) + printf( "failed\n" ); + + return( 1 ); + } + + if( verbose != 0 ) + printf( "passed\n" ); + } + + if( verbose != 0 ) + printf( "\n" ); + + return( 0 ); +} + +#endif + +#endif diff --git a/Externals/polarssl/visualc/PolarSSL.vcxproj b/Externals/polarssl/visualc/PolarSSL.vcxproj new file mode 100644 index 0000000000..26eed64a3a --- /dev/null +++ b/Externals/polarssl/visualc/PolarSSL.vcxproj @@ -0,0 +1,97 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BDB6578B-0691-4E80-A46C-DF21639FD3B8} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/PolarSSL.sln b/Externals/polarssl/visualc/VS2010/PolarSSL.sln new file mode 100644 index 0000000000..234c80ff5f --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/PolarSSL.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolarSSL", "PolarSSL.vcxproj", "{46CF2D25-6A36-4189-B59C-E4815388E554}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|Win32.ActiveCfg = Debug|Win32 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|Win32.Build.0 = Debug|Win32 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|x64.ActiveCfg = Debug|x64 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|x64.Build.0 = Debug|x64 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Release|Win32.ActiveCfg = Release|Win32 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Release|Win32.Build.0 = Release|Win32 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Release|x64.ActiveCfg = Release|x64 + {46CF2D25-6A36-4189-B59C-E4815388E554}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Externals/polarssl/visualc/VS2010/PolarSSL.vcxproj b/Externals/polarssl/visualc/VS2010/PolarSSL.vcxproj new file mode 100644 index 0000000000..25e09cc48b --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/PolarSSL.vcxproj @@ -0,0 +1,313 @@ + + + + + DebugFast + Win32 + + + DebugFast + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {46CF2D25-6A36-4189-B59C-E4815388E554} + Win32Proj + PolarSSL + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + true + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + true + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + true + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + true + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + false + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + false + $(ProjectDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + CompileAsC + MultiThreadedDebug + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + CompileAsC + MultiThreadedDebug + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + CompileAsC + MultiThreadedDebug + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + CompileAsC + MultiThreadedDebug + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + MultiThreaded + false + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_WINDOWS;_USRDLL;POLARSSL_EXPORTS;%(PreprocessorDefinitions) + ../../include + MultiThreaded + false + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/aescrypt2.vcxproj b/Externals/polarssl/visualc/VS2010/aescrypt2.vcxproj new file mode 100644 index 0000000000..d4997ddfea --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/aescrypt2.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {54880004-9AA2-434D-A2F0-7F59D6F1536A} + Win32Proj + aescrypt2 + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/benchmark.vcxproj b/Externals/polarssl/visualc/VS2010/benchmark.vcxproj new file mode 100644 index 0000000000..524203d8a1 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/benchmark.vcxproj @@ -0,0 +1,161 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F52B9FFC-0E87-4816-BB2D-711CFC1E8955} + Win32Proj + benchmark + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + Debug + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + Debug + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/crypt_and_hash.vcxproj b/Externals/polarssl/visualc/VS2010/crypt_and_hash.vcxproj new file mode 100644 index 0000000000..fa6864b608 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/crypt_and_hash.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {B9CD06FA-D063-4AFE-BF05-1348142274D7} + Win32Proj + crypt_and_hash + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/dh_client.vcxproj b/Externals/polarssl/visualc/VS2010/dh_client.vcxproj new file mode 100644 index 0000000000..76e17147b3 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/dh_client.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {E3F6459F-183D-4604-8A42-3F1C84A7C119} + Win32Proj + dh_client + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/dh_genprime.vcxproj b/Externals/polarssl/visualc/VS2010/dh_genprime.vcxproj new file mode 100644 index 0000000000..94caa91af4 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/dh_genprime.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {83BCC55C-5216-41BD-865B-E38FAB399454} + Win32Proj + dh_genprime + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/dh_server.vcxproj b/Externals/polarssl/visualc/VS2010/dh_server.vcxproj new file mode 100644 index 0000000000..017923d509 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/dh_server.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {17D1A1DA-6803-4AA1-A0DB-566E00D7593C} + Win32Proj + dh_server + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/gen_random_ctr_drbg.vcxproj b/Externals/polarssl/visualc/VS2010/gen_random_ctr_drbg.vcxproj new file mode 100644 index 0000000000..8fedf84e5c --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/gen_random_ctr_drbg.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {316E338C-6DC1-4D11-81C1-91F20E92AB04} + Win32Proj + gen_random_ctr_drbg + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/gen_random_havege.vcxproj b/Externals/polarssl/visualc/VS2010/gen_random_havege.vcxproj new file mode 100644 index 0000000000..eddec1b369 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/gen_random_havege.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {CFA36CC7-515C-4E18-8F8F-5B56AB903352} + Win32Proj + gen_random_havege + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + diff --git a/Externals/polarssl/visualc/VS2010/generic_sum.vcxproj b/Externals/polarssl/visualc/VS2010/generic_sum.vcxproj new file mode 100644 index 0000000000..6f09edf508 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/generic_sum.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {BE21679A-D26E-4A26-BC4F-382F57A33480} + Win32Proj + generic_sum + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/md5sum.vcxproj b/Externals/polarssl/visualc/VS2010/md5sum.vcxproj new file mode 100644 index 0000000000..1c8627a67c --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/md5sum.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {7FEC406E-95C5-4CC7-9CE7-8EA014AF5E15} + Win32Proj + md5sum + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/mpi_demo.vcxproj b/Externals/polarssl/visualc/VS2010/mpi_demo.vcxproj new file mode 100644 index 0000000000..9fab471b5a --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/mpi_demo.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {E6999C98-6F20-4ED8-A791-69930800728F} + Win32Proj + mpi_demo + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/rsa_genkey.vcxproj b/Externals/polarssl/visualc/VS2010/rsa_genkey.vcxproj new file mode 100644 index 0000000000..54bf0cb9fb --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/rsa_genkey.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {914C3FB6-43A6-4FB6-875C-870DF0553035} + Win32Proj + rsa_genkey + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/rsa_sign.vcxproj b/Externals/polarssl/visualc/VS2010/rsa_sign.vcxproj new file mode 100644 index 0000000000..cdfdb5705b --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/rsa_sign.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {27FA2978-988C-4918-AF10-FC9613B66CDB} + Win32Proj + rsa_sign + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/rsa_sign_pss.vcxproj b/Externals/polarssl/visualc/VS2010/rsa_sign_pss.vcxproj new file mode 100644 index 0000000000..9d6ea34ddf --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/rsa_sign_pss.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {FAAA2021-DF20-436F-AE12-9AD91C34C0B4} + Win32Proj + rsa_sign_pss + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/rsa_verify.vcxproj b/Externals/polarssl/visualc/VS2010/rsa_verify.vcxproj new file mode 100644 index 0000000000..d26f7975d9 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/rsa_verify.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {4485C157-39E7-4A97-93DC-80F794E37450} + Win32Proj + dh_client + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/rsa_verify_pss.vcxproj b/Externals/polarssl/visualc/VS2010/rsa_verify_pss.vcxproj new file mode 100644 index 0000000000..1ee36ed32f --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/rsa_verify_pss.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {22142D77-6986-4C71-8386-0184A8E7A1E6} + Win32Proj + rsa_verify_pss + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/selftest.vcxproj b/Externals/polarssl/visualc/VS2010/selftest.vcxproj new file mode 100644 index 0000000000..a56642a94e --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/selftest.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {4B44D0A4-DE85-4C15-A1FF-A334C0A1EFF2} + Win32Proj + selftest + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/sha1sum.vcxproj b/Externals/polarssl/visualc/VS2010/sha1sum.vcxproj new file mode 100644 index 0000000000..4c56f3f7f3 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/sha1sum.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {15F21E24-7810-4B51-AF44-69F9062E35A0} + Win32Proj + sha1sum + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/sha2sum.vcxproj b/Externals/polarssl/visualc/VS2010/sha2sum.vcxproj new file mode 100644 index 0000000000..f964fb92cb --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/sha2sum.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {97A7EBB4-A76D-40CA-8E30-C10F2EB0B324} + Win32Proj + sha2sum + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/ssl_client1.vcxproj b/Externals/polarssl/visualc/VS2010/ssl_client1.vcxproj new file mode 100644 index 0000000000..86ada1bda3 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/ssl_client1.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {E0DC7623-13A7-48DF-A42F-8585FA533894} + Win32Proj + ssl_client1 + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/ssl_client2.vcxproj b/Externals/polarssl/visualc/VS2010/ssl_client2.vcxproj new file mode 100644 index 0000000000..ec77e0e23f --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/ssl_client2.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {6418ABBB-6D56-4D26-A7E8-69A47B61F7EB} + Win32Proj + ssl_client2 + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/polarssl/visualc/VS2010/ssl_server.vcxproj b/Externals/polarssl/visualc/VS2010/ssl_server.vcxproj new file mode 100644 index 0000000000..badf92ed89 --- /dev/null +++ b/Externals/polarssl/visualc/VS2010/ssl_server.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + {46cf2d25-6a36-4189-b59c-e4815388e554} + + + + {EDF3B291-9D85-49EC-8CF4-27EA9096BCCB} + Win32Proj + ssl_server + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + NotSet + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + Debug + + + false + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);PolarSSL.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ../../include + + + Console + true + true + true + Release + %(AdditionalDependencies); + + + + + + \ No newline at end of file diff --git a/Externals/portaudio/Win32/Debug/portaudio.lib b/Externals/portaudio/Win32/Debug/portaudio.lib deleted file mode 100644 index 058b3c404c..0000000000 Binary files a/Externals/portaudio/Win32/Debug/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/Win32/Debug/portaudio.pdb b/Externals/portaudio/Win32/Debug/portaudio.pdb deleted file mode 100644 index c9269f2c5d..0000000000 Binary files a/Externals/portaudio/Win32/Debug/portaudio.pdb and /dev/null differ diff --git a/Externals/portaudio/Win32/DebugFast/portaudio.lib b/Externals/portaudio/Win32/DebugFast/portaudio.lib deleted file mode 100644 index 30874d6f05..0000000000 Binary files a/Externals/portaudio/Win32/DebugFast/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/Win32/DebugFast/portaudio.pdb b/Externals/portaudio/Win32/DebugFast/portaudio.pdb deleted file mode 100644 index 12415be92d..0000000000 Binary files a/Externals/portaudio/Win32/DebugFast/portaudio.pdb and /dev/null differ diff --git a/Externals/portaudio/Win32/Release/portaudio.lib b/Externals/portaudio/Win32/Release/portaudio.lib deleted file mode 100644 index 30874d6f05..0000000000 Binary files a/Externals/portaudio/Win32/Release/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/Win32/Release/portaudio.pdb b/Externals/portaudio/Win32/Release/portaudio.pdb deleted file mode 100644 index 12415be92d..0000000000 Binary files a/Externals/portaudio/Win32/Release/portaudio.pdb and /dev/null differ diff --git a/Externals/portaudio/build/dolphin-notes.txt b/Externals/portaudio/build/dolphin-notes.txt new file mode 100644 index 0000000000..b6d3707a69 --- /dev/null +++ b/Externals/portaudio/build/dolphin-notes.txt @@ -0,0 +1,6 @@ +This directory contains the Visual Studio project files which are used to build portaudio. +* portaudio's files were very old and messy +* Makes it easier to update portaudio in the future +* Uses dolphin's VSProps, so we know it's properly compatible + +See full portaudio distribution for instructions about building and using portaudio. diff --git a/Externals/portaudio/build/portaudio.vcxproj b/Externals/portaudio/build/portaudio.vcxproj new file mode 100644 index 0000000000..823ce889f1 --- /dev/null +++ b/Externals/portaudio/build/portaudio.vcxproj @@ -0,0 +1,87 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0A18A071-125E-442F-AFF7-A3F68ABECF99} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + ..\src\common;..\include;.\;..\src\os\win;%(AdditionalIncludeDirectories) + PA_WDMKS_NO_KSGUID_LIB;PA_USE_ASIO=0;PA_USE_DS=0;PA_USE_WMME=1;PA_USE_WASAPI=1;PA_USE_WDMKS=0;PA_ENABLE_DEBUG_OUTPUT;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Externals/portaudio/build/portaudio.vcxproj.filters b/Externals/portaudio/build/portaudio.vcxproj.filters new file mode 100644 index 0000000000..1774a1ea02 --- /dev/null +++ b/Externals/portaudio/build/portaudio.vcxproj.filters @@ -0,0 +1,125 @@ + + + + + {69112e69-92e4-40c1-aa5b-e4c4780ade42} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {ddf0cf9b-f2df-4549-a447-8d7c4c2128d7} + + + {219121eb-0c81-4948-a94c-6802cf152776} + + + {17688226-7728-4556-83a7-8e85b561ccca} + + + {520ee766-8582-402e-a935-bdbcaa0d44de} + + + {3891bf2e-9681-4394-be07-88e0a3fd2a68} + + + {16791044-a8a5-4f21-b032-08245e52777a} + + + {bde5e4fb-71f2-4cdf-8879-5370d0e12697} + + + {f1e8b583-742d-46a2-ac7f-060aabdc3a2c} + + + {d8832c7e-2dd0-48e7-8227-23b0d04c1879} + h;hpp;hxx;hm;inl + + + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\common + + + Source Files\hostapi\dsound + + + Source Files\hostapi\dsound + + + Source Files\hostapi\wmme + + + Source Files\hostapi\wasapi + + + Source Files\hostapi\wdmks + + + Source Files\os\win + + + Source Files\os\win + + + Source Files\os\win + + + Source Files\os\win + + + Source Files\os\win + + + Source Files\os\win + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/Externals/portaudio/src/SConscript b/Externals/portaudio/src/SConscript new file mode 100644 index 0000000000..5cc915216d --- /dev/null +++ b/Externals/portaudio/src/SConscript @@ -0,0 +1,220 @@ +import os.path, copy, sys + +def checkSymbol(conf, header, library=None, symbol=None, autoAdd=True, critical=False, pkgName=None): + """ Check for symbol in library, optionally look only for header. + @param conf: Configure instance. + @param header: The header file where the symbol is declared. + @param library: The library in which the symbol exists, if None it is taken to be the standard C library. + @param symbol: The symbol to look for, if None only the header will be looked up. + @param autoAdd: Automatically link with this library if check is positive. + @param critical: Raise on error? + @param pkgName: Optional name of pkg-config entry for library, to determine build parameters. + @return: True/False + """ + origEnv = conf.env.Copy() # Copy unmodified environment so we can restore it upon error + env = conf.env + if library is None: + library = "c" # Standard library + autoAdd = False + + if pkgName is not None: + origLibs = copy.copy(env.get("LIBS", None)) + + try: env.ParseConfig("pkg-config --silence-errors %s --cflags --libs" % pkgName) + except: pass + else: + # I see no other way of checking that the parsing succeeded, if it did add no more linking parameters + if env.get("LIBS", None) != origLibs: + autoAdd = False + + try: + if not conf.CheckCHeader(header, include_quotes="<>"): + raise ConfigurationError("missing header %s" % header) + if symbol is not None and not conf.CheckLib(library, symbol, language="C", autoadd=autoAdd): + raise ConfigurationError("missing symbol %s in library %s" % (symbol, library)) + except ConfigurationError: + conf.env = origEnv + if not critical: + return False + raise + + return True + +import SCons.Errors + +# Import common variables + +# Could use '#' to refer to top-level SConstruct directory, but looks like env.SConsignFile doesn't interpret this at least :( +sconsDir = os.path.abspath(os.path.join("build", "scons")) + +try: + Import("Platform", "Posix", "ConfigurationError", "ApiVer") +except SCons.Errors.UserError: + # The common objects must be exported first + SConscript(os.path.join(sconsDir, "SConscript_common")) + Import("Platform", "Posix", "ConfigurationError", "ApiVer") + +Import("env") + +# This will be manipulated +env = env.Copy() + +# We operate with a set of needed libraries and optional libraries, the latter stemming from host API implementations. +# For libraries of both types we record a set of values that is used to look for the library in question, during +# configuration. If the corresponding library for a host API implementation isn't found, the implementation is left out. +neededLibs = [] +optionalImpls = {} +if Platform in Posix: + env.Append(CPPPATH=os.path.join("os", "unix")) + neededLibs += [("pthread", "pthread.h", "pthread_create"), ("m", "math.h", "sin")] + if env["useALSA"]: + optionalImpls["ALSA"] = ("asound", "alsa/asoundlib.h", "snd_pcm_open") + if env["useJACK"]: + optionalImpls["JACK"] = ("jack", "jack/jack.h", "jack_client_new") + if env["useOSS"]: + # TODO: It looks like the prefix for soundcard.h depends on the platform + optionalImpls["OSS"] = ("oss", "sys/soundcard.h", None) + if Platform == 'netbsd': + optionalImpls["OSS"] = ("ossaudio", "sys/soundcard.h", "_oss_ioctl") + if env["useASIHPI"]: + optionalImpls["ASIHPI"] = ("hpi", "asihpi/hpi.h", "HPI_SubSysCreate") + if env["useCOREAUDIO"]: + optionalImpls["COREAUDIO"] = ("CoreAudio", "CoreAudio/CoreAudio.h", None) +else: + raise ConfigurationError("unknown platform %s" % Platform) + +if Platform == "darwin": + env.Append(LINKFLAGS="-framework CoreFoundation -framework CoreServices -framework CoreAudio -framework AudioToolBox -framework AudioUnit") +elif Platform == "cygwin": + env.Append(LIBS=["winmm"]) +elif Platform == "irix": + neededLibs += [("audio", "dmedia/audio.h", "alOpenPort"), ("dmedia", "dmedia/dmedia.h", "dmGetUST")] + env.Append(CPPDEFINES=["PA_USE_SGI"]) + +def CheckCTypeSize(context, tp): + """ Check size of C type. + @param context: A configuration context. + @param tp: The type to check. + @return: Size of type, in bytes. + """ + context.Message("Checking the size of C type %s..." % tp) + ret = context.TryRun(""" +#include + +int main() { + printf("%%d", sizeof(%s)); + return 0; +} +""" % tp, ".c") + if not ret[0]: + context.Result(" Couldn't obtain size of type %s!" % tp) + return None + + assert ret[1] + sz = int(ret[1]) + context.Result("%d" % sz) + return sz + +""" +if sys.byteorder == "little": + env.Append(CPPDEFINES=["PA_LITTLE_ENDIAN"]) +elif sys.byteorder == "big": + env.Append(CPPDEFINES=["PA_BIG_ENDIAN"]) +else: + raise ConfigurationError("unknown byte order: %s" % sys.byteorder) +""" +if env["enableDebugOutput"]: + env.Append(CPPDEFINES=["PA_ENABLE_DEBUG_OUTPUT"]) + +# Start configuration + +# Use an absolute path for conf_dir, otherwise it gets created both relative to current directory and build directory +conf = env.Configure(log_file=os.path.join(sconsDir, "sconf.log"), custom_tests={"CheckCTypeSize": CheckCTypeSize}, + conf_dir=os.path.join(sconsDir, ".sconf_temp")) +conf.env.Append(CPPDEFINES=["SIZEOF_SHORT=%d" % conf.CheckCTypeSize("short")]) +conf.env.Append(CPPDEFINES=["SIZEOF_INT=%d" % conf.CheckCTypeSize("int")]) +conf.env.Append(CPPDEFINES=["SIZEOF_LONG=%d" % conf.CheckCTypeSize("long")]) +if checkSymbol(conf, "time.h", "rt", "clock_gettime"): + conf.env.Append(CPPDEFINES=["HAVE_CLOCK_GETTIME"]) +if checkSymbol(conf, "time.h", symbol="nanosleep"): + conf.env.Append(CPPDEFINES=["HAVE_NANOSLEEP"]) +if conf.CheckCHeader("sys/soundcard.h"): + conf.env.Append(CPPDEFINES=["HAVE_SYS_SOUNDCARD_H"]) +if conf.CheckCHeader("linux/soundcard.h"): + conf.env.Append(CPPDEFINES=["HAVE_LINUX_SOUNDCARD_H"]) +if conf.CheckCHeader("machine/soundcard.h"): + conf.env.Append(CPPDEFINES=["HAVE_MACHINE_SOUNDCARD_H"]) + +# Look for needed libraries and link with them +for lib, hdr, sym in neededLibs: + checkSymbol(conf, hdr, lib, sym, critical=True) +# Look for host API libraries, if a library isn't found disable corresponding host API implementation. +for name, val in optionalImpls.items(): + lib, hdr, sym = val + if checkSymbol(conf, hdr, lib, sym, critical=False, pkgName=name.lower()): + conf.env.Append(CPPDEFINES=["PA_USE_%s=1" % name.upper()]) + else: + del optionalImpls[name] + +# Configuration finished +env = conf.Finish() + +# PA infrastructure +CommonSources = [os.path.join("common", f) for f in "pa_allocation.c pa_converters.c pa_cpuload.c pa_dither.c pa_front.c \ + pa_process.c pa_stream.c pa_trace.c pa_debugprint.c pa_ringbuffer.c".split()] +CommonSources.append(os.path.join("hostapi", "skeleton", "pa_hostapi_skeleton.c")) + +# Host APIs implementations +ImplSources = [] +if Platform in Posix: + ImplSources += [os.path.join("os", "unix", f) for f in "pa_unix_hostapis.c pa_unix_util.c".split()] + +if "ALSA" in optionalImpls: + ImplSources.append(os.path.join("hostapi", "alsa", "pa_linux_alsa.c")) +if "JACK" in optionalImpls: + ImplSources.append(os.path.join("hostapi", "jack", "pa_jack.c")) +if "OSS" in optionalImpls: + ImplSources.append(os.path.join("hostapi", "oss", "pa_unix_oss.c")) +if "ASIHPI" in optionalImpls: + ImplSources.append(os.path.join("hostapi", "asihpi", "pa_linux_asihpi.c")) +if "COREAUDIO" in optionalImpls: + ImplSources.append([os.path.join("hostapi", "coreaudio", f) for f in """ + pa_mac_core.c pa_mac_core_blocking.c pa_mac_core_utilities.c + """.split()]) + + +sources = CommonSources + ImplSources + +sharedLibEnv = env.Copy() +if Platform in Posix: + # Add soname to library, this is so a reference is made to the versioned library in programs linking against libportaudio.so + if Platform != 'darwin': + sharedLibEnv.AppendUnique(SHLINKFLAGS="-Wl,-soname=libportaudio.so.%d" % int(ApiVer.split(".")[0])) +sharedLib = sharedLibEnv.SharedLibrary(target="portaudio", source=sources) + +staticLib = env.StaticLibrary(target="portaudio", source=sources) + +if Platform in Posix: + prefix = env["prefix"] + includeDir = os.path.join(prefix, "include") + libDir = os.path.join(prefix, "lib") + +testNames = ["patest_sine", "paqa_devs", "paqa_errs", "patest1", "patest_buffer", "patest_callbackstop", "patest_clip", \ + "patest_dither", "patest_hang", "patest_in_overflow", "patest_latency", "patest_leftright", "patest_longsine", \ + "patest_many", "patest_maxsines", "patest_multi_sine", "patest_out_underflow", "patest_pink", "patest_prime", \ + "patest_read_record", "patest_record", "patest_ringmix", "patest_saw", "patest_sine8", "patest_sine", \ + "patest_sine_time", "patest_start_stop", "patest_stop", "patest_sync", "patest_toomanysines", \ + "patest_underflow", "patest_wire", "patest_write_sine", "pa_devs", "pa_fuzz", "pa_minlat", \ + "patest_sine_channelmaps",] + +# The test directory ("bin") should be in the top-level PA directory +tests = [env.Program(target=os.path.join("#", "bin", name), source=[os.path.join("#", "test", name + ".c"), + staticLib]) for name in testNames] + +# Detect host APIs +hostApis = [] +for cppdef in env["CPPDEFINES"]: + if cppdef.startswith("PA_USE_"): + hostApis.append(cppdef[7:-2]) + +Return("sources", "sharedLib", "staticLib", "tests", "env", "hostApis") diff --git a/Externals/portaudio/src/common/pa_allocation.c b/Externals/portaudio/src/common/pa_allocation.c new file mode 100644 index 0000000000..c78c2cf7e2 --- /dev/null +++ b/Externals/portaudio/src/common/pa_allocation.c @@ -0,0 +1,243 @@ +/* + * $Id: pa_allocation.c 1097 2006-08-26 08:27:53Z rossb $ + * Portable Audio I/O Library allocation group implementation + * memory allocation group for tracking allocation groups + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Allocation Group implementation. +*/ + + +#include "pa_allocation.h" +#include "pa_util.h" + + +/* + Maintain 3 singly linked lists... + linkBlocks: the buffers used to allocate the links + spareLinks: links available for use in the allocations list + allocations: the buffers currently allocated using PaUtil_ContextAllocateMemory() + + Link block size is doubled every time new links are allocated. +*/ + + +#define PA_INITIAL_LINK_COUNT_ 16 + +struct PaUtilAllocationGroupLink +{ + struct PaUtilAllocationGroupLink *next; + void *buffer; +}; + +/* + Allocate a block of links. The first link will have it's buffer member + pointing to the block, and it's next member set to . The remaining + links will have NULL buffer members, and each link will point to + the next link except the last, which will point to +*/ +static struct PaUtilAllocationGroupLink *AllocateLinks( long count, + struct PaUtilAllocationGroupLink *nextBlock, + struct PaUtilAllocationGroupLink *nextSpare ) +{ + struct PaUtilAllocationGroupLink *result; + int i; + + result = (struct PaUtilAllocationGroupLink *)PaUtil_AllocateMemory( + sizeof(struct PaUtilAllocationGroupLink) * count ); + if( result ) + { + /* the block link */ + result[0].buffer = result; + result[0].next = nextBlock; + + /* the spare links */ + for( i=1; ilinkCount = PA_INITIAL_LINK_COUNT_; + result->linkBlocks = &links[0]; + result->spareLinks = &links[1]; + result->allocations = 0; + } + else + { + PaUtil_FreeMemory( links ); + } + } + + return result; +} + + +void PaUtil_DestroyAllocationGroup( PaUtilAllocationGroup* group ) +{ + struct PaUtilAllocationGroupLink *current = group->linkBlocks; + struct PaUtilAllocationGroupLink *next; + + while( current ) + { + next = current->next; + PaUtil_FreeMemory( current->buffer ); + current = next; + } + + PaUtil_FreeMemory( group ); +} + + +void* PaUtil_GroupAllocateMemory( PaUtilAllocationGroup* group, long size ) +{ + struct PaUtilAllocationGroupLink *links, *link; + void *result = 0; + + /* allocate more links if necessary */ + if( !group->spareLinks ) + { + /* double the link count on each block allocation */ + links = AllocateLinks( group->linkCount, group->linkBlocks, group->spareLinks ); + if( links ) + { + group->linkCount += group->linkCount; + group->linkBlocks = &links[0]; + group->spareLinks = &links[1]; + } + } + + if( group->spareLinks ) + { + result = PaUtil_AllocateMemory( size ); + if( result ) + { + link = group->spareLinks; + group->spareLinks = link->next; + + link->buffer = result; + link->next = group->allocations; + + group->allocations = link; + } + } + + return result; +} + + +void PaUtil_GroupFreeMemory( PaUtilAllocationGroup* group, void *buffer ) +{ + struct PaUtilAllocationGroupLink *current = group->allocations; + struct PaUtilAllocationGroupLink *previous = 0; + + if( buffer == 0 ) + return; + + /* find the right link and remove it */ + while( current ) + { + if( current->buffer == buffer ) + { + if( previous ) + { + previous->next = current->next; + } + else + { + group->allocations = current->next; + } + + current->buffer = 0; + current->next = group->spareLinks; + group->spareLinks = current; + + break; + } + + previous = current; + current = current->next; + } + + PaUtil_FreeMemory( buffer ); /* free the memory whether we found it in the list or not */ +} + + +void PaUtil_FreeAllAllocations( PaUtilAllocationGroup* group ) +{ + struct PaUtilAllocationGroupLink *current = group->allocations; + struct PaUtilAllocationGroupLink *previous = 0; + + /* free all buffers in the allocations list */ + while( current ) + { + PaUtil_FreeMemory( current->buffer ); + current->buffer = 0; + + previous = current; + current = current->next; + } + + /* link the former allocations list onto the front of the spareLinks list */ + if( previous ) + { + previous->next = group->spareLinks; + group->spareLinks = group->allocations; + group->allocations = 0; + } +} + diff --git a/Externals/portaudio/src/common/pa_allocation.h b/Externals/portaudio/src/common/pa_allocation.h new file mode 100644 index 0000000000..811dd72e0e --- /dev/null +++ b/Externals/portaudio/src/common/pa_allocation.h @@ -0,0 +1,104 @@ +#ifndef PA_ALLOCATION_H +#define PA_ALLOCATION_H +/* + * $Id: pa_allocation.h 1339 2008-02-15 07:50:33Z rossb $ + * Portable Audio I/O Library allocation context header + * memory allocation context for tracking allocation groups + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Allocation Group prototypes. An Allocation Group makes it easy to + allocate multiple blocks of memory and free them all at once. + + An allocation group is useful for keeping track of multiple blocks + of memory which are allocated at the same time (such as during initialization) + and need to be deallocated at the same time. The allocation group maintains + a list of allocated blocks, and can free all allocations at once. This + can be usefull for cleaning up after a partially initialized object fails. + + The allocation group implementation is built on top of the lower + level allocation functions defined in pa_util.h +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +typedef struct +{ + long linkCount; + struct PaUtilAllocationGroupLink *linkBlocks; + struct PaUtilAllocationGroupLink *spareLinks; + struct PaUtilAllocationGroupLink *allocations; +}PaUtilAllocationGroup; + + + +/** Create an allocation group. +*/ +PaUtilAllocationGroup* PaUtil_CreateAllocationGroup( void ); + +/** Destroy an allocation group, but not the memory allocated through the group. +*/ +void PaUtil_DestroyAllocationGroup( PaUtilAllocationGroup* group ); + +/** Allocate a block of memory though an allocation group. +*/ +void* PaUtil_GroupAllocateMemory( PaUtilAllocationGroup* group, long size ); + +/** Free a block of memory that was previously allocated though an allocation + group. Calling this function is a relatively time consuming operation. + Under normal circumstances clients should call PaUtil_FreeAllAllocations to + free all allocated blocks simultaneously. + @see PaUtil_FreeAllAllocations +*/ +void PaUtil_GroupFreeMemory( PaUtilAllocationGroup* group, void *buffer ); + +/** Free all blocks of memory which have been allocated through the allocation + group. This function doesn't destroy the group itself. +*/ +void PaUtil_FreeAllAllocations( PaUtilAllocationGroup* group ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_ALLOCATION_H */ diff --git a/Externals/portaudio/src/common/pa_converters.c b/Externals/portaudio/src/common/pa_converters.c new file mode 100644 index 0000000000..ef65b68a5c --- /dev/null +++ b/Externals/portaudio/src/common/pa_converters.c @@ -0,0 +1,1983 @@ +/* + * $Id: pa_converters.c 1748 2011-09-01 22:08:32Z philburk $ + * Portable Audio I/O Library sample conversion mechanism + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Conversion function implementations. + + If the C9x function lrintf() is available, define PA_USE_C99_LRINTF to use it + + @todo Consider whether functions which dither but don't clip should exist, + V18 automatically enabled clipping whenever dithering was selected. Perhaps + we should do the same. + see: "require clipping for dithering sample conversion functions?" + http://www.portaudio.com/trac/ticket/112 + + @todo implement the converters marked IMPLEMENT ME: Int32_To_Int24_Dither, + Int32_To_UInt8_Dither, Int24_To_Int16_Dither, Int24_To_Int8_Dither, + Int24_To_UInt8_Dither, Int16_To_Int8_Dither, Int16_To_UInt8_Dither + see: "some conversion functions are not implemented in pa_converters.c" + http://www.portaudio.com/trac/ticket/35 + + @todo review the converters marked REVIEW: Float32_To_Int32, + Float32_To_Int32_Dither, Float32_To_Int32_Clip, Float32_To_Int32_DitherClip, + Int32_To_Int16_Dither, Int32_To_Int8_Dither, Int16_To_Int32 +*/ + + +#include "pa_converters.h" +#include "pa_dither.h" +#include "pa_endianness.h" +#include "pa_types.h" + + +PaSampleFormat PaUtil_SelectClosestAvailableFormat( + PaSampleFormat availableFormats, PaSampleFormat format ) +{ + PaSampleFormat result; + + format &= ~paNonInterleaved; + availableFormats &= ~paNonInterleaved; + + if( (format & availableFormats) == 0 ) + { + /* NOTE: this code depends on the sample format constants being in + descending order of quality - ie best quality is 0 + FIXME: should write an assert which checks that all of the + known constants conform to that requirement. + */ + + if( format != 0x01 ) + { + /* scan for better formats */ + result = format; + do + { + result >>= 1; + } + while( (result & availableFormats) == 0 && result != 0 ); + } + else + { + result = 0; + } + + if( result == 0 ){ + /* scan for worse formats */ + result = format; + do + { + result <<= 1; + } + while( (result & availableFormats) == 0 && result != paCustomFormat ); + + if( (result & availableFormats) == 0 ) + result = paSampleFormatNotSupported; + } + + }else{ + result = format; + } + + return result; +} + +/* -------------------------------------------------------------------------- */ + +#define PA_SELECT_FORMAT_( format, float32, int32, int24, int16, int8, uint8 ) \ + switch( format & ~paNonInterleaved ){ \ + case paFloat32: \ + float32 \ + case paInt32: \ + int32 \ + case paInt24: \ + int24 \ + case paInt16: \ + int16 \ + case paInt8: \ + int8 \ + case paUInt8: \ + uint8 \ + default: return 0; \ + } + +/* -------------------------------------------------------------------------- */ + +#define PA_SELECT_CONVERTER_DITHER_CLIP_( flags, source, destination ) \ + if( flags & paClipOff ){ /* no clip */ \ + if( flags & paDitherOff ){ /* no dither */ \ + return paConverters. source ## _To_ ## destination; \ + }else{ /* dither */ \ + return paConverters. source ## _To_ ## destination ## _Dither; \ + } \ + }else{ /* clip */ \ + if( flags & paDitherOff ){ /* no dither */ \ + return paConverters. source ## _To_ ## destination ## _Clip; \ + }else{ /* dither */ \ + return paConverters. source ## _To_ ## destination ## _DitherClip; \ + } \ + } + +/* -------------------------------------------------------------------------- */ + +#define PA_SELECT_CONVERTER_DITHER_( flags, source, destination ) \ + if( flags & paDitherOff ){ /* no dither */ \ + return paConverters. source ## _To_ ## destination; \ + }else{ /* dither */ \ + return paConverters. source ## _To_ ## destination ## _Dither; \ + } + +/* -------------------------------------------------------------------------- */ + +#define PA_USE_CONVERTER_( source, destination )\ + return paConverters. source ## _To_ ## destination; + +/* -------------------------------------------------------------------------- */ + +#define PA_UNITY_CONVERSION_( wordlength )\ + return paConverters. Copy_ ## wordlength ## _To_ ## wordlength; + +/* -------------------------------------------------------------------------- */ + +PaUtilConverter* PaUtil_SelectConverter( PaSampleFormat sourceFormat, + PaSampleFormat destinationFormat, PaStreamFlags flags ) +{ + PA_SELECT_FORMAT_( sourceFormat, + /* paFloat32: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_UNITY_CONVERSION_( 32 ), + /* paInt32: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int32 ), + /* paInt24: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int24 ), + /* paInt16: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int16 ), + /* paInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int8 ), + /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, UInt8 ) + ), + /* paInt32: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_USE_CONVERTER_( Int32, Float32 ), + /* paInt32: */ PA_UNITY_CONVERSION_( 32 ), + /* paInt24: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int24 ), + /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int16 ), + /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int8 ), + /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, UInt8 ) + ), + /* paInt24: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_USE_CONVERTER_( Int24, Float32 ), + /* paInt32: */ PA_USE_CONVERTER_( Int24, Int32 ), + /* paInt24: */ PA_UNITY_CONVERSION_( 24 ), + /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int16 ), + /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int8 ), + /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, UInt8 ) + ), + /* paInt16: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_USE_CONVERTER_( Int16, Float32 ), + /* paInt32: */ PA_USE_CONVERTER_( Int16, Int32 ), + /* paInt24: */ PA_USE_CONVERTER_( Int16, Int24 ), + /* paInt16: */ PA_UNITY_CONVERSION_( 16 ), + /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, Int8 ), + /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, UInt8 ) + ), + /* paInt8: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_USE_CONVERTER_( Int8, Float32 ), + /* paInt32: */ PA_USE_CONVERTER_( Int8, Int32 ), + /* paInt24: */ PA_USE_CONVERTER_( Int8, Int24 ), + /* paInt16: */ PA_USE_CONVERTER_( Int8, Int16 ), + /* paInt8: */ PA_UNITY_CONVERSION_( 8 ), + /* paUInt8: */ PA_USE_CONVERTER_( Int8, UInt8 ) + ), + /* paUInt8: */ + PA_SELECT_FORMAT_( destinationFormat, + /* paFloat32: */ PA_USE_CONVERTER_( UInt8, Float32 ), + /* paInt32: */ PA_USE_CONVERTER_( UInt8, Int32 ), + /* paInt24: */ PA_USE_CONVERTER_( UInt8, Int24 ), + /* paInt16: */ PA_USE_CONVERTER_( UInt8, Int16 ), + /* paInt8: */ PA_USE_CONVERTER_( UInt8, Int8 ), + /* paUInt8: */ PA_UNITY_CONVERSION_( 8 ) + ) + ) +} + +/* -------------------------------------------------------------------------- */ + +#ifdef PA_NO_STANDARD_CONVERTERS + +/* -------------------------------------------------------------------------- */ + +PaUtilConverterTable paConverters = { + 0, /* PaUtilConverter *Float32_To_Int32; */ + 0, /* PaUtilConverter *Float32_To_Int32_Dither; */ + 0, /* PaUtilConverter *Float32_To_Int32_Clip; */ + 0, /* PaUtilConverter *Float32_To_Int32_DitherClip; */ + + 0, /* PaUtilConverter *Float32_To_Int24; */ + 0, /* PaUtilConverter *Float32_To_Int24_Dither; */ + 0, /* PaUtilConverter *Float32_To_Int24_Clip; */ + 0, /* PaUtilConverter *Float32_To_Int24_DitherClip; */ + + 0, /* PaUtilConverter *Float32_To_Int16; */ + 0, /* PaUtilConverter *Float32_To_Int16_Dither; */ + 0, /* PaUtilConverter *Float32_To_Int16_Clip; */ + 0, /* PaUtilConverter *Float32_To_Int16_DitherClip; */ + + 0, /* PaUtilConverter *Float32_To_Int8; */ + 0, /* PaUtilConverter *Float32_To_Int8_Dither; */ + 0, /* PaUtilConverter *Float32_To_Int8_Clip; */ + 0, /* PaUtilConverter *Float32_To_Int8_DitherClip; */ + + 0, /* PaUtilConverter *Float32_To_UInt8; */ + 0, /* PaUtilConverter *Float32_To_UInt8_Dither; */ + 0, /* PaUtilConverter *Float32_To_UInt8_Clip; */ + 0, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */ + + 0, /* PaUtilConverter *Int32_To_Float32; */ + 0, /* PaUtilConverter *Int32_To_Int24; */ + 0, /* PaUtilConverter *Int32_To_Int24_Dither; */ + 0, /* PaUtilConverter *Int32_To_Int16; */ + 0, /* PaUtilConverter *Int32_To_Int16_Dither; */ + 0, /* PaUtilConverter *Int32_To_Int8; */ + 0, /* PaUtilConverter *Int32_To_Int8_Dither; */ + 0, /* PaUtilConverter *Int32_To_UInt8; */ + 0, /* PaUtilConverter *Int32_To_UInt8_Dither; */ + + 0, /* PaUtilConverter *Int24_To_Float32; */ + 0, /* PaUtilConverter *Int24_To_Int32; */ + 0, /* PaUtilConverter *Int24_To_Int16; */ + 0, /* PaUtilConverter *Int24_To_Int16_Dither; */ + 0, /* PaUtilConverter *Int24_To_Int8; */ + 0, /* PaUtilConverter *Int24_To_Int8_Dither; */ + 0, /* PaUtilConverter *Int24_To_UInt8; */ + 0, /* PaUtilConverter *Int24_To_UInt8_Dither; */ + + 0, /* PaUtilConverter *Int16_To_Float32; */ + 0, /* PaUtilConverter *Int16_To_Int32; */ + 0, /* PaUtilConverter *Int16_To_Int24; */ + 0, /* PaUtilConverter *Int16_To_Int8; */ + 0, /* PaUtilConverter *Int16_To_Int8_Dither; */ + 0, /* PaUtilConverter *Int16_To_UInt8; */ + 0, /* PaUtilConverter *Int16_To_UInt8_Dither; */ + + 0, /* PaUtilConverter *Int8_To_Float32; */ + 0, /* PaUtilConverter *Int8_To_Int32; */ + 0, /* PaUtilConverter *Int8_To_Int24 */ + 0, /* PaUtilConverter *Int8_To_Int16; */ + 0, /* PaUtilConverter *Int8_To_UInt8; */ + + 0, /* PaUtilConverter *UInt8_To_Float32; */ + 0, /* PaUtilConverter *UInt8_To_Int32; */ + 0, /* PaUtilConverter *UInt8_To_Int24; */ + 0, /* PaUtilConverter *UInt8_To_Int16; */ + 0, /* PaUtilConverter *UInt8_To_Int8; */ + + 0, /* PaUtilConverter *Copy_8_To_8; */ + 0, /* PaUtilConverter *Copy_16_To_16; */ + 0, /* PaUtilConverter *Copy_24_To_24; */ + 0 /* PaUtilConverter *Copy_32_To_32; */ +}; + +/* -------------------------------------------------------------------------- */ + +#else /* PA_NO_STANDARD_CONVERTERS is not defined */ + +/* -------------------------------------------------------------------------- */ + +#define PA_CLIP_( val, min, max )\ + { val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); } + + +static const float const_1_div_128_ = 1.0f / 128.0f; /* 8 bit multiplier */ + +static const float const_1_div_32768_ = 1.0f / 32768.f; /* 16 bit multiplier */ + +static const double const_1_div_2147483648_ = 1.0 / 2147483648.0; /* 32 bit multiplier */ + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* REVIEW */ +#ifdef PA_USE_C99_LRINTF + float scaled = *src * 0x7FFFFFFF; + *dest = lrintf(scaled-0.5f); +#else + double scaled = *src * 0x7FFFFFFF; + *dest = (PaInt32) scaled; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + + while( count-- ) + { + /* REVIEW */ +#ifdef PA_USE_C99_LRINTF + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = ((float)*src * (2147483646.0f)) + dither; + *dest = lrintf(dithered - 0.5f); +#else + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + double dithered = ((double)*src * (2147483646.0)) + dither; + *dest = (PaInt32) dithered; +#endif + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* REVIEW */ +#ifdef PA_USE_C99_LRINTF + float scaled = *src * 0x7FFFFFFF; + PA_CLIP_( scaled, -2147483648.f, 2147483647.f ); + *dest = lrintf(scaled-0.5f); +#else + double scaled = *src * 0x7FFFFFFF; + PA_CLIP_( scaled, -2147483648., 2147483647. ); + *dest = (PaInt32) scaled; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + + while( count-- ) + { + /* REVIEW */ +#ifdef PA_USE_C99_LRINTF + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = ((float)*src * (2147483646.0f)) + dither; + PA_CLIP_( dithered, -2147483648.f, 2147483647.f ); + *dest = lrintf(dithered-0.5f); +#else + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + double dithered = ((double)*src * (2147483646.0)) + dither; + PA_CLIP_( dithered, -2147483648., 2147483647. ); + *dest = (PaInt32) dithered; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + PaInt32 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* convert to 32 bit and drop the low 8 bits */ + double scaled = (double)(*src) * 2147483647.0; + temp = (PaInt32) scaled; + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(temp >> 24); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 8); +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + PaInt32 temp; + + while( count-- ) + { + /* convert to 32 bit and drop the low 8 bits */ + + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + double dithered = ((double)*src * (2147483646.0)) + dither; + + temp = (PaInt32) dithered; + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(temp >> 24); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 8); +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + PaInt32 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* convert to 32 bit and drop the low 8 bits */ + double scaled = *src * 0x7FFFFFFF; + PA_CLIP_( scaled, -2147483648., 2147483647. ); + temp = (PaInt32) scaled; + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(temp >> 24); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 8); +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + PaInt32 temp; + + while( count-- ) + { + /* convert to 32 bit and drop the low 8 bits */ + + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + double dithered = ((double)*src * (2147483646.0)) + dither; + PA_CLIP_( dithered, -2147483648., 2147483647. ); + + temp = (PaInt32) dithered; + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(temp >> 24); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 8); +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { +#ifdef PA_USE_C99_LRINTF + float tempf = (*src * (32767.0f)) ; + *dest = lrintf(tempf-0.5f); +#else + short samp = (short) (*src * (32767.0f)); + *dest = samp; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + + while( count-- ) + { + + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (32766.0f)) + dither; + +#ifdef PA_USE_C99_LRINTF + *dest = lrintf(dithered-0.5f); +#else + *dest = (PaInt16) dithered; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { +#ifdef PA_USE_C99_LRINTF + long samp = lrintf((*src * (32767.0f)) -0.5f); +#else + long samp = (PaInt32) (*src * (32767.0f)); +#endif + PA_CLIP_( samp, -0x8000, 0x7FFF ); + *dest = (PaInt16) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (32766.0f)) + dither; + PaInt32 samp = (PaInt32) dithered; + PA_CLIP_( samp, -0x8000, 0x7FFF ); +#ifdef PA_USE_C99_LRINTF + *dest = lrintf(samp-0.5f); +#else + *dest = (PaInt16) samp; +#endif + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + signed char samp = (signed char) (*src * (127.0f)); + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + + while( count-- ) + { + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (126.0f)) + dither; + PaInt32 samp = (PaInt32) dithered; + *dest = (signed char) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int8_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + PaInt32 samp = (PaInt32)(*src * (127.0f)); + PA_CLIP_( samp, -0x80, 0x7F ); + *dest = (signed char) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int8_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (126.0f)) + dither; + PaInt32 samp = (PaInt32) dithered; + PA_CLIP_( samp, -0x80, 0x7F ); + *dest = (signed char) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_UInt8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + unsigned char samp = (unsigned char)(128 + ((unsigned char) (*src * (127.0f)))); + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_UInt8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + + while( count-- ) + { + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (126.0f)) + dither; + PaInt32 samp = (PaInt32) dithered; + *dest = (unsigned char) (128 + samp); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_UInt8_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + PaInt32 samp = 128 + (PaInt32)(*src * (127.0f)); + PA_CLIP_( samp, 0x0000, 0x00FF ); + *dest = (unsigned char) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_UInt8_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + /* use smaller scaler to prevent overflow when we add the dither */ + float dithered = (*src * (126.0f)) + dither; + PaInt32 samp = 128 + (PaInt32) dithered; + PA_CLIP_( samp, 0x0000, 0x00FF ); + *dest = (unsigned char) samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Float32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + float *dest = (float*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = (float) ((double)*src * const_1_div_2147483648_); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* REVIEW */ +#if defined(PA_LITTLE_ENDIAN) + dest[0] = (unsigned char)(*src >> 8); + dest[1] = (unsigned char)(*src >> 16); + dest[2] = (unsigned char)(*src >> 24); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(*src >> 24); + dest[1] = (unsigned char)(*src >> 16); + dest[2] = (unsigned char)(*src >> 8); +#endif + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int24_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + (void) destinationBuffer; /* unused parameters */ + (void) destinationStride; /* unused parameters */ + (void) sourceBuffer; /* unused parameters */ + (void) sourceStride; /* unused parameters */ + (void) count; /* unused parameters */ + (void) ditherGenerator; /* unused parameters */ + /* IMPLEMENT ME */ +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = (PaInt16) ((*src) >> 16); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int16_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + PaInt32 dither; + + while( count-- ) + { + /* REVIEW */ + dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); + *dest = (PaInt16) ((((*src)>>1) + dither) >> 15); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = (signed char) ((*src) >> 24); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_Int8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + PaInt32 dither; + + while( count-- ) + { + /* REVIEW */ + dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); + *dest = (signed char) ((((*src)>>1) + dither) >> 23); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_UInt8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (unsigned char)(((*src) >> 24) + 128); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int32_To_UInt8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt32 *src = (PaInt32*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* IMPLEMENT ME */ + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Float32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + float *dest = (float*)destinationBuffer; + PaInt32 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + temp = (((PaInt32)src[0]) << 8); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 24); +#elif defined(PA_BIG_ENDIAN) + temp = (((PaInt32)src[0]) << 24); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 8); +#endif + + *dest = (float) ((double)temp * const_1_div_2147483648_); + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Int32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + PaInt32 *dest = (PaInt32*) destinationBuffer; + PaInt32 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + temp = (((PaInt32)src[0]) << 8); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 24); +#elif defined(PA_BIG_ENDIAN) + temp = (((PaInt32)src[0]) << 24); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 8); +#endif + + *dest = temp; + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + + PaInt16 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + /* src[0] is discarded */ + temp = (((PaInt16)src[1])); + temp = temp | (PaInt16)(((PaInt16)src[2]) << 8); +#elif defined(PA_BIG_ENDIAN) + /* src[2] is discarded */ + temp = (PaInt16)(((PaInt16)src[0]) << 8); + temp = temp | (((PaInt16)src[1])); +#endif + + *dest = temp; + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Int16_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + + PaInt32 temp, dither; + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + temp = (((PaInt32)src[0]) << 8); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 24); +#elif defined(PA_BIG_ENDIAN) + temp = (((PaInt32)src[0]) << 24); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 8); +#endif + + /* REVIEW */ + dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); + *dest = (PaInt16) (((temp >> 1) + dither) >> 15); + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Int8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + /* src[0] is discarded */ + /* src[1] is discarded */ + *dest = src[2]; +#elif defined(PA_BIG_ENDIAN) + /* src[2] is discarded */ + /* src[1] is discarded */ + *dest = src[0]; +#endif + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_Int8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + + PaInt32 temp, dither; + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + temp = (((PaInt32)src[0]) << 8); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 24); +#elif defined(PA_BIG_ENDIAN) + temp = (((PaInt32)src[0]) << 24); + temp = temp | (((PaInt32)src[1]) << 16); + temp = temp | (((PaInt32)src[2]) << 8); +#endif + + /* REVIEW */ + dither = PaUtil_Generate16BitTriangularDither( ditherGenerator ); + *dest = (signed char) (((temp >> 1) + dither) >> 23); + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_UInt8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + /* src[0] is discarded */ + /* src[1] is discarded */ + *dest = (unsigned char)(src[2] + 128); +#elif defined(PA_BIG_ENDIAN) + *dest = (unsigned char)(src[0] + 128); + /* src[1] is discarded */ + /* src[2] is discarded */ +#endif + + src += sourceStride * 3; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int24_To_UInt8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + (void) destinationBuffer; /* unused parameters */ + (void) destinationStride; /* unused parameters */ + (void) sourceBuffer; /* unused parameters */ + (void) sourceStride; /* unused parameters */ + (void) count; /* unused parameters */ + (void) ditherGenerator; /* unused parameters */ + /* IMPLEMENT ME */ +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_Float32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + float *dest = (float*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + float samp = *src * const_1_div_32768_; /* FIXME: i'm concerned about this being asymetrical with float->int16 -rb */ + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_Int32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* REVIEW: we should consider something like + (*src << 16) | (*src & 0xFFFF) + */ + + *dest = *src << 16; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*) sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + PaInt16 temp; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + temp = *src; + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = 0; + dest[1] = (unsigned char)(temp); + dest[2] = (unsigned char)(temp >> 8); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp); + dest[2] = 0; +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_Int8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (signed char)((*src) >> 8); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_Int8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* IMPLEMENT ME */ + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_UInt8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (unsigned char)(((*src) >> 8) + 128); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int16_To_UInt8_Dither( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaInt16 *src = (PaInt16*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + /* IMPLEMENT ME */ + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int8_To_Float32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + signed char *src = (signed char*)sourceBuffer; + float *dest = (float*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + float samp = *src * const_1_div_128_; + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int8_To_Int32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + signed char *src = (signed char*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (*src) << 24; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int8_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + signed char *src = (signed char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = 0; + dest[1] = 0; + dest[2] = (*src); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (*src); + dest[1] = 0; + dest[2] = 0; +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int8_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + signed char *src = (signed char*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (PaInt16)((*src) << 8); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Int8_To_UInt8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + signed char *src = (signed char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (unsigned char)(*src + 128); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void UInt8_To_Float32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + float *dest = (float*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + float samp = (*src - 128) * const_1_div_128_; + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void UInt8_To_Int32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + PaInt32 *dest = (PaInt32*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (*src - 128) << 24; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void UInt8_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + (void) ditherGenerator; /* unused parameters */ + + while( count-- ) + { + +#if defined(PA_LITTLE_ENDIAN) + dest[0] = 0; + dest[1] = 0; + dest[2] = (unsigned char)(*src - 128); +#elif defined(PA_BIG_ENDIAN) + dest[0] = (unsigned char)(*src - 128); + dest[1] = 0; + dest[2] = 0; +#endif + + src += sourceStride; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void UInt8_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + PaInt16 *dest = (PaInt16*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (PaInt16)((*src - 128) << 8); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void UInt8_To_Int8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + signed char *dest = (signed char*)destinationBuffer; + (void)ditherGenerator; /* unused parameter */ + + while( count-- ) + { + (*dest) = (signed char)(*src - 128); + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Copy_8_To_8( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = *src; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Copy_16_To_16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaUint16 *src = (PaUint16 *)sourceBuffer; + PaUint16 *dest = (PaUint16 *)destinationBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = *src; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Copy_24_To_24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + unsigned char *src = (unsigned char*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + + src += sourceStride * 3; + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Copy_32_To_32( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + PaUint32 *dest = (PaUint32 *)destinationBuffer; + PaUint32 *src = (PaUint32 *)sourceBuffer; + + (void) ditherGenerator; /* unused parameter */ + + while( count-- ) + { + *dest = *src; + + src += sourceStride; + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +PaUtilConverterTable paConverters = { + Float32_To_Int32, /* PaUtilConverter *Float32_To_Int32; */ + Float32_To_Int32_Dither, /* PaUtilConverter *Float32_To_Int32_Dither; */ + Float32_To_Int32_Clip, /* PaUtilConverter *Float32_To_Int32_Clip; */ + Float32_To_Int32_DitherClip, /* PaUtilConverter *Float32_To_Int32_DitherClip; */ + + Float32_To_Int24, /* PaUtilConverter *Float32_To_Int24; */ + Float32_To_Int24_Dither, /* PaUtilConverter *Float32_To_Int24_Dither; */ + Float32_To_Int24_Clip, /* PaUtilConverter *Float32_To_Int24_Clip; */ + Float32_To_Int24_DitherClip, /* PaUtilConverter *Float32_To_Int24_DitherClip; */ + + Float32_To_Int16, /* PaUtilConverter *Float32_To_Int16; */ + Float32_To_Int16_Dither, /* PaUtilConverter *Float32_To_Int16_Dither; */ + Float32_To_Int16_Clip, /* PaUtilConverter *Float32_To_Int16_Clip; */ + Float32_To_Int16_DitherClip, /* PaUtilConverter *Float32_To_Int16_DitherClip; */ + + Float32_To_Int8, /* PaUtilConverter *Float32_To_Int8; */ + Float32_To_Int8_Dither, /* PaUtilConverter *Float32_To_Int8_Dither; */ + Float32_To_Int8_Clip, /* PaUtilConverter *Float32_To_Int8_Clip; */ + Float32_To_Int8_DitherClip, /* PaUtilConverter *Float32_To_Int8_DitherClip; */ + + Float32_To_UInt8, /* PaUtilConverter *Float32_To_UInt8; */ + Float32_To_UInt8_Dither, /* PaUtilConverter *Float32_To_UInt8_Dither; */ + Float32_To_UInt8_Clip, /* PaUtilConverter *Float32_To_UInt8_Clip; */ + Float32_To_UInt8_DitherClip, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */ + + Int32_To_Float32, /* PaUtilConverter *Int32_To_Float32; */ + Int32_To_Int24, /* PaUtilConverter *Int32_To_Int24; */ + Int32_To_Int24_Dither, /* PaUtilConverter *Int32_To_Int24_Dither; */ + Int32_To_Int16, /* PaUtilConverter *Int32_To_Int16; */ + Int32_To_Int16_Dither, /* PaUtilConverter *Int32_To_Int16_Dither; */ + Int32_To_Int8, /* PaUtilConverter *Int32_To_Int8; */ + Int32_To_Int8_Dither, /* PaUtilConverter *Int32_To_Int8_Dither; */ + Int32_To_UInt8, /* PaUtilConverter *Int32_To_UInt8; */ + Int32_To_UInt8_Dither, /* PaUtilConverter *Int32_To_UInt8_Dither; */ + + Int24_To_Float32, /* PaUtilConverter *Int24_To_Float32; */ + Int24_To_Int32, /* PaUtilConverter *Int24_To_Int32; */ + Int24_To_Int16, /* PaUtilConverter *Int24_To_Int16; */ + Int24_To_Int16_Dither, /* PaUtilConverter *Int24_To_Int16_Dither; */ + Int24_To_Int8, /* PaUtilConverter *Int24_To_Int8; */ + Int24_To_Int8_Dither, /* PaUtilConverter *Int24_To_Int8_Dither; */ + Int24_To_UInt8, /* PaUtilConverter *Int24_To_UInt8; */ + Int24_To_UInt8_Dither, /* PaUtilConverter *Int24_To_UInt8_Dither; */ + + Int16_To_Float32, /* PaUtilConverter *Int16_To_Float32; */ + Int16_To_Int32, /* PaUtilConverter *Int16_To_Int32; */ + Int16_To_Int24, /* PaUtilConverter *Int16_To_Int24; */ + Int16_To_Int8, /* PaUtilConverter *Int16_To_Int8; */ + Int16_To_Int8_Dither, /* PaUtilConverter *Int16_To_Int8_Dither; */ + Int16_To_UInt8, /* PaUtilConverter *Int16_To_UInt8; */ + Int16_To_UInt8_Dither, /* PaUtilConverter *Int16_To_UInt8_Dither; */ + + Int8_To_Float32, /* PaUtilConverter *Int8_To_Float32; */ + Int8_To_Int32, /* PaUtilConverter *Int8_To_Int32; */ + Int8_To_Int24, /* PaUtilConverter *Int8_To_Int24 */ + Int8_To_Int16, /* PaUtilConverter *Int8_To_Int16; */ + Int8_To_UInt8, /* PaUtilConverter *Int8_To_UInt8; */ + + UInt8_To_Float32, /* PaUtilConverter *UInt8_To_Float32; */ + UInt8_To_Int32, /* PaUtilConverter *UInt8_To_Int32; */ + UInt8_To_Int24, /* PaUtilConverter *UInt8_To_Int24; */ + UInt8_To_Int16, /* PaUtilConverter *UInt8_To_Int16; */ + UInt8_To_Int8, /* PaUtilConverter *UInt8_To_Int8; */ + + Copy_8_To_8, /* PaUtilConverter *Copy_8_To_8; */ + Copy_16_To_16, /* PaUtilConverter *Copy_16_To_16; */ + Copy_24_To_24, /* PaUtilConverter *Copy_24_To_24; */ + Copy_32_To_32 /* PaUtilConverter *Copy_32_To_32; */ +}; + +/* -------------------------------------------------------------------------- */ + +#endif /* PA_NO_STANDARD_CONVERTERS */ + +/* -------------------------------------------------------------------------- */ + +PaUtilZeroer* PaUtil_SelectZeroer( PaSampleFormat destinationFormat ) +{ + switch( destinationFormat & ~paNonInterleaved ){ + case paFloat32: + return paZeroers.Zero32; + case paInt32: + return paZeroers.Zero32; + case paInt24: + return paZeroers.Zero24; + case paInt16: + return paZeroers.Zero16; + case paInt8: + return paZeroers.Zero8; + case paUInt8: + return paZeroers.ZeroU8; + default: return 0; + } +} + +/* -------------------------------------------------------------------------- */ + +#ifdef PA_NO_STANDARD_ZEROERS + +/* -------------------------------------------------------------------------- */ + +PaUtilZeroerTable paZeroers = { + 0, /* PaUtilZeroer *ZeroU8; */ + 0, /* PaUtilZeroer *Zero8; */ + 0, /* PaUtilZeroer *Zero16; */ + 0, /* PaUtilZeroer *Zero24; */ + 0, /* PaUtilZeroer *Zero32; */ +}; + +/* -------------------------------------------------------------------------- */ + +#else /* PA_NO_STANDARD_ZEROERS is not defined */ + +/* -------------------------------------------------------------------------- */ + +static void ZeroU8( void *destinationBuffer, signed int destinationStride, + unsigned int count ) +{ + unsigned char *dest = (unsigned char*)destinationBuffer; + + while( count-- ) + { + *dest = 128; + + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Zero8( void *destinationBuffer, signed int destinationStride, + unsigned int count ) +{ + unsigned char *dest = (unsigned char*)destinationBuffer; + + while( count-- ) + { + *dest = 0; + + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Zero16( void *destinationBuffer, signed int destinationStride, + unsigned int count ) +{ + PaUint16 *dest = (PaUint16 *)destinationBuffer; + + while( count-- ) + { + *dest = 0; + + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Zero24( void *destinationBuffer, signed int destinationStride, + unsigned int count ) +{ + unsigned char *dest = (unsigned char*)destinationBuffer; + + while( count-- ) + { + dest[0] = 0; + dest[1] = 0; + dest[2] = 0; + + dest += destinationStride * 3; + } +} + +/* -------------------------------------------------------------------------- */ + +static void Zero32( void *destinationBuffer, signed int destinationStride, + unsigned int count ) +{ + PaUint32 *dest = (PaUint32 *)destinationBuffer; + + while( count-- ) + { + *dest = 0; + + dest += destinationStride; + } +} + +/* -------------------------------------------------------------------------- */ + +PaUtilZeroerTable paZeroers = { + ZeroU8, /* PaUtilZeroer *ZeroU8; */ + Zero8, /* PaUtilZeroer *Zero8; */ + Zero16, /* PaUtilZeroer *Zero16; */ + Zero24, /* PaUtilZeroer *Zero24; */ + Zero32, /* PaUtilZeroer *Zero32; */ +}; + +/* -------------------------------------------------------------------------- */ + +#endif /* PA_NO_STANDARD_ZEROERS */ diff --git a/Externals/portaudio/src/common/pa_converters.h b/Externals/portaudio/src/common/pa_converters.h new file mode 100644 index 0000000000..7ddfcaa3c2 --- /dev/null +++ b/Externals/portaudio/src/common/pa_converters.h @@ -0,0 +1,263 @@ +#ifndef PA_CONVERTERS_H +#define PA_CONVERTERS_H +/* + * $Id: pa_converters.h 1097 2006-08-26 08:27:53Z rossb $ + * Portable Audio I/O Library sample conversion mechanism + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Conversion functions used to convert buffers of samples from one + format to another. +*/ + + +#include "portaudio.h" /* for PaSampleFormat */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +struct PaUtilTriangularDitherGenerator; + + +/** Choose an available sample format which is most appropriate for + representing the requested format. If the requested format is not available + higher quality formats are considered before lower quality formates. + @param availableFormats A variable containing the logical OR of all available + formats. + @param format The desired format. + @return The most appropriate available format for representing the requested + format. +*/ +PaSampleFormat PaUtil_SelectClosestAvailableFormat( + PaSampleFormat availableFormats, PaSampleFormat format ); + + +/* high level conversions functions for use by implementations */ + + +/** The generic sample converter prototype. Sample converters convert count + samples from sourceBuffer to destinationBuffer. The actual type of the data + pointed to by these parameters varys for different converter functions. + @param destinationBuffer A pointer to the first sample of the destination. + @param destinationStride An offset between successive destination samples + expressed in samples (not bytes.) It may be negative. + @param sourceBuffer A pointer to the first sample of the source. + @param sourceStride An offset between successive source samples + expressed in samples (not bytes.) It may be negative. + @param count The number of samples to convert. + @param ditherState State information used to calculate dither. Converters + that do not perform dithering will ignore this parameter, in which case + NULL or invalid dither state may be passed. +*/ +typedef void PaUtilConverter( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ); + + +/** Find a sample converter function for the given source and destinations + formats and flags (clip and dither.) + @return + A pointer to a PaUtilConverter which will perform the requested + conversion, or NULL if the given format conversion is not supported. + For conversions where clipping or dithering is not necessary, the + clip and dither flags are ignored and a non-clipping or dithering + version is returned. + If the source and destination formats are the same, a function which + copies data of the appropriate size will be returned. +*/ +PaUtilConverter* PaUtil_SelectConverter( PaSampleFormat sourceFormat, + PaSampleFormat destinationFormat, PaStreamFlags flags ); + + +/** The generic buffer zeroer prototype. Buffer zeroers copy count zeros to + destinationBuffer. The actual type of the data pointed to varys for + different zeroer functions. + @param destinationBuffer A pointer to the first sample of the destination. + @param destinationStride An offset between successive destination samples + expressed in samples (not bytes.) It may be negative. + @param count The number of samples to zero. +*/ +typedef void PaUtilZeroer( + void *destinationBuffer, signed int destinationStride, unsigned int count ); + + +/** Find a buffer zeroer function for the given destination format. + @return + A pointer to a PaUtilZeroer which will perform the requested + zeroing. +*/ +PaUtilZeroer* PaUtil_SelectZeroer( PaSampleFormat destinationFormat ); + +/*----------------------------------------------------------------------------*/ +/* low level functions and data structures which may be used for + substituting conversion functions */ + + +/** The type used to store all sample conversion functions. + @see paConverters; +*/ +typedef struct{ + PaUtilConverter *Float32_To_Int32; + PaUtilConverter *Float32_To_Int32_Dither; + PaUtilConverter *Float32_To_Int32_Clip; + PaUtilConverter *Float32_To_Int32_DitherClip; + + PaUtilConverter *Float32_To_Int24; + PaUtilConverter *Float32_To_Int24_Dither; + PaUtilConverter *Float32_To_Int24_Clip; + PaUtilConverter *Float32_To_Int24_DitherClip; + + PaUtilConverter *Float32_To_Int16; + PaUtilConverter *Float32_To_Int16_Dither; + PaUtilConverter *Float32_To_Int16_Clip; + PaUtilConverter *Float32_To_Int16_DitherClip; + + PaUtilConverter *Float32_To_Int8; + PaUtilConverter *Float32_To_Int8_Dither; + PaUtilConverter *Float32_To_Int8_Clip; + PaUtilConverter *Float32_To_Int8_DitherClip; + + PaUtilConverter *Float32_To_UInt8; + PaUtilConverter *Float32_To_UInt8_Dither; + PaUtilConverter *Float32_To_UInt8_Clip; + PaUtilConverter *Float32_To_UInt8_DitherClip; + + PaUtilConverter *Int32_To_Float32; + PaUtilConverter *Int32_To_Int24; + PaUtilConverter *Int32_To_Int24_Dither; + PaUtilConverter *Int32_To_Int16; + PaUtilConverter *Int32_To_Int16_Dither; + PaUtilConverter *Int32_To_Int8; + PaUtilConverter *Int32_To_Int8_Dither; + PaUtilConverter *Int32_To_UInt8; + PaUtilConverter *Int32_To_UInt8_Dither; + + PaUtilConverter *Int24_To_Float32; + PaUtilConverter *Int24_To_Int32; + PaUtilConverter *Int24_To_Int16; + PaUtilConverter *Int24_To_Int16_Dither; + PaUtilConverter *Int24_To_Int8; + PaUtilConverter *Int24_To_Int8_Dither; + PaUtilConverter *Int24_To_UInt8; + PaUtilConverter *Int24_To_UInt8_Dither; + + PaUtilConverter *Int16_To_Float32; + PaUtilConverter *Int16_To_Int32; + PaUtilConverter *Int16_To_Int24; + PaUtilConverter *Int16_To_Int8; + PaUtilConverter *Int16_To_Int8_Dither; + PaUtilConverter *Int16_To_UInt8; + PaUtilConverter *Int16_To_UInt8_Dither; + + PaUtilConverter *Int8_To_Float32; + PaUtilConverter *Int8_To_Int32; + PaUtilConverter *Int8_To_Int24; + PaUtilConverter *Int8_To_Int16; + PaUtilConverter *Int8_To_UInt8; + + PaUtilConverter *UInt8_To_Float32; + PaUtilConverter *UInt8_To_Int32; + PaUtilConverter *UInt8_To_Int24; + PaUtilConverter *UInt8_To_Int16; + PaUtilConverter *UInt8_To_Int8; + + PaUtilConverter *Copy_8_To_8; /* copy without any conversion */ + PaUtilConverter *Copy_16_To_16; /* copy without any conversion */ + PaUtilConverter *Copy_24_To_24; /* copy without any conversion */ + PaUtilConverter *Copy_32_To_32; /* copy without any conversion */ +} PaUtilConverterTable; + + +/** A table of pointers to all required converter functions. + PaUtil_SelectConverter() uses this table to lookup the appropriate + conversion functions. The fields of this structure are initialized + with default conversion functions. Fields may be NULL, indicating that + no conversion function is available. User code may substitue optimised + conversion functions by assigning different function pointers to + these fields. + + @note + If the PA_NO_STANDARD_CONVERTERS preprocessor variable is defined, + PortAudio's standard converters will not be compiled, and all fields + of this structure will be initialized to NULL. In such cases, users + should supply their own conversion functions if the require PortAudio + to open a stream that requires sample conversion. + + @see PaUtilConverterTable, PaUtilConverter, PaUtil_SelectConverter +*/ +extern PaUtilConverterTable paConverters; + + +/** The type used to store all buffer zeroing functions. + @see paZeroers; +*/ +typedef struct{ + PaUtilZeroer *ZeroU8; /* unsigned 8 bit, zero == 128 */ + PaUtilZeroer *Zero8; + PaUtilZeroer *Zero16; + PaUtilZeroer *Zero24; + PaUtilZeroer *Zero32; +} PaUtilZeroerTable; + + +/** A table of pointers to all required zeroer functions. + PaUtil_SelectZeroer() uses this table to lookup the appropriate + conversion functions. The fields of this structure are initialized + with default conversion functions. User code may substitue optimised + conversion functions by assigning different function pointers to + these fields. + + @note + If the PA_NO_STANDARD_ZEROERS preprocessor variable is defined, + PortAudio's standard zeroers will not be compiled, and all fields + of this structure will be initialized to NULL. In such cases, users + should supply their own zeroing functions for the sample sizes which + they intend to use. + + @see PaUtilZeroerTable, PaUtilZeroer, PaUtil_SelectZeroer +*/ +extern PaUtilZeroerTable paZeroers; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_CONVERTERS_H */ diff --git a/Externals/portaudio/src/common/pa_cpuload.c b/Externals/portaudio/src/common/pa_cpuload.c new file mode 100644 index 0000000000..4465a50b62 --- /dev/null +++ b/Externals/portaudio/src/common/pa_cpuload.c @@ -0,0 +1,105 @@ +/* + * $Id: pa_cpuload.c 1577 2011-02-01 13:03:45Z rossb $ + * Portable Audio I/O Library CPU Load measurement functions + * Portable CPU load measurement facility. + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 2002 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Functions to assist in measuring the CPU utilization of a callback + stream. Used to implement the Pa_GetStreamCpuLoad() function. + + @todo Dynamically calculate the coefficients used to smooth the CPU Load + Measurements over time to provide a uniform characterisation of CPU Load + independent of rate at which PaUtil_BeginCpuLoadMeasurement / + PaUtil_EndCpuLoadMeasurement are called. see http://www.portaudio.com/trac/ticket/113 +*/ + + +#include "pa_cpuload.h" + +#include + +#include "pa_util.h" /* for PaUtil_GetTime() */ + + +void PaUtil_InitializeCpuLoadMeasurer( PaUtilCpuLoadMeasurer* measurer, double sampleRate ) +{ + assert( sampleRate > 0 ); + + measurer->samplingPeriod = 1. / sampleRate; + measurer->averageLoad = 0.; +} + +void PaUtil_ResetCpuLoadMeasurer( PaUtilCpuLoadMeasurer* measurer ) +{ + measurer->averageLoad = 0.; +} + +void PaUtil_BeginCpuLoadMeasurement( PaUtilCpuLoadMeasurer* measurer ) +{ + measurer->measurementStartTime = PaUtil_GetTime(); +} + + +void PaUtil_EndCpuLoadMeasurement( PaUtilCpuLoadMeasurer* measurer, unsigned long framesProcessed ) +{ + double measurementEndTime, secondsFor100Percent, measuredLoad; + + if( framesProcessed > 0 ){ + measurementEndTime = PaUtil_GetTime(); + + assert( framesProcessed > 0 ); + secondsFor100Percent = framesProcessed * measurer->samplingPeriod; + + measuredLoad = (measurementEndTime - measurer->measurementStartTime) / secondsFor100Percent; + + /* Low pass filter the calculated CPU load to reduce jitter using a simple IIR low pass filter. */ + /** FIXME @todo these coefficients shouldn't be hardwired see: http://www.portaudio.com/trac/ticket/113 */ +#define LOWPASS_COEFFICIENT_0 (0.9) +#define LOWPASS_COEFFICIENT_1 (0.99999 - LOWPASS_COEFFICIENT_0) + + measurer->averageLoad = (LOWPASS_COEFFICIENT_0 * measurer->averageLoad) + + (LOWPASS_COEFFICIENT_1 * measuredLoad); + } +} + + +double PaUtil_GetCpuLoad( PaUtilCpuLoadMeasurer* measurer ) +{ + return measurer->averageLoad; +} diff --git a/Externals/portaudio/src/common/pa_cpuload.h b/Externals/portaudio/src/common/pa_cpuload.h new file mode 100644 index 0000000000..4a594430b8 --- /dev/null +++ b/Externals/portaudio/src/common/pa_cpuload.h @@ -0,0 +1,72 @@ +#ifndef PA_CPULOAD_H +#define PA_CPULOAD_H +/* + * $Id: pa_cpuload.h 1097 2006-08-26 08:27:53Z rossb $ + * Portable Audio I/O Library CPU Load measurement functions + * Portable CPU load measurement facility. + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 2002 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Functions to assist in measuring the CPU utilization of a callback + stream. Used to implement the Pa_GetStreamCpuLoad() function. +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +typedef struct { + double samplingPeriod; + double measurementStartTime; + double averageLoad; +} PaUtilCpuLoadMeasurer; /**< @todo need better name than measurer */ + +void PaUtil_InitializeCpuLoadMeasurer( PaUtilCpuLoadMeasurer* measurer, double sampleRate ); +void PaUtil_BeginCpuLoadMeasurement( PaUtilCpuLoadMeasurer* measurer ); +void PaUtil_EndCpuLoadMeasurement( PaUtilCpuLoadMeasurer* measurer, unsigned long framesProcessed ); +void PaUtil_ResetCpuLoadMeasurer( PaUtilCpuLoadMeasurer* measurer ); +double PaUtil_GetCpuLoad( PaUtilCpuLoadMeasurer* measurer ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_CPULOAD_H */ diff --git a/Externals/portaudio/src/common/pa_debugprint.c b/Externals/portaudio/src/common/pa_debugprint.c new file mode 100644 index 0000000000..f34d4bbf98 --- /dev/null +++ b/Externals/portaudio/src/common/pa_debugprint.c @@ -0,0 +1,123 @@ +/* + * $Id: pa_log.c $ + * Portable Audio I/O Library Multi-Host API front end + * Validate function parameters and manage multiple host APIs. + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2006 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Implements log function. + + PaUtil_SetLogPrintFunction can be user called to replace the provided + DefaultLogPrint function, which writes to stderr. + One can NOT pass var_args across compiler/dll boundaries as it is not + "byte code/abi portable". So the technique used here is to allocate a local + a static array, write in it, then callback the user with a pointer to its + start. +*/ + +#include +#include + +#include "pa_debugprint.h" + +// for OutputDebugStringA +#if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) + #define WIN32_LEAN_AND_MEAN // exclude rare headers + #include "windows.h" +#endif + +// User callback +static PaUtilLogCallback userCB = NULL; + +// Sets user callback +void PaUtil_SetDebugPrintFunction(PaUtilLogCallback cb) +{ + userCB = cb; +} + +/* + If your platform doesn’t have vsnprintf, you are stuck with a + VERY dangerous alternative, vsprintf (with no n) +*/ +#if _MSC_VER + /* Some Windows Mobile SDKs don't define vsnprintf but all define _vsnprintf (hopefully). + According to MSDN "vsnprintf is identical to _vsnprintf". So we use _vsnprintf with MSC. + */ + #define VSNPRINTF _vsnprintf +#else + #define VSNPRINTF vsnprintf +#endif + +#define PA_LOG_BUF_SIZE 2048 + +void PaUtil_DebugPrint( const char *format, ... ) +{ + // Optional logging into Output console of Visual Studio +#if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) + { + char buf[PA_LOG_BUF_SIZE]; + va_list ap; + va_start(ap, format); + VSNPRINTF(buf, sizeof(buf), format, ap); + buf[sizeof(buf)-1] = 0; + OutputDebugStringA(buf); + va_end(ap); + } +#endif + + // Output to User-Callback + if (userCB != NULL) + { + char strdump[PA_LOG_BUF_SIZE]; + va_list ap; + va_start(ap, format); + VSNPRINTF(strdump, sizeof(strdump), format, ap); + strdump[sizeof(strdump)-1] = 0; + userCB(strdump); + va_end(ap); + } + else + // Standard output to stderr + { + va_list ap; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + fflush(stderr); + } +} diff --git a/Externals/portaudio/src/common/pa_debugprint.h b/Externals/portaudio/src/common/pa_debugprint.h new file mode 100644 index 0000000000..5fba7667dc --- /dev/null +++ b/Externals/portaudio/src/common/pa_debugprint.h @@ -0,0 +1,149 @@ +#ifndef PA_LOG_H +#define PA_LOG_H +/* + * Log file redirector function + * Copyright (c) 1999-2006 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + + +void PaUtil_DebugPrint( const char *format, ... ); + + +/* + The basic format for log messages is described below. If you need to + add any log messages, please follow this format. + + Function entry (void function): + + "FunctionName called.\n" + + Function entry (non void function): + + "FunctionName called:\n" + "\tParam1Type param1: param1Value\n" + "\tParam2Type param2: param2Value\n" (etc...) + + + Function exit (no return value): + + "FunctionName returned.\n" + + Function exit (simple return value): + + "FunctionName returned:\n" + "\tReturnType: returnValue\n" + + If the return type is an error code, the error text is displayed in () + + If the return type is not an error code, but has taken a special value + because an error occurred, then the reason for the error is shown in [] + + If the return type is a struct ptr, the struct is dumped. + + See the code below for examples +*/ + +/** PA_DEBUG() provides a simple debug message printing facility. The macro + passes it's argument to a printf-like function called PaUtil_DebugPrint() + which prints to stderr and always flushes the stream after printing. + Because preprocessor macros cannot directly accept variable length argument + lists, calls to the macro must include an additional set of parenthesis, eg: + PA_DEBUG(("errorno: %d", 1001 )); +*/ + + +#ifdef PA_ENABLE_DEBUG_OUTPUT +#define PA_DEBUG(x) PaUtil_DebugPrint x ; +#else +#define PA_DEBUG(x) +#endif + + +#ifdef PA_LOG_API_CALLS +#define PA_LOGAPI(x) PaUtil_DebugPrint x + +#define PA_LOGAPI_ENTER(functionName) PaUtil_DebugPrint( functionName " called.\n" ) + +#define PA_LOGAPI_ENTER_PARAMS(functionName) PaUtil_DebugPrint( functionName " called:\n" ) + +#define PA_LOGAPI_EXIT(functionName) PaUtil_DebugPrint( functionName " returned.\n" ) + +#define PA_LOGAPI_EXIT_PAERROR( functionName, result ) \ + PaUtil_DebugPrint( functionName " returned:\n" ); \ + PaUtil_DebugPrint("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) ) + +#define PA_LOGAPI_EXIT_T( functionName, resultFormatString, result ) \ + PaUtil_DebugPrint( functionName " returned:\n" ); \ + PaUtil_DebugPrint("\t" resultFormatString "\n", result ) + +#define PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( functionName, positiveResultFormatString, result ) \ + PaUtil_DebugPrint( functionName " returned:\n" ); \ + if( result > 0 ) \ + PaUtil_DebugPrint("\t" positiveResultFormatString "\n", result ); \ + else \ + PaUtil_DebugPrint("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) ) +#else +#define PA_LOGAPI(x) +#define PA_LOGAPI_ENTER(functionName) +#define PA_LOGAPI_ENTER_PARAMS(functionName) +#define PA_LOGAPI_EXIT(functionName) +#define PA_LOGAPI_EXIT_PAERROR( functionName, result ) +#define PA_LOGAPI_EXIT_T( functionName, resultFormatString, result ) +#define PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( functionName, positiveResultFormatString, result ) +#endif + + +typedef void (*PaUtilLogCallback ) (const char *log); + +/** + Install user provided log function +*/ +void PaUtil_SetDebugPrintFunction(PaUtilLogCallback cb); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_LOG_H */ diff --git a/Externals/portaudio/src/common/pa_dither.c b/Externals/portaudio/src/common/pa_dither.c new file mode 100644 index 0000000000..7a1b13125b --- /dev/null +++ b/Externals/portaudio/src/common/pa_dither.c @@ -0,0 +1,218 @@ +/* + * $Id: pa_dither.c 1418 2009-10-12 21:00:53Z philburk $ + * Portable Audio I/O Library triangular dither generator + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Functions for generating dither noise +*/ + +#include "pa_types.h" +#include "pa_dither.h" + + +/* Note that the linear congruential algorithm requires 32 bit integers + * because it uses arithmetic overflow. So use PaUint32 instead of + * unsigned long so it will work on 64 bit systems. + */ + +#define PA_DITHER_BITS_ (15) + + +void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *state ) +{ + state->previous = 0; + state->randSeed1 = 22222; + state->randSeed2 = 5555555; +} + + +PaInt32 PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *state ) +{ + PaInt32 current, highPass; + + /* Generate two random numbers. */ + state->randSeed1 = (state->randSeed1 * 196314165) + 907633515; + state->randSeed2 = (state->randSeed2 * 196314165) + 907633515; + + /* Generate triangular distribution about 0. + * Shift before adding to prevent overflow which would skew the distribution. + * Also shift an extra bit for the high pass filter. + */ +#define DITHER_SHIFT_ ((sizeof(PaInt32)*8 - PA_DITHER_BITS_) + 1) + + current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) + + (((PaInt32)state->randSeed2)>>DITHER_SHIFT_); + + /* High pass filter to reduce audibility. */ + highPass = current - state->previous; + state->previous = current; + return highPass; +} + + +/* Multiply by PA_FLOAT_DITHER_SCALE_ to get a float between -2.0 and +1.99999 */ +#define PA_FLOAT_DITHER_SCALE_ (1.0f / ((1<randSeed1 = (state->randSeed1 * 196314165) + 907633515; + state->randSeed2 = (state->randSeed2 * 196314165) + 907633515; + + /* Generate triangular distribution about 0. + * Shift before adding to prevent overflow which would skew the distribution. + * Also shift an extra bit for the high pass filter. + */ + current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) + + (((PaInt32)state->randSeed2)>>DITHER_SHIFT_); + + /* High pass filter to reduce audibility. */ + highPass = current - state->previous; + state->previous = current; + return ((float)highPass) * const_float_dither_scale_; +} + + +/* +The following alternate dither algorithms (from musicdsp.org) could be +considered +*/ + +/*Noise shaped dither (March 2000) +------------------- + +This is a simple implementation of highpass triangular-PDF dither with +2nd-order noise shaping, for use when truncating floating point audio +data to fixed point. + +The noise shaping lowers the noise floor by 11dB below 5kHz (@ 44100Hz +sample rate) compared to triangular-PDF dither. The code below assumes +input data is in the range +1 to -1 and doesn't check for overloads! + +To save time when generating dither for multiple channels you can do +things like this: r3=(r1 & 0x7F)<<8; instead of calling rand() again. + + + + int r1, r2; //rectangular-PDF random numbers + float s1, s2; //error feedback buffers + float s = 0.5f; //set to 0.0f for no noise shaping + float w = pow(2.0,bits-1); //word length (usually bits=16) + float wi= 1.0f/w; + float d = wi / RAND_MAX; //dither amplitude (2 lsb) + float o = wi * 0.5f; //remove dc offset + float in, tmp; + int out; + + +//for each sample... + + r2=r1; //can make HP-TRI dither by + r1=rand(); //subtracting previous rand() + + in += s * (s1 + s1 - s2); //error feedback + tmp = in + o + d * (float)(r1 - r2); //dc offset and dither + + out = (int)(w * tmp); //truncate downwards + if(tmp<0.0f) out--; //this is faster than floor() + + s2 = s1; + s1 = in - wi * (float)out; //error + + + +-- +paul.kellett@maxim.abel.co.uk +http://www.maxim.abel.co.uk +*/ + + +/* +16-to-8-bit first-order dither + +Type : First order error feedforward dithering code +References : Posted by Jon Watte + +Notes : +This is about as simple a dithering algorithm as you can implement, but it's +likely to sound better than just truncating to N bits. + +Note that you might not want to carry forward the full difference for infinity. +It's probably likely that the worst performance hit comes from the saturation +conditionals, which can be avoided with appropriate instructions on many DSPs +and integer SIMD type instructions, or CMOV. + +Last, if sound quality is paramount (such as when going from > 16 bits to 16 +bits) you probably want to use a higher-order dither function found elsewhere +on this site. + + +Code : +// This code will down-convert and dither a 16-bit signed short +// mono signal into an 8-bit unsigned char signal, using a first +// order forward-feeding error term dither. + +#define uchar unsigned char + +void dither_one_channel_16_to_8( short * input, uchar * output, int count, int * memory ) +{ + int m = *memory; + while( count-- > 0 ) { + int i = *input++; + i += m; + int j = i + 32768 - 128; + uchar o; + if( j < 0 ) { + o = 0; + } + else if( j > 65535 ) { + o = 255; + } + else { + o = (uchar)((j>>8)&0xff); + } + m = ((j-32768+128)-i); + *output++ = o; + } + *memory = m; +} +*/ diff --git a/Externals/portaudio/src/common/pa_dither.h b/Externals/portaudio/src/common/pa_dither.h new file mode 100644 index 0000000000..a5131b27fa --- /dev/null +++ b/Externals/portaudio/src/common/pa_dither.h @@ -0,0 +1,106 @@ +#ifndef PA_DITHER_H +#define PA_DITHER_H +/* + * $Id: pa_dither.h 1418 2009-10-12 21:00:53Z philburk $ + * Portable Audio I/O Library triangular dither generator + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Functions for generating dither noise +*/ + +#include "pa_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Note that the linear congruential algorithm requires 32 bit integers + * because it uses arithmetic overflow. So use PaUint32 instead of + * unsigned long so it will work on 64 bit systems. + */ + +/** @brief State needed to generate a dither signal */ +typedef struct PaUtilTriangularDitherGenerator{ + PaUint32 previous; + PaUint32 randSeed1; + PaUint32 randSeed2; +} PaUtilTriangularDitherGenerator; + + +/** @brief Initialize dither state */ +void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *ditherState ); + + +/** + @brief Calculate 2 LSB dither signal with a triangular distribution. + Ranged for adding to a 1 bit right-shifted 32 bit integer + prior to >>15. eg: +
+    signed long in = *
+    signed long dither = PaUtil_Generate16BitTriangularDither( ditherState );
+    signed short out = (signed short)(((in>>1) + dither) >> 15);
+
+ @return + A signed 32-bit integer with a range of +32767 to -32768 +*/ +PaInt32 PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *ditherState ); + + +/** + @brief Calculate 2 LSB dither signal with a triangular distribution. + Ranged for adding to a pre-scaled float. +
+    float in = *
+    float dither = PaUtil_GenerateFloatTriangularDither( ditherState );
+    // use smaller scaler to prevent overflow when we add the dither
+    signed short out = (signed short)(in*(32766.0f) + dither );
+
+ @return + A float with a range of -2.0 to +1.99999. +*/ +float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *ditherState ); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_DITHER_H */ diff --git a/Externals/portaudio/src/common/pa_endianness.h b/Externals/portaudio/src/common/pa_endianness.h new file mode 100644 index 0000000000..84e904ca7b --- /dev/null +++ b/Externals/portaudio/src/common/pa_endianness.h @@ -0,0 +1,145 @@ +#ifndef PA_ENDIANNESS_H +#define PA_ENDIANNESS_H +/* + * $Id: pa_endianness.h 1324 2008-01-27 02:03:30Z bjornroche $ + * Portable Audio I/O Library current platform endianness macros + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Configure endianness symbols for the target processor. + + Arrange for either the PA_LITTLE_ENDIAN or PA_BIG_ENDIAN preprocessor symbols + to be defined. The one that is defined reflects the endianness of the target + platform and may be used to implement conditional compilation of byte-order + dependent code. + + If either PA_LITTLE_ENDIAN or PA_BIG_ENDIAN is defined already, then no attempt + is made to override that setting. This may be useful if you have a better way + of determining the platform's endianness. The autoconf mechanism uses this for + example. + + A PA_VALIDATE_ENDIANNESS macro is provided to compare the compile time + and runtime endiannes and raise an assertion if they don't match. +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* If this is an apple, we need to do detect endianness this way */ +#if defined(__APPLE__) + /* we need to do some endian detection that is sensitive to harware arch */ + #if defined(__LITTLE_ENDIAN__) + #if !defined( PA_LITTLE_ENDIAN ) + #define PA_LITTLE_ENDIAN + #endif + #if defined( PA_BIG_ENDIAN ) + #undef PA_BIG_ENDIAN + #endif + #else + #if !defined( PA_BIG_ENDIAN ) + #define PA_BIG_ENDIAN + #endif + #if defined( PA_LITTLE_ENDIAN ) + #undef PA_LITTLE_ENDIAN + #endif + #endif +#else + /* this is not an apple, so first check the existing defines, and, failing that, + detect well-known architechtures. */ + + #if defined(PA_LITTLE_ENDIAN) || defined(PA_BIG_ENDIAN) + /* endianness define has been set externally, such as by autoconf */ + + #if defined(PA_LITTLE_ENDIAN) && defined(PA_BIG_ENDIAN) + #error both PA_LITTLE_ENDIAN and PA_BIG_ENDIAN have been defined externally to pa_endianness.h - only one endianness at a time please + #endif + + #else + /* endianness define has not been set externally */ + + /* set PA_LITTLE_ENDIAN or PA_BIG_ENDIAN by testing well known platform specific defines */ + + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(LITTLE_ENDIAN) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) + #define PA_LITTLE_ENDIAN /* win32, assume intel byte order */ + #else + #define PA_BIG_ENDIAN + #endif + #endif + + #if !defined(PA_LITTLE_ENDIAN) && !defined(PA_BIG_ENDIAN) + /* + If the following error is raised, you either need to modify the code above + to automatically determine the endianness from other symbols defined on your + platform, or define either PA_LITTLE_ENDIAN or PA_BIG_ENDIAN externally. + */ + #error pa_endianness.h was unable to automatically determine the endianness of the target platform + #endif + +#endif + + +/* PA_VALIDATE_ENDIANNESS compares the compile time and runtime endianness, + and raises an assertion if they don't match. must be included in + the context in which this macro is used. +*/ +#if defined(NDEBUG) + #define PA_VALIDATE_ENDIANNESS +#else + #if defined(PA_LITTLE_ENDIAN) + #define PA_VALIDATE_ENDIANNESS \ + { \ + const long nativeOne = 1; \ + assert( "PortAudio: compile time and runtime endianness don't match" && (((char *)&nativeOne)[0]) == 1 ); \ + } + #elif defined(PA_BIG_ENDIAN) + #define PA_VALIDATE_ENDIANNESS \ + { \ + const long nativeOne = 1; \ + assert( "PortAudio: compile time and runtime endianness don't match" && (((char *)&nativeOne)[0]) == 0 ); \ + } + #endif +#endif + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_ENDIANNESS_H */ diff --git a/Externals/portaudio/src/common/pa_front.c b/Externals/portaudio/src/common/pa_front.c new file mode 100644 index 0000000000..957d1eac47 --- /dev/null +++ b/Externals/portaudio/src/common/pa_front.c @@ -0,0 +1,1770 @@ +/* + * $Id: pa_front.c 1730 2011-08-18 03:43:51Z rossb $ + * Portable Audio I/O Library Multi-Host API front end + * Validate function parameters and manage multiple host APIs. + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Implements PortAudio API functions defined in portaudio.h, checks + some errors, delegates platform-specific behavior to host API implementations. + + Implements the functions defined in the PortAudio API (portaudio.h), + validates some parameters and checks for state inconsistencies before + forwarding API requests to specific Host API implementations (via the + interface declared in pa_hostapi.h), and Streams (via the interface + declared in pa_stream.h). + + This file manages initialization and termination of Host API + implementations via initializer functions stored in the paHostApiInitializers + global array (usually defined in an os-specific pa_[os]_hostapis.c file). + + This file maintains a list of all open streams and closes them at Pa_Terminate(). + + Some utility functions declared in pa_util.h are implemented in this file. + + All PortAudio API functions can be conditionally compiled with logging code. + To compile with logging, define the PA_LOG_API_CALLS precompiler symbol. +*/ + + +#include +#include +#include +#include /* needed by PA_VALIDATE_ENDIANNESS */ + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_endianness.h" +#include "pa_types.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_trace.h" /* still usefull?*/ +#include "pa_debugprint.h" + + +#define PA_VERSION_ 1899 +#define PA_VERSION_TEXT_ "PortAudio V19-devel (built " __DATE__ " " __TIME__ ")" + + + + +int Pa_GetVersion( void ) +{ + return PA_VERSION_; +} + + +const char* Pa_GetVersionText( void ) +{ + return PA_VERSION_TEXT_; +} + + + +#define PA_LAST_HOST_ERROR_TEXT_LENGTH_ 1024 + +static char lastHostErrorText_[ PA_LAST_HOST_ERROR_TEXT_LENGTH_ + 1 ] = {0}; + +static PaHostErrorInfo lastHostErrorInfo_ = { (PaHostApiTypeId)-1, 0, lastHostErrorText_ }; + + +void PaUtil_SetLastHostErrorInfo( PaHostApiTypeId hostApiType, long errorCode, + const char *errorText ) +{ + lastHostErrorInfo_.hostApiType = hostApiType; + lastHostErrorInfo_.errorCode = errorCode; + + strncpy( lastHostErrorText_, errorText, PA_LAST_HOST_ERROR_TEXT_LENGTH_ ); +} + + + +static PaUtilHostApiRepresentation **hostApis_ = 0; +static int hostApisCount_ = 0; +static int defaultHostApiIndex_ = 0; +static int initializationCount_ = 0; +static int deviceCount_ = 0; + +PaUtilStreamRepresentation *firstOpenStream_ = NULL; + + +#define PA_IS_INITIALISED_ (initializationCount_ != 0) + + +static int CountHostApiInitializers( void ) +{ + int result = 0; + + while( paHostApiInitializers[ result ] != 0 ) + ++result; + return result; +} + + +static void TerminateHostApis( void ) +{ + /* terminate in reverse order from initialization */ + PA_DEBUG(("TerminateHostApis in \n")); + + while( hostApisCount_ > 0 ) + { + --hostApisCount_; + hostApis_[hostApisCount_]->Terminate( hostApis_[hostApisCount_] ); + } + hostApisCount_ = 0; + defaultHostApiIndex_ = 0; + deviceCount_ = 0; + + if( hostApis_ != 0 ) + PaUtil_FreeMemory( hostApis_ ); + hostApis_ = 0; + + PA_DEBUG(("TerminateHostApis out\n")); +} + + +static PaError InitializeHostApis( void ) +{ + PaError result = paNoError; + int i, initializerCount, baseDeviceIndex; + + initializerCount = CountHostApiInitializers(); + + hostApis_ = (PaUtilHostApiRepresentation**)PaUtil_AllocateMemory( + sizeof(PaUtilHostApiRepresentation*) * initializerCount ); + if( !hostApis_ ) + { + result = paInsufficientMemory; + goto error; + } + + hostApisCount_ = 0; + defaultHostApiIndex_ = -1; /* indicates that we haven't determined the default host API yet */ + deviceCount_ = 0; + baseDeviceIndex = 0; + + for( i=0; i< initializerCount; ++i ) + { + hostApis_[hostApisCount_] = NULL; + + PA_DEBUG(( "before paHostApiInitializers[%d].\n",i)); + + result = paHostApiInitializers[i]( &hostApis_[hostApisCount_], hostApisCount_ ); + if( result != paNoError ) + goto error; + + PA_DEBUG(( "after paHostApiInitializers[%d].\n",i)); + + if( hostApis_[hostApisCount_] ) + { + PaUtilHostApiRepresentation* hostApi = hostApis_[hostApisCount_]; + assert( hostApi->info.defaultInputDevice < hostApi->info.deviceCount ); + assert( hostApi->info.defaultOutputDevice < hostApi->info.deviceCount ); + + /* the first successfully initialized host API with a default input *or* + output device is used as the default host API. + */ + if( (defaultHostApiIndex_ == -1) && + ( hostApi->info.defaultInputDevice != paNoDevice + || hostApi->info.defaultOutputDevice != paNoDevice ) ) + { + defaultHostApiIndex_ = hostApisCount_; + } + + hostApi->privatePaFrontInfo.baseDeviceIndex = baseDeviceIndex; + + if( hostApi->info.defaultInputDevice != paNoDevice ) + hostApi->info.defaultInputDevice += baseDeviceIndex; + + if( hostApi->info.defaultOutputDevice != paNoDevice ) + hostApi->info.defaultOutputDevice += baseDeviceIndex; + + baseDeviceIndex += hostApi->info.deviceCount; + deviceCount_ += hostApi->info.deviceCount; + + ++hostApisCount_; + } + } + + /* if no host APIs have devices, the default host API is the first initialized host API */ + if( defaultHostApiIndex_ == -1 ) + defaultHostApiIndex_ = 0; + + return result; + +error: + TerminateHostApis(); + return result; +} + + +/* + FindHostApi() finds the index of the host api to which + belongs and returns it. if is + non-null, the host specific device index is returned in it. + returns -1 if is out of range. + +*/ +static int FindHostApi( PaDeviceIndex device, int *hostSpecificDeviceIndex ) +{ + int i=0; + + if( !PA_IS_INITIALISED_ ) + return -1; + + if( device < 0 ) + return -1; + + while( i < hostApisCount_ + && device >= hostApis_[i]->info.deviceCount ) + { + + device -= hostApis_[i]->info.deviceCount; + ++i; + } + + if( i >= hostApisCount_ ) + return -1; + + if( hostSpecificDeviceIndex ) + *hostSpecificDeviceIndex = device; + + return i; +} + + +static void AddOpenStream( PaStream* stream ) +{ + ((PaUtilStreamRepresentation*)stream)->nextOpenStream = firstOpenStream_; + firstOpenStream_ = (PaUtilStreamRepresentation*)stream; +} + + +static void RemoveOpenStream( PaStream* stream ) +{ + PaUtilStreamRepresentation *previous = NULL; + PaUtilStreamRepresentation *current = firstOpenStream_; + + while( current != NULL ) + { + if( ((PaStream*)current) == stream ) + { + if( previous == NULL ) + { + firstOpenStream_ = current->nextOpenStream; + } + else + { + previous->nextOpenStream = current->nextOpenStream; + } + return; + } + else + { + previous = current; + current = current->nextOpenStream; + } + } +} + + +static void CloseOpenStreams( void ) +{ + /* we call Pa_CloseStream() here to ensure that the same destruction + logic is used for automatically closed streams */ + + while( firstOpenStream_ != NULL ) + Pa_CloseStream( firstOpenStream_ ); +} + + +PaError Pa_Initialize( void ) +{ + PaError result; + + PA_LOGAPI_ENTER( "Pa_Initialize" ); + + if( PA_IS_INITIALISED_ ) + { + ++initializationCount_; + result = paNoError; + } + else + { + PA_VALIDATE_TYPE_SIZES; + PA_VALIDATE_ENDIANNESS; + + PaUtil_InitializeClock(); + PaUtil_ResetTraceMessages(); + + result = InitializeHostApis(); + if( result == paNoError ) + ++initializationCount_; + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_Initialize", result ); + + return result; +} + + +PaError Pa_Terminate( void ) +{ + PaError result; + + PA_LOGAPI_ENTER( "Pa_Terminate" ); + + if( PA_IS_INITIALISED_ ) + { + if( --initializationCount_ == 0 ) + { + CloseOpenStreams(); + + TerminateHostApis(); + + PaUtil_DumpTraceMessages(); + } + result = paNoError; + } + else + { + result= paNotInitialized; + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_Terminate", result ); + + return result; +} + + +const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ) +{ + return &lastHostErrorInfo_; +} + + +const char *Pa_GetErrorText( PaError errorCode ) +{ + const char *result; + + switch( errorCode ) + { + case paNoError: result = "Success"; break; + case paNotInitialized: result = "PortAudio not initialized"; break; + /** @todo could catenate the last host error text to result in the case of paUnanticipatedHostError. see: http://www.portaudio.com/trac/ticket/114 */ + case paUnanticipatedHostError: result = "Unanticipated host error"; break; + case paInvalidChannelCount: result = "Invalid number of channels"; break; + case paInvalidSampleRate: result = "Invalid sample rate"; break; + case paInvalidDevice: result = "Invalid device"; break; + case paInvalidFlag: result = "Invalid flag"; break; + case paSampleFormatNotSupported: result = "Sample format not supported"; break; + case paBadIODeviceCombination: result = "Illegal combination of I/O devices"; break; + case paInsufficientMemory: result = "Insufficient memory"; break; + case paBufferTooBig: result = "Buffer too big"; break; + case paBufferTooSmall: result = "Buffer too small"; break; + case paNullCallback: result = "No callback routine specified"; break; + case paBadStreamPtr: result = "Invalid stream pointer"; break; + case paTimedOut: result = "Wait timed out"; break; + case paInternalError: result = "Internal PortAudio error"; break; + case paDeviceUnavailable: result = "Device unavailable"; break; + case paIncompatibleHostApiSpecificStreamInfo: result = "Incompatible host API specific stream info"; break; + case paStreamIsStopped: result = "Stream is stopped"; break; + case paStreamIsNotStopped: result = "Stream is not stopped"; break; + case paInputOverflowed: result = "Input overflowed"; break; + case paOutputUnderflowed: result = "Output underflowed"; break; + case paHostApiNotFound: result = "Host API not found"; break; + case paInvalidHostApi: result = "Invalid host API"; break; + case paCanNotReadFromACallbackStream: result = "Can't read from a callback stream"; break; + case paCanNotWriteToACallbackStream: result = "Can't write to a callback stream"; break; + case paCanNotReadFromAnOutputOnlyStream: result = "Can't read from an output only stream"; break; + case paCanNotWriteToAnInputOnlyStream: result = "Can't write to an input only stream"; break; + case paIncompatibleStreamHostApi: result = "Incompatible stream host API"; break; + case paBadBufferPtr: result = "Bad buffer pointer"; break; + default: + if( errorCode > 0 ) + result = "Invalid error code (value greater than zero)"; + else + result = "Invalid error code"; + break; + } + return result; +} + + +PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ) +{ + PaHostApiIndex result; + int i; + + PA_LOGAPI_ENTER_PARAMS( "Pa_HostApiTypeIdToHostApiIndex" ); + PA_LOGAPI(("\tPaHostApiTypeId type: %d\n", type )); + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + result = paHostApiNotFound; + + for( i=0; i < hostApisCount_; ++i ) + { + if( hostApis_[i]->info.type == type ) + { + result = i; + break; + } + } + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_HostApiTypeIdToHostApiIndex", "PaHostApiIndex: %d", result ); + + return result; +} + + +PaError PaUtil_GetHostApiRepresentation( struct PaUtilHostApiRepresentation **hostApi, + PaHostApiTypeId type ) +{ + PaError result; + int i; + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + result = paHostApiNotFound; + + for( i=0; i < hostApisCount_; ++i ) + { + if( hostApis_[i]->info.type == type ) + { + *hostApi = hostApis_[i]; + result = paNoError; + break; + } + } + } + + return result; +} + + +PaError PaUtil_DeviceIndexToHostApiDeviceIndex( + PaDeviceIndex *hostApiDevice, PaDeviceIndex device, struct PaUtilHostApiRepresentation *hostApi ) +{ + PaError result; + PaDeviceIndex x; + + x = device - hostApi->privatePaFrontInfo.baseDeviceIndex; + + if( x < 0 || x >= hostApi->info.deviceCount ) + { + result = paInvalidDevice; + } + else + { + *hostApiDevice = x; + result = paNoError; + } + + return result; +} + + +PaHostApiIndex Pa_GetHostApiCount( void ) +{ + int result; + + PA_LOGAPI_ENTER( "Pa_GetHostApiCount" ); + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + result = hostApisCount_; + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_GetHostApiCount", "PaHostApiIndex: %d", result ); + + return result; +} + + +PaHostApiIndex Pa_GetDefaultHostApi( void ) +{ + int result; + + PA_LOGAPI_ENTER( "Pa_GetDefaultHostApi" ); + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + result = defaultHostApiIndex_; + + /* internal consistency check: make sure that the default host api + index is within range */ + + if( result < 0 || result >= hostApisCount_ ) + { + result = paInternalError; + } + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_GetDefaultHostApi", "PaHostApiIndex: %d", result ); + + return result; +} + + +const PaHostApiInfo* Pa_GetHostApiInfo( PaHostApiIndex hostApi ) +{ + PaHostApiInfo *info; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetHostApiInfo" ); + PA_LOGAPI(("\tPaHostApiIndex hostApi: %d\n", hostApi )); + + if( !PA_IS_INITIALISED_ ) + { + info = NULL; + + PA_LOGAPI(("Pa_GetHostApiInfo returned:\n" )); + PA_LOGAPI(("\tPaHostApiInfo*: NULL [ PortAudio not initialized ]\n" )); + + } + else if( hostApi < 0 || hostApi >= hostApisCount_ ) + { + info = NULL; + + PA_LOGAPI(("Pa_GetHostApiInfo returned:\n" )); + PA_LOGAPI(("\tPaHostApiInfo*: NULL [ hostApi out of range ]\n" )); + + } + else + { + info = &hostApis_[hostApi]->info; + + PA_LOGAPI(("Pa_GetHostApiInfo returned:\n" )); + PA_LOGAPI(("\tPaHostApiInfo*: 0x%p\n", info )); + PA_LOGAPI(("\t{\n" )); + PA_LOGAPI(("\t\tint structVersion: %d\n", info->structVersion )); + PA_LOGAPI(("\t\tPaHostApiTypeId type: %d\n", info->type )); + PA_LOGAPI(("\t\tconst char *name: %s\n", info->name )); + PA_LOGAPI(("\t}\n" )); + + } + + return info; +} + + +PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, int hostApiDeviceIndex ) +{ + PaDeviceIndex result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_HostApiDeviceIndexToPaDeviceIndex" ); + PA_LOGAPI(("\tPaHostApiIndex hostApi: %d\n", hostApi )); + PA_LOGAPI(("\tint hostApiDeviceIndex: %d\n", hostApiDeviceIndex )); + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + if( hostApi < 0 || hostApi >= hostApisCount_ ) + { + result = paInvalidHostApi; + } + else + { + if( hostApiDeviceIndex < 0 || + hostApiDeviceIndex >= hostApis_[hostApi]->info.deviceCount ) + { + result = paInvalidDevice; + } + else + { + result = hostApis_[hostApi]->privatePaFrontInfo.baseDeviceIndex + hostApiDeviceIndex; + } + } + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_HostApiDeviceIndexToPaDeviceIndex", "PaDeviceIndex: %d", result ); + + return result; +} + + +PaDeviceIndex Pa_GetDeviceCount( void ) +{ + PaDeviceIndex result; + + PA_LOGAPI_ENTER( "Pa_GetDeviceCount" ); + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + } + else + { + result = deviceCount_; + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_GetDeviceCount", "PaDeviceIndex: %d", result ); + + return result; +} + + +PaDeviceIndex Pa_GetDefaultInputDevice( void ) +{ + PaHostApiIndex hostApi; + PaDeviceIndex result; + + PA_LOGAPI_ENTER( "Pa_GetDefaultInputDevice" ); + + hostApi = Pa_GetDefaultHostApi(); + if( hostApi < 0 ) + { + result = paNoDevice; + } + else + { + result = hostApis_[hostApi]->info.defaultInputDevice; + } + + PA_LOGAPI_EXIT_T( "Pa_GetDefaultInputDevice", "PaDeviceIndex: %d", result ); + + return result; +} + + +PaDeviceIndex Pa_GetDefaultOutputDevice( void ) +{ + PaHostApiIndex hostApi; + PaDeviceIndex result; + + PA_LOGAPI_ENTER( "Pa_GetDefaultOutputDevice" ); + + hostApi = Pa_GetDefaultHostApi(); + if( hostApi < 0 ) + { + result = paNoDevice; + } + else + { + result = hostApis_[hostApi]->info.defaultOutputDevice; + } + + PA_LOGAPI_EXIT_T( "Pa_GetDefaultOutputDevice", "PaDeviceIndex: %d", result ); + + return result; +} + + +const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ) +{ + int hostSpecificDeviceIndex; + int hostApiIndex = FindHostApi( device, &hostSpecificDeviceIndex ); + PaDeviceInfo *result; + + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetDeviceInfo" ); + PA_LOGAPI(("\tPaDeviceIndex device: %d\n", device )); + + if( hostApiIndex < 0 ) + { + result = NULL; + + PA_LOGAPI(("Pa_GetDeviceInfo returned:\n" )); + PA_LOGAPI(("\tPaDeviceInfo* NULL [ invalid device index ]\n" )); + + } + else + { + result = hostApis_[hostApiIndex]->deviceInfos[ hostSpecificDeviceIndex ]; + + PA_LOGAPI(("Pa_GetDeviceInfo returned:\n" )); + PA_LOGAPI(("\tPaDeviceInfo*: 0x%p:\n", result )); + PA_LOGAPI(("\t{\n" )); + + PA_LOGAPI(("\t\tint structVersion: %d\n", result->structVersion )); + PA_LOGAPI(("\t\tconst char *name: %s\n", result->name )); + PA_LOGAPI(("\t\tPaHostApiIndex hostApi: %d\n", result->hostApi )); + PA_LOGAPI(("\t\tint maxInputChannels: %d\n", result->maxInputChannels )); + PA_LOGAPI(("\t\tint maxOutputChannels: %d\n", result->maxOutputChannels )); + PA_LOGAPI(("\t}\n" )); + + } + + return result; +} + + +/* + SampleFormatIsValid() returns 1 if sampleFormat is a sample format + defined in portaudio.h, or 0 otherwise. +*/ +static int SampleFormatIsValid( PaSampleFormat format ) +{ + switch( format & ~paNonInterleaved ) + { + case paFloat32: return 1; + case paInt16: return 1; + case paInt32: return 1; + case paInt24: return 1; + case paInt8: return 1; + case paUInt8: return 1; + case paCustomFormat: return 1; + default: return 0; + } +} + +/* + NOTE: make sure this validation list is kept syncronised with the one in + pa_hostapi.h + + ValidateOpenStreamParameters() checks that parameters to Pa_OpenStream() + conform to the expected values as described below. This function is + also designed to be used with the proposed Pa_IsFormatSupported() function. + + There are basically two types of validation that could be performed: + Generic conformance validation, and device capability mismatch + validation. This function performs only generic conformance validation. + Validation that would require knowledge of device capabilities is + not performed because of potentially complex relationships between + combinations of parameters - for example, even if the sampleRate + seems ok, it might not be for a duplex stream - we have no way of + checking this in an API-neutral way, so we don't try. + + On success the function returns PaNoError and fills in hostApi, + hostApiInputDeviceID, and hostApiOutputDeviceID fields. On failure + the function returns an error code indicating the first encountered + parameter error. + + + If ValidateOpenStreamParameters() returns paNoError, the following + assertions are guaranteed to be true. + + - at least one of inputParameters & outputParmeters is valid (not NULL) + + - if inputParameters & outputParameters are both valid, that + inputParameters->device & outputParameters->device both use the same host api + + PaDeviceIndex inputParameters->device + - is within range (0 to Pa_GetDeviceCount-1) Or: + - is paUseHostApiSpecificDeviceSpecification and + inputParameters->hostApiSpecificStreamInfo is non-NULL and refers + to a valid host api + + int inputParameters->channelCount + - if inputParameters->device is not paUseHostApiSpecificDeviceSpecification, channelCount is > 0 + - upper bound is NOT validated against device capabilities + + PaSampleFormat inputParameters->sampleFormat + - is one of the sample formats defined in portaudio.h + + void *inputParameters->hostApiSpecificStreamInfo + - if supplied its hostApi field matches the input device's host Api + + PaDeviceIndex outputParmeters->device + - is within range (0 to Pa_GetDeviceCount-1) + + int outputParmeters->channelCount + - if inputDevice is valid, channelCount is > 0 + - upper bound is NOT validated against device capabilities + + PaSampleFormat outputParmeters->sampleFormat + - is one of the sample formats defined in portaudio.h + + void *outputParmeters->hostApiSpecificStreamInfo + - if supplied its hostApi field matches the output device's host Api + + double sampleRate + - is not an 'absurd' rate (less than 1000. or greater than 200000.) + - sampleRate is NOT validated against device capabilities + + PaStreamFlags streamFlags + - unused platform neutral flags are zero + - paNeverDropInput is only used for full-duplex callback streams with + variable buffer size (paFramesPerBufferUnspecified) +*/ +static PaError ValidateOpenStreamParameters( + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + PaUtilHostApiRepresentation **hostApi, + PaDeviceIndex *hostApiInputDevice, + PaDeviceIndex *hostApiOutputDevice ) +{ + int inputHostApiIndex = -1, /* Surpress uninitialised var warnings: compiler does */ + outputHostApiIndex = -1; /* not see that if inputParameters and outputParame- */ + /* ters are both nonzero, these indices are set. */ + + if( (inputParameters == NULL) && (outputParameters == NULL) ) + { + return paInvalidDevice; /** @todo should be a new error code "invalid device parameters" or something */ + } + else + { + if( inputParameters == NULL ) + { + *hostApiInputDevice = paNoDevice; + } + else if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + { + if( inputParameters->hostApiSpecificStreamInfo ) + { + inputHostApiIndex = Pa_HostApiTypeIdToHostApiIndex( + ((PaUtilHostApiSpecificStreamInfoHeader*)inputParameters->hostApiSpecificStreamInfo)->hostApiType ); + + if( inputHostApiIndex != -1 ) + { + *hostApiInputDevice = paUseHostApiSpecificDeviceSpecification; + *hostApi = hostApis_[inputHostApiIndex]; + } + else + { + return paInvalidDevice; + } + } + else + { + return paInvalidDevice; + } + } + else + { + if( inputParameters->device < 0 || inputParameters->device >= deviceCount_ ) + return paInvalidDevice; + + inputHostApiIndex = FindHostApi( inputParameters->device, hostApiInputDevice ); + if( inputHostApiIndex < 0 ) + return paInternalError; + + *hostApi = hostApis_[inputHostApiIndex]; + + if( inputParameters->channelCount <= 0 ) + return paInvalidChannelCount; + + if( !SampleFormatIsValid( inputParameters->sampleFormat ) ) + return paSampleFormatNotSupported; + + if( inputParameters->hostApiSpecificStreamInfo != NULL ) + { + if( ((PaUtilHostApiSpecificStreamInfoHeader*)inputParameters->hostApiSpecificStreamInfo)->hostApiType + != (*hostApi)->info.type ) + return paIncompatibleHostApiSpecificStreamInfo; + } + } + + if( outputParameters == NULL ) + { + *hostApiOutputDevice = paNoDevice; + } + else if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + { + if( outputParameters->hostApiSpecificStreamInfo ) + { + outputHostApiIndex = Pa_HostApiTypeIdToHostApiIndex( + ((PaUtilHostApiSpecificStreamInfoHeader*)outputParameters->hostApiSpecificStreamInfo)->hostApiType ); + + if( outputHostApiIndex != -1 ) + { + *hostApiOutputDevice = paUseHostApiSpecificDeviceSpecification; + *hostApi = hostApis_[outputHostApiIndex]; + } + else + { + return paInvalidDevice; + } + } + else + { + return paInvalidDevice; + } + } + else + { + if( outputParameters->device < 0 || outputParameters->device >= deviceCount_ ) + return paInvalidDevice; + + outputHostApiIndex = FindHostApi( outputParameters->device, hostApiOutputDevice ); + if( outputHostApiIndex < 0 ) + return paInternalError; + + *hostApi = hostApis_[outputHostApiIndex]; + + if( outputParameters->channelCount <= 0 ) + return paInvalidChannelCount; + + if( !SampleFormatIsValid( outputParameters->sampleFormat ) ) + return paSampleFormatNotSupported; + + if( outputParameters->hostApiSpecificStreamInfo != NULL ) + { + if( ((PaUtilHostApiSpecificStreamInfoHeader*)outputParameters->hostApiSpecificStreamInfo)->hostApiType + != (*hostApi)->info.type ) + return paIncompatibleHostApiSpecificStreamInfo; + } + } + + if( (inputParameters != NULL) && (outputParameters != NULL) ) + { + /* ensure that both devices use the same API */ + if( inputHostApiIndex != outputHostApiIndex ) + return paBadIODeviceCombination; + } + } + + + /* Check for absurd sample rates. */ + if( (sampleRate < 1000.0) || (sampleRate > 200000.0) ) + return paInvalidSampleRate; + + if( ((streamFlags & ~paPlatformSpecificFlags) & ~(paClipOff | paDitherOff | paNeverDropInput | paPrimeOutputBuffersUsingStreamCallback ) ) != 0 ) + return paInvalidFlag; + + if( streamFlags & paNeverDropInput ) + { + /* must be a callback stream */ + if( !streamCallback ) + return paInvalidFlag; + + /* must be a full duplex stream */ + if( (inputParameters == NULL) || (outputParameters == NULL) ) + return paInvalidFlag; + + /* must use paFramesPerBufferUnspecified */ + if( framesPerBuffer != paFramesPerBufferUnspecified ) + return paInvalidFlag; + } + + return paNoError; +} + + +PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaError result; + PaUtilHostApiRepresentation *hostApi = 0; + PaDeviceIndex hostApiInputDevice = paNoDevice, hostApiOutputDevice = paNoDevice; + PaStreamParameters hostApiInputParameters, hostApiOutputParameters; + PaStreamParameters *hostApiInputParametersPtr, *hostApiOutputParametersPtr; + + +#ifdef PA_LOG_API_CALLS + PA_LOGAPI_ENTER_PARAMS( "Pa_IsFormatSupported" ); + + if( inputParameters == NULL ){ + PA_LOGAPI(("\tPaStreamParameters *inputParameters: NULL\n" )); + }else{ + PA_LOGAPI(("\tPaStreamParameters *inputParameters: 0x%p\n", inputParameters )); + PA_LOGAPI(("\tPaDeviceIndex inputParameters->device: %d\n", inputParameters->device )); + PA_LOGAPI(("\tint inputParameters->channelCount: %d\n", inputParameters->channelCount )); + PA_LOGAPI(("\tPaSampleFormat inputParameters->sampleFormat: %d\n", inputParameters->sampleFormat )); + PA_LOGAPI(("\tPaTime inputParameters->suggestedLatency: %f\n", inputParameters->suggestedLatency )); + PA_LOGAPI(("\tvoid *inputParameters->hostApiSpecificStreamInfo: 0x%p\n", inputParameters->hostApiSpecificStreamInfo )); + } + + if( outputParameters == NULL ){ + PA_LOGAPI(("\tPaStreamParameters *outputParameters: NULL\n" )); + }else{ + PA_LOGAPI(("\tPaStreamParameters *outputParameters: 0x%p\n", outputParameters )); + PA_LOGAPI(("\tPaDeviceIndex outputParameters->device: %d\n", outputParameters->device )); + PA_LOGAPI(("\tint outputParameters->channelCount: %d\n", outputParameters->channelCount )); + PA_LOGAPI(("\tPaSampleFormat outputParameters->sampleFormat: %d\n", outputParameters->sampleFormat )); + PA_LOGAPI(("\tPaTime outputParameters->suggestedLatency: %f\n", outputParameters->suggestedLatency )); + PA_LOGAPI(("\tvoid *outputParameters->hostApiSpecificStreamInfo: 0x%p\n", outputParameters->hostApiSpecificStreamInfo )); + } + + PA_LOGAPI(("\tdouble sampleRate: %g\n", sampleRate )); +#endif + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + + PA_LOGAPI_EXIT_PAERROR( "Pa_IsFormatSupported", result ); + return result; + } + + result = ValidateOpenStreamParameters( inputParameters, + outputParameters, + sampleRate, 0, paNoFlag, 0, + &hostApi, + &hostApiInputDevice, + &hostApiOutputDevice ); + if( result != paNoError ) + { + PA_LOGAPI_EXIT_PAERROR( "Pa_IsFormatSupported", result ); + return result; + } + + + if( inputParameters ) + { + hostApiInputParameters.device = hostApiInputDevice; + hostApiInputParameters.channelCount = inputParameters->channelCount; + hostApiInputParameters.sampleFormat = inputParameters->sampleFormat; + hostApiInputParameters.suggestedLatency = inputParameters->suggestedLatency; + hostApiInputParameters.hostApiSpecificStreamInfo = inputParameters->hostApiSpecificStreamInfo; + hostApiInputParametersPtr = &hostApiInputParameters; + } + else + { + hostApiInputParametersPtr = NULL; + } + + if( outputParameters ) + { + hostApiOutputParameters.device = hostApiOutputDevice; + hostApiOutputParameters.channelCount = outputParameters->channelCount; + hostApiOutputParameters.sampleFormat = outputParameters->sampleFormat; + hostApiOutputParameters.suggestedLatency = outputParameters->suggestedLatency; + hostApiOutputParameters.hostApiSpecificStreamInfo = outputParameters->hostApiSpecificStreamInfo; + hostApiOutputParametersPtr = &hostApiOutputParameters; + } + else + { + hostApiOutputParametersPtr = NULL; + } + + result = hostApi->IsFormatSupported( hostApi, + hostApiInputParametersPtr, hostApiOutputParametersPtr, + sampleRate ); + +#ifdef PA_LOG_API_CALLS + PA_LOGAPI(("Pa_OpenStream returned:\n" )); + if( result == paFormatIsSupported ) + PA_LOGAPI(("\tPaError: 0 [ paFormatIsSupported ]\n" )); + else + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); +#endif + + return result; +} + + +PaError Pa_OpenStream( PaStream** stream, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result; + PaUtilHostApiRepresentation *hostApi = 0; + PaDeviceIndex hostApiInputDevice = paNoDevice, hostApiOutputDevice = paNoDevice; + PaStreamParameters hostApiInputParameters, hostApiOutputParameters; + PaStreamParameters *hostApiInputParametersPtr, *hostApiOutputParametersPtr; + + +#ifdef PA_LOG_API_CALLS + PA_LOGAPI_ENTER_PARAMS( "Pa_OpenStream" ); + PA_LOGAPI(("\tPaStream** stream: 0x%p\n", stream )); + + if( inputParameters == NULL ){ + PA_LOGAPI(("\tPaStreamParameters *inputParameters: NULL\n" )); + }else{ + PA_LOGAPI(("\tPaStreamParameters *inputParameters: 0x%p\n", inputParameters )); + PA_LOGAPI(("\tPaDeviceIndex inputParameters->device: %d\n", inputParameters->device )); + PA_LOGAPI(("\tint inputParameters->channelCount: %d\n", inputParameters->channelCount )); + PA_LOGAPI(("\tPaSampleFormat inputParameters->sampleFormat: %d\n", inputParameters->sampleFormat )); + PA_LOGAPI(("\tPaTime inputParameters->suggestedLatency: %f\n", inputParameters->suggestedLatency )); + PA_LOGAPI(("\tvoid *inputParameters->hostApiSpecificStreamInfo: 0x%p\n", inputParameters->hostApiSpecificStreamInfo )); + } + + if( outputParameters == NULL ){ + PA_LOGAPI(("\tPaStreamParameters *outputParameters: NULL\n" )); + }else{ + PA_LOGAPI(("\tPaStreamParameters *outputParameters: 0x%p\n", outputParameters )); + PA_LOGAPI(("\tPaDeviceIndex outputParameters->device: %d\n", outputParameters->device )); + PA_LOGAPI(("\tint outputParameters->channelCount: %d\n", outputParameters->channelCount )); + PA_LOGAPI(("\tPaSampleFormat outputParameters->sampleFormat: %d\n", outputParameters->sampleFormat )); + PA_LOGAPI(("\tPaTime outputParameters->suggestedLatency: %f\n", outputParameters->suggestedLatency )); + PA_LOGAPI(("\tvoid *outputParameters->hostApiSpecificStreamInfo: 0x%p\n", outputParameters->hostApiSpecificStreamInfo )); + } + + PA_LOGAPI(("\tdouble sampleRate: %g\n", sampleRate )); + PA_LOGAPI(("\tunsigned long framesPerBuffer: %d\n", framesPerBuffer )); + PA_LOGAPI(("\tPaStreamFlags streamFlags: 0x%x\n", streamFlags )); + PA_LOGAPI(("\tPaStreamCallback *streamCallback: 0x%p\n", streamCallback )); + PA_LOGAPI(("\tvoid *userData: 0x%p\n", userData )); +#endif + + if( !PA_IS_INITIALISED_ ) + { + result = paNotInitialized; + + PA_LOGAPI(("Pa_OpenStream returned:\n" )); + PA_LOGAPI(("\t*(PaStream** stream): undefined\n" )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + return result; + } + + /* Check for parameter errors. + NOTE: make sure this validation list is kept syncronised with the one + in pa_hostapi.h + */ + + if( stream == NULL ) + { + result = paBadStreamPtr; + + PA_LOGAPI(("Pa_OpenStream returned:\n" )); + PA_LOGAPI(("\t*(PaStream** stream): undefined\n" )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + return result; + } + + result = ValidateOpenStreamParameters( inputParameters, + outputParameters, + sampleRate, framesPerBuffer, + streamFlags, streamCallback, + &hostApi, + &hostApiInputDevice, + &hostApiOutputDevice ); + if( result != paNoError ) + { + PA_LOGAPI(("Pa_OpenStream returned:\n" )); + PA_LOGAPI(("\t*(PaStream** stream): undefined\n" )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + return result; + } + + + if( inputParameters ) + { + hostApiInputParameters.device = hostApiInputDevice; + hostApiInputParameters.channelCount = inputParameters->channelCount; + hostApiInputParameters.sampleFormat = inputParameters->sampleFormat; + hostApiInputParameters.suggestedLatency = inputParameters->suggestedLatency; + hostApiInputParameters.hostApiSpecificStreamInfo = inputParameters->hostApiSpecificStreamInfo; + hostApiInputParametersPtr = &hostApiInputParameters; + } + else + { + hostApiInputParametersPtr = NULL; + } + + if( outputParameters ) + { + hostApiOutputParameters.device = hostApiOutputDevice; + hostApiOutputParameters.channelCount = outputParameters->channelCount; + hostApiOutputParameters.sampleFormat = outputParameters->sampleFormat; + hostApiOutputParameters.suggestedLatency = outputParameters->suggestedLatency; + hostApiOutputParameters.hostApiSpecificStreamInfo = outputParameters->hostApiSpecificStreamInfo; + hostApiOutputParametersPtr = &hostApiOutputParameters; + } + else + { + hostApiOutputParametersPtr = NULL; + } + + result = hostApi->OpenStream( hostApi, stream, + hostApiInputParametersPtr, hostApiOutputParametersPtr, + sampleRate, framesPerBuffer, streamFlags, streamCallback, userData ); + + if( result == paNoError ) + AddOpenStream( *stream ); + + + PA_LOGAPI(("Pa_OpenStream returned:\n" )); + PA_LOGAPI(("\t*(PaStream** stream): 0x%p\n", *stream )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + + return result; +} + + +PaError Pa_OpenDefaultStream( PaStream** stream, + int inputChannelCount, + int outputChannelCount, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result; + PaStreamParameters hostApiInputParameters, hostApiOutputParameters; + PaStreamParameters *hostApiInputParametersPtr, *hostApiOutputParametersPtr; + + PA_LOGAPI_ENTER_PARAMS( "Pa_OpenDefaultStream" ); + PA_LOGAPI(("\tPaStream** stream: 0x%p\n", stream )); + PA_LOGAPI(("\tint inputChannelCount: %d\n", inputChannelCount )); + PA_LOGAPI(("\tint outputChannelCount: %d\n", outputChannelCount )); + PA_LOGAPI(("\tPaSampleFormat sampleFormat: %d\n", sampleFormat )); + PA_LOGAPI(("\tdouble sampleRate: %g\n", sampleRate )); + PA_LOGAPI(("\tunsigned long framesPerBuffer: %d\n", framesPerBuffer )); + PA_LOGAPI(("\tPaStreamCallback *streamCallback: 0x%p\n", streamCallback )); + PA_LOGAPI(("\tvoid *userData: 0x%p\n", userData )); + + + if( inputChannelCount > 0 ) + { + hostApiInputParameters.device = Pa_GetDefaultInputDevice(); + if( hostApiInputParameters.device == paNoDevice ) + return paDeviceUnavailable; + + hostApiInputParameters.channelCount = inputChannelCount; + hostApiInputParameters.sampleFormat = sampleFormat; + /* defaultHighInputLatency is used below instead of + defaultLowInputLatency because it is more important for the default + stream to work reliably than it is for it to work with the lowest + latency. + */ + hostApiInputParameters.suggestedLatency = + Pa_GetDeviceInfo( hostApiInputParameters.device )->defaultHighInputLatency; + hostApiInputParameters.hostApiSpecificStreamInfo = NULL; + hostApiInputParametersPtr = &hostApiInputParameters; + } + else + { + hostApiInputParametersPtr = NULL; + } + + if( outputChannelCount > 0 ) + { + hostApiOutputParameters.device = Pa_GetDefaultOutputDevice(); + if( hostApiOutputParameters.device == paNoDevice ) + return paDeviceUnavailable; + + hostApiOutputParameters.channelCount = outputChannelCount; + hostApiOutputParameters.sampleFormat = sampleFormat; + /* defaultHighOutputLatency is used below instead of + defaultLowOutputLatency because it is more important for the default + stream to work reliably than it is for it to work with the lowest + latency. + */ + hostApiOutputParameters.suggestedLatency = + Pa_GetDeviceInfo( hostApiOutputParameters.device )->defaultHighOutputLatency; + hostApiOutputParameters.hostApiSpecificStreamInfo = NULL; + hostApiOutputParametersPtr = &hostApiOutputParameters; + } + else + { + hostApiOutputParametersPtr = NULL; + } + + + result = Pa_OpenStream( + stream, hostApiInputParametersPtr, hostApiOutputParametersPtr, + sampleRate, framesPerBuffer, paNoFlag, streamCallback, userData ); + + PA_LOGAPI(("Pa_OpenDefaultStream returned:\n" )); + PA_LOGAPI(("\t*(PaStream** stream): 0x%p", *stream )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + + return result; +} + + +PaError PaUtil_ValidateStreamPointer( PaStream* stream ) +{ + if( !PA_IS_INITIALISED_ ) return paNotInitialized; + + if( stream == NULL ) return paBadStreamPtr; + + if( ((PaUtilStreamRepresentation*)stream)->magic != PA_STREAM_MAGIC ) + return paBadStreamPtr; + + return paNoError; +} + + +PaError Pa_CloseStream( PaStream* stream ) +{ + PaUtilStreamInterface *interface; + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_CloseStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + /* always remove the open stream from our list, even if this function + eventually returns an error. Otherwise CloseOpenStreams() will + get stuck in an infinite loop */ + RemoveOpenStream( stream ); /* be sure to call this _before_ closing the stream */ + + if( result == paNoError ) + { + interface = PA_STREAM_INTERFACE(stream); + + /* abort the stream if it isn't stopped */ + result = interface->IsStopped( stream ); + if( result == 1 ) + result = paNoError; + else if( result == 0 ) + result = interface->Abort( stream ); + + if( result == paNoError ) /** @todo REVIEW: shouldn't we close anyway? see: http://www.portaudio.com/trac/ticket/115 */ + result = interface->Close( stream ); + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_CloseStream", result ); + + return result; +} + + +PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_SetStreamFinishedCallback" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + PA_LOGAPI(("\tPaStreamFinishedCallback* streamFinishedCallback: 0x%p\n", streamFinishedCallback )); + + if( result == paNoError ) + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = paStreamIsNotStopped ; + } + if( result == 1 ) + { + PA_STREAM_REP( stream )->streamFinishedCallback = streamFinishedCallback; + result = paNoError; + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_SetStreamFinishedCallback", result ); + + return result; + +} + + +PaError Pa_StartStream( PaStream *stream ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_StartStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = paStreamIsNotStopped ; + } + else if( result == 1 ) + { + result = PA_STREAM_INTERFACE(stream)->Start( stream ); + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_StartStream", result ); + + return result; +} + + +PaError Pa_StopStream( PaStream *stream ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_StopStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = PA_STREAM_INTERFACE(stream)->Stop( stream ); + } + else if( result == 1 ) + { + result = paStreamIsStopped; + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_StopStream", result ); + + return result; +} + + +PaError Pa_AbortStream( PaStream *stream ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_AbortStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = PA_STREAM_INTERFACE(stream)->Abort( stream ); + } + else if( result == 1 ) + { + result = paStreamIsStopped; + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_AbortStream", result ); + + return result; +} + + +PaError Pa_IsStreamStopped( PaStream *stream ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_IsStreamStopped" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + + PA_LOGAPI_EXIT_PAERROR( "Pa_IsStreamStopped", result ); + + return result; +} + + +PaError Pa_IsStreamActive( PaStream *stream ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_IsStreamActive" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + result = PA_STREAM_INTERFACE(stream)->IsActive( stream ); + + + PA_LOGAPI_EXIT_PAERROR( "Pa_IsStreamActive", result ); + + return result; +} + + +const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); + const PaStreamInfo *result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetStreamInfo" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( error != paNoError ) + { + result = 0; + + PA_LOGAPI(("Pa_GetStreamInfo returned:\n" )); + PA_LOGAPI(("\tconst PaStreamInfo*: 0 [PaError error:%d ( %s )]\n", error, Pa_GetErrorText( error ) )); + + } + else + { + result = &PA_STREAM_REP( stream )->streamInfo; + + PA_LOGAPI(("Pa_GetStreamInfo returned:\n" )); + PA_LOGAPI(("\tconst PaStreamInfo*: 0x%p:\n", result )); + PA_LOGAPI(("\t{" )); + + PA_LOGAPI(("\t\tint structVersion: %d\n", result->structVersion )); + PA_LOGAPI(("\t\tPaTime inputLatency: %f\n", result->inputLatency )); + PA_LOGAPI(("\t\tPaTime outputLatency: %f\n", result->outputLatency )); + PA_LOGAPI(("\t\tdouble sampleRate: %f\n", result->sampleRate )); + PA_LOGAPI(("\t}\n" )); + + } + + return result; +} + + +PaTime Pa_GetStreamTime( PaStream *stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); + PaTime result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetStreamTime" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( error != paNoError ) + { + result = 0; + + PA_LOGAPI(("Pa_GetStreamTime returned:\n" )); + PA_LOGAPI(("\tPaTime: 0 [PaError error:%d ( %s )]\n", result, error, Pa_GetErrorText( error ) )); + + } + else + { + result = PA_STREAM_INTERFACE(stream)->GetTime( stream ); + + PA_LOGAPI(("Pa_GetStreamTime returned:\n" )); + PA_LOGAPI(("\tPaTime: %g\n", result )); + + } + + return result; +} + + +double Pa_GetStreamCpuLoad( PaStream* stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); + double result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetStreamCpuLoad" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( error != paNoError ) + { + + result = 0.0; + + PA_LOGAPI(("Pa_GetStreamCpuLoad returned:\n" )); + PA_LOGAPI(("\tdouble: 0.0 [PaError error: %d ( %s )]\n", error, Pa_GetErrorText( error ) )); + + } + else + { + result = PA_STREAM_INTERFACE(stream)->GetCpuLoad( stream ); + + PA_LOGAPI(("Pa_GetStreamCpuLoad returned:\n" )); + PA_LOGAPI(("\tdouble: %g\n", result )); + + } + + return result; +} + + +PaError Pa_ReadStream( PaStream* stream, + void *buffer, + unsigned long frames ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_ReadStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + { + if( frames == 0 ) + { + /* @todo Should we not allow the implementation to signal any overflow condition? see: http://www.portaudio.com/trac/ticket/116*/ + result = paNoError; + } + else if( buffer == 0 ) + { + result = paBadBufferPtr; + } + else + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = PA_STREAM_INTERFACE(stream)->Read( stream, buffer, frames ); + } + else if( result == 1 ) + { + result = paStreamIsStopped; + } + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_ReadStream", result ); + + return result; +} + + +PaError Pa_WriteStream( PaStream* stream, + const void *buffer, + unsigned long frames ) +{ + PaError result = PaUtil_ValidateStreamPointer( stream ); + + PA_LOGAPI_ENTER_PARAMS( "Pa_WriteStream" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( result == paNoError ) + { + if( frames == 0 ) + { + /* @todo Should we not allow the implementation to signal any underflow condition? see: http://www.portaudio.com/trac/ticket/116*/ + result = paNoError; + } + else if( buffer == 0 ) + { + result = paBadBufferPtr; + } + else + { + result = PA_STREAM_INTERFACE(stream)->IsStopped( stream ); + if( result == 0 ) + { + result = PA_STREAM_INTERFACE(stream)->Write( stream, buffer, frames ); + } + else if( result == 1 ) + { + result = paStreamIsStopped; + } + } + } + + PA_LOGAPI_EXIT_PAERROR( "Pa_WriteStream", result ); + + return result; +} + +signed long Pa_GetStreamReadAvailable( PaStream* stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); + signed long result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetStreamReadAvailable" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( error != paNoError ) + { + result = 0; + + PA_LOGAPI(("Pa_GetStreamReadAvailable returned:\n" )); + PA_LOGAPI(("\tunsigned long: 0 [ PaError error: %d ( %s ) ]\n", error, Pa_GetErrorText( error ) )); + + } + else + { + result = PA_STREAM_INTERFACE(stream)->GetReadAvailable( stream ); + + PA_LOGAPI(("Pa_GetStreamReadAvailable returned:\n" )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + + } + + return result; +} + + +signed long Pa_GetStreamWriteAvailable( PaStream* stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); + signed long result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetStreamWriteAvailable" ); + PA_LOGAPI(("\tPaStream* stream: 0x%p\n", stream )); + + if( error != paNoError ) + { + result = 0; + + PA_LOGAPI(("Pa_GetStreamWriteAvailable returned:\n" )); + PA_LOGAPI(("\tunsigned long: 0 [ PaError error: %d ( %s ) ]\n", error, Pa_GetErrorText( error ) )); + + } + else + { + result = PA_STREAM_INTERFACE(stream)->GetWriteAvailable( stream ); + + PA_LOGAPI(("Pa_GetStreamWriteAvailable returned:\n" )); + PA_LOGAPI(("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) )); + + } + + return result; +} + + +PaError Pa_GetSampleSize( PaSampleFormat format ) +{ + int result; + + PA_LOGAPI_ENTER_PARAMS( "Pa_GetSampleSize" ); + PA_LOGAPI(("\tPaSampleFormat format: %d\n", format )); + + switch( format & ~paNonInterleaved ) + { + + case paUInt8: + case paInt8: + result = 1; + break; + + case paInt16: + result = 2; + break; + + case paInt24: + result = 3; + break; + + case paFloat32: + case paInt32: + result = 4; + break; + + default: + result = paSampleFormatNotSupported; + break; + } + + PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_GetSampleSize", "int: %d", result ); + + return (PaError) result; +} + diff --git a/Externals/portaudio/src/common/pa_hostapi.h b/Externals/portaudio/src/common/pa_hostapi.h new file mode 100644 index 0000000000..1437f629dc --- /dev/null +++ b/Externals/portaudio/src/common/pa_hostapi.h @@ -0,0 +1,362 @@ +#ifndef PA_HOSTAPI_H +#define PA_HOSTAPI_H +/* + * $Id: pa_hostapi.h 1740 2011-08-25 07:17:48Z philburk $ + * Portable Audio I/O Library + * host api representation + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Interfaces and representation structures used by pa_front.c + to manage and communicate with host API implementations. +*/ + +#include "portaudio.h" + +/** +The PA_NO_* host API macros are now deprecated in favor of PA_USE_* macros. +PA_USE_* indicates whether a particular host API will be initialized by PortAudio. +An undefined or 0 value indicates that the host API will not be used. A value of 1 +indicates that the host API will be used. PA_USE_* macros should be left undefined +or defined to either 0 or 1. + +The code below ensures that PA_USE_* macros are always defined and have value +0 or 1. Undefined symbols are defaulted to 0. Symbols that are neither 0 nor 1 +are defaulted to 1. +*/ + +#ifndef PA_USE_SKELETON +#define PA_USE_SKELETON 0 +#elif (PA_USE_SKELETON != 0) && (PA_USE_SKELETON != 1) +#undef PA_USE_SKELETON +#define PA_USE_SKELETON 1 +#endif + +#if defined(PA_NO_ASIO) || defined(PA_NO_DS) || defined(PA_NO_WMME) || defined(PA_NO_WASAPI) || defined(PA_NO_WDMKS) +#error "Portaudio: PA_NO_ is no longer supported, please remove definition and use PA_USE_ instead" +#endif + +#ifndef PA_USE_ASIO +#define PA_USE_ASIO 0 +#elif (PA_USE_ASIO != 0) && (PA_USE_ASIO != 1) +#undef PA_USE_ASIO +#define PA_USE_ASIO 1 +#endif + +#ifndef PA_USE_DS +#define PA_USE_DS 0 +#elif (PA_USE_DS != 0) && (PA_USE_DS != 1) +#undef PA_USE_DS +#define PA_USE_DS 1 +#endif + +#ifndef PA_USE_WMME +#define PA_USE_WMME 0 +#elif (PA_USE_WMME != 0) && (PA_USE_WMME != 1) +#undef PA_USE_WMME +#define PA_USE_WMME 1 +#endif + +#ifndef PA_USE_WASAPI +#define PA_USE_WASAPI 0 +#elif (PA_USE_WASAPI != 0) && (PA_USE_WASAPI != 1) +#undef PA_USE_WASAPI +#define PA_USE_WASAPI 1 +#endif + +#ifndef PA_USE_WDMKS +#define PA_USE_WDMKS 0 +#elif (PA_USE_WDMKS != 0) && (PA_USE_WDMKS != 1) +#undef PA_USE_WDMKS +#define PA_USE_WDMKS 1 +#endif + +/* Set default values for Unix based APIs. */ +#if defined(PA_NO_OSS) || defined(PA_NO_ALSA) || defined(PA_NO_JACK) || defined(PA_NO_COREAUDIO) || defined(PA_NO_SGI) || defined(PA_NO_ASIHPI) +#error "Portaudio: PA_NO_ is no longer supported, please remove definition and use PA_USE_ instead" +#endif + +#ifndef PA_USE_OSS +#define PA_USE_OSS 0 +#elif (PA_USE_OSS != 0) && (PA_USE_OSS != 1) +#undef PA_USE_OSS +#define PA_USE_OSS 1 +#endif + +#ifndef PA_USE_ALSA +#define PA_USE_ALSA 0 +#elif (PA_USE_ALSA != 0) && (PA_USE_ALSA != 1) +#undef PA_USE_ALSA +#define PA_USE_ALSA 1 +#endif + +#ifndef PA_USE_JACK +#define PA_USE_JACK 0 +#elif (PA_USE_JACK != 0) && (PA_USE_JACK != 1) +#undef PA_USE_JACK +#define PA_USE_JACK 1 +#endif + +#ifndef PA_USE_SGI +#define PA_USE_SGI 0 +#elif (PA_USE_SGI != 0) && (PA_USE_SGI != 1) +#undef PA_USE_SGI +#define PA_USE_SGI 1 +#endif + +#ifndef PA_USE_COREAUDIO +#define PA_USE_COREAUDIO 0 +#elif (PA_USE_COREAUDIO != 0) && (PA_USE_COREAUDIO != 1) +#undef PA_USE_COREAUDIO +#define PA_USE_COREAUDIO 1 +#endif + +#ifndef PA_USE_ASIHPI +#define PA_USE_ASIHPI 0 +#elif (PA_USE_ASIHPI != 0) && (PA_USE_ASIHPI != 1) +#undef PA_USE_ASIHPI +#define PA_USE_ASIHPI 1 +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** **FOR THE USE OF pa_front.c ONLY** + Do NOT use fields in this structure, they my change at any time. + Use functions defined in pa_util.h if you think you need functionality + which can be derived from here. +*/ +typedef struct PaUtilPrivatePaFrontHostApiInfo { + + + unsigned long baseDeviceIndex; +}PaUtilPrivatePaFrontHostApiInfo; + + +/** The common header for all data structures whose pointers are passed through + the hostApiSpecificStreamInfo field of the PaStreamParameters structure. + Note that in order to keep the public PortAudio interface clean, this structure + is not used explicitly when declaring hostApiSpecificStreamInfo data structures. + However, some code in pa_front depends on the first 3 members being equivalent + with this structure. + @see PaStreamParameters +*/ +typedef struct PaUtilHostApiSpecificStreamInfoHeader +{ + unsigned long size; /**< size of whole structure including this header */ + PaHostApiTypeId hostApiType; /**< host API for which this data is intended */ + unsigned long version; /**< structure version */ +} PaUtilHostApiSpecificStreamInfoHeader; + + + +/** A structure representing the interface to a host API. Contains both + concrete data and pointers to functions which implement the interface. +*/ +typedef struct PaUtilHostApiRepresentation { + PaUtilPrivatePaFrontHostApiInfo privatePaFrontInfo; + + /** The host api implementation should populate the info field. In the + case of info.defaultInputDevice and info.defaultOutputDevice the + values stored should be 0 based indices within the host api's own + device index range (0 to deviceCount). These values will be converted + to global device indices by pa_front after PaUtilHostApiInitializer() + returns. + */ + PaHostApiInfo info; + + PaDeviceInfo** deviceInfos; + + /** + (*Terminate)() is guaranteed to be called with a valid + parameter, which was previously returned from the same implementation's + initializer. + */ + void (*Terminate)( struct PaUtilHostApiRepresentation *hostApi ); + + /** + The inputParameters and outputParameters pointers should not be saved + as they will not remain valid after OpenStream is called. + + + The following guarantees are made about parameters to (*OpenStream)(): + + [NOTE: the following list up to *END PA FRONT VALIDATIONS* should be + kept in sync with the one for ValidateOpenStreamParameters and + Pa_OpenStream in pa_front.c] + + PaHostApiRepresentation *hostApi + - is valid for this implementation + + PaStream** stream + - is non-null + + - at least one of inputParameters & outputParmeters is valid (not NULL) + + - if inputParameters & outputParmeters are both valid, that + inputParameters->device & outputParmeters->device both use the same host api + + PaDeviceIndex inputParameters->device + - is within range (0 to Pa_CountDevices-1) Or: + - is paUseHostApiSpecificDeviceSpecification and + inputParameters->hostApiSpecificStreamInfo is non-NULL and refers + to a valid host api + + int inputParameters->numChannels + - if inputParameters->device is not paUseHostApiSpecificDeviceSpecification, numInputChannels is > 0 + - upper bound is NOT validated against device capabilities + + PaSampleFormat inputParameters->sampleFormat + - is one of the sample formats defined in portaudio.h + + void *inputParameters->hostApiSpecificStreamInfo + - if supplied its hostApi field matches the input device's host Api + + PaDeviceIndex outputParmeters->device + - is within range (0 to Pa_CountDevices-1) + + int outputParmeters->numChannels + - if inputDevice is valid, numInputChannels is > 0 + - upper bound is NOT validated against device capabilities + + PaSampleFormat outputParmeters->sampleFormat + - is one of the sample formats defined in portaudio.h + + void *outputParmeters->hostApiSpecificStreamInfo + - if supplied its hostApi field matches the output device's host Api + + double sampleRate + - is not an 'absurd' rate (less than 1000. or greater than 200000.) + - sampleRate is NOT validated against device capabilities + + PaStreamFlags streamFlags + - unused platform neutral flags are zero + - paNeverDropInput is only used for full-duplex callback streams + with variable buffer size (paFramesPerBufferUnspecified) + + [*END PA FRONT VALIDATIONS*] + + + The following validations MUST be performed by (*OpenStream)(): + + - check that input device can support numInputChannels + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - if inputStreamInfo is supplied, validate its contents, + or return an error if no inputStreamInfo is expected + + - check that output device can support numOutputChannels + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - if outputStreamInfo is supplied, validate its contents, + or return an error if no outputStreamInfo is expected + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + + - check that the device supports sampleRate + + - alter sampleRate to a close allowable rate if necessary + + - validate inputLatency and outputLatency + + - validate any platform specific flags, if flags are supplied they + must be valid. + */ + PaError (*OpenStream)( struct PaUtilHostApiRepresentation *hostApi, + PaStream** stream, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerCallback, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); + + + PaError (*IsFormatSupported)( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +} PaUtilHostApiRepresentation; + + +/** Prototype for the initialization function which must be implemented by every + host API. + + This function should only return an error other than paNoError if it encounters + an unexpected and fatal error (memory allocation error for example). In general, + there may be conditions under which it returns a NULL interface pointer and also + returns paNoError. For example, if the ASIO implementation detects that ASIO is + not installed, it should return a NULL interface, and paNoError. + + @see paHostApiInitializers +*/ +typedef PaError PaUtilHostApiInitializer( PaUtilHostApiRepresentation**, PaHostApiIndex ); + + +/** paHostApiInitializers is a NULL-terminated array of host API initialization + functions. These functions are called by pa_front.c to initialize the host APIs + when the client calls Pa_Initialize(). + + The initialization functions are invoked in order. + + The first successfully initialized host API that has a default input *or* output + device is used as the default PortAudio host API. This is based on the logic that + there is only one default host API, and it must contain the default input and output + devices (if defined). + + There is a platform specific file that defines paHostApiInitializers for that + platform, pa_win/pa_win_hostapis.c contains the Win32 definitions for example. +*/ +extern PaUtilHostApiInitializer *paHostApiInitializers[]; + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_HOSTAPI_H */ diff --git a/Externals/portaudio/src/common/pa_memorybarrier.h b/Externals/portaudio/src/common/pa_memorybarrier.h new file mode 100644 index 0000000000..2879ce33ad --- /dev/null +++ b/Externals/portaudio/src/common/pa_memorybarrier.h @@ -0,0 +1,128 @@ +/* + * $Id: pa_memorybarrier.h 1240 2007-07-17 13:05:07Z bjornroche $ + * Portable Audio I/O Library + * Memory barrier utilities + * + * Author: Bjorn Roche, XO Audio, LLC + * + * This program uses the PortAudio Portable Audio Library. + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file pa_memorybarrier.h + @ingroup common_src +*/ + +/**************** + * Some memory barrier primitives based on the system. + * right now only OS X, FreeBSD, and Linux are supported. In addition to providing + * memory barriers, these functions should ensure that data cached in registers + * is written out to cache where it can be snooped by other CPUs. (ie, the volatile + * keyword should not be required) + * + * the primitives that must be defined are: + * + * PaUtil_FullMemoryBarrier() + * PaUtil_ReadMemoryBarrier() + * PaUtil_WriteMemoryBarrier() + * + ****************/ + +#if defined(__APPLE__) +# include + /* Here are the memory barrier functions. Mac OS X only provides + full memory barriers, so the three types of barriers are the same, + however, these barriers are superior to compiler-based ones. */ +# define PaUtil_FullMemoryBarrier() OSMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() OSMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() OSMemoryBarrier() +#elif defined(__GNUC__) + /* GCC >= 4.1 has built-in intrinsics. We'll use those */ +# if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) +# define PaUtil_FullMemoryBarrier() __sync_synchronize() +# define PaUtil_ReadMemoryBarrier() __sync_synchronize() +# define PaUtil_WriteMemoryBarrier() __sync_synchronize() + /* as a fallback, GCC understands volatile asm and "memory" to mean it + * should not reorder memory read/writes */ + /* Note that it is not clear that any compiler actually defines __PPC__, + * it can probably removed safely. */ +# elif defined( __ppc__ ) || defined( __powerpc__) || defined( __PPC__ ) +# define PaUtil_FullMemoryBarrier() asm volatile("sync":::"memory") +# define PaUtil_ReadMemoryBarrier() asm volatile("sync":::"memory") +# define PaUtil_WriteMemoryBarrier() asm volatile("sync":::"memory") +# elif defined( __i386__ ) || defined( __i486__ ) || defined( __i586__ ) || \ + defined( __i686__ ) || defined( __x86_64__ ) +# define PaUtil_FullMemoryBarrier() asm volatile("mfence":::"memory") +# define PaUtil_ReadMemoryBarrier() asm volatile("lfence":::"memory") +# define PaUtil_WriteMemoryBarrier() asm volatile("sfence":::"memory") +# else +# ifdef ALLOW_SMP_DANGERS +# warning Memory barriers not defined on this system or system unknown +# warning For SMP safety, you should fix this. +# define PaUtil_FullMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() +# else +# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. +# endif +# endif +#elif (_MSC_VER >= 1400) && !defined(_WIN32_WCE) +# include +# pragma intrinsic(_ReadWriteBarrier) +# pragma intrinsic(_ReadBarrier) +# pragma intrinsic(_WriteBarrier) +/* note that MSVC intrinsics _ReadWriteBarrier(), _ReadBarrier(), _WriteBarrier() are just compiler barriers *not* memory barriers */ +# define PaUtil_FullMemoryBarrier() _ReadWriteBarrier() +# define PaUtil_ReadMemoryBarrier() _ReadBarrier() +# define PaUtil_WriteMemoryBarrier() _WriteBarrier() +#elif defined(_WIN32_WCE) +# define PaUtil_FullMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() +#elif defined(_MSC_VER) || defined(__BORLANDC__) +# define PaUtil_FullMemoryBarrier() _asm { lock add [esp], 0 } +# define PaUtil_ReadMemoryBarrier() _asm { lock add [esp], 0 } +# define PaUtil_WriteMemoryBarrier() _asm { lock add [esp], 0 } +#else +# ifdef ALLOW_SMP_DANGERS +# warning Memory barriers not defined on this system or system unknown +# warning For SMP safety, you should fix this. +# define PaUtil_FullMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() +# else +# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. +# endif +#endif diff --git a/Externals/portaudio/src/common/pa_process.c b/Externals/portaudio/src/common/pa_process.c new file mode 100644 index 0000000000..383f9cafa5 --- /dev/null +++ b/Externals/portaudio/src/common/pa_process.c @@ -0,0 +1,1827 @@ +/* + * $Id: pa_process.c 1706 2011-07-21 18:44:58Z philburk $ + * Portable Audio I/O Library + * streamCallback <-> host buffer processing adapter + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Buffer Processor implementation. +*/ + + +#include +#include /* memset() */ + +#include "pa_process.h" +#include "pa_util.h" + + +#define PA_FRAMES_PER_TEMP_BUFFER_WHEN_HOST_BUFFER_SIZE_IS_UNKNOWN_ 1024 + +#define PA_MIN_( a, b ) ( ((a)<(b)) ? (a) : (b) ) + + +/* greatest common divisor - PGCD in French */ +static unsigned long GCD( unsigned long a, unsigned long b ) +{ + return (b==0) ? a : GCD( b, a%b); +} + +/* least common multiple - PPCM in French */ +static unsigned long LCM( unsigned long a, unsigned long b ) +{ + return (a*b) / GCD(a,b); +} + +#define PA_MAX_( a, b ) (((a) > (b)) ? (a) : (b)) + +static unsigned long CalculateFrameShift( unsigned long M, unsigned long N ) +{ + unsigned long result = 0; + unsigned long i; + unsigned long lcm; + + assert( M > 0 ); + assert( N > 0 ); + + lcm = LCM( M, N ); + for( i = M; i < lcm; i += M ) + result = PA_MAX_( result, i % N ); + + return result; +} + + +PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, + int inputChannelCount, PaSampleFormat userInputSampleFormat, + PaSampleFormat hostInputSampleFormat, + int outputChannelCount, PaSampleFormat userOutputSampleFormat, + PaSampleFormat hostOutputSampleFormat, + double sampleRate, + PaStreamFlags streamFlags, + unsigned long framesPerUserBuffer, + unsigned long framesPerHostBuffer, + PaUtilHostBufferSizeMode hostBufferSizeMode, + PaStreamCallback *streamCallback, void *userData ) +{ + PaError result = paNoError; + PaError bytesPerSample; + unsigned long tempInputBufferSize, tempOutputBufferSize; + PaStreamFlags tempInputStreamFlags; + + if( streamFlags & paNeverDropInput ) + { + /* paNeverDropInput is only valid for full-duplex callback streams, with an unspecified number of frames per buffer. */ + if( !streamCallback || !(inputChannelCount > 0 && outputChannelCount > 0) || + framesPerUserBuffer != paFramesPerBufferUnspecified ) + return paInvalidFlag; + } + + /* initialize buffer ptrs to zero so they can be freed if necessary in error */ + bp->tempInputBuffer = 0; + bp->tempInputBufferPtrs = 0; + bp->tempOutputBuffer = 0; + bp->tempOutputBufferPtrs = 0; + + bp->framesPerUserBuffer = framesPerUserBuffer; + bp->framesPerHostBuffer = framesPerHostBuffer; + + bp->inputChannelCount = inputChannelCount; + bp->outputChannelCount = outputChannelCount; + + bp->hostBufferSizeMode = hostBufferSizeMode; + + bp->hostInputChannels[0] = bp->hostInputChannels[1] = 0; + bp->hostOutputChannels[0] = bp->hostOutputChannels[1] = 0; + + if( framesPerUserBuffer == 0 ) /* streamCallback will accept any buffer size */ + { + bp->useNonAdaptingProcess = 1; + bp->initialFramesInTempInputBuffer = 0; + bp->initialFramesInTempOutputBuffer = 0; + + if( hostBufferSizeMode == paUtilFixedHostBufferSize + || hostBufferSizeMode == paUtilBoundedHostBufferSize ) + { + bp->framesPerTempBuffer = framesPerHostBuffer; + } + else /* unknown host buffer size */ + { + bp->framesPerTempBuffer = PA_FRAMES_PER_TEMP_BUFFER_WHEN_HOST_BUFFER_SIZE_IS_UNKNOWN_; + } + } + else + { + bp->framesPerTempBuffer = framesPerUserBuffer; + + if( hostBufferSizeMode == paUtilFixedHostBufferSize + && framesPerHostBuffer % framesPerUserBuffer == 0 ) + { + bp->useNonAdaptingProcess = 1; + bp->initialFramesInTempInputBuffer = 0; + bp->initialFramesInTempOutputBuffer = 0; + } + else + { + bp->useNonAdaptingProcess = 0; + + if( inputChannelCount > 0 && outputChannelCount > 0 ) + { + /* full duplex */ + if( hostBufferSizeMode == paUtilFixedHostBufferSize ) + { + unsigned long frameShift = + CalculateFrameShift( framesPerHostBuffer, framesPerUserBuffer ); + + if( framesPerUserBuffer > framesPerHostBuffer ) + { + bp->initialFramesInTempInputBuffer = frameShift; + bp->initialFramesInTempOutputBuffer = 0; + } + else + { + bp->initialFramesInTempInputBuffer = 0; + bp->initialFramesInTempOutputBuffer = frameShift; + } + } + else /* variable host buffer size, add framesPerUserBuffer latency */ + { + bp->initialFramesInTempInputBuffer = 0; + bp->initialFramesInTempOutputBuffer = framesPerUserBuffer; + } + } + else + { + /* half duplex */ + bp->initialFramesInTempInputBuffer = 0; + bp->initialFramesInTempOutputBuffer = 0; + } + } + } + + + bp->framesInTempInputBuffer = bp->initialFramesInTempInputBuffer; + bp->framesInTempOutputBuffer = bp->initialFramesInTempOutputBuffer; + + + if( inputChannelCount > 0 ) + { + bytesPerSample = Pa_GetSampleSize( hostInputSampleFormat ); + if( bytesPerSample > 0 ) + { + bp->bytesPerHostInputSample = bytesPerSample; + } + else + { + result = bytesPerSample; + goto error; + } + + bytesPerSample = Pa_GetSampleSize( userInputSampleFormat ); + if( bytesPerSample > 0 ) + { + bp->bytesPerUserInputSample = bytesPerSample; + } + else + { + result = bytesPerSample; + goto error; + } + + /* Under the assumption that no ADC in existence delivers better than 24bits resolution, + we disable dithering when host input format is paInt32 and user format is paInt24, + since the host samples will just be padded with zeros anyway. */ + + tempInputStreamFlags = streamFlags; + if( !(tempInputStreamFlags & paDitherOff) /* dither is on */ + && (hostInputSampleFormat & paInt32) /* host input format is int32 */ + && (userInputSampleFormat & paInt24) /* user requested format is int24 */ ){ + + tempInputStreamFlags = tempInputStreamFlags | paDitherOff; + } + + bp->inputConverter = + PaUtil_SelectConverter( hostInputSampleFormat, userInputSampleFormat, tempInputStreamFlags ); + + bp->inputZeroer = PaUtil_SelectZeroer( hostInputSampleFormat ); + + bp->userInputIsInterleaved = (userInputSampleFormat & paNonInterleaved)?0:1; + + bp->hostInputIsInterleaved = (hostInputSampleFormat & paNonInterleaved)?0:1; + + bp->userInputSampleFormatIsEqualToHost = ((userInputSampleFormat & ~paNonInterleaved) == (hostInputSampleFormat & ~paNonInterleaved)); + + tempInputBufferSize = + bp->framesPerTempBuffer * bp->bytesPerUserInputSample * inputChannelCount; + + bp->tempInputBuffer = PaUtil_AllocateMemory( tempInputBufferSize ); + if( bp->tempInputBuffer == 0 ) + { + result = paInsufficientMemory; + goto error; + } + + if( bp->framesInTempInputBuffer > 0 ) + memset( bp->tempInputBuffer, 0, tempInputBufferSize ); + + if( userInputSampleFormat & paNonInterleaved ) + { + bp->tempInputBufferPtrs = + (void **)PaUtil_AllocateMemory( sizeof(void*)*inputChannelCount ); + if( bp->tempInputBufferPtrs == 0 ) + { + result = paInsufficientMemory; + goto error; + } + } + + bp->hostInputChannels[0] = (PaUtilChannelDescriptor*) + PaUtil_AllocateMemory( sizeof(PaUtilChannelDescriptor) * inputChannelCount * 2); + if( bp->hostInputChannels[0] == 0 ) + { + result = paInsufficientMemory; + goto error; + } + + bp->hostInputChannels[1] = &bp->hostInputChannels[0][inputChannelCount]; + } + + if( outputChannelCount > 0 ) + { + bytesPerSample = Pa_GetSampleSize( hostOutputSampleFormat ); + if( bytesPerSample > 0 ) + { + bp->bytesPerHostOutputSample = bytesPerSample; + } + else + { + result = bytesPerSample; + goto error; + } + + bytesPerSample = Pa_GetSampleSize( userOutputSampleFormat ); + if( bytesPerSample > 0 ) + { + bp->bytesPerUserOutputSample = bytesPerSample; + } + else + { + result = bytesPerSample; + goto error; + } + + bp->outputConverter = + PaUtil_SelectConverter( userOutputSampleFormat, hostOutputSampleFormat, streamFlags ); + + bp->outputZeroer = PaUtil_SelectZeroer( hostOutputSampleFormat ); + + bp->userOutputIsInterleaved = (userOutputSampleFormat & paNonInterleaved)?0:1; + + bp->hostOutputIsInterleaved = (hostOutputSampleFormat & paNonInterleaved)?0:1; + + bp->userOutputSampleFormatIsEqualToHost = ((userOutputSampleFormat & ~paNonInterleaved) == (hostOutputSampleFormat & ~paNonInterleaved)); + + tempOutputBufferSize = + bp->framesPerTempBuffer * bp->bytesPerUserOutputSample * outputChannelCount; + + bp->tempOutputBuffer = PaUtil_AllocateMemory( tempOutputBufferSize ); + if( bp->tempOutputBuffer == 0 ) + { + result = paInsufficientMemory; + goto error; + } + + if( bp->framesInTempOutputBuffer > 0 ) + memset( bp->tempOutputBuffer, 0, tempOutputBufferSize ); + + if( userOutputSampleFormat & paNonInterleaved ) + { + bp->tempOutputBufferPtrs = + (void **)PaUtil_AllocateMemory( sizeof(void*)*outputChannelCount ); + if( bp->tempOutputBufferPtrs == 0 ) + { + result = paInsufficientMemory; + goto error; + } + } + + bp->hostOutputChannels[0] = (PaUtilChannelDescriptor*) + PaUtil_AllocateMemory( sizeof(PaUtilChannelDescriptor)*outputChannelCount * 2 ); + if( bp->hostOutputChannels[0] == 0 ) + { + result = paInsufficientMemory; + goto error; + } + + bp->hostOutputChannels[1] = &bp->hostOutputChannels[0][outputChannelCount]; + } + + PaUtil_InitializeTriangularDitherState( &bp->ditherGenerator ); + + bp->samplePeriod = 1. / sampleRate; + + bp->streamCallback = streamCallback; + bp->userData = userData; + + return result; + +error: + if( bp->tempInputBuffer ) + PaUtil_FreeMemory( bp->tempInputBuffer ); + + if( bp->tempInputBufferPtrs ) + PaUtil_FreeMemory( bp->tempInputBufferPtrs ); + + if( bp->hostInputChannels[0] ) + PaUtil_FreeMemory( bp->hostInputChannels[0] ); + + if( bp->tempOutputBuffer ) + PaUtil_FreeMemory( bp->tempOutputBuffer ); + + if( bp->tempOutputBufferPtrs ) + PaUtil_FreeMemory( bp->tempOutputBufferPtrs ); + + if( bp->hostOutputChannels[0] ) + PaUtil_FreeMemory( bp->hostOutputChannels[0] ); + + return result; +} + + +void PaUtil_TerminateBufferProcessor( PaUtilBufferProcessor* bp ) +{ + if( bp->tempInputBuffer ) + PaUtil_FreeMemory( bp->tempInputBuffer ); + + if( bp->tempInputBufferPtrs ) + PaUtil_FreeMemory( bp->tempInputBufferPtrs ); + + if( bp->hostInputChannels[0] ) + PaUtil_FreeMemory( bp->hostInputChannels[0] ); + + if( bp->tempOutputBuffer ) + PaUtil_FreeMemory( bp->tempOutputBuffer ); + + if( bp->tempOutputBufferPtrs ) + PaUtil_FreeMemory( bp->tempOutputBufferPtrs ); + + if( bp->hostOutputChannels[0] ) + PaUtil_FreeMemory( bp->hostOutputChannels[0] ); +} + + +void PaUtil_ResetBufferProcessor( PaUtilBufferProcessor* bp ) +{ + unsigned long tempInputBufferSize, tempOutputBufferSize; + + bp->framesInTempInputBuffer = bp->initialFramesInTempInputBuffer; + bp->framesInTempOutputBuffer = bp->initialFramesInTempOutputBuffer; + + if( bp->framesInTempInputBuffer > 0 ) + { + tempInputBufferSize = + bp->framesPerTempBuffer * bp->bytesPerUserInputSample * bp->inputChannelCount; + memset( bp->tempInputBuffer, 0, tempInputBufferSize ); + } + + if( bp->framesInTempOutputBuffer > 0 ) + { + tempOutputBufferSize = + bp->framesPerTempBuffer * bp->bytesPerUserOutputSample * bp->outputChannelCount; + memset( bp->tempOutputBuffer, 0, tempOutputBufferSize ); + } +} + + +unsigned long PaUtil_GetBufferProcessorInputLatencyFrames( PaUtilBufferProcessor* bp ) +{ + return bp->initialFramesInTempInputBuffer; +} + + +unsigned long PaUtil_GetBufferProcessorOutputLatencyFrames( PaUtilBufferProcessor* bp ) +{ + return bp->initialFramesInTempOutputBuffer; +} + + +void PaUtil_SetInputFrameCount( PaUtilBufferProcessor* bp, + unsigned long frameCount ) +{ + if( frameCount == 0 ) + bp->hostInputFrameCount[0] = bp->framesPerHostBuffer; + else + bp->hostInputFrameCount[0] = frameCount; +} + + +void PaUtil_SetNoInput( PaUtilBufferProcessor* bp ) +{ + assert( bp->inputChannelCount > 0 ); + + bp->hostInputChannels[0][0].data = 0; +} + + +void PaUtil_SetInputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data, unsigned int stride ) +{ + assert( channel < bp->inputChannelCount ); + + bp->hostInputChannels[0][channel].data = data; + bp->hostInputChannels[0][channel].stride = stride; +} + + +void PaUtil_SetInterleavedInputChannels( PaUtilBufferProcessor* bp, + unsigned int firstChannel, void *data, unsigned int channelCount ) +{ + unsigned int i; + unsigned int channel = firstChannel; + unsigned char *p = (unsigned char*)data; + + if( channelCount == 0 ) + channelCount = bp->inputChannelCount; + + assert( firstChannel < bp->inputChannelCount ); + assert( firstChannel + channelCount <= bp->inputChannelCount ); + assert( bp->hostInputIsInterleaved ); + + for( i=0; i< channelCount; ++i ) + { + bp->hostInputChannels[0][channel+i].data = p; + p += bp->bytesPerHostInputSample; + bp->hostInputChannels[0][channel+i].stride = channelCount; + } +} + + +void PaUtil_SetNonInterleavedInputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data ) +{ + assert( channel < bp->inputChannelCount ); + assert( !bp->hostInputIsInterleaved ); + + bp->hostInputChannels[0][channel].data = data; + bp->hostInputChannels[0][channel].stride = 1; +} + + +void PaUtil_Set2ndInputFrameCount( PaUtilBufferProcessor* bp, + unsigned long frameCount ) +{ + bp->hostInputFrameCount[1] = frameCount; +} + + +void PaUtil_Set2ndInputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data, unsigned int stride ) +{ + assert( channel < bp->inputChannelCount ); + + bp->hostInputChannels[1][channel].data = data; + bp->hostInputChannels[1][channel].stride = stride; +} + + +void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bp, + unsigned int firstChannel, void *data, unsigned int channelCount ) +{ + unsigned int i; + unsigned int channel = firstChannel; + unsigned char *p = (unsigned char*)data; + + if( channelCount == 0 ) + channelCount = bp->inputChannelCount; + + assert( firstChannel < bp->inputChannelCount ); + assert( firstChannel + channelCount <= bp->inputChannelCount ); + assert( bp->hostInputIsInterleaved ); + + for( i=0; i< channelCount; ++i ) + { + bp->hostInputChannels[1][channel+i].data = p; + p += bp->bytesPerHostInputSample; + bp->hostInputChannels[1][channel+i].stride = channelCount; + } +} + + +void PaUtil_Set2ndNonInterleavedInputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data ) +{ + assert( channel < bp->inputChannelCount ); + assert( !bp->hostInputIsInterleaved ); + + bp->hostInputChannels[1][channel].data = data; + bp->hostInputChannels[1][channel].stride = 1; +} + + +void PaUtil_SetOutputFrameCount( PaUtilBufferProcessor* bp, + unsigned long frameCount ) +{ + if( frameCount == 0 ) + bp->hostOutputFrameCount[0] = bp->framesPerHostBuffer; + else + bp->hostOutputFrameCount[0] = frameCount; +} + + +void PaUtil_SetNoOutput( PaUtilBufferProcessor* bp ) +{ + assert( bp->outputChannelCount > 0 ); + + bp->hostOutputChannels[0][0].data = 0; + + /* note that only NonAdaptingProcess is able to deal with no output at this stage. not implemented for AdaptingProcess */ +} + + +void PaUtil_SetOutputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data, unsigned int stride ) +{ + assert( channel < bp->outputChannelCount ); + assert( data != NULL ); + + bp->hostOutputChannels[0][channel].data = data; + bp->hostOutputChannels[0][channel].stride = stride; +} + + +void PaUtil_SetInterleavedOutputChannels( PaUtilBufferProcessor* bp, + unsigned int firstChannel, void *data, unsigned int channelCount ) +{ + unsigned int i; + unsigned int channel = firstChannel; + unsigned char *p = (unsigned char*)data; + + if( channelCount == 0 ) + channelCount = bp->outputChannelCount; + + assert( firstChannel < bp->outputChannelCount ); + assert( firstChannel + channelCount <= bp->outputChannelCount ); + assert( bp->hostOutputIsInterleaved ); + + for( i=0; i< channelCount; ++i ) + { + PaUtil_SetOutputChannel( bp, channel + i, p, channelCount ); + p += bp->bytesPerHostOutputSample; + } +} + + +void PaUtil_SetNonInterleavedOutputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data ) +{ + assert( channel < bp->outputChannelCount ); + assert( !bp->hostOutputIsInterleaved ); + + PaUtil_SetOutputChannel( bp, channel, data, 1 ); +} + + +void PaUtil_Set2ndOutputFrameCount( PaUtilBufferProcessor* bp, + unsigned long frameCount ) +{ + bp->hostOutputFrameCount[1] = frameCount; +} + + +void PaUtil_Set2ndOutputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data, unsigned int stride ) +{ + assert( channel < bp->outputChannelCount ); + assert( data != NULL ); + + bp->hostOutputChannels[1][channel].data = data; + bp->hostOutputChannels[1][channel].stride = stride; +} + + +void PaUtil_Set2ndInterleavedOutputChannels( PaUtilBufferProcessor* bp, + unsigned int firstChannel, void *data, unsigned int channelCount ) +{ + unsigned int i; + unsigned int channel = firstChannel; + unsigned char *p = (unsigned char*)data; + + if( channelCount == 0 ) + channelCount = bp->outputChannelCount; + + assert( firstChannel < bp->outputChannelCount ); + assert( firstChannel + channelCount <= bp->outputChannelCount ); + assert( bp->hostOutputIsInterleaved ); + + for( i=0; i< channelCount; ++i ) + { + PaUtil_Set2ndOutputChannel( bp, channel + i, p, channelCount ); + p += bp->bytesPerHostOutputSample; + } +} + + +void PaUtil_Set2ndNonInterleavedOutputChannel( PaUtilBufferProcessor* bp, + unsigned int channel, void *data ) +{ + assert( channel < bp->outputChannelCount ); + assert( !bp->hostOutputIsInterleaved ); + + PaUtil_Set2ndOutputChannel( bp, channel, data, 1 ); +} + + +void PaUtil_BeginBufferProcessing( PaUtilBufferProcessor* bp, + PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags callbackStatusFlags ) +{ + bp->timeInfo = timeInfo; + + /* the first streamCallback will be called to process samples which are + currently in the input buffer before the ones starting at the timeInfo time */ + + bp->timeInfo->inputBufferAdcTime -= bp->framesInTempInputBuffer * bp->samplePeriod; + + /* We just pass through timeInfo->currentTime provided by the caller. This is + not strictly conformant to the word of the spec, since the buffer processor + might call the callback multiple times, and we never refresh currentTime. */ + + /* the first streamCallback will be called to generate samples which will be + outputted after the frames currently in the output buffer have been + outputted. */ + bp->timeInfo->outputBufferDacTime += bp->framesInTempOutputBuffer * bp->samplePeriod; + + bp->callbackStatusFlags = callbackStatusFlags; + + bp->hostInputFrameCount[1] = 0; + bp->hostOutputFrameCount[1] = 0; +} + + +/* + NonAdaptingProcess() is a simple buffer copying adaptor that can handle + both full and half duplex copies. It processes framesToProcess frames, + broken into blocks bp->framesPerTempBuffer long. + This routine can be used when the streamCallback doesn't care what length + the buffers are, or when framesToProcess is an integer multiple of + bp->framesPerTempBuffer, in which case streamCallback will always be called + with bp->framesPerTempBuffer samples. +*/ +static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, + int *streamCallbackResult, + PaUtilChannelDescriptor *hostInputChannels, + PaUtilChannelDescriptor *hostOutputChannels, + unsigned long framesToProcess ) +{ + void *userInput, *userOutput; + unsigned char *srcBytePtr, *destBytePtr; + unsigned int srcSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int srcChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int destSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int destChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + unsigned long frameCount; + unsigned long framesToGo = framesToProcess; + unsigned long framesProcessed = 0; + int skipOutputConvert = 0; + int skipInputConvert = 0; + + + if( *streamCallbackResult == paContinue ) + { + do + { + frameCount = PA_MIN_( bp->framesPerTempBuffer, framesToGo ); + + /* configure user input buffer and convert input data (host -> user) */ + if( bp->inputChannelCount == 0 ) + { + /* no input */ + userInput = 0; + } + else /* there are input channels */ + { + + destBytePtr = (unsigned char *)bp->tempInputBuffer; + + if( bp->userInputIsInterleaved ) + { + destSampleStrideSamples = bp->inputChannelCount; + destChannelStrideBytes = bp->bytesPerUserInputSample; + + /* process host buffer directly, or use temp buffer if formats differ or host buffer non-interleaved */ + if( bp->userInputSampleFormatIsEqualToHost && bp->hostInputIsInterleaved && bp->hostInputChannels[0][0].data) + { + userInput = hostInputChannels[0].data; + destBytePtr = (unsigned char *)hostInputChannels[0].data; + skipInputConvert = 1; + } + else + { + userInput = bp->tempInputBuffer; + } + } + else /* user input is not interleaved */ + { + destSampleStrideSamples = 1; + destChannelStrideBytes = frameCount * bp->bytesPerUserInputSample; + + /* setup non-interleaved ptrs */ + if( bp->userInputSampleFormatIsEqualToHost && !bp->hostInputIsInterleaved && bp->hostInputChannels[0][0].data ) + { + for( i=0; iinputChannelCount; ++i ) + { + bp->tempInputBufferPtrs[i] = hostInputChannels[i].data; + } + skipInputConvert = 1; + } + else + { + for( i=0; iinputChannelCount; ++i ) + { + bp->tempInputBufferPtrs[i] = ((unsigned char*)bp->tempInputBuffer) + + i * bp->bytesPerUserInputSample * frameCount; + } + } + + userInput = bp->tempInputBufferPtrs; + } + + if( !bp->hostInputChannels[0][0].data ) + { + /* no input was supplied (see PaUtil_SetNoInput), so + zero the input buffer */ + + for( i=0; iinputChannelCount; ++i ) + { + bp->inputZeroer( destBytePtr, destSampleStrideSamples, frameCount ); + destBytePtr += destChannelStrideBytes; /* skip to next destination channel */ + } + } + else + { + if( skipInputConvert ) + { + for( i=0; iinputChannelCount; ++i ) + { + /* advance src ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + frameCount * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + } + else + { + for( i=0; iinputChannelCount; ++i ) + { + bp->inputConverter( destBytePtr, destSampleStrideSamples, + hostInputChannels[i].data, + hostInputChannels[i].stride, + frameCount, &bp->ditherGenerator ); + + destBytePtr += destChannelStrideBytes; /* skip to next destination channel */ + + /* advance src ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + frameCount * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + } + } + } + + /* configure user output buffer */ + if( bp->outputChannelCount == 0 ) + { + /* no output */ + userOutput = 0; + } + else /* there are output channels */ + { + if( bp->userOutputIsInterleaved ) + { + /* process host buffer directly, or use temp buffer if formats differ or host buffer non-interleaved */ + if( bp->userOutputSampleFormatIsEqualToHost && bp->hostOutputIsInterleaved ) + { + userOutput = hostOutputChannels[0].data; + skipOutputConvert = 1; + } + else + { + userOutput = bp->tempOutputBuffer; + } + } + else /* user output is not interleaved */ + { + if( bp->userOutputSampleFormatIsEqualToHost && !bp->hostOutputIsInterleaved ) + { + for( i=0; ioutputChannelCount; ++i ) + { + bp->tempOutputBufferPtrs[i] = hostOutputChannels[i].data; + } + skipOutputConvert = 1; + } + else + { + for( i=0; ioutputChannelCount; ++i ) + { + bp->tempOutputBufferPtrs[i] = ((unsigned char*)bp->tempOutputBuffer) + + i * bp->bytesPerUserOutputSample * frameCount; + } + } + + userOutput = bp->tempOutputBufferPtrs; + } + } + + *streamCallbackResult = bp->streamCallback( userInput, userOutput, + frameCount, bp->timeInfo, bp->callbackStatusFlags, bp->userData ); + + if( *streamCallbackResult == paAbort ) + { + /* callback returned paAbort, don't advance framesProcessed + and framesToGo, they will be handled below */ + } + else + { + bp->timeInfo->inputBufferAdcTime += frameCount * bp->samplePeriod; + bp->timeInfo->outputBufferDacTime += frameCount * bp->samplePeriod; + + /* convert output data (user -> host) */ + + if( bp->outputChannelCount != 0 && bp->hostOutputChannels[0][0].data ) + { + if( skipOutputConvert ) + { + for( i=0; ioutputChannelCount; ++i ) + { + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + else + { + + srcBytePtr = (unsigned char *)bp->tempOutputBuffer; + + if( bp->userOutputIsInterleaved ) + { + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + } + else /* user output is not interleaved */ + { + srcSampleStrideSamples = 1; + srcChannelStrideBytes = frameCount * bp->bytesPerUserOutputSample; + } + + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + frameCount, &bp->ditherGenerator ); + + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + } + + framesProcessed += frameCount; + + framesToGo -= frameCount; + } + } + while( framesToGo > 0 && *streamCallbackResult == paContinue ); + } + + if( framesToGo > 0 ) + { + /* zero any remaining frames output. There will only be remaining frames + if the callback has returned paComplete or paAbort */ + + frameCount = framesToGo; + + if( bp->outputChannelCount != 0 && bp->hostOutputChannels[0][0].data ) + { + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputZeroer( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + frameCount ); + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + + framesProcessed += frameCount; + } + + return framesProcessed; +} + + +/* + AdaptingInputOnlyProcess() is a half duplex input buffer processor. It + converts data from the input buffers into the temporary input buffer, + when the temporary input buffer is full, it calls the streamCallback. +*/ +static unsigned long AdaptingInputOnlyProcess( PaUtilBufferProcessor *bp, + int *streamCallbackResult, + PaUtilChannelDescriptor *hostInputChannels, + unsigned long framesToProcess ) +{ + void *userInput, *userOutput; + unsigned char *destBytePtr; + unsigned int destSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int destChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + unsigned long frameCount; + unsigned long framesToGo = framesToProcess; + unsigned long framesProcessed = 0; + + userOutput = 0; + + do + { + frameCount = ( bp->framesInTempInputBuffer + framesToGo > bp->framesPerUserBuffer ) + ? ( bp->framesPerUserBuffer - bp->framesInTempInputBuffer ) + : framesToGo; + + /* convert frameCount samples into temp buffer */ + + if( bp->userInputIsInterleaved ) + { + destBytePtr = ((unsigned char*)bp->tempInputBuffer) + + bp->bytesPerUserInputSample * bp->inputChannelCount * + bp->framesInTempInputBuffer; + + destSampleStrideSamples = bp->inputChannelCount; + destChannelStrideBytes = bp->bytesPerUserInputSample; + + userInput = bp->tempInputBuffer; + } + else /* user input is not interleaved */ + { + destBytePtr = ((unsigned char*)bp->tempInputBuffer) + + bp->bytesPerUserInputSample * bp->framesInTempInputBuffer; + + destSampleStrideSamples = 1; + destChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserInputSample; + + /* setup non-interleaved ptrs */ + for( i=0; iinputChannelCount; ++i ) + { + bp->tempInputBufferPtrs[i] = ((unsigned char*)bp->tempInputBuffer) + + i * bp->bytesPerUserInputSample * bp->framesPerUserBuffer; + } + + userInput = bp->tempInputBufferPtrs; + } + + for( i=0; iinputChannelCount; ++i ) + { + bp->inputConverter( destBytePtr, destSampleStrideSamples, + hostInputChannels[i].data, + hostInputChannels[i].stride, + frameCount, &bp->ditherGenerator ); + + destBytePtr += destChannelStrideBytes; /* skip to next destination channel */ + + /* advance src ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + frameCount * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + + bp->framesInTempInputBuffer += frameCount; + + if( bp->framesInTempInputBuffer == bp->framesPerUserBuffer ) + { + /** + @todo (non-critical optimisation) + The conditional below implements the continue/complete/abort mechanism + simply by continuing on iterating through the input buffer, but not + passing the data to the callback. With care, the outer loop could be + terminated earlier, thus some unneeded conversion cycles would be + saved. + */ + if( *streamCallbackResult == paContinue ) + { + bp->timeInfo->outputBufferDacTime = 0; + + *streamCallbackResult = bp->streamCallback( userInput, userOutput, + bp->framesPerUserBuffer, bp->timeInfo, + bp->callbackStatusFlags, bp->userData ); + + bp->timeInfo->inputBufferAdcTime += bp->framesPerUserBuffer * bp->samplePeriod; + } + + bp->framesInTempInputBuffer = 0; + } + + framesProcessed += frameCount; + + framesToGo -= frameCount; + }while( framesToGo > 0 ); + + return framesProcessed; +} + + +/* + AdaptingOutputOnlyProcess() is a half duplex output buffer processor. + It converts data from the temporary output buffer, to the output buffers, + when the temporary output buffer is empty, it calls the streamCallback. +*/ +static unsigned long AdaptingOutputOnlyProcess( PaUtilBufferProcessor *bp, + int *streamCallbackResult, + PaUtilChannelDescriptor *hostOutputChannels, + unsigned long framesToProcess ) +{ + void *userInput, *userOutput; + unsigned char *srcBytePtr; + unsigned int srcSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int srcChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + unsigned long frameCount; + unsigned long framesToGo = framesToProcess; + unsigned long framesProcessed = 0; + + do + { + if( bp->framesInTempOutputBuffer == 0 && *streamCallbackResult == paContinue ) + { + userInput = 0; + + /* setup userOutput */ + if( bp->userOutputIsInterleaved ) + { + userOutput = bp->tempOutputBuffer; + } + else /* user output is not interleaved */ + { + for( i = 0; i < bp->outputChannelCount; ++i ) + { + bp->tempOutputBufferPtrs[i] = ((unsigned char*)bp->tempOutputBuffer) + + i * bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; + } + + userOutput = bp->tempOutputBufferPtrs; + } + + bp->timeInfo->inputBufferAdcTime = 0; + + *streamCallbackResult = bp->streamCallback( userInput, userOutput, + bp->framesPerUserBuffer, bp->timeInfo, + bp->callbackStatusFlags, bp->userData ); + + if( *streamCallbackResult == paAbort ) + { + /* if the callback returned paAbort, we disregard its output */ + } + else + { + bp->timeInfo->outputBufferDacTime += bp->framesPerUserBuffer * bp->samplePeriod; + + bp->framesInTempOutputBuffer = bp->framesPerUserBuffer; + } + } + + if( bp->framesInTempOutputBuffer > 0 ) + { + /* convert frameCount frames from user buffer to host buffer */ + + frameCount = PA_MIN_( bp->framesInTempOutputBuffer, framesToGo ); + + if( bp->userOutputIsInterleaved ) + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * bp->outputChannelCount * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); + + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + } + else /* user output is not interleaved */ + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); + + srcSampleStrideSamples = 1; + srcChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; + } + + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + frameCount, &bp->ditherGenerator ); + + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + + bp->framesInTempOutputBuffer -= frameCount; + } + else + { + /* no more user data is available because the callback has returned + paComplete or paAbort. Fill the remainder of the host buffer + with zeros. + */ + + frameCount = framesToGo; + + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputZeroer( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + frameCount ); + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + + framesProcessed += frameCount; + + framesToGo -= frameCount; + + }while( framesToGo > 0 ); + + return framesProcessed; +} + +/* CopyTempOutputBuffersToHostOutputBuffers is called from AdaptingProcess to copy frames from + tempOutputBuffer to hostOutputChannels. This includes data conversion + and interleaving. +*/ +static void CopyTempOutputBuffersToHostOutputBuffers( PaUtilBufferProcessor *bp) +{ + unsigned long maxFramesToCopy; + PaUtilChannelDescriptor *hostOutputChannels; + unsigned int frameCount; + unsigned char *srcBytePtr; + unsigned int srcSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int srcChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + + /* copy frames from user to host output buffers */ + while( bp->framesInTempOutputBuffer > 0 && + ((bp->hostOutputFrameCount[0] + bp->hostOutputFrameCount[1]) > 0) ) + { + maxFramesToCopy = bp->framesInTempOutputBuffer; + + /* select the output buffer set (1st or 2nd) */ + if( bp->hostOutputFrameCount[0] > 0 ) + { + hostOutputChannels = bp->hostOutputChannels[0]; + frameCount = PA_MIN_( bp->hostOutputFrameCount[0], maxFramesToCopy ); + } + else + { + hostOutputChannels = bp->hostOutputChannels[1]; + frameCount = PA_MIN_( bp->hostOutputFrameCount[1], maxFramesToCopy ); + } + + if( bp->userOutputIsInterleaved ) + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * bp->outputChannelCount * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); + + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + } + else /* user output is not interleaved */ + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); + + srcSampleStrideSamples = 1; + srcChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; + } + + for( i=0; ioutputChannelCount; ++i ) + { + assert( hostOutputChannels[i].data != NULL ); + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + frameCount, &bp->ditherGenerator ); + + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + + if( bp->hostOutputFrameCount[0] > 0 ) + bp->hostOutputFrameCount[0] -= frameCount; + else + bp->hostOutputFrameCount[1] -= frameCount; + + bp->framesInTempOutputBuffer -= frameCount; + } +} + +/* + AdaptingProcess is a full duplex adapting buffer processor. It converts + data from the temporary output buffer into the host output buffers, then + from the host input buffers into the temporary input buffers. Calling the + streamCallback when necessary. + When processPartialUserBuffers is 0, all available input data will be + consumed and all available output space will be filled. When + processPartialUserBuffers is non-zero, as many full user buffers + as possible will be processed, but partial buffers will not be consumed. +*/ +static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, + int *streamCallbackResult, int processPartialUserBuffers ) +{ + void *userInput, *userOutput; + unsigned long framesProcessed = 0; + unsigned long framesAvailable; + unsigned long endProcessingMinFrameCount; + unsigned long maxFramesToCopy; + PaUtilChannelDescriptor *hostInputChannels, *hostOutputChannels; + unsigned int frameCount; + unsigned char *destBytePtr; + unsigned int destSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int destChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i, j; + + + framesAvailable = bp->hostInputFrameCount[0] + bp->hostInputFrameCount[1];/* this is assumed to be the same as the output buffer's frame count */ + + if( processPartialUserBuffers ) + endProcessingMinFrameCount = 0; + else + endProcessingMinFrameCount = (bp->framesPerUserBuffer - 1); + + /* Fill host output with remaining frames in user output (tempOutputBuffer) */ + CopyTempOutputBuffersToHostOutputBuffers( bp ); + + while( framesAvailable > endProcessingMinFrameCount ) + { + + if( bp->framesInTempOutputBuffer == 0 && *streamCallbackResult != paContinue ) + { + /* the callback will not be called any more, so zero what remains + of the host output buffers */ + + for( i=0; i<2; ++i ) + { + frameCount = bp->hostOutputFrameCount[i]; + if( frameCount > 0 ) + { + hostOutputChannels = bp->hostOutputChannels[i]; + + for( j=0; joutputChannelCount; ++j ) + { + bp->outputZeroer( hostOutputChannels[j].data, + hostOutputChannels[j].stride, + frameCount ); + + /* advance dest ptr for next iteration */ + hostOutputChannels[j].data = ((unsigned char*)hostOutputChannels[j].data) + + frameCount * hostOutputChannels[j].stride * bp->bytesPerHostOutputSample; + } + bp->hostOutputFrameCount[i] = 0; + } + } + } + + + /* copy frames from host to user input buffers */ + while( bp->framesInTempInputBuffer < bp->framesPerUserBuffer && + ((bp->hostInputFrameCount[0] + bp->hostInputFrameCount[1]) > 0) ) + { + maxFramesToCopy = bp->framesPerUserBuffer - bp->framesInTempInputBuffer; + + /* select the input buffer set (1st or 2nd) */ + if( bp->hostInputFrameCount[0] > 0 ) + { + hostInputChannels = bp->hostInputChannels[0]; + frameCount = PA_MIN_( bp->hostInputFrameCount[0], maxFramesToCopy ); + } + else + { + hostInputChannels = bp->hostInputChannels[1]; + frameCount = PA_MIN_( bp->hostInputFrameCount[1], maxFramesToCopy ); + } + + /* configure conversion destination pointers */ + if( bp->userInputIsInterleaved ) + { + destBytePtr = ((unsigned char*)bp->tempInputBuffer) + + bp->bytesPerUserInputSample * bp->inputChannelCount * + bp->framesInTempInputBuffer; + + destSampleStrideSamples = bp->inputChannelCount; + destChannelStrideBytes = bp->bytesPerUserInputSample; + } + else /* user input is not interleaved */ + { + destBytePtr = ((unsigned char*)bp->tempInputBuffer) + + bp->bytesPerUserInputSample * bp->framesInTempInputBuffer; + + destSampleStrideSamples = 1; + destChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserInputSample; + } + + for( i=0; iinputChannelCount; ++i ) + { + bp->inputConverter( destBytePtr, destSampleStrideSamples, + hostInputChannels[i].data, + hostInputChannels[i].stride, + frameCount, &bp->ditherGenerator ); + + destBytePtr += destChannelStrideBytes; /* skip to next destination channel */ + + /* advance src ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + frameCount * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + + if( bp->hostInputFrameCount[0] > 0 ) + bp->hostInputFrameCount[0] -= frameCount; + else + bp->hostInputFrameCount[1] -= frameCount; + + bp->framesInTempInputBuffer += frameCount; + + /* update framesAvailable and framesProcessed based on input consumed + unless something is very wrong this will also correspond to the + amount of output generated */ + framesAvailable -= frameCount; + framesProcessed += frameCount; + } + + /* call streamCallback */ + if( bp->framesInTempInputBuffer == bp->framesPerUserBuffer && + bp->framesInTempOutputBuffer == 0 ) + { + if( *streamCallbackResult == paContinue ) + { + /* setup userInput */ + if( bp->userInputIsInterleaved ) + { + userInput = bp->tempInputBuffer; + } + else /* user input is not interleaved */ + { + for( i = 0; i < bp->inputChannelCount; ++i ) + { + bp->tempInputBufferPtrs[i] = ((unsigned char*)bp->tempInputBuffer) + + i * bp->framesPerUserBuffer * bp->bytesPerUserInputSample; + } + + userInput = bp->tempInputBufferPtrs; + } + + /* setup userOutput */ + if( bp->userOutputIsInterleaved ) + { + userOutput = bp->tempOutputBuffer; + } + else /* user output is not interleaved */ + { + for( i = 0; i < bp->outputChannelCount; ++i ) + { + bp->tempOutputBufferPtrs[i] = ((unsigned char*)bp->tempOutputBuffer) + + i * bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; + } + + userOutput = bp->tempOutputBufferPtrs; + } + + /* call streamCallback */ + + *streamCallbackResult = bp->streamCallback( userInput, userOutput, + bp->framesPerUserBuffer, bp->timeInfo, + bp->callbackStatusFlags, bp->userData ); + + bp->timeInfo->inputBufferAdcTime += bp->framesPerUserBuffer * bp->samplePeriod; + bp->timeInfo->outputBufferDacTime += bp->framesPerUserBuffer * bp->samplePeriod; + + bp->framesInTempInputBuffer = 0; + + if( *streamCallbackResult == paAbort ) + bp->framesInTempOutputBuffer = 0; + else + bp->framesInTempOutputBuffer = bp->framesPerUserBuffer; + } + else + { + /* paComplete or paAbort has already been called. */ + + bp->framesInTempInputBuffer = 0; + } + } + + /* copy frames from user (tempOutputBuffer) to host output buffers (hostOutputChannels) + Means to process the user output provided by the callback. Has to be called after + each callback. */ + CopyTempOutputBuffersToHostOutputBuffers( bp ); + + } + + return framesProcessed; +} + + +unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *streamCallbackResult ) +{ + unsigned long framesToProcess, framesToGo; + unsigned long framesProcessed = 0; + + if( bp->inputChannelCount != 0 && bp->outputChannelCount != 0 + && bp->hostInputChannels[0][0].data /* input was supplied (see PaUtil_SetNoInput) */ + && bp->hostOutputChannels[0][0].data /* output was supplied (see PaUtil_SetNoOutput) */ ) + { + assert( (bp->hostInputFrameCount[0] + bp->hostInputFrameCount[1]) == + (bp->hostOutputFrameCount[0] + bp->hostOutputFrameCount[1]) ); + } + + assert( *streamCallbackResult == paContinue + || *streamCallbackResult == paComplete + || *streamCallbackResult == paAbort ); /* don't forget to pass in a valid callback result value */ + + if( bp->useNonAdaptingProcess ) + { + if( bp->inputChannelCount != 0 && bp->outputChannelCount != 0 ) + { + /* full duplex non-adapting process, splice buffers if they are + different lengths */ + + framesToGo = bp->hostOutputFrameCount[0] + bp->hostOutputFrameCount[1]; /* relies on assert above for input/output equivalence */ + + do{ + unsigned long noInputInputFrameCount; + unsigned long *hostInputFrameCount; + PaUtilChannelDescriptor *hostInputChannels; + unsigned long noOutputOutputFrameCount; + unsigned long *hostOutputFrameCount; + PaUtilChannelDescriptor *hostOutputChannels; + unsigned long framesProcessedThisIteration; + + if( !bp->hostInputChannels[0][0].data ) + { + /* no input was supplied (see PaUtil_SetNoInput) + NonAdaptingProcess knows how to deal with this + */ + noInputInputFrameCount = framesToGo; + hostInputFrameCount = &noInputInputFrameCount; + hostInputChannels = 0; + } + else if( bp->hostInputFrameCount[0] != 0 ) + { + hostInputFrameCount = &bp->hostInputFrameCount[0]; + hostInputChannels = bp->hostInputChannels[0]; + } + else + { + hostInputFrameCount = &bp->hostInputFrameCount[1]; + hostInputChannels = bp->hostInputChannels[1]; + } + + if( !bp->hostOutputChannels[0][0].data ) + { + /* no output was supplied (see PaUtil_SetNoOutput) + NonAdaptingProcess knows how to deal with this + */ + noOutputOutputFrameCount = framesToGo; + hostOutputFrameCount = &noOutputOutputFrameCount; + hostOutputChannels = 0; + } + if( bp->hostOutputFrameCount[0] != 0 ) + { + hostOutputFrameCount = &bp->hostOutputFrameCount[0]; + hostOutputChannels = bp->hostOutputChannels[0]; + } + else + { + hostOutputFrameCount = &bp->hostOutputFrameCount[1]; + hostOutputChannels = bp->hostOutputChannels[1]; + } + + framesToProcess = PA_MIN_( *hostInputFrameCount, + *hostOutputFrameCount ); + + assert( framesToProcess != 0 ); + + framesProcessedThisIteration = NonAdaptingProcess( bp, streamCallbackResult, + hostInputChannels, hostOutputChannels, + framesToProcess ); + + *hostInputFrameCount -= framesProcessedThisIteration; + *hostOutputFrameCount -= framesProcessedThisIteration; + + framesProcessed += framesProcessedThisIteration; + framesToGo -= framesProcessedThisIteration; + + }while( framesToGo > 0 ); + } + else + { + /* half duplex non-adapting process, just process 1st and 2nd buffer */ + /* process first buffer */ + + framesToProcess = (bp->inputChannelCount != 0) + ? bp->hostInputFrameCount[0] + : bp->hostOutputFrameCount[0]; + + framesProcessed = NonAdaptingProcess( bp, streamCallbackResult, + bp->hostInputChannels[0], bp->hostOutputChannels[0], + framesToProcess ); + + /* process second buffer if provided */ + + framesToProcess = (bp->inputChannelCount != 0) + ? bp->hostInputFrameCount[1] + : bp->hostOutputFrameCount[1]; + if( framesToProcess > 0 ) + { + framesProcessed += NonAdaptingProcess( bp, streamCallbackResult, + bp->hostInputChannels[1], bp->hostOutputChannels[1], + framesToProcess ); + } + } + } + else /* block adaption necessary*/ + { + + if( bp->inputChannelCount != 0 && bp->outputChannelCount != 0 ) + { + /* full duplex */ + + if( bp->hostBufferSizeMode == paUtilVariableHostBufferSizePartialUsageAllowed ) + { + framesProcessed = AdaptingProcess( bp, streamCallbackResult, + 0 /* dont process partial user buffers */ ); + } + else + { + framesProcessed = AdaptingProcess( bp, streamCallbackResult, + 1 /* process partial user buffers */ ); + } + } + else if( bp->inputChannelCount != 0 ) + { + /* input only */ + framesToProcess = bp->hostInputFrameCount[0]; + + framesProcessed = AdaptingInputOnlyProcess( bp, streamCallbackResult, + bp->hostInputChannels[0], framesToProcess ); + + framesToProcess = bp->hostInputFrameCount[1]; + if( framesToProcess > 0 ) + { + framesProcessed += AdaptingInputOnlyProcess( bp, streamCallbackResult, + bp->hostInputChannels[1], framesToProcess ); + } + } + else + { + /* output only */ + framesToProcess = bp->hostOutputFrameCount[0]; + + framesProcessed = AdaptingOutputOnlyProcess( bp, streamCallbackResult, + bp->hostOutputChannels[0], framesToProcess ); + + framesToProcess = bp->hostOutputFrameCount[1]; + if( framesToProcess > 0 ) + { + framesProcessed += AdaptingOutputOnlyProcess( bp, streamCallbackResult, + bp->hostOutputChannels[1], framesToProcess ); + } + } + } + + return framesProcessed; +} + + +int PaUtil_IsBufferProcessorOutputEmpty( PaUtilBufferProcessor* bp ) +{ + return (bp->framesInTempOutputBuffer) ? 0 : 1; +} + + +unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, + void **buffer, unsigned long frameCount ) +{ + PaUtilChannelDescriptor *hostInputChannels; + unsigned int framesToCopy; + unsigned char *destBytePtr; + void **nonInterleavedDestPtrs; + unsigned int destSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int destChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + + hostInputChannels = bp->hostInputChannels[0]; + framesToCopy = PA_MIN_( bp->hostInputFrameCount[0], frameCount ); + + if( bp->userInputIsInterleaved ) + { + destBytePtr = (unsigned char*)*buffer; + + destSampleStrideSamples = bp->inputChannelCount; + destChannelStrideBytes = bp->bytesPerUserInputSample; + + for( i=0; iinputChannelCount; ++i ) + { + bp->inputConverter( destBytePtr, destSampleStrideSamples, + hostInputChannels[i].data, + hostInputChannels[i].stride, + framesToCopy, &bp->ditherGenerator ); + + destBytePtr += destChannelStrideBytes; /* skip to next source channel */ + + /* advance dest ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + framesToCopy * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + + /* advance callers dest pointer (buffer) */ + *buffer = ((unsigned char *)*buffer) + + framesToCopy * bp->inputChannelCount * bp->bytesPerUserInputSample; + } + else + { + /* user input is not interleaved */ + + nonInterleavedDestPtrs = (void**)*buffer; + + destSampleStrideSamples = 1; + + for( i=0; iinputChannelCount; ++i ) + { + destBytePtr = (unsigned char*)nonInterleavedDestPtrs[i]; + + bp->inputConverter( destBytePtr, destSampleStrideSamples, + hostInputChannels[i].data, + hostInputChannels[i].stride, + framesToCopy, &bp->ditherGenerator ); + + /* advance callers dest pointer (nonInterleavedDestPtrs[i]) */ + destBytePtr += bp->bytesPerUserInputSample * framesToCopy; + nonInterleavedDestPtrs[i] = destBytePtr; + + /* advance dest ptr for next iteration */ + hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + + framesToCopy * hostInputChannels[i].stride * bp->bytesPerHostInputSample; + } + } + + bp->hostInputFrameCount[0] -= framesToCopy; + + return framesToCopy; +} + +unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bp, + const void ** buffer, unsigned long frameCount ) +{ + PaUtilChannelDescriptor *hostOutputChannels; + unsigned int framesToCopy; + unsigned char *srcBytePtr; + void **nonInterleavedSrcPtrs; + unsigned int srcSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ + unsigned int srcChannelStrideBytes; /* stride from one channel to the next, in bytes */ + unsigned int i; + + hostOutputChannels = bp->hostOutputChannels[0]; + framesToCopy = PA_MIN_( bp->hostOutputFrameCount[0], frameCount ); + + if( bp->userOutputIsInterleaved ) + { + srcBytePtr = (unsigned char*)*buffer; + + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + framesToCopy, &bp->ditherGenerator ); + + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + framesToCopy * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + + /* advance callers source pointer (buffer) */ + *buffer = ((unsigned char *)*buffer) + + framesToCopy * bp->outputChannelCount * bp->bytesPerUserOutputSample; + + } + else + { + /* user output is not interleaved */ + + nonInterleavedSrcPtrs = (void**)*buffer; + + srcSampleStrideSamples = 1; + + for( i=0; ioutputChannelCount; ++i ) + { + srcBytePtr = (unsigned char*)nonInterleavedSrcPtrs[i]; + + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + framesToCopy, &bp->ditherGenerator ); + + + /* advance callers source pointer (nonInterleavedSrcPtrs[i]) */ + srcBytePtr += bp->bytesPerUserOutputSample * framesToCopy; + nonInterleavedSrcPtrs[i] = srcBytePtr; + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + framesToCopy * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + + bp->hostOutputFrameCount[0] += framesToCopy; + + return framesToCopy; +} + + +unsigned long PaUtil_ZeroOutput( PaUtilBufferProcessor* bp, unsigned long frameCount ) +{ + PaUtilChannelDescriptor *hostOutputChannels; + unsigned int framesToZero; + unsigned int i; + + hostOutputChannels = bp->hostOutputChannels[0]; + framesToZero = PA_MIN_( bp->hostOutputFrameCount[0], frameCount ); + + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputZeroer( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + framesToZero ); + + + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + framesToZero * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + + bp->hostOutputFrameCount[0] += framesToZero; + + return framesToZero; +} diff --git a/Externals/portaudio/src/common/pa_process.h b/Externals/portaudio/src/common/pa_process.h new file mode 100644 index 0000000000..4d5f56ad63 --- /dev/null +++ b/Externals/portaudio/src/common/pa_process.h @@ -0,0 +1,754 @@ +#ifndef PA_PROCESS_H +#define PA_PROCESS_H +/* + * $Id: pa_process.h 1668 2011-05-02 17:07:11Z rossb $ + * Portable Audio I/O Library callback buffer processing adapters + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Phil Burk, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Buffer Processor prototypes. A Buffer Processor performs buffer length + adaption, coordinates sample format conversion, and interleaves/deinterleaves + channels. + +

Overview

+ + The "Buffer Processor" (PaUtilBufferProcessor) manages conversion of audio + data from host buffers to user buffers and back again. Where required, the + buffer processor takes care of converting between host and user sample formats, + interleaving and deinterleaving multichannel buffers, and adapting between host + and user buffers with different lengths. The buffer processor may be used with + full and half duplex streams, for both callback streams and blocking read/write + streams. + + One of the important capabilities provided by the buffer processor is + the ability to adapt between user and host buffer sizes of different lengths + with minimum latency. Although this task is relatively easy to perform when + the host buffer size is an integer multiple of the user buffer size, the + problem is more complicated when this is not the case - especially for + full-duplex callback streams. Where necessary the adaption is implemented by + internally buffering some input and/or output data. The buffer adation + algorithm used by the buffer processor was originally implemented by + Stephan Letz for the ASIO version of PortAudio, and is described in his + Callback_adaption_.pdf which is included in the distribution. + + The buffer processor performs sample conversion using the functions provided + by pa_converters.c. + + The following sections provide an overview of how to use the buffer processor. + Interested readers are advised to consult the host API implementations for + examples of buffer processor usage. + + +

Initialization, resetting and termination

+ + When a stream is opened, the buffer processor should be initialized using + PaUtil_InitializeBufferProcessor. This function initializes internal state + and allocates temporary buffers as neccesary according to the supplied + configuration parameters. Some of the parameters correspond to those requested + by the user in their call to Pa_OpenStream(), others reflect the requirements + of the host API implementation - they indicate host buffer sizes, formats, + and the type of buffering which the Host API uses. The buffer processor should + be initialized for callback streams and blocking read/write streams. + + Call PaUtil_ResetBufferProcessor to clear any sample data which is present + in the buffer processor before starting to use it (for example when + Pa_StartStream is called). + + When the buffer processor is no longer used call + PaUtil_TerminateBufferProcessor. + + +

Using the buffer processor for a callback stream

+ + The buffer processor's role in a callback stream is to take host input buffers + process them with the stream callback, and fill host output buffers. For a + full duplex stream, the buffer processor handles input and output simultaneously + due to the requirements of the minimum-latency buffer adation algorithm. + + When a host buffer becomes available, the implementation should call + the buffer processor to process the buffer. The buffer processor calls the + stream callback to consume and/or produce audio data as necessary. The buffer + processor will convert sample formats, interleave/deinterleave channels, + and slice or chunk the data to the appropriate buffer lengths according to + the requirements of the stream callback and the host API. + + To process a host buffer (or a pair of host buffers for a full-duplex stream) + use the following calling sequence: + + -# Call PaUtil_BeginBufferProcessing + -# For a stream which takes input: + - Call PaUtil_SetInputFrameCount with the number of frames in the host input + buffer. + - Call one of the following functions one or more times to tell the + buffer processor about the host input buffer(s): PaUtil_SetInputChannel, + PaUtil_SetInterleavedInputChannels, PaUtil_SetNonInterleavedInputChannel. + Which function you call will depend on whether the host buffer(s) are + interleaved or not. + - If the available host data is split accross two buffers (for example a + data range at the end of a circular buffer and another range at the + beginning of the circular buffer), also call + PaUtil_Set2ndInputFrameCount, PaUtil_Set2ndInputChannel, + PaUtil_Set2ndInterleavedInputChannels, + PaUtil_Set2ndNonInterleavedInputChannel as necessary to tell the buffer + processor about the second buffer. + -# For a stream which generates output: + - Call PaUtil_SetOutputFrameCount with the number of frames in the host + output buffer. + - Call one of the following functions one or more times to tell the + buffer processor about the host output buffer(s): PaUtil_SetOutputChannel, + PaUtil_SetInterleavedOutputChannels, PaUtil_SetNonInterleavedOutputChannel. + Which function you call will depend on whether the host buffer(s) are + interleaved or not. + - If the available host output buffer space is split accross two buffers + (for example a data range at the end of a circular buffer and another + range at the beginning of the circular buffer), call + PaUtil_Set2ndOutputFrameCount, PaUtil_Set2ndOutputChannel, + PaUtil_Set2ndInterleavedOutputChannels, + PaUtil_Set2ndNonInterleavedOutputChannel as necessary to tell the buffer + processor about the second buffer. + -# Call PaUtil_EndBufferProcessing, this function performs the actual data + conversion and processing. + + +

Using the buffer processor for a blocking read/write stream

+ + Blocking read/write streams use the buffer processor to convert and copy user + output data to a host buffer, and to convert and copy host input data to + the user's buffer. The buffer processor does not perform any buffer adaption. + When using the buffer processor in a blocking read/write stream the input and + output conversion are performed separately by the PaUtil_CopyInput and + PaUtil_CopyOutput functions. + + To copy data from a host input buffer to the buffer(s) which the user supplies + to Pa_ReadStream, use the following calling sequence. + + - Repeat the following three steps until the user buffer(s) have been filled + with samples from the host input buffers: + -# Call PaUtil_SetInputFrameCount with the number of frames in the host + input buffer. + -# Call one of the following functions one or more times to tell the + buffer processor about the host input buffer(s): PaUtil_SetInputChannel, + PaUtil_SetInterleavedInputChannels, PaUtil_SetNonInterleavedInputChannel. + Which function you call will depend on whether the host buffer(s) are + interleaved or not. + -# Call PaUtil_CopyInput with the user buffer pointer (or a copy of the + array of buffer pointers for a non-interleaved stream) passed to + Pa_ReadStream, along with the number of frames in the user buffer(s). + Be careful to pass a copy of the user buffer pointers to + PaUtil_CopyInput because PaUtil_CopyInput advances the pointers to + the start of the next region to copy. + - PaUtil_CopyInput will not copy more data than is available in the + host buffer(s), so the above steps need to be repeated until the user + buffer(s) are full. + + + To copy data to the host output buffer from the user buffers(s) supplied + to Pa_WriteStream use the following calling sequence. + + - Repeat the following three steps until all frames from the user buffer(s) + have been copied to the host API: + -# Call PaUtil_SetOutputFrameCount with the number of frames in the host + output buffer. + -# Call one of the following functions one or more times to tell the + buffer processor about the host output buffer(s): PaUtil_SetOutputChannel, + PaUtil_SetInterleavedOutputChannels, PaUtil_SetNonInterleavedOutputChannel. + Which function you call will depend on whether the host buffer(s) are + interleaved or not. + -# Call PaUtil_CopyOutput with the user buffer pointer (or a copy of the + array of buffer pointers for a non-interleaved stream) passed to + Pa_WriteStream, along with the number of frames in the user buffer(s). + Be careful to pass a copy of the user buffer pointers to + PaUtil_CopyOutput because PaUtil_CopyOutput advances the pointers to + the start of the next region to copy. + - PaUtil_CopyOutput will not copy more data than fits in the host buffer(s), + so the above steps need to be repeated until all user data is copied. +*/ + + +#include "portaudio.h" +#include "pa_converters.h" +#include "pa_dither.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** @brief Mode flag passed to PaUtil_InitializeBufferProcessor indicating the type + of buffering that the host API uses. + + The mode used depends on whether the host API or the implementation manages + the buffers, and how these buffers are used (scatter gather, circular buffer). +*/ +typedef enum { +/** The host buffer size is a fixed known size. */ + paUtilFixedHostBufferSize, + +/** The host buffer size may vary, but has a known maximum size. */ + paUtilBoundedHostBufferSize, + +/** Nothing is known about the host buffer size. */ + paUtilUnknownHostBufferSize, + +/** The host buffer size varies, and the client does not require the buffer + processor to consume all of the input and fill all of the output buffer. This + is useful when the implementation has access to the host API's circular buffer + and only needs to consume/fill some of it, not necessarily all of it, with each + call to the buffer processor. This is the only mode where + PaUtil_EndBufferProcessing() may not consume the whole buffer. +*/ + paUtilVariableHostBufferSizePartialUsageAllowed +}PaUtilHostBufferSizeMode; + + +/** @brief An auxilliary data structure used internally by the buffer processor + to represent host input and output buffers. */ +typedef struct PaUtilChannelDescriptor{ + void *data; + unsigned int stride; /**< stride in samples, not bytes */ +}PaUtilChannelDescriptor; + + +/** @brief The main buffer processor data structure. + + Allocate one of these, initialize it with PaUtil_InitializeBufferProcessor + and terminate it with PaUtil_TerminateBufferProcessor. +*/ +typedef struct { + unsigned long framesPerUserBuffer; + unsigned long framesPerHostBuffer; + + PaUtilHostBufferSizeMode hostBufferSizeMode; + int useNonAdaptingProcess; + int userOutputSampleFormatIsEqualToHost; + int userInputSampleFormatIsEqualToHost; + unsigned long framesPerTempBuffer; + + unsigned int inputChannelCount; + unsigned int bytesPerHostInputSample; + unsigned int bytesPerUserInputSample; + int userInputIsInterleaved; + PaUtilConverter *inputConverter; + PaUtilZeroer *inputZeroer; + + unsigned int outputChannelCount; + unsigned int bytesPerHostOutputSample; + unsigned int bytesPerUserOutputSample; + int userOutputIsInterleaved; + PaUtilConverter *outputConverter; + PaUtilZeroer *outputZeroer; + + unsigned long initialFramesInTempInputBuffer; + unsigned long initialFramesInTempOutputBuffer; + + void *tempInputBuffer; /**< used for slips, block adaption, and conversion. */ + void **tempInputBufferPtrs; /**< storage for non-interleaved buffer pointers, NULL for interleaved user input */ + unsigned long framesInTempInputBuffer; /**< frames remaining in input buffer from previous adaption iteration */ + + void *tempOutputBuffer; /**< used for slips, block adaption, and conversion. */ + void **tempOutputBufferPtrs; /**< storage for non-interleaved buffer pointers, NULL for interleaved user output */ + unsigned long framesInTempOutputBuffer; /**< frames remaining in input buffer from previous adaption iteration */ + + PaStreamCallbackTimeInfo *timeInfo; + + PaStreamCallbackFlags callbackStatusFlags; + + int hostInputIsInterleaved; + unsigned long hostInputFrameCount[2]; + PaUtilChannelDescriptor *hostInputChannels[2]; /**< pointers to arrays of channel descriptors. + pointers are NULL for half-duplex output processing. + hostInputChannels[i].data is NULL when the caller + calls PaUtil_SetNoInput() + */ + int hostOutputIsInterleaved; + unsigned long hostOutputFrameCount[2]; + PaUtilChannelDescriptor *hostOutputChannels[2]; /**< pointers to arrays of channel descriptors. + pointers are NULL for half-duplex input processing. + hostOutputChannels[i].data is NULL when the caller + calls PaUtil_SetNoOutput() + */ + + PaUtilTriangularDitherGenerator ditherGenerator; + + double samplePeriod; + + PaStreamCallback *streamCallback; + void *userData; +} PaUtilBufferProcessor; + + +/** @name Initialization, termination, resetting and info */ +/*@{*/ + +/** Initialize a buffer processor's representation stored in a + PaUtilBufferProcessor structure. Be sure to call + PaUtil_TerminateBufferProcessor after finishing with a buffer processor. + + @param bufferProcessor The buffer processor structure to initialize. + + @param inputChannelCount The number of input channels as passed to + Pa_OpenStream or 0 for an output-only stream. + + @param userInputSampleFormat Format of user input samples, as passed to + Pa_OpenStream. This parameter is ignored for ouput-only streams. + + @param hostInputSampleFormat Format of host input samples. This parameter is + ignored for output-only streams. See note about host buffer interleave below. + + @param outputChannelCount The number of output channels as passed to + Pa_OpenStream or 0 for an input-only stream. + + @param userOutputSampleFormat Format of user output samples, as passed to + Pa_OpenStream. This parameter is ignored for input-only streams. + + @param hostOutputSampleFormat Format of host output samples. This parameter is + ignored for input-only streams. See note about host buffer interleave below. + + @param sampleRate Sample rate of the stream. The more accurate this is the + better - it is used for updating time stamps when adapting buffers. + + @param streamFlags Stream flags as passed to Pa_OpenStream, this parameter is + used for selecting special sample conversion options such as clipping and + dithering. + + @param framesPerUserBuffer Number of frames per user buffer, as requested + by the framesPerBuffer parameter to Pa_OpenStream. This parameter may be + zero to indicate that the user will accept any (and varying) buffer sizes. + + @param framesPerHostBuffer Specifies the number of frames per host buffer + for the fixed buffer size mode, and the maximum number of frames + per host buffer for the bounded host buffer size mode. It is ignored for + the other modes. + + @param hostBufferSizeMode A mode flag indicating the size variability of + host buffers that will be passed to the buffer processor. See + PaUtilHostBufferSizeMode for further details. + + @param streamCallback The user stream callback passed to Pa_OpenStream. + + @param userData The user data field passed to Pa_OpenStream. + + @note The interleave flag is ignored for host buffer formats. Host + interleave is determined by the use of different SetInput and SetOutput + functions. + + @return An error code indicating whether the initialization was successful. + If the error code is not PaNoError, the buffer processor was not initialized + and should not be used. + + @see Pa_OpenStream, PaUtilHostBufferSizeMode, PaUtil_TerminateBufferProcessor +*/ +PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bufferProcessor, + int inputChannelCount, PaSampleFormat userInputSampleFormat, + PaSampleFormat hostInputSampleFormat, + int outputChannelCount, PaSampleFormat userOutputSampleFormat, + PaSampleFormat hostOutputSampleFormat, + double sampleRate, + PaStreamFlags streamFlags, + unsigned long framesPerUserBuffer, /* 0 indicates don't care */ + unsigned long framesPerHostBuffer, + PaUtilHostBufferSizeMode hostBufferSizeMode, + PaStreamCallback *streamCallback, void *userData ); + + +/** Terminate a buffer processor's representation. Deallocates any temporary + buffers allocated by PaUtil_InitializeBufferProcessor. + + @param bufferProcessor The buffer processor structure to terminate. + + @see PaUtil_InitializeBufferProcessor. +*/ +void PaUtil_TerminateBufferProcessor( PaUtilBufferProcessor* bufferProcessor ); + + +/** Clear any internally buffered data. If you call + PaUtil_InitializeBufferProcessor in your OpenStream routine, make sure you + call PaUtil_ResetBufferProcessor in your StartStream call. + + @param bufferProcessor The buffer processor to reset. +*/ +void PaUtil_ResetBufferProcessor( PaUtilBufferProcessor* bufferProcessor ); + + +/** Retrieve the input latency of a buffer processor, in frames. + + @param bufferProcessor The buffer processor examine. + + @return The input latency introduced by the buffer processor, in frames. + + @see PaUtil_GetBufferProcessorOutputLatencyFrames +*/ +unsigned long PaUtil_GetBufferProcessorInputLatencyFrames( PaUtilBufferProcessor* bufferProcessor ); + +/** Retrieve the output latency of a buffer processor, in frames. + + @param bufferProcessor The buffer processor examine. + + @return The output latency introduced by the buffer processor, in frames. + + @see PaUtil_GetBufferProcessorInputLatencyFrames +*/ +unsigned long PaUtil_GetBufferProcessorOutputLatencyFrames( PaUtilBufferProcessor* bufferProcessor ); + +/*@}*/ + + +/** @name Host buffer pointer configuration + + Functions to set host input and output buffers, used by both callback streams + and blocking read/write streams. +*/ +/*@{*/ + + +/** Set the number of frames in the input host buffer(s) specified by the + PaUtil_Set*InputChannel functions. + + @param bufferProcessor The buffer processor. + + @param frameCount The number of host input frames. A 0 frameCount indicates to + use the framesPerHostBuffer value passed to PaUtil_InitializeBufferProcessor. + + @see PaUtil_SetNoInput, PaUtil_SetInputChannel, + PaUtil_SetInterleavedInputChannels, PaUtil_SetNonInterleavedInputChannel +*/ +void PaUtil_SetInputFrameCount( PaUtilBufferProcessor* bufferProcessor, + unsigned long frameCount ); + + +/** Indicate that no input is avalable. This function should be used when + priming the output of a full-duplex stream opened with the + paPrimeOutputBuffersUsingStreamCallback flag. Note that it is not necessary + to call this or any othe PaUtil_Set*Input* functions for ouput-only streams. + + @param bufferProcessor The buffer processor. +*/ +void PaUtil_SetNoInput( PaUtilBufferProcessor* bufferProcessor ); + + +/** Provide the buffer processor with a pointer to a host input channel. + + @param bufferProcessor The buffer processor. + @param channel The channel number. + @param data The buffer. + @param stride The stride from one sample to the next, in samples. For + interleaved host buffers, the stride will usually be the same as the number of + channels in the buffer. +*/ +void PaUtil_SetInputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data, unsigned int stride ); + + +/** Provide the buffer processor with a pointer to an number of interleaved + host input channels. + + @param bufferProcessor The buffer processor. + @param firstChannel The first channel number. + @param data The buffer. + @param channelCount The number of interleaved channels in the buffer. If + channelCount is zero, the number of channels specified to + PaUtil_InitializeBufferProcessor will be used. +*/ +void PaUtil_SetInterleavedInputChannels( PaUtilBufferProcessor* bufferProcessor, + unsigned int firstChannel, void *data, unsigned int channelCount ); + + +/** Provide the buffer processor with a pointer to one non-interleaved host + output channel. + + @param bufferProcessor The buffer processor. + @param channel The channel number. + @param data The buffer. +*/ +void PaUtil_SetNonInterleavedInputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data ); + + +/** Use for the second buffer half when the input buffer is split in two halves. + @see PaUtil_SetInputFrameCount +*/ +void PaUtil_Set2ndInputFrameCount( PaUtilBufferProcessor* bufferProcessor, + unsigned long frameCount ); + +/** Use for the second buffer half when the input buffer is split in two halves. + @see PaUtil_SetInputChannel +*/ +void PaUtil_Set2ndInputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data, unsigned int stride ); + +/** Use for the second buffer half when the input buffer is split in two halves. + @see PaUtil_SetInterleavedInputChannels +*/ +void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bufferProcessor, + unsigned int firstChannel, void *data, unsigned int channelCount ); + +/** Use for the second buffer half when the input buffer is split in two halves. + @see PaUtil_SetNonInterleavedInputChannel +*/ +void PaUtil_Set2ndNonInterleavedInputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data ); + + +/** Set the number of frames in the output host buffer(s) specified by the + PaUtil_Set*OutputChannel functions. + + @param bufferProcessor The buffer processor. + + @param frameCount The number of host output frames. A 0 frameCount indicates to + use the framesPerHostBuffer value passed to PaUtil_InitializeBufferProcessor. + + @see PaUtil_SetOutputChannel, PaUtil_SetInterleavedOutputChannels, + PaUtil_SetNonInterleavedOutputChannel +*/ +void PaUtil_SetOutputFrameCount( PaUtilBufferProcessor* bufferProcessor, + unsigned long frameCount ); + + +/** Indicate that the output will be discarded. This function should be used + when implementing the paNeverDropInput mode for full duplex streams. + + @param bufferProcessor The buffer processor. +*/ +void PaUtil_SetNoOutput( PaUtilBufferProcessor* bufferProcessor ); + + +/** Provide the buffer processor with a pointer to a host output channel. + + @param bufferProcessor The buffer processor. + @param channel The channel number. + @param data The buffer. + @param stride The stride from one sample to the next, in samples. For + interleaved host buffers, the stride will usually be the same as the number of + channels in the buffer. +*/ +void PaUtil_SetOutputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data, unsigned int stride ); + + +/** Provide the buffer processor with a pointer to a number of interleaved + host output channels. + + @param bufferProcessor The buffer processor. + @param firstChannel The first channel number. + @param data The buffer. + @param channelCount The number of interleaved channels in the buffer. If + channelCount is zero, the number of channels specified to + PaUtil_InitializeBufferProcessor will be used. +*/ +void PaUtil_SetInterleavedOutputChannels( PaUtilBufferProcessor* bufferProcessor, + unsigned int firstChannel, void *data, unsigned int channelCount ); + + +/** Provide the buffer processor with a pointer to one non-interleaved host + output channel. + + @param bufferProcessor The buffer processor. + @param channel The channel number. + @param data The buffer. +*/ +void PaUtil_SetNonInterleavedOutputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data ); + + +/** Use for the second buffer half when the output buffer is split in two halves. + @see PaUtil_SetOutputFrameCount +*/ +void PaUtil_Set2ndOutputFrameCount( PaUtilBufferProcessor* bufferProcessor, + unsigned long frameCount ); + +/** Use for the second buffer half when the output buffer is split in two halves. + @see PaUtil_SetOutputChannel +*/ +void PaUtil_Set2ndOutputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data, unsigned int stride ); + +/** Use for the second buffer half when the output buffer is split in two halves. + @see PaUtil_SetInterleavedOutputChannels +*/ +void PaUtil_Set2ndInterleavedOutputChannels( PaUtilBufferProcessor* bufferProcessor, + unsigned int firstChannel, void *data, unsigned int channelCount ); + +/** Use for the second buffer half when the output buffer is split in two halves. + @see PaUtil_SetNonInterleavedOutputChannel +*/ +void PaUtil_Set2ndNonInterleavedOutputChannel( PaUtilBufferProcessor* bufferProcessor, + unsigned int channel, void *data ); + +/*@}*/ + + +/** @name Buffer processing functions for callback streams +*/ +/*@{*/ + +/** Commence processing a host buffer (or a pair of host buffers in the + full-duplex case) for a callback stream. + + @param bufferProcessor The buffer processor. + + @param timeInfo Timing information for the first sample of the host + buffer(s). This information may be adjusted when buffer adaption is being + performed. + + @param callbackStatusFlags Flags indicating whether underruns and overruns + have occurred since the last time the buffer processor was called. +*/ +void PaUtil_BeginBufferProcessing( PaUtilBufferProcessor* bufferProcessor, + PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags callbackStatusFlags ); + + +/** Finish processing a host buffer (or a pair of host buffers in the + full-duplex case) for a callback stream. + + @param bufferProcessor The buffer processor. + + @param callbackResult On input, indicates a previous callback result, and on + exit, the result of the user stream callback, if it is called. + On entry callbackResult should contain one of { paContinue, paComplete, or + paAbort}. If paComplete is passed, the stream callback will not be called + but any audio that was generated by previous stream callbacks will be copied + to the output buffer(s). You can check whether the buffer processor's internal + buffer is empty by calling PaUtil_IsBufferProcessorOutputEmpty. + + If the stream callback is called its result is stored in *callbackResult. If + the stream callback returns paComplete or paAbort, all output buffers will be + full of valid data - some of which may be zeros to acount for data that + wasn't generated by the terminating callback. + + @return The number of frames processed. This usually corresponds to the + number of frames specified by the PaUtil_Set*FrameCount functions, exept in + the paUtilVariableHostBufferSizePartialUsageAllowed buffer size mode when a + smaller value may be returned. +*/ +unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bufferProcessor, + int *callbackResult ); + + +/** Determine whether any callback generated output remains in the bufffer + processor's internal buffers. This method may be used to determine when to + continue calling PaUtil_EndBufferProcessing() after the callback has returned + a callbackResult of paComplete. + + @param bufferProcessor The buffer processor. + + @return Returns non-zero when callback generated output remains in the internal + buffer and zero (0) when there internal buffer contains no callback generated + data. +*/ +int PaUtil_IsBufferProcessorOutputEmpty( PaUtilBufferProcessor* bufferProcessor ); + +/*@}*/ + + +/** @name Buffer processing functions for blocking read/write streams +*/ +/*@{*/ + +/** Copy samples from host input channels set up by the PaUtil_Set*InputChannels + functions to a user supplied buffer. This function is intended for use with + blocking read/write streams. Copies the minimum of the number of + user frames (specified by the frameCount parameter) and the number of available + host frames (specified in a previous call to SetInputFrameCount()). + + @param bufferProcessor The buffer processor. + + @param buffer A pointer to the user buffer pointer, or a pointer to a pointer + to an array of user buffer pointers for a non-interleaved stream. It is + important that this parameter points to a copy of the user buffer pointers, + not to the actual user buffer pointers, because this function updates the + pointers before returning. + + @param frameCount The number of frames of data in the buffer(s) pointed to by + the buffer parameter. + + @return The number of frames copied. The buffer pointer(s) pointed to by the + buffer parameter are advanced to point to the frame(s) following the last one + filled. +*/ +unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bufferProcessor, + void **buffer, unsigned long frameCount ); + + +/* Copy samples from a user supplied buffer to host output channels set up by + the PaUtil_Set*OutputChannels functions. This function is intended for use with + blocking read/write streams. Copies the minimum of the number of + user frames (specified by the frameCount parameter) and the number of + host frames (specified in a previous call to SetOutputFrameCount()). + + @param bufferProcessor The buffer processor. + + @param buffer A pointer to the user buffer pointer, or a pointer to a pointer + to an array of user buffer pointers for a non-interleaved stream. It is + important that this parameter points to a copy of the user buffer pointers, + not to the actual user buffer pointers, because this function updates the + pointers before returning. + + @param frameCount The number of frames of data in the buffer(s) pointed to by + the buffer parameter. + + @return The number of frames copied. The buffer pointer(s) pointed to by the + buffer parameter are advanced to point to the frame(s) following the last one + copied. +*/ +unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bufferProcessor, + const void ** buffer, unsigned long frameCount ); + + +/* Zero samples in host output channels set up by the PaUtil_Set*OutputChannels + functions. This function is useful for flushing streams. + Zeros the minimum of frameCount and the number of host frames specified in a + previous call to SetOutputFrameCount(). + + @param bufferProcessor The buffer processor. + + @param frameCount The maximum number of frames to zero. + + @return The number of frames zeroed. +*/ +unsigned long PaUtil_ZeroOutput( PaUtilBufferProcessor* bufferProcessor, + unsigned long frameCount ); + + +/*@}*/ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_PROCESS_H */ diff --git a/Externals/portaudio/src/common/pa_ringbuffer.c b/Externals/portaudio/src/common/pa_ringbuffer.c new file mode 100644 index 0000000000..19c91497ce --- /dev/null +++ b/Externals/portaudio/src/common/pa_ringbuffer.c @@ -0,0 +1,237 @@ +/* + * $Id: pa_ringbuffer.c 1738 2011-08-18 11:47:28Z rossb $ + * Portable Audio I/O Library + * Ring Buffer utility. + * + * Author: Phil Burk, http://www.softsynth.com + * modified for SMP safety on Mac OS X by Bjorn Roche + * modified for SMP safety on Linux by Leland Lucius + * also, allowed for const where possible + * modified for multiple-byte-sized data elements by Sven Fischer + * + * Note that this is safe only for a single-thread reader and a + * single-thread writer. + * + * This program uses the PortAudio Portable Audio Library. + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup common_src +*/ + +#include +#include +#include +#include "pa_ringbuffer.h" +#include +#include "pa_memorybarrier.h" + +/*************************************************************************** + * Initialize FIFO. + * elementCount must be power of 2, returns -1 if not. + */ +ring_buffer_size_t PaUtil_InitializeRingBuffer( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementSizeBytes, ring_buffer_size_t elementCount, void *dataPtr ) +{ + if( ((elementCount-1) & elementCount) != 0) return -1; /* Not Power of two. */ + rbuf->bufferSize = elementCount; + rbuf->buffer = (char *)dataPtr; + PaUtil_FlushRingBuffer( rbuf ); + rbuf->bigMask = (elementCount*2)-1; + rbuf->smallMask = (elementCount)-1; + rbuf->elementSizeBytes = elementSizeBytes; + return 0; +} + +/*************************************************************************** +** Return number of elements available for reading. */ +ring_buffer_size_t PaUtil_GetRingBufferReadAvailable( const PaUtilRingBuffer *rbuf ) +{ + return ( (rbuf->writeIndex - rbuf->readIndex) & rbuf->bigMask ); +} +/*************************************************************************** +** Return number of elements available for writing. */ +ring_buffer_size_t PaUtil_GetRingBufferWriteAvailable( const PaUtilRingBuffer *rbuf ) +{ + return ( rbuf->bufferSize - PaUtil_GetRingBufferReadAvailable(rbuf)); +} + +/*************************************************************************** +** Clear buffer. Should only be called when buffer is NOT being read or written. */ +void PaUtil_FlushRingBuffer( PaUtilRingBuffer *rbuf ) +{ + rbuf->writeIndex = rbuf->readIndex = 0; +} + +/*************************************************************************** +** Get address of region(s) to which we can write data. +** If the region is contiguous, size2 will be zero. +** If non-contiguous, size2 will be the size of second region. +** Returns room available to be written or elementCount, whichever is smaller. +*/ +ring_buffer_size_t PaUtil_GetRingBufferWriteRegions( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount, + void **dataPtr1, ring_buffer_size_t *sizePtr1, + void **dataPtr2, ring_buffer_size_t *sizePtr2 ) +{ + ring_buffer_size_t index; + ring_buffer_size_t available = PaUtil_GetRingBufferWriteAvailable( rbuf ); + if( elementCount > available ) elementCount = available; + /* Check to see if write is not contiguous. */ + index = rbuf->writeIndex & rbuf->smallMask; + if( (index + elementCount) > rbuf->bufferSize ) + { + /* Write data in two blocks that wrap the buffer. */ + ring_buffer_size_t firstHalf = rbuf->bufferSize - index; + *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes]; + *sizePtr1 = firstHalf; + *dataPtr2 = &rbuf->buffer[0]; + *sizePtr2 = elementCount - firstHalf; + } + else + { + *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes]; + *sizePtr1 = elementCount; + *dataPtr2 = NULL; + *sizePtr2 = 0; + } + + if( available ) + PaUtil_FullMemoryBarrier(); /* (write-after-read) => full barrier */ + + return elementCount; +} + + +/*************************************************************************** +*/ +ring_buffer_size_t PaUtil_AdvanceRingBufferWriteIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) +{ + /* ensure that previous writes are seen before we update the write index + (write after write) + */ + PaUtil_WriteMemoryBarrier(); + return rbuf->writeIndex = (rbuf->writeIndex + elementCount) & rbuf->bigMask; +} + +/*************************************************************************** +** Get address of region(s) from which we can read data. +** If the region is contiguous, size2 will be zero. +** If non-contiguous, size2 will be the size of second region. +** Returns room available to be read or elementCount, whichever is smaller. +*/ +ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount, + void **dataPtr1, ring_buffer_size_t *sizePtr1, + void **dataPtr2, ring_buffer_size_t *sizePtr2 ) +{ + ring_buffer_size_t index; + ring_buffer_size_t available = PaUtil_GetRingBufferReadAvailable( rbuf ); /* doesn't use memory barrier */ + if( elementCount > available ) elementCount = available; + /* Check to see if read is not contiguous. */ + index = rbuf->readIndex & rbuf->smallMask; + if( (index + elementCount) > rbuf->bufferSize ) + { + /* Write data in two blocks that wrap the buffer. */ + ring_buffer_size_t firstHalf = rbuf->bufferSize - index; + *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes]; + *sizePtr1 = firstHalf; + *dataPtr2 = &rbuf->buffer[0]; + *sizePtr2 = elementCount - firstHalf; + } + else + { + *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes]; + *sizePtr1 = elementCount; + *dataPtr2 = NULL; + *sizePtr2 = 0; + } + + if( available ) + PaUtil_ReadMemoryBarrier(); /* (read-after-read) => read barrier */ + + return elementCount; +} +/*************************************************************************** +*/ +ring_buffer_size_t PaUtil_AdvanceRingBufferReadIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) +{ + /* ensure that previous reads (copies out of the ring buffer) are always completed before updating (writing) the read index. + (write-after-read) => full barrier + */ + PaUtil_FullMemoryBarrier(); + return rbuf->readIndex = (rbuf->readIndex + elementCount) & rbuf->bigMask; +} + +/*************************************************************************** +** Return elements written. */ +ring_buffer_size_t PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, ring_buffer_size_t elementCount ) +{ + ring_buffer_size_t size1, size2, numWritten; + void *data1, *data2; + numWritten = PaUtil_GetRingBufferWriteRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 ); + if( size2 > 0 ) + { + + memcpy( data1, data, size1*rbuf->elementSizeBytes ); + data = ((char *)data) + size1*rbuf->elementSizeBytes; + memcpy( data2, data, size2*rbuf->elementSizeBytes ); + } + else + { + memcpy( data1, data, size1*rbuf->elementSizeBytes ); + } + PaUtil_AdvanceRingBufferWriteIndex( rbuf, numWritten ); + return numWritten; +} + +/*************************************************************************** +** Return elements read. */ +ring_buffer_size_t PaUtil_ReadRingBuffer( PaUtilRingBuffer *rbuf, void *data, ring_buffer_size_t elementCount ) +{ + ring_buffer_size_t size1, size2, numRead; + void *data1, *data2; + numRead = PaUtil_GetRingBufferReadRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 ); + if( size2 > 0 ) + { + memcpy( data, data1, size1*rbuf->elementSizeBytes ); + data = ((char *)data) + size1*rbuf->elementSizeBytes; + memcpy( data, data2, size2*rbuf->elementSizeBytes ); + } + else + { + memcpy( data, data1, size1*rbuf->elementSizeBytes ); + } + PaUtil_AdvanceRingBufferReadIndex( rbuf, numRead ); + return numRead; +} diff --git a/Externals/portaudio/src/common/pa_ringbuffer.h b/Externals/portaudio/src/common/pa_ringbuffer.h new file mode 100644 index 0000000000..51577f0707 --- /dev/null +++ b/Externals/portaudio/src/common/pa_ringbuffer.h @@ -0,0 +1,233 @@ +#ifndef PA_RINGBUFFER_H +#define PA_RINGBUFFER_H +/* + * $Id: pa_ringbuffer.h 1734 2011-08-18 11:19:36Z rossb $ + * Portable Audio I/O Library + * Ring Buffer utility. + * + * Author: Phil Burk, http://www.softsynth.com + * modified for SMP safety on OS X by Bjorn Roche. + * also allowed for const where possible. + * modified for multiple-byte-sized data elements by Sven Fischer + * + * Note that this is safe only for a single-thread reader + * and a single-thread writer. + * + * This program is distributed with the PortAudio Portable Audio Library. + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + @brief Single-reader single-writer lock-free ring buffer + + PaUtilRingBuffer is a ring buffer used to transport samples between + different execution contexts (threads, OS callbacks, interrupt handlers) + without requiring the use of any locks. This only works when there is + a single reader and a single writer (ie. one thread or callback writes + to the ring buffer, another thread or callback reads from it). + + The PaUtilRingBuffer structure manages a ring buffer containing N + elements, where N must be a power of two. An element may be any size + (specified in bytes). + + The memory area used to store the buffer elements must be allocated by + the client prior to calling PaUtil_InitializeRingBuffer() and must outlive + the use of the ring buffer. +*/ + +#if defined(__APPLE__) +#include +typedef int32_t ring_buffer_size_t; +#elif defined( __GNUC__ ) +typedef long ring_buffer_size_t; +#elif (_MSC_VER >= 1400) +typedef long ring_buffer_size_t; +#elif defined(_MSC_VER) || defined(__BORLANDC__) +typedef long ring_buffer_size_t; +#else +typedef long ring_buffer_size_t; +#endif + + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef struct PaUtilRingBuffer +{ + ring_buffer_size_t bufferSize; /**< Number of elements in FIFO. Power of 2. Set by PaUtil_InitRingBuffer. */ + volatile ring_buffer_size_t writeIndex; /**< Index of next writable element. Set by PaUtil_AdvanceRingBufferWriteIndex. */ + volatile ring_buffer_size_t readIndex; /**< Index of next readable element. Set by PaUtil_AdvanceRingBufferReadIndex. */ + ring_buffer_size_t bigMask; /**< Used for wrapping indices with extra bit to distinguish full/empty. */ + ring_buffer_size_t smallMask; /**< Used for fitting indices to buffer. */ + ring_buffer_size_t elementSizeBytes; /**< Number of bytes per element. */ + char *buffer; /**< Pointer to the buffer containing the actual data. */ +}PaUtilRingBuffer; + +/** Initialize Ring Buffer to empty state ready to have elements written to it. + + @param rbuf The ring buffer. + + @param elementSizeBytes The size of a single data element in bytes. + + @param elementCount The number of elements in the buffer (must be a power of 2). + + @param dataPtr A pointer to a previously allocated area where the data + will be maintained. It must be elementCount*elementSizeBytes long. + + @return -1 if elementCount is not a power of 2, otherwise 0. +*/ +ring_buffer_size_t PaUtil_InitializeRingBuffer( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementSizeBytes, ring_buffer_size_t elementCount, void *dataPtr ); + +/** Reset buffer to empty. Should only be called when buffer is NOT being read or written. + + @param rbuf The ring buffer. +*/ +void PaUtil_FlushRingBuffer( PaUtilRingBuffer *rbuf ); + +/** Retrieve the number of elements available in the ring buffer for writing. + + @param rbuf The ring buffer. + + @return The number of elements available for writing. +*/ +ring_buffer_size_t PaUtil_GetRingBufferWriteAvailable( const PaUtilRingBuffer *rbuf ); + +/** Retrieve the number of elements available in the ring buffer for reading. + + @param rbuf The ring buffer. + + @return The number of elements available for reading. +*/ +ring_buffer_size_t PaUtil_GetRingBufferReadAvailable( const PaUtilRingBuffer *rbuf ); + +/** Write data to the ring buffer. + + @param rbuf The ring buffer. + + @param data The address of new data to write to the buffer. + + @param elementCount The number of elements to be written. + + @return The number of elements written. +*/ +ring_buffer_size_t PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, ring_buffer_size_t elementCount ); + +/** Read data from the ring buffer. + + @param rbuf The ring buffer. + + @param data The address where the data should be stored. + + @param elementCount The number of elements to be read. + + @return The number of elements read. +*/ +ring_buffer_size_t PaUtil_ReadRingBuffer( PaUtilRingBuffer *rbuf, void *data, ring_buffer_size_t elementCount ); + +/** Get address of region(s) to which we can write data. + + @param rbuf The ring buffer. + + @param elementCount The number of elements desired. + + @param dataPtr1 The address where the first (or only) region pointer will be + stored. + + @param sizePtr1 The address where the first (or only) region length will be + stored. + + @param dataPtr2 The address where the second region pointer will be stored if + the first region is too small to satisfy elementCount. + + @param sizePtr2 The address where the second region length will be stored if + the first region is too small to satisfy elementCount. + + @return The room available to be written or elementCount, whichever is smaller. +*/ +ring_buffer_size_t PaUtil_GetRingBufferWriteRegions( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount, + void **dataPtr1, ring_buffer_size_t *sizePtr1, + void **dataPtr2, ring_buffer_size_t *sizePtr2 ); + +/** Advance the write index to the next location to be written. + + @param rbuf The ring buffer. + + @param elementCount The number of elements to advance. + + @return The new position. +*/ +ring_buffer_size_t PaUtil_AdvanceRingBufferWriteIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ); + +/** Get address of region(s) from which we can read data. + + @param rbuf The ring buffer. + + @param elementCount The number of elements desired. + + @param dataPtr1 The address where the first (or only) region pointer will be + stored. + + @param sizePtr1 The address where the first (or only) region length will be + stored. + + @param dataPtr2 The address where the second region pointer will be stored if + the first region is too small to satisfy elementCount. + + @param sizePtr2 The address where the second region length will be stored if + the first region is too small to satisfy elementCount. + + @return The number of elements available for reading. +*/ +ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount, + void **dataPtr1, ring_buffer_size_t *sizePtr1, + void **dataPtr2, ring_buffer_size_t *sizePtr2 ); + +/** Advance the read index to the next location to be read. + + @param rbuf The ring buffer. + + @param elementCount The number of elements to advance. + + @return The new position. +*/ +ring_buffer_size_t PaUtil_AdvanceRingBufferReadIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_RINGBUFFER_H */ diff --git a/Externals/portaudio/src/common/pa_stream.c b/Externals/portaudio/src/common/pa_stream.c new file mode 100644 index 0000000000..ea91821f8d --- /dev/null +++ b/Externals/portaudio/src/common/pa_stream.c @@ -0,0 +1,150 @@ +/* + * $Id: pa_stream.c 1339 2008-02-15 07:50:33Z rossb $ + * Portable Audio I/O Library + * stream interface + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 2008 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Stream interfaces, representation structures and helper functions + used to interface between pa_front.c host API implementations. +*/ + + +#include "pa_stream.h" + + +void PaUtil_InitializeStreamInterface( PaUtilStreamInterface *streamInterface, + PaError (*Close)( PaStream* ), + PaError (*Start)( PaStream* ), + PaError (*Stop)( PaStream* ), + PaError (*Abort)( PaStream* ), + PaError (*IsStopped)( PaStream* ), + PaError (*IsActive)( PaStream* ), + PaTime (*GetTime)( PaStream* ), + double (*GetCpuLoad)( PaStream* ), + PaError (*Read)( PaStream*, void *, unsigned long ), + PaError (*Write)( PaStream*, const void *, unsigned long ), + signed long (*GetReadAvailable)( PaStream* ), + signed long (*GetWriteAvailable)( PaStream* ) ) +{ + streamInterface->Close = Close; + streamInterface->Start = Start; + streamInterface->Stop = Stop; + streamInterface->Abort = Abort; + streamInterface->IsStopped = IsStopped; + streamInterface->IsActive = IsActive; + streamInterface->GetTime = GetTime; + streamInterface->GetCpuLoad = GetCpuLoad; + streamInterface->Read = Read; + streamInterface->Write = Write; + streamInterface->GetReadAvailable = GetReadAvailable; + streamInterface->GetWriteAvailable = GetWriteAvailable; +} + + +void PaUtil_InitializeStreamRepresentation( PaUtilStreamRepresentation *streamRepresentation, + PaUtilStreamInterface *streamInterface, + PaStreamCallback *streamCallback, + void *userData ) +{ + streamRepresentation->magic = PA_STREAM_MAGIC; + streamRepresentation->nextOpenStream = 0; + streamRepresentation->streamInterface = streamInterface; + streamRepresentation->streamCallback = streamCallback; + streamRepresentation->streamFinishedCallback = 0; + + streamRepresentation->userData = userData; + + streamRepresentation->streamInfo.inputLatency = 0.; + streamRepresentation->streamInfo.outputLatency = 0.; + streamRepresentation->streamInfo.sampleRate = 0.; +} + + +void PaUtil_TerminateStreamRepresentation( PaUtilStreamRepresentation *streamRepresentation ) +{ + streamRepresentation->magic = 0; +} + + +PaError PaUtil_DummyRead( PaStream* stream, + void *buffer, + unsigned long frames ) +{ + (void)stream; /* unused parameter */ + (void)buffer; /* unused parameter */ + (void)frames; /* unused parameter */ + + return paCanNotReadFromACallbackStream; +} + + +PaError PaUtil_DummyWrite( PaStream* stream, + const void *buffer, + unsigned long frames ) +{ + (void)stream; /* unused parameter */ + (void)buffer; /* unused parameter */ + (void)frames; /* unused parameter */ + + return paCanNotWriteToACallbackStream; +} + + +signed long PaUtil_DummyGetReadAvailable( PaStream* stream ) +{ + (void)stream; /* unused parameter */ + + return paCanNotReadFromACallbackStream; +} + + +signed long PaUtil_DummyGetWriteAvailable( PaStream* stream ) +{ + (void)stream; /* unused parameter */ + + return paCanNotWriteToACallbackStream; +} + + +double PaUtil_DummyGetCpuLoad( PaStream* stream ) +{ + (void)stream; /* unused parameter */ + + return 0.0; +} diff --git a/Externals/portaudio/src/common/pa_stream.h b/Externals/portaudio/src/common/pa_stream.h new file mode 100644 index 0000000000..8d707b79cf --- /dev/null +++ b/Externals/portaudio/src/common/pa_stream.h @@ -0,0 +1,205 @@ +#ifndef PA_STREAM_H +#define PA_STREAM_H +/* + * $Id: pa_stream.h 1339 2008-02-15 07:50:33Z rossb $ + * Portable Audio I/O Library + * stream interface + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Stream interfaces, representation structures and helper functions + used to interface between pa_front.c host API implementations. +*/ + + +#include "portaudio.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +#define PA_STREAM_MAGIC (0x18273645) + + +/** A structure representing an (abstract) interface to a host API. Contains + pointers to functions which implement the interface. + + All PaStreamInterface functions are guaranteed to be called with a non-null, + valid stream parameter. +*/ +typedef struct { + PaError (*Close)( PaStream* stream ); + PaError (*Start)( PaStream *stream ); + PaError (*Stop)( PaStream *stream ); + PaError (*Abort)( PaStream *stream ); + PaError (*IsStopped)( PaStream *stream ); + PaError (*IsActive)( PaStream *stream ); + PaTime (*GetTime)( PaStream *stream ); + double (*GetCpuLoad)( PaStream* stream ); + PaError (*Read)( PaStream* stream, void *buffer, unsigned long frames ); + PaError (*Write)( PaStream* stream, const void *buffer, unsigned long frames ); + signed long (*GetReadAvailable)( PaStream* stream ); + signed long (*GetWriteAvailable)( PaStream* stream ); +} PaUtilStreamInterface; + + +/** Initialize the fields of a PaUtilStreamInterface structure. +*/ +void PaUtil_InitializeStreamInterface( PaUtilStreamInterface *streamInterface, + PaError (*Close)( PaStream* ), + PaError (*Start)( PaStream* ), + PaError (*Stop)( PaStream* ), + PaError (*Abort)( PaStream* ), + PaError (*IsStopped)( PaStream* ), + PaError (*IsActive)( PaStream* ), + PaTime (*GetTime)( PaStream* ), + double (*GetCpuLoad)( PaStream* ), + PaError (*Read)( PaStream* stream, void *buffer, unsigned long frames ), + PaError (*Write)( PaStream* stream, const void *buffer, unsigned long frames ), + signed long (*GetReadAvailable)( PaStream* stream ), + signed long (*GetWriteAvailable)( PaStream* stream ) ); + + +/** Dummy Read function for use in interfaces to a callback based streams. + Pass to the Read parameter of PaUtil_InitializeStreamInterface. + @return An error code indicating that the function has no effect + because the stream is a callback stream. +*/ +PaError PaUtil_DummyRead( PaStream* stream, + void *buffer, + unsigned long frames ); + + +/** Dummy Write function for use in an interfaces to callback based streams. + Pass to the Write parameter of PaUtil_InitializeStreamInterface. + @return An error code indicating that the function has no effect + because the stream is a callback stream. +*/ +PaError PaUtil_DummyWrite( PaStream* stream, + const void *buffer, + unsigned long frames ); + + +/** Dummy GetReadAvailable function for use in interfaces to callback based + streams. Pass to the GetReadAvailable parameter of PaUtil_InitializeStreamInterface. + @return An error code indicating that the function has no effect + because the stream is a callback stream. +*/ +signed long PaUtil_DummyGetReadAvailable( PaStream* stream ); + + +/** Dummy GetWriteAvailable function for use in interfaces to callback based + streams. Pass to the GetWriteAvailable parameter of PaUtil_InitializeStreamInterface. + @return An error code indicating that the function has no effect + because the stream is a callback stream. +*/ +signed long PaUtil_DummyGetWriteAvailable( PaStream* stream ); + + + +/** Dummy GetCpuLoad function for use in an interface to a read/write stream. + Pass to the GetCpuLoad parameter of PaUtil_InitializeStreamInterface. + @return Returns 0. +*/ +double PaUtil_DummyGetCpuLoad( PaStream* stream ); + + +/** Non host specific data for a stream. This data is used by pa_front to + forward to the appropriate functions in the streamInterface structure. +*/ +typedef struct PaUtilStreamRepresentation { + unsigned long magic; /**< set to PA_STREAM_MAGIC */ + struct PaUtilStreamRepresentation *nextOpenStream; /**< field used by multi-api code */ + PaUtilStreamInterface *streamInterface; + PaStreamCallback *streamCallback; + PaStreamFinishedCallback *streamFinishedCallback; + void *userData; + PaStreamInfo streamInfo; +} PaUtilStreamRepresentation; + + +/** Initialize a PaUtilStreamRepresentation structure. + + @see PaUtil_InitializeStreamRepresentation +*/ +void PaUtil_InitializeStreamRepresentation( + PaUtilStreamRepresentation *streamRepresentation, + PaUtilStreamInterface *streamInterface, + PaStreamCallback *streamCallback, + void *userData ); + + +/** Clean up a PaUtilStreamRepresentation structure previously initialized + by a call to PaUtil_InitializeStreamRepresentation. + + @see PaUtil_InitializeStreamRepresentation +*/ +void PaUtil_TerminateStreamRepresentation( PaUtilStreamRepresentation *streamRepresentation ); + + +/** Check that the stream pointer is valid. + + @return Returns paNoError if the stream pointer appears to be OK, otherwise + returns an error indicating the cause of failure. +*/ +PaError PaUtil_ValidateStreamPointer( PaStream *stream ); + + +/** Cast an opaque stream pointer into a pointer to a PaUtilStreamRepresentation. + + @see PaUtilStreamRepresentation +*/ +#define PA_STREAM_REP( stream )\ + ((PaUtilStreamRepresentation*) (stream) ) + + +/** Cast an opaque stream pointer into a pointer to a PaUtilStreamInterface. + + @see PaUtilStreamRepresentation, PaUtilStreamInterface +*/ +#define PA_STREAM_INTERFACE( stream )\ + PA_STREAM_REP( (stream) )->streamInterface + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_STREAM_H */ diff --git a/Externals/portaudio/src/common/pa_trace.c b/Externals/portaudio/src/common/pa_trace.c new file mode 100644 index 0000000000..24305003f7 --- /dev/null +++ b/Externals/portaudio/src/common/pa_trace.c @@ -0,0 +1,97 @@ +/* + * $Id: pa_trace.c 1339 2008-02-15 07:50:33Z rossb $ + * Portable Audio I/O Library Trace Facility + * Store trace information in real-time for later printing. + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2000 Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Real-time safe event trace logging facility for debugging. +*/ + + +#include +#include +#include +#include "pa_trace.h" + +#if PA_TRACE_REALTIME_EVENTS + +static char *traceTextArray[PA_MAX_TRACE_RECORDS]; +static int traceIntArray[PA_MAX_TRACE_RECORDS]; +static int traceIndex = 0; +static int traceBlock = 0; + +/*********************************************************************/ +void PaUtil_ResetTraceMessages() +{ + traceIndex = 0; +} + +/*********************************************************************/ +void PaUtil_DumpTraceMessages() +{ + int i; + int messageCount = (traceIndex < PA_MAX_TRACE_RECORDS) ? traceIndex : PA_MAX_TRACE_RECORDS; + + printf("DumpTraceMessages: traceIndex = %d\n", traceIndex ); + for( i=0; i must be included in the + context in which this macro is used. +*/ +#define PA_VALIDATE_TYPE_SIZES \ + { \ + assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaUint16 ) == 2 ); \ + assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaInt16 ) == 2 ); \ + assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaUint32 ) == 4 ); \ + assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaInt32 ) == 4 ); \ + } + + +#endif /* PA_TYPES_H */ diff --git a/Externals/portaudio/src/common/pa_util.h b/Externals/portaudio/src/common/pa_util.h new file mode 100644 index 0000000000..c454ea771d --- /dev/null +++ b/Externals/portaudio/src/common/pa_util.h @@ -0,0 +1,159 @@ +#ifndef PA_UTIL_H +#define PA_UTIL_H +/* + * $Id: pa_util.h 1584 2011-02-02 18:58:17Z rossb $ + * Portable Audio I/O Library implementation utilities header + * common implementation utilities and interfaces + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Prototypes for utility functions used by PortAudio implementations. + + Some functions declared here are defined in pa_front.c while others + are implemented separately for each platform. +*/ + + +#include "portaudio.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +struct PaUtilHostApiRepresentation; + + +/** Retrieve a specific host API representation. This function can be used + by implementations to retrieve a pointer to their representation in + host api specific extension functions which aren't passed a rep pointer + by pa_front.c. + + @param hostApi A pointer to a host API represenation pointer. Apon success + this will receive the requested representation pointer. + + @param type A valid host API type identifier. + + @returns An error code. If the result is PaNoError then a pointer to the + requested host API representation will be stored in *hostApi. If the host API + specified by type is not found, this function returns paHostApiNotFound. +*/ +PaError PaUtil_GetHostApiRepresentation( struct PaUtilHostApiRepresentation **hostApi, + PaHostApiTypeId type ); + + +/** Convert a PortAudio device index into a host API specific device index. + @param hostApiDevice Pointer to a device index, on success this will recieve the + converted device index value. + @param device The PortAudio device index to convert. + @param hostApi The host api which the index should be converted for. + + @returns On success returns PaNoError and places the converted index in the + hostApiDevice parameter. +*/ +PaError PaUtil_DeviceIndexToHostApiDeviceIndex( + PaDeviceIndex *hostApiDevice, PaDeviceIndex device, + struct PaUtilHostApiRepresentation *hostApi ); + + +/** Set the host error information returned by Pa_GetLastHostErrorInfo. This + function and the paUnanticipatedHostError error code should be used as a + last resort. Implementors should use existing PA error codes where possible, + or nominate new ones. Note that at it is always better to use + PaUtil_SetLastHostErrorInfo() and paUnanticipatedHostError than to return an + ambiguous or inaccurate PaError code. + + @param hostApiType The host API which encountered the error (ie of the caller) + + @param errorCode The error code returned by the native API function. + + @param errorText A string describing the error. PaUtil_SetLastHostErrorInfo + makes a copy of the string, so it is not necessary for the pointer to remain + valid after the call to PaUtil_SetLastHostErrorInfo() returns. + +*/ +void PaUtil_SetLastHostErrorInfo( PaHostApiTypeId hostApiType, long errorCode, + const char *errorText ); + + + +/* the following functions are implemented in a platform platform specific + .c file +*/ + +/** Allocate size bytes, guaranteed to be aligned to a FIXME byte boundary */ +void *PaUtil_AllocateMemory( long size ); + + +/** Realease block if non-NULL. block may be NULL */ +void PaUtil_FreeMemory( void *block ); + + +/** Return the number of currently allocated blocks. This function can be + used for detecting memory leaks. + + @note Allocations will only be tracked if PA_TRACK_MEMORY is #defined. If + it isn't, this function will always return 0. +*/ +int PaUtil_CountCurrentlyAllocatedBlocks( void ); + + +/** Initialize the clock used by PaUtil_GetTime(). Call this before calling + PaUtil_GetTime. + + @see PaUtil_GetTime +*/ +void PaUtil_InitializeClock( void ); + + +/** Return the system time in seconds. Used to implement CPU load functions + + @see PaUtil_InitializeClock +*/ +double PaUtil_GetTime( void ); + + +/* void Pa_Sleep( long msec ); must also be implemented in per-platform .c file */ + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_UTIL_H */ diff --git a/Externals/portaudio/src/hostapi/alsa/pa_linux_alsa.c b/Externals/portaudio/src/hostapi/alsa/pa_linux_alsa.c new file mode 100644 index 0000000000..97c2ebcfce --- /dev/null +++ b/Externals/portaudio/src/hostapi/alsa/pa_linux_alsa.c @@ -0,0 +1,4552 @@ +/* + * $Id: pa_linux_alsa.c 1691 2011-05-26 20:19:19Z aknudsen $ + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * ALSA implementation by Joshua Haberman and Arve Knudsen + * + * Copyright (c) 2002 Joshua Haberman + * Copyright (c) 2005-2009 Arve Knudsen + * Copyright (c) 2008 Kevin Kofler + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#define ALSA_PCM_NEW_HW_PARAMS_API +#define ALSA_PCM_NEW_SW_PARAMS_API +#include +#undef ALSA_PCM_NEW_HW_PARAMS_API +#undef ALSA_PCM_NEW_SW_PARAMS_API + +#include +#include /* strlen() */ +#include +#include +#include +#include +#include +#include +#include /* For sig_atomic_t */ +#ifdef PA_ALSA_DYNAMIC + #include /* For dlXXX functions */ +#endif + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_unix_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_endianness.h" +#include "pa_debugprint.h" + +#include "pa_linux_alsa.h" + +#ifndef SND_PCM_TSTAMP_ENABLE +#define SND_PCM_TSTAMP_ENABLE SND_PCM_TSTAMP_MMAP +#endif + +/* Defines Alsa function types and pointers to these functions. */ +#define _PA_DEFINE_FUNC(x) typedef typeof(x) x##_ft; static x##_ft *alsa_##x = 0 + +/* Alloca helper. */ +#define __alsa_snd_alloca(ptr,type) do { size_t __alsa_alloca_size = alsa_##type##_sizeof(); (*ptr) = (type##_t *) alloca(__alsa_alloca_size); memset(*ptr, 0, __alsa_alloca_size); } while (0) + +_PA_DEFINE_FUNC(snd_pcm_open); +_PA_DEFINE_FUNC(snd_pcm_close); +_PA_DEFINE_FUNC(snd_pcm_nonblock); +_PA_DEFINE_FUNC(snd_pcm_frames_to_bytes); +_PA_DEFINE_FUNC(snd_pcm_prepare); +_PA_DEFINE_FUNC(snd_pcm_start); +_PA_DEFINE_FUNC(snd_pcm_resume); +_PA_DEFINE_FUNC(snd_pcm_wait); +_PA_DEFINE_FUNC(snd_pcm_state); +_PA_DEFINE_FUNC(snd_pcm_avail_update); +_PA_DEFINE_FUNC(snd_pcm_areas_silence); +_PA_DEFINE_FUNC(snd_pcm_mmap_begin); +_PA_DEFINE_FUNC(snd_pcm_mmap_commit); +_PA_DEFINE_FUNC(snd_pcm_readi); +_PA_DEFINE_FUNC(snd_pcm_readn); +_PA_DEFINE_FUNC(snd_pcm_writei); +_PA_DEFINE_FUNC(snd_pcm_writen); +_PA_DEFINE_FUNC(snd_pcm_drain); +_PA_DEFINE_FUNC(snd_pcm_recover); +_PA_DEFINE_FUNC(snd_pcm_drop); +_PA_DEFINE_FUNC(snd_pcm_area_copy); +_PA_DEFINE_FUNC(snd_pcm_poll_descriptors); +_PA_DEFINE_FUNC(snd_pcm_poll_descriptors_count); +_PA_DEFINE_FUNC(snd_pcm_poll_descriptors_revents); +_PA_DEFINE_FUNC(snd_pcm_format_size); +_PA_DEFINE_FUNC(snd_pcm_link); +_PA_DEFINE_FUNC(snd_pcm_delay); + +_PA_DEFINE_FUNC(snd_pcm_hw_params_sizeof); +_PA_DEFINE_FUNC(snd_pcm_hw_params_malloc); +_PA_DEFINE_FUNC(snd_pcm_hw_params_free); +_PA_DEFINE_FUNC(snd_pcm_hw_params_any); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_access); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_format); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_channels); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_set_periods_near); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_rate_near); //!!! +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_rate); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_rate_resample); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_set_buffer_time_near); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_buffer_size); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_buffer_size_near); //!!! +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_buffer_size_min); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_set_period_time_near); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_period_size_near); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_periods_integer); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_periods_min); + +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_buffer_size); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_get_period_size); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_get_access); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_get_periods); +//_PA_DEFINE_FUNC(snd_pcm_hw_params_get_rate); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_channels_min); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_channels_max); + +_PA_DEFINE_FUNC(snd_pcm_hw_params_test_period_size); +_PA_DEFINE_FUNC(snd_pcm_hw_params_test_format); +_PA_DEFINE_FUNC(snd_pcm_hw_params_test_access); +_PA_DEFINE_FUNC(snd_pcm_hw_params_dump); +_PA_DEFINE_FUNC(snd_pcm_hw_params); + +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_periods_min); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_periods_max); +_PA_DEFINE_FUNC(snd_pcm_hw_params_set_period_size); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_period_size_min); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_period_size_max); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_buffer_size_max); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_rate_min); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_rate_max); +_PA_DEFINE_FUNC(snd_pcm_hw_params_get_rate_numden); +#define alsa_snd_pcm_hw_params_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_hw_params) + +_PA_DEFINE_FUNC(snd_pcm_sw_params_sizeof); +_PA_DEFINE_FUNC(snd_pcm_sw_params_malloc); +_PA_DEFINE_FUNC(snd_pcm_sw_params_current); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_avail_min); +_PA_DEFINE_FUNC(snd_pcm_sw_params); +_PA_DEFINE_FUNC(snd_pcm_sw_params_free); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_start_threshold); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_stop_threshold); +_PA_DEFINE_FUNC(snd_pcm_sw_params_get_boundary); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_silence_threshold); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_silence_size); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_xfer_align); +_PA_DEFINE_FUNC(snd_pcm_sw_params_set_tstamp_mode); +#define alsa_snd_pcm_sw_params_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_sw_params) + +_PA_DEFINE_FUNC(snd_pcm_info); +_PA_DEFINE_FUNC(snd_pcm_info_sizeof); +_PA_DEFINE_FUNC(snd_pcm_info_malloc); +_PA_DEFINE_FUNC(snd_pcm_info_free); +_PA_DEFINE_FUNC(snd_pcm_info_set_device); +_PA_DEFINE_FUNC(snd_pcm_info_set_subdevice); +_PA_DEFINE_FUNC(snd_pcm_info_set_stream); +_PA_DEFINE_FUNC(snd_pcm_info_get_name); +_PA_DEFINE_FUNC(snd_pcm_info_get_card); +#define alsa_snd_pcm_info_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_info) + +_PA_DEFINE_FUNC(snd_ctl_pcm_next_device); +_PA_DEFINE_FUNC(snd_ctl_pcm_info); +_PA_DEFINE_FUNC(snd_ctl_open); +_PA_DEFINE_FUNC(snd_ctl_close); +_PA_DEFINE_FUNC(snd_ctl_card_info_malloc); +_PA_DEFINE_FUNC(snd_ctl_card_info_free); +_PA_DEFINE_FUNC(snd_ctl_card_info); +_PA_DEFINE_FUNC(snd_ctl_card_info_sizeof); +_PA_DEFINE_FUNC(snd_ctl_card_info_get_name); +#define alsa_snd_ctl_card_info_alloca(ptr) __alsa_snd_alloca(ptr, snd_ctl_card_info) + +_PA_DEFINE_FUNC(snd_config); +_PA_DEFINE_FUNC(snd_config_update); +_PA_DEFINE_FUNC(snd_config_search); +_PA_DEFINE_FUNC(snd_config_iterator_entry); +_PA_DEFINE_FUNC(snd_config_iterator_first); +_PA_DEFINE_FUNC(snd_config_iterator_end); +_PA_DEFINE_FUNC(snd_config_iterator_next); +_PA_DEFINE_FUNC(snd_config_get_string); +_PA_DEFINE_FUNC(snd_config_get_id); +_PA_DEFINE_FUNC(snd_config_update_free_global); + +_PA_DEFINE_FUNC(snd_pcm_status); +_PA_DEFINE_FUNC(snd_pcm_status_sizeof); +_PA_DEFINE_FUNC(snd_pcm_status_get_tstamp); +_PA_DEFINE_FUNC(snd_pcm_status_get_state); +_PA_DEFINE_FUNC(snd_pcm_status_get_trigger_tstamp); +_PA_DEFINE_FUNC(snd_pcm_status_get_delay); +#define alsa_snd_pcm_status_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_status) + +_PA_DEFINE_FUNC(snd_card_next); +_PA_DEFINE_FUNC(snd_strerror); +_PA_DEFINE_FUNC(snd_output_stdio_attach); + +#define alsa_snd_config_for_each(pos, next, node)\ + for (pos = alsa_snd_config_iterator_first(node),\ + next = alsa_snd_config_iterator_next(pos);\ + pos != alsa_snd_config_iterator_end(node); pos = next, next = alsa_snd_config_iterator_next(pos)) + +#undef _PA_DEFINE_FUNC + +/* Redefine 'PA_ALSA_PATHNAME' to a different Alsa library name if desired. */ +#ifndef PA_ALSA_PATHNAME + #define PA_ALSA_PATHNAME "libasound.so" +#endif +static const char *g_AlsaLibName = PA_ALSA_PATHNAME; + +/* Handle to dynamically loaded library. */ +static void *g_AlsaLib = NULL; + +#ifdef PA_ALSA_DYNAMIC + +#define _PA_LOCAL_IMPL(x) __pa_local_##x + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_rate_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir) +{ + int ret; + + if ((ret = alsa_snd_pcm_hw_params_set_rate(pcm, params, (*val), (*dir))) < 0) + return ret; + + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_buffer_size_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val) +{ + int ret; + + if ((ret = alsa_snd_pcm_hw_params_set_buffer_size(pcm, params, (*val))) < 0) + return ret; + + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_period_size_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir) +{ + int ret; + + if ((ret = alsa_snd_pcm_hw_params_set_period_size(pcm, params, (*val), (*dir))) < 0) + return ret; + + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_channels_min) (const snd_pcm_hw_params_t *params, unsigned int *val) +{ + (*val) = 1; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_channels_max) (const snd_pcm_hw_params_t *params, unsigned int *val) +{ + (*val) = 2; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_min) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir) +{ + (*val) = 2; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir) +{ + (*val) = 8; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_min) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir) +{ + (*frames) = 64; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir) +{ + (*frames) = 512; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_buffer_size_max) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val) +{ + int ret; + int dir = 0; + snd_pcm_uframes_t pmax = 0; + unsigned int pcnt = 0; + + if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max)(params, &pmax, &dir)) < 0) + return ret; + if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max)(params, &pcnt, &dir)) < 0) + return ret; + + (*val) = pmax * pcnt; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_rate_min) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir) +{ + (*val) = 44100; + return 0; +} + +int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_rate_max) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir) +{ + (*val) = 44100; + return 0; +} + +#endif // PA_ALSA_DYNAMIC + +/* Trying to load Alsa library dynamically if 'PA_ALSA_DYNAMIC' is defined, othervise + will link during compilation. +*/ +static int PaAlsa_LoadLibrary() +{ +#ifdef PA_ALSA_DYNAMIC + + PA_DEBUG(( "%s: loading ALSA library file - %s\n", __FUNCTION__, g_AlsaLibName )); + + dlerror(); + g_AlsaLib = dlopen(g_AlsaLibName, (RTLD_NOW|RTLD_GLOBAL)); + if (g_AlsaLib == NULL) + { + PA_DEBUG(( "%s: failed dlopen() ALSA library file - %s, error: %s\n", __FUNCTION__, g_AlsaLibName, dlerror() )); + return 0; + } + + PA_DEBUG(( "%s: loading ALSA API\n", __FUNCTION__ )); + + #define _PA_LOAD_FUNC(x) do { \ + alsa_##x = dlsym(g_AlsaLib, #x); \ + if (alsa_##x == NULL) { \ + PA_DEBUG(( "%s: symbol [%s] not found in - %s, error: %s\n", __FUNCTION__, #x, g_AlsaLibName, dlerror() )); }\ + } while(0) + +#else + + #define _PA_LOAD_FUNC(x) alsa_##x = &x + +#endif + +_PA_LOAD_FUNC(snd_pcm_open); +_PA_LOAD_FUNC(snd_pcm_close); +_PA_LOAD_FUNC(snd_pcm_nonblock); +_PA_LOAD_FUNC(snd_pcm_frames_to_bytes); +_PA_LOAD_FUNC(snd_pcm_prepare); +_PA_LOAD_FUNC(snd_pcm_start); +_PA_LOAD_FUNC(snd_pcm_resume); +_PA_LOAD_FUNC(snd_pcm_wait); +_PA_LOAD_FUNC(snd_pcm_state); +_PA_LOAD_FUNC(snd_pcm_avail_update); +_PA_LOAD_FUNC(snd_pcm_areas_silence); +_PA_LOAD_FUNC(snd_pcm_mmap_begin); +_PA_LOAD_FUNC(snd_pcm_mmap_commit); +_PA_LOAD_FUNC(snd_pcm_readi); +_PA_LOAD_FUNC(snd_pcm_readn); +_PA_LOAD_FUNC(snd_pcm_writei); +_PA_LOAD_FUNC(snd_pcm_writen); +_PA_LOAD_FUNC(snd_pcm_drain); +_PA_LOAD_FUNC(snd_pcm_recover); +_PA_LOAD_FUNC(snd_pcm_drop); +_PA_LOAD_FUNC(snd_pcm_area_copy); +_PA_LOAD_FUNC(snd_pcm_poll_descriptors); +_PA_LOAD_FUNC(snd_pcm_poll_descriptors_count); +_PA_LOAD_FUNC(snd_pcm_poll_descriptors_revents); +_PA_LOAD_FUNC(snd_pcm_format_size); +_PA_LOAD_FUNC(snd_pcm_link); +_PA_LOAD_FUNC(snd_pcm_delay); + +_PA_LOAD_FUNC(snd_pcm_hw_params_sizeof); +_PA_LOAD_FUNC(snd_pcm_hw_params_malloc); +_PA_LOAD_FUNC(snd_pcm_hw_params_free); +_PA_LOAD_FUNC(snd_pcm_hw_params_any); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_access); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_format); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_channels); +//_PA_LOAD_FUNC(snd_pcm_hw_params_set_periods_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_rate_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_rate); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_rate_resample); +//_PA_LOAD_FUNC(snd_pcm_hw_params_set_buffer_time_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_buffer_size); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_min); +//_PA_LOAD_FUNC(snd_pcm_hw_params_set_period_time_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_period_size_near); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_periods_integer); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_periods_min); + +_PA_LOAD_FUNC(snd_pcm_hw_params_get_buffer_size); +//_PA_LOAD_FUNC(snd_pcm_hw_params_get_period_size); +//_PA_LOAD_FUNC(snd_pcm_hw_params_get_access); +//_PA_LOAD_FUNC(snd_pcm_hw_params_get_periods); +//_PA_LOAD_FUNC(snd_pcm_hw_params_get_rate); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_channels_min); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_channels_max); + +_PA_LOAD_FUNC(snd_pcm_hw_params_test_period_size); +_PA_LOAD_FUNC(snd_pcm_hw_params_test_format); +_PA_LOAD_FUNC(snd_pcm_hw_params_test_access); +_PA_LOAD_FUNC(snd_pcm_hw_params_dump); +_PA_LOAD_FUNC(snd_pcm_hw_params); + +_PA_LOAD_FUNC(snd_pcm_hw_params_get_periods_min); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_periods_max); +_PA_LOAD_FUNC(snd_pcm_hw_params_set_period_size); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_period_size_min); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_period_size_max); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_buffer_size_max); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_rate_min); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_rate_max); +_PA_LOAD_FUNC(snd_pcm_hw_params_get_rate_numden); + +_PA_LOAD_FUNC(snd_pcm_sw_params_sizeof); +_PA_LOAD_FUNC(snd_pcm_sw_params_malloc); +_PA_LOAD_FUNC(snd_pcm_sw_params_current); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_avail_min); +_PA_LOAD_FUNC(snd_pcm_sw_params); +_PA_LOAD_FUNC(snd_pcm_sw_params_free); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_start_threshold); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_stop_threshold); +_PA_LOAD_FUNC(snd_pcm_sw_params_get_boundary); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_silence_threshold); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_silence_size); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_xfer_align); +_PA_LOAD_FUNC(snd_pcm_sw_params_set_tstamp_mode); + +_PA_LOAD_FUNC(snd_pcm_info); +_PA_LOAD_FUNC(snd_pcm_info_sizeof); +_PA_LOAD_FUNC(snd_pcm_info_malloc); +_PA_LOAD_FUNC(snd_pcm_info_free); +_PA_LOAD_FUNC(snd_pcm_info_set_device); +_PA_LOAD_FUNC(snd_pcm_info_set_subdevice); +_PA_LOAD_FUNC(snd_pcm_info_set_stream); +_PA_LOAD_FUNC(snd_pcm_info_get_name); +_PA_LOAD_FUNC(snd_pcm_info_get_card); + +_PA_LOAD_FUNC(snd_ctl_pcm_next_device); +_PA_LOAD_FUNC(snd_ctl_pcm_info); +_PA_LOAD_FUNC(snd_ctl_open); +_PA_LOAD_FUNC(snd_ctl_close); +_PA_LOAD_FUNC(snd_ctl_card_info_malloc); +_PA_LOAD_FUNC(snd_ctl_card_info_free); +_PA_LOAD_FUNC(snd_ctl_card_info); +_PA_LOAD_FUNC(snd_ctl_card_info_sizeof); +_PA_LOAD_FUNC(snd_ctl_card_info_get_name); + +_PA_LOAD_FUNC(snd_config); +_PA_LOAD_FUNC(snd_config_update); +_PA_LOAD_FUNC(snd_config_search); +_PA_LOAD_FUNC(snd_config_iterator_entry); +_PA_LOAD_FUNC(snd_config_iterator_first); +_PA_LOAD_FUNC(snd_config_iterator_end); +_PA_LOAD_FUNC(snd_config_iterator_next); +_PA_LOAD_FUNC(snd_config_get_string); +_PA_LOAD_FUNC(snd_config_get_id); +_PA_LOAD_FUNC(snd_config_update_free_global); + +_PA_LOAD_FUNC(snd_pcm_status); +_PA_LOAD_FUNC(snd_pcm_status_sizeof); +_PA_LOAD_FUNC(snd_pcm_status_get_tstamp); +_PA_LOAD_FUNC(snd_pcm_status_get_state); +_PA_LOAD_FUNC(snd_pcm_status_get_trigger_tstamp); +_PA_LOAD_FUNC(snd_pcm_status_get_delay); + +_PA_LOAD_FUNC(snd_card_next); +_PA_LOAD_FUNC(snd_strerror); +_PA_LOAD_FUNC(snd_output_stdio_attach); +#undef _PA_LOAD_FUNC + +#ifdef PA_ALSA_DYNAMIC + PA_DEBUG(( "%s: loaded ALSA API - ok\n", __FUNCTION__ )); + +#define _PA_VALIDATE_LOAD_REPLACEMENT(x)\ + do {\ + if (alsa_##x == NULL)\ + {\ + alsa_##x = &_PA_LOCAL_IMPL(x);\ + PA_DEBUG(( "%s: replacing [%s] with local implementation\n", __FUNCTION__, #x ));\ + }\ + } while (0) + + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_rate_near); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_buffer_size_near); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_period_size_near); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_min); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_max); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_min); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_max); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_min); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_max); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_buffer_size_max); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_min); + _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_max); + +#undef _PA_LOCAL_IMPL +#undef _PA_VALIDATE_LOAD_REPLACEMENT + +#endif // PA_ALSA_DYNAMIC + + return 1; +} + +void PaAlsa_SetLibraryPathName( const char *pathName ) +{ +#ifdef PA_ALSA_DYNAMIC + g_AlsaLibName = pathName; +#else + (void)pathName; +#endif +} + +/* Close handle to Alsa library. */ +static void PaAlsa_CloseLibrary() +{ +#ifdef PA_ALSA_DYNAMIC + dlclose(g_AlsaLib); + g_AlsaLib = NULL; +#endif +} + +/* Check return value of ALSA function, and map it to PaError */ +#define ENSURE_(expr, code) \ + do { \ + int __pa_unsure_error_id;\ + if( UNLIKELY( (__pa_unsure_error_id = (expr)) < 0 ) ) \ + { \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( (code) == paUnanticipatedHostError && pthread_equal( pthread_self(), paUnixMainThread) ) \ + { \ + PaUtil_SetLastHostErrorInfo( paALSA, __pa_unsure_error_id, alsa_snd_strerror( __pa_unsure_error_id ) ); \ + } \ + PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" ); \ + if( (code) == paUnanticipatedHostError ) \ + PA_DEBUG(( "Host error description: %s\n", alsa_snd_strerror( __pa_unsure_error_id ) )); \ + result = (code); \ + goto error; \ + } \ + } while (0) + +#define ASSERT_CALL_(expr, success) \ + do {\ + int __pa_assert_error_id;\ + __pa_assert_error_id = (expr);\ + assert( success == __pa_assert_error_id );\ + } while (0) + +static int numPeriods_ = 4; +static int busyRetries_ = 100; + +int PaAlsa_SetNumPeriods( int numPeriods ) +{ + numPeriods_ = numPeriods; + return paNoError; +} + +typedef enum +{ + StreamDirection_In, + StreamDirection_Out +} StreamDirection; + +typedef struct +{ + PaSampleFormat hostSampleFormat; + unsigned long framesPerBuffer; + int numUserChannels, numHostChannels; + int userInterleaved, hostInterleaved; + int canMmap; + void *nonMmapBuffer; + unsigned int nonMmapBufferSize; + PaDeviceIndex device; /* Keep the device index */ + + snd_pcm_t *pcm; + snd_pcm_uframes_t bufferSize; + snd_pcm_format_t nativeFormat; + unsigned int nfds; + int ready; /* Marked ready from poll */ + void **userBuffers; + snd_pcm_uframes_t offset; + StreamDirection streamDir; + + snd_pcm_channel_area_t *channelAreas; /* Needed for channel adaption */ +} PaAlsaStreamComponent; + +/* Implementation specific stream structure */ +typedef struct PaAlsaStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + PaUnixThread thread; + + unsigned long framesPerUserBuffer, maxFramesPerHostBuffer; + + int primeBuffers; + int callbackMode; /* bool: are we running in callback mode? */ + int pcmsSynced; /* Have we successfully synced pcms */ + int rtSched; + + /* the callback thread uses these to poll the sound device(s), waiting + * for data to be ready/available */ + struct pollfd* pfds; + int pollTimeout; + + /* Used in communication between threads */ + volatile sig_atomic_t callback_finished; /* bool: are we in the "callback finished" state? */ + volatile sig_atomic_t callbackAbort; /* Drop frames? */ + volatile sig_atomic_t isActive; /* Is stream in active state? (Between StartStream and StopStream || !paContinue) */ + PaUnixMutex stateMtx; /* Used to synchronize access to stream state */ + + int neverDropInput; + + PaTime underrun; + PaTime overrun; + + PaAlsaStreamComponent capture, playback; +} +PaAlsaStream; + +/* PaAlsaHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct PaAlsaHostApiRepresentation +{ + PaUtilHostApiRepresentation baseHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + PaHostApiIndex hostApiIndex; +} +PaAlsaHostApiRepresentation; + +typedef struct PaAlsaDeviceInfo +{ + PaDeviceInfo baseDeviceInfo; + char *alsaName; + int isPlug; + int minInputChannels; + int minOutputChannels; +} +PaAlsaDeviceInfo; + +/* prototypes for functions declared in this file */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *callback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError BuildDeviceList( PaAlsaHostApiRepresentation *hostApi ); +static int SetApproximateSampleRate( snd_pcm_t *pcm, snd_pcm_hw_params_t *hwParams, double sampleRate ); +static int GetExactSampleRate( snd_pcm_hw_params_t *hwParams, double *sampleRate ); + +/* Callback prototypes */ +static void *CallbackThreadFunc( void *userData ); + +/* Blocking prototypes */ +static signed long GetStreamReadAvailable( PaStream* s ); +static signed long GetStreamWriteAvailable( PaStream* s ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); + + +static const PaAlsaDeviceInfo *GetDeviceInfo( const PaUtilHostApiRepresentation *hostApi, int device ) +{ + return (const PaAlsaDeviceInfo *)hostApi->deviceInfos[device]; +} + +/** Uncommented because AlsaErrorHandler is unused for anything good yet. If AlsaErrorHandler is + to be used, do not forget to register this callback in PaAlsa_Initialize, and unregister in Terminate. +*/ +/*static void AlsaErrorHandler(const char *file, int line, const char *function, int err, const char *fmt, ...) +{ +}*/ + +PaError PaAlsa_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaAlsaHostApiRepresentation *alsaHostApi = NULL; + + /* Try loading Alsa library. */ + if (!PaAlsa_LoadLibrary()) + return paHostApiNotFound; + + PA_UNLESS( alsaHostApi = (PaAlsaHostApiRepresentation*) PaUtil_AllocateMemory( + sizeof(PaAlsaHostApiRepresentation) ), paInsufficientMemory ); + PA_UNLESS( alsaHostApi->allocations = PaUtil_CreateAllocationGroup(), paInsufficientMemory ); + alsaHostApi->hostApiIndex = hostApiIndex; + + *hostApi = (PaUtilHostApiRepresentation*)alsaHostApi; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paALSA; + (*hostApi)->info.name = "ALSA"; + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + /** If AlsaErrorHandler is to be used, do not forget to unregister callback pointer in + Terminate function. + */ + /*ENSURE_( snd_lib_error_set_handler(AlsaErrorHandler), paUnanticipatedHostError );*/ + + PA_ENSURE( BuildDeviceList( alsaHostApi ) ); + + PaUtil_InitializeStreamInterface( &alsaHostApi->callbackStreamInterface, + CloseStream, StartStream, + StopStream, AbortStream, + IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, + PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &alsaHostApi->blockingStreamInterface, + CloseStream, StartStream, + StopStream, AbortStream, + IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, + GetStreamReadAvailable, + GetStreamWriteAvailable ); + + PA_ENSURE( PaUnixThreading_Initialize() ); + + return result; + +error: + if( alsaHostApi ) + { + if( alsaHostApi->allocations ) + { + PaUtil_FreeAllAllocations( alsaHostApi->allocations ); + PaUtil_DestroyAllocationGroup( alsaHostApi->allocations ); + } + + PaUtil_FreeMemory( alsaHostApi ); + } + + return result; +} + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaAlsaHostApiRepresentation *alsaHostApi = (PaAlsaHostApiRepresentation*)hostApi; + + assert( hostApi ); + + /** See AlsaErrorHandler and PaAlsa_Initialize for details. + */ + /*snd_lib_error_set_handler(NULL);*/ + + if( alsaHostApi->allocations ) + { + PaUtil_FreeAllAllocations( alsaHostApi->allocations ); + PaUtil_DestroyAllocationGroup( alsaHostApi->allocations ); + } + + PaUtil_FreeMemory( alsaHostApi ); + alsa_snd_config_update_free_global(); + + /* Close Alsa library. */ + PaAlsa_CloseLibrary(); +} + +/** Determine max channels and default latencies. + * + * This function provides functionality to grope an opened (might be opened for capture or playback) pcm device for + * traits like max channels, suitable default latencies and default sample rate. Upon error, max channels is set to zero, + * and a suitable result returned. The device is closed before returning. + */ +static PaError GropeDevice( snd_pcm_t* pcm, int isPlug, StreamDirection mode, int openBlocking, + PaAlsaDeviceInfo* devInfo ) +{ + PaError result = paNoError; + snd_pcm_hw_params_t *hwParams; + snd_pcm_uframes_t lowLatency = 512, highLatency = 2048; + unsigned int minChans, maxChans; + int* minChannels, * maxChannels; + double * defaultLowLatency, * defaultHighLatency, * defaultSampleRate = + &devInfo->baseDeviceInfo.defaultSampleRate; + double defaultSr = *defaultSampleRate; + + assert( pcm ); + + PA_DEBUG(( "%s: collecting info ..\n", __FUNCTION__ )); + + if( StreamDirection_In == mode ) + { + minChannels = &devInfo->minInputChannels; + maxChannels = &devInfo->baseDeviceInfo.maxInputChannels; + defaultLowLatency = &devInfo->baseDeviceInfo.defaultLowInputLatency; + defaultHighLatency = &devInfo->baseDeviceInfo.defaultHighInputLatency; + } + else + { + minChannels = &devInfo->minOutputChannels; + maxChannels = &devInfo->baseDeviceInfo.maxOutputChannels; + defaultLowLatency = &devInfo->baseDeviceInfo.defaultLowOutputLatency; + defaultHighLatency = &devInfo->baseDeviceInfo.defaultHighOutputLatency; + } + + ENSURE_( alsa_snd_pcm_nonblock( pcm, 0 ), paUnanticipatedHostError ); + + alsa_snd_pcm_hw_params_alloca( &hwParams ); + alsa_snd_pcm_hw_params_any( pcm, hwParams ); + + if( defaultSr >= 0 ) + { + /* Could be that the device opened in one mode supports samplerates that the other mode wont have, + * so try again .. */ + if( SetApproximateSampleRate( pcm, hwParams, defaultSr ) < 0 ) + { + defaultSr = -1.; + PA_DEBUG(( "%s: Original default samplerate failed, trying again ..\n", __FUNCTION__ )); + } + } + + if( defaultSr < 0. ) /* Default sample rate not set */ + { + unsigned int sampleRate = 44100; /* Will contain approximate rate returned by alsa-lib */ + if( alsa_snd_pcm_hw_params_set_rate_near( pcm, hwParams, &sampleRate, NULL ) < 0) + { + result = paUnanticipatedHostError; + goto error; + } + ENSURE_( GetExactSampleRate( hwParams, &defaultSr ), paUnanticipatedHostError ); + } + + ENSURE_( alsa_snd_pcm_hw_params_get_channels_min( hwParams, &minChans ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_get_channels_max( hwParams, &maxChans ), paUnanticipatedHostError ); + assert( maxChans <= INT_MAX ); + assert( maxChans > 0 ); /* Weird linking issue could cause wrong version of ALSA symbols to be called, + resulting in zeroed values */ + + /* XXX: Limit to sensible number (ALSA plugins accept a crazy amount of channels)? */ + if( isPlug && maxChans > 128 ) + { + maxChans = 128; + PA_DEBUG(( "%s: Limiting number of plugin channels to %u\n", __FUNCTION__, maxChans )); + } + + /* TWEAKME: + * + * Giving values for default min and max latency is not + * straightforward. Here are our objectives: + * + * * for low latency, we want to give the lowest value + * that will work reliably. This varies based on the + * sound card, kernel, CPU, etc. I think it is better + * to give sub-optimal latency than to give a number + * too low and cause dropouts. My conservative + * estimate at this point is to base it on 4096-sample + * latency at 44.1 kHz, which gives a latency of 23ms. + * * for high latency we want to give a large enough + * value that dropouts are basically impossible. This + * doesn't really require as much tweaking, since + * providing too large a number will just cause us to + * select the nearest setting that will work at stream + * config time. + */ + ENSURE_( alsa_snd_pcm_hw_params_set_buffer_size_near( pcm, hwParams, &lowLatency ), paUnanticipatedHostError ); + + /* Have to reset hwParams, to set new buffer size */ + ENSURE_( alsa_snd_pcm_hw_params_any( pcm, hwParams ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_set_buffer_size_near( pcm, hwParams, &highLatency ), paUnanticipatedHostError ); + + *minChannels = (int)minChans; + *maxChannels = (int)maxChans; + *defaultSampleRate = defaultSr; + *defaultLowLatency = (double) lowLatency / *defaultSampleRate; + *defaultHighLatency = (double) highLatency / *defaultSampleRate; + +end: + alsa_snd_pcm_close( pcm ); + return result; + +error: + goto end; +} + +/* Initialize device info with invalid values (maxInputChannels and maxOutputChannels are set to zero since these indicate + * wether input/output is available) */ +static void InitializeDeviceInfo( PaDeviceInfo *deviceInfo ) +{ + deviceInfo->structVersion = -1; + deviceInfo->name = NULL; + deviceInfo->hostApi = -1; + deviceInfo->maxInputChannels = 0; + deviceInfo->maxOutputChannels = 0; + deviceInfo->defaultLowInputLatency = -1.; + deviceInfo->defaultLowOutputLatency = -1.; + deviceInfo->defaultHighInputLatency = -1.; + deviceInfo->defaultHighOutputLatency = -1.; + deviceInfo->defaultSampleRate = -1.; +} + +/* Helper struct */ +typedef struct +{ + char *alsaName; + char *name; + int isPlug; + int hasPlayback; + int hasCapture; +} HwDevInfo; + + +HwDevInfo predefinedNames[] = { + { "center_lfe", NULL, 0, 1, 0 }, +/* { "default", NULL, 0, 1, 0 }, */ +/* { "dmix", NULL, 0, 1, 0 }, */ +/* { "dpl", NULL, 0, 1, 0 }, */ +/* { "dsnoop", NULL, 0, 1, 0 }, */ + { "front", NULL, 0, 1, 0 }, + { "iec958", NULL, 0, 1, 0 }, +/* { "modem", NULL, 0, 1, 0 }, */ + { "rear", NULL, 0, 1, 0 }, + { "side", NULL, 0, 1, 0 }, +/* { "spdif", NULL, 0, 0, 0 }, */ + { "surround40", NULL, 0, 1, 0 }, + { "surround41", NULL, 0, 1, 0 }, + { "surround50", NULL, 0, 1, 0 }, + { "surround51", NULL, 0, 1, 0 }, + { "surround71", NULL, 0, 1, 0 }, + + { "AndroidPlayback_Earpiece_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_Speaker_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_Bluetooth_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_Headset_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_Speaker_Headset_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_Bluetooth-A2DP_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_ExtraDockSpeaker_normal", NULL, 0, 1, 0 }, + { "AndroidPlayback_TvOut_normal", NULL, 0, 1, 0 }, + + { "AndroidRecord_Microphone", NULL, 0, 0, 1 }, + { "AndroidRecord_Earpiece_normal", NULL, 0, 0, 1 }, + { "AndroidRecord_Speaker_normal", NULL, 0, 0, 1 }, + { "AndroidRecord_Headset_normal", NULL, 0, 0, 1 }, + { "AndroidRecord_Bluetooth_normal", NULL, 0, 0, 1 }, + { "AndroidRecord_Speaker_Headset_normal", NULL, 0, 0, 1 }, + + { NULL, NULL, 0, 1, 0 } +}; + +static const HwDevInfo *FindDeviceName( const char *name ) +{ + int i; + + for( i = 0; predefinedNames[i].alsaName; i++ ) + { + if( strcmp( name, predefinedNames[i].alsaName ) == 0 ) + { + return &predefinedNames[i]; + } + } + + return NULL; +} + +static PaError PaAlsa_StrDup( PaAlsaHostApiRepresentation *alsaApi, + char **dst, + const char *src) +{ + PaError result = paNoError; + int len = strlen( src ) + 1; + + /* PA_DEBUG(("PaStrDup %s %d\n", src, len)); */ + + PA_UNLESS( *dst = (char *)PaUtil_GroupAllocateMemory( alsaApi->allocations, len ), + paInsufficientMemory ); + strncpy( *dst, src, len ); + +error: + return result; +} + +/* Disregard some standard plugins + */ +static int IgnorePlugin( const char *pluginId ) +{ + static const char *ignoredPlugins[] = {"hw", "plughw", "plug", "dsnoop", "tee", + "file", "null", "shm", "cards", "rate_convert", NULL}; + int i = 0; + while( ignoredPlugins[i] ) + { + if( !strcmp( pluginId, ignoredPlugins[i] ) ) + { + return 1; + } + ++i; + } + + return 0; +} + +/** Open PCM device. + * + * Wrapper around alsa_snd_pcm_open which may repeatedly retry opening a device if it is busy, for + * a certain time. This is because dmix may temporarily hold on to a device after it (dmix) + * has been opened and closed. + * @param mode: Open mode (e.g., SND_PCM_BLOCKING). + * @param waitOnBusy: Retry opening busy device for up to one second? + **/ +static int OpenPcm( snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode, int waitOnBusy ) +{ + int tries = 0, maxTries = waitOnBusy ? busyRetries_ : 0; + int ret = alsa_snd_pcm_open( pcmp, name, stream, mode ); + for( tries = 0; tries < maxTries && -EBUSY == ret; ++tries ) + { + Pa_Sleep( 10 ); + ret = alsa_snd_pcm_open( pcmp, name, stream, mode ); + if( -EBUSY != ret ) + { + PA_DEBUG(( "%s: Successfully opened initially busy device after %d tries\n", + __FUNCTION__, tries )); + } + } + if( -EBUSY == ret ) + { + PA_DEBUG(( "%s: Failed to open busy device '%s'\n", __FUNCTION__, name )); + } + else + { + if (ret < 0) + PA_DEBUG(( "%s: Opened device '%s' ptr[%p] - result: [%d:%s]\n", __FUNCTION__, name, *pcmp, ret, alsa_snd_strerror(ret) )); + } + + return ret; +} + +static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* deviceName, int blocking, + PaAlsaDeviceInfo* devInfo, int* devIdx ) +{ + PaError result = 0; + PaDeviceInfo *baseDeviceInfo = &devInfo->baseDeviceInfo; + snd_pcm_t *pcm = NULL; + PaUtilHostApiRepresentation *baseApi = &alsaApi->baseHostApiRep; + + PA_DEBUG(( "%s: filling device info for: %s\n", __FUNCTION__, deviceName->name )); + + /* Zero fields */ + InitializeDeviceInfo( baseDeviceInfo ); + + /* to determine device capabilities, we must open the device and query the + * hardware parameter configuration space */ + + /* Query capture */ + if( deviceName->hasCapture && + OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_CAPTURE, blocking, 0 ) + >= 0 ) + { + if( GropeDevice( pcm, deviceName->isPlug, StreamDirection_In, blocking, devInfo ) != paNoError ) + { + /* Error */ + PA_DEBUG(("%s: Failed groping %s for capture\n", __FUNCTION__, deviceName->alsaName)); + goto end; + } + } + + /* Query playback */ + if( deviceName->hasPlayback && + OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_PLAYBACK, blocking, 0 ) + >= 0 ) + { + if( GropeDevice( pcm, deviceName->isPlug, StreamDirection_Out, blocking, devInfo ) != paNoError ) + { + /* Error */ + PA_DEBUG(("%s: Failed groping %s for playback\n", __FUNCTION__, deviceName->alsaName)); + goto end; + } + } + + baseDeviceInfo->structVersion = 2; + baseDeviceInfo->hostApi = alsaApi->hostApiIndex; + baseDeviceInfo->name = deviceName->name; + devInfo->alsaName = deviceName->alsaName; + devInfo->isPlug = deviceName->isPlug; + + /* A: Storing pointer to PaAlsaDeviceInfo object as pointer to PaDeviceInfo object. + * Should now be safe to add device info, unless the device supports neither capture nor playback + */ + if( baseDeviceInfo->maxInputChannels > 0 || baseDeviceInfo->maxOutputChannels > 0 ) + { + /* Make device default if there isn't already one or it is the ALSA "default" device */ + if( (baseApi->info.defaultInputDevice == paNoDevice || !strcmp(deviceName->alsaName, + "default" )) && baseDeviceInfo->maxInputChannels > 0 ) + { + baseApi->info.defaultInputDevice = *devIdx; + PA_DEBUG(("Default input device: %s\n", deviceName->name)); + } + if( (baseApi->info.defaultOutputDevice == paNoDevice || !strcmp(deviceName->alsaName, + "default" )) && baseDeviceInfo->maxOutputChannels > 0 ) + { + baseApi->info.defaultOutputDevice = *devIdx; + PA_DEBUG(("Default output device: %s\n", deviceName->name)); + } + PA_DEBUG(("%s: Adding device %s: %d\n", __FUNCTION__, deviceName->name, *devIdx)); + baseApi->deviceInfos[*devIdx] = (PaDeviceInfo *) devInfo; + (*devIdx) += 1; + } + else + { + PA_DEBUG(( "%s: skipped device: %s, all channels - 0\n", __FUNCTION__, deviceName->name )); + } + +end: + return result; +} + +/* Build PaDeviceInfo list, ignore devices for which we cannot determine capabilities (possibly busy, sigh) */ +static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi ) +{ + PaUtilHostApiRepresentation *baseApi = &alsaApi->baseHostApiRep; + PaAlsaDeviceInfo *deviceInfoArray; + int cardIdx = -1, devIdx = 0; + snd_ctl_card_info_t *cardInfo; + PaError result = paNoError; + size_t numDeviceNames = 0, maxDeviceNames = 1, i; + HwDevInfo *hwDevInfos = NULL; + snd_config_t *topNode = NULL; + snd_pcm_info_t *pcmInfo; + int res; + int blocking = SND_PCM_NONBLOCK; + char alsaCardName[50]; +#ifdef PA_ENABLE_DEBUG_OUTPUT + PaTime startTime = PaUtil_GetTime(); +#endif + + if( getenv( "PA_ALSA_INITIALIZE_BLOCK" ) && atoi( getenv( "PA_ALSA_INITIALIZE_BLOCK" ) ) ) + blocking = 0; + + /* These two will be set to the first working input and output device, respectively */ + baseApi->info.defaultInputDevice = paNoDevice; + baseApi->info.defaultOutputDevice = paNoDevice; + + /* Gather info about hw devices + + * alsa_snd_card_next() modifies the integer passed to it to be: + * the index of the first card if the parameter is -1 + * the index of the next card if the parameter is the index of a card + * -1 if there are no more cards + * + * The function itself returns 0 if it succeeded. */ + cardIdx = -1; + alsa_snd_ctl_card_info_alloca( &cardInfo ); + alsa_snd_pcm_info_alloca( &pcmInfo ); + while( alsa_snd_card_next( &cardIdx ) == 0 && cardIdx >= 0 ) + { + char *cardName; + int devIdx = -1; + snd_ctl_t *ctl; + char buf[50]; + + snprintf( alsaCardName, sizeof (alsaCardName), "hw:%d", cardIdx ); + + /* Acquire name of card */ + if( alsa_snd_ctl_open( &ctl, alsaCardName, 0 ) < 0 ) + { + /* Unable to open card :( */ + PA_DEBUG(( "%s: Unable to open device %s\n", __FUNCTION__, alsaCardName )); + continue; + } + alsa_snd_ctl_card_info( ctl, cardInfo ); + + PA_ENSURE( PaAlsa_StrDup( alsaApi, &cardName, alsa_snd_ctl_card_info_get_name( cardInfo )) ); + + while( alsa_snd_ctl_pcm_next_device( ctl, &devIdx ) == 0 && devIdx >= 0 ) + { + char *alsaDeviceName, *deviceName; + size_t len; + int hasPlayback = 0, hasCapture = 0; + snprintf( buf, sizeof (buf), "hw:%d,%d", cardIdx, devIdx ); + + /* Obtain info about this particular device */ + alsa_snd_pcm_info_set_device( pcmInfo, devIdx ); + alsa_snd_pcm_info_set_subdevice( pcmInfo, 0 ); + alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_CAPTURE ); + if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 ) + { + hasCapture = 1; + } + + alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_PLAYBACK ); + if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 ) + { + hasPlayback = 1; + } + + if( !hasPlayback && !hasCapture ) + { + /* Error */ + continue; + } + + /* The length of the string written by snprintf plus terminating 0 */ + len = snprintf( NULL, 0, "%s: %s (%s)", cardName, alsa_snd_pcm_info_get_name( pcmInfo ), buf ) + 1; + PA_UNLESS( deviceName = (char *)PaUtil_GroupAllocateMemory( alsaApi->allocations, len ), + paInsufficientMemory ); + snprintf( deviceName, len, "%s: %s (%s)", cardName, + alsa_snd_pcm_info_get_name( pcmInfo ), buf ); + + ++numDeviceNames; + if( !hwDevInfos || numDeviceNames > maxDeviceNames ) + { + maxDeviceNames *= 2; + PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ), + paInsufficientMemory ); + } + + PA_ENSURE( PaAlsa_StrDup( alsaApi, &alsaDeviceName, buf ) ); + + hwDevInfos[ numDeviceNames - 1 ].alsaName = alsaDeviceName; + hwDevInfos[ numDeviceNames - 1 ].name = deviceName; + hwDevInfos[ numDeviceNames - 1 ].isPlug = 0; + hwDevInfos[ numDeviceNames - 1 ].hasPlayback = hasPlayback; + hwDevInfos[ numDeviceNames - 1 ].hasCapture = hasCapture; + } + alsa_snd_ctl_close( ctl ); + } + + /* Iterate over plugin devices */ + + if( NULL == (*alsa_snd_config) ) + { + /* alsa_snd_config_update is called implicitly by some functions, if this hasn't happened snd_config will be NULL (bleh) */ + ENSURE_( alsa_snd_config_update(), paUnanticipatedHostError ); + PA_DEBUG(( "Updating snd_config\n" )); + } + assert( *alsa_snd_config ); + if( (res = alsa_snd_config_search( *alsa_snd_config, "pcm", &topNode )) >= 0 ) + { + snd_config_iterator_t i, next; + + alsa_snd_config_for_each( i, next, topNode ) + { + const char *tpStr = "unknown", *idStr = NULL; + int err = 0; + + char *alsaDeviceName, *deviceName; + const HwDevInfo *predefined = NULL; + snd_config_t *n = alsa_snd_config_iterator_entry( i ), * tp = NULL;; + + if( (err = alsa_snd_config_search( n, "type", &tp )) < 0 ) + { + if( -ENOENT != err ) + { + ENSURE_(err, paUnanticipatedHostError); + } + } + else + { + ENSURE_( alsa_snd_config_get_string( tp, &tpStr ), paUnanticipatedHostError ); + } + ENSURE_( alsa_snd_config_get_id( n, &idStr ), paUnanticipatedHostError ); + if( IgnorePlugin( idStr ) ) + { + PA_DEBUG(( "%s: Ignoring ALSA plugin device [%s] of type [%s]\n", __FUNCTION__, idStr, tpStr )); + continue; + } + PA_DEBUG(( "%s: Found plugin [%s] of type [%s]\n", __FUNCTION__, idStr, tpStr )); + + PA_UNLESS( alsaDeviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations, + strlen(idStr) + 6 ), paInsufficientMemory ); + strcpy( alsaDeviceName, idStr ); + PA_UNLESS( deviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations, + strlen(idStr) + 1 ), paInsufficientMemory ); + strcpy( deviceName, idStr ); + + ++numDeviceNames; + if( !hwDevInfos || numDeviceNames > maxDeviceNames ) + { + maxDeviceNames *= 2; + PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ), + paInsufficientMemory ); + } + + predefined = FindDeviceName( alsaDeviceName ); + + hwDevInfos[numDeviceNames - 1].alsaName = alsaDeviceName; + hwDevInfos[numDeviceNames - 1].name = deviceName; + hwDevInfos[numDeviceNames - 1].isPlug = 1; + + if( predefined ) + { + hwDevInfos[numDeviceNames - 1].hasPlayback = predefined->hasPlayback; + hwDevInfos[numDeviceNames - 1].hasCapture = predefined->hasCapture; + } + else + { + hwDevInfos[numDeviceNames - 1].hasPlayback = 1; + hwDevInfos[numDeviceNames - 1].hasCapture = 1; + } + } + } + else + PA_DEBUG(( "%s: Iterating over ALSA plugins failed: %s\n", __FUNCTION__, alsa_snd_strerror( res ) )); + + /* allocate deviceInfo memory based on the number of devices */ + PA_UNLESS( baseApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + alsaApi->allocations, sizeof(PaDeviceInfo*) * (numDeviceNames) ), paInsufficientMemory ); + + /* allocate all device info structs in a contiguous block */ + PA_UNLESS( deviceInfoArray = (PaAlsaDeviceInfo*)PaUtil_GroupAllocateMemory( + alsaApi->allocations, sizeof(PaAlsaDeviceInfo) * numDeviceNames ), paInsufficientMemory ); + + /* Loop over list of cards, filling in info. If a device is deemed unavailable (can't get name), + * it's ignored. + * + * Note that we do this in two stages. This is a workaround owing to the fact that the 'dmix' + * plugin may cause the underlying hardware device to be busy for a short while even after it + * (dmix) is closed. The 'default' plugin may also point to the dmix plugin, so the same goes + * for this. + */ + PA_DEBUG(( "%s: filling device info for %d devices\n", __FUNCTION__, numDeviceNames )); + for( i = 0, devIdx = 0; i < numDeviceNames; ++i ) + { + PaAlsaDeviceInfo* devInfo = &deviceInfoArray[i]; + HwDevInfo* hwInfo = &hwDevInfos[i]; + if( !strcmp( hwInfo->name, "dmix" ) || !strcmp( hwInfo->name, "default" ) ) + { + continue; + } + + PA_ENSURE( FillInDevInfo( alsaApi, hwInfo, blocking, devInfo, &devIdx ) ); + } + assert( devIdx < numDeviceNames ); + /* Now inspect 'dmix' and 'default' plugins */ + for( i = 0; i < numDeviceNames; ++i ) + { + PaAlsaDeviceInfo* devInfo = &deviceInfoArray[i]; + HwDevInfo* hwInfo = &hwDevInfos[i]; + if( strcmp( hwInfo->name, "dmix" ) && strcmp( hwInfo->name, "default" ) ) + { + continue; + } + + PA_ENSURE( FillInDevInfo( alsaApi, hwInfo, blocking, devInfo, + &devIdx ) ); + } + free( hwDevInfos ); + + baseApi->info.deviceCount = devIdx; /* Number of successfully queried devices */ + +#ifdef PA_ENABLE_DEBUG_OUTPUT + PA_DEBUG(( "%s: Building device list took %f seconds\n", __FUNCTION__, PaUtil_GetTime() - startTime )); +#endif + +end: + return result; + +error: + /* No particular action */ + goto end; +} + +/* Check against known device capabilities */ +static PaError ValidateParameters( const PaStreamParameters *parameters, PaUtilHostApiRepresentation *hostApi, StreamDirection mode ) +{ + PaError result = paNoError; + int maxChans; + const PaAlsaDeviceInfo *deviceInfo = NULL; + assert( parameters ); + + if( parameters->device != paUseHostApiSpecificDeviceSpecification ) + { + assert( parameters->device < hostApi->info.deviceCount ); + PA_UNLESS( parameters->hostApiSpecificStreamInfo == NULL, paBadIODeviceCombination ); + deviceInfo = GetDeviceInfo( hostApi, parameters->device ); + } + else + { + const PaAlsaStreamInfo *streamInfo = parameters->hostApiSpecificStreamInfo; + + PA_UNLESS( parameters->device == paUseHostApiSpecificDeviceSpecification, paInvalidDevice ); + PA_UNLESS( streamInfo->size == sizeof (PaAlsaStreamInfo) && streamInfo->version == 1, + paIncompatibleHostApiSpecificStreamInfo ); + PA_UNLESS( streamInfo->deviceString != NULL, paInvalidDevice ); + + /* Skip further checking */ + return paNoError; + } + + assert( deviceInfo ); + assert( parameters->hostApiSpecificStreamInfo == NULL ); + maxChans = (StreamDirection_In == mode ? deviceInfo->baseDeviceInfo.maxInputChannels : + deviceInfo->baseDeviceInfo.maxOutputChannels); + PA_UNLESS( parameters->channelCount <= maxChans, paInvalidChannelCount ); + +error: + return result; +} + +/* Given an open stream, what sample formats are available? */ +static PaSampleFormat GetAvailableFormats( snd_pcm_t *pcm ) +{ + PaSampleFormat available = 0; + snd_pcm_hw_params_t *hwParams; + alsa_snd_pcm_hw_params_alloca( &hwParams ); + + alsa_snd_pcm_hw_params_any( pcm, hwParams ); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT ) >= 0) + available |= paFloat32; + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S32 ) >= 0) + available |= paInt32; + +#ifdef PA_LITTLE_ENDIAN + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) >= 0) + available |= paInt24; +#elif defined PA_BIG_ENDIAN + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) >= 0) + available |= paInt24; +#endif + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16 ) >= 0) + available |= paInt16; + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U8 ) >= 0) + available |= paUInt8; + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S8 ) >= 0) + available |= paInt8; + + return available; +} + +/* Output to console all formats supported by device */ +static void LogAllAvailableFormats( snd_pcm_t *pcm ) +{ + PaSampleFormat available = 0; + snd_pcm_hw_params_t *hwParams; + alsa_snd_pcm_hw_params_alloca( &hwParams ); + + alsa_snd_pcm_hw_params_any( pcm, hwParams ); + + PA_DEBUG(( " --- Supported Formats ---\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S8 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S8\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U8 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U8\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S16_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S16_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U16_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U16_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U16_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U16_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S24_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S24_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U24_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U24_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U24_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U24_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT64_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT64_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT64_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT64_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_IEC958_SUBFRAME_LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_IEC958_SUBFRAME_LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_IEC958_SUBFRAME_BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_IEC958_SUBFRAME_BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_MU_LAW ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_MU_LAW\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_A_LAW ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_A_LAW\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_IMA_ADPCM ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_IMA_ADPCM\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_MPEG ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_MPEG\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_GSM ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_GSM\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_SPECIAL ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_SPECIAL\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S24_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S24_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U24_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U24_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U24_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U24_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S20_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S20_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S20_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S20_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U20_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U20_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U20_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U20_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S18_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S18_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S18_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S18_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U18_3LE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U18_3LE\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U18_3BE ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U18_3BE\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S16\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U16 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U16\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S24\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U24 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U24\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S32 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_S32\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U32 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_U32\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT\n" )); + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT64 ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_FLOAT64\n" )); + + if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_IEC958_SUBFRAME ) >= 0) + PA_DEBUG(( "SND_PCM_FORMAT_IEC958_SUBFRAME\n" )); + + PA_DEBUG(( " -------------------------\n" )); +} + +static snd_pcm_format_t Pa2AlsaFormat( PaSampleFormat paFormat ) +{ + switch( paFormat ) + { + case paFloat32: + return SND_PCM_FORMAT_FLOAT; + + case paInt16: + return SND_PCM_FORMAT_S16; + + case paInt24: +#ifdef PA_LITTLE_ENDIAN + return SND_PCM_FORMAT_S24_3LE; +#elif defined PA_BIG_ENDIAN + return SND_PCM_FORMAT_S24_3BE; +#endif + + case paInt32: + return SND_PCM_FORMAT_S32; + + case paInt8: + return SND_PCM_FORMAT_S8; + + case paUInt8: + return SND_PCM_FORMAT_U8; + + default: + return SND_PCM_FORMAT_UNKNOWN; + } +} + +/** Open an ALSA pcm handle. + * + * The device to be open can be specified in a custom PaAlsaStreamInfo struct, or it will be a device number. In case of a + * device number, it maybe specified through an env variable (PA_ALSA_PLUGHW) that we should open the corresponding plugin + * device. + */ +static PaError AlsaOpen( const PaUtilHostApiRepresentation *hostApi, const PaStreamParameters *params, StreamDirection + streamDir, snd_pcm_t **pcm ) +{ + PaError result = paNoError; + int ret; + char dnameArray[50]; + const char* deviceName = dnameArray; + const PaAlsaDeviceInfo *deviceInfo = NULL; + PaAlsaStreamInfo *streamInfo = (PaAlsaStreamInfo *)params->hostApiSpecificStreamInfo; + + if( !streamInfo ) + { + int usePlug = 0; + deviceInfo = GetDeviceInfo( hostApi, params->device ); + + /* If device name starts with hw: and PA_ALSA_PLUGHW is 1, we open the plughw device instead */ + if( !strncmp( "hw:", deviceInfo->alsaName, 3 ) && getenv( "PA_ALSA_PLUGHW" ) ) + usePlug = atoi( getenv( "PA_ALSA_PLUGHW" ) ); + if( usePlug ) + snprintf( dnameArray, 50, "plug%s", deviceInfo->alsaName ); + else + deviceName = deviceInfo->alsaName; + } + else + deviceName = streamInfo->deviceString; + + PA_DEBUG(( "%s: Opening device %s\n", __FUNCTION__, deviceName )); + if( (ret = OpenPcm( pcm, deviceName, streamDir == StreamDirection_In ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, + SND_PCM_NONBLOCK, 1 )) < 0 ) + { + /* Not to be closed */ + *pcm = NULL; + ENSURE_( ret, -EBUSY == ret ? paDeviceUnavailable : paBadIODeviceCombination ); + } + ENSURE_( alsa_snd_pcm_nonblock( *pcm, 0 ), paUnanticipatedHostError ); + +end: + return result; + +error: + goto end; +} + +static PaError TestParameters( const PaUtilHostApiRepresentation *hostApi, const PaStreamParameters *parameters, + double sampleRate, StreamDirection streamDir ) +{ + PaError result = paNoError; + snd_pcm_t *pcm = NULL; + PaSampleFormat availableFormats; + /* We are able to adapt to a number of channels less than what the device supports */ + unsigned int numHostChannels; + PaSampleFormat hostFormat; + snd_pcm_hw_params_t *hwParams; + alsa_snd_pcm_hw_params_alloca( &hwParams ); + + if( !parameters->hostApiSpecificStreamInfo ) + { + const PaAlsaDeviceInfo *devInfo = GetDeviceInfo( hostApi, parameters->device ); + numHostChannels = PA_MAX( parameters->channelCount, StreamDirection_In == streamDir ? + devInfo->minInputChannels : devInfo->minOutputChannels ); + } + else + numHostChannels = parameters->channelCount; + + PA_ENSURE( AlsaOpen( hostApi, parameters, streamDir, &pcm ) ); + + alsa_snd_pcm_hw_params_any( pcm, hwParams ); + + if( SetApproximateSampleRate( pcm, hwParams, sampleRate ) < 0 ) + { + result = paInvalidSampleRate; + goto error; + } + + if( alsa_snd_pcm_hw_params_set_channels( pcm, hwParams, numHostChannels ) < 0 ) + { + result = paInvalidChannelCount; + goto error; + } + + /* See if we can find a best possible match */ + availableFormats = GetAvailableFormats( pcm ); + PA_ENSURE( hostFormat = PaUtil_SelectClosestAvailableFormat( availableFormats, parameters->sampleFormat ) ); + + /* Some specific hardware (reported: Audio8 DJ) can fail with assertion during this step. */ + ENSURE_( alsa_snd_pcm_hw_params_set_format( pcm, hwParams, Pa2AlsaFormat( hostFormat ) ), paUnanticipatedHostError ); + + { + /* It happens that this call fails because the device is busy */ + int ret = 0; + if( (ret = alsa_snd_pcm_hw_params( pcm, hwParams )) < 0) + { + if( -EINVAL == ret ) + { + /* Don't know what to return here */ + result = paBadIODeviceCombination; + goto error; + } + else if( -EBUSY == ret ) + { + result = paDeviceUnavailable; + PA_DEBUG(( "%s: Device is busy\n", __FUNCTION__ )); + } + else + { + result = paUnanticipatedHostError; + } + + ENSURE_( ret, result ); + } + } + +end: + if( pcm ) + { + alsa_snd_pcm_close( pcm ); + } + return result; + +error: + goto end; +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + int inputChannelCount = 0, outputChannelCount = 0; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaError result = paFormatIsSupported; + + if( inputParameters ) + { + PA_ENSURE( ValidateParameters( inputParameters, hostApi, StreamDirection_In ) ); + + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + } + + if( outputParameters ) + { + PA_ENSURE( ValidateParameters( outputParameters, hostApi, StreamDirection_Out ) ); + + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + } + + if( inputChannelCount ) + { + if( (result = TestParameters( hostApi, inputParameters, sampleRate, StreamDirection_In )) + != paNoError ) + goto error; + } + if ( outputChannelCount ) + { + if( (result = TestParameters( hostApi, outputParameters, sampleRate, StreamDirection_Out )) + != paNoError ) + goto error; + } + + return paFormatIsSupported; + +error: + return result; +} + +static PaError PaAlsaStreamComponent_Initialize( PaAlsaStreamComponent *self, PaAlsaHostApiRepresentation *alsaApi, + const PaStreamParameters *params, StreamDirection streamDir, int callbackMode ) +{ + PaError result = paNoError; + PaSampleFormat userSampleFormat = params->sampleFormat, hostSampleFormat = paNoError; + assert( params->channelCount > 0 ); + + /* Make sure things have an initial value */ + memset( self, 0, sizeof (PaAlsaStreamComponent) ); + + if( NULL == params->hostApiSpecificStreamInfo ) + { + const PaAlsaDeviceInfo *devInfo = GetDeviceInfo( &alsaApi->baseHostApiRep, params->device ); + self->numHostChannels = PA_MAX( params->channelCount, StreamDirection_In == streamDir ? devInfo->minInputChannels + : devInfo->minOutputChannels ); + } + else + { + /* We're blissfully unaware of the minimum channelCount */ + self->numHostChannels = params->channelCount; + } + + self->device = params->device; + + PA_ENSURE( AlsaOpen( &alsaApi->baseHostApiRep, params, streamDir, &self->pcm ) ); + self->nfds = alsa_snd_pcm_poll_descriptors_count( self->pcm ); + + PA_ENSURE( hostSampleFormat = PaUtil_SelectClosestAvailableFormat( GetAvailableFormats( self->pcm ), userSampleFormat ) ); + + self->hostSampleFormat = hostSampleFormat; + self->nativeFormat = Pa2AlsaFormat( hostSampleFormat ); + self->hostInterleaved = self->userInterleaved = !(userSampleFormat & paNonInterleaved); + self->numUserChannels = params->channelCount; + self->streamDir = streamDir; + self->canMmap = 0; + self->nonMmapBuffer = NULL; + self->nonMmapBufferSize = 0; + + if( !callbackMode && !self->userInterleaved ) + { + /* Pre-allocate non-interleaved user provided buffers */ + PA_UNLESS( self->userBuffers = PaUtil_AllocateMemory( sizeof (void *) * self->numUserChannels ), + paInsufficientMemory ); + } + +error: + + /* Log all available formats. */ + if ( hostSampleFormat == paSampleFormatNotSupported ) + { + LogAllAvailableFormats( self->pcm ); + PA_DEBUG(( "%s: Please provide the log output to PortAudio developers, your hardware does not have any sample format implemented yet.\n", __FUNCTION__ )); + } + + return result; +} + +static void PaAlsaStreamComponent_Terminate( PaAlsaStreamComponent *self ) +{ + alsa_snd_pcm_close( self->pcm ); + if( self->userBuffers ) + PaUtil_FreeMemory( self->userBuffers ); +} + +/* +static int nearbyint_(float value) { + if( value - (int)value > .5 ) + return (int)ceil( value ); + return (int)floor( value ); +} +*/ + +/** Initiate configuration, preparing for determining a period size suitable for both capture and playback components. + * + */ +static PaError PaAlsaStreamComponent_InitialConfigure( PaAlsaStreamComponent *self, const PaStreamParameters *params, + int primeBuffers, snd_pcm_hw_params_t *hwParams, double *sampleRate ) +{ + /* Configuration consists of setting all of ALSA's parameters. + * These parameters come in two flavors: hardware parameters + * and software paramters. Hardware parameters will affect + * the way the device is initialized, software parameters + * affect the way ALSA interacts with me, the user-level client. + */ + + PaError result = paNoError; + snd_pcm_access_t accessMode, alternateAccessMode; + int dir = 0; + snd_pcm_t *pcm = self->pcm; + double sr = *sampleRate; + unsigned int minPeriods = 2; + + /* self->framesPerBuffer = framesPerHostBuffer; */ + + /* ... fill up the configuration space with all possibile + * combinations of parameters this device will accept */ + ENSURE_( alsa_snd_pcm_hw_params_any( pcm, hwParams ), paUnanticipatedHostError ); + + ENSURE_( alsa_snd_pcm_hw_params_set_periods_integer( pcm, hwParams ), paUnanticipatedHostError ); + /* I think there should be at least 2 periods (even though ALSA doesn't appear to enforce this) */ + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_set_periods_min( pcm, hwParams, &minPeriods, &dir ), paUnanticipatedHostError ); + + if( self->userInterleaved ) + { + accessMode = SND_PCM_ACCESS_MMAP_INTERLEAVED; + alternateAccessMode = SND_PCM_ACCESS_MMAP_NONINTERLEAVED; + + /* test if MMAP supported */ + self->canMmap = alsa_snd_pcm_hw_params_test_access( pcm, hwParams, accessMode ) >= 0 || + alsa_snd_pcm_hw_params_test_access( pcm, hwParams, alternateAccessMode ) >= 0; + + PA_DEBUG(("%s: device MMAP SND_PCM_ACCESS_MMAP_INTERLEAVED: %s\n", __FUNCTION__, (alsa_snd_pcm_hw_params_test_access( pcm, hwParams, accessMode ) >= 0 ? "YES" : "NO"))); + PA_DEBUG(("%s: device MMAP SND_PCM_ACCESS_MMAP_NONINTERLEAVED: %s\n", __FUNCTION__, (alsa_snd_pcm_hw_params_test_access( pcm, hwParams, alternateAccessMode ) >= 0 ? "YES" : "NO"))); + + if (!self->canMmap) + { + accessMode = SND_PCM_ACCESS_RW_INTERLEAVED; + alternateAccessMode = SND_PCM_ACCESS_RW_NONINTERLEAVED; + } + } + else + { + accessMode = SND_PCM_ACCESS_MMAP_NONINTERLEAVED; + alternateAccessMode = SND_PCM_ACCESS_MMAP_INTERLEAVED; + + /* test if MMAP supported */ + self->canMmap = alsa_snd_pcm_hw_params_test_access( pcm, hwParams, accessMode ) >= 0 || + alsa_snd_pcm_hw_params_test_access( pcm, hwParams, alternateAccessMode ) >= 0; + + PA_DEBUG(("%s: device MMAP SND_PCM_ACCESS_MMAP_NONINTERLEAVED: %s\n", __FUNCTION__, (alsa_snd_pcm_hw_params_test_access( pcm, hwParams, accessMode ) >= 0 ? "YES" : "NO"))); + PA_DEBUG(("%s: device MMAP SND_PCM_ACCESS_MMAP_INTERLEAVED: %s\n", __FUNCTION__, (alsa_snd_pcm_hw_params_test_access( pcm, hwParams, alternateAccessMode ) >= 0 ? "YES" : "NO"))); + + if (!self->canMmap) + { + accessMode = SND_PCM_ACCESS_RW_NONINTERLEAVED; + alternateAccessMode = SND_PCM_ACCESS_RW_INTERLEAVED; + } + } + + PA_DEBUG(("%s: device can MMAP: %s\n", __FUNCTION__, (self->canMmap ? "YES" : "NO"))); + + /* If requested access mode fails, try alternate mode */ + if( alsa_snd_pcm_hw_params_set_access( pcm, hwParams, accessMode ) < 0 ) + { + int err = 0; + if( (err = alsa_snd_pcm_hw_params_set_access( pcm, hwParams, alternateAccessMode )) < 0) + { + result = paUnanticipatedHostError; + PaUtil_SetLastHostErrorInfo( paALSA, err, alsa_snd_strerror( err ) ); + goto error; + } + /* Flip mode */ + self->hostInterleaved = !self->userInterleaved; + } + + /* Some specific hardware (reported: Audio8 DJ) can fail with assertion during this step. */ + ENSURE_( alsa_snd_pcm_hw_params_set_format( pcm, hwParams, self->nativeFormat ), paUnanticipatedHostError ); + + ENSURE_( SetApproximateSampleRate( pcm, hwParams, sr ), paInvalidSampleRate ); + ENSURE_( GetExactSampleRate( hwParams, &sr ), paUnanticipatedHostError ); + /* reject if there's no sample rate within 1% of the one requested */ + if( (fabs( *sampleRate - sr ) / *sampleRate) > 0.01 ) + { + PA_DEBUG(("%s: Wanted %f, closest sample rate was %d\n", __FUNCTION__, sampleRate, sr )); + PA_ENSURE( paInvalidSampleRate ); + } + + ENSURE_( alsa_snd_pcm_hw_params_set_channels( pcm, hwParams, self->numHostChannels ), paInvalidChannelCount ); + + *sampleRate = sr; + +end: + return result; + +error: + /* No particular action */ + goto end; +} + +/** Finish the configuration of the component's ALSA device. + * + * As part of this method, the component's bufferSize attribute will be set. + * @param latency: The latency for this component. + */ +static PaError PaAlsaStreamComponent_FinishConfigure( PaAlsaStreamComponent *self, snd_pcm_hw_params_t* hwParams, + const PaStreamParameters *params, int primeBuffers, double sampleRate, PaTime* latency ) +{ + PaError result = paNoError; + snd_pcm_sw_params_t* swParams; + snd_pcm_uframes_t bufSz = 0; + *latency = -1.; + + alsa_snd_pcm_sw_params_alloca( &swParams ); + + bufSz = params->suggestedLatency * sampleRate; + ENSURE_( alsa_snd_pcm_hw_params_set_buffer_size_near( self->pcm, hwParams, &bufSz ), paUnanticipatedHostError ); + + /* Set the parameters! */ + { + int r = alsa_snd_pcm_hw_params( self->pcm, hwParams ); +#ifdef PA_ENABLE_DEBUG_OUTPUT + if( r < 0 ) + { + snd_output_t *output = NULL; + alsa_snd_output_stdio_attach( &output, stderr, 0 ); + alsa_snd_pcm_hw_params_dump( hwParams, output ); + } +#endif + ENSURE_(r, paUnanticipatedHostError ); + } + if (alsa_snd_pcm_hw_params_get_buffer_size != NULL) + { + ENSURE_( alsa_snd_pcm_hw_params_get_buffer_size( hwParams, &self->bufferSize ), paUnanticipatedHostError ); + } + else + { + self->bufferSize = bufSz; + } + + /* Latency in seconds */ + *latency = self->bufferSize / sampleRate; + + /* Now software parameters... */ + ENSURE_( alsa_snd_pcm_sw_params_current( self->pcm, swParams ), paUnanticipatedHostError ); + + ENSURE_( alsa_snd_pcm_sw_params_set_start_threshold( self->pcm, swParams, self->framesPerBuffer ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_sw_params_set_stop_threshold( self->pcm, swParams, self->bufferSize ), paUnanticipatedHostError ); + + /* Silence buffer in the case of underrun */ + if( !primeBuffers ) /* XXX: Make sense? */ + { + snd_pcm_uframes_t boundary; + ENSURE_( alsa_snd_pcm_sw_params_get_boundary( swParams, &boundary ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_sw_params_set_silence_threshold( self->pcm, swParams, 0 ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_sw_params_set_silence_size( self->pcm, swParams, boundary ), paUnanticipatedHostError ); + } + + ENSURE_( alsa_snd_pcm_sw_params_set_avail_min( self->pcm, swParams, self->framesPerBuffer ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_sw_params_set_xfer_align( self->pcm, swParams, 1 ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_sw_params_set_tstamp_mode( self->pcm, swParams, SND_PCM_TSTAMP_ENABLE ), paUnanticipatedHostError ); + + /* Set the parameters! */ + ENSURE_( alsa_snd_pcm_sw_params( self->pcm, swParams ), paUnanticipatedHostError ); + +error: + return result; +} + +static PaError PaAlsaStream_Initialize( PaAlsaStream *self, PaAlsaHostApiRepresentation *alsaApi, const PaStreamParameters *inParams, + const PaStreamParameters *outParams, double sampleRate, unsigned long framesPerUserBuffer, PaStreamCallback callback, + PaStreamFlags streamFlags, void *userData ) +{ + PaError result = paNoError; + assert( self ); + + memset( self, 0, sizeof (PaAlsaStream) ); + + if( NULL != callback ) + { + PaUtil_InitializeStreamRepresentation( &self->streamRepresentation, + &alsaApi->callbackStreamInterface, + callback, userData ); + self->callbackMode = 1; + } + else + { + PaUtil_InitializeStreamRepresentation( &self->streamRepresentation, + &alsaApi->blockingStreamInterface, + NULL, userData ); + } + + self->framesPerUserBuffer = framesPerUserBuffer; + self->neverDropInput = streamFlags & paNeverDropInput; + /* XXX: Ignore paPrimeOutputBuffersUsingStreamCallback untill buffer priming is fully supported in pa_process.c */ + /* + if( outParams & streamFlags & paPrimeOutputBuffersUsingStreamCallback ) + self->primeBuffers = 1; + */ + memset( &self->capture, 0, sizeof (PaAlsaStreamComponent) ); + memset( &self->playback, 0, sizeof (PaAlsaStreamComponent) ); + if( inParams ) + { + PA_ENSURE( PaAlsaStreamComponent_Initialize( &self->capture, alsaApi, inParams, StreamDirection_In, NULL != callback ) ); + } + if( outParams ) + { + PA_ENSURE( PaAlsaStreamComponent_Initialize( &self->playback, alsaApi, outParams, StreamDirection_Out, NULL != callback ) ); + } + + assert( self->capture.nfds || self->playback.nfds ); + + PA_UNLESS( self->pfds = (struct pollfd*)PaUtil_AllocateMemory( (self->capture.nfds + + self->playback.nfds) * sizeof (struct pollfd) ), paInsufficientMemory ); + + PaUtil_InitializeCpuLoadMeasurer( &self->cpuLoadMeasurer, sampleRate ); + ASSERT_CALL_( PaUnixMutex_Initialize( &self->stateMtx ), paNoError ); + +error: + return result; +} + +/** Free resources associated with stream, and eventually stream itself. + * + * Frees allocated memory, and terminates individual StreamComponents. + */ +static void PaAlsaStream_Terminate( PaAlsaStream *self ) +{ + assert( self ); + + if( self->capture.pcm ) + { + PaAlsaStreamComponent_Terminate( &self->capture ); + } + if( self->playback.pcm ) + { + PaAlsaStreamComponent_Terminate( &self->playback ); + } + + PaUtil_FreeMemory( self->pfds ); + ASSERT_CALL_( PaUnixMutex_Terminate( &self->stateMtx ), paNoError ); + + PaUtil_FreeMemory( self ); +} + +/** Calculate polling timeout + * + * @param frames Time to wait + * @return Polling timeout in milliseconds + */ +static int CalculatePollTimeout( const PaAlsaStream *stream, unsigned long frames ) +{ + assert( stream->streamRepresentation.streamInfo.sampleRate > 0.0 ); + /* Period in msecs, rounded up */ + return (int)ceil( 1000 * frames / stream->streamRepresentation.streamInfo.sampleRate ); +} + +/** Align value in backward direction. + * + * @param v: Value to align. + * @param align: Alignment. + */ +static unsigned long PaAlsa_AlignBackward(unsigned long v, unsigned long align) +{ + return ((v - (align ? v % align : 0))); +} + +/** Align value in forward direction. + * + * @param v: Value to align. + * @param align: Alignment. + */ +static unsigned long PaAlsa_AlignForward(unsigned long v, unsigned long align) +{ + unsigned long remainder = (align ? (v % align) : 0); + return (remainder != 0 ? v + (align - remainder) : v); +} + +/** Get size of host buffer maintained from the number of user frames, sample rate and suggested latency. Minimum double buffering + * is maintained to allow 100% CPU usage inside user callback. + * + * @param userFramesPerBuffer: User buffer size in number of frames. + * @param suggestedLatency: User provided desired latency. + * @param sampleRate: Sample rate. + */ +static unsigned long PaAlsa_GetFramesPerHostBuffer(unsigned long userFramesPerBuffer, PaTime suggestedLatency, double sampleRate) +{ + unsigned long frames = userFramesPerBuffer + PA_MAX( userFramesPerBuffer, (unsigned long)(suggestedLatency * sampleRate) ); + return frames; +} + +/** Determine size per host buffer. + * + * During this method call, the component's framesPerBuffer attribute gets computed, and the corresponding period size + * gets configured for the device. + * @param accurate: If the configured period size is non-integer, this will be set to 0. + */ +static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamComponent* self, const PaStreamParameters* params, + unsigned long framesPerUserBuffer, double sampleRate, snd_pcm_hw_params_t* hwParams, int* accurate ) +{ + PaError result = paNoError; + unsigned long bufferSize, framesPerHostBuffer; + int dir = 0; + + /* Calculate host buffer size */ + bufferSize = PaAlsa_GetFramesPerHostBuffer(framesPerUserBuffer, params->suggestedLatency, sampleRate); + + /* Log */ + PA_DEBUG(( "%s: user-buffer (frames) = %lu\n", __FUNCTION__, framesPerUserBuffer )); + PA_DEBUG(( "%s: user-buffer (sec) = %f\n", __FUNCTION__, (double)(framesPerUserBuffer / sampleRate) )); + PA_DEBUG(( "%s: suggested latency (sec) = %f\n", __FUNCTION__, params->suggestedLatency )); + PA_DEBUG(( "%s: suggested host buffer (frames) = %lu\n", __FUNCTION__, bufferSize )); + PA_DEBUG(( "%s: suggested host buffer (sec) = %f\n", __FUNCTION__, (double)(bufferSize / sampleRate) )); + +#ifdef PA_ALSA_USE_OBSOLETE_HOST_BUFFER_CALC + + if( framesPerUserBuffer != paFramesPerBufferUnspecified ) + { + /* Preferably the host buffer size should be a multiple of the user buffer size */ + + if( bufferSize > framesPerUserBuffer ) + { + snd_pcm_uframes_t remainder = bufferSize % framesPerUserBuffer; + if( remainder > framesPerUserBuffer / 2. ) + bufferSize += framesPerUserBuffer - remainder; + else + bufferSize -= remainder; + + assert( bufferSize % framesPerUserBuffer == 0 ); + } + else if( framesPerUserBuffer % bufferSize != 0 ) + { + /* Find a good compromise between user specified latency and buffer size */ + if( bufferSize > framesPerUserBuffer * .75 ) + { + bufferSize = framesPerUserBuffer; + } + else + { + snd_pcm_uframes_t newSz = framesPerUserBuffer; + while( newSz / 2 >= bufferSize ) + { + if( framesPerUserBuffer % (newSz / 2) != 0 ) + { + /* No use dividing any further */ + break; + } + newSz /= 2; + } + bufferSize = newSz; + } + + assert( framesPerUserBuffer % bufferSize == 0 ); + } + } + +#endif + + { + unsigned numPeriods = numPeriods_, maxPeriods = 0, minPeriods = numPeriods_; + + /* It may be that the device only supports 2 periods for instance */ + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_periods_min( hwParams, &minPeriods, &dir ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_get_periods_max( hwParams, &maxPeriods, &dir ), paUnanticipatedHostError ); + assert( maxPeriods > 1 ); + + /* Clamp to min/max */ + numPeriods = PA_MIN(maxPeriods, PA_MAX(minPeriods, numPeriods)); + + PA_DEBUG(( "%s: periods min = %lu, max = %lu, req = %lu \n", __FUNCTION__, minPeriods, maxPeriods, numPeriods )); + +#ifndef PA_ALSA_USE_OBSOLETE_HOST_BUFFER_CALC + + /* Calculate period size */ + framesPerHostBuffer = (bufferSize / numPeriods); + + /* Align & test size */ + if( framesPerUserBuffer != paFramesPerBufferUnspecified ) + { + /* Align to user buffer size */ + framesPerHostBuffer = PaAlsa_AlignForward(framesPerHostBuffer, framesPerUserBuffer); + + /* Test (borrowed from older implementation) */ + if( framesPerHostBuffer < framesPerUserBuffer ) + { + assert( framesPerUserBuffer % framesPerHostBuffer == 0 ); + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer, 0 ) < 0 ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer * 2, 0 ) == 0 ) + framesPerHostBuffer *= 2; + else + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer / 2, 0 ) == 0 ) + framesPerHostBuffer /= 2; + } + } + else + { + assert( framesPerHostBuffer % framesPerUserBuffer == 0 ); + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer, 0 ) < 0 ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer + framesPerUserBuffer, 0 ) == 0 ) + framesPerHostBuffer += framesPerUserBuffer; + else + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer - framesPerUserBuffer, 0 ) == 0 ) + framesPerHostBuffer -= framesPerUserBuffer; + } + } + } +#endif + +#ifdef PA_ALSA_USE_OBSOLETE_HOST_BUFFER_CALC + + if( framesPerUserBuffer != paFramesPerBufferUnspecified ) + { + /* Try to get a power-of-two of the user buffer size. */ + framesPerHostBuffer = framesPerUserBuffer; + if( framesPerHostBuffer < bufferSize ) + { + while( bufferSize / framesPerHostBuffer > numPeriods ) + { + framesPerHostBuffer *= 2; + } + /* One extra period is preferrable to one less (should be more robust) */ + if( bufferSize / framesPerHostBuffer < numPeriods ) + { + framesPerHostBuffer /= 2; + } + } + else + { + while( bufferSize / framesPerHostBuffer < numPeriods ) + { + if( framesPerUserBuffer % (framesPerHostBuffer / 2) != 0 ) + { + /* Can't be divided any further */ + break; + } + framesPerHostBuffer /= 2; + } + } + + if( framesPerHostBuffer < framesPerUserBuffer ) + { + assert( framesPerUserBuffer % framesPerHostBuffer == 0 ); + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer, 0 ) < 0 ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer * 2, 0 ) == 0 ) + framesPerHostBuffer *= 2; + else if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer / 2, 0 ) == 0 ) + framesPerHostBuffer /= 2; + } + } + else + { + assert( framesPerHostBuffer % framesPerUserBuffer == 0 ); + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer, 0 ) < 0 ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer + framesPerUserBuffer, 0 ) == 0 ) + framesPerHostBuffer += framesPerUserBuffer; + else if( alsa_snd_pcm_hw_params_test_period_size( self->pcm, hwParams, framesPerHostBuffer - framesPerUserBuffer, 0 ) == 0 ) + framesPerHostBuffer -= framesPerUserBuffer; + } + } + } + else + { + framesPerHostBuffer = bufferSize / numPeriods; + } + + /* non-mmap mode needs a reasonably-sized buffer or it'll stutter */ + if( !self->canMmap && framesPerHostBuffer < 2048 ) + framesPerHostBuffer = 2048; +#endif + PA_DEBUG(( "%s: suggested host buffer period = %lu \n", __FUNCTION__, framesPerHostBuffer )); + } + + { + /* Get min/max period sizes and adjust our chosen */ + snd_pcm_uframes_t min = 0, max = 0, minmax_diff; + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_min( hwParams, &min, NULL ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_max( hwParams, &max, NULL ), paUnanticipatedHostError ); + minmax_diff = max - min; + + if( framesPerHostBuffer < min ) + { + PA_DEBUG(( "%s: The determined period size (%lu) is less than minimum (%lu)\n", __FUNCTION__, framesPerHostBuffer, min )); + framesPerHostBuffer = ((minmax_diff == 2) ? min + 1 : min); + } + else + if( framesPerHostBuffer > max ) + { + PA_DEBUG(( "%s: The determined period size (%lu) is greater than maximum (%lu)\n", __FUNCTION__, framesPerHostBuffer, max )); + framesPerHostBuffer = ((minmax_diff == 2) ? max - 1 : max); + } + + PA_DEBUG(( "%s: device period minimum = %lu\n", __FUNCTION__, min )); + PA_DEBUG(( "%s: device period maximum = %lu\n", __FUNCTION__, max )); + PA_DEBUG(( "%s: host buffer period = %lu\n", __FUNCTION__, framesPerHostBuffer )); + PA_DEBUG(( "%s: host buffer period latency = %f\n", __FUNCTION__, (double)(framesPerHostBuffer / sampleRate) )); + + /* Try setting period size */ + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( self->pcm, hwParams, &framesPerHostBuffer, &dir ), paUnanticipatedHostError ); + if( dir != 0 ) + { + PA_DEBUG(( "%s: The configured period size is non-integer.\n", __FUNCTION__, dir )); + *accurate = 0; + } + } + + /* Set result */ + self->framesPerBuffer = framesPerHostBuffer; + +error: + return result; +} + +/* We need to determine how many frames per host buffer (period) to use. Our + * goals are to provide the best possible performance, but also to + * honor the requested latency settings as closely as we can. Therefore this + * decision is based on: + * + * - the period sizes that playback and/or capture support. The + * host buffer size has to be one of these. + * - the number of periods that playback and/or capture support. + * + * We want to make period_size*(num_periods-1) to be as close as possible + * to latency*rate for both playback and capture. + * + * This method will determine suitable period sizes for capture and playback handles, and report the maximum number of + * frames per host buffer. The latter is relevant, in case we should be so unfortunate that the period size differs + * between capture and playback. If this should happen, the stream's hostBufferSizeMode attribute will be set to + * paUtilBoundedHostBufferSize, because the best we can do is limit the size of individual host buffers to the upper + * bound. The size of host buffers scheduled for processing should only matter if the user has specified a buffer size, + * but when he/she does we must strive for an optimal configuration. By default we'll opt for a fixed host buffer size, + * which should be fine if the period size is the same for capture and playback. In general, if there is a specified user + * buffer size, this method tries it best to determine a period size which is a multiple of the user buffer size. + * + * The framesPerBuffer attributes of the individual capture and playback components of the stream are set to corresponding + * values determined here. Since these should be reported as + * + * This is one of those blocks of code that will just take a lot of + * refinement to be any good. + * + * In the full-duplex case it is possible that the routine was unable + * to find a number of frames per buffer acceptable to both devices + * TODO: Implement an algorithm to find the value closest to acceptance + * by both devices, to minimize difference between period sizes? + * + * @param determinedFramesPerHostBuffer: The determined host buffer size. + */ +static PaError PaAlsaStream_DetermineFramesPerBuffer( PaAlsaStream* self, double sampleRate, const PaStreamParameters* inputParameters, + const PaStreamParameters* outputParameters, unsigned long framesPerUserBuffer, snd_pcm_hw_params_t* hwParamsCapture, + snd_pcm_hw_params_t* hwParamsPlayback, PaUtilHostBufferSizeMode* hostBufferSizeMode ) +{ + PaError result = paNoError; + unsigned long framesPerHostBuffer = 0; + int dir = 0; + int accurate = 1; + unsigned numPeriods = numPeriods_; + + if( self->capture.pcm && self->playback.pcm ) + { + if( framesPerUserBuffer == paFramesPerBufferUnspecified ) + { + /* Come up with a common desired latency */ + snd_pcm_uframes_t desiredBufSz, e, minPeriodSize, maxPeriodSize, optimalPeriodSize, periodSize, + minCapture, minPlayback, maxCapture, maxPlayback; + + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_min( hwParamsCapture, &minCapture, &dir ), paUnanticipatedHostError ); + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_min( hwParamsPlayback, &minPlayback, &dir ), paUnanticipatedHostError ); + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_max( hwParamsCapture, &maxCapture, &dir ), paUnanticipatedHostError ); + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_period_size_max( hwParamsPlayback, &maxPlayback, &dir ), paUnanticipatedHostError ); + minPeriodSize = PA_MAX( minPlayback, minCapture ); + maxPeriodSize = PA_MIN( maxPlayback, maxCapture ); + PA_UNLESS( minPeriodSize <= maxPeriodSize, paBadIODeviceCombination ); + + desiredBufSz = (snd_pcm_uframes_t)(PA_MIN( outputParameters->suggestedLatency, inputParameters->suggestedLatency ) + * sampleRate); + /* Clamp desiredBufSz */ + { + snd_pcm_uframes_t maxBufferSize; + snd_pcm_uframes_t maxBufferSizeCapture, maxBufferSizePlayback; + ENSURE_( alsa_snd_pcm_hw_params_get_buffer_size_max( hwParamsCapture, &maxBufferSizeCapture ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_get_buffer_size_max( hwParamsPlayback, &maxBufferSizePlayback ), paUnanticipatedHostError ); + maxBufferSize = PA_MIN( maxBufferSizeCapture, maxBufferSizePlayback ); + + desiredBufSz = PA_MIN( desiredBufSz, maxBufferSize ); + } + + /* Find the closest power of 2 */ + e = ilogb( minPeriodSize ); + if( minPeriodSize & (minPeriodSize - 1) ) + e += 1; + periodSize = (snd_pcm_uframes_t)pow( 2, e ); + + while( periodSize <= maxPeriodSize ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->playback.pcm, hwParamsPlayback, periodSize, 0 ) >= 0 && + alsa_snd_pcm_hw_params_test_period_size( self->capture.pcm, hwParamsCapture, periodSize, 0 ) >= 0 ) + { + /* OK! */ + break; + } + + periodSize *= 2; + } + + optimalPeriodSize = PA_MAX( desiredBufSz / numPeriods, minPeriodSize ); + optimalPeriodSize = PA_MIN( optimalPeriodSize, maxPeriodSize ); + + /* Find the closest power of 2 */ + e = ilogb( optimalPeriodSize ); + if( optimalPeriodSize & (optimalPeriodSize - 1) ) + e += 1; + optimalPeriodSize = (snd_pcm_uframes_t)pow( 2, e ); + + while( optimalPeriodSize >= periodSize ) + { + if( alsa_snd_pcm_hw_params_test_period_size( self->capture.pcm, hwParamsCapture, optimalPeriodSize, 0 ) + >= 0 && alsa_snd_pcm_hw_params_test_period_size( self->playback.pcm, hwParamsPlayback, + optimalPeriodSize, 0 ) >= 0 ) + { + break; + } + optimalPeriodSize /= 2; + } + + if( optimalPeriodSize > periodSize ) + periodSize = optimalPeriodSize; + + if( periodSize <= maxPeriodSize ) + { + /* Looks good, the periodSize _should_ be acceptable by both devices */ + ENSURE_( alsa_snd_pcm_hw_params_set_period_size( self->capture.pcm, hwParamsCapture, periodSize, 0 ), + paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_set_period_size( self->playback.pcm, hwParamsPlayback, periodSize, 0 ), + paUnanticipatedHostError ); + self->capture.framesPerBuffer = self->playback.framesPerBuffer = periodSize; + framesPerHostBuffer = periodSize; + } + else + { + /* Unable to find a common period size, oh well */ + optimalPeriodSize = PA_MAX( desiredBufSz / numPeriods, minPeriodSize ); + optimalPeriodSize = PA_MIN( optimalPeriodSize, maxPeriodSize ); + + self->capture.framesPerBuffer = optimalPeriodSize; + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( self->capture.pcm, hwParamsCapture, &self->capture.framesPerBuffer, &dir ), + paUnanticipatedHostError ); + self->playback.framesPerBuffer = optimalPeriodSize; + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( self->playback.pcm, hwParamsPlayback, &self->playback.framesPerBuffer, &dir ), + paUnanticipatedHostError ); + framesPerHostBuffer = PA_MAX( self->capture.framesPerBuffer, self->playback.framesPerBuffer ); + *hostBufferSizeMode = paUtilBoundedHostBufferSize; + } + } + else + { + /* We choose the simple route and determine a suitable number of frames per buffer for one component of + * the stream, then we hope that this will work for the other component too (it should!). + */ + + unsigned maxPeriods = 0; + PaAlsaStreamComponent* first = &self->capture, * second = &self->playback; + const PaStreamParameters* firstStreamParams = inputParameters; + snd_pcm_hw_params_t* firstHwParams = hwParamsCapture, * secondHwParams = hwParamsPlayback; + + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_periods_max( hwParamsPlayback, &maxPeriods, &dir ), paUnanticipatedHostError ); + if( maxPeriods < numPeriods ) + { + /* The playback component is trickier to get right, try that first */ + first = &self->playback; + second = &self->capture; + firstStreamParams = outputParameters; + firstHwParams = hwParamsPlayback; + secondHwParams = hwParamsCapture; + } + + PA_ENSURE( PaAlsaStreamComponent_DetermineFramesPerBuffer( first, firstStreamParams, framesPerUserBuffer, + sampleRate, firstHwParams, &accurate ) ); + + second->framesPerBuffer = first->framesPerBuffer; + dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( second->pcm, secondHwParams, &second->framesPerBuffer, &dir ), + paUnanticipatedHostError ); + if( self->capture.framesPerBuffer == self->playback.framesPerBuffer ) + { + framesPerHostBuffer = self->capture.framesPerBuffer; + } + else + { + framesPerHostBuffer = PA_MAX( self->capture.framesPerBuffer, self->playback.framesPerBuffer ); + *hostBufferSizeMode = paUtilBoundedHostBufferSize; + } + } + } + else /* half-duplex is a slightly simpler case */ + { + if( self->capture.pcm ) + { + PA_ENSURE( PaAlsaStreamComponent_DetermineFramesPerBuffer( &self->capture, inputParameters, framesPerUserBuffer, + sampleRate, hwParamsCapture, &accurate) ); + framesPerHostBuffer = self->capture.framesPerBuffer; + } + else + { + assert( self->playback.pcm ); + PA_ENSURE( PaAlsaStreamComponent_DetermineFramesPerBuffer( &self->playback, outputParameters, framesPerUserBuffer, + sampleRate, hwParamsPlayback, &accurate ) ); + framesPerHostBuffer = self->playback.framesPerBuffer; + } + } + + PA_UNLESS( framesPerHostBuffer != 0, paInternalError ); + self->maxFramesPerHostBuffer = framesPerHostBuffer; + + if( !self->playback.canMmap || !accurate ) + { + /* Don't know the exact size per host buffer */ + *hostBufferSizeMode = paUtilBoundedHostBufferSize; + /* Raise upper bound */ + if( !accurate ) + ++self->maxFramesPerHostBuffer; + } + +error: + return result; +} + +/** Set up ALSA stream parameters. + * + */ +static PaError PaAlsaStream_Configure( PaAlsaStream *self, const PaStreamParameters *inParams, const PaStreamParameters* + outParams, double sampleRate, unsigned long framesPerUserBuffer, double* inputLatency, double* outputLatency, + PaUtilHostBufferSizeMode* hostBufferSizeMode ) +{ + PaError result = paNoError; + double realSr = sampleRate; + snd_pcm_hw_params_t* hwParamsCapture, * hwParamsPlayback; + + alsa_snd_pcm_hw_params_alloca( &hwParamsCapture ); + alsa_snd_pcm_hw_params_alloca( &hwParamsPlayback ); + + if( self->capture.pcm ) + PA_ENSURE( PaAlsaStreamComponent_InitialConfigure( &self->capture, inParams, self->primeBuffers, hwParamsCapture, + &realSr ) ); + if( self->playback.pcm ) + PA_ENSURE( PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, + &realSr ) ); + + PA_ENSURE( PaAlsaStream_DetermineFramesPerBuffer( self, realSr, inParams, outParams, framesPerUserBuffer, + hwParamsCapture, hwParamsPlayback, hostBufferSizeMode ) ); + + if( self->capture.pcm ) + { + assert( self->capture.framesPerBuffer != 0 ); + PA_ENSURE( PaAlsaStreamComponent_FinishConfigure( &self->capture, hwParamsCapture, inParams, self->primeBuffers, realSr, + inputLatency ) ); + PA_DEBUG(( "%s: Capture period size: %lu, latency: %f\n", __FUNCTION__, self->capture.framesPerBuffer, *inputLatency )); + } + if( self->playback.pcm ) + { + assert( self->playback.framesPerBuffer != 0 ); + PA_ENSURE( PaAlsaStreamComponent_FinishConfigure( &self->playback, hwParamsPlayback, outParams, self->primeBuffers, realSr, + outputLatency ) ); + PA_DEBUG(( "%s: Playback period size: %lu, latency: %f\n", __FUNCTION__, self->playback.framesPerBuffer, *outputLatency )); + } + + /* Should be exact now */ + self->streamRepresentation.streamInfo.sampleRate = realSr; + + /* this will cause the two streams to automatically start/stop/prepare in sync. + * We only need to execute these operations on one of the pair. + * A: We don't want to do this on a blocking stream. + */ + if( self->callbackMode && self->capture.pcm && self->playback.pcm ) + { + int err = alsa_snd_pcm_link( self->capture.pcm, self->playback.pcm ); + if( err == 0 ) + self->pcmsSynced = 1; + else + PA_DEBUG(( "%s: Unable to sync pcms: %s\n", __FUNCTION__, alsa_snd_strerror( err ) )); + } + + { + unsigned long minFramesPerHostBuffer = PA_MIN( self->capture.pcm ? self->capture.framesPerBuffer : ULONG_MAX, + self->playback.pcm ? self->playback.framesPerBuffer : ULONG_MAX ); + self->pollTimeout = CalculatePollTimeout( self, minFramesPerHostBuffer ); /* Period in msecs, rounded up */ + + /* Time before watchdog unthrottles realtime thread == 1/4 of period time in msecs */ + /* self->threading.throttledSleepTime = (unsigned long) (minFramesPerHostBuffer / sampleRate / 4 * 1000); */ + } + + if( self->callbackMode ) + { + /* If the user expects a certain number of frames per callback we will either have to rely on block adaption + * (framesPerHostBuffer is not an integer multiple of framesPerBuffer) or we can simply align the number + * of host buffer frames with what the user specified */ + if( self->framesPerUserBuffer != paFramesPerBufferUnspecified ) + { + /* self->alignFrames = 1; */ + + /* Unless the ratio between number of host and user buffer frames is an integer we will have to rely + * on block adaption */ + /* + if( framesPerHostBuffer % framesPerBuffer != 0 || (self->capture.pcm && self->playback.pcm && + self->capture.framesPerBuffer != self->playback.framesPerBuffer) ) + self->useBlockAdaption = 1; + else + self->alignFrames = 1; + */ + } + } + +error: + return result; +} + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback* callback, + void *userData ) +{ + PaError result = paNoError; + PaAlsaHostApiRepresentation *alsaHostApi = (PaAlsaHostApiRepresentation*)hostApi; + PaAlsaStream *stream = NULL; + PaSampleFormat hostInputSampleFormat = 0, hostOutputSampleFormat = 0; + PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0; + int numInputChannels = 0, numOutputChannels = 0; + PaTime inputLatency, outputLatency; + /* Operate with fixed host buffer size by default, since other modes will invariably lead to block adaption */ + /* XXX: Use Bounded by default? Output tends to get stuttery with Fixed ... */ + PaUtilHostBufferSizeMode hostBufferSizeMode = paUtilFixedHostBufferSize; + + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; + + if( inputParameters ) + { + PA_ENSURE( ValidateParameters( inputParameters, hostApi, StreamDirection_In ) ); + + numInputChannels = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + } + if( outputParameters ) + { + PA_ENSURE( ValidateParameters( outputParameters, hostApi, StreamDirection_Out ) ); + + numOutputChannels = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + } + + /* XXX: Why do we support this anyway? */ + if( framesPerBuffer == paFramesPerBufferUnspecified && getenv( "PA_ALSA_PERIODSIZE" ) != NULL ) + { + PA_DEBUG(( "%s: Getting framesPerBuffer from environment\n", __FUNCTION__ )); + framesPerBuffer = atoi( getenv("PA_ALSA_PERIODSIZE") ); + } + + PA_UNLESS( stream = (PaAlsaStream*)PaUtil_AllocateMemory( sizeof(PaAlsaStream) ), paInsufficientMemory ); + PA_ENSURE( PaAlsaStream_Initialize( stream, alsaHostApi, inputParameters, outputParameters, sampleRate, + framesPerBuffer, callback, streamFlags, userData ) ); + + PA_ENSURE( PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, + &inputLatency, &outputLatency, &hostBufferSizeMode ) ); + hostInputSampleFormat = stream->capture.hostSampleFormat | (!stream->capture.hostInterleaved ? paNonInterleaved : 0); + hostOutputSampleFormat = stream->playback.hostSampleFormat | (!stream->playback.hostInterleaved ? paNonInterleaved : 0); + + PA_ENSURE( PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + numInputChannels, inputSampleFormat, hostInputSampleFormat, + numOutputChannels, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, framesPerBuffer, stream->maxFramesPerHostBuffer, + hostBufferSizeMode, callback, userData ) ); + + /* Ok, buffer processor is initialized, now we can deduce it's latency */ + if( numInputChannels > 0 ) + stream->streamRepresentation.streamInfo.inputLatency = inputLatency + (PaTime)( + PaUtil_GetBufferProcessorInputLatencyFrames( &stream->bufferProcessor ) / sampleRate); + if( numOutputChannels > 0 ) + stream->streamRepresentation.streamInfo.outputLatency = outputLatency + (PaTime)( + PaUtil_GetBufferProcessorOutputLatencyFrames( &stream->bufferProcessor ) / sampleRate); + + PA_DEBUG(( "%s: Stream: framesPerBuffer = %lu, maxFramesPerHostBuffer = %lu, latency = i(%f)/o(%f), \n", __FUNCTION__, framesPerBuffer, stream->maxFramesPerHostBuffer, stream->streamRepresentation.streamInfo.inputLatency, stream->streamRepresentation.streamInfo.outputLatency)); + + *s = (PaStream*)stream; + + return result; + +error: + if( stream ) + { + PA_DEBUG(( "%s: Stream in error, terminating\n", __FUNCTION__ )); + PaAlsaStream_Terminate( stream ); + } + + return result; +} + +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaAlsaStream *stream = (PaAlsaStream*)s; + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + + PaAlsaStream_Terminate( stream ); + + return result; +} + +static void SilenceBuffer( PaAlsaStream *stream ) +{ + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t frames = (snd_pcm_uframes_t)alsa_snd_pcm_avail_update( stream->playback.pcm ), offset; + + alsa_snd_pcm_mmap_begin( stream->playback.pcm, &areas, &offset, &frames ); + alsa_snd_pcm_areas_silence( areas, offset, stream->playback.numHostChannels, frames, stream->playback.nativeFormat ); + alsa_snd_pcm_mmap_commit( stream->playback.pcm, offset, frames ); +} + +/** Start/prepare pcm(s) for streaming. + * + * Depending on wether the stream is in callback or blocking mode, we will respectively start or simply + * prepare the playback pcm. If the buffer has _not_ been primed, we will in callback mode prepare and + * silence the buffer before starting playback. In blocking mode we simply prepare, as the playback will + * be started automatically as the user writes to output. + * + * The capture pcm, however, will simply be prepared and started. + */ +static PaError AlsaStart( PaAlsaStream *stream, int priming ) +{ + PaError result = paNoError; + + if( stream->playback.pcm ) + { + if( stream->callbackMode ) + { + if( !priming ) + { + /* Buffer isn't primed, so prepare and silence */ + ENSURE_( alsa_snd_pcm_prepare( stream->playback.pcm ), paUnanticipatedHostError ); + if( stream->playback.canMmap ) + SilenceBuffer( stream ); + } + if( stream->playback.canMmap ) + ENSURE_( alsa_snd_pcm_start( stream->playback.pcm ), paUnanticipatedHostError ); + } + else + ENSURE_( alsa_snd_pcm_prepare( stream->playback.pcm ), paUnanticipatedHostError ); + } + if( stream->capture.pcm && !stream->pcmsSynced ) + { + ENSURE_( alsa_snd_pcm_prepare( stream->capture.pcm ), paUnanticipatedHostError ); + /* For a blocking stream we want to start capture as well, since nothing will happen otherwise */ + ENSURE_( alsa_snd_pcm_start( stream->capture.pcm ), paUnanticipatedHostError ); + } + +end: + return result; +error: + goto end; +} + +/** Utility function for determining if pcms are in running state. + * + */ +#if 0 +static int IsRunning( PaAlsaStream *stream ) +{ + int result = 0; + + PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) ); + if( stream->capture.pcm ) + { + snd_pcm_state_t capture_state = alsa_snd_pcm_state( stream->capture.pcm ); + + if( capture_state == SND_PCM_STATE_RUNNING || capture_state == SND_PCM_STATE_XRUN + || capture_state == SND_PCM_STATE_DRAINING ) + { + result = 1; + goto end; + } + } + + if( stream->playback.pcm ) + { + snd_pcm_state_t playback_state = alsa_snd_pcm_state( stream->playback.pcm ); + + if( playback_state == SND_PCM_STATE_RUNNING || playback_state == SND_PCM_STATE_XRUN + || playback_state == SND_PCM_STATE_DRAINING ) + { + result = 1; + goto end; + } + } + +end: + ASSERT_CALL_( PaUnixMutex_Unlock( &stream->stateMtx ), paNoError ); + return result; +error: + goto error; +} +#endif + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaAlsaStream* stream = (PaAlsaStream*)s; + int streamStarted = 0; /* So we can know wether we need to take the stream down */ + + /* Ready the processor */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + /* Set now, so we can test for activity further down */ + stream->isActive = 1; + + if( stream->callbackMode ) + { + PA_ENSURE( PaUnixThread_New( &stream->thread, &CallbackThreadFunc, stream, 1., stream->rtSched ) ); + } + else + { + PA_ENSURE( AlsaStart( stream, 0 ) ); + streamStarted = 1; + } + +end: + return result; +error: + if( streamStarted ) + { + AbortStream( stream ); + } + stream->isActive = 0; + + goto end; +} + +/** Stop PCM handle, either softly or abruptly. + */ +static PaError AlsaStop( PaAlsaStream *stream, int abort ) +{ + PaError result = paNoError; + /* XXX: alsa_snd_pcm_drain tends to lock up, avoid it until we find out more */ + abort = 1; + /* + if( stream->capture.pcm && !strcmp( Pa_GetDeviceInfo( stream->capture.device )->name, + "dmix" ) ) + { + abort = 1; + } + else if( stream->playback.pcm && !strcmp( Pa_GetDeviceInfo( stream->playback.device )->name, + "dmix" ) ) + { + abort = 1; + } + */ + + if( abort ) + { + if( stream->playback.pcm ) + { + ENSURE_( alsa_snd_pcm_drop( stream->playback.pcm ), paUnanticipatedHostError ); + } + if( stream->capture.pcm && !stream->pcmsSynced ) + { + ENSURE_( alsa_snd_pcm_drop( stream->capture.pcm ), paUnanticipatedHostError ); + } + + PA_DEBUG(( "%s: Dropped frames\n", __FUNCTION__ )); + } + else + { + if( stream->playback.pcm ) + { + ENSURE_( alsa_snd_pcm_nonblock( stream->playback.pcm, 0 ), paUnanticipatedHostError ); + if( alsa_snd_pcm_drain( stream->playback.pcm ) < 0 ) + { + PA_DEBUG(( "%s: Draining playback handle failed!\n", __FUNCTION__ )); + } + } + if( stream->capture.pcm && !stream->pcmsSynced ) + { + /* We don't need to retrieve any remaining frames */ + if( alsa_snd_pcm_drain( stream->capture.pcm ) < 0 ) + { + PA_DEBUG(( "%s: Draining capture handle failed!\n", __FUNCTION__ )); + } + } + } + +end: + return result; +error: + goto end; +} + +/** Stop or abort stream. + * + * If a stream is in callback mode we will have to inspect wether the background thread has + * finished, or we will have to take it out. In either case we join the thread before + * returning. In blocking mode, we simply tell ALSA to stop abruptly (abort) or finish + * buffers (drain) + * + * Stream will be considered inactive (!PaAlsaStream::isActive) after a call to this function + */ +static PaError RealStop( PaAlsaStream *stream, int abort ) +{ + PaError result = paNoError; + + /* First deal with the callback thread, cancelling and/or joining + * it if necessary + */ + if( stream->callbackMode ) + { + PaError threadRes; + stream->callbackAbort = abort; + + if( !abort ) + { + PA_DEBUG(( "Stopping callback\n" )); + } + PA_ENSURE( PaUnixThread_Terminate( &stream->thread, !abort, &threadRes ) ); + if( threadRes != paNoError ) + { + PA_DEBUG(( "Callback thread returned: %d\n", threadRes )); + } +#if 0 + if( watchdogRes != paNoError ) + PA_DEBUG(( "Watchdog thread returned: %d\n", watchdogRes )); +#endif + + stream->callback_finished = 0; + } + else + { + PA_ENSURE( AlsaStop( stream, abort ) ); + } + + stream->isActive = 0; + +end: + return result; + +error: + goto end; +} + +static PaError StopStream( PaStream *s ) +{ + return RealStop( (PaAlsaStream *) s, 0 ); +} + +static PaError AbortStream( PaStream *s ) +{ + return RealStop( (PaAlsaStream * ) s, 1 ); +} + +/** The stream is considered stopped before StartStream, or AFTER a call to Abort/StopStream (callback + * returning !paContinue is not considered) + * + */ +static PaError IsStreamStopped( PaStream *s ) +{ + PaAlsaStream *stream = (PaAlsaStream *)s; + + /* callback_finished indicates we need to join callback thread (ie. in Abort/StopStream) */ + return !IsStreamActive( s ) && !stream->callback_finished; +} + +static PaError IsStreamActive( PaStream *s ) +{ + PaAlsaStream *stream = (PaAlsaStream*)s; + return stream->isActive; +} + +static PaTime GetStreamTime( PaStream *s ) +{ + PaAlsaStream *stream = (PaAlsaStream*)s; + + snd_timestamp_t timestamp; + snd_pcm_status_t* status; + alsa_snd_pcm_status_alloca( &status ); + + /* TODO: what if we have both? does it really matter? */ + + /* TODO: if running in callback mode, this will mean + * libasound routines are being called from multiple threads. + * need to verify that libasound is thread-safe. */ + + if( stream->capture.pcm ) + { + alsa_snd_pcm_status( stream->capture.pcm, status ); + } + else if( stream->playback.pcm ) + { + alsa_snd_pcm_status( stream->playback.pcm, status ); + } + + alsa_snd_pcm_status_get_tstamp( status, ×tamp ); + return timestamp.tv_sec + (PaTime)timestamp.tv_usec / 1e6; +} + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaAlsaStream *stream = (PaAlsaStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + +static int SetApproximateSampleRate( snd_pcm_t *pcm, snd_pcm_hw_params_t *hwParams, double sampleRate ) +{ + PaError result = paNoError; + unsigned long approx = (unsigned long) sampleRate; + int dir = 0; + double fraction = sampleRate - approx; + + assert( pcm && hwParams ); + + if( fraction > 0.0 ) + { + if( fraction > 0.5 ) + { + ++approx; + dir = -1; + } + else + dir = 1; + } + + if( alsa_snd_pcm_hw_params_set_rate( pcm, hwParams, approx, dir ) < 0) + result = paInvalidSampleRate; + +end: + + return result; + +error: + + /* Log */ + { + unsigned int _min = 0, _max = 0; int _dir = 0; + ENSURE_( alsa_snd_pcm_hw_params_get_rate_min( hwParams, &_min, &_dir ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_get_rate_max( hwParams, &_max, &_dir ), paUnanticipatedHostError ); + PA_DEBUG(( "%s: SR min = %d, max = %d, req = %lu\n", __FUNCTION__, _min, _max, approx )); + } + + goto end; +} + +/* Return exact sample rate in param sampleRate */ +static int GetExactSampleRate( snd_pcm_hw_params_t *hwParams, double *sampleRate ) +{ + unsigned int num, den; + int err; + + assert( hwParams ); + + err = alsa_snd_pcm_hw_params_get_rate_numden( hwParams, &num, &den ); + *sampleRate = (double) num / den; + + return err; +} + +/* Utility functions for blocking/callback interfaces */ + +/* Atomic restart of stream (we don't want the intermediate state visible) */ +static PaError AlsaRestart( PaAlsaStream *stream ) +{ + PaError result = paNoError; + + PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) ); + PA_ENSURE( AlsaStop( stream, 0 ) ); + PA_ENSURE( AlsaStart( stream, 0 ) ); + + PA_DEBUG(( "%s: Restarted audio\n", __FUNCTION__ )); + +error: + PA_ENSURE( PaUnixMutex_Unlock( &stream->stateMtx ) ); + + return result; +} + +/** Recover from xrun state. + * + */ +static PaError PaAlsaStream_HandleXrun( PaAlsaStream *self ) +{ + PaError result = paNoError; + snd_pcm_status_t *st; + PaTime now = PaUtil_GetTime(); + snd_timestamp_t t; + int restartAlsa = 0; /* do not restart Alsa by default */ + + alsa_snd_pcm_status_alloca( &st ); + + if( self->playback.pcm ) + { + alsa_snd_pcm_status( self->playback.pcm, st ); + if( alsa_snd_pcm_status_get_state( st ) == SND_PCM_STATE_XRUN ) + { + alsa_snd_pcm_status_get_trigger_tstamp( st, &t ); + self->underrun = now * 1000 - ((PaTime) t.tv_sec * 1000 + (PaTime) t.tv_usec / 1000); + + if (!self->playback.canMmap) + { + if (alsa_snd_pcm_recover( self->playback.pcm, -EPIPE, 0 ) < 0) + { + PA_DEBUG(( "%s: [playback] non-MMAP-PCM failed recovering from XRUN, will restart Alsa\n", __FUNCTION__ )); + ++ restartAlsa; /* did not manage to recover */ + } + } + else + ++ restartAlsa; /* always restart MMAPed device */ + } + } + if( self->capture.pcm ) + { + alsa_snd_pcm_status( self->capture.pcm, st ); + if( alsa_snd_pcm_status_get_state( st ) == SND_PCM_STATE_XRUN ) + { + alsa_snd_pcm_status_get_trigger_tstamp( st, &t ); + self->overrun = now * 1000 - ((PaTime) t.tv_sec * 1000 + (PaTime) t.tv_usec / 1000); + + if (!self->capture.canMmap) + { + if (alsa_snd_pcm_recover( self->capture.pcm, -EPIPE, 0 ) < 0) + { + PA_DEBUG(( "%s: [capture] non-MMAP-PCM failed recovering from XRUN, will restart Alsa\n", __FUNCTION__ )); + ++ restartAlsa; /* did not manage to recover */ + } + } + else + ++ restartAlsa; /* always restart MMAPed device */ + } + } + + if( restartAlsa ) + { + PA_DEBUG(( "%s: restarting Alsa to recover from XRUN\n", __FUNCTION__ )); + PA_ENSURE( AlsaRestart( self ) ); + } + +end: + return result; +error: + goto end; +} + +/** Decide if we should continue polling for specified direction, eventually adjust the poll timeout. + * + */ +static PaError ContinuePoll( const PaAlsaStream *stream, StreamDirection streamDir, int *pollTimeout, int *continuePoll ) +{ + PaError result = paNoError; + snd_pcm_sframes_t delay, margin; + int err; + const PaAlsaStreamComponent *component = NULL, *otherComponent = NULL; + + *continuePoll = 1; + + if( StreamDirection_In == streamDir ) + { + component = &stream->capture; + otherComponent = &stream->playback; + } + else + { + component = &stream->playback; + otherComponent = &stream->capture; + } + + /* ALSA docs say that negative delay should indicate xrun, but in my experience alsa_snd_pcm_delay returns -EPIPE */ + if( (err = alsa_snd_pcm_delay( otherComponent->pcm, &delay )) < 0 ) + { + if( err == -EPIPE ) + { + /* Xrun */ + *continuePoll = 0; + goto error; + } + + ENSURE_( err, paUnanticipatedHostError ); + } + + if( StreamDirection_Out == streamDir ) + { + /* Number of eligible frames before capture overrun */ + delay = otherComponent->bufferSize - delay; + } + margin = delay - otherComponent->framesPerBuffer / 2; + + if( margin < 0 ) + { + PA_DEBUG(( "%s: Stopping poll for %s\n", __FUNCTION__, StreamDirection_In == streamDir ? "capture" : "playback" )); + *continuePoll = 0; + } + else if( margin < otherComponent->framesPerBuffer ) + { + *pollTimeout = CalculatePollTimeout( stream, margin ); + PA_DEBUG(( "%s: Trying to poll again for %s frames, pollTimeout: %d\n", + __FUNCTION__, StreamDirection_In == streamDir ? "capture" : "playback", *pollTimeout )); + } + +error: + return result; +} + +/* Callback interface */ + +static void OnExit( void *data ) +{ + PaAlsaStream *stream = (PaAlsaStream *) data; + + assert( data ); + + PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); + + stream->callback_finished = 1; /* Let the outside world know stream was stopped in callback */ + PA_DEBUG(( "%s: Stopping ALSA handles\n", __FUNCTION__ )); + AlsaStop( stream, stream->callbackAbort ); + + PA_DEBUG(( "%s: Stoppage\n", __FUNCTION__ )); + + /* Eventually notify user all buffers have played */ + if( stream->streamRepresentation.streamFinishedCallback ) + { + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + stream->isActive = 0; +} + +static void CalculateTimeInfo( PaAlsaStream *stream, PaStreamCallbackTimeInfo *timeInfo ) +{ + snd_pcm_status_t *capture_status, *playback_status; + snd_timestamp_t capture_timestamp, playback_timestamp; + PaTime capture_time = 0., playback_time = 0.; + + alsa_snd_pcm_status_alloca( &capture_status ); + alsa_snd_pcm_status_alloca( &playback_status ); + + if( stream->capture.pcm ) + { + snd_pcm_sframes_t capture_delay; + + alsa_snd_pcm_status( stream->capture.pcm, capture_status ); + alsa_snd_pcm_status_get_tstamp( capture_status, &capture_timestamp ); + + capture_time = capture_timestamp.tv_sec + + ((PaTime)capture_timestamp.tv_usec / 1000000.0); + timeInfo->currentTime = capture_time; + + capture_delay = alsa_snd_pcm_status_get_delay( capture_status ); + timeInfo->inputBufferAdcTime = timeInfo->currentTime - + (PaTime)capture_delay / stream->streamRepresentation.streamInfo.sampleRate; + } + if( stream->playback.pcm ) + { + snd_pcm_sframes_t playback_delay; + + alsa_snd_pcm_status( stream->playback.pcm, playback_status ); + alsa_snd_pcm_status_get_tstamp( playback_status, &playback_timestamp ); + + playback_time = playback_timestamp.tv_sec + + ((PaTime)playback_timestamp.tv_usec / 1000000.0); + + if( stream->capture.pcm ) /* Full duplex */ + { + /* Hmm, we have both a playback and a capture timestamp. + * Hopefully they are the same... */ + if( fabs( capture_time - playback_time ) > 0.01 ) + PA_DEBUG(("Capture time and playback time differ by %f\n", fabs(capture_time-playback_time))); + } + else + timeInfo->currentTime = playback_time; + + playback_delay = alsa_snd_pcm_status_get_delay( playback_status ); + timeInfo->outputBufferDacTime = timeInfo->currentTime + + (PaTime)playback_delay / stream->streamRepresentation.streamInfo.sampleRate; + } +} + +/** Called after buffer processing is finished. + * + * A number of mmapped frames is committed, it is possible that an xrun has occurred in the meantime. + * + * @param numFrames The number of frames that has been processed + * @param xrun Return whether an xrun has occurred + */ +static PaError PaAlsaStreamComponent_EndProcessing( PaAlsaStreamComponent *self, unsigned long numFrames, int *xrun ) +{ + PaError result = paNoError; + int res = 0; + + /* @concern FullDuplex It is possible that only one direction is marked ready after polling, and processed + * afterwards + */ + if( !self->ready ) + goto end; + + if( !self->canMmap && StreamDirection_Out == self->streamDir ) + { + /* Play sound */ + if( self->hostInterleaved ) + res = alsa_snd_pcm_writei( self->pcm, self->nonMmapBuffer, numFrames ); + else + { + void *bufs[self->numHostChannels]; + int bufsize = alsa_snd_pcm_format_size( self->nativeFormat, self->framesPerBuffer + 1 ); + unsigned char *buffer = self->nonMmapBuffer; + int i; + for( i = 0; i < self->numHostChannels; ++i ) + { + bufs[i] = buffer; + buffer += bufsize; + } + res = alsa_snd_pcm_writen( self->pcm, bufs, numFrames ); + } + } + + if( self->canMmap ) + res = alsa_snd_pcm_mmap_commit( self->pcm, self->offset, numFrames ); + else + { + /* using realloc for optimisation + free( self->nonMmapBuffer ); + self->nonMmapBuffer = NULL; + */ + } + + if( res == -EPIPE || res == -ESTRPIPE ) + { + *xrun = 1; + } + else + { + ENSURE_( res, paUnanticipatedHostError ); + } + +end: +error: + return result; +} + +/* Extract buffer from channel area */ +static unsigned char *ExtractAddress( const snd_pcm_channel_area_t *area, snd_pcm_uframes_t offset ) +{ + return (unsigned char *) area->addr + (area->first + offset * area->step) / 8; +} + +/** Do necessary adaption between user and host channels. + * + @concern ChannelAdaption Adapting between user and host channels can involve silencing unused channels and + duplicating mono information if host outputs come in pairs. + */ +static PaError PaAlsaStreamComponent_DoChannelAdaption( PaAlsaStreamComponent *self, PaUtilBufferProcessor *bp, int numFrames ) +{ + PaError result = paNoError; + unsigned char *p; + int i; + int unusedChans = self->numHostChannels - self->numUserChannels; + unsigned char *src, *dst; + int convertMono = (self->numHostChannels % 2) == 0 && (self->numUserChannels % 2) != 0; + + assert( StreamDirection_Out == self->streamDir ); + + if( self->hostInterleaved ) + { + int swidth = alsa_snd_pcm_format_size( self->nativeFormat, 1 ); + unsigned char *buffer = self->canMmap ? ExtractAddress( self->channelAreas, self->offset ) : self->nonMmapBuffer; + + /* Start after the last user channel */ + p = buffer + self->numUserChannels * swidth; + + if( convertMono ) + { + /* Convert the last user channel into stereo pair */ + src = buffer + (self->numUserChannels - 1) * swidth; + for( i = 0; i < numFrames; ++i ) + { + dst = src + swidth; + memcpy( dst, src, swidth ); + src += self->numHostChannels * swidth; + } + + /* Don't touch the channel we just wrote to */ + p += swidth; + --unusedChans; + } + + if( unusedChans > 0 ) + { + /* Silence unused output channels */ + for( i = 0; i < numFrames; ++i ) + { + memset( p, 0, swidth * unusedChans ); + p += self->numHostChannels * swidth; + } + } + } + else + { + /* We extract the last user channel */ + if( convertMono ) + { + ENSURE_( alsa_snd_pcm_area_copy( self->channelAreas + self->numUserChannels, self->offset, self->channelAreas + + (self->numUserChannels - 1), self->offset, numFrames, self->nativeFormat ), paUnanticipatedHostError ); + --unusedChans; + } + if( unusedChans > 0 ) + { + alsa_snd_pcm_areas_silence( self->channelAreas + (self->numHostChannels - unusedChans), self->offset, unusedChans, numFrames, + self->nativeFormat ); + } + } + +error: + return result; +} + +static PaError PaAlsaStream_EndProcessing( PaAlsaStream *self, unsigned long numFrames, int *xrunOccurred ) +{ + PaError result = paNoError; + int xrun = 0; + + if( self->capture.pcm ) + { + PA_ENSURE( PaAlsaStreamComponent_EndProcessing( &self->capture, numFrames, &xrun ) ); + } + if( self->playback.pcm ) + { + if( self->playback.numHostChannels > self->playback.numUserChannels ) + { + PA_ENSURE( PaAlsaStreamComponent_DoChannelAdaption( &self->playback, &self->bufferProcessor, numFrames ) ); + } + PA_ENSURE( PaAlsaStreamComponent_EndProcessing( &self->playback, numFrames, &xrun ) ); + } + +error: + *xrunOccurred = xrun; + return result; +} + +/** Update the number of available frames. + * + */ +static PaError PaAlsaStreamComponent_GetAvailableFrames( PaAlsaStreamComponent *self, unsigned long *numFrames, int *xrunOccurred ) +{ + PaError result = paNoError; + snd_pcm_sframes_t framesAvail = alsa_snd_pcm_avail_update( self->pcm ); + *xrunOccurred = 0; + + if( -EPIPE == framesAvail ) + { + *xrunOccurred = 1; + framesAvail = 0; + } + else + { + ENSURE_( framesAvail, paUnanticipatedHostError ); + } + + *numFrames = framesAvail; + +error: + return result; +} + +/** Fill in pollfd objects. + */ +static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, struct pollfd* pfds ) +{ + PaError result = paNoError; + int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); + (void)ret; /* Prevent unused variable warning if asserts are turned off */ + assert( ret == self->nfds ); + + self->ready = 0; + + return result; +} + +/** Examine results from poll(). + * + * @param pfds pollfds to inspect + * @param shouldPoll Should we continue to poll + * @param xrun Has an xrun occurred + */ +static PaError PaAlsaStreamComponent_EndPolling( PaAlsaStreamComponent* self, struct pollfd* pfds, int* shouldPoll, int* xrun ) +{ + PaError result = paNoError; + unsigned short revents; + + ENSURE_( alsa_snd_pcm_poll_descriptors_revents( self->pcm, pfds, self->nfds, &revents ), paUnanticipatedHostError ); + if( revents != 0 ) + { + if( revents & POLLERR ) + { + *xrun = 1; + } + else + if( revents & POLLHUP ) + { + *xrun = 1; + PA_DEBUG(( "%s: revents has POLLHUP, processing as XRUN\n", __FUNCTION__ )); + } + else + self->ready = 1; + + *shouldPoll = 0; + } + +error: + return result; +} + +/** Return the number of available frames for this stream. + * + * @concern FullDuplex The minimum available for the two directions is calculated, it might be desirable to ignore + * one direction however (not marked ready from poll), so this is controlled by queryCapture and queryPlayback. + * + * @param queryCapture Check available for capture + * @param queryPlayback Check available for playback + * @param available The returned number of frames + * @param xrunOccurred Return whether an xrun has occurred + */ +static PaError PaAlsaStream_GetAvailableFrames( PaAlsaStream *self, int queryCapture, int queryPlayback, unsigned long + *available, int *xrunOccurred ) +{ + PaError result = paNoError; + unsigned long captureFrames, playbackFrames; + *xrunOccurred = 0; + + assert( queryCapture || queryPlayback ); + + if( queryCapture ) + { + assert( self->capture.pcm ); + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( &self->capture, &captureFrames, xrunOccurred ) ); + if( *xrunOccurred ) + { + goto end; + } + } + if( queryPlayback ) + { + assert( self->playback.pcm ); + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( &self->playback, &playbackFrames, xrunOccurred ) ); + if( *xrunOccurred ) + { + goto end; + } + } + + if( queryCapture && queryPlayback ) + { + *available = PA_MIN( captureFrames, playbackFrames ); + /*PA_DEBUG(("capture: %lu, playback: %lu, combined: %lu\n", captureFrames, playbackFrames, *available));*/ + } + else if( queryCapture ) + { + *available = captureFrames; + } + else + { + *available = playbackFrames; + } + +end: +error: + return result; +} + +/** Wait for and report available buffer space from ALSA. + * + * Unless ALSA reports a minimum of frames available for I/O, we poll the ALSA filedescriptors for more. + * Both of these operations can uncover xrun conditions. + * + * @concern Xruns Both polling and querying available frames can report an xrun condition. + * + * @param framesAvail Return the number of available frames + * @param xrunOccurred Return whether an xrun has occurred + */ +static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *framesAvail, int *xrunOccurred ) +{ + PaError result = paNoError; + int pollPlayback = self->playback.pcm != NULL, pollCapture = self->capture.pcm != NULL; + int pollTimeout = self->pollTimeout; + int xrun = 0, timeouts = 0; + int pollResults; + + assert( self ); + assert( framesAvail ); + + if( !self->callbackMode ) + { + /* In blocking mode we will only wait if necessary */ + PA_ENSURE( PaAlsaStream_GetAvailableFrames( self, self->capture.pcm != NULL, self->playback.pcm != NULL, + framesAvail, &xrun ) ); + if( xrun ) + { + goto end; + } + + if( *framesAvail > 0 ) + { + /* Mark pcms ready from poll */ + if( self->capture.pcm ) + self->capture.ready = 1; + if( self->playback.pcm ) + self->playback.ready = 1; + + goto end; + } + } + + while( pollPlayback || pollCapture ) + { + int totalFds = 0; + struct pollfd *capturePfds = NULL, *playbackPfds = NULL; + +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#endif + if( pollCapture ) + { + capturePfds = self->pfds; + PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ) ); + totalFds += self->capture.nfds; + } + if( pollPlayback ) + { + playbackPfds = self->pfds + (self->capture.pcm ? self->capture.nfds : 0); + PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ) ); + totalFds += self->playback.nfds; + } + + pollResults = poll( self->pfds, totalFds, pollTimeout ); + + if( pollResults < 0 ) + { + /* XXX: Depend on preprocessor condition? */ + if( errno == EINTR ) + { + /* gdb */ + Pa_Sleep( 1 ); /* avoid hot loop */ + continue; + } + + /* TODO: Add macro for checking system calls */ + PA_ENSURE( paInternalError ); + } + else + if (pollResults == 0) + { + + /* Suspended, paused or failed device can provide 0 poll results. To avoid deadloop in such situation + * we simply run counter 'timeouts' which detects 0 poll result and accumulates. As soon as 2048 timouts (around 2 seconds) + * are achieved we simply fail function with paTimedOut to notify waiting methods that device is not capable + * of providing audio data anymore and needs some corresponding recovery action. + * Note that 'timeouts' is reset to 0 if poll() managed to return non 0 results. + */ + + /*PA_DEBUG(( "%s: poll == 0 results, timed out, %d times left\n", __FUNCTION__, 2048 - timeouts ));*/ + + ++ timeouts; + if (timeouts > 1) /* sometimes device times out, but normally once, so we do not sleep any time */ + { + Pa_Sleep( 1 ); /* avoid hot loop */ + } + /* not else ! */ + if (timeouts >= 2048) /* audio device not working, shall return error to notify waiters */ + { + *framesAvail = 0; /* no frames available for processing */ + xrun = 1; /* try recovering device */ + + PA_DEBUG(( "%s: poll timed out\n", __FUNCTION__, timeouts )); + goto end;/*PA_ENSURE( paTimedOut );*/ + } + } + else + if (pollResults > 0) + { + /* reset timouts counter */ + timeouts = 0; + + /* check the return status of our pfds */ + if( pollCapture ) + { + PA_ENSURE( PaAlsaStreamComponent_EndPolling( &self->capture, capturePfds, &pollCapture, &xrun ) ); + } + if( pollPlayback ) + { + PA_ENSURE( PaAlsaStreamComponent_EndPolling( &self->playback, playbackPfds, &pollPlayback, &xrun ) ); + } + if( xrun ) + { + break; + } + } + + /* @concern FullDuplex If only one of two pcms is ready we may want to compromise between the two. + * If there is less than half a period's worth of samples left of frames in the other pcm's buffer we will + * stop polling. + */ + if( self->capture.pcm && self->playback.pcm ) + { + if( pollCapture && !pollPlayback ) + { + PA_ENSURE( ContinuePoll( self, StreamDirection_In, &pollTimeout, &pollCapture ) ); + } + else if( pollPlayback && !pollCapture ) + { + PA_ENSURE( ContinuePoll( self, StreamDirection_Out, &pollTimeout, &pollPlayback ) ); + } + } + } + + if( !xrun ) + { + /* Get the number of available frames for the pcms that are marked ready. + * @concern FullDuplex If only one direction is marked ready (from poll), the number of frames available for + * the other direction is returned. Output is normally preferred over capture however, so capture frames may be + * discarded to avoid overrun unless paNeverDropInput is specified. + */ + int captureReady = self->capture.pcm ? self->capture.ready : 0, + playbackReady = self->playback.pcm ? self->playback.ready : 0; + PA_ENSURE( PaAlsaStream_GetAvailableFrames( self, captureReady, playbackReady, framesAvail, &xrun ) ); + + if( self->capture.pcm && self->playback.pcm ) + { + if( !self->playback.ready && !self->neverDropInput ) + { + /* Drop input, a period's worth */ + assert( self->capture.ready ); + PaAlsaStreamComponent_EndProcessing( &self->capture, PA_MIN( self->capture.framesPerBuffer, + *framesAvail ), &xrun ); + *framesAvail = 0; + self->capture.ready = 0; + } + } + else if( self->capture.pcm ) + assert( self->capture.ready ); + else + assert( self->playback.ready ); + } + +end: +error: + if( xrun ) + { + /* Recover from the xrun state */ + PA_ENSURE( PaAlsaStream_HandleXrun( self ) ); + *framesAvail = 0; + } + else + { + if( 0 != *framesAvail ) + { + /* If we're reporting frames eligible for processing, one of the handles better be ready */ + PA_UNLESS( self->capture.ready || self->playback.ready, paInternalError ); + } + } + *xrunOccurred = xrun; + + return result; +} + +/** Register per-channel ALSA buffer information with buffer processor. + * + * Mmapped buffer space is acquired from ALSA, and registered with the buffer processor. Differences between the + * number of host and user channels is taken into account. + * + * @param numFrames On entrance the number of requested frames, on exit the number of contiguously accessible frames. + */ +static PaError PaAlsaStreamComponent_RegisterChannels( PaAlsaStreamComponent* self, PaUtilBufferProcessor* bp, + unsigned long* numFrames, int* xrun ) +{ + PaError result = paNoError; + const snd_pcm_channel_area_t *areas, *area; + void (*setChannel)(PaUtilBufferProcessor *, unsigned int, void *, unsigned int) = + StreamDirection_In == self->streamDir ? PaUtil_SetInputChannel : PaUtil_SetOutputChannel; + unsigned char *buffer, *p; + int i; + unsigned long framesAvail; + + /* This _must_ be called before mmap_begin */ + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( self, &framesAvail, xrun ) ); + if( *xrun ) + { + *numFrames = 0; + goto end; + } + + if( self->canMmap ) + { + ENSURE_( alsa_snd_pcm_mmap_begin( self->pcm, &areas, &self->offset, numFrames ), paUnanticipatedHostError ); + /* @concern ChannelAdaption Buffer address is recorded so we can do some channel adaption later */ + self->channelAreas = (snd_pcm_channel_area_t *)areas; + } + else + { + unsigned int bufferSize = self->numHostChannels * alsa_snd_pcm_format_size( self->nativeFormat, *numFrames ); + if (bufferSize > self->nonMmapBufferSize) + { + self->nonMmapBuffer = realloc(self->nonMmapBuffer, (self->nonMmapBufferSize = bufferSize)); + if (!self->nonMmapBuffer) + { + result = paInsufficientMemory; + goto error; + } + } + } + + if( self->hostInterleaved ) + { + int swidth = alsa_snd_pcm_format_size( self->nativeFormat, 1 ); + + p = buffer = self->canMmap ? ExtractAddress( areas, self->offset ) : self->nonMmapBuffer; + for( i = 0; i < self->numUserChannels; ++i ) + { + /* We're setting the channels up to userChannels, but the stride will be hostChannels samples */ + setChannel( bp, i, p, self->numHostChannels ); + p += swidth; + } + } + else + { + if( self->canMmap ) + { + for( i = 0; i < self->numUserChannels; ++i ) + { + area = areas + i; + buffer = ExtractAddress( area, self->offset ); + setChannel( bp, i, buffer, 1 ); + } + } + else + { + unsigned int buf_per_ch_size = self->nonMmapBufferSize / self->numHostChannels; + buffer = self->nonMmapBuffer; + for( i = 0; i < self->numUserChannels; ++i ) + { + setChannel( bp, i, buffer, 1 ); + buffer += buf_per_ch_size; + } + } + } + + if( !self->canMmap && StreamDirection_In == self->streamDir ) + { + /* Read sound */ + int res; + if( self->hostInterleaved ) + res = alsa_snd_pcm_readi( self->pcm, self->nonMmapBuffer, *numFrames ); + else + { + void *bufs[self->numHostChannels]; + unsigned int buf_per_ch_size = self->nonMmapBufferSize / self->numHostChannels; + unsigned char *buffer = self->nonMmapBuffer; + int i; + for( i = 0; i < self->numHostChannels; ++i ) + { + bufs[i] = buffer; + buffer += buf_per_ch_size; + } + res = alsa_snd_pcm_readn( self->pcm, bufs, *numFrames ); + } + if( res == -EPIPE || res == -ESTRPIPE ) + { + *xrun = 1; + *numFrames = 0; + } + } + +end: +error: + return result; +} + +/** Initiate buffer processing. + * + * ALSA buffers are registered with the PA buffer processor and the buffer size (in frames) set. + * + * @concern FullDuplex If both directions are being processed, the minimum amount of frames for the two directions is + * calculated. + * + * @param numFrames On entrance the number of available frames, on exit the number of received frames + * @param xrunOccurred Return whether an xrun has occurred + */ +static PaError PaAlsaStream_SetUpBuffers( PaAlsaStream* self, unsigned long* numFrames, int* xrunOccurred ) +{ + PaError result = paNoError; + unsigned long captureFrames = ULONG_MAX, playbackFrames = ULONG_MAX, commonFrames = 0; + int xrun = 0; + + if( *xrunOccurred ) + { + *numFrames = 0; + return result; + } + /* If we got here at least one of the pcm's should be marked ready */ + PA_UNLESS( self->capture.ready || self->playback.ready, paInternalError ); + + /* Extract per-channel ALSA buffer pointers and register them with the buffer processor. + * It is possible that a direction is not marked ready however, because it is out of sync with the other. + */ + if( self->capture.pcm && self->capture.ready ) + { + captureFrames = *numFrames; + PA_ENSURE( PaAlsaStreamComponent_RegisterChannels( &self->capture, &self->bufferProcessor, &captureFrames, + &xrun ) ); + } + if( self->playback.pcm && self->playback.ready ) + { + playbackFrames = *numFrames; + PA_ENSURE( PaAlsaStreamComponent_RegisterChannels( &self->playback, &self->bufferProcessor, &playbackFrames, + &xrun ) ); + } + if( xrun ) + { + /* Nothing more to do */ + assert( 0 == commonFrames ); + goto end; + } + + commonFrames = PA_MIN( captureFrames, playbackFrames ); + /* assert( commonFrames <= *numFrames ); */ + if( commonFrames > *numFrames ) + { + /* Hmmm ... how come there are more frames available than we requested!? Blah. */ + PA_DEBUG(( "%s: Common available frames are reported to be more than number requested: %lu, %lu, callbackMode: %d\n", __FUNCTION__, + commonFrames, *numFrames, self->callbackMode )); + if( self->capture.pcm ) + { + PA_DEBUG(( "%s: captureFrames: %lu, capture.ready: %d\n", __FUNCTION__, captureFrames, self->capture.ready )); + } + if( self->playback.pcm ) + { + PA_DEBUG(( "%s: playbackFrames: %lu, playback.ready: %d\n", __FUNCTION__, playbackFrames, self->playback.ready )); + } + + commonFrames = 0; + goto end; + } + + /* Inform PortAudio of the number of frames we got. + * @concern FullDuplex We might be experiencing underflow in either end; if its an input underflow, we go on + * with output. If its output underflow however, depending on the paNeverDropInput flag, we may want to simply + * discard the excess input or call the callback with paOutputOverflow flagged. + */ + if( self->capture.pcm ) + { + if( self->capture.ready ) + { + PaUtil_SetInputFrameCount( &self->bufferProcessor, commonFrames ); + } + else + { + /* We have input underflow */ + PaUtil_SetNoInput( &self->bufferProcessor ); + } + } + if( self->playback.pcm ) + { + if( self->playback.ready ) + { + PaUtil_SetOutputFrameCount( &self->bufferProcessor, commonFrames ); + } + else + { + /* We have output underflow, but keeping input data (paNeverDropInput) */ + assert( self->neverDropInput ); + assert( self->capture.pcm != NULL ); + PA_DEBUG(( "%s: Setting output buffers to NULL\n", __FUNCTION__ )); + PaUtil_SetNoOutput( &self->bufferProcessor ); + } + } + +end: + *numFrames = commonFrames; +error: + if( xrun ) + { + PA_ENSURE( PaAlsaStream_HandleXrun( self ) ); + *numFrames = 0; + } + *xrunOccurred = xrun; + + return result; +} + +/** Callback thread's function. + * + * Roughly, the workflow can be described in the following way: The number of available frames that can be processed + * directly is obtained from ALSA, we then request as much directly accessible memory as possible within this amount + * from ALSA. The buffer memory is registered with the PA buffer processor and processing is carried out with + * PaUtil_EndBufferProcessing. Finally, the number of processed frames is reported to ALSA. The processing can + * happen in several iterations untill we have consumed the known number of available frames (or an xrun is detected). + */ +static void *CallbackThreadFunc( void *userData ) +{ + PaError result = paNoError; + PaAlsaStream *stream = (PaAlsaStream*) userData; + PaStreamCallbackTimeInfo timeInfo = {0, 0, 0}; + snd_pcm_sframes_t startThreshold = 0; + int callbackResult = paContinue; + PaStreamCallbackFlags cbFlags = 0; /* We might want to keep state across iterations */ + int streamStarted = 0; + + assert( stream ); + + /* Execute OnExit when exiting */ + pthread_cleanup_push( &OnExit, stream ); + + /* Not implemented */ + assert( !stream->primeBuffers ); + + /* @concern StreamStart If the output is being primed the output pcm needs to be prepared, otherwise the + * stream is started immediately. The latter involves signaling the waiting main thread. + */ + if( stream->primeBuffers ) + { + snd_pcm_sframes_t avail; + + if( stream->playback.pcm ) + ENSURE_( alsa_snd_pcm_prepare( stream->playback.pcm ), paUnanticipatedHostError ); + if( stream->capture.pcm && !stream->pcmsSynced ) + ENSURE_( alsa_snd_pcm_prepare( stream->capture.pcm ), paUnanticipatedHostError ); + + /* We can't be certain that the whole ring buffer is available for priming, but there should be + * at least one period */ + avail = alsa_snd_pcm_avail_update( stream->playback.pcm ); + startThreshold = avail - (avail % stream->playback.framesPerBuffer); + assert( startThreshold >= stream->playback.framesPerBuffer ); + } + else + { + PA_ENSURE( PaUnixThread_PrepareNotify( &stream->thread ) ); + /* Buffer will be zeroed */ + PA_ENSURE( AlsaStart( stream, 0 ) ); + PA_ENSURE( PaUnixThread_NotifyParent( &stream->thread ) ); + + streamStarted = 1; + } + + while( 1 ) + { + unsigned long framesAvail, framesGot; + int xrun = 0; + +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#endif + + /* @concern StreamStop if the main thread has requested a stop and the stream has not been effectively + * stopped we signal this condition by modifying callbackResult (we'll want to flush buffered output). + */ + if( PaUnixThread_StopRequested( &stream->thread ) && paContinue == callbackResult ) + { + PA_DEBUG(( "Setting callbackResult to paComplete\n" )); + callbackResult = paComplete; + } + + if( paContinue != callbackResult ) + { + stream->callbackAbort = (paAbort == callbackResult); + if( stream->callbackAbort || + /** @concern BlockAdaption: Go on if adaption buffers are empty */ + PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) + { + goto end; + } + + PA_DEBUG(( "%s: Flushing buffer processor\n", __FUNCTION__ )); + /* There is still buffered output that needs to be processed */ + } + + /* Wait for data to become available, this comes down to polling the ALSA file descriptors untill we have + * a number of available frames. + */ + PA_ENSURE( PaAlsaStream_WaitForFrames( stream, &framesAvail, &xrun ) ); + if( xrun ) + { + assert( 0 == framesAvail ); + continue; + + /* XXX: Report xruns to the user? A situation is conceivable where the callback is never invoked due + * to constant xruns, it might be desirable to notify the user of this. + */ + } + + /* Consume buffer space. Once we have a number of frames available for consumption we must retrieve the + * mmapped buffers from ALSA, this is contiguously accessible memory however, so we may receive smaller + * portions at a time than is available as a whole. Therefore we should be prepared to process several + * chunks successively. The buffers are passed to the PA buffer processor. + */ + while( framesAvail > 0 ) + { + xrun = 0; + +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#endif + + /** @concern Xruns Under/overflows are to be reported to the callback */ + if( stream->underrun > 0.0 ) + { + cbFlags |= paOutputUnderflow; + stream->underrun = 0.0; + } + if( stream->overrun > 0.0 ) + { + cbFlags |= paInputOverflow; + stream->overrun = 0.0; + } + if( stream->capture.pcm && stream->playback.pcm ) + { + /** @concern FullDuplex It's possible that only one direction is being processed to avoid an + * under- or overflow, this should be reported correspondingly */ + if( !stream->capture.ready ) + { + cbFlags |= paInputUnderflow; + PA_DEBUG(( "%s: Input underflow\n", __FUNCTION__ )); + } + else if( !stream->playback.ready ) + { + cbFlags |= paOutputOverflow; + PA_DEBUG(( "%s: Output overflow\n", __FUNCTION__ )); + } + } + +#if 0 + CallbackUpdate( &stream->threading ); +#endif + CalculateTimeInfo( stream, &timeInfo ); + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, cbFlags ); + cbFlags = 0; + + /* CPU load measurement should include processing activivity external to the stream callback */ + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + framesGot = framesAvail; + if( paUtilFixedHostBufferSize == stream->bufferProcessor.hostBufferSizeMode ) + { + /* We've committed to a fixed host buffer size, stick to that */ + framesGot = framesGot >= stream->maxFramesPerHostBuffer ? stream->maxFramesPerHostBuffer : 0; + } + else + { + /* We've committed to an upper bound on the size of host buffers */ + assert( paUtilBoundedHostBufferSize == stream->bufferProcessor.hostBufferSizeMode ); + framesGot = PA_MIN( framesGot, stream->maxFramesPerHostBuffer ); + } + PA_ENSURE( PaAlsaStream_SetUpBuffers( stream, &framesGot, &xrun ) ); + /* Check the host buffer size against the buffer processor configuration */ + framesAvail -= framesGot; + + if( framesGot > 0 ) + { + assert( !xrun ); + PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + PA_ENSURE( PaAlsaStream_EndProcessing( stream, framesGot, &xrun ) ); + } + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesGot ); + + if( 0 == framesGot ) + { + /* Go back to polling for more frames */ + break; + + } + + if( paContinue != callbackResult ) + break; + } + } + +end: + ; /* Hack to fix "label at end of compound statement" error caused by pthread_cleanup_pop(1) macro. */ + /* Match pthread_cleanup_push */ + pthread_cleanup_pop( 1 ); + + PA_DEBUG(( "%s: Thread %d exiting\n ", __FUNCTION__, pthread_self() )); + PaUnixThreading_EXIT( result ); + +error: + PA_DEBUG(( "%s: Thread %d is canceled due to error %d\n ", __FUNCTION__, pthread_self(), result )); + goto end; +} + +/* Blocking interface */ + +static PaError ReadStream( PaStream* s, void *buffer, unsigned long frames ) +{ + PaError result = paNoError; + PaAlsaStream *stream = (PaAlsaStream*)s; + unsigned long framesGot, framesAvail; + void *userBuffer; + snd_pcm_t *save = stream->playback.pcm; + + assert( stream ); + + PA_UNLESS( stream->capture.pcm, paCanNotReadFromAnOutputOnlyStream ); + + /* Disregard playback */ + stream->playback.pcm = NULL; + + if( stream->overrun > 0. ) + { + result = paInputOverflowed; + stream->overrun = 0.0; + } + + if( stream->capture.userInterleaved ) + { + userBuffer = buffer; + } + else + { + /* Copy channels into local array */ + userBuffer = stream->capture.userBuffers; + memcpy( userBuffer, buffer, sizeof (void *) * stream->capture.numUserChannels ); + } + + /* Start stream if in prepared state */ + if( alsa_snd_pcm_state( stream->capture.pcm ) == SND_PCM_STATE_PREPARED ) + { + ENSURE_( alsa_snd_pcm_start( stream->capture.pcm ), paUnanticipatedHostError ); + } + + while( frames > 0 ) + { + int xrun = 0; + PA_ENSURE( PaAlsaStream_WaitForFrames( stream, &framesAvail, &xrun ) ); + framesGot = PA_MIN( framesAvail, frames ); + + PA_ENSURE( PaAlsaStream_SetUpBuffers( stream, &framesGot, &xrun ) ); + if( framesGot > 0 ) + { + framesGot = PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, framesGot ); + PA_ENSURE( PaAlsaStream_EndProcessing( stream, framesGot, &xrun ) ); + frames -= framesGot; + } + } + +end: + stream->playback.pcm = save; + return result; +error: + goto end; +} + +static PaError WriteStream( PaStream* s, const void *buffer, unsigned long frames ) +{ + PaError result = paNoError; + signed long err; + PaAlsaStream *stream = (PaAlsaStream*)s; + snd_pcm_uframes_t framesGot, framesAvail; + const void *userBuffer; + snd_pcm_t *save = stream->capture.pcm; + + assert( stream ); + + PA_UNLESS( stream->playback.pcm, paCanNotWriteToAnInputOnlyStream ); + + /* Disregard capture */ + stream->capture.pcm = NULL; + + if( stream->underrun > 0. ) + { + result = paOutputUnderflowed; + stream->underrun = 0.0; + } + + if( stream->playback.userInterleaved ) + userBuffer = buffer; + else /* Copy channels into local array */ + { + userBuffer = stream->playback.userBuffers; + memcpy( (void *)userBuffer, buffer, sizeof (void *) * stream->playback.numUserChannels ); + } + + while( frames > 0 ) + { + int xrun = 0; + snd_pcm_uframes_t hwAvail; + + PA_ENSURE( PaAlsaStream_WaitForFrames( stream, &framesAvail, &xrun ) ); + framesGot = PA_MIN( framesAvail, frames ); + + PA_ENSURE( PaAlsaStream_SetUpBuffers( stream, &framesGot, &xrun ) ); + if( framesGot > 0 ) + { + framesGot = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, framesGot ); + PA_ENSURE( PaAlsaStream_EndProcessing( stream, framesGot, &xrun ) ); + frames -= framesGot; + } + + /* Start stream after one period of samples worth */ + + /* Frames residing in buffer */ + PA_ENSURE( err = GetStreamWriteAvailable( stream ) ); + framesAvail = err; + hwAvail = stream->playback.bufferSize - framesAvail; + + if( alsa_snd_pcm_state( stream->playback.pcm ) == SND_PCM_STATE_PREPARED && + hwAvail >= stream->playback.framesPerBuffer ) + { + ENSURE_( alsa_snd_pcm_start( stream->playback.pcm ), paUnanticipatedHostError ); + } + } + +end: + stream->capture.pcm = save; + return result; +error: + goto end; +} + +/* Return frames available for reading. In the event of an overflow, the capture pcm will be restarted */ +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaError result = paNoError; + PaAlsaStream *stream = (PaAlsaStream*)s; + unsigned long avail; + int xrun; + + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( &stream->capture, &avail, &xrun ) ); + if( xrun ) + { + PA_ENSURE( PaAlsaStream_HandleXrun( stream ) ); + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( &stream->capture, &avail, &xrun ) ); + if( xrun ) + PA_ENSURE( paInputOverflowed ); + } + + return (signed long)avail; + +error: + return result; +} + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaError result = paNoError; + PaAlsaStream *stream = (PaAlsaStream*)s; + unsigned long avail; + int xrun; + + PA_ENSURE( PaAlsaStreamComponent_GetAvailableFrames( &stream->playback, &avail, &xrun ) ); + if( xrun ) + { + snd_pcm_sframes_t savail; + + PA_ENSURE( PaAlsaStream_HandleXrun( stream ) ); + savail = alsa_snd_pcm_avail_update( stream->playback.pcm ); + + /* savail should not contain -EPIPE now, since PaAlsaStream_HandleXrun will only prepare the pcm */ + ENSURE_( savail, paUnanticipatedHostError ); + + avail = (unsigned long) savail; + } + + return (signed long)avail; + +error: + return result; +} + +/* Extensions */ + +void PaAlsa_InitializeStreamInfo( PaAlsaStreamInfo *info ) +{ + info->size = sizeof (PaAlsaStreamInfo); + info->hostApiType = paALSA; + info->version = 1; + info->deviceString = NULL; +} + +void PaAlsa_EnableRealtimeScheduling( PaStream *s, int enable ) +{ + PaAlsaStream *stream = (PaAlsaStream *) s; + stream->rtSched = enable; +} + +#if 0 +void PaAlsa_EnableWatchdog( PaStream *s, int enable ) +{ + PaAlsaStream *stream = (PaAlsaStream *) s; + stream->thread.useWatchdog = enable; +} +#endif + +static PaError GetAlsaStreamPointer( PaStream* s, PaAlsaStream** stream ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation* hostApi; + PaAlsaHostApiRepresentation* alsaHostApi; + + PA_ENSURE( PaUtil_ValidateStreamPointer( s ) ); + PA_ENSURE( PaUtil_GetHostApiRepresentation( &hostApi, paALSA ) ); + alsaHostApi = (PaAlsaHostApiRepresentation*)hostApi; + + PA_UNLESS( PA_STREAM_REP( s )->streamInterface == &alsaHostApi->callbackStreamInterface + || PA_STREAM_REP( s )->streamInterface == &alsaHostApi->blockingStreamInterface, + paIncompatibleStreamHostApi ); + + *stream = (PaAlsaStream*)s; +error: + return paNoError; +} + +PaError PaAlsa_GetStreamInputCard(PaStream* s, int* card) { + PaAlsaStream *stream; + PaError result = paNoError; + snd_pcm_info_t* pcmInfo; + + PA_ENSURE( GetAlsaStreamPointer( s, &stream ) ); + + /* XXX: More descriptive error? */ + PA_UNLESS( stream->capture.pcm, paDeviceUnavailable ); + + alsa_snd_pcm_info_alloca( &pcmInfo ); + PA_ENSURE( alsa_snd_pcm_info( stream->capture.pcm, pcmInfo ) ); + *card = alsa_snd_pcm_info_get_card( pcmInfo ); + +error: + return result; +} + +PaError PaAlsa_GetStreamOutputCard(PaStream* s, int* card) { + PaAlsaStream *stream; + PaError result = paNoError; + snd_pcm_info_t* pcmInfo; + + PA_ENSURE( GetAlsaStreamPointer( s, &stream ) ); + + /* XXX: More descriptive error? */ + PA_UNLESS( stream->playback.pcm, paDeviceUnavailable ); + + alsa_snd_pcm_info_alloca( &pcmInfo ); + PA_ENSURE( alsa_snd_pcm_info( stream->playback.pcm, pcmInfo ) ); + *card = alsa_snd_pcm_info_get_card( pcmInfo ); + +error: + return result; +} + +PaError PaAlsa_SetRetriesBusy( int retries ) +{ + busyRetries_ = retries; + return paNoError; +} diff --git a/Externals/portaudio/src/hostapi/asihpi/pa_linux_asihpi.c b/Externals/portaudio/src/hostapi/asihpi/pa_linux_asihpi.c new file mode 100644 index 0000000000..f5a5290284 --- /dev/null +++ b/Externals/portaudio/src/hostapi/asihpi/pa_linux_asihpi.c @@ -0,0 +1,2893 @@ +/* + * $Id:$ + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * AudioScience HPI implementation by Fred Gleason, Ludwig Schwardt and + * Eliot Blennerhassett + * + * Copyright (c) 2003 Fred Gleason + * Copyright (c) 2005,2006 Ludwig Schwardt + * Copyright (c) 2011 Eliot Blennerhassett + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/* + * Modification History + * 12/2003 - Initial version + * 09/2005 - v19 version [rewrite] + */ + +/** @file + @ingroup hostapi_src + @brief Host API implementation supporting AudioScience cards + via the Linux HPI interface. + +

Overview

+ + This is a PortAudio implementation for the AudioScience HPI Audio API + on the Linux platform. AudioScience makes a range of audio adapters customised + for the broadcasting industry, with support for both Windows and Linux. + More information on their products can be found on their website: + + http://www.audioscience.com + + Documentation for the HPI API can be found at: + + http://www.audioscience.com/internet/download/sdk/hpi_usermanual_html/html/index.html + + The Linux HPI driver itself (a kernel module + library) can be downloaded from: + + http://www.audioscience.com/internet/download/linux_drivers.htm + +

Implementation strategy

+ + *Note* Ideally, AudioScience cards should be handled by the PortAudio ALSA + implementation on Linux, as ALSA is the preferred Linux soundcard API. The existence + of this host API implementation might therefore seem a bit flawed. Unfortunately, at + the time of the creation of this implementation (June 2006), the PA ALSA implementation + could not make use of the existing AudioScience ALSA driver. PA ALSA uses the + "memory-mapped" (mmap) ALSA access mode to interact with the ALSA library, while the + AudioScience ALSA driver only supports the "read-write" access mode. The appropriate + solution to this problem is to add "read-write" support to PortAudio ALSA, thereby + extending the range of soundcards it supports (AudioScience cards are not the only + ones with this problem). Given the author's limited knowledge of ALSA and the + simplicity of the HPI API, the second-best solution was born... + + The following mapping between HPI and PA was followed: + HPI subsystem => PortAudio host API + HPI adapter => nothing specific + HPI stream => PortAudio device + + Each HPI stream is either input or output (not both), and can support + different channel counts, sampling rates and sample formats. It is therefore + a more natural fit to a PA device. A PA stream can therefore combine two + HPI streams (one input and one output) into a "full-duplex" stream. These + HPI streams can even be on different physical adapters. The two streams ought to be + sample-synchronised when they reside on the same adapter, as most AudioScience adapters + derive their ADC and DAC clocks from one master clock. When combining two adapters + into one full-duplex stream, however, the use of a word clock connection between the + adapters is strongly recommended. + + The HPI interface is inherently blocking, making use of read and write calls to + transfer data between user buffers and driver buffers. The callback interface therefore + requires a helper thread ("callback engine") which periodically transfers data (one thread + per PA stream, in fact). The current implementation explicitly sleeps via Pa_Sleep() until + enough samples can be transferred (select() or poll() would be better, but currently seems + impossible...). The thread implementation makes use of the Unix thread helper functions + and some pthread calls here and there. If a unified PA thread exists, this host API + implementation might also compile on Windows, as this is the only real Linux-specific + part of the code. + + There is no inherent fixed buffer size in the HPI interface, as in some other host APIs. + The PortAudio implementation contains a buffer that is allocated during OpenStream and + used to transfer data between the callback and the HPI driver buffer. The size of this + buffer is quite flexible and is derived from latency suggestions and matched to the + requested callback buffer size as far as possible. It can become quite huge, as the + AudioScience cards are typically geared towards higher-latency applications and contain + large hardware buffers. + + The HPI interface natively supports most common sample formats and sample rates (some + conversion is done on the adapter itself). + + Stream time is measured based on the number of processed frames, which is adjusted by the + number of frames currently buffered by the HPI driver. + + There is basic support for detecting overflow and underflow. The HPI interface does not + explicitly indicate this, so thresholds on buffer levels are used in combination with + stream state. Recovery from overflow and underflow is left to the PA client. + + Blocking streams are also implemented. It makes use of the same polling routines that + the callback interface uses, in order to prevent the allocation of variable-sized + buffers during reading and writing. The framesPerBuffer parameter is therefore still + relevant, and this can be increased in the blocking case to improve efficiency. + + The implementation contains extensive reporting macros (slightly modified PA_ENSURE and + PA_UNLESS versions) and a useful stream dump routine to provide debugging feedback. + + Output buffer priming via the user callback (i.e. paPrimeOutputBuffersUsingStreamCallback + and friends) is not implemented yet. All output is primed with silence. + */ + +#include +#include +#include +#include /* strlen() */ +#include /* pthreads and friends */ +#include /* assert */ +#include /* ceil, floor */ + +#include /* HPI API */ + +#include "portaudio.h" /* PortAudio API */ +#include "pa_util.h" /* PA_DEBUG, other small utilities */ +#include "pa_unix_util.h" /* Unix threading utilities */ +#include "pa_allocation.h" /* Group memory allocation */ +#include "pa_hostapi.h" /* Host API structs */ +#include "pa_stream.h" /* Stream interface structs */ +#include "pa_cpuload.h" /* CPU load measurer */ +#include "pa_process.h" /* Buffer processor */ +#include "pa_converters.h" /* PaUtilZeroer */ +#include "pa_debugprint.h" + +/* -------------------------------------------------------------------------- */ + +/* + * Defines + */ + +/* Error reporting and assertions */ + +/** Evaluate expression, and return on any PortAudio errors */ +#define PA_ENSURE_(expr) \ + do { \ + PaError paError = (expr); \ + if( UNLIKELY( paError < paNoError ) ) \ + { \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = paError; \ + goto error; \ + } \ + } while (0); + +/** Assert expression, else return the provided PaError */ +#define PA_UNLESS_(expr, paError) \ + do { \ + if( UNLIKELY( (expr) == 0 ) ) \ + { \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = (paError); \ + goto error; \ + } \ + } while( 0 ); + +/** Check return value of HPI function, and map it to PaError */ +#define PA_ASIHPI_UNLESS_(expr, paError) \ + do { \ + hpi_err_t hpiError = (expr); \ + /* If HPI error occurred */ \ + if( UNLIKELY( hpiError ) ) \ + { \ + char szError[256]; \ + HPI_GetErrorText( hpiError, szError ); \ + PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ + /* This message will always be displayed, even if debug info is disabled */ \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + if( (paError) == paUnanticipatedHostError ) \ + { \ + PA_DEBUG(( "Host error description: %s\n", szError )); \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( pthread_equal( pthread_self(), paUnixMainThread ) ) \ + { \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, hpiError, szError ); \ + } \ + } \ + /* If paNoError is specified, continue as usual */ \ + /* (useful if you only want to print out the debug messages above) */ \ + if( (paError) < 0 ) \ + { \ + result = (paError); \ + goto error; \ + } \ + } \ + } while( 0 ); + +/** Report HPI error code and text */ +#define PA_ASIHPI_REPORT_ERROR_(hpiErrorCode) \ + do { \ + char szError[256]; \ + HPI_GetErrorText( hpiError, szError ); \ + PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( pthread_equal( pthread_self(), paUnixMainThread ) ) \ + { \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, (hpiErrorCode), szError ); \ + } \ + } while( 0 ); + +/* Defaults */ + +/** Sample formats available natively on AudioScience hardware */ +#define PA_ASIHPI_AVAILABLE_FORMATS_ (paFloat32 | paInt32 | paInt24 | paInt16 | paUInt8) +/** Enable background bus mastering (BBM) for buffer transfers, if available (see HPI docs) */ +#define PA_ASIHPI_USE_BBM_ 1 +/** Minimum number of frames in HPI buffer (for either data or available space). + If buffer contains less data/space, it indicates xrun or completion. */ +#define PA_ASIHPI_MIN_FRAMES_ 1152 +/** Minimum polling interval in milliseconds, which determines minimum host buffer size */ +#define PA_ASIHPI_MIN_POLLING_INTERVAL_ 10 + +/* -------------------------------------------------------------------------- */ + +/* + * Structures + */ + +/** Host API global data */ +typedef struct PaAsiHpiHostApiRepresentation +{ + /* PortAudio "base class" - keep the baseRep first! (C-style inheritance) */ + PaUtilHostApiRepresentation baseHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ + + PaHostApiIndex hostApiIndex; +} +PaAsiHpiHostApiRepresentation; + + +/** Device data */ +typedef struct PaAsiHpiDeviceInfo +{ + /* PortAudio "base class" - keep the baseRep first! (C-style inheritance) */ + /** Common PortAudio device information */ + PaDeviceInfo baseDeviceInfo; + + /* implementation specific data goes here */ + + /** Adapter index */ + uint16_t adapterIndex; + /** Adapter model number (hex) */ + uint16_t adapterType; + /** Adapter HW/SW version */ + uint16_t adapterVersion; + /** Adapter serial number */ + uint32_t adapterSerialNumber; + /** Stream number */ + uint16_t streamIndex; + /** 0=Input, 1=Output (HPI streams are either input or output but not both) */ + uint16_t streamIsOutput; +} +PaAsiHpiDeviceInfo; + + +/** Stream state as defined by PortAudio. + It seems that the host API implementation has to keep track of the PortAudio stream state. + Please note that this is NOT the same as the state of the underlying HPI stream. By separating + these two concepts, a lot of flexibility is gained. There is a rough match between the two, + of course, but forcing a precise match is difficult. For example, HPI_STATE_DRAINED can occur + during the Active state of PortAudio (due to underruns) and also during CallBackFinished in + the case of an output stream. Similarly, HPI_STATE_STOPPED mostly coincides with the Stopped + PortAudio state, by may also occur in the CallbackFinished state when recording is finished. + + Here is a rough match-up: + + PortAudio state => HPI state + --------------- --------- + Active => HPI_STATE_RECORDING, HPI_STATE_PLAYING, (HPI_STATE_DRAINED) + Stopped => HPI_STATE_STOPPED + CallbackFinished => HPI_STATE_STOPPED, HPI_STATE_DRAINED */ +typedef enum PaAsiHpiStreamState +{ + paAsiHpiStoppedState=0, + paAsiHpiActiveState=1, + paAsiHpiCallbackFinishedState=2 +} +PaAsiHpiStreamState; + + +/** Stream component data (associated with one direction, i.e. either input or output) */ +typedef struct PaAsiHpiStreamComponent +{ + /** Device information (HPI handles, etc) */ + PaAsiHpiDeviceInfo *hpiDevice; + /** Stream handle, as passed to HPI interface. */ + hpi_handle_t hpiStream; + /** Stream format, as passed to HPI interface */ + struct hpi_format hpiFormat; + /** Number of bytes per frame, derived from hpiFormat and saved for convenience */ + uint32_t bytesPerFrame; + /** Size of hardware (on-card) buffer of stream in bytes */ + uint32_t hardwareBufferSize; + /** Size of host (BBM) buffer of stream in bytes (if used) */ + uint32_t hostBufferSize; + /** Upper limit on the utilization of output stream buffer (both hardware and host). + This prevents large latencies in an output-only stream with a potentially huge buffer + and a fast data generator, which would otherwise keep the hardware buffer filled to + capacity. See also the "Hardware Buffering=off" option in the AudioScience WAV driver. */ + uint32_t outputBufferCap; + /** Sample buffer (halfway station between HPI and buffer processor) */ + uint8_t *tempBuffer; + /** Sample buffer size, in bytes */ + uint32_t tempBufferSize; +} +PaAsiHpiStreamComponent; + + +/** Stream data */ +typedef struct PaAsiHpiStream +{ + /* PortAudio "base class" - keep the baseRep first! (C-style inheritance) */ + PaUtilStreamRepresentation baseStreamRep; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ + + /** Separate structs for input and output sides of stream */ + PaAsiHpiStreamComponent *input, *output; + + /** Polling interval (in milliseconds) */ + uint32_t pollingInterval; + /** Are we running in callback mode? */ + int callbackMode; + /** Number of frames to transfer at a time to/from HPI */ + unsigned long maxFramesPerHostBuffer; + /** Indicates that the stream is in the paNeverDropInput mode */ + int neverDropInput; + /** Contains copy of user buffers, used by blocking interface to transfer non-interleaved data. + It went here instead of to each stream component, as the stream component buffer setup in + PaAsiHpi_SetupBuffers doesn't know the stream details such as callbackMode. + (Maybe a problem later if ReadStream and WriteStream happens concurrently on same stream.) */ + void **blockingUserBufferCopy; + + /* Thread-related variables */ + + /** Helper thread which will deliver data to user callback */ + PaUnixThread thread; + /** PortAudio stream state (Active/Stopped/CallbackFinished) */ + volatile sig_atomic_t state; + /** Hard abort, i.e. drop frames? */ + volatile sig_atomic_t callbackAbort; + /** True if stream stopped via exiting callback with paComplete/paAbort flag + (as opposed to explicit call to StopStream/AbortStream) */ + volatile sig_atomic_t callbackFinished; +} +PaAsiHpiStream; + + +/** Stream state information, collected together for convenience */ +typedef struct PaAsiHpiStreamInfo +{ + /** HPI stream state (HPI_STATE_STOPPED, HPI_STATE_PLAYING, etc.) */ + uint16_t state; + /** Size (in bytes) of recording/playback data buffer in HPI driver */ + uint32_t bufferSize; + /** Amount of data (in bytes) available in the buffer */ + uint32_t dataSize; + /** Number of frames played/recorded since last stream reset */ + uint32_t frameCounter; + /** Amount of data (in bytes) in hardware (on-card) buffer. + This differs from dataSize if bus mastering (BBM) is used, which introduces another + driver-level buffer to which dataSize/bufferSize then refers. */ + uint32_t auxDataSize; + /** Total number of data frames currently buffered by HPI driver (host + hw buffers) */ + uint32_t totalBufferedData; + /** Size of immediately available data (for input) or space (for output) in frames. + This only checks the first-level buffer (typically host buffer). This amount can be + transferred immediately. */ + uint32_t availableFrames; + /** Indicates that hardware buffer is getting too full */ + int overflow; + /** Indicates that hardware buffer is getting too empty */ + int underflow; +} +PaAsiHpiStreamInfo; + +/* -------------------------------------------------------------------------- */ + +/* + * Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + /* The only exposed function in the entire host API implementation */ + PaError PaAsiHpi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); + +/* Stream prototypes */ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream **s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream *s ); +static PaError StartStream( PaStream *s ); +static PaError StopStream( PaStream *s ); +static PaError AbortStream( PaStream *s ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *s ); +static PaTime GetStreamTime( PaStream *s ); +static double GetStreamCpuLoad( PaStream *s ); + +/* Blocking prototypes */ +static PaError ReadStream( PaStream *s, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream *s, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream *s ); +static signed long GetStreamWriteAvailable( PaStream *s ); + +/* Callback prototypes */ +static void *CallbackThreadFunc( void *userData ); + +/* Functions specific to this API */ +static PaError PaAsiHpi_BuildDeviceList( PaAsiHpiHostApiRepresentation *hpiHostApi ); +static uint16_t PaAsiHpi_PaToHpiFormat( PaSampleFormat paFormat ); +static PaSampleFormat PaAsiHpi_HpiToPaFormat( uint16_t hpiFormat ); +static PaError PaAsiHpi_CreateFormat( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *parameters, double sampleRate, + PaAsiHpiDeviceInfo **hpiDevice, struct hpi_format *hpiFormat ); +static PaError PaAsiHpi_OpenInput( struct PaUtilHostApiRepresentation *hostApi, + const PaAsiHpiDeviceInfo *hpiDevice, const struct hpi_format *hpiFormat, + hpi_handle_t *hpiStream ); +static PaError PaAsiHpi_OpenOutput( struct PaUtilHostApiRepresentation *hostApi, + const PaAsiHpiDeviceInfo *hpiDevice, const struct hpi_format *hpiFormat, + hpi_handle_t *hpiStream ); +static PaError PaAsiHpi_GetStreamInfo( PaAsiHpiStreamComponent *streamComp, PaAsiHpiStreamInfo *info ); +static void PaAsiHpi_StreamComponentDump( PaAsiHpiStreamComponent *streamComp, PaAsiHpiStream *stream ); +static void PaAsiHpi_StreamDump( PaAsiHpiStream *stream ); +static PaError PaAsiHpi_SetupBuffers( PaAsiHpiStreamComponent *streamComp, uint32_t pollingInterval, + unsigned long framesPerPaHostBuffer, PaTime suggestedLatency ); +static PaError PaAsiHpi_PrimeOutputWithSilence( PaAsiHpiStream *stream ); +static PaError PaAsiHpi_StartStream( PaAsiHpiStream *stream, int outputPrimed ); +static PaError PaAsiHpi_StopStream( PaAsiHpiStream *stream, int abort ); +static PaError PaAsiHpi_ExplicitStop( PaAsiHpiStream *stream, int abort ); +static void PaAsiHpi_OnThreadExit( void *userData ); +static PaError PaAsiHpi_WaitForFrames( PaAsiHpiStream *stream, unsigned long *framesAvail, + PaStreamCallbackFlags *cbFlags ); +static void PaAsiHpi_CalculateTimeInfo( PaAsiHpiStream *stream, PaStreamCallbackTimeInfo *timeInfo ); +static PaError PaAsiHpi_BeginProcessing( PaAsiHpiStream* stream, unsigned long* numFrames, + PaStreamCallbackFlags *cbFlags ); +static PaError PaAsiHpi_EndProcessing( PaAsiHpiStream *stream, unsigned long numFrames, + PaStreamCallbackFlags *cbFlags ); + +/* ========================================================================== + * ============================= IMPLEMENTATION ============================= + * ========================================================================== */ + +/* --------------------------- Host API Interface --------------------------- */ + +/** Enumerate all PA devices (= HPI streams). + This compiles a list of all HPI adapters, and registers a PA device for each input and + output stream it finds. Most errors are ignored, as missing or erroneous devices are + simply skipped. + + @param hpiHostApi Pointer to HPI host API struct + + @return PortAudio error code (only paInsufficientMemory in practice) + */ +static PaError PaAsiHpi_BuildDeviceList( PaAsiHpiHostApiRepresentation *hpiHostApi ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *hostApi = &hpiHostApi->baseHostApiRep; + PaHostApiInfo *baseApiInfo = &hostApi->info; + PaAsiHpiDeviceInfo *hpiDeviceList; + int numAdapters; + hpi_err_t hpiError = 0; + int i, j, deviceCount = 0, deviceIndex = 0; + + assert( hpiHostApi ); + + /* Errors not considered critical here (subsystem may report 0 devices), but report them */ + /* in debug mode. */ + PA_ASIHPI_UNLESS_( HPI_SubSysGetNumAdapters( NULL, &numAdapters), paNoError ); + + for( i=0; i < numAdapters; ++i ) + { + uint16_t inStreams, outStreams; + uint16_t version; + uint32_t serial; + uint16_t type; + uint32_t idx; + + hpiError = HPI_SubSysGetAdapter(NULL, i, &idx, &type); + if (hpiError) + continue; + + /* Try to open adapter */ + hpiError = HPI_AdapterOpen( NULL, idx ); + /* Report error and skip to next device on failure */ + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + continue; + } + hpiError = HPI_AdapterGetInfo( NULL, idx, &outStreams, &inStreams, + &version, &serial, &type ); + /* Skip to next device on failure */ + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + continue; + } + else + { + /* Assign default devices if available and increment device count */ + if( (baseApiInfo->defaultInputDevice == paNoDevice) && (inStreams > 0) ) + baseApiInfo->defaultInputDevice = deviceCount; + deviceCount += inStreams; + if( (baseApiInfo->defaultOutputDevice == paNoDevice) && (outStreams > 0) ) + baseApiInfo->defaultOutputDevice = deviceCount; + deviceCount += outStreams; + } + } + + /* Register any discovered devices */ + if( deviceCount > 0 ) + { + /* Memory allocation */ + PA_UNLESS_( hostApi->deviceInfos = (PaDeviceInfo**) PaUtil_GroupAllocateMemory( + hpiHostApi->allocations, sizeof(PaDeviceInfo*) * deviceCount ), + paInsufficientMemory ); + /* Allocate all device info structs in a contiguous block */ + PA_UNLESS_( hpiDeviceList = (PaAsiHpiDeviceInfo*) PaUtil_GroupAllocateMemory( + hpiHostApi->allocations, sizeof(PaAsiHpiDeviceInfo) * deviceCount ), + paInsufficientMemory ); + + /* Now query devices again for information */ + for( i=0; i < numAdapters; ++i ) + { + uint16_t inStreams, outStreams; + uint16_t version; + uint32_t serial; + uint16_t type; + uint32_t idx; + + hpiError = HPI_SubSysGetAdapter( NULL, i, &idx, &type ); + if (hpiError) + continue; + + /* Assume adapter is still open from previous round */ + hpiError = HPI_AdapterGetInfo( NULL, idx, + &outStreams, &inStreams, &version, &serial, &type ); + /* Report error and skip to next device on failure */ + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + continue; + } + else + { + PA_DEBUG(( "Found HPI Adapter ID=%4X Idx=%d #In=%d #Out=%d S/N=%d HWver=%c%d DSPver=%03d\n", + type, idx, inStreams, outStreams, serial, + ((version>>3)&0xf)+'A', /* Hw version major */ + version&0x7, /* Hw version minor */ + ((version>>13)*100)+((version>>7)&0x3f) /* DSP code version */ + )); + } + + /* First add all input streams as devices */ + for( j=0; j < inStreams; ++j ) + { + PaAsiHpiDeviceInfo *hpiDevice = &hpiDeviceList[deviceIndex]; + PaDeviceInfo *baseDeviceInfo = &hpiDevice->baseDeviceInfo; + char srcName[72]; + char *deviceName; + + memset( hpiDevice, 0, sizeof(PaAsiHpiDeviceInfo) ); + /* Set implementation-specific device details */ + hpiDevice->adapterIndex = idx; + hpiDevice->adapterType = type; + hpiDevice->adapterVersion = version; + hpiDevice->adapterSerialNumber = serial; + hpiDevice->streamIndex = j; + hpiDevice->streamIsOutput = 0; + /* Set common PortAudio device stats */ + baseDeviceInfo->structVersion = 2; + /* Make sure name string is owned by API info structure */ + sprintf( srcName, + "Adapter %d (%4X) - Input Stream %d", i+1, type, j+1 ); + PA_UNLESS_( deviceName = (char *) PaUtil_GroupAllocateMemory( + hpiHostApi->allocations, strlen(srcName) + 1 ), paInsufficientMemory ); + strcpy( deviceName, srcName ); + baseDeviceInfo->name = deviceName; + baseDeviceInfo->hostApi = hpiHostApi->hostApiIndex; + baseDeviceInfo->maxInputChannels = HPI_MAX_CHANNELS; + baseDeviceInfo->maxOutputChannels = 0; + /* Default latency values for interactive performance */ + baseDeviceInfo->defaultLowInputLatency = 0.01; + baseDeviceInfo->defaultLowOutputLatency = -1.0; + /* Default latency values for robust non-interactive applications (eg. playing sound files) */ + baseDeviceInfo->defaultHighInputLatency = 0.2; + baseDeviceInfo->defaultHighOutputLatency = -1.0; + /* HPI interface can actually handle any sampling rate to 1 Hz accuracy, + * so this default is as good as any */ + baseDeviceInfo->defaultSampleRate = 44100; + + /* Store device in global PortAudio list */ + hostApi->deviceInfos[deviceIndex++] = (PaDeviceInfo *) hpiDevice; + } + + /* Now add all output streams as devices (I know, the repetition is painful) */ + for( j=0; j < outStreams; ++j ) + { + PaAsiHpiDeviceInfo *hpiDevice = &hpiDeviceList[deviceIndex]; + PaDeviceInfo *baseDeviceInfo = &hpiDevice->baseDeviceInfo; + char srcName[72]; + char *deviceName; + + memset( hpiDevice, 0, sizeof(PaAsiHpiDeviceInfo) ); + /* Set implementation-specific device details */ + hpiDevice->adapterIndex = idx; + hpiDevice->adapterType = type; + hpiDevice->adapterVersion = version; + hpiDevice->adapterSerialNumber = serial; + hpiDevice->streamIndex = j; + hpiDevice->streamIsOutput = 1; + /* Set common PortAudio device stats */ + baseDeviceInfo->structVersion = 2; + /* Make sure name string is owned by API info structure */ + sprintf( srcName, + "Adapter %d (%4X) - Output Stream %d", i+1, type, j+1 ); + PA_UNLESS_( deviceName = (char *) PaUtil_GroupAllocateMemory( + hpiHostApi->allocations, strlen(srcName) + 1 ), paInsufficientMemory ); + strcpy( deviceName, srcName ); + baseDeviceInfo->name = deviceName; + baseDeviceInfo->hostApi = hpiHostApi->hostApiIndex; + baseDeviceInfo->maxInputChannels = 0; + baseDeviceInfo->maxOutputChannels = HPI_MAX_CHANNELS; + /* Default latency values for interactive performance. */ + baseDeviceInfo->defaultLowInputLatency = -1.0; + baseDeviceInfo->defaultLowOutputLatency = 0.01; + /* Default latency values for robust non-interactive applications (eg. playing sound files). */ + baseDeviceInfo->defaultHighInputLatency = -1.0; + baseDeviceInfo->defaultHighOutputLatency = 0.2; + /* HPI interface can actually handle any sampling rate to 1 Hz accuracy, + * so this default is as good as any */ + baseDeviceInfo->defaultSampleRate = 44100; + + /* Store device in global PortAudio list */ + hostApi->deviceInfos[deviceIndex++] = (PaDeviceInfo *) hpiDevice; + } + } + } + + /* Finally acknowledge checked devices */ + baseApiInfo->deviceCount = deviceIndex; + +error: + return result; +} + + +/** Initialize host API implementation. + This is the only function exported beyond this file. It is called by PortAudio to initialize + the host API. It stores API info, finds and registers all devices, and sets up callback and + blocking interfaces. + + @param hostApi Pointer to host API struct + + @param hostApiIndex Index of current (HPI) host API + + @return PortAudio error code + */ +PaError PaAsiHpi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaAsiHpiHostApiRepresentation *hpiHostApi = NULL; + PaHostApiInfo *baseApiInfo; + + /* Try to initialize HPI subsystem */ + if (!HPI_SubSysCreate()) + { + /* the V19 development docs say that if an implementation + * detects that it cannot be used, it should return a NULL + * interface and paNoError */ + PA_DEBUG(( "Could not open HPI interface\n" )); + + *hostApi = NULL; + return paNoError; + } + else + { + uint32_t hpiVersion; + PA_ASIHPI_UNLESS_( HPI_SubSysGetVersionEx( NULL, &hpiVersion ), paUnanticipatedHostError ); + PA_DEBUG(( "HPI interface v%d.%02d.%02d\n", + hpiVersion >> 16, (hpiVersion >> 8) & 0x0F, (hpiVersion & 0x0F) )); + } + + /* Allocate host API structure */ + PA_UNLESS_( hpiHostApi = (PaAsiHpiHostApiRepresentation*) PaUtil_AllocateMemory( + sizeof(PaAsiHpiHostApiRepresentation) ), paInsufficientMemory ); + PA_UNLESS_( hpiHostApi->allocations = PaUtil_CreateAllocationGroup(), paInsufficientMemory ); + + hpiHostApi->hostApiIndex = hostApiIndex; + + *hostApi = &hpiHostApi->baseHostApiRep; + baseApiInfo = &((*hostApi)->info); + /* Fill in common API details */ + baseApiInfo->structVersion = 1; + baseApiInfo->type = paAudioScienceHPI; + baseApiInfo->name = "AudioScience HPI"; + baseApiInfo->deviceCount = 0; + baseApiInfo->defaultInputDevice = paNoDevice; + baseApiInfo->defaultOutputDevice = paNoDevice; + + PA_ENSURE_( PaAsiHpi_BuildDeviceList( hpiHostApi ) ); + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &hpiHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &hpiHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + /* Store identity of main thread */ + PA_ENSURE_( PaUnixThreading_Initialize() ); + + return result; +error: + if (hpiHostApi) + PaUtil_FreeMemory( hpiHostApi ); + return result; +} + + +/** Terminate host API implementation. + This closes all HPI adapters and frees the HPI subsystem. It also frees the host API struct + memory. It should be called once for every PaAsiHpi_Initialize call. + + @param Pointer to host API struct + */ +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaAsiHpiHostApiRepresentation *hpiHostApi = (PaAsiHpiHostApiRepresentation*)hostApi; + int i; + PaError result = paNoError; + + if( hpiHostApi ) + { + /* Get rid of HPI-specific structures */ + uint16_t lastAdapterIndex = HPI_MAX_ADAPTERS; + /* Iterate through device list and close adapters */ + for( i=0; i < hostApi->info.deviceCount; ++i ) + { + PaAsiHpiDeviceInfo *hpiDevice = (PaAsiHpiDeviceInfo *) hostApi->deviceInfos[ i ]; + /* Close adapter only if it differs from previous one */ + if( hpiDevice->adapterIndex != lastAdapterIndex ) + { + /* Ignore errors (report only during debugging) */ + PA_ASIHPI_UNLESS_( HPI_AdapterClose( NULL, + hpiDevice->adapterIndex ), paNoError ); + lastAdapterIndex = hpiDevice->adapterIndex; + } + } + /* Finally dismantle HPI subsystem */ + HPI_SubSysFree( NULL ); + + if( hpiHostApi->allocations ) + { + PaUtil_FreeAllAllocations( hpiHostApi->allocations ); + PaUtil_DestroyAllocationGroup( hpiHostApi->allocations ); + } + + PaUtil_FreeMemory( hpiHostApi ); + } +error: + return; +} + + +/** Converts PortAudio sample format to equivalent HPI format. + + @param paFormat PortAudio sample format + + @return HPI sample format + */ +static uint16_t PaAsiHpi_PaToHpiFormat( PaSampleFormat paFormat ) +{ + /* Ignore interleaving flag */ + switch( paFormat & ~paNonInterleaved ) + { + case paFloat32: + return HPI_FORMAT_PCM32_FLOAT; + + case paInt32: + return HPI_FORMAT_PCM32_SIGNED; + + case paInt24: + return HPI_FORMAT_PCM24_SIGNED; + + case paInt16: + return HPI_FORMAT_PCM16_SIGNED; + + case paUInt8: + return HPI_FORMAT_PCM8_UNSIGNED; + + /* Default is 16-bit signed */ + case paInt8: + default: + return HPI_FORMAT_PCM16_SIGNED; + } +} + + +/** Converts HPI sample format to equivalent PortAudio format. + + @param paFormat HPI sample format + + @return PortAudio sample format + */ +static PaSampleFormat PaAsiHpi_HpiToPaFormat( uint16_t hpiFormat ) +{ + switch( hpiFormat ) + { + case HPI_FORMAT_PCM32_FLOAT: + return paFloat32; + + case HPI_FORMAT_PCM32_SIGNED: + return paInt32; + + case HPI_FORMAT_PCM24_SIGNED: + return paInt24; + + case HPI_FORMAT_PCM16_SIGNED: + return paInt16; + + case HPI_FORMAT_PCM8_UNSIGNED: + return paUInt8; + + /* Default is custom format (e.g. for HPI MP3 format) */ + default: + return paCustomFormat; + } +} + + +/** Creates HPI format struct based on PortAudio parameters. + This also does some checks to see whether the desired format is valid, and whether + the device allows it. This only checks the format of one half (input or output) of the + PortAudio stream. + + @param hostApi Pointer to host API struct + + @param parameters Pointer to stream parameter struct + + @param sampleRate Desired sample rate + + @param hpiDevice Pointer to HPI device struct + + @param hpiFormat Resulting HPI format returned here + + @return PortAudio error code (typically indicating a problem with stream format) + */ +static PaError PaAsiHpi_CreateFormat( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *parameters, double sampleRate, + PaAsiHpiDeviceInfo **hpiDevice, struct hpi_format *hpiFormat ) +{ + int maxChannelCount = 0; + PaSampleFormat hostSampleFormat = 0; + hpi_err_t hpiError = 0; + + /* Unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if( parameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + else + { + assert( parameters->device < hostApi->info.deviceCount ); + *hpiDevice = (PaAsiHpiDeviceInfo*) hostApi->deviceInfos[ parameters->device ]; + } + + /* Validate streamInfo - this implementation doesn't use custom stream info */ + if( parameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; + + /* Check that device can support channel count */ + if( (*hpiDevice)->streamIsOutput ) + { + maxChannelCount = (*hpiDevice)->baseDeviceInfo.maxOutputChannels; + } + else + { + maxChannelCount = (*hpiDevice)->baseDeviceInfo.maxInputChannels; + } + if( (maxChannelCount == 0) || (parameters->channelCount > maxChannelCount) ) + return paInvalidChannelCount; + + /* All standard sample formats are supported by the buffer adapter, + and this implementation doesn't support any custom sample formats */ + if( parameters->sampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* Switch to closest HPI native format */ + hostSampleFormat = PaUtil_SelectClosestAvailableFormat(PA_ASIHPI_AVAILABLE_FORMATS_, + parameters->sampleFormat ); + /* Setup format + info objects */ + hpiError = HPI_FormatCreate( hpiFormat, (uint16_t)parameters->channelCount, + PaAsiHpi_PaToHpiFormat( hostSampleFormat ), + (uint32_t)sampleRate, 0, 0 ); + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + switch( hpiError ) + { + case HPI_ERROR_INVALID_FORMAT: + return paSampleFormatNotSupported; + + case HPI_ERROR_INVALID_SAMPLERATE: + case HPI_ERROR_INCOMPATIBLE_SAMPLERATE: + return paInvalidSampleRate; + + case HPI_ERROR_INVALID_CHANNELS: + return paInvalidChannelCount; + } + } + + return paNoError; +} + + +/** Open HPI input stream with given format. + This attempts to open HPI input stream with desired format. If the format is not supported + or the device is unavailable, the stream is closed and a PortAudio error code is returned. + + @param hostApi Pointer to host API struct + + @param hpiDevice Pointer to HPI device struct + + @param hpiFormat Pointer to HPI format struct + + @return PortAudio error code (typically indicating a problem with stream format or device) +*/ +static PaError PaAsiHpi_OpenInput( struct PaUtilHostApiRepresentation *hostApi, + const PaAsiHpiDeviceInfo *hpiDevice, const struct hpi_format *hpiFormat, + hpi_handle_t *hpiStream ) +{ + PaAsiHpiHostApiRepresentation *hpiHostApi = (PaAsiHpiHostApiRepresentation*)hostApi; + PaError result = paNoError; + hpi_err_t hpiError = 0; + + /* Catch misplaced output devices, as they typically have 0 input channels */ + PA_UNLESS_( !hpiDevice->streamIsOutput, paInvalidChannelCount ); + /* Try to open input stream */ + PA_ASIHPI_UNLESS_( HPI_InStreamOpen( NULL, hpiDevice->adapterIndex, + hpiDevice->streamIndex, hpiStream ), paDeviceUnavailable ); + /* Set input format (checking it in the process) */ + /* Could also use HPI_InStreamQueryFormat, but this economizes the process */ + hpiError = HPI_InStreamSetFormat( NULL, *hpiStream, (struct hpi_format*)hpiFormat ); + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + PA_ASIHPI_UNLESS_( HPI_InStreamClose( NULL, *hpiStream ), paNoError ); + switch( hpiError ) + { + case HPI_ERROR_INVALID_FORMAT: + return paSampleFormatNotSupported; + + case HPI_ERROR_INVALID_SAMPLERATE: + case HPI_ERROR_INCOMPATIBLE_SAMPLERATE: + return paInvalidSampleRate; + + case HPI_ERROR_INVALID_CHANNELS: + return paInvalidChannelCount; + + default: + /* In case anything else went wrong */ + return paInvalidDevice; + } + } + +error: + return result; +} + + +/** Open HPI output stream with given format. + This attempts to open HPI output stream with desired format. If the format is not supported + or the device is unavailable, the stream is closed and a PortAudio error code is returned. + + @param hostApi Pointer to host API struct + + @param hpiDevice Pointer to HPI device struct + + @param hpiFormat Pointer to HPI format struct + + @return PortAudio error code (typically indicating a problem with stream format or device) +*/ +static PaError PaAsiHpi_OpenOutput( struct PaUtilHostApiRepresentation *hostApi, + const PaAsiHpiDeviceInfo *hpiDevice, const struct hpi_format *hpiFormat, + hpi_handle_t *hpiStream ) +{ + PaAsiHpiHostApiRepresentation *hpiHostApi = (PaAsiHpiHostApiRepresentation*)hostApi; + PaError result = paNoError; + hpi_err_t hpiError = 0; + + /* Catch misplaced input devices, as they typically have 0 output channels */ + PA_UNLESS_( hpiDevice->streamIsOutput, paInvalidChannelCount ); + /* Try to open output stream */ + PA_ASIHPI_UNLESS_( HPI_OutStreamOpen( NULL, hpiDevice->adapterIndex, + hpiDevice->streamIndex, hpiStream ), paDeviceUnavailable ); + + /* Check output format (format is set on first write to output stream) */ + hpiError = HPI_OutStreamQueryFormat( NULL, *hpiStream, (struct hpi_format*)hpiFormat ); + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + PA_ASIHPI_UNLESS_( HPI_OutStreamClose( NULL, *hpiStream ), paNoError ); + switch( hpiError ) + { + case HPI_ERROR_INVALID_FORMAT: + return paSampleFormatNotSupported; + + case HPI_ERROR_INVALID_SAMPLERATE: + case HPI_ERROR_INCOMPATIBLE_SAMPLERATE: + return paInvalidSampleRate; + + case HPI_ERROR_INVALID_CHANNELS: + return paInvalidChannelCount; + + default: + /* In case anything else went wrong */ + return paInvalidDevice; + } + } + +error: + return result; +} + + +/** Checks whether the desired stream formats and devices are supported + (for both input and output). + This is done by actually opening the appropriate HPI streams and closing them again. + + @param hostApi Pointer to host API struct + + @param inputParameters Pointer to stream parameter struct for input side of stream + + @param outputParameters Pointer to stream parameter struct for output side of stream + + @param sampleRate Desired sample rate + + @return PortAudio error code (paFormatIsSupported on success) + */ +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaError result = paFormatIsSupported; + PaAsiHpiHostApiRepresentation *hpiHostApi = (PaAsiHpiHostApiRepresentation*)hostApi; + PaAsiHpiDeviceInfo *hpiDevice = NULL; + struct hpi_format hpiFormat; + + /* Input stream */ + if( inputParameters ) + { + hpi_handle_t hpiStream; + PA_DEBUG(( "%s: Checking input params: dev=%d, sr=%d, chans=%d, fmt=%d\n", + __FUNCTION__, inputParameters->device, (int)sampleRate, + inputParameters->channelCount, inputParameters->sampleFormat )); + /* Create and validate format */ + PA_ENSURE_( PaAsiHpi_CreateFormat( hostApi, inputParameters, sampleRate, + &hpiDevice, &hpiFormat ) ); + /* Open stream to further check format */ + PA_ENSURE_( PaAsiHpi_OpenInput( hostApi, hpiDevice, &hpiFormat, &hpiStream ) ); + /* Close stream again */ + PA_ASIHPI_UNLESS_( HPI_InStreamClose( NULL, hpiStream ), paNoError ); + } + + /* Output stream */ + if( outputParameters ) + { + hpi_handle_t hpiStream; + PA_DEBUG(( "%s: Checking output params: dev=%d, sr=%d, chans=%d, fmt=%d\n", + __FUNCTION__, outputParameters->device, (int)sampleRate, + outputParameters->channelCount, outputParameters->sampleFormat )); + /* Create and validate format */ + PA_ENSURE_( PaAsiHpi_CreateFormat( hostApi, outputParameters, sampleRate, + &hpiDevice, &hpiFormat ) ); + /* Open stream to further check format */ + PA_ENSURE_( PaAsiHpi_OpenOutput( hostApi, hpiDevice, &hpiFormat, &hpiStream ) ); + /* Close stream again */ + PA_ASIHPI_UNLESS_( HPI_OutStreamClose( NULL, hpiStream ), paNoError ); + } + +error: + return result; +} + +/* ---------------------------- Stream Interface ---------------------------- */ + +/** Obtain HPI stream information. + This obtains info such as stream state and available data/space in buffers. It also + estimates whether an underflow or overflow occurred. + + @param streamComp Pointer to stream component (input or output) to query + + @param info Pointer to stream info struct that will contain result + + @return PortAudio error code (either paNoError, paDeviceUnavailable or paUnanticipatedHostError) + */ +static PaError PaAsiHpi_GetStreamInfo( PaAsiHpiStreamComponent *streamComp, PaAsiHpiStreamInfo *info ) +{ + PaError result = paDeviceUnavailable; + uint16_t state; + uint32_t bufferSize, dataSize, frameCounter, auxDataSize, threshold; + uint32_t hwBufferSize, hwDataSize; + + assert( streamComp ); + assert( info ); + + /* First blank the stream info struct, in case something goes wrong below. + This saves the caller from initializing the struct. */ + info->state = 0; + info->bufferSize = 0; + info->dataSize = 0; + info->frameCounter = 0; + info->auxDataSize = 0; + info->totalBufferedData = 0; + info->availableFrames = 0; + info->underflow = 0; + info->overflow = 0; + + if( streamComp->hpiDevice && streamComp->hpiStream ) + { + /* Obtain detailed stream info (either input or output) */ + if( streamComp->hpiDevice->streamIsOutput ) + { + PA_ASIHPI_UNLESS_( HPI_OutStreamGetInfoEx( NULL, + streamComp->hpiStream, + &state, &bufferSize, &dataSize, &frameCounter, + &auxDataSize ), paUnanticipatedHostError ); + } + else + { + PA_ASIHPI_UNLESS_( HPI_InStreamGetInfoEx( NULL, + streamComp->hpiStream, + &state, &bufferSize, &dataSize, &frameCounter, + &auxDataSize ), paUnanticipatedHostError ); + } + /* Load stream info */ + info->state = state; + info->bufferSize = bufferSize; + info->dataSize = dataSize; + info->frameCounter = frameCounter; + info->auxDataSize = auxDataSize; + /* Determine total buffered data */ + info->totalBufferedData = dataSize; + if( streamComp->hostBufferSize > 0 ) + info->totalBufferedData += auxDataSize; + info->totalBufferedData /= streamComp->bytesPerFrame; + /* Determine immediately available frames */ + info->availableFrames = streamComp->hpiDevice->streamIsOutput ? + bufferSize - dataSize : dataSize; + info->availableFrames /= streamComp->bytesPerFrame; + /* Minimum space/data required in buffers */ + threshold = PA_MIN( streamComp->tempBufferSize, + streamComp->bytesPerFrame * PA_ASIHPI_MIN_FRAMES_ ); + /* Obtain hardware buffer stats first, to simplify things */ + hwBufferSize = streamComp->hardwareBufferSize; + hwDataSize = streamComp->hostBufferSize > 0 ? auxDataSize : dataSize; + /* Underflow is a bit tricky */ + info->underflow = streamComp->hpiDevice->streamIsOutput ? + /* Stream seems to start in drained state sometimes, so ignore initial underflow */ + (frameCounter > 0) && ( (state == HPI_STATE_DRAINED) || (hwDataSize == 0) ) : + /* Input streams check the first-level (host) buffer for underflow */ + (state != HPI_STATE_STOPPED) && (dataSize < threshold); + /* Check for overflow in second-level (hardware) buffer for both input and output */ + info->overflow = (state != HPI_STATE_STOPPED) && (hwBufferSize - hwDataSize < threshold); + + return paNoError; + } + +error: + return result; +} + + +/** Display stream component information for debugging purposes. + + @param streamComp Pointer to stream component (input or output) to query + + @param stream Pointer to stream struct which contains the component above + */ +static void PaAsiHpi_StreamComponentDump( PaAsiHpiStreamComponent *streamComp, + PaAsiHpiStream *stream ) +{ + PaAsiHpiStreamInfo streamInfo; + + assert( streamComp ); + assert( stream ); + + /* Name of soundcard/device used by component */ + PA_DEBUG(( "device: %s\n", streamComp->hpiDevice->baseDeviceInfo.name )); + /* Unfortunately some overlap between input and output here */ + if( streamComp->hpiDevice->streamIsOutput ) + { + /* Settings on the user side (as experienced by user callback) */ + PA_DEBUG(( "user: %d-bit, %d ", + 8*stream->bufferProcessor.bytesPerUserOutputSample, + stream->bufferProcessor.outputChannelCount)); + if( stream->bufferProcessor.userOutputIsInterleaved ) + { + PA_DEBUG(( "interleaved channels, " )); + } + else + { + PA_DEBUG(( "non-interleaved channels, " )); + } + PA_DEBUG(( "%d frames/buffer, latency = %5.1f ms\n", + stream->bufferProcessor.framesPerUserBuffer, + 1000*stream->baseStreamRep.streamInfo.outputLatency )); + /* Settings on the host side (internal to PortAudio host API) */ + PA_DEBUG(( "host: %d-bit, %d interleaved channels, %d frames/buffer ", + 8*stream->bufferProcessor.bytesPerHostOutputSample, + stream->bufferProcessor.outputChannelCount, + stream->bufferProcessor.framesPerHostBuffer )); + } + else + { + /* Settings on the user side (as experienced by user callback) */ + PA_DEBUG(( "user: %d-bit, %d ", + 8*stream->bufferProcessor.bytesPerUserInputSample, + stream->bufferProcessor.inputChannelCount)); + if( stream->bufferProcessor.userInputIsInterleaved ) + { + PA_DEBUG(( "interleaved channels, " )); + } + else + { + PA_DEBUG(( "non-interleaved channels, " )); + } + PA_DEBUG(( "%d frames/buffer, latency = %5.1f ms\n", + stream->bufferProcessor.framesPerUserBuffer, + 1000*stream->baseStreamRep.streamInfo.inputLatency )); + /* Settings on the host side (internal to PortAudio host API) */ + PA_DEBUG(( "host: %d-bit, %d interleaved channels, %d frames/buffer ", + 8*stream->bufferProcessor.bytesPerHostInputSample, + stream->bufferProcessor.inputChannelCount, + stream->bufferProcessor.framesPerHostBuffer )); + } + switch( stream->bufferProcessor.hostBufferSizeMode ) + { + case paUtilFixedHostBufferSize: + PA_DEBUG(( "[fixed] " )); + break; + case paUtilBoundedHostBufferSize: + PA_DEBUG(( "[bounded] " )); + break; + case paUtilUnknownHostBufferSize: + PA_DEBUG(( "[unknown] " )); + break; + case paUtilVariableHostBufferSizePartialUsageAllowed: + PA_DEBUG(( "[variable] " )); + break; + } + PA_DEBUG(( "(%d max)\n", streamComp->tempBufferSize / streamComp->bytesPerFrame )); + /* HPI hardware settings */ + PA_DEBUG(( "HPI: adapter %d stream %d, %d-bit, %d-channel, %d Hz\n", + streamComp->hpiDevice->adapterIndex, streamComp->hpiDevice->streamIndex, + 8 * streamComp->bytesPerFrame / streamComp->hpiFormat.wChannels, + streamComp->hpiFormat.wChannels, + streamComp->hpiFormat.dwSampleRate )); + /* Stream state and buffer levels */ + PA_DEBUG(( "HPI: " )); + PaAsiHpi_GetStreamInfo( streamComp, &streamInfo ); + switch( streamInfo.state ) + { + case HPI_STATE_STOPPED: + PA_DEBUG(( "[STOPPED] " )); + break; + case HPI_STATE_PLAYING: + PA_DEBUG(( "[PLAYING] " )); + break; + case HPI_STATE_RECORDING: + PA_DEBUG(( "[RECORDING] " )); + break; + case HPI_STATE_DRAINED: + PA_DEBUG(( "[DRAINED] " )); + break; + default: + PA_DEBUG(( "[unknown state] " )); + break; + } + if( streamComp->hostBufferSize ) + { + PA_DEBUG(( "host = %d/%d B, ", streamInfo.dataSize, streamComp->hostBufferSize )); + PA_DEBUG(( "hw = %d/%d (%d) B, ", streamInfo.auxDataSize, + streamComp->hardwareBufferSize, streamComp->outputBufferCap )); + } + else + { + PA_DEBUG(( "hw = %d/%d B, ", streamInfo.dataSize, streamComp->hardwareBufferSize )); + } + PA_DEBUG(( "count = %d", streamInfo.frameCounter )); + if( streamInfo.overflow ) + { + PA_DEBUG(( " [overflow]" )); + } + else if( streamInfo.underflow ) + { + PA_DEBUG(( " [underflow]" )); + } + PA_DEBUG(( "\n" )); +} + + +/** Display stream information for debugging purposes. + + @param stream Pointer to stream to query + */ +static void PaAsiHpi_StreamDump( PaAsiHpiStream *stream ) +{ + assert( stream ); + + PA_DEBUG(( "\n------------------------- STREAM INFO FOR %p ---------------------------\n", stream )); + /* General stream info (input+output) */ + if( stream->baseStreamRep.streamCallback ) + { + PA_DEBUG(( "[callback] " )); + } + else + { + PA_DEBUG(( "[blocking] " )); + } + PA_DEBUG(( "sr=%d Hz, poll=%d ms, max %d frames/buf ", + (int)stream->baseStreamRep.streamInfo.sampleRate, + stream->pollingInterval, stream->maxFramesPerHostBuffer )); + switch( stream->state ) + { + case paAsiHpiStoppedState: + PA_DEBUG(( "[stopped]\n" )); + break; + case paAsiHpiActiveState: + PA_DEBUG(( "[active]\n" )); + break; + case paAsiHpiCallbackFinishedState: + PA_DEBUG(( "[cb fin]\n" )); + break; + default: + PA_DEBUG(( "[unknown state]\n" )); + break; + } + if( stream->callbackMode ) + { + PA_DEBUG(( "cb info: thread=%p, cbAbort=%d, cbFinished=%d\n", + stream->thread.thread, stream->callbackAbort, stream->callbackFinished )); + } + + PA_DEBUG(( "----------------------------------- Input ------------------------------------\n" )); + if( stream->input ) + { + PaAsiHpi_StreamComponentDump( stream->input, stream ); + } + else + { + PA_DEBUG(( "*none*\n" )); + } + + PA_DEBUG(( "----------------------------------- Output ------------------------------------\n" )); + if( stream->output ) + { + PaAsiHpi_StreamComponentDump( stream->output, stream ); + } + else + { + PA_DEBUG(( "*none*\n" )); + } + PA_DEBUG(( "-------------------------------------------------------------------------------\n\n" )); + +} + + +/** Determine buffer sizes and allocate appropriate stream buffers. + This attempts to allocate a BBM (host) buffer for the HPI stream component (either input + or output, as both have similar buffer needs). Not all AudioScience adapters support BBM, + in which case the hardware buffer has to suffice. The size of the HPI host buffer is chosen + as a multiple of framesPerPaHostBuffer, and also influenced by the suggested latency and the + estimated minimum polling interval. The HPI host and hardware buffer sizes are stored, and an + appropriate cap for the hardware buffer is also calculated. Finally, the temporary stream + buffer which serves as the PortAudio host buffer for this implementation is allocated. + This buffer contains an integer number of user buffers, to simplify buffer adaption in the + buffer processor. The function returns paBufferTooBig if the HPI interface cannot allocate + an HPI host buffer of the desired size. + + @param streamComp Pointer to stream component struct + + @param pollingInterval Polling interval for stream, in milliseconds + + @param framesPerPaHostBuffer Size of PortAudio host buffer, in frames + + @param suggestedLatency Suggested latency for stream component, in seconds + + @return PortAudio error code (possibly paBufferTooBig or paInsufficientMemory) + */ +static PaError PaAsiHpi_SetupBuffers( PaAsiHpiStreamComponent *streamComp, uint32_t pollingInterval, + unsigned long framesPerPaHostBuffer, PaTime suggestedLatency ) +{ + PaError result = paNoError; + PaAsiHpiStreamInfo streamInfo; + unsigned long hpiBufferSize = 0, paHostBufferSize = 0; + + assert( streamComp ); + assert( streamComp->hpiDevice ); + + /* Obtain size of hardware buffer of HPI stream, since we will be activating BBM shortly + and afterwards the buffer size will refer to the BBM (host-side) buffer. + This is necessary to enable reliable detection of xruns. */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( streamComp, &streamInfo ) ); + streamComp->hardwareBufferSize = streamInfo.bufferSize; + hpiBufferSize = streamInfo.bufferSize; + + /* Check if BBM (background bus mastering) is to be enabled */ + if( PA_ASIHPI_USE_BBM_ ) + { + uint32_t bbmBufferSize = 0, preLatencyBufferSize = 0; + hpi_err_t hpiError = 0; + PaTime pollingOverhead; + + /* Check overhead of Pa_Sleep() call (minimum sleep duration in ms -> OS dependent) */ + pollingOverhead = PaUtil_GetTime(); + Pa_Sleep( 0 ); + pollingOverhead = 1000*(PaUtil_GetTime() - pollingOverhead); + PA_DEBUG(( "polling overhead = %f ms (length of 0-second sleep)\n", pollingOverhead )); + /* Obtain minimum recommended size for host buffer (in bytes) */ + PA_ASIHPI_UNLESS_( HPI_StreamEstimateBufferSize( &streamComp->hpiFormat, + pollingInterval + (uint32_t)ceil( pollingOverhead ), + &bbmBufferSize ), paUnanticipatedHostError ); + /* BBM places more stringent requirements on buffer size (see description */ + /* of HPI_StreamEstimateBufferSize in HPI API document) */ + bbmBufferSize *= 3; + /* Make sure the BBM buffer contains multiple PA host buffers */ + if( bbmBufferSize < 3 * streamComp->bytesPerFrame * framesPerPaHostBuffer ) + bbmBufferSize = 3 * streamComp->bytesPerFrame * framesPerPaHostBuffer; + /* Try to honor latency suggested by user by growing buffer (no decrease possible) */ + if( suggestedLatency > 0.0 ) + { + PaTime bufferDuration = ((PaTime)bbmBufferSize) / streamComp->bytesPerFrame + / streamComp->hpiFormat.dwSampleRate; + /* Don't decrease buffer */ + if( bufferDuration < suggestedLatency ) + { + /* Save old buffer size, to be retried if new size proves too big */ + preLatencyBufferSize = bbmBufferSize; + bbmBufferSize = (uint32_t)ceil( suggestedLatency * streamComp->bytesPerFrame + * streamComp->hpiFormat.dwSampleRate ); + } + } + /* Choose closest memory block boundary (HPI API document states that + "a buffer size of Nx4096 - 20 makes the best use of memory" + (under the entry for HPI_StreamEstimateBufferSize)) */ + bbmBufferSize = ((uint32_t)ceil((bbmBufferSize + 20)/4096.0))*4096 - 20; + streamComp->hostBufferSize = bbmBufferSize; + /* Allocate BBM host buffer (this enables bus mastering transfers in background) */ + if( streamComp->hpiDevice->streamIsOutput ) + hpiError = HPI_OutStreamHostBufferAllocate( NULL, + streamComp->hpiStream, + bbmBufferSize ); + else + hpiError = HPI_InStreamHostBufferAllocate( NULL, + streamComp->hpiStream, + bbmBufferSize ); + if( hpiError ) + { + /* Indicate that BBM is disabled */ + streamComp->hostBufferSize = 0; + /* Retry with smaller buffer size (transfers will still work, but not via BBM) */ + if( hpiError == HPI_ERROR_INVALID_DATASIZE ) + { + /* Retry BBM allocation with smaller size if requested latency proved too big */ + if( preLatencyBufferSize > 0 ) + { + PA_DEBUG(( "Retrying BBM allocation with smaller size (%d vs. %d bytes)\n", + preLatencyBufferSize, bbmBufferSize )); + bbmBufferSize = preLatencyBufferSize; + if( streamComp->hpiDevice->streamIsOutput ) + hpiError = HPI_OutStreamHostBufferAllocate( NULL, + streamComp->hpiStream, + bbmBufferSize ); + else + hpiError = HPI_InStreamHostBufferAllocate( NULL, + streamComp->hpiStream, + bbmBufferSize ); + /* Another round of error checking */ + if( hpiError ) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + /* No escapes this time */ + if( hpiError == HPI_ERROR_INVALID_DATASIZE ) + { + result = paBufferTooBig; + goto error; + } + else if( hpiError != HPI_ERROR_INVALID_OPERATION ) + { + result = paUnanticipatedHostError; + goto error; + } + } + else + { + streamComp->hostBufferSize = bbmBufferSize; + hpiBufferSize = bbmBufferSize; + } + } + else + { + result = paBufferTooBig; + goto error; + } + } + /* If BBM not supported, foreground transfers will be used, but not a show-stopper */ + /* Anything else is an error */ + else if (( hpiError != HPI_ERROR_INVALID_OPERATION ) && + ( hpiError != HPI_ERROR_INVALID_FUNC )) + { + PA_ASIHPI_REPORT_ERROR_( hpiError ); + result = paUnanticipatedHostError; + goto error; + } + } + else + { + hpiBufferSize = bbmBufferSize; + } + } + + /* Final check of buffer size */ + paHostBufferSize = streamComp->bytesPerFrame * framesPerPaHostBuffer; + if( hpiBufferSize < 3*paHostBufferSize ) + { + result = paBufferTooBig; + goto error; + } + /* Set cap on output buffer size, based on latency suggestions */ + if( streamComp->hpiDevice->streamIsOutput ) + { + PaTime latency = suggestedLatency > 0.0 ? suggestedLatency : + streamComp->hpiDevice->baseDeviceInfo.defaultHighOutputLatency; + streamComp->outputBufferCap = + (uint32_t)ceil( latency * streamComp->bytesPerFrame * streamComp->hpiFormat.dwSampleRate ); + /* The cap should not be too small, to prevent underflow */ + if( streamComp->outputBufferCap < 4*paHostBufferSize ) + streamComp->outputBufferCap = 4*paHostBufferSize; + } + else + { + streamComp->outputBufferCap = 0; + } + /* Temp buffer size should be multiple of PA host buffer size (or 1x, if using fixed blocks) */ + streamComp->tempBufferSize = paHostBufferSize; + /* Allocate temp buffer */ + PA_UNLESS_( streamComp->tempBuffer = (uint8_t *)PaUtil_AllocateMemory( streamComp->tempBufferSize ), + paInsufficientMemory ); +error: + return result; +} + + +/** Opens PortAudio stream. + This determines a suitable value for framesPerBuffer, if the user didn't specify it, + based on the suggested latency. It then opens each requested stream direction with the + appropriate stream format, and allocates the required stream buffers. It sets up the + various PortAudio structures dealing with streams, and estimates the stream latency. + + See pa_hostapi.h for a list of validity guarantees made about OpenStream parameters. + + @param hostApi Pointer to host API struct + + @param s List of open streams, where successfully opened stream will go + + @param inputParameters Pointer to stream parameter struct for input side of stream + + @param outputParameters Pointer to stream parameter struct for output side of stream + + @param sampleRate Desired sample rate + + @param framesPerBuffer Desired number of frames per buffer passed to user callback + (or chunk size for blocking stream) + + @param streamFlags Stream flags + + @param streamCallback Pointer to user callback function (zero for blocking interface) + + @param userData Pointer to user data that will be passed to callback function along with data + + @return PortAudio error code +*/ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream **s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaAsiHpiHostApiRepresentation *hpiHostApi = (PaAsiHpiHostApiRepresentation*)hostApi; + PaAsiHpiStream *stream = NULL; + unsigned long framesPerHostBuffer = framesPerBuffer; + int inputChannelCount = 0, outputChannelCount = 0; + PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0; + PaSampleFormat hostInputSampleFormat = 0, hostOutputSampleFormat = 0; + PaTime maxSuggestedLatency = 0.0; + + /* Validate platform-specific flags -> none expected for HPI */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform-specific flag */ + + /* Create blank stream structure */ + PA_UNLESS_( stream = (PaAsiHpiStream *)PaUtil_AllocateMemory( sizeof(PaAsiHpiStream) ), + paInsufficientMemory ); + memset( stream, 0, sizeof(PaAsiHpiStream) ); + + /* If the number of frames per buffer is unspecified, we have to come up with one. */ + if( framesPerHostBuffer == paFramesPerBufferUnspecified ) + { + if( inputParameters ) + maxSuggestedLatency = inputParameters->suggestedLatency; + if( outputParameters && (outputParameters->suggestedLatency > maxSuggestedLatency) ) + maxSuggestedLatency = outputParameters->suggestedLatency; + /* Use suggested latency if available */ + if( maxSuggestedLatency > 0.0 ) + framesPerHostBuffer = (unsigned long)ceil( maxSuggestedLatency * sampleRate ); + else + /* AudioScience cards like BIG buffers by default */ + framesPerHostBuffer = 4096; + } + /* Lower bounds on host buffer size, due to polling and HPI constraints */ + if( 1000.0*framesPerHostBuffer/sampleRate < PA_ASIHPI_MIN_POLLING_INTERVAL_ ) + framesPerHostBuffer = (unsigned long)ceil( sampleRate * PA_ASIHPI_MIN_POLLING_INTERVAL_ / 1000.0 ); + /* if( framesPerHostBuffer < PA_ASIHPI_MIN_FRAMES_ ) + framesPerHostBuffer = PA_ASIHPI_MIN_FRAMES_; */ + /* Efficient if host buffer size is integer multiple of user buffer size */ + if( framesPerBuffer > 0 ) + framesPerHostBuffer = (unsigned long)ceil( (double)framesPerHostBuffer / framesPerBuffer ) * framesPerBuffer; + /* Buffer should always be a multiple of 4 bytes to facilitate 32-bit PCI transfers. + By keeping the frames a multiple of 4, this is ensured even for 8-bit mono sound. */ + framesPerHostBuffer = (framesPerHostBuffer / 4) * 4; + /* Polling is based on time length (in milliseconds) of user-requested block size */ + stream->pollingInterval = (uint32_t)ceil( 1000.0*framesPerHostBuffer/sampleRate ); + assert( framesPerHostBuffer > 0 ); + + /* Open underlying streams, check formats and allocate buffers */ + if( inputParameters ) + { + /* Create blank stream component structure */ + PA_UNLESS_( stream->input = (PaAsiHpiStreamComponent *)PaUtil_AllocateMemory( sizeof(PaAsiHpiStreamComponent) ), + paInsufficientMemory ); + memset( stream->input, 0, sizeof(PaAsiHpiStreamComponent) ); + /* Create/validate format */ + PA_ENSURE_( PaAsiHpi_CreateFormat( hostApi, inputParameters, sampleRate, + &stream->input->hpiDevice, &stream->input->hpiFormat ) ); + /* Open stream and set format */ + PA_ENSURE_( PaAsiHpi_OpenInput( hostApi, stream->input->hpiDevice, &stream->input->hpiFormat, + &stream->input->hpiStream ) ); + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + hostInputSampleFormat = PaAsiHpi_HpiToPaFormat( stream->input->hpiFormat.wFormat ); + stream->input->bytesPerFrame = inputChannelCount * Pa_GetSampleSize( hostInputSampleFormat ); + assert( stream->input->bytesPerFrame > 0 ); + /* Allocate host and temp buffers of appropriate size */ + PA_ENSURE_( PaAsiHpi_SetupBuffers( stream->input, stream->pollingInterval, + framesPerHostBuffer, inputParameters->suggestedLatency ) ); + } + if( outputParameters ) + { + /* Create blank stream component structure */ + PA_UNLESS_( stream->output = (PaAsiHpiStreamComponent *)PaUtil_AllocateMemory( sizeof(PaAsiHpiStreamComponent) ), + paInsufficientMemory ); + memset( stream->output, 0, sizeof(PaAsiHpiStreamComponent) ); + /* Create/validate format */ + PA_ENSURE_( PaAsiHpi_CreateFormat( hostApi, outputParameters, sampleRate, + &stream->output->hpiDevice, &stream->output->hpiFormat ) ); + /* Open stream and check format */ + PA_ENSURE_( PaAsiHpi_OpenOutput( hostApi, stream->output->hpiDevice, + &stream->output->hpiFormat, + &stream->output->hpiStream ) ); + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + hostOutputSampleFormat = PaAsiHpi_HpiToPaFormat( stream->output->hpiFormat.wFormat ); + stream->output->bytesPerFrame = outputChannelCount * Pa_GetSampleSize( hostOutputSampleFormat ); + /* Allocate host and temp buffers of appropriate size */ + PA_ENSURE_( PaAsiHpi_SetupBuffers( stream->output, stream->pollingInterval, + framesPerHostBuffer, outputParameters->suggestedLatency ) ); + } + + /* Determine maximum frames per host buffer (least common denominator of input/output) */ + if( inputParameters && outputParameters ) + { + stream->maxFramesPerHostBuffer = PA_MIN( stream->input->tempBufferSize / stream->input->bytesPerFrame, + stream->output->tempBufferSize / stream->output->bytesPerFrame ); + } + else + { + stream->maxFramesPerHostBuffer = inputParameters ? stream->input->tempBufferSize / stream->input->bytesPerFrame + : stream->output->tempBufferSize / stream->output->bytesPerFrame; + } + assert( stream->maxFramesPerHostBuffer > 0 ); + /* Initialize various other stream parameters */ + stream->neverDropInput = streamFlags & paNeverDropInput; + stream->state = paAsiHpiStoppedState; + + /* Initialize either callback or blocking interface */ + if( streamCallback ) + { + PaUtil_InitializeStreamRepresentation( &stream->baseStreamRep, + &hpiHostApi->callbackStreamInterface, + streamCallback, userData ); + stream->callbackMode = 1; + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->baseStreamRep, + &hpiHostApi->blockingStreamInterface, + streamCallback, userData ); + /* Pre-allocate non-interleaved user buffer pointers for blocking interface */ + PA_UNLESS_( stream->blockingUserBufferCopy = + PaUtil_AllocateMemory( sizeof(void *) * PA_MAX( inputChannelCount, outputChannelCount ) ), + paInsufficientMemory ); + stream->callbackMode = 0; + } + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + /* Following pa_linux_alsa's lead, we operate with fixed host buffer size by default, */ + /* since other modes will invariably lead to block adaption (maybe Bounded better?) */ + PA_ENSURE_( PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, hostInputSampleFormat, + outputChannelCount, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, + framesPerBuffer, framesPerHostBuffer, paUtilFixedHostBufferSize, + streamCallback, userData ) ); + + stream->baseStreamRep.streamInfo.structVersion = 1; + stream->baseStreamRep.streamInfo.sampleRate = sampleRate; + /* Determine input latency from buffer processor and buffer sizes */ + if( stream->input ) + { + PaTime bufferDuration = ( stream->input->hostBufferSize + stream->input->hardwareBufferSize ) + / sampleRate / stream->input->bytesPerFrame; + stream->baseStreamRep.streamInfo.inputLatency = + bufferDuration + + ((PaTime)PaUtil_GetBufferProcessorInputLatencyFrames( &stream->bufferProcessor ) - + stream->maxFramesPerHostBuffer) / sampleRate; + assert( stream->baseStreamRep.streamInfo.inputLatency > 0.0 ); + } + /* Determine output latency from buffer processor and buffer sizes */ + if( stream->output ) + { + PaTime bufferDuration = ( stream->output->hostBufferSize + stream->output->hardwareBufferSize ) + / sampleRate / stream->output->bytesPerFrame; + /* Take buffer size cap into account (see PaAsiHpi_WaitForFrames) */ + if( !stream->input && (stream->output->outputBufferCap > 0) ) + { + bufferDuration = PA_MIN( bufferDuration, + stream->output->outputBufferCap / sampleRate / stream->output->bytesPerFrame ); + } + stream->baseStreamRep.streamInfo.outputLatency = + bufferDuration + + ((PaTime)PaUtil_GetBufferProcessorOutputLatencyFrames( &stream->bufferProcessor ) - + stream->maxFramesPerHostBuffer) / sampleRate; + assert( stream->baseStreamRep.streamInfo.outputLatency > 0.0 ); + } + + /* Report stream info, for debugging purposes */ + PaAsiHpi_StreamDump( stream ); + + /* Save initialized stream to PA stream list */ + *s = (PaStream*)stream; + return result; + +error: + CloseStream( (PaStream*)stream ); + return result; +} + + +/** Close PortAudio stream. + When CloseStream() is called, the multi-api layer ensures that the stream has already + been stopped or aborted. This closes the underlying HPI streams and deallocates stream + buffers and structs. + + @param s Pointer to PortAudio stream + + @return PortAudio error code +*/ +static PaError CloseStream( PaStream *s ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + + /* If stream is already gone, all is well */ + if( stream == NULL ) + return paNoError; + + /* Generic stream cleanup */ + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->baseStreamRep ); + + /* Implementation-specific details - close internal streams */ + if( stream->input ) + { + /* Close HPI stream (freeing BBM host buffer in the process, if used) */ + if( stream->input->hpiStream ) + { + PA_ASIHPI_UNLESS_( HPI_InStreamClose( NULL, + stream->input->hpiStream ), paUnanticipatedHostError ); + } + /* Free temp buffer and stream component */ + PaUtil_FreeMemory( stream->input->tempBuffer ); + PaUtil_FreeMemory( stream->input ); + } + if( stream->output ) + { + /* Close HPI stream (freeing BBM host buffer in the process, if used) */ + if( stream->output->hpiStream ) + { + PA_ASIHPI_UNLESS_( HPI_OutStreamClose( NULL, + stream->output->hpiStream ), paUnanticipatedHostError ); + } + /* Free temp buffer and stream component */ + PaUtil_FreeMemory( stream->output->tempBuffer ); + PaUtil_FreeMemory( stream->output ); + } + + PaUtil_FreeMemory( stream->blockingUserBufferCopy ); + PaUtil_FreeMemory( stream ); + +error: + return result; +} + + +/** Prime HPI output stream with silence. + This resets the output stream and uses PortAudio helper routines to fill the + temp buffer with silence. It then writes two host buffers to the stream. This is supposed + to be called before the stream is started. It has no effect on input-only streams. + + @param stream Pointer to stream struct + + @return PortAudio error code + */ +static PaError PaAsiHpi_PrimeOutputWithSilence( PaAsiHpiStream *stream ) +{ + PaError result = paNoError; + PaAsiHpiStreamComponent *out; + PaUtilZeroer *zeroer; + PaSampleFormat outputFormat; + assert( stream ); + out = stream->output; + /* Only continue if stream has output channels */ + if( !out ) + return result; + assert( out->tempBuffer ); + + /* Clear all existing data in hardware playback buffer */ + PA_ASIHPI_UNLESS_( HPI_OutStreamReset( NULL, + out->hpiStream ), paUnanticipatedHostError ); + /* Fill temp buffer with silence */ + outputFormat = PaAsiHpi_HpiToPaFormat( out->hpiFormat.wFormat ); + zeroer = PaUtil_SelectZeroer( outputFormat ); + zeroer(out->tempBuffer, 1, out->tempBufferSize / Pa_GetSampleSize(outputFormat) ); + /* Write temp buffer to hardware fifo twice, to get started */ + PA_ASIHPI_UNLESS_( HPI_OutStreamWriteBuf( NULL, out->hpiStream, + out->tempBuffer, out->tempBufferSize, &out->hpiFormat), + paUnanticipatedHostError ); + PA_ASIHPI_UNLESS_( HPI_OutStreamWriteBuf( NULL, out->hpiStream, + out->tempBuffer, out->tempBufferSize, &out->hpiFormat), + paUnanticipatedHostError ); +error: + return result; +} + + +/** Start HPI streams (both input + output). + This starts all HPI streams in the PortAudio stream. Output streams are first primed with + silence, if required. After this call the PA stream is in the Active state. + + @todo Implement priming via the user callback + + @param stream Pointer to stream struct + + @param outputPrimed True if output is already primed (if false, silence will be loaded before starting) + + @return PortAudio error code + */ +static PaError PaAsiHpi_StartStream( PaAsiHpiStream *stream, int outputPrimed ) +{ + PaError result = paNoError; + + if( stream->input ) + { + PA_ASIHPI_UNLESS_( HPI_InStreamStart( NULL, + stream->input->hpiStream ), paUnanticipatedHostError ); + } + if( stream->output ) + { + if( !outputPrimed ) + { + /* Buffer isn't primed, so load stream with silence */ + PA_ENSURE_( PaAsiHpi_PrimeOutputWithSilence( stream ) ); + } + PA_ASIHPI_UNLESS_( HPI_OutStreamStart( NULL, + stream->output->hpiStream ), paUnanticipatedHostError ); + } + stream->state = paAsiHpiActiveState; + stream->callbackFinished = 0; + + /* Report stream info for debugging purposes */ + /* PaAsiHpi_StreamDump( stream ); */ + +error: + return result; +} + + +/** Start PortAudio stream. + If the stream has a callback interface, this starts a helper thread to feed the user callback. + The thread will then take care of starting the HPI streams, and this function will block + until the streams actually start. In the case of a blocking interface, the HPI streams + are simply started. + + @param s Pointer to PortAudio stream + + @return PortAudio error code +*/ +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + + assert( stream ); + + /* Ready the processor */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + if( stream->callbackMode ) + { + /* Create and start callback engine thread */ + /* Also waits 1 second for stream to be started by engine thread (otherwise aborts) */ + PA_ENSURE_( PaUnixThread_New( &stream->thread, &CallbackThreadFunc, stream, 1., 0 /*rtSched*/ ) ); + } + else + { + PA_ENSURE_( PaAsiHpi_StartStream( stream, 0 ) ); + } + +error: + return result; +} + + +/** Stop HPI streams (input + output), either softly or abruptly. + If abort is false, the function blocks until the output stream is drained, otherwise it + stops immediately and discards data in the stream hardware buffers. + + This function is safe to call from the callback engine thread as well as the main thread. + + @param stream Pointer to stream struct + + @param abort True if samples in output buffer should be discarded (otherwise blocks until stream is done) + + @return PortAudio error code + + */ +static PaError PaAsiHpi_StopStream( PaAsiHpiStream *stream, int abort ) +{ + PaError result = paNoError; + + assert( stream ); + + /* Input channels */ + if( stream->input ) + { + PA_ASIHPI_UNLESS_( HPI_InStreamReset( NULL, + stream->input->hpiStream ), paUnanticipatedHostError ); + } + /* Output channels */ + if( stream->output ) + { + if( !abort ) + { + /* Wait until HPI output stream is drained */ + while( 1 ) + { + PaAsiHpiStreamInfo streamInfo; + PaTime timeLeft; + + /* Obtain number of samples waiting to be played */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->output, &streamInfo ) ); + /* Check if stream is drained */ + if( (streamInfo.state != HPI_STATE_PLAYING) && + (streamInfo.dataSize < stream->output->bytesPerFrame * PA_ASIHPI_MIN_FRAMES_) ) + break; + /* Sleep amount of time represented by remaining samples */ + timeLeft = 1000.0 * streamInfo.dataSize / stream->output->bytesPerFrame + / stream->baseStreamRep.streamInfo.sampleRate; + Pa_Sleep( (long)ceil( timeLeft ) ); + } + } + PA_ASIHPI_UNLESS_( HPI_OutStreamReset( NULL, + stream->output->hpiStream ), paUnanticipatedHostError ); + } + + /* Report stream info for debugging purposes */ + /* PaAsiHpi_StreamDump( stream ); */ + +error: + return result; +} + + +/** Stop or abort PortAudio stream. + + This function is used to explicitly stop the PortAudio stream (via StopStream/AbortStream), + as opposed to the situation when the callback finishes with a result other than paContinue. + If a stream is in callback mode we will have to inspect whether the background thread has + finished, or we will have to take it out. In either case we join the thread before returning. + In blocking mode, we simply tell HPI to stop abruptly (abort) or finish buffers (drain). + The PortAudio stream will be in the Stopped state after a call to this function. + + Don't call this from the callback engine thread! + + @param stream Pointer to stream struct + + @param abort True if samples in output buffer should be discarded (otherwise blocks until stream is done) + + @return PortAudio error code +*/ +static PaError PaAsiHpi_ExplicitStop( PaAsiHpiStream *stream, int abort ) +{ + PaError result = paNoError; + + /* First deal with the callback thread, cancelling and/or joining it if necessary */ + if( stream->callbackMode ) + { + PaError threadRes; + stream->callbackAbort = abort; + if( abort ) + { + PA_DEBUG(( "Aborting callback\n" )); + } + else + { + PA_DEBUG(( "Stopping callback\n" )); + } + PA_ENSURE_( PaUnixThread_Terminate( &stream->thread, !abort, &threadRes ) ); + if( threadRes != paNoError ) + { + PA_DEBUG(( "Callback thread returned: %d\n", threadRes )); + } + } + else + { + PA_ENSURE_( PaAsiHpi_StopStream( stream, abort ) ); + } + + stream->state = paAsiHpiStoppedState; + +error: + return result; +} + + +/** Stop PortAudio stream. + This blocks until the output buffers are drained. + + @param s Pointer to PortAudio stream + + @return PortAudio error code +*/ +static PaError StopStream( PaStream *s ) +{ + return PaAsiHpi_ExplicitStop( (PaAsiHpiStream *) s, 0 ); +} + + +/** Abort PortAudio stream. + This discards any existing data in output buffers and stops the stream immediately. + + @param s Pointer to PortAudio stream + + @return PortAudio error code +*/ +static PaError AbortStream( PaStream *s ) +{ + return PaAsiHpi_ExplicitStop( (PaAsiHpiStream * ) s, 1 ); +} + + +/** Determine whether the stream is stopped. + A stream is considered to be stopped prior to a successful call to StartStream and after + a successful call to StopStream or AbortStream. If a stream callback returns a value other + than paContinue the stream is NOT considered to be stopped (it is in CallbackFinished state). + + @param s Pointer to PortAudio stream + + @return Returns one (1) when the stream is stopped, zero (0) when the stream is running, or + a PaErrorCode (which are always negative) if PortAudio is not initialized or an + error is encountered. +*/ +static PaError IsStreamStopped( PaStream *s ) +{ + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + + assert( stream ); + return stream->state == paAsiHpiStoppedState ? 1 : 0; +} + + +/** Determine whether the stream is active. + A stream is active after a successful call to StartStream(), until it becomes inactive either + as a result of a call to StopStream() or AbortStream(), or as a result of a return value + other than paContinue from the stream callback. In the latter case, the stream is considered + inactive after the last buffer has finished playing. + + @param s Pointer to PortAudio stream + + @return Returns one (1) when the stream is active (i.e. playing or recording audio), + zero (0) when not playing, or a PaErrorCode (which are always negative) + if PortAudio is not initialized or an error is encountered. +*/ +static PaError IsStreamActive( PaStream *s ) +{ + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + + assert( stream ); + return stream->state == paAsiHpiActiveState ? 1 : 0; +} + + +/** Returns current stream time. + This corresponds to the system clock. The clock should run continuously while the stream + is open, i.e. between calls to OpenStream() and CloseStream(), therefore a frame counter + is not good enough. + + @param s Pointer to PortAudio stream + + @return Stream time, in seconds + */ +static PaTime GetStreamTime( PaStream *s ) +{ + return PaUtil_GetTime(); +} + + +/** Returns CPU load. + + @param s Pointer to PortAudio stream + + @return CPU load (0.0 if blocking interface is used) + */ +static double GetStreamCpuLoad( PaStream *s ) +{ + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + + return stream->callbackMode ? PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ) : 0.0; +} + +/* --------------------------- Callback Interface --------------------------- */ + +/** Exit routine which is called when callback thread quits. + This takes care of stopping the HPI streams (either waiting for output to finish, or + abruptly). It also calls the user-supplied StreamFinished callback, and sets the + stream state to CallbackFinished if it was reached via a non-paContinue return from + the user callback function. + + @param userData A pointer to an open stream previously created with Pa_OpenStream + */ +static void PaAsiHpi_OnThreadExit( void *userData ) +{ + PaAsiHpiStream *stream = (PaAsiHpiStream *) userData; + + assert( stream ); + + PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); + + PA_DEBUG(( "%s: Stopping HPI streams\n", __FUNCTION__ )); + PaAsiHpi_StopStream( stream, stream->callbackAbort ); + PA_DEBUG(( "%s: Stoppage\n", __FUNCTION__ )); + + /* Eventually notify user all buffers have played */ + if( stream->baseStreamRep.streamFinishedCallback ) + { + stream->baseStreamRep.streamFinishedCallback( stream->baseStreamRep.userData ); + } + + /* Unfortunately both explicit calls to Stop/AbortStream (leading to Stopped state) + and implicit stops via paComplete/paAbort (leading to CallbackFinished state) + end up here - need another flag to remind us which is the case */ + if( stream->callbackFinished ) + stream->state = paAsiHpiCallbackFinishedState; +} + + +/** Wait until there is enough frames to fill a host buffer. + The routine attempts to sleep until at least a full host buffer can be retrieved from the + input HPI stream and passed to the output HPI stream. It will first sleep until enough + output space is available, as this is usually easily achievable. If it is an output-only + stream, it will also sleep if the hardware buffer is too full, thereby throttling the + filling of the output buffer and reducing output latency. The routine then blocks until + enough input samples are available, unless this will cause an output underflow. In the + process, input overflows and output underflows are indicated. + + @param stream Pointer to stream struct + + @param framesAvail Returns the number of available frames + + @param cbFlags Overflows and underflows indicated in here + + @return PortAudio error code (only paUnanticipatedHostError expected) + */ +static PaError PaAsiHpi_WaitForFrames( PaAsiHpiStream *stream, unsigned long *framesAvail, + PaStreamCallbackFlags *cbFlags ) +{ + PaError result = paNoError; + double sampleRate; + unsigned long framesTarget; + uint32_t outputData = 0, outputSpace = 0, inputData = 0, framesLeft = 0; + + assert( stream ); + assert( stream->input || stream->output ); + + sampleRate = stream->baseStreamRep.streamInfo.sampleRate; + /* We have to come up with this much frames on both input and output */ + framesTarget = stream->bufferProcessor.framesPerHostBuffer; + assert( framesTarget > 0 ); + + while( 1 ) + { + PaAsiHpiStreamInfo info; + /* Check output first, as this takes priority in the default full-duplex mode */ + if( stream->output ) + { + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->output, &info ) ); + /* Wait until enough space is available in output buffer to receive a full block */ + if( info.availableFrames < framesTarget ) + { + framesLeft = framesTarget - info.availableFrames; + Pa_Sleep( (long)ceil( 1000 * framesLeft / sampleRate ) ); + continue; + } + /* Wait until the data in hardware buffer has dropped to a sensible level. + Without this, the hardware buffer quickly fills up in the absence of an input + stream to regulate its data rate (if data generation is fast). This leads to + large latencies, as the AudioScience hardware buffers are humongous. + This is similar to the default "Hardware Buffering=off" option in the + AudioScience WAV driver. */ + if( !stream->input && (stream->output->outputBufferCap > 0) && + ( info.totalBufferedData > stream->output->outputBufferCap / stream->output->bytesPerFrame ) ) + { + framesLeft = info.totalBufferedData - stream->output->outputBufferCap / stream->output->bytesPerFrame; + Pa_Sleep( (long)ceil( 1000 * framesLeft / sampleRate ) ); + continue; + } + outputData = info.totalBufferedData; + outputSpace = info.availableFrames; + /* Report output underflow to callback */ + if( info.underflow ) + { + *cbFlags |= paOutputUnderflow; + } + } + + /* Now check input side */ + if( stream->input ) + { + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->input, &info ) ); + /* If a full block of samples hasn't been recorded yet, wait for it if possible */ + if( info.availableFrames < framesTarget ) + { + framesLeft = framesTarget - info.availableFrames; + /* As long as output is not disrupted in the process, wait for a full + block of input samples */ + if( !stream->output || (outputData > framesLeft) ) + { + Pa_Sleep( (long)ceil( 1000 * framesLeft / sampleRate ) ); + continue; + } + } + inputData = info.availableFrames; + /** @todo The paInputOverflow flag should be set in the callback containing the + first input sample following the overflow. That means the block currently sitting + at the fore-front of recording, i.e. typically the one containing the newest (last) + sample in the HPI buffer system. This is most likely not the same as the current + block of data being passed to the callback. The current overflow should ideally + be noted in an overflow list of sorts, with an indication of when it should be + reported. The trouble starts if there are several separate overflow incidents, + given a big input buffer. Oh well, something to try out later... */ + if( info.overflow ) + { + *cbFlags |= paInputOverflow; + } + } + break; + } + /* Full-duplex stream */ + if( stream->input && stream->output ) + { + if( outputSpace >= framesTarget ) + *framesAvail = outputSpace; + /* If input didn't make the target, keep the output count instead (input underflow) */ + if( (inputData >= framesTarget) && (inputData < outputSpace) ) + *framesAvail = inputData; + } + else + { + *framesAvail = stream->input ? inputData : outputSpace; + } + +error: + return result; +} + + +/** Obtain recording, current and playback timestamps of stream. + The current time is determined by the system clock. This "now" timestamp occurs at the + forefront of recording (and playback in the full-duplex case), which happens later than the + input timestamp by an amount equal to the total number of recorded frames in the input buffer. + The output timestamp indicates when the next generated sample will actually be played. This + happens after all the samples currently in the output buffer are played. The output timestamp + therefore follows the current timestamp by an amount equal to the number of frames yet to be + played back in the output buffer. + + If the current timestamp is the present, the input timestamp is in the past and the output + timestamp is in the future. + + @param stream Pointer to stream struct + + @param timeInfo Pointer to timeInfo struct that will contain timestamps + */ +static void PaAsiHpi_CalculateTimeInfo( PaAsiHpiStream *stream, PaStreamCallbackTimeInfo *timeInfo ) +{ + PaAsiHpiStreamInfo streamInfo; + double sampleRate; + + assert( stream ); + assert( timeInfo ); + sampleRate = stream->baseStreamRep.streamInfo.sampleRate; + + /* The current time ("now") is at the forefront of both recording and playback */ + timeInfo->currentTime = GetStreamTime( (PaStream *)stream ); + /* The last sample in the input buffer was recorded just now, so the first sample + happened (number of recorded samples)/sampleRate ago */ + timeInfo->inputBufferAdcTime = timeInfo->currentTime; + if( stream->input ) + { + PaAsiHpi_GetStreamInfo( stream->input, &streamInfo ); + timeInfo->inputBufferAdcTime -= streamInfo.totalBufferedData / sampleRate; + } + /* The first of the outgoing samples will be played after all the samples in the output + buffer is done */ + timeInfo->outputBufferDacTime = timeInfo->currentTime; + if( stream->output ) + { + PaAsiHpi_GetStreamInfo( stream->output, &streamInfo ); + timeInfo->outputBufferDacTime += streamInfo.totalBufferedData / sampleRate; + } +} + + +/** Read from HPI input stream and register buffers. + This reads data from the HPI input stream (if it exists) and registers the temp stream + buffers of both input and output streams with the buffer processor. In the process it also + handles input underflows in the full-duplex case. + + @param stream Pointer to stream struct + + @param numFrames On entrance the number of available frames, on exit the number of + received frames + + @param cbFlags Indicates overflows and underflows + + @return PortAudio error code + */ +static PaError PaAsiHpi_BeginProcessing( PaAsiHpiStream *stream, unsigned long *numFrames, + PaStreamCallbackFlags *cbFlags ) +{ + PaError result = paNoError; + + assert( stream ); + if( *numFrames > stream->maxFramesPerHostBuffer ) + *numFrames = stream->maxFramesPerHostBuffer; + + if( stream->input ) + { + PaAsiHpiStreamInfo info; + + uint32_t framesToGet = *numFrames; + + /* Check for overflows and underflows yet again */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->input, &info ) ); + if( info.overflow ) + { + *cbFlags |= paInputOverflow; + } + /* Input underflow if less than expected number of samples pitch up */ + if( framesToGet > info.availableFrames ) + { + PaUtilZeroer *zeroer; + PaSampleFormat inputFormat; + + /* Never call an input-only stream with InputUnderflow set */ + if( stream->output ) + *cbFlags |= paInputUnderflow; + framesToGet = info.availableFrames; + /* Fill temp buffer with silence (to make up for missing input samples) */ + inputFormat = PaAsiHpi_HpiToPaFormat( stream->input->hpiFormat.wFormat ); + zeroer = PaUtil_SelectZeroer( inputFormat ); + zeroer(stream->input->tempBuffer, 1, + stream->input->tempBufferSize / Pa_GetSampleSize(inputFormat) ); + } + + /* Read block of data into temp buffer */ + PA_ASIHPI_UNLESS_( HPI_InStreamReadBuf( NULL, + stream->input->hpiStream, + stream->input->tempBuffer, + framesToGet * stream->input->bytesPerFrame), + paUnanticipatedHostError ); + /* Register temp buffer with buffer processor (always FULL buffer) */ + PaUtil_SetInputFrameCount( &stream->bufferProcessor, *numFrames ); + /* HPI interface only allows interleaved channels */ + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, + 0, stream->input->tempBuffer, + stream->input->hpiFormat.wChannels ); + } + if( stream->output ) + { + /* Register temp buffer with buffer processor */ + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, *numFrames ); + /* HPI interface only allows interleaved channels */ + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, + 0, stream->output->tempBuffer, + stream->output->hpiFormat.wChannels ); + } + +error: + return result; +} + + +/** Flush output buffers to HPI output stream. + This completes the processing cycle by writing the temp buffer to the HPI interface. + Additional output underflows are caught before data is written to the stream, as this + action typically remedies the underflow and hides it in the process. + + @param stream Pointer to stream struct + + @param numFrames The number of frames to write to the output stream + + @param cbFlags Indicates overflows and underflows + */ +static PaError PaAsiHpi_EndProcessing( PaAsiHpiStream *stream, unsigned long numFrames, + PaStreamCallbackFlags *cbFlags ) +{ + PaError result = paNoError; + + assert( stream ); + + if( stream->output ) + { + PaAsiHpiStreamInfo info; + /* Check for underflows after the (potentially time-consuming) callback */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->output, &info ) ); + if( info.underflow ) + { + *cbFlags |= paOutputUnderflow; + } + + /* Write temp buffer to HPI stream */ + PA_ASIHPI_UNLESS_( HPI_OutStreamWriteBuf( NULL, + stream->output->hpiStream, + stream->output->tempBuffer, + numFrames * stream->output->bytesPerFrame, + &stream->output->hpiFormat), + paUnanticipatedHostError ); + } + +error: + return result; +} + + +/** Main callback engine. + This function runs in a separate thread and does all the work of fetching audio data from + the AudioScience card via the HPI interface, feeding it to the user callback via the buffer + processor, and delivering the resulting output data back to the card via HPI calls. + It is started and terminated when the PortAudio stream is started and stopped, and starts + the HPI streams on startup. + + @param userData A pointer to an open stream previously created with Pa_OpenStream. +*/ +static void *CallbackThreadFunc( void *userData ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream *) userData; + int callbackResult = paContinue; + + assert( stream ); + + /* Cleanup routine stops streams on thread exit */ + pthread_cleanup_push( &PaAsiHpi_OnThreadExit, stream ); + + /* Start HPI streams and notify parent when we're done */ + PA_ENSURE_( PaUnixThread_PrepareNotify( &stream->thread ) ); + /* Buffer will be primed with silence */ + PA_ENSURE_( PaAsiHpi_StartStream( stream, 0 ) ); + PA_ENSURE_( PaUnixThread_NotifyParent( &stream->thread ) ); + + /* MAIN LOOP */ + while( 1 ) + { + PaStreamCallbackFlags cbFlags = 0; + unsigned long framesAvail, framesGot; + + pthread_testcancel(); + + /** @concern StreamStop if the main thread has requested a stop and the stream has not + * been effectively stopped we signal this condition by modifying callbackResult + * (we'll want to flush buffered output). */ + if( PaUnixThread_StopRequested( &stream->thread ) && (callbackResult == paContinue) ) + { + PA_DEBUG(( "Setting callbackResult to paComplete\n" )); + callbackResult = paComplete; + } + + /* Start winding down thread if requested */ + if( callbackResult != paContinue ) + { + stream->callbackAbort = (callbackResult == paAbort); + if( stream->callbackAbort || + /** @concern BlockAdaption: Go on if adaption buffers are empty */ + PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) + { + goto end; + } + PA_DEBUG(( "%s: Flushing buffer processor\n", __FUNCTION__ )); + /* There is still buffered output that needs to be processed */ + } + + /* SLEEP */ + /* Wait for data (or buffer space) to become available. This basically sleeps and + polls the HPI interface until a full block of frames can be moved. */ + PA_ENSURE_( PaAsiHpi_WaitForFrames( stream, &framesAvail, &cbFlags ) ); + + /* Consume buffer space. Once we have a number of frames available for consumption we + must retrieve the data from the HPI interface and pass it to the PA buffer processor. + We should be prepared to process several chunks successively. */ + while( framesAvail > 0 ) + { + PaStreamCallbackTimeInfo timeInfo = {0, 0, 0}; + + pthread_testcancel(); + + framesGot = framesAvail; + if( stream->bufferProcessor.hostBufferSizeMode == paUtilFixedHostBufferSize ) + { + /* We've committed to a fixed host buffer size, stick to that */ + framesGot = framesGot >= stream->maxFramesPerHostBuffer ? stream->maxFramesPerHostBuffer : 0; + } + else + { + /* We've committed to an upper bound on the size of host buffers */ + assert( stream->bufferProcessor.hostBufferSizeMode == paUtilBoundedHostBufferSize ); + framesGot = PA_MIN( framesGot, stream->maxFramesPerHostBuffer ); + } + + /* Obtain buffer timestamps */ + PaAsiHpi_CalculateTimeInfo( stream, &timeInfo ); + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, cbFlags ); + /* CPU load measurement should include processing activivity external to the stream callback */ + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + if( framesGot > 0 ) + { + /* READ FROM HPI INPUT STREAM */ + PA_ENSURE_( PaAsiHpi_BeginProcessing( stream, &framesGot, &cbFlags ) ); + /* Input overflow in a full-duplex stream makes for interesting times */ + if( stream->input && stream->output && (cbFlags & paInputOverflow) ) + { + /* Special full-duplex paNeverDropInput mode */ + if( stream->neverDropInput ) + { + PaUtil_SetNoOutput( &stream->bufferProcessor ); + cbFlags |= paOutputOverflow; + } + } + /* CALL USER CALLBACK WITH INPUT DATA, AND OBTAIN OUTPUT DATA */ + PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + /* Clear overflow and underflow information (but PaAsiHpi_EndProcessing might + still show up output underflow that will carry over to next round) */ + cbFlags = 0; + /* WRITE TO HPI OUTPUT STREAM */ + PA_ENSURE_( PaAsiHpi_EndProcessing( stream, framesGot, &cbFlags ) ); + /* Advance frame counter */ + framesAvail -= framesGot; + } + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesGot ); + + if( framesGot == 0 ) + { + /* Go back to polling for more frames */ + break; + + } + if( callbackResult != paContinue ) + break; + } + } + + /* This code is unreachable, but important to include regardless because it + * is possibly a macro with a closing brace to match the opening brace in + * pthread_cleanup_push() above. The documentation states that they must + * always occur in pairs. */ + pthread_cleanup_pop( 1 ); + +end: + /* Indicates normal exit of callback, as opposed to the thread getting killed explicitly */ + stream->callbackFinished = 1; + PA_DEBUG(( "%s: Thread %d exiting (callbackResult = %d)\n ", + __FUNCTION__, pthread_self(), callbackResult )); + /* Exit from thread and report any PortAudio error in the process */ + PaUnixThreading_EXIT( result ); +error: + goto end; +} + +/* --------------------------- Blocking Interface --------------------------- */ + +/* As separate stream interfaces are used for blocking and callback streams, the following + functions can be guaranteed to only be called for blocking streams. */ + +/** Read data from input stream. + This reads the indicated number of frames into the supplied buffer from an input stream, + and blocks until this is done. + + @param s Pointer to PortAudio stream + + @param buffer Pointer to buffer that will receive interleaved data (or an array of pointers + to a buffer for each non-interleaved channel) + + @param frames Number of frames to read from stream + + @return PortAudio error code (also indicates overflow via paInputOverflowed) + */ +static PaError ReadStream( PaStream *s, + void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + PaAsiHpiStreamInfo info; + void *userBuffer; + + assert( stream ); + PA_UNLESS_( stream->input, paCanNotReadFromAnOutputOnlyStream ); + + /* Check for input overflow since previous call to ReadStream */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->input, &info ) ); + if( info.overflow ) + { + result = paInputOverflowed; + } + + /* NB Make copy of user buffer pointers, since they are advanced by buffer processor */ + if( stream->bufferProcessor.userInputIsInterleaved ) + { + userBuffer = buffer; + } + else + { + /* Copy channels into local array */ + userBuffer = stream->blockingUserBufferCopy; + memcpy( userBuffer, buffer, sizeof (void *) * stream->input->hpiFormat.wChannels ); + } + + while( frames > 0 ) + { + unsigned long framesGot, framesAvail; + PaStreamCallbackFlags cbFlags = 0; + + PA_ENSURE_( PaAsiHpi_WaitForFrames( stream, &framesAvail, &cbFlags ) ); + framesGot = PA_MIN( framesAvail, frames ); + PA_ENSURE_( PaAsiHpi_BeginProcessing( stream, &framesGot, &cbFlags ) ); + + if( framesGot > 0 ) + { + framesGot = PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, framesGot ); + PA_ENSURE_( PaAsiHpi_EndProcessing( stream, framesGot, &cbFlags ) ); + /* Advance frame counter */ + frames -= framesGot; + } + } + +error: + return result; +} + + +/** Write data to output stream. + This writes the indicated number of frames from the supplied buffer to an output stream, + and blocks until this is done. + + @param s Pointer to PortAudio stream + + @param buffer Pointer to buffer that provides interleaved data (or an array of pointers + to a buffer for each non-interleaved channel) + + @param frames Number of frames to write to stream + + @return PortAudio error code (also indicates underflow via paOutputUnderflowed) + */ +static PaError WriteStream( PaStream *s, + const void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + PaAsiHpiStreamInfo info; + const void *userBuffer; + + assert( stream ); + PA_UNLESS_( stream->output, paCanNotWriteToAnInputOnlyStream ); + + /* Check for output underflow since previous call to WriteStream */ + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->output, &info ) ); + if( info.underflow ) + { + result = paOutputUnderflowed; + } + + /* NB Make copy of user buffer pointers, since they are advanced by buffer processor */ + if( stream->bufferProcessor.userOutputIsInterleaved ) + { + userBuffer = buffer; + } + else + { + /* Copy channels into local array */ + userBuffer = stream->blockingUserBufferCopy; + memcpy( (void *)userBuffer, buffer, sizeof (void *) * stream->output->hpiFormat.wChannels ); + } + + while( frames > 0 ) + { + unsigned long framesGot, framesAvail; + PaStreamCallbackFlags cbFlags = 0; + + PA_ENSURE_( PaAsiHpi_WaitForFrames( stream, &framesAvail, &cbFlags ) ); + framesGot = PA_MIN( framesAvail, frames ); + PA_ENSURE_( PaAsiHpi_BeginProcessing( stream, &framesGot, &cbFlags ) ); + + if( framesGot > 0 ) + { + framesGot = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, framesGot ); + PA_ENSURE_( PaAsiHpi_EndProcessing( stream, framesGot, &cbFlags ) ); + /* Advance frame counter */ + frames -= framesGot; + } + } + +error: + return result; +} + + +/** Number of frames that can be read from input stream without blocking. + + @param s Pointer to PortAudio stream + + @return Number of frames, or PortAudio error code + */ +static signed long GetStreamReadAvailable( PaStream *s ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + PaAsiHpiStreamInfo info; + + assert( stream ); + PA_UNLESS_( stream->input, paCanNotReadFromAnOutputOnlyStream ); + + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->input, &info ) ); + /* Round down to the nearest host buffer multiple */ + result = (info.availableFrames / stream->maxFramesPerHostBuffer) * stream->maxFramesPerHostBuffer; + if( info.overflow ) + { + result = paInputOverflowed; + } + +error: + return result; +} + + +/** Number of frames that can be written to output stream without blocking. + + @param s Pointer to PortAudio stream + + @return Number of frames, or PortAudio error code + */ +static signed long GetStreamWriteAvailable( PaStream *s ) +{ + PaError result = paNoError; + PaAsiHpiStream *stream = (PaAsiHpiStream*)s; + PaAsiHpiStreamInfo info; + + assert( stream ); + PA_UNLESS_( stream->output, paCanNotWriteToAnInputOnlyStream ); + + PA_ENSURE_( PaAsiHpi_GetStreamInfo( stream->output, &info ) ); + /* Round down to the nearest host buffer multiple */ + result = (info.availableFrames / stream->maxFramesPerHostBuffer) * stream->maxFramesPerHostBuffer; + if( info.underflow ) + { + result = paOutputUnderflowed; + } + +error: + return result; +} diff --git a/Externals/portaudio/src/hostapi/asio/ASIO-README.txt b/Externals/portaudio/src/hostapi/asio/ASIO-README.txt new file mode 100644 index 0000000000..bc86caa5be --- /dev/null +++ b/Externals/portaudio/src/hostapi/asio/ASIO-README.txt @@ -0,0 +1,147 @@ +ASIO-README.txt + +This document contains information to help you compile PortAudio with +ASIO support. If you find any omissions or errors in this document +please notify us on the PortAudio mailing list. + +NOTE: The Macintosh sections of this document are provided for historical +reference. They refer to pre-OS X Macintosh. PortAudio no longer +supports pre-OS X Macintosh. Steinberg does not support ASIO on Mac OS X. + + +Building PortAudio with ASIO support +------------------------------------ + +To build PortAudio with ASIO support you need to compile and link with +pa_asio.c, and files from the ASIO SDK (see below), along with the common +PortAudio files from src/common/ and platform specific files from +src/os/win/ (for Win32). + +If you are compiling with a non-Microsoft compiler on Windows, also +compile and link with iasiothiscallresolver.cpp (see below for +an explanation). + +For some platforms (MingW, Cygwin/MingW), you may simply +be able to type: + +./configure --with-host_os=mingw --with-winapi=asio [--with-asiodir=/usr/local/asiosdk2] +make + +and life will be good. Make sure you update the above with the correct local +path to the ASIO SDK. + + +For Microsoft Visual C++ there is an build tutorial here: +http://www.portaudio.com/trac/wiki/TutorialDir/Compile/WindowsASIOMSVC + + + +Obtaining the ASIO SDK +---------------------- + +In order to build PortAudio with ASIO support, you need to download +the ASIO SDK (version 2.0 or later) from Steinberg. Steinberg makes the ASIO +SDK available to anyone free of charge, however they do not permit its +source code to be distributed. + +NOTE: In some cases the ASIO SDK may require patching, see below +for further details. + +http://www.steinberg.net/en/company/developer.html + +If the above link is broken search Google for: +"download steinberg ASIO SDK" + + + +Building the ASIO SDK on Windows +-------------------------------- + +To build the ASIO SDK on Windows you need to compile and link with the +following files from the ASIO SDK: + +asio_sdk\common\asio.cpp +asio_sdk\host\asiodrivers.cpp +asio_sdk\host\pc\asiolist.cpp + +You may also need to adjust your include paths to support inclusion of +header files from the above directories. + +The ASIO SDK depends on the following COM API functions: +CoInitialize, CoUninitialize, CoCreateInstance, CLSIDFromString +For compilation with MinGW you will need to link with -lole32, for +Borland compilers link with Import32.lib. + + + +Non-Microsoft (MSVC) Compilers on Windows including Borland and GCC +------------------------------------------------------------------- + +Steinberg did not specify a calling convention in the IASIO interface +definition. This causes the Microsoft compiler to use the proprietary +thiscall convention which is not compatible with other compilers, such +as compilers from Borland (BCC and C++Builder) and GNU (gcc). +Steinberg's ASIO SDK will compile but crash on initialization if +compiled with a non-Microsoft compiler on Windows. + +PortAudio solves this problem using the iasiothiscallresolver library +which is included in the distribution. When building ASIO support for +non-Microsoft compilers, be sure to compile and link with +iasiothiscallresolver.cpp. Note that iasiothiscallresolver includes +conditional directives which cause it to have no effect if it is +compiled with a Microsoft compiler, or on the Macintosh. + +If you use configure and make (see above), this should be handled +automatically for you. + +For further information about the IASIO thiscall problem see this page: +http://www.rossbencina.com/code/iasio-thiscall-resolver + + + +Building the ASIO SDK on (Pre-OS X) Macintosh +--------------------------------------------- + +To build the ASIO SDK on Macintosh you need to compile and link with the +following files from the ASIO SDK: + +host/asiodrivers.cpp +host/mac/asioshlib.cpp +host/mac/codefragements.cpp + +You may also need to adjust your include paths to support inclusion of +header files from the above directories. + + + +(Pre-OS X) Macintosh ASIO SDK Bug Patch +--------------------------------------- + +There is a bug in the ASIO SDK that causes the Macintosh version to +often fail during initialization. Below is a patch that you can apply. + +In codefragments.cpp replace getFrontProcessDirectory function with +the following one (GetFrontProcess replaced by GetCurrentProcess). + + +bool CodeFragments::getFrontProcessDirectory(void *specs) +{ + FSSpec *fss = (FSSpec *)specs; + ProcessInfoRec pif; + ProcessSerialNumber psn; + + memset(&psn,0,(long)sizeof(ProcessSerialNumber)); + // if(GetFrontProcess(&psn) == noErr) // wrong !!! + if(GetCurrentProcess(&psn) == noErr) // correct !!! + { + pif.processName = 0; + pif.processAppSpec = fss; + pif.processInfoLength = sizeof(ProcessInfoRec); + if(GetProcessInformation(&psn, &pif) == noErr) + return true; + } + return false; +} + + +### diff --git a/Externals/portaudio/src/hostapi/asio/Callback_adaptation_.pdf b/Externals/portaudio/src/hostapi/asio/Callback_adaptation_.pdf new file mode 100644 index 0000000000..76bf678635 Binary files /dev/null and b/Externals/portaudio/src/hostapi/asio/Callback_adaptation_.pdf differ diff --git a/Externals/portaudio/src/hostapi/asio/Pa_ASIO.pdf b/Externals/portaudio/src/hostapi/asio/Pa_ASIO.pdf new file mode 100644 index 0000000000..ac5ecadbc9 Binary files /dev/null and b/Externals/portaudio/src/hostapi/asio/Pa_ASIO.pdf differ diff --git a/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.cpp b/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.cpp new file mode 100644 index 0000000000..08c55eacfc --- /dev/null +++ b/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.cpp @@ -0,0 +1,572 @@ +/* + IASIOThiscallResolver.cpp see the comments in iasiothiscallresolver.h for + the top level description - this comment describes the technical details of + the implementation. + + The latest version of this file is available from: + http://www.audiomulch.com/~rossb/code/calliasio + + please email comments to Ross Bencina + + BACKGROUND + + The IASIO interface declared in the Steinberg ASIO 2 SDK declares + functions with no explicit calling convention. This causes MSVC++ to default + to using the thiscall convention, which is a proprietary convention not + implemented by some non-microsoft compilers - notably borland BCC, + C++Builder, and gcc. MSVC++ is the defacto standard compiler used by + Steinberg. As a result of this situation, the ASIO sdk will compile with + any compiler, however attempting to execute the compiled code will cause a + crash due to different default calling conventions on non-Microsoft + compilers. + + IASIOThiscallResolver solves the problem by providing an adapter class that + delegates to the IASIO interface using the correct calling convention + (thiscall). Due to the lack of support for thiscall in the Borland and GCC + compilers, the calls have been implemented in assembly language. + + A number of macros are defined for thiscall function calls with different + numbers of parameters, with and without return values - it may be possible + to modify the format of these macros to make them work with other inline + assemblers. + + + THISCALL DEFINITION + + A number of definitions of the thiscall calling convention are floating + around the internet. The following definition has been validated against + output from the MSVC++ compiler: + + For non-vararg functions, thiscall works as follows: the object (this) + pointer is passed in ECX. All arguments are passed on the stack in + right to left order. The return value is placed in EAX. The callee + clears the passed arguments from the stack. + + + FINDING FUNCTION POINTERS FROM AN IASIO POINTER + + The first field of a COM object is a pointer to its vtble. Thus a pointer + to an object implementing the IASIO interface also points to a pointer to + that object's vtbl. The vtble is a table of function pointers for all of + the virtual functions exposed by the implemented interfaces. + + If we consider a variable declared as a pointer to IASO: + + IASIO *theAsioDriver + + theAsioDriver points to: + + object implementing IASIO + { + IASIOvtbl *vtbl + other data + } + + in other words, theAsioDriver points to a pointer to an IASIOvtbl + + vtbl points to a table of function pointers: + + IASIOvtbl ( interface IASIO : public IUnknown ) + { + (IUnknown functions) + 0 virtual HRESULT STDMETHODCALLTYPE (*QueryInterface)(REFIID riid, void **ppv) = 0; + 4 virtual ULONG STDMETHODCALLTYPE (*AddRef)() = 0; + 8 virtual ULONG STDMETHODCALLTYPE (*Release)() = 0; + + (IASIO functions) + 12 virtual ASIOBool (*init)(void *sysHandle) = 0; + 16 virtual void (*getDriverName)(char *name) = 0; + 20 virtual long (*getDriverVersion)() = 0; + 24 virtual void (*getErrorMessage)(char *string) = 0; + 28 virtual ASIOError (*start)() = 0; + 32 virtual ASIOError (*stop)() = 0; + 36 virtual ASIOError (*getChannels)(long *numInputChannels, long *numOutputChannels) = 0; + 40 virtual ASIOError (*getLatencies)(long *inputLatency, long *outputLatency) = 0; + 44 virtual ASIOError (*getBufferSize)(long *minSize, long *maxSize, + long *preferredSize, long *granularity) = 0; + 48 virtual ASIOError (*canSampleRate)(ASIOSampleRate sampleRate) = 0; + 52 virtual ASIOError (*getSampleRate)(ASIOSampleRate *sampleRate) = 0; + 56 virtual ASIOError (*setSampleRate)(ASIOSampleRate sampleRate) = 0; + 60 virtual ASIOError (*getClockSources)(ASIOClockSource *clocks, long *numSources) = 0; + 64 virtual ASIOError (*setClockSource)(long reference) = 0; + 68 virtual ASIOError (*getSamplePosition)(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; + 72 virtual ASIOError (*getChannelInfo)(ASIOChannelInfo *info) = 0; + 76 virtual ASIOError (*createBuffers)(ASIOBufferInfo *bufferInfos, long numChannels, + long bufferSize, ASIOCallbacks *callbacks) = 0; + 80 virtual ASIOError (*disposeBuffers)() = 0; + 84 virtual ASIOError (*controlPanel)() = 0; + 88 virtual ASIOError (*future)(long selector,void *opt) = 0; + 92 virtual ASIOError (*outputReady)() = 0; + }; + + The numbers in the left column show the byte offset of each function ptr + from the beginning of the vtbl. These numbers are used in the code below + to select different functions. + + In order to find the address of a particular function, theAsioDriver + must first be dereferenced to find the value of the vtbl pointer: + + mov eax, theAsioDriver + mov edx, [theAsioDriver] // edx now points to vtbl[0] + + Then an offset must be added to the vtbl pointer to select a + particular function, for example vtbl+44 points to the slot containing + a pointer to the getBufferSize function. + + Finally vtbl+x must be dereferenced to obtain the value of the function + pointer stored in that address: + + call [edx+44] // call the function pointed to by + // the value in the getBufferSize field of the vtbl + + + SEE ALSO + + Martin Fay's OpenASIO DLL at http://www.martinfay.com solves the same + problem by providing a new COM interface which wraps IASIO with an + interface that uses portable calling conventions. OpenASIO must be compiled + with MSVC, and requires that you ship the OpenASIO DLL with your + application. + + + ACKNOWLEDGEMENTS + + Ross Bencina: worked out the thiscall details above, wrote the original + Borland asm macros, and a patch for asio.cpp (which is no longer needed). + Thanks to Martin Fay for introducing me to the issues discussed here, + and to Rene G. Ceballos for assisting with asm dumps from MSVC++. + + Antti Silvast: converted the original calliasio to work with gcc and NASM + by implementing the asm code in a separate file. + + Fraser Adams: modified the original calliasio containing the Borland inline + asm to add inline asm for gcc i.e. Intel syntax for Borland and AT&T syntax + for gcc. This seems a neater approach for gcc than to have a separate .asm + file and it means that we only need one version of the thiscall patch. + + Fraser Adams: rewrote the original calliasio patch in the form of the + IASIOThiscallResolver class in order to avoid modifications to files from + the Steinberg SDK, which may have had potential licence issues. + + Andrew Baldwin: contributed fixes for compatibility problems with more + recent versions of the gcc assembler. +*/ + + +// We only need IASIOThiscallResolver at all if we are on Win32. For other +// platforms we simply bypass the IASIOThiscallResolver definition to allow us +// to be safely #include'd whatever the platform to keep client code portable +#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) + + +// If microsoft compiler we can call IASIO directly so IASIOThiscallResolver +// is not used. +#if !defined(_MSC_VER) + + +#include +#include + +// We have a mechanism in iasiothiscallresolver.h to ensure that asio.h is +// #include'd before it in client code, we do NOT want to do this test here. +#define iasiothiscallresolver_sourcefile 1 +#include "iasiothiscallresolver.h" +#undef iasiothiscallresolver_sourcefile + +// iasiothiscallresolver.h redefines ASIOInit for clients, but we don't want +// this macro defined in this translation unit. +#undef ASIOInit + + +// theAsioDriver is a global pointer to the current IASIO instance which the +// ASIO SDK uses to perform all actions on the IASIO interface. We substitute +// our own forwarding interface into this pointer. +extern IASIO* theAsioDriver; + + +// The following macros define the inline assembler for BORLAND first then gcc + +#if defined(__BCPLUSPLUS__) || defined(__BORLANDC__) + + +#define CALL_THISCALL_0( resultName, thisPtr, funcOffset )\ + void *this_ = (thisPtr); \ + __asm { \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + mov resultName, eax ; \ + } + + +#define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 )\ + void *this_ = (thisPtr); \ + __asm { \ + mov eax, param1 ; \ + push eax ; \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + } + + +#define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 )\ + void *this_ = (thisPtr); \ + __asm { \ + mov eax, param1 ; \ + push eax ; \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + mov resultName, eax ; \ + } + + +#define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 )\ + void *this_ = (thisPtr); \ + void *doubleParamPtr_ (¶m1); \ + __asm { \ + mov eax, doubleParamPtr_ ; \ + push [eax+4] ; \ + push [eax] ; \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + mov resultName, eax ; \ + } + + +#define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 )\ + void *this_ = (thisPtr); \ + __asm { \ + mov eax, param2 ; \ + push eax ; \ + mov eax, param1 ; \ + push eax ; \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + mov resultName, eax ; \ + } + + +#define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ + void *this_ = (thisPtr); \ + __asm { \ + mov eax, param4 ; \ + push eax ; \ + mov eax, param3 ; \ + push eax ; \ + mov eax, param2 ; \ + push eax ; \ + mov eax, param1 ; \ + push eax ; \ + mov ecx, this_ ; \ + mov eax, [ecx] ; \ + call [eax+funcOffset] ; \ + mov resultName, eax ; \ + } + + +#elif defined(__GNUC__) + + +#define CALL_THISCALL_0( resultName, thisPtr, funcOffset ) \ + __asm__ __volatile__ ("movl (%1), %%edx\n\t" \ + "call *"#funcOffset"(%%edx)\n\t" \ + :"=a"(resultName) /* Output Operands */ \ + :"c"(thisPtr) /* Input Operands */ \ + : "%edx" /* Clobbered Registers */ \ + ); \ + + +#define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 ) \ + __asm__ __volatile__ ("pushl %0\n\t" \ + "movl (%1), %%edx\n\t" \ + "call *"#funcOffset"(%%edx)\n\t" \ + : /* Output Operands */ \ + :"r"(param1), /* Input Operands */ \ + "c"(thisPtr) \ + : "%edx" /* Clobbered Registers */ \ + ); \ + + +#define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 ) \ + __asm__ __volatile__ ("pushl %1\n\t" \ + "movl (%2), %%edx\n\t" \ + "call *"#funcOffset"(%%edx)\n\t" \ + :"=a"(resultName) /* Output Operands */ \ + :"r"(param1), /* Input Operands */ \ + "c"(thisPtr) \ + : "%edx" /* Clobbered Registers */ \ + ); \ + + +#define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 ) \ + do { \ + double param1f64 = param1; /* Cast explicitly to double */ \ + double *param1f64Ptr = ¶m1f64; /* Make pointer to address */ \ + __asm__ __volatile__ ("pushl 4(%1)\n\t" \ + "pushl (%1)\n\t" \ + "movl (%2), %%edx\n\t" \ + "call *"#funcOffset"(%%edx);\n\t" \ + : "=a"(resultName) /* Output Operands */ \ + : "r"(param1f64Ptr), /* Input Operands */ \ + "c"(thisPtr), \ + "m"(*param1f64Ptr) /* Using address */ \ + : "%edx" /* Clobbered Registers */ \ + ); \ + } while (0); \ + + +#define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 ) \ + __asm__ __volatile__ ("pushl %1\n\t" \ + "pushl %2\n\t" \ + "movl (%3), %%edx\n\t" \ + "call *"#funcOffset"(%%edx)\n\t" \ + :"=a"(resultName) /* Output Operands */ \ + :"r"(param2), /* Input Operands */ \ + "r"(param1), \ + "c"(thisPtr) \ + : "%edx" /* Clobbered Registers */ \ + ); \ + + +#define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ + __asm__ __volatile__ ("pushl %1\n\t" \ + "pushl %2\n\t" \ + "pushl %3\n\t" \ + "pushl %4\n\t" \ + "movl (%5), %%edx\n\t" \ + "call *"#funcOffset"(%%edx)\n\t" \ + :"=a"(resultName) /* Output Operands */ \ + :"r"(param4), /* Input Operands */ \ + "r"(param3), \ + "r"(param2), \ + "r"(param1), \ + "c"(thisPtr) \ + : "%edx" /* Clobbered Registers */ \ + ); \ + +#endif + + + +// Our static singleton instance. +IASIOThiscallResolver IASIOThiscallResolver::instance; + +// Constructor called to initialize static Singleton instance above. Note that +// it is important not to clear that_ incase it has already been set by the call +// to placement new in ASIOInit(). +IASIOThiscallResolver::IASIOThiscallResolver() +{ +} + +// Constructor called from ASIOInit() below +IASIOThiscallResolver::IASIOThiscallResolver(IASIO* that) +: that_( that ) +{ +} + +// Implement IUnknown methods as assert(false). IASIOThiscallResolver is not +// really a COM object, just a wrapper which will work with the ASIO SDK. +// If you wanted to use ASIO without the SDK you might want to implement COM +// aggregation in these methods. +HRESULT STDMETHODCALLTYPE IASIOThiscallResolver::QueryInterface(REFIID riid, void **ppv) +{ + (void)riid; // suppress unused variable warning + + assert( false ); // this function should never be called by the ASIO SDK. + + *ppv = NULL; + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE IASIOThiscallResolver::AddRef() +{ + assert( false ); // this function should never be called by the ASIO SDK. + + return 1; +} + +ULONG STDMETHODCALLTYPE IASIOThiscallResolver::Release() +{ + assert( false ); // this function should never be called by the ASIO SDK. + + return 1; +} + + +// Implement the IASIO interface methods by performing the vptr manipulation +// described above then delegating to the real implementation. +ASIOBool IASIOThiscallResolver::init(void *sysHandle) +{ + ASIOBool result; + CALL_THISCALL_1( result, that_, 12, sysHandle ); + return result; +} + +void IASIOThiscallResolver::getDriverName(char *name) +{ + CALL_VOID_THISCALL_1( that_, 16, name ); +} + +long IASIOThiscallResolver::getDriverVersion() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 20 ); + return result; +} + +void IASIOThiscallResolver::getErrorMessage(char *string) +{ + CALL_VOID_THISCALL_1( that_, 24, string ); +} + +ASIOError IASIOThiscallResolver::start() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 28 ); + return result; +} + +ASIOError IASIOThiscallResolver::stop() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 32 ); + return result; +} + +ASIOError IASIOThiscallResolver::getChannels(long *numInputChannels, long *numOutputChannels) +{ + ASIOBool result; + CALL_THISCALL_2( result, that_, 36, numInputChannels, numOutputChannels ); + return result; +} + +ASIOError IASIOThiscallResolver::getLatencies(long *inputLatency, long *outputLatency) +{ + ASIOBool result; + CALL_THISCALL_2( result, that_, 40, inputLatency, outputLatency ); + return result; +} + +ASIOError IASIOThiscallResolver::getBufferSize(long *minSize, long *maxSize, + long *preferredSize, long *granularity) +{ + ASIOBool result; + CALL_THISCALL_4( result, that_, 44, minSize, maxSize, preferredSize, granularity ); + return result; +} + +ASIOError IASIOThiscallResolver::canSampleRate(ASIOSampleRate sampleRate) +{ + ASIOBool result; + CALL_THISCALL_1_DOUBLE( result, that_, 48, sampleRate ); + return result; +} + +ASIOError IASIOThiscallResolver::getSampleRate(ASIOSampleRate *sampleRate) +{ + ASIOBool result; + CALL_THISCALL_1( result, that_, 52, sampleRate ); + return result; +} + +ASIOError IASIOThiscallResolver::setSampleRate(ASIOSampleRate sampleRate) +{ + ASIOBool result; + CALL_THISCALL_1_DOUBLE( result, that_, 56, sampleRate ); + return result; +} + +ASIOError IASIOThiscallResolver::getClockSources(ASIOClockSource *clocks, long *numSources) +{ + ASIOBool result; + CALL_THISCALL_2( result, that_, 60, clocks, numSources ); + return result; +} + +ASIOError IASIOThiscallResolver::setClockSource(long reference) +{ + ASIOBool result; + CALL_THISCALL_1( result, that_, 64, reference ); + return result; +} + +ASIOError IASIOThiscallResolver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) +{ + ASIOBool result; + CALL_THISCALL_2( result, that_, 68, sPos, tStamp ); + return result; +} + +ASIOError IASIOThiscallResolver::getChannelInfo(ASIOChannelInfo *info) +{ + ASIOBool result; + CALL_THISCALL_1( result, that_, 72, info ); + return result; +} + +ASIOError IASIOThiscallResolver::createBuffers(ASIOBufferInfo *bufferInfos, + long numChannels, long bufferSize, ASIOCallbacks *callbacks) +{ + ASIOBool result; + CALL_THISCALL_4( result, that_, 76, bufferInfos, numChannels, bufferSize, callbacks ); + return result; +} + +ASIOError IASIOThiscallResolver::disposeBuffers() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 80 ); + return result; +} + +ASIOError IASIOThiscallResolver::controlPanel() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 84 ); + return result; +} + +ASIOError IASIOThiscallResolver::future(long selector,void *opt) +{ + ASIOBool result; + CALL_THISCALL_2( result, that_, 88, selector, opt ); + return result; +} + +ASIOError IASIOThiscallResolver::outputReady() +{ + ASIOBool result; + CALL_THISCALL_0( result, that_, 92 ); + return result; +} + + +// Implement our substitute ASIOInit() method +ASIOError IASIOThiscallResolver::ASIOInit(ASIODriverInfo *info) +{ + // To ensure that our instance's vptr is correctly constructed, even if + // ASIOInit is called prior to main(), we explicitly call its constructor + // (potentially over the top of an existing instance). Note that this is + // pretty ugly, and is only safe because IASIOThiscallResolver has no + // destructor and contains no objects with destructors. + new((void*)&instance) IASIOThiscallResolver( theAsioDriver ); + + // Interpose between ASIO client code and the real driver. + theAsioDriver = &instance; + + // Note that we never need to switch theAsioDriver back to point to the + // real driver because theAsioDriver is reset to zero in ASIOExit(). + + // Delegate to the real ASIOInit + return ::ASIOInit(info); +} + + +#endif /* !defined(_MSC_VER) */ + +#endif /* Win32 */ + diff --git a/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.h b/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.h new file mode 100644 index 0000000000..21d53b3206 --- /dev/null +++ b/Externals/portaudio/src/hostapi/asio/iasiothiscallresolver.h @@ -0,0 +1,197 @@ +// **************************************************************************** +// File: IASIOThiscallResolver.h +// Description: The IASIOThiscallResolver class implements the IASIO +// interface and acts as a proxy to the real IASIO interface by +// calling through its vptr table using the thiscall calling +// convention. To put it another way, we interpose +// IASIOThiscallResolver between ASIO SDK code and the driver. +// This is necessary because most non-Microsoft compilers don't +// implement the thiscall calling convention used by IASIO. +// +// iasiothiscallresolver.cpp contains the background of this +// problem plus a technical description of the vptr +// manipulations. +// +// In order to use this mechanism one simply has to add +// iasiothiscallresolver.cpp to the list of files to compile +// and #include +// +// Note that this #include must come after the other ASIO SDK +// #includes, for example: +// +// #include +// #include +// #include +// #include +// #include +// +// Actually the important thing is to #include +// after . We have +// incorporated a test to enforce this ordering. +// +// The code transparently takes care of the interposition by +// using macro substitution to intercept calls to ASIOInit() +// and ASIOExit(). We save the original ASIO global +// "theAsioDriver" in our "that" variable, and then set +// "theAsioDriver" to equal our IASIOThiscallResolver instance. +// +// Whilst this method of resolving the thiscall problem requires +// the addition of #include to client +// code it has the advantage that it does not break the terms +// of the ASIO licence by publishing it. We are NOT modifying +// any Steinberg code here, we are merely implementing the IASIO +// interface in the same way that we would need to do if we +// wished to provide an open source ASIO driver. +// +// For compilation with MinGW -lole32 needs to be added to the +// linker options. For BORLAND, linking with Import32.lib is +// sufficient. +// +// The dependencies are with: CoInitialize, CoUninitialize, +// CoCreateInstance, CLSIDFromString - used by asiolist.cpp +// and are required on Windows whether ThiscallResolver is used +// or not. +// +// Searching for the above strings in the root library path +// of your compiler should enable the correct libraries to be +// identified if they aren't immediately obvious. +// +// Note that the current implementation of IASIOThiscallResolver +// is not COM compliant - it does not correctly implement the +// IUnknown interface. Implementing it is not necessary because +// it is not called by parts of the ASIO SDK which call through +// theAsioDriver ptr. The IUnknown methods are implemented as +// assert(false) to ensure that the code fails if they are +// ever called. +// Restrictions: None. Public Domain & Open Source distribute freely +// You may use IASIOThiscallResolver commercially as well as +// privately. +// You the user assume the responsibility for the use of the +// files, binary or text, and there is no guarantee or warranty, +// expressed or implied, including but not limited to the +// implied warranties of merchantability and fitness for a +// particular purpose. You assume all responsibility and agree +// to hold no entity, copyright holder or distributors liable +// for any loss of data or inaccurate representations of data +// as a result of using IASIOThiscallResolver. +// Version: 1.4 Added separate macro CALL_THISCALL_1_DOUBLE from +// Andrew Baldwin, and volatile for whole gcc asm blocks, +// both for compatibility with newer gcc versions. Cleaned up +// Borland asm to use one less register. +// 1.3 Switched to including assert.h for better compatibility. +// Wrapped entire .h and .cpp contents with a check for +// _MSC_VER to provide better compatibility with MS compilers. +// Changed Singleton implementation to use static instance +// instead of freestore allocated instance. Removed ASIOExit +// macro as it is no longer needed. +// 1.2 Removed semicolons from ASIOInit and ASIOExit macros to +// allow them to be embedded in expressions (if statements). +// Cleaned up some comments. Removed combase.c dependency (it +// doesn't compile with BCB anyway) by stubbing IUnknown. +// 1.1 Incorporated comments from Ross Bencina including things +// such as changing name from ThiscallResolver to +// IASIOThiscallResolver, tidying up the constructor, fixing +// a bug in IASIOThiscallResolver::ASIOExit() and improving +// portability through the use of conditional compilation +// 1.0 Initial working version. +// Created: 6/09/2003 +// Authors: Fraser Adams +// Ross Bencina +// Rene G. Ceballos +// Martin Fay +// Antti Silvast +// Andrew Baldwin +// +// **************************************************************************** + + +#ifndef included_iasiothiscallresolver_h +#define included_iasiothiscallresolver_h + +// We only need IASIOThiscallResolver at all if we are on Win32. For other +// platforms we simply bypass the IASIOThiscallResolver definition to allow us +// to be safely #include'd whatever the platform to keep client code portable +#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) + + +// If microsoft compiler we can call IASIO directly so IASIOThiscallResolver +// is not used. +#if !defined(_MSC_VER) + + +// The following is in order to ensure that this header is only included after +// the other ASIO headers (except for the case of iasiothiscallresolver.cpp). +// We need to do this because IASIOThiscallResolver works by eclipsing the +// original definition of ASIOInit() with a macro (see below). +#if !defined(iasiothiscallresolver_sourcefile) + #if !defined(__ASIO_H) + #error iasiothiscallresolver.h must be included AFTER asio.h + #endif +#endif + +#include +#include /* From ASIO SDK */ + + +class IASIOThiscallResolver : public IASIO { +private: + IASIO* that_; // Points to the real IASIO + + static IASIOThiscallResolver instance; // Singleton instance + + // Constructors - declared private so construction is limited to + // our Singleton instance + IASIOThiscallResolver(); + IASIOThiscallResolver(IASIO* that); +public: + + // Methods from the IUnknown interface. We don't fully implement IUnknown + // because the ASIO SDK never calls these methods through theAsioDriver ptr. + // These methods are implemented as assert(false). + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + + // Methods from the IASIO interface, implemented as forwarning calls to that. + virtual ASIOBool init(void *sysHandle); + virtual void getDriverName(char *name); + virtual long getDriverVersion(); + virtual void getErrorMessage(char *string); + virtual ASIOError start(); + virtual ASIOError stop(); + virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); + virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); + virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); + virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); + virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); + virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); + virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); + virtual ASIOError setClockSource(long reference); + virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); + virtual ASIOError getChannelInfo(ASIOChannelInfo *info); + virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); + virtual ASIOError disposeBuffers(); + virtual ASIOError controlPanel(); + virtual ASIOError future(long selector,void *opt); + virtual ASIOError outputReady(); + + // Class method, see ASIOInit() macro below. + static ASIOError ASIOInit(ASIODriverInfo *info); // Delegates to ::ASIOInit +}; + + +// Replace calls to ASIOInit with our interposing version. +// This macro enables us to perform thiscall resolution simply by #including +// after the asio #includes (this file _must_ be +// included _after_ the asio #includes) + +#define ASIOInit(name) IASIOThiscallResolver::ASIOInit((name)) + + +#endif /* !defined(_MSC_VER) */ + +#endif /* Win32 */ + +#endif /* included_iasiothiscallresolver_h */ + + diff --git a/Externals/portaudio/src/hostapi/asio/pa_asio.cpp b/Externals/portaudio/src/hostapi/asio/pa_asio.cpp new file mode 100644 index 0000000000..28eee9dbb5 --- /dev/null +++ b/Externals/portaudio/src/hostapi/asio/pa_asio.cpp @@ -0,0 +1,4214 @@ +/* + * $Id: pa_asio.cpp 1778 2011-11-10 13:59:53Z rossb $ + * Portable Audio I/O Library for ASIO Drivers + * + * Author: Stephane Letz + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 2000-2002 Stephane Letz, Phil Burk, Ross Bencina + * Blocking i/o implementation by Sven Fischer, Institute of Hearing + * Technology and Audiology (www.hoertechnik-audiologie.de) + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/* Modification History + + 08-03-01 First version : Stephane Letz + 08-06-01 Tweaks for PC, use C++, buffer allocation, Float32 to Int32 conversion : Phil Burk + 08-20-01 More conversion, PA_StreamTime, Pa_GetHostError : Stephane Letz + 08-21-01 PaUInt8 bug correction, implementation of ASIOSTFloat32LSB and ASIOSTFloat32MSB native formats : Stephane Letz + 08-24-01 MAX_INT32_FP hack, another Uint8 fix : Stephane and Phil + 08-27-01 Implementation of hostBufferSize < userBufferSize case, better management of the ouput buffer when + the stream is stopped : Stephane Letz + 08-28-01 Check the stream pointer for null in bufferSwitchTimeInfo, correct bug in bufferSwitchTimeInfo when + the stream is stopped : Stephane Letz + 10-12-01 Correct the PaHost_CalcNumHostBuffers function: computes FramesPerHostBuffer to be the lowest that + respect requested FramesPerUserBuffer and userBuffersPerHostBuffer : Stephane Letz + 10-26-01 Management of hostBufferSize and userBufferSize of any size : Stephane Letz + 10-27-01 Improve calculus of hostBufferSize to be multiple or divisor of userBufferSize if possible : Stephane and Phil + 10-29-01 Change MAX_INT32_FP to (2147483520.0f) to prevent roundup to 0x80000000 : Phil Burk + 10-31-01 Clear the ouput buffer and user buffers in PaHost_StartOutput, correct bug in GetFirstMultiple : Stephane Letz + 11-06-01 Rename functions : Stephane Letz + 11-08-01 New Pa_ASIO_Adaptor_Init function to init Callback adpatation variables, cleanup of Pa_ASIO_Callback_Input: Stephane Letz + 11-29-01 Break apart device loading to debug random failure in Pa_ASIO_QueryDeviceInfo ; Phil Burk + 01-03-02 Desallocate all resources in PaHost_Term for cases where Pa_CloseStream is not called properly : Stephane Letz + 02-01-02 Cleanup, test of multiple-stream opening : Stephane Letz + 19-02-02 New Pa_ASIO_loadDriver that calls CoInitialize on each thread on Windows : Stephane Letz + 09-04-02 Correct error code management in PaHost_Term, removes various compiler warning : Stephane Letz + 12-04-02 Add Mac includes for and : Phil Burk + 13-04-02 Removes another compiler warning : Stephane Letz + 30-04-02 Pa_ASIO_QueryDeviceInfo bug correction, memory allocation checking, better error handling : D Viens, P Burk, S Letz + 12-06-02 Rehashed into new multi-api infrastructure, added support for all ASIO sample formats : Ross Bencina + 18-06-02 Added pa_asio.h, PaAsio_GetAvailableLatencyValues() : Ross B. + 21-06-02 Added SelectHostBufferSize() which selects host buffer size based on user latency parameters : Ross Bencina + ** NOTE maintanance history is now stored in CVS ** +*/ + +/** @file + @ingroup hostapi_src + + Note that specific support for paInputUnderflow, paOutputOverflow and + paNeverDropInput is not necessary or possible with this driver due to the + synchronous full duplex double-buffered architecture of ASIO. +*/ + + +#include +#include +#include +//#include +#include + +#include +#include + +#include "portaudio.h" +#include "pa_asio.h" +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_debugprint.h" +#include "pa_ringbuffer.h" + +#include "pa_win_coinitialize.h" + +/* This version of pa_asio.cpp is currently only targetted at Win32, + It would require a few tweaks to work with pre-OS X Macintosh. + To make configuration easier, we define WIN32 here to make sure + that the ASIO SDK knows this is Win32. +*/ +#ifndef WIN32 +#define WIN32 +#endif + +#include "asiosys.h" +#include "asio.h" +#include "asiodrivers.h" +#include "iasiothiscallresolver.h" + +/* +#if MAC +#include +#include +#include +#else +*/ +/* +#include +#include +#include +*/ +/* +#endif +*/ + + +/* winmm.lib is needed for timeGetTime() (this is in winmm.a if you're using gcc) */ +#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ +#pragma comment(lib, "winmm.lib") +#endif + + +/* external reference to ASIO SDK's asioDrivers. + + This is a bit messy because we want to explicitly manage + allocation/deallocation of this structure, but some layers of the SDK + which we currently use (eg the implementation in asio.cpp) still + use this global version. + + For now we keep it in sync with our local instance in the host + API representation structure, but later we should be able to remove + all dependence on it. +*/ +extern AsioDrivers* asioDrivers; + + +/* We are trying to be compatible with CARBON but this has not been thoroughly tested. */ +/* not tested at all since new V19 code was introduced. */ +#define CARBON_COMPATIBLE (0) + + +/* prototypes for functions declared in this file */ + +extern "C" PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ); +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + +/* Blocking i/o callback function. */ +static int BlockingIoPaCallback(const void *inputBuffer , + void *outputBuffer , + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *timeInfo , + PaStreamCallbackFlags statusFlags , + void *userData ); + +/* our ASIO callback functions */ + +static void bufferSwitch(long index, ASIOBool processNow); +static ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow); +static void sampleRateChanged(ASIOSampleRate sRate); +static long asioMessages(long selector, long value, void* message, double* opt); + +static ASIOCallbacks asioCallbacks_ = + { bufferSwitch, sampleRateChanged, asioMessages, bufferSwitchTimeInfo }; + + +#define PA_ASIO_SET_LAST_HOST_ERROR( errorCode, errorText ) \ + PaUtil_SetLastHostErrorInfo( paASIO, errorCode, errorText ) + + +static void PaAsio_SetLastSystemError( DWORD errorCode ) +{ + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + PaUtil_SetLastHostErrorInfo( paASIO, errorCode, (const char*)lpMsgBuf ); + LocalFree( lpMsgBuf ); +} + +#define PA_ASIO_SET_LAST_SYSTEM_ERROR( errorCode ) \ + PaAsio_SetLastSystemError( errorCode ) + + +static const char* PaAsio_GetAsioErrorText( ASIOError asioError ) +{ + const char *result; + + switch( asioError ){ + case ASE_OK: + case ASE_SUCCESS: result = "Success"; break; + case ASE_NotPresent: result = "Hardware input or output is not present or available"; break; + case ASE_HWMalfunction: result = "Hardware is malfunctioning"; break; + case ASE_InvalidParameter: result = "Input parameter invalid"; break; + case ASE_InvalidMode: result = "Hardware is in a bad mode or used in a bad mode"; break; + case ASE_SPNotAdvancing: result = "Hardware is not running when sample position is inquired"; break; + case ASE_NoClock: result = "Sample clock or rate cannot be determined or is not present"; break; + case ASE_NoMemory: result = "Not enough memory for completing the request"; break; + default: result = "Unknown ASIO error"; break; + } + + return result; +} + + +#define PA_ASIO_SET_LAST_ASIO_ERROR( asioError ) \ + PaUtil_SetLastHostErrorInfo( paASIO, asioError, PaAsio_GetAsioErrorText( asioError ) ) + + + + +// Atomic increment and decrement operations +#if MAC + /* need to be implemented on Mac */ + inline long PaAsio_AtomicIncrement(volatile long* v) {return ++(*const_cast(v));} + inline long PaAsio_AtomicDecrement(volatile long* v) {return --(*const_cast(v));} +#elif WINDOWS + inline long PaAsio_AtomicIncrement(volatile long* v) {return InterlockedIncrement(const_cast(v));} + inline long PaAsio_AtomicDecrement(volatile long* v) {return InterlockedDecrement(const_cast(v));} +#endif + + + +typedef struct PaAsioDriverInfo +{ + ASIODriverInfo asioDriverInfo; + long inputChannelCount, outputChannelCount; + long bufferMinSize, bufferMaxSize, bufferPreferredSize, bufferGranularity; + bool postOutput; +} +PaAsioDriverInfo; + + +/* PaAsioHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + PaWinUtilComInitializationResult comInitializationResult; + + AsioDrivers *asioDrivers; + void *systemSpecific; + + /* the ASIO C API only allows one ASIO driver to be open at a time, + so we keep track of whether we have the driver open here, and + use this information to return errors from OpenStream if the + driver is already open. + + openAsioDeviceIndex will be PaNoDevice if there is no device open + and a valid pa_asio (not global) device index otherwise. + + openAsioDriverInfo is populated with the driver info for the + currently open device (if any) + */ + PaDeviceIndex openAsioDeviceIndex; + PaAsioDriverInfo openAsioDriverInfo; +} +PaAsioHostApiRepresentation; + + +/* + Retrieve driver names from ASIO, returned in a char** + allocated in . +*/ +static char **GetAsioDriverNames( PaAsioHostApiRepresentation *asioHostApi, PaUtilAllocationGroup *group, long driverCount ) +{ + char **result = 0; + int i; + + result =(char**)PaUtil_GroupAllocateMemory( + group, sizeof(char*) * driverCount ); + if( !result ) + goto error; + + result[0] = (char*)PaUtil_GroupAllocateMemory( + group, 32 * driverCount ); + if( !result[0] ) + goto error; + + for( i=0; iasioDrivers->getDriverNames( result, driverCount ); + +error: + return result; +} + + +static PaSampleFormat AsioSampleTypeToPaNativeSampleFormat(ASIOSampleType type) +{ + switch (type) { + case ASIOSTInt16MSB: + case ASIOSTInt16LSB: + return paInt16; + + case ASIOSTFloat32MSB: + case ASIOSTFloat32LSB: + case ASIOSTFloat64MSB: + case ASIOSTFloat64LSB: + return paFloat32; + + case ASIOSTInt32MSB: + case ASIOSTInt32LSB: + case ASIOSTInt32MSB16: + case ASIOSTInt32LSB16: + case ASIOSTInt32MSB18: + case ASIOSTInt32MSB20: + case ASIOSTInt32MSB24: + case ASIOSTInt32LSB18: + case ASIOSTInt32LSB20: + case ASIOSTInt32LSB24: + return paInt32; + + case ASIOSTInt24MSB: + case ASIOSTInt24LSB: + return paInt24; + + default: + return paCustomFormat; + } +} + +void AsioSampleTypeLOG(ASIOSampleType type) +{ + switch (type) { + case ASIOSTInt16MSB: PA_DEBUG(("ASIOSTInt16MSB\n")); break; + case ASIOSTInt16LSB: PA_DEBUG(("ASIOSTInt16LSB\n")); break; + case ASIOSTFloat32MSB:PA_DEBUG(("ASIOSTFloat32MSB\n"));break; + case ASIOSTFloat32LSB:PA_DEBUG(("ASIOSTFloat32LSB\n"));break; + case ASIOSTFloat64MSB:PA_DEBUG(("ASIOSTFloat64MSB\n"));break; + case ASIOSTFloat64LSB:PA_DEBUG(("ASIOSTFloat64LSB\n"));break; + case ASIOSTInt32MSB: PA_DEBUG(("ASIOSTInt32MSB\n")); break; + case ASIOSTInt32LSB: PA_DEBUG(("ASIOSTInt32LSB\n")); break; + case ASIOSTInt32MSB16:PA_DEBUG(("ASIOSTInt32MSB16\n"));break; + case ASIOSTInt32LSB16:PA_DEBUG(("ASIOSTInt32LSB16\n"));break; + case ASIOSTInt32MSB18:PA_DEBUG(("ASIOSTInt32MSB18\n"));break; + case ASIOSTInt32MSB20:PA_DEBUG(("ASIOSTInt32MSB20\n"));break; + case ASIOSTInt32MSB24:PA_DEBUG(("ASIOSTInt32MSB24\n"));break; + case ASIOSTInt32LSB18:PA_DEBUG(("ASIOSTInt32LSB18\n"));break; + case ASIOSTInt32LSB20:PA_DEBUG(("ASIOSTInt32LSB20\n"));break; + case ASIOSTInt32LSB24:PA_DEBUG(("ASIOSTInt32LSB24\n"));break; + case ASIOSTInt24MSB: PA_DEBUG(("ASIOSTInt24MSB\n")); break; + case ASIOSTInt24LSB: PA_DEBUG(("ASIOSTInt24LSB\n")); break; + default: PA_DEBUG(("Custom Format%d\n",type));break; + + } +} + +static int BytesPerAsioSample( ASIOSampleType sampleType ) +{ + switch (sampleType) { + case ASIOSTInt16MSB: + case ASIOSTInt16LSB: + return 2; + + case ASIOSTFloat64MSB: + case ASIOSTFloat64LSB: + return 8; + + case ASIOSTFloat32MSB: + case ASIOSTFloat32LSB: + case ASIOSTInt32MSB: + case ASIOSTInt32LSB: + case ASIOSTInt32MSB16: + case ASIOSTInt32LSB16: + case ASIOSTInt32MSB18: + case ASIOSTInt32MSB20: + case ASIOSTInt32MSB24: + case ASIOSTInt32LSB18: + case ASIOSTInt32LSB20: + case ASIOSTInt32LSB24: + return 4; + + case ASIOSTInt24MSB: + case ASIOSTInt24LSB: + return 3; + + default: + return 0; + } +} + + +static void Swap16( void *buffer, long shift, long count ) +{ + unsigned short *p = (unsigned short*)buffer; + unsigned short temp; + (void) shift; /* unused parameter */ + + while( count-- ) + { + temp = *p; + *p++ = (unsigned short)((temp<<8) | (temp>>8)); + } +} + +static void Swap24( void *buffer, long shift, long count ) +{ + unsigned char *p = (unsigned char*)buffer; + unsigned char temp; + (void) shift; /* unused parameter */ + + while( count-- ) + { + temp = *p; + *p = *(p+2); + *(p+2) = temp; + p += 3; + } +} + +#define PA_SWAP32_( x ) ((x>>24) | ((x>>8)&0xFF00) | ((x<<8)&0xFF0000) | (x<<24)); + +static void Swap32( void *buffer, long shift, long count ) +{ + unsigned long *p = (unsigned long*)buffer; + unsigned long temp; + (void) shift; /* unused parameter */ + + while( count-- ) + { + temp = *p; + *p++ = PA_SWAP32_( temp); + } +} + +static void SwapShiftLeft32( void *buffer, long shift, long count ) +{ + unsigned long *p = (unsigned long*)buffer; + unsigned long temp; + + while( count-- ) + { + temp = *p; + temp = PA_SWAP32_( temp); + *p++ = temp << shift; + } +} + +static void ShiftRightSwap32( void *buffer, long shift, long count ) +{ + unsigned long *p = (unsigned long*)buffer; + unsigned long temp; + + while( count-- ) + { + temp = *p >> shift; + *p++ = PA_SWAP32_( temp); + } +} + +static void ShiftLeft32( void *buffer, long shift, long count ) +{ + unsigned long *p = (unsigned long*)buffer; + unsigned long temp; + + while( count-- ) + { + temp = *p; + *p++ = temp << shift; + } +} + +static void ShiftRight32( void *buffer, long shift, long count ) +{ + unsigned long *p = (unsigned long*)buffer; + unsigned long temp; + + while( count-- ) + { + temp = *p; + *p++ = temp >> shift; + } +} + +#define PA_SWAP_( x, y ) temp=x; x = y; y = temp; + +static void Swap64ConvertFloat64ToFloat32( void *buffer, long shift, long count ) +{ + double *in = (double*)buffer; + float *out = (float*)buffer; + unsigned char *p; + unsigned char temp; + (void) shift; /* unused parameter */ + + while( count-- ) + { + p = (unsigned char*)in; + PA_SWAP_( p[0], p[7] ); + PA_SWAP_( p[1], p[6] ); + PA_SWAP_( p[2], p[5] ); + PA_SWAP_( p[3], p[4] ); + + *out++ = (float) (*in++); + } +} + +static void ConvertFloat64ToFloat32( void *buffer, long shift, long count ) +{ + double *in = (double*)buffer; + float *out = (float*)buffer; + (void) shift; /* unused parameter */ + + while( count-- ) + *out++ = (float) (*in++); +} + +static void ConvertFloat32ToFloat64Swap64( void *buffer, long shift, long count ) +{ + float *in = ((float*)buffer) + (count-1); + double *out = ((double*)buffer) + (count-1); + unsigned char *p; + unsigned char temp; + (void) shift; /* unused parameter */ + + while( count-- ) + { + *out = *in--; + + p = (unsigned char*)out; + PA_SWAP_( p[0], p[7] ); + PA_SWAP_( p[1], p[6] ); + PA_SWAP_( p[2], p[5] ); + PA_SWAP_( p[3], p[4] ); + + out--; + } +} + +static void ConvertFloat32ToFloat64( void *buffer, long shift, long count ) +{ + float *in = ((float*)buffer) + (count-1); + double *out = ((double*)buffer) + (count-1); + (void) shift; /* unused parameter */ + + while( count-- ) + *out-- = *in--; +} + +#ifdef MAC +#define PA_MSB_IS_NATIVE_ +#undef PA_LSB_IS_NATIVE_ +#endif + +#ifdef WINDOWS +#undef PA_MSB_IS_NATIVE_ +#define PA_LSB_IS_NATIVE_ +#endif + +typedef void PaAsioBufferConverter( void *, long, long ); + +static void SelectAsioToPaConverter( ASIOSampleType type, PaAsioBufferConverter **converter, long *shift ) +{ + *shift = 0; + *converter = 0; + + switch (type) { + case ASIOSTInt16MSB: + /* dest: paInt16, no conversion necessary, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap16; + #endif + break; + case ASIOSTInt16LSB: + /* dest: paInt16, no conversion necessary, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap16; + #endif + break; + case ASIOSTFloat32MSB: + /* dest: paFloat32, no conversion necessary, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTFloat32LSB: + /* dest: paFloat32, no conversion necessary, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTFloat64MSB: + /* dest: paFloat32, in-place conversion to/from float32, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap64ConvertFloat64ToFloat32; + #else + *converter = ConvertFloat64ToFloat32; + #endif + break; + case ASIOSTFloat64LSB: + /* dest: paFloat32, in-place conversion to/from float32, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap64ConvertFloat64ToFloat32; + #else + *converter = ConvertFloat64ToFloat32; + #endif + break; + case ASIOSTInt32MSB: + /* dest: paInt32, no conversion necessary, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTInt32LSB: + /* dest: paInt32, no conversion necessary, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTInt32MSB16: + /* dest: paInt32, 16 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 16; + break; + case ASIOSTInt32MSB18: + /* dest: paInt32, 14 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 14; + break; + case ASIOSTInt32MSB20: + /* dest: paInt32, 12 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 12; + break; + case ASIOSTInt32MSB24: + /* dest: paInt32, 8 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 8; + break; + case ASIOSTInt32LSB16: + /* dest: paInt32, 16 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 16; + break; + case ASIOSTInt32LSB18: + /* dest: paInt32, 14 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 14; + break; + case ASIOSTInt32LSB20: + /* dest: paInt32, 12 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 12; + break; + case ASIOSTInt32LSB24: + /* dest: paInt32, 8 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = SwapShiftLeft32; + #else + *converter = ShiftLeft32; + #endif + *shift = 8; + break; + case ASIOSTInt24MSB: + /* dest: paInt24, no conversion necessary, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap24; + #endif + break; + case ASIOSTInt24LSB: + /* dest: paInt24, no conversion necessary, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap24; + #endif + break; + } +} + + +static void SelectPaToAsioConverter( ASIOSampleType type, PaAsioBufferConverter **converter, long *shift ) +{ + *shift = 0; + *converter = 0; + + switch (type) { + case ASIOSTInt16MSB: + /* src: paInt16, no conversion necessary, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap16; + #endif + break; + case ASIOSTInt16LSB: + /* src: paInt16, no conversion necessary, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap16; + #endif + break; + case ASIOSTFloat32MSB: + /* src: paFloat32, no conversion necessary, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTFloat32LSB: + /* src: paFloat32, no conversion necessary, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTFloat64MSB: + /* src: paFloat32, in-place conversion to/from float32, possible byte swap*/ + #ifdef PA_LSB_IS_NATIVE_ + *converter = ConvertFloat32ToFloat64Swap64; + #else + *converter = ConvertFloat32ToFloat64; + #endif + break; + case ASIOSTFloat64LSB: + /* src: paFloat32, in-place conversion to/from float32, possible byte swap*/ + #ifdef PA_MSB_IS_NATIVE_ + *converter = ConvertFloat32ToFloat64Swap64; + #else + *converter = ConvertFloat32ToFloat64; + #endif + break; + case ASIOSTInt32MSB: + /* src: paInt32, no conversion necessary, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTInt32LSB: + /* src: paInt32, no conversion necessary, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap32; + #endif + break; + case ASIOSTInt32MSB16: + /* src: paInt32, 16 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 16; + break; + case ASIOSTInt32MSB18: + /* src: paInt32, 14 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 14; + break; + case ASIOSTInt32MSB20: + /* src: paInt32, 12 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 12; + break; + case ASIOSTInt32MSB24: + /* src: paInt32, 8 bit shift, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 8; + break; + case ASIOSTInt32LSB16: + /* src: paInt32, 16 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 16; + break; + case ASIOSTInt32LSB18: + /* src: paInt32, 14 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 14; + break; + case ASIOSTInt32LSB20: + /* src: paInt32, 12 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 12; + break; + case ASIOSTInt32LSB24: + /* src: paInt32, 8 bit shift, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = ShiftRightSwap32; + #else + *converter = ShiftRight32; + #endif + *shift = 8; + break; + case ASIOSTInt24MSB: + /* src: paInt24, no conversion necessary, possible byte swap */ + #ifdef PA_LSB_IS_NATIVE_ + *converter = Swap24; + #endif + break; + case ASIOSTInt24LSB: + /* src: paInt24, no conversion necessary, possible byte swap */ + #ifdef PA_MSB_IS_NATIVE_ + *converter = Swap24; + #endif + break; + } +} + + +typedef struct PaAsioDeviceInfo +{ + PaDeviceInfo commonDeviceInfo; + long minBufferSize; + long maxBufferSize; + long preferredBufferSize; + long bufferGranularity; + + ASIOChannelInfo *asioChannelInfos; +} +PaAsioDeviceInfo; + + +PaError PaAsio_GetAvailableBufferSizes( PaDeviceIndex device, + long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity ) +{ + PaError result; + PaUtilHostApiRepresentation *hostApi; + PaDeviceIndex hostApiDevice; + + result = PaUtil_GetHostApiRepresentation( &hostApi, paASIO ); + + if( result == paNoError ) + { + result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDevice, device, hostApi ); + + if( result == paNoError ) + { + PaAsioDeviceInfo *asioDeviceInfo = + (PaAsioDeviceInfo*)hostApi->deviceInfos[hostApiDevice]; + + *minBufferSizeFrames = asioDeviceInfo->minBufferSize; + *maxBufferSizeFrames = asioDeviceInfo->maxBufferSize; + *preferredBufferSizeFrames = asioDeviceInfo->preferredBufferSize; + *granularity = asioDeviceInfo->bufferGranularity; + } + } + + return result; +} + +/* Unload whatever we loaded in LoadAsioDriver(). +*/ +static void UnloadAsioDriver( void ) +{ + ASIOExit(); +} + +/* + load the asio driver named by and return statistics about + the driver in info. If no error occurred, the driver will remain open + and must be closed by the called by calling UnloadAsioDriver() - if an error + is returned the driver will already be unloaded. +*/ +static PaError LoadAsioDriver( PaAsioHostApiRepresentation *asioHostApi, const char *driverName, + PaAsioDriverInfo *driverInfo, void *systemSpecific ) +{ + PaError result = paNoError; + ASIOError asioError; + int asioIsInitialized = 0; + + if( !asioHostApi->asioDrivers->loadDriver( const_cast(driverName) ) ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_HOST_ERROR( 0, "Failed to load ASIO driver" ); + goto error; + } + + memset( &driverInfo->asioDriverInfo, 0, sizeof(ASIODriverInfo) ); + driverInfo->asioDriverInfo.asioVersion = 2; + driverInfo->asioDriverInfo.sysRef = systemSpecific; + if( (asioError = ASIOInit( &driverInfo->asioDriverInfo )) != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error; + } + else + { + asioIsInitialized = 1; + } + + if( (asioError = ASIOGetChannels(&driverInfo->inputChannelCount, + &driverInfo->outputChannelCount)) != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error; + } + + if( (asioError = ASIOGetBufferSize(&driverInfo->bufferMinSize, + &driverInfo->bufferMaxSize, &driverInfo->bufferPreferredSize, + &driverInfo->bufferGranularity)) != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error; + } + + if( ASIOOutputReady() == ASE_OK ) + driverInfo->postOutput = true; + else + driverInfo->postOutput = false; + + return result; + +error: + if( asioIsInitialized ) + { + ASIOExit(); + } + + return result; +} + + +#define PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_ 13 /* must be the same number of elements as in the array below */ +static ASIOSampleRate defaultSampleRateSearchOrder_[] + = {44100.0, 48000.0, 32000.0, 24000.0, 22050.0, 88200.0, 96000.0, + 192000.0, 16000.0, 12000.0, 11025.0, 9600.0, 8000.0 }; + + +/* we look up IsDebuggerPresent at runtime incase it isn't present (on Win95 for example) */ +typedef BOOL (WINAPI *IsDebuggerPresentPtr)(VOID); +IsDebuggerPresentPtr IsDebuggerPresent_ = 0; +//FARPROC IsDebuggerPresent_ = 0; // this is the current way to do it apparently according to davidv + +PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i, driverCount; + PaAsioHostApiRepresentation *asioHostApi; + PaAsioDeviceInfo *deviceInfoArray; + char **names; + PaAsioDriverInfo paAsioDriverInfo; + + asioHostApi = (PaAsioHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaAsioHostApiRepresentation) ); + if( !asioHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + /* + We initialize COM ourselves here and uninitialize it in Terminate(). + This should be the only COM initialization needed in this module. + + The ASIO SDK may also initialize COM but since we want to reduce dependency + on the ASIO SDK we manage COM initialization ourselves. + + There used to be code that initialized COM in other situations + such as when creating a Stream. This made PA work when calling Pa_CreateStream + from a non-main thread. However we currently consider initialization + of COM in non-main threads to be the caller's responsibility. + */ + result = PaWinUtil_CoInitialize( paASIO, &asioHostApi->comInitializationResult ); + if( result != paNoError ) + { + goto error; + } + + asioHostApi->asioDrivers = 0; /* avoid surprises in our error handler below */ + + asioHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !asioHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + /* Allocate the AsioDrivers() driver list (class from ASIO SDK) */ + try + { + asioHostApi->asioDrivers = new AsioDrivers(); /* invokes CoInitialize(0) in AsioDriverList::AsioDriverList */ + } + catch (std::bad_alloc) + { + asioHostApi->asioDrivers = 0; + } + /* some implementations of new (ie MSVC, see http://support.microsoft.com/?kbid=167733) + don't throw std::bad_alloc, so we also explicitly test for a null return. */ + if( asioHostApi->asioDrivers == 0 ) + { + result = paInsufficientMemory; + goto error; + } + + asioDrivers = asioHostApi->asioDrivers; /* keep SDK global in sync until we stop depending on it */ + + asioHostApi->systemSpecific = 0; + asioHostApi->openAsioDeviceIndex = paNoDevice; + + *hostApi = &asioHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + + (*hostApi)->info.type = paASIO; + (*hostApi)->info.name = "ASIO"; + (*hostApi)->info.deviceCount = 0; + + #ifdef WINDOWS + /* use desktop window as system specific ptr */ + asioHostApi->systemSpecific = GetDesktopWindow(); + #endif + + /* driverCount is the number of installed drivers - not necessarily + the number of installed physical devices. */ + #if MAC + driverCount = asioHostApi->asioDrivers->getNumFragments(); + #elif WINDOWS + driverCount = asioHostApi->asioDrivers->asioGetNumDev(); + #endif + + if( driverCount > 0 ) + { + names = GetAsioDriverNames( asioHostApi, asioHostApi->allocations, driverCount ); + if( !names ) + { + result = paInsufficientMemory; + goto error; + } + + + /* allocate enough space for all drivers, even if some aren't installed */ + + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + asioHostApi->allocations, sizeof(PaDeviceInfo*) * driverCount ); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaAsioDeviceInfo*)PaUtil_GroupAllocateMemory( + asioHostApi->allocations, sizeof(PaAsioDeviceInfo) * driverCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + IsDebuggerPresent_ = (IsDebuggerPresentPtr)GetProcAddress( LoadLibraryA( "Kernel32.dll" ), "IsDebuggerPresent" ); + + for( i=0; i < driverCount; ++i ) + { + + PA_DEBUG(("ASIO names[%d]:%s\n",i,names[i])); + + // Since portaudio opens ALL ASIO drivers, and no one else does that, + // we face fact that some drivers were not meant for it, drivers which act + // like shells on top of REAL drivers, for instance. + // so we get duplicate handles, locks and other problems. + // so lets NOT try to load any such wrappers. + // The ones i [davidv] know of so far are: + + if ( strcmp (names[i],"ASIO DirectX Full Duplex Driver") == 0 + || strcmp (names[i],"ASIO Multimedia Driver") == 0 + || strncmp(names[i],"Premiere",8) == 0 //"Premiere Elements Windows Sound 1.0" + || strncmp(names[i],"Adobe",5) == 0 //"Adobe Default Windows Sound 1.5" + ) + { + PA_DEBUG(("BLACKLISTED!!!\n")); + continue; + } + + + if( IsDebuggerPresent_ && IsDebuggerPresent_() ) + { + /* ASIO Digidesign Driver uses PACE copy protection which quits out + if a debugger is running. So we don't load it if a debugger is running. */ + if( strcmp(names[i], "ASIO Digidesign Driver") == 0 ) + { + PA_DEBUG(("BLACKLISTED!!! ASIO Digidesign Driver would quit the debugger\n")); + continue; + } + } + + + /* Attempt to load the asio driver... */ + if( LoadAsioDriver( asioHostApi, names[i], &paAsioDriverInfo, asioHostApi->systemSpecific ) == paNoError ) + { + PaAsioDeviceInfo *asioDeviceInfo = &deviceInfoArray[ (*hostApi)->info.deviceCount ]; + PaDeviceInfo *deviceInfo = &asioDeviceInfo->commonDeviceInfo; + + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + deviceInfo->name = names[i]; + PA_DEBUG(("PaAsio_Initialize: drv:%d name = %s\n", i,deviceInfo->name)); + PA_DEBUG(("PaAsio_Initialize: drv:%d inputChannels = %d\n", i, paAsioDriverInfo.inputChannelCount)); + PA_DEBUG(("PaAsio_Initialize: drv:%d outputChannels = %d\n", i, paAsioDriverInfo.outputChannelCount)); + PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMinSize = %d\n", i, paAsioDriverInfo.bufferMinSize)); + PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMaxSize = %d\n", i, paAsioDriverInfo.bufferMaxSize)); + PA_DEBUG(("PaAsio_Initialize: drv:%d bufferPreferredSize = %d\n", i, paAsioDriverInfo.bufferPreferredSize)); + PA_DEBUG(("PaAsio_Initialize: drv:%d bufferGranularity = %d\n", i, paAsioDriverInfo.bufferGranularity)); + + deviceInfo->maxInputChannels = paAsioDriverInfo.inputChannelCount; + deviceInfo->maxOutputChannels = paAsioDriverInfo.outputChannelCount; + + deviceInfo->defaultSampleRate = 0.; + bool foundDefaultSampleRate = false; + for( int j=0; j < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++j ) + { + ASIOError asioError = ASIOCanSampleRate( defaultSampleRateSearchOrder_[j] ); + if( asioError != ASE_NoClock && asioError != ASE_NotPresent ) + { + deviceInfo->defaultSampleRate = defaultSampleRateSearchOrder_[j]; + foundDefaultSampleRate = true; + break; + } + } + + PA_DEBUG(("PaAsio_Initialize: drv:%d defaultSampleRate = %f\n", i, deviceInfo->defaultSampleRate)); + + if( foundDefaultSampleRate ){ + + /* calculate default latency values from bufferPreferredSize + for default low latency, and bufferMaxSize + for default high latency. + use the default sample rate to convert from samples to + seconds. Without knowing what sample rate the user will + use this is the best we can do. + */ + + double defaultLowLatency = + paAsioDriverInfo.bufferPreferredSize / deviceInfo->defaultSampleRate; + + deviceInfo->defaultLowInputLatency = defaultLowLatency; + deviceInfo->defaultLowOutputLatency = defaultLowLatency; + + double defaultHighLatency = + paAsioDriverInfo.bufferMaxSize / deviceInfo->defaultSampleRate; + + if( defaultHighLatency < defaultLowLatency ) + defaultHighLatency = defaultLowLatency; /* just in case the driver returns something strange */ + + deviceInfo->defaultHighInputLatency = defaultHighLatency; + deviceInfo->defaultHighOutputLatency = defaultHighLatency; + + }else{ + + deviceInfo->defaultLowInputLatency = 0.; + deviceInfo->defaultLowOutputLatency = 0.; + deviceInfo->defaultHighInputLatency = 0.; + deviceInfo->defaultHighOutputLatency = 0.; + } + + PA_DEBUG(("PaAsio_Initialize: drv:%d defaultLowInputLatency = %f\n", i, deviceInfo->defaultLowInputLatency)); + PA_DEBUG(("PaAsio_Initialize: drv:%d defaultLowOutputLatency = %f\n", i, deviceInfo->defaultLowOutputLatency)); + PA_DEBUG(("PaAsio_Initialize: drv:%d defaultHighInputLatency = %f\n", i, deviceInfo->defaultHighInputLatency)); + PA_DEBUG(("PaAsio_Initialize: drv:%d defaultHighOutputLatency = %f\n", i, deviceInfo->defaultHighOutputLatency)); + + asioDeviceInfo->minBufferSize = paAsioDriverInfo.bufferMinSize; + asioDeviceInfo->maxBufferSize = paAsioDriverInfo.bufferMaxSize; + asioDeviceInfo->preferredBufferSize = paAsioDriverInfo.bufferPreferredSize; + asioDeviceInfo->bufferGranularity = paAsioDriverInfo.bufferGranularity; + + + asioDeviceInfo->asioChannelInfos = (ASIOChannelInfo*)PaUtil_GroupAllocateMemory( + asioHostApi->allocations, + sizeof(ASIOChannelInfo) * (deviceInfo->maxInputChannels + + deviceInfo->maxOutputChannels) ); + if( !asioDeviceInfo->asioChannelInfos ) + { + result = paInsufficientMemory; + goto error_unload; + } + + int a; + + for( a=0; a < deviceInfo->maxInputChannels; ++a ){ + asioDeviceInfo->asioChannelInfos[a].channel = a; + asioDeviceInfo->asioChannelInfos[a].isInput = ASIOTrue; + ASIOError asioError = ASIOGetChannelInfo( &asioDeviceInfo->asioChannelInfos[a] ); + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error_unload; + } + } + + for( a=0; a < deviceInfo->maxOutputChannels; ++a ){ + int b = deviceInfo->maxInputChannels + a; + asioDeviceInfo->asioChannelInfos[b].channel = a; + asioDeviceInfo->asioChannelInfos[b].isInput = ASIOFalse; + ASIOError asioError = ASIOGetChannelInfo( &asioDeviceInfo->asioChannelInfos[b] ); + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error_unload; + } + } + + + /* unload the driver */ + UnloadAsioDriver(); + + (*hostApi)->deviceInfos[ (*hostApi)->info.deviceCount ] = deviceInfo; + ++(*hostApi)->info.deviceCount; + } + } + } + + if( (*hostApi)->info.deviceCount > 0 ) + { + (*hostApi)->info.defaultInputDevice = 0; + (*hostApi)->info.defaultOutputDevice = 0; + } + else + { + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + } + + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &asioHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &asioHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + return result; + +error_unload: + UnloadAsioDriver(); + +error: + if( asioHostApi ) + { + if( asioHostApi->allocations ) + { + PaUtil_FreeAllAllocations( asioHostApi->allocations ); + PaUtil_DestroyAllocationGroup( asioHostApi->allocations ); + } + + delete asioHostApi->asioDrivers; + asioDrivers = 0; /* keep SDK global in sync until we stop depending on it */ + + PaWinUtil_CoUninitialize( paASIO, &asioHostApi->comInitializationResult ); + + PaUtil_FreeMemory( asioHostApi ); + } + + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaAsioHostApiRepresentation *asioHostApi = (PaAsioHostApiRepresentation*)hostApi; + + /* + IMPLEMENT ME: + - clean up any resources not handled by the allocation group (need to review if there are any) + */ + + if( asioHostApi->allocations ) + { + PaUtil_FreeAllAllocations( asioHostApi->allocations ); + PaUtil_DestroyAllocationGroup( asioHostApi->allocations ); + } + + delete asioHostApi->asioDrivers; + asioDrivers = 0; /* keep SDK global in sync until we stop depending on it */ + + PaWinUtil_CoUninitialize( paASIO, &asioHostApi->comInitializationResult ); + + PaUtil_FreeMemory( asioHostApi ); +} + + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaError result = paNoError; + PaAsioHostApiRepresentation *asioHostApi = (PaAsioHostApiRepresentation*)hostApi; + PaAsioDriverInfo *driverInfo = &asioHostApi->openAsioDriverInfo; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaDeviceIndex asioDeviceIndex; + ASIOError asioError; + + if( inputParameters && outputParameters ) + { + /* full duplex ASIO stream must use the same device for input and output */ + + if( inputParameters->device != outputParameters->device ) + return paBadIODeviceCombination; + } + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( inputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + asioDeviceIndex = inputParameters->device; + + /* validate inputStreamInfo */ + /** @todo do more validation here */ + // if( inputParameters->hostApiSpecificStreamInfo ) + // return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( outputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + asioDeviceIndex = outputParameters->device; + + /* validate outputStreamInfo */ + /** @todo do more validation here */ + // if( outputParameters->hostApiSpecificStreamInfo ) + // return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + outputChannelCount = 0; + } + + + + /* if an ASIO device is open we can only get format information for the currently open device */ + + if( asioHostApi->openAsioDeviceIndex != paNoDevice + && asioHostApi->openAsioDeviceIndex != asioDeviceIndex ) + { + return paDeviceUnavailable; + } + + + /* NOTE: we load the driver and use its current settings + rather than the ones in our device info structure which may be stale */ + + /* open the device if it's not already open */ + if( asioHostApi->openAsioDeviceIndex == paNoDevice ) + { + result = LoadAsioDriver( asioHostApi, asioHostApi->inheritedHostApiRep.deviceInfos[ asioDeviceIndex ]->name, + driverInfo, asioHostApi->systemSpecific ); + if( result != paNoError ) + return result; + } + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > 0 ) + { + if( inputChannelCount > driverInfo->inputChannelCount ) + { + result = paInvalidChannelCount; + goto done; + } + } + + /* check that output device can support outputChannelCount */ + if( outputChannelCount ) + { + if( outputChannelCount > driverInfo->outputChannelCount ) + { + result = paInvalidChannelCount; + goto done; + } + } + + /* query for sample rate support */ + asioError = ASIOCanSampleRate( sampleRate ); + if( asioError == ASE_NoClock || asioError == ASE_NotPresent ) + { + result = paInvalidSampleRate; + goto done; + } + +done: + /* close the device if it wasn't already open */ + if( asioHostApi->openAsioDeviceIndex == paNoDevice ) + { + UnloadAsioDriver(); /* not sure if we should check for errors here */ + } + + if( result == paNoError ) + return paFormatIsSupported; + else + return result; +} + + + +/** A data structure specifically for storing blocking i/o related data. */ +typedef struct PaAsioStreamBlockingState +{ + int stopFlag; /**< Flag indicating that block processing is to be stopped. */ + + unsigned long writeBuffersRequested; /**< The number of available output buffers, requested by the #WriteStream() function. */ + unsigned long readFramesRequested; /**< The number of available input frames, requested by the #ReadStream() function. */ + + int writeBuffersRequestedFlag; /**< Flag to indicate that #WriteStream() has requested more output buffers to be available. */ + int readFramesRequestedFlag; /**< Flag to indicate that #ReadStream() requires more input frames to be available. */ + + HANDLE writeBuffersReadyEvent; /**< Event to signal that requested output buffers are available. */ + HANDLE readFramesReadyEvent; /**< Event to signal that requested input frames are available. */ + + void *writeRingBufferData; /**< The actual ring buffer memory, used by the output ring buffer. */ + void *readRingBufferData; /**< The actual ring buffer memory, used by the input ring buffer. */ + + PaUtilRingBuffer writeRingBuffer; /**< Frame-aligned blocking i/o ring buffer to store output data (interleaved user format). */ + PaUtilRingBuffer readRingBuffer; /**< Frame-aligned blocking i/o ring buffer to store input data (interleaved user format). */ + + long writeRingBufferInitialFrames; /**< The initial number of silent frames within the output ring buffer. */ + + const void **writeStreamBuffer; /**< Temp buffer, used by #WriteStream() for handling non-interleaved data. */ + void **readStreamBuffer; /**< Temp buffer, used by #ReadStream() for handling non-interleaved data. */ + + PaUtilBufferProcessor bufferProcessor; /**< Buffer processor, used to handle the blocking i/o ring buffers. */ + + int outputUnderflowFlag; /**< Flag to signal an output underflow from within the callback function. */ + int inputOverflowFlag; /**< Flag to signal an input overflow from within the callback function. */ +} +PaAsioStreamBlockingState; + + + +/* PaAsioStream - a stream data structure specifically for this implementation */ + +typedef struct PaAsioStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + PaAsioHostApiRepresentation *asioHostApi; + unsigned long framesPerHostCallback; + + /* ASIO driver info - these may not be needed for the life of the stream, + but store them here until we work out how format conversion is going + to work. */ + + ASIOBufferInfo *asioBufferInfos; + ASIOChannelInfo *asioChannelInfos; + long asioInputLatencyFrames, asioOutputLatencyFrames; // actual latencies returned by asio + + long inputChannelCount, outputChannelCount; + bool postOutput; + + void **bufferPtrs; /* this is carved up for inputBufferPtrs and outputBufferPtrs */ + void **inputBufferPtrs[2]; + void **outputBufferPtrs[2]; + + PaAsioBufferConverter *inputBufferConverter; + long inputShift; + PaAsioBufferConverter *outputBufferConverter; + long outputShift; + + volatile bool stopProcessing; + int stopPlayoutCount; + HANDLE completedBuffersPlayedEvent; + + bool streamFinishedCallbackCalled; + int isStopped; + volatile int isActive; + volatile bool zeroOutput; /* all future calls to the callback will output silence */ + + volatile long reenterCount; + volatile long reenterError; + + PaStreamCallbackFlags callbackFlags; + + PaAsioStreamBlockingState *blockingState; /**< Blocking i/o data struct, or NULL when using callback interface. */ +} +PaAsioStream; + +static PaAsioStream *theAsioStream = 0; /* due to ASIO sdk limitations there can be only one stream */ + + +static void ZeroOutputBuffers( PaAsioStream *stream, long index ) +{ + int i; + + for( i=0; i < stream->outputChannelCount; ++i ) + { + void *buffer = stream->asioBufferInfos[ i + stream->inputChannelCount ].buffers[index]; + + int bytesPerSample = BytesPerAsioSample( stream->asioChannelInfos[ i + stream->inputChannelCount ].type ); + + memset( buffer, 0, stream->framesPerHostCallback * bytesPerSample ); + } +} + + +/* return the next power of two >= x. + Returns the input parameter if it is already a power of two. + http://stackoverflow.com/questions/364985/algorithm-for-finding-the-smallest-power-of-two-thats-greater-or-equal-to-a-giv +*/ +static unsigned long NextPowerOfTwo( unsigned long x ) +{ + --x; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + /* If you needed to deal with numbers > 2^32 the following would be needed. + For latencies, we don't deal with values this large. + x |= x >> 16; + */ + + return x + 1; +} + + +static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( + unsigned long targetBufferingLatencyFrames, PaAsioDriverInfo *driverInfo ) +{ + /* Choose a host buffer size based only on targetBufferingLatencyFrames and the + device's supported buffer sizes. Always returns a valid value. + */ + + unsigned long result; + + if( targetBufferingLatencyFrames <= (unsigned long)driverInfo->bufferMinSize ) + { + result = driverInfo->bufferMinSize; + } + else if( targetBufferingLatencyFrames >= (unsigned long)driverInfo->bufferMaxSize ) + { + result = driverInfo->bufferMaxSize; + } + else + { + if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ + { + /* The documentation states that bufferGranularity should be zero + when bufferMinSize, bufferMaxSize and bufferPreferredSize are the + same. We assume that is the case. + */ + + result = driverInfo->bufferPreferredSize; + } + else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ + { + /* We assume bufferMinSize and bufferMaxSize are powers of two. */ + + result = NextPowerOfTwo( targetBufferingLatencyFrames ); + + if( result < (unsigned long)driverInfo->bufferMinSize ) + result = driverInfo->bufferMinSize; + + if( result > (unsigned long)driverInfo->bufferMaxSize ) + result = driverInfo->bufferMaxSize; + } + else /* modulo bufferGranularity */ + { + /* round up to the next multiple of granularity */ + unsigned long n = (targetBufferingLatencyFrames + driverInfo->bufferGranularity - 1) + / driverInfo->bufferGranularity; + + result = n * driverInfo->bufferGranularity; + + if( result < (unsigned long)driverInfo->bufferMinSize ) + result = driverInfo->bufferMinSize; + + if( result > (unsigned long)driverInfo->bufferMaxSize ) + result = driverInfo->bufferMaxSize; + } + } + + return result; +} + + +static unsigned long SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( + unsigned long targetBufferingLatencyFrames, unsigned long userFramesPerBuffer, + PaAsioDriverInfo *driverInfo ) +{ + /* Select a host buffer size conforming to targetBufferingLatencyFrames + and the device's supported buffer sizes. + The return value will always be a multiple of userFramesPerBuffer. + If a valid buffer size can not be found the function returns 0. + + The current implementation uses a simple iterative search for clarity. + Feel free to suggest a closed form solution. + */ + unsigned long result = 0; + + assert( userFramesPerBuffer != 0 ); + + if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ + { + /* The documentation states that bufferGranularity should be zero + when bufferMinSize, bufferMaxSize and bufferPreferredSize are the + same. We assume that is the case. + */ + + if( (driverInfo->bufferPreferredSize % userFramesPerBuffer) == 0 ) + result = driverInfo->bufferPreferredSize; + } + else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ + { + /* We assume bufferMinSize and bufferMaxSize are powers of two. */ + + /* Search all powers of two in the range [bufferMinSize,bufferMaxSize] + for multiples of userFramesPerBuffer. We prefer the first multiple + that is equal or greater than targetBufferingLatencyFrames, or + failing that, the largest multiple less than + targetBufferingLatencyFrames. + */ + unsigned long x = (unsigned long)driverInfo->bufferMinSize; + do { + if( (x % userFramesPerBuffer) == 0 ) + { + /* any power-of-two multiple of userFramesPerBuffer is acceptable */ + result = x; + if( result >= targetBufferingLatencyFrames ) + break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ + } + + x *= 2; + } while( x <= (unsigned long)driverInfo->bufferMaxSize ); + } + else /* modulo granularity */ + { + /* We assume bufferMinSize is a multiple of bufferGranularity. */ + + /* Search all multiples of bufferGranularity in the range + [bufferMinSize,bufferMaxSize] for multiples of userFramesPerBuffer. + We prefer the first multiple that is equal or greater than + targetBufferingLatencyFrames, or failing that, the largest multiple + less than targetBufferingLatencyFrames. + */ + unsigned long x = (unsigned long)driverInfo->bufferMinSize; + do { + if( (x % userFramesPerBuffer) == 0 ) + { + /* any power-of-two multiple of userFramesPerBuffer is acceptable */ + result = x; + if( result >= targetBufferingLatencyFrames ) + break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ + } + + x += driverInfo->bufferGranularity; + } while( x <= (unsigned long)driverInfo->bufferMaxSize ); + } + + return result; +} + + +static unsigned long SelectHostBufferSize( + unsigned long targetBufferingLatencyFrames, + unsigned long userFramesPerBuffer, PaAsioDriverInfo *driverInfo ) +{ + unsigned long result = 0; + + /* We select a host buffer size based on the following requirements + (in priority order): + + 1. The host buffer size must be permissible according to the ASIO + driverInfo buffer size constraints (min, max, granularity or + powers-of-two). + + 2. If the user specifies a non-zero framesPerBuffer parameter + (userFramesPerBuffer here) the host buffer should be a multiple of + this (subject to the constraints in (1) above). + + [NOTE: Where no permissible host buffer size is a multiple of + userFramesPerBuffer, we choose a value as if userFramesPerBuffer were + zero (i.e. we ignore it). This strategy is open for review ~ perhaps + there are still "more optimal" buffer sizes related to + userFramesPerBuffer that we could use.] + + 3. The host buffer size should be greater than or equal to + targetBufferingLatencyFrames, subject to (1) and (2) above. Where it + is not possible to select a host buffer size equal or greater than + targetBufferingLatencyFrames, the highest buffer size conforming to + (1) and (2) should be chosen. + */ + + if( userFramesPerBuffer != 0 ) + { + /* userFramesPerBuffer is specified, try to find a buffer size that's + a multiple of it */ + result = SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( + targetBufferingLatencyFrames, userFramesPerBuffer, driverInfo ); + } + + if( result == 0 ) + { + /* either userFramesPerBuffer was not specified, or we couldn't find a + host buffer size that is a multiple of it. Select a host buffer size + according to targetBufferingLatencyFrames and the ASIO driverInfo + buffer size constraints. + */ + result = SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( + targetBufferingLatencyFrames, driverInfo ); + } + + return result; +} + + +/* returns channelSelectors if present */ + +static PaError ValidateAsioSpecificStreamInfo( + const PaStreamParameters *streamParameters, + const PaAsioStreamInfo *streamInfo, + int deviceChannelCount, + int **channelSelectors ) +{ + if( streamInfo ) + { + if( streamInfo->size != sizeof( PaAsioStreamInfo ) + || streamInfo->version != 1 ) + { + return paIncompatibleHostApiSpecificStreamInfo; + } + + if( streamInfo->flags & paAsioUseChannelSelectors ) + *channelSelectors = streamInfo->channelSelectors; + + if( !(*channelSelectors) ) + return paIncompatibleHostApiSpecificStreamInfo; + + for( int i=0; i < streamParameters->channelCount; ++i ){ + if( (*channelSelectors)[i] < 0 + || (*channelSelectors)[i] >= deviceChannelCount ){ + return paInvalidChannelCount; + } + } + } + + return paNoError; +} + + +static bool IsUsingExternalClockSource() +{ + bool result = false; + ASIOError asioError; + ASIOClockSource clocks[32]; + long numSources=32; + + /* davidv: listing ASIO Clock sources. there is an ongoing investigation by + me about whether or not to call ASIOSetSampleRate if an external Clock is + used. A few drivers expected different things here */ + + asioError = ASIOGetClockSources(clocks, &numSources); + if( asioError != ASE_OK ){ + PA_DEBUG(("ERROR: ASIOGetClockSources: %s\n", PaAsio_GetAsioErrorText(asioError) )); + }else{ + PA_DEBUG(("INFO ASIOGetClockSources listing %d clocks\n", numSources )); + for (int i=0;iopenAsioDeviceIndex != paNoDevice ) + { + PA_DEBUG(("OpenStream paDeviceUnavailable\n")); + return paDeviceUnavailable; + } + + assert( theAsioStream == 0 ); + + if( inputParameters && outputParameters ) + { + /* full duplex ASIO stream must use the same device for input and output */ + + if( inputParameters->device != outputParameters->device ) + { + PA_DEBUG(("OpenStream paBadIODeviceCombination\n")); + return paBadIODeviceCombination; + } + } + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + suggestedInputLatencyFrames = (unsigned long)((inputParameters->suggestedLatency * sampleRate)+0.5f); + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + asioDeviceIndex = inputParameters->device; + + PaAsioDeviceInfo *asioDeviceInfo = (PaAsioDeviceInfo*)hostApi->deviceInfos[asioDeviceIndex]; + + /* validate hostApiSpecificStreamInfo */ + inputStreamInfo = (PaAsioStreamInfo*)inputParameters->hostApiSpecificStreamInfo; + result = ValidateAsioSpecificStreamInfo( inputParameters, inputStreamInfo, + asioDeviceInfo->commonDeviceInfo.maxInputChannels, + &inputChannelSelectors + ); + if( result != paNoError ) return result; + } + else + { + inputChannelCount = 0; + inputSampleFormat = 0; + suggestedInputLatencyFrames = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + suggestedOutputLatencyFrames = (unsigned long)((outputParameters->suggestedLatency * sampleRate)+0.5f); + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + asioDeviceIndex = outputParameters->device; + + PaAsioDeviceInfo *asioDeviceInfo = (PaAsioDeviceInfo*)hostApi->deviceInfos[asioDeviceIndex]; + + /* validate hostApiSpecificStreamInfo */ + outputStreamInfo = (PaAsioStreamInfo*)outputParameters->hostApiSpecificStreamInfo; + result = ValidateAsioSpecificStreamInfo( outputParameters, outputStreamInfo, + asioDeviceInfo->commonDeviceInfo.maxOutputChannels, + &outputChannelSelectors + ); + if( result != paNoError ) return result; + } + else + { + outputChannelCount = 0; + outputSampleFormat = 0; + suggestedOutputLatencyFrames = 0; + } + + driverInfo = &asioHostApi->openAsioDriverInfo; + + /* NOTE: we load the driver and use its current settings + rather than the ones in our device info structure which may be stale */ + + result = LoadAsioDriver( asioHostApi, asioHostApi->inheritedHostApiRep.deviceInfos[ asioDeviceIndex ]->name, + driverInfo, asioHostApi->systemSpecific ); + if( result == paNoError ) + asioIsInitialized = 1; + else{ + PA_DEBUG(("OpenStream ERROR1 - LoadAsioDriver returned %d\n", result)); + goto error; + } + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > 0 ) + { + if( inputChannelCount > driverInfo->inputChannelCount ) + { + result = paInvalidChannelCount; + PA_DEBUG(("OpenStream ERROR2\n")); + goto error; + } + } + + /* check that output device can support outputChannelCount */ + if( outputChannelCount ) + { + if( outputChannelCount > driverInfo->outputChannelCount ) + { + result = paInvalidChannelCount; + PA_DEBUG(("OpenStream ERROR3\n")); + goto error; + } + } + + result = ValidateAndSetSampleRate( sampleRate ); + if( result != paNoError ) + goto error; + + /* + IMPLEMENT ME: + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + */ + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ){ + PA_DEBUG(("OpenStream invalid flags!!\n")); + return paInvalidFlag; /* unexpected platform specific flag */ + } + + + stream = (PaAsioStream*)PaUtil_AllocateMemory( sizeof(PaAsioStream) ); + if( !stream ) + { + result = paInsufficientMemory; + PA_DEBUG(("OpenStream ERROR5\n")); + goto error; + } + stream->blockingState = NULL; /* Blocking i/o not initialized, yet. */ + + + stream->completedBuffersPlayedEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); + if( stream->completedBuffersPlayedEvent == NULL ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + PA_DEBUG(("OpenStream ERROR6\n")); + goto error; + } + completedBuffersPlayedEventInited = 1; + + + stream->asioBufferInfos = 0; /* for deallocation in error */ + stream->asioChannelInfos = 0; /* for deallocation in error */ + stream->bufferPtrs = 0; /* for deallocation in error */ + + /* Using blocking i/o interface... */ + if( usingBlockingIo ) + { + /* Blocking i/o is implemented by running callback mode, using a special blocking i/o callback. */ + streamCallback = BlockingIoPaCallback; /* Setup PA to use the ASIO blocking i/o callback. */ + userData = &theAsioStream; /* The callback user data will be the PA ASIO stream. */ + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &asioHostApi->blockingStreamInterface, streamCallback, userData ); + } + else /* Using callback interface... */ + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &asioHostApi->callbackStreamInterface, streamCallback, userData ); + } + + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + + stream->asioBufferInfos = (ASIOBufferInfo*)PaUtil_AllocateMemory( + sizeof(ASIOBufferInfo) * (inputChannelCount + outputChannelCount) ); + if( !stream->asioBufferInfos ) + { + result = paInsufficientMemory; + PA_DEBUG(("OpenStream ERROR7\n")); + goto error; + } + + + for( i=0; i < inputChannelCount; ++i ) + { + ASIOBufferInfo *info = &stream->asioBufferInfos[i]; + + info->isInput = ASIOTrue; + + if( inputChannelSelectors ){ + // inputChannelSelectors values have already been validated in + // ValidateAsioSpecificStreamInfo() above + info->channelNum = inputChannelSelectors[i]; + }else{ + info->channelNum = i; + } + + info->buffers[0] = info->buffers[1] = 0; + } + + for( i=0; i < outputChannelCount; ++i ){ + ASIOBufferInfo *info = &stream->asioBufferInfos[inputChannelCount+i]; + + info->isInput = ASIOFalse; + + if( outputChannelSelectors ){ + // outputChannelSelectors values have already been validated in + // ValidateAsioSpecificStreamInfo() above + info->channelNum = outputChannelSelectors[i]; + }else{ + info->channelNum = i; + } + + info->buffers[0] = info->buffers[1] = 0; + } + + + /* Using blocking i/o interface... */ + if( usingBlockingIo ) + { +/** @todo REVIEW selection of host buffer size for blocking i/o */ + + framesPerHostBuffer = SelectHostBufferSize( 0, framesPerBuffer, driverInfo ); + + } + else /* Using callback interface... */ + { + /* Select the host buffer size based on user framesPerBuffer and the + maximum of suggestedInputLatencyFrames and + suggestedOutputLatencyFrames. + + We should subtract any fixed known driver latency from + suggestedLatencyFrames before computing the host buffer size. + However, the ASIO API doesn't provide a method for determining fixed + latencies independent of the host buffer size. ASIOGetLatencies() + only returns latencies after the buffer size has been configured, so + we can't reliably use it to determine fixed latencies here. + + We could set the preferred buffer size and then subtract it from + the values returned from ASIOGetLatencies, but this would not be 100% + reliable, so we don't do it. + */ + + unsigned long targetBufferingLatencyFrames = + (( suggestedInputLatencyFrames > suggestedOutputLatencyFrames ) + ? suggestedInputLatencyFrames + : suggestedOutputLatencyFrames); + + framesPerHostBuffer = SelectHostBufferSize( targetBufferingLatencyFrames, + framesPerBuffer, driverInfo ); + } + + + PA_DEBUG(("PaAsioOpenStream: framesPerHostBuffer :%d\n", framesPerHostBuffer)); + + asioError = ASIOCreateBuffers( stream->asioBufferInfos, + inputChannelCount+outputChannelCount, + framesPerHostBuffer, &asioCallbacks_ ); + + if( asioError != ASE_OK + && framesPerHostBuffer != (unsigned long)driverInfo->bufferPreferredSize ) + { + PA_DEBUG(("ERROR: ASIOCreateBuffers: %s\n", PaAsio_GetAsioErrorText(asioError) )); + /* + Some buggy drivers (like the Hoontech DSP24) give incorrect + [min, preferred, max] values They should work with the preferred size + value, thus if Pa_ASIO_CreateBuffers fails with the hostBufferSize + computed in SelectHostBufferSize, we try again with the preferred size. + */ + + framesPerHostBuffer = driverInfo->bufferPreferredSize; + + PA_DEBUG(("PaAsioOpenStream: CORRECTED framesPerHostBuffer :%d\n", framesPerHostBuffer)); + + ASIOError asioError2 = ASIOCreateBuffers( stream->asioBufferInfos, + inputChannelCount+outputChannelCount, + framesPerHostBuffer, &asioCallbacks_ ); + if( asioError2 == ASE_OK ) + asioError = ASE_OK; + } + + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + PA_DEBUG(("OpenStream ERROR9\n")); + goto error; + } + + asioBuffersCreated = 1; + + stream->asioChannelInfos = (ASIOChannelInfo*)PaUtil_AllocateMemory( + sizeof(ASIOChannelInfo) * (inputChannelCount + outputChannelCount) ); + if( !stream->asioChannelInfos ) + { + result = paInsufficientMemory; + PA_DEBUG(("OpenStream ERROR10\n")); + goto error; + } + + for( i=0; i < inputChannelCount + outputChannelCount; ++i ) + { + stream->asioChannelInfos[i].channel = stream->asioBufferInfos[i].channelNum; + stream->asioChannelInfos[i].isInput = stream->asioBufferInfos[i].isInput; + asioError = ASIOGetChannelInfo( &stream->asioChannelInfos[i] ); + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + PA_DEBUG(("OpenStream ERROR11\n")); + goto error; + } + } + + stream->bufferPtrs = (void**)PaUtil_AllocateMemory( + 2 * sizeof(void*) * (inputChannelCount + outputChannelCount) ); + if( !stream->bufferPtrs ) + { + result = paInsufficientMemory; + PA_DEBUG(("OpenStream ERROR12\n")); + goto error; + } + + if( inputChannelCount > 0 ) + { + stream->inputBufferPtrs[0] = stream-> bufferPtrs; + stream->inputBufferPtrs[1] = &stream->bufferPtrs[inputChannelCount]; + + for( i=0; iinputBufferPtrs[0][i] = stream->asioBufferInfos[i].buffers[0]; + stream->inputBufferPtrs[1][i] = stream->asioBufferInfos[i].buffers[1]; + } + } + else + { + stream->inputBufferPtrs[0] = 0; + stream->inputBufferPtrs[1] = 0; + } + + if( outputChannelCount > 0 ) + { + stream->outputBufferPtrs[0] = &stream->bufferPtrs[inputChannelCount*2]; + stream->outputBufferPtrs[1] = &stream->bufferPtrs[inputChannelCount*2 + outputChannelCount]; + + for( i=0; ioutputBufferPtrs[0][i] = stream->asioBufferInfos[inputChannelCount+i].buffers[0]; + stream->outputBufferPtrs[1][i] = stream->asioBufferInfos[inputChannelCount+i].buffers[1]; + } + } + else + { + stream->outputBufferPtrs[0] = 0; + stream->outputBufferPtrs[1] = 0; + } + + if( inputChannelCount > 0 ) + { + /* FIXME: assume all channels use the same type for now + + see: "ASIO devices with multiple sample formats are unsupported" + http://www.portaudio.com/trac/ticket/106 + */ + ASIOSampleType inputType = stream->asioChannelInfos[0].type; + + PA_DEBUG(("ASIO Input type:%d",inputType)); + AsioSampleTypeLOG(inputType); + hostInputSampleFormat = AsioSampleTypeToPaNativeSampleFormat( inputType ); + + SelectAsioToPaConverter( inputType, &stream->inputBufferConverter, &stream->inputShift ); + } + else + { + hostInputSampleFormat = 0; + stream->inputBufferConverter = 0; + } + + if( outputChannelCount > 0 ) + { + /* FIXME: assume all channels use the same type for now + + see: "ASIO devices with multiple sample formats are unsupported" + http://www.portaudio.com/trac/ticket/106 + */ + ASIOSampleType outputType = stream->asioChannelInfos[inputChannelCount].type; + + PA_DEBUG(("ASIO Output type:%d",outputType)); + AsioSampleTypeLOG(outputType); + hostOutputSampleFormat = AsioSampleTypeToPaNativeSampleFormat( outputType ); + + SelectPaToAsioConverter( outputType, &stream->outputBufferConverter, &stream->outputShift ); + } + else + { + hostOutputSampleFormat = 0; + stream->outputBufferConverter = 0; + } + + /* Values returned by ASIOGetLatencies() include the latency introduced by + the ASIO double buffer. */ + ASIOGetLatencies( &stream->asioInputLatencyFrames, &stream->asioOutputLatencyFrames ); + + + /* Using blocking i/o interface... */ + if( usingBlockingIo ) + { + /* Allocate the blocking i/o input ring buffer memory. */ + stream->blockingState = (PaAsioStreamBlockingState*)PaUtil_AllocateMemory( sizeof(PaAsioStreamBlockingState) ); + if( !stream->blockingState ) + { + result = paInsufficientMemory; + PA_DEBUG(("ERROR! Blocking i/o interface struct allocation failed in OpenStream()\n")); + goto error; + } + + /* Initialize blocking i/o interface struct. */ + stream->blockingState->readFramesReadyEvent = NULL; /* Uninitialized, yet. */ + stream->blockingState->writeBuffersReadyEvent = NULL; /* Uninitialized, yet. */ + stream->blockingState->readRingBufferData = NULL; /* Uninitialized, yet. */ + stream->blockingState->writeRingBufferData = NULL; /* Uninitialized, yet. */ + stream->blockingState->readStreamBuffer = NULL; /* Uninitialized, yet. */ + stream->blockingState->writeStreamBuffer = NULL; /* Uninitialized, yet. */ + stream->blockingState->stopFlag = TRUE; /* Not started, yet. */ + + + /* If the user buffer is unspecified */ + if( framesPerBuffer == paFramesPerBufferUnspecified ) + { + /* Make the user buffer the same size as the host buffer. */ + framesPerBuffer = framesPerHostBuffer; + } + + + /* Initialize callback buffer processor. */ + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor , + inputChannelCount , + inputSampleFormat & ~paNonInterleaved , /* Ring buffer. */ + hostInputSampleFormat , /* Host format. */ + outputChannelCount , + outputSampleFormat & ~paNonInterleaved, /* Ring buffer. */ + hostOutputSampleFormat , /* Host format. */ + sampleRate , + streamFlags , + framesPerBuffer , /* Frames per ring buffer block. */ + framesPerHostBuffer , /* Frames per asio buffer. */ + paUtilFixedHostBufferSize , + streamCallback , + userData ); + if( result != paNoError ){ + PA_DEBUG(("OpenStream ERROR13\n")); + goto error; + } + callbackBufferProcessorInited = TRUE; + + /* Initialize the blocking i/o buffer processor. */ + result = PaUtil_InitializeBufferProcessor(&stream->blockingState->bufferProcessor, + inputChannelCount , + inputSampleFormat , /* User format. */ + inputSampleFormat & ~paNonInterleaved , /* Ring buffer. */ + outputChannelCount , + outputSampleFormat , /* User format. */ + outputSampleFormat & ~paNonInterleaved, /* Ring buffer. */ + sampleRate , + paClipOff | paDitherOff , /* Don't use dither nor clipping. */ + framesPerBuffer , /* Frames per user buffer. */ + framesPerBuffer , /* Frames per ring buffer block. */ + paUtilBoundedHostBufferSize , + NULL, NULL );/* No callback! */ + if( result != paNoError ){ + PA_DEBUG(("ERROR! Blocking i/o buffer processor initialization failed in OpenStream()\n")); + goto error; + } + blockingBufferProcessorInited = TRUE; + + /* If input is requested. */ + if( inputChannelCount ) + { + /* Create the callback sync-event. */ + stream->blockingState->readFramesReadyEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + if( stream->blockingState->readFramesReadyEvent == NULL ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + PA_DEBUG(("ERROR! Blocking i/o \"read frames ready\" event creation failed in OpenStream()\n")); + goto error; + } + blockingReadFramesReadyEventInitialized = 1; + + + /* Create pointer buffer to access non-interleaved data in ReadStream() */ + stream->blockingState->readStreamBuffer = (void**)PaUtil_AllocateMemory( sizeof(void*) * inputChannelCount ); + if( !stream->blockingState->readStreamBuffer ) + { + result = paInsufficientMemory; + PA_DEBUG(("ERROR! Blocking i/o read stream buffer allocation failed in OpenStream()\n")); + goto error; + } + + /* The ring buffer should store as many data blocks as needed + to achieve the requested latency. Whereas it must be large + enough to store at least two complete data blocks. + + 1) Determine the amount of latency to be added to the + prefered ASIO latency. + 2) Make sure we have at lest one additional latency frame. + 3) Divide the number of frames by the desired block size to + get the number (rounded up to pure integer) of blocks to + be stored in the buffer. + 4) Add one additional block for block processing and convert + to samples frames. + 5) Get the next larger (or equal) power-of-two buffer size. + */ + lBlockingBufferSize = suggestedInputLatencyFrames - stream->asioInputLatencyFrames; + lBlockingBufferSize = (lBlockingBufferSize > 0) ? lBlockingBufferSize : 1; + lBlockingBufferSize = (lBlockingBufferSize + framesPerBuffer - 1) / framesPerBuffer; + lBlockingBufferSize = (lBlockingBufferSize + 1) * framesPerBuffer; + + /* Get the next larger or equal power-of-two buffersize. */ + lBlockingBufferSizePow2 = 1; + while( lBlockingBufferSize > (lBlockingBufferSizePow2<<=1) ); + lBlockingBufferSize = lBlockingBufferSizePow2; + + /* Compute total intput latency in seconds */ + stream->streamRepresentation.streamInfo.inputLatency = + (double)( PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor ) + + PaUtil_GetBufferProcessorInputLatencyFrames(&stream->blockingState->bufferProcessor) + + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer + + stream->asioInputLatencyFrames ) + / sampleRate; + + /* The code below prints the ASIO latency which doesn't include + the buffer processor latency nor the blocking i/o latency. It + reports the added latency separately. + */ + PA_DEBUG(("PaAsio : ASIO InputLatency = %ld (%ld ms),\n added buffProc:%ld (%ld ms),\n added blocking:%ld (%ld ms)\n", + stream->asioInputLatencyFrames, + (long)( stream->asioInputLatencyFrames * (1000.0 / sampleRate) ), + PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor), + (long)( PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) * (1000.0 / sampleRate) ), + PaUtil_GetBufferProcessorInputLatencyFrames(&stream->blockingState->bufferProcessor) + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer, + (long)( (PaUtil_GetBufferProcessorInputLatencyFrames(&stream->blockingState->bufferProcessor) + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer) * (1000.0 / sampleRate) ) + )); + + /* Determine the size of ring buffer in bytes. */ + lBytesPerFrame = inputChannelCount * Pa_GetSampleSize(inputSampleFormat ); + + /* Allocate the blocking i/o input ring buffer memory. */ + stream->blockingState->readRingBufferData = (void*)PaUtil_AllocateMemory( lBlockingBufferSize * lBytesPerFrame ); + if( !stream->blockingState->readRingBufferData ) + { + result = paInsufficientMemory; + PA_DEBUG(("ERROR! Blocking i/o input ring buffer allocation failed in OpenStream()\n")); + goto error; + } + + /* Initialize the input ring buffer struct. */ + PaUtil_InitializeRingBuffer( &stream->blockingState->readRingBuffer , + lBytesPerFrame , + lBlockingBufferSize , + stream->blockingState->readRingBufferData ); + } + + /* If output is requested. */ + if( outputChannelCount ) + { + stream->blockingState->writeBuffersReadyEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + if( stream->blockingState->writeBuffersReadyEvent == NULL ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + PA_DEBUG(("ERROR! Blocking i/o \"write buffers ready\" event creation failed in OpenStream()\n")); + goto error; + } + blockingWriteBuffersReadyEventInitialized = 1; + + /* Create pointer buffer to access non-interleaved data in WriteStream() */ + stream->blockingState->writeStreamBuffer = (const void**)PaUtil_AllocateMemory( sizeof(const void*) * outputChannelCount ); + if( !stream->blockingState->writeStreamBuffer ) + { + result = paInsufficientMemory; + PA_DEBUG(("ERROR! Blocking i/o write stream buffer allocation failed in OpenStream()\n")); + goto error; + } + + /* The ring buffer should store as many data blocks as needed + to achieve the requested latency. Whereas it must be large + enough to store at least two complete data blocks. + + 1) Determine the amount of latency to be added to the + prefered ASIO latency. + 2) Make sure we have at lest one additional latency frame. + 3) Divide the number of frames by the desired block size to + get the number (rounded up to pure integer) of blocks to + be stored in the buffer. + 4) Add one additional block for block processing and convert + to samples frames. + 5) Get the next larger (or equal) power-of-two buffer size. + */ + lBlockingBufferSize = suggestedOutputLatencyFrames - stream->asioOutputLatencyFrames; + lBlockingBufferSize = (lBlockingBufferSize > 0) ? lBlockingBufferSize : 1; + lBlockingBufferSize = (lBlockingBufferSize + framesPerBuffer - 1) / framesPerBuffer; + lBlockingBufferSize = (lBlockingBufferSize + 1) * framesPerBuffer; + + /* The buffer size (without the additional block) corresponds + to the initial number of silent samples in the output ring + buffer. */ + stream->blockingState->writeRingBufferInitialFrames = lBlockingBufferSize - framesPerBuffer; + + /* Get the next larger or equal power-of-two buffersize. */ + lBlockingBufferSizePow2 = 1; + while( lBlockingBufferSize > (lBlockingBufferSizePow2<<=1) ); + lBlockingBufferSize = lBlockingBufferSizePow2; + + /* Compute total output latency in seconds */ + stream->streamRepresentation.streamInfo.outputLatency = + (double)( PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) + + PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->blockingState->bufferProcessor) + + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer + + stream->asioOutputLatencyFrames ) + / sampleRate; + + /* The code below prints the ASIO latency which doesn't include + the buffer processor latency nor the blocking i/o latency. It + reports the added latency separately. + */ + PA_DEBUG(("PaAsio : ASIO OutputLatency = %ld (%ld ms),\n added buffProc:%ld (%ld ms),\n added blocking:%ld (%ld ms)\n", + stream->asioOutputLatencyFrames, + (long)( stream->asioOutputLatencyFrames * (1000.0 / sampleRate) ), + PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor), + (long)( PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) * (1000.0 / sampleRate) ), + PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->blockingState->bufferProcessor) + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer, + (long)( (PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->blockingState->bufferProcessor) + (lBlockingBufferSize / framesPerBuffer - 1) * framesPerBuffer) * (1000.0 / sampleRate) ) + )); + + /* Determine the size of ring buffer in bytes. */ + lBytesPerFrame = outputChannelCount * Pa_GetSampleSize(outputSampleFormat); + + /* Allocate the blocking i/o output ring buffer memory. */ + stream->blockingState->writeRingBufferData = (void*)PaUtil_AllocateMemory( lBlockingBufferSize * lBytesPerFrame ); + if( !stream->blockingState->writeRingBufferData ) + { + result = paInsufficientMemory; + PA_DEBUG(("ERROR! Blocking i/o output ring buffer allocation failed in OpenStream()\n")); + goto error; + } + + /* Initialize the output ring buffer struct. */ + PaUtil_InitializeRingBuffer( &stream->blockingState->writeRingBuffer , + lBytesPerFrame , + lBlockingBufferSize , + stream->blockingState->writeRingBufferData ); + } + + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + + } + else /* Using callback interface... */ + { + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, (hostInputSampleFormat | paNonInterleaved), + outputChannelCount, outputSampleFormat, (hostOutputSampleFormat | paNonInterleaved), + sampleRate, streamFlags, framesPerBuffer, + framesPerHostBuffer, paUtilFixedHostBufferSize, + streamCallback, userData ); + if( result != paNoError ){ + PA_DEBUG(("OpenStream ERROR13\n")); + goto error; + } + callbackBufferProcessorInited = TRUE; + + stream->streamRepresentation.streamInfo.inputLatency = + (double)( PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) + + stream->asioInputLatencyFrames) / sampleRate; // seconds + stream->streamRepresentation.streamInfo.outputLatency = + (double)( PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) + + stream->asioOutputLatencyFrames) / sampleRate; // seconds + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + // the code below prints the ASIO latency which doesn't include the + // buffer processor latency. it reports the added latency separately + PA_DEBUG(("PaAsio : ASIO InputLatency = %ld (%ld ms), added buffProc:%ld (%ld ms)\n", + stream->asioInputLatencyFrames, + (long)((stream->asioInputLatencyFrames*1000)/ sampleRate), + PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor), + (long)((PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor)*1000)/ sampleRate) + )); + + PA_DEBUG(("PaAsio : ASIO OuputLatency = %ld (%ld ms), added buffProc:%ld (%ld ms)\n", + stream->asioOutputLatencyFrames, + (long)((stream->asioOutputLatencyFrames*1000)/ sampleRate), + PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor), + (long)((PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor)*1000)/ sampleRate) + )); + } + + stream->asioHostApi = asioHostApi; + stream->framesPerHostCallback = framesPerHostBuffer; + + stream->inputChannelCount = inputChannelCount; + stream->outputChannelCount = outputChannelCount; + stream->postOutput = driverInfo->postOutput; + stream->isStopped = 1; + stream->isActive = 0; + + asioHostApi->openAsioDeviceIndex = asioDeviceIndex; + + theAsioStream = stream; + *s = (PaStream*)stream; + + return result; + +error: + PA_DEBUG(("goto errored\n")); + if( stream ) + { + if( stream->blockingState ) + { + if( blockingBufferProcessorInited ) + PaUtil_TerminateBufferProcessor( &stream->blockingState->bufferProcessor ); + + if( stream->blockingState->writeRingBufferData ) + PaUtil_FreeMemory( stream->blockingState->writeRingBufferData ); + if( stream->blockingState->writeStreamBuffer ) + PaUtil_FreeMemory( stream->blockingState->writeStreamBuffer ); + if( blockingWriteBuffersReadyEventInitialized ) + CloseHandle( stream->blockingState->writeBuffersReadyEvent ); + + if( stream->blockingState->readRingBufferData ) + PaUtil_FreeMemory( stream->blockingState->readRingBufferData ); + if( stream->blockingState->readStreamBuffer ) + PaUtil_FreeMemory( stream->blockingState->readStreamBuffer ); + if( blockingReadFramesReadyEventInitialized ) + CloseHandle( stream->blockingState->readFramesReadyEvent ); + + PaUtil_FreeMemory( stream->blockingState ); + } + + if( callbackBufferProcessorInited ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( completedBuffersPlayedEventInited ) + CloseHandle( stream->completedBuffersPlayedEvent ); + + if( stream->asioBufferInfos ) + PaUtil_FreeMemory( stream->asioBufferInfos ); + + if( stream->asioChannelInfos ) + PaUtil_FreeMemory( stream->asioChannelInfos ); + + if( stream->bufferPtrs ) + PaUtil_FreeMemory( stream->bufferPtrs ); + + PaUtil_FreeMemory( stream ); + } + + if( asioBuffersCreated ) + ASIODisposeBuffers(); + + if( asioIsInitialized ) + { + UnloadAsioDriver(); + } + return result; +} + + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaAsioStream *stream = (PaAsioStream*)s; + + /* + IMPLEMENT ME: + - additional stream closing + cleanup + */ + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + + stream->asioHostApi->openAsioDeviceIndex = paNoDevice; + + CloseHandle( stream->completedBuffersPlayedEvent ); + + /* Using blocking i/o interface... */ + if( stream->blockingState ) + { + PaUtil_TerminateBufferProcessor( &stream->blockingState->bufferProcessor ); + + if( stream->inputChannelCount ) { + PaUtil_FreeMemory( stream->blockingState->readRingBufferData ); + PaUtil_FreeMemory( stream->blockingState->readStreamBuffer ); + CloseHandle( stream->blockingState->readFramesReadyEvent ); + } + if( stream->outputChannelCount ) { + PaUtil_FreeMemory( stream->blockingState->writeRingBufferData ); + PaUtil_FreeMemory( stream->blockingState->writeStreamBuffer ); + CloseHandle( stream->blockingState->writeBuffersReadyEvent ); + } + + PaUtil_FreeMemory( stream->blockingState ); + } + + PaUtil_FreeMemory( stream->asioBufferInfos ); + PaUtil_FreeMemory( stream->asioChannelInfos ); + PaUtil_FreeMemory( stream->bufferPtrs ); + PaUtil_FreeMemory( stream ); + + ASIODisposeBuffers(); + UnloadAsioDriver(); + + theAsioStream = 0; + + return result; +} + + +static void bufferSwitch(long index, ASIOBool directProcess) +{ +//TAKEN FROM THE ASIO SDK + + // the actual processing callback. + // Beware that this is normally in a seperate thread, hence be sure that + // you take care about thread synchronization. This is omitted here for + // simplicity. + + // as this is a "back door" into the bufferSwitchTimeInfo a timeInfo needs + // to be created though it will only set the timeInfo.samplePosition and + // timeInfo.systemTime fields and the according flags + + ASIOTime timeInfo; + memset( &timeInfo, 0, sizeof (timeInfo) ); + + // get the time stamp of the buffer, not necessary if no + // synchronization to other media is required + if( ASIOGetSamplePosition(&timeInfo.timeInfo.samplePosition, &timeInfo.timeInfo.systemTime) == ASE_OK) + timeInfo.timeInfo.flags = kSystemTimeValid | kSamplePositionValid; + + // Call the real callback + bufferSwitchTimeInfo( &timeInfo, index, directProcess ); +} + + +// conversion from 64 bit ASIOSample/ASIOTimeStamp to double float +#if NATIVE_INT64 + #define ASIO64toDouble(a) (a) +#else + const double twoRaisedTo32 = 4294967296.; + #define ASIO64toDouble(a) ((a).lo + (a).hi * twoRaisedTo32) +#endif + +static ASIOTime *bufferSwitchTimeInfo( ASIOTime *timeInfo, long index, ASIOBool directProcess ) +{ + // the actual processing callback. + // Beware that this is normally in a seperate thread, hence be sure that + // you take care about thread synchronization. + + + /* The SDK says the following about the directProcess flag: + suggests to the host whether it should immediately start processing + (directProcess == ASIOTrue), or whether its process should be deferred + because the call comes from a very low level (for instance, a high level + priority interrupt), and direct processing would cause timing instabilities for + the rest of the system. If in doubt, directProcess should be set to ASIOFalse. + + We just ignore directProcess. This could cause incompatibilities with + drivers which really don't want the audio processing to occur in this + callback, but none have been identified yet. + */ + + (void) directProcess; /* suppress unused parameter warning */ + +#if 0 + // store the timeInfo for later use + asioDriverInfo.tInfo = *timeInfo; + + // get the time stamp of the buffer, not necessary if no + // synchronization to other media is required + + if (timeInfo->timeInfo.flags & kSystemTimeValid) + asioDriverInfo.nanoSeconds = ASIO64toDouble(timeInfo->timeInfo.systemTime); + else + asioDriverInfo.nanoSeconds = 0; + + if (timeInfo->timeInfo.flags & kSamplePositionValid) + asioDriverInfo.samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition); + else + asioDriverInfo.samples = 0; + + if (timeInfo->timeCode.flags & kTcValid) + asioDriverInfo.tcSamples = ASIO64toDouble(timeInfo->timeCode.timeCodeSamples); + else + asioDriverInfo.tcSamples = 0; + + // get the system reference time + asioDriverInfo.sysRefTime = get_sys_reference_time(); +#endif + +#if 0 + // a few debug messages for the Windows device driver developer + // tells you the time when driver got its interrupt and the delay until the app receives + // the event notification. + static double last_samples = 0; + char tmp[128]; + sprintf (tmp, "diff: %d / %d ms / %d ms / %d samples \n", asioDriverInfo.sysRefTime - (long)(asioDriverInfo.nanoSeconds / 1000000.0), asioDriverInfo.sysRefTime, (long)(asioDriverInfo.nanoSeconds / 1000000.0), (long)(asioDriverInfo.samples - last_samples)); + OutputDebugString (tmp); + last_samples = asioDriverInfo.samples; +#endif + + + if( !theAsioStream ) + return 0L; + + // protect against reentrancy + if( PaAsio_AtomicIncrement(&theAsioStream->reenterCount) ) + { + theAsioStream->reenterError++; + //DBUG(("bufferSwitchTimeInfo : reentrancy detection = %d\n", asioDriverInfo.reenterError)); + return 0L; + } + + int buffersDone = 0; + + do + { + if( buffersDone > 0 ) + { + // this is a reentered buffer, we missed processing it on time + // set the input overflow and output underflow flags as appropriate + + if( theAsioStream->inputChannelCount > 0 ) + theAsioStream->callbackFlags |= paInputOverflow; + + if( theAsioStream->outputChannelCount > 0 ) + theAsioStream->callbackFlags |= paOutputUnderflow; + } + else + { + if( theAsioStream->zeroOutput ) + { + ZeroOutputBuffers( theAsioStream, index ); + + // Finally if the driver supports the ASIOOutputReady() optimization, + // do it here, all data are in place + if( theAsioStream->postOutput ) + ASIOOutputReady(); + + if( theAsioStream->stopProcessing ) + { + if( theAsioStream->stopPlayoutCount < 2 ) + { + ++theAsioStream->stopPlayoutCount; + if( theAsioStream->stopPlayoutCount == 2 ) + { + theAsioStream->isActive = 0; + if( theAsioStream->streamRepresentation.streamFinishedCallback != 0 ) + theAsioStream->streamRepresentation.streamFinishedCallback( theAsioStream->streamRepresentation.userData ); + theAsioStream->streamFinishedCallbackCalled = true; + SetEvent( theAsioStream->completedBuffersPlayedEvent ); + } + } + } + } + else + { + +#if 0 +/* + see: "ASIO callback underflow/overflow buffer slip detection doesn't work" + http://www.portaudio.com/trac/ticket/110 +*/ + +// test code to try to detect slip conditions... these may work on some systems +// but neither of them work on the RME Digi96 + +// check that sample delta matches buffer size (otherwise we must have skipped +// a buffer. +static double last_samples = -512; +double samples; +//if( timeInfo->timeCode.flags & kTcValid ) +// samples = ASIO64toDouble(timeInfo->timeCode.timeCodeSamples); +//else + samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition); +int delta = samples - last_samples; +//printf( "%d\n", delta); +last_samples = samples; + +if( delta > theAsioStream->framesPerHostCallback ) +{ + if( theAsioStream->inputChannelCount > 0 ) + theAsioStream->callbackFlags |= paInputOverflow; + + if( theAsioStream->outputChannelCount > 0 ) + theAsioStream->callbackFlags |= paOutputUnderflow; +} + +// check that the buffer index is not the previous index (which would indicate +// that a buffer was skipped. +static int previousIndex = 1; +if( index == previousIndex ) +{ + if( theAsioStream->inputChannelCount > 0 ) + theAsioStream->callbackFlags |= paInputOverflow; + + if( theAsioStream->outputChannelCount > 0 ) + theAsioStream->callbackFlags |= paOutputUnderflow; +} +previousIndex = index; +#endif + + int i; + + PaUtil_BeginCpuLoadMeasurement( &theAsioStream->cpuLoadMeasurer ); + + PaStreamCallbackTimeInfo paTimeInfo; + + // asio systemTime is supposed to be measured according to the same + // clock as timeGetTime + paTimeInfo.currentTime = (ASIO64toDouble( timeInfo->timeInfo.systemTime ) * .000000001); + + /* patch from Paul Boege */ + paTimeInfo.inputBufferAdcTime = paTimeInfo.currentTime - + ((double)theAsioStream->asioInputLatencyFrames/theAsioStream->streamRepresentation.streamInfo.sampleRate); + + paTimeInfo.outputBufferDacTime = paTimeInfo.currentTime + + ((double)theAsioStream->asioOutputLatencyFrames/theAsioStream->streamRepresentation.streamInfo.sampleRate); + + /* old version is buggy because the buffer processor also adds in its latency to the time parameters + paTimeInfo.inputBufferAdcTime = paTimeInfo.currentTime - theAsioStream->streamRepresentation.streamInfo.inputLatency; + paTimeInfo.outputBufferDacTime = paTimeInfo.currentTime + theAsioStream->streamRepresentation.streamInfo.outputLatency; + */ + +/* Disabled! Stopping and re-starting the stream causes an input overflow / output undeflow. S.Fischer */ +#if 0 +// detect underflows by checking inter-callback time > 2 buffer period +static double previousTime = -1; +if( previousTime > 0 ){ + + double delta = paTimeInfo.currentTime - previousTime; + + if( delta >= 2. * (theAsioStream->framesPerHostCallback / theAsioStream->streamRepresentation.streamInfo.sampleRate) ){ + if( theAsioStream->inputChannelCount > 0 ) + theAsioStream->callbackFlags |= paInputOverflow; + + if( theAsioStream->outputChannelCount > 0 ) + theAsioStream->callbackFlags |= paOutputUnderflow; + } +} +previousTime = paTimeInfo.currentTime; +#endif + + // note that the above input and output times do not need to be + // adjusted for the latency of the buffer processor -- the buffer + // processor handles that. + + if( theAsioStream->inputBufferConverter ) + { + for( i=0; iinputChannelCount; i++ ) + { + theAsioStream->inputBufferConverter( theAsioStream->inputBufferPtrs[index][i], + theAsioStream->inputShift, theAsioStream->framesPerHostCallback ); + } + } + + PaUtil_BeginBufferProcessing( &theAsioStream->bufferProcessor, &paTimeInfo, theAsioStream->callbackFlags ); + + /* reset status flags once they've been passed to the callback */ + theAsioStream->callbackFlags = 0; + + PaUtil_SetInputFrameCount( &theAsioStream->bufferProcessor, 0 /* default to host buffer size */ ); + for( i=0; iinputChannelCount; ++i ) + PaUtil_SetNonInterleavedInputChannel( &theAsioStream->bufferProcessor, i, theAsioStream->inputBufferPtrs[index][i] ); + + PaUtil_SetOutputFrameCount( &theAsioStream->bufferProcessor, 0 /* default to host buffer size */ ); + for( i=0; ioutputChannelCount; ++i ) + PaUtil_SetNonInterleavedOutputChannel( &theAsioStream->bufferProcessor, i, theAsioStream->outputBufferPtrs[index][i] ); + + int callbackResult; + if( theAsioStream->stopProcessing ) + callbackResult = paComplete; + else + callbackResult = paContinue; + unsigned long framesProcessed = PaUtil_EndBufferProcessing( &theAsioStream->bufferProcessor, &callbackResult ); + + if( theAsioStream->outputBufferConverter ) + { + for( i=0; ioutputChannelCount; i++ ) + { + theAsioStream->outputBufferConverter( theAsioStream->outputBufferPtrs[index][i], + theAsioStream->outputShift, theAsioStream->framesPerHostCallback ); + } + } + + PaUtil_EndCpuLoadMeasurement( &theAsioStream->cpuLoadMeasurer, framesProcessed ); + + // Finally if the driver supports the ASIOOutputReady() optimization, + // do it here, all data are in place + if( theAsioStream->postOutput ) + ASIOOutputReady(); + + if( callbackResult == paContinue ) + { + /* nothing special to do */ + } + else if( callbackResult == paAbort ) + { + /* finish playback immediately */ + theAsioStream->isActive = 0; + if( theAsioStream->streamRepresentation.streamFinishedCallback != 0 ) + theAsioStream->streamRepresentation.streamFinishedCallback( theAsioStream->streamRepresentation.userData ); + theAsioStream->streamFinishedCallbackCalled = true; + SetEvent( theAsioStream->completedBuffersPlayedEvent ); + theAsioStream->zeroOutput = true; + } + else /* paComplete or other non-zero value indicating complete */ + { + /* Finish playback once currently queued audio has completed. */ + theAsioStream->stopProcessing = true; + + if( PaUtil_IsBufferProcessorOutputEmpty( &theAsioStream->bufferProcessor ) ) + { + theAsioStream->zeroOutput = true; + theAsioStream->stopPlayoutCount = 0; + } + } + } + } + + ++buffersDone; + }while( PaAsio_AtomicDecrement(&theAsioStream->reenterCount) >= 0 ); + + return 0L; +} + + +static void sampleRateChanged(ASIOSampleRate sRate) +{ + // TAKEN FROM THE ASIO SDK + // do whatever you need to do if the sample rate changed + // usually this only happens during external sync. + // Audio processing is not stopped by the driver, actual sample rate + // might not have even changed, maybe only the sample rate status of an + // AES/EBU or S/PDIF digital input at the audio device. + // You might have to update time/sample related conversion routines, etc. + + (void) sRate; /* unused parameter */ + PA_DEBUG( ("sampleRateChanged : %d \n", sRate)); +} + +static long asioMessages(long selector, long value, void* message, double* opt) +{ +// TAKEN FROM THE ASIO SDK + // currently the parameters "value", "message" and "opt" are not used. + long ret = 0; + + (void) message; /* unused parameters */ + (void) opt; + + PA_DEBUG( ("asioMessages : %d , %d \n", selector, value)); + + switch(selector) + { + case kAsioSelectorSupported: + if(value == kAsioResetRequest + || value == kAsioEngineVersion + || value == kAsioResyncRequest + || value == kAsioLatenciesChanged + // the following three were added for ASIO 2.0, you don't necessarily have to support them + || value == kAsioSupportsTimeInfo + || value == kAsioSupportsTimeCode + || value == kAsioSupportsInputMonitor) + ret = 1L; + break; + + case kAsioBufferSizeChange: + //printf("kAsioBufferSizeChange \n"); + break; + + case kAsioResetRequest: + // defer the task and perform the reset of the driver during the next "safe" situation + // You cannot reset the driver right now, as this code is called from the driver. + // Reset the driver is done by completely destruct is. I.e. ASIOStop(), ASIODisposeBuffers(), Destruction + // Afterwards you initialize the driver again. + + /*FIXME: commented the next line out + + see: "PA/ASIO ignores some driver notifications it probably shouldn't" + http://www.portaudio.com/trac/ticket/108 + */ + //asioDriverInfo.stopped; // In this sample the processing will just stop + ret = 1L; + break; + + case kAsioResyncRequest: + // This informs the application, that the driver encountered some non fatal data loss. + // It is used for synchronization purposes of different media. + // Added mainly to work around the Win16Mutex problems in Windows 95/98 with the + // Windows Multimedia system, which could loose data because the Mutex was hold too long + // by another thread. + // However a driver can issue it in other situations, too. + ret = 1L; + break; + + case kAsioLatenciesChanged: + // This will inform the host application that the drivers were latencies changed. + // Beware, it this does not mean that the buffer sizes have changed! + // You might need to update internal delay data. + ret = 1L; + //printf("kAsioLatenciesChanged \n"); + break; + + case kAsioEngineVersion: + // return the supported ASIO version of the host application + // If a host applications does not implement this selector, ASIO 1.0 is assumed + // by the driver + ret = 2L; + break; + + case kAsioSupportsTimeInfo: + // informs the driver wether the asioCallbacks.bufferSwitchTimeInfo() callback + // is supported. + // For compatibility with ASIO 1.0 drivers the host application should always support + // the "old" bufferSwitch method, too. + ret = 1; + break; + + case kAsioSupportsTimeCode: + // informs the driver wether application is interested in time code info. + // If an application does not need to know about time code, the driver has less work + // to do. + ret = 0; + break; + } + return ret; +} + + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaAsioStream *stream = (PaAsioStream*)s; + PaAsioStreamBlockingState *blockingState = stream->blockingState; + ASIOError asioError; + + if( stream->outputChannelCount > 0 ) + { + ZeroOutputBuffers( stream, 0 ); + ZeroOutputBuffers( stream, 1 ); + } + + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + stream->stopProcessing = false; + stream->zeroOutput = false; + + /* Reentrancy counter initialisation */ + stream->reenterCount = -1; + stream->reenterError = 0; + + stream->callbackFlags = 0; + + if( ResetEvent( stream->completedBuffersPlayedEvent ) == 0 ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + + + /* Using blocking i/o interface... */ + if( blockingState ) + { + /* Reset blocking i/o buffer processor. */ + PaUtil_ResetBufferProcessor( &blockingState->bufferProcessor ); + + /* If we're about to process some input data. */ + if( stream->inputChannelCount ) + { + /* Reset callback-ReadStream sync event. */ + if( ResetEvent( blockingState->readFramesReadyEvent ) == 0 ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + + /* Flush blocking i/o ring buffer. */ + PaUtil_FlushRingBuffer( &blockingState->readRingBuffer ); + (*blockingState->bufferProcessor.inputZeroer)( blockingState->readRingBuffer.buffer, 1, blockingState->bufferProcessor.inputChannelCount * blockingState->readRingBuffer.bufferSize ); + } + + /* If we're about to process some output data. */ + if( stream->outputChannelCount ) + { + /* Reset callback-WriteStream sync event. */ + if( ResetEvent( blockingState->writeBuffersReadyEvent ) == 0 ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + + /* Flush blocking i/o ring buffer. */ + PaUtil_FlushRingBuffer( &blockingState->writeRingBuffer ); + (*blockingState->bufferProcessor.outputZeroer)( blockingState->writeRingBuffer.buffer, 1, blockingState->bufferProcessor.outputChannelCount * blockingState->writeRingBuffer.bufferSize ); + + /* Initialize the output ring buffer to "silence". */ + PaUtil_AdvanceRingBufferWriteIndex( &blockingState->writeRingBuffer, blockingState->writeRingBufferInitialFrames ); + } + + /* Clear requested frames / buffers count. */ + blockingState->writeBuffersRequested = 0; + blockingState->readFramesRequested = 0; + blockingState->writeBuffersRequestedFlag = FALSE; + blockingState->readFramesRequestedFlag = FALSE; + blockingState->outputUnderflowFlag = FALSE; + blockingState->inputOverflowFlag = FALSE; + blockingState->stopFlag = FALSE; + } + + + if( result == paNoError ) + { + assert( theAsioStream == stream ); /* theAsioStream should be set correctly in OpenStream */ + + /* initialize these variables before the callback has a chance to be invoked */ + stream->isStopped = 0; + stream->isActive = 1; + stream->streamFinishedCallbackCalled = false; + + asioError = ASIOStart(); + if( asioError != ASE_OK ) + { + stream->isStopped = 1; + stream->isActive = 0; + + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + } + } + + return result; +} + +static void EnsureCallbackHasCompleted( PaAsioStream *stream ) +{ + // make sure that the callback is not still in-flight after ASIOStop() + // returns. This has been observed to happen on the Hoontech DSP24 for + // example. + int count = 2000; // only wait for 2 seconds, rather than hanging. + while( stream->reenterCount != -1 && count > 0 ) + { + Sleep(1); + --count; + } +} + +static PaError StopStream( PaStream *s ) +{ + PaError result = paNoError; + PaAsioStream *stream = (PaAsioStream*)s; + PaAsioStreamBlockingState *blockingState = stream->blockingState; + ASIOError asioError; + + if( stream->isActive ) + { + /* If blocking i/o output is in use */ + if( blockingState && stream->outputChannelCount ) + { + /* Request the whole output buffer to be available. */ + blockingState->writeBuffersRequested = blockingState->writeRingBuffer.bufferSize; + /* Signalize that additional buffers are need. */ + blockingState->writeBuffersRequestedFlag = TRUE; + /* Set flag to indicate the playback is to be stopped. */ + blockingState->stopFlag = TRUE; + + /* Wait until requested number of buffers has been freed. Time + out after twice the blocking i/o ouput buffer could have + been consumed. */ + DWORD timeout = (DWORD)( 2 * blockingState->writeRingBuffer.bufferSize * 1000 + / stream->streamRepresentation.streamInfo.sampleRate ); + DWORD waitResult = WaitForSingleObject( blockingState->writeBuffersReadyEvent, timeout ); + + /* If something seriously went wrong... */ + if( waitResult == WAIT_FAILED ) + { + PA_DEBUG(("WaitForSingleObject() failed in StopStream()\n")); + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + else if( waitResult == WAIT_TIMEOUT ) + { + PA_DEBUG(("WaitForSingleObject() timed out in StopStream()\n")); + result = paTimedOut; + } + } + + stream->stopProcessing = true; + + /* wait for the stream to finish playing out enqueued buffers. + timeout after four times the stream latency. + + @todo should use a better time out value - if the user buffer + length is longer than the asio buffer size then that should + be taken into account. + */ + if( WaitForSingleObject( stream->completedBuffersPlayedEvent, + (DWORD)(stream->streamRepresentation.streamInfo.outputLatency * 1000. * 4.) ) + == WAIT_TIMEOUT ) + { + PA_DEBUG(("WaitForSingleObject() timed out in StopStream()\n" )); + } + } + + asioError = ASIOStop(); + if( asioError == ASE_OK ) + { + EnsureCallbackHasCompleted( stream ); + } + else + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + } + + stream->isStopped = 1; + stream->isActive = 0; + + if( !stream->streamFinishedCallbackCalled ) + { + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + + return result; +} + +static PaError AbortStream( PaStream *s ) +{ + PaError result = paNoError; + PaAsioStream *stream = (PaAsioStream*)s; + ASIOError asioError; + + stream->zeroOutput = true; + + asioError = ASIOStop(); + if( asioError == ASE_OK ) + { + EnsureCallbackHasCompleted( stream ); + } + else + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + } + + stream->isStopped = 1; + stream->isActive = 0; + + if( !stream->streamFinishedCallbackCalled ) + { + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + + return result; +} + + +static PaError IsStreamStopped( PaStream *s ) +{ + PaAsioStream *stream = (PaAsioStream*)s; + + return stream->isStopped; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaAsioStream *stream = (PaAsioStream*)s; + + return stream->isActive; +} + + +static PaTime GetStreamTime( PaStream *s ) +{ + (void) s; /* unused parameter */ + return (double)timeGetTime() * .001; +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaAsioStream *stream = (PaAsioStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +/* + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + +static PaError ReadStream( PaStream *s , + void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; /* Initial return value. */ + PaAsioStream *stream = (PaAsioStream*)s; /* The PA ASIO stream. */ + + /* Pointer to the blocking i/o data struct. */ + PaAsioStreamBlockingState *blockingState = stream->blockingState; + + /* Get blocking i/o buffer processor and ring buffer pointers. */ + PaUtilBufferProcessor *pBp = &blockingState->bufferProcessor; + PaUtilRingBuffer *pRb = &blockingState->readRingBuffer; + + /* Ring buffer segment(s) used for writing. */ + void *pRingBufferData1st = NULL; /* First segment. (Mandatory) */ + void *pRingBufferData2nd = NULL; /* Second segment. (Optional) */ + + /* Number of frames per ring buffer segment. */ + long lRingBufferSize1st = 0; /* First segment. (Mandatory) */ + long lRingBufferSize2nd = 0; /* Second segment. (Optional) */ + + /* Get number of frames to be processed per data block. */ + unsigned long lFramesPerBlock = stream->bufferProcessor.framesPerUserBuffer; + /* Actual number of frames that has been copied into the ring buffer. */ + unsigned long lFramesCopied = 0; + /* The number of remaining unprocessed dtat frames. */ + unsigned long lFramesRemaining = frames; + + /* Copy the input argument to avoid pointer increment! */ + const void *userBuffer; + unsigned int i; /* Just a counter. */ + + /* About the time, needed to process 8 data blocks. */ + DWORD timeout = (DWORD)( 8 * lFramesPerBlock * 1000 / stream->streamRepresentation.streamInfo.sampleRate ); + DWORD waitResult = 0; + + + /* Check if the stream is still available ready to gather new data. */ + if( blockingState->stopFlag || !stream->isActive ) + { + PA_DEBUG(("Warning! Stream no longer available for reading in ReadStream()\n")); + result = paStreamIsStopped; + return result; + } + + /* If the stream is a input stream. */ + if( stream->inputChannelCount ) + { + /* Prepare buffer access. */ + if( !pBp->userOutputIsInterleaved ) + { + userBuffer = blockingState->readStreamBuffer; + for( i = 0; iinputChannelCount; ++i ) + { + ((void**)userBuffer)[i] = ((void**)buffer)[i]; + } + } /* Use the unchanged buffer. */ + else { userBuffer = buffer; } + + do /* Internal block processing for too large user data buffers. */ + { + /* Get the size of the current data block to be processed. */ + lFramesPerBlock =(lFramesPerBlock < lFramesRemaining) + ? lFramesPerBlock : lFramesRemaining; + /* Use predefined block size for as long there are enough + buffers available, thereafter reduce the processing block + size to match the number of remaining buffers. So the final + data block is processed although it may be incomplete. */ + + /* If the available amount of data frames is insufficient. */ + if( PaUtil_GetRingBufferReadAvailable(pRb) < (long) lFramesPerBlock ) + { + /* Make sure, the event isn't already set! */ + /* ResetEvent( blockingState->readFramesReadyEvent ); */ + + /* Set the number of requested buffers. */ + blockingState->readFramesRequested = lFramesPerBlock; + + /* Signalize that additional buffers are need. */ + blockingState->readFramesRequestedFlag = TRUE; + + /* Wait until requested number of buffers has been freed. */ + waitResult = WaitForSingleObject( blockingState->readFramesReadyEvent, timeout ); + + /* If something seriously went wrong... */ + if( waitResult == WAIT_FAILED ) + { + PA_DEBUG(("WaitForSingleObject() failed in ReadStream()\n")); + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + return result; + } + else if( waitResult == WAIT_TIMEOUT ) + { + PA_DEBUG(("WaitForSingleObject() timed out in ReadStream()\n")); + + /* If block processing has stopped, abort! */ + if( blockingState->stopFlag ) { return result = paStreamIsStopped; } + + /* If a timeout is encountered, give up eventually. */ + return result = paTimedOut; + } + } + /* Now, the ring buffer contains the required amount of data + frames. + (Therefor we don't need to check the return argument of + PaUtil_GetRingBufferReadRegions(). ;-) ) + */ + + /* Retrieve pointer(s) to the ring buffer's current write + position(s). If the first buffer segment is too small to + store the requested number of bytes, an additional second + segment is returned. Otherwise, i.e. if the first segment + is large enough, the second segment's pointer will be NULL. + */ + PaUtil_GetRingBufferReadRegions(pRb , + lFramesPerBlock , + &pRingBufferData1st, + &lRingBufferSize1st, + &pRingBufferData2nd, + &lRingBufferSize2nd); + + /* Set number of frames to be copied from the ring buffer. */ + PaUtil_SetInputFrameCount( pBp, lRingBufferSize1st ); + /* Setup ring buffer access. */ + PaUtil_SetInterleavedInputChannels(pBp , /* Buffer processor. */ + 0 , /* The first channel's index. */ + pRingBufferData1st, /* First ring buffer segment. */ + 0 ); /* Use all available channels. */ + + /* If a second ring buffer segment is required. */ + if( lRingBufferSize2nd ) { + /* Set number of frames to be copied from the ring buffer. */ + PaUtil_Set2ndInputFrameCount( pBp, lRingBufferSize2nd ); + /* Setup ring buffer access. */ + PaUtil_Set2ndInterleavedInputChannels(pBp , /* Buffer processor. */ + 0 , /* The first channel's index. */ + pRingBufferData2nd, /* Second ring buffer segment. */ + 0 ); /* Use all available channels. */ + } + + /* Let the buffer processor handle "copy and conversion" and + update the ring buffer indices manually. */ + lFramesCopied = PaUtil_CopyInput( pBp, &buffer, lFramesPerBlock ); + PaUtil_AdvanceRingBufferReadIndex( pRb, lFramesCopied ); + + /* Decrease number of unprocessed frames. */ + lFramesRemaining -= lFramesCopied; + + } /* Continue with the next data chunk. */ + while( lFramesRemaining ); + + + /* If there has been an input overflow within the callback */ + if( blockingState->inputOverflowFlag ) + { + blockingState->inputOverflowFlag = FALSE; + + /* Return the corresponding error code. */ + result = paInputOverflowed; + } + + } /* If this is not an input stream. */ + else { + result = paCanNotReadFromAnOutputOnlyStream; + } + + return result; +} + +static PaError WriteStream( PaStream *s , + const void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; /* Initial return value. */ + PaAsioStream *stream = (PaAsioStream*)s; /* The PA ASIO stream. */ + + /* Pointer to the blocking i/o data struct. */ + PaAsioStreamBlockingState *blockingState = stream->blockingState; + + /* Get blocking i/o buffer processor and ring buffer pointers. */ + PaUtilBufferProcessor *pBp = &blockingState->bufferProcessor; + PaUtilRingBuffer *pRb = &blockingState->writeRingBuffer; + + /* Ring buffer segment(s) used for writing. */ + void *pRingBufferData1st = NULL; /* First segment. (Mandatory) */ + void *pRingBufferData2nd = NULL; /* Second segment. (Optional) */ + + /* Number of frames per ring buffer segment. */ + long lRingBufferSize1st = 0; /* First segment. (Mandatory) */ + long lRingBufferSize2nd = 0; /* Second segment. (Optional) */ + + /* Get number of frames to be processed per data block. */ + unsigned long lFramesPerBlock = stream->bufferProcessor.framesPerUserBuffer; + /* Actual number of frames that has been copied into the ring buffer. */ + unsigned long lFramesCopied = 0; + /* The number of remaining unprocessed dtat frames. */ + unsigned long lFramesRemaining = frames; + + /* About the time, needed to process 8 data blocks. */ + DWORD timeout = (DWORD)( 8 * lFramesPerBlock * 1000 / stream->streamRepresentation.streamInfo.sampleRate ); + DWORD waitResult = 0; + + /* Copy the input argument to avoid pointer increment! */ + const void *userBuffer; + unsigned int i; /* Just a counter. */ + + + /* Check if the stream ist still available ready to recieve new data. */ + if( blockingState->stopFlag || !stream->isActive ) + { + PA_DEBUG(("Warning! Stream no longer available for writing in WriteStream()\n")); + result = paStreamIsStopped; + return result; + } + + /* If the stream is a output stream. */ + if( stream->outputChannelCount ) + { + /* Prepare buffer access. */ + if( !pBp->userOutputIsInterleaved ) + { + userBuffer = blockingState->writeStreamBuffer; + for( i = 0; ioutputChannelCount; ++i ) + { + ((const void**)userBuffer)[i] = ((const void**)buffer)[i]; + } + } /* Use the unchanged buffer. */ + else { userBuffer = buffer; } + + + do /* Internal block processing for too large user data buffers. */ + { + /* Get the size of the current data block to be processed. */ + lFramesPerBlock =(lFramesPerBlock < lFramesRemaining) + ? lFramesPerBlock : lFramesRemaining; + /* Use predefined block size for as long there are enough + frames available, thereafter reduce the processing block + size to match the number of remaining frames. So the final + data block is processed although it may be incomplete. */ + + /* If the available amount of buffers is insufficient. */ + if( PaUtil_GetRingBufferWriteAvailable(pRb) < (long) lFramesPerBlock ) + { + /* Make sure, the event isn't already set! */ + /* ResetEvent( blockingState->writeBuffersReadyEvent ); */ + + /* Set the number of requested buffers. */ + blockingState->writeBuffersRequested = lFramesPerBlock; + + /* Signalize that additional buffers are need. */ + blockingState->writeBuffersRequestedFlag = TRUE; + + /* Wait until requested number of buffers has been freed. */ + waitResult = WaitForSingleObject( blockingState->writeBuffersReadyEvent, timeout ); + + /* If something seriously went wrong... */ + if( waitResult == WAIT_FAILED ) + { + PA_DEBUG(("WaitForSingleObject() failed in WriteStream()\n")); + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_SYSTEM_ERROR( GetLastError() ); + return result; + } + else if( waitResult == WAIT_TIMEOUT ) + { + PA_DEBUG(("WaitForSingleObject() timed out in WriteStream()\n")); + + /* If block processing has stopped, abort! */ + if( blockingState->stopFlag ) { return result = paStreamIsStopped; } + + /* If a timeout is encountered, give up eventually. */ + return result = paTimedOut; + } + } + /* Now, the ring buffer contains the required amount of free + space to store the provided number of data frames. + (Therefor we don't need to check the return argument of + PaUtil_GetRingBufferWriteRegions(). ;-) ) + */ + + /* Retrieve pointer(s) to the ring buffer's current write + position(s). If the first buffer segment is too small to + store the requested number of bytes, an additional second + segment is returned. Otherwise, i.e. if the first segment + is large enough, the second segment's pointer will be NULL. + */ + PaUtil_GetRingBufferWriteRegions(pRb , + lFramesPerBlock , + &pRingBufferData1st, + &lRingBufferSize1st, + &pRingBufferData2nd, + &lRingBufferSize2nd); + + /* Set number of frames to be copied to the ring buffer. */ + PaUtil_SetOutputFrameCount( pBp, lRingBufferSize1st ); + /* Setup ring buffer access. */ + PaUtil_SetInterleavedOutputChannels(pBp , /* Buffer processor. */ + 0 , /* The first channel's index. */ + pRingBufferData1st, /* First ring buffer segment. */ + 0 ); /* Use all available channels. */ + + /* If a second ring buffer segment is required. */ + if( lRingBufferSize2nd ) { + /* Set number of frames to be copied to the ring buffer. */ + PaUtil_Set2ndOutputFrameCount( pBp, lRingBufferSize2nd ); + /* Setup ring buffer access. */ + PaUtil_Set2ndInterleavedOutputChannels(pBp , /* Buffer processor. */ + 0 , /* The first channel's index. */ + pRingBufferData2nd, /* Second ring buffer segment. */ + 0 ); /* Use all available channels. */ + } + + /* Let the buffer processor handle "copy and conversion" and + update the ring buffer indices manually. */ + lFramesCopied = PaUtil_CopyOutput( pBp, &userBuffer, lFramesPerBlock ); + PaUtil_AdvanceRingBufferWriteIndex( pRb, lFramesCopied ); + + /* Decrease number of unprocessed frames. */ + lFramesRemaining -= lFramesCopied; + + } /* Continue with the next data chunk. */ + while( lFramesRemaining ); + + + /* If there has been an output underflow within the callback */ + if( blockingState->outputUnderflowFlag ) + { + blockingState->outputUnderflowFlag = FALSE; + + /* Return the corresponding error code. */ + result = paOutputUnderflowed; + } + + } /* If this is not an output stream. */ + else + { + result = paCanNotWriteToAnInputOnlyStream; + } + + return result; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaAsioStream *stream = (PaAsioStream*)s; + + /* Call buffer utility routine to get the number of available frames. */ + return PaUtil_GetRingBufferReadAvailable( &stream->blockingState->readRingBuffer ); +} + + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaAsioStream *stream = (PaAsioStream*)s; + + /* Call buffer utility routine to get the number of empty buffers. */ + return PaUtil_GetRingBufferWriteAvailable( &stream->blockingState->writeRingBuffer ); +} + + +/* This routine will be called by the PortAudio engine when audio is needed. +** It may called at interrupt level on some machines so don't do anything +** that could mess up the system like calling malloc() or free(). +*/ +static int BlockingIoPaCallback(const void *inputBuffer , + void *outputBuffer , + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *timeInfo , + PaStreamCallbackFlags statusFlags , + void *userData ) +{ + PaError result = paNoError; /* Initial return value. */ + PaAsioStream *stream = *(PaAsioStream**)userData; /* The PA ASIO stream. */ + PaAsioStreamBlockingState *blockingState = stream->blockingState; /* Persume blockingState is valid, otherwise the callback wouldn't be running. */ + + /* Get a pointer to the stream's blocking i/o buffer processor. */ + PaUtilBufferProcessor *pBp = &blockingState->bufferProcessor; + PaUtilRingBuffer *pRb = NULL; + + /* If output data has been requested. */ + if( stream->outputChannelCount ) + { + /* If the callback input argument signalizes a output underflow, + make sure the WriteStream() function knows about it, too! */ + if( statusFlags & paOutputUnderflowed ) { + blockingState->outputUnderflowFlag = TRUE; + } + + /* Access the corresponding ring buffer. */ + pRb = &blockingState->writeRingBuffer; + + /* If the blocking i/o buffer contains enough output data, */ + if( PaUtil_GetRingBufferReadAvailable(pRb) >= (long) framesPerBuffer ) + { + /* Extract the requested data from the ring buffer. */ + PaUtil_ReadRingBuffer( pRb, outputBuffer, framesPerBuffer ); + } + else /* If no output data is available :-( */ + { + /* Signalize a write-buffer underflow. */ + blockingState->outputUnderflowFlag = TRUE; + + /* Fill the output buffer with silence. */ + (*pBp->outputZeroer)( outputBuffer, 1, pBp->outputChannelCount * framesPerBuffer ); + + /* If playback is to be stopped */ + if( blockingState->stopFlag && PaUtil_GetRingBufferReadAvailable(pRb) < (long) framesPerBuffer ) + { + /* Extract all the remaining data from the ring buffer, + whether it is a complete data block or not. */ + PaUtil_ReadRingBuffer( pRb, outputBuffer, PaUtil_GetRingBufferReadAvailable(pRb) ); + } + } + + /* Set blocking i/o event? */ + if( blockingState->writeBuffersRequestedFlag && PaUtil_GetRingBufferWriteAvailable(pRb) >= (long) blockingState->writeBuffersRequested ) + { + /* Reset buffer request. */ + blockingState->writeBuffersRequestedFlag = FALSE; + blockingState->writeBuffersRequested = 0; + /* Signalize that requested buffers are ready. */ + SetEvent( blockingState->writeBuffersReadyEvent ); + /* What do we do if SetEvent() returns zero, i.e. the event + could not be set? How to return errors from within the + callback? - S.Fischer */ + } + } + + /* If input data has been supplied. */ + if( stream->inputChannelCount ) + { + /* If the callback input argument signalizes a input overflow, + make sure the ReadStream() function knows about it, too! */ + if( statusFlags & paInputOverflowed ) { + blockingState->inputOverflowFlag = TRUE; + } + + /* Access the corresponding ring buffer. */ + pRb = &blockingState->readRingBuffer; + + /* If the blocking i/o buffer contains not enough input buffers */ + if( PaUtil_GetRingBufferWriteAvailable(pRb) < (long) framesPerBuffer ) + { + /* Signalize a read-buffer overflow. */ + blockingState->inputOverflowFlag = TRUE; + + /* Remove some old data frames from the buffer. */ + PaUtil_AdvanceRingBufferReadIndex( pRb, framesPerBuffer ); + } + + /* Insert the current input data into the ring buffer. */ + PaUtil_WriteRingBuffer( pRb, inputBuffer, framesPerBuffer ); + + /* Set blocking i/o event? */ + if( blockingState->readFramesRequestedFlag && PaUtil_GetRingBufferReadAvailable(pRb) >= (long) blockingState->readFramesRequested ) + { + /* Reset buffer request. */ + blockingState->readFramesRequestedFlag = FALSE; + blockingState->readFramesRequested = 0; + /* Signalize that requested buffers are ready. */ + SetEvent( blockingState->readFramesReadyEvent ); + /* What do we do if SetEvent() returns zero, i.e. the event + could not be set? How to return errors from within the + callback? - S.Fischer */ + /** @todo report an error with PA_DEBUG */ + } + } + + return paContinue; +} + + +PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *hostApi; + PaDeviceIndex hostApiDevice; + ASIODriverInfo asioDriverInfo; + ASIOError asioError; + int asioIsInitialized = 0; + PaAsioHostApiRepresentation *asioHostApi; + PaAsioDeviceInfo *asioDeviceInfo; + PaWinUtilComInitializationResult comInitializationResult; + + /* initialize COM again here, we might be in another thread */ + result = PaWinUtil_CoInitialize( paASIO, &comInitializationResult ); + if( result != paNoError ) + return result; + + result = PaUtil_GetHostApiRepresentation( &hostApi, paASIO ); + if( result != paNoError ) + goto error; + + result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDevice, device, hostApi ); + if( result != paNoError ) + goto error; + + /* + In theory we could proceed if the currently open device was the same + one for which the control panel was requested, however because the + window pointer is not available until this function is called we + currently need to call ASIOInit() again here, which of course can't be + done safely while a stream is open. + */ + + asioHostApi = (PaAsioHostApiRepresentation*)hostApi; + if( asioHostApi->openAsioDeviceIndex != paNoDevice ) + { + result = paDeviceUnavailable; + goto error; + } + + asioDeviceInfo = (PaAsioDeviceInfo*)hostApi->deviceInfos[hostApiDevice]; + + if( !asioHostApi->asioDrivers->loadDriver( const_cast(asioDeviceInfo->commonDeviceInfo.name) ) ) + { + result = paUnanticipatedHostError; + goto error; + } + + /* CRUCIAL!!! */ + memset( &asioDriverInfo, 0, sizeof(ASIODriverInfo) ); + asioDriverInfo.asioVersion = 2; + asioDriverInfo.sysRef = systemSpecific; + asioError = ASIOInit( &asioDriverInfo ); + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error; + } + else + { + asioIsInitialized = 1; + } + +PA_DEBUG(("PaAsio_ShowControlPanel: ASIOInit(): %s\n", PaAsio_GetAsioErrorText(asioError) )); +PA_DEBUG(("asioVersion: ASIOInit(): %ld\n", asioDriverInfo.asioVersion )); +PA_DEBUG(("driverVersion: ASIOInit(): %ld\n", asioDriverInfo.driverVersion )); +PA_DEBUG(("Name: ASIOInit(): %s\n", asioDriverInfo.name )); +PA_DEBUG(("ErrorMessage: ASIOInit(): %s\n", asioDriverInfo.errorMessage )); + + asioError = ASIOControlPanel(); + if( asioError != ASE_OK ) + { + PA_DEBUG(("PaAsio_ShowControlPanel: ASIOControlPanel(): %s\n", PaAsio_GetAsioErrorText(asioError) )); + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + goto error; + } + +PA_DEBUG(("PaAsio_ShowControlPanel: ASIOControlPanel(): %s\n", PaAsio_GetAsioErrorText(asioError) )); + + asioError = ASIOExit(); + if( asioError != ASE_OK ) + { + result = paUnanticipatedHostError; + PA_ASIO_SET_LAST_ASIO_ERROR( asioError ); + asioIsInitialized = 0; + goto error; + } + +PA_DEBUG(("PaAsio_ShowControlPanel: ASIOExit(): %s\n", PaAsio_GetAsioErrorText(asioError) )); + + return result; + +error: + if( asioIsInitialized ) + { + ASIOExit(); + } + + PaWinUtil_CoUninitialize( paASIO, &comInitializationResult ); + + return result; +} + + +PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex, + const char** channelName ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *hostApi; + PaDeviceIndex hostApiDevice; + PaAsioDeviceInfo *asioDeviceInfo; + + + result = PaUtil_GetHostApiRepresentation( &hostApi, paASIO ); + if( result != paNoError ) + goto error; + + result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDevice, device, hostApi ); + if( result != paNoError ) + goto error; + + asioDeviceInfo = (PaAsioDeviceInfo*)hostApi->deviceInfos[hostApiDevice]; + + if( channelIndex < 0 || channelIndex >= asioDeviceInfo->commonDeviceInfo.maxInputChannels ){ + result = paInvalidChannelCount; + goto error; + } + + *channelName = asioDeviceInfo->asioChannelInfos[channelIndex].name; + + return paNoError; + +error: + return result; +} + + +PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, + const char** channelName ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *hostApi; + PaDeviceIndex hostApiDevice; + PaAsioDeviceInfo *asioDeviceInfo; + + + result = PaUtil_GetHostApiRepresentation( &hostApi, paASIO ); + if( result != paNoError ) + goto error; + + result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDevice, device, hostApi ); + if( result != paNoError ) + goto error; + + asioDeviceInfo = (PaAsioDeviceInfo*)hostApi->deviceInfos[hostApiDevice]; + + if( channelIndex < 0 || channelIndex >= asioDeviceInfo->commonDeviceInfo.maxOutputChannels ){ + result = paInvalidChannelCount; + goto error; + } + + *channelName = asioDeviceInfo->asioChannelInfos[ + asioDeviceInfo->commonDeviceInfo.maxInputChannels + channelIndex].name; + + return paNoError; + +error: + return result; +} + + +/* NOTE: the following functions are ASIO-stream specific, and are called directly + by client code. We need to check for many more error conditions here because + we don't have the benefit of pa_front.c's parameter checking. +*/ + +static PaError GetAsioStreamPointer( PaAsioStream **stream, PaStream *s ) +{ + PaError result; + PaUtilHostApiRepresentation *hostApi; + PaAsioHostApiRepresentation *asioHostApi; + + result = PaUtil_ValidateStreamPointer( s ); + if( result != paNoError ) + return result; + + result = PaUtil_GetHostApiRepresentation( &hostApi, paASIO ); + if( result != paNoError ) + return result; + + asioHostApi = (PaAsioHostApiRepresentation*)hostApi; + + if( PA_STREAM_REP( s )->streamInterface == &asioHostApi->callbackStreamInterface + || PA_STREAM_REP( s )->streamInterface == &asioHostApi->blockingStreamInterface ) + { + /* s is an ASIO stream */ + *stream = (PaAsioStream *)s; + return paNoError; + } + else + { + return paIncompatibleStreamHostApi; + } +} + + +PaError PaAsio_SetStreamSampleRate( PaStream* s, double sampleRate ) +{ + PaAsioStream *stream; + PaError result = GetAsioStreamPointer( &stream, s ); + if( result != paNoError ) + return result; + + if( stream != theAsioStream ) + return paBadStreamPtr; + + return ValidateAndSetSampleRate( sampleRate ); +} + diff --git a/Externals/portaudio/src/hostapi/coreaudio/notes.txt b/Externals/portaudio/src/hostapi/coreaudio/notes.txt new file mode 100644 index 0000000000..145afe1544 --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/notes.txt @@ -0,0 +1,196 @@ +Notes on status of CoreAudio Implementation of PortAudio + +Document Last Updated December 9, 2005 + +There are currently two implementations of PortAudio for Mac Core Audio. + +The original is in pa_mac_core_old.c, and the newer, default implementation +is in pa_mac_core.c. +Only pa_mac_core.c is currently developed and supported as it uses apple's +current core audio technology. To select use the old implementation, replace +pa_mac_core.c with pa_mac_core_old.c (eg. "cp pa_mac_core_auhal.c +pa_mac_core.c"), then run configure and make as usual. + +------------------------------------------- + +Notes on Newer/Default AUHAL implementation: + +by Bjorn Roche + +Last Updated December 9, 2005 + +Principle of Operation: + +This implementation uses AUHAL for audio I/O. To some extent, it also +operates at the "HAL" Layer, though this behavior can be limited by +platform specific flags (see pa_mac_core.h for details). The default +settings should be reasonable: they don't change the SR of the device and +don't cause interruptions if other devices are using the device. + +Major Software Elements Used: Apple's HAL AUs provide output SR +conversion transparently, however, only on output, so this +implementation uses AudioConverters to convert the sample rate on input. +A PortAudio ring buffer is used to buffer input when sample rate +conversion is required or when separate audio units are used for duplex +IO. Finally, a PortAudio buffer processor is used to convert formats and +provide additional buffers if needed. Internally, interleaved floating +point data streams are used exclusively - the audio unit converts from +the audio hardware's native format to interleaved float PCM and +PortAudio's Buffer processor is used for conversion to user formats. + +Simplex Input: Simplex input uses a single callback. If sample rate +conversion is required, a ring buffer and AudioConverter are used as +well. + +Simplex output: Simplex output uses a single callback. No ring buffer or +audio converter is used because AUHAL does its own output SR conversion. + +Duplex, one device (no SR conversion): When one device is used, a single +callback is used. This achieves very low latency. + +Duplex, separate devices or SR conversion: When SR conversion is +required, data must be buffered before it is converted and data is not +always available at the same times on input and output, so SR conversion +requires the same treatment as separate devices. The input callback +reads data and puts it in the ring buffer. The output callback reads the +data off the ring buffer, into an audio converter and finally to the +buffer processor. + +Platform Specific Options: + +By using the flags in pa_mac_core.h, the user may specify several options. +For example, the user can specify the sample-rate conversion quality, and +the extent to which PA will attempt to "play nice" and to what extent it +will interrupt other apps to improve performance. For example, if 44100 Hz +sample rate is requested but the device is set at 48000 Hz, PA can either +change the device for optimal playback ("Pro" mode), which may interrupt +other programs playing back audio, or simple use a sample-rate coversion, +which allows for friendlier sharing of the device ("Play Nice" mode). + +Additionally, the user may define a "channel mapping" by calling +paSetupMacCoreChannelMap() on their stream info structure before opening +the stream with it. See below for creating a channel map. + +Known issues: + +- Buffering: No buffering beyond that provided by core audio is provided +except where absolutely needed for the implementation to work. This may cause +issues with large framesPerBuffer settings and it also means that no additional +latency will be provided even if a large latency setting is selected. + +- Latency: Latency settings are generally ignored. They may be used as a +hint for buffer size in paHostFramesPerBufferUnspecified, or the value may +be used in cases where additional buffering is needed, such as doing input and +output on seperate devices. Latency settings are always automatically bound +to "safe" values, however, so setting extreme values here should not be +an issue. + +- Buffer Size: paHostFramesPerBufferUnspecified and specific host buffer sizes +are supported. paHostFramesPerBufferUnspecified works best in "pro" mode, +where the buffer size and sample rate of the audio device is most likely +to match the expected values. In the case of paHostFramesPerBuffer, an +appropriate framesPerBuffer value will be used that guarantees minimum +requested latency if that's possible. + +- Timing info. It reports on stream time, but I'm probably doing something +wrong since patest_sine_time often reports negative latency numbers. Also, +there are currently issues with some devices whehn plugging/unplugging +devices. + +- xrun detection: The only xrun detection performed is when reading +and writing the ring buffer. There is probably more that can be done. + +- abort/stop issues: stopping a stream is always a complete operation, +but latency should be low enough to make the lack of a separate abort +unnecessary. Apple clarifies its AudioOutputUnitStop() call here: +http://lists.apple.com/archives/coreaudio-api/2005/Dec/msg00055.html + +- blocking interface: should work fine. + +- multichannel: It has been tested successfully on multichannel hardware +from MOTU: traveler and 896HD. Also Presonus firepod and others. It is +believed to work with all Core Audio devices, including virtual devices +such as soundflower. + +- sample rate conversion quality: By default, SR conversion is the maximum +available. This can be tweaked using flags pa_mac_core.h. Note that the AU +render quyality property is used to set the sample rate conversion quality +as "documented" here: +http://lists.apple.com/archives/coreaudio-api/2004/Jan/msg00141.html + +- x86/Universal Binary: Universal binaries can be build. + + + +Creating a channel map: + +How to create the map array - Text taken From AUHAL.rtfd : +[3] Channel Maps +Clients can tell the AUHAL units which channels of the device they are interested in. For example, the client may be processing stereo data, but outputting to a six-channel device. This is done by using the kAudioOutputUnitProperty_ChannelMap property. To use this property: + +For Output: +Create an array of SInt32 that is the size of the number of channels of the device (Get the Format of the AUHAL's output Element == 0) +Initialize each of the array's values to -1 (-1 indicates that that channel is NOT to be presented in the conversion.) + +Next, for each channel of your app's output, set: +channelMapArray[deviceOutputChannel] = desiredAppOutputChannel. + +For example: we have a 6 channel output device and our application has a stereo source it wants to provide to the device. Suppose we want that stereo source to go to the 3rd and 4th channels of the device. The channel map would look like this: { -1, -1, 0, 1, -1, -1 } + +Where the formats are: +Input Element == 0: 2 channels (- client format - settable) +Output Element == 0: 6 channels (- device format - NOT settable) + +So channel 2 (zero-based) of the device will take the first channel of output and channel 3 will take the second channel of output. (This translates to the 3rd and 4th plugs of the 6 output plugs of the device of course!) + +For Input: +Create an array of SInt32 that is the size of the number of channels of the format you require for input. Get (or Set in this case as needed) the AUHAL's output Element == 1. + +Next, for each channel of input you require, set: +channelMapArray[desiredAppInputChannel] = deviceOutputChannel; + +For example: we have a 6 channel input device from which we wish to receive stereo input from the 3rd and 4th channels. The channel map looks like this: { 2, 3 } + +Where the formats are: +Input Element == 0: 2 channels (- device format - NOT settable) +Output Element == 0: 6 channels (- client format - settable) + + + +---------------------------------------- + +Notes on Original implementation: + +by Phil Burk and Darren Gibbs + +Last updated March 20, 2002 + +WHAT WORKS + +Output with very low latency, <10 msec. +Half duplex input or output. +Full duplex on the same CoreAudio device. +The paFLoat32, paInt16, paInt8, paUInt8 sample formats. +Pa_GetCPULoad() +Pa_StreamTime() + +KNOWN BUGS OR LIMITATIONS + +We do not yet support simultaneous input and output on different +devices. Note that some CoreAudio devices like the Roland UH30 look +like one device but are actually two different CoreAudio devices. The +Built-In audio is typically one CoreAudio device. + +Mono doesn't work. + +DEVICE MAPPING + +CoreAudio devices can support both input and output. But the sample +rates supported may be different. So we have map one or two PortAudio +device to each CoreAudio device depending on whether it supports +input, output or both. + +When we query devices, we first get a list of CoreAudio devices. Then +we scan the list and add a PortAudio device for each CoreAudio device +that supports input. Then we make a scan for output devices. + diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core.c b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core.c new file mode 100644 index 0000000000..b182dac05a --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core.c @@ -0,0 +1,2752 @@ +/* + * Implementation of the PortAudio API for Apple AUHAL + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file pa_mac_core + @ingroup hostapi_src + @author Bjorn Roche + @brief AUHAL implementation of PortAudio +*/ + +/* FIXME: not all error conditions call PaUtil_SetLastHostErrorInfo() + * PaMacCore_SetError() will do this. + */ + +#include "pa_mac_core_internal.h" + +#include /* strlen(), memcmp() etc. */ +#include + +#include "pa_mac_core.h" +#include "pa_mac_core_utilities.h" +#include "pa_mac_core_blocking.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* This is a reasonable size for a small buffer based on experience. */ +#define PA_MAC_SMALL_BUFFER_SIZE (64) + +/* prototypes for functions declared in this file */ +PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +/* + * Function declared in pa_mac_core.h. Sets up a PaMacCoreStreamInfoStruct + * with the requested flags and initializes channel map. + */ +void PaMacCore_SetupStreamInfo( PaMacCoreStreamInfo *data, const unsigned long flags ) +{ + bzero( data, sizeof( PaMacCoreStreamInfo ) ); + data->size = sizeof( PaMacCoreStreamInfo ); + data->hostApiType = paCoreAudio; + data->version = 0x01; + data->flags = flags; + data->channelMap = NULL; + data->channelMapSize = 0; +} + +/* + * Function declared in pa_mac_core.h. Adds channel mapping to a PaMacCoreStreamInfoStruct + */ +void PaMacCore_SetupChannelMap( PaMacCoreStreamInfo *data, const SInt32 * const channelMap, const unsigned long channelMapSize ) +{ + data->channelMap = channelMap; + data->channelMapSize = channelMapSize; +} +static char *channelName = NULL; +static int channelNameSize = 0; +static bool ensureChannelNameSize( int size ) +{ + if( size >= channelNameSize ) { + free( channelName ); + channelName = (char *) malloc( ( channelNameSize = size ) + 1 ); + if( !channelName ) { + channelNameSize = 0; + return false; + } + } + return true; +} +/* + * Function declared in pa_mac_core.h. retrives channel names. + */ +const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) +{ + struct PaUtilHostApiRepresentation *hostApi; + PaError err; + OSStatus error; + err = PaUtil_GetHostApiRepresentation( &hostApi, paCoreAudio ); + assert(err == paNoError); + if( err != paNoError ) + return NULL; + PaMacAUHAL *macCoreHostApi = (PaMacAUHAL*)hostApi; + AudioDeviceID hostApiDevice = macCoreHostApi->devIds[device]; + + UInt32 size = 0; + + error = AudioDeviceGetPropertyInfo( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelName, + &size, + NULL ); + if( error ) { + //try the CFString + CFStringRef name; + bool isDeviceName = false; + size = sizeof( name ); + error = AudioDeviceGetProperty( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelNameCFString, + &size, + &name ); + if( error ) { //as a last-ditch effort, get the device name. Later we'll append the channel number. + size = sizeof( name ); + error = AudioDeviceGetProperty( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyDeviceNameCFString, + &size, + &name ); + if( error ) + return NULL; + isDeviceName = true; + } + if( isDeviceName ) { + name = CFStringCreateWithFormat( NULL, NULL, CFSTR( "%@: %d"), name, channelIndex + 1 ); + } + + CFIndex length = CFStringGetLength(name); + while( ensureChannelNameSize( length * sizeof(UniChar) + 1 ) ) { + if( CFStringGetCString( name, channelName, channelNameSize, kCFStringEncodingUTF8 ) ) { + if( isDeviceName ) + CFRelease( name ); + return channelName; + } + if( length == 0 ) + ++length; + length *= 2; + } + if( isDeviceName ) + CFRelease( name ); + return NULL; + } + + //continue with C string: + if( !ensureChannelNameSize( size ) ) + return NULL; + + error = AudioDeviceGetProperty( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelName, + &size, + channelName ); + + if( error ) { + ERR( error ); + return NULL; + } + return channelName; +} + + + + + +AudioDeviceID PaMacCore_GetStreamInputDevice( PaStream* s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + VVDBUG(("PaMacCore_GetStreamInputHandle()\n")); + + return ( stream->inputDevice ); +} + +AudioDeviceID PaMacCore_GetStreamOutputDevice( PaStream* s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + VVDBUG(("PaMacCore_GetStreamOutputHandle()\n")); + + return ( stream->outputDevice ); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RING_BUFFER_ADVANCE_DENOMINATOR (4) + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static OSStatus AudioIOProc( void *inRefCon, + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData ); +static double GetStreamCpuLoad( PaStream* stream ); + +static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, + PaDeviceInfo *deviceInfo, + AudioDeviceID macCoreDeviceId, + int isInput); + +static PaError OpenAndSetupOneAudioUnit( + const PaMacCoreStream *stream, + const PaStreamParameters *inStreamParams, + const PaStreamParameters *outStreamParams, + const UInt32 requestedFramesPerBuffer, + UInt32 *actualInputFramesPerBuffer, + UInt32 *actualOutputFramesPerBuffer, + const PaMacAUHAL *auhalHostApi, + AudioUnit *audioUnit, + AudioConverterRef *srConverter, + AudioDeviceID *audioDevice, + const double sampleRate, + void *refCon ); + +/* for setting errors. */ +#define PA_AUHAL_SET_LAST_HOST_ERROR( errorCode, errorText ) \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, errorCode, errorText ) + +/* + * Callback called when starting or stopping a stream. + */ +static void startStopCallback( + void * inRefCon, + AudioUnit ci, + AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement ) +{ + PaMacCoreStream *stream = (PaMacCoreStream *) inRefCon; + UInt32 isRunning; + UInt32 size = sizeof( isRunning ); + OSStatus err; + err = AudioUnitGetProperty( ci, kAudioOutputUnitProperty_IsRunning, inScope, inElement, &isRunning, &size ); + assert( !err ); + if( err ) + isRunning = false; //it's very unclear what to do in case of error here. There's no real way to notify the user, and crashing seems unreasonable. + if( isRunning ) + return; //We are only interested in when we are stopping + // -- if we are using 2 I/O units, we only need one notification! + if( stream->inputUnit && stream->outputUnit && stream->inputUnit != stream->outputUnit && ci == stream->inputUnit ) + return; + PaStreamFinishedCallback *sfc = stream->streamRepresentation.streamFinishedCallback; + if( stream->state == STOPPING ) + stream->state = STOPPED ; + if( sfc ) + sfc( stream->streamRepresentation.userData ); +} + + +/*currently, this is only used in initialization, but it might be modified + to be used when the list of devices changes.*/ +static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) +{ + UInt32 size; + UInt32 propsize; + VVDBUG(("gatherDeviceInfo()\n")); + /* -- free any previous allocations -- */ + if( auhalHostApi->devIds ) + PaUtil_GroupFreeMemory(auhalHostApi->allocations, auhalHostApi->devIds); + auhalHostApi->devIds = NULL; + + /* -- figure out how many devices there are -- */ + AudioHardwareGetPropertyInfo( kAudioHardwarePropertyDevices, + &propsize, + NULL ); + auhalHostApi->devCount = propsize / sizeof( AudioDeviceID ); + + VDBUG( ( "Found %ld device(s).\n", auhalHostApi->devCount ) ); + + /* -- copy the device IDs -- */ + auhalHostApi->devIds = (AudioDeviceID *)PaUtil_GroupAllocateMemory( + auhalHostApi->allocations, + propsize ); + if( !auhalHostApi->devIds ) + return paInsufficientMemory; + AudioHardwareGetProperty( kAudioHardwarePropertyDevices, + &propsize, + auhalHostApi->devIds ); +#ifdef MAC_CORE_VERBOSE_DEBUG + { + int i; + for( i=0; idevCount; ++i ) + printf( "Device %d\t: %ld\n", i, auhalHostApi->devIds[i] ); + } +#endif + + size = sizeof(AudioDeviceID); + auhalHostApi->defaultIn = kAudioDeviceUnknown; + auhalHostApi->defaultOut = kAudioDeviceUnknown; + + /* determine the default device. */ + /* I am not sure how these calls to AudioHardwareGetProperty() + could fail, but in case they do, we use the first available + device as the default. */ + if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, + &size, + &auhalHostApi->defaultIn) ) { + int i; + auhalHostApi->defaultIn = kAudioDeviceUnknown; + VDBUG(("Failed to get default input device from OS.")); + VDBUG((" I will substitute the first available input Device.")); + for( i=0; idevCount; ++i ) { + PaDeviceInfo devInfo; + if( 0 != GetChannelInfo( auhalHostApi, &devInfo, + auhalHostApi->devIds[i], TRUE ) ) + if( devInfo.maxInputChannels ) { + auhalHostApi->defaultIn = auhalHostApi->devIds[i]; + break; + } + } + } + if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + &size, + &auhalHostApi->defaultOut) ) { + int i; + auhalHostApi->defaultIn = kAudioDeviceUnknown; + VDBUG(("Failed to get default output device from OS.")); + VDBUG((" I will substitute the first available output Device.")); + for( i=0; idevCount; ++i ) { + PaDeviceInfo devInfo; + if( 0 != GetChannelInfo( auhalHostApi, &devInfo, + auhalHostApi->devIds[i], FALSE ) ) + if( devInfo.maxOutputChannels ) { + auhalHostApi->defaultOut = auhalHostApi->devIds[i]; + break; + } + } + } + + VDBUG( ( "Default in : %ld\n", auhalHostApi->defaultIn ) ); + VDBUG( ( "Default out: %ld\n", auhalHostApi->defaultOut ) ); + + return paNoError; +} + +/* =================================================================================================== */ +/** + * @internal + * @brief Clip the desired size against the allowed IO buffer size range for the device. + */ +static PaError ClipToDeviceBufferSize( AudioDeviceID macCoreDeviceId, + int isInput, UInt32 desiredSize, UInt32 *allowedSize ) +{ + UInt32 resultSize = desiredSize; + AudioValueRange audioRange; + UInt32 propSize = sizeof( audioRange ); + PaError err = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + resultSize = MAX( resultSize, audioRange.mMinimum ); + resultSize = MIN( resultSize, audioRange.mMaximum ); + *allowedSize = resultSize; + return err; +} + +/* =================================================================================================== */ +#if 0 +static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, + int isInput ) +{ + PaError err; + int i; + UInt32 propSize; + UInt32 deviceLatency; + UInt32 streamLatency; + UInt32 bufferFrames; + UInt32 safetyOffset; + AudioStreamID streamIDs[128]; + + printf("\n======= latency query : macCoreDeviceId = %d, isInput %d =======\n", (int)macCoreDeviceId, isInput ); + + propSize = sizeof(UInt32); + err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); + printf("kAudioDevicePropertyBufferFrameSize: err = %d, propSize = %d, value = %d\n", err, propSize, bufferFrames ); + + propSize = sizeof(UInt32); + err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); + printf("kAudioDevicePropertySafetyOffset: err = %d, propSize = %d, value = %d\n", err, propSize, safetyOffset ); + + propSize = sizeof(UInt32); + err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); + printf("kAudioDevicePropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, deviceLatency ); + + AudioValueRange audioRange; + propSize = sizeof( audioRange ); + err = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + printf("kAudioDevicePropertyBufferFrameSizeRange: err = %d, propSize = %u, minimum = %g\n", err, propSize, audioRange.mMinimum); + printf("kAudioDevicePropertyBufferFrameSizeRange: err = %d, propSize = %u, maximum = %g\n", err, propSize, audioRange.mMaximum ); + + /* Get the streams from the device and query their latency. */ + propSize = sizeof(streamIDs); + err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); + int numStreams = propSize / sizeof(AudioStreamID); + for( i=0; imNumberBuffers; ++i) + numChannels += buflist->mBuffers[i].mNumberChannels; + + if (isInput) + deviceInfo->maxInputChannels = numChannels; + else + deviceInfo->maxOutputChannels = numChannels; + + if (numChannels > 0) /* do not try to retrieve the latency if there are no channels. */ + { + /* Get the latency. Don't fail if we can't get this. */ + /* default to something reasonable */ + deviceInfo->defaultLowInputLatency = .01; + deviceInfo->defaultHighInputLatency = .10; + deviceInfo->defaultLowOutputLatency = .01; + deviceInfo->defaultHighOutputLatency = .10; + UInt32 lowLatencyFrames = 0; + UInt32 highLatencyFrames = 0; + err = CalculateDefaultDeviceLatencies( macCoreDeviceId, isInput, &lowLatencyFrames, &highLatencyFrames ); + if( err == 0 ) + { + + double lowLatencySeconds = lowLatencyFrames / deviceInfo->defaultSampleRate; + double highLatencySeconds = highLatencyFrames / deviceInfo->defaultSampleRate; + if (isInput) + { + deviceInfo->defaultLowInputLatency = lowLatencySeconds; + deviceInfo->defaultHighInputLatency = highLatencySeconds; + } + else + { + deviceInfo->defaultLowOutputLatency = lowLatencySeconds; + deviceInfo->defaultHighOutputLatency = highLatencySeconds; + } + } + } + PaUtil_FreeMemory( buflist ); + return paNoError; + error: + PaUtil_FreeMemory( buflist ); + return err; +} + +/* =================================================================================================== */ +static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, + PaDeviceInfo *deviceInfo, + AudioDeviceID macCoreDeviceId, + PaHostApiIndex hostApiIndex ) +{ + Float64 sampleRate; + char *name; + PaError err = paNoError; + UInt32 propSize; + + VVDBUG(("InitializeDeviceInfo(): macCoreDeviceId=%ld\n", macCoreDeviceId)); + + memset(deviceInfo, 0, sizeof(deviceInfo)); + + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + /* Get the device name. Fail if we can't get it. */ + err = ERR(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL)); + if (err) + return err; + + name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize); + if ( !name ) + return paInsufficientMemory; + err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); + if (err) + return err; + deviceInfo->name = name; + + /* Try to get the default sample rate. Don't fail if we can't get this. */ + propSize = sizeof(Float64); + err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); + if (err) + deviceInfo->defaultSampleRate = 0.0; + else + deviceInfo->defaultSampleRate = sampleRate; + + /* Get the maximum number of input and output channels. Fail if we can't get this. */ + + err = GetChannelInfo(auhalHostApi, deviceInfo, macCoreDeviceId, 1); + if (err) + return err; + + err = GetChannelInfo(auhalHostApi, deviceInfo, macCoreDeviceId, 0); + if (err) + return err; + + return paNoError; +} + +PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i; + PaMacAUHAL *auhalHostApi = NULL; + PaDeviceInfo *deviceInfoArray; + int unixErr; + + VVDBUG(("PaMacCore_Initialize(): hostApiIndex=%d\n", hostApiIndex)); + + SInt32 major; + SInt32 minor; + Gestalt(gestaltSystemVersionMajor, &major); + Gestalt(gestaltSystemVersionMinor, &minor); + + // Starting with 10.6 systems, the HAL notification thread is created internally + if (major == 10 && minor >= 6) { + CFRunLoopRef theRunLoop = NULL; + AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); + if (osErr != noErr) { + goto error; + } + } + + unixErr = initializeXRunListenerList(); + if( 0 != unixErr ) { + return UNIX_ERR(unixErr); + } + + auhalHostApi = (PaMacAUHAL*)PaUtil_AllocateMemory( sizeof(PaMacAUHAL) ); + if( !auhalHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + auhalHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !auhalHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + auhalHostApi->devIds = NULL; + auhalHostApi->devCount = 0; + + /* get the info we need about the devices */ + result = gatherDeviceInfo( auhalHostApi ); + if( result != paNoError ) + goto error; + + *hostApi = &auhalHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paCoreAudio; + (*hostApi)->info.name = "Core Audio"; + + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + + (*hostApi)->info.deviceCount = 0; + + if( auhalHostApi->devCount > 0 ) + { + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + auhalHostApi->allocations, sizeof(PaDeviceInfo*) * auhalHostApi->devCount); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaDeviceInfo*)PaUtil_GroupAllocateMemory( + auhalHostApi->allocations, sizeof(PaDeviceInfo) * auhalHostApi->devCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < auhalHostApi->devCount; ++i ) + { + int err; + err = InitializeDeviceInfo( auhalHostApi, &deviceInfoArray[i], + auhalHostApi->devIds[i], + hostApiIndex ); + if (err == paNoError) + { /* copy some info and set the defaults */ + (*hostApi)->deviceInfos[(*hostApi)->info.deviceCount] = &deviceInfoArray[i]; + if (auhalHostApi->devIds[i] == auhalHostApi->defaultIn) + (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; + if (auhalHostApi->devIds[i] == auhalHostApi->defaultOut) + (*hostApi)->info.defaultOutputDevice = (*hostApi)->info.deviceCount; + (*hostApi)->info.deviceCount++; + } + else + { /* there was an error. we need to shift the devices down, so we ignore this one */ + int j; + auhalHostApi->devCount--; + for( j=i; jdevCount; ++j ) + auhalHostApi->devIds[j] = auhalHostApi->devIds[j+1]; + i--; + } + } + } + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &auhalHostApi->callbackStreamInterface, + CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, + IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, + PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &auhalHostApi->blockingStreamInterface, + CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, + IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, + GetStreamReadAvailable, + GetStreamWriteAvailable ); + + return result; + +error: + if( auhalHostApi ) + { + if( auhalHostApi->allocations ) + { + PaUtil_FreeAllAllocations( auhalHostApi->allocations ); + PaUtil_DestroyAllocationGroup( auhalHostApi->allocations ); + } + + PaUtil_FreeMemory( auhalHostApi ); + } + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + int unixErr; + + PaMacAUHAL *auhalHostApi = (PaMacAUHAL*)hostApi; + + VVDBUG(("Terminate()\n")); + + unixErr = destroyXRunListenerList(); + if( 0 != unixErr ) + UNIX_ERR(unixErr); + + /* + IMPLEMENT ME: + - clean up any resources not handled by the allocation group + TODO: Double check that everything is handled by alloc group + */ + + if( auhalHostApi->allocations ) + { + PaUtil_FreeAllAllocations( auhalHostApi->allocations ); + PaUtil_DestroyAllocationGroup( auhalHostApi->allocations ); + } + + PaUtil_FreeMemory( auhalHostApi ); +} + + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + + VVDBUG(("IsFormatSupported(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld sampleRate=%g\n", + inputParameters ? inputParameters->channelCount : -1, + inputParameters ? inputParameters->sampleFormat : -1, + outputParameters ? outputParameters->channelCount : -1, + outputParameters ? outputParameters->sampleFormat : -1, + (float) sampleRate )); + + /** These first checks are standard PA checks. We do some fancier checks + later. */ + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( inputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( outputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support outputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + } + else + { + outputChannelCount = 0; + } + + /* FEEDBACK */ + /* I think the only way to check a given format SR combo is */ + /* to try opening it. This could be disruptive, is that Okay? */ + /* The alternative is to just read off available sample rates, */ + /* but this will not work %100 of the time (eg, a device that */ + /* supports N output at one rate but only N/2 at a higher rate.)*/ + + /* The following code opens the device with the requested parameters to + see if it works. */ + { + PaError err; + PaStream *s; + err = OpenStream( hostApi, &s, inputParameters, outputParameters, + sampleRate, 1024, 0, (PaStreamCallback *)1, NULL ); + if( err != paNoError && err != paInvalidSampleRate ) + DBUG( ( "OpenStream @ %g returned: %d: %s\n", + (float) sampleRate, err, Pa_GetErrorText( err ) ) ); + if( err ) + return err; + err = CloseStream( s ); + if( err ) { + /* FEEDBACK: is this more serious? should we assert? */ + DBUG( ( "WARNING: could not close Stream. %d: %s\n", + err, Pa_GetErrorText( err ) ) ); + } + } + + return paFormatIsSupported; +} + +/* ================================================================================= */ +static void InitializeDeviceProperties( PaMacCoreDeviceProperties *deviceProperties ) +{ + memset( deviceProperties, 0, sizeof(PaMacCoreDeviceProperties) ); + deviceProperties->sampleRate = 1.0; // Better than random. Overwritten by actual values later on. + deviceProperties->samplePeriod = 1.0 / deviceProperties->sampleRate; +} + +static Float64 CalculateSoftwareLatencyFromProperties( PaMacCoreStream *stream, PaMacCoreDeviceProperties *deviceProperties ) +{ + UInt32 latencyFrames = deviceProperties->bufferFrameSize + deviceProperties->deviceLatency + deviceProperties->safetyOffset; + return latencyFrames * deviceProperties->samplePeriod; // same as dividing by sampleRate but faster +} + +static Float64 CalculateHardwareLatencyFromProperties( PaMacCoreStream *stream, PaMacCoreDeviceProperties *deviceProperties ) +{ + return deviceProperties->deviceLatency * deviceProperties->samplePeriod; // same as dividing by sampleRate but faster +} + +/* Calculate values used to convert Apple timestamps into PA timestamps + * from the device properties. The final results of this calculation + * will be used in the audio callback function. + */ +static void UpdateTimeStampOffsets( PaMacCoreStream *stream ) +{ + Float64 inputSoftwareLatency = 0.0; + Float64 inputHardwareLatency = 0.0; + Float64 outputSoftwareLatency = 0.0; + Float64 outputHardwareLatency = 0.0; + + if( stream->inputUnit != NULL ) + { + inputSoftwareLatency = CalculateSoftwareLatencyFromProperties( stream, &stream->inputProperties ); + inputHardwareLatency = CalculateHardwareLatencyFromProperties( stream, &stream->inputProperties ); + } + if( stream->outputUnit != NULL ) + { + outputSoftwareLatency = CalculateSoftwareLatencyFromProperties( stream, &stream->outputProperties ); + outputHardwareLatency = CalculateHardwareLatencyFromProperties( stream, &stream->outputProperties ); + } + + /* We only need a mutex around setting these variables as a group. */ + pthread_mutex_lock( &stream->timingInformationMutex ); + stream->timestampOffsetCombined = inputSoftwareLatency + outputSoftwareLatency; + stream->timestampOffsetInputDevice = inputHardwareLatency; + stream->timestampOffsetOutputDevice = outputHardwareLatency; + pthread_mutex_unlock( &stream->timingInformationMutex ); +} + +/* ================================================================================= */ +/* Query sample rate property. */ +static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) +{ + PaMacCoreDeviceProperties * deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; + /* FIXME: not sure if this should be the sample rate of the output device or the output unit */ + Float64 actualSampleRate = deviceProperties->sampleRate; + UInt32 propSize = sizeof(Float64); + OSStatus osErr = AudioDeviceGetProperty( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, &propSize, &actualSampleRate); + if( (osErr == noErr) && (actualSampleRate > 1000.0) ) // avoid divide by zero if there's an error + { + deviceProperties->sampleRate = actualSampleRate; + deviceProperties->samplePeriod = 1.0 / actualSampleRate; + } + return osErr; +} + +static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; + + // Make sure the callback is operating on a stream that is still valid! + assert( stream->streamRepresentation.magic == PA_STREAM_MAGIC ); + + OSStatus osErr = UpdateSampleRateFromDeviceProperty( stream, inDevice, isInput ); + if( osErr == noErr ) + { + UpdateTimeStampOffsets( stream ); + } + return osErr; +} + +/* ================================================================================= */ +static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID propertyID, UInt32 *outValue ) +{ + UInt32 propertyValue = 0; + UInt32 propertySize = sizeof(UInt32); + OSStatus osErr = AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); + if( osErr == noErr ) + { + *outValue = propertyValue; + } + return osErr; +} + +static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) +{ + OSStatus osErr = noErr; + PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; + + // Make sure the callback is operating on a stream that is still valid! + assert( stream->streamRepresentation.magic == PA_STREAM_MAGIC ); + + PaMacCoreDeviceProperties *deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; + UInt32 *valuePtr = NULL; + switch( inPropertyID ) + { + case kAudioDevicePropertySafetyOffset: + valuePtr = &deviceProperties->safetyOffset; + break; + + case kAudioDevicePropertyLatency: + valuePtr = &deviceProperties->deviceLatency; + break; + + case kAudioDevicePropertyBufferFrameSize: + valuePtr = &deviceProperties->bufferFrameSize; + break; + } + if( valuePtr != NULL ) + { + osErr = QueryUInt32DeviceProperty( inDevice, isInput, inPropertyID, valuePtr ); + if( osErr == noErr ) + { + UpdateTimeStampOffsets( stream ); + } + } + return osErr; +} + +/* ================================================================================= */ +/* + * Setup listeners in case device properties change during the run. */ +static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) +{ + OSStatus osErr = noErr; + PaMacCoreDeviceProperties *deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; + + // Start with the current values for the device properties. + UpdateSampleRateFromDeviceProperty( stream, deviceID, isInput ); + + if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, + kAudioDevicePropertyLatency, &deviceProperties->deviceLatency )) != noErr ) return osErr; + if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, + kAudioDevicePropertyBufferFrameSize, &deviceProperties->bufferFrameSize )) != noErr ) return osErr; + if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, + kAudioDevicePropertySafetyOffset, &deviceProperties->safetyOffset )) != noErr ) return osErr; + + AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + AudioDevicePropertyActualSampleRateListenerProc, stream ); + + AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, + AudioDevicePropertyGenericListenerProc, stream ); + AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + AudioDevicePropertyGenericListenerProc, stream ); + AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + AudioDevicePropertyGenericListenerProc, stream ); + + return osErr; +} + +static void CleanupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) +{ + AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + AudioDevicePropertyActualSampleRateListenerProc ); + + AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, + AudioDevicePropertyGenericListenerProc ); + AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + AudioDevicePropertyGenericListenerProc ); + AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + AudioDevicePropertyGenericListenerProc ); +} + +/* ================================================================================= */ +static PaError OpenAndSetupOneAudioUnit( + const PaMacCoreStream *stream, + const PaStreamParameters *inStreamParams, + const PaStreamParameters *outStreamParams, + const UInt32 requestedFramesPerBuffer, + UInt32 *actualInputFramesPerBuffer, + UInt32 *actualOutputFramesPerBuffer, + const PaMacAUHAL *auhalHostApi, + AudioUnit *audioUnit, + AudioConverterRef *srConverter, + AudioDeviceID *audioDevice, + const double sampleRate, + void *refCon ) +{ + ComponentDescription desc; + Component comp; + /*An Apple TN suggests using CAStreamBasicDescription, but that is C++*/ + AudioStreamBasicDescription desiredFormat; + OSStatus result = noErr; + PaError paResult = paNoError; + int line = 0; + UInt32 callbackKey; + AURenderCallbackStruct rcbs; + unsigned long macInputStreamFlags = paMacCorePlayNice; + unsigned long macOutputStreamFlags = paMacCorePlayNice; + SInt32 const *inChannelMap = NULL; + SInt32 const *outChannelMap = NULL; + unsigned long inChannelMapSize = 0; + unsigned long outChannelMapSize = 0; + + VVDBUG(("OpenAndSetupOneAudioUnit(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld, requestedFramesPerBuffer=%ld\n", + inStreamParams ? inStreamParams->channelCount : -1, + inStreamParams ? inStreamParams->sampleFormat : -1, + outStreamParams ? outStreamParams->channelCount : -1, + outStreamParams ? outStreamParams->sampleFormat : -1, + requestedFramesPerBuffer )); + + /* -- handle the degenerate case -- */ + if( !inStreamParams && !outStreamParams ) { + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return paNoError; + } + + /* -- get the user's api specific info, if they set any -- */ + if( inStreamParams && inStreamParams->hostApiSpecificStreamInfo ) + { + macInputStreamFlags= + ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) + ->flags; + inChannelMap = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) + ->channelMap; + inChannelMapSize = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) + ->channelMapSize; + } + if( outStreamParams && outStreamParams->hostApiSpecificStreamInfo ) + { + macOutputStreamFlags= + ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) + ->flags; + outChannelMap = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) + ->channelMap; + outChannelMapSize = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) + ->channelMapSize; + } + /* Override user's flags here, if desired for testing. */ + + /* + * The HAL AU is a Mac OS style "component". + * the first few steps deal with that. + * Later steps work on a combination of Mac OS + * components and the slightly lower level + * HAL. + */ + + /* -- describe the output type AudioUnit -- */ + /* Note: for the default AudioUnit, we could use the + * componentSubType value kAudioUnitSubType_DefaultOutput; + * but I don't think that's relevant here. + */ + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_HALOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + /* -- find the component -- */ + comp = FindNextComponent( NULL, &desc ); + if( !comp ) + { + DBUG( ( "AUHAL component not found." ) ); + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return paUnanticipatedHostError; + } + /* -- open it -- */ + result = OpenAComponent( comp, audioUnit ); + if( result ) + { + DBUG( ( "Failed to open AUHAL component." ) ); + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return ERR( result ); + } + /* -- prepare a little error handling logic / hackery -- */ +#define ERR_WRAP(mac_err) do { result = mac_err ; line = __LINE__ ; if ( result != noErr ) goto error ; } while(0) + + /* -- if there is input, we have to explicitly enable input -- */ + if( inStreamParams ) + { + UInt32 enableIO = 1; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Input, + INPUT_ELEMENT, + &enableIO, + sizeof(enableIO) ) ); + } + /* -- if there is no output, we must explicitly disable output -- */ + if( !outStreamParams ) + { + UInt32 enableIO = 0; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Output, + OUTPUT_ELEMENT, + &enableIO, + sizeof(enableIO) ) ); + } + + /* -- set the devices -- */ + /* make sure input and output are the same device if we are doing input and + output. */ + if( inStreamParams && outStreamParams ) + { + assert( outStreamParams->device == inStreamParams->device ); + } + if( inStreamParams ) + { + *audioDevice = auhalHostApi->devIds[inStreamParams->device] ; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, + INPUT_ELEMENT, + audioDevice, + sizeof(AudioDeviceID) ) ); + } + if( outStreamParams && outStreamParams != inStreamParams ) + { + *audioDevice = auhalHostApi->devIds[outStreamParams->device] ; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + audioDevice, + sizeof(AudioDeviceID) ) ); + } + /* -- add listener for dropouts -- */ + result = AudioDeviceAddPropertyListener( *audioDevice, + 0, + outStreamParams ? false : true, + kAudioDeviceProcessorOverload, + xrunCallback, + addToXRunListenerList( (void *)stream ) ) ; + if( result == kAudioHardwareIllegalOperationError ) { + // -- already registered, we're good + } else { + // -- not already registered, just check for errors + ERR_WRAP( result ); + } + /* -- listen for stream start and stop -- */ + ERR_WRAP( AudioUnitAddPropertyListener( *audioUnit, + kAudioOutputUnitProperty_IsRunning, + startStopCallback, + (void *)stream ) ); + + /* -- set format -- */ + bzero( &desiredFormat, sizeof(desiredFormat) ); + desiredFormat.mFormatID = kAudioFormatLinearPCM ; + desiredFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; + desiredFormat.mFramesPerPacket = 1; + desiredFormat.mBitsPerChannel = sizeof( float ) * 8; + + result = 0; + /* set device format first, but only touch the device if the user asked */ + if( inStreamParams ) { + /*The callback never calls back if we don't set the FPB */ + /*This seems wierd, because I would think setting anything on the device + would be disruptive.*/ + paResult = setBestFramesPerBuffer( *audioDevice, FALSE, + requestedFramesPerBuffer, + actualInputFramesPerBuffer ); + if( paResult ) goto error; + if( macInputStreamFlags & paMacCoreChangeDeviceParameters ) { + bool requireExact; + requireExact=macInputStreamFlags & paMacCoreFailIfConversionRequired; + paResult = setBestSampleRateForDevice( *audioDevice, FALSE, + requireExact, sampleRate ); + if( paResult ) goto error; + } + if( actualInputFramesPerBuffer && actualOutputFramesPerBuffer ) + *actualOutputFramesPerBuffer = *actualInputFramesPerBuffer ; + } + if( outStreamParams && !inStreamParams ) { + /*The callback never calls back if we don't set the FPB */ + /*This seems wierd, because I would think setting anything on the device + would be disruptive.*/ + paResult = setBestFramesPerBuffer( *audioDevice, TRUE, + requestedFramesPerBuffer, + actualOutputFramesPerBuffer ); + if( paResult ) goto error; + if( macOutputStreamFlags & paMacCoreChangeDeviceParameters ) { + bool requireExact; + requireExact=macOutputStreamFlags & paMacCoreFailIfConversionRequired; + paResult = setBestSampleRateForDevice( *audioDevice, TRUE, + requireExact, sampleRate ); + if( paResult ) goto error; + } + } + + /* -- set the quality of the output converter -- */ + if( outStreamParams ) { + UInt32 value = kAudioConverterQuality_Max; + switch( macOutputStreamFlags & 0x0700 ) { + case 0x0100: /*paMacCore_ConversionQualityMin:*/ + value=kRenderQuality_Min; + break; + case 0x0200: /*paMacCore_ConversionQualityLow:*/ + value=kRenderQuality_Low; + break; + case 0x0300: /*paMacCore_ConversionQualityMedium:*/ + value=kRenderQuality_Medium; + break; + case 0x0400: /*paMacCore_ConversionQualityHigh:*/ + value=kRenderQuality_High; + break; + } + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_RenderQuality, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + &value, + sizeof(value) ) ); + } + /* now set the format on the Audio Units. */ + if( outStreamParams ) + { + desiredFormat.mSampleRate =sampleRate; + desiredFormat.mBytesPerPacket=sizeof(float)*outStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*outStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = outStreamParams->channelCount; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + OUTPUT_ELEMENT, + &desiredFormat, + sizeof(AudioStreamBasicDescription) ) ); + } + if( inStreamParams ) + { + AudioStreamBasicDescription sourceFormat; + UInt32 size = sizeof( AudioStreamBasicDescription ); + + /* keep the sample rate of the device, or we confuse AUHAL */ + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + INPUT_ELEMENT, + &sourceFormat, + &size ) ); + desiredFormat.mSampleRate = sourceFormat.mSampleRate; + desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &desiredFormat, + sizeof(AudioStreamBasicDescription) ) ); + } + /* set the maximumFramesPerSlice */ + /* not doing this causes real problems + (eg. the callback might not be called). The idea of setting both this + and the frames per buffer on the device is that we'll be most likely + to actually get the frame size we requested in the callback with the + minimum latency. */ + if( outStreamParams ) { + UInt32 size = sizeof( *actualOutputFramesPerBuffer ); + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Input, + OUTPUT_ELEMENT, + actualOutputFramesPerBuffer, + sizeof(*actualOutputFramesPerBuffer) ) ); + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + actualOutputFramesPerBuffer, + &size ) ); + } + if( inStreamParams ) { + /*UInt32 size = sizeof( *actualInputFramesPerBuffer );*/ + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Output, + INPUT_ELEMENT, + actualInputFramesPerBuffer, + sizeof(*actualInputFramesPerBuffer) ) ); +/* Don't know why this causes problems + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, //Output, + INPUT_ELEMENT, + actualInputFramesPerBuffer, + &size ) ); +*/ + } + + /* -- if we have input, we may need to setup an SR converter -- */ + /* even if we got the sample rate we asked for, we need to do + the conversion in case another program changes the underlying SR. */ + /* FIXME: I think we need to monitor stream and change the converter if the incoming format changes. */ + if( inStreamParams ) { + AudioStreamBasicDescription desiredFormat; + AudioStreamBasicDescription sourceFormat; + UInt32 sourceSize = sizeof( sourceFormat ); + bzero( &desiredFormat, sizeof(desiredFormat) ); + desiredFormat.mSampleRate = sampleRate; + desiredFormat.mFormatID = kAudioFormatLinearPCM ; + desiredFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; + desiredFormat.mFramesPerPacket = 1; + desiredFormat.mBitsPerChannel = sizeof( float ) * 8; + desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; + + /* get the source format */ + ERR_WRAP( AudioUnitGetProperty( + *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &sourceFormat, + &sourceSize ) ); + + if( desiredFormat.mSampleRate != sourceFormat.mSampleRate ) + { + UInt32 value = kAudioConverterQuality_Max; + switch( macInputStreamFlags & 0x0700 ) { + case 0x0100: /*paMacCore_ConversionQualityMin:*/ + value=kAudioConverterQuality_Min; + break; + case 0x0200: /*paMacCore_ConversionQualityLow:*/ + value=kAudioConverterQuality_Low; + break; + case 0x0300: /*paMacCore_ConversionQualityMedium:*/ + value=kAudioConverterQuality_Medium; + break; + case 0x0400: /*paMacCore_ConversionQualityHigh:*/ + value=kAudioConverterQuality_High; + break; + } + VDBUG(( "Creating sample rate converter for input" + " to convert from %g to %g\n", + (float)sourceFormat.mSampleRate, + (float)desiredFormat.mSampleRate ) ); + /* create our converter */ + ERR_WRAP( AudioConverterNew( + &sourceFormat, + &desiredFormat, + srConverter ) ); + /* Set quality */ + ERR_WRAP( AudioConverterSetProperty( + *srConverter, + kAudioConverterSampleRateConverterQuality, + sizeof( value ), + &value ) ); + } + } + /* -- set IOProc (callback) -- */ + callbackKey = outStreamParams ? kAudioUnitProperty_SetRenderCallback + : kAudioOutputUnitProperty_SetInputCallback ; + rcbs.inputProc = AudioIOProc; + rcbs.inputProcRefCon = refCon; + ERR_WRAP( AudioUnitSetProperty( + *audioUnit, + callbackKey, + kAudioUnitScope_Output, + outStreamParams ? OUTPUT_ELEMENT : INPUT_ELEMENT, + &rcbs, + sizeof(rcbs)) ); + + if( inStreamParams && outStreamParams && *srConverter ) + ERR_WRAP( AudioUnitSetProperty( + *audioUnit, + kAudioOutputUnitProperty_SetInputCallback, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &rcbs, + sizeof(rcbs)) ); + + /* channel mapping. */ + if(inChannelMap) + { + UInt32 mapSize = inChannelMapSize *sizeof(SInt32); + + //for each channel of desired input, map the channel from + //the device's output channel. + ERR_WRAP( AudioUnitSetProperty(*audioUnit, + kAudioOutputUnitProperty_ChannelMap, + kAudioUnitScope_Output, + INPUT_ELEMENT, + inChannelMap, + mapSize)); + } + if(outChannelMap) + { + UInt32 mapSize = outChannelMapSize *sizeof(SInt32); + + //for each channel of desired output, map the channel from + //the device's output channel. + ERR_WRAP(AudioUnitSetProperty(*audioUnit, + kAudioOutputUnitProperty_ChannelMap, + kAudioUnitScope_Output, + OUTPUT_ELEMENT, + outChannelMap, + mapSize)); + } + /* initialize the audio unit */ + ERR_WRAP( AudioUnitInitialize(*audioUnit) ); + + if( inStreamParams && outStreamParams ) + { + VDBUG( ("Opened device %ld for input and output.\n", *audioDevice ) ); + } + else if( inStreamParams ) + { + VDBUG( ("Opened device %ld for input.\n", *audioDevice ) ); + } + else if( outStreamParams ) + { + VDBUG( ("Opened device %ld for output.\n", *audioDevice ) ); + } + return paNoError; +#undef ERR_WRAP + + error: + CloseComponent( *audioUnit ); + *audioUnit = NULL; + if( result ) + return PaMacCore_SetError( result, line, 1 ); + return paResult; +} + +/* =================================================================================================== */ + +static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + UInt32 fixedInputLatency, + UInt32 fixedOutputLatency, + double sampleRate, + UInt32 requestedFramesPerBuffer ) +{ + UInt32 resultBufferSizeFrames = 0; + // Use maximum of suggested input and output latencies. + if( inputParameters ) + { + UInt32 suggestedLatencyFrames = inputParameters->suggestedLatency * sampleRate; + // Calculate a buffer size assuming we are double buffered. + SInt32 variableLatencyFrames = suggestedLatencyFrames - fixedInputLatency; + // Prevent negative latency. + variableLatencyFrames = MAX( variableLatencyFrames, 0 ); + resultBufferSizeFrames = MAX( resultBufferSizeFrames, (UInt32) variableLatencyFrames ); + } + if( outputParameters ) + { + UInt32 suggestedLatencyFrames = outputParameters->suggestedLatency * sampleRate; + SInt32 variableLatencyFrames = suggestedLatencyFrames - fixedOutputLatency; + variableLatencyFrames = MAX( variableLatencyFrames, 0 ); + resultBufferSizeFrames = MAX( resultBufferSizeFrames, (UInt32) variableLatencyFrames ); + } + + if( requestedFramesPerBuffer != paFramesPerBufferUnspecified ) + { + // make host buffer the next highest integer multiple of user frames per buffer + UInt32 n = (resultBufferSizeFrames + requestedFramesPerBuffer - 1) / requestedFramesPerBuffer; + resultBufferSizeFrames = n * requestedFramesPerBuffer; + + }else{ + VDBUG( ("Block Size unspecified. Based on Latency, the user wants a Block Size near: %ld.\n", + resultBufferSizeFrames ) ); + } + + // Clip to the capabilities of the device. + if( inputParameters ) + { + ClipToDeviceBufferSize( auhalHostApi->devIds[inputParameters->device], + true, // In the old code isInput was false! + resultBufferSizeFrames, &resultBufferSizeFrames ); + } + if( outputParameters ) + { + ClipToDeviceBufferSize( auhalHostApi->devIds[outputParameters->device], + false, resultBufferSizeFrames, &resultBufferSizeFrames ); + } + VDBUG(("After querying hardware, setting block size to %ld.\n", resultBufferSizeFrames)); + + return resultBufferSizeFrames; +} + +/* =================================================================================================== */ +/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long requestedFramesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaMacAUHAL *auhalHostApi = (PaMacAUHAL*)hostApi; + PaMacCoreStream *stream = 0; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + UInt32 fixedInputLatency = 0; + UInt32 fixedOutputLatency = 0; + // Accumulate contributions to latency in these variables. + UInt32 inputLatencyFrames = 0; + UInt32 outputLatencyFrames = 0; + UInt32 suggestedLatencyFramesPerBuffer = requestedFramesPerBuffer; + + VVDBUG(("OpenStream(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld SR=%g, FPB=%ld\n", + inputParameters ? inputParameters->channelCount : -1, + inputParameters ? inputParameters->sampleFormat : -1, + outputParameters ? outputParameters->channelCount : -1, + outputParameters ? outputParameters->sampleFormat : -1, + (float) sampleRate, + requestedFramesPerBuffer )); + VDBUG( ("Opening Stream.\n") ); + + /* These first few bits of code are from paSkeleton with few modifications. */ + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* @todo Blocking read/write on Mac is not yet supported. */ + if( !streamCallback && inputSampleFormat & paNonInterleaved ) + { + return paSampleFormatNotSupported; + } + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* Host supports interleaved float32 */ + hostInputSampleFormat = paFloat32; + } + else + { + inputChannelCount = 0; + inputSampleFormat = hostInputSampleFormat = paFloat32; /* Surpress 'uninitialised var' warnings. */ + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* @todo Blocking read/write on Mac is not yet supported. */ + if( !streamCallback && outputSampleFormat & paNonInterleaved ) + { + return paSampleFormatNotSupported; + } + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* Host supports interleaved float32 */ + hostOutputSampleFormat = paFloat32; + } + else + { + outputChannelCount = 0; + outputSampleFormat = hostOutputSampleFormat = paFloat32; /* Surpress 'uninitialized var' warnings. */ + } + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + stream = (PaMacCoreStream*)PaUtil_AllocateMemory( sizeof(PaMacCoreStream) ); + if( !stream ) + { + result = paInsufficientMemory; + goto error; + } + + /* If we fail after this point, we my be left in a bad state, with + some data structures setup and others not. So, first thing we + do is initialize everything so that if we fail, we know what hasn't + been touched. + */ + + stream->inputAudioBufferList.mBuffers[0].mData = NULL; + stream->inputRingBuffer.buffer = NULL; + bzero( &stream->blio, sizeof( PaMacBlio ) ); +/* + stream->blio.inputRingBuffer.buffer = NULL; + stream->blio.outputRingBuffer.buffer = NULL; + stream->blio.inputSampleFormat = inputParameters?inputParameters->sampleFormat:0; + stream->blio.inputSampleSize = computeSampleSizeFromFormat(stream->blio.inputSampleFormat); + stream->blio.outputSampleFormat=outputParameters?outputParameters->sampleFormat:0; + stream->blio.outputSampleSize = computeSampleSizeFromFormat(stream->blio.outputSampleFormat); +*/ + stream->inputSRConverter = NULL; + stream->inputUnit = NULL; + stream->outputUnit = NULL; + stream->inputFramesPerBuffer = 0; + stream->outputFramesPerBuffer = 0; + stream->bufferProcessorIsInitialized = FALSE; + stream->timingInformationMutexIsInitialized = 0; + + /* assert( streamCallback ) ; */ /* only callback mode is implemented */ + if( streamCallback ) + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &auhalHostApi->callbackStreamInterface, + streamCallback, userData ); + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &auhalHostApi->blockingStreamInterface, + BlioCallback, &stream->blio ); + } + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + + if( inputParameters ) + { + CalculateFixedDeviceLatency( auhalHostApi->devIds[inputParameters->device], true, &fixedInputLatency ); + inputLatencyFrames += fixedInputLatency; + } + if( outputParameters ) + { + CalculateFixedDeviceLatency( auhalHostApi->devIds[outputParameters->device], false, &fixedOutputLatency ); + outputLatencyFrames += fixedOutputLatency; + + } + + suggestedLatencyFramesPerBuffer = CalculateOptimalBufferSize( auhalHostApi, inputParameters, outputParameters, + fixedInputLatency, fixedOutputLatency, + sampleRate, requestedFramesPerBuffer ); + if( requestedFramesPerBuffer == paFramesPerBufferUnspecified ) + { + requestedFramesPerBuffer = suggestedLatencyFramesPerBuffer; + } + + /* -- Now we actually open and setup streams. -- */ + if( inputParameters && outputParameters && outputParameters->device == inputParameters->device ) + { /* full duplex. One device. */ + UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; + UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; + result = OpenAndSetupOneAudioUnit( stream, + inputParameters, + outputParameters, + suggestedLatencyFramesPerBuffer, + &inputFramesPerBuffer, + &outputFramesPerBuffer, + auhalHostApi, + &(stream->inputUnit), + &(stream->inputSRConverter), + &(stream->inputDevice), + sampleRate, + stream ); + stream->inputFramesPerBuffer = inputFramesPerBuffer; + stream->outputFramesPerBuffer = outputFramesPerBuffer; + stream->outputUnit = stream->inputUnit; + stream->outputDevice = stream->inputDevice; + if( result != paNoError ) + goto error; + } + else + { /* full duplex, different devices OR simplex */ + UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; + UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; + result = OpenAndSetupOneAudioUnit( stream, + NULL, + outputParameters, + suggestedLatencyFramesPerBuffer, + NULL, + &outputFramesPerBuffer, + auhalHostApi, + &(stream->outputUnit), + NULL, + &(stream->outputDevice), + sampleRate, + stream ); + if( result != paNoError ) + goto error; + result = OpenAndSetupOneAudioUnit( stream, + inputParameters, + NULL, + suggestedLatencyFramesPerBuffer, + &inputFramesPerBuffer, + NULL, + auhalHostApi, + &(stream->inputUnit), + &(stream->inputSRConverter), + &(stream->inputDevice), + sampleRate, + stream ); + if( result != paNoError ) + goto error; + stream->inputFramesPerBuffer = inputFramesPerBuffer; + stream->outputFramesPerBuffer = outputFramesPerBuffer; + } + + inputLatencyFrames += stream->inputFramesPerBuffer; + outputLatencyFrames += stream->outputFramesPerBuffer; + + if( stream->inputUnit ) { + const size_t szfl = sizeof(float); + /* setup the AudioBufferList used for input */ + bzero( &stream->inputAudioBufferList, sizeof( AudioBufferList ) ); + stream->inputAudioBufferList.mNumberBuffers = 1; + stream->inputAudioBufferList.mBuffers[0].mNumberChannels + = inputChannelCount; + stream->inputAudioBufferList.mBuffers[0].mDataByteSize + = stream->inputFramesPerBuffer*inputChannelCount*szfl; + stream->inputAudioBufferList.mBuffers[0].mData + = (float *) calloc( + stream->inputFramesPerBuffer*inputChannelCount, + szfl ); + if( !stream->inputAudioBufferList.mBuffers[0].mData ) + { + result = paInsufficientMemory; + goto error; + } + + /* + * If input and output devs are different or we are doing SR conversion, + * we also need a + * ring buffer to store inpt data while waiting for output + * data. + */ + if( (stream->outputUnit && (stream->inputUnit != stream->outputUnit)) + || stream->inputSRConverter ) + { + /* May want the ringSize ot initial position in + ring buffer to depend somewhat on sample rate change */ + + void *data; + long ringSize; + + ringSize = computeRingBufferSize( inputParameters, + outputParameters, + stream->inputFramesPerBuffer, + stream->outputFramesPerBuffer, + sampleRate ); + /*ringSize <<= 4; *//*16x bigger, for testing */ + + + /*now, we need to allocate memory for the ring buffer*/ + data = calloc( ringSize, szfl*inputParameters->channelCount ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } + + /* now we can initialize the ring buffer */ + PaUtil_InitializeRingBuffer( &stream->inputRingBuffer, szfl*inputParameters->channelCount, ringSize, data ) ; + /* advance the read point a little, so we are reading from the + middle of the buffer */ + if( stream->outputUnit ) + PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, ringSize / RING_BUFFER_ADVANCE_DENOMINATOR ); + + // Just adds to input latency between input device and PA full duplex callback. + inputLatencyFrames += ringSize; + } + } + + /* -- initialize Blio Buffer Processors -- */ + if( !streamCallback ) + { + long ringSize; + + ringSize = computeRingBufferSize( inputParameters, + outputParameters, + stream->inputFramesPerBuffer, + stream->outputFramesPerBuffer, + sampleRate ); + result = initializeBlioRingBuffers( &stream->blio, + inputParameters?inputParameters->sampleFormat:0 , + outputParameters?outputParameters->sampleFormat:0 , + MAX(stream->inputFramesPerBuffer,stream->outputFramesPerBuffer), + ringSize, + inputParameters?inputChannelCount:0 , + outputParameters?outputChannelCount:0 ) ; + if( result != paNoError ) + goto error; + + inputLatencyFrames += ringSize; + outputLatencyFrames += ringSize; + + } + + /* -- initialize Buffer Processor -- */ + { + unsigned long maxHostFrames = stream->inputFramesPerBuffer; + if( stream->outputFramesPerBuffer > maxHostFrames ) + maxHostFrames = stream->outputFramesPerBuffer; + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, + hostInputSampleFormat, + outputChannelCount, outputSampleFormat, + hostOutputSampleFormat, + sampleRate, + streamFlags, + requestedFramesPerBuffer, + /* If sample rate conversion takes place, the buffer size + will not be known. */ + maxHostFrames, + stream->inputSRConverter + ? paUtilUnknownHostBufferSize + : paUtilBoundedHostBufferSize, + streamCallback ? streamCallback : BlioCallback, + streamCallback ? userData : &stream->blio ); + if( result != paNoError ) + goto error; + } + stream->bufferProcessorIsInitialized = TRUE; + + // Calculate actual latency from the sum of individual latencies. + if( inputParameters ) + { + inputLatencyFrames += PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor); + stream->streamRepresentation.streamInfo.inputLatency = inputLatencyFrames / sampleRate; + } + else + { + stream->streamRepresentation.streamInfo.inputLatency = 0.0; + } + + if( outputParameters ) + { + outputLatencyFrames += PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor); + stream->streamRepresentation.streamInfo.outputLatency = outputLatencyFrames / sampleRate; + } + else + { + stream->streamRepresentation.streamInfo.outputLatency = 0.0; + } + + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + stream->sampleRate = sampleRate; + stream->outDeviceSampleRate = 0; + if( stream->outputUnit ) { + Float64 rate; + UInt32 size = sizeof( rate ); + result = ERR( AudioDeviceGetProperty( stream->outputDevice, + 0, + FALSE, + kAudioDevicePropertyNominalSampleRate, + &size, &rate ) ); + if( result ) + goto error; + stream->outDeviceSampleRate = rate; + } + stream->inDeviceSampleRate = 0; + if( stream->inputUnit ) { + Float64 rate; + UInt32 size = sizeof( rate ); + result = ERR( AudioDeviceGetProperty( stream->inputDevice, + 0, + TRUE, + kAudioDevicePropertyNominalSampleRate, + &size, &rate ) ); + if( result ) + goto error; + stream->inDeviceSampleRate = rate; + } + stream->userInChan = inputChannelCount; + stream->userOutChan = outputChannelCount; + + // Setup property listeners for timestamp and latency calculations. + pthread_mutex_init( &stream->timingInformationMutex, NULL ); + stream->timingInformationMutexIsInitialized = 1; + InitializeDeviceProperties( &stream->inputProperties ); + InitializeDeviceProperties( &stream->outputProperties ); + if( stream->outputUnit ) + { + Boolean isInput = FALSE; + SetupDevicePropertyListeners( stream, stream->outputDevice, isInput ); + } + if( stream->inputUnit ) + { + Boolean isInput = TRUE; + SetupDevicePropertyListeners( stream, stream->inputDevice, isInput ); + } + UpdateTimeStampOffsets( stream ); + // Setup copies to be used by audio callback. + stream->timestampOffsetCombined_ioProcCopy = stream->timestampOffsetCombined; + stream->timestampOffsetInputDevice_ioProcCopy = stream->timestampOffsetInputDevice; + stream->timestampOffsetOutputDevice_ioProcCopy = stream->timestampOffsetOutputDevice; + + stream->state = STOPPED; + stream->xrunFlags = 0; + + *s = (PaStream*)stream; + + return result; + +error: + CloseStream( stream ); + return result; +} + + +#define HOST_TIME_TO_PA_TIME( x ) ( AudioConvertHostTimeToNanos( (x) ) * 1.0E-09) /* convert to nanoseconds and then to seconds */ + +PaTime GetStreamTime( PaStream *s ) +{ + return HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); +} + +#define RING_BUFFER_EMPTY (1000) + +static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, + UInt32*ioDataSize, + void** outData, + void*inUserData ) +{ + void *dummyData; + ring_buffer_size_t dummySize; + PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; + + VVDBUG(("ringBufferIOProc()\n")); + + if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { + *outData = NULL; + *ioDataSize = 0; + return RING_BUFFER_EMPTY; + } + assert(sizeof(UInt32) == sizeof(ring_buffer_size_t)); + assert( ( (*ioDataSize) / rb->elementSizeBytes ) * rb->elementSizeBytes == (*ioDataSize) ) ; + (*ioDataSize) /= rb->elementSizeBytes ; + PaUtil_GetRingBufferReadRegions( rb, *ioDataSize, + outData, (ring_buffer_size_t *)ioDataSize, + &dummyData, &dummySize ); + assert( *ioDataSize ); + PaUtil_AdvanceRingBufferReadIndex( rb, *ioDataSize ); + (*ioDataSize) *= rb->elementSizeBytes ; + + return noErr; +} + +/* + * Called by the AudioUnit API to process audio from the sound card. + * This is where the magic happens. + */ +/* FEEDBACK: there is a lot of redundant code here because of how all the cases differ. This makes it hard to maintain, so if there are suggestinos for cleaning it up, I'm all ears. */ +static OSStatus AudioIOProc( void *inRefCon, + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData ) +{ + unsigned long framesProcessed = 0; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; + PaMacCoreStream *stream = (PaMacCoreStream*)inRefCon; + const bool isRender = inBusNumber == OUTPUT_ELEMENT; + int callbackResult = paContinue ; + double hostTimeStampInPaTime = HOST_TIME_TO_PA_TIME(inTimeStamp->mHostTime); + + VVDBUG(("AudioIOProc()\n")); + + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + /* -----------------------------------------------------------------*\ + This output may be useful for debugging, + But printing durring the callback is a bad enough idea that + this is not enabled by enableing the usual debugging calls. + \* -----------------------------------------------------------------*/ + /* + static int renderCount = 0; + static int inputCount = 0; + printf( "------------------- starting reder/input\n" ); + if( isRender ) + printf("Render callback (%d):\t", ++renderCount); + else + printf("Input callback (%d):\t", ++inputCount); + printf( "Call totals: %d (input), %d (render)\n", inputCount, renderCount ); + + printf( "--- inBusNumber: %lu\n", inBusNumber ); + printf( "--- inNumberFrames: %lu\n", inNumberFrames ); + printf( "--- %x ioData\n", (unsigned) ioData ); + if( ioData ) + { + int i=0; + printf( "--- ioData.mNumBuffers %lu: \n", ioData->mNumberBuffers ); + for( i=0; imNumberBuffers; ++i ) + printf( "--- ioData buffer %d size: %lu.\n", i, ioData->mBuffers[i].mDataByteSize ); + } + ----------------------------------------------------------------- */ + + /* compute PaStreamCallbackTimeInfo */ + + if( pthread_mutex_trylock( &stream->timingInformationMutex ) == 0 ){ + /* snapshot the ioproc copy of timing information */ + stream->timestampOffsetCombined_ioProcCopy = stream->timestampOffsetCombined; + stream->timestampOffsetInputDevice_ioProcCopy = stream->timestampOffsetInputDevice; + stream->timestampOffsetOutputDevice_ioProcCopy = stream->timestampOffsetOutputDevice; + pthread_mutex_unlock( &stream->timingInformationMutex ); + } + + /* For timeInfo.currentTime we could calculate current time backwards from the HAL audio + output time to give a more accurate impression of the current timeslice but it doesn't + seem worth it at the moment since other PA host APIs don't do any better. + */ + timeInfo.currentTime = HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); + + /* + For an input HAL AU, inTimeStamp is the time the samples are received from the hardware, + for an output HAL AU inTimeStamp is the time the samples are sent to the hardware. + PA expresses timestamps in terms of when the samples enter the ADC or leave the DAC + so we add or subtract kAudioDevicePropertyLatency below. + */ + + /* FIXME: not sure what to do below if the host timestamps aren't valid (kAudioTimeStampHostTimeValid isn't set) + Could ask on CA mailing list if it is possible for it not to be set. If so, could probably grab a now timestamp + at the top and compute from there (modulo scheduling jitter) or ask on mailing list for other options. */ + + if( isRender ) + { + if( stream->inputUnit ) /* full duplex */ + { + if( stream->inputUnit == stream->outputUnit ) /* full duplex AUHAL IOProc */ + { + // Ross and Phil agreed that the following calculation is correct based on an email from Jeff Moore: + // http://osdir.com/ml/coreaudio-api/2009-07/msg00140.html + // Basically the difference between the Apple output timestamp and the PA timestamp is kAudioDevicePropertyLatency. + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - + (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; + } + else /* full duplex with ring-buffer from a separate input AUHAL ioproc */ + { + /* FIXME: take the ring buffer latency into account */ + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - + (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; + } + } + else /* output only */ + { + timeInfo.inputBufferAdcTime = 0; + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; + } + } + else /* input only */ + { + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - stream->timestampOffsetInputDevice_ioProcCopy; + timeInfo.outputBufferDacTime = 0; + } + + //printf( "---%g, %g, %g\n", timeInfo.inputBufferAdcTime, timeInfo.currentTime, timeInfo.outputBufferDacTime ); + + if( isRender && stream->inputUnit == stream->outputUnit + && !stream->inputSRConverter ) + { + /* --------- Full Duplex, One Device, no SR Conversion ------- + * + * This is the lowest latency case, and also the simplest. + * Input data and output data are available at the same time. + * we do not use the input SR converter or the input ring buffer. + * + */ + OSStatus err = 0; + unsigned long frames; + + /* -- start processing -- */ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; //FIXME: this flag also gets set outside by a callback, which calls the xrunCallback function. It should be in the same thread as the main audio callback, but the apple docs just use the word "usually" so it may be possible to loose an xrun notification, if that callback happens here. + + /* -- compute frames. do some checks -- */ + assert( ioData->mNumberBuffers == 1 ); + assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); + frames = ioData->mBuffers[0].mDataByteSize; + frames /= sizeof( float ) * ioData->mBuffers[0].mNumberChannels; + /* -- copy and process input data -- */ + err= AudioUnitRender(stream->inputUnit, + ioActionFlags, + inTimeStamp, + INPUT_ELEMENT, + inNumberFrames, + &stream->inputAudioBufferList ); + /* FEEDBACK: I'm not sure what to do when this call fails. There's nothing in the PA API to + * do about failures in the callback system. */ + assert( !err ); + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + stream->inputAudioBufferList.mBuffers[0].mData, + stream->inputAudioBufferList.mBuffers[0].mNumberChannels); + /* -- Copy and process output data -- */ + PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), + 0, + ioData->mBuffers[0].mData, + ioData->mBuffers[0].mNumberChannels); + /* -- complete processing -- */ + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + else if( isRender ) + { + /* -------- Output Side of Full Duplex (Separate Devices or SR Conversion) + * -- OR Simplex Output + * + * This case handles output data as in the full duplex case, + * and, if there is input data, reads it off the ring buffer + * and into the PA buffer processor. If sample rate conversion + * is required on input, that is done here as well. + */ + unsigned long frames; + + /* Sometimes, when stopping a duplex stream we get erroneous + xrun flags, so if this is our last run, clear the flags. */ + int xrunFlags = stream->xrunFlags; +/* + if( xrunFlags & paInputUnderflow ) + printf( "input underflow.\n" ); + if( xrunFlags & paInputOverflow ) + printf( "input overflow.\n" ); +*/ + if( stream->state == STOPPING || stream->state == CALLBACK_STOPPED ) + xrunFlags = 0; + + /* -- start processing -- */ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + xrunFlags ); + stream->xrunFlags = 0; /* FEEDBACK: we only send flags to Buf Proc once */ + + /* -- Copy and process output data -- */ + assert( ioData->mNumberBuffers == 1 ); + frames = ioData->mBuffers[0].mDataByteSize; + frames /= sizeof( float ) * ioData->mBuffers[0].mNumberChannels; + assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); + PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), + 0, + ioData->mBuffers[0].mData, + ioData->mBuffers[0].mNumberChannels); + + /* -- copy and process input data, and complete processing -- */ + if( stream->inputUnit ) { + const int flsz = sizeof( float ); + /* Here, we read the data out of the ring buffer, through the + audio converter. */ + int inChan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels; + if( stream->inputSRConverter ) + { + OSStatus err; + UInt32 size; + float data[ inChan * frames ]; + size = sizeof( data ); + err = AudioConverterFillBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &size, + (void *)&data ); + if( err == RING_BUFFER_EMPTY ) + { /*the ring buffer callback underflowed */ + err = 0; + bzero( ((char *)data) + size, sizeof(data)-size ); + stream->xrunFlags |= paInputUnderflow; + } + ERR( err ); + assert( !err ); + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + else + { + /* Without the AudioConverter is actually a bit more complex + because we have to do a little buffer processing that the + AudioConverter would otherwise handle for us. */ + void *data1, *data2; + ring_buffer_size_t size1, size2; + PaUtil_GetRingBufferReadRegions( &stream->inputRingBuffer, + frames, + &data1, &size1, + &data2, &size2 ); + if( size1 == frames ) { + /* simplest case: all in first buffer */ + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data1, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1 ); + } else if( size1 + size2 < frames ) { + /*we underflowed. take what data we can, zero the rest.*/ + unsigned char data[frames*inChan*flsz]; + if( size1 ) + memcpy( data, data1, size1 ); + if( size2 ) + memcpy( data+size1, data2, size2 ); + bzero( data+size1+size2, frames*flsz*inChan - size1 - size2 ); + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex( &stream->inputRingBuffer, + size1+size2 ); + /* flag underflow */ + stream->xrunFlags |= paInputUnderflow; + } else { + /*we got all the data, but split between buffers*/ + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), size1 ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data1, + inChan ); + PaUtil_Set2ndInputFrameCount( &(stream->bufferProcessor), size2 ); + PaUtil_Set2ndInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data2, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1+size2 ); + } + } + } else { + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + + } + else + { + /* ------------------ Input + * + * First, we read off the audio data and put it in the ring buffer. + * if this is an input-only stream, we need to process it more, + * otherwise, we let the output case deal with it. + */ + OSStatus err = 0; + int chan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels ; + /* FIXME: looping here may not actually be necessary, but it was something I tried in testing. */ + do { + err= AudioUnitRender(stream->inputUnit, + ioActionFlags, + inTimeStamp, + INPUT_ELEMENT, + inNumberFrames, + &stream->inputAudioBufferList ); + if( err == -10874 ) + inNumberFrames /= 2; + } while( err == -10874 && inNumberFrames > 1 ); + /* FEEDBACK: I'm not sure what to do when this call fails */ + ERR( err ); + assert( !err ); + if( stream->inputSRConverter || stream->outputUnit ) + { + /* If this is duplex or we use a converter, put the data + into the ring buffer. */ + long bytesIn, bytesOut; + bytesIn = sizeof( float ) * inNumberFrames * chan; + bytesOut = PaUtil_WriteRingBuffer( &stream->inputRingBuffer, + stream->inputAudioBufferList.mBuffers[0].mData, + inNumberFrames ); + if( bytesIn != bytesOut ) + stream->xrunFlags |= paInputOverflow ; + } + else + { + /* for simplex input w/o SR conversion, + just pop the data into the buffer processor.*/ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), inNumberFrames); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + stream->inputAudioBufferList.mBuffers[0].mData, + chan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + if( !stream->outputUnit && stream->inputSRConverter ) + { + /* ------------------ Simplex Input w/ SR Conversion + * + * if this is a simplex input stream, we need to read off the buffer, + * do our sample rate conversion and pass the results to the buffer + * processor. + * The logic here is complicated somewhat by the fact that we don't + * know how much data is available, so we loop on reasonably sized + * chunks, and let the BufferProcessor deal with the rest. + * + */ + /*This might be too big or small depending on SR conversion*/ + float data[ chan * inNumberFrames ]; + OSStatus err; + do + { /*Run the buffer processor until we are out of data*/ + UInt32 size; + long f; + + size = sizeof( data ); + err = AudioConverterFillBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &size, + (void *)data ); + if( err != RING_BUFFER_EMPTY ) + ERR( err ); + assert( err == 0 || err == RING_BUFFER_EMPTY ); + + f = size / ( chan * sizeof(float) ); + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), f ); + if( f ) + { + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; + + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + chan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + } while( callbackResult == paContinue && !err ); + } + } + + switch( callbackResult ) + { + case paContinue: break; + case paComplete: + case paAbort: + stream->state = CALLBACK_STOPPED ; + if( stream->outputUnit ) + AudioOutputUnitStop(stream->outputUnit); + if( stream->inputUnit ) + AudioOutputUnitStop(stream->inputUnit); + break; + } + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + return noErr; +} + + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + /* This may be called from a failed OpenStream. + Therefore, each piece of info is treated seperately. */ + PaError result = paNoError; + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + VVDBUG(("CloseStream()\n")); + VDBUG( ( "Closing stream.\n" ) ); + + if( stream ) { + + if( stream->outputUnit ) + { + Boolean isInput = FALSE; + CleanupDevicePropertyListeners( stream, stream->outputDevice, isInput ); + } + + if( stream->inputUnit ) + { + Boolean isInput = TRUE; + CleanupDevicePropertyListeners( stream, stream->inputDevice, isInput ); + } + + if( stream->outputUnit ) { + int count = removeFromXRunListenerList( stream ); + if( count == 0 ) + AudioDeviceRemovePropertyListener( stream->outputDevice, + 0, + false, + kAudioDeviceProcessorOverload, + xrunCallback ); + } + if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { + int count = removeFromXRunListenerList( stream ); + if( count == 0 ) + AudioDeviceRemovePropertyListener( stream->inputDevice, + 0, + true, + kAudioDeviceProcessorOverload, + xrunCallback ); + } + if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { + AudioUnitUninitialize( stream->outputUnit ); + CloseComponent( stream->outputUnit ); + } + stream->outputUnit = NULL; + if( stream->inputUnit ) + { + AudioUnitUninitialize( stream->inputUnit ); + CloseComponent( stream->inputUnit ); + stream->inputUnit = NULL; + } + if( stream->inputRingBuffer.buffer ) + free( (void *) stream->inputRingBuffer.buffer ); + stream->inputRingBuffer.buffer = NULL; + /*TODO: is there more that needs to be done on error + from AudioConverterDispose?*/ + if( stream->inputSRConverter ) + ERR( AudioConverterDispose( stream->inputSRConverter ) ); + stream->inputSRConverter = NULL; + if( stream->inputAudioBufferList.mBuffers[0].mData ) + free( stream->inputAudioBufferList.mBuffers[0].mData ); + stream->inputAudioBufferList.mBuffers[0].mData = NULL; + + result = destroyBlioRingBuffers( &stream->blio ); + if( result ) + return result; + if( stream->bufferProcessorIsInitialized ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( stream->timingInformationMutexIsInitialized ) + pthread_mutex_destroy( &stream->timingInformationMutex ); + + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_FreeMemory( stream ); + } + + return result; +} + +static PaError StartStream( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + OSStatus result = noErr; + VVDBUG(("StartStream()\n")); + VDBUG( ( "Starting stream.\n" ) ); + +#define ERR_WRAP(mac_err) do { result = mac_err ; if ( result != noErr ) return ERR(result) ; } while(0) + + /*FIXME: maybe want to do this on close/abort for faster start? */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + if( stream->inputSRConverter ) + ERR_WRAP( AudioConverterReset( stream->inputSRConverter ) ); + + /* -- start -- */ + stream->state = ACTIVE; + if( stream->inputUnit ) { + ERR_WRAP( AudioOutputUnitStart(stream->inputUnit) ); + } + if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { + ERR_WRAP( AudioOutputUnitStart(stream->outputUnit) ); + } + + return paNoError; +#undef ERR_WRAP +} + +// it's not clear from appl's docs that this really waits +// until all data is flushed. +static ComponentResult BlockWhileAudioUnitIsRunning( AudioUnit audioUnit, AudioUnitElement element ) +{ + Boolean isRunning = 1; + while( isRunning ) { + UInt32 s = sizeof( isRunning ); + ComponentResult err = AudioUnitGetProperty( audioUnit, kAudioOutputUnitProperty_IsRunning, kAudioUnitScope_Global, element, &isRunning, &s ); + if( err ) + return err; + Pa_Sleep( 100 ); + } + return noErr; +} + +static PaError StopStream( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + OSStatus result = noErr; + PaError paErr; + VVDBUG(("StopStream()\n")); + + VDBUG( ("Waiting for BLIO.\n") ); + waitUntilBlioWriteBufferIsFlushed( &stream->blio ); + VDBUG( ( "Stopping stream.\n" ) ); + + stream->state = STOPPING; + +#define ERR_WRAP(mac_err) do { result = mac_err ; if ( result != noErr ) return ERR(result) ; } while(0) + /* -- stop and reset -- */ + if( stream->inputUnit == stream->outputUnit && stream->inputUnit ) + { + ERR_WRAP( AudioOutputUnitStop(stream->inputUnit) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,0) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); + ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 1) ); + ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 0) ); + } + else + { + if( stream->inputUnit ) + { + ERR_WRAP(AudioOutputUnitStop(stream->inputUnit) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); + ERR_WRAP(AudioUnitReset(stream->inputUnit,kAudioUnitScope_Global,1)); + } + if( stream->outputUnit ) + { + ERR_WRAP(AudioOutputUnitStop(stream->outputUnit)); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->outputUnit,0) ); + ERR_WRAP(AudioUnitReset(stream->outputUnit,kAudioUnitScope_Global,0)); + } + } + if( stream->inputRingBuffer.buffer ) { + PaUtil_FlushRingBuffer( &stream->inputRingBuffer ); + bzero( (void *)stream->inputRingBuffer.buffer, + stream->inputRingBuffer.bufferSize ); + /* advance the write point a little, so we are reading from the + middle of the buffer. We'll need extra at the end because + testing has shown that this helps. */ + if( stream->outputUnit ) + PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, + stream->inputRingBuffer.bufferSize + / RING_BUFFER_ADVANCE_DENOMINATOR ); + } + + stream->xrunFlags = 0; + stream->state = STOPPED; + + paErr = resetBlioRingBuffers( &stream->blio ); + if( paErr ) + return paErr; + + VDBUG( ( "Stream Stopped.\n" ) ); + return paNoError; +#undef ERR_WRAP +} + +static PaError AbortStream( PaStream *s ) +{ + VVDBUG(("AbortStream()->StopStream()\n")); + VDBUG( ( "Aborting stream.\n" ) ); + /* We have nothing faster than StopStream. */ + return StopStream(s); +} + + +static PaError IsStreamStopped( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + VVDBUG(("IsStreamStopped()\n")); + + return stream->state == STOPPED ? 1 : 0; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + VVDBUG(("IsStreamActive()\n")); + return ( stream->state == ACTIVE || stream->state == STOPPING ); +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + VVDBUG(("GetStreamCpuLoad()\n")); + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c new file mode 100644 index 0000000000..b514f64119 --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c @@ -0,0 +1,592 @@ +/* + * Implementation of the PortAudio API for Apple AUHAL + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src + + This file contains the implementation + required for blocking I/O. It is separated from pa_mac_core.c simply to ease + development. +*/ + +#include "pa_mac_core_blocking.h" +#include "pa_mac_core_internal.h" +#include +#ifdef MOSX_USE_NON_ATOMIC_FLAG_BITS +# define OSAtomicOr32( a, b ) ( (*(b)) |= (a) ) +# define OSAtomicAnd32( a, b ) ( (*(b)) &= (a) ) +#else +# include +#endif + +/* + * This function determines the size of a particular sample format. + * if the format is not recognized, this returns zero. + */ +static size_t computeSampleSizeFromFormat( PaSampleFormat format ) +{ + switch( format & (~paNonInterleaved) ) { + case paFloat32: return 4; + case paInt32: return 4; + case paInt24: return 3; + case paInt16: return 2; + case paInt8: case paUInt8: return 1; + default: return 0; + } +} +/* + * Same as computeSampleSizeFromFormat, except that if + * the size is not a power of two, it returns the next power of two up + */ +static size_t computeSampleSizeFromFormatPow2( PaSampleFormat format ) +{ + switch( format & (~paNonInterleaved) ) { + case paFloat32: return 4; + case paInt32: return 4; + case paInt24: return 4; + case paInt16: return 2; + case paInt8: case paUInt8: return 1; + default: return 0; + } +} + + + +/* + * Functions for initializing, resetting, and destroying BLIO structures. + * + */ + +/* This should be called with the relevant info when initializing a stream for + callback. */ +PaError initializeBlioRingBuffers( + PaMacBlio *blio, + PaSampleFormat inputSampleFormat, + PaSampleFormat outputSampleFormat, + size_t framesPerBuffer, + long ringBufferSize, + int inChan, + int outChan ) +{ + void *data; + int result; + OSStatus err; + + /* zeroify things */ + bzero( blio, sizeof( PaMacBlio ) ); + /* this is redundant, but the buffers are used to check + if the bufffers have been initialized, so we do it explicitly. */ + blio->inputRingBuffer.buffer = NULL; + blio->outputRingBuffer.buffer = NULL; + + /* initialize simple data */ + blio->ringBufferFrames = ringBufferSize; + blio->inputSampleFormat = inputSampleFormat; + blio->inputSampleSizeActual = computeSampleSizeFromFormat(inputSampleFormat); + blio->inputSampleSizePow2 = computeSampleSizeFromFormatPow2(inputSampleFormat); + blio->outputSampleFormat = outputSampleFormat; + blio->outputSampleSizeActual = computeSampleSizeFromFormat(outputSampleFormat); + blio->outputSampleSizePow2 = computeSampleSizeFromFormatPow2(outputSampleFormat); + + blio->framesPerBuffer = framesPerBuffer; + blio->inChan = inChan; + blio->outChan = outChan; + blio->statusFlags = 0; + blio->errors = paNoError; +#ifdef PA_MAC_BLIO_MUTEX + blio->isInputEmpty = false; + blio->isOutputFull = false; +#endif + + /* setup ring buffers */ +#ifdef PA_MAC_BLIO_MUTEX + result = PaMacCore_SetUnixError( pthread_mutex_init(&(blio->inputMutex),NULL), 0 ); + if( result ) + goto error; + result = UNIX_ERR( pthread_cond_init( &(blio->inputCond), NULL ) ); + if( result ) + goto error; + result = UNIX_ERR( pthread_mutex_init(&(blio->outputMutex),NULL) ); + if( result ) + goto error; + result = UNIX_ERR( pthread_cond_init( &(blio->outputCond), NULL ) ); +#endif + if( inChan ) { + data = calloc( ringBufferSize, blio->inputSampleSizePow2*inChan ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } + + err = PaUtil_InitializeRingBuffer( + &blio->inputRingBuffer, + 1, ringBufferSize*blio->inputSampleSizePow2*inChan, + data ); + assert( !err ); + } + if( outChan ) { + data = calloc( ringBufferSize, blio->outputSampleSizePow2*outChan ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } + + err = PaUtil_InitializeRingBuffer( + &blio->outputRingBuffer, + 1, ringBufferSize*blio->outputSampleSizePow2*outChan, + data ); + assert( !err ); + } + + result = resetBlioRingBuffers( blio ); + if( result ) + goto error; + + return 0; + + error: + destroyBlioRingBuffers( blio ); + return result; +} + +#ifdef PA_MAC_BLIO_MUTEX +PaError blioSetIsInputEmpty( PaMacBlio *blio, bool isEmpty ) +{ + PaError result = paNoError; + if( isEmpty == blio->isInputEmpty ) + goto done; + + /* we need to update the value. Here's what we do: + * - Lock the mutex, so noone else can write. + * - update the value. + * - unlock. + * - broadcast to all listeners. + */ + result = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); + if( result ) + goto done; + blio->isInputEmpty = isEmpty; + result = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); + if( result ) + goto done; + result = UNIX_ERR( pthread_cond_broadcast( &blio->inputCond ) ); + if( result ) + goto done; + + done: + return result; +} +PaError blioSetIsOutputFull( PaMacBlio *blio, bool isFull ) +{ + PaError result = paNoError; + if( isFull == blio->isOutputFull ) + goto done; + + /* we need to update the value. Here's what we do: + * - Lock the mutex, so noone else can write. + * - update the value. + * - unlock. + * - broadcast to all listeners. + */ + result = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); + if( result ) + goto done; + blio->isOutputFull = isFull; + result = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); + if( result ) + goto done; + result = UNIX_ERR( pthread_cond_broadcast( &blio->outputCond ) ); + if( result ) + goto done; + + done: + return result; +} +#endif + +/* This should be called after stopping or aborting the stream, so that on next + start, the buffers will be ready. */ +PaError resetBlioRingBuffers( PaMacBlio *blio ) +{ +#ifdef PA_MAC__BLIO_MUTEX + int result; +#endif + blio->statusFlags = 0; + if( blio->outputRingBuffer.buffer ) { + PaUtil_FlushRingBuffer( &blio->outputRingBuffer ); + bzero( blio->outputRingBuffer.buffer, + blio->outputRingBuffer.bufferSize ); + /* Advance buffer */ + PaUtil_AdvanceRingBufferWriteIndex( &blio->outputRingBuffer, blio->ringBufferFrames*blio->outputSampleSizeActual*blio->outChan ); + //PaUtil_AdvanceRingBufferWriteIndex( &blio->outputRingBuffer, blio->outputRingBuffer.bufferSize ); + + /* Update isOutputFull. */ +#ifdef PA_MAC__BLIO_MUTEX + result = blioSetIsOutputFull( blio, toAdvance == blio->outputRingBuffer.bufferSize ); + if( result ) + goto error; +#endif +/* + printf( "------%d\n" , blio->framesPerBuffer ); + printf( "------%d\n" , blio->outChan ); + printf( "------%d\n" , blio->outputSampleSize ); + printf( "------%d\n" , blio->framesPerBuffer*blio->outChan*blio->outputSampleSize ); +*/ + } + if( blio->inputRingBuffer.buffer ) { + PaUtil_FlushRingBuffer( &blio->inputRingBuffer ); + bzero( blio->inputRingBuffer.buffer, + blio->inputRingBuffer.bufferSize ); + /* Update isInputEmpty. */ +#ifdef PA_MAC__BLIO_MUTEX + result = blioSetIsInputEmpty( blio, true ); + if( result ) + goto error; +#endif + } + return paNoError; +#ifdef PA_MAC__BLIO_MUTEX + error: + return result; +#endif +} + +/*This should be called when you are done with the blio. It can safely be called + multiple times if there are no exceptions. */ +PaError destroyBlioRingBuffers( PaMacBlio *blio ) +{ + PaError result = paNoError; + if( blio->inputRingBuffer.buffer ) { + free( blio->inputRingBuffer.buffer ); +#ifdef PA_MAC__BLIO_MUTEX + result = UNIX_ERR( pthread_mutex_destroy( & blio->inputMutex ) ); + if( result ) return result; + result = UNIX_ERR( pthread_cond_destroy( & blio->inputCond ) ); + if( result ) return result; +#endif + } + blio->inputRingBuffer.buffer = NULL; + if( blio->outputRingBuffer.buffer ) { + free( blio->outputRingBuffer.buffer ); +#ifdef PA_MAC__BLIO_MUTEX + result = UNIX_ERR( pthread_mutex_destroy( & blio->outputMutex ) ); + if( result ) return result; + result = UNIX_ERR( pthread_cond_destroy( & blio->outputCond ) ); + if( result ) return result; +#endif + } + blio->outputRingBuffer.buffer = NULL; + + return result; +} + +/* + * this is the BlioCallback function. It expects to recieve a PaMacBlio Object + * pointer as userData. + * + */ +int BlioCallback( const void *input, void *output, unsigned long frameCount, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) +{ + PaMacBlio *blio = (PaMacBlio*)userData; + long avail; + long toRead; + long toWrite; + long read; + long written; + + /* set flags returned by OS: */ + OSAtomicOr32( statusFlags, &blio->statusFlags ) ; + + /* --- Handle Input Buffer --- */ + if( blio->inChan ) { + avail = PaUtil_GetRingBufferWriteAvailable( &blio->inputRingBuffer ); + + /* check for underflow */ + if( avail < frameCount * blio->inputSampleSizeActual * blio->inChan ) + OSAtomicOr32( paInputOverflow, &blio->statusFlags ); + + toRead = MIN( avail, frameCount * blio->inputSampleSizeActual * blio->inChan ); + + /* copy the data */ + /*printf( "reading %d\n", toRead );*/ + read = PaUtil_WriteRingBuffer( &blio->inputRingBuffer, input, toRead ); + assert( toRead == read ); +#ifdef PA_MAC__BLIO_MUTEX + /* Priority inversion. See notes below. */ + blioSetIsInputEmpty( blio, false ); +#endif + } + + + /* --- Handle Output Buffer --- */ + if( blio->outChan ) { + avail = PaUtil_GetRingBufferReadAvailable( &blio->outputRingBuffer ); + + /* check for underflow */ + if( avail < frameCount * blio->outputSampleSizeActual * blio->outChan ) + OSAtomicOr32( paOutputUnderflow, &blio->statusFlags ); + + toWrite = MIN( avail, frameCount * blio->outputSampleSizeActual * blio->outChan ); + + if( toWrite != frameCount * blio->outputSampleSizeActual * blio->outChan ) + bzero( ((char *)output)+toWrite, + frameCount * blio->outputSampleSizeActual * blio->outChan - toWrite ); + /* copy the data */ + /*printf( "writing %d\n", toWrite );*/ + written = PaUtil_ReadRingBuffer( &blio->outputRingBuffer, output, toWrite ); + assert( toWrite == written ); +#ifdef PA_MAC__BLIO_MUTEX + /* We have a priority inversion here. However, we will only have to + wait if this was true and is now false, which means we've got + some room in the buffer. + Hopefully problems will be minimized. */ + blioSetIsOutputFull( blio, false ); +#endif + } + + return paContinue; +} + +PaError ReadStream( PaStream* stream, + void *buffer, + unsigned long frames ) +{ + PaMacBlio *blio = & ((PaMacCoreStream*)stream) -> blio; + char *cbuf = (char *) buffer; + PaError ret = paNoError; + VVDBUG(("ReadStream()\n")); + + while( frames > 0 ) { + long avail; + long toRead; + do { + avail = PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ); +/* + printf( "Read Buffer is %%%g full: %ld of %ld.\n", + 100 * (float)avail / (float) blio->inputRingBuffer.bufferSize, + avail, blio->inputRingBuffer.bufferSize ); +*/ + if( avail == 0 ) { +#ifdef PA_MAC_BLIO_MUTEX + /**block when empty*/ + ret = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); + if( ret ) + return ret; + while( blio->isInputEmpty ) { + ret = UNIX_ERR( pthread_cond_wait( &blio->inputCond, &blio->inputMutex ) ); + if( ret ) + return ret; + } + ret = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); + if( ret ) + return ret; +#else + Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); +#endif + } + } while( avail == 0 ); + toRead = MIN( avail, frames * blio->inputSampleSizeActual * blio->inChan ); + toRead -= toRead % blio->inputSampleSizeActual * blio->inChan ; + PaUtil_ReadRingBuffer( &blio->inputRingBuffer, (void *)cbuf, toRead ); + cbuf += toRead; + frames -= toRead / ( blio->inputSampleSizeActual * blio->inChan ); + + if( toRead == avail ) { +#ifdef PA_MAC_BLIO_MUTEX + /* we just emptied the buffer, so we need to mark it as empty. */ + ret = blioSetIsInputEmpty( blio, true ); + if( ret ) + return ret; + /* of course, in the meantime, the callback may have put some sats + in, so + so check for that, too, to avoid a race condition. */ + if( PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ) ) { + blioSetIsInputEmpty( blio, false ); + if( ret ) + return ret; + } +#endif + } + } + + /* Report either paNoError or paInputOverflowed. */ + /* may also want to report other errors, but this is non-standard. */ + ret = blio->statusFlags & paInputOverflow; + + /* report underflow only once: */ + if( ret ) { + OSAtomicAnd32( (uint32_t)(~paInputOverflow), &blio->statusFlags ); + ret = paInputOverflowed; + } + + return ret; +} + + +PaError WriteStream( PaStream* stream, + const void *buffer, + unsigned long frames ) +{ + PaMacBlio *blio = & ((PaMacCoreStream*)stream) -> blio; + char *cbuf = (char *) buffer; + PaError ret = paNoError; + VVDBUG(("WriteStream()\n")); + + while( frames > 0 ) { + long avail = 0; + long toWrite; + + do { + avail = PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); +/* + printf( "Write Buffer is %%%g full: %ld of %ld.\n", + 100 - 100 * (float)avail / (float) blio->outputRingBuffer.bufferSize, + avail, blio->outputRingBuffer.bufferSize ); +*/ + if( avail == 0 ) { +#ifdef PA_MAC_BLIO_MUTEX + /*block while full*/ + ret = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); + if( ret ) + return ret; + while( blio->isOutputFull ) { + ret = UNIX_ERR( pthread_cond_wait( &blio->outputCond, &blio->outputMutex ) ); + if( ret ) + return ret; + } + ret = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); + if( ret ) + return ret; +#else + Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); +#endif + } + } while( avail == 0 ); + + toWrite = MIN( avail, frames * blio->outputSampleSizeActual * blio->outChan ); + toWrite -= toWrite % blio->outputSampleSizeActual * blio->outChan ; + PaUtil_WriteRingBuffer( &blio->outputRingBuffer, (void *)cbuf, toWrite ); + cbuf += toWrite; + frames -= toWrite / ( blio->outputSampleSizeActual * blio->outChan ); + +#ifdef PA_MAC_BLIO_MUTEX + if( toWrite == avail ) { + /* we just filled up the buffer, so we need to mark it as filled. */ + ret = blioSetIsOutputFull( blio, true ); + if( ret ) + return ret; + /* of course, in the meantime, we may have emptied the buffer, so + so check for that, too, to avoid a race condition. */ + if( PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ) ) { + blioSetIsOutputFull( blio, false ); + if( ret ) + return ret; + } + } +#endif + } + + /* Report either paNoError or paOutputUnderflowed. */ + /* may also want to report other errors, but this is non-standard. */ + ret = blio->statusFlags & paOutputUnderflow; + + /* report underflow only once: */ + if( ret ) { + OSAtomicAnd32( (uint32_t)(~paOutputUnderflow), &blio->statusFlags ); + ret = paOutputUnderflowed; + } + + return ret; +} + +/* + * + */ +void waitUntilBlioWriteBufferIsFlushed( PaMacBlio *blio ) +{ + if( blio->outputRingBuffer.buffer ) { + long avail = PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); + while( avail != blio->outputRingBuffer.bufferSize ) { + if( avail == 0 ) + Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); + avail = PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); + } + } +} + + +signed long GetStreamReadAvailable( PaStream* stream ) +{ + PaMacBlio *blio = & ((PaMacCoreStream*)stream) -> blio; + VVDBUG(("GetStreamReadAvailable()\n")); + + return PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ) + / ( blio->inputSampleSizeActual * blio->inChan ); +} + + +signed long GetStreamWriteAvailable( PaStream* stream ) +{ + PaMacBlio *blio = & ((PaMacCoreStream*)stream) -> blio; + VVDBUG(("GetStreamWriteAvailable()\n")); + + return PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ) + / ( blio->outputSampleSizeActual * blio->outChan ); +} + diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.h b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.h new file mode 100644 index 0000000000..a6f0ad5dc1 --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.h @@ -0,0 +1,136 @@ +/* + * Internal blocking interfaces for PortAudio Apple AUHAL implementation + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#ifndef PA_MAC_CORE_BLOCKING_H_ +#define PA_MAC_CORE_BLOCKING_H_ + +#include "pa_ringbuffer.h" +#include "portaudio.h" +#include "pa_mac_core_utilities.h" + +/* + * Number of miliseconds to busy wait whil waiting for data in blocking calls. + */ +#define PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL (5) +/* + * Define exactly one of these blocking methods + * PA_MAC_BLIO_MUTEX is not actively maintained. + */ +#define PA_MAC_BLIO_BUSY_WAIT +/* +#define PA_MAC_BLIO_MUTEX +*/ + +typedef struct { + PaUtilRingBuffer inputRingBuffer; + PaUtilRingBuffer outputRingBuffer; + size_t ringBufferFrames; + PaSampleFormat inputSampleFormat; + size_t inputSampleSizeActual; + size_t inputSampleSizePow2; + PaSampleFormat outputSampleFormat; + size_t outputSampleSizeActual; + size_t outputSampleSizePow2; + + size_t framesPerBuffer; + + int inChan; + int outChan; + + //PaStreamCallbackFlags statusFlags; + uint32_t statusFlags; + PaError errors; + + /* Here we handle blocking, using condition variables. */ +#ifdef PA_MAC_BLIO_MUTEX + volatile bool isInputEmpty; + pthread_mutex_t inputMutex; + pthread_cond_t inputCond; + + volatile bool isOutputFull; + pthread_mutex_t outputMutex; + pthread_cond_t outputCond; +#endif +} +PaMacBlio; + +/* + * These functions operate on condition and related variables. + */ + +PaError initializeBlioRingBuffers( + PaMacBlio *blio, + PaSampleFormat inputSampleFormat, + PaSampleFormat outputSampleFormat, + size_t framesPerBuffer, + long ringBufferSize, + int inChan, + int outChan ); +PaError destroyBlioRingBuffers( PaMacBlio *blio ); +PaError resetBlioRingBuffers( PaMacBlio *blio ); + +int BlioCallback( + const void *input, void *output, + unsigned long frameCount, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ); + +void waitUntilBlioWriteBufferIsFlushed( PaMacBlio *blio ); + +#endif /*PA_MAC_CORE_BLOCKING_H_*/ diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_internal.h b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_internal.h new file mode 100644 index 0000000000..462240bb4b --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_internal.h @@ -0,0 +1,194 @@ +/* + * Internal interfaces for PortAudio Apple AUHAL implementation + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file pa_mac_core + @ingroup hostapi_src + @author Bjorn Roche + @brief AUHAL implementation of PortAudio +*/ + +#ifndef PA_MAC_CORE_INTERNAL_H__ +#define PA_MAC_CORE_INTERNAL_H__ + +#include +#include +#include +#include + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_allocation.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_ringbuffer.h" + +#include "pa_mac_core_blocking.h" + +/* function prototypes */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RING_BUFFER_ADVANCE_DENOMINATOR (4) + +PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +signed long GetStreamReadAvailable( PaStream* stream ); +signed long GetStreamWriteAvailable( PaStream* stream ); +/* PaMacAUHAL - host api datastructure specific to this implementation */ +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ + long devCount; + AudioDeviceID *devIds; /*array of all audio devices*/ + AudioDeviceID defaultIn; + AudioDeviceID defaultOut; +} +PaMacAUHAL; + +typedef struct PaMacCoreDeviceProperties +{ + /* Values in Frames from property queries. */ + UInt32 safetyOffset; + UInt32 bufferFrameSize; + // UInt32 streamLatency; // Seems to be the same as deviceLatency!? + UInt32 deviceLatency; + /* Current device sample rate. May change! */ + Float64 sampleRate; + Float64 samplePeriod; // reciprocal +} +PaMacCoreDeviceProperties; + +/* stream data structure specifically for this implementation */ +typedef struct PaMacCoreStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + /* implementation specific data goes here */ + bool bufferProcessorIsInitialized; + AudioUnit inputUnit; + AudioUnit outputUnit; + AudioDeviceID inputDevice; + AudioDeviceID outputDevice; + size_t userInChan; + size_t userOutChan; + size_t inputFramesPerBuffer; + size_t outputFramesPerBuffer; + PaMacBlio blio; + /* We use this ring buffer when input and out devs are different. */ + PaUtilRingBuffer inputRingBuffer; + /* We may need to do SR conversion on input. */ + AudioConverterRef inputSRConverter; + /* We need to preallocate an inputBuffer for reading data. */ + AudioBufferList inputAudioBufferList; + AudioTimeStamp startTime; + /* FIXME: instead of volatile, these should be properly memory barriered */ + volatile uint32_t xrunFlags; /*PaStreamCallbackFlags*/ + volatile enum { + STOPPED = 0, /* playback is completely stopped, + and the user has called StopStream(). */ + CALLBACK_STOPPED = 1, /* callback has requested stop, + but user has not yet called StopStream(). */ + STOPPING = 2, /* The stream is in the process of closing + because the user has called StopStream. + This state is just used internally; + externally it is indistinguishable from + ACTIVE.*/ + ACTIVE = 3 /* The stream is active and running. */ + } state; + double sampleRate; + //these may be different from the stream sample rate due to SR conversion: + double outDeviceSampleRate; + double inDeviceSampleRate; + + PaMacCoreDeviceProperties inputProperties; + PaMacCoreDeviceProperties outputProperties; + + /* data updated by main thread and notifications, protected by timingInformationMutex */ + int timingInformationMutexIsInitialized; + pthread_mutex_t timingInformationMutex; + + /* These are written by the PA thread or from CoreAudio callbacks. Protected by the mutex. */ + Float64 timestampOffsetCombined; + Float64 timestampOffsetInputDevice; + Float64 timestampOffsetOutputDevice; + + /* Offsets in seconds to be applied to Apple timestamps to convert them to PA timestamps. + * While the io proc is active, the following values are only accessed and manipulated by the ioproc */ + Float64 timestampOffsetCombined_ioProcCopy; + Float64 timestampOffsetInputDevice_ioProcCopy; + Float64 timestampOffsetOutputDevice_ioProcCopy; + +} +PaMacCoreStream; + +#endif /* PA_MAC_CORE_INTERNAL_H__ */ diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_old.c b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_old.c new file mode 100644 index 0000000000..4ef89549b0 --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_old.c @@ -0,0 +1,913 @@ +/* + * $Id: pa_mac_core_old.c 1083 2006-08-23 07:30:49Z rossb $ + * pa_mac_core.c + * Implementation of PortAudio for Mac OS X CoreAudio + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Authors: Ross Bencina and Phil Burk + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +#include +#include +#include +#include +#include +#include + +#include "portaudio.h" +#include "pa_trace.h" +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" + +// ===== constants ===== + +// ===== structs ===== +#pragma mark structs + +// PaMacCoreHostApiRepresentation - host api datastructure specific to this implementation +typedef struct PaMacCore_HAR +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + AudioDeviceID *macCoreDeviceIds; +} +PaMacCoreHostApiRepresentation; + +typedef struct PaMacCore_DI +{ + PaDeviceInfo inheritedDeviceInfo; +} +PaMacCoreDeviceInfo; + +// PaMacCoreStream - a stream data structure specifically for this implementation +typedef struct PaMacCore_S +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + int primeStreamUsingCallback; + + AudioDeviceID inputDevice; + AudioDeviceID outputDevice; + + // Processing thread management -------------- +// HANDLE abortEvent; +// HANDLE processingThread; +// DWORD processingThreadId; + + char throttleProcessingThreadOnOverload; // 0 -> don't throtte, non-0 -> throttle + int processingThreadPriority; + int highThreadPriority; + int throttledThreadPriority; + unsigned long throttledSleepMsecs; + + int isStopped; + volatile int isActive; + volatile int stopProcessing; // stop thread once existing buffers have been returned + volatile int abortProcessing; // stop thread immediately + +// DWORD allBuffersDurationMs; // used to calculate timeouts +} +PaMacCoreStream; + +// Data needed by the CoreAudio callback functions +typedef struct PaMacCore_CD +{ + PaMacCoreStream *stream; + PaStreamCallback *callback; + void *userData; + PaUtilConverter *inputConverter; + PaUtilConverter *outputConverter; + void *inputBuffer; + void *outputBuffer; + int inputChannelCount; + int outputChannelCount; + PaSampleFormat inputSampleFormat; + PaSampleFormat outputSampleFormat; + PaUtilTriangularDitherGenerator *ditherGenerator; +} +PaMacClientData; + +// ===== CoreAudio-PortAudio bridge functions ===== +#pragma mark CoreAudio-PortAudio bridge functions + +// Maps CoreAudio OSStatus codes to PortAudio PaError codes +static PaError conv_err(OSStatus error) +{ + PaError result; + + switch (error) { + case kAudioHardwareNoError: + result = paNoError; break; + case kAudioHardwareNotRunningError: + result = paInternalError; break; + case kAudioHardwareUnspecifiedError: + result = paInternalError; break; + case kAudioHardwareUnknownPropertyError: + result = paInternalError; break; + case kAudioHardwareBadPropertySizeError: + result = paInternalError; break; + case kAudioHardwareIllegalOperationError: + result = paInternalError; break; + case kAudioHardwareBadDeviceError: + result = paInvalidDevice; break; + case kAudioHardwareBadStreamError: + result = paBadStreamPtr; break; + case kAudioHardwareUnsupportedOperationError: + result = paInternalError; break; + case kAudioDeviceUnsupportedFormatError: + result = paSampleFormatNotSupported; break; + case kAudioDevicePermissionsError: + result = paDeviceUnavailable; break; + default: + result = paInternalError; + } + + return result; +} + +/* This function is unused +static AudioStreamBasicDescription *InitializeStreamDescription(const PaStreamParameters *parameters, double sampleRate) +{ + struct AudioStreamBasicDescription *streamDescription = PaUtil_AllocateMemory(sizeof(AudioStreamBasicDescription)); + streamDescription->mSampleRate = sampleRate; + streamDescription->mFormatID = kAudioFormatLinearPCM; + streamDescription->mFormatFlags = 0; + streamDescription->mFramesPerPacket = 1; + + if (parameters->sampleFormat & paNonInterleaved) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsNonInterleaved; + streamDescription->mChannelsPerFrame = 1; + streamDescription->mBytesPerFrame = Pa_GetSampleSize(parameters->sampleFormat); + streamDescription->mBytesPerPacket = Pa_GetSampleSize(parameters->sampleFormat); + } + else { + streamDescription->mChannelsPerFrame = parameters->channelCount; + } + + streamDescription->mBytesPerFrame = Pa_GetSampleSize(parameters->sampleFormat) * streamDescription->mChannelsPerFrame; + streamDescription->mBytesPerPacket = streamDescription->mBytesPerFrame * streamDescription->mFramesPerPacket; + + if (parameters->sampleFormat & paFloat32) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsFloat; + streamDescription->mBitsPerChannel = 32; + } + else if (parameters->sampleFormat & paInt32) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; + streamDescription->mBitsPerChannel = 32; + } + else if (parameters->sampleFormat & paInt24) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; + streamDescription->mBitsPerChannel = 24; + } + else if (parameters->sampleFormat & paInt16) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; + streamDescription->mBitsPerChannel = 16; + } + else if (parameters->sampleFormat & paInt8) { + streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; + streamDescription->mBitsPerChannel = 8; + } + else if (parameters->sampleFormat & paInt32) { + streamDescription->mBitsPerChannel = 8; + } + + return streamDescription; +} +*/ + +static PaStreamCallbackTimeInfo *InitializeTimeInfo(const AudioTimeStamp* now, const AudioTimeStamp* inputTime, const AudioTimeStamp* outputTime) +{ + PaStreamCallbackTimeInfo *timeInfo = PaUtil_AllocateMemory(sizeof(PaStreamCallbackTimeInfo)); + + timeInfo->inputBufferAdcTime = inputTime->mSampleTime; + timeInfo->currentTime = now->mSampleTime; + timeInfo->outputBufferDacTime = outputTime->mSampleTime; + + return timeInfo; +} + +// ===== support functions ===== +#pragma mark support functions + +static void CleanUp(PaMacCoreHostApiRepresentation *macCoreHostApi) +{ + if( macCoreHostApi->allocations ) + { + PaUtil_FreeAllAllocations( macCoreHostApi->allocations ); + PaUtil_DestroyAllocationGroup( macCoreHostApi->allocations ); + } + + PaUtil_FreeMemory( macCoreHostApi ); +} + +static PaError GetChannelInfo(PaDeviceInfo *deviceInfo, AudioDeviceID macCoreDeviceId, int isInput) +{ + UInt32 propSize; + PaError err = paNoError; + UInt32 i; + int numChannels = 0; + AudioBufferList *buflist; + + err = conv_err(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, NULL)); + buflist = PaUtil_AllocateMemory(propSize); + err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); + if (!err) { + for (i = 0; i < buflist->mNumberBuffers; ++i) { + numChannels += buflist->mBuffers[i].mNumberChannels; + } + + if (isInput) + deviceInfo->maxInputChannels = numChannels; + else + deviceInfo->maxOutputChannels = numChannels; + + int frameLatency; + propSize = sizeof(UInt32); + err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &frameLatency)); + if (!err) { + double secondLatency = frameLatency / deviceInfo->defaultSampleRate; + if (isInput) { + deviceInfo->defaultLowInputLatency = secondLatency; + deviceInfo->defaultHighInputLatency = secondLatency; + } + else { + deviceInfo->defaultLowOutputLatency = secondLatency; + deviceInfo->defaultHighOutputLatency = secondLatency; + } + } + } + PaUtil_FreeMemory(buflist); + + return err; +} + +static PaError InitializeDeviceInfo(PaMacCoreDeviceInfo *macCoreDeviceInfo, AudioDeviceID macCoreDeviceId, PaHostApiIndex hostApiIndex ) +{ + PaDeviceInfo *deviceInfo = &macCoreDeviceInfo->inheritedDeviceInfo; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + PaError err = paNoError; + UInt32 propSize; + + err = conv_err(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL)); + // FIXME: this allocation should be part of the allocations group + char *name = PaUtil_AllocateMemory(propSize); + err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); + if (!err) { + deviceInfo->name = name; + } + + Float64 sampleRate; + propSize = sizeof(Float64); + err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); + if (!err) { + deviceInfo->defaultSampleRate = sampleRate; + } + + + // Get channel info + err = GetChannelInfo(deviceInfo, macCoreDeviceId, 1); + err = GetChannelInfo(deviceInfo, macCoreDeviceId, 0); + + return err; +} + +static PaError InitializeDeviceInfos( PaMacCoreHostApiRepresentation *macCoreHostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *hostApi; + PaMacCoreDeviceInfo *deviceInfoArray; + + // initialise device counts and default devices under the assumption that there are no devices. These values are incremented below if and when devices are successfully initialized. + hostApi = &macCoreHostApi->inheritedHostApiRep; + hostApi->info.deviceCount = 0; + hostApi->info.defaultInputDevice = paNoDevice; + hostApi->info.defaultOutputDevice = paNoDevice; + + UInt32 propsize; + AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &propsize, NULL); + int numDevices = propsize / sizeof(AudioDeviceID); + hostApi->info.deviceCount = numDevices; + if (numDevices > 0) { + hostApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + macCoreHostApi->allocations, sizeof(PaDeviceInfo*) * numDevices ); + if( !hostApi->deviceInfos ) + { + return paInsufficientMemory; + } + + // allocate all device info structs in a contiguous block + deviceInfoArray = (PaMacCoreDeviceInfo*)PaUtil_GroupAllocateMemory( + macCoreHostApi->allocations, sizeof(PaMacCoreDeviceInfo) * numDevices ); + if( !deviceInfoArray ) + { + return paInsufficientMemory; + } + + macCoreHostApi->macCoreDeviceIds = PaUtil_GroupAllocateMemory(macCoreHostApi->allocations, propsize); + AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &propsize, macCoreHostApi->macCoreDeviceIds); + + AudioDeviceID defaultInputDevice, defaultOutputDevice; + propsize = sizeof(AudioDeviceID); + AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &propsize, &defaultInputDevice); + AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &propsize, &defaultOutputDevice); + + UInt32 i; + for (i = 0; i < numDevices; ++i) { + if (macCoreHostApi->macCoreDeviceIds[i] == defaultInputDevice) { + hostApi->info.defaultInputDevice = i; + } + if (macCoreHostApi->macCoreDeviceIds[i] == defaultOutputDevice) { + hostApi->info.defaultOutputDevice = i; + } + InitializeDeviceInfo(&deviceInfoArray[i], macCoreHostApi->macCoreDeviceIds[i], hostApiIndex); + hostApi->deviceInfos[i] = &(deviceInfoArray[i].inheritedDeviceInfo); + } + } + + return result; +} + +static OSStatus CheckFormat(AudioDeviceID macCoreDeviceId, const PaStreamParameters *parameters, double sampleRate, int isInput) +{ + UInt32 propSize = sizeof(AudioStreamBasicDescription); + AudioStreamBasicDescription *streamDescription = PaUtil_AllocateMemory(propSize); + + streamDescription->mSampleRate = sampleRate; + streamDescription->mFormatID = 0; + streamDescription->mFormatFlags = 0; + streamDescription->mBytesPerPacket = 0; + streamDescription->mFramesPerPacket = 0; + streamDescription->mBytesPerFrame = 0; + streamDescription->mChannelsPerFrame = 0; + streamDescription->mBitsPerChannel = 0; + streamDescription->mReserved = 0; + + OSStatus result = AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamFormatSupported, &propSize, streamDescription); + PaUtil_FreeMemory(streamDescription); + return result; +} + +static OSStatus CopyInputData(PaMacClientData* destination, const AudioBufferList *source, unsigned long frameCount) +{ + int frameSpacing, channelSpacing; + if (destination->inputSampleFormat & paNonInterleaved) { + frameSpacing = 1; + channelSpacing = destination->inputChannelCount; + } + else { + frameSpacing = destination->inputChannelCount; + channelSpacing = 1; + } + + AudioBuffer const *inputBuffer = &source->mBuffers[0]; + void *coreAudioBuffer = inputBuffer->mData; + void *portAudioBuffer = destination->inputBuffer; + UInt32 i, streamNumber, streamChannel; + for (i = streamNumber = streamChannel = 0; i < destination->inputChannelCount; ++i, ++streamChannel) { + if (streamChannel >= inputBuffer->mNumberChannels) { + ++streamNumber; + inputBuffer = &source->mBuffers[streamNumber]; + coreAudioBuffer = inputBuffer->mData; + streamChannel = 0; + } + destination->inputConverter(portAudioBuffer, frameSpacing, coreAudioBuffer, inputBuffer->mNumberChannels, frameCount, destination->ditherGenerator); + coreAudioBuffer += sizeof(Float32); + portAudioBuffer += Pa_GetSampleSize(destination->inputSampleFormat) * channelSpacing; + } + return noErr; +} + +static OSStatus CopyOutputData(AudioBufferList* destination, PaMacClientData *source, unsigned long frameCount) +{ + int frameSpacing, channelSpacing; + if (source->outputSampleFormat & paNonInterleaved) { + frameSpacing = 1; + channelSpacing = source->outputChannelCount; + } + else { + frameSpacing = source->outputChannelCount; + channelSpacing = 1; + } + + AudioBuffer *outputBuffer = &destination->mBuffers[0]; + void *coreAudioBuffer = outputBuffer->mData; + void *portAudioBuffer = source->outputBuffer; + UInt32 i, streamNumber, streamChannel; + for (i = streamNumber = streamChannel = 0; i < source->outputChannelCount; ++i, ++streamChannel) { + if (streamChannel >= outputBuffer->mNumberChannels) { + ++streamNumber; + outputBuffer = &destination->mBuffers[streamNumber]; + coreAudioBuffer = outputBuffer->mData; + streamChannel = 0; + } + source->outputConverter(coreAudioBuffer, outputBuffer->mNumberChannels, portAudioBuffer, frameSpacing, frameCount, NULL); + coreAudioBuffer += sizeof(Float32); + portAudioBuffer += Pa_GetSampleSize(source->outputSampleFormat) * channelSpacing; + } + return noErr; +} + +static OSStatus AudioIOProc( AudioDeviceID inDevice, + const AudioTimeStamp* inNow, + const AudioBufferList* inInputData, + const AudioTimeStamp* inInputTime, + AudioBufferList* outOutputData, + const AudioTimeStamp* inOutputTime, + void* inClientData) +{ + PaMacClientData *clientData = (PaMacClientData *)inClientData; + PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); + + PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); + + AudioBuffer *outputBuffer = &outOutputData->mBuffers[0]; + unsigned long frameCount = outputBuffer->mDataByteSize / (outputBuffer->mNumberChannels * sizeof(Float32)); + + if (clientData->inputBuffer) { + CopyInputData(clientData, inInputData, frameCount); + } + PaStreamCallbackResult result = clientData->callback(clientData->inputBuffer, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); + if (clientData->outputBuffer) { + CopyOutputData(outOutputData, clientData, frameCount); + } + + PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); + + if (result == paComplete || result == paAbort) { + Pa_StopStream(clientData->stream); + } + + PaUtil_FreeMemory( timeInfo ); + return noErr; +} + +// This is not for input-only streams, this is for streams where the input device is different from the output device +static OSStatus AudioInputProc( AudioDeviceID inDevice, + const AudioTimeStamp* inNow, + const AudioBufferList* inInputData, + const AudioTimeStamp* inInputTime, + AudioBufferList* outOutputData, + const AudioTimeStamp* inOutputTime, + void* inClientData) +{ + PaMacClientData *clientData = (PaMacClientData *)inClientData; + PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); + + PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); + + AudioBuffer const *inputBuffer = &inInputData->mBuffers[0]; + unsigned long frameCount = inputBuffer->mDataByteSize / (inputBuffer->mNumberChannels * sizeof(Float32)); + + CopyInputData(clientData, inInputData, frameCount); + PaStreamCallbackResult result = clientData->callback(clientData->inputBuffer, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); + + PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); + if( result == paComplete || result == paAbort ) + Pa_StopStream(clientData->stream); + PaUtil_FreeMemory( timeInfo ); + return noErr; +} + +// This is not for output-only streams, this is for streams where the input device is different from the output device +static OSStatus AudioOutputProc( AudioDeviceID inDevice, + const AudioTimeStamp* inNow, + const AudioBufferList* inInputData, + const AudioTimeStamp* inInputTime, + AudioBufferList* outOutputData, + const AudioTimeStamp* inOutputTime, + void* inClientData) +{ + PaMacClientData *clientData = (PaMacClientData *)inClientData; + //PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); + + PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); + + AudioBuffer *outputBuffer = &outOutputData->mBuffers[0]; + unsigned long frameCount = outputBuffer->mDataByteSize / (outputBuffer->mNumberChannels * sizeof(Float32)); + + //clientData->callback(NULL, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); + + CopyOutputData(outOutputData, clientData, frameCount); + + PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); + return noErr; +} + +static PaError SetSampleRate(AudioDeviceID device, double sampleRate, int isInput) +{ + PaError result = paNoError; + + double actualSampleRate; + UInt32 propSize = sizeof(double); + result = conv_err(AudioDeviceSetProperty(device, NULL, 0, isInput, kAudioDevicePropertyNominalSampleRate, propSize, &sampleRate)); + + result = conv_err(AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyNominalSampleRate, &propSize, &actualSampleRate)); + + if (result == paNoError && actualSampleRate != sampleRate) { + result = paInvalidSampleRate; + } + + return result; +} + +static PaError SetFramesPerBuffer(AudioDeviceID device, unsigned long framesPerBuffer, int isInput) +{ + PaError result = paNoError; + UInt32 preferredFramesPerBuffer = framesPerBuffer; + // while (preferredFramesPerBuffer > UINT32_MAX) { + // preferredFramesPerBuffer /= 2; + // } + + UInt32 actualFramesPerBuffer; + UInt32 propSize = sizeof(UInt32); + result = conv_err(AudioDeviceSetProperty(device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propSize, &preferredFramesPerBuffer)); + + result = conv_err(AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &actualFramesPerBuffer)); + + if (result != paNoError) { + // do nothing + } + else if (actualFramesPerBuffer > framesPerBuffer) { + result = paBufferTooSmall; + } + else if (actualFramesPerBuffer < framesPerBuffer) { + result = paBufferTooBig; + } + + return result; +} + +static PaError SetUpUnidirectionalStream(AudioDeviceID device, double sampleRate, unsigned long framesPerBuffer, int isInput) +{ + PaError err = paNoError; + err = SetSampleRate(device, sampleRate, isInput); + if( err == paNoError ) + err = SetFramesPerBuffer(device, framesPerBuffer, isInput); + return err; +} + +// ===== PortAudio functions ===== +#pragma mark PortAudio functions + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + + PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif // __cplusplus + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation*)hostApi; + + CleanUp(macCoreHostApi); +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation*)hostApi; + PaDeviceInfo *deviceInfo; + + PaError result = paNoError; + if (inputParameters) { + deviceInfo = macCoreHostApi->inheritedHostApiRep.deviceInfos[inputParameters->device]; + if (inputParameters->channelCount > deviceInfo->maxInputChannels) + result = paInvalidChannelCount; + else if (CheckFormat(macCoreHostApi->macCoreDeviceIds[inputParameters->device], inputParameters, sampleRate, 1) != kAudioHardwareNoError) { + result = paInvalidSampleRate; + } + } + if (outputParameters && result == paNoError) { + deviceInfo = macCoreHostApi->inheritedHostApiRep.deviceInfos[outputParameters->device]; + if (outputParameters->channelCount > deviceInfo->maxOutputChannels) + result = paInvalidChannelCount; + else if (CheckFormat(macCoreHostApi->macCoreDeviceIds[outputParameters->device], outputParameters, sampleRate, 0) != kAudioHardwareNoError) { + result = paInvalidSampleRate; + } + } + + return result; +} + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError err = paNoError; + PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation *)hostApi; + PaMacCoreStream *stream = PaUtil_AllocateMemory(sizeof(PaMacCoreStream)); + stream->isActive = 0; + stream->isStopped = 1; + stream->inputDevice = kAudioDeviceUnknown; + stream->outputDevice = kAudioDeviceUnknown; + + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + ( (streamCallback) + ? &macCoreHostApi->callbackStreamInterface + : &macCoreHostApi->blockingStreamInterface ), + streamCallback, userData ); + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + *s = (PaStream*)stream; + PaMacClientData *clientData = PaUtil_AllocateMemory(sizeof(PaMacClientData)); + clientData->stream = stream; + clientData->callback = streamCallback; + clientData->userData = userData; + clientData->inputBuffer = 0; + clientData->outputBuffer = 0; + clientData->ditherGenerator = PaUtil_AllocateMemory(sizeof(PaUtilTriangularDitherGenerator)); + PaUtil_InitializeTriangularDitherState(clientData->ditherGenerator); + + if (inputParameters != NULL) { + stream->inputDevice = macCoreHostApi->macCoreDeviceIds[inputParameters->device]; + clientData->inputConverter = PaUtil_SelectConverter(paFloat32, inputParameters->sampleFormat, streamFlags); + clientData->inputBuffer = PaUtil_AllocateMemory(Pa_GetSampleSize(inputParameters->sampleFormat) * framesPerBuffer * inputParameters->channelCount); + clientData->inputChannelCount = inputParameters->channelCount; + clientData->inputSampleFormat = inputParameters->sampleFormat; + err = SetUpUnidirectionalStream(stream->inputDevice, sampleRate, framesPerBuffer, 1); + } + + if (err == paNoError && outputParameters != NULL) { + stream->outputDevice = macCoreHostApi->macCoreDeviceIds[outputParameters->device]; + clientData->outputConverter = PaUtil_SelectConverter(outputParameters->sampleFormat, paFloat32, streamFlags); + clientData->outputBuffer = PaUtil_AllocateMemory(Pa_GetSampleSize(outputParameters->sampleFormat) * framesPerBuffer * outputParameters->channelCount); + clientData->outputChannelCount = outputParameters->channelCount; + clientData->outputSampleFormat = outputParameters->sampleFormat; + err = SetUpUnidirectionalStream(stream->outputDevice, sampleRate, framesPerBuffer, 0); + } + + if (inputParameters == NULL || outputParameters == NULL || stream->inputDevice == stream->outputDevice) { + AudioDeviceID device = (inputParameters == NULL) ? stream->outputDevice : stream->inputDevice; + + AudioDeviceAddIOProc(device, AudioIOProc, clientData); + } + else { + // using different devices for input and output + AudioDeviceAddIOProc(stream->inputDevice, AudioInputProc, clientData); + AudioDeviceAddIOProc(stream->outputDevice, AudioOutputProc, clientData); + } + + return err; +} + +// Note: When CloseStream() is called, the multi-api layer ensures that the stream has already been stopped or aborted. +static PaError CloseStream( PaStream* s ) +{ + PaError err = paNoError; + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); + + if (stream->inputDevice != kAudioDeviceUnknown) { + if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { + err = conv_err(AudioDeviceRemoveIOProc(stream->inputDevice, AudioIOProc)); + } + else { + err = conv_err(AudioDeviceRemoveIOProc(stream->inputDevice, AudioInputProc)); + err = conv_err(AudioDeviceRemoveIOProc(stream->outputDevice, AudioOutputProc)); + } + } + else { + err = conv_err(AudioDeviceRemoveIOProc(stream->outputDevice, AudioIOProc)); + } + + return err; +} + + +static PaError StartStream( PaStream *s ) +{ + PaError err = paNoError; + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + if (stream->inputDevice != kAudioDeviceUnknown) { + if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { + err = conv_err(AudioDeviceStart(stream->inputDevice, AudioIOProc)); + } + else { + err = conv_err(AudioDeviceStart(stream->inputDevice, AudioInputProc)); + err = conv_err(AudioDeviceStart(stream->outputDevice, AudioOutputProc)); + } + } + else { + err = conv_err(AudioDeviceStart(stream->outputDevice, AudioIOProc)); + } + + stream->isActive = 1; + stream->isStopped = 0; + return err; +} + +static PaError AbortStream( PaStream *s ) +{ + PaError err = paNoError; + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + if (stream->inputDevice != kAudioDeviceUnknown) { + if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { + err = conv_err(AudioDeviceStop(stream->inputDevice, AudioIOProc)); + } + else { + err = conv_err(AudioDeviceStop(stream->inputDevice, AudioInputProc)); + err = conv_err(AudioDeviceStop(stream->outputDevice, AudioOutputProc)); + } + } + else { + err = conv_err(AudioDeviceStop(stream->outputDevice, AudioIOProc)); + } + + stream->isActive = 0; + stream->isStopped = 1; + return err; +} + +static PaError StopStream( PaStream *s ) +{ + // TODO: this should be nicer than abort + return AbortStream(s); +} + +static PaError IsStreamStopped( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + return stream->isStopped; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + return stream->isActive; +} + + +static PaTime GetStreamTime( PaStream *s ) +{ + OSStatus err; + PaTime result; + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + AudioTimeStamp *timeStamp = PaUtil_AllocateMemory(sizeof(AudioTimeStamp)); + if (stream->inputDevice != kAudioDeviceUnknown) { + err = AudioDeviceGetCurrentTime(stream->inputDevice, timeStamp); + } + else { + err = AudioDeviceGetCurrentTime(stream->outputDevice, timeStamp); + } + + result = err ? 0 : timeStamp->mSampleTime; + PaUtil_FreeMemory(timeStamp); + + return result; +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaMacCoreStream *stream = (PaMacCoreStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +// As separate stream interfaces are used for blocking and callback streams, the following functions can be guaranteed to only be called for blocking streams. + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + return paInternalError; +} + + +static PaError WriteStream( PaStream* s, + const void *buffer, + unsigned long frames ) +{ + return paInternalError; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + return paInternalError; +} + + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + return paInternalError; +} + +// HostAPI-specific initialization function +PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation *)PaUtil_AllocateMemory( sizeof(PaMacCoreHostApiRepresentation) ); + if( !macCoreHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + macCoreHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !macCoreHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + *hostApi = &macCoreHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paCoreAudio; + (*hostApi)->info.name = "CoreAudio"; + + result = InitializeDeviceInfos(macCoreHostApi, hostApiIndex); + if (result != paNoError) { + goto error; + } + + // Set up the proper callbacks to this HostApi's functions + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &macCoreHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &macCoreHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + return result; + +error: + if( macCoreHostApi ) { + CleanUp(macCoreHostApi); + } + + return result; +} diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c new file mode 100644 index 0000000000..63e616f052 --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -0,0 +1,701 @@ +/* + * Helper and utility functions for pa_mac_core.c (Apple AUHAL implementation) + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#include "pa_mac_core_utilities.h" +#include "pa_mac_core_internal.h" +#include +#include +#include +#include + +PaError PaMacCore_SetUnixError( int err, int line ) +{ + PaError ret; + const char *errorText; + + if( err == 0 ) + { + return paNoError; + } + + ret = paNoError; + errorText = strerror( err ); + + /** Map Unix error to PaError. Pretty much the only one that maps + is ENOMEM. */ + if( err == ENOMEM ) + ret = paInsufficientMemory; + else + ret = paInternalError; + + DBUG(("%d on line %d: msg='%s'\n", err, line, errorText)); + PaUtil_SetLastHostErrorInfo( paCoreAudio, err, errorText ); + + return ret; +} + +/* + * Translates MacOS generated errors into PaErrors + */ +PaError PaMacCore_SetError(OSStatus error, int line, int isError) +{ + /*FIXME: still need to handle possible ComponentResult values.*/ + /* unfortunately, they don't seem to be documented anywhere.*/ + PaError result; + const char *errorType; + const char *errorText; + + switch (error) { + case kAudioHardwareNoError: + return paNoError; + case kAudioHardwareNotRunningError: + errorText = "Audio Hardware Not Running"; + result = paInternalError; break; + case kAudioHardwareUnspecifiedError: + errorText = "Unspecified Audio Hardware Error"; + result = paInternalError; break; + case kAudioHardwareUnknownPropertyError: + errorText = "Audio Hardware: Unknown Property"; + result = paInternalError; break; + case kAudioHardwareBadPropertySizeError: + errorText = "Audio Hardware: Bad Property Size"; + result = paInternalError; break; + case kAudioHardwareIllegalOperationError: + errorText = "Audio Hardware: Illegal Operation"; + result = paInternalError; break; + case kAudioHardwareBadDeviceError: + errorText = "Audio Hardware: Bad Device"; + result = paInvalidDevice; break; + case kAudioHardwareBadStreamError: + errorText = "Audio Hardware: BadStream"; + result = paBadStreamPtr; break; + case kAudioHardwareUnsupportedOperationError: + errorText = "Audio Hardware: Unsupported Operation"; + result = paInternalError; break; + case kAudioDeviceUnsupportedFormatError: + errorText = "Audio Device: Unsupported Format"; + result = paSampleFormatNotSupported; break; + case kAudioDevicePermissionsError: + errorText = "Audio Device: Permissions Error"; + result = paDeviceUnavailable; break; + /* Audio Unit Errors: http://developer.apple.com/documentation/MusicAudio/Reference/CoreAudio/audio_units/chapter_5_section_3.html */ + case kAudioUnitErr_InvalidProperty: + errorText = "Audio Unit: Invalid Property"; + result = paInternalError; break; + case kAudioUnitErr_InvalidParameter: + errorText = "Audio Unit: Invalid Parameter"; + result = paInternalError; break; + case kAudioUnitErr_NoConnection: + errorText = "Audio Unit: No Connection"; + result = paInternalError; break; + case kAudioUnitErr_FailedInitialization: + errorText = "Audio Unit: Initialization Failed"; + result = paInternalError; break; + case kAudioUnitErr_TooManyFramesToProcess: + errorText = "Audio Unit: Too Many Frames"; + result = paInternalError; break; + case kAudioUnitErr_IllegalInstrument: + errorText = "Audio Unit: Illegal Instrument"; + result = paInternalError; break; + case kAudioUnitErr_InstrumentTypeNotFound: + errorText = "Audio Unit: Instrument Type Not Found"; + result = paInternalError; break; + case kAudioUnitErr_InvalidFile: + errorText = "Audio Unit: Invalid File"; + result = paInternalError; break; + case kAudioUnitErr_UnknownFileType: + errorText = "Audio Unit: Unknown File Type"; + result = paInternalError; break; + case kAudioUnitErr_FileNotSpecified: + errorText = "Audio Unit: File Not Specified"; + result = paInternalError; break; + case kAudioUnitErr_FormatNotSupported: + errorText = "Audio Unit: Format Not Supported"; + result = paInternalError; break; + case kAudioUnitErr_Uninitialized: + errorText = "Audio Unit: Unitialized"; + result = paInternalError; break; + case kAudioUnitErr_InvalidScope: + errorText = "Audio Unit: Invalid Scope"; + result = paInternalError; break; + case kAudioUnitErr_PropertyNotWritable: + errorText = "Audio Unit: PropertyNotWritable"; + result = paInternalError; break; + case kAudioUnitErr_InvalidPropertyValue: + errorText = "Audio Unit: Invalid Property Value"; + result = paInternalError; break; + case kAudioUnitErr_PropertyNotInUse: + errorText = "Audio Unit: Property Not In Use"; + result = paInternalError; break; + case kAudioUnitErr_Initialized: + errorText = "Audio Unit: Initialized"; + result = paInternalError; break; + case kAudioUnitErr_InvalidOfflineRender: + errorText = "Audio Unit: Invalid Offline Render"; + result = paInternalError; break; + case kAudioUnitErr_Unauthorized: + errorText = "Audio Unit: Unauthorized"; + result = paInternalError; break; + case kAudioUnitErr_CannotDoInCurrentContext: + errorText = "Audio Unit: cannot do in current context"; + result = paInternalError; break; + default: + errorText = "Unknown Error"; + result = paInternalError; + } + + if (isError) + errorType = "Error"; + else + errorType = "Warning"; + + char str[20]; + // see if it appears to be a 4-char-code + *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error); + if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) + { + str[0] = str[5] = '\''; + str[6] = '\0'; + } else { + // no, format it as an integer + sprintf(str, "%d", (int)error); + } + + DBUG(("%s on line %d: err='%s', msg=%s\n", errorType, line, str, errorText)); + + PaUtil_SetLastHostErrorInfo( paCoreAudio, error, errorText ); + + return result; +} + +/* + * This function computes an appropriate ring buffer size given + * a requested latency (in seconds), sample rate and framesPerBuffer. + * + * The returned ringBufferSize is computed using the following + * constraints: + * - it must be at least 4. + * - it must be at least 3x framesPerBuffer. + * - it must be at least 2x the suggestedLatency. + * - it must be a power of 2. + * This function attempts to compute the minimum such size. + * + * FEEDBACK: too liberal/conservative/another way? + */ +long computeRingBufferSize( const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + long inputFramesPerBuffer, + long outputFramesPerBuffer, + double sampleRate ) +{ + long ringSize; + int index; + int i; + double latency ; + long framesPerBuffer ; + + VVDBUG(( "computeRingBufferSize()\n" )); + + assert( inputParameters || outputParameters ); + + if( outputParameters && inputParameters ) + { + latency = MAX( inputParameters->suggestedLatency, outputParameters->suggestedLatency ); + framesPerBuffer = MAX( inputFramesPerBuffer, outputFramesPerBuffer ); + } + else if( outputParameters ) + { + latency = outputParameters->suggestedLatency; + framesPerBuffer = outputFramesPerBuffer ; + } + else /* we have inputParameters */ + { + latency = inputParameters->suggestedLatency; + framesPerBuffer = inputFramesPerBuffer ; + } + + ringSize = (long) ( latency * sampleRate * 2 + .5); + VDBUG( ( "suggested latency : %d\n", (int) (latency*sampleRate) ) ); + if( ringSize < framesPerBuffer * 3 ) + ringSize = framesPerBuffer * 3 ; + VDBUG(("framesPerBuffer:%d\n",(int)framesPerBuffer)); + VDBUG(("Ringbuffer size (1): %d\n", (int)ringSize )); + + /* make sure it's at least 4 */ + ringSize = MAX( ringSize, 4 ); + + /* round up to the next power of 2 */ + index = -1; + for( i=0; i> i & 0x01 ) + index = i; + assert( index > 0 ); + if( ringSize <= ( 0x01 << index ) ) + ringSize = 0x01 << index ; + else + ringSize = 0x01 << ( index + 1 ); + + VDBUG(( "Final Ringbuffer size (2): %d\n", (int)ringSize )); + return ringSize; +} + + +/* + * Durring testing of core audio, I found that serious crashes could occur + * if properties such as sample rate were changed multiple times in rapid + * succession. The function below could be used to with a condition variable. + * to prevent propertychanges from happening until the last property + * change is acknowledged. Instead, I implemented a busy-wait, which is simpler + * to implement b/c in second round of testing (nov '09) property changes occured + * quickly and so there was no real way to test the condition variable implementation. + * therefore, this function is not used, but it is aluded to in commented code below, + * since it represents a theoretically better implementation. + */ + +OSStatus propertyProc( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + void* inClientData ) +{ + // this is where we would set the condition variable + return noErr; +} + +/* sets the value of the given property and waits for the change to + be acknowledged, and returns the final value, which is not guaranteed + by this function to be the same as the desired value. Obviously, this + function can only be used for data whose input and output are the + same size and format, and their size and format are known in advance. + whether or not the call succeeds, if the data is successfully read, + it is returned in outPropertyData. If it is not read successfully, + outPropertyData is zeroed, which may or may not be useful in + determining if the property was read. */ +PaError AudioDeviceSetPropertyNowAndWaitForChange( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void *inPropertyData, + void *outPropertyData ) +{ + OSStatus macErr; + UInt32 outPropertyDataSize = inPropertyDataSize; + + /* First, see if it already has that value. If so, return. */ + macErr = AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, + &outPropertyDataSize, outPropertyData ); + if( macErr ) { + memset( outPropertyData, 0, inPropertyDataSize ); + goto failMac; + } + if( inPropertyDataSize!=outPropertyDataSize ) + return paInternalError; + if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) + return paNoError; + + /* Ideally, we'd use a condition variable to determine changes. + we could set that up here. */ + + /* If we were using a cond variable, we'd do something useful here, + but for now, this is just to make 10.6 happy. */ + macErr = AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, + inPropertyID, propertyProc, + NULL ); + if( macErr ) + /* we couldn't add a listener. */ + goto failMac; + + /* set property */ + macErr = AudioDeviceSetProperty( inDevice, NULL, inChannel, + isInput, inPropertyID, + inPropertyDataSize, inPropertyData ); + if( macErr ) + goto failMac; + + /* busy-wait up to 30 seconds for the property to change */ + /* busy-wait is justified here only because the correct alternative (condition variable) + was hard to test, since most of the waiting ended up being for setting rather than + getting in OS X 10.5. This was not the case in earlier OS versions. */ + struct timeval tv1, tv2; + gettimeofday( &tv1, NULL ); + memcpy( &tv2, &tv1, sizeof( struct timeval ) ); + while( tv2.tv_sec - tv1.tv_sec < 30 ) { + /* now read the property back out */ + macErr = AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, + &outPropertyDataSize, outPropertyData ); + if( macErr ) { + memset( outPropertyData, 0, inPropertyDataSize ); + goto failMac; + } + /* and compare... */ + if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) { + AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + return paNoError; + } + /* No match yet, so let's sleep and try again. */ + Pa_Sleep( 100 ); + gettimeofday( &tv2, NULL ); + } + DBUG( ("Timeout waiting for device setting.\n" ) ); + + AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + return paNoError; + + failMac: + AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + return ERR( macErr ); +} + +/* + * Sets the sample rate the HAL device. + * if requireExact: set the sample rate or fail. + * + * otherwise : set the exact sample rate. + * If that fails, check for available sample rates, and choose one + * higher than the requested rate. If there isn't a higher one, + * just use the highest available. + */ +PaError setBestSampleRateForDevice( const AudioDeviceID device, + const bool isOutput, + const bool requireExact, + const Float64 desiredSrate ) +{ + const bool isInput = isOutput ? 0 : 1; + Float64 srate; + UInt32 propsize = sizeof( Float64 ); + OSErr err; + AudioValueRange *ranges; + int i=0; + Float64 max = -1; /*the maximum rate available*/ + Float64 best = -1; /*the lowest sample rate still greater than desired rate*/ + VDBUG(("Setting sample rate for device %ld to %g.\n",device,(float)desiredSrate)); + + /* -- try setting the sample rate -- */ + srate = 0; + err = AudioDeviceSetPropertyNowAndWaitForChange( + device, 0, isInput, + kAudioDevicePropertyNominalSampleRate, + propsize, &desiredSrate, &srate ); + + /* -- if the rate agrees, and was changed, we are done -- */ + if( srate != 0 && srate == desiredSrate ) + return paNoError; + /* -- if the rate agrees, and we got no errors, we are done -- */ + if( !err && srate == desiredSrate ) + return paNoError; + /* -- we've failed if the rates disagree and we are setting input -- */ + if( requireExact ) + return paInvalidSampleRate; + + /* -- generate a list of available sample rates -- */ + err = AudioDeviceGetPropertyInfo( device, 0, isInput, + kAudioDevicePropertyAvailableNominalSampleRates, + &propsize, NULL ); + if( err ) + return ERR( err ); + ranges = (AudioValueRange *)calloc( 1, propsize ); + if( !ranges ) + return paInsufficientMemory; + err = AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyAvailableNominalSampleRates, + &propsize, ranges ); + if( err ) + { + free( ranges ); + return ERR( err ); + } + VDBUG(("Requested sample rate of %g was not available.\n", (float)desiredSrate)); + VDBUG(("%lu Available Sample Rates are:\n",propsize/sizeof(AudioValueRange))); +#ifdef MAC_CORE_VERBOSE_DEBUG + for( i=0; i max ) max = ranges[i].mMaximum; + if( ranges[i].mMinimum > desiredSrate ) { + if( best < 0 ) + best = ranges[i].mMinimum; + else if( ranges[i].mMinimum < best ) + best = ranges[i].mMinimum; + } + } + if( best < 0 ) + best = max; + VDBUG( ("Maximum Rate %g. best is %g.\n", max, best ) ); + free( ranges ); + + /* -- set the sample rate -- */ + propsize = sizeof( best ); + srate = 0; + err = AudioDeviceSetPropertyNowAndWaitForChange( + device, 0, isInput, + kAudioDevicePropertyNominalSampleRate, + propsize, &best, &srate ); + + /* -- if the set rate matches, we are done -- */ + if( srate != 0 && srate == best ) + return paNoError; + + if( err ) + return ERR( err ); + + /* -- otherwise, something wierd happened: we didn't set the rate, and we got no errors. Just bail. */ + return paInternalError; +} + + +/* + Attempts to set the requestedFramesPerBuffer. If it can't set the exact + value, it settles for something smaller if available. If nothing smaller + is available, it uses the smallest available size. + actualFramesPerBuffer will be set to the actual value on successful return. + OK to pass NULL to actualFramesPerBuffer. + The logic is very simmilar too setBestSampleRate only failure here is + not usually catastrophic. +*/ +PaError setBestFramesPerBuffer( const AudioDeviceID device, + const bool isOutput, + UInt32 requestedFramesPerBuffer, + UInt32 *actualFramesPerBuffer ) +{ + UInt32 afpb; + const bool isInput = !isOutput; + UInt32 propsize = sizeof(UInt32); + OSErr err; + AudioValueRange range; + + if( actualFramesPerBuffer == NULL ) + { + actualFramesPerBuffer = &afpb; + } + + /* -- try and set exact FPB -- */ + err = AudioDeviceSetProperty( device, NULL, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + propsize, &requestedFramesPerBuffer); + err = AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + &propsize, actualFramesPerBuffer); + if( err ) + { + return ERR( err ); + } + // Did we get the size we asked for? + if( *actualFramesPerBuffer == requestedFramesPerBuffer ) + { + return paNoError; /* we are done */ + } + + // Clip requested value against legal range for the device. + propsize = sizeof(AudioValueRange); + err = AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyBufferFrameSizeRange, + &propsize, &range ); + if( err ) + { + return ERR( err ); + } + if( requestedFramesPerBuffer < range.mMinimum ) + { + requestedFramesPerBuffer = range.mMinimum; + } + else if( requestedFramesPerBuffer > range.mMaximum ) + { + requestedFramesPerBuffer = range.mMaximum; + } + + /* --- set the buffer size (ignore errors) -- */ + propsize = sizeof( UInt32 ); + err = AudioDeviceSetProperty( device, NULL, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + propsize, &requestedFramesPerBuffer ); + /* --- read the property to check that it was set -- */ + err = AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + &propsize, actualFramesPerBuffer ); + + if( err ) + return ERR( err ); + + return paNoError; +} + +/********************** + * + * XRun stuff + * + **********************/ + +struct PaMacXRunListNode_s { + PaMacCoreStream *stream; + struct PaMacXRunListNode_s *next; +} ; + +typedef struct PaMacXRunListNode_s PaMacXRunListNode; + +/** Always empty, so that it can always be the one returned by + addToXRunListenerList. note that it's not a pointer. */ +static PaMacXRunListNode firstXRunListNode; +static int xRunListSize; +static pthread_mutex_t xrunMutex; + +OSStatus xrunCallback( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + void* inClientData) +{ + PaMacXRunListNode *node = (PaMacXRunListNode *) inClientData; + + int ret = pthread_mutex_trylock( &xrunMutex ) ; + + if( ret == 0 ) { + + node = node->next ; //skip the first node + + for( ; node; node=node->next ) { + PaMacCoreStream *stream = node->stream; + + if( stream->state != ACTIVE ) + continue; //if the stream isn't active, we don't care if the device is dropping + + if( isInput ) { + if( stream->inputDevice == inDevice ) + OSAtomicOr32( paInputOverflow, &stream->xrunFlags ); + } else { + if( stream->outputDevice == inDevice ) + OSAtomicOr32( paOutputUnderflow, &stream->xrunFlags ); + } + } + + pthread_mutex_unlock( &xrunMutex ); + } + + return 0; +} + +int initializeXRunListenerList() +{ + xRunListSize = 0; + bzero( (void *) &firstXRunListNode, sizeof(firstXRunListNode) ); + return pthread_mutex_init( &xrunMutex, NULL ); +} +int destroyXRunListenerList() +{ + PaMacXRunListNode *node; + node = firstXRunListNode.next; + while( node ) { + PaMacXRunListNode *tmp = node; + node = node->next; + free( tmp ); + } + xRunListSize = 0; + return pthread_mutex_destroy( &xrunMutex ); +} + +void *addToXRunListenerList( void *stream ) +{ + pthread_mutex_lock( &xrunMutex ); + PaMacXRunListNode *newNode; + // setup new node: + newNode = (PaMacXRunListNode *) malloc( sizeof( PaMacXRunListNode ) ); + newNode->stream = (PaMacCoreStream *) stream; + newNode->next = firstXRunListNode.next; + // insert: + firstXRunListNode.next = newNode; + pthread_mutex_unlock( &xrunMutex ); + + return &firstXRunListNode; +} + +int removeFromXRunListenerList( void *stream ) +{ + pthread_mutex_lock( &xrunMutex ); + PaMacXRunListNode *node, *prev; + prev = &firstXRunListNode; + node = firstXRunListNode.next; + while( node ) { + if( node->stream == stream ) { + //found it: + --xRunListSize; + prev->next = node->next; + free( node ); + pthread_mutex_unlock( &xrunMutex ); + return xRunListSize; + } + prev = prev->next; + node = node->next; + } + + pthread_mutex_unlock( &xrunMutex ); + // failure + return xRunListSize; +} + diff --git a/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.h b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.h new file mode 100644 index 0000000000..7c4afe52ca --- /dev/null +++ b/Externals/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -0,0 +1,218 @@ +/* + * Helper and utility functions for pa_mac_core.c (Apple AUHAL implementation) + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Written by Bjorn Roche of XO Audio LLC, from PA skeleton code. + * Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation) + * + * Dominic's code was based on code by Phil Burk, Darren Gibbs, + * Gord Peters, Stephane Letz, and Greg Pfiel. + * + * The following people also deserve acknowledgements: + * + * Olivier Tristan for feedback and testing + * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O + * interface. + * + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#ifndef PA_MAC_CORE_UTILITIES_H__ +#define PA_MAC_CORE_UTILITIES_H__ + +#include +#include "portaudio.h" +#include "pa_util.h" +#include +#include + +#ifndef MIN +#define MIN(a, b) (((a)<(b))?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a)<(b))?(b):(a)) +#endif + +#define ERR(mac_error) PaMacCore_SetError(mac_error, __LINE__, 1 ) +#define WARNING(mac_error) PaMacCore_SetError(mac_error, __LINE__, 0 ) + + +/* Help keep track of AUHAL element numbers */ +#define INPUT_ELEMENT (1) +#define OUTPUT_ELEMENT (0) + +/* Normal level of debugging: fine for most apps that don't mind the occational warning being printf'ed */ +/* + */ +#define MAC_CORE_DEBUG +#ifdef MAC_CORE_DEBUG +# define DBUG(MSG) do { printf("||PaMacCore (AUHAL)|| "); printf MSG ; fflush(stdout); } while(0) +#else +# define DBUG(MSG) +#endif + +/* Verbose Debugging: useful for developement */ +/* +#define MAC_CORE_VERBOSE_DEBUG +*/ +#ifdef MAC_CORE_VERBOSE_DEBUG +# define VDBUG(MSG) do { printf("||PaMacCore (v )|| "); printf MSG ; fflush(stdout); } while(0) +#else +# define VDBUG(MSG) +#endif + +/* Very Verbose Debugging: Traces every call. */ +/* +#define MAC_CORE_VERY_VERBOSE_DEBUG + */ +#ifdef MAC_CORE_VERY_VERBOSE_DEBUG +# define VVDBUG(MSG) do { printf("||PaMacCore (vv)|| "); printf MSG ; fflush(stdout); } while(0) +#else +# define VVDBUG(MSG) +#endif + + + + + +#define UNIX_ERR(err) PaMacCore_SetUnixError( err, __LINE__ ) + +PaError PaMacCore_SetUnixError( int err, int line ); + +/* + * Translates MacOS generated errors into PaErrors + */ +PaError PaMacCore_SetError(OSStatus error, int line, int isError); + +/* + * This function computes an appropriate ring buffer size given + * a requested latency (in seconds), sample rate and framesPerBuffer. + * + * The returned ringBufferSize is computed using the following + * constraints: + * - it must be at least 4. + * - it must be at least 3x framesPerBuffer. + * - it must be at least 2x the suggestedLatency. + * - it must be a power of 2. + * This function attempts to compute the minimum such size. + * + */ +long computeRingBufferSize( const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + long inputFramesPerBuffer, + long outputFramesPerBuffer, + double sampleRate ); + +OSStatus propertyProc( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + void* inClientData ); + +/* sets the value of the given property and waits for the change to + be acknowledged, and returns the final value, which is not guaranteed + by this function to be the same as the desired value. Obviously, this + function can only be used for data whose input and output are the + same size and format, and their size and format are known in advance.*/ +PaError AudioDeviceSetPropertyNowAndWaitForChange( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void *inPropertyData, + void *outPropertyData ); + +/* + * Sets the sample rate the HAL device. + * if requireExact: set the sample rate or fail. + * + * otherwise : set the exact sample rate. + * If that fails, check for available sample rates, and choose one + * higher than the requested rate. If there isn't a higher one, + * just use the highest available. + */ +PaError setBestSampleRateForDevice( const AudioDeviceID device, + const bool isOutput, + const bool requireExact, + const Float64 desiredSrate ); +/* + Attempts to set the requestedFramesPerBuffer. If it can't set the exact + value, it settles for something smaller if available. If nothing smaller + is available, it uses the smallest available size. + actualFramesPerBuffer will be set to the actual value on successful return. + OK to pass NULL to actualFramesPerBuffer. + The logic is very simmilar too setBestSampleRate only failure here is + not usually catastrophic. +*/ +PaError setBestFramesPerBuffer( const AudioDeviceID device, + const bool isOutput, + UInt32 requestedFramesPerBuffer, + UInt32 *actualFramesPerBuffer ); + + +/********************* + * + * xrun handling + * + *********************/ + +OSStatus xrunCallback( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + void* inClientData ) ; + +/** returns zero on success or a unix style error code. */ +int initializeXRunListenerList(); +/** returns zero on success or a unix style error code. */ +int destroyXRunListenerList(); + +/**Returns the list, so that it can be passed to CorAudio.*/ +void *addToXRunListenerList( void *stream ); +/**Returns the number of Listeners in the list remaining.*/ +int removeFromXRunListenerList( void *stream ); + +#endif /* PA_MAC_CORE_UTILITIES_H__*/ diff --git a/Externals/portaudio/src/hostapi/dsound/pa_win_ds.c b/Externals/portaudio/src/hostapi/dsound/pa_win_ds.c new file mode 100644 index 0000000000..77d1924955 --- /dev/null +++ b/Externals/portaudio/src/hostapi/dsound/pa_win_ds.c @@ -0,0 +1,3154 @@ +/* + * $Id: pa_win_ds.c 1779 2011-11-10 14:51:15Z rossb $ + * Portable Audio I/O Library DirectSound implementation + * + * Authors: Phil Burk, Robert Marsanyi & Ross Bencina + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2007 Ross Bencina, Phil Burk, Robert Marsanyi + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup hostapi_src +*/ + +/* Until May 2011 PA/DS has used a multimedia timer to perform the callback. + We're replacing this with a new implementation using a thread and a different timer mechanim. + Defining PA_WIN_DS_USE_WMME_TIMER uses the old (pre-May 2011) behavior. +*/ +//#define PA_WIN_DS_USE_WMME_TIMER + +#include +#include +#include /* strlen() */ + +#define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */ +#include /* make sure ds guids get defined */ +#include +#include + + +/* + Use the earliest version of DX required, no need to polute the namespace +*/ +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE +#define DIRECTSOUND_VERSION 0x0800 +#else +#define DIRECTSOUND_VERSION 0x0300 +#endif +#include +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO +#include +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ +#ifndef PA_WIN_DS_USE_WMME_TIMER +#ifndef UNDER_CE +#include +#endif +#endif + +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_debugprint.h" + +#include "pa_win_ds.h" +#include "pa_win_ds_dynlink.h" +#include "pa_win_waveformat.h" +#include "pa_win_wdmks_utils.h" +#include "pa_win_coinitialize.h" + +#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ +#pragma comment( lib, "dsound.lib" ) +#pragma comment( lib, "winmm.lib" ) +#pragma comment( lib, "kernel32.lib" ) +#endif + +/* use CreateThread for CYGWIN, _beginthreadex for all others */ +#ifndef PA_WIN_DS_USE_WMME_TIMER + +#if !defined(__CYGWIN__) && !defined(UNDER_CE) +#define CREATE_THREAD (HANDLE)_beginthreadex +#undef CLOSE_THREAD_HANDLE /* as per documentation we don't call CloseHandle on a thread created with _beginthreadex */ +#define PA_THREAD_FUNC static unsigned WINAPI +#define PA_THREAD_ID unsigned +#else +#define CREATE_THREAD CreateThread +#define CLOSE_THREAD_HANDLE CloseHandle +#define PA_THREAD_FUNC static DWORD WINAPI +#define PA_THREAD_ID DWORD +#endif + +#if (defined(UNDER_CE)) +#pragma comment(lib, "Coredll.lib") +#elif (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ +#pragma comment(lib, "winmm.lib") +#endif + +PA_THREAD_FUNC ProcessingThreadProc( void *pArg ); + +#if !defined(UNDER_CE) +#define PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT /* use waitable timer where possible, otherwise we use a WaitForSingleObject timeout */ +#endif + +#endif /* !PA_WIN_DS_USE_WMME_TIMER */ + + +/* + provided in newer platform sdks and x64 + */ +#ifndef DWORD_PTR + #if defined(_WIN64) + #define DWORD_PTR unsigned __int64 + #else + #define DWORD_PTR unsigned long + #endif +#endif + +#define PRINT(x) PA_DEBUG(x); +#define ERR_RPT(x) PRINT(x) +#define DBUG(x) PRINT(x) +#define DBUGX(x) PRINT(x) + +#define PA_USE_HIGH_LATENCY (0) +#if PA_USE_HIGH_LATENCY +#define PA_DS_WIN_9X_DEFAULT_LATENCY_ (.500) +#define PA_DS_WIN_NT_DEFAULT_LATENCY_ (.600) +#else +#define PA_DS_WIN_9X_DEFAULT_LATENCY_ (.140) +#define PA_DS_WIN_NT_DEFAULT_LATENCY_ (.280) +#endif + +#define PA_DS_WIN_WDM_DEFAULT_LATENCY_ (.120) + +#define SECONDS_PER_MSEC (0.001) +#define MSECS_PER_SECOND (1000) + +/* prototypes for functions declared in this file */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + + +/* FIXME: should convert hr to a string */ +#define PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ) \ + PaUtil_SetLastHostErrorInfo( paDirectSound, hr, "DirectSound error" ) + +/************************************************* DX Prototypes **********/ +static BOOL CALLBACK CollectGUIDsProc(LPGUID lpGUID, + LPCTSTR lpszDesc, + LPCTSTR lpszDrvName, + LPVOID lpContext ); + +/************************************************************************************/ +/********************** Structures **************************************************/ +/************************************************************************************/ +/* PaWinDsHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct PaWinDsDeviceInfo +{ + PaDeviceInfo inheritedDeviceInfo; + GUID guid; + GUID *lpGUID; + double sampleRates[3]; + char deviceInputChannelCountIsKnown; /**<< if the system returns 0xFFFF then we don't really know the number of supported channels (1=>known, 0=>unknown)*/ + char deviceOutputChannelCountIsKnown; /**<< if the system returns 0xFFFF then we don't really know the number of supported channels (1=>known, 0=>unknown)*/ +} PaWinDsDeviceInfo; + +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ + + PaWinUtilComInitializationResult comInitializationResult; + +} PaWinDsHostApiRepresentation; + + +/* PaWinDsStream - a stream data structure specifically for this implementation */ + +typedef struct PaWinDsStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + +/* DirectSound specific data. */ +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + LPDIRECTSOUNDFULLDUPLEX8 pDirectSoundFullDuplex8; +#endif + +/* Output */ + LPDIRECTSOUND pDirectSound; + LPDIRECTSOUNDBUFFER pDirectSoundPrimaryBuffer; + LPDIRECTSOUNDBUFFER pDirectSoundOutputBuffer; + DWORD outputBufferWriteOffsetBytes; /* last write position */ + INT outputBufferSizeBytes; + INT outputFrameSizeBytes; + /* Try to detect play buffer underflows. */ + LARGE_INTEGER perfCounterTicksPerBuffer; /* counter ticks it should take to play a full buffer */ + LARGE_INTEGER previousPlayTime; + DWORD previousPlayCursor; + UINT outputUnderflowCount; + BOOL outputIsRunning; + INT finalZeroBytesWritten; /* used to determine when we've flushed the whole buffer */ + +/* Input */ + LPDIRECTSOUNDCAPTURE pDirectSoundCapture; + LPDIRECTSOUNDCAPTUREBUFFER pDirectSoundInputBuffer; + INT inputFrameSizeBytes; + UINT readOffset; /* last read position */ + UINT inputBufferSizeBytes; + + + int hostBufferSizeFrames; /* input and output host ringbuffers have the same number of frames */ + double framesWritten; + double secondsPerHostByte; /* Used to optimize latency calculation for outTime */ + double pollingPeriodSeconds; + + PaStreamCallbackFlags callbackFlags; + + PaStreamFlags streamFlags; + int callbackResult; + HANDLE processingCompleted; + +/* FIXME - move all below to PaUtilStreamRepresentation */ + volatile int isStarted; + volatile int isActive; + volatile int stopProcessing; /* stop thread once existing buffers have been returned */ + volatile int abortProcessing; /* stop thread immediately */ + + UINT systemTimerResolutionPeriodMs; /* set to 0 if we were unable to set the timer period */ + +#ifdef PA_WIN_DS_USE_WMME_TIMER + MMRESULT timerID; +#else + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + HANDLE waitableTimer; +#endif + HANDLE processingThread; + PA_THREAD_ID processingThreadId; + HANDLE processingThreadCompleted; +#endif + +} PaWinDsStream; + + +/* Set minimal latency based on the current OS version. + * NT has higher latency. + */ +static double PaWinDS_GetMinSystemLatencySeconds( void ) +{ + double minLatencySeconds; + /* Set minimal latency based on whether NT or other OS. + * NT has higher latency. + */ + OSVERSIONINFO osvi; + osvi.dwOSVersionInfoSize = sizeof( osvi ); + GetVersionEx( &osvi ); + DBUG(("PA - PlatformId = 0x%x\n", osvi.dwPlatformId )); + DBUG(("PA - MajorVersion = 0x%x\n", osvi.dwMajorVersion )); + DBUG(("PA - MinorVersion = 0x%x\n", osvi.dwMinorVersion )); + /* Check for NT */ + if( (osvi.dwMajorVersion == 4) && (osvi.dwPlatformId == 2) ) + { + minLatencySeconds = PA_DS_WIN_NT_DEFAULT_LATENCY_; + } + else if(osvi.dwMajorVersion >= 5) + { + minLatencySeconds = PA_DS_WIN_WDM_DEFAULT_LATENCY_; + } + else + { + minLatencySeconds = PA_DS_WIN_9X_DEFAULT_LATENCY_; + } + return minLatencySeconds; +} + + +/************************************************************************* +** Return minimum workable latency required for this host. This is returned +** As the default stream latency in PaDeviceInfo. +** Latency can be optionally set by user by setting an environment variable. +** For example, to set latency to 200 msec, put: +** +** set PA_MIN_LATENCY_MSEC=200 +** +** in the AUTOEXEC.BAT file and reboot. +** If the environment variable is not set, then the latency will be determined +** based on the OS. Windows NT has higher latency than Win95. +*/ +#define PA_LATENCY_ENV_NAME ("PA_MIN_LATENCY_MSEC") +#define PA_ENV_BUF_SIZE (32) + +static double PaWinDs_GetMinLatencySeconds( double sampleRate ) +{ + char envbuf[PA_ENV_BUF_SIZE]; + DWORD hresult; + double minLatencySeconds = 0; + + /* Let user determine minimal latency by setting environment variable. */ + hresult = GetEnvironmentVariable( PA_LATENCY_ENV_NAME, envbuf, PA_ENV_BUF_SIZE ); + if( (hresult > 0) && (hresult < PA_ENV_BUF_SIZE) ) + { + minLatencySeconds = atoi( envbuf ) * SECONDS_PER_MSEC; + } + else + { + minLatencySeconds = PaWinDS_GetMinSystemLatencySeconds(); +#if PA_USE_HIGH_LATENCY + PRINT(("PA - Minimum Latency set to %f msec!\n", minLatencySeconds * MSECS_PER_SECOND )); +#endif + } + + return minLatencySeconds; +} + + +/************************************************************************************ +** Duplicate the input string using the allocations allocator. +** A NULL string is converted to a zero length string. +** If memory cannot be allocated, NULL is returned. +**/ +static char *DuplicateDeviceNameString( PaUtilAllocationGroup *allocations, const char* src ) +{ + char *result = 0; + + if( src != NULL ) + { + size_t len = strlen(src); + result = (char*)PaUtil_GroupAllocateMemory( allocations, (long)(len + 1) ); + if( result ) + memcpy( (void *) result, src, len+1 ); + } + else + { + result = (char*)PaUtil_GroupAllocateMemory( allocations, 1 ); + if( result ) + result[0] = '\0'; + } + + return result; +} + +/************************************************************************************ +** DSDeviceNameAndGUID, DSDeviceNameAndGUIDVector used for collecting preliminary +** information during device enumeration. +*/ +typedef struct DSDeviceNameAndGUID{ + char *name; // allocated from parent's allocations, never deleted by this structure + GUID guid; + LPGUID lpGUID; + void *pnpInterface; // wchar_t* interface path, allocated using the DS host api's allocation group +} DSDeviceNameAndGUID; + +typedef struct DSDeviceNameAndGUIDVector{ + PaUtilAllocationGroup *allocations; + PaError enumerationError; + + int count; + int free; + DSDeviceNameAndGUID *items; // Allocated using LocalAlloc() +} DSDeviceNameAndGUIDVector; + +typedef struct DSDeviceNamesAndGUIDs{ + PaWinDsHostApiRepresentation *winDsHostApi; + DSDeviceNameAndGUIDVector inputNamesAndGUIDs; + DSDeviceNameAndGUIDVector outputNamesAndGUIDs; +} DSDeviceNamesAndGUIDs; + +static PaError InitializeDSDeviceNameAndGUIDVector( + DSDeviceNameAndGUIDVector *guidVector, PaUtilAllocationGroup *allocations ) +{ + PaError result = paNoError; + + guidVector->allocations = allocations; + guidVector->enumerationError = paNoError; + + guidVector->count = 0; + guidVector->free = 8; + guidVector->items = (DSDeviceNameAndGUID*)LocalAlloc( LMEM_FIXED, sizeof(DSDeviceNameAndGUID) * guidVector->free ); + if( guidVector->items == NULL ) + result = paInsufficientMemory; + + return result; +} + +static PaError ExpandDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *guidVector ) +{ + PaError result = paNoError; + DSDeviceNameAndGUID *newItems; + int i; + + /* double size of vector */ + int size = guidVector->count + guidVector->free; + guidVector->free += size; + + newItems = (DSDeviceNameAndGUID*)LocalAlloc( LMEM_FIXED, sizeof(DSDeviceNameAndGUID) * size * 2 ); + if( newItems == NULL ) + { + result = paInsufficientMemory; + } + else + { + for( i=0; i < guidVector->count; ++i ) + { + newItems[i].name = guidVector->items[i].name; + if( guidVector->items[i].lpGUID == NULL ) + { + newItems[i].lpGUID = NULL; + } + else + { + newItems[i].lpGUID = &newItems[i].guid; + memcpy( &newItems[i].guid, guidVector->items[i].lpGUID, sizeof(GUID) );; + } + newItems[i].pnpInterface = guidVector->items[i].pnpInterface; + } + + LocalFree( guidVector->items ); + guidVector->items = newItems; + } + + return result; +} + +/* + it's safe to call DSDeviceNameAndGUIDVector multiple times +*/ +static PaError TerminateDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *guidVector ) +{ + PaError result = paNoError; + + if( guidVector->items != NULL ) + { + if( LocalFree( guidVector->items ) != NULL ) + result = paInsufficientMemory; /** @todo this isn't the correct error to return from a deallocation failure */ + + guidVector->items = NULL; + } + + return result; +} + +/************************************************************************************ +** Collect preliminary device information during DirectSound enumeration +*/ +static BOOL CALLBACK CollectGUIDsProc(LPGUID lpGUID, + LPCTSTR lpszDesc, + LPCTSTR lpszDrvName, + LPVOID lpContext ) +{ + DSDeviceNameAndGUIDVector *namesAndGUIDs = (DSDeviceNameAndGUIDVector*)lpContext; + PaError error; + + (void) lpszDrvName; /* unused variable */ + + if( namesAndGUIDs->free == 0 ) + { + error = ExpandDSDeviceNameAndGUIDVector( namesAndGUIDs ); + if( error != paNoError ) + { + namesAndGUIDs->enumerationError = error; + return FALSE; + } + } + + /* Set GUID pointer, copy GUID to storage in DSDeviceNameAndGUIDVector. */ + if( lpGUID == NULL ) + { + namesAndGUIDs->items[namesAndGUIDs->count].lpGUID = NULL; + } + else + { + namesAndGUIDs->items[namesAndGUIDs->count].lpGUID = + &namesAndGUIDs->items[namesAndGUIDs->count].guid; + + memcpy( &namesAndGUIDs->items[namesAndGUIDs->count].guid, lpGUID, sizeof(GUID) ); + } + + namesAndGUIDs->items[namesAndGUIDs->count].name = + DuplicateDeviceNameString( namesAndGUIDs->allocations, lpszDesc ); + if( namesAndGUIDs->items[namesAndGUIDs->count].name == NULL ) + { + namesAndGUIDs->enumerationError = paInsufficientMemory; + return FALSE; + } + + namesAndGUIDs->items[namesAndGUIDs->count].pnpInterface = 0; + + ++namesAndGUIDs->count; + --namesAndGUIDs->free; + + return TRUE; +} + + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + +static void *DuplicateWCharString( PaUtilAllocationGroup *allocations, wchar_t *source ) +{ + size_t len; + wchar_t *result; + + len = wcslen( source ); + result = (wchar_t*)PaUtil_GroupAllocateMemory( allocations, (long) ((len+1) * sizeof(wchar_t)) ); + wcscpy( result, source ); + return result; +} + +static BOOL CALLBACK KsPropertySetEnumerateCallback( PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data, LPVOID context ) +{ + int i; + DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs = (DSDeviceNamesAndGUIDs*)context; + + if( data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ) + { + for( i=0; i < deviceNamesAndGUIDs->outputNamesAndGUIDs.count; ++i ) + { + if( deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].lpGUID + && memcmp( &data->DeviceId, deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].lpGUID, sizeof(GUID) ) == 0 ) + { + deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].pnpInterface = + (char*)DuplicateWCharString( deviceNamesAndGUIDs->winDsHostApi->allocations, data->Interface ); + break; + } + } + } + else if( data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ) + { + for( i=0; i < deviceNamesAndGUIDs->inputNamesAndGUIDs.count; ++i ) + { + if( deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].lpGUID + && memcmp( &data->DeviceId, deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].lpGUID, sizeof(GUID) ) == 0 ) + { + deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].pnpInterface = + (char*)DuplicateWCharString( deviceNamesAndGUIDs->winDsHostApi->allocations, data->Interface ); + break; + } + } + } + + return TRUE; +} + + +static GUID pawin_CLSID_DirectSoundPrivate = +{ 0x11ab3ec0, 0x25ec, 0x11d1, 0xa4, 0xd8, 0x00, 0xc0, 0x4f, 0xc2, 0x8a, 0xca }; + +static GUID pawin_DSPROPSETID_DirectSoundDevice = +{ 0x84624f82, 0x25ec, 0x11d1, 0xa4, 0xd8, 0x00, 0xc0, 0x4f, 0xc2, 0x8a, 0xca }; + +static GUID pawin_IID_IKsPropertySet = +{ 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93 }; + + +/* + FindDevicePnpInterfaces fills in the pnpInterface fields in deviceNamesAndGUIDs + with UNICODE file paths to the devices. The DS documentation mentions + at least two techniques by which these Interface paths can be found using IKsPropertySet on + the DirectSound class object. One is using the DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION + property, and the other is using DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE. + I tried both methods and only the second worked. I found two postings on the + net from people who had the same problem with the first method, so I think the method used here is + more common/likely to work. The probem is that IKsPropertySet_Get returns S_OK + but the fields of the device description are not filled in. + + The mechanism we use works by registering an enumeration callback which is called for + every DSound device. Our callback searches for a device in our deviceNamesAndGUIDs list + with the matching GUID and copies the pointer to the Interface path. + Note that we could have used this enumeration callback to perform the original + device enumeration, however we choose not to so we can disable this step easily. + + Apparently the IKsPropertySet mechanism was added in DirectSound 9c 2004 + http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.mmedia/2004-12/0099.html + + -- rossb +*/ +static void FindDevicePnpInterfaces( DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs ) +{ + IClassFactory *pClassFactory; + + if( paWinDsDSoundEntryPoints.DllGetClassObject(&pawin_CLSID_DirectSoundPrivate, &IID_IClassFactory, (PVOID *) &pClassFactory) == S_OK ){ + IKsPropertySet *pPropertySet; + if( pClassFactory->lpVtbl->CreateInstance( pClassFactory, NULL, &pawin_IID_IKsPropertySet, (PVOID *) &pPropertySet) == S_OK ){ + + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data; + ULONG bytesReturned; + + data.Callback = KsPropertySetEnumerateCallback; + data.Context = deviceNamesAndGUIDs; + + IKsPropertySet_Get( pPropertySet, + &pawin_DSPROPSETID_DirectSoundDevice, + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W, + NULL, + 0, + &data, + sizeof(data), + &bytesReturned + ); + + IKsPropertySet_Release( pPropertySet ); + } + pClassFactory->lpVtbl->Release( pClassFactory ); + } + + /* + The following code fragment, which I chose not to use, queries for the + device interface for a device with a specific GUID: + + ULONG BytesReturned; + DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA Property; + + memset (&Property, 0, sizeof(Property)); + Property.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; + Property.DeviceId = *lpGUID; + + hr = IKsPropertySet_Get( pPropertySet, + &pawin_DSPROPSETID_DirectSoundDevice, + DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W, + NULL, + 0, + &Property, + sizeof(Property), + &BytesReturned + ); + + if( hr == S_OK ) + { + //pnpInterface = Property.Interface; + } + */ +} +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + +/* + GUIDs for emulated devices which we blacklist below. + are there more than two of them?? +*/ + +GUID IID_IRolandVSCEmulated1 = {0xc2ad1800, 0xb243, 0x11ce, 0xa8, 0xa4, 0x00, 0xaa, 0x00, 0x6c, 0x45, 0x01}; +GUID IID_IRolandVSCEmulated2 = {0xc2ad1800, 0xb243, 0x11ce, 0xa8, 0xa4, 0x00, 0xaa, 0x00, 0x6c, 0x45, 0x02}; + + +#define PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_ (13) /* must match array length below */ +static double defaultSampleRateSearchOrder_[] = + { 44100.0, 48000.0, 32000.0, 24000.0, 22050.0, 88200.0, 96000.0, 192000.0, + 16000.0, 12000.0, 11025.0, 9600.0, 8000.0 }; + +/************************************************************************************ +** Extract capabilities from an output device, and add it to the device info list +** if successful. This function assumes that there is enough room in the +** device info list to accomodate all entries. +** +** The device will not be added to the device list if any errors are encountered. +*/ +static PaError AddOutputDeviceInfoFromDirectSound( + PaWinDsHostApiRepresentation *winDsHostApi, char *name, LPGUID lpGUID, char *pnpInterface ) +{ + PaUtilHostApiRepresentation *hostApi = &winDsHostApi->inheritedHostApiRep; + PaWinDsDeviceInfo *winDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[hostApi->info.deviceCount]; + PaDeviceInfo *deviceInfo = &winDsDeviceInfo->inheritedDeviceInfo; + HRESULT hr; + LPDIRECTSOUND lpDirectSound; + DSCAPS caps; + int deviceOK = TRUE; + PaError result = paNoError; + int i; + + /* Copy GUID to the device info structure. Set pointer. */ + if( lpGUID == NULL ) + { + winDsDeviceInfo->lpGUID = NULL; + } + else + { + memcpy( &winDsDeviceInfo->guid, lpGUID, sizeof(GUID) ); + winDsDeviceInfo->lpGUID = &winDsDeviceInfo->guid; + } + + if( lpGUID ) + { + if (IsEqualGUID (&IID_IRolandVSCEmulated1,lpGUID) || + IsEqualGUID (&IID_IRolandVSCEmulated2,lpGUID) ) + { + PA_DEBUG(("BLACKLISTED: %s \n",name)); + return paNoError; + } + } + + /* Create a DirectSound object for the specified GUID + Note that using CoCreateInstance doesn't work on windows CE. + */ + hr = paWinDsDSoundEntryPoints.DirectSoundCreate( lpGUID, &lpDirectSound, NULL ); + + /** try using CoCreateInstance because DirectSoundCreate was hanging under + some circumstances - note this was probably related to the + #define BOOL short bug which has now been fixed + @todo delete this comment and the following code once we've ensured + there is no bug. + */ + /* + hr = CoCreateInstance( &CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&lpDirectSound ); + + if( hr == S_OK ) + { + hr = IDirectSound_Initialize( lpDirectSound, lpGUID ); + } + */ + + if( hr != DS_OK ) + { + if (hr == DSERR_ALLOCATED) + PA_DEBUG(("AddOutputDeviceInfoFromDirectSound %s DSERR_ALLOCATED\n",name)); + DBUG(("Cannot create DirectSound for %s. Result = 0x%x\n", name, hr )); + if (lpGUID) + DBUG(("%s's GUID: {0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x, 0x%x} \n", + name, + lpGUID->Data1, + lpGUID->Data2, + lpGUID->Data3, + lpGUID->Data4[0], + lpGUID->Data4[1], + lpGUID->Data4[2], + lpGUID->Data4[3], + lpGUID->Data4[4], + lpGUID->Data4[5], + lpGUID->Data4[6], + lpGUID->Data4[7])); + + deviceOK = FALSE; + } + else + { + /* Query device characteristics. */ + memset( &caps, 0, sizeof(caps) ); + caps.dwSize = sizeof(caps); + hr = IDirectSound_GetCaps( lpDirectSound, &caps ); + if( hr != DS_OK ) + { + DBUG(("Cannot GetCaps() for DirectSound device %s. Result = 0x%x\n", name, hr )); + deviceOK = FALSE; + } + else + { + +#if PA_USE_WMME + if( caps.dwFlags & DSCAPS_EMULDRIVER ) + { + /* If WMME supported, then reject Emulated drivers because they are lousy. */ + deviceOK = FALSE; + } +#endif + + if( deviceOK ) + { + deviceInfo->maxInputChannels = 0; + winDsDeviceInfo->deviceInputChannelCountIsKnown = 1; + + /* DS output capabilities only indicate supported number of channels + using two flags which indicate mono and/or stereo. + We assume that stereo devices may support more than 2 channels + (as is the case with 5.1 devices for example) and so + set deviceOutputChannelCountIsKnown to 0 (unknown). + In this case OpenStream will try to open the device + when the user requests more than 2 channels, rather than + returning an error. + */ + if( caps.dwFlags & DSCAPS_PRIMARYSTEREO ) + { + deviceInfo->maxOutputChannels = 2; + winDsDeviceInfo->deviceOutputChannelCountIsKnown = 0; + } + else + { + deviceInfo->maxOutputChannels = 1; + winDsDeviceInfo->deviceOutputChannelCountIsKnown = 1; + } + + /* Guess channels count from speaker configuration. We do it only when + pnpInterface is NULL or when PAWIN_USE_WDMKS_DEVICE_INFO is undefined. + */ +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if( !pnpInterface ) +#endif + { + DWORD spkrcfg; + if( SUCCEEDED(IDirectSound_GetSpeakerConfig( lpDirectSound, &spkrcfg )) ) + { + int count = 0; + switch (DSSPEAKER_CONFIG(spkrcfg)) + { + case DSSPEAKER_HEADPHONE: count = 2; break; + case DSSPEAKER_MONO: count = 1; break; + case DSSPEAKER_QUAD: count = 4; break; + case DSSPEAKER_STEREO: count = 2; break; + case DSSPEAKER_SURROUND: count = 4; break; + case DSSPEAKER_5POINT1: count = 6; break; + case DSSPEAKER_7POINT1: count = 8; break; +#ifndef DSSPEAKER_7POINT1_SURROUND +#define DSSPEAKER_7POINT1_SURROUND 0x00000008 +#endif + case DSSPEAKER_7POINT1_SURROUND: count = 8; break; +#ifndef DSSPEAKER_5POINT1_SURROUND +#define DSSPEAKER_5POINT1_SURROUND 0x00000009 +#endif + case DSSPEAKER_5POINT1_SURROUND: count = 6; break; + } + if( count ) + { + deviceInfo->maxOutputChannels = count; + winDsDeviceInfo->deviceOutputChannelCountIsKnown = 1; + } + } + } + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if( pnpInterface ) + { + int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( pnpInterface, /* isInput= */ 0 ); + if( count > 0 ) + { + deviceInfo->maxOutputChannels = count; + winDsDeviceInfo->deviceOutputChannelCountIsKnown = 1; + } + } +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + /* initialize defaultSampleRate */ + + if( caps.dwFlags & DSCAPS_CONTINUOUSRATE ) + { + /* initialize to caps.dwMaxSecondarySampleRate incase none of the standard rates match */ + deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate; + + for( i = 0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i ) + { + if( defaultSampleRateSearchOrder_[i] >= caps.dwMinSecondarySampleRate + && defaultSampleRateSearchOrder_[i] <= caps.dwMaxSecondarySampleRate ) + { + deviceInfo->defaultSampleRate = defaultSampleRateSearchOrder_[i]; + break; + } + } + } + else if( caps.dwMinSecondarySampleRate == caps.dwMaxSecondarySampleRate ) + { + if( caps.dwMinSecondarySampleRate == 0 ) + { + /* + ** On my Thinkpad 380Z, DirectSoundV6 returns min-max=0 !! + ** But it supports continuous sampling. + ** So fake range of rates, and hope it really supports it. + */ + deviceInfo->defaultSampleRate = 48000.0f; /* assume 48000 as the default */ + + DBUG(("PA - Reported rates both zero. Setting to fake values for device #%s\n", name )); + } + else + { + deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate; + } + } + else if( (caps.dwMinSecondarySampleRate < 1000.0) && (caps.dwMaxSecondarySampleRate > 50000.0) ) + { + /* The EWS88MT drivers lie, lie, lie. The say they only support two rates, 100 & 100000. + ** But we know that they really support a range of rates! + ** So when we see a ridiculous set of rates, assume it is a range. + */ + deviceInfo->defaultSampleRate = 48000.0f; /* assume 48000 as the default */ + DBUG(("PA - Sample rate range used instead of two odd values for device #%s\n", name )); + } + else deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate; + + //printf( "min %d max %d\n", caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate ); + // dwFlags | DSCAPS_CONTINUOUSRATE + + deviceInfo->defaultLowInputLatency = 0.; + deviceInfo->defaultHighInputLatency = 0.; + + deviceInfo->defaultLowOutputLatency = PaWinDs_GetMinLatencySeconds( deviceInfo->defaultSampleRate ); + deviceInfo->defaultHighOutputLatency = deviceInfo->defaultLowOutputLatency * 2; + } + } + + IDirectSound_Release( lpDirectSound ); + } + + if( deviceOK ) + { + deviceInfo->name = name; + + if( lpGUID == NULL ) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + + hostApi->info.deviceCount++; + } + + return result; +} + + +/************************************************************************************ +** Extract capabilities from an input device, and add it to the device info list +** if successful. This function assumes that there is enough room in the +** device info list to accomodate all entries. +** +** The device will not be added to the device list if any errors are encountered. +*/ +static PaError AddInputDeviceInfoFromDirectSoundCapture( + PaWinDsHostApiRepresentation *winDsHostApi, char *name, LPGUID lpGUID, char *pnpInterface ) +{ + PaUtilHostApiRepresentation *hostApi = &winDsHostApi->inheritedHostApiRep; + PaWinDsDeviceInfo *winDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[hostApi->info.deviceCount]; + PaDeviceInfo *deviceInfo = &winDsDeviceInfo->inheritedDeviceInfo; + HRESULT hr; + LPDIRECTSOUNDCAPTURE lpDirectSoundCapture; + DSCCAPS caps; + int deviceOK = TRUE; + PaError result = paNoError; + + /* Copy GUID to the device info structure. Set pointer. */ + if( lpGUID == NULL ) + { + winDsDeviceInfo->lpGUID = NULL; + } + else + { + winDsDeviceInfo->lpGUID = &winDsDeviceInfo->guid; + memcpy( &winDsDeviceInfo->guid, lpGUID, sizeof(GUID) ); + } + + hr = paWinDsDSoundEntryPoints.DirectSoundCaptureCreate( lpGUID, &lpDirectSoundCapture, NULL ); + + /** try using CoCreateInstance because DirectSoundCreate was hanging under + some circumstances - note this was probably related to the + #define BOOL short bug which has now been fixed + @todo delete this comment and the following code once we've ensured + there is no bug. + */ + /* + hr = CoCreateInstance( &CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSoundCapture, (void**)&lpDirectSoundCapture ); + */ + if( hr != DS_OK ) + { + DBUG(("Cannot create Capture for %s. Result = 0x%x\n", name, hr )); + deviceOK = FALSE; + } + else + { + /* Query device characteristics. */ + memset( &caps, 0, sizeof(caps) ); + caps.dwSize = sizeof(caps); + hr = IDirectSoundCapture_GetCaps( lpDirectSoundCapture, &caps ); + if( hr != DS_OK ) + { + DBUG(("Cannot GetCaps() for Capture device %s. Result = 0x%x\n", name, hr )); + deviceOK = FALSE; + } + else + { +#if PA_USE_WMME + if( caps.dwFlags & DSCAPS_EMULDRIVER ) + { + /* If WMME supported, then reject Emulated drivers because they are lousy. */ + deviceOK = FALSE; + } +#endif + + if( deviceOK ) + { + deviceInfo->maxInputChannels = caps.dwChannels; + winDsDeviceInfo->deviceInputChannelCountIsKnown = 1; + + deviceInfo->maxOutputChannels = 0; + winDsDeviceInfo->deviceOutputChannelCountIsKnown = 1; + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if( pnpInterface ) + { + int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( pnpInterface, /* isInput= */ 1 ); + if( count > 0 ) + { + deviceInfo->maxInputChannels = count; + winDsDeviceInfo->deviceInputChannelCountIsKnown = 1; + } + } +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + +/* constants from a WINE patch by Francois Gouget, see: + http://www.winehq.com/hypermail/wine-patches/2003/01/0290.html + + --- + Date: Fri, 14 May 2004 10:38:12 +0200 (CEST) + From: Francois Gouget + To: Ross Bencina + Subject: Re: Permission to use wine 48/96 wave patch in BSD licensed library + + [snip] + + I give you permission to use the patch below under the BSD license. + http://www.winehq.com/hypermail/wine-patches/2003/01/0290.html + + [snip] +*/ +#ifndef WAVE_FORMAT_48M08 +#define WAVE_FORMAT_48M08 0x00001000 /* 48 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_48S08 0x00002000 /* 48 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_48M16 0x00004000 /* 48 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */ +#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ +#endif + + /* defaultSampleRate */ + if( caps.dwChannels == 2 ) + { + if( caps.dwFormats & WAVE_FORMAT_4S16 ) + deviceInfo->defaultSampleRate = 44100.0; + else if( caps.dwFormats & WAVE_FORMAT_48S16 ) + deviceInfo->defaultSampleRate = 48000.0; + else if( caps.dwFormats & WAVE_FORMAT_2S16 ) + deviceInfo->defaultSampleRate = 22050.0; + else if( caps.dwFormats & WAVE_FORMAT_1S16 ) + deviceInfo->defaultSampleRate = 11025.0; + else if( caps.dwFormats & WAVE_FORMAT_96S16 ) + deviceInfo->defaultSampleRate = 96000.0; + else + deviceInfo->defaultSampleRate = 48000.0; /* assume 48000 as the default */ + } + else if( caps.dwChannels == 1 ) + { + if( caps.dwFormats & WAVE_FORMAT_4M16 ) + deviceInfo->defaultSampleRate = 44100.0; + else if( caps.dwFormats & WAVE_FORMAT_48M16 ) + deviceInfo->defaultSampleRate = 48000.0; + else if( caps.dwFormats & WAVE_FORMAT_2M16 ) + deviceInfo->defaultSampleRate = 22050.0; + else if( caps.dwFormats & WAVE_FORMAT_1M16 ) + deviceInfo->defaultSampleRate = 11025.0; + else if( caps.dwFormats & WAVE_FORMAT_96M16 ) + deviceInfo->defaultSampleRate = 96000.0; + else + deviceInfo->defaultSampleRate = 48000.0; /* assume 48000 as the default */ + } + else deviceInfo->defaultSampleRate = 48000.0; /* assume 48000 as the default */ + + deviceInfo->defaultLowInputLatency = PaWinDs_GetMinLatencySeconds( deviceInfo->defaultSampleRate ); + deviceInfo->defaultHighInputLatency = deviceInfo->defaultLowInputLatency * 2; + + deviceInfo->defaultLowOutputLatency = 0.; + deviceInfo->defaultHighOutputLatency = 0.; + } + } + + IDirectSoundCapture_Release( lpDirectSoundCapture ); + } + + if( deviceOK ) + { + deviceInfo->name = name; + + if( lpGUID == NULL ) + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + + hostApi->info.deviceCount++; + } + + return result; +} + + +/***********************************************************************************/ +PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i, deviceCount; + PaWinDsHostApiRepresentation *winDsHostApi; + DSDeviceNamesAndGUIDs deviceNamesAndGUIDs; + PaWinDsDeviceInfo *deviceInfoArray; + + PaWinDs_InitializeDSoundEntryPoints(); + + /* initialise guid vectors so they can be safely deleted on error */ + deviceNamesAndGUIDs.winDsHostApi = NULL; + deviceNamesAndGUIDs.inputNamesAndGUIDs.items = NULL; + deviceNamesAndGUIDs.outputNamesAndGUIDs.items = NULL; + + winDsHostApi = (PaWinDsHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaWinDsHostApiRepresentation) ); + if( !winDsHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + result = PaWinUtil_CoInitialize( paDirectSound, &winDsHostApi->comInitializationResult ); + if( result != paNoError ) + { + goto error; + } + + winDsHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !winDsHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + *hostApi = &winDsHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paDirectSound; + (*hostApi)->info.name = "Windows DirectSound"; + + (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + + +/* DSound - enumerate devices to count them and to gather their GUIDs */ + + result = InitializeDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs, winDsHostApi->allocations ); + if( result != paNoError ) + goto error; + + result = InitializeDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs, winDsHostApi->allocations ); + if( result != paNoError ) + goto error; + + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA( (LPDSENUMCALLBACK)CollectGUIDsProc, (void *)&deviceNamesAndGUIDs.inputNamesAndGUIDs ); + + paWinDsDSoundEntryPoints.DirectSoundEnumerateA( (LPDSENUMCALLBACK)CollectGUIDsProc, (void *)&deviceNamesAndGUIDs.outputNamesAndGUIDs ); + + if( deviceNamesAndGUIDs.inputNamesAndGUIDs.enumerationError != paNoError ) + { + result = deviceNamesAndGUIDs.inputNamesAndGUIDs.enumerationError; + goto error; + } + + if( deviceNamesAndGUIDs.outputNamesAndGUIDs.enumerationError != paNoError ) + { + result = deviceNamesAndGUIDs.outputNamesAndGUIDs.enumerationError; + goto error; + } + + deviceCount = deviceNamesAndGUIDs.inputNamesAndGUIDs.count + deviceNamesAndGUIDs.outputNamesAndGUIDs.count; + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if( deviceCount > 0 ) + { + deviceNamesAndGUIDs.winDsHostApi = winDsHostApi; + FindDevicePnpInterfaces( &deviceNamesAndGUIDs ); + } +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + if( deviceCount > 0 ) + { + /* allocate array for pointers to PaDeviceInfo structs */ + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + winDsHostApi->allocations, sizeof(PaDeviceInfo*) * deviceCount ); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all PaDeviceInfo structs in a contiguous block */ + deviceInfoArray = (PaWinDsDeviceInfo*)PaUtil_GroupAllocateMemory( + winDsHostApi->allocations, sizeof(PaWinDsDeviceInfo) * deviceCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < deviceCount; ++i ) + { + PaDeviceInfo *deviceInfo = &deviceInfoArray[i].inheritedDeviceInfo; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + deviceInfo->name = 0; + (*hostApi)->deviceInfos[i] = deviceInfo; + } + + for( i=0; i < deviceNamesAndGUIDs.inputNamesAndGUIDs.count; ++i ) + { + result = AddInputDeviceInfoFromDirectSoundCapture( winDsHostApi, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].name, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].lpGUID, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].pnpInterface ); + if( result != paNoError ) + goto error; + } + + for( i=0; i < deviceNamesAndGUIDs.outputNamesAndGUIDs.count; ++i ) + { + result = AddOutputDeviceInfoFromDirectSound( winDsHostApi, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].name, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].lpGUID, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].pnpInterface ); + if( result != paNoError ) + goto error; + } + } + + result = TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs ); + if( result != paNoError ) + goto error; + + result = TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs ); + if( result != paNoError ) + goto error; + + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &winDsHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &winDsHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + return result; + +error: + TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs ); + TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs ); + + Terminate( winDsHostApi ); + + return result; +} + + +/***********************************************************************************/ +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaWinDsHostApiRepresentation *winDsHostApi = (PaWinDsHostApiRepresentation*)hostApi; + + if( winDsHostApi ){ + if( winDsHostApi->allocations ) + { + PaUtil_FreeAllAllocations( winDsHostApi->allocations ); + PaUtil_DestroyAllocationGroup( winDsHostApi->allocations ); + } + + PaWinUtil_CoUninitialize( paDirectSound, &winDsHostApi->comInitializationResult ); + + PaUtil_FreeMemory( winDsHostApi ); + } + + PaWinDs_TerminateDSoundEntryPoints(); +} + +static PaError ValidateWinDirectSoundSpecificStreamInfo( + const PaStreamParameters *streamParameters, + const PaWinDirectSoundStreamInfo *streamInfo ) +{ + if( streamInfo ) + { + if( streamInfo->size != sizeof( PaWinDirectSoundStreamInfo ) + || streamInfo->version != 2 ) + { + return paIncompatibleHostApiSpecificStreamInfo; + } + } + + return paNoError; +} + +/***********************************************************************************/ +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaError result; + PaWinDsDeviceInfo *inputWinDsDeviceInfo, *outputWinDsDeviceInfo; + PaDeviceInfo *inputDeviceInfo, *outputDeviceInfo; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaWinDirectSoundStreamInfo *inputStreamInfo, *outputStreamInfo; + + if( inputParameters ) + { + inputWinDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[ inputParameters->device ]; + inputDeviceInfo = &inputWinDsDeviceInfo->inheritedDeviceInfo; + + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputWinDsDeviceInfo->deviceInputChannelCountIsKnown + && inputChannelCount > inputDeviceInfo->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + inputStreamInfo = (PaWinDirectSoundStreamInfo*)inputParameters->hostApiSpecificStreamInfo; + result = ValidateWinDirectSoundSpecificStreamInfo( inputParameters, inputStreamInfo ); + if( result != paNoError ) return result; + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputWinDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[ outputParameters->device ]; + outputDeviceInfo = &outputWinDsDeviceInfo->inheritedDeviceInfo; + + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputWinDsDeviceInfo->deviceOutputChannelCountIsKnown + && outputChannelCount > outputDeviceInfo->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + outputStreamInfo = (PaWinDirectSoundStreamInfo*)outputParameters->hostApiSpecificStreamInfo; + result = ValidateWinDirectSoundSpecificStreamInfo( outputParameters, outputStreamInfo ); + if( result != paNoError ) return result; + } + else + { + outputChannelCount = 0; + } + + /* + IMPLEMENT ME: + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported if necessary + + - check that the device supports sampleRate + + Because the buffer adapter handles conversion between all standard + sample formats, the following checks are only required if paCustomFormat + is implemented, or under some other unusual conditions. + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + */ + + return paFormatIsSupported; +} + + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE +static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, + PaWinDsDeviceInfo *inputDevice, + PaSampleFormat hostInputSampleFormat, + WORD inputChannelCount, + int bytesPerInputBuffer, + PaWinWaveFormatChannelMask inputChannelMask, + PaWinDsDeviceInfo *outputDevice, + PaSampleFormat hostOutputSampleFormat, + WORD outputChannelCount, + int bytesPerOutputBuffer, + PaWinWaveFormatChannelMask outputChannelMask, + unsigned long nFrameRate + ) +{ + HRESULT hr; + DSCBUFFERDESC captureDesc; + PaWinWaveFormat captureWaveFormat; + DSBUFFERDESC secondaryRenderDesc; + PaWinWaveFormat renderWaveFormat; + LPDIRECTSOUNDBUFFER8 pRenderBuffer8; + LPDIRECTSOUNDCAPTUREBUFFER8 pCaptureBuffer8; + + // capture buffer description + + // only try wave format extensible. assume it's available on all ds 8 systems + PaWin_InitializeWaveFormatExtensible( &captureWaveFormat, inputChannelCount, + hostInputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( hostInputSampleFormat ), + nFrameRate, inputChannelMask ); + + ZeroMemory(&captureDesc, sizeof(DSCBUFFERDESC)); + captureDesc.dwSize = sizeof(DSCBUFFERDESC); + captureDesc.dwFlags = 0; + captureDesc.dwBufferBytes = bytesPerInputBuffer; + captureDesc.lpwfxFormat = (WAVEFORMATEX*)&captureWaveFormat; + + // render buffer description + + PaWin_InitializeWaveFormatExtensible( &renderWaveFormat, outputChannelCount, + hostOutputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( hostOutputSampleFormat ), + nFrameRate, outputChannelMask ); + + ZeroMemory(&secondaryRenderDesc, sizeof(DSBUFFERDESC)); + secondaryRenderDesc.dwSize = sizeof(DSBUFFERDESC); + secondaryRenderDesc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; + secondaryRenderDesc.dwBufferBytes = bytesPerOutputBuffer; + secondaryRenderDesc.lpwfxFormat = (WAVEFORMATEX*)&renderWaveFormat; + + /* note that we don't create a primary buffer here at all */ + + hr = paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8( + inputDevice->lpGUID, outputDevice->lpGUID, + &captureDesc, &secondaryRenderDesc, + GetDesktopWindow(), /* see InitOutputBuffer() for a discussion of whether this is a good idea */ + DSSCL_EXCLUSIVE, + &stream->pDirectSoundFullDuplex8, + &pCaptureBuffer8, + &pRenderBuffer8, + NULL /* pUnkOuter must be NULL */ + ); + + if( hr == DS_OK ) + { + PA_DEBUG(("DirectSoundFullDuplexCreate succeeded!\n")); + + /* retrieve the pre ds 8 buffer interfaces which are used by the rest of the code */ + + hr = IUnknown_QueryInterface( pCaptureBuffer8, &IID_IDirectSoundCaptureBuffer, (LPVOID *)&stream->pDirectSoundInputBuffer ); + + if( hr == DS_OK ) + hr = IUnknown_QueryInterface( pRenderBuffer8, &IID_IDirectSoundBuffer, (LPVOID *)&stream->pDirectSoundOutputBuffer ); + + /* release the ds 8 interfaces, we don't need them */ + IUnknown_Release( pCaptureBuffer8 ); + IUnknown_Release( pRenderBuffer8 ); + + if( !stream->pDirectSoundInputBuffer || !stream->pDirectSoundOutputBuffer ){ + /* couldn't get pre ds 8 interfaces for some reason. clean up. */ + if( stream->pDirectSoundInputBuffer ) + { + IUnknown_Release( stream->pDirectSoundInputBuffer ); + stream->pDirectSoundInputBuffer = NULL; + } + + if( stream->pDirectSoundOutputBuffer ) + { + IUnknown_Release( stream->pDirectSoundOutputBuffer ); + stream->pDirectSoundOutputBuffer = NULL; + } + + IUnknown_Release( stream->pDirectSoundFullDuplex8 ); + stream->pDirectSoundFullDuplex8 = NULL; + } + } + else + { + PA_DEBUG(("DirectSoundFullDuplexCreate failed. hr=%d\n", hr)); + } + + return hr; +} +#endif /* PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE */ + + +static HRESULT InitInputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *device, PaSampleFormat sampleFormat, unsigned long nFrameRate, WORD nChannels, int bytesPerBuffer, PaWinWaveFormatChannelMask channelMask ) +{ + DSCBUFFERDESC captureDesc; + PaWinWaveFormat waveFormat; + HRESULT result; + + if( (result = paWinDsDSoundEntryPoints.DirectSoundCaptureCreate( + device->lpGUID, &stream->pDirectSoundCapture, NULL) ) != DS_OK ){ + ERR_RPT(("PortAudio: DirectSoundCaptureCreate() failed!\n")); + return result; + } + + // Setup the secondary buffer description + ZeroMemory(&captureDesc, sizeof(DSCBUFFERDESC)); + captureDesc.dwSize = sizeof(DSCBUFFERDESC); + captureDesc.dwFlags = 0; + captureDesc.dwBufferBytes = bytesPerBuffer; + captureDesc.lpwfxFormat = (WAVEFORMATEX*)&waveFormat; + + // Create the capture buffer + + // first try WAVEFORMATEXTENSIBLE. if this fails, fall back to WAVEFORMATEX + PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, + sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), + nFrameRate, channelMask ); + + if( IDirectSoundCapture_CreateCaptureBuffer( stream->pDirectSoundCapture, + &captureDesc, &stream->pDirectSoundInputBuffer, NULL) != DS_OK ) + { + PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, + PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate ); + + if ((result = IDirectSoundCapture_CreateCaptureBuffer( stream->pDirectSoundCapture, + &captureDesc, &stream->pDirectSoundInputBuffer, NULL)) != DS_OK) return result; + } + + stream->readOffset = 0; // reset last read position to start of buffer + return DS_OK; +} + + +static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *device, PaSampleFormat sampleFormat, unsigned long nFrameRate, WORD nChannels, int bytesPerBuffer, PaWinWaveFormatChannelMask channelMask ) +{ + HRESULT result; + HWND hWnd; + HRESULT hr; + PaWinWaveFormat waveFormat; + DSBUFFERDESC primaryDesc; + DSBUFFERDESC secondaryDesc; + + if( (hr = paWinDsDSoundEntryPoints.DirectSoundCreate( + device->lpGUID, &stream->pDirectSound, NULL )) != DS_OK ){ + ERR_RPT(("PortAudio: DirectSoundCreate() failed!\n")); + return hr; + } + + // We were using getForegroundWindow() but sometimes the ForegroundWindow may not be the + // applications's window. Also if that window is closed before the Buffer is closed + // then DirectSound can crash. (Thanks for Scott Patterson for reporting this.) + // So we will use GetDesktopWindow() which was suggested by Miller Puckette. + // hWnd = GetForegroundWindow(); + // + // FIXME: The example code I have on the net creates a hidden window that + // is managed by our code - I think we should do that - one hidden + // window for the whole of Pa_DS + // + hWnd = GetDesktopWindow(); + + // Set cooperative level to DSSCL_EXCLUSIVE so that we can get 16 bit output, 44.1 KHz. + // exclusive also prevents unexpected sounds from other apps during a performance. + if ((hr = IDirectSound_SetCooperativeLevel( stream->pDirectSound, + hWnd, DSSCL_EXCLUSIVE)) != DS_OK) + { + return hr; + } + + // ----------------------------------------------------------------------- + // Create primary buffer and set format just so we can specify our custom format. + // Otherwise we would be stuck with the default which might be 8 bit or 22050 Hz. + // Setup the primary buffer description + ZeroMemory(&primaryDesc, sizeof(DSBUFFERDESC)); + primaryDesc.dwSize = sizeof(DSBUFFERDESC); + primaryDesc.dwFlags = DSBCAPS_PRIMARYBUFFER; // all panning, mixing, etc done by synth + primaryDesc.dwBufferBytes = 0; + primaryDesc.lpwfxFormat = NULL; + // Create the buffer + if ((result = IDirectSound_CreateSoundBuffer( stream->pDirectSound, + &primaryDesc, &stream->pDirectSoundPrimaryBuffer, NULL)) != DS_OK) + goto error; + + // Set the primary buffer's format + + // first try WAVEFORMATEXTENSIBLE. if this fails, fall back to WAVEFORMATEX + PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, + sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), + nFrameRate, channelMask ); + + if( IDirectSoundBuffer_SetFormat( stream->pDirectSoundPrimaryBuffer, (WAVEFORMATEX*)&waveFormat) != DS_OK ) + { + PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, + PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate ); + + if((result = IDirectSoundBuffer_SetFormat( stream->pDirectSoundPrimaryBuffer, (WAVEFORMATEX*)&waveFormat)) != DS_OK) + goto error; + } + + // ---------------------------------------------------------------------- + // Setup the secondary buffer description + ZeroMemory(&secondaryDesc, sizeof(DSBUFFERDESC)); + secondaryDesc.dwSize = sizeof(DSBUFFERDESC); + secondaryDesc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; + secondaryDesc.dwBufferBytes = bytesPerBuffer; + secondaryDesc.lpwfxFormat = (WAVEFORMATEX*)&waveFormat; /* waveFormat contains whatever format was negotiated for the primary buffer above */ + // Create the secondary buffer + if ((result = IDirectSound_CreateSoundBuffer( stream->pDirectSound, + &secondaryDesc, &stream->pDirectSoundOutputBuffer, NULL)) != DS_OK) + goto error; + + return DS_OK; + +error: + + if( stream->pDirectSoundPrimaryBuffer ) + { + IDirectSoundBuffer_Release( stream->pDirectSoundPrimaryBuffer ); + stream->pDirectSoundPrimaryBuffer = NULL; + } + + return result; +} + + +static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, + unsigned long *pollingPeriodFrames, + int isFullDuplex, + unsigned long suggestedInputLatencyFrames, + unsigned long suggestedOutputLatencyFrames, + double sampleRate, unsigned long userFramesPerBuffer ) +{ + /* we allow the polling period to range between 1 and 100ms. + prior to August 2011 we limited the minimum polling period to 10ms. + */ + unsigned long minimumPollingPeriodFrames = sampleRate / 1000; /* 1ms */ + unsigned long maximumPollingPeriodFrames = sampleRate / 10; /* 100ms */ + unsigned long pollingJitterFrames = sampleRate / 1000; /* 1ms */ + + if( userFramesPerBuffer == paFramesPerBufferUnspecified ) + { + unsigned long targetBufferingLatencyFrames = max( suggestedInputLatencyFrames, suggestedOutputLatencyFrames ); + + *pollingPeriodFrames = targetBufferingLatencyFrames / 4; + if( *pollingPeriodFrames < minimumPollingPeriodFrames ) + { + *pollingPeriodFrames = minimumPollingPeriodFrames; + } + else if( *pollingPeriodFrames > maximumPollingPeriodFrames ) + { + *pollingPeriodFrames = maximumPollingPeriodFrames; + } + + *hostBufferSizeFrames = *pollingPeriodFrames + + max( *pollingPeriodFrames + pollingJitterFrames, targetBufferingLatencyFrames); + } + else + { + unsigned long targetBufferingLatencyFrames = suggestedInputLatencyFrames; + if( isFullDuplex ) + { + /* In full duplex streams we know that the buffer adapter adds userFramesPerBuffer + extra fixed latency. so we subtract it here as a fixed latency before computing + the buffer size. being careful not to produce an unrepresentable negative result. + + Note: this only works as expected if output latency is greater than input latency. + Otherwise we use input latency anyway since we do max(in,out). + */ + + if( userFramesPerBuffer < suggestedOutputLatencyFrames ) + { + unsigned long adjustedSuggestedOutputLatencyFrames = + suggestedOutputLatencyFrames - userFramesPerBuffer; + + /* maximum of input and adjusted output suggested latency */ + if( adjustedSuggestedOutputLatencyFrames > targetBufferingLatencyFrames ) + targetBufferingLatencyFrames = adjustedSuggestedOutputLatencyFrames; + } + } + else + { + /* maximum of input and output suggested latency */ + if( suggestedOutputLatencyFrames > suggestedInputLatencyFrames ) + targetBufferingLatencyFrames = suggestedOutputLatencyFrames; + } + + *hostBufferSizeFrames = userFramesPerBuffer + + max( userFramesPerBuffer + pollingJitterFrames, targetBufferingLatencyFrames); + + *pollingPeriodFrames = max( max(1, userFramesPerBuffer / 4), targetBufferingLatencyFrames / 16 ); + + if( *pollingPeriodFrames > maximumPollingPeriodFrames ) + { + *pollingPeriodFrames = maximumPollingPeriodFrames; + } + } +} + + +static void SetStreamInfoLatencies( PaWinDsStream *stream, + unsigned long userFramesPerBuffer, + unsigned long pollingPeriodFrames, + double sampleRate ) +{ + /* compute the stream info actual latencies based on framesPerBuffer, polling period, hostBufferSizeFrames, + and the configuration of the buffer processor */ + + unsigned long effectiveFramesPerBuffer = (userFramesPerBuffer == paFramesPerBufferUnspecified) + ? pollingPeriodFrames + : userFramesPerBuffer; + + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + /* stream info input latency is the minimum buffering latency + (unlike suggested and default which are *maximums*) */ + stream->streamRepresentation.streamInfo.inputLatency = + (double)(PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) + + effectiveFramesPerBuffer) / sampleRate; + } + else + { + stream->streamRepresentation.streamInfo.inputLatency = 0; + } + + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + stream->streamRepresentation.streamInfo.outputLatency = + (double)(PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) + + (stream->hostBufferSizeFrames - effectiveFramesPerBuffer)) / sampleRate; + } + else + { + stream->streamRepresentation.streamInfo.outputLatency = 0; + } +} + + +/***********************************************************************************/ +/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */ + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaWinDsHostApiRepresentation *winDsHostApi = (PaWinDsHostApiRepresentation*)hostApi; + PaWinDsStream *stream = 0; + int bufferProcessorIsInitialized = 0; + int streamRepresentationIsInitialized = 0; + PaWinDsDeviceInfo *inputWinDsDeviceInfo, *outputWinDsDeviceInfo; + PaDeviceInfo *inputDeviceInfo, *outputDeviceInfo; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + unsigned long suggestedInputLatencyFrames, suggestedOutputLatencyFrames; + PaWinDirectSoundStreamInfo *inputStreamInfo, *outputStreamInfo; + PaWinWaveFormatChannelMask inputChannelMask, outputChannelMask; + unsigned long pollingPeriodFrames = 0; + + if( inputParameters ) + { + inputWinDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[ inputParameters->device ]; + inputDeviceInfo = &inputWinDsDeviceInfo->inheritedDeviceInfo; + + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + suggestedInputLatencyFrames = (unsigned long)(inputParameters->suggestedLatency * sampleRate); + + /* IDEA: the following 3 checks could be performed by default by pa_front + unless some flag indicated otherwise */ + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputWinDsDeviceInfo->deviceInputChannelCountIsKnown + && inputChannelCount > inputDeviceInfo->maxInputChannels ) + return paInvalidChannelCount; + + /* validate hostApiSpecificStreamInfo */ + inputStreamInfo = (PaWinDirectSoundStreamInfo*)inputParameters->hostApiSpecificStreamInfo; + result = ValidateWinDirectSoundSpecificStreamInfo( inputParameters, inputStreamInfo ); + if( result != paNoError ) return result; + + if( inputStreamInfo && inputStreamInfo->flags & paWinDirectSoundUseChannelMask ) + inputChannelMask = inputStreamInfo->channelMask; + else + inputChannelMask = PaWin_DefaultChannelMask( inputChannelCount ); + } + else + { + inputChannelCount = 0; + inputSampleFormat = 0; + suggestedInputLatencyFrames = 0; + } + + + if( outputParameters ) + { + outputWinDsDeviceInfo = (PaWinDsDeviceInfo*) hostApi->deviceInfos[ outputParameters->device ]; + outputDeviceInfo = &outputWinDsDeviceInfo->inheritedDeviceInfo; + + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + suggestedOutputLatencyFrames = (unsigned long)(outputParameters->suggestedLatency * sampleRate); + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support outputChannelCount */ + if( outputWinDsDeviceInfo->deviceOutputChannelCountIsKnown + && outputChannelCount > outputDeviceInfo->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate hostApiSpecificStreamInfo */ + outputStreamInfo = (PaWinDirectSoundStreamInfo*)outputParameters->hostApiSpecificStreamInfo; + result = ValidateWinDirectSoundSpecificStreamInfo( outputParameters, outputStreamInfo ); + if( result != paNoError ) return result; + + if( outputStreamInfo && outputStreamInfo->flags & paWinDirectSoundUseChannelMask ) + outputChannelMask = outputStreamInfo->channelMask; + else + outputChannelMask = PaWin_DefaultChannelMask( outputChannelCount ); + } + else + { + outputChannelCount = 0; + outputSampleFormat = 0; + suggestedOutputLatencyFrames = 0; + } + + + /* + IMPLEMENT ME: + + ( the following two checks are taken care of by PaUtil_InitializeBufferProcessor() ) + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + + - check that the device supports sampleRate + + - alter sampleRate to a close allowable rate if possible / necessary + + - validate suggestedInputLatency and suggestedOutputLatency parameters, + use default values where necessary + */ + + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + + stream = (PaWinDsStream*)PaUtil_AllocateMemory( sizeof(PaWinDsStream) ); + if( !stream ) + { + result = paInsufficientMemory; + goto error; + } + + memset( stream, 0, sizeof(PaWinDsStream) ); /* initialize all stream variables to 0 */ + + if( streamCallback ) + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &winDsHostApi->callbackStreamInterface, streamCallback, userData ); + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &winDsHostApi->blockingStreamInterface, streamCallback, userData ); + } + + streamRepresentationIsInitialized = 1; + + stream->streamFlags = streamFlags; + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + + if( inputParameters ) + { + /* IMPLEMENT ME - establish which host formats are available */ + PaSampleFormat nativeInputFormats = paInt16; + /* PaSampleFormat nativeFormats = paUInt8 | paInt16 | paInt24 | paInt32 | paFloat32; */ + + hostInputSampleFormat = + PaUtil_SelectClosestAvailableFormat( nativeInputFormats, inputParameters->sampleFormat ); + } + else + { + hostInputSampleFormat = 0; + } + + if( outputParameters ) + { + /* IMPLEMENT ME - establish which host formats are available */ + PaSampleFormat nativeOutputFormats = paInt16; + /* PaSampleFormat nativeOutputFormats = paUInt8 | paInt16 | paInt24 | paInt32 | paFloat32; */ + + hostOutputSampleFormat = + PaUtil_SelectClosestAvailableFormat( nativeOutputFormats, outputParameters->sampleFormat ); + } + else + { + hostOutputSampleFormat = 0; + } + + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, hostInputSampleFormat, + outputChannelCount, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, framesPerBuffer, + 0, /* ignored in paUtilVariableHostBufferSizePartialUsageAllowed mode. */ + /* This next mode is required because DS can split the host buffer when it wraps around. */ + paUtilVariableHostBufferSizePartialUsageAllowed, + streamCallback, userData ); + if( result != paNoError ) + goto error; + + bufferProcessorIsInitialized = 1; + + +/* DirectSound specific initialization */ + { + HRESULT hr; + unsigned long integerSampleRate = (unsigned long) (sampleRate + 0.5); + + stream->processingCompleted = CreateEvent( NULL, /* bManualReset = */ TRUE, /* bInitialState = */ FALSE, NULL ); + if( stream->processingCompleted == NULL ) + { + result = paInsufficientMemory; + goto error; + } + +#ifdef PA_WIN_DS_USE_WMME_TIMER + stream->timerID = 0; +#endif + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + stream->waitableTimer = (HANDLE)CreateWaitableTimer( 0, FALSE, NULL ); + if( stream->waitableTimer == NULL ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( GetLastError() ); + goto error; + } +#endif + +#ifndef PA_WIN_DS_USE_WMME_TIMER + stream->processingThreadCompleted = CreateEvent( NULL, /* bManualReset = */ TRUE, /* bInitialState = */ FALSE, NULL ); + if( stream->processingThreadCompleted == NULL ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( GetLastError() ); + goto error; + } +#endif + + /* set up i/o parameters */ + + CalculateBufferSettings( &stream->hostBufferSizeFrames, &pollingPeriodFrames, + /* isFullDuplex = */ (inputParameters && outputParameters), + suggestedInputLatencyFrames, + suggestedOutputLatencyFrames, + sampleRate, framesPerBuffer ); + + stream->pollingPeriodSeconds = pollingPeriodFrames / sampleRate; + + /* ------------------ OUTPUT */ + if( outputParameters ) + { + LARGE_INTEGER counterFrequency; + + /* + PaDeviceInfo *deviceInfo = hostApi->deviceInfos[ outputParameters->device ]; + DBUG(("PaHost_OpenStream: deviceID = 0x%x\n", outputParameters->device)); + */ + + int sampleSizeBytes = Pa_GetSampleSize(hostOutputSampleFormat); + stream->outputFrameSizeBytes = outputParameters->channelCount * sampleSizeBytes; + + stream->outputBufferSizeBytes = stream->hostBufferSizeFrames * stream->outputFrameSizeBytes; + if( stream->outputBufferSizeBytes < DSBSIZE_MIN ) + { + result = paBufferTooSmall; + goto error; + } + else if( stream->outputBufferSizeBytes > DSBSIZE_MAX ) + { + result = paBufferTooBig; + goto error; + } + + /* Calculate value used in latency calculation to avoid real-time divides. */ + stream->secondsPerHostByte = 1.0 / + (stream->bufferProcessor.bytesPerHostOutputSample * + outputChannelCount * sampleRate); + + stream->outputIsRunning = FALSE; + stream->outputUnderflowCount = 0; + + /* perfCounterTicksPerBuffer is used by QueryOutputSpace for overflow detection */ + if( QueryPerformanceFrequency( &counterFrequency ) ) + { + stream->perfCounterTicksPerBuffer.QuadPart = (counterFrequency.QuadPart * stream->hostBufferSizeFrames) / integerSampleRate; + } + else + { + stream->perfCounterTicksPerBuffer.QuadPart = 0; + } + } + + /* ------------------ INPUT */ + if( inputParameters ) + { + /* + PaDeviceInfo *deviceInfo = hostApi->deviceInfos[ inputParameters->device ]; + DBUG(("PaHost_OpenStream: deviceID = 0x%x\n", inputParameters->device)); + */ + + int sampleSizeBytes = Pa_GetSampleSize(hostInputSampleFormat); + stream->inputFrameSizeBytes = inputParameters->channelCount * sampleSizeBytes; + + stream->inputBufferSizeBytes = stream->hostBufferSizeFrames * stream->inputFrameSizeBytes; + if( stream->inputBufferSizeBytes < DSBSIZE_MIN ) + { + result = paBufferTooSmall; + goto error; + } + else if( stream->inputBufferSizeBytes > DSBSIZE_MAX ) + { + result = paBufferTooBig; + goto error; + } + } + + /* open/create the DirectSound buffers */ + + /* interface ptrs should be zeroed when stream is zeroed. */ + assert( stream->pDirectSoundCapture == NULL ); + assert( stream->pDirectSoundInputBuffer == NULL ); + assert( stream->pDirectSound == NULL ); + assert( stream->pDirectSoundPrimaryBuffer == NULL ); + assert( stream->pDirectSoundOutputBuffer == NULL ); + + + if( inputParameters && outputParameters ) + { +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + /* try to use the full-duplex DX8 API to create the buffers. + if that fails we fall back to the half-duplex API below */ + + hr = InitFullDuplexInputOutputBuffers( stream, + (PaWinDsDeviceInfo*)hostApi->deviceInfos[inputParameters->device], + hostInputSampleFormat, + (WORD)inputParameters->channelCount, stream->inputBufferSizeBytes, + inputChannelMask, + (PaWinDsDeviceInfo*)hostApi->deviceInfos[outputParameters->device], + hostOutputSampleFormat, + (WORD)outputParameters->channelCount, stream->outputBufferSizeBytes, + outputChannelMask, + integerSampleRate + ); + DBUG(("InitFullDuplexInputOutputBuffers() returns %x\n", hr)); + /* ignore any error returned by InitFullDuplexInputOutputBuffers. + we retry opening the buffers below */ +#endif /* PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE */ + } + + /* create half duplex buffers. also used for full-duplex streams which didn't + succeed when using the full duplex API. that could happen because + DX8 or greater isnt installed, the i/o devices aren't the same + physical device. etc. + */ + + if( outputParameters && !stream->pDirectSoundOutputBuffer ) + { + hr = InitOutputBuffer( stream, + (PaWinDsDeviceInfo*)hostApi->deviceInfos[outputParameters->device], + hostOutputSampleFormat, + integerSampleRate, + (WORD)outputParameters->channelCount, stream->outputBufferSizeBytes, + outputChannelMask ); + DBUG(("InitOutputBuffer() returns %x\n", hr)); + if( hr != DS_OK ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ); + goto error; + } + } + + if( inputParameters && !stream->pDirectSoundInputBuffer ) + { + hr = InitInputBuffer( stream, + (PaWinDsDeviceInfo*)hostApi->deviceInfos[inputParameters->device], + hostInputSampleFormat, + integerSampleRate, + (WORD)inputParameters->channelCount, stream->inputBufferSizeBytes, + inputChannelMask ); + DBUG(("InitInputBuffer() returns %x\n", hr)); + if( hr != DS_OK ) + { + ERR_RPT(("PortAudio: DSW_InitInputBuffer() returns %x\n", hr)); + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ); + goto error; + } + } + } + + SetStreamInfoLatencies( stream, framesPerBuffer, pollingPeriodFrames, sampleRate ); + + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + *s = (PaStream*)stream; + + return result; + +error: + if( stream ) + { + if( stream->processingCompleted != NULL ) + CloseHandle( stream->processingCompleted ); + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + if( stream->waitableTimer != NULL ) + CloseHandle( stream->waitableTimer ); +#endif + +#ifndef PA_WIN_DS_USE_WMME_TIMER + if( stream->processingThreadCompleted != NULL ) + CloseHandle( stream->processingThreadCompleted ); +#endif + + if( stream->pDirectSoundOutputBuffer ) + { + IDirectSoundBuffer_Stop( stream->pDirectSoundOutputBuffer ); + IDirectSoundBuffer_Release( stream->pDirectSoundOutputBuffer ); + stream->pDirectSoundOutputBuffer = NULL; + } + + if( stream->pDirectSoundPrimaryBuffer ) + { + IDirectSoundBuffer_Release( stream->pDirectSoundPrimaryBuffer ); + stream->pDirectSoundPrimaryBuffer = NULL; + } + + if( stream->pDirectSoundInputBuffer ) + { + IDirectSoundCaptureBuffer_Stop( stream->pDirectSoundInputBuffer ); + IDirectSoundCaptureBuffer_Release( stream->pDirectSoundInputBuffer ); + stream->pDirectSoundInputBuffer = NULL; + } + + if( stream->pDirectSoundCapture ) + { + IDirectSoundCapture_Release( stream->pDirectSoundCapture ); + stream->pDirectSoundCapture = NULL; + } + + if( stream->pDirectSound ) + { + IDirectSound_Release( stream->pDirectSound ); + stream->pDirectSound = NULL; + } + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + if( stream->pDirectSoundFullDuplex8 ) + { + IDirectSoundFullDuplex_Release( stream->pDirectSoundFullDuplex8 ); + stream->pDirectSoundFullDuplex8 = NULL; + } +#endif + if( bufferProcessorIsInitialized ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( streamRepresentationIsInitialized ) + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + + PaUtil_FreeMemory( stream ); + } + + return result; +} + + +/************************************************************************************ + * Determine how much space can be safely written to in DS buffer. + * Detect underflows and overflows. + * Does not allow writing into safety gap maintained by DirectSound. + */ +static HRESULT QueryOutputSpace( PaWinDsStream *stream, long *bytesEmpty ) +{ + HRESULT hr; + DWORD playCursor; + DWORD writeCursor; + long numBytesEmpty; + long playWriteGap; + // Query to see how much room is in buffer. + hr = IDirectSoundBuffer_GetCurrentPosition( stream->pDirectSoundOutputBuffer, + &playCursor, &writeCursor ); + if( hr != DS_OK ) + { + return hr; + } + + // Determine size of gap between playIndex and WriteIndex that we cannot write into. + playWriteGap = writeCursor - playCursor; + if( playWriteGap < 0 ) playWriteGap += stream->outputBufferSizeBytes; // unwrap + + /* DirectSound doesn't have a large enough playCursor so we cannot detect wrap-around. */ + /* Attempt to detect playCursor wrap-around and correct it. */ + if( stream->outputIsRunning && (stream->perfCounterTicksPerBuffer.QuadPart != 0) ) + { + /* How much time has elapsed since last check. */ + LARGE_INTEGER currentTime; + LARGE_INTEGER elapsedTime; + long bytesPlayed; + long bytesExpected; + long buffersWrapped; + + QueryPerformanceCounter( ¤tTime ); + elapsedTime.QuadPart = currentTime.QuadPart - stream->previousPlayTime.QuadPart; + stream->previousPlayTime = currentTime; + + /* How many bytes does DirectSound say have been played. */ + bytesPlayed = playCursor - stream->previousPlayCursor; + if( bytesPlayed < 0 ) bytesPlayed += stream->outputBufferSizeBytes; // unwrap + stream->previousPlayCursor = playCursor; + + /* Calculate how many bytes we would have expected to been played by now. */ + bytesExpected = (long) ((elapsedTime.QuadPart * stream->outputBufferSizeBytes) / stream->perfCounterTicksPerBuffer.QuadPart); + buffersWrapped = (bytesExpected - bytesPlayed) / stream->outputBufferSizeBytes; + if( buffersWrapped > 0 ) + { + playCursor += (buffersWrapped * stream->outputBufferSizeBytes); + bytesPlayed += (buffersWrapped * stream->outputBufferSizeBytes); + } + } + numBytesEmpty = playCursor - stream->outputBufferWriteOffsetBytes; + if( numBytesEmpty < 0 ) numBytesEmpty += stream->outputBufferSizeBytes; // unwrap offset + + /* Have we underflowed? */ + if( numBytesEmpty > (stream->outputBufferSizeBytes - playWriteGap) ) + { + if( stream->outputIsRunning ) + { + stream->outputUnderflowCount += 1; + } + + /* + From MSDN: + The write cursor indicates the position at which it is safe + to write new data to the buffer. The write cursor always leads the + play cursor, typically by about 15 milliseconds' worth of audio + data. + It is always safe to change data that is behind the position + indicated by the lpdwCurrentPlayCursor parameter. + */ + + stream->outputBufferWriteOffsetBytes = writeCursor; + numBytesEmpty = stream->outputBufferSizeBytes - playWriteGap; + } + *bytesEmpty = numBytesEmpty; + return hr; +} + +/***********************************************************************************/ +static int TimeSlice( PaWinDsStream *stream ) +{ + long numFrames = 0; + long bytesEmpty = 0; + long bytesFilled = 0; + long bytesToXfer = 0; + long framesToXfer = 0; /* the number of frames we'll process this tick */ + long numInFramesReady = 0; + long numOutFramesReady = 0; + long bytesProcessed; + HRESULT hresult; + double outputLatency = 0; + double inputLatency = 0; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; + +/* Input */ + LPBYTE lpInBuf1 = NULL; + LPBYTE lpInBuf2 = NULL; + DWORD dwInSize1 = 0; + DWORD dwInSize2 = 0; +/* Output */ + LPBYTE lpOutBuf1 = NULL; + LPBYTE lpOutBuf2 = NULL; + DWORD dwOutSize1 = 0; + DWORD dwOutSize2 = 0; + + /* How much input data is available? */ + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + HRESULT hr; + DWORD capturePos; + DWORD readPos; + long filled = 0; + // Query to see how much data is in buffer. + // We don't need the capture position but sometimes DirectSound doesn't handle NULLS correctly + // so let's pass a pointer just to be safe. + hr = IDirectSoundCaptureBuffer_GetCurrentPosition( stream->pDirectSoundInputBuffer, &capturePos, &readPos ); + if( hr == DS_OK ) + { + filled = readPos - stream->readOffset; + if( filled < 0 ) filled += stream->inputBufferSizeBytes; // unwrap offset + bytesFilled = filled; + + inputLatency = ((double)bytesFilled) * stream->secondsPerHostByte; + } + // FIXME: what happens if IDirectSoundCaptureBuffer_GetCurrentPosition fails? + + framesToXfer = numInFramesReady = bytesFilled / stream->inputFrameSizeBytes; + + /** @todo Check for overflow */ + } + + /* How much output room is available? */ + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + UINT previousUnderflowCount = stream->outputUnderflowCount; + QueryOutputSpace( stream, &bytesEmpty ); + framesToXfer = numOutFramesReady = bytesEmpty / stream->outputFrameSizeBytes; + + /* Check for underflow */ + if( stream->outputUnderflowCount != previousUnderflowCount ) + stream->callbackFlags |= paOutputUnderflow; + + /* We are about to compute audio into the first byte of empty space in the output buffer. + This audio will reach the DAC after all of the current (non-empty) audio + in the buffer has played. Therefore the output time is the current time + plus the time it takes to play the non-empty bytes in the buffer, + computed here: + */ + outputLatency = ((double)(stream->outputBufferSizeBytes - bytesEmpty)) * stream->secondsPerHostByte; + } + + /* if it's a full duplex stream, set framesToXfer to the minimum of input and output frames ready */ + if( stream->bufferProcessor.inputChannelCount > 0 && stream->bufferProcessor.outputChannelCount > 0 ) + { + framesToXfer = (numOutFramesReady < numInFramesReady) ? numOutFramesReady : numInFramesReady; + } + + if( framesToXfer > 0 ) + { + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + /* The outputBufferDacTime parameter should indicates the time at which + the first sample of the output buffer is heard at the DACs. */ + timeInfo.currentTime = PaUtil_GetTime(); + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, stream->callbackFlags ); + stream->callbackFlags = 0; + + /* Input */ + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + timeInfo.inputBufferAdcTime = timeInfo.currentTime - inputLatency; + + bytesToXfer = framesToXfer * stream->inputFrameSizeBytes; + hresult = IDirectSoundCaptureBuffer_Lock ( stream->pDirectSoundInputBuffer, + stream->readOffset, bytesToXfer, + (void **) &lpInBuf1, &dwInSize1, + (void **) &lpInBuf2, &dwInSize2, 0); + if (hresult != DS_OK) + { + ERR_RPT(("DirectSound IDirectSoundCaptureBuffer_Lock failed, hresult = 0x%x\n",hresult)); + /* PA_DS_SET_LAST_DIRECTSOUND_ERROR( hresult ); */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); /* flush the buffer processor */ + stream->callbackResult = paComplete; + goto error2; + } + + numFrames = dwInSize1 / stream->inputFrameSizeBytes; + PaUtil_SetInputFrameCount( &stream->bufferProcessor, numFrames ); + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, lpInBuf1, 0 ); + /* Is input split into two regions. */ + if( dwInSize2 > 0 ) + { + numFrames = dwInSize2 / stream->inputFrameSizeBytes; + PaUtil_Set2ndInputFrameCount( &stream->bufferProcessor, numFrames ); + PaUtil_Set2ndInterleavedInputChannels( &stream->bufferProcessor, 0, lpInBuf2, 0 ); + } + } + + /* Output */ + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + /* + We don't currently add outputLatency here because it appears to produce worse + results than non adding it. Need to do more testing to verify this. + */ + /* timeInfo.outputBufferDacTime = timeInfo.currentTime + outputLatency; */ + timeInfo.outputBufferDacTime = timeInfo.currentTime; + + bytesToXfer = framesToXfer * stream->outputFrameSizeBytes; + hresult = IDirectSoundBuffer_Lock ( stream->pDirectSoundOutputBuffer, + stream->outputBufferWriteOffsetBytes, bytesToXfer, + (void **) &lpOutBuf1, &dwOutSize1, + (void **) &lpOutBuf2, &dwOutSize2, 0); + if (hresult != DS_OK) + { + ERR_RPT(("DirectSound IDirectSoundBuffer_Lock failed, hresult = 0x%x\n",hresult)); + /* PA_DS_SET_LAST_DIRECTSOUND_ERROR( hresult ); */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); /* flush the buffer processor */ + stream->callbackResult = paComplete; + goto error1; + } + + numFrames = dwOutSize1 / stream->outputFrameSizeBytes; + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, numFrames ); + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, 0, lpOutBuf1, 0 ); + + /* Is output split into two regions. */ + if( dwOutSize2 > 0 ) + { + numFrames = dwOutSize2 / stream->outputFrameSizeBytes; + PaUtil_Set2ndOutputFrameCount( &stream->bufferProcessor, numFrames ); + PaUtil_Set2ndInterleavedOutputChannels( &stream->bufferProcessor, 0, lpOutBuf2, 0 ); + } + } + + numFrames = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &stream->callbackResult ); + stream->framesWritten += numFrames; + + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + /* FIXME: an underflow could happen here */ + + /* Update our buffer offset and unlock sound buffer */ + bytesProcessed = numFrames * stream->outputFrameSizeBytes; + stream->outputBufferWriteOffsetBytes = (stream->outputBufferWriteOffsetBytes + bytesProcessed) % stream->outputBufferSizeBytes; + IDirectSoundBuffer_Unlock( stream->pDirectSoundOutputBuffer, lpOutBuf1, dwOutSize1, lpOutBuf2, dwOutSize2); + } + +error1: + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + /* FIXME: an overflow could happen here */ + + /* Update our buffer offset and unlock sound buffer */ + bytesProcessed = numFrames * stream->inputFrameSizeBytes; + stream->readOffset = (stream->readOffset + bytesProcessed) % stream->inputBufferSizeBytes; + IDirectSoundCaptureBuffer_Unlock( stream->pDirectSoundInputBuffer, lpInBuf1, dwInSize1, lpInBuf2, dwInSize2); + } +error2: + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, numFrames ); + } + + if( stream->callbackResult == paComplete && !PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) + { + /* don't return completed until the buffer processor has been drained */ + return paContinue; + } + else + { + return stream->callbackResult; + } +} +/*******************************************************************/ + +static HRESULT ZeroAvailableOutputSpace( PaWinDsStream *stream ) +{ + HRESULT hr; + LPBYTE lpbuf1 = NULL; + LPBYTE lpbuf2 = NULL; + DWORD dwsize1 = 0; + DWORD dwsize2 = 0; + long bytesEmpty; + hr = QueryOutputSpace( stream, &bytesEmpty ); + if (hr != DS_OK) return hr; + if( bytesEmpty == 0 ) return DS_OK; + // Lock free space in the DS + hr = IDirectSoundBuffer_Lock( stream->pDirectSoundOutputBuffer, stream->outputBufferWriteOffsetBytes, + bytesEmpty, (void **) &lpbuf1, &dwsize1, + (void **) &lpbuf2, &dwsize2, 0); + if (hr == DS_OK) + { + // Copy the buffer into the DS + ZeroMemory(lpbuf1, dwsize1); + if(lpbuf2 != NULL) + { + ZeroMemory(lpbuf2, dwsize2); + } + // Update our buffer offset and unlock sound buffer + stream->outputBufferWriteOffsetBytes = (stream->outputBufferWriteOffsetBytes + dwsize1 + dwsize2) % stream->outputBufferSizeBytes; + IDirectSoundBuffer_Unlock( stream->pDirectSoundOutputBuffer, lpbuf1, dwsize1, lpbuf2, dwsize2); + + stream->finalZeroBytesWritten += dwsize1 + dwsize2; + } + return hr; +} + + +static void CALLBACK TimerCallback(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD dw1, DWORD dw2) +{ + PaWinDsStream *stream; + int isFinished = 0; + + /* suppress unused variable warnings */ + (void) uID; + (void) uMsg; + (void) dw1; + (void) dw2; + + stream = (PaWinDsStream *) dwUser; + if( stream == NULL ) return; + + if( stream->isActive ) + { + if( stream->abortProcessing ) + { + isFinished = 1; + } + else if( stream->stopProcessing ) + { + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + ZeroAvailableOutputSpace( stream ); + if( stream->finalZeroBytesWritten >= stream->outputBufferSizeBytes ) + { + /* once we've flushed the whole output buffer with zeros we know all data has been played */ + isFinished = 1; + } + } + else + { + isFinished = 1; + } + } + else + { + int callbackResult = TimeSlice( stream ); + if( callbackResult != paContinue ) + { + /* FIXME implement handling of paComplete and paAbort if possible + At the moment this should behave as if paComplete was called and + flush the buffer. + */ + + stream->stopProcessing = 1; + } + } + + if( isFinished ) + { + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + + stream->isActive = 0; /* don't set this until the stream really is inactive */ + SetEvent( stream->processingCompleted ); + } + } +} + +#ifndef PA_WIN_DS_USE_WMME_TIMER + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + +static void CALLBACK WaitableTimerAPCProc( + LPVOID lpArg, // Data value + DWORD dwTimerLowValue, // Timer low value + DWORD dwTimerHighValue ) // Timer high value + +{ + (void)dwTimerLowValue; + (void)dwTimerHighValue; + + TimerCallback( 0, 0, (DWORD_PTR)lpArg, 0, 0 ); +} + +#endif /* PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT */ + + +PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) +{ + PaWinDsStream *stream = (PaWinDsStream *)pArg; + MMRESULT mmResult; + HANDLE hWaitableTimer; + LARGE_INTEGER dueTime; + int timerPeriodMs; + + timerPeriodMs = stream->pollingPeriodSeconds * MSECS_PER_SECOND; + if( timerPeriodMs < 1 ) + timerPeriodMs = 1; + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + assert( stream->waitableTimer != NULL ); + + /* invoke first timeout immediately */ + dueTime.LowPart = timerPeriodMs * 1000 * 10; + dueTime.HighPart = 0; + + /* tick using waitable timer */ + if( SetWaitableTimer( stream->waitableTimer, &dueTime, timerPeriodMs, WaitableTimerAPCProc, pArg, FALSE ) != 0 ) + { + DWORD wfsoResult = 0; + do + { + /* wait for processingCompleted to be signaled or our timer APC to be called */ + wfsoResult = WaitForSingleObjectEx( stream->processingCompleted, timerPeriodMs * 10, /* alertable = */ TRUE ); + + }while( wfsoResult == WAIT_TIMEOUT || wfsoResult == WAIT_IO_COMPLETION ); + } + + CancelWaitableTimer( stream->waitableTimer ); + +#else + + /* tick using WaitForSingleObject timout */ + while ( WaitForSingleObject( stream->processingCompleted, timerPeriodMs ) == WAIT_TIMEOUT ) + { + TimerCallback( 0, 0, (DWORD_PTR)pArg, 0, 0 ); + } +#endif /* PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT */ + + SetEvent( stream->processingThreadCompleted ); + + return 0; +} + +#endif /* !PA_WIN_DS_USE_WMME_TIMER */ + +/*********************************************************************************** + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaWinDsStream *stream = (PaWinDsStream*)s; + + CloseHandle( stream->processingCompleted ); + +#ifdef PA_WIN_DS_USE_WAITABLE_TIMER_OBJECT + if( stream->waitableTimer != NULL ) + CloseHandle( stream->waitableTimer ); +#endif + +#ifndef PA_WIN_DS_USE_WMME_TIMER + CloseHandle( stream->processingThreadCompleted ); +#endif + + // Cleanup the sound buffers + if( stream->pDirectSoundOutputBuffer ) + { + IDirectSoundBuffer_Stop( stream->pDirectSoundOutputBuffer ); + IDirectSoundBuffer_Release( stream->pDirectSoundOutputBuffer ); + stream->pDirectSoundOutputBuffer = NULL; + } + + if( stream->pDirectSoundPrimaryBuffer ) + { + IDirectSoundBuffer_Release( stream->pDirectSoundPrimaryBuffer ); + stream->pDirectSoundPrimaryBuffer = NULL; + } + + if( stream->pDirectSoundInputBuffer ) + { + IDirectSoundCaptureBuffer_Stop( stream->pDirectSoundInputBuffer ); + IDirectSoundCaptureBuffer_Release( stream->pDirectSoundInputBuffer ); + stream->pDirectSoundInputBuffer = NULL; + } + + if( stream->pDirectSoundCapture ) + { + IDirectSoundCapture_Release( stream->pDirectSoundCapture ); + stream->pDirectSoundCapture = NULL; + } + + if( stream->pDirectSound ) + { + IDirectSound_Release( stream->pDirectSound ); + stream->pDirectSound = NULL; + } + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + if( stream->pDirectSoundFullDuplex8 ) + { + IDirectSoundFullDuplex_Release( stream->pDirectSoundFullDuplex8 ); + stream->pDirectSoundFullDuplex8 = NULL; + } +#endif + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_FreeMemory( stream ); + + return result; +} + +/***********************************************************************************/ +static HRESULT ClearOutputBuffer( PaWinDsStream *stream ) +{ + PaError result = paNoError; + unsigned char* pDSBuffData; + DWORD dwDataLen; + HRESULT hr; + + hr = IDirectSoundBuffer_SetCurrentPosition( stream->pDirectSoundOutputBuffer, 0 ); + DBUG(("PaHost_ClearOutputBuffer: IDirectSoundBuffer_SetCurrentPosition returned = 0x%X.\n", hr)); + if( hr != DS_OK ) + return hr; + + // Lock the DS buffer + if ((hr = IDirectSoundBuffer_Lock( stream->pDirectSoundOutputBuffer, 0, stream->outputBufferSizeBytes, (LPVOID*)&pDSBuffData, + &dwDataLen, NULL, 0, 0)) != DS_OK ) + return hr; + + // Zero the DS buffer + ZeroMemory(pDSBuffData, dwDataLen); + // Unlock the DS buffer + if ((hr = IDirectSoundBuffer_Unlock( stream->pDirectSoundOutputBuffer, pDSBuffData, dwDataLen, NULL, 0)) != DS_OK) + return hr; + + // Let DSound set the starting write position because if we set it to zero, it looks like the + // buffer is full to begin with. This causes a long pause before sound starts when using large buffers. + if ((hr = IDirectSoundBuffer_GetCurrentPosition( stream->pDirectSoundOutputBuffer, + &stream->previousPlayCursor, &stream->outputBufferWriteOffsetBytes )) != DS_OK) + return hr; + + /* printf("DSW_InitOutputBuffer: playCursor = %d, writeCursor = %d\n", playCursor, dsw->dsw_WriteOffset ); */ + + return DS_OK; +} + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinDsStream *stream = (PaWinDsStream*)s; + HRESULT hr; + + stream->callbackResult = paContinue; + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + ResetEvent( stream->processingCompleted ); + +#ifndef PA_WIN_DS_USE_WMME_TIMER + ResetEvent( stream->processingThreadCompleted ); +#endif + + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + // Start the buffer capture + if( stream->pDirectSoundInputBuffer != NULL ) // FIXME: not sure this check is necessary + { + hr = IDirectSoundCaptureBuffer_Start( stream->pDirectSoundInputBuffer, DSCBSTART_LOOPING ); + } + + DBUG(("StartStream: DSW_StartInput returned = 0x%X.\n", hr)); + if( hr != DS_OK ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ); + goto error; + } + } + + stream->framesWritten = 0; + stream->callbackFlags = 0; + + stream->abortProcessing = 0; + stream->stopProcessing = 0; + + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + QueryPerformanceCounter( &stream->previousPlayTime ); + stream->finalZeroBytesWritten = 0; + + hr = ClearOutputBuffer( stream ); + if( hr != DS_OK ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ); + goto error; + } + + if( stream->streamRepresentation.streamCallback && (stream->streamFlags & paPrimeOutputBuffersUsingStreamCallback) ) + { + stream->callbackFlags = paPrimingOutput; + + TimeSlice( stream ); + /* we ignore the return value from TimeSlice here and start the stream as usual. + The first timer callback will detect if the callback has completed. */ + + stream->callbackFlags = 0; + } + + // Start the buffer playback in a loop. + if( stream->pDirectSoundOutputBuffer != NULL ) // FIXME: not sure this needs to be checked here + { + hr = IDirectSoundBuffer_Play( stream->pDirectSoundOutputBuffer, 0, 0, DSBPLAY_LOOPING ); + DBUG(("PaHost_StartOutput: IDirectSoundBuffer_Play returned = 0x%X.\n", hr)); + if( hr != DS_OK ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ); + goto error; + } + stream->outputIsRunning = TRUE; + } + } + + if( stream->streamRepresentation.streamCallback ) + { + TIMECAPS timecaps; + int timerPeriodMs = stream->pollingPeriodSeconds * MSECS_PER_SECOND; + if( timerPeriodMs < 1 ) + timerPeriodMs = 1; + + /* set windows scheduler granularity only as fine as needed, no finer */ + /* Although this is not fully documented by MS, it appears that + timeBeginPeriod() affects the scheduling granulatity of all timers + including Waitable Timer Objects. So we always call timeBeginPeriod, whether + we're using an MM timer callback via timeSetEvent or not. + */ + assert( stream->systemTimerResolutionPeriodMs == 0 ); + if( timeGetDevCaps( &timecaps, sizeof(TIMECAPS) == MMSYSERR_NOERROR && timecaps.wPeriodMin > 0 ) ) + { + /* aim for resolution 4 times higher than polling rate */ + stream->systemTimerResolutionPeriodMs = (stream->pollingPeriodSeconds * MSECS_PER_SECOND) / 4; + if( stream->systemTimerResolutionPeriodMs < timecaps.wPeriodMin ) + stream->systemTimerResolutionPeriodMs = timecaps.wPeriodMin; + if( stream->systemTimerResolutionPeriodMs > timecaps.wPeriodMax ) + stream->systemTimerResolutionPeriodMs = timecaps.wPeriodMax; + + if( timeBeginPeriod( stream->systemTimerResolutionPeriodMs ) != MMSYSERR_NOERROR ) + stream->systemTimerResolutionPeriodMs = 0; /* timeBeginPeriod failed, so we don't need to call timeEndPeriod() later */ + } + + +#ifdef PA_WIN_DS_USE_WMME_TIMER + /* Create timer that will wake us up so we can fill the DSound buffer. */ + /* We have deprecated timeSetEvent because all MM timer callbacks + are serialised onto a single thread. Which creates problems with multiple + PA streams, or when also using timers for other time critical tasks + */ + stream->timerID = timeSetEvent( timerPeriodMs, stream->systemTimerResolutionPeriodMs, (LPTIMECALLBACK) TimerCallback, + (DWORD_PTR) stream, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS ); + + if( stream->timerID == 0 ) + { + stream->isActive = 0; + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( GetLastError() ); + goto error; + } +#else + /* Create processing thread which calls TimerCallback */ + + stream->processingThread = CREATE_THREAD( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ); + if( !stream->processingThread ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( GetLastError() ); + goto error; + } + + if( !SetThreadPriority( stream->processingThread, THREAD_PRIORITY_TIME_CRITICAL ) ) + { + result = paUnanticipatedHostError; + PA_DS_SET_LAST_DIRECTSOUND_ERROR( GetLastError() ); + goto error; + } +#endif + } + + stream->isActive = 1; + stream->isStarted = 1; + + assert( result == paNoError ); + return result; + +error: + + if( stream->pDirectSoundOutputBuffer != NULL && stream->outputIsRunning ) + IDirectSoundBuffer_Stop( stream->pDirectSoundOutputBuffer ); + stream->outputIsRunning = FALSE; + +#ifndef PA_WIN_DS_USE_WMME_TIMER + if( stream->processingThread ) + { +#ifdef CLOSE_THREAD_HANDLE + CLOSE_THREAD_HANDLE( stream->processingThread ); /* Delete thread. */ +#endif + stream->processingThread = NULL; + } +#endif + + return result; +} + + +/***********************************************************************************/ +static PaError StopStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinDsStream *stream = (PaWinDsStream*)s; + HRESULT hr; + int timeoutMsec; + + if( stream->streamRepresentation.streamCallback ) + { + stream->stopProcessing = 1; + + /* Set timeout at 4 times maximum time we might wait. */ + timeoutMsec = (int) (4 * MSECS_PER_SECOND * (stream->hostBufferSizeFrames / stream->streamRepresentation.streamInfo.sampleRate)); + + WaitForSingleObject( stream->processingCompleted, timeoutMsec ); + } + +#ifdef PA_WIN_DS_USE_WMME_TIMER + if( stream->timerID != 0 ) + { + timeKillEvent(stream->timerID); /* Stop callback timer. */ + stream->timerID = 0; + } +#else + if( stream->processingThread ) + { + if( WaitForSingleObject( stream->processingThreadCompleted, 30*100 ) == WAIT_TIMEOUT ) + return paUnanticipatedHostError; + +#ifdef CLOSE_THREAD_HANDLE + CloseHandle( stream->processingThread ); /* Delete thread. */ + stream->processingThread = NULL; +#endif + + } +#endif + + if( stream->systemTimerResolutionPeriodMs > 0 ){ + timeEndPeriod( stream->systemTimerResolutionPeriodMs ); + stream->systemTimerResolutionPeriodMs = 0; + } + + if( stream->bufferProcessor.outputChannelCount > 0 ) + { + // Stop the buffer playback + if( stream->pDirectSoundOutputBuffer != NULL ) + { + stream->outputIsRunning = FALSE; + // FIXME: what happens if IDirectSoundBuffer_Stop returns an error? + hr = IDirectSoundBuffer_Stop( stream->pDirectSoundOutputBuffer ); + + if( stream->pDirectSoundPrimaryBuffer ) + IDirectSoundBuffer_Stop( stream->pDirectSoundPrimaryBuffer ); /* FIXME we never started the primary buffer so I'm not sure we need to stop it */ + } + } + + if( stream->bufferProcessor.inputChannelCount > 0 ) + { + // Stop the buffer capture + if( stream->pDirectSoundInputBuffer != NULL ) + { + // FIXME: what happens if IDirectSoundCaptureBuffer_Stop returns an error? + hr = IDirectSoundCaptureBuffer_Stop( stream->pDirectSoundInputBuffer ); + } + } + + stream->isStarted = 0; + + return result; +} + + +/***********************************************************************************/ +static PaError AbortStream( PaStream *s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + stream->abortProcessing = 1; + return StopStream( s ); +} + + +/***********************************************************************************/ +static PaError IsStreamStopped( PaStream *s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + return !stream->isStarted; +} + + +/***********************************************************************************/ +static PaError IsStreamActive( PaStream *s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + return stream->isActive; +} + +/***********************************************************************************/ +static PaTime GetStreamTime( PaStream *s ) +{ + /* suppress unused variable warnings */ + (void) s; + + return PaUtil_GetTime(); +} + + +/***********************************************************************************/ +static double GetStreamCpuLoad( PaStream* s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +/*********************************************************************************** + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return paNoError; +} + + +/***********************************************************************************/ +static PaError WriteStream( PaStream* s, + const void *buffer, + unsigned long frames ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return paNoError; +} + + +/***********************************************************************************/ +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return 0; +} + + +/***********************************************************************************/ +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaWinDsStream *stream = (PaWinDsStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return 0; +} + diff --git a/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.c b/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.c new file mode 100644 index 0000000000..c4e3c4ecab --- /dev/null +++ b/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.c @@ -0,0 +1,224 @@ +/* + * Interface for dynamically loading directsound and providing a dummy + * implementation if it isn't present. + * + * Author: Ross Bencina (some portions Phil Burk & Robert Marsanyi) + * + * For PortAudio Portable Real-Time Audio Library + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2006 Phil Burk, Robert Marsanyi and Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#include "pa_win_ds_dynlink.h" +#include "pa_debugprint.h" + +PaWinDsDSoundEntryPoints paWinDsDSoundEntryPoints = { 0, 0, 0, 0, 0, 0, 0 }; + + +static HRESULT WINAPI DummyDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + (void)rclsid; /* unused parameter */ + (void)riid; /* unused parameter */ + (void)ppv; /* unused parameter */ + return CLASS_E_CLASSNOTAVAILABLE; +} + +static HRESULT WINAPI DummyDirectSoundCreate(LPGUID lpcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter) +{ + (void)lpcGuidDevice; /* unused parameter */ + (void)ppDS; /* unused parameter */ + (void)pUnkOuter; /* unused parameter */ + return E_NOTIMPL; +} + +static HRESULT WINAPI DummyDirectSoundEnumerateW(LPDSENUMCALLBACKW lpDSEnumCallback, LPVOID lpContext) +{ + (void)lpDSEnumCallback; /* unused parameter */ + (void)lpContext; /* unused parameter */ + return E_NOTIMPL; +} + +static HRESULT WINAPI DummyDirectSoundEnumerateA(LPDSENUMCALLBACKA lpDSEnumCallback, LPVOID lpContext) +{ + (void)lpDSEnumCallback; /* unused parameter */ + (void)lpContext; /* unused parameter */ + return E_NOTIMPL; +} + +static HRESULT WINAPI DummyDirectSoundCaptureCreate(LPGUID lpcGUID, LPDIRECTSOUNDCAPTURE *lplpDSC, LPUNKNOWN pUnkOuter) +{ + (void)lpcGUID; /* unused parameter */ + (void)lplpDSC; /* unused parameter */ + (void)pUnkOuter; /* unused parameter */ + return E_NOTIMPL; +} + +static HRESULT WINAPI DummyDirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW lpDSCEnumCallback, LPVOID lpContext) +{ + (void)lpDSCEnumCallback; /* unused parameter */ + (void)lpContext; /* unused parameter */ + return E_NOTIMPL; +} + +static HRESULT WINAPI DummyDirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA lpDSCEnumCallback, LPVOID lpContext) +{ + (void)lpDSCEnumCallback; /* unused parameter */ + (void)lpContext; /* unused parameter */ + return E_NOTIMPL; +} + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE +static HRESULT WINAPI DummyDirectSoundFullDuplexCreate8( + LPCGUID pcGuidCaptureDevice, + LPCGUID pcGuidRenderDevice, + LPCDSCBUFFERDESC pcDSCBufferDesc, + LPCDSBUFFERDESC pcDSBufferDesc, + HWND hWnd, + DWORD dwLevel, + LPDIRECTSOUNDFULLDUPLEX * ppDSFD, + LPDIRECTSOUNDCAPTUREBUFFER8 * ppDSCBuffer8, + LPDIRECTSOUNDBUFFER8 * ppDSBuffer8, + LPUNKNOWN pUnkOuter) +{ + (void)pcGuidCaptureDevice; /* unused parameter */ + (void)pcGuidRenderDevice; /* unused parameter */ + (void)pcDSCBufferDesc; /* unused parameter */ + (void)pcDSBufferDesc; /* unused parameter */ + (void)hWnd; /* unused parameter */ + (void)dwLevel; /* unused parameter */ + (void)ppDSFD; /* unused parameter */ + (void)ppDSCBuffer8; /* unused parameter */ + (void)ppDSBuffer8; /* unused parameter */ + (void)pUnkOuter; /* unused parameter */ + + return E_NOTIMPL; +} +#endif /* PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE */ + +void PaWinDs_InitializeDSoundEntryPoints(void) +{ + paWinDsDSoundEntryPoints.hInstance_ = LoadLibraryA("dsound.dll"); + if( paWinDsDSoundEntryPoints.hInstance_ != NULL ) + { + paWinDsDSoundEntryPoints.DllGetClassObject = + (HRESULT (WINAPI *)(REFCLSID, REFIID , LPVOID *)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DllGetClassObject" ); + if( paWinDsDSoundEntryPoints.DllGetClassObject == NULL ) + paWinDsDSoundEntryPoints.DllGetClassObject = DummyDllGetClassObject; + + paWinDsDSoundEntryPoints.DirectSoundCreate = + (HRESULT (WINAPI *)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCreate" ); + if( paWinDsDSoundEntryPoints.DirectSoundCreate == NULL ) + paWinDsDSoundEntryPoints.DirectSoundCreate = DummyDirectSoundCreate; + + paWinDsDSoundEntryPoints.DirectSoundEnumerateW = + (HRESULT (WINAPI *)(LPDSENUMCALLBACKW, LPVOID)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundEnumerateW" ); + if( paWinDsDSoundEntryPoints.DirectSoundEnumerateW == NULL ) + paWinDsDSoundEntryPoints.DirectSoundEnumerateW = DummyDirectSoundEnumerateW; + + paWinDsDSoundEntryPoints.DirectSoundEnumerateA = + (HRESULT (WINAPI *)(LPDSENUMCALLBACKA, LPVOID)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundEnumerateA" ); + if( paWinDsDSoundEntryPoints.DirectSoundEnumerateA == NULL ) + paWinDsDSoundEntryPoints.DirectSoundEnumerateA = DummyDirectSoundEnumerateA; + + paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = + (HRESULT (WINAPI *)(LPGUID, LPDIRECTSOUNDCAPTURE *, LPUNKNOWN)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureCreate" ); + if( paWinDsDSoundEntryPoints.DirectSoundCaptureCreate == NULL ) + paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = DummyDirectSoundCaptureCreate; + + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = + (HRESULT (WINAPI *)(LPDSENUMCALLBACKW, LPVOID)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureEnumerateW" ); + if( paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW == NULL ) + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = DummyDirectSoundCaptureEnumerateW; + + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = + (HRESULT (WINAPI *)(LPDSENUMCALLBACKA, LPVOID)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureEnumerateA" ); + if( paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA == NULL ) + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = DummyDirectSoundCaptureEnumerateA; + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 = + (HRESULT (WINAPI *)(LPCGUID, LPCGUID, LPCDSCBUFFERDESC, LPCDSBUFFERDESC, + HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, + LPDIRECTSOUNDBUFFER8 *, LPUNKNOWN)) + GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundFullDuplexCreate" ); + if( paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 == NULL ) + paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 = DummyDirectSoundFullDuplexCreate8; +#endif + } + else + { + DWORD errorCode = GetLastError(); // 126 (0x7E) == ERROR_MOD_NOT_FOUND + PA_DEBUG(("Couldn't load dsound.dll error code: %d \n",errorCode)); + + /* initialize with dummy entry points to make live easy when ds isn't present */ + paWinDsDSoundEntryPoints.DirectSoundCreate = DummyDirectSoundCreate; + paWinDsDSoundEntryPoints.DirectSoundEnumerateW = DummyDirectSoundEnumerateW; + paWinDsDSoundEntryPoints.DirectSoundEnumerateA = DummyDirectSoundEnumerateA; + paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = DummyDirectSoundCaptureCreate; + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = DummyDirectSoundCaptureEnumerateW; + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = DummyDirectSoundCaptureEnumerateA; +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 = DummyDirectSoundFullDuplexCreate8; +#endif + } +} + + +void PaWinDs_TerminateDSoundEntryPoints(void) +{ + if( paWinDsDSoundEntryPoints.hInstance_ != NULL ) + { + /* ensure that we crash reliably if the entry points arent initialised */ + paWinDsDSoundEntryPoints.DirectSoundCreate = 0; + paWinDsDSoundEntryPoints.DirectSoundEnumerateW = 0; + paWinDsDSoundEntryPoints.DirectSoundEnumerateA = 0; + paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = 0; + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = 0; + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = 0; + + FreeLibrary( paWinDsDSoundEntryPoints.hInstance_ ); + paWinDsDSoundEntryPoints.hInstance_ = NULL; + } +} \ No newline at end of file diff --git a/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.h b/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.h new file mode 100644 index 0000000000..fd6d8feda6 --- /dev/null +++ b/Externals/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.h @@ -0,0 +1,106 @@ +/* + * Interface for dynamically loading directsound and providing a dummy + * implementation if it isn't present. + * + * Author: Ross Bencina (some portions Phil Burk & Robert Marsanyi) + * + * For PortAudio Portable Real-Time Audio Library + * For more information see: http://www.portaudio.com + * Copyright (c) 1999-2006 Phil Burk, Robert Marsanyi and Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#ifndef INCLUDED_PA_DSOUND_DYNLINK_H +#define INCLUDED_PA_DSOUND_DYNLINK_H + +/* on Borland compilers, WIN32 doesn't seem to be defined by default, which + breaks dsound.h. Adding the define here fixes the problem. - rossb. */ +#ifdef __BORLANDC__ +#if !defined(WIN32) +#define WIN32 +#endif +#endif + +/* + Use the earliest version of DX required, no need to polute the namespace +*/ +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE +#define DIRECTSOUND_VERSION 0x0800 +#else +#define DIRECTSOUND_VERSION 0x0300 +#endif +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +typedef struct +{ + HINSTANCE hInstance_; + + HRESULT (WINAPI *DllGetClassObject)(REFCLSID , REFIID , LPVOID *); + + HRESULT (WINAPI *DirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); + HRESULT (WINAPI *DirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID); + HRESULT (WINAPI *DirectSoundEnumerateA)(LPDSENUMCALLBACKA, LPVOID); + + HRESULT (WINAPI *DirectSoundCaptureCreate)(LPGUID, LPDIRECTSOUNDCAPTURE *, LPUNKNOWN); + HRESULT (WINAPI *DirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID); + HRESULT (WINAPI *DirectSoundCaptureEnumerateA)(LPDSENUMCALLBACKA, LPVOID); + +#ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE + HRESULT (WINAPI *DirectSoundFullDuplexCreate8)( + LPCGUID, LPCGUID, LPCDSCBUFFERDESC, LPCDSBUFFERDESC, + HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, + LPDIRECTSOUNDBUFFER8 *, LPUNKNOWN ); +#endif +}PaWinDsDSoundEntryPoints; + +extern PaWinDsDSoundEntryPoints paWinDsDSoundEntryPoints; + +void PaWinDs_InitializeDSoundEntryPoints(void); +void PaWinDs_TerminateDSoundEntryPoints(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* INCLUDED_PA_DSOUND_DYNLINK_H */ diff --git a/Externals/portaudio/src/hostapi/jack/pa_jack.c b/Externals/portaudio/src/hostapi/jack/pa_jack.c new file mode 100644 index 0000000000..25b7fd2d74 --- /dev/null +++ b/Externals/portaudio/src/hostapi/jack/pa_jack.c @@ -0,0 +1,1765 @@ +/* + * $Id: pa_jack.c 1668 2011-05-02 17:07:11Z rossb $ + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * JACK Implementation by Joshua Haberman + * + * Copyright (c) 2004 Stefan Westerfeld + * Copyright (c) 2004 Arve Knudsen + * Copyright (c) 2002 Joshua Haberman + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#include +#include +#include +#include +#include +#include +#include +#include /* EBUSY */ +#include /* sig_atomic_t */ +#include +#include + +#include +#include + +#include "pa_util.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_process.h" +#include "pa_allocation.h" +#include "pa_cpuload.h" +#include "pa_ringbuffer.h" +#include "pa_debugprint.h" + +static pthread_t mainThread_; +static char *jackErr_ = NULL; +static const char* clientName_ = "PortAudio"; + +#define STRINGIZE_HELPER(expr) #expr +#define STRINGIZE(expr) STRINGIZE_HELPER(expr) + +/* Check PaError */ +#define ENSURE_PA(expr) \ + do { \ + PaError paErr; \ + if( (paErr = (expr)) < paNoError ) \ + { \ + if( (paErr) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ + { \ + const char *err = jackErr_; \ + if (! err ) err = "unknown error"; \ + PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ + } \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = paErr; \ + goto error; \ + } \ + } while( 0 ) + +#define UNLESS(expr, code) \ + do { \ + if( (expr) == 0 ) \ + { \ + if( (code) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ + { \ + const char *err = jackErr_; \ + if (!err) err = "unknown error"; \ + PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ + } \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = (code); \ + goto error; \ + } \ + } while( 0 ) + +#define ASSERT_CALL(expr, success) \ + do { \ + int err = (expr); \ + assert( err == success ); \ + } while( 0 ) + +/* + * Functions that directly map to the PortAudio stream interface + */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +/*static PaTime GetStreamInputLatency( PaStream *stream );*/ +/*static PaTime GetStreamOutputLatency( PaStream *stream );*/ +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); + + +/* + * Data specific to this API + */ + +struct PaJackStream; + +typedef struct +{ + PaUtilHostApiRepresentation commonHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *deviceInfoMemory; + + jack_client_t *jack_client; + int jack_buffer_size; + PaHostApiIndex hostApiIndex; + + pthread_mutex_t mtx; + pthread_cond_t cond; + unsigned long inputBase, outputBase; + + /* For dealing with the process thread */ + volatile int xrun; /* Received xrun notification from JACK? */ + struct PaJackStream * volatile toAdd, * volatile toRemove; + struct PaJackStream *processQueue; + volatile sig_atomic_t jackIsDown; +} +PaJackHostApiRepresentation; + +/* PaJackStream - a stream data structure specifically for this implementation */ + +typedef struct PaJackStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilBufferProcessor bufferProcessor; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaJackHostApiRepresentation *hostApi; + + /* our input and output ports */ + jack_port_t **local_input_ports; + jack_port_t **local_output_ports; + + /* the input and output ports of the client we are connecting to */ + jack_port_t **remote_input_ports; + jack_port_t **remote_output_ports; + + int num_incoming_connections; + int num_outgoing_connections; + + jack_client_t *jack_client; + + /* The stream is running if it's still producing samples. + * The stream is active if samples it produced are still being heard. + */ + volatile sig_atomic_t is_running; + volatile sig_atomic_t is_active; + /* Used to signal processing thread that stream should start or stop, respectively */ + volatile sig_atomic_t doStart, doStop, doAbort; + + jack_nframes_t t0; + + PaUtilAllocationGroup *stream_memory; + + /* These are useful in the process callback */ + + int callbackResult; + int isSilenced; + int xrun; + + /* These are useful for the blocking API */ + + int isBlockingStream; + PaUtilRingBuffer inFIFO; + PaUtilRingBuffer outFIFO; + volatile sig_atomic_t data_available; + sem_t data_semaphore; + int bytesPerFrame; + int samplesPerFrame; + + struct PaJackStream *next; +} +PaJackStream; + +#define TRUE 1 +#define FALSE 0 + +/* + * Functions specific to this API + */ + +static int JackCallback( jack_nframes_t frames, void *userData ); + + +/* + * + * Implementation + * + */ + +/* ---- blocking emulation layer ---- */ + +/* Allocate buffer. */ +static PaError BlockingInitFIFO( PaUtilRingBuffer *rbuf, long numFrames, long bytesPerFrame ) +{ + long numBytes = numFrames * bytesPerFrame; + char *buffer = (char *) malloc( numBytes ); + if( buffer == NULL ) return paInsufficientMemory; + memset( buffer, 0, numBytes ); + return (PaError) PaUtil_InitializeRingBuffer( rbuf, 1, numBytes, buffer ); +} + +/* Free buffer. */ +static PaError BlockingTermFIFO( PaUtilRingBuffer *rbuf ) +{ + if( rbuf->buffer ) free( rbuf->buffer ); + rbuf->buffer = NULL; + return paNoError; +} + +static int +BlockingCallback( const void *inputBuffer, + void *outputBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) +{ + struct PaJackStream *stream = (PaJackStream *)userData; + long numBytes = stream->bytesPerFrame * framesPerBuffer; + + /* This may get called with NULL inputBuffer during initial setup. */ + if( inputBuffer != NULL ) + { + PaUtil_WriteRingBuffer( &stream->inFIFO, inputBuffer, numBytes ); + } + if( outputBuffer != NULL ) + { + int numRead = PaUtil_ReadRingBuffer( &stream->outFIFO, outputBuffer, numBytes ); + /* Zero out remainder of buffer if we run out of data. */ + memset( (char *)outputBuffer + numRead, 0, numBytes - numRead ); + } + + if( !stream->data_available ) + { + stream->data_available = 1; + sem_post( &stream->data_semaphore ); + } + return paContinue; +} + +static PaError +BlockingBegin( PaJackStream *stream, int minimum_buffer_size ) +{ + long doRead = 0; + long doWrite = 0; + PaError result = paNoError; + long numFrames; + + doRead = stream->local_input_ports != NULL; + doWrite = stream->local_output_ports != NULL; + /* */ + stream->samplesPerFrame = 2; + stream->bytesPerFrame = sizeof(float) * stream->samplesPerFrame; + /* */ + numFrames = 32; + while (numFrames < minimum_buffer_size) + numFrames *= 2; + + if( doRead ) + { + ENSURE_PA( BlockingInitFIFO( &stream->inFIFO, numFrames, stream->bytesPerFrame ) ); + } + if( doWrite ) + { + long numBytes; + + ENSURE_PA( BlockingInitFIFO( &stream->outFIFO, numFrames, stream->bytesPerFrame ) ); + + /* Make Write FIFO appear full initially. */ + numBytes = PaUtil_GetRingBufferWriteAvailable( &stream->outFIFO ); + PaUtil_AdvanceRingBufferWriteIndex( &stream->outFIFO, numBytes ); + } + + stream->data_available = 0; + sem_init( &stream->data_semaphore, 0, 0 ); + +error: + return result; +} + +static void +BlockingEnd( PaJackStream *stream ) +{ + BlockingTermFIFO( &stream->inFIFO ); + BlockingTermFIFO( &stream->outFIFO ); + + sem_destroy( &stream->data_semaphore ); +} + +static PaError BlockingReadStream( PaStream* s, void *data, unsigned long numFrames ) +{ + PaError result = paNoError; + PaJackStream *stream = (PaJackStream *)s; + + long bytesRead; + char *p = (char *) data; + long numBytes = stream->bytesPerFrame * numFrames; + while( numBytes > 0 ) + { + bytesRead = PaUtil_ReadRingBuffer( &stream->inFIFO, p, numBytes ); + numBytes -= bytesRead; + p += bytesRead; + if( numBytes > 0 ) + { + /* see write for an explanation */ + if( stream->data_available ) + stream->data_available = 0; + else + sem_wait( &stream->data_semaphore ); + } + } + + return result; +} + +static PaError BlockingWriteStream( PaStream* s, const void *data, unsigned long numFrames ) +{ + PaError result = paNoError; + PaJackStream *stream = (PaJackStream *)s; + long bytesWritten; + char *p = (char *) data; + long numBytes = stream->bytesPerFrame * numFrames; + while( numBytes > 0 ) + { + bytesWritten = PaUtil_WriteRingBuffer( &stream->outFIFO, p, numBytes ); + numBytes -= bytesWritten; + p += bytesWritten; + if( numBytes > 0 ) + { + /* we use the following algorithm: + * (1) write data + * (2) if some data didn't fit into the ringbuffer, set data_available to 0 + * to indicate to the audio that if space becomes available, we want to know + * (3) retry to write data (because it might be that between (1) and (2) + * new space in the buffer became available) + * (4) if this failed, we are sure that the buffer is really empty and + * we will definitely receive a notification when it becomes available + * thus we can safely sleep + * + * if the algorithm bailed out in step (3) before, it leaks a count of 1 + * on the semaphore; however, it doesn't matter, because if we block in (4), + * we also do it in a loop + */ + if( stream->data_available ) + stream->data_available = 0; + else + sem_wait( &stream->data_semaphore ); + } + } + + return result; +} + +static signed long +BlockingGetStreamReadAvailable( PaStream* s ) +{ + PaJackStream *stream = (PaJackStream *)s; + + int bytesFull = PaUtil_GetRingBufferReadAvailable( &stream->inFIFO ); + return bytesFull / stream->bytesPerFrame; +} + +static signed long +BlockingGetStreamWriteAvailable( PaStream* s ) +{ + PaJackStream *stream = (PaJackStream *)s; + + int bytesEmpty = PaUtil_GetRingBufferWriteAvailable( &stream->outFIFO ); + return bytesEmpty / stream->bytesPerFrame; +} + +static PaError +BlockingWaitEmpty( PaStream *s ) +{ + PaJackStream *stream = (PaJackStream *)s; + + while( PaUtil_GetRingBufferReadAvailable( &stream->outFIFO ) > 0 ) + { + stream->data_available = 0; + sem_wait( &stream->data_semaphore ); + } + return 0; +} + +/* ---- jack driver ---- */ + +/* BuildDeviceList(): + * + * The process of determining a list of PortAudio "devices" from + * JACK's client/port system is fairly involved, so it is separated + * into its own routine. + */ + +static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) +{ + /* Utility macros for the repetitive process of allocating memory */ + + /* JACK has no concept of a device. To JACK, there are clients + * which have an arbitrary number of ports. To make this + * intelligible to PortAudio clients, we will group each JACK client + * into a device, and make each port of that client a channel */ + + PaError result = paNoError; + PaUtilHostApiRepresentation *commonApi = &jackApi->commonHostApiRep; + + const char **jack_ports = NULL; + char **client_names = NULL; + char *regex_pattern = NULL; + int port_index, client_index, i; + double globalSampleRate; + regex_t port_regex; + unsigned long numClients = 0, numPorts = 0; + char *tmp_client_name = NULL; + + commonApi->info.defaultInputDevice = paNoDevice; + commonApi->info.defaultOutputDevice = paNoDevice; + commonApi->info.deviceCount = 0; + + /* Parse the list of ports, using a regex to grab the client names */ + ASSERT_CALL( regcomp( &port_regex, "^[^:]*", REG_EXTENDED ), 0 ); + + /* since we are rebuilding the list of devices, free all memory + * associated with the previous list */ + PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory ); + + regex_pattern = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() + 3 ); + tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() ); + + /* We can only retrieve the list of clients indirectly, by first + * asking for a list of all ports, then parsing the port names + * according to the client_name:port_name convention (which is + * enforced by jackd) + * A: If jack_get_ports returns NULL, there's nothing for us to do */ + UNLESS( (jack_ports = jack_get_ports( jackApi->jack_client, "", "", 0 )) && jack_ports[0], paNoError ); + /* Find number of ports */ + while( jack_ports[numPorts] ) + ++numPorts; + /* At least there will be one port per client :) */ + UNLESS( client_names = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, numPorts * + sizeof (char *) ), paInsufficientMemory ); + + /* Build a list of clients from the list of ports */ + for( numClients = 0, port_index = 0; jack_ports[port_index] != NULL; port_index++ ) + { + int client_seen = FALSE; + regmatch_t match_info; + const char *port = jack_ports[port_index]; + + /* extract the client name from the port name, using a regex + * that parses the clientname:portname syntax */ + UNLESS( !regexec( &port_regex, port, 1, &match_info, 0 ), paInternalError ); + assert(match_info.rm_eo - match_info.rm_so < jack_client_name_size()); + memcpy( tmp_client_name, port + match_info.rm_so, + match_info.rm_eo - match_info.rm_so ); + tmp_client_name[match_info.rm_eo - match_info.rm_so] = '\0'; + + /* do we know about this port's client yet? */ + for( i = 0; i < numClients; i++ ) + { + if( strcmp( tmp_client_name, client_names[i] ) == 0 ) + client_seen = TRUE; + } + + if (client_seen) + continue; /* A: Nothing to see here, move along */ + + UNLESS( client_names[numClients] = (char*)PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, + strlen(tmp_client_name) + 1), paInsufficientMemory ); + + /* The alsa_pcm client should go in spot 0. If this + * is the alsa_pcm client AND we are NOT about to put + * it in spot 0 put it in spot 0 and move whatever + * was already in spot 0 to the end. */ + if( strcmp( "alsa_pcm", tmp_client_name ) == 0 && numClients > 0 ) + { + /* alsa_pcm goes in spot 0 */ + strcpy( client_names[ numClients ], client_names[0] ); + strcpy( client_names[0], tmp_client_name ); + } + else + { + /* put the new client at the end of the client list */ + strcpy( client_names[ numClients ], tmp_client_name ); + } + ++numClients; + } + + /* Now we have a list of clients, which will become the list of + * PortAudio devices. */ + + /* there is one global sample rate all clients must conform to */ + + globalSampleRate = jack_get_sample_rate( jackApi->jack_client ); + UNLESS( commonApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, + sizeof(PaDeviceInfo*) * numClients ), paInsufficientMemory ); + + assert( commonApi->info.deviceCount == 0 ); + + /* Create a PaDeviceInfo structure for every client */ + for( client_index = 0; client_index < numClients; client_index++ ) + { + PaDeviceInfo *curDevInfo; + const char **clientPorts = NULL; + + UNLESS( curDevInfo = (PaDeviceInfo*)PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, + sizeof(PaDeviceInfo) ), paInsufficientMemory ); + UNLESS( curDevInfo->name = (char*)PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, + strlen(client_names[client_index]) + 1 ), paInsufficientMemory ); + strcpy( (char *)curDevInfo->name, client_names[client_index] ); + + curDevInfo->structVersion = 2; + curDevInfo->hostApi = jackApi->hostApiIndex; + + /* JACK is very inflexible: there is one sample rate the whole + * system must run at, and all clients must speak IEEE float. */ + curDevInfo->defaultSampleRate = globalSampleRate; + + /* To determine how many input and output channels are available, + * we re-query jackd with more specific parameters. */ + + sprintf( regex_pattern, "%s:.*", client_names[client_index] ); + + /* ... what are your output ports (that we could input from)? */ + clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, + NULL, JackPortIsOutput); + curDevInfo->maxInputChannels = 0; + curDevInfo->defaultLowInputLatency = 0.; + curDevInfo->defaultHighInputLatency = 0.; + if( clientPorts ) + { + jack_port_t *p = jack_port_by_name( jackApi->jack_client, clientPorts[0] ); + curDevInfo->defaultLowInputLatency = curDevInfo->defaultHighInputLatency = + jack_port_get_latency( p ) / globalSampleRate; + + for( i = 0; clientPorts[i] != NULL; i++) + { + /* The number of ports returned is the number of output channels. + * We don't care what they are, we just care how many */ + curDevInfo->maxInputChannels++; + } + free(clientPorts); + } + + /* ... what are your input ports (that we could output to)? */ + clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, + NULL, JackPortIsInput); + curDevInfo->maxOutputChannels = 0; + curDevInfo->defaultLowOutputLatency = 0.; + curDevInfo->defaultHighOutputLatency = 0.; + if( clientPorts ) + { + jack_port_t *p = jack_port_by_name( jackApi->jack_client, clientPorts[0] ); + curDevInfo->defaultLowOutputLatency = curDevInfo->defaultHighOutputLatency = + jack_port_get_latency( p ) / globalSampleRate; + + for( i = 0; clientPorts[i] != NULL; i++) + { + /* The number of ports returned is the number of input channels. + * We don't care what they are, we just care how many */ + curDevInfo->maxOutputChannels++; + } + free(clientPorts); + } + + /* Add this client to the list of devices */ + commonApi->deviceInfos[client_index] = curDevInfo; + ++commonApi->info.deviceCount; + if( commonApi->info.defaultInputDevice == paNoDevice && curDevInfo->maxInputChannels > 0 ) + commonApi->info.defaultInputDevice = client_index; + if( commonApi->info.defaultOutputDevice == paNoDevice && curDevInfo->maxOutputChannels > 0 ) + commonApi->info.defaultOutputDevice = client_index; + } + +error: + regfree( &port_regex ); + free( jack_ports ); + return result; +} + +static void UpdateSampleRate( PaJackStream *stream, double sampleRate ) +{ + /* XXX: Maybe not the cleanest way of going about this? */ + stream->cpuLoadMeasurer.samplingPeriod = stream->bufferProcessor.samplePeriod = 1. / sampleRate; + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; +} + +static void JackErrorCallback( const char *msg ) +{ + if( pthread_self() == mainThread_ ) + { + assert( msg ); + jackErr_ = realloc( jackErr_, strlen( msg ) + 1 ); + strcpy( jackErr_, msg ); + } +} + +static void JackOnShutdown( void *arg ) +{ + PaJackHostApiRepresentation *jackApi = (PaJackHostApiRepresentation *)arg; + PaJackStream *stream = jackApi->processQueue; + + PA_DEBUG(( "%s: JACK server is shutting down\n", __FUNCTION__ )); + for( ; stream; stream = stream->next ) + { + stream->is_active = 0; + } + + /* Make sure that the main thread doesn't get stuck waiting on the condition */ + ASSERT_CALL( pthread_mutex_lock( &jackApi->mtx ), 0 ); + jackApi->jackIsDown = 1; + ASSERT_CALL( pthread_cond_signal( &jackApi->cond ), 0 ); + ASSERT_CALL( pthread_mutex_unlock( &jackApi->mtx ), 0 ); + +} + +static int JackSrCb( jack_nframes_t nframes, void *arg ) +{ + PaJackHostApiRepresentation *jackApi = (PaJackHostApiRepresentation *)arg; + double sampleRate = (double)nframes; + PaJackStream *stream = jackApi->processQueue; + + /* Update all streams in process queue */ + PA_DEBUG(( "%s: Acting on change in JACK samplerate: %f\n", __FUNCTION__, sampleRate )); + for( ; stream; stream = stream->next ) + { + if( stream->streamRepresentation.streamInfo.sampleRate != sampleRate ) + { + PA_DEBUG(( "%s: Updating samplerate\n", __FUNCTION__ )); + UpdateSampleRate( stream, sampleRate ); + } + } + + return 0; +} + +static int JackXRunCb(void *arg) { + PaJackHostApiRepresentation *hostApi = (PaJackHostApiRepresentation *)arg; + assert( hostApi ); + hostApi->xrun = TRUE; + PA_DEBUG(( "%s: JACK signalled xrun\n", __FUNCTION__ )); + return 0; +} + +PaError PaJack_Initialize( PaUtilHostApiRepresentation **hostApi, + PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaJackHostApiRepresentation *jackHostApi; + int activated = 0; + jack_status_t jackStatus = 0; + *hostApi = NULL; /* Initialize to NULL */ + + UNLESS( jackHostApi = (PaJackHostApiRepresentation*) + PaUtil_AllocateMemory( sizeof(PaJackHostApiRepresentation) ), paInsufficientMemory ); + UNLESS( jackHostApi->deviceInfoMemory = PaUtil_CreateAllocationGroup(), paInsufficientMemory ); + + mainThread_ = pthread_self(); + ASSERT_CALL( pthread_mutex_init( &jackHostApi->mtx, NULL ), 0 ); + ASSERT_CALL( pthread_cond_init( &jackHostApi->cond, NULL ), 0 ); + + /* Try to become a client of the JACK server. If we cannot do + * this, then this API cannot be used. + * + * Without the JackNoStartServer option, the jackd server is started + * automatically which we do not want. + */ + + jackHostApi->jack_client = jack_client_open( clientName_, JackNoStartServer, &jackStatus ); + if( !jackHostApi->jack_client ) + { + /* the V19 development docs say that if an implementation + * detects that it cannot be used, it should return a NULL + * interface and paNoError */ + PA_DEBUG(( "%s: Couldn't connect to JACK, status: %d\n", __FUNCTION__, jackStatus )); + result = paNoError; + goto error; + } + + jackHostApi->hostApiIndex = hostApiIndex; + + *hostApi = &jackHostApi->commonHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paJACK; + (*hostApi)->info.name = "JACK Audio Connection Kit"; + + /* Build a device list by querying the JACK server */ + ENSURE_PA( BuildDeviceList( jackHostApi ) ); + + /* Register functions */ + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &jackHostApi->callbackStreamInterface, + CloseStream, StartStream, + StopStream, AbortStream, + IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, + PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &jackHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + BlockingReadStream, BlockingWriteStream, + BlockingGetStreamReadAvailable, BlockingGetStreamWriteAvailable ); + + jackHostApi->inputBase = jackHostApi->outputBase = 0; + jackHostApi->xrun = 0; + jackHostApi->toAdd = jackHostApi->toRemove = NULL; + jackHostApi->processQueue = NULL; + jackHostApi->jackIsDown = 0; + + jack_on_shutdown( jackHostApi->jack_client, JackOnShutdown, jackHostApi ); + jack_set_error_function( JackErrorCallback ); + jackHostApi->jack_buffer_size = jack_get_buffer_size ( jackHostApi->jack_client ); + /* Don't check for error, may not be supported (deprecated in at least jackdmp) */ + jack_set_sample_rate_callback( jackHostApi->jack_client, JackSrCb, jackHostApi ); + UNLESS( !jack_set_xrun_callback( jackHostApi->jack_client, JackXRunCb, jackHostApi ), paUnanticipatedHostError ); + UNLESS( !jack_set_process_callback( jackHostApi->jack_client, JackCallback, jackHostApi ), paUnanticipatedHostError ); + UNLESS( !jack_activate( jackHostApi->jack_client ), paUnanticipatedHostError ); + activated = 1; + + return result; + +error: + if( activated ) + ASSERT_CALL( jack_deactivate( jackHostApi->jack_client ), 0 ); + + if( jackHostApi ) + { + if( jackHostApi->jack_client ) + ASSERT_CALL( jack_client_close( jackHostApi->jack_client ), 0 ); + + if( jackHostApi->deviceInfoMemory ) + { + PaUtil_FreeAllAllocations( jackHostApi->deviceInfoMemory ); + PaUtil_DestroyAllocationGroup( jackHostApi->deviceInfoMemory ); + } + + PaUtil_FreeMemory( jackHostApi ); + } + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaJackHostApiRepresentation *jackHostApi = (PaJackHostApiRepresentation*)hostApi; + + /* note: this automatically disconnects all ports, since a deactivated + * client is not allowed to have any ports connected */ + ASSERT_CALL( jack_deactivate( jackHostApi->jack_client ), 0 ); + + ASSERT_CALL( pthread_mutex_destroy( &jackHostApi->mtx ), 0 ); + ASSERT_CALL( pthread_cond_destroy( &jackHostApi->cond ), 0 ); + + ASSERT_CALL( jack_client_close( jackHostApi->jack_client ), 0 ); + + if( jackHostApi->deviceInfoMemory ) + { + PaUtil_FreeAllAllocations( jackHostApi->deviceInfoMemory ); + PaUtil_DestroyAllocationGroup( jackHostApi->deviceInfoMemory ); + } + + PaUtil_FreeMemory( jackHostApi ); + + free( jackErr_ ); + jackErr_ = NULL; +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + int inputChannelCount = 0, outputChannelCount = 0; + PaSampleFormat inputSampleFormat, outputSampleFormat; + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + outputChannelCount = 0; + } + + /* + The following check is not necessary for JACK. + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + + + Because the buffer adapter handles conversion between all standard + sample formats, the following checks are only required if paCustomFormat + is implemented, or under some other unusual conditions. + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + */ + + /* check that the device supports sampleRate */ + +#define ABS(x) ( (x) > 0 ? (x) : -(x) ) + if( ABS(sampleRate - jack_get_sample_rate(((PaJackHostApiRepresentation *) hostApi)->jack_client )) > 1 ) + return paInvalidSampleRate; +#undef ABS + + return paFormatIsSupported; +} + +/* Basic stream initialization */ +static PaError InitializeStream( PaJackStream *stream, PaJackHostApiRepresentation *hostApi, int numInputChannels, + int numOutputChannels ) +{ + PaError result = paNoError; + assert( stream ); + + memset( stream, 0, sizeof (PaJackStream) ); + UNLESS( stream->stream_memory = PaUtil_CreateAllocationGroup(), paInsufficientMemory ); + stream->jack_client = hostApi->jack_client; + stream->hostApi = hostApi; + + if( numInputChannels > 0 ) + { + UNLESS( stream->local_input_ports = + (jack_port_t**) PaUtil_GroupAllocateMemory( stream->stream_memory, sizeof(jack_port_t*) * numInputChannels ), + paInsufficientMemory ); + memset( stream->local_input_ports, 0, sizeof(jack_port_t*) * numInputChannels ); + UNLESS( stream->remote_output_ports = + (jack_port_t**) PaUtil_GroupAllocateMemory( stream->stream_memory, sizeof(jack_port_t*) * numInputChannels ), + paInsufficientMemory ); + memset( stream->remote_output_ports, 0, sizeof(jack_port_t*) * numInputChannels ); + } + if( numOutputChannels > 0 ) + { + UNLESS( stream->local_output_ports = + (jack_port_t**) PaUtil_GroupAllocateMemory( stream->stream_memory, sizeof(jack_port_t*) * numOutputChannels ), + paInsufficientMemory ); + memset( stream->local_output_ports, 0, sizeof(jack_port_t*) * numOutputChannels ); + UNLESS( stream->remote_input_ports = + (jack_port_t**) PaUtil_GroupAllocateMemory( stream->stream_memory, sizeof(jack_port_t*) * numOutputChannels ), + paInsufficientMemory ); + memset( stream->remote_input_ports, 0, sizeof(jack_port_t*) * numOutputChannels ); + } + + stream->num_incoming_connections = numInputChannels; + stream->num_outgoing_connections = numOutputChannels; + +error: + return result; +} + +/*! + * Free resources associated with stream, and eventually stream itself. + * + * Frees allocated memory, and closes opened pcms. + */ +static void CleanUpStream( PaJackStream *stream, int terminateStreamRepresentation, int terminateBufferProcessor ) +{ + int i; + assert( stream ); + + if( stream->isBlockingStream ) + BlockingEnd( stream ); + + for( i = 0; i < stream->num_incoming_connections; ++i ) + { + if( stream->local_input_ports[i] ) + ASSERT_CALL( jack_port_unregister( stream->jack_client, stream->local_input_ports[i] ), 0 ); + } + for( i = 0; i < stream->num_outgoing_connections; ++i ) + { + if( stream->local_output_ports[i] ) + ASSERT_CALL( jack_port_unregister( stream->jack_client, stream->local_output_ports[i] ), 0 ); + } + + if( terminateStreamRepresentation ) + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + if( terminateBufferProcessor ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( stream->stream_memory ) + { + PaUtil_FreeAllAllocations( stream->stream_memory ); + PaUtil_DestroyAllocationGroup( stream->stream_memory ); + } + PaUtil_FreeMemory( stream ); +} + +static PaError WaitCondition( PaJackHostApiRepresentation *hostApi ) +{ + PaError result = paNoError; + int err = 0; + PaTime pt = PaUtil_GetTime(); + struct timespec ts; + + ts.tv_sec = (time_t) floor( pt + 10 * 60 /* 10 minutes */ ); + ts.tv_nsec = (long) ((pt - floor( pt )) * 1000000000); + /* XXX: Best enclose in loop, in case of spurious wakeups? */ + err = pthread_cond_timedwait( &hostApi->cond, &hostApi->mtx, &ts ); + + /* Make sure we didn't time out */ + UNLESS( err != ETIMEDOUT, paTimedOut ); + UNLESS( !err, paInternalError ); + +error: + return result; +} + +static PaError AddStream( PaJackStream *stream ) +{ + PaError result = paNoError; + PaJackHostApiRepresentation *hostApi = stream->hostApi; + /* Add to queue of streams that should be processed */ + ASSERT_CALL( pthread_mutex_lock( &hostApi->mtx ), 0 ); + if( !hostApi->jackIsDown ) + { + hostApi->toAdd = stream; + /* Unlock mutex and await signal from processing thread */ + result = WaitCondition( stream->hostApi ); + } + ASSERT_CALL( pthread_mutex_unlock( &hostApi->mtx ), 0 ); + ENSURE_PA( result ); + + UNLESS( !hostApi->jackIsDown, paDeviceUnavailable ); + +error: + return result; +} + +/* Remove stream from processing queue */ +static PaError RemoveStream( PaJackStream *stream ) +{ + PaError result = paNoError; + PaJackHostApiRepresentation *hostApi = stream->hostApi; + + /* Add to queue over streams that should be processed */ + ASSERT_CALL( pthread_mutex_lock( &hostApi->mtx ), 0 ); + if( !hostApi->jackIsDown ) + { + hostApi->toRemove = stream; + /* Unlock mutex and await signal from processing thread */ + result = WaitCondition( stream->hostApi ); + } + ASSERT_CALL( pthread_mutex_unlock( &hostApi->mtx ), 0 ); + ENSURE_PA( result ); + +error: + return result; +} + +/* Add stream to JACK callback processing queue */ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaJackHostApiRepresentation *jackHostApi = (PaJackHostApiRepresentation*)hostApi; + PaJackStream *stream = NULL; + char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() ); + unsigned long regexSz = jack_client_name_size() + 3; + char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regexSz ); + const char **jack_ports = NULL; + /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */ + int i; + int inputChannelCount, outputChannelCount; + const double jackSr = jack_get_sample_rate( jackHostApi->jack_client ); + PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0; + int bpInitialized = 0, srInitialized = 0; /* Initialized buffer processor and stream representation? */ + unsigned long ofs; + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + if( (streamFlags & paPrimeOutputBuffersUsingStreamCallback) != 0 ) + { + streamFlags &= ~paPrimeOutputBuffersUsingStreamCallback; + /*return paInvalidFlag;*/ /* This implementation does not support buffer priming */ + } + + if( framesPerBuffer != paFramesPerBufferUnspecified ) + { + /* Jack operates with power of two buffers, and we don't support non-integer buffer adaption (yet) */ + /*UNLESS( !(framesPerBuffer & (framesPerBuffer - 1)), paBufferTooBig );*/ /* TODO: Add descriptive error code? */ + } + + /* Preliminary checks */ + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + outputChannelCount = 0; + } + + /* ... check that the sample rate exactly matches the ONE acceptable rate + * A: This rate isn't necessarily constant though? */ + +#define ABS(x) ( (x) > 0 ? (x) : -(x) ) + if( ABS(sampleRate - jackSr) > 1 ) + return paInvalidSampleRate; +#undef ABS + + UNLESS( stream = (PaJackStream*)PaUtil_AllocateMemory( sizeof(PaJackStream) ), paInsufficientMemory ); + ENSURE_PA( InitializeStream( stream, jackHostApi, inputChannelCount, outputChannelCount ) ); + + /* the blocking emulation, if necessary */ + stream->isBlockingStream = !streamCallback; + if( stream->isBlockingStream ) + { + float latency = 0.001; /* 1ms is the absolute minimum we support */ + int minimum_buffer_frames = 0; + + if( inputParameters && inputParameters->suggestedLatency > latency ) + latency = inputParameters->suggestedLatency; + else if( outputParameters && outputParameters->suggestedLatency > latency ) + latency = outputParameters->suggestedLatency; + + /* the latency the user asked for indicates the minimum buffer size in frames */ + minimum_buffer_frames = (int) (latency * jack_get_sample_rate( jackHostApi->jack_client )); + + /* we also need to be able to store at least three full jack buffers to avoid dropouts */ + if( jackHostApi->jack_buffer_size * 3 > minimum_buffer_frames ) + minimum_buffer_frames = jackHostApi->jack_buffer_size * 3; + + /* setup blocking API data structures (FIXME: can fail) */ + BlockingBegin( stream, minimum_buffer_frames ); + + /* install our own callback for the blocking API */ + streamCallback = BlockingCallback; + userData = stream; + + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &jackHostApi->blockingStreamInterface, streamCallback, userData ); + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &jackHostApi->callbackStreamInterface, streamCallback, userData ); + } + srInitialized = 1; + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, jackSr ); + + /* create the JACK ports. We cannot connect them until audio + * processing begins */ + + /* Register a unique set of ports for this stream + * TODO: Robust allocation of new port names */ + + ofs = jackHostApi->inputBase; + for( i = 0; i < inputChannelCount; i++ ) + { + snprintf( port_string, jack_port_name_size(), "in_%lu", ofs + i ); + UNLESS( stream->local_input_ports[i] = jack_port_register( + jackHostApi->jack_client, port_string, + JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ), paInsufficientMemory ); + } + jackHostApi->inputBase += inputChannelCount; + + ofs = jackHostApi->outputBase; + for( i = 0; i < outputChannelCount; i++ ) + { + snprintf( port_string, jack_port_name_size(), "out_%lu", ofs + i ); + UNLESS( stream->local_output_ports[i] = jack_port_register( + jackHostApi->jack_client, port_string, + JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ), paInsufficientMemory ); + } + jackHostApi->outputBase += outputChannelCount; + + /* look up the jack_port_t's for the remote ports. We could do + * this at stream start time, but doing it here ensures the + * name lookup only happens once. */ + + if( inputChannelCount > 0 ) + { + int err = 0; + + /* Get output ports of our capture device */ + snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ inputParameters->device ]->name ); + UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, + NULL, JackPortIsOutput ), paUnanticipatedHostError ); + for( i = 0; i < inputChannelCount && jack_ports[i]; i++ ) + { + if( (stream->remote_output_ports[i] = jack_port_by_name( + jackHostApi->jack_client, jack_ports[i] )) == NULL ) + { + err = 1; + break; + } + } + free( jack_ports ); + UNLESS( !err, paInsufficientMemory ); + + /* Fewer ports than expected? */ + UNLESS( i == inputChannelCount, paInternalError ); + } + + if( outputChannelCount > 0 ) + { + int err = 0; + + /* Get input ports of our playback device */ + snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ outputParameters->device ]->name ); + UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, + NULL, JackPortIsInput ), paUnanticipatedHostError ); + for( i = 0; i < outputChannelCount && jack_ports[i]; i++ ) + { + if( (stream->remote_input_ports[i] = jack_port_by_name( + jackHostApi->jack_client, jack_ports[i] )) == 0 ) + { + err = 1; + break; + } + } + free( jack_ports ); + UNLESS( !err , paInsufficientMemory ); + + /* Fewer ports than expected? */ + UNLESS( i == outputChannelCount, paInternalError ); + } + + ENSURE_PA( PaUtil_InitializeBufferProcessor( + &stream->bufferProcessor, + inputChannelCount, + inputSampleFormat, + paFloat32 | paNonInterleaved, /* hostInputSampleFormat */ + outputChannelCount, + outputSampleFormat, + paFloat32 | paNonInterleaved, /* hostOutputSampleFormat */ + jackSr, + streamFlags, + framesPerBuffer, + 0, /* Ignored */ + paUtilUnknownHostBufferSize, /* Buffer size may vary on JACK's discretion */ + streamCallback, + userData ) ); + bpInitialized = 1; + + if( stream->num_incoming_connections > 0 ) + stream->streamRepresentation.streamInfo.inputLatency = (jack_port_get_latency( stream->remote_output_ports[0] ) + - jack_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */ + + PaUtil_GetBufferProcessorInputLatencyFrames( &stream->bufferProcessor )) / sampleRate; + if( stream->num_outgoing_connections > 0 ) + stream->streamRepresentation.streamInfo.outputLatency = (jack_port_get_latency( stream->remote_input_ports[0] ) + - jack_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */ + + PaUtil_GetBufferProcessorOutputLatencyFrames( &stream->bufferProcessor )) / sampleRate; + + stream->streamRepresentation.streamInfo.sampleRate = jackSr; + stream->t0 = jack_frame_time( jackHostApi->jack_client ); /* A: Time should run from Pa_OpenStream */ + + /* Add to queue of opened streams */ + ENSURE_PA( AddStream( stream ) ); + + *s = (PaStream*)stream; + + return result; + +error: + if( stream ) + CleanUpStream( stream, srInitialized, bpInitialized ); + + return result; +} + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaJackStream *stream = (PaJackStream*)s; + + /* Remove this stream from the processing queue */ + ENSURE_PA( RemoveStream( stream ) ); + +error: + CleanUpStream( stream, 1, 1 ); + return result; +} + +static PaError RealProcess( PaJackStream *stream, jack_nframes_t frames ) +{ + PaError result = paNoError; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; + int chn; + int framesProcessed; + const double sr = jack_get_sample_rate( stream->jack_client ); /* Shouldn't change during the process callback */ + PaStreamCallbackFlags cbFlags = 0; + + /* If the user has returned !paContinue from the callback we'll want to flush the internal buffers, + * when these are empty we can finally mark the stream as inactive */ + if( stream->callbackResult != paContinue && + PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) + { + stream->is_active = 0; + if( stream->streamRepresentation.streamFinishedCallback ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + PA_DEBUG(( "%s: Callback finished\n", __FUNCTION__ )); + + goto end; + } + + timeInfo.currentTime = (jack_frame_time( stream->jack_client ) - stream->t0) / sr; + if( stream->num_incoming_connections > 0 ) + timeInfo.inputBufferAdcTime = timeInfo.currentTime - jack_port_get_latency( stream->remote_output_ports[0] ) + / sr; + if( stream->num_outgoing_connections > 0 ) + timeInfo.outputBufferDacTime = timeInfo.currentTime + jack_port_get_latency( stream->remote_input_ports[0] ) + / sr; + + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + if( stream->xrun ) + { + /* XXX: Any way to tell which of these occurred? */ + cbFlags = paOutputUnderflow | paInputOverflow; + stream->xrun = FALSE; + } + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, + cbFlags ); + + if( stream->num_incoming_connections > 0 ) + PaUtil_SetInputFrameCount( &stream->bufferProcessor, frames ); + if( stream->num_outgoing_connections > 0 ) + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, frames ); + + for( chn = 0; chn < stream->num_incoming_connections; chn++ ) + { + jack_default_audio_sample_t *channel_buf = (jack_default_audio_sample_t*) + jack_port_get_buffer( stream->local_input_ports[chn], + frames ); + + PaUtil_SetNonInterleavedInputChannel( &stream->bufferProcessor, + chn, + channel_buf ); + } + + for( chn = 0; chn < stream->num_outgoing_connections; chn++ ) + { + jack_default_audio_sample_t *channel_buf = (jack_default_audio_sample_t*) + jack_port_get_buffer( stream->local_output_ports[chn], + frames ); + + PaUtil_SetNonInterleavedOutputChannel( &stream->bufferProcessor, + chn, + channel_buf ); + } + + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, + &stream->callbackResult ); + /* We've specified a host buffer size mode where every frame should be consumed by the buffer processor */ + assert( framesProcessed == frames ); + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + +end: + return result; +} + +/* Update the JACK callback's stream processing queue. */ +static PaError UpdateQueue( PaJackHostApiRepresentation *hostApi ) +{ + PaError result = paNoError; + int queueModified = 0; + const double jackSr = jack_get_sample_rate( hostApi->jack_client ); + int err; + + if( (err = pthread_mutex_trylock( &hostApi->mtx )) != 0 ) + { + assert( err == EBUSY ); + return paNoError; + } + + if( hostApi->toAdd ) + { + if( hostApi->processQueue ) + { + PaJackStream *node = hostApi->processQueue; + /* Advance to end of queue */ + while( node->next ) + node = node->next; + + node->next = hostApi->toAdd; + } + else + { + /* The only queue entry. */ + hostApi->processQueue = (PaJackStream *)hostApi->toAdd; + } + + /* If necessary, update stream state */ + if( hostApi->toAdd->streamRepresentation.streamInfo.sampleRate != jackSr ) + UpdateSampleRate( hostApi->toAdd, jackSr ); + + hostApi->toAdd = NULL; + queueModified = 1; + } + if( hostApi->toRemove ) + { + int removed = 0; + PaJackStream *node = hostApi->processQueue, *prev = NULL; + assert( hostApi->processQueue ); + + while( node ) + { + if( node == hostApi->toRemove ) + { + if( prev ) + prev->next = node->next; + else + hostApi->processQueue = (PaJackStream *)node->next; + + removed = 1; + break; + } + + prev = node; + node = node->next; + } + UNLESS( removed, paInternalError ); + hostApi->toRemove = NULL; + PA_DEBUG(( "%s: Removed stream from processing queue\n", __FUNCTION__ )); + queueModified = 1; + } + + if( queueModified ) + { + /* Signal that we've done what was asked of us */ + ASSERT_CALL( pthread_cond_signal( &hostApi->cond ), 0 ); + } + +error: + ASSERT_CALL( pthread_mutex_unlock( &hostApi->mtx ), 0 ); + + return result; +} + +/* Audio processing callback invoked periodically from JACK. */ +static int JackCallback( jack_nframes_t frames, void *userData ) +{ + PaError result = paNoError; + PaJackHostApiRepresentation *hostApi = (PaJackHostApiRepresentation *)userData; + PaJackStream *stream = NULL; + int xrun = hostApi->xrun; + hostApi->xrun = 0; + + assert( hostApi ); + + ENSURE_PA( UpdateQueue( hostApi ) ); + + /* Process each stream */ + stream = hostApi->processQueue; + for( ; stream; stream = stream->next ) + { + if( xrun ) /* Don't override if already set */ + stream->xrun = 1; + + /* See if this stream is to be started */ + if( stream->doStart ) + { + /* If we can't obtain a lock, we'll try next time */ + int err = pthread_mutex_trylock( &stream->hostApi->mtx ); + if( !err ) + { + if( stream->doStart ) /* Could potentially change before obtaining the lock */ + { + stream->is_active = 1; + stream->doStart = 0; + PA_DEBUG(( "%s: Starting stream\n", __FUNCTION__ )); + ASSERT_CALL( pthread_cond_signal( &stream->hostApi->cond ), 0 ); + stream->callbackResult = paContinue; + stream->isSilenced = 0; + } + + ASSERT_CALL( pthread_mutex_unlock( &stream->hostApi->mtx ), 0 ); + } + else + assert( err == EBUSY ); + } + else if( stream->doStop || stream->doAbort ) /* Should we stop/abort stream? */ + { + if( stream->callbackResult == paContinue ) /* Ok, make it stop */ + { + PA_DEBUG(( "%s: Stopping stream\n", __FUNCTION__ )); + stream->callbackResult = stream->doStop ? paComplete : paAbort; + } + } + + if( stream->is_active ) + ENSURE_PA( RealProcess( stream, frames ) ); + /* If we have just entered inactive state, silence output */ + if( !stream->is_active && !stream->isSilenced ) + { + int i; + + /* Silence buffer after entering inactive state */ + PA_DEBUG(( "Silencing the output\n" )); + for( i = 0; i < stream->num_outgoing_connections; ++i ) + { + jack_default_audio_sample_t *buffer = jack_port_get_buffer( stream->local_output_ports[i], frames ); + memset( buffer, 0, sizeof (jack_default_audio_sample_t) * frames ); + } + + stream->isSilenced = 1; + } + + if( stream->doStop || stream->doAbort ) + { + /* See if RealProcess has acted on the request */ + if( !stream->is_active ) /* Ok, signal to the main thread that we've carried out the operation */ + { + /* If we can't obtain a lock, we'll try next time */ + int err = pthread_mutex_trylock( &stream->hostApi->mtx ); + if( !err ) + { + stream->doStop = stream->doAbort = 0; + ASSERT_CALL( pthread_cond_signal( &stream->hostApi->cond ), 0 ); + ASSERT_CALL( pthread_mutex_unlock( &stream->hostApi->mtx ), 0 ); + } + else + assert( err == EBUSY ); + } + } + } + + return 0; +error: + return -1; +} + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaJackStream *stream = (PaJackStream*)s; + int i; + + /* Ready the processor */ + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + /* Connect the ports. Note that the ports may already have been connected by someone else in + * the meantime, in which case JACK returns EEXIST. */ + + if( stream->num_incoming_connections > 0 ) + { + for( i = 0; i < stream->num_incoming_connections; i++ ) + { + int r = jack_connect( stream->jack_client, jack_port_name( stream->remote_output_ports[i] ), + jack_port_name( stream->local_input_ports[i] ) ); + UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); + } + } + + if( stream->num_outgoing_connections > 0 ) + { + for( i = 0; i < stream->num_outgoing_connections; i++ ) + { + int r = jack_connect( stream->jack_client, jack_port_name( stream->local_output_ports[i] ), + jack_port_name( stream->remote_input_ports[i] ) ); + UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); + } + } + + stream->xrun = FALSE; + + /* Enable processing */ + + ASSERT_CALL( pthread_mutex_lock( &stream->hostApi->mtx ), 0 ); + stream->doStart = 1; + + /* Wait for stream to be started */ + result = WaitCondition( stream->hostApi ); + /* + do + { + err = pthread_cond_timedwait( &stream->hostApi->cond, &stream->hostApi->mtx, &ts ); + } while( !stream->is_active && !err ); + */ + if( result != paNoError ) /* Something went wrong, call off the stream start */ + { + stream->doStart = 0; + stream->is_active = 0; /* Cancel any processing */ + } + ASSERT_CALL( pthread_mutex_unlock( &stream->hostApi->mtx ), 0 ); + + ENSURE_PA( result ); + + stream->is_running = TRUE; + PA_DEBUG(( "%s: Stream started\n", __FUNCTION__ )); + +error: + return result; +} + +static PaError RealStop( PaJackStream *stream, int abort ) +{ + PaError result = paNoError; + int i; + + if( stream->isBlockingStream ) + BlockingWaitEmpty ( stream ); + + ASSERT_CALL( pthread_mutex_lock( &stream->hostApi->mtx ), 0 ); + if( abort ) + stream->doAbort = 1; + else + stream->doStop = 1; + + /* Wait for stream to be stopped */ + result = WaitCondition( stream->hostApi ); + ASSERT_CALL( pthread_mutex_unlock( &stream->hostApi->mtx ), 0 ); + ENSURE_PA( result ); + + UNLESS( !stream->is_active, paInternalError ); + + PA_DEBUG(( "%s: Stream stopped\n", __FUNCTION__ )); + +error: + stream->is_running = FALSE; + + /* Disconnect ports belonging to this stream */ + + if( !stream->hostApi->jackIsDown ) /* XXX: Well? */ + { + for( i = 0; i < stream->num_incoming_connections; i++ ) + { + if( jack_port_connected( stream->local_input_ports[i] ) ) + { + UNLESS( !jack_port_disconnect( stream->jack_client, stream->local_input_ports[i] ), + paUnanticipatedHostError ); + } + } + for( i = 0; i < stream->num_outgoing_connections; i++ ) + { + if( jack_port_connected( stream->local_output_ports[i] ) ) + { + UNLESS( !jack_port_disconnect( stream->jack_client, stream->local_output_ports[i] ), + paUnanticipatedHostError ); + } + } + } + + return result; +} + +static PaError StopStream( PaStream *s ) +{ + assert(s); + return RealStop( (PaJackStream *)s, 0 ); +} + +static PaError AbortStream( PaStream *s ) +{ + assert(s); + return RealStop( (PaJackStream *)s, 1 ); +} + +static PaError IsStreamStopped( PaStream *s ) +{ + PaJackStream *stream = (PaJackStream*)s; + return !stream->is_running; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaJackStream *stream = (PaJackStream*)s; + return stream->is_active; +} + + +static PaTime GetStreamTime( PaStream *s ) +{ + PaJackStream *stream = (PaJackStream*)s; + + /* A: Is this relevant?? --> TODO: what if we're recording-only? */ + return (jack_frame_time( stream->jack_client ) - stream->t0) / (PaTime)jack_get_sample_rate( stream->jack_client ); +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaJackStream *stream = (PaJackStream*)s; + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + +PaError PaJack_SetClientName( const char* name ) +{ + if( strlen( name ) > jack_client_name_size() ) + { + /* OK, I don't know any better error code */ + return paInvalidFlag; + } + clientName_ = name; + return paNoError; +} + +PaError PaJack_GetClientName(const char** clientName) +{ + PaError result = paNoError; + PaJackHostApiRepresentation* jackHostApi = NULL; + PaJackHostApiRepresentation** ref = &jackHostApi; + ENSURE_PA( PaUtil_GetHostApiRepresentation( (PaUtilHostApiRepresentation**)ref, paJACK ) ); + *clientName = jack_get_client_name( jackHostApi->jack_client ); + +error: + return result; +} diff --git a/Externals/portaudio/src/hostapi/oss/low_latency_tip.txt b/Externals/portaudio/src/hostapi/oss/low_latency_tip.txt new file mode 100644 index 0000000000..2d982b79ba Binary files /dev/null and b/Externals/portaudio/src/hostapi/oss/low_latency_tip.txt differ diff --git a/Externals/portaudio/src/hostapi/oss/pa_unix_oss.c b/Externals/portaudio/src/hostapi/oss/pa_unix_oss.c new file mode 100644 index 0000000000..b91577beeb --- /dev/null +++ b/Externals/portaudio/src/hostapi/oss/pa_unix_oss.c @@ -0,0 +1,2030 @@ +/* + * $Id: pa_unix_oss.c 1668 2011-05-02 17:07:11Z rossb $ + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * OSS implementation by: + * Douglas Repetto + * Phil Burk + * Dominic Mazzoni + * Arve Knudsen + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** + @file + @ingroup hostapi_src +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_SOUNDCARD_H +# include +# ifdef __NetBSD__ +# define DEVICE_NAME_BASE "/dev/audio" +# else +# define DEVICE_NAME_BASE "/dev/dsp" +# endif +#elif defined(HAVE_LINUX_SOUNDCARD_H) +# include +# define DEVICE_NAME_BASE "/dev/dsp" +#elif defined(HAVE_MACHINE_SOUNDCARD_H) +# include /* JH20010905 */ +# define DEVICE_NAME_BASE "/dev/audio" +#else +# error No sound card header file +#endif + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_unix_util.h" +#include "pa_debugprint.h" + +static int sysErr_; +static pthread_t mainThread_; + +/* Check return value of system call, and map it to PaError */ +#define ENSURE_(expr, code) \ + do { \ + if( UNLIKELY( (sysErr_ = (expr)) < 0 ) ) \ + { \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( (code) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ + { \ + PaUtil_SetLastHostErrorInfo( paOSS, sysErr_, strerror( errno ) ); \ + } \ + \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = (code); \ + goto error; \ + } \ + } while( 0 ); + +#ifndef AFMT_S16_NE +#define AFMT_S16_NE Get_AFMT_S16_NE() +/********************************************************************* + * Some versions of OSS do not define AFMT_S16_NE. So check CPU. + * PowerPC is Big Endian. X86 is Little Endian. + */ +static int Get_AFMT_S16_NE( void ) +{ + long testData = 1; + char *ptr = (char *) &testData; + int isLittle = ( *ptr == 1 ); /* Does address point to least significant byte? */ + return isLittle ? AFMT_S16_LE : AFMT_S16_BE; +} +#endif + +/* PaOSSHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + PaHostApiIndex hostApiIndex; +} +PaOSSHostApiRepresentation; + +/** Per-direction structure for PaOssStream. + * + * Aspect StreamChannels: In case the user requests to open the same device for both capture and playback, + * but with different number of channels we will have to adapt between the number of user and host + * channels for at least one direction, since the configuration space is the same for both directions + * of an OSS device. + */ +typedef struct +{ + int fd; + const char *devName; + int userChannelCount, hostChannelCount; + int userInterleaved; + void *buffer; + PaSampleFormat userFormat, hostFormat; + double latency; + unsigned long hostFrames, numBufs; + void **userBuffers; /* For non-interleaved blocking */ +} PaOssStreamComponent; + +/** Implementation specific representation of a PaStream. + * + */ +typedef struct PaOssStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + PaUtilThreading threading; + + int sharedDevice; + unsigned long framesPerHostBuffer; + int triggered; /* Have the devices been triggered yet (first start) */ + + int isActive; + int isStopped; + + int lastPosPtr; + double lastStreamBytes; + + int framesProcessed; + + double sampleRate; + + int callbackMode; + volatile int callbackStop, callbackAbort; + + PaOssStreamComponent *capture, *playback; + unsigned long pollTimeout; + sem_t semaphore; +} +PaOssStream; + +typedef enum { + StreamMode_In, + StreamMode_Out +} StreamMode; + +/* prototypes for functions declared in this file */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); +static PaError BuildDeviceList( PaOSSHostApiRepresentation *hostApi ); + + +/** Initialize the OSS API implementation. + * + * This function will initialize host API datastructures and query host devices for information. + * + * Aspect DeviceCapabilities: Enumeration of host API devices is initiated from here + * + * Aspect FreeResources: If an error is encountered under way we have to free each resource allocated in this function, + * this happens with the usual "error" label. + */ +PaError PaOSS_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaOSSHostApiRepresentation *ossHostApi = NULL; + + PA_UNLESS( ossHostApi = (PaOSSHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaOSSHostApiRepresentation) ), + paInsufficientMemory ); + PA_UNLESS( ossHostApi->allocations = PaUtil_CreateAllocationGroup(), paInsufficientMemory ); + ossHostApi->hostApiIndex = hostApiIndex; + + /* Initialize host API structure */ + *hostApi = &ossHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paOSS; + (*hostApi)->info.name = "OSS"; + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PA_ENSURE( BuildDeviceList( ossHostApi ) ); + + PaUtil_InitializeStreamInterface( &ossHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, + PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &ossHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + mainThread_ = pthread_self(); + + return result; + +error: + if( ossHostApi ) + { + if( ossHostApi->allocations ) + { + PaUtil_FreeAllAllocations( ossHostApi->allocations ); + PaUtil_DestroyAllocationGroup( ossHostApi->allocations ); + } + + PaUtil_FreeMemory( ossHostApi ); + } + return result; +} + +PaError PaUtil_InitializeDeviceInfo( PaDeviceInfo *deviceInfo, const char *name, PaHostApiIndex hostApiIndex, int maxInputChannels, + int maxOutputChannels, PaTime defaultLowInputLatency, PaTime defaultLowOutputLatency, PaTime defaultHighInputLatency, + PaTime defaultHighOutputLatency, double defaultSampleRate, PaUtilAllocationGroup *allocations ) +{ + PaError result = paNoError; + + deviceInfo->structVersion = 2; + if( allocations ) + { + size_t len = strlen( name ) + 1; + PA_UNLESS( deviceInfo->name = PaUtil_GroupAllocateMemory( allocations, len ), paInsufficientMemory ); + strncpy( (char *)deviceInfo->name, name, len ); + } + else + deviceInfo->name = name; + + deviceInfo->hostApi = hostApiIndex; + deviceInfo->maxInputChannels = maxInputChannels; + deviceInfo->maxOutputChannels = maxOutputChannels; + deviceInfo->defaultLowInputLatency = defaultLowInputLatency; + deviceInfo->defaultLowOutputLatency = defaultLowOutputLatency; + deviceInfo->defaultHighInputLatency = defaultHighInputLatency; + deviceInfo->defaultHighOutputLatency = defaultHighOutputLatency; + deviceInfo->defaultSampleRate = defaultSampleRate; + +error: + return result; +} + +static PaError QueryDirection( const char *deviceName, StreamMode mode, double *defaultSampleRate, int *maxChannelCount, + double *defaultLowLatency, double *defaultHighLatency ) +{ + PaError result = paNoError; + int numChannels, maxNumChannels; + int busy = 0; + int devHandle = -1; + int sr; + *maxChannelCount = 0; /* Default value in case this fails */ + + if ( (devHandle = open( deviceName, (mode == StreamMode_In ? O_RDONLY : O_WRONLY) | O_NONBLOCK )) < 0 ) + { + if( errno == EBUSY || errno == EAGAIN ) + { + PA_DEBUG(( "%s: Device %s busy\n", __FUNCTION__, deviceName )); + } + else + { + /* Ignore ENOENT, which means we've tried a non-existent device */ + if( errno != ENOENT ) + { + PA_DEBUG(( "%s: Can't access device %s: %s\n", __FUNCTION__, deviceName, strerror( errno ) )); + } + } + + return paDeviceUnavailable; + } + + /* Negotiate for the maximum number of channels for this device. PLB20010927 + * Consider up to 16 as the upper number of channels. + * Variable maxNumChannels should contain the actual upper limit after the call. + * Thanks to John Lazzaro and Heiko Purnhagen for suggestions. + */ + maxNumChannels = 0; + for( numChannels = 1; numChannels <= 16; numChannels++ ) + { + int temp = numChannels; + if( ioctl( devHandle, SNDCTL_DSP_CHANNELS, &temp ) < 0 ) + { + busy = EAGAIN == errno || EBUSY == errno; + /* ioctl() failed so bail out if we already have stereo */ + if( maxNumChannels >= 2 ) + break; + } + else + { + /* ioctl() worked but bail out if it does not support numChannels. + * We don't want to leave gaps in the numChannels supported. + */ + if( (numChannels > 2) && (temp != numChannels) ) + break; + if( temp > maxNumChannels ) + maxNumChannels = temp; /* Save maximum. */ + } + } + /* A: We're able to open a device for capture if it's busy playing back and vice versa, + * but we can't configure anything */ + if( 0 == maxNumChannels && busy ) + { + result = paDeviceUnavailable; + goto error; + } + + /* The above negotiation may fail for an old driver so try this older technique. */ + if( maxNumChannels < 1 ) + { + int stereo = 1; + if( ioctl( devHandle, SNDCTL_DSP_STEREO, &stereo ) < 0 ) + { + maxNumChannels = 1; + } + else + { + maxNumChannels = (stereo) ? 2 : 1; + } + PA_DEBUG(( "%s: use SNDCTL_DSP_STEREO, maxNumChannels = %d\n", __FUNCTION__, maxNumChannels )); + } + + /* During channel negotiation, the last ioctl() may have failed. This can + * also cause sample rate negotiation to fail. Hence the following, to return + * to a supported number of channels. SG20011005 */ + { + /* use most reasonable default value */ + int temp = PA_MIN( maxNumChannels, 2 ); + ENSURE_( ioctl( devHandle, SNDCTL_DSP_CHANNELS, &temp ), paUnanticipatedHostError ); + } + + /* Get supported sample rate closest to 44100 Hz */ + if( *defaultSampleRate < 0 ) + { + sr = 44100; + ENSURE_( ioctl( devHandle, SNDCTL_DSP_SPEED, &sr ), paUnanticipatedHostError ); + + *defaultSampleRate = sr; + } + + *maxChannelCount = maxNumChannels; + /* TODO */ + *defaultLowLatency = 512. / *defaultSampleRate; + *defaultHighLatency = 2048. / *defaultSampleRate; + +error: + if( devHandle >= 0 ) + close( devHandle ); + + return result; +} + +/** Query OSS device. + * + * This is where PaDeviceInfo objects are constructed and filled in with relevant information. + * + * Aspect DeviceCapabilities: The inferred device capabilities are recorded in a PaDeviceInfo object that is constructed + * in place. + */ +static PaError QueryDevice( char *deviceName, PaOSSHostApiRepresentation *ossApi, PaDeviceInfo **deviceInfo ) +{ + PaError result = paNoError; + double sampleRate = -1.; + int maxInputChannels, maxOutputChannels; + PaTime defaultLowInputLatency, defaultLowOutputLatency, defaultHighInputLatency, defaultHighOutputLatency; + PaError tmpRes = paNoError; + int busy = 0; + *deviceInfo = NULL; + + /* douglas: + we have to do this querying in a slightly different order. apparently + some sound cards will give you different info based on their settins. + e.g. a card might give you stereo at 22kHz but only mono at 44kHz. + the correct order for OSS is: format, channels, sample rate + */ + + /* Aspect StreamChannels: The number of channels supported for a device may depend on the mode it is + * opened in, it may have more channels available for capture than playback and vice versa. Therefore + * we will open the device in both read- and write-only mode to determine the supported number. + */ + if( (tmpRes = QueryDirection( deviceName, StreamMode_In, &sampleRate, &maxInputChannels, &defaultLowInputLatency, + &defaultHighInputLatency )) != paNoError ) + { + if( tmpRes != paDeviceUnavailable ) + { + PA_DEBUG(( "%s: Querying device %s for capture failed!\n", __FUNCTION__, deviceName )); + /* PA_ENSURE( tmpRes ); */ + } + ++busy; + } + if( (tmpRes = QueryDirection( deviceName, StreamMode_Out, &sampleRate, &maxOutputChannels, &defaultLowOutputLatency, + &defaultHighOutputLatency )) != paNoError ) + { + if( tmpRes != paDeviceUnavailable ) + { + PA_DEBUG(( "%s: Querying device %s for playback failed!\n", __FUNCTION__, deviceName )); + /* PA_ENSURE( tmpRes ); */ + } + ++busy; + } + assert( 0 <= busy && busy <= 2 ); + if( 2 == busy ) /* Both directions are unavailable to us */ + { + result = paDeviceUnavailable; + goto error; + } + + PA_UNLESS( *deviceInfo = PaUtil_GroupAllocateMemory( ossApi->allocations, sizeof (PaDeviceInfo) ), paInsufficientMemory ); + PA_ENSURE( PaUtil_InitializeDeviceInfo( *deviceInfo, deviceName, ossApi->hostApiIndex, maxInputChannels, maxOutputChannels, + defaultLowInputLatency, defaultLowOutputLatency, defaultHighInputLatency, defaultHighOutputLatency, sampleRate, + ossApi->allocations ) ); + +error: + return result; +} + +/** Query host devices. + * + * Loop over host devices and query their capabilitiesu + * + * Aspect DeviceCapabilities: This function calls QueryDevice on each device entry and receives a filled in PaDeviceInfo object + * per device, these are placed in the host api representation's deviceInfos array. + */ +static PaError BuildDeviceList( PaOSSHostApiRepresentation *ossApi ) +{ + PaError result = paNoError; + PaUtilHostApiRepresentation *commonApi = &ossApi->inheritedHostApiRep; + int i; + int numDevices = 0, maxDeviceInfos = 1; + PaDeviceInfo **deviceInfos = NULL; + + /* These two will be set to the first working input and output device, respectively */ + commonApi->info.defaultInputDevice = paNoDevice; + commonApi->info.defaultOutputDevice = paNoDevice; + + /* Find devices by calling QueryDevice on each + * potential device names. When we find a valid one, + * add it to a linked list. + * A: Set an arbitrary of 100 devices, should probably be a smarter way. */ + + for( i = 0; i < 100; i++ ) + { + char deviceName[32]; + PaDeviceInfo *deviceInfo; + int testResult; + + if( i == 0 ) + snprintf(deviceName, sizeof (deviceName), "%s", DEVICE_NAME_BASE); + else + snprintf(deviceName, sizeof (deviceName), "%s%d", DEVICE_NAME_BASE, i); + + /* PA_DEBUG(("%s: trying device %s\n", __FUNCTION__, deviceName )); */ + if( (testResult = QueryDevice( deviceName, ossApi, &deviceInfo )) != paNoError ) + { + if( testResult != paDeviceUnavailable ) + PA_ENSURE( testResult ); + + continue; + } + + ++numDevices; + if( !deviceInfos || numDevices > maxDeviceInfos ) + { + maxDeviceInfos *= 2; + PA_UNLESS( deviceInfos = (PaDeviceInfo **) realloc( deviceInfos, maxDeviceInfos * sizeof (PaDeviceInfo *) ), + paInsufficientMemory ); + } + { + int devIdx = numDevices - 1; + deviceInfos[devIdx] = deviceInfo; + + if( commonApi->info.defaultInputDevice == paNoDevice && deviceInfo->maxInputChannels > 0 ) + commonApi->info.defaultInputDevice = devIdx; + if( commonApi->info.defaultOutputDevice == paNoDevice && deviceInfo->maxOutputChannels > 0 ) + commonApi->info.defaultOutputDevice = devIdx; + } + } + + /* Make an array of PaDeviceInfo pointers out of the linked list */ + + PA_DEBUG(("PaOSS %s: Total number of devices found: %d\n", __FUNCTION__, numDevices)); + + commonApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + ossApi->allocations, sizeof(PaDeviceInfo*) * numDevices ); + memcpy( commonApi->deviceInfos, deviceInfos, numDevices * sizeof (PaDeviceInfo *) ); + + commonApi->info.deviceCount = numDevices; + +error: + free( deviceInfos ); + + return result; +} + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaOSSHostApiRepresentation *ossHostApi = (PaOSSHostApiRepresentation*)hostApi; + + if( ossHostApi->allocations ) + { + PaUtil_FreeAllAllocations( ossHostApi->allocations ); + PaUtil_DestroyAllocationGroup( ossHostApi->allocations ); + } + + PaUtil_FreeMemory( ossHostApi ); +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaError result = paNoError; + PaDeviceIndex device; + PaDeviceInfo *deviceInfo; + char *deviceName; + int inputChannelCount, outputChannelCount; + int tempDevHandle = -1; + int flags; + PaSampleFormat inputSampleFormat, outputSampleFormat; + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + outputChannelCount = 0; + } + + if (inputChannelCount == 0 && outputChannelCount == 0) + return paInvalidChannelCount; + + /* if full duplex, make sure that they're the same device */ + + if (inputChannelCount > 0 && outputChannelCount > 0 && + inputParameters->device != outputParameters->device) + return paInvalidDevice; + + /* if full duplex, also make sure that they're the same number of channels */ + + if (inputChannelCount > 0 && outputChannelCount > 0 && + inputChannelCount != outputChannelCount) + return paInvalidChannelCount; + + /* open the device so we can do more tests */ + + if( inputChannelCount > 0 ) + { + result = PaUtil_DeviceIndexToHostApiDeviceIndex(&device, inputParameters->device, hostApi); + if (result != paNoError) + return result; + } + else + { + result = PaUtil_DeviceIndexToHostApiDeviceIndex(&device, outputParameters->device, hostApi); + if (result != paNoError) + return result; + } + + deviceInfo = hostApi->deviceInfos[device]; + deviceName = (char *)deviceInfo->name; + + flags = O_NONBLOCK; + if (inputChannelCount > 0 && outputChannelCount > 0) + flags |= O_RDWR; + else if (inputChannelCount > 0) + flags |= O_RDONLY; + else + flags |= O_WRONLY; + + ENSURE_( tempDevHandle = open( deviceInfo->name, flags ), paDeviceUnavailable ); + + /* PaOssStream_Configure will do the rest of the checking for us */ + /* PA_ENSURE( PaOssStream_Configure( tempDevHandle, deviceName, outputChannelCount, &sampleRate ) ); */ + + /* everything succeeded! */ + + error: + if( tempDevHandle >= 0 ) + close( tempDevHandle ); + + return result; +} + +/** Validate stream parameters. + * + * Aspect StreamChannels: We verify that the number of channels is within the allowed range for the device + */ +static PaError ValidateParameters( const PaStreamParameters *parameters, const PaDeviceInfo *deviceInfo, StreamMode mode ) +{ + int maxChans; + + assert( parameters ); + + if( parameters->device == paUseHostApiSpecificDeviceSpecification ) + { + return paInvalidDevice; + } + + maxChans = (mode == StreamMode_In ? deviceInfo->maxInputChannels : + deviceInfo->maxOutputChannels); + if( parameters->channelCount > maxChans ) + { + return paInvalidChannelCount; + } + + return paNoError; +} + +static PaError PaOssStreamComponent_Initialize( PaOssStreamComponent *component, const PaStreamParameters *parameters, + int callbackMode, int fd, const char *deviceName ) +{ + PaError result = paNoError; + assert( component ); + + memset( component, 0, sizeof (PaOssStreamComponent) ); + + component->fd = fd; + component->devName = deviceName; + component->userChannelCount = parameters->channelCount; + component->userFormat = parameters->sampleFormat; + component->latency = parameters->suggestedLatency; + component->userInterleaved = !(parameters->sampleFormat & paNonInterleaved); + + if( !callbackMode && !component->userInterleaved ) + { + /* Pre-allocate non-interleaved user provided buffers */ + PA_UNLESS( component->userBuffers = PaUtil_AllocateMemory( sizeof (void *) * component->userChannelCount ), + paInsufficientMemory ); + } + +error: + return result; +} + +static void PaOssStreamComponent_Terminate( PaOssStreamComponent *component ) +{ + assert( component ); + + if( component->fd >= 0 ) + close( component->fd ); + if( component->buffer ) + PaUtil_FreeMemory( component->buffer ); + + if( component->userBuffers ) + PaUtil_FreeMemory( component->userBuffers ); + + PaUtil_FreeMemory( component ); +} + +static PaError ModifyBlocking( int fd, int blocking ) +{ + PaError result = paNoError; + int fflags; + + ENSURE_( fflags = fcntl( fd, F_GETFL ), paUnanticipatedHostError ); + + if( blocking ) + fflags &= ~O_NONBLOCK; + else + fflags |= O_NONBLOCK; + + ENSURE_( fcntl( fd, F_SETFL, fflags ), paUnanticipatedHostError ); + +error: + return result; +} + +/** Open input and output devices. + * + * @param idev: Returned input device file descriptor. + * @param odev: Returned output device file descriptor. + */ +static PaError OpenDevices( const char *idevName, const char *odevName, int *idev, int *odev ) +{ + PaError result = paNoError; + int flags = O_NONBLOCK, duplex = 0; + *idev = *odev = -1; + + if( idevName && odevName ) + { + duplex = 1; + flags |= O_RDWR; + } + else if( idevName ) + flags |= O_RDONLY; + else + flags |= O_WRONLY; + + /* open first in nonblocking mode, in case it's busy... + * A: then unset the non-blocking attribute */ + assert( flags & O_NONBLOCK ); + if( idevName ) + { + ENSURE_( *idev = open( idevName, flags ), paDeviceUnavailable ); + PA_ENSURE( ModifyBlocking( *idev, 1 ) ); /* Blocking */ + } + if( odevName ) + { + if( !idevName ) + { + ENSURE_( *odev = open( odevName, flags ), paDeviceUnavailable ); + PA_ENSURE( ModifyBlocking( *odev, 1 ) ); /* Blocking */ + } + else + { + ENSURE_( *odev = dup( *idev ), paUnanticipatedHostError ); + } + } + +error: + return result; +} + +static PaError PaOssStream_Initialize( PaOssStream *stream, const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, + PaStreamCallback callback, void *userData, PaStreamFlags streamFlags, + PaOSSHostApiRepresentation *ossApi ) +{ + PaError result = paNoError; + int idev, odev; + PaUtilHostApiRepresentation *hostApi = &ossApi->inheritedHostApiRep; + const char *idevName = NULL, *odevName = NULL; + + assert( stream ); + + memset( stream, 0, sizeof (PaOssStream) ); + stream->isStopped = 1; + + PA_ENSURE( PaUtil_InitializeThreading( &stream->threading ) ); + + if( inputParameters && outputParameters ) + { + if( inputParameters->device == outputParameters->device ) + stream->sharedDevice = 1; + } + + if( inputParameters ) + idevName = hostApi->deviceInfos[inputParameters->device]->name; + if( outputParameters ) + odevName = hostApi->deviceInfos[outputParameters->device]->name; + PA_ENSURE( OpenDevices( idevName, odevName, &idev, &odev ) ); + if( inputParameters ) + { + PA_UNLESS( stream->capture = PaUtil_AllocateMemory( sizeof (PaOssStreamComponent) ), paInsufficientMemory ); + PA_ENSURE( PaOssStreamComponent_Initialize( stream->capture, inputParameters, callback != NULL, idev, idevName ) ); + } + if( outputParameters ) + { + PA_UNLESS( stream->playback = PaUtil_AllocateMemory( sizeof (PaOssStreamComponent) ), paInsufficientMemory ); + PA_ENSURE( PaOssStreamComponent_Initialize( stream->playback, outputParameters, callback != NULL, odev, odevName ) ); + } + + if( callback != NULL ) + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &ossApi->callbackStreamInterface, callback, userData ); + stream->callbackMode = 1; + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &ossApi->blockingStreamInterface, callback, userData ); + } + + ENSURE_( sem_init( &stream->semaphore, 0, 0 ), paInternalError ); + +error: + return result; +} + +static void PaOssStream_Terminate( PaOssStream *stream ) +{ + assert( stream ); + + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_TerminateThreading( &stream->threading ); + + if( stream->capture ) + PaOssStreamComponent_Terminate( stream->capture ); + if( stream->playback ) + PaOssStreamComponent_Terminate( stream->playback ); + + sem_destroy( &stream->semaphore ); + + PaUtil_FreeMemory( stream ); +} + +/** Translate from PA format to OSS native. + * + */ +static PaError Pa2OssFormat( PaSampleFormat paFormat, int *ossFormat ) +{ + switch( paFormat ) + { + case paUInt8: + *ossFormat = AFMT_U8; + break; + case paInt8: + *ossFormat = AFMT_S8; + break; + case paInt16: + *ossFormat = AFMT_S16_NE; + break; + default: + return paInternalError; /* This shouldn't happen */ + } + + return paNoError; +} + +/** Return the PA-compatible formats that this device can support. + * + */ +static PaError GetAvailableFormats( PaOssStreamComponent *component, PaSampleFormat *availableFormats ) +{ + PaError result = paNoError; + int mask = 0; + PaSampleFormat frmts = 0; + + ENSURE_( ioctl( component->fd, SNDCTL_DSP_GETFMTS, &mask ), paUnanticipatedHostError ); + if( mask & AFMT_U8 ) + frmts |= paUInt8; + if( mask & AFMT_S8 ) + frmts |= paInt8; + if( mask & AFMT_S16_NE ) + frmts |= paInt16; + else + result = paSampleFormatNotSupported; + + *availableFormats = frmts; + +error: + return result; +} + +static unsigned int PaOssStreamComponent_FrameSize( PaOssStreamComponent *component ) +{ + return Pa_GetSampleSize( component->hostFormat ) * component->hostChannelCount; +} + +/** Buffer size in bytes. + * + */ +static unsigned long PaOssStreamComponent_BufferSize( PaOssStreamComponent *component ) +{ + return PaOssStreamComponent_FrameSize( component ) * component->hostFrames * component->numBufs; +} + +static int CalcHigherLogTwo( int n ) +{ + int log2 = 0; + while( (1<userChannelCount; + int frgmt; + int numBufs; + int bytesPerBuf; + unsigned long bufSz; + unsigned long fragSz; + audio_buf_info bufInfo; + + /* We may have a situation where only one component (the master) is configured, if both point to the same device. + * In that case, the second component will copy settings from the other */ + if( !master ) + { + /* Aspect BufferSettings: If framesPerBuffer is unspecified we have to infer a suitable fragment size. + * The hardware need not respect the requested fragment size, so we may have to adapt. + */ + if( framesPerBuffer == paFramesPerBufferUnspecified ) + { + bufSz = (unsigned long)(component->latency * sampleRate); + fragSz = bufSz / 4; + } + else + { + fragSz = framesPerBuffer; + bufSz = (unsigned long)(component->latency * sampleRate) + fragSz; /* Latency + 1 buffer */ + } + + PA_ENSURE( GetAvailableFormats( component, &availableFormats ) ); + hostFormat = PaUtil_SelectClosestAvailableFormat( availableFormats, component->userFormat ); + + /* OSS demands at least 2 buffers, and 16 bytes per buffer */ + numBufs = (int)PA_MAX( bufSz / fragSz, 2 ); + bytesPerBuf = PA_MAX( fragSz * Pa_GetSampleSize( hostFormat ) * chans, 16 ); + + /* The fragment parameters are encoded like this: + * Most significant byte: number of fragments + * Least significant byte: exponent of fragment size (i.e., for 256, 8) + */ + frgmt = (numBufs << 16) + (CalcHigherLogTwo( bytesPerBuf ) & 0xffff); + ENSURE_( ioctl( component->fd, SNDCTL_DSP_SETFRAGMENT, &frgmt ), paUnanticipatedHostError ); + + /* A: according to the OSS programmer's guide parameters should be set in this order: + * format, channels, rate */ + + /* This format should be deemed good before we get this far */ + PA_ENSURE( Pa2OssFormat( hostFormat, &temp ) ); + nativeFormat = temp; + ENSURE_( ioctl( component->fd, SNDCTL_DSP_SETFMT, &temp ), paUnanticipatedHostError ); + PA_UNLESS( temp == nativeFormat, paInternalError ); + + /* try to set the number of channels */ + ENSURE_( ioctl( component->fd, SNDCTL_DSP_CHANNELS, &chans ), paSampleFormatNotSupported ); /* XXX: Should be paInvalidChannelCount? */ + /* It's possible that the minimum number of host channels is greater than what the user requested */ + PA_UNLESS( chans >= component->userChannelCount, paInvalidChannelCount ); + + /* try to set the sample rate */ + ENSURE_( ioctl( component->fd, SNDCTL_DSP_SPEED, &sr ), paInvalidSampleRate ); + + /* reject if there's no sample rate within 1% of the one requested */ + if( (fabs( sampleRate - sr ) / sampleRate) > 0.01 ) + { + PA_DEBUG(("%s: Wanted %f, closest sample rate was %d\n", __FUNCTION__, sampleRate, sr )); + PA_ENSURE( paInvalidSampleRate ); + } + + ENSURE_( ioctl( component->fd, streamMode == StreamMode_In ? SNDCTL_DSP_GETISPACE : SNDCTL_DSP_GETOSPACE, &bufInfo ), + paUnanticipatedHostError ); + component->numBufs = bufInfo.fragstotal; + + /* This needs to be the last ioctl call before the first read/write, according to the OSS programmer's guide */ + ENSURE_( ioctl( component->fd, SNDCTL_DSP_GETBLKSIZE, &bytesPerBuf ), paUnanticipatedHostError ); + + component->hostFrames = bytesPerBuf / Pa_GetSampleSize( hostFormat ) / chans; + component->hostChannelCount = chans; + component->hostFormat = hostFormat; + } + else + { + component->hostFormat = master->hostFormat; + component->hostFrames = master->hostFrames; + component->hostChannelCount = master->hostChannelCount; + component->numBufs = master->numBufs; + } + + PA_UNLESS( component->buffer = PaUtil_AllocateMemory( PaOssStreamComponent_BufferSize( component ) ), + paInsufficientMemory ); + +error: + return result; +} + +static PaError PaOssStreamComponent_Read( PaOssStreamComponent *component, unsigned long *frames ) +{ + PaError result = paNoError; + size_t len = *frames * PaOssStreamComponent_FrameSize( component ); + ssize_t bytesRead; + + ENSURE_( bytesRead = read( component->fd, component->buffer, len ), paUnanticipatedHostError ); + *frames = bytesRead / PaOssStreamComponent_FrameSize( component ); + /* TODO: Handle condition where number of frames read doesn't equal number of frames requested */ + +error: + return result; +} + +static PaError PaOssStreamComponent_Write( PaOssStreamComponent *component, unsigned long *frames ) +{ + PaError result = paNoError; + size_t len = *frames * PaOssStreamComponent_FrameSize( component ); + ssize_t bytesWritten; + + ENSURE_( bytesWritten = write( component->fd, component->buffer, len ), paUnanticipatedHostError ); + *frames = bytesWritten / PaOssStreamComponent_FrameSize( component ); + /* TODO: Handle condition where number of frames written doesn't equal number of frames requested */ + +error: + return result; +} + +/** Configure the stream according to input/output parameters. + * + * Aspect StreamChannels: The minimum number of channels supported by the device may exceed that requested by + * the user, if so we'll record the actual number of host channels and adapt later. + */ +static PaError PaOssStream_Configure( PaOssStream *stream, double sampleRate, unsigned long framesPerBuffer, + double *inputLatency, double *outputLatency ) +{ + PaError result = paNoError; + int duplex = stream->capture && stream->playback; + unsigned long framesPerHostBuffer = 0; + + /* We should request full duplex first thing after opening the device */ + if( duplex && stream->sharedDevice ) + ENSURE_( ioctl( stream->capture->fd, SNDCTL_DSP_SETDUPLEX, 0 ), paUnanticipatedHostError ); + + if( stream->capture ) + { + PaOssStreamComponent *component = stream->capture; + PA_ENSURE( PaOssStreamComponent_Configure( component, sampleRate, framesPerBuffer, StreamMode_In, + NULL ) ); + + assert( component->hostChannelCount > 0 ); + assert( component->hostFrames > 0 ); + + *inputLatency = (component->hostFrames * (component->numBufs - 1)) / sampleRate; + } + if( stream->playback ) + { + PaOssStreamComponent *component = stream->playback, *master = stream->sharedDevice ? stream->capture : NULL; + PA_ENSURE( PaOssStreamComponent_Configure( component, sampleRate, framesPerBuffer, StreamMode_Out, + master ) ); + + assert( component->hostChannelCount > 0 ); + assert( component->hostFrames > 0 ); + + *outputLatency = (component->hostFrames * (component->numBufs - 1)) / sampleRate; + } + + if( duplex ) + framesPerHostBuffer = PA_MIN( stream->capture->hostFrames, stream->playback->hostFrames ); + else if( stream->capture ) + framesPerHostBuffer = stream->capture->hostFrames; + else if( stream->playback ) + framesPerHostBuffer = stream->playback->hostFrames; + + stream->framesPerHostBuffer = framesPerHostBuffer; + stream->pollTimeout = (int) ceil( 1e6 * framesPerHostBuffer / sampleRate ); /* Period in usecs, rounded up */ + + stream->sampleRate = stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + +error: + return result; +} + +/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */ + +/** Open a PA OSS stream. + * + * Aspect StreamChannels: The number of channels is specified per direction (in/out), and can differ between the + * two. However, OSS doesn't support separate configuration spaces for capture and playback so if both + * directions are the same device we will demand the same number of channels. The number of channels can range + * from 1 to the maximum supported by the device. + * + * Aspect BufferSettings: If framesPerBuffer != paFramesPerBufferUnspecified the number of frames per callback + * must reflect this, in addition the host latency per device should approximate the corresponding + * suggestedLatency. Based on these constraints we need to determine a number of frames per host buffer that + * both capture and playback can agree on (they can be different devices), the buffer processor can adapt + * between host and user buffer size, but the ratio should preferably be integral. + */ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaOSSHostApiRepresentation *ossHostApi = (PaOSSHostApiRepresentation*)hostApi; + PaOssStream *stream = NULL; + int inputChannelCount = 0, outputChannelCount = 0; + PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0, inputHostFormat = 0, outputHostFormat = 0; + const PaDeviceInfo *inputDeviceInfo = 0, *outputDeviceInfo = 0; + int bpInitialized = 0; + double inLatency = 0., outLatency = 0.; + int i = 0; + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + if( inputParameters ) + { + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + inputDeviceInfo = hostApi->deviceInfos[inputParameters->device]; + PA_ENSURE( ValidateParameters( inputParameters, inputDeviceInfo, StreamMode_In ) ); + + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + } + if( outputParameters ) + { + outputDeviceInfo = hostApi->deviceInfos[outputParameters->device]; + PA_ENSURE( ValidateParameters( outputParameters, outputDeviceInfo, StreamMode_Out ) ); + + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + } + + /* Aspect StreamChannels: We currently demand that number of input and output channels are the same, if the same + * device is opened for both directions + */ + if( inputChannelCount > 0 && outputChannelCount > 0 ) + { + if( inputParameters->device == outputParameters->device ) + { + if( inputParameters->channelCount != outputParameters->channelCount ) + return paInvalidChannelCount; + } + } + + /* Round framesPerBuffer to the next power-of-two to make OSS happy. */ + if( framesPerBuffer != paFramesPerBufferUnspecified ) + { + framesPerBuffer &= INT_MAX; + for (i = 1; framesPerBuffer > i; i <<= 1) ; + framesPerBuffer = i; + } + + /* allocate and do basic initialization of the stream structure */ + PA_UNLESS( stream = (PaOssStream*)PaUtil_AllocateMemory( sizeof(PaOssStream) ), paInsufficientMemory ); + PA_ENSURE( PaOssStream_Initialize( stream, inputParameters, outputParameters, streamCallback, userData, streamFlags, ossHostApi ) ); + + PA_ENSURE( PaOssStream_Configure( stream, sampleRate, framesPerBuffer, &inLatency, &outLatency ) ); + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + if( inputParameters ) + { + inputHostFormat = stream->capture->hostFormat; + stream->streamRepresentation.streamInfo.inputLatency = inLatency + + PaUtil_GetBufferProcessorInputLatencyFrames( &stream->bufferProcessor ) / sampleRate; + } + if( outputParameters ) + { + outputHostFormat = stream->playback->hostFormat; + stream->streamRepresentation.streamInfo.outputLatency = outLatency + + PaUtil_GetBufferProcessorOutputLatencyFrames( &stream->bufferProcessor ) / sampleRate; + } + + /* Initialize buffer processor with fixed host buffer size. + * Aspect StreamSampleFormat: Here we commit the user and host sample formats, PA infrastructure will + * convert between the two. + */ + PA_ENSURE( PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, inputHostFormat, outputChannelCount, outputSampleFormat, + outputHostFormat, sampleRate, streamFlags, framesPerBuffer, stream->framesPerHostBuffer, + paUtilFixedHostBufferSize, streamCallback, userData ) ); + bpInitialized = 1; + + *s = (PaStream*)stream; + + return result; + +error: + if( bpInitialized ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + if( stream ) + PaOssStream_Terminate( stream ); + + return result; +} + +/*! Poll on I/O filedescriptors. + + Poll till we've determined there's data for read or write. In the full-duplex case, + we don't want to hang around forever waiting for either input or output frames, so + whenever we have a timed out filedescriptor we check if we're nearing under/overrun + for the other direction (critical limit set at one buffer). If so, we exit the waiting + state, and go on with what we got. We align the number of frames on a host buffer + boundary because it is possible that the buffer size differs for the two directions and + the host buffer size is a compromise between the two. + */ +static PaError PaOssStream_WaitForFrames( PaOssStream *stream, unsigned long *frames ) +{ + PaError result = paNoError; + int pollPlayback = 0, pollCapture = 0; + int captureAvail = INT_MAX, playbackAvail = INT_MAX, commonAvail; + audio_buf_info bufInfo; + /* int ofs = 0, nfds = stream->nfds; */ + fd_set readFds, writeFds; + int nfds = 0; + struct timeval selectTimeval = {0, 0}; + unsigned long timeout = stream->pollTimeout; /* In usecs */ + int captureFd = -1, playbackFd = -1; + + assert( stream ); + assert( frames ); + + if( stream->capture ) + { + pollCapture = 1; + captureFd = stream->capture->fd; + /* stream->capture->pfd->events = POLLIN; */ + } + if( stream->playback ) + { + pollPlayback = 1; + playbackFd = stream->playback->fd; + /* stream->playback->pfd->events = POLLOUT; */ + } + + FD_ZERO( &readFds ); + FD_ZERO( &writeFds ); + + while( pollPlayback || pollCapture ) + { +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#else + /* avoid indefinite waiting on thread not supporting cancelation */ + if( stream->callbackStop || stream->callbackAbort ) + { + PA_DEBUG(( "Cancelling PaOssStream_WaitForFrames\n" )); + (*frames) = 0; + return paNoError; + } +#endif + + /* select may modify the timeout parameter */ + selectTimeval.tv_usec = timeout; + nfds = 0; + + if( pollCapture ) + { + FD_SET( captureFd, &readFds ); + nfds = captureFd + 1; + } + if( pollPlayback ) + { + FD_SET( playbackFd, &writeFds ); + nfds = PA_MAX( nfds, playbackFd + 1 ); + } + ENSURE_( select( nfds, &readFds, &writeFds, NULL, &selectTimeval ), paUnanticipatedHostError ); + /* + if( poll( stream->pfds + ofs, nfds, stream->pollTimeout ) < 0 ) + { + + ENSURE_( -1, paUnanticipatedHostError ); + } + */ +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#else + /* avoid indefinite waiting on thread not supporting cancelation */ + if( stream->callbackStop || stream->callbackAbort ) + { + PA_DEBUG(( "Cancelling PaOssStream_WaitForFrames\n" )); + (*frames) = 0; + return paNoError; + } +#endif + if( pollCapture ) + { + if( FD_ISSET( captureFd, &readFds ) ) + { + FD_CLR( captureFd, &readFds ); + pollCapture = 0; + } + /* + if( stream->capture->pfd->revents & POLLIN ) + { + --nfds; + ++ofs; + pollCapture = 0; + } + */ + else if( stream->playback ) /* Timed out, go on with playback? */ + { + /*PA_DEBUG(( "%s: Trying to poll again for capture frames, pollTimeout: %d\n", + __FUNCTION__, stream->pollTimeout ));*/ + } + } + if( pollPlayback ) + { + if( FD_ISSET( playbackFd, &writeFds ) ) + { + FD_CLR( playbackFd, &writeFds ); + pollPlayback = 0; + } + /* + if( stream->playback->pfd->revents & POLLOUT ) + { + --nfds; + pollPlayback = 0; + } + */ + else if( stream->capture ) /* Timed out, go on with capture? */ + { + /*PA_DEBUG(( "%s: Trying to poll again for playback frames, pollTimeout: %d\n\n", + __FUNCTION__, stream->pollTimeout ));*/ + } + } + } + + if( stream->capture ) + { + ENSURE_( ioctl( captureFd, SNDCTL_DSP_GETISPACE, &bufInfo ), paUnanticipatedHostError ); + captureAvail = bufInfo.fragments * stream->capture->hostFrames; + if( !captureAvail ) + PA_DEBUG(( "%s: captureAvail: 0\n", __FUNCTION__ )); + + captureAvail = captureAvail == 0 ? INT_MAX : captureAvail; /* Disregard if zero */ + } + if( stream->playback ) + { + ENSURE_( ioctl( playbackFd, SNDCTL_DSP_GETOSPACE, &bufInfo ), paUnanticipatedHostError ); + playbackAvail = bufInfo.fragments * stream->playback->hostFrames; + if( !playbackAvail ) + { + PA_DEBUG(( "%s: playbackAvail: 0\n", __FUNCTION__ )); + } + + playbackAvail = playbackAvail == 0 ? INT_MAX : playbackAvail; /* Disregard if zero */ + } + + commonAvail = PA_MIN( captureAvail, playbackAvail ); + if( commonAvail == INT_MAX ) + commonAvail = 0; + commonAvail -= commonAvail % stream->framesPerHostBuffer; + + assert( commonAvail != INT_MAX ); + assert( commonAvail >= 0 ); + *frames = commonAvail; + +error: + return result; +} + +/** Prepare stream for capture/playback. + * + * In order to synchronize capture and playback properly we use the SETTRIGGER command. + */ +static PaError PaOssStream_Prepare( PaOssStream *stream ) +{ + PaError result = paNoError; + int enableBits = 0; + + if( stream->triggered ) + return result; + + /* The OSS reference instructs us to clear direction bits before setting them.*/ + if( stream->playback ) + ENSURE_( ioctl( stream->playback->fd, SNDCTL_DSP_SETTRIGGER, &enableBits ), paUnanticipatedHostError ); + if( stream->capture ) + ENSURE_( ioctl( stream->capture->fd, SNDCTL_DSP_SETTRIGGER, &enableBits ), paUnanticipatedHostError ); + + if( stream->playback ) + { + size_t bufSz = PaOssStreamComponent_BufferSize( stream->playback ); + memset( stream->playback->buffer, 0, bufSz ); + + /* Looks like we have to turn off blocking before we try this, but if we don't fill the buffer + * OSS will complain. */ + PA_ENSURE( ModifyBlocking( stream->playback->fd, 0 ) ); + while (1) + { + if( write( stream->playback->fd, stream->playback->buffer, bufSz ) < 0 ) + break; + } + PA_ENSURE( ModifyBlocking( stream->playback->fd, 1 ) ); + } + + if( stream->sharedDevice ) + { + enableBits = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT; + ENSURE_( ioctl( stream->capture->fd, SNDCTL_DSP_SETTRIGGER, &enableBits ), paUnanticipatedHostError ); + } + else + { + if( stream->capture ) + { + enableBits = PCM_ENABLE_INPUT; + ENSURE_( ioctl( stream->capture->fd, SNDCTL_DSP_SETTRIGGER, &enableBits ), paUnanticipatedHostError ); + } + if( stream->playback ) + { + enableBits = PCM_ENABLE_OUTPUT; + ENSURE_( ioctl( stream->playback->fd, SNDCTL_DSP_SETTRIGGER, &enableBits ), paUnanticipatedHostError ); + } + } + + /* Ok, we have triggered the stream */ + stream->triggered = 1; + +error: + return result; +} + +/** Stop audio processing + * + */ +static PaError PaOssStream_Stop( PaOssStream *stream, int abort ) +{ + PaError result = paNoError; + + /* Looks like the only safe way to stop audio without reopening the device is SNDCTL_DSP_POST. + * Also disable capture/playback till the stream is started again. + */ + int captureErr = 0, playbackErr = 0; + if( stream->capture ) + { + if( (captureErr = ioctl( stream->capture->fd, SNDCTL_DSP_POST, 0 )) < 0 ) + { + PA_DEBUG(( "%s: Failed to stop capture device, error: %d\n", __FUNCTION__, captureErr )); + } + } + if( stream->playback && !stream->sharedDevice ) + { + if( (playbackErr = ioctl( stream->playback->fd, SNDCTL_DSP_POST, 0 )) < 0 ) + { + PA_DEBUG(( "%s: Failed to stop playback device, error: %d\n", __FUNCTION__, playbackErr )); + } + } + + if( captureErr || playbackErr ) + { + result = paUnanticipatedHostError; + } + + return result; +} + +/** Clean up after thread exit. + * + * Aspect StreamState: If the user has registered a streamFinishedCallback it will be called here + */ +static void OnExit( void *data ) +{ + PaOssStream *stream = (PaOssStream *) data; + assert( data ); + + PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); + + PaOssStream_Stop( stream, stream->callbackAbort ); + + PA_DEBUG(( "OnExit: Stoppage\n" )); + + /* Eventually notify user all buffers have played */ + if( stream->streamRepresentation.streamFinishedCallback ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + + stream->callbackAbort = 0; /* Clear state */ + stream->isActive = 0; +} + +static PaError SetUpBuffers( PaOssStream *stream, unsigned long framesAvail ) +{ + PaError result = paNoError; + + if( stream->capture ) + { + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, stream->capture->buffer, + stream->capture->hostChannelCount ); + PaUtil_SetInputFrameCount( &stream->bufferProcessor, framesAvail ); + } + if( stream->playback ) + { + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, 0, stream->playback->buffer, + stream->playback->hostChannelCount ); + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, framesAvail ); + } + + return result; +} + +/** Thread procedure for callback processing. + * + * Aspect StreamState: StartStream will wait on this to initiate audio processing, useful in case the + * callback should be used for buffer priming. When the stream is cancelled a separate function will + * take care of the transition to the Callback Finished state (the stream isn't considered Stopped + * before StopStream() or AbortStream() are called). + */ +static void *PaOSS_AudioThreadProc( void *userData ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)userData; + unsigned long framesAvail = 0, framesProcessed = 0; + int callbackResult = paContinue; + int triggered = stream->triggered; /* See if SNDCTL_DSP_TRIGGER has been issued already */ + int initiateProcessing = triggered; /* Already triggered? */ + PaStreamCallbackFlags cbFlags = 0; /* We might want to keep state across iterations */ + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /* TODO: IMPLEMENT ME */ + + /* +#if ( SOUND_VERSION > 0x030904 ) + audio_errinfo errinfo; +#endif +*/ + + assert( stream ); + + pthread_cleanup_push( &OnExit, stream ); /* Execute OnExit when exiting */ + + /* The first time the stream is started we use SNDCTL_DSP_TRIGGER to accurately start capture and + * playback in sync, when the stream is restarted after being stopped we simply start by reading/ + * writing. + */ + PA_ENSURE( PaOssStream_Prepare( stream ) ); + + /* If we are to initiate processing implicitly by reading/writing data, we start off in blocking mode */ + if( initiateProcessing ) + { + /* Make sure devices are in blocking mode */ + if( stream->capture ) + ModifyBlocking( stream->capture->fd, 1 ); + if( stream->playback ) + ModifyBlocking( stream->playback->fd, 1 ); + } + + while( 1 ) + { +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#else + if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancelation */ + { + PA_DEBUG(( "Aborting callback thread\n" )); + break; + } +#endif + if( stream->callbackStop && callbackResult == paContinue ) + { + PA_DEBUG(( "Setting callbackResult to paComplete\n" )); + callbackResult = paComplete; + } + + /* Aspect StreamState: Because of the messy OSS scheme we can't explicitly trigger device start unless + * the stream has been recently started, we will have to go right ahead and read/write in blocking + * fashion to trigger operation. Therefore we begin with processing one host buffer before we switch + * to non-blocking mode. + */ + if( !initiateProcessing ) + { + /* Wait on available frames */ + PA_ENSURE( PaOssStream_WaitForFrames( stream, &framesAvail ) ); + assert( framesAvail % stream->framesPerHostBuffer == 0 ); + } + else + { + framesAvail = stream->framesPerHostBuffer; + } + + while( framesAvail > 0 ) + { + unsigned long frames = framesAvail; + +#ifdef PTHREAD_CANCELED + pthread_testcancel(); +#else + if( stream->callbackStop ) + { + PA_DEBUG(( "Setting callbackResult to paComplete\n" )); + callbackResult = paComplete; + } + + if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancelation */ + { + PA_DEBUG(( "Aborting callback thread\n" )); + break; + } +#endif + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + /* Read data */ + if ( stream->capture ) + { + PA_ENSURE( PaOssStreamComponent_Read( stream->capture, &frames ) ); + if( frames < framesAvail ) + { + PA_DEBUG(( "Read %lu less frames than requested\n", framesAvail - frames )); + framesAvail = frames; + } + } + +#if ( SOUND_VERSION >= 0x030904 ) + /* + Check with OSS to see if there have been any under/overruns + since last time we checked. + */ + /* + if( ioctl( stream->deviceHandle, SNDCTL_DSP_GETERROR, &errinfo ) >= 0 ) + { + if( errinfo.play_underruns ) + cbFlags |= paOutputUnderflow ; + if( errinfo.record_underruns ) + cbFlags |= paInputUnderflow ; + } + else + PA_DEBUG(( "SNDCTL_DSP_GETERROR command failed: %s\n", strerror( errno ) )); + */ +#endif + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, + cbFlags ); + cbFlags = 0; + PA_ENSURE( SetUpBuffers( stream, framesAvail ) ); + + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, + &callbackResult ); + assert( framesProcessed == framesAvail ); + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + + if ( stream->playback ) + { + frames = framesAvail; + + PA_ENSURE( PaOssStreamComponent_Write( stream->playback, &frames ) ); + if( frames < framesAvail ) + { + /* TODO: handle bytesWritten != bytesRequested (slippage?) */ + PA_DEBUG(( "Wrote %lu less frames than requested\n", framesAvail - frames )); + } + } + + framesAvail -= framesProcessed; + stream->framesProcessed += framesProcessed; + + if( callbackResult != paContinue ) + break; + } + + if( initiateProcessing || !triggered ) + { + /* Non-blocking */ + if( stream->capture ) + PA_ENSURE( ModifyBlocking( stream->capture->fd, 0 ) ); + if( stream->playback && !stream->sharedDevice ) + PA_ENSURE( ModifyBlocking( stream->playback->fd, 0 ) ); + + initiateProcessing = 0; + sem_post( &stream->semaphore ); + } + + if( callbackResult != paContinue ) + { + stream->callbackAbort = callbackResult == paAbort; + if( stream->callbackAbort || PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) + break; + } + } + + pthread_cleanup_pop( 1 ); + +error: + pthread_exit( NULL ); +} + +/** Close the stream. + * + */ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + + assert( stream ); + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaOssStream_Terminate( stream ); + + return result; +} + +/** Start the stream. + * + * Aspect StreamState: After returning, the stream shall be in the Active state, implying that an eventual + * callback will be repeatedly called in a separate thread. If a separate thread is started this function + * will block untill it has started processing audio, otherwise audio processing is started directly. + */ +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + + stream->isActive = 1; + stream->isStopped = 0; + stream->lastPosPtr = 0; + stream->lastStreamBytes = 0; + stream->framesProcessed = 0; + + /* only use the thread for callback streams */ + if( stream->bufferProcessor.streamCallback ) + { + PA_ENSURE( PaUtil_StartThreading( &stream->threading, &PaOSS_AudioThreadProc, stream ) ); + sem_wait( &stream->semaphore ); + } + else + PA_ENSURE( PaOssStream_Prepare( stream ) ); + +error: + return result; +} + +static PaError RealStop( PaOssStream *stream, int abort ) +{ + PaError result = paNoError; + + if( stream->callbackMode ) + { + if( abort ) + stream->callbackAbort = 1; + else + stream->callbackStop = 1; + + PA_ENSURE( PaUtil_CancelThreading( &stream->threading, !abort, NULL ) ); + + stream->callbackStop = stream->callbackAbort = 0; + } + else + PA_ENSURE( PaOssStream_Stop( stream, abort ) ); + + stream->isStopped = 1; + +error: + return result; +} + +/** Stop the stream. + * + * Aspect StreamState: This will cause the stream to transition to the Stopped state, playing all enqueued + * buffers. + */ +static PaError StopStream( PaStream *s ) +{ + return RealStop( (PaOssStream *)s, 0 ); +} + +/** Abort the stream. + * + * Aspect StreamState: This will cause the stream to transition to the Stopped state, discarding all enqueued + * buffers. Note that the buffers are not currently correctly discarded, this is difficult without closing + * the OSS device. + */ +static PaError AbortStream( PaStream *s ) +{ + return RealStop( (PaOssStream *)s, 1 ); +} + +/** Is the stream in the Stopped state. + * + */ +static PaError IsStreamStopped( PaStream *s ) +{ + PaOssStream *stream = (PaOssStream*)s; + + return (stream->isStopped); +} + +/** Is the stream in the Active state. + * + */ +static PaError IsStreamActive( PaStream *s ) +{ + PaOssStream *stream = (PaOssStream*)s; + + return (stream->isActive); +} + +static PaTime GetStreamTime( PaStream *s ) +{ + PaOssStream *stream = (PaOssStream*)s; + count_info info; + int delta; + + if( stream->playback ) { + if( ioctl( stream->playback->fd, SNDCTL_DSP_GETOPTR, &info) == 0 ) { + delta = ( info.bytes - stream->lastPosPtr ) /* & 0x000FFFFF*/; + return (float)(stream->lastStreamBytes + delta) / PaOssStreamComponent_FrameSize( stream->playback ) / stream->sampleRate; + } + } + else { + if (ioctl( stream->capture->fd, SNDCTL_DSP_GETIPTR, &info) == 0) { + delta = (info.bytes - stream->lastPosPtr) /*& 0x000FFFFF*/; + return (float)(stream->lastStreamBytes + delta) / PaOssStreamComponent_FrameSize( stream->capture ) / stream->sampleRate; + } + } + + /* the ioctl failed, but we can still give a coarse estimate */ + + return stream->framesProcessed / stream->sampleRate; +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaOssStream *stream = (PaOssStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +/* + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + int bytesRequested, bytesRead; + unsigned long framesRequested; + void *userBuffer; + + /* If user input is non-interleaved, PaUtil_CopyInput will manipulate the channel pointers, + * so we copy the user provided pointers */ + if( stream->bufferProcessor.userInputIsInterleaved ) + userBuffer = buffer; + else /* Copy channels into local array */ + { + userBuffer = stream->capture->userBuffers; + memcpy( (void *)userBuffer, buffer, sizeof (void *) * stream->capture->userChannelCount ); + } + + while( frames ) + { + framesRequested = PA_MIN( frames, stream->capture->hostFrames ); + + bytesRequested = framesRequested * PaOssStreamComponent_FrameSize( stream->capture ); + ENSURE_( (bytesRead = read( stream->capture->fd, stream->capture->buffer, bytesRequested )), + paUnanticipatedHostError ); + if ( bytesRequested != bytesRead ) + { + PA_DEBUG(( "Requested %d bytes, read %d\n", bytesRequested, bytesRead )); + return paUnanticipatedHostError; + } + + PaUtil_SetInputFrameCount( &stream->bufferProcessor, stream->capture->hostFrames ); + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, stream->capture->buffer, stream->capture->hostChannelCount ); + PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, framesRequested ); + frames -= framesRequested; + } + +error: + return result; +} + + +static PaError WriteStream( PaStream *s, const void *buffer, unsigned long frames ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + int bytesRequested, bytesWritten; + unsigned long framesConverted; + const void *userBuffer; + + /* If user output is non-interleaved, PaUtil_CopyOutput will manipulate the channel pointers, + * so we copy the user provided pointers */ + if( stream->bufferProcessor.userOutputIsInterleaved ) + userBuffer = buffer; + else + { + /* Copy channels into local array */ + userBuffer = stream->playback->userBuffers; + memcpy( (void *)userBuffer, buffer, sizeof (void *) * stream->playback->userChannelCount ); + } + + while( frames ) + { + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, stream->playback->hostFrames ); + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, 0, stream->playback->buffer, stream->playback->hostChannelCount ); + + framesConverted = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, frames ); + frames -= framesConverted; + + bytesRequested = framesConverted * PaOssStreamComponent_FrameSize( stream->playback ); + ENSURE_( (bytesWritten = write( stream->playback->fd, stream->playback->buffer, bytesRequested )), + paUnanticipatedHostError ); + + if ( bytesRequested != bytesWritten ) + { + PA_DEBUG(( "Requested %d bytes, wrote %d\n", bytesRequested, bytesWritten )); + return paUnanticipatedHostError; + } + } + +error: + return result; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + audio_buf_info info; + + ENSURE_( ioctl( stream->capture->fd, SNDCTL_DSP_GETISPACE, &info ), paUnanticipatedHostError ); + return info.fragments * stream->capture->hostFrames; + +error: + return result; +} + + +/* TODO: Compute number of allocated bytes somewhere else, can we use ODELAY with capture */ +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaError result = paNoError; + PaOssStream *stream = (PaOssStream*)s; + int delay = 0; +#ifdef SNDCTL_DSP_GETODELAY + ENSURE_( ioctl( stream->playback->fd, SNDCTL_DSP_GETODELAY, &delay ), paUnanticipatedHostError ); +#endif + return (PaOssStreamComponent_BufferSize( stream->playback ) - delay) / PaOssStreamComponent_FrameSize( stream->playback ); + +/* Conditionally compile this to avoid warning about unused label */ +#ifdef SNDCTL_DSP_GETODELAY +error: + return result; +#endif +} + diff --git a/Externals/portaudio/src/hostapi/oss/recplay.c b/Externals/portaudio/src/hostapi/oss/recplay.c new file mode 100644 index 0000000000..9d4c78cfa3 --- /dev/null +++ b/Externals/portaudio/src/hostapi/oss/recplay.c @@ -0,0 +1,114 @@ +/* + * recplay.c + * Phil Burk + * Minimal record and playback test. + * + */ +#include +#include +#include +#ifndef __STDC__ +/* #include */ +#endif /* __STDC__ */ +#include +#ifdef __STDC__ +#include +#else /* __STDC__ */ +#include +#endif /* __STDC__ */ +#include + +#define NUM_BYTES (64*1024) +#define BLOCK_SIZE (4*1024) + +#define AUDIO "/dev/dsp" + +char buffer[NUM_BYTES]; + +int audioDev = 0; + +main (int argc, char *argv[]) +{ + int numLeft; + char *ptr; + int num; + int samplesize; + + /********** RECORD ********************/ + /* Open audio device. */ + audioDev = open (AUDIO, O_RDONLY, 0); + if (audioDev == -1) + { + perror (AUDIO); + exit (-1); + } + + /* Set to 16 bit samples. */ + samplesize = 16; + ioctl(audioDev, SNDCTL_DSP_SAMPLESIZE, &samplesize); + if (samplesize != 16) + { + perror("Unable to set the sample size."); + exit(-1); + } + + /* Record in blocks */ + printf("Begin recording.\n"); + numLeft = NUM_BYTES; + ptr = buffer; + while( numLeft >= BLOCK_SIZE ) + { + if ( (num = read (audioDev, ptr, BLOCK_SIZE)) < 0 ) + { + perror (AUDIO); + exit (-1); + } + else + { + printf("Read %d bytes\n", num); + ptr += num; + numLeft -= num; + } + } + + close( audioDev ); + + /********** PLAYBACK ********************/ + /* Open audio device for writing. */ + audioDev = open (AUDIO, O_WRONLY, 0); + if (audioDev == -1) + { + perror (AUDIO); + exit (-1); + } + + /* Set to 16 bit samples. */ + samplesize = 16; + ioctl(audioDev, SNDCTL_DSP_SAMPLESIZE, &samplesize); + if (samplesize != 16) + { + perror("Unable to set the sample size."); + exit(-1); + } + + /* Play in blocks */ + printf("Begin playing.\n"); + numLeft = NUM_BYTES; + ptr = buffer; + while( numLeft >= BLOCK_SIZE ) + { + if ( (num = write (audioDev, ptr, BLOCK_SIZE)) < 0 ) + { + perror (AUDIO); + exit (-1); + } + else + { + printf("Wrote %d bytes\n", num); + ptr += num; + numLeft -= num; + } + } + + close( audioDev ); +} diff --git a/Externals/portaudio/src/hostapi/skeleton/README.txt b/Externals/portaudio/src/hostapi/skeleton/README.txt new file mode 100644 index 0000000000..39d4c8d2be --- /dev/null +++ b/Externals/portaudio/src/hostapi/skeleton/README.txt @@ -0,0 +1 @@ +pa_hostapi_skeleton.c provides a starting point for implementing support for a new host API with PortAudio. The idea is that you copy it to a new directory inside /hostapi and start editing. \ No newline at end of file diff --git a/Externals/portaudio/src/hostapi/skeleton/pa_hostapi_skeleton.c b/Externals/portaudio/src/hostapi/skeleton/pa_hostapi_skeleton.c new file mode 100644 index 0000000000..24eb450096 --- /dev/null +++ b/Externals/portaudio/src/hostapi/skeleton/pa_hostapi_skeleton.c @@ -0,0 +1,818 @@ +/* + * $Id: pa_hostapi_skeleton.c 1668 2011-05-02 17:07:11Z rossb $ + * Portable Audio I/O Library skeleton implementation + * demonstrates how to use the common functions to implement support + * for a host API + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup common_src + + @brief Skeleton implementation of support for a host API. + + This file is provided as a starting point for implementing support for + a new host API. It provides examples of how the common code can be used. + + @note IMPLEMENT ME comments are used to indicate functionality + which much be customised for each implementation. +*/ + + +#include /* strlen() */ + +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" + + +/* prototypes for functions declared in this file */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + + +/* IMPLEMENT ME: a macro like the following one should be used for reporting + host errors */ +#define PA_SKELETON_SET_LAST_HOST_ERROR( errorCode, errorText ) \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, errorCode, errorText ) + +/* PaSkeletonHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ +} +PaSkeletonHostApiRepresentation; /* IMPLEMENT ME: rename this */ + + +PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i, deviceCount; + PaSkeletonHostApiRepresentation *skeletonHostApi; + PaDeviceInfo *deviceInfoArray; + + skeletonHostApi = (PaSkeletonHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaSkeletonHostApiRepresentation) ); + if( !skeletonHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + skeletonHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !skeletonHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + *hostApi = &skeletonHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paInDevelopment; /* IMPLEMENT ME: change to correct type id */ + (*hostApi)->info.name = "skeleton implementation"; /* IMPLEMENT ME: change to correct name */ + + (*hostApi)->info.defaultInputDevice = paNoDevice; /* IMPLEMENT ME */ + (*hostApi)->info.defaultOutputDevice = paNoDevice; /* IMPLEMENT ME */ + + (*hostApi)->info.deviceCount = 0; + + deviceCount = 0; /* IMPLEMENT ME */ + + if( deviceCount > 0 ) + { + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + skeletonHostApi->allocations, sizeof(PaDeviceInfo*) * deviceCount ); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaDeviceInfo*)PaUtil_GroupAllocateMemory( + skeletonHostApi->allocations, sizeof(PaDeviceInfo) * deviceCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < deviceCount; ++i ) + { + PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + deviceInfo->name = 0; /* IMPLEMENT ME: allocate block and copy name eg: + deviceName = (char*)PaUtil_GroupAllocateMemory( skeletonHostApi->allocations, strlen(srcName) + 1 ); + if( !deviceName ) + { + result = paInsufficientMemory; + goto error; + } + strcpy( deviceName, srcName ); + deviceInfo->name = deviceName; + */ + + deviceInfo->maxInputChannels = 0; /* IMPLEMENT ME */ + deviceInfo->maxOutputChannels = 0; /* IMPLEMENT ME */ + + deviceInfo->defaultLowInputLatency = 0.; /* IMPLEMENT ME */ + deviceInfo->defaultLowOutputLatency = 0.; /* IMPLEMENT ME */ + deviceInfo->defaultHighInputLatency = 0.; /* IMPLEMENT ME */ + deviceInfo->defaultHighOutputLatency = 0.; /* IMPLEMENT ME */ + + deviceInfo->defaultSampleRate = 0.; /* IMPLEMENT ME */ + + (*hostApi)->deviceInfos[i] = deviceInfo; + ++(*hostApi)->info.deviceCount; + } + } + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &skeletonHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &skeletonHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + return result; + +error: + if( skeletonHostApi ) + { + if( skeletonHostApi->allocations ) + { + PaUtil_FreeAllAllocations( skeletonHostApi->allocations ); + PaUtil_DestroyAllocationGroup( skeletonHostApi->allocations ); + } + + PaUtil_FreeMemory( skeletonHostApi ); + } + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaSkeletonHostApiRepresentation *skeletonHostApi = (PaSkeletonHostApiRepresentation*)hostApi; + + /* + IMPLEMENT ME: + - clean up any resources not handled by the allocation group + */ + + if( skeletonHostApi->allocations ) + { + PaUtil_FreeAllAllocations( skeletonHostApi->allocations ); + PaUtil_DestroyAllocationGroup( skeletonHostApi->allocations ); + } + + PaUtil_FreeMemory( skeletonHostApi ); +} + + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( inputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( outputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support outputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + } + else + { + outputChannelCount = 0; + } + + /* + IMPLEMENT ME: + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported if necessary + + - check that the device supports sampleRate + + Because the buffer adapter handles conversion between all standard + sample formats, the following checks are only required if paCustomFormat + is implemented, or under some other unusual conditions. + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from inputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + */ + + + /* suppress unused variable warnings */ + (void) sampleRate; + + return paFormatIsSupported; +} + +/* PaSkeletonStream - a stream data structure specifically for this implementation */ + +typedef struct PaSkeletonStream +{ /* IMPLEMENT ME: rename this */ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + /* IMPLEMENT ME: + - implementation specific data goes here + */ + unsigned long framesPerHostCallback; /* just an example */ +} +PaSkeletonStream; + +/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */ + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaSkeletonHostApiRepresentation *skeletonHostApi = (PaSkeletonHostApiRepresentation*)hostApi; + PaSkeletonStream *stream = 0; + unsigned long framesPerHostBuffer = framesPerBuffer; /* these may not be equivalent for all implementations */ + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + /* IMPLEMENT ME - establish which host formats are available */ + hostInputSampleFormat = + PaUtil_SelectClosestAvailableFormat( paInt16 /* native formats */, inputSampleFormat ); + } + else + { + inputChannelCount = 0; + inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support inputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + /* IMPLEMENT ME - establish which host formats are available */ + hostOutputSampleFormat = + PaUtil_SelectClosestAvailableFormat( paInt16 /* native formats */, outputSampleFormat ); + } + else + { + outputChannelCount = 0; + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ + } + + /* + IMPLEMENT ME: + + ( the following two checks are taken care of by PaUtil_InitializeBufferProcessor() FIXME - checks needed? ) + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + + - check that the device supports sampleRate + + - alter sampleRate to a close allowable rate if possible / necessary + + - validate suggestedInputLatency and suggestedOutputLatency parameters, + use default values where necessary + */ + + + + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + + stream = (PaSkeletonStream*)PaUtil_AllocateMemory( sizeof(PaSkeletonStream) ); + if( !stream ) + { + result = paInsufficientMemory; + goto error; + } + + if( streamCallback ) + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &skeletonHostApi->callbackStreamInterface, streamCallback, userData ); + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &skeletonHostApi->blockingStreamInterface, streamCallback, userData ); + } + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + + /* we assume a fixed host buffer size in this example, but the buffer processor + can also support bounded and unknown host buffer sizes by passing + paUtilBoundedHostBufferSize or paUtilUnknownHostBufferSize instead of + paUtilFixedHostBufferSize below. */ + + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, hostInputSampleFormat, + outputChannelCount, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, framesPerBuffer, + framesPerHostBuffer, paUtilFixedHostBufferSize, + streamCallback, userData ); + if( result != paNoError ) + goto error; + + + /* + IMPLEMENT ME: initialise the following fields with estimated or actual + values. + */ + stream->streamRepresentation.streamInfo.inputLatency = + (PaTime)PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) / sampleRate; /* inputLatency is specified in _seconds_ */ + stream->streamRepresentation.streamInfo.outputLatency = + (PaTime)PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) / sampleRate; /* outputLatency is specified in _seconds_ */ + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + + /* + IMPLEMENT ME: + - additional stream setup + opening + */ + + stream->framesPerHostCallback = framesPerHostBuffer; + + *s = (PaStream*)stream; + + return result; + +error: + if( stream ) + PaUtil_FreeMemory( stream ); + + return result; +} + +/* + ExampleHostProcessingLoop() illustrates the kind of processing which may + occur in a host implementation. + +*/ +static void ExampleHostProcessingLoop( void *inputBuffer, void *outputBuffer, void *userData ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)userData; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /* IMPLEMENT ME */ + int callbackResult; + unsigned long framesProcessed; + + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + /* + IMPLEMENT ME: + - generate timing information + - handle buffer slips + */ + + /* + If you need to byte swap or shift inputBuffer to convert it into a + portaudio format, do it here. + */ + + + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, 0 /* IMPLEMENT ME: pass underflow/overflow flags when necessary */ ); + + /* + depending on whether the host buffers are interleaved, non-interleaved + or a mixture, you will want to call PaUtil_SetInterleaved*Channels(), + PaUtil_SetNonInterleaved*Channel() or PaUtil_Set*Channel() here. + */ + + PaUtil_SetInputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, + 0, /* first channel of inputBuffer is channel 0 */ + inputBuffer, + 0 ); /* 0 - use inputChannelCount passed to init buffer processor */ + + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, + 0, /* first channel of outputBuffer is channel 0 */ + outputBuffer, + 0 ); /* 0 - use outputChannelCount passed to init buffer processor */ + + /* you must pass a valid value of callback result to PaUtil_EndBufferProcessing() + in general you would pass paContinue for normal operation, and + paComplete to drain the buffer processor's internal output buffer. + You can check whether the buffer processor's output buffer is empty + using PaUtil_IsBufferProcessorOuputEmpty( bufferProcessor ) + */ + callbackResult = paContinue; + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + + + /* + If you need to byte swap or shift outputBuffer to convert it to + host format, do it here. + */ + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + + + if( callbackResult == paContinue ) + { + /* nothing special to do */ + } + else if( callbackResult == paAbort ) + { + /* IMPLEMENT ME - finish playback immediately */ + + /* once finished, call the finished callback */ + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + else + { + /* User callback has asked us to stop with paComplete or other non-zero value */ + + /* IMPLEMENT ME - finish playback once currently queued audio has completed */ + + /* once finished, call the finished callback */ + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } +} + + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* + IMPLEMENT ME: + - additional stream closing + cleanup + */ + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_FreeMemory( stream ); + + return result; +} + + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + /* IMPLEMENT ME, see portaudio.h for required behavior */ + + /* suppress unused function warning. the code in ExampleHostProcessingLoop or + something similar should be implemented to feed samples to and from the + host after StartStream() is called. + */ + (void) ExampleHostProcessingLoop; + + return result; +} + + +static PaError StopStream( PaStream *s ) +{ + PaError result = paNoError; + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior */ + + return result; +} + + +static PaError AbortStream( PaStream *s ) +{ + PaError result = paNoError; + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior */ + + return result; +} + + +static PaError IsStreamStopped( PaStream *s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior */ + + return 0; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior */ + + return 0; +} + + +static PaTime GetStreamTime( PaStream *s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return 0; +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +/* + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return paNoError; +} + + +static PaError WriteStream( PaStream* s, + const void *buffer, + unsigned long frames ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return paNoError; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return 0; +} + + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaSkeletonStream *stream = (PaSkeletonStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + + return 0; +} + + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h new file mode 100644 index 0000000000..385e9007e3 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h @@ -0,0 +1,94 @@ +// +// AudioSessionTypes.h -- Copyright Microsoft Corporation, All Rights Reserved. +// +// Description: Type definitions used by the audio session manager RPC/COM interfaces +// +#pragma once + +#ifndef __AUDIOSESSIONTYPES__ +#define __AUDIOSESSIONTYPES__ + +#if defined(__midl) +#define MIDL_SIZE_IS(x) [size_is(x)] +#define MIDL_STRING [string] +#define MIDL_ANYSIZE_ARRAY +#else // !defined(__midl) +#define MIDL_SIZE_IS(x) +#define MIDL_STRING +#define MIDL_ANYSIZE_ARRAY ANYSIZE_ARRAY +#endif // defined(__midl) + +//------------------------------------------------------------------------- +// Description: AudioClient share mode +// +// AUDCLNT_SHAREMODE_SHARED - The device will be opened in shared mode and use the +// WAS format. +// AUDCLNT_SHAREMODE_EXCLUSIVE - The device will be opened in exclusive mode and use the +// application specified format. +// +typedef enum _AUDCLNT_SHAREMODE +{ + AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_SHAREMODE_EXCLUSIVE +} AUDCLNT_SHAREMODE; + +//------------------------------------------------------------------------- +// Description: AudioClient stream flags +// +// Can be a combination of AUDCLNT_STREAMFLAGS and AUDCLNT_SYSFXFLAGS: +// +// AUDCLNT_STREAMFLAGS (this group of flags uses the high word, w/exception of high-bit which is reserved, 0x7FFF0000): +// +// AUDCLNT_STREAMFLAGS_CROSSPROCESS - Audio policy control for this stream will be shared with +// with other process sessions that use the same audio session +// GUID. +// AUDCLNT_STREAMFLAGS_LOOPBACK - Initializes a renderer endpoint for a loopback audio application. +// In this mode, a capture stream will be opened on the specified +// renderer endpoint. Shared mode and a renderer endpoint is required. +// Otherwise the IAudioClient::Initialize call will fail. If the +// initialize is successful, a capture stream will be available +// from the IAudioClient object. +// +// AUDCLNT_STREAMFLAGS_EVENTCALLBACK - An exclusive mode client will supply an event handle that will be +// signaled when an IRP completes (or a waveRT buffer completes) telling +// it to fill the next buffer +// +// AUDCLNT_STREAMFLAGS_NOPERSIST - Session state will not be persisted +// +// AUDCLNT_SYSFXFLAGS (these flags use low word 0x0000FFFF): +// +// none defined currently +// +#define AUDCLNT_STREAMFLAGS_CROSSPROCESS 0x00010000 +#define AUDCLNT_STREAMFLAGS_LOOPBACK 0x00020000 +#define AUDCLNT_STREAMFLAGS_EVENTCALLBACK 0x00040000 +#define AUDCLNT_STREAMFLAGS_NOPERSIST 0x00080000 + +//------------------------------------------------------------------------- +// Description: Device share mode - sharing mode for the audio device. +// +// DeviceShared - The device can be shared with other processes. +// DeviceExclusive - The device will only be used by this process. +// +typedef enum _DeviceShareMode +{ + DeviceShared, + DeviceExclusive +} DeviceShareMode; + + +//------------------------------------------------------------------------- +// Description: AudioSession State. +// +// AudioSessionStateInactive - The session has no active audio streams. +// AudioSessionStateActive - The session has active audio streams. +// AudioSessionStateExpired - The session is dormant. +typedef enum _AudioSessionState +{ + AudioSessionStateInactive = 0, + AudioSessionStateActive = 1, + AudioSessionStateExpired = 2 +} AudioSessionState; + +#endif + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/FunctionDiscoveryKeys_devpkey.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/FunctionDiscoveryKeys_devpkey.h new file mode 100644 index 0000000000..abfd661e67 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/FunctionDiscoveryKeys_devpkey.h @@ -0,0 +1,186 @@ + +/*++ + +Copyright (c) Microsoft Corporation. All rights reserved. + +Module Name: + + devpkey.h + +Abstract: + + Defines property keys for the Plug and Play Device Property API. + +Author: + + Jim Cavalaris (jamesca) 10-14-2003 + +Environment: + + User-mode only. + +Revision History: + + 14-October-2003 jamesca + + Creation and initial implementation. + + 20-June-2006 dougb + + Copied Jim's version replaced "DEFINE_DEVPROPKEY(DEVPKEY_" with "DEFINE_PROPERTYKEY(PKEY_" + +--*/ + +//#include + +// +// _NAME +// + +DEFINE_PROPERTYKEY(PKEY_NAME, 0xb725f130, 0x47ef, 0x101a, 0xa5, 0xf1, 0x02, 0x60, 0x8c, 0x9e, 0xeb, 0xac, 10); // DEVPROP_TYPE_STRING + +// +// Device properties +// These PKEYs correspond to the old setupapi SPDRP_XXX properties +// +DEFINE_PROPERTYKEY(PKEY_Device_DeviceDesc, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 2); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_HardwareIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_CompatibleIds, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 4); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_Service, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 6); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_Class, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 9); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_ClassGuid, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 10); // DEVPROP_TYPE_GUID +DEFINE_PROPERTYKEY(PKEY_Device_Driver, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 11); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_ConfigFlags, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 12); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_LocationInfo, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 15); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_PDOName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 16); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_Capabilities, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 17); // DEVPROP_TYPE_UNINT32 +DEFINE_PROPERTYKEY(PKEY_Device_UINumber, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 18); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_UpperFilters, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 19); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_LowerFilters, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 20); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_BusTypeGuid, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 21); // DEVPROP_TYPE_GUID +DEFINE_PROPERTYKEY(PKEY_Device_LegacyBusType, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 22); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_BusNumber, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 23); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_EnumeratorName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 24); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_Security, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 25); // DEVPROP_TYPE_SECURITY_DESCRIPTOR +DEFINE_PROPERTYKEY(PKEY_Device_SecuritySDS, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 26); // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DevType, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 27); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_Exclusive, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 28); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_Characteristics, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 29); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_Address, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 30); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_UINumberDescFormat, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 31); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_PowerData, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 32); // DEVPROP_TYPE_BINARY +DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicy, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 33); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicyDefault, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 34); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_RemovalPolicyOverride, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 35); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_InstallState, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 36); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_LocationPaths, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 37); // DEVPROP_TYPE_STRING_LIST + +// +// Device properties +// These PKEYs correspond to a device's status and problem code +// +DEFINE_PROPERTYKEY(PKEY_Device_DevNodeStatus, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 2); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_ProblemCode, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 3); // DEVPROP_TYPE_UINT32 + +// +// Device properties +// These PKEYs correspond to device relations +// +DEFINE_PROPERTYKEY(PKEY_Device_EjectionRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 4); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_RemovalRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 5); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_PowerRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 6); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_BusRelations, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 7); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_Parent, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 8); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_Children, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 9); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_Siblings, 0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 10); // DEVPROP_TYPE_STRING_LIST + +// +// Other Device properties +// +DEFINE_PROPERTYKEY(PKEY_Device_Reported, 0x80497100, 0x8c73, 0x48b9, 0xaa, 0xd9, 0xce, 0x38, 0x7e, 0x19, 0xc5, 0x6e, 2); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_Device_Legacy, 0x80497100, 0x8c73, 0x48b9, 0xaa, 0xd9, 0xce, 0x38, 0x7e, 0x19, 0xc5, 0x6e, 3); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_Device_InstanceId, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 256); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Numa_Proximity_Domain, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 1); // DEVPROP_TYPE_UINT32 + +// +// Device driver properties +// +DEFINE_PROPERTYKEY(PKEY_Device_DriverDate, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 2); // DEVPROP_TYPE_FILETIME +DEFINE_PROPERTYKEY(PKEY_Device_DriverVersion, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 3); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverDesc, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 4); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverInfPath, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 5); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverInfSection, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 6); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverInfSectionExt, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 7); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_MatchingDeviceId, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 8); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverProvider, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 9); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverPropPageProvider, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 10); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverCoInstallers, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 11); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_Device_ResourcePickerTags, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 12); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_ResourcePickerExceptions, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 13); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DriverRank, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 14); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_DriverLogoLevel, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 15); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_Device_NoConnectSound, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 17); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_Device_GenericDriverInstalled, 0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 18); // DEVPROP_TYPE_BOOLEAN + + +// +// Device properties that were set by the driver package that was installed +// on the device. +// +DEFINE_PROPERTYKEY(PKEY_DrvPkg_Model, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 2); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DrvPkg_VendorWebSite, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 3); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DrvPkg_DetailedDescription, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 4); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DrvPkg_DocumentationLink, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 5); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DrvPkg_Icon, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 6); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_DrvPkg_BrandingIcon, 0xcf73bb51, 0x3abf, 0x44a2, 0x85, 0xe0, 0x9a, 0x3d, 0xc7, 0xa1, 0x21, 0x32, 7); // DEVPROP_TYPE_STRING_LIST + +// +// Device setup class properties +// These PKEYs correspond to the old setupapi SPCRP_XXX properties +// +DEFINE_PROPERTYKEY(PKEY_DeviceClass_UpperFilters, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 19); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_DeviceClass_LowerFilters, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 20); // DEVPROP_TYPE_STRING_LIST +DEFINE_PROPERTYKEY(PKEY_DeviceClass_Security, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 25); // DEVPROP_TYPE_SECURITY_DESCRIPTOR +DEFINE_PROPERTYKEY(PKEY_DeviceClass_SecuritySDS, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 26); // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_DevType, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 27); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_DeviceClass_Exclusive, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 28); // DEVPROP_TYPE_UINT32 +DEFINE_PROPERTYKEY(PKEY_DeviceClass_Characteristics, 0x4321918b, 0xf69e, 0x470d, 0xa5, 0xde, 0x4d, 0x88, 0xc7, 0x5a, 0xd2, 0x4b, 29); // DEVPROP_TYPE_UINT32 + +// +// Device setup class properties +// These PKEYs correspond to registry values under the device class GUID key +// +DEFINE_PROPERTYKEY(PKEY_DeviceClass_Name, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 2); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassName, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 3); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_Icon, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 4); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassInstaller, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 5); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_PropPageProvider, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 6); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoInstallClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 7); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoDisplayClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 8); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_DeviceClass_SilentInstall, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 9); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_DeviceClass_NoUseClass, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 10); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_DeviceClass_DefaultService, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 11); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceClass_IconPath, 0x259abffc, 0x50a7, 0x47ce, 0xaf, 0x8, 0x68, 0xc9, 0xa7, 0xd7, 0x33, 0x66, 12); // DEVPROP_TYPE_STRING_LIST + +// +// Other Device setup class properties +// +DEFINE_PROPERTYKEY(PKEY_DeviceClass_ClassCoInstallers, 0x713d1703, 0xa2e2, 0x49f5, 0x92, 0x14, 0x56, 0x47, 0x2e, 0xf3, 0xda, 0x5c, 2); // DEVPROP_TYPE_STRING_LIST + +// +// Device interface properties +// +DEFINE_PROPERTYKEY(PKEY_DeviceInterface_FriendlyName, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 2); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_DeviceInterface_Enabled, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 3); // DEVPROP_TYPE_BOOLEAN +DEFINE_PROPERTYKEY(PKEY_DeviceInterface_ClassGuid, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 4); // DEVPROP_TYPE_GUID + +// +// Device interface class properties +// +DEFINE_PROPERTYKEY(PKEY_DeviceInterfaceClass_DefaultInterface, 0x14c83a99, 0x0b3f, 0x44b7, 0xbe, 0x4c, 0xa1, 0x78, 0xd3, 0x99, 0x05, 0x64, 2); // DEVPROP_TYPE_STRING + + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h new file mode 100644 index 0000000000..bf77baf029 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h @@ -0,0 +1,1177 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for audioclient.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __audioclient_h__ +#define __audioclient_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IAudioClient_FWD_DEFINED__ +#define __IAudioClient_FWD_DEFINED__ +typedef interface IAudioClient IAudioClient; +#endif /* __IAudioClient_FWD_DEFINED__ */ + + +#ifndef __IAudioRenderClient_FWD_DEFINED__ +#define __IAudioRenderClient_FWD_DEFINED__ +typedef interface IAudioRenderClient IAudioRenderClient; +#endif /* __IAudioRenderClient_FWD_DEFINED__ */ + + +#ifndef __IAudioCaptureClient_FWD_DEFINED__ +#define __IAudioCaptureClient_FWD_DEFINED__ +typedef interface IAudioCaptureClient IAudioCaptureClient; +#endif /* __IAudioCaptureClient_FWD_DEFINED__ */ + + +#ifndef __IAudioClock_FWD_DEFINED__ +#define __IAudioClock_FWD_DEFINED__ +typedef interface IAudioClock IAudioClock; +#endif /* __IAudioClock_FWD_DEFINED__ */ + + +#ifndef __ISimpleAudioVolume_FWD_DEFINED__ +#define __ISimpleAudioVolume_FWD_DEFINED__ +typedef interface ISimpleAudioVolume ISimpleAudioVolume; +#endif /* __ISimpleAudioVolume_FWD_DEFINED__ */ + + +#ifndef __IAudioStreamVolume_FWD_DEFINED__ +#define __IAudioStreamVolume_FWD_DEFINED__ +typedef interface IAudioStreamVolume IAudioStreamVolume; +#endif /* __IAudioStreamVolume_FWD_DEFINED__ */ + + +#ifndef __IChannelAudioVolume_FWD_DEFINED__ +#define __IChannelAudioVolume_FWD_DEFINED__ +typedef interface IChannelAudioVolume IChannelAudioVolume; +#endif /* __IChannelAudioVolume_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "wtypes.h" +#include "unknwn.h" +#include "AudioSessionTypes.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_audioclient_0000_0000 */ +/* [local] */ + +#if 0 +typedef /* [hidden][restricted] */ struct WAVEFORMATEX + { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; + } WAVEFORMATEX; + +#else +#include +#endif +#if 0 +typedef /* [hidden][restricted] */ LONGLONG REFERENCE_TIME; + +#else +#define _IKsControl_ +#include +#include +#endif + +enum _AUDCLNT_BUFFERFLAGS + { AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY = 0x1, + AUDCLNT_BUFFERFLAGS_SILENT = 0x2, + AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR = 0x4 + } ; + + +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0000_v0_0_s_ifspec; + +#ifndef __IAudioClient_INTERFACE_DEFINED__ +#define __IAudioClient_INTERFACE_DEFINED__ + +/* interface IAudioClient */ +/* [local][unique][uuid][object] */ + + +EXTERN_C const IID IID_IAudioClient; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("1CB9AD4C-DBFA-4c32-B178-C2F568A703B2") + IAudioClient : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Initialize( + /* [in] */ + __in AUDCLNT_SHAREMODE ShareMode, + /* [in] */ + __in DWORD StreamFlags, + /* [in] */ + __in REFERENCE_TIME hnsBufferDuration, + /* [in] */ + __in REFERENCE_TIME hnsPeriodicity, + /* [in] */ + __in const WAVEFORMATEX *pFormat, + /* [in] */ + __in_opt LPCGUID AudioSessionGuid) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetBufferSize( + /* [out] */ + __out UINT32 *pNumBufferFrames) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetStreamLatency( + /* [out] */ + __out REFERENCE_TIME *phnsLatency) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentPadding( + /* [out] */ + __out UINT32 *pNumPaddingFrames) = 0; + + virtual HRESULT STDMETHODCALLTYPE IsFormatSupported( + /* [in] */ + __in AUDCLNT_SHAREMODE ShareMode, + /* [in] */ + __in const WAVEFORMATEX *pFormat, + /* [unique][out] */ + __out_opt WAVEFORMATEX **ppClosestMatch) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMixFormat( + /* [out] */ + __out WAVEFORMATEX **ppDeviceFormat) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDevicePeriod( + /* [out] */ + __out_opt REFERENCE_TIME *phnsDefaultDevicePeriod, + /* [out] */ + __out_opt REFERENCE_TIME *phnsMinimumDevicePeriod) = 0; + + virtual HRESULT STDMETHODCALLTYPE Start( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetEventHandle( + /* [in] */ HANDLE eventHandle) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetService( + /* [in] */ + __in REFIID riid, + /* [iid_is][out] */ + __out void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioClientVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioClient * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioClient * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioClient * This); + + HRESULT ( STDMETHODCALLTYPE *Initialize )( + IAudioClient * This, + /* [in] */ + __in AUDCLNT_SHAREMODE ShareMode, + /* [in] */ + __in DWORD StreamFlags, + /* [in] */ + __in REFERENCE_TIME hnsBufferDuration, + /* [in] */ + __in REFERENCE_TIME hnsPeriodicity, + /* [in] */ + __in const WAVEFORMATEX *pFormat, + /* [in] */ + __in_opt LPCGUID AudioSessionGuid); + + HRESULT ( STDMETHODCALLTYPE *GetBufferSize )( + IAudioClient * This, + /* [out] */ + __out UINT32 *pNumBufferFrames); + + HRESULT ( STDMETHODCALLTYPE *GetStreamLatency )( + IAudioClient * This, + /* [out] */ + __out REFERENCE_TIME *phnsLatency); + + HRESULT ( STDMETHODCALLTYPE *GetCurrentPadding )( + IAudioClient * This, + /* [out] */ + __out UINT32 *pNumPaddingFrames); + + HRESULT ( STDMETHODCALLTYPE *IsFormatSupported )( + IAudioClient * This, + /* [in] */ + __in AUDCLNT_SHAREMODE ShareMode, + /* [in] */ + __in const WAVEFORMATEX *pFormat, + /* [unique][out] */ + __out_opt WAVEFORMATEX **ppClosestMatch); + + HRESULT ( STDMETHODCALLTYPE *GetMixFormat )( + IAudioClient * This, + /* [out] */ + __out WAVEFORMATEX **ppDeviceFormat); + + HRESULT ( STDMETHODCALLTYPE *GetDevicePeriod )( + IAudioClient * This, + /* [out] */ + __out_opt REFERENCE_TIME *phnsDefaultDevicePeriod, + /* [out] */ + __out_opt REFERENCE_TIME *phnsMinimumDevicePeriod); + + HRESULT ( STDMETHODCALLTYPE *Start )( + IAudioClient * This); + + HRESULT ( STDMETHODCALLTYPE *Stop )( + IAudioClient * This); + + HRESULT ( STDMETHODCALLTYPE *Reset )( + IAudioClient * This); + + HRESULT ( STDMETHODCALLTYPE *SetEventHandle )( + IAudioClient * This, + /* [in] */ HANDLE eventHandle); + + HRESULT ( STDMETHODCALLTYPE *GetService )( + IAudioClient * This, + /* [in] */ + __in REFIID riid, + /* [iid_is][out] */ + __out void **ppv); + + END_INTERFACE + } IAudioClientVtbl; + + interface IAudioClient + { + CONST_VTBL struct IAudioClientVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioClient_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioClient_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioClient_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioClient_Initialize(This,ShareMode,StreamFlags,hnsBufferDuration,hnsPeriodicity,pFormat,AudioSessionGuid) \ + ( (This)->lpVtbl -> Initialize(This,ShareMode,StreamFlags,hnsBufferDuration,hnsPeriodicity,pFormat,AudioSessionGuid) ) + +#define IAudioClient_GetBufferSize(This,pNumBufferFrames) \ + ( (This)->lpVtbl -> GetBufferSize(This,pNumBufferFrames) ) + +#define IAudioClient_GetStreamLatency(This,phnsLatency) \ + ( (This)->lpVtbl -> GetStreamLatency(This,phnsLatency) ) + +#define IAudioClient_GetCurrentPadding(This,pNumPaddingFrames) \ + ( (This)->lpVtbl -> GetCurrentPadding(This,pNumPaddingFrames) ) + +#define IAudioClient_IsFormatSupported(This,ShareMode,pFormat,ppClosestMatch) \ + ( (This)->lpVtbl -> IsFormatSupported(This,ShareMode,pFormat,ppClosestMatch) ) + +#define IAudioClient_GetMixFormat(This,ppDeviceFormat) \ + ( (This)->lpVtbl -> GetMixFormat(This,ppDeviceFormat) ) + +#define IAudioClient_GetDevicePeriod(This,phnsDefaultDevicePeriod,phnsMinimumDevicePeriod) \ + ( (This)->lpVtbl -> GetDevicePeriod(This,phnsDefaultDevicePeriod,phnsMinimumDevicePeriod) ) + +#define IAudioClient_Start(This) \ + ( (This)->lpVtbl -> Start(This) ) + +#define IAudioClient_Stop(This) \ + ( (This)->lpVtbl -> Stop(This) ) + +#define IAudioClient_Reset(This) \ + ( (This)->lpVtbl -> Reset(This) ) + +#define IAudioClient_SetEventHandle(This,eventHandle) \ + ( (This)->lpVtbl -> SetEventHandle(This,eventHandle) ) + +#define IAudioClient_GetService(This,riid,ppv) \ + ( (This)->lpVtbl -> GetService(This,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioClient_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioRenderClient_INTERFACE_DEFINED__ +#define __IAudioRenderClient_INTERFACE_DEFINED__ + +/* interface IAudioRenderClient */ +/* [local][unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IAudioRenderClient; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("F294ACFC-3146-4483-A7BF-ADDCA7C260E2") + IAudioRenderClient : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetBuffer( + /* [in] */ + __in UINT32 NumFramesRequested, + /* [out] */ + __out BYTE **ppData) = 0; + + virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( + /* [in] */ + __in UINT32 NumFramesWritten, + /* [in] */ + __in DWORD dwFlags) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioRenderClientVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioRenderClient * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioRenderClient * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioRenderClient * This); + + HRESULT ( STDMETHODCALLTYPE *GetBuffer )( + IAudioRenderClient * This, + /* [in] */ + __in UINT32 NumFramesRequested, + /* [out] */ + __out BYTE **ppData); + + HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( + IAudioRenderClient * This, + /* [in] */ + __in UINT32 NumFramesWritten, + /* [in] */ + __in DWORD dwFlags); + + END_INTERFACE + } IAudioRenderClientVtbl; + + interface IAudioRenderClient + { + CONST_VTBL struct IAudioRenderClientVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioRenderClient_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioRenderClient_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioRenderClient_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioRenderClient_GetBuffer(This,NumFramesRequested,ppData) \ + ( (This)->lpVtbl -> GetBuffer(This,NumFramesRequested,ppData) ) + +#define IAudioRenderClient_ReleaseBuffer(This,NumFramesWritten,dwFlags) \ + ( (This)->lpVtbl -> ReleaseBuffer(This,NumFramesWritten,dwFlags) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioRenderClient_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioCaptureClient_INTERFACE_DEFINED__ +#define __IAudioCaptureClient_INTERFACE_DEFINED__ + +/* interface IAudioCaptureClient */ +/* [local][unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IAudioCaptureClient; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("C8ADBD64-E71E-48a0-A4DE-185C395CD317") + IAudioCaptureClient : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetBuffer( + /* [out] */ + __out BYTE **ppData, + /* [out] */ + __out UINT32 *pNumFramesToRead, + /* [out] */ + __out DWORD *pdwFlags, + /* [unique][out] */ + __out_opt UINT64 *pu64DevicePosition, + /* [unique][out] */ + __out_opt UINT64 *pu64QPCPosition) = 0; + + virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( + /* [in] */ + __in UINT32 NumFramesRead) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetNextPacketSize( + /* [out] */ + __out UINT32 *pNumFramesInNextPacket) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioCaptureClientVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioCaptureClient * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioCaptureClient * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioCaptureClient * This); + + HRESULT ( STDMETHODCALLTYPE *GetBuffer )( + IAudioCaptureClient * This, + /* [out] */ + __out BYTE **ppData, + /* [out] */ + __out UINT32 *pNumFramesToRead, + /* [out] */ + __out DWORD *pdwFlags, + /* [unique][out] */ + __out_opt UINT64 *pu64DevicePosition, + /* [unique][out] */ + __out_opt UINT64 *pu64QPCPosition); + + HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( + IAudioCaptureClient * This, + /* [in] */ + __in UINT32 NumFramesRead); + + HRESULT ( STDMETHODCALLTYPE *GetNextPacketSize )( + IAudioCaptureClient * This, + /* [out] */ + __out UINT32 *pNumFramesInNextPacket); + + END_INTERFACE + } IAudioCaptureClientVtbl; + + interface IAudioCaptureClient + { + CONST_VTBL struct IAudioCaptureClientVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioCaptureClient_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioCaptureClient_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioCaptureClient_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioCaptureClient_GetBuffer(This,ppData,pNumFramesToRead,pdwFlags,pu64DevicePosition,pu64QPCPosition) \ + ( (This)->lpVtbl -> GetBuffer(This,ppData,pNumFramesToRead,pdwFlags,pu64DevicePosition,pu64QPCPosition) ) + +#define IAudioCaptureClient_ReleaseBuffer(This,NumFramesRead) \ + ( (This)->lpVtbl -> ReleaseBuffer(This,NumFramesRead) ) + +#define IAudioCaptureClient_GetNextPacketSize(This,pNumFramesInNextPacket) \ + ( (This)->lpVtbl -> GetNextPacketSize(This,pNumFramesInNextPacket) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioCaptureClient_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_audioclient_0000_0003 */ +/* [local] */ + +#define AUDIOCLOCK_CHARACTERISTIC_FIXED_FREQ 0x00000001 + + +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0003_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0003_v0_0_s_ifspec; + +#ifndef __IAudioClock_INTERFACE_DEFINED__ +#define __IAudioClock_INTERFACE_DEFINED__ + +/* interface IAudioClock */ +/* [local][unique][uuid][object] */ + + +EXTERN_C const IID IID_IAudioClock; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("CD63314F-3FBA-4a1b-812C-EF96358728E7") + IAudioClock : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetFrequency( + /* [out] */ + __out UINT64 *pu64Frequency) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPosition( + /* [out] */ + __out UINT64 *pu64Position, + /* [unique][out] */ + __out_opt UINT64 *pu64QPCPosition) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCharacteristics( + /* [out] */ + __out DWORD *pdwCharacteristics) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioClockVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioClock * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioClock * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioClock * This); + + HRESULT ( STDMETHODCALLTYPE *GetFrequency )( + IAudioClock * This, + /* [out] */ + __out UINT64 *pu64Frequency); + + HRESULT ( STDMETHODCALLTYPE *GetPosition )( + IAudioClock * This, + /* [out] */ + __out UINT64 *pu64Position, + /* [unique][out] */ + __out_opt UINT64 *pu64QPCPosition); + + HRESULT ( STDMETHODCALLTYPE *GetCharacteristics )( + IAudioClock * This, + /* [out] */ + __out DWORD *pdwCharacteristics); + + END_INTERFACE + } IAudioClockVtbl; + + interface IAudioClock + { + CONST_VTBL struct IAudioClockVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioClock_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioClock_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioClock_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioClock_GetFrequency(This,pu64Frequency) \ + ( (This)->lpVtbl -> GetFrequency(This,pu64Frequency) ) + +#define IAudioClock_GetPosition(This,pu64Position,pu64QPCPosition) \ + ( (This)->lpVtbl -> GetPosition(This,pu64Position,pu64QPCPosition) ) + +#define IAudioClock_GetCharacteristics(This,pdwCharacteristics) \ + ( (This)->lpVtbl -> GetCharacteristics(This,pdwCharacteristics) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioClock_INTERFACE_DEFINED__ */ + + +#ifndef __ISimpleAudioVolume_INTERFACE_DEFINED__ +#define __ISimpleAudioVolume_INTERFACE_DEFINED__ + +/* interface ISimpleAudioVolume */ +/* [local][unique][uuid][object] */ + + +EXTERN_C const IID IID_ISimpleAudioVolume; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("87CE5498-68D6-44E5-9215-6DA47EF883D8") + ISimpleAudioVolume : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SetMasterVolume( + /* [in] */ + __in float fLevel, + /* [unique][in] */ LPCGUID EventContext) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMasterVolume( + /* [out] */ + __out float *pfLevel) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMute( + /* [in] */ + __in const BOOL bMute, + /* [unique][in] */ LPCGUID EventContext) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMute( + /* [out] */ + __out BOOL *pbMute) = 0; + + }; + +#else /* C style interface */ + + typedef struct ISimpleAudioVolumeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ISimpleAudioVolume * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ISimpleAudioVolume * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ISimpleAudioVolume * This); + + HRESULT ( STDMETHODCALLTYPE *SetMasterVolume )( + ISimpleAudioVolume * This, + /* [in] */ + __in float fLevel, + /* [unique][in] */ LPCGUID EventContext); + + HRESULT ( STDMETHODCALLTYPE *GetMasterVolume )( + ISimpleAudioVolume * This, + /* [out] */ + __out float *pfLevel); + + HRESULT ( STDMETHODCALLTYPE *SetMute )( + ISimpleAudioVolume * This, + /* [in] */ + __in const BOOL bMute, + /* [unique][in] */ LPCGUID EventContext); + + HRESULT ( STDMETHODCALLTYPE *GetMute )( + ISimpleAudioVolume * This, + /* [out] */ + __out BOOL *pbMute); + + END_INTERFACE + } ISimpleAudioVolumeVtbl; + + interface ISimpleAudioVolume + { + CONST_VTBL struct ISimpleAudioVolumeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ISimpleAudioVolume_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ISimpleAudioVolume_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ISimpleAudioVolume_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ISimpleAudioVolume_SetMasterVolume(This,fLevel,EventContext) \ + ( (This)->lpVtbl -> SetMasterVolume(This,fLevel,EventContext) ) + +#define ISimpleAudioVolume_GetMasterVolume(This,pfLevel) \ + ( (This)->lpVtbl -> GetMasterVolume(This,pfLevel) ) + +#define ISimpleAudioVolume_SetMute(This,bMute,EventContext) \ + ( (This)->lpVtbl -> SetMute(This,bMute,EventContext) ) + +#define ISimpleAudioVolume_GetMute(This,pbMute) \ + ( (This)->lpVtbl -> GetMute(This,pbMute) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ISimpleAudioVolume_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioStreamVolume_INTERFACE_DEFINED__ +#define __IAudioStreamVolume_INTERFACE_DEFINED__ + +/* interface IAudioStreamVolume */ +/* [local][unique][uuid][object] */ + + +EXTERN_C const IID IID_IAudioStreamVolume; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("93014887-242D-4068-8A15-CF5E93B90FE3") + IAudioStreamVolume : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetChannelCount( + /* [out] */ + __out UINT32 *pdwCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetChannelVolume( + /* [in] */ + __in UINT32 dwIndex, + /* [in] */ + __in const float fLevel) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetChannelVolume( + /* [in] */ + __in UINT32 dwIndex, + /* [out] */ + __out float *pfLevel) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAllVolumes( + /* [in] */ + __in UINT32 dwCount, + /* [size_is][in] */ + __in_ecount(dwCount) const float *pfVolumes) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAllVolumes( + /* [in] */ + __in UINT32 dwCount, + /* [size_is][out] */ + __out_ecount(dwCount) float *pfVolumes) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioStreamVolumeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioStreamVolume * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioStreamVolume * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioStreamVolume * This); + + HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioStreamVolume * This, + /* [out] */ + __out UINT32 *pdwCount); + + HRESULT ( STDMETHODCALLTYPE *SetChannelVolume )( + IAudioStreamVolume * This, + /* [in] */ + __in UINT32 dwIndex, + /* [in] */ + __in const float fLevel); + + HRESULT ( STDMETHODCALLTYPE *GetChannelVolume )( + IAudioStreamVolume * This, + /* [in] */ + __in UINT32 dwIndex, + /* [out] */ + __out float *pfLevel); + + HRESULT ( STDMETHODCALLTYPE *SetAllVolumes )( + IAudioStreamVolume * This, + /* [in] */ + __in UINT32 dwCount, + /* [size_is][in] */ + __in_ecount(dwCount) const float *pfVolumes); + + HRESULT ( STDMETHODCALLTYPE *GetAllVolumes )( + IAudioStreamVolume * This, + /* [in] */ + __in UINT32 dwCount, + /* [size_is][out] */ + __out_ecount(dwCount) float *pfVolumes); + + END_INTERFACE + } IAudioStreamVolumeVtbl; + + interface IAudioStreamVolume + { + CONST_VTBL struct IAudioStreamVolumeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioStreamVolume_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioStreamVolume_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioStreamVolume_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioStreamVolume_GetChannelCount(This,pdwCount) \ + ( (This)->lpVtbl -> GetChannelCount(This,pdwCount) ) + +#define IAudioStreamVolume_SetChannelVolume(This,dwIndex,fLevel) \ + ( (This)->lpVtbl -> SetChannelVolume(This,dwIndex,fLevel) ) + +#define IAudioStreamVolume_GetChannelVolume(This,dwIndex,pfLevel) \ + ( (This)->lpVtbl -> GetChannelVolume(This,dwIndex,pfLevel) ) + +#define IAudioStreamVolume_SetAllVolumes(This,dwCount,pfVolumes) \ + ( (This)->lpVtbl -> SetAllVolumes(This,dwCount,pfVolumes) ) + +#define IAudioStreamVolume_GetAllVolumes(This,dwCount,pfVolumes) \ + ( (This)->lpVtbl -> GetAllVolumes(This,dwCount,pfVolumes) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioStreamVolume_INTERFACE_DEFINED__ */ + + +#ifndef __IChannelAudioVolume_INTERFACE_DEFINED__ +#define __IChannelAudioVolume_INTERFACE_DEFINED__ + +/* interface IChannelAudioVolume */ +/* [local][unique][uuid][object] */ + + +EXTERN_C const IID IID_IChannelAudioVolume; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("1C158861-B533-4B30-B1CF-E853E51C59B8") + IChannelAudioVolume : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetChannelCount( + /* [out] */ + __out UINT32 *pdwCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetChannelVolume( + /* [in] */ + __in UINT32 dwIndex, + /* [in] */ + __in const float fLevel, + /* [unique][in] */ LPCGUID EventContext) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetChannelVolume( + /* [in] */ + __in UINT32 dwIndex, + /* [out] */ + __out float *pfLevel) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAllVolumes( + /* [in] */ + __in UINT32 dwCount, + /* [size_is][in] */ + __in_ecount(dwCount) const float *pfVolumes, + /* [unique][in] */ LPCGUID EventContext) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAllVolumes( + /* [in] */ + __in UINT32 dwCount, + /* [size_is][out] */ + __out_ecount(dwCount) float *pfVolumes) = 0; + + }; + +#else /* C style interface */ + + typedef struct IChannelAudioVolumeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IChannelAudioVolume * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IChannelAudioVolume * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IChannelAudioVolume * This); + + HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IChannelAudioVolume * This, + /* [out] */ + __out UINT32 *pdwCount); + + HRESULT ( STDMETHODCALLTYPE *SetChannelVolume )( + IChannelAudioVolume * This, + /* [in] */ + __in UINT32 dwIndex, + /* [in] */ + __in const float fLevel, + /* [unique][in] */ LPCGUID EventContext); + + HRESULT ( STDMETHODCALLTYPE *GetChannelVolume )( + IChannelAudioVolume * This, + /* [in] */ + __in UINT32 dwIndex, + /* [out] */ + __out float *pfLevel); + + HRESULT ( STDMETHODCALLTYPE *SetAllVolumes )( + IChannelAudioVolume * This, + /* [in] */ + __in UINT32 dwCount, + /* [size_is][in] */ + __in_ecount(dwCount) const float *pfVolumes, + /* [unique][in] */ LPCGUID EventContext); + + HRESULT ( STDMETHODCALLTYPE *GetAllVolumes )( + IChannelAudioVolume * This, + /* [in] */ + __in UINT32 dwCount, + /* [size_is][out] */ + __out_ecount(dwCount) float *pfVolumes); + + END_INTERFACE + } IChannelAudioVolumeVtbl; + + interface IChannelAudioVolume + { + CONST_VTBL struct IChannelAudioVolumeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IChannelAudioVolume_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IChannelAudioVolume_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IChannelAudioVolume_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IChannelAudioVolume_GetChannelCount(This,pdwCount) \ + ( (This)->lpVtbl -> GetChannelCount(This,pdwCount) ) + +#define IChannelAudioVolume_SetChannelVolume(This,dwIndex,fLevel,EventContext) \ + ( (This)->lpVtbl -> SetChannelVolume(This,dwIndex,fLevel,EventContext) ) + +#define IChannelAudioVolume_GetChannelVolume(This,dwIndex,pfLevel) \ + ( (This)->lpVtbl -> GetChannelVolume(This,dwIndex,pfLevel) ) + +#define IChannelAudioVolume_SetAllVolumes(This,dwCount,pfVolumes,EventContext) \ + ( (This)->lpVtbl -> SetAllVolumes(This,dwCount,pfVolumes,EventContext) ) + +#define IChannelAudioVolume_GetAllVolumes(This,dwCount,pfVolumes) \ + ( (This)->lpVtbl -> GetAllVolumes(This,dwCount,pfVolumes) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IChannelAudioVolume_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_audioclient_0000_0007 */ +/* [local] */ + +#define FACILITY_AUDCLNT 0x889 +#define AUDCLNT_ERR(n) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_AUDCLNT, n) +#define AUDCLNT_SUCCESS(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_AUDCLNT, n) +#define AUDCLNT_E_NOT_INITIALIZED AUDCLNT_ERR(0x001) +#define AUDCLNT_E_ALREADY_INITIALIZED AUDCLNT_ERR(0x002) +#define AUDCLNT_E_WRONG_ENDPOINT_TYPE AUDCLNT_ERR(0x003) +#define AUDCLNT_E_DEVICE_INVALIDATED AUDCLNT_ERR(0x004) +#define AUDCLNT_E_NOT_STOPPED AUDCLNT_ERR(0x005) +#define AUDCLNT_E_BUFFER_TOO_LARGE AUDCLNT_ERR(0x006) +#define AUDCLNT_E_OUT_OF_ORDER AUDCLNT_ERR(0x007) +#define AUDCLNT_E_UNSUPPORTED_FORMAT AUDCLNT_ERR(0x008) +#define AUDCLNT_E_INVALID_SIZE AUDCLNT_ERR(0x009) +#define AUDCLNT_E_DEVICE_IN_USE AUDCLNT_ERR(0x00a) +#define AUDCLNT_E_BUFFER_OPERATION_PENDING AUDCLNT_ERR(0x00b) +#define AUDCLNT_E_THREAD_NOT_REGISTERED AUDCLNT_ERR(0x00c) +#define AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED AUDCLNT_ERR(0x00e) +#define AUDCLNT_E_ENDPOINT_CREATE_FAILED AUDCLNT_ERR(0x00f) +#define AUDCLNT_E_SERVICE_NOT_RUNNING AUDCLNT_ERR(0x010) +#define AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED AUDCLNT_ERR(0x011) +#define AUDCLNT_E_EXCLUSIVE_MODE_ONLY AUDCLNT_ERR(0x012) +#define AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL AUDCLNT_ERR(0x013) +#define AUDCLNT_E_EVENTHANDLE_NOT_SET AUDCLNT_ERR(0x014) +#define AUDCLNT_E_INCORRECT_BUFFER_SIZE AUDCLNT_ERR(0x015) +#define AUDCLNT_E_BUFFER_SIZE_ERROR AUDCLNT_ERR(0x016) +#define AUDCLNT_E_CPUUSAGE_EXCEEDED AUDCLNT_ERR(0x017) +#define AUDCLNT_S_BUFFER_EMPTY AUDCLNT_SUCCESS(0x001) +#define AUDCLNT_S_THREAD_ALREADY_REGISTERED AUDCLNT_SUCCESS(0x002) +#define AUDCLNT_S_POSITION_STALLED AUDCLNT_SUCCESS(0x003) + + +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0007_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_audioclient_0000_0007_v0_0_s_ifspec; + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/devicetopology.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/devicetopology.h new file mode 100644 index 0000000000..7a1f75c4ee --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/devicetopology.h @@ -0,0 +1,3275 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for devicetopology.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __devicetopology_h__ +#define __devicetopology_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IKsControl_FWD_DEFINED__ +#define __IKsControl_FWD_DEFINED__ +typedef interface IKsControl IKsControl; +#endif /* __IKsControl_FWD_DEFINED__ */ + + +#ifndef __IPerChannelDbLevel_FWD_DEFINED__ +#define __IPerChannelDbLevel_FWD_DEFINED__ +typedef interface IPerChannelDbLevel IPerChannelDbLevel; +#endif /* __IPerChannelDbLevel_FWD_DEFINED__ */ + + +#ifndef __IAudioVolumeLevel_FWD_DEFINED__ +#define __IAudioVolumeLevel_FWD_DEFINED__ +typedef interface IAudioVolumeLevel IAudioVolumeLevel; +#endif /* __IAudioVolumeLevel_FWD_DEFINED__ */ + + +#ifndef __IAudioChannelConfig_FWD_DEFINED__ +#define __IAudioChannelConfig_FWD_DEFINED__ +typedef interface IAudioChannelConfig IAudioChannelConfig; +#endif /* __IAudioChannelConfig_FWD_DEFINED__ */ + + +#ifndef __IAudioLoudness_FWD_DEFINED__ +#define __IAudioLoudness_FWD_DEFINED__ +typedef interface IAudioLoudness IAudioLoudness; +#endif /* __IAudioLoudness_FWD_DEFINED__ */ + + +#ifndef __IAudioInputSelector_FWD_DEFINED__ +#define __IAudioInputSelector_FWD_DEFINED__ +typedef interface IAudioInputSelector IAudioInputSelector; +#endif /* __IAudioInputSelector_FWD_DEFINED__ */ + + +#ifndef __IAudioOutputSelector_FWD_DEFINED__ +#define __IAudioOutputSelector_FWD_DEFINED__ +typedef interface IAudioOutputSelector IAudioOutputSelector; +#endif /* __IAudioOutputSelector_FWD_DEFINED__ */ + + +#ifndef __IAudioMute_FWD_DEFINED__ +#define __IAudioMute_FWD_DEFINED__ +typedef interface IAudioMute IAudioMute; +#endif /* __IAudioMute_FWD_DEFINED__ */ + + +#ifndef __IAudioBass_FWD_DEFINED__ +#define __IAudioBass_FWD_DEFINED__ +typedef interface IAudioBass IAudioBass; +#endif /* __IAudioBass_FWD_DEFINED__ */ + + +#ifndef __IAudioMidrange_FWD_DEFINED__ +#define __IAudioMidrange_FWD_DEFINED__ +typedef interface IAudioMidrange IAudioMidrange; +#endif /* __IAudioMidrange_FWD_DEFINED__ */ + + +#ifndef __IAudioTreble_FWD_DEFINED__ +#define __IAudioTreble_FWD_DEFINED__ +typedef interface IAudioTreble IAudioTreble; +#endif /* __IAudioTreble_FWD_DEFINED__ */ + + +#ifndef __IAudioAutoGainControl_FWD_DEFINED__ +#define __IAudioAutoGainControl_FWD_DEFINED__ +typedef interface IAudioAutoGainControl IAudioAutoGainControl; +#endif /* __IAudioAutoGainControl_FWD_DEFINED__ */ + + +#ifndef __IAudioPeakMeter_FWD_DEFINED__ +#define __IAudioPeakMeter_FWD_DEFINED__ +typedef interface IAudioPeakMeter IAudioPeakMeter; +#endif /* __IAudioPeakMeter_FWD_DEFINED__ */ + + +#ifndef __IDeviceSpecificProperty_FWD_DEFINED__ +#define __IDeviceSpecificProperty_FWD_DEFINED__ +typedef interface IDeviceSpecificProperty IDeviceSpecificProperty; +#endif /* __IDeviceSpecificProperty_FWD_DEFINED__ */ + + +#ifndef __IKsFormatSupport_FWD_DEFINED__ +#define __IKsFormatSupport_FWD_DEFINED__ +typedef interface IKsFormatSupport IKsFormatSupport; +#endif /* __IKsFormatSupport_FWD_DEFINED__ */ + + +#ifndef __IKsJackDescription_FWD_DEFINED__ +#define __IKsJackDescription_FWD_DEFINED__ +typedef interface IKsJackDescription IKsJackDescription; +#endif /* __IKsJackDescription_FWD_DEFINED__ */ + + +#ifndef __IPartsList_FWD_DEFINED__ +#define __IPartsList_FWD_DEFINED__ +typedef interface IPartsList IPartsList; +#endif /* __IPartsList_FWD_DEFINED__ */ + + +#ifndef __IPart_FWD_DEFINED__ +#define __IPart_FWD_DEFINED__ +typedef interface IPart IPart; +#endif /* __IPart_FWD_DEFINED__ */ + + +#ifndef __IConnector_FWD_DEFINED__ +#define __IConnector_FWD_DEFINED__ +typedef interface IConnector IConnector; +#endif /* __IConnector_FWD_DEFINED__ */ + + +#ifndef __ISubunit_FWD_DEFINED__ +#define __ISubunit_FWD_DEFINED__ +typedef interface ISubunit ISubunit; +#endif /* __ISubunit_FWD_DEFINED__ */ + + +#ifndef __IControlInterface_FWD_DEFINED__ +#define __IControlInterface_FWD_DEFINED__ +typedef interface IControlInterface IControlInterface; +#endif /* __IControlInterface_FWD_DEFINED__ */ + + +#ifndef __IControlChangeNotify_FWD_DEFINED__ +#define __IControlChangeNotify_FWD_DEFINED__ +typedef interface IControlChangeNotify IControlChangeNotify; +#endif /* __IControlChangeNotify_FWD_DEFINED__ */ + + +#ifndef __IDeviceTopology_FWD_DEFINED__ +#define __IDeviceTopology_FWD_DEFINED__ +typedef interface IDeviceTopology IDeviceTopology; +#endif /* __IDeviceTopology_FWD_DEFINED__ */ + + +#ifndef __DeviceTopology_FWD_DEFINED__ +#define __DeviceTopology_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class DeviceTopology DeviceTopology; +#else +typedef struct DeviceTopology DeviceTopology; +#endif /* __cplusplus */ + +#endif /* __DeviceTopology_FWD_DEFINED__ */ + + +#ifndef __IPartsList_FWD_DEFINED__ +#define __IPartsList_FWD_DEFINED__ +typedef interface IPartsList IPartsList; +#endif /* __IPartsList_FWD_DEFINED__ */ + + +#ifndef __IPerChannelDbLevel_FWD_DEFINED__ +#define __IPerChannelDbLevel_FWD_DEFINED__ +typedef interface IPerChannelDbLevel IPerChannelDbLevel; +#endif /* __IPerChannelDbLevel_FWD_DEFINED__ */ + + +#ifndef __IAudioVolumeLevel_FWD_DEFINED__ +#define __IAudioVolumeLevel_FWD_DEFINED__ +typedef interface IAudioVolumeLevel IAudioVolumeLevel; +#endif /* __IAudioVolumeLevel_FWD_DEFINED__ */ + + +#ifndef __IAudioLoudness_FWD_DEFINED__ +#define __IAudioLoudness_FWD_DEFINED__ +typedef interface IAudioLoudness IAudioLoudness; +#endif /* __IAudioLoudness_FWD_DEFINED__ */ + + +#ifndef __IAudioInputSelector_FWD_DEFINED__ +#define __IAudioInputSelector_FWD_DEFINED__ +typedef interface IAudioInputSelector IAudioInputSelector; +#endif /* __IAudioInputSelector_FWD_DEFINED__ */ + + +#ifndef __IAudioMute_FWD_DEFINED__ +#define __IAudioMute_FWD_DEFINED__ +typedef interface IAudioMute IAudioMute; +#endif /* __IAudioMute_FWD_DEFINED__ */ + + +#ifndef __IAudioBass_FWD_DEFINED__ +#define __IAudioBass_FWD_DEFINED__ +typedef interface IAudioBass IAudioBass; +#endif /* __IAudioBass_FWD_DEFINED__ */ + + +#ifndef __IAudioMidrange_FWD_DEFINED__ +#define __IAudioMidrange_FWD_DEFINED__ +typedef interface IAudioMidrange IAudioMidrange; +#endif /* __IAudioMidrange_FWD_DEFINED__ */ + + +#ifndef __IAudioTreble_FWD_DEFINED__ +#define __IAudioTreble_FWD_DEFINED__ +typedef interface IAudioTreble IAudioTreble; +#endif /* __IAudioTreble_FWD_DEFINED__ */ + + +#ifndef __IAudioAutoGainControl_FWD_DEFINED__ +#define __IAudioAutoGainControl_FWD_DEFINED__ +typedef interface IAudioAutoGainControl IAudioAutoGainControl; +#endif /* __IAudioAutoGainControl_FWD_DEFINED__ */ + + +#ifndef __IAudioOutputSelector_FWD_DEFINED__ +#define __IAudioOutputSelector_FWD_DEFINED__ +typedef interface IAudioOutputSelector IAudioOutputSelector; +#endif /* __IAudioOutputSelector_FWD_DEFINED__ */ + + +#ifndef __IAudioPeakMeter_FWD_DEFINED__ +#define __IAudioPeakMeter_FWD_DEFINED__ +typedef interface IAudioPeakMeter IAudioPeakMeter; +#endif /* __IAudioPeakMeter_FWD_DEFINED__ */ + + +#ifndef __IDeviceSpecificProperty_FWD_DEFINED__ +#define __IDeviceSpecificProperty_FWD_DEFINED__ +typedef interface IDeviceSpecificProperty IDeviceSpecificProperty; +#endif /* __IDeviceSpecificProperty_FWD_DEFINED__ */ + + +#ifndef __IKsFormatSupport_FWD_DEFINED__ +#define __IKsFormatSupport_FWD_DEFINED__ +typedef interface IKsFormatSupport IKsFormatSupport; +#endif /* __IKsFormatSupport_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" +#include "propidl.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_devicetopology_0000_0000 */ +/* [local] */ + +#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND) +// +// Flag for clients of IControlChangeNotify::OnNotify to allow those clients to identify hardware initiated notifications +// +#define DEVTOPO_HARDWARE_INITIATED_EVENTCONTEXT 'draH' +/* E2C2E9DE-09B1-4B04-84E5-07931225EE04 */ +DEFINE_GUID(EVENTCONTEXT_VOLUMESLIDER, 0xE2C2E9DE,0x09B1,0x4B04,0x84, 0xE5, 0x07, 0x93, 0x12, 0x25, 0xEE, 0x04); +#define _IKsControl_ +#include "ks.h" +#include "ksmedia.h" +#ifndef _KS_ +typedef /* [public] */ struct __MIDL___MIDL_itf_devicetopology_0000_0000_0001 + { + ULONG FormatSize; + ULONG Flags; + ULONG SampleSize; + ULONG Reserved; + GUID MajorFormat; + GUID SubFormat; + GUID Specifier; + } KSDATAFORMAT; + +typedef struct __MIDL___MIDL_itf_devicetopology_0000_0000_0001 *PKSDATAFORMAT; + +typedef /* [public][public][public][public][public][public][public][public][public][public] */ struct __MIDL___MIDL_itf_devicetopology_0000_0000_0002 + { + union + { + struct + { + GUID Set; + ULONG Id; + ULONG Flags; + } ; + LONGLONG Alignment; + } ; + } KSIDENTIFIER; + +typedef struct __MIDL___MIDL_itf_devicetopology_0000_0000_0002 *PKSIDENTIFIER; + +typedef /* [public][public][public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0005 + { ePcxChanMap_FL_FR = 0, + ePcxChanMap_FC_LFE = ( ePcxChanMap_FL_FR + 1 ) , + ePcxChanMap_BL_BR = ( ePcxChanMap_FC_LFE + 1 ) , + ePcxChanMap_FLC_FRC = ( ePcxChanMap_BL_BR + 1 ) , + ePcxChanMap_SL_SR = ( ePcxChanMap_FLC_FRC + 1 ) , + ePcxChanMap_Unknown = ( ePcxChanMap_SL_SR + 1 ) + } EChannelMapping; + +typedef /* [public][public][public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0006 + { eConnTypeUnknown = 0, + eConnTypeEighth = ( eConnTypeUnknown + 1 ) , + eConnTypeQuarter = ( eConnTypeEighth + 1 ) , + eConnTypeAtapiInternal = ( eConnTypeQuarter + 1 ) , + eConnTypeRCA = ( eConnTypeAtapiInternal + 1 ) , + eConnTypeOptical = ( eConnTypeRCA + 1 ) , + eConnTypeOtherDigital = ( eConnTypeOptical + 1 ) , + eConnTypeOtherAnalog = ( eConnTypeOtherDigital + 1 ) , + eConnTypeMultichannelAnalogDIN = ( eConnTypeOtherAnalog + 1 ) , + eConnTypeXlrProfessional = ( eConnTypeMultichannelAnalogDIN + 1 ) , + eConnTypeRJ11Modem = ( eConnTypeXlrProfessional + 1 ) , + eConnTypeCombination = ( eConnTypeRJ11Modem + 1 ) + } EPcxConnectionType; + +typedef /* [public][public][public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0007 + { eGeoLocRear = 0x1, + eGeoLocFront = ( eGeoLocRear + 1 ) , + eGeoLocLeft = ( eGeoLocFront + 1 ) , + eGeoLocRight = ( eGeoLocLeft + 1 ) , + eGeoLocTop = ( eGeoLocRight + 1 ) , + eGeoLocBottom = ( eGeoLocTop + 1 ) , + eGeoLocRearOPanel = ( eGeoLocBottom + 1 ) , + eGeoLocRiser = ( eGeoLocRearOPanel + 1 ) , + eGeoLocInsideMobileLid = ( eGeoLocRiser + 1 ) , + eGeoLocDrivebay = ( eGeoLocInsideMobileLid + 1 ) , + eGeoLocHDMI = ( eGeoLocDrivebay + 1 ) , + eGeoLocOutsideMobileLid = ( eGeoLocHDMI + 1 ) , + eGeoLocATAPI = ( eGeoLocOutsideMobileLid + 1 ) , + eGeoLocReserved5 = ( eGeoLocATAPI + 1 ) , + eGeoLocReserved6 = ( eGeoLocReserved5 + 1 ) + } EPcxGeoLocation; + +typedef /* [public][public][public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0008 + { eGenLocPrimaryBox = 0, + eGenLocInternal = ( eGenLocPrimaryBox + 1 ) , + eGenLocSeperate = ( eGenLocInternal + 1 ) , + eGenLocOther = ( eGenLocSeperate + 1 ) + } EPcxGenLocation; + +typedef /* [public][public][public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0009 + { ePortConnJack = 0, + ePortConnIntegratedDevice = ( ePortConnJack + 1 ) , + ePortConnBothIntegratedAndJack = ( ePortConnIntegratedDevice + 1 ) , + ePortConnUnknown = ( ePortConnBothIntegratedAndJack + 1 ) + } EPxcPortConnection; + +typedef /* [public][public] */ struct __MIDL___MIDL_itf_devicetopology_0000_0000_0010 + { + EChannelMapping ChannelMapping; + COLORREF Color; + EPcxConnectionType ConnectionType; + EPcxGeoLocation GeoLocation; + EPcxGenLocation GenLocation; + EPxcPortConnection PortConnection; + BOOL IsConnected; + } KSJACK_DESCRIPTION; + +typedef struct __MIDL___MIDL_itf_devicetopology_0000_0000_0010 *PKSJACK_DESCRIPTION; + +typedef KSIDENTIFIER KSPROPERTY; + +typedef KSIDENTIFIER *PKSPROPERTY; + +typedef KSIDENTIFIER KSMETHOD; + +typedef KSIDENTIFIER *PKSMETHOD; + +typedef KSIDENTIFIER KSEVENT; + +typedef KSIDENTIFIER *PKSEVENT; + +#endif + + + + + + + + +typedef /* [public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0011 + { In = 0, + Out = ( In + 1 ) + } DataFlow; + +typedef /* [public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0012 + { Connector = 0, + Subunit = ( Connector + 1 ) + } PartType; + +#define PARTTYPE_FLAG_CONNECTOR 0x00010000 +#define PARTTYPE_FLAG_SUBUNIT 0x00020000 +#define PARTTYPE_MASK 0x00030000 +#define PARTID_MASK 0x0000ffff +typedef /* [public][public] */ +enum __MIDL___MIDL_itf_devicetopology_0000_0000_0013 + { Unknown_Connector = 0, + Physical_Internal = ( Unknown_Connector + 1 ) , + Physical_External = ( Physical_Internal + 1 ) , + Software_IO = ( Physical_External + 1 ) , + Software_Fixed = ( Software_IO + 1 ) , + Network = ( Software_Fixed + 1 ) + } ConnectorType; + + + +extern RPC_IF_HANDLE __MIDL_itf_devicetopology_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_devicetopology_0000_0000_v0_0_s_ifspec; + +#ifndef __IKsControl_INTERFACE_DEFINED__ +#define __IKsControl_INTERFACE_DEFINED__ + +/* interface IKsControl */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IKsControl; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("28F54685-06FD-11D2-B27A-00A0C9223196") + IKsControl : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE KsProperty( + /* [in] */ PKSPROPERTY Property, + /* [in] */ ULONG PropertyLength, + /* [out][in] */ void *PropertyData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned) = 0; + + virtual HRESULT STDMETHODCALLTYPE KsMethod( + /* [in] */ PKSMETHOD Method, + /* [in] */ ULONG MethodLength, + /* [out][in] */ void *MethodData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned) = 0; + + virtual HRESULT STDMETHODCALLTYPE KsEvent( + /* [in] */ PKSEVENT Event, + /* [in] */ ULONG EventLength, + /* [out][in] */ void *EventData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned) = 0; + + }; + +#else /* C style interface */ + + typedef struct IKsControlVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IKsControl * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IKsControl * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IKsControl * This); + + HRESULT ( STDMETHODCALLTYPE *KsProperty )( + IKsControl * This, + /* [in] */ PKSPROPERTY Property, + /* [in] */ ULONG PropertyLength, + /* [out][in] */ void *PropertyData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned); + + HRESULT ( STDMETHODCALLTYPE *KsMethod )( + IKsControl * This, + /* [in] */ PKSMETHOD Method, + /* [in] */ ULONG MethodLength, + /* [out][in] */ void *MethodData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned); + + HRESULT ( STDMETHODCALLTYPE *KsEvent )( + IKsControl * This, + /* [in] */ PKSEVENT Event, + /* [in] */ ULONG EventLength, + /* [out][in] */ void *EventData, + /* [in] */ ULONG DataLength, + /* [out] */ ULONG *BytesReturned); + + END_INTERFACE + } IKsControlVtbl; + + interface IKsControl + { + CONST_VTBL struct IKsControlVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IKsControl_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IKsControl_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IKsControl_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IKsControl_KsProperty(This,Property,PropertyLength,PropertyData,DataLength,BytesReturned) \ + ( (This)->lpVtbl -> KsProperty(This,Property,PropertyLength,PropertyData,DataLength,BytesReturned) ) + +#define IKsControl_KsMethod(This,Method,MethodLength,MethodData,DataLength,BytesReturned) \ + ( (This)->lpVtbl -> KsMethod(This,Method,MethodLength,MethodData,DataLength,BytesReturned) ) + +#define IKsControl_KsEvent(This,Event,EventLength,EventData,DataLength,BytesReturned) \ + ( (This)->lpVtbl -> KsEvent(This,Event,EventLength,EventData,DataLength,BytesReturned) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IKsControl_INTERFACE_DEFINED__ */ + + +#ifndef __IPerChannelDbLevel_INTERFACE_DEFINED__ +#define __IPerChannelDbLevel_INTERFACE_DEFINED__ + +/* interface IPerChannelDbLevel */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IPerChannelDbLevel; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("C2F8E001-F205-4BC9-99BC-C13B1E048CCB") + IPerChannelDbLevel : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetChannelCount( + /* [out] */ + __out UINT *pcChannels) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetLevelRange( + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetLevel( + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetLevel( + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetLevelUniform( + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetLevelAllChannels( + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPerChannelDbLevelVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPerChannelDbLevel * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPerChannelDbLevel * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPerChannelDbLevel * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IPerChannelDbLevel * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevelRange )( + IPerChannelDbLevel * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IPerChannelDbLevel * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevel )( + IPerChannelDbLevel * This, + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelUniform )( + IPerChannelDbLevel * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelAllChannels )( + IPerChannelDbLevel * This, + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IPerChannelDbLevelVtbl; + + interface IPerChannelDbLevel + { + CONST_VTBL struct IPerChannelDbLevelVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPerChannelDbLevel_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPerChannelDbLevel_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPerChannelDbLevel_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPerChannelDbLevel_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IPerChannelDbLevel_GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) \ + ( (This)->lpVtbl -> GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) ) + +#define IPerChannelDbLevel_GetLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevelDB) ) + +#define IPerChannelDbLevel_SetLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IPerChannelDbLevel_SetLevelUniform(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelUniform(This,fLevelDB,pguidEventContext) ) + +#define IPerChannelDbLevel_SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPerChannelDbLevel_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioVolumeLevel_INTERFACE_DEFINED__ +#define __IAudioVolumeLevel_INTERFACE_DEFINED__ + +/* interface IAudioVolumeLevel */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioVolumeLevel; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC") + IAudioVolumeLevel : public IPerChannelDbLevel + { + public: + }; + +#else /* C style interface */ + + typedef struct IAudioVolumeLevelVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioVolumeLevel * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioVolumeLevel * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioVolumeLevel * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioVolumeLevel * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevelRange )( + IAudioVolumeLevel * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IAudioVolumeLevel * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevel )( + IAudioVolumeLevel * This, + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelUniform )( + IAudioVolumeLevel * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelAllChannels )( + IAudioVolumeLevel * This, + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioVolumeLevelVtbl; + + interface IAudioVolumeLevel + { + CONST_VTBL struct IAudioVolumeLevelVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioVolumeLevel_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioVolumeLevel_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioVolumeLevel_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioVolumeLevel_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IAudioVolumeLevel_GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) \ + ( (This)->lpVtbl -> GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) ) + +#define IAudioVolumeLevel_GetLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevelDB) ) + +#define IAudioVolumeLevel_SetLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IAudioVolumeLevel_SetLevelUniform(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelUniform(This,fLevelDB,pguidEventContext) ) + +#define IAudioVolumeLevel_SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioVolumeLevel_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioChannelConfig_INTERFACE_DEFINED__ +#define __IAudioChannelConfig_INTERFACE_DEFINED__ + +/* interface IAudioChannelConfig */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioChannelConfig; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BB11C46F-EC28-493C-B88A-5DB88062CE98") + IAudioChannelConfig : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetChannelConfig( + /* [in] */ DWORD dwConfig, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetChannelConfig( + /* [retval][out] */ DWORD *pdwConfig) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioChannelConfigVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioChannelConfig * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioChannelConfig * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioChannelConfig * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetChannelConfig )( + IAudioChannelConfig * This, + /* [in] */ DWORD dwConfig, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelConfig )( + IAudioChannelConfig * This, + /* [retval][out] */ DWORD *pdwConfig); + + END_INTERFACE + } IAudioChannelConfigVtbl; + + interface IAudioChannelConfig + { + CONST_VTBL struct IAudioChannelConfigVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioChannelConfig_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioChannelConfig_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioChannelConfig_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioChannelConfig_SetChannelConfig(This,dwConfig,pguidEventContext) \ + ( (This)->lpVtbl -> SetChannelConfig(This,dwConfig,pguidEventContext) ) + +#define IAudioChannelConfig_GetChannelConfig(This,pdwConfig) \ + ( (This)->lpVtbl -> GetChannelConfig(This,pdwConfig) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioChannelConfig_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioLoudness_INTERFACE_DEFINED__ +#define __IAudioLoudness_INTERFACE_DEFINED__ + +/* interface IAudioLoudness */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioLoudness; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7D8B1437-DD53-4350-9C1B-1EE2890BD938") + IAudioLoudness : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetEnabled( + /* [out] */ + __out BOOL *pbEnabled) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetEnabled( + /* [in] */ + __in BOOL bEnable, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioLoudnessVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioLoudness * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioLoudness * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioLoudness * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetEnabled )( + IAudioLoudness * This, + /* [out] */ + __out BOOL *pbEnabled); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetEnabled )( + IAudioLoudness * This, + /* [in] */ + __in BOOL bEnable, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioLoudnessVtbl; + + interface IAudioLoudness + { + CONST_VTBL struct IAudioLoudnessVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioLoudness_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioLoudness_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioLoudness_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioLoudness_GetEnabled(This,pbEnabled) \ + ( (This)->lpVtbl -> GetEnabled(This,pbEnabled) ) + +#define IAudioLoudness_SetEnabled(This,bEnable,pguidEventContext) \ + ( (This)->lpVtbl -> SetEnabled(This,bEnable,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioLoudness_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioInputSelector_INTERFACE_DEFINED__ +#define __IAudioInputSelector_INTERFACE_DEFINED__ + +/* interface IAudioInputSelector */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioInputSelector; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4F03DC02-5E6E-4653-8F72-A030C123D598") + IAudioInputSelector : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSelection( + /* [out] */ + __out UINT *pnIdSelected) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetSelection( + /* [in] */ + __in UINT nIdSelect, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioInputSelectorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioInputSelector * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioInputSelector * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioInputSelector * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSelection )( + IAudioInputSelector * This, + /* [out] */ + __out UINT *pnIdSelected); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetSelection )( + IAudioInputSelector * This, + /* [in] */ + __in UINT nIdSelect, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioInputSelectorVtbl; + + interface IAudioInputSelector + { + CONST_VTBL struct IAudioInputSelectorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioInputSelector_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioInputSelector_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioInputSelector_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioInputSelector_GetSelection(This,pnIdSelected) \ + ( (This)->lpVtbl -> GetSelection(This,pnIdSelected) ) + +#define IAudioInputSelector_SetSelection(This,nIdSelect,pguidEventContext) \ + ( (This)->lpVtbl -> SetSelection(This,nIdSelect,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioInputSelector_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioOutputSelector_INTERFACE_DEFINED__ +#define __IAudioOutputSelector_INTERFACE_DEFINED__ + +/* interface IAudioOutputSelector */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioOutputSelector; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BB515F69-94A7-429e-8B9C-271B3F11A3AB") + IAudioOutputSelector : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSelection( + /* [out] */ + __out UINT *pnIdSelected) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetSelection( + /* [in] */ + __in UINT nIdSelect, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioOutputSelectorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioOutputSelector * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioOutputSelector * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioOutputSelector * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSelection )( + IAudioOutputSelector * This, + /* [out] */ + __out UINT *pnIdSelected); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetSelection )( + IAudioOutputSelector * This, + /* [in] */ + __in UINT nIdSelect, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioOutputSelectorVtbl; + + interface IAudioOutputSelector + { + CONST_VTBL struct IAudioOutputSelectorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioOutputSelector_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioOutputSelector_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioOutputSelector_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioOutputSelector_GetSelection(This,pnIdSelected) \ + ( (This)->lpVtbl -> GetSelection(This,pnIdSelected) ) + +#define IAudioOutputSelector_SetSelection(This,nIdSelect,pguidEventContext) \ + ( (This)->lpVtbl -> SetSelection(This,nIdSelect,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioOutputSelector_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioMute_INTERFACE_DEFINED__ +#define __IAudioMute_INTERFACE_DEFINED__ + +/* interface IAudioMute */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioMute; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("DF45AEEA-B74A-4B6B-AFAD-2366B6AA012E") + IAudioMute : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetMute( + /* [in] */ + __in BOOL bMuted, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMute( + /* [out] */ + __out BOOL *pbMuted) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioMuteVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioMute * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioMute * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioMute * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetMute )( + IAudioMute * This, + /* [in] */ + __in BOOL bMuted, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetMute )( + IAudioMute * This, + /* [out] */ + __out BOOL *pbMuted); + + END_INTERFACE + } IAudioMuteVtbl; + + interface IAudioMute + { + CONST_VTBL struct IAudioMuteVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioMute_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioMute_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioMute_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioMute_SetMute(This,bMuted,pguidEventContext) \ + ( (This)->lpVtbl -> SetMute(This,bMuted,pguidEventContext) ) + +#define IAudioMute_GetMute(This,pbMuted) \ + ( (This)->lpVtbl -> GetMute(This,pbMuted) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioMute_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioBass_INTERFACE_DEFINED__ +#define __IAudioBass_INTERFACE_DEFINED__ + +/* interface IAudioBass */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioBass; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A2B1A1D9-4DB3-425D-A2B2-BD335CB3E2E5") + IAudioBass : public IPerChannelDbLevel + { + public: + }; + +#else /* C style interface */ + + typedef struct IAudioBassVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioBass * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioBass * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioBass * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioBass * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevelRange )( + IAudioBass * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IAudioBass * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevel )( + IAudioBass * This, + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelUniform )( + IAudioBass * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelAllChannels )( + IAudioBass * This, + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioBassVtbl; + + interface IAudioBass + { + CONST_VTBL struct IAudioBassVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioBass_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioBass_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioBass_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioBass_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IAudioBass_GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) \ + ( (This)->lpVtbl -> GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) ) + +#define IAudioBass_GetLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevelDB) ) + +#define IAudioBass_SetLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IAudioBass_SetLevelUniform(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelUniform(This,fLevelDB,pguidEventContext) ) + +#define IAudioBass_SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioBass_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioMidrange_INTERFACE_DEFINED__ +#define __IAudioMidrange_INTERFACE_DEFINED__ + +/* interface IAudioMidrange */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioMidrange; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("5E54B6D7-B44B-40D9-9A9E-E691D9CE6EDF") + IAudioMidrange : public IPerChannelDbLevel + { + public: + }; + +#else /* C style interface */ + + typedef struct IAudioMidrangeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioMidrange * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioMidrange * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioMidrange * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioMidrange * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevelRange )( + IAudioMidrange * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IAudioMidrange * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevel )( + IAudioMidrange * This, + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelUniform )( + IAudioMidrange * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelAllChannels )( + IAudioMidrange * This, + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioMidrangeVtbl; + + interface IAudioMidrange + { + CONST_VTBL struct IAudioMidrangeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioMidrange_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioMidrange_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioMidrange_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioMidrange_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IAudioMidrange_GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) \ + ( (This)->lpVtbl -> GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) ) + +#define IAudioMidrange_GetLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevelDB) ) + +#define IAudioMidrange_SetLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IAudioMidrange_SetLevelUniform(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelUniform(This,fLevelDB,pguidEventContext) ) + +#define IAudioMidrange_SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioMidrange_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioTreble_INTERFACE_DEFINED__ +#define __IAudioTreble_INTERFACE_DEFINED__ + +/* interface IAudioTreble */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioTreble; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0A717812-694E-4907-B74B-BAFA5CFDCA7B") + IAudioTreble : public IPerChannelDbLevel + { + public: + }; + +#else /* C style interface */ + + typedef struct IAudioTrebleVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioTreble * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioTreble * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioTreble * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioTreble * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevelRange )( + IAudioTreble * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfMinLevelDB, + /* [out] */ + __out float *pfMaxLevelDB, + /* [out] */ + __out float *pfStepping); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IAudioTreble * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevel )( + IAudioTreble * This, + /* [in] */ + __in UINT nChannel, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelUniform )( + IAudioTreble * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetLevelAllChannels )( + IAudioTreble * This, + /* [size_is][in] */ + __in_ecount(cChannels) float aLevelsDB[ ], + /* [in] */ + __in ULONG cChannels, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioTrebleVtbl; + + interface IAudioTreble + { + CONST_VTBL struct IAudioTrebleVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioTreble_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioTreble_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioTreble_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioTreble_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IAudioTreble_GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) \ + ( (This)->lpVtbl -> GetLevelRange(This,nChannel,pfMinLevelDB,pfMaxLevelDB,pfStepping) ) + +#define IAudioTreble_GetLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevelDB) ) + +#define IAudioTreble_SetLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IAudioTreble_SetLevelUniform(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelUniform(This,fLevelDB,pguidEventContext) ) + +#define IAudioTreble_SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) \ + ( (This)->lpVtbl -> SetLevelAllChannels(This,aLevelsDB,cChannels,pguidEventContext) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioTreble_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioAutoGainControl_INTERFACE_DEFINED__ +#define __IAudioAutoGainControl_INTERFACE_DEFINED__ + +/* interface IAudioAutoGainControl */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioAutoGainControl; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("85401FD4-6DE4-4b9d-9869-2D6753A82F3C") + IAudioAutoGainControl : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetEnabled( + /* [out] */ + __out BOOL *pbEnabled) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetEnabled( + /* [in] */ + __in BOOL bEnable, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioAutoGainControlVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioAutoGainControl * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioAutoGainControl * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioAutoGainControl * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetEnabled )( + IAudioAutoGainControl * This, + /* [out] */ + __out BOOL *pbEnabled); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetEnabled )( + IAudioAutoGainControl * This, + /* [in] */ + __in BOOL bEnable, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IAudioAutoGainControlVtbl; + + interface IAudioAutoGainControl + { + CONST_VTBL struct IAudioAutoGainControlVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioAutoGainControl_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioAutoGainControl_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioAutoGainControl_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioAutoGainControl_GetEnabled(This,pbEnabled) \ + ( (This)->lpVtbl -> GetEnabled(This,pbEnabled) ) + +#define IAudioAutoGainControl_SetEnabled(This,bEnable,pguidEventContext) \ + ( (This)->lpVtbl -> SetEnabled(This,bEnable,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioAutoGainControl_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioPeakMeter_INTERFACE_DEFINED__ +#define __IAudioPeakMeter_INTERFACE_DEFINED__ + +/* interface IAudioPeakMeter */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioPeakMeter; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("DD79923C-0599-45e0-B8B6-C8DF7DB6E796") + IAudioPeakMeter : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetChannelCount( + /* [out] */ + __out UINT *pcChannels) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetLevel( + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevel) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioPeakMeterVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioPeakMeter * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioPeakMeter * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioPeakMeter * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioPeakMeter * This, + /* [out] */ + __out UINT *pcChannels); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLevel )( + IAudioPeakMeter * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevel); + + END_INTERFACE + } IAudioPeakMeterVtbl; + + interface IAudioPeakMeter + { + CONST_VTBL struct IAudioPeakMeterVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioPeakMeter_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioPeakMeter_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioPeakMeter_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioPeakMeter_GetChannelCount(This,pcChannels) \ + ( (This)->lpVtbl -> GetChannelCount(This,pcChannels) ) + +#define IAudioPeakMeter_GetLevel(This,nChannel,pfLevel) \ + ( (This)->lpVtbl -> GetLevel(This,nChannel,pfLevel) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioPeakMeter_INTERFACE_DEFINED__ */ + + +#ifndef __IDeviceSpecificProperty_INTERFACE_DEFINED__ +#define __IDeviceSpecificProperty_INTERFACE_DEFINED__ + +/* interface IDeviceSpecificProperty */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IDeviceSpecificProperty; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3B22BCBF-2586-4af0-8583-205D391B807C") + IDeviceSpecificProperty : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetType( + /* [out] */ + __deref_out VARTYPE *pVType) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetValue( + /* [out] */ + __out void *pvValue, + /* [out][in] */ + __inout DWORD *pcbValue) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetValue( + /* [in] */ + __in void *pvValue, + /* [in] */ DWORD cbValue, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Get4BRange( + /* [out] */ + __deref_out LONG *plMin, + /* [out] */ + __deref_out LONG *plMax, + /* [out] */ + __deref_out LONG *plStepping) = 0; + + }; + +#else /* C style interface */ + + typedef struct IDeviceSpecificPropertyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeviceSpecificProperty * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeviceSpecificProperty * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IDeviceSpecificProperty * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetType )( + IDeviceSpecificProperty * This, + /* [out] */ + __deref_out VARTYPE *pVType); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetValue )( + IDeviceSpecificProperty * This, + /* [out] */ + __out void *pvValue, + /* [out][in] */ + __inout DWORD *pcbValue); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetValue )( + IDeviceSpecificProperty * This, + /* [in] */ + __in void *pvValue, + /* [in] */ DWORD cbValue, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Get4BRange )( + IDeviceSpecificProperty * This, + /* [out] */ + __deref_out LONG *plMin, + /* [out] */ + __deref_out LONG *plMax, + /* [out] */ + __deref_out LONG *plStepping); + + END_INTERFACE + } IDeviceSpecificPropertyVtbl; + + interface IDeviceSpecificProperty + { + CONST_VTBL struct IDeviceSpecificPropertyVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeviceSpecificProperty_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeviceSpecificProperty_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeviceSpecificProperty_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeviceSpecificProperty_GetType(This,pVType) \ + ( (This)->lpVtbl -> GetType(This,pVType) ) + +#define IDeviceSpecificProperty_GetValue(This,pvValue,pcbValue) \ + ( (This)->lpVtbl -> GetValue(This,pvValue,pcbValue) ) + +#define IDeviceSpecificProperty_SetValue(This,pvValue,cbValue,pguidEventContext) \ + ( (This)->lpVtbl -> SetValue(This,pvValue,cbValue,pguidEventContext) ) + +#define IDeviceSpecificProperty_Get4BRange(This,plMin,plMax,plStepping) \ + ( (This)->lpVtbl -> Get4BRange(This,plMin,plMax,plStepping) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeviceSpecificProperty_INTERFACE_DEFINED__ */ + + +#ifndef __IKsFormatSupport_INTERFACE_DEFINED__ +#define __IKsFormatSupport_INTERFACE_DEFINED__ + +/* interface IKsFormatSupport */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IKsFormatSupport; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3CB4A69D-BB6F-4D2B-95B7-452D2C155DB5") + IKsFormatSupport : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IsFormatSupported( + /* [size_is][in] */ PKSDATAFORMAT pKsFormat, + /* [in] */ + __in DWORD cbFormat, + /* [out] */ + __out BOOL *pbSupported) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDevicePreferredFormat( + /* [out] */ PKSDATAFORMAT *ppKsFormat) = 0; + + }; + +#else /* C style interface */ + + typedef struct IKsFormatSupportVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IKsFormatSupport * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IKsFormatSupport * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IKsFormatSupport * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *IsFormatSupported )( + IKsFormatSupport * This, + /* [size_is][in] */ PKSDATAFORMAT pKsFormat, + /* [in] */ + __in DWORD cbFormat, + /* [out] */ + __out BOOL *pbSupported); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDevicePreferredFormat )( + IKsFormatSupport * This, + /* [out] */ PKSDATAFORMAT *ppKsFormat); + + END_INTERFACE + } IKsFormatSupportVtbl; + + interface IKsFormatSupport + { + CONST_VTBL struct IKsFormatSupportVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IKsFormatSupport_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IKsFormatSupport_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IKsFormatSupport_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IKsFormatSupport_IsFormatSupported(This,pKsFormat,cbFormat,pbSupported) \ + ( (This)->lpVtbl -> IsFormatSupported(This,pKsFormat,cbFormat,pbSupported) ) + +#define IKsFormatSupport_GetDevicePreferredFormat(This,ppKsFormat) \ + ( (This)->lpVtbl -> GetDevicePreferredFormat(This,ppKsFormat) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IKsFormatSupport_INTERFACE_DEFINED__ */ + + +#ifndef __IKsJackDescription_INTERFACE_DEFINED__ +#define __IKsJackDescription_INTERFACE_DEFINED__ + +/* interface IKsJackDescription */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IKsJackDescription; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4509F757-2D46-4637-8E62-CE7DB944F57B") + IKsJackDescription : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetJackCount( + /* [out] */ + __out UINT *pcJacks) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetJackDescription( + /* [in] */ UINT nJack, + /* [out] */ + __out KSJACK_DESCRIPTION *pDescription) = 0; + + }; + +#else /* C style interface */ + + typedef struct IKsJackDescriptionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IKsJackDescription * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IKsJackDescription * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IKsJackDescription * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetJackCount )( + IKsJackDescription * This, + /* [out] */ + __out UINT *pcJacks); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetJackDescription )( + IKsJackDescription * This, + /* [in] */ UINT nJack, + /* [out] */ + __out KSJACK_DESCRIPTION *pDescription); + + END_INTERFACE + } IKsJackDescriptionVtbl; + + interface IKsJackDescription + { + CONST_VTBL struct IKsJackDescriptionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IKsJackDescription_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IKsJackDescription_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IKsJackDescription_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IKsJackDescription_GetJackCount(This,pcJacks) \ + ( (This)->lpVtbl -> GetJackCount(This,pcJacks) ) + +#define IKsJackDescription_GetJackDescription(This,nJack,pDescription) \ + ( (This)->lpVtbl -> GetJackDescription(This,nJack,pDescription) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IKsJackDescription_INTERFACE_DEFINED__ */ + + +#ifndef __IPartsList_INTERFACE_DEFINED__ +#define __IPartsList_INTERFACE_DEFINED__ + +/* interface IPartsList */ +/* [object][unique][helpstring][uuid][local] */ + + +EXTERN_C const IID IID_IPartsList; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("6DAA848C-5EB0-45CC-AEA5-998A2CDA1FFB") + IPartsList : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ + __out UINT *pCount) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetPart( + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IPart **ppPart) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPartsListVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPartsList * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPartsList * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPartsList * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPartsList * This, + /* [out] */ + __out UINT *pCount); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetPart )( + IPartsList * This, + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IPart **ppPart); + + END_INTERFACE + } IPartsListVtbl; + + interface IPartsList + { + CONST_VTBL struct IPartsListVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPartsList_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPartsList_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPartsList_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPartsList_GetCount(This,pCount) \ + ( (This)->lpVtbl -> GetCount(This,pCount) ) + +#define IPartsList_GetPart(This,nIndex,ppPart) \ + ( (This)->lpVtbl -> GetPart(This,nIndex,ppPart) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPartsList_INTERFACE_DEFINED__ */ + + +#ifndef __IPart_INTERFACE_DEFINED__ +#define __IPart_INTERFACE_DEFINED__ + +/* interface IPart */ +/* [object][unique][helpstring][uuid][local] */ + + +EXTERN_C const IID IID_IPart; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("AE2DE0E4-5BCA-4F2D-AA46-5D13F8FDB3A9") + IPart : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetName( + /* [out] */ + __deref_out LPWSTR *ppwstrName) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetLocalId( + /* [out] */ + __out UINT *pnId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetGlobalId( + /* [out] */ + __deref_out LPWSTR *ppwstrGlobalId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetPartType( + /* [out] */ + __out PartType *pPartType) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSubType( + /* [out] */ GUID *pSubType) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetControlInterfaceCount( + /* [out] */ + __out UINT *pCount) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetControlInterface( + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IControlInterface **ppInterfaceDesc) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnumPartsIncoming( + /* [out] */ + __out IPartsList **ppParts) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnumPartsOutgoing( + /* [out] */ + __out IPartsList **ppParts) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetTopologyObject( + /* [out] */ + __out IDeviceTopology **ppTopology) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Activate( + /* [in] */ + __in DWORD dwClsContext, + /* [in] */ + __in REFIID refiid, + /* [iid_is][out] */ + __out_opt void **ppvObject) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RegisterControlChangeCallback( + /* [in] */ + __in REFGUID riid, + /* [in] */ + __in IControlChangeNotify *pNotify) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE UnregisterControlChangeCallback( + /* [in] */ + __in IControlChangeNotify *pNotify) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPartVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPart * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPart * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPart * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetName )( + IPart * This, + /* [out] */ + __deref_out LPWSTR *ppwstrName); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetLocalId )( + IPart * This, + /* [out] */ + __out UINT *pnId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetGlobalId )( + IPart * This, + /* [out] */ + __deref_out LPWSTR *ppwstrGlobalId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetPartType )( + IPart * This, + /* [out] */ + __out PartType *pPartType); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSubType )( + IPart * This, + /* [out] */ GUID *pSubType); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetControlInterfaceCount )( + IPart * This, + /* [out] */ + __out UINT *pCount); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetControlInterface )( + IPart * This, + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IControlInterface **ppInterfaceDesc); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnumPartsIncoming )( + IPart * This, + /* [out] */ + __out IPartsList **ppParts); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnumPartsOutgoing )( + IPart * This, + /* [out] */ + __out IPartsList **ppParts); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetTopologyObject )( + IPart * This, + /* [out] */ + __out IDeviceTopology **ppTopology); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Activate )( + IPart * This, + /* [in] */ + __in DWORD dwClsContext, + /* [in] */ + __in REFIID refiid, + /* [iid_is][out] */ + __out_opt void **ppvObject); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *RegisterControlChangeCallback )( + IPart * This, + /* [in] */ + __in REFGUID riid, + /* [in] */ + __in IControlChangeNotify *pNotify); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *UnregisterControlChangeCallback )( + IPart * This, + /* [in] */ + __in IControlChangeNotify *pNotify); + + END_INTERFACE + } IPartVtbl; + + interface IPart + { + CONST_VTBL struct IPartVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPart_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPart_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPart_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPart_GetName(This,ppwstrName) \ + ( (This)->lpVtbl -> GetName(This,ppwstrName) ) + +#define IPart_GetLocalId(This,pnId) \ + ( (This)->lpVtbl -> GetLocalId(This,pnId) ) + +#define IPart_GetGlobalId(This,ppwstrGlobalId) \ + ( (This)->lpVtbl -> GetGlobalId(This,ppwstrGlobalId) ) + +#define IPart_GetPartType(This,pPartType) \ + ( (This)->lpVtbl -> GetPartType(This,pPartType) ) + +#define IPart_GetSubType(This,pSubType) \ + ( (This)->lpVtbl -> GetSubType(This,pSubType) ) + +#define IPart_GetControlInterfaceCount(This,pCount) \ + ( (This)->lpVtbl -> GetControlInterfaceCount(This,pCount) ) + +#define IPart_GetControlInterface(This,nIndex,ppInterfaceDesc) \ + ( (This)->lpVtbl -> GetControlInterface(This,nIndex,ppInterfaceDesc) ) + +#define IPart_EnumPartsIncoming(This,ppParts) \ + ( (This)->lpVtbl -> EnumPartsIncoming(This,ppParts) ) + +#define IPart_EnumPartsOutgoing(This,ppParts) \ + ( (This)->lpVtbl -> EnumPartsOutgoing(This,ppParts) ) + +#define IPart_GetTopologyObject(This,ppTopology) \ + ( (This)->lpVtbl -> GetTopologyObject(This,ppTopology) ) + +#define IPart_Activate(This,dwClsContext,refiid,ppvObject) \ + ( (This)->lpVtbl -> Activate(This,dwClsContext,refiid,ppvObject) ) + +#define IPart_RegisterControlChangeCallback(This,riid,pNotify) \ + ( (This)->lpVtbl -> RegisterControlChangeCallback(This,riid,pNotify) ) + +#define IPart_UnregisterControlChangeCallback(This,pNotify) \ + ( (This)->lpVtbl -> UnregisterControlChangeCallback(This,pNotify) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPart_INTERFACE_DEFINED__ */ + + +#ifndef __IConnector_INTERFACE_DEFINED__ +#define __IConnector_INTERFACE_DEFINED__ + +/* interface IConnector */ +/* [object][unique][helpstring][uuid][local] */ + + +EXTERN_C const IID IID_IConnector; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("9c2c4058-23f5-41de-877a-df3af236a09e") + IConnector : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetType( + /* [out] */ + __out ConnectorType *pType) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDataFlow( + /* [out] */ + __out DataFlow *pFlow) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ConnectTo( + /* [in] */ + __in IConnector *pConnectTo) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Disconnect( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IsConnected( + /* [out] */ + __out BOOL *pbConnected) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetConnectedTo( + /* [out] */ + __out IConnector **ppConTo) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetConnectorIdConnectedTo( + /* [out] */ + __deref_out LPWSTR *ppwstrConnectorId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDeviceIdConnectedTo( + /* [out] */ + __deref_out LPWSTR *ppwstrDeviceId) = 0; + + }; + +#else /* C style interface */ + + typedef struct IConnectorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IConnector * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IConnector * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IConnector * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetType )( + IConnector * This, + /* [out] */ + __out ConnectorType *pType); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDataFlow )( + IConnector * This, + /* [out] */ + __out DataFlow *pFlow); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *ConnectTo )( + IConnector * This, + /* [in] */ + __in IConnector *pConnectTo); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Disconnect )( + IConnector * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *IsConnected )( + IConnector * This, + /* [out] */ + __out BOOL *pbConnected); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetConnectedTo )( + IConnector * This, + /* [out] */ + __out IConnector **ppConTo); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetConnectorIdConnectedTo )( + IConnector * This, + /* [out] */ + __deref_out LPWSTR *ppwstrConnectorId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDeviceIdConnectedTo )( + IConnector * This, + /* [out] */ + __deref_out LPWSTR *ppwstrDeviceId); + + END_INTERFACE + } IConnectorVtbl; + + interface IConnector + { + CONST_VTBL struct IConnectorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IConnector_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IConnector_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IConnector_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IConnector_GetType(This,pType) \ + ( (This)->lpVtbl -> GetType(This,pType) ) + +#define IConnector_GetDataFlow(This,pFlow) \ + ( (This)->lpVtbl -> GetDataFlow(This,pFlow) ) + +#define IConnector_ConnectTo(This,pConnectTo) \ + ( (This)->lpVtbl -> ConnectTo(This,pConnectTo) ) + +#define IConnector_Disconnect(This) \ + ( (This)->lpVtbl -> Disconnect(This) ) + +#define IConnector_IsConnected(This,pbConnected) \ + ( (This)->lpVtbl -> IsConnected(This,pbConnected) ) + +#define IConnector_GetConnectedTo(This,ppConTo) \ + ( (This)->lpVtbl -> GetConnectedTo(This,ppConTo) ) + +#define IConnector_GetConnectorIdConnectedTo(This,ppwstrConnectorId) \ + ( (This)->lpVtbl -> GetConnectorIdConnectedTo(This,ppwstrConnectorId) ) + +#define IConnector_GetDeviceIdConnectedTo(This,ppwstrDeviceId) \ + ( (This)->lpVtbl -> GetDeviceIdConnectedTo(This,ppwstrDeviceId) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IConnector_INTERFACE_DEFINED__ */ + + +#ifndef __ISubunit_INTERFACE_DEFINED__ +#define __ISubunit_INTERFACE_DEFINED__ + +/* interface ISubunit */ +/* [object][unique][helpstring][uuid][local] */ + + +EXTERN_C const IID IID_ISubunit; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("82149A85-DBA6-4487-86BB-EA8F7FEFCC71") + ISubunit : public IUnknown + { + public: + }; + +#else /* C style interface */ + + typedef struct ISubunitVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ISubunit * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ISubunit * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ISubunit * This); + + END_INTERFACE + } ISubunitVtbl; + + interface ISubunit + { + CONST_VTBL struct ISubunitVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ISubunit_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ISubunit_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ISubunit_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ISubunit_INTERFACE_DEFINED__ */ + + +#ifndef __IControlInterface_INTERFACE_DEFINED__ +#define __IControlInterface_INTERFACE_DEFINED__ + +/* interface IControlInterface */ +/* [object][unique][helpstring][uuid][local] */ + + +EXTERN_C const IID IID_IControlInterface; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("45d37c3f-5140-444a-ae24-400789f3cbf3") + IControlInterface : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetName( + /* [out] */ + __deref_out LPWSTR *ppwstrName) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetIID( + /* [out] */ + __out GUID *pIID) = 0; + + }; + +#else /* C style interface */ + + typedef struct IControlInterfaceVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IControlInterface * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IControlInterface * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IControlInterface * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetName )( + IControlInterface * This, + /* [out] */ + __deref_out LPWSTR *ppwstrName); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetIID )( + IControlInterface * This, + /* [out] */ + __out GUID *pIID); + + END_INTERFACE + } IControlInterfaceVtbl; + + interface IControlInterface + { + CONST_VTBL struct IControlInterfaceVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IControlInterface_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IControlInterface_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IControlInterface_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IControlInterface_GetName(This,ppwstrName) \ + ( (This)->lpVtbl -> GetName(This,ppwstrName) ) + +#define IControlInterface_GetIID(This,pIID) \ + ( (This)->lpVtbl -> GetIID(This,pIID) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IControlInterface_INTERFACE_DEFINED__ */ + + +#ifndef __IControlChangeNotify_INTERFACE_DEFINED__ +#define __IControlChangeNotify_INTERFACE_DEFINED__ + +/* interface IControlChangeNotify */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IControlChangeNotify; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A09513ED-C709-4d21-BD7B-5F34C47F3947") + IControlChangeNotify : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnNotify( + /* [in] */ + __in DWORD dwSenderProcessId, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext) = 0; + + }; + +#else /* C style interface */ + + typedef struct IControlChangeNotifyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IControlChangeNotify * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IControlChangeNotify * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IControlChangeNotify * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnNotify )( + IControlChangeNotify * This, + /* [in] */ + __in DWORD dwSenderProcessId, + /* [unique][in] */ + __in_opt LPCGUID pguidEventContext); + + END_INTERFACE + } IControlChangeNotifyVtbl; + + interface IControlChangeNotify + { + CONST_VTBL struct IControlChangeNotifyVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IControlChangeNotify_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IControlChangeNotify_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IControlChangeNotify_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IControlChangeNotify_OnNotify(This,dwSenderProcessId,pguidEventContext) \ + ( (This)->lpVtbl -> OnNotify(This,dwSenderProcessId,pguidEventContext) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IControlChangeNotify_INTERFACE_DEFINED__ */ + + +#ifndef __IDeviceTopology_INTERFACE_DEFINED__ +#define __IDeviceTopology_INTERFACE_DEFINED__ + +/* interface IDeviceTopology */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IDeviceTopology; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2A07407E-6497-4A18-9787-32F79BD0D98F") + IDeviceTopology : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetConnectorCount( + /* [out] */ + __out UINT *pCount) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetConnector( + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IConnector **ppConnector) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSubunitCount( + /* [out] */ + __out UINT *pCount) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSubunit( + /* [in] */ + __in UINT nIndex, + /* [out] */ + __deref_out ISubunit **ppSubunit) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetPartById( + /* [in] */ + __in UINT nId, + /* [out] */ + __deref_out IPart **ppPart) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDeviceId( + /* [out] */ + __deref_out LPWSTR *ppwstrDeviceId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetSignalPath( + /* [in] */ + __in IPart *pIPartFrom, + /* [in] */ + __in IPart *pIPartTo, + /* [in] */ + __in BOOL bRejectMixedPaths, + /* [out] */ + __deref_out IPartsList **ppParts) = 0; + + }; + +#else /* C style interface */ + + typedef struct IDeviceTopologyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeviceTopology * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeviceTopology * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IDeviceTopology * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetConnectorCount )( + IDeviceTopology * This, + /* [out] */ + __out UINT *pCount); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetConnector )( + IDeviceTopology * This, + /* [in] */ + __in UINT nIndex, + /* [out] */ + __out IConnector **ppConnector); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSubunitCount )( + IDeviceTopology * This, + /* [out] */ + __out UINT *pCount); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSubunit )( + IDeviceTopology * This, + /* [in] */ + __in UINT nIndex, + /* [out] */ + __deref_out ISubunit **ppSubunit); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetPartById )( + IDeviceTopology * This, + /* [in] */ + __in UINT nId, + /* [out] */ + __deref_out IPart **ppPart); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDeviceId )( + IDeviceTopology * This, + /* [out] */ + __deref_out LPWSTR *ppwstrDeviceId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetSignalPath )( + IDeviceTopology * This, + /* [in] */ + __in IPart *pIPartFrom, + /* [in] */ + __in IPart *pIPartTo, + /* [in] */ + __in BOOL bRejectMixedPaths, + /* [out] */ + __deref_out IPartsList **ppParts); + + END_INTERFACE + } IDeviceTopologyVtbl; + + interface IDeviceTopology + { + CONST_VTBL struct IDeviceTopologyVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeviceTopology_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeviceTopology_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeviceTopology_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeviceTopology_GetConnectorCount(This,pCount) \ + ( (This)->lpVtbl -> GetConnectorCount(This,pCount) ) + +#define IDeviceTopology_GetConnector(This,nIndex,ppConnector) \ + ( (This)->lpVtbl -> GetConnector(This,nIndex,ppConnector) ) + +#define IDeviceTopology_GetSubunitCount(This,pCount) \ + ( (This)->lpVtbl -> GetSubunitCount(This,pCount) ) + +#define IDeviceTopology_GetSubunit(This,nIndex,ppSubunit) \ + ( (This)->lpVtbl -> GetSubunit(This,nIndex,ppSubunit) ) + +#define IDeviceTopology_GetPartById(This,nId,ppPart) \ + ( (This)->lpVtbl -> GetPartById(This,nId,ppPart) ) + +#define IDeviceTopology_GetDeviceId(This,ppwstrDeviceId) \ + ( (This)->lpVtbl -> GetDeviceId(This,ppwstrDeviceId) ) + +#define IDeviceTopology_GetSignalPath(This,pIPartFrom,pIPartTo,bRejectMixedPaths,ppParts) \ + ( (This)->lpVtbl -> GetSignalPath(This,pIPartFrom,pIPartTo,bRejectMixedPaths,ppParts) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeviceTopology_INTERFACE_DEFINED__ */ + + + +#ifndef __DevTopologyLib_LIBRARY_DEFINED__ +#define __DevTopologyLib_LIBRARY_DEFINED__ + +/* library DevTopologyLib */ +/* [helpstring][version][uuid] */ + + + + + + + + + + + + + + + + +EXTERN_C const IID LIBID_DevTopologyLib; + +EXTERN_C const CLSID CLSID_DeviceTopology; + +#ifdef __cplusplus + +class DECLSPEC_UUID("1DF639D0-5EC1-47AA-9379-828DC1AA8C59") +DeviceTopology; +#endif +#endif /* __DevTopologyLib_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/endpointvolume.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/endpointvolume.h new file mode 100644 index 0000000000..81155d7a92 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/endpointvolume.h @@ -0,0 +1,620 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for endpointvolume.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __endpointvolume_h__ +#define __endpointvolume_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IAudioEndpointVolumeCallback_FWD_DEFINED__ +#define __IAudioEndpointVolumeCallback_FWD_DEFINED__ +typedef interface IAudioEndpointVolumeCallback IAudioEndpointVolumeCallback; +#endif /* __IAudioEndpointVolumeCallback_FWD_DEFINED__ */ + + +#ifndef __IAudioEndpointVolume_FWD_DEFINED__ +#define __IAudioEndpointVolume_FWD_DEFINED__ +typedef interface IAudioEndpointVolume IAudioEndpointVolume; +#endif /* __IAudioEndpointVolume_FWD_DEFINED__ */ + + +#ifndef __IAudioMeterInformation_FWD_DEFINED__ +#define __IAudioMeterInformation_FWD_DEFINED__ +typedef interface IAudioMeterInformation IAudioMeterInformation; +#endif /* __IAudioMeterInformation_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "unknwn.h" +#include "devicetopology.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_endpointvolume_0000_0000 */ +/* [local] */ + +typedef struct AUDIO_VOLUME_NOTIFICATION_DATA + { + GUID guidEventContext; + BOOL bMuted; + float fMasterVolume; + UINT nChannels; + float afChannelVolumes[ 1 ]; + } AUDIO_VOLUME_NOTIFICATION_DATA; + +typedef struct AUDIO_VOLUME_NOTIFICATION_DATA *PAUDIO_VOLUME_NOTIFICATION_DATA; + +#define ENDPOINT_HARDWARE_SUPPORT_VOLUME 0x00000001 +#define ENDPOINT_HARDWARE_SUPPORT_MUTE 0x00000002 +#define ENDPOINT_HARDWARE_SUPPORT_METER 0x00000004 + + +extern RPC_IF_HANDLE __MIDL_itf_endpointvolume_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_endpointvolume_0000_0000_v0_0_s_ifspec; + +#ifndef __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__ +#define __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__ + +/* interface IAudioEndpointVolumeCallback */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioEndpointVolumeCallback; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("657804FA-D6AD-4496-8A60-352752AF4F89") + IAudioEndpointVolumeCallback : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE OnNotify( + PAUDIO_VOLUME_NOTIFICATION_DATA pNotify) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioEndpointVolumeCallbackVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioEndpointVolumeCallback * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioEndpointVolumeCallback * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioEndpointVolumeCallback * This); + + HRESULT ( STDMETHODCALLTYPE *OnNotify )( + IAudioEndpointVolumeCallback * This, + PAUDIO_VOLUME_NOTIFICATION_DATA pNotify); + + END_INTERFACE + } IAudioEndpointVolumeCallbackVtbl; + + interface IAudioEndpointVolumeCallback + { + CONST_VTBL struct IAudioEndpointVolumeCallbackVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioEndpointVolumeCallback_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioEndpointVolumeCallback_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioEndpointVolumeCallback_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioEndpointVolumeCallback_OnNotify(This,pNotify) \ + ( (This)->lpVtbl -> OnNotify(This,pNotify) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioEndpointVolume_INTERFACE_DEFINED__ +#define __IAudioEndpointVolume_INTERFACE_DEFINED__ + +/* interface IAudioEndpointVolume */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioEndpointVolume; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("5CDF2C82-841E-4546-9722-0CF74078229A") + IAudioEndpointVolume : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RegisterControlChangeNotify( + /* [in] */ + __in IAudioEndpointVolumeCallback *pNotify) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE UnregisterControlChangeNotify( + /* [in] */ + __in IAudioEndpointVolumeCallback *pNotify) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetChannelCount( + /* [out] */ + __out UINT *pnChannelCount) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMasterVolumeLevel( + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMasterVolumeLevelScalar( + /* [in] */ + __in float fLevel, + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMasterVolumeLevel( + /* [out] */ + __out float *pfLevelDB) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMasterVolumeLevelScalar( + /* [out] */ + __out float *pfLevel) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetChannelVolumeLevel( + /* [in] */ + __in UINT nChannel, + float fLevelDB, + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetChannelVolumeLevelScalar( + /* [in] */ + __in UINT nChannel, + float fLevel, + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetChannelVolumeLevel( + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetChannelVolumeLevelScalar( + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevel) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetMute( + /* [in] */ + __in BOOL bMute, + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMute( + /* [out] */ + __out BOOL *pbMute) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetVolumeStepInfo( + /* [out] */ + __out UINT *pnStep, + /* [out] */ + __out UINT *pnStepCount) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VolumeStepUp( + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VolumeStepDown( + /* [unique][in] */ LPCGUID pguidEventContext) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryHardwareSupport( + /* [out] */ + __out DWORD *pdwHardwareSupportMask) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetVolumeRange( + /* [out] */ + __out float *pflVolumeMindB, + /* [out] */ + __out float *pflVolumeMaxdB, + /* [out] */ + __out float *pflVolumeIncrementdB) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioEndpointVolumeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioEndpointVolume * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioEndpointVolume * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioEndpointVolume * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *RegisterControlChangeNotify )( + IAudioEndpointVolume * This, + /* [in] */ + __in IAudioEndpointVolumeCallback *pNotify); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *UnregisterControlChangeNotify )( + IAudioEndpointVolume * This, + /* [in] */ + __in IAudioEndpointVolumeCallback *pNotify); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetChannelCount )( + IAudioEndpointVolume * This, + /* [out] */ + __out UINT *pnChannelCount); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMasterVolumeLevel )( + IAudioEndpointVolume * This, + /* [in] */ + __in float fLevelDB, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMasterVolumeLevelScalar )( + IAudioEndpointVolume * This, + /* [in] */ + __in float fLevel, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMasterVolumeLevel )( + IAudioEndpointVolume * This, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMasterVolumeLevelScalar )( + IAudioEndpointVolume * This, + /* [out] */ + __out float *pfLevel); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetChannelVolumeLevel )( + IAudioEndpointVolume * This, + /* [in] */ + __in UINT nChannel, + float fLevelDB, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetChannelVolumeLevelScalar )( + IAudioEndpointVolume * This, + /* [in] */ + __in UINT nChannel, + float fLevel, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetChannelVolumeLevel )( + IAudioEndpointVolume * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevelDB); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetChannelVolumeLevelScalar )( + IAudioEndpointVolume * This, + /* [in] */ + __in UINT nChannel, + /* [out] */ + __out float *pfLevel); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *SetMute )( + IAudioEndpointVolume * This, + /* [in] */ + __in BOOL bMute, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMute )( + IAudioEndpointVolume * This, + /* [out] */ + __out BOOL *pbMute); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetVolumeStepInfo )( + IAudioEndpointVolume * This, + /* [out] */ + __out UINT *pnStep, + /* [out] */ + __out UINT *pnStepCount); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VolumeStepUp )( + IAudioEndpointVolume * This, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VolumeStepDown )( + IAudioEndpointVolume * This, + /* [unique][in] */ LPCGUID pguidEventContext); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *QueryHardwareSupport )( + IAudioEndpointVolume * This, + /* [out] */ + __out DWORD *pdwHardwareSupportMask); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetVolumeRange )( + IAudioEndpointVolume * This, + /* [out] */ + __out float *pflVolumeMindB, + /* [out] */ + __out float *pflVolumeMaxdB, + /* [out] */ + __out float *pflVolumeIncrementdB); + + END_INTERFACE + } IAudioEndpointVolumeVtbl; + + interface IAudioEndpointVolume + { + CONST_VTBL struct IAudioEndpointVolumeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioEndpointVolume_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioEndpointVolume_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioEndpointVolume_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioEndpointVolume_RegisterControlChangeNotify(This,pNotify) \ + ( (This)->lpVtbl -> RegisterControlChangeNotify(This,pNotify) ) + +#define IAudioEndpointVolume_UnregisterControlChangeNotify(This,pNotify) \ + ( (This)->lpVtbl -> UnregisterControlChangeNotify(This,pNotify) ) + +#define IAudioEndpointVolume_GetChannelCount(This,pnChannelCount) \ + ( (This)->lpVtbl -> GetChannelCount(This,pnChannelCount) ) + +#define IAudioEndpointVolume_SetMasterVolumeLevel(This,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetMasterVolumeLevel(This,fLevelDB,pguidEventContext) ) + +#define IAudioEndpointVolume_SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext) \ + ( (This)->lpVtbl -> SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext) ) + +#define IAudioEndpointVolume_GetMasterVolumeLevel(This,pfLevelDB) \ + ( (This)->lpVtbl -> GetMasterVolumeLevel(This,pfLevelDB) ) + +#define IAudioEndpointVolume_GetMasterVolumeLevelScalar(This,pfLevel) \ + ( (This)->lpVtbl -> GetMasterVolumeLevelScalar(This,pfLevel) ) + +#define IAudioEndpointVolume_SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext) \ + ( (This)->lpVtbl -> SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext) ) + +#define IAudioEndpointVolume_SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext) \ + ( (This)->lpVtbl -> SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext) ) + +#define IAudioEndpointVolume_GetChannelVolumeLevel(This,nChannel,pfLevelDB) \ + ( (This)->lpVtbl -> GetChannelVolumeLevel(This,nChannel,pfLevelDB) ) + +#define IAudioEndpointVolume_GetChannelVolumeLevelScalar(This,nChannel,pfLevel) \ + ( (This)->lpVtbl -> GetChannelVolumeLevelScalar(This,nChannel,pfLevel) ) + +#define IAudioEndpointVolume_SetMute(This,bMute,pguidEventContext) \ + ( (This)->lpVtbl -> SetMute(This,bMute,pguidEventContext) ) + +#define IAudioEndpointVolume_GetMute(This,pbMute) \ + ( (This)->lpVtbl -> GetMute(This,pbMute) ) + +#define IAudioEndpointVolume_GetVolumeStepInfo(This,pnStep,pnStepCount) \ + ( (This)->lpVtbl -> GetVolumeStepInfo(This,pnStep,pnStepCount) ) + +#define IAudioEndpointVolume_VolumeStepUp(This,pguidEventContext) \ + ( (This)->lpVtbl -> VolumeStepUp(This,pguidEventContext) ) + +#define IAudioEndpointVolume_VolumeStepDown(This,pguidEventContext) \ + ( (This)->lpVtbl -> VolumeStepDown(This,pguidEventContext) ) + +#define IAudioEndpointVolume_QueryHardwareSupport(This,pdwHardwareSupportMask) \ + ( (This)->lpVtbl -> QueryHardwareSupport(This,pdwHardwareSupportMask) ) + +#define IAudioEndpointVolume_GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB) \ + ( (This)->lpVtbl -> GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioEndpointVolume_INTERFACE_DEFINED__ */ + + +#ifndef __IAudioMeterInformation_INTERFACE_DEFINED__ +#define __IAudioMeterInformation_INTERFACE_DEFINED__ + +/* interface IAudioMeterInformation */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IAudioMeterInformation; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("C02216F6-8C67-4B5B-9D00-D008E73E0064") + IAudioMeterInformation : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPeakValue( + /* [out] */ float *pfPeak) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetMeteringChannelCount( + /* [out] */ + __out UINT *pnChannelCount) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetChannelsPeakValues( + /* [in] */ UINT32 u32ChannelCount, + /* [size_is][out] */ float *afPeakValues) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryHardwareSupport( + /* [out] */ + __out DWORD *pdwHardwareSupportMask) = 0; + + }; + +#else /* C style interface */ + + typedef struct IAudioMeterInformationVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IAudioMeterInformation * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IAudioMeterInformation * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IAudioMeterInformation * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetPeakValue )( + IAudioMeterInformation * This, + /* [out] */ float *pfPeak); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetMeteringChannelCount )( + IAudioMeterInformation * This, + /* [out] */ + __out UINT *pnChannelCount); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *GetChannelsPeakValues )( + IAudioMeterInformation * This, + /* [in] */ UINT32 u32ChannelCount, + /* [size_is][out] */ float *afPeakValues); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *QueryHardwareSupport )( + IAudioMeterInformation * This, + /* [out] */ + __out DWORD *pdwHardwareSupportMask); + + END_INTERFACE + } IAudioMeterInformationVtbl; + + interface IAudioMeterInformation + { + CONST_VTBL struct IAudioMeterInformationVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IAudioMeterInformation_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IAudioMeterInformation_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IAudioMeterInformation_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IAudioMeterInformation_GetPeakValue(This,pfPeak) \ + ( (This)->lpVtbl -> GetPeakValue(This,pfPeak) ) + +#define IAudioMeterInformation_GetMeteringChannelCount(This,pnChannelCount) \ + ( (This)->lpVtbl -> GetMeteringChannelCount(This,pnChannelCount) ) + +#define IAudioMeterInformation_GetChannelsPeakValues(This,u32ChannelCount,afPeakValues) \ + ( (This)->lpVtbl -> GetChannelsPeakValues(This,u32ChannelCount,afPeakValues) ) + +#define IAudioMeterInformation_QueryHardwareSupport(This,pdwHardwareSupportMask) \ + ( (This)->lpVtbl -> QueryHardwareSupport(This,pdwHardwareSupportMask) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IAudioMeterInformation_INTERFACE_DEFINED__ */ + + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/functiondiscoverykeys.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/functiondiscoverykeys.h new file mode 100644 index 0000000000..7e07292bf3 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/functiondiscoverykeys.h @@ -0,0 +1,255 @@ +#pragma once + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef DEFINE_API_PKEY +#include +#endif + +#include + +// FMTID_FD = {904b03a2-471d-423c-a584-f3483238a146} +DEFINE_GUID(FMTID_FD, 0x904b03a2, 0x471d, 0x423c, 0xa5, 0x84, 0xf3, 0x48, 0x32, 0x38, 0xa1, 0x46); +DEFINE_API_PKEY(PKEY_FD_Visibility, VisibilityFlags, 0x904b03a2, 0x471d, 0x423c, 0xa5, 0x84, 0xf3, 0x48, 0x32, 0x38, 0xa1, 0x46, 0x00000001); // VT_UINT +#define FD_Visibility_Default 0 +#define FD_Visibility_Hidden 1 + +// FMTID_Device = {78C34FC8-104A-4aca-9EA4-524D52996E57} +DEFINE_GUID(FMTID_Device, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57); + +DEFINE_API_PKEY(PKEY_Device_NotPresent, DeviceNotPresent , 0x904b03a2, 0x471d, 0x423c, 0xa5, 0x84, 0xf3, 0x48, 0x32, 0x38, 0xa1, 0x46, 0x00000002); // VT_UINT +DEFINE_API_PKEY(PKEY_Device_QueueSize, DeviceQueueSize , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000024); // VT_UI4 +DEFINE_API_PKEY(PKEY_Device_Status, DeviceStatus , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000025); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_Device_Comment, DeviceComment , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000026); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_Device_Model, DeviceModel , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000027); // VT_LPWSTR + +// Name: System.Device.BIOSVersion -- PKEY_Device_BIOSVersion +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) Legacy code may treat this as VT_BSTR. +// FormatID: EAEE7F1D-6A33-44D1-9441-5F46DEF23198, 9 +DEFINE_PROPERTYKEY(PKEY_Device_BIOSVersion, 0xEAEE7F1D, 0x6A33, 0x44D1, 0x94, 0x41, 0x5F, 0x46, 0xDE, 0xF2, 0x31, 0x98, 9); + +DEFINE_API_PKEY(PKEY_Write_Time, WriteTime , 0xf53b7e1c, 0x77e0, 0x4450, 0x8c, 0x5f, 0xa7, 0x6c, 0xc7, 0xfd, 0xe0, 0x58, 0x00000100); // VT_FILETIME + +#ifdef FD_XP +DEFINE_API_PKEY(PKEY_Device_InstanceId, DeviceInstanceId , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000100); // VT_LPWSTR +#endif +DEFINE_API_PKEY(PKEY_Device_Interface, DeviceInterface , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00000101); // VT_CLSID + +DEFINE_API_PKEY(PKEY_ExposedIIDs, ExposedIIDs , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00003002); // VT_VECTOR | VT_CLSID +DEFINE_API_PKEY(PKEY_ExposedCLSIDs, ExposedCLSIDs , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00003003); // VT_VECTOR | VT_CLSID +DEFINE_API_PKEY(PKEY_InstanceValidatorClsid,InstanceValidator , 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x00003004); // VT_CLSID + +// FMTID_WSD = {92506491-FF95-4724-A05A-5B81885A7C92} +DEFINE_GUID(FMTID_WSD, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92); + +DEFINE_API_PKEY(PKEY_WSD_AddressURI, WSD_AddressURI, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001000); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_WSD_Types, WSD_Types, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001001); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_WSD_Scopes, WSD_Scopes, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001002); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_WSD_MetadataVersion, WSD_MetadataVersion, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001003); //VT_UI8 +DEFINE_API_PKEY(PKEY_WSD_AppSeqInstanceID, WSD_AppSeqInstanceID, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001004); // VT_UI8 +DEFINE_API_PKEY(PKEY_WSD_AppSeqSessionID, WSD_AppSeqSessionID, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001005); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_WSD_AppSeqMessageNumber, WSD_AppSeqMessageNumber, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00001006); // VT_UI8 +DEFINE_API_PKEY(PKEY_WSD_XAddrs, WSD_XAddrs, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00002000); // VT_LPWSTR or VT_VECTOR | VT_LPWSTR + +DEFINE_API_PKEY(PKEY_WSD_MetadataClean, WSD_MetadataClean, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00000001); // VT_BOOL +DEFINE_API_PKEY(PKEY_WSD_ServiceInfo, WSD_ServiceInfo, 0x92506491, 0xFF95, 0x4724, 0xA0, 0x5A, 0x5B, 0x81, 0x88, 0x5A, 0x7C, 0x92, 0x00000002); // VT_VECTOR|VT_VARIANT (variants are VT_UNKNOWN) + +DEFINE_API_PKEY(PKEY_PUBSVCS_TYPE, PUBSVCS_TYPE, 0xF1B88AD3, 0x109C, 0x4FD2, 0xBA, 0x3F, 0x53, 0x5A, 0x76, 0x5F, 0x82, 0xF4, 0x00005001); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_PUBSVCS_SCOPE, PUBSVCS_SCOPE, 0x2AE2B567, 0xEECB, 0x4A3E, 0xB7, 0x53, 0x54, 0xC7, 0x25, 0x49, 0x43, 0x66, 0x00005002); // VT_LPWSTR | VT_VECTOR +DEFINE_API_PKEY(PKEY_PUBSVCS_METADATA, PUBSVCS_METADATA, 0x63C6D5B8, 0xF73A, 0x4ACA, 0x96, 0x7E, 0x0C, 0xC7, 0x87, 0xE0, 0xB5, 0x59, 0x00005003); // VT_LPWSTR +DEFINE_API_PKEY(PKEY_PUBSVCS_METADATA_VERSION, PUBSVCS_METADATA_VERSION, 0xC0C96C15, 0x1823, 0x4E5B, 0x93, 0x48, 0xE8, 0x25, 0x19, 0x92, 0x3F, 0x04, 0x00005004); // VT_UI8 +DEFINE_API_PKEY(PKEY_PUBSVCS_NETWORK_PROFILES_ALLOWED, PUBSVCS_NETWORK_PROFILES_ALLOWED, 0x63C6D5B8, 0xF73A, 0x4ACA, 0x96, 0x7E, 0x0C, 0xC7, 0x87, 0xE0, 0xB5, 0x59, 0x00005005); // VT_VECTOR | VT_LPWSTR +DEFINE_API_PKEY(PKEY_PUBSVCS_NETWORK_PROFILES_DENIED, PUBSVCS_NETWORK_PROFILES_DENIED, 0x63C6D5B8, 0xF73A, 0x4ACA, 0x96, 0x7E, 0x0C, 0xC7, 0x87, 0xE0, 0xB5, 0x59, 0x00005006); // VT_VECTOR | VT_LPWSTR +DEFINE_API_PKEY(PKEY_PUBSVCS_NETWORK_PROFILES_DEFAULT, PUBSVCS_NETWORK_PROFILES_DEFAULT, 0x63C6D5B8, 0xF73A, 0x4ACA, 0x96, 0x7E, 0x0C, 0xC7, 0x87, 0xE0, 0xB5, 0x59, 0x00005007); // VT_BOOL + +// FMTID_PNPX = {656A3BB3-ECC0-43FD-8477-4AE0404A96CD} +DEFINE_GUID(FMTID_PNPX, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD); + // from Discovery messages +DEFINE_PROPERTYKEY(PKEY_PNPX_GlobalIdentity, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001000); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_Types, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001001); // VT_LPWSTR | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_PNPX_Scopes, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001002); // VT_LPWSTR | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_PNPX_XAddrs, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001003); // VT_LPWSTR | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_PNPX_MetadataVersion, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001004); // VT_UI8 +DEFINE_PROPERTYKEY(PKEY_PNPX_ID, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001005); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_RootProxy, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001006); // VT_BOOL + + // for Directed Discovery +DEFINE_PROPERTYKEY(PKEY_PNPX_RemoteAddress, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00001006); // VT_LPWSTR + + // from ThisModel metadata +DEFINE_PROPERTYKEY(PKEY_PNPX_Manufacturer, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002000); // VT_LPWSTR (localizable) +DEFINE_PROPERTYKEY(PKEY_PNPX_ManufacturerUrl, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002001); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_ModelName, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002002); // VT_LPWSTR (localizable) +DEFINE_PROPERTYKEY(PKEY_PNPX_ModelNumber, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002003); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_ModelUrl, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002004); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_Upc, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002005); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_PresentationUrl, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00002006); // VT_LPWSTR + // from ThisDevice metadata +DEFINE_PROPERTYKEY(PKEY_PNPX_FriendlyName, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003000); // VT_LPWSTR (localizable) +DEFINE_PROPERTYKEY(PKEY_PNPX_FirmwareVersion, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003001); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_SerialNumber, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003002); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_DeviceCategory, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003004); // VT_LPWSTR | VT_VECTOR + // DeviceCategory values +#define PNPX_DEVICECATEGORY_COMPUTER L"Computers" +#define PNPX_DEVICECATEGORY_INPUTDEVICE L"Input" +#define PNPX_DEVICECATEGORY_PRINTER L"Printers" +#define PNPX_DEVICECATEGORY_SCANNER L"Scanners" +#define PNPX_DEVICECATEGORY_FAX L"FAX" +#define PNPX_DEVICECATEGORY_MFP L"MFP" +#define PNPX_DEVICECATEGORY_CAMERA L"Cameras" +#define PNPX_DEVICECATEGORY_STORAGE L"Storage" +#define PNPX_DEVICECATEGORY_NETWORK_INFRASTRUCTURE L"NetworkInfrastructure" +#define PNPX_DEVICECATEGORY_DISPLAYS L"Displays" +#define PNPX_DEVICECATEGORY_MULTIMEDIA_DEVICE L"MediaDevices" +#define PNPX_DEVICECATEGORY_GAMING_DEVICE L"Gaming" +#define PNPX_DEVICECATEGORY_TELEPHONE L"Phones" +#define PNPX_DEVICECATEGORY_HOME_AUTOMATION_SYSTEM L"HomeAutomation" +#define PNPX_DEVICECATEGORY_HOME_SECURITY_SYSTEM L"HomeSecurity" +#define PNPX_DEVICECATEGORY_OTHER L"Other" +DEFINE_PROPERTYKEY(PKEY_PNPX_DeviceCategory_Desc, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003005); // VT_LPWSTR | VT_VECTOR + +DEFINE_PROPERTYKEY(PKEY_PNPX_PhysicalAddress, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003006); // VT_UI1 | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_PNPX_NetworkInterfaceLuid, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003007); // VT_UI8 +DEFINE_PROPERTYKEY(PKEY_PNPX_NetworkInterfaceGuid, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003008); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_IpAddress, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003009); // VT_LPWSTR | VT_VECTOR + // from Relationship metadata +DEFINE_PROPERTYKEY(PKEY_PNPX_ServiceAddress, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00004000); // VT_LPWSTR | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_PNPX_ServiceId, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00004001); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_ServiceTypes, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00004002); // VT_LPWSTR | VT_VECTOR + // Association DB PKEYs +DEFINE_API_PKEY(PKEY_PNPX_Devnode, PnPXDevNode, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00000001); // VT_BOOL +DEFINE_API_PKEY(PKEY_PNPX_AssociationState, AssociationState, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00000002); // VT_UINT +DEFINE_API_PKEY(PKEY_PNPX_AssociatedInstanceId, AssociatedInstanceId, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00000003); // VT_LPWSTR + // for Computer Discovery +DEFINE_PROPERTYKEY(PKEY_PNPX_DomainName, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00005000); // VT_LPWSTR +// Use PKEY_ComputerName (propkey.h) DEFINE_PROPERTYKEY(PKEY_PNPX_MachineName, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00005001); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_PNPX_ShareName, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00005002); // VT_LPWSTR + + // SSDP Provider custom properties +DEFINE_PROPERTYKEY(PKEY_SSDP_AltLocationInfo, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00006000); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_SSDP_DevLifeTime, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00006001); // VT_UI4 +DEFINE_PROPERTYKEY(PKEY_SSDP_NetworkInterface, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00006002); // VT_BOOL + +// FMTID_PNPXDynamicProperty = {4FC5077E-B686-44BE-93E3-86CAFE368CCD} +DEFINE_GUID(FMTID_PNPXDynamicProperty, 0x4FC5077E, 0xB686, 0x44BE, 0x93, 0xE3, 0x86, 0xCA, 0xFE, 0x36, 0x8C, 0xCD); + +DEFINE_PROPERTYKEY(PKEY_PNPX_Installable, 0x4FC5077E, 0xB686, 0x44BE, 0x93, 0xE3, 0x86, 0xCA, 0xFE, 0x36, 0x8C, 0xCD, 0x00000001); // VT_BOOL +DEFINE_PROPERTYKEY(PKEY_PNPX_Associated, 0x4FC5077E, 0xB686, 0x44BE, 0x93, 0xE3, 0x86, 0xCA, 0xFE, 0x36, 0x8C, 0xCD, 0x00000002); // VT_BOOL +// PKEY_PNPX_Installed to be deprecated in Longhorn Server timeframe +// this PKEY really represents Associated state +#define PKEY_PNPX_Installed PKEY_PNPX_Associated // Deprecated! Please use PKEY_PNPX_Associated +DEFINE_PROPERTYKEY(PKEY_PNPX_CompatibleTypes, 0x4FC5077E, 0xB686, 0x44BE, 0x93, 0xE3, 0x86, 0xCA, 0xFE, 0x36, 0x8C, 0xCD, 0x00000003); // VT_LPWSTR | VT_VECTOR + + // WNET Provider properties +DEFINE_PROPERTYKEY(PKEY_WNET_Scope, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000001); // VT_UINT +DEFINE_PROPERTYKEY(PKEY_WNET_Type, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000002); // VT_UINT +DEFINE_PROPERTYKEY(PKEY_WNET_DisplayType, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000003); // VT_UINT +DEFINE_PROPERTYKEY(PKEY_WNET_Usage, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000004); // VT_UINT +DEFINE_PROPERTYKEY(PKEY_WNET_LocalName, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000005); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_WNET_RemoteName, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000006); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_WNET_Comment, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000007); // VT_LPWSTR +DEFINE_PROPERTYKEY(PKEY_WNET_Provider, 0xdebda43a, 0x37b3, 0x4383, 0x91, 0xE7, 0x44, 0x98, 0xda, 0x29, 0x95, 0xab, 0x00000008); // VT_LPWSTR + + + // WCN Provider properties + +DEFINE_PROPERTYKEY(PKEY_WCN_Version, 0x88190b80, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000001); // VT_UI1 +DEFINE_PROPERTYKEY(PKEY_WCN_RequestType, 0x88190b81, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000002); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_AuthType, 0x88190b82, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000003); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_EncryptType, 0x88190b83, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000004); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_ConnType, 0x88190b84, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000005); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_ConfigMethods, 0x88190b85, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000006); // VT_INT +// map WCN DeviceType to PKEY_PNPX_DeviceCategory +//DEFINE_PROPERTYKEY(PKEY_WCN_DeviceType, 0x88190b86, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000007); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_RfBand, 0x88190b87, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000008); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_AssocState, 0x88190b88, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x00000009); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_ConfigError, 0x88190b89, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000a); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_ConfigState, 0x88190b89, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000b); // VT_UI1 +DEFINE_PROPERTYKEY(PKEY_WCN_DevicePasswordId, 0x88190b89, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000c); // VT_INT +DEFINE_PROPERTYKEY(PKEY_WCN_OSVersion, 0x88190b89, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000d); // VT_UINT +DEFINE_PROPERTYKEY(PKEY_WCN_VendorExtension, 0x88190b8a, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000e); // VT_UI1 | VT_VECTOR +DEFINE_PROPERTYKEY(PKEY_WCN_RegistrarType, 0x88190b8b, 0x4684, 0x11da, 0xa2, 0x6a, 0x00, 0x02, 0xb3, 0x98, 0x8e, 0x81, 0x0000000f); // VT_INT + +//----------------------------------------------------------------------------- +// DriverPackage properties + +#define PKEY_DriverPackage_Model PKEY_DrvPkg_Model +#define PKEY_DriverPackage_VendorWebSite PKEY_DrvPkg_VendorWebSite +#define PKEY_DriverPackage_DetailedDescription PKEY_DrvPkg_DetailedDescription +#define PKEY_DriverPackage_DocumentationLink PKEY_DrvPkg_DocumentationLink +#define PKEY_DriverPackage_Icon PKEY_DrvPkg_Icon +#define PKEY_DriverPackage_BrandingIcon PKEY_DrvPkg_BrandingIcon + +//----------------------------------------------------------------------------- +// Hardware properties + +DEFINE_PROPERTYKEY(PKEY_Hardware_Devinst, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 4097); + +// Name: System.Hardware.DisplayAttribute -- PKEY_Hardware_DisplayAttribute +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 5 +DEFINE_PROPERTYKEY(PKEY_Hardware_DisplayAttribute, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 5); + +// Name: System.Hardware.DriverDate -- PKEY_Hardware_DriverDate +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 11 +DEFINE_PROPERTYKEY(PKEY_Hardware_DriverDate, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 11); + +// Name: System.Hardware.DriverProvider -- PKEY_Hardware_DriverProvider +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 10 +DEFINE_PROPERTYKEY(PKEY_Hardware_DriverProvider, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 10); + +// Name: System.Hardware.DriverVersion -- PKEY_Hardware_DriverVersion +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 9 +DEFINE_PROPERTYKEY(PKEY_Hardware_DriverVersion, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 9); + +// Name: System.Hardware.Function -- PKEY_Hardware_Function +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 4099 +DEFINE_PROPERTYKEY(PKEY_Hardware_Function, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 4099); + +// Name: System.Hardware.Icon -- PKEY_Hardware_Icon +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 3 +DEFINE_PROPERTYKEY(PKEY_Hardware_Icon, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 3); + +// Name: System.Hardware.Image -- PKEY_Hardware_Image +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 4098 +DEFINE_PROPERTYKEY(PKEY_Hardware_Image, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 4098); + +// Name: System.Hardware.Manufacturer -- PKEY_Hardware_Manufacturer +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 6 +DEFINE_PROPERTYKEY(PKEY_Hardware_Manufacturer, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 6); + +// Name: System.Hardware.Model -- PKEY_Hardware_Model +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 7 +DEFINE_PROPERTYKEY(PKEY_Hardware_Model, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 7); + +// Name: System.Hardware.Name -- PKEY_Hardware_Name +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 2 +DEFINE_PROPERTYKEY(PKEY_Hardware_Name, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 2); + +// Name: System.Hardware.SerialNumber -- PKEY_Hardware_SerialNumber +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 8 +DEFINE_PROPERTYKEY(PKEY_Hardware_SerialNumber, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 8); + +// Name: System.Hardware.ShellAttributes -- PKEY_Hardware_ShellAttributes +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 4100 +DEFINE_PROPERTYKEY(PKEY_Hardware_ShellAttributes, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 4100); + +// Name: System.Hardware.Status -- PKEY_Hardware_Status +// Type: Unspecified -- VT_NULL +// FormatID: 5EAF3EF2-E0CA-4598-BF06-71ED1D9DD953, 4096 +DEFINE_PROPERTYKEY(PKEY_Hardware_Status, 0x5EAF3EF2, 0xE0CA, 0x4598, 0xBF, 0x06, 0x71, 0xED, 0x1D, 0x9D, 0xD9, 0x53, 4096); + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/ks.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ks.h new file mode 100644 index 0000000000..2261e6c273 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ks.h @@ -0,0 +1,3666 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef _KS_ +#define _KS_ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef __MINGW_EXTENSION +#if defined(__GNUC__) || defined(__GNUG__) +#define __MINGW_EXTENSION __extension__ +#else +#define __MINGW_EXTENSION +#endif +#endif + +#ifdef __TCS__ +#define _KS_NO_ANONYMOUS_STRUCTURES_ 1 +#endif + +#ifdef _KS_NO_ANONYMOUS_STRUCTURES_ +#define _KS_ANON_STRUCT(X) struct X +#else +#define _KS_ANON_STRUCT(X) __MINGW_EXTENSION struct +#endif + +#ifndef _NTRTL_ +#ifndef DEFINE_GUIDEX +#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name +#endif +#ifndef STATICGUIDOF +#define STATICGUIDOF(guid) STATIC_##guid +#endif +#endif /* _NTRTL_ */ + +#ifndef SIZEOF_ARRAY +#define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0])) +#endif + +#define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n) +#define DEFINE_GUIDNAMED(n) n + +#define STATIC_GUID_NULL \ + 0x00000000L,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + +DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000",GUID_NULL); +#define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) + +#define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS,0x000,METHOD_NEITHER,FILE_ANY_ACCESS) +#define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x001,METHOD_NEITHER,FILE_ANY_ACCESS) +#define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x002,METHOD_NEITHER,FILE_ANY_ACCESS) +#define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS,0x003,METHOD_NEITHER,FILE_ANY_ACCESS) +#define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS,0x004,METHOD_NEITHER,FILE_WRITE_ACCESS) +#define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS,0x005,METHOD_NEITHER,FILE_READ_ACCESS) +#define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS,0x006,METHOD_NEITHER,FILE_ANY_ACCESS) + +typedef enum { + KSRESET_BEGIN, + KSRESET_END +} KSRESET; + +typedef enum { + KSSTATE_STOP, + KSSTATE_ACQUIRE, + KSSTATE_PAUSE, + KSSTATE_RUN +} KSSTATE,*PKSSTATE; + +#define KSPRIORITY_LOW 0x00000001 +#define KSPRIORITY_NORMAL 0x40000000 +#define KSPRIORITY_HIGH 0x80000000 +#define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF + +typedef struct { + ULONG PriorityClass; + ULONG PrioritySubClass; +} KSPRIORITY,*PKSPRIORITY; + +typedef struct { + __MINGW_EXTENSION union { + _KS_ANON_STRUCT(_IDENTIFIER) + { + GUID Set; + ULONG Id; + ULONG Flags; + }; + LONGLONG Alignment; + }; +} KSIDENTIFIER,*PKSIDENTIFIER; + +typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT; + +#define KSMETHOD_TYPE_NONE 0x00000000 +#define KSMETHOD_TYPE_READ 0x00000001 +#define KSMETHOD_TYPE_WRITE 0x00000002 +#define KSMETHOD_TYPE_MODIFY 0x00000003 +#define KSMETHOD_TYPE_SOURCE 0x00000004 + +#define KSMETHOD_TYPE_SEND 0x00000001 +#define KSMETHOD_TYPE_SETSUPPORT 0x00000100 +#define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 + +#define KSMETHOD_TYPE_TOPOLOGY 0x10000000 + +#define KSPROPERTY_TYPE_GET 0x00000001 +#define KSPROPERTY_TYPE_SET 0x00000002 +#define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 +#define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 +#define KSPROPERTY_TYPE_RELATIONS 0x00000400 +#define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 +#define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 +#define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 +#define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 +#define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 +#define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 + +#define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 + +typedef struct { + KSPROPERTY Property; + ULONG NodeId; + ULONG Reserved; +} KSP_NODE,*PKSP_NODE; + +typedef struct { + KSMETHOD Method; + ULONG NodeId; + ULONG Reserved; +} KSM_NODE,*PKSM_NODE; + +typedef struct { + KSEVENT Event; + ULONG NodeId; + ULONG Reserved; +} KSE_NODE,*PKSE_NODE; + +#define STATIC_KSPROPTYPESETID_General \ + 0x97E99BA0L,0xBDEA,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000",KSPROPTYPESETID_General); +#define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) + +typedef struct { + ULONG Size; + ULONG Count; +} KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM; + +typedef struct { + ULONG AccessFlags; + ULONG DescriptionSize; + KSIDENTIFIER PropTypeSet; + ULONG MembersListCount; + ULONG Reserved; +} KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION; + +#define KSPROPERTY_MEMBER_RANGES 0x00000001 +#define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 +#define KSPROPERTY_MEMBER_VALUES 0x00000003 + +#define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 +#define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002 +#define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004 + +typedef struct { + ULONG MembersFlags; + ULONG MembersSize; + ULONG MembersCount; + ULONG Flags; +} KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER; + +typedef union { + _KS_ANON_STRUCT(_SIGNED) + { + LONG SignedMinimum; + LONG SignedMaximum; + }; + _KS_ANON_STRUCT(_UNSIGNED) + { + ULONG UnsignedMinimum; + ULONG UnsignedMaximum; + }; +} KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG; + +typedef union { + _KS_ANON_STRUCT(_SIGNED64) + { + LONGLONG SignedMinimum; + LONGLONG SignedMaximum; + }; + _KS_ANON_STRUCT(_UNSIGNED64) + { + DWORDLONG UnsignedMinimum; + DWORDLONG UnsignedMaximum; + }; +} KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG; + +typedef struct { + ULONG SteppingDelta; + ULONG Reserved; + KSPROPERTY_BOUNDS_LONG Bounds; +} KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG; + +typedef struct { + DWORDLONG SteppingDelta; + KSPROPERTY_BOUNDS_LONGLONG Bounds; +} KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG; + +#if defined(_NTDDK_) +typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; +typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; +typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE; +typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; +typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; +typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; +typedef struct _KSFILTER KSFILTER, *PKSFILTER; +typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; +typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH; +typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; +typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; +typedef struct _KSPIN KSPIN, *PKSPIN; +typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; +typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; +typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER; +typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING; +typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN; +typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; +#endif /* _NTDDK_ */ + +typedef PVOID PKSWORKER; + + +typedef struct { + ULONG NotificationType; + __MINGW_EXTENSION union { + struct { + HANDLE Event; + ULONG_PTR Reserved[2]; + } EventHandle; + struct { + HANDLE Semaphore; + ULONG Reserved; + LONG Adjustment; + } SemaphoreHandle; +#if defined(_NTDDK_) + struct { + PVOID Event; + KPRIORITY Increment; + ULONG_PTR Reserved; + } EventObject; + struct { + PVOID Semaphore; + KPRIORITY Increment; + LONG Adjustment; + } SemaphoreObject; + struct { + PKDPC Dpc; + ULONG ReferenceCount; + ULONG_PTR Reserved; + } Dpc; + struct { + PWORK_QUEUE_ITEM WorkQueueItem; + WORK_QUEUE_TYPE WorkQueueType; + ULONG_PTR Reserved; + } WorkItem; + struct { + PWORK_QUEUE_ITEM WorkQueueItem; + PKSWORKER KsWorkerObject; + ULONG_PTR Reserved; + } KsWorkItem; +#endif /* _NTDDK_ */ + struct { + PVOID Unused; + LONG_PTR Alignment[2]; + } Alignment; + }; +} KSEVENTDATA,*PKSEVENTDATA; + +#define KSEVENTF_EVENT_HANDLE 0x00000001 +#define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 +#if defined(_NTDDK_) +#define KSEVENTF_EVENT_OBJECT 0x00000004 +#define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 +#define KSEVENTF_DPC 0x00000010 +#define KSEVENTF_WORKITEM 0x00000020 +#define KSEVENTF_KSWORKITEM 0x00000080 +#endif /* _NTDDK_ */ + +#define KSEVENT_TYPE_ENABLE 0x00000001 +#define KSEVENT_TYPE_ONESHOT 0x00000002 +#define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 +#define KSEVENT_TYPE_SETSUPPORT 0x00000100 +#define KSEVENT_TYPE_BASICSUPPORT 0x00000200 +#define KSEVENT_TYPE_QUERYBUFFER 0x00000400 + +#define KSEVENT_TYPE_TOPOLOGY 0x10000000 + +typedef struct { + KSEVENT Event; + PKSEVENTDATA EventData; + PVOID Reserved; +} KSQUERYBUFFER,*PKSQUERYBUFFER; + +typedef struct { + ULONG Size; + ULONG Flags; + __MINGW_EXTENSION union { + HANDLE ObjectHandle; + PVOID ObjectPointer; + }; + PVOID Reserved; + KSEVENT Event; + KSEVENTDATA EventData; +} KSRELATIVEEVENT; + +#define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 +#define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 + +typedef struct { + KSEVENTDATA EventData; + LONGLONG MarkTime; +} KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK; + +typedef struct { + KSEVENTDATA EventData; + LONGLONG TimeBase; + LONGLONG Interval; +} KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL; + +typedef struct { + LONGLONG TimeBase; + LONGLONG Interval; +} KSINTERVAL,*PKSINTERVAL; + +#define STATIC_KSPROPSETID_General \ + 0x1464EDA5L,0x6A8F,0x11D1,0x9A,0xA7,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General); +#define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) + +typedef enum { + KSPROPERTY_GENERAL_COMPONENTID +} KSPROPERTY_GENERAL; + +typedef struct { + GUID Manufacturer; + GUID Product; + GUID Component; + GUID Name; + ULONG Version; + ULONG Revision; +} KSCOMPONENTID,*PKSCOMPONENTID; + +#define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_GENERAL_COMPONENTID, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSCOMPONENTID), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define STATIC_KSMETHODSETID_StreamIo \ + 0x65D003CAL,0x1523,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo); +#define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo) + +typedef enum { + KSMETHOD_STREAMIO_READ, + KSMETHOD_STREAMIO_WRITE +} KSMETHOD_STREAMIO; + +#define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler) \ + DEFINE_KSMETHOD_ITEM( \ + KSMETHOD_STREAMIO_READ, \ + KSMETHOD_TYPE_WRITE, \ + (Handler), \ + sizeof(KSMETHOD), \ + 0, \ + NULL) + +#define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler) \ + DEFINE_KSMETHOD_ITEM( \ + KSMETHOD_STREAMIO_WRITE, \ + KSMETHOD_TYPE_READ, \ + (Handler), \ + sizeof(KSMETHOD), \ + 0, \ + NULL) + +#define STATIC_KSPROPSETID_MediaSeeking \ + 0xEE904F0CL,0xD09B,0x11D0,0xAB,0xE9,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking); +#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) + +typedef enum { + KSPROPERTY_MEDIASEEKING_CAPABILITIES, + KSPROPERTY_MEDIASEEKING_FORMATS, + KSPROPERTY_MEDIASEEKING_TIMEFORMAT, + KSPROPERTY_MEDIASEEKING_POSITION, + KSPROPERTY_MEDIASEEKING_STOPPOSITION, + KSPROPERTY_MEDIASEEKING_POSITIONS, + KSPROPERTY_MEDIASEEKING_DURATION, + KSPROPERTY_MEDIASEEKING_AVAILABLE, + KSPROPERTY_MEDIASEEKING_PREROLL, + KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT +} KSPROPERTY_MEDIASEEKING; + +typedef enum { + KS_SEEKING_NoPositioning, + KS_SEEKING_AbsolutePositioning, + KS_SEEKING_RelativePositioning, + KS_SEEKING_IncrementalPositioning, + KS_SEEKING_PositioningBitsMask = 0x3, + KS_SEEKING_SeekToKeyFrame, + KS_SEEKING_ReturnTime = 0x8 +} KS_SEEKING_FLAGS; + +typedef enum { + KS_SEEKING_CanSeekAbsolute = 0x1, + KS_SEEKING_CanSeekForwards = 0x2, + KS_SEEKING_CanSeekBackwards = 0x4, + KS_SEEKING_CanGetCurrentPos = 0x8, + KS_SEEKING_CanGetStopPos = 0x10, + KS_SEEKING_CanGetDuration = 0x20, + KS_SEEKING_CanPlayBackwards = 0x40 +} KS_SEEKING_CAPABILITIES; + +typedef struct { + LONGLONG Current; + LONGLONG Stop; + KS_SEEKING_FLAGS CurrentFlags; + KS_SEEKING_FLAGS StopFlags; +} KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS; + +typedef struct { + LONGLONG Earliest; + LONGLONG Latest; +} KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE; + +typedef struct { + KSPROPERTY Property; + GUID SourceFormat; + GUID TargetFormat; + LONGLONG Time; +} KSP_TIMEFORMAT,*PKSP_TIMEFORMAT; + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_CAPABILITIES, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KS_SEEKING_CAPABILITIES), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_FORMATS, \ + (Handler), \ + sizeof(KSPROPERTY), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_TIMEFORMAT, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(GUID), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_POSITION, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_STOPPOSITION, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_POSITIONS, \ + NULL, \ + sizeof(KSPROPERTY), \ + sizeof(KSPROPERTY_POSITIONS), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_DURATION, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_AVAILABLE, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSPROPERTY_MEDIAAVAILABLE), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_PREROLL, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT, \ + (Handler), \ + sizeof(KSP_TIMEFORMAT), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define STATIC_KSPROPSETID_Topology \ + 0x720D4AC0L,0x7533,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology); +#define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) + +typedef enum { + KSPROPERTY_TOPOLOGY_CATEGORIES, + KSPROPERTY_TOPOLOGY_NODES, + KSPROPERTY_TOPOLOGY_CONNECTIONS, + KSPROPERTY_TOPOLOGY_NAME +} KSPROPERTY_TOPOLOGY; + +#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_TOPOLOGY_CATEGORIES, \ + (Handler), \ + sizeof(KSPROPERTY), \ + 0, \ + NULL, NULL, 0,NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_TOPOLOGY_NODES, \ + (Handler), \ + sizeof(KSPROPERTY), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_TOPOLOGY_CONNECTIONS, \ + (Handler), \ + sizeof(KSPROPERTY), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_TOPOLOGY_NAME, \ + (Handler), \ + sizeof(KSP_NODE), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet,Handler) \ +DEFINE_KSPROPERTY_TABLE(TopologySet) { \ + DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler), \ + DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler), \ + DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler), \ + DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ +} + +#define STATIC_KSCATEGORY_BRIDGE \ + 0x085AFF00L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000",KSCATEGORY_BRIDGE); +#define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) + +#define STATIC_KSCATEGORY_CAPTURE \ + 0x65E8773DL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_CAPTURE); +#define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) + +#define STATIC_KSCATEGORY_RENDER \ + 0x65E8773EL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_RENDER); +#define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) + +#define STATIC_KSCATEGORY_MIXER \ + 0xAD809C00L,0x7B88,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000",KSCATEGORY_MIXER); +#define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) + +#define STATIC_KSCATEGORY_SPLITTER \ + 0x0A4252A0L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_SPLITTER); +#define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) + +#define STATIC_KSCATEGORY_DATACOMPRESSOR \ + 0x1E84C900L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATACOMPRESSOR); +#define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) + +#define STATIC_KSCATEGORY_DATADECOMPRESSOR \ + 0x2721AE20L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATADECOMPRESSOR); +#define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) + +#define STATIC_KSCATEGORY_DATATRANSFORM \ + 0x2EB07EA0L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATATRANSFORM); +#define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) + +#define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ + 0xCF1DDA2CL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_COMMUNICATIONSTRANSFORM); +#define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) + +#define STATIC_KSCATEGORY_INTERFACETRANSFORM \ + 0xCF1DDA2DL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_INTERFACETRANSFORM); +#define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) + +#define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ + 0xCF1DDA2EL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_MEDIUMTRANSFORM); +#define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) + +#define STATIC_KSCATEGORY_FILESYSTEM \ + 0x760FED5EL,0x9357,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196",KSCATEGORY_FILESYSTEM); +#define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) + +#define STATIC_KSCATEGORY_CLOCK \ + 0x53172480L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSCATEGORY_CLOCK); +#define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) + +#define STATIC_KSCATEGORY_PROXY \ + 0x97EBAACAL,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_PROXY); +#define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) + +#define STATIC_KSCATEGORY_QUALITY \ + 0x97EBAACBL,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_QUALITY); +#define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) + +typedef struct { + ULONG FromNode; + ULONG FromNodePin; + ULONG ToNode; + ULONG ToNodePin; +} KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION; + +typedef struct { + ULONG CategoriesCount; + const GUID *Categories; + ULONG TopologyNodesCount; + const GUID *TopologyNodes; + ULONG TopologyConnectionsCount; + const KSTOPOLOGY_CONNECTION *TopologyConnections; + const GUID *TopologyNodesNames; + ULONG Reserved; +} KSTOPOLOGY,*PKSTOPOLOGY; + +#define KSFILTER_NODE ((ULONG)-1) +#define KSALL_NODES ((ULONG)-1) + +typedef struct { + ULONG CreateFlags; + ULONG Node; +} KSNODE_CREATE,*PKSNODE_CREATE; + +#define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL +#define KSTIME_FORMAT_NONE GUID_NULL + +#define STATIC_KSTIME_FORMAT_FRAME \ + 0x7b785570L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 +DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FRAME); +#define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME) + +#define STATIC_KSTIME_FORMAT_BYTE \ + 0x7b785571L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 +DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_BYTE); +#define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE) + +#define STATIC_KSTIME_FORMAT_SAMPLE \ + 0x7b785572L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 +DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_SAMPLE); +#define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE) + +#define STATIC_KSTIME_FORMAT_FIELD \ + 0x7b785573L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 +DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FIELD); +#define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD) + +#define STATIC_KSTIME_FORMAT_MEDIA_TIME \ + 0x7b785574L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 +DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME); +#define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME) + +typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE; + +#define STATIC_KSINTERFACESETID_Standard \ + 0x1A8766A0L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard); +#define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) + +typedef enum { + KSINTERFACE_STANDARD_STREAMING, + KSINTERFACE_STANDARD_LOOPED_STREAMING, + KSINTERFACE_STANDARD_CONTROL +} KSINTERFACE_STANDARD; + +#define STATIC_KSINTERFACESETID_FileIo \ + 0x8C6F932CL,0xE771,0x11D0,0xB8,0xFF,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo); +#define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) + +typedef enum { + KSINTERFACE_FILEIO_STREAMING +} KSINTERFACE_FILEIO; + +#define KSMEDIUM_TYPE_ANYINSTANCE 0 + +#define STATIC_KSMEDIUMSETID_Standard \ + 0x4747B320L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000",KSMEDIUMSETID_Standard); +#define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) + +#define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE + +#define STATIC_KSPROPSETID_Pin \ + 0x8C134960L,0x51AD,0x11CF,0x87,0x8A,0x94,0xF8,0x01,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin); +#define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) + +typedef enum { + KSPROPERTY_PIN_CINSTANCES, + KSPROPERTY_PIN_CTYPES, + KSPROPERTY_PIN_DATAFLOW, + KSPROPERTY_PIN_DATARANGES, + KSPROPERTY_PIN_DATAINTERSECTION, + KSPROPERTY_PIN_INTERFACES, + KSPROPERTY_PIN_MEDIUMS, + KSPROPERTY_PIN_COMMUNICATION, + KSPROPERTY_PIN_GLOBALCINSTANCES, + KSPROPERTY_PIN_NECESSARYINSTANCES, + KSPROPERTY_PIN_PHYSICALCONNECTION, + KSPROPERTY_PIN_CATEGORY, + KSPROPERTY_PIN_NAME, + KSPROPERTY_PIN_CONSTRAINEDDATARANGES, + KSPROPERTY_PIN_PROPOSEDATAFORMAT +} KSPROPERTY_PIN; + +typedef struct { + KSPROPERTY Property; + ULONG PinId; + ULONG Reserved; +} KSP_PIN,*PKSP_PIN; + +#define KSINSTANCE_INDETERMINATE ((ULONG)-1) + +typedef struct { + ULONG PossibleCount; + ULONG CurrentCount; +} KSPIN_CINSTANCES,*PKSPIN_CINSTANCES; + +typedef enum { + KSPIN_DATAFLOW_IN = 1, + KSPIN_DATAFLOW_OUT +} KSPIN_DATAFLOW,*PKSPIN_DATAFLOW; + +#define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0 +#define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION) +#define KSDATAFORMAT_BIT_ATTRIBUTES 1 +#define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) + +#define KSDATARANGE_BIT_ATTRIBUTES 1 +#define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES) +#define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2 +#define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES) + +typedef union { + __MINGW_EXTENSION struct { + ULONG FormatSize; + ULONG Flags; + ULONG SampleSize; + ULONG Reserved; + GUID MajorFormat; + GUID SubFormat; + GUID Specifier; + }; + LONGLONG Alignment; +} KSDATAFORMAT,*PKSDATAFORMAT,KSDATARANGE,*PKSDATARANGE; + +#define KSATTRIBUTE_REQUIRED 0x00000001 + +typedef struct { + ULONG Size; + ULONG Flags; + GUID Attribute; +} KSATTRIBUTE,*PKSATTRIBUTE; + +#if defined(_NTDDK_) +typedef struct { + ULONG Count; + PKSATTRIBUTE *Attributes; +} KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST; +#endif /* _NTDDK_ */ + +typedef enum { + KSPIN_COMMUNICATION_NONE, + KSPIN_COMMUNICATION_SINK, + KSPIN_COMMUNICATION_SOURCE, + KSPIN_COMMUNICATION_BOTH, + KSPIN_COMMUNICATION_BRIDGE +} KSPIN_COMMUNICATION,*PKSPIN_COMMUNICATION; + +typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM; + +typedef struct { + KSPIN_INTERFACE Interface; + KSPIN_MEDIUM Medium; + ULONG PinId; + HANDLE PinToHandle; + KSPRIORITY Priority; +} KSPIN_CONNECT,*PKSPIN_CONNECT; + +typedef struct { + ULONG Size; + ULONG Pin; + WCHAR SymbolicLinkName[1]; +} KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION; + +#if defined(_NTDDK_) +typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin, + PKSDATARANGE DataRange, + PVOID Data); +typedef NTSTATUS (*PFNKSINTERSECTHANDLEREX)(PVOID Context, PIRP Irp, + PKSP_PIN Pin, + PKSDATARANGE DataRange, + PKSDATARANGE MatchingDataRange, + ULONG DataBufferSize, + PVOID Data, + PULONG DataSize); +#endif /* _NTDDK_ */ + +#define DEFINE_KSPIN_INTERFACE_TABLE(tablename) \ + const KSPIN_INTERFACE tablename[] = + +#define DEFINE_KSPIN_INTERFACE_ITEM(guid,_interFace) \ + { \ + STATICGUIDOF(guid), \ + (_interFace), \ + 0 \ + } + +#define DEFINE_KSPIN_MEDIUM_TABLE(tablename) \ + const KSPIN_MEDIUM tablename[] = + +#define DEFINE_KSPIN_MEDIUM_ITEM(guid,medium) \ + DEFINE_KSPIN_INTERFACE_ITEM(guid,medium) + +#define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_CINSTANCES, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(KSPIN_CINSTANCES), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_CTYPES, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(ULONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_DATAFLOW, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(KSPIN_DATAFLOW), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_DATARANGES, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_DATAINTERSECTION, \ + (Handler), \ + sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_INTERFACES, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_MEDIUMS, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_COMMUNICATION, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(KSPIN_COMMUNICATION), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_GLOBALCINSTANCES, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(KSPIN_CINSTANCES), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_NECESSARYINSTANCES, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(ULONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_PHYSICALCONNECTION, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_CATEGORY, \ + (Handler), \ + sizeof(KSP_PIN), \ + sizeof(GUID), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_NAME, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_CONSTRAINEDDATARANGES, \ + (Handler), \ + sizeof(KSP_PIN), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_PIN_PROPOSEDATAFORMAT, \ + NULL, \ + sizeof(KSP_PIN), \ + sizeof(KSDATAFORMAT), \ + (Handler), NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_PINSET(PinSet,PropGeneral,PropInstances,PropIntersection) \ +DEFINE_KSPROPERTY_TABLE(PinSet) { \ + DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ + DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ + DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral) \ +} + +#define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,PropGeneral,PropInstances,PropIntersection) \ +DEFINE_KSPROPERTY_TABLE(PinSet) { \ + DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ + DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ + DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral), \ + DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral) \ +} + +#define STATIC_KSNAME_Filter \ + 0x9b365890L,0x165f,0x11d0,0xa1,0x95,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4",KSNAME_Filter); +#define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) + +#define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" + +#define STATIC_KSNAME_Pin \ + 0x146F1A80L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000",KSNAME_Pin); +#define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) + +#define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" + +#define STATIC_KSNAME_Clock \ + 0x53172480L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSNAME_Clock); +#define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock) + +#define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" + +#define STATIC_KSNAME_Allocator \ + 0x642F5D00L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000",KSNAME_Allocator); +#define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator) + +#define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" + +#define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" + +#define STATIC_KSNAME_TopologyNode \ + 0x0621061AL,0xEE75,0x11D0,0xB9,0x15,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196",KSNAME_TopologyNode); +#define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode) + +#define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" + +#if defined(_NTDDK_) +typedef struct { + ULONG InterfacesCount; + const KSPIN_INTERFACE *Interfaces; + ULONG MediumsCount; + const KSPIN_MEDIUM *Mediums; + ULONG DataRangesCount; + const PKSDATARANGE *DataRanges; + KSPIN_DATAFLOW DataFlow; + KSPIN_COMMUNICATION Communication; + const GUID *Category; + const GUID *Name; + __MINGW_EXTENSION union { + LONGLONG Reserved; + __MINGW_EXTENSION struct { + ULONG ConstrainedDataRangesCount; + PKSDATARANGE *ConstrainedDataRanges; + }; + }; +} KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; +typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR; + +#define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename) \ + const KSPIN_DESCRIPTOR tablename[] = + +#define DEFINE_KSPIN_DESCRIPTOR_ITEM(InterfacesCount,Interfaces,MediumsCount, Mediums,DataRangesCount,DataRanges,DataFlow,Communication)\ +{ \ + InterfacesCount, Interfaces, MediumsCount, Mediums, \ + DataRangesCount, DataRanges, DataFlow, Communication, \ + NULL, NULL, 0 \ +} + +#define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(InterfacesCount,Interfaces,MediumsCount,Mediums,DataRangesCount,DataRanges,DataFlow,Communication,Category,Name)\ +{ \ + InterfacesCount, Interfaces, MediumsCount, Mediums, \ + DataRangesCount, DataRanges, DataFlow, Communication, \ + Category, Name, 0 \ +} +#endif /* _NTDDK_ */ + +#define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL +#define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL + +#define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL +#define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL + +#define STATIC_KSDATAFORMAT_TYPE_STREAM \ + 0xE436EB83L,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 +DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_TYPE_STREAM); +#define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM) + +#define STATIC_KSDATAFORMAT_SUBTYPE_NONE \ + 0xE436EB8EL,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 +DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_SUBTYPE_NONE); +#define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) + +#define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL +#define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL + +#define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME \ + 0xAA797B40L,0xE974,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SPECIFIER_FILENAME); +#define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME) + +#define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE \ + 0x65E8773CL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196",KSDATAFORMAT_SPECIFIER_FILEHANDLE); +#define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE) + +#define STATIC_KSDATAFORMAT_SPECIFIER_NONE \ + 0x0F6417D6L,0xC318,0x11D0,0xA4,0x3F,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196",KSDATAFORMAT_SPECIFIER_NONE); +#define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) + +#define STATIC_KSPROPSETID_Quality \ + 0xD16AD380L,0xAC1A,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality); +#define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality) + +typedef enum { + KSPROPERTY_QUALITY_REPORT, + KSPROPERTY_QUALITY_ERROR +} KSPROPERTY_QUALITY; + +#define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_QUALITY_REPORT, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSQUALITY), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_QUALITY_ERROR, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSERROR), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define STATIC_KSPROPSETID_Connection \ + 0x1D58C920L,0xAC9B,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection); +#define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) + +typedef enum { + KSPROPERTY_CONNECTION_STATE, + KSPROPERTY_CONNECTION_PRIORITY, + KSPROPERTY_CONNECTION_DATAFORMAT, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING, + KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, + KSPROPERTY_CONNECTION_ACQUIREORDERING, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, + KSPROPERTY_CONNECTION_STARTAT +} KSPROPERTY_CONNECTION; + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_STATE, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSSTATE), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_PRIORITY, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSPRIORITY), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler,SetHandler)\ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_DATAFORMAT, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + 0, \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_ALLOCATORFRAMING, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSALLOCATOR_FRAMING), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ + (Handler), \ + sizeof(KSPROPERTY), \ + 0, \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ + NULL, \ + sizeof(KSPROPERTY), \ + sizeof(KSDATAFORMAT), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_ACQUIREORDERING, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(int), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CONNECTION_STARTAT, \ + NULL, \ + sizeof(KSPROPERTY), \ + sizeof(KSRELATIVEEVENT), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 +#define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 +#define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 +#define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 +#define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 + +#define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 +#define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 +#define KSALLOCATOR_OPTIONF_VALID 0x00000003 + +#define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 +#define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 +#define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 +#define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 +#define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100 +#define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200 +#define KSALLOCATOR_FLAG_CYCLE 0x00000400 +#define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800 +#define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000 +#define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000 + +typedef struct { + __MINGW_EXTENSION union { + ULONG OptionsFlags; + ULONG RequirementsFlags; + }; +#if defined(_NTDDK_) + POOL_TYPE PoolType; +#else + ULONG PoolType; +#endif /* _NTDDK_ */ + ULONG Frames; + ULONG FrameSize; + ULONG FileAlignment; + ULONG Reserved; +} KSALLOCATOR_FRAMING,*PKSALLOCATOR_FRAMING; + +#if defined(_NTDDK_) +typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context); +typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer); +typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext, + PKSALLOCATOR_FRAMING AllocatorFraming, + PVOID* Context); +typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context); +#endif /* _NTDDK_ */ + +typedef struct { + ULONG MinFrameSize; + ULONG MaxFrameSize; + ULONG Stepping; +} KS_FRAMING_RANGE,*PKS_FRAMING_RANGE; + +typedef struct { + KS_FRAMING_RANGE Range; + ULONG InPlaceWeight; + ULONG NotInPlaceWeight; +} KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED; + +typedef struct { + ULONG RatioNumerator; + ULONG RatioDenominator; + ULONG RatioConstantMargin; +} KS_COMPRESSION,*PKS_COMPRESSION; + +typedef struct { + GUID MemoryType; + GUID BusType; + ULONG MemoryFlags; + ULONG BusFlags; + ULONG Flags; + ULONG Frames; + ULONG FileAlignment; + ULONG MemoryTypeWeight; + KS_FRAMING_RANGE PhysicalRange; + KS_FRAMING_RANGE_WEIGHTED FramingRange; +} KS_FRAMING_ITEM,*PKS_FRAMING_ITEM; + +typedef struct { + ULONG CountItems; + ULONG PinFlags; + KS_COMPRESSION OutputCompression; + ULONG PinWeight; + KS_FRAMING_ITEM FramingItem[1]; +} KSALLOCATOR_FRAMING_EX,*PKSALLOCATOR_FRAMING_EX; + +#define KSMEMORY_TYPE_WILDCARD GUID_NULL +#define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL + +#define KSMEMORY_TYPE_DONT_CARE GUID_NULL +#define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL + +#define KS_TYPE_DONT_CARE GUID_NULL +#define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL + +#define STATIC_KSMEMORY_TYPE_SYSTEM \ + 0x091bb638L,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 +DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_SYSTEM); +#define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM) + +#define STATIC_KSMEMORY_TYPE_USER \ + 0x8cb0fc28L,0x7893,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 +DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802",KSMEMORY_TYPE_USER); +#define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER) + +#define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ + 0xd833f8f8L,0x7894,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 +DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_PAGED); +#define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) + +#define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \ + 0x4a6d5fc4L,0x7895,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 +DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_NONPAGED); +#define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED) + +#define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \ + 0x091bb639L,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 +DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_DEVICE_UNKNOWN); +#define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN) + +#define DECLARE_SIMPLE_FRAMING_EX(FramingExName,MemoryType,Flags,Frames,Alignment,MinFrameSize,MaxFrameSize) \ +const KSALLOCATOR_FRAMING_EX FramingExName = \ +{ \ + 1, \ + 0, \ + { \ + 1, \ + 1, \ + 0 \ + }, \ + 0, \ + { \ + { \ + MemoryType, \ + STATIC_KS_TYPE_DONT_CARE, \ + 0, \ + 0, \ + Flags, \ + Frames, \ + Alignment, \ + 0, \ + { \ + 0, \ + (ULONG)-1, \ + 1 \ + }, \ + { \ + { \ + MinFrameSize, \ + MaxFrameSize, \ + 1 \ + }, \ + 0, \ + 0 \ + } \ + } \ + } \ +} + +#define SetDefaultKsCompression(KsCompressionPointer) \ +{ \ + KsCompressionPointer->RatioNumerator = 1; \ + KsCompressionPointer->RatioDenominator = 1; \ + KsCompressionPointer->RatioConstantMargin = 0; \ +} + +#define SetDontCareKsFramingRange(KsFramingRangePointer) \ +{ \ + KsFramingRangePointer->MinFrameSize = 0; \ + KsFramingRangePointer->MaxFrameSize = (ULONG) -1; \ + KsFramingRangePointer->Stepping = 1; \ +} + +#define SetKsFramingRange(KsFramingRangePointer,P_MinFrameSize,P_MaxFrameSize) \ +{ \ + KsFramingRangePointer->MinFrameSize = P_MinFrameSize; \ + KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize; \ + KsFramingRangePointer->Stepping = 1; \ +} + +#define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer,P_MinFrameSize,P_MaxFrameSize) \ +{ \ + KS_FRAMING_RANGE *KsFramingRange = \ + &KsFramingRangeWeightedPointer->Range; \ + SetKsFramingRange(KsFramingRange,P_MinFrameSize,P_MaxFrameSize);\ + KsFramingRangeWeightedPointer->InPlaceWeight = 0; \ + KsFramingRangeWeightedPointer->NotInPlaceWeight = 0; \ +} + +#define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer,P_MemoryType,P_Flags,P_Frames,P_Alignment,P_MinFrameSize,P_MaxFrameSize) \ +{ \ + KS_COMPRESSION *KsCompression = \ + &FramingExPointer->OutputCompression; \ + KS_FRAMING_RANGE *KsFramingRange = \ + &FramingExPointer->FramingItem[0].PhysicalRange;\ + KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = \ + &FramingExPointer->FramingItem[0].FramingRange; \ + FramingExPointer->CountItems = 1; \ + FramingExPointer->PinFlags = 0; \ + SetDefaultKsCompression(KsCompression); \ + FramingExPointer->PinWeight = 0; \ + FramingExPointer->FramingItem[0].MemoryType = P_MemoryType; \ + FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE; \ + FramingExPointer->FramingItem[0].MemoryFlags = 0; \ + FramingExPointer->FramingItem[0].BusFlags = 0; \ + FramingExPointer->FramingItem[0].Flags = P_Flags; \ + FramingExPointer->FramingItem[0].Frames = P_Frames; \ + FramingExPointer->FramingItem[0].FileAlignment = P_Alignment; \ + FramingExPointer->FramingItem[0].MemoryTypeWeight = 0; \ + SetDontCareKsFramingRange(KsFramingRange); \ + SetKsFramingRangeWeighted(KsFramingRangeWeighted, \ + P_MinFrameSize,P_MaxFrameSize); \ +} + +#define STATIC_KSEVENTSETID_StreamAllocator \ + 0x75d95571L,0x073c,0x11d0,0xa1,0x61,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator); +#define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator) + +typedef enum { + KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, + KSEVENT_STREAMALLOCATOR_FREEFRAME +} KSEVENT_STREAMALLOCATOR; + +#define STATIC_KSMETHODSETID_StreamAllocator \ + 0xcf6e4341L,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator); +#define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator) + +typedef enum { + KSMETHOD_STREAMALLOCATOR_ALLOC, + KSMETHOD_STREAMALLOCATOR_FREE +} KSMETHOD_STREAMALLOCATOR; + +#define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler) \ + DEFINE_KSMETHOD_ITEM( \ + KSMETHOD_STREAMALLOCATOR_ALLOC, \ + KSMETHOD_TYPE_WRITE, \ + (Handler), \ + sizeof(KSMETHOD), \ + sizeof(PVOID), \ + NULL) + +#define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler) \ + DEFINE_KSMETHOD_ITEM( \ + KSMETHOD_STREAMALLOCATOR_FREE, \ + KSMETHOD_TYPE_READ, \ + (Handler), \ + sizeof(KSMETHOD), \ + sizeof(PVOID), \ + NULL) + +#define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet,MethodAlloc,MethodFree)\ +DEFINE_KSMETHOD_TABLE(AllocatorSet) { \ + DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc), \ + DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree) \ +} + +#define STATIC_KSPROPSETID_StreamAllocator \ + 0xcf6e4342L,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator); +#define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) + +#if defined(_NTDDK_) +typedef enum { + KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, + KSPROPERTY_STREAMALLOCATOR_STATUS +} KSPROPERTY_STREAMALLOCATOR; + +#define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAMALLOCATOR_STATUS, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSSTREAMALLOCATOR_STATUS), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet,PropFunctionTable,PropStatus)\ +DEFINE_KSPROPERTY_TABLE(AllocatorSet) { \ + DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus), \ + DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\ +} + +typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject, + PVOID *Frame); +typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame); + +typedef struct { + PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; + PFNALLOCATOR_FREEFRAME FreeFrame; +} KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; +#endif /* _NTDDK_ */ + +typedef struct { + KSALLOCATOR_FRAMING Framing; + ULONG AllocatedFrames; + ULONG Reserved; +} KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS; + +typedef struct { + KSALLOCATOR_FRAMING_EX Framing; + ULONG AllocatedFrames; + ULONG Reserved; +} KSSTREAMALLOCATOR_STATUS_EX,*PKSSTREAMALLOCATOR_STATUS_EX; + +#define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 +#define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 +#define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 +#define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 +#define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 +#define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 +#define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 +#define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 +#define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 +#define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 + +typedef struct { + LONGLONG Time; + ULONG Numerator; + ULONG Denominator; +} KSTIME,*PKSTIME; + +typedef struct { + ULONG Size; + ULONG TypeSpecificFlags; + KSTIME PresentationTime; + LONGLONG Duration; + ULONG FrameExtent; + ULONG DataUsed; + PVOID Data; + ULONG OptionsFlags; +#ifdef _WIN64 + ULONG Reserved; +#endif +} KSSTREAM_HEADER,*PKSSTREAM_HEADER; + +#define STATIC_KSPROPSETID_StreamInterface \ + 0x1fdd8ee1L,0x9cd3,0x11d0,0x82,0xaa,0x00,0x00,0xf8,0x22,0xfe,0x8a +DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface); +#define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface) + +typedef enum { + KSPROPERTY_STREAMINTERFACE_HEADERSIZE +} KSPROPERTY_STREAMINTERFACE; + +#define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(GetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAMINTERFACE_HEADERSIZE, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(ULONG), \ + NULL,NULL,0,NULL,NULL,0) + +#define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,HeaderSizeHandler) \ +DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) { \ + DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(HeaderSizeHandler)\ +} + +#define STATIC_KSPROPSETID_Stream \ + 0x65aaba60L,0x98ae,0x11cf,0xa1,0x0d,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream); +#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) + +typedef enum { + KSPROPERTY_STREAM_ALLOCATOR, + KSPROPERTY_STREAM_QUALITY, + KSPROPERTY_STREAM_DEGRADATION, + KSPROPERTY_STREAM_MASTERCLOCK, + KSPROPERTY_STREAM_TIMEFORMAT, + KSPROPERTY_STREAM_PRESENTATIONTIME, + KSPROPERTY_STREAM_PRESENTATIONEXTENT, + KSPROPERTY_STREAM_FRAMETIME, + KSPROPERTY_STREAM_RATECAPABILITY, + KSPROPERTY_STREAM_RATE, + KSPROPERTY_STREAM_PIPE_ID +} KSPROPERTY_STREAM; + +#define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_ALLOCATOR, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(HANDLE), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_QUALITY, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSQUALITY_MANAGER), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler,SetHandler)\ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_DEGRADATION, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + 0, \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler,SetHandler)\ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_MASTERCLOCK, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(HANDLE), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_TIMEFORMAT, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(GUID), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler,SetHandler)\ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_PRESENTATIONTIME, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSTIME), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_PRESENTATIONEXTENT, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_FRAMETIME, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSFRAMETIME), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_RATECAPABILITY, \ + (Handler), \ + sizeof(KSRATE_CAPABILITY), \ + sizeof(KSRATE), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_RATE, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(KSRATE), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler,SetHandler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_STREAM_PIPE_ID, \ + (GetHandler), \ + sizeof(KSPROPERTY), \ + sizeof(HANDLE), \ + (SetHandler), \ + NULL, 0, NULL, NULL, 0) + +typedef struct { + HANDLE QualityManager; + PVOID Context; +} KSQUALITY_MANAGER,*PKSQUALITY_MANAGER; + +typedef struct { + LONGLONG Duration; + ULONG FrameFlags; + ULONG Reserved; +} KSFRAMETIME,*PKSFRAMETIME; + +#define KSFRAMETIME_VARIABLESIZE 0x00000001 + +typedef struct { + LONGLONG PresentationStart; + LONGLONG Duration; + KSPIN_INTERFACE Interface; + LONG Rate; + ULONG Flags; +} KSRATE,*PKSRATE; + +#define KSRATE_NOPRESENTATIONSTART 0x00000001 +#define KSRATE_NOPRESENTATIONDURATION 0x00000002 + +typedef struct { + KSPROPERTY Property; + KSRATE Rate; +} KSRATE_CAPABILITY,*PKSRATE_CAPABILITY; + +#define STATIC_KSPROPSETID_Clock \ + 0xDF12A4C0L,0xAC17,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000",KSPROPSETID_Clock); +#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) + +#define NANOSECONDS 10000000 +#define KSCONVERT_PERFORMANCE_TIME(Frequency,PerformanceTime) \ + ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS / (Frequency)) << 32) + \ + ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS) % (Frequency)) << 32) +\ + ((ULONGLONG)(PerformanceTime).LowPart *NANOSECONDS)) / (Frequency))) + +typedef struct { + ULONG CreateFlags; +} KSCLOCK_CREATE,*PKSCLOCK_CREATE; + +typedef struct { + LONGLONG Time; + LONGLONG SystemTime; +} KSCORRELATED_TIME,*PKSCORRELATED_TIME; + +typedef struct { + LONGLONG Granularity; + LONGLONG Error; +} KSRESOLUTION,*PKSRESOLUTION; + +typedef enum { + KSPROPERTY_CLOCK_TIME, + KSPROPERTY_CLOCK_PHYSICALTIME, + KSPROPERTY_CLOCK_CORRELATEDTIME, + KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, + KSPROPERTY_CLOCK_RESOLUTION, + KSPROPERTY_CLOCK_STATE, +#if defined(_NTDDK_) + KSPROPERTY_CLOCK_FUNCTIONTABLE +#endif /* _NTDDK_ */ +} KSPROPERTY_CLOCK; + +#if defined(_NTDDK_) +typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject); +typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject, + PLONGLONG SystemTime); + +typedef struct { + PFNKSCLOCK_GETTIME GetTime; + PFNKSCLOCK_GETTIME GetPhysicalTime; + PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; + PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; +} KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; + +typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer, + LARGE_INTEGER DueTime, PKDPC Dpc); +typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer); +typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context, + PLONGLONG SystemTime); + +typedef PVOID PKSDEFAULTCLOCK; + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_TIME, \ + (Handler), \ + sizeof(KSPROPERTY), sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_PHYSICALTIME, \ + (Handler), \ + sizeof(KSPROPERTY), sizeof(LONGLONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_CORRELATEDTIME, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSCORRELATED_TIME), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSCORRELATED_TIME), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_RESOLUTION, \ + (Handler), \ + sizeof(KSPROPERTY),sizeof(KSRESOLUTION),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_STATE, \ + (Handler), \ + sizeof(KSPROPERTY), sizeof(KSSTATE), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_CLOCK_FUNCTIONTABLE, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(KSCLOCK_FUNCTIONTABLE), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,PropTime,PropPhysicalTime,PropCorrelatedTime,PropCorrelatedPhysicalTime,PropResolution,PropState,PropFunctionTable)\ +DEFINE_KSPROPERTY_TABLE(ClockSet) { \ + DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime), \ + DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime), \ + DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution), \ + DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState), \ + DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable), \ +} +#endif /* _NTDDK_ */ + +#define STATIC_KSEVENTSETID_Clock \ + 0x364D8E20L,0x62C7,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock); +#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) + +typedef enum { + KSEVENT_CLOCK_INTERVAL_MARK, + KSEVENT_CLOCK_POSITION_MARK +} KSEVENT_CLOCK_POSITION; + +#define STATIC_KSEVENTSETID_Connection \ + 0x7f4bcbe0L,0x9ea5,0x11cf,0xa5,0xd6,0x28,0xdb,0x04,0xc1,0x00,0x00 +DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection); +#define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection) + +typedef enum { + KSEVENT_CONNECTION_POSITIONUPDATE, + KSEVENT_CONNECTION_DATADISCONTINUITY, + KSEVENT_CONNECTION_TIMEDISCONTINUITY, + KSEVENT_CONNECTION_PRIORITY, + KSEVENT_CONNECTION_ENDOFSTREAM +} KSEVENT_CONNECTION; + +typedef struct { + PVOID Context; + ULONG Proportion; + LONGLONG DeltaTime; +} KSQUALITY,*PKSQUALITY; + +typedef struct { + PVOID Context; + ULONG Status; +} KSERROR,*PKSERROR; + +typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE; + +#define STATIC_KSDEGRADESETID_Standard \ + 0x9F564180L,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard); +#define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard) + +typedef enum { + KSDEGRADE_STANDARD_SAMPLE, + KSDEGRADE_STANDARD_QUALITY, + KSDEGRADE_STANDARD_COMPUTATION, + KSDEGRADE_STANDARD_SKIP +} KSDEGRADE_STANDARD; + +#if defined(_NTDDK_) + +#define KSPROBE_STREAMREAD 0x00000000 +#define KSPROBE_STREAMWRITE 0x00000001 +#define KSPROBE_ALLOCATEMDL 0x00000010 +#define KSPROBE_PROBEANDLOCK 0x00000020 +#define KSPROBE_SYSTEMADDRESS 0x00000040 +#define KSPROBE_MODIFY 0x00000200 +#define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) +#define KSPROBE_ALLOWFORMATCHANGE 0x00000080 +#define KSSTREAM_READ KSPROBE_STREAMREAD +#define KSSTREAM_WRITE KSPROBE_STREAMWRITE +#define KSSTREAM_PAGED_DATA 0x00000000 +#define KSSTREAM_NONPAGED_DATA 0x00000100 +#define KSSTREAM_SYNCHRONOUS 0x00001000 +#define KSSTREAM_FAILUREEXCEPTION 0x00002000 + +typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp); +typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data); +typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject, + PKSIDENTIFIER Request, + ULONG RequestLength, PVOID Data, + ULONG DataLength, + PIO_STATUS_BLOCK IoStatus); +typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize, + BOOLEAN InputOperation); + +typedef struct { + KSPROPERTY_MEMBERSHEADER MembersHeader; + const VOID *Members; +} KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; + +typedef struct { + KSIDENTIFIER PropTypeSet; + ULONG MembersListCount; + const KSPROPERTY_MEMBERSLIST *MembersList; +} KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; + +#define DEFINE_KSPROPERTY_TABLE(tablename) \ + const KSPROPERTY_ITEM tablename[] = + +#define DEFINE_KSPROPERTY_ITEM(PropertyId,GetHandler,MinProperty,MinData,SetHandler,Values,RelationsCount,Relations,SupportHandler,SerializedSize)\ +{ \ + PropertyId, (PFNKSHANDLER)GetHandler, \ + MinProperty, MinData, \ + (PFNKSHANDLER)SetHandler, \ + (PKSPROPERTY_VALUES)Values, RelationsCount, \ + (PKSPROPERTY)Relations, \ + (PFNKSHANDLER)SupportHandler, \ + (ULONG)SerializedSize \ +} + +typedef struct { + ULONG PropertyId; + __MINGW_EXTENSION union { + PFNKSHANDLER GetPropertyHandler; + BOOLEAN GetSupported; + }; + ULONG MinProperty; + ULONG MinData; + __MINGW_EXTENSION union { + PFNKSHANDLER SetPropertyHandler; + BOOLEAN SetSupported; + }; + const KSPROPERTY_VALUES *Values; + ULONG RelationsCount; + const KSPROPERTY *Relations; + PFNKSHANDLER SupportHandler; + ULONG SerializedSize; +} KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; + +#define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler) \ +{ \ + PropertyId, (PFNKSFASTHANDLER)GetHandler, \ + (PFNKSFASTHANDLER)SetHandler, 0 \ +} + +typedef struct { + ULONG PropertyId; + __MINGW_EXTENSION union { + PFNKSFASTHANDLER GetPropertyHandler; + BOOLEAN GetSupported; + }; + __MINGW_EXTENSION union { + PFNKSFASTHANDLER SetPropertyHandler; + BOOLEAN SetSupported; + }; + ULONG Reserved; +} KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; + +#define DEFINE_KSPROPERTY_SET(Set,PropertiesCount,PropertyItem,FastIoCount,FastIoTable)\ +{ \ + Set, \ + PropertiesCount, PropertyItem, \ + FastIoCount, FastIoTable \ +} + +#define DEFINE_KSPROPERTY_SET_TABLE(tablename) \ + const KSPROPERTY_SET tablename[] = + +typedef struct { + const GUID *Set; + ULONG PropertiesCount; + const KSPROPERTY_ITEM *PropertyItem; + ULONG FastIoCount; + const KSFASTPROPERTY_ITEM *FastIoTable; +} KSPROPERTY_SET, *PKSPROPERTY_SET; + +#define DEFINE_KSMETHOD_TABLE(tablename) \ + const KSMETHOD_ITEM tablename[] = + +#define DEFINE_KSMETHOD_ITEM(MethodId,Flags,MethodHandler,MinMethod,MinData,SupportHandler)\ +{ \ + MethodId, (PFNKSHANDLER)MethodHandler, \ + MinMethod, MinData, \ + SupportHandler, Flags \ +} + +typedef struct { + ULONG MethodId; + __MINGW_EXTENSION union { + PFNKSHANDLER MethodHandler; + BOOLEAN MethodSupported; + }; + ULONG MinMethod; + ULONG MinData; + PFNKSHANDLER SupportHandler; + ULONG Flags; +} KSMETHOD_ITEM, *PKSMETHOD_ITEM; + +#define DEFINE_KSFASTMETHOD_ITEM(MethodId,MethodHandler) \ +{ \ + MethodId, (PFNKSFASTHANDLER)MethodHandler \ +} + +typedef struct { + ULONG MethodId; + __MINGW_EXTENSION union { + PFNKSFASTHANDLER MethodHandler; + BOOLEAN MethodSupported; + }; +} KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; + +#define DEFINE_KSMETHOD_SET(Set,MethodsCount,MethodItem,FastIoCount,FastIoTable)\ +{ \ + Set, \ + MethodsCount, MethodItem, \ + FastIoCount, FastIoTable \ +} + +#define DEFINE_KSMETHOD_SET_TABLE(tablename) \ + const KSMETHOD_SET tablename[] = + +typedef struct { + const GUID *Set; + ULONG MethodsCount; + const KSMETHOD_ITEM *MethodItem; + ULONG FastIoCount; + const KSFASTMETHOD_ITEM *FastIoTable; +} KSMETHOD_SET, *PKSMETHOD_SET; + +typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY; +typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData, + struct _KSEVENT_ENTRY* EventEntry); +typedef VOID (*PFNKSREMOVEEVENT)(PFILE_OBJECT FileObject, + struct _KSEVENT_ENTRY* EventEntry); + +#define DEFINE_KSEVENT_TABLE(tablename) \ + const KSEVENT_ITEM tablename[] = + +#define DEFINE_KSEVENT_ITEM(EventId,DataInput,ExtraEntryData,AddHandler,RemoveHandler,SupportHandler)\ +{ \ + EventId, DataInput, ExtraEntryData, \ + AddHandler, RemoveHandler, SupportHandler \ +} + +typedef struct { + ULONG EventId; + ULONG DataInput; + ULONG ExtraEntryData; + PFNKSADDEVENT AddHandler; + PFNKSREMOVEEVENT RemoveHandler; + PFNKSHANDLER SupportHandler; +} KSEVENT_ITEM, *PKSEVENT_ITEM; + +#define DEFINE_KSEVENT_SET(Set,EventsCount,EventItem) \ +{ \ + Set, EventsCount, EventItem \ +} + +#define DEFINE_KSEVENT_SET_TABLE(tablename) \ + const KSEVENT_SET tablename[] = + +typedef struct { + const GUID *Set; + ULONG EventsCount; + const KSEVENT_ITEM *EventItem; +} KSEVENT_SET, *PKSEVENT_SET; + +typedef struct { + KDPC Dpc; + ULONG ReferenceCount; + KSPIN_LOCK AccessLock; +} KSDPC_ITEM, *PKSDPC_ITEM; + +typedef struct { + KSDPC_ITEM DpcItem; + LIST_ENTRY BufferList; +} KSBUFFER_ITEM, *PKSBUFFER_ITEM; + + +#define KSEVENT_ENTRY_DELETED 1 +#define KSEVENT_ENTRY_ONESHOT 2 +#define KSEVENT_ENTRY_BUFFERED 4 + +struct _KSEVENT_ENTRY { + LIST_ENTRY ListEntry; + PVOID Object; + __MINGW_EXTENSION union { + PKSDPC_ITEM DpcItem; + PKSBUFFER_ITEM BufferItem; + }; + PKSEVENTDATA EventData; + ULONG NotificationType; + const KSEVENT_SET *EventSet; + const KSEVENT_ITEM *EventItem; + PFILE_OBJECT FileObject; + ULONG SemaphoreAdjustment; + ULONG Reserved; + ULONG Flags; +}; + +typedef enum { + KSEVENTS_NONE, + KSEVENTS_SPINLOCK, + KSEVENTS_MUTEX, + KSEVENTS_FMUTEX, + KSEVENTS_FMUTEXUNSAFE, + KSEVENTS_INTERRUPT, + KSEVENTS_ERESOURCE +} KSEVENTS_LOCKTYPE; + +#define KSDISPATCH_FASTIO 0x80000000 + +typedef struct { + PDRIVER_DISPATCH Create; + PVOID Context; + UNICODE_STRING ObjectClass; + PSECURITY_DESCRIPTOR SecurityDescriptor; + ULONG Flags; +} KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; + +typedef VOID (*PFNKSITEMFREECALLBACK)(PKSOBJECT_CREATE_ITEM CreateItem); + +#define KSCREATE_ITEM_SECURITYCHANGED 0x00000001 +#define KSCREATE_ITEM_WILDCARD 0x00000002 +#define KSCREATE_ITEM_NOPARAMETERS 0x00000004 +#define KSCREATE_ITEM_FREEONSTOP 0x00000008 + +#define DEFINE_KSCREATE_DISPATCH_TABLE( tablename ) \ + KSOBJECT_CREATE_ITEM tablename[] = + +#define DEFINE_KSCREATE_ITEM(DispatchCreate,TypeName,Context) \ +{ \ + (DispatchCreate), (PVOID)(Context), \ + { \ + sizeof(TypeName) - sizeof(UNICODE_NULL),\ + sizeof(TypeName), \ + (PWCHAR)(TypeName) \ + }, \ + NULL, 0 \ +} + +#define DEFINE_KSCREATE_ITEMEX(DispatchCreate,TypeName,Context,Flags) \ +{ \ + (DispatchCreate), \ + (PVOID)(Context), \ + { \ + sizeof(TypeName) - sizeof(UNICODE_NULL),\ + sizeof(TypeName), \ + (PWCHAR)(TypeName) \ + }, \ + NULL, (Flags) \ +} + +#define DEFINE_KSCREATE_ITEMNULL(DispatchCreate,Context) \ +{ \ + DispatchCreate, Context, \ + { \ + 0, 0, NULL, \ + }, \ + NULL, 0 \ +} + +typedef struct { + ULONG CreateItemsCount; + PKSOBJECT_CREATE_ITEM CreateItemsList; +} KSOBJECT_CREATE, *PKSOBJECT_CREATE; + +typedef struct { + PDRIVER_DISPATCH DeviceIoControl; + PDRIVER_DISPATCH Read; + PDRIVER_DISPATCH Write; + PDRIVER_DISPATCH Flush; + PDRIVER_DISPATCH Close; + PDRIVER_DISPATCH QuerySecurity; + PDRIVER_DISPATCH SetSecurity; + PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; + PFAST_IO_READ FastRead; + PFAST_IO_WRITE FastWrite; +} KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; + +#define DEFINE_KSDISPATCH_TABLE(tablename,DeviceIoControl,Read,Write,Flush,Close,QuerySecurity,SetSecurity,FastDeviceIoControl,FastRead,FastWrite)\ + const KSDISPATCH_TABLE tablename = \ + { \ + DeviceIoControl, \ + Read, \ + Write, \ + Flush, \ + Close, \ + QuerySecurity, \ + SetSecurity, \ + FastDeviceIoControl, \ + FastRead, \ + FastWrite, \ + } + +#define KSCREATE_ITEM_IRP_STORAGE(Irp) \ + (*(PKSOBJECT_CREATE_ITEM *)&(Irp)->Tail.Overlay.DriverContext[0]) +#define KSEVENT_SET_IRP_STORAGE(Irp) \ + (*(const KSEVENT_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) +#define KSEVENT_ITEM_IRP_STORAGE(Irp) \ + (*(const KSEVENT_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) +#define KSEVENT_ENTRY_IRP_STORAGE(Irp) \ + (*(PKSEVENT_ENTRY *)&(Irp)->Tail.Overlay.DriverContext[0]) +#define KSMETHOD_SET_IRP_STORAGE(Irp) \ + (*(const KSMETHOD_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) +#define KSMETHOD_ITEM_IRP_STORAGE(Irp) \ + (*(const KSMETHOD_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) +#define KSMETHOD_TYPE_IRP_STORAGE(Irp) \ + (*(ULONG_PTR *)(&(Irp)->Tail.Overlay.DriverContext[2])) +#define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) \ + (*(PKSPIN_LOCK *)&(Irp)->Tail.Overlay.DriverContext[1]) +#define KSPROPERTY_SET_IRP_STORAGE(Irp) \ + (*(const KSPROPERTY_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) +#define KSPROPERTY_ITEM_IRP_STORAGE(Irp) \ + (*(const KSPROPERTY_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) +#define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) \ + (*(PKSATTRIBUTE_LIST *)&(Irp)->Tail.Overlay.DriverContext[2]) + +typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER; + +typedef enum { + KsInvokeOnSuccess = 1, + KsInvokeOnError = 2, + KsInvokeOnCancel = 4 +} KSCOMPLETION_INVOCATION; + +typedef enum { + KsListEntryTail, + KsListEntryHead +} KSLIST_ENTRY_LOCATION; + +typedef enum { + KsAcquireOnly, + KsAcquireAndRemove, + KsAcquireOnlySingleItem, + KsAcquireAndRemoveOnlySingleItem +} KSIRP_REMOVAL_OPERATION; + +typedef enum { + KsStackCopyToNewLocation, + KsStackReuseCurrentLocation, + KsStackUseNewLocation +} KSSTACK_USE; + +typedef enum { + KSTARGET_STATE_DISABLED, + KSTARGET_STATE_ENABLED +} KSTARGET_STATE; + +typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context); +typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context); +typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context); +typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String); + +#define BUS_INTERFACE_REFERENCE_VERSION 0x100 + +typedef struct { + INTERFACE Interface; + + PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; + PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; + PFNQUERYREFERENCESTRING QueryReferenceString; +} BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; + +#define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard +#define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard + +#endif /* _NTDDK_ */ + +#ifndef PACK_PRAGMAS_NOT_SUPPORTED +#include +#endif + +typedef struct { + GUID PropertySet; + ULONG Count; +} KSPROPERTY_SERIALHDR,*PKSPROPERTY_SERIALHDR; + +#ifndef PACK_PRAGMAS_NOT_SUPPORTED +#include +#endif + +typedef struct { + KSIDENTIFIER PropTypeSet; + ULONG Id; + ULONG PropertyLength; +} KSPROPERTY_SERIAL,*PKSPROPERTY_SERIAL; + + +#if defined(_NTDDK_) + +#define IOCTL_KS_HANDSHAKE \ + CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef struct { + GUID ProtocolId; + PVOID Argument1; + PVOID Argument2; +} KSHANDSHAKE, *PKSHANDSHAKE; + +typedef struct _KSGATE KSGATE, *PKSGATE; + +struct _KSGATE { + LONG Count; + PKSGATE NextGate; +}; + +typedef PVOID KSOBJECT_BAG; + + +typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context, + PKSEVENT_ENTRY EventEntry); + +typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device); + +typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp, + PCM_RESOURCE_LIST TranslatedResourceList, + PCM_RESOURCE_LIST UntranslatedResourceList); + +typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device); + +typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp); + +typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp); + +typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp, + PDEVICE_CAPABILITIES Capabilities); + +typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(PKSDEVICE Device,PIRP Irp, + DEVICE_POWER_STATE DeviceTo, + DEVICE_POWER_STATE DeviceFrom, + SYSTEM_POWER_STATE SystemTo, + SYSTEM_POWER_STATE SystemFrom, + POWER_ACTION Action); + +typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp, + DEVICE_POWER_STATE To, + DEVICE_POWER_STATE From); + +typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory); + +typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory, + DEVICE_POWER_STATE State); + +typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp); + +typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter, + PKSPROCESSPIN_INDEXENTRY Index); + +typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter); + +typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State); + +typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp); + +typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState, + KSSTATE FromState); + +typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat, + PKSMULTIPLE_ITEM OldAttributeList, + const KSDATARANGE *DataRange, + const KSATTRIBUTE_LIST *AttributeRange); + +typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In, + PKSHANDSHAKE Out); + +typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin); + +typedef void (*PFNKSPINVOID)(PKSPIN Pin); + +typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State); + +typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer, + LARGE_INTEGER DueTime,PKDPC Dpc); + +typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer); + +typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin, + PLONGLONG SystemTime); + +typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution); + +typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin, + PKSALLOCATOR_FRAMING AllocatorFraming, + PVOID *Context); + +typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer); + + +typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE; + +struct KSAUTOMATION_TABLE_ { + ULONG PropertySetsCount; + ULONG PropertyItemSize; + const KSPROPERTY_SET *PropertySets; + ULONG MethodSetsCount; + ULONG MethodItemSize; + const KSMETHOD_SET *MethodSets; + ULONG EventSetsCount; + ULONG EventItemSize; + const KSEVENT_SET *EventSets; +#ifndef _WIN64 + PVOID Alignment; +#endif +}; + +#define DEFINE_KSAUTOMATION_TABLE(table) \ + const KSAUTOMATION_TABLE table = + +#define DEFINE_KSAUTOMATION_PROPERTIES(table) \ + SIZEOF_ARRAY(table), \ + sizeof(KSPROPERTY_ITEM), \ + table + +#define DEFINE_KSAUTOMATION_METHODS(table) \ + SIZEOF_ARRAY(table), \ + sizeof(KSMETHOD_ITEM), \ + table + +#define DEFINE_KSAUTOMATION_EVENTS(table) \ + SIZEOF_ARRAY(table), \ + sizeof(KSEVENT_ITEM), \ + table + +#define DEFINE_KSAUTOMATION_PROPERTIES_NULL \ + 0, \ + sizeof(KSPROPERTY_ITEM), \ + NULL + +#define DEFINE_KSAUTOMATION_METHODS_NULL \ + 0, \ + sizeof(KSMETHOD_ITEM), \ + NULL + +#define DEFINE_KSAUTOMATION_EVENTS_NULL \ + 0, \ + sizeof(KSEVENT_ITEM), \ + NULL + +#define MIN_DEV_VER_FOR_QI (0x100) + +struct _KSDEVICE_DISPATCH { + PFNKSDEVICECREATE Add; + PFNKSDEVICEPNPSTART Start; + PFNKSDEVICE PostStart; + PFNKSDEVICEIRP QueryStop; + PFNKSDEVICEIRPVOID CancelStop; + PFNKSDEVICEIRPVOID Stop; + PFNKSDEVICEIRP QueryRemove; + PFNKSDEVICEIRPVOID CancelRemove; + PFNKSDEVICEIRPVOID Remove; + PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; + PFNKSDEVICEIRPVOID SurpriseRemoval; + PFNKSDEVICEQUERYPOWER QueryPower; + PFNKSDEVICESETPOWER SetPower; + PFNKSDEVICEIRP QueryInterface; +}; + +struct _KSFILTER_DISPATCH { + PFNKSFILTERIRP Create; + PFNKSFILTERIRP Close; + PFNKSFILTERPROCESS Process; + PFNKSFILTERVOID Reset; +}; + +struct _KSPIN_DISPATCH { + PFNKSPINIRP Create; + PFNKSPINIRP Close; + PFNKSPIN Process; + PFNKSPINVOID Reset; + PFNKSPINSETDATAFORMAT SetDataFormat; + PFNKSPINSETDEVICESTATE SetDeviceState; + PFNKSPIN Connect; + PFNKSPINVOID Disconnect; + const KSCLOCK_DISPATCH *Clock; + const KSALLOCATOR_DISPATCH *Allocator; +}; + +struct _KSCLOCK_DISPATCH { + PFNKSPINSETTIMER SetTimer; + PFNKSPINCANCELTIMER CancelTimer; + PFNKSPINCORRELATEDTIME CorrelatedTime; + PFNKSPINRESOLUTION Resolution; +}; + +struct _KSALLOCATOR_DISPATCH { + PFNKSPININITIALIZEALLOCATOR InitializeAllocator; + PFNKSDELETEALLOCATOR DeleteAllocator; + PFNKSDEFAULTALLOCATE Allocate; + PFNKSDEFAULTFREE Free; +}; + +#define KSDEVICE_DESCRIPTOR_VERSION (0x100) + +struct _KSDEVICE_DESCRIPTOR { + const KSDEVICE_DISPATCH *Dispatch; + ULONG FilterDescriptorsCount; + const KSFILTER_DESCRIPTOR*const *FilterDescriptors; + ULONG Version; +}; + +struct _KSFILTER_DESCRIPTOR { + const KSFILTER_DISPATCH *Dispatch; + const KSAUTOMATION_TABLE *AutomationTable; + ULONG Version; +#define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) + ULONG Flags; +#define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 +#define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 +#define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 +#define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008 +#define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000 + const GUID *ReferenceGuid; + ULONG PinDescriptorsCount; + ULONG PinDescriptorSize; + const KSPIN_DESCRIPTOR_EX *PinDescriptors; + ULONG CategoriesCount; + const GUID *Categories; + ULONG NodeDescriptorsCount; + ULONG NodeDescriptorSize; + const KSNODE_DESCRIPTOR *NodeDescriptors; + ULONG ConnectionsCount; + const KSTOPOLOGY_CONNECTION *Connections; + const KSCOMPONENTID *ComponentId; +}; + +#define DEFINE_KSFILTER_DESCRIPTOR(descriptor) \ + const KSFILTER_DESCRIPTOR descriptor = + +#define DEFINE_KSFILTER_PIN_DESCRIPTORS(table) \ + SIZEOF_ARRAY(table), \ + sizeof(table[0]), \ + table + +#define DEFINE_KSFILTER_CATEGORIES(table) \ + SIZEOF_ARRAY(table), \ + table + +#define DEFINE_KSFILTER_CATEGORY(category) \ + 1, \ + &(category) + +#define DEFINE_KSFILTER_CATEGORIES_NULL \ + 0, \ + NULL + +#define DEFINE_KSFILTER_NODE_DESCRIPTORS(table) \ + SIZEOF_ARRAY(table), \ + sizeof(table[0]), \ + table + +#define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL \ + 0, \ + sizeof(KSNODE_DESCRIPTOR), \ + NULL + +#define DEFINE_KSFILTER_CONNECTIONS(table) \ + SIZEOF_ARRAY(table), \ + table + +#define DEFINE_KSFILTER_DEFAULT_CONNECTIONS \ + 0, \ + NULL + +#define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table) \ + const KSFILTER_DESCRIPTOR*const table[] = + +struct _KSPIN_DESCRIPTOR_EX { + const KSPIN_DISPATCH *Dispatch; + const KSAUTOMATION_TABLE *AutomationTable; + KSPIN_DESCRIPTOR PinDescriptor; + ULONG Flags; +#define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING +#define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING +#define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING +#define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 +#define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 +#define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 +#define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 +#define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 +#define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 +#define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 +#define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 +#define KSPIN_FLAG_SPLITTER 0x00020000 +#define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 +#define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 +#define KSPIN_FLAG_FIXED_FORMAT 0x00100000 +#define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 +#define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) +#define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 +#define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000 +#define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000 +#define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000 + ULONG InstancesPossible; + ULONG InstancesNecessary; + const KSALLOCATOR_FRAMING_EX *AllocatorFraming; + PFNKSINTERSECTHANDLEREX IntersectHandler; +}; + +#define DEFINE_KSPIN_DEFAULT_INTERFACES \ + 0, \ + NULL + +#define DEFINE_KSPIN_DEFAULT_MEDIUMS \ + 0, \ + NULL + +struct _KSNODE_DESCRIPTOR { + const KSAUTOMATION_TABLE *AutomationTable; + const GUID *Type; + const GUID *Name; +#ifndef _WIN64 + PVOID Alignment; +#endif +}; + +#ifndef _WIN64 +#define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ + { (automation), (type), (name), NULL } +#else +#define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ + { (automation), (type), (name) } +#endif + +struct _KSDEVICE { + const KSDEVICE_DESCRIPTOR *Descriptor; + KSOBJECT_BAG Bag; + PVOID Context; + PDEVICE_OBJECT FunctionalDeviceObject; + PDEVICE_OBJECT PhysicalDeviceObject; + PDEVICE_OBJECT NextDeviceObject; + BOOLEAN Started; + SYSTEM_POWER_STATE SystemPowerState; + DEVICE_POWER_STATE DevicePowerState; +}; + +struct _KSFILTERFACTORY { + const KSFILTER_DESCRIPTOR *FilterDescriptor; + KSOBJECT_BAG Bag; + PVOID Context; +}; + +struct _KSFILTER { + const KSFILTER_DESCRIPTOR *Descriptor; + KSOBJECT_BAG Bag; + PVOID Context; +}; + +struct _KSPIN { + const KSPIN_DESCRIPTOR_EX *Descriptor; + KSOBJECT_BAG Bag; + PVOID Context; + ULONG Id; + KSPIN_COMMUNICATION Communication; + BOOLEAN ConnectionIsExternal; + KSPIN_INTERFACE ConnectionInterface; + KSPIN_MEDIUM ConnectionMedium; + KSPRIORITY ConnectionPriority; + PKSDATAFORMAT ConnectionFormat; + PKSMULTIPLE_ITEM AttributeList; + ULONG StreamHeaderSize; + KSPIN_DATAFLOW DataFlow; + KSSTATE DeviceState; + KSRESET ResetState; + KSSTATE ClientState; +}; + +struct _KSMAPPING { + PHYSICAL_ADDRESS PhysicalAddress; + ULONG ByteCount; + ULONG Alignment; +}; + +struct _KSSTREAM_POINTER_OFFSET +{ +#if defined(_NTDDK_) + __MINGW_EXTENSION union { + PUCHAR Data; + PKSMAPPING Mappings; + }; +#else + PUCHAR Data; +#endif /* _NTDDK_ */ +#ifndef _WIN64 + PVOID Alignment; +#endif + ULONG Count; + ULONG Remaining; +}; + +struct _KSSTREAM_POINTER +{ + PVOID Context; + PKSPIN Pin; + PKSSTREAM_HEADER StreamHeader; + PKSSTREAM_POINTER_OFFSET Offset; + KSSTREAM_POINTER_OFFSET OffsetIn; + KSSTREAM_POINTER_OFFSET OffsetOut; +}; + +struct _KSPROCESSPIN { + PKSPIN Pin; + PKSSTREAM_POINTER StreamPointer; + PKSPROCESSPIN InPlaceCounterpart; + PKSPROCESSPIN DelegateBranch; + PKSPROCESSPIN CopySource; + PVOID Data; + ULONG BytesAvailable; + ULONG BytesUsed; + ULONG Flags; + BOOLEAN Terminate; +}; + +struct _KSPROCESSPIN_INDEXENTRY { + PKSPROCESSPIN *Pins; + ULONG Count; +}; + +typedef enum { + KsObjectTypeDevice, + KsObjectTypeFilterFactory, + KsObjectTypeFilter, + KsObjectTypePin +} KSOBJECTTYPE; + + +typedef void (*PFNKSFREE)(PVOID Data); + +typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl, + PVOID Context,NTSTATUS Status); + +typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp); + + +#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) +#ifndef _IKsControl_ +#define _IKsControl_ + +typedef struct IKsControl *PIKSCONTROL; + +#ifndef DEFINE_ABSTRACT_UNKNOWN +#define DEFINE_ABSTRACT_UNKNOWN() \ + STDMETHOD_(NTSTATUS,QueryInterface) (THIS_ \ + REFIID InterfaceId, \ + PVOID *Interface \ + ) PURE; \ + STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ + STDMETHOD_(ULONG,Release)(THIS) PURE; +#endif + +#undef INTERFACE +#define INTERFACE IKsControl +DECLARE_INTERFACE_(IKsControl,IUnknown) +{ + DEFINE_ABSTRACT_UNKNOWN() + STDMETHOD_(NTSTATUS,KsProperty)(THIS_ + PKSPROPERTY Property, + ULONG PropertyLength, + PVOID PropertyData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; + STDMETHOD_(NTSTATUS,KsMethod) (THIS_ + PKSMETHOD Method, + ULONG MethodLength, + PVOID MethodData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; + STDMETHOD_(NTSTATUS,KsEvent) (THIS_ + PKSEVENT Event, + ULONG EventLength, + PVOID EventData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; +}; +typedef struct IKsReferenceClock *PIKSREFERENCECLOCK; + +#undef INTERFACE +#define INTERFACE IKsReferenceClock +DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) +{ + DEFINE_ABSTRACT_UNKNOWN() + STDMETHOD_(LONGLONG,GetTime) (THIS) PURE; + STDMETHOD_(LONGLONG,GetPhysicalTime) (THIS) PURE; + STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ + PLONGLONG SystemTime + ) PURE; + STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ + PLONGLONG SystemTime + ) PURE; + STDMETHOD_(NTSTATUS,GetResolution) (THIS_ + PKSRESOLUTION Resolution + ) PURE; + STDMETHOD_(NTSTATUS,GetState) (THIS_ + PKSSTATE State + ) PURE; +}; +#undef INTERFACE + +#define INTERFACE IKsDeviceFunctions +DECLARE_INTERFACE_(IKsDeviceFunctions,IUnknown) +{ + DEFINE_ABSTRACT_UNKNOWN() + STDMETHOD_(NTSTATUS,RegisterAdapterObjectEx) (THIS_ + PADAPTER_OBJECT AdapterObject, + PDEVICE_DESCRIPTION DeviceDescription, + ULONG NumberOfMapRegisters, + ULONG MaxMappingsByteCount, + ULONG MappingTableStride + ) PURE; +}; + +#undef INTERFACE +#define STATIC_IID_IKsControl \ + 0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUID(IID_IKsControl, + 0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96); +#define STATIC_IID_IKsFastClock \ + 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e +DEFINE_GUID(IID_IKsFastClock, + 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e); +#define STATIC_IID_IKsDeviceFunctions \ + 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd +DEFINE_GUID(IID_IKsDeviceFunctions, + 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd); +#endif /* _IKsControl_ */ +#endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ + +#endif /* _NTDDK_ */ + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _KSDDK_ +#define KSDDKAPI +#else +#define KSDDKAPI DECLSPEC_IMPORT +#endif + +#if defined(_NTDDK_) + +KSDDKAPI NTSTATUS NTAPI KsEnableEvent + (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, + PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, + PVOID EventsLock); + +KSDDKAPI NTSTATUS NTAPI KsEnableEventWithAllocator + (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, + PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, + PVOID EventsLock, PFNKSALLOCATOR Allocator, ULONG EventItemSize); + +KSDDKAPI NTSTATUS NTAPI KsDisableEvent + (PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, + PVOID EventsLock); + +KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry); + +KSDDKAPI VOID NTAPI KsFreeEventList + (PFILE_OBJECT FileObject, PLIST_ENTRY EventsList, + KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); + +KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry); + +KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent + (PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data); + +KSDDKAPI VOID NTAPI KsGenerateEventList + (GUID *Set, ULONG EventId, PLIST_ENTRY EventsList, + KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); + +KSDDKAPI NTSTATUS NTAPI KsPropertyHandler + (PIRP Irp, ULONG PropertySetsCount, + const KSPROPERTY_SET *PropertySet); + +KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator + (PIRP Irp, ULONG PropertySetsCount, + const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator, + ULONG PropertyItemSize); + +KSDDKAPI BOOLEAN NTAPI KsFastPropertyHandler + (PFILE_OBJECT FileObject, PKSPROPERTY Property, + ULONG PropertyLength, PVOID Data, ULONG DataLength, + PIO_STATUS_BLOCK IoStatus, ULONG PropertySetsCount, + const KSPROPERTY_SET *PropertySet); + +KSDDKAPI NTSTATUS NTAPI KsMethodHandler + (PIRP Irp, ULONG MethodSetsCount, + const KSMETHOD_SET *MethodSet); + +KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator + (PIRP Irp, ULONG MethodSetsCount, + const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator, + ULONG MethodItemSize); + +KSDDKAPI BOOLEAN NTAPI KsFastMethodHandler + (PFILE_OBJECT FileObject, PKSMETHOD Method, ULONG MethodLength, + PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus, + ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet); + +KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx + (PIRP Irp, PVOID InitializeContext, + PFNKSDEFAULTALLOCATE DefaultAllocate, + PFNKSDEFAULTFREE DefaultFree, + PFNKSINITIALIZEALLOCATOR InitializeAllocator, + PFNKSDELETEALLOCATOR DeleteAllocator); + +KSDDKAPI NTSTATUS NTAPI KsCreateAllocator + (HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming, + PHANDLE AllocatorHandle); + +KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest + (PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming); + +KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx + (PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize, + const KSALLOCATOR_FRAMING_EX *PinFraming); + +KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock); + +KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx + (PKSDEFAULTCLOCK *DefaultClock, PVOID Context, + PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer, + PFNKSCORRELATEDTIME CorrelatedTime, + const KSRESOLUTION *Resolution, ULONG Flags); + +KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock); +KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock); + +KSDDKAPI NTSTATUS NTAPI KsCreateClock + (HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate, + PHANDLE ClockHandle); + +KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest + (PIRP Irp, PKSCLOCK_CREATE *ClockCreate); + +KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock); +KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State); +KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock); +KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time); + +KSDDKAPI NTSTATUS NTAPI KsCreatePin + (HANDLE FilterHandle, PKSPIN_CONNECT Connect, + ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle); + +KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest + (PIRP Irp, ULONG DescriptorsCount, + const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect); + +KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler + (PIRP Irp, PKSPROPERTY Property, PVOID Data, + ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor); + +KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection + (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, + const KSPIN_DESCRIPTOR *Descriptor, + PFNKSINTERSECTHANDLER IntersectHandler); + +KSDDKAPI NTSTATUS NTAPI KsPinDataIntersectionEx + (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, + const KSPIN_DESCRIPTOR *Descriptor, ULONG DescriptorSize, + PFNKSINTERSECTHANDLEREX IntersectHandler, PVOID HandlerContext); + +KSDDKAPI NTSTATUS NTAPI KsHandleSizedListQuery + (PIRP Irp, ULONG DataItemsCount, ULONG DataItemSize, + const VOID *DataItems); + +#ifndef MAKEINTRESOURCE +#define MAKEINTRESOURCE(r) ((ULONG_PTR) (USHORT) r) +#endif +#ifndef RT_STRING +#define RT_STRING MAKEINTRESOURCE(6) +#define RT_RCDATA MAKEINTRESOURCE(10) +#endif + +KSDDKAPI NTSTATUS NTAPI KsLoadResource + (PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName, + ULONG ResourceType, PVOID *Resource, PULONG ResourceSize); + +KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId + (HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId, + PULONG ValueType); + +KSDDKAPI NTSTATUS NTAPI KsMapModuleName + (PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName, + PUNICODE_STRING ImageName, PULONG_PTR ResourceId, + PULONG ValueType); + +KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header); +KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header); +KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); +KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); +KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler); +KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler); + +KSDDKAPI NTSTATUS NTAPI KsReadFile + (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, + PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, + ULONG Key, KPROCESSOR_MODE RequestorMode); + +KSDDKAPI NTSTATUS NTAPI KsWriteFile + (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, + PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, + ULONG Key, KPROCESSOR_MODE RequestorMode); + +KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile + (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass); + +KSDDKAPI NTSTATUS NTAPI KsSetInformationFile + (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass); + +KSDDKAPI NTSTATUS NTAPI KsStreamIo + (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, + PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext, + KSCOMPLETION_INVOCATION CompletionInvocationFlags, + PIO_STATUS_BLOCK IoStatusBlock, PVOID StreamHeaders, ULONG Length, + ULONG Flags, KPROCESSOR_MODE RequestorMode); + +KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize); +KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer); +KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject); + +KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler + (PDRIVER_OBJECT DriverObject, ULONG MajorFunction); + +KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest + (PDEVICE_OBJECT DeviceObject, PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion + (PDEVICE_OBJECT DeviceObject, PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); + +KSDDKAPI BOOLEAN NTAPI KsDispatchFastIoDeviceControlFailure + (PFILE_OBJECT FileObject, BOOLEAN Wait, PVOID InputBuffer, + ULONG InputBufferLength, PVOID OutputBuffer, + ULONG OutputBufferLength, ULONG IoControlCode, + PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); + +KSDDKAPI BOOLEAN NTAPI KsDispatchFastReadFailure + (PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, + ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, + PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); + +#define KsDispatchFastWriteFailure KsDispatchFastReadFailure + +KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp); +KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock); +KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel); + +KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue + (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, + KSLIST_ENTRY_LOCATION ListLocation, + KSIRP_REMOVAL_OPERATION RemovalOperation); + +KSDDKAPI NTSTATUS NTAPI KsMoveIrpsOnCancelableQueue + (PLIST_ENTRY SourceList, PKSPIN_LOCK SourceLock, + PLIST_ENTRY DestinationList, PKSPIN_LOCK DestinationLock, + KSLIST_ENTRY_LOCATION ListLocation, + PFNKSIRPLISTCALLBACK ListCallback, PVOID Context); + +KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp); + +KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue + (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp, + KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel); + +KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue); + +KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler + (PIRP Irp, PKSPROPERTY Property, PVOID Data, + const KSTOPOLOGY *Topology); + +KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive); +KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header); +KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp); +KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp); +KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); + +KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject + (KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject, + PDEVICE_OBJECT BaseObject); + +KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header); +KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header); + +KSDDKAPI VOID NTAPI KsRecalculateStackDepth + (KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation); + +KSDDKAPI VOID NTAPI KsSetTargetState + (KSOBJECT_HEADER Header, KSTARGET_STATE TargetState); + +KSDDKAPI VOID NTAPI KsSetTargetDeviceObject + (KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice); + +KSDDKAPI VOID NTAPI KsSetPowerDispatch + (KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch, + PVOID PowerContext); + +KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header); + +KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader + (KSDEVICE_HEADER *Header, ULONG ItemsCount, + PKSOBJECT_CREATE_ITEM ItemsList); + +KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header); + +KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader + (KSOBJECT_HEADER *Header, ULONG ItemsCount, + PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp, + const KSDISPATCH_TABLE *Table); + +KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header); + +KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader + (KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, + PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); + +KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader + (KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, + PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); + +KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem + (KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem, + BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback); + +KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem + (KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem); + +KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext + (KSDEVICE_HEADER Header, PVOID Context); + +KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity + (PSECURITY_DESCRIPTOR ParentSecurity, + PSECURITY_DESCRIPTOR *DefaultSecurity); + +KSDDKAPI NTSTATUS NTAPI KsForwardIrp + (PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation); + +KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp + (PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject, + KSSTACK_USE StackUse); + +KSDDKAPI NTSTATUS NTAPI KsSynchronousIoControlDevice + (PFILE_OBJECT FileObject, KPROCESSOR_MODE RequestorMode, + ULONG IoControl, PVOID InBuffer, ULONG InSize, PVOID OutBuffer, + ULONG OutSize, PULONG BytesReturned); + +KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry + (PFILE_OBJECT FileObject, HANDLE ParentKey, + PUNICODE_STRING RegistryPath); + +KSDDKAPI NTSTATUS NTAPI KsCacheMedium + (PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium, + ULONG PinDirection); + +KSDDKAPI NTSTATUS NTAPI KsRegisterWorker + (WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker); + +KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker + (WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem, + PKSWORKER *Worker); + +KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker); +KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem); +KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker); +KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker); + +KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode + (HANDLE ParentHandle, PKSNODE_CREATE NodeCreate, + ACCESS_MASK DesiredAccess, PHANDLE NodeHandle); + +KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest + (PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate); + +KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables + (PKSAUTOMATION_TABLE *AutomationTableAB, + PKSAUTOMATION_TABLE AutomationTableA, + PKSAUTOMATION_TABLE AutomationTableB, + KSOBJECT_BAG Bag); + +KSDDKAPI NTSTATUS NTAPI KsInitializeDriver + (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName, + const KSDEVICE_DESCRIPTOR *Descriptor); + +KSDDKAPI NTSTATUS NTAPI KsAddDevice + (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject); + +KSDDKAPI NTSTATUS NTAPI KsCreateDevice + (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject, + const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize, + PKSDEVICE *Device); + +KSDDKAPI NTSTATUS NTAPI KsInitializeDevice + (PDEVICE_OBJECT FunctionalDeviceObject, + PDEVICE_OBJECT PhysicalDeviceObject, + PDEVICE_OBJECT NextDeviceObject, + const KSDEVICE_DESCRIPTOR *Descriptor); + +KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject); +KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject); +KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device); +KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device); + +KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject + (PKSDEVICE Device, PADAPTER_OBJECT AdapterObject, + ULONG MaxMappingsByteCount, ULONG MappingTableStride); + +KSDDKAPI ULONG NTAPI KsDeviceGetBusData + (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, + ULONG Length); + +KSDDKAPI ULONG NTAPI KsDeviceSetBusData + (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, + ULONG Length); + +KSDDKAPI NTSTATUS NTAPI KsCreateFilterFactory + (PDEVICE_OBJECT DeviceObject, const KSFILTER_DESCRIPTOR *Descriptor, + PWSTR RefString, PSECURITY_DESCRIPTOR SecurityDescriptor, + ULONG CreateItemFlags, PFNKSFILTERFACTORYPOWER SleepCallback, + PFNKSFILTERFACTORYPOWER WakeCallback, + PKSFILTERFACTORY *FilterFactory); + +#define KsDeleteFilterFactory(FilterFactory) \ + KsFreeObjectCreateItemsByContext( *(KSDEVICE_HEADER *)( \ + KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->DeviceExtension),\ + FilterFactory) + +KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData + (PKSFILTERFACTORY FilterFactory, + const KSFILTER_DESCRIPTOR *FilterDescriptor); + +KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem + (PKSFILTERFACTORY FilterFactory, PWSTR RefString, + PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags); + +KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState + (PKSFILTERFACTORY FilterFactory, BOOLEAN NewState); + +KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink + (PKSFILTERFACTORY FilterFactory); + +KSDDKAPI void NTAPI KsAddEvent(PVOID Object, PKSEVENT_ENTRY EventEntry); + +void __forceinline KsFilterAddEvent (PKSFILTER Filter, PKSEVENT_ENTRY EventEntry) +{ + KsAddEvent(Filter, EventEntry); +} + +void __forceinline KsPinAddEvent (PKSPIN Pin, PKSEVENT_ENTRY EventEntry) +{ + KsAddEvent(Pin, EventEntry); +} + +KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler + (PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry); + +KSDDKAPI void NTAPI KsGenerateEvents + (PVOID Object, const GUID *EventSet, ULONG EventId, + ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, + PVOID CallBackContext); + +void __forceinline KsFilterGenerateEvents + (PKSFILTER Filter, const GUID *EventSet, ULONG EventId, + ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, + PVOID CallBackContext) +{ + KsGenerateEvents(Filter, EventSet, EventId, DataSize, Data, CallBack, + CallBackContext); +} + +void __forceinline KsPinGenerateEvents + (PKSPIN Pin, const GUID *EventSet, ULONG EventId, + ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, + PVOID CallBackContext) +{ + KsGenerateEvents(Pin, EventSet, EventId, DataSize, Data, CallBack, + CallBackContext); +} + +typedef enum { + KSSTREAM_POINTER_STATE_UNLOCKED = 0, + KSSTREAM_POINTER_STATE_LOCKED +} KSSTREAM_POINTER_STATE; + +KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount + (PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes); + +KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer + (PKSPIN Pin, KSSTREAM_POINTER_STATE State); + +KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer + (PKSPIN Pin, KSSTREAM_POINTER_STATE State); + +KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode + (PKSSTREAM_POINTER StreamPointer, NTSTATUS Status); + +KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer); +KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject); + +KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock + (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, + BOOLEAN Eject); + +KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer); + +KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone + (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback, + ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer); + +KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets + (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, + BOOLEAN Eject); + +KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer); +KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer); + +KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp + (PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp, + PBOOLEAN LastFrameInIrp); + +KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout + (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback, + ULONGLONG Interval); + +KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer); +KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin); + +KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone + (PKSSTREAM_POINTER StreamPointer); + +KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out); +KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp); +KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp); +KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject); +KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromFileObject (PFILE_OBJECT FileObject); + +PKSFILTER __forceinline KsGetFilterFromFileObject (PFILE_OBJECT FileObject) +{ + return (PKSFILTER) KsGetObjectFromFileObject(FileObject); +} + +PKSPIN __forceinline KsGetPinFromFileObject (PFILE_OBJECT FileObject) +{ + return (PKSPIN) KsGetObjectFromFileObject(FileObject); +} + +KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter); +KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter); +KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter); +KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous); +KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin); +KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate); +KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate); +KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin); +KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin); +KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin); + +KSDDKAPI void NTAPI KsPinGetCopyRelationships + (PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch); + +KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous); +KSDDKAPI PVOID NTAPI KsGetParent (PVOID Object); + +PKSDEVICE __forceinline KsFilterFactoryGetParentDevice (PKSFILTERFACTORY FilterFactory) +{ + return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); +} + +PKSFILTERFACTORY __forceinline KsFilterGetParentFilterFactory (PKSFILTER Filter) +{ + return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); +} + +KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin); +KSDDKAPI PVOID NTAPI KsGetFirstChild (PVOID Object); + +PKSFILTERFACTORY __forceinline KsDeviceGetFirstChildFilterFactory (PKSDEVICE Device) +{ + return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device); +} + +PKSFILTER __forceinline KsFilterFactoryGetFirstChildFilter (PKSFILTERFACTORY FilterFactory) +{ + return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory); +} + +KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId); +KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId); +KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object); +KSDDKAPI PKSPIN NTAPI KsPinGetNextSiblingPin (PKSPIN Pin); + +PKSFILTERFACTORY __forceinline KsFilterFactoryGetNextSiblingFilterFactory + (PKSFILTERFACTORY FilterFactory) +{ + return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory); +} + +PKSFILTER __forceinline KsFilterGetNextSiblingFilter (PKSFILTER Filter) +{ + return (PKSFILTER) KsGetNextSibling((PVOID) Filter); +} + +KSDDKAPI PKSDEVICE NTAPI KsGetDevice (PVOID Object); + +PKSDEVICE __forceinline KsFilterFactoryGetDevice (PKSFILTERFACTORY FilterFactory) +{ + return KsGetDevice((PVOID) FilterFactory); +} + +PKSDEVICE __forceinline KsFilterGetDevice (PKSFILTER Filter) +{ + return KsGetDevice((PVOID) Filter); +} + +PKSDEVICE __forceinline KsPinGetDevice (PKSPIN Pin) +{ + return KsGetDevice((PVOID) Pin); +} + +KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp); +KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp); +KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp); +KSDDKAPI void NTAPI KsAcquireControl (PVOID Object); +KSDDKAPI void NTAPI KsReleaseControl (PVOID Object); + +void __forceinline KsFilterAcquireControl (PKSFILTER Filter) +{ + KsAcquireControl((PVOID) Filter); +} + +void __forceinline KsFilterReleaseControl (PKSFILTER Filter) +{ + KsReleaseControl((PVOID) Filter); +} + +void __forceinline KsPinAcquireControl (PKSPIN Pin) +{ + KsAcquireControl((PVOID) Pin); +} + +void __forceinline KsPinReleaseControl (PKSPIN Pin) +{ + KsReleaseControl((PVOID) Pin); +} + +KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag + (KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free); + +KSDDKAPI ULONG NTAPI KsRemoveItemFromObjectBag + (KSOBJECT_BAG ObjectBag, PVOID Item, BOOLEAN Free); + +#define KsDiscard(Object,Pointer) \ + KsRemoveItemFromObjectBag((Object)->Bag, (PVOID)(Pointer), TRUE) + +KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag); +KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag); + +KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems + (KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource); + +KSDDKAPI NTSTATUS NTAPI _KsEdit + (KSOBJECT_BAG ObjectBag, PVOID *PointerToPointerToItem, + ULONG NewSize, ULONG OldSize, ULONG Tag); + +#define KsEdit(Object, PointerToPointer, Tag) \ + _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), \ + sizeof(**(PointerToPointer)), sizeof(**(PointerToPointer)), (Tag)) + +#define KsEditSized(Object, PointerToPointer, NewSize, OldSize, Tag) \ + _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), (NewSize), (OldSize), (Tag)) + +KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins + (PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID, + ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList, + GUID *CategoryList); + +KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory + (PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor, + PULONG PinID); + +KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode + (PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor, + PULONG NodeID); + +KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections + (PKSFILTER Filter, ULONG NewConnectionsCount, + const KSTOPOLOGY_CONNECTION *const NewTopologyConnections); + +KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface + (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); + +KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin); +KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin); + +KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface + (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); + +#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) +KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface + (PKSPIN Pin, PIKSREFERENCECLOCK *Interface); +#endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ + +KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time); + +KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame + (PKSPIN Pin, PVOID Data, ULONG Size, + PKSSTREAM_HEADER StreamHeader, PVOID Context); + +KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl + (PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader, + PVOID Context); + +KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback + (PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn); + +KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback + (PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion); + +KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback + (PKSPIN Pin, PFNKSPINHANDSHAKE Handshake); + +KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks + (PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake); + +KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks + (PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake); + +#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) +KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown + (PVOID Object, PUNKNOWN ClientUnknown); + +KSDDKAPI PUNKNOWN NTAPI KsGetOuterUnknown (PVOID Object); + +PUNKNOWN __forceinline KsDeviceRegisterAggregatedClientUnknown + (PKSDEVICE Device, PUNKNOWN ClientUnknown) +{ + return KsRegisterAggregatedClientUnknown((PVOID)Device, ClientUnknown); +} + +PUNKNOWN __forceinline KsDeviceGetOuterUnknown (PKSDEVICE Device) +{ + return KsGetOuterUnknown((PVOID) Device); +} + +PUNKNOWN __forceinline KsFilterFactoryRegisterAggregatedClientUnknown + (PKSFILTERFACTORY FilterFactory, PUNKNOWN ClientUnknown) +{ + return KsRegisterAggregatedClientUnknown((PVOID)FilterFactory, ClientUnknown); +} + +PUNKNOWN __forceinline KsFilterFactoryGetOuterUnknown (PKSFILTERFACTORY FilterFactory) +{ + return KsGetOuterUnknown((PVOID)FilterFactory); +} + +PUNKNOWN __forceinline KsFilterRegisterAggregatedClientUnknown + (PKSFILTER Filter, PUNKNOWN ClientUnknown) +{ + return KsRegisterAggregatedClientUnknown((PVOID)Filter, ClientUnknown); +} + +PUNKNOWN __forceinline KsFilterGetOuterUnknown (PKSFILTER Filter) +{ + return KsGetOuterUnknown((PVOID)Filter); +} + +PUNKNOWN __forceinline KsPinRegisterAggregatedClientUnknown + (PKSPIN Pin, PUNKNOWN ClientUnknown) +{ + return KsRegisterAggregatedClientUnknown((PVOID)Pin, ClientUnknown); +} + +PUNKNOWN __forceinline KsPinGetOuterUnknown (PKSPIN Pin) +{ + return KsGetOuterUnknown((PVOID)Pin); +} +#endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ + +#else /* _NTDDK_ */ + +#ifndef KS_NO_CREATE_FUNCTIONS +KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle); +KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle); +KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle); +KSDDKAPI DWORD WINAPI KsCreateTopologyNode(HANDLE ParentHandle,PKSNODE_CREATE NodeCreate,ACCESS_MASK DesiredAccess,PHANDLE NodeHandle); +#endif + +#endif /* _NTDDK_ */ + +#ifdef __cplusplus +} +#endif + +#define DENY_USERMODE_ACCESS(pIrp,CompleteRequest) \ + if(pIrp->RequestorMode!=KernelMode) { \ + pIrp->IoStatus.Information = 0; \ + pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; \ + if(CompleteRequest) \ + IoCompleteRequest (pIrp,IO_NO_INCREMENT); \ + return STATUS_INVALID_DEVICE_REQUEST; \ + } + +#endif /* _KS_ */ + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksguid.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksguid.h new file mode 100644 index 0000000000..f0774d06ce --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksguid.h @@ -0,0 +1,28 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#define INITGUID +#include + +#ifndef DECLSPEC_SELECTANY +#define DECLSPEC_SELECTANY __declspec(selectany) +#endif + +#ifdef DEFINE_GUIDEX +#undef DEFINE_GUIDEX +#endif + +#ifdef __cplusplus +#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID DECLSPEC_SELECTANY name = { STATICGUIDOF(name) } +#else +#define DEFINE_GUIDEX(name) const CDECL GUID DECLSPEC_SELECTANY name = { STATICGUIDOF(name) } +#endif +#ifndef STATICGUIDOF +#define STATICGUIDOF(guid) STATIC_##guid +#endif + +#ifndef DEFINE_WAVEFORMATEX_GUID +#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x),0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +#endif diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksmedia.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksmedia.h new file mode 100644 index 0000000000..2242c1e03a --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksmedia.h @@ -0,0 +1,4551 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#if !defined(_KS_) +#warning ks.h must be included before ksmedia.h +#include "ks.h" +#endif + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#if !defined(_KSMEDIA_) +#define _KSMEDIA_ + +typedef struct { + KSPROPERTY Property; + KSMULTIPLE_ITEM MultipleItem; +} KSMULTIPLE_DATA_PROP,*PKSMULTIPLE_DATA_PROP; + +#define STATIC_KSMEDIUMSETID_MidiBus \ + 0x05908040L,0x3246,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("05908040-3246-11D0-A5D6-28DB04C10000",KSMEDIUMSETID_MidiBus); +#define KSMEDIUMSETID_MidiBus DEFINE_GUIDNAMED(KSMEDIUMSETID_MidiBus) + +#define STATIC_KSMEDIUMSETID_VPBus \ + 0xA18C15ECL,0xCE43,0x11D0,0xAB,0xE7,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("A18C15EC-CE43-11D0-ABE7-00A0C9223196",KSMEDIUMSETID_VPBus); +#define KSMEDIUMSETID_VPBus DEFINE_GUIDNAMED(KSMEDIUMSETID_VPBus) + +#define STATIC_KSINTERFACESETID_Media \ + 0x3A13EB40L,0x30A7,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("3A13EB40-30A7-11D0-A5D6-28DB04C10000",KSINTERFACESETID_Media); +#define KSINTERFACESETID_Media DEFINE_GUIDNAMED(KSINTERFACESETID_Media) + +typedef enum { + KSINTERFACE_MEDIA_MUSIC, + KSINTERFACE_MEDIA_WAVE_BUFFERED, + KSINTERFACE_MEDIA_WAVE_QUEUED +} KSINTERFACE_MEDIA; + +#ifndef INIT_USBAUDIO_MID +#define INIT_USBAUDIO_MID(guid,id) \ +{ \ + (guid)->Data1 = 0x4e1cecd2 + (USHORT)(id); \ + (guid)->Data2 = 0x1679; \ + (guid)->Data3 = 0x463b; \ + (guid)->Data4[0] = 0xa7; \ + (guid)->Data4[1] = 0x2f; \ + (guid)->Data4[2] = 0xa5; \ + (guid)->Data4[3] = 0xbf; \ + (guid)->Data4[4] = 0x64; \ + (guid)->Data4[5] = 0xc8; \ + (guid)->Data4[6] = 0x6e; \ + (guid)->Data4[7] = 0xba; \ +} +#define EXTRACT_USBAUDIO_MID(guid) \ + (USHORT)((guid)->Data1 - 0x4e1cecd2) +#define DEFINE_USBAUDIO_MID_GUID(id) \ + 0x4e1cecd2+(USHORT)(id),0x1679,0x463b,0xa7,0x2f,0xa5,0xbf,0x64,0xc8,0x6e,0xba +#define IS_COMPATIBLE_USBAUDIO_MID(guid) \ + (((guid)->Data1 >= 0x4e1cecd2) && \ + ((guid)->Data1 < 0x4e1cecd2 + 0xffff) && \ + ((guid)->Data2 == 0x1679) && \ + ((guid)->Data3 == 0x463b) && \ + ((guid)->Data4[0] == 0xa7) && \ + ((guid)->Data4[1] == 0x2f) && \ + ((guid)->Data4[2] == 0xa5) && \ + ((guid)->Data4[3] == 0xbf) && \ + ((guid)->Data4[4] == 0x64) && \ + ((guid)->Data4[5] == 0xc8) && \ + ((guid)->Data4[6] == 0x6e) && \ + ((guid)->Data4[7] == 0xba) ) +#endif /* INIT_USBAUDIO_MID */ + +#ifndef INIT_USBAUDIO_PID +#define INIT_USBAUDIO_PID(guid,id) \ +{ \ + (guid)->Data1 = 0xabcc5a5e + (USHORT)(id); \ + (guid)->Data2 = 0xc263; \ + (guid)->Data3 = 0x463b; \ + (guid)->Data4[0] = 0xa7; \ + (guid)->Data4[1] = 0x2f; \ + (guid)->Data4[2] = 0xa5; \ + (guid)->Data4[3] = 0xbf; \ + (guid)->Data4[4] = 0x64; \ + (guid)->Data4[5] = 0xc8; \ + (guid)->Data4[6] = 0x6e; \ + (guid)->Data4[7] = 0xba; \ +} +#define EXTRACT_USBAUDIO_PID(guid) \ + (USHORT)((guid)->Data1 - 0xabcc5a5e) +#define DEFINE_USBAUDIO_PID_GUID(id) \ + 0xabcc5a5e+(USHORT)(id),0xc263,0x463b,0xa7,0x2f,0xa5,0xbf,0x64,0xc8,0x6e,0xba +#define IS_COMPATIBLE_USBAUDIO_PID(guid) \ + (((guid)->Data1 >= 0xabcc5a5e) && \ + ((guid)->Data1 < 0xabcc5a5e + 0xffff) && \ + ((guid)->Data2 == 0xc263) && \ + ((guid)->Data3 == 0x463b) && \ + ((guid)->Data4[0] == 0xa7) && \ + ((guid)->Data4[1] == 0x2f) && \ + ((guid)->Data4[2] == 0xa5) && \ + ((guid)->Data4[3] == 0xbf) && \ + ((guid)->Data4[4] == 0x64) && \ + ((guid)->Data4[5] == 0xc8) && \ + ((guid)->Data4[6] == 0x6e) && \ + ((guid)->Data4[7] == 0xba) ) +#endif /* INIT_USBAUDIO_PID */ + +#ifndef INIT_USBAUDIO_PRODUCT_NAME +#define INIT_USBAUDIO_PRODUCT_NAME(guid,vid,pid,strIndex) \ +{ \ + (guid)->Data1 = 0XFC575048 + (USHORT)(vid); \ + (guid)->Data2 = 0x2E08 + (USHORT)(pid); \ + (guid)->Data3 = 0x463B + (USHORT)(strIndex); \ + (guid)->Data4[0] = 0xA7; \ + (guid)->Data4[1] = 0x2F; \ + (guid)->Data4[2] = 0xA5; \ + (guid)->Data4[3] = 0xBF; \ + (guid)->Data4[4] = 0x64; \ + (guid)->Data4[5] = 0xC8; \ + (guid)->Data4[6] = 0x6E; \ + (guid)->Data4[7] = 0xBA; \ +} +#define DEFINE_USBAUDIO_PRODUCT_NAME(vid,pid,strIndex) \ + 0xFC575048+(USHORT)(vid),0x2E08+(USHORT)(pid),0x463B+(USHORT)(strIndex),0xA7,0x2F,0xA5,0xBF,0x64,0xC8,0x6E,0xBA +#endif /* INIT_USBAUDIO_PRODUCT_NAME */ + +#define STATIC_KSCOMPONENTID_USBAUDIO \ + 0x8F1275F0,0x26E9,0x4264,0xBA,0x4D,0x39,0xFF,0xF0,0x1D,0x94,0xAA +DEFINE_GUIDSTRUCT("8F1275F0-26E9-4264-BA4D-39FFF01D94AA",KSCOMPONENTID_USBAUDIO); +#define KSCOMPONENTID_USBAUDIO DEFINE_GUIDNAMED(KSCOMPONENTID_USBAUDIO) + +#define INIT_USB_TERMINAL(guid,id) \ +{ \ + (guid)->Data1 = 0xDFF219E0 + (USHORT)(id); \ + (guid)->Data2 = 0xF70F; \ + (guid)->Data3 = 0x11D0; \ + (guid)->Data4[0] = 0xb9; \ + (guid)->Data4[1] = 0x17; \ + (guid)->Data4[2] = 0x00; \ + (guid)->Data4[3] = 0xa0; \ + (guid)->Data4[4] = 0xc9; \ + (guid)->Data4[5] = 0x22; \ + (guid)->Data4[6] = 0x31; \ + (guid)->Data4[7] = 0x96; \ +} +#define EXTRACT_USB_TERMINAL(guid) \ + (USHORT)((guid)->Data1 - 0xDFF219E0) +#define DEFINE_USB_TERMINAL_GUID(id) \ + 0xDFF219E0+(USHORT)(id),0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#define STATIC_KSNODETYPE_MICROPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0201) +DEFINE_GUIDSTRUCT("DFF21BE1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_MICROPHONE); +#define KSNODETYPE_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE) + +#define STATIC_KSNODETYPE_DESKTOP_MICROPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0202) +DEFINE_GUIDSTRUCT("DFF21BE2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DESKTOP_MICROPHONE); +#define KSNODETYPE_DESKTOP_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_MICROPHONE) + +#define STATIC_KSNODETYPE_PERSONAL_MICROPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0203) +DEFINE_GUIDSTRUCT("DFF21BE3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_PERSONAL_MICROPHONE); +#define KSNODETYPE_PERSONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_PERSONAL_MICROPHONE) + +#define STATIC_KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0204) +DEFINE_GUIDSTRUCT("DFF21BE4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE); +#define KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE DEFINE_GUIDNAMED(KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE) + +#define STATIC_KSNODETYPE_MICROPHONE_ARRAY \ + DEFINE_USB_TERMINAL_GUID(0x0205) +DEFINE_GUIDSTRUCT("DFF21BE5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_MICROPHONE_ARRAY); +#define KSNODETYPE_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_MICROPHONE_ARRAY) + +#define STATIC_KSNODETYPE_PROCESSING_MICROPHONE_ARRAY \ + DEFINE_USB_TERMINAL_GUID(0x0206) +DEFINE_GUIDSTRUCT("DFF21BE6-F70F-11D0-B917-00A0C9223196",KSNODETYPE_PROCESSING_MICROPHONE_ARRAY); +#define KSNODETYPE_PROCESSING_MICROPHONE_ARRAY DEFINE_GUIDNAMED(KSNODETYPE_PROCESSING_MICROPHONE_ARRAY) + +#define STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR \ + 0x830a44f2,0xa32d,0x476b,0xbe,0x97,0x42,0x84,0x56,0x73,0xb3,0x5a +DEFINE_GUIDSTRUCT("830a44f2-a32d-476b-be97-42845673b35a",KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR); +#define KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR DEFINE_GUIDNAMED(KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR) + +#define STATIC_KSNODETYPE_SPEAKER \ + DEFINE_USB_TERMINAL_GUID(0x0301) +DEFINE_GUIDSTRUCT("DFF21CE1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_SPEAKER); +#define KSNODETYPE_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_SPEAKER) + +#define STATIC_KSNODETYPE_HEADPHONES \ + DEFINE_USB_TERMINAL_GUID(0x0302) +DEFINE_GUIDSTRUCT("DFF21CE2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_HEADPHONES); +#define KSNODETYPE_HEADPHONES DEFINE_GUIDNAMED(KSNODETYPE_HEADPHONES) + +#define STATIC_KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x0303) +DEFINE_GUIDSTRUCT("DFF21CE3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO); +#define KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO) + +#define STATIC_KSNODETYPE_DESKTOP_SPEAKER \ + DEFINE_USB_TERMINAL_GUID(0x0304) +DEFINE_GUIDSTRUCT("DFF21CE4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DESKTOP_SPEAKER); +#define KSNODETYPE_DESKTOP_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_DESKTOP_SPEAKER) + +#define STATIC_KSNODETYPE_ROOM_SPEAKER \ + DEFINE_USB_TERMINAL_GUID(0x0305) +DEFINE_GUIDSTRUCT("DFF21CE5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_ROOM_SPEAKER); +#define KSNODETYPE_ROOM_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_ROOM_SPEAKER) + +#define STATIC_KSNODETYPE_COMMUNICATION_SPEAKER \ + DEFINE_USB_TERMINAL_GUID(0x0306) +DEFINE_GUIDSTRUCT("DFF21CE6-F70F-11D0-B917-00A0C9223196",KSNODETYPE_COMMUNICATION_SPEAKER); +#define KSNODETYPE_COMMUNICATION_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_COMMUNICATION_SPEAKER) + +#define STATIC_KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER \ + DEFINE_USB_TERMINAL_GUID(0x0307) +DEFINE_GUIDSTRUCT("DFF21CE7-F70F-11D0-B917-00A0C9223196",KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER); +#define KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER) + +#define STATIC_KSNODETYPE_HANDSET \ + DEFINE_USB_TERMINAL_GUID(0x0401) +DEFINE_GUIDSTRUCT("DFF21DE1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_HANDSET); +#define KSNODETYPE_HANDSET DEFINE_GUIDNAMED(KSNODETYPE_HANDSET) + +#define STATIC_KSNODETYPE_HEADSET \ + DEFINE_USB_TERMINAL_GUID(0x0402) +DEFINE_GUIDSTRUCT("DFF21DE2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_HEADSET); +#define KSNODETYPE_HEADSET DEFINE_GUIDNAMED(KSNODETYPE_HEADSET) + +#define STATIC_KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION \ + DEFINE_USB_TERMINAL_GUID(0x0403) +DEFINE_GUIDSTRUCT("DFF21DE3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION); +#define KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION DEFINE_GUIDNAMED(KSNODETYPE_SPEAKERPHONE_NO_ECHO_REDUCTION) + +#define STATIC_KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0404) +DEFINE_GUIDSTRUCT("DFF21DE4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE); +#define KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_SUPPRESSING_SPEAKERPHONE) + +#define STATIC_KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0405) +DEFINE_GUIDSTRUCT("DFF21DE5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE); +#define KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE DEFINE_GUIDNAMED(KSNODETYPE_ECHO_CANCELING_SPEAKERPHONE) + +#define STATIC_KSNODETYPE_PHONE_LINE \ + DEFINE_USB_TERMINAL_GUID(0x0501) +DEFINE_GUIDSTRUCT("DFF21EE1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_PHONE_LINE); +#define KSNODETYPE_PHONE_LINE DEFINE_GUIDNAMED(KSNODETYPE_PHONE_LINE) + +#define STATIC_KSNODETYPE_TELEPHONE \ + DEFINE_USB_TERMINAL_GUID(0x0502) +DEFINE_GUIDSTRUCT("DFF21EE2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_TELEPHONE); +#define KSNODETYPE_TELEPHONE DEFINE_GUIDNAMED(KSNODETYPE_TELEPHONE) + +#define STATIC_KSNODETYPE_DOWN_LINE_PHONE \ + DEFINE_USB_TERMINAL_GUID(0x0503) +DEFINE_GUIDSTRUCT("DFF21EE3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DOWN_LINE_PHONE); +#define KSNODETYPE_DOWN_LINE_PHONE DEFINE_GUIDNAMED(KSNODETYPE_DOWN_LINE_PHONE) + +#define STATIC_KSNODETYPE_ANALOG_CONNECTOR \ + DEFINE_USB_TERMINAL_GUID(0x601) +DEFINE_GUIDSTRUCT("DFF21FE1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_ANALOG_CONNECTOR); +#define KSNODETYPE_ANALOG_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_CONNECTOR) + +#define STATIC_KSNODETYPE_DIGITAL_AUDIO_INTERFACE \ + DEFINE_USB_TERMINAL_GUID(0x0602) +DEFINE_GUIDSTRUCT("DFF21FE2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DIGITAL_AUDIO_INTERFACE); +#define KSNODETYPE_DIGITAL_AUDIO_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_DIGITAL_AUDIO_INTERFACE) + +#define STATIC_KSNODETYPE_LINE_CONNECTOR \ + DEFINE_USB_TERMINAL_GUID(0x0603) +DEFINE_GUIDSTRUCT("DFF21FE3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_LINE_CONNECTOR); +#define KSNODETYPE_LINE_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LINE_CONNECTOR) + +#define STATIC_KSNODETYPE_LEGACY_AUDIO_CONNECTOR \ + DEFINE_USB_TERMINAL_GUID(0x0604) +DEFINE_GUIDSTRUCT("DFF21FE4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_LEGACY_AUDIO_CONNECTOR); +#define KSNODETYPE_LEGACY_AUDIO_CONNECTOR DEFINE_GUIDNAMED(KSNODETYPE_LEGACY_AUDIO_CONNECTOR) + +#define STATIC_KSNODETYPE_SPDIF_INTERFACE \ + DEFINE_USB_TERMINAL_GUID(0x0605) +DEFINE_GUIDSTRUCT("DFF21FE5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_SPDIF_INTERFACE); +#define KSNODETYPE_SPDIF_INTERFACE DEFINE_GUIDNAMED(KSNODETYPE_SPDIF_INTERFACE) + +#define STATIC_KSNODETYPE_1394_DA_STREAM \ + DEFINE_USB_TERMINAL_GUID(0x0606) +DEFINE_GUIDSTRUCT("DFF21FE6-F70F-11D0-B917-00A0C9223196",KSNODETYPE_1394_DA_STREAM); +#define KSNODETYPE_1394_DA_STREAM DEFINE_GUIDNAMED(KSNODETYPE_1394_DA_STREAM) + +#define STATIC_KSNODETYPE_1394_DV_STREAM_SOUNDTRACK \ + DEFINE_USB_TERMINAL_GUID(0x0607) +DEFINE_GUIDSTRUCT("DFF21FE7-F70F-11D0-B917-00A0C9223196",KSNODETYPE_1394_DV_STREAM_SOUNDTRACK); +#define KSNODETYPE_1394_DV_STREAM_SOUNDTRACK DEFINE_GUIDNAMED(KSNODETYPE_1394_DV_STREAM_SOUNDTRACK) + +#define STATIC_KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE \ + DEFINE_USB_TERMINAL_GUID(0x0701) +DEFINE_GUIDSTRUCT("DFF220E1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE); +#define KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE DEFINE_GUIDNAMED(KSNODETYPE_LEVEL_CALIBRATION_NOISE_SOURCE) + +#define STATIC_KSNODETYPE_EQUALIZATION_NOISE \ + DEFINE_USB_TERMINAL_GUID(0x0702) +DEFINE_GUIDSTRUCT("DFF220E2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_EQUALIZATION_NOISE); +#define KSNODETYPE_EQUALIZATION_NOISE DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZATION_NOISE) + +#define STATIC_KSNODETYPE_CD_PLAYER \ + DEFINE_USB_TERMINAL_GUID(0x0703) +DEFINE_GUIDSTRUCT("DFF220E3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_CD_PLAYER); +#define KSNODETYPE_CD_PLAYER DEFINE_GUIDNAMED(KSNODETYPE_CD_PLAYER) + +#define STATIC_KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE \ + DEFINE_USB_TERMINAL_GUID(0x0704) +DEFINE_GUIDSTRUCT("DFF220E4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE); +#define KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE DEFINE_GUIDNAMED(KSNODETYPE_DAT_IO_DIGITAL_AUDIO_TAPE) + +#define STATIC_KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE \ + DEFINE_USB_TERMINAL_GUID(0x0705) +DEFINE_GUIDSTRUCT("DFF220E5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE); +#define KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE DEFINE_GUIDNAMED(KSNODETYPE_DCC_IO_DIGITAL_COMPACT_CASSETTE) + +#define STATIC_KSNODETYPE_MINIDISK \ + DEFINE_USB_TERMINAL_GUID(0x0706) +DEFINE_GUIDSTRUCT("DFF220E6-F70F-11D0-B917-00A0C9223196",KSNODETYPE_MINIDISK); +#define KSNODETYPE_MINIDISK DEFINE_GUIDNAMED(KSNODETYPE_MINIDISK) + +#define STATIC_KSNODETYPE_ANALOG_TAPE \ + DEFINE_USB_TERMINAL_GUID(0x0707) +DEFINE_GUIDSTRUCT("DFF220E7-F70F-11D0-B917-00A0C9223196",KSNODETYPE_ANALOG_TAPE); +#define KSNODETYPE_ANALOG_TAPE DEFINE_GUIDNAMED(KSNODETYPE_ANALOG_TAPE) + +#define STATIC_KSNODETYPE_PHONOGRAPH \ + DEFINE_USB_TERMINAL_GUID(0x0708) +DEFINE_GUIDSTRUCT("DFF220E8-F70F-11D0-B917-00A0C9223196",KSNODETYPE_PHONOGRAPH); +#define KSNODETYPE_PHONOGRAPH DEFINE_GUIDNAMED(KSNODETYPE_PHONOGRAPH) + +#define STATIC_KSNODETYPE_VCR_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x0708) +DEFINE_GUIDSTRUCT("DFF220E9-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VCR_AUDIO); +#define KSNODETYPE_VCR_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VCR_AUDIO) + +#define STATIC_KSNODETYPE_VIDEO_DISC_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070A) +DEFINE_GUIDSTRUCT("DFF220EA-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_DISC_AUDIO); +#define KSNODETYPE_VIDEO_DISC_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_DISC_AUDIO) + +#define STATIC_KSNODETYPE_DVD_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070B) +DEFINE_GUIDSTRUCT("DFF220EB-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DVD_AUDIO); +#define KSNODETYPE_DVD_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DVD_AUDIO) + +#define STATIC_KSNODETYPE_TV_TUNER_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070C) +DEFINE_GUIDSTRUCT("DFF220EC-F70F-11D0-B917-00A0C9223196",KSNODETYPE_TV_TUNER_AUDIO); +#define KSNODETYPE_TV_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_TV_TUNER_AUDIO) + +#define STATIC_KSNODETYPE_SATELLITE_RECEIVER_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070D) +DEFINE_GUIDSTRUCT("DFF220ED-F70F-11D0-B917-00A0C9223196",KSNODETYPE_SATELLITE_RECEIVER_AUDIO); +#define KSNODETYPE_SATELLITE_RECEIVER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_SATELLITE_RECEIVER_AUDIO) + +#define STATIC_KSNODETYPE_CABLE_TUNER_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070E) +DEFINE_GUIDSTRUCT("DFF220EE-F70F-11D0-B917-00A0C9223196",KSNODETYPE_CABLE_TUNER_AUDIO); +#define KSNODETYPE_CABLE_TUNER_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_CABLE_TUNER_AUDIO) + +#define STATIC_KSNODETYPE_DSS_AUDIO \ + DEFINE_USB_TERMINAL_GUID(0x070F) +DEFINE_GUIDSTRUCT("DFF220EF-F70F-11D0-B917-00A0C9223196",KSNODETYPE_DSS_AUDIO); +#define KSNODETYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSNODETYPE_DSS_AUDIO) + +#define STATIC_KSNODETYPE_RADIO_RECEIVER \ + DEFINE_USB_TERMINAL_GUID(0x0710) +DEFINE_GUIDSTRUCT("DFF220F0-F70F-11D0-B917-00A0C9223196",KSNODETYPE_RADIO_RECEIVER); +#define KSNODETYPE_RADIO_RECEIVER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_RECEIVER) + +#define STATIC_KSNODETYPE_RADIO_TRANSMITTER \ + DEFINE_USB_TERMINAL_GUID(0x0711) +DEFINE_GUIDSTRUCT("DFF220F1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_RADIO_TRANSMITTER); +#define KSNODETYPE_RADIO_TRANSMITTER DEFINE_GUIDNAMED(KSNODETYPE_RADIO_TRANSMITTER) + +#define STATIC_KSNODETYPE_MULTITRACK_RECORDER \ + DEFINE_USB_TERMINAL_GUID(0x0712) +DEFINE_GUIDSTRUCT("DFF220F2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_MULTITRACK_RECORDER); +#define KSNODETYPE_MULTITRACK_RECORDER DEFINE_GUIDNAMED(KSNODETYPE_MULTITRACK_RECORDER) + +#define STATIC_KSNODETYPE_SYNTHESIZER \ + DEFINE_USB_TERMINAL_GUID(0x0713) +DEFINE_GUIDSTRUCT("DFF220F3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_SYNTHESIZER); +#define KSNODETYPE_SYNTHESIZER DEFINE_GUIDNAMED(KSNODETYPE_SYNTHESIZER) + +#define STATIC_KSNODETYPE_SWSYNTH \ + 0x423274A0L,0x8B81,0x11D1,0xA0,0x50,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("423274A0-8B81-11D1-A050-0000F8004788",KSNODETYPE_SWSYNTH); +#define KSNODETYPE_SWSYNTH DEFINE_GUIDNAMED(KSNODETYPE_SWSYNTH) + +#define STATIC_KSNODETYPE_SWMIDI \ + 0xCB9BEFA0L,0xA251,0x11D1,0xA0,0x50,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("CB9BEFA0-A251-11D1-A050-0000F8004788",KSNODETYPE_SWMIDI); +#define KSNODETYPE_SWMIDI DEFINE_GUIDNAMED(KSNODETYPE_SWMIDI) + +#define STATIC_KSNODETYPE_DRM_DESCRAMBLE \ + 0xFFBB6E3FL,0xCCFE,0x4D84,0x90,0xD9,0x42,0x14,0x18,0xB0,0x3A,0x8E +DEFINE_GUIDSTRUCT("FFBB6E3F-CCFE-4D84-90D9-421418B03A8E",KSNODETYPE_DRM_DESCRAMBLE); +#define KSNODETYPE_DRM_DESCRAMBLE DEFINE_GUIDNAMED(KSNODETYPE_DRM_DESCRAMBLE) + +#define STATIC_KSCATEGORY_AUDIO \ + 0x6994AD04L,0x93EF,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("6994AD04-93EF-11D0-A3CC-00A0C9223196",KSCATEGORY_AUDIO); +#define KSCATEGORY_AUDIO DEFINE_GUIDNAMED(KSCATEGORY_AUDIO) + +#define STATIC_KSCATEGORY_VIDEO \ + 0x6994AD05L,0x93EF,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("6994AD05-93EF-11D0-A3CC-00A0C9223196",KSCATEGORY_VIDEO); +#define KSCATEGORY_VIDEO DEFINE_GUIDNAMED(KSCATEGORY_VIDEO) + +#define STATIC_KSCATEGORY_TEXT \ + 0x6994AD06L,0x93EF,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("6994AD06-93EF-11D0-A3CC-00A0C9223196",KSCATEGORY_TEXT); +#define KSCATEGORY_TEXT DEFINE_GUIDNAMED(KSCATEGORY_TEXT) + +#define STATIC_KSCATEGORY_NETWORK \ + 0x67C9CC3CL,0x69C4,0x11D2,0x87,0x59,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("67C9CC3C-69C4-11D2-8759-00A0C9223196",KSCATEGORY_NETWORK); +#define KSCATEGORY_NETWORK DEFINE_GUIDNAMED(KSCATEGORY_NETWORK) + +#define STATIC_KSCATEGORY_TOPOLOGY \ + 0xDDA54A40L,0x1E4C,0x11D1,0xA0,0x50,0x40,0x57,0x05,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("DDA54A40-1E4C-11D1-A050-405705C10000",KSCATEGORY_TOPOLOGY); +#define KSCATEGORY_TOPOLOGY DEFINE_GUIDNAMED(KSCATEGORY_TOPOLOGY) + +#define STATIC_KSCATEGORY_VIRTUAL \ + 0x3503EAC4L,0x1F26,0x11D1,0x8A,0xB0,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("3503EAC4-1F26-11D1-8AB0-00A0C9223196",KSCATEGORY_VIRTUAL); +#define KSCATEGORY_VIRTUAL DEFINE_GUIDNAMED(KSCATEGORY_VIRTUAL) + +#define STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL \ + 0xBF963D80L,0xC559,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("BF963D80-C559-11D0-8A2B-00A0C9255AC1",KSCATEGORY_ACOUSTIC_ECHO_CANCEL); +#define KSCATEGORY_ACOUSTIC_ECHO_CANCEL DEFINE_GUIDNAMED(KSCATEGORY_ACOUSTIC_ECHO_CANCEL) + +#define STATIC_KSCATEGORY_SYSAUDIO \ + 0xA7C7A5B1L,0x5AF3,0x11D1,0x9C,0xED,0x00,0xA0,0x24,0xBF,0x04,0x07 +DEFINE_GUIDSTRUCT("A7C7A5B1-5AF3-11D1-9CED-00A024BF0407",KSCATEGORY_SYSAUDIO); +#define KSCATEGORY_SYSAUDIO DEFINE_GUIDNAMED(KSCATEGORY_SYSAUDIO) + +#define STATIC_KSCATEGORY_WDMAUD \ + 0x3E227E76L,0x690D,0x11D2,0x81,0x61,0x00,0x00,0xF8,0x77,0x5B,0xF1 +DEFINE_GUIDSTRUCT("3E227E76-690D-11D2-8161-0000F8775BF1",KSCATEGORY_WDMAUD); +#define KSCATEGORY_WDMAUD DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD) + +#define STATIC_KSCATEGORY_AUDIO_GFX \ + 0x9BAF9572L,0x340C,0x11D3,0xAB,0xDC,0x00,0xA0,0xC9,0x0A,0xB1,0x6F +DEFINE_GUIDSTRUCT("9BAF9572-340C-11D3-ABDC-00A0C90AB16F",KSCATEGORY_AUDIO_GFX); +#define KSCATEGORY_AUDIO_GFX DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_GFX) + +#define STATIC_KSCATEGORY_AUDIO_SPLITTER \ + 0x9EA331FAL,0xB91B,0x45F8,0x92,0x85,0xBD,0x2B,0xC7,0x7A,0xFC,0xDE +DEFINE_GUIDSTRUCT("9EA331FA-B91B-45F8-9285-BD2BC77AFCDE",KSCATEGORY_AUDIO_SPLITTER); +#define KSCATEGORY_AUDIO_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_SPLITTER) + +#define STATIC_KSCATEGORY_SYNTHESIZER STATIC_KSNODETYPE_SYNTHESIZER +#define KSCATEGORY_SYNTHESIZER KSNODETYPE_SYNTHESIZER + +#define STATIC_KSCATEGORY_DRM_DESCRAMBLE STATIC_KSNODETYPE_DRM_DESCRAMBLE +#define KSCATEGORY_DRM_DESCRAMBLE KSNODETYPE_DRM_DESCRAMBLE + +#define STATIC_KSCATEGORY_AUDIO_DEVICE \ + 0xFBF6F530L,0x07B9,0x11D2,0xA7,0x1E,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("FBF6F530-07B9-11D2-A71E-0000F8004788",KSCATEGORY_AUDIO_DEVICE); +#define KSCATEGORY_AUDIO_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_AUDIO_DEVICE) + +#define STATIC_KSCATEGORY_PREFERRED_WAVEOUT_DEVICE \ + 0xD6C5066EL,0x72C1,0x11D2,0x97,0x55,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("D6C5066E-72C1-11D2-9755-0000F8004788",KSCATEGORY_PREFERRED_WAVEOUT_DEVICE); +#define KSCATEGORY_PREFERRED_WAVEOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEOUT_DEVICE) + +#define STATIC_KSCATEGORY_PREFERRED_WAVEIN_DEVICE \ + 0xD6C50671L,0x72C1,0x11D2,0x97,0x55,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("D6C50671-72C1-11D2-9755-0000F8004788",KSCATEGORY_PREFERRED_WAVEIN_DEVICE); +#define KSCATEGORY_PREFERRED_WAVEIN_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_WAVEIN_DEVICE) + +#define STATIC_KSCATEGORY_PREFERRED_MIDIOUT_DEVICE \ + 0xD6C50674L,0x72C1,0x11D2,0x97,0x55,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("D6C50674-72C1-11D2-9755-0000F8004788",KSCATEGORY_PREFERRED_MIDIOUT_DEVICE); +#define KSCATEGORY_PREFERRED_MIDIOUT_DEVICE DEFINE_GUIDNAMED(KSCATEGORY_PREFERRED_MIDIOUT_DEVICE) + +#define STATIC_KSCATEGORY_WDMAUD_USE_PIN_NAME \ + 0x47A4FA20L,0xA251,0x11D1,0xA0,0x50,0x00,0x00,0xF8,0x00,0x47,0x88 +DEFINE_GUIDSTRUCT("47A4FA20-A251-11D1-A050-0000F8004788",KSCATEGORY_WDMAUD_USE_PIN_NAME); +#define KSCATEGORY_WDMAUD_USE_PIN_NAME DEFINE_GUIDNAMED(KSCATEGORY_WDMAUD_USE_PIN_NAME) + +#define STATIC_KSCATEGORY_ESCALANTE_PLATFORM_DRIVER \ + 0x74f3aea8L,0x9768,0x11d1,0x8e,0x07,0x00,0xa0,0xc9,0x5e,0xc2,0x2e +DEFINE_GUIDSTRUCT("74f3aea8-9768-11d1-8e07-00a0c95ec22e",KSCATEGORY_ESCALANTE_PLATFORM_DRIVER); +#define KSCATEGORY_ESCALANTE_PLATFORM_DRIVER DEFINE_GUIDNAMED(KSCATEGORY_ESCALANTE_PLATFORM_DRIVER) + +#define STATIC_KSDATAFORMAT_TYPE_VIDEO \ + 0x73646976L,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +DEFINE_GUIDSTRUCT("73646976-0000-0010-8000-00aa00389b71",KSDATAFORMAT_TYPE_VIDEO); +#define KSDATAFORMAT_TYPE_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VIDEO) + +#define STATIC_KSDATAFORMAT_TYPE_AUDIO \ + 0x73647561L,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +DEFINE_GUIDSTRUCT("73647561-0000-0010-8000-00aa00389b71",KSDATAFORMAT_TYPE_AUDIO); +#define KSDATAFORMAT_TYPE_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUDIO) + +#define STATIC_KSDATAFORMAT_TYPE_TEXT \ + 0x73747874L,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +DEFINE_GUIDSTRUCT("73747874-0000-0010-8000-00aa00389b71",KSDATAFORMAT_TYPE_TEXT); +#define KSDATAFORMAT_TYPE_TEXT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_TEXT) + +#if !defined(DEFINE_WAVEFORMATEX_GUID) +#define DEFINE_WAVEFORMATEX_GUID(x) \ + (USHORT)(x),0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +#endif + +#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX \ + 0x00000000L,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_WAVEFORMATEX); +#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + +#define INIT_WAVEFORMATEX_GUID(Guid,x) \ +{ \ + *(Guid) = KSDATAFORMAT_SUBTYPE_WAVEFORMATEX; \ + (Guid)->Data1 = (USHORT)(x); \ +} + +#define EXTRACT_WAVEFORMATEX_ID(Guid) \ + (USHORT)((Guid)->Data1) + +#define IS_VALID_WAVEFORMATEX_GUID(Guid) \ + (!memcmp(((PUSHORT)&KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, ((PUSHORT)(Guid)) + 1,sizeof(GUID) - sizeof(USHORT))) + +#ifndef INIT_MMREG_MID +#define INIT_MMREG_MID(guid,id) \ +{ \ + (guid)->Data1 = 0xd5a47fa7 + (USHORT)(id); \ + (guid)->Data2 = 0x6d98; \ + (guid)->Data3 = 0x11d1; \ + (guid)->Data4[0] = 0xa2; \ + (guid)->Data4[1] = 0x1a; \ + (guid)->Data4[2] = 0x00; \ + (guid)->Data4[3] = 0xa0; \ + (guid)->Data4[4] = 0xc9; \ + (guid)->Data4[5] = 0x22; \ + (guid)->Data4[6] = 0x31; \ + (guid)->Data4[7] = 0x96; \ +} +#define EXTRACT_MMREG_MID(guid) \ + (USHORT)((guid)->Data1 - 0xd5a47fa7) +#define DEFINE_MMREG_MID_GUID(id) \ + 0xd5a47fa7+(USHORT)(id),0x6d98,0x11d1,0xa2,0x1a,0x00,0xa0,0xc9,0x22,0x31,0x96 + +#define IS_COMPATIBLE_MMREG_MID(guid) \ + (((guid)->Data1 >= 0xd5a47fa7) && \ + ((guid)->Data1 < 0xd5a47fa7 + 0xffff) && \ + ((guid)->Data2 == 0x6d98) && \ + ((guid)->Data3 == 0x11d1) && \ + ((guid)->Data4[0] == 0xa2) && \ + ((guid)->Data4[1] == 0x1a) && \ + ((guid)->Data4[2] == 0x00) && \ + ((guid)->Data4[3] == 0xa0) && \ + ((guid)->Data4[4] == 0xc9) && \ + ((guid)->Data4[5] == 0x22) && \ + ((guid)->Data4[6] == 0x31) && \ + ((guid)->Data4[7] == 0x96) ) +#endif /* INIT_MMREG_MID */ + +#ifndef INIT_MMREG_PID +#define INIT_MMREG_PID(guid,id) \ +{ \ + (guid)->Data1 = 0xe36dc2ac + (USHORT)(id); \ + (guid)->Data2 = 0x6d9a; \ + (guid)->Data3 = 0x11d1; \ + (guid)->Data4[0] = 0xa2; \ + (guid)->Data4[1] = 0x1a; \ + (guid)->Data4[2] = 0x00; \ + (guid)->Data4[3] = 0xa0; \ + (guid)->Data4[4] = 0xc9; \ + (guid)->Data4[5] = 0x22; \ + (guid)->Data4[6] = 0x31; \ + (guid)->Data4[7] = 0x96; \ +} +#define EXTRACT_MMREG_PID(guid) \ + (USHORT)((guid)->Data1 - 0xe36dc2ac) +#define DEFINE_MMREG_PID_GUID(id) \ + 0xe36dc2ac+(USHORT)(id),0x6d9a,0x11d1,0xa2,0x1a,0x00,0xa0,0xc9,0x22,0x31,0x96 + +#define IS_COMPATIBLE_MMREG_PID(guid) \ + (((guid)->Data1 >= 0xe36dc2ac) && \ + ((guid)->Data1 < 0xe36dc2ac + 0xffff) && \ + ((guid)->Data2 == 0x6d9a) && \ + ((guid)->Data3 == 0x11d1) && \ + ((guid)->Data4[0] == 0xa2) && \ + ((guid)->Data4[1] == 0x1a) && \ + ((guid)->Data4[2] == 0x00) && \ + ((guid)->Data4[3] == 0xa0) && \ + ((guid)->Data4[4] == 0xc9) && \ + ((guid)->Data4[5] == 0x22) && \ + ((guid)->Data4[6] == 0x31) && \ + ((guid)->Data4[7] == 0x96) ) +#endif /* INIT_MMREG_PID */ + +#define STATIC_KSDATAFORMAT_SUBTYPE_ANALOG \ + 0x6dba3190L,0x67bd,0x11cf,0xa0,0xf7,0x00,0x20,0xaf,0xd1,0x56,0xe4 +DEFINE_GUIDSTRUCT("6dba3190-67bd-11cf-a0f7-0020afd156e4",KSDATAFORMAT_SUBTYPE_ANALOG); +#define KSDATAFORMAT_SUBTYPE_ANALOG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ANALOG) + +#define STATIC_KSDATAFORMAT_SUBTYPE_PCM \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM) +DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_PCM); +#define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM) + +#ifdef _INC_MMREG +#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_IEEE_FLOAT) +DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); +#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) + +#define STATIC_KSDATAFORMAT_SUBTYPE_DRM \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DRM) +DEFINE_GUIDSTRUCT("00000009-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_DRM); +#define KSDATAFORMAT_SUBTYPE_DRM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DRM) + +#define STATIC_KSDATAFORMAT_SUBTYPE_ALAW \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ALAW) +DEFINE_GUIDSTRUCT("00000006-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_ALAW); +#define KSDATAFORMAT_SUBTYPE_ALAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ALAW) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MULAW \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MULAW) +DEFINE_GUIDSTRUCT("00000007-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_MULAW); +#define KSDATAFORMAT_SUBTYPE_MULAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MULAW) + +#define STATIC_KSDATAFORMAT_SUBTYPE_ADPCM \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_ADPCM) +DEFINE_GUIDSTRUCT("00000002-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_ADPCM); +#define KSDATAFORMAT_SUBTYPE_ADPCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ADPCM) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG \ + DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_MPEG) +DEFINE_GUIDSTRUCT("00000050-0000-0010-8000-00aa00389b71",KSDATAFORMAT_SUBTYPE_MPEG); +#define KSDATAFORMAT_SUBTYPE_MPEG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG) +#endif /* _INC_MMREG */ + +#define STATIC_KSDATAFORMAT_SPECIFIER_VC_ID \ + 0xAD98D184L,0xAAC3,0x11D0,0xA4,0x1C,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("AD98D184-AAC3-11D0-A41C-00A0C9223196",KSDATAFORMAT_SPECIFIER_VC_ID); +#define KSDATAFORMAT_SPECIFIER_VC_ID DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VC_ID) + +#define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX \ + 0x05589f81L,0xc356,0x11ce,0xbf,0x01,0x00,0xaa,0x00,0x55,0x59,0x5a +DEFINE_GUIDSTRUCT("05589f81-c356-11ce-bf01-00aa0055595a",KSDATAFORMAT_SPECIFIER_WAVEFORMATEX); +#define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DSOUND \ + 0x518590a2L,0xa184,0x11d0,0x85,0x22,0x00,0xc0,0x4f,0xd9,0xba,0xf3 +DEFINE_GUIDSTRUCT("518590a2-a184-11d0-8522-00c04fd9baf3",KSDATAFORMAT_SPECIFIER_DSOUND); +#define KSDATAFORMAT_SPECIFIER_DSOUND DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DSOUND) + +#if defined(_INC_MMSYSTEM) || defined(_INC_MMREG) +#if !defined(PACK_PRAGMAS_NOT_SUPPORTED) +#include +#endif +typedef struct { + KSDATAFORMAT DataFormat; + WAVEFORMATEX WaveFormatEx; +} KSDATAFORMAT_WAVEFORMATEX,*PKSDATAFORMAT_WAVEFORMATEX; + +#ifndef _WAVEFORMATEXTENSIBLE_ +#define _WAVEFORMATEXTENSIBLE_ +typedef struct { + WAVEFORMATEX Format; + union { + WORD wValidBitsPerSample; + WORD wSamplesPerBlock; + WORD wReserved; + } Samples; + DWORD dwChannelMask; + + GUID SubFormat; +} WAVEFORMATEXTENSIBLE,*PWAVEFORMATEXTENSIBLE; +#endif /* _WAVEFORMATEXTENSIBLE_ */ + +#if !defined(WAVE_FORMAT_EXTENSIBLE) +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif + +typedef struct { + ULONG Flags; + ULONG Control; + WAVEFORMATEX WaveFormatEx; +} KSDSOUND_BUFFERDESC,*PKSDSOUND_BUFFERDESC; + +typedef struct { + KSDATAFORMAT DataFormat; + KSDSOUND_BUFFERDESC BufferDesc; +} KSDATAFORMAT_DSOUND,*PKSDATAFORMAT_DSOUND; + +#if !defined(PACK_PRAGMAS_NOT_SUPPORTED) +#include +#endif +#endif /* defined(_INC_MMSYSTEM) || defined(_INC_MMREG) */ + +#define KSDSOUND_BUFFER_PRIMARY 0x00000001 +#define KSDSOUND_BUFFER_STATIC 0x00000002 +#define KSDSOUND_BUFFER_LOCHARDWARE 0x00000004 +#define KSDSOUND_BUFFER_LOCSOFTWARE 0x00000008 + +#define KSDSOUND_BUFFER_CTRL_3D 0x00000001 +#define KSDSOUND_BUFFER_CTRL_FREQUENCY 0x00000002 +#define KSDSOUND_BUFFER_CTRL_PAN 0x00000004 +#define KSDSOUND_BUFFER_CTRL_VOLUME 0x00000008 +#define KSDSOUND_BUFFER_CTRL_POSITIONNOTIFY 0x00000010 + +typedef struct { + DWORDLONG PlayOffset; + DWORDLONG WriteOffset; +} KSAUDIO_POSITION,*PKSAUDIO_POSITION; + +typedef struct _DS3DVECTOR { + __MINGW_EXTENSION union { + FLOAT x; + FLOAT dvX; + }; + __MINGW_EXTENSION union { + FLOAT y; + FLOAT dvY; + }; + __MINGW_EXTENSION union { + FLOAT z; + FLOAT dvZ; + }; +} DS3DVECTOR,*PDS3DVECTOR; + +#define STATIC_KSPROPSETID_DirectSound3DListener \ + 0x437b3414L,0xd060,0x11d0,0x85,0x83,0x00,0xc0,0x4f,0xd9,0xba,0xf3 +DEFINE_GUIDSTRUCT("437b3414-d060-11d0-8583-00c04fd9baf3",KSPROPSETID_DirectSound3DListener); +#define KSPROPSETID_DirectSound3DListener DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DListener) + +typedef enum { + KSPROPERTY_DIRECTSOUND3DLISTENER_ALL, + KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION, + KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY, + KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION, + KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR, + KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR, + KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR, + KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH, + KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION +} KSPROPERTY_DIRECTSOUND3DLISTENER; + +typedef struct { + DS3DVECTOR Position; + DS3DVECTOR Velocity; + DS3DVECTOR OrientFront; + DS3DVECTOR OrientTop; + FLOAT DistanceFactor; + FLOAT RolloffFactor; + FLOAT DopplerFactor; +} KSDS3D_LISTENER_ALL,*PKSDS3D_LISTENER_ALL; + +typedef struct { + DS3DVECTOR Front; + DS3DVECTOR Top; +} KSDS3D_LISTENER_ORIENTATION,*PKSDS3D_LISTENER_ORIENTATION; + +#define STATIC_KSPROPSETID_DirectSound3DBuffer \ + 0x437b3411L,0xd060,0x11d0,0x85,0x83,0x00,0xc0,0x4f,0xd9,0xba,0xf3 +DEFINE_GUIDSTRUCT("437b3411-d060-11d0-8583-00c04fd9baf3",KSPROPSETID_DirectSound3DBuffer); +#define KSPROPSETID_DirectSound3DBuffer DEFINE_GUIDNAMED(KSPROPSETID_DirectSound3DBuffer) + +typedef enum { + KSPROPERTY_DIRECTSOUND3DBUFFER_ALL, + KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION, + KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY, + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES, + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION, + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME, + KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE, + KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE, + KSPROPERTY_DIRECTSOUND3DBUFFER_MODE +} KSPROPERTY_DIRECTSOUND3DBUFFER; + +typedef struct { + DS3DVECTOR Position; + DS3DVECTOR Velocity; + ULONG InsideConeAngle; + ULONG OutsideConeAngle; + DS3DVECTOR ConeOrientation; + LONG ConeOutsideVolume; + FLOAT MinDistance; + FLOAT MaxDistance; + ULONG Mode; +} KSDS3D_BUFFER_ALL,*PKSDS3D_BUFFER_ALL; + +typedef struct { + ULONG InsideConeAngle; + ULONG OutsideConeAngle; +} KSDS3D_BUFFER_CONE_ANGLES,*PKSDS3D_BUFFER_CONE_ANGLES; + +#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_HEADPHONE (-1) +#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MIN 5 +#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_NARROW 10 +#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_WIDE 20 +#define KSAUDIO_STEREO_SPEAKER_GEOMETRY_MAX 180 + +#define KSDSOUND_3D_MODE_NORMAL 0x00000000 +#define KSDSOUND_3D_MODE_HEADRELATIVE 0x00000001 +#define KSDSOUND_3D_MODE_DISABLE 0x00000002 + +#define KSDSOUND_BUFFER_CTRL_HRTF_3D 0x40000000 + +typedef struct { + ULONG Size; + ULONG Enabled; + WINBOOL SwapChannels; + WINBOOL ZeroAzimuth; + WINBOOL CrossFadeOutput; + ULONG FilterSize; +} KSDS3D_HRTF_PARAMS_MSG,*PKSDS3D_HRTF_PARAMS_MSG; + +typedef enum { + FULL_FILTER, + LIGHT_FILTER, + KSDS3D_FILTER_QUALITY_COUNT +} KSDS3D_HRTF_FILTER_QUALITY; + +typedef struct { + ULONG Size; + KSDS3D_HRTF_FILTER_QUALITY Quality; + FLOAT SampleRate; + ULONG MaxFilterSize; + ULONG FilterTransientMuteLength; + ULONG FilterOverlapBufferLength; + ULONG OutputOverlapBufferLength; + ULONG Reserved; +} KSDS3D_HRTF_INIT_MSG,*PKSDS3D_HRTF_INIT_MSG; + +typedef enum { + FLOAT_COEFF, + SHORT_COEFF, + KSDS3D_COEFF_COUNT +} KSDS3D_HRTF_COEFF_FORMAT; + +typedef enum { + DIRECT_FORM, + CASCADE_FORM, + KSDS3D_FILTER_METHOD_COUNT +} KSDS3D_HRTF_FILTER_METHOD; + +typedef enum { + DS3D_HRTF_VERSION_1 +} KSDS3D_HRTF_FILTER_VERSION; + +typedef struct { + KSDS3D_HRTF_FILTER_METHOD FilterMethod; + KSDS3D_HRTF_COEFF_FORMAT CoeffFormat; + KSDS3D_HRTF_FILTER_VERSION Version; + ULONG Reserved; +} KSDS3D_HRTF_FILTER_FORMAT_MSG,*PKSDS3D_HRTF_FILTER_FORMAT_MSG; + +#define STATIC_KSPROPSETID_Hrtf3d \ + 0xb66decb0L,0xa083,0x11d0,0x85,0x1e,0x00,0xc0,0x4f,0xd9,0xba,0xf3 +DEFINE_GUIDSTRUCT("b66decb0-a083-11d0-851e-00c04fd9baf3",KSPROPSETID_Hrtf3d); +#define KSPROPSETID_Hrtf3d DEFINE_GUIDNAMED(KSPROPSETID_Hrtf3d) + +typedef enum { + KSPROPERTY_HRTF3D_PARAMS = 0, + KSPROPERTY_HRTF3D_INITIALIZE, + KSPROPERTY_HRTF3D_FILTER_FORMAT +} KSPROPERTY_HRTF3D; + +typedef struct { + LONG Channel; + FLOAT VolSmoothScale; + FLOAT TotalDryAttenuation; + FLOAT TotalWetAttenuation; + LONG SmoothFrequency; + LONG Delay; +} KSDS3D_ITD_PARAMS,*PKSDS3D_ITD_PARAMS; + +typedef struct { + ULONG Enabled; + KSDS3D_ITD_PARAMS LeftParams; + KSDS3D_ITD_PARAMS RightParams; + ULONG Reserved; +} KSDS3D_ITD_PARAMS_MSG,*PKSDS3D_ITD_PARAMS_MSG; + +#define STATIC_KSPROPSETID_Itd3d \ + 0x6429f090L,0x9fd9,0x11d0,0xa7,0x5b,0x00,0xa0,0xc9,0x03,0x65,0xe3 +DEFINE_GUIDSTRUCT("6429f090-9fd9-11d0-a75b-00a0c90365e3",KSPROPSETID_Itd3d); +#define KSPROPSETID_Itd3d DEFINE_GUIDNAMED(KSPROPSETID_Itd3d) + +typedef enum { + KSPROPERTY_ITD3D_PARAMS = 0 +} KSPROPERTY_ITD3D; + +typedef struct { + KSDATARANGE DataRange; + ULONG MaximumChannels; + ULONG MinimumBitsPerSample; + ULONG MaximumBitsPerSample; + ULONG MinimumSampleFrequency; + ULONG MaximumSampleFrequency; +} KSDATARANGE_AUDIO,*PKSDATARANGE_AUDIO; + +#define STATIC_KSDATAFORMAT_SUBTYPE_RIFF \ + 0x4995DAEEL,0x9EE6,0x11D0,0xA4,0x0E,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("4995DAEE-9EE6-11D0-A40E-00A0C9223196",KSDATAFORMAT_SUBTYPE_RIFF); +#define KSDATAFORMAT_SUBTYPE_RIFF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFF) + +#define STATIC_KSDATAFORMAT_SUBTYPE_RIFFWAVE \ + 0xe436eb8bL,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70 +DEFINE_GUIDSTRUCT("e436eb8b-524f-11ce-9f53-0020af0ba770",KSDATAFORMAT_SUBTYPE_RIFFWAVE); +#define KSDATAFORMAT_SUBTYPE_RIFFWAVE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFWAVE) + +#define STATIC_KSPROPSETID_Bibliographic \ + 0x07BA150EL,0xE2B1,0x11D0,0xAC,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("07BA150E-E2B1-11D0-AC17-00A0C9223196",KSPROPSETID_Bibliographic); +#define KSPROPSETID_Bibliographic DEFINE_GUIDNAMED(KSPROPSETID_Bibliographic) + +typedef enum { + KSPROPERTY_BIBLIOGRAPHIC_LEADER = 'RDL ', + KSPROPERTY_BIBLIOGRAPHIC_LCCN = '010 ', + KSPROPERTY_BIBLIOGRAPHIC_ISBN = '020 ', + KSPROPERTY_BIBLIOGRAPHIC_ISSN = '220 ', + KSPROPERTY_BIBLIOGRAPHIC_CATALOGINGSOURCE = '040 ', + KSPROPERTY_BIBLIOGRAPHIC_MAINPERSONALNAME = '001 ', + KSPROPERTY_BIBLIOGRAPHIC_MAINCORPORATEBODY = '011 ', + KSPROPERTY_BIBLIOGRAPHIC_MAINMEETINGNAME = '111 ', + KSPROPERTY_BIBLIOGRAPHIC_MAINUNIFORMTITLE = '031 ', + KSPROPERTY_BIBLIOGRAPHIC_UNIFORMTITLE = '042 ', + KSPROPERTY_BIBLIOGRAPHIC_TITLESTATEMENT = '542 ', + KSPROPERTY_BIBLIOGRAPHIC_VARYINGFORMTITLE = '642 ', + KSPROPERTY_BIBLIOGRAPHIC_PUBLICATION = '062 ', + KSPROPERTY_BIBLIOGRAPHIC_PHYSICALDESCRIPTION = '003 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTITLE = '044 ', + KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENT = '094 ', + KSPROPERTY_BIBLIOGRAPHIC_GENERALNOTE = '005 ', + KSPROPERTY_BIBLIOGRAPHIC_BIBLIOGRAPHYNOTE = '405 ', + KSPROPERTY_BIBLIOGRAPHIC_CONTENTSNOTE = '505 ', + KSPROPERTY_BIBLIOGRAPHIC_CREATIONCREDIT = '805 ', + KSPROPERTY_BIBLIOGRAPHIC_CITATION = '015 ', + KSPROPERTY_BIBLIOGRAPHIC_PARTICIPANT = '115 ', + KSPROPERTY_BIBLIOGRAPHIC_SUMMARY = '025 ', + KSPROPERTY_BIBLIOGRAPHIC_TARGETAUDIENCE = '125 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDFORMAVAILABLE = '035 ', + KSPROPERTY_BIBLIOGRAPHIC_SYSTEMDETAILS = '835 ', + KSPROPERTY_BIBLIOGRAPHIC_AWARDS = '685 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYPERSONALNAME = '006 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYTOPICALTERM = '056 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYGEOGRAPHIC = '156 ', + KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMGENRE = '556 ', + KSPROPERTY_BIBLIOGRAPHIC_INDEXTERMCURRICULUM = '856 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYUNIFORMTITLE = '037 ', + KSPROPERTY_BIBLIOGRAPHIC_ADDEDENTRYRELATED = '047 ', + KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTPERSONALNAME = '008 ', + KSPROPERTY_BIBLIOGRAPHIC_SERIESSTATEMENTUNIFORMTITLE = '038 ' +} KSPROPERTY_BIBLIOGRAPHIC; + +#define STATIC_KSPROPSETID_TopologyNode \ + 0x45FFAAA1L,0x6E1B,0x11D0,0xBC,0xF2,0x44,0x45,0x53,0x54,0x00,0x00 +DEFINE_GUIDSTRUCT("45FFAAA1-6E1B-11D0-BCF2-444553540000",KSPROPSETID_TopologyNode); +#define KSPROPSETID_TopologyNode DEFINE_GUIDNAMED(KSPROPSETID_TopologyNode) + +typedef enum { + KSPROPERTY_TOPOLOGYNODE_ENABLE = 1, + KSPROPERTY_TOPOLOGYNODE_RESET +} KSPROPERTY_TOPOLOGYNODE; + +#define STATIC_KSPROPSETID_RtAudio \ + 0xa855a48c,0x2f78,0x4729,0x90,0x51,0x19,0x68,0x74,0x6b,0x9e,0xef +DEFINE_GUIDSTRUCT("A855A48C-2F78-4729-9051-1968746B9EEF",KSPROPSETID_RtAudio); +#define KSPROPSETID_RtAudio DEFINE_GUIDNAMED(KSPROPSETID_RtAudio) + +typedef enum { + KSPROPERTY_RTAUDIO_GETPOSITIONFUNCTION +} KSPROPERTY_RTAUDIO; + +#define STATIC_KSPROPSETID_DrmAudioStream \ + 0x2f2c8ddd,0x4198,0x4fac,0xba,0x29,0x61,0xbb,0x5,0xb7,0xde,0x6 +DEFINE_GUIDSTRUCT("2F2C8DDD-4198-4fac-BA29-61BB05B7DE06",KSPROPSETID_DrmAudioStream); +#define KSPROPSETID_DrmAudioStream DEFINE_GUIDNAMED(KSPROPSETID_DrmAudioStream) + +typedef enum { + KSPROPERTY_DRMAUDIOSTREAM_CONTENTID +} KSPROPERTY_DRMAUDIOSTREAM; + +#define STATIC_KSPROPSETID_Audio \ + 0x45FFAAA0L,0x6E1B,0x11D0,0xBC,0xF2,0x44,0x45,0x53,0x54,0x00,0x00 +DEFINE_GUIDSTRUCT("45FFAAA0-6E1B-11D0-BCF2-444553540000",KSPROPSETID_Audio); +#define KSPROPSETID_Audio DEFINE_GUIDNAMED(KSPROPSETID_Audio) + +typedef enum { + KSPROPERTY_AUDIO_LATENCY = 1, + KSPROPERTY_AUDIO_COPY_PROTECTION, + KSPROPERTY_AUDIO_CHANNEL_CONFIG, + KSPROPERTY_AUDIO_VOLUMELEVEL, + KSPROPERTY_AUDIO_POSITION, + KSPROPERTY_AUDIO_DYNAMIC_RANGE, + KSPROPERTY_AUDIO_QUALITY, + KSPROPERTY_AUDIO_SAMPLING_RATE, + KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE, + KSPROPERTY_AUDIO_MIX_LEVEL_TABLE, + KSPROPERTY_AUDIO_MIX_LEVEL_CAPS, + KSPROPERTY_AUDIO_MUX_SOURCE, + KSPROPERTY_AUDIO_MUTE, + KSPROPERTY_AUDIO_BASS, + KSPROPERTY_AUDIO_MID, + KSPROPERTY_AUDIO_TREBLE, + KSPROPERTY_AUDIO_BASS_BOOST, + KSPROPERTY_AUDIO_EQ_LEVEL, + KSPROPERTY_AUDIO_NUM_EQ_BANDS, + KSPROPERTY_AUDIO_EQ_BANDS, + KSPROPERTY_AUDIO_AGC, + KSPROPERTY_AUDIO_DELAY, + KSPROPERTY_AUDIO_LOUDNESS, + KSPROPERTY_AUDIO_WIDE_MODE, + KSPROPERTY_AUDIO_WIDENESS, + KSPROPERTY_AUDIO_REVERB_LEVEL, + KSPROPERTY_AUDIO_CHORUS_LEVEL, + KSPROPERTY_AUDIO_DEV_SPECIFIC, + KSPROPERTY_AUDIO_DEMUX_DEST, + KSPROPERTY_AUDIO_STEREO_ENHANCE, + KSPROPERTY_AUDIO_MANUFACTURE_GUID, + KSPROPERTY_AUDIO_PRODUCT_GUID, + KSPROPERTY_AUDIO_CPU_RESOURCES, + KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY, + KSPROPERTY_AUDIO_SURROUND_ENCODE, + KSPROPERTY_AUDIO_3D_INTERFACE, + KSPROPERTY_AUDIO_PEAKMETER, + KSPROPERTY_AUDIO_ALGORITHM_INSTANCE, + KSPROPERTY_AUDIO_FILTER_STATE, + KSPROPERTY_AUDIO_PREFERRED_STATUS +} KSPROPERTY_AUDIO; + +#define KSAUDIO_QUALITY_WORST 0x0 +#define KSAUDIO_QUALITY_PC 0x1 +#define KSAUDIO_QUALITY_BASIC 0x2 +#define KSAUDIO_QUALITY_ADVANCED 0x3 + +#define KSAUDIO_CPU_RESOURCES_NOT_HOST_CPU 0x00000000 +#define KSAUDIO_CPU_RESOURCES_HOST_CPU 0x7FFFFFFF + +typedef struct { + WINBOOL fCopyrighted; + WINBOOL fOriginal; +} KSAUDIO_COPY_PROTECTION,*PKSAUDIO_COPY_PROTECTION; + +typedef struct { + LONG ActiveSpeakerPositions; +} KSAUDIO_CHANNEL_CONFIG,*PKSAUDIO_CHANNEL_CONFIG; + +#define SPEAKER_FRONT_LEFT 0x1 +#define SPEAKER_FRONT_RIGHT 0x2 +#define SPEAKER_FRONT_CENTER 0x4 +#define SPEAKER_LOW_FREQUENCY 0x8 +#define SPEAKER_BACK_LEFT 0x10 +#define SPEAKER_BACK_RIGHT 0x20 +#define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 +#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 +#define SPEAKER_BACK_CENTER 0x100 +#define SPEAKER_SIDE_LEFT 0x200 +#define SPEAKER_SIDE_RIGHT 0x400 +#define SPEAKER_TOP_CENTER 0x800 +#define SPEAKER_TOP_FRONT_LEFT 0x1000 +#define SPEAKER_TOP_FRONT_CENTER 0x2000 +#define SPEAKER_TOP_FRONT_RIGHT 0x4000 +#define SPEAKER_TOP_BACK_LEFT 0x8000 +#define SPEAKER_TOP_BACK_CENTER 0x10000 +#define SPEAKER_TOP_BACK_RIGHT 0x20000 + +#define SPEAKER_RESERVED 0x7FFC0000 + +#define SPEAKER_ALL 0x80000000 + +#define KSAUDIO_SPEAKER_DIRECTOUT 0 +#define KSAUDIO_SPEAKER_MONO (SPEAKER_FRONT_CENTER) +#define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) +#define KSAUDIO_SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#define KSAUDIO_SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER) +#define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#define KSAUDIO_SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ + SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER) +#define KSAUDIO_SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT) +#define KSAUDIO_SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ + SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT) + +#define KSAUDIO_SPEAKER_5POINT1_BACK KSAUDIO_SPEAKER_5POINT1 +#define KSAUDIO_SPEAKER_7POINT1_WIDE KSAUDIO_SPEAKER_7POINT1 + +#define KSAUDIO_SPEAKER_GROUND_FRONT_LEFT SPEAKER_FRONT_LEFT +#define KSAUDIO_SPEAKER_GROUND_FRONT_CENTER SPEAKER_FRONT_CENTER +#define KSAUDIO_SPEAKER_GROUND_FRONT_RIGHT SPEAKER_FRONT_RIGHT +#define KSAUDIO_SPEAKER_GROUND_REAR_LEFT SPEAKER_BACK_LEFT +#define KSAUDIO_SPEAKER_GROUND_REAR_RIGHT SPEAKER_BACK_RIGHT +#define KSAUDIO_SPEAKER_TOP_MIDDLE SPEAKER_TOP_CENTER +#define KSAUDIO_SPEAKER_SUPER_WOOFER SPEAKER_LOW_FREQUENCY + +typedef struct { + ULONG QuietCompression; + ULONG LoudCompression; +} KSAUDIO_DYNAMIC_RANGE,*PKSAUDIO_DYNAMIC_RANGE; + +typedef struct { + WINBOOL Mute; + LONG Level; +} KSAUDIO_MIXLEVEL,*PKSAUDIO_MIXLEVEL; + +typedef struct { + WINBOOL Mute; + LONG Minimum; + LONG Maximum; + LONG Reset; +} KSAUDIO_MIX_CAPS,*PKSAUDIO_MIX_CAPS; + +typedef struct { + ULONG InputChannels; + ULONG OutputChannels; + KSAUDIO_MIX_CAPS Capabilities[1]; +} KSAUDIO_MIXCAP_TABLE,*PKSAUDIO_MIXCAP_TABLE; + +typedef enum { + SE_TECH_NONE, + SE_TECH_ANALOG_DEVICES_PHAT, + SE_TECH_CREATIVE, + SE_TECH_NATIONAL_SEMI, + SE_TECH_YAMAHA_YMERSION, + SE_TECH_BBE, + SE_TECH_CRYSTAL_SEMI, + SE_TECH_QSOUND_QXPANDER, + SE_TECH_SPATIALIZER, + SE_TECH_SRS, + SE_TECH_PLATFORM_TECH, + SE_TECH_AKM, + SE_TECH_AUREAL, + SE_TECH_AZTECH, + SE_TECH_BINAURA, + SE_TECH_ESS_TECH, + SE_TECH_HARMAN_VMAX, + SE_TECH_NVIDEA, + SE_TECH_PHILIPS_INCREDIBLE, + SE_TECH_TEXAS_INST, + SE_TECH_VLSI_TECH +} SE_TECHNIQUE; + +typedef struct { + SE_TECHNIQUE Technique; + ULONG Center; + ULONG Depth; + ULONG Reserved; +} KSAUDIO_STEREO_ENHANCE,*PKSAUDIO_STEREO_ENHANCE; + +typedef enum { + KSPROPERTY_SYSAUDIO_NORMAL_DEFAULT = 0, + KSPROPERTY_SYSAUDIO_PLAYBACK_DEFAULT, + KSPROPERTY_SYSAUDIO_RECORD_DEFAULT, + KSPROPERTY_SYSAUDIO_MIDI_DEFAULT, + KSPROPERTY_SYSAUDIO_MIXER_DEFAULT +} KSPROPERTY_SYSAUDIO_DEFAULT_TYPE; + +typedef struct { + WINBOOL Enable; + KSPROPERTY_SYSAUDIO_DEFAULT_TYPE DeviceType; + ULONG Flags; + ULONG Reserved; +} KSAUDIO_PREFERRED_STATUS,*PKSAUDIO_PREFERRED_STATUS; + +#define STATIC_KSNODETYPE_DAC \ + 0x507AE360L,0xC554,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("507AE360-C554-11D0-8A2B-00A0C9255AC1",KSNODETYPE_DAC); +#define KSNODETYPE_DAC DEFINE_GUIDNAMED(KSNODETYPE_DAC) + +#define STATIC_KSNODETYPE_ADC \ + 0x4D837FE0L,0xC555,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("4D837FE0-C555-11D0-8A2B-00A0C9255AC1",KSNODETYPE_ADC); +#define KSNODETYPE_ADC DEFINE_GUIDNAMED(KSNODETYPE_ADC) + +#define STATIC_KSNODETYPE_SRC \ + 0x9DB7B9E0L,0xC555,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("9DB7B9E0-C555-11D0-8A2B-00A0C9255AC1",KSNODETYPE_SRC); +#define KSNODETYPE_SRC DEFINE_GUIDNAMED(KSNODETYPE_SRC) + +#define STATIC_KSNODETYPE_SUPERMIX \ + 0xE573ADC0L,0xC555,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("E573ADC0-C555-11D0-8A2B-00A0C9255AC1",KSNODETYPE_SUPERMIX); +#define KSNODETYPE_SUPERMIX DEFINE_GUIDNAMED(KSNODETYPE_SUPERMIX) + +#define STATIC_KSNODETYPE_MUX \ + 0x2CEAF780L,0xC556,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("2CEAF780-C556-11D0-8A2B-00A0C9255AC1",KSNODETYPE_MUX); +#define KSNODETYPE_MUX DEFINE_GUIDNAMED(KSNODETYPE_MUX) + +#define STATIC_KSNODETYPE_DEMUX \ + 0xC0EB67D4L,0xE807,0x11D0,0x95,0x8A,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("C0EB67D4-E807-11D0-958A-00C04FB925D3",KSNODETYPE_DEMUX); +#define KSNODETYPE_DEMUX DEFINE_GUIDNAMED(KSNODETYPE_DEMUX) + +#define STATIC_KSNODETYPE_SUM \ + 0xDA441A60L,0xC556,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("DA441A60-C556-11D0-8A2B-00A0C9255AC1",KSNODETYPE_SUM); +#define KSNODETYPE_SUM DEFINE_GUIDNAMED(KSNODETYPE_SUM) + +#define STATIC_KSNODETYPE_MUTE \ + 0x02B223C0L,0xC557,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("02B223C0-C557-11D0-8A2B-00A0C9255AC1",KSNODETYPE_MUTE); +#define KSNODETYPE_MUTE DEFINE_GUIDNAMED(KSNODETYPE_MUTE) + +#define STATIC_KSNODETYPE_VOLUME \ + 0x3A5ACC00L,0xC557,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("3A5ACC00-C557-11D0-8A2B-00A0C9255AC1",KSNODETYPE_VOLUME); +#define KSNODETYPE_VOLUME DEFINE_GUIDNAMED(KSNODETYPE_VOLUME) + +#define STATIC_KSNODETYPE_TONE \ + 0x7607E580L,0xC557,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("7607E580-C557-11D0-8A2B-00A0C9255AC1",KSNODETYPE_TONE); +#define KSNODETYPE_TONE DEFINE_GUIDNAMED(KSNODETYPE_TONE) + +#define STATIC_KSNODETYPE_EQUALIZER \ + 0x9D41B4A0L,0xC557,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("9D41B4A0-C557-11D0-8A2B-00A0C9255AC1",KSNODETYPE_EQUALIZER); +#define KSNODETYPE_EQUALIZER DEFINE_GUIDNAMED(KSNODETYPE_EQUALIZER) + +#define STATIC_KSNODETYPE_AGC \ + 0xE88C9BA0L,0xC557,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("E88C9BA0-C557-11D0-8A2B-00A0C9255AC1",KSNODETYPE_AGC); +#define KSNODETYPE_AGC DEFINE_GUIDNAMED(KSNODETYPE_AGC) + +#define STATIC_KSNODETYPE_NOISE_SUPPRESS \ + 0xe07f903f,0x62fd,0x4e60,0x8c,0xdd,0xde,0xa7,0x23,0x66,0x65,0xb5 +DEFINE_GUIDSTRUCT("E07F903F-62FD-4e60-8CDD-DEA7236665B5",KSNODETYPE_NOISE_SUPPRESS); +#define KSNODETYPE_NOISE_SUPPRESS DEFINE_GUIDNAMED(KSNODETYPE_NOISE_SUPPRESS) + +#define STATIC_KSNODETYPE_DELAY \ + 0x144981E0L,0xC558,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("144981E0-C558-11D0-8A2B-00A0C9255AC1",KSNODETYPE_DELAY); +#define KSNODETYPE_DELAY DEFINE_GUIDNAMED(KSNODETYPE_DELAY) + +#define STATIC_KSNODETYPE_LOUDNESS \ + 0x41887440L,0xC558,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("41887440-C558-11D0-8A2B-00A0C9255AC1",KSNODETYPE_LOUDNESS); +#define KSNODETYPE_LOUDNESS DEFINE_GUIDNAMED(KSNODETYPE_LOUDNESS) + +#define STATIC_KSNODETYPE_PROLOGIC_DECODER \ + 0x831C2C80L,0xC558,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("831C2C80-C558-11D0-8A2B-00A0C9255AC1",KSNODETYPE_PROLOGIC_DECODER); +#define KSNODETYPE_PROLOGIC_DECODER DEFINE_GUIDNAMED(KSNODETYPE_PROLOGIC_DECODER) + +#define STATIC_KSNODETYPE_STEREO_WIDE \ + 0xA9E69800L,0xC558,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("A9E69800-C558-11D0-8A2B-00A0C9255AC1",KSNODETYPE_STEREO_WIDE); +#define KSNODETYPE_STEREO_WIDE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_WIDE) + +#define STATIC_KSNODETYPE_STEREO_ENHANCE \ + 0xAF6878ACL,0xE83F,0x11D0,0x95,0x8A,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("AF6878AC-E83F-11D0-958A-00C04FB925D3",KSNODETYPE_STEREO_ENHANCE); +#define KSNODETYPE_STEREO_ENHANCE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_ENHANCE) + +#define STATIC_KSNODETYPE_REVERB \ + 0xEF0328E0L,0xC558,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("EF0328E0-C558-11D0-8A2B-00A0C9255AC1",KSNODETYPE_REVERB); +#define KSNODETYPE_REVERB DEFINE_GUIDNAMED(KSNODETYPE_REVERB) + +#define STATIC_KSNODETYPE_CHORUS \ + 0x20173F20L,0xC559,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("20173F20-C559-11D0-8A2B-00A0C9255AC1",KSNODETYPE_CHORUS); +#define KSNODETYPE_CHORUS DEFINE_GUIDNAMED(KSNODETYPE_CHORUS) + +#define STATIC_KSNODETYPE_3D_EFFECTS \ + 0x55515860L,0xC559,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("55515860-C559-11D0-8A2B-00A0C9255AC1",KSNODETYPE_3D_EFFECTS); +#define KSNODETYPE_3D_EFFECTS DEFINE_GUIDNAMED(KSNODETYPE_3D_EFFECTS) + +#define STATIC_KSNODETYPE_ACOUSTIC_ECHO_CANCEL STATIC_KSCATEGORY_ACOUSTIC_ECHO_CANCEL +#define KSNODETYPE_ACOUSTIC_ECHO_CANCEL KSCATEGORY_ACOUSTIC_ECHO_CANCEL + +#define STATIC_KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL \ + 0x1c22c56dL,0x9879,0x4f5b,0xa3,0x89,0x27,0x99,0x6d,0xdc,0x28,0x10 +DEFINE_GUIDSTRUCT("1C22C56D-9879-4f5b-A389-27996DDC2810",KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL); +#define KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_ACOUSTIC_ECHO_CANCEL) + +#define STATIC_KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS \ + 0x5ab0882eL,0x7274,0x4516,0x87,0x7d,0x4e,0xee,0x99,0xba,0x4f,0xd0 +DEFINE_GUIDSTRUCT("5AB0882E-7274-4516-877D-4EEE99BA4FD0",KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS); +#define KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_NOISE_SUPPRESS) + +#define STATIC_KSALGORITHMINSTANCE_SYSTEM_AGC \ + 0x950e55b9L,0x877c,0x4c67,0xbe,0x8,0xe4,0x7b,0x56,0x11,0x13,0xa +DEFINE_GUIDSTRUCT("950E55B9-877C-4c67-BE08-E47B5611130A",KSALGORITHMINSTANCE_SYSTEM_AGC); +#define KSALGORITHMINSTANCE_SYSTEM_AGC DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_AGC) + +#define STATIC_KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR \ + 0xB6F5A0A0L,0x9E61,0x4F8C,0x91,0xE3,0x76,0xCF,0xF,0x3C,0x47,0x1F +DEFINE_GUIDSTRUCT("B6F5A0A0-9E61-4f8c-91E3-76CF0F3C471F",KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR); +#define KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR DEFINE_GUIDNAMED(KSALGORITHMINSTANCE_SYSTEM_MICROPHONE_ARRAY_PROCESSOR) + +#define STATIC_KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR STATIC_KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR +#define KSNODETYPE_MICROPHONE_ARRAY_PROCESSOR KSCATEGORY_MICROPHONE_ARRAY_PROCESSOR + +#define STATIC_KSNODETYPE_DEV_SPECIFIC \ + 0x941C7AC0L,0xC559,0x11D0,0x8A,0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1 +DEFINE_GUIDSTRUCT("941C7AC0-C559-11D0-8A2B-00A0C9255AC1",KSNODETYPE_DEV_SPECIFIC); +#define KSNODETYPE_DEV_SPECIFIC DEFINE_GUIDNAMED(KSNODETYPE_DEV_SPECIFIC) + +#define STATIC_KSNODETYPE_PROLOGIC_ENCODER \ + 0x8074C5B2L,0x3C66,0x11D2,0xB4,0x5A,0x30,0x78,0x30,0x2C,0x20,0x30 +DEFINE_GUIDSTRUCT("8074C5B2-3C66-11D2-B45A-3078302C2030",KSNODETYPE_PROLOGIC_ENCODER); +#define KSNODETYPE_PROLOGIC_ENCODER DEFINE_GUIDNAMED(KSNODETYPE_PROLOGIC_ENCODER) +#define KSNODETYPE_SURROUND_ENCODER KSNODETYPE_PROLOGIC_ENCODER + +#define STATIC_KSNODETYPE_PEAKMETER \ + 0xa085651eL,0x5f0d,0x4b36,0xa8,0x69,0xd1,0x95,0xd6,0xab,0x4b,0x9e +DEFINE_GUIDSTRUCT("A085651E-5F0D-4b36-A869-D195D6AB4B9E",KSNODETYPE_PEAKMETER); +#define KSNODETYPE_PEAKMETER DEFINE_GUIDNAMED(KSNODETYPE_PEAKMETER) + +#define STATIC_KSAUDFNAME_BASS \ + 0x185FEDE0L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE0-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_BASS); +#define KSAUDFNAME_BASS DEFINE_GUIDNAMED(KSAUDFNAME_BASS) + +#define STATIC_KSAUDFNAME_TREBLE \ + 0x185FEDE1L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE1-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_TREBLE); +#define KSAUDFNAME_TREBLE DEFINE_GUIDNAMED(KSAUDFNAME_TREBLE) + +#define STATIC_KSAUDFNAME_3D_STEREO \ + 0x185FEDE2L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE2-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_3D_STEREO); +#define KSAUDFNAME_3D_STEREO DEFINE_GUIDNAMED(KSAUDFNAME_3D_STEREO) + +#define STATIC_KSAUDFNAME_MASTER_VOLUME \ + 0x185FEDE3L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE3-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MASTER_VOLUME); +#define KSAUDFNAME_MASTER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_VOLUME) + +#define STATIC_KSAUDFNAME_MASTER_MUTE \ + 0x185FEDE4L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE4-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MASTER_MUTE); +#define KSAUDFNAME_MASTER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_MUTE) + +#define STATIC_KSAUDFNAME_WAVE_VOLUME \ + 0x185FEDE5L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE5-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_WAVE_VOLUME); +#define KSAUDFNAME_WAVE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_VOLUME) + +#define STATIC_KSAUDFNAME_WAVE_MUTE \ + 0x185FEDE6L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE6-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_WAVE_MUTE); +#define KSAUDFNAME_WAVE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_MUTE) + +#define STATIC_KSAUDFNAME_MIDI_VOLUME \ + 0x185FEDE7L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE7-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIDI_VOLUME); +#define KSAUDFNAME_MIDI_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_VOLUME) + +#define STATIC_KSAUDFNAME_MIDI_MUTE \ + 0x185FEDE8L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE8-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIDI_MUTE); +#define KSAUDFNAME_MIDI_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_MUTE) + +#define STATIC_KSAUDFNAME_CD_VOLUME \ + 0x185FEDE9L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDE9-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_CD_VOLUME); +#define KSAUDFNAME_CD_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_VOLUME) + +#define STATIC_KSAUDFNAME_CD_MUTE \ + 0x185FEDEAL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDEA-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_CD_MUTE); +#define KSAUDFNAME_CD_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_CD_MUTE) + +#define STATIC_KSAUDFNAME_LINE_VOLUME \ + 0x185FEDEBL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDEB-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_LINE_VOLUME); +#define KSAUDFNAME_LINE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_VOLUME) + +#define STATIC_KSAUDFNAME_LINE_MUTE \ + 0x185FEDECL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDEC-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_LINE_MUTE); +#define KSAUDFNAME_LINE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_LINE_MUTE) + +#define STATIC_KSAUDFNAME_MIC_VOLUME \ + 0x185FEDEDL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDED-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIC_VOLUME); +#define KSAUDFNAME_MIC_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_VOLUME) + +#define STATIC_KSAUDFNAME_MIC_MUTE \ + 0x185FEDEEL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDEE-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIC_MUTE); +#define KSAUDFNAME_MIC_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIC_MUTE) + +#define STATIC_KSAUDFNAME_RECORDING_SOURCE \ + 0x185FEDEFL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDEF-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_RECORDING_SOURCE); +#define KSAUDFNAME_RECORDING_SOURCE DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_SOURCE) + +#define STATIC_KSAUDFNAME_PC_SPEAKER_VOLUME \ + 0x185FEDF0L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF0-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_PC_SPEAKER_VOLUME); +#define KSAUDFNAME_PC_SPEAKER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_VOLUME) + +#define STATIC_KSAUDFNAME_PC_SPEAKER_MUTE \ + 0x185FEDF1L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF1-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_PC_SPEAKER_MUTE); +#define KSAUDFNAME_PC_SPEAKER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER_MUTE) + +#define STATIC_KSAUDFNAME_MIDI_IN_VOLUME \ + 0x185FEDF2L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF2-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIDI_IN_VOLUME); +#define KSAUDFNAME_MIDI_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIDI_IN_VOLUME) + +#define STATIC_KSAUDFNAME_CD_IN_VOLUME \ + 0x185FEDF3L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF3-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_CD_IN_VOLUME); +#define KSAUDFNAME_CD_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_IN_VOLUME) + +#define STATIC_KSAUDFNAME_LINE_IN_VOLUME \ + 0x185FEDF4L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF4-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_LINE_IN_VOLUME); +#define KSAUDFNAME_LINE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN_VOLUME) + +#define STATIC_KSAUDFNAME_MIC_IN_VOLUME \ + 0x185FEDF5L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF5-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIC_IN_VOLUME); +#define KSAUDFNAME_MIC_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_IN_VOLUME) + +#define STATIC_KSAUDFNAME_WAVE_IN_VOLUME \ + 0x185FEDF6L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF6-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_WAVE_IN_VOLUME); +#define KSAUDFNAME_WAVE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_IN_VOLUME) + +#define STATIC_KSAUDFNAME_VOLUME_CONTROL \ + 0x185FEDF7L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF7-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_VOLUME_CONTROL); +#define KSAUDFNAME_VOLUME_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_VOLUME_CONTROL) + +#define STATIC_KSAUDFNAME_MIDI \ + 0x185FEDF8L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF8-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_MIDI); +#define KSAUDFNAME_MIDI DEFINE_GUIDNAMED(KSAUDFNAME_MIDI) + +#define STATIC_KSAUDFNAME_LINE_IN \ + 0x185FEDF9L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDF9-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_LINE_IN); +#define KSAUDFNAME_LINE_IN DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN) + +#define STATIC_KSAUDFNAME_RECORDING_CONTROL \ + 0x185FEDFAL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFA-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_RECORDING_CONTROL); +#define KSAUDFNAME_RECORDING_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_CONTROL) + +#define STATIC_KSAUDFNAME_CD_AUDIO \ + 0x185FEDFBL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFB-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_CD_AUDIO); +#define KSAUDFNAME_CD_AUDIO DEFINE_GUIDNAMED(KSAUDFNAME_CD_AUDIO) + +#define STATIC_KSAUDFNAME_AUX_VOLUME \ + 0x185FEDFCL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFC-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_AUX_VOLUME); +#define KSAUDFNAME_AUX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_AUX_VOLUME) + +#define STATIC_KSAUDFNAME_AUX_MUTE \ + 0x185FEDFDL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFD-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_AUX_MUTE); +#define KSAUDFNAME_AUX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_AUX_MUTE) + +#define STATIC_KSAUDFNAME_AUX \ + 0x185FEDFEL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFE-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_AUX); +#define KSAUDFNAME_AUX DEFINE_GUIDNAMED(KSAUDFNAME_AUX) + +#define STATIC_KSAUDFNAME_PC_SPEAKER \ + 0x185FEDFFL,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEDFF-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_PC_SPEAKER); +#define KSAUDFNAME_PC_SPEAKER DEFINE_GUIDNAMED(KSAUDFNAME_PC_SPEAKER) + +#define STATIC_KSAUDFNAME_WAVE_OUT_MIX \ + 0x185FEE00L,0x9905,0x11D1,0x95,0xA9,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("185FEE00-9905-11D1-95A9-00C04FB925D3",KSAUDFNAME_WAVE_OUT_MIX); +#define KSAUDFNAME_WAVE_OUT_MIX DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_OUT_MIX) + +#define STATIC_KSAUDFNAME_MONO_OUT \ + 0xf9b41dc3L,0x96e2,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("F9B41DC3-96E2-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_OUT); +#define KSAUDFNAME_MONO_OUT DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT) + +#define STATIC_KSAUDFNAME_STEREO_MIX \ + 0xdff077L,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("00DFF077-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_STEREO_MIX); +#define KSAUDFNAME_STEREO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX) + +#define STATIC_KSAUDFNAME_MONO_MIX \ + 0xdff078L,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("00DFF078-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_MIX); +#define KSAUDFNAME_MONO_MIX DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX) + +#define STATIC_KSAUDFNAME_MONO_OUT_VOLUME \ + 0x1ad247ebL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("1AD247EB-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_OUT_VOLUME); +#define KSAUDFNAME_MONO_OUT_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_VOLUME) + +#define STATIC_KSAUDFNAME_MONO_OUT_MUTE \ + 0x1ad247ecL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("1AD247EC-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_OUT_MUTE); +#define KSAUDFNAME_MONO_OUT_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_OUT_MUTE) + +#define STATIC_KSAUDFNAME_STEREO_MIX_VOLUME \ + 0x1ad247edL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("1AD247ED-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_STEREO_MIX_VOLUME); +#define KSAUDFNAME_STEREO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_VOLUME) + +#define STATIC_KSAUDFNAME_STEREO_MIX_MUTE \ + 0x22b0eafdL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("22B0EAFD-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_STEREO_MIX_MUTE); +#define KSAUDFNAME_STEREO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_STEREO_MIX_MUTE) + +#define STATIC_KSAUDFNAME_MONO_MIX_VOLUME \ + 0x22b0eafeL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("22B0EAFE-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_MIX_VOLUME); +#define KSAUDFNAME_MONO_MIX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_VOLUME) + +#define STATIC_KSAUDFNAME_MONO_MIX_MUTE \ + 0x2bc31d69L,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("2BC31D69-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MONO_MIX_MUTE); +#define KSAUDFNAME_MONO_MIX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MONO_MIX_MUTE) + +#define STATIC_KSAUDFNAME_MICROPHONE_BOOST \ + 0x2bc31d6aL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("2BC31D6A-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_MICROPHONE_BOOST); +#define KSAUDFNAME_MICROPHONE_BOOST DEFINE_GUIDNAMED(KSAUDFNAME_MICROPHONE_BOOST) + +#define STATIC_KSAUDFNAME_ALTERNATE_MICROPHONE \ + 0x2bc31d6bL,0x96e3,0x11d2,0xac,0x4c,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("2BC31D6B-96E3-11d2-AC4C-00C04F8EFB68",KSAUDFNAME_ALTERNATE_MICROPHONE); +#define KSAUDFNAME_ALTERNATE_MICROPHONE DEFINE_GUIDNAMED(KSAUDFNAME_ALTERNATE_MICROPHONE) + +#define STATIC_KSAUDFNAME_3D_DEPTH \ + 0x63ff5747L,0x991f,0x11d2,0xac,0x4d,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("63FF5747-991F-11d2-AC4D-00C04F8EFB68",KSAUDFNAME_3D_DEPTH); +#define KSAUDFNAME_3D_DEPTH DEFINE_GUIDNAMED(KSAUDFNAME_3D_DEPTH) + +#define STATIC_KSAUDFNAME_3D_CENTER \ + 0x9f0670b4L,0x991f,0x11d2,0xac,0x4d,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("9F0670B4-991F-11d2-AC4D-00C04F8EFB68",KSAUDFNAME_3D_CENTER); +#define KSAUDFNAME_3D_CENTER DEFINE_GUIDNAMED(KSAUDFNAME_3D_CENTER) + +#define STATIC_KSAUDFNAME_VIDEO_VOLUME \ + 0x9b46e708L,0x992a,0x11d2,0xac,0x4d,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("9B46E708-992A-11d2-AC4D-00C04F8EFB68",KSAUDFNAME_VIDEO_VOLUME); +#define KSAUDFNAME_VIDEO_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_VOLUME) + +#define STATIC_KSAUDFNAME_VIDEO_MUTE \ + 0x9b46e709L,0x992a,0x11d2,0xac,0x4d,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("9B46E709-992A-11d2-AC4D-00C04F8EFB68",KSAUDFNAME_VIDEO_MUTE); +#define KSAUDFNAME_VIDEO_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO_MUTE) + +#define STATIC_KSAUDFNAME_VIDEO \ + 0x915daec4L,0xa434,0x11d2,0xac,0x52,0x0,0xc0,0x4f,0x8e,0xfb,0x68 +DEFINE_GUIDSTRUCT("915DAEC4-A434-11d2-AC52-00C04F8EFB68",KSAUDFNAME_VIDEO); +#define KSAUDFNAME_VIDEO DEFINE_GUIDNAMED(KSAUDFNAME_VIDEO) + +#define STATIC_KSAUDFNAME_PEAKMETER \ + 0x57e24340L,0xfc5b,0x4612,0xa5,0x62,0x72,0xb1,0x1a,0x29,0xdf,0xae +DEFINE_GUIDSTRUCT("57E24340-FC5B-4612-A562-72B11A29DFAE",KSAUDFNAME_PEAKMETER); +#define KSAUDFNAME_PEAKMETER DEFINE_GUIDNAMED(KSAUDFNAME_PEAKMETER) + +#define KSNODEPIN_STANDARD_IN 1 +#define KSNODEPIN_STANDARD_OUT 0 + +#define KSNODEPIN_SUM_MUX_IN 1 +#define KSNODEPIN_SUM_MUX_OUT 0 + +#define KSNODEPIN_DEMUX_IN 0 +#define KSNODEPIN_DEMUX_OUT 1 + +#define KSNODEPIN_AEC_RENDER_IN 1 +#define KSNODEPIN_AEC_RENDER_OUT 0 +#define KSNODEPIN_AEC_CAPTURE_IN 2 +#define KSNODEPIN_AEC_CAPTURE_OUT 3 + +#define STATIC_KSMETHODSETID_Wavetable \ + 0xDCEF31EBL,0xD907,0x11D0,0x95,0x83,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("DCEF31EB-D907-11D0-9583-00C04FB925D3",KSMETHODSETID_Wavetable); +#define KSMETHODSETID_Wavetable DEFINE_GUIDNAMED(KSMETHODSETID_Wavetable) + +typedef enum { + KSMETHOD_WAVETABLE_WAVE_ALLOC, + KSMETHOD_WAVETABLE_WAVE_FREE, + KSMETHOD_WAVETABLE_WAVE_FIND, + KSMETHOD_WAVETABLE_WAVE_WRITE +} KSMETHOD_WAVETABLE; + +typedef struct { + KSIDENTIFIER Identifier; + ULONG Size; + WINBOOL Looped; + ULONG LoopPoint; + WINBOOL InROM; + KSDATAFORMAT Format; +} KSWAVETABLE_WAVE_DESC,*PKSWAVETABLE_WAVE_DESC; + +#define STATIC_KSPROPSETID_Acoustic_Echo_Cancel \ + 0xd7a4af8bL,0x3dc1,0x4902,0x91,0xea,0x8a,0x15,0xc9,0x0e,0x05,0xb2 +DEFINE_GUIDSTRUCT("D7A4AF8B-3DC1-4902-91EA-8A15C90E05B2",KSPROPSETID_Acoustic_Echo_Cancel); +#define KSPROPSETID_Acoustic_Echo_Cancel DEFINE_GUIDNAMED(KSPROPSETID_Acoustic_Echo_Cancel) + +typedef enum { + KSPROPERTY_AEC_NOISE_FILL_ENABLE = 0, + KSPROPERTY_AEC_STATUS, + KSPROPERTY_AEC_MODE +} KSPROPERTY_AEC; + +#define AEC_STATUS_FD_HISTORY_UNINITIALIZED 0x0 +#define AEC_STATUS_FD_HISTORY_CONTINUOUSLY_CONVERGED 0x1 +#define AEC_STATUS_FD_HISTORY_PREVIOUSLY_DIVERGED 0x2 +#define AEC_STATUS_FD_CURRENTLY_CONVERGED 0x8 + +#define AEC_MODE_PASS_THROUGH 0x0 +#define AEC_MODE_HALF_DUPLEX 0x1 +#define AEC_MODE_FULL_DUPLEX 0x2 + +#define STATIC_KSPROPSETID_Wave \ + 0x924e54b0L,0x630f,0x11cf,0xad,0xa7,0x08,0x00,0x3e,0x30,0x49,0x4a +DEFINE_GUIDSTRUCT("924e54b0-630f-11cf-ada7-08003e30494a",KSPROPSETID_Wave); +#define KSPROPSETID_Wave DEFINE_GUIDNAMED(KSPROPSETID_Wave) + +typedef enum { + KSPROPERTY_WAVE_COMPATIBLE_CAPABILITIES, + KSPROPERTY_WAVE_INPUT_CAPABILITIES, + KSPROPERTY_WAVE_OUTPUT_CAPABILITIES, + KSPROPERTY_WAVE_BUFFER, + KSPROPERTY_WAVE_FREQUENCY, + KSPROPERTY_WAVE_VOLUME, + KSPROPERTY_WAVE_PAN +} KSPROPERTY_WAVE; + +typedef struct { + ULONG ulDeviceType; +} KSWAVE_COMPATCAPS,*PKSWAVE_COMPATCAPS; + +#define KSWAVE_COMPATCAPS_INPUT 0x00000000 +#define KSWAVE_COMPATCAPS_OUTPUT 0x00000001 + +typedef struct { + ULONG MaximumChannelsPerConnection; + ULONG MinimumBitsPerSample; + ULONG MaximumBitsPerSample; + ULONG MinimumSampleFrequency; + ULONG MaximumSampleFrequency; + ULONG TotalConnections; + ULONG ActiveConnections; +} KSWAVE_INPUT_CAPABILITIES,*PKSWAVE_INPUT_CAPABILITIES; + +typedef struct { + ULONG MaximumChannelsPerConnection; + ULONG MinimumBitsPerSample; + ULONG MaximumBitsPerSample; + ULONG MinimumSampleFrequency; + ULONG MaximumSampleFrequency; + ULONG TotalConnections; + ULONG StaticConnections; + ULONG StreamingConnections; + ULONG ActiveConnections; + ULONG ActiveStaticConnections; + ULONG ActiveStreamingConnections; + ULONG Total3DConnections; + ULONG Static3DConnections; + ULONG Streaming3DConnections; + ULONG Active3DConnections; + ULONG ActiveStatic3DConnections; + ULONG ActiveStreaming3DConnections; + ULONG TotalSampleMemory; + ULONG FreeSampleMemory; + ULONG LargestFreeContiguousSampleMemory; +} KSWAVE_OUTPUT_CAPABILITIES,*PKSWAVE_OUTPUT_CAPABILITIES; + +typedef struct { + LONG LeftAttenuation; + LONG RightAttenuation; +} KSWAVE_VOLUME,*PKSWAVE_VOLUME; + +#define KSWAVE_BUFFER_ATTRIBUTEF_LOOPING 0x00000001 +#define KSWAVE_BUFFER_ATTRIBUTEF_STATIC 0x00000002 + +typedef struct { + ULONG Attributes; + ULONG BufferSize; + PVOID BufferAddress; +} KSWAVE_BUFFER,*PKSWAVE_BUFFER; + +#define STATIC_KSMUSIC_TECHNOLOGY_PORT \ + 0x86C92E60L,0x62E8,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("86C92E60-62E8-11CF-A5D6-28DB04C10000",KSMUSIC_TECHNOLOGY_PORT); +#define KSMUSIC_TECHNOLOGY_PORT DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_PORT) + +#define STATIC_KSMUSIC_TECHNOLOGY_SQSYNTH \ + 0x0ECF4380L,0x62E9,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("0ECF4380-62E9-11CF-A5D6-28DB04C10000",KSMUSIC_TECHNOLOGY_SQSYNTH); +#define KSMUSIC_TECHNOLOGY_SQSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SQSYNTH) + +#define STATIC_KSMUSIC_TECHNOLOGY_FMSYNTH \ + 0x252C5C80L,0x62E9,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("252C5C80-62E9-11CF-A5D6-28DB04C10000",KSMUSIC_TECHNOLOGY_FMSYNTH); +#define KSMUSIC_TECHNOLOGY_FMSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_FMSYNTH) + +#define STATIC_KSMUSIC_TECHNOLOGY_WAVETABLE \ + 0x394EC7C0L,0x62E9,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("394EC7C0-62E9-11CF-A5D6-28DB04C10000",KSMUSIC_TECHNOLOGY_WAVETABLE); +#define KSMUSIC_TECHNOLOGY_WAVETABLE DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_WAVETABLE) + +#define STATIC_KSMUSIC_TECHNOLOGY_SWSYNTH \ + 0x37407736L,0x3620,0x11D1,0x85,0xD3,0x00,0x00,0xF8,0x75,0x43,0x80 +DEFINE_GUIDSTRUCT("37407736-3620-11D1-85D3-0000F8754380",KSMUSIC_TECHNOLOGY_SWSYNTH); +#define KSMUSIC_TECHNOLOGY_SWSYNTH DEFINE_GUIDNAMED(KSMUSIC_TECHNOLOGY_SWSYNTH) + +#define STATIC_KSPROPSETID_WaveTable \ + 0x8539E660L,0x62E9,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("8539E660-62E9-11CF-A5D6-28DB04C10000",KSPROPSETID_WaveTable); +#define KSPROPSETID_WaveTable DEFINE_GUIDNAMED(KSPROPSETID_WaveTable) + +typedef enum { + KSPROPERTY_WAVETABLE_LOAD_SAMPLE, + KSPROPERTY_WAVETABLE_UNLOAD_SAMPLE, + KSPROPERTY_WAVETABLE_MEMORY, + KSPROPERTY_WAVETABLE_VERSION +} KSPROPERTY_WAVETABLE; + +typedef struct { + KSDATARANGE DataRange; + GUID Technology; + ULONG Channels; + ULONG Notes; + ULONG ChannelMask; +} KSDATARANGE_MUSIC,*PKSDATARANGE_MUSIC; + +#define STATIC_KSEVENTSETID_Cyclic \ + 0x142C1AC0L,0x072A,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("142C1AC0-072A-11D0-A5D6-28DB04C10000",KSEVENTSETID_Cyclic); +#define KSEVENTSETID_Cyclic DEFINE_GUIDNAMED(KSEVENTSETID_Cyclic) + +typedef enum { + KSEVENT_CYCLIC_TIME_INTERVAL +} KSEVENT_CYCLIC_TIME; + +#define STATIC_KSPROPSETID_Cyclic \ + 0x3FFEAEA0L,0x2BEE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("3FFEAEA0-2BEE-11CF-A5D6-28DB04C10000",KSPROPSETID_Cyclic); +#define KSPROPSETID_Cyclic DEFINE_GUIDNAMED(KSPROPSETID_Cyclic) + +typedef enum { + KSPROPERTY_CYCLIC_POSITION +} KSPROPERTY_CYCLIC; + +#define STATIC_KSEVENTSETID_AudioControlChange \ + 0xE85E9698L,0xFA2F,0x11D1,0x95,0xBD,0x00,0xC0,0x4F,0xB9,0x25,0xD3 +DEFINE_GUIDSTRUCT("E85E9698-FA2F-11D1-95BD-00C04FB925D3",KSEVENTSETID_AudioControlChange); +#define KSEVENTSETID_AudioControlChange DEFINE_GUIDNAMED(KSEVENTSETID_AudioControlChange) + +typedef enum { + KSEVENT_CONTROL_CHANGE +} KSEVENT_AUDIO_CONTROL_CHANGE; + +#define STATIC_KSEVENTSETID_LoopedStreaming \ + 0x4682B940L,0xC6EF,0x11D0,0x96,0xD8,0x00,0xAA,0x00,0x51,0xE5,0x1D +DEFINE_GUIDSTRUCT("4682B940-C6EF-11D0-96D8-00AA0051E51D",KSEVENTSETID_LoopedStreaming); +#define KSEVENTSETID_LoopedStreaming DEFINE_GUIDNAMED(KSEVENTSETID_LoopedStreaming) + +typedef enum { + KSEVENT_LOOPEDSTREAMING_POSITION +} KSEVENT_LOOPEDSTREAMING; + +typedef struct { + KSEVENTDATA KsEventData; + DWORDLONG Position; +} LOOPEDSTREAMING_POSITION_EVENT_DATA,*PLOOPEDSTREAMING_POSITION_EVENT_DATA; + +#define STATIC_KSPROPSETID_Sysaudio \ + 0xCBE3FAA0L,0xCC75,0x11D0,0xB4,0x65,0x00,0x00,0x1A,0x18,0x18,0xE6 +DEFINE_GUIDSTRUCT("CBE3FAA0-CC75-11D0-B465-00001A1818E6",KSPROPSETID_Sysaudio); +#define KSPROPSETID_Sysaudio DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio) + +typedef enum { + KSPROPERTY_SYSAUDIO_DEVICE_COUNT = 1, + KSPROPERTY_SYSAUDIO_DEVICE_FRIENDLY_NAME = 2, + KSPROPERTY_SYSAUDIO_DEVICE_INSTANCE = 3, + KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME = 4, + KSPROPERTY_SYSAUDIO_SELECT_GRAPH = 5, + KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE = 6, + KSPROPERTY_SYSAUDIO_DEVICE_DEFAULT = 7, + KSPROPERTY_SYSAUDIO_INSTANCE_INFO = 14, + KSPROPERTY_SYSAUDIO_COMPONENT_ID = 16 +} KSPROPERTY_SYSAUDIO; + +typedef struct { + KSPROPERTY Property; + GUID PinCategory; + GUID PinName; +} SYSAUDIO_CREATE_VIRTUAL_SOURCE,*PSYSAUDIO_CREATE_VIRTUAL_SOURCE; + +typedef struct { + KSPROPERTY Property; + ULONG PinId; + ULONG NodeId; + ULONG Flags; + ULONG Reserved; +} SYSAUDIO_SELECT_GRAPH,*PSYSAUDIO_SELECT_GRAPH; + +typedef struct { + KSPROPERTY Property; + ULONG Flags; + ULONG DeviceNumber; +} SYSAUDIO_INSTANCE_INFO,*PSYSAUDIO_INSTANCE_INFO; + +#define SYSAUDIO_FLAGS_DONT_COMBINE_PINS 0x00000001 + +#define STATIC_KSPROPSETID_Sysaudio_Pin \ + 0xA3A53220L,0xC6E4,0x11D0,0xB4,0x65,0x00,0x00,0x1A,0x18,0x18,0xE6 +DEFINE_GUIDSTRUCT("A3A53220-C6E4-11D0-B465-00001A1818E6",KSPROPSETID_Sysaudio_Pin); +#define KSPROPSETID_Sysaudio_Pin DEFINE_GUIDNAMED(KSPROPSETID_Sysaudio_Pin) + +typedef enum { + KSPROPERTY_SYSAUDIO_ATTACH_VIRTUAL_SOURCE = 1 +} KSPROPERTY_SYSAUDIO_PIN; + +typedef struct { + KSPROPERTY Property; + ULONG MixerPinId; + ULONG Reserved; +} SYSAUDIO_ATTACH_VIRTUAL_SOURCE,*PSYSAUDIO_ATTACH_VIRTUAL_SOURCE; + +typedef struct { + KSPROPERTY Property; + ULONG NodeId; + ULONG Reserved; +} KSNODEPROPERTY,*PKSNODEPROPERTY; + +typedef struct { + KSNODEPROPERTY NodeProperty; + LONG Channel; + ULONG Reserved; +} KSNODEPROPERTY_AUDIO_CHANNEL,*PKSNODEPROPERTY_AUDIO_CHANNEL; + +typedef struct { + KSNODEPROPERTY NodeProperty; + ULONG DevSpecificId; + ULONG DeviceInfo; + ULONG Length; +} KSNODEPROPERTY_AUDIO_DEV_SPECIFIC,*PKSNODEPROPERTY_AUDIO_DEV_SPECIFIC; + +typedef struct { + KSNODEPROPERTY NodeProperty; + PVOID ListenerId; +#ifndef _WIN64 + ULONG Reserved; +#endif +} KSNODEPROPERTY_AUDIO_3D_LISTENER,*PKSNODEPROPERTY_AUDIO_3D_LISTENER; + +typedef struct { + KSNODEPROPERTY NodeProperty; + PVOID AppContext; + ULONG Length; +#ifndef _WIN64 + ULONG Reserved; +#endif +} KSNODEPROPERTY_AUDIO_PROPERTY,*PKSNODEPROPERTY_AUDIO_PROPERTY; + +#define STATIC_KSPROPSETID_AudioGfx \ + 0x79a9312eL,0x59ae,0x43b0,0xa3,0x50,0x8b,0x5,0x28,0x4c,0xab,0x24 +DEFINE_GUIDSTRUCT("79A9312E-59AE-43b0-A350-8B05284CAB24",KSPROPSETID_AudioGfx); +#define KSPROPSETID_AudioGfx DEFINE_GUIDNAMED(KSPROPSETID_AudioGfx) + +typedef enum { + KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID, + KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID +} KSPROPERTY_AUDIOGFX; + +#define STATIC_KSPROPSETID_Linear \ + 0x5A2FFE80L,0x16B9,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("5A2FFE80-16B9-11D0-A5D6-28DB04C10000",KSPROPSETID_Linear); +#define KSPROPSETID_Linear DEFINE_GUIDNAMED(KSPROPSETID_Linear) + +typedef enum { + KSPROPERTY_LINEAR_POSITION +} KSPROPERTY_LINEAR; + +#define STATIC_KSDATAFORMAT_TYPE_MUSIC \ + 0xE725D360L,0x62CC,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("E725D360-62CC-11CF-A5D6-28DB04C10000",KSDATAFORMAT_TYPE_MUSIC); +#define KSDATAFORMAT_TYPE_MUSIC DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MUSIC) + +#define STATIC_KSDATAFORMAT_TYPE_MIDI \ + 0x7364696DL,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71 +DEFINE_GUIDSTRUCT("7364696D-0000-0010-8000-00aa00389b71",KSDATAFORMAT_TYPE_MIDI); +#define KSDATAFORMAT_TYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MIDI) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MIDI \ + 0x1D262760L,0xE957,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("1D262760-E957-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SUBTYPE_MIDI); +#define KSDATAFORMAT_SUBTYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MIDI_BUS \ + 0x2CA15FA0L,0x6CFE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 +DEFINE_GUIDSTRUCT("2CA15FA0-6CFE-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SUBTYPE_MIDI_BUS); +#define KSDATAFORMAT_SUBTYPE_MIDI_BUS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI_BUS) + +#define STATIC_KSDATAFORMAT_SUBTYPE_RIFFMIDI \ + 0x4995DAF0L,0x9EE6,0x11D0,0xA4,0x0E,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("4995DAF0-9EE6-11D0-A40E-00A0C9223196",KSDATAFORMAT_SUBTYPE_RIFFMIDI); +#define KSDATAFORMAT_SUBTYPE_RIFFMIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RIFFMIDI) + +typedef struct { + ULONG TimeDeltaMs; + + ULONG ByteCount; +} KSMUSICFORMAT,*PKSMUSICFORMAT; + +#define STATIC_KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM \ + 0x36523b11L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B11-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM); +#define KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_ELEMENTARY_STREAM) + +#define STATIC_KSDATAFORMAT_TYPE_STANDARD_PES_PACKET \ + 0x36523b12L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B12-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_TYPE_STANDARD_PES_PACKET); +#define KSDATAFORMAT_TYPE_STANDARD_PES_PACKET DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PES_PACKET) + +#define STATIC_KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER \ + 0x36523b13L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B13-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER); +#define KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STANDARD_PACK_HEADER) + +#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO \ + 0x36523b21L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B21-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO); +#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_VIDEO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO \ + 0x36523b22L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B22-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO); +#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG1_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO \ + 0x36523b23L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B23-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO); +#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_VIDEO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO \ + 0x36523b24L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B24-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO); +#define KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_MPEG2_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO \ + 0x36523b25L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B25-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO); +#define KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_STANDARD_AC3_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO \ + 0x36523b31L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B31-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO); +#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_VIDEO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO \ + 0x36523b32L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B32-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO); +#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG1_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO \ + 0x36523b33L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B33-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO); +#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_VIDEO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO \ + 0x36523b34L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B34-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO); +#define KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_MPEG2_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO \ + 0x36523b35L,0x8ee5,0x11d1,0x8c,0xa3,0x00,0x60,0xb0,0x57,0x66,0x4a +DEFINE_GUIDSTRUCT("36523B35-8EE5-11d1-8CA3-0060B057664A",KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO); +#define KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DIALECT_AC3_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_DSS_VIDEO \ + 0xa0af4f81L,0xe163,0x11d0,0xba,0xd9,0x00,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("a0af4f81-e163-11d0-bad9-00609744111a",KSDATAFORMAT_SUBTYPE_DSS_VIDEO); +#define KSDATAFORMAT_SUBTYPE_DSS_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_VIDEO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_DSS_AUDIO \ + 0xa0af4f82L,0xe163,0x11d0,0xba,0xd9,0x00,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("a0af4f82-e163-11d0-bad9-00609744111a",KSDATAFORMAT_SUBTYPE_DSS_AUDIO); +#define KSDATAFORMAT_SUBTYPE_DSS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DSS_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Packet \ + 0xe436eb80,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70 +DEFINE_GUIDSTRUCT("e436eb80-524f-11ce-9F53-0020af0ba770",KSDATAFORMAT_SUBTYPE_MPEG1Packet); +#define KSDATAFORMAT_SUBTYPE_MPEG1Packet DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Packet) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Payload \ + 0xe436eb81,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70 +DEFINE_GUIDSTRUCT("e436eb81-524f-11ce-9F53-0020af0ba770",KSDATAFORMAT_SUBTYPE_MPEG1Payload); +#define KSDATAFORMAT_SUBTYPE_MPEG1Payload DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Payload) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG1Video \ + 0xe436eb86,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70 +DEFINE_GUIDSTRUCT("e436eb86-524f-11ce-9f53-0020af0ba770",KSDATAFORMAT_SUBTYPE_MPEG1Video); +#define KSDATAFORMAT_SUBTYPE_MPEG1Video DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG1Video) + +#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO \ + 0x05589f82L,0xc356,0x11ce,0xbf,0x01,0x00,0xaa,0x00,0x55,0x59,0x5a +DEFINE_GUIDSTRUCT("05589f82-c356-11ce-bf01-00aa0055595a",KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO); +#define KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG1_VIDEO) + +#define STATIC_KSDATAFORMAT_TYPE_MPEG2_PES \ + 0xe06d8020L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8020-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_TYPE_MPEG2_PES); +#define KSDATAFORMAT_TYPE_MPEG2_PES DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PES) + +#define STATIC_KSDATAFORMAT_TYPE_MPEG2_PROGRAM \ + 0xe06d8022L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8022-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_TYPE_MPEG2_PROGRAM); +#define KSDATAFORMAT_TYPE_MPEG2_PROGRAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_PROGRAM) + +#define STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT \ + 0xe06d8023L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8023-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_TYPE_MPEG2_TRANSPORT); +#define KSDATAFORMAT_TYPE_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_TRANSPORT) + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO \ + 0xe06d8026L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8026-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO); +#define KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_VIDEO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO \ + 0xe06d80e3L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d80e3-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO); +#define KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_VIDEO) + +#define STATIC_KSPROPSETID_Mpeg2Vid \ + 0xC8E11B60L,0x0CC9,0x11D0,0xBD,0x69,0x00,0x35,0x05,0xC1,0x03,0xA9 +DEFINE_GUIDSTRUCT("C8E11B60-0CC9-11D0-BD69-003505C103A9",KSPROPSETID_Mpeg2Vid); +#define KSPROPSETID_Mpeg2Vid DEFINE_GUIDNAMED(KSPROPSETID_Mpeg2Vid) + +typedef enum { + KSPROPERTY_MPEG2VID_MODES, + KSPROPERTY_MPEG2VID_CUR_MODE, + KSPROPERTY_MPEG2VID_4_3_RECT, + KSPROPERTY_MPEG2VID_16_9_RECT, + KSPROPERTY_MPEG2VID_16_9_PANSCAN +} KSPROPERTY_MPEG2VID; + +#define KSMPEGVIDMODE_PANSCAN 0x0001 +#define KSMPEGVIDMODE_LTRBOX 0x0002 +#define KSMPEGVIDMODE_SCALE 0x0004 + +typedef struct _KSMPEGVID_RECT { + ULONG StartX; + ULONG StartY; + ULONG EndX; + ULONG EndY; +} KSMPEGVID_RECT,*PKSMPEGVID_RECT; + +#define STATIC_KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO \ + 0xe06d802bL,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d802b-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO); +#define KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MPEG2_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO \ + 0xe06d80e5L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d80e5-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO); +#define KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_MPEG2_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_LPCM_AUDIO \ + 0xe06d8032L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8032-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_LPCM_AUDIO); +#define KSDATAFORMAT_SUBTYPE_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_LPCM_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_LPCM_AUDIO \ + 0xe06d80e6L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d80e6-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SPECIFIER_LPCM_AUDIO); +#define KSDATAFORMAT_SPECIFIER_LPCM_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_LPCM_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_AC3_AUDIO \ + 0xe06d802cL,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d802c-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_AC3_AUDIO); +#define KSDATAFORMAT_SUBTYPE_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_AC3_AUDIO \ + 0xe06d80e4L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d80e4-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SPECIFIER_AC3_AUDIO); +#define KSDATAFORMAT_SPECIFIER_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_AC3_AUDIO) + +#define STATIC_KSPROPSETID_AC3 \ + 0xBFABE720L,0x6E1F,0x11D0,0xBC,0xF2,0x44,0x45,0x53,0x54,0x00,0x00 +DEFINE_GUIDSTRUCT("BFABE720-6E1F-11D0-BCF2-444553540000",KSPROPSETID_AC3); +#define KSPROPSETID_AC3 DEFINE_GUIDNAMED(KSPROPSETID_AC3) + +typedef enum { + KSPROPERTY_AC3_ERROR_CONCEALMENT = 1, + KSPROPERTY_AC3_ALTERNATE_AUDIO, + KSPROPERTY_AC3_DOWNMIX, + KSPROPERTY_AC3_BIT_STREAM_MODE, + KSPROPERTY_AC3_DIALOGUE_LEVEL, + KSPROPERTY_AC3_LANGUAGE_CODE, + KSPROPERTY_AC3_ROOM_TYPE +} KSPROPERTY_AC3; + +typedef struct { + WINBOOL fRepeatPreviousBlock; + WINBOOL fErrorInCurrentBlock; +} KSAC3_ERROR_CONCEALMENT,*PKSAC3_ERROR_CONCEALMENT; + +typedef struct { + WINBOOL fStereo; + ULONG DualMode; +} KSAC3_ALTERNATE_AUDIO,*PKSAC3_ALTERNATE_AUDIO; + +#define KSAC3_ALTERNATE_AUDIO_1 1 +#define KSAC3_ALTERNATE_AUDIO_2 2 +#define KSAC3_ALTERNATE_AUDIO_BOTH 3 + +typedef struct { + WINBOOL fDownMix; + WINBOOL fDolbySurround; +} KSAC3_DOWNMIX,*PKSAC3_DOWNMIX; + +typedef struct { + LONG BitStreamMode; +} KSAC3_BIT_STREAM_MODE,*PKSAC3_BIT_STREAM_MODE; + +#define KSAC3_SERVICE_MAIN_AUDIO 0 +#define KSAC3_SERVICE_NO_DIALOG 1 +#define KSAC3_SERVICE_VISUALLY_IMPAIRED 2 +#define KSAC3_SERVICE_HEARING_IMPAIRED 3 +#define KSAC3_SERVICE_DIALOG_ONLY 4 +#define KSAC3_SERVICE_COMMENTARY 5 +#define KSAC3_SERVICE_EMERGENCY_FLASH 6 +#define KSAC3_SERVICE_VOICE_OVER 7 + +typedef struct { + ULONG DialogueLevel; +} KSAC3_DIALOGUE_LEVEL,*PKSAC3_DIALOGUE_LEVEL; + +typedef struct { + WINBOOL fLargeRoom; +} KSAC3_ROOM_TYPE,*PKSAC3_ROOM_TYPE; + +#define STATIC_KSDATAFORMAT_SUBTYPE_DTS_AUDIO \ + 0xe06d8033L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8033-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_DTS_AUDIO); +#define KSDATAFORMAT_SUBTYPE_DTS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DTS_AUDIO) + +#define STATIC_KSDATAFORMAT_SUBTYPE_SDDS_AUDIO \ + 0xe06d8034L,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d8034-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_SDDS_AUDIO); +#define KSDATAFORMAT_SUBTYPE_SDDS_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SDDS_AUDIO) + +#define STATIC_KSPROPSETID_AudioDecoderOut \ + 0x6ca6e020L,0x43bd,0x11d0,0xbd,0x6a,0x00,0x35,0x05,0xc1,0x03,0xa9 +DEFINE_GUIDSTRUCT("6ca6e020-43bd-11d0-bd6a-003505c103a9",KSPROPSETID_AudioDecoderOut); +#define KSPROPSETID_AudioDecoderOut DEFINE_GUIDNAMED(KSPROPSETID_AudioDecoderOut) + +typedef enum { + KSPROPERTY_AUDDECOUT_MODES, + KSPROPERTY_AUDDECOUT_CUR_MODE +} KSPROPERTY_AUDDECOUT; + +#define KSAUDDECOUTMODE_STEREO_ANALOG 0x0001 +#define KSAUDDECOUTMODE_PCM_51 0x0002 +#define KSAUDDECOUTMODE_SPDIFF 0x0004 + +#define STATIC_KSDATAFORMAT_SUBTYPE_SUBPICTURE \ + 0xe06d802dL,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea +DEFINE_GUIDSTRUCT("e06d802d-db46-11cf-b4d1-00805f6cbbea",KSDATAFORMAT_SUBTYPE_SUBPICTURE); +#define KSDATAFORMAT_SUBTYPE_SUBPICTURE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_SUBPICTURE) + +#define STATIC_KSPROPSETID_DvdSubPic \ + 0xac390460L,0x43af,0x11d0,0xbd,0x6a,0x00,0x35,0x05,0xc1,0x03,0xa9 +DEFINE_GUIDSTRUCT("ac390460-43af-11d0-bd6a-003505c103a9",KSPROPSETID_DvdSubPic); +#define KSPROPSETID_DvdSubPic DEFINE_GUIDNAMED(KSPROPSETID_DvdSubPic) + +typedef enum { + KSPROPERTY_DVDSUBPIC_PALETTE, + KSPROPERTY_DVDSUBPIC_HLI, + KSPROPERTY_DVDSUBPIC_COMPOSIT_ON +} KSPROPERTY_DVDSUBPIC; + +typedef struct _KS_DVD_YCrCb { + UCHAR Reserved; + UCHAR Y; + UCHAR Cr; + UCHAR Cb; +} KS_DVD_YCrCb,*PKS_DVD_YCrCb; + +typedef struct _KS_DVD_YUV { + UCHAR Reserved; + UCHAR Y; + UCHAR V; + UCHAR U; +} KS_DVD_YUV,*PKS_DVD_YUV; + +typedef struct _KSPROPERTY_SPPAL { + KS_DVD_YUV sppal[16]; +} KSPROPERTY_SPPAL,*PKSPROPERTY_SPPAL; + +typedef struct _KS_COLCON { + UCHAR emph1col:4; + UCHAR emph2col:4; + UCHAR backcol:4; + UCHAR patcol:4; + UCHAR emph1con:4; + UCHAR emph2con:4; + UCHAR backcon:4; + UCHAR patcon:4; +} KS_COLCON,*PKS_COLCON; + +typedef struct _KSPROPERTY_SPHLI { + USHORT HLISS; + USHORT Reserved; + ULONG StartPTM; + ULONG EndPTM; + USHORT StartX; + USHORT StartY; + USHORT StopX; + USHORT StopY; + KS_COLCON ColCon; +} KSPROPERTY_SPHLI,*PKSPROPERTY_SPHLI; + +typedef WINBOOL KSPROPERTY_COMPOSIT_ON,*PKSPROPERTY_COMPOSIT_ON; + +#define STATIC_KSPROPSETID_CopyProt \ + 0x0E8A0A40L,0x6AEF,0x11D0,0x9E,0xD0,0x00,0xA0,0x24,0xCA,0x19,0xB3 +DEFINE_GUIDSTRUCT("0E8A0A40-6AEF-11D0-9ED0-00A024CA19B3",KSPROPSETID_CopyProt); +#define KSPROPSETID_CopyProt DEFINE_GUIDNAMED(KSPROPSETID_CopyProt) + +typedef enum { + KSPROPERTY_DVDCOPY_CHLG_KEY = 0x01, + KSPROPERTY_DVDCOPY_DVD_KEY1, + KSPROPERTY_DVDCOPY_DEC_KEY2, + KSPROPERTY_DVDCOPY_TITLE_KEY, + KSPROPERTY_COPY_MACROVISION, + KSPROPERTY_DVDCOPY_REGION, + KSPROPERTY_DVDCOPY_SET_COPY_STATE, + KSPROPERTY_DVDCOPY_DISC_KEY = 0x80 +} KSPROPERTY_COPYPROT; + +typedef struct _KS_DVDCOPY_CHLGKEY { + BYTE ChlgKey[10]; + BYTE Reserved[2]; +} KS_DVDCOPY_CHLGKEY,*PKS_DVDCOPY_CHLGKEY; + +typedef struct _KS_DVDCOPY_BUSKEY { + BYTE BusKey[5]; + BYTE Reserved[1]; +} KS_DVDCOPY_BUSKEY,*PKS_DVDCOPY_BUSKEY; + +typedef struct _KS_DVDCOPY_DISCKEY { + BYTE DiscKey[2048]; +} KS_DVDCOPY_DISCKEY,*PKS_DVDCOPY_DISCKEY; + +typedef struct _KS_DVDCOPY_REGION { + UCHAR Reserved; + UCHAR RegionData; + UCHAR Reserved2[2]; +} KS_DVDCOPY_REGION,*PKS_DVDCOPY_REGION; + +typedef struct _KS_DVDCOPY_TITLEKEY { + ULONG KeyFlags; + ULONG ReservedNT[2]; + UCHAR TitleKey[6]; + UCHAR Reserved[2]; +} KS_DVDCOPY_TITLEKEY,*PKS_DVDCOPY_TITLEKEY; + +typedef struct _KS_COPY_MACROVISION { + ULONG MACROVISIONLevel; +} KS_COPY_MACROVISION,*PKS_COPY_MACROVISION; + +typedef struct _KS_DVDCOPY_SET_COPY_STATE { + ULONG DVDCopyState; +} KS_DVDCOPY_SET_COPY_STATE,*PKS_DVDCOPY_SET_COPY_STATE; + +typedef enum { + KS_DVDCOPYSTATE_INITIALIZE, + KS_DVDCOPYSTATE_INITIALIZE_TITLE, + KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED, + KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED, + KS_DVDCOPYSTATE_DONE +} KS_DVDCOPYSTATE; + +typedef enum { + KS_MACROVISION_DISABLED, + KS_MACROVISION_LEVEL1, + KS_MACROVISION_LEVEL2, + KS_MACROVISION_LEVEL3 +} KS_COPY_MACROVISION_LEVEL,*PKS_COPY_MACROVISION_LEVEL; + +#define KS_DVD_CGMS_RESERVED_MASK 0x00000078 + +#define KS_DVD_CGMS_COPY_PROTECT_MASK 0x00000018 +#define KS_DVD_CGMS_COPY_PERMITTED 0x00000000 +#define KS_DVD_CGMS_COPY_ONCE 0x00000010 +#define KS_DVD_CGMS_NO_COPY 0x00000018 + +#define KS_DVD_COPYRIGHT_MASK 0x00000040 +#define KS_DVD_NOT_COPYRIGHTED 0x00000000 +#define KS_DVD_COPYRIGHTED 0x00000040 + +#define KS_DVD_SECTOR_PROTECT_MASK 0x00000020 +#define KS_DVD_SECTOR_NOT_PROTECTED 0x00000000 +#define KS_DVD_SECTOR_PROTECTED 0x00000020 + +#define STATIC_KSCATEGORY_TVTUNER \ + 0xa799a800L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4 +DEFINE_GUIDSTRUCT("a799a800-a46d-11d0-a18c-00a02401dcd4",KSCATEGORY_TVTUNER); +#define KSCATEGORY_TVTUNER DEFINE_GUIDNAMED(KSCATEGORY_TVTUNER) + +#define STATIC_KSCATEGORY_CROSSBAR \ + 0xa799a801L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4 +DEFINE_GUIDSTRUCT("a799a801-a46d-11d0-a18c-00a02401dcd4",KSCATEGORY_CROSSBAR); +#define KSCATEGORY_CROSSBAR DEFINE_GUIDNAMED(KSCATEGORY_CROSSBAR) + +#define STATIC_KSCATEGORY_TVAUDIO \ + 0xa799a802L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4 +DEFINE_GUIDSTRUCT("a799a802-a46d-11d0-a18c-00a02401dcd4",KSCATEGORY_TVAUDIO); +#define KSCATEGORY_TVAUDIO DEFINE_GUIDNAMED(KSCATEGORY_TVAUDIO) + +#define STATIC_KSCATEGORY_VPMUX \ + 0xa799a803L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4 +DEFINE_GUIDSTRUCT("a799a803-a46d-11d0-a18c-00a02401dcd4",KSCATEGORY_VPMUX); +#define KSCATEGORY_VPMUX DEFINE_GUIDNAMED(KSCATEGORY_VPMUX) + +#define STATIC_KSCATEGORY_VBICODEC \ + 0x07dad660L,0x22f1,0x11d1,0xa9,0xf4,0x00,0xc0,0x4f,0xbb,0xde,0x8f +DEFINE_GUIDSTRUCT("07dad660-22f1-11d1-a9f4-00c04fbbde8f",KSCATEGORY_VBICODEC); +#define KSCATEGORY_VBICODEC DEFINE_GUIDNAMED(KSCATEGORY_VBICODEC) + +#define STATIC_KSDATAFORMAT_SUBTYPE_VPVideo \ + 0x5a9b6a40L,0x1a22,0x11d1,0xba,0xd9,0x0,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("5a9b6a40-1a22-11d1-bad9-00609744111a",KSDATAFORMAT_SUBTYPE_VPVideo); +#define KSDATAFORMAT_SUBTYPE_VPVideo DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVideo) + +#define STATIC_KSDATAFORMAT_SUBTYPE_VPVBI \ + 0x5a9b6a41L,0x1a22,0x11d1,0xba,0xd9,0x0,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("5a9b6a41-1a22-11d1-bad9-00609744111a",KSDATAFORMAT_SUBTYPE_VPVBI); +#define KSDATAFORMAT_SUBTYPE_VPVBI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_VPVBI) + +#define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO \ + 0x05589f80L,0xc356,0x11ce,0xbf,0x01,0x00,0xaa,0x00,0x55,0x59,0x5a +DEFINE_GUIDSTRUCT("05589f80-c356-11ce-bf01-00aa0055595a",KSDATAFORMAT_SPECIFIER_VIDEOINFO); +#define KSDATAFORMAT_SPECIFIER_VIDEOINFO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_VIDEOINFO2 \ + 0xf72a76A0L,0xeb0a,0x11d0,0xac,0xe4,0x00,0x00,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("f72a76A0-eb0a-11d0-ace4-0000c0cc16ba",KSDATAFORMAT_SPECIFIER_VIDEOINFO2); +#define KSDATAFORMAT_SPECIFIER_VIDEOINFO2 DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VIDEOINFO2) + +#define STATIC_KSDATAFORMAT_TYPE_ANALOGVIDEO \ + 0x0482dde1L,0x7817,0x11cf,0x8a,0x03,0x00,0xaa,0x00,0x6e,0xcb,0x65 +DEFINE_GUIDSTRUCT("0482dde1-7817-11cf-8a03-00aa006ecb65",KSDATAFORMAT_TYPE_ANALOGVIDEO); +#define KSDATAFORMAT_TYPE_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_ANALOGVIDEO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_ANALOGVIDEO \ + 0x0482dde0L,0x7817,0x11cf,0x8a,0x03,0x00,0xaa,0x00,0x6e,0xcb,0x65 +DEFINE_GUIDSTRUCT("0482dde0-7817-11cf-8a03-00aa006ecb65",KSDATAFORMAT_SPECIFIER_ANALOGVIDEO); +#define KSDATAFORMAT_SPECIFIER_ANALOGVIDEO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_ANALOGVIDEO) + +#define STATIC_KSDATAFORMAT_TYPE_ANALOGAUDIO \ + 0x0482dee1L,0x7817,0x11cf,0x8a,0x03,0x00,0xaa,0x00,0x6e,0xcb,0x65 +DEFINE_GUIDSTRUCT("0482DEE1-7817-11cf-8a03-00aa006ecb65",KSDATAFORMAT_TYPE_ANALOGAUDIO); +#define KSDATAFORMAT_TYPE_ANALOGAUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_ANALOGAUDIO) + +#define STATIC_KSDATAFORMAT_SPECIFIER_VBI \ + 0xf72a76e0L,0xeb0a,0x11d0,0xac,0xe4,0x00,0x00,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("f72a76e0-eb0a-11d0-ace4-0000c0cc16ba",KSDATAFORMAT_SPECIFIER_VBI); +#define KSDATAFORMAT_SPECIFIER_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_VBI) + +#define STATIC_KSDATAFORMAT_TYPE_VBI \ + 0xf72a76e1L,0xeb0a,0x11d0,0xac,0xe4,0x00,0x00,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("f72a76e1-eb0a-11d0-ace4-0000c0cc16ba",KSDATAFORMAT_TYPE_VBI); +#define KSDATAFORMAT_TYPE_VBI DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_VBI) + +#define STATIC_KSDATAFORMAT_SUBTYPE_RAW8 \ + 0xca20d9a0,0x3e3e,0x11d1,0x9b,0xf9,0x0,0xc0,0x4f,0xbb,0xde,0xbf +DEFINE_GUIDSTRUCT("ca20d9a0-3e3e-11d1-9bf9-00c04fbbdebf",KSDATAFORMAT_SUBTYPE_RAW8); +#define KSDATAFORMAT_SUBTYPE_RAW8 DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_RAW8) + +#define STATIC_KSDATAFORMAT_SUBTYPE_CC \ + 0x33214cc1,0x11f,0x11d2,0xb4,0xb1,0x0,0xa0,0xd1,0x2,0xcf,0xbe +DEFINE_GUIDSTRUCT("33214CC1-011F-11D2-B4B1-00A0D102CFBE",KSDATAFORMAT_SUBTYPE_CC); +#define KSDATAFORMAT_SUBTYPE_CC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_CC) + +#define STATIC_KSDATAFORMAT_SUBTYPE_NABTS \ + 0xf72a76e2L,0xeb0a,0x11d0,0xac,0xe4,0x00,0x00,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("f72a76e2-eb0a-11d0-ace4-0000c0cc16ba",KSDATAFORMAT_SUBTYPE_NABTS); +#define KSDATAFORMAT_SUBTYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS) + +#define STATIC_KSDATAFORMAT_SUBTYPE_TELETEXT \ + 0xf72a76e3L,0xeb0a,0x11d0,0xac,0xe4,0x00,0x00,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("f72a76e3-eb0a-11d0-ace4-0000c0cc16ba",KSDATAFORMAT_SUBTYPE_TELETEXT); +#define KSDATAFORMAT_SUBTYPE_TELETEXT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_TELETEXT) + +#define KS_BI_RGB 0L +#define KS_BI_RLE8 1L +#define KS_BI_RLE4 2L +#define KS_BI_BITFIELDS 3L + +typedef struct tagKS_RGBQUAD { + BYTE rgbBlue; + BYTE rgbGreen; + BYTE rgbRed; + BYTE rgbReserved; +} KS_RGBQUAD,*PKS_RGBQUAD; + +#define KS_iPALETTE_COLORS 256 +#define KS_iEGA_COLORS 16 +#define KS_iMASK_COLORS 3 +#define KS_iTRUECOLOR 16 +#define KS_iRED 0 +#define KS_iGREEN 1 +#define KS_iBLUE 2 +#define KS_iPALETTE 8 +#define KS_iMAXBITS 8 +#define KS_SIZE_EGA_PALETTE (KS_iEGA_COLORS *sizeof(KS_RGBQUAD)) +#define KS_SIZE_PALETTE (KS_iPALETTE_COLORS *sizeof(KS_RGBQUAD)) + +typedef struct tagKS_BITMAPINFOHEADER { + DWORD biSize; + LONG biWidth; + LONG biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} KS_BITMAPINFOHEADER,*PKS_BITMAPINFOHEADER; + +typedef struct tag_KS_TRUECOLORINFO { + DWORD dwBitMasks[KS_iMASK_COLORS]; + KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; +} KS_TRUECOLORINFO,*PKS_TRUECOLORINFO; + +#define KS_WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) +#define KS_DIBWIDTHBYTES(bi) (DWORD)KS_WIDTHBYTES((DWORD)(bi).biWidth *(DWORD)(bi).biBitCount) +#define KS__DIBSIZE(bi) (KS_DIBWIDTHBYTES(bi) *(DWORD)(bi).biHeight) +#define KS_DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(KS__DIBSIZE(bi)) : KS__DIBSIZE(bi)) + +typedef LONGLONG REFERENCE_TIME; + +typedef struct tagKS_VIDEOINFOHEADER { + RECT rcSource; + RECT rcTarget; + DWORD dwBitRate; + DWORD dwBitErrorRate; + REFERENCE_TIME AvgTimePerFrame; + KS_BITMAPINFOHEADER bmiHeader; +} KS_VIDEOINFOHEADER,*PKS_VIDEOINFOHEADER; + +typedef struct tagKS_VIDEOINFO { + RECT rcSource; + RECT rcTarget; + DWORD dwBitRate; + DWORD dwBitErrorRate; + REFERENCE_TIME AvgTimePerFrame; + KS_BITMAPINFOHEADER bmiHeader; + __MINGW_EXTENSION union { + KS_RGBQUAD bmiColors[KS_iPALETTE_COLORS]; + DWORD dwBitMasks[KS_iMASK_COLORS]; + KS_TRUECOLORINFO TrueColorInfo; + }; +} KS_VIDEOINFO,*PKS_VIDEOINFO; + +#define KS_SIZE_MASKS (KS_iMASK_COLORS *sizeof(DWORD)) +#define KS_SIZE_PREHEADER (FIELD_OFFSET(KS_VIDEOINFOHEADER,bmiHeader)) + +#define KS_SIZE_VIDEOHEADER(pbmi) ((pbmi)->bmiHeader.biSize + KS_SIZE_PREHEADER) + +typedef struct tagKS_VBIINFOHEADER { + ULONG StartLine; + ULONG EndLine; + ULONG SamplingFrequency; + ULONG MinLineStartTime; + ULONG MaxLineStartTime; + ULONG ActualLineStartTime; + ULONG ActualLineEndTime; + ULONG VideoStandard; + ULONG SamplesPerLine; + ULONG StrideInBytes; + ULONG BufferSize; +} KS_VBIINFOHEADER,*PKS_VBIINFOHEADER; + +#define KS_VBIDATARATE_NABTS (5727272L) +#define KS_VBIDATARATE_CC (503493L) +#define KS_VBISAMPLINGRATE_4X_NABTS ((long)(4*KS_VBIDATARATE_NABTS)) +#define KS_VBISAMPLINGRATE_47X_NABTS ((long)(27000000)) +#define KS_VBISAMPLINGRATE_5X_NABTS ((long)(5*KS_VBIDATARATE_NABTS)) + +#define KS_47NABTS_SCALER (KS_VBISAMPLINGRATE_47X_NABTS/(double)KS_VBIDATARATE_NABTS) + +typedef struct tagKS_AnalogVideoInfo { + RECT rcSource; + RECT rcTarget; + DWORD dwActiveWidth; + DWORD dwActiveHeight; + REFERENCE_TIME AvgTimePerFrame; +} KS_ANALOGVIDEOINFO,*PKS_ANALOGVIDEOINFO; + +#define KS_TVTUNER_CHANGE_BEGIN_TUNE 0x0001L +#define KS_TVTUNER_CHANGE_END_TUNE 0x0002L + +typedef struct tagKS_TVTUNER_CHANGE_INFO { + DWORD dwFlags; + DWORD dwCountryCode; + DWORD dwAnalogVideoStandard; + DWORD dwChannel; +} KS_TVTUNER_CHANGE_INFO,*PKS_TVTUNER_CHANGE_INFO; + +typedef enum { + KS_MPEG2Level_Low, + KS_MPEG2Level_Main, + KS_MPEG2Level_High1440, + KS_MPEG2Level_High +} KS_MPEG2Level; + +typedef enum { + KS_MPEG2Profile_Simple, + KS_MPEG2Profile_Main, + KS_MPEG2Profile_SNRScalable, + KS_MPEG2Profile_SpatiallyScalable, + KS_MPEG2Profile_High +} KS_MPEG2Profile; + +#define KS_INTERLACE_IsInterlaced 0x00000001 +#define KS_INTERLACE_1FieldPerSample 0x00000002 +#define KS_INTERLACE_Field1First 0x00000004 +#define KS_INTERLACE_UNUSED 0x00000008 +#define KS_INTERLACE_FieldPatternMask 0x00000030 +#define KS_INTERLACE_FieldPatField1Only 0x00000000 +#define KS_INTERLACE_FieldPatField2Only 0x00000010 +#define KS_INTERLACE_FieldPatBothRegular 0x00000020 +#define KS_INTERLACE_FieldPatBothIrregular 0x00000030 +#define KS_INTERLACE_DisplayModeMask 0x000000c0 +#define KS_INTERLACE_DisplayModeBobOnly 0x00000000 +#define KS_INTERLACE_DisplayModeWeaveOnly 0x00000040 +#define KS_INTERLACE_DisplayModeBobOrWeave 0x00000080 + +#define KS_MPEG2_DoPanScan 0x00000001 +#define KS_MPEG2_DVDLine21Field1 0x00000002 +#define KS_MPEG2_DVDLine21Field2 0x00000004 +#define KS_MPEG2_SourceIsLetterboxed 0x00000008 +#define KS_MPEG2_FilmCameraMode 0x00000010 +#define KS_MPEG2_LetterboxAnalogOut 0x00000020 +#define KS_MPEG2_DSS_UserData 0x00000040 +#define KS_MPEG2_DVB_UserData 0x00000080 +#define KS_MPEG2_27MhzTimebase 0x00000100 + +typedef struct tagKS_VIDEOINFOHEADER2 { + RECT rcSource; + RECT rcTarget; + DWORD dwBitRate; + DWORD dwBitErrorRate; + REFERENCE_TIME AvgTimePerFrame; + DWORD dwInterlaceFlags; + DWORD dwCopyProtectFlags; + DWORD dwPictAspectRatioX; + DWORD dwPictAspectRatioY; + DWORD dwReserved1; + DWORD dwReserved2; + KS_BITMAPINFOHEADER bmiHeader; +} KS_VIDEOINFOHEADER2,*PKS_VIDEOINFOHEADER2; + +typedef struct tagKS_MPEG1VIDEOINFO { + KS_VIDEOINFOHEADER hdr; + DWORD dwStartTimeCode; + DWORD cbSequenceHeader; + BYTE bSequenceHeader[1]; +} KS_MPEG1VIDEOINFO,*PKS_MPEG1VIDEOINFO; + +#define KS_MAX_SIZE_MPEG1_SEQUENCE_INFO 140 +#define KS_SIZE_MPEG1VIDEOINFO(pv) (FIELD_OFFSET(KS_MPEG1VIDEOINFO,bSequenceHeader[0]) + (pv)->cbSequenceHeader) +#define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) + +typedef struct tagKS_MPEGVIDEOINFO2 { + KS_VIDEOINFOHEADER2 hdr; + DWORD dwStartTimeCode; + DWORD cbSequenceHeader; + DWORD dwProfile; + DWORD dwLevel; + DWORD dwFlags; + DWORD bSequenceHeader[1]; +} KS_MPEGVIDEOINFO2,*PKS_MPEGVIDEOINFO2; + +#define KS_SIZE_MPEGVIDEOINFO2(pv) (FIELD_OFFSET(KS_MPEGVIDEOINFO2,bSequenceHeader[0]) + (pv)->cbSequenceHeader) +#define KS_MPEG1_SEQUENCE_INFO(pv) ((const BYTE *)(pv)->bSequenceHeader) + +#define KS_MPEGAUDIOINFO_27MhzTimebase 0x00000001 + +typedef struct tagKS_MPEAUDIOINFO { + DWORD dwFlags; + DWORD dwReserved1; + DWORD dwReserved2; + DWORD dwReserved3; +} KS_MPEGAUDIOINFO,*PKS_MPEGAUDIOINFO; + +typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER { + KSDATAFORMAT DataFormat; + KS_VIDEOINFOHEADER VideoInfoHeader; +} KS_DATAFORMAT_VIDEOINFOHEADER,*PKS_DATAFORMAT_VIDEOINFOHEADER; + +typedef struct tagKS_DATAFORMAT_VIDEOINFOHEADER2 { + KSDATAFORMAT DataFormat; + KS_VIDEOINFOHEADER2 VideoInfoHeader2; +} KS_DATAFORMAT_VIDEOINFOHEADER2,*PKS_DATAFORMAT_VIDEOINFOHEADER2; + +typedef struct tagKS_DATAFORMAT_VIDEOINFO_PALETTE { + KSDATAFORMAT DataFormat; + KS_VIDEOINFO VideoInfo; +} KS_DATAFORMAT_VIDEOINFO_PALETTE,*PKS_DATAFORMAT_VIDEOINFO_PALETTE; + +typedef struct tagKS_DATAFORMAT_VBIINFOHEADER { + KSDATAFORMAT DataFormat; + KS_VBIINFOHEADER VBIInfoHeader; +} KS_DATAFORMAT_VBIINFOHEADER,*PKS_DATAFORMAT_VBIINFOHEADER; + +typedef struct _KS_VIDEO_STREAM_CONFIG_CAPS { + GUID guid; + ULONG VideoStandard; + SIZE InputSize; + SIZE MinCroppingSize; + SIZE MaxCroppingSize; + int CropGranularityX; + int CropGranularityY; + int CropAlignX; + int CropAlignY; + SIZE MinOutputSize; + SIZE MaxOutputSize; + int OutputGranularityX; + int OutputGranularityY; + int StretchTapsX; + int StretchTapsY; + int ShrinkTapsX; + int ShrinkTapsY; + LONGLONG MinFrameInterval; + LONGLONG MaxFrameInterval; + LONG MinBitsPerSecond; + LONG MaxBitsPerSecond; +} KS_VIDEO_STREAM_CONFIG_CAPS,*PKS_VIDEO_STREAM_CONFIG_CAPS; + +typedef struct tagKS_DATARANGE_VIDEO { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_VIDEOINFOHEADER VideoInfoHeader; +} KS_DATARANGE_VIDEO,*PKS_DATARANGE_VIDEO; + +typedef struct tagKS_DATARANGE_VIDEO2 { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_VIDEOINFOHEADER2 VideoInfoHeader; +} KS_DATARANGE_VIDEO2,*PKS_DATARANGE_VIDEO2; + +typedef struct tagKS_DATARANGE_MPEG1_VIDEO { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_MPEG1VIDEOINFO VideoInfoHeader; +} KS_DATARANGE_MPEG1_VIDEO,*PKS_DATARANGE_MPEG1_VIDEO; + +typedef struct tagKS_DATARANGE_MPEG2_VIDEO { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_MPEGVIDEOINFO2 VideoInfoHeader; +} KS_DATARANGE_MPEG2_VIDEO,*PKS_DATARANGE_MPEG2_VIDEO; + +typedef struct tagKS_DATARANGE_VIDEO_PALETTE { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_VIDEOINFO VideoInfo; +} KS_DATARANGE_VIDEO_PALETTE,*PKS_DATARANGE_VIDEO_PALETTE; + +typedef struct tagKS_DATARANGE_VIDEO_VBI { + KSDATARANGE DataRange; + WINBOOL bFixedSizeSamples; + WINBOOL bTemporalCompression; + DWORD StreamDescriptionFlags; + DWORD MemoryAllocationFlags; + KS_VIDEO_STREAM_CONFIG_CAPS ConfigCaps; + KS_VBIINFOHEADER VBIInfoHeader; +} KS_DATARANGE_VIDEO_VBI,*PKS_DATARANGE_VIDEO_VBI; + +typedef struct tagKS_DATARANGE_ANALOGVIDEO { + KSDATARANGE DataRange; + KS_ANALOGVIDEOINFO AnalogVideoInfo; +} KS_DATARANGE_ANALOGVIDEO,*PKS_DATARANGE_ANALOGVIDEO; + +#define KS_VIDEOSTREAM_PREVIEW 0x0001 +#define KS_VIDEOSTREAM_CAPTURE 0x0002 +#define KS_VIDEOSTREAM_VBI 0x0010 +#define KS_VIDEOSTREAM_NABTS 0x0020 +#define KS_VIDEOSTREAM_CC 0x0100 +#define KS_VIDEOSTREAM_EDS 0x0200 +#define KS_VIDEOSTREAM_TELETEXT 0x0400 +#define KS_VIDEOSTREAM_STILL 0x1000 +#define KS_VIDEOSTREAM_IS_VPE 0x8000 + +#define KS_VIDEO_ALLOC_VPE_SYSTEM 0x0001 +#define KS_VIDEO_ALLOC_VPE_DISPLAY 0x0002 +#define KS_VIDEO_ALLOC_VPE_AGP 0x0004 + +#define STATIC_KSPROPSETID_VBICAP_PROPERTIES \ + 0xf162c607,0x7b35,0x496f,0xad,0x7f,0x2d,0xca,0x3b,0x46,0xb7,0x18 +DEFINE_GUIDSTRUCT("F162C607-7B35-496f-AD7F-2DCA3B46B718",KSPROPSETID_VBICAP_PROPERTIES); +#define KSPROPSETID_VBICAP_PROPERTIES DEFINE_GUIDNAMED(KSPROPSETID_VBICAP_PROPERTIES) + +typedef enum { + KSPROPERTY_VBICAP_PROPERTIES_PROTECTION = 0x01 +} KSPROPERTY_VBICAP; + +typedef struct _VBICAP_PROPERTIES_PROTECTION_S { + KSPROPERTY Property; + ULONG StreamIndex; + ULONG Status; +} VBICAP_PROPERTIES_PROTECTION_S,*PVBICAP_PROPERTIES_PROTECTION_S; + +#define KS_VBICAP_PROTECTION_MV_PRESENT 0x0001L +#define KS_VBICAP_PROTECTION_MV_HARDWARE 0x0002L +#define KS_VBICAP_PROTECTION_MV_DETECTED 0x0004L + +#define KS_NABTS_GROUPID_ORIGINAL_CONTENT_BASE 0x800 +#define KS_NABTS_GROUPID_ORIGINAL_CONTENT_ADVERTISER_BASE 0x810 + +#define KS_NABTS_GROUPID_PRODUCTION_COMPANY_CONTENT_BASE 0x820 +#define KS_NABTS_GROUPID_PRODUCTION_COMPANY_ADVERTISER_BASE 0x830 + +#define KS_NABTS_GROUPID_SYNDICATED_SHOW_CONTENT_BASE 0x840 +#define KS_NABTS_GROUPID_SYNDICATED_SHOW_ADVERTISER_BASE 0x850 + +#define KS_NABTS_GROUPID_NETWORK_WIDE_CONTENT_BASE 0x860 +#define KS_NABTS_GROUPID_NETWORK_WIDE_ADVERTISER_BASE 0x870 + +#define KS_NABTS_GROUPID_TELEVISION_STATION_CONTENT_BASE 0x880 +#define KS_NABTS_GROUPID_TELEVISION_STATION_ADVERTISER_BASE 0x890 + +#define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_CONTENT_BASE 0x8A0 +#define KS_NABTS_GROUPID_LOCAL_CABLE_SYSTEM_ADVERTISER_BASE 0x8B0 + +#define KS_NABTS_GROUPID_MICROSOFT_RESERVED_TEST_DATA_BASE 0x8F0 + +#define STATIC_KSDATAFORMAT_TYPE_NABTS \ + 0xe757bca0,0x39ac,0x11d1,0xa9,0xf5,0x0,0xc0,0x4f,0xbb,0xde,0x8f +DEFINE_GUIDSTRUCT("E757BCA0-39AC-11d1-A9F5-00C04FBBDE8F",KSDATAFORMAT_TYPE_NABTS); +#define KSDATAFORMAT_TYPE_NABTS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_NABTS) + +#define STATIC_KSDATAFORMAT_SUBTYPE_NABTS_FEC \ + 0xe757bca1,0x39ac,0x11d1,0xa9,0xf5,0x0,0xc0,0x4f,0xbb,0xde,0x8f +DEFINE_GUIDSTRUCT("E757BCA1-39AC-11d1-A9F5-00C04FBBDE8F",KSDATAFORMAT_SUBTYPE_NABTS_FEC); +#define KSDATAFORMAT_SUBTYPE_NABTS_FEC DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NABTS_FEC) + +#define MAX_NABTS_VBI_LINES_PER_FIELD 11 +#define NABTS_LINES_PER_BUNDLE 16 +#define NABTS_PAYLOAD_PER_LINE 28 +#define NABTS_BYTES_PER_LINE 36 + +typedef struct _NABTSFEC_BUFFER { + ULONG dataSize; + USHORT groupID; + USHORT Reserved; + UCHAR data[NABTS_LINES_PER_BUNDLE *NABTS_PAYLOAD_PER_LINE]; +} NABTSFEC_BUFFER,*PNABTSFEC_BUFFER; + +#define STATIC_KSPROPSETID_VBICodecFiltering \ + 0xcafeb0caL,0x8715,0x11d0,0xbd,0x6a,0x00,0x35,0xc0,0xed,0xba,0xbe +DEFINE_GUIDSTRUCT("cafeb0ca-8715-11d0-bd6a-0035c0edbabe",KSPROPSETID_VBICodecFiltering); +#define KSPROPSETID_VBICodecFiltering DEFINE_GUIDNAMED(KSPROPSETID_VBICodecFiltering) + +typedef enum { + KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY = 0x01, + KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, + KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, + KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, + KSPROPERTY_VBICODECFILTERING_STATISTICS +} KSPROPERTY_VBICODECFILTERING; + +typedef struct _VBICODECFILTERING_SCANLINES { + DWORD DwordBitArray[32]; +} VBICODECFILTERING_SCANLINES,*PVBICODECFILTERING_SCANLINES; + +typedef struct _VBICODECFILTERING_NABTS_SUBSTREAMS { + DWORD SubstreamMask[128]; +} VBICODECFILTERING_NABTS_SUBSTREAMS,*PVBICODECFILTERING_NABTS_SUBSTREAMS; + +typedef struct _VBICODECFILTERING_CC_SUBSTREAMS { + DWORD SubstreamMask; +} VBICODECFILTERING_CC_SUBSTREAMS,*PVBICODECFILTERING_CC_SUBSTREAMS; + +#define KS_CC_SUBSTREAM_ODD 0x0001L +#define KS_CC_SUBSTREAM_EVEN 0x0002L + +#define KS_CC_SUBSTREAM_FIELD1_MASK 0x00F0L +#define KS_CC_SUBSTREAM_SERVICE_CC1 0x0010L +#define KS_CC_SUBSTREAM_SERVICE_CC2 0x0020L +#define KS_CC_SUBSTREAM_SERVICE_T1 0x0040L +#define KS_CC_SUBSTREAM_SERVICE_T2 0x0080L + +#define KS_CC_SUBSTREAM_FIELD2_MASK 0x1F00L +#define KS_CC_SUBSTREAM_SERVICE_CC3 0x0100L +#define KS_CC_SUBSTREAM_SERVICE_CC4 0x0200L +#define KS_CC_SUBSTREAM_SERVICE_T3 0x0400L +#define KS_CC_SUBSTREAM_SERVICE_T4 0x0800L +#define KS_CC_SUBSTREAM_SERVICE_XDS 0x1000L + +#define CC_MAX_HW_DECODE_LINES 12 +typedef struct _CC_BYTE_PAIR { + BYTE Decoded[2]; + USHORT Reserved; +} CC_BYTE_PAIR,*PCC_BYTE_PAIR; + +typedef struct _CC_HW_FIELD { + VBICODECFILTERING_SCANLINES ScanlinesRequested; + ULONG fieldFlags; + LONGLONG PictureNumber; + CC_BYTE_PAIR Lines[CC_MAX_HW_DECODE_LINES]; +} CC_HW_FIELD,*PCC_HW_FIELD; + +#ifndef PACK_PRAGMAS_NOT_SUPPORTED +#include +#endif +typedef struct _NABTS_BUFFER_LINE { + BYTE Confidence; + BYTE Bytes[NABTS_BYTES_PER_LINE]; +} NABTS_BUFFER_LINE,*PNABTS_BUFFER_LINE; + +#define NABTS_BUFFER_PICTURENUMBER_SUPPORT 1 +typedef struct _NABTS_BUFFER { + VBICODECFILTERING_SCANLINES ScanlinesRequested; + LONGLONG PictureNumber; + NABTS_BUFFER_LINE NabtsLines[MAX_NABTS_VBI_LINES_PER_FIELD]; +} NABTS_BUFFER,*PNABTS_BUFFER; +#ifndef PACK_PRAGMAS_NOT_SUPPORTED +#include +#endif + +#define WST_TVTUNER_CHANGE_BEGIN_TUNE 0x1000L +#define WST_TVTUNER_CHANGE_END_TUNE 0x2000L + +#define MAX_WST_VBI_LINES_PER_FIELD 17 +#define WST_BYTES_PER_LINE 42 + +typedef struct _WST_BUFFER_LINE { + BYTE Confidence; + BYTE Bytes[WST_BYTES_PER_LINE]; +} WST_BUFFER_LINE,*PWST_BUFFER_LINE; + +typedef struct _WST_BUFFER { + VBICODECFILTERING_SCANLINES ScanlinesRequested; + WST_BUFFER_LINE WstLines[MAX_WST_VBI_LINES_PER_FIELD]; +} WST_BUFFER,*PWST_BUFFER; + +typedef struct _VBICODECFILTERING_STATISTICS_COMMON { + DWORD InputSRBsProcessed; + DWORD OutputSRBsProcessed; + DWORD SRBsIgnored; + DWORD InputSRBsMissing; + DWORD OutputSRBsMissing; + DWORD OutputFailures; + DWORD InternalErrors; + DWORD ExternalErrors; + DWORD InputDiscontinuities; + DWORD DSPFailures; + DWORD TvTunerChanges; + DWORD VBIHeaderChanges; + DWORD LineConfidenceAvg; + DWORD BytesOutput; +} VBICODECFILTERING_STATISTICS_COMMON,*PVBICODECFILTERING_STATISTICS_COMMON; + +typedef struct _VBICODECFILTERING_STATISTICS_COMMON_PIN { + DWORD SRBsProcessed; + DWORD SRBsIgnored; + DWORD SRBsMissing; + DWORD InternalErrors; + DWORD ExternalErrors; + DWORD Discontinuities; + DWORD LineConfidenceAvg; + DWORD BytesOutput; +} VBICODECFILTERING_STATISTICS_COMMON_PIN,*PVBICODECFILTERING_STATISTICS_COMMON_PIN; + +typedef struct _VBICODECFILTERING_STATISTICS_NABTS { + VBICODECFILTERING_STATISTICS_COMMON Common; + DWORD FECBundleBadLines; + DWORD FECQueueOverflows; + DWORD FECCorrectedLines; + DWORD FECUncorrectableLines; + DWORD BundlesProcessed; + DWORD BundlesSent2IP; + DWORD FilteredLines; +} VBICODECFILTERING_STATISTICS_NABTS,*PVBICODECFILTERING_STATISTICS_NABTS; + +typedef struct _VBICODECFILTERING_STATISTICS_NABTS_PIN { + VBICODECFILTERING_STATISTICS_COMMON_PIN Common; +} VBICODECFILTERING_STATISTICS_NABTS_PIN,*PVBICODECFILTERING_STATISTICS_NABTS_PIN; + +typedef struct _VBICODECFILTERING_STATISTICS_CC { + VBICODECFILTERING_STATISTICS_COMMON Common; +} VBICODECFILTERING_STATISTICS_CC,*PVBICODECFILTERING_STATISTICS_CC; + +typedef struct _VBICODECFILTERING_STATISTICS_CC_PIN { + VBICODECFILTERING_STATISTICS_COMMON_PIN Common; +} VBICODECFILTERING_STATISTICS_CC_PIN,*PVBICODECFILTERING_STATISTICS_CC_PIN; + +typedef struct _VBICODECFILTERING_STATISTICS_TELETEXT { + VBICODECFILTERING_STATISTICS_COMMON Common; +} VBICODECFILTERING_STATISTICS_TELETEXT,*PVBICODECFILTERING_STATISTICS_TELETEXT; + +typedef struct _VBICODECFILTERING_STATISTICS_TELETEXT_PIN { + VBICODECFILTERING_STATISTICS_COMMON_PIN Common; +} VBICODECFILTERING_STATISTICS_TELETEXT_PIN,*PVBICODECFILTERING_STATISTICS_TELETEXT_PIN; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_SCANLINES Scanlines; +} KSPROPERTY_VBICODECFILTERING_SCANLINES_S,*PKSPROPERTY_VBICODECFILTERING_SCANLINES_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_NABTS_SUBSTREAMS Substreams; +} KSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S,*PKSPROPERTY_VBICODECFILTERING_NABTS_SUBSTREAMS_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_CC_SUBSTREAMS Substreams; +} KSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S,*PKSPROPERTY_VBICODECFILTERING_CC_SUBSTREAMS_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_COMMON Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_COMMON_PIN Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_COMMON_PIN_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_NABTS Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_NABTS_PIN Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_NABTS_PIN_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_CC Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_S; + +typedef struct { + KSPROPERTY Property; + VBICODECFILTERING_STATISTICS_CC_PIN Statistics; +} KSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S,*PKSPROPERTY_VBICODECFILTERING_STATISTICS_CC_PIN_S; + +#define STATIC_PINNAME_VIDEO_CAPTURE \ + 0xfb6c4281,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +#define STATIC_PINNAME_CAPTURE STATIC_PINNAME_VIDEO_CAPTURE +DEFINE_GUIDSTRUCT("FB6C4281-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_CAPTURE); +#define PINNAME_VIDEO_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CAPTURE) +#define PINNAME_CAPTURE PINNAME_VIDEO_CAPTURE + +#define STATIC_PINNAME_VIDEO_CC_CAPTURE \ + 0x1aad8061,0x12d,0x11d2,0xb4,0xb1,0x0,0xa0,0xd1,0x2,0xcf,0xbe +#define STATIC_PINNAME_CC_CAPTURE STATIC_PINNAME_VIDEO_CC_CAPTURE +DEFINE_GUIDSTRUCT("1AAD8061-012D-11d2-B4B1-00A0D102CFBE",PINNAME_VIDEO_CC_CAPTURE); +#define PINNAME_VIDEO_CC_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CC_CAPTURE) + +#define STATIC_PINNAME_VIDEO_NABTS_CAPTURE \ + 0x29703660,0x498a,0x11d2,0xb4,0xb1,0x0,0xa0,0xd1,0x2,0xcf,0xbe +#define STATIC_PINNAME_NABTS_CAPTURE STATIC_PINNAME_VIDEO_NABTS_CAPTURE +DEFINE_GUIDSTRUCT("29703660-498A-11d2-B4B1-00A0D102CFBE",PINNAME_VIDEO_NABTS_CAPTURE); +#define PINNAME_VIDEO_NABTS_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS_CAPTURE) + +#define STATIC_PINNAME_VIDEO_PREVIEW \ + 0xfb6c4282,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +#define STATIC_PINNAME_PREVIEW STATIC_PINNAME_VIDEO_PREVIEW +DEFINE_GUIDSTRUCT("FB6C4282-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_PREVIEW); +#define PINNAME_VIDEO_PREVIEW DEFINE_GUIDNAMED(PINNAME_VIDEO_PREVIEW) +#define PINNAME_PREVIEW PINNAME_VIDEO_PREVIEW + +#define STATIC_PINNAME_VIDEO_ANALOGVIDEOIN \ + 0xfb6c4283,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4283-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_ANALOGVIDEOIN); +#define PINNAME_VIDEO_ANALOGVIDEOIN DEFINE_GUIDNAMED(PINNAME_VIDEO_ANALOGVIDEOIN) + +#define STATIC_PINNAME_VIDEO_VBI \ + 0xfb6c4284,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4284-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_VBI); +#define PINNAME_VIDEO_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VBI) + +#define STATIC_PINNAME_VIDEO_VIDEOPORT \ + 0xfb6c4285,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4285-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_VIDEOPORT); +#define PINNAME_VIDEO_VIDEOPORT DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT) + +#define STATIC_PINNAME_VIDEO_NABTS \ + 0xfb6c4286,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4286-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_NABTS); +#define PINNAME_VIDEO_NABTS DEFINE_GUIDNAMED(PINNAME_VIDEO_NABTS) + +#define STATIC_PINNAME_VIDEO_EDS \ + 0xfb6c4287,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4287-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_EDS); +#define PINNAME_VIDEO_EDS DEFINE_GUIDNAMED(PINNAME_VIDEO_EDS) + +#define STATIC_PINNAME_VIDEO_TELETEXT \ + 0xfb6c4288,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4288-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_TELETEXT); +#define PINNAME_VIDEO_TELETEXT DEFINE_GUIDNAMED(PINNAME_VIDEO_TELETEXT) + +#define STATIC_PINNAME_VIDEO_CC \ + 0xfb6c4289,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C4289-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_CC); +#define PINNAME_VIDEO_CC DEFINE_GUIDNAMED(PINNAME_VIDEO_CC) + +#define STATIC_PINNAME_VIDEO_STILL \ + 0xfb6c428A,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C428A-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_STILL); +#define PINNAME_VIDEO_STILL DEFINE_GUIDNAMED(PINNAME_VIDEO_STILL) + +#define STATIC_PINNAME_VIDEO_TIMECODE \ + 0xfb6c428B,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C428B-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_TIMECODE); +#define PINNAME_VIDEO_TIMECODE DEFINE_GUIDNAMED(PINNAME_VIDEO_TIMECODE) + +#define STATIC_PINNAME_VIDEO_VIDEOPORT_VBI \ + 0xfb6c428C,0x353,0x11d1,0x90,0x5f,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("FB6C428C-0353-11d1-905F-0000C0CC16BA",PINNAME_VIDEO_VIDEOPORT_VBI); +#define PINNAME_VIDEO_VIDEOPORT_VBI DEFINE_GUIDNAMED(PINNAME_VIDEO_VIDEOPORT_VBI) + +#define KS_VIDEO_FLAG_FRAME 0x0000L +#define KS_VIDEO_FLAG_FIELD1 0x0001L +#define KS_VIDEO_FLAG_FIELD2 0x0002L + +#define KS_VIDEO_FLAG_I_FRAME 0x0000L +#define KS_VIDEO_FLAG_P_FRAME 0x0010L +#define KS_VIDEO_FLAG_B_FRAME 0x0020L + +typedef struct tagKS_FRAME_INFO { + ULONG ExtendedHeaderSize; + DWORD dwFrameFlags; + LONGLONG PictureNumber; + LONGLONG DropCount; + HANDLE hDirectDraw; + HANDLE hSurfaceHandle; + RECT DirectDrawRect; + + DWORD Reserved1; + DWORD Reserved2; + DWORD Reserved3; + DWORD Reserved4; +} KS_FRAME_INFO,*PKS_FRAME_INFO; + +#define KS_VBI_FLAG_FIELD1 0x0001L +#define KS_VBI_FLAG_FIELD2 0x0002L + +#define KS_VBI_FLAG_MV_PRESENT 0x0100L +#define KS_VBI_FLAG_MV_HARDWARE 0x0200L +#define KS_VBI_FLAG_MV_DETECTED 0x0400L + +#define KS_VBI_FLAG_TVTUNER_CHANGE 0x0010L +#define KS_VBI_FLAG_VBIINFOHEADER_CHANGE 0x0020L + +typedef struct tagKS_VBI_FRAME_INFO { + ULONG ExtendedHeaderSize; + DWORD dwFrameFlags; + LONGLONG PictureNumber; + LONGLONG DropCount; + DWORD dwSamplingFrequency; + KS_TVTUNER_CHANGE_INFO TvTunerChangeInfo; + KS_VBIINFOHEADER VBIInfoHeader; +} KS_VBI_FRAME_INFO,*PKS_VBI_FRAME_INFO; + +typedef enum +{ + KS_AnalogVideo_None = 0x00000000, + KS_AnalogVideo_NTSC_M = 0x00000001, + KS_AnalogVideo_NTSC_M_J = 0x00000002, + KS_AnalogVideo_NTSC_433 = 0x00000004, + KS_AnalogVideo_PAL_B = 0x00000010, + KS_AnalogVideo_PAL_D = 0x00000020, + KS_AnalogVideo_PAL_G = 0x00000040, + KS_AnalogVideo_PAL_H = 0x00000080, + KS_AnalogVideo_PAL_I = 0x00000100, + KS_AnalogVideo_PAL_M = 0x00000200, + KS_AnalogVideo_PAL_N = 0x00000400, + KS_AnalogVideo_PAL_60 = 0x00000800, + KS_AnalogVideo_SECAM_B = 0x00001000, + KS_AnalogVideo_SECAM_D = 0x00002000, + KS_AnalogVideo_SECAM_G = 0x00004000, + KS_AnalogVideo_SECAM_H = 0x00008000, + KS_AnalogVideo_SECAM_K = 0x00010000, + KS_AnalogVideo_SECAM_K1 = 0x00020000, + KS_AnalogVideo_SECAM_L = 0x00040000, + KS_AnalogVideo_SECAM_L1 = 0x00080000, + KS_AnalogVideo_PAL_N_COMBO = 0x00100000 +} KS_AnalogVideoStandard; + +#define KS_AnalogVideo_NTSC_Mask 0x00000007 +#define KS_AnalogVideo_PAL_Mask 0x00100FF0 +#define KS_AnalogVideo_SECAM_Mask 0x000FF000 + +#define STATIC_PROPSETID_ALLOCATOR_CONTROL \ + 0x53171960,0x148e,0x11d2,0x99,0x79,0x0,0x0,0xc0,0xcc,0x16,0xba +DEFINE_GUIDSTRUCT("53171960-148E-11d2-9979-0000C0CC16BA",PROPSETID_ALLOCATOR_CONTROL); +#define PROPSETID_ALLOCATOR_CONTROL DEFINE_GUIDNAMED(PROPSETID_ALLOCATOR_CONTROL) + +typedef enum { + KSPROPERTY_ALLOCATOR_CONTROL_HONOR_COUNT, + KSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE, + KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS, + KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE +} KSPROPERTY_ALLOCATOR_CONTROL; + +typedef struct { + ULONG CX; + ULONG CY; +} KSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE_S,*PKSPROPERTY_ALLOCATOR_CONTROL_SURFACE_SIZE_S; + +typedef struct { + ULONG InterleavedCapSupported; +} KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS_S,*PKSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_CAPS_S; + +typedef struct { + ULONG InterleavedCapPossible; +} KSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE_S,*PKSPROPERTY_ALLOCATOR_CONTROL_CAPTURE_INTERLEAVE_S; + +#define STATIC_PROPSETID_VIDCAP_VIDEOPROCAMP \ + 0xC6E13360L,0x30AC,0x11d0,0xa1,0x8c,0x00,0xA0,0xC9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("C6E13360-30AC-11d0-A18C-00A0C9118956",PROPSETID_VIDCAP_VIDEOPROCAMP); +#define PROPSETID_VIDCAP_VIDEOPROCAMP DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOPROCAMP) + +typedef enum { + KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS, + KSPROPERTY_VIDEOPROCAMP_CONTRAST, + KSPROPERTY_VIDEOPROCAMP_HUE, + KSPROPERTY_VIDEOPROCAMP_SATURATION, + KSPROPERTY_VIDEOPROCAMP_SHARPNESS, + KSPROPERTY_VIDEOPROCAMP_GAMMA, + KSPROPERTY_VIDEOPROCAMP_COLORENABLE, + KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE, + KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION, + KSPROPERTY_VIDEOPROCAMP_GAIN, + KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER, + KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER_LIMIT, + KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT, + KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY +} KSPROPERTY_VIDCAP_VIDEOPROCAMP; + +typedef struct { + KSPROPERTY Property; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_VIDEOPROCAMP_S,*PKSPROPERTY_VIDEOPROCAMP_S; + +typedef struct { + KSP_NODE NodeProperty; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_VIDEOPROCAMP_NODE_S,*PKSPROPERTY_VIDEOPROCAMP_NODE_S; + +typedef struct { + KSPROPERTY Property; + LONG Value1; + ULONG Flags; + ULONG Capabilities; + LONG Value2; +} KSPROPERTY_VIDEOPROCAMP_S2,*PKSPROPERTY_VIDEOPROCAMP_S2; + +typedef struct { + KSP_NODE NodeProperty; + LONG Value1; + ULONG Flags; + ULONG Capabilities; + LONG Value2; +} KSPROPERTY_VIDEOPROCAMP_NODE_S2,*PKSPROPERTY_VIDEOPROCAMP_NODE_S2; + +#define KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO 0X0001L +#define KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL 0X0002L + +#define STATIC_PROPSETID_VIDCAP_SELECTOR \ + 0x1ABDAECA,0x68B6,0x4F83,0x93,0x71,0xB4,0x13,0x90,0x7C,0x7B,0x9F +DEFINE_GUIDSTRUCT("1ABDAECA-68B6-4F83-9371-B413907C7B9F",PROPSETID_VIDCAP_SELECTOR); +#define PROPSETID_VIDCAP_SELECTOR DEFINE_GUIDNAMED(PROPSETID_VIDCAP_SELECTOR) + +typedef enum { + KSPROPERTY_SELECTOR_SOURCE_NODE_ID, + KSPROPERTY_SELECTOR_NUM_SOURCES +} KSPROPERTY_VIDCAP_SELECTOR,*PKSPROPERTY_VIDCAP_SELECTOR; + +typedef struct { + KSPROPERTY Property; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_SELECTOR_S,*PKSPROPERTY_SELECTOR_S; + +typedef struct { + KSP_NODE NodeProperty; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_SELECTOR_NODE_S,*PKSPROPERTY_SELECTOR_NODE_S; + +#define STATIC_PROPSETID_TUNER \ + 0x6a2e0605L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0605-28e4-11d0-a18c-00a0c9118956",PROPSETID_TUNER); +#define PROPSETID_TUNER DEFINE_GUIDNAMED(PROPSETID_TUNER) + +typedef enum { + KSPROPERTY_TUNER_CAPS, + KSPROPERTY_TUNER_MODE_CAPS, + KSPROPERTY_TUNER_MODE, + KSPROPERTY_TUNER_STANDARD, + KSPROPERTY_TUNER_FREQUENCY, + KSPROPERTY_TUNER_INPUT, + KSPROPERTY_TUNER_STATUS, + KSPROPERTY_TUNER_IF_MEDIUM +} KSPROPERTY_TUNER; + +typedef enum { + KSPROPERTY_TUNER_MODE_TV = 0X0001, + KSPROPERTY_TUNER_MODE_FM_RADIO = 0X0002, + KSPROPERTY_TUNER_MODE_AM_RADIO = 0X0004, + KSPROPERTY_TUNER_MODE_DSS = 0X0008, + KSPROPERTY_TUNER_MODE_ATSC = 0X0010 +} KSPROPERTY_TUNER_MODES; + +typedef enum { + KS_TUNER_TUNING_EXACT = 1, + KS_TUNER_TUNING_FINE, + KS_TUNER_TUNING_COARSE +} KS_TUNER_TUNING_FLAGS; + +typedef enum { + KS_TUNER_STRATEGY_PLL = 0X01, + KS_TUNER_STRATEGY_SIGNAL_STRENGTH = 0X02, + KS_TUNER_STRATEGY_DRIVER_TUNES = 0X04 +} KS_TUNER_STRATEGY; + +typedef struct { + KSPROPERTY Property; + ULONG ModesSupported; + KSPIN_MEDIUM VideoMedium; + KSPIN_MEDIUM TVAudioMedium; + KSPIN_MEDIUM RadioAudioMedium; +} KSPROPERTY_TUNER_CAPS_S,*PKSPROPERTY_TUNER_CAPS_S; + +typedef struct { + KSPROPERTY Property; + KSPIN_MEDIUM IFMedium; +} KSPROPERTY_TUNER_IF_MEDIUM_S,*PKSPROPERTY_TUNER_IF_MEDIUM_S; + +typedef struct { + KSPROPERTY Property; + ULONG Mode; + ULONG StandardsSupported; + ULONG MinFrequency; + ULONG MaxFrequency; + ULONG TuningGranularity; + ULONG NumberOfInputs; + ULONG SettlingTime; + ULONG Strategy; +} KSPROPERTY_TUNER_MODE_CAPS_S,*PKSPROPERTY_TUNER_MODE_CAPS_S; + +typedef struct { + KSPROPERTY Property; + ULONG Mode; +} KSPROPERTY_TUNER_MODE_S,*PKSPROPERTY_TUNER_MODE_S; + +typedef struct { + KSPROPERTY Property; + ULONG Frequency; + ULONG LastFrequency; + ULONG TuningFlags; + ULONG VideoSubChannel; + ULONG AudioSubChannel; + ULONG Channel; + ULONG Country; +} KSPROPERTY_TUNER_FREQUENCY_S,*PKSPROPERTY_TUNER_FREQUENCY_S; + +typedef struct { + KSPROPERTY Property; + ULONG Standard; +} KSPROPERTY_TUNER_STANDARD_S,*PKSPROPERTY_TUNER_STANDARD_S; + +typedef struct { + KSPROPERTY Property; + ULONG InputIndex; +} KSPROPERTY_TUNER_INPUT_S,*PKSPROPERTY_TUNER_INPUT_S; + +typedef struct { + KSPROPERTY Property; + ULONG CurrentFrequency; + ULONG PLLOffset; + ULONG SignalStrength; + ULONG Busy; +} KSPROPERTY_TUNER_STATUS_S,*PKSPROPERTY_TUNER_STATUS_S; + +#define STATIC_EVENTSETID_TUNER \ + 0x6a2e0606L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0606-28e4-11d0-a18c-00a0c9118956",EVENTSETID_TUNER); +#define EVENTSETID_TUNER DEFINE_GUIDNAMED(EVENTSETID_TUNER) + +typedef enum { + KSEVENT_TUNER_CHANGED +} KSEVENT_TUNER; + +#define STATIC_KSNODETYPE_VIDEO_STREAMING \ + 0xDFF229E1L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E1-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_STREAMING); +#define KSNODETYPE_VIDEO_STREAMING DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_STREAMING) + +#define STATIC_KSNODETYPE_VIDEO_INPUT_TERMINAL \ + 0xDFF229E2L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E2-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_INPUT_TERMINAL); +#define KSNODETYPE_VIDEO_INPUT_TERMINAL DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_INPUT_TERMINAL) + +#define STATIC_KSNODETYPE_VIDEO_OUTPUT_TERMINAL \ + 0xDFF229E3L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E3-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_OUTPUT_TERMINAL); +#define KSNODETYPE_VIDEO_OUTPUT_TERMINAL DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_OUTPUT_TERMINAL) + +#define STATIC_KSNODETYPE_VIDEO_SELECTOR \ + 0xDFF229E4L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E4-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_SELECTOR); +#define KSNODETYPE_VIDEO_SELECTOR DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_SELECTOR) + +#define STATIC_KSNODETYPE_VIDEO_PROCESSING \ + 0xDFF229E5L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E5-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_PROCESSING); +#define KSNODETYPE_VIDEO_PROCESSING DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_PROCESSING) + +#define STATIC_KSNODETYPE_VIDEO_CAMERA_TERMINAL \ + 0xDFF229E6L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E6-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_CAMERA_TERMINAL); +#define KSNODETYPE_VIDEO_CAMERA_TERMINAL DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_CAMERA_TERMINAL) + +#define STATIC_KSNODETYPE_VIDEO_INPUT_MTT \ + 0xDFF229E7L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E7-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_INPUT_MTT); +#define KSNODETYPE_VIDEO_INPUT_MTT DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_INPUT_MTT) + +#define STATIC_KSNODETYPE_VIDEO_OUTPUT_MTT \ + 0xDFF229E8L,0xF70F,0x11D0,0xB9,0x17,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("DFF229E8-F70F-11D0-B917-00A0C9223196",KSNODETYPE_VIDEO_OUTPUT_MTT); +#define KSNODETYPE_VIDEO_OUTPUT_MTT DEFINE_GUIDNAMED(KSNODETYPE_VIDEO_OUTPUT_MTT) + +#define STATIC_PROPSETID_VIDCAP_VIDEOENCODER \ + 0x6a2e0610L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0610-28e4-11d0-a18c-00a0c9118956",PROPSETID_VIDCAP_VIDEOENCODER); +#define PROPSETID_VIDCAP_VIDEOENCODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOENCODER) + +typedef enum { + KSPROPERTY_VIDEOENCODER_CAPS, + KSPROPERTY_VIDEOENCODER_STANDARD, + KSPROPERTY_VIDEOENCODER_COPYPROTECTION, + KSPROPERTY_VIDEOENCODER_CC_ENABLE +} KSPROPERTY_VIDCAP_VIDEOENCODER; + +typedef struct { + KSPROPERTY Property; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_VIDEOENCODER_S,*PKSPROPERTY_VIDEOENCODER_S; + +#define STATIC_PROPSETID_VIDCAP_VIDEODECODER \ + 0xC6E13350L,0x30AC,0x11d0,0xA1,0x8C,0x00,0xA0,0xC9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("C6E13350-30AC-11d0-A18C-00A0C9118956",PROPSETID_VIDCAP_VIDEODECODER); +#define PROPSETID_VIDCAP_VIDEODECODER DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEODECODER) + +typedef enum { + KSPROPERTY_VIDEODECODER_CAPS, + KSPROPERTY_VIDEODECODER_STANDARD, + KSPROPERTY_VIDEODECODER_STATUS, + KSPROPERTY_VIDEODECODER_OUTPUT_ENABLE, + KSPROPERTY_VIDEODECODER_VCR_TIMING +} KSPROPERTY_VIDCAP_VIDEODECODER; + +typedef enum { + KS_VIDEODECODER_FLAGS_CAN_DISABLE_OUTPUT = 0X0001, + KS_VIDEODECODER_FLAGS_CAN_USE_VCR_LOCKING = 0X0002, + KS_VIDEODECODER_FLAGS_CAN_INDICATE_LOCKED = 0X0004 +} KS_VIDEODECODER_FLAGS; + +typedef struct { + KSPROPERTY Property; + ULONG StandardsSupported; + ULONG Capabilities; + ULONG SettlingTime; + ULONG HSyncPerVSync; +} KSPROPERTY_VIDEODECODER_CAPS_S,*PKSPROPERTY_VIDEODECODER_CAPS_S; + +typedef struct { + KSPROPERTY Property; + ULONG NumberOfLines; + ULONG SignalLocked; +} KSPROPERTY_VIDEODECODER_STATUS_S,*PKSPROPERTY_VIDEODECODER_STATUS_S; + +typedef struct { + KSPROPERTY Property; + ULONG Value; +} KSPROPERTY_VIDEODECODER_S,*PKSPROPERTY_VIDEODECODER_S; + +#define STATIC_EVENTSETID_VIDEODECODER \ + 0x6a2e0621L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0621-28e4-11d0-a18c-00a0c9118956",EVENTSETID_VIDEODECODER); +#define EVENTSETID_VIDEODECODER DEFINE_GUIDNAMED(EVENTSETID_VIDEODECODER) + +typedef enum { + KSEVENT_VIDEODECODER_CHANGED +} KSEVENT_VIDEODECODER; + +#define STATIC_PROPSETID_VIDCAP_CAMERACONTROL \ + 0xC6E13370L,0x30AC,0x11d0,0xa1,0x8C,0x00,0xA0,0xC9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("C6E13370-30AC-11d0-A18C-00A0C9118956",PROPSETID_VIDCAP_CAMERACONTROL); +#define PROPSETID_VIDCAP_CAMERACONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CAMERACONTROL) + +typedef enum { + KSPROPERTY_CAMERACONTROL_PAN, + KSPROPERTY_CAMERACONTROL_TILT, + KSPROPERTY_CAMERACONTROL_ROLL, + KSPROPERTY_CAMERACONTROL_ZOOM, + KSPROPERTY_CAMERACONTROL_EXPOSURE, + KSPROPERTY_CAMERACONTROL_IRIS, + KSPROPERTY_CAMERACONTROL_FOCUS, + KSPROPERTY_CAMERACONTROL_SCANMODE, + KSPROPERTY_CAMERACONTROL_PRIVACY, + KSPROPERTY_CAMERACONTROL_PANTILT, + KSPROPERTY_CAMERACONTROL_PAN_RELATIVE, + KSPROPERTY_CAMERACONTROL_TILT_RELATIVE, + KSPROPERTY_CAMERACONTROL_ROLL_RELATIVE, + KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE, + KSPROPERTY_CAMERACONTROL_EXPOSURE_RELATIVE, + KSPROPERTY_CAMERACONTROL_IRIS_RELATIVE, + KSPROPERTY_CAMERACONTROL_FOCUS_RELATIVE, + KSPROPERTY_CAMERACONTROL_PANTILT_RELATIVE, + KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH +} KSPROPERTY_VIDCAP_CAMERACONTROL; + +typedef struct { + KSPROPERTY Property; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_CAMERACONTROL_S,*PKSPROPERTY_CAMERACONTROL_S; + +typedef struct { + KSP_NODE NodeProperty; + LONG Value; + ULONG Flags; + ULONG Capabilities; +} KSPROPERTY_CAMERACONTROL_NODE_S,PKSPROPERTY_CAMERACONTROL_NODE_S; + +typedef struct { + KSPROPERTY Property; + LONG Value1; + ULONG Flags; + ULONG Capabilities; + LONG Value2; +} KSPROPERTY_CAMERACONTROL_S2,*PKSPROPERTY_CAMERACONTROL_S2; + +typedef struct { + KSP_NODE NodeProperty; + LONG Value1; + ULONG Flags; + ULONG Capabilities; + LONG Value2; +} KSPROPERTY_CAMERACONTROL_NODE_S2,*PKSPROPERTY_CAMERACONTROL_NODE_S2; + +typedef struct { + KSPROPERTY Property; + LONG lOcularFocalLength; + LONG lObjectiveFocalLengthMin; + LONG lObjectiveFocalLengthMax; +} KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S,*PKSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S; + +typedef struct { + KSNODEPROPERTY NodeProperty; + LONG lOcularFocalLength; + LONG lObjectiveFocalLengthMin; + LONG lObjectiveFocalLengthMax; +} KSPROPERTY_CAMERACONTROL_NODE_FOCAL_LENGTH_S,*PKSPROPERTY_CAMERACONTROL_NODE_FOCAL_LENGTH_S; + +#define KSPROPERTY_CAMERACONTROL_FLAGS_AUTO 0X0001L +#define KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL 0X0002L + +#define KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE 0X0000L +#define KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE 0X0010L + +#ifndef __EDevCtrl__ +#define __EDevCtrl__ + +#define STATIC_PROPSETID_EXT_DEVICE \ + 0xB5730A90L,0x1A2C,0x11cf,0x8c,0x23,0x00,0xAA,0x00,0x6B,0x68,0x14 +DEFINE_GUIDSTRUCT("B5730A90-1A2C-11cf-8C23-00AA006B6814",PROPSETID_EXT_DEVICE); +#define PROPSETID_EXT_DEVICE DEFINE_GUIDNAMED(PROPSETID_EXT_DEVICE) + +typedef enum { + KSPROPERTY_EXTDEVICE_ID, + KSPROPERTY_EXTDEVICE_VERSION, + KSPROPERTY_EXTDEVICE_POWER_STATE, + KSPROPERTY_EXTDEVICE_PORT, + KSPROPERTY_EXTDEVICE_CAPABILITIES +} KSPROPERTY_EXTDEVICE; + +typedef struct tagDEVCAPS{ + LONG CanRecord; + LONG CanRecordStrobe; + LONG HasAudio; + LONG HasVideo; + LONG UsesFiles; + LONG CanSave; + LONG DeviceType; + LONG TCRead; + LONG TCWrite; + LONG CTLRead; + LONG IndexRead; + LONG Preroll; + LONG Postroll; + LONG SyncAcc; + LONG NormRate; + LONG CanPreview; + LONG CanMonitorSrc; + LONG CanTest; + LONG VideoIn; + LONG AudioIn; + LONG Calibrate; + LONG SeekType; + LONG SimulatedHardware; +} DEVCAPS,*PDEVCAPS; + +typedef struct { + KSPROPERTY Property; + union { + DEVCAPS Capabilities; + ULONG DevPort; + ULONG PowerState; + WCHAR pawchString[MAX_PATH]; + DWORD NodeUniqueID[2]; + } u; +} KSPROPERTY_EXTDEVICE_S,*PKSPROPERTY_EXTDEVICE_S; + +#define STATIC_PROPSETID_EXT_TRANSPORT \ + 0xA03CD5F0L,0x3045,0x11cf,0x8c,0x44,0x00,0xAA,0x00,0x6B,0x68,0x14 +DEFINE_GUIDSTRUCT("A03CD5F0-3045-11cf-8C44-00AA006B6814",PROPSETID_EXT_TRANSPORT); +#define PROPSETID_EXT_TRANSPORT DEFINE_GUIDNAMED(PROPSETID_EXT_TRANSPORT) + +typedef enum { + KSPROPERTY_EXTXPORT_CAPABILITIES, + KSPROPERTY_EXTXPORT_INPUT_SIGNAL_MODE, + KSPROPERTY_EXTXPORT_OUTPUT_SIGNAL_MODE, + KSPROPERTY_EXTXPORT_LOAD_MEDIUM, + KSPROPERTY_EXTXPORT_MEDIUM_INFO, + KSPROPERTY_EXTXPORT_STATE, + KSPROPERTY_EXTXPORT_STATE_NOTIFY, + KSPROPERTY_EXTXPORT_TIMECODE_SEARCH, + KSPROPERTY_EXTXPORT_ATN_SEARCH, + KSPROPERTY_EXTXPORT_RTC_SEARCH, + KSPROPERTY_RAW_AVC_CMD +} KSPROPERTY_EXTXPORT; + +typedef struct tagTRANSPORTSTATUS { + LONG Mode; + LONG LastError; + LONG RecordInhibit; + LONG ServoLock; + LONG MediaPresent; + LONG MediaLength; + LONG MediaSize; + LONG MediaTrackCount; + LONG MediaTrackLength; + LONG MediaTrackSide; + LONG MediaType; + LONG LinkMode; + LONG NotifyOn; +} TRANSPORTSTATUS,*PTRANSPORTSTATUS; + +typedef struct tagTRANSPORTBASICPARMS { + LONG TimeFormat; + LONG TimeReference; + LONG Superimpose; + LONG EndStopAction; + LONG RecordFormat; + LONG StepFrames; + LONG SetpField; + LONG Preroll; + LONG RecPreroll; + LONG Postroll; + LONG EditDelay; + LONG PlayTCDelay; + LONG RecTCDelay; + LONG EditField; + LONG FrameServo; + LONG ColorFrameServo; + LONG ServoRef; + LONG WarnGenlock; + LONG SetTracking; + TCHAR VolumeName[40]; + LONG Ballistic[20]; + LONG Speed; + LONG CounterFormat; + LONG TunerChannel; + LONG TunerNumber; + LONG TimerEvent; + LONG TimerStartDay; + LONG TimerStartTime; + LONG TimerStopDay; + LONG TimerStopTime; +} TRANSPORTBASICPARMS,*PTRANSPORTBASICPARMS; + +typedef struct tagTRANSPORTVIDEOPARMS { + LONG OutputMode; + LONG Input; +} TRANSPORTVIDEOPARMS,*PTRANSPORTVIDEOPARMS; + +typedef struct tagTRANSPORTAUDIOPARMS { + LONG EnableOutput; + LONG EnableRecord; + LONG EnableSelsync; + LONG Input; + LONG MonitorSource; +} TRANSPORTAUDIOPARMS,*PTRANSPORTAUDIOPARMS; + +typedef struct { + WINBOOL MediaPresent; + ULONG MediaType; + WINBOOL RecordInhibit; +} MEDIUM_INFO,*PMEDIUM_INFO; + +typedef struct { + ULONG Mode; + ULONG State; +} TRANSPORT_STATE,*PTRANSPORT_STATE; + +typedef struct { + KSPROPERTY Property; + union { + ULONG Capabilities; + ULONG SignalMode; + ULONG LoadMedium; + MEDIUM_INFO MediumInfo; + TRANSPORT_STATE XPrtState; + struct { + BYTE frame; + BYTE second; + BYTE minute; + BYTE hour; + } Timecode; + DWORD dwTimecode; + DWORD dwAbsTrackNumber; + struct { + ULONG PayloadSize; + BYTE Payload[512]; + } RawAVC; + } u; +} KSPROPERTY_EXTXPORT_S,*PKSPROPERTY_EXTXPORT_S; + +typedef struct { + KSP_NODE NodeProperty; + union { + ULONG Capabilities; + ULONG SignalMode; + ULONG LoadMedium; + MEDIUM_INFO MediumInfo; + TRANSPORT_STATE XPrtState; + struct { + BYTE frame; + BYTE second; + BYTE minute; + BYTE hour; + } Timecode; + DWORD dwTimecode; + DWORD dwAbsTrackNumber; + struct { + ULONG PayloadSize; + BYTE Payload[512]; + } RawAVC; + } u; +} KSPROPERTY_EXTXPORT_NODE_S,*PKSPROPERTY_EXTXPORT_NODE_S; + +#define STATIC_PROPSETID_TIMECODE_READER \ + 0x9B496CE1L,0x811B,0x11cf,0x8C,0x77,0x00,0xAA,0x00,0x6B,0x68,0x14 +DEFINE_GUIDSTRUCT("9B496CE1-811B-11cf-8C77-00AA006B6814",PROPSETID_TIMECODE_READER); +#define PROPSETID_TIMECODE_READER DEFINE_GUIDNAMED(PROPSETID_TIMECODE_READER) + +typedef enum { + KSPROPERTY_TIMECODE_READER, + KSPROPERTY_ATN_READER, + KSPROPERTY_RTC_READER +} KSPROPERTY_TIMECODE; + +#ifndef TIMECODE_DEFINED +#define TIMECODE_DEFINED +typedef union _timecode { + struct { + WORD wFrameRate; + WORD wFrameFract; + DWORD dwFrames; + }; + DWORDLONG qw; +} TIMECODE; +typedef TIMECODE *PTIMECODE; + +typedef struct tagTIMECODE_SAMPLE { + LONGLONG qwTick; + TIMECODE timecode; + DWORD dwUser; + DWORD dwFlags; +} TIMECODE_SAMPLE; + +typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE; +#endif /* TIMECODE_DEFINED */ + +typedef struct { + KSPROPERTY Property; + TIMECODE_SAMPLE TimecodeSamp; +} KSPROPERTY_TIMECODE_S,*PKSPROPERTY_TIMECODE_S; + +typedef struct { + KSP_NODE NodeProperty; + TIMECODE_SAMPLE TimecodeSamp; +} KSPROPERTY_TIMECODE_NODE_S,*PKSPROPERTY_TIMECODE_NODE_S; + +#define STATIC_KSEVENTSETID_EXTDEV_Command \ + 0x109c7988L,0xb3cb,0x11d2,0xb4,0x8e,0x00,0x60,0x97,0xb3,0x39,0x1b +DEFINE_GUIDSTRUCT("109c7988-b3cb-11d2-b48e-006097b3391b",KSEVENTSETID_EXTDEV_Command); +#define KSEVENTSETID_EXTDEV_Command DEFINE_GUIDNAMED(KSEVENTSETID_EXTDEV_Command) + +typedef enum { + KSEVENT_EXTDEV_COMMAND_NOTIFY_INTERIM_READY, + KSEVENT_EXTDEV_COMMAND_CONTROL_INTERIM_READY, + KSEVENT_EXTDEV_COMMAND_BUSRESET, + KSEVENT_EXTDEV_TIMECODE_UPDATE, + KSEVENT_EXTDEV_OPERATION_MODE_UPDATE, + KSEVENT_EXTDEV_TRANSPORT_STATE_UPDATE, + KSEVENT_EXTDEV_NOTIFY_REMOVAL, + KSEVENT_EXTDEV_NOTIFY_MEDIUM_CHANGE +} KSEVENT_DEVCMD; +#endif /* __EDevCtrl__ */ + +#define STATIC_PROPSETID_VIDCAP_CROSSBAR \ + 0x6a2e0640L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0640-28e4-11d0-a18c-00a0c9118956",PROPSETID_VIDCAP_CROSSBAR); +#define PROPSETID_VIDCAP_CROSSBAR DEFINE_GUIDNAMED(PROPSETID_VIDCAP_CROSSBAR) + +typedef enum { + KSPROPERTY_CROSSBAR_CAPS, + KSPROPERTY_CROSSBAR_PININFO, + KSPROPERTY_CROSSBAR_CAN_ROUTE, + KSPROPERTY_CROSSBAR_ROUTE +} KSPROPERTY_VIDCAP_CROSSBAR; + +typedef struct { + KSPROPERTY Property; + ULONG NumberOfInputs; + ULONG NumberOfOutputs; +} KSPROPERTY_CROSSBAR_CAPS_S,*PKSPROPERTY_CROSSBAR_CAPS_S; + +typedef struct { + KSPROPERTY Property; + KSPIN_DATAFLOW Direction; + ULONG Index; + ULONG PinType; + ULONG RelatedPinIndex; + KSPIN_MEDIUM Medium; +} KSPROPERTY_CROSSBAR_PININFO_S,*PKSPROPERTY_CROSSBAR_PININFO_S; + +typedef struct { + KSPROPERTY Property; + ULONG IndexInputPin; + ULONG IndexOutputPin; + ULONG CanRoute; +} KSPROPERTY_CROSSBAR_ROUTE_S,*PKSPROPERTY_CROSSBAR_ROUTE_S; + +#define STATIC_EVENTSETID_CROSSBAR \ + 0x6a2e0641L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0641-28e4-11d0-a18c-00a0c9118956",EVENTSETID_CROSSBAR); +#define EVENTSETID_CROSSBAR DEFINE_GUIDNAMED(EVENTSETID_CROSSBAR) + +typedef enum { + KSEVENT_CROSSBAR_CHANGED +} KSEVENT_CROSSBAR; + +typedef enum { + KS_PhysConn_Video_Tuner = 1, + KS_PhysConn_Video_Composite, + KS_PhysConn_Video_SVideo, + KS_PhysConn_Video_RGB, + KS_PhysConn_Video_YRYBY, + KS_PhysConn_Video_SerialDigital, + KS_PhysConn_Video_ParallelDigital, + KS_PhysConn_Video_SCSI, + KS_PhysConn_Video_AUX, + KS_PhysConn_Video_1394, + KS_PhysConn_Video_USB, + KS_PhysConn_Video_VideoDecoder, + KS_PhysConn_Video_VideoEncoder, + KS_PhysConn_Video_SCART, + KS_PhysConn_Audio_Tuner = 4096, + KS_PhysConn_Audio_Line, + KS_PhysConn_Audio_Mic, + KS_PhysConn_Audio_AESDigital, + KS_PhysConn_Audio_SPDIFDigital, + KS_PhysConn_Audio_SCSI, + KS_PhysConn_Audio_AUX, + KS_PhysConn_Audio_1394, + KS_PhysConn_Audio_USB, + KS_PhysConn_Audio_AudioDecoder +} KS_PhysicalConnectorType; + +#define STATIC_PROPSETID_VIDCAP_TVAUDIO \ + 0x6a2e0650L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0650-28e4-11d0-a18c-00a0c9118956",PROPSETID_VIDCAP_TVAUDIO); +#define PROPSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(PROPSETID_VIDCAP_TVAUDIO) + +typedef enum { + KSPROPERTY_TVAUDIO_CAPS, + KSPROPERTY_TVAUDIO_MODE, + KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES +} KSPROPERTY_VIDCAP_TVAUDIO; + +#define KS_TVAUDIO_MODE_MONO 0x0001 +#define KS_TVAUDIO_MODE_STEREO 0x0002 +#define KS_TVAUDIO_MODE_LANG_A 0x0010 +#define KS_TVAUDIO_MODE_LANG_B 0x0020 +#define KS_TVAUDIO_MODE_LANG_C 0x0040 + +typedef struct { + KSPROPERTY Property; + ULONG Capabilities; + KSPIN_MEDIUM InputMedium; + KSPIN_MEDIUM OutputMedium; +} KSPROPERTY_TVAUDIO_CAPS_S,*PKSPROPERTY_TVAUDIO_CAPS_S; + +typedef struct { + KSPROPERTY Property; + ULONG Mode; +} KSPROPERTY_TVAUDIO_S,*PKSPROPERTY_TVAUDIO_S; + +#define STATIC_KSEVENTSETID_VIDCAP_TVAUDIO \ + 0x6a2e0651L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0651-28e4-11d0-a18c-00a0c9118956",KSEVENTSETID_VIDCAP_TVAUDIO); +#define KSEVENTSETID_VIDCAP_TVAUDIO DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAP_TVAUDIO) + +typedef enum { + KSEVENT_TVAUDIO_CHANGED +} KSEVENT_TVAUDIO; + +#define STATIC_PROPSETID_VIDCAP_VIDEOCOMPRESSION \ + 0xC6E13343L,0x30AC,0x11d0,0xA1,0x8C,0x00,0xA0,0xC9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("C6E13343-30AC-11d0-A18C-00A0C9118956",PROPSETID_VIDCAP_VIDEOCOMPRESSION); +#define PROPSETID_VIDCAP_VIDEOCOMPRESSION DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCOMPRESSION) + +typedef enum { + KSPROPERTY_VIDEOCOMPRESSION_GETINFO, + KSPROPERTY_VIDEOCOMPRESSION_KEYFRAME_RATE, + KSPROPERTY_VIDEOCOMPRESSION_PFRAMES_PER_KEYFRAME, + KSPROPERTY_VIDEOCOMPRESSION_QUALITY, + KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_KEYFRAME, + KSPROPERTY_VIDEOCOMPRESSION_OVERRIDE_FRAME_SIZE, + KSPROPERTY_VIDEOCOMPRESSION_WINDOWSIZE +} KSPROPERTY_VIDCAP_VIDEOCOMPRESSION; + +typedef enum { + KS_CompressionCaps_CanQuality = 1, + KS_CompressionCaps_CanCrunch = 2, + KS_CompressionCaps_CanKeyFrame = 4, + KS_CompressionCaps_CanBFrame = 8, + KS_CompressionCaps_CanWindow = 0x10 +} KS_CompressionCaps; + +typedef enum { + KS_StreamingHint_FrameInterval = 0x0100, + KS_StreamingHint_KeyFrameRate = 0x0200, + KS_StreamingHint_PFrameRate = 0x0400, + KS_StreamingHint_CompQuality = 0x0800, + KS_StreamingHint_CompWindowSize = 0x1000 +} KS_VideoStreamingHints; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + LONG DefaultKeyFrameRate; + LONG DefaultPFrameRate; + LONG DefaultQuality; + LONG NumberOfQualitySettings; + LONG Capabilities; +} KSPROPERTY_VIDEOCOMPRESSION_GETINFO_S,*PKSPROPERTY_VIDEOCOMPRESSION_GETINFO_S; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + LONG Value; +} KSPROPERTY_VIDEOCOMPRESSION_S,*PKSPROPERTY_VIDEOCOMPRESSION_S; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + LONG Value; + ULONG Flags; +} KSPROPERTY_VIDEOCOMPRESSION_S1,*PKSPROPERTY_VIDEOCOMPRESSION_S1; + +#define STATIC_KSDATAFORMAT_SUBTYPE_OVERLAY \ + 0xe436eb7fL,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70 +DEFINE_GUIDSTRUCT("e436eb7f-524f-11ce-9f53-0020af0ba770",KSDATAFORMAT_SUBTYPE_OVERLAY); +#define KSDATAFORMAT_SUBTYPE_OVERLAY DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_OVERLAY) + +#define STATIC_KSPROPSETID_OverlayUpdate \ + 0x490EA5CFL,0x7681,0x11D1,0xA2,0x1C,0x00,0xA0,0xC9,0x22,0x31,0x96 +DEFINE_GUIDSTRUCT("490EA5CF-7681-11D1-A21C-00A0C9223196",KSPROPSETID_OverlayUpdate); +#define KSPROPSETID_OverlayUpdate DEFINE_GUIDNAMED(KSPROPSETID_OverlayUpdate) + +typedef enum { + KSPROPERTY_OVERLAYUPDATE_INTERESTS, + KSPROPERTY_OVERLAYUPDATE_CLIPLIST = 0x1, + KSPROPERTY_OVERLAYUPDATE_PALETTE = 0x2, + KSPROPERTY_OVERLAYUPDATE_COLORKEY = 0x4, + KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION = 0x8, + KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE = 0x10, + KSPROPERTY_OVERLAYUPDATE_COLORREF = 0x10000000 +} KSPROPERTY_OVERLAYUPDATE; + +typedef struct { + ULONG PelsWidth; + ULONG PelsHeight; + ULONG BitsPerPel; + WCHAR DeviceID[1]; +} KSDISPLAYCHANGE,*PKSDISPLAYCHANGE; + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_INTERESTS(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_INTERESTS, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(ULONG), \ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_PALETTE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_PALETTE, \ + NULL, \ + sizeof(KSPROPERTY), \ + 0, \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORKEY(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_COLORKEY, \ + NULL, \ + sizeof(KSPROPERTY), \ + sizeof(COLORKEY), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_CLIPLIST(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_CLIPLIST, \ + NULL, \ + sizeof(KSPROPERTY), \ + 2 *sizeof(RECT) + sizeof(RGNDATAHEADER),\ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_VIDEOPOSITION(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_VIDEOPOSITION, \ + NULL, \ + sizeof(KSPROPERTY), \ + 2 *sizeof(RECT), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_DISPLAYCHANGE(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_DISPLAYCHANGE, \ + NULL, \ + sizeof(KSPROPERTY), \ + sizeof(KSDISPLAYCHANGE), \ + (Handler), \ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_OVERLAYUPDATE_COLORREF(Handler) \ + DEFINE_KSPROPERTY_ITEM( \ + KSPROPERTY_OVERLAYUPDATE_COLORREF, \ + (Handler), \ + sizeof(KSPROPERTY), \ + sizeof(COLORREF), \ + NULL, \ + NULL, 0, NULL, NULL, 0) + +#define STATIC_PROPSETID_VIDCAP_VIDEOCONTROL \ + 0x6a2e0670L,0x28e4,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("6a2e0670-28e4-11d0-a18c-00a0c9118956",PROPSETID_VIDCAP_VIDEOCONTROL); +#define PROPSETID_VIDCAP_VIDEOCONTROL DEFINE_GUIDNAMED(PROPSETID_VIDCAP_VIDEOCONTROL) + +typedef enum { + KSPROPERTY_VIDEOCONTROL_CAPS, + KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE, + KSPROPERTY_VIDEOCONTROL_FRAME_RATES, + KSPROPERTY_VIDEOCONTROL_MODE +} KSPROPERTY_VIDCAP_VIDEOCONTROL; + +typedef enum { + KS_VideoControlFlag_FlipHorizontal = 0x0001, + KS_VideoControlFlag_FlipVertical = 0x0002, + KS_Obsolete_VideoControlFlag_ExternalTriggerEnable = 0x0010, + KS_Obsolete_VideoControlFlag_Trigger = 0x0020, + KS_VideoControlFlag_ExternalTriggerEnable = 0x0004, + KS_VideoControlFlag_Trigger = 0x0008 +} KS_VideoControlFlags; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + ULONG VideoControlCaps; +} KSPROPERTY_VIDEOCONTROL_CAPS_S,*PKSPROPERTY_VIDEOCONTROL_CAPS_S; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + LONG Mode; +} KSPROPERTY_VIDEOCONTROL_MODE_S,*PKSPROPERTY_VIDEOCONTROL_MODE_S; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + ULONG RangeIndex; + SIZE Dimensions; + LONGLONG CurrentActualFrameRate; + LONGLONG CurrentMaxAvailableFrameRate; +} KSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S,*PKSPROPERTY_VIDEOCONTROL_ACTUAL_FRAME_RATE_S; + +typedef struct { + KSPROPERTY Property; + ULONG StreamIndex; + ULONG RangeIndex; + SIZE Dimensions; +} KSPROPERTY_VIDEOCONTROL_FRAME_RATES_S,*PKSPROPERTY_VIDEOCONTROL_FRAME_RATES_S; + +#define STATIC_PROPSETID_VIDCAP_DROPPEDFRAMES \ + 0xC6E13344L,0x30AC,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56 +DEFINE_GUIDSTRUCT("C6E13344-30AC-11d0-A18C-00A0C9118956",PROPSETID_VIDCAP_DROPPEDFRAMES); +#define PROPSETID_VIDCAP_DROPPEDFRAMES DEFINE_GUIDNAMED(PROPSETID_VIDCAP_DROPPEDFRAMES) + +typedef enum { + KSPROPERTY_DROPPEDFRAMES_CURRENT +} KSPROPERTY_VIDCAP_DROPPEDFRAMES; + +typedef struct { + KSPROPERTY Property; + LONGLONG PictureNumber; + LONGLONG DropCount; + ULONG AverageFrameSize; +} KSPROPERTY_DROPPEDFRAMES_CURRENT_S,*PKSPROPERTY_DROPPEDFRAMES_CURRENT_S; + +#define STATIC_KSPROPSETID_VPConfig \ + 0xbc29a660L,0x30e3,0x11d0,0x9e,0x69,0x00,0xc0,0x4f,0xd7,0xc1,0x5b +DEFINE_GUIDSTRUCT("bc29a660-30e3-11d0-9e69-00c04fd7c15b",KSPROPSETID_VPConfig); +#define KSPROPSETID_VPConfig DEFINE_GUIDNAMED(KSPROPSETID_VPConfig) + +#define STATIC_KSPROPSETID_VPVBIConfig \ + 0xec529b00L,0x1a1f,0x11d1,0xba,0xd9,0x0,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("ec529b00-1a1f-11d1-bad9-00609744111a",KSPROPSETID_VPVBIConfig); +#define KSPROPSETID_VPVBIConfig DEFINE_GUIDNAMED(KSPROPSETID_VPVBIConfig) + +typedef enum { + KSPROPERTY_VPCONFIG_NUMCONNECTINFO, + KSPROPERTY_VPCONFIG_GETCONNECTINFO, + KSPROPERTY_VPCONFIG_SETCONNECTINFO, + KSPROPERTY_VPCONFIG_VPDATAINFO, + KSPROPERTY_VPCONFIG_MAXPIXELRATE, + KSPROPERTY_VPCONFIG_INFORMVPINPUT, + KSPROPERTY_VPCONFIG_NUMVIDEOFORMAT, + KSPROPERTY_VPCONFIG_GETVIDEOFORMAT, + KSPROPERTY_VPCONFIG_SETVIDEOFORMAT, + KSPROPERTY_VPCONFIG_INVERTPOLARITY, + KSPROPERTY_VPCONFIG_DECIMATIONCAPABILITY, + KSPROPERTY_VPCONFIG_SCALEFACTOR, + KSPROPERTY_VPCONFIG_DDRAWHANDLE, + KSPROPERTY_VPCONFIG_VIDEOPORTID, + KSPROPERTY_VPCONFIG_DDRAWSURFACEHANDLE, + KSPROPERTY_VPCONFIG_SURFACEPARAMS +} KSPROPERTY_VPCONFIG; + +#define STATIC_CLSID_KsIBasicAudioInterfaceHandler \ + 0xb9f8ac3e,0x0f71,0x11d2,0xb7,0x2c,0x00,0xc0,0x4f,0xb6,0xbd,0x3d +DEFINE_GUIDSTRUCT("b9f8ac3e-0f71-11d2-b72c-00c04fb6bd3d",CLSID_KsIBasicAudioInterfaceHandler); +#define CLSID_KsIBasicAudioInterfaceHandler DEFINE_GUIDNAMED(CLSID_KsIBasicAudioInterfaceHandler) + +#ifdef __IVPType__ +typedef struct { + AMVPSIZE Size; + DWORD MaxPixelsPerSecond; + DWORD Reserved; +} KSVPMAXPIXELRATE,*PKSVPMAXPIXELRATE; + +typedef struct { + KSPROPERTY Property; + AMVPSIZE Size; +} KSVPSIZE_PROP,*PKSVPSIZE_PROP; + +typedef struct { + DWORD dwPitch; + DWORD dwXOrigin; + DWORD dwYOrigin; +} KSVPSURFACEPARAMS,*PKSVPSURFACEPARAMS; +#else /* __IVPType__ */ + +#ifndef __DDRAW_INCLUDED__ +#define DDPF_FOURCC 0x00000004l + +typedef struct _DDPIXELFORMAT +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwFourCC; + __MINGW_EXTENSION union + { + DWORD dwRGBBitCount; + DWORD dwYUVBitCount; + DWORD dwZBufferBitDepth; + DWORD dwAlphaBitDepth; + }; + __MINGW_EXTENSION union + { + DWORD dwRBitMask; + DWORD dwYBitMask; + }; + __MINGW_EXTENSION union + { + DWORD dwGBitMask; + DWORD dwUBitMask; + }; + __MINGW_EXTENSION union + { + DWORD dwBBitMask; + DWORD dwVBitMask; + }; + __MINGW_EXTENSION union + { + DWORD dwRGBAlphaBitMask; + DWORD dwYUVAlphaBitMask; + DWORD dwRGBZBitMask; + DWORD dwYUVZBitMask; + }; +} DDPIXELFORMAT,*LPDDPIXELFORMAT; +#endif /* __DDRAW_INCLUDED__ */ + +#ifndef __DVP_INCLUDED__ +typedef struct _DDVIDEOPORTCONNECT { + DWORD dwSize; + DWORD dwPortWidth; + GUID guidTypeID; + DWORD dwFlags; + ULONG_PTR dwReserved1; +} DDVIDEOPORTCONNECT,*LPDDVIDEOPORTCONNECT; + +#define DDVPTYPE_E_HREFH_VREFH \ + 0x54F39980L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 + +#define DDVPTYPE_E_HREFL_VREFL \ + 0xE09C77E0L,0xDA60,0x11CF,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 +#endif /* __DVP_INCLUDED__ */ + +typedef enum +{ + KS_PixAspectRatio_NTSC4x3, + KS_PixAspectRatio_NTSC16x9, + KS_PixAspectRatio_PAL4x3, + KS_PixAspectRatio_PAL16x9 +} KS_AMPixAspectRatio; + +typedef enum +{ + KS_AMVP_DO_NOT_CARE, + KS_AMVP_BEST_BANDWIDTH, + KS_AMVP_INPUT_SAME_AS_OUTPUT +} KS_AMVP_SELECTFORMATBY; + +typedef enum +{ + KS_AMVP_MODE_WEAVE, + KS_AMVP_MODE_BOBINTERLEAVED, + KS_AMVP_MODE_BOBNONINTERLEAVED, + KS_AMVP_MODE_SKIPEVEN, + KS_AMVP_MODE_SKIPODD +} KS_AMVP_MODE; + +typedef struct tagKS_AMVPDIMINFO +{ + DWORD dwFieldWidth; + DWORD dwFieldHeight; + DWORD dwVBIWidth; + DWORD dwVBIHeight; + RECT rcValidRegion; +} KS_AMVPDIMINFO,*PKS_AMVPDIMINFO; + +typedef struct tagKS_AMVPDATAINFO +{ + DWORD dwSize; + DWORD dwMicrosecondsPerField; + KS_AMVPDIMINFO amvpDimInfo; + DWORD dwPictAspectRatioX; + DWORD dwPictAspectRatioY; + WINBOOL bEnableDoubleClock; + WINBOOL bEnableVACT; + WINBOOL bDataIsInterlaced; + LONG lHalfLinesOdd; + WINBOOL bFieldPolarityInverted; + DWORD dwNumLinesInVREF; + LONG lHalfLinesEven; + DWORD dwReserved1; +} KS_AMVPDATAINFO,*PKS_AMVPDATAINFO; + +typedef struct tagKS_AMVPSIZE +{ + DWORD dwWidth; + DWORD dwHeight; +} KS_AMVPSIZE,*PKS_AMVPSIZE; + +typedef struct { + KS_AMVPSIZE Size; + DWORD MaxPixelsPerSecond; + DWORD Reserved; +} KSVPMAXPIXELRATE,*PKSVPMAXPIXELRATE; + +typedef struct { + KSPROPERTY Property; + KS_AMVPSIZE Size; +} KSVPSIZE_PROP,*PKSVPSIZE_PROP; + +typedef struct { + DWORD dwPitch; + DWORD dwXOrigin; + DWORD dwYOrigin; +} KSVPSURFACEPARAMS,*PKSVPSURFACEPARAMS; +#endif /* __IVPType__ */ + +#define STATIC_KSEVENTSETID_VPNotify \ + 0x20c5598eL,0xd3c8,0x11d0,0x8d,0xfc,0x00,0xc0,0x4f,0xd7,0xc0,0x8b +DEFINE_GUIDSTRUCT("20c5598e-d3c8-11d0-8dfc-00c04fd7c08b",KSEVENTSETID_VPNotify); +#define KSEVENTSETID_VPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VPNotify) + +typedef enum { + KSEVENT_VPNOTIFY_FORMATCHANGE +} KSEVENT_VPNOTIFY; + +#define STATIC_KSEVENTSETID_VIDCAPTOSTI \ + 0xdb47de20,0xf628,0x11d1,0xba,0x41,0x0,0xa0,0xc9,0xd,0x2b,0x5 +DEFINE_GUIDSTRUCT("DB47DE20-F628-11d1-BA41-00A0C90D2B05",KSEVENTSETID_VIDCAPTOSTI); +#define KSEVENTSETID_VIDCAPNotify DEFINE_GUIDNAMED(KSEVENTSETID_VIDCAPTOSTI) + +typedef enum { + KSEVENT_VIDCAPTOSTI_EXT_TRIGGER, + KSEVENT_VIDCAP_AUTO_UPDATE, + KSEVENT_VIDCAP_SEARCH +} KSEVENT_VIDCAPTOSTI; + +typedef enum { + KSPROPERTY_EXTENSION_UNIT_INFO, + KSPROPERTY_EXTENSION_UNIT_CONTROL, + KSPROPERTY_EXTENSION_UNIT_PASS_THROUGH = 0xffff +} KSPROPERTY_EXTENSION_UNIT,*PKSPROPERTY_EXTENSION_UNIT; + +#define STATIC_KSEVENTSETID_VPVBINotify \ + 0xec529b01L,0x1a1f,0x11d1,0xba,0xd9,0x0,0x60,0x97,0x44,0x11,0x1a +DEFINE_GUIDSTRUCT("ec529b01-1a1f-11d1-bad9-00609744111a",KSEVENTSETID_VPVBINotify); +#define KSEVENTSETID_VPVBINotify DEFINE_GUIDNAMED(KSEVENTSETID_VPVBINotify) + +typedef enum { + KSEVENT_VPVBINOTIFY_FORMATCHANGE +} KSEVENT_VPVBINOTIFY; + +#define STATIC_KSDATAFORMAT_TYPE_AUXLine21Data \ + 0x670aea80L,0x3a82,0x11d0,0xb7,0x9b,0x00,0xaa,0x00,0x37,0x67,0xa7 +DEFINE_GUIDSTRUCT("670aea80-3a82-11d0-b79b-00aa003767a7",KSDATAFORMAT_TYPE_AUXLine21Data); +#define KSDATAFORMAT_TYPE_AUXLine21Data DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUXLine21Data) + +#define STATIC_KSDATAFORMAT_SUBTYPE_Line21_BytePair \ + 0x6e8d4a22L,0x310c,0x11d0,0xb7,0x9a,0x00,0xaa,0x00,0x37,0x67,0xa7 +DEFINE_GUIDSTRUCT("6e8d4a22-310c-11d0-b79a-00aa003767a7",KSDATAFORMAT_SUBTYPE_Line21_BytePair); +#define KSDATAFORMAT_SUBTYPE_Line21_BytePair DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_BytePair) + +#define STATIC_KSDATAFORMAT_SUBTYPE_Line21_GOPPacket \ + 0x6e8d4a23L,0x310c,0x11d0,0xb7,0x9a,0x00,0xaa,0x00,0x37,0x67,0xa7 +DEFINE_GUIDSTRUCT("6e8d4a23-310c-11d0-b79a-00aa003767a7",KSDATAFORMAT_SUBTYPE_Line21_GOPPacket); +#define KSDATAFORMAT_SUBTYPE_Line21_GOPPacket DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_Line21_GOPPacket) + +typedef struct _KSGOP_USERDATA { + ULONG sc; + ULONG reserved1; + BYTE cFields; + CHAR l21Data[3]; +} KSGOP_USERDATA,*PKSGOP_USERDATA; + +#define STATIC_KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK \ + 0xed0b916a,0x044d,0x11d1,0xaa,0x78,0x00,0xc0,0x4f,0xc3,0x1d,0x60 +DEFINE_GUIDSTRUCT("ed0b916a-044d-11d1-aa78-00c04fc31d60",KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK); +#define KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_DVD_ENCRYPTED_PACK) + +#define KS_AM_UseNewCSSKey 0x1 + +#define STATIC_KSPROPSETID_TSRateChange \ + 0xa503c5c0,0x1d1d,0x11d1,0xad,0x80,0x44,0x45,0x53,0x54,0x0,0x0 +DEFINE_GUIDSTRUCT("A503C5C0-1D1D-11D1-AD80-444553540000",KSPROPSETID_TSRateChange); +#define KSPROPSETID_TSRateChange DEFINE_GUIDNAMED(KSPROPSETID_TSRateChange) + +typedef enum { + KS_AM_RATE_SimpleRateChange = 1, + KS_AM_RATE_ExactRateChange = 2, + KS_AM_RATE_MaxFullDataRate = 3, + KS_AM_RATE_Step = 4 +} KS_AM_PROPERTY_TS_RATE_CHANGE; + +typedef struct { + REFERENCE_TIME StartTime; + LONG Rate; +} KS_AM_SimpleRateChange,*PKS_AM_SimpleRateChange; + +typedef struct { + REFERENCE_TIME OutputZeroTime; + LONG Rate; +} KS_AM_ExactRateChange,*PKS_AM_ExactRateChange; + +typedef LONG KS_AM_MaxFullDataRate; +typedef DWORD KS_AM_Step; + +#define STATIC_KSCATEGORY_ENCODER \ + 0x19689bf6,0xc384,0x48fd,0xad,0x51,0x90,0xe5,0x8c,0x79,0xf7,0xb +DEFINE_GUIDSTRUCT("19689BF6-C384-48fd-AD51-90E58C79F70B",KSCATEGORY_ENCODER); +#define KSCATEGORY_ENCODER DEFINE_GUIDNAMED(KSCATEGORY_ENCODER) + +#define STATIC_KSCATEGORY_MULTIPLEXER \ + 0x7a5de1d3,0x1a1,0x452c,0xb4,0x81,0x4f,0xa2,0xb9,0x62,0x71,0xe8 +DEFINE_GUIDSTRUCT("7A5DE1D3-01A1-452c-B481-4FA2B96271E8",KSCATEGORY_MULTIPLEXER); +#define KSCATEGORY_MULTIPLEXER DEFINE_GUIDNAMED(KSCATEGORY_MULTIPLEXER) + +#ifndef __ENCODER_API_GUIDS__ +#define __ENCODER_API_GUIDS__ + +#define STATIC_ENCAPIPARAM_BITRATE \ + 0x49cc4c43,0xca83,0x4ad4,0xa9,0xaf,0xf3,0x69,0x6a,0xf6,0x66,0xdf +DEFINE_GUIDSTRUCT("49CC4C43-CA83-4ad4-A9AF-F3696AF666DF",ENCAPIPARAM_BITRATE); +#define ENCAPIPARAM_BITRATE DEFINE_GUIDNAMED(ENCAPIPARAM_BITRATE) + +#define STATIC_ENCAPIPARAM_PEAK_BITRATE \ + 0x703f16a9,0x3d48,0x44a1,0xb0,0x77,0x1,0x8d,0xff,0x91,0x5d,0x19 +DEFINE_GUIDSTRUCT("703F16A9-3D48-44a1-B077-018DFF915D19",ENCAPIPARAM_PEAK_BITRATE); +#define ENCAPIPARAM_PEAK_BITRATE DEFINE_GUIDNAMED(ENCAPIPARAM_PEAK_BITRATE) + +#define STATIC_ENCAPIPARAM_BITRATE_MODE \ + 0xee5fb25c,0xc713,0x40d1,0x9d,0x58,0xc0,0xd7,0x24,0x1e,0x25,0xf +DEFINE_GUIDSTRUCT("EE5FB25C-C713-40d1-9D58-C0D7241E250F",ENCAPIPARAM_BITRATE_MODE); +#define ENCAPIPARAM_BITRATE_MODE DEFINE_GUIDNAMED(ENCAPIPARAM_BITRATE_MODE) + +#define STATIC_CODECAPI_CHANGELISTS \ + 0x62b12acf,0xf6b0,0x47d9,0x94,0x56,0x96,0xf2,0x2c,0x4e,0x0b,0x9d +DEFINE_GUIDSTRUCT("62B12ACF-F6B0-47D9-9456-96F22C4E0B9D",CODECAPI_CHANGELISTS); +#define CODECAPI_CHANGELISTS DEFINE_GUIDNAMED(CODECAPI_CHANGELISTS) + +#define STATIC_CODECAPI_VIDEO_ENCODER \ + 0x7112e8e1,0x3d03,0x47ef,0x8e,0x60,0x03,0xf1,0xcf,0x53,0x73,0x01 +DEFINE_GUIDSTRUCT("7112E8E1-3D03-47EF-8E60-03F1CF537301",CODECAPI_VIDEO_ENCODER); +#define CODECAPI_VIDEO_ENCODER DEFINE_GUIDNAMED(CODECAPI_VIDEO_ENCODER) + +#define STATIC_CODECAPI_AUDIO_ENCODER \ + 0xb9d19a3e,0xf897,0x429c,0xbc,0x46,0x81,0x38,0xb7,0x27,0x2b,0x2d +DEFINE_GUIDSTRUCT("B9D19A3E-F897-429C-BC46-8138B7272B2D",CODECAPI_AUDIO_ENCODER); +#define CODECAPI_AUDIO_ENCODER DEFINE_GUIDNAMED(CODECAPI_AUDIO_ENCODER) + +#define STATIC_CODECAPI_SETALLDEFAULTS \ + 0x6c5e6a7c,0xacf8,0x4f55,0xa9,0x99,0x1a,0x62,0x81,0x09,0x05,0x1b +DEFINE_GUIDSTRUCT("6C5E6A7C-ACF8-4F55-A999-1A628109051B",CODECAPI_SETALLDEFAULTS); +#define CODECAPI_SETALLDEFAULTS DEFINE_GUIDNAMED(CODECAPI_SETALLDEFAULTS) + +#define STATIC_CODECAPI_ALLSETTINGS \ + 0x6a577e92,0x83e1,0x4113,0xad,0xc2,0x4f,0xce,0xc3,0x2f,0x83,0xa1 +DEFINE_GUIDSTRUCT("6A577E92-83E1-4113-ADC2-4FCEC32F83A1",CODECAPI_ALLSETTINGS); +#define CODECAPI_ALLSETTINGS DEFINE_GUIDNAMED(CODECAPI_ALLSETTINGS) + +#define STATIC_CODECAPI_SUPPORTSEVENTS \ + 0x0581af97,0x7693,0x4dbd,0x9d,0xca,0x3f,0x9e,0xbd,0x65,0x85,0xa1 +DEFINE_GUIDSTRUCT("0581AF97-7693-4DBD-9DCA-3F9EBD6585A1",CODECAPI_SUPPORTSEVENTS); +#define CODECAPI_SUPPORTSEVENTS DEFINE_GUIDNAMED(CODECAPI_SUPPORTSEVENTS) + +#define STATIC_CODECAPI_CURRENTCHANGELIST \ + 0x1cb14e83,0x7d72,0x4657,0x83,0xfd,0x47,0xa2,0xc5,0xb9,0xd1,0x3d +DEFINE_GUIDSTRUCT("1CB14E83-7D72-4657-83FD-47A2C5B9D13D",CODECAPI_CURRENTCHANGELIST); +#define CODECAPI_CURRENTCHANGELIST DEFINE_GUIDNAMED(CODECAPI_CURRENTCHANGELIST) +#endif /* __ENCODER_API_GUIDS__ */ + +#ifndef __ENCODER_API_DEFINES__ +#define __ENCODER_API_DEFINES__ +typedef enum { + ConstantBitRate = 0, + VariableBitRateAverage, + VariableBitRatePeak +} VIDEOENCODER_BITRATE_MODE; +#endif /* __ENCODER_API_DEFINES__ */ + +#define STATIC_KSPROPSETID_Jack\ + 0x4509f757, 0x2d46, 0x4637, 0x8e, 0x62, 0xce, 0x7d, 0xb9, 0x44, 0xf5, 0x7b +DEFINE_GUIDSTRUCT("4509F757-2D46-4637-8E62-CE7DB944F57B", KSPROPSETID_Jack); +#define KSPROPSETID_Jack DEFINE_GUIDNAMED(KSPROPSETID_Jack) + +typedef enum { + KSPROPERTY_JACK_DESCRIPTION = 1, + KSPROPERTY_JACK_DESCRIPTION2, + KSPROPERTY_JACK_SINK_INFO +} KSPROPERTY_JACK; + +typedef enum +{ + eConnTypeUnknown, + eConnType3Point5mm, + eConnTypeQuarter, + eConnTypeAtapiInternal, + eConnTypeRCA, + eConnTypeOptical, + eConnTypeOtherDigital, + eConnTypeOtherAnalog, + eConnTypeMultichannelAnalogDIN, + eConnTypeXlrProfessional, + eConnTypeRJ11Modem, + eConnTypeCombination +} EPcxConnectionType; + +typedef enum +{ + eGeoLocRear = 0x1, + eGeoLocFront, + eGeoLocLeft, + eGeoLocRight, + eGeoLocTop, + eGeoLocBottom, + eGeoLocRearPanel, + eGeoLocRiser, + eGeoLocInsideMobileLid, + eGeoLocDrivebay, + eGeoLocHDMI, + eGeoLocOutsideMobileLid, + eGeoLocATAPI, + eGeoLocReserved5, + eGeoLocReserved6, + EPcxGeoLocation_enum_count +} EPcxGeoLocation; + +typedef enum +{ + eGenLocPrimaryBox = 0, + eGenLocInternal, + eGenLocSeparate, + eGenLocOther, + EPcxGenLocation_enum_count +} EPcxGenLocation; + +typedef enum +{ + ePortConnJack = 0, + ePortConnIntegratedDevice, + ePortConnBothIntegratedAndJack, + ePortConnUnknown +} EPxcPortConnection; + +typedef struct +{ + DWORD ChannelMapping; + COLORREF Color; + EPcxConnectionType ConnectionType; + EPcxGeoLocation GeoLocation; + EPcxGenLocation GenLocation; + EPxcPortConnection PortConnection; + BOOL IsConnected; +} KSJACK_DESCRIPTION, *PKSJACK_DESCRIPTION; + +typedef enum +{ + KSJACK_SINK_CONNECTIONTYPE_HDMI = 0, + KSJACK_SINK_CONNECTIONTYPE_DISPLAYPORT, +} KSJACK_SINK_CONNECTIONTYPE; + +#define MAX_SINK_DESCRIPTION_NAME_LENGTH 32 +typedef struct _tagKSJACK_SINK_INFORMATION +{ + KSJACK_SINK_CONNECTIONTYPE ConnType; + WORD ManufacturerId; + WORD ProductId; + WORD AudioLatency; + BOOL HDCPCapable; + BOOL AICapable; + UCHAR SinkDescriptionLength; + WCHAR SinkDescription[MAX_SINK_DESCRIPTION_NAME_LENGTH]; + LUID PortId; +} KSJACK_SINK_INFORMATION, *PKSJACK_SINK_INFORMATION; + +#define JACKDESC2_PRESENCE_DETECT_CAPABILITY 0x00000001 +#define JACKDESC2_DYNAMIC_FORMAT_CHANGE_CAPABILITY 0x00000002 + +typedef struct _tagKSJACK_DESCRIPTION2 +{ + DWORD DeviceStateInfo; + DWORD JackCapabilities; +} KSJACK_DESCRIPTION2, *PKSJACK_DESCRIPTION2; + +#endif /* _KSMEDIA_ */ + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksproxy.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksproxy.h new file mode 100644 index 0000000000..e6e049dabd --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksproxy.h @@ -0,0 +1,639 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef __KSPROXY__ +#define __KSPROXY__ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef KSDDKAPI +#ifdef _KSDDK_ +#define KSDDKAPI +#else +#define KSDDKAPI DECLSPEC_IMPORT +#endif + +#define STATIC_IID_IKsObject \ + 0x423c13a2L,0x2070,0x11d0,0x9e,0xf7,0x00,0xaa,0x00,0xa2,0x16,0xa1 + +#define STATIC_IID_IKsPinEx \ + 0x7bb38260L,0xd19c,0x11d2,0xb3,0x8a,0x00,0xa0,0xc9,0x5e,0xc2,0x2e + +#define STATIC_IID_IKsPin \ + 0xb61178d1L,0xa2d9,0x11cf,0x9e,0x53,0x00,0xaa,0x00,0xa2,0x16,0xa1 + +#define STATIC_IID_IKsPinPipe \ + 0xe539cd90L,0xa8b4,0x11d1,0x81,0x89,0x00,0xa0,0xc9,0x06,0x28,0x02 + +#define STATIC_IID_IKsDataTypeHandler \ + 0x5ffbaa02L,0x49a3,0x11d0,0x9f,0x36,0x00,0xaa,0x00,0xa2,0x16,0xa1 + +#define STATIC_IID_IKsDataTypeCompletion \ + 0x827D1A0EL,0x0F73,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#define STATIC_IID_IKsInterfaceHandler \ + 0xD3ABC7E0L,0x9A61,0x11D0,0xA4,0x0D,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#define STATIC_IID_IKsClockPropertySet \ + 0x5C5CBD84L,0xE755,0x11D0,0xAC,0x18,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#define STATIC_IID_IKsAllocator \ + 0x8da64899L,0xc0d9,0x11d0,0x84,0x13,0x00,0x00,0xf8,0x22,0xfe,0x8a + +#define STATIC_IID_IKsAllocatorEx \ + 0x091bb63aL,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 + +#ifndef STATIC_IID_IKsPropertySet +#define STATIC_IID_IKsPropertySet \ + 0x31EFAC30L,0x515C,0x11d0,0xA9,0xAA,0x00,0xAA,0x00,0x61,0xBE,0x93 +#endif + +#define STATIC_IID_IKsTopology \ + 0x28F54683L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#ifndef STATIC_IID_IKsControl +#define STATIC_IID_IKsControl \ + 0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 +#endif + +#define STATIC_IID_IKsAggregateControl \ + 0x7F40EAC0L,0x3947,0x11D2,0x87,0x4E,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#define STATIC_CLSID_Proxy \ + 0x17CCA71BL,0xECD7,0x11D0,0xB9,0x08,0x00,0xA0,0xC9,0x22,0x31,0x96 + +#ifdef _KS_ + +DEFINE_GUIDEX(IID_IKsObject); + +DEFINE_GUIDEX(IID_IKsPin); + +DEFINE_GUIDEX(IID_IKsPinEx); + +DEFINE_GUIDEX(IID_IKsPinPipe); + +DEFINE_GUIDEX(IID_IKsDataTypeHandler); + +DEFINE_GUIDEX(IID_IKsDataTypeCompletion); + +DEFINE_GUIDEX(IID_IKsInterfaceHandler); + +DEFINE_GUIDEX(IID_IKsClockPropertySet); + +DEFINE_GUIDEX(IID_IKsAllocator); + +DEFINE_GUIDEX(IID_IKsAllocatorEx); + +#define IID_IKsQualityForwarder KSCATEGORY_QUALITY +#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY + +typedef enum { + KsAllocatorMode_User, + KsAllocatorMode_Kernel +} KSALLOCATORMODE; + +typedef enum { + FramingProp_Uninitialized, + FramingProp_None, + FramingProp_Old, + FramingProp_Ex +} FRAMING_PROP; + +typedef FRAMING_PROP *PFRAMING_PROP; + +typedef enum { + Framing_Cache_Update, + Framing_Cache_ReadLast, + Framing_Cache_ReadOrig, + Framing_Cache_Write +} FRAMING_CACHE_OPS; + +typedef struct { + LONGLONG MinTotalNominator; + LONGLONG MaxTotalNominator; + LONGLONG TotalDenominator; +} OPTIMAL_WEIGHT_TOTALS; + +typedef struct IPin IPin; +typedef struct IKsPin IKsPin; +typedef struct IKsAllocator IKsAllocator; +typedef struct IKsAllocatorEx IKsAllocatorEx; + +#define AllocatorStrategy_DontCare 0 +#define AllocatorStrategy_MinimizeNumberOfFrames 0x00000001 +#define AllocatorStrategy_MinimizeFrameSize 0x00000002 +#define AllocatorStrategy_MinimizeNumberOfAllocators 0x00000004 +#define AllocatorStrategy_MaximizeSpeed 0x00000008 + +#define PipeFactor_None 0 +#define PipeFactor_UserModeUpstream 0x00000001 +#define PipeFactor_UserModeDownstream 0x00000002 +#define PipeFactor_MemoryTypes 0x00000004 +#define PipeFactor_Flags 0x00000008 +#define PipeFactor_PhysicalRanges 0x00000010 +#define PipeFactor_OptimalRanges 0x00000020 +#define PipeFactor_FixedCompression 0x00000040 +#define PipeFactor_UnknownCompression 0x00000080 + +#define PipeFactor_Buffers 0x00000100 +#define PipeFactor_Align 0x00000200 +#define PipeFactor_PhysicalEnd 0x00000400 +#define PipeFactor_LogicalEnd 0x00000800 + +typedef enum { + PipeState_DontCare, + PipeState_RangeNotFixed, + PipeState_RangeFixed, + PipeState_CompressionUnknown, + PipeState_Finalized +} PIPE_STATE; + +typedef struct _PIPE_DIMENSIONS { + KS_COMPRESSION AllocatorPin; + KS_COMPRESSION MaxExpansionPin; + KS_COMPRESSION EndPin; +} PIPE_DIMENSIONS,*PPIPE_DIMENSIONS; + +typedef enum { + Pipe_Allocator_None, + Pipe_Allocator_FirstPin, + Pipe_Allocator_LastPin, + Pipe_Allocator_MiddlePin +} PIPE_ALLOCATOR_PLACE; + +typedef PIPE_ALLOCATOR_PLACE *PPIPE_ALLOCATOR_PLACE; + +typedef enum { + KS_MemoryTypeDontCare = 0, + KS_MemoryTypeKernelPaged, + KS_MemoryTypeKernelNonPaged, + KS_MemoryTypeDeviceHostMapped, + KS_MemoryTypeDeviceSpecific, + KS_MemoryTypeUser, + KS_MemoryTypeAnyHost +} KS_LogicalMemoryType; + +typedef KS_LogicalMemoryType *PKS_LogicalMemoryType; + +typedef struct _PIPE_TERMINATION { + ULONG Flags; + ULONG OutsideFactors; + ULONG Weigth; + KS_FRAMING_RANGE PhysicalRange; + KS_FRAMING_RANGE_WEIGHTED OptimalRange; + KS_COMPRESSION Compression; +} PIPE_TERMINATION; + +typedef struct _ALLOCATOR_PROPERTIES_EX +{ + long cBuffers; + long cbBuffer; + long cbAlign; + long cbPrefix; + + GUID MemoryType; + GUID BusType; + PIPE_STATE State; + PIPE_TERMINATION Input; + PIPE_TERMINATION Output; + ULONG Strategy; + ULONG Flags; + ULONG Weight; + KS_LogicalMemoryType LogicalMemoryType; + PIPE_ALLOCATOR_PLACE AllocatorPlace; + PIPE_DIMENSIONS Dimensions; + KS_FRAMING_RANGE PhysicalRange; + IKsAllocatorEx *PrevSegment; + ULONG CountNextSegments; + IKsAllocatorEx **NextSegments; + ULONG InsideFactors; + ULONG NumberPins; +} ALLOCATOR_PROPERTIES_EX; + +typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX; + +#ifdef __STREAMS__ + +struct IKsClockPropertySet; +#undef INTERFACE +#define INTERFACE IKsClockPropertySet +DECLARE_INTERFACE_(IKsClockPropertySet,IUnknown) +{ + STDMETHOD(KsGetTime) (THIS_ + LONGLONG *Time + ) PURE; + STDMETHOD(KsSetTime) (THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetPhysicalTime) (THIS_ + LONGLONG *Time + ) PURE; + STDMETHOD(KsSetPhysicalTime) (THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetCorrelatedTime) (THIS_ + KSCORRELATED_TIME *CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedTime) (THIS_ + KSCORRELATED_TIME *CorrelatedTime + ) PURE; + STDMETHOD(KsGetCorrelatedPhysicalTime)(THIS_ + KSCORRELATED_TIME *CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedPhysicalTime)(THIS_ + KSCORRELATED_TIME *CorrelatedTime + ) PURE; + STDMETHOD(KsGetResolution) (THIS_ + KSRESOLUTION *Resolution + ) PURE; + STDMETHOD(KsGetState) (THIS_ + KSSTATE *State + ) PURE; +}; + +struct IKsAllocator; +#undef INTERFACE +#define INTERFACE IKsAllocator +DECLARE_INTERFACE_(IKsAllocator,IUnknown) +{ + STDMETHOD_(HANDLE,KsGetAllocatorHandle)(THIS) PURE; + STDMETHOD_(KSALLOCATORMODE,KsGetAllocatorMode)(THIS) PURE; + STDMETHOD(KsGetAllocatorStatus) (THIS_ + PKSSTREAMALLOCATOR_STATUS AllocatorStatus + ) PURE; + STDMETHOD_(VOID,KsSetAllocatorMode) (THIS_ + KSALLOCATORMODE Mode + ) PURE; +}; + +struct IKsAllocatorEx; +#undef INTERFACE +#define INTERFACE IKsAllocatorEx +DECLARE_INTERFACE_(IKsAllocatorEx,IKsAllocator) +{ + STDMETHOD_(PALLOCATOR_PROPERTIES_EX,KsGetProperties)(THIS) PURE; + STDMETHOD_(VOID,KsSetProperties) (THIS_ + PALLOCATOR_PROPERTIES_EX + ) PURE; + STDMETHOD_(VOID,KsSetAllocatorHandle) (THIS_ + HANDLE AllocatorHandle + ) PURE; + STDMETHOD_(HANDLE,KsCreateAllocatorAndGetHandle)(THIS_ + IKsPin *KsPin + ) PURE; +}; + +typedef enum { + KsPeekOperation_PeekOnly, + KsPeekOperation_AddRef +} KSPEEKOPERATION; + +typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT; +struct IKsPin; + +#undef INTERFACE +#define INTERFACE IKsPin +DECLARE_INTERFACE_(IKsPin,IUnknown) +{ + STDMETHOD(KsQueryMediums) (THIS_ + PKSMULTIPLE_ITEM *MediumList + ) PURE; + STDMETHOD(KsQueryInterfaces) (THIS_ + PKSMULTIPLE_ITEM *InterfaceList + ) PURE; + STDMETHOD(KsCreateSinkPinHandle) (THIS_ + KSPIN_INTERFACE& Interface, + KSPIN_MEDIUM& Medium + ) PURE; + STDMETHOD(KsGetCurrentCommunication) (THIS_ + KSPIN_COMMUNICATION *Communication, + KSPIN_INTERFACE *Interface, + KSPIN_MEDIUM *Medium + ) PURE; + STDMETHOD(KsPropagateAcquire) (THIS) PURE; + STDMETHOD(KsDeliver) (THIS_ + IMediaSample *Sample, + ULONG Flags + ) PURE; + STDMETHOD(KsMediaSamplesCompleted) (THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; + STDMETHOD_(IMemAllocator *,KsPeekAllocator)(THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsReceiveAllocator) (THIS_ + IMemAllocator *MemAllocator + ) PURE; + STDMETHOD(KsRenegotiateAllocator) (THIS) PURE; + STDMETHOD_(LONG,KsIncrementPendingIoCount)(THIS) PURE; + STDMETHOD_(LONG,KsDecrementPendingIoCount)(THIS) PURE; + STDMETHOD(KsQualityNotify) (THIS_ + ULONG Proportion, + REFERENCE_TIME TimeDelta + ) PURE; +}; + +struct IKsPinEx; +#undef INTERFACE +#define INTERFACE IKsPinEx +DECLARE_INTERFACE_(IKsPinEx,IKsPin) +{ + STDMETHOD_(VOID,KsNotifyError) (THIS_ + IMediaSample *Sample, + HRESULT hr + ) PURE; +}; + +struct IKsPinPipe; +#undef INTERFACE +#define INTERFACE IKsPinPipe +DECLARE_INTERFACE_(IKsPinPipe,IUnknown) +{ + STDMETHOD(KsGetPinFramingCache) (THIS_ + PKSALLOCATOR_FRAMING_EX *FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD(KsSetPinFramingCache) (THIS_ + PKSALLOCATOR_FRAMING_EX FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD_(IPin*,KsGetConnectedPin) (THIS) PURE; + STDMETHOD_(IKsAllocatorEx*,KsGetPipe) (THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsSetPipe) (THIS_ + IKsAllocatorEx *KsAllocator + ) PURE; + STDMETHOD_(ULONG,KsGetPipeAllocatorFlag)(THIS) PURE; + STDMETHOD(KsSetPipeAllocatorFlag) (THIS_ + ULONG Flag + ) PURE; + STDMETHOD_(GUID,KsGetPinBusCache) (THIS) PURE; + STDMETHOD(KsSetPinBusCache) (THIS_ + GUID Bus + ) PURE; + STDMETHOD_(PWCHAR,KsGetPinName) (THIS) PURE; + STDMETHOD_(PWCHAR,KsGetFilterName) (THIS) PURE; +}; + +struct IKsPinFactory; +#undef INTERFACE +#define INTERFACE IKsPinFactory +DECLARE_INTERFACE_(IKsPinFactory,IUnknown) +{ + STDMETHOD(KsPinFactory) (THIS_ + ULONG *PinFactory + ) PURE; +}; + +typedef enum { + KsIoOperation_Write, + KsIoOperation_Read +} KSIOOPERATION; + +struct IKsDataTypeHandler; +#undef INTERFACE +#define INTERFACE IKsDataTypeHandler +DECLARE_INTERFACE_(IKsDataTypeHandler,IUnknown) +{ + STDMETHOD(KsCompleteIoOperation) (THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation, + WINBOOL Cancelled + ) PURE; + STDMETHOD(KsIsMediaTypeInRanges) (THIS_ + PVOID DataRanges + ) PURE; + STDMETHOD(KsPrepareIoOperation) (THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation + ) PURE; + STDMETHOD(KsQueryExtendedSize) (THIS_ + ULONG *ExtendedSize + ) PURE; + STDMETHOD(KsSetMediaType) (THIS_ + const AM_MEDIA_TYPE *AmMediaType + ) PURE; +}; + +struct IKsDataTypeCompletion; +#undef INTERFACE +#define INTERFACE IKsDataTypeCompletion +DECLARE_INTERFACE_(IKsDataTypeCompletion,IUnknown) +{ + STDMETHOD(KsCompleteMediaType) (THIS_ + HANDLE FilterHandle, + ULONG PinFactoryId, + AM_MEDIA_TYPE *AmMediaType + ) PURE; +}; + +struct IKsInterfaceHandler; +#undef INTERFACE +#define INTERFACE IKsInterfaceHandler +DECLARE_INTERFACE_(IKsInterfaceHandler,IUnknown) +{ + STDMETHOD(KsSetPin) (THIS_ + IKsPin *KsPin + ) PURE; + STDMETHOD(KsProcessMediaSamples) (THIS_ + IKsDataTypeHandler *KsDataTypeHandler, + IMediaSample **SampleList, + PLONG SampleCount, + KSIOOPERATION IoOperation, + PKSSTREAM_SEGMENT *StreamSegment + ) PURE; + STDMETHOD(KsCompleteIo) (THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; +}; + +typedef struct _KSSTREAM_SEGMENT { + IKsInterfaceHandler *KsInterfaceHandler; + IKsDataTypeHandler *KsDataTypeHandler; + KSIOOPERATION IoOperation; + HANDLE CompletionEvent; +} KSSTREAM_SEGMENT; + +struct IKsObject; +#undef INTERFACE +#define INTERFACE IKsObject +DECLARE_INTERFACE_(IKsObject,IUnknown) +{ + STDMETHOD_(HANDLE,KsGetObjectHandle) (THIS) PURE; +}; + +struct IKsQualityForwarder; +#undef INTERFACE +#define INTERFACE IKsQualityForwarder +DECLARE_INTERFACE_(IKsQualityForwarder,IKsObject) +{ + STDMETHOD_(VOID,KsFlushClient) (THIS_ + IKsPin *Pin + ) PURE; +}; + +struct IKsNotifyEvent; +#undef INTERFACE +#define INTERFACE IKsNotifyEvent +DECLARE_INTERFACE_(IKsNotifyEvent,IUnknown) +{ + STDMETHOD(KsNotifyEvent) (THIS_ + ULONG Event, + ULONG_PTR lParam1, + ULONG_PTR lParam2 + ) PURE; +}; + +KSDDKAPI HRESULT WINAPI KsResolveRequiredAttributes(PKSDATARANGE DataRange,PKSMULTIPLE_ITEM Attributes); +KSDDKAPI HRESULT WINAPI KsOpenDefaultDevice(REFGUID Category,ACCESS_MASK Access,PHANDLE DeviceHandle); +KSDDKAPI HRESULT WINAPI KsSynchronousDeviceControl(HANDLE Handle,ULONG IoControl,PVOID InBuffer,ULONG InLength,PVOID OutBuffer,ULONG OutLength,PULONG BytesReturned); +KSDDKAPI HRESULT WINAPI KsGetMultiplePinFactoryItems(HANDLE FilterHandle,ULONG PinFactoryId,ULONG PropertyId,PVOID *Items); +KSDDKAPI HRESULT WINAPI KsGetMediaTypeCount(HANDLE FilterHandle,ULONG PinFactoryId,ULONG *MediaTypeCount); +KSDDKAPI HRESULT WINAPI KsGetMediaType(int Position,AM_MEDIA_TYPE *AmMediaType,HANDLE FilterHandle,ULONG PinFactoryId); +#endif /* __STREAMS__ */ + +#ifndef _IKsPropertySet_ +DEFINE_GUIDEX(IID_IKsPropertySet); +#endif + +#ifndef _IKsControl_ +DEFINE_GUIDEX(IID_IKsControl); +#endif + +DEFINE_GUIDEX(IID_IKsAggregateControl); +#ifndef _IKsTopology_ +DEFINE_GUIDEX(IID_IKsTopology); +#endif +DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196",CLSID_Proxy); +#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy) + +#else /* _KS_ */ + +#ifndef _IKsPropertySet_ +DEFINE_GUID(IID_IKsPropertySet,STATIC_IID_IKsPropertySet); +#endif + +DEFINE_GUID(CLSID_Proxy,STATIC_CLSID_Proxy); + +#endif /* _KS_ */ + +#ifndef _IKsPropertySet_ +#define _IKsPropertySet_ +#define KSPROPERTY_SUPPORT_GET 1 +#define KSPROPERTY_SUPPORT_SET 2 + +#ifdef DECLARE_INTERFACE_ +struct IKsPropertySet; +#undef INTERFACE +#define INTERFACE IKsPropertySet +DECLARE_INTERFACE_(IKsPropertySet,IUnknown) +{ + STDMETHOD(Set) (THIS_ + REFGUID PropSet, + ULONG Id, + LPVOID InstanceData, + ULONG InstanceLength, + LPVOID PropertyData, + ULONG DataLength + ) PURE; + STDMETHOD(Get) (THIS_ + REFGUID PropSet, + ULONG Id, + LPVOID InstanceData, + ULONG InstanceLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; + STDMETHOD(QuerySupported) (THIS_ + REFGUID PropSet, + ULONG Id, + ULONG *TypeSupport + ) PURE; +}; +#endif /* DECLARE_INTERFACE_ */ +#endif /* _IKsPropertySet_ */ + +#ifndef _IKsControl_ +#define _IKsControl_ +#ifdef DECLARE_INTERFACE_ +struct IKsControl; +#undef INTERFACE +#define INTERFACE IKsControl +DECLARE_INTERFACE_(IKsControl,IUnknown) +{ + STDMETHOD(KsProperty) (THIS_ + PKSPROPERTY Property, + ULONG PropertyLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; + STDMETHOD(KsMethod) (THIS_ + PKSMETHOD Method, + ULONG MethodLength, + LPVOID MethodData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; + STDMETHOD(KsEvent) (THIS_ + PKSEVENT Event, + ULONG EventLength, + LPVOID EventData, + ULONG DataLength, + ULONG *BytesReturned + ) PURE; +}; +#endif /* DECLARE_INTERFACE_ */ +#endif /* _IKsControl_ */ + +#ifdef DECLARE_INTERFACE_ +struct IKsAggregateControl; +#undef INTERFACE +#define INTERFACE IKsAggregateControl +DECLARE_INTERFACE_(IKsAggregateControl,IUnknown) +{ + STDMETHOD(KsAddAggregate) (THIS_ + REFGUID AggregateClass + ) PURE; + STDMETHOD(KsRemoveAggregate) (THIS_ + REFGUID AggregateClass + ) PURE; +}; +#endif /* DECLARE_INTERFACE_ */ + +#ifndef _IKsTopology_ +#define _IKsTopology_ +#ifdef DECLARE_INTERFACE_ +struct IKsTopology; +#undef INTERFACE +#define INTERFACE IKsTopology +DECLARE_INTERFACE_(IKsTopology,IUnknown) +{ + STDMETHOD(CreateNodeInstance) (THIS_ + ULONG NodeId, + ULONG Flags, + ACCESS_MASK DesiredAccess, + IUnknown *UnkOuter, + REFGUID InterfaceId, + LPVOID *Interface + ) PURE; +}; +#endif /* DECLARE_INTERFACE_ */ +#endif /* _IKsTopology_ */ + +#ifdef __cplusplus +} +#endif + +#endif /* __KSPROXY__ */ + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksuuids.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksuuids.h new file mode 100644 index 0000000000..7d0efff65c --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/ksuuids.h @@ -0,0 +1,159 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ + +OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PACK, + 0x36523B13,0x8EE5,0x11d1,0x8C,0xA3,0x00,0x60,0xB0,0x57,0x66,0x4A) + +OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PES, + 0xe06d8020,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIATYPE_MPEG2_SECTIONS, + 0x455f176c,0x4b06,0x47ce,0x9a,0xef,0x8c,0xae,0xf7,0x3d,0xf7,0xb5) + +OUR_GUID_ENTRY(MEDIASUBTYPE_ATSC_SI, + 0xb3c7397c,0xd303,0x414d,0xb3,0x3c,0x4e,0xd2,0xc9,0xd2,0x97,0x33) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVB_SI, + 0xe9dd31a3,0x221d,0x4adb,0x85,0x32,0x9a,0xf3,0x9,0xc1,0xa4,0x8) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2DATA, + 0xc892e55b,0x252d,0x42b5,0xa3,0x16,0xd9,0x97,0xe7,0xa5,0xd9,0x95) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_VIDEO, + 0xe06d8026,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_MPEG2_VIDEO, + 0xe06d80e3,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_VIDEOINFO2, + 0xf72a76A0L,0xeb0a,0x11d0,0xac,0xe4,0x0,0x0,0xc0,0xcc,0x16,0xba) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PROGRAM, + 0xe06d8022,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT, + 0xe06d8023,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE, + 0x138aa9a4,0x1ee2,0x4c5b,0x98,0x8e,0x19,0xab,0xfd,0xbc,0x8a,0x11) + +OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_AUDIO, + 0xe06d802b,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DOLBY_AC3, + 0xe06d802c,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_SUBPICTURE, + 0xe06d802d,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_LPCM_AUDIO, + 0xe06d8032,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DTS, + 0xe06d8033,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_SDDS, + 0xe06d8034,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIATYPE_DVD_ENCRYPTED_PACK, + 0xed0b916a,0x044d,0x11d1,0xaa,0x78,0x00,0xc0,0x04f,0xc3,0x1d,0x60) + +OUR_GUID_ENTRY(MEDIATYPE_DVD_NAVIGATION, + 0xe06d802e,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PCI, + 0xe06d802f,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_DSI, + 0xe06d8030,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER, + 0xe06d8031,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_MPEG2Video, + 0xe06d80e3,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_DolbyAC3, + 0xe06d80e4,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_MPEG2Audio, + 0xe06d80e5,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(FORMAT_DVD_LPCMAudio, + 0xe06d80e6,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x05f,0x6c,0xbb,0xea) + +OUR_GUID_ENTRY(AM_KSPROPSETID_AC3, + 0xBFABE720,0x6E1F,0x11D0,0xBC,0xF2,0x44,0x45,0x53,0x54,0x00,0x00) + +OUR_GUID_ENTRY(AM_KSPROPSETID_DvdSubPic, + 0xac390460,0x43af,0x11d0,0xbd,0x6a,0x00,0x35,0x05,0xc1,0x03,0xa9) + +OUR_GUID_ENTRY(AM_KSPROPSETID_CopyProt, + 0x0E8A0A40,0x6AEF,0x11D0,0x9E,0xD0,0x00,0xA0,0x24,0xCA,0x19,0xB3) + +OUR_GUID_ENTRY(AM_KSPROPSETID_TSRateChange, + 0xa503c5c0,0x1d1d,0x11d1,0xad,0x80,0x44,0x45,0x53,0x54,0x0,0x0) + +OUR_GUID_ENTRY(AM_KSPROPSETID_DVD_RateChange, + 0x3577eb09,0x9582,0x477f,0xb2,0x9c,0xb0,0xc4,0x52,0xa4,0xff,0x9a) + +OUR_GUID_ENTRY(AM_KSPROPSETID_DvdKaraoke, + 0xae4720ae,0xaa71,0x42d8,0xb8,0x2a,0xff,0xfd,0xf5,0x8b,0x76,0xfd) + +OUR_GUID_ENTRY(AM_KSPROPSETID_FrameStep, + 0xc830acbd,0xab07,0x492f,0x88,0x52,0x45,0xb6,0x98,0x7c,0x29,0x79) + +OUR_GUID_ENTRY(AM_KSCATEGORY_CAPTURE, + 0x65E8773DL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(AM_KSCATEGORY_RENDER, + 0x65E8773EL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(AM_KSCATEGORY_DATACOMPRESSOR, + 0x1E84C900L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00) + +OUR_GUID_ENTRY(AM_KSCATEGORY_AUDIO, + 0x6994AD04L,0x93EF,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(AM_KSCATEGORY_VIDEO, + 0x6994AD05L,0x93EF,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(AM_KSCATEGORY_TVTUNER, + 0xa799a800L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4) + +OUR_GUID_ENTRY(AM_KSCATEGORY_CROSSBAR, + 0xa799a801L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4) + +OUR_GUID_ENTRY(AM_KSCATEGORY_TVAUDIO, + 0xa799a802L,0xa46d,0x11d0,0xa1,0x8c,0x00,0xa0,0x24,0x01,0xdc,0xd4) + +OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC, + 0x07dad660L,0x22f1,0x11d1,0xa9,0xf4,0x00,0xc0,0x4f,0xbb,0xde,0x8f) + +OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC_MI, + 0x9c24a977,0x951,0x451a,0x80,0x6,0xe,0x49,0xbd,0x28,0xcd,0x5f) + +OUR_GUID_ENTRY(AM_KSCATEGORY_SPLITTER, + 0x0A4252A0L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00) + +OUR_GUID_ENTRY(IID_IKsInterfaceHandler, + 0xD3ABC7E0L,0x9A61,0x11D0,0xA4,0x0D,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(IID_IKsDataTypeHandler, + 0x5FFBAA02L,0x49A3,0x11D0,0x9F,0x36,0x00,0xAA,0x00,0xA2,0x16,0xA1) + +OUR_GUID_ENTRY(IID_IKsPin, + 0xb61178d1L,0xa2d9,0x11cf,0x9e,0x53,0x00,0xaa,0x00,0xa2,0x16,0xa1) + +OUR_GUID_ENTRY(IID_IKsControl, + 0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(IID_IKsPinFactory, + 0xCD5EBE6BL,0x8B6E,0x11D1,0x8A,0xE0,0x00,0xA0,0xC9,0x22,0x31,0x96) + +OUR_GUID_ENTRY(AM_INTERFACESETID_Standard, + 0x1A8766A0L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00) + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/mmdeviceapi.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/mmdeviceapi.h new file mode 100644 index 0000000000..a75e4758ed --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/mmdeviceapi.h @@ -0,0 +1,929 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for mmdeviceapi.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __mmdeviceapi_h__ +#define __mmdeviceapi_h__ + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IMMNotificationClient_FWD_DEFINED__ +#define __IMMNotificationClient_FWD_DEFINED__ +typedef interface IMMNotificationClient IMMNotificationClient; +#endif /* __IMMNotificationClient_FWD_DEFINED__ */ + + +#ifndef __IMMDevice_FWD_DEFINED__ +#define __IMMDevice_FWD_DEFINED__ +typedef interface IMMDevice IMMDevice; +#endif /* __IMMDevice_FWD_DEFINED__ */ + + +#ifndef __IMMDeviceCollection_FWD_DEFINED__ +#define __IMMDeviceCollection_FWD_DEFINED__ +typedef interface IMMDeviceCollection IMMDeviceCollection; +#endif /* __IMMDeviceCollection_FWD_DEFINED__ */ + + +#ifndef __IMMEndpoint_FWD_DEFINED__ +#define __IMMEndpoint_FWD_DEFINED__ +typedef interface IMMEndpoint IMMEndpoint; +#endif /* __IMMEndpoint_FWD_DEFINED__ */ + + +#ifndef __IMMDeviceEnumerator_FWD_DEFINED__ +#define __IMMDeviceEnumerator_FWD_DEFINED__ +typedef interface IMMDeviceEnumerator IMMDeviceEnumerator; +#endif /* __IMMDeviceEnumerator_FWD_DEFINED__ */ + + +#ifndef __IMMDeviceActivator_FWD_DEFINED__ +#define __IMMDeviceActivator_FWD_DEFINED__ +typedef interface IMMDeviceActivator IMMDeviceActivator; +#endif /* __IMMDeviceActivator_FWD_DEFINED__ */ + + +#ifndef __MMDeviceEnumerator_FWD_DEFINED__ +#define __MMDeviceEnumerator_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class MMDeviceEnumerator MMDeviceEnumerator; +#else +typedef struct MMDeviceEnumerator MMDeviceEnumerator; +#endif /* __cplusplus */ + +#endif /* __MMDeviceEnumerator_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "unknwn.h" +#include "propsys.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_mmdeviceapi_0000_0000 */ +/* [local] */ + +#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND) +#define E_UNSUPPORTED_TYPE HRESULT_FROM_WIN32(ERROR_UNSUPPORTED_TYPE) +#define DEVICE_STATE_ACTIVE 0x00000001 +#define DEVICE_STATE_DISABLED 0x00000002 +#define DEVICE_STATE_NOTPRESENT 0x00000004 +#define DEVICE_STATE_UNPLUGGED 0x00000008 +#define DEVICE_STATEMASK_ALL 0x0000000f +#ifdef DEFINE_PROPERTYKEY +#undef DEFINE_PROPERTYKEY +#endif +#ifdef INITGUID +#define DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const PROPERTYKEY name = { { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }, pid } +#else +#define DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const PROPERTYKEY name +#endif // INITGUID +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 0); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_ControlPanelPageProvider, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 1); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_Association, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 2); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_PhysicalSpeakers, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 3); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 4); +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_Disable_SysFx, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 5); +#define ENDPOINT_SYSFX_ENABLED 0x00000000 // System Effects are enabled. +#define ENDPOINT_SYSFX_DISABLED 0x00000001 // System Effects are disabled. +DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FullRangeSpeakers, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, 6); +DEFINE_PROPERTYKEY(PKEY_AudioEngine_DeviceFormat, 0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c, 0); +typedef struct tagDIRECTX_AUDIO_ACTIVATION_PARAMS + { + DWORD cbDirectXAudioActivationParams; + GUID guidAudioSession; + DWORD dwAudioStreamFlags; + } DIRECTX_AUDIO_ACTIVATION_PARAMS; + +typedef struct tagDIRECTX_AUDIO_ACTIVATION_PARAMS *PDIRECTX_AUDIO_ACTIVATION_PARAMS; + +typedef /* [public][public][public][public][public] */ +enum __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0001 + { eRender = 0, + eCapture = ( eRender + 1 ) , + eAll = ( eCapture + 1 ) , + EDataFlow_enum_count = ( eAll + 1 ) + } EDataFlow; + +typedef /* [public][public][public] */ +enum __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0002 + { eConsole = 0, + eMultimedia = ( eConsole + 1 ) , + eCommunications = ( eMultimedia + 1 ) , + ERole_enum_count = ( eCommunications + 1 ) + } ERole; + +typedef /* [public] */ +enum __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0003 + { RemoteNetworkDevice = 0, + Speakers = ( RemoteNetworkDevice + 1 ) , + LineLevel = ( Speakers + 1 ) , + Headphones = ( LineLevel + 1 ) , + Microphone = ( Headphones + 1 ) , + Headset = ( Microphone + 1 ) , + Handset = ( Headset + 1 ) , + UnknownDigitalPassthrough = ( Handset + 1 ) , + SPDIF = ( UnknownDigitalPassthrough + 1 ) , + HDMI = ( SPDIF + 1 ) , + UnknownFormFactor = ( HDMI + 1 ) + } EndpointFormFactor; + + + +extern RPC_IF_HANDLE __MIDL_itf_mmdeviceapi_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_mmdeviceapi_0000_0000_v0_0_s_ifspec; + +#ifndef __IMMNotificationClient_INTERFACE_DEFINED__ +#define __IMMNotificationClient_INTERFACE_DEFINED__ + +/* interface IMMNotificationClient */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMNotificationClient; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7991EEC9-7E89-4D85-8390-6C703CEC60C0") + IMMNotificationClient : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( + /* [in] */ + __in LPCWSTR pwstrDeviceId, + /* [in] */ + __in DWORD dwNewState) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnDeviceAdded( + /* [in] */ + __in LPCWSTR pwstrDeviceId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnDeviceRemoved( + /* [in] */ + __in LPCWSTR pwstrDeviceId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged( + /* [in] */ + __in EDataFlow flow, + /* [in] */ + __in ERole role, + /* [in] */ + __in LPCWSTR pwstrDefaultDeviceId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( + /* [in] */ + __in LPCWSTR pwstrDeviceId, + /* [in] */ + __in const PROPERTYKEY key) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMNotificationClientVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMNotificationClient * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMNotificationClient * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMNotificationClient * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnDeviceStateChanged )( + IMMNotificationClient * This, + /* [in] */ + __in LPCWSTR pwstrDeviceId, + /* [in] */ + __in DWORD dwNewState); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnDeviceAdded )( + IMMNotificationClient * This, + /* [in] */ + __in LPCWSTR pwstrDeviceId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnDeviceRemoved )( + IMMNotificationClient * This, + /* [in] */ + __in LPCWSTR pwstrDeviceId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnDefaultDeviceChanged )( + IMMNotificationClient * This, + /* [in] */ + __in EDataFlow flow, + /* [in] */ + __in ERole role, + /* [in] */ + __in LPCWSTR pwstrDefaultDeviceId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OnPropertyValueChanged )( + IMMNotificationClient * This, + /* [in] */ + __in LPCWSTR pwstrDeviceId, + /* [in] */ + __in const PROPERTYKEY key); + + END_INTERFACE + } IMMNotificationClientVtbl; + + interface IMMNotificationClient + { + CONST_VTBL struct IMMNotificationClientVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMNotificationClient_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMNotificationClient_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMNotificationClient_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMNotificationClient_OnDeviceStateChanged(This,pwstrDeviceId,dwNewState) \ + ( (This)->lpVtbl -> OnDeviceStateChanged(This,pwstrDeviceId,dwNewState) ) + +#define IMMNotificationClient_OnDeviceAdded(This,pwstrDeviceId) \ + ( (This)->lpVtbl -> OnDeviceAdded(This,pwstrDeviceId) ) + +#define IMMNotificationClient_OnDeviceRemoved(This,pwstrDeviceId) \ + ( (This)->lpVtbl -> OnDeviceRemoved(This,pwstrDeviceId) ) + +#define IMMNotificationClient_OnDefaultDeviceChanged(This,flow,role,pwstrDefaultDeviceId) \ + ( (This)->lpVtbl -> OnDefaultDeviceChanged(This,flow,role,pwstrDefaultDeviceId) ) + +#define IMMNotificationClient_OnPropertyValueChanged(This,pwstrDeviceId,key) \ + ( (This)->lpVtbl -> OnPropertyValueChanged(This,pwstrDeviceId,key) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMNotificationClient_INTERFACE_DEFINED__ */ + + +#ifndef __IMMDevice_INTERFACE_DEFINED__ +#define __IMMDevice_INTERFACE_DEFINED__ + +/* interface IMMDevice */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMDevice; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D666063F-1587-4E43-81F1-B948E807363F") + IMMDevice : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Activate( + /* [in] */ + __in REFIID iid, + /* [in] */ + __in DWORD dwClsCtx, + /* [unique][in] */ + __in_opt PROPVARIANT *pActivationParams, + /* [iid_is][out] */ + __out void **ppInterface) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OpenPropertyStore( + /* [in] */ + __in DWORD stgmAccess, + /* [out] */ + __out IPropertyStore **ppProperties) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetId( + /* [out] */ + __deref_out LPWSTR *ppstrId) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetState( + /* [out] */ + __out DWORD *pdwState) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMDeviceVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMDevice * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMDevice * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMDevice * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Activate )( + IMMDevice * This, + /* [in] */ + __in REFIID iid, + /* [in] */ + __in DWORD dwClsCtx, + /* [unique][in] */ + __in_opt PROPVARIANT *pActivationParams, + /* [iid_is][out] */ + __out void **ppInterface); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *OpenPropertyStore )( + IMMDevice * This, + /* [in] */ + __in DWORD stgmAccess, + /* [out] */ + __out IPropertyStore **ppProperties); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetId )( + IMMDevice * This, + /* [out] */ + __deref_out LPWSTR *ppstrId); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetState )( + IMMDevice * This, + /* [out] */ + __out DWORD *pdwState); + + END_INTERFACE + } IMMDeviceVtbl; + + interface IMMDevice + { + CONST_VTBL struct IMMDeviceVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMDevice_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMDevice_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMDevice_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMDevice_Activate(This,iid,dwClsCtx,pActivationParams,ppInterface) \ + ( (This)->lpVtbl -> Activate(This,iid,dwClsCtx,pActivationParams,ppInterface) ) + +#define IMMDevice_OpenPropertyStore(This,stgmAccess,ppProperties) \ + ( (This)->lpVtbl -> OpenPropertyStore(This,stgmAccess,ppProperties) ) + +#define IMMDevice_GetId(This,ppstrId) \ + ( (This)->lpVtbl -> GetId(This,ppstrId) ) + +#define IMMDevice_GetState(This,pdwState) \ + ( (This)->lpVtbl -> GetState(This,pdwState) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMDevice_INTERFACE_DEFINED__ */ + + +#ifndef __IMMDeviceCollection_INTERFACE_DEFINED__ +#define __IMMDeviceCollection_INTERFACE_DEFINED__ + +/* interface IMMDeviceCollection */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMDeviceCollection; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E") + IMMDeviceCollection : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ + __out UINT *pcDevices) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Item( + /* [in] */ + __in UINT nDevice, + /* [out] */ + __out IMMDevice **ppDevice) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMDeviceCollectionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMDeviceCollection * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMDeviceCollection * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMDeviceCollection * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetCount )( + IMMDeviceCollection * This, + /* [out] */ + __out UINT *pcDevices); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Item )( + IMMDeviceCollection * This, + /* [in] */ + __in UINT nDevice, + /* [out] */ + __out IMMDevice **ppDevice); + + END_INTERFACE + } IMMDeviceCollectionVtbl; + + interface IMMDeviceCollection + { + CONST_VTBL struct IMMDeviceCollectionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMDeviceCollection_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMDeviceCollection_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMDeviceCollection_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMDeviceCollection_GetCount(This,pcDevices) \ + ( (This)->lpVtbl -> GetCount(This,pcDevices) ) + +#define IMMDeviceCollection_Item(This,nDevice,ppDevice) \ + ( (This)->lpVtbl -> Item(This,nDevice,ppDevice) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMDeviceCollection_INTERFACE_DEFINED__ */ + + +#ifndef __IMMEndpoint_INTERFACE_DEFINED__ +#define __IMMEndpoint_INTERFACE_DEFINED__ + +/* interface IMMEndpoint */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMEndpoint; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("1BE09788-6894-4089-8586-9A2A6C265AC5") + IMMEndpoint : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDataFlow( + /* [out] */ + __out EDataFlow *pDataFlow) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMEndpointVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMEndpoint * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMEndpoint * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMEndpoint * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDataFlow )( + IMMEndpoint * This, + /* [out] */ + __out EDataFlow *pDataFlow); + + END_INTERFACE + } IMMEndpointVtbl; + + interface IMMEndpoint + { + CONST_VTBL struct IMMEndpointVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMEndpoint_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMEndpoint_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMEndpoint_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMEndpoint_GetDataFlow(This,pDataFlow) \ + ( (This)->lpVtbl -> GetDataFlow(This,pDataFlow) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMEndpoint_INTERFACE_DEFINED__ */ + + +#ifndef __IMMDeviceEnumerator_INTERFACE_DEFINED__ +#define __IMMDeviceEnumerator_INTERFACE_DEFINED__ + +/* interface IMMDeviceEnumerator */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMDeviceEnumerator; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A95664D2-9614-4F35-A746-DE8DB63617E6") + IMMDeviceEnumerator : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnumAudioEndpoints( + /* [in] */ + __in EDataFlow dataFlow, + /* [in] */ + __in DWORD dwStateMask, + /* [out] */ + __out IMMDeviceCollection **ppDevices) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDefaultAudioEndpoint( + /* [in] */ + __in EDataFlow dataFlow, + /* [in] */ + __in ERole role, + /* [out] */ + __out IMMDevice **ppEndpoint) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetDevice( + /* */ + __in LPCWSTR pwstrId, + /* [out] */ + __out IMMDevice **ppDevice) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RegisterEndpointNotificationCallback( + /* [in] */ + __in IMMNotificationClient *pClient) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE UnregisterEndpointNotificationCallback( + /* [in] */ + __in IMMNotificationClient *pClient) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMDeviceEnumeratorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMDeviceEnumerator * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMDeviceEnumerator * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMDeviceEnumerator * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnumAudioEndpoints )( + IMMDeviceEnumerator * This, + /* [in] */ + __in EDataFlow dataFlow, + /* [in] */ + __in DWORD dwStateMask, + /* [out] */ + __out IMMDeviceCollection **ppDevices); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDefaultAudioEndpoint )( + IMMDeviceEnumerator * This, + /* [in] */ + __in EDataFlow dataFlow, + /* [in] */ + __in ERole role, + /* [out] */ + __out IMMDevice **ppEndpoint); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetDevice )( + IMMDeviceEnumerator * This, + /* */ + __in LPCWSTR pwstrId, + /* [out] */ + __out IMMDevice **ppDevice); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *RegisterEndpointNotificationCallback )( + IMMDeviceEnumerator * This, + /* [in] */ + __in IMMNotificationClient *pClient); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *UnregisterEndpointNotificationCallback )( + IMMDeviceEnumerator * This, + /* [in] */ + __in IMMNotificationClient *pClient); + + END_INTERFACE + } IMMDeviceEnumeratorVtbl; + + interface IMMDeviceEnumerator + { + CONST_VTBL struct IMMDeviceEnumeratorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMDeviceEnumerator_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMDeviceEnumerator_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMDeviceEnumerator_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMDeviceEnumerator_EnumAudioEndpoints(This,dataFlow,dwStateMask,ppDevices) \ + ( (This)->lpVtbl -> EnumAudioEndpoints(This,dataFlow,dwStateMask,ppDevices) ) + +#define IMMDeviceEnumerator_GetDefaultAudioEndpoint(This,dataFlow,role,ppEndpoint) \ + ( (This)->lpVtbl -> GetDefaultAudioEndpoint(This,dataFlow,role,ppEndpoint) ) + +#define IMMDeviceEnumerator_GetDevice(This,pwstrId,ppDevice) \ + ( (This)->lpVtbl -> GetDevice(This,pwstrId,ppDevice) ) + +#define IMMDeviceEnumerator_RegisterEndpointNotificationCallback(This,pClient) \ + ( (This)->lpVtbl -> RegisterEndpointNotificationCallback(This,pClient) ) + +#define IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(This,pClient) \ + ( (This)->lpVtbl -> UnregisterEndpointNotificationCallback(This,pClient) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMDeviceEnumerator_INTERFACE_DEFINED__ */ + + +#ifndef __IMMDeviceActivator_INTERFACE_DEFINED__ +#define __IMMDeviceActivator_INTERFACE_DEFINED__ + +/* interface IMMDeviceActivator */ +/* [unique][helpstring][nonextensible][uuid][local][object] */ + + +EXTERN_C const IID IID_IMMDeviceActivator; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3B0D0EA4-D0A9-4B0E-935B-09516746FAC0") + IMMDeviceActivator : public IUnknown + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Activate( + /* [in] */ + __in REFIID iid, + /* [in] */ + __in IMMDevice *pDevice, + /* [in] */ + __in_opt PROPVARIANT *pActivationParams, + /* [iid_is][out] */ + __out void **ppInterface) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMMDeviceActivatorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMMDeviceActivator * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMMDeviceActivator * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMMDeviceActivator * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Activate )( + IMMDeviceActivator * This, + /* [in] */ + __in REFIID iid, + /* [in] */ + __in IMMDevice *pDevice, + /* [in] */ + __in_opt PROPVARIANT *pActivationParams, + /* [iid_is][out] */ + __out void **ppInterface); + + END_INTERFACE + } IMMDeviceActivatorVtbl; + + interface IMMDeviceActivator + { + CONST_VTBL struct IMMDeviceActivatorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMMDeviceActivator_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMMDeviceActivator_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMMDeviceActivator_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMMDeviceActivator_Activate(This,iid,pDevice,pActivationParams,ppInterface) \ + ( (This)->lpVtbl -> Activate(This,iid,pDevice,pActivationParams,ppInterface) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMMDeviceActivator_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_mmdeviceapi_0000_0006 */ +/* [local] */ + +typedef /* [public] */ struct __MIDL___MIDL_itf_mmdeviceapi_0000_0006_0001 + { + LPARAM AddPageParam; + IMMDevice *pEndpoint; + IMMDevice *pPnpInterface; + IMMDevice *pPnpDevnode; + } AudioExtensionParams; + + + +extern RPC_IF_HANDLE __MIDL_itf_mmdeviceapi_0000_0006_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_mmdeviceapi_0000_0006_v0_0_s_ifspec; + + +#ifndef __MMDeviceAPILib_LIBRARY_DEFINED__ +#define __MMDeviceAPILib_LIBRARY_DEFINED__ + +/* library MMDeviceAPILib */ +/* [helpstring][version][uuid] */ + + +EXTERN_C const IID LIBID_MMDeviceAPILib; + +EXTERN_C const CLSID CLSID_MMDeviceEnumerator; + +#ifdef __cplusplus + +class DECLSPEC_UUID("BCDE0395-E52F-467C-8E3D-C4579291692E") +MMDeviceEnumerator; +#endif +#endif /* __MMDeviceAPILib_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/propidl.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propidl.h new file mode 100644 index 0000000000..96298650b1 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propidl.h @@ -0,0 +1,1275 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for propidl.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __propidl_h__ +#define __propidl_h__ + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define interface struct +#include "sal.h" +#include "rpcsal.h" + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IPropertyStorage_FWD_DEFINED__ +#define __IPropertyStorage_FWD_DEFINED__ +typedef interface IPropertyStorage IPropertyStorage; +#endif /* __IPropertyStorage_FWD_DEFINED__ */ + + +#ifndef __IPropertySetStorage_FWD_DEFINED__ +#define __IPropertySetStorage_FWD_DEFINED__ +typedef interface IPropertySetStorage IPropertySetStorage; +#endif /* __IPropertySetStorage_FWD_DEFINED__ */ + + +#ifndef __IEnumSTATPROPSTG_FWD_DEFINED__ +#define __IEnumSTATPROPSTG_FWD_DEFINED__ +typedef interface IEnumSTATPROPSTG IEnumSTATPROPSTG; +#endif /* __IEnumSTATPROPSTG_FWD_DEFINED__ */ + + +#ifndef __IEnumSTATPROPSETSTG_FWD_DEFINED__ +#define __IEnumSTATPROPSETSTG_FWD_DEFINED__ +typedef interface IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG; +#endif /* __IEnumSTATPROPSETSTG_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "objidl.h" +#include "oaidl.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_propidl_0000_0000 */ +/* [local] */ + +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//-------------------------------------------------------------------------- +#if ( _MSC_VER >= 800 ) +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning(disable:4201) /* Nameless struct/union */ +#pragma warning(disable:4237) /* obsolete member named 'bool' */ +#endif +#if ( _MSC_VER >= 1020 ) +#pragma once +#endif + + + +typedef struct tagVersionedStream + { + GUID guidVersion; + IStream *pStream; + } VERSIONEDSTREAM; + +typedef struct tagVersionedStream *LPVERSIONEDSTREAM; + + +// Flags for IPropertySetStorage::Create +#define PROPSETFLAG_DEFAULT ( 0 ) + +#define PROPSETFLAG_NONSIMPLE ( 1 ) + +#define PROPSETFLAG_ANSI ( 2 ) + +// (This flag is only supported on StgCreatePropStg & StgOpenPropStg +#define PROPSETFLAG_UNBUFFERED ( 4 ) + +// (This flag causes a version-1 property set to be created +#define PROPSETFLAG_CASE_SENSITIVE ( 8 ) + + +// Flags for the reservied PID_BEHAVIOR property +#define PROPSET_BEHAVIOR_CASE_SENSITIVE ( 1 ) + +#ifdef MIDL_PASS +// This is the PROPVARIANT definition for marshaling. +typedef struct tag_inner_PROPVARIANT PROPVARIANT; + +#else +// This is the standard C layout of the PROPVARIANT. +typedef struct tagPROPVARIANT PROPVARIANT; +#endif +typedef struct tagCAC + { + ULONG cElems; + CHAR *pElems; + } CAC; +#ifdef WIN64 +typedef struct tagCAUB + { + ULONG cElems; + UCHAR *pElems; + } CAUB; + +typedef struct tagCAI + { + ULONG cElems; + SHORT *pElems; + } CAI; + +typedef struct tagCAUI + { + ULONG cElems; + USHORT *pElems; + } CAUI; + +typedef struct tagCAL + { + ULONG cElems; + LONG *pElems; + } CAL; + +typedef struct tagCAUL + { + ULONG cElems; + ULONG *pElems; + } CAUL; + +typedef struct tagCAFLT + { + ULONG cElems; + FLOAT *pElems; + } CAFLT; + +typedef struct tagCADBL + { + ULONG cElems; + DOUBLE *pElems; + } CADBL; + +typedef struct tagCACY + { + ULONG cElems; + CY *pElems; + } CACY; + +typedef struct tagCADATE + { + ULONG cElems; + DATE *pElems; + } CADATE; + +typedef struct tagCABSTR + { + ULONG cElems; + BSTR *pElems; + } CABSTR; + +typedef struct tagCABSTRBLOB + { + ULONG cElems; + BSTRBLOB *pElems; + } CABSTRBLOB; + +typedef struct tagCABOOL + { + ULONG cElems; + VARIANT_BOOL *pElems; + } CABOOL; + +typedef struct tagCASCODE + { + ULONG cElems; + SCODE *pElems; + } CASCODE; + +typedef struct tagCAPROPVARIANT + { + ULONG cElems; + PROPVARIANT *pElems; + } CAPROPVARIANT; + +typedef struct tagCAH + { + ULONG cElems; + LARGE_INTEGER *pElems; + } CAH; + +typedef struct tagCAUH + { + ULONG cElems; + ULARGE_INTEGER *pElems; + } CAUH; + +typedef struct tagCALPSTR + { + ULONG cElems; + LPSTR *pElems; + } CALPSTR; + +typedef struct tagCALPWSTR + { + ULONG cElems; + LPWSTR *pElems; + } CALPWSTR; + +typedef struct tagCAFILETIME + { + ULONG cElems; + FILETIME *pElems; + } CAFILETIME; + +typedef struct tagCACLIPDATA + { + ULONG cElems; + CLIPDATA *pElems; + } CACLIPDATA; + +typedef struct tagCACLSID + { + ULONG cElems; + CLSID *pElems; + } CACLSID; +#endif +#ifdef MIDL_PASS +// This is the PROPVARIANT padding layout for marshaling. +typedef BYTE PROPVAR_PAD1; + +typedef BYTE PROPVAR_PAD2; + +typedef ULONG PROPVAR_PAD3; + +#else +// This is the standard C layout of the structure. +typedef WORD PROPVAR_PAD1; +typedef WORD PROPVAR_PAD2; +typedef WORD PROPVAR_PAD3; +#define tag_inner_PROPVARIANT +#endif +#ifdef WIN64 +#ifndef MIDL_PASS +struct tagPROPVARIANT { + union { +#endif +struct tag_inner_PROPVARIANT + { + VARTYPE vt; + PROPVAR_PAD1 wReserved1; + PROPVAR_PAD2 wReserved2; + PROPVAR_PAD3 wReserved3; + /* [switch_type] */ union + { + /* Empty union arm */ + CHAR cVal; + UCHAR bVal; + SHORT iVal; + USHORT uiVal; + LONG lVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + LARGE_INTEGER hVal; + ULARGE_INTEGER uhVal; + FLOAT fltVal; + DOUBLE dblVal; + VARIANT_BOOL boolVal; + //_VARIANT_BOOL bool; + SCODE scode; + CY cyVal; + DATE date; + FILETIME filetime; + CLSID *puuid; + CLIPDATA *pclipdata; + BSTR bstrVal; + BSTRBLOB bstrblobVal; + BLOB blob; + LPSTR pszVal; + LPWSTR pwszVal; + IUnknown *punkVal; + IDispatch *pdispVal; + IStream *pStream; + IStorage *pStorage; + LPVERSIONEDSTREAM pVersionedStream; + LPSAFEARRAY parray; + CAC cac; + CAUB caub; + CAI cai; + CAUI caui; + CAL cal; + CAUL caul; + CAH cah; + CAUH cauh; + CAFLT caflt; + CADBL cadbl; + CABOOL cabool; + CASCODE cascode; + CACY cacy; + CADATE cadate; + CAFILETIME cafiletime; + CACLSID cauuid; + CACLIPDATA caclipdata; + CABSTR cabstr; + CABSTRBLOB cabstrblob; + CALPSTR calpstr; + CALPWSTR calpwstr; + CAPROPVARIANT capropvar; + CHAR *pcVal; + UCHAR *pbVal; + SHORT *piVal; + USHORT *puiVal; + LONG *plVal; + ULONG *pulVal; + INT *pintVal; + UINT *puintVal; + FLOAT *pfltVal; + DOUBLE *pdblVal; + VARIANT_BOOL *pboolVal; + DECIMAL *pdecVal; + SCODE *pscode; + CY *pcyVal; + DATE *pdate; + BSTR *pbstrVal; + IUnknown **ppunkVal; + IDispatch **ppdispVal; + LPSAFEARRAY *pparray; + PROPVARIANT *pvarVal; + } ; + } ; +#ifndef MIDL_PASS + DECIMAL decVal; + }; +}; +#endif +#endif +#ifdef MIDL_PASS +// This is the LPPROPVARIANT definition for marshaling. +typedef struct tag_inner_PROPVARIANT *LPPROPVARIANT; + +typedef const PROPVARIANT *REFPROPVARIANT; + +#else + +// This is the standard C layout of the PROPVARIANT. +#ifdef WIN64 +typedef struct tagPROPVARIANT * LPPROPVARIANT; +#endif + +#ifndef _REFPROPVARIANT_DEFINED +#define _REFPROPVARIANT_DEFINED +#ifdef __cplusplus +#define REFPROPVARIANT const PROPVARIANT & +#else +#define REFPROPVARIANT const PROPVARIANT * __MIDL_CONST +#endif +#endif + +#endif // MIDL_PASS + +// Reserved global Property IDs +#define PID_DICTIONARY ( 0 ) + +#define PID_CODEPAGE ( 0x1 ) + +#define PID_FIRST_USABLE ( 0x2 ) + +#define PID_FIRST_NAME_DEFAULT ( 0xfff ) + +#define PID_LOCALE ( 0x80000000 ) + +#define PID_MODIFY_TIME ( 0x80000001 ) + +#define PID_SECURITY ( 0x80000002 ) + +#define PID_BEHAVIOR ( 0x80000003 ) + +#define PID_ILLEGAL ( 0xffffffff ) + +// Range which is read-only to downlevel implementations +#define PID_MIN_READONLY ( 0x80000000 ) + +#define PID_MAX_READONLY ( 0xbfffffff ) + +// Property IDs for the DiscardableInformation Property Set + +#define PIDDI_THUMBNAIL 0x00000002L // VT_BLOB + +// Property IDs for the SummaryInformation Property Set + +#define PIDSI_TITLE 0x00000002L // VT_LPSTR +#define PIDSI_SUBJECT 0x00000003L // VT_LPSTR +#define PIDSI_AUTHOR 0x00000004L // VT_LPSTR +#define PIDSI_KEYWORDS 0x00000005L // VT_LPSTR +#define PIDSI_COMMENTS 0x00000006L // VT_LPSTR +#define PIDSI_TEMPLATE 0x00000007L // VT_LPSTR +#define PIDSI_LASTAUTHOR 0x00000008L // VT_LPSTR +#define PIDSI_REVNUMBER 0x00000009L // VT_LPSTR +#define PIDSI_EDITTIME 0x0000000aL // VT_FILETIME (UTC) +#define PIDSI_LASTPRINTED 0x0000000bL // VT_FILETIME (UTC) +#define PIDSI_CREATE_DTM 0x0000000cL // VT_FILETIME (UTC) +#define PIDSI_LASTSAVE_DTM 0x0000000dL // VT_FILETIME (UTC) +#define PIDSI_PAGECOUNT 0x0000000eL // VT_I4 +#define PIDSI_WORDCOUNT 0x0000000fL // VT_I4 +#define PIDSI_CHARCOUNT 0x00000010L // VT_I4 +#define PIDSI_THUMBNAIL 0x00000011L // VT_CF +#define PIDSI_APPNAME 0x00000012L // VT_LPSTR +#define PIDSI_DOC_SECURITY 0x00000013L // VT_I4 + +// Property IDs for the DocSummaryInformation Property Set + +#define PIDDSI_CATEGORY 0x00000002 // VT_LPSTR +#define PIDDSI_PRESFORMAT 0x00000003 // VT_LPSTR +#define PIDDSI_BYTECOUNT 0x00000004 // VT_I4 +#define PIDDSI_LINECOUNT 0x00000005 // VT_I4 +#define PIDDSI_PARCOUNT 0x00000006 // VT_I4 +#define PIDDSI_SLIDECOUNT 0x00000007 // VT_I4 +#define PIDDSI_NOTECOUNT 0x00000008 // VT_I4 +#define PIDDSI_HIDDENCOUNT 0x00000009 // VT_I4 +#define PIDDSI_MMCLIPCOUNT 0x0000000A // VT_I4 +#define PIDDSI_SCALE 0x0000000B // VT_BOOL +#define PIDDSI_HEADINGPAIR 0x0000000C // VT_VARIANT | VT_VECTOR +#define PIDDSI_DOCPARTS 0x0000000D // VT_LPSTR | VT_VECTOR +#define PIDDSI_MANAGER 0x0000000E // VT_LPSTR +#define PIDDSI_COMPANY 0x0000000F // VT_LPSTR +#define PIDDSI_LINKSDIRTY 0x00000010 // VT_BOOL + + +// FMTID_MediaFileSummaryInfo - Property IDs + +#define PIDMSI_EDITOR 0x00000002L // VT_LPWSTR +#define PIDMSI_SUPPLIER 0x00000003L // VT_LPWSTR +#define PIDMSI_SOURCE 0x00000004L // VT_LPWSTR +#define PIDMSI_SEQUENCE_NO 0x00000005L // VT_LPWSTR +#define PIDMSI_PROJECT 0x00000006L // VT_LPWSTR +#define PIDMSI_STATUS 0x00000007L // VT_UI4 +#define PIDMSI_OWNER 0x00000008L // VT_LPWSTR +#define PIDMSI_RATING 0x00000009L // VT_LPWSTR +#define PIDMSI_PRODUCTION 0x0000000AL // VT_FILETIME (UTC) +#define PIDMSI_COPYRIGHT 0x0000000BL // VT_LPWSTR + +// PIDMSI_STATUS value definitions + +enum PIDMSI_STATUS_VALUE + { PIDMSI_STATUS_NORMAL = 0, + PIDMSI_STATUS_NEW = ( PIDMSI_STATUS_NORMAL + 1 ) , + PIDMSI_STATUS_PRELIM = ( PIDMSI_STATUS_NEW + 1 ) , + PIDMSI_STATUS_DRAFT = ( PIDMSI_STATUS_PRELIM + 1 ) , + PIDMSI_STATUS_INPROGRESS = ( PIDMSI_STATUS_DRAFT + 1 ) , + PIDMSI_STATUS_EDIT = ( PIDMSI_STATUS_INPROGRESS + 1 ) , + PIDMSI_STATUS_REVIEW = ( PIDMSI_STATUS_EDIT + 1 ) , + PIDMSI_STATUS_PROOF = ( PIDMSI_STATUS_REVIEW + 1 ) , + PIDMSI_STATUS_FINAL = ( PIDMSI_STATUS_PROOF + 1 ) , + PIDMSI_STATUS_OTHER = 0x7fff + } ; +#define PRSPEC_INVALID ( 0xffffffff ) + +#define PRSPEC_LPWSTR ( 0 ) + +#define PRSPEC_PROPID ( 1 ) + +#ifdef WIN64 +typedef struct tagPROPSPEC + { + ULONG ulKind; + /* [switch_type] */ union + { + PROPID propid; + LPOLESTR lpwstr; + /* Empty union arm */ + } ; + } PROPSPEC; + +typedef struct tagSTATPROPSTG + { + LPOLESTR lpwstrName; + PROPID propid; + VARTYPE vt; + } STATPROPSTG; +#endif + +// Macros for parsing the OS Version of the Property Set Header +#define PROPSETHDR_OSVER_KIND(dwOSVer) HIWORD( (dwOSVer) ) +#define PROPSETHDR_OSVER_MAJOR(dwOSVer) LOBYTE(LOWORD( (dwOSVer) )) +#define PROPSETHDR_OSVER_MINOR(dwOSVer) HIBYTE(LOWORD( (dwOSVer) )) +#define PROPSETHDR_OSVERSION_UNKNOWN 0xFFFFFFFF +#ifdef WIN64 +typedef struct tagSTATPROPSETSTG + { + FMTID fmtid; + CLSID clsid; + DWORD grfFlags; + FILETIME mtime; + FILETIME ctime; + FILETIME atime; + DWORD dwOSVersion; + } STATPROPSETSTG; +#endif + + +extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_0000_v0_0_s_ifspec; + +#ifndef __IPropertyStorage_INTERFACE_DEFINED__ +#define __IPropertyStorage_INTERFACE_DEFINED__ + +/* interface IPropertyStorage */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IPropertyStorage; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("00000138-0000-0000-C000-000000000046") + IPropertyStorage : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE ReadMultiple( + /* [in] */ ULONG cpspec, + /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ], + /* [size_is][out] */ __RPC__out_ecount_full(cpspec) PROPVARIANT rgpropvar[ ]) = 0; + + virtual HRESULT STDMETHODCALLTYPE WriteMultiple( + /* [in] */ ULONG cpspec, + /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ], + /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPVARIANT rgpropvar[ ], + /* [in] */ PROPID propidNameFirst) = 0; + + virtual HRESULT STDMETHODCALLTYPE DeleteMultiple( + /* [in] */ ULONG cpspec, + /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ]) = 0; + + virtual HRESULT STDMETHODCALLTYPE ReadPropertyNames( + /* [in] */ ULONG cpropid, + /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ], + /* [size_is][out] */ __RPC__out_ecount_full(cpropid) LPOLESTR rglpwstrName[ ]) = 0; + + virtual HRESULT STDMETHODCALLTYPE WritePropertyNames( + /* [in] */ ULONG cpropid, + /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ], + /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const LPOLESTR rglpwstrName[ ]) = 0; + + virtual HRESULT STDMETHODCALLTYPE DeletePropertyNames( + /* [in] */ ULONG cpropid, + /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ]) = 0; + + virtual HRESULT STDMETHODCALLTYPE Commit( + /* [in] */ DWORD grfCommitFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE Revert( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Enum( + /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSTG **ppenum) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetTimes( + /* [in] */ __RPC__in const FILETIME *pctime, + /* [in] */ __RPC__in const FILETIME *patime, + /* [in] */ __RPC__in const FILETIME *pmtime) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetClass( + /* [in] */ __RPC__in REFCLSID clsid) = 0; + + virtual HRESULT STDMETHODCALLTYPE Stat( + /* [out] */ __RPC__out STATPROPSETSTG *pstatpsstg) = 0; + + }; + +#else /* C style interface */ + +// typedef struct IPropertyStorageVtbl +// { +// BEGIN_INTERFACE +// +// HRESULT ( STDMETHODCALLTYPE *QueryInterface )( +// IPropertyStorage * This, +// /* [in] */ __RPC__in REFIID riid, +// /* [iid_is][out] */ +// __RPC__deref_out void **ppvObject); +// +// ULONG ( STDMETHODCALLTYPE *AddRef )( +// IPropertyStorage * This); +// +// ULONG ( STDMETHODCALLTYPE *Release )( +// IPropertyStorage * This); +// +// HRESULT ( STDMETHODCALLTYPE *ReadMultiple )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpspec, +// /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ], +// /* [size_is][out] */ __RPC__out_ecount_full(cpspec) PROPVARIANT rgpropvar[ ]); +// +// HRESULT ( STDMETHODCALLTYPE *WriteMultiple )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpspec, +// /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ], +// /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPVARIANT rgpropvar[ ], +// /* [in] */ PROPID propidNameFirst); +// +// HRESULT ( STDMETHODCALLTYPE *DeleteMultiple )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpspec, +// /* [size_is][in] */ __RPC__in_ecount_full(cpspec) const PROPSPEC rgpspec[ ]); +// +// HRESULT ( STDMETHODCALLTYPE *ReadPropertyNames )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpropid, +// /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ], +// /* [size_is][out] */ __RPC__out_ecount_full(cpropid) LPOLESTR rglpwstrName[ ]); +// +// HRESULT ( STDMETHODCALLTYPE *WritePropertyNames )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpropid, +// /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ], +// /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const LPOLESTR rglpwstrName[ ]); +// +// HRESULT ( STDMETHODCALLTYPE *DeletePropertyNames )( +// IPropertyStorage * This, +// /* [in] */ ULONG cpropid, +// /* [size_is][in] */ __RPC__in_ecount_full(cpropid) const PROPID rgpropid[ ]); +// +// HRESULT ( STDMETHODCALLTYPE *Commit )( +// IPropertyStorage * This, +// /* [in] */ DWORD grfCommitFlags); +// +// HRESULT ( STDMETHODCALLTYPE *Revert )( +// IPropertyStorage * This); +// +// HRESULT ( STDMETHODCALLTYPE *Enum )( +// IPropertyStorage * This, +// /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSTG **ppenum); +// +// HRESULT ( STDMETHODCALLTYPE *SetTimes )( +// IPropertyStorage * This, +// /* [in] */ __RPC__in const FILETIME *pctime, +// /* [in] */ __RPC__in const FILETIME *patime, +// /* [in] */ __RPC__in const FILETIME *pmtime); +// +// HRESULT ( STDMETHODCALLTYPE *SetClass )( +// IPropertyStorage * This, +// /* [in] */ __RPC__in REFCLSID clsid); +// +// HRESULT ( STDMETHODCALLTYPE *Stat )( +// IPropertyStorage * This, +// /* [out] */ __RPC__out STATPROPSETSTG *pstatpsstg); +// +// END_INTERFACE +// } IPropertyStorageVtbl; +// +// interface IPropertyStorage +// { +// CONST_VTBL struct IPropertyStorageVtbl *lpVtbl; +// }; + + + +#ifdef COBJMACROS + + +#define IPropertyStorage_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyStorage_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyStorage_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyStorage_ReadMultiple(This,cpspec,rgpspec,rgpropvar) \ + ( (This)->lpVtbl -> ReadMultiple(This,cpspec,rgpspec,rgpropvar) ) + +#define IPropertyStorage_WriteMultiple(This,cpspec,rgpspec,rgpropvar,propidNameFirst) \ + ( (This)->lpVtbl -> WriteMultiple(This,cpspec,rgpspec,rgpropvar,propidNameFirst) ) + +#define IPropertyStorage_DeleteMultiple(This,cpspec,rgpspec) \ + ( (This)->lpVtbl -> DeleteMultiple(This,cpspec,rgpspec) ) + +#define IPropertyStorage_ReadPropertyNames(This,cpropid,rgpropid,rglpwstrName) \ + ( (This)->lpVtbl -> ReadPropertyNames(This,cpropid,rgpropid,rglpwstrName) ) + +#define IPropertyStorage_WritePropertyNames(This,cpropid,rgpropid,rglpwstrName) \ + ( (This)->lpVtbl -> WritePropertyNames(This,cpropid,rgpropid,rglpwstrName) ) + +#define IPropertyStorage_DeletePropertyNames(This,cpropid,rgpropid) \ + ( (This)->lpVtbl -> DeletePropertyNames(This,cpropid,rgpropid) ) + +#define IPropertyStorage_Commit(This,grfCommitFlags) \ + ( (This)->lpVtbl -> Commit(This,grfCommitFlags) ) + +#define IPropertyStorage_Revert(This) \ + ( (This)->lpVtbl -> Revert(This) ) + +#define IPropertyStorage_Enum(This,ppenum) \ + ( (This)->lpVtbl -> Enum(This,ppenum) ) + +#define IPropertyStorage_SetTimes(This,pctime,patime,pmtime) \ + ( (This)->lpVtbl -> SetTimes(This,pctime,patime,pmtime) ) + +#define IPropertyStorage_SetClass(This,clsid) \ + ( (This)->lpVtbl -> SetClass(This,clsid) ) + +#define IPropertyStorage_Stat(This,pstatpsstg) \ + ( (This)->lpVtbl -> Stat(This,pstatpsstg) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyStorage_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertySetStorage_INTERFACE_DEFINED__ +#define __IPropertySetStorage_INTERFACE_DEFINED__ + +/* interface IPropertySetStorage */ +/* [unique][uuid][object] */ + +typedef /* [unique] */ __RPC_unique_pointer IPropertySetStorage *LPPROPERTYSETSTORAGE; + + +EXTERN_C const IID IID_IPropertySetStorage; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0000013A-0000-0000-C000-000000000046") + IPropertySetStorage : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Create( + /* [in] */ __RPC__in REFFMTID rfmtid, + /* [unique][in] */ __RPC__in_opt const CLSID *pclsid, + /* [in] */ DWORD grfFlags, + /* [in] */ DWORD grfMode, + /* [out] */ __RPC__deref_out_opt IPropertyStorage **ppprstg) = 0; + + virtual HRESULT STDMETHODCALLTYPE Open( + /* [in] */ __RPC__in REFFMTID rfmtid, + /* [in] */ DWORD grfMode, + /* [out] */ __RPC__deref_out_opt IPropertyStorage **ppprstg) = 0; + + virtual HRESULT STDMETHODCALLTYPE Delete( + /* [in] */ __RPC__in REFFMTID rfmtid) = 0; + + virtual HRESULT STDMETHODCALLTYPE Enum( + /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSETSTG **ppenum) = 0; + + }; + +#else /* C style interface */ + +// typedef struct IPropertySetStorageVtbl +// { +// BEGIN_INTERFACE +// +// HRESULT ( STDMETHODCALLTYPE *QueryInterface )( +// IPropertySetStorage * This, +// /* [in] */ __RPC__in REFIID riid, +// /* [iid_is][out] */ +// __RPC__deref_out void **ppvObject); +// +// ULONG ( STDMETHODCALLTYPE *AddRef )( +// IPropertySetStorage * This); +// +// ULONG ( STDMETHODCALLTYPE *Release )( +// IPropertySetStorage * This); +// +// HRESULT ( STDMETHODCALLTYPE *Create )( +// IPropertySetStorage * This, +// /* [in] */ __RPC__in REFFMTID rfmtid, +// /* [unique][in] */ __RPC__in_opt const CLSID *pclsid, +// /* [in] */ DWORD grfFlags, +// /* [in] */ DWORD grfMode, +// /* [out] */ __RPC__deref_out_opt IPropertyStorage **ppprstg); +// +// HRESULT ( STDMETHODCALLTYPE *Open )( +// IPropertySetStorage * This, +// /* [in] */ __RPC__in REFFMTID rfmtid, +// /* [in] */ DWORD grfMode, +// /* [out] */ __RPC__deref_out_opt IPropertyStorage **ppprstg); +// +// HRESULT ( STDMETHODCALLTYPE *Delete )( +// IPropertySetStorage * This, +// /* [in] */ __RPC__in REFFMTID rfmtid); +// +// HRESULT ( STDMETHODCALLTYPE *Enum )( +// IPropertySetStorage * This, +// /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSETSTG **ppenum); +// +// END_INTERFACE +// } IPropertySetStorageVtbl; +// +// interface IPropertySetStorage +// { +// CONST_VTBL struct IPropertySetStorageVtbl *lpVtbl; +// }; + + + +#ifdef COBJMACROS + + +#define IPropertySetStorage_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertySetStorage_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertySetStorage_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertySetStorage_Create(This,rfmtid,pclsid,grfFlags,grfMode,ppprstg) \ + ( (This)->lpVtbl -> Create(This,rfmtid,pclsid,grfFlags,grfMode,ppprstg) ) + +#define IPropertySetStorage_Open(This,rfmtid,grfMode,ppprstg) \ + ( (This)->lpVtbl -> Open(This,rfmtid,grfMode,ppprstg) ) + +#define IPropertySetStorage_Delete(This,rfmtid) \ + ( (This)->lpVtbl -> Delete(This,rfmtid) ) + +#define IPropertySetStorage_Enum(This,ppenum) \ + ( (This)->lpVtbl -> Enum(This,ppenum) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertySetStorage_INTERFACE_DEFINED__ */ + + +#ifndef __IEnumSTATPROPSTG_INTERFACE_DEFINED__ +#define __IEnumSTATPROPSTG_INTERFACE_DEFINED__ + +/* interface IEnumSTATPROPSTG */ +/* [unique][uuid][object] */ + +//typedef /* [unique] */ __RPC_unique_pointer IEnumSTATPROPSTG *LPENUMSTATPROPSTG; + + +EXTERN_C const IID IID_IEnumSTATPROPSTG; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("00000139-0000-0000-C000-000000000046") + IEnumSTATPROPSTG : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Next( + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ STATPROPSTG *rgelt, + /* [out] */ ULONG *pceltFetched) = 0; + + virtual HRESULT STDMETHODCALLTYPE Skip( + /* [in] */ ULONG celt) = 0; + + virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Clone( + /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSTG **ppenum) = 0; + + }; + +#else /* C style interface */ + +// typedef struct IEnumSTATPROPSTGVtbl +// { +// BEGIN_INTERFACE +// +// HRESULT ( STDMETHODCALLTYPE *QueryInterface )( +// IEnumSTATPROPSTG * This, +// /* [in] */ __RPC__in REFIID riid, +// /* [iid_is][out] */ +// __RPC__deref_out void **ppvObject); +// +// ULONG ( STDMETHODCALLTYPE *AddRef )( +// IEnumSTATPROPSTG * This); +// +// ULONG ( STDMETHODCALLTYPE *Release )( +// IEnumSTATPROPSTG * This); +// +// /* [local] */ HRESULT ( STDMETHODCALLTYPE *Next )( +// IEnumSTATPROPSTG * This, +// /* [in] */ ULONG celt, +// /* [length_is][size_is][out] */ STATPROPSTG *rgelt, +// /* [out] */ ULONG *pceltFetched); +// +// HRESULT ( STDMETHODCALLTYPE *Skip )( +// IEnumSTATPROPSTG * This, +// /* [in] */ ULONG celt); +// +// HRESULT ( STDMETHODCALLTYPE *Reset )( +// IEnumSTATPROPSTG * This); +// +// HRESULT ( STDMETHODCALLTYPE *Clone )( +// IEnumSTATPROPSTG * This, +// /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSTG **ppenum); +// +// END_INTERFACE +// } IEnumSTATPROPSTGVtbl; +// +// interface IEnumSTATPROPSTG +// { +// CONST_VTBL struct IEnumSTATPROPSTGVtbl *lpVtbl; +// }; + + + +#ifdef COBJMACROS + + +#define IEnumSTATPROPSTG_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IEnumSTATPROPSTG_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IEnumSTATPROPSTG_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IEnumSTATPROPSTG_Next(This,celt,rgelt,pceltFetched) \ + ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) + +#define IEnumSTATPROPSTG_Skip(This,celt) \ + ( (This)->lpVtbl -> Skip(This,celt) ) + +#define IEnumSTATPROPSTG_Reset(This) \ + ( (This)->lpVtbl -> Reset(This) ) + +#define IEnumSTATPROPSTG_Clone(This,ppenum) \ + ( (This)->lpVtbl -> Clone(This,ppenum) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSTG_RemoteNext_Proxy( + IEnumSTATPROPSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ __RPC__out_ecount_part(celt, *pceltFetched) STATPROPSTG *rgelt, + /* [out] */ __RPC__out ULONG *pceltFetched); + + +void __RPC_STUB IEnumSTATPROPSTG_RemoteNext_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IEnumSTATPROPSTG_INTERFACE_DEFINED__ */ + + +#ifndef __IEnumSTATPROPSETSTG_INTERFACE_DEFINED__ +#define __IEnumSTATPROPSETSTG_INTERFACE_DEFINED__ + +/* interface IEnumSTATPROPSETSTG */ +/* [unique][uuid][object] */ + +typedef /* [unique] */ __RPC_unique_pointer IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG; + + +EXTERN_C const IID IID_IEnumSTATPROPSETSTG; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0000013B-0000-0000-C000-000000000046") + IEnumSTATPROPSETSTG : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Next( + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ STATPROPSETSTG *rgelt, + /* [out] */ ULONG *pceltFetched) = 0; + + virtual HRESULT STDMETHODCALLTYPE Skip( + /* [in] */ ULONG celt) = 0; + + virtual HRESULT STDMETHODCALLTYPE Reset( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE Clone( + /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSETSTG **ppenum) = 0; + + }; + +#else /* C style interface */ + +// typedef struct IEnumSTATPROPSETSTGVtbl +// { +// BEGIN_INTERFACE +// +// HRESULT ( STDMETHODCALLTYPE *QueryInterface )( +// IEnumSTATPROPSETSTG * This, +// /* [in] */ __RPC__in REFIID riid, +// /* [iid_is][out] */ +// __RPC__deref_out void **ppvObject); +// +// ULONG ( STDMETHODCALLTYPE *AddRef )( +// IEnumSTATPROPSETSTG * This); +// +// ULONG ( STDMETHODCALLTYPE *Release )( +// IEnumSTATPROPSETSTG * This); +// +// /* [local] */ HRESULT ( STDMETHODCALLTYPE *Next )( +// IEnumSTATPROPSETSTG * This, +// /* [in] */ ULONG celt, +// /* [length_is][size_is][out] */ STATPROPSETSTG *rgelt, +// /* [out] */ ULONG *pceltFetched); +// +// HRESULT ( STDMETHODCALLTYPE *Skip )( +// IEnumSTATPROPSETSTG * This, +// /* [in] */ ULONG celt); +// +// HRESULT ( STDMETHODCALLTYPE *Reset )( +// IEnumSTATPROPSETSTG * This); +// +// HRESULT ( STDMETHODCALLTYPE *Clone )( +// IEnumSTATPROPSETSTG * This, +// /* [out] */ __RPC__deref_out_opt IEnumSTATPROPSETSTG **ppenum); +// +// END_INTERFACE +// } IEnumSTATPROPSETSTGVtbl; +// +// interface IEnumSTATPROPSETSTG +// { +// CONST_VTBL struct IEnumSTATPROPSETSTGVtbl *lpVtbl; +// }; + + + +#ifdef COBJMACROS + + +#define IEnumSTATPROPSETSTG_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IEnumSTATPROPSETSTG_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IEnumSTATPROPSETSTG_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IEnumSTATPROPSETSTG_Next(This,celt,rgelt,pceltFetched) \ + ( (This)->lpVtbl -> Next(This,celt,rgelt,pceltFetched) ) + +#define IEnumSTATPROPSETSTG_Skip(This,celt) \ + ( (This)->lpVtbl -> Skip(This,celt) ) + +#define IEnumSTATPROPSETSTG_Reset(This) \ + ( (This)->lpVtbl -> Reset(This) ) + +#define IEnumSTATPROPSETSTG_Clone(This,ppenum) \ + ( (This)->lpVtbl -> Clone(This,ppenum) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSETSTG_RemoteNext_Proxy( + IEnumSTATPROPSETSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ __RPC__out_ecount_part(celt, *pceltFetched) STATPROPSETSTG *rgelt, + /* [out] */ __RPC__out ULONG *pceltFetched); + + +void __RPC_STUB IEnumSTATPROPSETSTG_RemoteNext_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IEnumSTATPROPSETSTG_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propidl_0000_0004 */ +/* [local] */ + +typedef /* [unique] */ __RPC_unique_pointer IPropertyStorage *LPPROPERTYSTORAGE; + +WINOLEAPI PropVariantCopy ( PROPVARIANT * pvarDest, const PROPVARIANT * pvarSrc ); +WINOLEAPI PropVariantClear ( PROPVARIANT * pvar ); +WINOLEAPI FreePropVariantArray ( ULONG cVariants, PROPVARIANT * rgvars ); + +#define _PROPVARIANTINIT_DEFINED_ +# ifdef __cplusplus +inline void PropVariantInit ( PROPVARIANT * pvar ) +{ + memset ( pvar, 0, sizeof(PROPVARIANT) ); +} +# else +# define PropVariantInit(pvar) memset ( (pvar), 0, sizeof(PROPVARIANT) ) +# endif + + +#ifndef _STGCREATEPROPSTG_DEFINED_ +WINOLEAPI StgCreatePropStg( IUnknown* pUnk, REFFMTID fmtid, const CLSID *pclsid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg ); +WINOLEAPI StgOpenPropStg( IUnknown* pUnk, REFFMTID fmtid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg ); +WINOLEAPI StgCreatePropSetStg( IStorage *pStorage, DWORD dwReserved, IPropertySetStorage **ppPropSetStg); + +#define CCH_MAX_PROPSTG_NAME 31 +__checkReturn WINOLEAPI FmtIdToPropStgName( const FMTID *pfmtid, __out_ecount(CCH_MAX_PROPSTG_NAME+1) LPOLESTR oszName ); +WINOLEAPI PropStgNameToFmtId( __in __nullterminated const LPOLESTR oszName, FMTID *pfmtid ); +#endif +#ifndef _SERIALIZEDPROPERTYVALUE_DEFINED_ +#define _SERIALIZEDPROPERTYVALUE_DEFINED_ +typedef struct tagSERIALIZEDPROPERTYVALUE // prop +{ + DWORD dwType; + BYTE rgb[1]; +} SERIALIZEDPROPERTYVALUE; +#endif + +EXTERN_C SERIALIZEDPROPERTYVALUE* __stdcall +StgConvertVariantToProperty( + __in const PROPVARIANT* pvar, + USHORT CodePage, + __out_bcount_opt(*pcb) SERIALIZEDPROPERTYVALUE* pprop, + __inout ULONG* pcb, + PROPID pid, + __reserved BOOLEAN fReserved, + __out_opt ULONG* pcIndirect); + +#ifdef __cplusplus +class PMemoryAllocator; + +EXTERN_C BOOLEAN __stdcall +StgConvertPropertyToVariant( + __in const SERIALIZEDPROPERTYVALUE* pprop, + USHORT CodePage, + __out PROPVARIANT* pvar, + __in PMemoryAllocator* pma); +#endif +#if _MSC_VER >= 1200 +#pragma warning(pop) +#else +#pragma warning(default:4201) /* Nameless struct/union */ +#pragma warning(default:4237) /* keywords bool, true, false, etc.. */ +#endif + + +extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_0004_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_0004_v0_0_s_ifspec; + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); +unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); +unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); +void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); + +unsigned long __RPC_USER LPSAFEARRAY_UserSize( unsigned long *, unsigned long , LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal( unsigned long *, unsigned char *, LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); +void __RPC_USER LPSAFEARRAY_UserFree( unsigned long *, LPSAFEARRAY * ); + +unsigned long __RPC_USER BSTR_UserSize64( unsigned long *, unsigned long , BSTR * ); +unsigned char * __RPC_USER BSTR_UserMarshal64( unsigned long *, unsigned char *, BSTR * ); +unsigned char * __RPC_USER BSTR_UserUnmarshal64(unsigned long *, unsigned char *, BSTR * ); +void __RPC_USER BSTR_UserFree64( unsigned long *, BSTR * ); + +unsigned long __RPC_USER LPSAFEARRAY_UserSize64( unsigned long *, unsigned long , LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal64( unsigned long *, unsigned char *, LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal64(unsigned long *, unsigned char *, LPSAFEARRAY * ); +void __RPC_USER LPSAFEARRAY_UserFree64( unsigned long *, LPSAFEARRAY * ); + +/* [local] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSTG_Next_Proxy( + IEnumSTATPROPSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ STATPROPSTG *rgelt, + /* [out] */ ULONG *pceltFetched); + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSTG_Next_Stub( + IEnumSTATPROPSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ __RPC__out_ecount_part(celt, *pceltFetched) STATPROPSTG *rgelt, + /* [out] */ __RPC__out ULONG *pceltFetched); + +/* [local] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSETSTG_Next_Proxy( + IEnumSTATPROPSETSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ STATPROPSETSTG *rgelt, + /* [out] */ ULONG *pceltFetched); + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumSTATPROPSETSTG_Next_Stub( + IEnumSTATPROPSETSTG * This, + /* [in] */ ULONG celt, + /* [length_is][size_is][out] */ __RPC__out_ecount_part(celt, *pceltFetched) STATPROPSETSTG *rgelt, + /* [out] */ __RPC__out ULONG *pceltFetched); + + + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkey.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkey.h new file mode 100644 index 0000000000..69e71a5191 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkey.h @@ -0,0 +1,4274 @@ +//=========================================================================== +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//=========================================================================== + + +#ifndef _INC_PROPKEY +#define _INC_PROPKEY + +#ifndef DEFINE_API_PKEY +#define DEFINE_API_PKEY(name, managed_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) \ + DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) +#endif + +#include + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0501 +#else +#if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) +#error _WIN32_IE setting conflicts with _WIN32_WINNT setting +#endif +#endif + + +//----------------------------------------------------------------------------- +// Audio properties + +// Name: System.Audio.ChannelCount -- PKEY_Audio_ChannelCount +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 7 (PIDASI_CHANNEL_COUNT) +// +// Indicates the channel count for the audio file. Values: 1 (mono), 2 (stereo). +DEFINE_PROPERTYKEY(PKEY_Audio_ChannelCount, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 7); + +// Possible discrete values for PKEY_Audio_ChannelCount are: +#define AUDIO_CHANNELCOUNT_MONO 1ul +#define AUDIO_CHANNELCOUNT_STEREO 2ul + +// Name: System.Audio.Compression -- PKEY_Audio_Compression +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 10 (PIDASI_COMPRESSION) +// +// +DEFINE_PROPERTYKEY(PKEY_Audio_Compression, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 10); + +// Name: System.Audio.EncodingBitrate -- PKEY_Audio_EncodingBitrate +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 4 (PIDASI_AVG_DATA_RATE) +// +// Indicates the average data rate in Hz for the audio file in "bits per second". +DEFINE_PROPERTYKEY(PKEY_Audio_EncodingBitrate, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 4); + +// Name: System.Audio.Format -- PKEY_Audio_Format +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) Legacy code may treat this as VT_BSTR. +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 2 (PIDASI_FORMAT) +// +// Indicates the format of the audio file. +DEFINE_PROPERTYKEY(PKEY_Audio_Format, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 2); + +// Name: System.Audio.IsVariableBitRate -- PKEY_Audio_IsVariableBitRate +// Type: Boolean -- VT_BOOL +// FormatID: E6822FEE-8C17-4D62-823C-8E9CFCBD1D5C, 100 +DEFINE_PROPERTYKEY(PKEY_Audio_IsVariableBitRate, 0xE6822FEE, 0x8C17, 0x4D62, 0x82, 0x3C, 0x8E, 0x9C, 0xFC, 0xBD, 0x1D, 0x5C, 100); + +// Name: System.Audio.PeakValue -- PKEY_Audio_PeakValue +// Type: UInt32 -- VT_UI4 +// FormatID: 2579E5D0-1116-4084-BD9A-9B4F7CB4DF5E, 100 +DEFINE_PROPERTYKEY(PKEY_Audio_PeakValue, 0x2579E5D0, 0x1116, 0x4084, 0xBD, 0x9A, 0x9B, 0x4F, 0x7C, 0xB4, 0xDF, 0x5E, 100); + +// Name: System.Audio.SampleRate -- PKEY_Audio_SampleRate +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 5 (PIDASI_SAMPLE_RATE) +// +// Indicates the audio sample rate for the audio file in "samples per second". +DEFINE_PROPERTYKEY(PKEY_Audio_SampleRate, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 5); + +// Name: System.Audio.SampleSize -- PKEY_Audio_SampleSize +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 6 (PIDASI_SAMPLE_SIZE) +// +// Indicates the audio sample size for the audio file in "bits per sample". +DEFINE_PROPERTYKEY(PKEY_Audio_SampleSize, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 6); + +// Name: System.Audio.StreamName -- PKEY_Audio_StreamName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 9 (PIDASI_STREAM_NAME) +// +// +DEFINE_PROPERTYKEY(PKEY_Audio_StreamName, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 9); + +// Name: System.Audio.StreamNumber -- PKEY_Audio_StreamNumber +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 8 (PIDASI_STREAM_NUMBER) +// +// +DEFINE_PROPERTYKEY(PKEY_Audio_StreamNumber, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 8); + + + +//----------------------------------------------------------------------------- +// Calendar properties + +// Name: System.Calendar.Duration -- PKEY_Calendar_Duration +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 293CA35A-09AA-4DD2-B180-1FE245728A52, 100 +// +// The duration as specified in a string. +DEFINE_PROPERTYKEY(PKEY_Calendar_Duration, 0x293CA35A, 0x09AA, 0x4DD2, 0xB1, 0x80, 0x1F, 0xE2, 0x45, 0x72, 0x8A, 0x52, 100); + +// Name: System.Calendar.IsOnline -- PKEY_Calendar_IsOnline +// Type: Boolean -- VT_BOOL +// FormatID: BFEE9149-E3E2-49A7-A862-C05988145CEC, 100 +// +// Identifies if the event is an online event. +DEFINE_PROPERTYKEY(PKEY_Calendar_IsOnline, 0xBFEE9149, 0xE3E2, 0x49A7, 0xA8, 0x62, 0xC0, 0x59, 0x88, 0x14, 0x5C, 0xEC, 100); + +// Name: System.Calendar.IsRecurring -- PKEY_Calendar_IsRecurring +// Type: Boolean -- VT_BOOL +// FormatID: 315B9C8D-80A9-4EF9-AE16-8E746DA51D70, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_IsRecurring, 0x315B9C8D, 0x80A9, 0x4EF9, 0xAE, 0x16, 0x8E, 0x74, 0x6D, 0xA5, 0x1D, 0x70, 100); + +// Name: System.Calendar.Location -- PKEY_Calendar_Location +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F6272D18-CECC-40B1-B26A-3911717AA7BD, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_Location, 0xF6272D18, 0xCECC, 0x40B1, 0xB2, 0x6A, 0x39, 0x11, 0x71, 0x7A, 0xA7, 0xBD, 100); + +// Name: System.Calendar.OptionalAttendeeAddresses -- PKEY_Calendar_OptionalAttendeeAddresses +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D55BAE5A-3892-417A-A649-C6AC5AAAEAB3, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_OptionalAttendeeAddresses, 0xD55BAE5A, 0x3892, 0x417A, 0xA6, 0x49, 0xC6, 0xAC, 0x5A, 0xAA, 0xEA, 0xB3, 100); + +// Name: System.Calendar.OptionalAttendeeNames -- PKEY_Calendar_OptionalAttendeeNames +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 09429607-582D-437F-84C3-DE93A2B24C3C, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_OptionalAttendeeNames, 0x09429607, 0x582D, 0x437F, 0x84, 0xC3, 0xDE, 0x93, 0xA2, 0xB2, 0x4C, 0x3C, 100); + +// Name: System.Calendar.OrganizerAddress -- PKEY_Calendar_OrganizerAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 744C8242-4DF5-456C-AB9E-014EFB9021E3, 100 +// +// Address of the organizer organizing the event. +DEFINE_PROPERTYKEY(PKEY_Calendar_OrganizerAddress, 0x744C8242, 0x4DF5, 0x456C, 0xAB, 0x9E, 0x01, 0x4E, 0xFB, 0x90, 0x21, 0xE3, 100); + +// Name: System.Calendar.OrganizerName -- PKEY_Calendar_OrganizerName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: AAA660F9-9865-458E-B484-01BC7FE3973E, 100 +// +// Name of the organizer organizing the event. +DEFINE_PROPERTYKEY(PKEY_Calendar_OrganizerName, 0xAAA660F9, 0x9865, 0x458E, 0xB4, 0x84, 0x01, 0xBC, 0x7F, 0xE3, 0x97, 0x3E, 100); + +// Name: System.Calendar.ReminderTime -- PKEY_Calendar_ReminderTime +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 72FC5BA4-24F9-4011-9F3F-ADD27AFAD818, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_ReminderTime, 0x72FC5BA4, 0x24F9, 0x4011, 0x9F, 0x3F, 0xAD, 0xD2, 0x7A, 0xFA, 0xD8, 0x18, 100); + +// Name: System.Calendar.RequiredAttendeeAddresses -- PKEY_Calendar_RequiredAttendeeAddresses +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 0BA7D6C3-568D-4159-AB91-781A91FB71E5, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_RequiredAttendeeAddresses, 0x0BA7D6C3, 0x568D, 0x4159, 0xAB, 0x91, 0x78, 0x1A, 0x91, 0xFB, 0x71, 0xE5, 100); + +// Name: System.Calendar.RequiredAttendeeNames -- PKEY_Calendar_RequiredAttendeeNames +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: B33AF30B-F552-4584-936C-CB93E5CDA29F, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_RequiredAttendeeNames, 0xB33AF30B, 0xF552, 0x4584, 0x93, 0x6C, 0xCB, 0x93, 0xE5, 0xCD, 0xA2, 0x9F, 100); + +// Name: System.Calendar.Resources -- PKEY_Calendar_Resources +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 00F58A38-C54B-4C40-8696-97235980EAE1, 100 +DEFINE_PROPERTYKEY(PKEY_Calendar_Resources, 0x00F58A38, 0xC54B, 0x4C40, 0x86, 0x96, 0x97, 0x23, 0x59, 0x80, 0xEA, 0xE1, 100); + +// Name: System.Calendar.ShowTimeAs -- PKEY_Calendar_ShowTimeAs +// Type: UInt16 -- VT_UI2 +// FormatID: 5BF396D4-5EB2-466F-BDE9-2FB3F2361D6E, 100 +// +// +DEFINE_PROPERTYKEY(PKEY_Calendar_ShowTimeAs, 0x5BF396D4, 0x5EB2, 0x466F, 0xBD, 0xE9, 0x2F, 0xB3, 0xF2, 0x36, 0x1D, 0x6E, 100); + +// Possible discrete values for PKEY_Calendar_ShowTimeAs are: +#define CALENDAR_SHOWTIMEAS_FREE 0u +#define CALENDAR_SHOWTIMEAS_TENTATIVE 1u +#define CALENDAR_SHOWTIMEAS_BUSY 2u +#define CALENDAR_SHOWTIMEAS_OOF 3u + +// Name: System.Calendar.ShowTimeAsText -- PKEY_Calendar_ShowTimeAsText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 53DA57CF-62C0-45C4-81DE-7610BCEFD7F5, 100 +// +// This is the user-friendly form of System.Calendar.ShowTimeAs. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Calendar_ShowTimeAsText, 0x53DA57CF, 0x62C0, 0x45C4, 0x81, 0xDE, 0x76, 0x10, 0xBC, 0xEF, 0xD7, 0xF5, 100); + +//----------------------------------------------------------------------------- +// Communication properties + + + +// Name: System.Communication.AccountName -- PKEY_Communication_AccountName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 9 +// +// Account Name +DEFINE_PROPERTYKEY(PKEY_Communication_AccountName, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 9); + +// Name: System.Communication.Suffix -- PKEY_Communication_Suffix +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 807B653A-9E91-43EF-8F97-11CE04EE20C5, 100 +DEFINE_PROPERTYKEY(PKEY_Communication_Suffix, 0x807B653A, 0x9E91, 0x43EF, 0x8F, 0x97, 0x11, 0xCE, 0x04, 0xEE, 0x20, 0xC5, 100); + +// Name: System.Communication.TaskStatus -- PKEY_Communication_TaskStatus +// Type: UInt16 -- VT_UI2 +// FormatID: BE1A72C6-9A1D-46B7-AFE7-AFAF8CEF4999, 100 +DEFINE_PROPERTYKEY(PKEY_Communication_TaskStatus, 0xBE1A72C6, 0x9A1D, 0x46B7, 0xAF, 0xE7, 0xAF, 0xAF, 0x8C, 0xEF, 0x49, 0x99, 100); + +// Possible discrete values for PKEY_Communication_TaskStatus are: +#define TASKSTATUS_NOTSTARTED 0u +#define TASKSTATUS_INPROGRESS 1u +#define TASKSTATUS_COMPLETE 2u +#define TASKSTATUS_WAITING 3u +#define TASKSTATUS_DEFERRED 4u + +// Name: System.Communication.TaskStatusText -- PKEY_Communication_TaskStatusText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A6744477-C237-475B-A075-54F34498292A, 100 +// +// This is the user-friendly form of System.Communication.TaskStatus. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Communication_TaskStatusText, 0xA6744477, 0xC237, 0x475B, 0xA0, 0x75, 0x54, 0xF3, 0x44, 0x98, 0x29, 0x2A, 100); + +//----------------------------------------------------------------------------- +// Computer properties + + + +// Name: System.Computer.DecoratedFreeSpace -- PKEY_Computer_DecoratedFreeSpace +// Type: Multivalue UInt64 -- VT_VECTOR | VT_UI8 (For variants: VT_ARRAY | VT_UI8) +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 7 (Filesystem Volume Properties) +// +// Free space and total space: "%s free of %s" +DEFINE_PROPERTYKEY(PKEY_Computer_DecoratedFreeSpace, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 7); + +//----------------------------------------------------------------------------- +// Contact properties + + + +// Name: System.Contact.Anniversary -- PKEY_Contact_Anniversary +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 9AD5BADB-CEA7-4470-A03D-B84E51B9949E, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Anniversary, 0x9AD5BADB, 0xCEA7, 0x4470, 0xA0, 0x3D, 0xB8, 0x4E, 0x51, 0xB9, 0x94, 0x9E, 100); + +// Name: System.Contact.AssistantName -- PKEY_Contact_AssistantName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CD102C9C-5540-4A88-A6F6-64E4981C8CD1, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_AssistantName, 0xCD102C9C, 0x5540, 0x4A88, 0xA6, 0xF6, 0x64, 0xE4, 0x98, 0x1C, 0x8C, 0xD1, 100); + +// Name: System.Contact.AssistantTelephone -- PKEY_Contact_AssistantTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 9A93244D-A7AD-4FF8-9B99-45EE4CC09AF6, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_AssistantTelephone, 0x9A93244D, 0xA7AD, 0x4FF8, 0x9B, 0x99, 0x45, 0xEE, 0x4C, 0xC0, 0x9A, 0xF6, 100); + +// Name: System.Contact.Birthday -- PKEY_Contact_Birthday +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 47 +DEFINE_PROPERTYKEY(PKEY_Contact_Birthday, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 47); + +// Name: System.Contact.BusinessAddress -- PKEY_Contact_BusinessAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 730FB6DD-CF7C-426B-A03F-BD166CC9EE24, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddress, 0x730FB6DD, 0xCF7C, 0x426B, 0xA0, 0x3F, 0xBD, 0x16, 0x6C, 0xC9, 0xEE, 0x24, 100); + +// Name: System.Contact.BusinessAddressCity -- PKEY_Contact_BusinessAddressCity +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 402B5934-EC5A-48C3-93E6-85E86A2D934E, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressCity, 0x402B5934, 0xEC5A, 0x48C3, 0x93, 0xE6, 0x85, 0xE8, 0x6A, 0x2D, 0x93, 0x4E, 100); + +// Name: System.Contact.BusinessAddressCountry -- PKEY_Contact_BusinessAddressCountry +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: B0B87314-FCF6-4FEB-8DFF-A50DA6AF561C, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressCountry, 0xB0B87314, 0xFCF6, 0x4FEB, 0x8D, 0xFF, 0xA5, 0x0D, 0xA6, 0xAF, 0x56, 0x1C, 100); + +// Name: System.Contact.BusinessAddressPostalCode -- PKEY_Contact_BusinessAddressPostalCode +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E1D4A09E-D758-4CD1-B6EC-34A8B5A73F80, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressPostalCode, 0xE1D4A09E, 0xD758, 0x4CD1, 0xB6, 0xEC, 0x34, 0xA8, 0xB5, 0xA7, 0x3F, 0x80, 100); + +// Name: System.Contact.BusinessAddressPostOfficeBox -- PKEY_Contact_BusinessAddressPostOfficeBox +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: BC4E71CE-17F9-48D5-BEE9-021DF0EA5409, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressPostOfficeBox, 0xBC4E71CE, 0x17F9, 0x48D5, 0xBE, 0xE9, 0x02, 0x1D, 0xF0, 0xEA, 0x54, 0x09, 100); + +// Name: System.Contact.BusinessAddressState -- PKEY_Contact_BusinessAddressState +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 446F787F-10C4-41CB-A6C4-4D0343551597, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressState, 0x446F787F, 0x10C4, 0x41CB, 0xA6, 0xC4, 0x4D, 0x03, 0x43, 0x55, 0x15, 0x97, 100); + +// Name: System.Contact.BusinessAddressStreet -- PKEY_Contact_BusinessAddressStreet +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DDD1460F-C0BF-4553-8CE4-10433C908FB0, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessAddressStreet, 0xDDD1460F, 0xC0BF, 0x4553, 0x8C, 0xE4, 0x10, 0x43, 0x3C, 0x90, 0x8F, 0xB0, 100); + +// Name: System.Contact.BusinessFaxNumber -- PKEY_Contact_BusinessFaxNumber +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 91EFF6F3-2E27-42CA-933E-7C999FBE310B, 100 +// +// Business fax number of the contact. +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessFaxNumber, 0x91EFF6F3, 0x2E27, 0x42CA, 0x93, 0x3E, 0x7C, 0x99, 0x9F, 0xBE, 0x31, 0x0B, 100); + +// Name: System.Contact.BusinessHomePage -- PKEY_Contact_BusinessHomePage +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 56310920-2491-4919-99CE-EADB06FAFDB2, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessHomePage, 0x56310920, 0x2491, 0x4919, 0x99, 0xCE, 0xEA, 0xDB, 0x06, 0xFA, 0xFD, 0xB2, 100); + +// Name: System.Contact.BusinessTelephone -- PKEY_Contact_BusinessTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6A15E5A0-0A1E-4CD7-BB8C-D2F1B0C929BC, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_BusinessTelephone, 0x6A15E5A0, 0x0A1E, 0x4CD7, 0xBB, 0x8C, 0xD2, 0xF1, 0xB0, 0xC9, 0x29, 0xBC, 100); + +// Name: System.Contact.CallbackTelephone -- PKEY_Contact_CallbackTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: BF53D1C3-49E0-4F7F-8567-5A821D8AC542, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_CallbackTelephone, 0xBF53D1C3, 0x49E0, 0x4F7F, 0x85, 0x67, 0x5A, 0x82, 0x1D, 0x8A, 0xC5, 0x42, 100); + +// Name: System.Contact.CarTelephone -- PKEY_Contact_CarTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8FDC6DEA-B929-412B-BA90-397A257465FE, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_CarTelephone, 0x8FDC6DEA, 0xB929, 0x412B, 0xBA, 0x90, 0x39, 0x7A, 0x25, 0x74, 0x65, 0xFE, 100); + +// Name: System.Contact.Children -- PKEY_Contact_Children +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D4729704-8EF1-43EF-9024-2BD381187FD5, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Children, 0xD4729704, 0x8EF1, 0x43EF, 0x90, 0x24, 0x2B, 0xD3, 0x81, 0x18, 0x7F, 0xD5, 100); + +// Name: System.Contact.CompanyMainTelephone -- PKEY_Contact_CompanyMainTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8589E481-6040-473D-B171-7FA89C2708ED, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_CompanyMainTelephone, 0x8589E481, 0x6040, 0x473D, 0xB1, 0x71, 0x7F, 0xA8, 0x9C, 0x27, 0x08, 0xED, 100); + +// Name: System.Contact.Department -- PKEY_Contact_Department +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: FC9F7306-FF8F-4D49-9FB6-3FFE5C0951EC, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Department, 0xFC9F7306, 0xFF8F, 0x4D49, 0x9F, 0xB6, 0x3F, 0xFE, 0x5C, 0x09, 0x51, 0xEC, 100); + +// Name: System.Contact.EmailAddress -- PKEY_Contact_EmailAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F8FA7FA3-D12B-4785-8A4E-691A94F7A3E7, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_EmailAddress, 0xF8FA7FA3, 0xD12B, 0x4785, 0x8A, 0x4E, 0x69, 0x1A, 0x94, 0xF7, 0xA3, 0xE7, 100); + +// Name: System.Contact.EmailAddress2 -- PKEY_Contact_EmailAddress2 +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 38965063-EDC8-4268-8491-B7723172CF29, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_EmailAddress2, 0x38965063, 0xEDC8, 0x4268, 0x84, 0x91, 0xB7, 0x72, 0x31, 0x72, 0xCF, 0x29, 100); + +// Name: System.Contact.EmailAddress3 -- PKEY_Contact_EmailAddress3 +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 644D37B4-E1B3-4BAD-B099-7E7C04966ACA, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_EmailAddress3, 0x644D37B4, 0xE1B3, 0x4BAD, 0xB0, 0x99, 0x7E, 0x7C, 0x04, 0x96, 0x6A, 0xCA, 100); + +// Name: System.Contact.EmailAddresses -- PKEY_Contact_EmailAddresses +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 84D8F337-981D-44B3-9615-C7596DBA17E3, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_EmailAddresses, 0x84D8F337, 0x981D, 0x44B3, 0x96, 0x15, 0xC7, 0x59, 0x6D, 0xBA, 0x17, 0xE3, 100); + +// Name: System.Contact.EmailName -- PKEY_Contact_EmailName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CC6F4F24-6083-4BD4-8754-674D0DE87AB8, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_EmailName, 0xCC6F4F24, 0x6083, 0x4BD4, 0x87, 0x54, 0x67, 0x4D, 0x0D, 0xE8, 0x7A, 0xB8, 100); + +// Name: System.Contact.FileAsName -- PKEY_Contact_FileAsName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F1A24AA7-9CA7-40F6-89EC-97DEF9FFE8DB, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_FileAsName, 0xF1A24AA7, 0x9CA7, 0x40F6, 0x89, 0xEC, 0x97, 0xDE, 0xF9, 0xFF, 0xE8, 0xDB, 100); + +// Name: System.Contact.FirstName -- PKEY_Contact_FirstName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 14977844-6B49-4AAD-A714-A4513BF60460, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_FirstName, 0x14977844, 0x6B49, 0x4AAD, 0xA7, 0x14, 0xA4, 0x51, 0x3B, 0xF6, 0x04, 0x60, 100); + +// Name: System.Contact.FullName -- PKEY_Contact_FullName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 635E9051-50A5-4BA2-B9DB-4ED056C77296, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_FullName, 0x635E9051, 0x50A5, 0x4BA2, 0xB9, 0xDB, 0x4E, 0xD0, 0x56, 0xC7, 0x72, 0x96, 100); + +// Name: System.Contact.Gender -- PKEY_Contact_Gender +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Gender, 0x3C8CEE58, 0xD4F0, 0x4CF9, 0xB7, 0x56, 0x4E, 0x5D, 0x24, 0x44, 0x7B, 0xCD, 100); + +// Name: System.Contact.Hobbies -- PKEY_Contact_Hobbies +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 5DC2253F-5E11-4ADF-9CFE-910DD01E3E70, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Hobbies, 0x5DC2253F, 0x5E11, 0x4ADF, 0x9C, 0xFE, 0x91, 0x0D, 0xD0, 0x1E, 0x3E, 0x70, 100); + +// Name: System.Contact.HomeAddress -- PKEY_Contact_HomeAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 98F98354-617A-46B8-8560-5B1B64BF1F89, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddress, 0x98F98354, 0x617A, 0x46B8, 0x85, 0x60, 0x5B, 0x1B, 0x64, 0xBF, 0x1F, 0x89, 100); + +// Name: System.Contact.HomeAddressCity -- PKEY_Contact_HomeAddressCity +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 65 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressCity, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 65); + +// Name: System.Contact.HomeAddressCountry -- PKEY_Contact_HomeAddressCountry +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 08A65AA1-F4C9-43DD-9DDF-A33D8E7EAD85, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressCountry, 0x08A65AA1, 0xF4C9, 0x43DD, 0x9D, 0xDF, 0xA3, 0x3D, 0x8E, 0x7E, 0xAD, 0x85, 100); + +// Name: System.Contact.HomeAddressPostalCode -- PKEY_Contact_HomeAddressPostalCode +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8AFCC170-8A46-4B53-9EEE-90BAE7151E62, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressPostalCode, 0x8AFCC170, 0x8A46, 0x4B53, 0x9E, 0xEE, 0x90, 0xBA, 0xE7, 0x15, 0x1E, 0x62, 100); + +// Name: System.Contact.HomeAddressPostOfficeBox -- PKEY_Contact_HomeAddressPostOfficeBox +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7B9F6399-0A3F-4B12-89BD-4ADC51C918AF, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressPostOfficeBox, 0x7B9F6399, 0x0A3F, 0x4B12, 0x89, 0xBD, 0x4A, 0xDC, 0x51, 0xC9, 0x18, 0xAF, 100); + +// Name: System.Contact.HomeAddressState -- PKEY_Contact_HomeAddressState +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C89A23D0-7D6D-4EB8-87D4-776A82D493E5, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressState, 0xC89A23D0, 0x7D6D, 0x4EB8, 0x87, 0xD4, 0x77, 0x6A, 0x82, 0xD4, 0x93, 0xE5, 100); + +// Name: System.Contact.HomeAddressStreet -- PKEY_Contact_HomeAddressStreet +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 0ADEF160-DB3F-4308-9A21-06237B16FA2A, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeAddressStreet, 0x0ADEF160, 0xDB3F, 0x4308, 0x9A, 0x21, 0x06, 0x23, 0x7B, 0x16, 0xFA, 0x2A, 100); + +// Name: System.Contact.HomeFaxNumber -- PKEY_Contact_HomeFaxNumber +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 660E04D6-81AB-4977-A09F-82313113AB26, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeFaxNumber, 0x660E04D6, 0x81AB, 0x4977, 0xA0, 0x9F, 0x82, 0x31, 0x31, 0x13, 0xAB, 0x26, 100); + +// Name: System.Contact.HomeTelephone -- PKEY_Contact_HomeTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 20 +DEFINE_PROPERTYKEY(PKEY_Contact_HomeTelephone, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 20); + +// Name: System.Contact.IMAddress -- PKEY_Contact_IMAddress +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D68DBD8A-3374-4B81-9972-3EC30682DB3D, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_IMAddress, 0xD68DBD8A, 0x3374, 0x4B81, 0x99, 0x72, 0x3E, 0xC3, 0x06, 0x82, 0xDB, 0x3D, 100); + +// Name: System.Contact.Initials -- PKEY_Contact_Initials +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F3D8F40D-50CB-44A2-9718-40CB9119495D, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Initials, 0xF3D8F40D, 0x50CB, 0x44A2, 0x97, 0x18, 0x40, 0xCB, 0x91, 0x19, 0x49, 0x5D, 100); + +// Name: System.Contact.JA.CompanyNamePhonetic -- PKEY_Contact_JA_CompanyNamePhonetic +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 897B3694-FE9E-43E6-8066-260F590C0100, 2 +// +// +DEFINE_PROPERTYKEY(PKEY_Contact_JA_CompanyNamePhonetic, 0x897B3694, 0xFE9E, 0x43E6, 0x80, 0x66, 0x26, 0x0F, 0x59, 0x0C, 0x01, 0x00, 2); + +// Name: System.Contact.JA.FirstNamePhonetic -- PKEY_Contact_JA_FirstNamePhonetic +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 897B3694-FE9E-43E6-8066-260F590C0100, 3 +// +// +DEFINE_PROPERTYKEY(PKEY_Contact_JA_FirstNamePhonetic, 0x897B3694, 0xFE9E, 0x43E6, 0x80, 0x66, 0x26, 0x0F, 0x59, 0x0C, 0x01, 0x00, 3); + +// Name: System.Contact.JA.LastNamePhonetic -- PKEY_Contact_JA_LastNamePhonetic +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 897B3694-FE9E-43E6-8066-260F590C0100, 4 +// +// +DEFINE_PROPERTYKEY(PKEY_Contact_JA_LastNamePhonetic, 0x897B3694, 0xFE9E, 0x43E6, 0x80, 0x66, 0x26, 0x0F, 0x59, 0x0C, 0x01, 0x00, 4); + +// Name: System.Contact.JobTitle -- PKEY_Contact_JobTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 6 +DEFINE_PROPERTYKEY(PKEY_Contact_JobTitle, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 6); + +// Name: System.Contact.Label -- PKEY_Contact_Label +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 97B0AD89-DF49-49CC-834E-660974FD755B, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Label, 0x97B0AD89, 0xDF49, 0x49CC, 0x83, 0x4E, 0x66, 0x09, 0x74, 0xFD, 0x75, 0x5B, 100); + +// Name: System.Contact.LastName -- PKEY_Contact_LastName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8F367200-C270-457C-B1D4-E07C5BCD90C7, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_LastName, 0x8F367200, 0xC270, 0x457C, 0xB1, 0xD4, 0xE0, 0x7C, 0x5B, 0xCD, 0x90, 0xC7, 100); + +// Name: System.Contact.MailingAddress -- PKEY_Contact_MailingAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C0AC206A-827E-4650-95AE-77E2BB74FCC9, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_MailingAddress, 0xC0AC206A, 0x827E, 0x4650, 0x95, 0xAE, 0x77, 0xE2, 0xBB, 0x74, 0xFC, 0xC9, 100); + +// Name: System.Contact.MiddleName -- PKEY_Contact_MiddleName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 71 +DEFINE_PROPERTYKEY(PKEY_Contact_MiddleName, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 71); + +// Name: System.Contact.MobileTelephone -- PKEY_Contact_MobileTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 35 +DEFINE_PROPERTYKEY(PKEY_Contact_MobileTelephone, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 35); + +// Name: System.Contact.NickName -- PKEY_Contact_NickName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 74 +DEFINE_PROPERTYKEY(PKEY_Contact_NickName, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 74); + +// Name: System.Contact.OfficeLocation -- PKEY_Contact_OfficeLocation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 7 +DEFINE_PROPERTYKEY(PKEY_Contact_OfficeLocation, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 7); + +// Name: System.Contact.OtherAddress -- PKEY_Contact_OtherAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 508161FA-313B-43D5-83A1-C1ACCF68622C, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddress, 0x508161FA, 0x313B, 0x43D5, 0x83, 0xA1, 0xC1, 0xAC, 0xCF, 0x68, 0x62, 0x2C, 100); + +// Name: System.Contact.OtherAddressCity -- PKEY_Contact_OtherAddressCity +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6E682923-7F7B-4F0C-A337-CFCA296687BF, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressCity, 0x6E682923, 0x7F7B, 0x4F0C, 0xA3, 0x37, 0xCF, 0xCA, 0x29, 0x66, 0x87, 0xBF, 100); + +// Name: System.Contact.OtherAddressCountry -- PKEY_Contact_OtherAddressCountry +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8F167568-0AAE-4322-8ED9-6055B7B0E398, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressCountry, 0x8F167568, 0x0AAE, 0x4322, 0x8E, 0xD9, 0x60, 0x55, 0xB7, 0xB0, 0xE3, 0x98, 100); + +// Name: System.Contact.OtherAddressPostalCode -- PKEY_Contact_OtherAddressPostalCode +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 95C656C1-2ABF-4148-9ED3-9EC602E3B7CD, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressPostalCode, 0x95C656C1, 0x2ABF, 0x4148, 0x9E, 0xD3, 0x9E, 0xC6, 0x02, 0xE3, 0xB7, 0xCD, 100); + +// Name: System.Contact.OtherAddressPostOfficeBox -- PKEY_Contact_OtherAddressPostOfficeBox +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 8B26EA41-058F-43F6-AECC-4035681CE977, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressPostOfficeBox, 0x8B26EA41, 0x058F, 0x43F6, 0xAE, 0xCC, 0x40, 0x35, 0x68, 0x1C, 0xE9, 0x77, 100); + +// Name: System.Contact.OtherAddressState -- PKEY_Contact_OtherAddressState +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 71B377D6-E570-425F-A170-809FAE73E54E, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressState, 0x71B377D6, 0xE570, 0x425F, 0xA1, 0x70, 0x80, 0x9F, 0xAE, 0x73, 0xE5, 0x4E, 100); + +// Name: System.Contact.OtherAddressStreet -- PKEY_Contact_OtherAddressStreet +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: FF962609-B7D6-4999-862D-95180D529AEA, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_OtherAddressStreet, 0xFF962609, 0xB7D6, 0x4999, 0x86, 0x2D, 0x95, 0x18, 0x0D, 0x52, 0x9A, 0xEA, 100); + +// Name: System.Contact.PagerTelephone -- PKEY_Contact_PagerTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D6304E01-F8F5-4F45-8B15-D024A6296789, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PagerTelephone, 0xD6304E01, 0xF8F5, 0x4F45, 0x8B, 0x15, 0xD0, 0x24, 0xA6, 0x29, 0x67, 0x89, 100); + +// Name: System.Contact.PersonalTitle -- PKEY_Contact_PersonalTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 69 +DEFINE_PROPERTYKEY(PKEY_Contact_PersonalTitle, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 69); + +// Name: System.Contact.PrimaryAddressCity -- PKEY_Contact_PrimaryAddressCity +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C8EA94F0-A9E3-4969-A94B-9C62A95324E0, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressCity, 0xC8EA94F0, 0xA9E3, 0x4969, 0xA9, 0x4B, 0x9C, 0x62, 0xA9, 0x53, 0x24, 0xE0, 100); + +// Name: System.Contact.PrimaryAddressCountry -- PKEY_Contact_PrimaryAddressCountry +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E53D799D-0F3F-466E-B2FF-74634A3CB7A4, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressCountry, 0xE53D799D, 0x0F3F, 0x466E, 0xB2, 0xFF, 0x74, 0x63, 0x4A, 0x3C, 0xB7, 0xA4, 100); + +// Name: System.Contact.PrimaryAddressPostalCode -- PKEY_Contact_PrimaryAddressPostalCode +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 18BBD425-ECFD-46EF-B612-7B4A6034EDA0, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressPostalCode, 0x18BBD425, 0xECFD, 0x46EF, 0xB6, 0x12, 0x7B, 0x4A, 0x60, 0x34, 0xED, 0xA0, 100); + +// Name: System.Contact.PrimaryAddressPostOfficeBox -- PKEY_Contact_PrimaryAddressPostOfficeBox +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DE5EF3C7-46E1-484E-9999-62C5308394C1, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressPostOfficeBox, 0xDE5EF3C7, 0x46E1, 0x484E, 0x99, 0x99, 0x62, 0xC5, 0x30, 0x83, 0x94, 0xC1, 100); + +// Name: System.Contact.PrimaryAddressState -- PKEY_Contact_PrimaryAddressState +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F1176DFE-7138-4640-8B4C-AE375DC70A6D, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressState, 0xF1176DFE, 0x7138, 0x4640, 0x8B, 0x4C, 0xAE, 0x37, 0x5D, 0xC7, 0x0A, 0x6D, 100); + +// Name: System.Contact.PrimaryAddressStreet -- PKEY_Contact_PrimaryAddressStreet +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 63C25B20-96BE-488F-8788-C09C407AD812, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryAddressStreet, 0x63C25B20, 0x96BE, 0x488F, 0x87, 0x88, 0xC0, 0x9C, 0x40, 0x7A, 0xD8, 0x12, 100); + +// Name: System.Contact.PrimaryEmailAddress -- PKEY_Contact_PrimaryEmailAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 48 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryEmailAddress, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 48); + +// Name: System.Contact.PrimaryTelephone -- PKEY_Contact_PrimaryTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 25 +DEFINE_PROPERTYKEY(PKEY_Contact_PrimaryTelephone, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 25); + +// Name: System.Contact.Profession -- PKEY_Contact_Profession +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7268AF55-1CE4-4F6E-A41F-B6E4EF10E4A9, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_Profession, 0x7268AF55, 0x1CE4, 0x4F6E, 0xA4, 0x1F, 0xB6, 0xE4, 0xEF, 0x10, 0xE4, 0xA9, 100); + +// Name: System.Contact.SpouseName -- PKEY_Contact_SpouseName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 9D2408B6-3167-422B-82B0-F583B7A7CFE3, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_SpouseName, 0x9D2408B6, 0x3167, 0x422B, 0x82, 0xB0, 0xF5, 0x83, 0xB7, 0xA7, 0xCF, 0xE3, 100); + +// Name: System.Contact.Suffix -- PKEY_Contact_Suffix +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 176DC63C-2688-4E89-8143-A347800F25E9, 73 +DEFINE_PROPERTYKEY(PKEY_Contact_Suffix, 0x176DC63C, 0x2688, 0x4E89, 0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9, 73); + +// Name: System.Contact.TelexNumber -- PKEY_Contact_TelexNumber +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C554493C-C1F7-40C1-A76C-EF8C0614003E, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_TelexNumber, 0xC554493C, 0xC1F7, 0x40C1, 0xA7, 0x6C, 0xEF, 0x8C, 0x06, 0x14, 0x00, 0x3E, 100); + +// Name: System.Contact.TTYTDDTelephone -- PKEY_Contact_TTYTDDTelephone +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: AAF16BAC-2B55-45E6-9F6D-415EB94910DF, 100 +DEFINE_PROPERTYKEY(PKEY_Contact_TTYTDDTelephone, 0xAAF16BAC, 0x2B55, 0x45E6, 0x9F, 0x6D, 0x41, 0x5E, 0xB9, 0x49, 0x10, 0xDF, 100); + +// Name: System.Contact.WebPage -- PKEY_Contact_WebPage +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 18 +DEFINE_PROPERTYKEY(PKEY_Contact_WebPage, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 18); + +//----------------------------------------------------------------------------- +// Core properties + + + +// Name: System.AcquisitionID -- PKEY_AcquisitionID +// Type: Int32 -- VT_I4 +// FormatID: 65A98875-3C80-40AB-ABBC-EFDAF77DBEE2, 100 +// +// Hash to determine acquisition session. +DEFINE_PROPERTYKEY(PKEY_AcquisitionID, 0x65A98875, 0x3C80, 0x40AB, 0xAB, 0xBC, 0xEF, 0xDA, 0xF7, 0x7D, 0xBE, 0xE2, 100); + +// Name: System.ApplicationName -- PKEY_ApplicationName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) Legacy code may treat this as VT_LPSTR. +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 18 (PIDSI_APPNAME) +// +// +DEFINE_PROPERTYKEY(PKEY_ApplicationName, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 18); + +// Name: System.Author -- PKEY_Author +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) Legacy code may treat this as VT_LPSTR. +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 4 (PIDSI_AUTHOR) +// +// +DEFINE_PROPERTYKEY(PKEY_Author, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 4); + +// Name: System.Capacity -- PKEY_Capacity +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 3 (PID_VOLUME_CAPACITY) (Filesystem Volume Properties) +// +// The amount of total space in bytes. +DEFINE_PROPERTYKEY(PKEY_Capacity, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 3); + +// Name: System.Category -- PKEY_Category +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 2 (PIDDSI_CATEGORY) +// +// Legacy code treats this as VT_LPSTR. +DEFINE_PROPERTYKEY(PKEY_Category, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 2); + +// Name: System.Comment -- PKEY_Comment +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) Legacy code may treat this as VT_LPSTR. +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 6 (PIDSI_COMMENTS) +// +// Comments. +DEFINE_PROPERTYKEY(PKEY_Comment, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 6); + +// Name: System.Company -- PKEY_Company +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 15 (PIDDSI_COMPANY) +// +// The company or publisher. +DEFINE_PROPERTYKEY(PKEY_Company, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 15); + +// Name: System.ComputerName -- PKEY_ComputerName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 5 (PID_COMPUTERNAME) +// +// +DEFINE_PROPERTYKEY(PKEY_ComputerName, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 5); + +// Name: System.ContainedItems -- PKEY_ContainedItems +// Type: Multivalue Guid -- VT_VECTOR | VT_CLSID (For variants: VT_ARRAY | VT_CLSID) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 29 +// +// The list of type of items, this item contains. For example, this item contains urls, attachments etc. +// This is represented as a vector array of GUIDs where each GUID represents certain type. +DEFINE_PROPERTYKEY(PKEY_ContainedItems, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 29); + +// Name: System.ContentStatus -- PKEY_ContentStatus +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 27 +DEFINE_PROPERTYKEY(PKEY_ContentStatus, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 27); + +// Name: System.ContentType -- PKEY_ContentType +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 26 +DEFINE_PROPERTYKEY(PKEY_ContentType, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 26); + +// Name: System.Copyright -- PKEY_Copyright +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 11 (PIDMSI_COPYRIGHT) +// +// +DEFINE_PROPERTYKEY(PKEY_Copyright, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 11); + +// Name: System.DateAccessed -- PKEY_DateAccessed +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 16 (PID_STG_ACCESSTIME) +// +// The time of the last access to the item. The Indexing Service friendly name is 'access'. +DEFINE_PROPERTYKEY(PKEY_DateAccessed, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 16); + +// Name: System.DateAcquired -- PKEY_DateAcquired +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 2CBAA8F5-D81F-47CA-B17A-F8D822300131, 100 +// +// The time the file entered the system via acquisition. This is not the same as System.DateImported. +// Examples are when pictures are acquired from a camera, or when music is purchased online. +DEFINE_PROPERTYKEY(PKEY_DateAcquired, 0x2CBAA8F5, 0xD81F, 0x47CA, 0xB1, 0x7A, 0xF8, 0xD8, 0x22, 0x30, 0x01, 0x31, 100); + +// Name: System.DateArchived -- PKEY_DateArchived +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 43F8D7B7-A444-4F87-9383-52271C9B915C, 100 +DEFINE_PROPERTYKEY(PKEY_DateArchived, 0x43F8D7B7, 0xA444, 0x4F87, 0x93, 0x83, 0x52, 0x27, 0x1C, 0x9B, 0x91, 0x5C, 100); + +// Name: System.DateCompleted -- PKEY_DateCompleted +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 72FAB781-ACDA-43E5-B155-B2434F85E678, 100 +DEFINE_PROPERTYKEY(PKEY_DateCompleted, 0x72FAB781, 0xACDA, 0x43E5, 0xB1, 0x55, 0xB2, 0x43, 0x4F, 0x85, 0xE6, 0x78, 100); + +// Name: System.DateCreated -- PKEY_DateCreated +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 15 (PID_STG_CREATETIME) +// +// The date and time the item was created. The Indexing Service friendly name is 'create'. +DEFINE_PROPERTYKEY(PKEY_DateCreated, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 15); + +// Name: System.DateImported -- PKEY_DateImported +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 18258 +// +// The time the file is imported into a separate database. This is not the same as System.DateAcquired. (Eg, 2003:05:22 13:55:04) +DEFINE_PROPERTYKEY(PKEY_DateImported, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 18258); + +// Name: System.DateModified -- PKEY_DateModified +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 14 (PID_STG_WRITETIME) +// +// The date and time of the last write to the item. The Indexing Service friendly name is 'write'. +DEFINE_PROPERTYKEY(PKEY_DateModified, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 14); + +// Name: System.DueDate -- PKEY_DueDate +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE, 100 +DEFINE_PROPERTYKEY(PKEY_DueDate, 0x3F8472B5, 0xE0AF, 0x4DB2, 0x80, 0x71, 0xC5, 0x3F, 0xE7, 0x6A, 0xE7, 0xCE, 100); + +// Name: System.EndDate -- PKEY_EndDate +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: C75FAA05-96FD-49E7-9CB4-9F601082D553, 100 +DEFINE_PROPERTYKEY(PKEY_EndDate, 0xC75FAA05, 0x96FD, 0x49E7, 0x9C, 0xB4, 0x9F, 0x60, 0x10, 0x82, 0xD5, 0x53, 100); + +// Name: System.FileAllocationSize -- PKEY_FileAllocationSize +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 18 (PID_STG_ALLOCSIZE) +// +// +DEFINE_PROPERTYKEY(PKEY_FileAllocationSize, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 18); + +// Name: System.FileAttributes -- PKEY_FileAttributes +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 13 (PID_STG_ATTRIBUTES) +// +// This is the WIN32_FIND_DATA dwFileAttributes for the file-based item. +DEFINE_PROPERTYKEY(PKEY_FileAttributes, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 13); + +// Name: System.FileCount -- PKEY_FileCount +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 12 +// +// +DEFINE_PROPERTYKEY(PKEY_FileCount, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 12); + +// Name: System.FileDescription -- PKEY_FileDescription +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSFMTID_VERSION) 0CEF7D53-FA64-11D1-A203-0000F81FEDEE, 3 (PIDVSI_FileDescription) +// +// This is a user-friendly description of the file. +DEFINE_PROPERTYKEY(PKEY_FileDescription, 0x0CEF7D53, 0xFA64, 0x11D1, 0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE, 3); + +// Name: System.FileExtension -- PKEY_FileExtension +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E4F10A3C-49E6-405D-8288-A23BD4EEAA6C, 100 +// +// This is the file extension of the file based item, including the leading period. +// +// If System.FileName is VT_EMPTY, then this property should be too. Otherwise, it should be derived +// appropriately by the data source from System.FileName. If System.FileName does not have a file +// extension, this value should be VT_EMPTY. +// +// To obtain the type of any item (including an item that is not a file), use System.ItemType. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" ".txt" +// "\\server\share\mydir\goodnews.doc" ".doc" +// "\\server\share\numbers.xls" ".xls" +// "\\server\share\folder" VT_EMPTY +// "c:\foo\MyFolder" VT_EMPTY +// [desktop] VT_EMPTY +DEFINE_PROPERTYKEY(PKEY_FileExtension, 0xE4F10A3C, 0x49E6, 0x405D, 0x82, 0x88, 0xA2, 0x3B, 0xD4, 0xEE, 0xAA, 0x6C, 100); + +// Name: System.FileFRN -- PKEY_FileFRN +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 21 (PID_STG_FRN) +// +// This is the unique file ID, also known as the File Reference Number. For a given file, this is the same value +// as is found in the structure variable FILE_ID_BOTH_DIR_INFO.FileId, via GetFileInformationByHandleEx(). +DEFINE_PROPERTYKEY(PKEY_FileFRN, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 21); + +// Name: System.FileName -- PKEY_FileName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 41CF5AE0-F75A-4806-BD87-59C7D9248EB9, 100 +// +// This is the file name (including extension) of the file. +// +// It is possible that the item might not exist on a filesystem (ie, it may not be opened +// using CreateFile). Nonetheless, if the item is represented as a file from the logical sense +// (and its name follows standard Win32 file-naming syntax), then the data source should emit this property. +// +// If an item is not a file, then the value for this property is VT_EMPTY. See +// System.ItemNameDisplay. +// +// This has the same value as System.ParsingName for items that are provided by the Shell's file folder. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "hello.txt" +// "\\server\share\mydir\goodnews.doc" "goodnews.doc" +// "\\server\share\numbers.xls" "numbers.xls" +// "c:\foo\MyFolder" "MyFolder" +// (email message) VT_EMPTY +// (song on portable device) "song.wma" +DEFINE_PROPERTYKEY(PKEY_FileName, 0x41CF5AE0, 0xF75A, 0x4806, 0xBD, 0x87, 0x59, 0xC7, 0xD9, 0x24, 0x8E, 0xB9, 100); + +// Name: System.FileOwner -- PKEY_FileOwner +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Misc) 9B174B34-40FF-11D2-A27E-00C04FC30871, 4 (PID_MISC_OWNER) +// +// This is the owner of the file, according to the file system. +DEFINE_PROPERTYKEY(PKEY_FileOwner, 0x9B174B34, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 4); + +// Name: System.FileVersion -- PKEY_FileVersion +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSFMTID_VERSION) 0CEF7D53-FA64-11D1-A203-0000F81FEDEE, 4 (PIDVSI_FileVersion) +// +// +DEFINE_PROPERTYKEY(PKEY_FileVersion, 0x0CEF7D53, 0xFA64, 0x11D1, 0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE, 4); + +// Name: System.FindData -- PKEY_FindData +// Type: Buffer -- VT_VECTOR | VT_UI1 (For variants: VT_ARRAY | VT_UI1) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 0 (PID_FINDDATA) +// +// WIN32_FIND_DATAW in buffer of bytes. +DEFINE_PROPERTYKEY(PKEY_FindData, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 0); + +// Name: System.FlagColor -- PKEY_FlagColor +// Type: UInt16 -- VT_UI2 +// FormatID: 67DF94DE-0CA7-4D6F-B792-053A3E4F03CF, 100 +// +// +DEFINE_PROPERTYKEY(PKEY_FlagColor, 0x67DF94DE, 0x0CA7, 0x4D6F, 0xB7, 0x92, 0x05, 0x3A, 0x3E, 0x4F, 0x03, 0xCF, 100); + +// Possible discrete values for PKEY_FlagColor are: +#define FLAGCOLOR_PURPLE 1u +#define FLAGCOLOR_ORANGE 2u +#define FLAGCOLOR_GREEN 3u +#define FLAGCOLOR_YELLOW 4u +#define FLAGCOLOR_BLUE 5u +#define FLAGCOLOR_RED 6u + +// Name: System.FlagColorText -- PKEY_FlagColorText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 45EAE747-8E2A-40AE-8CBF-CA52ABA6152A, 100 +// +// This is the user-friendly form of System.FlagColor. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_FlagColorText, 0x45EAE747, 0x8E2A, 0x40AE, 0x8C, 0xBF, 0xCA, 0x52, 0xAB, 0xA6, 0x15, 0x2A, 100); + +// Name: System.FlagStatus -- PKEY_FlagStatus +// Type: Int32 -- VT_I4 +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 12 +// +// Status of Flag. Values: (0=none 1=white 2=Red). cdoPR_FLAG_STATUS +DEFINE_PROPERTYKEY(PKEY_FlagStatus, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 12); + +// Possible discrete values for PKEY_FlagStatus are: +#define FLAGSTATUS_NOTFLAGGED 0l +#define FLAGSTATUS_COMPLETED 1l +#define FLAGSTATUS_FOLLOWUP 2l + +// Name: System.FlagStatusText -- PKEY_FlagStatusText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DC54FD2E-189D-4871-AA01-08C2F57A4ABC, 100 +// +// This is the user-friendly form of System.FlagStatus. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_FlagStatusText, 0xDC54FD2E, 0x189D, 0x4871, 0xAA, 0x01, 0x08, 0xC2, 0xF5, 0x7A, 0x4A, 0xBC, 100); + +// Name: System.FreeSpace -- PKEY_FreeSpace +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 2 (PID_VOLUME_FREE) (Filesystem Volume Properties) +// +// The amount of free space in bytes. +DEFINE_PROPERTYKEY(PKEY_FreeSpace, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 2); + +// Name: System.Identity -- PKEY_Identity +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A26F4AFC-7346-4299-BE47-EB1AE613139F, 100 +DEFINE_PROPERTYKEY(PKEY_Identity, 0xA26F4AFC, 0x7346, 0x4299, 0xBE, 0x47, 0xEB, 0x1A, 0xE6, 0x13, 0x13, 0x9F, 100); + +// Name: System.Importance -- PKEY_Importance +// Type: Int32 -- VT_I4 +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 11 +DEFINE_PROPERTYKEY(PKEY_Importance, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 11); + +// Possible range of values for PKEY_Importance are: +#define IMPORTANCE_LOW_MIN 0l +#define IMPORTANCE_LOW_SET 1l +#define IMPORTANCE_LOW_MAX 1l + +#define IMPORTANCE_NORMAL_MIN 2l +#define IMPORTANCE_NORMAL_SET 3l +#define IMPORTANCE_NORMAL_MAX 4l + +#define IMPORTANCE_HIGH_MIN 5l +#define IMPORTANCE_HIGH_SET 5l +#define IMPORTANCE_HIGH_MAX 5l + + +// Name: System.ImportanceText -- PKEY_ImportanceText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A3B29791-7713-4E1D-BB40-17DB85F01831, 100 +// +// This is the user-friendly form of System.Importance. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_ImportanceText, 0xA3B29791, 0x7713, 0x4E1D, 0xBB, 0x40, 0x17, 0xDB, 0x85, 0xF0, 0x18, 0x31, 100); + +// Name: System.IsAttachment -- PKEY_IsAttachment +// Type: Boolean -- VT_BOOL +// FormatID: F23F425C-71A1-4FA8-922F-678EA4A60408, 100 +// +// Identifies if this item is an attachment. +DEFINE_PROPERTYKEY(PKEY_IsAttachment, 0xF23F425C, 0x71A1, 0x4FA8, 0x92, 0x2F, 0x67, 0x8E, 0xA4, 0xA6, 0x04, 0x08, 100); + +// Name: System.IsDeleted -- PKEY_IsDeleted +// Type: Boolean -- VT_BOOL +// FormatID: 5CDA5FC8-33EE-4FF3-9094-AE7BD8868C4D, 100 +DEFINE_PROPERTYKEY(PKEY_IsDeleted, 0x5CDA5FC8, 0x33EE, 0x4FF3, 0x90, 0x94, 0xAE, 0x7B, 0xD8, 0x86, 0x8C, 0x4D, 100); + +// Name: System.IsFlagged -- PKEY_IsFlagged +// Type: Boolean -- VT_BOOL +// FormatID: 5DA84765-E3FF-4278-86B0-A27967FBDD03, 100 +DEFINE_PROPERTYKEY(PKEY_IsFlagged, 0x5DA84765, 0xE3FF, 0x4278, 0x86, 0xB0, 0xA2, 0x79, 0x67, 0xFB, 0xDD, 0x03, 100); + +// Name: System.IsFlaggedComplete -- PKEY_IsFlaggedComplete +// Type: Boolean -- VT_BOOL +// FormatID: A6F360D2-55F9-48DE-B909-620E090A647C, 100 +DEFINE_PROPERTYKEY(PKEY_IsFlaggedComplete, 0xA6F360D2, 0x55F9, 0x48DE, 0xB9, 0x09, 0x62, 0x0E, 0x09, 0x0A, 0x64, 0x7C, 100); + +// Name: System.IsIncomplete -- PKEY_IsIncomplete +// Type: Boolean -- VT_BOOL +// FormatID: 346C8BD1-2E6A-4C45-89A4-61B78E8E700F, 100 +// +// Identifies if the message was not completely received for some error condition. +DEFINE_PROPERTYKEY(PKEY_IsIncomplete, 0x346C8BD1, 0x2E6A, 0x4C45, 0x89, 0xA4, 0x61, 0xB7, 0x8E, 0x8E, 0x70, 0x0F, 100); + +// Name: System.IsRead -- PKEY_IsRead +// Type: Boolean -- VT_BOOL +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 10 +// +// Has the item been read? +DEFINE_PROPERTYKEY(PKEY_IsRead, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 10); + +// Name: System.IsSendToTarget -- PKEY_IsSendToTarget +// Type: Boolean -- VT_BOOL +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 33 +// +// Provided by certain shell folders. Return TRUE if the folder is a valid Send To target. +DEFINE_PROPERTYKEY(PKEY_IsSendToTarget, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 33); + +// Name: System.IsShared -- PKEY_IsShared +// Type: Boolean -- VT_BOOL +// FormatID: EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902, 100 +// +// Is this item shared? +DEFINE_PROPERTYKEY(PKEY_IsShared, 0xEF884C5B, 0x2BFE, 0x41BB, 0xAA, 0xE5, 0x76, 0xEE, 0xDF, 0x4F, 0x99, 0x02, 100); + +// Name: System.ItemAuthors -- PKEY_ItemAuthors +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D0A04F0A-462A-48A4-BB2F-3706E88DBD7D, 100 +// +// This is the generic list of authors associated with an item. +// +// For example, the artist name for a track is the item author. +DEFINE_PROPERTYKEY(PKEY_ItemAuthors, 0xD0A04F0A, 0x462A, 0x48A4, 0xBB, 0x2F, 0x37, 0x06, 0xE8, 0x8D, 0xBD, 0x7D, 100); + +// Name: System.ItemDate -- PKEY_ItemDate +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: F7DB74B4-4287-4103-AFBA-F1B13DCD75CF, 100 +// +// This is the main date for an item. The date of interest. +// +// For example, for photos this maps to System.Photo.DateTaken. +DEFINE_PROPERTYKEY(PKEY_ItemDate, 0xF7DB74B4, 0x4287, 0x4103, 0xAF, 0xBA, 0xF1, 0xB1, 0x3D, 0xCD, 0x75, 0xCF, 100); + +// Name: System.ItemFolderNameDisplay -- PKEY_ItemFolderNameDisplay +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 2 (PID_STG_DIRECTORY) +// +// This is the user-friendly display name of the parent folder of an item. +// +// If System.ItemFolderPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it +// should be derived appropriately by the data source from System.ItemFolderPathDisplay. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "bar" +// "\\server\share\mydir\goodnews.doc" "mydir" +// "\\server\share\numbers.xls" "share" +// "c:\foo\MyFolder" "foo" +// "/Mailbox Account/Inbox/'Re: Hello!'" "Inbox" +DEFINE_PROPERTYKEY(PKEY_ItemFolderNameDisplay, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 2); + +// Name: System.ItemFolderPathDisplay -- PKEY_ItemFolderPathDisplay +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 6 +// +// This is the user-friendly display path of the parent folder of an item. +// +// If System.ItemPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it should +// be derived appropriately by the data source from System.ItemPathDisplay. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "c:\foo\bar" +// "\\server\share\mydir\goodnews.doc" "\\server\share\mydir" +// "\\server\share\numbers.xls" "\\server\share" +// "c:\foo\MyFolder" "c:\foo" +// "/Mailbox Account/Inbox/'Re: Hello!'" "/Mailbox Account/Inbox" +DEFINE_PROPERTYKEY(PKEY_ItemFolderPathDisplay, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 6); + +// Name: System.ItemFolderPathDisplayNarrow -- PKEY_ItemFolderPathDisplayNarrow +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DABD30ED-0043-4789-A7F8-D013A4736622, 100 +// +// This is the user-friendly display path of the parent folder of an item. The format of the string +// should be tailored such that the folder name comes first, to optimize for a narrow viewing column. +// +// If the folder is a file folder, the value includes localized names if they are present. +// +// If System.ItemFolderPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it should +// be derived appropriately by the data source from System.ItemFolderPathDisplay. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "bar (c:\foo)" +// "\\server\share\mydir\goodnews.doc" "mydir (\\server\share)" +// "\\server\share\numbers.xls" "share (\\server)" +// "c:\foo\MyFolder" "foo (c:\)" +// "/Mailbox Account/Inbox/'Re: Hello!'" "Inbox (/Mailbox Account)" +DEFINE_PROPERTYKEY(PKEY_ItemFolderPathDisplayNarrow, 0xDABD30ED, 0x0043, 0x4789, 0xA7, 0xF8, 0xD0, 0x13, 0xA4, 0x73, 0x66, 0x22, 100); + +// Name: System.ItemName -- PKEY_ItemName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6B8DA074-3B5C-43BC-886F-0A2CDCE00B6F, 100 +// +// This is the base-name of the System.ItemNameDisplay. +// +// If the item is a file this property +// includes the extension in all cases, and will be localized if a localized name is available. +// +// If the item is a message, then the value of this property does not include the forwarding or +// reply prefixes (see System.ItemNamePrefix). +DEFINE_PROPERTYKEY(PKEY_ItemName, 0x6B8DA074, 0x3B5C, 0x43BC, 0x88, 0x6F, 0x0A, 0x2C, 0xDC, 0xE0, 0x0B, 0x6F, 100); + +// Name: System.ItemNameDisplay -- PKEY_ItemNameDisplay +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 10 (PID_STG_NAME) +// +// This is the display name in "most complete" form. This is the best effort unique representation +// of the name of an item that makes sense for end users to read. It is the concatentation of +// System.ItemNamePrefix and System.ItemName. +// +// If the item is a file this property +// includes the extension in all cases, and will be localized if a localized name is available. +// +// There are acceptable cases when System.FileName is not VT_EMPTY, yet the value of this property +// is completely different. Email messages are a key example. If the item is an email message, +// the item name is likely the subject. In that case, the value must be the concatenation of the +// System.ItemNamePrefix and System.ItemName. Since the value of System.ItemNamePrefix excludes +// any trailing whitespace, the concatenation must include a whitespace when generating System.ItemNameDisplay. +// +// Note that this property is not guaranteed to be unique, but the idea is to promote the most likely +// candidate that can be unique and also makes sense for end users. For example, for documents, you +// might think about using System.Title as the System.ItemNameDisplay, but in practice the title of +// the documents may not be useful or unique enough to be of value as the sole System.ItemNameDisplay. +// Instead, providing the value of System.FileName as the value of System.ItemNameDisplay is a better +// candidate. In Windows Mail, the emails are stored in the file system as .eml files and the +// System.FileName for those files are not human-friendly as they contain GUIDs. In this example, +// promoting System.Subject as System.ItemNameDisplay makes more sense. +// +// Compatibility notes: +// +// Shell folder implementations on Vista: use PKEY_ItemNameDisplay for the name column when +// you want Explorer to call ISF::GetDisplayNameOf(SHGDN_NORMAL) to get the value of the name. Use +// another PKEY (like PKEY_ItemName) when you want Explorer to call either the folder's property store or +// ISF2::GetDetailsEx in order to get the value of the name. +// +// Shell folder implementations on XP: the first column needs to be the name column, and Explorer +// will call ISF::GetDisplayNameOf to get the value of the name. The PKEY/SCID does not matter. +// +// Example values: +// +// File: "hello.txt" +// Message: "Re: Let's talk about Tom's argyle socks!" +// Device folder: "song.wma" +// Folder: "Documents" +DEFINE_PROPERTYKEY(PKEY_ItemNameDisplay, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 10); + +// Name: System.ItemNamePrefix -- PKEY_ItemNamePrefix +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D7313FF1-A77A-401C-8C99-3DBDD68ADD36, 100 +// +// This is the prefix of an item, used for email messages. +// where the subject begins with "Re:" which is the prefix. +// +// If the item is a file, then the value of this property is VT_EMPTY. +// +// If the item is a message, then the value of this property is the forwarding or reply +// prefixes (including delimiting colon, but no whitespace), or VT_EMPTY if there is no prefix. +// +// Example values: +// +// System.ItemNamePrefix System.ItemName System.ItemNameDisplay +// --------------------- ------------------- ---------------------- +// VT_EMPTY "Great day" "Great day" +// "Re:" "Great day" "Re: Great day" +// "Fwd: " "Monthly budget" "Fwd: Monthly budget" +// VT_EMPTY "accounts.xls" "accounts.xls" +DEFINE_PROPERTYKEY(PKEY_ItemNamePrefix, 0xD7313FF1, 0xA77A, 0x401C, 0x8C, 0x99, 0x3D, 0xBD, 0xD6, 0x8A, 0xDD, 0x36, 100); + +// Name: System.ItemParticipants -- PKEY_ItemParticipants +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D4D0AA16-9948-41A4-AA85-D97FF9646993, 100 +// +// This is the generic list of people associated with an item and who contributed +// to the item. +// +// For example, this is the combination of people in the To list, Cc list and +// sender of an email message. +DEFINE_PROPERTYKEY(PKEY_ItemParticipants, 0xD4D0AA16, 0x9948, 0x41A4, 0xAA, 0x85, 0xD9, 0x7F, 0xF9, 0x64, 0x69, 0x93, 100); + +// Name: System.ItemPathDisplay -- PKEY_ItemPathDisplay +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 7 +// +// This is the user-friendly display path to the item. +// +// If the item is a file or folder this property +// includes the extension in all cases, and will be localized if a localized name is available. +// +// For other items,this is the user-friendly equivalent, assuming the item exists in hierarchical storage. +// +// Unlike System.ItemUrl, this property value does not include the URL scheme. +// +// To parse an item path, use System.ItemUrl or System.ParsingPath. To reference shell +// namespace items using shell APIs, use System.ParsingPath. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "c:\foo\bar\hello.txt" +// "\\server\share\mydir\goodnews.doc" "\\server\share\mydir\goodnews.doc" +// "\\server\share\numbers.xls" "\\server\share\numbers.xls" +// "c:\foo\MyFolder" "c:\foo\MyFolder" +// "/Mailbox Account/Inbox/'Re: Hello!'" "/Mailbox Account/Inbox/'Re: Hello!'" +DEFINE_PROPERTYKEY(PKEY_ItemPathDisplay, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 7); + +// Name: System.ItemPathDisplayNarrow -- PKEY_ItemPathDisplayNarrow +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 8 +// +// This is the user-friendly display path to the item. The format of the string should be +// tailored such that the name comes first, to optimize for a narrow viewing column. +// +// If the item is a file, the value excludes the file extension, and includes localized names if they are present. +// If the item is a message, the value includes the System.ItemNamePrefix. +// +// To parse an item path, use System.ItemUrl or System.ParsingPath. +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "hello (c:\foo\bar)" +// "\\server\share\mydir\goodnews.doc" "goodnews (\\server\share\mydir)" +// "\\server\share\folder" "folder (\\server\share)" +// "c:\foo\MyFolder" "MyFolder (c:\foo)" +// "/Mailbox Account/Inbox/'Re: Hello!'" "Re: Hello! (/Mailbox Account/Inbox)" +DEFINE_PROPERTYKEY(PKEY_ItemPathDisplayNarrow, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 8); + +// Name: System.ItemType -- PKEY_ItemType +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 11 +// +// This is the canonical type of the item and is intended to be programmatically +// parsed. +// +// If there is no canonical type, the value is VT_EMPTY. +// +// If the item is a file (ie, System.FileName is not VT_EMPTY), the value is the same as +// System.FileExtension. +// +// Use System.ItemTypeText when you want to display the type to end users in a view. (If +// the item is a file, passing the System.ItemType value to PSFormatForDisplay will +// result in the same value as System.ItemTypeText.) +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" ".txt" +// "\\server\share\mydir\goodnews.doc" ".doc" +// "\\server\share\folder" "Directory" +// "c:\foo\MyFolder" "Directory" +// [desktop] "Folder" +// "/Mailbox Account/Inbox/'Re: Hello!'" "MAPI/IPM.Message" +DEFINE_PROPERTYKEY(PKEY_ItemType, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 11); + +// Name: System.ItemTypeText -- PKEY_ItemTypeText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 4 (PID_STG_STORAGETYPE) +// +// This is the user friendly type name of the item. This is not intended to be +// programmatically parsed. +// +// If System.ItemType is VT_EMPTY, the value of this property is also VT_EMPTY. +// +// If the item is a file, the value of this property is the same as if you passed the +// file's System.ItemType value to PSFormatForDisplay. +// +// This property should not be confused with System.Kind, where System.Kind is a high-level +// user friendly kind name. For example, for a document, System.Kind = "Document" and +// System.Item.Type = ".doc" and System.Item.TypeText = "Microsoft Word Document" +// +// Example values: +// +// If the path is... The property value is... +// ----------------- ------------------------ +// "c:\foo\bar\hello.txt" "Text File" +// "\\server\share\mydir\goodnews.doc" "Microsoft Word Document" +// "\\server\share\folder" "File Folder" +// "c:\foo\MyFolder" "File Folder" +// "/Mailbox Account/Inbox/'Re: Hello!'" "Outlook E-Mail Message" +DEFINE_PROPERTYKEY(PKEY_ItemTypeText, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 4); + +// Name: System.ItemUrl -- PKEY_ItemUrl +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Query) 49691C90-7E17-101A-A91C-08002B2ECDA9, 9 (PROPID_QUERY_VIRTUALPATH) +// +// This always represents a well formed URL that points to the item. +// +// To reference shell namespace items using shell APIs, use System.ParsingPath. +// +// Example values: +// +// Files: "file:///c:/foo/bar/hello.txt" +// "csc://{GUID}/..." +// Messages: "mapi://..." +DEFINE_PROPERTYKEY(PKEY_ItemUrl, 0x49691C90, 0x7E17, 0x101A, 0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9, 9); + +// Name: System.Keywords -- PKEY_Keywords +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) Legacy code may treat this as VT_LPSTR. +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 5 (PIDSI_KEYWORDS) +// +// The keywords for the item. Also referred to as tags. +DEFINE_PROPERTYKEY(PKEY_Keywords, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 5); + +// Name: System.Kind -- PKEY_Kind +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 1E3EE840-BC2B-476C-8237-2ACD1A839B22, 3 +// +// System.Kind is used to map extensions to various .Search folders. +// Extensions are mapped to Kinds at HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\KindMap +// The list of kinds is not extensible. +DEFINE_PROPERTYKEY(PKEY_Kind, 0x1E3EE840, 0xBC2B, 0x476C, 0x82, 0x37, 0x2A, 0xCD, 0x1A, 0x83, 0x9B, 0x22, 3); + +// Possible discrete values for PKEY_Kind are: +#define KIND_CALENDAR L"calendar" +#define KIND_COMMUNICATION L"communication" +#define KIND_CONTACT L"contact" +#define KIND_DOCUMENT L"document" +#define KIND_EMAIL L"email" +#define KIND_FEED L"feed" +#define KIND_FOLDER L"folder" +#define KIND_GAME L"game" +#define KIND_INSTANTMESSAGE L"instantmessage" +#define KIND_JOURNAL L"journal" +#define KIND_LINK L"link" +#define KIND_MOVIE L"movie" +#define KIND_MUSIC L"music" +#define KIND_NOTE L"note" +#define KIND_PICTURE L"picture" +#define KIND_PROGRAM L"program" +#define KIND_RECORDEDTV L"recordedtv" +#define KIND_SEARCHFOLDER L"searchfolder" +#define KIND_TASK L"task" +#define KIND_VIDEO L"video" +#define KIND_WEBHISTORY L"webhistory" + +// Name: System.KindText -- PKEY_KindText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F04BEF95-C585-4197-A2B7-DF46FDC9EE6D, 100 +// +// This is the user-friendly form of System.Kind. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_KindText, 0xF04BEF95, 0xC585, 0x4197, 0xA2, 0xB7, 0xDF, 0x46, 0xFD, 0xC9, 0xEE, 0x6D, 100); + +// Name: System.Language -- PKEY_Language +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 28 +// +// +DEFINE_PROPERTYKEY(PKEY_Language, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 28); + +// Name: System.MileageInformation -- PKEY_MileageInformation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: FDF84370-031A-4ADD-9E91-0D775F1C6605, 100 +DEFINE_PROPERTYKEY(PKEY_MileageInformation, 0xFDF84370, 0x031A, 0x4ADD, 0x9E, 0x91, 0x0D, 0x77, 0x5F, 0x1C, 0x66, 0x05, 100); + +// Name: System.MIMEType -- PKEY_MIMEType +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 0B63E350-9CCC-11D0-BCDB-00805FCCCE04, 5 +// +// The MIME type. Eg, for EML files: 'message/rfc822'. +DEFINE_PROPERTYKEY(PKEY_MIMEType, 0x0B63E350, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 5); + +// Name: System.Null -- PKEY_Null +// Type: Null -- VT_NULL +// FormatID: 00000000-0000-0000-0000-000000000000, 0 +DEFINE_PROPERTYKEY(PKEY_Null, 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0); + +// Name: System.OfflineAvailability -- PKEY_OfflineAvailability +// Type: UInt32 -- VT_UI4 +// FormatID: A94688B6-7D9F-4570-A648-E3DFC0AB2B3F, 100 +DEFINE_PROPERTYKEY(PKEY_OfflineAvailability, 0xA94688B6, 0x7D9F, 0x4570, 0xA6, 0x48, 0xE3, 0xDF, 0xC0, 0xAB, 0x2B, 0x3F, 100); + +// Possible discrete values for PKEY_OfflineAvailability are: +#define OFFLINEAVAILABILITY_NOT_AVAILABLE 0ul +#define OFFLINEAVAILABILITY_AVAILABLE 1ul +#define OFFLINEAVAILABILITY_ALWAYS_AVAILABLE 2ul + +// Name: System.OfflineStatus -- PKEY_OfflineStatus +// Type: UInt32 -- VT_UI4 +// FormatID: 6D24888F-4718-4BDA-AFED-EA0FB4386CD8, 100 +DEFINE_PROPERTYKEY(PKEY_OfflineStatus, 0x6D24888F, 0x4718, 0x4BDA, 0xAF, 0xED, 0xEA, 0x0F, 0xB4, 0x38, 0x6C, 0xD8, 100); + +// Possible discrete values for PKEY_OfflineStatus are: +#define OFFLINESTATUS_ONLINE 0ul +#define OFFLINESTATUS_OFFLINE 1ul +#define OFFLINESTATUS_OFFLINE_FORCED 2ul +#define OFFLINESTATUS_OFFLINE_SLOW 3ul +#define OFFLINESTATUS_OFFLINE_ERROR 4ul +#define OFFLINESTATUS_OFFLINE_ITEM_VERSION_CONFLICT 5ul +#define OFFLINESTATUS_OFFLINE_SUSPENDED 6ul + +// Name: System.OriginalFileName -- PKEY_OriginalFileName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSFMTID_VERSION) 0CEF7D53-FA64-11D1-A203-0000F81FEDEE, 6 +// +// +DEFINE_PROPERTYKEY(PKEY_OriginalFileName, 0x0CEF7D53, 0xFA64, 0x11D1, 0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE, 6); + +// Name: System.ParentalRating -- PKEY_ParentalRating +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 21 (PIDMSI_PARENTAL_RATING) +// +// +DEFINE_PROPERTYKEY(PKEY_ParentalRating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 21); + +// Name: System.ParentalRatingReason -- PKEY_ParentalRatingReason +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 10984E0A-F9F2-4321-B7EF-BAF195AF4319, 100 +DEFINE_PROPERTYKEY(PKEY_ParentalRatingReason, 0x10984E0A, 0xF9F2, 0x4321, 0xB7, 0xEF, 0xBA, 0xF1, 0x95, 0xAF, 0x43, 0x19, 100); + +// Name: System.ParentalRatingsOrganization -- PKEY_ParentalRatingsOrganization +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A7FE0840-1344-46F0-8D37-52ED712A4BF9, 100 +DEFINE_PROPERTYKEY(PKEY_ParentalRatingsOrganization, 0xA7FE0840, 0x1344, 0x46F0, 0x8D, 0x37, 0x52, 0xED, 0x71, 0x2A, 0x4B, 0xF9, 100); + +// Name: System.ParsingBindContext -- PKEY_ParsingBindContext +// Type: Any -- VT_NULL Legacy code may treat this as VT_UNKNOWN. +// FormatID: DFB9A04D-362F-4CA3-B30B-0254B17B5B84, 100 +// +// used to get the IBindCtx for an item for parsing +DEFINE_PROPERTYKEY(PKEY_ParsingBindContext, 0xDFB9A04D, 0x362F, 0x4CA3, 0xB3, 0x0B, 0x02, 0x54, 0xB1, 0x7B, 0x5B, 0x84, 100); + +// Name: System.ParsingName -- PKEY_ParsingName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 24 +// +// The shell namespace name of an item relative to a parent folder. This name may be passed to +// IShellFolder::ParseDisplayName() of the parent shell folder. +DEFINE_PROPERTYKEY(PKEY_ParsingName, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 24); + +// Name: System.ParsingPath -- PKEY_ParsingPath +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 30 +// +// This is the shell namespace path to the item. This path may be passed to +// SHParseDisplayName to parse the path to the correct shell folder. +// +// If the item is a file, the value is identical to System.ItemPathDisplay. +// +// If the item cannot be accessed through the shell namespace, this value is VT_EMPTY. +DEFINE_PROPERTYKEY(PKEY_ParsingPath, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 30); + +// Name: System.PerceivedType -- PKEY_PerceivedType +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 9 +// +// The perceived type of a shell item, based upon its canonical type. +DEFINE_PROPERTYKEY(PKEY_PerceivedType, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 9); + +// For the enumerated values of PKEY_PerceivedType, see the PERCEIVED_TYPE_* values in shtypes.idl. + +// Name: System.PercentFull -- PKEY_PercentFull +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 5 (Filesystem Volume Properties) +// +// The amount filled as a percentage, multiplied by 100 (ie, the valid range is 0 through 100). +DEFINE_PROPERTYKEY(PKEY_PercentFull, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 5); + +// Name: System.Priority -- PKEY_Priority +// Type: UInt16 -- VT_UI2 +// FormatID: 9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4, 5 +// +// +DEFINE_PROPERTYKEY(PKEY_Priority, 0x9C1FCF74, 0x2D97, 0x41BA, 0xB4, 0xAE, 0xCB, 0x2E, 0x36, 0x61, 0xA6, 0xE4, 5); + +// Possible discrete values for PKEY_Priority are: +#define PRIORITY_PROP_LOW 0u +#define PRIORITY_PROP_NORMAL 1u +#define PRIORITY_PROP_HIGH 2u + +// Name: System.PriorityText -- PKEY_PriorityText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D98BE98B-B86B-4095-BF52-9D23B2E0A752, 100 +// +// This is the user-friendly form of System.Priority. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_PriorityText, 0xD98BE98B, 0xB86B, 0x4095, 0xBF, 0x52, 0x9D, 0x23, 0xB2, 0xE0, 0xA7, 0x52, 100); + +// Name: System.Project -- PKEY_Project +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 39A7F922-477C-48DE-8BC8-B28441E342E3, 100 +DEFINE_PROPERTYKEY(PKEY_Project, 0x39A7F922, 0x477C, 0x48DE, 0x8B, 0xC8, 0xB2, 0x84, 0x41, 0xE3, 0x42, 0xE3, 100); + +// Name: System.ProviderItemID -- PKEY_ProviderItemID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F21D9941-81F0-471A-ADEE-4E74B49217ED, 100 +// +// +DEFINE_PROPERTYKEY(PKEY_ProviderItemID, 0xF21D9941, 0x81F0, 0x471A, 0xAD, 0xEE, 0x4E, 0x74, 0xB4, 0x92, 0x17, 0xED, 100); + +// Name: System.Rating -- PKEY_Rating +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 9 (PIDMSI_RATING) +// +// Indicates the users preference rating of an item on a scale of 0-99 (0 = unrated, 1-12 = One Star, +// 13-37 = Two Stars, 38-62 = Three Stars, 63-87 = Four Stars, 88-99 = Five Stars). +DEFINE_PROPERTYKEY(PKEY_Rating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 9); + +// Use the following constants to convert between visual stars and the ratings value: +#define RATING_UNRATED_MIN 0ul +#define RATING_UNRATED_SET 0ul +#define RATING_UNRATED_MAX 0ul + +#define RATING_ONE_STAR_MIN 1ul +#define RATING_ONE_STAR_SET 1ul +#define RATING_ONE_STAR_MAX 12ul + +#define RATING_TWO_STARS_MIN 13ul +#define RATING_TWO_STARS_SET 25ul +#define RATING_TWO_STARS_MAX 37ul + +#define RATING_THREE_STARS_MIN 38ul +#define RATING_THREE_STARS_SET 50ul +#define RATING_THREE_STARS_MAX 62ul + +#define RATING_FOUR_STARS_MIN 63ul +#define RATING_FOUR_STARS_SET 75ul +#define RATING_FOUR_STARS_MAX 87ul + +#define RATING_FIVE_STARS_MIN 88ul +#define RATING_FIVE_STARS_SET 99ul +#define RATING_FIVE_STARS_MAX 99ul + + +// Name: System.RatingText -- PKEY_RatingText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 90197CA7-FD8F-4E8C-9DA3-B57E1E609295, 100 +// +// This is the user-friendly form of System.Rating. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_RatingText, 0x90197CA7, 0xFD8F, 0x4E8C, 0x9D, 0xA3, 0xB5, 0x7E, 0x1E, 0x60, 0x92, 0x95, 100); + +// Name: System.Sensitivity -- PKEY_Sensitivity +// Type: UInt16 -- VT_UI2 +// FormatID: F8D3F6AC-4874-42CB-BE59-AB454B30716A, 100 +// +// +DEFINE_PROPERTYKEY(PKEY_Sensitivity, 0xF8D3F6AC, 0x4874, 0x42CB, 0xBE, 0x59, 0xAB, 0x45, 0x4B, 0x30, 0x71, 0x6A, 100); + +// Possible discrete values for PKEY_Sensitivity are: +#define SENSITIVITY_PROP_NORMAL 0u +#define SENSITIVITY_PROP_PERSONAL 1u +#define SENSITIVITY_PROP_PRIVATE 2u +#define SENSITIVITY_PROP_CONFIDENTIAL 3u + +// Name: System.SensitivityText -- PKEY_SensitivityText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D0C7F054-3F72-4725-8527-129A577CB269, 100 +// +// This is the user-friendly form of System.Sensitivity. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_SensitivityText, 0xD0C7F054, 0x3F72, 0x4725, 0x85, 0x27, 0x12, 0x9A, 0x57, 0x7C, 0xB2, 0x69, 100); + +// Name: System.SFGAOFlags -- PKEY_SFGAOFlags +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 25 +// +// IShellFolder::GetAttributesOf flags, with SFGAO_PKEYSFGAOMASK attributes masked out. +DEFINE_PROPERTYKEY(PKEY_SFGAOFlags, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 25); + +// Name: System.SharedWith -- PKEY_SharedWith +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902, 200 +// +// Who is the item shared with? +DEFINE_PROPERTYKEY(PKEY_SharedWith, 0xEF884C5B, 0x2BFE, 0x41BB, 0xAA, 0xE5, 0x76, 0xEE, 0xDF, 0x4F, 0x99, 0x02, 200); + +// Name: System.ShareUserRating -- PKEY_ShareUserRating +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 12 (PIDMSI_SHARE_USER_RATING) +// +// +DEFINE_PROPERTYKEY(PKEY_ShareUserRating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 12); + +// Name: System.Shell.OmitFromView -- PKEY_Shell_OmitFromView +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DE35258C-C695-4CBC-B982-38B0AD24CED0, 2 +// +// Set this to a string value of 'True' to omit this item from shell views +DEFINE_PROPERTYKEY(PKEY_Shell_OmitFromView, 0xDE35258C, 0xC695, 0x4CBC, 0xB9, 0x82, 0x38, 0xB0, 0xAD, 0x24, 0xCE, 0xD0, 2); + +// Name: System.SimpleRating -- PKEY_SimpleRating +// Type: UInt32 -- VT_UI4 +// FormatID: A09F084E-AD41-489F-8076-AA5BE3082BCA, 100 +// +// Indicates the users preference rating of an item on a scale of 0-5 (0=unrated, 1=One Star, 2=Two Stars, 3=Three Stars, +// 4=Four Stars, 5=Five Stars) +DEFINE_PROPERTYKEY(PKEY_SimpleRating, 0xA09F084E, 0xAD41, 0x489F, 0x80, 0x76, 0xAA, 0x5B, 0xE3, 0x08, 0x2B, 0xCA, 100); + +// Name: System.Size -- PKEY_Size +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 12 (PID_STG_SIZE) +// +// +DEFINE_PROPERTYKEY(PKEY_Size, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 12); + +// Name: System.SoftwareUsed -- PKEY_SoftwareUsed +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 305 +// +// PropertyTagSoftwareUsed +DEFINE_PROPERTYKEY(PKEY_SoftwareUsed, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 305); + +// Name: System.SourceItem -- PKEY_SourceItem +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 668CDFA5-7A1B-4323-AE4B-E527393A1D81, 100 +DEFINE_PROPERTYKEY(PKEY_SourceItem, 0x668CDFA5, 0x7A1B, 0x4323, 0xAE, 0x4B, 0xE5, 0x27, 0x39, 0x3A, 0x1D, 0x81, 100); + +// Name: System.StartDate -- PKEY_StartDate +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 48FD6EC8-8A12-4CDF-A03E-4EC5A511EDDE, 100 +DEFINE_PROPERTYKEY(PKEY_StartDate, 0x48FD6EC8, 0x8A12, 0x4CDF, 0xA0, 0x3E, 0x4E, 0xC5, 0xA5, 0x11, 0xED, 0xDE, 100); + +// Name: System.Status -- PKEY_Status +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_IntSite) 000214A1-0000-0000-C000-000000000046, 9 +DEFINE_PROPERTYKEY(PKEY_Status, 0x000214A1, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 9); + +// Name: System.Subject -- PKEY_Subject +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 3 (PIDSI_SUBJECT) +// +// +DEFINE_PROPERTYKEY(PKEY_Subject, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 3); + +// Name: System.Thumbnail -- PKEY_Thumbnail +// Type: Clipboard -- VT_CF +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 17 (PIDSI_THUMBNAIL) +// +// A data that represents the thumbnail in VT_CF format. +DEFINE_PROPERTYKEY(PKEY_Thumbnail, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 17); + +// Name: System.ThumbnailCacheId -- PKEY_ThumbnailCacheId +// Type: UInt64 -- VT_UI8 +// FormatID: 446D16B1-8DAD-4870-A748-402EA43D788C, 100 +// +// Unique value that can be used as a key to cache thumbnails. The value changes when the name, volume, or data modified +// of an item changes. +DEFINE_PROPERTYKEY(PKEY_ThumbnailCacheId, 0x446D16B1, 0x8DAD, 0x4870, 0xA7, 0x48, 0x40, 0x2E, 0xA4, 0x3D, 0x78, 0x8C, 100); + +// Name: System.ThumbnailStream -- PKEY_ThumbnailStream +// Type: Stream -- VT_STREAM +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 27 +// +// Data that represents the thumbnail in VT_STREAM format that GDI+/WindowsCodecs supports (jpg, png, etc). +DEFINE_PROPERTYKEY(PKEY_ThumbnailStream, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 27); + +// Name: System.Title -- PKEY_Title +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) Legacy code may treat this as VT_LPSTR. +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 2 (PIDSI_TITLE) +// +// Title of item. +DEFINE_PROPERTYKEY(PKEY_Title, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 2); + +// Name: System.TotalFileSize -- PKEY_TotalFileSize +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 14 +// +// +DEFINE_PROPERTYKEY(PKEY_TotalFileSize, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 14); + +// Name: System.Trademarks -- PKEY_Trademarks +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSFMTID_VERSION) 0CEF7D53-FA64-11D1-A203-0000F81FEDEE, 9 (PIDVSI_Trademarks) +// +// +DEFINE_PROPERTYKEY(PKEY_Trademarks, 0x0CEF7D53, 0xFA64, 0x11D1, 0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE, 9); + +//----------------------------------------------------------------------------- +// Document properties + + + +// Name: System.Document.ByteCount -- PKEY_Document_ByteCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 4 (PIDDSI_BYTECOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_ByteCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 4); + +// Name: System.Document.CharacterCount -- PKEY_Document_CharacterCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 16 (PIDSI_CHARCOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_CharacterCount, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 16); + +// Name: System.Document.ClientID -- PKEY_Document_ClientID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 276D7BB0-5B34-4FB0-AA4B-158ED12A1809, 100 +DEFINE_PROPERTYKEY(PKEY_Document_ClientID, 0x276D7BB0, 0x5B34, 0x4FB0, 0xAA, 0x4B, 0x15, 0x8E, 0xD1, 0x2A, 0x18, 0x09, 100); + +// Name: System.Document.Contributor -- PKEY_Document_Contributor +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: F334115E-DA1B-4509-9B3D-119504DC7ABB, 100 +DEFINE_PROPERTYKEY(PKEY_Document_Contributor, 0xF334115E, 0xDA1B, 0x4509, 0x9B, 0x3D, 0x11, 0x95, 0x04, 0xDC, 0x7A, 0xBB, 100); + +// Name: System.Document.DateCreated -- PKEY_Document_DateCreated +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 12 (PIDSI_CREATE_DTM) +// +// This property is stored in the document, not obtained from the file system. +DEFINE_PROPERTYKEY(PKEY_Document_DateCreated, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 12); + +// Name: System.Document.DatePrinted -- PKEY_Document_DatePrinted +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 11 (PIDSI_LASTPRINTED) +// +// Legacy name: "DocLastPrinted". +DEFINE_PROPERTYKEY(PKEY_Document_DatePrinted, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 11); + +// Name: System.Document.DateSaved -- PKEY_Document_DateSaved +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 13 (PIDSI_LASTSAVE_DTM) +// +// Legacy name: "DocLastSavedTm". +DEFINE_PROPERTYKEY(PKEY_Document_DateSaved, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 13); + +// Name: System.Document.Division -- PKEY_Document_Division +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 1E005EE6-BF27-428B-B01C-79676ACD2870, 100 +DEFINE_PROPERTYKEY(PKEY_Document_Division, 0x1E005EE6, 0xBF27, 0x428B, 0xB0, 0x1C, 0x79, 0x67, 0x6A, 0xCD, 0x28, 0x70, 100); + +// Name: System.Document.DocumentID -- PKEY_Document_DocumentID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E08805C8-E395-40DF-80D2-54F0D6C43154, 100 +DEFINE_PROPERTYKEY(PKEY_Document_DocumentID, 0xE08805C8, 0xE395, 0x40DF, 0x80, 0xD2, 0x54, 0xF0, 0xD6, 0xC4, 0x31, 0x54, 100); + +// Name: System.Document.HiddenSlideCount -- PKEY_Document_HiddenSlideCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 9 (PIDDSI_HIDDENCOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_HiddenSlideCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 9); + +// Name: System.Document.LastAuthor -- PKEY_Document_LastAuthor +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 8 (PIDSI_LASTAUTHOR) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_LastAuthor, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 8); + +// Name: System.Document.LineCount -- PKEY_Document_LineCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 5 (PIDDSI_LINECOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_LineCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 5); + +// Name: System.Document.Manager -- PKEY_Document_Manager +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 14 (PIDDSI_MANAGER) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_Manager, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 14); + +// Name: System.Document.MultimediaClipCount -- PKEY_Document_MultimediaClipCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 10 (PIDDSI_MMCLIPCOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_MultimediaClipCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 10); + +// Name: System.Document.NoteCount -- PKEY_Document_NoteCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 8 (PIDDSI_NOTECOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_NoteCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 8); + +// Name: System.Document.PageCount -- PKEY_Document_PageCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 14 (PIDSI_PAGECOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_PageCount, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 14); + +// Name: System.Document.ParagraphCount -- PKEY_Document_ParagraphCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 6 (PIDDSI_PARCOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_ParagraphCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 6); + +// Name: System.Document.PresentationFormat -- PKEY_Document_PresentationFormat +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 3 (PIDDSI_PRESFORMAT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_PresentationFormat, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 3); + +// Name: System.Document.RevisionNumber -- PKEY_Document_RevisionNumber +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 9 (PIDSI_REVNUMBER) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_RevisionNumber, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 9); + +// Name: System.Document.Security -- PKEY_Document_Security +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 19 +// +// Access control information, from SummaryInfo propset +DEFINE_PROPERTYKEY(PKEY_Document_Security, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 19); + +// Name: System.Document.SlideCount -- PKEY_Document_SlideCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 7 (PIDDSI_SLIDECOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_SlideCount, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 7); + +// Name: System.Document.Template -- PKEY_Document_Template +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 7 (PIDSI_TEMPLATE) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_Template, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 7); + +// Name: System.Document.TotalEditingTime -- PKEY_Document_TotalEditingTime +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 10 (PIDSI_EDITTIME) +// +// 100ns units, not milliseconds. VT_FILETIME for IPropertySetStorage handlers (legacy) +DEFINE_PROPERTYKEY(PKEY_Document_TotalEditingTime, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 10); + +// Name: System.Document.Version -- PKEY_Document_Version +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DocumentSummaryInformation) D5CDD502-2E9C-101B-9397-08002B2CF9AE, 29 +DEFINE_PROPERTYKEY(PKEY_Document_Version, 0xD5CDD502, 0x2E9C, 0x101B, 0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE, 29); + +// Name: System.Document.WordCount -- PKEY_Document_WordCount +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_SummaryInformation) F29F85E0-4FF9-1068-AB91-08002B27B3D9, 15 (PIDSI_WORDCOUNT) +// +// +DEFINE_PROPERTYKEY(PKEY_Document_WordCount, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 15); + + + +//----------------------------------------------------------------------------- +// DRM properties + +// Name: System.DRM.DatePlayExpires -- PKEY_DRM_DatePlayExpires +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_DRM) AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED, 6 (PIDDRSI_PLAYEXPIRES) +// +// Indicates when play expires for digital rights management. +DEFINE_PROPERTYKEY(PKEY_DRM_DatePlayExpires, 0xAEAC19E4, 0x89AE, 0x4508, 0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED, 6); + +// Name: System.DRM.DatePlayStarts -- PKEY_DRM_DatePlayStarts +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_DRM) AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED, 5 (PIDDRSI_PLAYSTARTS) +// +// Indicates when play starts for digital rights management. +DEFINE_PROPERTYKEY(PKEY_DRM_DatePlayStarts, 0xAEAC19E4, 0x89AE, 0x4508, 0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED, 5); + +// Name: System.DRM.Description -- PKEY_DRM_Description +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_DRM) AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED, 3 (PIDDRSI_DESCRIPTION) +// +// Displays the description for digital rights management. +DEFINE_PROPERTYKEY(PKEY_DRM_Description, 0xAEAC19E4, 0x89AE, 0x4508, 0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED, 3); + +// Name: System.DRM.IsProtected -- PKEY_DRM_IsProtected +// Type: Boolean -- VT_BOOL +// FormatID: (FMTID_DRM) AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED, 2 (PIDDRSI_PROTECTED) +// +// +DEFINE_PROPERTYKEY(PKEY_DRM_IsProtected, 0xAEAC19E4, 0x89AE, 0x4508, 0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED, 2); + +// Name: System.DRM.PlayCount -- PKEY_DRM_PlayCount +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_DRM) AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED, 4 (PIDDRSI_PLAYCOUNT) +// +// Indicates the play count for digital rights management. +DEFINE_PROPERTYKEY(PKEY_DRM_PlayCount, 0xAEAC19E4, 0x89AE, 0x4508, 0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED, 4); + +//----------------------------------------------------------------------------- +// GPS properties + +// Name: System.GPS.Altitude -- PKEY_GPS_Altitude +// Type: Double -- VT_R8 +// FormatID: 827EDB4F-5B73-44A7-891D-FDFFABEA35CA, 100 +// +// Indicates the altitude based on the reference in PKEY_GPS_AltitudeRef. Calculated from PKEY_GPS_AltitudeNumerator and +// PKEY_GPS_AltitudeDenominator +DEFINE_PROPERTYKEY(PKEY_GPS_Altitude, 0x827EDB4F, 0x5B73, 0x44A7, 0x89, 0x1D, 0xFD, 0xFF, 0xAB, 0xEA, 0x35, 0xCA, 100); + +// Name: System.GPS.AltitudeDenominator -- PKEY_GPS_AltitudeDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 78342DCB-E358-4145-AE9A-6BFE4E0F9F51, 100 +// +// Denominator of PKEY_GPS_Altitude +DEFINE_PROPERTYKEY(PKEY_GPS_AltitudeDenominator, 0x78342DCB, 0xE358, 0x4145, 0xAE, 0x9A, 0x6B, 0xFE, 0x4E, 0x0F, 0x9F, 0x51, 100); + +// Name: System.GPS.AltitudeNumerator -- PKEY_GPS_AltitudeNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 2DAD1EB7-816D-40D3-9EC3-C9773BE2AADE, 100 +// +// Numerator of PKEY_GPS_Altitude +DEFINE_PROPERTYKEY(PKEY_GPS_AltitudeNumerator, 0x2DAD1EB7, 0x816D, 0x40D3, 0x9E, 0xC3, 0xC9, 0x77, 0x3B, 0xE2, 0xAA, 0xDE, 100); + +// Name: System.GPS.AltitudeRef -- PKEY_GPS_AltitudeRef +// Type: Byte -- VT_UI1 +// FormatID: 46AC629D-75EA-4515-867F-6DC4321C5844, 100 +// +// Indicates the reference for the altitude property. (eg: above sea level, below sea level, absolute value) +DEFINE_PROPERTYKEY(PKEY_GPS_AltitudeRef, 0x46AC629D, 0x75EA, 0x4515, 0x86, 0x7F, 0x6D, 0xC4, 0x32, 0x1C, 0x58, 0x44, 100); + +// Name: System.GPS.AreaInformation -- PKEY_GPS_AreaInformation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 972E333E-AC7E-49F1-8ADF-A70D07A9BCAB, 100 +// +// Represents the name of the GPS area +DEFINE_PROPERTYKEY(PKEY_GPS_AreaInformation, 0x972E333E, 0xAC7E, 0x49F1, 0x8A, 0xDF, 0xA7, 0x0D, 0x07, 0xA9, 0xBC, 0xAB, 100); + +// Name: System.GPS.Date -- PKEY_GPS_Date +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 3602C812-0F3B-45F0-85AD-603468D69423, 100 +// +// Date and time of the GPS record +DEFINE_PROPERTYKEY(PKEY_GPS_Date, 0x3602C812, 0x0F3B, 0x45F0, 0x85, 0xAD, 0x60, 0x34, 0x68, 0xD6, 0x94, 0x23, 100); + +// Name: System.GPS.DestBearing -- PKEY_GPS_DestBearing +// Type: Double -- VT_R8 +// FormatID: C66D4B3C-E888-47CC-B99F-9DCA3EE34DEA, 100 +// +// Indicates the bearing to the destination point. Calculated from PKEY_GPS_DestBearingNumerator and +// PKEY_GPS_DestBearingDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_DestBearing, 0xC66D4B3C, 0xE888, 0x47CC, 0xB9, 0x9F, 0x9D, 0xCA, 0x3E, 0xE3, 0x4D, 0xEA, 100); + +// Name: System.GPS.DestBearingDenominator -- PKEY_GPS_DestBearingDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 7ABCF4F8-7C3F-4988-AC91-8D2C2E97ECA5, 100 +// +// Denominator of PKEY_GPS_DestBearing +DEFINE_PROPERTYKEY(PKEY_GPS_DestBearingDenominator, 0x7ABCF4F8, 0x7C3F, 0x4988, 0xAC, 0x91, 0x8D, 0x2C, 0x2E, 0x97, 0xEC, 0xA5, 100); + +// Name: System.GPS.DestBearingNumerator -- PKEY_GPS_DestBearingNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: BA3B1DA9-86EE-4B5D-A2A4-A271A429F0CF, 100 +// +// Numerator of PKEY_GPS_DestBearing +DEFINE_PROPERTYKEY(PKEY_GPS_DestBearingNumerator, 0xBA3B1DA9, 0x86EE, 0x4B5D, 0xA2, 0xA4, 0xA2, 0x71, 0xA4, 0x29, 0xF0, 0xCF, 100); + +// Name: System.GPS.DestBearingRef -- PKEY_GPS_DestBearingRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 9AB84393-2A0F-4B75-BB22-7279786977CB, 100 +// +// Indicates the reference used for the giving the bearing to the destination point. (eg: true direction, magnetic direction) +DEFINE_PROPERTYKEY(PKEY_GPS_DestBearingRef, 0x9AB84393, 0x2A0F, 0x4B75, 0xBB, 0x22, 0x72, 0x79, 0x78, 0x69, 0x77, 0xCB, 100); + +// Name: System.GPS.DestDistance -- PKEY_GPS_DestDistance +// Type: Double -- VT_R8 +// FormatID: A93EAE04-6804-4F24-AC81-09B266452118, 100 +// +// Indicates the distance to the destination point. Calculated from PKEY_GPS_DestDistanceNumerator and +// PKEY_GPS_DestDistanceDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_DestDistance, 0xA93EAE04, 0x6804, 0x4F24, 0xAC, 0x81, 0x09, 0xB2, 0x66, 0x45, 0x21, 0x18, 100); + +// Name: System.GPS.DestDistanceDenominator -- PKEY_GPS_DestDistanceDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 9BC2C99B-AC71-4127-9D1C-2596D0D7DCB7, 100 +// +// Denominator of PKEY_GPS_DestDistance +DEFINE_PROPERTYKEY(PKEY_GPS_DestDistanceDenominator, 0x9BC2C99B, 0xAC71, 0x4127, 0x9D, 0x1C, 0x25, 0x96, 0xD0, 0xD7, 0xDC, 0xB7, 100); + +// Name: System.GPS.DestDistanceNumerator -- PKEY_GPS_DestDistanceNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 2BDA47DA-08C6-4FE1-80BC-A72FC517C5D0, 100 +// +// Numerator of PKEY_GPS_DestDistance +DEFINE_PROPERTYKEY(PKEY_GPS_DestDistanceNumerator, 0x2BDA47DA, 0x08C6, 0x4FE1, 0x80, 0xBC, 0xA7, 0x2F, 0xC5, 0x17, 0xC5, 0xD0, 100); + +// Name: System.GPS.DestDistanceRef -- PKEY_GPS_DestDistanceRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: ED4DF2D3-8695-450B-856F-F5C1C53ACB66, 100 +// +// Indicates the unit used to express the distance to the destination. (eg: kilometers, miles, knots) +DEFINE_PROPERTYKEY(PKEY_GPS_DestDistanceRef, 0xED4DF2D3, 0x8695, 0x450B, 0x85, 0x6F, 0xF5, 0xC1, 0xC5, 0x3A, 0xCB, 0x66, 100); + +// Name: System.GPS.DestLatitude -- PKEY_GPS_DestLatitude +// Type: Multivalue Double -- VT_VECTOR | VT_R8 (For variants: VT_ARRAY | VT_R8) +// FormatID: 9D1D7CC5-5C39-451C-86B3-928E2D18CC47, 100 +// +// Indicates the latitude of the destination point. This is an array of three values. Index 0 is the degrees, index 1 +// is the minutes, index 2 is the seconds. Each is calculated from the values in PKEY_GPS_DestLatitudeNumerator and +// PKEY_GPS_DestLatitudeDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_DestLatitude, 0x9D1D7CC5, 0x5C39, 0x451C, 0x86, 0xB3, 0x92, 0x8E, 0x2D, 0x18, 0xCC, 0x47, 100); + +// Name: System.GPS.DestLatitudeDenominator -- PKEY_GPS_DestLatitudeDenominator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: 3A372292-7FCA-49A7-99D5-E47BB2D4E7AB, 100 +// +// Denominator of PKEY_GPS_DestLatitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLatitudeDenominator, 0x3A372292, 0x7FCA, 0x49A7, 0x99, 0xD5, 0xE4, 0x7B, 0xB2, 0xD4, 0xE7, 0xAB, 100); + +// Name: System.GPS.DestLatitudeNumerator -- PKEY_GPS_DestLatitudeNumerator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: ECF4B6F6-D5A6-433C-BB92-4076650FC890, 100 +// +// Numerator of PKEY_GPS_DestLatitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLatitudeNumerator, 0xECF4B6F6, 0xD5A6, 0x433C, 0xBB, 0x92, 0x40, 0x76, 0x65, 0x0F, 0xC8, 0x90, 100); + +// Name: System.GPS.DestLatitudeRef -- PKEY_GPS_DestLatitudeRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CEA820B9-CE61-4885-A128-005D9087C192, 100 +// +// Indicates whether the latitude destination point is north or south latitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLatitudeRef, 0xCEA820B9, 0xCE61, 0x4885, 0xA1, 0x28, 0x00, 0x5D, 0x90, 0x87, 0xC1, 0x92, 100); + +// Name: System.GPS.DestLongitude -- PKEY_GPS_DestLongitude +// Type: Multivalue Double -- VT_VECTOR | VT_R8 (For variants: VT_ARRAY | VT_R8) +// FormatID: 47A96261-CB4C-4807-8AD3-40B9D9DBC6BC, 100 +// +// Indicates the latitude of the destination point. This is an array of three values. Index 0 is the degrees, index 1 +// is the minutes, index 2 is the seconds. Each is calculated from the values in PKEY_GPS_DestLongitudeNumerator and +// PKEY_GPS_DestLongitudeDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_DestLongitude, 0x47A96261, 0xCB4C, 0x4807, 0x8A, 0xD3, 0x40, 0xB9, 0xD9, 0xDB, 0xC6, 0xBC, 100); + +// Name: System.GPS.DestLongitudeDenominator -- PKEY_GPS_DestLongitudeDenominator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: 425D69E5-48AD-4900-8D80-6EB6B8D0AC86, 100 +// +// Denominator of PKEY_GPS_DestLongitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLongitudeDenominator, 0x425D69E5, 0x48AD, 0x4900, 0x8D, 0x80, 0x6E, 0xB6, 0xB8, 0xD0, 0xAC, 0x86, 100); + +// Name: System.GPS.DestLongitudeNumerator -- PKEY_GPS_DestLongitudeNumerator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: A3250282-FB6D-48D5-9A89-DBCACE75CCCF, 100 +// +// Numerator of PKEY_GPS_DestLongitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLongitudeNumerator, 0xA3250282, 0xFB6D, 0x48D5, 0x9A, 0x89, 0xDB, 0xCA, 0xCE, 0x75, 0xCC, 0xCF, 100); + +// Name: System.GPS.DestLongitudeRef -- PKEY_GPS_DestLongitudeRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 182C1EA6-7C1C-4083-AB4B-AC6C9F4ED128, 100 +// +// Indicates whether the longitude destination point is east or west longitude +DEFINE_PROPERTYKEY(PKEY_GPS_DestLongitudeRef, 0x182C1EA6, 0x7C1C, 0x4083, 0xAB, 0x4B, 0xAC, 0x6C, 0x9F, 0x4E, 0xD1, 0x28, 100); + +// Name: System.GPS.Differential -- PKEY_GPS_Differential +// Type: UInt16 -- VT_UI2 +// FormatID: AAF4EE25-BD3B-4DD7-BFC4-47F77BB00F6D, 100 +// +// Indicates whether differential correction was applied to the GPS receiver +DEFINE_PROPERTYKEY(PKEY_GPS_Differential, 0xAAF4EE25, 0xBD3B, 0x4DD7, 0xBF, 0xC4, 0x47, 0xF7, 0x7B, 0xB0, 0x0F, 0x6D, 100); + +// Name: System.GPS.DOP -- PKEY_GPS_DOP +// Type: Double -- VT_R8 +// FormatID: 0CF8FB02-1837-42F1-A697-A7017AA289B9, 100 +// +// Indicates the GPS DOP (data degree of precision). Calculated from PKEY_GPS_DOPNumerator and PKEY_GPS_DOPDenominator +DEFINE_PROPERTYKEY(PKEY_GPS_DOP, 0x0CF8FB02, 0x1837, 0x42F1, 0xA6, 0x97, 0xA7, 0x01, 0x7A, 0xA2, 0x89, 0xB9, 100); + +// Name: System.GPS.DOPDenominator -- PKEY_GPS_DOPDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: A0BE94C5-50BA-487B-BD35-0654BE8881ED, 100 +// +// Denominator of PKEY_GPS_DOP +DEFINE_PROPERTYKEY(PKEY_GPS_DOPDenominator, 0xA0BE94C5, 0x50BA, 0x487B, 0xBD, 0x35, 0x06, 0x54, 0xBE, 0x88, 0x81, 0xED, 100); + +// Name: System.GPS.DOPNumerator -- PKEY_GPS_DOPNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 47166B16-364F-4AA0-9F31-E2AB3DF449C3, 100 +// +// Numerator of PKEY_GPS_DOP +DEFINE_PROPERTYKEY(PKEY_GPS_DOPNumerator, 0x47166B16, 0x364F, 0x4AA0, 0x9F, 0x31, 0xE2, 0xAB, 0x3D, 0xF4, 0x49, 0xC3, 100); + +// Name: System.GPS.ImgDirection -- PKEY_GPS_ImgDirection +// Type: Double -- VT_R8 +// FormatID: 16473C91-D017-4ED9-BA4D-B6BAA55DBCF8, 100 +// +// Indicates direction of the image when it was captured. Calculated from PKEY_GPS_ImgDirectionNumerator and +// PKEY_GPS_ImgDirectionDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_ImgDirection, 0x16473C91, 0xD017, 0x4ED9, 0xBA, 0x4D, 0xB6, 0xBA, 0xA5, 0x5D, 0xBC, 0xF8, 100); + +// Name: System.GPS.ImgDirectionDenominator -- PKEY_GPS_ImgDirectionDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 10B24595-41A2-4E20-93C2-5761C1395F32, 100 +// +// Denominator of PKEY_GPS_ImgDirection +DEFINE_PROPERTYKEY(PKEY_GPS_ImgDirectionDenominator, 0x10B24595, 0x41A2, 0x4E20, 0x93, 0xC2, 0x57, 0x61, 0xC1, 0x39, 0x5F, 0x32, 100); + +// Name: System.GPS.ImgDirectionNumerator -- PKEY_GPS_ImgDirectionNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: DC5877C7-225F-45F7-BAC7-E81334B6130A, 100 +// +// Numerator of PKEY_GPS_ImgDirection +DEFINE_PROPERTYKEY(PKEY_GPS_ImgDirectionNumerator, 0xDC5877C7, 0x225F, 0x45F7, 0xBA, 0xC7, 0xE8, 0x13, 0x34, 0xB6, 0x13, 0x0A, 100); + +// Name: System.GPS.ImgDirectionRef -- PKEY_GPS_ImgDirectionRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A4AAA5B7-1AD0-445F-811A-0F8F6E67F6B5, 100 +// +// Indicates reference for giving the direction of the image when it was captured. (eg: true direction, magnetic direction) +DEFINE_PROPERTYKEY(PKEY_GPS_ImgDirectionRef, 0xA4AAA5B7, 0x1AD0, 0x445F, 0x81, 0x1A, 0x0F, 0x8F, 0x6E, 0x67, 0xF6, 0xB5, 100); + +// Name: System.GPS.Latitude -- PKEY_GPS_Latitude +// Type: Multivalue Double -- VT_VECTOR | VT_R8 (For variants: VT_ARRAY | VT_R8) +// FormatID: 8727CFFF-4868-4EC6-AD5B-81B98521D1AB, 100 +// +// Indicates the latitude. This is an array of three values. Index 0 is the degrees, index 1 is the minutes, index 2 +// is the seconds. Each is calculated from the values in PKEY_GPS_LatitudeNumerator and PKEY_GPS_LatitudeDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_Latitude, 0x8727CFFF, 0x4868, 0x4EC6, 0xAD, 0x5B, 0x81, 0xB9, 0x85, 0x21, 0xD1, 0xAB, 100); + +// Name: System.GPS.LatitudeDenominator -- PKEY_GPS_LatitudeDenominator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: 16E634EE-2BFF-497B-BD8A-4341AD39EEB9, 100 +// +// Denominator of PKEY_GPS_Latitude +DEFINE_PROPERTYKEY(PKEY_GPS_LatitudeDenominator, 0x16E634EE, 0x2BFF, 0x497B, 0xBD, 0x8A, 0x43, 0x41, 0xAD, 0x39, 0xEE, 0xB9, 100); + +// Name: System.GPS.LatitudeNumerator -- PKEY_GPS_LatitudeNumerator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: 7DDAAAD1-CCC8-41AE-B750-B2CB8031AEA2, 100 +// +// Numerator of PKEY_GPS_Latitude +DEFINE_PROPERTYKEY(PKEY_GPS_LatitudeNumerator, 0x7DDAAAD1, 0xCCC8, 0x41AE, 0xB7, 0x50, 0xB2, 0xCB, 0x80, 0x31, 0xAE, 0xA2, 100); + +// Name: System.GPS.LatitudeRef -- PKEY_GPS_LatitudeRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 029C0252-5B86-46C7-ACA0-2769FFC8E3D4, 100 +// +// Indicates whether latitude is north or south latitude +DEFINE_PROPERTYKEY(PKEY_GPS_LatitudeRef, 0x029C0252, 0x5B86, 0x46C7, 0xAC, 0xA0, 0x27, 0x69, 0xFF, 0xC8, 0xE3, 0xD4, 100); + +// Name: System.GPS.Longitude -- PKEY_GPS_Longitude +// Type: Multivalue Double -- VT_VECTOR | VT_R8 (For variants: VT_ARRAY | VT_R8) +// FormatID: C4C4DBB2-B593-466B-BBDA-D03D27D5E43A, 100 +// +// Indicates the longitude. This is an array of three values. Index 0 is the degrees, index 1 is the minutes, index 2 +// is the seconds. Each is calculated from the values in PKEY_GPS_LongitudeNumerator and PKEY_GPS_LongitudeDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_Longitude, 0xC4C4DBB2, 0xB593, 0x466B, 0xBB, 0xDA, 0xD0, 0x3D, 0x27, 0xD5, 0xE4, 0x3A, 100); + +// Name: System.GPS.LongitudeDenominator -- PKEY_GPS_LongitudeDenominator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: BE6E176C-4534-4D2C-ACE5-31DEDAC1606B, 100 +// +// Denominator of PKEY_GPS_Longitude +DEFINE_PROPERTYKEY(PKEY_GPS_LongitudeDenominator, 0xBE6E176C, 0x4534, 0x4D2C, 0xAC, 0xE5, 0x31, 0xDE, 0xDA, 0xC1, 0x60, 0x6B, 100); + +// Name: System.GPS.LongitudeNumerator -- PKEY_GPS_LongitudeNumerator +// Type: Multivalue UInt32 -- VT_VECTOR | VT_UI4 (For variants: VT_ARRAY | VT_UI4) +// FormatID: 02B0F689-A914-4E45-821D-1DDA452ED2C4, 100 +// +// Numerator of PKEY_GPS_Longitude +DEFINE_PROPERTYKEY(PKEY_GPS_LongitudeNumerator, 0x02B0F689, 0xA914, 0x4E45, 0x82, 0x1D, 0x1D, 0xDA, 0x45, 0x2E, 0xD2, 0xC4, 100); + +// Name: System.GPS.LongitudeRef -- PKEY_GPS_LongitudeRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 33DCF22B-28D5-464C-8035-1EE9EFD25278, 100 +// +// Indicates whether longitude is east or west longitude +DEFINE_PROPERTYKEY(PKEY_GPS_LongitudeRef, 0x33DCF22B, 0x28D5, 0x464C, 0x80, 0x35, 0x1E, 0xE9, 0xEF, 0xD2, 0x52, 0x78, 100); + +// Name: System.GPS.MapDatum -- PKEY_GPS_MapDatum +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 2CA2DAE6-EDDC-407D-BEF1-773942ABFA95, 100 +// +// Indicates the geodetic survey data used by the GPS receiver +DEFINE_PROPERTYKEY(PKEY_GPS_MapDatum, 0x2CA2DAE6, 0xEDDC, 0x407D, 0xBE, 0xF1, 0x77, 0x39, 0x42, 0xAB, 0xFA, 0x95, 100); + +// Name: System.GPS.MeasureMode -- PKEY_GPS_MeasureMode +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A015ED5D-AAEA-4D58-8A86-3C586920EA0B, 100 +// +// Indicates the GPS measurement mode. (eg: 2-dimensional, 3-dimensional) +DEFINE_PROPERTYKEY(PKEY_GPS_MeasureMode, 0xA015ED5D, 0xAAEA, 0x4D58, 0x8A, 0x86, 0x3C, 0x58, 0x69, 0x20, 0xEA, 0x0B, 100); + +// Name: System.GPS.ProcessingMethod -- PKEY_GPS_ProcessingMethod +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 59D49E61-840F-4AA9-A939-E2099B7F6399, 100 +// +// Indicates the name of the method used for location finding +DEFINE_PROPERTYKEY(PKEY_GPS_ProcessingMethod, 0x59D49E61, 0x840F, 0x4AA9, 0xA9, 0x39, 0xE2, 0x09, 0x9B, 0x7F, 0x63, 0x99, 100); + +// Name: System.GPS.Satellites -- PKEY_GPS_Satellites +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 467EE575-1F25-4557-AD4E-B8B58B0D9C15, 100 +// +// Indicates the GPS satellites used for measurements +DEFINE_PROPERTYKEY(PKEY_GPS_Satellites, 0x467EE575, 0x1F25, 0x4557, 0xAD, 0x4E, 0xB8, 0xB5, 0x8B, 0x0D, 0x9C, 0x15, 100); + +// Name: System.GPS.Speed -- PKEY_GPS_Speed +// Type: Double -- VT_R8 +// FormatID: DA5D0862-6E76-4E1B-BABD-70021BD25494, 100 +// +// Indicates the speed of the GPS receiver movement. Calculated from PKEY_GPS_SpeedNumerator and +// PKEY_GPS_SpeedDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_Speed, 0xDA5D0862, 0x6E76, 0x4E1B, 0xBA, 0xBD, 0x70, 0x02, 0x1B, 0xD2, 0x54, 0x94, 100); + +// Name: System.GPS.SpeedDenominator -- PKEY_GPS_SpeedDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 7D122D5A-AE5E-4335-8841-D71E7CE72F53, 100 +// +// Denominator of PKEY_GPS_Speed +DEFINE_PROPERTYKEY(PKEY_GPS_SpeedDenominator, 0x7D122D5A, 0xAE5E, 0x4335, 0x88, 0x41, 0xD7, 0x1E, 0x7C, 0xE7, 0x2F, 0x53, 100); + +// Name: System.GPS.SpeedNumerator -- PKEY_GPS_SpeedNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: ACC9CE3D-C213-4942-8B48-6D0820F21C6D, 100 +// +// Numerator of PKEY_GPS_Speed +DEFINE_PROPERTYKEY(PKEY_GPS_SpeedNumerator, 0xACC9CE3D, 0xC213, 0x4942, 0x8B, 0x48, 0x6D, 0x08, 0x20, 0xF2, 0x1C, 0x6D, 100); + +// Name: System.GPS.SpeedRef -- PKEY_GPS_SpeedRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: ECF7F4C9-544F-4D6D-9D98-8AD79ADAF453, 100 +// +// Indicates the unit used to express the speed of the GPS receiver movement. (eg: kilometers per hour, +// miles per hour, knots). +DEFINE_PROPERTYKEY(PKEY_GPS_SpeedRef, 0xECF7F4C9, 0x544F, 0x4D6D, 0x9D, 0x98, 0x8A, 0xD7, 0x9A, 0xDA, 0xF4, 0x53, 100); + +// Name: System.GPS.Status -- PKEY_GPS_Status +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 125491F4-818F-46B2-91B5-D537753617B2, 100 +// +// Indicates the status of the GPS receiver when the image was recorded. (eg: measurement in progress, +// measurement interoperability). +DEFINE_PROPERTYKEY(PKEY_GPS_Status, 0x125491F4, 0x818F, 0x46B2, 0x91, 0xB5, 0xD5, 0x37, 0x75, 0x36, 0x17, 0xB2, 100); + +// Name: System.GPS.Track -- PKEY_GPS_Track +// Type: Double -- VT_R8 +// FormatID: 76C09943-7C33-49E3-9E7E-CDBA872CFADA, 100 +// +// Indicates the direction of the GPS receiver movement. Calculated from PKEY_GPS_TrackNumerator and +// PKEY_GPS_TrackDenominator. +DEFINE_PROPERTYKEY(PKEY_GPS_Track, 0x76C09943, 0x7C33, 0x49E3, 0x9E, 0x7E, 0xCD, 0xBA, 0x87, 0x2C, 0xFA, 0xDA, 100); + +// Name: System.GPS.TrackDenominator -- PKEY_GPS_TrackDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: C8D1920C-01F6-40C0-AC86-2F3A4AD00770, 100 +// +// Denominator of PKEY_GPS_Track +DEFINE_PROPERTYKEY(PKEY_GPS_TrackDenominator, 0xC8D1920C, 0x01F6, 0x40C0, 0xAC, 0x86, 0x2F, 0x3A, 0x4A, 0xD0, 0x07, 0x70, 100); + +// Name: System.GPS.TrackNumerator -- PKEY_GPS_TrackNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 702926F4-44A6-43E1-AE71-45627116893B, 100 +// +// Numerator of PKEY_GPS_Track +DEFINE_PROPERTYKEY(PKEY_GPS_TrackNumerator, 0x702926F4, 0x44A6, 0x43E1, 0xAE, 0x71, 0x45, 0x62, 0x71, 0x16, 0x89, 0x3B, 100); + +// Name: System.GPS.TrackRef -- PKEY_GPS_TrackRef +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 35DBE6FE-44C3-4400-AAAE-D2C799C407E8, 100 +// +// Indicates reference for the direction of the GPS receiver movement. (eg: true direction, magnetic direction) +DEFINE_PROPERTYKEY(PKEY_GPS_TrackRef, 0x35DBE6FE, 0x44C3, 0x4400, 0xAA, 0xAE, 0xD2, 0xC7, 0x99, 0xC4, 0x07, 0xE8, 100); + +// Name: System.GPS.VersionID -- PKEY_GPS_VersionID +// Type: Buffer -- VT_VECTOR | VT_UI1 (For variants: VT_ARRAY | VT_UI1) +// FormatID: 22704DA4-C6B2-4A99-8E56-F16DF8C92599, 100 +// +// Indicates the version of the GPS information +DEFINE_PROPERTYKEY(PKEY_GPS_VersionID, 0x22704DA4, 0xC6B2, 0x4A99, 0x8E, 0x56, 0xF1, 0x6D, 0xF8, 0xC9, 0x25, 0x99, 100); + +//----------------------------------------------------------------------------- +// Image properties + + + +// Name: System.Image.BitDepth -- PKEY_Image_BitDepth +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 7 (PIDISI_BITDEPTH) +// +// +DEFINE_PROPERTYKEY(PKEY_Image_BitDepth, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 7); + +// Name: System.Image.ColorSpace -- PKEY_Image_ColorSpace +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 40961 +// +// PropertyTagExifColorSpace +DEFINE_PROPERTYKEY(PKEY_Image_ColorSpace, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 40961); + +// Possible discrete values for PKEY_Image_ColorSpace are: +#define IMAGE_COLORSPACE_SRGB 1u +#define IMAGE_COLORSPACE_UNCALIBRATED 0xFFFFu + +// Name: System.Image.CompressedBitsPerPixel -- PKEY_Image_CompressedBitsPerPixel +// Type: Double -- VT_R8 +// FormatID: 364B6FA9-37AB-482A-BE2B-AE02F60D4318, 100 +// +// Calculated from PKEY_Image_CompressedBitsPerPixelNumerator and PKEY_Image_CompressedBitsPerPixelDenominator. +DEFINE_PROPERTYKEY(PKEY_Image_CompressedBitsPerPixel, 0x364B6FA9, 0x37AB, 0x482A, 0xBE, 0x2B, 0xAE, 0x02, 0xF6, 0x0D, 0x43, 0x18, 100); + +// Name: System.Image.CompressedBitsPerPixelDenominator -- PKEY_Image_CompressedBitsPerPixelDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 1F8844E1-24AD-4508-9DFD-5326A415CE02, 100 +// +// Denominator of PKEY_Image_CompressedBitsPerPixel. +DEFINE_PROPERTYKEY(PKEY_Image_CompressedBitsPerPixelDenominator, 0x1F8844E1, 0x24AD, 0x4508, 0x9D, 0xFD, 0x53, 0x26, 0xA4, 0x15, 0xCE, 0x02, 100); + +// Name: System.Image.CompressedBitsPerPixelNumerator -- PKEY_Image_CompressedBitsPerPixelNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: D21A7148-D32C-4624-8900-277210F79C0F, 100 +// +// Numerator of PKEY_Image_CompressedBitsPerPixel. +DEFINE_PROPERTYKEY(PKEY_Image_CompressedBitsPerPixelNumerator, 0xD21A7148, 0xD32C, 0x4624, 0x89, 0x00, 0x27, 0x72, 0x10, 0xF7, 0x9C, 0x0F, 100); + +// Name: System.Image.Compression -- PKEY_Image_Compression +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 259 +// +// Indicates the image compression level. PropertyTagCompression. +DEFINE_PROPERTYKEY(PKEY_Image_Compression, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 259); + +// Possible discrete values for PKEY_Image_Compression are: +#define IMAGE_COMPRESSION_UNCOMPRESSED 1u +#define IMAGE_COMPRESSION_CCITT_T3 2u +#define IMAGE_COMPRESSION_CCITT_T4 3u +#define IMAGE_COMPRESSION_CCITT_T6 4u +#define IMAGE_COMPRESSION_LZW 5u +#define IMAGE_COMPRESSION_JPEG 6u +#define IMAGE_COMPRESSION_PACKBITS 32773u + +// Name: System.Image.CompressionText -- PKEY_Image_CompressionText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 3F08E66F-2F44-4BB9-A682-AC35D2562322, 100 +// +// This is the user-friendly form of System.Image.Compression. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Image_CompressionText, 0x3F08E66F, 0x2F44, 0x4BB9, 0xA6, 0x82, 0xAC, 0x35, 0xD2, 0x56, 0x23, 0x22, 100); + +// Name: System.Image.Dimensions -- PKEY_Image_Dimensions +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 13 (PIDISI_DIMENSIONS) +// +// Indicates the dimensions of the image. +DEFINE_PROPERTYKEY(PKEY_Image_Dimensions, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 13); + +// Name: System.Image.HorizontalResolution -- PKEY_Image_HorizontalResolution +// Type: Double -- VT_R8 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 5 (PIDISI_RESOLUTIONX) +// +// +DEFINE_PROPERTYKEY(PKEY_Image_HorizontalResolution, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 5); + +// Name: System.Image.HorizontalSize -- PKEY_Image_HorizontalSize +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 3 (PIDISI_CX) +// +// +DEFINE_PROPERTYKEY(PKEY_Image_HorizontalSize, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 3); + +// Name: System.Image.ImageID -- PKEY_Image_ImageID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 10DABE05-32AA-4C29-BF1A-63E2D220587F, 100 +DEFINE_PROPERTYKEY(PKEY_Image_ImageID, 0x10DABE05, 0x32AA, 0x4C29, 0xBF, 0x1A, 0x63, 0xE2, 0xD2, 0x20, 0x58, 0x7F, 100); + +// Name: System.Image.ResolutionUnit -- PKEY_Image_ResolutionUnit +// Type: Int16 -- VT_I2 +// FormatID: 19B51FA6-1F92-4A5C-AB48-7DF0ABD67444, 100 +DEFINE_PROPERTYKEY(PKEY_Image_ResolutionUnit, 0x19B51FA6, 0x1F92, 0x4A5C, 0xAB, 0x48, 0x7D, 0xF0, 0xAB, 0xD6, 0x74, 0x44, 100); + +// Name: System.Image.VerticalResolution -- PKEY_Image_VerticalResolution +// Type: Double -- VT_R8 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 6 (PIDISI_RESOLUTIONY) +// +// +DEFINE_PROPERTYKEY(PKEY_Image_VerticalResolution, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 6); + +// Name: System.Image.VerticalSize -- PKEY_Image_VerticalSize +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 4 (PIDISI_CY) +// +// +DEFINE_PROPERTYKEY(PKEY_Image_VerticalSize, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 4); + + + +//----------------------------------------------------------------------------- +// Journal properties + +// Name: System.Journal.Contacts -- PKEY_Journal_Contacts +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: DEA7C82C-1D89-4A66-9427-A4E3DEBABCB1, 100 +DEFINE_PROPERTYKEY(PKEY_Journal_Contacts, 0xDEA7C82C, 0x1D89, 0x4A66, 0x94, 0x27, 0xA4, 0xE3, 0xDE, 0xBA, 0xBC, 0xB1, 100); + +// Name: System.Journal.EntryType -- PKEY_Journal_EntryType +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 95BEB1FC-326D-4644-B396-CD3ED90E6DDF, 100 +DEFINE_PROPERTYKEY(PKEY_Journal_EntryType, 0x95BEB1FC, 0x326D, 0x4644, 0xB3, 0x96, 0xCD, 0x3E, 0xD9, 0x0E, 0x6D, 0xDF, 100); + +//----------------------------------------------------------------------------- +// Link properties + + + +// Name: System.Link.Comment -- PKEY_Link_Comment +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_LINK) B9B4B3FC-2B51-4A42-B5D8-324146AFCF25, 5 +DEFINE_PROPERTYKEY(PKEY_Link_Comment, 0xB9B4B3FC, 0x2B51, 0x4A42, 0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25, 5); + +// Name: System.Link.DateVisited -- PKEY_Link_DateVisited +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 5CBF2787-48CF-4208-B90E-EE5E5D420294, 23 (PKEYs relating to URLs. Used by IE History.) +DEFINE_PROPERTYKEY(PKEY_Link_DateVisited, 0x5CBF2787, 0x48CF, 0x4208, 0xB9, 0x0E, 0xEE, 0x5E, 0x5D, 0x42, 0x02, 0x94, 23); + +// Name: System.Link.Description -- PKEY_Link_Description +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 5CBF2787-48CF-4208-B90E-EE5E5D420294, 21 (PKEYs relating to URLs. Used by IE History.) +DEFINE_PROPERTYKEY(PKEY_Link_Description, 0x5CBF2787, 0x48CF, 0x4208, 0xB9, 0x0E, 0xEE, 0x5E, 0x5D, 0x42, 0x02, 0x94, 21); + +// Name: System.Link.Status -- PKEY_Link_Status +// Type: Int32 -- VT_I4 +// FormatID: (PSGUID_LINK) B9B4B3FC-2B51-4A42-B5D8-324146AFCF25, 3 (PID_LINK_TARGET_TYPE) +// +// +DEFINE_PROPERTYKEY(PKEY_Link_Status, 0xB9B4B3FC, 0x2B51, 0x4A42, 0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25, 3); + +// Possible discrete values for PKEY_Link_Status are: +#define LINK_STATUS_RESOLVED 1l +#define LINK_STATUS_BROKEN 2l + +// Name: System.Link.TargetExtension -- PKEY_Link_TargetExtension +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: 7A7D76F4-B630-4BD7-95FF-37CC51A975C9, 2 +// +// The file extension of the link target. See System.File.Extension +DEFINE_PROPERTYKEY(PKEY_Link_TargetExtension, 0x7A7D76F4, 0xB630, 0x4BD7, 0x95, 0xFF, 0x37, 0xCC, 0x51, 0xA9, 0x75, 0xC9, 2); + +// Name: System.Link.TargetParsingPath -- PKEY_Link_TargetParsingPath +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_LINK) B9B4B3FC-2B51-4A42-B5D8-324146AFCF25, 2 (PID_LINK_TARGET) +// +// This is the shell namespace path to the target of the link item. This path may be passed to +// SHParseDisplayName to parse the path to the correct shell folder. +// +// If the target item is a file, the value is identical to System.ItemPathDisplay. +// +// If the target item cannot be accessed through the shell namespace, this value is VT_EMPTY. +DEFINE_PROPERTYKEY(PKEY_Link_TargetParsingPath, 0xB9B4B3FC, 0x2B51, 0x4A42, 0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25, 2); + +// Name: System.Link.TargetSFGAOFlags -- PKEY_Link_TargetSFGAOFlags +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_LINK) B9B4B3FC-2B51-4A42-B5D8-324146AFCF25, 8 +// +// IShellFolder::GetAttributesOf flags for the target of a link, with SFGAO_PKEYSFGAOMASK +// attributes masked out. +DEFINE_PROPERTYKEY(PKEY_Link_TargetSFGAOFlags, 0xB9B4B3FC, 0x2B51, 0x4A42, 0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25, 8); + +//----------------------------------------------------------------------------- +// Media properties + + + +// Name: System.Media.AuthorUrl -- PKEY_Media_AuthorUrl +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 32 (PIDMSI_AUTHOR_URL) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_AuthorUrl, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 32); + +// Name: System.Media.AverageLevel -- PKEY_Media_AverageLevel +// Type: UInt32 -- VT_UI4 +// FormatID: 09EDD5B6-B301-43C5-9990-D00302EFFD46, 100 +DEFINE_PROPERTYKEY(PKEY_Media_AverageLevel, 0x09EDD5B6, 0xB301, 0x43C5, 0x99, 0x90, 0xD0, 0x03, 0x02, 0xEF, 0xFD, 0x46, 100); + +// Name: System.Media.ClassPrimaryID -- PKEY_Media_ClassPrimaryID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 13 (PIDMSI_CLASS_PRIMARY_ID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_ClassPrimaryID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 13); + +// Name: System.Media.ClassSecondaryID -- PKEY_Media_ClassSecondaryID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 14 (PIDMSI_CLASS_SECONDARY_ID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_ClassSecondaryID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 14); + +// Name: System.Media.CollectionGroupID -- PKEY_Media_CollectionGroupID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 24 (PIDMSI_COLLECTION_GROUP_ID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_CollectionGroupID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 24); + +// Name: System.Media.CollectionID -- PKEY_Media_CollectionID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 25 (PIDMSI_COLLECTION_ID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_CollectionID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 25); + +// Name: System.Media.ContentDistributor -- PKEY_Media_ContentDistributor +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 18 (PIDMSI_CONTENTDISTRIBUTOR) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_ContentDistributor, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 18); + +// Name: System.Media.ContentID -- PKEY_Media_ContentID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 26 (PIDMSI_CONTENT_ID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_ContentID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 26); + +// Name: System.Media.CreatorApplication -- PKEY_Media_CreatorApplication +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 27 (PIDMSI_TOOL_NAME) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_CreatorApplication, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 27); + +// Name: System.Media.CreatorApplicationVersion -- PKEY_Media_CreatorApplicationVersion +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 28 (PIDMSI_TOOL_VERSION) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_CreatorApplicationVersion, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 28); + +// Name: System.Media.DateEncoded -- PKEY_Media_DateEncoded +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 2E4B640D-5019-46D8-8881-55414CC5CAA0, 100 +// +// DateTime is in UTC (in the doc, not file system). +DEFINE_PROPERTYKEY(PKEY_Media_DateEncoded, 0x2E4B640D, 0x5019, 0x46D8, 0x88, 0x81, 0x55, 0x41, 0x4C, 0xC5, 0xCA, 0xA0, 100); + +// Name: System.Media.DateReleased -- PKEY_Media_DateReleased +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DE41CC29-6971-4290-B472-F59F2E2F31E2, 100 +DEFINE_PROPERTYKEY(PKEY_Media_DateReleased, 0xDE41CC29, 0x6971, 0x4290, 0xB4, 0x72, 0xF5, 0x9F, 0x2E, 0x2F, 0x31, 0xE2, 100); + +// Name: System.Media.Duration -- PKEY_Media_Duration +// Type: UInt64 -- VT_UI8 +// FormatID: (FMTID_AudioSummaryInformation) 64440490-4C8B-11D1-8B70-080036B11A03, 3 (PIDASI_TIMELENGTH) +// +// 100ns units, not milliseconds +DEFINE_PROPERTYKEY(PKEY_Media_Duration, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 3); + +// Name: System.Media.DVDID -- PKEY_Media_DVDID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 15 (PIDMSI_DVDID) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_DVDID, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 15); + +// Name: System.Media.EncodedBy -- PKEY_Media_EncodedBy +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 36 (PIDMSI_ENCODED_BY) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_EncodedBy, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 36); + +// Name: System.Media.EncodingSettings -- PKEY_Media_EncodingSettings +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 37 (PIDMSI_ENCODING_SETTINGS) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_EncodingSettings, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 37); + +// Name: System.Media.FrameCount -- PKEY_Media_FrameCount +// Type: UInt32 -- VT_UI4 +// FormatID: (PSGUID_IMAGESUMMARYINFORMATION) 6444048F-4C8B-11D1-8B70-080036B11A03, 12 (PIDISI_FRAMECOUNT) +// +// Indicates the frame count for the image. +DEFINE_PROPERTYKEY(PKEY_Media_FrameCount, 0x6444048F, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 12); + +// Name: System.Media.MCDI -- PKEY_Media_MCDI +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 16 (PIDMSI_MCDI) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_MCDI, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 16); + +// Name: System.Media.MetadataContentProvider -- PKEY_Media_MetadataContentProvider +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 17 (PIDMSI_PROVIDER) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_MetadataContentProvider, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 17); + +// Name: System.Media.Producer -- PKEY_Media_Producer +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 22 (PIDMSI_PRODUCER) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_Producer, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 22); + +// Name: System.Media.PromotionUrl -- PKEY_Media_PromotionUrl +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 33 (PIDMSI_PROMOTION_URL) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_PromotionUrl, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 33); + +// Name: System.Media.ProtectionType -- PKEY_Media_ProtectionType +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 38 +// +// If media is protected, how is it protected? +DEFINE_PROPERTYKEY(PKEY_Media_ProtectionType, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 38); + +// Name: System.Media.ProviderRating -- PKEY_Media_ProviderRating +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 39 +// +// Rating (0 - 99) supplied by metadata provider +DEFINE_PROPERTYKEY(PKEY_Media_ProviderRating, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 39); + +// Name: System.Media.ProviderStyle -- PKEY_Media_ProviderStyle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 40 +// +// Style of music or video, supplied by metadata provider +DEFINE_PROPERTYKEY(PKEY_Media_ProviderStyle, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 40); + +// Name: System.Media.Publisher -- PKEY_Media_Publisher +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 30 (PIDMSI_PUBLISHER) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_Publisher, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 30); + +// Name: System.Media.SubscriptionContentId -- PKEY_Media_SubscriptionContentId +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 9AEBAE7A-9644-487D-A92C-657585ED751A, 100 +DEFINE_PROPERTYKEY(PKEY_Media_SubscriptionContentId, 0x9AEBAE7A, 0x9644, 0x487D, 0xA9, 0x2C, 0x65, 0x75, 0x85, 0xED, 0x75, 0x1A, 100); + +// Name: System.Media.SubTitle -- PKEY_Media_SubTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 38 (PIDSI_MUSIC_SUB_TITLE) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_SubTitle, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 38); + +// Name: System.Media.UniqueFileIdentifier -- PKEY_Media_UniqueFileIdentifier +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 35 (PIDMSI_UNIQUE_FILE_IDENTIFIER) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_UniqueFileIdentifier, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 35); + +// Name: System.Media.UserNoAutoInfo -- PKEY_Media_UserNoAutoInfo +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 41 +// +// If true, do NOT alter this file's metadata. Set by user. +DEFINE_PROPERTYKEY(PKEY_Media_UserNoAutoInfo, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 41); + +// Name: System.Media.UserWebUrl -- PKEY_Media_UserWebUrl +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 34 (PIDMSI_USER_WEB_URL) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_UserWebUrl, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 34); + +// Name: System.Media.Writer -- PKEY_Media_Writer +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 23 (PIDMSI_WRITER) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_Writer, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 23); + +// Name: System.Media.Year -- PKEY_Media_Year +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 5 (PIDSI_MUSIC_YEAR) +// +// +DEFINE_PROPERTYKEY(PKEY_Media_Year, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 5); + +//----------------------------------------------------------------------------- +// Message properties + + + +// Name: System.Message.AttachmentContents -- PKEY_Message_AttachmentContents +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 3143BF7C-80A8-4854-8880-E2E40189BDD0, 100 +DEFINE_PROPERTYKEY(PKEY_Message_AttachmentContents, 0x3143BF7C, 0x80A8, 0x4854, 0x88, 0x80, 0xE2, 0xE4, 0x01, 0x89, 0xBD, 0xD0, 100); + +// Name: System.Message.AttachmentNames -- PKEY_Message_AttachmentNames +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 21 +// +// The names of the attachments in a message +DEFINE_PROPERTYKEY(PKEY_Message_AttachmentNames, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 21); + +// Name: System.Message.BccAddress -- PKEY_Message_BccAddress +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 2 +// +// Addresses in Bcc: field +DEFINE_PROPERTYKEY(PKEY_Message_BccAddress, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 2); + +// Name: System.Message.BccName -- PKEY_Message_BccName +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 3 +// +// person names in Bcc: field +DEFINE_PROPERTYKEY(PKEY_Message_BccName, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 3); + +// Name: System.Message.CcAddress -- PKEY_Message_CcAddress +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 4 +// +// Addresses in Cc: field +DEFINE_PROPERTYKEY(PKEY_Message_CcAddress, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 4); + +// Name: System.Message.CcName -- PKEY_Message_CcName +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 5 +// +// person names in Cc: field +DEFINE_PROPERTYKEY(PKEY_Message_CcName, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 5); + +// Name: System.Message.ConversationID -- PKEY_Message_ConversationID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: DC8F80BD-AF1E-4289-85B6-3DFC1B493992, 100 +DEFINE_PROPERTYKEY(PKEY_Message_ConversationID, 0xDC8F80BD, 0xAF1E, 0x4289, 0x85, 0xB6, 0x3D, 0xFC, 0x1B, 0x49, 0x39, 0x92, 100); + +// Name: System.Message.ConversationIndex -- PKEY_Message_ConversationIndex +// Type: Buffer -- VT_VECTOR | VT_UI1 (For variants: VT_ARRAY | VT_UI1) +// FormatID: DC8F80BD-AF1E-4289-85B6-3DFC1B493992, 101 +// +// +DEFINE_PROPERTYKEY(PKEY_Message_ConversationIndex, 0xDC8F80BD, 0xAF1E, 0x4289, 0x85, 0xB6, 0x3D, 0xFC, 0x1B, 0x49, 0x39, 0x92, 101); + +// Name: System.Message.DateReceived -- PKEY_Message_DateReceived +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 20 +// +// Date and Time communication was received +DEFINE_PROPERTYKEY(PKEY_Message_DateReceived, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 20); + +// Name: System.Message.DateSent -- PKEY_Message_DateSent +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 19 +// +// Date and Time communication was sent +DEFINE_PROPERTYKEY(PKEY_Message_DateSent, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 19); + +// Name: System.Message.FromAddress -- PKEY_Message_FromAddress +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 13 +DEFINE_PROPERTYKEY(PKEY_Message_FromAddress, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 13); + +// Name: System.Message.FromName -- PKEY_Message_FromName +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 14 +// +// Address in from field as person name +DEFINE_PROPERTYKEY(PKEY_Message_FromName, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 14); + +// Name: System.Message.HasAttachments -- PKEY_Message_HasAttachments +// Type: Boolean -- VT_BOOL +// FormatID: 9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4, 8 +// +// +DEFINE_PROPERTYKEY(PKEY_Message_HasAttachments, 0x9C1FCF74, 0x2D97, 0x41BA, 0xB4, 0xAE, 0xCB, 0x2E, 0x36, 0x61, 0xA6, 0xE4, 8); + +// Name: System.Message.IsFwdOrReply -- PKEY_Message_IsFwdOrReply +// Type: Int32 -- VT_I4 +// FormatID: 9A9BC088-4F6D-469E-9919-E705412040F9, 100 +DEFINE_PROPERTYKEY(PKEY_Message_IsFwdOrReply, 0x9A9BC088, 0x4F6D, 0x469E, 0x99, 0x19, 0xE7, 0x05, 0x41, 0x20, 0x40, 0xF9, 100); + +// Name: System.Message.MessageClass -- PKEY_Message_MessageClass +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CD9ED458-08CE-418F-A70E-F912C7BB9C5C, 103 +// +// What type of outlook msg this is (meeting, task, mail, etc.) +DEFINE_PROPERTYKEY(PKEY_Message_MessageClass, 0xCD9ED458, 0x08CE, 0x418F, 0xA7, 0x0E, 0xF9, 0x12, 0xC7, 0xBB, 0x9C, 0x5C, 103); + +// Name: System.Message.SenderAddress -- PKEY_Message_SenderAddress +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 0BE1C8E7-1981-4676-AE14-FDD78F05A6E7, 100 +DEFINE_PROPERTYKEY(PKEY_Message_SenderAddress, 0x0BE1C8E7, 0x1981, 0x4676, 0xAE, 0x14, 0xFD, 0xD7, 0x8F, 0x05, 0xA6, 0xE7, 100); + +// Name: System.Message.SenderName -- PKEY_Message_SenderName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 0DA41CFA-D224-4A18-AE2F-596158DB4B3A, 100 +DEFINE_PROPERTYKEY(PKEY_Message_SenderName, 0x0DA41CFA, 0xD224, 0x4A18, 0xAE, 0x2F, 0x59, 0x61, 0x58, 0xDB, 0x4B, 0x3A, 100); + +// Name: System.Message.Store -- PKEY_Message_Store +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 15 +// +// The store (aka protocol handler) FILE, MAIL, OUTLOOKEXPRESS +DEFINE_PROPERTYKEY(PKEY_Message_Store, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 15); + +// Name: System.Message.ToAddress -- PKEY_Message_ToAddress +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 16 +// +// Addresses in To: field +DEFINE_PROPERTYKEY(PKEY_Message_ToAddress, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 16); + +// Name: System.Message.ToDoTitle -- PKEY_Message_ToDoTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: BCCC8A3C-8CEF-42E5-9B1C-C69079398BC7, 100 +DEFINE_PROPERTYKEY(PKEY_Message_ToDoTitle, 0xBCCC8A3C, 0x8CEF, 0x42E5, 0x9B, 0x1C, 0xC6, 0x90, 0x79, 0x39, 0x8B, 0xC7, 100); + +// Name: System.Message.ToName -- PKEY_Message_ToName +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD, 17 +// +// Person names in To: field +DEFINE_PROPERTYKEY(PKEY_Message_ToName, 0xE3E0584C, 0xB788, 0x4A5A, 0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD, 17); + +//----------------------------------------------------------------------------- +// Music properties + +// Name: System.Music.AlbumArtist -- PKEY_Music_AlbumArtist +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 13 (PIDSI_MUSIC_ALBUM_ARTIST) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_AlbumArtist, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 13); + +// Name: System.Music.AlbumTitle -- PKEY_Music_AlbumTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 4 (PIDSI_MUSIC_ALBUM) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_AlbumTitle, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 4); + +// Name: System.Music.Artist -- PKEY_Music_Artist +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 2 (PIDSI_MUSIC_ARTIST) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Artist, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 2); + +// Name: System.Music.BeatsPerMinute -- PKEY_Music_BeatsPerMinute +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 35 (PIDSI_MUSIC_BEATS_PER_MINUTE) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_BeatsPerMinute, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 35); + +// Name: System.Music.Composer -- PKEY_Music_Composer +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 19 (PIDMSI_COMPOSER) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Composer, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 19); + +// Name: System.Music.Conductor -- PKEY_Music_Conductor +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 36 (PIDSI_MUSIC_CONDUCTOR) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Conductor, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 36); + +// Name: System.Music.ContentGroupDescription -- PKEY_Music_ContentGroupDescription +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 33 (PIDSI_MUSIC_CONTENT_GROUP_DESCRIPTION) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_ContentGroupDescription, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 33); + +// Name: System.Music.Genre -- PKEY_Music_Genre +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 11 (PIDSI_MUSIC_GENRE) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Genre, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 11); + +// Name: System.Music.InitialKey -- PKEY_Music_InitialKey +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 34 (PIDSI_MUSIC_INITIAL_KEY) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_InitialKey, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 34); + +// Name: System.Music.Lyrics -- PKEY_Music_Lyrics +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 12 (PIDSI_MUSIC_LYRICS) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Lyrics, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 12); + +// Name: System.Music.Mood -- PKEY_Music_Mood +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 39 (PIDSI_MUSIC_MOOD) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Mood, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 39); + +// Name: System.Music.PartOfSet -- PKEY_Music_PartOfSet +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 37 (PIDSI_MUSIC_PART_OF_SET) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_PartOfSet, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 37); + +// Name: System.Music.Period -- PKEY_Music_Period +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 31 (PIDMSI_PERIOD) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_Period, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 31); + +// Name: System.Music.SynchronizedLyrics -- PKEY_Music_SynchronizedLyrics +// Type: Blob -- VT_BLOB +// FormatID: 6B223B6A-162E-4AA9-B39F-05D678FC6D77, 100 +DEFINE_PROPERTYKEY(PKEY_Music_SynchronizedLyrics, 0x6B223B6A, 0x162E, 0x4AA9, 0xB3, 0x9F, 0x05, 0xD6, 0x78, 0xFC, 0x6D, 0x77, 100); + +// Name: System.Music.TrackNumber -- PKEY_Music_TrackNumber +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_MUSIC) 56A3372E-CE9C-11D2-9F0E-006097C686F6, 7 (PIDSI_MUSIC_TRACK) +// +// +DEFINE_PROPERTYKEY(PKEY_Music_TrackNumber, 0x56A3372E, 0xCE9C, 0x11D2, 0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6, 7); + + + +//----------------------------------------------------------------------------- +// Note properties + +// Name: System.Note.Color -- PKEY_Note_Color +// Type: UInt16 -- VT_UI2 +// FormatID: 4776CAFA-BCE4-4CB1-A23E-265E76D8EB11, 100 +DEFINE_PROPERTYKEY(PKEY_Note_Color, 0x4776CAFA, 0xBCE4, 0x4CB1, 0xA2, 0x3E, 0x26, 0x5E, 0x76, 0xD8, 0xEB, 0x11, 100); + +// Possible discrete values for PKEY_Note_Color are: +#define NOTE_COLOR_BLUE 0u +#define NOTE_COLOR_GREEN 1u +#define NOTE_COLOR_PINK 2u +#define NOTE_COLOR_YELLOW 3u +#define NOTE_COLOR_WHITE 4u +#define NOTE_COLOR_LIGHTGREEN 5u + +// Name: System.Note.ColorText -- PKEY_Note_ColorText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 46B4E8DE-CDB2-440D-885C-1658EB65B914, 100 +// +// This is the user-friendly form of System.Note.Color. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Note_ColorText, 0x46B4E8DE, 0xCDB2, 0x440D, 0x88, 0x5C, 0x16, 0x58, 0xEB, 0x65, 0xB9, 0x14, 100); + +//----------------------------------------------------------------------------- +// Photo properties + + + +// Name: System.Photo.Aperture -- PKEY_Photo_Aperture +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37378 +// +// PropertyTagExifAperture. Calculated from PKEY_Photo_ApertureNumerator and PKEY_Photo_ApertureDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_Aperture, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37378); + +// Name: System.Photo.ApertureDenominator -- PKEY_Photo_ApertureDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: E1A9A38B-6685-46BD-875E-570DC7AD7320, 100 +// +// Denominator of PKEY_Photo_Aperture +DEFINE_PROPERTYKEY(PKEY_Photo_ApertureDenominator, 0xE1A9A38B, 0x6685, 0x46BD, 0x87, 0x5E, 0x57, 0x0D, 0xC7, 0xAD, 0x73, 0x20, 100); + +// Name: System.Photo.ApertureNumerator -- PKEY_Photo_ApertureNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 0337ECEC-39FB-4581-A0BD-4C4CC51E9914, 100 +// +// Numerator of PKEY_Photo_Aperture +DEFINE_PROPERTYKEY(PKEY_Photo_ApertureNumerator, 0x0337ECEC, 0x39FB, 0x4581, 0xA0, 0xBD, 0x4C, 0x4C, 0xC5, 0x1E, 0x99, 0x14, 100); + +// Name: System.Photo.Brightness -- PKEY_Photo_Brightness +// Type: Double -- VT_R8 +// FormatID: 1A701BF6-478C-4361-83AB-3701BB053C58, 100 (PropertyTagExifBrightness) +// +// This is the brightness of the photo. +// +// Calculated from PKEY_Photo_BrightnessNumerator and PKEY_Photo_BrightnessDenominator. +// +// The units are "APEX", normally in the range of -99.99 to 99.99. If the numerator of +// the recorded value is FFFFFFFF.H, "Unknown" should be indicated. +DEFINE_PROPERTYKEY(PKEY_Photo_Brightness, 0x1A701BF6, 0x478C, 0x4361, 0x83, 0xAB, 0x37, 0x01, 0xBB, 0x05, 0x3C, 0x58, 100); + +// Name: System.Photo.BrightnessDenominator -- PKEY_Photo_BrightnessDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 6EBE6946-2321-440A-90F0-C043EFD32476, 100 +// +// Denominator of PKEY_Photo_Brightness +DEFINE_PROPERTYKEY(PKEY_Photo_BrightnessDenominator, 0x6EBE6946, 0x2321, 0x440A, 0x90, 0xF0, 0xC0, 0x43, 0xEF, 0xD3, 0x24, 0x76, 100); + +// Name: System.Photo.BrightnessNumerator -- PKEY_Photo_BrightnessNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 9E7D118F-B314-45A0-8CFB-D654B917C9E9, 100 +// +// Numerator of PKEY_Photo_Brightness +DEFINE_PROPERTYKEY(PKEY_Photo_BrightnessNumerator, 0x9E7D118F, 0xB314, 0x45A0, 0x8C, 0xFB, 0xD6, 0x54, 0xB9, 0x17, 0xC9, 0xE9, 100); + +// Name: System.Photo.CameraManufacturer -- PKEY_Photo_CameraManufacturer +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 271 (PropertyTagEquipMake) +// +// +DEFINE_PROPERTYKEY(PKEY_Photo_CameraManufacturer, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 271); + +// Name: System.Photo.CameraModel -- PKEY_Photo_CameraModel +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 272 (PropertyTagEquipModel) +// +// +DEFINE_PROPERTYKEY(PKEY_Photo_CameraModel, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 272); + +// Name: System.Photo.CameraSerialNumber -- PKEY_Photo_CameraSerialNumber +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 273 +// +// Serial number of camera that produced this photo +DEFINE_PROPERTYKEY(PKEY_Photo_CameraSerialNumber, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 273); + +// Name: System.Photo.Contrast -- PKEY_Photo_Contrast +// Type: UInt32 -- VT_UI4 +// FormatID: 2A785BA9-8D23-4DED-82E6-60A350C86A10, 100 +// +// This indicates the direction of contrast processing applied by the camera +// when the image was shot. +DEFINE_PROPERTYKEY(PKEY_Photo_Contrast, 0x2A785BA9, 0x8D23, 0x4DED, 0x82, 0xE6, 0x60, 0xA3, 0x50, 0xC8, 0x6A, 0x10, 100); + +// Possible discrete values for PKEY_Photo_Contrast are: +#define PHOTO_CONTRAST_NORMAL 0ul +#define PHOTO_CONTRAST_SOFT 1ul +#define PHOTO_CONTRAST_HARD 2ul + +// Name: System.Photo.ContrastText -- PKEY_Photo_ContrastText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 59DDE9F2-5253-40EA-9A8B-479E96C6249A, 100 +// +// This is the user-friendly form of System.Photo.Contrast. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_ContrastText, 0x59DDE9F2, 0x5253, 0x40EA, 0x9A, 0x8B, 0x47, 0x9E, 0x96, 0xC6, 0x24, 0x9A, 100); + +// Name: System.Photo.DateTaken -- PKEY_Photo_DateTaken +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 36867 +// +// PropertyTagExifDTOrig +DEFINE_PROPERTYKEY(PKEY_Photo_DateTaken, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 36867); + +// Name: System.Photo.DigitalZoom -- PKEY_Photo_DigitalZoom +// Type: Double -- VT_R8 +// FormatID: F85BF840-A925-4BC2-B0C4-8E36B598679E, 100 +// +// PropertyTagExifDigitalZoom. Calculated from PKEY_Photo_DigitalZoomNumerator and PKEY_Photo_DigitalZoomDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_DigitalZoom, 0xF85BF840, 0xA925, 0x4BC2, 0xB0, 0xC4, 0x8E, 0x36, 0xB5, 0x98, 0x67, 0x9E, 100); + +// Name: System.Photo.DigitalZoomDenominator -- PKEY_Photo_DigitalZoomDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 745BAF0E-E5C1-4CFB-8A1B-D031A0A52393, 100 +// +// Denominator of PKEY_Photo_DigitalZoom +DEFINE_PROPERTYKEY(PKEY_Photo_DigitalZoomDenominator, 0x745BAF0E, 0xE5C1, 0x4CFB, 0x8A, 0x1B, 0xD0, 0x31, 0xA0, 0xA5, 0x23, 0x93, 100); + +// Name: System.Photo.DigitalZoomNumerator -- PKEY_Photo_DigitalZoomNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 16CBB924-6500-473B-A5BE-F1599BCBE413, 100 +// +// Numerator of PKEY_Photo_DigitalZoom +DEFINE_PROPERTYKEY(PKEY_Photo_DigitalZoomNumerator, 0x16CBB924, 0x6500, 0x473B, 0xA5, 0xBE, 0xF1, 0x59, 0x9B, 0xCB, 0xE4, 0x13, 100); + +// Name: System.Photo.Event -- PKEY_Photo_Event +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 18248 +// +// The event at which the photo was taken +DEFINE_PROPERTYKEY(PKEY_Photo_Event, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 18248); + +// Name: System.Photo.EXIFVersion -- PKEY_Photo_EXIFVersion +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D35F743A-EB2E-47F2-A286-844132CB1427, 100 +// +// The EXIF version. +DEFINE_PROPERTYKEY(PKEY_Photo_EXIFVersion, 0xD35F743A, 0xEB2E, 0x47F2, 0xA2, 0x86, 0x84, 0x41, 0x32, 0xCB, 0x14, 0x27, 100); + +// Name: System.Photo.ExposureBias -- PKEY_Photo_ExposureBias +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37380 +// +// PropertyTagExifExposureBias. Calculated from PKEY_Photo_ExposureBiasNumerator and PKEY_Photo_ExposureBiasDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureBias, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37380); + +// Name: System.Photo.ExposureBiasDenominator -- PKEY_Photo_ExposureBiasDenominator +// Type: Int32 -- VT_I4 +// FormatID: AB205E50-04B7-461C-A18C-2F233836E627, 100 +// +// Denominator of PKEY_Photo_ExposureBias +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureBiasDenominator, 0xAB205E50, 0x04B7, 0x461C, 0xA1, 0x8C, 0x2F, 0x23, 0x38, 0x36, 0xE6, 0x27, 100); + +// Name: System.Photo.ExposureBiasNumerator -- PKEY_Photo_ExposureBiasNumerator +// Type: Int32 -- VT_I4 +// FormatID: 738BF284-1D87-420B-92CF-5834BF6EF9ED, 100 +// +// Numerator of PKEY_Photo_ExposureBias +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureBiasNumerator, 0x738BF284, 0x1D87, 0x420B, 0x92, 0xCF, 0x58, 0x34, 0xBF, 0x6E, 0xF9, 0xED, 100); + +// Name: System.Photo.ExposureIndex -- PKEY_Photo_ExposureIndex +// Type: Double -- VT_R8 +// FormatID: 967B5AF8-995A-46ED-9E11-35B3C5B9782D, 100 +// +// PropertyTagExifExposureIndex. Calculated from PKEY_Photo_ExposureIndexNumerator and PKEY_Photo_ExposureIndexDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureIndex, 0x967B5AF8, 0x995A, 0x46ED, 0x9E, 0x11, 0x35, 0xB3, 0xC5, 0xB9, 0x78, 0x2D, 100); + +// Name: System.Photo.ExposureIndexDenominator -- PKEY_Photo_ExposureIndexDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 93112F89-C28B-492F-8A9D-4BE2062CEE8A, 100 +// +// Denominator of PKEY_Photo_ExposureIndex +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureIndexDenominator, 0x93112F89, 0xC28B, 0x492F, 0x8A, 0x9D, 0x4B, 0xE2, 0x06, 0x2C, 0xEE, 0x8A, 100); + +// Name: System.Photo.ExposureIndexNumerator -- PKEY_Photo_ExposureIndexNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: CDEDCF30-8919-44DF-8F4C-4EB2FFDB8D89, 100 +// +// Numerator of PKEY_Photo_ExposureIndex +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureIndexNumerator, 0xCDEDCF30, 0x8919, 0x44DF, 0x8F, 0x4C, 0x4E, 0xB2, 0xFF, 0xDB, 0x8D, 0x89, 100); + +// Name: System.Photo.ExposureProgram -- PKEY_Photo_ExposureProgram +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 34850 (PropertyTagExifExposureProg) +// +// +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureProgram, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 34850); + +// Possible discrete values for PKEY_Photo_ExposureProgram are: +#define PHOTO_EXPOSUREPROGRAM_UNKNOWN 0ul +#define PHOTO_EXPOSUREPROGRAM_MANUAL 1ul +#define PHOTO_EXPOSUREPROGRAM_NORMAL 2ul +#define PHOTO_EXPOSUREPROGRAM_APERTURE 3ul +#define PHOTO_EXPOSUREPROGRAM_SHUTTER 4ul +#define PHOTO_EXPOSUREPROGRAM_CREATIVE 5ul +#define PHOTO_EXPOSUREPROGRAM_ACTION 6ul +#define PHOTO_EXPOSUREPROGRAM_PORTRAIT 7ul +#define PHOTO_EXPOSUREPROGRAM_LANDSCAPE 8ul + +// Name: System.Photo.ExposureProgramText -- PKEY_Photo_ExposureProgramText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: FEC690B7-5F30-4646-AE47-4CAAFBA884A3, 100 +// +// This is the user-friendly form of System.Photo.ExposureProgram. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureProgramText, 0xFEC690B7, 0x5F30, 0x4646, 0xAE, 0x47, 0x4C, 0xAA, 0xFB, 0xA8, 0x84, 0xA3, 100); + +// Name: System.Photo.ExposureTime -- PKEY_Photo_ExposureTime +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 33434 +// +// PropertyTagExifExposureTime. Calculated from PKEY_Photo_ExposureTimeNumerator and PKEY_Photo_ExposureTimeDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureTime, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 33434); + +// Name: System.Photo.ExposureTimeDenominator -- PKEY_Photo_ExposureTimeDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 55E98597-AD16-42E0-B624-21599A199838, 100 +// +// Denominator of PKEY_Photo_ExposureTime +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureTimeDenominator, 0x55E98597, 0xAD16, 0x42E0, 0xB6, 0x24, 0x21, 0x59, 0x9A, 0x19, 0x98, 0x38, 100); + +// Name: System.Photo.ExposureTimeNumerator -- PKEY_Photo_ExposureTimeNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 257E44E2-9031-4323-AC38-85C552871B2E, 100 +// +// Numerator of PKEY_Photo_ExposureTime +DEFINE_PROPERTYKEY(PKEY_Photo_ExposureTimeNumerator, 0x257E44E2, 0x9031, 0x4323, 0xAC, 0x38, 0x85, 0xC5, 0x52, 0x87, 0x1B, 0x2E, 100); + +// Name: System.Photo.Flash -- PKEY_Photo_Flash +// Type: Byte -- VT_UI1 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37385 +// +// PropertyTagExifFlash +DEFINE_PROPERTYKEY(PKEY_Photo_Flash, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37385); + +// Possible discrete values for PKEY_Photo_Flash are: +#define PHOTO_FLASH_NONE 0 +#define PHOTO_FLASH_FLASH 1 +#define PHOTO_FLASH_WITHOUTSTROBE 5 +#define PHOTO_FLASH_WITHSTROBE 7 + +// Name: System.Photo.FlashEnergy -- PKEY_Photo_FlashEnergy +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 41483 +// +// PropertyTagExifFlashEnergy. Calculated from PKEY_Photo_FlashEnergyNumerator and PKEY_Photo_FlashEnergyDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_FlashEnergy, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 41483); + +// Name: System.Photo.FlashEnergyDenominator -- PKEY_Photo_FlashEnergyDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: D7B61C70-6323-49CD-A5FC-C84277162C97, 100 +// +// Denominator of PKEY_Photo_FlashEnergy +DEFINE_PROPERTYKEY(PKEY_Photo_FlashEnergyDenominator, 0xD7B61C70, 0x6323, 0x49CD, 0xA5, 0xFC, 0xC8, 0x42, 0x77, 0x16, 0x2C, 0x97, 100); + +// Name: System.Photo.FlashEnergyNumerator -- PKEY_Photo_FlashEnergyNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: FCAD3D3D-0858-400F-AAA3-2F66CCE2A6BC, 100 +// +// Numerator of PKEY_Photo_FlashEnergy +DEFINE_PROPERTYKEY(PKEY_Photo_FlashEnergyNumerator, 0xFCAD3D3D, 0x0858, 0x400F, 0xAA, 0xA3, 0x2F, 0x66, 0xCC, 0xE2, 0xA6, 0xBC, 100); + +// Name: System.Photo.FlashManufacturer -- PKEY_Photo_FlashManufacturer +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: AABAF6C9-E0C5-4719-8585-57B103E584FE, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_FlashManufacturer, 0xAABAF6C9, 0xE0C5, 0x4719, 0x85, 0x85, 0x57, 0xB1, 0x03, 0xE5, 0x84, 0xFE, 100); + +// Name: System.Photo.FlashModel -- PKEY_Photo_FlashModel +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: FE83BB35-4D1A-42E2-916B-06F3E1AF719E, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_FlashModel, 0xFE83BB35, 0x4D1A, 0x42E2, 0x91, 0x6B, 0x06, 0xF3, 0xE1, 0xAF, 0x71, 0x9E, 100); + +// Name: System.Photo.FlashText -- PKEY_Photo_FlashText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6B8B68F6-200B-47EA-8D25-D8050F57339F, 100 +// +// This is the user-friendly form of System.Photo.Flash. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_FlashText, 0x6B8B68F6, 0x200B, 0x47EA, 0x8D, 0x25, 0xD8, 0x05, 0x0F, 0x57, 0x33, 0x9F, 100); + +// Name: System.Photo.FNumber -- PKEY_Photo_FNumber +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 33437 +// +// PropertyTagExifFNumber. Calculated from PKEY_Photo_FNumberNumerator and PKEY_Photo_FNumberDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_FNumber, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 33437); + +// Name: System.Photo.FNumberDenominator -- PKEY_Photo_FNumberDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: E92A2496-223B-4463-A4E3-30EABBA79D80, 100 +// +// Denominator of PKEY_Photo_FNumber +DEFINE_PROPERTYKEY(PKEY_Photo_FNumberDenominator, 0xE92A2496, 0x223B, 0x4463, 0xA4, 0xE3, 0x30, 0xEA, 0xBB, 0xA7, 0x9D, 0x80, 100); + +// Name: System.Photo.FNumberNumerator -- PKEY_Photo_FNumberNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 1B97738A-FDFC-462F-9D93-1957E08BE90C, 100 +// +// Numerator of PKEY_Photo_FNumber +DEFINE_PROPERTYKEY(PKEY_Photo_FNumberNumerator, 0x1B97738A, 0xFDFC, 0x462F, 0x9D, 0x93, 0x19, 0x57, 0xE0, 0x8B, 0xE9, 0x0C, 100); + +// Name: System.Photo.FocalLength -- PKEY_Photo_FocalLength +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37386 +// +// PropertyTagExifFocalLength. Calculated from PKEY_Photo_FocalLengthNumerator and PKEY_Photo_FocalLengthDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_FocalLength, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37386); + +// Name: System.Photo.FocalLengthDenominator -- PKEY_Photo_FocalLengthDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 305BC615-DCA1-44A5-9FD4-10C0BA79412E, 100 +// +// Denominator of PKEY_Photo_FocalLength +DEFINE_PROPERTYKEY(PKEY_Photo_FocalLengthDenominator, 0x305BC615, 0xDCA1, 0x44A5, 0x9F, 0xD4, 0x10, 0xC0, 0xBA, 0x79, 0x41, 0x2E, 100); + +// Name: System.Photo.FocalLengthInFilm -- PKEY_Photo_FocalLengthInFilm +// Type: UInt16 -- VT_UI2 +// FormatID: A0E74609-B84D-4F49-B860-462BD9971F98, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_FocalLengthInFilm, 0xA0E74609, 0xB84D, 0x4F49, 0xB8, 0x60, 0x46, 0x2B, 0xD9, 0x97, 0x1F, 0x98, 100); + +// Name: System.Photo.FocalLengthNumerator -- PKEY_Photo_FocalLengthNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 776B6B3B-1E3D-4B0C-9A0E-8FBAF2A8492A, 100 +// +// Numerator of PKEY_Photo_FocalLength +DEFINE_PROPERTYKEY(PKEY_Photo_FocalLengthNumerator, 0x776B6B3B, 0x1E3D, 0x4B0C, 0x9A, 0x0E, 0x8F, 0xBA, 0xF2, 0xA8, 0x49, 0x2A, 100); + +// Name: System.Photo.FocalPlaneXResolution -- PKEY_Photo_FocalPlaneXResolution +// Type: Double -- VT_R8 +// FormatID: CFC08D97-C6F7-4484-89DD-EBEF4356FE76, 100 +// +// PropertyTagExifFocalXRes. Calculated from PKEY_Photo_FocalPlaneXResolutionNumerator and +// PKEY_Photo_FocalPlaneXResolutionDenominator. +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneXResolution, 0xCFC08D97, 0xC6F7, 0x4484, 0x89, 0xDD, 0xEB, 0xEF, 0x43, 0x56, 0xFE, 0x76, 100); + +// Name: System.Photo.FocalPlaneXResolutionDenominator -- PKEY_Photo_FocalPlaneXResolutionDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 0933F3F5-4786-4F46-A8E8-D64DD37FA521, 100 +// +// Denominator of PKEY_Photo_FocalPlaneXResolution +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneXResolutionDenominator, 0x0933F3F5, 0x4786, 0x4F46, 0xA8, 0xE8, 0xD6, 0x4D, 0xD3, 0x7F, 0xA5, 0x21, 100); + +// Name: System.Photo.FocalPlaneXResolutionNumerator -- PKEY_Photo_FocalPlaneXResolutionNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: DCCB10AF-B4E2-4B88-95F9-031B4D5AB490, 100 +// +// Numerator of PKEY_Photo_FocalPlaneXResolution +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneXResolutionNumerator, 0xDCCB10AF, 0xB4E2, 0x4B88, 0x95, 0xF9, 0x03, 0x1B, 0x4D, 0x5A, 0xB4, 0x90, 100); + +// Name: System.Photo.FocalPlaneYResolution -- PKEY_Photo_FocalPlaneYResolution +// Type: Double -- VT_R8 +// FormatID: 4FFFE4D0-914F-4AC4-8D6F-C9C61DE169B1, 100 +// +// PropertyTagExifFocalYRes. Calculated from PKEY_Photo_FocalPlaneYResolutionNumerator and +// PKEY_Photo_FocalPlaneYResolutionDenominator. +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneYResolution, 0x4FFFE4D0, 0x914F, 0x4AC4, 0x8D, 0x6F, 0xC9, 0xC6, 0x1D, 0xE1, 0x69, 0xB1, 100); + +// Name: System.Photo.FocalPlaneYResolutionDenominator -- PKEY_Photo_FocalPlaneYResolutionDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 1D6179A6-A876-4031-B013-3347B2B64DC8, 100 +// +// Denominator of PKEY_Photo_FocalPlaneYResolution +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneYResolutionDenominator, 0x1D6179A6, 0xA876, 0x4031, 0xB0, 0x13, 0x33, 0x47, 0xB2, 0xB6, 0x4D, 0xC8, 100); + +// Name: System.Photo.FocalPlaneYResolutionNumerator -- PKEY_Photo_FocalPlaneYResolutionNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: A2E541C5-4440-4BA8-867E-75CFC06828CD, 100 +// +// Numerator of PKEY_Photo_FocalPlaneYResolution +DEFINE_PROPERTYKEY(PKEY_Photo_FocalPlaneYResolutionNumerator, 0xA2E541C5, 0x4440, 0x4BA8, 0x86, 0x7E, 0x75, 0xCF, 0xC0, 0x68, 0x28, 0xCD, 100); + +// Name: System.Photo.GainControl -- PKEY_Photo_GainControl +// Type: Double -- VT_R8 +// FormatID: FA304789-00C7-4D80-904A-1E4DCC7265AA, 100 (PropertyTagExifGainControl) +// +// This indicates the degree of overall image gain adjustment. +// +// Calculated from PKEY_Photo_GainControlNumerator and PKEY_Photo_GainControlDenominator. +DEFINE_PROPERTYKEY(PKEY_Photo_GainControl, 0xFA304789, 0x00C7, 0x4D80, 0x90, 0x4A, 0x1E, 0x4D, 0xCC, 0x72, 0x65, 0xAA, 100); + +// Possible discrete values for PKEY_Photo_GainControl are: +#define PHOTO_GAINCONTROL_NONE 0.0 +#define PHOTO_GAINCONTROL_LOWGAINUP 1.0 +#define PHOTO_GAINCONTROL_HIGHGAINUP 2.0 +#define PHOTO_GAINCONTROL_LOWGAINDOWN 3.0 +#define PHOTO_GAINCONTROL_HIGHGAINDOWN 4.0 + +// Name: System.Photo.GainControlDenominator -- PKEY_Photo_GainControlDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 42864DFD-9DA4-4F77-BDED-4AAD7B256735, 100 +// +// Denominator of PKEY_Photo_GainControl +DEFINE_PROPERTYKEY(PKEY_Photo_GainControlDenominator, 0x42864DFD, 0x9DA4, 0x4F77, 0xBD, 0xED, 0x4A, 0xAD, 0x7B, 0x25, 0x67, 0x35, 100); + +// Name: System.Photo.GainControlNumerator -- PKEY_Photo_GainControlNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 8E8ECF7C-B7B8-4EB8-A63F-0EE715C96F9E, 100 +// +// Numerator of PKEY_Photo_GainControl +DEFINE_PROPERTYKEY(PKEY_Photo_GainControlNumerator, 0x8E8ECF7C, 0xB7B8, 0x4EB8, 0xA6, 0x3F, 0x0E, 0xE7, 0x15, 0xC9, 0x6F, 0x9E, 100); + +// Name: System.Photo.GainControlText -- PKEY_Photo_GainControlText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C06238B2-0BF9-4279-A723-25856715CB9D, 100 +// +// This is the user-friendly form of System.Photo.GainControl. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_GainControlText, 0xC06238B2, 0x0BF9, 0x4279, 0xA7, 0x23, 0x25, 0x85, 0x67, 0x15, 0xCB, 0x9D, 100); + +// Name: System.Photo.ISOSpeed -- PKEY_Photo_ISOSpeed +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 34855 +// +// PropertyTagExifISOSpeed +DEFINE_PROPERTYKEY(PKEY_Photo_ISOSpeed, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 34855); + +// Name: System.Photo.LensManufacturer -- PKEY_Photo_LensManufacturer +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E6DDCAF7-29C5-4F0A-9A68-D19412EC7090, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_LensManufacturer, 0xE6DDCAF7, 0x29C5, 0x4F0A, 0x9A, 0x68, 0xD1, 0x94, 0x12, 0xEC, 0x70, 0x90, 100); + +// Name: System.Photo.LensModel -- PKEY_Photo_LensModel +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: E1277516-2B5F-4869-89B1-2E585BD38B7A, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_LensModel, 0xE1277516, 0x2B5F, 0x4869, 0x89, 0xB1, 0x2E, 0x58, 0x5B, 0xD3, 0x8B, 0x7A, 100); + +// Name: System.Photo.LightSource -- PKEY_Photo_LightSource +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37384 +// +// PropertyTagExifLightSource +DEFINE_PROPERTYKEY(PKEY_Photo_LightSource, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37384); + +// Possible discrete values for PKEY_Photo_LightSource are: +#define PHOTO_LIGHTSOURCE_UNKNOWN 0ul +#define PHOTO_LIGHTSOURCE_DAYLIGHT 1ul +#define PHOTO_LIGHTSOURCE_FLUORESCENT 2ul +#define PHOTO_LIGHTSOURCE_TUNGSTEN 3ul +#define PHOTO_LIGHTSOURCE_STANDARD_A 17ul +#define PHOTO_LIGHTSOURCE_STANDARD_B 18ul +#define PHOTO_LIGHTSOURCE_STANDARD_C 19ul +#define PHOTO_LIGHTSOURCE_D55 20ul +#define PHOTO_LIGHTSOURCE_D65 21ul +#define PHOTO_LIGHTSOURCE_D75 22ul + +// Name: System.Photo.MakerNote -- PKEY_Photo_MakerNote +// Type: Buffer -- VT_VECTOR | VT_UI1 (For variants: VT_ARRAY | VT_UI1) +// FormatID: FA303353-B659-4052-85E9-BCAC79549B84, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_MakerNote, 0xFA303353, 0xB659, 0x4052, 0x85, 0xE9, 0xBC, 0xAC, 0x79, 0x54, 0x9B, 0x84, 100); + +// Name: System.Photo.MakerNoteOffset -- PKEY_Photo_MakerNoteOffset +// Type: UInt64 -- VT_UI8 +// FormatID: 813F4124-34E6-4D17-AB3E-6B1F3C2247A1, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_MakerNoteOffset, 0x813F4124, 0x34E6, 0x4D17, 0xAB, 0x3E, 0x6B, 0x1F, 0x3C, 0x22, 0x47, 0xA1, 100); + +// Name: System.Photo.MaxAperture -- PKEY_Photo_MaxAperture +// Type: Double -- VT_R8 +// FormatID: 08F6D7C2-E3F2-44FC-AF1E-5AA5C81A2D3E, 100 +// +// Calculated from PKEY_Photo_MaxApertureNumerator and PKEY_Photo_MaxApertureDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_MaxAperture, 0x08F6D7C2, 0xE3F2, 0x44FC, 0xAF, 0x1E, 0x5A, 0xA5, 0xC8, 0x1A, 0x2D, 0x3E, 100); + +// Name: System.Photo.MaxApertureDenominator -- PKEY_Photo_MaxApertureDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: C77724D4-601F-46C5-9B89-C53F93BCEB77, 100 +// +// Denominator of PKEY_Photo_MaxAperture +DEFINE_PROPERTYKEY(PKEY_Photo_MaxApertureDenominator, 0xC77724D4, 0x601F, 0x46C5, 0x9B, 0x89, 0xC5, 0x3F, 0x93, 0xBC, 0xEB, 0x77, 100); + +// Name: System.Photo.MaxApertureNumerator -- PKEY_Photo_MaxApertureNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: C107E191-A459-44C5-9AE6-B952AD4B906D, 100 +// +// Numerator of PKEY_Photo_MaxAperture +DEFINE_PROPERTYKEY(PKEY_Photo_MaxApertureNumerator, 0xC107E191, 0xA459, 0x44C5, 0x9A, 0xE6, 0xB9, 0x52, 0xAD, 0x4B, 0x90, 0x6D, 100); + +// Name: System.Photo.MeteringMode -- PKEY_Photo_MeteringMode +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37383 +// +// PropertyTagExifMeteringMode +DEFINE_PROPERTYKEY(PKEY_Photo_MeteringMode, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37383); + +// Possible discrete values for PKEY_Photo_MeteringMode are: +#define PHOTO_METERINGMODE_UNKNOWN 0u +#define PHOTO_METERINGMODE_AVERAGE 1u +#define PHOTO_METERINGMODE_CENTER 2u +#define PHOTO_METERINGMODE_SPOT 3u +#define PHOTO_METERINGMODE_MULTISPOT 4u +#define PHOTO_METERINGMODE_PATTERN 5u +#define PHOTO_METERINGMODE_PARTIAL 6u + +// Name: System.Photo.MeteringModeText -- PKEY_Photo_MeteringModeText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: F628FD8C-7BA8-465A-A65B-C5AA79263A9E, 100 +// +// This is the user-friendly form of System.Photo.MeteringMode. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_MeteringModeText, 0xF628FD8C, 0x7BA8, 0x465A, 0xA6, 0x5B, 0xC5, 0xAA, 0x79, 0x26, 0x3A, 0x9E, 100); + +// Name: System.Photo.Orientation -- PKEY_Photo_Orientation +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 274 (PropertyTagOrientation) +// +// This is the image orientation viewed in terms of rows and columns. +DEFINE_PROPERTYKEY(PKEY_Photo_Orientation, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 274); + +// Possible discrete values for PKEY_Photo_Orientation are: +#define PHOTO_ORIENTATION_NORMAL 1u +#define PHOTO_ORIENTATION_FLIPHORIZONTAL 2u +#define PHOTO_ORIENTATION_ROTATE180 3u +#define PHOTO_ORIENTATION_FLIPVERTICAL 4u +#define PHOTO_ORIENTATION_TRANSPOSE 5u +#define PHOTO_ORIENTATION_ROTATE270 6u +#define PHOTO_ORIENTATION_TRANSVERSE 7u +#define PHOTO_ORIENTATION_ROTATE90 8u + +// Name: System.Photo.OrientationText -- PKEY_Photo_OrientationText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A9EA193C-C511-498A-A06B-58E2776DCC28, 100 +// +// This is the user-friendly form of System.Photo.Orientation. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_OrientationText, 0xA9EA193C, 0xC511, 0x498A, 0xA0, 0x6B, 0x58, 0xE2, 0x77, 0x6D, 0xCC, 0x28, 100); + +// Name: System.Photo.PhotometricInterpretation -- PKEY_Photo_PhotometricInterpretation +// Type: UInt16 -- VT_UI2 +// FormatID: 341796F1-1DF9-4B1C-A564-91BDEFA43877, 100 +// +// This is the pixel composition. In JPEG compressed data, a JPEG marker is used +// instead of this property. +DEFINE_PROPERTYKEY(PKEY_Photo_PhotometricInterpretation, 0x341796F1, 0x1DF9, 0x4B1C, 0xA5, 0x64, 0x91, 0xBD, 0xEF, 0xA4, 0x38, 0x77, 100); + +// Possible discrete values for PKEY_Photo_PhotometricInterpretation are: +#define PHOTO_PHOTOMETRIC_RGB 2u +#define PHOTO_PHOTOMETRIC_YCBCR 6u + +// Name: System.Photo.PhotometricInterpretationText -- PKEY_Photo_PhotometricInterpretationText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 821437D6-9EAB-4765-A589-3B1CBBD22A61, 100 +// +// This is the user-friendly form of System.Photo.PhotometricInterpretation. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_PhotometricInterpretationText, 0x821437D6, 0x9EAB, 0x4765, 0xA5, 0x89, 0x3B, 0x1C, 0xBB, 0xD2, 0x2A, 0x61, 100); + +// Name: System.Photo.ProgramMode -- PKEY_Photo_ProgramMode +// Type: UInt32 -- VT_UI4 +// FormatID: 6D217F6D-3F6A-4825-B470-5F03CA2FBE9B, 100 +// +// This is the class of the program used by the camera to set exposure when the +// picture is taken. +DEFINE_PROPERTYKEY(PKEY_Photo_ProgramMode, 0x6D217F6D, 0x3F6A, 0x4825, 0xB4, 0x70, 0x5F, 0x03, 0xCA, 0x2F, 0xBE, 0x9B, 100); + +// Possible discrete values for PKEY_Photo_ProgramMode are: +#define PHOTO_PROGRAMMODE_NOTDEFINED 0ul +#define PHOTO_PROGRAMMODE_MANUAL 1ul +#define PHOTO_PROGRAMMODE_NORMAL 2ul +#define PHOTO_PROGRAMMODE_APERTURE 3ul +#define PHOTO_PROGRAMMODE_SHUTTER 4ul +#define PHOTO_PROGRAMMODE_CREATIVE 5ul +#define PHOTO_PROGRAMMODE_ACTION 6ul +#define PHOTO_PROGRAMMODE_PORTRAIT 7ul +#define PHOTO_PROGRAMMODE_LANDSCAPE 8ul + +// Name: System.Photo.ProgramModeText -- PKEY_Photo_ProgramModeText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7FE3AA27-2648-42F3-89B0-454E5CB150C3, 100 +// +// This is the user-friendly form of System.Photo.ProgramMode. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_ProgramModeText, 0x7FE3AA27, 0x2648, 0x42F3, 0x89, 0xB0, 0x45, 0x4E, 0x5C, 0xB1, 0x50, 0xC3, 100); + +// Name: System.Photo.RelatedSoundFile -- PKEY_Photo_RelatedSoundFile +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 318A6B45-087F-4DC2-B8CC-05359551FC9E, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_RelatedSoundFile, 0x318A6B45, 0x087F, 0x4DC2, 0xB8, 0xCC, 0x05, 0x35, 0x95, 0x51, 0xFC, 0x9E, 100); + +// Name: System.Photo.Saturation -- PKEY_Photo_Saturation +// Type: UInt32 -- VT_UI4 +// FormatID: 49237325-A95A-4F67-B211-816B2D45D2E0, 100 +// +// This indicates the direction of saturation processing applied by the camera when +// the image was shot. +DEFINE_PROPERTYKEY(PKEY_Photo_Saturation, 0x49237325, 0xA95A, 0x4F67, 0xB2, 0x11, 0x81, 0x6B, 0x2D, 0x45, 0xD2, 0xE0, 100); + +// Possible discrete values for PKEY_Photo_Saturation are: +#define PHOTO_SATURATION_NORMAL 0ul +#define PHOTO_SATURATION_LOW 1ul +#define PHOTO_SATURATION_HIGH 2ul + +// Name: System.Photo.SaturationText -- PKEY_Photo_SaturationText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 61478C08-B600-4A84-BBE4-E99C45F0A072, 100 +// +// This is the user-friendly form of System.Photo.Saturation. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_SaturationText, 0x61478C08, 0xB600, 0x4A84, 0xBB, 0xE4, 0xE9, 0x9C, 0x45, 0xF0, 0xA0, 0x72, 100); + +// Name: System.Photo.Sharpness -- PKEY_Photo_Sharpness +// Type: UInt32 -- VT_UI4 +// FormatID: FC6976DB-8349-4970-AE97-B3C5316A08F0, 100 +// +// This indicates the direction of sharpness processing applied by the camera when +// the image was shot. +DEFINE_PROPERTYKEY(PKEY_Photo_Sharpness, 0xFC6976DB, 0x8349, 0x4970, 0xAE, 0x97, 0xB3, 0xC5, 0x31, 0x6A, 0x08, 0xF0, 100); + +// Possible discrete values for PKEY_Photo_Sharpness are: +#define PHOTO_SHARPNESS_NORMAL 0ul +#define PHOTO_SHARPNESS_SOFT 1ul +#define PHOTO_SHARPNESS_HARD 2ul + +// Name: System.Photo.SharpnessText -- PKEY_Photo_SharpnessText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 51EC3F47-DD50-421D-8769-334F50424B1E, 100 +// +// This is the user-friendly form of System.Photo.Sharpness. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_SharpnessText, 0x51EC3F47, 0xDD50, 0x421D, 0x87, 0x69, 0x33, 0x4F, 0x50, 0x42, 0x4B, 0x1E, 100); + +// Name: System.Photo.ShutterSpeed -- PKEY_Photo_ShutterSpeed +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37377 +// +// PropertyTagExifShutterSpeed. Calculated from PKEY_Photo_ShutterSpeedNumerator and PKEY_Photo_ShutterSpeedDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_ShutterSpeed, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37377); + +// Name: System.Photo.ShutterSpeedDenominator -- PKEY_Photo_ShutterSpeedDenominator +// Type: Int32 -- VT_I4 +// FormatID: E13D8975-81C7-4948-AE3F-37CAE11E8FF7, 100 +// +// Denominator of PKEY_Photo_ShutterSpeed +DEFINE_PROPERTYKEY(PKEY_Photo_ShutterSpeedDenominator, 0xE13D8975, 0x81C7, 0x4948, 0xAE, 0x3F, 0x37, 0xCA, 0xE1, 0x1E, 0x8F, 0xF7, 100); + +// Name: System.Photo.ShutterSpeedNumerator -- PKEY_Photo_ShutterSpeedNumerator +// Type: Int32 -- VT_I4 +// FormatID: 16EA4042-D6F4-4BCA-8349-7C78D30FB333, 100 +// +// Numerator of PKEY_Photo_ShutterSpeed +DEFINE_PROPERTYKEY(PKEY_Photo_ShutterSpeedNumerator, 0x16EA4042, 0xD6F4, 0x4BCA, 0x83, 0x49, 0x7C, 0x78, 0xD3, 0x0F, 0xB3, 0x33, 100); + +// Name: System.Photo.SubjectDistance -- PKEY_Photo_SubjectDistance +// Type: Double -- VT_R8 +// FormatID: (FMTID_ImageProperties) 14B81DA1-0135-4D31-96D9-6CBFC9671A99, 37382 +// +// PropertyTagExifSubjectDist. Calculated from PKEY_Photo_SubjectDistanceNumerator and PKEY_Photo_SubjectDistanceDenominator +DEFINE_PROPERTYKEY(PKEY_Photo_SubjectDistance, 0x14B81DA1, 0x0135, 0x4D31, 0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99, 37382); + +// Name: System.Photo.SubjectDistanceDenominator -- PKEY_Photo_SubjectDistanceDenominator +// Type: UInt32 -- VT_UI4 +// FormatID: 0C840A88-B043-466D-9766-D4B26DA3FA77, 100 +// +// Denominator of PKEY_Photo_SubjectDistance +DEFINE_PROPERTYKEY(PKEY_Photo_SubjectDistanceDenominator, 0x0C840A88, 0xB043, 0x466D, 0x97, 0x66, 0xD4, 0xB2, 0x6D, 0xA3, 0xFA, 0x77, 100); + +// Name: System.Photo.SubjectDistanceNumerator -- PKEY_Photo_SubjectDistanceNumerator +// Type: UInt32 -- VT_UI4 +// FormatID: 8AF4961C-F526-43E5-AA81-DB768219178D, 100 +// +// Numerator of PKEY_Photo_SubjectDistance +DEFINE_PROPERTYKEY(PKEY_Photo_SubjectDistanceNumerator, 0x8AF4961C, 0xF526, 0x43E5, 0xAA, 0x81, 0xDB, 0x76, 0x82, 0x19, 0x17, 0x8D, 100); + +// Name: System.Photo.TranscodedForSync -- PKEY_Photo_TranscodedForSync +// Type: Boolean -- VT_BOOL +// FormatID: 9A8EBB75-6458-4E82-BACB-35C0095B03BB, 100 +DEFINE_PROPERTYKEY(PKEY_Photo_TranscodedForSync, 0x9A8EBB75, 0x6458, 0x4E82, 0xBA, 0xCB, 0x35, 0xC0, 0x09, 0x5B, 0x03, 0xBB, 100); + +// Name: System.Photo.WhiteBalance -- PKEY_Photo_WhiteBalance +// Type: UInt32 -- VT_UI4 +// FormatID: EE3D3D8A-5381-4CFA-B13B-AAF66B5F4EC9, 100 +// +// This indicates the white balance mode set when the image was shot. +DEFINE_PROPERTYKEY(PKEY_Photo_WhiteBalance, 0xEE3D3D8A, 0x5381, 0x4CFA, 0xB1, 0x3B, 0xAA, 0xF6, 0x6B, 0x5F, 0x4E, 0xC9, 100); + +// Possible discrete values for PKEY_Photo_WhiteBalance are: +#define PHOTO_WHITEBALANCE_AUTO 0ul +#define PHOTO_WHITEBALANCE_MANUAL 1ul + +// Name: System.Photo.WhiteBalanceText -- PKEY_Photo_WhiteBalanceText +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6336B95E-C7A7-426D-86FD-7AE3D39C84B4, 100 +// +// This is the user-friendly form of System.Photo.WhiteBalance. Not intended to be parsed +// programmatically. +DEFINE_PROPERTYKEY(PKEY_Photo_WhiteBalanceText, 0x6336B95E, 0xC7A7, 0x426D, 0x86, 0xFD, 0x7A, 0xE3, 0xD3, 0x9C, 0x84, 0xB4, 100); + +//----------------------------------------------------------------------------- +// PropGroup properties + +// Name: System.PropGroup.Advanced -- PKEY_PropGroup_Advanced +// Type: Null -- VT_NULL +// FormatID: 900A403B-097B-4B95-8AE2-071FDAEEB118, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Advanced, 0x900A403B, 0x097B, 0x4B95, 0x8A, 0xE2, 0x07, 0x1F, 0xDA, 0xEE, 0xB1, 0x18, 100); + +// Name: System.PropGroup.Audio -- PKEY_PropGroup_Audio +// Type: Null -- VT_NULL +// FormatID: 2804D469-788F-48AA-8570-71B9C187E138, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Audio, 0x2804D469, 0x788F, 0x48AA, 0x85, 0x70, 0x71, 0xB9, 0xC1, 0x87, 0xE1, 0x38, 100); + +// Name: System.PropGroup.Calendar -- PKEY_PropGroup_Calendar +// Type: Null -- VT_NULL +// FormatID: 9973D2B5-BFD8-438A-BA94-5349B293181A, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Calendar, 0x9973D2B5, 0xBFD8, 0x438A, 0xBA, 0x94, 0x53, 0x49, 0xB2, 0x93, 0x18, 0x1A, 100); + +// Name: System.PropGroup.Camera -- PKEY_PropGroup_Camera +// Type: Null -- VT_NULL +// FormatID: DE00DE32-547E-4981-AD4B-542F2E9007D8, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Camera, 0xDE00DE32, 0x547E, 0x4981, 0xAD, 0x4B, 0x54, 0x2F, 0x2E, 0x90, 0x07, 0xD8, 100); + +// Name: System.PropGroup.Contact -- PKEY_PropGroup_Contact +// Type: Null -- VT_NULL +// FormatID: DF975FD3-250A-4004-858F-34E29A3E37AA, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Contact, 0xDF975FD3, 0x250A, 0x4004, 0x85, 0x8F, 0x34, 0xE2, 0x9A, 0x3E, 0x37, 0xAA, 100); + +// Name: System.PropGroup.Content -- PKEY_PropGroup_Content +// Type: Null -- VT_NULL +// FormatID: D0DAB0BA-368A-4050-A882-6C010FD19A4F, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Content, 0xD0DAB0BA, 0x368A, 0x4050, 0xA8, 0x82, 0x6C, 0x01, 0x0F, 0xD1, 0x9A, 0x4F, 100); + +// Name: System.PropGroup.Description -- PKEY_PropGroup_Description +// Type: Null -- VT_NULL +// FormatID: 8969B275-9475-4E00-A887-FF93B8B41E44, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Description, 0x8969B275, 0x9475, 0x4E00, 0xA8, 0x87, 0xFF, 0x93, 0xB8, 0xB4, 0x1E, 0x44, 100); + +// Name: System.PropGroup.FileSystem -- PKEY_PropGroup_FileSystem +// Type: Null -- VT_NULL +// FormatID: E3A7D2C1-80FC-4B40-8F34-30EA111BDC2E, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_FileSystem, 0xE3A7D2C1, 0x80FC, 0x4B40, 0x8F, 0x34, 0x30, 0xEA, 0x11, 0x1B, 0xDC, 0x2E, 100); + +// Name: System.PropGroup.General -- PKEY_PropGroup_General +// Type: Null -- VT_NULL +// FormatID: CC301630-B192-4C22-B372-9F4C6D338E07, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_General, 0xCC301630, 0xB192, 0x4C22, 0xB3, 0x72, 0x9F, 0x4C, 0x6D, 0x33, 0x8E, 0x07, 100); + +// Name: System.PropGroup.GPS -- PKEY_PropGroup_GPS +// Type: Null -- VT_NULL +// FormatID: F3713ADA-90E3-4E11-AAE5-FDC17685B9BE, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_GPS, 0xF3713ADA, 0x90E3, 0x4E11, 0xAA, 0xE5, 0xFD, 0xC1, 0x76, 0x85, 0xB9, 0xBE, 100); + +// Name: System.PropGroup.Image -- PKEY_PropGroup_Image +// Type: Null -- VT_NULL +// FormatID: E3690A87-0FA8-4A2A-9A9F-FCE8827055AC, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Image, 0xE3690A87, 0x0FA8, 0x4A2A, 0x9A, 0x9F, 0xFC, 0xE8, 0x82, 0x70, 0x55, 0xAC, 100); + +// Name: System.PropGroup.Media -- PKEY_PropGroup_Media +// Type: Null -- VT_NULL +// FormatID: 61872CF7-6B5E-4B4B-AC2D-59DA84459248, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Media, 0x61872CF7, 0x6B5E, 0x4B4B, 0xAC, 0x2D, 0x59, 0xDA, 0x84, 0x45, 0x92, 0x48, 100); + +// Name: System.PropGroup.MediaAdvanced -- PKEY_PropGroup_MediaAdvanced +// Type: Null -- VT_NULL +// FormatID: 8859A284-DE7E-4642-99BA-D431D044B1EC, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_MediaAdvanced, 0x8859A284, 0xDE7E, 0x4642, 0x99, 0xBA, 0xD4, 0x31, 0xD0, 0x44, 0xB1, 0xEC, 100); + +// Name: System.PropGroup.Message -- PKEY_PropGroup_Message +// Type: Null -- VT_NULL +// FormatID: 7FD7259D-16B4-4135-9F97-7C96ECD2FA9E, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Message, 0x7FD7259D, 0x16B4, 0x4135, 0x9F, 0x97, 0x7C, 0x96, 0xEC, 0xD2, 0xFA, 0x9E, 100); + +// Name: System.PropGroup.Music -- PKEY_PropGroup_Music +// Type: Null -- VT_NULL +// FormatID: 68DD6094-7216-40F1-A029-43FE7127043F, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Music, 0x68DD6094, 0x7216, 0x40F1, 0xA0, 0x29, 0x43, 0xFE, 0x71, 0x27, 0x04, 0x3F, 100); + +// Name: System.PropGroup.Origin -- PKEY_PropGroup_Origin +// Type: Null -- VT_NULL +// FormatID: 2598D2FB-5569-4367-95DF-5CD3A177E1A5, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Origin, 0x2598D2FB, 0x5569, 0x4367, 0x95, 0xDF, 0x5C, 0xD3, 0xA1, 0x77, 0xE1, 0xA5, 100); + +// Name: System.PropGroup.PhotoAdvanced -- PKEY_PropGroup_PhotoAdvanced +// Type: Null -- VT_NULL +// FormatID: 0CB2BF5A-9EE7-4A86-8222-F01E07FDADAF, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_PhotoAdvanced, 0x0CB2BF5A, 0x9EE7, 0x4A86, 0x82, 0x22, 0xF0, 0x1E, 0x07, 0xFD, 0xAD, 0xAF, 100); + +// Name: System.PropGroup.RecordedTV -- PKEY_PropGroup_RecordedTV +// Type: Null -- VT_NULL +// FormatID: E7B33238-6584-4170-A5C0-AC25EFD9DA56, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_RecordedTV, 0xE7B33238, 0x6584, 0x4170, 0xA5, 0xC0, 0xAC, 0x25, 0xEF, 0xD9, 0xDA, 0x56, 100); + +// Name: System.PropGroup.Video -- PKEY_PropGroup_Video +// Type: Null -- VT_NULL +// FormatID: BEBE0920-7671-4C54-A3EB-49FDDFC191EE, 100 +DEFINE_PROPERTYKEY(PKEY_PropGroup_Video, 0xBEBE0920, 0x7671, 0x4C54, 0xA3, 0xEB, 0x49, 0xFD, 0xDF, 0xC1, 0x91, 0xEE, 100); + +//----------------------------------------------------------------------------- +// PropList properties + + + +// Name: System.PropList.ConflictPrompt -- PKEY_PropList_ConflictPrompt +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 11 +// +// The list of properties to show in the file operation conflict resolution dialog. Properties with empty +// values will not be displayed. Register under the regvalue of "ConflictPrompt". +DEFINE_PROPERTYKEY(PKEY_PropList_ConflictPrompt, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 11); + +// Name: System.PropList.ExtendedTileInfo -- PKEY_PropList_ExtendedTileInfo +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 9 +// +// The list of properties to show in the listview on extended tiles. Register under the regvalue of +// "ExtendedTileInfo". +DEFINE_PROPERTYKEY(PKEY_PropList_ExtendedTileInfo, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 9); + +// Name: System.PropList.FileOperationPrompt -- PKEY_PropList_FileOperationPrompt +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 10 +// +// The list of properties to show in the file operation confirmation dialog. Properties with empty values +// will not be displayed. If this list is not specified, then the InfoTip property list is used instead. +// Register under the regvalue of "FileOperationPrompt". +DEFINE_PROPERTYKEY(PKEY_PropList_FileOperationPrompt, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 10); + +// Name: System.PropList.FullDetails -- PKEY_PropList_FullDetails +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 2 +// +// The list of all the properties to show in the details page. Property groups can be included in this list +// in order to more easily organize the UI. Register under the regvalue of "FullDetails". +DEFINE_PROPERTYKEY(PKEY_PropList_FullDetails, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 2); + +// Name: System.PropList.InfoTip -- PKEY_PropList_InfoTip +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 4 (PID_PROPLIST_INFOTIP) +// +// The list of properties to show in the infotip. Properties with empty values will not be displayed. Register +// under the regvalue of "InfoTip". +DEFINE_PROPERTYKEY(PKEY_PropList_InfoTip, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 4); + +// Name: System.PropList.NonPersonal -- PKEY_PropList_NonPersonal +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 49D1091F-082E-493F-B23F-D2308AA9668C, 100 +// +// The list of properties that are considered 'non-personal'. When told to remove all non-personal properties +// from a given file, the system will leave these particular properties untouched. Register under the regvalue +// of "NonPersonal". +DEFINE_PROPERTYKEY(PKEY_PropList_NonPersonal, 0x49D1091F, 0x082E, 0x493F, 0xB2, 0x3F, 0xD2, 0x30, 0x8A, 0xA9, 0x66, 0x8C, 100); + +// Name: System.PropList.PreviewDetails -- PKEY_PropList_PreviewDetails +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 8 +// +// The list of properties to display in the preview pane. Register under the regvalue of "PreviewDetails". +DEFINE_PROPERTYKEY(PKEY_PropList_PreviewDetails, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 8); + +// Name: System.PropList.PreviewTitle -- PKEY_PropList_PreviewTitle +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 6 +// +// The one or two properties to display in the preview pane title section. The optional second property is +// displayed as a subtitle. Register under the regvalue of "PreviewTitle". +DEFINE_PROPERTYKEY(PKEY_PropList_PreviewTitle, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 6); + +// Name: System.PropList.QuickTip -- PKEY_PropList_QuickTip +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 5 (PID_PROPLIST_QUICKTIP) +// +// The list of properties to show in the infotip when the item is on a slow network. Properties with empty +// values will not be displayed. Register under the regvalue of "QuickTip". +DEFINE_PROPERTYKEY(PKEY_PropList_QuickTip, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 5); + +// Name: System.PropList.TileInfo -- PKEY_PropList_TileInfo +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: C9944A21-A406-48FE-8225-AEC7E24C211B, 3 (PID_PROPLIST_TILEINFO) +// +// The list of properties to show in the listview on tiles. Register under the regvalue of "TileInfo". +DEFINE_PROPERTYKEY(PKEY_PropList_TileInfo, 0xC9944A21, 0xA406, 0x48FE, 0x82, 0x25, 0xAE, 0xC7, 0xE2, 0x4C, 0x21, 0x1B, 3); + +// Name: System.PropList.XPDetailsPanel -- PKEY_PropList_XPDetailsPanel +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_WebView) F2275480-F782-4291-BD94-F13693513AEC, 0 (PID_DISPLAY_PROPERTIES) +// +// The list of properties to display in the XP webview details panel. Obsolete. +DEFINE_PROPERTYKEY(PKEY_PropList_XPDetailsPanel, 0xF2275480, 0xF782, 0x4291, 0xBD, 0x94, 0xF1, 0x36, 0x93, 0x51, 0x3A, 0xEC, 0); + +//----------------------------------------------------------------------------- +// RecordedTV properties + + + +// Name: System.RecordedTV.ChannelNumber -- PKEY_RecordedTV_ChannelNumber +// Type: UInt32 -- VT_UI4 +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 7 +// +// Example: 42 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_ChannelNumber, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 7); + +// Name: System.RecordedTV.Credits -- PKEY_RecordedTV_Credits +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 4 +// +// Example: "Don Messick/Frank Welker/Casey Kasem/Heather North/Nicole Jaffe;;;" +DEFINE_PROPERTYKEY(PKEY_RecordedTV_Credits, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 4); + +// Name: System.RecordedTV.DateContentExpires -- PKEY_RecordedTV_DateContentExpires +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 15 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_DateContentExpires, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 15); + +// Name: System.RecordedTV.EpisodeName -- PKEY_RecordedTV_EpisodeName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 2 +// +// Example: "Nowhere to Hyde" +DEFINE_PROPERTYKEY(PKEY_RecordedTV_EpisodeName, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 2); + +// Name: System.RecordedTV.IsATSCContent -- PKEY_RecordedTV_IsATSCContent +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 16 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsATSCContent, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 16); + +// Name: System.RecordedTV.IsClosedCaptioningAvailable -- PKEY_RecordedTV_IsClosedCaptioningAvailable +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 12 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsClosedCaptioningAvailable, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 12); + +// Name: System.RecordedTV.IsDTVContent -- PKEY_RecordedTV_IsDTVContent +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 17 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsDTVContent, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 17); + +// Name: System.RecordedTV.IsHDContent -- PKEY_RecordedTV_IsHDContent +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 18 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsHDContent, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 18); + +// Name: System.RecordedTV.IsRepeatBroadcast -- PKEY_RecordedTV_IsRepeatBroadcast +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 13 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsRepeatBroadcast, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 13); + +// Name: System.RecordedTV.IsSAP -- PKEY_RecordedTV_IsSAP +// Type: Boolean -- VT_BOOL +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 14 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_IsSAP, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 14); + +// Name: System.RecordedTV.NetworkAffiliation -- PKEY_RecordedTV_NetworkAffiliation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 2C53C813-FB63-4E22-A1AB-0B331CA1E273, 100 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_NetworkAffiliation, 0x2C53C813, 0xFB63, 0x4E22, 0xA1, 0xAB, 0x0B, 0x33, 0x1C, 0xA1, 0xE2, 0x73, 100); + +// Name: System.RecordedTV.OriginalBroadcastDate -- PKEY_RecordedTV_OriginalBroadcastDate +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 4684FE97-8765-4842-9C13-F006447B178C, 100 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_OriginalBroadcastDate, 0x4684FE97, 0x8765, 0x4842, 0x9C, 0x13, 0xF0, 0x06, 0x44, 0x7B, 0x17, 0x8C, 100); + +// Name: System.RecordedTV.ProgramDescription -- PKEY_RecordedTV_ProgramDescription +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 3 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_ProgramDescription, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 3); + +// Name: System.RecordedTV.RecordingTime -- PKEY_RecordedTV_RecordingTime +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: A5477F61-7A82-4ECA-9DDE-98B69B2479B3, 100 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_RecordingTime, 0xA5477F61, 0x7A82, 0x4ECA, 0x9D, 0xDE, 0x98, 0xB6, 0x9B, 0x24, 0x79, 0xB3, 100); + +// Name: System.RecordedTV.StationCallSign -- PKEY_RecordedTV_StationCallSign +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 6D748DE2-8D38-4CC3-AC60-F009B057C557, 5 +// +// Example: "TOONP" +DEFINE_PROPERTYKEY(PKEY_RecordedTV_StationCallSign, 0x6D748DE2, 0x8D38, 0x4CC3, 0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57, 5); + +// Name: System.RecordedTV.StationName -- PKEY_RecordedTV_StationName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 1B5439E7-EBA1-4AF8-BDD7-7AF1D4549493, 100 +DEFINE_PROPERTYKEY(PKEY_RecordedTV_StationName, 0x1B5439E7, 0xEBA1, 0x4AF8, 0xBD, 0xD7, 0x7A, 0xF1, 0xD4, 0x54, 0x94, 0x93, 100); + +//----------------------------------------------------------------------------- +// Search properties + + + +// Name: System.Search.AutoSummary -- PKEY_Search_AutoSummary +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 560C36C0-503A-11CF-BAA1-00004C752A9A, 2 +// +// General Summary of the document. +DEFINE_PROPERTYKEY(PKEY_Search_AutoSummary, 0x560C36C0, 0x503A, 0x11CF, 0xBA, 0xA1, 0x00, 0x00, 0x4C, 0x75, 0x2A, 0x9A, 2); + +// Name: System.Search.ContainerHash -- PKEY_Search_ContainerHash +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: BCEEE283-35DF-4D53-826A-F36A3EEFC6BE, 100 +// +// Hash code used to identify attachments to be deleted based on a common container url +DEFINE_PROPERTYKEY(PKEY_Search_ContainerHash, 0xBCEEE283, 0x35DF, 0x4D53, 0x82, 0x6A, 0xF3, 0x6A, 0x3E, 0xEF, 0xC6, 0xBE, 100); + +// Name: System.Search.Contents -- PKEY_Search_Contents +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Storage) B725F130-47EF-101A-A5F1-02608C9EEBAC, 19 (PID_STG_CONTENTS) +// +// The contents of the item. This property is for query restrictions only; it cannot be retrieved in a +// query result. The Indexing Service friendly name is 'contents'. +DEFINE_PROPERTYKEY(PKEY_Search_Contents, 0xB725F130, 0x47EF, 0x101A, 0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC, 19); + +// Name: System.Search.EntryID -- PKEY_Search_EntryID +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_Query) 49691C90-7E17-101A-A91C-08002B2ECDA9, 5 (PROPID_QUERY_WORKID) +// +// The entry ID for an item within a given catalog in the Windows Search Index. +// This value may be recycled, and therefore is not considered unique over time. +DEFINE_PROPERTYKEY(PKEY_Search_EntryID, 0x49691C90, 0x7E17, 0x101A, 0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9, 5); + +// Name: System.Search.GatherTime -- PKEY_Search_GatherTime +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 0B63E350-9CCC-11D0-BCDB-00805FCCCE04, 8 +// +// The Datetime that the Windows Search Gatherer process last pushed properties of this document to the Windows Search Gatherer Plugins. +DEFINE_PROPERTYKEY(PKEY_Search_GatherTime, 0x0B63E350, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 8); + +// Name: System.Search.IsClosedDirectory -- PKEY_Search_IsClosedDirectory +// Type: Boolean -- VT_BOOL +// FormatID: 0B63E343-9CCC-11D0-BCDB-00805FCCCE04, 23 +// +// If this property is emitted with a value of TRUE, then it indicates that this URL's last modified time applies to all of it's children, and if this URL is deleted then all of it's children are deleted as well. For example, this would be emitted as TRUE when emitting the URL of an email so that all attachments are tied to the last modified time of that email. +DEFINE_PROPERTYKEY(PKEY_Search_IsClosedDirectory, 0x0B63E343, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 23); + +// Name: System.Search.IsFullyContained -- PKEY_Search_IsFullyContained +// Type: Boolean -- VT_BOOL +// FormatID: 0B63E343-9CCC-11D0-BCDB-00805FCCCE04, 24 +// +// Any child URL of a URL which has System.Search.IsClosedDirectory=TRUE must emit System.Search.IsFullyContained=TRUE. This ensures that the URL is not deleted at the end of a crawl because it hasn't been visited (which is the normal mechanism for detecting deletes). For example an email attachment would emit this property +DEFINE_PROPERTYKEY(PKEY_Search_IsFullyContained, 0x0B63E343, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 24); + +// Name: System.Search.QueryFocusedSummary -- PKEY_Search_QueryFocusedSummary +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 560C36C0-503A-11CF-BAA1-00004C752A9A, 3 +// +// Query Focused Summary of the document. +DEFINE_PROPERTYKEY(PKEY_Search_QueryFocusedSummary, 0x560C36C0, 0x503A, 0x11CF, 0xBA, 0xA1, 0x00, 0x00, 0x4C, 0x75, 0x2A, 0x9A, 3); + +// Name: System.Search.Rank -- PKEY_Search_Rank +// Type: Int32 -- VT_I4 +// FormatID: (FMTID_Query) 49691C90-7E17-101A-A91C-08002B2ECDA9, 3 (PROPID_QUERY_RANK) +// +// Relevance rank of row. Ranges from 0-1000. Larger numbers = better matches. Query-time only, not +// defined in Search schema, retrievable but not searchable. +DEFINE_PROPERTYKEY(PKEY_Search_Rank, 0x49691C90, 0x7E17, 0x101A, 0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9, 3); + +// Name: System.Search.Store -- PKEY_Search_Store +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: A06992B3-8CAF-4ED7-A547-B259E32AC9FC, 100 +// +// The identifier for the protocol handler that produced this item. (E.g. MAPI, CSC, FILE etc.) +DEFINE_PROPERTYKEY(PKEY_Search_Store, 0xA06992B3, 0x8CAF, 0x4ED7, 0xA5, 0x47, 0xB2, 0x59, 0xE3, 0x2A, 0xC9, 0xFC, 100); + +// Name: System.Search.UrlToIndex -- PKEY_Search_UrlToIndex +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 0B63E343-9CCC-11D0-BCDB-00805FCCCE04, 2 +// +// This property should be emitted by a container IFilter for each child URL within the container. The children will eventually be crawled by the indexer if they are within scope. +DEFINE_PROPERTYKEY(PKEY_Search_UrlToIndex, 0x0B63E343, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 2); + +// Name: System.Search.UrlToIndexWithModificationTime -- PKEY_Search_UrlToIndexWithModificationTime +// Type: Multivalue Any -- VT_VECTOR | VT_NULL (For variants: VT_ARRAY | VT_NULL) +// FormatID: 0B63E343-9CCC-11D0-BCDB-00805FCCCE04, 12 +// +// This property is the same as System.Search.UrlToIndex except that it includes the time the URL was last modified. This is an optimization for the indexer as it doesn't have to call back into the protocol handler to ask for this information to determine if the content needs to be indexed again. The property is a vector with two elements, a VT_LPWSTR with the URL and a VT_FILETIME for the last modified time. +DEFINE_PROPERTYKEY(PKEY_Search_UrlToIndexWithModificationTime, 0x0B63E343, 0x9CCC, 0x11D0, 0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04, 12); + +//----------------------------------------------------------------------------- +// Shell properties + + + +// Name: System.DescriptionID -- PKEY_DescriptionID +// Type: Buffer -- VT_VECTOR | VT_UI1 (For variants: VT_ARRAY | VT_UI1) +// FormatID: (FMTID_ShellDetails) 28636AA6-953D-11D2-B5D6-00C04FD918D0, 2 (PID_DESCRIPTIONID) +// +// The contents of a SHDESCRIPTIONID structure as a buffer of bytes. +DEFINE_PROPERTYKEY(PKEY_DescriptionID, 0x28636AA6, 0x953D, 0x11D2, 0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0, 2); + +// Name: System.Link.TargetSFGAOFlagsStrings -- PKEY_Link_TargetSFGAOFlagsStrings +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D6942081-D53B-443D-AD47-5E059D9CD27A, 3 +// +// Expresses the SFGAO flags of a link as string values and is used as a query optimization. See +// PKEY_Shell_SFGAOFlagsStrings for possible values of this. +DEFINE_PROPERTYKEY(PKEY_Link_TargetSFGAOFlagsStrings, 0xD6942081, 0xD53B, 0x443D, 0xAD, 0x47, 0x5E, 0x05, 0x9D, 0x9C, 0xD2, 0x7A, 3); + +// Name: System.Link.TargetUrl -- PKEY_Link_TargetUrl +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 5CBF2787-48CF-4208-B90E-EE5E5D420294, 2 (PKEYs relating to URLs. Used by IE History.) +DEFINE_PROPERTYKEY(PKEY_Link_TargetUrl, 0x5CBF2787, 0x48CF, 0x4208, 0xB9, 0x0E, 0xEE, 0x5E, 0x5D, 0x42, 0x02, 0x94, 2); + +// Name: System.Shell.SFGAOFlagsStrings -- PKEY_Shell_SFGAOFlagsStrings +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: D6942081-D53B-443D-AD47-5E059D9CD27A, 2 +// +// Expresses the SFGAO flags as string values and is used as a query optimization. +DEFINE_PROPERTYKEY(PKEY_Shell_SFGAOFlagsStrings, 0xD6942081, 0xD53B, 0x443D, 0xAD, 0x47, 0x5E, 0x05, 0x9D, 0x9C, 0xD2, 0x7A, 2); + +// Possible discrete values for PKEY_Shell_SFGAOFlagsStrings are: +#define SFGAOSTR_FILESYS L"filesys" // SFGAO_FILESYSTEM +#define SFGAOSTR_FILEANC L"fileanc" // SFGAO_FILESYSANCESTOR +#define SFGAOSTR_STORAGEANC L"storageanc" // SFGAO_STORAGEANCESTOR +#define SFGAOSTR_STREAM L"stream" // SFGAO_STREAM +#define SFGAOSTR_LINK L"link" // SFGAO_LINK +#define SFGAOSTR_HIDDEN L"hidden" // SFGAO_HIDDEN +#define SFGAOSTR_FOLDER L"folder" // SFGAO_FOLDER +#define SFGAOSTR_NONENUM L"nonenum" // SFGAO_NONENUMERATED +#define SFGAOSTR_BROWSABLE L"browsable" // SFGAO_BROWSABLE + +//----------------------------------------------------------------------------- +// Software properties + + + +// Name: System.Software.DateLastUsed -- PKEY_Software_DateLastUsed +// Type: DateTime -- VT_FILETIME (For variants: VT_DATE) +// FormatID: 841E4F90-FF59-4D16-8947-E81BBFFAB36D, 16 +// +// +DEFINE_PROPERTYKEY(PKEY_Software_DateLastUsed, 0x841E4F90, 0xFF59, 0x4D16, 0x89, 0x47, 0xE8, 0x1B, 0xBF, 0xFA, 0xB3, 0x6D, 16); + +// Name: System.Software.ProductName -- PKEY_Software_ProductName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (PSFMTID_VERSION) 0CEF7D53-FA64-11D1-A203-0000F81FEDEE, 7 +// +// +DEFINE_PROPERTYKEY(PKEY_Software_ProductName, 0x0CEF7D53, 0xFA64, 0x11D1, 0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE, 7); + +//----------------------------------------------------------------------------- +// Sync properties + + + +// Name: System.Sync.Comments -- PKEY_Sync_Comments +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 13 +DEFINE_PROPERTYKEY(PKEY_Sync_Comments, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 13); + +// Name: System.Sync.ConflictDescription -- PKEY_Sync_ConflictDescription +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CE50C159-2FB8-41FD-BE68-D3E042E274BC, 4 +DEFINE_PROPERTYKEY(PKEY_Sync_ConflictDescription, 0xCE50C159, 0x2FB8, 0x41FD, 0xBE, 0x68, 0xD3, 0xE0, 0x42, 0xE2, 0x74, 0xBC, 4); + +// Name: System.Sync.ConflictFirstLocation -- PKEY_Sync_ConflictFirstLocation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CE50C159-2FB8-41FD-BE68-D3E042E274BC, 6 +DEFINE_PROPERTYKEY(PKEY_Sync_ConflictFirstLocation, 0xCE50C159, 0x2FB8, 0x41FD, 0xBE, 0x68, 0xD3, 0xE0, 0x42, 0xE2, 0x74, 0xBC, 6); + +// Name: System.Sync.ConflictSecondLocation -- PKEY_Sync_ConflictSecondLocation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CE50C159-2FB8-41FD-BE68-D3E042E274BC, 7 +DEFINE_PROPERTYKEY(PKEY_Sync_ConflictSecondLocation, 0xCE50C159, 0x2FB8, 0x41FD, 0xBE, 0x68, 0xD3, 0xE0, 0x42, 0xE2, 0x74, 0xBC, 7); + +// Name: System.Sync.HandlerCollectionID -- PKEY_Sync_HandlerCollectionID +// Type: Guid -- VT_CLSID +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 2 +DEFINE_PROPERTYKEY(PKEY_Sync_HandlerCollectionID, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 2); + +// Name: System.Sync.HandlerID -- PKEY_Sync_HandlerID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 3 +DEFINE_PROPERTYKEY(PKEY_Sync_HandlerID, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 3); + +// Name: System.Sync.HandlerName -- PKEY_Sync_HandlerName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CE50C159-2FB8-41FD-BE68-D3E042E274BC, 2 +DEFINE_PROPERTYKEY(PKEY_Sync_HandlerName, 0xCE50C159, 0x2FB8, 0x41FD, 0xBE, 0x68, 0xD3, 0xE0, 0x42, 0xE2, 0x74, 0xBC, 2); + +// Name: System.Sync.HandlerType -- PKEY_Sync_HandlerType +// Type: UInt32 -- VT_UI4 +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 8 +// +// +DEFINE_PROPERTYKEY(PKEY_Sync_HandlerType, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 8); + +// Possible discrete values for PKEY_Sync_HandlerType are: +#define SYNC_HANDLERTYPE_OTHER 0ul +#define SYNC_HANDLERTYPE_PROGRAMS 1ul +#define SYNC_HANDLERTYPE_DEVICES 2ul +#define SYNC_HANDLERTYPE_FOLDERS 3ul +#define SYNC_HANDLERTYPE_WEBSERVICES 4ul +#define SYNC_HANDLERTYPE_COMPUTERS 5ul + +// Name: System.Sync.HandlerTypeLabel -- PKEY_Sync_HandlerTypeLabel +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 9 +// +// +DEFINE_PROPERTYKEY(PKEY_Sync_HandlerTypeLabel, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 9); + +// Name: System.Sync.ItemID -- PKEY_Sync_ItemID +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 7BD5533E-AF15-44DB-B8C8-BD6624E1D032, 6 +DEFINE_PROPERTYKEY(PKEY_Sync_ItemID, 0x7BD5533E, 0xAF15, 0x44DB, 0xB8, 0xC8, 0xBD, 0x66, 0x24, 0xE1, 0xD0, 0x32, 6); + +// Name: System.Sync.ItemName -- PKEY_Sync_ItemName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: CE50C159-2FB8-41FD-BE68-D3E042E274BC, 3 +DEFINE_PROPERTYKEY(PKEY_Sync_ItemName, 0xCE50C159, 0x2FB8, 0x41FD, 0xBE, 0x68, 0xD3, 0xE0, 0x42, 0xE2, 0x74, 0xBC, 3); + +//----------------------------------------------------------------------------- +// Task properties + +// Name: System.Task.BillingInformation -- PKEY_Task_BillingInformation +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: D37D52C6-261C-4303-82B3-08B926AC6F12, 100 +DEFINE_PROPERTYKEY(PKEY_Task_BillingInformation, 0xD37D52C6, 0x261C, 0x4303, 0x82, 0xB3, 0x08, 0xB9, 0x26, 0xAC, 0x6F, 0x12, 100); + +// Name: System.Task.CompletionStatus -- PKEY_Task_CompletionStatus +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 084D8A0A-E6D5-40DE-BF1F-C8820E7C877C, 100 +DEFINE_PROPERTYKEY(PKEY_Task_CompletionStatus, 0x084D8A0A, 0xE6D5, 0x40DE, 0xBF, 0x1F, 0xC8, 0x82, 0x0E, 0x7C, 0x87, 0x7C, 100); + +// Name: System.Task.Owner -- PKEY_Task_Owner +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: 08C7CC5F-60F2-4494-AD75-55E3E0B5ADD0, 100 +DEFINE_PROPERTYKEY(PKEY_Task_Owner, 0x08C7CC5F, 0x60F2, 0x4494, 0xAD, 0x75, 0x55, 0xE3, 0xE0, 0xB5, 0xAD, 0xD0, 100); + + + +//----------------------------------------------------------------------------- +// Video properties + +// Name: System.Video.Compression -- PKEY_Video_Compression +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 10 (PIDVSI_COMPRESSION) +// +// Indicates the level of compression for the video stream. "Compression". +DEFINE_PROPERTYKEY(PKEY_Video_Compression, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 10); + +// Name: System.Video.Director -- PKEY_Video_Director +// Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) +// FormatID: (PSGUID_MEDIAFILESUMMARYINFORMATION) 64440492-4C8B-11D1-8B70-080036B11A03, 20 (PIDMSI_DIRECTOR) +// +// +DEFINE_PROPERTYKEY(PKEY_Video_Director, 0x64440492, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 20); + +// Name: System.Video.EncodingBitrate -- PKEY_Video_EncodingBitrate +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 8 (PIDVSI_DATA_RATE) +// +// Indicates the data rate in "bits per second" for the video stream. "DataRate". +DEFINE_PROPERTYKEY(PKEY_Video_EncodingBitrate, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 8); + +// Name: System.Video.FourCC -- PKEY_Video_FourCC +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 44 +// +// Indicates the 4CC for the video stream. +DEFINE_PROPERTYKEY(PKEY_Video_FourCC, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 44); + +// Name: System.Video.FrameHeight -- PKEY_Video_FrameHeight +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 4 +// +// Indicates the frame height for the video stream. +DEFINE_PROPERTYKEY(PKEY_Video_FrameHeight, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 4); + +// Name: System.Video.FrameRate -- PKEY_Video_FrameRate +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 6 (PIDVSI_FRAME_RATE) +// +// Indicates the frame rate in "frames per millisecond" for the video stream. "FrameRate". +DEFINE_PROPERTYKEY(PKEY_Video_FrameRate, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 6); + +// Name: System.Video.FrameWidth -- PKEY_Video_FrameWidth +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 3 +// +// Indicates the frame width for the video stream. +DEFINE_PROPERTYKEY(PKEY_Video_FrameWidth, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 3); + +// Name: System.Video.HorizontalAspectRatio -- PKEY_Video_HorizontalAspectRatio +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 42 +// +// Indicates the horizontal portion of the aspect ratio. The X portion of XX:YY, +// like 16:9. +DEFINE_PROPERTYKEY(PKEY_Video_HorizontalAspectRatio, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 42); + +// Name: System.Video.SampleSize -- PKEY_Video_SampleSize +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 9 (PIDVSI_SAMPLE_SIZE) +// +// Indicates the sample size in bits for the video stream. "SampleSize". +DEFINE_PROPERTYKEY(PKEY_Video_SampleSize, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 9); + +// Name: System.Video.StreamName -- PKEY_Video_StreamName +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 2 (PIDVSI_STREAM_NAME) +// +// Indicates the name for the video stream. "StreamName". +DEFINE_PROPERTYKEY(PKEY_Video_StreamName, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 2); + +// Name: System.Video.StreamNumber -- PKEY_Video_StreamNumber +// Type: UInt16 -- VT_UI2 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 11 (PIDVSI_STREAM_NUMBER) +// +// "Stream Number". +DEFINE_PROPERTYKEY(PKEY_Video_StreamNumber, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 11); + +// Name: System.Video.TotalBitrate -- PKEY_Video_TotalBitrate +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 43 (PIDVSI_TOTAL_BITRATE) +// +// Indicates the total data rate in "bits per second" for all video and audio streams. +DEFINE_PROPERTYKEY(PKEY_Video_TotalBitrate, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 43); + +// Name: System.Video.VerticalAspectRatio -- PKEY_Video_VerticalAspectRatio +// Type: UInt32 -- VT_UI4 +// FormatID: (FMTID_VideoSummaryInformation) 64440491-4C8B-11D1-8B70-080036B11A03, 45 +// +// Indicates the vertical portion of the aspect ratio. The Y portion of +// XX:YY, like 16:9. +DEFINE_PROPERTYKEY(PKEY_Video_VerticalAspectRatio, 0x64440491, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 45); + + + +//----------------------------------------------------------------------------- +// Volume properties + +// Name: System.Volume.FileSystem -- PKEY_Volume_FileSystem +// Type: String -- VT_LPWSTR (For variants: VT_BSTR) +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 4 (PID_VOLUME_FILESYSTEM) (Filesystem Volume Properties) +// +// Indicates the filesystem of the volume. +DEFINE_PROPERTYKEY(PKEY_Volume_FileSystem, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 4); + +// Name: System.Volume.IsMappedDrive -- PKEY_Volume_IsMappedDrive +// Type: Boolean -- VT_BOOL +// FormatID: 149C0B69-2C2D-48FC-808F-D318D78C4636, 2 +DEFINE_PROPERTYKEY(PKEY_Volume_IsMappedDrive, 0x149C0B69, 0x2C2D, 0x48FC, 0x80, 0x8F, 0xD3, 0x18, 0xD7, 0x8C, 0x46, 0x36, 2); + +// Name: System.Volume.IsRoot -- PKEY_Volume_IsRoot +// Type: Boolean -- VT_BOOL +// FormatID: (FMTID_Volume) 9B174B35-40FF-11D2-A27E-00C04FC30871, 10 (Filesystem Volume Properties) +// +// +DEFINE_PROPERTYKEY(PKEY_Volume_IsRoot, 0x9B174B35, 0x40FF, 0x11D2, 0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71, 10); + +#endif /* _INC_PROPKEY */ + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkeydef.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkeydef.h new file mode 100644 index 0000000000..a361044e56 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propkeydef.h @@ -0,0 +1,26 @@ +#ifndef PID_FIRST_USABLE +#define PID_FIRST_USABLE 2 +#endif + +#ifndef REFPROPERTYKEY +#ifdef __cplusplus +#define REFPROPERTYKEY const PROPERTYKEY & +#else // !__cplusplus +#define REFPROPERTYKEY const PROPERTYKEY * __MIDL_CONST +#endif // __cplusplus +#endif //REFPROPERTYKEY + +#ifdef DEFINE_PROPERTYKEY +#undef DEFINE_PROPERTYKEY +#endif + +#ifdef INITGUID +#define DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const PROPERTYKEY DECLSPEC_SELECTANY name = { { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }, pid } +#else +#define DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const PROPERTYKEY name +#endif // INITGUID + +#ifndef IsEqualPropertyKey +#define IsEqualPropertyKey(a, b) (((a).pid == (b).pid) && IsEqualIID((a).fmtid, (b).fmtid) ) +#endif // IsEqualPropertyKey + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/propsys.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propsys.h new file mode 100644 index 0000000000..5ed560803f --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/propsys.h @@ -0,0 +1,3605 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for propsys.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __propsys_h__ +#define __propsys_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IInitializeWithFile_FWD_DEFINED__ +#define __IInitializeWithFile_FWD_DEFINED__ +typedef interface IInitializeWithFile IInitializeWithFile; +#endif /* __IInitializeWithFile_FWD_DEFINED__ */ + + +#ifndef __IInitializeWithStream_FWD_DEFINED__ +#define __IInitializeWithStream_FWD_DEFINED__ +typedef interface IInitializeWithStream IInitializeWithStream; +#endif /* __IInitializeWithStream_FWD_DEFINED__ */ + + +#ifndef __IPropertyStore_FWD_DEFINED__ +#define __IPropertyStore_FWD_DEFINED__ +typedef interface IPropertyStore IPropertyStore; +#endif /* __IPropertyStore_FWD_DEFINED__ */ + + +#ifndef __INamedPropertyStore_FWD_DEFINED__ +#define __INamedPropertyStore_FWD_DEFINED__ +typedef interface INamedPropertyStore INamedPropertyStore; +#endif /* __INamedPropertyStore_FWD_DEFINED__ */ + + +#ifndef __IObjectWithPropertyKey_FWD_DEFINED__ +#define __IObjectWithPropertyKey_FWD_DEFINED__ +typedef interface IObjectWithPropertyKey IObjectWithPropertyKey; +#endif /* __IObjectWithPropertyKey_FWD_DEFINED__ */ + + +#ifndef __IPropertyChange_FWD_DEFINED__ +#define __IPropertyChange_FWD_DEFINED__ +typedef interface IPropertyChange IPropertyChange; +#endif /* __IPropertyChange_FWD_DEFINED__ */ + + +#ifndef __IPropertyChangeArray_FWD_DEFINED__ +#define __IPropertyChangeArray_FWD_DEFINED__ +typedef interface IPropertyChangeArray IPropertyChangeArray; +#endif /* __IPropertyChangeArray_FWD_DEFINED__ */ + + +#ifndef __IPropertyStoreCapabilities_FWD_DEFINED__ +#define __IPropertyStoreCapabilities_FWD_DEFINED__ +typedef interface IPropertyStoreCapabilities IPropertyStoreCapabilities; +#endif /* __IPropertyStoreCapabilities_FWD_DEFINED__ */ + + +#ifndef __IPropertyStoreCache_FWD_DEFINED__ +#define __IPropertyStoreCache_FWD_DEFINED__ +typedef interface IPropertyStoreCache IPropertyStoreCache; +#endif /* __IPropertyStoreCache_FWD_DEFINED__ */ + + +#ifndef __IPropertyEnumType_FWD_DEFINED__ +#define __IPropertyEnumType_FWD_DEFINED__ +typedef interface IPropertyEnumType IPropertyEnumType; +#endif /* __IPropertyEnumType_FWD_DEFINED__ */ + + +#ifndef __IPropertyEnumTypeList_FWD_DEFINED__ +#define __IPropertyEnumTypeList_FWD_DEFINED__ +typedef interface IPropertyEnumTypeList IPropertyEnumTypeList; +#endif /* __IPropertyEnumTypeList_FWD_DEFINED__ */ + + +#ifndef __IPropertyDescription_FWD_DEFINED__ +#define __IPropertyDescription_FWD_DEFINED__ +typedef interface IPropertyDescription IPropertyDescription; +#endif /* __IPropertyDescription_FWD_DEFINED__ */ + + +#ifndef __IPropertyDescriptionAliasInfo_FWD_DEFINED__ +#define __IPropertyDescriptionAliasInfo_FWD_DEFINED__ +typedef interface IPropertyDescriptionAliasInfo IPropertyDescriptionAliasInfo; +#endif /* __IPropertyDescriptionAliasInfo_FWD_DEFINED__ */ + + +#ifndef __IPropertyDescriptionSearchInfo_FWD_DEFINED__ +#define __IPropertyDescriptionSearchInfo_FWD_DEFINED__ +typedef interface IPropertyDescriptionSearchInfo IPropertyDescriptionSearchInfo; +#endif /* __IPropertyDescriptionSearchInfo_FWD_DEFINED__ */ + + +#ifndef __IPropertySystem_FWD_DEFINED__ +#define __IPropertySystem_FWD_DEFINED__ +typedef interface IPropertySystem IPropertySystem; +#endif /* __IPropertySystem_FWD_DEFINED__ */ + + +#ifndef __IPropertyDescriptionList_FWD_DEFINED__ +#define __IPropertyDescriptionList_FWD_DEFINED__ +typedef interface IPropertyDescriptionList IPropertyDescriptionList; +#endif /* __IPropertyDescriptionList_FWD_DEFINED__ */ + + +#ifndef __IPropertyStoreFactory_FWD_DEFINED__ +#define __IPropertyStoreFactory_FWD_DEFINED__ +typedef interface IPropertyStoreFactory IPropertyStoreFactory; +#endif /* __IPropertyStoreFactory_FWD_DEFINED__ */ + + +#ifndef __IDelayedPropertyStoreFactory_FWD_DEFINED__ +#define __IDelayedPropertyStoreFactory_FWD_DEFINED__ +typedef interface IDelayedPropertyStoreFactory IDelayedPropertyStoreFactory; +#endif /* __IDelayedPropertyStoreFactory_FWD_DEFINED__ */ + + +#ifndef __IPersistSerializedPropStorage_FWD_DEFINED__ +#define __IPersistSerializedPropStorage_FWD_DEFINED__ +typedef interface IPersistSerializedPropStorage IPersistSerializedPropStorage; +#endif /* __IPersistSerializedPropStorage_FWD_DEFINED__ */ + + +#ifndef __IPropertySystemChangeNotify_FWD_DEFINED__ +#define __IPropertySystemChangeNotify_FWD_DEFINED__ +typedef interface IPropertySystemChangeNotify IPropertySystemChangeNotify; +#endif /* __IPropertySystemChangeNotify_FWD_DEFINED__ */ + + +#ifndef __ICreateObject_FWD_DEFINED__ +#define __ICreateObject_FWD_DEFINED__ +typedef interface ICreateObject ICreateObject; +#endif /* __ICreateObject_FWD_DEFINED__ */ + + +#ifndef __InMemoryPropertyStore_FWD_DEFINED__ +#define __InMemoryPropertyStore_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class InMemoryPropertyStore InMemoryPropertyStore; +#else +typedef struct InMemoryPropertyStore InMemoryPropertyStore; +#endif /* __cplusplus */ + +#endif /* __InMemoryPropertyStore_FWD_DEFINED__ */ + + +#ifndef __PropertySystem_FWD_DEFINED__ +#define __PropertySystem_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class PropertySystem PropertySystem; +#else +typedef struct PropertySystem PropertySystem; +#endif /* __cplusplus */ + +#endif /* __PropertySystem_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "objidl.h" +#include "oleidl.h" +#include "ocidl.h" +#include "shtypes.h" +#include "structuredquery.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_propsys_0000_0000 */ +/* [local] */ + +#ifndef PSSTDAPI +#if defined(_PROPSYS_) +#define PSSTDAPI STDAPI +#define PSSTDAPI_(type) STDAPI_(type) +#else +#define PSSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE +#define PSSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE +#endif +#endif // PSSTDAPI +#if 0 +typedef PROPERTYKEY *REFPROPERTYKEY; + +#endif // 0 +#include + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0000_v0_0_s_ifspec; + +#ifndef __IInitializeWithFile_INTERFACE_DEFINED__ +#define __IInitializeWithFile_INTERFACE_DEFINED__ + +/* interface IInitializeWithFile */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IInitializeWithFile; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("b7d14566-0509-4cce-a71f-0a554233bd9b") + IInitializeWithFile : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Initialize( + /* [string][in] */ __RPC__in LPCWSTR pszFilePath, + /* [in] */ DWORD grfMode) = 0; + + }; + +#else /* C style interface */ + + typedef struct IInitializeWithFileVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IInitializeWithFile * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IInitializeWithFile * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IInitializeWithFile * This); + + HRESULT ( STDMETHODCALLTYPE *Initialize )( + IInitializeWithFile * This, + /* [string][in] */ __RPC__in LPCWSTR pszFilePath, + /* [in] */ DWORD grfMode); + + END_INTERFACE + } IInitializeWithFileVtbl; + + interface IInitializeWithFile + { + CONST_VTBL struct IInitializeWithFileVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInitializeWithFile_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IInitializeWithFile_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IInitializeWithFile_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IInitializeWithFile_Initialize(This,pszFilePath,grfMode) \ + ( (This)->lpVtbl -> Initialize(This,pszFilePath,grfMode) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IInitializeWithFile_INTERFACE_DEFINED__ */ + + +#ifndef __IInitializeWithStream_INTERFACE_DEFINED__ +#define __IInitializeWithStream_INTERFACE_DEFINED__ + +/* interface IInitializeWithStream */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IInitializeWithStream; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("b824b49d-22ac-4161-ac8a-9916e8fa3f7f") + IInitializeWithStream : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Initialize( + /* [in] */ IStream *pstream, + /* [in] */ DWORD grfMode) = 0; + + }; + +#else /* C style interface */ + + typedef struct IInitializeWithStreamVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IInitializeWithStream * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IInitializeWithStream * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IInitializeWithStream * This); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Initialize )( + IInitializeWithStream * This, + /* [in] */ IStream *pstream, + /* [in] */ DWORD grfMode); + + END_INTERFACE + } IInitializeWithStreamVtbl; + + interface IInitializeWithStream + { + CONST_VTBL struct IInitializeWithStreamVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInitializeWithStream_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IInitializeWithStream_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IInitializeWithStream_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IInitializeWithStream_Initialize(This,pstream,grfMode) \ + ( (This)->lpVtbl -> Initialize(This,pstream,grfMode) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IInitializeWithStream_RemoteInitialize_Proxy( + IInitializeWithStream * This, + /* [in] */ __RPC__in_opt IStream *pstream, + /* [in] */ DWORD grfMode); + + +void __RPC_STUB IInitializeWithStream_RemoteInitialize_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IInitializeWithStream_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyStore_INTERFACE_DEFINED__ +#define __IPropertyStore_INTERFACE_DEFINED__ + +/* interface IPropertyStore */ +/* [unique][object][helpstring][uuid] */ + + +EXTERN_C const IID IID_IPropertyStore; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99") + IPropertyStore : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ __RPC__out DWORD *cProps) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAt( + /* [in] */ DWORD iProp, + /* [out] */ __RPC__out PROPERTYKEY *pkey) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetValue( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PROPVARIANT *pv) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetValue( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar) = 0; + + virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyStoreVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyStore * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyStore * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyStore * This); + + HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPropertyStore * This, + /* [out] */ __RPC__out DWORD *cProps); + + HRESULT ( STDMETHODCALLTYPE *GetAt )( + IPropertyStore * This, + /* [in] */ DWORD iProp, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *GetValue )( + IPropertyStore * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PROPVARIANT *pv); + + HRESULT ( STDMETHODCALLTYPE *SetValue )( + IPropertyStore * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + HRESULT ( STDMETHODCALLTYPE *Commit )( + IPropertyStore * This); + + END_INTERFACE + } IPropertyStoreVtbl; + + interface IPropertyStore + { + CONST_VTBL struct IPropertyStoreVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyStore_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyStore_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyStore_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyStore_GetCount(This,cProps) \ + ( (This)->lpVtbl -> GetCount(This,cProps) ) + +#define IPropertyStore_GetAt(This,iProp,pkey) \ + ( (This)->lpVtbl -> GetAt(This,iProp,pkey) ) + +#define IPropertyStore_GetValue(This,key,pv) \ + ( (This)->lpVtbl -> GetValue(This,key,pv) ) + +#define IPropertyStore_SetValue(This,key,propvar) \ + ( (This)->lpVtbl -> SetValue(This,key,propvar) ) + +#define IPropertyStore_Commit(This) \ + ( (This)->lpVtbl -> Commit(This) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyStore_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0003 */ +/* [local] */ + +typedef /* [unique] */ __RPC_unique_pointer IPropertyStore *LPPROPERTYSTORE; + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0003_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0003_v0_0_s_ifspec; + +#ifndef __INamedPropertyStore_INTERFACE_DEFINED__ +#define __INamedPropertyStore_INTERFACE_DEFINED__ + +/* interface INamedPropertyStore */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_INamedPropertyStore; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("71604b0f-97b0-4764-8577-2f13e98a1422") + INamedPropertyStore : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetNamedValue( + /* [string][in] */ __RPC__in LPCWSTR pszName, + /* [out] */ __RPC__out PROPVARIANT *ppropvar) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetNamedValue( + /* [string][in] */ __RPC__in LPCWSTR pszName, + /* [in] */ __RPC__in REFPROPVARIANT propvar) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetNameCount( + /* [out] */ __RPC__out DWORD *pdwCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetNameAt( + /* [in] */ DWORD iProp, + /* [out] */ __RPC__deref_out_opt BSTR *pbstrName) = 0; + + }; + +#else /* C style interface */ + + typedef struct INamedPropertyStoreVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + INamedPropertyStore * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + INamedPropertyStore * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + INamedPropertyStore * This); + + HRESULT ( STDMETHODCALLTYPE *GetNamedValue )( + INamedPropertyStore * This, + /* [string][in] */ __RPC__in LPCWSTR pszName, + /* [out] */ __RPC__out PROPVARIANT *ppropvar); + + HRESULT ( STDMETHODCALLTYPE *SetNamedValue )( + INamedPropertyStore * This, + /* [string][in] */ __RPC__in LPCWSTR pszName, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + HRESULT ( STDMETHODCALLTYPE *GetNameCount )( + INamedPropertyStore * This, + /* [out] */ __RPC__out DWORD *pdwCount); + + HRESULT ( STDMETHODCALLTYPE *GetNameAt )( + INamedPropertyStore * This, + /* [in] */ DWORD iProp, + /* [out] */ __RPC__deref_out_opt BSTR *pbstrName); + + END_INTERFACE + } INamedPropertyStoreVtbl; + + interface INamedPropertyStore + { + CONST_VTBL struct INamedPropertyStoreVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define INamedPropertyStore_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define INamedPropertyStore_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define INamedPropertyStore_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define INamedPropertyStore_GetNamedValue(This,pszName,ppropvar) \ + ( (This)->lpVtbl -> GetNamedValue(This,pszName,ppropvar) ) + +#define INamedPropertyStore_SetNamedValue(This,pszName,propvar) \ + ( (This)->lpVtbl -> SetNamedValue(This,pszName,propvar) ) + +#define INamedPropertyStore_GetNameCount(This,pdwCount) \ + ( (This)->lpVtbl -> GetNameCount(This,pdwCount) ) + +#define INamedPropertyStore_GetNameAt(This,iProp,pbstrName) \ + ( (This)->lpVtbl -> GetNameAt(This,iProp,pbstrName) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __INamedPropertyStore_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0004 */ +/* [local] */ + +/* [v1_enum] */ +enum tagGETPROPERTYSTOREFLAGS + { GPS_DEFAULT = 0, + GPS_HANDLERPROPERTIESONLY = 0x1, + GPS_READWRITE = 0x2, + GPS_TEMPORARY = 0x4, + GPS_FASTPROPERTIESONLY = 0x8, + GPS_OPENSLOWITEM = 0x10, + GPS_DELAYCREATION = 0x20, + GPS_BESTEFFORT = 0x40, + GPS_MASK_VALID = 0x7f + } ; +typedef int GETPROPERTYSTOREFLAGS; + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0004_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0004_v0_0_s_ifspec; + +#ifndef __IObjectWithPropertyKey_INTERFACE_DEFINED__ +#define __IObjectWithPropertyKey_INTERFACE_DEFINED__ + +/* interface IObjectWithPropertyKey */ +/* [uuid][object] */ + + +EXTERN_C const IID IID_IObjectWithPropertyKey; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("fc0ca0a7-c316-4fd2-9031-3e628e6d4f23") + IObjectWithPropertyKey : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SetPropertyKey( + /* [in] */ __RPC__in REFPROPERTYKEY key) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyKey( + /* [out] */ __RPC__out PROPERTYKEY *pkey) = 0; + + }; + +#else /* C style interface */ + + typedef struct IObjectWithPropertyKeyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IObjectWithPropertyKey * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IObjectWithPropertyKey * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IObjectWithPropertyKey * This); + + HRESULT ( STDMETHODCALLTYPE *SetPropertyKey )( + IObjectWithPropertyKey * This, + /* [in] */ __RPC__in REFPROPERTYKEY key); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyKey )( + IObjectWithPropertyKey * This, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + END_INTERFACE + } IObjectWithPropertyKeyVtbl; + + interface IObjectWithPropertyKey + { + CONST_VTBL struct IObjectWithPropertyKeyVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IObjectWithPropertyKey_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IObjectWithPropertyKey_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IObjectWithPropertyKey_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IObjectWithPropertyKey_SetPropertyKey(This,key) \ + ( (This)->lpVtbl -> SetPropertyKey(This,key) ) + +#define IObjectWithPropertyKey_GetPropertyKey(This,pkey) \ + ( (This)->lpVtbl -> GetPropertyKey(This,pkey) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IObjectWithPropertyKey_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0005 */ +/* [local] */ + +typedef /* [v1_enum] */ +enum tagPKA_FLAGS + { PKA_SET = 0, + PKA_APPEND = ( PKA_SET + 1 ) , + PKA_DELETE = ( PKA_APPEND + 1 ) + } PKA_FLAGS; + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0005_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0005_v0_0_s_ifspec; + +#ifndef __IPropertyChange_INTERFACE_DEFINED__ +#define __IPropertyChange_INTERFACE_DEFINED__ + +/* interface IPropertyChange */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyChange; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("f917bc8a-1bba-4478-a245-1bde03eb9431") + IPropertyChange : public IObjectWithPropertyKey + { + public: + virtual HRESULT STDMETHODCALLTYPE ApplyToPropVariant( + /* [in] */ __RPC__in REFPROPVARIANT propvarIn, + /* [out] */ __RPC__out PROPVARIANT *ppropvarOut) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyChangeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyChange * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyChange * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyChange * This); + + HRESULT ( STDMETHODCALLTYPE *SetPropertyKey )( + IPropertyChange * This, + /* [in] */ __RPC__in REFPROPERTYKEY key); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyKey )( + IPropertyChange * This, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *ApplyToPropVariant )( + IPropertyChange * This, + /* [in] */ __RPC__in REFPROPVARIANT propvarIn, + /* [out] */ __RPC__out PROPVARIANT *ppropvarOut); + + END_INTERFACE + } IPropertyChangeVtbl; + + interface IPropertyChange + { + CONST_VTBL struct IPropertyChangeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyChange_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyChange_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyChange_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyChange_SetPropertyKey(This,key) \ + ( (This)->lpVtbl -> SetPropertyKey(This,key) ) + +#define IPropertyChange_GetPropertyKey(This,pkey) \ + ( (This)->lpVtbl -> GetPropertyKey(This,pkey) ) + + +#define IPropertyChange_ApplyToPropVariant(This,propvarIn,ppropvarOut) \ + ( (This)->lpVtbl -> ApplyToPropVariant(This,propvarIn,ppropvarOut) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyChange_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyChangeArray_INTERFACE_DEFINED__ +#define __IPropertyChangeArray_INTERFACE_DEFINED__ + +/* interface IPropertyChangeArray */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyChangeArray; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("380f5cad-1b5e-42f2-805d-637fd392d31e") + IPropertyChangeArray : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ __RPC__out UINT *pcOperations) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAt( + /* [in] */ UINT iIndex, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE InsertAt( + /* [in] */ UINT iIndex, + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange) = 0; + + virtual HRESULT STDMETHODCALLTYPE Append( + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange) = 0; + + virtual HRESULT STDMETHODCALLTYPE AppendOrReplace( + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange) = 0; + + virtual HRESULT STDMETHODCALLTYPE RemoveAt( + /* [in] */ UINT iIndex) = 0; + + virtual HRESULT STDMETHODCALLTYPE IsKeyInArray( + /* [in] */ __RPC__in REFPROPERTYKEY key) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyChangeArrayVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyChangeArray * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyChangeArray * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyChangeArray * This); + + HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPropertyChangeArray * This, + /* [out] */ __RPC__out UINT *pcOperations); + + HRESULT ( STDMETHODCALLTYPE *GetAt )( + IPropertyChangeArray * This, + /* [in] */ UINT iIndex, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *InsertAt )( + IPropertyChangeArray * This, + /* [in] */ UINT iIndex, + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange); + + HRESULT ( STDMETHODCALLTYPE *Append )( + IPropertyChangeArray * This, + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange); + + HRESULT ( STDMETHODCALLTYPE *AppendOrReplace )( + IPropertyChangeArray * This, + /* [in] */ __RPC__in_opt IPropertyChange *ppropChange); + + HRESULT ( STDMETHODCALLTYPE *RemoveAt )( + IPropertyChangeArray * This, + /* [in] */ UINT iIndex); + + HRESULT ( STDMETHODCALLTYPE *IsKeyInArray )( + IPropertyChangeArray * This, + /* [in] */ __RPC__in REFPROPERTYKEY key); + + END_INTERFACE + } IPropertyChangeArrayVtbl; + + interface IPropertyChangeArray + { + CONST_VTBL struct IPropertyChangeArrayVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyChangeArray_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyChangeArray_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyChangeArray_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyChangeArray_GetCount(This,pcOperations) \ + ( (This)->lpVtbl -> GetCount(This,pcOperations) ) + +#define IPropertyChangeArray_GetAt(This,iIndex,riid,ppv) \ + ( (This)->lpVtbl -> GetAt(This,iIndex,riid,ppv) ) + +#define IPropertyChangeArray_InsertAt(This,iIndex,ppropChange) \ + ( (This)->lpVtbl -> InsertAt(This,iIndex,ppropChange) ) + +#define IPropertyChangeArray_Append(This,ppropChange) \ + ( (This)->lpVtbl -> Append(This,ppropChange) ) + +#define IPropertyChangeArray_AppendOrReplace(This,ppropChange) \ + ( (This)->lpVtbl -> AppendOrReplace(This,ppropChange) ) + +#define IPropertyChangeArray_RemoveAt(This,iIndex) \ + ( (This)->lpVtbl -> RemoveAt(This,iIndex) ) + +#define IPropertyChangeArray_IsKeyInArray(This,key) \ + ( (This)->lpVtbl -> IsKeyInArray(This,key) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyChangeArray_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyStoreCapabilities_INTERFACE_DEFINED__ +#define __IPropertyStoreCapabilities_INTERFACE_DEFINED__ + +/* interface IPropertyStoreCapabilities */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyStoreCapabilities; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("c8e2d566-186e-4d49-bf41-6909ead56acc") + IPropertyStoreCapabilities : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE IsPropertyWritable( + /* [in] */ __RPC__in REFPROPERTYKEY key) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyStoreCapabilitiesVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyStoreCapabilities * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyStoreCapabilities * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyStoreCapabilities * This); + + HRESULT ( STDMETHODCALLTYPE *IsPropertyWritable )( + IPropertyStoreCapabilities * This, + /* [in] */ __RPC__in REFPROPERTYKEY key); + + END_INTERFACE + } IPropertyStoreCapabilitiesVtbl; + + interface IPropertyStoreCapabilities + { + CONST_VTBL struct IPropertyStoreCapabilitiesVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyStoreCapabilities_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyStoreCapabilities_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyStoreCapabilities_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyStoreCapabilities_IsPropertyWritable(This,key) \ + ( (This)->lpVtbl -> IsPropertyWritable(This,key) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyStoreCapabilities_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyStoreCache_INTERFACE_DEFINED__ +#define __IPropertyStoreCache_INTERFACE_DEFINED__ + +/* interface IPropertyStoreCache */ +/* [unique][object][uuid] */ + +typedef /* [v1_enum] */ +enum _PSC_STATE + { PSC_NORMAL = 0, + PSC_NOTINSOURCE = 1, + PSC_DIRTY = 2, + PSC_READONLY = 3 + } PSC_STATE; + + +EXTERN_C const IID IID_IPropertyStoreCache; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3017056d-9a91-4e90-937d-746c72abbf4f") + IPropertyStoreCache : public IPropertyStore + { + public: + virtual HRESULT STDMETHODCALLTYPE GetState( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PSC_STATE *pstate) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetValueAndState( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PROPVARIANT *ppropvar, + /* [out] */ __RPC__out PSC_STATE *pstate) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetState( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ PSC_STATE state) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetValueAndState( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [unique][in] */ __RPC__in_opt const PROPVARIANT *ppropvar, + /* [in] */ PSC_STATE state) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyStoreCacheVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyStoreCache * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyStoreCache * This); + + HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPropertyStoreCache * This, + /* [out] */ __RPC__out DWORD *cProps); + + HRESULT ( STDMETHODCALLTYPE *GetAt )( + IPropertyStoreCache * This, + /* [in] */ DWORD iProp, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *GetValue )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PROPVARIANT *pv); + + HRESULT ( STDMETHODCALLTYPE *SetValue )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + HRESULT ( STDMETHODCALLTYPE *Commit )( + IPropertyStoreCache * This); + + HRESULT ( STDMETHODCALLTYPE *GetState )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PSC_STATE *pstate); + + HRESULT ( STDMETHODCALLTYPE *GetValueAndState )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [out] */ __RPC__out PROPVARIANT *ppropvar, + /* [out] */ __RPC__out PSC_STATE *pstate); + + HRESULT ( STDMETHODCALLTYPE *SetState )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ PSC_STATE state); + + HRESULT ( STDMETHODCALLTYPE *SetValueAndState )( + IPropertyStoreCache * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [unique][in] */ __RPC__in_opt const PROPVARIANT *ppropvar, + /* [in] */ PSC_STATE state); + + END_INTERFACE + } IPropertyStoreCacheVtbl; + + interface IPropertyStoreCache + { + CONST_VTBL struct IPropertyStoreCacheVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyStoreCache_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyStoreCache_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyStoreCache_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyStoreCache_GetCount(This,cProps) \ + ( (This)->lpVtbl -> GetCount(This,cProps) ) + +#define IPropertyStoreCache_GetAt(This,iProp,pkey) \ + ( (This)->lpVtbl -> GetAt(This,iProp,pkey) ) + +#define IPropertyStoreCache_GetValue(This,key,pv) \ + ( (This)->lpVtbl -> GetValue(This,key,pv) ) + +#define IPropertyStoreCache_SetValue(This,key,propvar) \ + ( (This)->lpVtbl -> SetValue(This,key,propvar) ) + +#define IPropertyStoreCache_Commit(This) \ + ( (This)->lpVtbl -> Commit(This) ) + + +#define IPropertyStoreCache_GetState(This,key,pstate) \ + ( (This)->lpVtbl -> GetState(This,key,pstate) ) + +#define IPropertyStoreCache_GetValueAndState(This,key,ppropvar,pstate) \ + ( (This)->lpVtbl -> GetValueAndState(This,key,ppropvar,pstate) ) + +#define IPropertyStoreCache_SetState(This,key,state) \ + ( (This)->lpVtbl -> SetState(This,key,state) ) + +#define IPropertyStoreCache_SetValueAndState(This,key,ppropvar,state) \ + ( (This)->lpVtbl -> SetValueAndState(This,key,ppropvar,state) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyStoreCache_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyEnumType_INTERFACE_DEFINED__ +#define __IPropertyEnumType_INTERFACE_DEFINED__ + +/* interface IPropertyEnumType */ +/* [unique][object][uuid] */ + +/* [v1_enum] */ +enum tagPROPENUMTYPE + { PET_DISCRETEVALUE = 0, + PET_RANGEDVALUE = 1, + PET_DEFAULTVALUE = 2, + PET_ENDRANGE = 3 + } ; +typedef enum tagPROPENUMTYPE PROPENUMTYPE; + + +EXTERN_C const IID IID_IPropertyEnumType; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("11e1fbf9-2d56-4a6b-8db3-7cd193a471f2") + IPropertyEnumType : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetEnumType( + /* [out] */ __RPC__out PROPENUMTYPE *penumtype) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetValue( + /* [out] */ __RPC__out PROPVARIANT *ppropvar) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetRangeMinValue( + /* [out] */ __RPC__out PROPVARIANT *ppropvarMin) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetRangeSetValue( + /* [out] */ __RPC__out PROPVARIANT *ppropvarSet) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayText( + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszDisplay) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyEnumTypeVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyEnumType * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyEnumType * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyEnumType * This); + + HRESULT ( STDMETHODCALLTYPE *GetEnumType )( + IPropertyEnumType * This, + /* [out] */ __RPC__out PROPENUMTYPE *penumtype); + + HRESULT ( STDMETHODCALLTYPE *GetValue )( + IPropertyEnumType * This, + /* [out] */ __RPC__out PROPVARIANT *ppropvar); + + HRESULT ( STDMETHODCALLTYPE *GetRangeMinValue )( + IPropertyEnumType * This, + /* [out] */ __RPC__out PROPVARIANT *ppropvarMin); + + HRESULT ( STDMETHODCALLTYPE *GetRangeSetValue )( + IPropertyEnumType * This, + /* [out] */ __RPC__out PROPVARIANT *ppropvarSet); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayText )( + IPropertyEnumType * This, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszDisplay); + + END_INTERFACE + } IPropertyEnumTypeVtbl; + + interface IPropertyEnumType + { + CONST_VTBL struct IPropertyEnumTypeVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyEnumType_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyEnumType_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyEnumType_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyEnumType_GetEnumType(This,penumtype) \ + ( (This)->lpVtbl -> GetEnumType(This,penumtype) ) + +#define IPropertyEnumType_GetValue(This,ppropvar) \ + ( (This)->lpVtbl -> GetValue(This,ppropvar) ) + +#define IPropertyEnumType_GetRangeMinValue(This,ppropvarMin) \ + ( (This)->lpVtbl -> GetRangeMinValue(This,ppropvarMin) ) + +#define IPropertyEnumType_GetRangeSetValue(This,ppropvarSet) \ + ( (This)->lpVtbl -> GetRangeSetValue(This,ppropvarSet) ) + +#define IPropertyEnumType_GetDisplayText(This,ppszDisplay) \ + ( (This)->lpVtbl -> GetDisplayText(This,ppszDisplay) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyEnumType_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyEnumTypeList_INTERFACE_DEFINED__ +#define __IPropertyEnumTypeList_INTERFACE_DEFINED__ + +/* interface IPropertyEnumTypeList */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyEnumTypeList; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("a99400f4-3d84-4557-94ba-1242fb2cc9a6") + IPropertyEnumTypeList : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ __RPC__out UINT *pctypes) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAt( + /* [in] */ UINT itype, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetConditionAt( + /* [in] */ UINT nIndex, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE FindMatchingIndex( + /* [in] */ __RPC__in REFPROPVARIANT propvarCmp, + /* [out] */ __RPC__out UINT *pnIndex) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyEnumTypeListVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyEnumTypeList * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyEnumTypeList * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyEnumTypeList * This); + + HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPropertyEnumTypeList * This, + /* [out] */ __RPC__out UINT *pctypes); + + HRESULT ( STDMETHODCALLTYPE *GetAt )( + IPropertyEnumTypeList * This, + /* [in] */ UINT itype, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetConditionAt )( + IPropertyEnumTypeList * This, + /* [in] */ UINT nIndex, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *FindMatchingIndex )( + IPropertyEnumTypeList * This, + /* [in] */ __RPC__in REFPROPVARIANT propvarCmp, + /* [out] */ __RPC__out UINT *pnIndex); + + END_INTERFACE + } IPropertyEnumTypeListVtbl; + + interface IPropertyEnumTypeList + { + CONST_VTBL struct IPropertyEnumTypeListVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyEnumTypeList_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyEnumTypeList_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyEnumTypeList_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyEnumTypeList_GetCount(This,pctypes) \ + ( (This)->lpVtbl -> GetCount(This,pctypes) ) + +#define IPropertyEnumTypeList_GetAt(This,itype,riid,ppv) \ + ( (This)->lpVtbl -> GetAt(This,itype,riid,ppv) ) + +#define IPropertyEnumTypeList_GetConditionAt(This,nIndex,riid,ppv) \ + ( (This)->lpVtbl -> GetConditionAt(This,nIndex,riid,ppv) ) + +#define IPropertyEnumTypeList_FindMatchingIndex(This,propvarCmp,pnIndex) \ + ( (This)->lpVtbl -> FindMatchingIndex(This,propvarCmp,pnIndex) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyEnumTypeList_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyDescription_INTERFACE_DEFINED__ +#define __IPropertyDescription_INTERFACE_DEFINED__ + +/* interface IPropertyDescription */ +/* [unique][object][uuid] */ + +/* [v1_enum] */ +enum tagPROPDESC_TYPE_FLAGS + { PDTF_DEFAULT = 0, + PDTF_MULTIPLEVALUES = 0x1, + PDTF_ISINNATE = 0x2, + PDTF_ISGROUP = 0x4, + PDTF_CANGROUPBY = 0x8, + PDTF_CANSTACKBY = 0x10, + PDTF_ISTREEPROPERTY = 0x20, + PDTF_INCLUDEINFULLTEXTQUERY = 0x40, + PDTF_ISVIEWABLE = 0x80, + PDTF_ISQUERYABLE = 0x100, + PDTF_ISSYSTEMPROPERTY = 0x80000000, + PDTF_MASK_ALL = 0x800001ff + } ; +typedef int PROPDESC_TYPE_FLAGS; + +/* [v1_enum] */ +enum tagPROPDESC_VIEW_FLAGS + { PDVF_DEFAULT = 0, + PDVF_CENTERALIGN = 0x1, + PDVF_RIGHTALIGN = 0x2, + PDVF_BEGINNEWGROUP = 0x4, + PDVF_FILLAREA = 0x8, + PDVF_SORTDESCENDING = 0x10, + PDVF_SHOWONLYIFPRESENT = 0x20, + PDVF_SHOWBYDEFAULT = 0x40, + PDVF_SHOWINPRIMARYLIST = 0x80, + PDVF_SHOWINSECONDARYLIST = 0x100, + PDVF_HIDELABEL = 0x200, + PDVF_HIDDEN = 0x800, + PDVF_CANWRAP = 0x1000, + PDVF_MASK_ALL = 0x1bff + } ; +typedef int PROPDESC_VIEW_FLAGS; + +/* [v1_enum] */ +enum tagPROPDESC_DISPLAYTYPE + { PDDT_STRING = 0, + PDDT_NUMBER = 1, + PDDT_BOOLEAN = 2, + PDDT_DATETIME = 3, + PDDT_ENUMERATED = 4 + } ; +typedef enum tagPROPDESC_DISPLAYTYPE PROPDESC_DISPLAYTYPE; + +/* [v1_enum] */ +enum tagPROPDESC_GROUPING_RANGE + { PDGR_DISCRETE = 0, + PDGR_ALPHANUMERIC = 1, + PDGR_SIZE = 2, + PDGR_DYNAMIC = 3, + PDGR_DATE = 4, + PDGR_PERCENT = 5, + PDGR_ENUMERATED = 6 + } ; +typedef enum tagPROPDESC_GROUPING_RANGE PROPDESC_GROUPING_RANGE; + +/* [v1_enum] */ +enum tagPROPDESC_FORMAT_FLAGS + { PDFF_DEFAULT = 0, + PDFF_PREFIXNAME = 0x1, + PDFF_FILENAME = 0x2, + PDFF_ALWAYSKB = 0x4, + PDFF_RESERVED_RIGHTTOLEFT = 0x8, + PDFF_SHORTTIME = 0x10, + PDFF_LONGTIME = 0x20, + PDFF_HIDETIME = 0x40, + PDFF_SHORTDATE = 0x80, + PDFF_LONGDATE = 0x100, + PDFF_HIDEDATE = 0x200, + PDFF_RELATIVEDATE = 0x400, + PDFF_USEEDITINVITATION = 0x800, + PDFF_READONLY = 0x1000, + PDFF_NOAUTOREADINGORDER = 0x2000 + } ; +typedef int PROPDESC_FORMAT_FLAGS; + +/* [v1_enum] */ +enum tagPROPDESC_SORTDESCRIPTION + { PDSD_GENERAL = 0, + PDSD_A_Z = 1, + PDSD_LOWEST_HIGHEST = 2, + PDSD_SMALLEST_BIGGEST = 3, + PDSD_OLDEST_NEWEST = 4 + } ; +typedef enum tagPROPDESC_SORTDESCRIPTION PROPDESC_SORTDESCRIPTION; + +/* [v1_enum] */ +enum tagPROPDESC_RELATIVEDESCRIPTION_TYPE + { PDRDT_GENERAL = 0, + PDRDT_DATE = 1, + PDRDT_SIZE = 2, + PDRDT_COUNT = 3, + PDRDT_REVISION = 4, + PDRDT_LENGTH = 5, + PDRDT_DURATION = 6, + PDRDT_SPEED = 7, + PDRDT_RATE = 8, + PDRDT_RATING = 9, + PDRDT_PRIORITY = 10 + } ; +typedef enum tagPROPDESC_RELATIVEDESCRIPTION_TYPE PROPDESC_RELATIVEDESCRIPTION_TYPE; + +/* [v1_enum] */ +enum tagPROPDESC_AGGREGATION_TYPE + { PDAT_DEFAULT = 0, + PDAT_FIRST = 1, + PDAT_SUM = 2, + PDAT_AVERAGE = 3, + PDAT_DATERANGE = 4, + PDAT_UNION = 5, + PDAT_MAX = 6, + PDAT_MIN = 7 + } ; +typedef enum tagPROPDESC_AGGREGATION_TYPE PROPDESC_AGGREGATION_TYPE; + +/* [v1_enum] */ +enum tagPROPDESC_CONDITION_TYPE + { PDCOT_NONE = 0, + PDCOT_STRING = 1, + PDCOT_SIZE = 2, + PDCOT_DATETIME = 3, + PDCOT_BOOLEAN = 4, + PDCOT_NUMBER = 5 + } ; +typedef enum tagPROPDESC_CONDITION_TYPE PROPDESC_CONDITION_TYPE; + + +EXTERN_C const IID IID_IPropertyDescription; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("6f79d558-3e96-4549-a1d1-7d75d2288814") + IPropertyDescription : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetPropertyKey( + /* [out] */ __RPC__out PROPERTYKEY *pkey) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCanonicalName( + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyType( + /* [out] */ __RPC__out VARTYPE *pvartype) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayName( + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetEditInvitation( + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszInvite) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetTypeFlags( + /* [in] */ PROPDESC_TYPE_FLAGS mask, + /* [out] */ __RPC__out PROPDESC_TYPE_FLAGS *ppdtFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetViewFlags( + /* [out] */ __RPC__out PROPDESC_VIEW_FLAGS *ppdvFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDefaultColumnWidth( + /* [out] */ __RPC__out UINT *pcxChars) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayType( + /* [out] */ __RPC__out PROPDESC_DISPLAYTYPE *pdisplaytype) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetColumnState( + /* [out] */ __RPC__out SHCOLSTATEF *pcsFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetGroupingRange( + /* [out] */ __RPC__out PROPDESC_GROUPING_RANGE *pgr) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetRelativeDescriptionType( + /* [out] */ __RPC__out PROPDESC_RELATIVEDESCRIPTION_TYPE *prdt) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetRelativeDescription( + /* [in] */ __RPC__in REFPROPVARIANT propvar1, + /* [in] */ __RPC__in REFPROPVARIANT propvar2, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc1, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc2) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSortDescription( + /* [out] */ __RPC__out PROPDESC_SORTDESCRIPTION *psd) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSortDescriptionLabel( + /* [in] */ BOOL fDescending, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDescription) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAggregationType( + /* [out] */ __RPC__out PROPDESC_AGGREGATION_TYPE *paggtype) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetConditionType( + /* [out] */ __RPC__out PROPDESC_CONDITION_TYPE *pcontype, + /* [out] */ __RPC__out CONDITION_OPERATION *popDefault) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetEnumTypeList( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE CoerceToCanonicalValue( + /* [out][in] */ PROPVARIANT *ppropvar) = 0; + + virtual HRESULT STDMETHODCALLTYPE FormatForDisplay( + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdfFlags, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay) = 0; + + virtual HRESULT STDMETHODCALLTYPE IsValueCanonical( + /* [in] */ __RPC__in REFPROPVARIANT propvar) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyDescriptionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyDescription * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyDescription * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyDescription * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyKey )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *GetCanonicalName )( + IPropertyDescription * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyType )( + IPropertyDescription * This, + /* [out] */ __RPC__out VARTYPE *pvartype); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayName )( + IPropertyDescription * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetEditInvitation )( + IPropertyDescription * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszInvite); + + HRESULT ( STDMETHODCALLTYPE *GetTypeFlags )( + IPropertyDescription * This, + /* [in] */ PROPDESC_TYPE_FLAGS mask, + /* [out] */ __RPC__out PROPDESC_TYPE_FLAGS *ppdtFlags); + + HRESULT ( STDMETHODCALLTYPE *GetViewFlags )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_VIEW_FLAGS *ppdvFlags); + + HRESULT ( STDMETHODCALLTYPE *GetDefaultColumnWidth )( + IPropertyDescription * This, + /* [out] */ __RPC__out UINT *pcxChars); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayType )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_DISPLAYTYPE *pdisplaytype); + + HRESULT ( STDMETHODCALLTYPE *GetColumnState )( + IPropertyDescription * This, + /* [out] */ __RPC__out SHCOLSTATEF *pcsFlags); + + HRESULT ( STDMETHODCALLTYPE *GetGroupingRange )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_GROUPING_RANGE *pgr); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescriptionType )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_RELATIVEDESCRIPTION_TYPE *prdt); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescription )( + IPropertyDescription * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar1, + /* [in] */ __RPC__in REFPROPVARIANT propvar2, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc1, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc2); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescription )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_SORTDESCRIPTION *psd); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescriptionLabel )( + IPropertyDescription * This, + /* [in] */ BOOL fDescending, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDescription); + + HRESULT ( STDMETHODCALLTYPE *GetAggregationType )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_AGGREGATION_TYPE *paggtype); + + HRESULT ( STDMETHODCALLTYPE *GetConditionType )( + IPropertyDescription * This, + /* [out] */ __RPC__out PROPDESC_CONDITION_TYPE *pcontype, + /* [out] */ __RPC__out CONDITION_OPERATION *popDefault); + + HRESULT ( STDMETHODCALLTYPE *GetEnumTypeList )( + IPropertyDescription * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *CoerceToCanonicalValue )( + IPropertyDescription * This, + /* [out][in] */ PROPVARIANT *ppropvar); + + HRESULT ( STDMETHODCALLTYPE *FormatForDisplay )( + IPropertyDescription * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdfFlags, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay); + + HRESULT ( STDMETHODCALLTYPE *IsValueCanonical )( + IPropertyDescription * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + END_INTERFACE + } IPropertyDescriptionVtbl; + + interface IPropertyDescription + { + CONST_VTBL struct IPropertyDescriptionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyDescription_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyDescription_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyDescription_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyDescription_GetPropertyKey(This,pkey) \ + ( (This)->lpVtbl -> GetPropertyKey(This,pkey) ) + +#define IPropertyDescription_GetCanonicalName(This,ppszName) \ + ( (This)->lpVtbl -> GetCanonicalName(This,ppszName) ) + +#define IPropertyDescription_GetPropertyType(This,pvartype) \ + ( (This)->lpVtbl -> GetPropertyType(This,pvartype) ) + +#define IPropertyDescription_GetDisplayName(This,ppszName) \ + ( (This)->lpVtbl -> GetDisplayName(This,ppszName) ) + +#define IPropertyDescription_GetEditInvitation(This,ppszInvite) \ + ( (This)->lpVtbl -> GetEditInvitation(This,ppszInvite) ) + +#define IPropertyDescription_GetTypeFlags(This,mask,ppdtFlags) \ + ( (This)->lpVtbl -> GetTypeFlags(This,mask,ppdtFlags) ) + +#define IPropertyDescription_GetViewFlags(This,ppdvFlags) \ + ( (This)->lpVtbl -> GetViewFlags(This,ppdvFlags) ) + +#define IPropertyDescription_GetDefaultColumnWidth(This,pcxChars) \ + ( (This)->lpVtbl -> GetDefaultColumnWidth(This,pcxChars) ) + +#define IPropertyDescription_GetDisplayType(This,pdisplaytype) \ + ( (This)->lpVtbl -> GetDisplayType(This,pdisplaytype) ) + +#define IPropertyDescription_GetColumnState(This,pcsFlags) \ + ( (This)->lpVtbl -> GetColumnState(This,pcsFlags) ) + +#define IPropertyDescription_GetGroupingRange(This,pgr) \ + ( (This)->lpVtbl -> GetGroupingRange(This,pgr) ) + +#define IPropertyDescription_GetRelativeDescriptionType(This,prdt) \ + ( (This)->lpVtbl -> GetRelativeDescriptionType(This,prdt) ) + +#define IPropertyDescription_GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) \ + ( (This)->lpVtbl -> GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) ) + +#define IPropertyDescription_GetSortDescription(This,psd) \ + ( (This)->lpVtbl -> GetSortDescription(This,psd) ) + +#define IPropertyDescription_GetSortDescriptionLabel(This,fDescending,ppszDescription) \ + ( (This)->lpVtbl -> GetSortDescriptionLabel(This,fDescending,ppszDescription) ) + +#define IPropertyDescription_GetAggregationType(This,paggtype) \ + ( (This)->lpVtbl -> GetAggregationType(This,paggtype) ) + +#define IPropertyDescription_GetConditionType(This,pcontype,popDefault) \ + ( (This)->lpVtbl -> GetConditionType(This,pcontype,popDefault) ) + +#define IPropertyDescription_GetEnumTypeList(This,riid,ppv) \ + ( (This)->lpVtbl -> GetEnumTypeList(This,riid,ppv) ) + +#define IPropertyDescription_CoerceToCanonicalValue(This,ppropvar) \ + ( (This)->lpVtbl -> CoerceToCanonicalValue(This,ppropvar) ) + +#define IPropertyDescription_FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) \ + ( (This)->lpVtbl -> FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) ) + +#define IPropertyDescription_IsValueCanonical(This,propvar) \ + ( (This)->lpVtbl -> IsValueCanonical(This,propvar) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IPropertyDescription_RemoteCoerceToCanonicalValue_Proxy( + IPropertyDescription * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [out] */ __RPC__out PROPVARIANT *ppropvar); + + +void __RPC_STUB IPropertyDescription_RemoteCoerceToCanonicalValue_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPropertyDescription_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyDescriptionAliasInfo_INTERFACE_DEFINED__ +#define __IPropertyDescriptionAliasInfo_INTERFACE_DEFINED__ + +/* interface IPropertyDescriptionAliasInfo */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyDescriptionAliasInfo; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("f67104fc-2af9-46fd-b32d-243c1404f3d1") + IPropertyDescriptionAliasInfo : public IPropertyDescription + { + public: + virtual HRESULT STDMETHODCALLTYPE GetSortByAlias( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAdditionalSortByAliases( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyDescriptionAliasInfoVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyDescriptionAliasInfo * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyDescriptionAliasInfo * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyKey )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *GetCanonicalName )( + IPropertyDescriptionAliasInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyType )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out VARTYPE *pvartype); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayName )( + IPropertyDescriptionAliasInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetEditInvitation )( + IPropertyDescriptionAliasInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszInvite); + + HRESULT ( STDMETHODCALLTYPE *GetTypeFlags )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ PROPDESC_TYPE_FLAGS mask, + /* [out] */ __RPC__out PROPDESC_TYPE_FLAGS *ppdtFlags); + + HRESULT ( STDMETHODCALLTYPE *GetViewFlags )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_VIEW_FLAGS *ppdvFlags); + + HRESULT ( STDMETHODCALLTYPE *GetDefaultColumnWidth )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out UINT *pcxChars); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayType )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_DISPLAYTYPE *pdisplaytype); + + HRESULT ( STDMETHODCALLTYPE *GetColumnState )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out SHCOLSTATEF *pcsFlags); + + HRESULT ( STDMETHODCALLTYPE *GetGroupingRange )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_GROUPING_RANGE *pgr); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescriptionType )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_RELATIVEDESCRIPTION_TYPE *prdt); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescription )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar1, + /* [in] */ __RPC__in REFPROPVARIANT propvar2, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc1, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc2); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescription )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_SORTDESCRIPTION *psd); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescriptionLabel )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ BOOL fDescending, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDescription); + + HRESULT ( STDMETHODCALLTYPE *GetAggregationType )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_AGGREGATION_TYPE *paggtype); + + HRESULT ( STDMETHODCALLTYPE *GetConditionType )( + IPropertyDescriptionAliasInfo * This, + /* [out] */ __RPC__out PROPDESC_CONDITION_TYPE *pcontype, + /* [out] */ __RPC__out CONDITION_OPERATION *popDefault); + + HRESULT ( STDMETHODCALLTYPE *GetEnumTypeList )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *CoerceToCanonicalValue )( + IPropertyDescriptionAliasInfo * This, + /* [out][in] */ PROPVARIANT *ppropvar); + + HRESULT ( STDMETHODCALLTYPE *FormatForDisplay )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdfFlags, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay); + + HRESULT ( STDMETHODCALLTYPE *IsValueCanonical )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + HRESULT ( STDMETHODCALLTYPE *GetSortByAlias )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetAdditionalSortByAliases )( + IPropertyDescriptionAliasInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + END_INTERFACE + } IPropertyDescriptionAliasInfoVtbl; + + interface IPropertyDescriptionAliasInfo + { + CONST_VTBL struct IPropertyDescriptionAliasInfoVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyDescriptionAliasInfo_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyDescriptionAliasInfo_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyDescriptionAliasInfo_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyDescriptionAliasInfo_GetPropertyKey(This,pkey) \ + ( (This)->lpVtbl -> GetPropertyKey(This,pkey) ) + +#define IPropertyDescriptionAliasInfo_GetCanonicalName(This,ppszName) \ + ( (This)->lpVtbl -> GetCanonicalName(This,ppszName) ) + +#define IPropertyDescriptionAliasInfo_GetPropertyType(This,pvartype) \ + ( (This)->lpVtbl -> GetPropertyType(This,pvartype) ) + +#define IPropertyDescriptionAliasInfo_GetDisplayName(This,ppszName) \ + ( (This)->lpVtbl -> GetDisplayName(This,ppszName) ) + +#define IPropertyDescriptionAliasInfo_GetEditInvitation(This,ppszInvite) \ + ( (This)->lpVtbl -> GetEditInvitation(This,ppszInvite) ) + +#define IPropertyDescriptionAliasInfo_GetTypeFlags(This,mask,ppdtFlags) \ + ( (This)->lpVtbl -> GetTypeFlags(This,mask,ppdtFlags) ) + +#define IPropertyDescriptionAliasInfo_GetViewFlags(This,ppdvFlags) \ + ( (This)->lpVtbl -> GetViewFlags(This,ppdvFlags) ) + +#define IPropertyDescriptionAliasInfo_GetDefaultColumnWidth(This,pcxChars) \ + ( (This)->lpVtbl -> GetDefaultColumnWidth(This,pcxChars) ) + +#define IPropertyDescriptionAliasInfo_GetDisplayType(This,pdisplaytype) \ + ( (This)->lpVtbl -> GetDisplayType(This,pdisplaytype) ) + +#define IPropertyDescriptionAliasInfo_GetColumnState(This,pcsFlags) \ + ( (This)->lpVtbl -> GetColumnState(This,pcsFlags) ) + +#define IPropertyDescriptionAliasInfo_GetGroupingRange(This,pgr) \ + ( (This)->lpVtbl -> GetGroupingRange(This,pgr) ) + +#define IPropertyDescriptionAliasInfo_GetRelativeDescriptionType(This,prdt) \ + ( (This)->lpVtbl -> GetRelativeDescriptionType(This,prdt) ) + +#define IPropertyDescriptionAliasInfo_GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) \ + ( (This)->lpVtbl -> GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) ) + +#define IPropertyDescriptionAliasInfo_GetSortDescription(This,psd) \ + ( (This)->lpVtbl -> GetSortDescription(This,psd) ) + +#define IPropertyDescriptionAliasInfo_GetSortDescriptionLabel(This,fDescending,ppszDescription) \ + ( (This)->lpVtbl -> GetSortDescriptionLabel(This,fDescending,ppszDescription) ) + +#define IPropertyDescriptionAliasInfo_GetAggregationType(This,paggtype) \ + ( (This)->lpVtbl -> GetAggregationType(This,paggtype) ) + +#define IPropertyDescriptionAliasInfo_GetConditionType(This,pcontype,popDefault) \ + ( (This)->lpVtbl -> GetConditionType(This,pcontype,popDefault) ) + +#define IPropertyDescriptionAliasInfo_GetEnumTypeList(This,riid,ppv) \ + ( (This)->lpVtbl -> GetEnumTypeList(This,riid,ppv) ) + +#define IPropertyDescriptionAliasInfo_CoerceToCanonicalValue(This,ppropvar) \ + ( (This)->lpVtbl -> CoerceToCanonicalValue(This,ppropvar) ) + +#define IPropertyDescriptionAliasInfo_FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) \ + ( (This)->lpVtbl -> FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) ) + +#define IPropertyDescriptionAliasInfo_IsValueCanonical(This,propvar) \ + ( (This)->lpVtbl -> IsValueCanonical(This,propvar) ) + + +#define IPropertyDescriptionAliasInfo_GetSortByAlias(This,riid,ppv) \ + ( (This)->lpVtbl -> GetSortByAlias(This,riid,ppv) ) + +#define IPropertyDescriptionAliasInfo_GetAdditionalSortByAliases(This,riid,ppv) \ + ( (This)->lpVtbl -> GetAdditionalSortByAliases(This,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyDescriptionAliasInfo_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyDescriptionSearchInfo_INTERFACE_DEFINED__ +#define __IPropertyDescriptionSearchInfo_INTERFACE_DEFINED__ + +/* interface IPropertyDescriptionSearchInfo */ +/* [unique][object][uuid] */ + +/* [v1_enum] */ +enum tagPROPDESC_SEARCHINFO_FLAGS + { PDSIF_DEFAULT = 0, + PDSIF_ININVERTEDINDEX = 0x1, + PDSIF_ISCOLUMN = 0x2, + PDSIF_ISCOLUMNSPARSE = 0x4 + } ; +typedef int PROPDESC_SEARCHINFO_FLAGS; + +typedef /* [v1_enum] */ +enum tagPROPDESC_COLUMNINDEX_TYPE + { PDCIT_NONE = 0, + PDCIT_ONDISK = 1, + PDCIT_INMEMORY = 2 + } PROPDESC_COLUMNINDEX_TYPE; + + +EXTERN_C const IID IID_IPropertyDescriptionSearchInfo; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("078f91bd-29a2-440f-924e-46a291524520") + IPropertyDescriptionSearchInfo : public IPropertyDescription + { + public: + virtual HRESULT STDMETHODCALLTYPE GetSearchInfoFlags( + /* [out] */ __RPC__out PROPDESC_SEARCHINFO_FLAGS *ppdsiFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetColumnIndexType( + /* [out] */ __RPC__out PROPDESC_COLUMNINDEX_TYPE *ppdciType) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetProjectionString( + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszProjection) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMaxSize( + /* [out] */ __RPC__out UINT *pcbMaxSize) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyDescriptionSearchInfoVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyDescriptionSearchInfo * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyDescriptionSearchInfo * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyKey )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPERTYKEY *pkey); + + HRESULT ( STDMETHODCALLTYPE *GetCanonicalName )( + IPropertyDescriptionSearchInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out VARTYPE *pvartype); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayName )( + IPropertyDescriptionSearchInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *GetEditInvitation )( + IPropertyDescriptionSearchInfo * This, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszInvite); + + HRESULT ( STDMETHODCALLTYPE *GetTypeFlags )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ PROPDESC_TYPE_FLAGS mask, + /* [out] */ __RPC__out PROPDESC_TYPE_FLAGS *ppdtFlags); + + HRESULT ( STDMETHODCALLTYPE *GetViewFlags )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_VIEW_FLAGS *ppdvFlags); + + HRESULT ( STDMETHODCALLTYPE *GetDefaultColumnWidth )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out UINT *pcxChars); + + HRESULT ( STDMETHODCALLTYPE *GetDisplayType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_DISPLAYTYPE *pdisplaytype); + + HRESULT ( STDMETHODCALLTYPE *GetColumnState )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out SHCOLSTATEF *pcsFlags); + + HRESULT ( STDMETHODCALLTYPE *GetGroupingRange )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_GROUPING_RANGE *pgr); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescriptionType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_RELATIVEDESCRIPTION_TYPE *prdt); + + HRESULT ( STDMETHODCALLTYPE *GetRelativeDescription )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar1, + /* [in] */ __RPC__in REFPROPVARIANT propvar2, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc1, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDesc2); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescription )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_SORTDESCRIPTION *psd); + + HRESULT ( STDMETHODCALLTYPE *GetSortDescriptionLabel )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ BOOL fDescending, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDescription); + + HRESULT ( STDMETHODCALLTYPE *GetAggregationType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_AGGREGATION_TYPE *paggtype); + + HRESULT ( STDMETHODCALLTYPE *GetConditionType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_CONDITION_TYPE *pcontype, + /* [out] */ __RPC__out CONDITION_OPERATION *popDefault); + + HRESULT ( STDMETHODCALLTYPE *GetEnumTypeList )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *CoerceToCanonicalValue )( + IPropertyDescriptionSearchInfo * This, + /* [out][in] */ PROPVARIANT *ppropvar); + + HRESULT ( STDMETHODCALLTYPE *FormatForDisplay )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdfFlags, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay); + + HRESULT ( STDMETHODCALLTYPE *IsValueCanonical )( + IPropertyDescriptionSearchInfo * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar); + + HRESULT ( STDMETHODCALLTYPE *GetSearchInfoFlags )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_SEARCHINFO_FLAGS *ppdsiFlags); + + HRESULT ( STDMETHODCALLTYPE *GetColumnIndexType )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out PROPDESC_COLUMNINDEX_TYPE *ppdciType); + + HRESULT ( STDMETHODCALLTYPE *GetProjectionString )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszProjection); + + HRESULT ( STDMETHODCALLTYPE *GetMaxSize )( + IPropertyDescriptionSearchInfo * This, + /* [out] */ __RPC__out UINT *pcbMaxSize); + + END_INTERFACE + } IPropertyDescriptionSearchInfoVtbl; + + interface IPropertyDescriptionSearchInfo + { + CONST_VTBL struct IPropertyDescriptionSearchInfoVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyDescriptionSearchInfo_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyDescriptionSearchInfo_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyDescriptionSearchInfo_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyDescriptionSearchInfo_GetPropertyKey(This,pkey) \ + ( (This)->lpVtbl -> GetPropertyKey(This,pkey) ) + +#define IPropertyDescriptionSearchInfo_GetCanonicalName(This,ppszName) \ + ( (This)->lpVtbl -> GetCanonicalName(This,ppszName) ) + +#define IPropertyDescriptionSearchInfo_GetPropertyType(This,pvartype) \ + ( (This)->lpVtbl -> GetPropertyType(This,pvartype) ) + +#define IPropertyDescriptionSearchInfo_GetDisplayName(This,ppszName) \ + ( (This)->lpVtbl -> GetDisplayName(This,ppszName) ) + +#define IPropertyDescriptionSearchInfo_GetEditInvitation(This,ppszInvite) \ + ( (This)->lpVtbl -> GetEditInvitation(This,ppszInvite) ) + +#define IPropertyDescriptionSearchInfo_GetTypeFlags(This,mask,ppdtFlags) \ + ( (This)->lpVtbl -> GetTypeFlags(This,mask,ppdtFlags) ) + +#define IPropertyDescriptionSearchInfo_GetViewFlags(This,ppdvFlags) \ + ( (This)->lpVtbl -> GetViewFlags(This,ppdvFlags) ) + +#define IPropertyDescriptionSearchInfo_GetDefaultColumnWidth(This,pcxChars) \ + ( (This)->lpVtbl -> GetDefaultColumnWidth(This,pcxChars) ) + +#define IPropertyDescriptionSearchInfo_GetDisplayType(This,pdisplaytype) \ + ( (This)->lpVtbl -> GetDisplayType(This,pdisplaytype) ) + +#define IPropertyDescriptionSearchInfo_GetColumnState(This,pcsFlags) \ + ( (This)->lpVtbl -> GetColumnState(This,pcsFlags) ) + +#define IPropertyDescriptionSearchInfo_GetGroupingRange(This,pgr) \ + ( (This)->lpVtbl -> GetGroupingRange(This,pgr) ) + +#define IPropertyDescriptionSearchInfo_GetRelativeDescriptionType(This,prdt) \ + ( (This)->lpVtbl -> GetRelativeDescriptionType(This,prdt) ) + +#define IPropertyDescriptionSearchInfo_GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) \ + ( (This)->lpVtbl -> GetRelativeDescription(This,propvar1,propvar2,ppszDesc1,ppszDesc2) ) + +#define IPropertyDescriptionSearchInfo_GetSortDescription(This,psd) \ + ( (This)->lpVtbl -> GetSortDescription(This,psd) ) + +#define IPropertyDescriptionSearchInfo_GetSortDescriptionLabel(This,fDescending,ppszDescription) \ + ( (This)->lpVtbl -> GetSortDescriptionLabel(This,fDescending,ppszDescription) ) + +#define IPropertyDescriptionSearchInfo_GetAggregationType(This,paggtype) \ + ( (This)->lpVtbl -> GetAggregationType(This,paggtype) ) + +#define IPropertyDescriptionSearchInfo_GetConditionType(This,pcontype,popDefault) \ + ( (This)->lpVtbl -> GetConditionType(This,pcontype,popDefault) ) + +#define IPropertyDescriptionSearchInfo_GetEnumTypeList(This,riid,ppv) \ + ( (This)->lpVtbl -> GetEnumTypeList(This,riid,ppv) ) + +#define IPropertyDescriptionSearchInfo_CoerceToCanonicalValue(This,ppropvar) \ + ( (This)->lpVtbl -> CoerceToCanonicalValue(This,ppropvar) ) + +#define IPropertyDescriptionSearchInfo_FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) \ + ( (This)->lpVtbl -> FormatForDisplay(This,propvar,pdfFlags,ppszDisplay) ) + +#define IPropertyDescriptionSearchInfo_IsValueCanonical(This,propvar) \ + ( (This)->lpVtbl -> IsValueCanonical(This,propvar) ) + + +#define IPropertyDescriptionSearchInfo_GetSearchInfoFlags(This,ppdsiFlags) \ + ( (This)->lpVtbl -> GetSearchInfoFlags(This,ppdsiFlags) ) + +#define IPropertyDescriptionSearchInfo_GetColumnIndexType(This,ppdciType) \ + ( (This)->lpVtbl -> GetColumnIndexType(This,ppdciType) ) + +#define IPropertyDescriptionSearchInfo_GetProjectionString(This,ppszProjection) \ + ( (This)->lpVtbl -> GetProjectionString(This,ppszProjection) ) + +#define IPropertyDescriptionSearchInfo_GetMaxSize(This,pcbMaxSize) \ + ( (This)->lpVtbl -> GetMaxSize(This,pcbMaxSize) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyDescriptionSearchInfo_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0014 */ +/* [local] */ + +/* [v1_enum] */ +enum tagPROPDESC_ENUMFILTER + { PDEF_ALL = 0, + PDEF_SYSTEM = 1, + PDEF_NONSYSTEM = 2, + PDEF_VIEWABLE = 3, + PDEF_QUERYABLE = 4, + PDEF_INFULLTEXTQUERY = 5, + PDEF_COLUMN = 6 + } ; +typedef enum tagPROPDESC_ENUMFILTER PROPDESC_ENUMFILTER; + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0014_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0014_v0_0_s_ifspec; + +#ifndef __IPropertySystem_INTERFACE_DEFINED__ +#define __IPropertySystem_INTERFACE_DEFINED__ + +/* interface IPropertySystem */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertySystem; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("ca724e8a-c3e6-442b-88a4-6fb0db8035a3") + IPropertySystem : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetPropertyDescription( + /* [in] */ __RPC__in REFPROPERTYKEY propkey, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyDescriptionByName( + /* [string][in] */ __RPC__in LPCWSTR pszCanonicalName, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyDescriptionListFromString( + /* [string][in] */ __RPC__in LPCWSTR pszPropList, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnumeratePropertyDescriptions( + /* [in] */ PROPDESC_ENUMFILTER filterOn, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE FormatForDisplay( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdff, + /* [size_is][string][out] */ __RPC__out_ecount_full_string(cchText) LPWSTR pszText, + /* [in] */ DWORD cchText) = 0; + + virtual HRESULT STDMETHODCALLTYPE FormatForDisplayAlloc( + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdff, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay) = 0; + + virtual HRESULT STDMETHODCALLTYPE RegisterPropertySchema( + /* [string][in] */ __RPC__in LPCWSTR pszPath) = 0; + + virtual HRESULT STDMETHODCALLTYPE UnregisterPropertySchema( + /* [string][in] */ __RPC__in LPCWSTR pszPath) = 0; + + virtual HRESULT STDMETHODCALLTYPE RefreshPropertySchema( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertySystemVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertySystem * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertySystem * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertySystem * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyDescription )( + IPropertySystem * This, + /* [in] */ __RPC__in REFPROPERTYKEY propkey, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyDescriptionByName )( + IPropertySystem * This, + /* [string][in] */ __RPC__in LPCWSTR pszCanonicalName, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyDescriptionListFromString )( + IPropertySystem * This, + /* [string][in] */ __RPC__in LPCWSTR pszPropList, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *EnumeratePropertyDescriptions )( + IPropertySystem * This, + /* [in] */ PROPDESC_ENUMFILTER filterOn, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *FormatForDisplay )( + IPropertySystem * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdff, + /* [size_is][string][out] */ __RPC__out_ecount_full_string(cchText) LPWSTR pszText, + /* [in] */ DWORD cchText); + + HRESULT ( STDMETHODCALLTYPE *FormatForDisplayAlloc )( + IPropertySystem * This, + /* [in] */ __RPC__in REFPROPERTYKEY key, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [in] */ PROPDESC_FORMAT_FLAGS pdff, + /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszDisplay); + + HRESULT ( STDMETHODCALLTYPE *RegisterPropertySchema )( + IPropertySystem * This, + /* [string][in] */ __RPC__in LPCWSTR pszPath); + + HRESULT ( STDMETHODCALLTYPE *UnregisterPropertySchema )( + IPropertySystem * This, + /* [string][in] */ __RPC__in LPCWSTR pszPath); + + HRESULT ( STDMETHODCALLTYPE *RefreshPropertySchema )( + IPropertySystem * This); + + END_INTERFACE + } IPropertySystemVtbl; + + interface IPropertySystem + { + CONST_VTBL struct IPropertySystemVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertySystem_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertySystem_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertySystem_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertySystem_GetPropertyDescription(This,propkey,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyDescription(This,propkey,riid,ppv) ) + +#define IPropertySystem_GetPropertyDescriptionByName(This,pszCanonicalName,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyDescriptionByName(This,pszCanonicalName,riid,ppv) ) + +#define IPropertySystem_GetPropertyDescriptionListFromString(This,pszPropList,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyDescriptionListFromString(This,pszPropList,riid,ppv) ) + +#define IPropertySystem_EnumeratePropertyDescriptions(This,filterOn,riid,ppv) \ + ( (This)->lpVtbl -> EnumeratePropertyDescriptions(This,filterOn,riid,ppv) ) + +#define IPropertySystem_FormatForDisplay(This,key,propvar,pdff,pszText,cchText) \ + ( (This)->lpVtbl -> FormatForDisplay(This,key,propvar,pdff,pszText,cchText) ) + +#define IPropertySystem_FormatForDisplayAlloc(This,key,propvar,pdff,ppszDisplay) \ + ( (This)->lpVtbl -> FormatForDisplayAlloc(This,key,propvar,pdff,ppszDisplay) ) + +#define IPropertySystem_RegisterPropertySchema(This,pszPath) \ + ( (This)->lpVtbl -> RegisterPropertySchema(This,pszPath) ) + +#define IPropertySystem_UnregisterPropertySchema(This,pszPath) \ + ( (This)->lpVtbl -> UnregisterPropertySchema(This,pszPath) ) + +#define IPropertySystem_RefreshPropertySchema(This) \ + ( (This)->lpVtbl -> RefreshPropertySchema(This) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertySystem_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyDescriptionList_INTERFACE_DEFINED__ +#define __IPropertyDescriptionList_INTERFACE_DEFINED__ + +/* interface IPropertyDescriptionList */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyDescriptionList; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("1f9fc1d0-c39b-4b26-817f-011967d3440e") + IPropertyDescriptionList : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetCount( + /* [out] */ __RPC__out UINT *pcElem) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAt( + /* [in] */ UINT iElem, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyDescriptionListVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyDescriptionList * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyDescriptionList * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyDescriptionList * This); + + HRESULT ( STDMETHODCALLTYPE *GetCount )( + IPropertyDescriptionList * This, + /* [out] */ __RPC__out UINT *pcElem); + + HRESULT ( STDMETHODCALLTYPE *GetAt )( + IPropertyDescriptionList * This, + /* [in] */ UINT iElem, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + END_INTERFACE + } IPropertyDescriptionListVtbl; + + interface IPropertyDescriptionList + { + CONST_VTBL struct IPropertyDescriptionListVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyDescriptionList_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyDescriptionList_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyDescriptionList_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyDescriptionList_GetCount(This,pcElem) \ + ( (This)->lpVtbl -> GetCount(This,pcElem) ) + +#define IPropertyDescriptionList_GetAt(This,iElem,riid,ppv) \ + ( (This)->lpVtbl -> GetAt(This,iElem,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyDescriptionList_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertyStoreFactory_INTERFACE_DEFINED__ +#define __IPropertyStoreFactory_INTERFACE_DEFINED__ + +/* interface IPropertyStoreFactory */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertyStoreFactory; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("bc110b6d-57e8-4148-a9c6-91015ab2f3a5") + IPropertyStoreFactory : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetPropertyStore( + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [unique][in] */ __RPC__in_opt IUnknown *pUnkFactory, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyStoreForKeys( + /* [unique][in] */ __RPC__in_opt const PROPERTYKEY *rgKeys, + /* [in] */ UINT cKeys, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertyStoreFactoryVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertyStoreFactory * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertyStoreFactory * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertyStoreFactory * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyStore )( + IPropertyStoreFactory * This, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [unique][in] */ __RPC__in_opt IUnknown *pUnkFactory, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyStoreForKeys )( + IPropertyStoreFactory * This, + /* [unique][in] */ __RPC__in_opt const PROPERTYKEY *rgKeys, + /* [in] */ UINT cKeys, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + END_INTERFACE + } IPropertyStoreFactoryVtbl; + + interface IPropertyStoreFactory + { + CONST_VTBL struct IPropertyStoreFactoryVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertyStoreFactory_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertyStoreFactory_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertyStoreFactory_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertyStoreFactory_GetPropertyStore(This,flags,pUnkFactory,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyStore(This,flags,pUnkFactory,riid,ppv) ) + +#define IPropertyStoreFactory_GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertyStoreFactory_INTERFACE_DEFINED__ */ + + +#ifndef __IDelayedPropertyStoreFactory_INTERFACE_DEFINED__ +#define __IDelayedPropertyStoreFactory_INTERFACE_DEFINED__ + +/* interface IDelayedPropertyStoreFactory */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IDelayedPropertyStoreFactory; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("40d4577f-e237-4bdb-bd69-58f089431b6a") + IDelayedPropertyStoreFactory : public IPropertyStoreFactory + { + public: + virtual HRESULT STDMETHODCALLTYPE GetDelayedPropertyStore( + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [in] */ DWORD dwStoreId, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct IDelayedPropertyStoreFactoryVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDelayedPropertyStoreFactory * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDelayedPropertyStoreFactory * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IDelayedPropertyStoreFactory * This); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyStore )( + IDelayedPropertyStoreFactory * This, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [unique][in] */ __RPC__in_opt IUnknown *pUnkFactory, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyStoreForKeys )( + IDelayedPropertyStoreFactory * This, + /* [unique][in] */ __RPC__in_opt const PROPERTYKEY *rgKeys, + /* [in] */ UINT cKeys, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + HRESULT ( STDMETHODCALLTYPE *GetDelayedPropertyStore )( + IDelayedPropertyStoreFactory * This, + /* [in] */ GETPROPERTYSTOREFLAGS flags, + /* [in] */ DWORD dwStoreId, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + END_INTERFACE + } IDelayedPropertyStoreFactoryVtbl; + + interface IDelayedPropertyStoreFactory + { + CONST_VTBL struct IDelayedPropertyStoreFactoryVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDelayedPropertyStoreFactory_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDelayedPropertyStoreFactory_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDelayedPropertyStoreFactory_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDelayedPropertyStoreFactory_GetPropertyStore(This,flags,pUnkFactory,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyStore(This,flags,pUnkFactory,riid,ppv) ) + +#define IDelayedPropertyStoreFactory_GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv) \ + ( (This)->lpVtbl -> GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv) ) + + +#define IDelayedPropertyStoreFactory_GetDelayedPropertyStore(This,flags,dwStoreId,riid,ppv) \ + ( (This)->lpVtbl -> GetDelayedPropertyStore(This,flags,dwStoreId,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDelayedPropertyStoreFactory_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0018 */ +/* [local] */ + +/* [v1_enum] */ +enum tagPERSIST_SPROPSTORE_FLAGS + { FPSPS_READONLY = 0x1 + } ; +typedef int PERSIST_SPROPSTORE_FLAGS; + +typedef struct tagSERIALIZEDPROPSTORAGE SERIALIZEDPROPSTORAGE; + +typedef SERIALIZEDPROPSTORAGE __unaligned *PUSERIALIZEDPROPSTORAGE; + +typedef const SERIALIZEDPROPSTORAGE __unaligned *PCUSERIALIZEDPROPSTORAGE; + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0018_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0018_v0_0_s_ifspec; + +#ifndef __IPersistSerializedPropStorage_INTERFACE_DEFINED__ +#define __IPersistSerializedPropStorage_INTERFACE_DEFINED__ + +/* interface IPersistSerializedPropStorage */ +/* [object][local][unique][uuid] */ + + +EXTERN_C const IID IID_IPersistSerializedPropStorage; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("e318ad57-0aa0-450f-aca5-6fab7103d917") + IPersistSerializedPropStorage : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SetFlags( + /* [in] */ PERSIST_SPROPSTORE_FLAGS flags) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetPropertyStorage( + /* [in] */ + __in_bcount(cb) PCUSERIALIZEDPROPSTORAGE psps, + /* [in] */ + __in DWORD cb) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPropertyStorage( + /* [out] */ + __deref_out_bcount(*pcb) SERIALIZEDPROPSTORAGE **ppsps, + /* [out] */ + __out DWORD *pcb) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPersistSerializedPropStorageVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPersistSerializedPropStorage * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPersistSerializedPropStorage * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPersistSerializedPropStorage * This); + + HRESULT ( STDMETHODCALLTYPE *SetFlags )( + IPersistSerializedPropStorage * This, + /* [in] */ PERSIST_SPROPSTORE_FLAGS flags); + + HRESULT ( STDMETHODCALLTYPE *SetPropertyStorage )( + IPersistSerializedPropStorage * This, + /* [in] */ + __in_bcount(cb) PCUSERIALIZEDPROPSTORAGE psps, + /* [in] */ + __in DWORD cb); + + HRESULT ( STDMETHODCALLTYPE *GetPropertyStorage )( + IPersistSerializedPropStorage * This, + /* [out] */ + __deref_out_bcount(*pcb) SERIALIZEDPROPSTORAGE **ppsps, + /* [out] */ + __out DWORD *pcb); + + END_INTERFACE + } IPersistSerializedPropStorageVtbl; + + interface IPersistSerializedPropStorage + { + CONST_VTBL struct IPersistSerializedPropStorageVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPersistSerializedPropStorage_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPersistSerializedPropStorage_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPersistSerializedPropStorage_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPersistSerializedPropStorage_SetFlags(This,flags) \ + ( (This)->lpVtbl -> SetFlags(This,flags) ) + +#define IPersistSerializedPropStorage_SetPropertyStorage(This,psps,cb) \ + ( (This)->lpVtbl -> SetPropertyStorage(This,psps,cb) ) + +#define IPersistSerializedPropStorage_GetPropertyStorage(This,ppsps,pcb) \ + ( (This)->lpVtbl -> GetPropertyStorage(This,ppsps,pcb) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPersistSerializedPropStorage_INTERFACE_DEFINED__ */ + + +#ifndef __IPropertySystemChangeNotify_INTERFACE_DEFINED__ +#define __IPropertySystemChangeNotify_INTERFACE_DEFINED__ + +/* interface IPropertySystemChangeNotify */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IPropertySystemChangeNotify; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("fa955fd9-38be-4879-a6ce-824cf52d609f") + IPropertySystemChangeNotify : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SchemaRefreshed( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPropertySystemChangeNotifyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IPropertySystemChangeNotify * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IPropertySystemChangeNotify * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IPropertySystemChangeNotify * This); + + HRESULT ( STDMETHODCALLTYPE *SchemaRefreshed )( + IPropertySystemChangeNotify * This); + + END_INTERFACE + } IPropertySystemChangeNotifyVtbl; + + interface IPropertySystemChangeNotify + { + CONST_VTBL struct IPropertySystemChangeNotifyVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPropertySystemChangeNotify_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IPropertySystemChangeNotify_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IPropertySystemChangeNotify_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IPropertySystemChangeNotify_SchemaRefreshed(This) \ + ( (This)->lpVtbl -> SchemaRefreshed(This) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IPropertySystemChangeNotify_INTERFACE_DEFINED__ */ + + +#ifndef __ICreateObject_INTERFACE_DEFINED__ +#define __ICreateObject_INTERFACE_DEFINED__ + +/* interface ICreateObject */ +/* [object][unique][uuid] */ + + +EXTERN_C const IID IID_ICreateObject; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("75121952-e0d0-43e5-9380-1d80483acf72") + ICreateObject : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE CreateObject( + /* [in] */ __RPC__in REFCLSID clsid, + /* [unique][in] */ __RPC__in_opt IUnknown *pUnkOuter, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0; + + }; + +#else /* C style interface */ + + typedef struct ICreateObjectVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ICreateObject * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ICreateObject * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ICreateObject * This); + + HRESULT ( STDMETHODCALLTYPE *CreateObject )( + ICreateObject * This, + /* [in] */ __RPC__in REFCLSID clsid, + /* [unique][in] */ __RPC__in_opt IUnknown *pUnkOuter, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ __RPC__deref_out_opt void **ppv); + + END_INTERFACE + } ICreateObjectVtbl; + + interface ICreateObject + { + CONST_VTBL struct ICreateObjectVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ICreateObject_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ICreateObject_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ICreateObject_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ICreateObject_CreateObject(This,clsid,pUnkOuter,riid,ppv) \ + ( (This)->lpVtbl -> CreateObject(This,clsid,pUnkOuter,riid,ppv) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ICreateObject_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_propsys_0000_0021 */ +/* [local] */ + +// Format a property value for display purposes +PSSTDAPI PSFormatForDisplay( + __in REFPROPERTYKEY propkey, + __in REFPROPVARIANT propvar, + __in PROPDESC_FORMAT_FLAGS pdfFlags, + __out_ecount(cchText) LPWSTR pwszText, + __in DWORD cchText); + +PSSTDAPI PSFormatForDisplayAlloc( + __in REFPROPERTYKEY key, + __in REFPROPVARIANT propvar, + __in PROPDESC_FORMAT_FLAGS pdff, + __deref_out PWSTR *ppszDisplay); + +PSSTDAPI PSFormatPropertyValue( + __in IPropertyStore *pps, + __in IPropertyDescription *ppd, + __in PROPDESC_FORMAT_FLAGS pdff, + __deref_out LPWSTR *ppszDisplay); + + +#define PKEY_PIDSTR_MAX 10 // will take care of any long integer value +#define GUIDSTRING_MAX (1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1) // "{12345678-1234-1234-1234-123456789012}" +#define PKEYSTR_MAX (GUIDSTRING_MAX + 1 + PKEY_PIDSTR_MAX) + +// Convert a PROPERTYKEY to and from a PWSTR +PSSTDAPI PSStringFromPropertyKey( + __in REFPROPERTYKEY pkey, + __out_ecount(cch) LPWSTR psz, + __in UINT cch); + +PSSTDAPI PSPropertyKeyFromString( + __in LPCWSTR pszString, + __out PROPERTYKEY *pkey); + + +// Creates an in-memory property store +// Returns an IPropertyStore, IPersistSerializedPropStorage, and related interfaces interface +PSSTDAPI PSCreateMemoryPropertyStore( + __in REFIID riid, + __deref_out void **ppv); + + +// Create a read-only, delay-bind multiplexing property store +// Returns an IPropertyStore interface or related interfaces +PSSTDAPI PSCreateDelayedMultiplexPropertyStore( + __in GETPROPERTYSTOREFLAGS flags, + __in IDelayedPropertyStoreFactory *pdpsf, + __in_ecount(cStores) const DWORD *rgStoreIds, + __in DWORD cStores, + __in REFIID riid, + __deref_out void **ppv); + + +// Create a read-only property store from one or more sources (which each must support either IPropertyStore or IPropertySetStorage) +// Returns an IPropertyStore interface or related interfaces +PSSTDAPI PSCreateMultiplexPropertyStore( + __in_ecount(cStores) IUnknown **prgpunkStores, + __in DWORD cStores, + __in REFIID riid, + __deref_out void **ppv); + + +// Create a container for IPropertyChanges +// Returns an IPropertyChangeArray interface +PSSTDAPI PSCreatePropertyChangeArray( + __in_ecount_opt(cChanges) const PROPERTYKEY *rgpropkey, + __in_ecount_opt(cChanges) const PKA_FLAGS *rgflags, + __in_ecount_opt(cChanges) const PROPVARIANT *rgpropvar, + __in UINT cChanges, + __in REFIID riid, + __deref_out void **ppv); + + +// Create a simple property change +// Returns an IPropertyChange interface +PSSTDAPI PSCreateSimplePropertyChange( + __in PKA_FLAGS flags, + __in REFPROPERTYKEY key, + __in REFPROPVARIANT propvar, + __in REFIID riid, + __deref_out void **ppv); + + +// Get a property description +// Returns an IPropertyDescription interface +PSSTDAPI PSGetPropertyDescription( + __in REFPROPERTYKEY propkey, + __in REFIID riid, + __deref_out void **ppv); + +PSSTDAPI PSGetPropertyDescriptionByName( + __in LPCWSTR pszCanonicalName, + __in REFIID riid, + __deref_out void **ppv); + + +// Lookup a per-machine registered file property handler +PSSTDAPI PSLookupPropertyHandlerCLSID( + __in PCWSTR pszFilePath, + __out CLSID *pclsid); +// Get a property handler, on Vista or downlevel to XP +// punkItem is a shell item created with an SHCreateItemXXX API +// Returns an IPropertyStore +PSSTDAPI PSGetItemPropertyHandler( + __in IUnknown *punkItem, + __in BOOL fReadWrite, + __in REFIID riid, + __deref_out void **ppv); + + +// Get a property handler, on Vista or downlevel to XP +// punkItem is a shell item created with an SHCreateItemXXX API +// punkCreateObject supports ICreateObject +// Returns an IPropertyStore +PSSTDAPI PSGetItemPropertyHandlerWithCreateObject( + __in IUnknown *punkItem, + __in BOOL fReadWrite, + __in IUnknown *punkCreateObject, + __in REFIID riid, + __deref_out void **ppv); + + +// Get or set a property value from a store +PSSTDAPI PSGetPropertyValue( + __in IPropertyStore *pps, + __in IPropertyDescription *ppd, + __out PROPVARIANT *ppropvar); + +PSSTDAPI PSSetPropertyValue( + __in IPropertyStore *pps, + __in IPropertyDescription *ppd, + __in REFPROPVARIANT propvar); + + +// Interact with the set of property descriptions +PSSTDAPI PSRegisterPropertySchema( + __in PCWSTR pszPath); + +PSSTDAPI PSUnregisterPropertySchema( + __in PCWSTR pszPath); + +PSSTDAPI PSRefreshPropertySchema(); + +// Returns either: IPropertyDescriptionList or IEnumUnknown interfaces +PSSTDAPI PSEnumeratePropertyDescriptions( + __in PROPDESC_ENUMFILTER filterOn, + __in REFIID riid, + __deref_out void **ppv); + + +// Convert between a PROPERTYKEY and its canonical name +PSSTDAPI PSGetPropertyKeyFromName( + __in PCWSTR pszName, + __out PROPERTYKEY *ppropkey); + +PSSTDAPI PSGetNameFromPropertyKey( + __in REFPROPERTYKEY propkey, + __deref_out PWSTR *ppszCanonicalName); + + +// Coerce and canonicalize a property value +PSSTDAPI PSCoerceToCanonicalValue( + __in REFPROPERTYKEY key, + __inout PROPVARIANT *ppropvar); + + +// Convert a 'prop:' string into a list of property descriptions +// Returns an IPropertyDescriptionList interface +PSSTDAPI PSGetPropertyDescriptionListFromString( + __in LPCWSTR pszPropList, + __in REFIID riid, + __deref_out void **ppv); + + +// Wrap an IPropertySetStorage interface in an IPropertyStore interface +// Returns an IPropertyStore or related interface +PSSTDAPI PSCreatePropertyStoreFromPropertySetStorage( + __in IPropertySetStorage *ppss, + DWORD grfMode, + REFIID riid, + __deref_out void **ppv); + + +// punkSource must support IPropertyStore or IPropertySetStorage +// On success, the returned ppv is guaranteed to support IPropertyStore. +// If punkSource already supports IPropertyStore, no wrapper is created. +PSSTDAPI PSCreatePropertyStoreFromObject( + __in IUnknown *punk, + __in DWORD grfMode, + __in REFIID riid, + __deref_out void **ppv); + + +// punkSource must support IPropertyStore +// riid may be IPropertyStore, IPropertySetStorage, IPropertyStoreCapabilities, or IObjectProvider +PSSTDAPI PSCreateAdapterFromPropertyStore( + __in IPropertyStore *pps, + __in REFIID riid, + __deref_out void **ppv); + + +// Talk to the property system using an interface +// Returns an IPropertySystem interface +PSSTDAPI PSGetPropertySystem( + __in REFIID riid, + __deref_out void **ppv); + + +// Obtain a value from serialized property storage +PSSTDAPI PSGetPropertyFromPropertyStorage( + __in_bcount(cb) PCUSERIALIZEDPROPSTORAGE psps, + __in DWORD cb, + __in REFPROPERTYKEY rpkey, + __out PROPVARIANT *ppropvar); + + +// Obtain a named value from serialized property storage +PSSTDAPI PSGetNamedPropertyFromPropertyStorage( + __in_bcount(cb) PCUSERIALIZEDPROPSTORAGE psps, + __in DWORD cb, + __in LPCWSTR pszName, + __out PROPVARIANT *ppropvar); + + + + +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0021_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_propsys_0000_0021_v0_0_s_ifspec; + + +#ifndef __PropSysObjects_LIBRARY_DEFINED__ +#define __PropSysObjects_LIBRARY_DEFINED__ + +/* library PropSysObjects */ +/* [version][lcid][uuid] */ + + +EXTERN_C const IID LIBID_PropSysObjects; + +EXTERN_C const CLSID CLSID_InMemoryPropertyStore; + +#ifdef __cplusplus + +class DECLSPEC_UUID("9a02e012-6303-4e1e-b9a1-630f802592c5") +InMemoryPropertyStore; +#endif + +EXTERN_C const CLSID CLSID_PropertySystem; + +#ifdef __cplusplus + +class DECLSPEC_UUID("b8967f85-58ae-4f46-9fb2-5d7904798f4b") +PropertySystem; +#endif +#endif /* __PropSysObjects_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); +unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); +unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); +void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); + +unsigned long __RPC_USER LPSAFEARRAY_UserSize( unsigned long *, unsigned long , LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal( unsigned long *, unsigned char *, LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); +void __RPC_USER LPSAFEARRAY_UserFree( unsigned long *, LPSAFEARRAY * ); + +unsigned long __RPC_USER BSTR_UserSize64( unsigned long *, unsigned long , BSTR * ); +unsigned char * __RPC_USER BSTR_UserMarshal64( unsigned long *, unsigned char *, BSTR * ); +unsigned char * __RPC_USER BSTR_UserUnmarshal64(unsigned long *, unsigned char *, BSTR * ); +void __RPC_USER BSTR_UserFree64( unsigned long *, BSTR * ); + +unsigned long __RPC_USER LPSAFEARRAY_UserSize64( unsigned long *, unsigned long , LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal64( unsigned long *, unsigned char *, LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal64(unsigned long *, unsigned char *, LPSAFEARRAY * ); +void __RPC_USER LPSAFEARRAY_UserFree64( unsigned long *, LPSAFEARRAY * ); + +/* [local] */ HRESULT STDMETHODCALLTYPE IInitializeWithStream_Initialize_Proxy( + IInitializeWithStream * This, + /* [in] */ IStream *pstream, + /* [in] */ DWORD grfMode); + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IInitializeWithStream_Initialize_Stub( + IInitializeWithStream * This, + /* [in] */ __RPC__in_opt IStream *pstream, + /* [in] */ DWORD grfMode); + +/* [local] */ HRESULT STDMETHODCALLTYPE IPropertyDescription_CoerceToCanonicalValue_Proxy( + IPropertyDescription * This, + /* [out][in] */ PROPVARIANT *ppropvar); + + +/* [call_as] */ HRESULT STDMETHODCALLTYPE IPropertyDescription_CoerceToCanonicalValue_Stub( + IPropertyDescription * This, + /* [in] */ __RPC__in REFPROPVARIANT propvar, + /* [out] */ __RPC__out PROPVARIANT *ppropvar); + + + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/rpcsal.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/rpcsal.h new file mode 100644 index 0000000000..ba9836a84a --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/rpcsal.h @@ -0,0 +1,113 @@ +#pragma once + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define RPC_range(min,max) + +#define __RPC__in +#define __RPC__in_string +#define __RPC__in_opt_string +#define __RPC__deref_opt_in_opt +#define __RPC__opt_in_opt_string +#define __RPC__in_ecount(size) +#define __RPC__in_ecount_full(size) +#define __RPC__in_ecount_full_string(size) +#define __RPC__in_ecount_part(size, length) +#define __RPC__in_ecount_full_opt(size) +#define __RPC__in_ecount_full_opt_string(size) +#define __RPC__inout_ecount_full_opt_string(size) +#define __RPC__in_ecount_part_opt(size, length) + +#define __RPC__deref_in +#define __RPC__deref_in_string +#define __RPC__deref_opt_in +#define __RPC__deref_in_opt +#define __RPC__deref_in_ecount(size) +#define __RPC__deref_in_ecount_part(size, length) +#define __RPC__deref_in_ecount_full(size) +#define __RPC__deref_in_ecount_full_opt(size) +#define __RPC__deref_in_ecount_full_string(size) +#define __RPC__deref_in_ecount_full_opt_string(size) +#define __RPC__deref_in_ecount_opt(size) +#define __RPC__deref_in_ecount_opt_string(size) +#define __RPC__deref_in_ecount_part_opt(size, length) + +// [out] +#define __RPC__out +#define __RPC__out_ecount(size) +#define __RPC__out_ecount_part(size, length) +#define __RPC__out_ecount_full(size) +#define __RPC__out_ecount_full_string(size) + +// [in,out] +#define __RPC__inout +#define __RPC__inout_string +#define __RPC__opt_inout +#define __RPC__inout_ecount(size) +#define __RPC__inout_ecount_part(size, length) +#define __RPC__inout_ecount_full(size) +#define __RPC__inout_ecount_full_string(size) + +// [in,unique] +#define __RPC__in_opt +#define __RPC__in_ecount_opt(size) + + +// [in,out,unique] +#define __RPC__inout_opt +#define __RPC__inout_ecount_opt(size) +#define __RPC__inout_ecount_part_opt(size, length) +#define __RPC__inout_ecount_full_opt(size) +#define __RPC__inout_ecount_full_string(size) + +// [out] ** +#define __RPC__deref_out +#define __RPC__deref_out_string +#define __RPC__deref_out_opt +#define __RPC__deref_out_opt_string +#define __RPC__deref_out_ecount(size) +#define __RPC__deref_out_ecount_part(size, length) +#define __RPC__deref_out_ecount_full(size) +#define __RPC__deref_out_ecount_full_string(size) + + +// [in,out] **, second pointer decoration. +#define __RPC__deref_inout +#define __RPC__deref_inout_string +#define __RPC__deref_inout_opt +#define __RPC__deref_inout_opt_string +#define __RPC__deref_inout_ecount_full(size) +#define __RPC__deref_inout_ecount_full_string(size) +#define __RPC__deref_inout_ecount_opt(size) +#define __RPC__deref_inout_ecount_part_opt(size, length) +#define __RPC__deref_inout_ecount_full_opt(size) +#define __RPC__deref_inout_ecount_full_opt_string(size) + +// #define __RPC_out_opt out_opt is not allowed in rpc + +// [in,out,unique] +#define __RPC__deref_opt_inout +#define __RPC__deref_opt_inout_string +#define __RPC__deref_opt_inout_ecount(size) +#define __RPC__deref_opt_inout_ecount_part(size, length) +#define __RPC__deref_opt_inout_ecount_full(size) +#define __RPC__deref_opt_inout_ecount_full_string(size) + +#define __RPC__deref_out_ecount_opt(size) +#define __RPC__deref_out_ecount_part_opt(size, length) +#define __RPC__deref_out_ecount_full_opt(size) +#define __RPC__deref_out_ecount_full_opt_string(size) + +#define __RPC__deref_opt_inout_opt +#define __RPC__deref_opt_inout_opt_string +#define __RPC__deref_opt_inout_ecount_opt(size) +#define __RPC__deref_opt_inout_ecount_part_opt(size, length) +#define __RPC__deref_opt_inout_ecount_full_opt(size) +#define __RPC__deref_opt_inout_ecount_full_opt_string(size) + +#define __RPC_full_pointer +#define __RPC_unique_pointer +#define __RPC_ref_pointer +#define __RPC_string diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/sal.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/sal.h new file mode 100644 index 0000000000..3f99ab9a92 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/sal.h @@ -0,0 +1,252 @@ +#pragma once + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +/*#define __null*/ // << Conflicts with GCC internal type __null +#define __notnull +#define __maybenull +#define __readonly +#define __notreadonly +#define __maybereadonly +#define __valid +#define __notvalid +#define __maybevalid +#define __readableTo(extent) +#define __elem_readableTo(size) +#define __byte_readableTo(size) +#define __writableTo(size) +#define __elem_writableTo(size) +#define __byte_writableTo(size) +#define __deref +#define __pre +#define __post +#define __precond(expr) +#define __postcond(expr) +#define __exceptthat +#define __execeptthat +#define __inner_success(expr) +#define __inner_checkReturn +#define __inner_typefix(ctype) +#define __inner_override +#define __inner_callback +#define __inner_blocksOn(resource) +#define __inner_fallthrough_dec +#define __inner_fallthrough +#define __refparam +#define __inner_control_entrypoint(category) +#define __inner_data_entrypoint(category) + +#define __ecount(size) +#define __bcount(size) +#define __in +#define __in_ecount(size) +#define __in_bcount(size) +#define __in_z +#define __in_ecount_z(size) +#define __in_bcount_z(size) +#define __in_nz +#define __in_ecount_nz(size) +#define __in_bcount_nz(size) +#define __out +#define __out_ecount(size) +#define __out_bcount(size) +#define __out_ecount_part(size,length) +#define __out_bcount_part(size,length) +#define __out_ecount_full(size) +#define __out_bcount_full(size) +#define __out_z +#define __out_z_opt +#define __out_ecount_z(size) +#define __out_bcount_z(size) +#define __out_ecount_part_z(size,length) +#define __out_bcount_part_z(size,length) +#define __out_ecount_full_z(size) +#define __out_bcount_full_z(size) +#define __out_nz +#define __out_nz_opt +#define __out_ecount_nz(size) +#define __out_bcount_nz(size) +#define __inout +#define __inout_ecount(size) +#define __inout_bcount(size) +#define __inout_ecount_part(size,length) +#define __inout_bcount_part(size,length) +#define __inout_ecount_full(size) +#define __inout_bcount_full(size) +#define __inout_z +#define __inout_ecount_z(size) +#define __inout_bcount_z(size) +#define __inout_nz +#define __inout_ecount_nz(size) +#define __inout_bcount_nz(size) +#define __ecount_opt(size) +#define __bcount_opt(size) +#define __in_opt +#define __in_ecount_opt(size) +#define __in_bcount_opt(size) +#define __in_z_opt +#define __in_ecount_z_opt(size) +#define __in_bcount_z_opt(size) +#define __in_nz_opt +#define __in_ecount_nz_opt(size) +#define __in_bcount_nz_opt(size) +#define __out_opt +#define __out_ecount_opt(size) +#define __out_bcount_opt(size) +#define __out_ecount_part_opt(size,length) +#define __out_bcount_part_opt(size,length) +#define __out_ecount_full_opt(size) +#define __out_bcount_full_opt(size) +#define __out_ecount_z_opt(size) +#define __out_bcount_z_opt(size) +#define __out_ecount_part_z_opt(size,length) +#define __out_bcount_part_z_opt(size,length) +#define __out_ecount_full_z_opt(size) +#define __out_bcount_full_z_opt(size) +#define __out_ecount_nz_opt(size) +#define __out_bcount_nz_opt(size) +#define __inout_opt +#define __inout_ecount_opt(size) +#define __inout_bcount_opt(size) +#define __inout_ecount_part_opt(size,length) +#define __inout_bcount_part_opt(size,length) +#define __inout_ecount_full_opt(size) +#define __inout_bcount_full_opt(size) +#define __inout_z_opt +#define __inout_ecount_z_opt(size) +#define __inout_ecount_z_opt(size) +#define __inout_bcount_z_opt(size) +#define __inout_nz_opt +#define __inout_ecount_nz_opt(size) +#define __inout_bcount_nz_opt(size) +#define __deref_ecount(size) +#define __deref_bcount(size) +#define __deref_out +#define __deref_out_ecount(size) +#define __deref_out_bcount(size) +#define __deref_out_ecount_part(size,length) +#define __deref_out_bcount_part(size,length) +#define __deref_out_ecount_full(size) +#define __deref_out_bcount_full(size) +#define __deref_out_z +#define __deref_out_ecount_z(size) +#define __deref_out_bcount_z(size) +#define __deref_out_nz +#define __deref_out_ecount_nz(size) +#define __deref_out_bcount_nz(size) +#define __deref_inout +#define __deref_inout_z +#define __deref_inout_ecount(size) +#define __deref_inout_bcount(size) +#define __deref_inout_ecount_part(size,length) +#define __deref_inout_bcount_part(size,length) +#define __deref_inout_ecount_full(size) +#define __deref_inout_bcount_full(size) +#define __deref_inout_z +#define __deref_inout_ecount_z(size) +#define __deref_inout_bcount_z(size) +#define __deref_inout_nz +#define __deref_inout_ecount_nz(size) +#define __deref_inout_bcount_nz(size) +#define __deref_ecount_opt(size) +#define __deref_bcount_opt(size) +#define __deref_out_opt +#define __deref_out_ecount_opt(size) +#define __deref_out_bcount_opt(size) +#define __deref_out_ecount_part_opt(size,length) +#define __deref_out_bcount_part_opt(size,length) +#define __deref_out_ecount_full_opt(size) +#define __deref_out_bcount_full_opt(size) +#define __deref_out_z_opt +#define __deref_out_ecount_z_opt(size) +#define __deref_out_bcount_z_opt(size) +#define __deref_out_nz_opt +#define __deref_out_ecount_nz_opt(size) +#define __deref_out_bcount_nz_opt(size) +#define __deref_inout_opt +#define __deref_inout_ecount_opt(size) +#define __deref_inout_bcount_opt(size) +#define __deref_inout_ecount_part_opt(size,length) +#define __deref_inout_bcount_part_opt(size,length) +#define __deref_inout_ecount_full_opt(size) +#define __deref_inout_bcount_full_opt(size) +#define __deref_inout_z_opt +#define __deref_inout_ecount_z_opt(size) +#define __deref_inout_bcount_z_opt(size) +#define __deref_inout_nz_opt +#define __deref_inout_ecount_nz_opt(size) +#define __deref_inout_bcount_nz_opt(size) +#define __deref_opt_ecount(size) +#define __deref_opt_bcount(size) +#define __deref_opt_out +#define __deref_opt_out_z +#define __deref_opt_out_ecount(size) +#define __deref_opt_out_bcount(size) +#define __deref_opt_out_ecount_part(size,length) +#define __deref_opt_out_bcount_part(size,length) +#define __deref_opt_out_ecount_full(size) +#define __deref_opt_out_bcount_full(size) +#define __deref_opt_inout +#define __deref_opt_inout_ecount(size) +#define __deref_opt_inout_bcount(size) +#define __deref_opt_inout_ecount_part(size,length) +#define __deref_opt_inout_bcount_part(size,length) +#define __deref_opt_inout_ecount_full(size) +#define __deref_opt_inout_bcount_full(size) +#define __deref_opt_inout_z +#define __deref_opt_inout_ecount_z(size) +#define __deref_opt_inout_bcount_z(size) +#define __deref_opt_inout_nz +#define __deref_opt_inout_ecount_nz(size) +#define __deref_opt_inout_bcount_nz(size) +#define __deref_opt_ecount_opt(size) +#define __deref_opt_bcount_opt(size) +#define __deref_opt_out_opt +#define __deref_opt_out_ecount_opt(size) +#define __deref_opt_out_bcount_opt(size) +#define __deref_opt_out_ecount_part_opt(size,length) +#define __deref_opt_out_bcount_part_opt(size,length) +#define __deref_opt_out_ecount_full_opt(size) +#define __deref_opt_out_bcount_full_opt(size) +#define __deref_opt_out_z_opt +#define __deref_opt_out_ecount_z_opt(size) +#define __deref_opt_out_bcount_z_opt(size) +#define __deref_opt_out_nz_opt +#define __deref_opt_out_ecount_nz_opt(size) +#define __deref_opt_out_bcount_nz_opt(size) +#define __deref_opt_inout_opt +#define __deref_opt_inout_ecount_opt(size) +#define __deref_opt_inout_bcount_opt(size) +#define __deref_opt_inout_ecount_part_opt(size,length) +#define __deref_opt_inout_bcount_part_opt(size,length) +#define __deref_opt_inout_ecount_full_opt(size) +#define __deref_opt_inout_bcount_full_opt(size) +#define __deref_opt_inout_z_opt +#define __deref_opt_inout_ecount_z_opt(size) +#define __deref_opt_inout_bcount_z_opt(size) +#define __deref_opt_inout_nz_opt +#define __deref_opt_inout_ecount_nz_opt(size) +#define __deref_opt_inout_bcount_nz_opt(size) + +#define __success(expr) +#define __nullterminated +#define __nullnullterminated +#define __reserved +#define __checkReturn +#define __typefix(ctype) +#define __override +#define __callback +#define __format_string +#define __blocksOn(resource) +#define __control_entrypoint(category) +#define __data_entrypoint(category) + +#ifndef __fallthrough + #define __fallthrough __inner_fallthrough +#endif + +#ifndef __analysis_assume + #define __analysis_assume(expr) +#endif diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/sdkddkver.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/sdkddkver.h new file mode 100644 index 0000000000..bc9008659a --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/sdkddkver.h @@ -0,0 +1,225 @@ +/* + +Copyright (c) Microsoft Corporation. All rights reserved. + +Module Name: + + sdkddkver.h + +Abstract: + + Master include file for versioning windows SDK/DDK. + +*/ + +#ifndef _INC_SDKDDKVER +#define _INC_SDKDDKVER + +#pragma once + +// +// _WIN32_WINNT version constants +// +#define _WIN32_WINNT_NT4 0x0400 +#define _WIN32_WINNT_WIN2K 0x0500 +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_WINNT_LONGHORN 0x0600 + +// +// _WIN32_IE_ version constants +// +#define _WIN32_IE_IE20 0x0200 +#define _WIN32_IE_IE30 0x0300 +#define _WIN32_IE_IE302 0x0302 +#define _WIN32_IE_IE40 0x0400 +#define _WIN32_IE_IE401 0x0401 +#define _WIN32_IE_IE50 0x0500 +#define _WIN32_IE_IE501 0x0501 +#define _WIN32_IE_IE55 0x0550 +#define _WIN32_IE_IE60 0x0600 +#define _WIN32_IE_IE60SP1 0x0601 +#define _WIN32_IE_IE60SP2 0x0603 +#define _WIN32_IE_IE70 0x0700 + +// +// IE <-> OS version mapping +// +// NT4 supports IE versions 2.0 -> 6.0 SP1 +#define _WIN32_IE_NT4 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP1 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP2 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP3 _WIN32_IE_IE302 +#define _WIN32_IE_NT4SP4 _WIN32_IE_IE401 +#define _WIN32_IE_NT4SP5 _WIN32_IE_IE401 +#define _WIN32_IE_NT4SP6 _WIN32_IE_IE50 +// Win98 supports IE versions 4.01 -> 6.0 SP1 +#define _WIN32_IE_WIN98 _WIN32_IE_IE401 +// Win98SE supports IE versions 5.0 -> 6.0 SP1 +#define _WIN32_IE_WIN98SE _WIN32_IE_IE50 +// WinME supports IE versions 5.5 -> 6.0 SP1 +#define _WIN32_IE_WINME _WIN32_IE_IE55 +// Win2k supports IE versions 5.01 -> 6.0 SP1 +#define _WIN32_IE_WIN2K _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP1 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP2 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP3 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP4 _WIN32_IE_IE501 +#define _WIN32_IE_XP _WIN32_IE_IE60 +#define _WIN32_IE_XPSP1 _WIN32_IE_IE60SP1 +#define _WIN32_IE_XPSP2 _WIN32_IE_IE60SP2 +#define _WIN32_IE_WS03 0x0602 +#define _WIN32_IE_WS03SP1 _WIN32_IE_IE60SP2 +#define _WIN32_IE_LONGHORN _WIN32_IE_IE70 + + +// +// NTDDI version constants +// +#define NTDDI_WIN2K 0x05000000 +#define NTDDI_WIN2KSP1 0x05000100 +#define NTDDI_WIN2KSP2 0x05000200 +#define NTDDI_WIN2KSP3 0x05000300 +#define NTDDI_WIN2KSP4 0x05000400 + +#define NTDDI_WINXP 0x05010000 +#define NTDDI_WINXPSP1 0x05010100 +#define NTDDI_WINXPSP2 0x05010200 + +#define NTDDI_WS03 0x05020000 +#define NTDDI_WS03SP1 0x05020100 + +#define NTDDI_LONGHORN 0x06000000 + +// +// masks for version macros +// +#define OSVERSION_MASK 0xFFFF0000 +#define SPVERSION_MASK 0x0000FF00 +#define SUBVERSION_MASK 0x000000FF + + +// +// macros to extract various version fields from the NTDDI version +// +#define OSVER(Version) ((Version) & OSVERSION_MASK) +#define SPVER(Version) (((Version) & SPVERSION_MASK) >> 8) +#define SUBVER(Version) (((Version) & SUBVERSION_MASK) ) + + +#if defined(DECLSPEC_DEPRECATED_DDK) + +// deprecate in 2k or later +#if (NTDDI_VERSION >= NTDDI_WIN2K) +#define DECLSPEC_DEPRECATED_DDK_WIN2K DECLSPEC_DEPRECATED_DDK +#else +#define DECLSPEC_DEPRECATED_DDK_WIN2K +#endif + +// deprecate in XP or later +#if (NTDDI_VERSION >= NTDDI_WINXP) +#define DECLSPEC_DEPRECATED_DDK_WINXP DECLSPEC_DEPRECATED_DDK +#else +#define DECLSPEC_DEPRECATED_DDK_WINXP +#endif + +// deprecate in WS03 or later +#if (NTDDI_VERSION >= NTDDI_WS03) +#define DECLSPEC_DEPRECATED_DDK_WIN2003 DECLSPEC_DEPRECATED_DDK +#else +#define DECLSPEC_DEPRECATED_DDK_WIN2003 +#endif + +// deprecate in WS03 or later +#if (NTDDI_VERSION >= NTDDI_LONGHORN) +#define DECLSPEC_DEPRECATED_DDK_LONGHORN DECLSPEC_DEPRECATED_DDK +#else +#define DECLSPEC_DEPRECATED_DDK_LONGHORN +#endif + +#endif // defined(DECLSPEC_DEPRECATED_DDK) + + +// +// if versions aren't already defined, default to most current +// + +#define NTDDI_VERSION_FROM_WIN32_WINNT2(ver) ver##0000 +#define NTDDI_VERSION_FROM_WIN32_WINNT(ver) NTDDI_VERSION_FROM_WIN32_WINNT2(ver) + +#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_) +#define _WIN32_WINNT 0x0600 +#endif + +#ifndef NTDDI_VERSION +#ifdef _WIN32_WINNT +// set NTDDI_VERSION based on _WIN32_WINNT +#define NTDDI_VERSION NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT) +#else +#define NTDDI_VERSION 0x06000000 +#endif +#endif + +#ifndef WINVER +#ifdef _WIN32_WINNT +// set WINVER based on _WIN32_WINNT +#define WINVER _WIN32_WINNT +#else +#define WINVER 0x0600 +#endif +#endif + +#ifndef _WIN32_IE +#ifdef _WIN32_WINNT +// set _WIN32_IE based on _WIN32_WINNT +#if (_WIN32_WINNT <= _WIN32_WINNT_NT4) +#define _WIN32_IE _WIN32_IE_IE50 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WIN2K) +#define _WIN32_IE _WIN32_IE_IE501 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WINXP) +#define _WIN32_IE _WIN32_IE_IE60 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WS03) +#define _WIN32_IE 0x0602 +#else +#define _WIN32_IE 0x0700 +#endif +#else +#define _WIN32_IE 0x0700 +#endif +#endif + +// +// Sanity check for compatible versions +// +#if defined(_WIN32_WINNT) && !defined(MIDL_PASS) && !defined(RC_INVOKED) + +#if (defined(WINVER) && (WINVER < 0x0400) && (_WIN32_WINNT > 0x0400)) +#error WINVER setting conflicts with _WIN32_WINNT setting +#endif + +#if (((OSVERSION_MASK & NTDDI_VERSION) == NTDDI_WIN2K) && (_WIN32_WINNT != _WIN32_WINNT_WIN2K)) +#error NTDDI_VERSION setting conflicts with _WIN32_WINNT setting +#endif + +#if (((OSVERSION_MASK & NTDDI_VERSION) == NTDDI_WINXP) && (_WIN32_WINNT != _WIN32_WINNT_WINXP)) +#error NTDDI_VERSION setting conflicts with _WIN32_WINNT setting +#endif + +#if (((OSVERSION_MASK & NTDDI_VERSION) == NTDDI_WS03) && (_WIN32_WINNT != _WIN32_WINNT_WS03)) +#error NTDDI_VERSION setting conflicts with _WIN32_WINNT setting +#endif + +#if (((OSVERSION_MASK & NTDDI_VERSION) == NTDDI_LONGHORN) && (_WIN32_WINNT != _WIN32_WINNT_LONGHORN)) +#error NTDDI_VERSION setting conflicts with _WIN32_WINNT setting +#endif + +#if ((_WIN32_WINNT < _WIN32_WINNT_WIN2K) && (_WIN32_IE > _WIN32_IE_IE60SP1)) +#error _WIN32_WINNT settings conflicts with _WIN32_IE setting +#endif + +#endif // defined(_WIN32_WINNT) && !defined(MIDL_PASS) && !defined(_WINRESRC_) + + +#endif // !_INC_SDKDDKVER + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/shtypes.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/shtypes.h new file mode 100644 index 0000000000..5221d060f5 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/shtypes.h @@ -0,0 +1,468 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for shtypes.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + + +#ifndef __shtypes_h__ +#define __shtypes_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +/* header files for imported files */ +#include "wtypes.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_shtypes_0000_0000 */ +/* [local] */ + +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//-------------------------------------------------------------------------- +//=========================================================================== +// +// Object identifiers in the explorer's name space (ItemID and IDList) +// +// All the items that the user can browse with the explorer (such as files, +// directories, servers, work-groups, etc.) has an identifier which is unique +// among items within the parent folder. Those identifiers are called item +// IDs (SHITEMID). Since all its parent folders have their own item IDs, +// any items can be uniquely identified by a list of item IDs, which is called +// an ID list (ITEMIDLIST). +// +// ID lists are almost always allocated by the task allocator (see some +// description below as well as OLE 2.0 SDK) and may be passed across +// some of shell interfaces (such as IShellFolder). Each item ID in an ID list +// is only meaningful to its parent folder (which has generated it), and all +// the clients must treat it as an opaque binary data except the first two +// bytes, which indicates the size of the item ID. +// +// When a shell extension -- which implements the IShellFolder interace -- +// generates an item ID, it may put any information in it, not only the data +// with that it needs to identifies the item, but also some additional +// information, which would help implementing some other functions efficiently. +// For example, the shell's IShellFolder implementation of file system items +// stores the primary (long) name of a file or a directory as the item +// identifier, but it also stores its alternative (short) name, size and date +// etc. +// +// When an ID list is passed to one of shell APIs (such as SHGetPathFromIDList), +// it is always an absolute path -- relative from the root of the name space, +// which is the desktop folder. When an ID list is passed to one of IShellFolder +// member function, it is always a relative path from the folder (unless it +// is explicitly specified). +// +//=========================================================================== +// +// SHITEMID -- Item ID (mkid) +// USHORT cb; // Size of the ID (including cb itself) +// BYTE abID[]; // The item ID (variable length) +// +#include +typedef struct _SHITEMID + { + USHORT cb; + BYTE abID[ 1 ]; + } SHITEMID; + +#include +#if defined(_M_IX86) +#define __unaligned +#endif // __unaligned +typedef SHITEMID __unaligned *LPSHITEMID; + +typedef const SHITEMID __unaligned *LPCSHITEMID; + +// +// ITEMIDLIST -- List if item IDs (combined with 0-terminator) +// +#include +typedef struct _ITEMIDLIST + { + SHITEMID mkid; + } ITEMIDLIST; + +#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) +typedef struct _ITEMIDLIST_RELATIVE : ITEMIDLIST {} ITEMIDLIST_RELATIVE; +typedef struct _ITEMID_CHILD : ITEMIDLIST_RELATIVE {} ITEMID_CHILD; +typedef struct _ITEMIDLIST_ABSOLUTE : ITEMIDLIST_RELATIVE {} ITEMIDLIST_ABSOLUTE; +#else // !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) +typedef ITEMIDLIST ITEMIDLIST_RELATIVE; + +typedef ITEMIDLIST ITEMID_CHILD; + +typedef ITEMIDLIST ITEMIDLIST_ABSOLUTE; + +#endif // defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) +#include +typedef /* [unique] */ __RPC_unique_pointer BYTE_BLOB *wirePIDL; + +typedef /* [wire_marshal] */ ITEMIDLIST __unaligned *LPITEMIDLIST; + +typedef /* [wire_marshal] */ const ITEMIDLIST __unaligned *LPCITEMIDLIST; + +#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) +typedef /* [wire_marshal] */ ITEMIDLIST_ABSOLUTE *PIDLIST_ABSOLUTE; + +typedef /* [wire_marshal] */ const ITEMIDLIST_ABSOLUTE *PCIDLIST_ABSOLUTE; + +typedef /* [wire_marshal] */ const ITEMIDLIST_ABSOLUTE __unaligned *PCUIDLIST_ABSOLUTE; + +typedef /* [wire_marshal] */ ITEMIDLIST_RELATIVE *PIDLIST_RELATIVE; + +typedef /* [wire_marshal] */ const ITEMIDLIST_RELATIVE *PCIDLIST_RELATIVE; + +typedef /* [wire_marshal] */ ITEMIDLIST_RELATIVE __unaligned *PUIDLIST_RELATIVE; + +typedef /* [wire_marshal] */ const ITEMIDLIST_RELATIVE __unaligned *PCUIDLIST_RELATIVE; + +typedef /* [wire_marshal] */ ITEMID_CHILD *PITEMID_CHILD; + +typedef /* [wire_marshal] */ const ITEMID_CHILD *PCITEMID_CHILD; + +typedef /* [wire_marshal] */ ITEMID_CHILD __unaligned *PUITEMID_CHILD; + +typedef /* [wire_marshal] */ const ITEMID_CHILD __unaligned *PCUITEMID_CHILD; + +typedef const PCUITEMID_CHILD *PCUITEMID_CHILD_ARRAY; + +typedef const PCUIDLIST_RELATIVE *PCUIDLIST_RELATIVE_ARRAY; + +typedef const PCIDLIST_ABSOLUTE *PCIDLIST_ABSOLUTE_ARRAY; + +typedef const PCUIDLIST_ABSOLUTE *PCUIDLIST_ABSOLUTE_ARRAY; + +#else // !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) +#define PIDLIST_ABSOLUTE LPITEMIDLIST +#define PCIDLIST_ABSOLUTE LPCITEMIDLIST +#define PCUIDLIST_ABSOLUTE LPCITEMIDLIST +#define PIDLIST_RELATIVE LPITEMIDLIST +#define PCIDLIST_RELATIVE LPCITEMIDLIST +#define PUIDLIST_RELATIVE LPITEMIDLIST +#define PCUIDLIST_RELATIVE LPCITEMIDLIST +#define PITEMID_CHILD LPITEMIDLIST +#define PCITEMID_CHILD LPCITEMIDLIST +#define PUITEMID_CHILD LPITEMIDLIST +#define PCUITEMID_CHILD LPCITEMIDLIST +#define PCUITEMID_CHILD_ARRAY LPCITEMIDLIST * +#define PCUIDLIST_RELATIVE_ARRAY LPCITEMIDLIST * +#define PCIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST * +#define PCUIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST * +#endif // defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) +#ifdef MIDL_PASS +typedef struct _WIN32_FIND_DATAA + { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[ 260 ]; + CHAR cAlternateFileName[ 14 ]; + } WIN32_FIND_DATAA; + +typedef struct _WIN32_FIND_DATAA *PWIN32_FIND_DATAA; + +typedef struct _WIN32_FIND_DATAA *LPWIN32_FIND_DATAA; + +typedef struct _WIN32_FIND_DATAW + { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[ 260 ]; + WCHAR cAlternateFileName[ 14 ]; + } WIN32_FIND_DATAW; + +typedef struct _WIN32_FIND_DATAW *PWIN32_FIND_DATAW; + +typedef struct _WIN32_FIND_DATAW *LPWIN32_FIND_DATAW; + +#endif // MIDL_PASS +//------------------------------------------------------------------------- +// +// struct STRRET +// +// structure for returning strings from IShellFolder member functions +// +//------------------------------------------------------------------------- +// +// uType indicate which union member to use +// STRRET_WSTR Use STRRET.pOleStr must be freed by caller of GetDisplayNameOf +// STRRET_OFFSET Use STRRET.uOffset Offset into SHITEMID for ANSI string +// STRRET_CSTR Use STRRET.cStr ANSI Buffer +// +typedef /* [v1_enum] */ +enum tagSTRRET_TYPE + { STRRET_WSTR = 0, + STRRET_OFFSET = 0x1, + STRRET_CSTR = 0x2 + } STRRET_TYPE; + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma warning(push) +#pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */ +#pragma once +#endif +#include +typedef struct _STRRET + { + UINT uType; + union + { + LPWSTR pOleStr; + UINT uOffset; + char cStr[ 260 ]; + } DUMMYUNIONNAME; + } STRRET; + +#include +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +#pragma warning(pop) +#endif +typedef STRRET *LPSTRRET; + +//------------------------------------------------------------------------- +// +// struct SHELLDETAILS +// +// structure for returning strings from IShellDetails +// +//------------------------------------------------------------------------- +// +// fmt; // LVCFMT_* value (header only) +// cxChar; // Number of 'average' characters (header only) +// str; // String information +// +#include +typedef struct _SHELLDETAILS + { + int fmt; + int cxChar; + STRRET str; + } SHELLDETAILS; + +typedef struct _SHELLDETAILS *LPSHELLDETAILS; + +#include + +#if (_WIN32_IE >= _WIN32_IE_IE60SP2) +typedef /* [v1_enum] */ +enum tagPERCEIVED + { PERCEIVED_TYPE_FIRST = -3, + PERCEIVED_TYPE_CUSTOM = -3, + PERCEIVED_TYPE_UNSPECIFIED = -2, + PERCEIVED_TYPE_FOLDER = -1, + PERCEIVED_TYPE_UNKNOWN = 0, + PERCEIVED_TYPE_TEXT = 1, + PERCEIVED_TYPE_IMAGE = 2, + PERCEIVED_TYPE_AUDIO = 3, + PERCEIVED_TYPE_VIDEO = 4, + PERCEIVED_TYPE_COMPRESSED = 5, + PERCEIVED_TYPE_DOCUMENT = 6, + PERCEIVED_TYPE_SYSTEM = 7, + PERCEIVED_TYPE_APPLICATION = 8, + PERCEIVED_TYPE_GAMEMEDIA = 9, + PERCEIVED_TYPE_CONTACTS = 10, + PERCEIVED_TYPE_LAST = 10 + } PERCEIVED; + +#define PERCEIVEDFLAG_UNDEFINED 0x0000 +#define PERCEIVEDFLAG_SOFTCODED 0x0001 +#define PERCEIVEDFLAG_HARDCODED 0x0002 +#define PERCEIVEDFLAG_NATIVESUPPORT 0x0004 +#define PERCEIVEDFLAG_GDIPLUS 0x0010 +#define PERCEIVEDFLAG_WMSDK 0x0020 +#define PERCEIVEDFLAG_ZIPFOLDER 0x0040 +typedef DWORD PERCEIVEDFLAG; + +#endif // _WIN32_IE_IE60SP2 + +#if (NTDDI_VERSION >= NTDDI_LONGHORN) +typedef struct _COMDLG_FILTERSPEC + { + LPCWSTR pszName; + LPCWSTR pszSpec; + } COMDLG_FILTERSPEC; + +typedef struct tagMACHINE_ID + { + char szName[ 16 ]; + } MACHINE_ID; + +typedef struct tagDOMAIN_RELATIVE_OBJECTID + { + GUID guidVolume; + GUID guidObject; + } DOMAIN_RELATIVE_OBJECTID; + +typedef GUID KNOWNFOLDERID; + +#if 0 +typedef KNOWNFOLDERID *REFKNOWNFOLDERID; + +#endif // 0 +#ifdef __cplusplus +#define REFKNOWNFOLDERID const KNOWNFOLDERID & +#else // !__cplusplus +#define REFKNOWNFOLDERID const KNOWNFOLDERID * __MIDL_CONST +#endif // __cplusplus +#endif // NTDDI_LONGHORN +typedef GUID FOLDERTYPEID; + +#if 0 +typedef FOLDERTYPEID *REFFOLDERTYPEID; + +#endif // 0 +#ifdef __cplusplus +#define REFFOLDERTYPEID const FOLDERTYPEID & +#else // !__cplusplus +#define REFFOLDERTYPEID const FOLDERTYPEID * __MIDL_CONST +#endif // __cplusplus +typedef GUID TASKOWNERID; + +#if 0 +typedef TASKOWNERID *REFTASKOWNERID; + +#endif // 0 +#ifdef __cplusplus +#define REFTASKOWNERID const TASKOWNERID & +#else // !__cplusplus +#define REFTASKOWNERID const TASKOWNERID * __MIDL_CONST +#endif // __cplusplus +#ifndef LF_FACESIZE +typedef struct tagLOGFONTA + { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + CHAR lfFaceName[ 32 ]; + } LOGFONTA; + +typedef struct tagLOGFONTW + { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + WCHAR lfFaceName[ 32 ]; + } LOGFONTW; + +typedef LOGFONTA LOGFONT; + +#endif // LF_FACESIZE +typedef /* [v1_enum] */ +enum tagSHCOLSTATE + { SHCOLSTATE_TYPE_STR = 0x1, + SHCOLSTATE_TYPE_INT = 0x2, + SHCOLSTATE_TYPE_DATE = 0x3, + SHCOLSTATE_TYPEMASK = 0xf, + SHCOLSTATE_ONBYDEFAULT = 0x10, + SHCOLSTATE_SLOW = 0x20, + SHCOLSTATE_EXTENDED = 0x40, + SHCOLSTATE_SECONDARYUI = 0x80, + SHCOLSTATE_HIDDEN = 0x100, + SHCOLSTATE_PREFER_VARCMP = 0x200, + SHCOLSTATE_PREFER_FMTCMP = 0x400, + SHCOLSTATE_NOSORTBYFOLDERNESS = 0x800, + SHCOLSTATE_VIEWONLY = 0x10000, + SHCOLSTATE_BATCHREAD = 0x20000, + SHCOLSTATE_NO_GROUPBY = 0x40000, + SHCOLSTATE_FIXED_WIDTH = 0x1000, + SHCOLSTATE_NODPISCALE = 0x2000, + SHCOLSTATE_FIXED_RATIO = 0x4000, + SHCOLSTATE_DISPLAYMASK = 0xf000 + } SHCOLSTATE; + +typedef DWORD SHCOLSTATEF; + +typedef PROPERTYKEY SHCOLUMNID; + +typedef const SHCOLUMNID *LPCSHCOLUMNID; + + + +extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_0000_v0_0_s_ifspec; + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/mingw-include/structuredquery.h b/Externals/portaudio/src/hostapi/wasapi/mingw-include/structuredquery.h new file mode 100644 index 0000000000..bca20a9ada --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/mingw-include/structuredquery.h @@ -0,0 +1,2478 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0499 */ +/* Compiler settings for structuredquery.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCSAL_H_VERSION__ +#define __REQUIRED_RPCSAL_H_VERSION__ 100 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __structuredquery_h__ +#define __structuredquery_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IQueryParser_FWD_DEFINED__ +#define __IQueryParser_FWD_DEFINED__ +typedef interface IQueryParser IQueryParser; +#endif /* __IQueryParser_FWD_DEFINED__ */ + + +#ifndef __IConditionFactory_FWD_DEFINED__ +#define __IConditionFactory_FWD_DEFINED__ +typedef interface IConditionFactory IConditionFactory; +#endif /* __IConditionFactory_FWD_DEFINED__ */ + + +#ifndef __IQuerySolution_FWD_DEFINED__ +#define __IQuerySolution_FWD_DEFINED__ +typedef interface IQuerySolution IQuerySolution; +#endif /* __IQuerySolution_FWD_DEFINED__ */ + + +#ifndef __ICondition_FWD_DEFINED__ +#define __ICondition_FWD_DEFINED__ +typedef interface ICondition ICondition; +#endif /* __ICondition_FWD_DEFINED__ */ + + +#ifndef __IConditionGenerator_FWD_DEFINED__ +#define __IConditionGenerator_FWD_DEFINED__ +typedef interface IConditionGenerator IConditionGenerator; +#endif /* __IConditionGenerator_FWD_DEFINED__ */ + + +#ifndef __IRichChunk_FWD_DEFINED__ +#define __IRichChunk_FWD_DEFINED__ +typedef interface IRichChunk IRichChunk; +#endif /* __IRichChunk_FWD_DEFINED__ */ + + +#ifndef __IInterval_FWD_DEFINED__ +#define __IInterval_FWD_DEFINED__ +typedef interface IInterval IInterval; +#endif /* __IInterval_FWD_DEFINED__ */ + + +#ifndef __IMetaData_FWD_DEFINED__ +#define __IMetaData_FWD_DEFINED__ +typedef interface IMetaData IMetaData; +#endif /* __IMetaData_FWD_DEFINED__ */ + + +#ifndef __IEntity_FWD_DEFINED__ +#define __IEntity_FWD_DEFINED__ +typedef interface IEntity IEntity; +#endif /* __IEntity_FWD_DEFINED__ */ + + +#ifndef __IRelationship_FWD_DEFINED__ +#define __IRelationship_FWD_DEFINED__ +typedef interface IRelationship IRelationship; +#endif /* __IRelationship_FWD_DEFINED__ */ + + +#ifndef __INamedEntity_FWD_DEFINED__ +#define __INamedEntity_FWD_DEFINED__ +typedef interface INamedEntity INamedEntity; +#endif /* __INamedEntity_FWD_DEFINED__ */ + + +#ifndef __ISchemaProvider_FWD_DEFINED__ +#define __ISchemaProvider_FWD_DEFINED__ +typedef interface ISchemaProvider ISchemaProvider; +#endif /* __ISchemaProvider_FWD_DEFINED__ */ + + +#ifndef __ITokenCollection_FWD_DEFINED__ +#define __ITokenCollection_FWD_DEFINED__ +typedef interface ITokenCollection ITokenCollection; +#endif /* __ITokenCollection_FWD_DEFINED__ */ + + +#ifndef __INamedEntityCollector_FWD_DEFINED__ +#define __INamedEntityCollector_FWD_DEFINED__ +typedef interface INamedEntityCollector INamedEntityCollector; +#endif /* __INamedEntityCollector_FWD_DEFINED__ */ + + +#ifndef __ISchemaLocalizerSupport_FWD_DEFINED__ +#define __ISchemaLocalizerSupport_FWD_DEFINED__ +typedef interface ISchemaLocalizerSupport ISchemaLocalizerSupport; +#endif /* __ISchemaLocalizerSupport_FWD_DEFINED__ */ + + +#ifndef __IQueryParserManager_FWD_DEFINED__ +#define __IQueryParserManager_FWD_DEFINED__ +typedef interface IQueryParserManager IQueryParserManager; +#endif /* __IQueryParserManager_FWD_DEFINED__ */ + + +#ifndef __QueryParser_FWD_DEFINED__ +#define __QueryParser_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class QueryParser QueryParser; +#else +typedef struct QueryParser QueryParser; +#endif /* __cplusplus */ + +#endif /* __QueryParser_FWD_DEFINED__ */ + + +#ifndef __NegationCondition_FWD_DEFINED__ +#define __NegationCondition_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class NegationCondition NegationCondition; +#else +typedef struct NegationCondition NegationCondition; +#endif /* __cplusplus */ + +#endif /* __NegationCondition_FWD_DEFINED__ */ + + +#ifndef __CompoundCondition_FWD_DEFINED__ +#define __CompoundCondition_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class CompoundCondition CompoundCondition; +#else +typedef struct CompoundCondition CompoundCondition; +#endif /* __cplusplus */ + +#endif /* __CompoundCondition_FWD_DEFINED__ */ + + +#ifndef __LeafCondition_FWD_DEFINED__ +#define __LeafCondition_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class LeafCondition LeafCondition; +#else +typedef struct LeafCondition LeafCondition; +#endif /* __cplusplus */ + +#endif /* __LeafCondition_FWD_DEFINED__ */ + + +#ifndef __ConditionFactory_FWD_DEFINED__ +#define __ConditionFactory_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class ConditionFactory ConditionFactory; +#else +typedef struct ConditionFactory ConditionFactory; +#endif /* __cplusplus */ + +#endif /* __ConditionFactory_FWD_DEFINED__ */ + + +#ifndef __Interval_FWD_DEFINED__ +#define __Interval_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Interval Interval; +#else +typedef struct Interval Interval; +#endif /* __cplusplus */ + +#endif /* __Interval_FWD_DEFINED__ */ + + +#ifndef __QueryParserManager_FWD_DEFINED__ +#define __QueryParserManager_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class QueryParserManager QueryParserManager; +#else +typedef struct QueryParserManager QueryParserManager; +#endif /* __cplusplus */ + +#endif /* __QueryParserManager_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" +#include "propidl.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_structuredquery_0000_0000 */ +/* [local] */ + + + + + + + + + + + +typedef /* [v1_enum] */ +enum tagCONDITION_TYPE + { CT_AND_CONDITION = 0, + CT_OR_CONDITION = ( CT_AND_CONDITION + 1 ) , + CT_NOT_CONDITION = ( CT_OR_CONDITION + 1 ) , + CT_LEAF_CONDITION = ( CT_NOT_CONDITION + 1 ) + } CONDITION_TYPE; + +typedef /* [v1_enum] */ +enum tagCONDITION_OPERATION + { COP_IMPLICIT = 0, + COP_EQUAL = ( COP_IMPLICIT + 1 ) , + COP_NOTEQUAL = ( COP_EQUAL + 1 ) , + COP_LESSTHAN = ( COP_NOTEQUAL + 1 ) , + COP_GREATERTHAN = ( COP_LESSTHAN + 1 ) , + COP_LESSTHANOREQUAL = ( COP_GREATERTHAN + 1 ) , + COP_GREATERTHANOREQUAL = ( COP_LESSTHANOREQUAL + 1 ) , + COP_VALUE_STARTSWITH = ( COP_GREATERTHANOREQUAL + 1 ) , + COP_VALUE_ENDSWITH = ( COP_VALUE_STARTSWITH + 1 ) , + COP_VALUE_CONTAINS = ( COP_VALUE_ENDSWITH + 1 ) , + COP_VALUE_NOTCONTAINS = ( COP_VALUE_CONTAINS + 1 ) , + COP_DOSWILDCARDS = ( COP_VALUE_NOTCONTAINS + 1 ) , + COP_WORD_EQUAL = ( COP_DOSWILDCARDS + 1 ) , + COP_WORD_STARTSWITH = ( COP_WORD_EQUAL + 1 ) , + COP_APPLICATION_SPECIFIC = ( COP_WORD_STARTSWITH + 1 ) + } CONDITION_OPERATION; + +typedef /* [v1_enum] */ +enum tagSTRUCTURED_QUERY_SINGLE_OPTION + { SQSO_SCHEMA = 0, + SQSO_LOCALE_WORD_BREAKING = ( SQSO_SCHEMA + 1 ) , + SQSO_WORD_BREAKER = ( SQSO_LOCALE_WORD_BREAKING + 1 ) , + SQSO_NATURAL_SYNTAX = ( SQSO_WORD_BREAKER + 1 ) , + SQSO_AUTOMATIC_WILDCARD = ( SQSO_NATURAL_SYNTAX + 1 ) , + SQSO_TRACE_LEVEL = ( SQSO_AUTOMATIC_WILDCARD + 1 ) , + SQSO_LANGUAGE_KEYWORDS = ( SQSO_TRACE_LEVEL + 1 ) + } STRUCTURED_QUERY_SINGLE_OPTION; + +typedef /* [v1_enum] */ +enum tagSTRUCTURED_QUERY_MULTIOPTION + { SQMO_VIRTUAL_PROPERTY = 0, + SQMO_DEFAULT_PROPERTY = ( SQMO_VIRTUAL_PROPERTY + 1 ) , + SQMO_GENERATOR_FOR_TYPE = ( SQMO_DEFAULT_PROPERTY + 1 ) + } STRUCTURED_QUERY_MULTIOPTION; + +typedef /* [v1_enum] */ +enum tagSTRUCTURED_QUERY_PARSE_ERROR + { SQPE_NONE = 0, + SQPE_EXTRA_OPENING_PARENTHESIS = ( SQPE_NONE + 1 ) , + SQPE_EXTRA_CLOSING_PARENTHESIS = ( SQPE_EXTRA_OPENING_PARENTHESIS + 1 ) , + SQPE_IGNORED_MODIFIER = ( SQPE_EXTRA_CLOSING_PARENTHESIS + 1 ) , + SQPE_IGNORED_CONNECTOR = ( SQPE_IGNORED_MODIFIER + 1 ) , + SQPE_IGNORED_KEYWORD = ( SQPE_IGNORED_CONNECTOR + 1 ) , + SQPE_UNHANDLED = ( SQPE_IGNORED_KEYWORD + 1 ) + } STRUCTURED_QUERY_PARSE_ERROR; + +/* [v1_enum] */ +enum tagSTRUCTURED_QUERY_RESOLVE_OPTION + { SQRO_DONT_RESOLVE_DATETIME = 0x1, + SQRO_ALWAYS_ONE_INTERVAL = 0x2, + SQRO_DONT_SIMPLIFY_CONDITION_TREES = 0x4, + SQRO_DONT_MAP_RELATIONS = 0x8, + SQRO_DONT_RESOLVE_RANGES = 0x10, + SQRO_DONT_REMOVE_UNRESTRICTED_KEYWORDS = 0x20, + SQRO_DONT_SPLIT_WORDS = 0x40, + SQRO_IGNORE_PHRASE_ORDER = 0x80 + } ; +typedef int STRUCTURED_QUERY_RESOLVE_OPTION; + +typedef /* [v1_enum] */ +enum tagINTERVAL_LIMIT_KIND + { ILK_EXPLICIT_INCLUDED = 0, + ILK_EXPLICIT_EXCLUDED = ( ILK_EXPLICIT_INCLUDED + 1 ) , + ILK_NEGATIVE_INFINITY = ( ILK_EXPLICIT_EXCLUDED + 1 ) , + ILK_POSITIVE_INFINITY = ( ILK_NEGATIVE_INFINITY + 1 ) + } INTERVAL_LIMIT_KIND; + +typedef /* [v1_enum] */ +enum tagQUERY_PARSER_MANAGER_OPTION + { QPMO_SCHEMA_BINARY_NAME = 0, + QPMO_PRELOCALIZED_SCHEMA_BINARY_PATH = ( QPMO_SCHEMA_BINARY_NAME + 1 ) , + QPMO_UNLOCALIZED_SCHEMA_BINARY_PATH = ( QPMO_PRELOCALIZED_SCHEMA_BINARY_PATH + 1 ) , + QPMO_LOCALIZED_SCHEMA_BINARY_PATH = ( QPMO_UNLOCALIZED_SCHEMA_BINARY_PATH + 1 ) , + QPMO_APPEND_LCID_TO_LOCALIZED_PATH = ( QPMO_LOCALIZED_SCHEMA_BINARY_PATH + 1 ) , + QPMO_LOCALIZER_SUPPORT = ( QPMO_APPEND_LCID_TO_LOCALIZED_PATH + 1 ) + } QUERY_PARSER_MANAGER_OPTION; + + + +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0000_v0_0_s_ifspec; + +#ifndef __IQueryParser_INTERFACE_DEFINED__ +#define __IQueryParser_INTERFACE_DEFINED__ + +/* interface IQueryParser */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IQueryParser; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2EBDEE67-3505-43f8-9946-EA44ABC8E5B0") + IQueryParser : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Parse( + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ __RPC__in_opt IEnumUnknown *pCustomProperties, + /* [retval][out] */ __RPC__deref_out_opt IQuerySolution **ppSolution) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetOption( + /* [in] */ STRUCTURED_QUERY_SINGLE_OPTION option, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetOption( + /* [in] */ STRUCTURED_QUERY_SINGLE_OPTION option, + /* [retval][out] */ __RPC__out PROPVARIANT *pOptionValue) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMultiOption( + /* [in] */ STRUCTURED_QUERY_MULTIOPTION option, + /* [in] */ __RPC__in LPCWSTR pszOptionKey, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSchemaProvider( + /* [retval][out] */ __RPC__deref_out_opt ISchemaProvider **ppSchemaProvider) = 0; + + virtual HRESULT STDMETHODCALLTYPE RestateToString( + /* [in] */ __RPC__in_opt ICondition *pCondition, + /* [in] */ BOOL fUseEnglish, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszQueryString) = 0; + + virtual HRESULT STDMETHODCALLTYPE ParsePropertyValue( + /* [in] */ __RPC__in LPCWSTR pszPropertyName, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [retval][out] */ __RPC__deref_out_opt IQuerySolution **ppSolution) = 0; + + virtual HRESULT STDMETHODCALLTYPE RestatePropertyValueToString( + /* [in] */ __RPC__in_opt ICondition *pCondition, + /* [in] */ BOOL fUseEnglish, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszPropertyName, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszQueryString) = 0; + + }; + +#else /* C style interface */ + + typedef struct IQueryParserVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IQueryParser * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IQueryParser * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IQueryParser * This); + + HRESULT ( STDMETHODCALLTYPE *Parse )( + IQueryParser * This, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ __RPC__in_opt IEnumUnknown *pCustomProperties, + /* [retval][out] */ __RPC__deref_out_opt IQuerySolution **ppSolution); + + HRESULT ( STDMETHODCALLTYPE *SetOption )( + IQueryParser * This, + /* [in] */ STRUCTURED_QUERY_SINGLE_OPTION option, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue); + + HRESULT ( STDMETHODCALLTYPE *GetOption )( + IQueryParser * This, + /* [in] */ STRUCTURED_QUERY_SINGLE_OPTION option, + /* [retval][out] */ __RPC__out PROPVARIANT *pOptionValue); + + HRESULT ( STDMETHODCALLTYPE *SetMultiOption )( + IQueryParser * This, + /* [in] */ STRUCTURED_QUERY_MULTIOPTION option, + /* [in] */ __RPC__in LPCWSTR pszOptionKey, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue); + + HRESULT ( STDMETHODCALLTYPE *GetSchemaProvider )( + IQueryParser * This, + /* [retval][out] */ __RPC__deref_out_opt ISchemaProvider **ppSchemaProvider); + + HRESULT ( STDMETHODCALLTYPE *RestateToString )( + IQueryParser * This, + /* [in] */ __RPC__in_opt ICondition *pCondition, + /* [in] */ BOOL fUseEnglish, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszQueryString); + + HRESULT ( STDMETHODCALLTYPE *ParsePropertyValue )( + IQueryParser * This, + /* [in] */ __RPC__in LPCWSTR pszPropertyName, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [retval][out] */ __RPC__deref_out_opt IQuerySolution **ppSolution); + + HRESULT ( STDMETHODCALLTYPE *RestatePropertyValueToString )( + IQueryParser * This, + /* [in] */ __RPC__in_opt ICondition *pCondition, + /* [in] */ BOOL fUseEnglish, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszPropertyName, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszQueryString); + + END_INTERFACE + } IQueryParserVtbl; + + interface IQueryParser + { + CONST_VTBL struct IQueryParserVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IQueryParser_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IQueryParser_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IQueryParser_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IQueryParser_Parse(This,pszInputString,pCustomProperties,ppSolution) \ + ( (This)->lpVtbl -> Parse(This,pszInputString,pCustomProperties,ppSolution) ) + +#define IQueryParser_SetOption(This,option,pOptionValue) \ + ( (This)->lpVtbl -> SetOption(This,option,pOptionValue) ) + +#define IQueryParser_GetOption(This,option,pOptionValue) \ + ( (This)->lpVtbl -> GetOption(This,option,pOptionValue) ) + +#define IQueryParser_SetMultiOption(This,option,pszOptionKey,pOptionValue) \ + ( (This)->lpVtbl -> SetMultiOption(This,option,pszOptionKey,pOptionValue) ) + +#define IQueryParser_GetSchemaProvider(This,ppSchemaProvider) \ + ( (This)->lpVtbl -> GetSchemaProvider(This,ppSchemaProvider) ) + +#define IQueryParser_RestateToString(This,pCondition,fUseEnglish,ppszQueryString) \ + ( (This)->lpVtbl -> RestateToString(This,pCondition,fUseEnglish,ppszQueryString) ) + +#define IQueryParser_ParsePropertyValue(This,pszPropertyName,pszInputString,ppSolution) \ + ( (This)->lpVtbl -> ParsePropertyValue(This,pszPropertyName,pszInputString,ppSolution) ) + +#define IQueryParser_RestatePropertyValueToString(This,pCondition,fUseEnglish,ppszPropertyName,ppszQueryString) \ + ( (This)->lpVtbl -> RestatePropertyValueToString(This,pCondition,fUseEnglish,ppszPropertyName,ppszQueryString) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IQueryParser_INTERFACE_DEFINED__ */ + + +#ifndef __IConditionFactory_INTERFACE_DEFINED__ +#define __IConditionFactory_INTERFACE_DEFINED__ + +/* interface IConditionFactory */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IConditionFactory; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A5EFE073-B16F-474f-9F3E-9F8B497A3E08") + IConditionFactory : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE MakeNot( + /* [in] */ __RPC__in_opt ICondition *pSubCondition, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery) = 0; + + virtual HRESULT STDMETHODCALLTYPE MakeAndOr( + /* [in] */ CONDITION_TYPE nodeType, + /* [in] */ __RPC__in_opt IEnumUnknown *pSubConditions, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery) = 0; + + virtual HRESULT STDMETHODCALLTYPE MakeLeaf( + /* [unique][in] */ __RPC__in_opt LPCWSTR pszPropertyName, + /* [in] */ CONDITION_OPERATION op, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValueType, + /* [in] */ __RPC__in const PROPVARIANT *pValue, + /* [in] */ __RPC__in_opt IRichChunk *pPropertyNameTerm, + /* [in] */ __RPC__in_opt IRichChunk *pOperationTerm, + /* [in] */ __RPC__in_opt IRichChunk *pValueTerm, + /* [in] */ BOOL expand, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Resolve( + /* [in] */ + __in ICondition *pConditionTree, + /* [in] */ + __in STRUCTURED_QUERY_RESOLVE_OPTION sqro, + /* [ref][in] */ + __in_opt const SYSTEMTIME *pstReferenceTime, + /* [retval][out] */ + __out ICondition **ppResolvedConditionTree) = 0; + + }; + +#else /* C style interface */ + + typedef struct IConditionFactoryVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IConditionFactory * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IConditionFactory * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IConditionFactory * This); + + HRESULT ( STDMETHODCALLTYPE *MakeNot )( + IConditionFactory * This, + /* [in] */ __RPC__in_opt ICondition *pSubCondition, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + HRESULT ( STDMETHODCALLTYPE *MakeAndOr )( + IConditionFactory * This, + /* [in] */ CONDITION_TYPE nodeType, + /* [in] */ __RPC__in_opt IEnumUnknown *pSubConditions, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + HRESULT ( STDMETHODCALLTYPE *MakeLeaf )( + IConditionFactory * This, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszPropertyName, + /* [in] */ CONDITION_OPERATION op, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValueType, + /* [in] */ __RPC__in const PROPVARIANT *pValue, + /* [in] */ __RPC__in_opt IRichChunk *pPropertyNameTerm, + /* [in] */ __RPC__in_opt IRichChunk *pOperationTerm, + /* [in] */ __RPC__in_opt IRichChunk *pValueTerm, + /* [in] */ BOOL expand, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Resolve )( + IConditionFactory * This, + /* [in] */ + __in ICondition *pConditionTree, + /* [in] */ + __in STRUCTURED_QUERY_RESOLVE_OPTION sqro, + /* [ref][in] */ + __in_opt const SYSTEMTIME *pstReferenceTime, + /* [retval][out] */ + __out ICondition **ppResolvedConditionTree); + + END_INTERFACE + } IConditionFactoryVtbl; + + interface IConditionFactory + { + CONST_VTBL struct IConditionFactoryVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IConditionFactory_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IConditionFactory_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IConditionFactory_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IConditionFactory_MakeNot(This,pSubCondition,simplify,ppResultQuery) \ + ( (This)->lpVtbl -> MakeNot(This,pSubCondition,simplify,ppResultQuery) ) + +#define IConditionFactory_MakeAndOr(This,nodeType,pSubConditions,simplify,ppResultQuery) \ + ( (This)->lpVtbl -> MakeAndOr(This,nodeType,pSubConditions,simplify,ppResultQuery) ) + +#define IConditionFactory_MakeLeaf(This,pszPropertyName,op,pszValueType,pValue,pPropertyNameTerm,pOperationTerm,pValueTerm,expand,ppResultQuery) \ + ( (This)->lpVtbl -> MakeLeaf(This,pszPropertyName,op,pszValueType,pValue,pPropertyNameTerm,pOperationTerm,pValueTerm,expand,ppResultQuery) ) + +#define IConditionFactory_Resolve(This,pConditionTree,sqro,pstReferenceTime,ppResolvedConditionTree) \ + ( (This)->lpVtbl -> Resolve(This,pConditionTree,sqro,pstReferenceTime,ppResolvedConditionTree) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IConditionFactory_INTERFACE_DEFINED__ */ + + +#ifndef __IQuerySolution_INTERFACE_DEFINED__ +#define __IQuerySolution_INTERFACE_DEFINED__ + +/* interface IQuerySolution */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IQuerySolution; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D6EBC66B-8921-4193-AFDD-A1789FB7FF57") + IQuerySolution : public IConditionFactory + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetQuery( + /* [out] */ + __out_opt ICondition **ppQueryNode, + /* [out] */ + __out_opt IEntity **ppMainType) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetErrors( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppParseErrors) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetLexicalData( + /* [out] */ + __deref_opt_out LPWSTR *ppszInputString, + /* [out] */ + __out_opt ITokenCollection **ppTokens, + /* [out] */ + __out_opt LCID *pLocale, + /* [out] */ + __out_opt IUnknown **ppWordBreaker) = 0; + + }; + +#else /* C style interface */ + + typedef struct IQuerySolutionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IQuerySolution * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IQuerySolution * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IQuerySolution * This); + + HRESULT ( STDMETHODCALLTYPE *MakeNot )( + IQuerySolution * This, + /* [in] */ __RPC__in_opt ICondition *pSubCondition, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + HRESULT ( STDMETHODCALLTYPE *MakeAndOr )( + IQuerySolution * This, + /* [in] */ CONDITION_TYPE nodeType, + /* [in] */ __RPC__in_opt IEnumUnknown *pSubConditions, + /* [in] */ BOOL simplify, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + HRESULT ( STDMETHODCALLTYPE *MakeLeaf )( + IQuerySolution * This, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszPropertyName, + /* [in] */ CONDITION_OPERATION op, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValueType, + /* [in] */ __RPC__in const PROPVARIANT *pValue, + /* [in] */ __RPC__in_opt IRichChunk *pPropertyNameTerm, + /* [in] */ __RPC__in_opt IRichChunk *pOperationTerm, + /* [in] */ __RPC__in_opt IRichChunk *pValueTerm, + /* [in] */ BOOL expand, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppResultQuery); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Resolve )( + IQuerySolution * This, + /* [in] */ + __in ICondition *pConditionTree, + /* [in] */ + __in STRUCTURED_QUERY_RESOLVE_OPTION sqro, + /* [ref][in] */ + __in_opt const SYSTEMTIME *pstReferenceTime, + /* [retval][out] */ + __out ICondition **ppResolvedConditionTree); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetQuery )( + IQuerySolution * This, + /* [out] */ + __out_opt ICondition **ppQueryNode, + /* [out] */ + __out_opt IEntity **ppMainType); + + HRESULT ( STDMETHODCALLTYPE *GetErrors )( + IQuerySolution * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppParseErrors); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetLexicalData )( + IQuerySolution * This, + /* [out] */ + __deref_opt_out LPWSTR *ppszInputString, + /* [out] */ + __out_opt ITokenCollection **ppTokens, + /* [out] */ + __out_opt LCID *pLocale, + /* [out] */ + __out_opt IUnknown **ppWordBreaker); + + END_INTERFACE + } IQuerySolutionVtbl; + + interface IQuerySolution + { + CONST_VTBL struct IQuerySolutionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IQuerySolution_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IQuerySolution_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IQuerySolution_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IQuerySolution_MakeNot(This,pSubCondition,simplify,ppResultQuery) \ + ( (This)->lpVtbl -> MakeNot(This,pSubCondition,simplify,ppResultQuery) ) + +#define IQuerySolution_MakeAndOr(This,nodeType,pSubConditions,simplify,ppResultQuery) \ + ( (This)->lpVtbl -> MakeAndOr(This,nodeType,pSubConditions,simplify,ppResultQuery) ) + +#define IQuerySolution_MakeLeaf(This,pszPropertyName,op,pszValueType,pValue,pPropertyNameTerm,pOperationTerm,pValueTerm,expand,ppResultQuery) \ + ( (This)->lpVtbl -> MakeLeaf(This,pszPropertyName,op,pszValueType,pValue,pPropertyNameTerm,pOperationTerm,pValueTerm,expand,ppResultQuery) ) + +#define IQuerySolution_Resolve(This,pConditionTree,sqro,pstReferenceTime,ppResolvedConditionTree) \ + ( (This)->lpVtbl -> Resolve(This,pConditionTree,sqro,pstReferenceTime,ppResolvedConditionTree) ) + + +#define IQuerySolution_GetQuery(This,ppQueryNode,ppMainType) \ + ( (This)->lpVtbl -> GetQuery(This,ppQueryNode,ppMainType) ) + +#define IQuerySolution_GetErrors(This,riid,ppParseErrors) \ + ( (This)->lpVtbl -> GetErrors(This,riid,ppParseErrors) ) + +#define IQuerySolution_GetLexicalData(This,ppszInputString,ppTokens,pLocale,ppWordBreaker) \ + ( (This)->lpVtbl -> GetLexicalData(This,ppszInputString,ppTokens,pLocale,ppWordBreaker) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IQuerySolution_INTERFACE_DEFINED__ */ + + +#ifndef __ICondition_INTERFACE_DEFINED__ +#define __ICondition_INTERFACE_DEFINED__ + +/* interface ICondition */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_ICondition; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0FC988D4-C935-4b97-A973-46282EA175C8") + ICondition : public IPersistStream + { + public: + virtual HRESULT STDMETHODCALLTYPE GetConditionType( + /* [retval][out] */ __RPC__out CONDITION_TYPE *pNodeType) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSubConditions( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppv) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetComparisonInfo( + /* [out] */ + __deref_opt_out LPWSTR *ppszPropertyName, + /* [out] */ + __out_opt CONDITION_OPERATION *pOperation, + /* [out] */ + __out_opt PROPVARIANT *pValue) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetValueType( + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszValueTypeName) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetValueNormalization( + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszNormalization) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetInputTerms( + /* [out] */ + __out_opt IRichChunk **ppPropertyTerm, + /* [out] */ + __out_opt IRichChunk **ppOperationTerm, + /* [out] */ + __out_opt IRichChunk **ppValueTerm) = 0; + + virtual HRESULT STDMETHODCALLTYPE Clone( + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppc) = 0; + + }; + +#else /* C style interface */ + + typedef struct IConditionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ICondition * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ICondition * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ICondition * This); + + HRESULT ( STDMETHODCALLTYPE *GetClassID )( + ICondition * This, + /* [out] */ __RPC__out CLSID *pClassID); + + HRESULT ( STDMETHODCALLTYPE *IsDirty )( + ICondition * This); + + HRESULT ( STDMETHODCALLTYPE *Load )( + ICondition * This, + /* [unique][in] */ __RPC__in_opt IStream *pStm); + + HRESULT ( STDMETHODCALLTYPE *Save )( + ICondition * This, + /* [unique][in] */ __RPC__in_opt IStream *pStm, + /* [in] */ BOOL fClearDirty); + + HRESULT ( STDMETHODCALLTYPE *GetSizeMax )( + ICondition * This, + /* [out] */ __RPC__out ULARGE_INTEGER *pcbSize); + + HRESULT ( STDMETHODCALLTYPE *GetConditionType )( + ICondition * This, + /* [retval][out] */ __RPC__out CONDITION_TYPE *pNodeType); + + HRESULT ( STDMETHODCALLTYPE *GetSubConditions )( + ICondition * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppv); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetComparisonInfo )( + ICondition * This, + /* [out] */ + __deref_opt_out LPWSTR *ppszPropertyName, + /* [out] */ + __out_opt CONDITION_OPERATION *pOperation, + /* [out] */ + __out_opt PROPVARIANT *pValue); + + HRESULT ( STDMETHODCALLTYPE *GetValueType )( + ICondition * This, + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszValueTypeName); + + HRESULT ( STDMETHODCALLTYPE *GetValueNormalization )( + ICondition * This, + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszNormalization); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetInputTerms )( + ICondition * This, + /* [out] */ + __out_opt IRichChunk **ppPropertyTerm, + /* [out] */ + __out_opt IRichChunk **ppOperationTerm, + /* [out] */ + __out_opt IRichChunk **ppValueTerm); + + HRESULT ( STDMETHODCALLTYPE *Clone )( + ICondition * This, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppc); + + END_INTERFACE + } IConditionVtbl; + + interface ICondition + { + CONST_VTBL struct IConditionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ICondition_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ICondition_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ICondition_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ICondition_GetClassID(This,pClassID) \ + ( (This)->lpVtbl -> GetClassID(This,pClassID) ) + + +#define ICondition_IsDirty(This) \ + ( (This)->lpVtbl -> IsDirty(This) ) + +#define ICondition_Load(This,pStm) \ + ( (This)->lpVtbl -> Load(This,pStm) ) + +#define ICondition_Save(This,pStm,fClearDirty) \ + ( (This)->lpVtbl -> Save(This,pStm,fClearDirty) ) + +#define ICondition_GetSizeMax(This,pcbSize) \ + ( (This)->lpVtbl -> GetSizeMax(This,pcbSize) ) + + +#define ICondition_GetConditionType(This,pNodeType) \ + ( (This)->lpVtbl -> GetConditionType(This,pNodeType) ) + +#define ICondition_GetSubConditions(This,riid,ppv) \ + ( (This)->lpVtbl -> GetSubConditions(This,riid,ppv) ) + +#define ICondition_GetComparisonInfo(This,ppszPropertyName,pOperation,pValue) \ + ( (This)->lpVtbl -> GetComparisonInfo(This,ppszPropertyName,pOperation,pValue) ) + +#define ICondition_GetValueType(This,ppszValueTypeName) \ + ( (This)->lpVtbl -> GetValueType(This,ppszValueTypeName) ) + +#define ICondition_GetValueNormalization(This,ppszNormalization) \ + ( (This)->lpVtbl -> GetValueNormalization(This,ppszNormalization) ) + +#define ICondition_GetInputTerms(This,ppPropertyTerm,ppOperationTerm,ppValueTerm) \ + ( (This)->lpVtbl -> GetInputTerms(This,ppPropertyTerm,ppOperationTerm,ppValueTerm) ) + +#define ICondition_Clone(This,ppc) \ + ( (This)->lpVtbl -> Clone(This,ppc) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ICondition_INTERFACE_DEFINED__ */ + + +#ifndef __IConditionGenerator_INTERFACE_DEFINED__ +#define __IConditionGenerator_INTERFACE_DEFINED__ + +/* interface IConditionGenerator */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IConditionGenerator; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("92D2CC58-4386-45a3-B98C-7E0CE64A4117") + IConditionGenerator : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Initialize( + /* [in] */ __RPC__in_opt ISchemaProvider *pSchemaProvider) = 0; + + virtual HRESULT STDMETHODCALLTYPE RecognizeNamedEntities( + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ LCID lcid, + /* [in] */ __RPC__in_opt ITokenCollection *pTokenCollection, + /* [out][in] */ __RPC__inout_opt INamedEntityCollector *pNamedEntities) = 0; + + virtual HRESULT STDMETHODCALLTYPE GenerateForLeaf( + /* [in] */ __RPC__in_opt IConditionFactory *pConditionFactory, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszPropertyName, + /* [in] */ CONDITION_OPERATION op, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValueType, + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValue2, + /* [in] */ __RPC__in_opt IRichChunk *pPropertyNameTerm, + /* [in] */ __RPC__in_opt IRichChunk *pOperationTerm, + /* [in] */ __RPC__in_opt IRichChunk *pValueTerm, + /* [in] */ BOOL automaticWildcard, + /* [out] */ __RPC__out BOOL *pNoStringQuery, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppQueryExpression) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE DefaultPhrase( + /* [unique][in] */ LPCWSTR pszValueType, + /* [in] */ const PROPVARIANT *ppropvar, + /* [in] */ BOOL fUseEnglish, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase) = 0; + + }; + +#else /* C style interface */ + + typedef struct IConditionGeneratorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IConditionGenerator * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IConditionGenerator * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IConditionGenerator * This); + + HRESULT ( STDMETHODCALLTYPE *Initialize )( + IConditionGenerator * This, + /* [in] */ __RPC__in_opt ISchemaProvider *pSchemaProvider); + + HRESULT ( STDMETHODCALLTYPE *RecognizeNamedEntities )( + IConditionGenerator * This, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ LCID lcid, + /* [in] */ __RPC__in_opt ITokenCollection *pTokenCollection, + /* [out][in] */ __RPC__inout_opt INamedEntityCollector *pNamedEntities); + + HRESULT ( STDMETHODCALLTYPE *GenerateForLeaf )( + IConditionGenerator * This, + /* [in] */ __RPC__in_opt IConditionFactory *pConditionFactory, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszPropertyName, + /* [in] */ CONDITION_OPERATION op, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValueType, + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [unique][in] */ __RPC__in_opt LPCWSTR pszValue2, + /* [in] */ __RPC__in_opt IRichChunk *pPropertyNameTerm, + /* [in] */ __RPC__in_opt IRichChunk *pOperationTerm, + /* [in] */ __RPC__in_opt IRichChunk *pValueTerm, + /* [in] */ BOOL automaticWildcard, + /* [out] */ __RPC__out BOOL *pNoStringQuery, + /* [retval][out] */ __RPC__deref_out_opt ICondition **ppQueryExpression); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *DefaultPhrase )( + IConditionGenerator * This, + /* [unique][in] */ LPCWSTR pszValueType, + /* [in] */ const PROPVARIANT *ppropvar, + /* [in] */ BOOL fUseEnglish, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase); + + END_INTERFACE + } IConditionGeneratorVtbl; + + interface IConditionGenerator + { + CONST_VTBL struct IConditionGeneratorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IConditionGenerator_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IConditionGenerator_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IConditionGenerator_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IConditionGenerator_Initialize(This,pSchemaProvider) \ + ( (This)->lpVtbl -> Initialize(This,pSchemaProvider) ) + +#define IConditionGenerator_RecognizeNamedEntities(This,pszInputString,lcid,pTokenCollection,pNamedEntities) \ + ( (This)->lpVtbl -> RecognizeNamedEntities(This,pszInputString,lcid,pTokenCollection,pNamedEntities) ) + +#define IConditionGenerator_GenerateForLeaf(This,pConditionFactory,pszPropertyName,op,pszValueType,pszValue,pszValue2,pPropertyNameTerm,pOperationTerm,pValueTerm,automaticWildcard,pNoStringQuery,ppQueryExpression) \ + ( (This)->lpVtbl -> GenerateForLeaf(This,pConditionFactory,pszPropertyName,op,pszValueType,pszValue,pszValue2,pPropertyNameTerm,pOperationTerm,pValueTerm,automaticWildcard,pNoStringQuery,ppQueryExpression) ) + +#define IConditionGenerator_DefaultPhrase(This,pszValueType,ppropvar,fUseEnglish,ppszPhrase) \ + ( (This)->lpVtbl -> DefaultPhrase(This,pszValueType,ppropvar,fUseEnglish,ppszPhrase) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IConditionGenerator_INTERFACE_DEFINED__ */ + + +#ifndef __IRichChunk_INTERFACE_DEFINED__ +#define __IRichChunk_INTERFACE_DEFINED__ + +/* interface IRichChunk */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IRichChunk; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4FDEF69C-DBC9-454e-9910-B34F3C64B510") + IRichChunk : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( + /* [out] */ + __out_opt ULONG *pFirstPos, + /* [out] */ + __out_opt ULONG *pLength, + /* [out] */ + __deref_opt_out LPWSTR *ppsz, + /* [out] */ + __out_opt PROPVARIANT *pValue) = 0; + + }; + +#else /* C style interface */ + + typedef struct IRichChunkVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IRichChunk * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IRichChunk * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IRichChunk * This); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetData )( + IRichChunk * This, + /* [out] */ + __out_opt ULONG *pFirstPos, + /* [out] */ + __out_opt ULONG *pLength, + /* [out] */ + __deref_opt_out LPWSTR *ppsz, + /* [out] */ + __out_opt PROPVARIANT *pValue); + + END_INTERFACE + } IRichChunkVtbl; + + interface IRichChunk + { + CONST_VTBL struct IRichChunkVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IRichChunk_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IRichChunk_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IRichChunk_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IRichChunk_GetData(This,pFirstPos,pLength,ppsz,pValue) \ + ( (This)->lpVtbl -> GetData(This,pFirstPos,pLength,ppsz,pValue) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IRichChunk_INTERFACE_DEFINED__ */ + + +#ifndef __IInterval_INTERFACE_DEFINED__ +#define __IInterval_INTERFACE_DEFINED__ + +/* interface IInterval */ +/* [unique][uuid][object] */ + + +EXTERN_C const IID IID_IInterval; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("6BF0A714-3C18-430b-8B5D-83B1C234D3DB") + IInterval : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetLimits( + /* [out] */ __RPC__out INTERVAL_LIMIT_KIND *pilkLower, + /* [out] */ __RPC__out PROPVARIANT *ppropvarLower, + /* [out] */ __RPC__out INTERVAL_LIMIT_KIND *pilkUpper, + /* [out] */ __RPC__out PROPVARIANT *ppropvarUpper) = 0; + + }; + +#else /* C style interface */ + + typedef struct IIntervalVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IInterval * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IInterval * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IInterval * This); + + HRESULT ( STDMETHODCALLTYPE *GetLimits )( + IInterval * This, + /* [out] */ __RPC__out INTERVAL_LIMIT_KIND *pilkLower, + /* [out] */ __RPC__out PROPVARIANT *ppropvarLower, + /* [out] */ __RPC__out INTERVAL_LIMIT_KIND *pilkUpper, + /* [out] */ __RPC__out PROPVARIANT *ppropvarUpper); + + END_INTERFACE + } IIntervalVtbl; + + interface IInterval + { + CONST_VTBL struct IIntervalVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInterval_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IInterval_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IInterval_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IInterval_GetLimits(This,pilkLower,ppropvarLower,pilkUpper,ppropvarUpper) \ + ( (This)->lpVtbl -> GetLimits(This,pilkLower,ppropvarLower,pilkUpper,ppropvarUpper) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IInterval_INTERFACE_DEFINED__ */ + + +#ifndef __IMetaData_INTERFACE_DEFINED__ +#define __IMetaData_INTERFACE_DEFINED__ + +/* interface IMetaData */ +/* [unique][uuid][object][helpstring] */ + + +EXTERN_C const IID IID_IMetaData; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("780102B0-C43B-4876-BC7B-5E9BA5C88794") + IMetaData : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( + /* [out] */ + __deref_opt_out LPWSTR *ppszKey, + /* [out] */ + __deref_opt_out LPWSTR *ppszValue) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMetaDataVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IMetaData * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IMetaData * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IMetaData * This); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetData )( + IMetaData * This, + /* [out] */ + __deref_opt_out LPWSTR *ppszKey, + /* [out] */ + __deref_opt_out LPWSTR *ppszValue); + + END_INTERFACE + } IMetaDataVtbl; + + interface IMetaData + { + CONST_VTBL struct IMetaDataVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMetaData_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IMetaData_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IMetaData_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IMetaData_GetData(This,ppszKey,ppszValue) \ + ( (This)->lpVtbl -> GetData(This,ppszKey,ppszValue) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IMetaData_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_structuredquery_0000_0008 */ +/* [local] */ + + + + +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0008_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0008_v0_0_s_ifspec; + +#ifndef __IEntity_INTERFACE_DEFINED__ +#define __IEntity_INTERFACE_DEFINED__ + +/* interface IEntity */ +/* [unique][object][uuid][helpstring] */ + + +EXTERN_C const IID IID_IEntity; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("24264891-E80B-4fd3-B7CE-4FF2FAE8931F") + IEntity : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Name( + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszName) = 0; + + virtual HRESULT STDMETHODCALLTYPE Base( + /* [retval][out] */ __RPC__deref_out_opt IEntity **pBaseEntity) = 0; + + virtual HRESULT STDMETHODCALLTYPE Relationships( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pRelationships) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetRelationship( + /* [in] */ __RPC__in LPCWSTR pszRelationName, + /* [retval][out] */ __RPC__deref_out_opt IRelationship **pRelationship) = 0; + + virtual HRESULT STDMETHODCALLTYPE MetaData( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData) = 0; + + virtual HRESULT STDMETHODCALLTYPE NamedEntities( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pNamedEntities) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetNamedEntity( + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [retval][out] */ __RPC__deref_out_opt INamedEntity **ppNamedEntity) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE DefaultPhrase( + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase) = 0; + + }; + +#else /* C style interface */ + + typedef struct IEntityVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IEntity * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IEntity * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IEntity * This); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Name )( + IEntity * This, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *Base )( + IEntity * This, + /* [retval][out] */ __RPC__deref_out_opt IEntity **pBaseEntity); + + HRESULT ( STDMETHODCALLTYPE *Relationships )( + IEntity * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pRelationships); + + HRESULT ( STDMETHODCALLTYPE *GetRelationship )( + IEntity * This, + /* [in] */ __RPC__in LPCWSTR pszRelationName, + /* [retval][out] */ __RPC__deref_out_opt IRelationship **pRelationship); + + HRESULT ( STDMETHODCALLTYPE *MetaData )( + IEntity * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData); + + HRESULT ( STDMETHODCALLTYPE *NamedEntities )( + IEntity * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pNamedEntities); + + HRESULT ( STDMETHODCALLTYPE *GetNamedEntity )( + IEntity * This, + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [retval][out] */ __RPC__deref_out_opt INamedEntity **ppNamedEntity); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *DefaultPhrase )( + IEntity * This, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase); + + END_INTERFACE + } IEntityVtbl; + + interface IEntity + { + CONST_VTBL struct IEntityVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IEntity_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IEntity_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IEntity_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IEntity_Name(This,ppszName) \ + ( (This)->lpVtbl -> Name(This,ppszName) ) + +#define IEntity_Base(This,pBaseEntity) \ + ( (This)->lpVtbl -> Base(This,pBaseEntity) ) + +#define IEntity_Relationships(This,riid,pRelationships) \ + ( (This)->lpVtbl -> Relationships(This,riid,pRelationships) ) + +#define IEntity_GetRelationship(This,pszRelationName,pRelationship) \ + ( (This)->lpVtbl -> GetRelationship(This,pszRelationName,pRelationship) ) + +#define IEntity_MetaData(This,riid,pMetaData) \ + ( (This)->lpVtbl -> MetaData(This,riid,pMetaData) ) + +#define IEntity_NamedEntities(This,riid,pNamedEntities) \ + ( (This)->lpVtbl -> NamedEntities(This,riid,pNamedEntities) ) + +#define IEntity_GetNamedEntity(This,pszValue,ppNamedEntity) \ + ( (This)->lpVtbl -> GetNamedEntity(This,pszValue,ppNamedEntity) ) + +#define IEntity_DefaultPhrase(This,ppszPhrase) \ + ( (This)->lpVtbl -> DefaultPhrase(This,ppszPhrase) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IEntity_INTERFACE_DEFINED__ */ + + +#ifndef __IRelationship_INTERFACE_DEFINED__ +#define __IRelationship_INTERFACE_DEFINED__ + +/* interface IRelationship */ +/* [unique][object][uuid][helpstring] */ + + +EXTERN_C const IID IID_IRelationship; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2769280B-5108-498c-9C7F-A51239B63147") + IRelationship : public IUnknown + { + public: + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Name( + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszName) = 0; + + virtual HRESULT STDMETHODCALLTYPE IsReal( + /* [retval][out] */ __RPC__out BOOL *pIsReal) = 0; + + virtual HRESULT STDMETHODCALLTYPE Destination( + /* [retval][out] */ __RPC__deref_out_opt IEntity **pDestinationEntity) = 0; + + virtual HRESULT STDMETHODCALLTYPE MetaData( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE DefaultPhrase( + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase) = 0; + + }; + +#else /* C style interface */ + + typedef struct IRelationshipVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IRelationship * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IRelationship * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IRelationship * This); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *Name )( + IRelationship * This, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszName); + + HRESULT ( STDMETHODCALLTYPE *IsReal )( + IRelationship * This, + /* [retval][out] */ __RPC__out BOOL *pIsReal); + + HRESULT ( STDMETHODCALLTYPE *Destination )( + IRelationship * This, + /* [retval][out] */ __RPC__deref_out_opt IEntity **pDestinationEntity); + + HRESULT ( STDMETHODCALLTYPE *MetaData )( + IRelationship * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *DefaultPhrase )( + IRelationship * This, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase); + + END_INTERFACE + } IRelationshipVtbl; + + interface IRelationship + { + CONST_VTBL struct IRelationshipVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IRelationship_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IRelationship_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IRelationship_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IRelationship_Name(This,ppszName) \ + ( (This)->lpVtbl -> Name(This,ppszName) ) + +#define IRelationship_IsReal(This,pIsReal) \ + ( (This)->lpVtbl -> IsReal(This,pIsReal) ) + +#define IRelationship_Destination(This,pDestinationEntity) \ + ( (This)->lpVtbl -> Destination(This,pDestinationEntity) ) + +#define IRelationship_MetaData(This,riid,pMetaData) \ + ( (This)->lpVtbl -> MetaData(This,riid,pMetaData) ) + +#define IRelationship_DefaultPhrase(This,ppszPhrase) \ + ( (This)->lpVtbl -> DefaultPhrase(This,ppszPhrase) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IRelationship_INTERFACE_DEFINED__ */ + + +#ifndef __INamedEntity_INTERFACE_DEFINED__ +#define __INamedEntity_INTERFACE_DEFINED__ + +/* interface INamedEntity */ +/* [unique][uuid][object][helpstring] */ + + +EXTERN_C const IID IID_INamedEntity; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("ABDBD0B1-7D54-49fb-AB5C-BFF4130004CD") + INamedEntity : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetValue( + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszValue) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE DefaultPhrase( + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase) = 0; + + }; + +#else /* C style interface */ + + typedef struct INamedEntityVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + INamedEntity * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + INamedEntity * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + INamedEntity * This); + + HRESULT ( STDMETHODCALLTYPE *GetValue )( + INamedEntity * This, + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszValue); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *DefaultPhrase )( + INamedEntity * This, + /* [retval][out] */ + __deref_opt_out LPWSTR *ppszPhrase); + + END_INTERFACE + } INamedEntityVtbl; + + interface INamedEntity + { + CONST_VTBL struct INamedEntityVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define INamedEntity_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define INamedEntity_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define INamedEntity_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define INamedEntity_GetValue(This,ppszValue) \ + ( (This)->lpVtbl -> GetValue(This,ppszValue) ) + +#define INamedEntity_DefaultPhrase(This,ppszPhrase) \ + ( (This)->lpVtbl -> DefaultPhrase(This,ppszPhrase) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __INamedEntity_INTERFACE_DEFINED__ */ + + +#ifndef __ISchemaProvider_INTERFACE_DEFINED__ +#define __ISchemaProvider_INTERFACE_DEFINED__ + +/* interface ISchemaProvider */ +/* [unique][object][uuid][helpstring] */ + + +EXTERN_C const IID IID_ISchemaProvider; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("8CF89BCB-394C-49b2-AE28-A59DD4ED7F68") + ISchemaProvider : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Entities( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pEntities) = 0; + + virtual HRESULT STDMETHODCALLTYPE RootEntity( + /* [retval][out] */ __RPC__deref_out_opt IEntity **pRootEntity) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetEntity( + /* [in] */ __RPC__in LPCWSTR pszEntityName, + /* [retval][out] */ __RPC__deref_out_opt IEntity **pEntity) = 0; + + virtual HRESULT STDMETHODCALLTYPE MetaData( + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData) = 0; + + virtual HRESULT STDMETHODCALLTYPE Localize( + /* [in] */ LCID lcid, + /* [in] */ __RPC__in_opt ISchemaLocalizerSupport *pSchemaLocalizerSupport) = 0; + + virtual HRESULT STDMETHODCALLTYPE SaveBinary( + /* [in] */ __RPC__in LPCWSTR pszSchemaBinaryPath) = 0; + + virtual HRESULT STDMETHODCALLTYPE LookupAuthoredNamedEntity( + /* [in] */ __RPC__in_opt IEntity *pEntity, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ __RPC__in_opt ITokenCollection *pTokenCollection, + /* [in] */ ULONG cTokensBegin, + /* [out] */ __RPC__out ULONG *pcTokensLength, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszValue) = 0; + + }; + +#else /* C style interface */ + + typedef struct ISchemaProviderVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ISchemaProvider * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ISchemaProvider * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ISchemaProvider * This); + + HRESULT ( STDMETHODCALLTYPE *Entities )( + ISchemaProvider * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pEntities); + + HRESULT ( STDMETHODCALLTYPE *RootEntity )( + ISchemaProvider * This, + /* [retval][out] */ __RPC__deref_out_opt IEntity **pRootEntity); + + HRESULT ( STDMETHODCALLTYPE *GetEntity )( + ISchemaProvider * This, + /* [in] */ __RPC__in LPCWSTR pszEntityName, + /* [retval][out] */ __RPC__deref_out_opt IEntity **pEntity); + + HRESULT ( STDMETHODCALLTYPE *MetaData )( + ISchemaProvider * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **pMetaData); + + HRESULT ( STDMETHODCALLTYPE *Localize )( + ISchemaProvider * This, + /* [in] */ LCID lcid, + /* [in] */ __RPC__in_opt ISchemaLocalizerSupport *pSchemaLocalizerSupport); + + HRESULT ( STDMETHODCALLTYPE *SaveBinary )( + ISchemaProvider * This, + /* [in] */ __RPC__in LPCWSTR pszSchemaBinaryPath); + + HRESULT ( STDMETHODCALLTYPE *LookupAuthoredNamedEntity )( + ISchemaProvider * This, + /* [in] */ __RPC__in_opt IEntity *pEntity, + /* [in] */ __RPC__in LPCWSTR pszInputString, + /* [in] */ __RPC__in_opt ITokenCollection *pTokenCollection, + /* [in] */ ULONG cTokensBegin, + /* [out] */ __RPC__out ULONG *pcTokensLength, + /* [out] */ __RPC__deref_out_opt LPWSTR *ppszValue); + + END_INTERFACE + } ISchemaProviderVtbl; + + interface ISchemaProvider + { + CONST_VTBL struct ISchemaProviderVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ISchemaProvider_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ISchemaProvider_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ISchemaProvider_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ISchemaProvider_Entities(This,riid,pEntities) \ + ( (This)->lpVtbl -> Entities(This,riid,pEntities) ) + +#define ISchemaProvider_RootEntity(This,pRootEntity) \ + ( (This)->lpVtbl -> RootEntity(This,pRootEntity) ) + +#define ISchemaProvider_GetEntity(This,pszEntityName,pEntity) \ + ( (This)->lpVtbl -> GetEntity(This,pszEntityName,pEntity) ) + +#define ISchemaProvider_MetaData(This,riid,pMetaData) \ + ( (This)->lpVtbl -> MetaData(This,riid,pMetaData) ) + +#define ISchemaProvider_Localize(This,lcid,pSchemaLocalizerSupport) \ + ( (This)->lpVtbl -> Localize(This,lcid,pSchemaLocalizerSupport) ) + +#define ISchemaProvider_SaveBinary(This,pszSchemaBinaryPath) \ + ( (This)->lpVtbl -> SaveBinary(This,pszSchemaBinaryPath) ) + +#define ISchemaProvider_LookupAuthoredNamedEntity(This,pEntity,pszInputString,pTokenCollection,cTokensBegin,pcTokensLength,ppszValue) \ + ( (This)->lpVtbl -> LookupAuthoredNamedEntity(This,pEntity,pszInputString,pTokenCollection,cTokensBegin,pcTokensLength,ppszValue) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ISchemaProvider_INTERFACE_DEFINED__ */ + + +#ifndef __ITokenCollection_INTERFACE_DEFINED__ +#define __ITokenCollection_INTERFACE_DEFINED__ + +/* interface ITokenCollection */ +/* [unique][object][uuid][helpstring] */ + + +EXTERN_C const IID IID_ITokenCollection; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("22D8B4F2-F577-4adb-A335-C2AE88416FAB") + ITokenCollection : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE NumberOfTokens( + __RPC__in ULONG *pCount) = 0; + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetToken( + /* [in] */ ULONG i, + /* [out] */ + __out_opt ULONG *pBegin, + /* [out] */ + __out_opt ULONG *pLength, + /* [out] */ + __deref_opt_out LPWSTR *ppsz) = 0; + + }; + +#else /* C style interface */ + + typedef struct ITokenCollectionVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ITokenCollection * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ITokenCollection * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ITokenCollection * This); + + HRESULT ( STDMETHODCALLTYPE *NumberOfTokens )( + ITokenCollection * This, + __RPC__in ULONG *pCount); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetToken )( + ITokenCollection * This, + /* [in] */ ULONG i, + /* [out] */ + __out_opt ULONG *pBegin, + /* [out] */ + __out_opt ULONG *pLength, + /* [out] */ + __deref_opt_out LPWSTR *ppsz); + + END_INTERFACE + } ITokenCollectionVtbl; + + interface ITokenCollection + { + CONST_VTBL struct ITokenCollectionVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ITokenCollection_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ITokenCollection_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ITokenCollection_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ITokenCollection_NumberOfTokens(This,pCount) \ + ( (This)->lpVtbl -> NumberOfTokens(This,pCount) ) + +#define ITokenCollection_GetToken(This,i,pBegin,pLength,ppsz) \ + ( (This)->lpVtbl -> GetToken(This,i,pBegin,pLength,ppsz) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ITokenCollection_INTERFACE_DEFINED__ */ + + +/* interface __MIDL_itf_structuredquery_0000_0013 */ +/* [local] */ + +typedef /* [public][public][v1_enum] */ +enum __MIDL___MIDL_itf_structuredquery_0000_0013_0001 + { NEC_LOW = 0, + NEC_MEDIUM = ( NEC_LOW + 1 ) , + NEC_HIGH = ( NEC_MEDIUM + 1 ) + } NAMED_ENTITY_CERTAINTY; + + + +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0013_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_structuredquery_0000_0013_v0_0_s_ifspec; + +#ifndef __INamedEntityCollector_INTERFACE_DEFINED__ +#define __INamedEntityCollector_INTERFACE_DEFINED__ + +/* interface INamedEntityCollector */ +/* [unique][object][uuid][helpstring] */ + + +EXTERN_C const IID IID_INamedEntityCollector; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("AF2440F6-8AFC-47d0-9A7F-396A0ACFB43D") + INamedEntityCollector : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Add( + /* [in] */ ULONG beginSpan, + /* [in] */ ULONG endSpan, + /* [in] */ ULONG beginActual, + /* [in] */ ULONG endActual, + /* [in] */ __RPC__in_opt IEntity *pType, + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [in] */ NAMED_ENTITY_CERTAINTY certainty) = 0; + + }; + +#else /* C style interface */ + + typedef struct INamedEntityCollectorVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + INamedEntityCollector * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + INamedEntityCollector * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + INamedEntityCollector * This); + + HRESULT ( STDMETHODCALLTYPE *Add )( + INamedEntityCollector * This, + /* [in] */ ULONG beginSpan, + /* [in] */ ULONG endSpan, + /* [in] */ ULONG beginActual, + /* [in] */ ULONG endActual, + /* [in] */ __RPC__in_opt IEntity *pType, + /* [in] */ __RPC__in LPCWSTR pszValue, + /* [in] */ NAMED_ENTITY_CERTAINTY certainty); + + END_INTERFACE + } INamedEntityCollectorVtbl; + + interface INamedEntityCollector + { + CONST_VTBL struct INamedEntityCollectorVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define INamedEntityCollector_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define INamedEntityCollector_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define INamedEntityCollector_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define INamedEntityCollector_Add(This,beginSpan,endSpan,beginActual,endActual,pType,pszValue,certainty) \ + ( (This)->lpVtbl -> Add(This,beginSpan,endSpan,beginActual,endActual,pType,pszValue,certainty) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __INamedEntityCollector_INTERFACE_DEFINED__ */ + + +#ifndef __ISchemaLocalizerSupport_INTERFACE_DEFINED__ +#define __ISchemaLocalizerSupport_INTERFACE_DEFINED__ + +/* interface ISchemaLocalizerSupport */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_ISchemaLocalizerSupport; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("CA3FDCA2-BFBE-4eed-90D7-0CAEF0A1BDA1") + ISchemaLocalizerSupport : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Localize( + /* [in] */ __RPC__in LPCWSTR pszGlobalString, + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszLocalString) = 0; + + }; + +#else /* C style interface */ + + typedef struct ISchemaLocalizerSupportVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ISchemaLocalizerSupport * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ISchemaLocalizerSupport * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ISchemaLocalizerSupport * This); + + HRESULT ( STDMETHODCALLTYPE *Localize )( + ISchemaLocalizerSupport * This, + /* [in] */ __RPC__in LPCWSTR pszGlobalString, + /* [retval][out] */ __RPC__deref_out_opt LPWSTR *ppszLocalString); + + END_INTERFACE + } ISchemaLocalizerSupportVtbl; + + interface ISchemaLocalizerSupport + { + CONST_VTBL struct ISchemaLocalizerSupportVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ISchemaLocalizerSupport_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ISchemaLocalizerSupport_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ISchemaLocalizerSupport_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ISchemaLocalizerSupport_Localize(This,pszGlobalString,ppszLocalString) \ + ( (This)->lpVtbl -> Localize(This,pszGlobalString,ppszLocalString) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ISchemaLocalizerSupport_INTERFACE_DEFINED__ */ + + +#ifndef __IQueryParserManager_INTERFACE_DEFINED__ +#define __IQueryParserManager_INTERFACE_DEFINED__ + +/* interface IQueryParserManager */ +/* [unique][object][uuid] */ + + +EXTERN_C const IID IID_IQueryParserManager; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A879E3C4-AF77-44fb-8F37-EBD1487CF920") + IQueryParserManager : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE CreateLoadedParser( + /* [in] */ __RPC__in LPCWSTR pszCatalog, + /* [in] */ LANGID langidForKeywords, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppQueryParser) = 0; + + virtual HRESULT STDMETHODCALLTYPE InitializeOptions( + /* [in] */ BOOL fUnderstandNQS, + /* [in] */ BOOL fAutoWildCard, + /* [in] */ __RPC__in_opt IQueryParser *pQueryParser) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetOption( + /* [in] */ QUERY_PARSER_MANAGER_OPTION option, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue) = 0; + + }; + +#else /* C style interface */ + + typedef struct IQueryParserManagerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IQueryParserManager * This, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IQueryParserManager * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IQueryParserManager * This); + + HRESULT ( STDMETHODCALLTYPE *CreateLoadedParser )( + IQueryParserManager * This, + /* [in] */ __RPC__in LPCWSTR pszCatalog, + /* [in] */ LANGID langidForKeywords, + /* [in] */ __RPC__in REFIID riid, + /* [iid_is][retval][out] */ __RPC__deref_out_opt void **ppQueryParser); + + HRESULT ( STDMETHODCALLTYPE *InitializeOptions )( + IQueryParserManager * This, + /* [in] */ BOOL fUnderstandNQS, + /* [in] */ BOOL fAutoWildCard, + /* [in] */ __RPC__in_opt IQueryParser *pQueryParser); + + HRESULT ( STDMETHODCALLTYPE *SetOption )( + IQueryParserManager * This, + /* [in] */ QUERY_PARSER_MANAGER_OPTION option, + /* [in] */ __RPC__in const PROPVARIANT *pOptionValue); + + END_INTERFACE + } IQueryParserManagerVtbl; + + interface IQueryParserManager + { + CONST_VTBL struct IQueryParserManagerVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IQueryParserManager_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IQueryParserManager_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IQueryParserManager_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IQueryParserManager_CreateLoadedParser(This,pszCatalog,langidForKeywords,riid,ppQueryParser) \ + ( (This)->lpVtbl -> CreateLoadedParser(This,pszCatalog,langidForKeywords,riid,ppQueryParser) ) + +#define IQueryParserManager_InitializeOptions(This,fUnderstandNQS,fAutoWildCard,pQueryParser) \ + ( (This)->lpVtbl -> InitializeOptions(This,fUnderstandNQS,fAutoWildCard,pQueryParser) ) + +#define IQueryParserManager_SetOption(This,option,pOptionValue) \ + ( (This)->lpVtbl -> SetOption(This,option,pOptionValue) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IQueryParserManager_INTERFACE_DEFINED__ */ + + + +#ifndef __StructuredQuery1_LIBRARY_DEFINED__ +#define __StructuredQuery1_LIBRARY_DEFINED__ + +/* library StructuredQuery1 */ +/* [version][uuid] */ + + +EXTERN_C const IID LIBID_StructuredQuery1; + +EXTERN_C const CLSID CLSID_QueryParser; + +#ifdef __cplusplus + +class DECLSPEC_UUID("B72F8FD8-0FAB-4dd9-BDBF-245A6CE1485B") +QueryParser; +#endif + +EXTERN_C const CLSID CLSID_NegationCondition; + +#ifdef __cplusplus + +class DECLSPEC_UUID("8DE9C74C-605A-4acd-BEE3-2B222AA2D23D") +NegationCondition; +#endif + +EXTERN_C const CLSID CLSID_CompoundCondition; + +#ifdef __cplusplus + +class DECLSPEC_UUID("116F8D13-101E-4fa5-84D4-FF8279381935") +CompoundCondition; +#endif + +EXTERN_C const CLSID CLSID_LeafCondition; + +#ifdef __cplusplus + +class DECLSPEC_UUID("52F15C89-5A17-48e1-BBCD-46A3F89C7CC2") +LeafCondition; +#endif + +EXTERN_C const CLSID CLSID_ConditionFactory; + +#ifdef __cplusplus + +class DECLSPEC_UUID("E03E85B0-7BE3-4000-BA98-6C13DE9FA486") +ConditionFactory; +#endif + +EXTERN_C const CLSID CLSID_Interval; + +#ifdef __cplusplus + +class DECLSPEC_UUID("D957171F-4BF9-4de2-BCD5-C70A7CA55836") +Interval; +#endif + +EXTERN_C const CLSID CLSID_QueryParserManager; + +#ifdef __cplusplus + +class DECLSPEC_UUID("5088B39A-29B4-4d9d-8245-4EE289222F66") +QueryParserManager; +#endif +#endif /* __StructuredQuery1_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); +unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); +unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); +void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); + +unsigned long __RPC_USER LPSAFEARRAY_UserSize( unsigned long *, unsigned long , LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal( unsigned long *, unsigned char *, LPSAFEARRAY * ); +unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); +void __RPC_USER LPSAFEARRAY_UserFree( unsigned long *, LPSAFEARRAY * ); + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Externals/portaudio/src/hostapi/wasapi/pa_win_wasapi.c b/Externals/portaudio/src/hostapi/wasapi/pa_win_wasapi.c new file mode 100644 index 0000000000..0172e47144 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/pa_win_wasapi.c @@ -0,0 +1,5156 @@ +/* + * Portable Audio I/O Library WASAPI implementation + * Copyright (c) 2006-2010 David Viens, Dmitry Kostjuchenko + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup hostapi_src + @brief WASAPI implementation of support for a host API. + @note pa_wasapi currently requires minimum VC 2005, and the latest Vista SDK +*/ + +#define WIN32_LEAN_AND_MEAN // exclude rare headers +#include +#include +#include +#include +#include +#include // must be before other Wasapi headers +#if defined(_MSC_VER) && (_MSC_VER >= 1400) + #include + #define COBJMACROS + #include + #include + #define INITGUID // Avoid additional linkage of static libs, excessive code will be optimized out by the compiler + #include + #include + #include // Used to get IKsJackDescription interface + #undef INITGUID +#endif +#ifndef __MWERKS__ +#include +#include +#endif /* __MWERKS__ */ + +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_win_wasapi.h" +#include "pa_debugprint.h" +#include "pa_ringbuffer.h" + +#include "pa_win_coinitialize.h" + +#ifndef NTDDI_VERSION + + #undef WINVER + #undef _WIN32_WINNT + #define WINVER 0x0600 // VISTA + #define _WIN32_WINNT WINVER + + #ifndef _AVRT_ //<< fix MinGW dummy compile by defining missing type: AVRT_PRIORITY + typedef enum _AVRT_PRIORITY + { + AVRT_PRIORITY_LOW = -1, + AVRT_PRIORITY_NORMAL, + AVRT_PRIORITY_HIGH, + AVRT_PRIORITY_CRITICAL + } AVRT_PRIORITY, *PAVRT_PRIORITY; + #endif + + #include // << for IID/CLSID + #include + #include + + #ifndef __LPCGUID_DEFINED__ + #define __LPCGUID_DEFINED__ + typedef const GUID *LPCGUID; + #endif + + #ifndef PROPERTYKEY_DEFINED + #define PROPERTYKEY_DEFINED + typedef struct _tagpropertykey + { + GUID fmtid; + DWORD pid; + } PROPERTYKEY; + #endif + + #ifdef __midl_proxy + #define __MIDL_CONST + #else + #define __MIDL_CONST const + #endif + + #ifdef WIN64 + #include + typedef LONG NTSTATUS; + #define FASTCALL + #include + #include + #else + typedef struct _BYTE_BLOB + { + unsigned long clSize; + unsigned char abData[ 1 ]; + } BYTE_BLOB; + typedef /* [unique] */ __RPC_unique_pointer BYTE_BLOB *UP_BYTE_BLOB; + typedef LONGLONG REFERENCE_TIME; + #define NONAMELESSUNION + #endif + + #ifndef WAVE_FORMAT_IEEE_FLOAT + #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // 32-bit floating-point + #endif + + #ifndef __MINGW_EXTENSION + #if defined(__GNUC__) || defined(__GNUG__) + #define __MINGW_EXTENSION __extension__ + #else + #define __MINGW_EXTENSION + #endif + #endif + + #include + #include + #define COBJMACROS + #define INITGUID // Avoid additional linkage of static libs, excessive code will be optimized out by the compiler + #include + #include + #include + #include + #include // Used to get IKsJackDescription interface + #undef INITGUID + +#endif // NTDDI_VERSION + +#ifndef GUID_SECT + #define GUID_SECT +#endif + +#define __DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) static const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#define __DEFINE_IID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) static const IID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#define __DEFINE_CLSID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) static const CLSID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#define PA_DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + __DEFINE_CLSID(pa_CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define PA_DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + __DEFINE_IID(pa_IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) + +// "1CB9AD4C-DBFA-4c32-B178-C2F568A703B2" +PA_DEFINE_IID(IAudioClient, 1cb9ad4c, dbfa, 4c32, b1, 78, c2, f5, 68, a7, 03, b2); +// "1BE09788-6894-4089-8586-9A2A6C265AC5" +PA_DEFINE_IID(IMMEndpoint, 1be09788, 6894, 4089, 85, 86, 9a, 2a, 6c, 26, 5a, c5); +// "A95664D2-9614-4F35-A746-DE8DB63617E6" +PA_DEFINE_IID(IMMDeviceEnumerator, a95664d2, 9614, 4f35, a7, 46, de, 8d, b6, 36, 17, e6); +// "BCDE0395-E52F-467C-8E3D-C4579291692E" +PA_DEFINE_CLSID(IMMDeviceEnumerator,bcde0395, e52f, 467c, 8e, 3d, c4, 57, 92, 91, 69, 2e); +// "F294ACFC-3146-4483-A7BF-ADDCA7C260E2" +PA_DEFINE_IID(IAudioRenderClient, f294acfc, 3146, 4483, a7, bf, ad, dc, a7, c2, 60, e2); +// "C8ADBD64-E71E-48a0-A4DE-185C395CD317" +PA_DEFINE_IID(IAudioCaptureClient, c8adbd64, e71e, 48a0, a4, de, 18, 5c, 39, 5c, d3, 17); +// *2A07407E-6497-4A18-9787-32F79BD0D98F* Or this?? +PA_DEFINE_IID(IDeviceTopology, 2A07407E, 6497, 4A18, 97, 87, 32, f7, 9b, d0, d9, 8f); +// *AE2DE0E4-5BCA-4F2D-AA46-5D13F8FDB3A9* +PA_DEFINE_IID(IPart, AE2DE0E4, 5BCA, 4F2D, aa, 46, 5d, 13, f8, fd, b3, a9); +// *4509F757-2D46-4637-8E62-CE7DB944F57B* +PA_DEFINE_IID(IKsJackDescription, 4509F757, 2D46, 4637, 8e, 62, ce, 7d, b9, 44, f5, 7b); +// Media formats: +__DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); +__DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_ADPCM, 0x00000002, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); +__DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); + +/* use CreateThread for CYGWIN/Windows Mobile, _beginthreadex for all others */ +#if !defined(__CYGWIN__) && !defined(_WIN32_WCE) + #define CREATE_THREAD(PROC) (HANDLE)_beginthreadex( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) + #define PA_THREAD_FUNC static unsigned WINAPI + #define PA_THREAD_ID unsigned +#else + #define CREATE_THREAD(PROC) CreateThread( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) + #define PA_THREAD_FUNC static DWORD WINAPI + #define PA_THREAD_ID DWORD +#endif + +// Thread function forward decl. +PA_THREAD_FUNC ProcThreadEvent(void *param); +PA_THREAD_FUNC ProcThreadPoll(void *param); + +// Availabe from Windows 7 +#ifndef AUDCLNT_E_BUFFER_ERROR + #define AUDCLNT_E_BUFFER_ERROR AUDCLNT_ERR(0x018) +#endif +#ifndef AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED + #define AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED AUDCLNT_ERR(0x019) +#endif +#ifndef AUDCLNT_E_INVALID_DEVICE_PERIOD + #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) +#endif + +#define MAX_STR_LEN 512 + +enum { S_INPUT = 0, S_OUTPUT = 1, S_COUNT = 2, S_FULLDUPLEX = 0 }; + +// Number of packets which compose single contignous buffer. With trial and error it was calculated +// that WASAPI Input sub-system uses 6 packets per whole buffer. Please provide more information +// or corrections if available. +enum { WASAPI_PACKETS_PER_INPUT_BUFFER = 6 }; + +#define STATIC_ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0])) + +#define PRINT(x) PA_DEBUG(x); + +#define PA_SKELETON_SET_LAST_HOST_ERROR( errorCode, errorText ) \ + PaUtil_SetLastHostErrorInfo( paWASAPI, errorCode, errorText ) + +#define PA_WASAPI__IS_FULLDUPLEX(STREAM) ((STREAM)->in.clientProc && (STREAM)->out.clientProc) + +#ifndef IF_FAILED_JUMP +#define IF_FAILED_JUMP(hr, label) if(FAILED(hr)) goto label; +#endif + +#ifndef IF_FAILED_INTERNAL_ERROR_JUMP +#define IF_FAILED_INTERNAL_ERROR_JUMP(hr, error, label) if(FAILED(hr)) { error = paInternalError; goto label; } +#endif + +#define SAFE_CLOSE(h) if ((h) != NULL) { CloseHandle((h)); (h) = NULL; } +#define SAFE_RELEASE(punk) if ((punk) != NULL) { (punk)->lpVtbl->Release((punk)); (punk) = NULL; } + +// Mixer function +typedef void (*MixMonoToStereoF) (void *__to, void *__from, UINT32 count); + +// AVRT is the new "multimedia schedulling stuff" +typedef BOOL (WINAPI *FAvRtCreateThreadOrderingGroup) (PHANDLE,PLARGE_INTEGER,GUID*,PLARGE_INTEGER); +typedef BOOL (WINAPI *FAvRtDeleteThreadOrderingGroup) (HANDLE); +typedef BOOL (WINAPI *FAvRtWaitOnThreadOrderingGroup) (HANDLE); +typedef HANDLE (WINAPI *FAvSetMmThreadCharacteristics) (LPCTSTR,LPDWORD); +typedef BOOL (WINAPI *FAvRevertMmThreadCharacteristics)(HANDLE); +typedef BOOL (WINAPI *FAvSetMmThreadPriority) (HANDLE,AVRT_PRIORITY); + +static HMODULE hDInputDLL = 0; +FAvRtCreateThreadOrderingGroup pAvRtCreateThreadOrderingGroup = NULL; +FAvRtDeleteThreadOrderingGroup pAvRtDeleteThreadOrderingGroup = NULL; +FAvRtWaitOnThreadOrderingGroup pAvRtWaitOnThreadOrderingGroup = NULL; +FAvSetMmThreadCharacteristics pAvSetMmThreadCharacteristics = NULL; +FAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; +FAvSetMmThreadPriority pAvSetMmThreadPriority = NULL; + +#define _GetProc(fun, type, name) { \ + fun = (type) GetProcAddress(hDInputDLL,name); \ + if (fun == NULL) { \ + PRINT(("GetProcAddr failed for %s" ,name)); \ + return FALSE; \ + } \ + } \ + +// ------------------------------------------------------------------------------------------ +/* prototypes for functions declared in this file */ +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ +PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +// dummy entry point for other compilers and sdks +// currently built using RC1 SDK (5600) +//#if _MSC_VER < 1400 +//PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +//{ + //return paNoError; +//} +//#else + +// ------------------------------------------------------------------------------------------ +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + +// ------------------------------------------------------------------------------------------ +/* + These are fields that can be gathered from IDevice and IAudioDevice PRIOR to Initialize, and + done in first pass i assume that neither of these will cause the Driver to "load", but again, + who knows how they implement their stuff + */ +typedef struct PaWasapiDeviceInfo +{ + // Device + IMMDevice *device; + + // from GetId + WCHAR szDeviceID[MAX_STR_LEN]; + + // from GetState + DWORD state; + + // Fields filled from IMMEndpoint'sGetDataFlow + EDataFlow flow; + + // Fields filled from IAudioDevice (_prior_ to Initialize) + // from GetDevicePeriod( + REFERENCE_TIME DefaultDevicePeriod; + REFERENCE_TIME MinimumDevicePeriod; + + // from GetMixFormat + // WAVEFORMATEX *MixFormat;//needs to be CoTaskMemFree'd after use! + + // Default format (setup through Control Panel by user) + WAVEFORMATEXTENSIBLE DefaultFormat; + + // Formfactor + EndpointFormFactor formFactor; +} +PaWasapiDeviceInfo; + +// ------------------------------------------------------------------------------------------ +/* PaWasapiHostApiRepresentation - host api datastructure specific to this implementation */ +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + /* implementation specific data goes here */ + + PaWinUtilComInitializationResult comInitializationResult; + + //in case we later need the synch + IMMDeviceEnumerator *enumerator; + + //this is the REAL number of devices, whether they are usefull to PA or not! + UINT32 deviceCount; + + WCHAR defaultRenderer [MAX_STR_LEN]; + WCHAR defaultCapturer [MAX_STR_LEN]; + + PaWasapiDeviceInfo *devInfo; + + // Is true when WOW64 Vista/7 Workaround is needed + BOOL useWOW64Workaround; +} +PaWasapiHostApiRepresentation; + +// ------------------------------------------------------------------------------------------ +/* PaWasapiAudioClientParams - audio client parameters */ +typedef struct PaWasapiAudioClientParams +{ + PaWasapiDeviceInfo *device_info; + PaStreamParameters stream_params; + PaWasapiStreamInfo wasapi_params; + UINT32 frames_per_buffer; + double sample_rate; + BOOL blocking; + BOOL full_duplex; + BOOL wow64_workaround; +} +PaWasapiAudioClientParams; + +// ------------------------------------------------------------------------------------------ +/* PaWasapiStream - a stream data structure specifically for this implementation */ +typedef struct PaWasapiSubStream +{ + IAudioClient *clientParent; + IStream *clientStream; + IAudioClient *clientProc; + + WAVEFORMATEXTENSIBLE wavex; + UINT32 bufferSize; + REFERENCE_TIME deviceLatency; + REFERENCE_TIME period; + double latencySeconds; + UINT32 framesPerHostCallback; + AUDCLNT_SHAREMODE shareMode; + UINT32 streamFlags; // AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ... + UINT32 flags; + PaWasapiAudioClientParams params; //!< parameters + + // Buffers + UINT32 buffers; //!< number of buffers used (from host side) + UINT32 framesPerBuffer; //!< number of frames per 1 buffer + BOOL userBufferAndHostMatch; + + // Used for Mono >> Stereo workaround, if driver does not support it + // (in Exclusive mode WASAPI usually refuses to operate with Mono (1-ch) + void *monoBuffer; //!< pointer to buffer + UINT32 monoBufferSize; //!< buffer size in bytes + MixMonoToStereoF monoMixer; //!< pointer to mixer function + + PaUtilRingBuffer *tailBuffer; //!< buffer with trailing sample for blocking mode operations (only for Input) + void *tailBufferMemory; //!< tail buffer memory region +} +PaWasapiSubStream; + +// ------------------------------------------------------------------------------------------ +/* PaWasapiHostProcessor - redirects processing data */ +typedef struct PaWasapiHostProcessor +{ + PaWasapiHostProcessorCallback processor; + void *userData; +} +PaWasapiHostProcessor; + +// ------------------------------------------------------------------------------------------ +typedef struct PaWasapiStream +{ + /* IMPLEMENT ME: rename this */ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + // input + PaWasapiSubStream in; + IAudioCaptureClient *captureClientParent; + IStream *captureClientStream; + IAudioCaptureClient *captureClient; + IAudioEndpointVolume *inVol; + + // output + PaWasapiSubStream out; + IAudioRenderClient *renderClientParent; + IStream *renderClientStream; + IAudioRenderClient *renderClient; + IAudioEndpointVolume *outVol; + + // event handles for event-driven processing mode + HANDLE event[S_COUNT]; + + // buffer mode + PaUtilHostBufferSizeMode bufferMode; + + // must be volatile to avoid race condition on user query while + // thread is being started + volatile BOOL running; + + PA_THREAD_ID dwThreadId; + HANDLE hThread; + HANDLE hCloseRequest; + HANDLE hThreadStart; //!< signalled by thread on start + HANDLE hThreadExit; //!< signalled by thread on exit + HANDLE hBlockingOpStreamRD; + HANDLE hBlockingOpStreamWR; + + // Host callback Output overrider + PaWasapiHostProcessor hostProcessOverrideOutput; + + // Host callback Input overrider + PaWasapiHostProcessor hostProcessOverrideInput; + + // Defines blocking/callback interface used + BOOL bBlocking; + + // Av Task (MM thread management) + HANDLE hAvTask; + + // Thread priority level + PaWasapiThreadPriority nThreadPriority; +} +PaWasapiStream; + +// Local stream methods +void _StreamOnStop(PaWasapiStream *stream); +void _StreamFinish(PaWasapiStream *stream); +void _StreamCleanup(PaWasapiStream *stream); +HRESULT _PollGetOutputFramesAvailable(PaWasapiStream *stream, UINT32 *available); +HRESULT _PollGetInputFramesAvailable(PaWasapiStream *stream, UINT32 *available); +void *PaWasapi_ReallocateMemory(void *ptr, size_t size); +void PaWasapi_FreeMemory(void *ptr); + +// Local statics + +// ------------------------------------------------------------------------------------------ +#define LogHostError(HRES) __LogHostError(HRES, __FUNCTION__, __FILE__, __LINE__) +static HRESULT __LogHostError(HRESULT res, const char *func, const char *file, int line) +{ + const char *text = NULL; + switch (res) + { + case S_OK: return res; + case E_POINTER :text ="E_POINTER"; break; + case E_INVALIDARG :text ="E_INVALIDARG"; break; + + case AUDCLNT_E_NOT_INITIALIZED :text ="AUDCLNT_E_NOT_INITIALIZED"; break; + case AUDCLNT_E_ALREADY_INITIALIZED :text ="AUDCLNT_E_ALREADY_INITIALIZED"; break; + case AUDCLNT_E_WRONG_ENDPOINT_TYPE :text ="AUDCLNT_E_WRONG_ENDPOINT_TYPE"; break; + case AUDCLNT_E_DEVICE_INVALIDATED :text ="AUDCLNT_E_DEVICE_INVALIDATED"; break; + case AUDCLNT_E_NOT_STOPPED :text ="AUDCLNT_E_NOT_STOPPED"; break; + case AUDCLNT_E_BUFFER_TOO_LARGE :text ="AUDCLNT_E_BUFFER_TOO_LARGE"; break; + case AUDCLNT_E_OUT_OF_ORDER :text ="AUDCLNT_E_OUT_OF_ORDER"; break; + case AUDCLNT_E_UNSUPPORTED_FORMAT :text ="AUDCLNT_E_UNSUPPORTED_FORMAT"; break; + case AUDCLNT_E_INVALID_SIZE :text ="AUDCLNT_E_INVALID_SIZE"; break; + case AUDCLNT_E_DEVICE_IN_USE :text ="AUDCLNT_E_DEVICE_IN_USE"; break; + case AUDCLNT_E_BUFFER_OPERATION_PENDING :text ="AUDCLNT_E_BUFFER_OPERATION_PENDING"; break; + case AUDCLNT_E_THREAD_NOT_REGISTERED :text ="AUDCLNT_E_THREAD_NOT_REGISTERED"; break; + case AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED :text ="AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED"; break; + case AUDCLNT_E_ENDPOINT_CREATE_FAILED :text ="AUDCLNT_E_ENDPOINT_CREATE_FAILED"; break; + case AUDCLNT_E_SERVICE_NOT_RUNNING :text ="AUDCLNT_E_SERVICE_NOT_RUNNING"; break; + case AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED :text ="AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED"; break; + case AUDCLNT_E_EXCLUSIVE_MODE_ONLY :text ="AUDCLNT_E_EXCLUSIVE_MODE_ONLY"; break; + case AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL :text ="AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL"; break; + case AUDCLNT_E_EVENTHANDLE_NOT_SET :text ="AUDCLNT_E_EVENTHANDLE_NOT_SET"; break; + case AUDCLNT_E_INCORRECT_BUFFER_SIZE :text ="AUDCLNT_E_INCORRECT_BUFFER_SIZE"; break; + case AUDCLNT_E_BUFFER_SIZE_ERROR :text ="AUDCLNT_E_BUFFER_SIZE_ERROR"; break; + case AUDCLNT_E_CPUUSAGE_EXCEEDED :text ="AUDCLNT_E_CPUUSAGE_EXCEEDED"; break; + case AUDCLNT_E_BUFFER_ERROR :text ="AUDCLNT_E_BUFFER_ERROR"; break; + case AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED :text ="AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED"; break; + case AUDCLNT_E_INVALID_DEVICE_PERIOD :text ="AUDCLNT_E_INVALID_DEVICE_PERIOD"; break; + + case AUDCLNT_S_BUFFER_EMPTY :text ="AUDCLNT_S_BUFFER_EMPTY"; break; + case AUDCLNT_S_THREAD_ALREADY_REGISTERED :text ="AUDCLNT_S_THREAD_ALREADY_REGISTERED"; break; + case AUDCLNT_S_POSITION_STALLED :text ="AUDCLNT_S_POSITION_STALLED"; break; + + // other windows common errors: + case CO_E_NOTINITIALIZED :text ="CO_E_NOTINITIALIZED: you must call CoInitialize() before Pa_OpenStream()"; break; + + default: + text = "UNKNOWN ERROR"; + } + PRINT(("WASAPI ERROR HRESULT: 0x%X : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", res, text, func, file, line)); + PA_SKELETON_SET_LAST_HOST_ERROR(res, text); + return res; +} + +// ------------------------------------------------------------------------------------------ +#define LogPaError(PAERR) __LogPaError(PAERR, __FUNCTION__, __FILE__, __LINE__) +static PaError __LogPaError(PaError err, const char *func, const char *file, int line) +{ + if (err == paNoError) + return err; + PRINT(("WASAPI ERROR PAERROR: %i : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", err, Pa_GetErrorText(err), func, file, line)); + return err; +} + +// ------------------------------------------------------------------------------------------ +/*! \class ThreadSleepScheduler + Allows to emulate thread sleep of less than 1 millisecond under Windows. Scheduler + calculates number of times the thread must run untill next sleep of 1 millisecond. + It does not make thread sleeping for real number of microseconds but rather controls + how many of imaginary microseconds the thread task can allow thread to sleep. +*/ +typedef struct ThreadIdleScheduler +{ + UINT32 m_idle_microseconds; //!< number of microseconds to sleep + UINT32 m_next_sleep; //!< next sleep round + UINT32 m_i; //!< current round iterator position + UINT32 m_resolution; //!< resolution in number of milliseconds +} +ThreadIdleScheduler; +//! Setup scheduler. +static void ThreadIdleScheduler_Setup(ThreadIdleScheduler *sched, UINT32 resolution, UINT32 microseconds) +{ + assert(microseconds != 0); + assert(resolution != 0); + assert((resolution * 1000) >= microseconds); + + memset(sched, 0, sizeof(*sched)); + + sched->m_idle_microseconds = microseconds; + sched->m_resolution = resolution; + sched->m_next_sleep = (resolution * 1000) / microseconds; +} +//! Iterate and check if can sleep. +static UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) +{ + // advance and check if thread can sleep + if (++ sched->m_i == sched->m_next_sleep) + { + sched->m_i = 0; + return sched->m_resolution; + } + return 0; +} + +// ------------------------------------------------------------------------------------------ +/*static double nano100ToMillis(REFERENCE_TIME ref) +{ + // 1 nano = 0.000000001 seconds + //100 nano = 0.0000001 seconds + //100 nano = 0.0001 milliseconds + return ((double)ref)*0.0001; +}*/ + +// ------------------------------------------------------------------------------------------ +static double nano100ToSeconds(REFERENCE_TIME ref) +{ + // 1 nano = 0.000000001 seconds + //100 nano = 0.0000001 seconds + //100 nano = 0.0001 milliseconds + return ((double)ref)*0.0000001; +} + +// ------------------------------------------------------------------------------------------ +/*static REFERENCE_TIME MillisTonano100(double ref) +{ + // 1 nano = 0.000000001 seconds + //100 nano = 0.0000001 seconds + //100 nano = 0.0001 milliseconds + return (REFERENCE_TIME)(ref/0.0001); +}*/ + +// ------------------------------------------------------------------------------------------ +static REFERENCE_TIME SecondsTonano100(double ref) +{ + // 1 nano = 0.000000001 seconds + //100 nano = 0.0000001 seconds + //100 nano = 0.0001 milliseconds + return (REFERENCE_TIME)(ref/0.0000001); +} + +// ------------------------------------------------------------------------------------------ +// Makes Hns period from frames and sample rate +static REFERENCE_TIME MakeHnsPeriod(UINT32 nFrames, DWORD nSamplesPerSec) +{ + return (REFERENCE_TIME)((10000.0 * 1000 / nSamplesPerSec * nFrames) + 0.5); +} + +// ------------------------------------------------------------------------------------------ +// Converts PaSampleFormat to bits per sample value +static WORD PaSampleFormatToBitsPerSample(PaSampleFormat format_id) +{ + switch (format_id & ~paNonInterleaved) + { + case paFloat32: + case paInt32: return 32; + case paInt24: return 24; + case paInt16: return 16; + case paInt8: + case paUInt8: return 8; + } + return 0; +} + +// ------------------------------------------------------------------------------------------ +// Converts PaSampleFormat to bits per sample value +/*static WORD PaSampleFormatToBytesPerSample(PaSampleFormat format_id) +{ + return PaSampleFormatToBitsPerSample(format_id) >> 3; // 'bits/8' +}*/ + +// ------------------------------------------------------------------------------------------ +// Converts Hns period into number of frames +static UINT32 MakeFramesFromHns(REFERENCE_TIME hnsPeriod, UINT32 nSamplesPerSec) +{ + UINT32 nFrames = (UINT32)( // frames = + 1.0 * hnsPeriod * // hns * + nSamplesPerSec / // (frames / s) / + 1000 / // (ms / s) / + 10000 // (hns / s) / + + 0.5 // rounding + ); + return nFrames; +} + +// Aligning function type +typedef UINT32 (*ALIGN_FUNC) (UINT32 v, UINT32 align); + +// ------------------------------------------------------------------------------------------ +// Aligns 'v' backwards +static UINT32 ALIGN_BWD(UINT32 v, UINT32 align) +{ + return ((v - (align ? v % align : 0))); +} + +// ------------------------------------------------------------------------------------------ +// Aligns 'v' forward +static UINT32 ALIGN_FWD(UINT32 v, UINT32 align) +{ + UINT32 remainder = (align ? (v % align) : 0); + if (remainder == 0) + return v; + return v + (align - remainder); +} + +// ------------------------------------------------------------------------------------------ +// Get next value power of 2 +UINT32 ALIGN_NEXT_POW2(UINT32 v) +{ + UINT32 v2 = 1; + while (v > (v2 <<= 1)) { } + v = v2; + return v; +} + +// ------------------------------------------------------------------------------------------ +// Aligns WASAPI buffer to 128 byte packet boundary. HD Audio will fail to play if buffer +// is misaligned. This problem was solved in Windows 7 were AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED +// is thrown although we must align for Vista anyway. +static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nSamplesPerSec, UINT32 nBlockAlign, + ALIGN_FUNC pAlignFunc) +{ +#define HDA_PACKET_SIZE (128) + + long frame_bytes = nFrames * nBlockAlign; + long packets; + + // align to packet size + frame_bytes = pAlignFunc(frame_bytes, HDA_PACKET_SIZE); // use ALIGN_FWD if bigger but safer period is more desired + + // atlest 1 frame must be available + if (frame_bytes < HDA_PACKET_SIZE) + frame_bytes = HDA_PACKET_SIZE; + + nFrames = frame_bytes / nBlockAlign; + packets = frame_bytes / HDA_PACKET_SIZE; + + frame_bytes = packets * HDA_PACKET_SIZE; + nFrames = frame_bytes / nBlockAlign; + + return nFrames; + +#undef HDA_PACKET_SIZE +} + +// ------------------------------------------------------------------------------------------ +static UINT32 GetFramesSleepTime(UINT32 nFrames, UINT32 nSamplesPerSec) +{ + REFERENCE_TIME nDuration; + if (nSamplesPerSec == 0) + return 0; +#define REFTIMES_PER_SEC 10000000 +#define REFTIMES_PER_MILLISEC 10000 + // Calculate the actual duration of the allocated buffer. + nDuration = (REFERENCE_TIME)((double)REFTIMES_PER_SEC * nFrames / nSamplesPerSec); + return (UINT32)(nDuration/REFTIMES_PER_MILLISEC/2); +} + +// ------------------------------------------------------------------------------------------ +static UINT32 GetFramesSleepTimeMicroseconds(UINT32 nFrames, UINT32 nSamplesPerSec) +{ + REFERENCE_TIME nDuration; + if (nSamplesPerSec == 0) + return 0; +#define REFTIMES_PER_SEC 10000000 +#define REFTIMES_PER_MILLISEC 10000 + // Calculate the actual duration of the allocated buffer. + nDuration = (REFERENCE_TIME)((double)REFTIMES_PER_SEC * nFrames / nSamplesPerSec); + return (UINT32)(nDuration/10/2); +} + +// ------------------------------------------------------------------------------------------ +static BOOL SetupAVRT() +{ + hDInputDLL = LoadLibraryA("avrt.dll"); + if (hDInputDLL == NULL) + return FALSE; + + _GetProc(pAvRtCreateThreadOrderingGroup, FAvRtCreateThreadOrderingGroup, "AvRtCreateThreadOrderingGroup"); + _GetProc(pAvRtDeleteThreadOrderingGroup, FAvRtDeleteThreadOrderingGroup, "AvRtDeleteThreadOrderingGroup"); + _GetProc(pAvRtWaitOnThreadOrderingGroup, FAvRtWaitOnThreadOrderingGroup, "AvRtWaitOnThreadOrderingGroup"); + _GetProc(pAvSetMmThreadCharacteristics, FAvSetMmThreadCharacteristics, "AvSetMmThreadCharacteristicsA"); + _GetProc(pAvRevertMmThreadCharacteristics,FAvRevertMmThreadCharacteristics,"AvRevertMmThreadCharacteristics"); + _GetProc(pAvSetMmThreadPriority, FAvSetMmThreadPriority, "AvSetMmThreadPriority"); + + return pAvRtCreateThreadOrderingGroup && + pAvRtDeleteThreadOrderingGroup && + pAvRtWaitOnThreadOrderingGroup && + pAvSetMmThreadCharacteristics && + pAvRevertMmThreadCharacteristics && + pAvSetMmThreadPriority; +} + +// ------------------------------------------------------------------------------------------ +static void CloseAVRT() +{ + if (hDInputDLL != NULL) + FreeLibrary(hDInputDLL); + hDInputDLL = NULL; +} + +// ------------------------------------------------------------------------------------------ +static BOOL IsWow64() +{ + // http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx + + typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + LPFN_ISWOW64PROCESS fnIsWow64Process; + + BOOL bIsWow64 = FALSE; + + // IsWow64Process is not available on all supported versions of Windows. + // Use GetModuleHandle to get a handle to the DLL that contains the function + // and GetProcAddress to get a pointer to the function if available. + + fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( + GetModuleHandle(TEXT("kernel32")), TEXT("IsWow64Process")); + + if (fnIsWow64Process == NULL) + return FALSE; + + if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) + return FALSE; + + return bIsWow64; +} + +// ------------------------------------------------------------------------------------------ +typedef enum EWindowsVersion +{ + WINDOWS_UNKNOWN = 0, + WINDOWS_VISTA_SERVER2008 = (1 << 0), + WINDOWS_7_SERVER2008R2 = (1 << 1), + WINDOWS_FUTURE = (1 << 2) +} +EWindowsVersion; +// Defines Windows 7/Windows Server 2008 R2 and up (future versions) +#define WINDOWS_7_SERVER2008R2_AND_UP (WINDOWS_7_SERVER2008R2|WINDOWS_FUTURE) +// The function is limited to Vista/7 mostly as we need just to find out Vista/WOW64 combination +// in order to use WASAPI WOW64 workarounds. +static UINT32 GetWindowsVersion() +{ + static UINT32 version = WINDOWS_UNKNOWN; + + if (version == WINDOWS_UNKNOWN) + { + DWORD dwVersion = 0; + DWORD dwMajorVersion = 0; + DWORD dwMinorVersion = 0; + DWORD dwBuild = 0; + + typedef DWORD (WINAPI *LPFN_GETVERSION)(VOID); + LPFN_GETVERSION fnGetVersion; + + fnGetVersion = (LPFN_GETVERSION) GetProcAddress(GetModuleHandle(TEXT("kernel32")), TEXT("GetVersion")); + if (fnGetVersion == NULL) + return WINDOWS_UNKNOWN; + + dwVersion = fnGetVersion(); + + // Get the Windows version + dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); + + // Get the build number + if (dwVersion < 0x80000000) + dwBuild = (DWORD)(HIWORD(dwVersion)); + + switch (dwMajorVersion) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; // skip lower + case 6: + switch (dwMinorVersion) + { + case 0: + version |= WINDOWS_VISTA_SERVER2008; + break; + case 1: + version |= WINDOWS_7_SERVER2008R2; + break; + default: + version |= WINDOWS_FUTURE; + } + break; + default: + version |= WINDOWS_FUTURE; + } + } + + return version; +} + +// ------------------------------------------------------------------------------------------ +static BOOL UseWOW64Workaround() +{ + // note: WOW64 bug is common to Windows Vista x64, thus we fall back to safe Poll-driven + // method. Windows 7 x64 seems has WOW64 bug fixed. + + return (IsWow64() && (GetWindowsVersion() & WINDOWS_VISTA_SERVER2008)); +} + +// ------------------------------------------------------------------------------------------ +typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1, MIX_DIR__2TO1_L } EMixerDir; + +// ------------------------------------------------------------------------------------------ +#define _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(TYPE)\ + TYPE * __restrict to = __to;\ + TYPE * __restrict from = __from;\ + TYPE * __restrict end = from + count;\ + while (from != end)\ + {\ + *to ++ = *from;\ + *to ++ = *from;\ + ++ from;\ + } + +// ------------------------------------------------------------------------------------------ +#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_FLT32(TYPE)\ + TYPE * __restrict to = (TYPE *)__to;\ + TYPE * __restrict from = (TYPE *)__from;\ + TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)((float)(from[0] + from[1]) * 0.5f);\ + from += 2;\ + } + +// ------------------------------------------------------------------------------------------ +#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(TYPE)\ + TYPE * __restrict to = (TYPE *)__to;\ + TYPE * __restrict from = (TYPE *)__from;\ + TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)(((INT32)from[0] + (INT32)from[1]) >> 1);\ + from += 2;\ + } + +// ------------------------------------------------------------------------------------------ +#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT64(TYPE)\ + TYPE * __restrict to = (TYPE *)__to;\ + TYPE * __restrict from = (TYPE *)__from;\ + TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)(((INT64)from[0] + (INT64)from[1]) >> 1);\ + from += 2;\ + } + +// ------------------------------------------------------------------------------------------ +#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(TYPE)\ + TYPE * __restrict to = (TYPE *)__to;\ + TYPE * __restrict from = (TYPE *)__from;\ + TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = from[0];\ + from += 2;\ + } + +// ------------------------------------------------------------------------------------------ +static void _MixMonoToStereo_1TO2_8(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(BYTE); } +static void _MixMonoToStereo_1TO2_16(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(short); } +static void _MixMonoToStereo_1TO2_24(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(int); /* !!! int24 data is contained in 32-bit containers*/ } +static void _MixMonoToStereo_1TO2_32(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(int); } +static void _MixMonoToStereo_1TO2_32f(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(float); } + +// ------------------------------------------------------------------------------------------ +static void _MixMonoToStereo_2TO1_8(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(BYTE); } +static void _MixMonoToStereo_2TO1_16(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(short); } +static void _MixMonoToStereo_2TO1_24(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(int); /* !!! int24 data is contained in 32-bit containers*/ } +static void _MixMonoToStereo_2TO1_32(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT64(int); } +static void _MixMonoToStereo_2TO1_32f(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_FLT32(float); } + +// ------------------------------------------------------------------------------------------ +static void _MixMonoToStereo_2TO1_8_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(BYTE); } +static void _MixMonoToStereo_2TO1_16_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(short); } +static void _MixMonoToStereo_2TO1_24_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); /* !!! int24 data is contained in 32-bit containers*/ } +static void _MixMonoToStereo_2TO1_32_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); } +static void _MixMonoToStereo_2TO1_32f_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(float); } + +// ------------------------------------------------------------------------------------------ +static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir dir) +{ + switch (dir) + { + case MIX_DIR__1TO2: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_1TO2_8; + case paInt16: return _MixMonoToStereo_1TO2_16; + case paInt24: return _MixMonoToStereo_1TO2_24; + case paInt32: return _MixMonoToStereo_1TO2_32; + case paFloat32: return _MixMonoToStereo_1TO2_32f; + } + break; + + case MIX_DIR__2TO1: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_2TO1_8; + case paInt16: return _MixMonoToStereo_2TO1_16; + case paInt24: return _MixMonoToStereo_2TO1_24; + case paInt32: return _MixMonoToStereo_2TO1_32; + case paFloat32: return _MixMonoToStereo_2TO1_32f; + } + break; + + case MIX_DIR__2TO1_L: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_2TO1_8_L; + case paInt16: return _MixMonoToStereo_2TO1_16_L; + case paInt24: return _MixMonoToStereo_2TO1_24_L; + case paInt32: return _MixMonoToStereo_2TO1_32_L; + case paFloat32: return _MixMonoToStereo_2TO1_32f_L; + } + break; + } + + return NULL; +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + PaWasapiHostApiRepresentation *paWasapi; + PaDeviceInfo *deviceInfoArray; + HRESULT hr = S_OK; + IMMDeviceCollection* pEndPoints = NULL; + UINT i; + + if (!SetupAVRT()) + { + PRINT(("WASAPI: No AVRT! (not VISTA?)")); + return paNoError; + } + + paWasapi = (PaWasapiHostApiRepresentation *)PaUtil_AllocateMemory( sizeof(PaWasapiHostApiRepresentation) ); + if (paWasapi == NULL) + { + result = paInsufficientMemory; + goto error; + } + + result = PaWinUtil_CoInitialize( paWASAPI, &paWasapi->comInitializationResult ); + if( result != paNoError ) + { + goto error; + } + + paWasapi->allocations = PaUtil_CreateAllocationGroup(); + if (paWasapi->allocations == NULL) + { + result = paInsufficientMemory; + goto error; + } + + *hostApi = &paWasapi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paWASAPI; + (*hostApi)->info.name = "Windows WASAPI"; + (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + + paWasapi->enumerator = NULL; + hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, + &pa_IID_IMMDeviceEnumerator, (void **)&paWasapi->enumerator); + + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // getting default device ids in the eMultimedia "role" + { + { + IMMDevice *defaultRenderer = NULL; + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(paWasapi->enumerator, eRender, eMultimedia, &defaultRenderer); + if (hr != S_OK) + { + if (hr != E_NOTFOUND) { + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } + } + else + { + WCHAR *pszDeviceId = NULL; + hr = IMMDevice_GetId(defaultRenderer, &pszDeviceId); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + wcsncpy(paWasapi->defaultRenderer, pszDeviceId, MAX_STR_LEN-1); + CoTaskMemFree(pszDeviceId); + IMMDevice_Release(defaultRenderer); + } + } + + { + IMMDevice *defaultCapturer = NULL; + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(paWasapi->enumerator, eCapture, eMultimedia, &defaultCapturer); + if (hr != S_OK) + { + if (hr != E_NOTFOUND) { + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } + } + else + { + WCHAR *pszDeviceId = NULL; + hr = IMMDevice_GetId(defaultCapturer, &pszDeviceId); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + wcsncpy(paWasapi->defaultCapturer, pszDeviceId, MAX_STR_LEN-1); + CoTaskMemFree(pszDeviceId); + IMMDevice_Release(defaultCapturer); + } + } + } + + hr = IMMDeviceEnumerator_EnumAudioEndpoints(paWasapi->enumerator, eAll, DEVICE_STATE_ACTIVE, &pEndPoints); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + hr = IMMDeviceCollection_GetCount(pEndPoints, &paWasapi->deviceCount); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_AllocateMemory(sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); + for (i = 0; i < paWasapi->deviceCount; ++i) + memset(&paWasapi->devInfo[i], 0, sizeof(PaWasapiDeviceInfo)); + + if (paWasapi->deviceCount > 0) + { + (*hostApi)->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory( + paWasapi->allocations, sizeof(PaDeviceInfo *) * paWasapi->deviceCount); + if ((*hostApi)->deviceInfos == NULL) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory( + paWasapi->allocations, sizeof(PaDeviceInfo) * paWasapi->deviceCount); + if (deviceInfoArray == NULL) + { + result = paInsufficientMemory; + goto error; + } + + for (i = 0; i < paWasapi->deviceCount; ++i) + { + DWORD state = 0; + PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + PA_DEBUG(("WASAPI: device idx: %02d\n", i)); + PA_DEBUG(("WASAPI: ---------------\n")); + + hr = IMMDeviceCollection_Item(pEndPoints, i, &paWasapi->devInfo[i].device); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // getting ID + { + WCHAR *pszDeviceId = NULL; + hr = IMMDevice_GetId(paWasapi->devInfo[i].device, &pszDeviceId); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hr, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + wcsncpy(paWasapi->devInfo[i].szDeviceID, pszDeviceId, MAX_STR_LEN-1); + CoTaskMemFree(pszDeviceId); + + if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultCapturer) == 0) + {// we found the default input! + (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; + } + if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultRenderer) == 0) + {// we found the default output! + (*hostApi)->info.defaultOutputDevice = (*hostApi)->info.deviceCount; + } + } + + hr = IMMDevice_GetState(paWasapi->devInfo[i].device, &paWasapi->devInfo[i].state); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + if (paWasapi->devInfo[i].state != DEVICE_STATE_ACTIVE) + { + PRINT(("WASAPI device: %d is not currently available (state:%d)\n",i,state)); + } + + { + IPropertyStore *pProperty; + hr = IMMDevice_OpenPropertyStore(paWasapi->devInfo[i].device, STGM_READ, &pProperty); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // "Friendly" Name + { + char *deviceName; + PROPVARIANT value; + PropVariantInit(&value); + hr = IPropertyStore_GetValue(pProperty, &PKEY_Device_FriendlyName, &value); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + deviceInfo->name = NULL; + deviceName = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1); + if (deviceName == NULL) + { + result = paInsufficientMemory; + goto error; + } + if (value.pwszVal) + wcstombs(deviceName, value.pwszVal, MAX_STR_LEN-1); + else + _snprintf(deviceName, MAX_STR_LEN-1, "baddev%d", i); + deviceInfo->name = deviceName; + PropVariantClear(&value); + PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); + } + + // Default format + { + PROPVARIANT value; + PropVariantInit(&value); + hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEngine_DeviceFormat, &value); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + memcpy(&paWasapi->devInfo[i].DefaultFormat, value.blob.pBlobData, min(sizeof(paWasapi->devInfo[i].DefaultFormat), value.blob.cbSize)); + // cleanup + PropVariantClear(&value); + } + + // Formfactor + { + PROPVARIANT value; + PropVariantInit(&value); + hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEndpoint_FormFactor, &value); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // set + #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION) + // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1))); + UINT v; + memcpy(&v, (((WORD *)&value.wReserved3)+1), sizeof(v)); + paWasapi->devInfo[i].formFactor = (EndpointFormFactor)v; + #else + paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal; + #endif + PA_DEBUG(("WASAPI:%d| form-factor[%d]\n", i, paWasapi->devInfo[i].formFactor)); + // cleanup + PropVariantClear(&value); + } + + SAFE_RELEASE(pProperty); + } + + + // Endpoint data + { + IMMEndpoint *endpoint = NULL; + hr = IMMDevice_QueryInterface(paWasapi->devInfo[i].device, &pa_IID_IMMEndpoint, (void **)&endpoint); + if (SUCCEEDED(hr)) + { + hr = IMMEndpoint_GetDataFlow(endpoint, &paWasapi->devInfo[i].flow); + SAFE_RELEASE(endpoint); + } + } + + // Getting a temporary IAudioClient for more fields + // we make sure NOT to call Initialize yet! + { + IAudioClient *tmpClient = NULL; + + hr = IMMDevice_Activate(paWasapi->devInfo[i].device, &pa_IID_IAudioClient, + CLSCTX_INPROC_SERVER, NULL, (void **)&tmpClient); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + hr = IAudioClient_GetDevicePeriod(tmpClient, + &paWasapi->devInfo[i].DefaultDevicePeriod, + &paWasapi->devInfo[i].MinimumDevicePeriod); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + //hr = tmpClient->GetMixFormat(&paWasapi->devInfo[i].MixFormat); + + // Release client + SAFE_RELEASE(tmpClient); + + if (hr != S_OK) + { + //davidv: this happened with my hardware, previously for that same device in DirectSound: + //Digital Output (Realtek AC'97 Audio)'s GUID: {0x38f2cf50,0x7b4c,0x4740,0x86,0xeb,0xd4,0x38,0x66,0xd8,0xc8, 0x9f} + //so something must be _really_ wrong with this device, TODO handle this better. We kind of need GetMixFormat + LogHostError(hr); + // We need to set the result to a value otherwise we will return paNoError + result = paInternalError; + goto error; + } + } + + // we can now fill in portaudio device data + deviceInfo->maxInputChannels = 0; + deviceInfo->maxOutputChannels = 0; + deviceInfo->defaultSampleRate = paWasapi->devInfo[i].DefaultFormat.Format.nSamplesPerSec; + switch (paWasapi->devInfo[i].flow) + { + case eRender: { + deviceInfo->maxOutputChannels = paWasapi->devInfo[i].DefaultFormat.Format.nChannels; + deviceInfo->defaultHighOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); + deviceInfo->defaultLowOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxOutputChannels, (float)deviceInfo->defaultHighOutputLatency, (float)deviceInfo->defaultLowOutputLatency)); + break;} + case eCapture: { + deviceInfo->maxInputChannels = paWasapi->devInfo[i].DefaultFormat.Format.nChannels; + deviceInfo->defaultHighInputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); + deviceInfo->defaultLowInputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxInputChannels, (float)deviceInfo->defaultHighInputLatency, (float)deviceInfo->defaultLowInputLatency)); + break; } + default: + PRINT(("WASAPI:%d| bad Data Flow!\n", i)); + // We need to set the result to a value otherwise we will return paNoError + result = paInternalError; + //continue; // do not skip from list, allow to initialize + break; + } + + (*hostApi)->deviceInfos[i] = deviceInfo; + ++(*hostApi)->info.deviceCount; + } + } + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &paWasapi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &paWasapi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + + // findout if platform workaround is required + paWasapi->useWOW64Workaround = UseWOW64Workaround(); + + SAFE_RELEASE(pEndPoints); + + PRINT(("WASAPI: initialized ok\n")); + + return paNoError; + +error: + + PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); + + SAFE_RELEASE(pEndPoints); + + Terminate((PaUtilHostApiRepresentation *)paWasapi); + + // Safety if error was not set so that we do not think initialize was a success + if (result == paNoError) { + result = paInternalError; + } + + return result; +} + +// ------------------------------------------------------------------------------------------ +static void Terminate( PaUtilHostApiRepresentation *hostApi ) +{ + UINT i; + PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; + if (paWasapi == NULL) + return; + + // Release IMMDeviceEnumerator + SAFE_RELEASE(paWasapi->enumerator); + + for (i = 0; i < paWasapi->deviceCount; ++i) + { + PaWasapiDeviceInfo *info = &paWasapi->devInfo[i]; + SAFE_RELEASE(info->device); + + //if (info->MixFormat) + // CoTaskMemFree(info->MixFormat); + } + PaUtil_FreeMemory(paWasapi->devInfo); + + if (paWasapi->allocations) + { + PaUtil_FreeAllAllocations(paWasapi->allocations); + PaUtil_DestroyAllocationGroup(paWasapi->allocations); + } + + PaWinUtil_CoUninitialize( paWASAPI, &paWasapi->comInitializationResult ); + + PaUtil_FreeMemory(paWasapi); + + // Close AVRT + CloseAVRT(); +} + +// ------------------------------------------------------------------------------------------ +static PaWasapiHostApiRepresentation *_GetHostApi(PaError *_error) +{ + PaError error; + + PaUtilHostApiRepresentation *pApi; + if ((error = PaUtil_GetHostApiRepresentation(&pApi, paWASAPI)) != paNoError) + { + if (_error != NULL) + (*_error) = error; + + return NULL; + } + return (PaWasapiHostApiRepresentation *)pApi; +} + +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice ) +{ + PaError ret; + PaWasapiHostApiRepresentation *paWasapi; + UINT32 size; + PaDeviceIndex index; + + if (pFormat == NULL) + return paBadBufferPtr; + if (nFormatSize <= 0) + return paBufferTooSmall; + + // Get API + paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return ret; + + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + size = min(nFormatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); + memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); + + return size; +} + +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ) +{ + PaError ret; + PaDeviceIndex index; + + // Get API + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + return paWasapi->devInfo[ index ].formFactor; +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput ) +{ + PaWasapiStream *stream = (PaWasapiStream *)pStream; + if (stream == NULL) + return paBadStreamPtr; + + if (nInput != NULL) + (*nInput) = stream->in.framesPerHostCallback; + + if (nOutput != NULL) + (*nOutput) = stream->out.framesPerHostCallback; + + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +static void LogWAVEFORMATEXTENSIBLE(const WAVEFORMATEXTENSIBLE *in) +{ + const WAVEFORMATEX *old = (WAVEFORMATEX *)in; + switch (old->wFormatTag) + { + case WAVE_FORMAT_EXTENSIBLE: { + + PRINT(("wFormatTag =WAVE_FORMAT_EXTENSIBLE\n")); + + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + { + PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\n")); + } + else + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) + { + PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_PCM\n")); + } + else + { + PRINT(("SubFormat =CUSTOM GUID{%d:%d:%d:%d%d%d%d%d%d%d%d}\n", + in->SubFormat.Data1, + in->SubFormat.Data2, + in->SubFormat.Data3, + (int)in->SubFormat.Data4[0], + (int)in->SubFormat.Data4[1], + (int)in->SubFormat.Data4[2], + (int)in->SubFormat.Data4[3], + (int)in->SubFormat.Data4[4], + (int)in->SubFormat.Data4[5], + (int)in->SubFormat.Data4[6], + (int)in->SubFormat.Data4[7])); + } + PRINT(("Samples.wValidBitsPerSample =%d\n", in->Samples.wValidBitsPerSample)); + PRINT(("dwChannelMask =0x%X\n",in->dwChannelMask)); + + break; } + + case WAVE_FORMAT_PCM: PRINT(("wFormatTag =WAVE_FORMAT_PCM\n")); break; + case WAVE_FORMAT_IEEE_FLOAT: PRINT(("wFormatTag =WAVE_FORMAT_IEEE_FLOAT\n")); break; + default: + PRINT(("wFormatTag =UNKNOWN(%d)\n",old->wFormatTag)); break; + } + + PRINT(("nChannels =%d\n",old->nChannels)); + PRINT(("nSamplesPerSec =%d\n",old->nSamplesPerSec)); + PRINT(("nAvgBytesPerSec=%d\n",old->nAvgBytesPerSec)); + PRINT(("nBlockAlign =%d\n",old->nBlockAlign)); + PRINT(("wBitsPerSample =%d\n",old->wBitsPerSample)); + PRINT(("cbSize =%d\n",old->cbSize)); +} + +// ------------------------------------------------------------------------------------------ +static PaSampleFormat WaveToPaFormat(const WAVEFORMATEXTENSIBLE *in) +{ + const WAVEFORMATEX *old = (WAVEFORMATEX *)in; + + switch (old->wFormatTag) + { + case WAVE_FORMAT_EXTENSIBLE: { + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + { + if (in->Samples.wValidBitsPerSample == 32) + return paFloat32; + } + else + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) + { + switch (old->wBitsPerSample) + { + case 32: return paInt32; + case 24: return paInt24; + case 8: return paUInt8; + case 16: return paInt16; + } + } + break; } + + case WAVE_FORMAT_IEEE_FLOAT: + return paFloat32; + + case WAVE_FORMAT_PCM: { + switch (old->wBitsPerSample) + { + case 32: return paInt32; + case 24: return paInt24; + case 8: return paUInt8; + case 16: return paInt16; + } + break; } + } + + return paCustomFormat; +} + +// ------------------------------------------------------------------------------------------ +static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStreamParameters *params, + double sampleRate) +{ + WORD bitsPerSample; + WAVEFORMATEX *old; + DWORD channelMask = 0; + PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)params->hostApiSpecificStreamInfo; + + // Get user assigned channel mask + if ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiUseChannelMask)) + channelMask = streamInfo->channelMask; + + // Convert PaSampleFormat to bits per sample + if ((bitsPerSample = PaSampleFormatToBitsPerSample(params->sampleFormat)) == 0) + return paSampleFormatNotSupported; + + memset(wavex, 0, sizeof(*wavex)); + + old = (WAVEFORMATEX *)wavex; + old->nChannels = (WORD)params->channelCount; + old->nSamplesPerSec = (DWORD)sampleRate; + if ((old->wBitsPerSample = bitsPerSample) > 16) + { + old->wBitsPerSample = 32; // 20 or 24 bits must go in 32 bit containers (ints) + } + old->nBlockAlign = (old->nChannels * (old->wBitsPerSample/8)); + old->nAvgBytesPerSec = (old->nSamplesPerSec * old->nBlockAlign); + + // WAVEFORMATEX + if ((params->channelCount <= 2) && ((bitsPerSample == 16) || (bitsPerSample == 8))) + { + old->cbSize = 0; + old->wFormatTag = WAVE_FORMAT_PCM; + } + // WAVEFORMATEXTENSIBLE + else + { + old->wFormatTag = WAVE_FORMAT_EXTENSIBLE; + old->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + + if ((params->sampleFormat & ~paNonInterleaved) == paFloat32) + wavex->SubFormat = pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + else + wavex->SubFormat = pa_KSDATAFORMAT_SUBTYPE_PCM; + + wavex->Samples.wValidBitsPerSample = bitsPerSample; //no extra padding! + + // Set channel mask + if (channelMask != 0) + { + wavex->dwChannelMask = channelMask; + } + else + { + switch (params->channelCount) + { + case 1: wavex->dwChannelMask = KSAUDIO_SPEAKER_MONO; break; + case 2: wavex->dwChannelMask = KSAUDIO_SPEAKER_STEREO; break; + case 3: wavex->dwChannelMask = KSAUDIO_SPEAKER_STEREO|SPEAKER_LOW_FREQUENCY; break; + case 4: wavex->dwChannelMask = KSAUDIO_SPEAKER_QUAD; break; + case 5: wavex->dwChannelMask = KSAUDIO_SPEAKER_QUAD|SPEAKER_LOW_FREQUENCY; break; +#ifdef KSAUDIO_SPEAKER_5POINT1_SURROUND + case 6: wavex->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; break; +#else + case 6: wavex->dwChannelMask = KSAUDIO_SPEAKER_5POINT1; break; +#endif +#ifdef KSAUDIO_SPEAKER_5POINT1_SURROUND + case 7: wavex->dwChannelMask = KSAUDIO_SPEAKER_5POINT1_SURROUND|SPEAKER_BACK_CENTER; break; +#else + case 7: wavex->dwChannelMask = KSAUDIO_SPEAKER_5POINT1|SPEAKER_BACK_CENTER; break; +#endif +#ifdef KSAUDIO_SPEAKER_7POINT1_SURROUND + case 8: wavex->dwChannelMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; break; +#else + case 8: wavex->dwChannelMask = KSAUDIO_SPEAKER_7POINT1; break; +#endif + + default: wavex->dwChannelMask = 0; + } + } + } + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +/*static void wasapiFillWFEXT( WAVEFORMATEXTENSIBLE* pwfext, PaSampleFormat sampleFormat, double sampleRate, int channelCount) +{ + PA_DEBUG(( "sampleFormat = %lx\n" , sampleFormat )); + PA_DEBUG(( "sampleRate = %f\n" , sampleRate )); + PA_DEBUG(( "chanelCount = %d\n", channelCount )); + + pwfext->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + pwfext->Format.nChannels = (WORD)channelCount; + pwfext->Format.nSamplesPerSec = (DWORD)sampleRate; + if(channelCount == 1) + pwfext->dwChannelMask = KSAUDIO_SPEAKER_DIRECTOUT; + else + pwfext->dwChannelMask = KSAUDIO_SPEAKER_STEREO; + if(sampleFormat == paFloat32) + { + pwfext->Format.nBlockAlign = (WORD)(channelCount * 4); + pwfext->Format.wBitsPerSample = 32; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 32; + pwfext->SubFormat = pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + } + else if(sampleFormat == paInt32) + { + pwfext->Format.nBlockAlign = (WORD)(channelCount * 4); + pwfext->Format.wBitsPerSample = 32; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 32; + pwfext->SubFormat = pa_KSDATAFORMAT_SUBTYPE_PCM; + } + else if(sampleFormat == paInt24) + { + pwfext->Format.nBlockAlign = (WORD)(channelCount * 4); + pwfext->Format.wBitsPerSample = 32; // 24-bit in 32-bit int container + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 24; + pwfext->SubFormat = pa_KSDATAFORMAT_SUBTYPE_PCM; + } + else if(sampleFormat == paInt16) + { + pwfext->Format.nBlockAlign = (WORD)(channelCount * 2); + pwfext->Format.wBitsPerSample = 16; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 16; + pwfext->SubFormat = pa_KSDATAFORMAT_SUBTYPE_PCM; + } + pwfext->Format.nAvgBytesPerSec = pwfext->Format.nSamplesPerSec * pwfext->Format.nBlockAlign; +}*/ + +// ------------------------------------------------------------------------------------------ +static PaError GetClosestFormat(IAudioClient *myClient, double sampleRate, + const PaStreamParameters *_params, AUDCLNT_SHAREMODE shareMode, WAVEFORMATEXTENSIBLE *outWavex, + BOOL output) +{ + PaError answer = paInvalidSampleRate; + WAVEFORMATEX *sharedClosestMatch = NULL; + HRESULT hr = !S_OK; + PaStreamParameters params = (*_params); + + /* It was not noticed that 24-bit Input producing no output while device accepts this format. + To fix this issue let's ask for 32-bits and let PA converters convert host 32-bit data + to 24-bit for user-space. The bug concerns Vista, if Windows 7 supports 24-bits for Input + please report to PortAudio developers to exclude Windows 7. + */ + /*if ((params.sampleFormat == paInt24) && (output == FALSE)) + params.sampleFormat = paFloat32;*/ // <<< The silence was due to missing Int32_To_Int24_Dither implementation + + MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate); + + hr = IAudioClient_IsFormatSupported(myClient, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); + if (hr == S_OK) + answer = paFormatIsSupported; + else + if (sharedClosestMatch) + { + WORD bitsPerSample; + WAVEFORMATEXTENSIBLE *ext = (WAVEFORMATEXTENSIBLE*)sharedClosestMatch; + + GUID subf_guid = GUID_NULL; + if (sharedClosestMatch->wFormatTag == WAVE_FORMAT_EXTENSIBLE) + { + memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEXTENSIBLE)); + subf_guid = ext->SubFormat; + } + else + memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEX)); + + CoTaskMemFree(sharedClosestMatch); + + // Make supported by default + answer = paFormatIsSupported; + + // Validate SampleRate + if ((DWORD)sampleRate != outWavex->Format.nSamplesPerSec) + return paInvalidSampleRate; + + // Validate Channel count + if ((WORD)params.channelCount != outWavex->Format.nChannels) + { + // If mono, then driver does not support 1 channel, we use internal workaround + // of tiny software mixing functionality, e.g. we provide to user buffer 1 channel + // but then mix into 2 for device buffer + if ((params.channelCount == 1) && (outWavex->Format.nChannels == 2)) + return paFormatIsSupported; + else + return paInvalidChannelCount; + } + + // Validate Sample format + if ((bitsPerSample = PaSampleFormatToBitsPerSample(params.sampleFormat)) == 0) + return paSampleFormatNotSupported; + + // Validate Sample format: bit size (WASAPI does not limit 'bit size') + //if (bitsPerSample != outWavex->Format.wBitsPerSample) + // return paSampleFormatNotSupported; + + // Validate Sample format: paFloat32 (WASAPI does not limit 'bit type') + //if ((params->sampleFormat == paFloat32) && (subf_guid != KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + // return paSampleFormatNotSupported; + + // Validate Sample format: paInt32 (WASAPI does not limit 'bit type') + //if ((params->sampleFormat == paInt32) && (subf_guid != KSDATAFORMAT_SUBTYPE_PCM)) + // return paSampleFormatNotSupported; + } + else + { + static const int BestToWorst[] = { paFloat32, paInt24, paInt16 }; + int i; + + // Try combination stereo and we will use built-in mono-stereo mixer then + if (params.channelCount == 1) + { + WAVEFORMATEXTENSIBLE stereo = { 0 }; + + PaStreamParameters stereo_params = params; + stereo_params.channelCount = 2; + + MakeWaveFormatFromParams(&stereo, &stereo_params, sampleRate); + + hr = IAudioClient_IsFormatSupported(myClient, shareMode, &stereo.Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); + if (hr == S_OK) + { + memcpy(outWavex, &stereo, sizeof(WAVEFORMATEXTENSIBLE)); + CoTaskMemFree(sharedClosestMatch); + return (answer = paFormatIsSupported); + } + + // Try selecting suitable sample type + for (i = 0; i < STATIC_ARRAY_SIZE(BestToWorst); ++i) + { + WAVEFORMATEXTENSIBLE sample = { 0 }; + + PaStreamParameters sample_params = stereo_params; + sample_params.sampleFormat = BestToWorst[i]; + + MakeWaveFormatFromParams(&sample, &sample_params, sampleRate); + + hr = IAudioClient_IsFormatSupported(myClient, shareMode, &sample.Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); + if (hr == S_OK) + { + memcpy(outWavex, &sample, sizeof(WAVEFORMATEXTENSIBLE)); + CoTaskMemFree(sharedClosestMatch); + return (answer = paFormatIsSupported); + } + } + } + + // Try selecting suitable sample type + for (i = 0; i < STATIC_ARRAY_SIZE(BestToWorst); ++i) + { + WAVEFORMATEXTENSIBLE spfmt = { 0 }; + + PaStreamParameters spfmt_params = params; + spfmt_params.sampleFormat = BestToWorst[i]; + + MakeWaveFormatFromParams(&spfmt, &spfmt_params, sampleRate); + + hr = IAudioClient_IsFormatSupported(myClient, shareMode, &spfmt.Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); + if (hr == S_OK) + { + memcpy(outWavex, &spfmt, sizeof(WAVEFORMATEXTENSIBLE)); + CoTaskMemFree(sharedClosestMatch); + answer = paFormatIsSupported; + break; + } + } + + // Nothing helped + LogHostError(hr); + } + + return answer; +} + +// ------------------------------------------------------------------------------------------ +static PaError IsStreamParamsValid(struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate) +{ + if (hostApi == NULL) + return paHostApiNotFound; + if ((UINT32)sampleRate == 0) + return paInvalidSampleRate; + + if (inputParameters != NULL) + { + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if (inputParameters->sampleFormat & paCustomFormat) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if (inputParameters->device == paUseHostApiSpecificDeviceSpecification) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if (inputParameters->channelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if (inputParameters->hostApiSpecificStreamInfo) + { + PaWasapiStreamInfo *inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; + if ((inputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || + (inputStreamInfo->version != 1) || + (inputStreamInfo->hostApiType != paWASAPI)) + { + return paIncompatibleHostApiSpecificStreamInfo; + } + } + + return paNoError; + } + + if (outputParameters != NULL) + { + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if (outputParameters->sampleFormat & paCustomFormat) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + if (outputParameters->device == paUseHostApiSpecificDeviceSpecification) + return paInvalidDevice; + + /* check that output device can support outputChannelCount */ + if (outputParameters->channelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if(outputParameters->hostApiSpecificStreamInfo) + { + PaWasapiStreamInfo *outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; + if ((outputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || + (outputStreamInfo->version != 1) || + (outputStreamInfo->hostApiType != paWASAPI)) + { + return paIncompatibleHostApiSpecificStreamInfo; + } + } + + return paNoError; + } + + return (inputParameters || outputParameters ? paNoError : paInternalError); +} + +// ------------------------------------------------------------------------------------------ +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + IAudioClient *tmpClient = NULL; + PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; + PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; + + // Validate PaStreamParameters + PaError error; + if ((error = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) + return error; + + if (inputParameters != NULL) + { + WAVEFORMATEXTENSIBLE wavex; + HRESULT hr; + PaError answer; + AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; + inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; + + if (inputStreamInfo && (inputStreamInfo->flags & paWinWasapiExclusive)) + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + + hr = IMMDevice_Activate(paWasapi->devInfo[inputParameters->device].device, + &pa_IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, (void **)&tmpClient); + if (hr != S_OK) + { + LogHostError(hr); + return paInvalidDevice; + } + + answer = GetClosestFormat(tmpClient, sampleRate, inputParameters, shareMode, &wavex, FALSE); + SAFE_RELEASE(tmpClient); + + if (answer != paFormatIsSupported) + return answer; + } + + if (outputParameters != NULL) + { + HRESULT hr; + WAVEFORMATEXTENSIBLE wavex; + PaError answer; + AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; + outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; + + if (outputStreamInfo && (outputStreamInfo->flags & paWinWasapiExclusive)) + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + + hr = IMMDevice_Activate(paWasapi->devInfo[outputParameters->device].device, + &pa_IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, (void **)&tmpClient); + if (hr != S_OK) + { + LogHostError(hr); + return paInvalidDevice; + } + + answer = GetClosestFormat(tmpClient, sampleRate, outputParameters, shareMode, &wavex, TRUE); + SAFE_RELEASE(tmpClient); + + if (answer != paFormatIsSupported) + return answer; + } + + return paFormatIsSupported; +} + +// ------------------------------------------------------------------------------------------ +static PaUint32 PaUtil_GetFramesPerHostBuffer(PaUint32 userFramesPerBuffer, PaTime suggestedLatency, double sampleRate, PaUint32 TimerJitterMs) +{ + PaUint32 frames = userFramesPerBuffer + max( userFramesPerBuffer, (PaUint32)(suggestedLatency * sampleRate) ); + frames += (PaUint32)((sampleRate * 0.001) * TimerJitterMs); + return frames; +} + +// ------------------------------------------------------------------------------------------ +static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, BOOL fullDuplex) +{ + // Count buffers (must be at least 1) + sub->buffers = (userFramesPerBuffer ? framesPerLatency / userFramesPerBuffer : 0); + if (sub->buffers == 0) + sub->buffers = 1; + + // Determine amount of buffers used: + // - Full-duplex mode will lead to period difference, thus only 1. + // - Input mode, only 1, as WASAPI allows extraction of only 1 packet. + // - For Shared mode we use double buffering. + if ((sub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) || fullDuplex) + { + // Exclusive mode does not allow >1 buffers be used for Event interface, e.g. GetBuffer + // call must acquire max buffer size and it all must be processed. + if (sub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) + sub->userBufferAndHostMatch = 1; + + // Use paUtilBoundedHostBufferSize because exclusive mode will starve and produce + // bad quality of audio + sub->buffers = 1; + } +} + +// ------------------------------------------------------------------------------------------ +static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerLatency, + ALIGN_FUNC pAlignFunc) +{ + // Align frames to HD Audio packet size of 128 bytes for Exclusive mode only. + // Not aligning on Windows Vista will cause Event timeout, although Windows 7 will + // return AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED error to realign buffer. Aligning is necessary + // for Exclusive mode only! when audio data is feeded directly to hardware. + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + (*nFramesPerLatency) = AlignFramesPerBuffer((*nFramesPerLatency), + pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, pAlignFunc); + } + + // Calculate period + pSub->period = MakeHnsPeriod((*nFramesPerLatency), pSub->wavex.Format.nSamplesPerSec); +} + +// ------------------------------------------------------------------------------------------ +static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSub, BOOL output, PaError *pa_error) +{ + PaError error; + HRESULT hr; + + const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; + const PaStreamParameters *params = &pSub->params.stream_params; + UINT32 framesPerLatency = pSub->params.frames_per_buffer; + double sampleRate = pSub->params.sample_rate; + BOOL blocking = pSub->params.blocking; + BOOL fullDuplex = pSub->params.full_duplex; + + const UINT32 userFramesPerBuffer = framesPerLatency; + IAudioClient *audioClient = NULL; + + // Validate parameters + if (!pSub || !pInfo || !params) + return E_POINTER; + if ((UINT32)sampleRate == 0) + return E_INVALIDARG; + + // Get the audio client + hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void **)&audioClient); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + // Get closest format + if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) + { + if (pa_error) + (*pa_error) = error; + + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, format not supported + } + + // Check for Mono <<>> Stereo workaround + if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) + { + /*if (blocking) + { + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, blocking mode not supported + }*/ + + // select mixer + pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); + if (pSub->monoMixer == NULL) + { + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, no mixer for format + } + } + +#if 0 + // Add suggestd latency + framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); +#else + // Calculate host buffer size + if ((pSub->shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) && + (!pSub->streamFlags || ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) + { + framesPerLatency = PaUtil_GetFramesPerHostBuffer(userFramesPerBuffer, + params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, + (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); + } + else + { + REFERENCE_TIME overall; + + // Work 1:1 with user buffer (only polling allows to use >1) + framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); + + // Use Polling if overall latency is > 5ms as it allows to use 100% CPU in a callback, + // or user specified latency parameter + overall = MakeHnsPeriod(framesPerLatency, pSub->wavex.Format.nSamplesPerSec); + if ((overall >= (106667*2)/*21.33ms*/) || ((INT32)(params->suggestedLatency*100000.0) != 0/*0.01 msec granularity*/)) + { + framesPerLatency = PaUtil_GetFramesPerHostBuffer(userFramesPerBuffer, + params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, + (streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); + + // Use Polling interface + pSub->streamFlags &= ~AUDCLNT_STREAMFLAGS_EVENTCALLBACK; + PRINT(("WASAPI: CreateAudioClient: forcing POLL mode\n")); + } + } +#endif + + // For full-duplex output resize buffer to be the same as for input + if (output && fullDuplex) + framesPerLatency = pStream->in.framesPerHostCallback; + + // Avoid 0 frames + if (framesPerLatency == 0) + framesPerLatency = MakeFramesFromHns(pInfo->DefaultDevicePeriod, pSub->wavex.Format.nSamplesPerSec); + + //! Exclusive Input stream renders data in 6 packets, we must set then the size of + //! single packet, total buffer size, e.g. required latency will be PacketSize * 6 + if (!output && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) + { + framesPerLatency /= WASAPI_PACKETS_PER_INPUT_BUFFER; + } + + // Calculate aligned period + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + + /*! Enforce min/max period for device in Shared mode to avoid bad audio quality. + Avoid doing so for Exclusive mode as alignment will suffer. + */ + if (pSub->shareMode == AUDCLNT_SHAREMODE_SHARED) + { + if (pSub->period < pInfo->DefaultDevicePeriod) + { + pSub->period = pInfo->DefaultDevicePeriod; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + else + { + if (pSub->period < pInfo->MinimumDevicePeriod) + { + pSub->period = pInfo->MinimumDevicePeriod; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_FWD); + } + } + + /*! Windows 7 does not allow to set latency lower than minimal device period and will + return error: AUDCLNT_E_INVALID_DEVICE_PERIOD. Under Vista we enforce the same behavior + manually for unified behavior on all platforms. + */ + { + /*! AUDCLNT_E_BUFFER_SIZE_ERROR: Applies to Windows 7 and later. + Indicates that the buffer duration value requested by an exclusive-mode client is + out of range. The requested duration value for pull mode must not be greater than + 500 milliseconds; for push mode the duration value must not be greater than 2 seconds. + */ + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + static const REFERENCE_TIME MAX_BUFFER_EVENT_DURATION = 500 * 10000; + static const REFERENCE_TIME MAX_BUFFER_POLL_DURATION = 2000 * 10000; + + if (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) // pull mode, max 500ms + { + if (pSub->period > MAX_BUFFER_EVENT_DURATION) + { + pSub->period = MAX_BUFFER_EVENT_DURATION; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + else // push mode, max 2000ms + { + if (pSub->period > MAX_BUFFER_POLL_DURATION) + { + pSub->period = MAX_BUFFER_POLL_DURATION; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + } + } + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + &pSub->wavex.Format, + NULL); + + /*! WASAPI is tricky on large device buffer, sometimes 2000ms can be allocated sometimes + less. There is no known guaranteed level thus we make subsequent tries by decreasing + buffer by 100ms per try. + */ + while ((hr == E_OUTOFMEMORY) && (pSub->period > (100 * 10000))) + { + PRINT(("WASAPI: CreateAudioClient: decreasing buffer size to %d milliseconds\n", (pSub->period / 10000))); + + // Decrease by 100ms and try again + pSub->period -= (100 * 10000); + + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + + // Release the previous allocations + SAFE_RELEASE(audioClient); + + // Create a new audio client + hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + &pSub->wavex.Format, + NULL); + } + + /*! WASAPI buffer size failure. Fallback to using default size. + */ + if (hr == AUDCLNT_E_BUFFER_SIZE_ERROR) + { + // Use default + pSub->period = pInfo->DefaultDevicePeriod; + + PRINT(("WASAPI: CreateAudioClient: correcting buffer size to device default\n")); + + // Release the previous allocations + SAFE_RELEASE(audioClient); + + // Create a new audio client + hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + &pSub->wavex.Format, + NULL); + } + + /*! If the requested buffer size is not aligned. Can be triggered by Windows 7 and up. + Should not be be triggered ever as we do align buffers always with _CalculateAlignedPeriod. + */ + if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) + { + UINT32 frames = 0; + + // Get the next aligned frame + hr = IAudioClient_GetBufferSize(audioClient, &frames); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + PRINT(("WASAPI: CreateAudioClient: aligning buffer size to % frames\n", frames)); + + // Release the previous allocations + SAFE_RELEASE(audioClient); + + // Create a new audio client + hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + // Get closest format + if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) + { + if (pa_error) + (*pa_error) = error; + + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); // fail, format not supported + goto done; + } + + // Check for Mono >> Stereo workaround + if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) + { + /*if (blocking) + { + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, blocking mode not supported + }*/ + + // Select mixer + pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); + if (pSub->monoMixer == NULL) + { + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, no mixer for format + } + } + + // Calculate period + pSub->period = MakeHnsPeriod(frames, pSub->wavex.Format.nSamplesPerSec); + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + &pSub->wavex.Format, + NULL); + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + } + else + if (hr != S_OK) + { + LogHostError(hr); + goto done; + } + + // Set client + pSub->clientParent = audioClient; + IAudioClient_AddRef(pSub->clientParent); + + // Recalculate buffers count + _RecalculateBuffersCount(pSub, + userFramesPerBuffer, + MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), + fullDuplex); + +done: + + // Clean up + SAFE_RELEASE(audioClient); + return hr; +} + +// ------------------------------------------------------------------------------------------ +static PaError ActivateAudioClientOutput(PaWasapiStream *stream) +{ + HRESULT hr; + PaError result; + + UINT32 maxBufferSize = 0; + PaTime buffer_latency = 0; + UINT32 framesPerBuffer = stream->out.params.frames_per_buffer; + + // Create Audio client + hr = CreateAudioClient(stream, &stream->out, TRUE, &result); + if (hr != S_OK) + { + LogPaError(result = paInvalidDevice); + goto error; + } + LogWAVEFORMATEXTENSIBLE(&stream->out.wavex); + + // Activate volume + stream->outVol = NULL; + /*hr = info->device->Activate( + __uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, + (void**)&stream->outVol); + if (hr != S_OK) + return paInvalidDevice;*/ + + // Get max possible buffer size to check if it is not less than that we request + hr = IAudioClient_GetBufferSize(stream->out.clientParent, &maxBufferSize); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + + // Correct buffer to max size if it maxed out result of GetBufferSize + stream->out.bufferSize = maxBufferSize; + + // Get interface latency (actually uneeded as we calculate latency from the size + // of maxBufferSize). + hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + //stream->out.latencySeconds = nano100ToSeconds(stream->out.deviceLatency); + + // Number of frames that are required at each period + stream->out.framesPerHostCallback = maxBufferSize; + + // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer + stream->out.framesPerBuffer = + (stream->out.userBufferAndHostMatch ? stream->out.framesPerHostCallback : framesPerBuffer); + + // Calculate buffer latency + buffer_latency = (PaTime)maxBufferSize / stream->out.wavex.Format.nSamplesPerSec; + + // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) + stream->out.latencySeconds = buffer_latency; + + PRINT(("WASAPI::OpenStream(output): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->out.framesPerHostCallback, (float)(stream->out.latencySeconds*1000.0f), (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->out.params.wow64_workaround ? "YES" : "NO"), (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); + + return paNoError; + +error: + + return result; +} + +// ------------------------------------------------------------------------------------------ +static PaError ActivateAudioClientInput(PaWasapiStream *stream) +{ + HRESULT hr; + PaError result; + + UINT32 maxBufferSize = 0; + PaTime buffer_latency = 0; + UINT32 framesPerBuffer = stream->in.params.frames_per_buffer; + + // Create Audio client + hr = CreateAudioClient(stream, &stream->in, FALSE, &result); + if (hr != S_OK) + { + LogPaError(result = paInvalidDevice); + goto error; + } + LogWAVEFORMATEXTENSIBLE(&stream->in.wavex); + + // Create volume mgr + stream->inVol = NULL; + /*hr = info->device->Activate( + __uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, + (void**)&stream->inVol); + if (hr != S_OK) + return paInvalidDevice;*/ + + // Get max possible buffer size to check if it is not less than that we request + hr = IAudioClient_GetBufferSize(stream->in.clientParent, &maxBufferSize); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + + // Correct buffer to max size if it maxed out result of GetBufferSize + stream->in.bufferSize = maxBufferSize; + + // Get interface latency (actually uneeded as we calculate latency from the size + // of maxBufferSize). + hr = IAudioClient_GetStreamLatency(stream->in.clientParent, &stream->in.deviceLatency); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + //stream->in.latencySeconds = nano100ToSeconds(stream->in.deviceLatency); + + // Number of frames that are required at each period + stream->in.framesPerHostCallback = maxBufferSize; + + // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer + stream->in.framesPerBuffer = + (stream->in.userBufferAndHostMatch ? stream->in.framesPerHostCallback : framesPerBuffer); + + // Calculate buffer latency + buffer_latency = (PaTime)maxBufferSize / stream->in.wavex.Format.nSamplesPerSec; + + // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) + stream->in.latencySeconds = buffer_latency; + + PRINT(("WASAPI::OpenStream(input): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->in.framesPerHostCallback, (float)(stream->in.latencySeconds*1000.0f), (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->in.params.wow64_workaround ? "YES" : "NO"), (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); + + return paNoError; + +error: + + return result; +} + +// ------------------------------------------------------------------------------------------ +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + HRESULT hr; + PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; + PaWasapiStream *stream = NULL; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; + PaWasapiDeviceInfo *info = NULL; + ULONG framesPerHostCallback; + PaUtilHostBufferSizeMode bufferMode; + const BOOL fullDuplex = ((inputParameters != NULL) && (outputParameters != NULL)); + + // validate PaStreamParameters + if ((result = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) + return LogPaError(result); + + // Validate platform specific flags + if ((streamFlags & paPlatformSpecificFlags) != 0) + { + LogPaError(result = paInvalidFlag); /* unexpected platform specific flag */ + goto error; + } + + // Allocate memory for PaWasapiStream + if ((stream = (PaWasapiStream *)PaUtil_AllocateMemory(sizeof(PaWasapiStream))) == NULL) + { + LogPaError(result = paInsufficientMemory); + goto error; + } + + // Default thread priority is Audio: for exclusive mode we will use Pro Audio. + stream->nThreadPriority = eThreadPriorityAudio; + + // Set default number of frames: paFramesPerBufferUnspecified + if (framesPerBuffer == paFramesPerBufferUnspecified) + { + UINT32 framesPerBufferIn = 0, framesPerBufferOut = 0; + if (inputParameters != NULL) + { + info = &paWasapi->devInfo[inputParameters->device]; + framesPerBufferIn = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); + } + if (outputParameters != NULL) + { + info = &paWasapi->devInfo[outputParameters->device]; + framesPerBufferOut = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); + } + // choosing maximum default size + framesPerBuffer = max(framesPerBufferIn, framesPerBufferOut); + } + if (framesPerBuffer == 0) + framesPerBuffer = ((UINT32)sampleRate / 100) * 2; + + // Try create device: Input + if (inputParameters != NULL) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; + info = &paWasapi->devInfo[inputParameters->device]; + stream->in.flags = (inputStreamInfo ? inputStreamInfo->flags : 0); + + // Select Exclusive/Shared mode + stream->in.shareMode = AUDCLNT_SHAREMODE_SHARED; + if ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiExclusive)) + { + // Boost thread priority + stream->nThreadPriority = eThreadPriorityProAudio; + // Make Exclusive + stream->in.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + } + + // If user provided explicit thread priority level, use it + if ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiThreadPriority)) + { + if ((inputStreamInfo->threadPriority > eThreadPriorityNone) && + (inputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) + stream->nThreadPriority = inputStreamInfo->threadPriority; + } + + // Choose processing mode + stream->in.streamFlags = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); + if (paWasapi->useWOW64Workaround) + stream->in.streamFlags = 0; // polling interface + else + if (streamCallback == NULL) + stream->in.streamFlags = 0; // polling interface + else + if ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiPolling)) + stream->in.streamFlags = 0; // polling interface + else + if (fullDuplex) + stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also + + // Fill parameters for Audio Client creation + stream->in.params.device_info = info; + stream->in.params.stream_params = (*inputParameters); + if (inputStreamInfo != NULL) + { + stream->in.params.wasapi_params = (*inputStreamInfo); + stream->in.params.stream_params.hostApiSpecificStreamInfo = &stream->in.params.wasapi_params; + } + stream->in.params.frames_per_buffer = framesPerBuffer; + stream->in.params.sample_rate = sampleRate; + stream->in.params.blocking = (streamCallback == NULL); + stream->in.params.full_duplex = fullDuplex; + stream->in.params.wow64_workaround = paWasapi->useWOW64Workaround; + + // Create and activate audio client + hr = ActivateAudioClientInput(stream); + if (hr != S_OK) + { + LogPaError(result = paInvalidDevice); + goto error; + } + + // Get closest format + hostInputSampleFormat = PaUtil_SelectClosestAvailableFormat( WaveToPaFormat(&stream->in.wavex), inputSampleFormat ); + + // Set user-side custom host processor + if ((inputStreamInfo != NULL) && + (inputStreamInfo->flags & paWinWasapiRedirectHostProcessor)) + { + stream->hostProcessOverrideInput.processor = inputStreamInfo->hostProcessorInput; + stream->hostProcessOverrideInput.userData = userData; + } + + // Only get IAudioCaptureClient input once here instead of getting it at multiple places based on the use + hr = IAudioClient_GetService(stream->in.clientParent, &pa_IID_IAudioCaptureClient, (void **)&stream->captureClientParent); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paUnanticipatedHostError); + goto error; + } + + // Create ring buffer for blocking mode (It is needed because we fetch Input packets, not frames, + // and thus we have to save partial packet if such remains unread) + if (stream->in.params.blocking == TRUE) + { + UINT32 bufferFrames = ALIGN_NEXT_POW2((stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER) * 2); + UINT32 frameSize = stream->in.wavex.Format.nBlockAlign; + + // buffer + if ((stream->in.tailBuffer = PaUtil_AllocateMemory(sizeof(PaUtilRingBuffer))) == NULL) + { + LogPaError(result = paInsufficientMemory); + goto error; + } + memset(stream->in.tailBuffer, 0, sizeof(PaUtilRingBuffer)); + + // buffer memory region + stream->in.tailBufferMemory = PaUtil_AllocateMemory(frameSize * bufferFrames); + if (stream->in.tailBufferMemory == NULL) + { + LogPaError(result = paInsufficientMemory); + goto error; + } + + // initialize + if (PaUtil_InitializeRingBuffer(stream->in.tailBuffer, frameSize, bufferFrames, stream->in.tailBufferMemory) != 0) + { + LogPaError(result = paInternalError); + goto error; + } + } + } + else + { + inputChannelCount = 0; + inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ + } + + // Try create device: Output + if (outputParameters != NULL) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; + info = &paWasapi->devInfo[outputParameters->device]; + stream->out.flags = (outputStreamInfo ? outputStreamInfo->flags : 0); + + // Select Exclusive/Shared mode + stream->out.shareMode = AUDCLNT_SHAREMODE_SHARED; + if ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiExclusive)) + { + // Boost thread priority + stream->nThreadPriority = eThreadPriorityProAudio; + // Make Exclusive + stream->out.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + } + + // If user provided explicit thread priority level, use it + if ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiThreadPriority)) + { + if ((outputStreamInfo->threadPriority > eThreadPriorityNone) && + (outputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) + stream->nThreadPriority = outputStreamInfo->threadPriority; + } + + // Choose processing mode + stream->out.streamFlags = (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); + if (paWasapi->useWOW64Workaround) + stream->out.streamFlags = 0; // polling interface + else + if (streamCallback == NULL) + stream->out.streamFlags = 0; // polling interface + else + if ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiPolling)) + stream->out.streamFlags = 0; // polling interface + else + if (fullDuplex) + stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also + + // Fill parameters for Audio Client creation + stream->out.params.device_info = info; + stream->out.params.stream_params = (*outputParameters); + if (inputStreamInfo != NULL) + { + stream->out.params.wasapi_params = (*outputStreamInfo); + stream->out.params.stream_params.hostApiSpecificStreamInfo = &stream->out.params.wasapi_params; + } + stream->out.params.frames_per_buffer = framesPerBuffer; + stream->out.params.sample_rate = sampleRate; + stream->out.params.blocking = (streamCallback == NULL); + stream->out.params.full_duplex = fullDuplex; + stream->out.params.wow64_workaround = paWasapi->useWOW64Workaround; + + // Create and activate audio client + hr = ActivateAudioClientOutput(stream); + if (hr != S_OK) + { + LogPaError(result = paInvalidDevice); + goto error; + } + + // Get closest format + hostOutputSampleFormat = PaUtil_SelectClosestAvailableFormat( WaveToPaFormat(&stream->out.wavex), outputSampleFormat ); + + // Set user-side custom host processor + if ((outputStreamInfo != NULL) && + (outputStreamInfo->flags & paWinWasapiRedirectHostProcessor)) + { + stream->hostProcessOverrideOutput.processor = outputStreamInfo->hostProcessorOutput; + stream->hostProcessOverrideOutput.userData = userData; + } + + // Only get IAudioCaptureClient output once here instead of getting it at multiple places based on the use + hr = IAudioClient_GetService(stream->out.clientParent, &pa_IID_IAudioRenderClient, (void **)&stream->renderClientParent); + if (hr != S_OK) + { + LogHostError(hr); + LogPaError(result = paUnanticipatedHostError); + goto error; + } + } + else + { + outputChannelCount = 0; + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ + } + + // log full-duplex + if (fullDuplex) + PRINT(("WASAPI::OpenStream: full-duplex mode\n")); + + // paWinWasapiPolling must be on/or not on both streams + if ((inputParameters != NULL) && (outputParameters != NULL)) + { + if ((inputStreamInfo != NULL) && (outputStreamInfo != NULL)) + { + if (((inputStreamInfo->flags & paWinWasapiPolling) && + !(outputStreamInfo->flags & paWinWasapiPolling)) + || + (!(inputStreamInfo->flags & paWinWasapiPolling) && + (outputStreamInfo->flags & paWinWasapiPolling))) + { + LogPaError(result = paInvalidFlag); + goto error; + } + } + } + + // Initialize stream representation + if (streamCallback) + { + stream->bBlocking = FALSE; + PaUtil_InitializeStreamRepresentation(&stream->streamRepresentation, + &paWasapi->callbackStreamInterface, + streamCallback, userData); + } + else + { + stream->bBlocking = TRUE; + PaUtil_InitializeStreamRepresentation(&stream->streamRepresentation, + &paWasapi->blockingStreamInterface, + streamCallback, userData); + } + + // Initialize CPU measurer + PaUtil_InitializeCpuLoadMeasurer(&stream->cpuLoadMeasurer, sampleRate); + + if (outputParameters && inputParameters) + { + // serious problem #1 - No, Not a problem, especially concerning Exclusive mode. + // Input device in exclusive mode somehow is getting large buffer always, thus we + // adjust Output latency to reflect it, thus period will differ but playback will be + // normal. + /*if (stream->in.period != stream->out.period) + { + PRINT(("WASAPI: OpenStream: period discrepancy\n")); + LogPaError(result = paBadIODeviceCombination); + goto error; + }*/ + + // serious problem #2 - No, Not a problem, as framesPerHostCallback take into account + // sample size while it is not a problem for PA full-duplex, we must care of + // preriod only! + /*if (stream->out.framesPerHostCallback != stream->in.framesPerHostCallback) + { + PRINT(("WASAPI: OpenStream: framesPerHostCallback discrepancy\n")); + goto error; + }*/ + } + + // Calculate frames per host for processor + framesPerHostCallback = (outputParameters ? stream->out.framesPerBuffer : stream->in.framesPerBuffer); + + // Choose correct mode of buffer processing: + // Exclusive/Shared non paWinWasapiPolling mode: paUtilFixedHostBufferSize - always fixed + // Exclusive/Shared paWinWasapiPolling mode: paUtilBoundedHostBufferSize - may vary for Exclusive or Full-duplex + bufferMode = paUtilFixedHostBufferSize; + if (inputParameters) // !!! WASAPI IAudioCaptureClient::GetBuffer extracts not number of frames but 1 packet, thus we always must adapt + bufferMode = paUtilBoundedHostBufferSize; + else + if (outputParameters) + { + if ((stream->out.buffers == 1) && + (!stream->out.streamFlags || ((stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) + bufferMode = paUtilBoundedHostBufferSize; + } + stream->bufferMode = bufferMode; + + // Initialize buffer processor + result = PaUtil_InitializeBufferProcessor( + &stream->bufferProcessor, + inputChannelCount, + inputSampleFormat, + hostInputSampleFormat, + outputChannelCount, + outputSampleFormat, + hostOutputSampleFormat, + sampleRate, + streamFlags, + framesPerBuffer, + framesPerHostCallback, + bufferMode, + streamCallback, + userData); + if (result != paNoError) + { + LogPaError(result); + goto error; + } + + // Set Input latency + stream->streamRepresentation.streamInfo.inputLatency = + ((double)PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) / sampleRate) + + ((inputParameters)?stream->in.latencySeconds : 0); + + // Set Output latency + stream->streamRepresentation.streamInfo.outputLatency = + ((double)PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) / sampleRate) + + ((outputParameters)?stream->out.latencySeconds : 0); + + // Set SR + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + (*s) = (PaStream *)stream; + return result; + +error: + + if (stream != NULL) + CloseStream(stream); + + return result; +} + +// ------------------------------------------------------------------------------------------ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaWasapiStream *stream = (PaWasapiStream*)s; + + // abort active stream + if (IsStreamActive(s)) + { + result = AbortStream(s); + } + + SAFE_RELEASE(stream->captureClientParent); + SAFE_RELEASE(stream->renderClientParent); + SAFE_RELEASE(stream->out.clientParent); + SAFE_RELEASE(stream->in.clientParent); + SAFE_RELEASE(stream->inVol); + SAFE_RELEASE(stream->outVol); + + CloseHandle(stream->event[S_INPUT]); + CloseHandle(stream->event[S_OUTPUT]); + + _StreamCleanup(stream); + + PaWasapi_FreeMemory(stream->in.monoBuffer); + PaWasapi_FreeMemory(stream->out.monoBuffer); + + PaUtil_FreeMemory(stream->in.tailBuffer); + PaUtil_FreeMemory(stream->in.tailBufferMemory); + + PaUtil_FreeMemory(stream->out.tailBuffer); + PaUtil_FreeMemory(stream->out.tailBufferMemory); + + PaUtil_TerminateBufferProcessor(&stream->bufferProcessor); + PaUtil_TerminateStreamRepresentation(&stream->streamRepresentation); + PaUtil_FreeMemory(stream); + + return result; +} + +// ------------------------------------------------------------------------------------------ +HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) +{ + HRESULT hResult = S_OK; + HRESULT hFirstBadResult = S_OK; + substream->clientProc = NULL; + + // IAudioClient + hResult = CoGetInterfaceAndReleaseStream(substream->clientStream, &pa_IID_IAudioClient, (LPVOID*)&substream->clientProc); + substream->clientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + + return hFirstBadResult; +} + +// ------------------------------------------------------------------------------------------ +HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) +{ + HRESULT hResult = S_OK; + HRESULT hFirstBadResult = S_OK; + stream->captureClient = NULL; + stream->renderClient = NULL; + stream->in.clientProc = NULL; + stream->out.clientProc = NULL; + + if (NULL != stream->in.clientParent) + { + // SubStream pointers + hResult = UnmarshalSubStreamComPointers(&stream->in); + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + + // IAudioCaptureClient + hResult = CoGetInterfaceAndReleaseStream(stream->captureClientStream, &pa_IID_IAudioCaptureClient, (LPVOID*)&stream->captureClient); + stream->captureClientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + } + + if (NULL != stream->out.clientParent) + { + // SubStream pointers + hResult = UnmarshalSubStreamComPointers(&stream->out); + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + + // IAudioRenderClient + hResult = CoGetInterfaceAndReleaseStream(stream->renderClientStream, &pa_IID_IAudioRenderClient, (LPVOID*)&stream->renderClient); + stream->renderClientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + } + + return hFirstBadResult; +} + +// ----------------------------------------------------------------------------------------- +void ReleaseUnmarshaledSubComPointers(PaWasapiSubStream *substream) +{ + SAFE_RELEASE(substream->clientProc); +} + +// ----------------------------------------------------------------------------------------- +void ReleaseUnmarshaledComPointers(PaWasapiStream *stream) +{ + // Release AudioClient services first + SAFE_RELEASE(stream->captureClient); + SAFE_RELEASE(stream->renderClient); + + // Release AudioClients + ReleaseUnmarshaledSubComPointers(&stream->in); + ReleaseUnmarshaledSubComPointers(&stream->out); +} + +// ------------------------------------------------------------------------------------------ +HRESULT MarshalSubStreamComPointers(PaWasapiSubStream *substream) +{ + HRESULT hResult; + substream->clientStream = NULL; + + // IAudioClient + hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioClient, (LPUNKNOWN)substream->clientParent, &substream->clientStream); + if (hResult != S_OK) + goto marshal_sub_error; + + return hResult; + + // If marshaling error occurred, make sure to release everything. +marshal_sub_error: + + UnmarshalSubStreamComPointers(substream); + ReleaseUnmarshaledSubComPointers(substream); + return hResult; +} + +// ------------------------------------------------------------------------------------------ +HRESULT MarshalStreamComPointers(PaWasapiStream *stream) +{ + HRESULT hResult = S_OK; + stream->captureClientStream = NULL; + stream->in.clientStream = NULL; + stream->renderClientStream = NULL; + stream->out.clientStream = NULL; + + if (NULL != stream->in.clientParent) + { + // SubStream pointers + hResult = MarshalSubStreamComPointers(&stream->in); + if (hResult != S_OK) + goto marshal_error; + + // IAudioCaptureClient + hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioCaptureClient, (LPUNKNOWN)stream->captureClientParent, &stream->captureClientStream); + if (hResult != S_OK) + goto marshal_error; + } + + if (NULL != stream->out.clientParent) + { + // SubStream pointers + hResult = MarshalSubStreamComPointers(&stream->out); + if (hResult != S_OK) + goto marshal_error; + + // IAudioRenderClient + hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioRenderClient, (LPUNKNOWN)stream->renderClientParent, &stream->renderClientStream); + if (hResult != S_OK) + goto marshal_error; + } + + return hResult; + + // If marshaling error occurred, make sure to release everything. +marshal_error: + + UnmarshalStreamComPointers(stream); + ReleaseUnmarshaledComPointers(stream); + return hResult; +} + +// ------------------------------------------------------------------------------------------ +static PaError StartStream( PaStream *s ) +{ + HRESULT hr; + PaWasapiStream *stream = (PaWasapiStream*)s; + PaError result = paNoError; + + // check if stream is active already + if (IsStreamActive(s)) + return paStreamIsNotStopped; + + PaUtil_ResetBufferProcessor(&stream->bufferProcessor); + + // Cleanup handles (may be necessary if stream was stopped by itself due to error) + _StreamCleanup(stream); + + // Create close event + if ((stream->hCloseRequest = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } + + // Create thread + if (!stream->bBlocking) + { + // Create thread events + stream->hThreadStart = CreateEvent(NULL, TRUE, FALSE, NULL); + stream->hThreadExit = CreateEvent(NULL, TRUE, FALSE, NULL); + if ((stream->hThreadStart == NULL) || (stream->hThreadExit == NULL)) + { + result = paInsufficientMemory; + goto start_error; + } + + // Marshal WASAPI interface pointers for safe use in thread created below. + if ((hr = MarshalStreamComPointers(stream)) != S_OK) + { + PRINT(("Failed marshaling stream COM pointers.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + + if ((stream->in.clientParent && (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) || + (stream->out.clientParent && (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK))) + { + if ((stream->hThread = CREATE_THREAD(ProcThreadEvent)) == NULL) + { + PRINT(("Failed creating thread: ProcThreadEvent.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } + else + { + if ((stream->hThread = CREATE_THREAD(ProcThreadPoll)) == NULL) + { + PRINT(("Failed creating thread: ProcThreadPoll.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } + + // Wait for thread to start + if (WaitForSingleObject(stream->hThreadStart, 60*1000) == WAIT_TIMEOUT) + { + PRINT(("Failed starting thread: timeout.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } + else + { + // Create blocking operation events (non-signaled event means - blocking operation is pending) + if (stream->out.clientParent != NULL) + { + if ((stream->hBlockingOpStreamWR = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } + } + if (stream->in.clientParent != NULL) + { + if ((stream->hBlockingOpStreamRD = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } + } + + // Initialize event & start INPUT stream + if (stream->in.clientParent != NULL) + { + if ((hr = IAudioClient_Start(stream->in.clientParent)) != S_OK) + { + LogHostError(hr); + result = paUnanticipatedHostError; + goto start_error; + } + } + + // Initialize event & start OUTPUT stream + if (stream->out.clientParent != NULL) + { + // Start + if ((hr = IAudioClient_Start(stream->out.clientParent)) != S_OK) + { + LogHostError(hr); + result = paUnanticipatedHostError; + goto start_error; + } + } + + // Set parent to working pointers to use shared functions. + stream->captureClient = stream->captureClientParent; + stream->renderClient = stream->renderClientParent; + stream->in.clientProc = stream->in.clientParent; + stream->out.clientProc = stream->out.clientParent; + + // Signal: stream running. + stream->running = TRUE; + } + + return result; + +nonblocking_start_error: + + // Set hThreadExit event to prevent blocking during cleanup + SetEvent(stream->hThreadExit); + UnmarshalStreamComPointers(stream); + ReleaseUnmarshaledComPointers(stream); + +start_error: + + StopStream(s); + return result; +} + +// ------------------------------------------------------------------------------------------ +void _StreamFinish(PaWasapiStream *stream) +{ + // Issue command to thread to stop processing and wait for thread exit + if (!stream->bBlocking) + { + SignalObjectAndWait(stream->hCloseRequest, stream->hThreadExit, INFINITE, FALSE); + } + else + // Blocking mode does not own thread + { + // Signal close event and wait for each of 2 blocking operations to complete + if (stream->out.clientParent) + SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamWR, INFINITE, TRUE); + if (stream->out.clientParent) + SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamRD, INFINITE, TRUE); + + // Process stop + _StreamOnStop(stream); + } + + // Cleanup handles + _StreamCleanup(stream); + + stream->running = FALSE; +} + +// ------------------------------------------------------------------------------------------ +void _StreamCleanup(PaWasapiStream *stream) +{ + // Close thread handles to allow restart + SAFE_CLOSE(stream->hThread); + SAFE_CLOSE(stream->hThreadStart); + SAFE_CLOSE(stream->hThreadExit); + SAFE_CLOSE(stream->hCloseRequest); + SAFE_CLOSE(stream->hBlockingOpStreamRD); + SAFE_CLOSE(stream->hBlockingOpStreamWR); +} + +// ------------------------------------------------------------------------------------------ +static PaError StopStream( PaStream *s ) +{ + // Finish stream + _StreamFinish((PaWasapiStream *)s); + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +static PaError AbortStream( PaStream *s ) +{ + // Finish stream + _StreamFinish((PaWasapiStream *)s); + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +static PaError IsStreamStopped( PaStream *s ) +{ + return !((PaWasapiStream *)s)->running; +} + +// ------------------------------------------------------------------------------------------ +static PaError IsStreamActive( PaStream *s ) +{ + return ((PaWasapiStream *)s)->running; +} + +// ------------------------------------------------------------------------------------------ +static PaTime GetStreamTime( PaStream *s ) +{ + PaWasapiStream *stream = (PaWasapiStream*)s; + + /* suppress unused variable warnings */ + (void) stream; + + return PaUtil_GetTime(); +} + +// ------------------------------------------------------------------------------------------ +static double GetStreamCpuLoad( PaStream* s ) +{ + return PaUtil_GetCpuLoad(&((PaWasapiStream *)s)->cpuLoadMeasurer); +} + +// ------------------------------------------------------------------------------------------ +static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames ) +{ + PaWasapiStream *stream = (PaWasapiStream*)s; + + HRESULT hr = S_OK; + BYTE *user_buffer = (BYTE *)_buffer; + BYTE *wasapi_buffer = NULL; + DWORD flags = 0; + UINT32 i, available, sleep = 0; + unsigned long processed; + ThreadIdleScheduler sched; + + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->captureClient == NULL) + return paBadStreamPtr; + + // Notify blocking op has begun + ResetEvent(stream->hBlockingOpStreamRD); + + // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than + // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting + ThreadIdleScheduler_Setup(&sched, 1, 250/* microseconds */); + + // Make a local copy of the user buffer pointer(s), this is necessary + // because PaUtil_CopyOutput() advances these pointers every time it is called + if (!stream->bufferProcessor.userInputIsInterleaved) + { + user_buffer = (BYTE *)alloca(sizeof(BYTE *) * stream->bufferProcessor.inputChannelCount); + if (user_buffer == NULL) + return paInsufficientMemory; + + for (i = 0; i < stream->bufferProcessor.inputChannelCount; ++i) + ((BYTE **)user_buffer)[i] = ((BYTE **)_buffer)[i]; + } + + // Findout if there are tail frames, flush them all before reading hardware + if ((available = PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer)) != 0) + { + ring_buffer_size_t buf1_size = 0, buf2_size = 0, read, desired; + void *buf1 = NULL, *buf2 = NULL; + + // Limit desired to amount of requested frames + desired = available; + if (desired > frames) + desired = frames; + + // Get pointers to read regions + read = PaUtil_GetRingBufferReadRegions(stream->in.tailBuffer, desired, &buf1, &buf1_size, &buf2, &buf2_size); + + if (buf1 != NULL) + { + // Register available frames to processor + PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf1_size); + + // Register host buffer pointer to processor + PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf1, stream->bufferProcessor.inputChannelCount); + + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf1_size); + frames -= processed; + } + + if (buf2 != NULL) + { + // Register available frames to processor + PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf2_size); + + // Register host buffer pointer to processor + PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf2, stream->bufferProcessor.inputChannelCount); + + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf2_size); + frames -= processed; + } + + // Advance + PaUtil_AdvanceRingBufferReadIndex(stream->in.tailBuffer, read); + } + + // Read hardware + while (frames != 0) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) + break; + + // Get available frames (must be finding out available frames before call to IAudioCaptureClient_GetBuffer + // othervise audio glitches will occur inExclusive mode as it seems that WASAPI has some scheduling/ + // processing problems when such busy polling with IAudioCaptureClient_GetBuffer occurs) + if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } + + // Wait for more frames to become available + if (available == 0) + { + // Exclusive mode may require latency of 1 millisecond, thus we shall sleep + // around 500 microseconds (emulated) to collect packets in time + if (stream->in.shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) + { + UINT32 sleep_frames = (frames < stream->in.framesPerHostCallback ? frames : stream->in.framesPerHostCallback); + + sleep = GetFramesSleepTime(sleep_frames, stream->in.wavex.Format.nSamplesPerSec); + sleep /= 4; // wait only for 1/4 of the buffer + + // WASAPI input provides packets, thus expiring packet will result in bad audio + // limit waiting time to 2 seconds (will always work for smallest buffer in Shared) + if (sleep > 2) + sleep = 2; + + // Avoid busy waiting, schedule next 1 millesecond wait + if (sleep == 0) + sleep = ThreadIdleScheduler_NextSleep(&sched); + } + else + { + if ((sleep = ThreadIdleScheduler_NextSleep(&sched)) != 0) + { + Sleep(sleep); + sleep = 0; + } + } + + continue; + } + + // Get the available data in the shared buffer. + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &wasapi_buffer, &available, &flags, NULL, NULL)) != S_OK) + { + // Buffer size is too small, waiting + if (hr != AUDCLNT_S_BUFFER_EMPTY) + { + LogHostError(hr); + goto end; + } + + continue; + } + + // Register available frames to processor + PaUtil_SetInputFrameCount(&stream->bufferProcessor, available); + + // Register host buffer pointer to processor + PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, wasapi_buffer, stream->bufferProcessor.inputChannelCount); + + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, frames); + frames -= processed; + + // Save tail into buffer + if ((frames == 0) && (available > processed)) + { + UINT32 bytes_processed = processed * stream->in.wavex.Format.nBlockAlign; + UINT32 frames_to_save = available - processed; + + PaUtil_WriteRingBuffer(stream->in.tailBuffer, wasapi_buffer + bytes_processed, frames_to_save); + } + + // Release host buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, available)) != S_OK) + { + LogHostError(hr); + goto end; + } + } + +end: + + // Notify blocking op has ended + SetEvent(stream->hBlockingOpStreamRD); + + return (hr != S_OK ? paUnanticipatedHostError : paNoError); +} + +// ------------------------------------------------------------------------------------------ +static PaError WriteStream( PaStream* s, const void *_buffer, unsigned long frames ) +{ + PaWasapiStream *stream = (PaWasapiStream*)s; + + //UINT32 frames; + const BYTE *user_buffer = (const BYTE *)_buffer; + BYTE *wasapi_buffer; + HRESULT hr = S_OK; + UINT32 i, available, sleep = 0; + unsigned long processed; + ThreadIdleScheduler sched; + + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->renderClient == NULL) + return paBadStreamPtr; + + // Notify blocking op has begun + ResetEvent(stream->hBlockingOpStreamWR); + + // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than + // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting + ThreadIdleScheduler_Setup(&sched, 1, 500/* microseconds */); + + // Make a local copy of the user buffer pointer(s), this is necessary + // because PaUtil_CopyOutput() advances these pointers every time it is called + if (!stream->bufferProcessor.userOutputIsInterleaved) + { + user_buffer = (const BYTE *)alloca(sizeof(const BYTE *) * stream->bufferProcessor.outputChannelCount); + if (user_buffer == NULL) + return paInsufficientMemory; + + for (i = 0; i < stream->bufferProcessor.outputChannelCount; ++i) + ((const BYTE **)user_buffer)[i] = ((const BYTE **)_buffer)[i]; + } + + // Blocking (potentially, untill 'frames' are consumed) loop + while (frames != 0) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) + break; + + // Get frames available + if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + goto end; + } + + // Wait for more frames to become available + if (available == 0) + { + UINT32 sleep_frames = (frames < stream->out.framesPerHostCallback ? frames : stream->out.framesPerHostCallback); + + sleep = GetFramesSleepTime(sleep_frames, stream->out.wavex.Format.nSamplesPerSec); + sleep /= 2; // wait only for half of the buffer + + // Avoid busy waiting, schedule next 1 millesecond wait + if (sleep == 0) + sleep = ThreadIdleScheduler_NextSleep(&sched); + + continue; + } + + // Keep in 'frmaes' range + if (available > frames) + available = frames; + + // Get pointer to host buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, available, &wasapi_buffer)) != S_OK) + { + // Buffer size is too big, waiting + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + continue; + + LogHostError(hr); + goto end; + } + + // Keep waiting again (on Vista it was noticed that WASAPI could SOMETIMES return NULL pointer + // to buffer without returning AUDCLNT_E_BUFFER_TOO_LARGE instead) + if (wasapi_buffer == NULL) + continue; + + // Register available frames to processor + PaUtil_SetOutputFrameCount(&stream->bufferProcessor, available); + + // Register host buffer pointer to processor + PaUtil_SetInterleavedOutputChannels(&stream->bufferProcessor, 0, wasapi_buffer, stream->bufferProcessor.outputChannelCount); + + // Copy user data to host buffer (with conversion if applicable), this call will advance + // pointer 'user_buffer' to consumed portion of data + processed = PaUtil_CopyOutput(&stream->bufferProcessor, (const void **)&user_buffer, frames); + frames -= processed; + + // Release host buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, available, 0)) != S_OK) + { + LogHostError(hr); + goto end; + } + } + +end: + + // Notify blocking op has ended + SetEvent(stream->hBlockingOpStreamWR); + + return (hr != S_OK ? paUnanticipatedHostError : paNoError); +} + +unsigned long PaUtil_GetOutputFrameCount( PaUtilBufferProcessor* bp ) +{ + return bp->hostOutputFrameCount[0]; +} + +// ------------------------------------------------------------------------------------------ +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaWasapiStream *stream = (PaWasapiStream*)s; + + HRESULT hr; + UINT32 available = 0; + + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->captureClient == NULL) + return paBadStreamPtr; + + // available in hardware buffer + if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } + + // available in software tail buffer + available += PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer); + + return available; +} + +// ------------------------------------------------------------------------------------------ +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaWasapiStream *stream = (PaWasapiStream*)s; + HRESULT hr; + UINT32 available = 0; + + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->renderClient == NULL) + return paBadStreamPtr; + + if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } + + return (signed long)available; +} + + +// ------------------------------------------------------------------------------------------ +static void WaspiHostProcessingLoop( void *inputBuffer, long inputFrames, + void *outputBuffer, long outputFrames, + void *userData ) +{ + PaWasapiStream *stream = (PaWasapiStream*)userData; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; + PaStreamCallbackFlags flags = 0; + int callbackResult; + unsigned long framesProcessed; + HRESULT hr; + UINT32 pending; + + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + /* + Pa_GetStreamTime: + - generate timing information + - handle buffer slips + */ + timeInfo.currentTime = PaUtil_GetTime(); + // Query input latency + if (stream->in.clientProc != NULL) + { + PaTime pending_time; + if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, &pending)) == S_OK) + pending_time = (PaTime)pending / (PaTime)stream->in.wavex.Format.nSamplesPerSec; + else + pending_time = (PaTime)stream->in.latencySeconds; + + timeInfo.inputBufferAdcTime = timeInfo.currentTime + pending_time; + } + // Query output current latency + if (stream->out.clientProc != NULL) + { + PaTime pending_time; + if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &pending)) == S_OK) + pending_time = (PaTime)pending / (PaTime)stream->out.wavex.Format.nSamplesPerSec; + else + pending_time = (PaTime)stream->out.latencySeconds; + + timeInfo.outputBufferDacTime = timeInfo.currentTime + pending_time; + } + + /* + If you need to byte swap or shift inputBuffer to convert it into a + portaudio format, do it here. + */ + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, flags ); + + /* + depending on whether the host buffers are interleaved, non-interleaved + or a mixture, you will want to call PaUtil_SetInterleaved*Channels(), + PaUtil_SetNonInterleaved*Channel() or PaUtil_Set*Channel() here. + */ + + if (stream->bufferProcessor.inputChannelCount > 0) + { + PaUtil_SetInputFrameCount( &stream->bufferProcessor, inputFrames ); + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, + 0, /* first channel of inputBuffer is channel 0 */ + inputBuffer, + 0 ); /* 0 - use inputChannelCount passed to init buffer processor */ + } + + if (stream->bufferProcessor.outputChannelCount > 0) + { + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, outputFrames); + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, + 0, /* first channel of outputBuffer is channel 0 */ + outputBuffer, + 0 ); /* 0 - use outputChannelCount passed to init buffer processor */ + } + + /* you must pass a valid value of callback result to PaUtil_EndBufferProcessing() + in general you would pass paContinue for normal operation, and + paComplete to drain the buffer processor's internal output buffer. + You can check whether the buffer processor's output buffer is empty + using PaUtil_IsBufferProcessorOuputEmpty( bufferProcessor ) + */ + callbackResult = paContinue; + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + + /* + If you need to byte swap or shift outputBuffer to convert it to + host format, do it here. + */ + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + + if (callbackResult == paContinue) + { + /* nothing special to do */ + } + else + if (callbackResult == paAbort) + { + // stop stream + SetEvent(stream->hCloseRequest); + } + else + { + // stop stream + SetEvent(stream->hCloseRequest); + } +} + +// ------------------------------------------------------------------------------------------ +HANDLE MMCSS_activate(const char *name) +{ + DWORD task_idx = 0; + HANDLE hTask = pAvSetMmThreadCharacteristics(name, &task_idx); + if (hTask == NULL) + { + PRINT(("WASAPI: AvSetMmThreadCharacteristics failed!\n")); + } + + /*BOOL priority_ok = pAvSetMmThreadPriority(hTask, AVRT_PRIORITY_NORMAL); + if (priority_ok == FALSE) + { + PRINT(("WASAPI: AvSetMmThreadPriority failed!\n")); + }*/ + + // debug + { + int cur_priority = GetThreadPriority(GetCurrentThread()); + DWORD cur_priority_class = GetPriorityClass(GetCurrentProcess()); + PRINT(("WASAPI: thread[ priority-0x%X class-0x%X ]\n", cur_priority, cur_priority_class)); + } + + return hTask; +} + +// ------------------------------------------------------------------------------------------ +void MMCSS_deactivate(HANDLE hTask) +{ + if (!hTask) + return; + + if (pAvRevertMmThreadCharacteristics(hTask) == FALSE) + { + PRINT(("WASAPI: AvRevertMmThreadCharacteristics failed!\n")); + } +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_ThreadPriorityBoost(void **hTask, PaWasapiThreadPriority nPriorityClass) +{ + static const char *mmcs_name[] = + { + NULL, + "Audio", + "Capture", + "Distribution", + "Games", + "Playback", + "Pro Audio", + "Window Manager" + }; + HANDLE task; + + if (hTask == NULL) + return paUnanticipatedHostError; + + if ((UINT32)nPriorityClass >= STATIC_ARRAY_SIZE(mmcs_name)) + return paUnanticipatedHostError; + + task = MMCSS_activate(mmcs_name[nPriorityClass]); + if (task == NULL) + return paUnanticipatedHostError; + + (*hTask) = task; + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_ThreadPriorityRevert(void *hTask) +{ + if (hTask == NULL) + return paUnanticipatedHostError; + + MMCSS_deactivate((HANDLE)hTask); + + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +// Described at: +// http://msdn.microsoft.com/en-us/library/dd371387(v=VS.85).aspx + +PaError PaWasapi_GetJackCount(PaDeviceIndex nDevice, int *jcount) +{ + PaError ret; + HRESULT hr = S_OK; + PaDeviceIndex index; + IDeviceTopology *pDeviceTopology = NULL; + IConnector *pConnFrom = NULL; + IConnector *pConnTo = NULL; + IPart *pPart = NULL; + IKsJackDescription *pJackDesc = NULL; + UINT jackCount = 0; + + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + // Get device index. + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + // Validate index. + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + // Get the endpoint device's IDeviceTopology interface. + hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); + IF_FAILED_JUMP(hr, error); + + // The device topology for an endpoint device always contains just one connector (connector number 0). + hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); + IF_FAILED_JUMP(hr, error); + + // Step across the connection to the jack on the adapter. + hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); + if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) + { + // The adapter device is not currently active. + hr = E_NOINTERFACE; + } + IF_FAILED_JUMP(hr, error); + + // Get the connector's IPart interface. + hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); + IF_FAILED_JUMP(hr, error); + + // Activate the connector's IKsJackDescription interface. + hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); + IF_FAILED_JUMP(hr, error); + + // Return jack count for this device. + hr = IKsJackDescription_GetJackCount(pJackDesc, &jackCount); + IF_FAILED_JUMP(hr, error); + + // Set. + (*jcount) = jackCount; + + // Ok. + ret = paNoError; + +error: + + SAFE_RELEASE(pDeviceTopology); + SAFE_RELEASE(pConnFrom); + SAFE_RELEASE(pConnTo); + SAFE_RELEASE(pPart); + SAFE_RELEASE(pJackDesc); + + LogHostError(hr); + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +static PaWasapiJackConnectionType ConvertJackConnectionTypeWASAPIToPA(int connType) +{ + switch (connType) + { + case eConnTypeUnknown: return eJackConnTypeUnknown; +#ifdef _KS_ + case eConnType3Point5mm: return eJackConnType3Point5mm; +#else + case eConnTypeEighth: return eJackConnType3Point5mm; +#endif + case eConnTypeQuarter: return eJackConnTypeQuarter; + case eConnTypeAtapiInternal: return eJackConnTypeAtapiInternal; + case eConnTypeRCA: return eJackConnTypeRCA; + case eConnTypeOptical: return eJackConnTypeOptical; + case eConnTypeOtherDigital: return eJackConnTypeOtherDigital; + case eConnTypeOtherAnalog: return eJackConnTypeOtherAnalog; + case eConnTypeMultichannelAnalogDIN: return eJackConnTypeMultichannelAnalogDIN; + case eConnTypeXlrProfessional: return eJackConnTypeXlrProfessional; + case eConnTypeRJ11Modem: return eJackConnTypeRJ11Modem; + case eConnTypeCombination: return eJackConnTypeCombination; + } + return eJackConnTypeUnknown; +} + +// ------------------------------------------------------------------------------------------ +static PaWasapiJackGeoLocation ConvertJackGeoLocationWASAPIToPA(int geoLoc) +{ + switch (geoLoc) + { + case eGeoLocRear: return eJackGeoLocRear; + case eGeoLocFront: return eJackGeoLocFront; + case eGeoLocLeft: return eJackGeoLocLeft; + case eGeoLocRight: return eJackGeoLocRight; + case eGeoLocTop: return eJackGeoLocTop; + case eGeoLocBottom: return eJackGeoLocBottom; +#ifdef _KS_ + case eGeoLocRearPanel: return eJackGeoLocRearPanel; +#else + case eGeoLocRearOPanel: return eJackGeoLocRearPanel; +#endif + case eGeoLocRiser: return eJackGeoLocRiser; + case eGeoLocInsideMobileLid: return eJackGeoLocInsideMobileLid; + case eGeoLocDrivebay: return eJackGeoLocDrivebay; + case eGeoLocHDMI: return eJackGeoLocHDMI; + case eGeoLocOutsideMobileLid: return eJackGeoLocOutsideMobileLid; + case eGeoLocATAPI: return eJackGeoLocATAPI; + } + return eJackGeoLocUnk; +} + +// ------------------------------------------------------------------------------------------ +static PaWasapiJackGenLocation ConvertJackGenLocationWASAPIToPA(int genLoc) +{ + switch (genLoc) + { + case eGenLocPrimaryBox: return eJackGenLocPrimaryBox; + case eGenLocInternal: return eJackGenLocInternal; +#ifdef _KS_ + case eGenLocSeparate: return eJackGenLocSeparate; +#else + case eGenLocSeperate: return eJackGenLocSeparate; +#endif + case eGenLocOther: return eJackGenLocOther; + } + return eJackGenLocPrimaryBox; +} + +// ------------------------------------------------------------------------------------------ +static PaWasapiJackPortConnection ConvertJackPortConnectionWASAPIToPA(int portConn) +{ + switch (portConn) + { + case ePortConnJack: return eJackPortConnJack; + case ePortConnIntegratedDevice: return eJackPortConnIntegratedDevice; + case ePortConnBothIntegratedAndJack:return eJackPortConnBothIntegratedAndJack; + case ePortConnUnknown: return eJackPortConnUnknown; + } + return eJackPortConnJack; +} + +// ------------------------------------------------------------------------------------------ +// Described at: +// http://msdn.microsoft.com/en-us/library/dd371387(v=VS.85).aspx + +PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJackDescription *pJackDescription) +{ + PaError ret; + HRESULT hr = S_OK; + PaDeviceIndex index; + IDeviceTopology *pDeviceTopology = NULL; + IConnector *pConnFrom = NULL; + IConnector *pConnTo = NULL; + IPart *pPart = NULL; + IKsJackDescription *pJackDesc = NULL; + KSJACK_DESCRIPTION jack = { 0 }; + + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + // Get device index. + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + // Validate index. + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + // Get the endpoint device's IDeviceTopology interface. + hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); + IF_FAILED_JUMP(hr, error); + + // The device topology for an endpoint device always contains just one connector (connector number 0). + hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); + IF_FAILED_JUMP(hr, error); + + // Step across the connection to the jack on the adapter. + hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); + if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) + { + // The adapter device is not currently active. + hr = E_NOINTERFACE; + } + IF_FAILED_JUMP(hr, error); + + // Get the connector's IPart interface. + hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); + IF_FAILED_JUMP(hr, error); + + // Activate the connector's IKsJackDescription interface. + hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); + IF_FAILED_JUMP(hr, error); + + // Test to return jack description struct for index 0. + hr = IKsJackDescription_GetJackDescription(pJackDesc, jindex, &jack); + IF_FAILED_JUMP(hr, error); + + // Convert WASAPI values to PA format. + pJackDescription->channelMapping = jack.ChannelMapping; + pJackDescription->color = jack.Color; + pJackDescription->connectionType = ConvertJackConnectionTypeWASAPIToPA(jack.ConnectionType); + pJackDescription->genLocation = ConvertJackGenLocationWASAPIToPA(jack.GenLocation); + pJackDescription->geoLocation = ConvertJackGeoLocationWASAPIToPA(jack.GeoLocation); + pJackDescription->isConnected = jack.IsConnected; + pJackDescription->portConnection = ConvertJackPortConnectionWASAPIToPA(jack.PortConnection); + + // Ok. + ret = paNoError; + +error: + + SAFE_RELEASE(pDeviceTopology); + SAFE_RELEASE(pConnFrom); + SAFE_RELEASE(pConnTo); + SAFE_RELEASE(pPart); + SAFE_RELEASE(pJackDesc); + + LogHostError(hr); + return ret; +} + +// ------------------------------------------------------------------------------------------ +HRESULT _PollGetOutputFramesAvailable(PaWasapiStream *stream, UINT32 *available) +{ + HRESULT hr; + UINT32 frames = stream->out.framesPerHostCallback, + padding = 0; + + (*available) = 0; + + // get read position + if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding)) != S_OK) + return LogHostError(hr); + + // get available + frames -= padding; + + // set + (*available) = frames; + return hr; +} + +// ------------------------------------------------------------------------------------------ +HRESULT _PollGetInputFramesAvailable(PaWasapiStream *stream, UINT32 *available) +{ + HRESULT hr; + + (*available) = 0; + + // GetCurrentPadding() has opposite meaning to Output stream + if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, available)) != S_OK) + return LogHostError(hr); + + return hr; +} + +// ------------------------------------------------------------------------------------------ +HRESULT ProcessOutputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor *processor, UINT32 frames) +{ + HRESULT hr; + BYTE *data = NULL; + + // Get buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) + { + if (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) + { + // Using GetCurrentPadding to overcome AUDCLNT_E_BUFFER_TOO_LARGE in + // shared mode results in no sound in Event-driven mode (MSDN does not + // document this, or is it WASAPI bug?), thus we better + // try to acquire buffer next time when GetBuffer allows to do so. +#if 0 + // Get Read position + UINT32 padding = 0; + hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding); + if (hr != S_OK) + return LogHostError(hr); + + // Get frames to write + frames -= padding; + if (frames == 0) + return S_OK; + + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) + return LogHostError(hr); +#else + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + return S_OK; // be silent in shared mode, try again next time +#endif + } + else + return LogHostError(hr); + } + + // Process data + if (stream->out.monoMixer != NULL) + { + // expand buffer + UINT32 mono_frames_size = frames * (stream->out.wavex.Format.wBitsPerSample / 8); + if (mono_frames_size > stream->out.monoBufferSize) + stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); + + // process + processor[S_OUTPUT].processor(NULL, 0, (BYTE *)stream->out.monoBuffer, frames, processor[S_OUTPUT].userData); + + // mix 1 to 2 channels + stream->out.monoMixer(data, stream->out.monoBuffer, frames); + } + else + { + processor[S_OUTPUT].processor(NULL, 0, data, frames, processor[S_OUTPUT].userData); + } + + // Release buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, frames, 0)) != S_OK) + LogHostError(hr); + + return hr; +} + +// ------------------------------------------------------------------------------------------ +HRESULT ProcessInputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor *processor) +{ + HRESULT hr = S_OK; + UINT32 frames; + BYTE *data = NULL; + DWORD flags = 0; + + for (;;) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) + break; + + // Findout if any frames available + frames = 0; + if ((hr = _PollGetInputFramesAvailable(stream, &frames)) != S_OK) + return hr; + + // Empty/consumed buffer + if (frames == 0) + break; + + // Get the available data in the shared buffer. + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &data, &frames, &flags, NULL, NULL)) != S_OK) + { + if (hr == AUDCLNT_S_BUFFER_EMPTY) + { + hr = S_OK; + break; // Empty/consumed buffer + } + + return LogHostError(hr); + break; + } + + // Detect silence + // if (flags & AUDCLNT_BUFFERFLAGS_SILENT) + // data = NULL; + + // Process data + if (stream->in.monoMixer != NULL) + { + // expand buffer + UINT32 mono_frames_size = frames * (stream->in.wavex.Format.wBitsPerSample / 8); + if (mono_frames_size > stream->in.monoBufferSize) + stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); + + // mix 1 to 2 channels + stream->in.monoMixer(stream->in.monoBuffer, data, frames); + + // process + processor[S_INPUT].processor((BYTE *)stream->in.monoBuffer, frames, NULL, 0, processor[S_INPUT].userData); + } + else + { + processor[S_INPUT].processor(data, frames, NULL, 0, processor[S_INPUT].userData); + } + + // Release buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, frames)) != S_OK) + return LogHostError(hr); + + //break; + } + + return hr; +} + +// ------------------------------------------------------------------------------------------ +void _StreamOnStop(PaWasapiStream *stream) +{ + // Stop INPUT/OUTPUT clients + if (!stream->bBlocking) + { + if (stream->in.clientProc != NULL) + IAudioClient_Stop(stream->in.clientProc); + if (stream->out.clientProc != NULL) + IAudioClient_Stop(stream->out.clientProc); + } + else + { + if (stream->in.clientParent != NULL) + IAudioClient_Stop(stream->in.clientParent); + if (stream->out.clientParent != NULL) + IAudioClient_Stop(stream->out.clientParent); + } + + // Restore thread priority + if (stream->hAvTask != NULL) + { + PaWasapi_ThreadPriorityRevert(stream->hAvTask); + stream->hAvTask = NULL; + } + + // Notify + if (stream->streamRepresentation.streamFinishedCallback != NULL) + stream->streamRepresentation.streamFinishedCallback(stream->streamRepresentation.userData); +} + +// ------------------------------------------------------------------------------------------ +PA_THREAD_FUNC ProcThreadEvent(void *param) +{ + PaWasapiHostProcessor processor[S_COUNT]; + HRESULT hr; + DWORD dwResult; + PaWasapiStream *stream = (PaWasapiStream *)param; + PaWasapiHostProcessor defaultProcessor; + BOOL set_event[S_COUNT] = { FALSE, FALSE }; + BOOL bWaitAllEvents = FALSE; + BOOL bThreadComInitialized = FALSE; + + /* + If COM is already initialized CoInitialize will either return + FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different + threading mode. In either case we shouldn't consider it an error + but we need to be careful to not call CoUninitialize() if + RPC_E_CHANGED_MODE was returned. + */ + hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) + { + PRINT(("WASAPI: failed ProcThreadEvent CoInitialize")); + return paUnanticipatedHostError; + } + if (hr != RPC_E_CHANGED_MODE) + bThreadComInitialized = TRUE; + + // Unmarshal stream pointers for safe COM operation + hr = UnmarshalStreamComPointers(stream); + if (hr != S_OK) { + PRINT(("Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); + goto thread_end; + } + + // Waiting on all events in case of Full-Duplex/Exclusive mode. + if ((stream->in.clientProc != NULL) && (stream->out.clientProc != NULL)) + { + bWaitAllEvents = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && + (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE); + } + + // Setup data processors + defaultProcessor.processor = WaspiHostProcessingLoop; + defaultProcessor.userData = stream; + processor[S_INPUT] = (stream->hostProcessOverrideInput.processor != NULL ? stream->hostProcessOverrideInput : defaultProcessor); + processor[S_OUTPUT] = (stream->hostProcessOverrideOutput.processor != NULL ? stream->hostProcessOverrideOutput : defaultProcessor); + + // Boost thread priority + PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + + // Create events + if (stream->event[S_OUTPUT] == NULL) + { + stream->event[S_OUTPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); + set_event[S_OUTPUT] = TRUE; + } + if (stream->event[S_INPUT] == NULL) + { + stream->event[S_INPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); + set_event[S_INPUT] = TRUE; + } + if ((stream->event[S_OUTPUT] == NULL) || (stream->event[S_INPUT] == NULL)) + { + PRINT(("WASAPI Thread: failed creating Input/Output event handle\n")); + goto thread_error; + } + + // Initialize event & start INPUT stream + if (stream->in.clientProc) + { + // Create & set handle + if (set_event[S_INPUT]) + { + if ((hr = IAudioClient_SetEventHandle(stream->in.clientProc, stream->event[S_INPUT])) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Start + if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Initialize event & start OUTPUT stream + if (stream->out.clientProc) + { + // Create & set handle + if (set_event[S_OUTPUT]) + { + if ((hr = IAudioClient_SetEventHandle(stream->out.clientProc, stream->event[S_OUTPUT])) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Preload buffer before start + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + // Start + if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + } + + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + + // Processing Loop + for (;;) + { + // 10 sec timeout (on timeout stream will auto-stop when processed by WAIT_TIMEOUT case) + dwResult = WaitForMultipleObjects(S_COUNT, stream->event, bWaitAllEvents, 10*1000); + + // Check for close event (after wait for buffers to avoid any calls to user + // callback when hCloseRequest was set) + if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) + break; + + // Process S_INPUT/S_OUTPUT + switch (dwResult) + { + case WAIT_TIMEOUT: { + PRINT(("WASAPI Thread: WAIT_TIMEOUT - probably bad audio driver or Vista x64 bug: use paWinWasapiPolling instead\n")); + goto thread_end; + break; } + + // Input stream + case WAIT_OBJECT_0 + S_INPUT: { + + if (stream->captureClient == NULL) + break; + + if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + break; } + + // Output stream + case WAIT_OBJECT_0 + S_OUTPUT: { + + if (stream->renderClient == NULL) + break; + + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + break; } + } + } + +thread_end: + + // Process stop + _StreamOnStop(stream); + + // Release unmarshaled COM pointers + ReleaseUnmarshaledComPointers(stream); + + // Cleanup COM for this thread + if (bThreadComInitialized == TRUE) + CoUninitialize(); + + // Notify: not running + stream->running = FALSE; + + // Notify: thread exited + SetEvent(stream->hThreadExit); + + return 0; + +thread_error: + + // Prevent deadlocking in Pa_StreamStart + SetEvent(stream->hThreadStart); + + // Exit + goto thread_end; +} + +// ------------------------------------------------------------------------------------------ +PA_THREAD_FUNC ProcThreadPoll(void *param) +{ + PaWasapiHostProcessor processor[S_COUNT]; + HRESULT hr; + PaWasapiStream *stream = (PaWasapiStream *)param; + PaWasapiHostProcessor defaultProcessor; + INT32 i; + ThreadIdleScheduler scheduler; + + // Calculate the actual duration of the allocated buffer. + DWORD sleep_ms = 0; + DWORD sleep_ms_in; + DWORD sleep_ms_out; + + BOOL bThreadComInitialized = FALSE; + + /* + If COM is already initialized CoInitialize will either return + FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different + threading mode. In either case we shouldn't consider it an error + but we need to be careful to not call CoUninitialize() if + RPC_E_CHANGED_MODE was returned. + */ + hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) + { + PRINT(("WASAPI: failed ProcThreadPoll CoInitialize")); + return paUnanticipatedHostError; + } + if (hr != RPC_E_CHANGED_MODE) + bThreadComInitialized = TRUE; + + // Unmarshal stream pointers for safe COM operation + hr = UnmarshalStreamComPointers(stream); + if (hr != S_OK) + { + PRINT(("Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); + return 0; + } + + // Calculate timeout for next polling attempt. + sleep_ms_in = GetFramesSleepTime(stream->in.framesPerHostCallback/WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); + sleep_ms_out = GetFramesSleepTime(stream->out.framesPerBuffer, stream->out.wavex.Format.nSamplesPerSec); + + // WASAPI Input packets tend to expire very easily, let's limit sleep time to 2 milliseconds + // for all cases. Please propose better solution if any. + if (sleep_ms_in > 2) + sleep_ms_in = 2; + + // Adjust polling time for non-paUtilFixedHostBufferSize. Input stream is not adjustable as it is being + // polled according its packet length. + if (stream->bufferMode != paUtilFixedHostBufferSize) + { + //sleep_ms_in = GetFramesSleepTime(stream->bufferProcessor.framesPerUserBuffer, stream->in.wavex.Format.nSamplesPerSec); + sleep_ms_out = GetFramesSleepTime(stream->bufferProcessor.framesPerUserBuffer, stream->out.wavex.Format.nSamplesPerSec); + } + + // Choose smallest + if ((sleep_ms_in != 0) && (sleep_ms_out != 0)) + sleep_ms = min(sleep_ms_in, sleep_ms_out); + else + { + sleep_ms = (sleep_ms_in ? sleep_ms_in : sleep_ms_out); + } + // Make sure not 0, othervise use ThreadIdleScheduler + if (sleep_ms == 0) + { + sleep_ms_in = GetFramesSleepTimeMicroseconds(stream->in.framesPerHostCallback/WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); + sleep_ms_out = GetFramesSleepTimeMicroseconds(stream->bufferProcessor.framesPerUserBuffer, stream->out.wavex.Format.nSamplesPerSec); + + // Choose smallest + if ((sleep_ms_in != 0) && (sleep_ms_out != 0)) + sleep_ms = min(sleep_ms_in, sleep_ms_out); + else + { + sleep_ms = (sleep_ms_in ? sleep_ms_in : sleep_ms_out); + } + + // Setup thread sleep scheduler + ThreadIdleScheduler_Setup(&scheduler, 1, sleep_ms/* microseconds here */); + sleep_ms = 0; + } + + // Setup data processors + defaultProcessor.processor = WaspiHostProcessingLoop; + defaultProcessor.userData = stream; + processor[S_INPUT] = (stream->hostProcessOverrideInput.processor != NULL ? stream->hostProcessOverrideInput : defaultProcessor); + processor[S_OUTPUT] = (stream->hostProcessOverrideOutput.processor != NULL ? stream->hostProcessOverrideOutput : defaultProcessor); + + // Boost thread priority + PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + + // Initialize event & start INPUT stream + if (stream->in.clientProc) + { + if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Initialize event & start OUTPUT stream + if (stream->out.clientProc) + { + // Preload buffer (obligatory, othervise ->Start() will fail), avoid processing + // when in full-duplex mode as it requires input processing as well + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) + { + UINT32 frames = 0; + if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) == S_OK) + { + if (stream->bufferMode == paUtilFixedHostBufferSize) + { + if (frames >= stream->out.framesPerBuffer) + { + frames = stream->out.framesPerBuffer; + + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + { + LogHostError(hr); // not fatal, just log + } + } + } + else + { + if (frames != 0) + { + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + { + LogHostError(hr); // not fatal, just log + } + } + } + } + else + { + LogHostError(hr); // not fatal, just log + } + } + + // Start + if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) + { + // Processing Loop + UINT32 next_sleep = sleep_ms; + while (WaitForSingleObject(stream->hCloseRequest, next_sleep) == WAIT_TIMEOUT) + { + // Get next sleep time + if (sleep_ms == 0) + { + next_sleep = ThreadIdleScheduler_NextSleep(&scheduler); + } + + for (i = 0; i < S_COUNT; ++i) + { + // Process S_INPUT/S_OUTPUT + switch (i) + { + // Input stream + case S_INPUT: { + + if (stream->captureClient == NULL) + break; + + if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + break; } + + // Output stream + case S_OUTPUT: { + + UINT32 frames; + if (stream->renderClient == NULL) + break; + + // get available frames + if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + // output + if (stream->bufferMode == paUtilFixedHostBufferSize) + { + if (frames >= stream->out.framesPerBuffer) + { + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + } + else + { + if (frames != 0) + { + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + } + + break; } + } + } + } + } + else + { +#if 0 + // Processing Loop + while (WaitForSingleObject(stream->hCloseRequest, 1) == WAIT_TIMEOUT) + { + UINT32 i_frames = 0, i_processed = 0; + BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; + DWORD i_flags = 0; + UINT32 o_frames = 0; + + // get host input buffer + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &i_data, &i_frames, &i_flags, NULL, NULL)) != S_OK) + { + if (hr == AUDCLNT_S_BUFFER_EMPTY) + continue; // no data in capture buffer + + LogHostError(hr); + break; + } + + // get available frames + if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + + LogHostError(hr); + break; + } + + // process equal ammount of frames + if (o_frames >= i_frames) + { + // process input ammount of frames + UINT32 o_processed = i_frames; + + // get host output buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->procRCClient, o_processed, &o_data)) == S_OK) + { + // processed amount of i_frames + i_processed = i_frames; + o_data_host = o_data; + + // convert output mono + if (stream->out.monoMixer) + { + UINT32 mono_frames_size = o_processed * (stream->out.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->out.monoBufferSize) + { + stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); + if (stream->out.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + + LogPaError(paInsufficientMemory); + break; + } + } + + // replace buffer pointer + o_data = (BYTE *)stream->out.monoBuffer; + } + + // convert input mono + if (stream->in.monoMixer) + { + UINT32 mono_frames_size = i_processed * (stream->in.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->in.monoBufferSize) + { + stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); + if (stream->in.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + + LogPaError(paInsufficientMemory); + break; + } + } + + // mix 2 to 1 input channels + stream->in.monoMixer(stream->in.monoBuffer, i_data, i_processed); + + // replace buffer pointer + i_data = (BYTE *)stream->in.monoBuffer; + } + + // process + processor[S_FULLDUPLEX].processor(i_data, i_processed, o_data, o_processed, processor[S_FULLDUPLEX].userData); + + // mix 1 to 2 output channels + if (stream->out.monoBuffer) + stream->out.monoMixer(o_data_host, stream->out.monoBuffer, o_processed); + + // release host output buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, o_processed, 0)) != S_OK) + LogHostError(hr); + } + else + { + if (stream->out.shareMode != AUDCLNT_SHAREMODE_SHARED) + LogHostError(hr); // be silent in shared mode, try again next time + } + } + + // release host input buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, i_processed)) != S_OK) + { + LogHostError(hr); + break; + } + } +#else + // Processing Loop + UINT32 next_sleep = sleep_ms; + while (WaitForSingleObject(stream->hCloseRequest, next_sleep) == WAIT_TIMEOUT) + { + UINT32 i_frames = 0, i_processed = 0; + BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; + DWORD i_flags = 0; + UINT32 o_frames = 0; + + // Get next sleep time + if (sleep_ms == 0) + { + next_sleep = ThreadIdleScheduler_NextSleep(&scheduler); + } + + // get available frames + if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) + { + LogHostError(hr); + break; + } + + while (o_frames != 0) + { + // get host input buffer + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &i_data, &i_frames, &i_flags, NULL, NULL)) != S_OK) + { + if (hr == AUDCLNT_S_BUFFER_EMPTY) + break; // no data in capture buffer + + LogHostError(hr); + break; + } + + // process equal ammount of frames + if (o_frames >= i_frames) + { + // process input ammount of frames + UINT32 o_processed = i_frames; + + // get host output buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, o_processed, &o_data)) == S_OK) + { + // processed amount of i_frames + i_processed = i_frames; + o_data_host = o_data; + + // convert output mono + if (stream->out.monoMixer) + { + UINT32 mono_frames_size = o_processed * (stream->out.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->out.monoBufferSize) + { + stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); + if (stream->out.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + + LogPaError(paInsufficientMemory); + goto thread_error; + } + } + + // replace buffer pointer + o_data = (BYTE *)stream->out.monoBuffer; + } + + // convert input mono + if (stream->in.monoMixer) + { + UINT32 mono_frames_size = i_processed * (stream->in.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->in.monoBufferSize) + { + stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); + if (stream->in.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + + LogPaError(paInsufficientMemory); + goto thread_error; + } + } + + // mix 2 to 1 input channels + stream->in.monoMixer(stream->in.monoBuffer, i_data, i_processed); + + // replace buffer pointer + i_data = (BYTE *)stream->in.monoBuffer; + } + + // process + processor[S_FULLDUPLEX].processor(i_data, i_processed, o_data, o_processed, processor[S_FULLDUPLEX].userData); + + // mix 1 to 2 output channels + if (stream->out.monoBuffer) + stream->out.monoMixer(o_data_host, stream->out.monoBuffer, o_processed); + + // release host output buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, o_processed, 0)) != S_OK) + LogHostError(hr); + + o_frames -= o_processed; + } + else + { + if (stream->out.shareMode != AUDCLNT_SHAREMODE_SHARED) + LogHostError(hr); // be silent in shared mode, try again next time + } + } + else + { + i_processed = 0; + goto fd_release_buffer_in; + } + +fd_release_buffer_in: + + // release host input buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, i_processed)) != S_OK) + { + LogHostError(hr); + break; + } + + // break processing, input hasn't been accumulated yet + if (i_processed == 0) + break; + } + } +#endif + } + +thread_end: + + // Process stop + _StreamOnStop(stream); + + // Release unmarshaled COM pointers + ReleaseUnmarshaledComPointers(stream); + + // Cleanup COM for this thread + if (bThreadComInitialized == TRUE) + CoUninitialize(); + + // Notify: not running + stream->running = FALSE; + + // Notify: thread exited + SetEvent(stream->hThreadExit); + + return 0; + +thread_error: + + // Prevent deadlocking in Pa_StreamStart + SetEvent(stream->hThreadStart); + + // Exit + goto thread_end; +} + +// ------------------------------------------------------------------------------------------ +void *PaWasapi_ReallocateMemory(void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +// ------------------------------------------------------------------------------------------ +void PaWasapi_FreeMemory(void *ptr) +{ + free(ptr); +} + +//#endif //VC 2005 + + + + +#if 0 + if(bFirst) { + float masteur; + hr = stream->outVol->GetMasterVolumeLevelScalar(&masteur); + if (hr != S_OK) + LogHostError(hr); + float chan1, chan2; + hr = stream->outVol->GetChannelVolumeLevelScalar(0, &chan1); + if (hr != S_OK) + LogHostError(hr); + hr = stream->outVol->GetChannelVolumeLevelScalar(1, &chan2); + if (hr != S_OK) + LogHostError(hr); + + BOOL bMute; + hr = stream->outVol->GetMute(&bMute); + if (hr != S_OK) + LogHostError(hr); + + stream->outVol->SetMasterVolumeLevelScalar(0.5, NULL); + stream->outVol->SetChannelVolumeLevelScalar(0, 0.5, NULL); + stream->outVol->SetChannelVolumeLevelScalar(1, 0.5, NULL); + stream->outVol->SetMute(FALSE, NULL); + bFirst = FALSE; + } +#endif diff --git a/Externals/portaudio/src/hostapi/wasapi/readme.txt b/Externals/portaudio/src/hostapi/wasapi/readme.txt new file mode 100644 index 0000000000..08fedeb074 --- /dev/null +++ b/Externals/portaudio/src/hostapi/wasapi/readme.txt @@ -0,0 +1,25 @@ +************** +* WASAPI API * +************** + +---------------------------------------- +Microsoft Visual Studio 2005SP1/2008/10 +---------------------------------------- +No specific actions are needed to compile WASAPI API under Visual Studio. +You are only required to install min. Windows Vista SDK (v6.0A) prior +compilation. + +---------------------------------------- +MinGW (GCC 32-bit)/ MinGW64 (GCC 64-bit) +---------------------------------------- +To compile under MinGW you are required to include 'mingw-include' directory +which contains necessary files with WASAPI API. These files are modified +in order to be compiled by MinGW compiler. These files are taken from +Windows Vista SDK (v6.0A). MinGW compilation is tested and proved to be +fully working under 32-bit and 64-bit modes. +MinGW (32-bit) tested: gcc version 4.4.0 (GCC) +MinGW64 (64-bit) tested: gcc version 4.4.4 20100226 (prerelease) (GCC) + +PortAudio +/Dmitry Kostjuchenko/ +04.03.2010 \ No newline at end of file diff --git a/Externals/portaudio/src/hostapi/wdmks/pa_win_wdmks.c b/Externals/portaudio/src/hostapi/wdmks/pa_win_wdmks.c new file mode 100644 index 0000000000..60a61e474b --- /dev/null +++ b/Externals/portaudio/src/hostapi/wdmks/pa_win_wdmks.c @@ -0,0 +1,3308 @@ +/* + * $Id: pa_win_wdmks.c 1606 2011-02-17 15:56:04Z rob_bielik $ + * PortAudio Windows WDM-KS interface + * + * Author: Andrew Baldwin + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2004 Andrew Baldwin, Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup hostapi_src + @brief Portaudio WDM-KS host API. + + @note This is the implementation of the Portaudio host API using the + Windows WDM/Kernel Streaming API in order to enable very low latency + playback and recording on all modern Windows platforms (e.g. 2K, XP) + Note: This API accesses the device drivers below the usual KMIXER + component which is normally used to enable multi-client mixing and + format conversion. That means that it will lock out all other users + of a device for the duration of active stream using those devices +*/ + +#include + +/* Debugging/tracing support */ + +#define PA_LOGE_ +#define PA_LOGL_ + +#ifdef __GNUC__ + #include + #define _WIN32_WINNT 0x0501 + #define WINVER 0x0501 +#endif + +#include /* strlen() */ +#include + +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "portaudio.h" +#include "pa_debugprint.h" + +#include +#include +#include + +#ifdef __GNUC__ + #undef PA_LOGE_ + #define PA_LOGE_ PA_DEBUG(("%s {\n",__FUNCTION__)) + #undef PA_LOGL_ + #define PA_LOGL_ PA_DEBUG(("} %s\n",__FUNCTION__)) + /* These defines are set in order to allow the WIndows DirectX + * headers to compile with a GCC compiler such as MinGW + * NOTE: The headers may generate a few warning in GCC, but + * they should compile */ + #define _INC_MMSYSTEM + #define _INC_MMREG + #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */ + #define DEFINE_GUID_THUNK(name,guid) DEFINE_GUID(name,guid) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK( n, STATIC_##n ) + #if !defined( DEFINE_WAVEFORMATEX_GUID ) + #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 + #endif + #define WAVE_FORMAT_ADPCM 0x0002 + #define WAVE_FORMAT_IEEE_FLOAT 0x0003 + #define WAVE_FORMAT_ALAW 0x0006 + #define WAVE_FORMAT_MULAW 0x0007 + #define WAVE_FORMAT_MPEG 0x0050 + #define WAVE_FORMAT_DRM 0x0009 + #define DYNAMIC_GUID_THUNK(l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + #define DYNAMIC_GUID(data) DYNAMIC_GUID_THUNK(data) +#endif + +#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ +#pragma comment( lib, "setupapi.lib" ) +#endif + +/* use CreateThread for CYGWIN, _beginthreadex for all others */ +#ifndef __CYGWIN__ +#define CREATE_THREAD (HANDLE)_beginthreadex( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) +#else +#define CREATE_THREAD CreateThread( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) +#endif + +/* use ExitThread for CYGWIN, _endthreadex for all others */ +#ifndef __CYGWIN__ +#define EXIT_THREAD _endthreadex(0) +#else +#define EXIT_THREAD ExitThread(0) +#endif + +#ifdef _MSC_VER + #define NOMMIDS + #define DYNAMIC_GUID(data) {data} + #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */ + #undef DEFINE_GUID + #define DEFINE_GUID(n,data) EXTERN_C const GUID n = {data} + #define DEFINE_GUID_THUNK(n,data) DEFINE_GUID(n,data) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) +#endif + +#include +#include +#include +#include +#include +#include + +/* These next definitions allow the use of the KSUSER DLL */ +typedef KSDDKAPI DWORD WINAPI KSCREATEPIN(HANDLE, PKSPIN_CONNECT, ACCESS_MASK, PHANDLE); +extern HMODULE DllKsUser; +extern KSCREATEPIN* FunctionKsCreatePin; + +/* Forward definition to break circular type reference between pin and filter */ +struct __PaWinWdmFilter; +typedef struct __PaWinWdmFilter PaWinWdmFilter; + +/* The Pin structure + * A pin is an input or output node, e.g. for audio flow */ +typedef struct __PaWinWdmPin +{ + HANDLE handle; + PaWinWdmFilter* parentFilter; + unsigned long pinId; + KSPIN_CONNECT* pinConnect; + unsigned long pinConnectSize; + KSDATAFORMAT_WAVEFORMATEX* ksDataFormatWfx; + KSPIN_COMMUNICATION communication; + KSDATARANGE* dataRanges; + KSMULTIPLE_ITEM* dataRangesItem; + KSPIN_DATAFLOW dataFlow; + KSPIN_CINSTANCES instances; + unsigned long frameSize; + int maxChannels; + unsigned long formats; + int bestSampleRate; +} +PaWinWdmPin; + +/* The Filter structure + * A filter has a number of pins and a "friendly name" */ +struct __PaWinWdmFilter +{ + HANDLE handle; + int pinCount; + PaWinWdmPin** pins; + TCHAR filterName[MAX_PATH]; + TCHAR friendlyName[MAX_PATH]; + int maxInputChannels; + int maxOutputChannels; + unsigned long formats; + int usageCount; + int bestSampleRate; +}; + +/* PaWinWdmHostApiRepresentation - host api datastructure specific to this implementation */ +typedef struct __PaWinWdmHostApiRepresentation +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup* allocations; + PaWinWdmFilter** filters; + int filterCount; +} +PaWinWdmHostApiRepresentation; + +typedef struct __PaWinWdmDeviceInfo +{ + PaDeviceInfo inheritedDeviceInfo; + PaWinWdmFilter* filter; +} +PaWinWdmDeviceInfo; + +typedef struct __DATAPACKET +{ + KSSTREAM_HEADER Header; + OVERLAPPED Signal; +} DATAPACKET; + +/* PaWinWdmStream - a stream data structure specifically for this implementation */ +typedef struct __PaWinWdmStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + PaWinWdmPin* recordingPin; + PaWinWdmPin* playbackPin; + char* hostBuffer; + unsigned long framesPerHostIBuffer; + unsigned long framesPerHostOBuffer; + int bytesPerInputFrame; + int bytesPerOutputFrame; + int streamStarted; + int streamActive; + int streamStop; + int streamAbort; + int oldProcessPriority; + HANDLE streamThread; + HANDLE events[5]; /* 2 play + 2 record packets + abort events */ + DATAPACKET packets[4]; /* 2 play + 2 record */ + PaStreamFlags streamFlags; + /* These values handle the case where the user wants to use fewer + * channels than the device has */ + int userInputChannels; + int deviceInputChannels; + int userOutputChannels; + int deviceOutputChannels; + int inputSampleSize; + int outputSampleSize; +} +PaWinWdmStream; + +#include + +HMODULE DllKsUser = NULL; +KSCREATEPIN* FunctionKsCreatePin = NULL; + +/* prototypes for functions declared in this file */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* Low level I/O functions */ +static PaError WdmSyncIoctl(HANDLE handle, + unsigned long ioctlNumber, + void* inBuffer, + unsigned long inBufferCount, + void* outBuffer, + unsigned long outBufferCount, + unsigned long* bytesReturned); +static PaError WdmGetPropertySimple(HANDLE handle, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount, + void* instance, + unsigned long instanceCount); +static PaError WdmSetPropertySimple(HANDLE handle, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount, + void* instance, + unsigned long instanceCount); +static PaError WdmGetPinPropertySimple(HANDLE handle, + unsigned long pinId, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount); +static PaError WdmGetPinPropertyMulti(HANDLE handle, + unsigned long pinId, + const GUID* const guidPropertySet, + unsigned long property, + KSMULTIPLE_ITEM** ksMultipleItem); + +/** Pin management functions */ +static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, PaError* error); +static void PinFree(PaWinWdmPin* pin); +static void PinClose(PaWinWdmPin* pin); +static PaError PinInstantiate(PaWinWdmPin* pin); +/*static PaError PinGetState(PaWinWdmPin* pin, KSSTATE* state); NOT USED */ +static PaError PinSetState(PaWinWdmPin* pin, KSSTATE state); +static PaError PinSetFormat(PaWinWdmPin* pin, const WAVEFORMATEX* format); +static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format); + +/* Filter management functions */ +static PaWinWdmFilter* FilterNew( + TCHAR* filterName, + TCHAR* friendlyName, + PaError* error); +static void FilterFree(PaWinWdmFilter* filter); +static PaWinWdmPin* FilterCreateRenderPin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error); +static PaWinWdmPin* FilterFindViableRenderPin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error); +static PaError FilterCanCreateRenderPin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex); +static PaWinWdmPin* FilterCreateCapturePin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error); +static PaWinWdmPin* FilterFindViableCapturePin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error); +static PaError FilterCanCreateCapturePin( + PaWinWdmFilter* filter, + const WAVEFORMATEX* pwfx); +static PaError FilterUse( + PaWinWdmFilter* filter); +static void FilterRelease( + PaWinWdmFilter* filter); + +/* Interface functions */ +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError IsFormatSupported( + struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError OpenStream( + struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( + PaStream* stream, + void *buffer, + unsigned long frames ); +static PaError WriteStream( + PaStream* stream, + const void *buffer, + unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + +/* Utility functions */ +static unsigned long GetWfexSize(const WAVEFORMATEX* wfex); +static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi); +static BOOL PinWrite(HANDLE h, DATAPACKET* p); +static BOOL PinRead(HANDLE h, DATAPACKET* p); +static void DuplicateFirstChannelInt16(void* buffer, int channels, int samples); +static void DuplicateFirstChannelInt24(void* buffer, int channels, int samples); +static DWORD WINAPI ProcessingThread(LPVOID pParam); + +/* Function bodies */ + +static unsigned long GetWfexSize(const WAVEFORMATEX* wfex) +{ + if( wfex->wFormatTag == WAVE_FORMAT_PCM ) + { + return sizeof( WAVEFORMATEX ); + } + else + { + return (sizeof( WAVEFORMATEX ) + wfex->cbSize); + } +} + +/* +Low level pin/filter access functions +*/ +static PaError WdmSyncIoctl( + HANDLE handle, + unsigned long ioctlNumber, + void* inBuffer, + unsigned long inBufferCount, + void* outBuffer, + unsigned long outBufferCount, + unsigned long* bytesReturned) +{ + PaError result = paNoError; + OVERLAPPED overlapped; + int boolResult; + unsigned long dummyBytesReturned; + unsigned long error; + + if( !bytesReturned ) + { + /* User a dummy as the caller hasn't supplied one */ + bytesReturned = &dummyBytesReturned; + } + + FillMemory((void *)&overlapped,sizeof(overlapped),0); + overlapped.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); + if( !overlapped.hEvent ) + { + result = paInsufficientMemory; + goto error; + } + overlapped.hEvent = (HANDLE)((DWORD_PTR)overlapped.hEvent | 0x1); + + boolResult = DeviceIoControl(handle, ioctlNumber, inBuffer, inBufferCount, + outBuffer, outBufferCount, bytesReturned, &overlapped); + if( !boolResult ) + { + error = GetLastError(); + if( error == ERROR_IO_PENDING ) + { + error = WaitForSingleObject(overlapped.hEvent,INFINITE); + if( error != WAIT_OBJECT_0 ) + { + result = paUnanticipatedHostError; + goto error; + } + } + else if((( error == ERROR_INSUFFICIENT_BUFFER ) || + ( error == ERROR_MORE_DATA )) && + ( ioctlNumber == IOCTL_KS_PROPERTY ) && + ( outBufferCount == 0 )) + { + boolResult = TRUE; + } + else + { + result = paUnanticipatedHostError; + } + } + if( !boolResult ) + *bytesReturned = 0; + +error: + if( overlapped.hEvent ) + { + CloseHandle( overlapped.hEvent ); + } + return result; +} + +static PaError WdmGetPropertySimple(HANDLE handle, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount, + void* instance, + unsigned long instanceCount) +{ + PaError result; + KSPROPERTY* ksProperty; + unsigned long propertyCount; + + propertyCount = sizeof(KSPROPERTY) + instanceCount; + ksProperty = (KSPROPERTY*)PaUtil_AllocateMemory( propertyCount ); + if( !ksProperty ) + { + return paInsufficientMemory; + } + + FillMemory((void*)ksProperty,sizeof(ksProperty),0); + ksProperty->Set = *guidPropertySet; + ksProperty->Id = property; + ksProperty->Flags = KSPROPERTY_TYPE_GET; + + if( instance ) + { + memcpy( (void*)(((char*)ksProperty)+sizeof(KSPROPERTY)), instance, instanceCount ); + } + + result = WdmSyncIoctl( + handle, + IOCTL_KS_PROPERTY, + ksProperty, + propertyCount, + value, + valueCount, + NULL); + + PaUtil_FreeMemory( ksProperty ); + return result; +} + +static PaError WdmSetPropertySimple( + HANDLE handle, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount, + void* instance, + unsigned long instanceCount) +{ + PaError result; + KSPROPERTY* ksProperty; + unsigned long propertyCount = 0; + + propertyCount = sizeof(KSPROPERTY) + instanceCount; + ksProperty = (KSPROPERTY*)PaUtil_AllocateMemory( propertyCount ); + if( !ksProperty ) + { + return paInsufficientMemory; + } + + ksProperty->Set = *guidPropertySet; + ksProperty->Id = property; + ksProperty->Flags = KSPROPERTY_TYPE_SET; + + if( instance ) + { + memcpy((void*)((char*)ksProperty + sizeof(KSPROPERTY)), instance, instanceCount); + } + + result = WdmSyncIoctl( + handle, + IOCTL_KS_PROPERTY, + ksProperty, + propertyCount, + value, + valueCount, + NULL); + + PaUtil_FreeMemory( ksProperty ); + return result; +} + +static PaError WdmGetPinPropertySimple( + HANDLE handle, + unsigned long pinId, + const GUID* const guidPropertySet, + unsigned long property, + void* value, + unsigned long valueCount) +{ + PaError result; + + KSP_PIN ksPProp; + ksPProp.Property.Set = *guidPropertySet; + ksPProp.Property.Id = property; + ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; + ksPProp.PinId = pinId; + ksPProp.Reserved = 0; + + result = WdmSyncIoctl( + handle, + IOCTL_KS_PROPERTY, + &ksPProp, + sizeof(KSP_PIN), + value, + valueCount, + NULL); + + return result; +} + +static PaError WdmGetPinPropertyMulti( + HANDLE handle, + unsigned long pinId, + const GUID* const guidPropertySet, + unsigned long property, + KSMULTIPLE_ITEM** ksMultipleItem) +{ + PaError result; + unsigned long multipleItemSize = 0; + KSP_PIN ksPProp; + + ksPProp.Property.Set = *guidPropertySet; + ksPProp.Property.Id = property; + ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; + ksPProp.PinId = pinId; + ksPProp.Reserved = 0; + + result = WdmSyncIoctl( + handle, + IOCTL_KS_PROPERTY, + &ksPProp.Property, + sizeof(KSP_PIN), + NULL, + 0, + &multipleItemSize); + if( result != paNoError ) + { + return result; + } + + *ksMultipleItem = (KSMULTIPLE_ITEM*)PaUtil_AllocateMemory( multipleItemSize ); + if( !*ksMultipleItem ) + { + return paInsufficientMemory; + } + + result = WdmSyncIoctl( + handle, + IOCTL_KS_PROPERTY, + &ksPProp, + sizeof(KSP_PIN), + (void*)*ksMultipleItem, + multipleItemSize, + NULL); + + if( result != paNoError ) + { + PaUtil_FreeMemory( ksMultipleItem ); + } + + return result; +} + + +/* +Create a new pin object belonging to a filter +The pin object holds all the configuration information about the pin +before it is opened, and then the handle of the pin after is opened +*/ +static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, PaError* error) +{ + PaWinWdmPin* pin; + PaError result; + unsigned long i; + KSMULTIPLE_ITEM* item = NULL; + KSIDENTIFIER* identifier; + KSDATARANGE* dataRange; + + PA_LOGE_; + PA_DEBUG(("Creating pin %d:\n",pinId)); + + /* Allocate the new PIN object */ + pin = (PaWinWdmPin*)PaUtil_AllocateMemory( sizeof(PaWinWdmPin) ); + if( !pin ) + { + result = paInsufficientMemory; + goto error; + } + + /* Zero the pin object */ + /* memset( (void*)pin, 0, sizeof(PaWinWdmPin) ); */ + + pin->parentFilter = parentFilter; + pin->pinId = pinId; + + /* Allocate a connect structure */ + pin->pinConnectSize = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX); + pin->pinConnect = (KSPIN_CONNECT*)PaUtil_AllocateMemory( pin->pinConnectSize ); + if( !pin->pinConnect ) + { + result = paInsufficientMemory; + goto error; + } + + /* Configure the connect structure with default values */ + pin->pinConnect->Interface.Set = KSINTERFACESETID_Standard; + pin->pinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING; + pin->pinConnect->Interface.Flags = 0; + pin->pinConnect->Medium.Set = KSMEDIUMSETID_Standard; + pin->pinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; + pin->pinConnect->Medium.Flags = 0; + pin->pinConnect->PinId = pinId; + pin->pinConnect->PinToHandle = NULL; + pin->pinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; + pin->pinConnect->Priority.PrioritySubClass = 1; + pin->ksDataFormatWfx = (KSDATAFORMAT_WAVEFORMATEX*)(pin->pinConnect + 1); + pin->ksDataFormatWfx->DataFormat.FormatSize = sizeof(KSDATAFORMAT_WAVEFORMATEX); + pin->ksDataFormatWfx->DataFormat.Flags = 0; + pin->ksDataFormatWfx->DataFormat.Reserved = 0; + pin->ksDataFormatWfx->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO; + pin->ksDataFormatWfx->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + pin->ksDataFormatWfx->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX; + + pin->frameSize = 0; /* Unknown until we instantiate pin */ + + /* Get the COMMUNICATION property */ + result = WdmGetPinPropertySimple( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_COMMUNICATION, + &pin->communication, + sizeof(KSPIN_COMMUNICATION)); + if( result != paNoError ) + goto error; + + if( /*(pin->communication != KSPIN_COMMUNICATION_SOURCE) &&*/ + (pin->communication != KSPIN_COMMUNICATION_SINK) && + (pin->communication != KSPIN_COMMUNICATION_BOTH) ) + { + PA_DEBUG(("Not source/sink\n")); + result = paInvalidDevice; + goto error; + } + + /* Get dataflow information */ + result = WdmGetPinPropertySimple( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_DATAFLOW, + &pin->dataFlow, + sizeof(KSPIN_DATAFLOW)); + + if( result != paNoError ) + goto error; + + /* Get the INTERFACE property list */ + result = WdmGetPinPropertyMulti( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_INTERFACES, + &item); + + if( result != paNoError ) + goto error; + + identifier = (KSIDENTIFIER*)(item+1); + + /* Check that at least one interface is STANDARD_STREAMING */ + result = paUnanticipatedHostError; + for( i = 0; i < item->Count; i++ ) + { + if( !memcmp( (void*)&identifier[i].Set, (void*)&KSINTERFACESETID_Standard, sizeof( GUID ) ) && + ( identifier[i].Id == KSINTERFACE_STANDARD_STREAMING ) ) + { + result = paNoError; + break; + } + } + + if( result != paNoError ) + { + PA_DEBUG(("No standard streaming\n")); + goto error; + } + + /* Don't need interfaces any more */ + PaUtil_FreeMemory( item ); + item = NULL; + + /* Get the MEDIUM properties list */ + result = WdmGetPinPropertyMulti( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_MEDIUMS, + &item); + + if( result != paNoError ) + goto error; + + identifier = (KSIDENTIFIER*)(item+1); /* Not actually necessary... */ + + /* Check that at least one medium is STANDARD_DEVIO */ + result = paUnanticipatedHostError; + for( i = 0; i < item->Count; i++ ) + { + if( !memcmp( (void*)&identifier[i].Set, (void*)&KSMEDIUMSETID_Standard, sizeof( GUID ) ) && + ( identifier[i].Id == KSMEDIUM_STANDARD_DEVIO ) ) + { + result = paNoError; + break; + } + } + + if( result != paNoError ) + { + PA_DEBUG(("No standard devio\n")); + goto error; + } + /* Don't need mediums any more */ + PaUtil_FreeMemory( item ); + item = NULL; + + /* Get DATARANGES */ + result = WdmGetPinPropertyMulti( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_DATARANGES, + &pin->dataRangesItem); + + if( result != paNoError ) + goto error; + + pin->dataRanges = (KSDATARANGE*)(pin->dataRangesItem +1); + + /* Check that at least one datarange supports audio */ + result = paUnanticipatedHostError; + dataRange = pin->dataRanges; + pin->maxChannels = 0; + pin->bestSampleRate = 0; + pin->formats = 0; + for( i = 0; i dataRangesItem->Count; i++) + { + PA_DEBUG(("DR major format %x\n",*(unsigned long*)(&(dataRange->MajorFormat)))); + /* Check that subformat is WAVEFORMATEX, PCM or WILDCARD */ + if( IS_VALID_WAVEFORMATEX_GUID(&dataRange->SubFormat) || + !memcmp((void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_PCM, sizeof ( GUID ) ) || + ( !memcmp((void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_WILDCARD, sizeof ( GUID ) ) && + ( !memcmp((void*)&dataRange->MajorFormat, (void*)&KSDATAFORMAT_TYPE_AUDIO, sizeof ( GUID ) ) ) ) ) + { + result = paNoError; + /* Record the maximum possible channels with this pin */ + PA_DEBUG(("MaxChannel: %d\n",pin->maxChannels)); + if( (int)((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels > pin->maxChannels ) + { + pin->maxChannels = ((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels; + /*PA_DEBUG(("MaxChannel: %d\n",pin->maxChannels));*/ + } + /* Record the formats (bit depths) that are supported */ + if( ((KSDATARANGE_AUDIO*)dataRange)->MinimumBitsPerSample <= 16 ) + { + pin->formats |= paInt16; + PA_DEBUG(("Format 16 bit supported\n")); + } + if( ((KSDATARANGE_AUDIO*)dataRange)->MaximumBitsPerSample >= 24 ) + { + pin->formats |= paInt24; + PA_DEBUG(("Format 24 bit supported\n")); + } + if( ( pin->bestSampleRate != 48000) && + (((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency >= 48000) && + (((KSDATARANGE_AUDIO*)dataRange)->MinimumSampleFrequency <= 48000) ) + { + pin->bestSampleRate = 48000; + PA_DEBUG(("48kHz supported\n")); + } + else if(( pin->bestSampleRate != 48000) && ( pin->bestSampleRate != 44100 ) && + (((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency >= 44100) && + (((KSDATARANGE_AUDIO*)dataRange)->MinimumSampleFrequency <= 44100) ) + { + pin->bestSampleRate = 44100; + PA_DEBUG(("44.1kHz supported\n")); + } + else + { + pin->bestSampleRate = ((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency; + } + } + dataRange = (KSDATARANGE*)( ((char*)dataRange) + dataRange->FormatSize); + } + + if( result != paNoError ) + goto error; + + /* Get instance information */ + result = WdmGetPinPropertySimple( + parentFilter->handle, + pinId, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_CINSTANCES, + &pin->instances, + sizeof(KSPIN_CINSTANCES)); + + if( result != paNoError ) + goto error; + + /* Success */ + *error = paNoError; + PA_DEBUG(("Pin created successfully\n")); + PA_LOGL_; + return pin; + +error: + /* + Error cleanup + */ + PaUtil_FreeMemory( item ); + if( pin ) + { + PaUtil_FreeMemory( pin->pinConnect ); + PaUtil_FreeMemory( pin->dataRangesItem ); + PaUtil_FreeMemory( pin ); + } + *error = result; + PA_LOGL_; + return NULL; +} + +/* +Safely free all resources associated with the pin +*/ +static void PinFree(PaWinWdmPin* pin) +{ + PA_LOGE_; + if( pin ) + { + PinClose(pin); + if( pin->pinConnect ) + { + PaUtil_FreeMemory( pin->pinConnect ); + } + if( pin->dataRangesItem ) + { + PaUtil_FreeMemory( pin->dataRangesItem ); + } + PaUtil_FreeMemory( pin ); + } + PA_LOGL_; +} + +/* +If the pin handle is open, close it +*/ +static void PinClose(PaWinWdmPin* pin) +{ + PA_LOGE_; + if( pin == NULL ) + { + PA_DEBUG(("Closing NULL pin!")); + PA_LOGL_; + return; + } + if( pin->handle != NULL ) + { + PinSetState( pin, KSSTATE_PAUSE ); + PinSetState( pin, KSSTATE_STOP ); + CloseHandle( pin->handle ); + pin->handle = NULL; + FilterRelease(pin->parentFilter); + } + PA_LOGL_; +} + +/* +Set the state of this (instantiated) pin +*/ +static PaError PinSetState(PaWinWdmPin* pin, KSSTATE state) +{ + PaError result; + + PA_LOGE_; + if( pin == NULL ) + return paInternalError; + if( pin->handle == NULL ) + return paInternalError; + + result = WdmSetPropertySimple( + pin->handle, + &KSPROPSETID_Connection, + KSPROPERTY_CONNECTION_STATE, + &state, + sizeof(state), + NULL, + 0); + PA_LOGL_; + return result; +} + +static PaError PinInstantiate(PaWinWdmPin* pin) +{ + PaError result; + unsigned long createResult; + KSALLOCATOR_FRAMING ksaf; + KSALLOCATOR_FRAMING_EX ksafex; + + PA_LOGE_; + + if( pin == NULL ) + return paInternalError; + if(!pin->pinConnect) + return paInternalError; + + FilterUse(pin->parentFilter); + + createResult = FunctionKsCreatePin( + pin->parentFilter->handle, + pin->pinConnect, + GENERIC_WRITE | GENERIC_READ, + &pin->handle + ); + + PA_DEBUG(("Pin create result = %x\n",createResult)); + if( createResult != ERROR_SUCCESS ) + { + FilterRelease(pin->parentFilter); + pin->handle = NULL; + return paInvalidDevice; + } + + result = WdmGetPropertySimple( + pin->handle, + &KSPROPSETID_Connection, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING, + &ksaf, + sizeof(ksaf), + NULL, + 0); + + if( result != paNoError ) + { + result = WdmGetPropertySimple( + pin->handle, + &KSPROPSETID_Connection, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, + &ksafex, + sizeof(ksafex), + NULL, + 0); + if( result == paNoError ) + { + pin->frameSize = ksafex.FramingItem[0].FramingRange.Range.MinFrameSize; + } + } + else + { + pin->frameSize = ksaf.FrameSize; + } + + PA_LOGL_; + + return paNoError; +} + +/* NOT USED +static PaError PinGetState(PaWinWdmPin* pin, KSSTATE* state) +{ + PaError result; + + if( state == NULL ) + return paInternalError; + if( pin == NULL ) + return paInternalError; + if( pin->handle == NULL ) + return paInternalError; + + result = WdmGetPropertySimple( + pin->handle, + KSPROPSETID_Connection, + KSPROPERTY_CONNECTION_STATE, + state, + sizeof(KSSTATE), + NULL, + 0); + + return result; +} +*/ +static PaError PinSetFormat(PaWinWdmPin* pin, const WAVEFORMATEX* format) +{ + unsigned long size; + void* newConnect; + + PA_LOGE_; + + if( pin == NULL ) + return paInternalError; + if( format == NULL ) + return paInternalError; + + size = GetWfexSize(format) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX) - sizeof(WAVEFORMATEX); + + if( pin->pinConnectSize != size ) + { + newConnect = PaUtil_AllocateMemory( size ); + if( newConnect == NULL ) + return paInsufficientMemory; + memcpy( newConnect, (void*)pin->pinConnect, min(pin->pinConnectSize,size) ); + PaUtil_FreeMemory( pin->pinConnect ); + pin->pinConnect = (KSPIN_CONNECT*)newConnect; + pin->pinConnectSize = size; + pin->ksDataFormatWfx = (KSDATAFORMAT_WAVEFORMATEX*)((KSPIN_CONNECT*)newConnect + 1); + pin->ksDataFormatWfx->DataFormat.FormatSize = size - sizeof(KSPIN_CONNECT); + } + + memcpy( (void*)&(pin->ksDataFormatWfx->WaveFormatEx), format, GetWfexSize(format) ); + pin->ksDataFormatWfx->DataFormat.SampleSize = (unsigned short)(format->nChannels * (format->wBitsPerSample / 8)); + + PA_LOGL_; + + return paNoError; +} + +static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format) +{ + KSDATARANGE_AUDIO* dataRange; + unsigned long count; + GUID guid = DYNAMIC_GUID( DEFINE_WAVEFORMATEX_GUID(format->wFormatTag) ); + PaError result = paInvalidDevice; + + PA_LOGE_; + + if( format->wFormatTag == WAVE_FORMAT_EXTENSIBLE ) + { + guid = ((WAVEFORMATEXTENSIBLE*)format)->SubFormat; + } + dataRange = (KSDATARANGE_AUDIO*)pin->dataRanges; + for(count = 0; countdataRangesItem->Count; count++) + { + if(( !memcmp(&(dataRange->DataRange.MajorFormat),&KSDATAFORMAT_TYPE_AUDIO,sizeof(GUID)) ) || + ( !memcmp(&(dataRange->DataRange.MajorFormat),&KSDATAFORMAT_TYPE_WILDCARD,sizeof(GUID)) )) + { + /* This is an audio or wildcard datarange... */ + if(( !memcmp(&(dataRange->DataRange.SubFormat),&KSDATAFORMAT_SUBTYPE_WILDCARD,sizeof(GUID)) ) || + ( !memcmp(&(dataRange->DataRange.SubFormat),&guid,sizeof(GUID)) )) + { + if(( !memcmp(&(dataRange->DataRange.Specifier),&KSDATAFORMAT_SPECIFIER_WILDCARD,sizeof(GUID)) ) || + ( !memcmp(&(dataRange->DataRange.Specifier),&KSDATAFORMAT_SPECIFIER_WAVEFORMATEX,sizeof(GUID) ))) + { + + PA_DEBUG(("Pin:%x, DataRange:%d\n",(void*)pin,count)); + PA_DEBUG(("\tFormatSize:%d, SampleSize:%d\n",dataRange->DataRange.FormatSize,dataRange->DataRange.SampleSize)); + PA_DEBUG(("\tMaxChannels:%d\n",dataRange->MaximumChannels)); + PA_DEBUG(("\tBits:%d-%d\n",dataRange->MinimumBitsPerSample,dataRange->MaximumBitsPerSample)); + PA_DEBUG(("\tSampleRate:%d-%d\n",dataRange->MinimumSampleFrequency,dataRange->MaximumSampleFrequency)); + + if( dataRange->MaximumChannels < format->nChannels ) + { + result = paInvalidChannelCount; + continue; + } + if( dataRange->MinimumBitsPerSample > format->wBitsPerSample ) + { + result = paSampleFormatNotSupported; + continue; + } + if( dataRange->MaximumBitsPerSample < format->wBitsPerSample ) + { + result = paSampleFormatNotSupported; + continue; + } + if( dataRange->MinimumSampleFrequency > format->nSamplesPerSec ) + { + result = paInvalidSampleRate; + continue; + } + if( dataRange->MaximumSampleFrequency < format->nSamplesPerSec ) + { + result = paInvalidSampleRate; + continue; + } + /* Success! */ + PA_LOGL_; + return paNoError; + } + } + } + dataRange = (KSDATARANGE_AUDIO*)( ((char*)dataRange) + dataRange->DataRange.FormatSize); + } + + PA_LOGL_; + + return result; +} + +/** + * Create a new filter object + */ +static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError* error) +{ + PaWinWdmFilter* filter; + PaError result; + int pinId; + int valid; + + + /* Allocate the new filter object */ + filter = (PaWinWdmFilter*)PaUtil_AllocateMemory( sizeof(PaWinWdmFilter) ); + if( !filter ) + { + result = paInsufficientMemory; + goto error; + } + + /* Zero the filter object - done by AllocateMemory */ + /* memset( (void*)filter, 0, sizeof(PaWinWdmFilter) ); */ + + /* Copy the filter name */ + _tcsncpy(filter->filterName, filterName, MAX_PATH); + + /* Copy the friendly name */ + _tcsncpy(filter->friendlyName, friendlyName, MAX_PATH); + + /* Open the filter handle */ + result = FilterUse(filter); + if( result != paNoError ) + { + goto error; + } + + /* Get pin count */ + result = WdmGetPinPropertySimple + ( + filter->handle, + 0, + &KSPROPSETID_Pin, + KSPROPERTY_PIN_CTYPES, + &filter->pinCount, + sizeof(filter->pinCount) + ); + + if( result != paNoError) + { + goto error; + } + + /* Allocate pointer array to hold the pins */ + filter->pins = (PaWinWdmPin**)PaUtil_AllocateMemory( sizeof(PaWinWdmPin*) * filter->pinCount ); + if( !filter->pins ) + { + result = paInsufficientMemory; + goto error; + } + + /* Create all the pins we can */ + filter->maxInputChannels = 0; + filter->maxOutputChannels = 0; + filter->bestSampleRate = 0; + + valid = 0; + for(pinId = 0; pinId < filter->pinCount; pinId++) + { + /* Create the pin with this Id */ + PaWinWdmPin* newPin; + newPin = PinNew(filter, pinId, &result); + if( result == paInsufficientMemory ) + goto error; + if( newPin != NULL ) + { + filter->pins[pinId] = newPin; + valid = 1; + + /* Get the max output channel count */ + if(( newPin->dataFlow == KSPIN_DATAFLOW_IN ) && + (( newPin->communication == KSPIN_COMMUNICATION_SINK) || + ( newPin->communication == KSPIN_COMMUNICATION_BOTH))) + { + if(newPin->maxChannels > filter->maxOutputChannels) + filter->maxOutputChannels = newPin->maxChannels; + filter->formats |= newPin->formats; + } + /* Get the max input channel count */ + if(( newPin->dataFlow == KSPIN_DATAFLOW_OUT ) && + (( newPin->communication == KSPIN_COMMUNICATION_SINK) || + ( newPin->communication == KSPIN_COMMUNICATION_BOTH))) + { + if(newPin->maxChannels > filter->maxInputChannels) + filter->maxInputChannels = newPin->maxChannels; + filter->formats |= newPin->formats; + } + + if(newPin->bestSampleRate > filter->bestSampleRate) + { + filter->bestSampleRate = newPin->bestSampleRate; + } + } + } + + if(( filter->maxInputChannels == 0) && ( filter->maxOutputChannels == 0)) + { + /* No input or output... not valid */ + valid = 0; + } + + if( !valid ) + { + /* No valid pin was found on this filter so we destroy it */ + result = paDeviceUnavailable; + goto error; + } + + /* Close the filter handle for now + * It will be opened later when needed */ + FilterRelease(filter); + + *error = paNoError; + return filter; + +error: + /* + Error cleanup + */ + if( filter ) + { + for( pinId = 0; pinId < filter->pinCount; pinId++ ) + PinFree(filter->pins[pinId]); + PaUtil_FreeMemory( filter->pins ); + if( filter->handle ) + CloseHandle( filter->handle ); + PaUtil_FreeMemory( filter ); + } + *error = result; + return NULL; +} + +/** + * Free a previously created filter + */ +static void FilterFree(PaWinWdmFilter* filter) +{ + int pinId; + PA_LOGL_; + if( filter ) + { + for( pinId = 0; pinId < filter->pinCount; pinId++ ) + PinFree(filter->pins[pinId]); + PaUtil_FreeMemory( filter->pins ); + if( filter->handle ) + CloseHandle( filter->handle ); + PaUtil_FreeMemory( filter ); + } + PA_LOGE_; +} + +/** + * Reopen the filter handle if necessary so it can be used + **/ +static PaError FilterUse(PaWinWdmFilter* filter) +{ + assert( filter ); + + PA_LOGE_; + if( filter->handle == NULL ) + { + /* Open the filter */ + filter->handle = CreateFile( + filter->filterName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, + NULL); + + if( filter->handle == NULL ) + { + return paDeviceUnavailable; + } + } + filter->usageCount++; + PA_LOGL_; + return paNoError; +} + +/** + * Release the filter handle if nobody is using it + **/ +static void FilterRelease(PaWinWdmFilter* filter) +{ + assert( filter ); + assert( filter->usageCount > 0 ); + + PA_LOGE_; + filter->usageCount--; + if( filter->usageCount == 0 ) + { + if( filter->handle != NULL ) + { + CloseHandle( filter->handle ); + filter->handle = NULL; + } + } + PA_LOGL_; +} + +/** + * Create a render (playback) Pin using the supplied format + **/ +static PaWinWdmPin* FilterCreateRenderPin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error) +{ + PaError result; + PaWinWdmPin* pin; + + assert( filter ); + + pin = FilterFindViableRenderPin(filter,wfex,&result); + if(!pin) + { + goto error; + } + result = PinSetFormat(pin,wfex); + if( result != paNoError ) + { + goto error; + } + result = PinInstantiate(pin); + if( result != paNoError ) + { + goto error; + } + + *error = paNoError; + return pin; + +error: + *error = result; + return NULL; +} + +/** + * Find a pin that supports the given format + **/ +static PaWinWdmPin* FilterFindViableRenderPin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error) +{ + int pinId; + PaWinWdmPin* pin; + PaError result = paDeviceUnavailable; + *error = paNoError; + + assert( filter ); + + for( pinId = 0; pinIdpinCount; pinId++ ) + { + pin = filter->pins[pinId]; + if( pin != NULL ) + { + if(( pin->dataFlow == KSPIN_DATAFLOW_IN ) && + (( pin->communication == KSPIN_COMMUNICATION_SINK) || + ( pin->communication == KSPIN_COMMUNICATION_BOTH))) + { + result = PinIsFormatSupported( pin, wfex ); + if( result == paNoError ) + { + return pin; + } + } + } + } + + *error = result; + return NULL; +} + +/** + * Check if there is a pin that should playback + * with the supplied format + **/ +static PaError FilterCanCreateRenderPin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex) +{ + PaWinWdmPin* pin; + PaError result; + + assert ( filter ); + + pin = FilterFindViableRenderPin(filter,wfex,&result); + /* result will be paNoError if pin found + * or else an error code indicating what is wrong with the format + **/ + return result; +} + +/** + * Create a capture (record) Pin using the supplied format + **/ +static PaWinWdmPin* FilterCreateCapturePin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error) +{ + PaError result; + PaWinWdmPin* pin; + + assert( filter ); + + pin = FilterFindViableCapturePin(filter,wfex,&result); + if(!pin) + { + goto error; + } + + result = PinSetFormat(pin,wfex); + if( result != paNoError ) + { + goto error; + } + + result = PinInstantiate(pin); + if( result != paNoError ) + { + goto error; + } + + *error = paNoError; + return pin; + +error: + *error = result; + return NULL; +} + +/** + * Find a capture pin that supports the given format + **/ +static PaWinWdmPin* FilterFindViableCapturePin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex, + PaError* error) +{ + int pinId; + PaWinWdmPin* pin; + PaError result = paDeviceUnavailable; + *error = paNoError; + + assert( filter ); + + for( pinId = 0; pinIdpinCount; pinId++ ) + { + pin = filter->pins[pinId]; + if( pin != NULL ) + { + if(( pin->dataFlow == KSPIN_DATAFLOW_OUT ) && + (( pin->communication == KSPIN_COMMUNICATION_SINK) || + ( pin->communication == KSPIN_COMMUNICATION_BOTH))) + { + result = PinIsFormatSupported( pin, wfex ); + if( result == paNoError ) + { + return pin; + } + } + } + } + + *error = result; + return NULL; +} + +/** + * Check if there is a pin that should playback + * with the supplied format + **/ +static PaError FilterCanCreateCapturePin(PaWinWdmFilter* filter, + const WAVEFORMATEX* wfex) +{ + PaWinWdmPin* pin; + PaError result; + + assert ( filter ); + + pin = FilterFindViableCapturePin(filter,wfex,&result); + /* result will be paNoError if pin found + * or else an error code indicating what is wrong with the format + **/ + return result; +} + +/** + * Build the list of available filters + * Use the SetupDi API to enumerate all devices in the KSCATEGORY_AUDIO which + * have a KSCATEGORY_RENDER or KSCATEGORY_CAPTURE alias. For each of these + * devices initialise a PaWinWdmFilter structure by calling our NewFilter() + * function. We enumerate devices twice, once to count how many there are, + * and once to initialize the PaWinWdmFilter structures. + */ +static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi) +{ + PaError result = paNoError; + HDEVINFO handle = NULL; + int device; + int invalidDevices; + int slot; + SP_DEVICE_INTERFACE_DATA interfaceData; + SP_DEVICE_INTERFACE_DATA aliasData; + SP_DEVINFO_DATA devInfoData; + int noError; + const int sizeInterface = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + (MAX_PATH * sizeof(WCHAR)); + unsigned char interfaceDetailsArray[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + (MAX_PATH * sizeof(WCHAR))]; + SP_DEVICE_INTERFACE_DETAIL_DATA* devInterfaceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA*)interfaceDetailsArray; + TCHAR friendlyName[MAX_PATH]; + HKEY hkey; + DWORD sizeFriendlyName; + DWORD type; + PaWinWdmFilter* newFilter; + GUID* category = (GUID*)&KSCATEGORY_AUDIO; + GUID* alias_render = (GUID*)&KSCATEGORY_RENDER; + GUID* alias_capture = (GUID*)&KSCATEGORY_CAPTURE; + DWORD hasAlias; + + PA_LOGE_; + + devInterfaceDetails->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + + /* Open a handle to search for devices (filters) */ + handle = SetupDiGetClassDevs(category,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + if( handle == NULL ) + { + return paUnanticipatedHostError; + } + PA_DEBUG(("Setup called\n")); + + /* First let's count the number of devices so we can allocate a list */ + invalidDevices = 0; + for( device = 0;;device++ ) + { + interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + interfaceData.Reserved = 0; + aliasData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + aliasData.Reserved = 0; + noError = SetupDiEnumDeviceInterfaces(handle,NULL,category,device,&interfaceData); + PA_DEBUG(("Enum called\n")); + if( !noError ) + break; /* No more devices */ + + /* Check this one has the render or capture alias */ + hasAlias = 0; + noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_render,&aliasData); + PA_DEBUG(("noError = %d\n",noError)); + if(noError) + { + if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED))) + { + PA_DEBUG(("Device %d has render alias\n",device)); + hasAlias |= 1; /* Has render alias */ + } + else + { + PA_DEBUG(("Device %d has no render alias\n",device)); + } + } + noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_capture,&aliasData); + if(noError) + { + if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED))) + { + PA_DEBUG(("Device %d has capture alias\n",device)); + hasAlias |= 2; /* Has capture alias */ + } + else + { + PA_DEBUG(("Device %d has no capture alias\n",device)); + } + } + if(!hasAlias) + invalidDevices++; /* This was not a valid capture or render audio device */ + + } + /* Remember how many there are */ + wdmHostApi->filterCount = device-invalidDevices; + + PA_DEBUG(("Interfaces found: %d\n",device-invalidDevices)); + + /* Now allocate the list of pointers to devices */ + wdmHostApi->filters = (PaWinWdmFilter**)PaUtil_AllocateMemory( sizeof(PaWinWdmFilter*) * device ); + if( !wdmHostApi->filters ) + { + if(handle != NULL) + SetupDiDestroyDeviceInfoList(handle); + return paInsufficientMemory; + } + + /* Now create filter objects for each interface found */ + slot = 0; + for( device = 0;;device++ ) + { + interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + interfaceData.Reserved = 0; + aliasData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + aliasData.Reserved = 0; + devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + devInfoData.Reserved = 0; + + noError = SetupDiEnumDeviceInterfaces(handle,NULL,category,device,&interfaceData); + if( !noError ) + break; /* No more devices */ + + /* Check this one has the render or capture alias */ + hasAlias = 0; + noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_render,&aliasData); + if(noError) + { + if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED))) + { + PA_DEBUG(("Device %d has render alias\n",device)); + hasAlias |= 1; /* Has render alias */ + } + } + noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_capture,&aliasData); + if(noError) + { + if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED))) + { + PA_DEBUG(("Device %d has capture alias\n",device)); + hasAlias |= 2; /* Has capture alias */ + } + } + if(!hasAlias) + continue; /* This was not a valid capture or render audio device */ + + noError = SetupDiGetDeviceInterfaceDetail(handle,&interfaceData,devInterfaceDetails,sizeInterface,NULL,&devInfoData); + if( noError ) + { + /* Try to get the "friendly name" for this interface */ + sizeFriendlyName = sizeof(friendlyName); + /* Fix contributed by Ben Allison + * Removed KEY_SET_VALUE from flags on following call + * as its causes failure when running without admin rights + * and it was not required */ + hkey=SetupDiOpenDeviceInterfaceRegKey(handle,&interfaceData,0,KEY_QUERY_VALUE); + if(hkey!=INVALID_HANDLE_VALUE) + { + noError = RegQueryValueEx(hkey,TEXT("FriendlyName"),0,&type,(BYTE*)friendlyName,&sizeFriendlyName); + if( noError == ERROR_SUCCESS ) + { + PA_DEBUG(("Interface %d, Name: %s\n",device,friendlyName)); + RegCloseKey(hkey); + } + else + { + friendlyName[0] = 0; + } + } + newFilter = FilterNew(devInterfaceDetails->DevicePath,friendlyName,&result); + if( result == paNoError ) + { + PA_DEBUG(("Filter created\n")); + wdmHostApi->filters[slot] = newFilter; + slot++; + } + else + { + PA_DEBUG(("Filter NOT created\n")); + /* As there are now less filters than we initially thought + * we must reduce the count by one */ + wdmHostApi->filterCount--; + } + } + } + + /* Clean up */ + if(handle != NULL) + SetupDiDestroyDeviceInfoList(handle); + + return paNoError; +} + +PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i, deviceCount; + PaWinWdmHostApiRepresentation *wdmHostApi; + PaWinWdmDeviceInfo *deviceInfoArray; + PaWinWdmFilter* pFilter; + PaWinWdmDeviceInfo *wdmDeviceInfo; + PaDeviceInfo *deviceInfo; + + PA_LOGE_; + + /* + Attempt to load the KSUSER.DLL without which we cannot create pins + We will unload this on termination + */ + if(DllKsUser == NULL) + { + DllKsUser = LoadLibrary(TEXT("ksuser.dll")); + if(DllKsUser == NULL) + goto error; + } + + FunctionKsCreatePin = (KSCREATEPIN*)GetProcAddress(DllKsUser, "KsCreatePin"); + if(FunctionKsCreatePin == NULL) + goto error; + + wdmHostApi = (PaWinWdmHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaWinWdmHostApiRepresentation) ); + if( !wdmHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + wdmHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !wdmHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + result = BuildFilterList( wdmHostApi ); + if( result != paNoError ) + { + goto error; + } + deviceCount = wdmHostApi->filterCount; + + *hostApi = &wdmHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paWDMKS; + (*hostApi)->info.name = "Windows WDM-KS"; + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + + if( deviceCount > 0 ) + { + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + wdmHostApi->allocations, sizeof(PaWinWdmDeviceInfo*) * deviceCount ); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaWinWdmDeviceInfo*)PaUtil_GroupAllocateMemory( + wdmHostApi->allocations, sizeof(PaWinWdmDeviceInfo) * deviceCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < deviceCount; ++i ) + { + wdmDeviceInfo = &deviceInfoArray[i]; + deviceInfo = &wdmDeviceInfo->inheritedDeviceInfo; + pFilter = wdmHostApi->filters[i]; + if( pFilter == NULL ) + continue; + wdmDeviceInfo->filter = pFilter; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + deviceInfo->name = (char*)pFilter->friendlyName; + PA_DEBUG(("Device found name: %s\n",(char*)pFilter->friendlyName)); + deviceInfo->maxInputChannels = pFilter->maxInputChannels; + if(deviceInfo->maxInputChannels > 0) + { + /* Set the default input device to the first device we find with + * more than zero input channels + **/ + if((*hostApi)->info.defaultInputDevice == paNoDevice) + { + (*hostApi)->info.defaultInputDevice = i; + } + } + + deviceInfo->maxOutputChannels = pFilter->maxOutputChannels; + if(deviceInfo->maxOutputChannels > 0) + { + /* Set the default output device to the first device we find with + * more than zero output channels + **/ + if((*hostApi)->info.defaultOutputDevice == paNoDevice) + { + (*hostApi)->info.defaultOutputDevice = i; + } + } + + /* These low values are not very useful because + * a) The lowest latency we end up with can depend on many factors such + * as the device buffer sizes/granularities, sample rate, channels and format + * b) We cannot know the device buffer sizes until we try to open/use it at + * a particular setting + * So: we give 512x48000Hz frames as the default low input latency + **/ + deviceInfo->defaultLowInputLatency = (512.0/48000.0); + deviceInfo->defaultLowOutputLatency = (512.0/48000.0); + deviceInfo->defaultHighInputLatency = (4096.0/48000.0); + deviceInfo->defaultHighOutputLatency = (4096.0/48000.0); + deviceInfo->defaultSampleRate = (double)(pFilter->bestSampleRate); + + (*hostApi)->deviceInfos[i] = deviceInfo; + } + } + + (*hostApi)->info.deviceCount = deviceCount; + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &wdmHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &wdmHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + PA_LOGL_; + return result; + +error: + if( DllKsUser != NULL ) + { + FreeLibrary( DllKsUser ); + DllKsUser = NULL; + } + + if( wdmHostApi ) + { + PaUtil_FreeMemory( wdmHostApi->filters ); + if( wdmHostApi->allocations ) + { + PaUtil_FreeAllAllocations( wdmHostApi->allocations ); + PaUtil_DestroyAllocationGroup( wdmHostApi->allocations ); + } + PaUtil_FreeMemory( wdmHostApi ); + } + PA_LOGL_; + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi; + int i; + PA_LOGE_; + + if( wdmHostApi->filters ) + { + for( i=0; ifilterCount; i++) + { + if( wdmHostApi->filters[i] != NULL ) + { + FilterFree( wdmHostApi->filters[i] ); + wdmHostApi->filters[i] = NULL; + } + } + } + PaUtil_FreeMemory( wdmHostApi->filters ); + if( wdmHostApi->allocations ) + { + PaUtil_FreeAllAllocations( wdmHostApi->allocations ); + PaUtil_DestroyAllocationGroup( wdmHostApi->allocations ); + } + PaUtil_FreeMemory( wdmHostApi ); + PA_LOGL_; +} + +static void FillWFEXT( WAVEFORMATEXTENSIBLE* pwfext, PaSampleFormat sampleFormat, double sampleRate, int channelCount) +{ + PA_LOGE_; + PA_DEBUG(( "sampleFormat = %lx\n" , sampleFormat )); + PA_DEBUG(( "sampleRate = %f\n" , sampleRate )); + PA_DEBUG(( "chanelCount = %d\n", channelCount )); + + pwfext->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + pwfext->Format.nChannels = channelCount; + pwfext->Format.nSamplesPerSec = (int)sampleRate; + if(channelCount == 1) + pwfext->dwChannelMask = KSAUDIO_SPEAKER_DIRECTOUT; + else + pwfext->dwChannelMask = KSAUDIO_SPEAKER_STEREO; + if(sampleFormat == paFloat32) + { + pwfext->Format.nBlockAlign = channelCount * 4; + pwfext->Format.wBitsPerSample = 32; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 32; + pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + } + else if(sampleFormat == paInt32) + { + pwfext->Format.nBlockAlign = channelCount * 4; + pwfext->Format.wBitsPerSample = 32; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 32; + pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + } + else if(sampleFormat == paInt24) + { + pwfext->Format.nBlockAlign = channelCount * 3; + pwfext->Format.wBitsPerSample = 24; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 24; + pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + } + else if(sampleFormat == paInt16) + { + pwfext->Format.nBlockAlign = channelCount * 2; + pwfext->Format.wBitsPerSample = 16; + pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); + pwfext->Samples.wValidBitsPerSample = 16; + pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + } + pwfext->Format.nAvgBytesPerSec = pwfext->Format.nSamplesPerSec * pwfext->Format.nBlockAlign; + + PA_LOGL_; +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi; + PaWinWdmFilter* pFilter; + int result = paFormatIsSupported; + WAVEFORMATEXTENSIBLE wfx; + + PA_LOGE_; + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( inputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support inputChannelCount */ + if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + /* Check that the input format is supported */ + FillWFEXT(&wfx,paInt16,sampleRate,inputChannelCount); + + pFilter = wdmHostApi->filters[inputParameters->device]; + result = FilterCanCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx); + if( result != paNoError ) + { + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + result = FilterCanCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx); + if( result != paNoError ) + return result; + } + } + else + { + inputChannelCount = 0; + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( outputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support outputChannelCount */ + if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + /* Check that the output format is supported */ + FillWFEXT(&wfx,paInt16,sampleRate,outputChannelCount); + + pFilter = wdmHostApi->filters[outputParameters->device]; + result = FilterCanCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx); + if( result != paNoError ) + { + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + result = FilterCanCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx); + if( result != paNoError ) + return result; + } + + } + else + { + outputChannelCount = 0; + } + + /* + IMPLEMENT ME: + + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported if necessary + + - check that the device supports sampleRate + + Because the buffer adapter handles conversion between all standard + sample formats, the following checks are only required if paCustomFormat + is implemented, or under some other unusual conditions. + + - check that input device can support inputSampleFormat, or that + we have the capability to convert from inputSampleFormat to + a native format + + - check that output device can support outputSampleFormat, or that + we have the capability to convert from outputSampleFormat to + a native format + */ + if((inputChannelCount == 0)&&(outputChannelCount == 0)) + result = paSampleFormatNotSupported; /* Not right error */ + + PA_LOGL_; + return result; +} + +/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */ + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result = paNoError; + PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi; + PaWinWdmStream *stream = 0; + /* unsigned long framesPerHostBuffer; these may not be equivalent for all implementations */ + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + int userInputChannels,userOutputChannels; + int size; + PaWinWdmFilter* pFilter; + WAVEFORMATEXTENSIBLE wfx; + + PA_LOGE_; + PA_DEBUG(("OpenStream:sampleRate = %f\n",sampleRate)); + PA_DEBUG(("OpenStream:framesPerBuffer = %lu\n",framesPerBuffer)); + + if( inputParameters ) + { + userInputChannels = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that input device can support stream->userInputChannels */ + if( userInputChannels > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels ) + return paInvalidChannelCount; + + /* validate inputStreamInfo */ + if( inputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + } + else + { + userInputChannels = 0; + inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ + } + + if( outputParameters ) + { + userOutputChannels = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + + /* unless alternate device specification is supported, reject the use of + paUseHostApiSpecificDeviceSpecification */ + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + /* check that output device can support stream->userInputChannels */ + if( userOutputChannels > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels ) + return paInvalidChannelCount; + + /* validate outputStreamInfo */ + if( outputParameters->hostApiSpecificStreamInfo ) + return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */ + + } + else + { + userOutputChannels = 0; + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ + } + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + stream = (PaWinWdmStream*)PaUtil_AllocateMemory( sizeof(PaWinWdmStream) ); + if( !stream ) + { + result = paInsufficientMemory; + goto error; + } + /* Zero the stream object */ + /* memset((void*)stream,0,sizeof(PaWinWdmStream)); */ + + if( streamCallback ) + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &wdmHostApi->callbackStreamInterface, streamCallback, userData ); + } + else + { + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + &wdmHostApi->blockingStreamInterface, streamCallback, userData ); + } + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + /* Instantiate the input pin if necessary */ + if(userInputChannels > 0) + { + result = paSampleFormatNotSupported; + pFilter = wdmHostApi->filters[inputParameters->device]; + stream->userInputChannels = userInputChannels; + + if(((inputSampleFormat & ~paNonInterleaved) & pFilter->formats) != 0) + { /* inputSampleFormat is supported, so try to use it */ + hostInputSampleFormat = inputSampleFormat; + FillWFEXT(&wfx, hostInputSampleFormat, sampleRate, stream->userInputChannels); + stream->bytesPerInputFrame = wfx.Format.nBlockAlign; + stream->recordingPin = FilterCreateCapturePin(pFilter, (const WAVEFORMATEX*)&wfx, &result); + stream->deviceInputChannels = stream->userInputChannels; + } + + if(result != paNoError) + { /* Search through all PaSampleFormats to find one that works */ + hostInputSampleFormat = paFloat32; + + do { + FillWFEXT(&wfx, hostInputSampleFormat, sampleRate, stream->userInputChannels); + stream->bytesPerInputFrame = wfx.Format.nBlockAlign; + stream->recordingPin = FilterCreateCapturePin(pFilter, (const WAVEFORMATEX*)&wfx, &result); + stream->deviceInputChannels = stream->userInputChannels; + + if(stream->recordingPin == NULL) result = paSampleFormatNotSupported; + if(result != paNoError) hostInputSampleFormat <<= 1; + } + while(result != paNoError && hostInputSampleFormat <= paUInt8); + } + + if(result != paNoError) + { /* None of the PaSampleFormats worked. Set the hostInputSampleFormat to the best fit + * and try a PCM format. + **/ + hostInputSampleFormat = + PaUtil_SelectClosestAvailableFormat( pFilter->formats, inputSampleFormat ); + + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result); + if(stream->recordingPin == NULL) result = paSampleFormatNotSupported; + } + + if( result != paNoError ) + { + /* Some or all KS devices can only handle the exact number of channels + * they specify. But PortAudio clients expect to be able to + * at least specify mono I/O on a multi-channel device + * If this is the case, then we will do the channel mapping internally + **/ + if( stream->userInputChannels < pFilter->maxInputChannels ) + { + FillWFEXT(&wfx,hostInputSampleFormat,sampleRate,pFilter->maxInputChannels); + stream->bytesPerInputFrame = wfx.Format.nBlockAlign; + stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result); + stream->deviceInputChannels = pFilter->maxInputChannels; + + if( result != paNoError ) + { + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result); + } + } + } + + if(stream->recordingPin == NULL) + { + goto error; + } + + switch(hostInputSampleFormat) + { + case paInt16: stream->inputSampleSize = 2; break; + case paInt24: stream->inputSampleSize = 3; break; + case paInt32: + case paFloat32: stream->inputSampleSize = 4; break; + } + + stream->recordingPin->frameSize /= stream->bytesPerInputFrame; + PA_DEBUG(("Pin output frames: %d\n",stream->recordingPin->frameSize)); + } + else + { + stream->recordingPin = NULL; + stream->bytesPerInputFrame = 0; + } + + /* Instantiate the output pin if necessary */ + if(userOutputChannels > 0) + { + result = paSampleFormatNotSupported; + pFilter = wdmHostApi->filters[outputParameters->device]; + stream->userOutputChannels = userOutputChannels; + + if(((outputSampleFormat & ~paNonInterleaved) & pFilter->formats) != 0) + { + hostOutputSampleFormat = outputSampleFormat; + FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,stream->userOutputChannels); + stream->bytesPerOutputFrame = wfx.Format.nBlockAlign; + stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result); + stream->deviceOutputChannels = stream->userOutputChannels; + } + + if(result != paNoError) + { + hostOutputSampleFormat = paFloat32; + + do { + FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,stream->userOutputChannels); + stream->bytesPerOutputFrame = wfx.Format.nBlockAlign; + stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result); + stream->deviceOutputChannels = stream->userOutputChannels; + + if(stream->playbackPin == NULL) result = paSampleFormatNotSupported; + if(result != paNoError) hostOutputSampleFormat <<= 1; + } + while(result != paNoError && hostOutputSampleFormat <= paUInt8); + } + + if(result != paNoError) + { + hostOutputSampleFormat = + PaUtil_SelectClosestAvailableFormat( pFilter->formats, outputSampleFormat ); + + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result); + if(stream->playbackPin == NULL) result = paSampleFormatNotSupported; + } + + if( result != paNoError ) + { + /* Some or all KS devices can only handle the exact number of channels + * they specify. But PortAudio clients expect to be able to + * at least specify mono I/O on a multi-channel device + * If this is the case, then we will do the channel mapping internally + **/ + if( stream->userOutputChannels < pFilter->maxOutputChannels ) + { + FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,pFilter->maxOutputChannels); + stream->bytesPerOutputFrame = wfx.Format.nBlockAlign; + stream->playbackPin = FilterCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx,&result); + stream->deviceOutputChannels = pFilter->maxOutputChannels; + if( result != paNoError ) + { + /* Try a WAVE_FORMAT_PCM instead */ + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + wfx.Format.cbSize = 0; + wfx.Samples.wValidBitsPerSample = 0; + wfx.dwChannelMask = 0; + wfx.SubFormat = GUID_NULL; + stream->playbackPin = FilterCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx,&result); + } + } + } + + if(stream->playbackPin == NULL) + { + goto error; + } + + switch(hostOutputSampleFormat) + { + case paInt16: stream->outputSampleSize = 2; break; + case paInt24: stream->outputSampleSize = 3; break; + case paInt32: + case paFloat32: stream->outputSampleSize = 4; break; + } + + stream->playbackPin->frameSize /= stream->bytesPerOutputFrame; + PA_DEBUG(("Pin output frames: %d\n",stream->playbackPin->frameSize)); + } + else + { + stream->playbackPin = NULL; + stream->bytesPerOutputFrame = 0; + } + + /* Calculate the framesPerHostXxxxBuffer size based upon the suggested latency values */ + + /* Record the buffer length */ + if(inputParameters) + { + /* Calculate the frames from the user's value - add a bit to round up */ + stream->framesPerHostIBuffer = (unsigned long)((inputParameters->suggestedLatency*sampleRate)+0.0001); + if(stream->framesPerHostIBuffer > (unsigned long)sampleRate) + { /* Upper limit is 1 second */ + stream->framesPerHostIBuffer = (unsigned long)sampleRate; + } + else if(stream->framesPerHostIBuffer < stream->recordingPin->frameSize) + { + stream->framesPerHostIBuffer = stream->recordingPin->frameSize; + } + PA_DEBUG(("Input frames chosen:%ld\n",stream->framesPerHostIBuffer)); + } + + if(outputParameters) + { + /* Calculate the frames from the user's value - add a bit to round up */ + stream->framesPerHostOBuffer = (unsigned long)((outputParameters->suggestedLatency*sampleRate)+0.0001); + if(stream->framesPerHostOBuffer > (unsigned long)sampleRate) + { /* Upper limit is 1 second */ + stream->framesPerHostOBuffer = (unsigned long)sampleRate; + } + else if(stream->framesPerHostOBuffer < stream->playbackPin->frameSize) + { + stream->framesPerHostOBuffer = stream->playbackPin->frameSize; + } + PA_DEBUG(("Output frames chosen:%ld\n",stream->framesPerHostOBuffer)); + } + + /* Host buffer size is bounded to the largest of the input and output + frame sizes */ + + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + stream->userInputChannels, inputSampleFormat, hostInputSampleFormat, + stream->userOutputChannels, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, framesPerBuffer, + max(stream->framesPerHostOBuffer,stream->framesPerHostIBuffer), + paUtilBoundedHostBufferSize, + streamCallback, userData ); + if( result != paNoError ) + goto error; + + stream->streamRepresentation.streamInfo.inputLatency = + ((double)stream->framesPerHostIBuffer) / sampleRate; + stream->streamRepresentation.streamInfo.outputLatency = + ((double)stream->framesPerHostOBuffer) / sampleRate; + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + PA_DEBUG(("BytesPerInputFrame = %d\n",stream->bytesPerInputFrame)); + PA_DEBUG(("BytesPerOutputFrame = %d\n",stream->bytesPerOutputFrame)); + + /* Allocate all the buffers for host I/O */ + size = 2 * (stream->framesPerHostIBuffer*stream->bytesPerInputFrame + stream->framesPerHostOBuffer*stream->bytesPerOutputFrame); + PA_DEBUG(("Buffer size = %d\n",size)); + stream->hostBuffer = (char*)PaUtil_AllocateMemory(size); + PA_DEBUG(("Buffer allocated\n")); + if( !stream->hostBuffer ) + { + PA_DEBUG(("Cannot allocate host buffer!\n")); + result = paInsufficientMemory; + goto error; + } + PA_DEBUG(("Buffer start = %p\n",stream->hostBuffer)); + /* memset(stream->hostBuffer,0,size); */ + + /* Set up the packets */ + stream->events[0] = CreateEvent(NULL, FALSE, FALSE, NULL); + ResetEvent(stream->events[0]); /* Record buffer 1 */ + stream->events[1] = CreateEvent(NULL, FALSE, FALSE, NULL); + ResetEvent(stream->events[1]); /* Record buffer 2 */ + stream->events[2] = CreateEvent(NULL, FALSE, FALSE, NULL); + ResetEvent(stream->events[2]); /* Play buffer 1 */ + stream->events[3] = CreateEvent(NULL, FALSE, FALSE, NULL); + ResetEvent(stream->events[3]); /* Play buffer 2 */ + stream->events[4] = CreateEvent(NULL, FALSE, FALSE, NULL); + ResetEvent(stream->events[4]); /* Abort event */ + if(stream->userInputChannels > 0) + { + DATAPACKET *p = &(stream->packets[0]); + p->Signal.hEvent = stream->events[0]; + p->Header.Data = stream->hostBuffer; + p->Header.FrameExtent = stream->framesPerHostIBuffer*stream->bytesPerInputFrame; + p->Header.DataUsed = 0; + p->Header.Size = sizeof(p->Header); + p->Header.PresentationTime.Numerator = 1; + p->Header.PresentationTime.Denominator = 1; + + p = &(stream->packets[1]); + p->Signal.hEvent = stream->events[1]; + p->Header.Data = stream->hostBuffer + stream->framesPerHostIBuffer*stream->bytesPerInputFrame; + p->Header.FrameExtent = stream->framesPerHostIBuffer*stream->bytesPerInputFrame; + p->Header.DataUsed = 0; + p->Header.Size = sizeof(p->Header); + p->Header.PresentationTime.Numerator = 1; + p->Header.PresentationTime.Denominator = 1; + } + if(stream->userOutputChannels > 0) + { + DATAPACKET *p = &(stream->packets[2]); + p->Signal.hEvent = stream->events[2]; + p->Header.Data = stream->hostBuffer + 2*stream->framesPerHostIBuffer*stream->bytesPerInputFrame; + p->Header.FrameExtent = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame; + p->Header.DataUsed = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame; + p->Header.Size = sizeof(p->Header); + p->Header.PresentationTime.Numerator = 1; + p->Header.PresentationTime.Denominator = 1; + + p = &(stream->packets[3]); + p->Signal.hEvent = stream->events[3]; + p->Header.Data = stream->hostBuffer + 2*stream->framesPerHostIBuffer*stream->bytesPerInputFrame + stream->framesPerHostOBuffer*stream->bytesPerOutputFrame; + p->Header.FrameExtent = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame; + p->Header.DataUsed = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame; + p->Header.Size = sizeof(p->Header); + p->Header.PresentationTime.Numerator = 1; + p->Header.PresentationTime.Denominator = 1; + } + + stream->streamStarted = 0; + stream->streamActive = 0; + stream->streamStop = 0; + stream->streamAbort = 0; + stream->streamFlags = streamFlags; + stream->oldProcessPriority = REALTIME_PRIORITY_CLASS; + + *s = (PaStream*)stream; + + PA_LOGL_; + return result; + +error: + size = 5; + while(size--) + { + if(stream->events[size] != NULL) + { + CloseHandle(stream->events[size]); + stream->events[size] = NULL; + } + } + if(stream->hostBuffer) + PaUtil_FreeMemory( stream->hostBuffer ); + + if(stream->playbackPin) + PinClose(stream->playbackPin); + if(stream->recordingPin) + PinClose(stream->recordingPin); + + if( stream ) + PaUtil_FreeMemory( stream ); + + PA_LOGL_; + return result; +} + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result = paNoError; + PaWinWdmStream *stream = (PaWinWdmStream*)s; + int size; + + PA_LOGE_; + + assert(!stream->streamStarted); + assert(!stream->streamActive); + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + size = 5; + while(size--) + { + if(stream->events[size] != NULL) + { + CloseHandle(stream->events[size]); + stream->events[size] = NULL; + } + } + if(stream->hostBuffer) + PaUtil_FreeMemory( stream->hostBuffer ); + + if(stream->playbackPin) + PinClose(stream->playbackPin); + if(stream->recordingPin) + PinClose(stream->recordingPin); + + PaUtil_FreeMemory( stream ); + + PA_LOGL_; + return result; +} + +/* +Write the supplied packet to the pin +Asynchronous +Should return false on success +*/ +static BOOL PinWrite(HANDLE h, DATAPACKET* p) +{ + unsigned long cbReturned = 0; + return DeviceIoControl(h,IOCTL_KS_WRITE_STREAM,NULL,0, + &p->Header,p->Header.Size,&cbReturned,&p->Signal); +} + +/* +Read to the supplied packet from the pin +Asynchronous +Should return false on success +*/ +static BOOL PinRead(HANDLE h, DATAPACKET* p) +{ + unsigned long cbReturned = 0; + return DeviceIoControl(h,IOCTL_KS_READ_STREAM,NULL,0, + &p->Header,p->Header.Size,&cbReturned,&p->Signal); +} + +/* +Copy the first interleaved channel of 16 bit data to the other channels +*/ +static void DuplicateFirstChannelInt16(void* buffer, int channels, int samples) +{ + unsigned short* data = (unsigned short*)buffer; + int channel; + unsigned short sourceSample; + while( samples-- ) + { + sourceSample = *data++; + channel = channels-1; + while( channel-- ) + { + *data++ = sourceSample; + } + } +} + +/* +Copy the first interleaved channel of 24 bit data to the other channels +*/ +static void DuplicateFirstChannelInt24(void* buffer, int channels, int samples) +{ + unsigned char* data = (unsigned char*)buffer; + int channel; + unsigned char sourceSample[3]; + while( samples-- ) + { + sourceSample[0] = data[0]; + sourceSample[1] = data[1]; + sourceSample[2] = data[2]; + data += 3; + channel = channels-1; + while( channel-- ) + { + data[0] = sourceSample[0]; + data[1] = sourceSample[1]; + data[2] = sourceSample[2]; + data += 3; + } + } +} + +/* +Copy the first interleaved channel of 32 bit data to the other channels +*/ +static void DuplicateFirstChannelInt32(void* buffer, int channels, int samples) +{ + unsigned long* data = (unsigned long*)buffer; + int channel; + unsigned long sourceSample; + while( samples-- ) + { + sourceSample = *data++; + channel = channels-1; + while( channel-- ) + { + *data++ = sourceSample; + } + } +} + +static DWORD WINAPI ProcessingThread(LPVOID pParam) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)pParam; + PaStreamCallbackTimeInfo ti; + int cbResult = paContinue; + int inbuf = 0; + int outbuf = 0; + int pending = 0; + PaError result; + unsigned long wait; + unsigned long eventSignaled; + int fillPlaybuf = 0; + int emptyRecordbuf = 0; + int framesProcessed; + unsigned long timeout; + int i; + int doChannelCopy; + int priming = 0; + PaStreamCallbackFlags underover = 0; + + PA_LOGE_; + + ti.inputBufferAdcTime = 0.0; + ti.currentTime = 0.0; + ti.outputBufferDacTime = 0.0; + + /* Get double buffering going */ + + /* Submit buffers */ + if(stream->playbackPin) + { + result = PinSetState(stream->playbackPin, KSSTATE_RUN); + + PA_DEBUG(("play state run = %d;",(int)result)); + SetEvent(stream->events[outbuf+2]); + outbuf = (outbuf+1)&1; + SetEvent(stream->events[outbuf+2]); + outbuf = (outbuf+1)&1; + pending += 2; + priming += 4; + } + if(stream->recordingPin) + { + result = PinSetState(stream->recordingPin, KSSTATE_RUN); + + PA_DEBUG(("recording state run = %d;",(int)result)); + PinRead(stream->recordingPin->handle,&stream->packets[inbuf]); + inbuf = (inbuf+1)&1; /* Increment and wrap */ + PinRead(stream->recordingPin->handle,&stream->packets[inbuf]); + inbuf = (inbuf+1)&1; /* Increment and wrap */ + /* FIXME - do error checking */ + pending += 2; + } + PA_DEBUG(("Out buffer len:%f\n",(2000*stream->framesPerHostOBuffer) / stream->streamRepresentation.streamInfo.sampleRate)); + PA_DEBUG(("In buffer len:%f\n",(2000*stream->framesPerHostIBuffer) / stream->streamRepresentation.streamInfo.sampleRate)); + timeout = max( + ((2000*(DWORD)stream->framesPerHostOBuffer) / (DWORD)stream->streamRepresentation.streamInfo.sampleRate), + ((2000*(DWORD)stream->framesPerHostIBuffer) / (DWORD)stream->streamRepresentation.streamInfo.sampleRate)); + timeout = max(timeout,1); + PA_DEBUG(("Timeout = %ld\n",timeout)); + + while(!stream->streamAbort) + { + fillPlaybuf = 0; + emptyRecordbuf = 0; + + /* Wait for next input or output buffer to be finished with*/ + assert(pending>0); + + if(stream->streamStop) + { + PA_DEBUG(("ss1:pending=%d ",pending)); + } + wait = WaitForMultipleObjects(5, stream->events, FALSE, 0); + if( wait == WAIT_TIMEOUT ) + { + /* No (under|over)flow has ocurred */ + wait = WaitForMultipleObjects(5, stream->events, FALSE, timeout); + eventSignaled = wait - WAIT_OBJECT_0; + } + else + { + eventSignaled = wait - WAIT_OBJECT_0; + if( eventSignaled < 2 ) + { + underover |= paInputOverflow; + PA_DEBUG(("Input overflow\n")); + } + else if(( eventSignaled < 4 )&&(!priming)) + { + underover |= paOutputUnderflow; + PA_DEBUG(("Output underflow\n")); + } + } + + if(stream->streamStop) + { + PA_DEBUG(("ss2:wait=%ld",wait)); + } + if(wait == WAIT_FAILED) + { + PA_DEBUG(("Wait fail = %ld! ",wait)); + break; + } + if(wait == WAIT_TIMEOUT) + { + continue; + } + + if(eventSignaled < 2) + { /* Recording input buffer has been filled */ + if(stream->playbackPin) + { + /* First check if also the next playback buffer has been signaled */ + wait = WaitForSingleObject(stream->events[outbuf+2],0); + if(wait == WAIT_OBJECT_0) + { + /* Yes, so do both buffers at same time */ + fillPlaybuf = 1; + pending--; + /* Was this an underflow situation? */ + if( underover ) + underover |= paOutputUnderflow; /* Yes! */ + } + } + emptyRecordbuf = 1; + pending--; + } + else if(eventSignaled < 4) + { /* Playback output buffer has been emptied */ + if(stream->recordingPin) + { + /* First check if also the next recording buffer has been signaled */ + wait = WaitForSingleObject(stream->events[inbuf],0); + if(wait == WAIT_OBJECT_0) + { /* Yes, so do both buffers at same time */ + emptyRecordbuf = 1; + pending--; + /* Was this an overflow situation? */ + if( underover ) + underover |= paInputOverflow; /* Yes! */ + } + } + fillPlaybuf = 1; + pending--; + } + else + { + /* Abort event! */ + assert(stream->streamAbort); /* Should have been set */ + PA_DEBUG(("ABORTING ")); + break; + } + ResetEvent(stream->events[eventSignaled]); + + if(stream->streamStop) + { + PA_DEBUG(("Stream stop! pending=%d",pending)); + cbResult = paComplete; /* Stop, but play remaining buffers */ + } + + /* Do necessary buffer processing (which will invoke user callback if necessary */ + doChannelCopy = 0; + if(cbResult==paContinue) + { + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + if((stream->bufferProcessor.hostInputFrameCount[0] + stream->bufferProcessor.hostInputFrameCount[1]) == + (stream->bufferProcessor.hostOutputFrameCount[0] + stream->bufferProcessor.hostOutputFrameCount[1]) ) + PaUtil_BeginBufferProcessing(&stream->bufferProcessor,&ti,underover); + underover = 0; /* Reset the (under|over)flow status */ + if(fillPlaybuf) + { + PaUtil_SetOutputFrameCount(&stream->bufferProcessor,0); + if( stream->userOutputChannels == 1 ) + { + /* Write the single user channel to the first interleaved block */ + PaUtil_SetOutputChannel(&stream->bufferProcessor,0,stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels); + /* We will do a copy to the other channels after the data has been written */ + doChannelCopy = 1; + } + else + { + for(i=0;iuserOutputChannels;i++) + { + /* Only write the user output channels. Leave the rest blank */ + PaUtil_SetOutputChannel(&stream->bufferProcessor,i,((unsigned char*)(stream->packets[outbuf+2].Header.Data))+(i*stream->outputSampleSize),stream->deviceOutputChannels); + } + } + } + if(emptyRecordbuf) + { + PaUtil_SetInputFrameCount(&stream->bufferProcessor,stream->packets[inbuf].Header.DataUsed/stream->bytesPerInputFrame); + for(i=0;iuserInputChannels;i++) + { + /* Only read as many channels as the user wants */ + PaUtil_SetInputChannel(&stream->bufferProcessor,i,((unsigned char*)(stream->packets[inbuf].Header.Data))+(i*stream->inputSampleSize),stream->deviceInputChannels); + } + } + + if (stream->recordingPin && stream->playbackPin) /* full duplex */ + { + /* Only call the EndBufferProcessing function when the total input frames == total output frames */ + + if((stream->bufferProcessor.hostInputFrameCount[0] + stream->bufferProcessor.hostInputFrameCount[1]) == + (stream->bufferProcessor.hostOutputFrameCount[0] + stream->bufferProcessor.hostOutputFrameCount[1]) ) + { + framesProcessed = PaUtil_EndBufferProcessing(&stream->bufferProcessor,&cbResult); + } + else + { + framesProcessed = 0; + } + } + else + { + framesProcessed = PaUtil_EndBufferProcessing(&stream->bufferProcessor,&cbResult); + } + + if( doChannelCopy ) + { + /* Copy the first output channel to the other channels */ + switch(stream->outputSampleSize) + { + case 2: + DuplicateFirstChannelInt16(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer); + break; + case 3: + DuplicateFirstChannelInt24(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer); + break; + case 4: + DuplicateFirstChannelInt32(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer); + break; + default: + assert(0); /* Unsupported format! */ + break; + } + } + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + } + else + { + fillPlaybuf = 0; + emptyRecordbuf = 0; + } + + /* + if(cbResult != paContinue) + { + PA_DEBUG(("cbResult=%d, pending=%d:",cbResult,pending)); + } + */ + /* Submit buffers */ + if((fillPlaybuf)&&(cbResult!=paAbort)) + { + if(!PinWrite(stream->playbackPin->handle,&stream->packets[outbuf+2])) + outbuf = (outbuf+1)&1; /* Increment and wrap */ + pending++; + if( priming ) + priming--; /* Have to prime twice */ + } + if((emptyRecordbuf)&&(cbResult==paContinue)) + { + stream->packets[inbuf].Header.DataUsed = 0; /* Reset for reuse */ + PinRead(stream->recordingPin->handle,&stream->packets[inbuf]); + inbuf = (inbuf+1)&1; /* Increment and wrap */ + pending++; + } + if(pending==0) + { + PA_DEBUG(("pending==0 finished...;")); + break; + } + if((!stream->playbackPin)&&(cbResult!=paContinue)) + { + PA_DEBUG(("record only cbResult=%d...;",cbResult)); + break; + } + } + + PA_DEBUG(("Finished thread")); + + /* Finished, either normally or aborted */ + if(stream->playbackPin) + { + result = PinSetState(stream->playbackPin, KSSTATE_PAUSE); + result = PinSetState(stream->playbackPin, KSSTATE_STOP); + } + if(stream->recordingPin) + { + result = PinSetState(stream->recordingPin, KSSTATE_PAUSE); + result = PinSetState(stream->recordingPin, KSSTATE_STOP); + } + + stream->streamActive = 0; + + if((!stream->streamStop)&&(!stream->streamAbort)) + { + /* Invoke the user stream finished callback */ + /* Only do it from here if not being stopped/aborted by user */ + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + stream->streamStop = 0; + stream->streamAbort = 0; + + /* Reset process priority if necessary */ + if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS) + { + SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority); + stream->oldProcessPriority = REALTIME_PRIORITY_CLASS; + } + + PA_LOGL_; + EXIT_THREAD; + return 0; +} + +static PaError StartStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinWdmStream *stream = (PaWinWdmStream*)s; + DWORD dwID; + BOOL ret; + int size; + + PA_LOGE_; + + stream->streamStop = 0; + stream->streamAbort = 0; + size = 5; + while(size--) + { + if(stream->events[size] != NULL) + { + ResetEvent(stream->events[size]); + } + } + + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + stream->oldProcessPriority = GetPriorityClass(GetCurrentProcess()); + /* Uncomment the following line to enable dynamic boosting of the process + * priority to real time for best low latency support + * Disabled by default because RT processes can easily block the OS */ + /*ret = SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS); + PA_DEBUG(("Class ret = %d;",ret));*/ + + stream->streamStarted = 1; + stream->streamThread = (HANDLE)_beginthreadex(NULL, 0, ProcessingThread, stream, 0, &dwID); + if(stream->streamThread == NULL) + { + stream->streamStarted = 0; + result = paInsufficientMemory; + goto end; + } + ret = SetThreadPriority(stream->streamThread,THREAD_PRIORITY_TIME_CRITICAL); + PA_DEBUG(("Priority ret = %d;",ret)); + /* Make the stream active */ + stream->streamActive = 1; + +end: + PA_LOGL_; + return result; +} + + +static PaError StopStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinWdmStream *stream = (PaWinWdmStream*)s; + int doCb = 0; + + PA_LOGE_; + + if(stream->streamActive) + { + doCb = 1; + stream->streamStop = 1; + while(stream->streamActive) + { + PA_DEBUG(("W.")); + Sleep(10); /* Let thread sleep for 10 msec */ + } + } + + PA_DEBUG(("Terminating thread")); + if(stream->streamStarted && stream->streamThread) + { + TerminateThread(stream->streamThread,0); + stream->streamThread = NULL; + } + + stream->streamStarted = 0; + + if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS) + { + SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority); + stream->oldProcessPriority = REALTIME_PRIORITY_CLASS; + } + + if(doCb) + { + /* Do user callback now after all state has been reset */ + /* This means it should be safe for the called function */ + /* to invoke e.g. StartStream */ + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + + PA_LOGL_; + return result; +} + +static PaError AbortStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinWdmStream *stream = (PaWinWdmStream*)s; + int doCb = 0; + + PA_LOGE_; + + if(stream->streamActive) + { + doCb = 1; + stream->streamAbort = 1; + SetEvent(stream->events[4]); /* Signal immediately */ + while(stream->streamActive) + { + Sleep(10); + } + } + + if(stream->streamStarted && stream->streamThread) + { + TerminateThread(stream->streamThread,0); + stream->streamThread = NULL; + } + + stream->streamStarted = 0; + + if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS) + { + SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority); + stream->oldProcessPriority = REALTIME_PRIORITY_CLASS; + } + + if(doCb) + { + /* Do user callback now after all state has been reset */ + /* This means it should be safe for the called function */ + /* to invoke e.g. StartStream */ + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + } + + stream->streamActive = 0; + stream->streamStarted = 0; + + PA_LOGL_; + return result; +} + + +static PaError IsStreamStopped( PaStream *s ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + int result = 0; + + PA_LOGE_; + + if(!stream->streamStarted) + result = 1; + + PA_LOGL_; + return result; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + int result = 0; + + PA_LOGE_; + + if(stream->streamActive) + result = 1; + + PA_LOGL_; + return result; +} + + +static PaTime GetStreamTime( PaStream* s ) +{ + PA_LOGE_; + PA_LOGL_; + (void)s; + return PaUtil_GetTime(); +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + double result; + PA_LOGE_; + result = PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); + PA_LOGL_; + return result; +} + + +/* + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + + PA_LOGE_; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + PA_LOGL_; + return paNoError; +} + + +static PaError WriteStream( PaStream* s, + const void *buffer, + unsigned long frames ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + + PA_LOGE_; + + /* suppress unused variable warnings */ + (void) buffer; + (void) frames; + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + PA_LOGL_; + return paNoError; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + + PA_LOGE_; + + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + PA_LOGL_; + return 0; +} + + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaWinWdmStream *stream = (PaWinWdmStream*)s; + + PA_LOGE_; + /* suppress unused variable warnings */ + (void) stream; + + /* IMPLEMENT ME, see portaudio.h for required behavior*/ + PA_LOGL_; + return 0; +} \ No newline at end of file diff --git a/Externals/portaudio/src/hostapi/wdmks/readme.txt b/Externals/portaudio/src/hostapi/wdmks/readme.txt new file mode 100644 index 0000000000..1a381fe79f --- /dev/null +++ b/Externals/portaudio/src/hostapi/wdmks/readme.txt @@ -0,0 +1,82 @@ +Notes about WDM-KS host API +--------------------------- + +Status history +-------------- +10th November 2005: +Made following changes: + * OpenStream: Try all PaSampleFormats internally if the the chosen + format is not supported natively. This fixed several problems + with soundcards that soundcards that did not take kindly to + using 24-bit 3-byte formats. + * OpenStream: Make the minimum framesPerHostIBuffer (and framesPerHostOBuffer) + the default frameSize for the playback/recording pin. + * ProcessingThread: Added a switch to only call PaUtil_EndBufferProcessing + if the total input frames equals the total output frames + +5th September 2004: +This is the first public version of the code. It should be considered +an alpha release with zero guarantee not to crash on any particular +system. So far it has only been tested in the author's development +environment, which means a Win2k/SP2 PIII laptop with integrated +SoundMAX driver and USB Tascam US-428 compiled with both MinGW +(GCC 3.3) and MSVC++6 using the MS DirectX 9 SDK. +It has been most widely tested with the MinGW build, with most of the +test programs (particularly paqa_devs and paqa_errs) passing. +There are some notable failures: patest_out_underflow and both of the +blocking I/O tests (as blocking I/O is not implemented). +At this point the code needs to be tested with a much wider variety +of configurations and feedback provided from testers regarding +both working and failing cases. + +What is the WDM-KS host API? +---------------------------- +PortAudio for Windows currently has 3 functional host implementations. +MME uses the oldest Windows audio API which does not offer good +play/record latency. +DirectX improves this, but still imposes a penalty +of 10s of milliseconds due to the system mixing of streams from +multiple applications. +ASIO offers very good latency, but requires special drivers which are +not always available for cheaper audio hardware. Also, when ASIO +drivers are available, they are not always so robust because they +bypass all of the standardised Windows device driver architecture +and hit the hardware their own way. +Alternatively there are a couple of free (but closed source) ASIO +implementations which connect to the lower level Windows +"Kernel Streaming" API, but again these require special installation +by the user, and can be limited in functionality or difficult to use. + +This is where the PortAudio "WDM-KS" host implementation comes in. +It directly connects PortAudio to the same Kernel Streaming API which +those ASIO bridges use. This avoids the mixing penatly of DirectX, +giving at least as good latency as any ASIO driver, but it has the +advantage of working with ANY Windows audio hardware which is available +through the normal MME/DirectX routes without the user requiring +any additional device drivers to be installed, and allowing all +device selection to be done through the normal PortAudio API. + +Note that in general you should only be using this host API if your +application has a real requirement for very low latency audio (<20ms), +either because you are generating sounds in real-time based upon +user input, or you a processing recorded audio in real time. + +The only thing to be aware of is that using the KS interface will +block that device from being used by the rest of system through +the higher level APIs, or conversely, if the system is using +a device, the KS API will not be able to use it. MS recommend that +you should keep the device open only when your application has focus. +In PortAudio terms, this means having a stream Open on a WDMKS device. + +Usage +----- +To add the WDMKS backend to your program which is already using +PortAudio, you must undefine PA_NO_WDMKS from your build file, +and include the pa_win_wdmks\pa_win_wdmks.c into your build. +The file should compile in both C and C++. +You will need a DirectX SDK installed on your system for the +ks.h and ksmedia.h header files. +You will need to link to the system "setupapi" library. +Note that if you use MinGW, you will get more warnings from +the DX header files when using GCC(C), and still a few warnings +with G++(CPP). \ No newline at end of file diff --git a/Externals/portaudio/src/hostapi/wmme/pa_win_wmme.c b/Externals/portaudio/src/hostapi/wmme/pa_win_wmme.c new file mode 100644 index 0000000000..ec891a94ed --- /dev/null +++ b/Externals/portaudio/src/hostapi/wmme/pa_win_wmme.c @@ -0,0 +1,4007 @@ +/* + * $Id: pa_win_wmme.c 1739 2011-08-25 07:15:31Z rossb $ + * pa_win_wmme.c + * Implementation of PortAudio for Windows MultiMedia Extensions (WMME) + * + * PortAudio Portable Real-Time Audio Library + * Latest Version at: http://www.portaudio.com + * + * Authors: Ross Bencina and Phil Burk + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/* Modification History: + PLB = Phil Burk + JM = Julien Maillard + RDB = Ross Bencina + PLB20010402 - sDevicePtrs now allocates based on sizeof(pointer) + PLB20010413 - check for excessive numbers of channels + PLB20010422 - apply Mike Berry's changes for CodeWarrior on PC + including conditional inclusion of memory.h, + and explicit typecasting on memory allocation + PLB20010802 - use GlobalAlloc for sDevicesPtr instead of PaHost_AllocFastMemory + PLB20010816 - pass process instead of thread to SetPriorityClass() + PLB20010927 - use number of frames instead of real-time for CPULoad calculation. + JM20020118 - prevent hung thread when buffers underflow. + PLB20020321 - detect Win XP versus NT, 9x; fix DBUG typo; removed init of CurrentCount + RDB20020411 - various renaming cleanups, factored streamData alloc and cpu usage init + RDB20020417 - stopped counting WAVE_MAPPER when there were no real devices + refactoring, renaming and fixed a few edge case bugs + RDB20020531 - converted to V19 framework + ** NOTE maintanance history is now stored in CVS ** +*/ + +/** @file + @ingroup hostapi_src + + @brief Win32 host API implementation for the Windows MultiMedia Extensions (WMME) audio API. +*/ + +/* + How it works: + + For both callback and blocking read/write streams we open the MME devices + in CALLBACK_EVENT mode. In this mode, MME signals an Event object whenever + it has finished with a buffer (either filled it for input, or played it + for output). Where necessary, we block waiting for Event objects using + WaitMultipleObjects(). + + When implementing a PA callback stream, we set up a high priority thread + which waits on the MME buffer Events and drains/fills the buffers when + they are ready. + + When implementing a PA blocking read/write stream, we simply wait on these + Events (when necessary) inside the ReadStream() and WriteStream() functions. +*/ + +#include +#include +#include +#include +#include +#ifndef UNDER_CE +#include +#endif +#include +/* PLB20010422 - "memory.h" doesn't work on CodeWarrior for PC. Thanks Mike Berry for the mod. */ +#ifndef __MWERKS__ +#include +#include +#endif /* __MWERKS__ */ + +#include "portaudio.h" +#include "pa_trace.h" +#include "pa_util.h" +#include "pa_allocation.h" +#include "pa_hostapi.h" +#include "pa_stream.h" +#include "pa_cpuload.h" +#include "pa_process.h" +#include "pa_debugprint.h" + +#include "pa_win_wmme.h" +#include "pa_win_waveformat.h" + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO +#include "pa_win_wdmks_utils.h" +#ifndef DRV_QUERYDEVICEINTERFACE +#define DRV_QUERYDEVICEINTERFACE (DRV_RESERVED + 12) +#endif +#ifndef DRV_QUERYDEVICEINTERFACESIZE +#define DRV_QUERYDEVICEINTERFACESIZE (DRV_RESERVED + 13) +#endif +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + +/* use CreateThread for CYGWIN, _beginthreadex for all others */ +#if !defined(__CYGWIN__) && !defined(_WIN32_WCE) +#define CREATE_THREAD (HANDLE)_beginthreadex( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) +#define PA_THREAD_FUNC static unsigned WINAPI +#define PA_THREAD_ID unsigned +#else +#define CREATE_THREAD CreateThread( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) +#define PA_THREAD_FUNC static DWORD WINAPI +#define PA_THREAD_ID DWORD +#endif +#if (defined(_WIN32_WCE)) +#pragma comment(lib, "Coredll.lib") +#elif (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ +#pragma comment(lib, "winmm.lib") +#endif + +/* + provided in newer platform sdks + */ +#ifndef DWORD_PTR + #if defined(_WIN64) + #define DWORD_PTR unsigned __int64 + #else + #define DWORD_PTR unsigned long + #endif +#endif + +/************************************************* Constants ********/ + +#define PA_MME_USE_HIGH_DEFAULT_LATENCY_ (0) /* For debugging glitches. */ + +#if PA_MME_USE_HIGH_DEFAULT_LATENCY_ + #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.4) + #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (4) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (4) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (4) + #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) + #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.3) /* Do not exceed unless user buffer exceeds */ + #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ +#else + #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.2) + #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (2) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (3) /* always use at least 3 input buffers for full duplex */ + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (2) + #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) + #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.1) /* Do not exceed unless user buffer exceeds */ + #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ +#endif + +/* Use higher latency for NT because it is even worse at real-time + operation than Win9x. +*/ +#define PA_MME_WIN_NT_DEFAULT_LATENCY_ (0.4) + +/* Default low latency for WDM based systems. This is based on a rough + survey of workable latency settings using patest_wmme_find_best_latency_params.c. + See pdf attached to ticket 185 for a graph of the survey results: + http://www.portaudio.com/trac/ticket/185 + + Workable latencies varied between 40ms and ~80ms on different systems (different + combinations of hardware, 32 and 64 bit, WinXP, Vista and Win7. We didn't + get enough Vista results to know if Vista has systemically worse latency. + For now we choose a safe value across all Windows versions here. +*/ +#define PA_MME_WIN_WDM_DEFAULT_LATENCY_ (0.090) + + +/* When client suggestedLatency could result in many host buffers, we aim to have around 8, + based off Windows documentation that suggests that the kmixer uses 8 buffers. This choice + is somewhat arbitrary here, since we havn't observed significant stability degredation + with using either more, or less buffers. +*/ +#define PA_MME_TARGET_HOST_BUFFER_COUNT_ 8 + +#define PA_MME_MIN_TIMEOUT_MSEC_ (1000) + +static const char constInputMapperSuffix_[] = " - Input"; +static const char constOutputMapperSuffix_[] = " - Output"; + +/* +copies TCHAR string to explicit char string +*/ +char *StrTCpyToC(char *to, const TCHAR *from) +{ +#if !defined(_UNICODE) && !defined(UNICODE) + return strcpy(to, from); +#else + int count = wcslen(from); + if (count != 0) + if (WideCharToMultiByte(CP_ACP, 0, from, count, to, count, NULL, NULL) == 0) + return NULL; + return to; +#endif +} + +/* +returns length of TCHAR string +*/ +size_t StrTLen(const TCHAR *str) +{ +#if !defined(_UNICODE) && !defined(UNICODE) + return strlen(str); +#else + return wcslen(str); +#endif +} + +/********************************************************************/ + +typedef struct PaWinMmeStream PaWinMmeStream; /* forward declaration */ + +/* prototypes for functions declared in this file */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ); +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** stream, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); +static PaError CloseStream( PaStream* stream ); +static PaError StartStream( PaStream *stream ); +static PaError StopStream( PaStream *stream ); +static PaError AbortStream( PaStream *stream ); +static PaError IsStreamStopped( PaStream *s ); +static PaError IsStreamActive( PaStream *stream ); +static PaTime GetStreamTime( PaStream *stream ); +static double GetStreamCpuLoad( PaStream* stream ); +static PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames ); +static PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); +static signed long GetStreamReadAvailable( PaStream* stream ); +static signed long GetStreamWriteAvailable( PaStream* stream ); + + +/* macros for setting last host error information */ + +#ifdef UNICODE + +#define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ + { \ + wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveInGetErrorText( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ + } + +#define PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ) \ + { \ + wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveOutGetErrorText( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ + } + +#else /* !UNICODE */ + +#define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ + { \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveInGetErrorText( mmresult, mmeErrorText, MAXERRORLENGTH ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ + } + +#define PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ) \ + { \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveOutGetErrorText( mmresult, mmeErrorText, MAXERRORLENGTH ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ + } + +#endif /* UNICODE */ + + +static void PaMme_SetLastSystemError( DWORD errorCode ) +{ + char *lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + PaUtil_SetLastHostErrorInfo( paMME, errorCode, lpMsgBuf ); + LocalFree( lpMsgBuf ); +} + +#define PA_MME_SET_LAST_SYSTEM_ERROR( errorCode ) \ + PaMme_SetLastSystemError( errorCode ) + + +/* PaError returning wrappers for some commonly used win32 functions + note that we allow passing a null ptr to have no effect. +*/ + +static PaError CreateEventWithPaError( HANDLE *handle, + LPSECURITY_ATTRIBUTES lpEventAttributes, + BOOL bManualReset, + BOOL bInitialState, + LPCTSTR lpName ) +{ + PaError result = paNoError; + + *handle = NULL; + + *handle = CreateEvent( lpEventAttributes, bManualReset, bInitialState, lpName ); + if( *handle == NULL ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + + return result; +} + + +static PaError ResetEventWithPaError( HANDLE handle ) +{ + PaError result = paNoError; + + if( handle ) + { + if( ResetEvent( handle ) == 0 ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + } + + return result; +} + + +static PaError CloseHandleWithPaError( HANDLE handle ) +{ + PaError result = paNoError; + + if( handle ) + { + if( CloseHandle( handle ) == 0 ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); + } + } + + return result; +} + + +/* PaWinMmeHostApiRepresentation - host api datastructure specific to this implementation */ + +typedef struct +{ + PaUtilHostApiRepresentation inheritedHostApiRep; + PaUtilStreamInterface callbackStreamInterface; + PaUtilStreamInterface blockingStreamInterface; + + PaUtilAllocationGroup *allocations; + + int inputDeviceCount, outputDeviceCount; + + /** winMmeDeviceIds is an array of WinMme device ids. + fields in the range [0, inputDeviceCount) are input device ids, + and [inputDeviceCount, inputDeviceCount + outputDeviceCount) are output + device ids. + */ + UINT *winMmeDeviceIds; +} +PaWinMmeHostApiRepresentation; + + +typedef struct +{ + PaDeviceInfo inheritedDeviceInfo; + DWORD dwFormats; /**<< standard formats bitmask from the WAVEINCAPS and WAVEOUTCAPS structures */ + char deviceInputChannelCountIsKnown; /**<< if the system returns 0xFFFF then we don't really know the number of supported channels (1=>known, 0=>unknown)*/ + char deviceOutputChannelCountIsKnown; /**<< if the system returns 0xFFFF then we don't really know the number of supported channels (1=>known, 0=>unknown)*/ +} +PaWinMmeDeviceInfo; + + +/************************************************************************* + * Returns recommended device ID. + * On the PC, the recommended device can be specified by the user by + * setting an environment variable. For example, to use device #1. + * + * set PA_RECOMMENDED_OUTPUT_DEVICE=1 + * + * The user should first determine the available device ID by using + * the supplied application "pa_devs". + */ +#define PA_ENV_BUF_SIZE_ (32) +#define PA_REC_IN_DEV_ENV_NAME_ ("PA_RECOMMENDED_INPUT_DEVICE") +#define PA_REC_OUT_DEV_ENV_NAME_ ("PA_RECOMMENDED_OUTPUT_DEVICE") +static PaDeviceIndex GetEnvDefaultDeviceID( char *envName ) +{ + PaDeviceIndex recommendedIndex = paNoDevice; + DWORD hresult; + char envbuf[PA_ENV_BUF_SIZE_]; + +#ifndef WIN32_PLATFORM_PSPC /* no GetEnvironmentVariable on PocketPC */ + + /* Let user determine default device by setting environment variable. */ + hresult = GetEnvironmentVariable( envName, envbuf, PA_ENV_BUF_SIZE_ ); + if( (hresult > 0) && (hresult < PA_ENV_BUF_SIZE_) ) + { + recommendedIndex = atoi( envbuf ); + } +#endif + + return recommendedIndex; +} + + +static void InitializeDefaultDeviceIdsFromEnv( PaWinMmeHostApiRepresentation *hostApi ) +{ + PaDeviceIndex device; + + /* input */ + device = GetEnvDefaultDeviceID( PA_REC_IN_DEV_ENV_NAME_ ); + if( device != paNoDevice && + ( device >= 0 && device < hostApi->inheritedHostApiRep.info.deviceCount ) && + hostApi->inheritedHostApiRep.deviceInfos[ device ]->maxInputChannels > 0 ) + { + hostApi->inheritedHostApiRep.info.defaultInputDevice = device; + } + + /* output */ + device = GetEnvDefaultDeviceID( PA_REC_OUT_DEV_ENV_NAME_ ); + if( device != paNoDevice && + ( device >= 0 && device < hostApi->inheritedHostApiRep.info.deviceCount ) && + hostApi->inheritedHostApiRep.deviceInfos[ device ]->maxOutputChannels > 0 ) + { + hostApi->inheritedHostApiRep.info.defaultOutputDevice = device; + } +} + + +/** Convert external PA ID to a windows multimedia device ID +*/ +static UINT LocalDeviceIndexToWinMmeDeviceId( PaWinMmeHostApiRepresentation *hostApi, PaDeviceIndex device ) +{ + assert( device >= 0 && device < hostApi->inputDeviceCount + hostApi->outputDeviceCount ); + + return hostApi->winMmeDeviceIds[ device ]; +} + + +static int SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( PaSampleFormat sampleFormat, unsigned long winMmeSpecificFlags ) +{ + int waveFormatTag = 0; + + if( winMmeSpecificFlags & paWinMmeWaveFormatDolbyAc3Spdif ) + waveFormatTag = PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF; + else if( winMmeSpecificFlags & paWinMmeWaveFormatWmaSpdif ) + waveFormatTag = PAWIN_WAVE_FORMAT_WMA_SPDIF; + else + waveFormatTag = PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ); + + return waveFormatTag; +} + + +static PaError QueryInputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx ) +{ + MMRESULT mmresult; + + switch( mmresult = waveInOpen( NULL, deviceId, waveFormatEx, 0, 0, WAVE_FORMAT_QUERY ) ) + { + case MMSYSERR_NOERROR: + return paNoError; + case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ + return paDeviceUnavailable; + case MMSYSERR_NODRIVER: /* No device driver is present. */ + return paDeviceUnavailable; + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + return paInsufficientMemory; + case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ + return paSampleFormatNotSupported; + + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + /* falls through */ + default: + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + return paUnanticipatedHostError; + } +} + + +static PaError QueryOutputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx ) +{ + MMRESULT mmresult; + + switch( mmresult = waveOutOpen( NULL, deviceId, waveFormatEx, 0, 0, WAVE_FORMAT_QUERY ) ) + { + case MMSYSERR_NOERROR: + return paNoError; + case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ + return paDeviceUnavailable; + case MMSYSERR_NODRIVER: /* No device driver is present. */ + return paDeviceUnavailable; + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + return paInsufficientMemory; + case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ + return paSampleFormatNotSupported; + + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + /* falls through */ + default: + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + return paUnanticipatedHostError; + } +} + + +static PaError QueryFormatSupported( PaDeviceInfo *deviceInfo, + PaError (*waveFormatExQueryFunction)(int, WAVEFORMATEX*), + int winMmeDeviceId, int channels, double sampleRate, unsigned long winMmeSpecificFlags ) +{ + PaWinMmeDeviceInfo *winMmeDeviceInfo = (PaWinMmeDeviceInfo*)deviceInfo; + PaWinWaveFormat waveFormat; + PaSampleFormat sampleFormat; + int waveFormatTag; + + /* @todo at the moment we only query with 16 bit sample format and directout speaker config*/ + + sampleFormat = paInt16; + waveFormatTag = SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( sampleFormat, winMmeSpecificFlags ); + + if( waveFormatTag == PaWin_SampleFormatToLinearWaveFormatTag( paInt16 ) ){ + + /* attempt bypass querying the device for linear formats */ + + if( sampleRate == 11025.0 + && ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1M16)) + || (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1S16)) ) ){ + + return paNoError; + } + + if( sampleRate == 22050.0 + && ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2M16)) + || (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2S16)) ) ){ + + return paNoError; + } + + if( sampleRate == 44100.0 + && ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4M16)) + || (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4S16)) ) ){ + + return paNoError; + } + } + + + /* first, attempt to query the device using WAVEFORMATEXTENSIBLE, + if this fails we fall back to WAVEFORMATEX */ + + PaWin_InitializeWaveFormatExtensible( &waveFormat, channels, sampleFormat, waveFormatTag, + sampleRate, PAWIN_SPEAKER_DIRECTOUT ); + + if( waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat ) == paNoError ) + return paNoError; + + PaWin_InitializeWaveFormatEx( &waveFormat, channels, sampleFormat, waveFormatTag, sampleRate ); + + return waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat ); +} + + +#define PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_ (13) /* must match array length below */ +static double defaultSampleRateSearchOrder_[] = + { 44100.0, 48000.0, 32000.0, 24000.0, 22050.0, 88200.0, 96000.0, 192000.0, + 16000.0, 12000.0, 11025.0, 9600.0, 8000.0 }; + +static void DetectDefaultSampleRate( PaWinMmeDeviceInfo *winMmeDeviceInfo, int winMmeDeviceId, + PaError (*waveFormatExQueryFunction)(int, WAVEFORMATEX*), int maxChannels ) +{ + PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; + int i; + + deviceInfo->defaultSampleRate = 0.; + + for( i=0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i ) + { + double sampleRate = defaultSampleRateSearchOrder_[ i ]; + PaError paerror = QueryFormatSupported( deviceInfo, waveFormatExQueryFunction, winMmeDeviceId, maxChannels, sampleRate, 0 ); + if( paerror == paNoError ) + { + deviceInfo->defaultSampleRate = sampleRate; + break; + } + } +} + + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO +static int QueryWaveInKSFilterMaxChannels( int waveInDeviceId, int *maxChannels ) +{ + void *devicePath; + DWORD devicePathSize; + int result = 0; + + if( waveInMessage((HWAVEIN)waveInDeviceId, DRV_QUERYDEVICEINTERFACESIZE, + (DWORD_PTR)&devicePathSize, 0 ) != MMSYSERR_NOERROR ) + return 0; + + devicePath = PaUtil_AllocateMemory( devicePathSize ); + if( !devicePath ) + return 0; + + /* apparently DRV_QUERYDEVICEINTERFACE returns a unicode interface path, although this is undocumented */ + if( waveInMessage((HWAVEIN)waveInDeviceId, DRV_QUERYDEVICEINTERFACE, + (DWORD_PTR)devicePath, devicePathSize ) == MMSYSERR_NOERROR ) + { + int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( devicePath, /* isInput= */ 1 ); + if( count > 0 ) + { + *maxChannels = count; + result = 1; + } + } + + PaUtil_FreeMemory( devicePath ); + + return result; +} +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + +static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeHostApi, + PaWinMmeDeviceInfo *winMmeDeviceInfo, UINT winMmeInputDeviceId, int *success ) +{ + PaError result = paNoError; + char *deviceName; /* non-const ptr */ + MMRESULT mmresult; + WAVEINCAPS wic; + PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; + + *success = 0; + + mmresult = waveInGetDevCaps( winMmeInputDeviceId, &wic, sizeof( WAVEINCAPS ) ); + if( mmresult == MMSYSERR_NOMEM ) + { + result = paInsufficientMemory; + goto error; + } + else if( mmresult != MMSYSERR_NOERROR ) + { + /* instead of returning paUnanticipatedHostError we return + paNoError, but leave success set as 0. This allows + Pa_Initialize to just ignore this device, without failing + the entire initialisation process. + */ + return paNoError; + } + + if( winMmeInputDeviceId == WAVE_MAPPER ) + { + /* Append I/O suffix to WAVE_MAPPER device. */ + deviceName = (char *)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, StrTLen( wic.szPname ) + 1 + sizeof(constInputMapperSuffix_) ); + if( !deviceName ) + { + result = paInsufficientMemory; + goto error; + } + StrTCpyToC( deviceName, wic.szPname ); + strcat( deviceName, constInputMapperSuffix_ ); + } + else + { + deviceName = (char*)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, StrTLen( wic.szPname ) + 1 ); + if( !deviceName ) + { + result = paInsufficientMemory; + goto error; + } + StrTCpyToC( deviceName, wic.szPname ); + } + deviceInfo->name = deviceName; + + if( wic.wChannels == 0xFFFF || wic.wChannels < 1 || wic.wChannels > 255 ){ + /* For Windows versions using WDM (possibly Windows 98 ME and later) + * the kernel mixer sits between the application and the driver. As a result, + * wave*GetDevCaps often kernel mixer channel counts, which are unlimited. + * When this happens we assume the device is stereo and set a flag + * so that other channel counts can be tried with OpenStream -- i.e. when + * device*ChannelCountIsKnown is false, OpenStream will try whatever + * channel count you supply. + * see also InitializeOutputDeviceInfo() below. + */ + + PA_DEBUG(("Pa_GetDeviceInfo: Num input channels reported as %d! Changed to 2.\n", wic.wChannels )); + deviceInfo->maxInputChannels = 2; + winMmeDeviceInfo->deviceInputChannelCountIsKnown = 0; + }else{ + deviceInfo->maxInputChannels = wic.wChannels; + winMmeDeviceInfo->deviceInputChannelCountIsKnown = 1; + } + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + winMmeDeviceInfo->deviceInputChannelCountIsKnown = + QueryWaveInKSFilterMaxChannels( winMmeInputDeviceId, &deviceInfo->maxInputChannels ); +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + winMmeDeviceInfo->dwFormats = wic.dwFormats; + + DetectDefaultSampleRate( winMmeDeviceInfo, winMmeInputDeviceId, + QueryInputWaveFormatEx, deviceInfo->maxInputChannels ); + + *success = 1; + +error: + return result; +} + + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO +static int QueryWaveOutKSFilterMaxChannels( int waveOutDeviceId, int *maxChannels ) +{ + void *devicePath; + DWORD devicePathSize; + int result = 0; + + if( waveOutMessage((HWAVEOUT)waveOutDeviceId, DRV_QUERYDEVICEINTERFACESIZE, + (DWORD_PTR)&devicePathSize, 0 ) != MMSYSERR_NOERROR ) + return 0; + + devicePath = PaUtil_AllocateMemory( devicePathSize ); + if( !devicePath ) + return 0; + + /* apparently DRV_QUERYDEVICEINTERFACE returns a unicode interface path, although this is undocumented */ + if( waveOutMessage((HWAVEOUT)waveOutDeviceId, DRV_QUERYDEVICEINTERFACE, + (DWORD_PTR)devicePath, devicePathSize ) == MMSYSERR_NOERROR ) + { + int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( devicePath, /* isInput= */ 0 ); + if( count > 0 ) + { + *maxChannels = count; + result = 1; + } + } + + PaUtil_FreeMemory( devicePath ); + + return result; +} +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + +static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeHostApi, + PaWinMmeDeviceInfo *winMmeDeviceInfo, UINT winMmeOutputDeviceId, int *success ) +{ + PaError result = paNoError; + char *deviceName; /* non-const ptr */ + MMRESULT mmresult; + WAVEOUTCAPS woc; + PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + int wdmksDeviceOutputChannelCountIsKnown; +#endif + + *success = 0; + + mmresult = waveOutGetDevCaps( winMmeOutputDeviceId, &woc, sizeof( WAVEOUTCAPS ) ); + if( mmresult == MMSYSERR_NOMEM ) + { + result = paInsufficientMemory; + goto error; + } + else if( mmresult != MMSYSERR_NOERROR ) + { + /* instead of returning paUnanticipatedHostError we return + paNoError, but leave success set as 0. This allows + Pa_Initialize to just ignore this device, without failing + the entire initialisation process. + */ + return paNoError; + } + + if( winMmeOutputDeviceId == WAVE_MAPPER ) + { + /* Append I/O suffix to WAVE_MAPPER device. */ + deviceName = (char *)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, StrTLen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_) ); + if( !deviceName ) + { + result = paInsufficientMemory; + goto error; + } + StrTCpyToC( deviceName, woc.szPname ); + strcat( deviceName, constOutputMapperSuffix_ ); + } + else + { + deviceName = (char*)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, StrTLen( woc.szPname ) + 1 ); + if( !deviceName ) + { + result = paInsufficientMemory; + goto error; + } + StrTCpyToC( deviceName, woc.szPname ); + } + deviceInfo->name = deviceName; + + if( woc.wChannels == 0xFFFF || woc.wChannels < 1 || woc.wChannels > 255 ){ + /* For Windows versions using WDM (possibly Windows 98 ME and later) + * the kernel mixer sits between the application and the driver. As a result, + * wave*GetDevCaps often kernel mixer channel counts, which are unlimited. + * When this happens we assume the device is stereo and set a flag + * so that other channel counts can be tried with OpenStream -- i.e. when + * device*ChannelCountIsKnown is false, OpenStream will try whatever + * channel count you supply. + * see also InitializeInputDeviceInfo() above. + */ + + PA_DEBUG(("Pa_GetDeviceInfo: Num output channels reported as %d! Changed to 2.\n", woc.wChannels )); + deviceInfo->maxOutputChannels = 2; + winMmeDeviceInfo->deviceOutputChannelCountIsKnown = 0; + }else{ + deviceInfo->maxOutputChannels = woc.wChannels; + winMmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; + } + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + wdmksDeviceOutputChannelCountIsKnown = QueryWaveOutKSFilterMaxChannels( + winMmeOutputDeviceId, &deviceInfo->maxOutputChannels ); + if( wdmksDeviceOutputChannelCountIsKnown && !winMmeDeviceInfo->deviceOutputChannelCountIsKnown ) + winMmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + winMmeDeviceInfo->dwFormats = woc.dwFormats; + + DetectDefaultSampleRate( winMmeDeviceInfo, winMmeOutputDeviceId, + QueryOutputWaveFormatEx, deviceInfo->maxOutputChannels ); + + *success = 1; + +error: + return result; +} + + +static void GetDefaultLatencies( PaTime *defaultLowLatency, PaTime *defaultHighLatency ) +{ + OSVERSIONINFO osvi; + osvi.dwOSVersionInfoSize = sizeof( osvi ); + GetVersionEx( &osvi ); + + /* Check for NT */ + if( (osvi.dwMajorVersion == 4) && (osvi.dwPlatformId == 2) ) + { + *defaultLowLatency = PA_MME_WIN_NT_DEFAULT_LATENCY_; + } + else if(osvi.dwMajorVersion >= 5) + { + *defaultLowLatency = PA_MME_WIN_WDM_DEFAULT_LATENCY_; + } + else + { + *defaultLowLatency = PA_MME_WIN_9X_DEFAULT_LATENCY_; + } + + *defaultHighLatency = *defaultLowLatency * 2; +} + + +PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) +{ + PaError result = paNoError; + int i; + PaWinMmeHostApiRepresentation *winMmeHostApi; + int inputDeviceCount, outputDeviceCount, maximumPossibleDeviceCount; + PaWinMmeDeviceInfo *deviceInfoArray; + int deviceInfoInitializationSucceeded; + PaTime defaultLowLatency, defaultHighLatency; + DWORD waveInPreferredDevice, waveOutPreferredDevice; + DWORD preferredDeviceStatusFlags; + + winMmeHostApi = (PaWinMmeHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaWinMmeHostApiRepresentation) ); + if( !winMmeHostApi ) + { + result = paInsufficientMemory; + goto error; + } + + winMmeHostApi->allocations = PaUtil_CreateAllocationGroup(); + if( !winMmeHostApi->allocations ) + { + result = paInsufficientMemory; + goto error; + } + + *hostApi = &winMmeHostApi->inheritedHostApiRep; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paMME; + (*hostApi)->info.name = "MME"; + + + /* initialise device counts and default devices under the assumption that + there are no devices. These values are incremented below if and when + devices are successfully initialized. + */ + (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.defaultOutputDevice = paNoDevice; + winMmeHostApi->inputDeviceCount = 0; + winMmeHostApi->outputDeviceCount = 0; + +#if !defined(DRVM_MAPPER_PREFERRED_GET) +/* DRVM_MAPPER_PREFERRED_GET is defined in mmddk.h but we avoid a dependency on the DDK by defining it here */ +#define DRVM_MAPPER_PREFERRED_GET (0x2000+21) +#endif + + /* the following calls assume that if wave*Message fails the preferred device parameter won't be modified */ + preferredDeviceStatusFlags = 0; + waveInPreferredDevice = -1; + waveInMessage( (HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveInPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); + + preferredDeviceStatusFlags = 0; + waveOutPreferredDevice = -1; + waveOutMessage( (HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); + + maximumPossibleDeviceCount = 0; + + inputDeviceCount = waveInGetNumDevs(); + if( inputDeviceCount > 0 ) + maximumPossibleDeviceCount += inputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ + + outputDeviceCount = waveOutGetNumDevs(); + if( outputDeviceCount > 0 ) + maximumPossibleDeviceCount += outputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ + + + if( maximumPossibleDeviceCount > 0 ){ + + (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, sizeof(PaDeviceInfo*) * maximumPossibleDeviceCount ); + if( !(*hostApi)->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaWinMmeDeviceInfo*)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, sizeof(PaWinMmeDeviceInfo) * maximumPossibleDeviceCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + winMmeHostApi->winMmeDeviceIds = (UINT*)PaUtil_GroupAllocateMemory( + winMmeHostApi->allocations, sizeof(int) * maximumPossibleDeviceCount ); + if( !winMmeHostApi->winMmeDeviceIds ) + { + result = paInsufficientMemory; + goto error; + } + + GetDefaultLatencies( &defaultLowLatency, &defaultHighLatency ); + + if( inputDeviceCount > 0 ){ + /* -1 is the WAVE_MAPPER */ + for( i = -1; i < inputDeviceCount; ++i ){ + UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i); + PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ (*hostApi)->info.deviceCount ]; + PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + deviceInfo->maxInputChannels = 0; + wmmeDeviceInfo->deviceInputChannelCountIsKnown = 1; + deviceInfo->maxOutputChannels = 0; + wmmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; + + deviceInfo->defaultLowInputLatency = defaultLowLatency; + deviceInfo->defaultLowOutputLatency = defaultLowLatency; + deviceInfo->defaultHighInputLatency = defaultHighLatency; + deviceInfo->defaultHighOutputLatency = defaultHighLatency; + + result = InitializeInputDeviceInfo( winMmeHostApi, wmmeDeviceInfo, + winMmeDeviceId, &deviceInfoInitializationSucceeded ); + if( result != paNoError ) + goto error; + + if( deviceInfoInitializationSucceeded ){ + if( (*hostApi)->info.defaultInputDevice == paNoDevice ){ + /* if there is currently no default device, use the first one available */ + (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; + + }else if( winMmeDeviceId == waveInPreferredDevice ){ + /* set the default device to the system preferred device */ + (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; + } + + winMmeHostApi->winMmeDeviceIds[ (*hostApi)->info.deviceCount ] = winMmeDeviceId; + (*hostApi)->deviceInfos[ (*hostApi)->info.deviceCount ] = deviceInfo; + + winMmeHostApi->inputDeviceCount++; + (*hostApi)->info.deviceCount++; + } + } + } + + if( outputDeviceCount > 0 ){ + /* -1 is the WAVE_MAPPER */ + for( i = -1; i < outputDeviceCount; ++i ){ + UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i); + PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ (*hostApi)->info.deviceCount ]; + PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + + deviceInfo->maxInputChannels = 0; + wmmeDeviceInfo->deviceInputChannelCountIsKnown = 1; + deviceInfo->maxOutputChannels = 0; + wmmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; + + deviceInfo->defaultLowInputLatency = defaultLowLatency; + deviceInfo->defaultLowOutputLatency = defaultLowLatency; + deviceInfo->defaultHighInputLatency = defaultHighLatency; + deviceInfo->defaultHighOutputLatency = defaultHighLatency; + + result = InitializeOutputDeviceInfo( winMmeHostApi, wmmeDeviceInfo, + winMmeDeviceId, &deviceInfoInitializationSucceeded ); + if( result != paNoError ) + goto error; + + if( deviceInfoInitializationSucceeded ){ + if( (*hostApi)->info.defaultOutputDevice == paNoDevice ){ + /* if there is currently no default device, use the first one available */ + (*hostApi)->info.defaultOutputDevice = (*hostApi)->info.deviceCount; + + }else if( winMmeDeviceId == waveOutPreferredDevice ){ + /* set the default device to the system preferred device */ + (*hostApi)->info.defaultOutputDevice = (*hostApi)->info.deviceCount; + } + + winMmeHostApi->winMmeDeviceIds[ (*hostApi)->info.deviceCount ] = winMmeDeviceId; + (*hostApi)->deviceInfos[ (*hostApi)->info.deviceCount ] = deviceInfo; + + winMmeHostApi->outputDeviceCount++; + (*hostApi)->info.deviceCount++; + } + } + } + } + + InitializeDefaultDeviceIdsFromEnv( winMmeHostApi ); + + (*hostApi)->Terminate = Terminate; + (*hostApi)->OpenStream = OpenStream; + (*hostApi)->IsFormatSupported = IsFormatSupported; + + PaUtil_InitializeStreamInterface( &winMmeHostApi->callbackStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, GetStreamCpuLoad, + PaUtil_DummyRead, PaUtil_DummyWrite, + PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); + + PaUtil_InitializeStreamInterface( &winMmeHostApi->blockingStreamInterface, CloseStream, StartStream, + StopStream, AbortStream, IsStreamStopped, IsStreamActive, + GetStreamTime, PaUtil_DummyGetCpuLoad, + ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); + + return result; + +error: + if( winMmeHostApi ) + { + if( winMmeHostApi->allocations ) + { + PaUtil_FreeAllAllocations( winMmeHostApi->allocations ); + PaUtil_DestroyAllocationGroup( winMmeHostApi->allocations ); + } + + PaUtil_FreeMemory( winMmeHostApi ); + } + + return result; +} + + +static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) +{ + PaWinMmeHostApiRepresentation *winMmeHostApi = (PaWinMmeHostApiRepresentation*)hostApi; + + if( winMmeHostApi->allocations ) + { + PaUtil_FreeAllAllocations( winMmeHostApi->allocations ); + PaUtil_DestroyAllocationGroup( winMmeHostApi->allocations ); + } + + PaUtil_FreeMemory( winMmeHostApi ); +} + + +static PaError IsInputChannelCountSupported( PaWinMmeDeviceInfo* deviceInfo, int channelCount ) +{ + PaError result = paNoError; + + if( channelCount > 0 + && deviceInfo->deviceInputChannelCountIsKnown + && channelCount > deviceInfo->inheritedDeviceInfo.maxInputChannels ){ + + result = paInvalidChannelCount; + } + + return result; +} + +static PaError IsOutputChannelCountSupported( PaWinMmeDeviceInfo* deviceInfo, int channelCount ) +{ + PaError result = paNoError; + + if( channelCount > 0 + && deviceInfo->deviceOutputChannelCountIsKnown + && channelCount > deviceInfo->inheritedDeviceInfo.maxOutputChannels ){ + + result = paInvalidChannelCount; + } + + return result; +} + +static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ) +{ + PaWinMmeHostApiRepresentation *winMmeHostApi = (PaWinMmeHostApiRepresentation*)hostApi; + PaDeviceInfo *inputDeviceInfo, *outputDeviceInfo; + int inputChannelCount, outputChannelCount; + int inputMultipleDeviceChannelCount, outputMultipleDeviceChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + PaWinMmeStreamInfo *inputStreamInfo, *outputStreamInfo; + UINT winMmeInputDeviceId, winMmeOutputDeviceId; + unsigned int i; + PaError paerror; + + /* The calls to QueryFormatSupported below are intended to detect invalid + sample rates. If we assume that the channel count and format are OK, + then the only thing that could fail is the sample rate. This isn't + strictly true, but I can't think of a better way to test that the + sample rate is valid. + */ + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + inputStreamInfo = inputParameters->hostApiSpecificStreamInfo; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( inputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + if( inputParameters->device == paUseHostApiSpecificDeviceSpecification + && inputStreamInfo && (inputStreamInfo->flags & paWinMmeUseMultipleDevices) ) + { + inputMultipleDeviceChannelCount = 0; + for( i=0; i< inputStreamInfo->deviceCount; ++i ) + { + inputMultipleDeviceChannelCount += inputStreamInfo->devices[i].channelCount; + + inputDeviceInfo = hostApi->deviceInfos[ inputStreamInfo->devices[i].device ]; + + /* check that input device can support inputChannelCount */ + if( inputStreamInfo->devices[i].channelCount < 1 ) + return paInvalidChannelCount; + + paerror = IsInputChannelCountSupported( (PaWinMmeDeviceInfo*)inputDeviceInfo, + inputStreamInfo->devices[i].channelCount ); + if( paerror != paNoError ) + return paerror; + + /* test for valid sample rate, see comment above */ + winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputStreamInfo->devices[i].device ); + paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, + winMmeInputDeviceId, inputStreamInfo->devices[i].channelCount, sampleRate, + ((inputStreamInfo) ? inputStreamInfo->flags : 0) ); + if( paerror != paNoError ) + return paInvalidSampleRate; + } + + if( inputMultipleDeviceChannelCount != inputChannelCount ) + return paIncompatibleHostApiSpecificStreamInfo; + } + else + { + if( inputStreamInfo && (inputStreamInfo->flags & paWinMmeUseMultipleDevices) ) + return paIncompatibleHostApiSpecificStreamInfo; /* paUseHostApiSpecificDeviceSpecification was not supplied as the input device */ + + inputDeviceInfo = hostApi->deviceInfos[ inputParameters->device ]; + + /* check that input device can support inputChannelCount */ + paerror = IsInputChannelCountSupported( (PaWinMmeDeviceInfo*)inputDeviceInfo, inputChannelCount ); + if( paerror != paNoError ) + return paerror; + + /* test for valid sample rate, see comment above */ + winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputParameters->device ); + paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, + winMmeInputDeviceId, inputChannelCount, sampleRate, + ((inputStreamInfo) ? inputStreamInfo->flags : 0) ); + if( paerror != paNoError ) + return paInvalidSampleRate; + } + } + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + outputStreamInfo = outputParameters->hostApiSpecificStreamInfo; + + /* all standard sample formats are supported by the buffer adapter, + this implementation doesn't support any custom sample formats */ + if( outputSampleFormat & paCustomFormat ) + return paSampleFormatNotSupported; + + if( outputParameters->device == paUseHostApiSpecificDeviceSpecification + && outputStreamInfo && (outputStreamInfo->flags & paWinMmeUseMultipleDevices) ) + { + outputMultipleDeviceChannelCount = 0; + for( i=0; i< outputStreamInfo->deviceCount; ++i ) + { + outputMultipleDeviceChannelCount += outputStreamInfo->devices[i].channelCount; + + outputDeviceInfo = hostApi->deviceInfos[ outputStreamInfo->devices[i].device ]; + + /* check that output device can support outputChannelCount */ + if( outputStreamInfo->devices[i].channelCount < 1 ) + return paInvalidChannelCount; + + paerror = IsOutputChannelCountSupported( (PaWinMmeDeviceInfo*)outputDeviceInfo, + outputStreamInfo->devices[i].channelCount ); + if( paerror != paNoError ) + return paerror; + + /* test for valid sample rate, see comment above */ + winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputStreamInfo->devices[i].device ); + paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, + winMmeOutputDeviceId, outputStreamInfo->devices[i].channelCount, sampleRate, + ((outputStreamInfo) ? outputStreamInfo->flags : 0) ); + if( paerror != paNoError ) + return paInvalidSampleRate; + } + + if( outputMultipleDeviceChannelCount != outputChannelCount ) + return paIncompatibleHostApiSpecificStreamInfo; + } + else + { + if( outputStreamInfo && (outputStreamInfo->flags & paWinMmeUseMultipleDevices) ) + return paIncompatibleHostApiSpecificStreamInfo; /* paUseHostApiSpecificDeviceSpecification was not supplied as the output device */ + + outputDeviceInfo = hostApi->deviceInfos[ outputParameters->device ]; + + /* check that output device can support outputChannelCount */ + paerror = IsOutputChannelCountSupported( (PaWinMmeDeviceInfo*)outputDeviceInfo, outputChannelCount ); + if( paerror != paNoError ) + return paerror; + + /* test for valid sample rate, see comment above */ + winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputParameters->device ); + paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, + winMmeOutputDeviceId, outputChannelCount, sampleRate, + ((outputStreamInfo) ? outputStreamInfo->flags : 0) ); + if( paerror != paNoError ) + return paInvalidSampleRate; + } + } + + /* + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported + + - check that the device supports sampleRate + + for mme all we can do is test that the input and output devices + support the requested sample rate and number of channels. we + cannot test for full duplex compatibility. + */ + + return paFormatIsSupported; +} + + +static unsigned long ComputeHostBufferCountForFixedBufferSizeFrames( + unsigned long suggestedLatencyFrames, + unsigned long hostBufferSizeFrames, + unsigned long minimumBufferCount ) +{ + /* Calculate the number of buffers of length hostFramesPerBuffer + that fit in suggestedLatencyFrames, rounding up to the next integer. + + The value (hostBufferSizeFrames - 1) below is to ensure the buffer count is rounded up. + */ + unsigned long resultBufferCount = ((suggestedLatencyFrames + (hostBufferSizeFrames - 1)) / hostBufferSizeFrames); + + /* We always need one extra buffer for processing while the rest are queued/playing. + i.e. latency is framesPerBuffer * (bufferCount - 1) + */ + resultBufferCount += 1; + + if( resultBufferCount < minimumBufferCount ) /* clamp to minimum buffer count */ + resultBufferCount = minimumBufferCount; + + return resultBufferCount; +} + + +static unsigned long ComputeHostBufferSizeGivenHardUpperLimit( + unsigned long userFramesPerBuffer, + unsigned long absoluteMaximumBufferSizeFrames ) +{ + static unsigned long primes_[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, + 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 0 }; /* zero terminated */ + + unsigned long result = userFramesPerBuffer; + int i; + + assert( absoluteMaximumBufferSizeFrames > 67 ); /* assume maximum is large and we're only factoring by small primes */ + + /* search for the largest integer factor of userFramesPerBuffer less + than or equal to absoluteMaximumBufferSizeFrames */ + + /* repeatedly divide by smallest prime factors until a buffer size + smaller than absoluteMaximumBufferSizeFrames is found */ + while( result > absoluteMaximumBufferSizeFrames ){ + + /* search for the smallest prime factor of result */ + for( i=0; primes_[i] != 0; ++i ) + { + unsigned long p = primes_[i]; + unsigned long divided = result / p; + if( divided*p == result ) + { + result = divided; + break; /* continue with outer while loop */ + } + } + if( primes_[i] == 0 ) + { /* loop failed to find a prime factor, return an approximate result */ + unsigned long d = (userFramesPerBuffer + (absoluteMaximumBufferSizeFrames-1)) + / absoluteMaximumBufferSizeFrames; + return userFramesPerBuffer / d; + } + } + + return result; +} + + +static PaError SelectHostBufferSizeFramesAndHostBufferCount( + unsigned long suggestedLatencyFrames, + unsigned long userFramesPerBuffer, + unsigned long minimumBufferCount, + unsigned long preferredMaximumBufferSizeFrames, /* try not to exceed this. for example, don't exceed when coalescing buffers */ + unsigned long absoluteMaximumBufferSizeFrames, /* never exceed this, a hard limit */ + unsigned long *hostBufferSizeFrames, + unsigned long *hostBufferCount ) +{ + unsigned long effectiveUserFramesPerBuffer; + unsigned long numberOfUserBuffersPerHostBuffer; + + + if( userFramesPerBuffer == paFramesPerBufferUnspecified ){ + + effectiveUserFramesPerBuffer = PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_; + + }else{ + + if( userFramesPerBuffer > absoluteMaximumBufferSizeFrames ){ + + /* user has requested a user buffer that's larger than absoluteMaximumBufferSizeFrames. + try to choose a buffer size that is equal or smaller than absoluteMaximumBufferSizeFrames + but is also an integer factor of userFramesPerBuffer, so as to distribute computation evenly. + the buffer processor will handle the block adaption between host and user buffer sizes. + see http://www.portaudio.com/trac/ticket/189 for discussion. + */ + + effectiveUserFramesPerBuffer = ComputeHostBufferSizeGivenHardUpperLimit( userFramesPerBuffer, absoluteMaximumBufferSizeFrames ); + assert( effectiveUserFramesPerBuffer <= absoluteMaximumBufferSizeFrames ); + + /* try to ensure that duration of host buffering is at least as + large as duration of user buffer. */ + if( suggestedLatencyFrames < userFramesPerBuffer ) + suggestedLatencyFrames = userFramesPerBuffer; + + }else{ + + effectiveUserFramesPerBuffer = userFramesPerBuffer; + } + } + + /* compute a host buffer count based on suggestedLatencyFrames and our granularity */ + + *hostBufferSizeFrames = effectiveUserFramesPerBuffer; + + *hostBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( + suggestedLatencyFrames, *hostBufferSizeFrames, minimumBufferCount ); + + if( *hostBufferSizeFrames >= userFramesPerBuffer ) + { + /* + If there are too many host buffers we would like to coalesce + them by packing an integer number of user buffers into each host buffer. + We try to coalesce such that hostBufferCount will lie between + PA_MME_TARGET_HOST_BUFFER_COUNT_ and (PA_MME_TARGET_HOST_BUFFER_COUNT_*2)-1. + We limit coalescing to avoid exceeding either absoluteMaximumBufferSizeFrames and + preferredMaximumBufferSizeFrames. + + First, compute a coalescing factor: the number of user buffers per host buffer. + The goal is to achieve PA_MME_TARGET_HOST_BUFFER_COUNT_ total buffer count. + Since our latency is computed based on (*hostBufferCount - 1) we compute a + coalescing factor based on (*hostBufferCount - 1) and (PA_MME_TARGET_HOST_BUFFER_COUNT_-1). + + The + (PA_MME_TARGET_HOST_BUFFER_COUNT_-2) term below is intended to round up. + */ + numberOfUserBuffersPerHostBuffer = ((*hostBufferCount - 1) + (PA_MME_TARGET_HOST_BUFFER_COUNT_-2)) / (PA_MME_TARGET_HOST_BUFFER_COUNT_ - 1); + + if( numberOfUserBuffersPerHostBuffer > 1 ) + { + unsigned long maxCoalescedBufferSizeFrames = (absoluteMaximumBufferSizeFrames < preferredMaximumBufferSizeFrames) /* minimum of our limits */ + ? absoluteMaximumBufferSizeFrames + : preferredMaximumBufferSizeFrames; + + unsigned long maxUserBuffersPerHostBuffer = maxCoalescedBufferSizeFrames / effectiveUserFramesPerBuffer; /* don't coalesce more than this */ + + if( numberOfUserBuffersPerHostBuffer > maxUserBuffersPerHostBuffer ) + numberOfUserBuffersPerHostBuffer = maxUserBuffersPerHostBuffer; + + *hostBufferSizeFrames = effectiveUserFramesPerBuffer * numberOfUserBuffersPerHostBuffer; + + /* recompute hostBufferCount to approximate suggestedLatencyFrames now that hostBufferSizeFrames is larger */ + *hostBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( + suggestedLatencyFrames, *hostBufferSizeFrames, minimumBufferCount ); + } + } + + return paNoError; +} + + +static PaError CalculateMaxHostSampleFrameSizeBytes( + int channelCount, + PaSampleFormat hostSampleFormat, + const PaWinMmeStreamInfo *streamInfo, + int *hostSampleFrameSizeBytes ) +{ + unsigned int i; + /* PA WMME streams may aggregate multiple WMME devices. When the stream addresses + more than one device in a single direction, maxDeviceChannelCount is the maximum + number of channels used by a single device. + */ + int maxDeviceChannelCount = channelCount; + int hostSampleSizeBytes = Pa_GetSampleSize( hostSampleFormat ); + if( hostSampleSizeBytes < 0 ) + { + return hostSampleSizeBytes; /* the value of hostSampleSize here is an error code, not a sample size */ + } + + if( streamInfo && ( streamInfo->flags & paWinMmeUseMultipleDevices ) ) + { + maxDeviceChannelCount = streamInfo->devices[0].channelCount; + for( i=1; i< streamInfo->deviceCount; ++i ) + { + if( streamInfo->devices[i].channelCount > maxDeviceChannelCount ) + maxDeviceChannelCount = streamInfo->devices[i].channelCount; + } + } + + *hostSampleFrameSizeBytes = hostSampleSizeBytes * maxDeviceChannelCount; + + return paNoError; +} + + +/* CalculateBufferSettings() fills the framesPerHostInputBuffer, hostInputBufferCount, + framesPerHostOutputBuffer and hostOutputBufferCount parameters based on the values + of the other parameters. +*/ + +static PaError CalculateBufferSettings( + unsigned long *hostFramesPerInputBuffer, unsigned long *hostInputBufferCount, + unsigned long *hostFramesPerOutputBuffer, unsigned long *hostOutputBufferCount, + int inputChannelCount, PaSampleFormat hostInputSampleFormat, + PaTime suggestedInputLatency, const PaWinMmeStreamInfo *inputStreamInfo, + int outputChannelCount, PaSampleFormat hostOutputSampleFormat, + PaTime suggestedOutputLatency, const PaWinMmeStreamInfo *outputStreamInfo, + double sampleRate, unsigned long userFramesPerBuffer ) +{ + PaError result = paNoError; + + if( inputChannelCount > 0 ) /* stream has input */ + { + int hostInputFrameSizeBytes; + result = CalculateMaxHostSampleFrameSizeBytes( + inputChannelCount, hostInputSampleFormat, inputStreamInfo, &hostInputFrameSizeBytes ); + if( result != paNoError ) + goto error; + + if( inputStreamInfo + && ( inputStreamInfo->flags & paWinMmeUseLowLevelLatencyParameters ) ) + { + /* input - using low level latency parameters if provided */ + + if( inputStreamInfo->bufferCount <= 0 + || inputStreamInfo->framesPerBuffer <= 0 ) + { + result = paIncompatibleHostApiSpecificStreamInfo; + goto error; + } + + *hostFramesPerInputBuffer = inputStreamInfo->framesPerBuffer; + *hostInputBufferCount = inputStreamInfo->bufferCount; + } + else + { + /* input - not using low level latency parameters, so compute + hostFramesPerInputBuffer and hostInputBufferCount + based on userFramesPerBuffer and suggestedInputLatency. */ + + unsigned long minimumBufferCount = (outputChannelCount > 0) + ? PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ + : PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_; + + result = SelectHostBufferSizeFramesAndHostBufferCount( + (unsigned long)(suggestedInputLatency * sampleRate), /* (truncate) */ + userFramesPerBuffer, + minimumBufferCount, + (unsigned long)(PA_MME_MAX_HOST_BUFFER_SECS_ * sampleRate), /* in frames. preferred maximum */ + (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostInputFrameSizeBytes), /* in frames. a hard limit. note truncation due to + division is intentional here to limit max bytes */ + hostFramesPerInputBuffer, + hostInputBufferCount ); + if( result != paNoError ) + goto error; + } + } + else + { + *hostFramesPerInputBuffer = 0; + *hostInputBufferCount = 0; + } + + if( outputChannelCount > 0 ) /* stream has output */ + { + if( outputStreamInfo + && ( outputStreamInfo->flags & paWinMmeUseLowLevelLatencyParameters ) ) + { + /* output - using low level latency parameters */ + + if( outputStreamInfo->bufferCount <= 0 + || outputStreamInfo->framesPerBuffer <= 0 ) + { + result = paIncompatibleHostApiSpecificStreamInfo; + goto error; + } + + *hostFramesPerOutputBuffer = outputStreamInfo->framesPerBuffer; + *hostOutputBufferCount = outputStreamInfo->bufferCount; + + if( inputChannelCount > 0 ) /* full duplex */ + { + /* harmonize hostFramesPerInputBuffer and hostFramesPerOutputBuffer */ + + if( *hostFramesPerInputBuffer != *hostFramesPerOutputBuffer ) + { + if( inputStreamInfo + && ( inputStreamInfo->flags & paWinMmeUseLowLevelLatencyParameters ) ) + { + /* a custom StreamInfo was used for specifying both input + and output buffer sizes. We require that the larger buffer size + must be a multiple of the smaller buffer size */ + + if( *hostFramesPerInputBuffer < *hostFramesPerOutputBuffer ) + { + if( *hostFramesPerOutputBuffer % *hostFramesPerInputBuffer != 0 ) + { + result = paIncompatibleHostApiSpecificStreamInfo; + goto error; + } + } + else + { + assert( *hostFramesPerInputBuffer > *hostFramesPerOutputBuffer ); + if( *hostFramesPerInputBuffer % *hostFramesPerOutputBuffer != 0 ) + { + result = paIncompatibleHostApiSpecificStreamInfo; + goto error; + } + } + } + else + { + /* a custom StreamInfo was not used for specifying the input buffer size, + so use the output buffer size, and approximately the suggested input latency. */ + + *hostFramesPerInputBuffer = *hostFramesPerOutputBuffer; + + *hostInputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( + (unsigned long)(suggestedInputLatency * sampleRate), + *hostFramesPerInputBuffer, + PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ ); + } + } + } + } + else + { + /* output - no low level latency parameters, so compute hostFramesPerOutputBuffer and hostOutputBufferCount + based on userFramesPerBuffer and suggestedOutputLatency. */ + + int hostOutputFrameSizeBytes; + result = CalculateMaxHostSampleFrameSizeBytes( + outputChannelCount, hostOutputSampleFormat, outputStreamInfo, &hostOutputFrameSizeBytes ); + if( result != paNoError ) + goto error; + + /* compute the output buffer size and count */ + + result = SelectHostBufferSizeFramesAndHostBufferCount( + (unsigned long)(suggestedOutputLatency * sampleRate), /* (truncate) */ + userFramesPerBuffer, + PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_, + (unsigned long)(PA_MME_MAX_HOST_BUFFER_SECS_ * sampleRate), /* in frames. preferred maximum */ + (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostOutputFrameSizeBytes), /* in frames. a hard limit. note truncation due to + division is intentional here to limit max bytes */ + hostFramesPerOutputBuffer, + hostOutputBufferCount ); + if( result != paNoError ) + goto error; + + if( inputChannelCount > 0 ) /* full duplex */ + { + /* harmonize hostFramesPerInputBuffer and hostFramesPerOutputBuffer */ + + /* ensure that both input and output buffer sizes are the same. + if they don't match at this stage, choose the smallest one + and use that for input and output and recompute the corresponding + buffer count accordingly. + */ + + if( *hostFramesPerOutputBuffer != *hostFramesPerInputBuffer ) + { + if( hostFramesPerInputBuffer < hostFramesPerOutputBuffer ) + { + *hostFramesPerOutputBuffer = *hostFramesPerInputBuffer; + + *hostOutputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( + (unsigned long)(suggestedOutputLatency * sampleRate), + *hostOutputBufferCount, + PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ ); + } + else + { + *hostFramesPerInputBuffer = *hostFramesPerOutputBuffer; + + *hostInputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( + (unsigned long)(suggestedInputLatency * sampleRate), + *hostFramesPerInputBuffer, + PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ ); + } + } + } + } + } + else + { + *hostFramesPerOutputBuffer = 0; + *hostOutputBufferCount = 0; + } + +error: + return result; +} + + +typedef struct +{ + HANDLE bufferEvent; + void *waveHandles; + unsigned int deviceCount; + /* unsigned int channelCount; */ + WAVEHDR **waveHeaders; /* waveHeaders[device][buffer] */ + unsigned int bufferCount; + unsigned int currentBufferIndex; + unsigned int framesPerBuffer; + unsigned int framesUsedInCurrentBuffer; +}PaWinMmeSingleDirectionHandlesAndBuffers; + +/* prototypes for functions operating on PaWinMmeSingleDirectionHandlesAndBuffers */ + +static void InitializeSingleDirectionHandlesAndBuffers( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers ); +static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostApi, + PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, + unsigned long winMmeSpecificFlags, + unsigned long bytesPerHostSample, + double sampleRate, PaWinMmeDeviceAndChannelCount *devices, + unsigned int deviceCount, PaWinWaveFormatChannelMask channelMask, int isInput ); +static PaError TerminateWaveHandles( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, int isInput, int currentlyProcessingAnError ); +static PaError InitializeWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, + unsigned long hostBufferCount, + PaSampleFormat hostSampleFormat, + unsigned long framesPerHostBuffer, + PaWinMmeDeviceAndChannelCount *devices, + int isInput ); +static void TerminateWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, int isInput ); + + +static void InitializeSingleDirectionHandlesAndBuffers( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers ) +{ + handlesAndBuffers->bufferEvent = 0; + handlesAndBuffers->waveHandles = 0; + handlesAndBuffers->deviceCount = 0; + handlesAndBuffers->waveHeaders = 0; + handlesAndBuffers->bufferCount = 0; +} + +static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostApi, + PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, + unsigned long winMmeSpecificFlags, + unsigned long bytesPerHostSample, + double sampleRate, PaWinMmeDeviceAndChannelCount *devices, + unsigned int deviceCount, PaWinWaveFormatChannelMask channelMask, int isInput ) +{ + PaError result; + MMRESULT mmresult; + signed int i, j; + PaSampleFormat sampleFormat; + int waveFormatTag; + + /* for error cleanup we expect that InitializeSingleDirectionHandlesAndBuffers() + has already been called to zero some fields */ + + result = CreateEventWithPaError( &handlesAndBuffers->bufferEvent, NULL, FALSE, FALSE, NULL ); + if( result != paNoError ) goto error; + + if( isInput ) + handlesAndBuffers->waveHandles = (void*)PaUtil_AllocateMemory( sizeof(HWAVEIN) * deviceCount ); + else + handlesAndBuffers->waveHandles = (void*)PaUtil_AllocateMemory( sizeof(HWAVEOUT) * deviceCount ); + if( !handlesAndBuffers->waveHandles ) + { + result = paInsufficientMemory; + goto error; + } + + handlesAndBuffers->deviceCount = deviceCount; + + for( i = 0; i < (signed int)deviceCount; ++i ) + { + if( isInput ) + ((HWAVEIN*)handlesAndBuffers->waveHandles)[i] = 0; + else + ((HWAVEOUT*)handlesAndBuffers->waveHandles)[i] = 0; + } + + /* @todo at the moment we only use 16 bit sample format */ + sampleFormat = paInt16; + waveFormatTag = SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( sampleFormat, winMmeSpecificFlags ); + + for( i = 0; i < (signed int)deviceCount; ++i ) + { + PaWinWaveFormat waveFormat; + UINT winMmeDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, devices[i].device ); + + /* @todo: consider providing a flag or #define to not try waveformat extensible + this could just initialize j to 1 the first time round. */ + + for( j = 0; j < 2; ++j ) + { + switch(j){ + case 0: + /* first, attempt to open the device using WAVEFORMATEXTENSIBLE, + if this fails we fall back to WAVEFORMATEX */ + + PaWin_InitializeWaveFormatExtensible( &waveFormat, devices[i].channelCount, + sampleFormat, waveFormatTag, sampleRate, channelMask ); + break; + + case 1: + /* retry with WAVEFORMATEX */ + + PaWin_InitializeWaveFormatEx( &waveFormat, devices[i].channelCount, + sampleFormat, waveFormatTag, sampleRate ); + break; + } + + /* REVIEW: consider not firing an event for input when a full duplex + stream is being used. this would probably depend on the + neverDropInput flag. */ + + if( isInput ) + { + mmresult = waveInOpen( &((HWAVEIN*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, + (WAVEFORMATEX*)&waveFormat, + (DWORD_PTR)handlesAndBuffers->bufferEvent, (DWORD_PTR)0, CALLBACK_EVENT ); + } + else + { + mmresult = waveOutOpen( &((HWAVEOUT*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, + (WAVEFORMATEX*)&waveFormat, + (DWORD_PTR)handlesAndBuffers->bufferEvent, (DWORD_PTR)0, CALLBACK_EVENT ); + } + + if( mmresult == MMSYSERR_NOERROR ) + { + break; /* success */ + } + else if( j == 0 ) + { + continue; /* try again with WAVEFORMATEX */ + } + else + { + switch( mmresult ) + { + case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ + result = paDeviceUnavailable; + break; + case MMSYSERR_NODRIVER: /* No device driver is present. */ + result = paDeviceUnavailable; + break; + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + result = paInsufficientMemory; + break; + + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + /* falls through */ + + case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ + /* This can also occur if we try to open the device with an unsupported + * number of channels. This is attempted when device*ChannelCountIsKnown is + * set to 0. + */ + /* falls through */ + default: + result = paUnanticipatedHostError; + if( isInput ) + { + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + } + else + { + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + } + } + goto error; + } + } + } + + return result; + +error: + TerminateWaveHandles( handlesAndBuffers, isInput, 1 /* currentlyProcessingAnError */ ); + + return result; +} + + +static PaError TerminateWaveHandles( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, int isInput, int currentlyProcessingAnError ) +{ + PaError result = paNoError; + MMRESULT mmresult; + signed int i; + + if( handlesAndBuffers->waveHandles ) + { + for( i = handlesAndBuffers->deviceCount-1; i >= 0; --i ) + { + if( isInput ) + { + if( ((HWAVEIN*)handlesAndBuffers->waveHandles)[i] ) + mmresult = waveInClose( ((HWAVEIN*)handlesAndBuffers->waveHandles)[i] ); + else + mmresult = MMSYSERR_NOERROR; + } + else + { + if( ((HWAVEOUT*)handlesAndBuffers->waveHandles)[i] ) + mmresult = waveOutClose( ((HWAVEOUT*)handlesAndBuffers->waveHandles)[i] ); + else + mmresult = MMSYSERR_NOERROR; + } + + if( mmresult != MMSYSERR_NOERROR && + !currentlyProcessingAnError ) /* don't update the error state if we're already processing an error */ + { + result = paUnanticipatedHostError; + if( isInput ) + { + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + } + else + { + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + } + /* note that we don't break here, we try to continue closing devices */ + } + } + + PaUtil_FreeMemory( handlesAndBuffers->waveHandles ); + handlesAndBuffers->waveHandles = 0; + } + + if( handlesAndBuffers->bufferEvent ) + { + result = CloseHandleWithPaError( handlesAndBuffers->bufferEvent ); + handlesAndBuffers->bufferEvent = 0; + } + + return result; +} + + +static PaError InitializeWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, + unsigned long hostBufferCount, + PaSampleFormat hostSampleFormat, + unsigned long framesPerHostBuffer, + PaWinMmeDeviceAndChannelCount *devices, + int isInput ) +{ + PaError result = paNoError; + MMRESULT mmresult; + WAVEHDR *deviceWaveHeaders; + signed int i, j; + + /* for error cleanup we expect that InitializeSingleDirectionHandlesAndBuffers() + has already been called to zero some fields */ + + + /* allocate an array of pointers to arrays of wave headers, one array of + wave headers per device */ + handlesAndBuffers->waveHeaders = (WAVEHDR**)PaUtil_AllocateMemory( sizeof(WAVEHDR*) * handlesAndBuffers->deviceCount ); + if( !handlesAndBuffers->waveHeaders ) + { + result = paInsufficientMemory; + goto error; + } + + for( i = 0; i < (signed int)handlesAndBuffers->deviceCount; ++i ) + handlesAndBuffers->waveHeaders[i] = 0; + + handlesAndBuffers->bufferCount = hostBufferCount; + + for( i = 0; i < (signed int)handlesAndBuffers->deviceCount; ++i ) + { + int bufferBytes = Pa_GetSampleSize( hostSampleFormat ) * + framesPerHostBuffer * devices[i].channelCount; + if( bufferBytes < 0 ) + { + result = paInternalError; + goto error; + } + + /* Allocate an array of wave headers for device i */ + deviceWaveHeaders = (WAVEHDR *) PaUtil_AllocateMemory( sizeof(WAVEHDR)*hostBufferCount ); + if( !deviceWaveHeaders ) + { + result = paInsufficientMemory; + goto error; + } + + for( j=0; j < (signed int)hostBufferCount; ++j ) + deviceWaveHeaders[j].lpData = 0; + + handlesAndBuffers->waveHeaders[i] = deviceWaveHeaders; + + /* Allocate a buffer for each wave header */ + for( j=0; j < (signed int)hostBufferCount; ++j ) + { + deviceWaveHeaders[j].lpData = (char *)PaUtil_AllocateMemory( bufferBytes ); + if( !deviceWaveHeaders[j].lpData ) + { + result = paInsufficientMemory; + goto error; + } + deviceWaveHeaders[j].dwBufferLength = bufferBytes; + deviceWaveHeaders[j].dwUser = 0xFFFFFFFF; /* indicates that *PrepareHeader() has not yet been called, for error clean up code */ + + if( isInput ) + { + mmresult = waveInPrepareHeader( ((HWAVEIN*)handlesAndBuffers->waveHandles)[i], &deviceWaveHeaders[j], sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + goto error; + } + } + else /* output */ + { + mmresult = waveOutPrepareHeader( ((HWAVEOUT*)handlesAndBuffers->waveHandles)[i], &deviceWaveHeaders[j], sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + goto error; + } + } + deviceWaveHeaders[j].dwUser = devices[i].channelCount; + } + } + + return result; + +error: + TerminateWaveHeaders( handlesAndBuffers, isInput ); + + return result; +} + + +static void TerminateWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, int isInput ) +{ + signed int i, j; + WAVEHDR *deviceWaveHeaders; + + if( handlesAndBuffers->waveHeaders ) + { + for( i = handlesAndBuffers->deviceCount-1; i >= 0 ; --i ) + { + deviceWaveHeaders = handlesAndBuffers->waveHeaders[i]; /* wave headers for device i */ + if( deviceWaveHeaders ) + { + for( j = handlesAndBuffers->bufferCount-1; j >= 0; --j ) + { + if( deviceWaveHeaders[j].lpData ) + { + if( deviceWaveHeaders[j].dwUser != 0xFFFFFFFF ) + { + if( isInput ) + waveInUnprepareHeader( ((HWAVEIN*)handlesAndBuffers->waveHandles)[i], &deviceWaveHeaders[j], sizeof(WAVEHDR) ); + else + waveOutUnprepareHeader( ((HWAVEOUT*)handlesAndBuffers->waveHandles)[i], &deviceWaveHeaders[j], sizeof(WAVEHDR) ); + } + + PaUtil_FreeMemory( deviceWaveHeaders[j].lpData ); + } + } + + PaUtil_FreeMemory( deviceWaveHeaders ); + } + } + + PaUtil_FreeMemory( handlesAndBuffers->waveHeaders ); + handlesAndBuffers->waveHeaders = 0; + } +} + + + +/* PaWinMmeStream - a stream data structure specifically for this implementation */ +/* note that struct PaWinMmeStream is typedeffed to PaWinMmeStream above. */ +struct PaWinMmeStream +{ + PaUtilStreamRepresentation streamRepresentation; + PaUtilCpuLoadMeasurer cpuLoadMeasurer; + PaUtilBufferProcessor bufferProcessor; + + int primeStreamUsingCallback; + + PaWinMmeSingleDirectionHandlesAndBuffers input; + PaWinMmeSingleDirectionHandlesAndBuffers output; + + /* Processing thread management -------------- */ + HANDLE abortEvent; + HANDLE processingThread; + PA_THREAD_ID processingThreadId; + + char throttleProcessingThreadOnOverload; /* 0 -> don't throtte, non-0 -> throttle */ + int processingThreadPriority; + int highThreadPriority; + int throttledThreadPriority; + unsigned long throttledSleepMsecs; + + int isStopped; + volatile int isActive; + volatile int stopProcessing; /* stop thread once existing buffers have been returned */ + volatile int abortProcessing; /* stop thread immediately */ + + DWORD allBuffersDurationMs; /* used to calculate timeouts */ +}; + +/* updates deviceCount if PaWinMmeUseMultipleDevices is used */ + +static PaError ValidateWinMmeSpecificStreamInfo( + const PaStreamParameters *streamParameters, + const PaWinMmeStreamInfo *streamInfo, + unsigned long *winMmeSpecificFlags, + char *throttleProcessingThreadOnOverload, + unsigned long *deviceCount ) +{ + if( streamInfo ) + { + if( streamInfo->size != sizeof( PaWinMmeStreamInfo ) + || streamInfo->version != 1 ) + { + return paIncompatibleHostApiSpecificStreamInfo; + } + + *winMmeSpecificFlags = streamInfo->flags; + + if( streamInfo->flags & paWinMmeDontThrottleOverloadedProcessingThread ) + *throttleProcessingThreadOnOverload = 0; + + if( streamInfo->flags & paWinMmeUseMultipleDevices ) + { + if( streamParameters->device != paUseHostApiSpecificDeviceSpecification ) + return paInvalidDevice; + + *deviceCount = streamInfo->deviceCount; + } + } + + return paNoError; +} + +static PaError RetrieveDevicesFromStreamParameters( + struct PaUtilHostApiRepresentation *hostApi, + const PaStreamParameters *streamParameters, + const PaWinMmeStreamInfo *streamInfo, + PaWinMmeDeviceAndChannelCount *devices, + unsigned long deviceCount ) +{ + PaError result = paNoError; + unsigned int i; + int totalChannelCount; + PaDeviceIndex hostApiDevice; + + if( streamInfo && streamInfo->flags & paWinMmeUseMultipleDevices ) + { + totalChannelCount = 0; + for( i=0; i < deviceCount; ++i ) + { + /* validate that the device number is within range */ + result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDevice, + streamInfo->devices[i].device, hostApi ); + if( result != paNoError ) + return result; + + devices[i].device = hostApiDevice; + devices[i].channelCount = streamInfo->devices[i].channelCount; + + totalChannelCount += devices[i].channelCount; + } + + if( totalChannelCount != streamParameters->channelCount ) + { + /* channelCount must match total channels specified by multiple devices */ + return paInvalidChannelCount; /* REVIEW use of this error code */ + } + } + else + { + devices[0].device = streamParameters->device; + devices[0].channelCount = streamParameters->channelCount; + } + + return result; +} + +static PaError ValidateInputChannelCounts( + struct PaUtilHostApiRepresentation *hostApi, + PaWinMmeDeviceAndChannelCount *devices, + unsigned long deviceCount ) +{ + unsigned int i; + PaWinMmeDeviceInfo *inputDeviceInfo; + PaError paerror; + + for( i=0; i < deviceCount; ++i ) + { + if( devices[i].channelCount < 1 ) + return paInvalidChannelCount; + + inputDeviceInfo = + (PaWinMmeDeviceInfo*)hostApi->deviceInfos[ devices[i].device ]; + + paerror = IsInputChannelCountSupported( inputDeviceInfo, devices[i].channelCount ); + if( paerror != paNoError ) + return paerror; + } + + return paNoError; +} + +static PaError ValidateOutputChannelCounts( + struct PaUtilHostApiRepresentation *hostApi, + PaWinMmeDeviceAndChannelCount *devices, + unsigned long deviceCount ) +{ + unsigned int i; + PaWinMmeDeviceInfo *outputDeviceInfo; + PaError paerror; + + for( i=0; i < deviceCount; ++i ) + { + if( devices[i].channelCount < 1 ) + return paInvalidChannelCount; + + outputDeviceInfo = + (PaWinMmeDeviceInfo*)hostApi->deviceInfos[ devices[i].device ]; + + paerror = IsOutputChannelCountSupported( outputDeviceInfo, devices[i].channelCount ); + if( paerror != paNoError ) + return paerror; + } + + return paNoError; +} + + +/* the following macros are intended to improve the readability of the following code */ +#define PA_IS_INPUT_STREAM_( stream ) ( stream ->input.waveHandles ) +#define PA_IS_OUTPUT_STREAM_( stream ) ( stream ->output.waveHandles ) +#define PA_IS_FULL_DUPLEX_STREAM_( stream ) ( stream ->input.waveHandles && stream ->output.waveHandles ) +#define PA_IS_HALF_DUPLEX_STREAM_( stream ) ( !(stream ->input.waveHandles && stream ->output.waveHandles) ) + +static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, + PaStream** s, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result; + PaWinMmeHostApiRepresentation *winMmeHostApi = (PaWinMmeHostApiRepresentation*)hostApi; + PaWinMmeStream *stream = 0; + int bufferProcessorIsInitialized = 0; + int streamRepresentationIsInitialized = 0; + PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; + int inputChannelCount, outputChannelCount; + PaSampleFormat inputSampleFormat, outputSampleFormat; + double suggestedInputLatency, suggestedOutputLatency; + PaWinMmeStreamInfo *inputStreamInfo, *outputStreamInfo; + PaWinWaveFormatChannelMask inputChannelMask, outputChannelMask; + unsigned long framesPerHostInputBuffer; + unsigned long hostInputBufferCount; + unsigned long framesPerHostOutputBuffer; + unsigned long hostOutputBufferCount; + unsigned long framesPerBufferProcessorCall; + PaWinMmeDeviceAndChannelCount *inputDevices = 0; /* contains all devices and channel counts as local host api ids, even when PaWinMmeUseMultipleDevices is not used */ + unsigned long winMmeSpecificInputFlags = 0; + unsigned long inputDeviceCount = 0; + PaWinMmeDeviceAndChannelCount *outputDevices = 0; + unsigned long winMmeSpecificOutputFlags = 0; + unsigned long outputDeviceCount = 0; /* contains all devices and channel counts as local host api ids, even when PaWinMmeUseMultipleDevices is not used */ + char throttleProcessingThreadOnOverload = 1; + + + if( inputParameters ) + { + inputChannelCount = inputParameters->channelCount; + inputSampleFormat = inputParameters->sampleFormat; + suggestedInputLatency = inputParameters->suggestedLatency; + + inputDeviceCount = 1; + + /* validate input hostApiSpecificStreamInfo */ + inputStreamInfo = (PaWinMmeStreamInfo*)inputParameters->hostApiSpecificStreamInfo; + result = ValidateWinMmeSpecificStreamInfo( inputParameters, inputStreamInfo, + &winMmeSpecificInputFlags, + &throttleProcessingThreadOnOverload, + &inputDeviceCount ); + if( result != paNoError ) return result; + + inputDevices = (PaWinMmeDeviceAndChannelCount*)alloca( sizeof(PaWinMmeDeviceAndChannelCount) * inputDeviceCount ); + if( !inputDevices ) return paInsufficientMemory; + + result = RetrieveDevicesFromStreamParameters( hostApi, inputParameters, inputStreamInfo, inputDevices, inputDeviceCount ); + if( result != paNoError ) return result; + + result = ValidateInputChannelCounts( hostApi, inputDevices, inputDeviceCount ); + if( result != paNoError ) return result; + + hostInputSampleFormat = + PaUtil_SelectClosestAvailableFormat( paInt16 /* native formats */, inputSampleFormat ); + + if( inputDeviceCount != 1 ){ + /* always use direct speakers when using multi-device multichannel mode */ + inputChannelMask = PAWIN_SPEAKER_DIRECTOUT; + } + else + { + if( inputStreamInfo && inputStreamInfo->flags & paWinMmeUseChannelMask ) + inputChannelMask = inputStreamInfo->channelMask; + else + inputChannelMask = PaWin_DefaultChannelMask( inputDevices[0].channelCount ); + } + } + else + { + inputChannelCount = 0; + inputSampleFormat = 0; + suggestedInputLatency = 0.; + inputStreamInfo = 0; + hostInputSampleFormat = 0; + } + + + if( outputParameters ) + { + outputChannelCount = outputParameters->channelCount; + outputSampleFormat = outputParameters->sampleFormat; + suggestedOutputLatency = outputParameters->suggestedLatency; + + outputDeviceCount = 1; + + /* validate output hostApiSpecificStreamInfo */ + outputStreamInfo = (PaWinMmeStreamInfo*)outputParameters->hostApiSpecificStreamInfo; + result = ValidateWinMmeSpecificStreamInfo( outputParameters, outputStreamInfo, + &winMmeSpecificOutputFlags, + &throttleProcessingThreadOnOverload, + &outputDeviceCount ); + if( result != paNoError ) return result; + + outputDevices = (PaWinMmeDeviceAndChannelCount*)alloca( sizeof(PaWinMmeDeviceAndChannelCount) * outputDeviceCount ); + if( !outputDevices ) return paInsufficientMemory; + + result = RetrieveDevicesFromStreamParameters( hostApi, outputParameters, outputStreamInfo, outputDevices, outputDeviceCount ); + if( result != paNoError ) return result; + + result = ValidateOutputChannelCounts( hostApi, outputDevices, outputDeviceCount ); + if( result != paNoError ) return result; + + hostOutputSampleFormat = + PaUtil_SelectClosestAvailableFormat( paInt16 /* native formats */, outputSampleFormat ); + + if( outputDeviceCount != 1 ){ + /* always use direct speakers when using multi-device multichannel mode */ + outputChannelMask = PAWIN_SPEAKER_DIRECTOUT; + } + else + { + if( outputStreamInfo && outputStreamInfo->flags & paWinMmeUseChannelMask ) + outputChannelMask = outputStreamInfo->channelMask; + else + outputChannelMask = PaWin_DefaultChannelMask( outputDevices[0].channelCount ); + } + } + else + { + outputChannelCount = 0; + outputSampleFormat = 0; + outputStreamInfo = 0; + hostOutputSampleFormat = 0; + suggestedOutputLatency = 0.; + } + + + /* + IMPLEMENT ME: + - alter sampleRate to a close allowable rate if possible / necessary + */ + + + /* validate platform specific flags */ + if( (streamFlags & paPlatformSpecificFlags) != 0 ) + return paInvalidFlag; /* unexpected platform specific flag */ + + + /* always disable clipping and dithering if we are outputting a raw spdif stream */ + if( (winMmeSpecificOutputFlags & paWinMmeWaveFormatDolbyAc3Spdif) + || (winMmeSpecificOutputFlags & paWinMmeWaveFormatWmaSpdif) ){ + + streamFlags = streamFlags | paClipOff | paDitherOff; + } + + + result = CalculateBufferSettings( &framesPerHostInputBuffer, &hostInputBufferCount, + &framesPerHostOutputBuffer, &hostOutputBufferCount, + inputChannelCount, hostInputSampleFormat, suggestedInputLatency, inputStreamInfo, + outputChannelCount, hostOutputSampleFormat, suggestedOutputLatency, outputStreamInfo, + sampleRate, framesPerBuffer ); + if( result != paNoError ) goto error; + + + stream = (PaWinMmeStream*)PaUtil_AllocateMemory( sizeof(PaWinMmeStream) ); + if( !stream ) + { + result = paInsufficientMemory; + goto error; + } + + InitializeSingleDirectionHandlesAndBuffers( &stream->input ); + InitializeSingleDirectionHandlesAndBuffers( &stream->output ); + + stream->abortEvent = 0; + stream->processingThread = 0; + + stream->throttleProcessingThreadOnOverload = throttleProcessingThreadOnOverload; + + PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, + ( (streamCallback) + ? &winMmeHostApi->callbackStreamInterface + : &winMmeHostApi->blockingStreamInterface ), + streamCallback, userData ); + streamRepresentationIsInitialized = 1; + + PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); + + + if( inputParameters && outputParameters ) /* full duplex */ + { + if( framesPerHostInputBuffer < framesPerHostOutputBuffer ) + { + assert( (framesPerHostOutputBuffer % framesPerHostInputBuffer) == 0 ); /* CalculateBufferSettings() should guarantee this condition */ + + framesPerBufferProcessorCall = framesPerHostInputBuffer; + } + else + { + assert( (framesPerHostInputBuffer % framesPerHostOutputBuffer) == 0 ); /* CalculateBufferSettings() should guarantee this condition */ + + framesPerBufferProcessorCall = framesPerHostOutputBuffer; + } + } + else if( inputParameters ) + { + framesPerBufferProcessorCall = framesPerHostInputBuffer; + } + else if( outputParameters ) + { + framesPerBufferProcessorCall = framesPerHostOutputBuffer; + } + + stream->input.framesPerBuffer = framesPerHostInputBuffer; + stream->output.framesPerBuffer = framesPerHostOutputBuffer; + + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, hostInputSampleFormat, + outputChannelCount, outputSampleFormat, hostOutputSampleFormat, + sampleRate, streamFlags, framesPerBuffer, + framesPerBufferProcessorCall, paUtilFixedHostBufferSize, + streamCallback, userData ); + if( result != paNoError ) goto error; + + bufferProcessorIsInitialized = 1; + + /* stream info input latency is the minimum buffering latency (unlike suggested and default which are *maximums*) */ + stream->streamRepresentation.streamInfo.inputLatency = + (double)(PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) + + framesPerHostInputBuffer) / sampleRate; + stream->streamRepresentation.streamInfo.outputLatency = + (double)(PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) + + (framesPerHostOutputBuffer * (hostOutputBufferCount-1))) / sampleRate; + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; + + stream->primeStreamUsingCallback = ( (streamFlags&paPrimeOutputBuffersUsingStreamCallback) && streamCallback ) ? 1 : 0; + + /* time to sleep when throttling due to >100% cpu usage. + -a quater of a buffer's duration */ + stream->throttledSleepMsecs = + (unsigned long)(stream->bufferProcessor.framesPerHostBuffer * + stream->bufferProcessor.samplePeriod * .25 * 1000); + + stream->isStopped = 1; + stream->isActive = 0; + + + /* for maximum compatibility with multi-device multichannel drivers, + we first open all devices, then we prepare all buffers, finally + we start all devices ( in StartStream() ). teardown in reverse order. + */ + + if( inputParameters ) + { + result = InitializeWaveHandles( winMmeHostApi, &stream->input, + winMmeSpecificInputFlags, + stream->bufferProcessor.bytesPerHostInputSample, sampleRate, + inputDevices, inputDeviceCount, inputChannelMask, 1 /* isInput */ ); + if( result != paNoError ) goto error; + } + + if( outputParameters ) + { + result = InitializeWaveHandles( winMmeHostApi, &stream->output, + winMmeSpecificOutputFlags, + stream->bufferProcessor.bytesPerHostOutputSample, sampleRate, + outputDevices, outputDeviceCount, outputChannelMask, 0 /* isInput */ ); + if( result != paNoError ) goto error; + } + + if( inputParameters ) + { + result = InitializeWaveHeaders( &stream->input, hostInputBufferCount, + hostInputSampleFormat, framesPerHostInputBuffer, inputDevices, 1 /* isInput */ ); + if( result != paNoError ) goto error; + } + + if( outputParameters ) + { + result = InitializeWaveHeaders( &stream->output, hostOutputBufferCount, + hostOutputSampleFormat, framesPerHostOutputBuffer, outputDevices, 0 /* not isInput */ ); + if( result != paNoError ) goto error; + + stream->allBuffersDurationMs = (DWORD) (1000.0 * (framesPerHostOutputBuffer * stream->output.bufferCount) / sampleRate); + } + else + { + stream->allBuffersDurationMs = (DWORD) (1000.0 * (framesPerHostInputBuffer * stream->input.bufferCount) / sampleRate); + } + + + if( streamCallback ) + { + /* abort event is only needed for callback streams */ + result = CreateEventWithPaError( &stream->abortEvent, NULL, TRUE, FALSE, NULL ); + if( result != paNoError ) goto error; + } + + *s = (PaStream*)stream; + + return result; + +error: + + if( stream ) + { + if( stream->abortEvent ) + CloseHandle( stream->abortEvent ); + + TerminateWaveHeaders( &stream->output, 0 /* not isInput */ ); + TerminateWaveHeaders( &stream->input, 1 /* isInput */ ); + + TerminateWaveHandles( &stream->output, 0 /* not isInput */, 1 /* currentlyProcessingAnError */ ); + TerminateWaveHandles( &stream->input, 1 /* isInput */, 1 /* currentlyProcessingAnError */ ); + + if( bufferProcessorIsInitialized ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( streamRepresentationIsInitialized ) + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + + PaUtil_FreeMemory( stream ); + } + + return result; +} + + +/* return non-zero if all current buffers are done */ +static int BuffersAreDone( WAVEHDR **waveHeaders, unsigned int deviceCount, int bufferIndex ) +{ + unsigned int i; + + for( i=0; i < deviceCount; ++i ) + { + if( !(waveHeaders[i][ bufferIndex ].dwFlags & WHDR_DONE) ) + { + return 0; + } + } + + return 1; +} + +static int CurrentInputBuffersAreDone( PaWinMmeStream *stream ) +{ + return BuffersAreDone( stream->input.waveHeaders, stream->input.deviceCount, stream->input.currentBufferIndex ); +} + +static int CurrentOutputBuffersAreDone( PaWinMmeStream *stream ) +{ + return BuffersAreDone( stream->output.waveHeaders, stream->output.deviceCount, stream->output.currentBufferIndex ); +} + + +/* return non-zero if any buffers are queued */ +static int NoBuffersAreQueued( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers ) +{ + unsigned int i, j; + + if( handlesAndBuffers->waveHandles ) + { + for( i=0; i < handlesAndBuffers->bufferCount; ++i ) + { + for( j=0; j < handlesAndBuffers->deviceCount; ++j ) + { + if( !( handlesAndBuffers->waveHeaders[ j ][ i ].dwFlags & WHDR_DONE) ) + { + return 0; + } + } + } + } + + return 1; +} + + +#define PA_CIRCULAR_INCREMENT_( current, max )\ + ( (((current) + 1) >= (max)) ? (0) : (current+1) ) + +#define PA_CIRCULAR_DECREMENT_( current, max )\ + ( ((current) == 0) ? ((max)-1) : (current-1) ) + + +static signed long GetAvailableFrames( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers ) +{ + signed long result = 0; + unsigned int i; + + if( BuffersAreDone( handlesAndBuffers->waveHeaders, handlesAndBuffers->deviceCount, handlesAndBuffers->currentBufferIndex ) ) + { + /* we could calculate the following in O(1) if we kept track of the + last done buffer */ + result = handlesAndBuffers->framesPerBuffer - handlesAndBuffers->framesUsedInCurrentBuffer; + + i = PA_CIRCULAR_INCREMENT_( handlesAndBuffers->currentBufferIndex, handlesAndBuffers->bufferCount ); + while( i != handlesAndBuffers->currentBufferIndex ) + { + if( BuffersAreDone( handlesAndBuffers->waveHeaders, handlesAndBuffers->deviceCount, i ) ) + { + result += handlesAndBuffers->framesPerBuffer; + i = PA_CIRCULAR_INCREMENT_( i, handlesAndBuffers->bufferCount ); + } + else + break; + } + } + + return result; +} + + +static PaError AdvanceToNextInputBuffer( PaWinMmeStream *stream ) +{ + PaError result = paNoError; + MMRESULT mmresult; + unsigned int i; + + for( i=0; i < stream->input.deviceCount; ++i ) + { + stream->input.waveHeaders[i][ stream->input.currentBufferIndex ].dwFlags &= ~WHDR_DONE; + mmresult = waveInAddBuffer( ((HWAVEIN*)stream->input.waveHandles)[i], + &stream->input.waveHeaders[i][ stream->input.currentBufferIndex ], + sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + } + } + + stream->input.currentBufferIndex = + PA_CIRCULAR_INCREMENT_( stream->input.currentBufferIndex, stream->input.bufferCount ); + + stream->input.framesUsedInCurrentBuffer = 0; + + return result; +} + + +static PaError AdvanceToNextOutputBuffer( PaWinMmeStream *stream ) +{ + PaError result = paNoError; + MMRESULT mmresult; + unsigned int i; + + for( i=0; i < stream->output.deviceCount; ++i ) + { + mmresult = waveOutWrite( ((HWAVEOUT*)stream->output.waveHandles)[i], + &stream->output.waveHeaders[i][ stream->output.currentBufferIndex ], + sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + } + } + + stream->output.currentBufferIndex = + PA_CIRCULAR_INCREMENT_( stream->output.currentBufferIndex, stream->output.bufferCount ); + + stream->output.framesUsedInCurrentBuffer = 0; + + return result; +} + + +/* requeue all but the most recent input with the driver. Used for catching + up after a total input buffer underrun */ +static PaError CatchUpInputBuffers( PaWinMmeStream *stream ) +{ + PaError result = paNoError; + unsigned int i; + + for( i=0; i < stream->input.bufferCount - 1; ++i ) + { + result = AdvanceToNextInputBuffer( stream ); + if( result != paNoError ) + break; + } + + return result; +} + + +/* take the most recent output and duplicate it to all other output buffers + and requeue them. Used for catching up after a total output buffer underrun. +*/ +static PaError CatchUpOutputBuffers( PaWinMmeStream *stream ) +{ + PaError result = paNoError; + unsigned int i, j; + unsigned int previousBufferIndex = + PA_CIRCULAR_DECREMENT_( stream->output.currentBufferIndex, stream->output.bufferCount ); + + for( i=0; i < stream->output.bufferCount - 1; ++i ) + { + for( j=0; j < stream->output.deviceCount; ++j ) + { + if( stream->output.waveHeaders[j][ stream->output.currentBufferIndex ].lpData + != stream->output.waveHeaders[j][ previousBufferIndex ].lpData ) + { + CopyMemory( stream->output.waveHeaders[j][ stream->output.currentBufferIndex ].lpData, + stream->output.waveHeaders[j][ previousBufferIndex ].lpData, + stream->output.waveHeaders[j][ stream->output.currentBufferIndex ].dwBufferLength ); + } + } + + result = AdvanceToNextOutputBuffer( stream ); + if( result != paNoError ) + break; + } + + return result; +} + + +PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) +{ + PaWinMmeStream *stream = (PaWinMmeStream *)pArg; + HANDLE events[3]; + int eventCount = 0; + DWORD result = paNoError; + DWORD waitResult; + DWORD timeout = (unsigned long)(stream->allBuffersDurationMs * 0.5); + int hostBuffersAvailable; + signed int hostInputBufferIndex, hostOutputBufferIndex; + PaStreamCallbackFlags statusFlags; + int callbackResult; + int done = 0; + unsigned int channel, i; + unsigned long framesProcessed; + + /* prepare event array for call to WaitForMultipleObjects() */ + if( stream->input.bufferEvent ) + events[eventCount++] = stream->input.bufferEvent; + if( stream->output.bufferEvent ) + events[eventCount++] = stream->output.bufferEvent; + events[eventCount++] = stream->abortEvent; + + statusFlags = 0; /** @todo support paInputUnderflow, paOutputOverflow and paNeverDropInput */ + + /* loop until something causes us to stop */ + do{ + /* wait for MME to signal that a buffer is available, or for + the PA abort event to be signaled. + + When this indicates that one or more buffers are available + NoBuffersAreQueued() and Current*BuffersAreDone are used below to + poll for additional done buffers. NoBuffersAreQueued() will fail + to identify an underrun/overflow if the driver doesn't mark all done + buffers prior to signalling the event. Some drivers do this + (eg RME Digi96, and others don't eg VIA PC 97 input). This isn't a + huge problem, it just means that we won't always be able to detect + underflow/overflow. + */ + waitResult = WaitForMultipleObjects( eventCount, events, FALSE /* wait all = FALSE */, timeout ); + if( waitResult == WAIT_FAILED ) + { + result = paUnanticipatedHostError; + /** @todo FIXME/REVIEW: can't return host error info from an asyncronous thread. see http://www.portaudio.com/trac/ticket/143 */ + done = 1; + } + else if( waitResult == WAIT_TIMEOUT ) + { + /* if a timeout is encountered, continue */ + } + + if( stream->abortProcessing ) + { + /* Pa_AbortStream() has been called, stop processing immediately */ + done = 1; + } + else if( stream->stopProcessing ) + { + /* Pa_StopStream() has been called or the user callback returned + non-zero, processing will continue until all output buffers + are marked as done. The stream will stop immediately if it + is input-only. + */ + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + if( NoBuffersAreQueued( &stream->output ) ) + done = 1; /* Will cause thread to return. */ + } + else + { + /* input only stream */ + done = 1; /* Will cause thread to return. */ + } + } + else + { + hostBuffersAvailable = 1; + + /* process all available host buffers */ + do + { + hostInputBufferIndex = -1; + hostOutputBufferIndex = -1; + + if( PA_IS_INPUT_STREAM_(stream) ) + { + if( CurrentInputBuffersAreDone( stream ) ) + { + if( NoBuffersAreQueued( &stream->input ) ) + { + /** @todo + if all of the other buffers are also ready then + we discard all but the most recent. This is an + input buffer overflow. FIXME: these buffers should + be passed to the callback in a paNeverDropInput + stream. http://www.portaudio.com/trac/ticket/142 + + note that it is also possible for an input overflow + to happen while the callback is processing a buffer. + that is handled further down. + */ + result = CatchUpInputBuffers( stream ); + if( result != paNoError ) + done = 1; + + statusFlags |= paInputOverflow; + } + + hostInputBufferIndex = stream->input.currentBufferIndex; + } + } + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + if( CurrentOutputBuffersAreDone( stream ) ) + { + /* ok, we have an output buffer */ + + if( NoBuffersAreQueued( &stream->output ) ) + { + /* + if all of the other buffers are also ready, catch up by copying + the most recently generated buffer into all but one of the output + buffers. + + note that this catch up code only handles the case where all + buffers have been played out due to this thread not having + woken up at all. a more common case occurs when this thread + is woken up, processes one buffer, but takes too long, and as + a result all the other buffers have become un-queued. that + case is handled further down. + */ + + result = CatchUpOutputBuffers( stream ); + if( result != paNoError ) + done = 1; + + statusFlags |= paOutputUnderflow; + } + + hostOutputBufferIndex = stream->output.currentBufferIndex; + } + } + + + if( (PA_IS_FULL_DUPLEX_STREAM_(stream) && hostInputBufferIndex != -1 && hostOutputBufferIndex != -1) || + (PA_IS_HALF_DUPLEX_STREAM_(stream) && ( hostInputBufferIndex != -1 || hostOutputBufferIndex != -1 ) ) ) + { + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /** @todo implement inputBufferAdcTime */ + + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + /* set timeInfo.currentTime and calculate timeInfo.outputBufferDacTime + from the current wave out position */ + MMTIME mmtime; + double timeBeforeGetPosition, timeAfterGetPosition; + double time; + long framesInBufferRing; + long writePosition; + long playbackPosition; + HWAVEOUT firstWaveOutDevice = ((HWAVEOUT*)stream->output.waveHandles)[0]; + + mmtime.wType = TIME_SAMPLES; + timeBeforeGetPosition = PaUtil_GetTime(); + waveOutGetPosition( firstWaveOutDevice, &mmtime, sizeof(MMTIME) ); + timeAfterGetPosition = PaUtil_GetTime(); + + timeInfo.currentTime = timeAfterGetPosition; + + /* approximate time at which wave out position was measured + as half way between timeBeforeGetPosition and timeAfterGetPosition */ + time = timeBeforeGetPosition + (timeAfterGetPosition - timeBeforeGetPosition) * .5; + + framesInBufferRing = stream->output.bufferCount * stream->bufferProcessor.framesPerHostBuffer; + playbackPosition = mmtime.u.sample % framesInBufferRing; + + writePosition = stream->output.currentBufferIndex * stream->bufferProcessor.framesPerHostBuffer + + stream->output.framesUsedInCurrentBuffer; + + if( playbackPosition >= writePosition ){ + timeInfo.outputBufferDacTime = + time + ((double)( writePosition + (framesInBufferRing - playbackPosition) ) * stream->bufferProcessor.samplePeriod ); + }else{ + timeInfo.outputBufferDacTime = + time + ((double)( writePosition - playbackPosition ) * stream->bufferProcessor.samplePeriod ); + } + } + + + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, statusFlags ); + + /* reset status flags once they have been passed to the buffer processor */ + statusFlags = 0; + + if( PA_IS_INPUT_STREAM_(stream) ) + { + PaUtil_SetInputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); + + channel = 0; + for( i=0; iinput.deviceCount; ++i ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->input.waveHeaders[i][ hostInputBufferIndex ].dwUser; + + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, channel, + stream->input.waveHeaders[i][ hostInputBufferIndex ].lpData + + stream->input.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostInputSample, + channelCount ); + + + channel += channelCount; + } + } + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); + + channel = 0; + for( i=0; ioutput.deviceCount; ++i ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->output.waveHeaders[i][ hostOutputBufferIndex ].dwUser; + + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, channel, + stream->output.waveHeaders[i][ hostOutputBufferIndex ].lpData + + stream->output.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostOutputSample, + channelCount ); + + channel += channelCount; + } + } + + callbackResult = paContinue; + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + + stream->input.framesUsedInCurrentBuffer += framesProcessed; + stream->output.framesUsedInCurrentBuffer += framesProcessed; + + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + + if( callbackResult == paContinue ) + { + /* nothing special to do */ + } + else if( callbackResult == paAbort ) + { + stream->abortProcessing = 1; + done = 1; + /** @todo FIXME: should probably reset the output device immediately once the callback returns paAbort + see: http://www.portaudio.com/trac/ticket/141 + */ + result = paNoError; + } + else + { + /* User callback has asked us to stop with paComplete or other non-zero value */ + stream->stopProcessing = 1; /* stop once currently queued audio has finished */ + result = paNoError; + } + + + if( PA_IS_INPUT_STREAM_(stream) + && stream->stopProcessing == 0 && stream->abortProcessing == 0 + && stream->input.framesUsedInCurrentBuffer == stream->input.framesPerBuffer ) + { + if( NoBuffersAreQueued( &stream->input ) ) + { + /** @todo need to handle PaNeverDropInput here where necessary */ + result = CatchUpInputBuffers( stream ); + if( result != paNoError ) + done = 1; + + statusFlags |= paInputOverflow; + } + + result = AdvanceToNextInputBuffer( stream ); + if( result != paNoError ) + done = 1; + } + + + if( PA_IS_OUTPUT_STREAM_(stream) && !stream->abortProcessing ) + { + if( stream->stopProcessing && + stream->output.framesUsedInCurrentBuffer < stream->output.framesPerBuffer ) + { + /* zero remaining samples in output output buffer and flush */ + + stream->output.framesUsedInCurrentBuffer += PaUtil_ZeroOutput( &stream->bufferProcessor, + stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); + + /* we send the entire buffer to the output devices, but we could + just send a partial buffer, rather than zeroing the unused + samples. + */ + } + + if( stream->output.framesUsedInCurrentBuffer == stream->output.framesPerBuffer ) + { + /* check for underflow before enquing the just-generated buffer, + but recover from underflow after enquing it. This ensures + that the most recent audio segment is repeated */ + int outputUnderflow = NoBuffersAreQueued( &stream->output ); + + result = AdvanceToNextOutputBuffer( stream ); + if( result != paNoError ) + done = 1; + + if( outputUnderflow && !done && !stream->stopProcessing ) + { + /* Recover from underflow in the case where the + underflow occured while processing the buffer + we just finished */ + + result = CatchUpOutputBuffers( stream ); + if( result != paNoError ) + done = 1; + + statusFlags |= paOutputUnderflow; + } + } + } + + if( stream->throttleProcessingThreadOnOverload != 0 ) + { + if( stream->stopProcessing || stream->abortProcessing ) + { + if( stream->processingThreadPriority != stream->highThreadPriority ) + { + SetThreadPriority( stream->processingThread, stream->highThreadPriority ); + stream->processingThreadPriority = stream->highThreadPriority; + } + } + else if( PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ) > 1. ) + { + if( stream->processingThreadPriority != stream->throttledThreadPriority ) + { + SetThreadPriority( stream->processingThread, stream->throttledThreadPriority ); + stream->processingThreadPriority = stream->throttledThreadPriority; + } + + /* sleep to give other processes a go */ + Sleep( stream->throttledSleepMsecs ); + } + else + { + if( stream->processingThreadPriority != stream->highThreadPriority ) + { + SetThreadPriority( stream->processingThread, stream->highThreadPriority ); + stream->processingThreadPriority = stream->highThreadPriority; + } + } + } + } + else + { + hostBuffersAvailable = 0; + } + } + while( hostBuffersAvailable && + stream->stopProcessing == 0 && + stream->abortProcessing == 0 && + !done ); + } + } + while( !done ); + + stream->isActive = 0; + + if( stream->streamRepresentation.streamFinishedCallback != 0 ) + stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); + + PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); + + return result; +} + + +/* + When CloseStream() is called, the multi-api layer ensures that + the stream has already been stopped or aborted. +*/ +static PaError CloseStream( PaStream* s ) +{ + PaError result; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + result = CloseHandleWithPaError( stream->abortEvent ); + if( result != paNoError ) goto error; + + TerminateWaveHeaders( &stream->output, 0 /* not isInput */ ); + TerminateWaveHeaders( &stream->input, 1 /* isInput */ ); + + TerminateWaveHandles( &stream->output, 0 /* not isInput */, 0 /* not currentlyProcessingAnError */ ); + TerminateWaveHandles( &stream->input, 1 /* isInput */, 0 /* not currentlyProcessingAnError */ ); + + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_FreeMemory( stream ); + +error: + /** @todo REVIEW: what is the best way to clean up a stream if an error is detected? */ + return result; +} + + +static PaError StartStream( PaStream *s ) +{ + PaError result; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + MMRESULT mmresult; + unsigned int i, j; + int callbackResult; + unsigned int channel; + unsigned long framesProcessed; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /** @todo implement this for stream priming */ + + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); + + if( PA_IS_INPUT_STREAM_(stream) ) + { + for( i=0; iinput.bufferCount; ++i ) + { + for( j=0; jinput.deviceCount; ++j ) + { + stream->input.waveHeaders[j][i].dwFlags &= ~WHDR_DONE; + mmresult = waveInAddBuffer( ((HWAVEIN*)stream->input.waveHandles)[j], &stream->input.waveHeaders[j][i], sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + goto error; + } + } + } + stream->input.currentBufferIndex = 0; + stream->input.framesUsedInCurrentBuffer = 0; + } + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + for( i=0; ioutput.deviceCount; ++i ) + { + if( (mmresult = waveOutPause( ((HWAVEOUT*)stream->output.waveHandles)[i] )) != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + goto error; + } + } + + for( i=0; ioutput.bufferCount; ++i ) + { + if( stream->primeStreamUsingCallback ) + { + + stream->output.framesUsedInCurrentBuffer = 0; + do{ + + PaUtil_BeginBufferProcessing( &stream->bufferProcessor, + &timeInfo, + paPrimingOutput | ((stream->input.bufferCount > 0 ) ? paInputUnderflow : 0)); + + if( stream->input.bufferCount > 0 ) + PaUtil_SetNoInput( &stream->bufferProcessor ); + + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); + + channel = 0; + for( j=0; joutput.deviceCount; ++j ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->output.waveHeaders[j][i].dwUser; + + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, channel, + stream->output.waveHeaders[j][i].lpData + + stream->output.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostOutputSample, + channelCount ); + + /* we have stored the number of channels in the buffer in dwUser */ + channel += channelCount; + } + + callbackResult = paContinue; + framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); + stream->output.framesUsedInCurrentBuffer += framesProcessed; + + if( callbackResult != paContinue ) + { + /** @todo fix this, what do we do if callback result is non-zero during stream + priming? + + for complete: play out primed waveHeaders as usual + for abort: clean up immediately. + */ + } + + }while( stream->output.framesUsedInCurrentBuffer != stream->output.framesPerBuffer ); + + } + else + { + for( j=0; joutput.deviceCount; ++j ) + { + ZeroMemory( stream->output.waveHeaders[j][i].lpData, stream->output.waveHeaders[j][i].dwBufferLength ); + } + } + + /* we queue all channels of a single buffer frame (accross all + devices, because some multidevice multichannel drivers work + better this way */ + for( j=0; joutput.deviceCount; ++j ) + { + mmresult = waveOutWrite( ((HWAVEOUT*)stream->output.waveHandles)[j], &stream->output.waveHeaders[j][i], sizeof(WAVEHDR) ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + goto error; + } + } + } + stream->output.currentBufferIndex = 0; + stream->output.framesUsedInCurrentBuffer = 0; + } + + + stream->isStopped = 0; + stream->isActive = 1; + stream->stopProcessing = 0; + stream->abortProcessing = 0; + + result = ResetEventWithPaError( stream->input.bufferEvent ); + if( result != paNoError ) goto error; + + result = ResetEventWithPaError( stream->output.bufferEvent ); + if( result != paNoError ) goto error; + + + if( stream->streamRepresentation.streamCallback ) + { + /* callback stream */ + + result = ResetEventWithPaError( stream->abortEvent ); + if( result != paNoError ) goto error; + + /* Create thread that waits for audio buffers to be ready for processing. */ + stream->processingThread = CREATE_THREAD; + if( !stream->processingThread ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); + goto error; + } + + /** @todo could have mme specific stream parameters to allow the user + to set the callback thread priorities */ + stream->highThreadPriority = THREAD_PRIORITY_TIME_CRITICAL; + stream->throttledThreadPriority = THREAD_PRIORITY_NORMAL; + + if( !SetThreadPriority( stream->processingThread, stream->highThreadPriority ) ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); + goto error; + } + stream->processingThreadPriority = stream->highThreadPriority; + } + else + { + /* blocking read/write stream */ + + } + + if( PA_IS_INPUT_STREAM_(stream) ) + { + for( i=0; i < stream->input.deviceCount; ++i ) + { + mmresult = waveInStart( ((HWAVEIN*)stream->input.waveHandles)[i] ); + PA_DEBUG(("Pa_StartStream: waveInStart returned = 0x%X.\n", mmresult)); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + goto error; + } + } + } + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + for( i=0; i < stream->output.deviceCount; ++i ) + { + if( (mmresult = waveOutRestart( ((HWAVEOUT*)stream->output.waveHandles)[i] )) != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + goto error; + } + } + } + + return result; + +error: + /** @todo FIXME: implement recovery as best we can + This should involve rolling back to a state as-if this function had never been called + */ + return result; +} + + +static PaError StopStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + int timeout; + DWORD waitResult; + MMRESULT mmresult; + signed int hostOutputBufferIndex; + unsigned int channel, waitCount, i; + + /** @todo + REVIEW: the error checking in this function needs review. the basic + idea is to return from this function in a known state - for example + there is no point avoiding calling waveInReset just because + the thread times out. + */ + + if( stream->processingThread ) + { + /* callback stream */ + + /* Tell processing thread to stop generating more data and to let current data play out. */ + stream->stopProcessing = 1; + + /* Calculate timeOut longer than longest time it could take to return all buffers. */ + timeout = (int)(stream->allBuffersDurationMs * 1.5); + if( timeout < PA_MME_MIN_TIMEOUT_MSEC_ ) + timeout = PA_MME_MIN_TIMEOUT_MSEC_; + + PA_DEBUG(("WinMME StopStream: waiting for background thread.\n")); + + waitResult = WaitForSingleObject( stream->processingThread, timeout ); + if( waitResult == WAIT_TIMEOUT ) + { + /* try to abort */ + stream->abortProcessing = 1; + SetEvent( stream->abortEvent ); + waitResult = WaitForSingleObject( stream->processingThread, timeout ); + if( waitResult == WAIT_TIMEOUT ) + { + PA_DEBUG(("WinMME StopStream: timed out while waiting for background thread to finish.\n")); + result = paTimedOut; + } + } + + CloseHandle( stream->processingThread ); + stream->processingThread = NULL; + } + else + { + /* blocking read / write stream */ + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + if( stream->output.framesUsedInCurrentBuffer > 0 ) + { + /* there are still unqueued frames in the current buffer, so flush them */ + + hostOutputBufferIndex = stream->output.currentBufferIndex; + + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, + stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); + + channel = 0; + for( i=0; ioutput.deviceCount; ++i ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->output.waveHeaders[i][ hostOutputBufferIndex ].dwUser; + + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, channel, + stream->output.waveHeaders[i][ hostOutputBufferIndex ].lpData + + stream->output.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostOutputSample, + channelCount ); + + channel += channelCount; + } + + PaUtil_ZeroOutput( &stream->bufferProcessor, + stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); + + /* we send the entire buffer to the output devices, but we could + just send a partial buffer, rather than zeroing the unused + samples. + */ + AdvanceToNextOutputBuffer( stream ); + } + + + timeout = (stream->allBuffersDurationMs / stream->output.bufferCount) + 1; + if( timeout < PA_MME_MIN_TIMEOUT_MSEC_ ) + timeout = PA_MME_MIN_TIMEOUT_MSEC_; + + waitCount = 0; + while( !NoBuffersAreQueued( &stream->output ) && waitCount <= stream->output.bufferCount ) + { + /* wait for MME to signal that a buffer is available */ + waitResult = WaitForSingleObject( stream->output.bufferEvent, timeout ); + if( waitResult == WAIT_FAILED ) + { + break; + } + else if( waitResult == WAIT_TIMEOUT ) + { + /* keep waiting */ + } + + ++waitCount; + } + } + } + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + for( i =0; i < stream->output.deviceCount; ++i ) + { + mmresult = waveOutReset( ((HWAVEOUT*)stream->output.waveHandles)[i] ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + } + } + } + + if( PA_IS_INPUT_STREAM_(stream) ) + { + for( i=0; i < stream->input.deviceCount; ++i ) + { + mmresult = waveInReset( ((HWAVEIN*)stream->input.waveHandles)[i] ); + if( mmresult != MMSYSERR_NOERROR ) + { + result = paUnanticipatedHostError; + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + } + } + } + + stream->isStopped = 1; + stream->isActive = 0; + + return result; +} + + +static PaError AbortStream( PaStream *s ) +{ + PaError result = paNoError; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + int timeout; + DWORD waitResult; + MMRESULT mmresult; + unsigned int i; + + /** @todo + REVIEW: the error checking in this function needs review. the basic + idea is to return from this function in a known state - for example + there is no point avoiding calling waveInReset just because + the thread times out. + */ + + if( stream->processingThread ) + { + /* callback stream */ + + /* Tell processing thread to abort immediately */ + stream->abortProcessing = 1; + SetEvent( stream->abortEvent ); + } + + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + for( i =0; i < stream->output.deviceCount; ++i ) + { + mmresult = waveOutReset( ((HWAVEOUT*)stream->output.waveHandles)[i] ); + if( mmresult != MMSYSERR_NOERROR ) + { + PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); + return paUnanticipatedHostError; + } + } + } + + if( PA_IS_INPUT_STREAM_(stream) ) + { + for( i=0; i < stream->input.deviceCount; ++i ) + { + mmresult = waveInReset( ((HWAVEIN*)stream->input.waveHandles)[i] ); + if( mmresult != MMSYSERR_NOERROR ) + { + PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); + return paUnanticipatedHostError; + } + } + } + + + if( stream->processingThread ) + { + /* callback stream */ + + PA_DEBUG(("WinMME AbortStream: waiting for background thread.\n")); + + /* Calculate timeOut longer than longest time it could take to return all buffers. */ + timeout = (int)(stream->allBuffersDurationMs * 1.5); + if( timeout < PA_MME_MIN_TIMEOUT_MSEC_ ) + timeout = PA_MME_MIN_TIMEOUT_MSEC_; + + waitResult = WaitForSingleObject( stream->processingThread, timeout ); + if( waitResult == WAIT_TIMEOUT ) + { + PA_DEBUG(("WinMME AbortStream: timed out while waiting for background thread to finish.\n")); + return paTimedOut; + } + + CloseHandle( stream->processingThread ); + stream->processingThread = NULL; + } + + stream->isStopped = 1; + stream->isActive = 0; + + return result; +} + + +static PaError IsStreamStopped( PaStream *s ) +{ + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + return stream->isStopped; +} + + +static PaError IsStreamActive( PaStream *s ) +{ + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + return stream->isActive; +} + + +static PaTime GetStreamTime( PaStream *s ) +{ + (void) s; /* unused parameter */ + + return PaUtil_GetTime(); +} + + +static double GetStreamCpuLoad( PaStream* s ) +{ + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); +} + + +/* + As separate stream interfaces are used for blocking and callback + streams, the following functions can be guaranteed to only be called + for blocking streams. +*/ + +static PaError ReadStream( PaStream* s, + void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + void *userBuffer; + unsigned long framesRead = 0; + unsigned long framesProcessed; + signed int hostInputBufferIndex; + DWORD waitResult; + DWORD timeout = (unsigned long)(stream->allBuffersDurationMs * 0.5); + unsigned int channel, i; + + if( PA_IS_INPUT_STREAM_(stream) ) + { + /* make a local copy of the user buffer pointer(s). this is necessary + because PaUtil_CopyInput() advances these pointers every time + it is called. + */ + if( stream->bufferProcessor.userInputIsInterleaved ) + { + userBuffer = buffer; + } + else + { + userBuffer = (void*)alloca( sizeof(void*) * stream->bufferProcessor.inputChannelCount ); + if( !userBuffer ) + return paInsufficientMemory; + for( i = 0; ibufferProcessor.inputChannelCount; ++i ) + ((void**)userBuffer)[i] = ((void**)buffer)[i]; + } + + do{ + if( CurrentInputBuffersAreDone( stream ) ) + { + if( NoBuffersAreQueued( &stream->input ) ) + { + /** @todo REVIEW: consider what to do if the input overflows. + do we requeue all of the buffers? should we be running + a thread to make sure they are always queued? + see: http://www.portaudio.com/trac/ticket/117 + */ + + result = paInputOverflowed; + } + + hostInputBufferIndex = stream->input.currentBufferIndex; + + PaUtil_SetInputFrameCount( &stream->bufferProcessor, + stream->input.framesPerBuffer - stream->input.framesUsedInCurrentBuffer ); + + channel = 0; + for( i=0; iinput.deviceCount; ++i ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->input.waveHeaders[i][ hostInputBufferIndex ].dwUser; + + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, channel, + stream->input.waveHeaders[i][ hostInputBufferIndex ].lpData + + stream->input.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostInputSample, + channelCount ); + + channel += channelCount; + } + + framesProcessed = PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, frames - framesRead ); + + stream->input.framesUsedInCurrentBuffer += framesProcessed; + if( stream->input.framesUsedInCurrentBuffer == stream->input.framesPerBuffer ) + { + result = AdvanceToNextInputBuffer( stream ); + if( result != paNoError ) + break; + } + + framesRead += framesProcessed; + + }else{ + /* wait for MME to signal that a buffer is available */ + waitResult = WaitForSingleObject( stream->input.bufferEvent, timeout ); + if( waitResult == WAIT_FAILED ) + { + result = paUnanticipatedHostError; + break; + } + else if( waitResult == WAIT_TIMEOUT ) + { + /* if a timeout is encountered, continue, + perhaps we should give up eventually + */ + } + } + }while( framesRead < frames ); + } + else + { + result = paCanNotReadFromAnOutputOnlyStream; + } + + return result; +} + + +static PaError WriteStream( PaStream* s, + const void *buffer, + unsigned long frames ) +{ + PaError result = paNoError; + PaWinMmeStream *stream = (PaWinMmeStream*)s; + const void *userBuffer; + unsigned long framesWritten = 0; + unsigned long framesProcessed; + signed int hostOutputBufferIndex; + DWORD waitResult; + DWORD timeout = (unsigned long)(stream->allBuffersDurationMs * 0.5); + unsigned int channel, i; + + + if( PA_IS_OUTPUT_STREAM_(stream) ) + { + /* make a local copy of the user buffer pointer(s). this is necessary + because PaUtil_CopyOutput() advances these pointers every time + it is called. + */ + if( stream->bufferProcessor.userOutputIsInterleaved ) + { + userBuffer = buffer; + } + else + { + userBuffer = (const void*)alloca( sizeof(void*) * stream->bufferProcessor.outputChannelCount ); + if( !userBuffer ) + return paInsufficientMemory; + for( i = 0; ibufferProcessor.outputChannelCount; ++i ) + ((const void**)userBuffer)[i] = ((const void**)buffer)[i]; + } + + do{ + if( CurrentOutputBuffersAreDone( stream ) ) + { + if( NoBuffersAreQueued( &stream->output ) ) + { + /** @todo REVIEW: consider what to do if the output + underflows. do we requeue all the existing buffers with + zeros? should we run a separate thread to keep the buffers + enqueued at all times? + see: http://www.portaudio.com/trac/ticket/117 + */ + + result = paOutputUnderflowed; + } + + hostOutputBufferIndex = stream->output.currentBufferIndex; + + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, + stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); + + channel = 0; + for( i=0; ioutput.deviceCount; ++i ) + { + /* we have stored the number of channels in the buffer in dwUser */ + int channelCount = (int)stream->output.waveHeaders[i][ hostOutputBufferIndex ].dwUser; + + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, channel, + stream->output.waveHeaders[i][ hostOutputBufferIndex ].lpData + + stream->output.framesUsedInCurrentBuffer * channelCount * + stream->bufferProcessor.bytesPerHostOutputSample, + channelCount ); + + channel += channelCount; + } + + framesProcessed = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, frames - framesWritten ); + + stream->output.framesUsedInCurrentBuffer += framesProcessed; + if( stream->output.framesUsedInCurrentBuffer == stream->output.framesPerBuffer ) + { + result = AdvanceToNextOutputBuffer( stream ); + if( result != paNoError ) + break; + } + + framesWritten += framesProcessed; + } + else + { + /* wait for MME to signal that a buffer is available */ + waitResult = WaitForSingleObject( stream->output.bufferEvent, timeout ); + if( waitResult == WAIT_FAILED ) + { + result = paUnanticipatedHostError; + break; + } + else if( waitResult == WAIT_TIMEOUT ) + { + /* if a timeout is encountered, continue, + perhaps we should give up eventually + */ + } + } + }while( framesWritten < frames ); + } + else + { + result = paCanNotWriteToAnInputOnlyStream; + } + + return result; +} + + +static signed long GetStreamReadAvailable( PaStream* s ) +{ + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + if( PA_IS_INPUT_STREAM_(stream) ) + return GetAvailableFrames( &stream->input ); + else + return paCanNotReadFromAnOutputOnlyStream; +} + + +static signed long GetStreamWriteAvailable( PaStream* s ) +{ + PaWinMmeStream *stream = (PaWinMmeStream*)s; + + if( PA_IS_OUTPUT_STREAM_(stream) ) + return GetAvailableFrames( &stream->output ); + else + return paCanNotWriteToAnInputOnlyStream; +} + + +/* NOTE: the following functions are MME-stream specific, and are called directly + by client code. We need to check for many more error conditions here because + we don't have the benefit of pa_front.c's parameter checking. +*/ + +static PaError GetWinMMEStreamPointer( PaWinMmeStream **stream, PaStream *s ) +{ + PaError result; + PaUtilHostApiRepresentation *hostApi; + PaWinMmeHostApiRepresentation *winMmeHostApi; + + result = PaUtil_ValidateStreamPointer( s ); + if( result != paNoError ) + return result; + + result = PaUtil_GetHostApiRepresentation( &hostApi, paMME ); + if( result != paNoError ) + return result; + + winMmeHostApi = (PaWinMmeHostApiRepresentation*)hostApi; + + /* note, the following would be easier if there was a generic way of testing + that a stream belongs to a specific host API */ + + if( PA_STREAM_REP( s )->streamInterface == &winMmeHostApi->callbackStreamInterface + || PA_STREAM_REP( s )->streamInterface == &winMmeHostApi->blockingStreamInterface ) + { + /* s is a WinMME stream */ + *stream = (PaWinMmeStream *)s; + return paNoError; + } + else + { + return paIncompatibleStreamHostApi; + } +} + + +int PaWinMME_GetStreamInputHandleCount( PaStream* s ) +{ + PaWinMmeStream *stream; + PaError result = GetWinMMEStreamPointer( &stream, s ); + + if( result == paNoError ) + return (PA_IS_INPUT_STREAM_(stream)) ? stream->input.deviceCount : 0; + else + return result; +} + + +HWAVEIN PaWinMME_GetStreamInputHandle( PaStream* s, int handleIndex ) +{ + PaWinMmeStream *stream; + PaError result = GetWinMMEStreamPointer( &stream, s ); + + if( result == paNoError + && PA_IS_INPUT_STREAM_(stream) + && handleIndex >= 0 + && (unsigned int)handleIndex < stream->input.deviceCount ) + return ((HWAVEIN*)stream->input.waveHandles)[handleIndex]; + else + return 0; +} + + +int PaWinMME_GetStreamOutputHandleCount( PaStream* s) +{ + PaWinMmeStream *stream; + PaError result = GetWinMMEStreamPointer( &stream, s ); + + if( result == paNoError ) + return (PA_IS_OUTPUT_STREAM_(stream)) ? stream->output.deviceCount : 0; + else + return result; +} + + +HWAVEOUT PaWinMME_GetStreamOutputHandle( PaStream* s, int handleIndex ) +{ + PaWinMmeStream *stream; + PaError result = GetWinMMEStreamPointer( &stream, s ); + + if( result == paNoError + && PA_IS_OUTPUT_STREAM_(stream) + && handleIndex >= 0 + && (unsigned int)handleIndex < stream->output.deviceCount ) + return ((HWAVEOUT*)stream->output.waveHandles)[handleIndex]; + else + return 0; +} diff --git a/Externals/portaudio/src/os/unix/pa_unix_hostapis.c b/Externals/portaudio/src/os/unix/pa_unix_hostapis.c new file mode 100644 index 0000000000..4399b875b1 --- /dev/null +++ b/Externals/portaudio/src/os/unix/pa_unix_hostapis.c @@ -0,0 +1,103 @@ +/* + * $Id: pa_unix_hostapis.c 1740 2011-08-25 07:17:48Z philburk $ + * Portable Audio I/O Library UNIX initialization table + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup unix_src +*/ + +#include "pa_hostapi.h" + +PaError PaJack_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaAlsa_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaOSS_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +/* Added for IRIX, Pieter, oct 2, 2003: */ +PaError PaSGI_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +/* Linux AudioScience HPI */ +PaError PaAsiHpi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +/** Note that on Linux, ALSA is placed before OSS so that the former is preferred over the latter. + */ + +PaUtilHostApiInitializer *paHostApiInitializers[] = + { +#ifdef __linux__ + +#if PA_USE_ALSA + PaAlsa_Initialize, +#endif + +#if PA_USE_OSS + PaOSS_Initialize, +#endif + +#else /* __linux__ */ + +#if PA_USE_OSS + PaOSS_Initialize, +#endif + +#if PA_USE_ALSA + PaAlsa_Initialize, +#endif + +#endif /* __linux__ */ + +#if PA_USE_JACK + PaJack_Initialize, +#endif + /* Added for IRIX, Pieter, oct 2, 2003: */ +#if PA_USE_SGI + PaSGI_Initialize, +#endif + +#if PA_USE_ASIHPI + PaAsiHpi_Initialize, +#endif + +#if PA_USE_COREAUDIO + PaMacCore_Initialize, +#endif + +#if PA_USE_SKELETON + PaSkeleton_Initialize, +#endif + + 0 /* NULL terminated array */ + }; diff --git a/Externals/portaudio/src/os/unix/pa_unix_util.c b/Externals/portaudio/src/os/unix/pa_unix_util.c new file mode 100644 index 0000000000..18f806c507 --- /dev/null +++ b/Externals/portaudio/src/os/unix/pa_unix_util.c @@ -0,0 +1,710 @@ +/* + * $Id: pa_unix_util.c 1510 2010-06-10 08:05:29Z dmitrykos $ + * Portable Audio I/O Library + * UNIX platform-specific support functions + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2000 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup unix_src +*/ + +#include +#include +#include +#include +#include +#include +#include /* For memset */ +#include +#include + +#if defined(__APPLE__) && !defined(HAVE_MACH_ABSOLUTE_TIME) +#define HAVE_MACH_ABSOLUTE_TIME +#endif +#ifdef HAVE_MACH_ABSOLUTE_TIME +#include +#endif + +#include "pa_util.h" +#include "pa_unix_util.h" +#include "pa_debugprint.h" + +/* + Track memory allocations to avoid leaks. + */ + +#if PA_TRACK_MEMORY +static int numAllocations_ = 0; +#endif + + +void *PaUtil_AllocateMemory( long size ) +{ + void *result = malloc( size ); + +#if PA_TRACK_MEMORY + if( result != NULL ) numAllocations_ += 1; +#endif + return result; +} + + +void PaUtil_FreeMemory( void *block ) +{ + if( block != NULL ) + { + free( block ); +#if PA_TRACK_MEMORY + numAllocations_ -= 1; +#endif + + } +} + + +int PaUtil_CountCurrentlyAllocatedBlocks( void ) +{ +#if PA_TRACK_MEMORY + return numAllocations_; +#else + return 0; +#endif +} + + +void Pa_Sleep( long msec ) +{ +#ifdef HAVE_NANOSLEEP + struct timespec req = {0}, rem = {0}; + PaTime time = msec / 1.e3; + req.tv_sec = (time_t)time; + assert(time - req.tv_sec < 1.0); + req.tv_nsec = (long)((time - req.tv_sec) * 1.e9); + nanosleep(&req, &rem); + /* XXX: Try sleeping the remaining time (contained in rem) if interrupted by a signal? */ +#else + while( msec > 999 ) /* For OpenBSD and IRIX, argument */ + { /* to usleep must be < 1000000. */ + usleep( 999000 ); + msec -= 999; + } + usleep( msec * 1000 ); +#endif +} + +#ifdef HAVE_MACH_ABSOLUTE_TIME +/* + Discussion on the CoreAudio mailing list suggests that calling + gettimeofday (or anything else in the BSD layer) is not real-time + safe, so we use mach_absolute_time on OSX. This implementation is + based on these two links: + + Technical Q&A QA1398 - Mach Absolute Time Units + http://developer.apple.com/mac/library/qa/qa2004/qa1398.html + + Tutorial: Performance and Time. + http://www.macresearch.org/tutorial_performance_and_time +*/ + +/* Scaler to convert the result of mach_absolute_time to seconds */ +static double machSecondsConversionScaler_ = 0.0; +#endif + +void PaUtil_InitializeClock( void ) +{ +#ifdef HAVE_MACH_ABSOLUTE_TIME + mach_timebase_info_data_t info; + kern_return_t err = mach_timebase_info( &info ); + if( err == 0 ) + machSecondsConversionScaler_ = 1e-9 * (double) info.numer / (double) info.denom; +#endif +} + + +PaTime PaUtil_GetTime( void ) +{ +#ifdef HAVE_MACH_ABSOLUTE_TIME + return mach_absolute_time() * machSecondsConversionScaler_; +#elif defined(HAVE_CLOCK_GETTIME) + struct timespec tp; + clock_gettime(CLOCK_REALTIME, &tp); + return (PaTime)(tp.tv_sec + tp.tv_nsec * 1e-9); +#else + struct timeval tv; + gettimeofday( &tv, NULL ); + return (PaTime) tv.tv_usec * 1e-6 + tv.tv_sec; +#endif +} + +PaError PaUtil_InitializeThreading( PaUtilThreading *threading ) +{ + (void) paUtilErr_; + return paNoError; +} + +void PaUtil_TerminateThreading( PaUtilThreading *threading ) +{ +} + +PaError PaUtil_StartThreading( PaUtilThreading *threading, void *(*threadRoutine)(void *), void *data ) +{ + pthread_create( &threading->callbackThread, NULL, threadRoutine, data ); + return paNoError; +} + +PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *exitResult ) +{ + PaError result = paNoError; + void *pret; + + if( exitResult ) + *exitResult = paNoError; + + /* If pthread_cancel is not supported (Android platform) whole this function can lead to indefinite waiting if + working thread (callbackThread) has'n received any stop signals from outside, please keep + this in mind when considering using PaUtil_CancelThreading + */ +#ifdef PTHREAD_CANCELED + /* Only kill the thread if it isn't in the process of stopping (flushing adaptation buffers) */ + if( !wait ) + pthread_cancel( threading->callbackThread ); /* XXX: Safe to call this if the thread has exited on its own? */ +#endif + pthread_join( threading->callbackThread, &pret ); + +#ifdef PTHREAD_CANCELED + if( pret && PTHREAD_CANCELED != pret ) +#else + /* !wait means the thread may have been canceled */ + if( pret && wait ) +#endif + { + if( exitResult ) + *exitResult = *(PaError *) pret; + free( pret ); + } + + return result; +} + +/* Threading */ +/* paUnixMainThread + * We have to be a bit careful with defining this global variable, + * as explained below. */ +#ifdef __APPLE__ +/* apple/gcc has a "problem" with global vars and dynamic libs. + Initializing it seems to fix the problem. + Described a bit in this thread: + http://gcc.gnu.org/ml/gcc/2005-06/msg00179.html +*/ +pthread_t paUnixMainThread = 0; +#else +/*pthreads are opaque. We don't know that asigning it an int value + always makes sense, so we don't initialize it unless we have to.*/ +pthread_t paUnixMainThread = 0; +#endif + +PaError PaUnixThreading_Initialize() +{ + paUnixMainThread = pthread_self(); + return paNoError; +} + +static PaError BoostPriority( PaUnixThread* self ) +{ + PaError result = paNoError; + struct sched_param spm = { 0 }; + /* Priority should only matter between contending FIFO threads? */ + spm.sched_priority = 1; + + assert( self ); + + if( pthread_setschedparam( self->thread, SCHED_FIFO, &spm ) != 0 ) + { + PA_UNLESS( errno == EPERM, paInternalError ); /* Lack permission to raise priority */ + PA_DEBUG(( "Failed bumping priority\n" )); + result = 0; + } + else + { + result = 1; /* Success */ + } +error: + return result; +} + +PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void* threadArg, PaTime waitForChild, + int rtSched ) +{ + PaError result = paNoError; + pthread_attr_t attr; + int started = 0; + + memset( self, 0, sizeof (PaUnixThread) ); + PaUnixMutex_Initialize( &self->mtx ); + PA_ASSERT_CALL( pthread_cond_init( &self->cond, NULL ), 0 ); + + self->parentWaiting = 0 != waitForChild; + + /* Spawn thread */ + +/* Temporarily disabled since we should test during configuration for presence of required mman.h header */ +#if 0 +#if defined _POSIX_MEMLOCK && (_POSIX_MEMLOCK != -1) + if( rtSched ) + { + if( mlockall( MCL_CURRENT | MCL_FUTURE ) < 0 ) + { + int savedErrno = errno; /* In case errno gets overwritten */ + assert( savedErrno != EINVAL ); /* Most likely a programmer error */ + PA_UNLESS( (savedErrno == EPERM), paInternalError ); + PA_DEBUG(( "%s: Failed locking memory\n", __FUNCTION__ )); + } + else + PA_DEBUG(( "%s: Successfully locked memory\n", __FUNCTION__ )); + } +#endif +#endif + + PA_UNLESS( !pthread_attr_init( &attr ), paInternalError ); + /* Priority relative to other processes */ + PA_UNLESS( !pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ), paInternalError ); + + PA_UNLESS( !pthread_create( &self->thread, &attr, threadFunc, threadArg ), paInternalError ); + started = 1; + + if( rtSched ) + { +#if 0 + if( self->useWatchdog ) + { + int err; + struct sched_param wdSpm = { 0 }; + /* Launch watchdog, watchdog sets callback thread priority */ + int prio = PA_MIN( self->rtPrio + 4, sched_get_priority_max( SCHED_FIFO ) ); + wdSpm.sched_priority = prio; + + PA_UNLESS( !pthread_attr_init( &attr ), paInternalError ); + PA_UNLESS( !pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ), paInternalError ); + PA_UNLESS( !pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ), paInternalError ); + PA_UNLESS( !pthread_attr_setschedpolicy( &attr, SCHED_FIFO ), paInternalError ); + PA_UNLESS( !pthread_attr_setschedparam( &attr, &wdSpm ), paInternalError ); + if( (err = pthread_create( &self->watchdogThread, &attr, &WatchdogFunc, self )) ) + { + PA_UNLESS( err == EPERM, paInternalError ); + /* Permission error, go on without realtime privileges */ + PA_DEBUG(( "Failed bumping priority\n" )); + } + else + { + int policy; + self->watchdogRunning = 1; + PA_ENSURE_SYSTEM( pthread_getschedparam( self->watchdogThread, &policy, &wdSpm ), 0 ); + /* Check if priority is right, policy could potentially differ from SCHED_FIFO (but that's alright) */ + if( wdSpm.sched_priority != prio ) + { + PA_DEBUG(( "Watchdog priority not set correctly (%d)\n", wdSpm.sched_priority )); + PA_ENSURE( paInternalError ); + } + } + } + else +#endif + PA_ENSURE( BoostPriority( self ) ); + + { + int policy; + struct sched_param spm; + pthread_getschedparam(self->thread, &policy, &spm); + } + } + + if( self->parentWaiting ) + { + PaTime till; + struct timespec ts; + int res = 0; + PaTime now; + + PA_ENSURE( PaUnixMutex_Lock( &self->mtx ) ); + + /* Wait for stream to be started */ + now = PaUtil_GetTime(); + till = now + waitForChild; + + while( self->parentWaiting && !res ) + { + if( waitForChild > 0 ) + { + ts.tv_sec = (time_t) floor( till ); + ts.tv_nsec = (long) ((till - floor( till )) * 1e9); + res = pthread_cond_timedwait( &self->cond, &self->mtx.mtx, &ts ); + } + else + { + res = pthread_cond_wait( &self->cond, &self->mtx.mtx ); + } + } + + PA_ENSURE( PaUnixMutex_Unlock( &self->mtx ) ); + + PA_UNLESS( !res || ETIMEDOUT == res, paInternalError ); + PA_DEBUG(( "%s: Waited for %g seconds for stream to start\n", __FUNCTION__, PaUtil_GetTime() - now )); + if( ETIMEDOUT == res ) + { + PA_ENSURE( paTimedOut ); + } + } + +end: + return result; +error: + if( started ) + { + PaUnixThread_Terminate( self, 0, NULL ); + } + + goto end; +} + +PaError PaUnixThread_Terminate( PaUnixThread* self, int wait, PaError* exitResult ) +{ + PaError result = paNoError; + void* pret; + + if( exitResult ) + { + *exitResult = paNoError; + } +#if 0 + if( watchdogExitResult ) + *watchdogExitResult = paNoError; + + if( th->watchdogRunning ) + { + pthread_cancel( th->watchdogThread ); + PA_ENSURE_SYSTEM( pthread_join( th->watchdogThread, &pret ), 0 ); + + if( pret && pret != PTHREAD_CANCELED ) + { + if( watchdogExitResult ) + *watchdogExitResult = *(PaError *) pret; + free( pret ); + } + } +#endif + + /* Only kill the thread if it isn't in the process of stopping (flushing adaptation buffers) */ + /* TODO: Make join time out */ + self->stopRequested = wait; + if( !wait ) + { + PA_DEBUG(( "%s: Canceling thread %d\n", __FUNCTION__, self->thread )); + /* XXX: Safe to call this if the thread has exited on its own? */ +#ifdef PTHREAD_CANCELED + pthread_cancel( self->thread ); +#endif + } + PA_DEBUG(( "%s: Joining thread %d\n", __FUNCTION__, self->thread )); + PA_ENSURE_SYSTEM( pthread_join( self->thread, &pret ), 0 ); + +#ifdef PTHREAD_CANCELED + if( pret && PTHREAD_CANCELED != pret ) +#else + /* !wait means the thread may have been canceled */ + if( pret && wait ) +#endif + { + if( exitResult ) + { + *exitResult = *(PaError*)pret; + } + free( pret ); + } + +error: + PA_ASSERT_CALL( PaUnixMutex_Terminate( &self->mtx ), paNoError ); + PA_ASSERT_CALL( pthread_cond_destroy( &self->cond ), 0 ); + + return result; +} + +PaError PaUnixThread_PrepareNotify( PaUnixThread* self ) +{ + PaError result = paNoError; + PA_UNLESS( self->parentWaiting, paInternalError ); + + PA_ENSURE( PaUnixMutex_Lock( &self->mtx ) ); + self->locked = 1; + +error: + return result; +} + +PaError PaUnixThread_NotifyParent( PaUnixThread* self ) +{ + PaError result = paNoError; + PA_UNLESS( self->parentWaiting, paInternalError ); + + if( !self->locked ) + { + PA_ENSURE( PaUnixMutex_Lock( &self->mtx ) ); + self->locked = 1; + } + self->parentWaiting = 0; + pthread_cond_signal( &self->cond ); + PA_ENSURE( PaUnixMutex_Unlock( &self->mtx ) ); + self->locked = 0; + +error: + return result; +} + +int PaUnixThread_StopRequested( PaUnixThread* self ) +{ + return self->stopRequested; +} + +PaError PaUnixMutex_Initialize( PaUnixMutex* self ) +{ + PaError result = paNoError; + PA_ASSERT_CALL( pthread_mutex_init( &self->mtx, NULL ), 0 ); + return result; +} + +PaError PaUnixMutex_Terminate( PaUnixMutex* self ) +{ + PaError result = paNoError; + PA_ASSERT_CALL( pthread_mutex_destroy( &self->mtx ), 0 ); + return result; +} + +/** Lock mutex. + * + * We're disabling thread cancellation while the thread is holding a lock, so mutexes are + * properly unlocked at termination time. + */ +PaError PaUnixMutex_Lock( PaUnixMutex* self ) +{ + PaError result = paNoError; + +#ifdef PTHREAD_CANCEL + int oldState; + PA_ENSURE_SYSTEM( pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &oldState ), 0 ); +#endif + PA_ENSURE_SYSTEM( pthread_mutex_lock( &self->mtx ), 0 ); + +error: + return result; +} + +/** Unlock mutex. + * + * Thread cancellation is enabled again after the mutex is properly unlocked. + */ +PaError PaUnixMutex_Unlock( PaUnixMutex* self ) +{ + PaError result = paNoError; + + PA_ENSURE_SYSTEM( pthread_mutex_unlock( &self->mtx ), 0 ); +#ifdef PTHREAD_CANCEL + int oldState; + PA_ENSURE_SYSTEM( pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, &oldState ), 0 ); +#endif + +error: + return result; +} + + +#if 0 +static void OnWatchdogExit( void *userData ) +{ + PaAlsaThreading *th = (PaAlsaThreading *) userData; + struct sched_param spm = { 0 }; + assert( th ); + + PA_ASSERT_CALL( pthread_setschedparam( th->callbackThread, SCHED_OTHER, &spm ), 0 ); /* Lower before exiting */ + PA_DEBUG(( "Watchdog exiting\n" )); +} + +static void *WatchdogFunc( void *userData ) +{ + PaError result = paNoError, *pres = NULL; + int err; + PaAlsaThreading *th = (PaAlsaThreading *) userData; + unsigned intervalMsec = 500; + const PaTime maxSeconds = 3.; /* Max seconds between callbacks */ + PaTime timeThen = PaUtil_GetTime(), timeNow, timeElapsed, cpuTimeThen, cpuTimeNow, cpuTimeElapsed; + double cpuLoad, avgCpuLoad = 0.; + int throttled = 0; + + assert( th ); + + /* Execute OnWatchdogExit when exiting */ + pthread_cleanup_push( &OnWatchdogExit, th ); + + /* Boost priority of callback thread */ + PA_ENSURE( result = BoostPriority( th ) ); + if( !result ) + { + /* Boost failed, might as well exit */ + pthread_exit( NULL ); + } + + cpuTimeThen = th->callbackCpuTime; + { + int policy; + struct sched_param spm = { 0 }; + pthread_getschedparam( pthread_self(), &policy, &spm ); + PA_DEBUG(( "%s: Watchdog priority is %d\n", __FUNCTION__, spm.sched_priority )); + } + + while( 1 ) + { + double lowpassCoeff = 0.9, lowpassCoeff1 = 0.99999 - lowpassCoeff; + + /* Test before and after in case whatever underlying sleep call isn't interrupted by pthread_cancel */ + pthread_testcancel(); + Pa_Sleep( intervalMsec ); + pthread_testcancel(); + + if( PaUtil_GetTime() - th->callbackTime > maxSeconds ) + { + PA_DEBUG(( "Watchdog: Terminating callback thread\n" )); + /* Tell thread to terminate */ + err = pthread_kill( th->callbackThread, SIGKILL ); + pthread_exit( NULL ); + } + + PA_DEBUG(( "%s: PortAudio reports CPU load: %g\n", __FUNCTION__, PaUtil_GetCpuLoad( th->cpuLoadMeasurer ) )); + + /* Check if we should throttle, or unthrottle :P */ + cpuTimeNow = th->callbackCpuTime; + cpuTimeElapsed = cpuTimeNow - cpuTimeThen; + cpuTimeThen = cpuTimeNow; + + timeNow = PaUtil_GetTime(); + timeElapsed = timeNow - timeThen; + timeThen = timeNow; + cpuLoad = cpuTimeElapsed / timeElapsed; + avgCpuLoad = avgCpuLoad * lowpassCoeff + cpuLoad * lowpassCoeff1; + /* + if( throttled ) + PA_DEBUG(( "Watchdog: CPU load: %g, %g\n", avgCpuLoad, cpuTimeElapsed )); + */ + if( PaUtil_GetCpuLoad( th->cpuLoadMeasurer ) > .925 ) + { + static int policy; + static struct sched_param spm = { 0 }; + static const struct sched_param defaultSpm = { 0 }; + PA_DEBUG(( "%s: Throttling audio thread, priority %d\n", __FUNCTION__, spm.sched_priority )); + + pthread_getschedparam( th->callbackThread, &policy, &spm ); + if( !pthread_setschedparam( th->callbackThread, SCHED_OTHER, &defaultSpm ) ) + { + throttled = 1; + } + else + PA_DEBUG(( "Watchdog: Couldn't lower priority of audio thread: %s\n", strerror( errno ) )); + + /* Give other processes a go, before raising priority again */ + PA_DEBUG(( "%s: Watchdog sleeping for %lu msecs before unthrottling\n", __FUNCTION__, th->throttledSleepTime )); + Pa_Sleep( th->throttledSleepTime ); + + /* Reset callback priority */ + if( pthread_setschedparam( th->callbackThread, SCHED_FIFO, &spm ) != 0 ) + { + PA_DEBUG(( "%s: Couldn't raise priority of audio thread: %s\n", __FUNCTION__, strerror( errno ) )); + } + + if( PaUtil_GetCpuLoad( th->cpuLoadMeasurer ) >= .99 ) + intervalMsec = 50; + else + intervalMsec = 100; + + /* + lowpassCoeff = .97; + lowpassCoeff1 = .99999 - lowpassCoeff; + */ + } + else if( throttled && avgCpuLoad < .8 ) + { + intervalMsec = 500; + throttled = 0; + + /* + lowpassCoeff = .9; + lowpassCoeff1 = .99999 - lowpassCoeff; + */ + } + } + + pthread_cleanup_pop( 1 ); /* Execute cleanup on exit */ + +error: + /* Shouldn't get here in the normal case */ + + /* Pass on error code */ + pres = malloc( sizeof (PaError) ); + *pres = result; + + pthread_exit( pres ); +} + +static void CallbackUpdate( PaAlsaThreading *th ) +{ + th->callbackTime = PaUtil_GetTime(); + th->callbackCpuTime = PaUtil_GetCpuLoad( th->cpuLoadMeasurer ); +} + +/* +static void *CanaryFunc( void *userData ) +{ + const unsigned intervalMsec = 1000; + PaUtilThreading *th = (PaUtilThreading *) userData; + + while( 1 ) + { + th->canaryTime = PaUtil_GetTime(); + + pthread_testcancel(); + Pa_Sleep( intervalMsec ); + } + + pthread_exit( NULL ); +} +*/ +#endif diff --git a/Externals/portaudio/src/os/unix/pa_unix_util.h b/Externals/portaudio/src/os/unix/pa_unix_util.h new file mode 100644 index 0000000000..e900f87726 --- /dev/null +++ b/Externals/portaudio/src/os/unix/pa_unix_util.h @@ -0,0 +1,224 @@ +/* + * $Id: pa_unix_util.h 1241 2007-07-23 20:08:31Z aknudsen $ + * Portable Audio I/O Library + * UNIX platform-specific support functions + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2000 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup unix_src +*/ + +#ifndef PA_UNIX_UTIL_H +#define PA_UNIX_UTIL_H + +#include "pa_cpuload.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#define PA_MIN(x,y) ( (x) < (y) ? (x) : (y) ) +#define PA_MAX(x,y) ( (x) > (y) ? (x) : (y) ) + +/* Utilize GCC branch prediction for error tests */ +#if defined __GNUC__ && __GNUC__ >= 3 +#define UNLIKELY(expr) __builtin_expect( (expr), 0 ) +#else +#define UNLIKELY(expr) (expr) +#endif + +#define STRINGIZE_HELPER(expr) #expr +#define STRINGIZE(expr) STRINGIZE_HELPER(expr) + +#define PA_UNLESS(expr, code) \ + do { \ + if( UNLIKELY( (expr) == 0 ) ) \ + { \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = (code); \ + goto error; \ + } \ + } while (0); + +static PaError paUtilErr_; /* Used with PA_ENSURE */ + +/* Check PaError */ +#define PA_ENSURE(expr) \ + do { \ + if( UNLIKELY( (paUtilErr_ = (expr)) < paNoError ) ) \ + { \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + result = paUtilErr_; \ + goto error; \ + } \ + } while (0); + +#define PA_ASSERT_CALL(expr, success) \ + paUtilErr_ = (expr); \ + assert( success == paUtilErr_ ); + +#define PA_ENSURE_SYSTEM(expr, success) \ + do { \ + if( UNLIKELY( (paUtilErr_ = (expr)) != success ) ) \ + { \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( pthread_equal(pthread_self(), paUnixMainThread) ) \ + { \ + PaUtil_SetLastHostErrorInfo( paALSA, paUtilErr_, strerror( paUtilErr_ ) ); \ + } \ + PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" ); \ + result = paUnanticipatedHostError; \ + goto error; \ + } \ + } while( 0 ); + +typedef struct { + pthread_t callbackThread; +} PaUtilThreading; + +PaError PaUtil_InitializeThreading( PaUtilThreading *threading ); +void PaUtil_TerminateThreading( PaUtilThreading *threading ); +PaError PaUtil_StartThreading( PaUtilThreading *threading, void *(*threadRoutine)(void *), void *data ); +PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *exitResult ); + +/* State accessed by utility functions */ + +/* +void PaUnix_SetRealtimeScheduling( int rt ); + +void PaUtil_InitializeThreading( PaUtilThreading *th, PaUtilCpuLoadMeasurer *clm ); + +PaError PaUtil_CreateCallbackThread( PaUtilThreading *th, void *(*CallbackThreadFunc)( void * ), PaStream *s ); + +PaError PaUtil_KillCallbackThread( PaUtilThreading *th, PaError *exitResult ); + +void PaUtil_CallbackUpdate( PaUtilThreading *th ); +*/ + +extern pthread_t paUnixMainThread; + +typedef struct +{ + pthread_mutex_t mtx; +} PaUnixMutex; + +PaError PaUnixMutex_Initialize( PaUnixMutex* self ); +PaError PaUnixMutex_Terminate( PaUnixMutex* self ); +PaError PaUnixMutex_Lock( PaUnixMutex* self ); +PaError PaUnixMutex_Unlock( PaUnixMutex* self ); + +typedef struct +{ + pthread_t thread; + int parentWaiting; + int stopRequested; + int locked; + PaUnixMutex mtx; + pthread_cond_t cond; + volatile sig_atomic_t stopRequest; +} PaUnixThread; + +/** Initialize global threading state. + */ +PaError PaUnixThreading_Initialize(); + +/** Perish, passing on eventual error code. + * + * A thin wrapper around pthread_exit, will automatically pass on any error code to the joining thread. + * If the result indicates an error, i.e. it is not equal to paNoError, this function will automatically + * allocate a pointer so the error is passed on with pthread_exit. If the result indicates that all is + * well however, only a NULL pointer will be handed to pthread_exit. Thus, the joining thread should + * check whether a non-NULL result pointer is obtained from pthread_join and make sure to free it. + * @param result: The error code to pass on to the joining thread. + */ +#define PaUnixThreading_EXIT(result) \ + do { \ + PaError* pres = NULL; \ + if( paNoError != (result) ) \ + { \ + pres = malloc( sizeof (PaError) ); \ + *pres = (result); \ + } \ + pthread_exit( pres ); \ + } while (0); + +/** Spawn a thread. + * + * Intended for spawning the callback thread from the main thread. This function can even block (for a certain + * time or indefinitely) untill notified by the callback thread (using PaUnixThread_NotifyParent), which can be + * useful in order to make sure that callback has commenced before returning from Pa_StartStream. + * @param threadFunc: The function to be executed in the child thread. + * @param waitForChild: If not 0, wait for child thread to call PaUnixThread_NotifyParent. Less than 0 means + * wait for ever, greater than 0 wait for the specified time. + * @param rtSched: Enable realtime scheduling? + * @return: If timed out waiting on child, paTimedOut. + */ +PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void* threadArg, PaTime waitForChild, + int rtSched ); + +/** Terminate thread. + * + * @param wait: If true, request that background thread stop and wait untill it does, else cancel it. + * @param exitResult: If non-null this will upon return contain the exit status of the thread. + */ +PaError PaUnixThread_Terminate( PaUnixThread* self, int wait, PaError* exitResult ); + +/** Prepare to notify waiting parent thread. + * + * An internal lock must be held before the parent is notified in PaUnixThread_NotifyParent, call this to + * acquire it beforehand. + * @return: If parent is not waiting, paInternalError. + */ +PaError PaUnixThread_PrepareNotify( PaUnixThread* self ); + +/** Notify waiting parent thread. + * + * @return: If parent timed out waiting, paTimedOut. If parent was never waiting, paInternalError. + */ +PaError PaUnixThread_NotifyParent( PaUnixThread* self ); + +/** Has the parent thread requested this thread to stop? + */ +int PaUnixThread_StopRequested( PaUnixThread* self ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif diff --git a/Externals/portaudio/src/os/win/pa_win_coinitialize.c b/Externals/portaudio/src/os/win/pa_win_coinitialize.c new file mode 100644 index 0000000000..5c31716c0f --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_coinitialize.c @@ -0,0 +1,144 @@ +/* + * Microsoft COM initialization routines + * Copyright (c) 1999-2011 Ross Bencina, Dmitry Kostjuchenko + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2011 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src + + @brief Microsoft COM initialization routines. +*/ + +#include +#include + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_debugprint.h" + +#include "pa_win_coinitialize.h" + + +#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) && !defined(_WIN32_WCE) /* MSC version 6 and above */ +#pragma comment( lib, "ole32.lib" ) +#endif + + +/* use some special bit patterns here to try to guard against uninitialized memory errors */ +#define PAWINUTIL_COM_INITIALIZED (0xb38f) +#define PAWINUTIL_COM_NOT_INITIALIZED (0xf1cd) + + +PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitializationResult *comInitializationResult ) +{ + HRESULT hr; + + comInitializationResult->state = PAWINUTIL_COM_NOT_INITIALIZED; + + /* + If COM is already initialized CoInitialize will either return + FALSE, or RPC_E_CHANGED_MODE if it was initialised in a different + threading mode. In either case we shouldn't consider it an error + but we need to be careful to not call CoUninitialize() if + RPC_E_CHANGED_MODE was returned. + */ + + hr = CoInitialize(0); /* use legacy-safe equivalent to CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) */ + if( FAILED(hr) && hr != RPC_E_CHANGED_MODE ) + { + PA_DEBUG(("CoInitialize(0) failed. hr=%d\n", hr)); + + if( hr == E_OUTOFMEMORY ) + return paInsufficientMemory; + + { + char *lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + hr, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + PaUtil_SetLastHostErrorInfo( hostApiType, hr, lpMsgBuf ); + LocalFree( lpMsgBuf ); + } + + return paUnanticipatedHostError; + } + + if( hr != RPC_E_CHANGED_MODE ) + { + comInitializationResult->state = PAWINUTIL_COM_INITIALIZED; + + /* + Memorize calling thread id and report warning on Uninitialize if + calling thread is different as CoInitialize must match CoUninitialize + in the same thread. + */ + comInitializationResult->initializingThreadId = GetCurrentThreadId(); + } + + return paNoError; +} + + +void PaWinUtil_CoUninitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitializationResult *comInitializationResult ) +{ + if( comInitializationResult->state != PAWINUTIL_COM_NOT_INITIALIZED + && comInitializationResult->state != PAWINUTIL_COM_INITIALIZED ){ + + PA_DEBUG(("ERROR: PaWinUtil_CoUninitialize called without calling PaWinUtil_CoInitialize\n")); + } + + if( comInitializationResult->state == PAWINUTIL_COM_INITIALIZED ) + { + DWORD currentThreadId = GetCurrentThreadId(); + if( comInitializationResult->initializingThreadId != currentThreadId ) + { + PA_DEBUG(("ERROR: failed PaWinUtil_CoUninitialize calling thread[%d] does not match initializing thread[%d]\n", + currentThreadId, comInitializationResult->initializingThreadId)); + } + else + { + CoUninitialize(); + + comInitializationResult->state = PAWINUTIL_COM_NOT_INITIALIZED; + } + } +} \ No newline at end of file diff --git a/Externals/portaudio/src/os/win/pa_win_coinitialize.h b/Externals/portaudio/src/os/win/pa_win_coinitialize.h new file mode 100644 index 0000000000..687ab83187 --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_coinitialize.h @@ -0,0 +1,94 @@ +/* + * Microsoft COM initialization routines + * Copyright (c) 1999-2011 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src + + @brief Microsoft COM initialization routines. +*/ + +#ifndef PA_WIN_COINITIALIZE_H +#define PA_WIN_COINITIALIZE_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** + @brief Data type used to hold the result of an attempt to initialize COM + using PaWinUtil_CoInitialize. Must be retained between a call to + PaWinUtil_CoInitialize and a matching call to PaWinUtil_CoUninitialize. +*/ +typedef struct PaWinUtilComInitializationResult{ + int state; + int initializingThreadId; +} PaWinUtilComInitializationResult; + + +/** + @brief Initialize Microsoft COM subsystem on the current thread. + + @param hostApiType the host API type id of the caller. Used for error reporting. + + @param comInitializationResult An output parameter. The value pointed to by + this parameter stores information required by PaWinUtil_CoUninitialize + to correctly uninitialize COM. The value should be retained and later + passed to PaWinUtil_CoUninitialize. + + If PaWinUtil_CoInitialize returns paNoError, the caller must later call + PaWinUtil_CoUninitialize once. +*/ +PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitializationResult *comInitializationResult ); + + +/** + @brief Uninitialize the Microsoft COM subsystem on the current thread using + the result of a previous call to PaWinUtil_CoInitialize. Must be called on the same + thread as PaWinUtil_CoInitialize. + + @param hostApiType the host API type id of the caller. Used for error reporting. + + @param comInitializationResult An input parameter. A pointer to a value previously + initialized by a call to PaWinUtil_CoInitialize. +*/ +void PaWinUtil_CoUninitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitializationResult *comInitializationResult ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_WIN_COINITIALIZE_H */ diff --git a/Externals/portaudio/src/os/win/pa_win_hostapis.c b/Externals/portaudio/src/os/win/pa_win_hostapis.c new file mode 100644 index 0000000000..5d22438799 --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_hostapis.c @@ -0,0 +1,102 @@ +/* + * $Id: pa_win_hostapis.c 1728 2011-08-18 03:31:51Z rossb $ + * Portable Audio I/O Library Windows initialization table + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src + + @brief Win32 host API initialization function table. +*/ + +/* This is needed to make this source file depend on CMake option changes + and at the same time make it transparent for clients not using CMake. +*/ +#ifdef PORTAUDIO_CMAKE_GENERATED +#include "options_cmake.h" +#endif + +#include "pa_hostapi.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); +PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +PaUtilHostApiInitializer *paHostApiInitializers[] = + { + +#if PA_USE_WMME + PaWinMme_Initialize, +#endif + +#if PA_USE_DS + PaWinDs_Initialize, +#endif + +#if PA_USE_ASIO + PaAsio_Initialize, +#endif + +#if PA_USE_WASAPI + PaWasapi_Initialize, +#endif + +#if PA_USE_WDMKS + PaWinWdm_Initialize, +#endif + +#if PA_USE_SKELETON + PaSkeleton_Initialize, /* just for testing. last in list so it isn't marked as default. */ +#endif + + 0 /* NULL terminated array */ + }; + + diff --git a/Externals/portaudio/src/os/win/pa_win_util.c b/Externals/portaudio/src/os/win/pa_win_util.c new file mode 100644 index 0000000000..a9c55d0f8a --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_util.c @@ -0,0 +1,153 @@ +/* + * $Id: pa_win_util.c 1584 2011-02-02 18:58:17Z rossb $ + * Portable Audio I/O Library + * Win32 platform-specific support functions + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src + + @brief Win32 implementation of platform-specific PaUtil support functions. +*/ + +#include +#include /* for timeGetTime() */ + +#include "pa_util.h" + +#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) && !defined(_WIN32_WCE) /* MSC version 6 and above */ +#pragma comment( lib, "winmm.lib" ) +#endif + + +/* + Track memory allocations to avoid leaks. + */ + +#if PA_TRACK_MEMORY +static int numAllocations_ = 0; +#endif + + +void *PaUtil_AllocateMemory( long size ) +{ + void *result = GlobalAlloc( GPTR, size ); + +#if PA_TRACK_MEMORY + if( result != NULL ) numAllocations_ += 1; +#endif + return result; +} + + +void PaUtil_FreeMemory( void *block ) +{ + if( block != NULL ) + { + GlobalFree( block ); +#if PA_TRACK_MEMORY + numAllocations_ -= 1; +#endif + + } +} + + +int PaUtil_CountCurrentlyAllocatedBlocks( void ) +{ +#if PA_TRACK_MEMORY + return numAllocations_; +#else + return 0; +#endif +} + + +void Pa_Sleep( long msec ) +{ + Sleep( msec ); +} + +static int usePerformanceCounter_; +static double secondsPerTick_; + +void PaUtil_InitializeClock( void ) +{ + LARGE_INTEGER ticksPerSecond; + + if( QueryPerformanceFrequency( &ticksPerSecond ) != 0 ) + { + usePerformanceCounter_ = 1; + secondsPerTick_ = 1.0 / (double)ticksPerSecond.QuadPart; + } + else + { + usePerformanceCounter_ = 0; + } +} + + +double PaUtil_GetTime( void ) +{ + LARGE_INTEGER time; + + if( usePerformanceCounter_ ) + { + /* + Note: QueryPerformanceCounter has a known issue where it can skip forward + by a few seconds (!) due to a hardware bug on some PCI-ISA bridge hardware. + This is documented here: + http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q274323& + + The work-arounds are not very paletable and involve querying GetTickCount + at every time step. + + Using rdtsc is not a good option on multi-core systems. + + For now we just use QueryPerformanceCounter(). It's good, most of the time. + */ + QueryPerformanceCounter( &time ); + return time.QuadPart * secondsPerTick_; + } + else + { +#ifndef UNDER_CE + return timeGetTime() * .001; +#else + return GetTickCount() * .001; +#endif + } +} diff --git a/Externals/portaudio/src/os/win/pa_win_waveformat.c b/Externals/portaudio/src/os/win/pa_win_waveformat.c new file mode 100644 index 0000000000..beae5825e4 --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_waveformat.c @@ -0,0 +1,154 @@ +/* + * PortAudio Portable Real-Time Audio Library + * Windows WAVEFORMAT* data structure utilities + * portaudio.h should be included before this file. + * + * Copyright (c) 2007 Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +#include +#include + +#include "portaudio.h" +#include "pa_win_waveformat.h" + + +#if !defined(WAVE_FORMAT_EXTENSIBLE) +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif + +static GUID pawin_ksDataFormatSubtypeGuidBase = + { (USHORT)(WAVE_FORMAT_PCM), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }; + + +int PaWin_SampleFormatToLinearWaveFormatTag( PaSampleFormat sampleFormat ) +{ + if( sampleFormat == paFloat32 ) + return PAWIN_WAVE_FORMAT_IEEE_FLOAT; + + return PAWIN_WAVE_FORMAT_PCM; +} + + +void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate ) +{ + WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; + int bytesPerSample = Pa_GetSampleSize(sampleFormat); + unsigned long bytesPerFrame = numChannels * bytesPerSample; + + waveFormatEx->wFormatTag = waveFormatTag; + waveFormatEx->nChannels = (WORD)numChannels; + waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; + waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; + waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; + waveFormatEx->wBitsPerSample = bytesPerSample * 8; + waveFormatEx->cbSize = 0; +} + + +void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate, + PaWinWaveFormatChannelMask channelMask ) +{ + WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; + int bytesPerSample = Pa_GetSampleSize(sampleFormat); + unsigned long bytesPerFrame = numChannels * bytesPerSample; + GUID guid; + + waveFormatEx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; + waveFormatEx->nChannels = (WORD)numChannels; + waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; + waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; + waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; + waveFormatEx->wBitsPerSample = bytesPerSample * 8; + waveFormatEx->cbSize = 22; + + *((WORD*)&waveFormat->fields[PAWIN_INDEXOF_WVALIDBITSPERSAMPLE]) = + waveFormatEx->wBitsPerSample; + + *((DWORD*)&waveFormat->fields[PAWIN_INDEXOF_DWCHANNELMASK]) = channelMask; + + guid = pawin_ksDataFormatSubtypeGuidBase; + guid.Data1 = (USHORT)waveFormatTag; + *((GUID*)&waveFormat->fields[PAWIN_INDEXOF_SUBFORMAT]) = guid; +} + + +PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) +{ + switch( numChannels ){ + case 1: + return PAWIN_SPEAKER_MONO; + case 2: + return PAWIN_SPEAKER_STEREO; + case 3: + return PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_FRONT_RIGHT; + case 4: + return PAWIN_SPEAKER_QUAD; + case 5: + return PAWIN_SPEAKER_QUAD | PAWIN_SPEAKER_FRONT_CENTER; + case 6: + /* The meaning of the PAWIN_SPEAKER_5POINT1 flag has changed over time: + http://msdn2.microsoft.com/en-us/library/aa474707.aspx + We use PAWIN_SPEAKER_5POINT1 (not PAWIN_SPEAKER_5POINT1_SURROUND) + because on some cards (eg Audigy) PAWIN_SPEAKER_5POINT1_SURROUND + results in a virtual mixdown placing the rear output in the + front _and_ rear speakers. + */ + return PAWIN_SPEAKER_5POINT1; + /* case 7: */ + case 8: + return PAWIN_SPEAKER_7POINT1; + } + + /* Apparently some Audigy drivers will output silence + if the direct-out constant (0) is used. So this is not ideal. + */ + return PAWIN_SPEAKER_DIRECTOUT; + + /* Note that Alec Rogers proposed the following as an alternate method to + generate the default channel mask, however it doesn't seem to be an improvement + over the above, since some drivers will matrix outputs mapping to non-present + speakers accross multiple physical speakers. + + if(nChannels==1) { + pwfFormat->dwChannelMask = SPEAKER_FRONT_CENTER; + } + else { + pwfFormat->dwChannelMask = 0; + for(i=0; idwChannelMask = (pwfFormat->dwChannelMask << 1) | 0x1; + } + */ +} diff --git a/Externals/portaudio/src/os/win/pa_win_wdmks_utils.c b/Externals/portaudio/src/os/win/pa_win_wdmks_utils.c new file mode 100644 index 0000000000..0dc0b4bdea --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_wdmks_utils.c @@ -0,0 +1,297 @@ +/* + * PortAudio Portable Real-Time Audio Library + * Windows WDM KS utilities + * + * Copyright (c) 1999 - 2007 Andrew Baldwin, Ross Bencina + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +#include +#include +#ifndef WAVE_FORMAT_IEEE_FLOAT + #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // MinGW32 does not define this +#endif +#ifndef _WAVEFORMATEXTENSIBLE_ + #define _WAVEFORMATEXTENSIBLE_ // MinGW32 does not define this +#endif +#ifndef _INC_MMREG + #define _INC_MMREG // for STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT +#endif +#include // MinGW32 does not define this automatically +#include +#include +#include // just for some development printfs + +#include "portaudio.h" +#include "pa_util.h" +#include "pa_win_wdmks_utils.h" + +#if !defined(PA_WDMKS_NO_KSGUID_LIB) && !defined(PAWIN_WDMKS_NO_KSGUID_LIB) + #if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ + #pragma comment( lib, "ksguid.lib" ) + #endif + #define pa_KSDATAFORMAT_TYPE_AUDIO KSDATAFORMAT_TYPE_AUDIO + #define pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT KSDATAFORMAT_SUBTYPE_IEEE_FLOAT + #define pa_KSDATAFORMAT_SUBTYPE_PCM KSDATAFORMAT_SUBTYPE_PCM + #define pa_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX KSDATAFORMAT_SUBTYPE_WAVEFORMATEX + #define pa_KSMEDIUMSETID_Standard KSMEDIUMSETID_Standard + #define pa_KSINTERFACESETID_Standard KSINTERFACESETID_Standard + #define pa_KSPROPSETID_Pin KSPROPSETID_Pin +#else + static const GUID pa_KSDATAFORMAT_TYPE_AUDIO = { STATIC_KSDATAFORMAT_TYPE_AUDIO }; + static const GUID pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT }; + static const GUID pa_KSDATAFORMAT_SUBTYPE_PCM = { STATIC_KSDATAFORMAT_SUBTYPE_PCM }; + static const GUID pa_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX = { STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX }; + static const GUID pa_KSMEDIUMSETID_Standard = { STATIC_KSMEDIUMSETID_Standard }; + static const GUID pa_KSINTERFACESETID_Standard = { STATIC_KSINTERFACESETID_Standard }; + static const GUID pa_KSPROPSETID_Pin = { STATIC_KSPROPSETID_Pin }; +#endif + + +#define pa_IS_VALID_WAVEFORMATEX_GUID(Guid)\ + (!memcmp(((PUSHORT)&pa_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, ((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT))) + + + +static PaError WdmGetPinPropertySimple( + HANDLE handle, + unsigned long pinId, + unsigned long property, + void* value, + unsigned long valueSize ) +{ + DWORD bytesReturned; + KSP_PIN ksPProp; + ksPProp.Property.Set = pa_KSPROPSETID_Pin; + ksPProp.Property.Id = property; + ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; + ksPProp.PinId = pinId; + ksPProp.Reserved = 0; + + if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp, sizeof(KSP_PIN), + value, valueSize, &bytesReturned, NULL ) == 0 || bytesReturned != valueSize ) + { + return paUnanticipatedHostError; + } + else + { + return paNoError; + } +} + + +static PaError WdmGetPinPropertyMulti( + HANDLE handle, + unsigned long pinId, + unsigned long property, + KSMULTIPLE_ITEM** ksMultipleItem) +{ + unsigned long multipleItemSize = 0; + KSP_PIN ksPProp; + DWORD bytesReturned; + + *ksMultipleItem = 0; + + ksPProp.Property.Set = pa_KSPROPSETID_Pin; + ksPProp.Property.Id = property; + ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; + ksPProp.PinId = pinId; + ksPProp.Reserved = 0; + + if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp.Property, + sizeof(KSP_PIN), NULL, 0, &multipleItemSize, NULL ) == 0 && GetLastError() != ERROR_MORE_DATA ) + { + return paUnanticipatedHostError; + } + + *ksMultipleItem = (KSMULTIPLE_ITEM*)PaUtil_AllocateMemory( multipleItemSize ); + if( !*ksMultipleItem ) + { + return paInsufficientMemory; + } + + if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp, sizeof(KSP_PIN), + (void*)*ksMultipleItem, multipleItemSize, &bytesReturned, NULL ) == 0 || bytesReturned != multipleItemSize ) + { + PaUtil_FreeMemory( ksMultipleItem ); + return paUnanticipatedHostError; + } + + return paNoError; +} + + +static int GetKSFilterPinCount( HANDLE deviceHandle ) +{ + DWORD result; + + if( WdmGetPinPropertySimple( deviceHandle, 0, KSPROPERTY_PIN_CTYPES, &result, sizeof(result) ) == paNoError ){ + return result; + }else{ + return 0; + } +} + + +static KSPIN_COMMUNICATION GetKSFilterPinPropertyCommunication( HANDLE deviceHandle, int pinId ) +{ + KSPIN_COMMUNICATION result; + + if( WdmGetPinPropertySimple( deviceHandle, pinId, KSPROPERTY_PIN_COMMUNICATION, &result, sizeof(result) ) == paNoError ){ + return result; + }else{ + return KSPIN_COMMUNICATION_NONE; + } +} + + +static KSPIN_DATAFLOW GetKSFilterPinPropertyDataflow( HANDLE deviceHandle, int pinId ) +{ + KSPIN_DATAFLOW result; + + if( WdmGetPinPropertySimple( deviceHandle, pinId, KSPROPERTY_PIN_DATAFLOW, &result, sizeof(result) ) == paNoError ){ + return result; + }else{ + return (KSPIN_DATAFLOW)0; + } +} + + +static int KSFilterPinPropertyIdentifiersInclude( + HANDLE deviceHandle, int pinId, unsigned long property, const GUID *identifierSet, unsigned long identifierId ) +{ + KSMULTIPLE_ITEM* item = NULL; + KSIDENTIFIER* identifier; + int i; + int result = 0; + + if( WdmGetPinPropertyMulti( deviceHandle, pinId, property, &item) != paNoError ) + return 0; + + identifier = (KSIDENTIFIER*)(item+1); + + for( i = 0; i < (int)item->Count; i++ ) + { + if( !memcmp( (void*)&identifier[i].Set, (void*)identifierSet, sizeof( GUID ) ) && + ( identifier[i].Id == identifierId ) ) + { + result = 1; + break; + } + } + + PaUtil_FreeMemory( item ); + + return result; +} + + +/* return the maximum channel count supported by any pin on the device. + if isInput is non-zero we query input pins, otherwise output pins. +*/ +int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInput ) +{ + HANDLE deviceHandle; + ULONG i; + int pinCount, pinId; + int result = 0; + KSPIN_DATAFLOW requiredDataflowDirection = (isInput ? KSPIN_DATAFLOW_OUT : KSPIN_DATAFLOW_IN ); + + if( !wcharDevicePath ) + return 0; + + deviceHandle = CreateFileW( (LPCWSTR)wcharDevicePath, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); + if( deviceHandle == INVALID_HANDLE_VALUE ) + return 0; + + pinCount = GetKSFilterPinCount( deviceHandle ); + for( pinId = 0; pinId < pinCount; ++pinId ) + { + KSPIN_COMMUNICATION communication = GetKSFilterPinPropertyCommunication( deviceHandle, pinId ); + KSPIN_DATAFLOW dataflow = GetKSFilterPinPropertyDataflow( deviceHandle, pinId ); + if( ( dataflow == requiredDataflowDirection ) && + (( communication == KSPIN_COMMUNICATION_SINK) || + ( communication == KSPIN_COMMUNICATION_BOTH)) + && ( KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_STREAMING ) + || KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_LOOPED_STREAMING ) ) + && KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + KSPROPERTY_PIN_MEDIUMS, &pa_KSMEDIUMSETID_Standard, KSMEDIUM_STANDARD_DEVIO ) ) + { + KSMULTIPLE_ITEM* item = NULL; + if( WdmGetPinPropertyMulti( deviceHandle, pinId, KSPROPERTY_PIN_DATARANGES, &item ) == paNoError ) + { + KSDATARANGE *dataRange = (KSDATARANGE*)(item+1); + + for( i=0; i < item->Count; ++i ){ + + if( pa_IS_VALID_WAVEFORMATEX_GUID(&dataRange->SubFormat) + || memcmp( (void*)&dataRange->SubFormat, (void*)&pa_KSDATAFORMAT_SUBTYPE_PCM, sizeof(GUID) ) == 0 + || memcmp( (void*)&dataRange->SubFormat, (void*)&pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(GUID) ) == 0 + || ( ( memcmp( (void*)&dataRange->MajorFormat, (void*)&pa_KSDATAFORMAT_TYPE_AUDIO, sizeof(GUID) ) == 0 ) + && ( memcmp( (void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_WILDCARD, sizeof(GUID) ) == 0 ) ) ) + { + KSDATARANGE_AUDIO *dataRangeAudio = (KSDATARANGE_AUDIO*)dataRange; + + /* + printf( ">>> %d %d %d %d %S\n", isInput, dataflow, communication, dataRangeAudio->MaximumChannels, devicePath ); + + if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, sizeof(GUID) ) == 0 ) + printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\n" ); + else if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_DSOUND, sizeof(GUID) ) == 0 ) + printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_DSOUND\n" ); + else if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_WILDCARD, sizeof(GUID) ) == 0 ) + printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_WILDCARD\n" ); + else + printf( "\tspecifier: ?\n" ); + */ + + /* + We assume that very high values for MaximumChannels are not useful and indicate + that the driver isn't prepared to tell us the real number of channels which it supports. + */ + if( dataRangeAudio->MaximumChannels < 0xFFFFUL && (int)dataRangeAudio->MaximumChannels > result ) + result = (int)dataRangeAudio->MaximumChannels; + } + + dataRange = (KSDATARANGE*)( ((char*)dataRange) + dataRange->FormatSize); + } + + PaUtil_FreeMemory( item ); + } + } + } + + CloseHandle( deviceHandle ); + return result; +} diff --git a/Externals/portaudio/src/os/win/pa_win_wdmks_utils.h b/Externals/portaudio/src/os/win/pa_win_wdmks_utils.h new file mode 100644 index 0000000000..b8e923a615 --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_win_wdmks_utils.h @@ -0,0 +1,65 @@ +#ifndef PA_WIN_WDMKS_UTILS_H +#define PA_WIN_WDMKS_UTILS_H + +/* + * PortAudio Portable Real-Time Audio Library + * Windows WDM KS utilities + * + * Copyright (c) 1999 - 2007 Ross Bencina, Andrew Baldwin + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @brief Utilities for working with the Windows WDM KS API +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Query for the maximum number of channels supported by any pin of the + specified device. Returns 0 if the query fails for any reason. + + @param wcharDevicePath A system level PnP interface path, supplied as a WCHAR unicode string. + Declard as void* to avoid introducing a dependency on wchar_t here. + + @param isInput A flag specifying whether to query for input (non-zero) or output (zero) channels. +*/ +int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInput ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* PA_WIN_WDMKS_UTILS_H */ \ No newline at end of file diff --git a/Externals/portaudio/src/os/win/pa_x86_plain_converters.c b/Externals/portaudio/src/os/win/pa_x86_plain_converters.c new file mode 100644 index 0000000000..4fcde40cb0 --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_x86_plain_converters.c @@ -0,0 +1,1219 @@ +/* + * Plain Intel IA32 assembly implementations of PortAudio sample converter functions. + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src +*/ + +#include "pa_x86_plain_converters.h" + +#include "pa_converters.h" +#include "pa_dither.h" + +/* + the main reason these versions are faster than the equivalent C versions + is that float -> int casting is expensive in C on x86 because the rounding + mode needs to be changed for every cast. these versions only set + the rounding mode once outside the loop. + + small additional speed gains are made by the way that clamping is + implemented. + +TODO: + o- inline dither code + o- implement Dither only (no-clip) versions + o- implement int8 and uint8 versions + o- test thouroughly + + o- the packed 24 bit functions could benefit from unrolling and avoiding + byte and word sized register access. +*/ + +/* -------------------------------------------------------------------------- */ + +/* +#define PA_CLIP_( val, min, max )\ + { val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); } +*/ + +/* + the following notes were used to determine whether a floating point + value should be saturated (ie >1 or <-1) by loading it into an integer + register. these should be rewritten so that they make sense. + + an ieee floating point value + + 1.xxxxxxxxxxxxxxxxxxxx? + + + is less than or equal to 1 and greater than or equal to -1 either: + + if the mantissa is 0 and the unbiased exponent is 0 + + OR + + if the unbiased exponent < 0 + + this translates to: + + if the mantissa is 0 and the biased exponent is 7F + + or + + if the biased exponent is less than 7F + + + therefore the value is greater than 1 or less than -1 if + + the mantissa is not 0 and the biased exponent is 7F + + or + + if the biased exponent is greater than 7F + + + in other words, if we mask out the sign bit, the value is + greater than 1 or less than -1 if its integer representation is greater than: + + 0 01111111 0000 0000 0000 0000 0000 000 + + 0011 1111 1000 0000 0000 0000 0000 0000 => 0x3F800000 +*/ + +/* -------------------------------------------------------------------------- */ + +static const short fpuControlWord_ = 0x033F; /*round to nearest, 64 bit precision, all exceptions masked*/ +static const double int32Scaler_ = 0x7FFFFFFF; +static const double ditheredInt32Scaler_ = 0x7FFFFFFE; +static const double int24Scaler_ = 0x7FFFFF; +static const double ditheredInt24Scaler_ = 0x7FFFFE; +static const double int16Scaler_ = 0x7FFF; +static const double ditheredInt16Scaler_ = 0x7FFE; + +#define PA_DITHER_BITS_ (15) +/* Multiply by PA_FLOAT_DITHER_SCALE_ to get a float between -2.0 and +1.99999 */ +#define PA_FLOAT_DITHER_SCALE_ (1.0F / ((1< source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 and int32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int32Scaler_ // stack: (int)0x7FFFFFFF + + Float32_To_Int32_loop: + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFFFFFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFFFFFF, (int)0x7FFFFFFF + /* + note: we could store to a temporary qword here which would cause + wraparound distortion instead of int indefinite 0x10. that would + be more work, and given that not enabling clipping is only advisable + when you know that your signal isn't going to clip it isn't worth it. + */ + fistp dword ptr [edi] // pop st(0) into dest, stack: (int)0x7FFFFFFF + + add edi, ebx // increment destination ptr + //lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int32_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + signed long *dest = (signed long*)destinationBuffer; + (void) ditherGenerator; // unused parameter + + while( count-- ) + { + // REVIEW + double scaled = *src * 0x7FFFFFFF; + PA_CLIP_( scaled, -2147483648., 2147483647. ); + *dest = (signed long) scaled; + + src += sourceStride; + dest += destinationStride; + } +*/ + + short savedFpuControlWord; + + (void) ditherGenerator; /* unused parameter */ + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 and int32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int32Scaler_ // stack: (int)0x7FFFFFFF + + Float32_To_Int32_Clip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int32_Clip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFFFFFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFFFFFF, (int)0x7FFFFFFF + fistp dword ptr [edi] // pop st(0) into dest, stack: (int)0x7FFFFFFF + jmp Float32_To_Int32_Clip_stored + + Float32_To_Int32_Clip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add edx, 0x7FFFFFFF // convert to maximum range integers + mov dword ptr [edi], edx + + Float32_To_Int32_Clip_stored: + + //add edi, ebx // increment destination ptr + lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int32_Clip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int32_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ + /* + float *src = (float*)sourceBuffer; + signed long *dest = (signed long*)destinationBuffer; + + while( count-- ) + { + // REVIEW + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + // use smaller scaler to prevent overflow when we add the dither + double dithered = ((double)*src * (2147483646.0)) + dither; + PA_CLIP_( dithered, -2147483648., 2147483647. ); + *dest = (signed long) dithered; + + + src += sourceStride; + dest += destinationStride; + } + */ + + short savedFpuControlWord; + + // spill storage: + signed long sourceByteStride; + signed long highpassedDither; + + // dither state: + unsigned long ditherPrevious = ditherGenerator->previous; + unsigned long ditherRandSeed1 = ditherGenerator->randSeed1; + unsigned long ditherRandSeed2 = ditherGenerator->randSeed2; + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 and int32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld ditheredInt32Scaler_ // stack: int scaler + + Float32_To_Int32_DitherClip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int32_DitherClip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, int scaler + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*(int scaler), int scaler + + /* + // call PaUtil_GenerateFloatTriangularDither with C calling convention + mov sourceByteStride, eax // save eax + mov sourceEnd, ecx // save ecx + push ditherGenerator // pass ditherGenerator parameter on stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack + mov ecx, sourceEnd // restore ecx + mov eax, sourceByteStride // restore eax + */ + + // generate dither + mov sourceByteStride, eax // save eax + mov edx, 196314165 + mov eax, ditherRandSeed1 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov ditherRandSeed1, eax + mov edx, 196314165 + mov eax, ditherRandSeed2 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov edx, ditherRandSeed1 + shr edx, PA_DITHER_SHIFT_ + mov ditherRandSeed2, eax + shr eax, PA_DITHER_SHIFT_ + //add eax, edx // eax -> current + lea eax, [eax+edx] + mov edx, ditherPrevious + neg edx + lea edx, [eax+edx] // highpass = current - previous + mov highpassedDither, edx + mov ditherPrevious, eax // previous = current + mov eax, sourceByteStride // restore eax + fild highpassedDither + fmul const_float_dither_scale_ + // end generate dither, dither signal in st(0) + + faddp st(1), st(0) // stack: dither + value*(int scaler), int scaler + fistp dword ptr [edi] // pop st(0) into dest, stack: int scaler + jmp Float32_To_Int32_DitherClip_stored + + Float32_To_Int32_DitherClip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add edx, 0x7FFFFFFF // convert to maximum range integers + mov dword ptr [edi], edx + + Float32_To_Int32_DitherClip_stored: + + //add edi, ebx // increment destination ptr + lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int32_DitherClip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } + + ditherGenerator->previous = ditherPrevious; + ditherGenerator->randSeed1 = ditherRandSeed1; + ditherGenerator->randSeed2 = ditherRandSeed2; +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + signed long temp; + + (void) ditherGenerator; // unused parameter + + while( count-- ) + { + // convert to 32 bit and drop the low 8 bits + double scaled = *src * 0x7FFFFFFF; + temp = (signed long) scaled; + + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); + + src += sourceStride; + dest += destinationStride * 3; + } +*/ + + short savedFpuControlWord; + + signed long tempInt32; + + (void) ditherGenerator; /* unused parameter */ + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov edx, 3 // sizeof int24 + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int24Scaler_ // stack: (int)0x7FFFFF + + Float32_To_Int24_loop: + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFFFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFFFF, (int)0x7FFFFF + fistp tempInt32 // pop st(0) into tempInt32, stack: (int)0x7FFFFF + mov edx, tempInt32 + + mov byte ptr [edi], DL + shr edx, 8 + //mov byte ptr [edi+1], DL + //mov byte ptr [edi+2], DH + mov word ptr [edi+1], DX + + //add edi, ebx // increment destination ptr + lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int24_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + signed long temp; + + (void) ditherGenerator; // unused parameter + + while( count-- ) + { + // convert to 32 bit and drop the low 8 bits + double scaled = *src * 0x7FFFFFFF; + PA_CLIP_( scaled, -2147483648., 2147483647. ); + temp = (signed long) scaled; + + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); + + src += sourceStride; + dest += destinationStride * 3; + } +*/ + + short savedFpuControlWord; + + signed long tempInt32; + + (void) ditherGenerator; /* unused parameter */ + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov edx, 3 // sizeof int24 + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int24Scaler_ // stack: (int)0x7FFFFF + + Float32_To_Int24_Clip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int24_Clip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFFFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFFFF, (int)0x7FFFFF + fistp tempInt32 // pop st(0) into tempInt32, stack: (int)0x7FFFFF + mov edx, tempInt32 + jmp Float32_To_Int24_Clip_store + + Float32_To_Int24_Clip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add edx, 0x7FFFFF // convert to maximum range integers + + Float32_To_Int24_Clip_store: + + mov byte ptr [edi], DL + shr edx, 8 + //mov byte ptr [edi+1], DL + //mov byte ptr [edi+2], DH + mov word ptr [edi+1], DX + + //add edi, ebx // increment destination ptr + lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int24_Clip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int24_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + unsigned char *dest = (unsigned char*)destinationBuffer; + signed long temp; + + while( count-- ) + { + // convert to 32 bit and drop the low 8 bits + + // FIXME: the dither amplitude here appears to be too small by 8 bits + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + // use smaller scaler to prevent overflow when we add the dither + double dithered = ((double)*src * (2147483646.0)) + dither; + PA_CLIP_( dithered, -2147483648., 2147483647. ); + + temp = (signed long) dithered; + + dest[0] = (unsigned char)(temp >> 8); + dest[1] = (unsigned char)(temp >> 16); + dest[2] = (unsigned char)(temp >> 24); + + src += sourceStride; + dest += destinationStride * 3; + } +*/ + + short savedFpuControlWord; + + // spill storage: + signed long sourceByteStride; + signed long highpassedDither; + + // dither state: + unsigned long ditherPrevious = ditherGenerator->previous; + unsigned long ditherRandSeed1 = ditherGenerator->randSeed1; + unsigned long ditherRandSeed2 = ditherGenerator->randSeed2; + + signed long tempInt32; + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx + + mov ecx, count + imul ecx, eax + add ecx, esi + + mov edi, destinationBuffer + + mov edx, 3 // sizeof int24 + mov ebx, destinationStride + imul ebx, edx + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld ditheredInt24Scaler_ // stack: int scaler + + Float32_To_Int24_DitherClip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int24_DitherClip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, int scaler + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*(int scaler), int scaler + + /* + // call PaUtil_GenerateFloatTriangularDither with C calling convention + mov sourceByteStride, eax // save eax + mov sourceEnd, ecx // save ecx + push ditherGenerator // pass ditherGenerator parameter on stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack + mov ecx, sourceEnd // restore ecx + mov eax, sourceByteStride // restore eax + */ + + // generate dither + mov sourceByteStride, eax // save eax + mov edx, 196314165 + mov eax, ditherRandSeed1 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov ditherRandSeed1, eax + mov edx, 196314165 + mov eax, ditherRandSeed2 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov edx, ditherRandSeed1 + shr edx, PA_DITHER_SHIFT_ + mov ditherRandSeed2, eax + shr eax, PA_DITHER_SHIFT_ + //add eax, edx // eax -> current + lea eax, [eax+edx] + mov edx, ditherPrevious + neg edx + lea edx, [eax+edx] // highpass = current - previous + mov highpassedDither, edx + mov ditherPrevious, eax // previous = current + mov eax, sourceByteStride // restore eax + fild highpassedDither + fmul const_float_dither_scale_ + // end generate dither, dither signal in st(0) + + faddp st(1), st(0) // stack: dither * value*(int scaler), int scaler + fistp tempInt32 // pop st(0) into tempInt32, stack: int scaler + mov edx, tempInt32 + jmp Float32_To_Int24_DitherClip_store + + Float32_To_Int24_DitherClip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add edx, 0x7FFFFF // convert to maximum range integers + + Float32_To_Int24_DitherClip_store: + + mov byte ptr [edi], DL + shr edx, 8 + //mov byte ptr [edi+1], DL + //mov byte ptr [edi+2], DH + mov word ptr [edi+1], DX + + //add edi, ebx // increment destination ptr + lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int24_DitherClip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } + + ditherGenerator->previous = ditherPrevious; + ditherGenerator->randSeed1 = ditherRandSeed1; + ditherGenerator->randSeed2 = ditherRandSeed2; +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + signed short *dest = (signed short*)destinationBuffer; + (void)ditherGenerator; // unused parameter + + while( count-- ) + { + + short samp = (short) (*src * (32767.0f)); + *dest = samp; + + src += sourceStride; + dest += destinationStride; + } +*/ + + short savedFpuControlWord; + + (void) ditherGenerator; /* unused parameter */ + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx // source byte stride + + mov ecx, count + imul ecx, eax + add ecx, esi // source end ptr = count * source byte stride + source ptr + + mov edi, destinationBuffer + + mov edx, 2 // sizeof int16 + mov ebx, destinationStride + imul ebx, edx // destination byte stride + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int16Scaler_ // stack: (int)0x7FFF + + Float32_To_Int16_loop: + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFF, (int)0x7FFF + fistp word ptr [edi] // store scaled int into dest, stack: (int)0x7FFF + + add edi, ebx // increment destination ptr + //lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int16_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16_Clip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + signed short *dest = (signed short*)destinationBuffer; + (void)ditherGenerator; // unused parameter + + while( count-- ) + { + long samp = (signed long) (*src * (32767.0f)); + PA_CLIP_( samp, -0x8000, 0x7FFF ); + *dest = (signed short) samp; + + src += sourceStride; + dest += destinationStride; + } +*/ + + short savedFpuControlWord; + + (void) ditherGenerator; /* unused parameter */ + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx // source byte stride + + mov ecx, count + imul ecx, eax + add ecx, esi // source end ptr = count * source byte stride + source ptr + + mov edi, destinationBuffer + + mov edx, 2 // sizeof int16 + mov ebx, destinationStride + imul ebx, edx // destination byte stride + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld int16Scaler_ // stack: (int)0x7FFF + + Float32_To_Int16_Clip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int16_Clip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, (int)0x7FFF + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFF, (int)0x7FFF + fistp word ptr [edi] // store scaled int into dest, stack: (int)0x7FFF + jmp Float32_To_Int16_Clip_stored + + Float32_To_Int16_Clip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add dx, 0x7FFF // convert to maximum range integers + mov word ptr [edi], dx // store clamped into into dest + + Float32_To_Int16_Clip_stored: + + add edi, ebx // increment destination ptr + //lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int16_Clip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } +} + +/* -------------------------------------------------------------------------- */ + +static void Float32_To_Int16_DitherClip( + void *destinationBuffer, signed int destinationStride, + void *sourceBuffer, signed int sourceStride, + unsigned int count, PaUtilTriangularDitherGenerator *ditherGenerator ) +{ +/* + float *src = (float*)sourceBuffer; + signed short *dest = (signed short*)destinationBuffer; + (void)ditherGenerator; // unused parameter + + while( count-- ) + { + + float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); + // use smaller scaler to prevent overflow when we add the dither + float dithered = (*src * (32766.0f)) + dither; + signed long samp = (signed long) dithered; + PA_CLIP_( samp, -0x8000, 0x7FFF ); + *dest = (signed short) samp; + + src += sourceStride; + dest += destinationStride; + } +*/ + + short savedFpuControlWord; + + // spill storage: + signed long sourceByteStride; + signed long highpassedDither; + + // dither state: + unsigned long ditherPrevious = ditherGenerator->previous; + unsigned long ditherRandSeed1 = ditherGenerator->randSeed1; + unsigned long ditherRandSeed2 = ditherGenerator->randSeed2; + + __asm{ + // esi -> source ptr + // eax -> source byte stride + // edi -> destination ptr + // ebx -> destination byte stride + // ecx -> source end ptr + // edx -> temp + + mov esi, sourceBuffer + + mov edx, 4 // sizeof float32 + mov eax, sourceStride + imul eax, edx // source byte stride + + mov ecx, count + imul ecx, eax + add ecx, esi // source end ptr = count * source byte stride + source ptr + + mov edi, destinationBuffer + + mov edx, 2 // sizeof int16 + mov ebx, destinationStride + imul ebx, edx // destination byte stride + + fwait + fstcw savedFpuControlWord + fldcw fpuControlWord_ + + fld ditheredInt16Scaler_ // stack: int scaler + + Float32_To_Int16_DitherClip_loop: + + mov edx, dword ptr [esi] // load floating point value into integer register + + and edx, 0x7FFFFFFF // mask off sign + cmp edx, 0x3F800000 // greater than 1.0 or less than -1.0 + + jg Float32_To_Int16_DitherClip_clamp + + // load unscaled value into st(0) + fld dword ptr [esi] // stack: value, int scaler + add esi, eax // increment source ptr + //lea esi, [esi+eax] + fmul st(0), st(1) // st(0) *= st(1), stack: value*(int scaler), int scaler + + /* + // call PaUtil_GenerateFloatTriangularDither with C calling convention + mov sourceByteStride, eax // save eax + mov sourceEnd, ecx // save ecx + push ditherGenerator // pass ditherGenerator parameter on stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack + mov ecx, sourceEnd // restore ecx + mov eax, sourceByteStride // restore eax + */ + + // generate dither + mov sourceByteStride, eax // save eax + mov edx, 196314165 + mov eax, ditherRandSeed1 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov ditherRandSeed1, eax + mov edx, 196314165 + mov eax, ditherRandSeed2 + mul edx // eax:edx = eax * 196314165 + //add eax, 907633515 + lea eax, [eax+907633515] + mov edx, ditherRandSeed1 + shr edx, PA_DITHER_SHIFT_ + mov ditherRandSeed2, eax + shr eax, PA_DITHER_SHIFT_ + //add eax, edx // eax -> current + lea eax, [eax+edx] // current = randSeed1>>x + randSeed2>>x + mov edx, ditherPrevious + neg edx + lea edx, [eax+edx] // highpass = current - previous + mov highpassedDither, edx + mov ditherPrevious, eax // previous = current + mov eax, sourceByteStride // restore eax + fild highpassedDither + fmul const_float_dither_scale_ + // end generate dither, dither signal in st(0) + + faddp st(1), st(0) // stack: dither * value*(int scaler), int scaler + fistp word ptr [edi] // store scaled int into dest, stack: int scaler + jmp Float32_To_Int16_DitherClip_stored + + Float32_To_Int16_DitherClip_clamp: + mov edx, dword ptr [esi] // load floating point value into integer register + shr edx, 31 // move sign bit into bit 0 + add esi, eax // increment source ptr + //lea esi, [esi+eax] + add dx, 0x7FFF // convert to maximum range integers + mov word ptr [edi], dx // store clamped into into dest + + Float32_To_Int16_DitherClip_stored: + + add edi, ebx // increment destination ptr + //lea edi, [edi+ebx] + + cmp esi, ecx // has src ptr reached end? + jne Float32_To_Int16_DitherClip_loop + + ffree st(0) + fincstp + + fwait + fnclex + fldcw savedFpuControlWord + } + + ditherGenerator->previous = ditherPrevious; + ditherGenerator->randSeed1 = ditherRandSeed1; + ditherGenerator->randSeed2 = ditherRandSeed2; +} + +/* -------------------------------------------------------------------------- */ + +void PaUtil_InitializeX86PlainConverters( void ) +{ + paConverters.Float32_To_Int32 = Float32_To_Int32; + paConverters.Float32_To_Int32_Clip = Float32_To_Int32_Clip; + paConverters.Float32_To_Int32_DitherClip = Float32_To_Int32_DitherClip; + + paConverters.Float32_To_Int24 = Float32_To_Int24; + paConverters.Float32_To_Int24_Clip = Float32_To_Int24_Clip; + paConverters.Float32_To_Int24_DitherClip = Float32_To_Int24_DitherClip; + + paConverters.Float32_To_Int16 = Float32_To_Int16; + paConverters.Float32_To_Int16_Clip = Float32_To_Int16_Clip; + paConverters.Float32_To_Int16_DitherClip = Float32_To_Int16_DitherClip; +} + +#endif + +/* -------------------------------------------------------------------------- */ diff --git a/Externals/portaudio/src/os/win/pa_x86_plain_converters.h b/Externals/portaudio/src/os/win/pa_x86_plain_converters.h new file mode 100644 index 0000000000..1623115d6b --- /dev/null +++ b/Externals/portaudio/src/os/win/pa_x86_plain_converters.h @@ -0,0 +1,60 @@ +/* + * Plain Intel IA32 assembly implementations of PortAudio sample converter functions. + * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/** @file + @ingroup win_src +*/ + +#ifndef PA_X86_PLAIN_CONVERTERS_H +#define PA_X86_PLAIN_CONVERTERS_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** + @brief Install optimized converter functions suitable for all IA32 processors + + It is recommended to call PaUtil_InitializeX86PlainConverters prior to calling Pa_Initialize +*/ +void PaUtil_InitializeX86PlainConverters( void ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_X86_PLAIN_CONVERTERS_H */ diff --git a/Externals/portaudio/x64/Debug/portaudio.lib b/Externals/portaudio/x64/Debug/portaudio.lib deleted file mode 100644 index a092624370..0000000000 Binary files a/Externals/portaudio/x64/Debug/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/x64/Debug/portaudio.pdb b/Externals/portaudio/x64/Debug/portaudio.pdb deleted file mode 100644 index fd5cd214b4..0000000000 Binary files a/Externals/portaudio/x64/Debug/portaudio.pdb and /dev/null differ diff --git a/Externals/portaudio/x64/DebugFast/portaudio.lib b/Externals/portaudio/x64/DebugFast/portaudio.lib deleted file mode 100644 index 3029595193..0000000000 Binary files a/Externals/portaudio/x64/DebugFast/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/x64/DebugFast/portaudio.pdb b/Externals/portaudio/x64/DebugFast/portaudio.pdb deleted file mode 100644 index 3642ec683a..0000000000 Binary files a/Externals/portaudio/x64/DebugFast/portaudio.pdb and /dev/null differ diff --git a/Externals/portaudio/x64/Release/portaudio.lib b/Externals/portaudio/x64/Release/portaudio.lib deleted file mode 100644 index 3029595193..0000000000 Binary files a/Externals/portaudio/x64/Release/portaudio.lib and /dev/null differ diff --git a/Externals/portaudio/x64/Release/portaudio.pdb b/Externals/portaudio/x64/Release/portaudio.pdb deleted file mode 100644 index 3642ec683a..0000000000 Binary files a/Externals/portaudio/x64/Release/portaudio.pdb and /dev/null differ diff --git a/Externals/soundtouch/SoundTouch.vcxproj b/Externals/soundtouch/SoundTouch.vcxproj index 763b00a58a..d9e9968d4f 100644 --- a/Externals/soundtouch/SoundTouch.vcxproj +++ b/Externals/soundtouch/SoundTouch.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -19,319 +19,40 @@ - {68A5DD20-7057-448B-8FE0-B6AC8D205509} - - + {EC082900-B4D8-42E9-9663-77F02F6936AE} - + StaticLibrary - false - MultiByte + v120 + Unicode - - StaticLibrary - false - MultiByte + + true - - StaticLibrary - false - MultiByte - - - StaticLibrary - false - MultiByte + + false - - - - - - - - - - + + - - <_ProjectFileVersion>10.0.40219.1 - Release\ - Release\ - Release\ - Release\ - Debug\ - Debug\ - Debug\ - Debug\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Full - AnySuitable - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Release/SoundTouch.pch - Release/ - Release/ - Release/ - Level3 - true - - - Default - - - Win32\SoundTouch.lib - true - - - - - - - NDEBUG;%(PreprocessorDefinitions) - 0x040b - - - - - Full - AnySuitable - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Release/SoundTouch.pch - Release/ - Release/ - Release/ - Level3 - true - - - Default - StreamingSIMDExtensions2 - - - Win64\SoundTouch.lib - true - - - - - - - NDEBUG;%(PreprocessorDefinitions) - 0x040b - - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Debug/SoundTouch.pch - Debug/ - Debug/ - Debug/ - true - Level3 - true - EditAndContinue - Default - - - Win32\SoundTouchD.lib - true - - - - - - - _DEBUG;%(PreprocessorDefinitions) - 0x040b - - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Debug/SoundTouch.pch - Debug/ - Debug/ - Debug/ - true - Level3 - true - ProgramDatabase - Default - - - Win64\SoundTouchD.lib - true - - - - - - - _DEBUG;%(PreprocessorDefinitions) - 0x040b - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - true - true - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - + + + + + + + + + @@ -346,6 +67,9 @@ + + + diff --git a/Externals/soundtouch/SoundTouch.vcxproj.filters b/Externals/soundtouch/SoundTouch.vcxproj.filters deleted file mode 100644 index 1dee5b2a6e..0000000000 --- a/Externals/soundtouch/SoundTouch.vcxproj.filters +++ /dev/null @@ -1,60 +0,0 @@ - - - - - {b7786182-6345-4203-8b48-39eec5ec85dc} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {75380bb9-1e58-4186-a9cd-ec7cd284e6a5} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\bpm - - - Source Files\bpm - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Externals/soundtouch/cpu_detect_x86.cpp b/Externals/soundtouch/cpu_detect_x86.cpp index dff64d0b14..1849497560 100644 --- a/Externals/soundtouch/cpu_detect_x86.cpp +++ b/Externals/soundtouch/cpu_detect_x86.cpp @@ -50,6 +50,9 @@ #elif defined(_M_IX86) // windows non-gcc #include + #endif + #ifndef bit_MMX + #define bit_MMX (1 << 23) #define bit_MMX (1 << 23) #define bit_SSE (1 << 25) #define bit_SSE2 (1 << 26) diff --git a/Externals/wxWidgets3/CMakeLists.txt b/Externals/wxWidgets3/CMakeLists.txt index 5b9891bb11..6629d0865e 100644 --- a/Externals/wxWidgets3/CMakeLists.txt +++ b/Externals/wxWidgets3/CMakeLists.txt @@ -1,4 +1,4 @@ -# gtk, msw, osx and shared files as of r70933 +# gtk, msw, osx and shared files as of r74856 set(SRCS_AUI "src/aui/auibar.cpp" @@ -6,6 +6,7 @@ set(SRCS_AUI "src/aui/dockart.cpp" "src/aui/floatpane.cpp" "src/aui/framemanager.cpp" + "src/aui/tabart.cpp" "src/aui/tabmdi.cpp") set(SRCS_COMMON @@ -151,6 +152,7 @@ set(SRCS_COMMON #"src/common/memory.cpp" "src/common/menucmn.cpp" "src/common/mimecmn.cpp" + "src/common/modalhook.cpp" "src/common/module.cpp" "src/common/mousemanager.cpp" "src/common/msgout.cpp" @@ -168,6 +170,7 @@ set(SRCS_COMMON "src/common/platinfo.cpp" "src/common/popupcmn.cpp" "src/common/powercmn.cpp" + "src/common/preferencescmn.cpp" "src/common/prntbase.cpp" "src/common/process.cpp" "src/common/protocol.cpp" @@ -216,6 +219,8 @@ set(SRCS_COMMON "src/common/textcmn.cpp" "src/common/textentrycmn.cpp" "src/common/textfile.cpp" + "src/common/textmeasurecmn.cpp" + "src/common/threadinfo.cpp" "src/common/time.cpp" "src/common/timercmn.cpp" "src/common/timerimpl.cpp" @@ -236,6 +241,7 @@ set(SRCS_COMMON "src/common/valtext.cpp" "src/common/variant.cpp" #"src/common/webview.cpp" + #"src/common/webviewfshandler.cpp" "src/common/wfstream.cpp" "src/common/wincmn.cpp" "src/common/windowid.cpp" @@ -317,6 +323,7 @@ set(SRCS_GENERIC "src/generic/statusbr.cpp" "src/generic/tabg.cpp" "src/generic/textdlgg.cpp" + "src/generic/textmeasure.cpp" "src/generic/timectrlg.cpp" #"src/generic/timer.cpp" "src/generic/tipdlg.cpp" @@ -333,7 +340,8 @@ set(SRCS_GENERICGTK "src/generic/accel.cpp" "src/generic/icon.cpp" "src/generic/imaglist.cpp" - "src/generic/paletteg.cpp") + "src/generic/paletteg.cpp" + "src/generic/preferencesg.cpp") set(SRCS_GENERICOSX "src/generic/animateg.cpp" @@ -345,6 +353,7 @@ set(SRCS_GENERICOSX "src/generic/fontpickerg.cpp") set(SRCS_GTK + "src/aui/tabartgtk.cpp" "src/gtk/aboutdlg.cpp" "src/gtk/animate.cpp" "src/gtk/anybutton.cpp" @@ -403,6 +412,7 @@ set(SRCS_GTK "src/gtk/nativewin.cpp" "src/gtk/nonownedwnd.cpp" "src/gtk/notebook.cpp" + "src/gtk/notifmsg.cpp" "src/gtk/pen.cpp" "src/gtk/popupwin.cpp" #"src/gtk/print.cpp" @@ -425,6 +435,7 @@ set(SRCS_GTK "src/gtk/taskbar.cpp" "src/gtk/textctrl.cpp" "src/gtk/textentry.cpp" + "src/gtk/textmeasure.cpp" "src/gtk/tglbtn.cpp" "src/gtk/timer.cpp" "src/gtk/toolbar.cpp" @@ -483,6 +494,7 @@ set(SRCS_MSW "src/msw/dragimag.cpp" "src/msw/enhmeta.cpp" "src/msw/evtloop.cpp" + #"src/msw/evtloopconsole.cpp" "src/msw/fdrepdlg.cpp" "src/msw/filedlg.cpp" "src/msw/font.cpp" @@ -533,6 +545,7 @@ set(SRCS_MSW "src/msw/ole/dropsrc.cpp" "src/msw/ole/droptgt.cpp" "src/msw/ole/oleutils.cpp" + "src/msw/ole/safearray.cpp" "src/msw/ole/uuid.cpp" "src/msw/ownerdrw.cpp" "src/msw/palette.cpp" @@ -559,7 +572,7 @@ set(SRCS_MSW "src/msw/sound.cpp" "src/msw/spinbutt.cpp" "src/msw/spinctrl.cpp" - #"src/msw/stackwalk.cpp" + "src/msw/stackwalk.cpp" "src/msw/statbmp.cpp" "src/msw/statbox.cpp" "src/msw/statline.cpp" @@ -569,6 +582,7 @@ set(SRCS_MSW "src/msw/taskbar.cpp" "src/msw/textctrl.cpp" "src/msw/textentry.cpp" + "src/msw/textmeasure.cpp" "src/msw/tglbtn.cpp" "src/msw/thread.cpp" "src/msw/timectrl.cpp" @@ -582,6 +596,7 @@ set(SRCS_MSW "src/msw/utils.cpp" "src/msw/utilsexc.cpp" "src/msw/utilsgui.cpp" + "src/msw/utilswin.cpp" "src/msw/uxtheme.cpp" "src/msw/version.rc" "src/msw/volume.cpp" @@ -635,7 +650,6 @@ set(SRCS_OSX "src/osx/slider_osx.cpp" "src/osx/sound_osx.cpp" "src/osx/spinbutt_osx.cpp" - "src/osx/spinctrl_osx.cpp" "src/osx/srchctrl_osx.cpp" "src/osx/statbox_osx.cpp" "src/osx/statline_osx.cpp" @@ -816,11 +830,12 @@ set(SRCS_UNIX #"src/unix/net.cpp" "src/unix/snglinst.cpp" "src/unix/sockunix.cpp" - #"src/unix/stackwalk.cpp" + "src/unix/stackwalk.cpp" "src/unix/stdpaths.cpp" "src/unix/threadpsx.cpp" "src/unix/timerunx.cpp" - "src/unix/utilsunx.cpp") + "src/unix/utilsunx.cpp" + "src/unix/wakeuppipe.cpp") set(SRCS_UNIXGTK "src/unix/dialup.cpp" @@ -853,8 +868,6 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ${SRCS_GENERICOSX} ${SRCS_OSX} ${SRCS_UNIX}) - include_directories(../libpng) - add_subdirectory(../libpng ../libpng) set(LIBS png iconv @@ -890,6 +903,10 @@ endif() add_definitions(-DWXBUILDING) add_definitions(-Wno-deprecated-declarations) add_definitions(-Wno-shadow) +add_definitions(-Wno-parentheses-equality) +add_definitions(-Wno-self-assign) +add_definitions(-Wno-null-conversion) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98") enable_precompiled_headers(include/wx/wxprec.h src/common/dummy.cpp SRCS) add_library(wx STATIC ${PNG_SRCS} ${SRCS}) diff --git a/Externals/wxWidgets3/art/addbookm.xpm b/Externals/wxWidgets3/art/addbookm.xpm index 0b4f695c2c..fb13ff161d 100644 --- a/Externals/wxWidgets3/art/addbookm.xpm +++ b/Externals/wxWidgets3/art/addbookm.xpm @@ -1,24 +1,24 @@ -/* XPM */ -static const char *const addbookm_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 3 1", -". c Black", -"X c #00C000", -" c None", -/* pixels */ -" ....... ", -" .XXXXX. ", -" .. .XXXXX. ", -" .. .XXXXX. ", -" ...... .XXXXX. ", -" ...... .XXXXX. ", -" .. .XXXXX. ", -" .. .XXXXX. ", -" .XXXXX. ", -" .XXXXX. ", -" .XXXXX. ", -" .XXXXX. ", -" .XX.XX. ", -" .X. .X. ", -" .. .. " -}; +/* XPM */ +static const char *const addbookm_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 3 1", +". c Black", +"X c #00C000", +" c None", +/* pixels */ +" ....... ", +" .XXXXX. ", +" .. .XXXXX. ", +" .. .XXXXX. ", +" ...... .XXXXX. ", +" ...... .XXXXX. ", +" .. .XXXXX. ", +" .. .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XX.XX. ", +" .X. .X. ", +" .. .. " +}; diff --git a/Externals/wxWidgets3/art/back.xpm b/Externals/wxWidgets3/art/back.xpm index d5c1de519d..38b0f4b7dd 100644 --- a/Externals/wxWidgets3/art/back.xpm +++ b/Externals/wxWidgets3/art/back.xpm @@ -1,21 +1,21 @@ -/* XPM */ -static const char *const back_xpm[] = { -"16 15 3 1", -" c None", -". c Black", -"X c Gray100", -" ", -" ", -" . ", -" .. ", -" .X. ", -" .XX........ ", -" .XXXXXXXXXX. ", -" .XXXXXXXXXXX. ", -" .XXXXXXXXXXX. ", -" .XXXXXXXXXX. ", -" .XX........ ", -" .X. ", -" .. ", -" . ", -" "}; +/* XPM */ +static const char *const back_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ", +" . ", +" .. ", +" .X. ", +" .XX........ ", +" .XXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXX. ", +" .XX........ ", +" .X. ", +" .. ", +" . ", +" "}; diff --git a/Externals/wxWidgets3/art/cdrom.xpm b/Externals/wxWidgets3/art/cdrom.xpm index e3bc19b96b..fecc52ec74 100644 --- a/Externals/wxWidgets3/art/cdrom.xpm +++ b/Externals/wxWidgets3/art/cdrom.xpm @@ -1,57 +1,57 @@ -/* XPM */ -static const char *const cdrom_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 36 1", -"= c #9BACC2", -"y c #547B99", -"$ c #FFFFFF", -"@ c #839CB5", -"o c #547897", -"4 c #4D7492", -"% c #F1F4F7", -"X c #5A809C", -"< c #8497A5", -"0 c #7898AD", -"+ c #CAD2DC", -"r c #ACAEB2", -"2 c #BECAD9", -"* c #65839D", -"e c #DCE2EA", -"- c #ADBED2", -"t c #597B9A", -" c None", -"1 c #467291", -"9 c #D6DFE7", -"O c #7393AB", -"u c #49708B", -"5 c #A0BACB", -"& c #AABFCD", -"8 c #B9CBD5", -"; c #B4C4D3", -": c #6F90A6", -"3 c #A8B6CA", -"# c #ADBACE", -"w c #E4E9ED", -". c #8EA9BC", -"> c #B3BFD1", -", c #C2CBDB", -"6 c #C0D1DC", -"7 c #A2B3C5", -"q c #5D7C93", -/* pixels */ -" .XooOo+ ", -" X@#$$$%o& ", -" *=-;$$$$$o+ ", -" +O#;-$$$$$$: ", -" o=>,-<1<$2-o ", -" o3>--1$122-* ", -" o=--$<4<22-X ", -" o5$$$$$26;7* ", -" X%$$$$2;-X8 ", -" 90*9$$$-7Xqo ", -" wXwe@O44X422222<<*4", -" ttyyyoo4441uuuo", -" t>$$$$$$$$$$$>o", -" XXXtyyyoo44411u" -}; +/* XPM */ +static const char *const cdrom_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 36 1", +"= c #9BACC2", +"y c #547B99", +"$ c #FFFFFF", +"@ c #839CB5", +"o c #547897", +"4 c #4D7492", +"% c #F1F4F7", +"X c #5A809C", +"< c #8497A5", +"0 c #7898AD", +"+ c #CAD2DC", +"r c #ACAEB2", +"2 c #BECAD9", +"* c #65839D", +"e c #DCE2EA", +"- c #ADBED2", +"t c #597B9A", +" c None", +"1 c #467291", +"9 c #D6DFE7", +"O c #7393AB", +"u c #49708B", +"5 c #A0BACB", +"& c #AABFCD", +"8 c #B9CBD5", +"; c #B4C4D3", +": c #6F90A6", +"3 c #A8B6CA", +"# c #ADBACE", +"w c #E4E9ED", +". c #8EA9BC", +"> c #B3BFD1", +", c #C2CBDB", +"6 c #C0D1DC", +"7 c #A2B3C5", +"q c #5D7C93", +/* pixels */ +" .XooOo+ ", +" X@#$$$%o& ", +" *=-;$$$$$o+ ", +" +O#;-$$$$$$: ", +" o=>,-<1<$2-o ", +" o3>--1$122-* ", +" o=--$<4<22-X ", +" o5$$$$$26;7* ", +" X%$$$$2;-X8 ", +" 90*9$$$-7Xqo ", +" wXwe@O44X422222<<*4", +" ttyyyoo4441uuuo", +" t>$$$$$$$$$$$>o", +" XXXtyyyoo44411u" +}; diff --git a/Externals/wxWidgets3/art/copy.xpm b/Externals/wxWidgets3/art/copy.xpm index f393cd23e6..9143caa9b2 100644 --- a/Externals/wxWidgets3/art/copy.xpm +++ b/Externals/wxWidgets3/art/copy.xpm @@ -1,44 +1,44 @@ -/* XPM */ -static const char *const copy_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 23 1", -"o c #97C4E7", -"* c #FFFFFF", -"@ c #60A9DA", -"= c #D1E5F5", -"& c #C3DDF1", -". c #7EA6C0", -" c None", -"X c #2F93CD", -"O c #85BBE2", -", c #EFF6FC", -"; c #DEEDF8", -"+ c #72B2DD", -"3 c #F7FBFD", -"4 c #FAFCFE", -": c #DAEAF7", -"< c #E9F3FA", -"1 c #E2EFF8", -"- c #FDFDFE", -"% c #B6D5EE", -"$ c #A5CCEA", -"> c #E5F0F9", -"# c #AFD1EC", -"2 c #F4F9FD", -/* pixels */ -" .....XX ", -" .oO+@X#X ", -" .$oO+X##X ", -" .%$o........ ", -" .&%$.*=&#o.-. ", -" .=&%.*;=&#.--. ", -" .:=&.*>;=&.... ", -" .>:=.*,>;=&#o. ", -" .<1:.*2,>:=&#. ", -" .2<1.*32,>:=&. ", -" .32<.*432,>:=. ", -" .32<.*-432,>:. ", -" .....**-432,>. ", -" .***-432,. ", -" .......... " -}; +/* XPM */ +static const char *const copy_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 23 1", +"o c #97C4E7", +"* c #FFFFFF", +"@ c #60A9DA", +"= c #D1E5F5", +"& c #C3DDF1", +". c #7EA6C0", +" c None", +"X c #2F93CD", +"O c #85BBE2", +", c #EFF6FC", +"; c #DEEDF8", +"+ c #72B2DD", +"3 c #F7FBFD", +"4 c #FAFCFE", +": c #DAEAF7", +"< c #E9F3FA", +"1 c #E2EFF8", +"- c #FDFDFE", +"% c #B6D5EE", +"$ c #A5CCEA", +"> c #E5F0F9", +"# c #AFD1EC", +"2 c #F4F9FD", +/* pixels */ +" .....XX ", +" .oO+@X#X ", +" .$oO+X##X ", +" .%$o........ ", +" .&%$.*=&#o.-. ", +" .=&%.*;=&#.--. ", +" .:=&.*>;=&.... ", +" .>:=.*,>;=&#o. ", +" .<1:.*2,>:=&#. ", +" .2<1.*32,>:=&. ", +" .32<.*432,>:=. ", +" .32<.*-432,>:. ", +" .....**-432,>. ", +" .***-432,. ", +" .......... " +}; diff --git a/Externals/wxWidgets3/art/cross.xpm b/Externals/wxWidgets3/art/cross.xpm index 407fa9bfa1..20ab3f3466 100644 --- a/Externals/wxWidgets3/art/cross.xpm +++ b/Externals/wxWidgets3/art/cross.xpm @@ -1,17 +1,17 @@ -/* XPM */ -static const char *const cross_xpm[] = { -/* columns rows colors chars-per-pixel */ -"10 10 2 1", -" c Gray0", -"# c None", -/* pixels */ -" ######## ", -" #### ", -"# ## #", -"## ##", -"### ###", -"### ###", -"## ##", -"# ## #", -" #### ", -" ###### "}; +/* XPM */ +static const char *const cross_xpm[] = { +/* columns rows colors chars-per-pixel */ +"10 10 2 1", +" c Gray0", +"# c None", +/* pixels */ +" ######## ", +" #### ", +"# ## #", +"## ##", +"### ###", +"### ###", +"## ##", +"# ## #", +" #### ", +" ###### "}; diff --git a/Externals/wxWidgets3/art/cut.xpm b/Externals/wxWidgets3/art/cut.xpm index e638157f59..eacd7f94b3 100644 --- a/Externals/wxWidgets3/art/cut.xpm +++ b/Externals/wxWidgets3/art/cut.xpm @@ -1,46 +1,46 @@ -/* XPM */ -static const char *const cut_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 25 1", -"6 c #D8BDC0", -": c #C3C3C4", -"- c #FFFFFF", -". c #6C6D70", -"2 c #AD3A45", -"o c #DBDBDB", -"# c #939495", -"< c #E42234", -"& c #C3C5C8", -"; c #C6CCD3", -"% c #B7B7B8", -" c None", -"* c #DFE0E2", -"5 c #B69596", -"3 c #9C2A35", -"1 c #CFCFD0", -", c #AB5C64", -"+ c #D2D3D4", -"$ c #BCBDBE", -"@ c #C6C8CA", -"> c #CDC0C1", -"O c #826F72", -"X c #979BA0", -"4 c #9B8687", -"= c #9FA0A0", -/* pixels */ -" .X .o ", -" O.+ @. ", -" O. .. ", -" O#$ %.& ", -" O.*.. ", -" #%#.. ", -" O=-.. ", -" #%#;. ", -" OO:=O ", -" >,,<, ,<,,1 ", -" ><23<1 1<32<1 ", -" ,2 4< <5 2, ", -" <, ,2 2, ,< ", -" 23,<5 5<,32 ", -" 6225 522> " -}; +/* XPM */ +static const char *const cut_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 25 1", +"6 c #D8BDC0", +": c #C3C3C4", +"- c #FFFFFF", +". c #6C6D70", +"2 c #AD3A45", +"o c #DBDBDB", +"# c #939495", +"< c #E42234", +"& c #C3C5C8", +"; c #C6CCD3", +"% c #B7B7B8", +" c None", +"* c #DFE0E2", +"5 c #B69596", +"3 c #9C2A35", +"1 c #CFCFD0", +", c #AB5C64", +"+ c #D2D3D4", +"$ c #BCBDBE", +"@ c #C6C8CA", +"> c #CDC0C1", +"O c #826F72", +"X c #979BA0", +"4 c #9B8687", +"= c #9FA0A0", +/* pixels */ +" .X .o ", +" O.+ @. ", +" O. .. ", +" O#$ %.& ", +" O.*.. ", +" #%#.. ", +" O=-.. ", +" #%#;. ", +" OO:=O ", +" >,,<, ,<,,1 ", +" ><23<1 1<32<1 ", +" ,2 4< <5 2, ", +" <, ,2 2, ,< ", +" 23,<5 5<,32 ", +" 6225 522> " +}; diff --git a/Externals/wxWidgets3/art/deffile.xpm b/Externals/wxWidgets3/art/deffile.xpm index d7546a53f4..182fbe4180 100644 --- a/Externals/wxWidgets3/art/deffile.xpm +++ b/Externals/wxWidgets3/art/deffile.xpm @@ -1,54 +1,54 @@ -/* XPM */ -static const char *const deffile_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 32 1", -"= c #97C4E7", -": c #72A8D2", -"1 c #FFFFFF", -"w c #839CB5", -"X c #6B98B8", -". c #5A89A6", -"@ c #3A749C", -", c #D1E5F5", -"< c #67A1CF", -"> c #F1F4F7", -"e c #85A7BC", -"% c #C3DDF1", -"0 c #749BB4", -"2 c #7EA6C0", -"; c #5F9BC8", -" c None", -"O c #538DB3", -"- c #85BBE2", -"$ c #D6DFE7", -"9 c #EFF6FC", -"o c #6591AE", -"4 c #F7FBFD", -"8 c #FAFCFE", -"6 c #DAEAF7", -"7 c #E9F3FA", -"q c #FDFDFE", -"3 c #E2EFF8", -"# c #8EA9BC", -"& c #B6D5EE", -"* c #A5CCEA", -"5 c #F4F9FD", -"+ c #4581AA", -/* pixels */ -" ..XooO+@#$ ", -" .%%&*=-;:;> ", -" .,,%&*=<1=X> ", -" #%%%%&*211=X ", -" #3----- c #F1F4F7", +"e c #85A7BC", +"% c #C3DDF1", +"0 c #749BB4", +"2 c #7EA6C0", +"; c #5F9BC8", +" c None", +"O c #538DB3", +"- c #85BBE2", +"$ c #D6DFE7", +"9 c #EFF6FC", +"o c #6591AE", +"4 c #F7FBFD", +"8 c #FAFCFE", +"6 c #DAEAF7", +"7 c #E9F3FA", +"q c #FDFDFE", +"3 c #E2EFF8", +"# c #8EA9BC", +"& c #B6D5EE", +"* c #A5CCEA", +"5 c #F4F9FD", +"+ c #4581AA", +/* pixels */ +" ..XooO+@#$ ", +" .%%&*=-;:;> ", +" .,,%&*=<1=X> ", +" #%%%%&*211=X ", +" #3----- c #5A7BB4", -"% c #5F7FB5", -/* pixels */ -" ", -" .Xo OO ", -" +@#. $@% ", -" &@@X .*@*o ", -" =@= .*@*. ", -" -@@X*@*. ", -" .#@@@$. ", -" ;@@: ", -" ;@@@+ ", -" .>@#%@@. ", -" o*@*oO@@, ", -" <#@*. .@@= ", -"&@@$ :@@1 ", -";#& 2#>. ", -" " -}; +/* XPM */ +static const char *const delete_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 21 1", +"2 c #A5AEBD", +"* c #5478B4", +"< c #95A3BB", +"O c #9AA7BC", +"; c #758EB7", +"$ c #6986B6", +"# c #4971B2", +"& c #8A9CBA", +"X c #8598B9", +" c None", +"o c #ABB2BE", +"- c #7F95B9", +"= c #4E74B3", +"1 c #A0ABBC", +"+ c #6F8AB7", +". c #B5B9BF", +"@ c #3E69B1", +", c #90A0BA", +": c #6483B5", +"> c #5A7BB4", +"% c #5F7FB5", +/* pixels */ +" ", +" .Xo OO ", +" +@#. $@% ", +" &@@X .*@*o ", +" =@= .*@*. ", +" -@@X*@*. ", +" .#@@@$. ", +" ;@@: ", +" ;@@@+ ", +" .>@#%@@. ", +" o*@*oO@@, ", +" <#@*. .@@= ", +"&@@$ :@@1 ", +";#& 2#>. ", +" " +}; diff --git a/Externals/wxWidgets3/art/dir_up.xpm b/Externals/wxWidgets3/art/dir_up.xpm index dd85ff25cd..f644d93e6d 100644 --- a/Externals/wxWidgets3/art/dir_up.xpm +++ b/Externals/wxWidgets3/art/dir_up.xpm @@ -1,52 +1,52 @@ -/* XPM */ -static const char *const dir_up_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 31 1", -"6 c #9BACC2", -"o c #9AEA53", -"7 c #94A5BD", -"8 c #547897", -"5 c #839CB5", -"@ c #376485", -"$ c #5A809C", -"# c #7F99B4", -": c #D1D9E5", -"< c #EAEDF3", -"& c #446A8C", -"q c #65839D", -"> c #DCE2EA", -", c #E1E6EE", -"2 c #F5F6F7", -"O c #8DA0B9", -" c None", -"% c #467291", -". c #305F81", -"X c #7393AB", -"+ c #6A89A2", -"4 c #A8B6CA", -"1 c #EEF1F3", -"3 c #F8F9FA", -"0 c #215579", -"9 c #7F97B0", -"* c #B3BFD1", -"w c #7A90AC", -"- c #C2CBDB", -"; c #CAD6E1", -"= c #BBC4D6", -/* pixels */ -" .. ", -" X.o. ", -".... X.ooo. ", -".OO+....ooooo. ", -".OOOOOO@@ooo.. ", -".OOOO#OO@ooo.$ ", -".OOOOOOO@ooo.$ ", -".O%............&", -".O&*=-;:>,<1231.", -".+.4*=-;:>,<12$.", -"..564*=-;:>,<1. ", -".@O764*=-;:>,<. ", -".89O764*=-;:>$$ ", -"0qw9O764*=-;:. ", -"0............. " -}; +/* XPM */ +static const char *const dir_up_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 31 1", +"6 c #9BACC2", +"o c #9AEA53", +"7 c #94A5BD", +"8 c #547897", +"5 c #839CB5", +"@ c #376485", +"$ c #5A809C", +"# c #7F99B4", +": c #D1D9E5", +"< c #EAEDF3", +"& c #446A8C", +"q c #65839D", +"> c #DCE2EA", +", c #E1E6EE", +"2 c #F5F6F7", +"O c #8DA0B9", +" c None", +"% c #467291", +". c #305F81", +"X c #7393AB", +"+ c #6A89A2", +"4 c #A8B6CA", +"1 c #EEF1F3", +"3 c #F8F9FA", +"0 c #215579", +"9 c #7F97B0", +"* c #B3BFD1", +"w c #7A90AC", +"- c #C2CBDB", +"; c #CAD6E1", +"= c #BBC4D6", +/* pixels */ +" .. ", +" X.o. ", +".... X.ooo. ", +".OO+....ooooo. ", +".OOOOOO@@ooo.. ", +".OOOO#OO@ooo.$ ", +".OOOOOOO@ooo.$ ", +".O%............&", +".O&*=-;:>,<1231.", +".+.4*=-;:>,<12$.", +"..564*=-;:>,<1. ", +".@O764*=-;:>,<. ", +".89O764*=-;:>$$ ", +"0qw9O764*=-;:. ", +"0............. " +}; diff --git a/Externals/wxWidgets3/art/down.xpm b/Externals/wxWidgets3/art/down.xpm index 5a0e4c98fb..88b0a9fdc9 100644 --- a/Externals/wxWidgets3/art/down.xpm +++ b/Externals/wxWidgets3/art/down.xpm @@ -1,21 +1,21 @@ -/* XPM */ -static const char *const down_xpm[] = { -"16 15 3 1", -" c None", -". c Black", -"X c Gray100", -" ", -" ...... ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" ....XXXX.... ", -" .XXXXXXXX. ", -" .XXXXXX. ", -" .XXXX. ", -" .XX. ", -" .. ", -" "}; +/* XPM */ +static const char *const down_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ...... ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" ....XXXX.... ", +" .XXXXXXXX. ", +" .XXXXXX. ", +" .XXXX. ", +" .XX. ", +" .. ", +" "}; diff --git a/Externals/wxWidgets3/art/exefile.xpm b/Externals/wxWidgets3/art/exefile.xpm index 54a5e49c33..f814a597e8 100644 --- a/Externals/wxWidgets3/art/exefile.xpm +++ b/Externals/wxWidgets3/art/exefile.xpm @@ -1,73 +1,73 @@ -/* XPM */ -static const char *const exefile_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 51 1", -"% c #E8E8EC", -"= c #E8E8ED", -"z c #CACAD4", -"8 c #D9D9E1", -"p c #D2D2DA", -"u c #E1E1E7", -"a c #D2D2DB", -"< c #E9E9ED", -"q c #DADAE1", -"+ c #F1F1F4", -"g c #D3D3DB", -"1 c #E2E2E8", -"x c #D3D3DC", -"5 c #00A5FF", -"$ c #EAEAEE", -"4 c #DBDBE2", -"h c #CCCCD6", -"y c #D4D4DC", -"r c #E3E3E9", -"d c #D4D4DD", -"7 c #DCDCE2", -": c #EBEBEF", -"0 c #DCDCE3", -" c None", -"O c #F3F3F5", -"> c #E4E4E9", -"& c #F3F3F6", -"j c #D5D5DD", -"6 c #E4E4EA", -". c #C6C6D5", -"# c #ECECF0", -"f c #CECED7", -"l c #CECED8", -"e c #D6D6DE", -"; c #EDEDF0", -"3 c #DEDEE4", -", c #EDEDF1", -"c c #CFCFD8", -"o c #F5F5F7", -"- c #E6E6EB", -"w c #D7D7DF", -"v c #C8C8D3", -"i c #DFDFE5", -"@ c #EEEEF2", -"s c #D0D0D9", -"X c #9494AD", -"9 c #D8D8DF", -"t c #D8D8E0", -"* c #EFEFF2", -"2 c #E0E0E6", -"k c #D1D1DA", -/* pixels */ -" ........X ", -" .oO+@#$%XX ", -" .&+*#$=-XXX ", -" .+*;:=->XXXX ", -" .*,:<->1234X ", -" .,5:5612378X ", -" 5,5559530qwX ", -" 55555550q9eX ", -" 5555r5555teyX ", -" 55rui559eypX ", -" 5555i5555yasX ", -" 5555555dasfX ", -" 5355595gsfhX ", -" .3595jgklhzX ", -" .0qwjxkchzvX ", -" XXXXXXXXXXXX " -}; +/* XPM */ +static const char *const exefile_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 51 1", +"% c #E8E8EC", +"= c #E8E8ED", +"z c #CACAD4", +"8 c #D9D9E1", +"p c #D2D2DA", +"u c #E1E1E7", +"a c #D2D2DB", +"< c #E9E9ED", +"q c #DADAE1", +"+ c #F1F1F4", +"g c #D3D3DB", +"1 c #E2E2E8", +"x c #D3D3DC", +"5 c #00A5FF", +"$ c #EAEAEE", +"4 c #DBDBE2", +"h c #CCCCD6", +"y c #D4D4DC", +"r c #E3E3E9", +"d c #D4D4DD", +"7 c #DCDCE2", +": c #EBEBEF", +"0 c #DCDCE3", +" c None", +"O c #F3F3F5", +"> c #E4E4E9", +"& c #F3F3F6", +"j c #D5D5DD", +"6 c #E4E4EA", +". c #C6C6D5", +"# c #ECECF0", +"f c #CECED7", +"l c #CECED8", +"e c #D6D6DE", +"; c #EDEDF0", +"3 c #DEDEE4", +", c #EDEDF1", +"c c #CFCFD8", +"o c #F5F5F7", +"- c #E6E6EB", +"w c #D7D7DF", +"v c #C8C8D3", +"i c #DFDFE5", +"@ c #EEEEF2", +"s c #D0D0D9", +"X c #9494AD", +"9 c #D8D8DF", +"t c #D8D8E0", +"* c #EFEFF2", +"2 c #E0E0E6", +"k c #D1D1DA", +/* pixels */ +" ........X ", +" .oO+@#$%XX ", +" .&+*#$=-XXX ", +" .+*;:=->XXXX ", +" .*,:<->1234X ", +" .,5:5612378X ", +" 5,5559530qwX ", +" 55555550q9eX ", +" 5555r5555teyX ", +" 55rui559eypX ", +" 5555i5555yasX ", +" 5555555dasfX ", +" 5355595gsfhX ", +" .3595jgklhzX ", +" .0qwjxkchzvX ", +" XXXXXXXXXXXX " +}; diff --git a/Externals/wxWidgets3/art/fileopen.xpm b/Externals/wxWidgets3/art/fileopen.xpm index 997efdea19..636a904123 100644 --- a/Externals/wxWidgets3/art/fileopen.xpm +++ b/Externals/wxWidgets3/art/fileopen.xpm @@ -1,57 +1,57 @@ -/* XPM */ -static const char *const fileopen_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 36 1", -"6 c #9BACC2", -"< c #9AEA53", -"9 c #94A5BD", -"5 c #839CB5", -"; c #4D7492", -". c #376485", -"$ c #7F99B4", -"r c #D1D9E5", -"7 c #EAEDF3", -"@ c #CAD2DC", -"% c #718BA7", -"t c #BECAD9", -"& c #65839D", -"0 c #DCE2EA", -"4 c #F5F6F7", -"w c #597B9A", -"O c #8DA0B9", -" c None", -"+ c #467291", -"u c #305F81", -"= c #B4C4D3", -"# c #CAE2AA", -"1 c #FAFCFE", -"3 c #A8B6CA", -"q c #E4E9ED", -"8 c #EEF1F3", -"X c #215579", -"2 c #7F97B0", -": c #B3BFD1", -"y c #7A90AC", -", c #C2CBDB", -"- c #ADD668", -"* c #B6D791", -"e c #CAD6E1", -"o c #DFF0D0", -"> c #BBC4D6", -/* pixels */ -" ", -" .... ", -"XXXXX .oo. ", -"XOOOO+@.#o. ", -"XOOOO$%&.*oXXX ", -"XOOOOOOO.*oX=X ", -"XOXXXX...-oXXXX;", -"XOX:>,.<<<<,.<<>.>.X0q7; ", -"Xw2O963:>>er0t; ", -"X&y2O963:>,er; ", -"uXXXXXXXXXXXX; ", -" " -}; +/* XPM */ +static const char *const fileopen_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 36 1", +"6 c #9BACC2", +"< c #9AEA53", +"9 c #94A5BD", +"5 c #839CB5", +"; c #4D7492", +". c #376485", +"$ c #7F99B4", +"r c #D1D9E5", +"7 c #EAEDF3", +"@ c #CAD2DC", +"% c #718BA7", +"t c #BECAD9", +"& c #65839D", +"0 c #DCE2EA", +"4 c #F5F6F7", +"w c #597B9A", +"O c #8DA0B9", +" c None", +"+ c #467291", +"u c #305F81", +"= c #B4C4D3", +"# c #CAE2AA", +"1 c #FAFCFE", +"3 c #A8B6CA", +"q c #E4E9ED", +"8 c #EEF1F3", +"X c #215579", +"2 c #7F97B0", +": c #B3BFD1", +"y c #7A90AC", +", c #C2CBDB", +"- c #ADD668", +"* c #B6D791", +"e c #CAD6E1", +"o c #DFF0D0", +"> c #BBC4D6", +/* pixels */ +" ", +" .... ", +"XXXXX .oo. ", +"XOOOO+@.#o. ", +"XOOOO$%&.*oXXX ", +"XOOOOOOO.*oX=X ", +"XOXXXX...-oXXXX;", +"XOX:>,.<<<<,.<<>.>.X0q7; ", +"Xw2O963:>>er0t; ", +"X&y2O963:>,er; ", +"uXXXXXXXXXXXX; ", +" " +}; diff --git a/Externals/wxWidgets3/art/filesave.xpm b/Externals/wxWidgets3/art/filesave.xpm index f571025cd6..b1ffda3346 100644 --- a/Externals/wxWidgets3/art/filesave.xpm +++ b/Externals/wxWidgets3/art/filesave.xpm @@ -1,42 +1,42 @@ -/* XPM */ -static const char *const filesave_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 21 1", -"O c #FFFFFF", -"> c #D5D6D8", -"; c #446A8C", -"1 c #CAD2DC", -": c #C0C7D1", -" c #5F666D", -"% c #A5B0BA", -"o c #65839D", -", c #DCE2EA", -"< c #C3C5C8", -"- c #E1E6EE", -"* c #C6CCD3", -". c None", -"$ c #305F81", -"2 c #D6DFE7", -"= c #D2D9E0", -"& c #B7BFC7", -"X c #1B4467", -"# c #BCBDBE", -"@ c #7A90AC", -"+ c #5D7C93", -/* pixels */ -" .", -" XoOOOOOOOOO+X .", -" @oO#######O+@ .", -" @oOOOOOOOOO+@ .", -" @oO#######O+@ .", -" @oOOOOOOOOO+@ .", -" @@+++++++++@@ .", -" @@@@@@@@@@@@@ .", -" @@@$$$$$$$$@@ .", -" @@$%%%&*=-O$@ .", -" @@$%X;;*=-O$@ .", -" @@$%X;;:>,O$@ .", -" @@$%X;;<12O$@ .", -" @@$<<2OOOOO$@ .", -". .." -}; +/* XPM */ +static const char *const filesave_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 21 1", +"O c #FFFFFF", +"> c #D5D6D8", +"; c #446A8C", +"1 c #CAD2DC", +": c #C0C7D1", +" c #5F666D", +"% c #A5B0BA", +"o c #65839D", +", c #DCE2EA", +"< c #C3C5C8", +"- c #E1E6EE", +"* c #C6CCD3", +". c None", +"$ c #305F81", +"2 c #D6DFE7", +"= c #D2D9E0", +"& c #B7BFC7", +"X c #1B4467", +"# c #BCBDBE", +"@ c #7A90AC", +"+ c #5D7C93", +/* pixels */ +" .", +" XoOOOOOOOOO+X .", +" @oO#######O+@ .", +" @oOOOOOOOOO+@ .", +" @oO#######O+@ .", +" @oOOOOOOOOO+@ .", +" @@+++++++++@@ .", +" @@@@@@@@@@@@@ .", +" @@@$$$$$$$$@@ .", +" @@$%%%&*=-O$@ .", +" @@$%X;;*=-O$@ .", +" @@$%X;;:>,O$@ .", +" @@$%X;;<12O$@ .", +" @@$<<2OOOOO$@ .", +". .." +}; diff --git a/Externals/wxWidgets3/art/filesaveas.xpm b/Externals/wxWidgets3/art/filesaveas.xpm index 7562f4cc47..4ca8e26227 100644 --- a/Externals/wxWidgets3/art/filesaveas.xpm +++ b/Externals/wxWidgets3/art/filesaveas.xpm @@ -1,44 +1,44 @@ -/* XPM */ -static const char *const filesaveas_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 23 1", -"X c Black", -"+ c #FFFFFF", -"< c #D5D6D8", -"> c #446A8C", -"3 c #CAD2DC", -", c #C0C7D1", -" c #5F666D", -"* c #A5B0BA", -"O c #65839D", -"1 c #DCE2EA", -"2 c #C3C5C8", -": c #E1E6EE", -". c #FFFF00", -"- c #C6CCD3", -"@ c None", -"& c #305F81", -"4 c #D6DFE7", -"; c #D2D9E0", -"= c #B7BFC7", -"o c #1B4467", -"$ c #BCBDBE", -"# c #7A90AC", -"% c #5D7C93", -/* pixels */ -" .X .XX.", -" oO+++++++.X.X.@", -" #O+$$$$$XX...XX", -" #O++++++.......", -" #O+$$$$$XX...XX", -" #O+++++++.X.X.@", -" ##%%%%%%.X%.X .", -" ############# @", -" ###&&&&&&&&## @", -" ##&***=-;:+&# @", -" ##&*o>>-;:+&# @", -" ##&*o>>,<1+&# @", -" ##&*o>>234+&# @", -" ##&224+++++&# @", -"@ @@" -}; +/* XPM */ +static const char *const filesaveas_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 23 1", +"X c Black", +"+ c #FFFFFF", +"< c #D5D6D8", +"> c #446A8C", +"3 c #CAD2DC", +", c #C0C7D1", +" c #5F666D", +"* c #A5B0BA", +"O c #65839D", +"1 c #DCE2EA", +"2 c #C3C5C8", +": c #E1E6EE", +". c #FFFF00", +"- c #C6CCD3", +"@ c None", +"& c #305F81", +"4 c #D6DFE7", +"; c #D2D9E0", +"= c #B7BFC7", +"o c #1B4467", +"$ c #BCBDBE", +"# c #7A90AC", +"% c #5D7C93", +/* pixels */ +" .X .XX.", +" oO+++++++.X.X.@", +" #O+$$$$$XX...XX", +" #O++++++.......", +" #O+$$$$$XX...XX", +" #O+++++++.X.X.@", +" ##%%%%%%.X%.X .", +" ############# @", +" ###&&&&&&&&## @", +" ##&***=-;:+&# @", +" ##&*o>>-;:+&# @", +" ##&*o>>,<1+&# @", +" ##&*o>>234+&# @", +" ##&224+++++&# @", +"@ @@" +}; diff --git a/Externals/wxWidgets3/art/find.xpm b/Externals/wxWidgets3/art/find.xpm index a31ecde63f..d5f24f8e41 100644 --- a/Externals/wxWidgets3/art/find.xpm +++ b/Externals/wxWidgets3/art/find.xpm @@ -1,62 +1,62 @@ -/* XPM */ -static const char *const find_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 41 1", -"y c #A06959", -"9 c #A7DAF2", -"$ c #B5CAD7", -"> c #35B4E1", -"t c #6B98B8", -"w c #B6E0F4", -"q c #AEC9D7", -"1 c #5A89A6", -"+ c #98B3C6", -"4 c #EAF6FC", -"3 c #DEF1FA", -"= c #4CBCE3", -"d c #DB916B", -"X c #85A7BC", -"s c #D8BCA4", -"o c #749BB4", -"e c #BCD9EF", -"* c #62B4DD", -"< c #91D2EF", -"a c #E6DED2", -"0 c #E9F4FB", -" c None", -"@ c #A0BACB", -"O c #AABFCD", -"i c #6591AE", -": c #B9CBD5", -"- c #71C5E7", -"5 c #D3ECF8", -"% c #81A3B9", -"6 c #8AD0EE", -"8 c #FDFDFE", -"p c #8EA9BC", -"r c #B6D5EE", -", c #81CCEB", -". c #ACC4D3", -"; c #AFD1DE", -"7 c #EFF8FC", -"u c #C2CBDB", -"# c #C0D1DC", -"2 c #CAD6E1", -"& c #8FB0C3", -/* pixels */ -" .XooXO ", -" +@###$+% ", -" .&#*==-;@@ ", -" o:*>,<--:X ", -" 12>-345-#% ", -" 12>678392% ", -" %$*,3059q& ", -" @Oq,wwer@@ ", -" t@q22q&+ ", -" yyui+%o%p ", -" yasy ", -" yasdy ", -" yasdy ", -" ysdy ", -" yy " -}; +/* XPM */ +static const char *const find_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 41 1", +"y c #A06959", +"9 c #A7DAF2", +"$ c #B5CAD7", +"> c #35B4E1", +"t c #6B98B8", +"w c #B6E0F4", +"q c #AEC9D7", +"1 c #5A89A6", +"+ c #98B3C6", +"4 c #EAF6FC", +"3 c #DEF1FA", +"= c #4CBCE3", +"d c #DB916B", +"X c #85A7BC", +"s c #D8BCA4", +"o c #749BB4", +"e c #BCD9EF", +"* c #62B4DD", +"< c #91D2EF", +"a c #E6DED2", +"0 c #E9F4FB", +" c None", +"@ c #A0BACB", +"O c #AABFCD", +"i c #6591AE", +": c #B9CBD5", +"- c #71C5E7", +"5 c #D3ECF8", +"% c #81A3B9", +"6 c #8AD0EE", +"8 c #FDFDFE", +"p c #8EA9BC", +"r c #B6D5EE", +", c #81CCEB", +". c #ACC4D3", +"; c #AFD1DE", +"7 c #EFF8FC", +"u c #C2CBDB", +"# c #C0D1DC", +"2 c #CAD6E1", +"& c #8FB0C3", +/* pixels */ +" .XooXO ", +" +@###$+% ", +" .&#*==-;@@ ", +" o:*>,<--:X ", +" 12>-345-#% ", +" 12>678392% ", +" %$*,3059q& ", +" @Oq,wwer@@ ", +" t@q22q&+ ", +" yyui+%o%p ", +" yasy ", +" yasdy ", +" yasdy ", +" ysdy ", +" yy " +}; diff --git a/Externals/wxWidgets3/art/findrepl.xpm b/Externals/wxWidgets3/art/findrepl.xpm index 5d688ba4bc..55380e5c06 100644 --- a/Externals/wxWidgets3/art/findrepl.xpm +++ b/Externals/wxWidgets3/art/findrepl.xpm @@ -1,63 +1,63 @@ -/* XPM */ -static const char *const findrepl_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 42 1", -"y c #A06959", -"9 c #A7DAF2", -"$ c #B5CAD7", -"> c #35B4E1", -"t c #6B98B8", -"w c #B6E0F4", -"q c #AEC9D7", -"1 c #5A89A6", -"+ c #98B3C6", -"4 c #EAF6FC", -"d c #008000", -"3 c #DEF1FA", -"= c #4CBCE3", -"f c #DB916B", -"X c #85A7BC", -"s c #D8BCA4", -"o c #749BB4", -"e c #BCD9EF", -"* c #62B4DD", -"< c #91D2EF", -"a c #E6DED2", -"0 c #E9F4FB", -" c None", -"@ c #A0BACB", -"O c #AABFCD", -"i c #6591AE", -": c #B9CBD5", -"- c #71C5E7", -"5 c #D3ECF8", -"% c #81A3B9", -"6 c #8AD0EE", -"8 c #FDFDFE", -"p c #8EA9BC", -"r c #B6D5EE", -", c #81CCEB", -". c #ACC4D3", -"; c #AFD1DE", -"7 c #EFF8FC", -"u c #C2CBDB", -"# c #C0D1DC", -"2 c #CAD6E1", -"& c #8FB0C3", -/* pixels */ -" .XooXO ", -" +@###$+% ", -" .&#*==-;@@ ", -" o:*>,<--:X ", -" 12>-345-#% ", -" 12>678392% ", -" %$*,3059q& ", -" @Oq,wwer@@ ", -" t@q22q&+ ", -" yyui+%o%p ", -" yasy d d ", -" yasfy dd dd ", -"yasfy ddddddddd", -"ysfy dd dd ", -" yy d d " -}; +/* XPM */ +static const char *const findrepl_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 42 1", +"y c #A06959", +"9 c #A7DAF2", +"$ c #B5CAD7", +"> c #35B4E1", +"t c #6B98B8", +"w c #B6E0F4", +"q c #AEC9D7", +"1 c #5A89A6", +"+ c #98B3C6", +"4 c #EAF6FC", +"d c #008000", +"3 c #DEF1FA", +"= c #4CBCE3", +"f c #DB916B", +"X c #85A7BC", +"s c #D8BCA4", +"o c #749BB4", +"e c #BCD9EF", +"* c #62B4DD", +"< c #91D2EF", +"a c #E6DED2", +"0 c #E9F4FB", +" c None", +"@ c #A0BACB", +"O c #AABFCD", +"i c #6591AE", +": c #B9CBD5", +"- c #71C5E7", +"5 c #D3ECF8", +"% c #81A3B9", +"6 c #8AD0EE", +"8 c #FDFDFE", +"p c #8EA9BC", +"r c #B6D5EE", +", c #81CCEB", +". c #ACC4D3", +"; c #AFD1DE", +"7 c #EFF8FC", +"u c #C2CBDB", +"# c #C0D1DC", +"2 c #CAD6E1", +"& c #8FB0C3", +/* pixels */ +" .XooXO ", +" +@###$+% ", +" .&#*==-;@@ ", +" o:*>,<--:X ", +" 12>-345-#% ", +" 12>678392% ", +" %$*,3059q& ", +" @Oq,wwer@@ ", +" t@q22q&+ ", +" yyui+%o%p ", +" yasy d d ", +" yasfy dd dd ", +"yasfy ddddddddd", +"ysfy dd dd ", +" yy d d " +}; diff --git a/Externals/wxWidgets3/art/floppy.xpm b/Externals/wxWidgets3/art/floppy.xpm index f6057b14fa..0c685efbcb 100644 --- a/Externals/wxWidgets3/art/floppy.xpm +++ b/Externals/wxWidgets3/art/floppy.xpm @@ -1,39 +1,39 @@ -/* XPM */ -static const char *const floppy_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 18 1", -"& c #E3E4E6", -"+ c #FFFFFF", -". c #446A8C", -"o c #697787", -"> c #5F666D", -"* c #B2B3B3", -" c None", -", c #4B4C4D", -"= c #DCDBDA", -"$ c #1B4467", -": c #E4E9ED", -"@ c #979BA0", -"X c #203646", -"O c #215579", -"- c #545B63", -"; c #636465", -"# c #CAD6E1", -"% c #7F8286", -/* pixels */ -" .XoooooooXO ", -" .o+++++++.O ", -" .o+OOOOO+.O ", -" .o+++++++.O ", -" .o@@@@@@@.O ", -" ..........O ", -" ..#+++++#.O ", -" ..+$O+++#.O ", -" ..+$O+++#.O ", -" %&.........*% ", -"%=+++++++++++&% ", -"--------------; ", -"-:::::::::::::- ", -"-:X:XXXXXXXXX:> ", -"-*************, " -}; +/* XPM */ +static const char *const floppy_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 18 1", +"& c #E3E4E6", +"+ c #FFFFFF", +". c #446A8C", +"o c #697787", +"> c #5F666D", +"* c #B2B3B3", +" c None", +", c #4B4C4D", +"= c #DCDBDA", +"$ c #1B4467", +": c #E4E9ED", +"@ c #979BA0", +"X c #203646", +"O c #215579", +"- c #545B63", +"; c #636465", +"# c #CAD6E1", +"% c #7F8286", +/* pixels */ +" .XoooooooXO ", +" .o+++++++.O ", +" .o+OOOOO+.O ", +" .o+++++++.O ", +" .o@@@@@@@.O ", +" ..........O ", +" ..#+++++#.O ", +" ..+$O+++#.O ", +" ..+$O+++#.O ", +" %&.........*% ", +"%=+++++++++++&% ", +"--------------; ", +"-:::::::::::::- ", +"-:X:XXXXXXXXX:> ", +"-*************, " +}; diff --git a/Externals/wxWidgets3/art/folder.xpm b/Externals/wxWidgets3/art/folder.xpm index 98e52a70b8..a116dcbd7b 100644 --- a/Externals/wxWidgets3/art/folder.xpm +++ b/Externals/wxWidgets3/art/folder.xpm @@ -1,43 +1,43 @@ -/* XPM */ -static const char *const folder_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 22 1", -"> c #9BACC2", -". c #547897", -"1 c #7F99B4", -"X c #D1D9E5", -"< c #EAEDF3", -"+ c #CAD2DC", -"3 c #718BA7", -"O c #BECAD9", -"$ c #E1E6EE", -"* c #F5F6F7", -", c #8DA0B9", -" c None", -"# c #D6DFE7", -"@ c #D2D9E0", -"- c #FAFCFE", -"; c #ADBACE", -"& c #EEF1F3", -"= c #F8F9FA", -"o c #B3BFD1", -"2 c #7A90AC", -": c #A2B3C5", -"% c #E5EAF1", -/* pixels */ -" ", -" ..... ", -" .XXXX. ", -" ............. ", -" .oO+@#$%&*=-. ", -" .oO+@#$%&*=-. ", -" .;oO+X#$%&*=. ", -" .:;oO+X#$%&*. ", -" .>:;oO+X#$%&. ", -" .,>:;oO+X#$<. ", -" .1,>:;oO+X#$. ", -" .21,>:;oO+X#. ", -" .321,>:;oO+X. ", -" ............. ", -" " -}; +/* XPM */ +static const char *const folder_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 22 1", +"> c #9BACC2", +". c #547897", +"1 c #7F99B4", +"X c #D1D9E5", +"< c #EAEDF3", +"+ c #CAD2DC", +"3 c #718BA7", +"O c #BECAD9", +"$ c #E1E6EE", +"* c #F5F6F7", +", c #8DA0B9", +" c None", +"# c #D6DFE7", +"@ c #D2D9E0", +"- c #FAFCFE", +"; c #ADBACE", +"& c #EEF1F3", +"= c #F8F9FA", +"o c #B3BFD1", +"2 c #7A90AC", +": c #A2B3C5", +"% c #E5EAF1", +/* pixels */ +" ", +" ..... ", +" .XXXX. ", +" ............. ", +" .oO+@#$%&*=-. ", +" .oO+@#$%&*=-. ", +" .;oO+X#$%&*=. ", +" .:;oO+X#$%&*. ", +" .>:;oO+X#$%&. ", +" .,>:;oO+X#$<. ", +" .1,>:;oO+X#$. ", +" .21,>:;oO+X#. ", +" .321,>:;oO+X. ", +" ............. ", +" " +}; diff --git a/Externals/wxWidgets3/art/folder_open.xpm b/Externals/wxWidgets3/art/folder_open.xpm index 154441d2a9..dd450e73b9 100644 --- a/Externals/wxWidgets3/art/folder_open.xpm +++ b/Externals/wxWidgets3/art/folder_open.xpm @@ -1,52 +1,52 @@ -/* XPM */ -static const char *const folder_open_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 31 1", -"6 c #9BACC2", -"w c #547B99", -"5 c #94A5BD", -". c #376485", -"; c #F1F4F7", -"o c #7F99B4", -"2 c #D1D9E5", -"- c #EAEDF3", -"O c #718BA7", -"0 c #65839D", -"* c #DCE2EA", -": c #F5F6F7", -"7 c #597B9A", -"X c #8DA0B9", -" c None", -"+ c #467291", -"q c #305F81", -"& c #D6DFE7", -"3 c #6A89A2", -"1 c #A8B6CA", -"= c #E4E9ED", -"> c #F8F9FA", -", c #FDFDFE", -"9 c #215579", -"8 c #7F97B0", -"@ c #B3BFD1", -"< c #7A90AC", -"$ c #C2CBDB", -"4 c #A2B3C5", -"% c #CAD6E1", -"# c #BBC4D6", -/* pixels */ -" ", -"..... ", -".XXXo. ", -".XXXXO........ ", -".XXXXXXXXXXXX. ", -".XXXXXXXXXXXX. ", -".X++++++++++++++", -".X+@#$%&*=-;:>,+", -".<.1@#$%2*=-;:23", -"..X41@#$%2*=-;3 ", -"..X561@#$%2*=-3 ", -".78X561@#$%2*%3 ", -"90<8X561@#$%23 ", -"q++++++++++++w ", -" " -}; +/* XPM */ +static const char *const folder_open_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 31 1", +"6 c #9BACC2", +"w c #547B99", +"5 c #94A5BD", +". c #376485", +"; c #F1F4F7", +"o c #7F99B4", +"2 c #D1D9E5", +"- c #EAEDF3", +"O c #718BA7", +"0 c #65839D", +"* c #DCE2EA", +": c #F5F6F7", +"7 c #597B9A", +"X c #8DA0B9", +" c None", +"+ c #467291", +"q c #305F81", +"& c #D6DFE7", +"3 c #6A89A2", +"1 c #A8B6CA", +"= c #E4E9ED", +"> c #F8F9FA", +", c #FDFDFE", +"9 c #215579", +"8 c #7F97B0", +"@ c #B3BFD1", +"< c #7A90AC", +"$ c #C2CBDB", +"4 c #A2B3C5", +"% c #CAD6E1", +"# c #BBC4D6", +/* pixels */ +" ", +"..... ", +".XXXo. ", +".XXXXO........ ", +".XXXXXXXXXXXX. ", +".XXXXXXXXXXXX. ", +".X++++++++++++++", +".X+@#$%&*=-;:>,+", +".<.1@#$%2*=-;:23", +"..X41@#$%2*=-;3 ", +"..X561@#$%2*=-3 ", +".78X561@#$%2*%3 ", +"90<8X561@#$%23 ", +"q++++++++++++w ", +" " +}; diff --git a/Externals/wxWidgets3/art/forward.xpm b/Externals/wxWidgets3/art/forward.xpm index 81f62b0344..d17eef486e 100644 --- a/Externals/wxWidgets3/art/forward.xpm +++ b/Externals/wxWidgets3/art/forward.xpm @@ -1,21 +1,21 @@ -/* XPM */ -static const char *const forward_xpm[] = { -"16 15 3 1", -" c None", -". c Black", -"X c Gray100", -" ", -" ", -" . ", -" .. ", -" .X. ", -" ........XX. ", -" .XXXXXXXXXX. ", -" .XXXXXXXXXXX. ", -" .XXXXXXXXXXX. ", -" .XXXXXXXXXX. ", -" ........XX. ", -" .X. ", -" .. ", -" . ", -" "}; +/* XPM */ +static const char *const forward_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ", +" . ", +" .. ", +" .X. ", +" ........XX. ", +" .XXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXX. ", +" ........XX. ", +" .X. ", +" .. ", +" . ", +" "}; diff --git a/Externals/wxWidgets3/art/gtk/error.xpm b/Externals/wxWidgets3/art/gtk/error.xpm index 559715c64c..2505d3d4a8 100644 --- a/Externals/wxWidgets3/art/gtk/error.xpm +++ b/Externals/wxWidgets3/art/gtk/error.xpm @@ -1,58 +1,58 @@ -/* XPM */ -static const char *const error_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 4 1", -" c None", -"X c #242424", -"o c #DCDF00", -". c #C00000", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ..... ", -" ............. ", -" ................. ", -" ................... ", -" ....................... ", -" ......................... ", -" ........................... ", -" ...........................X ", -" .............................X ", -" ............................... ", -" ...............................X ", -" .................................X ", -" .................................X ", -" .................................XX ", -" ...ooooooooooooooooooooooooooo...XX ", -" ....ooooooooooooooooooooooooooo....X ", -" ....ooooooooooooooooooooooooooo....X ", -" ....ooooooooooooooooooooooooooo....XX ", -" ....ooooooooooooooooooooooooooo....XX ", -" ....ooooooooooooooooooooooooooo....XX ", -" ...ooooooooooooooooooooooooooo...XXX ", -" ...ooooooooooooooooooooooooooo...XXX ", -" .................................XX ", -" .................................XX ", -" ...............................XXX ", -" ...............................XXX ", -" .............................XXX ", -" ...........................XXXX ", -" ...........................XXX ", -" .........................XXX ", -" .......................XXXX ", -" X...................XXXXX ", -" X.................XXXXX ", -" X.............XXXXX ", -" XXXX.....XXXXXXXX ", -" XXXXXXXXXXXXX ", -" XXXXX ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const error_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 4 1", +" c None", +"X c #242424", +"o c #DCDF00", +". c #C00000", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" ......................... ", +" ........................... ", +" ...........................X ", +" .............................X ", +" ............................... ", +" ...............................X ", +" .................................X ", +" .................................X ", +" .................................XX ", +" ...ooooooooooooooooooooooooooo...XX ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" .................................XX ", +" .................................XX ", +" ...............................XXX ", +" ...............................XXX ", +" .............................XXX ", +" ...........................XXXX ", +" ...........................XXX ", +" .........................XXX ", +" .......................XXXX ", +" X...................XXXXX ", +" X.................XXXXX ", +" X.............XXXXX ", +" XXXX.....XXXXXXXX ", +" XXXXXXXXXXXXX ", +" XXXXX ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/gtk/info.xpm b/Externals/wxWidgets3/art/gtk/info.xpm index fe32e61982..8883955448 100644 --- a/Externals/wxWidgets3/art/gtk/info.xpm +++ b/Externals/wxWidgets3/art/gtk/info.xpm @@ -1,63 +1,63 @@ -/* XPM */ -static const char *const info_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 9 1", -"$ c Black", -"O c #FFFFFF", -"@ c #808080", -"+ c #000080", -"o c #E8EB01", -" c None", -"X c #FFFF40", -"# c #C0C0C0", -". c #ABAD01", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ..... ", -" ..XXXXX.. ", -" ..XXXXXXXXo.. ", -" .XXXOXXXXXXXoo. ", -" .XOOXXX+XXXXXo. ", -" .XOOOXX+++XXXXoo. ", -" .XOOXXX+++XXXXXo. ", -" .XOOOXXX+++XXXXXXo. ", -" .XOOXXXX+++XXXXXXo. ", -" .XXXXXXX+++XXXXXXX. ", -" .XXXXXXX+++XXXXXXo. ", -" .XXXXXXX+++XXXXXoo. ", -" .XXXXXX+++XXXXXo. ", -" .XXXXXXX+XXXXXXo. ", -" .XXXXXXXXXXXXo. ", -" .XXXXX+++XXXoo. ", -" .XXXX+++XXoo. ", -" .XXXXXXXXo. ", -" ..XXXXXXo.. ", -" .XXXXXo.. ", -" @#######@ ", -" @@@@@@@@@ ", -" @#######@ ", -" @@@@@@@@@ ", -" @#######@ ", -" @@@@@@@ ", -" ### ", -" $$$ ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const info_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"$ c Black", +"O c #FFFFFF", +"@ c #808080", +"+ c #000080", +"o c #E8EB01", +" c None", +"X c #FFFF40", +"# c #C0C0C0", +". c #ABAD01", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ..XXXXX.. ", +" ..XXXXXXXXo.. ", +" .XXXOXXXXXXXoo. ", +" .XOOXXX+XXXXXo. ", +" .XOOOXX+++XXXXoo. ", +" .XOOXXX+++XXXXXo. ", +" .XOOOXXX+++XXXXXXo. ", +" .XOOXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXXX. ", +" .XXXXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXoo. ", +" .XXXXXX+++XXXXXo. ", +" .XXXXXXX+XXXXXXo. ", +" .XXXXXXXXXXXXo. ", +" .XXXXX+++XXXoo. ", +" .XXXX+++XXoo. ", +" .XXXXXXXXo. ", +" ..XXXXXXo.. ", +" .XXXXXo.. ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@ ", +" ### ", +" $$$ ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/gtk/question.xpm b/Externals/wxWidgets3/art/gtk/question.xpm index cb0001ec80..701f4457ba 100644 --- a/Externals/wxWidgets3/art/gtk/question.xpm +++ b/Externals/wxWidgets3/art/gtk/question.xpm @@ -1,75 +1,75 @@ -/* XPM */ -static const char *const question_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 21 1", -". c Black", -"> c #696969", -"O c #1F1F00", -"+ c #181818", -"o c #F6F900", -"; c #3F3F00", -"$ c #111111", -" c None", -"& c #202020", -"X c #AAAA00", -"@ c #949400", -": c #303030", -"1 c #383838", -"% c #2A2A00", -", c #404040", -"= c #B4B400", -"- c #484848", -"# c #151500", -"< c #9F9F00", -"2 c #6A6A00", -"* c #353500", -/* pixels */ -" ", -" ", -" ", -" ", -" ......... ", -" ...XXXXXXX.. ", -" ..XXXXoooooXXXO+ ", -" ..XXooooooooooooX@.. ", -" ..XoooooooooooooooXX#. ", -" $%XoooooooooooooooooXX#. ", -" &.XoooooooXXXXXXooooooXX.. ", -" .XooooooXX.$...$XXoooooX*. ", -" $.XoooooX%.$ .*oooooo=.. ", -" .XooooooX.. -.XoooooX.. ", -" .XoooooX..+ .XoooooX;. ", -" ...XXXX..: .XoooooX;. ", -" ........ >.XoooooX;. ", -" +.XoooooX.. ", -" ,.Xoooooo<.. ", -" 1#XooooooXO.. ", -" &#XooooooX2.. ", -" $%XooooooXX.. ", -" $%XooooooXX.. ", -" $%XooooooXX.. ", -" &.XooooooXX.. ", -" .XooooooXX.. ", -" &.XoooooXX.. ", -" ..XooooXX.. ", -" ..XooooX... ", -" ..XXooXX..& ", -" ...XXXXX.. ", -" ........ ", -" ", -" ", -" ....... ", -" ..XXXXX.. ", -" ..XXoooXX.. ", -" ..XoooooX.. ", -" ..XoooooX.. ", -" ..XXoooXX.. ", -" ..XXXXX.. ", -" ....... ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const question_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 21 1", +". c Black", +"> c #696969", +"O c #1F1F00", +"+ c #181818", +"o c #F6F900", +"; c #3F3F00", +"$ c #111111", +" c None", +"& c #202020", +"X c #AAAA00", +"@ c #949400", +": c #303030", +"1 c #383838", +"% c #2A2A00", +", c #404040", +"= c #B4B400", +"- c #484848", +"# c #151500", +"< c #9F9F00", +"2 c #6A6A00", +"* c #353500", +/* pixels */ +" ", +" ", +" ", +" ", +" ......... ", +" ...XXXXXXX.. ", +" ..XXXXoooooXXXO+ ", +" ..XXooooooooooooX@.. ", +" ..XoooooooooooooooXX#. ", +" $%XoooooooooooooooooXX#. ", +" &.XoooooooXXXXXXooooooXX.. ", +" .XooooooXX.$...$XXoooooX*. ", +" $.XoooooX%.$ .*oooooo=.. ", +" .XooooooX.. -.XoooooX.. ", +" .XoooooX..+ .XoooooX;. ", +" ...XXXX..: .XoooooX;. ", +" ........ >.XoooooX;. ", +" +.XoooooX.. ", +" ,.Xoooooo<.. ", +" 1#XooooooXO.. ", +" &#XooooooX2.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" &.XooooooXX.. ", +" .XooooooXX.. ", +" &.XoooooXX.. ", +" ..XooooXX.. ", +" ..XooooX... ", +" ..XXooXX..& ", +" ...XXXXX.. ", +" ........ ", +" ", +" ", +" ....... ", +" ..XXXXX.. ", +" ..XXoooXX.. ", +" ..XoooooX.. ", +" ..XoooooX.. ", +" ..XXoooXX.. ", +" ..XXXXX.. ", +" ....... ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/gtk/warning.xpm b/Externals/wxWidgets3/art/gtk/warning.xpm index 58aee153fe..35e60316c3 100644 --- a/Externals/wxWidgets3/art/gtk/warning.xpm +++ b/Externals/wxWidgets3/art/gtk/warning.xpm @@ -1,63 +1,63 @@ -/* XPM */ -static const char *const warning_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 9 1", -"@ c Black", -"o c #A6A800", -"+ c #8A8C00", -"$ c #B8BA00", -" c None", -"O c #6E7000", -"X c #DCDF00", -". c #C00000", -"# c #373800", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" . ", -" ... ", -" ... ", -" ..... ", -" ...X.. ", -" ..XXX.. ", -" ...XXX... ", -" ..XXXXX.. ", -" ..XXXXXX... ", -" ...XXoO+XX.. ", -" ..XXXO@#XXX.. ", -" ..XXXXO@#XXX... ", -" ...XXXXO@#XXXX.. ", -" ..XXXXXO@#XXXX... ", -" ...XXXXXo@OXXXXX.. ", -" ...XXXXXXo@OXXXXXX.. ", -" ..XXXXXXX$@OXXXXXX... ", -" ...XXXXXXXX@XXXXXXXX.. ", -" ...XXXXXXXXXXXXXXXXXX... ", -" ..XXXXXXXXXXOXXXXXXXXX.. ", -" ...XXXXXXXXXO@#XXXXXXXXX.. ", -" ..XXXXXXXXXXX#XXXXXXXXXX... ", -" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", -" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", -" .............................. ", -" .............................. ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const warning_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"@ c Black", +"o c #A6A800", +"+ c #8A8C00", +"$ c #B8BA00", +" c None", +"O c #6E7000", +"X c #DCDF00", +". c #C00000", +"# c #373800", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" ..... ", +" ...X.. ", +" ..XXX.. ", +" ...XXX... ", +" ..XXXXX.. ", +" ..XXXXXX... ", +" ...XXoO+XX.. ", +" ..XXXO@#XXX.. ", +" ..XXXXO@#XXX... ", +" ...XXXXO@#XXXX.. ", +" ..XXXXXO@#XXXX... ", +" ...XXXXXo@OXXXXX.. ", +" ...XXXXXXo@OXXXXXX.. ", +" ..XXXXXXX$@OXXXXXX... ", +" ...XXXXXXXX@XXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXX... ", +" ..XXXXXXXXXXOXXXXXXXXX.. ", +" ...XXXXXXXXXO@#XXXXXXXXX.. ", +" ..XXXXXXXXXXX#XXXXXXXXXX... ", +" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", +" .............................. ", +" .............................. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/harddisk.xpm b/Externals/wxWidgets3/art/harddisk.xpm index d21ebf3c3b..3151a7f308 100644 --- a/Externals/wxWidgets3/art/harddisk.xpm +++ b/Externals/wxWidgets3/art/harddisk.xpm @@ -1,60 +1,60 @@ -/* XPM */ -static const char *const harddisk_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 39 1", -"7 c #E3E4E6", -"4 c #FFFFFF", -"5 c #839CB5", -". c #547897", -"1 c #4D7492", -"@ c #376485", -"o c #7A92A3", -"u c #D1D9E5", -"y c #446A8C", -"i c #51B03D", -"> c #CAD2DC", -"O c #718BA7", -"2 c #65839D", -"6 c #DCE2EA", -"0 c #C3C5C8", -"9 c #F5F6F7", -": c #EBEBEC", -"< c #597B9A", -"t c #C6CCD3", -" c None", -"* c #DFE0E2", -"e c #467291", -"a c #526E8B", -", c #7393AB", -"p c #130A0B", -"# c #AABFCD", -"r c #B4C4D3", -"; c #CFCFD0", -"X c #6F90A6", -"+ c #6A89A2", -"- c #D2D3D4", -"= c #DCDBDA", -"w c #E4E9ED", -"q c #C6C8CA", -"% c #215579", -"$ c #E7E7E7", -"3 c #7F97B0", -"8 c #C0D1DC", -"& c #5D7C93", -/* pixels */ -" ", -" .XoooXO+@ ", -" #$$%%%%$$$X ", -" &$*==-;$$$& ", -" &:>+,<1234o5 ", -" ###+67;;78242 ", -" &4,49*0q*9we4. ", -" &4+49*,,*9wo4. ", -"&4%r,67;;782t%4.", -"&44468rrrr84444,", -"y11111111111111e", -"1uu1:::::::::::1", -"1uu1::::::::ip:1", -"auu&:::::::::::1", -"1111111111111111" -}; +/* XPM */ +static const char *const harddisk_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 39 1", +"7 c #E3E4E6", +"4 c #FFFFFF", +"5 c #839CB5", +". c #547897", +"1 c #4D7492", +"@ c #376485", +"o c #7A92A3", +"u c #D1D9E5", +"y c #446A8C", +"i c #51B03D", +"> c #CAD2DC", +"O c #718BA7", +"2 c #65839D", +"6 c #DCE2EA", +"0 c #C3C5C8", +"9 c #F5F6F7", +": c #EBEBEC", +"< c #597B9A", +"t c #C6CCD3", +" c None", +"* c #DFE0E2", +"e c #467291", +"a c #526E8B", +", c #7393AB", +"p c #130A0B", +"# c #AABFCD", +"r c #B4C4D3", +"; c #CFCFD0", +"X c #6F90A6", +"+ c #6A89A2", +"- c #D2D3D4", +"= c #DCDBDA", +"w c #E4E9ED", +"q c #C6C8CA", +"% c #215579", +"$ c #E7E7E7", +"3 c #7F97B0", +"8 c #C0D1DC", +"& c #5D7C93", +/* pixels */ +" ", +" .XoooXO+@ ", +" #$$%%%%$$$X ", +" &$*==-;$$$& ", +" &:>+,<1234o5 ", +" ###+67;;78242 ", +" &4,49*0q*9we4. ", +" &4+49*,,*9wo4. ", +"&4%r,67;;782t%4.", +"&44468rrrr84444,", +"y11111111111111e", +"1uu1:::::::::::1", +"1uu1::::::::ip:1", +"auu&:::::::::::1", +"1111111111111111" +}; diff --git a/Externals/wxWidgets3/art/helpicon.xpm b/Externals/wxWidgets3/art/helpicon.xpm index 9b4cd44450..356c452399 100644 --- a/Externals/wxWidgets3/art/helpicon.xpm +++ b/Externals/wxWidgets3/art/helpicon.xpm @@ -1,44 +1,44 @@ -/* XPM */ -static const char *const helpicon_xpm[] = { -/* columns rows colors chars-per-pixel */ -"32 32 6 1", -" c Gray0", -". c Blue", -"X c #808080808080", -"o c #c0c0c0c0c0c0", -"O c Gray100", -"+ c None", -/* pixels */ -"+++++++++++XXXXXXXX+++++++++++++", -"++++++++XXXoOOOOOOoXXX++++++++++", -"++++++XXoOOOOOOOOOOOOoXX++++++++", -"+++++XoOOOOOOOOOOOOOOOOoX+++++++", -"++++XOOOOOOOOOOOOOOOOOOOO ++++++", -"+++XOOOOOOOo......oOOOOOOO +++++", -"++XOOOOOOOo.oOO....oOOOOOOO ++++", -"+XoOOOOOOO..OOOO....OOOOOOOo +++", -"+XOOOOOOOO....OO....OOOOOOOO X++", -"XoOOOOOOOO....Oo....OOOOOOOOo X+", -"XOOOOOOOOOo..oO....OOOOOOOOOO X+", -"XOOOOOOOOOOOOOo...OOOOOOOOOOO XX", -"XOOOOOOOOOOOOO...OOOOOOOOOOOO XX", -"XOOOOOOOOOOOOO..oOOOOOOOOOOOO XX", -"XOOOOOOOOOOOOO..OOOOOOOOOOOOO XX", -"XoOOOOOOOOOOOOOOOOOOOOOOOOOOo XX", -"+XOOOOOOOOOOOo..oOOOOOOOOOOO XXX", -"+XoOOOOOOOOOO....OOOOOOOOOOo XXX", -"++XOOOOOOOOOO....OOOOOOOOOO XXX+", -"+++ OOOOOOOOOo..oOOOOOOOOO XXXX+", -"++++ OOOOOOOOOOOOOOOOOOOO XXXX++", -"+++++ oOOOOOOOOOOOOOOOOo XXXX+++", -"++++++ oOOOOOOOOOOOOo XXXX++++", -"+++++++X oOOOOOOo XXXXX+++++", -"++++++++XXX oOOO XXXXXXX++++++", -"++++++++++XXXX OOO XXXXX++++++++", -"+++++++++++++X OOO XX+++++++++++", -"+++++++++++++++ OO XX+++++++++++", -"++++++++++++++++ O XX+++++++++++", -"+++++++++++++++++ XX+++++++++++", -"++++++++++++++++++XXX+++++++++++", -"+++++++++++++++++++XX+++++++++++" -}; +/* XPM */ +static const char *const helpicon_xpm[] = { +/* columns rows colors chars-per-pixel */ +"32 32 6 1", +" c Gray0", +". c Blue", +"X c #808080808080", +"o c #c0c0c0c0c0c0", +"O c Gray100", +"+ c None", +/* pixels */ +"+++++++++++XXXXXXXX+++++++++++++", +"++++++++XXXoOOOOOOoXXX++++++++++", +"++++++XXoOOOOOOOOOOOOoXX++++++++", +"+++++XoOOOOOOOOOOOOOOOOoX+++++++", +"++++XOOOOOOOOOOOOOOOOOOOO ++++++", +"+++XOOOOOOOo......oOOOOOOO +++++", +"++XOOOOOOOo.oOO....oOOOOOOO ++++", +"+XoOOOOOOO..OOOO....OOOOOOOo +++", +"+XOOOOOOOO....OO....OOOOOOOO X++", +"XoOOOOOOOO....Oo....OOOOOOOOo X+", +"XOOOOOOOOOo..oO....OOOOOOOOOO X+", +"XOOOOOOOOOOOOOo...OOOOOOOOOOO XX", +"XOOOOOOOOOOOOO...OOOOOOOOOOOO XX", +"XOOOOOOOOOOOOO..oOOOOOOOOOOOO XX", +"XOOOOOOOOOOOOO..OOOOOOOOOOOOO XX", +"XoOOOOOOOOOOOOOOOOOOOOOOOOOOo XX", +"+XOOOOOOOOOOOo..oOOOOOOOOOOO XXX", +"+XoOOOOOOOOOO....OOOOOOOOOOo XXX", +"++XOOOOOOOOOO....OOOOOOOOOO XXX+", +"+++ OOOOOOOOOo..oOOOOOOOOO XXXX+", +"++++ OOOOOOOOOOOOOOOOOOOO XXXX++", +"+++++ oOOOOOOOOOOOOOOOOo XXXX+++", +"++++++ oOOOOOOOOOOOOo XXXX++++", +"+++++++X oOOOOOOo XXXXX+++++", +"++++++++XXX oOOO XXXXXXX++++++", +"++++++++++XXXX OOO XXXXX++++++++", +"+++++++++++++X OOO XX+++++++++++", +"+++++++++++++++ OO XX+++++++++++", +"++++++++++++++++ O XX+++++++++++", +"+++++++++++++++++ XX+++++++++++", +"++++++++++++++++++XXX+++++++++++", +"+++++++++++++++++++XX+++++++++++" +}; diff --git a/Externals/wxWidgets3/art/home.xpm b/Externals/wxWidgets3/art/home.xpm index d0da8d26b8..d246b1d72e 100644 --- a/Externals/wxWidgets3/art/home.xpm +++ b/Externals/wxWidgets3/art/home.xpm @@ -1,24 +1,24 @@ -/* XPM */ -static const char *const home_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 3 1", -". c Black", -"X c #FFFFFF", -" c None", -/* pixels */ -" .... ", -" .XXXX. ", -" .XXXXXX. ", -" .XXXXXXXX. ", -" .XXXXXXXXXX. ", -" .............. ", -" .XXXXXXXXXXXX. ", -" .XXXXXXXXXXXX. ", -" .XXXXXXXXXXXX. ", -" .X.....X....X. ", -" .X. .X. .X. ", -" .X. .X. .X. ", -" .X.....X. .X. ", -" .XXXXXXX. .X. ", -" ......... ... " -}; +/* XPM */ +static const char *const home_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 3 1", +". c Black", +"X c #FFFFFF", +" c None", +/* pixels */ +" .... ", +" .XXXX. ", +" .XXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXXXX. ", +" .............. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .X.....X....X. ", +" .X. .X. .X. ", +" .X. .X. .X. ", +" .X.....X. .X. ", +" .XXXXXXX. .X. ", +" ......... ... " +}; diff --git a/Externals/wxWidgets3/art/htmbook.xpm b/Externals/wxWidgets3/art/htmbook.xpm index d0456ee6d5..e49b4685f9 100644 --- a/Externals/wxWidgets3/art/htmbook.xpm +++ b/Externals/wxWidgets3/art/htmbook.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static const char *const htmbook_xpm[] = { -"16 16 6 1", -" c None", -". c Black", -"X c #000080", -"o c #c0c0c0", -"O c #808080", -"+ c Gray100", -" ", -" .. ", -" ..XX. ", -" ..XXXXX. ", -" ..XXXXXXXX. ", -".oXXXXXXXXXX. ", -".XoXXXXXXXXXX. ", -".XXoXXXXXXXXXX. ", -".XXXoXXXXXXXXX..", -".XXXXoXXXXXX..O ", -" .XXXXoXXX..O+O ", -" .XXXXo..O++o..", -" .XXX.O+++o.. ", -" .XX.o+o.. ", -" .X.o.. ", -" ... "}; +/* XPM */ +static const char *const htmbook_xpm[] = { +"16 16 6 1", +" c None", +". c Black", +"X c #000080", +"o c #c0c0c0", +"O c #808080", +"+ c Gray100", +" ", +" .. ", +" ..XX. ", +" ..XXXXX. ", +" ..XXXXXXXX. ", +".oXXXXXXXXXX. ", +".XoXXXXXXXXXX. ", +".XXoXXXXXXXXXX. ", +".XXXoXXXXXXXXX..", +".XXXXoXXXXXX..O ", +" .XXXXoXXX..O+O ", +" .XXXXo..O++o..", +" .XXX.O+++o.. ", +" .XX.o+o.. ", +" .X.o.. ", +" ... "}; diff --git a/Externals/wxWidgets3/art/htmfoldr.xpm b/Externals/wxWidgets3/art/htmfoldr.xpm index 4f84e8aeff..dacef687b1 100644 --- a/Externals/wxWidgets3/art/htmfoldr.xpm +++ b/Externals/wxWidgets3/art/htmfoldr.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static const char *const htmfoldr_xpm[] = { -"16 16 6 1", -" c None", -". c Black", -"X c #000080", -"o c #c0c0c0", -"O c #808080", -"+ c Gray100", -" ", -" .. ", -" ..XX. ", -" ..XXXXX. ", -" ..XXXXXXXX. ", -".oXXXXXXXXXX. ", -".XoXXXXXXXXXX. ", -".XXoXXXXXXXXXX. ", -".XXXoXXXXXXXXX..", -".XXXXoXXXXXX..O ", -" .XXXXoXXX..O+O ", -" .XXXXo..O++o..", -" .XXX.O+++o.. ", -" .XX.o+o.. ", -" .X.o.. ", -" ... "}; +/* XPM */ +static const char *const htmfoldr_xpm[] = { +"16 16 6 1", +" c None", +". c Black", +"X c #000080", +"o c #c0c0c0", +"O c #808080", +"+ c Gray100", +" ", +" .. ", +" ..XX. ", +" ..XXXXX. ", +" ..XXXXXXXX. ", +".oXXXXXXXXXX. ", +".XoXXXXXXXXXX. ", +".XXoXXXXXXXXXX. ", +".XXXoXXXXXXXXX..", +".XXXXoXXXXXX..O ", +" .XXXXoXXX..O+O ", +" .XXXXo..O++o..", +" .XXX.O+++o.. ", +" .XX.o+o.. ", +" .X.o.. ", +" ... "}; diff --git a/Externals/wxWidgets3/art/htmoptns.xpm b/Externals/wxWidgets3/art/htmoptns.xpm index 0d178ab2e1..8806749ea4 100644 --- a/Externals/wxWidgets3/art/htmoptns.xpm +++ b/Externals/wxWidgets3/art/htmoptns.xpm @@ -1,20 +1,20 @@ -/* XPM */ -static const char *const htmoptns_xpm[] = { -"16 15 2 1", -" c None", -". c #000000", -" ", -" .. ", -" ... ", -" .... ", -" . ... ", -" .. ... ", -" . .. ", -" .. ... ", -" . .. ", -" ......... ", -" .. ... ", -" . ... ", -" .. ... ", -" .... ....... ", -" "}; +/* XPM */ +static const char *const htmoptns_xpm[] = { +"16 15 2 1", +" c None", +". c #000000", +" ", +" .. ", +" ... ", +" .... ", +" . ... ", +" .. ... ", +" . .. ", +" .. ... ", +" . .. ", +" ......... ", +" .. ... ", +" . ... ", +" .. ... ", +" .... ....... ", +" "}; diff --git a/Externals/wxWidgets3/art/htmpage.xpm b/Externals/wxWidgets3/art/htmpage.xpm index f7d9f472ab..e4fa3fbc71 100644 --- a/Externals/wxWidgets3/art/htmpage.xpm +++ b/Externals/wxWidgets3/art/htmpage.xpm @@ -1,23 +1,23 @@ -/* XPM */ -static const char *const htmpage_xpm[] = { -"16 16 4 1", -" c None", -". c #808080", -"X c Gray100", -"o c Black", -" ", -" .......... ", -" .XXXXXXXX.. ", -" .XXXXXXXXooo ", -" .X......XXXo ", -" .XXXXXXXXXXo ", -" .X........Xo ", -" .XXXXXXXXXXo ", -" .X........Xo ", -" .XXXXXXXXXXo ", -" .X........Xo ", -" .XXXXXXXXXXo ", -" .X........Xo ", -" .XXXXXXXXXXo ", -" .XXXXXXXXXXo ", -" oooooooooooo "}; +/* XPM */ +static const char *const htmpage_xpm[] = { +"16 16 4 1", +" c None", +". c #808080", +"X c Gray100", +"o c Black", +" ", +" .......... ", +" .XXXXXXXX.. ", +" .XXXXXXXXooo ", +" .X......XXXo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .XXXXXXXXXXo ", +" oooooooooooo "}; diff --git a/Externals/wxWidgets3/art/htmsidep.xpm b/Externals/wxWidgets3/art/htmsidep.xpm index 19bb863730..30f6a92392 100644 --- a/Externals/wxWidgets3/art/htmsidep.xpm +++ b/Externals/wxWidgets3/art/htmsidep.xpm @@ -1,27 +1,27 @@ -/* XPM */ -static const char *const htmsidep_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 6 1", -". c Black", -"X c #FFFFFF", -"+ c #808080", -" c None", -"O c #0000C0", -"o c #C0C0C0", -/* pixels */ -" ", -" .............. ", -" .XXXX.ooooooo. ", -" .XOXX.oo...oo. ", -" .XXOX.ooooooo. ", -" .OOOO.o...+.o. ", -" .XXOX.ooooooo. ", -" .XOXX.ooooooo. ", -" .XXXX.o..+ooo. ", -" .XXOX.ooooooo. ", -" .XOXX.o...+.o. ", -" .OOOO.ooooooo. ", -" .XOXX.o.+...o. ", -" .XXOX.ooooooo. ", -" .............. " -}; +/* XPM */ +static const char *const htmsidep_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 6 1", +". c Black", +"X c #FFFFFF", +"+ c #808080", +" c None", +"O c #0000C0", +"o c #C0C0C0", +/* pixels */ +" ", +" .............. ", +" .XXXX.ooooooo. ", +" .XOXX.oo...oo. ", +" .XXOX.ooooooo. ", +" .OOOO.o...+.o. ", +" .XXOX.ooooooo. ", +" .XOXX.ooooooo. ", +" .XXXX.o..+ooo. ", +" .XXOX.ooooooo. ", +" .XOXX.o...+.o. ", +" .OOOO.ooooooo. ", +" .XOXX.o.+...o. ", +" .XXOX.ooooooo. ", +" .............. " +}; diff --git a/Externals/wxWidgets3/art/listview.xpm b/Externals/wxWidgets3/art/listview.xpm index 2d8afc4198..30f748abb4 100644 --- a/Externals/wxWidgets3/art/listview.xpm +++ b/Externals/wxWidgets3/art/listview.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static const char *const listview_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 4 1", -" c Black", -". c #FFFFFF", -"X c #000084", -"o c #848484", -/* pixels */ -" ", -" .............. ", -" .XXX.......... ", -" .XXX. o o . ", -" .XXX.......... ", -" .............. ", -" .XXX.......... ", -" .XXX. o . ", -" .XXX.......... ", -" .............. ", -" .XXX.......... ", -" .XXX. o o . ", -" .XXX.......... ", -" .............. ", -" " -}; +/* XPM */ +static const char *const listview_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 4 1", +" c Black", +". c #FFFFFF", +"X c #000084", +"o c #848484", +/* pixels */ +" ", +" .............. ", +" .XXX.......... ", +" .XXX. o o . ", +" .XXX.......... ", +" .............. ", +" .XXX.......... ", +" .XXX. o . ", +" .XXX.......... ", +" .............. ", +" .XXX.......... ", +" .XXX. o o . ", +" .XXX.......... ", +" .............. ", +" " +}; diff --git a/Externals/wxWidgets3/art/missimg.xpm b/Externals/wxWidgets3/art/missimg.xpm index 599aca7896..80eecbcf2a 100644 --- a/Externals/wxWidgets3/art/missimg.xpm +++ b/Externals/wxWidgets3/art/missimg.xpm @@ -1,43 +1,43 @@ -/* XPM */ -static const char *const missimg_xpm[] = { -/* columns rows colors chars-per-pixel */ -"32 32 5 1", -"X c Black", -"o c #FFFFFF", -" c None", -". c #C0C0C0", -"O c #E0E0E0", -/* pixels */ -" .............................X ", -" .ooooooooooooooooooooooooooooX ", -" .ooooooooooooooooooooooooooooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOXOOOOOOOOOOOOOOOOooX ", -" XXXOOOOOXX XOOOOOOOOOOOOOOOooX ", -" XXXXX XOOOOOOOOOOOOOOooX ", -" XOOOXXXOOOOOOOooX ", -" XXX XXOOOOOooX ", -" XOOOOooX ", -" . XOOOooX ", -" .. XXOooX ", -" .o.. XooX ", -" .ooO... XXX ", -" .ooOOOO.......... ", -" .ooOOOOOOOOOOOOOO.. ", -" .ooOOOOOOOOOOOOOOOO.. ", -" .ooOOOOOOOOOOOOOOOOOO......... ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", -" .ooooooooooooooooooooooooooooX ", -" .ooooooooooooooooooooooooooooX ", -" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " -}; +/* XPM */ +static const char *const missimg_xpm[] = { +/* columns rows colors chars-per-pixel */ +"32 32 5 1", +"X c Black", +"o c #FFFFFF", +" c None", +". c #C0C0C0", +"O c #E0E0E0", +/* pixels */ +" .............................X ", +" .ooooooooooooooooooooooooooooX ", +" .ooooooooooooooooooooooooooooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOXOOOOOOOOOOOOOOOOooX ", +" XXXOOOOOXX XOOOOOOOOOOOOOOOooX ", +" XXXXX XOOOOOOOOOOOOOOooX ", +" XOOOXXXOOOOOOOooX ", +" XXX XXOOOOOooX ", +" XOOOOooX ", +" . XOOOooX ", +" .. XXOooX ", +" .o.. XooX ", +" .ooO... XXX ", +" .ooOOOO.......... ", +" .ooOOOOOOOOOOOOOO.. ", +" .ooOOOOOOOOOOOOOOOO.. ", +" .ooOOOOOOOOOOOOOOOOOO......... ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooooooooooooooooooooooooooooX ", +" .ooooooooooooooooooooooooooooX ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " +}; diff --git a/Externals/wxWidgets3/art/motif/error.xpm b/Externals/wxWidgets3/art/motif/error.xpm index 559715c64c..2505d3d4a8 100644 --- a/Externals/wxWidgets3/art/motif/error.xpm +++ b/Externals/wxWidgets3/art/motif/error.xpm @@ -1,58 +1,58 @@ -/* XPM */ -static const char *const error_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 4 1", -" c None", -"X c #242424", -"o c #DCDF00", -". c #C00000", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ..... ", -" ............. ", -" ................. ", -" ................... ", -" ....................... ", -" ......................... ", -" ........................... ", -" ...........................X ", -" .............................X ", -" ............................... ", -" ...............................X ", -" .................................X ", -" .................................X ", -" .................................XX ", -" ...ooooooooooooooooooooooooooo...XX ", -" ....ooooooooooooooooooooooooooo....X ", -" ....ooooooooooooooooooooooooooo....X ", -" ....ooooooooooooooooooooooooooo....XX ", -" ....ooooooooooooooooooooooooooo....XX ", -" ....ooooooooooooooooooooooooooo....XX ", -" ...ooooooooooooooooooooooooooo...XXX ", -" ...ooooooooooooooooooooooooooo...XXX ", -" .................................XX ", -" .................................XX ", -" ...............................XXX ", -" ...............................XXX ", -" .............................XXX ", -" ...........................XXXX ", -" ...........................XXX ", -" .........................XXX ", -" .......................XXXX ", -" X...................XXXXX ", -" X.................XXXXX ", -" X.............XXXXX ", -" XXXX.....XXXXXXXX ", -" XXXXXXXXXXXXX ", -" XXXXX ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const error_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 4 1", +" c None", +"X c #242424", +"o c #DCDF00", +". c #C00000", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" ......................... ", +" ........................... ", +" ...........................X ", +" .............................X ", +" ............................... ", +" ...............................X ", +" .................................X ", +" .................................X ", +" .................................XX ", +" ...ooooooooooooooooooooooooooo...XX ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" .................................XX ", +" .................................XX ", +" ...............................XXX ", +" ...............................XXX ", +" .............................XXX ", +" ...........................XXXX ", +" ...........................XXX ", +" .........................XXX ", +" .......................XXXX ", +" X...................XXXXX ", +" X.................XXXXX ", +" X.............XXXXX ", +" XXXX.....XXXXXXXX ", +" XXXXXXXXXXXXX ", +" XXXXX ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/motif/info.xpm b/Externals/wxWidgets3/art/motif/info.xpm index fe32e61982..8883955448 100644 --- a/Externals/wxWidgets3/art/motif/info.xpm +++ b/Externals/wxWidgets3/art/motif/info.xpm @@ -1,63 +1,63 @@ -/* XPM */ -static const char *const info_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 9 1", -"$ c Black", -"O c #FFFFFF", -"@ c #808080", -"+ c #000080", -"o c #E8EB01", -" c None", -"X c #FFFF40", -"# c #C0C0C0", -". c #ABAD01", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ..... ", -" ..XXXXX.. ", -" ..XXXXXXXXo.. ", -" .XXXOXXXXXXXoo. ", -" .XOOXXX+XXXXXo. ", -" .XOOOXX+++XXXXoo. ", -" .XOOXXX+++XXXXXo. ", -" .XOOOXXX+++XXXXXXo. ", -" .XOOXXXX+++XXXXXXo. ", -" .XXXXXXX+++XXXXXXX. ", -" .XXXXXXX+++XXXXXXo. ", -" .XXXXXXX+++XXXXXoo. ", -" .XXXXXX+++XXXXXo. ", -" .XXXXXXX+XXXXXXo. ", -" .XXXXXXXXXXXXo. ", -" .XXXXX+++XXXoo. ", -" .XXXX+++XXoo. ", -" .XXXXXXXXo. ", -" ..XXXXXXo.. ", -" .XXXXXo.. ", -" @#######@ ", -" @@@@@@@@@ ", -" @#######@ ", -" @@@@@@@@@ ", -" @#######@ ", -" @@@@@@@ ", -" ### ", -" $$$ ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const info_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"$ c Black", +"O c #FFFFFF", +"@ c #808080", +"+ c #000080", +"o c #E8EB01", +" c None", +"X c #FFFF40", +"# c #C0C0C0", +". c #ABAD01", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ..XXXXX.. ", +" ..XXXXXXXXo.. ", +" .XXXOXXXXXXXoo. ", +" .XOOXXX+XXXXXo. ", +" .XOOOXX+++XXXXoo. ", +" .XOOXXX+++XXXXXo. ", +" .XOOOXXX+++XXXXXXo. ", +" .XOOXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXXX. ", +" .XXXXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXoo. ", +" .XXXXXX+++XXXXXo. ", +" .XXXXXXX+XXXXXXo. ", +" .XXXXXXXXXXXXo. ", +" .XXXXX+++XXXoo. ", +" .XXXX+++XXoo. ", +" .XXXXXXXXo. ", +" ..XXXXXXo.. ", +" .XXXXXo.. ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@ ", +" ### ", +" $$$ ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/motif/question.xpm b/Externals/wxWidgets3/art/motif/question.xpm index cb0001ec80..701f4457ba 100644 --- a/Externals/wxWidgets3/art/motif/question.xpm +++ b/Externals/wxWidgets3/art/motif/question.xpm @@ -1,75 +1,75 @@ -/* XPM */ -static const char *const question_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 21 1", -". c Black", -"> c #696969", -"O c #1F1F00", -"+ c #181818", -"o c #F6F900", -"; c #3F3F00", -"$ c #111111", -" c None", -"& c #202020", -"X c #AAAA00", -"@ c #949400", -": c #303030", -"1 c #383838", -"% c #2A2A00", -", c #404040", -"= c #B4B400", -"- c #484848", -"# c #151500", -"< c #9F9F00", -"2 c #6A6A00", -"* c #353500", -/* pixels */ -" ", -" ", -" ", -" ", -" ......... ", -" ...XXXXXXX.. ", -" ..XXXXoooooXXXO+ ", -" ..XXooooooooooooX@.. ", -" ..XoooooooooooooooXX#. ", -" $%XoooooooooooooooooXX#. ", -" &.XoooooooXXXXXXooooooXX.. ", -" .XooooooXX.$...$XXoooooX*. ", -" $.XoooooX%.$ .*oooooo=.. ", -" .XooooooX.. -.XoooooX.. ", -" .XoooooX..+ .XoooooX;. ", -" ...XXXX..: .XoooooX;. ", -" ........ >.XoooooX;. ", -" +.XoooooX.. ", -" ,.Xoooooo<.. ", -" 1#XooooooXO.. ", -" &#XooooooX2.. ", -" $%XooooooXX.. ", -" $%XooooooXX.. ", -" $%XooooooXX.. ", -" &.XooooooXX.. ", -" .XooooooXX.. ", -" &.XoooooXX.. ", -" ..XooooXX.. ", -" ..XooooX... ", -" ..XXooXX..& ", -" ...XXXXX.. ", -" ........ ", -" ", -" ", -" ....... ", -" ..XXXXX.. ", -" ..XXoooXX.. ", -" ..XoooooX.. ", -" ..XoooooX.. ", -" ..XXoooXX.. ", -" ..XXXXX.. ", -" ....... ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const question_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 21 1", +". c Black", +"> c #696969", +"O c #1F1F00", +"+ c #181818", +"o c #F6F900", +"; c #3F3F00", +"$ c #111111", +" c None", +"& c #202020", +"X c #AAAA00", +"@ c #949400", +": c #303030", +"1 c #383838", +"% c #2A2A00", +", c #404040", +"= c #B4B400", +"- c #484848", +"# c #151500", +"< c #9F9F00", +"2 c #6A6A00", +"* c #353500", +/* pixels */ +" ", +" ", +" ", +" ", +" ......... ", +" ...XXXXXXX.. ", +" ..XXXXoooooXXXO+ ", +" ..XXooooooooooooX@.. ", +" ..XoooooooooooooooXX#. ", +" $%XoooooooooooooooooXX#. ", +" &.XoooooooXXXXXXooooooXX.. ", +" .XooooooXX.$...$XXoooooX*. ", +" $.XoooooX%.$ .*oooooo=.. ", +" .XooooooX.. -.XoooooX.. ", +" .XoooooX..+ .XoooooX;. ", +" ...XXXX..: .XoooooX;. ", +" ........ >.XoooooX;. ", +" +.XoooooX.. ", +" ,.Xoooooo<.. ", +" 1#XooooooXO.. ", +" &#XooooooX2.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" &.XooooooXX.. ", +" .XooooooXX.. ", +" &.XoooooXX.. ", +" ..XooooXX.. ", +" ..XooooX... ", +" ..XXooXX..& ", +" ...XXXXX.. ", +" ........ ", +" ", +" ", +" ....... ", +" ..XXXXX.. ", +" ..XXoooXX.. ", +" ..XoooooX.. ", +" ..XoooooX.. ", +" ..XXoooXX.. ", +" ..XXXXX.. ", +" ....... ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/motif/warning.xpm b/Externals/wxWidgets3/art/motif/warning.xpm index 58aee153fe..35e60316c3 100644 --- a/Externals/wxWidgets3/art/motif/warning.xpm +++ b/Externals/wxWidgets3/art/motif/warning.xpm @@ -1,63 +1,63 @@ -/* XPM */ -static const char *const warning_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 9 1", -"@ c Black", -"o c #A6A800", -"+ c #8A8C00", -"$ c #B8BA00", -" c None", -"O c #6E7000", -"X c #DCDF00", -". c #C00000", -"# c #373800", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" . ", -" ... ", -" ... ", -" ..... ", -" ...X.. ", -" ..XXX.. ", -" ...XXX... ", -" ..XXXXX.. ", -" ..XXXXXX... ", -" ...XXoO+XX.. ", -" ..XXXO@#XXX.. ", -" ..XXXXO@#XXX... ", -" ...XXXXO@#XXXX.. ", -" ..XXXXXO@#XXXX... ", -" ...XXXXXo@OXXXXX.. ", -" ...XXXXXXo@OXXXXXX.. ", -" ..XXXXXXX$@OXXXXXX... ", -" ...XXXXXXXX@XXXXXXXX.. ", -" ...XXXXXXXXXXXXXXXXXX... ", -" ..XXXXXXXXXXOXXXXXXXXX.. ", -" ...XXXXXXXXXO@#XXXXXXXXX.. ", -" ..XXXXXXXXXXX#XXXXXXXXXX... ", -" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", -" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", -" .............................. ", -" .............................. ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" " -}; +/* XPM */ +static const char *const warning_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"@ c Black", +"o c #A6A800", +"+ c #8A8C00", +"$ c #B8BA00", +" c None", +"O c #6E7000", +"X c #DCDF00", +". c #C00000", +"# c #373800", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" ..... ", +" ...X.. ", +" ..XXX.. ", +" ...XXX... ", +" ..XXXXX.. ", +" ..XXXXXX... ", +" ...XXoO+XX.. ", +" ..XXXO@#XXX.. ", +" ..XXXXO@#XXX... ", +" ...XXXXO@#XXXX.. ", +" ..XXXXXO@#XXXX... ", +" ...XXXXXo@OXXXXX.. ", +" ...XXXXXXo@OXXXXXX.. ", +" ..XXXXXXX$@OXXXXXX... ", +" ...XXXXXXXX@XXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXX... ", +" ..XXXXXXXXXXOXXXXXXXXX.. ", +" ...XXXXXXXXXO@#XXXXXXXXX.. ", +" ..XXXXXXXXXXX#XXXXXXXXXX... ", +" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", +" .............................. ", +" .............................. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets3/art/new.xpm b/Externals/wxWidgets3/art/new.xpm index 15826c8d22..6a0b133350 100644 --- a/Externals/wxWidgets3/art/new.xpm +++ b/Externals/wxWidgets3/art/new.xpm @@ -1,50 +1,50 @@ -/* XPM */ -static const char *const new_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 29 1", -"* c #97C4E7", -"- c #72A8D2", -": c #FFFFFF", -"9 c #839CB5", -"o c #6B98B8", -"X c #5A89A6", -"# c #3A749C", -", c #D1E5F5", -"0 c #85A7BC", -"$ c #C3DDF1", -"8 c #749BB4", -"; c #5F9BC8", -" c None", -"+ c #538DB3", -"= c #85BBE2", -"3 c #EFF6FC", -"O c #6591AE", -"5 c #F7FBFD", -"7 c #FAFCFE", -"< c #DAEAF7", -"4 c #E9F3FA", -"6 c #FDFDFE", -"1 c #E2EFF8", -". c #8EA9BC", -"% c #B6D5EE", -"& c #A5CCEA", -"> c #ACE95B", -"2 c #F4F9FD", -"@ c #4581AA", -/* pixels */ -" .XoOO+@#. ", -" .$$%&*=O-; ", -" @@@@$%&*O:*o ", -" @>>@$$%&O::*o ", -"@@@>>@@@$%OOoO+ ", -"@>>>>>>@,$%&*=+ ", -"@>>>>>>@<,$%&*+ ", -"@@@>>@@@1<,$%&O ", -" @>>@2341<,$%O ", -" @@@@52341<,$o ", -" .:6752341<,8 ", -" .::6752341<8 ", -" .:::67523419 ", -" .::::6752340 ", -" ............ " -}; +/* XPM */ +static const char *const new_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 29 1", +"* c #97C4E7", +"- c #72A8D2", +": c #FFFFFF", +"9 c #839CB5", +"o c #6B98B8", +"X c #5A89A6", +"# c #3A749C", +", c #D1E5F5", +"0 c #85A7BC", +"$ c #C3DDF1", +"8 c #749BB4", +"; c #5F9BC8", +" c None", +"+ c #538DB3", +"= c #85BBE2", +"3 c #EFF6FC", +"O c #6591AE", +"5 c #F7FBFD", +"7 c #FAFCFE", +"< c #DAEAF7", +"4 c #E9F3FA", +"6 c #FDFDFE", +"1 c #E2EFF8", +". c #8EA9BC", +"% c #B6D5EE", +"& c #A5CCEA", +"> c #ACE95B", +"2 c #F4F9FD", +"@ c #4581AA", +/* pixels */ +" .XoOO+@#. ", +" .$$%&*=O-; ", +" @@@@$%&*O:*o ", +" @>>@$$%&O::*o ", +"@@@>>@@@$%OOoO+ ", +"@>>>>>>@,$%&*=+ ", +"@>>>>>>@<,$%&*+ ", +"@@@>>@@@1<,$%&O ", +" @>>@2341<,$%O ", +" @@@@52341<,$o ", +" .:6752341<,8 ", +" .::6752341<8 ", +" .:::67523419 ", +" .::::6752340 ", +" ............ " +}; diff --git a/Externals/wxWidgets3/art/new_dir.xpm b/Externals/wxWidgets3/art/new_dir.xpm index f49515e71b..d100eea753 100644 --- a/Externals/wxWidgets3/art/new_dir.xpm +++ b/Externals/wxWidgets3/art/new_dir.xpm @@ -1,43 +1,43 @@ -/* XPM */ -static const char *const new_dir_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 22 1", -"X c Black", -"> c #9BACC2", -"o c #547897", -"1 c #7F99B4", -"O c #D1D9E5", -"< c #EAEDF3", -"# c #CAD2DC", -"3 c #718BA7", -"@ c #BECAD9", -"& c #E1E6EE", -"; c #F5F6F7", -". c #FFFF00", -", c #8DA0B9", -" c None", -"% c #D6DFE7", -"$ c #D2D9E0", -"- c #ADBACE", -"= c #EEF1F3", -"+ c #B3BFD1", -"2 c #7A90AC", -": c #A2B3C5", -"* c #E5EAF1", -/* pixels */ -" .X .XX.", -" ooooo .X.X. ", -" oOOOOo XX...XX", -" oooooooo.......", -" o+@#$%&*XX...XX", -" o+@#$%&*=.X.X. ", -" o-+@#O%&.X;.X .", -" o:-+@#O%&*=;o ", -" o>:-+@#O%&*=o ", -" o,>:-+@#O%&:-+@#O%&o ", -" o21,>:-+@#O%o ", -" o321,>:-+@#Oo ", -" ooooooooooooo ", -" " -}; +/* XPM */ +static const char *const new_dir_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 22 1", +"X c Black", +"> c #9BACC2", +"o c #547897", +"1 c #7F99B4", +"O c #D1D9E5", +"< c #EAEDF3", +"# c #CAD2DC", +"3 c #718BA7", +"@ c #BECAD9", +"& c #E1E6EE", +"; c #F5F6F7", +". c #FFFF00", +", c #8DA0B9", +" c None", +"% c #D6DFE7", +"$ c #D2D9E0", +"- c #ADBACE", +"= c #EEF1F3", +"+ c #B3BFD1", +"2 c #7A90AC", +": c #A2B3C5", +"* c #E5EAF1", +/* pixels */ +" .X .XX.", +" ooooo .X.X. ", +" oOOOOo XX...XX", +" oooooooo.......", +" o+@#$%&*XX...XX", +" o+@#$%&*=.X.X. ", +" o-+@#O%&.X;.X .", +" o:-+@#O%&*=;o ", +" o>:-+@#O%&*=o ", +" o,>:-+@#O%&:-+@#O%&o ", +" o21,>:-+@#O%o ", +" o321,>:-+@#Oo ", +" ooooooooooooo ", +" " +}; diff --git a/Externals/wxWidgets3/art/paste.xpm b/Externals/wxWidgets3/art/paste.xpm index a2155a3e9b..2458378f86 100644 --- a/Externals/wxWidgets3/art/paste.xpm +++ b/Externals/wxWidgets3/art/paste.xpm @@ -1,46 +1,46 @@ -/* XPM */ -static const char *const paste_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 25 1", -"< c #FEECE4", -"> c #FEE3D7", -"O c #FFFFFF", -"o c #7B767D", -"% c #F79586", -"& c #CAE1F3", -"@ c #F08B62", -"# c #FCCBB8", -"- c #FDD8C9", -"4 c #FFF8F4", -"5 c #FFF5F0", -" c None", -"$ c #F8AA8F", -", c #EFF6FC", -"1 c #F7FBFD", -"2 c #FAFCFE", -"; c #DAEAF7", -": c #E9F3FA", -"6 c #FFFAF8", -". c #3C78A6", -"3 c #FFF1ED", -"X c #9B8687", -"+ c #FBBCA4", -"* c #B6D5EE", -"= c #F4F9FD", -/* pixels */ -" ...... ", -" .XoOOOOoo. ", -".+XOOOOOOX@. ", -".+XXXXXXXX@. ", -".#++$$%@..... ", -".##++$$%.&*.=. ", -".-##++$$.;&.==. ", -".--##++$.:;.... ", -".>--##++.,:;&*. ", -".<>--##+.1,:;&. ", -".<<>--##.21,:;. ", -".3<<>--#.O21=:. ", -".45<<>--....... ", -".6453<>----. ", -"............ " -}; +/* XPM */ +static const char *const paste_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 25 1", +"< c #FEECE4", +"> c #FEE3D7", +"O c #FFFFFF", +"o c #7B767D", +"% c #F79586", +"& c #CAE1F3", +"@ c #F08B62", +"# c #FCCBB8", +"- c #FDD8C9", +"4 c #FFF8F4", +"5 c #FFF5F0", +" c None", +"$ c #F8AA8F", +", c #EFF6FC", +"1 c #F7FBFD", +"2 c #FAFCFE", +"; c #DAEAF7", +": c #E9F3FA", +"6 c #FFFAF8", +". c #3C78A6", +"3 c #FFF1ED", +"X c #9B8687", +"+ c #FBBCA4", +"* c #B6D5EE", +"= c #F4F9FD", +/* pixels */ +" ...... ", +" .XoOOOOoo. ", +".+XOOOOOOX@. ", +".+XXXXXXXX@. ", +".#++$$%@..... ", +".##++$$%.&*.=. ", +".-##++$$.;&.==. ", +".--##++$.:;.... ", +".>--##++.,:;&*. ", +".<>--##+.1,:;&. ", +".<<>--##.21,:;. ", +".3<<>--#.O21=:. ", +".45<<>--....... ", +".6453<>----. ", +"............ " +}; diff --git a/Externals/wxWidgets3/art/print.xpm b/Externals/wxWidgets3/art/print.xpm index 9afe540134..dbdfe6b4d9 100644 --- a/Externals/wxWidgets3/art/print.xpm +++ b/Externals/wxWidgets3/art/print.xpm @@ -1,60 +1,60 @@ -/* XPM */ -static const char *const print_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 39 1", -"< c #E3E4E6", -"+ c #C3C3C4", -"i c #FFFFFF", -": c #74879B", -"# c #5A89A6", -"a c #F1F4F7", -"r c #5A809C", -"@ c #BDCCD9", -"e c #7A92A4", -"% c #3F6F93", -"t c #9FA2A6", -"3 c #939495", -"w c #5F666D", -"9 c #65839E", -"5 c #4A7291", -"$ c #4B7F9E", -" c None", -"O c #DFE0E2", -"o c #F3F3F3", -"; c #84A5BB", -"& c #467291", -". c #7897AD", -"* c #407598", -"4 c #CFCFD0", -"7 c #6F90A6", -"y c #6A89A2", -"0 c #AAADB2", -"1 c #D2D3D4", -"u c #4F7592", -", c #BCBDBE", -"p c #57778E", -"q c #979BA0", -"2 c #ABABAC", -"- c #E7E7E7", -"= c #D6DEE6", -"> c #9FA0A0", -"8 c #829EB5", -"X c #8FB0C3", -"6 c #5D7C93", -/* pixels */ -" .XXXXXXXX ", -" .oooooooX ", -" .OOOOOOOX ", -" .+++++++X ", -"@##$%&&&&&%*##@ ", -"$=-;:>,<123$-=$ ", -".44.5678.96$44. ", -"7,,,,,,,,,,,,,7 ", -"900qwwwwwwwe009 ", -"rtt9ryyyyyyuttr ", -"6qq6iiiiiii%qq6 ", -"633paiiiiii%336 ", -"XXX*iiiiiii%XXX ", -" 6iiiiiii% ", -" $XXXXXXX# " -}; +/* XPM */ +static const char *const print_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 39 1", +"< c #E3E4E6", +"+ c #C3C3C4", +"i c #FFFFFF", +": c #74879B", +"# c #5A89A6", +"a c #F1F4F7", +"r c #5A809C", +"@ c #BDCCD9", +"e c #7A92A4", +"% c #3F6F93", +"t c #9FA2A6", +"3 c #939495", +"w c #5F666D", +"9 c #65839E", +"5 c #4A7291", +"$ c #4B7F9E", +" c None", +"O c #DFE0E2", +"o c #F3F3F3", +"; c #84A5BB", +"& c #467291", +". c #7897AD", +"* c #407598", +"4 c #CFCFD0", +"7 c #6F90A6", +"y c #6A89A2", +"0 c #AAADB2", +"1 c #D2D3D4", +"u c #4F7592", +", c #BCBDBE", +"p c #57778E", +"q c #979BA0", +"2 c #ABABAC", +"- c #E7E7E7", +"= c #D6DEE6", +"> c #9FA0A0", +"8 c #829EB5", +"X c #8FB0C3", +"6 c #5D7C93", +/* pixels */ +" .XXXXXXXX ", +" .oooooooX ", +" .OOOOOOOX ", +" .+++++++X ", +"@##$%&&&&&%*##@ ", +"$=-;:>,<123$-=$ ", +".44.5678.96$44. ", +"7,,,,,,,,,,,,,7 ", +"900qwwwwwwwe009 ", +"rtt9ryyyyyyuttr ", +"6qq6iiiiiii%qq6 ", +"633paiiiiii%336 ", +"XXX*iiiiiii%XXX ", +" 6iiiiiii% ", +" $XXXXXXX# " +}; diff --git a/Externals/wxWidgets3/art/quit.xpm b/Externals/wxWidgets3/art/quit.xpm index df8abd675d..885bbd0fa4 100644 --- a/Externals/wxWidgets3/art/quit.xpm +++ b/Externals/wxWidgets3/art/quit.xpm @@ -1,90 +1,90 @@ -/* XPM */ -static const char *const quit_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 69 1", -"@ c Black", -"i c #9AEA53", -"D c #7E9BB1", -"H c #839FB4", -", c #B7C7D3", -"8 c #BCCBD6", -"7 c #C1CFDA", -"v c #92ABBD", -"- c #D0DBE2", -"O c #547897", -"+ c #376485", -"L c #7090A8", -"t c #AEC0CE", -"g c #B3C4D1", -"S c #84A0B4", -"G c #89A4B8", -"> c #BDCCD7", -"F c #5A809C", -"2 c #C2D0DA", -"k c #93ACBE", -"= c #D6E0E6", -"* c #446A8C", -"z c #A5B9C8", -"# c #DEE5EB", -"0 c #AFC1CE", -"r c #B4C5D2", -"p c #B9C9D5", -"A c #8AA5B8", -"M c #92AABD", -"j c #A6BAC9", -"K c #7796AC", -"l c #ABBECC", -"o c #E4EAEF", -"9 c #B5C6D2", -" c None", -"; c #C9D6DF", -"X c #305F81", -"m c #98AFC0", -"V c #9DB3C3", -"% c #D1DBE3", -"u c #A2B7C6", -"y c #A7BBCA", -"h c #ACBFCD", -"4 c #B6C7D3", -"w c #C0CFD9", -"d c #982106", -"B c #85A0B5", -"6 c #C8D4DE", -"c c #99B0C1", -"x c #9EB4C4", -"$ c #D7E0E7", -"q c #A8BCCA", -"s c #ADC0CD", -"3 c #BCCCD7", -"N c #8BA5B9", -": c #C4D1DB", -"1 c #C9D5DE", -"f c #9AB1C2", -"n c #A4B9C8", -"a c #B3C5D1", -". c #215579", -"J c #7D9AB0", -"& c #829EB5", -"e c #BBCAD6", -"b c #8CA6B9", -"Z c #91AABC", -"C c #96AEC0", -"< c #CFDAE2", -"5 c #AFC2CF", -/* pixels */ -" ..XXXXXXXXXX ", -" XoO+X@@@@@@X ", -" X#$%&X*@@@@X ", -" X=-;:>,X@@@X ", -" X<12345X@@@X ", -" X67890qX@XXX ", -" XwertyuX@XiX ", -" XpasddfX++iiX ", -" XghjddkXiiiiiX ", -" XlzxcvbXiiiiiiX", -" XnxmMNBXiiiiiX ", -" XVCZASDXXXiiX ", -" XXFGHJKX XiX ", -" FXXFLX XX ", -" XX* " -}; +/* XPM */ +static const char *const quit_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 69 1", +"@ c Black", +"i c #9AEA53", +"D c #7E9BB1", +"H c #839FB4", +", c #B7C7D3", +"8 c #BCCBD6", +"7 c #C1CFDA", +"v c #92ABBD", +"- c #D0DBE2", +"O c #547897", +"+ c #376485", +"L c #7090A8", +"t c #AEC0CE", +"g c #B3C4D1", +"S c #84A0B4", +"G c #89A4B8", +"> c #BDCCD7", +"F c #5A809C", +"2 c #C2D0DA", +"k c #93ACBE", +"= c #D6E0E6", +"* c #446A8C", +"z c #A5B9C8", +"# c #DEE5EB", +"0 c #AFC1CE", +"r c #B4C5D2", +"p c #B9C9D5", +"A c #8AA5B8", +"M c #92AABD", +"j c #A6BAC9", +"K c #7796AC", +"l c #ABBECC", +"o c #E4EAEF", +"9 c #B5C6D2", +" c None", +"; c #C9D6DF", +"X c #305F81", +"m c #98AFC0", +"V c #9DB3C3", +"% c #D1DBE3", +"u c #A2B7C6", +"y c #A7BBCA", +"h c #ACBFCD", +"4 c #B6C7D3", +"w c #C0CFD9", +"d c #982106", +"B c #85A0B5", +"6 c #C8D4DE", +"c c #99B0C1", +"x c #9EB4C4", +"$ c #D7E0E7", +"q c #A8BCCA", +"s c #ADC0CD", +"3 c #BCCCD7", +"N c #8BA5B9", +": c #C4D1DB", +"1 c #C9D5DE", +"f c #9AB1C2", +"n c #A4B9C8", +"a c #B3C5D1", +". c #215579", +"J c #7D9AB0", +"& c #829EB5", +"e c #BBCAD6", +"b c #8CA6B9", +"Z c #91AABC", +"C c #96AEC0", +"< c #CFDAE2", +"5 c #AFC2CF", +/* pixels */ +" ..XXXXXXXXXX ", +" XoO+X@@@@@@X ", +" X#$%&X*@@@@X ", +" X=-;:>,X@@@X ", +" X<12345X@@@X ", +" X67890qX@XXX ", +" XwertyuX@XiX ", +" XpasddfX++iiX ", +" XghjddkXiiiiiX ", +" XlzxcvbXiiiiiiX", +" XnxmMNBXiiiiiX ", +" XVCZASDXXXiiX ", +" XXFGHJKX XiX ", +" FXXFLX XX ", +" XX* " +}; diff --git a/Externals/wxWidgets3/art/redo.xpm b/Externals/wxWidgets3/art/redo.xpm index d20afdcc8c..84ed3553ca 100644 --- a/Externals/wxWidgets3/art/redo.xpm +++ b/Externals/wxWidgets3/art/redo.xpm @@ -1,58 +1,58 @@ -/* XPM */ -static const char *const redo_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 37 1", -"4 c #9BACC2", -"; c #4C7398", -"3 c #547B99", -"* c #547897", -"# c #5A89A6", -"8 c #3A749C", -"5 c #5A809C", -", c #7F99B4", -"& c #3F6F93", -"9 c #85A7BC", -"+ c #749BB4", -"> c #718BA7", -"e c #A5B3C8", -"w c #BECAD9", -": c #65839D", -"u c #E1E6EE", -"o c #236289", -"r c #ADBED2", -"= c #597B9A", -"2 c #8DA0B9", -" c None", -"% c #467291", -"1 c #7393AB", -"i c #4C809F", -"- c #A0BACB", -"O c #6591AE", -"X c #407598", -"6 c #6F90A6", -"t c #D2D9E0", -"7 c #ADBACE", -"@ c #326A8F", -"0 c #467A9C", -". c #ACC4D3", -"< c #7F97B0", -"y c #B3BFD1", -"q c #A2B3C5", -"$ c #8FB0C3", -/* pixels */ -" .XoooO ", -" +o@@@@@o# +", -" $@%%&@&%%&@ +o", -" X*=@+-+@*=;@#&@", -" @:=+ @=:=*:@", -" &>:$ @:>>>@", -" &,,,,&", -" +123 @<2222&", -" X44X #@56<44X", -" O1748 .9#&o", -" 0qwe8 ", -" 8rty8 ", -" 8wu+ ", -" i## ", -" " -}; +/* XPM */ +static const char *const redo_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 37 1", +"4 c #9BACC2", +"; c #4C7398", +"3 c #547B99", +"* c #547897", +"# c #5A89A6", +"8 c #3A749C", +"5 c #5A809C", +", c #7F99B4", +"& c #3F6F93", +"9 c #85A7BC", +"+ c #749BB4", +"> c #718BA7", +"e c #A5B3C8", +"w c #BECAD9", +": c #65839D", +"u c #E1E6EE", +"o c #236289", +"r c #ADBED2", +"= c #597B9A", +"2 c #8DA0B9", +" c None", +"% c #467291", +"1 c #7393AB", +"i c #4C809F", +"- c #A0BACB", +"O c #6591AE", +"X c #407598", +"6 c #6F90A6", +"t c #D2D9E0", +"7 c #ADBACE", +"@ c #326A8F", +"0 c #467A9C", +". c #ACC4D3", +"< c #7F97B0", +"y c #B3BFD1", +"q c #A2B3C5", +"$ c #8FB0C3", +/* pixels */ +" .XoooO ", +" +o@@@@@o# +", +" $@%%&@&%%&@ +o", +" X*=@+-+@*=;@#&@", +" @:=+ @=:=*:@", +" &>:$ @:>>>@", +" &,,,,&", +" +123 @<2222&", +" X44X #@56<44X", +" O1748 .9#&o", +" 0qwe8 ", +" 8rty8 ", +" 8wu+ ", +" i## ", +" " +}; diff --git a/Externals/wxWidgets3/art/removable.xpm b/Externals/wxWidgets3/art/removable.xpm index 5b1d46b7dd..e066fd4df7 100644 --- a/Externals/wxWidgets3/art/removable.xpm +++ b/Externals/wxWidgets3/art/removable.xpm @@ -1,44 +1,44 @@ -/* XPM */ -static const char *const removable_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 15 23 1", -"@ c #C3C3C4", -"4 c #FFFFFF", -"o c #D5D6D8", -"> c #7A92A3", -". c #8497A5", -"% c #ACAEB2", -"2 c #4A7898", -": c #DCE2EA", -", c #F5F6F7", -"= c #EBEBEC", -"$ c #B7B7B8", -" c None", -"X c #DFE0E2", -"* c #A6A8AD", -"1 c #4C809F", -"3 c #407598", -"O c #CFCFD0", -"; c #9EA2A8", -"# c #BCBDBE", -"+ c #C6C8CA", -"- c #979BA0", -"& c #E7E7E7", -"< c #8FB0C3", -/* pixels */ -" ......... ", -" .XoO+@#$%. ", -" .XoO+@#$%. ", -" .&XoO+@#$%*. ", -" .&XoO+@#$%*. ", -" .=&XoO+@#$%*-. ", -" .=&XoO+@#$%*;. ", -".:=&XoO+@#$%*;>.", -".,=&XoO+@#$%*;-.", -"<..............<", -"<,=&XoO+@#$%%%%.", -" c #7A92A3", +". c #8497A5", +"% c #ACAEB2", +"2 c #4A7898", +": c #DCE2EA", +", c #F5F6F7", +"= c #EBEBEC", +"$ c #B7B7B8", +" c None", +"X c #DFE0E2", +"* c #A6A8AD", +"1 c #4C809F", +"3 c #407598", +"O c #CFCFD0", +"; c #9EA2A8", +"# c #BCBDBE", +"+ c #C6C8CA", +"- c #979BA0", +"& c #E7E7E7", +"< c #8FB0C3", +/* pixels */ +" ......... ", +" .XoO+@#$%. ", +" .XoO+@#$%. ", +" .&XoO+@#$%*. ", +" .&XoO+@#$%*. ", +" .=&XoO+@#$%*-. ", +" .=&XoO+@#$%*;. ", +".:=&XoO+@#$%*;>.", +".,=&XoO+@#$%*;-.", +"<..............<", +"<,=&XoO+@#$%%%%.", +" c #718BA7", -"0 c #A5B3C8", -"q c #BECAD9", -": c #65839D", -"u c #E1E6EE", -"X c #236289", -"y c #ADBED2", -"= c #597B9A", -"1 c #8DA0B9", -" c None", -"% c #467291", -"3 c #7393AB", -"i c #4C809F", -"; c #A0BACB", -". c #6591AE", -"o c #407598", -"5 c #6F90A6", -"t c #D2D9E0", -"9 c #ADBACE", -"# c #326A8F", -"e c #467A9C", -"O c #ACC4D3", -"< c #7F97B0", -"r c #B3BFD1", -"w c #A2B3C5", -"& c #8FB0C3", -/* pixels */ -" .XXXoO ", -"+ @X#####X+ ", -"X+ #$%%$#$%%#& ", -"#$@#*=-#+;+#=-o ", -"#:-=:=# +=:# ", -"#>>>:# &:>$ ", -"$,,,>o o<,$ ", -"$1111<# 213+ ", -"o44<56#@ o44o ", -"X$@7O 8493. ", -" 80qwe ", -" 8rty8 ", -" +uq8 ", -" @@i ", -" " -}; +/* XPM */ +static const char *const undo_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 37 1", +"4 c #9BACC2", +"* c #4C7398", +"2 c #547B99", +"- c #547897", +"@ c #5A89A6", +"8 c #3A749C", +"6 c #5A809C", +", c #7F99B4", +"$ c #3F6F93", +"7 c #85A7BC", +"+ c #749BB4", +"> c #718BA7", +"0 c #A5B3C8", +"q c #BECAD9", +": c #65839D", +"u c #E1E6EE", +"X c #236289", +"y c #ADBED2", +"= c #597B9A", +"1 c #8DA0B9", +" c None", +"% c #467291", +"3 c #7393AB", +"i c #4C809F", +"; c #A0BACB", +". c #6591AE", +"o c #407598", +"5 c #6F90A6", +"t c #D2D9E0", +"9 c #ADBACE", +"# c #326A8F", +"e c #467A9C", +"O c #ACC4D3", +"< c #7F97B0", +"r c #B3BFD1", +"w c #A2B3C5", +"& c #8FB0C3", +/* pixels */ +" .XXXoO ", +"+ @X#####X+ ", +"X+ #$%%$#$%%#& ", +"#$@#*=-#+;+#=-o ", +"#:-=:=# +=:# ", +"#>>>:# &:>$ ", +"$,,,>o o<,$ ", +"$1111<# 213+ ", +"o44<56#@ o44o ", +"X$@7O 8493. ", +" 80qwe ", +" 8rty8 ", +" +uq8 ", +" @@i ", +" " +}; diff --git a/Externals/wxWidgets3/art/up.xpm b/Externals/wxWidgets3/art/up.xpm index a93009f95c..f29ed3d386 100644 --- a/Externals/wxWidgets3/art/up.xpm +++ b/Externals/wxWidgets3/art/up.xpm @@ -1,21 +1,21 @@ -/* XPM */ -static const char *const up_xpm[] = { -"16 15 3 1", -" c None", -". c Black", -"X c Gray100", -" ", -" .. ", -" .XX. ", -" .XXXX. ", -" .XXXXXX. ", -" .XXXXXXXX. ", -" ....XXXX.... ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" .XXXX. ", -" ...... ", -" "}; +/* XPM */ +static const char *const up_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" .. ", +" .XX. ", +" .XXXX. ", +" .XXXXXX. ", +" .XXXXXXXX. ", +" ....XXXX.... ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" ...... ", +" "}; diff --git a/Externals/wxWidgets3/art/wxwin16x16.xpm b/Externals/wxWidgets3/art/wxwin16x16.xpm index ed1848ea75..119185329a 100644 --- a/Externals/wxWidgets3/art/wxwin16x16.xpm +++ b/Externals/wxWidgets3/art/wxwin16x16.xpm @@ -1,161 +1,161 @@ -/* XPM */ -static const char *const wxwin16x16_xpm[] = { -"16 16 142 2", -" c None", -". c #7171C0", -"+ c #7D7DC7", -"@ c #8181CE", -"# c #7979CE", -"$ c #7171CE", -"% c #6868CD", -"& c #5050C0", -"* c #7C7CCB", -"= c #D3D3FC", -"- c #C0C0FF", -"; c #B1B1FF", -"> c #A4A4FF", -", c #9696FF", -"' c #6B6BE3", -") c #3E3EC0", -"! c #7B7BD3", -"~ c #CFCFFF", -"{ c #A7A7FF", -"] c #8989FF", -"^ c #7B7BFF", -"/ c #5E5EEB", -"( c #3333BF", -"_ c #6969D3", -": c #BEBEFF", -"< c #8E8EFF", -"[ c #5E5EFF", -"} c #4C4CFD", -"| c #6464C6", -"1 c #A4A478", -"2 c #BFBF63", -"3 c #BFBF5C", -"4 c #BFBF56", -"5 c #BFBF51", -"6 c #C17474", -"7 c #BF7070", -"8 c #BF6969", -"9 c #BF6363", -"0 c #544AC7", -"a c #A8A8FF", -"b c #7070FF", -"c c #5050FF", -"d c #3F3FFF", -"e c #8C8CBA", -"f c #F6F6C8", -"g c #FBFBBB", -"h c #FBFBAE", -"i c #FBFBA1", -"j c #F9F993", -"k c #D7D760", -"l c #D28D8D", -"m c #EEB8B8", -"n c #EFAAAA", -"o c #EF9E9E", -"p c #7C5ABC", -"q c #8D8DFF", -"r c #4747FF", -"s c #3535FF", -"t c #2B2BFF", -"u c #AAAAA7", -"v c #FFFFD2", -"w c #FFFFA9", -"x c #FFFF9A", -"y c #FFFF8D", -"z c #FFFF80", -"A c #E4E45B", -"B c #E39F9F", -"C c #FFCCCC", -"D c #FFA9A9", -"E c #FF9C9C", -"F c #B469A0", -"G c #3E3DE7", -"H c #2828EF", -"I c #1E1EEF", -"J c #1515EF", -"K c #A5A595", -"L c #FFFFC2", -"M c #FFFF8F", -"N c #F7F765", -"O c #F2F251", -"P c #DBDB3A", -"Q c #E48E8E", -"R c #FFBABA", -"S c #FF8E8E", -"T c #FF8181", -"U c #FF6868", -"V c #E54D60", -"W c #AC2E56", -"X c #0B0BBF", -"Y c #0606BF", -"Z c #C8C85D", -"` c #FEFEB1", -" . c #FEFE74", -".. c #F4F456", -"+. c #EFEF42", -"@. c #EFEF38", -"#. c #D7D725", -"$. c #E47676", -"%. c #FFA8A8", -"&. c #FF7373", -"*. c #FF5555", -"=. c #FF4343", -"-. c #FF3939", -";. c #DA2323", -">. c #CFCF3C", -",. c #F6F694", -"'. c #F0F047", -"). c #EFEF2E", -"!. c #EFEF24", -"~. c #D7D715", -"{. c #E45757", -"]. c #FF8888", -"^. c #FF4646", -"/. c #FF2F2F", -"(. c #FF2525", -"_. c #DA1414", -":. c #C3C328", -"<. c #EBEB55", -"[. c #ECEC2F", -"}. c #ECEC24", -"|. c #ECEC1A", -"1. c #EBEB10", -"2. c #CDCD06", -"3. c #DD3A3A", -"4. c #FF6060", -"5. c #FF1B1B", -"6. c #FE1111", -"7. c #D10707", -"8. c #B8B819", -"9. c #B7B715", -"0. c #B7B710", -"a. c #B7B70B", -"b. c #B7B706", -"c. c #B7B701", -"d. c #B7B700", -"e. c #BF1A1A", -"f. c #CC1919", -"g. c #CE1414", -"h. c #CE0E0E", -"i. c #CE0808", -"j. c #C90202", -"k. c #C00000", -" ", -" ", -" . + @ # $ % & ", -" * = - ; > , ' ) ", -" ! ~ { , ] ^ / ( ", -" _ : < ^ [ } | 1 2 3 4 5 ", -"6 7 8 9 0 a b c d e f g h i j k ", -"l m n o p q r s t u v w x y z A ", -"B C D E F G H I J K L M z N O P ", -"Q R S T U V W X Y Z ` ...+.@.#.", -"$.%.&.*.=.-.;. >.,.'.@.).!.~.", -"{.].^.-./.(._. :.<.[.}.|.1.2.", -"3.4./.(.5.6.7. 8.9.0.a.b.c.d.", -"e.f.g.h.i.j.k. ", -" ", -" "}; +/* XPM */ +static const char *const wxwin16x16_xpm[] = { +"16 16 142 2", +" c None", +". c #7171C0", +"+ c #7D7DC7", +"@ c #8181CE", +"# c #7979CE", +"$ c #7171CE", +"% c #6868CD", +"& c #5050C0", +"* c #7C7CCB", +"= c #D3D3FC", +"- c #C0C0FF", +"; c #B1B1FF", +"> c #A4A4FF", +", c #9696FF", +"' c #6B6BE3", +") c #3E3EC0", +"! c #7B7BD3", +"~ c #CFCFFF", +"{ c #A7A7FF", +"] c #8989FF", +"^ c #7B7BFF", +"/ c #5E5EEB", +"( c #3333BF", +"_ c #6969D3", +": c #BEBEFF", +"< c #8E8EFF", +"[ c #5E5EFF", +"} c #4C4CFD", +"| c #6464C6", +"1 c #A4A478", +"2 c #BFBF63", +"3 c #BFBF5C", +"4 c #BFBF56", +"5 c #BFBF51", +"6 c #C17474", +"7 c #BF7070", +"8 c #BF6969", +"9 c #BF6363", +"0 c #544AC7", +"a c #A8A8FF", +"b c #7070FF", +"c c #5050FF", +"d c #3F3FFF", +"e c #8C8CBA", +"f c #F6F6C8", +"g c #FBFBBB", +"h c #FBFBAE", +"i c #FBFBA1", +"j c #F9F993", +"k c #D7D760", +"l c #D28D8D", +"m c #EEB8B8", +"n c #EFAAAA", +"o c #EF9E9E", +"p c #7C5ABC", +"q c #8D8DFF", +"r c #4747FF", +"s c #3535FF", +"t c #2B2BFF", +"u c #AAAAA7", +"v c #FFFFD2", +"w c #FFFFA9", +"x c #FFFF9A", +"y c #FFFF8D", +"z c #FFFF80", +"A c #E4E45B", +"B c #E39F9F", +"C c #FFCCCC", +"D c #FFA9A9", +"E c #FF9C9C", +"F c #B469A0", +"G c #3E3DE7", +"H c #2828EF", +"I c #1E1EEF", +"J c #1515EF", +"K c #A5A595", +"L c #FFFFC2", +"M c #FFFF8F", +"N c #F7F765", +"O c #F2F251", +"P c #DBDB3A", +"Q c #E48E8E", +"R c #FFBABA", +"S c #FF8E8E", +"T c #FF8181", +"U c #FF6868", +"V c #E54D60", +"W c #AC2E56", +"X c #0B0BBF", +"Y c #0606BF", +"Z c #C8C85D", +"` c #FEFEB1", +" . c #FEFE74", +".. c #F4F456", +"+. c #EFEF42", +"@. c #EFEF38", +"#. c #D7D725", +"$. c #E47676", +"%. c #FFA8A8", +"&. c #FF7373", +"*. c #FF5555", +"=. c #FF4343", +"-. c #FF3939", +";. c #DA2323", +">. c #CFCF3C", +",. c #F6F694", +"'. c #F0F047", +"). c #EFEF2E", +"!. c #EFEF24", +"~. c #D7D715", +"{. c #E45757", +"]. c #FF8888", +"^. c #FF4646", +"/. c #FF2F2F", +"(. c #FF2525", +"_. c #DA1414", +":. c #C3C328", +"<. c #EBEB55", +"[. c #ECEC2F", +"}. c #ECEC24", +"|. c #ECEC1A", +"1. c #EBEB10", +"2. c #CDCD06", +"3. c #DD3A3A", +"4. c #FF6060", +"5. c #FF1B1B", +"6. c #FE1111", +"7. c #D10707", +"8. c #B8B819", +"9. c #B7B715", +"0. c #B7B710", +"a. c #B7B70B", +"b. c #B7B706", +"c. c #B7B701", +"d. c #B7B700", +"e. c #BF1A1A", +"f. c #CC1919", +"g. c #CE1414", +"h. c #CE0E0E", +"i. c #CE0808", +"j. c #C90202", +"k. c #C00000", +" ", +" ", +" . + @ # $ % & ", +" * = - ; > , ' ) ", +" ! ~ { , ] ^ / ( ", +" _ : < ^ [ } | 1 2 3 4 5 ", +"6 7 8 9 0 a b c d e f g h i j k ", +"l m n o p q r s t u v w x y z A ", +"B C D E F G H I J K L M z N O P ", +"Q R S T U V W X Y Z ` ...+.@.#.", +"$.%.&.*.=.-.;. >.,.'.@.).!.~.", +"{.].^.-./.(._. :.<.[.}.|.1.2.", +"3.4./.(.5.6.7. 8.9.0.a.b.c.d.", +"e.f.g.h.i.j.k. ", +" ", +" "}; diff --git a/Externals/wxWidgets3/art/wxwin32x32.xpm b/Externals/wxWidgets3/art/wxwin32x32.xpm index 25aed5e590..d318f0aadb 100644 --- a/Externals/wxWidgets3/art/wxwin32x32.xpm +++ b/Externals/wxWidgets3/art/wxwin32x32.xpm @@ -1,442 +1,442 @@ -/* XPM */ -static const char *const wxwin32x32_xpm[] = { -"32 32 407 2", -" c None", -". c #7373C1", -"+ c #6E6EBF", -"@ c #6B6BBF", -"# c #6868BF", -"$ c #6464BF", -"% c #6161BF", -"& c #5E5EBF", -"* c #5A5ABF", -"= c #5959C0", -"- c #7171C0", -"; c #7272C1", -"> c #8686CE", -", c #8686D0", -"' c #8282D0", -") c #7D7DD0", -"! c #7979D0", -"~ c #7575D0", -"{ c #7171D0", -"] c #6D6DD0", -"^ c #6666CD", -"/ c #5151C1", -"( c #4C4CBF", -"_ c #7171C1", -": c #7272C2", -"< c #C1C1F2", -"[ c #D7D7FF", -"} c #C9C9FF", -"| c #C2C2FF", -"1 c #BBBBFF", -"2 c #B4B4FF", -"3 c #AEAEFF", -"4 c #A7A7FF", -"5 c #A0A0FF", -"6 c #9A9AFF", -"7 c #8484F2", -"8 c #4949C2", -"9 c #4444C1", -"0 c #6A6AC0", -"a c #8989D4", -"b c #DADAFF", -"c c #C0C0FF", -"d c #9393FF", -"e c #8C8CFF", -"f c #8686FF", -"g c #5454D4", -"h c #3E3EC0", -"i c #6363BF", -"j c #8686D8", -"k c #D4D4FF", -"l c #D2D2FF", -"m c #7F7FFF", -"n c #7878FF", -"o c #4F4FD7", -"p c #3737BF", -"q c #5C5CBF", -"r c #7D7DD8", -"s c #CCCCFF", -"t c #CACAFF", -"u c #A8A8FF", -"v c #7070FF", -"w c #6B6BFF", -"x c #4545D7", -"y c #3030BF", -"z c #5555BF", -"A c #7373D8", -"B c #C3C3FF", -"C c #9C9CFF", -"D c #8D8DFF", -"E c #7777FF", -"F c #6262FF", -"G c #5252FF", -"H c #4B4BFF", -"I c #4848FF", -"J c #3232D7", -"K c #2626BF", -"L c #4E4EBF", -"M c #6A6AD8", -"N c #B9B9FF", -"O c #9090FF", -"P c #6F6FFF", -"Q c #5555FF", -"R c #4646FF", -"S c #4B4BF5", -"T c #8282B4", -"U c #93938E", -"V c #B1B173", -"W c #BFBF68", -"X c #BFBF65", -"Y c #BFBF62", -"Z c #BFBF5E", -"` c #BFBF5B", -" . c #BFBF57", -".. c #BFBF54", -"+. c #BFBF51", -"@. c #5858D8", -"#. c #B2B2FF", -"$. c #B1B1FF", -"%. c #8484FF", -"&. c #7272FF", -"*. c #6767FF", -"=. c #4F4FFF", -"-. c #4747FF", -";. c #4242FF", -">. c #4141FA", -",. c #ABAB8A", -"'. c #E4E4AA", -"). c #F5F5C3", -"!. c #F6F6BE", -"~. c #F6F6B7", -"{. c #F6F6B1", -"]. c #F6F6AB", -"^. c #F6F6A5", -"/. c #F6F69E", -"(. c #F6F698", -"_. c #F1F18C", -":. c #D0D05F", -"<. c #BFBF48", -"[. c #C17474", -"}. c #C07171", -"|. c #BF6E6E", -"1. c #BF6B6B", -"2. c #BF6868", -"3. c #BF6464", -"4. c #BF6161", -"5. c #7C498C", -"6. c #4242D8", -"7. c #A4A4FF", -"8. c #5959FF", -"9. c #3D3DFF", -"0. c #3838FF", -"a. c #6666CA", -"b. c #DCDC98", -"c. c #FFFFDD", -"d. c #FFFFD7", -"e. c #FFFFC0", -"f. c #FFFFB8", -"g. c #FFFFB2", -"h. c #FFFFAB", -"i. c #FFFFA4", -"j. c #FFFF9D", -"k. c #FFFF97", -"l. c #FFFF90", -"m. c #FBFB85", -"n. c #C2C244", -"o. c #C37676", -"p. c #DA9B9B", -"q. c #DF9F9F", -"r. c #DF9A9A", -"s. c #DF9494", -"t. c #DF8F8F", -"u. c #DF8A8A", -"v. c #B47094", -"w. c #3B3BD8", -"x. c #9292FF", -"y. c #5656FF", -"z. c #3333FF", -"A. c #2E2EFF", -"B. c #7070B6", -"C. c #E7E79F", -"D. c #FFFFDE", -"E. c #FFFFCF", -"F. c #FFFFB5", -"G. c #FFFF9E", -"H. c #FFFF8A", -"I. c #FFFF83", -"J. c #FFFF7C", -"K. c #C8C843", -"L. c #C06D6D", -"M. c #F1BEBE", -"N. c #FFDBDB", -"O. c #FFCBCB", -"P. c #FFC0C0", -"Q. c #FFBABA", -"R. c #FFB3B3", -"S. c #FFACAC", -"T. c #CE89AC", -"U. c #3333D7", -"V. c #8787FF", -"W. c #4D4DFF", -"X. c #2929FF", -"Y. c #2424FF", -"Z. c #6B6BB3", -"`. c #E7E795", -" + c #FFFFC6", -".+ c #FFFFA8", -"++ c #FFFF76", -"@+ c #FFFF6F", -"#+ c #C8C83C", -"$+ c #C77474", -"%+ c #FFD3D3", -"&+ c #FFDEDE", -"*+ c #FFC4C4", -"=+ c #FFA6A6", -"-+ c #FF9F9F", -";+ c #F3929A", -">+ c #2F29C3", -",+ c #4C4CFB", -"'+ c #6868FF", -")+ c #3939FF", -"!+ c #1F1FFF", -"~+ c #1A1AFF", -"{+ c #6666B0", -"]+ c #E7E78A", -"^+ c #FFFFD0", -"/+ c #FFFFBD", -"(+ c #FFFF9B", -"_+ c #FFFF91", -":+ c #FAFA6E", -"<+ c #F5F55F", -"[+ c #F5F558", -"}+ c #F7F756", -"|+ c #C7C732", -"1+ c #C86E6E", -"2+ c #FFC9C9", -"3+ c #FFD7D7", -"4+ c #FFB8B8", -"5+ c #FF9898", -"6+ c #FF9292", -"7+ c #FF8B8B", -"8+ c #B16098", -"9+ c #2420C6", -"0+ c #2222DD", -"a+ c #1F1FDF", -"b+ c #1B1BDF", -"c+ c #1818DF", -"d+ c #1414DF", -"e+ c #1010DF", -"f+ c #0C0CDF", -"g+ c #5F5F9C", -"h+ c #E7E77F", -"i+ c #FFFFC9", -"j+ c #FFFFB4", -"k+ c #FFFF8E", -"l+ c #FFFF7D", -"m+ c #FEFE75", -"n+ c #F4F45D", -"o+ c #EFEF4F", -"p+ c #EFEF4A", -"q+ c #EFEF44", -"r+ c #EFEF3F", -"s+ c #BFBF22", -"t+ c #C86666", -"u+ c #FFBFBF", -"v+ c #FFD0D0", -"w+ c #FFADAD", -"x+ c #FF8484", -"y+ c #FF7E7E", -"z+ c #FF7373", -"A+ c #E75F70", -"B+ c #B0457F", -"C+ c #9A3776", -"D+ c #5F1D7C", -"E+ c #0C0CBF", -"F+ c #0909BF", -"G+ c #0707BF", -"H+ c #0404BF", -"I+ c #878766", -"J+ c #E6E674", -"K+ c #FFFFC2", -"L+ c #FFFF82", -"M+ c #FEFE6E", -"N+ c #F3F355", -"O+ c #EFEF45", -"P+ c #EFEF40", -"Q+ c #EFEF3B", -"R+ c #EFEF36", -"S+ c #BFBF1C", -"T+ c #C85F5F", -"U+ c #FFB4B4", -"V+ c #FFA2A2", -"W+ c #FF7575", -"X+ c #FF5E5E", -"Y+ c #FF5050", -"Z+ c #FF4A4A", -"`+ c #FF4545", -" @ c #E73535", -".@ c #BF2121", -"+@ c #B7B733", -"@@ c #DCDC55", -"#@ c #FDFDB7", -"$@ c #FFFFA2", -"%@ c #FFFF75", -"&@ c #FCFC64", -"*@ c #F2F24E", -"=@ c #EFEF31", -"-@ c #EFEF2C", -";@ c #BFBF16", -">@ c #C85656", -",@ c #FFAAAA", -"'@ c #FFC2C2", -")@ c #FF9797", -"!@ c #FF7777", -"~@ c #FF6E6E", -"{@ c #FF5454", -"]@ c #FF4040", -"^@ c #FF3B3B", -"/@ c #E72C2C", -"(@ c #BF1919", -"_@ c #B7B72E", -":@ c #DADA48", -"<@ c #F7F7A6", -"[@ c #F6F689", -"}@ c #F2F254", -"|@ c #EFEF27", -"1@ c #EFEF22", -"2@ c #BFBF10", -"3@ c #C84040", -"4@ c #FF9A9A", -"5@ c #FFBBBB", -"6@ c #FF7171", -"7@ c #FF6666", -"8@ c #FF4E4E", -"9@ c #FF4646", -"0@ c #FF4141", -"a@ c #FF3C3C", -"b@ c #FF3737", -"c@ c #FF3232", -"d@ c #E72424", -"e@ c #BF1414", -"f@ c #B7B729", -"g@ c #DADA3F", -"h@ c #F7F7A1", -"i@ c #F4F480", -"j@ c #F0F047", -"k@ c #EFEF1D", -"l@ c #EFEF18", -"m@ c #BFBF0B", -"n@ c #C83636", -"o@ c #FFABAB", -"p@ c #FF7676", -"q@ c #FF2D2D", -"r@ c #FF2828", -"s@ c #E71C1C", -"t@ c #BF0F0F", -"u@ c #B7B724", -"v@ c #D1D132", -"w@ c #F4F478", -"x@ c #EFEF13", -"y@ c #ECEC0E", -"z@ c #BABA05", -"A@ c #C83030", -"B@ c #FF6161", -"C@ c #FF2323", -"D@ c #FF1E1E", -"E@ c #E71414", -"F@ c #BF0A0A", -"G@ c #B8B820", -"H@ c #B9B91F", -"I@ c #DADA2C", -"J@ c #E9E931", -"K@ c #EAEA2A", -"L@ c #EAEA25", -"M@ c #EAEA20", -"N@ c #EAEA1C", -"O@ c #EAEA17", -"P@ c #EAEA12", -"Q@ c #EAEA0D", -"R@ c #E5E508", -"S@ c #C7C703", -"T@ c #B7B701", -"U@ c #C52929", -"V@ c #FF5858", -"W@ c #FF1919", -"X@ c #FF1414", -"Y@ c #E30C0C", -"Z@ c #BF0606", -"`@ c #B8B819", -" # c #B7B717", -".# c #B7B714", -"+# c #B7B711", -"@# c #B7B70F", -"## c #B7B70C", -"$# c #B7B70A", -"%# c #B7B707", -"&# c #B7B705", -"*# c #B7B702", -"=# c #B7B700", -"-# c #BF2020", -";# c #E63131", -"># c #FF5555", -",# c #FF3A3A", -"'# c #FF0F0F", -")# c #FA0A0A", -"!# c #C90303", -"~# c #C00202", -"{# c #C01C1C", -"]# c #CB1B1B", -"^# c #D01A1A", -"/# c #D01616", -"(# c #D01313", -"_# c #D01010", -":# c #D00D0D", -"<# c #D00A0A", -"[# c #D00707", -"}# c #CF0303", -"|# c #C30101", -"1# c #C00000", -"2# c #C21414", -"3# c #BF1111", -"4# c #BF0E0E", -"5# c #BF0C0C", -"6# c #BF0909", -"7# c #BF0707", -"8# c #BF0404", -"9# c #BF0202", -"0# c #C50000", -" ", -" ", -" ", -" ", -" . + @ # $ % & * = ", -" - ; > , ' ) ! ~ { ] ^ / ( ", -" _ : < [ } | 1 2 3 4 5 6 7 8 9 ", -" 0 a b b c 2 3 4 5 6 d e f g h ", -" i j k l 2 4 5 6 d e f m n o p ", -" q r s t u 6 d e f m n v w x y ", -" z A B | C D f m E F G H I J K ", -" L M 1 N O m n P Q H R S T U V W X Y Z ` ...+. ", -" p @.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.", -" [.}.|.1.2.3.4.5.6.6 7.&.8.I ;.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.", -"}.o.p.q.r.s.t.u.v.w.O x.y.;.9.0.z.A.B.C.D.E.F.h.i.G.k.l.H.I.J.K.", -"L.M.N.O.P.Q.R.S.T.U.V.e W.0.z.A.X.Y.Z.`.d. +.+G.k.l.H.I.J.++@+#+", -"$+%+&+*+R.S.=+-+;+>+,+'+)+A.X.Y.!+~+{+]+^+/+(+_+H.I.J.:+<+[+}+|+", -"1+2+3+4+=+-+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+I.l+m+n+o+p+q+r+s+", -"t+u+v+w+5+6+7+x+y+z+A+B+C+D+E+F+G+H+I+J+K+h.L+++M+N+p+O+P+Q+R+S+", -"T+U+2+V+7+x+y+W+X+Y+Z+`+ @.@ +@@@#@$@%@&@*@O+P+Q+R+=@-@;@", -">@,@'@)@y+!@~@{@Z+`+]@^@/@(@ _@:@<@[@}@O+P+Q+R+=@-@|@1@2@", -"3@4@5@7+6@7@8@9@0@a@b@c@d@e@ f@g@h@i@j@Q+R+=@-@|@1@k@l@m@", -"n@y+o@p@{@9@0@a@b@c@q@r@s@t@ u@v@i@w@Q+=@-@|@1@k@l@x@y@z@", -"A@p@-+B@0@a@b@c@q@r@C@D@E@F@ G@H@I@J@K@L@M@N@O@P@Q@R@S@T@", -"U@7@4@V@b@c@q@r@C@D@W@X@Y@Z@ `@ #.#+#@###$#%#&#*#=#=# ", -"-#;#>#,#q@r@C@D@W@X@'#)#!#~# ", -"{#(@]#^#/#(#_#:#<#[#}#|#1# ", -" 2#3#4#5#6#7#8#9#1#0# ", -" ", -" ", -" ", -" "}; +/* XPM */ +static const char *const wxwin32x32_xpm[] = { +"32 32 407 2", +" c None", +". c #7373C1", +"+ c #6E6EBF", +"@ c #6B6BBF", +"# c #6868BF", +"$ c #6464BF", +"% c #6161BF", +"& c #5E5EBF", +"* c #5A5ABF", +"= c #5959C0", +"- c #7171C0", +"; c #7272C1", +"> c #8686CE", +", c #8686D0", +"' c #8282D0", +") c #7D7DD0", +"! c #7979D0", +"~ c #7575D0", +"{ c #7171D0", +"] c #6D6DD0", +"^ c #6666CD", +"/ c #5151C1", +"( c #4C4CBF", +"_ c #7171C1", +": c #7272C2", +"< c #C1C1F2", +"[ c #D7D7FF", +"} c #C9C9FF", +"| c #C2C2FF", +"1 c #BBBBFF", +"2 c #B4B4FF", +"3 c #AEAEFF", +"4 c #A7A7FF", +"5 c #A0A0FF", +"6 c #9A9AFF", +"7 c #8484F2", +"8 c #4949C2", +"9 c #4444C1", +"0 c #6A6AC0", +"a c #8989D4", +"b c #DADAFF", +"c c #C0C0FF", +"d c #9393FF", +"e c #8C8CFF", +"f c #8686FF", +"g c #5454D4", +"h c #3E3EC0", +"i c #6363BF", +"j c #8686D8", +"k c #D4D4FF", +"l c #D2D2FF", +"m c #7F7FFF", +"n c #7878FF", +"o c #4F4FD7", +"p c #3737BF", +"q c #5C5CBF", +"r c #7D7DD8", +"s c #CCCCFF", +"t c #CACAFF", +"u c #A8A8FF", +"v c #7070FF", +"w c #6B6BFF", +"x c #4545D7", +"y c #3030BF", +"z c #5555BF", +"A c #7373D8", +"B c #C3C3FF", +"C c #9C9CFF", +"D c #8D8DFF", +"E c #7777FF", +"F c #6262FF", +"G c #5252FF", +"H c #4B4BFF", +"I c #4848FF", +"J c #3232D7", +"K c #2626BF", +"L c #4E4EBF", +"M c #6A6AD8", +"N c #B9B9FF", +"O c #9090FF", +"P c #6F6FFF", +"Q c #5555FF", +"R c #4646FF", +"S c #4B4BF5", +"T c #8282B4", +"U c #93938E", +"V c #B1B173", +"W c #BFBF68", +"X c #BFBF65", +"Y c #BFBF62", +"Z c #BFBF5E", +"` c #BFBF5B", +" . c #BFBF57", +".. c #BFBF54", +"+. c #BFBF51", +"@. c #5858D8", +"#. c #B2B2FF", +"$. c #B1B1FF", +"%. c #8484FF", +"&. c #7272FF", +"*. c #6767FF", +"=. c #4F4FFF", +"-. c #4747FF", +";. c #4242FF", +">. c #4141FA", +",. c #ABAB8A", +"'. c #E4E4AA", +"). c #F5F5C3", +"!. c #F6F6BE", +"~. c #F6F6B7", +"{. c #F6F6B1", +"]. c #F6F6AB", +"^. c #F6F6A5", +"/. c #F6F69E", +"(. c #F6F698", +"_. c #F1F18C", +":. c #D0D05F", +"<. c #BFBF48", +"[. c #C17474", +"}. c #C07171", +"|. c #BF6E6E", +"1. c #BF6B6B", +"2. c #BF6868", +"3. c #BF6464", +"4. c #BF6161", +"5. c #7C498C", +"6. c #4242D8", +"7. c #A4A4FF", +"8. c #5959FF", +"9. c #3D3DFF", +"0. c #3838FF", +"a. c #6666CA", +"b. c #DCDC98", +"c. c #FFFFDD", +"d. c #FFFFD7", +"e. c #FFFFC0", +"f. c #FFFFB8", +"g. c #FFFFB2", +"h. c #FFFFAB", +"i. c #FFFFA4", +"j. c #FFFF9D", +"k. c #FFFF97", +"l. c #FFFF90", +"m. c #FBFB85", +"n. c #C2C244", +"o. c #C37676", +"p. c #DA9B9B", +"q. c #DF9F9F", +"r. c #DF9A9A", +"s. c #DF9494", +"t. c #DF8F8F", +"u. c #DF8A8A", +"v. c #B47094", +"w. c #3B3BD8", +"x. c #9292FF", +"y. c #5656FF", +"z. c #3333FF", +"A. c #2E2EFF", +"B. c #7070B6", +"C. c #E7E79F", +"D. c #FFFFDE", +"E. c #FFFFCF", +"F. c #FFFFB5", +"G. c #FFFF9E", +"H. c #FFFF8A", +"I. c #FFFF83", +"J. c #FFFF7C", +"K. c #C8C843", +"L. c #C06D6D", +"M. c #F1BEBE", +"N. c #FFDBDB", +"O. c #FFCBCB", +"P. c #FFC0C0", +"Q. c #FFBABA", +"R. c #FFB3B3", +"S. c #FFACAC", +"T. c #CE89AC", +"U. c #3333D7", +"V. c #8787FF", +"W. c #4D4DFF", +"X. c #2929FF", +"Y. c #2424FF", +"Z. c #6B6BB3", +"`. c #E7E795", +" + c #FFFFC6", +".+ c #FFFFA8", +"++ c #FFFF76", +"@+ c #FFFF6F", +"#+ c #C8C83C", +"$+ c #C77474", +"%+ c #FFD3D3", +"&+ c #FFDEDE", +"*+ c #FFC4C4", +"=+ c #FFA6A6", +"-+ c #FF9F9F", +";+ c #F3929A", +">+ c #2F29C3", +",+ c #4C4CFB", +"'+ c #6868FF", +")+ c #3939FF", +"!+ c #1F1FFF", +"~+ c #1A1AFF", +"{+ c #6666B0", +"]+ c #E7E78A", +"^+ c #FFFFD0", +"/+ c #FFFFBD", +"(+ c #FFFF9B", +"_+ c #FFFF91", +":+ c #FAFA6E", +"<+ c #F5F55F", +"[+ c #F5F558", +"}+ c #F7F756", +"|+ c #C7C732", +"1+ c #C86E6E", +"2+ c #FFC9C9", +"3+ c #FFD7D7", +"4+ c #FFB8B8", +"5+ c #FF9898", +"6+ c #FF9292", +"7+ c #FF8B8B", +"8+ c #B16098", +"9+ c #2420C6", +"0+ c #2222DD", +"a+ c #1F1FDF", +"b+ c #1B1BDF", +"c+ c #1818DF", +"d+ c #1414DF", +"e+ c #1010DF", +"f+ c #0C0CDF", +"g+ c #5F5F9C", +"h+ c #E7E77F", +"i+ c #FFFFC9", +"j+ c #FFFFB4", +"k+ c #FFFF8E", +"l+ c #FFFF7D", +"m+ c #FEFE75", +"n+ c #F4F45D", +"o+ c #EFEF4F", +"p+ c #EFEF4A", +"q+ c #EFEF44", +"r+ c #EFEF3F", +"s+ c #BFBF22", +"t+ c #C86666", +"u+ c #FFBFBF", +"v+ c #FFD0D0", +"w+ c #FFADAD", +"x+ c #FF8484", +"y+ c #FF7E7E", +"z+ c #FF7373", +"A+ c #E75F70", +"B+ c #B0457F", +"C+ c #9A3776", +"D+ c #5F1D7C", +"E+ c #0C0CBF", +"F+ c #0909BF", +"G+ c #0707BF", +"H+ c #0404BF", +"I+ c #878766", +"J+ c #E6E674", +"K+ c #FFFFC2", +"L+ c #FFFF82", +"M+ c #FEFE6E", +"N+ c #F3F355", +"O+ c #EFEF45", +"P+ c #EFEF40", +"Q+ c #EFEF3B", +"R+ c #EFEF36", +"S+ c #BFBF1C", +"T+ c #C85F5F", +"U+ c #FFB4B4", +"V+ c #FFA2A2", +"W+ c #FF7575", +"X+ c #FF5E5E", +"Y+ c #FF5050", +"Z+ c #FF4A4A", +"`+ c #FF4545", +" @ c #E73535", +".@ c #BF2121", +"+@ c #B7B733", +"@@ c #DCDC55", +"#@ c #FDFDB7", +"$@ c #FFFFA2", +"%@ c #FFFF75", +"&@ c #FCFC64", +"*@ c #F2F24E", +"=@ c #EFEF31", +"-@ c #EFEF2C", +";@ c #BFBF16", +">@ c #C85656", +",@ c #FFAAAA", +"'@ c #FFC2C2", +")@ c #FF9797", +"!@ c #FF7777", +"~@ c #FF6E6E", +"{@ c #FF5454", +"]@ c #FF4040", +"^@ c #FF3B3B", +"/@ c #E72C2C", +"(@ c #BF1919", +"_@ c #B7B72E", +":@ c #DADA48", +"<@ c #F7F7A6", +"[@ c #F6F689", +"}@ c #F2F254", +"|@ c #EFEF27", +"1@ c #EFEF22", +"2@ c #BFBF10", +"3@ c #C84040", +"4@ c #FF9A9A", +"5@ c #FFBBBB", +"6@ c #FF7171", +"7@ c #FF6666", +"8@ c #FF4E4E", +"9@ c #FF4646", +"0@ c #FF4141", +"a@ c #FF3C3C", +"b@ c #FF3737", +"c@ c #FF3232", +"d@ c #E72424", +"e@ c #BF1414", +"f@ c #B7B729", +"g@ c #DADA3F", +"h@ c #F7F7A1", +"i@ c #F4F480", +"j@ c #F0F047", +"k@ c #EFEF1D", +"l@ c #EFEF18", +"m@ c #BFBF0B", +"n@ c #C83636", +"o@ c #FFABAB", +"p@ c #FF7676", +"q@ c #FF2D2D", +"r@ c #FF2828", +"s@ c #E71C1C", +"t@ c #BF0F0F", +"u@ c #B7B724", +"v@ c #D1D132", +"w@ c #F4F478", +"x@ c #EFEF13", +"y@ c #ECEC0E", +"z@ c #BABA05", +"A@ c #C83030", +"B@ c #FF6161", +"C@ c #FF2323", +"D@ c #FF1E1E", +"E@ c #E71414", +"F@ c #BF0A0A", +"G@ c #B8B820", +"H@ c #B9B91F", +"I@ c #DADA2C", +"J@ c #E9E931", +"K@ c #EAEA2A", +"L@ c #EAEA25", +"M@ c #EAEA20", +"N@ c #EAEA1C", +"O@ c #EAEA17", +"P@ c #EAEA12", +"Q@ c #EAEA0D", +"R@ c #E5E508", +"S@ c #C7C703", +"T@ c #B7B701", +"U@ c #C52929", +"V@ c #FF5858", +"W@ c #FF1919", +"X@ c #FF1414", +"Y@ c #E30C0C", +"Z@ c #BF0606", +"`@ c #B8B819", +" # c #B7B717", +".# c #B7B714", +"+# c #B7B711", +"@# c #B7B70F", +"## c #B7B70C", +"$# c #B7B70A", +"%# c #B7B707", +"&# c #B7B705", +"*# c #B7B702", +"=# c #B7B700", +"-# c #BF2020", +";# c #E63131", +"># c #FF5555", +",# c #FF3A3A", +"'# c #FF0F0F", +")# c #FA0A0A", +"!# c #C90303", +"~# c #C00202", +"{# c #C01C1C", +"]# c #CB1B1B", +"^# c #D01A1A", +"/# c #D01616", +"(# c #D01313", +"_# c #D01010", +":# c #D00D0D", +"<# c #D00A0A", +"[# c #D00707", +"}# c #CF0303", +"|# c #C30101", +"1# c #C00000", +"2# c #C21414", +"3# c #BF1111", +"4# c #BF0E0E", +"5# c #BF0C0C", +"6# c #BF0909", +"7# c #BF0707", +"8# c #BF0404", +"9# c #BF0202", +"0# c #C50000", +" ", +" ", +" ", +" ", +" . + @ # $ % & * = ", +" - ; > , ' ) ! ~ { ] ^ / ( ", +" _ : < [ } | 1 2 3 4 5 6 7 8 9 ", +" 0 a b b c 2 3 4 5 6 d e f g h ", +" i j k l 2 4 5 6 d e f m n o p ", +" q r s t u 6 d e f m n v w x y ", +" z A B | C D f m E F G H I J K ", +" L M 1 N O m n P Q H R S T U V W X Y Z ` ...+. ", +" p @.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.", +" [.}.|.1.2.3.4.5.6.6 7.&.8.I ;.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.", +"}.o.p.q.r.s.t.u.v.w.O x.y.;.9.0.z.A.B.C.D.E.F.h.i.G.k.l.H.I.J.K.", +"L.M.N.O.P.Q.R.S.T.U.V.e W.0.z.A.X.Y.Z.`.d. +.+G.k.l.H.I.J.++@+#+", +"$+%+&+*+R.S.=+-+;+>+,+'+)+A.X.Y.!+~+{+]+^+/+(+_+H.I.J.:+<+[+}+|+", +"1+2+3+4+=+-+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+I.l+m+n+o+p+q+r+s+", +"t+u+v+w+5+6+7+x+y+z+A+B+C+D+E+F+G+H+I+J+K+h.L+++M+N+p+O+P+Q+R+S+", +"T+U+2+V+7+x+y+W+X+Y+Z+`+ @.@ +@@@#@$@%@&@*@O+P+Q+R+=@-@;@", +">@,@'@)@y+!@~@{@Z+`+]@^@/@(@ _@:@<@[@}@O+P+Q+R+=@-@|@1@2@", +"3@4@5@7+6@7@8@9@0@a@b@c@d@e@ f@g@h@i@j@Q+R+=@-@|@1@k@l@m@", +"n@y+o@p@{@9@0@a@b@c@q@r@s@t@ u@v@i@w@Q+=@-@|@1@k@l@x@y@z@", +"A@p@-+B@0@a@b@c@q@r@C@D@E@F@ G@H@I@J@K@L@M@N@O@P@Q@R@S@T@", +"U@7@4@V@b@c@q@r@C@D@W@X@Y@Z@ `@ #.#+#@###$#%#&#*#=#=# ", +"-#;#>#,#q@r@C@D@W@X@'#)#!#~# ", +"{#(@]#^#/#(#_#:#<#[#}#|#1# ", +" 2#3#4#5#6#7#8#9#1#0# ", +" ", +" ", +" ", +" "}; diff --git a/Externals/wxWidgets3/build/msw/wx_base.vcxproj b/Externals/wxWidgets3/build/msw/wx_base.vcxproj index d99f6f8b94..e50e7647e1 100644 --- a/Externals/wxWidgets3/build/msw/wx_base.vcxproj +++ b/Externals/wxWidgets3/build/msw/wx_base.vcxproj @@ -17,14 +17,6 @@ Release x64 - - DebugFast - Win32 - - - DebugFast - x64 -
@@ -309,9 +301,11 @@ + + @@ -361,6 +355,7 @@ + @@ -381,6 +376,7 @@ + @@ -418,6 +414,7 @@ + @@ -425,7 +422,9 @@ + + @@ -438,20 +437,10 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -479,6 +468,7 @@ + @@ -507,6 +497,7 @@ + @@ -543,6 +534,7 @@ + @@ -575,6 +567,7 @@ + @@ -627,9 +620,11 @@ + + @@ -673,20 +668,10 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -696,15 +681,11 @@ + - true - true - true - true - true - true + true @@ -764,42 +745,22 @@ - Create - Create - Create - Create - Create - Create + Create - true - true - true - true - true - true + true - true - true - true - true - true - true + true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing + NotUsing @@ -822,23 +783,13 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -866,69 +817,29 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -941,32 +852,18 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true + @@ -984,6 +881,7 @@ + @@ -992,12 +890,7 @@ - true - true - true - true - true - true + true @@ -1013,12 +906,7 @@ - true - true - true - true - true - true + true @@ -1047,6 +935,8 @@ + + @@ -1067,14 +957,10 @@ - true - true - true - true - true - true + true + @@ -1084,104 +970,47 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - - true - true - true - true - true - true - - - true - true - true - true - true - true - - - true - true - true - true - true - true - - true - true - true - true - true - true + true - - true - true - true - true - true - true - - true - true - true - true - true - true + true @@ -1189,99 +1018,37 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true - - true - true - true - true - true - true - - - true - true - true - true - true - true - - - true - true - true - true - true - true - - true - true - true - true - true - true + true - true - true - true - true - true - true + true - - true - true - true - true - true - true - - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -1294,27 +1061,11 @@ - - true - true - true - true - true - true - - - true - true - true - true - true - true - @@ -1370,6 +1121,7 @@ + @@ -1378,12 +1130,7 @@ - true - true - true - true - true - true + true @@ -1400,51 +1147,26 @@ - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true - true - true - true - true - true - true + true @@ -1462,6 +1184,7 @@ + @@ -1499,6 +1222,7 @@ + @@ -1512,24 +1236,15 @@ + - true - true - true - true - true - true + true - true - true - true - true - true - true + true
@@ -1538,12 +1253,7 @@ - true - true - true - true - true - true + true @@ -1557,128 +1267,33 @@ wxWidgets {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - wxBase28 - + StaticLibrary + v120 Unicode - - StaticLibrary - Unicode + + true - - StaticLibrary - Unicode - - - StaticLibrary - Unicode - - - StaticLibrary - Unicode - - - StaticLibrary - Unicode + + false - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __WXDEBUG__;%(PreprocessorDefinitions) - - - - - - - - - __WXDEBUG__;%(PreprocessorDefinitions) - - - - diff --git a/Externals/wxWidgets3/build/msw/wx_base.vcxproj.filters b/Externals/wxWidgets3/build/msw/wx_base.vcxproj.filters index e11b02d82e..9b5e294f18 100644 --- a/Externals/wxWidgets3/build/msw/wx_base.vcxproj.filters +++ b/Externals/wxWidgets3/build/msw/wx_base.vcxproj.filters @@ -678,12 +678,18 @@ Headers + + Headers + Headers Headers + + Headers + Headers @@ -768,6 +774,9 @@ Headers + + Headers + Headers @@ -876,6 +885,9 @@ Headers + + Headers + Headers @@ -972,6 +984,9 @@ Headers + + Headers + Headers @@ -1128,6 +1143,9 @@ Headers + + Headers + Headers @@ -1137,6 +1155,9 @@ Headers + + Headers + Headers @@ -1380,6 +1401,9 @@ Headers\MSW + + Headers\MSW + Headers\MSW @@ -1437,6 +1461,9 @@ Headers\MSW + + Headers\MSW + Headers\MSW @@ -1653,6 +1680,9 @@ Headers\MSW\private + + Headers\MSW + Headers\MSW\private @@ -1674,9 +1704,15 @@ Headers\MSW\private + + Headers\MSW + Headers\MSW\private + + Headers\MSW + Headers\MSW\private @@ -1686,6 +1722,9 @@ Headers\MSW + + Headers\MSW + Headers\MSW @@ -1955,6 +1994,9 @@ AUI + + AUI + AUI @@ -2390,6 +2432,9 @@ Common + + Common + Common @@ -2441,6 +2486,9 @@ Common + + Common + Common @@ -2648,6 +2696,9 @@ Common + + Common + Common @@ -2693,9 +2744,6 @@ Generic - - Generic - Generic @@ -2714,9 +2762,6 @@ Generic - - Generic - Generic @@ -2729,9 +2774,6 @@ Generic - - Generic - Generic @@ -2765,9 +2807,6 @@ Generic - - Generic - Generic @@ -2813,12 +2852,6 @@ Generic - - Generic - - - Generic - Generic @@ -2828,9 +2861,6 @@ Generic - - Generic - Generic @@ -2846,9 +2876,6 @@ Generic - - Generic - Generic @@ -2909,9 +2936,6 @@ Generic - - Generic - Generic @@ -2927,9 +2951,6 @@ Generic - - Generic - Generic @@ -3095,6 +3116,9 @@ MSW + + MSW + MSW @@ -3332,6 +3356,9 @@ MSW + + MSW + MSW @@ -3371,6 +3398,9 @@ MSW + + MSW + MSW @@ -3410,6 +3440,9 @@ MSW\ole + + + diff --git a/Externals/wxWidgets3/build_wx.sh b/Externals/wxWidgets3/build_wx.sh index 82670d6e9f..39c7d97d29 100755 --- a/Externals/wxWidgets3/build_wx.sh +++ b/Externals/wxWidgets3/build_wx.sh @@ -1,6 +1,6 @@ #!/bin/bash -svn co -r 70933 http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets +svn co -r 74856 http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets cd wxWidgets case $OSTYPE in diff --git a/Externals/wxWidgets3/include/msvc/wx/setup.h b/Externals/wxWidgets3/include/msvc/wx/setup.h new file mode 100644 index 0000000000..31c5efc42f --- /dev/null +++ b/Externals/wxWidgets3/include/msvc/wx/setup.h @@ -0,0 +1,254 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msvc/wx/setup.h +// Purpose: wrapper around the real wx/setup.h for Visual C++ +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-12-12 +// Copyright: (c) 2004 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER + #error "This file should only be included when using Microsoft Visual C++" +#endif + +// VC++ IDE predefines _DEBUG and _UNICODE for the new projects itself, but +// the other symbols (WXUSINGDLL, __WXUNIVERSAL__, ...) should be defined +// explicitly! + +#include "wx/version.h" +#include "wx/cpp.h" + +// notice that wxSUFFIX_DEBUG is a string but wxSUFFIX itself must be an +// identifier as string concatenation is not done inside #include where we +// need it +#ifdef _DEBUG + #define wxSUFFIX_DEBUG "d" + #ifdef _UNICODE + #define wxSUFFIX ud + #else // !_UNICODE + #define wxSUFFIX d + #endif // _UNICODE/!_UNICODE +#else + #define wxSUFFIX_DEBUG "" + #ifdef _UNICODE + #define wxSUFFIX u + #else // !_UNICODE + // don't define wxSUFFIX at all as preprocessor operations don't work + // with empty values so we need to check for this case specially below + #endif // _UNICODE/!_UNICODE +#endif + +// compiler-specific prefix: by default it's always just "vc" for compatibility +// reasons but if you use multiple MSVC versions you probably build them with +// COMPILER_PREFIX=vcXX and in this case you may want to either predefine +// wxMSVC_VERSION as "XX" or define wxMSVC_VERSION_AUTO to use the appropriate +// version depending on the compiler used +#ifdef wxMSVC_VERSION + #define wxCOMPILER_PREFIX wxCONCAT(vc, wxMSVC_VERSION) +#elif defined(wxMSVC_VERSION_AUTO) + #if _MSC_VER == 1200 + #define wxCOMPILER_PREFIX vc60 + #elif _MSC_VER == 1300 + #define wxCOMPILER_PREFIX vc70 + #elif _MSC_VER == 1310 + #define wxCOMPILER_PREFIX vc71 + #elif _MSC_VER == 1400 + #define wxCOMPILER_PREFIX vc80 + #elif _MSC_VER == 1500 + #define wxCOMPILER_PREFIX vc90 + #elif _MSC_VER == 1600 + #define wxCOMPILER_PREFIX vc100 + #elif _MSC_VER == 1700 + #define wxCOMPILER_PREFIX vc110 + #elif _MSC_VER == 1800 + #define wxCOMPILER_PREFIX vc120 + #else + #error "Unknown MSVC compiler version, please report to wx-dev." + #endif +#else + #define wxCOMPILER_PREFIX vc +#endif + +// architecture-specific part: not used (again, for compatibility), for x86 +#if defined(_M_X64) + #define wxARCH_SUFFIX _x64 +#elif defined(_M_IA64) + #define wxARCH_SUFFIX _ia64 +#else // assume _M_IX86 + #define wxARCH_SUFFIX +#endif + +// Ensure the library configuration is defined +#ifndef wxCFG + #define wxCFG +#endif + +// Construct the path for the subdirectory under /lib/ that the included setup.h +// will be used from +#ifdef WXUSINGDLL + #define wxLIB_SUBDIR \ + wxCONCAT4(wxCOMPILER_PREFIX, wxARCH_SUFFIX, _dll, wxCFG) +#else // !DLL + #define wxLIB_SUBDIR \ + wxCONCAT4(wxCOMPILER_PREFIX, wxARCH_SUFFIX, _lib, wxCFG) +#endif // DLL/!DLL + +// The user can predefine a different prefix if not using the default MSW port +// with MSVC. +#ifndef wxTOOLKIT_PREFIX + #if defined(__WXGTK__) + #define wxTOOLKIT_PREFIX gtk2 + #else + #define wxTOOLKIT_PREFIX msw + #endif +#endif // wxTOOLKIT_PREFIX + +// the real setup.h header file we need is in the build-specific directory, +// construct the path to it +#ifdef wxSUFFIX + #define wxSETUPH_PATH \ + wxCONCAT6(../../../lib/, wxLIB_SUBDIR, /, wxTOOLKIT_PREFIX, wxSUFFIX, /wx/setup.h) +#else // suffix is empty + #define wxSETUPH_PATH \ + wxCONCAT5(../../../lib/, wxLIB_SUBDIR, /, wxTOOLKIT_PREFIX, /wx/setup.h) +#endif + +#define wxSETUPH_PATH_STR wxSTRINGIZE(wxSETUPH_PATH) + +#include wxSETUPH_PATH_STR + + +// the library names depend on the build, these macro builds the correct +// library name for the given base name +#ifdef wxSUFFIX + #define wxSUFFIX_STR wxSTRINGIZE(wxSUFFIX) +#else // suffix is empty + #define wxSUFFIX_STR "" +#endif +#define wxSHORT_VERSION_STRING \ + wxSTRINGIZE(wxMAJOR_VERSION) wxSTRINGIZE(wxMINOR_VERSION) + +#define wxWX_LIB_NAME(name, subname) \ + "wx" name wxSHORT_VERSION_STRING wxSUFFIX_STR subname + +#define wxBASE_LIB_NAME(name) wxWX_LIB_NAME("base", "_" name) +#define wxTOOLKIT_LIB_NAME(name) wxWX_LIB_NAME(wxSTRINGIZE(wxTOOLKIT_PREFIX), "_" name) + +// This one is for 3rd party libraries: they don't have the version number +// in their names and usually exist in ANSI version only (except for regex) +// +// 3rd party libraries are also are not linked in when using DLLs as they're +// embedded inside our own DLLs and don't need to be linked with the user code. +#define wx3RD_PARTY_LIB_NAME(name) "wx" name wxSUFFIX_DEBUG + +// special version for regex as it does have a Unicode version +#define wx3RD_PARTY_LIB_NAME_U(name) "wx" name wxSUFFIX_STR + +#pragma comment(lib, wxWX_LIB_NAME("base", "")) + +#ifndef wxNO_NET_LIB + #pragma comment(lib, wxBASE_LIB_NAME("net")) +#endif +#ifndef wxNO_XML_LIB + #pragma comment(lib, wxBASE_LIB_NAME("xml")) +#endif +#if wxUSE_REGEX && !defined(wxNO_REGEX_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME_U("regex")) +#endif + +#if wxUSE_GUI + #if wxUSE_XML && !defined(wxNO_EXPAT_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("expat")) + #endif + #if wxUSE_LIBJPEG && !defined(wxNO_JPEG_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("jpeg")) + #endif + #if wxUSE_LIBPNG && !defined(wxNO_PNG_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("png")) + #endif + #if wxUSE_LIBTIFF && !defined(wxNO_TIFF_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("tiff")) + #endif + #if wxUSE_ZLIB && !defined(wxNO_ZLIB_LIB) && !defined(WXUSINGDLL) + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("zlib")) + #endif + + #pragma comment(lib, wxTOOLKIT_LIB_NAME("core")) + + #ifndef wxNO_ADV_LIB + #pragma comment(lib, wxTOOLKIT_LIB_NAME("adv")) + #endif + + #ifndef wxNO_HTML_LIB + #pragma comment(lib, wxTOOLKIT_LIB_NAME("html")) + #endif + #if wxUSE_GLCANVAS && !defined(wxNO_GL_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("gl")) + #endif + #if wxUSE_DEBUGREPORT && !defined(wxNO_QA_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("qa")) + #endif + #if wxUSE_XRC && !defined(wxNO_XRC_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("xrc")) + #endif + #if wxUSE_AUI && !defined(wxNO_AUI_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("aui")) + #endif + #if wxUSE_PROPGRID && !defined(wxNO_PROPGRID_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("propgrid")) + #endif + #if wxUSE_RIBBON && !defined(wxNO_RIBBON_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("ribbon")) + #endif + #if wxUSE_RICHTEXT && !defined(wxNO_RICHTEXT_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("richtext")) + #endif + #if wxUSE_MEDIACTRL && !defined(wxNO_MEDIA_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("media")) + #endif + #if wxUSE_STC && !defined(wxNO_STC_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("stc")) + #ifndef WXUSINGDLL + #pragma comment(lib, wx3RD_PARTY_LIB_NAME("scintilla")) + #endif + #endif + #if wxUSE_WEBVIEW && !defined(wxNO_WEBVIEW_LIB) + #pragma comment(lib, wxTOOLKIT_LIB_NAME("webview")) + #endif +#endif // wxUSE_GUI + + +#ifndef WXUSINGDLL + // Make sure all required system libraries are added to the linker too when + // using static libraries. + #pragma comment(lib, "kernel32") + #pragma comment(lib, "user32") + #pragma comment(lib, "gdi32") + #pragma comment(lib, "comdlg32") + #pragma comment(lib, "winspool") + #pragma comment(lib, "winmm") + #pragma comment(lib, "shell32") + #pragma comment(lib, "comctl32") + #pragma comment(lib, "ole32") + #pragma comment(lib, "oleaut32") + #pragma comment(lib, "uuid") + #pragma comment(lib, "rpcrt4") + #pragma comment(lib, "advapi32") + #pragma comment(lib, "wsock32") + #if wxUSE_URL_NATIVE + #pragma comment(lib, "wininet") + #endif + + #ifdef __WXGTK__ + #pragma comment(lib, "gtk-win32-2.0.lib") + #pragma comment(lib, "gdk-win32-2.0.lib") + #pragma comment(lib, "pangocairo-1.0.lib") + #pragma comment(lib, "gdk_pixbuf-2.0.lib") + #pragma comment(lib, "cairo.lib") + #pragma comment(lib, "pango-1.0.lib") + #pragma comment(lib, "gobject-2.0.lib") + #pragma comment(lib, "gthread-2.0.lib") + #pragma comment(lib, "glib-2.0.lib") + #endif +#endif // !WXUSINGDLL diff --git a/Externals/wxWidgets3/include/wx/aboutdlg.h b/Externals/wxWidgets3/include/wx/aboutdlg.h index 0552f91fd1..975b5def27 100644 --- a/Externals/wxWidgets3/include/wx/aboutdlg.h +++ b/Externals/wxWidgets3/include/wx/aboutdlg.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxAboutDialog class // Author: Vadim Zeitlin // Created: 2006-10-07 -// RCS-ID: $Id: aboutdlg.h 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/accel.h b/Externals/wxWidgets3/include/wx/accel.h index 200feffe4d..5226b8b35a 100644 --- a/Externals/wxWidgets3/include/wx/accel.h +++ b/Externals/wxWidgets3/include/wx/accel.h @@ -4,7 +4,6 @@ // Author: Julian Smart, Robert Roebling, Vadim Zeitlin // Modified by: // Created: 31.05.01 (extracted from other files) -// RCS-ID: $Id: accel.h 68718 2011-08-16 11:55:39Z SC $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -118,7 +117,12 @@ public: // returns a wxString for the this accelerator. // this function formats it using the - format // where maybe a hyphen-separated list of "shift|alt|ctrl" - wxString ToString() const; + wxString ToString() const { return AsPossiblyLocalizedString(true); } + + // same as above but without translating, useful if the string is meant to + // be stored in a file or otherwise stored, instead of being shown to the + // user + wxString ToRawString() const { return AsPossiblyLocalizedString(false); } // returns true if the given string correctly initialized this object // (i.e. if IsOk() returns true after this call) @@ -126,6 +130,8 @@ public: private: + wxString AsPossiblyLocalizedString(bool localized) const; + // common part of Create() and FromString() static bool ParseAccel(const wxString& str, int *flags, int *keycode); diff --git a/Externals/wxWidgets3/include/wx/access.h b/Externals/wxWidgets3/include/wx/access.h index 0ca94a7e10..70cbaf1389 100644 --- a/Externals/wxWidgets3/include/wx/access.h +++ b/Externals/wxWidgets3/include/wx/access.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-02-12 -// RCS-ID: $Id: access.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/affinematrix2d.h b/Externals/wxWidgets3/include/wx/affinematrix2d.h index 6516cd46f5..28055f8d35 100644 --- a/Externals/wxWidgets3/include/wx/affinematrix2d.h +++ b/Externals/wxWidgets3/include/wx/affinematrix2d.h @@ -36,7 +36,7 @@ public: virtual bool IsEqual(const wxAffineMatrix2DBase& t) const; virtual void Translate(wxDouble dx, wxDouble dy); virtual void Scale(wxDouble xScale, wxDouble yScale); - virtual void Rotate(wxDouble ccRadians); + virtual void Rotate(wxDouble cRadians); protected: virtual wxPoint2DDouble DoTransformPoint(const wxPoint2DDouble& p) const; diff --git a/Externals/wxWidgets3/include/wx/afterstd.h b/Externals/wxWidgets3/include/wx/afterstd.h index 40969fd4b6..16075fe5d7 100644 --- a/Externals/wxWidgets3/include/wx/afterstd.h +++ b/Externals/wxWidgets3/include/wx/afterstd.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07/07/03 -// RCS-ID: $Id: afterstd.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -13,7 +12,7 @@ See the comments in beforestd.h. */ -#if defined(__WXMSW__) +#if defined(__WINDOWS__) #include "wx/msw/winundef.h" #endif diff --git a/Externals/wxWidgets3/include/wx/anidecod.h b/Externals/wxWidgets3/include/wx/anidecod.h index f2d0a300ba..2923887b49 100644 --- a/Externals/wxWidgets3/include/wx/anidecod.h +++ b/Externals/wxWidgets3/include/wx/anidecod.h @@ -2,7 +2,6 @@ // Name: wx/anidecod.h // Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation // Author: Francesco Montorsi -// CVS-ID: $Id: anidecod.h 66716 2011-01-19 12:28:31Z DS $ // Copyright: (c) 2006 Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/animate.h b/Externals/wxWidgets3/include/wx/animate.h index 072a379f2f..6243fb4568 100644 --- a/Externals/wxWidgets3/include/wx/animate.h +++ b/Externals/wxWidgets3/include/wx/animate.h @@ -4,7 +4,6 @@ // Author: Julian Smart and Guillermo Rodriguez Garcia // Modified by: Francesco Montorsi // Created: 13/8/99 -// RCS-ID: $Id: animate.h 56651 2008-11-02 22:16:14Z FM $ // Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/animdecod.h b/Externals/wxWidgets3/include/wx/animdecod.h index eacfe5d729..58177e68fd 100644 --- a/Externals/wxWidgets3/include/wx/animdecod.h +++ b/Externals/wxWidgets3/include/wx/animdecod.h @@ -2,7 +2,6 @@ // Name: wx/animdecod.h // Purpose: wxAnimationDecoder // Author: Francesco Montorsi -// CVS-ID: $Id: animdecod.h 62789 2009-12-05 19:57:58Z PC $ // Copyright: (c) 2006 Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/any.h b/Externals/wxWidgets3/include/wx/any.h index b38a1d491c..c2cd7a79f4 100644 --- a/Externals/wxWidgets3/include/wx/any.h +++ b/Externals/wxWidgets3/include/wx/any.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: 07/05/2009 -// RCS-ID: $Id: any.h 66621 2011-01-07 17:22:59Z SC $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -912,6 +911,8 @@ public: WXANY_IMPLEMENT_INT_EQ_OP(wxLongLong_t, wxULongLong_t) #endif + wxGCC_WARNING_SUPPRESS(float-equal) + bool operator==(float value) const { if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) @@ -932,6 +933,8 @@ public: (wxAnyValueTypeImpl::GetValue(m_buffer)); } + wxGCC_WARNING_RESTORE(float-equal) + bool operator==(bool value) const { if ( !wxAnyValueTypeImpl::IsSameClass(m_type) ) diff --git a/Externals/wxWidgets3/include/wx/anybutton.h b/Externals/wxWidgets3/include/wx/anybutton.h index 4275c6bfd8..ebeac3b551 100644 --- a/Externals/wxWidgets3/include/wx/anybutton.h +++ b/Externals/wxWidgets3/include/wx/anybutton.h @@ -3,7 +3,6 @@ // Purpose: wxAnyButtonBase class // Author: Vadim Zetlin // Created: 2000-08-15 (extracted from button.h) -// RCS-ID: $Id: anybutton.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zetlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/anystr.h b/Externals/wxWidgets3/include/wx/anystr.h index b330f8022f..8eebaf9b03 100644 --- a/Externals/wxWidgets3/include/wx/anystr.h +++ b/Externals/wxWidgets3/include/wx/anystr.h @@ -3,7 +3,6 @@ // Purpose: wxAnyStrPtr class declaration // Author: Vadim Zeitlin // Created: 2009-03-23 -// RCS-ID: $Id: anystr.h 59829 2009-03-25 09:54:10Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/app.h b/Externals/wxWidgets3/include/wx/app.h index 64f1220629..60e02b35cc 100644 --- a/Externals/wxWidgets3/include/wx/app.h +++ b/Externals/wxWidgets3/include/wx/app.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: app.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -103,6 +102,9 @@ public: // be done here. When OnRun() returns, the programs starts shutting down. virtual int OnRun(); + // Called before the first events are handled, called from within MainLoop() + virtual void OnLaunched(); + // This is called by wxEventLoopBase::SetActive(): you should put the code // which needs an active event loop here. // Note that this function is called whenever an event loop is activated; @@ -228,6 +230,14 @@ public: // for it static wxAppTraits *GetTraitsIfExists(); + // Return some valid traits object. + // + // This method checks if we have wxTheApp and returns its traits if it does + // exist and the traits are non-NULL, similarly to GetTraitsIfExists(), but + // falls back to wxConsoleAppTraits to ensure that it always returns + // something valid. + static wxAppTraits& GetValidTraits(); + // returns the main event loop instance, i.e. the event loop which is started // by OnRun() and which dispatches all events sent from the native toolkit // to the application (except when new event loops are temporarily set-up). @@ -236,6 +246,18 @@ public: wxEventLoopBase* GetMainLoop() const { return m_mainLoop; } + // This function sets the C locale to the default locale for the current + // environment. It is advised to call this to ensure that the underlying + // toolkit uses the locale in which the numbers and monetary amounts are + // shown in the format expected by user and so on. + // + // Notice that this does _not_ change the global C++ locale, you need to do + // it explicitly if you want. + // + // Finally, notice that while this function is virtual, it is not supposed + // to be overridden outside of the library itself. + virtual void SetCLocale(); + // event processing functions // -------------------------- @@ -494,7 +516,7 @@ protected: wxDECLARE_NO_COPY_CLASS(wxAppConsoleBase); }; -#if defined(__UNIX__) && !defined(__CYGWIN__) +#if defined(__UNIX__) && !defined(__WXMSW__) #include "wx/unix/app.h" #else // this has to be a class and not a typedef as we forward declare it @@ -636,10 +658,9 @@ public: virtual void SetActive(bool isActive, wxWindow *lastFocus); #if WXWIN_COMPATIBILITY_2_6 - // OBSOLETE: don't use, always returns true - // // returns true if the program is successfully initialized - wxDEPRECATED( bool Initialized() ); + wxDEPRECATED_MSG("always returns true now, don't call") + bool Initialized(); #endif // WXWIN_COMPATIBILITY_2_6 protected: @@ -766,13 +787,26 @@ public: // your compiler really, really wants main() to be in your main program (e.g. // hello.cpp). Now wxIMPLEMENT_APP should add this code if required. -#define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ - int main(int argc, char **argv) \ - { \ - wxDISABLE_DEBUG_SUPPORT(); \ +// For compilers that support it, prefer to use wmain() as this ensures any +// Unicode strings can be passed as command line parameters and not just those +// representable in the current locale. +#if wxUSE_UNICODE && defined(__VISUALC__) + #define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ + int wmain(int argc, wchar_t **argv) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ \ - return wxEntry(argc, argv); \ - } + return wxEntry(argc, argv); \ + } +#else // Use standard main() + #define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ + int main(int argc, char **argv) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ + \ + return wxEntry(argc, argv); \ + } +#endif // port-specific header could have defined it already in some special way #ifndef wxIMPLEMENT_WXWIN_MAIN @@ -795,6 +829,7 @@ public: // Use this macro if you want to define your own main() or WinMain() function // and call wxEntry() from there. #define wxIMPLEMENT_APP_NO_MAIN(appname) \ + appname& wxGetApp() { return *static_cast(wxApp::GetInstance()); } \ wxAppConsole *wxCreateApp() \ { \ wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ @@ -802,9 +837,7 @@ public: return new appname; \ } \ wxAppInitializer \ - wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \ - appname& wxGetApp() { return *static_cast(wxApp::GetInstance()); } \ - wxDECLARE_APP(appname) + wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp) // Same as wxIMPLEMENT_APP() normally but doesn't include themes support in // wxUniversal builds diff --git a/Externals/wxWidgets3/include/wx/apptrait.h b/Externals/wxWidgets3/include/wx/apptrait.h index 4dbf8d218c..da1b39b1d3 100644 --- a/Externals/wxWidgets3/include/wx/apptrait.h +++ b/Externals/wxWidgets3/include/wx/apptrait.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.06.2003 -// RCS-ID: $Id: apptrait.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -77,12 +76,6 @@ public: // except in the case of wxMac and wxCocoa virtual wxStandardPaths& GetStandardPaths(); -#if wxUSE_INTL - // called during wxApp initialization to set the locale to correspond to - // the user default (i.e. system locale under Windows, LC_ALL under Unix) - virtual void SetLocale(); -#endif // wxUSE_INTL - // functions abstracting differences between GUI and console modes // ------------------------------------------------------------------------ diff --git a/Externals/wxWidgets3/include/wx/archive.h b/Externals/wxWidgets3/include/wx/archive.h index f57e1189d6..9f284668dd 100644 --- a/Externals/wxWidgets3/include/wx/archive.h +++ b/Externals/wxWidgets3/include/wx/archive.h @@ -2,7 +2,6 @@ // Name: wx/archive.h // Purpose: Streams for archive formats // Author: Mike Wetherell -// RCS-ID: $Id: archive.h 66780 2011-01-27 11:00:26Z SC $ // Copyright: (c) 2004 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/arrimpl.cpp b/Externals/wxWidgets3/include/wx/arrimpl.cpp index 945da1b586..0ef9e74890 100644 --- a/Externals/wxWidgets3/include/wx/arrimpl.cpp +++ b/Externals/wxWidgets3/include/wx/arrimpl.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 16.10.97 -// RCS-ID: $Id: arrimpl.cpp 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) 1997 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -91,13 +90,13 @@ void name::Insert(const T& item, size_t uiIndex, size_t nInsert) \ base_array::operator[](uiIndex + i) = new T(item); \ } \ \ -int name::Index(const T& Item, bool bFromEnd) const \ +int name::Index(const T& item, bool bFromEnd) const \ { \ if ( bFromEnd ) { \ if ( size() > 0 ) { \ size_t ui = size() - 1; \ do { \ - if ( (T*)base_array::operator[](ui) == &Item ) \ + if ( (T*)base_array::operator[](ui) == &item ) \ return static_cast(ui); \ ui--; \ } \ @@ -106,7 +105,7 @@ int name::Index(const T& Item, bool bFromEnd) const \ } \ else { \ for( size_t ui = 0; ui < size(); ui++ ) { \ - if( (T*)base_array::operator[](ui) == &Item ) \ + if( (T*)base_array::operator[](ui) == &item ) \ return static_cast(ui); \ } \ } \ diff --git a/Externals/wxWidgets3/include/wx/arrstr.h b/Externals/wxWidgets3/include/wx/arrstr.h index 76343c71e5..db67c8ef08 100644 --- a/Externals/wxWidgets3/include/wx/arrstr.h +++ b/Externals/wxWidgets3/include/wx/arrstr.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon and Vadim Zeitlin // Modified by: // Created: 07/07/03 -// RCS-ID: $Id: arrstr.h 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -425,7 +424,7 @@ private: // ---------------------------------------------------------------------------- // by default, these functions use the escape character to escape the -// separators occuring inside the string to be joined, this can be disabled by +// separators occurring inside the string to be joined, this can be disabled by // passing '\0' as escape WXDLLIMPEXP_BASE wxString wxJoin(const wxArrayString& arr, diff --git a/Externals/wxWidgets3/include/wx/artprov.h b/Externals/wxWidgets3/include/wx/artprov.h index af3402965e..3e95ed98fe 100644 --- a/Externals/wxWidgets3/include/wx/artprov.h +++ b/Externals/wxWidgets3/include/wx/artprov.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 18/03/2002 -// RCS-ID: $Id: artprov.h 66966 2011-02-19 12:32:59Z VZ $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/atomic.h b/Externals/wxWidgets3/include/wx/atomic.h index 0c53ebef93..1439d29484 100644 --- a/Externals/wxWidgets3/include/wx/atomic.h +++ b/Externals/wxWidgets3/include/wx/atomic.h @@ -3,7 +3,6 @@ // Purpose: functions to manipulate atomically integers and pointers // Author: Armel Asselin // Created: 12/13/2006 -// RCS-ID: $Id: atomic.h 70808 2012-03-04 20:31:42Z VZ $ // Copyright: (c) Armel Asselin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/aui/aui.h b/Externals/wxWidgets3/include/wx/aui/aui.h index 80129a35a1..df3a9166a1 100644 --- a/Externals/wxWidgets3/include/wx/aui/aui.h +++ b/Externals/wxWidgets3/include/wx/aui/aui.h @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: aui.h 55231 2008-08-24 09:28:07Z BIW $ // Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/aui/auibar.h b/Externals/wxWidgets3/include/wx/aui/auibar.h index 3440840a3b..52e2525215 100644 --- a/Externals/wxWidgets3/include/wx/aui/auibar.h +++ b/Externals/wxWidgets3/include/wx/aui/auibar.h @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2008-08-04 -// RCS-ID: $Id: auibar.h 69594 2011-10-30 16:51:10Z VZ $ // Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -39,6 +38,7 @@ enum wxAuiToolBarStyle // analogous to wxAUI_TB_VERTICAL, but forces the toolbar // to be horizontal wxAUI_TB_HORIZONTAL = 1 << 7, + wxAUI_TB_PLAIN_BACKGROUND = 1 << 8, wxAUI_TB_HORZ_TEXT = (wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_TEXT), wxAUI_ORIENTATION_MASK = (wxAUI_TB_VERTICAL | wxAUI_TB_HORIZONTAL), wxAUI_TB_DEFAULT_STYLE = 0 @@ -211,7 +211,14 @@ public: void SetActive(bool b) { m_active = b; } bool IsActive() const { return m_active; } - void SetHasDropDown(bool b) { m_dropDown = b; } + void SetHasDropDown(bool b) + { + wxCHECK_RET( !b || m_kind == wxITEM_NORMAL, + wxS("Only normal tools can have drop downs") ); + + m_dropDown = b; + } + bool HasDropDown() const { return m_dropDown; } void SetSticky(bool b) { m_sticky = b; } @@ -275,6 +282,11 @@ public: wxWindow* wnd, const wxRect& rect) = 0; + virtual void DrawPlainBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + virtual void DrawLabel( wxDC& dc, wxWindow* wnd, @@ -356,6 +368,10 @@ public: wxWindow* wnd, const wxRect& rect); + virtual void DrawPlainBackground(wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + virtual void DrawLabel( wxDC& dc, wxWindow* wnd, @@ -439,16 +455,27 @@ protected: class WXDLLIMPEXP_AUI wxAuiToolBar : public wxControl { public: + wxAuiToolBar() { Init(); } wxAuiToolBar(wxWindow* parent, - wxWindowID id = -1, - const wxPoint& position = wxDefaultPosition, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxAUI_TB_DEFAULT_STYLE); + long style = wxAUI_TB_DEFAULT_STYLE) + { + Init(); + Create(parent, id, pos, size, style); + } + virtual ~wxAuiToolBar(); - void SetWindowStyleFlag(long style); - long GetWindowStyleFlag() const; + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAUI_TB_DEFAULT_STYLE); + + virtual void SetWindowStyleFlag(long style); void SetArtProvider(wxAuiToolBarArt* art); wxAuiToolBarArt* GetArtProvider() const; @@ -581,6 +608,7 @@ public: virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); protected: + void Init(); virtual void OnCustomRender(wxDC& WXUNUSED(dc), const wxAuiToolBarItem& WXUNUSED(item), @@ -651,7 +679,6 @@ protected: bool m_dragging; bool m_gripperVisible; bool m_overflowVisible; - long m_style; bool RealizeHelper(wxClientDC& dc, bool horizontal); static bool IsPaneValid(long style, const wxAuiPaneInfo& pane); @@ -676,11 +703,11 @@ private: #ifndef SWIG -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_AUI, wxEVT_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); typedef void (wxEvtHandler::*wxAuiToolBarEventFunction)(wxAuiToolBarEvent&); @@ -688,34 +715,41 @@ typedef void (wxEvtHandler::*wxAuiToolBarEventFunction)(wxAuiToolBarEvent&); wxEVENT_HANDLER_CAST(wxAuiToolBarEventFunction, func) #define EVT_AUITOOLBAR_TOOL_DROPDOWN(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, winid, wxAuiToolBarEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, winid, wxAuiToolBarEventHandler(fn)) #define EVT_AUITOOLBAR_OVERFLOW_CLICK(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, winid, wxAuiToolBarEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_OVERFLOW_CLICK, winid, wxAuiToolBarEventHandler(fn)) #define EVT_AUITOOLBAR_RIGHT_CLICK(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, winid, wxAuiToolBarEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_RIGHT_CLICK, winid, wxAuiToolBarEventHandler(fn)) #define EVT_AUITOOLBAR_MIDDLE_CLICK(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, winid, wxAuiToolBarEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_MIDDLE_CLICK, winid, wxAuiToolBarEventHandler(fn)) #define EVT_AUITOOLBAR_BEGIN_DRAG(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, winid, wxAuiToolBarEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUITOOLBAR_BEGIN_DRAG, winid, wxAuiToolBarEventHandler(fn)) #else // wxpython/swig event work -%constant wxEventType wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN; -%constant wxEventType wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK; -%constant wxEventType wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK; -%constant wxEventType wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK; -%constant wxEventType wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG; +%constant wxEventType wxEVT_AUITOOLBAR_TOOL_DROPDOWN; +%constant wxEventType wxEVT_AUITOOLBAR_OVERFLOW_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_RIGHT_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_MIDDLE_CLICK; +%constant wxEventType wxEVT_AUITOOLBAR_BEGIN_DRAG; %pythoncode { - EVT_AUITOOLBAR_TOOL_DROPDOWN = wx.PyEventBinder( wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, 1 ) - EVT_AUITOOLBAR_OVERFLOW_CLICK = wx.PyEventBinder( wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, 1 ) - EVT_AUITOOLBAR_RIGHT_CLICK = wx.PyEventBinder( wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, 1 ) - EVT_AUITOOLBAR_MIDDLE_CLICK = wx.PyEventBinder( wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, 1 ) - EVT_AUITOOLBAR_BEGIN_DRAG = wx.PyEventBinder( wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, 1 ) + EVT_AUITOOLBAR_TOOL_DROPDOWN = wx.PyEventBinder( wxEVT_AUITOOLBAR_TOOL_DROPDOWN, 1 ) + EVT_AUITOOLBAR_OVERFLOW_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_OVERFLOW_CLICK, 1 ) + EVT_AUITOOLBAR_RIGHT_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_RIGHT_CLICK, 1 ) + EVT_AUITOOLBAR_MIDDLE_CLICK = wx.PyEventBinder( wxEVT_AUITOOLBAR_MIDDLE_CLICK, 1 ) + EVT_AUITOOLBAR_BEGIN_DRAG = wx.PyEventBinder( wxEVT_AUITOOLBAR_BEGIN_DRAG, 1 ) } #endif // SWIG +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN wxEVT_AUITOOLBAR_TOOL_DROPDOWN +#define wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK wxEVT_AUITOOLBAR_OVERFLOW_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK wxEVT_AUITOOLBAR_RIGHT_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK wxEVT_AUITOOLBAR_MIDDLE_CLICK +#define wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG wxEVT_AUITOOLBAR_BEGIN_DRAG + #endif // wxUSE_AUI #endif // _WX_AUIBAR_H_ diff --git a/Externals/wxWidgets3/include/wx/aui/auibook.h b/Externals/wxWidgets3/include/wx/aui/auibook.h index e8e4527ff6..17b3fdae9f 100644 --- a/Externals/wxWidgets3/include/wx/aui/auibook.h +++ b/Externals/wxWidgets3/include/wx/aui/auibook.h @@ -2,7 +2,7 @@ // Name: wx/aui/auibook.h // Purpose: wxaui: wx advanced user interface - notebook // Author: Benjamin I. Williams -// Modified by: +// Modified by: Jens Lody // Created: 2006-06-28 // Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 @@ -21,10 +21,10 @@ #if wxUSE_AUI +#include "wx/aui/tabart.h" #include "wx/aui/framemanager.h" -#include "wx/aui/dockart.h" -#include "wx/aui/floatpane.h" #include "wx/bookctrl.h" +#include "wx/containr.h" class wxAuiNotebook; @@ -95,6 +95,7 @@ class WXDLLIMPEXP_AUI wxAuiNotebookPage public: wxWindow* window; // page's associated window wxString caption; // caption displayed on the tab + wxString tooltip; // tooltip displayed when hovering over tab title wxBitmap bitmap; // tab's bitmap wxRect rect; // tab's hit rectangle bool active; // true if the page is currently active @@ -119,254 +120,6 @@ WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiTabContainerButton, wxAuiTabContainerButt #endif -// tab art class - -class WXDLLIMPEXP_AUI wxAuiTabArt -{ -public: - - wxAuiTabArt() { } - virtual ~wxAuiTabArt() { } - - virtual wxAuiTabArt* Clone() = 0; - virtual void SetFlags(unsigned int flags) = 0; - - virtual void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount) = 0; - - virtual void SetNormalFont(const wxFont& font) = 0; - virtual void SetSelectedFont(const wxFont& font) = 0; - virtual void SetMeasuringFont(const wxFont& font) = 0; - virtual void SetColour(const wxColour& colour) = 0; - virtual void SetActiveColour(const wxColour& colour) = 0; - - virtual void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect) = 0; - - virtual void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent) = 0; - - virtual void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect) = 0; - - virtual wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent) = 0; - - virtual int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx) = 0; - - virtual int GetIndentSize() = 0; - - virtual int GetBestTabCtrlSize( - wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize) = 0; -}; - - -class WXDLLIMPEXP_AUI wxAuiDefaultTabArt : public wxAuiTabArt -{ - -public: - - wxAuiDefaultTabArt(); - virtual ~wxAuiDefaultTabArt(); - - wxAuiTabArt* Clone(); - void SetFlags(unsigned int flags); - void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount); - - void SetNormalFont(const wxFont& font); - void SetSelectedFont(const wxFont& font); - void SetMeasuringFont(const wxFont& font); - void SetColour(const wxColour& colour); - void SetActiveColour(const wxColour& colour); - - void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect); - - void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent); - - void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect); - - int GetIndentSize(); - - wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent); - - int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx); - - int GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize); - -protected: - - wxFont m_normalFont; - wxFont m_selectedFont; - wxFont m_measuringFont; - wxColour m_baseColour; - wxPen m_baseColourPen; - wxPen m_borderPen; - wxBrush m_baseColourBrush; - wxColour m_activeColour; - wxBitmap m_activeCloseBmp; - wxBitmap m_disabledCloseBmp; - wxBitmap m_activeLeftBmp; - wxBitmap m_disabledLeftBmp; - wxBitmap m_activeRightBmp; - wxBitmap m_disabledRightBmp; - wxBitmap m_activeWindowListBmp; - wxBitmap m_disabledWindowListBmp; - - int m_fixedTabWidth; - int m_tabCtrlHeight; - unsigned int m_flags; -}; - - -class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt -{ - -public: - - wxAuiSimpleTabArt(); - virtual ~wxAuiSimpleTabArt(); - - wxAuiTabArt* Clone(); - void SetFlags(unsigned int flags); - - void SetSizingInfo(const wxSize& tabCtrlSize, - size_t tabCount); - - void SetNormalFont(const wxFont& font); - void SetSelectedFont(const wxFont& font); - void SetMeasuringFont(const wxFont& font); - void SetColour(const wxColour& colour); - void SetActiveColour(const wxColour& colour); - - void DrawBackground( - wxDC& dc, - wxWindow* wnd, - const wxRect& rect); - - void DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& pane, - const wxRect& inRect, - int closeButtonState, - wxRect* outTabRect, - wxRect* outButtonRect, - int* xExtent); - - void DrawButton( - wxDC& dc, - wxWindow* wnd, - const wxRect& inRect, - int bitmapId, - int buttonState, - int orientation, - wxRect* outRect); - - int GetIndentSize(); - - wxSize GetTabSize( - wxDC& dc, - wxWindow* wnd, - const wxString& caption, - const wxBitmap& bitmap, - bool active, - int closeButtonState, - int* xExtent); - - int ShowDropDown( - wxWindow* wnd, - const wxAuiNotebookPageArray& items, - int activeIdx); - - int GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmpSize); - -protected: - - wxFont m_normalFont; - wxFont m_selectedFont; - wxFont m_measuringFont; - wxPen m_normalBkPen; - wxPen m_selectedBkPen; - wxBrush m_normalBkBrush; - wxBrush m_selectedBkBrush; - wxBrush m_bkBrush; - wxBitmap m_activeCloseBmp; - wxBitmap m_disabledCloseBmp; - wxBitmap m_activeLeftBmp; - wxBitmap m_disabledLeftBmp; - wxBitmap m_activeRightBmp; - wxBitmap m_disabledRightBmp; - wxBitmap m_activeWindowListBmp; - wxBitmap m_disabledWindowListBmp; - - int m_fixedTabWidth; - unsigned int m_flags; -}; - - - - - - - - - class WXDLLIMPEXP_AUI wxAuiTabContainer { public: @@ -536,13 +289,16 @@ public: bool DeletePage(size_t page); bool RemovePage(size_t page); - size_t GetPageCount() const; - wxWindow* GetPage(size_t pageIdx) const; + virtual size_t GetPageCount() const; + virtual wxWindow* GetPage(size_t pageIdx) const; int GetPageIndex(wxWindow* pageWnd) const; bool SetPageText(size_t page, const wxString& text); wxString GetPageText(size_t pageIdx) const; + bool SetPageToolTip(size_t page, const wxString& text); + wxString GetPageToolTip(size_t pageIdx) const; + bool SetPageBitmap(size_t page, const wxBitmap& bitmap); wxBitmap GetPageBitmap(size_t pageIdx) const; @@ -571,9 +327,6 @@ public: // Gets the height of the notebook for a given page height int GetHeightForPageHeight(int pageHeight); - // Advances the selection, generation page selection events - void AdvanceSelection(bool forward = true); - // Shows the window menu bool ShowWindowMenu(); @@ -583,9 +336,6 @@ public: // we don't want focus for ourselves // virtual bool AcceptsFocus() const { return false; } - // Redo sizing after thawing - virtual void Thaw(); - //wxBookCtrlBase functions virtual void SetPageSize (const wxSize &size); @@ -594,8 +344,6 @@ public: virtual int GetPageImage(size_t n) const; virtual bool SetPageImage(size_t n, int imageId); - wxWindow* GetCurrentPage () const; - virtual int ChangeSelection(size_t n); virtual bool AddPage(wxWindow *page, const wxString &text, bool select, @@ -611,6 +359,9 @@ protected: // choose the default border for this window virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + // Redo sizing after thawing + virtual void DoThaw(); + // these can be overridden // update the height, return true if it was done or false if the new height @@ -693,21 +444,21 @@ protected: #ifndef SWIG -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, wxAuiNotebookEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_PAGE_CLOSED, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_DRAG_DONE, wxAuiNotebookEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_AUI, wxEVT_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent); typedef void (wxEvtHandler::*wxAuiNotebookEventFunction)(wxAuiNotebookEvent&); @@ -715,73 +466,91 @@ typedef void (wxEvtHandler::*wxAuiNotebookEventFunction)(wxAuiNotebookEvent&); wxEVENT_HANDLER_CAST(wxAuiNotebookEventFunction, func) #define EVT_AUINOTEBOOK_PAGE_CLOSE(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CLOSE, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_PAGE_CLOSED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CLOSED, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CHANGED, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_PAGE_CHANGING, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_BUTTON(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BUTTON, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_BEGIN_DRAG(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BEGIN_DRAG, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_END_DRAG(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_END_DRAG, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_DRAG_MOTION(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_DRAG_MOTION, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_ALLOW_DND(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_ALLOW_DND, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_DRAG_DONE(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_DRAG_DONE, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_TAB_MIDDLE_UP(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_TAB_RIGHT_DOWN(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_TAB_RIGHT_UP(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, winid, wxAuiNotebookEventHandler(fn)) #define EVT_AUINOTEBOOK_BG_DCLICK(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, winid, wxAuiNotebookEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_AUINOTEBOOK_BG_DCLICK, winid, wxAuiNotebookEventHandler(fn)) #else // wxpython/swig event work -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BUTTON; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_END_DRAG; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP; -%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CLOSE; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CLOSED; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CHANGED; +%constant wxEventType wxEVT_AUINOTEBOOK_PAGE_CHANGING; +%constant wxEventType wxEVT_AUINOTEBOOK_BUTTON; +%constant wxEventType wxEVT_AUINOTEBOOK_BEGIN_DRAG; +%constant wxEventType wxEVT_AUINOTEBOOK_END_DRAG; +%constant wxEventType wxEVT_AUINOTEBOOK_DRAG_MOTION; +%constant wxEventType wxEVT_AUINOTEBOOK_ALLOW_DND; +%constant wxEventType wxEVT_AUINOTEBOOK_DRAG_DONE; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN; +%constant wxEventType wxEVT_AUINOTEBOOK_TAB_RIGHT_UP; +%constant wxEventType wxEVT_AUINOTEBOOK_BG_DCLICK; %pythoncode { - EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 1 ) - EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 1 ) - EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 1 ) - EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 1 ) - EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 1 ) - EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 1 ) - EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 1 ) - EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 1 ) - EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 1 ) - EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 1 ) - EVT__AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1 ) - EVT__AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, 1 ) - EVT__AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 1 ) - EVT__AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 1 ) - EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 1 ) + EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CLOSE, 1 ) + EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CLOSED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CHANGED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder( wxEVT_AUINOTEBOOK_PAGE_CHANGING, 1 ) + EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BUTTON, 1 ) + EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BEGIN_DRAG, 1 ) + EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder( wxEVT_AUINOTEBOOK_END_DRAG, 1 ) + EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder( wxEVT_AUINOTEBOOK_DRAG_MOTION, 1 ) + EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder( wxEVT_AUINOTEBOOK_ALLOW_DND, 1 ) + EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder( wxEVT_AUINOTEBOOK_DRAG_DONE, 1 ) + EVT__AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1 ) + EVT__AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, 1 ) + EVT__AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, 1 ) + EVT__AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, 1 ) + EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder( wxEVT_AUINOTEBOOK_BG_DCLICK, 1 ) } #endif +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE wxEVT_AUINOTEBOOK_PAGE_CLOSE +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED wxEVT_AUINOTEBOOK_PAGE_CLOSED +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED wxEVT_AUINOTEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING wxEVT_AUINOTEBOOK_PAGE_CHANGING +#define wxEVT_COMMAND_AUINOTEBOOK_BUTTON wxEVT_AUINOTEBOOK_BUTTON +#define wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG wxEVT_AUINOTEBOOK_BEGIN_DRAG +#define wxEVT_COMMAND_AUINOTEBOOK_END_DRAG wxEVT_AUINOTEBOOK_END_DRAG +#define wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION wxEVT_AUINOTEBOOK_DRAG_MOTION +#define wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND wxEVT_AUINOTEBOOK_ALLOW_DND +#define wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE wxEVT_AUINOTEBOOK_DRAG_DONE +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN +#define wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP wxEVT_AUINOTEBOOK_TAB_RIGHT_UP +#define wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK wxEVT_AUINOTEBOOK_BG_DCLICK +#define wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG wxEVT_AUINOTEBOOK_CANCEL_DRAG + #endif // wxUSE_AUI #endif // _WX_AUINOTEBOOK_H_ diff --git a/Externals/wxWidgets3/include/wx/aui/dockart.h b/Externals/wxWidgets3/include/wx/aui/dockart.h index fbc2ba7593..744cad56c4 100644 --- a/Externals/wxWidgets3/include/wx/aui/dockart.h +++ b/Externals/wxWidgets3/include/wx/aui/dockart.h @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: dockart.h 69590 2011-10-30 14:20:03Z VZ $ // Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/aui/floatpane.h b/Externals/wxWidgets3/include/wx/aui/floatpane.h index d88614555d..bf158933b8 100644 --- a/Externals/wxWidgets3/include/wx/aui/floatpane.h +++ b/Externals/wxWidgets3/include/wx/aui/floatpane.h @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: floatpane.h 69590 2011-10-30 14:20:03Z VZ $ // Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/aui/framemanager.h b/Externals/wxWidgets3/include/wx/aui/framemanager.h index c11491617f..4f6b4641b1 100644 --- a/Externals/wxWidgets3/include/wx/aui/framemanager.h +++ b/Externals/wxWidgets3/include/wx/aui/framemanager.h @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: framemanager.h 70807 2012-03-04 20:31:34Z VZ $ // Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/aui/tabart.h b/Externals/wxWidgets3/include/wx/aui/tabart.h new file mode 100644 index 0000000000..3de076c9e3 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/aui/tabart.h @@ -0,0 +1,324 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/tabart.h +// Purpose: wxaui: wx advanced user interface - notebook +// Author: Benjamin I. Williams +// Modified by: Jens Lody (extracted from wx/aui/auibook.h) +// Created: 2012-03-21 +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_AUI_TABART_H_ +#define _WX_AUI_TABART_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/font.h" +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/bitmap.h" + + +class wxAuiNotebookPage; +class wxAuiNotebookPageArray; +class wxWindow; +class wxDC; + + +// tab art class + +class WXDLLIMPEXP_AUI wxAuiTabArt +{ +public: + + wxAuiTabArt() { } + virtual ~wxAuiTabArt() { } + + virtual wxAuiTabArt* Clone() = 0; + virtual void SetFlags(unsigned int flags) = 0; + + virtual void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount) = 0; + + virtual void SetNormalFont(const wxFont& font) = 0; + virtual void SetSelectedFont(const wxFont& font) = 0; + virtual void SetMeasuringFont(const wxFont& font) = 0; + virtual void SetColour(const wxColour& colour) = 0; + virtual void SetActiveColour(const wxColour& colour) = 0; + + virtual void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent) = 0; + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect) = 0; + + virtual wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent) = 0; + + virtual int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx) = 0; + + virtual int GetIndentSize() = 0; + + virtual int GetBorderWidth( + wxWindow* wnd) = 0; + + virtual int GetAdditionalBorderSpace( + wxWindow* wnd) = 0; + + virtual int GetBestTabCtrlSize( + wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize) = 0; +}; + + +class WXDLLIMPEXP_AUI wxAuiGenericTabArt : public wxAuiTabArt +{ + +public: + + wxAuiGenericTabArt(); + virtual ~wxAuiGenericTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + int GetBorderWidth( + wxWindow* wnd); + + int GetAdditionalBorderSpace( + wxWindow* wnd); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxColour m_baseColour; + wxPen m_baseColourPen; + wxPen m_borderPen; + wxBrush m_baseColourBrush; + wxColour m_activeColour; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + int m_tabCtrlHeight; + unsigned int m_flags; +}; + + +class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt +{ + +public: + + wxAuiSimpleTabArt(); + virtual ~wxAuiSimpleTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + + void SetSizingInfo(const wxSize& tabCtrlSize, + size_t tabCount); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + void SetColour(const wxColour& colour); + void SetActiveColour(const wxColour& colour); + + void DrawBorder( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& inRect, + int closeButtonState, + wxRect* outTabRect, + wxRect* outButtonRect, + int* xExtent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& inRect, + int bitmapId, + int buttonState, + int orientation, + wxRect* outRect); + + int GetIndentSize(); + + int GetBorderWidth( + wxWindow* wnd); + + int GetAdditionalBorderSpace( + wxWindow* wnd); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int closeButtonState, + int* xExtent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int activeIdx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmpSize); + +protected: + + wxFont m_normalFont; + wxFont m_selectedFont; + wxFont m_measuringFont; + wxPen m_normalBkPen; + wxPen m_selectedBkPen; + wxBrush m_normalBkBrush; + wxBrush m_selectedBkBrush; + wxBrush m_bkBrush; + wxBitmap m_activeCloseBmp; + wxBitmap m_disabledCloseBmp; + wxBitmap m_activeLeftBmp; + wxBitmap m_disabledLeftBmp; + wxBitmap m_activeRightBmp; + wxBitmap m_disabledRightBmp; + wxBitmap m_activeWindowListBmp; + wxBitmap m_disabledWindowListBmp; + + int m_fixedTabWidth; + unsigned int m_flags; +}; + +#ifndef __WXUNIVERSAL__ + #if defined(__WXGTK20__) && !defined(__WXGTK3__) + #define wxHAS_NATIVE_TABART + #include "wx/aui/tabartgtk.h" + #define wxAuiDefaultTabArt wxAuiGtkTabArt + #endif +#endif // !__WXUNIVERSAL__ + +#ifndef wxHAS_NATIVE_TABART + #define wxAuiDefaultTabArt wxAuiGenericTabArt +#endif + +#endif // wxUSE_AUI + +#endif // _WX_AUI_TABART_H_ diff --git a/Externals/wxWidgets3/include/wx/aui/tabartgtk.h b/Externals/wxWidgets3/include/wx/aui/tabartgtk.h new file mode 100644 index 0000000000..85fe9e2a50 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/aui/tabartgtk.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/aui/tabartgtk.h +// Purpose: declaration of the wxAuiGTKTabArt +// Author: Jens Lody and Teodor Petrov +// Modified by: +// Created: 2012-03-23 +// Copyright: (c) 2012 Jens Lody +// and Teodor Petrov +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUI_TABARTGTK_H_ +#define _WX_AUI_TABARTGTK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/aui/tabart.h" +#include "wx/gdicmn.h" + +class wxWindow; +class wxDC; + +class WXDLLIMPEXP_AUI wxAuiGtkTabArt : public wxAuiGenericTabArt +{ +public: + wxAuiGtkTabArt(); + + virtual wxAuiTabArt* Clone(); + virtual void DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect); + virtual void DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect); + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent); + void DrawButton(wxDC& dc, wxWindow* wnd, const wxRect& in_rect, int bitmap_id, + int button_state, int orientation, wxRect* out_rect); + int GetBestTabCtrlSize(wxWindow* wnd, const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size); + int GetBorderWidth(wxWindow* wnd); + int GetAdditionalBorderSpace(wxWindow* wnd); + virtual wxSize GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption, + const wxBitmap& bitmap, bool active, + int close_button_state, int* x_extent); +}; + +#endif // wxUSE_AUI + +#endif // _WX_AUI_TABARTGTK_H_ diff --git a/Externals/wxWidgets3/include/wx/aui/tabmdi.h b/Externals/wxWidgets3/include/wx/aui/tabmdi.h index 6a680845b3..8750831747 100644 --- a/Externals/wxWidgets3/include/wx/aui/tabmdi.h +++ b/Externals/wxWidgets3/include/wx/aui/tabmdi.h @@ -4,7 +4,6 @@ // Author: Hans Van Leemputten // Modified by: Benjamin I. Williams / Kirix Corporation // Created: 29/07/2002 -// RCS-ID: $Id: tabmdi.h 70909 2012-03-15 13:49:54Z VZ $ // Copyright: (c) Hans Van Leemputten // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -85,7 +84,6 @@ public: protected: wxAuiMDIClientWindow* m_pClientWindow; - wxAuiMDIChildFrame* m_pActiveChild; wxEvent* m_pLastEvt; #if wxUSE_MENUS @@ -250,6 +248,11 @@ public: long style = wxVSCROLL | wxHSCROLL); virtual int SetSelection(size_t page); + virtual wxAuiMDIChildFrame* GetActiveChild(); + virtual void SetActiveChild(wxAuiMDIChildFrame* pChildFrame) + { + SetSelection(GetPageIndex(pChildFrame)); + } protected: diff --git a/Externals/wxWidgets3/include/wx/bannerwindow.h b/Externals/wxWidgets3/include/wx/bannerwindow.h index 1ce3bc3170..1f1fb24611 100644 --- a/Externals/wxWidgets3/include/wx/bannerwindow.h +++ b/Externals/wxWidgets3/include/wx/bannerwindow.h @@ -3,7 +3,6 @@ // Purpose: wxBannerWindow class declaration // Author: Vadim Zeitlin // Created: 2011-08-16 -// RCS-ID: $Id: bannerwindow.h 69859 2011-11-28 18:58:52Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/base64.h b/Externals/wxWidgets3/include/wx/base64.h index 4ccaf97d59..96c6dd80ef 100644 --- a/Externals/wxWidgets3/include/wx/base64.h +++ b/Externals/wxWidgets3/include/wx/base64.h @@ -3,7 +3,6 @@ // Purpose: declaration of BASE64 encoding/decoding functionality // Author: Charles Reimers, Vadim Zeitlin // Created: 2007-06-18 -// RCS-ID: $Id: base64.h 62614 2009-11-11 14:38:40Z VZ $ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/beforestd.h b/Externals/wxWidgets3/include/wx/beforestd.h index 2a1a98cc76..cc335d317b 100644 --- a/Externals/wxWidgets3/include/wx/beforestd.h +++ b/Externals/wxWidgets3/include/wx/beforestd.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07/07/03 -// RCS-ID: $Id: beforestd.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/bitmap.h b/Externals/wxWidgets3/include/wx/bitmap.h index ab9046803c..506ef6983d 100644 --- a/Externals/wxWidgets3/include/wx/bitmap.h +++ b/Externals/wxWidgets3/include/wx/bitmap.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 22.04.01 -// RCS-ID: $Id: bitmap.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,7 @@ class WXDLLIMPEXP_FWD_CORE wxBitmapHandler; class WXDLLIMPEXP_FWD_CORE wxIcon; class WXDLLIMPEXP_FWD_CORE wxMask; class WXDLLIMPEXP_FWD_CORE wxPalette; +class WXDLLIMPEXP_FWD_CORE wxDC; // ---------------------------------------------------------------------------- // wxVariant support @@ -83,6 +83,23 @@ protected: #define wxBITMAP_SCREEN_DEPTH (-1) +// ---------------------------------------------------------------------------- +// wxBitmapHelpers: container for various bitmap methods common to all ports. +// ---------------------------------------------------------------------------- + +// Unfortunately, currently wxBitmap does not inherit from wxBitmapBase on all +// platforms and this is not easy to fix. So we extract at least some common +// methods into this class from which both wxBitmapBase (and hence wxBitmap on +// all platforms where it does inherit from it) and wxBitmap in wxMSW and other +// exceptional ports (only wxPM and old wxCocoa) inherit. +class WXDLLIMPEXP_CORE wxBitmapHelpers +{ +public: + // Create a new wxBitmap from the PNG data in the given buffer. + static wxBitmap NewFromPNGData(const void* data, size_t size); +}; + + // All ports except wxMSW and wxOS2 use wxBitmapHandler and wxBitmapBase as // base class for wxBitmapHandler; wxMSW and wxOS2 use wxGDIImageHandler as // base class since it allows some code reuse there. @@ -132,12 +149,12 @@ private: DECLARE_ABSTRACT_CLASS(wxBitmapHandler) }; - // ---------------------------------------------------------------------------- // wxBitmap: class which represents platform-dependent bitmap (unlike wxImage) // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxBitmapBase : public wxGDIObject +class WXDLLIMPEXP_CORE wxBitmapBase : public wxGDIObject, + public wxBitmapHelpers { public: /* @@ -157,6 +174,8 @@ public: virtual bool Create(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH) = 0; virtual bool Create(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH) = 0; + virtual bool CreateScaled(int w, int h, int d, double logicalScale) + { return Create(w*logicalScale,h*logicalScale,d); } virtual int GetHeight() const = 0; virtual int GetWidth() const = 0; @@ -165,6 +184,13 @@ public: wxSize GetSize() const { return wxSize(GetWidth(), GetHeight()); } + // support for scaled bitmaps + virtual double GetScaleFactor() const { return 1.0; } + virtual double GetScaledWidth() const { return GetWidth() / GetScaleFactor(); } + virtual double GetScaledHeight() const { return GetHeight() / GetScaleFactor(); } + virtual wxSize GetScaledSize() const + { return wxSize(GetScaledWidth(), GetScaledHeight()); } + #if wxUSE_IMAGE virtual wxImage ConvertToImage() const = 0; @@ -243,7 +269,11 @@ protected: #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM #include "wx/x11/bitmap.h" #elif defined(__WXGTK20__) - #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #else + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/gtk/bitmap.h" #elif defined(__WXGTK__) #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM @@ -275,7 +305,13 @@ wxBitmap:: #endif ConvertToDisabled(unsigned char brightness) const { - return ConvertToImage().ConvertToDisabled(brightness); + // XXX comex: scale support + wxImage disabledImage = ConvertToImage().ConvertToDisabled(brightness); + #ifdef __APPLE__ + return wxBitmap(disabledImage, -1, GetScaleFactor()); + #else + return disabledImage; + #endif } #endif // wxUSE_IMAGE diff --git a/Externals/wxWidgets3/include/wx/bmpbuttn.h b/Externals/wxWidgets3/include/wx/bmpbuttn.h index c2632b88f6..ead0ba81ec 100644 --- a/Externals/wxWidgets3/include/wx/bmpbuttn.h +++ b/Externals/wxWidgets3/include/wx/bmpbuttn.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 25.08.00 -// RCS-ID: $Id: bmpbuttn.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -25,6 +24,8 @@ #define wxHAS_BUTTON_BITMAP #endif +class WXDLLIMPEXP_FWD_CORE wxBitmapButton; + // ---------------------------------------------------------------------------- // wxBitmapButton: a button which shows bitmaps instead of the usual string. // It has different bitmaps for different states (focused/disabled/pressed) @@ -64,6 +65,12 @@ public: validator, name); } + // Special creation function for a standard "Close" bitmap. It allows to + // simply create a close button with the image appropriate for the common + // platform. + static wxBitmapButton* NewCloseButton(wxWindow* parent, wxWindowID winid); + + // set/get the margins around the button virtual void SetMargins(int x, int y) { diff --git a/Externals/wxWidgets3/include/wx/bmpcbox.h b/Externals/wxWidgets3/include/wx/bmpcbox.h index 671c10a05c..dd69525741 100644 --- a/Externals/wxWidgets3/include/wx/bmpcbox.h +++ b/Externals/wxWidgets3/include/wx/bmpcbox.h @@ -5,7 +5,6 @@ // Modified by: // Created: Aug-31-2006 // Copyright: (c) Jaakko Salli -// RCS-ID: $Id: bmpcbox.h 63204 2010-01-22 15:52:20Z JJ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/bookctrl.h b/Externals/wxWidgets3/include/wx/bookctrl.h index b3a6809690..8b4fbb2fce 100644 --- a/Externals/wxWidgets3/include/wx/bookctrl.h +++ b/Externals/wxWidgets3/include/wx/bookctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.08.03 -// RCS-ID: $Id: bookctrl.h 69082 2011-09-14 08:24:06Z SJL $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -95,7 +94,7 @@ public: virtual size_t GetPageCount() const { return m_pages.size(); } // get the panel which represents the given page - wxWindow *GetPage(size_t n) const { return m_pages[n]; } + virtual wxWindow *GetPage(size_t n) const { return m_pages[n]; } // get the current page or NULL if none wxWindow *GetCurrentPage() const @@ -215,6 +214,9 @@ public: } } + // return the index of the given page or wxNOT_FOUND + int FindPage(const wxWindow* page) const; + // hit test: returns which page is hit and, optionally, where (icon, label) virtual int HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(flags) = NULL) const @@ -253,6 +255,10 @@ protected: // false otherwise. bool DoSetSelectionAfterInsertion(size_t n, bool bSelect); + // Update the selection after removing the page at the given index, + // typically called from the derived class overridden DoRemovePage(). + void DoSetSelectionAfterRemoval(size_t n); + // set the selection to the given page, sending the events (which can // possibly prevent the page change from taking place) if SendEvent flag is // included @@ -277,6 +283,11 @@ protected: { wxFAIL_MSG(wxT("Override this function!")); } + // The derived class also may override the following method, also called + // from DoSetSelection(), to show/hide pages differently. + virtual void DoShowPage(wxWindow* page, bool show) { page->Show(show); } + + // Should we accept NULL page pointers in Add/InsertPage()? // // Default is no but derived classes may override it if they can treat NULL @@ -284,7 +295,11 @@ protected: // having nodes without any associated page) virtual bool AllowNullPage() const { return false; } - // remove the page and return a pointer to it + // Remove the page and return a pointer to it. + // + // It also needs to update the current selection if necessary, i.e. if the + // page being removed comes before the selected one and the helper method + // DoSetSelectionAfterRemoval() can be used for this. virtual wxWindow *DoRemovePage(size_t page) = 0; // our best size is the size which fits all our pages @@ -399,20 +414,24 @@ typedef void (wxEvtHandler::*wxBookCtrlEventFunction)(wxBookCtrlEvent&); // dedicated to majority of desktops #include "wx/notebook.h" #define wxBookCtrl wxNotebook - #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED - #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING + #define wxEVT_BOOKCTRL_PAGE_CHANGED wxEVT_NOTEBOOK_PAGE_CHANGED + #define wxEVT_BOOKCTRL_PAGE_CHANGING wxEVT_NOTEBOOK_PAGE_CHANGING #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_NOTEBOOK_PAGE_CHANGED(id, fn) #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_NOTEBOOK_PAGE_CHANGING(id, fn) #else // dedicated to Smartphones #include "wx/choicebk.h" #define wxBookCtrl wxChoicebook - #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED - #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING + #define wxEVT_BOOKCTRL_PAGE_CHANGED wxEVT_CHOICEBOOK_PAGE_CHANGED + #define wxEVT_BOOKCTRL_PAGE_CHANGING wxEVT_CHOICEBOOK_PAGE_CHANGING #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_CHOICEBOOK_PAGE_CHANGED(id, fn) #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_CHOICEBOOK_PAGE_CHANGING(id, fn) #endif +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_BOOKCTRL_PAGE_CHANGED +#define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_BOOKCTRL_PAGE_CHANGING + #if WXWIN_COMPATIBILITY_2_6 #define wxBC_TOP wxBK_TOP #define wxBC_BOTTOM wxBK_BOTTOM diff --git a/Externals/wxWidgets3/include/wx/brush.h b/Externals/wxWidgets3/include/wx/brush.h index 7dbb89425d..1bf2c3005c 100644 --- a/Externals/wxWidgets3/include/wx/brush.h +++ b/Externals/wxWidgets3/include/wx/brush.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: brush.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -27,14 +26,14 @@ enum wxBrushStyle wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE = wxSTIPPLE_MASK_OPAQUE, wxBRUSHSTYLE_STIPPLE_MASK = wxSTIPPLE_MASK, wxBRUSHSTYLE_STIPPLE = wxSTIPPLE, - wxBRUSHSTYLE_BDIAGONAL_HATCH = wxBDIAGONAL_HATCH, - wxBRUSHSTYLE_CROSSDIAG_HATCH = wxCROSSDIAG_HATCH, - wxBRUSHSTYLE_FDIAGONAL_HATCH = wxFDIAGONAL_HATCH, - wxBRUSHSTYLE_CROSS_HATCH = wxCROSS_HATCH, - wxBRUSHSTYLE_HORIZONTAL_HATCH = wxHORIZONTAL_HATCH, - wxBRUSHSTYLE_VERTICAL_HATCH = wxVERTICAL_HATCH, - wxBRUSHSTYLE_FIRST_HATCH = wxFIRST_HATCH, - wxBRUSHSTYLE_LAST_HATCH = wxLAST_HATCH + wxBRUSHSTYLE_BDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxBRUSHSTYLE_CROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxBRUSHSTYLE_FDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxBRUSHSTYLE_CROSS_HATCH = wxHATCHSTYLE_CROSS, + wxBRUSHSTYLE_HORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxBRUSHSTYLE_VERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxBRUSHSTYLE_FIRST_HATCH = wxHATCHSTYLE_FIRST, + wxBRUSHSTYLE_LAST_HATCH = wxHATCHSTYLE_LAST }; diff --git a/Externals/wxWidgets3/include/wx/buffer.h b/Externals/wxWidgets3/include/wx/buffer.h index 8b57207f1d..c88e160270 100644 --- a/Externals/wxWidgets3/include/wx/buffer.h +++ b/Externals/wxWidgets3/include/wx/buffer.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.04.99 -// RCS-ID: $Id: buffer.h 70417 2012-01-20 22:11:51Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -230,7 +229,8 @@ protected: static CharType *StrCopy(const CharType *src, size_t len) { CharType *dst = (CharType*)malloc(sizeof(CharType) * (len + 1)); - memcpy(dst, src, sizeof(CharType) * (len + 1)); + if ( dst ) + memcpy(dst, src, sizeof(CharType) * (len + 1)); return dst; } @@ -438,7 +438,7 @@ public: friend class wxMemoryBuffer; - // everyting is private as it can only be used by wxMemoryBuffer + // everything is private as it can only be used by wxMemoryBuffer private: wxMemoryBufferData(size_t size = wxMemoryBufferData::DefBufSize) : m_data(size ? malloc(size) : NULL), m_size(size), m_len(0), m_ref(0) diff --git a/Externals/wxWidgets3/include/wx/build.h b/Externals/wxWidgets3/include/wx/build.h index ac0393fb99..0959a29782 100644 --- a/Externals/wxWidgets3/include/wx/build.h +++ b/Externals/wxWidgets3/include/wx/build.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Vaclav Slavik // Modified by: // Created: 07.05.02 -// RCS-ID: $Id: build.h 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 2002 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/busyinfo.h b/Externals/wxWidgets3/include/wx/busyinfo.h index ae63552870..600c86c634 100644 --- a/Externals/wxWidgets3/include/wx/busyinfo.h +++ b/Externals/wxWidgets3/include/wx/busyinfo.h @@ -3,7 +3,6 @@ // Purpose: Information window (when app is busy) // Author: Vaclav Slavik // Copyright: (c) 1999 Vaclav Slavik -// RCS-ID: $Id: busyinfo.h 37158 2006-01-26 15:40:46Z ABX $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/button.h b/Externals/wxWidgets3/include/wx/button.h index d164eee800..71dbee41de 100644 --- a/Externals/wxWidgets3/include/wx/button.h +++ b/Externals/wxWidgets3/include/wx/button.h @@ -4,7 +4,6 @@ // Author: Vadim Zetlin // Modified by: // Created: 15.08.00 -// RCS-ID: $Id: button.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zetlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/calctrl.h b/Externals/wxWidgets3/include/wx/calctrl.h index 7c2921d8e0..16a84748d2 100644 --- a/Externals/wxWidgets3/include/wx/calctrl.h +++ b/Externals/wxWidgets3/include/wx/calctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29.12.99 -// RCS-ID: $Id: calctrl.h 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/caret.h b/Externals/wxWidgets3/include/wx/caret.h index 6ba5814b9f..e6e9728ff8 100644 --- a/Externals/wxWidgets3/include/wx/caret.h +++ b/Externals/wxWidgets3/include/wx/caret.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.05.99 -// RCS-ID: $Id: caret.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/chartype.h b/Externals/wxWidgets3/include/wx/chartype.h index d122b4c71c..5217258d1b 100644 --- a/Externals/wxWidgets3/include/wx/chartype.h +++ b/Externals/wxWidgets3/include/wx/chartype.h @@ -4,7 +4,6 @@ * Author: Joel Farley, Ove KÃ¥ven * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 - * RCS-ID: $Id: chartype.h 70345 2012-01-15 01:05:28Z VZ $ * Copyright: (c) 1998-2006 wxWidgets dev team * Licence: wxWindows licence */ @@ -48,16 +47,11 @@ Actually MinGW has tchar.h, but it does not include wchar.h */ -#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__) +#if defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__) #ifndef HAVE_WCHAR_H #define HAVE_WCHAR_H #endif #endif -#if defined(__MWERKS__) && !defined(__MACH__) - #ifndef HAVE_WCSLEN - #define HAVE_WCSLEN - #endif -#endif #ifdef HAVE_WCHAR_H /* the current (as of Nov 2002) version of cygwin has a bug in its */ diff --git a/Externals/wxWidgets3/include/wx/checkbox.h b/Externals/wxWidgets3/include/wx/checkbox.h index 507bf31fea..e0978a0d13 100644 --- a/Externals/wxWidgets3/include/wx/checkbox.h +++ b/Externals/wxWidgets3/include/wx/checkbox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07.09.00 -// RCS-ID: $Id: checkbox.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/checkeddelete.h b/Externals/wxWidgets3/include/wx/checkeddelete.h index 3dad109fad..fd295faf8b 100644 --- a/Externals/wxWidgets3/include/wx/checkeddelete.h +++ b/Externals/wxWidgets3/include/wx/checkeddelete.h @@ -3,7 +3,6 @@ // Purpose: wxCHECKED_DELETE() macro // Author: Vadim Zeitlin // Created: 2009-02-03 -// RCS-ID: $Id: checkeddelete.h 58634 2009-02-03 12:01:46Z VZ $ // Copyright: (c) 2002-2009 wxWidgets dev team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,6 +10,8 @@ #ifndef _WX_CHECKEDDELETE_H_ #define _WX_CHECKEDDELETE_H_ +#include "wx/cpp.h" + // TODO: provide wxCheckedDelete[Array]() template functions too // ---------------------------------------------------------------------------- @@ -26,28 +27,17 @@ still force a semicolon after the macro */ -#ifdef __WATCOMC__ - #define wxFOR_ONCE(name) for(int name=0; name<1; name++) - #define wxPRE_NO_WARNING_SCOPE(name) wxFOR_ONCE(wxMAKE_UNIQUE_NAME(name)) - #define wxPOST_NO_WARNING_SCOPE(name) -#else - #define wxPRE_NO_WARNING_SCOPE(name) do - #define wxPOST_NO_WARNING_SCOPE(name) while ( wxFalse ) -#endif - #define wxCHECKED_DELETE(ptr) \ - wxPRE_NO_WARNING_SCOPE(scope_var1) \ - { \ + wxSTATEMENT_MACRO_BEGIN \ typedef char complete[sizeof(*ptr)] WX_ATTRIBUTE_UNUSED; \ delete ptr; \ - } wxPOST_NO_WARNING_SCOPE(scope_var1) + wxSTATEMENT_MACRO_END #define wxCHECKED_DELETE_ARRAY(ptr) \ - wxPRE_NO_WARNING_SCOPE(scope_var2) \ - { \ + wxSTATEMENT_MACRO_BEGIN \ typedef char complete[sizeof(*ptr)] WX_ATTRIBUTE_UNUSED; \ delete [] ptr; \ - } wxPOST_NO_WARNING_SCOPE(scope_var2) + wxSTATEMENT_MACRO_END #endif // _WX_CHECKEDDELETE_H_ diff --git a/Externals/wxWidgets3/include/wx/checklst.h b/Externals/wxWidgets3/include/wx/checklst.h index 0092bc9e0e..3c54304d0e 100644 --- a/Externals/wxWidgets3/include/wx/checklst.h +++ b/Externals/wxWidgets3/include/wx/checklst.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.09.00 -// RCS-ID: $Id: checklst.h 65210 2010-08-08 11:35:55Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -37,6 +36,8 @@ public: virtual bool IsChecked(unsigned int item) const = 0; virtual void Check(unsigned int item, bool check = true) = 0; + virtual unsigned int GetCheckedItems(wxArrayInt& checkedItems) const; + wxDECLARE_NO_COPY_CLASS(wxCheckListBoxBase); }; diff --git a/Externals/wxWidgets3/include/wx/chkconf.h b/Externals/wxWidgets3/include/wx/chkconf.h index 80f104911b..47fa8ee467 100644 --- a/Externals/wxWidgets3/include/wx/chkconf.h +++ b/Externals/wxWidgets3/include/wx/chkconf.h @@ -4,7 +4,6 @@ * Author: Vadim Zeitlin * Modified by: * Created: 09.08.00 - * RCS-ID: $Id: chkconf.h 70703 2012-02-26 20:24:25Z VZ $ * Copyright: (c) 2000 Vadim Zeitlin * Licence: wxWindows licence */ @@ -92,6 +91,14 @@ # endif #endif /* wxUSE_ANY */ +#ifndef wxUSE_COMPILER_TLS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMPILER_TLS must be defined, please read comment near the top of this file." +# else +# define wxUSE_COMPILER_TLS 0 +# endif +#endif /* !defined(wxUSE_COMPILER_TLS) */ + #ifndef wxUSE_CONSOLE_EVENTLOOP # ifdef wxABORT_ON_CONFIG_ERROR # error "wxUSE_CONSOLE_EVENTLOOP must be defined, please read comment near the top of this file." @@ -928,6 +935,14 @@ # endif #endif /* !defined(wxUSE_POPUPWIN) */ +#ifndef wxUSE_PREFERENCES_EDITOR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR must be defined, please read comment near the top of this file." +# else +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +#endif /* !defined(wxUSE_PREFERENCES_EDITOR) */ + #ifndef wxUSE_PRINTING_ARCHITECTURE # ifdef wxABORT_ON_CONFIG_ERROR # error "wxUSE_PRINTING_ARCHITECTURE must be defined, please read comment near the top of this file." @@ -1203,8 +1218,11 @@ #if defined(__WXWINCE__) # include "wx/msw/wince/chkconf.h" -#elif defined(__WXMSW__) +#elif defined(__WINDOWS__) # include "wx/msw/chkconf.h" +# if defined(__WXGTK__) +# include "wx/gtk/chkconf.h" +# endif #elif defined(__WXGTK__) # include "wx/gtk/chkconf.h" #elif defined(__WXCOCOA__) @@ -1225,9 +1243,9 @@ /* __UNIX__ is also defined under Cygwin but we shouldn't perform these checks - there if we're building wxMSW. + there if we're building Windows ports. */ -#if defined(__UNIX__) && !defined(__WXMSW__) +#if defined(__UNIX__) && !defined(__WINDOWS__) # include "wx/unix/chkconf.h" #endif @@ -1451,7 +1469,7 @@ */ #if wxUSE_GUI -#if wxUSE_ACCESSIBILITY && !defined(__WXMSW__) && !defined(__GCCXML__) +#if wxUSE_ACCESSIBILITY && !defined(__WXMSW__) # ifdef wxABORT_ON_CONFIG_ERROR # error "wxUSE_ACCESSIBILITY is currently only supported under wxMSW" # else @@ -2181,6 +2199,33 @@ # endif #endif /* wxUSE_WEBVIEW && !any web view backend */ +#if wxUSE_PREFERENCES_EDITOR + /* + We can use either a generic implementation, using wxNotebook, or a + native one under wxOSX/Cocoa but then we must be using the native + toolbar. + */ +# if !wxUSE_NOTEBOOK +# ifdef __WXOSX_COCOA__ +# if !wxUSE_TOOLBAR || !wxOSX_USE_NATIVE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR requires native toolbar in wxOSX" +# else +# undef wxUSE_PREFERENCES_EDITOR +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +# endif +# else +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PREFERENCES_EDITOR requires wxNotebook" +# else +# undef wxUSE_PREFERENCES_EDITOR +# define wxUSE_PREFERENCES_EDITOR 0 +# endif +# endif +# endif +#endif /* wxUSE_PREFERENCES_EDITOR */ + #endif /* wxUSE_GUI */ #endif /* _WX_CHKCONF_H_ */ diff --git a/Externals/wxWidgets3/include/wx/choicdlg.h b/Externals/wxWidgets3/include/wx/choicdlg.h index 36e36757cf..863b880aff 100644 --- a/Externals/wxWidgets3/include/wx/choicdlg.h +++ b/Externals/wxWidgets3/include/wx/choicdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: choicdlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/choice.h b/Externals/wxWidgets3/include/wx/choice.h index e7854fb3cc..3a848f9f3c 100644 --- a/Externals/wxWidgets3/include/wx/choice.h +++ b/Externals/wxWidgets3/include/wx/choice.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 26.07.99 -// RCS-ID: $Id: choice.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -58,6 +57,13 @@ public: // override wxItemContainer::IsSorted virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } +protected: + // The generic implementation doesn't determine the height correctly and + // doesn't account for the width of the arrow but does take into account + // the string widths, so the derived classes should override it and set the + // height and add the arrow width to the size returned by this version. + virtual wxSize DoGetBestSize() const; + private: wxDECLARE_NO_COPY_CLASS(wxChoiceBase); }; diff --git a/Externals/wxWidgets3/include/wx/choicebk.h b/Externals/wxWidgets3/include/wx/choicebk.h index abd37cbb7d..335ede165e 100644 --- a/Externals/wxWidgets3/include/wx/choicebk.h +++ b/Externals/wxWidgets3/include/wx/choicebk.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Wlodzimierz ABX Skiba from wx/listbook.h // Created: 15.09.04 -// RCS-ID: $Id: choicebk.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) Vadim Zeitlin, Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -18,11 +17,12 @@ #include "wx/bookctrl.h" #include "wx/choice.h" +#include "wx/containr.h" class WXDLLIMPEXP_FWD_CORE wxChoice; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_CHOICEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_CHOICEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); // wxChoicebook flags #define wxCHB_DEFAULT wxBK_DEFAULT @@ -36,7 +36,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGI // wxChoicebook // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxChoicebook : public wxBookCtrlBase +class WXDLLIMPEXP_CORE wxChoicebook : public wxNavigationEnabled { public: wxChoicebook() { } @@ -111,15 +111,19 @@ private: // ---------------------------------------------------------------------------- // wxChoicebookEvent is obsolete and defined for compatibility only -typedef wxBookCtrlEvent wxChoicebookEvent; +#define wxChoicebookEvent wxBookCtrlEvent typedef wxBookCtrlEventFunction wxChoicebookEventFunction; #define wxChoicebookEventHandler(func) wxBookCtrlEventHandler(func) #define EVT_CHOICEBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_CHOICEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) #define EVT_CHOICEBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_CHOICEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED wxEVT_CHOICEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING wxEVT_CHOICEBOOK_PAGE_CHANGING #endif // wxUSE_CHOICEBOOK diff --git a/Externals/wxWidgets3/include/wx/clipbrd.h b/Externals/wxWidgets3/include/wx/clipbrd.h index f9ff4df6af..5399be27d5 100644 --- a/Externals/wxWidgets3/include/wx/clipbrd.h +++ b/Externals/wxWidgets3/include/wx/clipbrd.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.10.99 -// RCS-ID: $Id: clipbrd.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/clntdata.h b/Externals/wxWidgets3/include/wx/clntdata.h index 177bf31c22..a41ccc0ea9 100644 --- a/Externals/wxWidgets3/include/wx/clntdata.h +++ b/Externals/wxWidgets3/include/wx/clntdata.h @@ -4,7 +4,6 @@ // Author: Robin Dunn // Modified by: // Created: 9-Oct-2001 -// RCS-ID: $Id: clntdata.h 47730 2007-07-26 13:54:14Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/clrpicker.h b/Externals/wxWidgets3/include/wx/clrpicker.h index 38bc05465e..1794ee68c9 100644 --- a/Externals/wxWidgets3/include/wx/clrpicker.h +++ b/Externals/wxWidgets3/include/wx/clrpicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Vadim Zeitlin, Francesco Montorsi -// RCS-ID: $Id: clrpicker.h 58718 2009-02-07 18:59:25Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -98,7 +97,7 @@ protected: class WXDLLIMPEXP_CORE wxColourPickerCtrl : public wxPickerBase { public: - wxColourPickerCtrl() : m_bIgnoreNextTextCtrlUpdate(false) {} + wxColourPickerCtrl() {} virtual ~wxColourPickerCtrl() {} @@ -107,7 +106,6 @@ public: const wxSize& size = wxDefaultSize, long style = wxCLRP_DEFAULT_STYLE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxColourPickerCtrlNameStr) - : m_bIgnoreNextTextCtrlUpdate(false) { Create(parent, id, col, pos, size, style, validator, name); } bool Create(wxWindow *parent, wxWindowID id, @@ -148,9 +146,6 @@ protected: virtual long GetPickerStyle(long style) const { return (style & wxCLRP_SHOW_LABEL); } - // true if the next UpdateTextCtrl() call is to ignore - bool m_bIgnoreNextTextCtrlUpdate; - private: DECLARE_DYNAMIC_CLASS(wxColourPickerCtrl) }; @@ -160,14 +155,14 @@ private: // wxColourPickerEvent: used by wxColourPickerCtrl only // ---------------------------------------------------------------------------- -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_COLOURPICKER_CHANGED, wxColourPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COLOURPICKER_CHANGED, wxColourPickerEvent ); class WXDLLIMPEXP_CORE wxColourPickerEvent : public wxCommandEvent { public: wxColourPickerEvent() {} wxColourPickerEvent(wxObject *generator, int id, const wxColour &col) - : wxCommandEvent(wxEVT_COMMAND_COLOURPICKER_CHANGED, id), + : wxCommandEvent(wxEVT_COLOURPICKER_CHANGED, id), m_colour(col) { SetEventObject(generator); @@ -196,9 +191,12 @@ typedef void (wxEvtHandler::*wxColourPickerEventFunction)(wxColourPickerEvent&); wxEVENT_HANDLER_CAST(wxColourPickerEventFunction, func) #define EVT_COLOURPICKER_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_COLOURPICKER_CHANGED, id, wxColourPickerEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_COLOURPICKER_CHANGED, id, wxColourPickerEventHandler(fn)) +// old wxEVT_COMMAND_* constant +#define wxEVT_COMMAND_COLOURPICKER_CHANGED wxEVT_COLOURPICKER_CHANGED + #endif // wxUSE_COLOURPICKERCTRL #endif // _WX_CLRPICKER_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/cmdargs.h b/Externals/wxWidgets3/include/wx/cmdargs.h index 3819af475f..e4167f0fd6 100644 --- a/Externals/wxWidgets3/include/wx/cmdargs.h +++ b/Externals/wxWidgets3/include/wx/cmdargs.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxCmdLineArgsArray helper class // Author: Vadim Zeitlin // Created: 2007-11-12 -// RCS-ID: $Id: cmdargs.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cmdline.h b/Externals/wxWidgets3/include/wx/cmdline.h index 8d02fa3a68..3dd41b9fe4 100644 --- a/Externals/wxWidgets3/include/wx/cmdline.h +++ b/Externals/wxWidgets3/include/wx/cmdline.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.01.00 -// RCS-ID: $Id: cmdline.h 69797 2011-11-22 13:18:58Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cmdproc.h b/Externals/wxWidgets3/include/wx/cmdproc.h index e1692cbef5..c6125096a0 100644 --- a/Externals/wxWidgets3/include/wx/cmdproc.h +++ b/Externals/wxWidgets3/include/wx/cmdproc.h @@ -4,7 +4,6 @@ // Author: Julian Smart (extracted from docview.h by VZ) // Modified by: // Created: 05.11.00 -// RCS-ID: $Id: cmdproc.h 70459 2012-01-25 00:05:09Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cmndata.h b/Externals/wxWidgets3/include/wx/cmndata.h index ce330fde5e..c8e345af56 100644 --- a/Externals/wxWidgets3/include/wx/cmndata.h +++ b/Externals/wxWidgets3/include/wx/cmndata.h @@ -4,7 +4,6 @@ // Author: Julian Smart and others // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: cmndata.h 70636 2012-02-20 21:55:55Z VZ $ // Copyright: (c) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSApplication.h b/Externals/wxWidgets3/include/wx/cocoa/NSApplication.h index 4c3390db5d..192d282782 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSApplication.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSApplication.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/01/26 -// RCS-ID: $Id: NSApplication.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2003,2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSBox.h b/Externals/wxWidgets3/include/wx/cocoa/NSBox.h index 6bb62b5556..39cbe3de5f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSBox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSBox.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/19 -// RCS-ID: $Id: NSBox.h 58022 2009-01-11 12:00:51Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSButton.h b/Externals/wxWidgets3/include/wx/cocoa/NSButton.h index 4cbcbb7a71..7e32aac07d 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSButton.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSButton.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/09 -// RCS-ID: $Id: NSButton.h 38031 2006-03-12 15:10:23Z VZ $ // Copyright: (c) 2002-2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSControl.h b/Externals/wxWidgets3/include/wx/cocoa/NSControl.h index 7fd8ee2664..f921c337d1 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSControl.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSControl.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/02/15 -// RCS-ID: $Id: NSControl.h 58022 2009-01-11 12:00:51Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSMenu.h b/Externals/wxWidgets3/include/wx/cocoa/NSMenu.h index ad0cbd592e..a413ad45a6 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSMenu.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSMenu.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/09 -// RCS-ID: $Id: NSMenu.h 49523 2007-10-29 16:18:59Z DE $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSPanel.h b/Externals/wxWidgets3/include/wx/cocoa/NSPanel.h index 0426742d85..25acf54c42 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSPanel.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSPanel.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: NSPanel.h 42046 2006-10-16 09:30:01Z ABX $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSScroller.h b/Externals/wxWidgets3/include/wx/cocoa/NSScroller.h index 9031df7909..3cafc5815a 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSScroller.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSScroller.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/27 -// RCS-ID: $Id: NSScroller.h 38031 2006-03-12 15:10:23Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSSlider.h b/Externals/wxWidgets3/include/wx/cocoa/NSSlider.h index 62edaeb422..0f278984ee 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSSlider.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSSlider.h @@ -4,7 +4,6 @@ // Author: Mark Oxenham // Modified by: David Elliott // Created: 2007/08/10 -// RCS-ID: $Id: NSSlider.h 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) 2007 Software 2000 Ltd. All rights reserved. // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSTabView.h b/Externals/wxWidgets3/include/wx/cocoa/NSTabView.h index 21b6a29109..8c4320d0ae 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSTabView.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSTabView.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/08 -// RCS-ID: $Id: NSTabView.h 38031 2006-03-12 15:10:23Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSTableDataSource.h b/Externals/wxWidgets3/include/wx/cocoa/NSTableDataSource.h index fbb4213bac..39e96a8343 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSTableDataSource.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSTableDataSource.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/08/05 -// RCS-ID: $Id: NSTableDataSource.h 48106 2007-08-15 16:10:19Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSTableView.h b/Externals/wxWidgets3/include/wx/cocoa/NSTableView.h index 2c47e7b54b..749a844d03 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSTableView.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSTableView.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/08/05 -// RCS-ID: $Id: NSTableView.h 38031 2006-03-12 15:10:23Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSTextField.h b/Externals/wxWidgets3/include/wx/cocoa/NSTextField.h index f497dc7412..5632318677 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSTextField.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSTextField.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/09 -// RCS-ID: $Id: NSTextField.h 58022 2009-01-11 12:00:51Z FM $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSView.h b/Externals/wxWidgets3/include/wx/cocoa/NSView.h index fbc17f20d4..3095fb1738 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSView.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSView.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/02/15 -// RCS-ID: $Id: NSView.h 51576 2008-02-06 20:10:07Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/NSWindow.h b/Externals/wxWidgets3/include/wx/cocoa/NSWindow.h index 0f4349db19..228ffe3ed0 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/NSWindow.h +++ b/Externals/wxWidgets3/include/wx/cocoa/NSWindow.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: NSWindow.h 49523 2007-10-29 16:18:59Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/ObjcAssociate.h b/Externals/wxWidgets3/include/wx/cocoa/ObjcAssociate.h index 45fd153efe..a6bf6e2ce4 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/ObjcAssociate.h +++ b/Externals/wxWidgets3/include/wx/cocoa/ObjcAssociate.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/03 -// RCS-ID: $Id: ObjcAssociate.h 42046 2006-10-16 09:30:01Z ABX $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/ObjcRef.h b/Externals/wxWidgets3/include/wx/cocoa/ObjcRef.h index 89c10199b5..d4aa6d91ec 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/ObjcRef.h +++ b/Externals/wxWidgets3/include/wx/cocoa/ObjcRef.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/03/28 -// RCS-ID: $Id: ObjcRef.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/app.h b/Externals/wxWidgets3/include/wx/cocoa/app.h index e0503fd9c6..dffb0cae63 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/app.h +++ b/Externals/wxWidgets3/include/wx/cocoa/app.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/11/27 -// RCS-ID: $Id: app.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/autorelease.h b/Externals/wxWidgets3/include/wx/cocoa/autorelease.h index 8006e36a46..cd5f6b3e26 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/autorelease.h +++ b/Externals/wxWidgets3/include/wx/cocoa/autorelease.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/11 -// RCS-ID: $Id: autorelease.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/bitmap.h b/Externals/wxWidgets3/include/wx/cocoa/bitmap.h index ac7e113b9c..392b50b5b9 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/bitmap.h +++ b/Externals/wxWidgets3/include/wx/cocoa/bitmap.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/19 -// RCS-ID: $Id: bitmap.h 59526 2009-03-14 13:57:51Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -64,7 +63,8 @@ protected: // wxBitmap // ======================================================================== -class WXDLLIMPEXP_CORE wxBitmap: public wxGDIObject +class WXDLLIMPEXP_CORE wxBitmap: public wxGDIObject, + public wxBitmapHelpers { // ------------------------------------------------------------------------ // initialization diff --git a/Externals/wxWidgets3/include/wx/cocoa/bmpbuttn.h b/Externals/wxWidgets3/include/wx/cocoa/bmpbuttn.h index 3517aa972a..10a1394872 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/bmpbuttn.h +++ b/Externals/wxWidgets3/include/wx/cocoa/bmpbuttn.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: bmpbuttn.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/brush.h b/Externals/wxWidgets3/include/wx/cocoa/brush.h index 82facc206a..d67294beac 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/brush.h +++ b/Externals/wxWidgets3/include/wx/cocoa/brush.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/03 -// RCS-ID: $Id: brush.h 54273 2008-06-17 17:28:26Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/button.h b/Externals/wxWidgets3/include/wx/cocoa/button.h index f328a9a338..d58d0fb6bd 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/button.h +++ b/Externals/wxWidgets3/include/wx/cocoa/button.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/29 -// RCS-ID: $Id: button.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/checkbox.h b/Externals/wxWidgets3/include/wx/cocoa/checkbox.h index 7dee9d265d..ba811c54e8 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/checkbox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/checkbox.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: checkbox.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/checklst.h b/Externals/wxWidgets3/include/wx/cocoa/checklst.h index 0a7ab329db..8f07894342 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/checklst.h +++ b/Externals/wxWidgets3/include/wx/cocoa/checklst.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: checklst.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/chkconf.h b/Externals/wxWidgets3/include/wx/cocoa/chkconf.h index 0b2516cc44..77ccadfe68 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/chkconf.h +++ b/Externals/wxWidgets3/include/wx/cocoa/chkconf.h @@ -3,7 +3,6 @@ * Purpose: wxCocoa-specific config settings checks * Author: Vadim Zeitlin * Created: 2008-09-11 - * RCS-ID: $Id: chkconf.h 67497 2011-04-15 19:18:34Z DS $ * Copyright: (c) 2008 Vadim Zeitlin * Licence: wxWindows licence */ diff --git a/Externals/wxWidgets3/include/wx/cocoa/choice.h b/Externals/wxWidgets3/include/wx/cocoa/choice.h index 594372ea9a..7fe2c06e8d 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/choice.h +++ b/Externals/wxWidgets3/include/wx/cocoa/choice.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: choice.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/clipbrd.h b/Externals/wxWidgets3/include/wx/cocoa/clipbrd.h index bab90b9d77..8571f8f56d 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/clipbrd.h +++ b/Externals/wxWidgets3/include/wx/cocoa/clipbrd.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/23 -// RCS-ID: $Id: clipbrd.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/colour.h b/Externals/wxWidgets3/include/wx/cocoa/colour.h index 5a0fe6b5cc..97593a3e3f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/colour.h +++ b/Externals/wxWidgets3/include/wx/cocoa/colour.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/06/17 -// RCS-ID: $Id: colour.h 54125 2008-06-11 19:17:41Z SC $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/combobox.h b/Externals/wxWidgets3/include/wx/cocoa/combobox.h index 5762ab9830..dc09cf216c 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/combobox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/combobox.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2005/02/16 -// RCS-ID: $Id: combobox.h 59263 2009-03-02 12:25:01Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/control.h b/Externals/wxWidgets3/include/wx/cocoa/control.h index 052140632e..cb493202a6 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/control.h +++ b/Externals/wxWidgets3/include/wx/cocoa/control.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/02/15 -// RCS-ID: $Id: control.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/cursor.h b/Externals/wxWidgets3/include/wx/cocoa/cursor.h index 5f2e476287..54209f0b19 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/cursor.h +++ b/Externals/wxWidgets3/include/wx/cocoa/cursor.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/11/27 -// RCS-ID: $Id: cursor.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dataform.h b/Externals/wxWidgets3/include/wx/cocoa/dataform.h index 2ada9b1530..870ddb0470 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dataform.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dataform.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/23 -// RCS-ID: $Id: dataform.h 46254 2007-05-30 22:02:19Z VS $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dataobj.h b/Externals/wxWidgets3/include/wx/cocoa/dataobj.h index ce7249e95a..d525029f9c 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dataobj.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dataobj.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/23 -// RCS-ID: $Id: dataobj.h 48095 2007-08-15 13:05:35Z VS $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dataobj2.h b/Externals/wxWidgets3/include/wx/cocoa/dataobj2.h index 49bb62b052..b824fe933e 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dataobj2.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dataobj2.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/23 -// RCS-ID: $Id: dataobj2.h 58227 2009-01-19 13:55:27Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dc.h b/Externals/wxWidgets3/include/wx/cocoa/dc.h index e388eccaec..0d4fec2065 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dc.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dc.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/04/01 -// RCS-ID: $Id: dc.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -165,9 +164,9 @@ protected: virtual void DoGetSize(int *width, int *height) const; virtual void DoGetSizeMM(int* width, int* height) const; - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); }; diff --git a/Externals/wxWidgets3/include/wx/cocoa/dcclient.h b/Externals/wxWidgets3/include/wx/cocoa/dcclient.h index 353f0e6a2b..631c6ffd33 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dcclient.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dcclient.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/04/01 -// RCS-ID: $Id: dcclient.h 50462 2007-12-04 04:22:16Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dcmemory.h b/Externals/wxWidgets3/include/wx/cocoa/dcmemory.h index 565df57236..33846293c3 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dcmemory.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dcmemory.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: dcmemory.h 57907 2009-01-08 14:21:53Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dcscreen.h b/Externals/wxWidgets3/include/wx/cocoa/dcscreen.h index 2c921e2ca6..af7d4ee54e 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dcscreen.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dcscreen.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: dcscreen.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dialog.h b/Externals/wxWidgets3/include/wx/cocoa/dialog.h index b9af3e5bc1..632df8f1bb 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dialog.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dialog.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/15 -// RCS-ID: $Id: dialog.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/dirdlg.h b/Externals/wxWidgets3/include/wx/cocoa/dirdlg.h index 2d2ffd3b6f..207f79baac 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/dirdlg.h +++ b/Externals/wxWidgets3/include/wx/cocoa/dirdlg.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: Hiroyuki Nakamura(maloninc) // Created: 2006-01-10 -// RCS-ID: $Id: dirdlg.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/evtloop.h b/Externals/wxWidgets3/include/wx/cocoa/evtloop.h index 99b990dc0a..366e46cb1b 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/evtloop.h +++ b/Externals/wxWidgets3/include/wx/cocoa/evtloop.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxGUIEventLoop for wxCocoa // Author: Vadim Zeitlin // Created: 2008-12-28 -// RCS-ID: $Id: evtloop.h 58911 2009-02-15 14:25:08Z FM $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -20,8 +19,7 @@ class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase public: wxGUIEventLoop() { m_exitcode = 0; } - virtual int Run(); - virtual void Exit(int rc = 0); + virtual void ScheduleExit(int rc = 0); virtual bool Pending() const; virtual bool Dispatch(); virtual int DispatchTimeout(unsigned long timeout); @@ -29,6 +27,8 @@ public: virtual bool YieldFor(long eventsToProcess); protected: + virtual int DoRun(); + int m_exitcode; wxDECLARE_NO_COPY_CLASS(wxGUIEventLoop); diff --git a/Externals/wxWidgets3/include/wx/cocoa/filedlg.h b/Externals/wxWidgets3/include/wx/cocoa/filedlg.h index 45b8b8be19..b888be18e7 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/filedlg.h +++ b/Externals/wxWidgets3/include/wx/cocoa/filedlg.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2004-10-02 -// RCS-ID: $Id: filedlg.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/font.h b/Externals/wxWidgets3/include/wx/cocoa/font.h index 4783532b44..c9c245f9e1 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/font.h +++ b/Externals/wxWidgets3/include/wx/cocoa/font.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: font.h 70445 2012-01-23 11:28:21Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,6 +37,20 @@ public: */ wxFont() { } + wxFont(const wxFontInfo& info) + { + Create(info.GetPointSize(), + info.GetFamily(), + info.GetStyle(), + info.GetWeight(), + info.IsUnderlined(), + info.GetFaceName(), + info.GetEncoding()); + + if ( info.IsUsingSizeInPixels() ) + SetPixelSize(info.GetPixelSize()); + } + /*! @abstract Platform-independent construction with individual properties */ #if FUTURE_WXWIN_COMPATIBILITY_3_0 @@ -75,19 +88,6 @@ public: SetPixelSize(pixelSize); } - wxFont(int pointSize, - wxFontFamily family, - int flags = wxFONTFLAG_DEFAULT, - const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT) - { - Create(pointSize, family, - GetStyleFromFlags(flags), - GetWeightFromFlags(flags), - GetUnderlinedFromFlags(flags), - face, encoding); - } - /*! @abstract Construction with opaque wxNativeFontInfo */ wxFont(const wxNativeFontInfo& info) diff --git a/Externals/wxWidgets3/include/wx/cocoa/frame.h b/Externals/wxWidgets3/include/wx/cocoa/frame.h index 0f62c5fbdc..ebdb56ed34 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/frame.h +++ b/Externals/wxWidgets3/include/wx/cocoa/frame.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: frame.h 60337 2009-04-25 12:59:09Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/gauge.h b/Externals/wxWidgets3/include/wx/cocoa/gauge.h index 0ee7b991d4..ffadb1c27b 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/gauge.h +++ b/Externals/wxWidgets3/include/wx/cocoa/gauge.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/15 -// RCS-ID: $Id: gauge.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/glcanvas.h b/Externals/wxWidgets3/include/wx/cocoa/glcanvas.h index 3a58bc1b0a..927c3e05ee 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/glcanvas.h +++ b/Externals/wxWidgets3/include/wx/cocoa/glcanvas.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/09/29 -// RCS-ID: $Id: glcanvas.h 47254 2007-07-09 10:09:52Z VS $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/icon.h b/Externals/wxWidgets3/include/wx/cocoa/icon.h index e4b48aa082..ac041ba354 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/icon.h +++ b/Externals/wxWidgets3/include/wx/cocoa/icon.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/08/11 -// RCS-ID: $Id: icon.h 65887 2010-10-23 21:47:22Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/listbox.h b/Externals/wxWidgets3/include/wx/cocoa/listbox.h index 257c172c34..a9f233aa8a 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/listbox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/listbox.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: listbox.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/log.h b/Externals/wxWidgets3/include/wx/cocoa/log.h index 9532068fe7..82f9319a48 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/log.h +++ b/Externals/wxWidgets3/include/wx/cocoa/log.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/02/07 -// RCS-ID: $Id: log.h 27408 2004-05-23 20:53:33Z JS $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/mbarman.h b/Externals/wxWidgets3/include/wx/cocoa/mbarman.h index 33c2f72f4c..0223cb5c74 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/mbarman.h +++ b/Externals/wxWidgets3/include/wx/cocoa/mbarman.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/09/04 -// RCS-ID: $Id: mbarman.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/mdi.h b/Externals/wxWidgets3/include/wx/cocoa/mdi.h index b2a547aaa2..6cef55caf2 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/mdi.h +++ b/Externals/wxWidgets3/include/wx/cocoa/mdi.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes // Created: 2003/09/08 -// RCS-ID: $Id: mdi.h 56674 2008-11-04 02:46:19Z VZ $ // Copyright: (c) 2003 David Elliott // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/cocoa/menu.h b/Externals/wxWidgets3/include/wx/cocoa/menu.h index a2fe37c21e..0cb304126f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/menu.h +++ b/Externals/wxWidgets3/include/wx/cocoa/menu.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/09 -// RCS-ID: $Id: menu.h 58022 2009-01-11 12:00:51Z FM $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/menuitem.h b/Externals/wxWidgets3/include/wx/cocoa/menuitem.h index 9029b6d056..23983171bb 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/menuitem.h +++ b/Externals/wxWidgets3/include/wx/cocoa/menuitem.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/13 -// RCS-ID: $Id: menuitem.h 58227 2009-01-19 13:55:27Z VZ $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/msgdlg.h b/Externals/wxWidgets3/include/wx/cocoa/msgdlg.h index 1f6527983b..4a313c44af 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/cocoa/msgdlg.h @@ -3,7 +3,6 @@ // Purpose: wxMessageDialog class // Author: Gareth Simpson // Created: 2007-10-29 -// RCS-ID: $Id: msgdlg.h 67254 2011-03-20 00:14:35Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/notebook.h b/Externals/wxWidgets3/include/wx/cocoa/notebook.h index fade3ac3a6..0fe99e91a1 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/notebook.h +++ b/Externals/wxWidgets3/include/wx/cocoa/notebook.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/08 -// RCS-ID: $Id: notebook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/objc/NSMenu.h b/Externals/wxWidgets3/include/wx/cocoa/objc/NSMenu.h index 96796116fb..780d306058 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/objc/NSMenu.h +++ b/Externals/wxWidgets3/include/wx/cocoa/objc/NSMenu.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007/04/20 (move from NSMenu.mm) -// RCS-ID: $Id: NSMenu.h 48106 2007-08-15 16:10:19Z DE $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/objc/NSSlider.h b/Externals/wxWidgets3/include/wx/cocoa/objc/NSSlider.h index 4e94a28cfd..3534d8576f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/objc/NSSlider.h +++ b/Externals/wxWidgets3/include/wx/cocoa/objc/NSSlider.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007/08/10 (move from NSSlider.mm) -// RCS-ID: $Id: NSSlider.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2007 Software 2000 Ltd. // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/objc/NSView.h b/Externals/wxWidgets3/include/wx/cocoa/objc/NSView.h index f937cffa83..f4c5f04ebf 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/objc/NSView.h +++ b/Externals/wxWidgets3/include/wx/cocoa/objc/NSView.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007/04/20 (move from NSView.mm) -// RCS-ID: $Id: NSView.h 46229 2007-05-28 04:22:10Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/objc/NSWindow.h b/Externals/wxWidgets3/include/wx/cocoa/objc/NSWindow.h index df1e67306c..bed9e59838 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/objc/NSWindow.h +++ b/Externals/wxWidgets3/include/wx/cocoa/objc/NSWindow.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007/04/20 (move from NSWindow.mm) -// RCS-ID: $Id: NSWindow.h 47988 2007-08-09 18:15:50Z DE $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/objc/objc_uniquifying.h b/Externals/wxWidgets3/include/wx/cocoa/objc/objc_uniquifying.h index 5c8eead739..bedbf44677 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/objc/objc_uniquifying.h +++ b/Externals/wxWidgets3/include/wx/cocoa/objc/objc_uniquifying.h @@ -7,7 +7,6 @@ // Author: David Elliott // Modified by: // Created: 2007/05/15 -// RCS-ID: $Id: objc_uniquifying.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2007 Software 2000 Ltd. // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/pen.h b/Externals/wxWidgets3/include/wx/cocoa/pen.h index 1412cf8d25..66a0c7f367 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/pen.h +++ b/Externals/wxWidgets3/include/wx/cocoa/pen.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/08/02 (stubs from 22.03.2003) -// RCS-ID: $Id: pen.h 54273 2008-06-17 17:28:26Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/private/fontfactory.h b/Externals/wxWidgets3/include/wx/cocoa/private/fontfactory.h index 2872e7fe52..7cbfcfe0d1 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/private/fontfactory.h +++ b/Externals/wxWidgets3/include/wx/cocoa/private/fontfactory.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007-10-13 -// RCS-ID: $Id: fontfactory.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: 2007 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/private/scrollview.h b/Externals/wxWidgets3/include/wx/cocoa/private/scrollview.h index dcfc64d484..fe07ff9fa1 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/private/scrollview.h +++ b/Externals/wxWidgets3/include/wx/cocoa/private/scrollview.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2008/02/14 -// RCS-ID: $Id: scrollview.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2003- David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/private/timer.h b/Externals/wxWidgets3/include/wx/cocoa/private/timer.h index f6e707bba3..1dec2cf7fb 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/private/timer.h +++ b/Externals/wxWidgets3/include/wx/cocoa/private/timer.h @@ -2,7 +2,6 @@ // Name: wx/cocoa/private/timer.h // Purpose: Cocoa wxTimer class // Author: Ryan Norton -// Id: $Id: timer.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/radiobox.h b/Externals/wxWidgets3/include/wx/cocoa/radiobox.h index cc5fbe545f..a56a0c654b 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/radiobox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/radiobox.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/18 -// RCS-ID: $Id: radiobox.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/radiobut.h b/Externals/wxWidgets3/include/wx/cocoa/radiobut.h index 175e3b8965..4a78b617c2 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/radiobut.h +++ b/Externals/wxWidgets3/include/wx/cocoa/radiobut.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/18 -// RCS-ID: $Id: radiobut.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/region.h b/Externals/wxWidgets3/include/wx/cocoa/region.h index 610b2e68f7..c9aed9592d 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/region.h +++ b/Externals/wxWidgets3/include/wx/cocoa/region.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/12 -// RCS-ID: $Id: region.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/scrolbar.h b/Externals/wxWidgets3/include/wx/cocoa/scrolbar.h index ae86af1322..a051896ef7 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/scrolbar.h +++ b/Externals/wxWidgets3/include/wx/cocoa/scrolbar.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/25 -// RCS-ID: $Id: scrolbar.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/slider.h b/Externals/wxWidgets3/include/wx/cocoa/slider.h index 6aa00cb34e..5e73aa1796 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/slider.h +++ b/Externals/wxWidgets3/include/wx/cocoa/slider.h @@ -5,7 +5,6 @@ // Mark Oxenham // Modified by: // Created: 2003/06/19 -// RCS-ID: $Id: slider.h 66844 2011-02-05 16:36:30Z VZ $ // Copyright: (c) 2003 David Elliott // (c) 2007 Software 2000 Ltd. // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/cocoa/sound.h b/Externals/wxWidgets3/include/wx/cocoa/sound.h index 09bc45523d..362e2e288d 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/sound.h +++ b/Externals/wxWidgets3/include/wx/cocoa/sound.h @@ -5,7 +5,6 @@ // Authors: David Elliott, Ryan Norton // Modified by: // Created: 2004-10-02 -// RCS-ID: $Id: sound.h 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) 2004 David Elliott, Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/spinbutt.h b/Externals/wxWidgets3/include/wx/cocoa/spinbutt.h index 0e5ad4b80d..d4dc80dfc0 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/cocoa/spinbutt.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/07/14 -// RCS-ID: $Id: spinbutt.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/statbmp.h b/Externals/wxWidgets3/include/wx/cocoa/statbmp.h index 255940e55e..f06b129d9f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/statbmp.h +++ b/Externals/wxWidgets3/include/wx/cocoa/statbmp.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: statbmp.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/statbox.h b/Externals/wxWidgets3/include/wx/cocoa/statbox.h index 7b73c1b540..f19579850c 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/statbox.h +++ b/Externals/wxWidgets3/include/wx/cocoa/statbox.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/18 -// RCS-ID: $Id: statbox.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/statline.h b/Externals/wxWidgets3/include/wx/cocoa/statline.h index 58d3beec1c..3834a37637 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/statline.h +++ b/Externals/wxWidgets3/include/wx/cocoa/statline.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/18 -// RCS-ID: $Id: statline.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/stattext.h b/Externals/wxWidgets3/include/wx/cocoa/stattext.h index dd1e8b4daa..176d53a0be 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/stattext.h +++ b/Externals/wxWidgets3/include/wx/cocoa/stattext.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/02/15 -// RCS-ID: $Id: stattext.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/string.h b/Externals/wxWidgets3/include/wx/cocoa/string.h index e61f5bfc07..65112a053a 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/string.h +++ b/Externals/wxWidgets3/include/wx/cocoa/string.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/04/13 -// RCS-ID: $Id: string.h 54721 2008-07-19 19:59:59Z VZ $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/taskbar.h b/Externals/wxWidgets3/include/wx/cocoa/taskbar.h index 9d23714b46..9c52bfc6c8 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/taskbar.h +++ b/Externals/wxWidgets3/include/wx/cocoa/taskbar.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/01/24 -// RCS-ID: $Id: taskbar.h 50646 2007-12-12 01:35:53Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/textctrl.h b/Externals/wxWidgets3/include/wx/cocoa/textctrl.h index e07bf8653c..d7b8c0aa7c 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/textctrl.h +++ b/Externals/wxWidgets3/include/wx/cocoa/textctrl.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: textctrl.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/toolbar.h b/Externals/wxWidgets3/include/wx/cocoa/toolbar.h index fbf432ee12..ce57dee03f 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/toolbar.h +++ b/Externals/wxWidgets3/include/wx/cocoa/toolbar.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2003/08/17 -// RCS-ID: $Id: toolbar.h 48095 2007-08-15 13:05:35Z VS $ // Copyright: (c) 2003 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/tooltip.h b/Externals/wxWidgets3/include/wx/cocoa/tooltip.h index f269485546..a096a54236 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/tooltip.h +++ b/Externals/wxWidgets3/include/wx/cocoa/tooltip.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 31.01.99 -// RCS-ID: $Id: tooltip.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/toplevel.h b/Externals/wxWidgets3/include/wx/cocoa/toplevel.h index 4d138c3ed3..d0768294d3 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/toplevel.h +++ b/Externals/wxWidgets3/include/wx/cocoa/toplevel.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/08 -// RCS-ID: $Id: toplevel.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/trackingrectmanager.h b/Externals/wxWidgets3/include/wx/cocoa/trackingrectmanager.h index e7bd1a3581..eac59b07b4 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/trackingrectmanager.h +++ b/Externals/wxWidgets3/include/wx/cocoa/trackingrectmanager.h @@ -5,7 +5,6 @@ // Author: David Elliott // Modified by: // Created: 2007/05/02 -// RCS-ID: $Id: trackingrectmanager.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Software 2000 Ltd. // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cocoa/window.h b/Externals/wxWidgets3/include/wx/cocoa/window.h index 9503574827..a060f37892 100644 --- a/Externals/wxWidgets3/include/wx/cocoa/window.h +++ b/Externals/wxWidgets3/include/wx/cocoa/window.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2002/12/26 -// RCS-ID: $Id: window.h 60984 2009-06-10 16:41:41Z VZ $ // Copyright: (c) 2002 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/collpane.h b/Externals/wxWidgets3/include/wx/collpane.h index 5311be7cb9..40c8939b01 100644 --- a/Externals/wxWidgets3/include/wx/collpane.h +++ b/Externals/wxWidgets3/include/wx/collpane.h @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 8/10/2006 -// RCS-ID: $Id: collpane.h 58718 2009-02-07 18:59:25Z VZ $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -53,14 +52,14 @@ public: class WXDLLIMPEXP_FWD_CORE wxCollapsiblePaneEvent; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_COLLPANE_CHANGED, wxCollapsiblePaneEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COLLAPSIBLEPANE_CHANGED, wxCollapsiblePaneEvent ); class WXDLLIMPEXP_CORE wxCollapsiblePaneEvent : public wxCommandEvent { public: wxCollapsiblePaneEvent() {} wxCollapsiblePaneEvent(wxObject *generator, int id, bool collapsed) - : wxCommandEvent(wxEVT_COMMAND_COLLPANE_CHANGED, id), + : wxCommandEvent(wxEVT_COLLAPSIBLEPANE_CHANGED, id), m_bCollapsed(collapsed) { SetEventObject(generator); @@ -89,7 +88,7 @@ typedef void (wxEvtHandler::*wxCollapsiblePaneEventFunction)(wxCollapsiblePaneEv wxEVENT_HANDLER_CAST(wxCollapsiblePaneEventFunction, func) #define EVT_COLLAPSIBLEPANE_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_COLLPANE_CHANGED, id, wxCollapsiblePaneEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_COLLAPSIBLEPANE_CHANGED, id, wxCollapsiblePaneEventHandler(fn)) #if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) @@ -101,6 +100,9 @@ typedef void (wxEvtHandler::*wxCollapsiblePaneEventFunction)(wxCollapsiblePaneEv #define wxCollapsiblePane wxGenericCollapsiblePane #endif +// old wxEVT_COMMAND_* constant +#define wxEVT_COMMAND_COLLPANE_CHANGED wxEVT_COLLAPSIBLEPANE_CHANGED + #endif // wxUSE_COLLPANE #endif // _WX_COLLAPSABLE_PANE_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/colordlg.h b/Externals/wxWidgets3/include/wx/colordlg.h index 4632e99698..b4156d1460 100644 --- a/Externals/wxWidgets3/include/wx/colordlg.h +++ b/Externals/wxWidgets3/include/wx/colordlg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitiln // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: colordlg.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/colour.h b/Externals/wxWidgets3/include/wx/colour.h index 0c9cf08565..eec5542803 100644 --- a/Externals/wxWidgets3/include/wx/colour.h +++ b/Externals/wxWidgets3/include/wx/colour.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Francesco Montorsi // Created: -// RCS-ID: $Id: colour.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -167,6 +166,7 @@ public: static void ChangeLightness(unsigned char* r, unsigned char* g, unsigned char* b, int ialpha); wxColour ChangeLightness(int ialpha) const; + wxColour& MakeDisabled(unsigned char brightness = 255); // old, deprecated // --------------- diff --git a/Externals/wxWidgets3/include/wx/colourdata.h b/Externals/wxWidgets3/include/wx/colourdata.h index d12c5b3aa6..5a755ae078 100644 --- a/Externals/wxWidgets3/include/wx/colourdata.h +++ b/Externals/wxWidgets3/include/wx/colourdata.h @@ -1,7 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wx/colourdata.h // Author: Julian Smart -// RCS-ID: $Id: colourdata.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/combo.h b/Externals/wxWidgets3/include/wx/combo.h index f624f7cd59..4bae2cfea6 100644 --- a/Externals/wxWidgets3/include/wx/combo.h +++ b/Externals/wxWidgets3/include/wx/combo.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id: combo.h 69942 2011-12-07 14:05:11Z VZ $ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -471,6 +470,10 @@ public: virtual wxWindow *GetMainWindowOfCompositeControl() { return m_mainCtrlWnd; } + // also set the embedded wxTextCtrl colours + virtual bool SetForegroundColour(const wxColour& colour); + virtual bool SetBackgroundColour(const wxColour& colour); + protected: // Returns true if hint text should be drawn in the control @@ -541,11 +544,10 @@ protected: void DestroyPopup(); // override the base class virtuals involved in geometry calculations + // The common version only sets a default width, so the derived classes + // should override it and set the height and change the width as needed. virtual wxSize DoGetBestSize() const; - - // also set the embedded wxTextCtrl colours - virtual bool SetForegroundColour(const wxColour& colour); - virtual bool SetBackgroundColour(const wxColour& colour); + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; // NULL popup can be used to indicate default in a derived class virtual void DoSetPopupControl(wxComboPopup* popup); diff --git a/Externals/wxWidgets3/include/wx/combobox.h b/Externals/wxWidgets3/include/wx/combobox.h index a28dae2454..93b3699553 100644 --- a/Externals/wxWidgets3/include/wx/combobox.h +++ b/Externals/wxWidgets3/include/wx/combobox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 24.12.00 -// RCS-ID: $Id: combobox.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1996-2000 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -16,6 +15,10 @@ #if wxUSE_COMBOBOX +// For compatibility with 2.8 include this header to allow using wxTE_XXX +// styles with wxComboBox without explicitly including it in the user code. +#include "wx/textctrl.h" + extern WXDLLIMPEXP_DATA_CORE(const char) wxComboBoxNameStr[]; // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/include/wx/commandlinkbutton.h b/Externals/wxWidgets3/include/wx/commandlinkbutton.h index 3a2a8a967e..0aaa0ec65a 100644 --- a/Externals/wxWidgets3/include/wx/commandlinkbutton.h +++ b/Externals/wxWidgets3/include/wx/commandlinkbutton.h @@ -3,7 +3,6 @@ // Purpose: wxCommandLinkButtonBase and wxGenericCommandLinkButton classes // Author: Rickard Westerlund // Created: 2010-06-11 -// RCS-ID: $Id: commandlinkbutton.h 65350 2010-08-18 22:48:48Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/compiler.h b/Externals/wxWidgets3/include/wx/compiler.h new file mode 100644 index 0000000000..e633ca158e --- /dev/null +++ b/Externals/wxWidgets3/include/wx/compiler.h @@ -0,0 +1,151 @@ +/* + * Name: wx/compiler.h + * Purpose: Compiler-specific macro definitions. + * Author: Vadim Zeitlin + * Created: 2013-07-13 (extracted from wx/platform.h) + * Copyright: (c) 1997-2013 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_COMPILER_H_ +#define _WX_COMPILER_H_ + +/* + Compiler detection and related helpers. + */ + +/* + Notice that Intel compiler can be used as Microsoft Visual C++ add-on and + so we should define both __INTELC__ and __VISUALC__ for it. + */ +#ifdef __INTEL_COMPILER +# define __INTELC__ +#endif + +#if defined(_MSC_VER) + /* + define another standard symbol for Microsoft Visual C++: the standard + one (_MSC_VER) is also defined by some other compilers. + */ +# define __VISUALC__ _MSC_VER + + /* + define special symbols for different VC version instead of writing tests + for magic numbers such as 1200, 1300 &c repeatedly + */ +#if __VISUALC__ < 1100 +# error "This Visual C++ version is too old and not supported any longer." +#elif __VISUALC__ < 1200 +# define __VISUALC5__ +#elif __VISUALC__ < 1300 +# define __VISUALC6__ +#elif __VISUALC__ < 1400 +# define __VISUALC7__ +#elif __VISUALC__ < 1500 +# define __VISUALC8__ +#elif __VISUALC__ < 1600 +# define __VISUALC9__ +#elif __VISUALC__ < 1700 +# define __VISUALC10__ +#elif __VISUALC__ < 1800 +# define __VISUALC11__ +#elif __VISUALC__ < 1900 +# define __VISUALC12__ +#else +# pragma message("Please update wx/compiler.h to recognize this VC++ version") +#endif + +#elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__) +# define __BORLANDC__ +#elif defined(__WATCOMC__) +#elif defined(__SC__) +# define __SYMANTECC__ +#elif defined(__SUNPRO_CC) +# ifndef __SUNCC__ +# define __SUNCC__ __SUNPRO_CC +# endif /* Sun CC */ +#elif defined(__SC__) +# ifdef __DMC__ +# define __DIGITALMARS__ +# else +# define __SYMANTEC__ +# endif +#endif /* compiler */ + +/* + Macros for checking compiler version. +*/ + +/* + This macro can be used to test the gcc version and can be used like this: + +# if wxCHECK_GCC_VERSION(3, 1) + ... we have gcc 3.1 or later ... +# else + ... no gcc at all or gcc < 3.1 ... +# endif +*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) + #define wxCHECK_GCC_VERSION( major, minor ) \ + ( ( __GNUC__ > (major) ) \ + || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) +#else + #define wxCHECK_GCC_VERSION( major, minor ) 0 +#endif + +/* + This macro can be used to test the Visual C++ version. +*/ +#ifndef __VISUALC__ +# define wxVISUALC_VERSION(major) 0 +# define wxCHECK_VISUALC_VERSION(major) 0 +#else +# define wxVISUALC_VERSION(major) ( (6 + major) * 100 ) +# define wxCHECK_VISUALC_VERSION(major) ( __VISUALC__ >= wxVISUALC_VERSION(major) ) +#endif + +/** + This is similar to wxCHECK_GCC_VERSION but for Sun CC compiler. + */ +#ifdef __SUNCC__ + /* + __SUNCC__ is 0xVRP where V is major version, R release and P patch level + */ + #define wxCHECK_SUNCC_VERSION(maj, min) (__SUNCC__ >= (((maj)<<8) | ((min)<<4))) +#else + #define wxCHECK_SUNCC_VERSION(maj, min) (0) +#endif + +#ifndef __WATCOMC__ +# define wxWATCOM_VERSION(major,minor) 0 +# define wxCHECK_WATCOM_VERSION(major,minor) 0 +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) 0 +# define WX_WATCOM_ONLY_CODE( x ) +#else +# if __WATCOMC__ < 1200 +# error "Only Open Watcom is supported in this release" +# endif + +# define wxWATCOM_VERSION(major,minor) ( major * 100 + minor * 10 + 1100 ) +# define wxCHECK_WATCOM_VERSION(major,minor) ( __WATCOMC__ >= wxWATCOM_VERSION(major,minor) ) +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) ( __WATCOMC__ < wxWATCOM_VERSION(major,minor) ) +# define WX_WATCOM_ONLY_CODE( x ) x +#endif + +/* + This macro can be used to check that the version of mingw32 compiler is + at least maj.min + */ + +/* Check for Mingw runtime version: */ +#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION) + #define wxCHECK_MINGW32_VERSION( major, minor ) \ + ( ( ( __MINGW32_MAJOR_VERSION > (major) ) \ + || ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) ) +#else + #define wxCHECK_MINGW32_VERSION( major, minor ) (0) +#endif + +#endif // _WX_COMPILER_H_ diff --git a/Externals/wxWidgets3/include/wx/compositewin.h b/Externals/wxWidgets3/include/wx/compositewin.h index 2c6503aaeb..a46c257708 100644 --- a/Externals/wxWidgets3/include/wx/compositewin.h +++ b/Externals/wxWidgets3/include/wx/compositewin.h @@ -3,7 +3,6 @@ // Purpose: wxCompositeWindow<> declaration // Author: Vadim Zeitlin // Created: 2011-01-02 -// RCS-ID: $Id: compositewin.h 69470 2011-10-19 16:20:01Z VS $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/confbase.h b/Externals/wxWidgets3/include/wx/confbase.h index 5d79dfafd6..9fd9df782a 100644 --- a/Externals/wxWidgets3/include/wx/confbase.h +++ b/Externals/wxWidgets3/include/wx/confbase.h @@ -5,7 +5,6 @@ // Author: Karsten Ballueder & Vadim Zeitlin // Modified by: // Created: 07.04.98 (adapted from appconf.h) -// RCS-ID: $Id: confbase.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1997 Karsten Ballueder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows licence @@ -73,7 +72,7 @@ enum // abstract base class wxConfigBase which defines the interface for derived // classes // -// wxConfig organizes the items in a tree-like structure (modeled after the +// wxConfig organizes the items in a tree-like structure (modelled after the // Unix/Dos filesystem). There are groups (directories) and keys (files). // There is always one current group given by the current path. // diff --git a/Externals/wxWidgets3/include/wx/config.h b/Externals/wxWidgets3/include/wx/config.h index 672e0a5cf2..4df4b8dd08 100644 --- a/Externals/wxWidgets3/include/wx/config.h +++ b/Externals/wxWidgets3/include/wx/config.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: config.h 70808 2012-03-04 20:31:42Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/containr.h b/Externals/wxWidgets3/include/wx/containr.h index a509df834c..277909e559 100644 --- a/Externals/wxWidgets3/include/wx/containr.h +++ b/Externals/wxWidgets3/include/wx/containr.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.08.01 -// RCS-ID: $Id: containr.h 70805 2012-03-04 09:42:51Z SC $ // Copyright: (c) 2001, 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -42,9 +41,12 @@ public: { m_winParent = NULL; - // do accept focus initially, we'll stop doing it if/when any children - // are added - m_acceptsFocus = true; + // By default, we accept focus ourselves. + m_acceptsFocusSelf = true; + + // But we don't have any children accepting it yet. + m_acceptsFocusChildren = false; + m_inSetFocus = false; m_winLastFocused = NULL; } @@ -57,31 +59,36 @@ public: m_winParent = winParent; } + // This can be called by the window to indicate that it never wants to have + // the focus for itself. + void DisableSelfFocus() + { m_acceptsFocusSelf = false; UpdateParentCanFocus(); } + + // This can be called to undo the effect of a previous DisableSelfFocus() + // (otherwise calling it is not necessary as the window does accept focus + // by default). + void EnableSelfFocus() + { m_acceptsFocusSelf = true; UpdateParentCanFocus(); } + // should be called from SetFocus(), returns false if we did nothing with // the focus and the default processing should take place bool DoSetFocus(); - // should be called when we decide that we should [stop] accepting focus - void SetCanFocus(bool acceptsFocus); - // returns whether we should accept focus ourselves or not - bool AcceptsFocus() const { return m_acceptsFocus; } + bool AcceptsFocus() const; - // returns whether we or one of our children accepts focus: we always do - // because if we don't have any focusable children it probably means that - // we're not being used as a container at all (think of wxGrid or generic - // wxListCtrl) and so should get focus for ourselves - bool AcceptsFocusRecursively() const { return true; } + // Returns whether we or one of our children accepts focus. + bool AcceptsFocusRecursively() const + { return AcceptsFocus() || + (m_acceptsFocusChildren && HasAnyChildrenAcceptingFocus()); } - // this is used to determine whether we can accept focus when Tab or - // another navigation key is pressed -- we alsways can, for the same reason - // as mentioned above for AcceptsFocusRecursively() - bool AcceptsFocusFromKeyboard() const { return true; } + // We accept focus from keyboard if we accept it at all. + bool AcceptsFocusFromKeyboard() const { return AcceptsFocusRecursively(); } // Call this when the number of children of the window changes. - // If we have any children, this panel (used just as container for - // them) shouldn't get focus for itself. - void UpdateCanFocus() { SetCanFocus(!HasAnyFocusableChildren()); } + // + // Returns true if we have any focusable children, false otherwise. + bool UpdateCanFocusChildren(); protected: // set the focus to the child which had it the last time @@ -90,6 +97,10 @@ protected: // return true if we have any children accepting focus bool HasAnyFocusableChildren() const; + // return true if we have any children that do accept focus right now + bool HasAnyChildrenAcceptingFocus() const; + + // the parent window we manage the children for wxWindow *m_winParent; @@ -97,9 +108,19 @@ protected: wxWindow *m_winLastFocused; private: - // value returned by AcceptsFocus(), should be changed using SetCanFocus() - // only - bool m_acceptsFocus; + // Update the window status to reflect whether it is getting focus or not. + void UpdateParentCanFocus(); + + // Indicates whether the associated window can ever have focus itself. + // + // Usually this is the case, e.g. a wxPanel can be used either as a + // container for its children or just as a normal window which can be + // focused. But sometimes, e.g. for wxStaticBox, we can never have focus + // ourselves and can only get it if we have any focusable children. + bool m_acceptsFocusSelf; + + // Cached value remembering whether we have any children accepting focus. + bool m_acceptsFocusChildren; // a guard against infinite recursion bool m_inSetFocus; @@ -198,7 +219,13 @@ public: { BaseWindowClass::AddChild(child); - m_container.UpdateCanFocus(); + if ( m_container.UpdateCanFocusChildren() ) + { + // Under MSW we must have wxTAB_TRAVERSAL style for TAB navigation + // to work. + if ( !BaseWindowClass::HasFlag(wxTAB_TRAVERSAL) ) + BaseWindowClass::ToggleWindowStyle(wxTAB_TRAVERSAL); + } } WXDLLIMPEXP_INLINE_CORE virtual void RemoveChild(wxWindowBase *child) @@ -209,7 +236,9 @@ public: BaseWindowClass::RemoveChild(child); - m_container.UpdateCanFocus(); + // We could reset wxTAB_TRAVERSAL here but it doesn't seem to do any + // harm to keep it. + m_container.UpdateCanFocusChildren(); } WXDLLIMPEXP_INLINE_CORE virtual void SetFocus() @@ -223,11 +252,6 @@ public: BaseWindowClass::SetFocus(); } - void AcceptFocus(bool acceptFocus) - { - m_container.SetCanFocus(acceptFocus); - } - protected: #ifndef wxHAS_NATIVE_TAB_TRAVERSAL void OnNavigationKey(wxNavigationKeyEvent& event) @@ -271,10 +295,6 @@ public: \ virtual void RemoveChild(wxWindowBase *child); \ virtual void SetFocus(); \ void SetFocusIgnoringChildren(); \ - void AcceptFocus(bool acceptFocus) \ - { \ - m_container.SetCanFocus(acceptFocus); \ - } \ \ protected: \ wxControlContainer m_container @@ -290,7 +310,7 @@ protected: \ { \ basename::AddChild(child); \ \ - m_container.UpdateCanFocus(); \ + m_container.UpdateCanFocusChildren(); \ } \ \ bool classname::AcceptsFocusRecursively() const \ @@ -328,7 +348,7 @@ protected: \ { \ basename::RemoveChild(child); \ \ - m_container.UpdateCanFocus(); \ + m_container.UpdateCanFocusChildren(); \ } \ \ void classname::SetFocusIgnoringChildren() \ @@ -363,7 +383,7 @@ public: \ \ basename::RemoveChild(child); \ \ - m_container.UpdateCanFocus(); \ + m_container.UpdateCanFocusChildren(); \ } \ \ void classname::OnNavigationKey( wxNavigationKeyEvent& event ) \ diff --git a/Externals/wxWidgets3/include/wx/control.h b/Externals/wxWidgets3/include/wx/control.h index 778ec1870e..cd7bc9e268 100644 --- a/Externals/wxWidgets3/include/wx/control.h +++ b/Externals/wxWidgets3/include/wx/control.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 26.07.99 -// RCS-ID: $Id: control.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -134,6 +133,10 @@ public: // wxControl-specific processing after processing the update event virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + wxSize GetSizeFromTextSize(int xlen, int ylen = -1) const + { return DoGetSizeFromTextSize(xlen, ylen); } + wxSize GetSizeFromTextSize(const wxSize& tsize) const + { return DoGetSizeFromTextSize(tsize.x, tsize.y); } // static utilities for mnemonics char (&) handling @@ -192,6 +195,8 @@ protected: virtual bool DoSetLabelMarkup(const wxString& markup); #endif // wxUSE_MARKUP + // override this to return the total control's size from a string size + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; // initialize the common fields of wxCommandEvent void InitCommandEvent(wxCommandEvent& event) const; diff --git a/Externals/wxWidgets3/include/wx/convauto.h b/Externals/wxWidgets3/include/wx/convauto.h index 0d9303959d..0912368f64 100644 --- a/Externals/wxWidgets3/include/wx/convauto.h +++ b/Externals/wxWidgets3/include/wx/convauto.h @@ -3,7 +3,6 @@ // Purpose: wxConvAuto class declaration // Author: Vadim Zeitlin // Created: 2006-04-03 -// RCS-ID: $Id: convauto.h 69675 2011-11-05 11:23:41Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cpp.h b/Externals/wxWidgets3/include/wx/cpp.h index 5837fe190c..b5ce014e4d 100644 --- a/Externals/wxWidgets3/include/wx/cpp.h +++ b/Externals/wxWidgets3/include/wx/cpp.h @@ -3,7 +3,6 @@ * Purpose: Various preprocessor helpers * Author: Vadim Zeitlin * Created: 2006-09-30 - * RCS-ID: $Id: cpp.h 66054 2010-11-07 13:16:20Z VZ $ * Copyright: (c) 2006 Vadim Zeitlin * Licence: wxWindows licence */ @@ -13,13 +12,27 @@ #ifndef _WX_CPP_H_ #define _WX_CPP_H_ +#include "wx/compiler.h" /* wxCHECK_XXX_VERSION() macros */ + /* wxCONCAT works like preprocessor ## operator but also works with macros */ #define wxCONCAT_HELPER(text, line) text ## line -#define wxCONCAT(text, line) wxCONCAT_HELPER(text, line) -#define wxCONCAT3(x1, x2, x3) wxCONCAT(wxCONCAT(x1, x2), x3) -#define wxCONCAT4(x1, x2, x3, x4) wxCONCAT(wxCONCAT3(x1, x2, x3), x4) -#define wxCONCAT5(x1, x2, x3, x4, x5) wxCONCAT(wxCONCAT4(x1, x2, x3, x4), x5) +#define wxCONCAT(x1, x2) \ + wxCONCAT_HELPER(x1, x2) +#define wxCONCAT3(x1, x2, x3) \ + wxCONCAT(wxCONCAT(x1, x2), x3) +#define wxCONCAT4(x1, x2, x3, x4) \ + wxCONCAT(wxCONCAT3(x1, x2, x3), x4) +#define wxCONCAT5(x1, x2, x3, x4, x5) \ + wxCONCAT(wxCONCAT4(x1, x2, x3, x4), x5) +#define wxCONCAT6(x1, x2, x3, x4, x5, x6) \ + wxCONCAT(wxCONCAT5(x1, x2, x3, x4, x5), x6) +#define wxCONCAT7(x1, x2, x3, x4, x5, x6, x7) \ + wxCONCAT(wxCONCAT6(x1, x2, x3, x4, x5, x6), x7) +#define wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8) \ + wxCONCAT(wxCONCAT7(x1, x2, x3, x4, x5, x6, x7), x8) +#define wxCONCAT9(x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + wxCONCAT(wxCONCAT8(x1, x2, x3, x4, x5, x6, x7, x8), x9) /* wxSTRINGIZE works as the preprocessor # operator but also works with macros */ #define wxSTRINGIZE_HELPER(x) #x @@ -67,6 +80,28 @@ */ #define wxEMPTY_PARAMETER_VALUE /* Fake macro parameter value */ +/* + Helpers for defining macros that expand into a single statement. + + The standatd solution is to use "do { ... } while (0)" statement but MSVC + generates a C4127 "condition expression is constant" warning for it so we + use something which is just complicated enough to not be recognized as a + constant but still simple enough to be optimized away. + + Another solution would be to use __pragma() to temporarily disable C4127. + + Notice that wxASSERT_ARG_TYPE in wx/strvargarg.h relies on these macros + creating some kind of a loop because it uses "break". + */ +#ifdef __WATCOMC__ + #define wxFOR_ONCE(name) for(int name=0; name<1; name++) + #define wxSTATEMENT_MACRO_BEGIN wxFOR_ONCE(wxMAKE_UNIQUE_NAME(wxmacro)) { + #define wxSTATEMENT_MACRO_END } +#else + #define wxSTATEMENT_MACRO_BEGIN do { + #define wxSTATEMENT_MACRO_END } while ( (void)0, 0 ) +#endif + /* Define __WXFUNCTION__ which is like standard __FUNCTION__ but defined as NULL for the compilers which don't support the latter. @@ -89,5 +124,64 @@ #endif #endif /* __WXFUNCTION__ already defined */ + +/* Auto-detect variadic macros support unless explicitly disabled. */ +#if !defined(HAVE_VARIADIC_MACROS) && !defined(wxNO_VARIADIC_MACROS) + /* Any C99 or C++11 compiler should have them. */ + #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + (defined(__cplusplus) && __cplusplus >= 201103L) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_GCC_VERSION(3,0) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_VISUALC_VERSION(8) + #define HAVE_VARIADIC_MACROS + #elif wxCHECK_WATCOM_VERSION(1,2) + #define HAVE_VARIADIC_MACROS + #endif +#endif /* !HAVE_VARIADIC_MACROS */ + + + +#ifdef HAVE_VARIADIC_MACROS +/* + wxCALL_FOR_EACH(what, ...) calls the macro from its first argument, what(pos, x), + for every remaining argument 'x', with 'pos' being its 1-based index in + *reverse* order (with the last argument being numbered 1). + + For example, wxCALL_FOR_EACH(test, a, b, c) expands into this: + + test(3, a) \ + test(2, b) \ + test(1, c) + + Up to eight arguments are supported. + + (With thanks to https://groups.google.com/d/topic/comp.std.c/d-6Mj5Lko_s/discussion + and http://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros) +*/ +#define wxCALL_FOR_EACH_NARG(...) wxCALL_FOR_EACH_NARG_((__VA_ARGS__, wxCALL_FOR_EACH_RSEQ_N())) +#define wxCALL_FOR_EACH_NARG_(args) wxCALL_FOR_EACH_ARG_N args +#define wxCALL_FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N +#define wxCALL_FOR_EACH_RSEQ_N() 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define wxCALL_FOR_EACH_1(what, x) what(1, x) +#define wxCALL_FOR_EACH_2(what, x, ...) what(2, x) wxCALL_FOR_EACH_1(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_3(what, x, ...) what(3, x) wxCALL_FOR_EACH_2(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_4(what, x, ...) what(4, x) wxCALL_FOR_EACH_3(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_5(what, x, ...) what(5, x) wxCALL_FOR_EACH_4(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_6(what, x, ...) what(6, x) wxCALL_FOR_EACH_5(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_7(what, x, ...) what(7, x) wxCALL_FOR_EACH_6(what, __VA_ARGS__) +#define wxCALL_FOR_EACH_8(what, x, ...) what(8, x) wxCALL_FOR_EACH_7(what, __VA_ARGS__) + +#define wxCALL_FOR_EACH_(N, args) \ + wxCONCAT(wxCALL_FOR_EACH_, N) args + +#define wxCALL_FOR_EACH(what, ...) \ + wxCALL_FOR_EACH_(wxCALL_FOR_EACH_NARG(__VA_ARGS__), (what, __VA_ARGS__)) + +#else + #define wxCALL_FOR_EACH Error_wx_CALL_FOR_EACH_requires_variadic_macros_support +#endif /* HAVE_VARIADIC_MACROS */ + #endif /* _WX_CPP_H_ */ diff --git a/Externals/wxWidgets3/include/wx/cppunit.h b/Externals/wxWidgets3/include/wx/cppunit.h index 7c5a114bf5..89edd9165f 100644 --- a/Externals/wxWidgets3/include/wx/cppunit.h +++ b/Externals/wxWidgets3/include/wx/cppunit.h @@ -3,7 +3,6 @@ // Purpose: wrapper header for CppUnit headers // Author: Vadim Zeitlin // Created: 15.02.04 -// RCS-ID: $Id: cppunit.h 69241 2011-09-30 14:00:52Z JJ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/crt.h b/Externals/wxWidgets3/include/wx/crt.h index 3ba993907a..9b939fd0f9 100644 --- a/Externals/wxWidgets3/include/wx/crt.h +++ b/Externals/wxWidgets3/include/wx/crt.h @@ -3,7 +3,6 @@ // Purpose: Header to include all headers with wrappers for CRT functions // Author: Robert Roebling // Created: 2007-05-30 -// RCS-ID: $Id: crt.h 49444 2007-10-26 06:19:08Z PC $ // Copyright: (c) 2007 wxWidgets dev team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/cshelp.h b/Externals/wxWidgets3/include/wx/cshelp.h index 0cc915177c..723ac14e0a 100644 --- a/Externals/wxWidgets3/include/wx/cshelp.h +++ b/Externals/wxWidgets3/include/wx/cshelp.h @@ -4,7 +4,6 @@ // Author: Julian Smart, Vadim Zeitlin // Modified by: // Created: 08/09/2000 -// RCS-ID: $Id: cshelp.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2000 Julian Smart, Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ctrlsub.h b/Externals/wxWidgets3/include/wx/ctrlsub.h index 198aae24c6..88832e5b75 100644 --- a/Externals/wxWidgets3/include/wx/ctrlsub.h +++ b/Externals/wxWidgets3/include/wx/ctrlsub.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.10.99 -// RCS-ID: $Id: ctrlsub.h 68460 2011-07-30 11:30:08Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -441,6 +440,12 @@ public: // colour virtual bool ShouldInheritColours() const { return false; } + + // Implementation only from now on. + + // Generate an event of the given type for the selection change. + void SendSelectionChangedEvent(wxEventType eventType); + protected: // fill in the client object or data field of the event as appropriate // diff --git a/Externals/wxWidgets3/include/wx/cursor.h b/Externals/wxWidgets3/include/wx/cursor.h index a0ce868609..bdde8cdf66 100644 --- a/Externals/wxWidgets3/include/wx/cursor.h +++ b/Externals/wxWidgets3/include/wx/cursor.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: cursor.h 70353 2012-01-15 14:46:41Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -41,7 +40,11 @@ public: #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XBM #include "wx/motif/cursor.h" #elif defined(__WXGTK20__) - #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #else + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/gtk/cursor.h" #elif defined(__WXGTK__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM diff --git a/Externals/wxWidgets3/include/wx/custombgwin.h b/Externals/wxWidgets3/include/wx/custombgwin.h index 62ef32261f..73890a4654 100644 --- a/Externals/wxWidgets3/include/wx/custombgwin.h +++ b/Externals/wxWidgets3/include/wx/custombgwin.h @@ -3,7 +3,6 @@ // Purpose: Class adding support for custom window backgrounds. // Author: Vadim Zeitlin // Created: 2011-10-10 -// RCS-ID: $Id: custombgwin.h 69930 2011-12-04 23:57:36Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dataobj.h b/Externals/wxWidgets3/include/wx/dataobj.h index f611b34e86..d099f4b6b1 100644 --- a/Externals/wxWidgets3/include/wx/dataobj.h +++ b/Externals/wxWidgets3/include/wx/dataobj.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Robert Roebling // Modified by: // Created: 26.05.99 -// RCS-ID: $Id: dataobj.h 63381 2010-02-04 01:02:43Z VZ $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -334,6 +333,45 @@ private: #endif #endif // wxUSE_UNICODE +class WXDLLIMPEXP_CORE wxHTMLDataObject : public wxDataObjectSimple +{ +public: + // ctor: you can specify the text here or in SetText(), or override + // GetText() + wxHTMLDataObject(const wxString& html = wxEmptyString) + : wxDataObjectSimple(wxDF_HTML), + m_html(html) + { + } + + // virtual functions which you may override if you want to provide text on + // demand only - otherwise, the trivial default versions will be used + virtual size_t GetLength() const { return m_html.Len() + 1; } + virtual wxString GetHTML() const { return m_html; } + virtual void SetHTML(const wxString& html) { m_html = html; } + + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } + +private: + wxString m_html; +}; + class WXDLLIMPEXP_CORE wxTextDataObject : public wxDataObjectSimple { public: diff --git a/Externals/wxWidgets3/include/wx/dataview.h b/Externals/wxWidgets3/include/wx/dataview.h index 3e81791cd0..298ab7f979 100644 --- a/Externals/wxWidgets3/include/wx/dataview.h +++ b/Externals/wxWidgets3/include/wx/dataview.h @@ -4,7 +4,6 @@ // Author: Robert Roebling // Modified by: Bo Yang // Created: 08.01.06 -// RCS-ID: $Id: dataview.h 70377 2012-01-17 14:05:17Z VS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,6 +18,7 @@ #include "wx/textctrl.h" #include "wx/headercol.h" #include "wx/variant.h" +#include "wx/dnd.h" // For wxDragResult declaration only. #include "wx/dynarray.h" #include "wx/icon.h" #include "wx/itemid.h" @@ -228,7 +228,7 @@ public: return true; } - // define hierachy + // define hierarchy virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const = 0; virtual bool IsContainer( const wxDataViewItem &item ) const = 0; // Is the container just a header or an item with all columns @@ -376,12 +376,6 @@ public: virtual unsigned GetRow( const wxDataViewItem &item ) const; wxDataViewItem GetItem( unsigned int row ) const; - // compare based on index - - virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, - unsigned int column, bool ascending ) const; - virtual bool HasDefaultCompare() const; - // implement base methods virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const; @@ -437,7 +431,6 @@ public: private: unsigned int m_size; - bool m_ordered; }; #endif @@ -767,7 +760,9 @@ public: #if wxUSE_DRAG_AND_DROP , m_dataObject(NULL), m_dataBuffer(NULL), - m_dataSize(0) + m_dataSize(0), + m_dragFlags(0), + m_dropEffect(wxDragNone) #endif { } @@ -786,7 +781,9 @@ public: , m_dataObject(event.m_dataObject), m_dataFormat(event.m_dataFormat), m_dataBuffer(event.m_dataBuffer), - m_dataSize(event.m_dataSize) + m_dataSize(event.m_dataSize), + m_dragFlags(event.m_dragFlags), + m_dropEffect(event.m_dropEffect) #endif { } @@ -802,7 +799,7 @@ public: const wxVariant &GetValue() const { return m_value; } void SetValue( const wxVariant &value ) { m_value = value; } - // for wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE only + // for wxEVT_DATAVIEW_ITEM_EDITING_DONE only bool IsEditCancelled() const { return m_editCancelled; } void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } @@ -814,7 +811,7 @@ public: wxPoint GetPosition() const { return m_pos; } void SetPosition( int x, int y ) { m_pos.x = x; m_pos.y = y; } - // For wxEVT_COMMAND_DATAVIEW_CACHE_HINT + // For wxEVT_DATAVIEW_CACHE_HINT int GetCacheFrom() const { return m_cacheFrom; } int GetCacheTo() const { return m_cacheTo; } void SetCache(int from, int to) { m_cacheFrom = from; m_cacheTo = to; } @@ -832,6 +829,10 @@ public: size_t GetDataSize() const { return m_dataSize; } void SetDataBuffer( void* buf ) { m_dataBuffer = buf;} void *GetDataBuffer() const { return m_dataBuffer; } + void SetDragFlags( int flags ) { m_dragFlags = flags; } + int GetDragFlags() const { return m_dragFlags; } + void SetDropEffect( wxDragResult effect ) { m_dropEffect = effect; } + wxDragResult GetDropEffect() const { return m_dropEffect; } #endif // wxUSE_DRAG_AND_DROP virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); } @@ -853,36 +854,39 @@ protected: wxDataFormat m_dataFormat; void* m_dataBuffer; size_t m_dataSize; + + int m_dragFlags; + wxDragResult m_dropEffect; #endif // wxUSE_DRAG_AND_DROP private: DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent) }; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_CACHE_HINT, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_CACHE_HINT, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_DROP, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP, wxDataViewEvent ); typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); @@ -890,7 +894,7 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); wxEVENT_HANDLER_CAST(wxDataViewEventFunction, func) #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) #define EVT_DATAVIEW_SELECTION_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(SELECTION_CHANGED, id, fn) @@ -907,7 +911,7 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); #define EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_CONTEXT_MENU, id, fn) #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn) -#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) +#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) #define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn) #define EVT_DATAVIEW_COLUMN_REORDERED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_REORDERED, id, fn) #define EVT_DATAVIEW_CACHE_HINT(id, fn) wx__DECLARE_DATAVIEWEVT(CACHE_HINT, id, fn) @@ -916,6 +920,9 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); #define EVT_DATAVIEW_ITEM_DROP_POSSIBLE(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP_POSSIBLE, id, fn) #define EVT_DATAVIEW_ITEM_DROP(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP, id, fn) +// Old and not documented synonym, don't use. +#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn) + #ifdef wxHAS_GENERIC_DATAVIEWCTRL #include "wx/generic/dataview.h" #elif defined(__WXGTK20__) @@ -933,24 +940,20 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); class WXDLLIMPEXP_ADV wxDataViewListStoreLine { public: - wxDataViewListStoreLine( wxClientData *data = NULL ) + wxDataViewListStoreLine( wxUIntPtr data = 0 ) { m_data = data; } - virtual ~wxDataViewListStoreLine() - { - delete m_data; - } - void SetData( wxClientData *data ) - { if (m_data) delete m_data; m_data = data; } - wxClientData *GetData() const + void SetData( wxUIntPtr data ) + { m_data = data; } + wxUIntPtr GetData() const { return m_data; } wxVector m_values; private: - wxClientData *m_data; + wxUIntPtr m_data; }; @@ -964,12 +967,17 @@ public: void InsertColumn( unsigned int pos, const wxString &varianttype ); void AppendColumn( const wxString &varianttype ); - void AppendItem( const wxVector &values, wxClientData *data = NULL ); - void PrependItem( const wxVector &values, wxClientData *data = NULL ); - void InsertItem( unsigned int row, const wxVector &values, wxClientData *data = NULL ); + void AppendItem( const wxVector &values, wxUIntPtr data = 0 ); + void PrependItem( const wxVector &values, wxUIntPtr data = 0 ); + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = 0 ); void DeleteItem( unsigned int pos ); void DeleteAllItems(); + unsigned int GetItemCount() const; + + void SetItemData( const wxDataViewItem& item, wxUIntPtr data ); + wxUIntPtr GetItemData( const wxDataViewItem& item ) const; + // override base virtuals virtual unsigned int GetColumnCount() const; @@ -1046,11 +1054,11 @@ public: wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE ); - void AppendItem( const wxVector &values, wxClientData *data = NULL ) + void AppendItem( const wxVector &values, wxUIntPtr data = 0 ) { GetStore()->AppendItem( values, data ); } - void PrependItem( const wxVector &values, wxClientData *data = NULL ) + void PrependItem( const wxVector &values, wxUIntPtr data = 0 ) { GetStore()->PrependItem( values, data ); } - void InsertItem( unsigned int row, const wxVector &values, wxClientData *data = NULL ) + void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = 0 ) { GetStore()->InsertItem( row, values, data ); } void DeleteItem( unsigned row ) { GetStore()->DeleteItem( row ); } @@ -1075,6 +1083,14 @@ public: bool GetToggleValue( unsigned int row, unsigned int col ) const { wxVariant value; GetStore()->GetValueByRow( value, row, col ); return value.GetBool(); } + void SetItemData( const wxDataViewItem& item, wxUIntPtr data ) + { GetStore()->SetItemData( item, data ); } + wxUIntPtr GetItemData( const wxDataViewItem& item ) const + { return GetStore()->GetItemData( item ); } + + int GetItemCount() const + { return GetStore()->GetItemCount(); } + void OnSize( wxSizeEvent &event ); private: @@ -1307,6 +1323,27 @@ private: DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewTreeCtrl) }; +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED wxEVT_DATAVIEW_SELECTION_CHANGED +#define wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED wxEVT_DATAVIEW_ITEM_ACTIVATED +#define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED wxEVT_DATAVIEW_ITEM_COLLAPSED +#define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED wxEVT_DATAVIEW_ITEM_EXPANDED +#define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING wxEVT_DATAVIEW_ITEM_COLLAPSING +#define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING wxEVT_DATAVIEW_ITEM_EXPANDING +#define wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING wxEVT_DATAVIEW_ITEM_START_EDITING +#define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED wxEVT_DATAVIEW_ITEM_EDITING_STARTED +#define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE wxEVT_DATAVIEW_ITEM_EDITING_DONE +#define wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED wxEVT_DATAVIEW_ITEM_VALUE_CHANGED +#define wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU wxEVT_DATAVIEW_ITEM_CONTEXT_MENU +#define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_CLICK +#define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK +#define wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED wxEVT_DATAVIEW_COLUMN_SORTED +#define wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED wxEVT_DATAVIEW_COLUMN_REORDERED +#define wxEVT_COMMAND_DATAVIEW_CACHE_HINT wxEVT_DATAVIEW_CACHE_HINT +#define wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG wxEVT_DATAVIEW_ITEM_BEGIN_DRAG +#define wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE +#define wxEVT_COMMAND_DATAVIEW_ITEM_DROP wxEVT_DATAVIEW_ITEM_DROP + #endif // wxUSE_DATAVIEWCTRL #endif diff --git a/Externals/wxWidgets3/include/wx/datectrl.h b/Externals/wxWidgets3/include/wx/datectrl.h index 8b16f0a9f2..6fa4367c0a 100644 --- a/Externals/wxWidgets3/include/wx/datectrl.h +++ b/Externals/wxWidgets3/include/wx/datectrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-09 -// RCS-ID: $Id: datectrl.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dateevt.h b/Externals/wxWidgets3/include/wx/dateevt.h index 7b10dd63b7..4131ab383e 100644 --- a/Externals/wxWidgets3/include/wx/dateevt.h +++ b/Externals/wxWidgets3/include/wx/dateevt.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-10 -// RCS-ID: $Id: dateevt.h 69224 2011-09-29 13:43:15Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/datetime.h b/Externals/wxWidgets3/include/wx/datetime.h index 79cf5f1b7a..f500985f28 100644 --- a/Externals/wxWidgets3/include/wx/datetime.h +++ b/Externals/wxWidgets3/include/wx/datetime.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 10.02.99 -// RCS-ID: $Id: datetime.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -222,124 +221,6 @@ public: // TODO Hebrew, Chinese, Maya, ... (just kidding) (or then may be not?) }; - // these values only are used to identify the different dates of - // adoption of the Gregorian calendar (see IsGregorian()) - // - // All data and comments taken verbatim from "The Calendar FAQ (v 2.0)" - // by Claus Tøndering, http://www.pip.dknet.dk/~c-t/calendar.html - // except for the comments "we take". - // - // Symbol "->" should be read as "was followed by" in the comments - // which follow. - enum GregorianAdoption - { - Gr_Unknown, // no data for this country or it's too uncertain to use - Gr_Standard, // on the day 0 of Gregorian calendar: 15 Oct 1582 - - Gr_Alaska, // Oct 1867 when Alaska became part of the USA - Gr_Albania, // Dec 1912 - - Gr_Austria = Gr_Unknown, // Different regions on different dates - Gr_Austria_Brixen, // 5 Oct 1583 -> 16 Oct 1583 - Gr_Austria_Salzburg = Gr_Austria_Brixen, - Gr_Austria_Tyrol = Gr_Austria_Brixen, - Gr_Austria_Carinthia, // 14 Dec 1583 -> 25 Dec 1583 - Gr_Austria_Styria = Gr_Austria_Carinthia, - - Gr_Belgium, // Then part of the Netherlands - - Gr_Bulgaria = Gr_Unknown, // Unknown precisely (from 1915 to 1920) - Gr_Bulgaria_1, // 18 Mar 1916 -> 1 Apr 1916 - Gr_Bulgaria_2, // 31 Mar 1916 -> 14 Apr 1916 - Gr_Bulgaria_3, // 3 Sep 1920 -> 17 Sep 1920 - - Gr_Canada = Gr_Unknown, // Different regions followed the changes in - // Great Britain or France - - Gr_China = Gr_Unknown, // Different authorities say: - Gr_China_1, // 18 Dec 1911 -> 1 Jan 1912 - Gr_China_2, // 18 Dec 1928 -> 1 Jan 1929 - - Gr_Czechoslovakia, // (Bohemia and Moravia) 6 Jan 1584 -> 17 Jan 1584 - Gr_Denmark, // (including Norway) 18 Feb 1700 -> 1 Mar 1700 - Gr_Egypt, // 1875 - Gr_Estonia, // 1918 - Gr_Finland, // Then part of Sweden - - Gr_France, // 9 Dec 1582 -> 20 Dec 1582 - Gr_France_Alsace, // 4 Feb 1682 -> 16 Feb 1682 - Gr_France_Lorraine, // 16 Feb 1760 -> 28 Feb 1760 - Gr_France_Strasbourg, // February 1682 - - Gr_Germany = Gr_Unknown, // Different states on different dates: - Gr_Germany_Catholic, // 1583-1585 (we take 1584) - Gr_Germany_Prussia, // 22 Aug 1610 -> 2 Sep 1610 - Gr_Germany_Protestant, // 18 Feb 1700 -> 1 Mar 1700 - - Gr_GreatBritain, // 2 Sep 1752 -> 14 Sep 1752 (use 'cal(1)') - - Gr_Greece, // 9 Mar 1924 -> 23 Mar 1924 - Gr_Hungary, // 21 Oct 1587 -> 1 Nov 1587 - Gr_Ireland = Gr_GreatBritain, - Gr_Italy = Gr_Standard, - - Gr_Japan = Gr_Unknown, // Different authorities say: - Gr_Japan_1, // 19 Dec 1872 -> 1 Jan 1873 - Gr_Japan_2, // 19 Dec 1892 -> 1 Jan 1893 - Gr_Japan_3, // 18 Dec 1918 -> 1 Jan 1919 - - Gr_Latvia, // 1915-1918 (we take 1915) - Gr_Lithuania, // 1915 - Gr_Luxemburg, // 14 Dec 1582 -> 25 Dec 1582 - Gr_Netherlands = Gr_Belgium, // (including Belgium) 1 Jan 1583 - - // this is too weird to take into account: the Gregorian calendar was - // introduced twice in Groningen, first time 28 Feb 1583 was followed - // by 11 Mar 1583, then it has gone back to Julian in the summer of - // 1584 and then 13 Dec 1700 -> 12 Jan 1701 - which is - // the date we take here - Gr_Netherlands_Groningen, // 13 Dec 1700 -> 12 Jan 1701 - Gr_Netherlands_Gelderland, // 30 Jun 1700 -> 12 Jul 1700 - Gr_Netherlands_Utrecht, // (and Overijssel) 30 Nov 1700->12 Dec 1700 - Gr_Netherlands_Friesland, // (and Drenthe) 31 Dec 1700 -> 12 Jan 1701 - - Gr_Norway = Gr_Denmark, // Then part of Denmark - Gr_Poland = Gr_Standard, - Gr_Portugal = Gr_Standard, - Gr_Romania, // 31 Mar 1919 -> 14 Apr 1919 - Gr_Russia, // 31 Jan 1918 -> 14 Feb 1918 - Gr_Scotland = Gr_GreatBritain, - Gr_Spain = Gr_Standard, - - // Sweden has a curious history. Sweden decided to make a gradual - // change from the Julian to the Gregorian calendar. By dropping every - // leap year from 1700 through 1740 the eleven superfluous days would - // be omitted and from 1 Mar 1740 they would be in sync with the - // Gregorian calendar. (But in the meantime they would be in sync with - // nobody!) - // - // So 1700 (which should have been a leap year in the Julian calendar) - // was not a leap year in Sweden. However, by mistake 1704 and 1708 - // became leap years. This left Sweden out of synchronisation with - // both the Julian and the Gregorian world, so they decided to go back - // to the Julian calendar. In order to do this, they inserted an extra - // day in 1712, making that year a double leap year! So in 1712, - // February had 30 days in Sweden. - // - // Later, in 1753, Sweden changed to the Gregorian calendar by - // dropping 11 days like everyone else. - Gr_Sweden = Gr_Finland, // 17 Feb 1753 -> 1 Mar 1753 - - Gr_Switzerland = Gr_Unknown,// Different cantons used different dates - Gr_Switzerland_Catholic, // 1583, 1584 or 1597 (we take 1584) - Gr_Switzerland_Protestant, // 31 Dec 1700 -> 12 Jan 1701 - - Gr_Turkey, // 1 Jan 1927 - Gr_USA = Gr_GreatBritain, - Gr_Wales = Gr_GreatBritain, - Gr_Yugoslavia // 1919 - }; - // the country parameter is used so far for calculating the start and // the end of DST period and for deciding whether the date is a work // day or not @@ -408,7 +289,7 @@ public: // helper classes // ------------------------------------------------------------------------ - // a class representing a time zone: basicly, this is just an offset + // a class representing a time zone: basically, this is just an offset // (in seconds) from GMT class WXDLLIMPEXP_BASE TimeZone { @@ -693,7 +574,7 @@ public: // default assignment operator is ok // calendar calculations (functions which set the date only leave the time - // unchanged, e.g. don't explictly zero it): SetXXX() functions modify the + // unchanged, e.g. don't explicitly zero it): SetXXX() functions modify the // object itself, GetXXX() ones return a new object. // ------------------------------------------------------------------------ @@ -909,14 +790,6 @@ public: // because the holidays are different in different countries bool IsWorkDay(Country country = Country_Default) const; - // is this date later than Gregorian calendar introduction for the - // given country (see enum GregorianAdoption)? - // - // NB: this function shouldn't be considered as absolute authority in - // the matter. Besides, for some countries the exact date of - // adoption of the Gregorian calendar is simply unknown. - bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const; - // dos date and time format // ------------------------------------------------------------------------ @@ -1063,6 +936,8 @@ public: inline wxTimeSpan Subtract(const wxDateTime& dt) const; inline wxTimeSpan operator-(const wxDateTime& dt2) const; + wxDateSpan DiffAsDateSpan(const wxDateTime& dt) const; + // conversion to/from text // ------------------------------------------------------------------------ @@ -1205,6 +1080,52 @@ public: : wxAnyStrPtr(); } + // In addition to wxAnyStrPtr versions above we also must provide the + // overloads for C strings as we must return a pointer into the original + // string and not inside a temporary wxString which would have been created + // if the overloads above were used. + // + // And then we also have to provide the overloads for wxCStrData, as usual. + // Unfortunately those ones can't return anything as we don't have any + // sufficiently long-lived wxAnyStrPtr to return from them: any temporary + // strings it would point to would be destroyed when this function returns + // making it impossible to dereference the return value. So we just don't + // return anything from here which at least allows to keep compatibility + // with the code not testing the return value. Other uses of this method + // need to be converted to use one of the new bool-returning overloads + // above. + void ParseRfc822Date(const wxCStrData& date) + { ParseRfc822Date(wxString(date)); } + const char* ParseRfc822Date(const char* date); + const wchar_t* ParseRfc822Date(const wchar_t* date); + + void ParseFormat(const wxCStrData& date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime) + { ParseFormat(wxString(date), format, dateDef); } + const char* ParseFormat(const char* date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime); + const wchar_t* ParseFormat(const wchar_t* date, + const wxString& format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime); + + void ParseDateTime(const wxCStrData& datetime) + { ParseDateTime(wxString(datetime)); } + const char* ParseDateTime(const char* datetime); + const wchar_t* ParseDateTime(const wchar_t* datetime); + + void ParseDate(const wxCStrData& date) + { ParseDate(wxString(date)); } + const char* ParseDate(const char* date); + const wchar_t* ParseDate(const wchar_t* date); + + void ParseTime(const wxCStrData& time) + { ParseTime(wxString(time)); } + const char* ParseTime(const char* time); + const wchar_t* ParseTime(const wchar_t* time); + + // implementation // ------------------------------------------------------------------------ @@ -1531,6 +1452,8 @@ public: int GetYears() const { return m_years; } // get number of months int GetMonths() const { return m_months; } + // returns 12*GetYears() + GetMonths() + int GetTotalMonths() const { return 12*m_years + m_months; } // get number of weeks int GetWeeks() const { return m_weeks; } // get number of days @@ -1731,9 +1654,16 @@ inline wxDateTime wxDateTime::Today() #if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) inline wxDateTime& wxDateTime::Set(time_t timet) { - // assign first to avoid long multiplication overflow! - m_time = timet - WX_TIME_BASE_OFFSET ; - m_time *= TIME_T_FACTOR; + if ( timet == (time_t)-1 ) + { + m_time = wxInvalidDateTime.m_time; + } + else + { + // assign first to avoid long multiplication overflow! + m_time = timet - WX_TIME_BASE_OFFSET; + m_time *= TIME_T_FACTOR; + } return *this; } @@ -2069,9 +1999,9 @@ inline wxLongLong wxTimeSpan::GetSeconds() const inline int wxTimeSpan::GetMinutes() const { - // explicit cast to int suppresses a warning with CodeWarrior and possibly - // others (changing the return type to long from int is impossible in 2.8) - return (int)((GetSeconds() / 60l).GetLo()); + // For compatibility, this method (and the other accessors) return int, + // even though GetLo() actually returns unsigned long with greater range. + return static_cast((GetSeconds() / 60l).GetLo()); } inline int wxTimeSpan::GetHours() const diff --git a/Externals/wxWidgets3/include/wx/datetimectrl.h b/Externals/wxWidgets3/include/wx/datetimectrl.h index 8632d5f12e..30f23dfffe 100644 --- a/Externals/wxWidgets3/include/wx/datetimectrl.h +++ b/Externals/wxWidgets3/include/wx/datetimectrl.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxDateTimePickerCtrl class. // Author: Vadim Zeitlin // Created: 2011-09-22 -// RCS-ID: $Id: datetimectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/datstrm.h b/Externals/wxWidgets3/include/wx/datstrm.h index a3b99180c7..477da30ec6 100644 --- a/Externals/wxWidgets3/include/wx/datstrm.h +++ b/Externals/wxWidgets3/include/wx/datstrm.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Mickael Gilabert // Created: 28/06/1998 -// RCS-ID: $Id: datstrm.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -18,15 +17,64 @@ #if wxUSE_STREAMS -class WXDLLIMPEXP_BASE wxDataInputStream +// Common wxDataInputStream and wxDataOutputStream parameters. +class WXDLLIMPEXP_BASE wxDataStreamBase { public: + void BigEndianOrdered(bool be_order) { m_be_order = be_order; } + + // By default we use extended precision (80 bit) format for both float and + // doubles. Call this function to switch to alternative representation in + // which IEEE 754 single precision (32 bits) is used for floats and double + // precision (64 bits) is used for doubles. + void UseBasicPrecisions() + { +#if wxUSE_APPLE_IEEE + m_useExtendedPrecision = false; +#endif // wxUSE_APPLE_IEEE + } + + // UseExtendedPrecision() is not very useful as it corresponds to the + // default value, only call it in your code if you want the compilation + // fail with the error when using wxWidgets library compiled without + // extended precision support. +#if wxUSE_APPLE_IEEE + void UseExtendedPrecision() + { + m_useExtendedPrecision = true; + } +#endif // wxUSE_APPLE_IEEE + #if wxUSE_UNICODE - wxDataInputStream(wxInputStream& s, const wxMBConv& conv = wxConvUTF8 ); -#else - wxDataInputStream(wxInputStream& s); + void SetConv( const wxMBConv &conv ); + wxMBConv *GetConv() const { return m_conv; } #endif - ~wxDataInputStream(); + +protected: + // Ctor and dtor are both protected, this class is never used directly but + // only by its derived classes. + wxDataStreamBase(const wxMBConv& conv); + ~wxDataStreamBase(); + + + bool m_be_order; + +#if wxUSE_APPLE_IEEE + bool m_useExtendedPrecision; +#endif // wxUSE_APPLE_IEEE + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + wxDECLARE_NO_COPY_CLASS(wxDataStreamBase); +}; + + +class WXDLLIMPEXP_BASE wxDataInputStream : public wxDataStreamBase +{ +public: + wxDataInputStream(wxInputStream& s, const wxMBConv& conv = wxConvUTF8); bool IsOk() { return m_input->IsOk(); } @@ -40,6 +88,7 @@ public: wxUint16 Read16(); wxUint8 Read8(); double ReadDouble(); + float ReadFloat(); wxString ReadString(); #if wxHAS_INT64 @@ -58,6 +107,7 @@ public: void Read16(wxUint16 *buffer, size_t size); void Read8(wxUint8 *buffer, size_t size); void ReadDouble(double *buffer, size_t size); + void ReadFloat(float *buffer, size_t size); wxDataInputStream& operator>>(wxString& s); wxDataInputStream& operator>>(wxInt8& c); @@ -74,35 +124,19 @@ public: wxDataInputStream& operator>>(wxULongLong& i); wxDataInputStream& operator>>(wxLongLong& i); #endif - wxDataInputStream& operator>>(double& i); + wxDataInputStream& operator>>(double& d); wxDataInputStream& operator>>(float& f); - void BigEndianOrdered(bool be_order) { m_be_order = be_order; } - -#if wxUSE_UNICODE - void SetConv( const wxMBConv &conv ); - wxMBConv *GetConv() const { return m_conv; } -#endif - protected: wxInputStream *m_input; - bool m_be_order; -#if wxUSE_UNICODE - wxMBConv *m_conv; -#endif wxDECLARE_NO_COPY_CLASS(wxDataInputStream); }; -class WXDLLIMPEXP_BASE wxDataOutputStream +class WXDLLIMPEXP_BASE wxDataOutputStream : public wxDataStreamBase { public: -#if wxUSE_UNICODE - wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv = wxConvUTF8 ); -#else - wxDataOutputStream(wxOutputStream& s); -#endif - ~wxDataOutputStream(); + wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv = wxConvUTF8); bool IsOk() { return m_output->IsOk(); } @@ -118,6 +152,7 @@ public: void Write16(wxUint16 i); void Write8(wxUint8 i); void WriteDouble(double d); + void WriteFloat(float f); void WriteString(const wxString& string); #if wxHAS_INT64 @@ -136,6 +171,7 @@ public: void Write16(const wxUint16 *buffer, size_t size); void Write8(const wxUint8 *buffer, size_t size); void WriteDouble(const double *buffer, size_t size); + void WriteFloat(const float *buffer, size_t size); wxDataOutputStream& operator<<(const wxString& string); wxDataOutputStream& operator<<(wxInt8 c); @@ -152,22 +188,11 @@ public: wxDataOutputStream& operator<<(const wxULongLong &i); wxDataOutputStream& operator<<(const wxLongLong &i); #endif - wxDataOutputStream& operator<<(double f); + wxDataOutputStream& operator<<(double d); wxDataOutputStream& operator<<(float f); - void BigEndianOrdered(bool be_order) { m_be_order = be_order; } - -#if wxUSE_UNICODE - void SetConv( const wxMBConv &conv ); - wxMBConv *GetConv() const { return m_conv; } -#endif - protected: wxOutputStream *m_output; - bool m_be_order; -#if wxUSE_UNICODE - wxMBConv *m_conv; -#endif wxDECLARE_NO_COPY_CLASS(wxDataOutputStream); }; diff --git a/Externals/wxWidgets3/include/wx/dc.h b/Externals/wxWidgets3/include/wx/dc.h index 2e66988c37..d13720500b 100644 --- a/Externals/wxWidgets3/include/wx/dc.h +++ b/Externals/wxWidgets3/include/wx/dc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05/25/99 -// RCS-ID: $Id: dc.h 68935 2011-08-27 23:26:53Z RD $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -283,6 +282,8 @@ public: return NULL; } + virtual void* GetHandle() const { return NULL; } + // query dimension, colour deps, resolution virtual void DoGetSize(int *width, int *height) const = 0; @@ -431,8 +432,12 @@ public: // clipping + // Note that this pure virtual method has an implementation that updates + // the values returned by DoGetClippingBox() and so can be called from the + // derived class overridden version if it makes sense (i.e. if the clipping + // box coordinates are not already updated in some other way). virtual void DoSetClippingRegion(wxCoord x, wxCoord y, - wxCoord width, wxCoord height) = 0; + wxCoord w, wxCoord h) = 0; // NB: this function works with device coordinates, not the logical ones! virtual void DoSetDeviceClippingRegion(const wxRegion& region) = 0; @@ -515,6 +520,8 @@ public: // this needs to overidden if the axis is inverted virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); + + virtual double GetContentScaleFactor() const { return m_contentScaleFactor; } #ifdef __WXMSW__ // Native Windows functions using the underlying HDC don't honour GDI+ @@ -598,15 +605,15 @@ public: { return wxNullBitmap; } - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset ) = 0; virtual void DrawLines(const wxPointList *list, wxCoord xoffset, wxCoord yoffset ); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) = 0; - virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle); void DrawPolygon(const wxPointList *list, @@ -618,7 +625,7 @@ public: void DrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord x3, wxCoord y3); - void DrawSpline(int n, wxPoint points[]); + void DrawSpline(int n, const wxPoint points[]); void DrawSpline(const wxPointList *points) { DoDrawSpline(points); } virtual void DoDrawSpline(const wxPointList *points); @@ -741,6 +748,8 @@ protected: double m_scaleX, m_scaleY; // calculated from logical scale and user scale int m_signX, m_signY; // Used by SetAxisOrientation() to invert the axes + + double m_contentScaleFactor; // used by high resolution displays (retina) // what is a mm on a screen you don't know the size of? double m_mm_to_pix_x, @@ -787,6 +796,9 @@ public: wxWindow *GetWindow() const { return m_pimpl->GetWindow(); } + void *GetHandle() const + { return m_pimpl->GetHandle(); } + bool IsOk() const { return m_pimpl && m_pimpl->IsOk(); } @@ -821,6 +833,9 @@ public: virtual int GetResolution() const { return m_pimpl->GetResolution(); } + double GetContentScaleFactor() const + { return m_pimpl->GetContentScaleFactor(); } + // Right-To-Left (RTL) modes void SetLayoutDirection(wxLayoutDirection dir) @@ -1130,7 +1145,7 @@ public: void DrawPoint(const wxPoint& pt) { m_pimpl->DoDrawPoint(pt.x, pt.y); } - void DrawLines(int n, wxPoint points[], + void DrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0) { m_pimpl->DoDrawLines(n, points, xoffset, yoffset); } void DrawLines(const wxPointList *list, @@ -1141,7 +1156,7 @@ public: wxCoord xoffset = 0, wxCoord yoffset = 0) ); #endif // WXWIN_COMPATIBILITY_2_8 - void DrawPolygon(int n, wxPoint points[], + void DrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); } @@ -1149,7 +1164,7 @@ public: wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DrawPolygon( list, xoffset, yoffset, fillStyle ); } - void DrawPolyPolygon(int n, int count[], wxPoint points[], + void DrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); } @@ -1272,7 +1287,7 @@ public: wxCoord x2, wxCoord y2, wxCoord x3, wxCoord y3) { m_pimpl->DrawSpline(x1,y1,x2,y2,x3,y3); } - void DrawSpline(int n, wxPoint points[]) + void DrawSpline(int n, const wxPoint points[]) { m_pimpl->DrawSpline(n,points); } void DrawSpline(const wxPointList *points) { m_pimpl->DrawSpline(points); } diff --git a/Externals/wxWidgets3/include/wx/dcbuffer.h b/Externals/wxWidgets3/include/wx/dcbuffer.h index 5e150eca83..f4d27c7fb8 100644 --- a/Externals/wxWidgets3/include/wx/dcbuffer.h +++ b/Externals/wxWidgets3/include/wx/dcbuffer.h @@ -4,7 +4,6 @@ // Author: Ron Lee // Modified by: Vadim Zeitlin (refactored, added bg preservation) // Created: 16/03/02 -// RCS-ID: $Id: dcbuffer.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) Ron Lee // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -134,6 +133,8 @@ private: // the buffering style int m_style; + wxSize m_area; + DECLARE_DYNAMIC_CLASS(wxBufferedDC) wxDECLARE_NO_COPY_CLASS(wxBufferedDC); }; diff --git a/Externals/wxWidgets3/include/wx/dcclient.h b/Externals/wxWidgets3/include/wx/dcclient.h index c036a7d3ad..f4bf74f75f 100644 --- a/Externals/wxWidgets3/include/wx/dcclient.h +++ b/Externals/wxWidgets3/include/wx/dcclient.h @@ -3,7 +3,6 @@ // Purpose: wxClientDC base header // Author: Julian Smart // Copyright: (c) Julian Smart -// RCS-ID: $Id: dcclient.h 50385 2007-11-30 20:56:12Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dcgraph.h b/Externals/wxWidgets3/include/wx/dcgraph.h index b636f239de..06cca91298 100644 --- a/Externals/wxWidgets3/include/wx/dcgraph.h +++ b/Externals/wxWidgets3/include/wx/dcgraph.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Stefan Csomor -// RCS-ID: $Id: dcgraph.h 68935 2011-08-27 23:26:53Z RD $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -68,9 +67,6 @@ public: virtual ~wxGCDCImpl(); - void Init(); - - // implement base class pure virtuals // ---------------------------------- @@ -102,8 +98,6 @@ public: virtual int GetDepth() const; virtual wxSize GetPPI() const; - virtual void SetMapMode(wxMappingMode mode); - virtual void SetLogicalFunction(wxRasterOperationMode function); virtual void SetTextForeground(const wxColour& colour); @@ -114,6 +108,8 @@ public: wxGraphicsContext* GetGraphicsContext() const { return m_graphicContext; } virtual void SetGraphicsContext( wxGraphicsContext* ctx ); + virtual void* GetHandle() const; + // the true implementations virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, wxFloodFillStyle style = wxFLOOD_SURFACE); @@ -180,12 +176,12 @@ public: virtual void DoGetSize(int *,int *) const; virtual void DoGetSizeMM(int* width, int* height) const; - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); - virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle); @@ -206,9 +202,12 @@ public: #endif // __WXMSW__ protected: + // unused int parameter distinguishes this version, which does not create a + // wxGraphicsContext, in the expectation that the derived class will do it + wxGCDCImpl(wxDC* owner, int); + // scaling variables bool m_logicalFunctionSupported; - double m_mm_to_pix_x, m_mm_to_pix_y; wxGraphicsMatrix m_matrixOriginal; wxGraphicsMatrix m_matrixCurrent; @@ -216,6 +215,9 @@ protected: wxGraphicsContext* m_graphicContext; +private: + void Init(wxGraphicsContext*); + DECLARE_CLASS(wxGCDCImpl) wxDECLARE_NO_COPY_CLASS(wxGCDCImpl); }; diff --git a/Externals/wxWidgets3/include/wx/dcmemory.h b/Externals/wxWidgets3/include/wx/dcmemory.h index 80f21e69d6..d5f301c942 100644 --- a/Externals/wxWidgets3/include/wx/dcmemory.h +++ b/Externals/wxWidgets3/include/wx/dcmemory.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dcmemory.h 61724 2009-08-21 10:41:26Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dcmirror.h b/Externals/wxWidgets3/include/wx/dcmirror.h index f6667d7c8f..42deb9771c 100644 --- a/Externals/wxWidgets3/include/wx/dcmirror.h +++ b/Externals/wxWidgets3/include/wx/dcmirror.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 21.07.2003 -// RCS-ID: $Id: dcmirror.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -66,6 +65,9 @@ public: virtual void SetLogicalFunction(wxRasterOperationMode function) { m_dc.SetLogicalFunction(function); } + virtual void* GetHandle() const + { return m_dc.GetHandle(); } + protected: // returns x and y if not mirroring or y and x if mirroring wxCoord GetX(wxCoord x, wxCoord y) const { return m_mirror ? y : x; } @@ -79,27 +81,23 @@ protected: wxCoord *GetX(wxCoord *x, wxCoord *y) const { return m_mirror ? y : x; } wxCoord *GetY(wxCoord *x, wxCoord *y) const { return m_mirror ? x : y; } - // exchange x and y unconditionally - static void Swap(wxCoord& x, wxCoord& y) - { - wxCoord t = x; - x = y; - y = t; - } - // exchange x and y components of all points in the array if necessary - void Mirror(int n, wxPoint points[]) const + wxPoint* Mirror(int n, const wxPoint*& points) const { + wxPoint* points_alloc = NULL; if ( m_mirror ) { + points_alloc = new wxPoint[n]; for ( int i = 0; i < n; i++ ) { - Swap(points[i].x, points[i].y); + points_alloc[i].x = points[i].y; + points_alloc[i].y = points[i].x; } + points = points_alloc; } + return points_alloc; } - // wxDCBase functions virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, wxFloodFillStyle style = wxFLOOD_SURFACE) @@ -223,28 +221,28 @@ protected: m_dc.DoGetSizeMM(GetX(w, h), GetY(w, h)); } - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset) { - Mirror(n, points); + wxPoint* points_alloc = Mirror(n, points); m_dc.DoDrawLines(n, points, GetX(xoffset, yoffset), GetY(xoffset, yoffset)); - Mirror(n, points); + delete[] points_alloc; } - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { - Mirror(n, points); + wxPoint* points_alloc = Mirror(n, points); m_dc.DoDrawPolygon(n, points, GetX(xoffset, yoffset), GetY(xoffset, yoffset), fillStyle); - Mirror(n, points); + delete[] points_alloc; } virtual void DoSetDeviceClippingRegion(const wxRegion& WXUNUSED(region)) diff --git a/Externals/wxWidgets3/include/wx/dcprint.h b/Externals/wxWidgets3/include/wx/dcprint.h index b1b563c775..6d84731116 100644 --- a/Externals/wxWidgets3/include/wx/dcprint.h +++ b/Externals/wxWidgets3/include/wx/dcprint.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dcprint.h 56783 2008-11-15 11:10:34Z FM $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dcps.h b/Externals/wxWidgets3/include/wx/dcps.h index 2615d33243..659eb595f1 100644 --- a/Externals/wxWidgets3/include/wx/dcps.h +++ b/Externals/wxWidgets3/include/wx/dcps.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dcps.h 33948 2005-05-04 18:57:50Z JS $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dcscreen.h b/Externals/wxWidgets3/include/wx/dcscreen.h index 85ceb8dd82..391e91aacf 100644 --- a/Externals/wxWidgets3/include/wx/dcscreen.h +++ b/Externals/wxWidgets3/include/wx/dcscreen.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dcscreen.h 61724 2009-08-21 10:41:26Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dcsvg.h b/Externals/wxWidgets3/include/wx/dcsvg.h index 2321a227eb..c6485ff131 100644 --- a/Externals/wxWidgets3/include/wx/dcsvg.h +++ b/Externals/wxWidgets3/include/wx/dcsvg.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Chris Elliott -// RCS-ID: $Id: dcsvg.h 61724 2009-08-21 10:41:26Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -54,10 +53,7 @@ public: wxFAIL_MSG(wxT("wxSVGFILEDC::Clear() Call not implemented \nNot sensible for an output file?")); } - virtual void DestroyClippingRegion() - { - wxFAIL_MSG(wxT("wxSVGFILEDC::void Call not yet implemented")); - } + virtual void DestroyClippingRegion(); virtual wxCoord GetCharHeight() const; virtual wxCoord GetCharWidth() const; @@ -96,6 +92,8 @@ public: virtual void SetFont(const wxFont& font); virtual void SetPen(const wxPen& pen); + virtual void* GetHandle() const { return NULL; } + private: virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const { @@ -127,12 +125,12 @@ private: virtual void DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); virtual void DoDrawPoint(wxCoord, wxCoord); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle); @@ -173,10 +171,7 @@ private: wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetDeviceClippingRegion not yet implemented")); } - virtual void DoSetClippingRegion( int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) ) - { - wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetClippingRegion not yet implemented")); - } + virtual void DoSetClippingRegion(int x, int y, int width, int height); virtual void DoGetSizeMM( int *width, int *height ) const; @@ -184,20 +179,33 @@ private: void Init (const wxString &filename, int width, int height, double dpi); - void NewGraphics(); - void write( const wxString &s ); private: + // If m_graphics_changed is true, close the current element and start a + // new one for the last pen/brush change. + void NewGraphicsIfNeeded(); + + // Open a new graphics group setting up all the attributes according to + // their current values in wxDC. + void DoStartNewGraphics(); + wxFileOutputStream *m_outfile; wxString m_filename; int m_sub_images; // number of png format images we have bool m_OK; - bool m_graphics_changed; + bool m_graphics_changed; // set by Set{Brush,Pen}() int m_width, m_height; double m_dpi; -private: + // The clipping nesting level is incremented by every call to + // SetClippingRegion() and reset when DestroyClippingRegion() is called. + size_t m_clipNestingLevel; + + // Unique ID for every clipping graphics group: this is simply always + // incremented in each SetClippingRegion() call. + size_t m_clipUniqueId; + DECLARE_ABSTRACT_CLASS(wxSVGFileDCImpl) }; diff --git a/Externals/wxWidgets3/include/wx/dde.h b/Externals/wxWidgets3/include/wx/dde.h index 1c15a1f3ce..d6524e1ff6 100644 --- a/Externals/wxWidgets3/include/wx/dde.h +++ b/Externals/wxWidgets3/include/wx/dde.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dde.h 70808 2012-03-04 20:31:42Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/debug.h b/Externals/wxWidgets3/include/wx/debug.h index 589ae85f67..f80f7be680 100644 --- a/Externals/wxWidgets3/include/wx/debug.h +++ b/Externals/wxWidgets3/include/wx/debug.h @@ -3,7 +3,6 @@ // Purpose: Misc debug functions and macros // Author: Vadim Zeitlin // Created: 29/01/98 -// RCS-ID: $Id: debug.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 1998-2009 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -178,28 +177,28 @@ inline void wxDisableAsserts() { wxSetAssertHandler(NULL); } // // also notice that these functions can't be inline as wxString is not defined // yet (and can't be as wxString code itself may use assertions) -extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, int line, const char *func, const char *cond); -extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, int line, const char *func, const char *cond, const char *msg); -extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, int line, const char *func, const char *cond, - const wxChar *msg); + const wxChar *msg) ; #endif /* wxUSE_UNICODE */ // this version is for compatibility with wx 2.8 Unicode build only, we don't // use it ourselves any more except in ANSI-only build in which case it is all // we need -extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxChar *file, int line, const char *func, const wxChar *cond, @@ -208,24 +207,24 @@ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *file, // these overloads work when msg passed to debug macro is a string and we // also have to provide wxCStrData overload to resolve ambiguity which would // otherwise arise from wxASSERT( s.c_str() ) -extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file, int line, const wxString& func, const wxString& cond, const wxString& msg); -extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file, int line, const wxString& func, const wxString& cond); -extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, int line, const char *func, const char *cond, const wxCStrData& msg); -extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, +extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, int line, const char *func, const char *cond, @@ -251,22 +250,41 @@ extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, this macro only does anything if wxDEBUG_LEVEL >= 2. */ #if wxDEBUG_LEVEL - // call this function to break into the debugger unconditionally (assuming - // the program is running under debugger, of course) - extern void WXDLLIMPEXP_BASE wxTrap(); - - // assert checks if the condition is true and calls the assert handler with - // the provided message if it isn't + // wxTrap() can be used to break into the debugger unconditionally + // (assuming the program is running under debugger, of course). // - // NB: the macro is defined like this to ensure that nested if/else - // statements containing it are compiled in the same way whether it is - // defined as empty or not; also notice that we can't use ";" instead - // of "{}" as some compilers warn about "possible unwanted ;" then + // If possible, we prefer to define it as a macro rather than as a function + // to open the debugger at the position where we trapped and not inside the + // trap function itself which is not very useful. + #if wxCHECK_VISUALC_VERSION(7) + #define wxTrap() __debugbreak() + #else + extern WXDLLIMPEXP_BASE void wxTrap(); + #endif // Win VisualC + + // Global flag used to indicate that assert macros should call wxTrap(): it + // is set by the default assert handler if the user answers yes to the + // question of whether to trap. + extern WXDLLIMPEXP_DATA_BASE(bool) wxTrapInAssert; + + // This macro checks if the condition is true and calls the assert handler + // with the provided message if it isn't and finally traps if the special + // flag indicating that it should do it was set by the handler. + // + // Notice that we don't use the handler return value for compatibility + // reasons (if we changed its return type, we'd need to change wxApp:: + // OnAssertFailure() too which would break user code overriding it), hence + // the need for the ugly global flag. #define wxASSERT_MSG(cond, msg) \ - if ( !wxTheAssertHandler || (cond) ) \ - {} \ - else \ - wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg) + wxSTATEMENT_MACRO_BEGIN \ + if ( wxTheAssertHandler && !(cond) && \ + (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \ + #cond, msg), wxTrapInAssert) ) \ + { \ + wxTrapInAssert = false; \ + wxTrap(); \ + } \ + wxSTATEMENT_MACRO_END // a version without any additional message, don't use unless condition // itself is fully self-explanatory @@ -274,11 +292,17 @@ extern void WXDLLIMPEXP_BASE wxOnAssert(const char *file, // wxFAIL is a special form of assert: it always triggers (and so is // usually used in normally unreachable code) - #define wxFAIL_COND_MSG(cond, msg) \ - if ( !wxTheAssertHandler ) \ - {} \ - else \ - wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, cond, msg) + #define wxFAIL_COND_MSG(cond, msg) \ + wxSTATEMENT_MACRO_BEGIN \ + if ( wxTheAssertHandler && \ + (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \ + cond, msg), wxTrapInAssert) ) \ + { \ + wxTrapInAssert = false; \ + wxTrap(); \ + } \ + wxSTATEMENT_MACRO_END + #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("Assert failure", msg) #define wxFAIL wxFAIL_MSG((const char*)NULL) #else // !wxDEBUG_LEVEL @@ -437,10 +461,9 @@ template struct static_assert_test{}; /* Return true if we're running under debugger. - Currently this only really works under Win32 and Mac in CodeWarrior builds, - it always returns false in other cases. + Currently only really works under Win32 and just returns false elsewhere. */ -#if defined(__WXMAC__) || defined(__WIN32__) +#if defined(__WIN32__) extern bool WXDLLIMPEXP_BASE wxIsDebuggerRunning(); #else // !Mac inline bool wxIsDebuggerRunning() { return false; } diff --git a/Externals/wxWidgets3/include/wx/debugrpt.h b/Externals/wxWidgets3/include/wx/debugrpt.h index 4aae1055a1..421bede975 100644 --- a/Externals/wxWidgets3/include/wx/debugrpt.h +++ b/Externals/wxWidgets3/include/wx/debugrpt.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxDebugReport class // Author: Vadim Zeitlin // Created: 2005-01-17 -// RCS-ID: $Id: debugrpt.h 61663 2009-08-14 00:06:03Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/defs.h b/Externals/wxWidgets3/include/wx/defs.h index 27e685a535..00c6427636 100644 --- a/Externals/wxWidgets3/include/wx/defs.h +++ b/Externals/wxWidgets3/include/wx/defs.h @@ -4,7 +4,6 @@ * Author: Julian Smart and others * Modified by: Ryan Norton (Converted to C) * Created: 01/02/97 - * RCS-ID: $Id: defs.h 70353 2012-01-15 14:46:41Z VZ $ * Copyright: (c) Julian Smart * Licence: wxWindows licence */ @@ -30,7 +29,7 @@ #ifdef __cplusplus /* Make sure the environment is set correctly */ # if defined(__WXMSW__) && defined(__X__) -# error "Target can't be both X and Windows" +# error "Target can't be both X and MSW" # elif !defined(__WXMOTIF__) && \ !defined(__WXMSW__) && \ !defined(__WXGTK__) && \ @@ -175,6 +174,18 @@ # define wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(name) #endif +/* + Clang Support + */ + +#ifndef WX_HAS_CLANG_FEATURE +# ifndef __has_feature +# define WX_HAS_CLANG_FEATURE(x) 0 +# else +# define WX_HAS_CLANG_FEATURE(x) __has_feature(x) +# endif +#endif + /* ---------------------------------------------------------------------------- */ /* wxWidgets version and compatibility defines */ /* ---------------------------------------------------------------------------- */ @@ -205,7 +216,7 @@ /* Prevents conflicts between sys/types.h and winsock.h with Cygwin, */ /* when using Windows sockets. */ -#ifdef __CYGWIN__ +#if defined(__CYGWIN__) && defined(__WXMSW__) #define __USE_W32_SOCKETS #endif @@ -252,9 +263,6 @@ typedef short int WXTYPE; #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520) /* BC++ 4.52 doesn't support explicit, CBuilder 1 does */ #define HAVE_EXPLICIT - #elif defined(__MWERKS__) && (__MWERKS__ >= 0x2400) - /* Metrowerks CW6 or higher has explicit */ - #define HAVE_EXPLICIT #elif defined(__DIGITALMARS__) #define HAVE_EXPLICIT #elif defined(__WATCOMC__) @@ -347,6 +355,32 @@ typedef short int WXTYPE; #endif #endif +#if defined(__has_include) + #if !defined(HAVE_TYPE_TRAITS) && __has_include() + #define HAVE_TYPE_TRAITS + #endif + + #if !defined(HAVE_TR1_TYPE_TRAITS) && __has_include() + #define HAVE_TR1_TYPE_TRAITS + #endif + + #if !defined(HAVE_STD_UNORDERED_MAP) && __has_include() + #define HAVE_STD_UNORDERED_MAP + #endif + + #if !defined(HAVE_TR1_UNORDERED_MAP) && __has_include() + #define HAVE_TR1_UNORDERED_MAP + #endif + + #if !defined(HAVE_STD_UNORDERED_SET) && __has_include() + #define HAVE_STD_UNORDERED_SET + #endif + + #if !defined(HAVE_TR1_UNORDERED_SET) && __has_include() + #define HAVE_TR1_UNORDERED_SET + #endif +#endif // defined(__has_include) + /* provide replacement for C99 va_copy() if the compiler doesn't have it */ /* could be already defined by configure or the user */ @@ -390,13 +424,6 @@ typedef short int WXTYPE; #endif /* va_copy/!va_copy */ #endif /* wxVaCopy */ -#ifndef HAVE_VARIADIC_MACROS - #if wxCHECK_WATCOM_VERSION(1,2) - #define HAVE_VARIADIC_MACROS - #endif -#endif /* HAVE_VARIADIC_MACROS */ - - #ifndef HAVE_WOSTREAM /* Mingw <= 3.4 and all versions of Cygwin don't have std::wostream @@ -461,7 +488,7 @@ typedef short int WXTYPE; #define wxSTDCALL #endif /* platform */ -/* LINKAGEMODE mode is empty for everyting except OS/2 */ +/* LINKAGEMODE mode is empty for everything except OS/2 */ #ifndef LINKAGEMODE #define LINKAGEMODE #endif /* LINKAGEMODE */ @@ -513,16 +540,71 @@ typedef short int WXTYPE; # define WX_ATTRIBUTE_PRINTF_5 WX_ATTRIBUTE_PRINTF(5, 6) #endif /* !defined(WX_ATTRIBUTE_PRINTF) */ - -/* Macro to issue warning when using deprecated functions with gcc3 or MSVC7: */ -#if wxCHECK_GCC_VERSION(3, 1) - #define wxDEPRECATED(x) __attribute__((deprecated)) x -#elif defined(__VISUALC__) && (__VISUALC__ >= 1300) - #define wxDEPRECATED(x) __declspec(deprecated) x -#else - #define wxDEPRECATED(x) x +#ifndef WX_ATTRIBUTE_NORETURN +# if WX_HAS_CLANG_FEATURE(attribute_analyzer_noreturn) +# define WX_ATTRIBUTE_NORETURN __attribute__((analyzer_noreturn)) +# elif defined( __GNUC__ ) +# define WX_ATTRIBUTE_NORETURN __attribute__ ((noreturn)) +# elif wxCHECK_VISUALC_VERSION(7) +# define WX_ATTRIBUTE_NORETURN __declspec(noreturn) +# else +# define WX_ATTRIBUTE_NORETURN +# endif #endif +#if defined(__GNUC__) + #define WX_ATTRIBUTE_UNUSED __attribute__ ((unused)) +#else + #define WX_ATTRIBUTE_UNUSED +#endif + +/* + Macros for marking functions as being deprecated. + + The preferred macro in the new code is wxDEPRECATED_MSG() which allows to + explain why is the function deprecated. Almost all the existing code uses + the older wxDEPRECATED() or its variants currently, but this will hopefully + change in the future. + */ + +/* The basic compiler-specific construct to generate a deprecation warning. */ +#ifdef __clang__ + #define wxDEPRECATED_DECL __attribute__((deprecated)) +#elif wxCHECK_GCC_VERSION(3, 1) + #define wxDEPRECATED_DECL __attribute__((deprecated)) +#elif defined(__VISUALC__) && (__VISUALC__ >= 1300) + #define wxDEPRECATED_DECL __declspec(deprecated) +#else + #define wxDEPRECATED_DECL +#endif + +/* + Macro taking the deprecation message. It applies to the next declaration. + + If the compiler doesn't support showing the message, this degrades to a + simple wxDEPRECATED(), i.e. at least gives a warning, if possible. + */ +#if defined(__clang__) && defined(__has_extension) + #if __has_extension(attribute_deprecated_with_message) + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated(msg))) + #else + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated)) + #endif +#elif wxCHECK_GCC_VERSION(4, 5) + #define wxDEPRECATED_MSG(msg) __attribute__((deprecated(msg))) +#elif wxCHECK_VISUALC_VERSION(8) + #define wxDEPRECATED_MSG(msg) __declspec(deprecated("deprecated: " msg)) +#else + #define wxDEPRECATED_MSG(msg) wxDEPRECATED_DECL +#endif + +/* + Macro taking the declaration that it deprecates. Prefer to use + wxDEPRECATED_MSG() instead as it's simpler (wrapping the entire declaration + makes the code unclear) and allows to specify the explanation. + */ +#define wxDEPRECATED(x) wxDEPRECATED_DECL x + #if defined(__GNUC__) && !wxCHECK_GCC_VERSION(3, 4) /* We need to add dummy "inline" to allow gcc < 3.4 to handle the @@ -559,6 +641,27 @@ typedef short int WXTYPE; # define wxDEPRECATED_BUT_USED_INTERNALLY(x) wxDEPRECATED(x) #endif +/* + Macros to suppress and restore gcc warnings, requires g++ >= 4.6 and don't + do anything otherwise. + + Example of use: + + wxGCC_WARNING_SUPPRESS(float-equal) + inline bool wxIsSameDouble(double x, double y) { return x == y; } + wxGCC_WARNING_RESTORE(float-equal) + */ +#if wxCHECK_GCC_VERSION(4, 6) +# define wxGCC_WARNING_SUPPRESS(x) \ + _Pragma (wxSTRINGIZE(GCC diagnostic push)) \ + _Pragma (wxSTRINGIZE(GCC diagnostic ignored wxSTRINGIZE(wxCONCAT(-W,x)))) +# define wxGCC_WARNING_RESTORE(x) \ + _Pragma (wxSTRINGIZE(GCC diagnostic pop)) +#else /* gcc < 4.6 or not gcc at all */ +# define wxGCC_WARNING_SUPPRESS(x) +# define wxGCC_WARNING_RESTORE(x) +#endif + /* Combination of the two variants above: should be used for deprecated functions which are defined inline and are used by wxWidgets itself. @@ -577,14 +680,6 @@ typedef short int WXTYPE; #include #endif - -#if defined(__GNUC__) - #define WX_ATTRIBUTE_UNUSED __attribute__ ((unused)) -#else - #define WX_ATTRIBUTE_UNUSED -#endif - - #ifdef __cplusplus // everybody gets the assert and other debug macros @@ -657,9 +752,13 @@ typedef short int WXTYPE; m(==,x,y,z) m(!=,x,y,z) m(>=,x,y,z) m(<=,x,y,z) m(>,x,y,z) m(<,x,y,z) /* - This is only used with wxDEFINE_COMPARISON_REV: it passes both the normal - and the reversed comparison operators to the macro. + These are only used with wxDEFINE_COMPARISON_[BY_]REV: they pass both the + normal and the reversed comparison operators to the macro. */ +#define wxFOR_ALL_COMPARISONS_2_REV(m, x, y) \ + m(==,x,y,==) m(!=,x,y,!=) m(>=,x,y,<=) \ + m(<=,x,y,>=) m(>,x,y,<) m(<,x,y,>) + #define wxFOR_ALL_COMPARISONS_3_REV(m, x, y, z) \ m(==,x,y,z,==) m(!=,x,y,z,!=) m(>=,x,y,z,<=) \ m(<=,x,y,z,>=) m(>,x,y,z,<) m(<,x,y,z,>) @@ -671,6 +770,9 @@ typedef short int WXTYPE; #define wxDEFINE_COMPARISON_REV(op, T1, T2, cmp, oprev) \ inline bool operator op(T2 y, T1 x) { return cmp(x, y, oprev); } +#define wxDEFINE_COMPARISON_BY_REV(op, T1, T2, oprev) \ + inline bool operator op(T1 x, T2 y) { return y oprev x; } + /* Define all 6 comparison operators (==, !=, <, <=, >, >=) for the given types in the specified order. The implementation is provided by the cmp @@ -680,6 +782,14 @@ typedef short int WXTYPE; #define wxDEFINE_COMPARISONS(T1, T2, cmp) \ wxFOR_ALL_COMPARISONS_3(wxDEFINE_COMPARISON, T1, T2, cmp) +/* + Define all 6 comparison operators (==, !=, <, <=, >, >=) for the given + types in the specified order, implemented in terms of existing operators + for the reverse order. + */ +#define wxDEFINE_COMPARISONS_BY_REV(T1, T2) \ + wxFOR_ALL_COMPARISONS_2_REV(wxDEFINE_COMPARISON_BY_REV, T1, T2) + /* This macro allows to define all 12 comparison operators (6 operators for both orders of arguments) for the given types using the provided "cmp" @@ -748,13 +858,6 @@ typedef short int WXTYPE; /* compiler specific settings */ /* ---------------------------------------------------------------------------- */ -#if defined(__MWERKS__) - #undef try - #undef except - #undef finally - #define except(x) catch(...) -#endif /* Metrowerks */ - #if wxONLY_WATCOM_EARLIER_THAN(1,4) typedef short mode_t; #endif @@ -762,13 +865,10 @@ typedef short int WXTYPE; /* where should i put this? we need to make sure of this as it breaks */ /* the code. */ #if !wxUSE_IOSTREAMH && defined(__WXDEBUG__) -# ifndef __MWERKS__ -/* #undef __WXDEBUG__ */ # ifdef wxUSE_DEBUG_NEW_ALWAYS # undef wxUSE_DEBUG_NEW_ALWAYS # define wxUSE_DEBUG_NEW_ALWAYS 0 # endif -# endif #endif /* ---------------------------------------------------------------------------- */ @@ -785,9 +885,7 @@ enum { wxDefaultCoord = -1 }; /* ---------------------------------------------------------------------------- */ #if defined(__MINGW32__) - #if !defined(__MWERKS__) #include - #endif #endif /* chars are always one byte (by definition), shorts are always two (in */ @@ -994,7 +1092,7 @@ typedef wxUint32 wxDword; architectures to be able to pass wxLongLong_t to the standard functions prototyped as taking "long long" such as strtoll(). */ -#if (defined(__VISUALC__) && defined(__WIN32__)) +#if (defined(__VISUALC__) || defined(__INTELC__)) && defined(__WIN32__) #define wxLongLong_t __int64 #define wxLongLongSuffix i64 #define wxLongLongFmtSpec "I64" @@ -1014,15 +1112,6 @@ typedef wxUint32 wxDword; #define wxLongLong_t long long #define wxLongLongSuffix ll #define wxLongLongFmtSpec "I64" -#elif defined(__MWERKS__) - #if __option(longlong) - #define wxLongLong_t long long - #define wxLongLongSuffix ll - #define wxLongLongFmtSpec "ll" - #else - #error "The 64 bit integer support in CodeWarrior has been disabled." - #error "See the documentation on the 'longlong' pragma." - #endif #elif defined(__VISAGECPP__) && __IBMCPP__ >= 400 #define wxLongLong_t long long #elif (defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG >= 8) || \ @@ -1084,6 +1173,17 @@ typedef wxUint32 wxDword; #endif +/* + Helper macro for conditionally compiling some code only if wxLongLong_t is + available and is a type different from the other integer types (i.e. not + long). + */ +#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG + #define wxIF_LONG_LONG_TYPE(x) x +#else + #define wxIF_LONG_LONG_TYPE(x) +#endif + /* Make sure ssize_t is defined (a signed type the same size as size_t). */ /* (HAVE_SSIZE_T is not already defined by configure) */ @@ -1216,11 +1316,7 @@ inline void *wxUIntToPtr(wxUIntPtr p) /* calculations */ typedef float wxFloat32; -#if (defined( __WXMAC__ ) || defined(__WXCOCOA__)) && defined (__MWERKS__) - typedef short double wxFloat64; -#else - typedef double wxFloat64; -#endif +typedef double wxFloat64; typedef double wxDouble; @@ -1280,6 +1376,63 @@ typedef double wxDouble; #endif +/* + Helper macro expanding into the given "m" macro invoked with each of the + integer types as parameter (notice that this does not include char/unsigned + char and bool but does include wchar_t). + */ +#define wxDO_FOR_INT_TYPES(m) \ + m(short) \ + m(unsigned short) \ + m(int) \ + m(unsigned int) \ + m(long) \ + m(unsigned long) \ + wxIF_LONG_LONG_TYPE( m(wxLongLong_t) ) \ + wxIF_LONG_LONG_TYPE( m(wxULongLong_t) ) \ + wxIF_WCHAR_T_TYPE( m(wchar_t) ) + +/* + Same as wxDO_FOR_INT_TYPES() but does include char and unsigned char. + + Notice that we use "char" and "unsigned char" here but not "signed char" + which would be more correct as "char" could be unsigned by default. But + wxWidgets code currently supposes that char is signed and we'd need to + clean up assumptions about it, notably in wx/unichar.h, to be able to use + "signed char" here. + */ +#define wxDO_FOR_CHAR_INT_TYPES(m) \ + m(char) \ + m(unsigned char) \ + wxDO_FOR_INT_TYPES(m) + +/* + Same as wxDO_FOR_INT_TYPES() above except that m macro takes the + type as the first argument and some extra argument, passed from this macro + itself, as the second one. + */ +#define wxDO_FOR_INT_TYPES_1(m, arg) \ + m(short, arg) \ + m(unsigned short, arg) \ + m(int, arg) \ + m(unsigned int, arg) \ + m(long, arg) \ + m(unsigned long, arg) \ + wxIF_LONG_LONG_TYPE( m(wxLongLong_t, arg) ) \ + wxIF_LONG_LONG_TYPE( m(wxULongLong_t, arg) ) \ + wxIF_WCHAR_T_TYPE( m(wchar_t, arg) ) + +/* + Combination of wxDO_FOR_CHAR_INT_TYPES() and wxDO_FOR_INT_TYPES_1(): + invokes the given macro with the specified argument as its second parameter + for all char and int types. + */ +#define wxDO_FOR_CHAR_INT_TYPES_1(m, arg) \ + m(char, arg) \ + m(unsigned char, arg) \ + wxDO_FOR_INT_TYPES_1(m, arg) + + /* ---------------------------------------------------------------------------- */ /* byte ordering related definition and macros */ /* ---------------------------------------------------------------------------- */ @@ -1298,36 +1451,6 @@ typedef double wxDouble; /* byte swapping */ -#if defined (__MWERKS__) && ( (__MWERKS__ < 0x0900) || macintosh ) -/* assembler versions for these */ -#ifdef __POWERPC__ - inline wxUint16 wxUINT16_SWAP_ALWAYS( wxUint16 i ) - {return (__lhbrx( &i , 0 ) );} - inline wxInt16 wxINT16_SWAP_ALWAYS( wxInt16 i ) - {return (__lhbrx( &i , 0 ) );} - inline wxUint32 wxUINT32_SWAP_ALWAYS( wxUint32 i ) - {return (__lwbrx( &i , 0 ) );} - inline wxInt32 wxINT32_SWAP_ALWAYS( wxInt32 i ) - {return (__lwbrx( &i , 0 ) );} -#else - #pragma parameter __D0 wxUINT16_SWAP_ALWAYS(__D0) - pascal wxUint16 wxUINT16_SWAP_ALWAYS(wxUint16 value) - = { 0xE158 }; - - #pragma parameter __D0 wxINT16_SWAP_ALWAYS(__D0) - pascal wxInt16 wxINT16_SWAP_ALWAYS(wxInt16 value) - = { 0xE158 }; - - #pragma parameter __D0 wxUINT32_SWAP_ALWAYS (__D0) - pascal wxUint32 wxUINT32_SWAP_ALWAYS(wxUint32 value) - = { 0xE158, 0x4840, 0xE158 }; - - #pragma parameter __D0 wxINT32_SWAP_ALWAYS (__D0) - pascal wxInt32 wxINT32_SWAP_ALWAYS(wxInt32 value) - = { 0xE158, 0x4840, 0xE158 }; - -#endif -#else /* !MWERKS */ #define wxUINT16_SWAP_ALWAYS(val) \ ((wxUint16) ( \ (((wxUint16) (val) & (wxUint16) 0x00ffU) << 8) | \ @@ -1351,7 +1474,6 @@ typedef double wxDouble; (((wxUint32) (val) & (wxUint32) 0x0000ff00U) << 8) | \ (((wxUint32) (val) & (wxUint32) 0x00ff0000U) >> 8) | \ (((wxUint32) (val) & (wxUint32) 0xff000000U) >> 24))) -#endif /* machine specific byte swapping */ #ifdef wxLongLong_t @@ -1928,9 +2050,10 @@ enum wxBorder #define wxMORE 0x00010000 #define wxSETUP 0x00020000 #define wxICON_NONE 0x00040000 +#define wxICON_AUTH_NEEDED 0x00080000 #define wxICON_MASK \ - (wxICON_EXCLAMATION|wxICON_HAND|wxICON_QUESTION|wxICON_INFORMATION|wxICON_NONE) + (wxICON_EXCLAMATION|wxICON_HAND|wxICON_QUESTION|wxICON_INFORMATION|wxICON_NONE|wxICON_AUTH_NEEDED) /* * Background styles. See wxWindow::SetBackgroundStyle @@ -2267,6 +2390,28 @@ enum wxHitTest /* GDI descriptions */ /* ---------------------------------------------------------------------------- */ +// Hatch styles used by both pen and brush styles. +// +// NB: Do not use these constants directly, they're for internal use only, use +// wxBRUSHSTYLE_XXX_HATCH and wxPENSTYLE_XXX_HATCH instead. +enum wxHatchStyle +{ + wxHATCHSTYLE_INVALID = -1, + + /* + The value of the first style is chosen to fit with + wxDeprecatedGUIConstants values below, don't change it. + */ + wxHATCHSTYLE_FIRST = 111, + wxHATCHSTYLE_BDIAGONAL = wxHATCHSTYLE_FIRST, + wxHATCHSTYLE_CROSSDIAG, + wxHATCHSTYLE_FDIAGONAL, + wxHATCHSTYLE_CROSS, + wxHATCHSTYLE_HORIZONTAL, + wxHATCHSTYLE_VERTICAL, + wxHATCHSTYLE_LAST = wxHATCHSTYLE_VERTICAL +}; + /* WARNING: the following styles are deprecated; use the wxFontFamily, wxFontStyle, wxFontWeight, wxBrushStyle, @@ -2315,14 +2460,14 @@ enum wxDeprecatedGUIConstants /* drawn with a Pen, and without any Brush -- and it can be stippled. */ wxSTIPPLE = 110, - wxBDIAGONAL_HATCH, /* In wxWidgets < 2.6 use WX_HATCH macro */ - wxCROSSDIAG_HATCH, /* to verify these wx*_HATCH are in style */ - wxFDIAGONAL_HATCH, /* of wxBrush. In wxWidgets >= 2.6 use */ - wxCROSS_HATCH, /* wxBrush::IsHatch() instead. */ - wxHORIZONTAL_HATCH, - wxVERTICAL_HATCH, - wxFIRST_HATCH = wxBDIAGONAL_HATCH, - wxLAST_HATCH = wxVERTICAL_HATCH + wxBDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxCROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxFDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxCROSS_HATCH = wxHATCHSTYLE_CROSS, + wxHORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxVERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxFIRST_HATCH = wxHATCHSTYLE_FIRST, + wxLAST_HATCH = wxHATCHSTYLE_LAST }; #endif @@ -2793,10 +2938,15 @@ typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); /* --------------------------------------------------------------------------- */ /* macros that enable wxWidgets apps to be compiled in absence of the */ -/* sytem headers, although some platform specific types are used in the */ +/* system headers, although some platform specific types are used in the */ /* platform specific (implementation) parts of the headers */ /* --------------------------------------------------------------------------- */ +#ifdef __DARWIN__ +#define DECLARE_WXOSX_OPAQUE_CFREF( name ) typedef struct __##name* name##Ref; +#define DECLARE_WXOSX_OPAQUE_CONST_CFREF( name ) typedef const struct __##name* name##Ref; +#endif + #ifdef __WXMAC__ #define WX_OPAQUE_TYPE( name ) struct wxOpaque##name @@ -2833,9 +2983,6 @@ typedef const void * CFTypeRef; /* typedef const struct __CFString * CFStringRef; */ -#define DECLARE_WXOSX_OPAQUE_CFREF( name ) typedef struct __##name* name##Ref; -#define DECLARE_WXOSX_OPAQUE_CONST_CFREF( name ) typedef const struct __##name* name##Ref; - DECLARE_WXOSX_OPAQUE_CONST_CFREF( CFString ) typedef struct __CFString * CFMutableStringRef; @@ -2908,7 +3055,7 @@ typedef unsigned int NSUInteger; */ /* NOTE: This ought to work with other compilers too, but I'm being cautious */ -#if (defined(__GNUC__) && defined(__APPLE__)) || defined(__MWERKS__) +#if (defined(__GNUC__) && defined(__APPLE__)) /* It's desirable to have type safety for Objective-C(++) code as it does at least catch typos of method names among other things. However, it is not possible to declare an Objective-C class from plain old C or C++ @@ -2928,7 +3075,7 @@ typedef klass *WX_##klass typedef struct klass *WX_##klass #endif /* defined(__OBJC__) */ -#else /* not Apple's GNU or CodeWarrior */ +#else /* not Apple's gcc */ #warning "Objective-C types will not be checked by the compiler." /* NOTE: typedef struct objc_object *id; */ /* IOW, we're declaring these using the id type without using that name, */ @@ -2938,7 +3085,7 @@ typedef struct klass *WX_##klass #define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ typedef struct objc_object *WX_##klass -#endif /* (defined(__GNUC__) && defined(__APPLE__)) || defined(__MWERKS__) */ +#endif /* (defined(__GNUC__) && defined(__APPLE__)) */ DECLARE_WXCOCOA_OBJC_CLASS(NSApplication); DECLARE_WXCOCOA_OBJC_CLASS(NSBitmapImageRep); @@ -2961,6 +3108,7 @@ DECLARE_WXCOCOA_OBJC_CLASS(NSMutableArray); DECLARE_WXCOCOA_OBJC_CLASS(NSNotification); DECLARE_WXCOCOA_OBJC_CLASS(NSObject); DECLARE_WXCOCOA_OBJC_CLASS(NSPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSResponder); DECLARE_WXCOCOA_OBJC_CLASS(NSScrollView); DECLARE_WXCOCOA_OBJC_CLASS(NSSound); DECLARE_WXCOCOA_OBJC_CLASS(NSStatusItem); @@ -3058,7 +3206,9 @@ typedef void * WXDRAWITEMSTRUCT; typedef void * WXMEASUREITEMSTRUCT; typedef void * WXLPCREATESTRUCT; +#ifdef __WXMSW__ typedef WXHWND WXWidget; +#endif #ifdef __WIN64__ typedef unsigned __int64 WXWPARAM; @@ -3231,14 +3381,14 @@ typedef struct _GdkDragContext GdkDragContext; typedef unsigned long GdkAtom; #endif -#if !defined(__WXGTK30__) +#if !defined(__WXGTK3__) typedef struct _GdkColormap GdkColormap; typedef struct _GdkFont GdkFont; typedef struct _GdkGC GdkGC; typedef struct _GdkRegion GdkRegion; #endif -#if defined(__WXGTK30__) +#if defined(__WXGTK3__) typedef struct _GdkWindow GdkWindow; #elif defined(__WXGTK20__) typedef struct _GdkDrawable GdkWindow; @@ -3294,9 +3444,9 @@ typedef const void* WXWidget; /* included before or after wxWidgets classes, and therefore must be */ /* disabled here before any significant wxWidgets headers are included. */ #ifdef __cplusplus -#ifdef __WXMSW__ +#ifdef __WINDOWS__ #include "wx/msw/winundef.h" -#endif /* __WXMSW__ */ +#endif /* __WINDOWS__ */ #endif /* __cplusplus */ @@ -3338,7 +3488,8 @@ typedef const void* WXWidget; /* If a manifest is being automatically generated, add common controls 6 to it */ /* --------------------------------------------------------------------------- */ -#if (!defined wxUSE_NO_MANIFEST || wxUSE_NO_MANIFEST == 0 ) && \ +#if wxUSE_GUI && \ + (!defined wxUSE_NO_MANIFEST || wxUSE_NO_MANIFEST == 0 ) && \ ( defined _MSC_FULL_VER && _MSC_FULL_VER >= 140040130 ) #define WX_CC_MANIFEST(cpu) \ @@ -3361,5 +3512,13 @@ typedef const void* WXWidget; #endif /* !wxUSE_NO_MANIFEST && _MSC_FULL_VER >= 140040130 */ +/* wxThread and wxProcess priorities */ +enum +{ + wxPRIORITY_MIN = 0u, /* lowest possible priority */ + wxPRIORITY_DEFAULT = 50u, /* normal priority */ + wxPRIORITY_MAX = 100u /* highest possible priority */ +}; + #endif /* _WX_DEFS_H_ */ diff --git a/Externals/wxWidgets3/include/wx/dialog.h b/Externals/wxWidgets3/include/wx/dialog.h index 3ce0c53ccc..e32cabb018 100644 --- a/Externals/wxWidgets3/include/wx/dialog.h +++ b/Externals/wxWidgets3/include/wx/dialog.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29.06.99 -// RCS-ID: $Id: dialog.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,8 +11,8 @@ #ifndef _WX_DIALOG_H_BASE_ #define _WX_DIALOG_H_BASE_ -#include "wx/defs.h" #include "wx/toplevel.h" +#include "wx/containr.h" class WXDLLIMPEXP_FWD_CORE wxSizer; class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer; @@ -65,10 +64,10 @@ enum wxDialogModality extern WXDLLIMPEXP_DATA_CORE(const char) wxDialogNameStr[]; -class WXDLLIMPEXP_CORE wxDialogBase : public wxTopLevelWindow +class WXDLLIMPEXP_CORE wxDialogBase : public wxNavigationEnabled { public: - wxDialogBase() { Init(); } + wxDialogBase(); virtual ~wxDialogBase() { } // define public wxDialog methods to be implemented by the derived classes @@ -80,6 +79,11 @@ public: virtual void ShowWindowModal () ; virtual void SendWindowModalDialogEvent ( wxEventType type ); +#ifdef wxHAS_EVENT_BIND + template + void ShowWindowModalThenDo(const Functor& onEndModal); +#endif // wxHAS_EVENT_BIND + // Modal dialogs have a return code - usually the id of the last // pressed button void SetReturnCode(int returnCode) { m_returnCode = returnCode; } @@ -242,9 +246,6 @@ protected: static bool sm_layoutAdaptation; private: - // common part of all ctors - void Init(); - // helper of GetParentForModalDialog(): returns the passed in window if it // can be used as our parent or NULL if it can't wxWindow *CheckIfCanBeUsedAsParent(wxWindow *parent) const; @@ -395,5 +396,40 @@ typedef void (wxEvtHandler::*wxWindowModalDialogEventFunction)(wxWindowModalDial #define EVT_WINDOW_MODAL_DIALOG_CLOSED(winid, func) \ wx__DECLARE_EVT1(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, winid, wxWindowModalDialogEventHandler(func)) +#ifdef wxHAS_EVENT_BIND +template +class wxWindowModalDialogEventFunctor +{ +public: + wxWindowModalDialogEventFunctor(const Functor& f) + : m_f(f), m_wasCalled(false) + {} + + void operator()(wxWindowModalDialogEvent& event) + { + if ( m_wasCalled ) + { + event.Skip(); + return; + } + + m_wasCalled = true; + m_f(event.GetReturnCode()); + } + +private: + Functor m_f; + bool m_wasCalled; +}; + +template +void wxDialogBase::ShowWindowModalThenDo(const Functor& onEndModal) +{ + Bind(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, + wxWindowModalDialogEventFunctor(onEndModal)); + ShowWindowModal(); +}; +#endif // wxHAS_EVENT_BIND + #endif // _WX_DIALOG_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/dialup.h b/Externals/wxWidgets3/include/wx/dialup.h index ba591ebe71..7688d4a1f8 100644 --- a/Externals/wxWidgets3/include/wx/dialup.h +++ b/Externals/wxWidgets3/include/wx/dialup.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07.07.99 -// RCS-ID: $Id: dialup.h 67384 2011-04-03 20:31:32Z DS $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dir.h b/Externals/wxWidgets3/include/wx/dir.h index a4ad56ce18..f23862e0a9 100644 --- a/Externals/wxWidgets3/include/wx/dir.h +++ b/Externals/wxWidgets3/include/wx/dir.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 08.12.99 -// RCS-ID: $Id: dir.h 65680 2010-09-30 11:44:45Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -22,14 +21,17 @@ class WXDLLIMPEXP_FWD_BASE wxArrayString; // constants // ---------------------------------------------------------------------------- -// these flags define what kind of filenames is included in the list of files -// enumerated by GetFirst/GetNext +// These flags affect the behaviour of GetFirst/GetNext() and Traverse(). +// They define what types are included in the list of items they produce. +// Note that wxDIR_NO_FOLLOW is relevant only on Unix and ignored under systems +// not supporting symbolic links. enum wxDirFlags { wxDIR_FILES = 0x0001, // include files wxDIR_DIRS = 0x0002, // include directories wxDIR_HIDDEN = 0x0004, // include hidden files wxDIR_DOTDOT = 0x0008, // include '.' and '..' + wxDIR_NO_FOLLOW = 0x0010, // don't dereference any symlink // by default, enumerate everything except '.' and '..' wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN @@ -94,18 +96,25 @@ public: // opens the directory for enumeration, use IsOpened() to test success wxDir(const wxString& dir); - // dtor cleans up the associated resources - ~wxDir(); + // dtor calls Close() automatically + ~wxDir() { Close(); } // open the directory for enumerating bool Open(const wxString& dir); + // close the directory, Open() can be called again later + void Close(); + // returns true if the directory was successfully opened bool IsOpened() const; // get the full name of the directory (without '/' at the end) wxString GetName() const; + // Same as GetName() but does include the trailing separator, unless the + // string is empty (only for invalid directories). + wxString GetNameWithSep() const; + // file enumeration routines // ------------------------- diff --git a/Externals/wxWidgets3/include/wx/dirctrl.h b/Externals/wxWidgets3/include/wx/dirctrl.h index 704f8bb768..1d9d1ba186 100644 --- a/Externals/wxWidgets3/include/wx/dirctrl.h +++ b/Externals/wxWidgets3/include/wx/dirctrl.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dirctrl.h 33948 2005-05-04 18:57:50Z JS $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dirdlg.h b/Externals/wxWidgets3/include/wx/dirdlg.h index 16f7beef5d..b7b7474ab5 100644 --- a/Externals/wxWidgets3/include/wx/dirdlg.h +++ b/Externals/wxWidgets3/include/wx/dirdlg.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Robert Roebling -// RCS-ID: $Id: dirdlg.h 70353 2012-01-15 14:46:41Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/display.h b/Externals/wxWidgets3/include/wx/display.h index c04e8b55b3..4678672138 100644 --- a/Externals/wxWidgets3/include/wx/display.h +++ b/Externals/wxWidgets3/include/wx/display.h @@ -3,7 +3,6 @@ // Purpose: wxDisplay class // Author: Royce Mitchell III, Vadim Zeitlin // Created: 06/21/02 -// RCS-ID: $Id: display.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2002-2006 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/display_impl.h b/Externals/wxWidgets3/include/wx/display_impl.h index e228214779..b6674ebfad 100644 --- a/Externals/wxWidgets3/include/wx/display_impl.h +++ b/Externals/wxWidgets3/include/wx/display_impl.h @@ -3,7 +3,6 @@ // Purpose: wxDisplayImpl class declaration // Author: Vadim Zeitlin // Created: 2006-03-15 -// RCS-ID: $Id: display_impl.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2002-2006 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dlimpexp.h b/Externals/wxWidgets3/include/wx/dlimpexp.h index 1042938b40..800b745fa6 100644 --- a/Externals/wxWidgets3/include/wx/dlimpexp.h +++ b/Externals/wxWidgets3/include/wx/dlimpexp.h @@ -4,7 +4,6 @@ * Author: Vadim Zeitlin * Modified by: * Created: 16.10.2003 (extracted from wx/defs.h) - * RCS-ID: $Id: dlimpexp.h 69049 2011-09-10 18:09:12Z SJL $ * Copyright: (c) 2003 Vadim Zeitlin * Licence: wxWindows licence */ @@ -57,11 +56,6 @@ # define WXEXPORT _Export # define WXIMPORT _Export # endif -#elif defined(__WXMAC__) || defined(__WXCOCOA__) -# ifdef __MWERKS__ -# define WXEXPORT __declspec(export) -# define WXIMPORT __declspec(import) -# endif #elif defined(__CYGWIN__) # define WXEXPORT __declspec(dllexport) # define WXIMPORT __declspec(dllimport) @@ -97,8 +91,8 @@ # define WXMAKINGDLL_XML # define WXMAKINGDLL_XRC # define WXMAKINGDLL_AUI -# define WXMAKINGDLL_RIBBON # define WXMAKINGDLL_PROPGRID +# define WXMAKINGDLL_RIBBON # define WXMAKINGDLL_RICHTEXT # define WXMAKINGDLL_MEDIA # define WXMAKINGDLL_STC @@ -229,14 +223,6 @@ # define WXDLLIMPEXP_AUI #endif -#ifdef WXMAKINGDLL_RIBBON -# define WXDLLIMPEXP_RIBBON WXEXPORT -#elif defined(WXUSINGDLL) -# define WXDLLIMPEXP_RIBBON WXIMPORT -#else /* not making nor using DLL */ -# define WXDLLIMPEXP_RIBBON -#endif - #ifdef WXMAKINGDLL_PROPGRID # define WXDLLIMPEXP_PROPGRID WXEXPORT # define WXDLLIMPEXP_DATA_PROPGRID(type) WXEXPORT type @@ -248,6 +234,14 @@ # define WXDLLIMPEXP_DATA_PROPGRID(type) type #endif +#ifdef WXMAKINGDLL_RIBBON +# define WXDLLIMPEXP_RIBBON WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_RIBBON WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_RIBBON +#endif + #ifdef WXMAKINGDLL_RICHTEXT # define WXDLLIMPEXP_RICHTEXT WXEXPORT #elif defined(WXUSINGDLL) @@ -304,6 +298,7 @@ #define WXDLLIMPEXP_FWD_XRC #define WXDLLIMPEXP_FWD_AUI #define WXDLLIMPEXP_FWD_PROPGRID + #define WXDLLIMPEXP_FWD_RIBBON #define WXDLLIMPEXP_FWD_RICHTEXT #define WXDLLIMPEXP_FWD_MEDIA #define WXDLLIMPEXP_FWD_STC @@ -320,6 +315,7 @@ #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI #define WXDLLIMPEXP_FWD_PROPGRID WXDLLIMPEXP_PROPGRID + #define WXDLLIMPEXP_FWD_RIBBON WXDLLIMPEXP_RIBBON #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC diff --git a/Externals/wxWidgets3/include/wx/dnd.h b/Externals/wxWidgets3/include/wx/dnd.h index 7b832d109c..9d9f2e25ca 100644 --- a/Externals/wxWidgets3/include/wx/dnd.h +++ b/Externals/wxWidgets3/include/wx/dnd.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Robert Roebling // Modified by: // Created: 26.05.99 -// RCS-ID: $Id: dnd.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -66,7 +65,7 @@ public: { m_data = NULL; } virtual ~wxDropSourceBase() { } - // set the data which is transfered by drag and drop + // set the data which is transferred by drag and drop void SetData(wxDataObject& data) { m_data = &data; } diff --git a/Externals/wxWidgets3/include/wx/docmdi.h b/Externals/wxWidgets3/include/wx/docmdi.h index a24492492a..e7dcb7ad02 100644 --- a/Externals/wxWidgets3/include/wx/docmdi.h +++ b/Externals/wxWidgets3/include/wx/docmdi.h @@ -3,7 +3,6 @@ // Purpose: Frame classes for MDI document/view applications // Author: Julian Smart // Created: 01/02/97 -// RCS-ID: $Id: docmdi.h 64295 2010-05-12 14:34:18Z VZ $ // Copyright: (c) 1997 Julian Smart // (c) 2010 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/docview.h b/Externals/wxWidgets3/include/wx/docview.h index e15414e65f..44fbe90639 100644 --- a/Externals/wxWidgets3/include/wx/docview.h +++ b/Externals/wxWidgets3/include/wx/docview.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: docview.h 70098 2011-12-23 05:59:59Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,6 +20,7 @@ #include "wx/string.h" #include "wx/frame.h" #include "wx/filehistory.h" +#include "wx/vector.h" #if wxUSE_PRINTING_ARCHITECTURE #include "wx/print.h" @@ -60,6 +60,10 @@ enum #define wxMAX_FILE_HISTORY 9 +typedef wxVector wxDocVector; +typedef wxVector wxViewVector; +typedef wxVector wxDocTemplateVector; + class WXDLLIMPEXP_CORE wxDocument : public wxEvtHandler { public: @@ -81,6 +85,9 @@ public: bool GetDocumentSaved() const { return m_savedYet; } void SetDocumentSaved(bool saved = true) { m_savedYet = saved; } + // activate the first view of the document if any + void Activate(); + // return true if the document hasn't been modified since the last time it // was saved (implying that it returns false if it was never saved, even if // the document is not modified) @@ -140,8 +147,14 @@ public: virtual bool AddView(wxView *view); virtual bool RemoveView(wxView *view); + +#ifndef __VISUALC6__ + wxViewVector GetViewsVector() const; +#endif // !__VISUALC6__ + wxList& GetViews() { return m_documentViews; } const wxList& GetViews() const { return m_documentViews; } + wxView *GetFirstView() const; virtual void UpdateAllViews(wxView *sender = NULL, wxObject *hint = NULL); @@ -432,6 +445,9 @@ public: // Find template from document class info, may return NULL. wxDocTemplate* FindTemplate(const wxClassInfo* documentClassInfo); + // Find document from file name, may return NULL. + wxDocument* FindDocumentByPath(const wxString& path) const; + wxDocument *GetCurrentDocument() const; void SetMaxDocsOpen(int n) { m_maxDocsOpen = n; } @@ -455,6 +471,17 @@ public: virtual void ActivateView(wxView *view, bool activate = true); virtual wxView *GetCurrentView() const { return m_currentView; } + // This method tries to find an active view harder than GetCurrentView(): + // if the latter is NULL, it also checks if we don't have just a single + // view and returns it then. + wxView *GetAnyUsableView() const; + + +#ifndef __VISUALC6__ + wxDocVector GetDocumentsVector() const; + wxDocTemplateVector GetTemplatesVector() const; +#endif // !__VISUALC6__ + wxList& GetDocuments() { return m_docs; } wxList& GetTemplates() { return m_templates; } @@ -529,15 +556,6 @@ protected: // return the command processor for the current document, if any wxCommandProcessor *GetCurrentCommandProcessor() const; - // this method tries to find an active view harder than GetCurrentView(): - // if the latter is NULL, it also checks if we don't have just a single - // view and returns it then - wxView *GetActiveView() const; - - // activate the first view of the given document if any - void ActivateDocument(wxDocument *doc); - - int m_defaultDocumentNameCounter; int m_maxDocsOpen; wxList m_docs; @@ -624,10 +642,7 @@ protected: // we're not a wxEvtHandler but we provide this wxEvtHandler-like function // which is called from TryBefore() of the derived classes to give our view // a chance to process the message before the frame event handlers are used - bool TryProcessEvent(wxEvent& event) - { - return m_childView && m_childView->ProcessEventLocally(event); - } + bool TryProcessEvent(wxEvent& event); // called from EVT_CLOSE handler in the frame: check if we can close and do // cleanup if so; veto the event otherwise @@ -811,11 +826,22 @@ private: class WXDLLIMPEXP_CORE wxDocParentFrameAnyBase { public: - wxDocParentFrameAnyBase() { m_docManager = NULL; } + wxDocParentFrameAnyBase(wxWindow* frame) + : m_frame(frame) + { + m_docManager = NULL; + } wxDocManager *GetDocumentManager() const { return m_docManager; } protected: + // This is similar to wxDocChildFrameAnyBase method with the same name: + // while we're not an event handler ourselves and so can't override + // TryBefore(), we provide a helper that the derived template class can use + // from its TryBefore() implementation. + bool TryProcessEvent(wxEvent& event); + + wxWindow* const m_frame; wxDocManager *m_docManager; wxDECLARE_NO_COPY_CLASS(wxDocParentFrameAnyBase); @@ -828,7 +854,7 @@ class WXDLLIMPEXP_CORE wxDocParentFrameAny : public BaseFrame, public wxDocParentFrameAnyBase { public: - wxDocParentFrameAny() { } + wxDocParentFrameAny() : wxDocParentFrameAnyBase(this) { } wxDocParentFrameAny(wxDocManager *manager, wxFrame *frame, wxWindowID id, @@ -837,6 +863,7 @@ public: const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr) + : wxDocParentFrameAnyBase(this) { Create(manager, frame, id, title, pos, size, style, name); } @@ -855,7 +882,7 @@ public: if ( !BaseFrame::Create(frame, id, title, pos, size, style, name) ) return false; - this->Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, + this->Connect(wxID_EXIT, wxEVT_MENU, wxCommandEventHandler(wxDocParentFrameAny::OnExit)); this->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(wxDocParentFrameAny::OnCloseWindow)); @@ -867,10 +894,7 @@ protected: // hook the document manager into event handling chain here virtual bool TryBefore(wxEvent& event) { - if ( m_docManager && m_docManager->ProcessEventLocally(event) ) - return true; - - return BaseFrame::TryBefore(event); + return TryProcessEvent(event) || BaseFrame::TryBefore(event); } private: @@ -995,6 +1019,23 @@ enum }; #endif // WXWIN_COMPATIBILITY_2_8 +#ifndef __VISUALC6__ +inline wxViewVector wxDocument::GetViewsVector() const +{ + return m_documentViews.AsVector(); +} + +inline wxDocVector wxDocManager::GetDocumentsVector() const +{ + return m_docs.AsVector(); +} + +inline wxDocTemplateVector wxDocManager::GetTemplatesVector() const +{ + return m_templates.AsVector(); +} +#endif // !__VISUALC6__ + #endif // wxUSE_DOC_VIEW_ARCHITECTURE #endif // _WX_DOCH__ diff --git a/Externals/wxWidgets3/include/wx/dragimag.h b/Externals/wxWidgets3/include/wx/dragimag.h index 3f04a404ab..4143ca8898 100644 --- a/Externals/wxWidgets3/include/wx/dragimag.h +++ b/Externals/wxWidgets3/include/wx/dragimag.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: dragimag.h 47254 2007-07-09 10:09:52Z VS $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/dvrenderers.h b/Externals/wxWidgets3/include/wx/dvrenderers.h index 7c372739b8..3f623cf6a6 100644 --- a/Externals/wxWidgets3/include/wx/dvrenderers.h +++ b/Externals/wxWidgets3/include/wx/dvrenderers.h @@ -3,7 +3,6 @@ // Purpose: Declare all wxDataViewCtrl classes // Author: Robert Roebling, Vadim Zeitlin // Created: 2009-11-08 (extracted from wx/dataview.h) -// RCS-ID: $Id: dvrenderers.h 70050 2011-12-19 12:54:38Z VZ $ // Copyright: (c) 2006 Robert Roebling // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence @@ -168,6 +167,15 @@ protected: // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl void DestroyEditControl(); + // Return the alignment of this renderer if it's specified (i.e. has value + // different from the default wxDVR_DEFAULT_ALIGNMENT) or the alignment of + // the column it is used for otherwise. + // + // Unlike GetAlignment(), this always returns a valid combination of + // wxALIGN_XXX flags (although possibly wxALIGN_NOT) and never returns + // wxDVR_DEFAULT_ALIGNMENT. + int GetEffectiveAlignment() const; + wxString m_variantType; wxDataViewColumn *m_owner; wxWeakRef m_editorCtrl; diff --git a/Externals/wxWidgets3/include/wx/dynarray.h b/Externals/wxWidgets3/include/wx/dynarray.h index 09237e0a77..6495030f0c 100644 --- a/Externals/wxWidgets3/include/wx/dynarray.h +++ b/Externals/wxWidgets3/include/wx/dynarray.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.09.97 -// RCS-ID: $Id: dynarray.h 69688 2011-11-05 15:20:32Z VS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -128,6 +127,8 @@ public: \ name() : std::vector() { } \ name(size_type n) : std::vector(n) { } \ name(size_type n, const_reference v) : std::vector(n, v) { } \ + template \ + name(InputIterator first, InputIterator last) : std::vector(first, last) { } \ \ void Empty() { clear(); } \ void Clear() { clear(); } \ @@ -249,7 +250,7 @@ protected: \ typedef const value_type* const_iterator; \ typedef value_type& reference; \ typedef const value_type& const_reference; \ - typedef int difference_type; \ + typedef ptrdiff_t difference_type; \ typedef size_t size_type; \ \ void assign(const_iterator first, const_iterator last); \ @@ -274,8 +275,13 @@ protected: \ void pop_back() { RemoveAt(size() - 1); } \ void push_back(const value_type& v) { Add(v); } \ void reserve(size_type n) { Alloc(n); } \ - void resize(size_type n, value_type v = value_type()) \ - { SetCount(n, v); } \ + void resize(size_type count, value_type defval = value_type()) \ + { \ + if ( count < m_nCount ) \ + m_nCount = count; \ + else \ + SetCount(count, defval); \ + } \ \ iterator begin() { return m_pItems; } \ iterator end() { return m_pItems + m_nCount; } \ diff --git a/Externals/wxWidgets3/include/wx/dynlib.h b/Externals/wxWidgets3/include/wx/dynlib.h index 4e4e411dbc..5487ccc949 100644 --- a/Externals/wxWidgets3/include/wx/dynlib.h +++ b/Externals/wxWidgets3/include/wx/dynlib.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux, Vadim Zeitlin, Vaclav Slavik // Modified by: // Created: 20/07/98 -// RCS-ID: $Id: dynlib.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -232,7 +231,7 @@ public: static wxDllType GetProgramHandle(); // return the platform standard DLL extension (with leading dot) - static const wxString& GetDllExt() { return ms_dllext; } + static wxString GetDllExt(wxDynamicLibraryCategory cat = wxDL_LIBRARY); wxDynamicLibrary() : m_handle(0) { } wxDynamicLibrary(const wxString& libname, int flags = wxDL_DEFAULT) @@ -359,7 +358,7 @@ public: // the returned handle reference count is not incremented so it doesn't // need to be freed using FreeLibrary() but it also means that it can // become invalid if the DLL is unloaded - static WXHMODULE MSWGetModuleHandle(const char *name, void *addr); + static WXHMODULE MSWGetModuleHandle(const wxString& name, void *addr); #endif // __WINDOWS__ protected: @@ -372,9 +371,6 @@ protected: #endif // wxHAVE_DYNLIB_ERROR - // platform specific shared lib suffix. - static const wxString ms_dllext; - // the handle to DLL or NULL wxDllType m_handle; diff --git a/Externals/wxWidgets3/include/wx/dynload.h b/Externals/wxWidgets3/include/wx/dynload.h index 29575b5b08..7cb4d25bac 100644 --- a/Externals/wxWidgets3/include/wx/dynload.h +++ b/Externals/wxWidgets3/include/wx/dynload.h @@ -5,7 +5,6 @@ // (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux) // Modified by: // Created: 03/12/01 -// RCS-ID: $Id: dynload.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2001 Ron Lee // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -82,8 +81,11 @@ public: private: - const wxClassInfo *m_before; // sm_first before loading this lib - const wxClassInfo *m_after; // ..and after. + // These pointers may be NULL but if they are not, then m_ourLast follows + // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a + // sufficient number of times. + const wxClassInfo *m_ourFirst; // first class info in this plugin + const wxClassInfo *m_ourLast; // ..and the last one size_t m_linkcount; // Ref count of library link calls size_t m_objcount; // ..and (pluggable) object instantiations. diff --git a/Externals/wxWidgets3/include/wx/editlbox.h b/Externals/wxWidgets3/include/wx/editlbox.h index 890d74e333..7aad2ac205 100644 --- a/Externals/wxWidgets3/include/wx/editlbox.h +++ b/Externals/wxWidgets3/include/wx/editlbox.h @@ -2,7 +2,6 @@ // Name: wx/editlbox.h // Purpose: ListBox with editable items // Author: Vaclav Slavik -// RCS-ID: $Id: editlbox.h 56651 2008-11-02 22:16:14Z FM $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -89,6 +88,10 @@ protected: DECLARE_CLASS(wxEditableListBox) DECLARE_EVENT_TABLE() + +private: + void SwapItems(long i1, long i2); + }; #endif // wxUSE_EDITABLELISTBOX diff --git a/Externals/wxWidgets3/include/wx/effects.h b/Externals/wxWidgets3/include/wx/effects.h index e12835d025..adaf951c10 100644 --- a/Externals/wxWidgets3/include/wx/effects.h +++ b/Externals/wxWidgets3/include/wx/effects.h @@ -5,7 +5,6 @@ // Author: Julian Smart et al // Modified by: // Created: 25/4/2000 -// RCS-ID: $Id: effects.h 54372 2008-06-26 11:16:40Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/encconv.h b/Externals/wxWidgets3/include/wx/encconv.h index 5447fb5980..bc464785c8 100644 --- a/Externals/wxWidgets3/include/wx/encconv.h +++ b/Externals/wxWidgets3/include/wx/encconv.h @@ -76,7 +76,7 @@ class WXDLLIMPEXP_BASE wxEncodingConverter : public wxObject // try some (lossy) substitutions - e.g. replace // unconvertable latin capitals with acute by ordinary // capitals, replace en-dash or em-dash by '-' etc. - // both modes gurantee that output string will have same length + // both modes guarantee that output string will have same length // as input string // // Returns false if given conversion is impossible, true otherwise @@ -109,9 +109,9 @@ class WXDLLIMPEXP_BASE wxEncodingConverter : public wxObject // // Equivalence is defined in terms of convertibility: // 2 encodings are equivalent if you can convert text between - // then without loosing information (it may - and will - happen - // that you loose special chars like quotation marks or em-dashes - // but you shouldn't loose any diacritics and language-specific + // then without losing information (it may - and will - happen + // that you lose special chars like quotation marks or em-dashes + // but you shouldn't lose any diacritics and language-specific // characters when converting between equivalent encodings). // // Convert() method is not limited to converting between diff --git a/Externals/wxWidgets3/include/wx/encinfo.h b/Externals/wxWidgets3/include/wx/encinfo.h index bbe7229723..27b1453847 100644 --- a/Externals/wxWidgets3/include/wx/encinfo.h +++ b/Externals/wxWidgets3/include/wx/encinfo.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.09.2003 (extracted from wx/fontenc.h) -// RCS-ID: $Id: encinfo.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/event.h b/Externals/wxWidgets3/include/wx/event.h index 19610b0f18..1dcdf333dc 100644 --- a/Externals/wxWidgets3/include/wx/event.h +++ b/Externals/wxWidgets3/include/wx/event.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: event.h 70703 2012-02-26 20:24:25Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -33,6 +32,14 @@ #include "wx/meta/convertible.h" #endif +// Currently VC6 and VC7 are known to not be able to compile CallAfter() code, +// so disable it for them. +#if !defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(8) + #include "wx/meta/removeref.h" + + #define wxHAS_CALL_AFTER +#endif + // ---------------------------------------------------------------------------- // forward declarations // ---------------------------------------------------------------------------- @@ -621,6 +628,7 @@ extern WXDLLIMPEXP_BASE const wxEventType wxEVT_USER_FIRST; // Need events declared to do this class WXDLLIMPEXP_FWD_BASE wxIdleEvent; class WXDLLIMPEXP_FWD_BASE wxThreadEvent; +class WXDLLIMPEXP_FWD_BASE wxAsyncMethodCallEvent; class WXDLLIMPEXP_FWD_CORE wxCommandEvent; class WXDLLIMPEXP_FWD_CORE wxMouseEvent; class WXDLLIMPEXP_FWD_CORE wxFocusEvent; @@ -660,29 +668,30 @@ class WXDLLIMPEXP_FWD_CORE wxHelpEvent; // Command events -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_BUTTON, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHECKBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHOICE, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LISTBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LISTBOX_DCLICK, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHECKLISTBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MENU, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SLIDER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RADIOBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_RADIOBUTTON, wxCommandEvent); -// wxEVT_COMMAND_SCROLLBAR_UPDATED is deprecated, use wxEVT_SCROLL... events -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SCROLLBAR_UPDATED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_VLBOX_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_RCLICKED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_ENTER, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent); +// wxEVT_SCROLLBAR is deprecated, use wxEVT_SCROLL... events +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLBAR, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_VLBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_RCLICKED, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TOOL_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMBOBOX_CLOSEUP, wxCommandEvent); - // Thread events + // Thread and asynchronous method call events wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_THREAD, wxThreadEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_ASYNC_METHOD_CALL, wxAsyncMethodCallEvent); // Mouse event types wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_LEFT_DOWN, wxMouseEvent); @@ -801,9 +810,9 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MOVE_END, wxMoveEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_HIBERNATE, wxActivateEvent); // Clipboard events -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_COPY, wxClipboardTextEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_CUT, wxClipboardTextEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_PASTE, wxClipboardTextEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_COPY, wxClipboardTextEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_CUT, wxClipboardTextEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_PASTE, wxClipboardTextEvent); // Generic command events // Note: a click is a higher-level event than button down/up @@ -820,7 +829,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_HELP, wxHelpEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DETAILED_HELP, wxHelpEvent); // these 2 events are the same -#define wxEVT_COMMAND_TOOL_CLICKED wxEVT_COMMAND_MENU_SELECTED +#define wxEVT_TOOL wxEVT_MENU // ---------------------------------------------------------------------------- // Compatibility @@ -830,7 +839,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_DETAILED_HELP, wxHelpEvent); // wx/textctrl.h in all ports [yet], so declare it here as well // // still, any new code using it should include wx/textctrl.h explicitly -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT, wxCommandEvent); // ---------------------------------------------------------------------------- @@ -930,6 +939,10 @@ public: int GetId() const { return m_id; } void SetId(int Id) { m_id = Id; } + // Returns the user data optionally associated with the event handler when + // using Connect() or Bind(). + wxObject *GetEventUserData() const { return m_callbackUserData; } + // Can instruct event processor that we wish to ignore this event // (treat as if the event table entry had not been found): this must be done // to allow the event processing by the base classes (calling event.Skip() @@ -972,6 +985,9 @@ public: m_propagationLevel = propagationLevel; } + // This method is for internal use only and allows to get the object that + // is propagating this event upwards the window hierarchy, if any. + wxEvtHandler* GetPropagatedFrom() const { return m_propagatedFrom; } // This is for internal use only and is only called by // wxEvtHandler::ProcessEvent() to check whether it's the first time this @@ -986,6 +1002,24 @@ public: return false; } + // This is for internal use only and is used for setting, testing and + // resetting of m_willBeProcessedAgain flag. + void SetWillBeProcessedAgain() + { + m_willBeProcessedAgain = true; + } + + bool WillBeProcessedAgain() + { + if ( m_willBeProcessedAgain ) + { + m_willBeProcessedAgain = false; + return true; + } + + return false; + } + // This is also used only internally by ProcessEvent() to check if it // should process the event normally or only restrict the search for the // event handler to this object itself. @@ -1024,6 +1058,10 @@ protected: // the parent window (if any) int m_propagationLevel; + // The object that the event is being propagated from, initially NULL and + // only set by wxPropagateOnce. + wxEvtHandler* m_propagatedFrom; + bool m_skipped; bool m_isCommandEvent; @@ -1033,12 +1071,17 @@ protected: // once for this event bool m_wasProcessed; + // This one is initially false too, but can be set to true to indicate that + // the event will be passed to another handler if it's not processed in + // this one. + bool m_willBeProcessedAgain; + protected: wxEvent(const wxEvent&); // for implementing Clone() wxEvent& operator=(const wxEvent&); // for derived classes operator=() private: - // it needs to access our m_propagationLevel + // It needs to access our m_propagationLevel and m_propagatedFrom fields. friend class WXDLLIMPEXP_FWD_BASE wxPropagateOnce; // and this one needs to access our m_handlerToProcessOnlyIn @@ -1072,26 +1115,35 @@ private: }; /* - * Another one to temporarily lower propagation level. + * Helper used to indicate that an event is propagated upwards the window + * hierarchy by the given window. */ class WXDLLIMPEXP_BASE wxPropagateOnce { public: - wxPropagateOnce(wxEvent& event) : m_event(event) + // The handler argument should normally be non-NULL to allow the parent + // event handler to know that it's being used to process an event coming + // from the child, it's only NULL by default for backwards compatibility. + wxPropagateOnce(wxEvent& event, wxEvtHandler* handler = NULL) + : m_event(event), + m_propagatedFromOld(event.m_propagatedFrom) { wxASSERT_MSG( m_event.m_propagationLevel > 0, wxT("shouldn't be used unless ShouldPropagate()!") ); m_event.m_propagationLevel--; + m_event.m_propagatedFrom = handler; } ~wxPropagateOnce() { + m_event.m_propagatedFrom = m_propagatedFromOld; m_event.m_propagationLevel++; } private: wxEvent& m_event; + wxEvtHandler* const m_propagatedFromOld; wxDECLARE_NO_COPY_CLASS(wxPropagateOnce); }; @@ -1244,7 +1296,7 @@ public: { // make sure our string member (which uses COW, aka refcounting) is not // shared by other wxString instances: - SetString(GetString().c_str()); + SetString(GetString().Clone()); } virtual wxEvent *Clone() const @@ -1262,26 +1314,217 @@ private: }; +// Asynchronous method call events: these event are processed by wxEvtHandler +// itself and result in a call to its Execute() method which simply calls the +// specified method. The difference with a simple method call is that this is +// done asynchronously, i.e. at some later time, instead of immediately when +// the event object is constructed. + +#ifdef wxHAS_CALL_AFTER + +// This is a base class used to process all method calls. +class wxAsyncMethodCallEvent : public wxEvent +{ +public: + wxAsyncMethodCallEvent(wxObject* object) + : wxEvent(wxID_ANY, wxEVT_ASYNC_METHOD_CALL) + { + SetEventObject(object); + } + + wxAsyncMethodCallEvent(const wxAsyncMethodCallEvent& other) + : wxEvent(other) + { + } + + virtual void Execute() = 0; +}; + +// This is a version for calling methods without parameters. +template +class wxAsyncMethodCallEvent0 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(); + + wxAsyncMethodCallEvent0(ObjectType* object, + MethodType method) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method) + { + } + + wxAsyncMethodCallEvent0(const wxAsyncMethodCallEvent0& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent0(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(); + } + +private: + ObjectType* const m_object; + const MethodType m_method; +}; + +// This is a version for calling methods with a single parameter. +template +class wxAsyncMethodCallEvent1 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(T1 x1); + typedef typename wxRemoveRef::type ParamType1; + + wxAsyncMethodCallEvent1(ObjectType* object, + MethodType method, + const ParamType1& x1) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method), + m_param1(x1) + { + } + + wxAsyncMethodCallEvent1(const wxAsyncMethodCallEvent1& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method), + m_param1(other.m_param1) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent1(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(m_param1); + } + +private: + ObjectType* const m_object; + const MethodType m_method; + const ParamType1 m_param1; +}; + +// This is a version for calling methods with two parameters. +template +class wxAsyncMethodCallEvent2 : public wxAsyncMethodCallEvent +{ +public: + typedef T ObjectType; + typedef void (ObjectType::*MethodType)(T1 x1, T2 x2); + typedef typename wxRemoveRef::type ParamType1; + typedef typename wxRemoveRef::type ParamType2; + + wxAsyncMethodCallEvent2(ObjectType* object, + MethodType method, + const ParamType1& x1, + const ParamType2& x2) + : wxAsyncMethodCallEvent(object), + m_object(object), + m_method(method), + m_param1(x1), + m_param2(x2) + { + } + + wxAsyncMethodCallEvent2(const wxAsyncMethodCallEvent2& other) + : wxAsyncMethodCallEvent(other), + m_object(other.m_object), + m_method(other.m_method), + m_param1(other.m_param1), + m_param2(other.m_param2) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEvent2(*this); + } + + virtual void Execute() + { + (m_object->*m_method)(m_param1, m_param2); + } + +private: + ObjectType* const m_object; + const MethodType m_method; + const ParamType1 m_param1; + const ParamType2 m_param2; +}; + +// This is a version for calling any functors +template +class wxAsyncMethodCallEventFunctor : public wxAsyncMethodCallEvent +{ +public: + typedef T FunctorType; + + wxAsyncMethodCallEventFunctor(wxObject *object, const FunctorType& fn) + : wxAsyncMethodCallEvent(object), + m_fn(fn) + { + } + + wxAsyncMethodCallEventFunctor(const wxAsyncMethodCallEventFunctor& other) + : wxAsyncMethodCallEvent(other), + m_fn(other.m_fn) + { + } + + virtual wxEvent *Clone() const + { + return new wxAsyncMethodCallEventFunctor(*this); + } + + virtual void Execute() + { + m_fn(); + } + +private: + FunctorType m_fn; +}; + +#endif // wxHAS_CALL_AFTER + + #if wxUSE_GUI // Item or menu event class /* - wxEVT_COMMAND_BUTTON_CLICKED - wxEVT_COMMAND_CHECKBOX_CLICKED - wxEVT_COMMAND_CHOICE_SELECTED - wxEVT_COMMAND_LISTBOX_SELECTED - wxEVT_COMMAND_LISTBOX_DOUBLECLICKED - wxEVT_COMMAND_TEXT_UPDATED - wxEVT_COMMAND_TEXT_ENTER - wxEVT_COMMAND_MENU_SELECTED - wxEVT_COMMAND_SLIDER_UPDATED - wxEVT_COMMAND_RADIOBOX_SELECTED - wxEVT_COMMAND_RADIOBUTTON_SELECTED - wxEVT_COMMAND_SCROLLBAR_UPDATED - wxEVT_COMMAND_VLBOX_SELECTED - wxEVT_COMMAND_COMBOBOX_SELECTED - wxEVT_COMMAND_TOGGLEBUTTON_CLICKED + wxEVT_BUTTON + wxEVT_CHECKBOX + wxEVT_CHOICE + wxEVT_LISTBOX + wxEVT_LISTBOX_DCLICK + wxEVT_TEXT + wxEVT_TEXT_ENTER + wxEVT_MENU + wxEVT_SLIDER + wxEVT_RADIOBOX + wxEVT_RADIOBUTTON + wxEVT_SCROLLBAR + wxEVT_VLBOX + wxEVT_COMBOBOX + wxEVT_TOGGLEBUTTON */ class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent, @@ -1295,7 +1538,12 @@ public: wxEventBasicPayloadMixin(event), m_clientData(event.m_clientData), m_clientObject(event.m_clientObject) - { } + { + // Because GetString() can retrieve the string text only on demand, we + // need to copy it explicitly. + if ( m_cmdString.empty() ) + m_cmdString = event.GetString(); + } // Set/Get client data from controls void SetClientData(void* clientData) { m_clientData = clientData; } @@ -1448,6 +1696,12 @@ private: wxEVT_RIGHT_DCLICK */ +enum wxMouseWheelAxis +{ + wxMOUSE_WHEEL_VERTICAL, + wxMOUSE_WHEEL_HORIZONTAL +}; + class WXDLLIMPEXP_CORE wxMouseEvent : public wxEvent, public wxMouseState { @@ -1535,15 +1789,19 @@ public: // should occur for each delta. int GetWheelDelta() const { return m_wheelDelta; } - // Gets the axis the wheel operation concerns, 0 being the y axis as on - // most mouse wheels, 1 is the x axis for things like MightyMouse scrolls - // or horizontal trackpad scrolling - int GetWheelAxis() const { return m_wheelAxis; } + // Gets the axis the wheel operation concerns; wxMOUSE_WHEEL_VERTICAL + // (most common case) or wxMOUSE_WHEEL_HORIZONTAL (for horizontal scrolling + // using e.g. a trackpad). + wxMouseWheelAxis GetWheelAxis() const { return m_wheelAxis; } // Returns the configured number of lines (or whatever) to be scrolled per - // wheel action. Defaults to one. + // wheel action. Defaults to three. int GetLinesPerAction() const { return m_linesPerAction; } + // Returns the configured number of columns (or whatever) to be scrolled per + // wheel action. Defaults to three. + int GetColumnsPerAction() const { return m_columnsPerAction; } + // Is the system set to do page scrolling? bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); } @@ -1560,10 +1818,11 @@ public: public: int m_clickCount; - int m_wheelAxis; + wxMouseWheelAxis m_wheelAxis; int m_wheelRotation; int m_wheelDelta; int m_linesPerAction; + int m_columnsPerAction; protected: void Assign(const wxMouseEvent& evt); @@ -1679,24 +1938,29 @@ public: // Find the position of the event void GetPosition(wxCoord *xpos, wxCoord *ypos) const { - if (xpos) *xpos = m_x; - if (ypos) *ypos = m_y; + if (xpos) + *xpos = GetX(); + if (ypos) + *ypos = GetY(); } + // This version if provided only for backwards compatiblity, don't use. void GetPosition(long *xpos, long *ypos) const { - if (xpos) *xpos = (long)m_x; - if (ypos) *ypos = (long)m_y; + if (xpos) + *xpos = GetX(); + if (ypos) + *ypos = GetY(); } wxPoint GetPosition() const - { return wxPoint(m_x, m_y); } + { return wxPoint(GetX(), GetY()); } // Get X position - wxCoord GetX() const { return m_x; } + wxCoord GetX() const; // Get Y position - wxCoord GetY() const { return m_y; } + wxCoord GetY() const; // Can be called from wxEVT_CHAR_HOOK handler to allow generation of normal // key events even though the event had been handled (by default they would @@ -1728,6 +1992,8 @@ public: } public: + // Do not use these fields directly, they are initialized on demand, so + // call GetX() and GetY() or GetPosition() instead. wxCoord m_x, m_y; long m_keyCode; @@ -1760,6 +2026,7 @@ private: { m_x = evt.m_x; m_y = evt.m_y; + m_hasPosition = evt.m_hasPosition; m_keyCode = evt.m_keyCode; @@ -1770,11 +2037,19 @@ private: #endif } + // Initialize m_x and m_y using the current mouse cursor position if + // necessary. + void InitPositionIfNecessary() const; + // If this flag is true, the normal key events should still be generated // even if wxEVT_CHAR_HOOK had been handled. By default it is false as // handling wxEVT_CHAR_HOOK suppresses all the subsequent events. bool m_allowNext; + // If true, m_x and m_y were already initialized. If false, try to get them + // when they're requested. + bool m_hasPosition; + DECLARE_DYNAMIC_CLASS(wxKeyEvent) }; @@ -2774,9 +3049,9 @@ private: // NOTE : under windows these events are *NOT* generated automatically // for a Rich Edit text control. /* -wxEVT_COMMAND_TEXT_COPY -wxEVT_COMMAND_TEXT_CUT -wxEVT_COMMAND_TEXT_PASTE +wxEVT_TEXT_COPY +wxEVT_TEXT_CUT +wxEVT_TEXT_PASTE */ class WXDLLIMPEXP_CORE wxClipboardTextEvent : public wxCommandEvent @@ -2991,7 +3266,7 @@ public: protected: // Init the hash table with the entries of the static event table. void InitHashTable(); - // Helper funtion of InitHashTable() to insert 1 entry into the hash table. + // Helper function of InitHashTable() to insert 1 entry into the hash table. void AddEntry(const wxEventTableEntry &entry); // Allocate and init with null pointers the base hash table. void AllocEventTypeTable(size_t size); @@ -3113,6 +3388,52 @@ public: // NOTE: uses AddPendingEvent(); call only from secondary threads #endif +#ifdef wxHAS_CALL_AFTER + // Asynchronous method calls: these methods schedule the given method + // pointer for a later call (during the next idle event loop iteration). + // + // Notice that the method is called on this object itself, so the object + // CallAfter() is called on must have the correct dynamic type. + // + // These method can be used from another thread. + + template + void CallAfter(void (T::*method)()) + { + QueueEvent( + new wxAsyncMethodCallEvent0(static_cast(this), method) + ); + } + + // Notice that we use P1 and not T1 for the parameter to allow passing + // parameters that are convertible to the type taken by the method + // instead of being exactly the same, to be closer to the usual method call + // semantics. + template + void CallAfter(void (T::*method)(T1 x1), P1 x1) + { + QueueEvent( + new wxAsyncMethodCallEvent1( + static_cast(this), method, x1) + ); + } + + template + void CallAfter(void (T::*method)(T1 x1, T2 x2), P1 x1, P2 x2) + { + QueueEvent( + new wxAsyncMethodCallEvent2( + static_cast(this), method, x1, x2) + ); + } + + template + void CallAfter(const T& fn) + { + QueueEvent(new wxAsyncMethodCallEventFunctor(this, fn)); + } +#endif // wxHAS_CALL_AFTER + // Connecting and disconnecting // ---------------------------- @@ -3975,33 +4296,33 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& #endif // WXWIN_COMPATIBILITY_2_6 // Convenience macros for commonly-used commands -#define EVT_CHECKBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKBOX_CLICKED, winid, wxCommandEventHandler(func)) -#define EVT_CHOICE(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICE_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_LISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOX_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_LISTBOX_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, winid, wxCommandEventHandler(func)) -#define EVT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_MENU_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_MENU_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_MENU_SELECTED, id1, id2, wxCommandEventHandler(func)) +#define EVT_CHECKBOX(winid, func) wx__DECLARE_EVT1(wxEVT_CHECKBOX, winid, wxCommandEventHandler(func)) +#define EVT_CHOICE(winid, func) wx__DECLARE_EVT1(wxEVT_CHOICE, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_LISTBOX, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_LISTBOX_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_MENU, winid, wxCommandEventHandler(func)) +#define EVT_MENU_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_MENU, id1, id2, wxCommandEventHandler(func)) #if defined(__SMARTPHONE__) # define EVT_BUTTON(winid, func) EVT_MENU(winid, func) #else -# define EVT_BUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_BUTTON_CLICKED, winid, wxCommandEventHandler(func)) +# define EVT_BUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_BUTTON, winid, wxCommandEventHandler(func)) #endif -#define EVT_SLIDER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SLIDER_UPDATED, winid, wxCommandEventHandler(func)) -#define EVT_RADIOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RADIOBOX_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_RADIOBUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RADIOBUTTON_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_SLIDER(winid, func) wx__DECLARE_EVT1(wxEVT_SLIDER, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_RADIOBOX, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_RADIOBUTTON, winid, wxCommandEventHandler(func)) // EVT_SCROLLBAR is now obsolete since we use EVT_COMMAND_SCROLL... events -#define EVT_SCROLLBAR(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SCROLLBAR_UPDATED, winid, wxCommandEventHandler(func)) -#define EVT_VLBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_VLBOX_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_COMBOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_SELECTED, winid, wxCommandEventHandler(func)) -#define EVT_TOOL(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_CLICKED, winid, wxCommandEventHandler(func)) -#define EVT_TOOL_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, winid, wxCommandEventHandler(func)) -#define EVT_TOOL_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_CLICKED, id1, id2, wxCommandEventHandler(func)) -#define EVT_TOOL_RCLICKED(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_RCLICKED, winid, wxCommandEventHandler(func)) -#define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) -#define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_ENTER, winid, wxCommandEventHandler(func)) -#define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, winid, wxCommandEventHandler(func)) -#define EVT_COMBOBOX_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_DROPDOWN, winid, wxCommandEventHandler(func)) -#define EVT_COMBOBOX_CLOSEUP(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_CLOSEUP, winid, wxCommandEventHandler(func)) +#define EVT_SCROLLBAR(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLLBAR, winid, wxCommandEventHandler(func)) +#define EVT_VLBOX(winid, func) wx__DECLARE_EVT1(wxEVT_VLBOX, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX, winid, wxCommandEventHandler(func)) +#define EVT_TOOL(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_TOOL, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_RCLICKED, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_TOOL_ENTER, winid, wxCommandEventHandler(func)) +#define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_CHECKLISTBOX, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_CLOSEUP(winid, func) wx__DECLARE_EVT1(wxEVT_COMBOBOX_CLOSEUP, winid, wxCommandEventHandler(func)) // Generic command events #define EVT_COMMAND_LEFT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_CLICK, winid, wxCommandEventHandler(func)) @@ -4044,14 +4365,12 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& #define EVT_COMMAND_CONTEXT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_CONTEXT_MENU, winid, wxContextMenuEventHandler(func)) // Clipboard text Events -#define EVT_TEXT_CUT(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_CUT, winid, wxClipboardTextEventHandler(func)) -#define EVT_TEXT_COPY(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_COPY, winid, wxClipboardTextEventHandler(func)) -#define EVT_TEXT_PASTE(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_PASTE, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_CUT(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_CUT, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_COPY(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_COPY, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_PASTE(winid, func) wx__DECLARE_EVT1(wxEVT_TEXT_PASTE, winid, wxClipboardTextEventHandler(func)) // Thread events #define EVT_THREAD(id, func) wx__DECLARE_EVT1(wxEVT_THREAD, id, wxThreadEventHandler(func)) -// alias for backward compatibility with 2.9.0: -#define wxEVT_COMMAND_THREAD wxEVT_THREAD // ---------------------------------------------------------------------------- // Helper functions @@ -4115,11 +4434,11 @@ WXDLLIMPEXP_CORE wxWindow* wxFindFocusDescendant(wxWindow* ancestor); #define DECLARE_EVENT_TABLE() wxDECLARE_EVENT_TABLE(); #define BEGIN_EVENT_TABLE(a,b) wxBEGIN_EVENT_TABLE(a,b) #define BEGIN_EVENT_TABLE_TEMPLATE1(a,b,c) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c) -#define BEGIN_EVENT_TABLE_TEMPLATE2(a,b,c,d) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c,d) -#define BEGIN_EVENT_TABLE_TEMPLATE3(a,b,c,d,e) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c,d,e) -#define BEGIN_EVENT_TABLE_TEMPLATE4(a,b,c,d,e,f) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c,d,e,f) -#define BEGIN_EVENT_TABLE_TEMPLATE5(a,b,c,d,e,f,g) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c,d,e,f,g) -#define BEGIN_EVENT_TABLE_TEMPLATE6(a,b,c,d,e,f,g,h) wxBEGIN_EVENT_TABLE_TEMPLATE1(a,b,c,d,e,f,g,h) +#define BEGIN_EVENT_TABLE_TEMPLATE2(a,b,c,d) wxBEGIN_EVENT_TABLE_TEMPLATE2(a,b,c,d) +#define BEGIN_EVENT_TABLE_TEMPLATE3(a,b,c,d,e) wxBEGIN_EVENT_TABLE_TEMPLATE3(a,b,c,d,e) +#define BEGIN_EVENT_TABLE_TEMPLATE4(a,b,c,d,e,f) wxBEGIN_EVENT_TABLE_TEMPLATE4(a,b,c,d,e,f) +#define BEGIN_EVENT_TABLE_TEMPLATE5(a,b,c,d,e,f,g) wxBEGIN_EVENT_TABLE_TEMPLATE5(a,b,c,d,e,f,g) +#define BEGIN_EVENT_TABLE_TEMPLATE6(a,b,c,d,e,f,g,h) wxBEGIN_EVENT_TABLE_TEMPLATE6(a,b,c,d,e,f,g,h) #define END_EVENT_TABLE() wxEND_EVENT_TABLE() // other obsolete event declaration/definition macros; we don't need them any longer @@ -4135,4 +4454,31 @@ WXDLLIMPEXP_CORE wxWindow* wxFindFocusDescendant(wxWindow* ancestor); #define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType(); #define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name) +// alias for backward compatibility with 2.9.0: +#define wxEVT_COMMAND_THREAD wxEVT_THREAD +// other old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_BUTTON_CLICKED wxEVT_BUTTON +#define wxEVT_COMMAND_CHECKBOX_CLICKED wxEVT_CHECKBOX +#define wxEVT_COMMAND_CHOICE_SELECTED wxEVT_CHOICE +#define wxEVT_COMMAND_LISTBOX_SELECTED wxEVT_LISTBOX +#define wxEVT_COMMAND_LISTBOX_DOUBLECLICKED wxEVT_LISTBOX_DCLICK +#define wxEVT_COMMAND_CHECKLISTBOX_TOGGLED wxEVT_CHECKLISTBOX +#define wxEVT_COMMAND_MENU_SELECTED wxEVT_MENU +#define wxEVT_COMMAND_TOOL_CLICKED wxEVT_TOOL +#define wxEVT_COMMAND_SLIDER_UPDATED wxEVT_SLIDER +#define wxEVT_COMMAND_RADIOBOX_SELECTED wxEVT_RADIOBOX +#define wxEVT_COMMAND_RADIOBUTTON_SELECTED wxEVT_RADIOBUTTON +#define wxEVT_COMMAND_SCROLLBAR_UPDATED wxEVT_SCROLLBAR +#define wxEVT_COMMAND_VLBOX_SELECTED wxEVT_VLBOX +#define wxEVT_COMMAND_COMBOBOX_SELECTED wxEVT_COMBOBOX +#define wxEVT_COMMAND_TOOL_RCLICKED wxEVT_TOOL_RCLICKED +#define wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED wxEVT_TOOL_DROPDOWN +#define wxEVT_COMMAND_TOOL_ENTER wxEVT_TOOL_ENTER +#define wxEVT_COMMAND_COMBOBOX_DROPDOWN wxEVT_COMBOBOX_DROPDOWN +#define wxEVT_COMMAND_COMBOBOX_CLOSEUP wxEVT_COMBOBOX_CLOSEUP +#define wxEVT_COMMAND_TEXT_COPY wxEVT_TEXT_COPY +#define wxEVT_COMMAND_TEXT_CUT wxEVT_TEXT_CUT +#define wxEVT_COMMAND_TEXT_PASTE wxEVT_TEXT_PASTE +#define wxEVT_COMMAND_TEXT_UPDATED wxEVT_TEXT + #endif // _WX_EVENT_H_ diff --git a/Externals/wxWidgets3/include/wx/eventfilter.h b/Externals/wxWidgets3/include/wx/eventfilter.h index 5a110cb7c5..30eac4d363 100644 --- a/Externals/wxWidgets3/include/wx/eventfilter.h +++ b/Externals/wxWidgets3/include/wx/eventfilter.h @@ -3,7 +3,6 @@ // Purpose: wxEventFilter class declaration. // Author: Vadim Zeitlin // Created: 2011-11-21 -// RCS-ID: $Id: eventfilter.h 70302 2012-01-09 14:04:25Z DS $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/evtloop.h b/Externals/wxWidgets3/include/wx/evtloop.h index 97a3548d8e..8dd5d6eb7b 100644 --- a/Externals/wxWidgets3/include/wx/evtloop.h +++ b/Externals/wxWidgets3/include/wx/evtloop.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 01.06.01 -// RCS-ID: $Id: evtloop.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,7 @@ // TODO: implement wxEventLoopSource for MSW (it should wrap a HANDLE and be // monitored using MsgWaitForMultipleObjects()) -#if defined(__WXOSX__) || (defined(__UNIX__) && !defined(__CYGWIN__)) +#if defined(__WXOSX__) || (defined(__UNIX__) && !defined(__WXMSW__)) #define wxUSE_EVENTLOOP_SOURCE 1 #else #define wxUSE_EVENTLOOP_SOURCE 0 @@ -79,16 +78,19 @@ public: #if wxUSE_EVENTLOOP_SOURCE // create a new event loop source wrapping the given file descriptor and - // start monitoring it - virtual wxEventLoopSource * - AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags) = 0; + // monitor it for events occurring on this descriptor in all event loops + static wxEventLoopSource * + AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); #endif // wxUSE_EVENTLOOP_SOURCE // dispatch&processing // ------------------- // start the event loop, return the exit code when it is finished - virtual int Run() = 0; + // + // notice that wx ports should override DoRun(), this method is virtual + // only to allow overriding it in the user code for custom event loops + virtual int Run(); // is this event loop running now? // @@ -97,7 +99,15 @@ public: bool IsRunning() const; // exit from the loop with the given exit code - virtual void Exit(int rc = 0) = 0; + // + // this can be only used to exit the currently running loop, use + // ScheduleExit() if this might not be the case + virtual void Exit(int rc = 0); + + // ask the event loop to exit with the given exit code, can be used even if + // this loop is not running right now but the loop must have been started, + // i.e. Run() should have been already called + virtual void ScheduleExit(int rc = 0) = 0; // return true if any events are available virtual bool Pending() const = 0; @@ -169,22 +179,38 @@ public: protected: + // real implementation of Run() + virtual int DoRun() = 0; + // this function should be called before the event loop terminates, whether // this happens normally (because of Exit() call) or abnormally (because of // an exception thrown from inside the loop) virtual void OnExit(); + // Return true if we're currently inside our Run(), even if another nested + // event loop is currently running, unlike IsRunning() (which should have + // been really called IsActive() but it's too late to change this now). + bool IsInsideRun() const { return m_isInsideRun; } + + // the pointer to currently active loop static wxEventLoopBase *ms_activeLoop; + // should we exit the loop? + bool m_shouldExit; + // YieldFor() helpers: bool m_isInsideYield; long m_eventsToProcessInsideYield; +private: + // this flag is set on entry into Run() and reset before leaving it + bool m_isInsideRun; + wxDECLARE_NO_COPY_CLASS(wxEventLoopBase); }; -#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !defined(__WXOSX__)) +#if defined(__WINDOWS__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !defined(__WXOSX__)) // this class can be used to implement a standard event loop logic using // Pending() and Dispatch() @@ -195,15 +221,15 @@ class WXDLLIMPEXP_BASE wxEventLoopManual : public wxEventLoopBase public: wxEventLoopManual(); - // enters a loop calling OnNextIteration(), Pending() and Dispatch() and - // terminating when Exit() is called - virtual int Run(); - // sets the "should exit" flag and wakes up the loop so that it terminates // soon - virtual void Exit(int rc = 0); + virtual void ScheduleExit(int rc = 0); protected: + // enters a loop calling OnNextIteration(), Pending() and Dispatch() and + // terminating when Exit() is called + virtual int DoRun(); + // may be overridden to perform some action at the start of each new event // loop iteration virtual void OnNextIteration() { } @@ -212,9 +238,6 @@ protected: // the loop exit code int m_exitcode; - // should we exit the loop? - bool m_shouldExit; - private: // process all already pending events and dispatch a new one (blocking // until it appears in the event queue if necessary) @@ -233,19 +256,29 @@ private: // integration with MFC) but currently this is not done for all ports yet (e.g. // wxX11) so fall back to the old wxGUIEventLoop definition below for them -#if defined(__WXMSW__) - // this header defines both console and GUI loops for MSW - #include "wx/msw/evtloop.h" -#elif defined(__WXOSX__) +#if defined(__DARWIN__) // CoreFoundation-based event loop is currently in wxBase so include it in // any case too (although maybe it actually shouldn't be there at all) - #include "wx/osx/evtloop.h" -#elif wxUSE_GUI + #include "wx/osx/core/evtloop.h" +#endif + +// include the header defining wxConsoleEventLoop +#if defined(__UNIX__) && !defined(__WXMSW__) + #include "wx/unix/evtloop.h" +#elif defined(__WINDOWS__) + #include "wx/msw/evtloopconsole.h" +#endif + +#if wxUSE_GUI // include the appropriate header defining wxGUIEventLoop -#if defined(__WXCOCOA__) +#if defined(__WXMSW__) + #include "wx/msw/evtloop.h" +#elif defined(__WXCOCOA__) #include "wx/cocoa/evtloop.h" +#elif defined(__WXOSX__) + #include "wx/osx/evtloop.h" #elif defined(__WXDFB__) #include "wx/dfb/evtloop.h" #elif defined(__WXGTK20__) @@ -262,21 +295,7 @@ public: wxGUIEventLoop() { m_impl = NULL; } virtual ~wxGUIEventLoop(); -#if wxUSE_EVENTLOOP_SOURCE - // We need to define a base class pure virtual method but we can't provide - // a generic implementation for it so simply fail. - virtual wxEventLoopSource * - AddSourceForFD(int WXUNUSED(fd), - wxEventLoopSourceHandler * WXUNUSED(handler), - int WXUNUSED(flags)) - { - wxFAIL_MSG( "support for event loop sources not implemented" ); - return NULL; - } -#endif // wxUSE_EVENTLOOP_SOURCE - - virtual int Run(); - virtual void Exit(int rc = 0); + virtual void ScheduleExit(int rc = 0); virtual bool Pending() const; virtual bool Dispatch(); virtual int DispatchTimeout(unsigned long timeout) @@ -297,6 +316,8 @@ public: virtual bool YieldFor(long eventsToProcess); protected: + virtual int DoRun(); + // the pointer to the port specific implementation class wxEventLoopImpl *m_impl; @@ -307,11 +328,6 @@ protected: #endif // wxUSE_GUI -// include the header defining wxConsoleEventLoop for Unix systems -#if defined(__UNIX__) && !defined(__CYGWIN__) -#include "wx/unix/evtloop.h" -#endif - #if wxUSE_GUI // we use a class rather than a typedef because wxEventLoop is // forward-declared in many places @@ -319,7 +335,7 @@ protected: #else // !wxUSE_GUI // we can't define wxEventLoop differently in GUI and base libraries so use // a #define to still allow writing wxEventLoop in the user code - #if wxUSE_CONSOLE_EVENTLOOP && (defined(__WXMSW__) || defined(__UNIX__)) + #if wxUSE_CONSOLE_EVENTLOOP && (defined(__WINDOWS__) || defined(__UNIX__)) #define wxEventLoop wxConsoleEventLoop #else // we still must define it somehow for the code below... #define wxEventLoop wxEventLoopBase diff --git a/Externals/wxWidgets3/include/wx/evtloopsrc.h b/Externals/wxWidgets3/include/wx/evtloopsrc.h index 20d8770b76..cb3e5c6a90 100644 --- a/Externals/wxWidgets3/include/wx/evtloopsrc.h +++ b/Externals/wxWidgets3/include/wx/evtloopsrc.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxEventLoopSource class // Author: Vadim Zeitlin // Created: 2009-10-21 -// RCS-ID: $Id: evtloopsrc.h 69559 2011-10-27 21:10:30Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,6 +10,9 @@ #ifndef _WX_EVTLOOPSRC_H_ #define _WX_EVTLOOPSRC_H_ +// Include the header to get wxUSE_EVENTLOOP_SOURCE definition from it. +#include "wx/evtloop.h" + // ---------------------------------------------------------------------------- // wxEventLoopSource: a source of events which may be added to wxEventLoop // ---------------------------------------------------------------------------- @@ -89,9 +91,11 @@ inline wxEventLoopSource::~wxEventLoopSource() { } #if defined(__WXGTK20__) #include "wx/gtk/evtloopsrc.h" -#elif defined(__WXOSX__) +#endif + +#if defined(__DARWIN__) #include "wx/osx/evtloopsrc.h" -#endif // platform +#endif #endif // wxUSE_EVENTLOOP_SOURCE diff --git a/Externals/wxWidgets3/include/wx/except.h b/Externals/wxWidgets3/include/wx/except.h index aecf1594c6..75589163e3 100644 --- a/Externals/wxWidgets3/include/wx/except.h +++ b/Externals/wxWidgets3/include/wx/except.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 17.09.2003 -// RCS-ID: $Id: except.h 64993 2010-07-17 11:55:10Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fdrepdlg.h b/Externals/wxWidgets3/include/wx/fdrepdlg.h index ad433cb2c2..709dcb156b 100644 --- a/Externals/wxWidgets3/include/wx/fdrepdlg.h +++ b/Externals/wxWidgets3/include/wx/fdrepdlg.h @@ -4,7 +4,6 @@ // Author: Markus Greither and Vadim Zeitlin // Modified by: // Created: 23/03/2001 -// RCS-ID: $Id: fdrepdlg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Markus Greither // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -67,8 +66,8 @@ public: wxFindReplaceData(wxUint32 flags) { Init(); SetFlags(flags); } // accessors - const wxString& GetFindString() { return m_FindWhat; } - const wxString& GetReplaceString() { return m_ReplaceWith; } + const wxString& GetFindString() const { return m_FindWhat; } + const wxString& GetReplaceString() const { return m_ReplaceWith; } int GetFlags() const { return m_Flags; } @@ -165,11 +164,11 @@ private: DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFindDialogEvent) }; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FIND, wxFindDialogEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FIND_NEXT, wxFindDialogEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FIND_REPLACE, wxFindDialogEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FIND_REPLACE_ALL, wxFindDialogEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FIND_CLOSE, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_NEXT, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_REPLACE, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_REPLACE_ALL, wxFindDialogEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FIND_CLOSE, wxFindDialogEvent ); typedef void (wxEvtHandler::*wxFindDialogEventFunction)(wxFindDialogEvent&); @@ -177,19 +176,26 @@ typedef void (wxEvtHandler::*wxFindDialogEventFunction)(wxFindDialogEvent&); wxEVENT_HANDLER_CAST(wxFindDialogEventFunction, func) #define EVT_FIND(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FIND, id, wxFindDialogEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FIND, id, wxFindDialogEventHandler(fn)) #define EVT_FIND_NEXT(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_NEXT, id, wxFindDialogEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FIND_NEXT, id, wxFindDialogEventHandler(fn)) #define EVT_FIND_REPLACE(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_REPLACE, id, wxFindDialogEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FIND_REPLACE, id, wxFindDialogEventHandler(fn)) #define EVT_FIND_REPLACE_ALL(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_REPLACE_ALL, id, wxFindDialogEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FIND_REPLACE_ALL, id, wxFindDialogEventHandler(fn)) #define EVT_FIND_CLOSE(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_CLOSE, id, wxFindDialogEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FIND_CLOSE, id, wxFindDialogEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FIND wxEVT_FIND +#define wxEVT_COMMAND_FIND_NEXT wxEVT_FIND_NEXT +#define wxEVT_COMMAND_FIND_REPLACE wxEVT_FIND_REPLACE +#define wxEVT_COMMAND_FIND_REPLACE_ALL wxEVT_FIND_REPLACE_ALL +#define wxEVT_COMMAND_FIND_CLOSE wxEVT_FIND_CLOSE #endif // wxUSE_FINDREPLDLG diff --git a/Externals/wxWidgets3/include/wx/features.h b/Externals/wxWidgets3/include/wx/features.h index 0d8469917b..84a6c35c9d 100644 --- a/Externals/wxWidgets3/include/wx/features.h +++ b/Externals/wxWidgets3/include/wx/features.h @@ -5,7 +5,6 @@ * Author: Vadim Zeitlin * Modified by: Ryan Norton (Converted to C) * Created: 18.03.02 -* RCS-ID: $Id: features.h 69961 2011-12-08 15:58:45Z VZ $ * Copyright: (c) 2002 Vadim Zeitlin * Licence: wxWindows licence */ diff --git a/Externals/wxWidgets3/include/wx/ffile.h b/Externals/wxWidgets3/include/wx/ffile.h index a3c457fb9e..91a7c28ed4 100644 --- a/Externals/wxWidgets3/include/wx/ffile.h +++ b/Externals/wxWidgets3/include/wx/ffile.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 14.07.99 -// RCS-ID: $Id: ffile.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -50,7 +49,7 @@ public: // assign an existing file descriptor and get it back from wxFFile object void Attach(FILE *lfp, const wxString& name = wxEmptyString) { Close(); m_fp = lfp; m_name = name; } - void Detach() { m_fp = NULL; } + FILE* Detach() { FILE* fpOld = m_fp; m_fp = NULL; return fpOld; } FILE *fp() const { return m_fp; } // read/write (unbuffered) diff --git a/Externals/wxWidgets3/include/wx/file.h b/Externals/wxWidgets3/include/wx/file.h index 7fa7377c6d..00ac471abf 100644 --- a/Externals/wxWidgets3/include/wx/file.h +++ b/Externals/wxWidgets3/include/wx/file.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: file.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,7 +18,7 @@ #include "wx/string.h" #include "wx/filefn.h" -#include "wx/strconv.h" +#include "wx/convauto.h" // ---------------------------------------------------------------------------- // class wxFile: raw file IO @@ -66,16 +65,18 @@ public: // assign an existing file descriptor and get it back from wxFile object void Attach(int lfd) { Close(); m_fd = lfd; m_lasterror = 0; } - void Detach() { m_fd = fd_invalid; } + int Detach() { int fdOld = m_fd; m_fd = fd_invalid; return fdOld; } int fd() const { return m_fd; } // read/write (unbuffered) + // read all data from the file into a string (useful for text files) + bool ReadAll(wxString *str, const wxMBConv& conv = wxConvAuto()); // returns number of bytes read or wxInvalidOffset on error ssize_t Read(void *pBuf, size_t nCount); // returns the number of bytes written size_t Write(const void *pBuf, size_t nCount); // returns true on success - bool Write(const wxString& s, const wxMBConv& conv = wxMBConvUTF8()); + bool Write(const wxString& s, const wxMBConv& conv = wxConvAuto()); // flush data not yet written bool Flush(); diff --git a/Externals/wxWidgets3/include/wx/fileconf.h b/Externals/wxWidgets3/include/wx/fileconf.h index ab8e78dc96..c16129a5b1 100644 --- a/Externals/wxWidgets3/include/wx/fileconf.h +++ b/Externals/wxWidgets3/include/wx/fileconf.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07.04.98 (adapted from appconf.cpp) -// RCS-ID: $Id: fileconf.h 60643 2009-05-15 18:02:41Z VZ $ // Copyright: (c) 1997 Karsten Ballueder & Vadim Zeitlin // Ballueder@usa.net // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/filectrl.h b/Externals/wxWidgets3/include/wx/filectrl.h index 157009ec13..e4c302f7d5 100644 --- a/Externals/wxWidgets3/include/wx/filectrl.h +++ b/Externals/wxWidgets3/include/wx/filectrl.h @@ -5,7 +5,6 @@ // Author: Diaa M. Sami // Modified by: // Created: Jul-07-2007 -// RCS-ID: $Id: filectrl.h 64429 2010-05-29 10:35:47Z VZ $ // Copyright: (c) Diaa M. Sami // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/filedlg.h b/Externals/wxWidgets3/include/wx/filedlg.h index 45178d2d43..d105493cc2 100644 --- a/Externals/wxWidgets3/include/wx/filedlg.h +++ b/Externals/wxWidgets3/include/wx/filedlg.h @@ -5,7 +5,6 @@ // Modified by: // Created: 8/17/99 // Copyright: (c) Robert Roebling -// RCS-ID: $Id: filedlg.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -122,6 +121,9 @@ public: virtual wxString GetWildcard() const { return m_wildCard; } virtual int GetFilterIndex() const { return m_filterIndex; } + virtual wxString GetCurrentlySelectedFilename() const + { return m_currentlySelectedFilename; } + // this function is called with wxFileDialog as parameter and should // create the window containing the extra controls we want to show in it typedef wxWindow *(*ExtraControlCreatorFunction)(wxWindow*); @@ -155,6 +157,13 @@ protected: wxString m_fileName; wxString m_wildCard; int m_filterIndex; + + // Currently selected, but not yet necessarily accepted by the user, file. + // This should be updated whenever the selection in the control changes by + // the platform-specific code to provide a useful implementation of + // GetCurrentlySelectedFilename(). + wxString m_currentlySelectedFilename; + wxWindow* m_extraControl; // returns true if control is created (if it already exists returns false) diff --git a/Externals/wxWidgets3/include/wx/filefn.h b/Externals/wxWidgets3/include/wx/filefn.h index ebd0c373c4..a5bcd7e3fc 100644 --- a/Externals/wxWidgets3/include/wx/filefn.h +++ b/Externals/wxWidgets3/include/wx/filefn.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: filefn.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -22,22 +21,9 @@ #include #endif -#ifdef __WXWINCE__ -// Nothing -#elif !defined(__MWERKS__) +#ifndef __WXWINCE__ #include #include -#else - #ifdef __MACH__ - #include - #include - #include - #include - #else - #include - #include - #include - #endif #endif #ifdef __OS2__ @@ -58,7 +44,7 @@ #endif #if defined(__WINDOWS__) && !defined(__WXMICROWIN__) -#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__WXWINCE__) && !defined(__CYGWIN__) +#if !defined( __GNUWIN32__ ) && !defined(__WXWINCE__) && !defined(__CYGWIN__) #include #include #include @@ -91,7 +77,7 @@ // constants // ---------------------------------------------------------------------------- -#if defined(__VISUALC__) || defined(__DIGITALMARS__) +#if defined(__VISUALC__) || defined(__INTELC__) || defined(__DIGITALMARS__) typedef int mode_t; #endif @@ -106,12 +92,10 @@ #endif #endif -#if (defined(__VISUALC__) && !defined(__WXWINCE__)) || ( defined(__MWERKS__) && defined( __INTEL__) ) +#if defined(__VISUALC__) && !defined(__WXWINCE__) typedef _off_t off_t; #elif defined(__SYMANTEC__) typedef long off_t; -#elif defined(__MWERKS__) && !defined(__INTEL__) && !defined(__MACH__) - typedef long off_t; #endif enum wxSeekMode @@ -186,6 +170,7 @@ enum wxPosixPermissions #define wxFileOffsetFmtSpec wxT("I64") WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode)); WXDLLIMPEXP_BASE int wxCRT_Access(const wxChar *name, int WXUNUSED(how)); + WXDLLIMPEXP_BASE int wxCRT_Chmod(const wxChar *name, int WXUNUSED(how)); WXDLLIMPEXP_BASE int wxClose(int fd); WXDLLIMPEXP_BASE int wxFsync(int WXUNUSED(fd)); WXDLLIMPEXP_BASE int wxRead(int fd, void *buf, unsigned int count); @@ -206,7 +191,6 @@ enum wxPosixPermissions defined(__MINGW64__) || \ (defined(__MINGW32__) && !defined(__WINE__) && \ wxCHECK_W32API_VERSION(0, 5)) || \ - defined(__MWERKS__) || \ defined(__DMC__) || \ defined(__WATCOMC__) || \ defined(__BORLANDC__) \ @@ -236,9 +220,8 @@ enum wxPosixPermissions #define wxFtell ftello64 #endif - // other Windows compilers (DMC, Watcom, Metrowerks and Borland) don't have - // huge file support (or at least not all functions needed for it by wx) - // currently + // other Windows compilers (DMC, Watcom, and Borland) don't have huge file + // support (or at least not all functions needed for it by wx) currently // types @@ -309,20 +292,8 @@ enum wxPosixPermissions // complications #define wxClose wxPOSIX_IDENT(close) - #if defined(__MWERKS__) - #if __MSL__ >= 0x6000 - #define wxRead(fd, buf, nCount) _read(fd, (void *)buf, nCount) - #define wxWrite(fd, buf, nCount) _write(fd, (void *)buf, nCount) - #else - #define wxRead(fd, buf, nCount)\ - _read(fd, (const char *)buf, nCount) - #define wxWrite(fd, buf, nCount)\ - _write(fd, (const char *)buf, nCount) - #endif - #else // __MWERKS__ - #define wxRead wxPOSIX_IDENT(read) - #define wxWrite wxPOSIX_IDENT(write) - #endif + #define wxRead wxPOSIX_IDENT(read) + #define wxWrite wxPOSIX_IDENT(write) #ifdef wxHAS_HUGE_FILES #ifndef __MINGW64__ @@ -360,6 +331,7 @@ enum wxPosixPermissions // first the ANSI versions #define wxCRT_OpenA wxPOSIX_IDENT(open) #define wxCRT_AccessA wxPOSIX_IDENT(access) + #define wxCRT_ChmodA wxPOSIX_IDENT(chmod) #define wxCRT_MkDirA wxPOSIX_IDENT(mkdir) #define wxCRT_RmDirA wxPOSIX_IDENT(rmdir) #ifdef wxHAS_HUGE_FILES @@ -391,6 +363,7 @@ enum wxPosixPermissions #endif #define wxCRT_AccessW _waccess + #define wxCRT_ChmodW _wchmod #define wxCRT_MkDirW _wmkdir #define wxCRT_RmDirW _wrmdir #ifdef wxHAS_HUGE_FILES @@ -409,6 +382,8 @@ enum wxPosixPermissions int flags, int mode); WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name, int mode); + WXDLLIMPEXP_BASE int wxMSLU__wchmod(const wxChar *name, + int mode); WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name); WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name); @@ -418,12 +393,14 @@ enum wxPosixPermissions #define wxCRT_Open wxMSLU__wopen #define wxCRT_Access wxMSLU__waccess + #define wxCRT_Chmod wxMSLU__wchmod #define wxCRT_MkDir wxMSLU__wmkdir #define wxCRT_RmDir wxMSLU__wrmdir #define wxCRT_Stat wxMSLU__wstat #else // !wxUSE_UNICODE_MSLU #define wxCRT_Open wxCRT_OpenW #define wxCRT_Access wxCRT_AccessW + #define wxCRT_Chmod wxCRT_ChmodW #define wxCRT_MkDir wxCRT_MkDirW #define wxCRT_RmDir wxCRT_RmDirW #define wxCRT_Stat wxCRT_StatW @@ -431,6 +408,7 @@ enum wxPosixPermissions #else // !wxUSE_UNICODE #define wxCRT_Open wxCRT_OpenA #define wxCRT_Access wxCRT_AccessA + #define wxCRT_Chmod wxCRT_ChmodA #define wxCRT_MkDir wxCRT_MkDirA #define wxCRT_RmDir wxCRT_RmDirA #define wxCRT_Stat wxCRT_StatA @@ -510,6 +488,7 @@ enum wxPosixPermissions #define wxCRT_Stat stat #define wxCRT_Lstat lstat #define wxCRT_Access access + #define wxCRT_Chmod chmod #define wxHAS_NATIVE_LSTAT #endif // platforms @@ -531,6 +510,8 @@ enum wxPosixPermissions inline int wxAccess(const wxString& path, mode_t mode) { return wxCRT_Access(path.fn_str(), mode); } +inline int wxChmod(const wxString& path, mode_t mode) + { return wxCRT_Chmod(path.fn_str(), mode); } inline int wxOpen(const wxString& path, int flags, mode_t mode) { return wxCRT_Open(path.fn_str(), flags, mode); } diff --git a/Externals/wxWidgets3/include/wx/filehistory.h b/Externals/wxWidgets3/include/wx/filehistory.h index 83afeaa3ec..b6cb1cb501 100644 --- a/Externals/wxWidgets3/include/wx/filehistory.h +++ b/Externals/wxWidgets3/include/wx/filehistory.h @@ -3,7 +3,6 @@ // Purpose: wxFileHistory class // Author: Julian Smart, Vaclav Slavik // Created: 2010-05-03 -// RCS-ID: $Id: filehistory.h 70503 2012-02-03 17:27:13Z VZ $ // Copyright: (c) Julian Smart, Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/filename.h b/Externals/wxWidgets3/include/wx/filename.h index e1454406b7..1a16e14050 100644 --- a/Externals/wxWidgets3/include/wx/filename.h +++ b/Externals/wxWidgets3/include/wx/filename.h @@ -4,7 +4,6 @@ // Author: Robert Roebling, Vadim Zeitlin // Modified by: // Created: 28.12.00 -// RCS-ID: $Id: filename.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2000 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,17 +11,6 @@ #ifndef _WX_FILENAME_H_ #define _WX_FILENAME_H_ -/* - TODO: - - 1. support for drives under Windows - 2. more file operations: - a) chmod() - b) [acm]time() - get and set - c) rename()? - 3. SameFileAs() function to compare inodes under Unix - */ - #include "wx/arrstr.h" #include "wx/filefn.h" #include "wx/datetime.h" @@ -108,6 +96,22 @@ enum wxPATH_RMDIR_RECURSIVE = 0x0002 // delete all recursively (dangerous!) }; +// FileExists flags +enum +{ + wxFILE_EXISTS_REGULAR = 0x0001, // check for existence of a regular file + wxFILE_EXISTS_DIR = 0x0002, // check for existence of a directory + wxFILE_EXISTS_SYMLINK = 0x1004, // check for existence of a symbolic link; + // also sets wxFILE_EXISTS_NO_FOLLOW as + // it would never be satisfied otherwise + wxFILE_EXISTS_DEVICE = 0x0008, // check for existence of a device + wxFILE_EXISTS_FIFO = 0x0016, // check for existence of a FIFO + wxFILE_EXISTS_SOCKET = 0x0032, // check for existence of a socket + // gap for future types + wxFILE_EXISTS_NO_FOLLOW = 0x1000, // don't dereference a contained symlink + wxFILE_EXISTS_ANY = 0x1FFF // check for existence of anything +}; + #if wxUSE_LONGLONG // error code of wxFileName::GetSize() extern WXDLLIMPEXP_DATA_BASE(const wxULongLong) wxInvalidSize; @@ -132,13 +136,13 @@ public: // is contructed (the name will be empty), otherwise a file name and // extension are extracted from it wxFileName( const wxString& fullpath, wxPathFormat format = wxPATH_NATIVE ) - { Assign( fullpath, format ); } + { Assign( fullpath, format ); m_dontFollowLinks = false; } // from a directory name and a file name wxFileName(const wxString& path, const wxString& name, wxPathFormat format = wxPATH_NATIVE) - { Assign(path, name, format); } + { Assign(path, name, format); m_dontFollowLinks = false; } // from a volume, directory name, file base name and extension wxFileName(const wxString& volume, @@ -146,14 +150,14 @@ public: const wxString& name, const wxString& ext, wxPathFormat format = wxPATH_NATIVE) - { Assign(volume, path, name, ext, format); } + { Assign(volume, path, name, ext, format); m_dontFollowLinks = false; } // from a directory name, file base name and extension wxFileName(const wxString& path, const wxString& name, const wxString& ext, wxPathFormat format = wxPATH_NATIVE) - { Assign(path, name, ext, format); } + { Assign(path, name, ext, format); m_dontFollowLinks = false; } // the same for delayed initialization @@ -224,8 +228,8 @@ public: // does anything at all with this name (i.e. file, directory or some // other file system object such as a device, socket, ...) exist? - bool Exists() const { return Exists(GetFullPath()); } - static bool Exists(const wxString& path); + bool Exists(int flags = wxFILE_EXISTS_ANY) const; + static bool Exists(const wxString& path, int flags = wxFILE_EXISTS_ANY); // checks on most common flags for files/directories; @@ -250,6 +254,10 @@ public: bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); } static bool IsFileExecutable(const wxString &path) { return wxFileExists(path) && wxIsExecutable(path); } + // set the file permissions to a combination of wxPosixPermissions enum + // values + bool SetPermissions(int permissions); + // time functions #if wxUSE_DATETIME @@ -367,6 +375,26 @@ public: { return Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE | wxPATH_NORM_TILDE, cwd, format); } + + // If the path is a symbolic link (Unix-only), indicate that all + // filesystem operations on this path should be performed on the link + // itself and not on the file it points to, as is the case by default. + // + // No effect if this is not a symbolic link. + void DontFollowLink() + { + m_dontFollowLinks = true; + } + + // If the path is a symbolic link (Unix-only), returns whether various + // file operations should act on the link itself, or on its target. + // + // This does not test if the path is really a symlink or not. + bool ShouldFollowLink() const + { + return !m_dontFollowLinks; + } + #if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE // if the path is a shortcut, return the target and optionally, // the arguments @@ -454,16 +482,16 @@ public: // Dir accessors size_t GetDirCount() const { return m_dirs.size(); } - void AppendDir(const wxString& dir); + bool AppendDir(const wxString& dir); void PrependDir(const wxString& dir); - void InsertDir(size_t before, const wxString& dir); + bool InsertDir(size_t before, const wxString& dir); void RemoveDir(size_t pos); void RemoveLastDir() { RemoveDir(GetDirCount() - 1); } // Other accessors void SetExt( const wxString &ext ) { m_ext = ext; m_hasExt = !m_ext.empty(); } - void ClearExt() { m_ext = wxEmptyString; m_hasExt = false; } - void SetEmptyExt() { m_ext = wxT(""); m_hasExt = true; } + void ClearExt() { m_ext.clear(); m_hasExt = false; } + void SetEmptyExt() { m_ext.clear(); m_hasExt = true; } wxString GetExt() const { return m_ext; } bool HasExt() const { return m_hasExt; } @@ -555,12 +583,12 @@ public: // returns the size in a human readable form wxString - GetHumanReadableSize(const wxString& nullsize = _("Not available"), + GetHumanReadableSize(const wxString& nullsize = wxGetTranslation("Not available"), int precision = 1, wxSizeConvention conv = wxSIZE_CONV_TRADITIONAL) const; static wxString GetHumanReadableSize(const wxULongLong& sz, - const wxString& nullsize = _("Not available"), + const wxString& nullsize = wxGetTranslation("Not available"), int precision = 1, wxSizeConvention conv = wxSIZE_CONV_TRADITIONAL); #endif // wxUSE_LONGLONG @@ -606,6 +634,11 @@ private: // the difference is important as file with name "foo" and without // extension has full name "foo" while with empty extension it is "foo." bool m_hasExt; + + // by default, symlinks are dereferenced but this flag can be set with + // DontFollowLink() to change this and make different operations work on + // this file path itself instead of the target of the symlink + bool m_dontFollowLinks; }; #endif // _WX_FILENAME_H_ diff --git a/Externals/wxWidgets3/include/wx/filepicker.h b/Externals/wxWidgets3/include/wx/filepicker.h index 7796ac33b3..5264ddb3ea 100644 --- a/Externals/wxWidgets3/include/wx/filepicker.h +++ b/Externals/wxWidgets3/include/wx/filepicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: filepicker.h 70043 2011-12-18 12:34:47Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -59,8 +58,8 @@ private: DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileDirPickerEvent) }; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEvent ); // ---------------------------------------------------------------------------- // event types and macros @@ -72,9 +71,9 @@ typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent& wxEVENT_HANDLER_CAST(wxFileDirPickerEventFunction, func) #define EVT_FILEPICKER_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) #define EVT_DIRPICKER_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) // ---------------------------------------------------------------------------- // wxFileDirPickerWidgetBase: a generic abstract interface which must be @@ -129,7 +128,7 @@ protected: // requires that all classes being mapped as wx{File|Dir}PickerWidget have the // same prototype for the contructor... // since GTK >= 2.6, there is GtkFileButton -#if defined(__WXGTK26__) && !defined(__WXUNIVERSAL__) +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) #include "wx/gtk/filepicker.h" #define wxFilePickerWidget wxFileButton #define wxDirPickerWidget wxDirButton @@ -148,7 +147,7 @@ protected: class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase { public: - wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {} + wxFileDirPickerCtrlBase() {} protected: // NB: no default values since this function will never be used @@ -183,11 +182,6 @@ public: // internal functions // event handler for our picker void OnFileDirChange(wxFileDirPickerEvent &); - // Returns TRUE if the current path is a valid one - // (i.e. a valid file for a wxFilePickerWidget or a valid - // folder for a wxDirPickerWidget). - virtual bool CheckPath(const wxString &str) const = 0; - // TRUE if any textctrl change should update the current working directory virtual bool IsCwdToUpdate() const = 0; @@ -209,9 +203,6 @@ protected: protected: - // true if the next UpdateTextCtrl() call is to ignore - bool m_bIgnoreNextTextCtrlUpdate; - // m_picker object as wxFileDirPickerWidgetBase interface wxFileDirPickerWidgetBase *m_pickerIface; }; @@ -275,9 +266,6 @@ public: public: // overrides - // return true if the given path is valid for this control - bool CheckPath(const wxString& path) const; - // return the text control value in canonical form wxString GetTextCtrlValue() const; @@ -285,11 +273,11 @@ public: // overrides { return HasFlag(wxFLP_CHANGE_DIR); } wxEventType GetEventType() const - { return wxEVT_COMMAND_FILEPICKER_CHANGED; } + { return wxEVT_FILEPICKER_CHANGED; } virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) { - sender->Connect( wxEVT_COMMAND_FILEPICKER_CHANGED, + sender->Connect( wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ), NULL, eventSink ); } @@ -379,19 +367,17 @@ public: public: // overrides - bool CheckPath(const wxString &path) const; - wxString GetTextCtrlValue() const; bool IsCwdToUpdate() const { return HasFlag(wxDIRP_CHANGE_DIR); } wxEventType GetEventType() const - { return wxEVT_COMMAND_DIRPICKER_CHANGED; } + { return wxEVT_DIRPICKER_CHANGED; } virtual void DoConnect( wxControl *sender, wxFileDirPickerCtrlBase *eventSink ) { - sender->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, + sender->Connect( wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( wxFileDirPickerCtrlBase::OnFileDirChange ), NULL, eventSink ); } @@ -426,5 +412,9 @@ private: #endif // wxUSE_DIRPICKERCTRL +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FILEPICKER_CHANGED wxEVT_FILEPICKER_CHANGED +#define wxEVT_COMMAND_DIRPICKER_CHANGED wxEVT_DIRPICKER_CHANGED + #endif // _WX_FILEDIRPICKER_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/filesys.h b/Externals/wxWidgets3/include/wx/filesys.h index d9d40edeaf..3bd6e426c7 100644 --- a/Externals/wxWidgets3/include/wx/filesys.h +++ b/Externals/wxWidgets3/include/wx/filesys.h @@ -3,7 +3,6 @@ // Purpose: class for opening files - virtual file system // Author: Vaclav Slavik // Copyright: (c) 1999 Vaclav Slavik -// RCS-ID: $Id: filesys.h 58757 2009-02-08 11:45:59Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -293,7 +292,20 @@ protected: static wxString ms_root; }; +// Stream reading data from wxFSFile: this allows to use virtual files with any +// wx functions accepting streams. +class WXDLLIMPEXP_BASE wxFSInputStream : public wxWrapperInputStream +{ +public: + // Notice that wxFS_READ is implied in flags. + wxFSInputStream(const wxString& filename, int flags = 0); + virtual ~wxFSInputStream(); +private: + wxFSFile* m_file; + + wxDECLARE_NO_COPY_CLASS(wxFSInputStream); +}; #endif // wxUSE_FILESYSTEM diff --git a/Externals/wxWidgets3/include/wx/flags.h b/Externals/wxWidgets3/include/wx/flags.h index 1b15bbe4f4..c45bafabdc 100644 --- a/Externals/wxWidgets3/include/wx/flags.h +++ b/Externals/wxWidgets3/include/wx/flags.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 27/07/03 -// RCS-ID: $Id: flags.h 66555 2011-01-04 08:31:53Z SC $ // Copyright: (c) 2003 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fmappriv.h b/Externals/wxWidgets3/include/wx/fmappriv.h index 658ad6350d..6637088626 100644 --- a/Externals/wxWidgets3/include/wx/fmappriv.h +++ b/Externals/wxWidgets3/include/wx/fmappriv.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 21.06.2003 (extracted from common/fontmap.cpp) -// RCS-ID: $Id: fmappriv.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 1999-2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/font.h b/Externals/wxWidgets3/include/wx/font.h index 6e3c5237ab..10a6f0e5d7 100644 --- a/Externals/wxWidgets3/include/wx/font.h +++ b/Externals/wxWidgets3/include/wx/font.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.09.99 -// RCS-ID: $Id: font.h 70446 2012-01-23 11:28:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -111,6 +110,145 @@ enum wxFontFlag wxFONTFLAG_STRIKETHROUGH }; +// ---------------------------------------------------------------------------- +// wxFontInfo describes a wxFont +// ---------------------------------------------------------------------------- + +class wxFontInfo +{ +public: + // Default ctor uses the default font size appropriate for the current + // platform. + wxFontInfo() + { InitPointSize(-1); } + + // These ctors specify the font size, either in points or in pixels. + wxEXPLICIT wxFontInfo(int pointSize) + { InitPointSize(pointSize); } + wxEXPLICIT wxFontInfo(const wxSize& pixelSize) : m_pixelSize(pixelSize) + { Init(); } + + // Setters for the various attributes. All of them return the object itself + // so that the calls to them could be chained. + wxFontInfo& Family(wxFontFamily family) + { m_family = family; return *this; } + wxFontInfo& FaceName(const wxString& faceName) + { m_faceName = faceName; return *this; } + + wxFontInfo& Bold(bool bold = true) + { SetFlag(wxFONTFLAG_BOLD, bold); return *this; } + wxFontInfo& Light(bool light = true) + { SetFlag(wxFONTFLAG_LIGHT, light); return *this; } + + wxFontInfo& Italic(bool italic = true) + { SetFlag(wxFONTFLAG_ITALIC, italic); return *this; } + wxFontInfo& Slant(bool slant = true) + { SetFlag(wxFONTFLAG_SLANT, slant); return *this; } + + wxFontInfo& AntiAliased(bool antiAliased = true) + { SetFlag(wxFONTFLAG_ANTIALIASED, antiAliased); return *this; } + wxFontInfo& Underlined(bool underlined = true) + { SetFlag(wxFONTFLAG_UNDERLINED, underlined); return *this; } + wxFontInfo& Strikethrough(bool strikethrough = true) + { SetFlag(wxFONTFLAG_STRIKETHROUGH, strikethrough); return *this; } + + wxFontInfo& Encoding(wxFontEncoding encoding) + { m_encoding = encoding; return *this; } + + + // Set all flags at once. + wxFontInfo& AllFlags(int flags) + { m_flags = flags; return *this; } + + + // Accessors are mostly meant to be used by wxFont itself to extract the + // various pieces of the font description. + + bool IsUsingSizeInPixels() const { return m_pixelSize != wxDefaultSize; } + int GetPointSize() const { return m_pointSize; } + wxSize GetPixelSize() const { return m_pixelSize; } + wxFontFamily GetFamily() const { return m_family; } + const wxString& GetFaceName() const { return m_faceName; } + + wxFontStyle GetStyle() const + { + return m_flags & wxFONTFLAG_ITALIC + ? wxFONTSTYLE_ITALIC + : m_flags & wxFONTFLAG_SLANT + ? wxFONTSTYLE_SLANT + : wxFONTSTYLE_NORMAL; + } + + wxFontWeight GetWeight() const + { + return m_flags & wxFONTFLAG_LIGHT + ? wxFONTWEIGHT_LIGHT + : m_flags & wxFONTFLAG_BOLD + ? wxFONTWEIGHT_BOLD + : wxFONTWEIGHT_NORMAL; + } + + bool IsAntiAliased() const + { + return (m_flags & wxFONTFLAG_ANTIALIASED) != 0; + } + + bool IsUnderlined() const + { + return (m_flags & wxFONTFLAG_UNDERLINED) != 0; + } + + bool IsStrikethrough() const + { + return (m_flags & wxFONTFLAG_STRIKETHROUGH) != 0; + } + + wxFontEncoding GetEncoding() const { return m_encoding; } + + + // Default copy ctor, assignment operator and dtor are OK. + +private: + // Common part of all ctor, initializing everything except the size (which + // is initialized by the ctors themselves). + void Init() + { + m_family = wxFONTFAMILY_DEFAULT; + m_flags = wxFONTFLAG_DEFAULT; + m_encoding = wxFONTENCODING_DEFAULT; + } + + void InitPointSize(int pointSize) + { + Init(); + + m_pointSize = pointSize; + m_pixelSize = wxDefaultSize; + } + + // Turn on or off the given bit in m_flags depending on the value of the + // boolean argument. + void SetFlag(int flag, bool on) + { + if ( on ) + m_flags |= flag; + else + m_flags &= ~flag; + } + + // The size information: if m_pixelSize is valid (!= wxDefaultSize), then + // it is used. Otherwise m_pointSize is used, taking into account that if + // it is == -1, it means that the platform dependent font size should be + // used. + int m_pointSize; + wxSize m_pixelSize; + + wxFontFamily m_family; + wxString m_faceName; + int m_flags; + wxFontEncoding m_encoding; +}; + // ---------------------------------------------------------------------------- // wxFontBase represents a font object // ---------------------------------------------------------------------------- @@ -124,6 +262,7 @@ public: derived classes should provide the following ctors: wxFont(); + wxFont(const wxFontInfo& info); wxFont(const wxString& nativeFontInfoString); wxFont(const wxNativeFontInfo& info); wxFont(int size, @@ -293,7 +432,7 @@ protected: virtual wxFontFamily DoGetFamily() const = 0; - // Helper functions to recover wxFONTSTYLE/wxFONTWEIGHT and underlined flg + // Helper functions to recover wxFONTSTYLE/wxFONTWEIGHT and underlined flag // values from flags containing a combination of wxFONTFLAG_XXX. static wxFontStyle GetStyleFromFlags(int flags) { @@ -318,6 +457,10 @@ protected: return (flags & wxFONTFLAG_UNDERLINED) != 0; } + static bool GetStrikethroughFromFlags(int flags) + { + return (flags & wxFONTFLAG_STRIKETHROUGH) != 0; + } private: // the currently default encoding: by default, it's the default system diff --git a/Externals/wxWidgets3/include/wx/fontdata.h b/Externals/wxWidgets3/include/wx/fontdata.h index c850dbc8db..87571ce940 100644 --- a/Externals/wxWidgets3/include/wx/fontdata.h +++ b/Externals/wxWidgets3/include/wx/fontdata.h @@ -1,7 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wx/fontdata.h // Author: Julian Smart -// RCS-ID: $Id: fontdata.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fontdlg.h b/Externals/wxWidgets3/include/wx/fontdlg.h index b040d15e58..74a6e6fccf 100644 --- a/Externals/wxWidgets3/include/wx/fontdlg.h +++ b/Externals/wxWidgets3/include/wx/fontdlg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.05.02 -// RCS-ID: $Id: fontdlg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) 1997-2002 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -37,8 +36,6 @@ public: bool Create(wxWindow *parent, const wxFontData& data) { InitFontData(&data); return Create(parent); } - virtual ~wxFontDialogBase(); - // retrieve the font data const wxFontData& GetFontData() const { return m_fontData; } wxFontData& GetFontData() { return m_fontData; } diff --git a/Externals/wxWidgets3/include/wx/fontenc.h b/Externals/wxWidgets3/include/wx/fontenc.h index 08ac5b6031..5263997ae9 100644 --- a/Externals/wxWidgets3/include/wx/fontenc.h +++ b/Externals/wxWidgets3/include/wx/fontenc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29.03.00 -// RCS-ID: $Id: fontenc.h 65056 2010-07-23 23:32:40Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -65,6 +64,8 @@ enum wxFontEncoding wxFONTENCODING_CP1255, // WinHebrew wxFONTENCODING_CP1256, // WinArabic wxFONTENCODING_CP1257, // WinBaltic (same as Latin 7) + wxFONTENCODING_CP1258, // WinVietnamese + wxFONTENCODING_CP1361, // Johab Korean character set. wxFONTENCODING_CP12_MAX, wxFONTENCODING_UTF7, // UTF-7 Unicode encoding @@ -151,7 +152,11 @@ enum wxFontEncoding wxFONTENCODING_SHIFT_JIS = wxFONTENCODING_CP932, // Shift JIS // Korean (CP 949 not actually the same but close enough) - wxFONTENCODING_EUC_KR = wxFONTENCODING_CP949 + wxFONTENCODING_EUC_KR = wxFONTENCODING_CP949, + wxFONTENCODING_JOHAB = wxFONTENCODING_CP1361, + + // Vietnamese + wxFONTENCODING_VIETNAMESE = wxFONTENCODING_CP1258 }; #endif // _WX_FONTENC_H_ diff --git a/Externals/wxWidgets3/include/wx/fontenum.h b/Externals/wxWidgets3/include/wx/fontenum.h index e3b6867128..782dc7fd9e 100644 --- a/Externals/wxWidgets3/include/wx/fontenum.h +++ b/Externals/wxWidgets3/include/wx/fontenum.h @@ -5,7 +5,6 @@ // Modified by: extended to enumerate more than just font facenames and works // not only on Windows now (VZ) // Created: 04/01/98 -// RCS-ID: $Id: fontenum.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart, Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fontmap.h b/Externals/wxWidgets3/include/wx/fontmap.h index 368d9beb97..c640daa83f 100644 --- a/Externals/wxWidgets3/include/wx/fontmap.h +++ b/Externals/wxWidgets3/include/wx/fontmap.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.11.99 -// RCS-ID: $Id: fontmap.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fontpicker.h b/Externals/wxWidgets3/include/wx/fontpicker.h index 75c1d961ec..1bacc3a4a0 100644 --- a/Externals/wxWidgets3/include/wx/fontpicker.h +++ b/Externals/wxWidgets3/include/wx/fontpicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: fontpicker.h 58718 2009-02-07 18:59:25Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -100,8 +99,7 @@ class WXDLLIMPEXP_CORE wxFontPickerCtrl : public wxPickerBase { public: wxFontPickerCtrl() - : m_bIgnoreNextTextCtrlUpdate(false), - m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + : m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) { } @@ -116,8 +114,7 @@ public: long style = wxFNTP_DEFAULT_STYLE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxFontPickerCtrlNameStr) - : m_bIgnoreNextTextCtrlUpdate(false), - m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + : m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) { Create(parent, id, initial, pos, size, style, validator, name); } @@ -165,9 +162,6 @@ protected: long GetPickerStyle(long style) const { return (style & (wxFNTP_FONTDESC_AS_LABEL|wxFNTP_USEFONT_FOR_LABEL)); } - // true if the next UpdateTextCtrl() call is to ignore - bool m_bIgnoreNextTextCtrlUpdate; - // the maximum pointsize allowed to the user unsigned int m_nMaxPointSize; @@ -180,14 +174,14 @@ private: // wxFontPickerEvent: used by wxFontPickerCtrl only // ---------------------------------------------------------------------------- -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FONTPICKER_CHANGED, wxFontPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FONTPICKER_CHANGED, wxFontPickerEvent ); class WXDLLIMPEXP_CORE wxFontPickerEvent : public wxCommandEvent { public: wxFontPickerEvent() {} wxFontPickerEvent(wxObject *generator, int id, const wxFont &f) - : wxCommandEvent(wxEVT_COMMAND_FONTPICKER_CHANGED, id), + : wxCommandEvent(wxEVT_FONTPICKER_CHANGED, id), m_font(f) { SetEventObject(generator); @@ -215,7 +209,10 @@ typedef void (wxEvtHandler::*wxFontPickerEventFunction)(wxFontPickerEvent&); wxEVENT_HANDLER_CAST(wxFontPickerEventFunction, func) #define EVT_FONTPICKER_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_FONTPICKER_CHANGED, id, wxFontPickerEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_FONTPICKER_CHANGED, id, wxFontPickerEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_FONTPICKER_CHANGED wxEVT_FONTPICKER_CHANGED #endif // wxUSE_FONTPICKERCTRL diff --git a/Externals/wxWidgets3/include/wx/fontutil.h b/Externals/wxWidgets3/include/wx/fontutil.h index 232ef8a8e3..caad365473 100644 --- a/Externals/wxWidgets3/include/wx/fontutil.h +++ b/Externals/wxWidgets3/include/wx/fontutil.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05.11.99 -// RCS-ID: $Id: fontutil.h 70446 2012-01-23 11:28:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -71,6 +70,11 @@ class WXDLLIMPEXP_CORE wxNativeFontInfo public: #if wxUSE_PANGO PangoFontDescription *description; + + // Pango font description doesn't have these attributes, so we store them + // separately and handle them ourselves in {To,From}String() methods. + bool m_underlined; + bool m_strikethrough; #elif defined(_WX_X_FONTLIKE) // the members can't be accessed directly as we only parse the // xFontName on demand diff --git a/Externals/wxWidgets3/include/wx/frame.h b/Externals/wxWidgets3/include/wx/frame.h index 396dd98f5a..41927f775a 100644 --- a/Externals/wxWidgets3/include/wx/frame.h +++ b/Externals/wxWidgets3/include/wx/frame.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 15.11.99 -// RCS-ID: $Id: frame.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -205,6 +204,10 @@ protected: // frame virtual void AttachMenuBar(wxMenuBar *menubar); + // Return true if we should update the menu item state from idle event + // handler or false if we should delay it until the menu is opened. + static bool ShouldUpdateMenuFromIdle(); + wxMenuBar *m_frameMenuBar; #endif // wxUSE_MENUS diff --git a/Externals/wxWidgets3/include/wx/fs_arc.h b/Externals/wxWidgets3/include/wx/fs_arc.h index d4957504c3..e65b8fc7b6 100644 --- a/Externals/wxWidgets3/include/wx/fs_arc.h +++ b/Externals/wxWidgets3/include/wx/fs_arc.h @@ -3,7 +3,6 @@ // Purpose: Archive file system // Author: Vaclav Slavik, Mike Wetherell // Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell -// CVS-ID: $Id: fs_arc.h 58757 2009-02-08 11:45:59Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fs_filter.h b/Externals/wxWidgets3/include/wx/fs_filter.h index 807eccbd6f..8e8afda4e2 100644 --- a/Externals/wxWidgets3/include/wx/fs_filter.h +++ b/Externals/wxWidgets3/include/wx/fs_filter.h @@ -3,7 +3,6 @@ // Purpose: Filter file system handler // Author: Mike Wetherell // Copyright: (c) 2006 Mike Wetherell -// CVS-ID: $Id: fs_filter.h 58757 2009-02-08 11:45:59Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fs_zip.h b/Externals/wxWidgets3/include/wx/fs_zip.h index 8d39e9fc4d..197a46a5ef 100644 --- a/Externals/wxWidgets3/include/wx/fs_zip.h +++ b/Externals/wxWidgets3/include/wx/fs_zip.h @@ -3,7 +3,6 @@ // Purpose: wxZipFSHandler typedef for compatibility // Author: Mike Wetherell // Copyright: (c) 2006 Mike Wetherell -// CVS-ID: $Id: fs_zip.h 42713 2006-10-30 11:56:12Z ABX $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/fswatcher.h b/Externals/wxWidgets3/include/wx/fswatcher.h index 239a5b4dad..2955407864 100644 --- a/Externals/wxWidgets3/include/wx/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/fswatcher.h @@ -3,7 +3,6 @@ // Purpose: wxFileSystemWatcherBase // Author: Bartosz Bekier // Created: 2009-05-23 -// RCS-ID: $Id: fswatcher.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -44,15 +43,18 @@ enum wxFSW_EVENT_RENAME = 0x04, wxFSW_EVENT_MODIFY = 0x08, wxFSW_EVENT_ACCESS = 0x10, + wxFSW_EVENT_ATTRIB = 0x20, // Currently this is wxGTK-only // error events - wxFSW_EVENT_WARNING = 0x20, - wxFSW_EVENT_ERROR = 0x40, - + wxFSW_EVENT_WARNING = 0x40, + wxFSW_EVENT_ERROR = 0x80, wxFSW_EVENT_ALL = wxFSW_EVENT_CREATE | wxFSW_EVENT_DELETE | wxFSW_EVENT_RENAME | wxFSW_EVENT_MODIFY | - wxFSW_EVENT_ACCESS | + wxFSW_EVENT_ACCESS | wxFSW_EVENT_ATTRIB | wxFSW_EVENT_WARNING | wxFSW_EVENT_ERROR +#ifdef wxHAS_INOTIFY + ,wxFSW_EVENT_UNMOUNT = 0x2000 +#endif }; // Type of the path watched, used only internally for now. @@ -75,7 +77,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_FSWATCHER, class WXDLLIMPEXP_BASE wxFileSystemWatcherEvent: public wxEvent { public: - wxFileSystemWatcherEvent(int changeType, int watchid = wxID_ANY) : + wxFileSystemWatcherEvent(int changeType = 0, int watchid = wxID_ANY) : wxEvent(watchid, wxEVT_FSWATCHER), m_changeType(changeType) { @@ -149,7 +151,7 @@ public: virtual wxEventCategory GetEventCategory() const { - // TODO this has to be merged with "similiar" categories and changed + // TODO this has to be merged with "similar" categories and changed return wxEVT_CATEGORY_UNKNOWN; } @@ -176,6 +178,8 @@ protected: wxFileName m_path; wxFileName m_newPath; wxString m_errorMsg; +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileSystemWatcherEvent) }; typedef void (wxEvtHandler::*wxFileSystemWatcherEventFunction) @@ -196,12 +200,16 @@ class wxFSWatchInfo { public: wxFSWatchInfo() : - m_events(-1), m_type(wxFSWPath_None) + m_events(-1), m_type(wxFSWPath_None), m_refcount(-1) { } - wxFSWatchInfo(const wxString& path, int events, wxFSWPathType type) : - m_path(path), m_events(events), m_type(type) + wxFSWatchInfo(const wxString& path, + int events, + wxFSWPathType type, + const wxString& filespec = wxString()) : + m_path(path), m_filespec(filespec), m_events(events), m_type(type), + m_refcount(1) { } @@ -210,6 +218,8 @@ public: return m_path; } + const wxString& GetFilespec() const { return m_filespec; } + int GetFlags() const { return m_events; @@ -220,10 +230,27 @@ public: return m_type; } + // Reference counting of watch entries is used to avoid watching the same + // file system path multiple times (this can happen even accidentally, e.g. + // when you have a recursive watch and then decide to watch some file or + // directory under it separately). + int IncRef() + { + return ++m_refcount; + } + + int DecRef() + { + wxASSERT_MSG( m_refcount > 0, wxS("Trying to decrement a zero count") ); + return --m_refcount; + } + protected: wxString m_path; + wxString m_filespec; // For tree watches, holds any filespec to apply int m_events; wxFSWPathType m_type; + int m_refcount; }; WX_DECLARE_STRING_HASH_MAP(wxFSWatchInfo, wxFSWatchInfoMap); @@ -260,7 +287,7 @@ public: * of particular type. */ virtual bool AddTree(const wxFileName& path, int events = wxFSW_EVENT_ALL, - const wxString& filter = wxEmptyString); + const wxString& filespec = wxEmptyString); /** * Removes path from the list of watched paths. @@ -305,6 +332,14 @@ public: m_owner = handler; } + + // This is a semi-private function used by wxWidgets itself only. + // + // Delegates the real work of adding the path to wxFSWatcherImpl::Add() and + // updates m_watches if the new path was successfully added. + bool AddAny(const wxFileName& path, int events, wxFSWPathType type, + const wxString& filespec = wxString()); + protected: static wxString GetCanonicalPath(const wxFileName& path) @@ -320,10 +355,6 @@ protected: return path_copy.GetFullPath(); } - // Delegates the real work of adding the path to wxFSWatcherImpl::Add() and - // updates m_watches if the new path was successfully added. - bool DoAdd(const wxFileName& path, int events, wxFSWPathType type); - wxFSWatchInfoMap m_watches; // path=>wxFSWatchInfo map wxFSWatcherImpl* m_service; // file system events service diff --git a/Externals/wxWidgets3/include/wx/gauge.h b/Externals/wxWidgets3/include/wx/gauge.h index cec0dc48b0..93ae86fcc4 100644 --- a/Externals/wxWidgets3/include/wx/gauge.h +++ b/Externals/wxWidgets3/include/wx/gauge.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.02.01 -// RCS-ID: $Id: gauge.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 1996-2001 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gbsizer.h b/Externals/wxWidgets3/include/wx/gbsizer.h index 51dc057d3d..dea46c15ab 100644 --- a/Externals/wxWidgets3/include/wx/gbsizer.h +++ b/Externals/wxWidgets3/include/wx/gbsizer.h @@ -6,7 +6,6 @@ // // Author: Robin Dunn // Created: 03-Nov-2003 -// RCS-ID: $Id: gbsizer.h 69970 2011-12-10 04:34:06Z RD $ // Copyright: (c) Robin Dunn // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -67,6 +66,14 @@ public: // default copy ctor and assignment operator are okay. + // Factor constructor creating an invalid wxGBSpan: this is mostly supposed + // to be used as return value for functions returning wxGBSpan in case of + // errors. + static wxGBSpan Invalid() + { + return wxGBSpan(NULL); + } + int GetRowspan() const { return m_rowspan; } int GetColspan() const { return m_colspan; } void SetRowspan(int rowspan) @@ -87,6 +94,13 @@ public: bool operator!=(const wxGBSpan& o) const { return !(*this == o); } private: + // This private ctor is used by Invalid() only. + wxGBSpan(struct InvalidCtorTag*) + { + m_rowspan = + m_colspan = -1; + } + void Init() { m_rowspan = diff --git a/Externals/wxWidgets3/include/wx/gdicmn.h b/Externals/wxWidgets3/include/wx/gdicmn.h index d69b5f89be..6ce652d49f 100644 --- a/Externals/wxWidgets3/include/wx/gdicmn.h +++ b/Externals/wxWidgets3/include/wx/gdicmn.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: gdicmn.h 70789 2012-03-04 00:28:58Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -174,7 +173,7 @@ enum wxStockCursor wxIcon *icon = new wxIcon(sample_xpm); // On wxGTK/Linux */ -#ifdef __WXMSW__ +#ifdef __WINDOWS__ // Load from a resource #define wxICON(X) wxIcon(wxT(#X)) #elif defined(__WXPM__) @@ -204,7 +203,7 @@ enum wxStockCursor under Unix bitmaps live in XPMs and under Windows they're in ressources. */ -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__WXPM__) #define wxBITMAP(name) wxBitmap(wxT(#name), wxBITMAP_TYPE_BMP_RESOURCE) #elif defined(__WXGTK__) || \ defined(__WXMOTIF__) || \ @@ -218,6 +217,28 @@ enum wxStockCursor #define wxBITMAP(name) wxBitmap(name##_xpm, wxBITMAP_TYPE_XPM) #endif // platform +// Macro for creating wxBitmap from in-memory PNG data. +// +// It reads PNG data from name_png static byte arrays that can be created using +// e.g. misc/scripts/png2c.py. +// +// This macro exists mostly as a helper for wxBITMAP_PNG() below but also +// because it's slightly more convenient to use than NewFromPNGData() directly. +#define wxBITMAP_PNG_FROM_DATA(name) \ + wxBitmap::NewFromPNGData(name##_png, WXSIZEOF(name##_png)) + +// Similar to wxBITMAP but used for the bitmaps in PNG format. +// +// Under Windows they should be embedded into the resource file using RT_RCDATA +// resource type and under OS X the PNG file with the specified name must be +// available in the resource subdirectory of the bundle. Elsewhere, this is +// exactly the same thing as wxBITMAP_PNG_FROM_DATA() described above. +#if defined(__WINDOWS__) || defined(__WXOSX__) + #define wxBITMAP_PNG(name) wxBitmap(wxS(#name), wxBITMAP_TYPE_PNG_RESOURCE) +#else + #define wxBITMAP_PNG(name) wxBITMAP_PNG_FROM_DATA(name) +#endif + // =========================================================================== // classes // =========================================================================== @@ -255,6 +276,13 @@ public: { if ( sz.x > x ) x = sz.x; if ( sz.y > y ) y = sz.y; } void DecTo(const wxSize& sz) { if ( sz.x < x ) x = sz.x; if ( sz.y < y ) y = sz.y; } + void DecToIfSpecified(const wxSize& sz) + { + if ( sz.x != wxDefaultCoord && sz.x < x ) + x = sz.x; + if ( sz.y != wxDefaultCoord && sz.y < y ) + y = sz.y; + } void IncBy(int dx, int dy) { x += dx; y += dy; } void IncBy(const wxPoint& pt); @@ -352,27 +380,27 @@ inline wxSize operator/(const wxSize& s, long i) inline wxSize operator*(const wxSize& s, long i) { - return wxSize(s.x * i, s.y * i); + return wxSize(int(s.x * i), int(s.y * i)); } inline wxSize operator*(long i, const wxSize& s) { - return wxSize(s.x * i, s.y * i); + return wxSize(int(s.x * i), int(s.y * i)); } inline wxSize operator/(const wxSize& s, unsigned long i) { - return wxSize(s.x / i, s.y / i); + return wxSize(int(s.x / i), int(s.y / i)); } inline wxSize operator*(const wxSize& s, unsigned long i) { - return wxSize(s.x * i, s.y * i); + return wxSize(int(s.x * i), int(s.y * i)); } inline wxSize operator*(unsigned long i, const wxSize& s) { - return wxSize(s.x * i, s.y * i); + return wxSize(int(s.x * i), int(s.y * i)); } inline wxSize operator*(const wxSize& s, double i) @@ -626,12 +654,12 @@ inline wxPoint operator/(const wxPoint& s, long i) inline wxPoint operator*(const wxPoint& s, long i) { - return wxPoint(s.x * i, s.y * i); + return wxPoint(int(s.x * i), int(s.y * i)); } inline wxPoint operator*(long i, const wxPoint& s) { - return wxPoint(s.x * i, s.y * i); + return wxPoint(int(s.x * i), int(s.y * i)); } inline wxPoint operator/(const wxPoint& s, unsigned long i) @@ -641,12 +669,12 @@ inline wxPoint operator/(const wxPoint& s, unsigned long i) inline wxPoint operator*(const wxPoint& s, unsigned long i) { - return wxPoint(s.x * i, s.y * i); + return wxPoint(int(s.x * i), int(s.y * i)); } inline wxPoint operator*(unsigned long i, const wxPoint& s) { - return wxPoint(s.x * i, s.y * i); + return wxPoint(int(s.x * i), int(s.y * i)); } inline wxPoint operator*(const wxPoint& s, double i) diff --git a/Externals/wxWidgets3/include/wx/gdiobj.h b/Externals/wxWidgets3/include/wx/gdiobj.h index 5e07df0d81..903dfe083d 100644 --- a/Externals/wxWidgets3/include/wx/gdiobj.h +++ b/Externals/wxWidgets3/include/wx/gdiobj.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: gdiobj.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/aboutdlgg.h b/Externals/wxWidgets3/include/wx/generic/aboutdlgg.h index f5b1365953..36e0cad438 100644 --- a/Externals/wxWidgets3/include/wx/generic/aboutdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/aboutdlgg.h @@ -3,7 +3,6 @@ // Purpose: generic wxAboutBox() implementation // Author: Vadim Zeitlin // Created: 2006-10-07 -// RCS-ID: $Id: aboutdlgg.h 70413 2012-01-20 22:11:32Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/accel.h b/Externals/wxWidgets3/include/wx/generic/accel.h index d0d76f7bf0..44f8e07e83 100644 --- a/Externals/wxWidgets3/include/wx/generic/accel.h +++ b/Externals/wxWidgets3/include/wx/generic/accel.h @@ -2,7 +2,6 @@ // Name: wx/generic/accel.h // Purpose: wxAcceleratorTable class // Author: Robert Roebling -// RCS-ID: $Id: accel.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/animate.h b/Externals/wxWidgets3/include/wx/generic/animate.h index 16562ce351..818daf890c 100644 --- a/Externals/wxWidgets3/include/wx/generic/animate.h +++ b/Externals/wxWidgets3/include/wx/generic/animate.h @@ -4,7 +4,6 @@ // Author: Julian Smart and Guillermo Rodriguez Garcia // Modified by: Francesco Montorsi // Created: 13/8/99 -// RCS-ID: $Id: animate.h 53629 2008-05-17 22:51:52Z VZ $ // Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/bmpcbox.h b/Externals/wxWidgets3/include/wx/generic/bmpcbox.h index 851fb971d4..d5e5cbb169 100644 --- a/Externals/wxWidgets3/include/wx/generic/bmpcbox.h +++ b/Externals/wxWidgets3/include/wx/generic/bmpcbox.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Aug-30-2006 -// RCS-ID: $Id: bmpcbox.h 54382 2008-06-27 13:47:45Z RR $ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/busyinfo.h b/Externals/wxWidgets3/include/wx/generic/busyinfo.h index b656f99760..7f56edb26d 100644 --- a/Externals/wxWidgets3/include/wx/generic/busyinfo.h +++ b/Externals/wxWidgets3/include/wx/generic/busyinfo.h @@ -3,7 +3,6 @@ // Purpose: Information window (when app is busy) // Author: Vaclav Slavik // Copyright: (c) 1999 Vaclav Slavik -// RCS-ID: $Id: busyinfo.h 62789 2009-12-05 19:57:58Z PC $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/buttonbar.h b/Externals/wxWidgets3/include/wx/generic/buttonbar.h index 91443dbf14..e933a3ca2c 100644 --- a/Externals/wxWidgets3/include/wx/generic/buttonbar.h +++ b/Externals/wxWidgets3/include/wx/generic/buttonbar.h @@ -4,7 +4,6 @@ // Author: Julian Smart, after Robert Roebling, Vadim Zeitlin, SciTech // Modified by: // Created: 2006-04-13 -// Id: $Id: buttonbar.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart, Robert Roebling, Vadim Zeitlin, // SciTech Software, Inc. // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/generic/calctrlg.h b/Externals/wxWidgets3/include/wx/generic/calctrlg.h index f7af5fa97c..8e430b6231 100644 --- a/Externals/wxWidgets3/include/wx/generic/calctrlg.h +++ b/Externals/wxWidgets3/include/wx/generic/calctrlg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29.12.99 -// RCS-ID: $Id: calctrlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/caret.h b/Externals/wxWidgets3/include/wx/generic/caret.h index 99f78ddd59..67041cf20d 100644 --- a/Externals/wxWidgets3/include/wx/generic/caret.h +++ b/Externals/wxWidgets3/include/wx/generic/caret.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin (original code by Robert Roebling) // Modified by: // Created: 25.05.99 -// RCS-ID: $Id: caret.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/choicdgg.h b/Externals/wxWidgets3/include/wx/generic/choicdgg.h index 431c686b59..2d92b44276 100644 --- a/Externals/wxWidgets3/include/wx/generic/choicdgg.h +++ b/Externals/wxWidgets3/include/wx/generic/choicdgg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions // Created: 01/02/97 -// RCS-ID: $Id: choicdgg.h 70642 2012-02-20 21:56:18Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/clrpickerg.h b/Externals/wxWidgets3/include/wx/generic/clrpickerg.h index 4012a9cc75..de32125e00 100644 --- a/Externals/wxWidgets3/include/wx/generic/clrpickerg.h +++ b/Externals/wxWidgets3/include/wx/generic/clrpickerg.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Vadim Zeitlin, Francesco Montorsi -// RCS-ID: $Id: clrpickerg.h 66615 2011-01-07 05:26:57Z PC $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/collpaneg.h b/Externals/wxWidgets3/include/wx/generic/collpaneg.h index e06b361b18..ec0777115d 100644 --- a/Externals/wxWidgets3/include/wx/generic/collpaneg.h +++ b/Externals/wxWidgets3/include/wx/generic/collpaneg.h @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 8/10/2006 -// RCS-ID: $Id: collpaneg.h 68366 2011-07-24 22:19:33Z VZ $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/colour.h b/Externals/wxWidgets3/include/wx/generic/colour.h index c07d8c77f0..5db020cacd 100644 --- a/Externals/wxWidgets3/include/wx/generic/colour.h +++ b/Externals/wxWidgets3/include/wx/generic/colour.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: colour.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/colrdlgg.h b/Externals/wxWidgets3/include/wx/generic/colrdlgg.h index 82248cbc1c..a83abd8ce3 100644 --- a/Externals/wxWidgets3/include/wx/generic/colrdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/colrdlgg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: colrdlgg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/combo.h b/Externals/wxWidgets3/include/wx/generic/combo.h index 2632d66618..f271563ae2 100644 --- a/Externals/wxWidgets3/include/wx/generic/combo.h +++ b/Externals/wxWidgets3/include/wx/generic/combo.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id: combo.h 67255 2011-03-20 10:59:22Z JMS $ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/ctrlsub.h b/Externals/wxWidgets3/include/wx/generic/ctrlsub.h index eda02c745b..0dd113dcf9 100644 --- a/Externals/wxWidgets3/include/wx/generic/ctrlsub.h +++ b/Externals/wxWidgets3/include/wx/generic/ctrlsub.h @@ -3,7 +3,6 @@ // Purpose: common functionality of wxItemContainer-derived controls // Author: Vadim Zeitlin // Created: 2007-07-25 -// RCS-ID: $Id: ctrlsub.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/custombgwin.h b/Externals/wxWidgets3/include/wx/generic/custombgwin.h index a7ed85d995..8004195498 100644 --- a/Externals/wxWidgets3/include/wx/generic/custombgwin.h +++ b/Externals/wxWidgets3/include/wx/generic/custombgwin.h @@ -3,7 +3,6 @@ // Purpose: Generic implementation of wxCustomBackgroundWindow. // Author: Vadim Zeitlin // Created: 2011-10-10 -// RCS-ID: $Id: custombgwin.h 69378 2011-10-11 17:07:43Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/dataview.h b/Externals/wxWidgets3/include/wx/generic/dataview.h index af16d65218..396c81ba6c 100644 --- a/Externals/wxWidgets3/include/wx/generic/dataview.h +++ b/Externals/wxWidgets3/include/wx/generic/dataview.h @@ -3,7 +3,6 @@ // Purpose: wxDataViewCtrl generic implementation header // Author: Robert Roebling // Modified By: Bo Yang -// Id: $Id: dataview.h 70717 2012-02-27 18:54:02Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -70,7 +69,7 @@ public: virtual bool IsSortKey() const { return m_sort; } - virtual void UnsetAsSortKey() { m_sort = false; UpdateDisplay(); } + virtual void UnsetAsSortKey(); virtual void SetSortOrder(bool ascending); @@ -182,6 +181,8 @@ public: virtual void SetFocus(); + virtual bool SetFont(const wxFont & font); + #if wxUSE_DRAG_AND_DROP virtual bool EnableDragSource( const wxDataFormat &format ); virtual bool EnableDropTarget( const wxDataFormat &format ); @@ -242,10 +243,18 @@ private: void UpdateColWidths(); wxDataViewColumnList m_cols; - // cached column best widths or 0 if not computed, values are for + // cached column best widths information, values are for // respective columns from m_cols and the arrays have same size - wxVector m_colsBestWidths; - // m_colsBestWidths partially invalid, needs recomputing + struct CachedColWidthInfo + { + CachedColWidthInfo() : width(0), dirty(true) {} + int width; // cached width or 0 if not computed + bool dirty; // column was invalidated, header needs updating + }; + wxVector m_colsBestWidths; + // This indicates that at least one entry in m_colsBestWidths has 'dirty' + // flag set. It's cheaper to check one flag in OnInternalIdle() than to + // iterate over m_colsBestWidths to check if anything needs to be done. bool m_colsDirty; wxDataViewModelNotifier *m_notifier; diff --git a/Externals/wxWidgets3/include/wx/generic/datectrl.h b/Externals/wxWidgets3/include/wx/generic/datectrl.h index fe7dd57299..47e656634b 100644 --- a/Externals/wxWidgets3/include/wx/generic/datectrl.h +++ b/Externals/wxWidgets3/include/wx/generic/datectrl.h @@ -4,7 +4,6 @@ // Author: Andreas Pflug // Modified by: // Created: 2005-01-19 -// RCS-ID: $Id: datectrl.h 70736 2012-02-28 14:41:30Z VZ $ // Copyright: (c) 2005 Andreas Pflug // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/dcpsg.h b/Externals/wxWidgets3/include/wx/generic/dcpsg.h index 19f374bf7a..ea423475d5 100644 --- a/Externals/wxWidgets3/include/wx/generic/dcpsg.h +++ b/Externals/wxWidgets3/include/wx/generic/dcpsg.h @@ -3,7 +3,6 @@ // Purpose: wxPostScriptDC class // Author: Julian Smart and others // Modified by: -// RCS-ID: $Id: dcpsg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart and Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -94,6 +93,8 @@ public: virtual int GetResolution() const; virtual wxRect GetPaperRect() const; + virtual void* GetHandle() const { return NULL; } + protected: bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, wxFloodFillStyle style = wxFLOOD_SURFACE); @@ -103,11 +104,11 @@ protected: void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); void DoDrawPoint(wxCoord x, wxCoord y); - void DoDrawLines(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); - void DoDrawPolygon(int n, wxPoint points[], + void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); - void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); diff --git a/Externals/wxWidgets3/include/wx/generic/dirctrlg.h b/Externals/wxWidgets3/include/wx/generic/dirctrlg.h index 5fcbcfb175..bdaa3df33b 100644 --- a/Externals/wxWidgets3/include/wx/generic/dirctrlg.h +++ b/Externals/wxWidgets3/include/wx/generic/dirctrlg.h @@ -7,7 +7,6 @@ // Author: Robert Roebling, Harm van der Heijden, Julian Smart et al // Modified by: // Created: 21/3/2000 -// RCS-ID: $Id: dirctrlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling, Harm van der Heijden, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,10 +38,8 @@ enum wxDIRCTRL_DIR_ONLY = 0x0010, // When setting the default path, select the first file in the directory wxDIRCTRL_SELECT_FIRST = 0x0020, -#if WXWIN_COMPATIBILITY_2_8 - // Unused, for compatibility only + // Show the filter list wxDIRCTRL_SHOW_FILTERS = 0x0040, -#endif // WXWIN_COMPATIBILITY_2_8 // Use 3D borders on internal controls wxDIRCTRL_3D_INTERNAL = 0x0080, // Editable labels @@ -111,6 +108,8 @@ public: void OnCollapseItem(wxTreeEvent &event ); void OnBeginEditItem(wxTreeEvent &event ); void OnEndEditItem(wxTreeEvent &event ); + void OnTreeSelChange(wxTreeEvent &event); + void OnItemActivated(wxTreeEvent &event); void OnSize(wxSizeEvent &event ); // Try to expand as much of the given path as possible. @@ -161,6 +160,8 @@ public: // If the path string has been used (we're at the leaf), done is set to true virtual wxTreeItemId FindChild(wxTreeItemId parentId, const wxString& path, bool& done); + wxString GetPath(wxTreeItemId itemId) const; + // Resize the components of the control virtual void DoResize(); @@ -190,6 +191,7 @@ protected: private: void PopulateNode(wxTreeItemId node); + wxDirItemData* GetItemData(wxTreeItemId itemId); bool m_showHidden; wxTreeItemId m_rootId; @@ -207,6 +209,15 @@ private: wxDECLARE_NO_COPY_CLASS(wxGenericDirCtrl); }; +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRCTRL_SELECTIONCHANGED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRCTRL_FILEACTIVATED, wxTreeEvent ); + +#define wx__DECLARE_DIRCTRL_EVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_DIRCTRL_ ## evt, id, wxTreeEventHandler(fn)) + +#define EVT_DIRCTRL_SELECTIONCHANGED(id, fn) wx__DECLARE_DIRCTRL_EVT(SELECTIONCHANGED, id, fn) +#define EVT_DIRCTRL_FILEACTIVATED(id, fn) wx__DECLARE_DIRCTRL_EVT(FILEACTIVATED, id, fn) + //----------------------------------------------------------------------------- // wxDirFilterListCtrl //----------------------------------------------------------------------------- @@ -299,5 +310,9 @@ extern WXDLLIMPEXP_DATA_CORE(wxFileIconsTable *) wxTheFileIconsTable; #endif // wxUSE_DIRDLG || wxUSE_FILEDLG || wxUSE_FILECTRL +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_DIRCTRL_SELECTIONCHANGED wxEVT_DIRCTRL_SELECTIONCHANGED +#define wxEVT_COMMAND_DIRCTRL_FILEACTIVATED wxEVT_DIRCTRL_FILEACTIVATED + #endif // _WX_DIRCTRLG_H_ diff --git a/Externals/wxWidgets3/include/wx/generic/dirdlgg.h b/Externals/wxWidgets3/include/wx/generic/dirdlgg.h index c5ce093f44..cc8b5a874b 100644 --- a/Externals/wxWidgets3/include/wx/generic/dirdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/dirdlgg.h @@ -7,7 +7,6 @@ // Author: Robert Roebling, Harm van der Heijden, Julian Smart et al // Modified by: // Created: 21/3/2000 -// RCS-ID: $Id: dirdlgg.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Robert Roebling, Harm van der Heijden, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/dragimgg.h b/Externals/wxWidgets3/include/wx/generic/dragimgg.h index ff3b72e12b..9c90e163f2 100644 --- a/Externals/wxWidgets3/include/wx/generic/dragimgg.h +++ b/Externals/wxWidgets3/include/wx/generic/dragimgg.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: // Created: 29/2/2000 -// RCS-ID: $Id: dragimgg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/dvrenderer.h b/Externals/wxWidgets3/include/wx/generic/dvrenderer.h index 8e4eb7761c..75889a8108 100644 --- a/Externals/wxWidgets3/include/wx/generic/dvrenderer.h +++ b/Externals/wxWidgets3/include/wx/generic/dvrenderer.h @@ -3,7 +3,6 @@ // Purpose: wxDataViewRenderer for generic wxDataViewCtrl implementation // Author: Robert Roebling, Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/generic/dataview.h) -// RCS-ID: $Id: dvrenderer.h 69473 2011-10-19 16:20:17Z VS $ // Copyright: (c) 2006 Robert Roebling // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/generic/dvrenderers.h b/Externals/wxWidgets3/include/wx/generic/dvrenderers.h index e5ca2c71ec..6f80c773a5 100644 --- a/Externals/wxWidgets3/include/wx/generic/dvrenderers.h +++ b/Externals/wxWidgets3/include/wx/generic/dvrenderers.h @@ -3,7 +3,6 @@ // Purpose: All generic wxDataViewCtrl renderer classes // Author: Robert Roebling, Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/generic/dataview.h) -// RCS-ID: $Id: dvrenderers.h 69473 2011-10-19 16:20:17Z VS $ // Copyright: (c) 2006 Robert Roebling // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/generic/fdrepdlg.h b/Externals/wxWidgets3/include/wx/generic/fdrepdlg.h index f4a961d6a8..d1ad8d1b88 100644 --- a/Externals/wxWidgets3/include/wx/generic/fdrepdlg.h +++ b/Externals/wxWidgets3/include/wx/generic/fdrepdlg.h @@ -4,7 +4,6 @@ // Author: Markus Greither // Modified by: // Created: 25/05/2001 -// RCS-ID: $Id: fdrepdlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/filectrlg.h b/Externals/wxWidgets3/include/wx/generic/filectrlg.h index 24034654ac..ba26118d7f 100644 --- a/Externals/wxWidgets3/include/wx/generic/filectrlg.h +++ b/Externals/wxWidgets3/include/wx/generic/filectrlg.h @@ -4,7 +4,6 @@ // Author: Diaa M. Sami // Modified by: // Created: Jul-07-2007 -// RCS-ID: $Id: filectrlg.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Diaa M. Sami // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -14,7 +13,7 @@ #if wxUSE_FILECTRL -#include "wx/panel.h" +#include "wx/containr.h" #include "wx/listctrl.h" #include "wx/filectrl.h" #include "wx/filename.h" @@ -182,7 +181,7 @@ private: DECLARE_EVENT_TABLE() }; -class WXDLLIMPEXP_CORE wxGenericFileCtrl : public wxPanel, +class WXDLLIMPEXP_CORE wxGenericFileCtrl : public wxNavigationEnabled, public wxFileCtrlBase { public: diff --git a/Externals/wxWidgets3/include/wx/generic/filedlgg.h b/Externals/wxWidgets3/include/wx/generic/filedlgg.h index a1e348f7f3..7d14e523fb 100644 --- a/Externals/wxWidgets3/include/wx/generic/filedlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/filedlgg.h @@ -5,7 +5,6 @@ // Modified by: // Created: 8/17/99 // Copyright: (c) Robert Roebling -// RCS-ID: $Id: filedlgg.h 62722 2009-11-26 16:17:00Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/filepickerg.h b/Externals/wxWidgets3/include/wx/generic/filepickerg.h index f1283915c1..d88daa556a 100644 --- a/Externals/wxWidgets3/include/wx/generic/filepickerg.h +++ b/Externals/wxWidgets3/include/wx/generic/filepickerg.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: filepickerg.h 70043 2011-12-18 12:34:47Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -17,8 +16,8 @@ #include "wx/dirdlg.h" -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_DIRPICKER_CHANGED, wxFileDirPickerEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_FILEPICKER_CHANGED, wxFileDirPickerEvent ); //----------------------------------------------------------------------------- @@ -148,7 +147,7 @@ public: // overridable virtual wxDialog *CreateDialog(); wxEventType GetEventType() const - { return wxEVT_COMMAND_FILEPICKER_CHANGED; } + { return wxEVT_FILEPICKER_CHANGED; } protected: void UpdateDialogPath(wxDialog *p) @@ -156,10 +155,6 @@ protected: void UpdatePathFromDialog(wxDialog *p) { m_path = wxStaticCast(p, wxFileDialog)->GetPath(); } - // Set the initial directory for the dialog but without overriding the - // directory of the currently selected file, if any. - void DoSetInitialDirectory(wxFileDialog* dialog, const wxString& dir); - private: DECLARE_DYNAMIC_CLASS(wxGenericFileButton) }; @@ -207,7 +202,7 @@ public: // overridable virtual wxDialog *CreateDialog(); wxEventType GetEventType() const - { return wxEVT_COMMAND_DIRPICKER_CHANGED; } + { return wxEVT_DIRPICKER_CHANGED; } protected: void UpdateDialogPath(wxDialog *p) @@ -219,5 +214,8 @@ private: DECLARE_DYNAMIC_CLASS(wxGenericDirButton) }; +// old wxEVT_COMMAND_* constants +//#define wxEVT_COMMAND_DIRPICKER_CHANGED wxEVT_DIRPICKER_CHANGED +//#define wxEVT_COMMAND_FILEPICKER_CHANGED wxEVT_FILEPICKER_CHANGED #endif // _WX_FILEDIRPICKER_H_ diff --git a/Externals/wxWidgets3/include/wx/generic/fontdlgg.h b/Externals/wxWidgets3/include/wx/generic/fontdlgg.h index 9001d63e28..a16fa6e2e8 100644 --- a/Externals/wxWidgets3/include/wx/generic/fontdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/fontdlgg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: fontdlgg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/fontpickerg.h b/Externals/wxWidgets3/include/wx/generic/fontpickerg.h index 5145cc4c4a..8090450038 100644 --- a/Externals/wxWidgets3/include/wx/generic/fontpickerg.h +++ b/Externals/wxWidgets3/include/wx/generic/fontpickerg.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: fontpickerg.h 66615 2011-01-07 05:26:57Z PC $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/fswatcher.h b/Externals/wxWidgets3/include/wx/generic/fswatcher.h index a450810065..efd7631b47 100644 --- a/Externals/wxWidgets3/include/wx/generic/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/generic/fswatcher.h @@ -3,7 +3,6 @@ // Purpose: wxPollingFileSystemWatcher // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher.h 62474 2009-10-22 11:35:43Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/grid.h b/Externals/wxWidgets3/include/wx/generic/grid.h index 21b380023e..c58cec3742 100644 --- a/Externals/wxWidgets3/include/wx/generic/grid.h +++ b/Externals/wxWidgets3/include/wx/generic/grid.h @@ -4,7 +4,6 @@ // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) // Modified by: Santiago Palacios // Created: 1/08/1999 -// RCS-ID: $Id: grid.h 70825 2012-03-06 10:23:44Z SC $ // Copyright: (c) Michael Bedward // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -65,6 +64,20 @@ enum wxGridDirection wxGRID_ROW }; +// Flags used with wxGrid::Render() to select parts of the grid to draw. +enum wxGridRenderStyle +{ + wxGRID_DRAW_ROWS_HEADER = 0x001, + wxGRID_DRAW_COLS_HEADER = 0x002, + wxGRID_DRAW_CELL_LINES = 0x004, + wxGRID_DRAW_BOX_RECT = 0x008, + wxGRID_DRAW_SELECTION = 0x010, + wxGRID_DRAW_DEFAULT = wxGRID_DRAW_ROWS_HEADER | + wxGRID_DRAW_COLS_HEADER | + wxGRID_DRAW_CELL_LINES | + wxGRID_DRAW_BOX_RECT +}; + // ---------------------------------------------------------------------------- // forward declarations // ---------------------------------------------------------------------------- @@ -115,7 +128,7 @@ class WXDLLIMPEXP_ADV wxGridCellWorker : public wxClientDataContainer, public wx public: wxGridCellWorker() { } - // interpret renderer parameters: arbitrary string whose interpretatin is + // interpret renderer parameters: arbitrary string whose interpretation is // left to the derived classes virtual void SetParameters(const wxString& params); @@ -178,11 +191,11 @@ class WXDLLIMPEXP_ADV wxGridCellEditor : public wxGridCellWorker public: wxGridCellEditor(); - bool IsCreated() { return m_control != NULL; } - wxControl* GetControl() { return m_control; } + bool IsCreated() const { return m_control != NULL; } + wxControl* GetControl() const { return m_control; } void SetControl(wxControl* control) { m_control = control; } - wxGridCellAttr* GetCellAttr() { return m_attr; } + wxGridCellAttr* GetCellAttr() const { return m_attr; } void SetCellAttr(wxGridCellAttr* attr) { m_attr = attr; } // Creates the actual edit control @@ -199,7 +212,9 @@ public: // Draws the part of the cell not occupied by the control: the base class // version just fills it with background colour from the attribute - virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); // The methods called by wxGrid when a cell is edited: first BeginEdit() is @@ -811,7 +826,7 @@ public: // these are pure virtual in wxGridTableBase // - virtual int GetNumberRows() { return m_data.size(); } + virtual int GetNumberRows() { return static_cast(m_data.size()); } virtual int GetNumberCols() { return m_numCols; } virtual wxString GetValue( int row, int col ); virtual void SetValue( int row, int col, const wxString& s ); @@ -904,6 +919,15 @@ public: wxGridSelectRowsOrColumns = wxGridSelectRows | wxGridSelectColumns }; + // Different behaviour of the TAB key when the end (or the beginning, for + // Shift-TAB) of the current row is reached: + enum TabBehaviour + { + Tab_Stop, // Do nothing, this is default. + Tab_Wrap, // Move to the next (or previous) row. + Tab_Leave // Move to the next (or previous) control. + }; + // creation and destruction // ------------------------ @@ -1030,6 +1054,14 @@ public: int verticalAlignment = wxALIGN_TOP, int textOrientation = wxHORIZONTAL ) const; + // ------ grid render function for printing + // + void Render( wxDC& dc, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxGridCellCoords& topLeft = wxGridCellCoords(-1, -1), + const wxGridCellCoords& bottomRight = wxGridCellCoords(-1, -1), + int style = wxGRID_DRAW_DEFAULT ); // Split a string containing newline characters into an array of // strings and return the number of lines @@ -1150,6 +1182,8 @@ public: bool MoveCursorLeftBlock( bool expandSelection ); bool MoveCursorRightBlock( bool expandSelection ); + void SetTabBehaviour(TabBehaviour behaviour) { m_tabBehaviour = behaviour; } + // ------ label and gridline formatting // @@ -1335,13 +1369,13 @@ public: // ------ row and col sizes void SetDefaultRowSize( int height, bool resizeExistingRows = false ); void SetRowSize( int row, int height ); - void HideRow(int row) { SetRowSize(row, 0); } - void ShowRow(int row) { SetRowSize(row, -1); } + void HideRow(int row) { DoSetRowSize(row, 0); } + void ShowRow(int row) { DoSetRowSize(row, -1); } void SetDefaultColSize( int width, bool resizeExistingCols = false ); void SetColSize( int col, int width ); - void HideCol(int col) { SetColSize(col, 0); } - void ShowCol(int col) { SetColSize(col, -1); } + void HideCol(int col) { DoSetColSize(col, 0); } + void ShowCol(int col) { DoSetColSize(col, -1); } // the row and column sizes can be also set all at once using // wxGridSizesInfo which holds all of them at once @@ -2052,6 +2086,8 @@ protected: bool m_editable; // applies to whole grid bool m_cellEditCtrlEnabled; // is in-place edit currently shown? + TabBehaviour m_tabBehaviour; // determines how the TAB key behaves + void Init(); // common part of all ctors void Create(); void CreateColumnWindow(); @@ -2079,8 +2115,9 @@ protected: int SendEvent(const wxEventType evtType, const wxString& s = wxString()) { return SendEvent(evtType, m_currentCellCoords, s); } - // send wxEVT_GRID_{ROW,COL}_SIZE - void SendGridSizeEvent(wxEventType type, + // send wxEVT_GRID_{ROW,COL}_SIZE or wxEVT_GRID_COL_AUTO_SIZE, return true + // if the event was processed, false otherwise + bool SendGridSizeEvent(wxEventType type, int row, int col, const wxMouseEvent& mouseEv); @@ -2090,6 +2127,7 @@ protected: void OnKeyUp( wxKeyEvent& ); void OnChar( wxKeyEvent& ); void OnEraseBackground( wxEraseEvent& ); + void OnHideEditor( wxCommandEvent& ); bool SetCurrentCell( const wxGridCellCoords& coords ); @@ -2133,6 +2171,22 @@ private: // redraw the grid lines, should be called after changing their attributes void RedrawGridLines(); + // draw all grid lines in the given cell region (unlike the public + // DrawAllGridLines() which just draws all of them) + void DrawRangeGridLines(wxDC& dc, const wxRegion& reg, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight); + + // draw all lines from top to bottom row and left to right column in the + // rectangle determined by (top, left)-(bottom, right) -- but notice that + // the caller must have set up the clipping correctly, this rectangle is + // only used here for optimization + void DoDrawGridLines(wxDC& dc, + int top, int left, + int bottom, int right, + int topRow, int leftCol, + int bottomRight, int rightCol); + // common part of Clip{Horz,Vert}GridLines void DoClipGridLines(bool& var, bool clip); @@ -2203,6 +2257,8 @@ private: void DoEndDragResizeCol(const wxMouseEvent& event); void DoEndMoveCol(int pos); + // process a TAB keypress + void DoGridProcessTab(wxKeyboardState& kbdState); // common implementations of methods defined for both rows and columns void DeselectLine(int line, const wxGridOperations& oper); @@ -2236,6 +2292,35 @@ private: void DoDisableLineResize(int line, wxGridFixedIndicesSet *& setFixed); bool DoCanResizeLine(int line, const wxGridFixedIndicesSet *setFixed) const; + // Helper of Render(): get grid size, origin offset and fill cell arrays + void GetRenderSizes( const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + wxPoint& pointOffSet, wxSize& sizeGrid, + wxGridCellCoordsArray& renderCells, + wxArrayInt& arrayCols, wxArrayInt& arrayRows ); + + // Helper of Render(): set the scale to draw the cells at the right size. + void SetRenderScale( wxDC& dc, const wxPoint& pos, const wxSize& size, + const wxSize& sizeGrid ); + + // Helper of Render(): get render start position from passed parameter + wxPoint GetRenderPosition( wxDC& dc, const wxPoint& position ); + + // Helper of Render(): draws a box around the rendered area + void DoRenderBox( wxDC& dc, const int& style, + const wxPoint& pointOffSet, + const wxSize& sizeCellArea, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight ); + + // Implementation of public Set{Row,Col}Size() and {Hide,Show}{Row,Col}(). + // They interpret their height or width parameter slightly different from + // the public methods where -1 in it means "auto fit to the label" for the + // compatibility reasons. Here it means "show a previously hidden row or + // column" while 0 means "hide it" just as in the public methods. And any + // positive values are handled naturally, i.e. they just specify the size. + void DoSetRowSize( int row, int height ); + void DoSetColSize( int col, int width ); // these sets contain the indices of fixed, i.e. non-resizable @@ -2521,6 +2606,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_DCLICK, wxGridE wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_DCLICK, wxGridEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_ROW_SIZE, wxGridSizeEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SIZE, wxGridSizeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_AUTO_SIZE, wxGridSizeEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGING, wxGridEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGED, wxGridEvent ); @@ -2531,6 +2617,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_CREATED, wxGridEdit wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, wxGridEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, wxGridEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SORT, wxGridEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_TABBING, wxGridEvent ); typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); @@ -2571,6 +2658,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #define EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_DCLICK, id, fn) #define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn) #define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn) +#define EVT_GRID_CMD_COL_AUTO_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_AUTO_SIZE, id, fn) #define EVT_GRID_CMD_COL_MOVE(id, fn) wx__DECLARE_GRIDEVT(COL_MOVE, id, fn) #define EVT_GRID_CMD_COL_SORT(id, fn) wx__DECLARE_GRIDEVT(COL_SORT, id, fn) #define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn) @@ -2581,6 +2669,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) #define EVT_GRID_CMD_EDITOR_CREATED(id, fn) wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) #define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn) wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) +#define EVT_GRID_CMD_TABBING(id, fn) wx__DECLARE_GRIDEVT(TABBING, id, fn) // same as above but for any id (exists mainly for backwards compatibility but // then it's also true that you rarely have multiple grid in the same window) @@ -2594,6 +2683,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #define EVT_GRID_LABEL_RIGHT_DCLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_DCLICK(wxID_ANY, fn) #define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn) #define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_AUTO_SIZE(fn) EVT_GRID_CMD_COL_AUTO_SIZE(wxID_ANY, fn) #define EVT_GRID_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(wxID_ANY, fn) #define EVT_GRID_COL_SORT(fn) EVT_GRID_CMD_COL_SORT(wxID_ANY, fn) #define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn) @@ -2604,6 +2694,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #define EVT_GRID_EDITOR_HIDDEN(fn) EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) #define EVT_GRID_EDITOR_CREATED(fn) EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) #define EVT_GRID_CELL_BEGIN_DRAG(fn) EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) +#define EVT_GRID_TABBING(fn) EVT_GRID_CMD_TABBING(wxID_ANY, fn) // we used to have a single wxEVT_GRID_CELL_CHANGE event but it was split into // wxEVT_GRID_CELL_CHANGING and CHANGED ones in wx 2.9.0, however the CHANGED diff --git a/Externals/wxWidgets3/include/wx/generic/gridctrl.h b/Externals/wxWidgets3/include/wx/generic/gridctrl.h index 2cc9859025..efcb233c8d 100644 --- a/Externals/wxWidgets3/include/wx/generic/gridctrl.h +++ b/Externals/wxWidgets3/include/wx/generic/gridctrl.h @@ -4,7 +4,6 @@ // Author: Paul Gammans, Roger Gammans // Modified by: // Created: 11/04/2001 -// RCS-ID: $Id: gridctrl.h 69856 2011-11-28 13:23:33Z VZ $ // Copyright: (c) The Computer Surgery (paul@compsurg.co.uk) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -249,6 +248,28 @@ private: const wxRect& rect, int row, int col); + // Helper methods of GetTextLines() + + // Break a single logical line of text into several physical lines, all of + // which are added to the lines array. The lines are broken at maxWidth and + // the dc is used for measuring text extent only. + void BreakLine(wxDC& dc, + const wxString& logicalLine, + wxCoord maxWidth, + wxArrayString& lines); + + // Break a word, which is supposed to be wider than maxWidth, into several + // lines, which are added to lines array and the last, incomplete, of which + // is returned in line output parameter. + // + // Returns the width of the last line. + wxCoord BreakWord(wxDC& dc, + const wxString& word, + wxCoord maxWidth, + wxArrayString& lines, + wxString& line); + + }; #endif // wxUSE_GRID diff --git a/Externals/wxWidgets3/include/wx/generic/grideditors.h b/Externals/wxWidgets3/include/wx/generic/grideditors.h index c3309e0470..a81ab84c47 100644 --- a/Externals/wxWidgets3/include/wx/generic/grideditors.h +++ b/Externals/wxWidgets3/include/wx/generic/grideditors.h @@ -4,7 +4,6 @@ // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) // Modified by: Santiago Palacios // Created: 1/08/1999 -// RCS-ID: $Id: grideditors.h 70693 2012-02-25 23:49:55Z VZ $ // Copyright: (c) Michael Bedward // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -52,14 +51,16 @@ private: class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor { public: - wxGridCellTextEditor(); + wxEXPLICIT wxGridCellTextEditor(size_t maxChars = 0); virtual void Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler); virtual void SetSize(const wxRect& rect); - virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); virtual bool IsAcceptedKey(wxKeyEvent& event); virtual void BeginEdit(int row, int col, wxGrid* grid); @@ -73,9 +74,9 @@ public: // parameters string format is "max_width" virtual void SetParameters(const wxString& params); + virtual void SetValidator(const wxValidator& validator); - virtual wxGridCellEditor *Clone() const - { return new wxGridCellTextEditor; } + virtual wxGridCellEditor *Clone() const; // added GetValue so we can get the value which is in the control virtual wxString GetValue() const; @@ -90,8 +91,9 @@ protected: void DoReset(const wxString& startValue); private: - size_t m_maxChars; // max number of chars allowed - wxString m_value; + size_t m_maxChars; // max number of chars allowed + wxScopedPtr m_validator; + wxString m_value; wxDECLARE_NO_COPY_CLASS(wxGridCellTextEditor); }; @@ -297,7 +299,9 @@ public: virtual void SetSize(const wxRect& rect); - virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + virtual void PaintBackground(wxDC& dc, + const wxRect& rectCell, + const wxGridCellAttr& attr); virtual void BeginEdit(int row, int col, wxGrid* grid); virtual bool EndEdit(int row, int col, const wxGrid* grid, diff --git a/Externals/wxWidgets3/include/wx/generic/gridsel.h b/Externals/wxWidgets3/include/wx/generic/gridsel.h index 640e810af5..76135532c1 100644 --- a/Externals/wxWidgets3/include/wx/generic/gridsel.h +++ b/Externals/wxWidgets3/include/wx/generic/gridsel.h @@ -4,7 +4,6 @@ // Author: Stefan Neis // Modified by: // Created: 20/02/2000 -// RCS-ID: $Id: gridsel.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Stefan Neis // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/headerctrlg.h b/Externals/wxWidgets3/include/wx/generic/headerctrlg.h index a9246d2c8d..d2eceb2bfc 100644 --- a/Externals/wxWidgets3/include/wx/generic/headerctrlg.h +++ b/Externals/wxWidgets3/include/wx/generic/headerctrlg.h @@ -3,7 +3,6 @@ // Purpose: Generic wxHeaderCtrl implementation // Author: Vadim Zeitlin // Created: 2008-12-01 -// RCS-ID: $Id: headerctrlg.h 61024 2009-06-12 16:15:35Z RR $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -48,6 +47,10 @@ public: virtual ~wxHeaderCtrl(); +protected: + virtual wxSize DoGetBestSize() const; + + private: // implement base class pure virtuals virtual void DoSetCount(unsigned int count); @@ -59,9 +62,6 @@ private: virtual void DoSetColumnsOrder(const wxArrayInt& order); virtual wxArrayInt DoGetColumnsOrder() const; - // override wxWindow methods which must be implemented by a new control - virtual wxSize DoGetBestSize() const; - // common part of all ctors void Init(); @@ -116,7 +116,7 @@ private: // start (if m_colBeingResized is -1) or continue resizing the column // - // this generates wxEVT_COMMAND_HEADER_BEGIN_RESIZE/RESIZING events and can + // this generates wxEVT_HEADER_BEGIN_RESIZE/RESIZING events and can // cancel the operation if the user handler decides so void StartOrContinueResizing(unsigned int col, int xPhysical); diff --git a/Externals/wxWidgets3/include/wx/generic/helpext.h b/Externals/wxWidgets3/include/wx/generic/helpext.h index 19d7641062..fe0c3e7eb2 100644 --- a/Externals/wxWidgets3/include/wx/generic/helpext.h +++ b/Externals/wxWidgets3/include/wx/generic/helpext.h @@ -4,7 +4,6 @@ // Author: Karsten Ballueder (Ballueder@usa.net) // Modified by: // Copyright: (c) Karsten Ballueder 1998 -// RCS-ID: $Id: helpext.h 58227 2009-01-19 13:55:27Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/hyperlink.h b/Externals/wxWidgets3/include/wx/generic/hyperlink.h index c834a7fd3b..eb73388869 100644 --- a/Externals/wxWidgets3/include/wx/generic/hyperlink.h +++ b/Externals/wxWidgets3/include/wx/generic/hyperlink.h @@ -4,7 +4,6 @@ // Author: David Norris , Otto Wyss // Modified by: Ryan Norton, Francesco Montorsi // Created: 04/02/2005 -// RCS-ID: $Id: hyperlink.h 67948 2011-06-15 21:56:23Z VZ $ // Copyright: (c) 2005 David Norris // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/icon.h b/Externals/wxWidgets3/include/wx/generic/icon.h index 7d0f49e72c..7a336d37ce 100644 --- a/Externals/wxWidgets3/include/wx/generic/icon.h +++ b/Externals/wxWidgets3/include/wx/generic/icon.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 17/09/98 -// RCS-ID: $Id: icon.h 57692 2008-12-31 15:27:00Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/imaglist.h b/Externals/wxWidgets3/include/wx/generic/imaglist.h index a16ed15a76..8fc145e03f 100644 --- a/Externals/wxWidgets3/include/wx/generic/imaglist.h +++ b/Externals/wxWidgets3/include/wx/generic/imaglist.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// Id: $Id: imaglist.h 62789 2009-12-05 19:57:58Z PC $ // Copyright: (c) 1998 Robert Roebling and Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/infobar.h b/Externals/wxWidgets3/include/wx/generic/infobar.h index a7dd267ffa..781698ccc9 100644 --- a/Externals/wxWidgets3/include/wx/generic/infobar.h +++ b/Externals/wxWidgets3/include/wx/generic/infobar.h @@ -3,7 +3,6 @@ // Purpose: generic wxInfoBar class declaration // Author: Vadim Zeitlin // Created: 2009-07-28 -// RCS-ID: $Id: infobar.h 64213 2010-05-05 12:20:08Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/laywin.h b/Externals/wxWidgets3/include/wx/generic/laywin.h index 3f8e38c5c5..a38fd97fc1 100644 --- a/Externals/wxWidgets3/include/wx/generic/laywin.h +++ b/Externals/wxWidgets3/include/wx/generic/laywin.h @@ -7,7 +7,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: laywin.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/listctrl.h b/Externals/wxWidgets3/include/wx/generic/listctrl.h index 19622cac39..7e18eeccbf 100644 --- a/Externals/wxWidgets3/include/wx/generic/listctrl.h +++ b/Externals/wxWidgets3/include/wx/generic/listctrl.h @@ -3,7 +3,6 @@ // Purpose: Generic list control // Author: Robert Roebling // Created: 01/02/97 -// RCS-ID: $Id: listctrl.h 70282 2012-01-07 15:09:43Z VZ $ // Copyright: (c) 1998 Robert Roebling and Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -11,6 +10,7 @@ #ifndef _WX_GENERIC_LISTCTRL_H_ #define _WX_GENERIC_LISTCTRL_H_ +#include "wx/containr.h" #include "wx/scrolwin.h" #include "wx/textctrl.h" @@ -29,7 +29,7 @@ class WXDLLIMPEXP_FWD_CORE wxListMainWindow; // wxListCtrl //----------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxGenericListCtrl: public wxListCtrlBase, +class WXDLLIMPEXP_CORE wxGenericListCtrl: public wxNavigationEnabled, public wxScrollHelper { public: @@ -143,6 +143,8 @@ public: void RefreshItem(long item); void RefreshItems(long itemFrom, long itemTo); + virtual void EnableBellOnNoMatch(bool on = true); + #if WXWIN_COMPATIBILITY_2_6 // obsolete, don't use wxDEPRECATED( int GetItemSpacing( bool isSmall ) const ); @@ -188,7 +190,6 @@ public: #endif virtual bool ShouldInheritColours() const { return false; } - virtual void SetFocus(); // implementation // -------------- @@ -209,11 +210,6 @@ protected: virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); - // take into account the coordinates difference between the container - // window and the list control window itself here - virtual void DoClientToScreen( int *x, int *y ) const; - virtual void DoScreenToClient( int *x, int *y ) const; - virtual wxSize DoGetBestClientSize() const; // return the text for the given column of the given item @@ -227,9 +223,6 @@ protected: // return the icon for the given item and column. virtual int OnGetItemColumnImage(long item, long column) const; - // return the attribute for the item (may return NULL if none) - virtual wxListItemAttr *OnGetItemAttr(long item) const; - // it calls our OnGetXXX() functions friend class WXDLLIMPEXP_FWD_CORE wxListMainWindow; diff --git a/Externals/wxWidgets3/include/wx/generic/logg.h b/Externals/wxWidgets3/include/wx/generic/logg.h index 3ef9eacdc3..303b441e81 100644 --- a/Externals/wxWidgets3/include/wx/generic/logg.h +++ b/Externals/wxWidgets3/include/wx/generic/logg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: logg.h 67656 2011-04-30 10:57:04Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -127,9 +126,6 @@ public: wxFrame *GetFrame() const; // overridables - // called immediately after the log frame creation allowing for - // any extra initializations - virtual void OnFrameCreate(wxFrame *frame); // called if the user closes the window interactively, will not be // called if it is destroyed for another reason (such as when program // exits) - return true from here to allow the frame to close, false diff --git a/Externals/wxWidgets3/include/wx/generic/mask.h b/Externals/wxWidgets3/include/wx/generic/mask.h index 54969b8c23..f6aad1a86d 100644 --- a/Externals/wxWidgets3/include/wx/generic/mask.h +++ b/Externals/wxWidgets3/include/wx/generic/mask.h @@ -3,7 +3,6 @@ // Purpose: generic implementation of wxMask // Author: Vadim Zeitlin // Created: 2006-09-28 -// RCS-ID: $Id: mask.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/mdig.h b/Externals/wxWidgets3/include/wx/generic/mdig.h index ae8ba70cd6..7c433edc40 100644 --- a/Externals/wxWidgets3/include/wx/generic/mdig.h +++ b/Externals/wxWidgets3/include/wx/generic/mdig.h @@ -4,7 +4,6 @@ // Author: Hans Van Leemputten // Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes // Created: 29/07/2002 -// RCS-ID: $Id: mdig.h 59164 2009-02-26 16:16:31Z VZ $ // Copyright: (c) 2002 Hans Van Leemputten // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/generic/msgdlgg.h b/Externals/wxWidgets3/include/wx/generic/msgdlgg.h index 73fe48b4a7..66bd5484ea 100644 --- a/Externals/wxWidgets3/include/wx/generic/msgdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/msgdlgg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: msgdlgg.h 68537 2011-08-04 22:53:42Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/notebook.h b/Externals/wxWidgets3/include/wx/generic/notebook.h index e2c405e7ab..e328e0bfcf 100644 --- a/Externals/wxWidgets3/include/wx/generic/notebook.h +++ b/Externals/wxWidgets3/include/wx/generic/notebook.h @@ -3,7 +3,6 @@ // Purpose: wxNotebook class (a.k.a. property sheet, tabbed dialog) // Author: Julian Smart // Modified by: -// RCS-ID: $Id: notebook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/notifmsg.h b/Externals/wxWidgets3/include/wx/generic/notifmsg.h index e9f08ae1c4..1cd74ba7f0 100644 --- a/Externals/wxWidgets3/include/wx/generic/notifmsg.h +++ b/Externals/wxWidgets3/include/wx/generic/notifmsg.h @@ -3,7 +3,6 @@ // Purpose: generic implementation of wxGenericNotificationMessage // Author: Vadim Zeitlin // Created: 2007-11-24 -// RCS-ID: $Id: notifmsg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/numdlgg.h b/Externals/wxWidgets3/include/wx/generic/numdlgg.h index 24657fb77a..ac45ce915c 100644 --- a/Externals/wxWidgets3/include/wx/generic/numdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/numdlgg.h @@ -4,7 +4,6 @@ // Author: John Labenski // Modified by: // Created: 07.02.04 (extracted from textdlgg.cpp) -// RCS-ID: $Id: numdlgg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/paletteg.h b/Externals/wxWidgets3/include/wx/generic/paletteg.h index a0e396850a..0f6f5a4918 100644 --- a/Externals/wxWidgets3/include/wx/generic/paletteg.h +++ b/Externals/wxWidgets3/include/wx/generic/paletteg.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// RCS-ID: $Id: paletteg.h 50727 2007-12-15 17:54:20Z VZ $ // Copyright: (c) 1998 Robert Roebling and Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/panelg.h b/Externals/wxWidgets3/include/wx/generic/panelg.h index 79dfe85c5c..5c02cb35d8 100644 --- a/Externals/wxWidgets3/include/wx/generic/panelg.h +++ b/Externals/wxWidgets3/include/wx/generic/panelg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: panelg.h 70098 2011-12-23 05:59:59Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/printps.h b/Externals/wxWidgets3/include/wx/generic/printps.h index f6bf9bc68a..388307297c 100644 --- a/Externals/wxWidgets3/include/wx/generic/printps.h +++ b/Externals/wxWidgets3/include/wx/generic/printps.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: printps.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/private/grid.h b/Externals/wxWidgets3/include/wx/generic/private/grid.h index ab763a9c22..7ef99700cf 100644 --- a/Externals/wxWidgets3/include/wx/generic/private/grid.h +++ b/Externals/wxWidgets3/include/wx/generic/private/grid.h @@ -4,7 +4,6 @@ // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) // Modified by: Santiago Palacios // Created: 1/08/1999 -// RCS-ID: $Id: grid.h 69861 2011-11-28 19:15:59Z VZ $ // Copyright: (c) Michael Bedward // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,6 +15,10 @@ #if wxUSE_GRID +// Internally used (and hence intentionally not exported) event telling wxGrid +// to hide the currently shown editor. +wxDECLARE_EVENT( wxEVT_GRID_HIDE_EDITOR, wxCommandEvent ); + // ---------------------------------------------------------------------------- // array classes // ---------------------------------------------------------------------------- @@ -553,7 +556,7 @@ public: // NB: As GetLineAt(), currently this is always identity for rows. virtual int GetLinePos(const wxGrid *grid, int line) const = 0; - // Return the index of the line just before the given one. + // Return the index of the line just before the given one or wxNOT_FOUND. virtual int GetLineBefore(const wxGrid* grid, int line) const = 0; // Get the row or column label window @@ -626,7 +629,7 @@ public: { return line; } // TODO: implement row reordering virtual int GetLineBefore(const wxGrid* WXUNUSED(grid), int line) const - { return line ? line - 1 : line; } + { return line - 1; } virtual wxWindow *GetHeaderWindow(wxGrid *grid) const { return grid->GetGridRowLabelWindow(); } @@ -692,7 +695,10 @@ public: { return grid->GetColPos(line); } virtual int GetLineBefore(const wxGrid* grid, int line) const - { return grid->GetColAt(wxMax(0, grid->GetColPos(line) - 1)); } + { + int posBefore = grid->GetColPos(line) - 1; + return posBefore >= 0 ? grid->GetColAt(posBefore) : wxNOT_FOUND; + } virtual wxWindow *GetHeaderWindow(wxGrid *grid) const { return grid->GetGridColLabelWindow(); } diff --git a/Externals/wxWidgets3/include/wx/generic/private/listctrl.h b/Externals/wxWidgets3/include/wx/generic/private/listctrl.h index 3d7838a883..32afaada6f 100644 --- a/Externals/wxWidgets3/include/wx/generic/private/listctrl.h +++ b/Externals/wxWidgets3/include/wx/generic/private/listctrl.h @@ -1,9 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: wx/generic/listctrl.h +// Name: wx/generic/private/listctrl.h // Purpose: private definitions of wxListCtrl helpers // Author: Robert Roebling // Vadim Zeitlin (virtual list control support) -// Id: $Id: listctrl.h 70285 2012-01-07 15:09:54Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -336,22 +335,27 @@ protected: public: wxListHeaderWindow(); - wxListHeaderWindow( wxWindow *win, - wxWindowID id, - wxListMainWindow *owner, - const wxPoint &pos = wxDefaultPosition, - const wxSize &size = wxDefaultSize, - long style = 0, - const wxString &name = wxT("wxlistctrlcolumntitles") ); + // We provide only Create(), not the ctor, because we need to create the + // C++ object before creating the window, see the explanations in + // CreateOrDestroyHeaderWindowAsNeeded() + bool Create( wxWindow *win, + wxWindowID id, + wxListMainWindow *owner, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxT("wxlistctrlcolumntitles") ); virtual ~wxListHeaderWindow(); + // We never need focus as we don't have any keyboard interface. + virtual bool AcceptsFocus() const { return false; } + void DrawCurrent(); void AdjustDC( wxDC& dc ); void OnPaint( wxPaintEvent &event ); void OnMouse( wxMouseEvent &event ); - void OnSetFocus( wxFocusEvent &event ); // needs refresh bool m_dirty; @@ -388,6 +392,27 @@ public: void Notify(); }; +//----------------------------------------------------------------------------- +// wxListFindTimer (internal) +//----------------------------------------------------------------------------- + +class wxListFindTimer: public wxTimer +{ +public: + // reset the current prefix after half a second of inactivity + enum { DELAY = 500 }; + + wxListFindTimer( wxListMainWindow *owner ) + : m_owner(owner) + { + } + + virtual void Notify(); + +private: + wxListMainWindow *m_owner; +}; + //----------------------------------------------------------------------------- // wxListTextCtrlWrapper: wraps a wxTextCtrl to make it work for inline editing //----------------------------------------------------------------------------- @@ -448,10 +473,8 @@ public: wxListMainWindow(); wxListMainWindow( wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString &name = wxT("listctrlmainwindow") ); + const wxPoint& pos, + const wxSize& size ); virtual ~wxListMainWindow(); @@ -556,6 +579,11 @@ public: bool OnRenameAccept(size_t itemEdit, const wxString& value); void OnRenameCancelled(size_t itemEdit); + void OnFindTimer(); + // set whether or not to ring the find bell + // (does nothing on MSW - bell is always rung) + void EnableBellOnNoMatch( bool on ); + void OnMouse( wxMouseEvent &event ); // called to switch the selection from the current item to newCurrent, @@ -644,7 +672,7 @@ public: long FindItem( const wxPoint& pt ); long HitTest( int x, int y, int &flags ) const; void InsertItem( wxListItem &item ); - void InsertColumn( long col, const wxListItem &item ); + long InsertColumn( long col, const wxListItem &item ); int GetItemWidthWithImage(wxListItem * item); void SortItems( wxListCtrlCompare fn, wxIntPtr data ); @@ -729,6 +757,15 @@ protected: bool m_lastOnSame; wxTimer *m_renameTimer; + + // incremental search data + wxString m_findPrefix; + wxTimer *m_findTimer; + // This flag is set to 0 if the bell is disabled, 1 if it is enabled and -1 + // if it is globally enabled but has been temporarily disabled because we + // had already beeped for this particular search. + int m_findBell; + bool m_isCreated; int m_dragCount; wxPoint m_dragStart; @@ -779,6 +816,9 @@ protected: // force us to recalculate the range of visible lines void ResetVisibleLinesRange() { m_lineFrom = (size_t)-1; } + // find the first item starting with the given prefix after the given item + size_t PrefixFindItem(size_t item, const wxString& prefix) const; + // get the colour to be used for drawing the rules wxColour GetRuleColour() const { diff --git a/Externals/wxWidgets3/include/wx/generic/private/markuptext.h b/Externals/wxWidgets3/include/wx/generic/private/markuptext.h index e918dca7be..1d9569229e 100644 --- a/Externals/wxWidgets3/include/wx/generic/private/markuptext.h +++ b/Externals/wxWidgets3/include/wx/generic/private/markuptext.h @@ -3,7 +3,6 @@ // Purpose: Generic wxMarkupText class for managing text with markup. // Author: Vadim Zeitlin // Created: 2011-02-21 -// RCS-ID: $Id: markuptext.h 67064 2011-02-27 12:48:21Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/private/richtooltip.h b/Externals/wxWidgets3/include/wx/generic/private/richtooltip.h index 0ca479dadb..ad356f51f8 100644 --- a/Externals/wxWidgets3/include/wx/generic/private/richtooltip.h +++ b/Externals/wxWidgets3/include/wx/generic/private/richtooltip.h @@ -3,13 +3,12 @@ // Purpose: wxRichToolTipGenericImpl declaration. // Author: Vadim Zeitlin // Created: 2011-10-18 -// RCS-ID: $Id: richtooltip.h 69488 2011-10-20 16:20:19Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _WX_GENERIC_PRIVATE_RICHTOOLTIP_H_ -#define _GENERIC_PRIVATE_RICHTOOLTIP_H_ +#define _WX_GENERIC_PRIVATE_RICHTOOLTIP_H_ #include "wx/icon.h" #include "wx/colour.h" @@ -30,17 +29,19 @@ public: // This is pretty arbitrary, we could follow MSW and use some multiple // of double-click time here. m_timeout = 5000; + m_delay = 0; } virtual void SetBackgroundColour(const wxColour& col, const wxColour& colEnd); virtual void SetCustomIcon(const wxIcon& icon); virtual void SetStandardIcon(int icon); - virtual void SetTimeout(unsigned milliseconds); + virtual void SetTimeout(unsigned milliseconds, + unsigned millisecondsDelay = 0); virtual void SetTipKind(wxTipKind tipKind); virtual void SetTitleFont(const wxFont& font); - virtual void ShowFor(wxWindow* win); + virtual void ShowFor(wxWindow* win, const wxRect* rect = NULL); protected: wxString m_title, @@ -52,7 +53,8 @@ private: wxColour m_colStart, m_colEnd; - unsigned m_timeout; + unsigned m_timeout, + m_delay; wxTipKind m_tipKind; diff --git a/Externals/wxWidgets3/include/wx/generic/private/textmeasure.h b/Externals/wxWidgets3/include/wx/generic/private/textmeasure.h new file mode 100644 index 0000000000..2b31d02831 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/generic/private/textmeasure.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/private/textmeasure.h +// Purpose: Generic wxTextMeasure declaration. +// Author: Vadim Zeitlin +// Created: 2012-10-17 +// Copyright: (c) 1997-2012 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_PRIVATE_TEXTMEASURE_H_ +#define _WX_GENERIC_PRIVATE_TEXTMEASURE_H_ + +// ---------------------------------------------------------------------------- +// wxTextMeasure for the platforms without native support. +// ---------------------------------------------------------------------------- + +class wxTextMeasure : public wxTextMeasureBase +{ +public: + wxEXPLICIT wxTextMeasure(const wxDC *dc, const wxFont *font = NULL) + : wxTextMeasureBase(dc, font) {} + wxEXPLICIT wxTextMeasure(const wxWindow *win, const wxFont *font = NULL) + : wxTextMeasureBase(win, font) {} + +protected: + virtual void DoGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + virtual bool DoGetPartialTextExtents(const wxString& text, + wxArrayInt& widths, + double scaleX); + + wxDECLARE_NO_COPY_CLASS(wxTextMeasure); +}; + +#endif // _WX_GENERIC_PRIVATE_TEXTMEASURE_H_ diff --git a/Externals/wxWidgets3/include/wx/generic/private/timer.h b/Externals/wxWidgets3/include/wx/generic/private/timer.h index 0be9a3bfe8..6d96389ce8 100644 --- a/Externals/wxWidgets3/include/wx/generic/private/timer.h +++ b/Externals/wxWidgets3/include/wx/generic/private/timer.h @@ -2,7 +2,6 @@ // Name: wx/generic/private/timer.h // Purpose: Generic implementation of wxTimer class // Author: Vaclav Slavik -// Id: $Id: timer.h 50646 2007-12-12 01:35:53Z VZ $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/prntdlgg.h b/Externals/wxWidgets3/include/wx/generic/prntdlgg.h index e3317e1cc6..6c8f7bd5a7 100644 --- a/Externals/wxWidgets3/include/wx/generic/prntdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/prntdlgg.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: prntdlgg.h 70636 2012-02-20 21:55:55Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/progdlgg.h b/Externals/wxWidgets3/include/wx/generic/progdlgg.h index 38b69241db..d29452f1f0 100644 --- a/Externals/wxWidgets3/include/wx/generic/progdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/progdlgg.h @@ -4,7 +4,6 @@ // Author: Karsten Ballueder // Modified by: Francesco Montorsi // Created: 09.05.1999 -// RCS-ID: $Id: progdlgg.h 70512 2012-02-05 14:18:25Z VZ $ // Copyright: (c) Karsten Ballueder // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/propdlg.h b/Externals/wxWidgets3/include/wx/generic/propdlg.h index 307400265e..6cb63efad9 100644 --- a/Externals/wxWidgets3/include/wx/generic/propdlg.h +++ b/Externals/wxWidgets3/include/wx/generic/propdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2005-03-12 -// RCS-ID: $Id: propdlg.h 58579 2009-02-01 04:48:19Z SN $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/region.h b/Externals/wxWidgets3/include/wx/generic/region.h index d796becf1c..1c5048dbf2 100644 --- a/Externals/wxWidgets3/include/wx/generic/region.h +++ b/Externals/wxWidgets3/include/wx/generic/region.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004/04/12 -// RCS-ID: $Id: region.h 58738 2009-02-07 23:20:45Z KO $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/richmsgdlgg.h b/Externals/wxWidgets3/include/wx/generic/richmsgdlgg.h index 9d075ef767..5446f87fef 100644 --- a/Externals/wxWidgets3/include/wx/generic/richmsgdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/richmsgdlgg.h @@ -3,7 +3,6 @@ // Purpose: wxGenericRichMessageDialog // Author: Rickard Westerlund // Created: 2010-07-04 -// RCS-ID: $Id: richmsgdlgg.h 65356 2010-08-19 00:06:12Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/sashwin.h b/Externals/wxWidgets3/include/wx/generic/sashwin.h index 068911aa8b..e4f34d8296 100644 --- a/Externals/wxWidgets3/include/wx/generic/sashwin.h +++ b/Externals/wxWidgets3/include/wx/generic/sashwin.h @@ -6,7 +6,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: sashwin.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/scrolwin.h b/Externals/wxWidgets3/include/wx/generic/scrolwin.h index 35883b8bc1..863cdf923e 100644 --- a/Externals/wxWidgets3/include/wx/generic/scrolwin.h +++ b/Externals/wxWidgets3/include/wx/generic/scrolwin.h @@ -3,7 +3,6 @@ // Purpose: generic wxScrollHelper // Author: Vadim Zeitlin // Created: 2008-12-24 (replacing old file with the same name) -// RCS-ID: $Id: scrolwin.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -22,6 +21,7 @@ public: // implement base class pure virtuals virtual void AdjustScrollbars(); + virtual bool IsScrollbarShown(int orient) const; protected: virtual void DoScroll(int x, int y); diff --git a/Externals/wxWidgets3/include/wx/generic/spinctlg.h b/Externals/wxWidgets3/include/wx/generic/spinctlg.h index 36c777940e..a35cc8a4a4 100644 --- a/Externals/wxWidgets3/include/wx/generic/spinctlg.h +++ b/Externals/wxWidgets3/include/wx/generic/spinctlg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 28.10.99 -// RCS-ID: $Id: spinctlg.h 70432 2012-01-21 17:03:52Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -22,6 +21,8 @@ #if wxUSE_SPINBTN +#include "wx/compositewin.h" + class WXDLLIMPEXP_FWD_CORE wxSpinButton; class WXDLLIMPEXP_FWD_CORE wxTextCtrl; @@ -40,7 +41,8 @@ class wxSpinCtrlTextGeneric; // wxTextCtrl used for the wxSpinCtrlGenericBase // function ambiguity. // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase : public wxSpinCtrlBase +class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase + : public wxNavigationEnabled > { public: wxSpinCtrlGenericBase() { Init(); } @@ -85,6 +87,8 @@ public: virtual void DoSetToolTip(wxToolTip *tip); #endif // wxUSE_TOOLTIPS + virtual bool SetBackgroundColour(const wxColour& colour); + // get the subcontrols wxTextCtrl *GetText() const { return m_textCtrl; } wxSpinButton *GetSpinButton() const { return m_spinButton; } @@ -105,6 +109,7 @@ public: protected: // override the base class virtuals involved into geometry calculations virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; virtual void DoMoveWindow(int x, int y, int width, int height); #ifdef __WXMSW__ @@ -112,9 +117,15 @@ protected: virtual void DoEnable(bool enable); #endif // __WXMSW__ + enum SendEvent + { + SendEvent_None, + SendEvent_Text + }; + // generic double valued functions double DoGetValue() const { return m_value; } - bool DoSetValue(double val); + bool DoSetValue(double val, SendEvent sendEvent); void DoSetRange(double min_val, double max_val); void DoSetIncrement(double inc); @@ -124,11 +135,15 @@ protected: // can also change the text control if its value is invalid // // return true if our value has changed - bool SyncSpinToText(); + bool SyncSpinToText(SendEvent sendEvent); // Send the correct event type virtual void DoSendEvent() = 0; + // Convert the text to/from the corresponding value. + virtual bool DoTextToValue(const wxString& text, double *val) = 0; + virtual wxString DoValueToText(double val) = 0; + // check if the value is in range bool InRange(double n) const { return (n >= m_min) && (n <= m_max); } @@ -141,7 +156,6 @@ protected: double m_max; double m_increment; bool m_snap_to_ticks; - wxString m_format; int m_spin_value; @@ -153,6 +167,9 @@ private: // common part of all ctors void Init(); + // Implement pure virtual function inherited from wxCompositeWindow. + virtual wxWindowList GetCompositeWindowParts() const; + DECLARE_EVENT_TABLE() }; @@ -190,7 +207,7 @@ public: bool ok = wxTextCtrl::Create(parent, id, value, pos, size, style, wxDefaultValidator, name); - DoSetValue(initial); + DoSetValue(initial, SendEvent_None); return ok; } @@ -226,9 +243,20 @@ protected: return n; } - bool DoSetValue(double val) + bool DoSetValue(double val, SendEvent sendEvent) { - wxTextCtrl::SetValue(wxString::Format(m_format.c_str(), val)); + wxString str(wxString::Format(m_format, val)); + switch ( sendEvent ) + { + case SendEvent_None: + wxTextCtrl::ChangeValue(str); + break; + + case SendEvent_Text: + wxTextCtrl::SetValue(str); + break; + } + return true; } void DoSetRange(double min_val, double max_val) @@ -257,7 +285,7 @@ protected: class WXDLLIMPEXP_CORE wxSpinCtrl : public wxSpinCtrlGenericBase { public: - wxSpinCtrl() {} + wxSpinCtrl() { Init(); } wxSpinCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxString& value = wxEmptyString, @@ -267,6 +295,8 @@ public: int min = 0, int max = 100, int initial = 0, const wxString& name = wxT("wxSpinCtrl")) { + Init(); + Create(parent, id, value, pos, size, style, min, max, initial, name); } @@ -292,13 +322,28 @@ public: // operations void SetValue(const wxString& value) { wxSpinCtrlGenericBase::SetValue(value); } - void SetValue( int value ) { DoSetValue(value); } + void SetValue( int value ) { DoSetValue(value, SendEvent_None); } void SetRange( int minVal, int maxVal ) { DoSetRange(minVal, maxVal); } void SetIncrement(int inc) { DoSetIncrement(inc); } + virtual int GetBase() const { return m_base; } + virtual bool SetBase(int base); + protected: virtual void DoSendEvent(); + virtual bool DoTextToValue(const wxString& text, double *val); + virtual wxString DoValueToText(double val); + +private: + // Common part of all ctors. + void Init() + { + m_base = 10; + } + + int m_base; + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) }; @@ -311,7 +356,7 @@ protected: class WXDLLIMPEXP_CORE wxSpinCtrlDouble : public wxSpinCtrlGenericBase { public: - wxSpinCtrlDouble() : m_digits(0) { } + wxSpinCtrlDouble() { Init(); } wxSpinCtrlDouble(wxWindow *parent, wxWindowID id = wxID_ANY, const wxString& value = wxEmptyString, @@ -322,7 +367,8 @@ public: double inc = 1, const wxString& name = wxT("wxSpinCtrlDouble")) { - m_digits = 0; + Init(); + Create(parent, id, value, pos, size, style, min, max, initial, inc, name); } @@ -352,16 +398,34 @@ public: // operations void SetValue(const wxString& value) { wxSpinCtrlGenericBase::SetValue(value); } - void SetValue(double value) { DoSetValue(value); } + void SetValue(double value) { DoSetValue(value, SendEvent_None); } void SetRange(double minVal, double maxVal) { DoSetRange(minVal, maxVal); } void SetIncrement(double inc) { DoSetIncrement(inc); } void SetDigits(unsigned digits); + // We don't implement bases support for floating point numbers, this is not + // very useful in practice. + virtual int GetBase() const { return 10; } + virtual bool SetBase(int WXUNUSED(base)) { return 0; } + protected: virtual void DoSendEvent(); + virtual bool DoTextToValue(const wxString& text, double *val); + virtual wxString DoValueToText(double val); + unsigned m_digits; +private: + // Common part of all ctors. + void Init() + { + m_digits = 0; + m_format = wxS("%g"); + } + + wxString m_format; + DECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble) }; diff --git a/Externals/wxWidgets3/include/wx/generic/splash.h b/Externals/wxWidgets3/include/wx/generic/splash.h index a98704a639..24ad733d5d 100644 --- a/Externals/wxWidgets3/include/wx/generic/splash.h +++ b/Externals/wxWidgets3/include/wx/generic/splash.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 28/6/2000 -// RCS-ID: $Id: splash.h 69796 2011-11-22 13:18:55Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/splitter.h b/Externals/wxWidgets3/include/wx/generic/splitter.h index 47bdebceed..61128a3959 100644 --- a/Externals/wxWidgets3/include/wx/generic/splitter.h +++ b/Externals/wxWidgets3/include/wx/generic/splitter.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: splitter.h 70840 2012-03-08 13:23:39Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -212,7 +211,7 @@ public: virtual void DrawSashTracker(int x, int y); // Tests for x, y over sash - virtual bool SashHitTest(int x, int y, int tolerance = 5); + virtual bool SashHitTest(int x, int y); // Resizes subwindows virtual void SizeWindows(); @@ -334,16 +333,16 @@ public: // all void SetSashPosition(int pos) { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED - || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); m_data.pos = pos; } int GetSashPosition() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED - || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); return m_data.pos; } @@ -351,7 +350,7 @@ public: // UNSPLIT event methods wxWindow *GetWindowBeingRemoved() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_UNSPLIT ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_UNSPLIT ); return m_data.win; } @@ -359,14 +358,14 @@ public: // DCLICK event methods int GetX() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); return m_data.pt.x; } int GetY() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); return m_data.pt.y; } @@ -396,7 +395,7 @@ typedef void (wxEvtHandler::*wxSplitterEventFunction)(wxSplitterEvent&); wxEVENT_HANDLER_CAST(wxSplitterEventFunction, func) #define wx__DECLARE_SPLITTEREVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_SPLITTER_ ## evt, id, wxSplitterEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_SPLITTER_ ## evt, id, wxSplitterEventHandler(fn)) #define EVT_SPLITTER_SASH_POS_CHANGED(id, fn) \ wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGED, id, fn) @@ -410,4 +409,11 @@ typedef void (wxEvtHandler::*wxSplitterEventFunction)(wxSplitterEvent&); #define EVT_SPLITTER_UNSPLIT(id, fn) \ wx__DECLARE_SPLITTEREVT(UNSPLIT, id, fn) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED wxEVT_SPLITTER_SASH_POS_CHANGED +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING wxEVT_SPLITTER_SASH_POS_CHANGING +#define wxEVT_COMMAND_SPLITTER_DOUBLECLICKED wxEVT_SPLITTER_DOUBLECLICKED +#define wxEVT_COMMAND_SPLITTER_UNSPLIT wxEVT_SPLITTER_UNSPLIT + #endif // _WX_GENERIC_SPLITTER_H_ diff --git a/Externals/wxWidgets3/include/wx/generic/srchctlg.h b/Externals/wxWidgets3/include/wx/generic/srchctlg.h index 864efcd142..c61ddee751 100644 --- a/Externals/wxWidgets3/include/wx/generic/srchctlg.h +++ b/Externals/wxWidgets3/include/wx/generic/srchctlg.h @@ -3,7 +3,6 @@ // Purpose: generic wxSearchCtrl class // Author: Vince Harron // Created: 2006-02-19 -// RCS-ID: $Id: srchctlg.h 68911 2011-08-27 12:13:23Z VZ $ // Copyright: Vince Harron // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -219,7 +218,7 @@ protected: virtual wxBitmap RenderSearchBitmap( int x, int y, bool renderDrop ); virtual wxBitmap RenderCancelBitmap( int x, int y ); - virtual void OnSearchButton( wxCommandEvent& event ); + void OnCancelButton( wxCommandEvent& event ); void OnSetFocus( wxFocusEvent& event ); void OnSize( wxSizeEvent& event ); diff --git a/Externals/wxWidgets3/include/wx/generic/statbmpg.h b/Externals/wxWidgets3/include/wx/generic/statbmpg.h index 930e3943b9..8a8fa15dfd 100644 --- a/Externals/wxWidgets3/include/wx/generic/statbmpg.h +++ b/Externals/wxWidgets3/include/wx/generic/statbmpg.h @@ -3,7 +3,6 @@ // Purpose: wxGenericStaticBitmap header // Author: Marcin Wojdyr, Stefan Csomor // Created: 2008-06-16 -// RCS-ID: $Id: statbmpg.h 67681 2011-05-03 16:29:04Z DS $ // Copyright: wxWidgets developers // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/statline.h b/Externals/wxWidgets3/include/wx/generic/statline.h index 8a9fee1b1e..8a7ccbf088 100644 --- a/Externals/wxWidgets3/include/wx/generic/statline.h +++ b/Externals/wxWidgets3/include/wx/generic/statline.h @@ -3,7 +3,6 @@ // Purpose: a generic wxStaticLine class // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/stattextg.h b/Externals/wxWidgets3/include/wx/generic/stattextg.h index 306b59217a..918a4f4eb3 100644 --- a/Externals/wxWidgets3/include/wx/generic/stattextg.h +++ b/Externals/wxWidgets3/include/wx/generic/stattextg.h @@ -3,7 +3,6 @@ // Purpose: wxGenericStaticText header // Author: Marcin Wojdyr // Created: 2008-06-26 -// Id: $Id: stattextg.h 67067 2011-02-27 12:48:38Z VZ $ // Copyright: Marcin Wojdyr // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/statusbr.h b/Externals/wxWidgets3/include/wx/generic/statusbr.h index dc2a3f88a4..bff20807e3 100644 --- a/Externals/wxWidgets3/include/wx/generic/statusbr.h +++ b/Externals/wxWidgets3/include/wx/generic/statusbr.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: VZ at 05.02.00 to derive from wxStatusBarBase // Created: 01/02/97 -// RCS-ID: $Id: statusbr.h 67384 2011-04-03 20:31:32Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -91,8 +90,9 @@ protected: // common part of all ctors void Init(); - // the last known height of the client rect - int m_lastClientHeight; + // the last known size, fields widths must be updated whenever it's out of + // date + wxSize m_lastClientSize; // the absolute widths of the status bar panes in pixels wxArrayInt m_widthsAbs; @@ -106,6 +106,9 @@ protected: virtual wxSize DoGetBestSize() const; private: + // Update m_lastClientSize and m_widthsAbs from the current size. + void DoUpdateFieldWidths(); + DECLARE_EVENT_TABLE() DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric) }; diff --git a/Externals/wxWidgets3/include/wx/generic/tabg.h b/Externals/wxWidgets3/include/wx/generic/tabg.h index ea21a32a6d..d376b3b510 100644 --- a/Externals/wxWidgets3/include/wx/generic/tabg.h +++ b/Externals/wxWidgets3/include/wx/generic/tabg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: tabg.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/textdlgg.h b/Externals/wxWidgets3/include/wx/generic/textdlgg.h index f27e0b0296..023d497c30 100644 --- a/Externals/wxWidgets3/include/wx/generic/textdlgg.h +++ b/Externals/wxWidgets3/include/wx/generic/textdlgg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: textdlgg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,16 +36,33 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxGetPasswordFromUserPromptStr[]; class WXDLLIMPEXP_CORE wxTextEntryDialog : public wxDialog { public: + wxTextEntryDialog() + { + m_textctrl = NULL; + } + wxTextEntryDialog(wxWindow *parent, const wxString& message, const wxString& caption = wxGetTextFromUserPromptStr, const wxString& value = wxEmptyString, long style = wxTextEntryDialogStyle, - const wxPoint& pos = wxDefaultPosition); + const wxPoint& pos = wxDefaultPosition) + { + Create(parent, message, caption, value, style, pos); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); void SetValue(const wxString& val); wxString GetValue() const { return m_value; } + void SetMaxLength(unsigned long len); + #if wxUSE_VALIDATORS void SetTextValidator( const wxTextValidator& validator ); #if WXWIN_COMPATIBILITY_2_8 @@ -54,8 +70,10 @@ public: #endif void SetTextValidator( wxTextValidatorStyle style = wxFILTER_NONE ); wxTextValidator* GetTextValidator() { return (wxTextValidator*)m_textctrl->GetValidator(); } -#endif - // wxUSE_VALIDATORS +#endif // wxUSE_VALIDATORS + + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); // implementation only void OnOK(wxCommandEvent& event); diff --git a/Externals/wxWidgets3/include/wx/generic/timectrl.h b/Externals/wxWidgets3/include/wx/generic/timectrl.h index c04ab8f254..20b02498bd 100644 --- a/Externals/wxWidgets3/include/wx/generic/timectrl.h +++ b/Externals/wxWidgets3/include/wx/generic/timectrl.h @@ -3,7 +3,6 @@ // Purpose: Generic implementation of wxTimePickerCtrl. // Author: Paul Breen, Vadim Zeitlin // Created: 2011-09-22 -// RCS-ID: $Id: timectrl.h 69489 2011-10-20 16:45:48Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/generic/treectlg.h b/Externals/wxWidgets3/include/wx/generic/treectlg.h index 45be6d54a9..53b3942835 100644 --- a/Externals/wxWidgets3/include/wx/generic/treectlg.h +++ b/Externals/wxWidgets3/include/wx/generic/treectlg.h @@ -4,7 +4,6 @@ // Author: Robert Roebling // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: treectlg.h 65587 2010-09-22 10:06:39Z SJL $ // Copyright: (c) 1997,1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -65,7 +64,6 @@ public: const wxValidator &validator = wxDefaultValidator, const wxString& name = wxTreeCtrlNameStr); - // implement base class pure virtuals // ---------------------------------- @@ -169,6 +167,8 @@ public: virtual void EndEditLabel(const wxTreeItemId& item, bool discardChanges = false); + virtual void EnableBellOnNoMatch(bool on = true); + virtual void SortChildren(const wxTreeItemId& item); // items geometry @@ -275,6 +275,10 @@ protected: // incremental search data wxString m_findPrefix; wxTimer *m_findTimer; + // This flag is set to 0 if the bell is disabled, 1 if it is enabled and -1 + // if it is globally enabled but has been temporarily disabled because we + // had already beeped for this particular search. + int m_findBell; bool m_dropEffectAboveItem; @@ -352,6 +356,10 @@ protected: virtual wxSize DoGetBestSize() const; private: + // Reset the state of the last find (i.e. keyboard incremental search) + // operation. + void ResetFindState(); + DECLARE_EVENT_TABLE() DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl) wxDECLARE_NO_COPY_CLASS(wxGenericTreeCtrl); diff --git a/Externals/wxWidgets3/include/wx/generic/wizard.h b/Externals/wxWidgets3/include/wx/generic/wizard.h index 4f5e2ef67c..2161870077 100644 --- a/Externals/wxWidgets3/include/wx/generic/wizard.h +++ b/Externals/wxWidgets3/include/wx/generic/wizard.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Robert Vazan (sizers) // Created: 28.09.99 -// RCS-ID: $Id: wizard.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/geometry.h b/Externals/wxWidgets3/include/wx/geometry.h index d8981c5756..37d3a74539 100644 --- a/Externals/wxWidgets3/include/wx/geometry.h +++ b/Externals/wxWidgets3/include/wx/geometry.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 08/05/99 -// RCS-ID: $Id: geometry.h 70493 2012-01-31 19:39:43Z VZ $ // Copyright: (c) 1999 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -526,9 +525,9 @@ public: */ // single attribute accessors - inline wxPoint2DDouble GetPosition() + wxPoint2DDouble GetPosition() const { return wxPoint2DDouble(m_x, m_y); } - inline wxSize GetSize() + wxSize GetSize() const { return wxSize((int) m_width, (int) m_height); } // for the edge and corner accessors there are two setters counterparts, the Set.. functions keep the other corners at their @@ -655,8 +654,8 @@ public: // single attribute accessors - inline wxPoint2DInt GetPosition() { return wxPoint2DInt(m_x, m_y); } - inline wxSize GetSize() { return wxSize(m_width, m_height); } + wxPoint2DInt GetPosition() const { return wxPoint2DInt(m_x, m_y); } + wxSize GetSize() const { return wxSize(m_width, m_height); } // for the edge and corner accessors there are two setters counterparts, the Set.. functions keep the other corners at their // position whenever sensible, the Move.. functions keep the size of the rect and move the other corners appropriately @@ -778,7 +777,7 @@ inline bool wxRect2DInt::operator != (const wxRect2DInt& rect) const return !(*this == rect); } -class wxTransform2D +class WXDLLIMPEXP_CORE wxTransform2D { public : virtual ~wxTransform2D() { } @@ -793,24 +792,6 @@ public : virtual wxRect2DInt InverseTransform( const wxRect2DInt &r ) const ; }; -inline void wxTransform2D::Transform( wxRect2DInt* r ) const - { wxPoint2DInt a = r->GetLeftTop() , b = r->GetRightBottom(); Transform( &a ); Transform( &b ); *r = wxRect2DInt( a , b ); } - -inline wxPoint2DInt wxTransform2D::Transform( const wxPoint2DInt &pt ) const - { wxPoint2DInt res = pt; Transform( &res ); return res; } - -inline wxRect2DInt wxTransform2D::Transform( const wxRect2DInt &r ) const - { wxRect2DInt res = r; Transform( &res ); return res; } - -inline void wxTransform2D::InverseTransform( wxRect2DInt* r ) const - { wxPoint2DInt a = r->GetLeftTop() , b = r->GetRightBottom(); InverseTransform( &a ); InverseTransform( &b ); *r = wxRect2DInt( a , b ); } - -inline wxPoint2DInt wxTransform2D::InverseTransform( const wxPoint2DInt &pt ) const - { wxPoint2DInt res = pt; InverseTransform( &res ); return res; } - -inline wxRect2DInt wxTransform2D::InverseTransform( const wxRect2DInt &r ) const - { wxRect2DInt res = r; InverseTransform( &res ); return res; } - #endif // wxUSE_GEOMETRY diff --git a/Externals/wxWidgets3/include/wx/gifdecod.h b/Externals/wxWidgets3/include/wx/gifdecod.h index 01b5e96d7f..f0b84fc4bf 100644 --- a/Externals/wxWidgets3/include/wx/gifdecod.h +++ b/Externals/wxWidgets3/include/wx/gifdecod.h @@ -3,7 +3,6 @@ // Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation // Author: Guillermo Rodriguez Garcia // Version: 3.02 -// CVS-ID: $Id: gifdecod.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 1999 Guillermo Rodriguez Garcia // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/glcanvas.h b/Externals/wxWidgets3/include/wx/glcanvas.h index c0ae3dbdf9..688d4788b0 100644 --- a/Externals/wxWidgets3/include/wx/glcanvas.h +++ b/Externals/wxWidgets3/include/wx/glcanvas.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: glcanvas.h 70165 2011-12-29 14:42:13Z SN $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/graphics.h b/Externals/wxWidgets3/include/wx/graphics.h index 0b2420faa8..46f60b6884 100644 --- a/Externals/wxWidgets3/include/wx/graphics.h +++ b/Externals/wxWidgets3/include/wx/graphics.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Stefan Csomor -// RCS-ID: $Id: graphics.h 69485 2011-10-20 04:49:12Z RD $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -107,6 +106,7 @@ class WXDLLIMPEXP_FWD_CORE wxGraphicsBitmap; // class WXDLLIMPEXP_FWD_CORE wxGraphicsObjectRefData; +class WXDLLIMPEXP_FWD_CORE wxGraphicsBitmapData; class WXDLLIMPEXP_FWD_CORE wxGraphicsMatrixData; class WXDLLIMPEXP_FWD_CORE wxGraphicsPathData; @@ -174,6 +174,13 @@ public: #if wxUSE_IMAGE wxImage ConvertToImage() const; #endif // wxUSE_IMAGE + + void* GetNativeBitmap() const; + + const wxGraphicsBitmapData* GetBitmapData() const + { return (const wxGraphicsBitmapData*) GetRefData(); } + wxGraphicsBitmapData* GetBitmapData() + { return (wxGraphicsBitmapData*) GetRefData(); } private: DECLARE_DYNAMIC_CLASS(wxGraphicsBitmap) @@ -390,7 +397,7 @@ public: void Add(wxColour col, float pos) { Add(wxGraphicsGradientStop(col, pos)); } // Get the number of stops. - unsigned GetCount() const { return m_stops.size(); } + size_t GetCount() const { return m_stops.size(); } // Return the stop at the given index (which must be valid). wxGraphicsGradientStop Item(unsigned n) const { return m_stops.at(n); } @@ -510,6 +517,16 @@ public: virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, wxDouble tx=0.0, wxDouble ty=0.0) const; + wxGraphicsMatrix CreateMatrix( const wxAffineMatrix2DBase& mat ) const + { + wxMatrix2D mat2D; + wxPoint2DDouble tr; + mat.Get(&mat2D, &tr); + + return CreateMatrix(mat2D.m_11, mat2D.m_12, mat2D.m_21, mat2D.m_22, + tr.m_x, tr.m_y); + } + // push the current state of the context, ie the transformation matrix on a stack virtual void PushState() = 0; @@ -547,7 +564,7 @@ public: virtual bool SetCompositionMode(wxCompositionMode op) = 0; // returns the size of the graphics context in device coordinates - void GetSize(wxDouble* width, wxDouble* height) + void GetSize(wxDouble* width, wxDouble* height) const { if ( width ) *width = m_width; diff --git a/Externals/wxWidgets3/include/wx/grid.h b/Externals/wxWidgets3/include/wx/grid.h index 406cd3533c..02055658ed 100644 --- a/Externals/wxWidgets3/include/wx/grid.h +++ b/Externals/wxWidgets3/include/wx/grid.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: grid.h 58510 2009-01-30 09:08:37Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/accel.h b/Externals/wxWidgets3/include/wx/gtk/accel.h index e2107d9e61..09ffb61cc1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/accel.h +++ b/Externals/wxWidgets3/include/wx/gtk/accel.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: accel.h 33948 2005-05-04 18:57:50Z JS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/animate.h b/Externals/wxWidgets3/include/wx/gtk/animate.h index b48fb3a543..1cda545a41 100644 --- a/Externals/wxWidgets3/include/wx/gtk/animate.h +++ b/Externals/wxWidgets3/include/wx/gtk/animate.h @@ -4,7 +4,6 @@ // Author: Julian Smart and Guillermo Rodriguez Garcia // Modified by: Francesco Montorsi // Created: 13/8/99 -// RCS-ID: $Id: animate.h 70520 2012-02-05 22:53:39Z SN $ // Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -95,8 +94,6 @@ public: Create(parent, id, anim, pos, size, style, name); } - void Init(); - bool Create(wxWindow *parent, wxWindowID id, const wxAnimation& anim = wxNullAnimation, const wxPoint& pos = wxDefaultPosition, @@ -146,6 +143,9 @@ protected: // internal vars private: typedef wxAnimationCtrlBase base_type; + + void Init(); + DECLARE_DYNAMIC_CLASS(wxAnimationCtrl) DECLARE_EVENT_TABLE() }; diff --git a/Externals/wxWidgets3/include/wx/gtk/anybutton.h b/Externals/wxWidgets3/include/wx/gtk/anybutton.h index 7dee3e096d..604c72c72a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/anybutton.h +++ b/Externals/wxWidgets3/include/wx/gtk/anybutton.h @@ -3,7 +3,6 @@ // Purpose: wxGTK wxAnyButton class declaration // Author: Robert Roebling // Created: 1998-05-20 (extracted from button.h) -// Id: $Id: anybutton.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/app.h b/Externals/wxWidgets3/include/wx/gtk/app.h index 00028aca9d..6f112a3c88 100644 --- a/Externals/wxWidgets3/include/wx/gtk/app.h +++ b/Externals/wxWidgets3/include/wx/gtk/app.h @@ -2,7 +2,6 @@ // Name: wx/gtk/app.h // Purpose: wxApp definition for wxGTK // Author: Robert Roebling -// Id: $Id: app.h 69020 2011-09-07 16:56:50Z PC $ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -56,6 +55,13 @@ public: // must return XVisualInfo pointer (it is not freed by caller) virtual void *GetXVisualInfo() { return NULL; } + // Check if we're using a global menu. Currently this is only true when + // running under Ubuntu Unity and global menu is not disabled. + // + // This is mostly used in the implementation in order to work around + // various bugs arising due to this. + static bool GTKIsUsingGlobalMenu(); + #if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 // Maemo-specific method: get the main program object HildonProgram *GetHildonProgram(); diff --git a/Externals/wxWidgets3/include/wx/gtk/assertdlg_gtk.h b/Externals/wxWidgets3/include/wx/gtk/assertdlg_gtk.h index 91197215b6..098e9b1123 100644 --- a/Externals/wxWidgets3/include/wx/gtk/assertdlg_gtk.h +++ b/Externals/wxWidgets3/include/wx/gtk/assertdlg_gtk.h @@ -2,7 +2,6 @@ // Name: wx/gtk/assertdlg_gtk.h // Purpose: GtkAssertDialog // Author: Francesco Montorsi -// Id: $Id: assertdlg_gtk.h 67338 2011-03-30 05:35:24Z PC $ // Copyright: (c) 2006 Francesco Montorsi // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////// */ @@ -72,7 +71,6 @@ void gtk_assert_dialog_set_backtrace_callback(GtkAssertDialog *assertdlg, /* appends a stack frame to the dialog */ void gtk_assert_dialog_append_stack_frame(GtkAssertDialog *dlg, const gchar *function, - const gchar *arguments, const gchar *sourcefile, guint line_number); diff --git a/Externals/wxWidgets3/include/wx/gtk/bitmap.h b/Externals/wxWidgets3/include/wx/gtk/bitmap.h index a6e6634320..42e2d4d4d3 100644 --- a/Externals/wxWidgets3/include/wx/gtk/bitmap.h +++ b/Externals/wxWidgets3/include/wx/gtk/bitmap.h @@ -2,7 +2,6 @@ // Name: wx/gtk/bitmap.h // Purpose: // Author: Robert Roebling -// RCS-ID: $Id: bitmap.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,6 +9,10 @@ #ifndef _WX_GTK_BITMAP_H_ #define _WX_GTK_BITMAP_H_ +#ifdef __WXGTK3__ +typedef struct _cairo cairo_t; +typedef struct _cairo_surface cairo_surface_t; +#endif typedef struct _GdkPixbuf GdkPixbuf; class WXDLLIMPEXP_FWD_CORE wxPixelDataBase; @@ -28,16 +31,29 @@ public: #endif // wxUSE_PALETTE wxMask( const wxBitmap& bitmap ); virtual ~wxMask(); + wxBitmap GetBitmap() const; // implementation - GdkPixmap* m_bitmap; - GdkPixmap* GetBitmap() const; +#ifdef __WXGTK3__ + wxMask(cairo_surface_t*); + operator cairo_surface_t*() const; +#else + wxMask(GdkPixmap*); + operator GdkPixmap*() const; +#endif protected: virtual void FreeData(); virtual bool InitFromColour(const wxBitmap& bitmap, const wxColour& colour); virtual bool InitFromMonoBitmap(const wxBitmap& bitmap); +private: +#ifdef __WXGTK3__ + cairo_surface_t* m_bitmap; +#else + GdkPixmap* m_bitmap; +#endif + DECLARE_DYNAMIC_CLASS(wxMask) }; @@ -62,14 +78,17 @@ public: #endif wxBitmap( const wxString &filename, wxBitmapType type = wxBITMAP_DEFAULT_TYPE ); #if wxUSE_IMAGE - wxBitmap( const wxImage& image, int depth = wxBITMAP_SCREEN_DEPTH ) - { (void)CreateFromImage(image, depth); } + wxBitmap(const wxImage& image, int depth = wxBITMAP_SCREEN_DEPTH); #endif // wxUSE_IMAGE + wxBitmap(GdkPixbuf* pixbuf, int depth = 0); virtual ~wxBitmap(); bool Create(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH); bool Create(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH) { return Create(sz.GetWidth(), sz.GetHeight(), depth); } + bool Create(int width, int height, const wxDC& WXUNUSED(dc)) + { return Create(width,height); } + virtual int GetHeight() const; virtual int GetWidth() const; @@ -84,6 +103,7 @@ public: wxMask *GetMask() const; void SetMask( wxMask *mask ); + wxBitmap GetMaskBitmap() const; wxBitmap GetSubBitmap( const wxRect& rect ) const; @@ -105,11 +125,18 @@ public: void SetHeight( int height ); void SetWidth( int width ); void SetDepth( int depth ); - void SetPixbuf(GdkPixbuf* pixbuf); +#ifdef __WXGTK3__ + GdkPixbuf* GetPixbufNoMask() const; + cairo_t* CairoCreate() const; + void Draw(cairo_t* cr, int x, int y, bool useMask = true, const wxColour* fg = NULL, const wxColour* bg = NULL) const; + void SetSourceSurface(cairo_t* cr, int x, int y, const wxColour* fg = NULL, const wxColour* bg = NULL) const; +#else GdkPixmap *GetPixmap() const; bool HasPixmap() const; bool HasPixbuf() const; + wxBitmap(GdkPixmap* pixmap); +#endif GdkPixbuf *GetPixbuf() const; // raw bitmap access support functions @@ -119,14 +146,17 @@ public: bool HasAlpha() const; protected: +#ifndef __WXGTK3__ #if wxUSE_IMAGE bool CreateFromImage(const wxImage& image, int depth); #endif // wxUSE_IMAGE +#endif virtual wxGDIRefData* CreateGDIRefData() const; virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* data) const; private: +#ifndef __WXGTK3__ void SetPixmap(GdkPixmap* pixmap); #if wxUSE_IMAGE // to be called from CreateFromImage only! @@ -144,6 +174,7 @@ public: // removes other representations from memory, keeping only 'keep' // (wxBitmap may keep same bitmap e.g. as both pixmap and pixbuf): void PurgeOtherRepresentations(Representation keep); +#endif DECLARE_DYNAMIC_CLASS(wxBitmap) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/bmpbuttn.h b/Externals/wxWidgets3/include/wx/gtk/bmpbuttn.h index 0bc69997ca..f70e28ceb7 100644 --- a/Externals/wxWidgets3/include/wx/gtk/bmpbuttn.h +++ b/Externals/wxWidgets3/include/wx/gtk/bmpbuttn.h @@ -2,7 +2,6 @@ // Name: wx/gtk/bmpbutton.h // Purpose: // Author: Robert Roebling -// Id: $Id: bmpbuttn.h 61221 2009-06-27 22:22:48Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/bmpcbox.h b/Externals/wxWidgets3/include/wx/gtk/bmpcbox.h index 8da02bda13..f5d00a517b 100644 --- a/Externals/wxWidgets3/include/wx/gtk/bmpcbox.h +++ b/Externals/wxWidgets3/include/wx/gtk/bmpcbox.h @@ -3,7 +3,6 @@ // Purpose: wxBitmapComboBox // Author: Jaakko Salli // Created: 2008-05-19 -// RCS-ID: $Id: bmpcbox.h 61448 2009-07-18 08:33:55Z JMS $ // Copyright: (c) 2008 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/brush.h b/Externals/wxWidgets3/include/wx/gtk/brush.h index c23da5f79d..37a4845e6e 100644 --- a/Externals/wxWidgets3/include/wx/gtk/brush.h +++ b/Externals/wxWidgets3/include/wx/gtk/brush.h @@ -2,7 +2,6 @@ // Name: wx/gtk/brush.h // Purpose: // Author: Robert Roebling -// Id: $Id: brush.h 54273 2008-06-17 17:28:26Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/button.h b/Externals/wxWidgets3/include/wx/gtk/button.h index 6b8988ed7e..9e7a57d890 100644 --- a/Externals/wxWidgets3/include/wx/gtk/button.h +++ b/Externals/wxWidgets3/include/wx/gtk/button.h @@ -2,7 +2,6 @@ // Name: wx/gtk/button.h // Purpose: wxGTK wxButton class declaration // Author: Robert Roebling -// Id: $Id: button.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/calctrl.h b/Externals/wxWidgets3/include/wx/gtk/calctrl.h index a0cab6253f..3fce698ee5 100644 --- a/Externals/wxWidgets3/include/wx/gtk/calctrl.h +++ b/Externals/wxWidgets3/include/wx/gtk/calctrl.h @@ -2,7 +2,6 @@ // Name: wx/gtk/calctrl.h // Purpose: wxGtkCalendarCtrl control // Author: Marcin Wojdyr -// RCS-ID: $Id: calctrl.h 67987 2011-06-19 22:46:36Z VZ $ // Copyright: (C) 2008 Marcin Wojdyr // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/checkbox.h b/Externals/wxWidgets3/include/wx/gtk/checkbox.h index 3a575127e0..69985fc457 100644 --- a/Externals/wxWidgets3/include/wx/gtk/checkbox.h +++ b/Externals/wxWidgets3/include/wx/gtk/checkbox.h @@ -2,7 +2,6 @@ // Name: wx/gtk/checkbox.h // Purpose: // Author: Robert Roebling -// Id: $Id: checkbox.h 62786 2009-12-05 19:26:39Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -18,6 +17,7 @@ class WXDLLIMPEXP_CORE wxCheckBox : public wxCheckBoxBase { public: wxCheckBox(); + ~wxCheckBox(); wxCheckBox( wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, diff --git a/Externals/wxWidgets3/include/wx/gtk/checklst.h b/Externals/wxWidgets3/include/wx/gtk/checklst.h index e81fd9686c..3cfbd76407 100644 --- a/Externals/wxWidgets3/include/wx/gtk/checklst.h +++ b/Externals/wxWidgets3/include/wx/gtk/checklst.h @@ -3,32 +3,18 @@ // Purpose: wxCheckListBox class // Author: Robert Roebling // Modified by: -// RCS-ID: $Id: checklst.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifndef __GTKCHECKLISTH__ -#define __GTKCHECKLISTH__ - -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - -// there is no "right" choice of the checkbox indicators, so allow the user to -// define them himself if he wants -#ifndef wxCHECKLBOX_CHECKED - #define wxCHECKLBOX_CHECKED wxT('x') - #define wxCHECKLBOX_UNCHECKED wxT(' ') - - #define wxCHECKLBOX_STRING wxT("[ ] ") -#endif +#ifndef _WX_GTKCHECKLIST_H_ +#define _WX_GTKCHECKLIST_H_ //----------------------------------------------------------------------------- // wxCheckListBox // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxCheckListBox : public wxListBox +class WXDLLIMPEXP_CORE wxCheckListBox : public wxCheckListBoxBase { public: wxCheckListBox(); @@ -36,7 +22,7 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int nStrings = 0, - const wxString *choices = (const wxString *)NULL, + const wxString *choices = NULL, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxListBoxNameStr); @@ -48,8 +34,8 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxListBoxNameStr); - bool IsChecked(unsigned int index) const; - void Check(unsigned int index, bool check = true); + virtual bool IsChecked(unsigned int index) const; + virtual void Check(unsigned int index, bool check = true); int GetItemHeight() const; @@ -59,4 +45,4 @@ private: DECLARE_DYNAMIC_CLASS(wxCheckListBox) }; -#endif //__GTKCHECKLISTH__ +#endif // _WX_GTKCHECKLIST_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/chkconf.h b/Externals/wxWidgets3/include/wx/gtk/chkconf.h index 5566d4cef6..84595b256c 100644 --- a/Externals/wxWidgets3/include/wx/gtk/chkconf.h +++ b/Externals/wxWidgets3/include/wx/gtk/chkconf.h @@ -3,7 +3,6 @@ * Purpose: wxGTK-specific settings consistency checks * Author: Vadim Zeitlin * Created: 2007-07-19 (extracted from wx/chkconf.h) - * RCS-ID: $Id: chkconf.h 47564 2007-07-19 15:47:11Z VZ $ * Copyright: (c) 2000-2007 Vadim Zeitlin * Licence: wxWindows licence */ @@ -29,3 +28,71 @@ # endif # endif #endif /* wxUSE_JOYSTICK */ + +#if wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW && !wxUSE_POSTSCRIPT +# undef wxUSE_POSTSCRIPT +# define wxUSE_POSTSCRIPT 1 +#endif + +#if wxUSE_OWNER_DRAWN +# undef wxUSE_OWNER_DRAWN +# define wxUSE_OWNER_DRAWN 0 +#endif + +#if wxUSE_METAFILE +# undef wxUSE_METAFILE +# define wxUSE_METAFILE 0 +#endif + +#if wxUSE_ENH_METAFILE +# undef wxUSE_ENH_METAFILE +# define wxUSE_ENH_METAFILE 0 +#endif + +#ifndef __UNIX__ + +# undef wxUSE_WEBVIEW +# define wxUSE_WEBVIEW 0 +# undef wxUSE_WEBVIEW_WEBKIT +# define wxUSE_WEBVIEW_WEBKIT 0 + +# undef wxUSE_MEDIACTRL +# define wxUSE_MEDIACTRL 0 + + /* + We could use GDK_WINDOWING_X11 for those but this would require + including gdk/gdk.h and we don't want to do it from here, so assume + we're not using X11 if we're not under Unix. + */ + +# undef wxUSE_UIACTIONSIMULATOR +# define wxUSE_UIACTIONSIMULATOR 0 + +# undef wxUSE_GLCANVAS +# define wxUSE_GLCANVAS 0 + +#endif /* __UNIX__ */ + +/* + We always need Cairo with wxGTK, enable it if necessary (this can only + happen under Windows). + */ +#ifdef __WINDOWS__ + +#if !wxUSE_CAIRO +# undef wxUSE_CAIRO +# define wxUSE_CAIRO 1 +#endif + +#endif /* __WINDOWS__ */ + +#ifdef __WXGTK3__ + #if !wxUSE_GRAPHICS_CONTEXT + #ifdef wxABORT_ON_CONFIG_ERROR + #error "GTK+ 3 support requires wxGraphicsContext" + #else + #undef wxUSE_GRAPHICS_CONTEXT + #define wxUSE_GRAPHICS_CONTEXT 1 + #endif + #endif +#endif diff --git a/Externals/wxWidgets3/include/wx/gtk/choice.h b/Externals/wxWidgets3/include/wx/gtk/choice.h index 026eac4a1f..d952a0fa2c 100644 --- a/Externals/wxWidgets3/include/wx/gtk/choice.h +++ b/Externals/wxWidgets3/include/wx/gtk/choice.h @@ -2,7 +2,6 @@ // Name: wx/gtk/choice.h // Purpose: // Author: Robert Roebling -// Id: $Id: choice.h 65818 2010-10-15 23:46:32Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -64,8 +63,6 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxChoiceNameStr ); - void SendSelectionChangedEvent(wxEventType evt_type); - int GetSelection() const; void SetSelection(int n); @@ -95,6 +92,7 @@ protected: int m_stringCellIndex; virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; virtual int DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, void **clientData, wxClientDataType type); diff --git a/Externals/wxWidgets3/include/wx/gtk/clipbrd.h b/Externals/wxWidgets3/include/wx/gtk/clipbrd.h index 51af594ef7..28d84df815 100644 --- a/Externals/wxWidgets3/include/wx/gtk/clipbrd.h +++ b/Externals/wxWidgets3/include/wx/gtk/clipbrd.h @@ -2,7 +2,6 @@ // Name: wx/gtk/clipbrd.h // Purpose: wxClipboard for wxGTK // Author: Robert Roebling, Vadim Zeitlin -// Id: $Id: clipbrd.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // (c) 2007 Vadim Zeitlin // Licence: wxWindows licence @@ -118,6 +117,9 @@ private: GtkWidget *m_clipboardWidget; // for getting and offering data GtkWidget *m_targetsWidget; // for getting list of supported formats + // ID of the connection to "selection_get" signal, initially 0. + unsigned long m_idSelectionGetHandler; + bool m_open; bool m_formatSupported; diff --git a/Externals/wxWidgets3/include/wx/gtk/clrpicker.h b/Externals/wxWidgets3/include/wx/gtk/clrpicker.h index e21dd85c51..4a375fb849 100644 --- a/Externals/wxWidgets3/include/wx/gtk/clrpicker.h +++ b/Externals/wxWidgets3/include/wx/gtk/clrpicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: clrpicker.h 49668 2007-11-06 00:32:34Z MR $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -52,8 +51,8 @@ protected: public: // used by the GTK callback only - void SetGdkColor(const GdkColor& gdkColor) - { m_colour = wxColor(gdkColor); } + void GTKSetColour(const wxColour& colour) + { m_colour = colour; } wxWindow *m_topParent; diff --git a/Externals/wxWidgets3/include/wx/gtk/collpane.h b/Externals/wxWidgets3/include/wx/gtk/collpane.h index 6ae545e257..7503b8e1b2 100644 --- a/Externals/wxWidgets3/include/wx/gtk/collpane.h +++ b/Externals/wxWidgets3/include/wx/gtk/collpane.h @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 8/10/2006 -// RCS-ID: $Id: collpane.h 58632 2009-02-03 09:53:33Z RR $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -35,11 +34,6 @@ public: Create(parent, winid, label, pos, size, style, val, name); } - void Init() - { - m_bIgnoreNextChange = false; - } - bool Create(wxWindow *parent, wxWindowID winid, const wxString& label, @@ -69,6 +63,11 @@ public: // used by GTK callbacks wxString m_strLabel; private: + void Init() + { + m_bIgnoreNextChange = false; + } + void OnSize(wxSizeEvent&); virtual void AddChildGTK(wxWindowGTK* child); GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; diff --git a/Externals/wxWidgets3/include/wx/gtk/colordlg.h b/Externals/wxWidgets3/include/wx/gtk/colordlg.h index b0cac3cfe7..a1fdbb75ec 100644 --- a/Externals/wxWidgets3/include/wx/gtk/colordlg.h +++ b/Externals/wxWidgets3/include/wx/gtk/colordlg.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2004/06/04 -// RCS-ID: $Id: colordlg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Vaclav Slavik, 2004 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/colour.h b/Externals/wxWidgets3/include/wx/gtk/colour.h index 54ed5ec5b8..d48d707cbe 100644 --- a/Externals/wxWidgets3/include/wx/gtk/colour.h +++ b/Externals/wxWidgets3/include/wx/gtk/colour.h @@ -2,7 +2,6 @@ // Name: wx/gtk/colour.h // Purpose: // Author: Robert Roebling -// Id: $Id: colour.h 50897 2007-12-22 15:03:58Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,6 +9,10 @@ #ifndef _WX_GTK_COLOUR_H_ #define _WX_GTK_COLOUR_H_ +#ifdef __WXGTK3__ +typedef struct _GdkRGBA GdkRGBA; +#endif + //----------------------------------------------------------------------------- // wxColour //----------------------------------------------------------------------------- @@ -21,6 +24,9 @@ public: // ------------ DEFINE_STD_WXCOLOUR_CONSTRUCTORS wxColour(const GdkColor& gdkColor); +#ifdef __WXGTK3__ + wxColour(const GdkRGBA& gdkRGBA); +#endif virtual ~wxColour(); @@ -33,8 +39,12 @@ public: unsigned char Alpha() const; // Implementation part +#ifdef __WXGTK3__ + operator const GdkRGBA*() const; +#else void CalcPixel( GdkColormap *cmap ); int GetPixel() const; +#endif const GdkColor *GetColor() const; protected: @@ -43,7 +53,6 @@ protected: virtual bool FromString(const wxString& str); -private: DECLARE_DYNAMIC_CLASS(wxColour) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/combobox.h b/Externals/wxWidgets3/include/wx/gtk/combobox.h index 87154df510..c655991e3c 100644 --- a/Externals/wxWidgets3/include/wx/gtk/combobox.h +++ b/Externals/wxWidgets3/include/wx/gtk/combobox.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// Id: $Id: combobox.h 70880 2012-03-11 23:55:19Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -56,6 +55,7 @@ public: Init(); Create(parent, id, value, pos, size, choices, style, validator, name); } + ~wxComboBox(); bool Create(wxWindow *parent, wxWindowID id, const wxString& value = wxEmptyString, @@ -144,6 +144,8 @@ protected: // custom list stores. virtual void GTKCreateComboBoxWidget(); + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + virtual GtkEntry *GetEntry() const { return m_entry; } diff --git a/Externals/wxWidgets3/include/wx/gtk/control.h b/Externals/wxWidgets3/include/wx/gtk/control.h index 3d00b42278..454d1fc90d 100644 --- a/Externals/wxWidgets3/include/wx/gtk/control.h +++ b/Externals/wxWidgets3/include/wx/gtk/control.h @@ -2,7 +2,6 @@ // Name: wx/gtk/control.h // Purpose: // Author: Robert Roebling -// Id: $Id: control.h 70714 2012-02-27 17:49:33Z PC $ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,20 +11,15 @@ typedef struct _GtkLabel GtkLabel; typedef struct _GtkFrame GtkFrame; +typedef struct _GtkEntry GtkEntry; //----------------------------------------------------------------------------- // wxControl //----------------------------------------------------------------------------- -// C-linkage function pointer types for GetDefaultAttributesFromGTKWidget -extern "C" { - typedef GtkWidget* (*wxGtkWidgetNew_t)(void); - typedef GtkWidget* (*wxGtkWidgetNewFromStr_t)(const char*); - typedef GtkWidget* (*wxGtkWidgetNewFromAdj_t)(GtkAdjustment*); -} - class WXDLLIMPEXP_CORE wxControl : public wxControlBase { + typedef wxControlBase base_type; public: wxControl(); wxControl(wxWindow *parent, wxWindowID id, @@ -43,8 +37,10 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxControlNameStr); - virtual wxVisualAttributes GetDefaultAttributes() const; +#ifdef __WXGTK3__ + virtual bool SetFont(const wxFont& font); +#endif protected: virtual wxSize DoGetBestSize() const; @@ -76,19 +72,6 @@ protected: GetDefaultAttributesFromGTKWidget(GtkWidget* widget, bool useBase = false, int state = 0); - static wxVisualAttributes - GetDefaultAttributesFromGTKWidget(wxGtkWidgetNew_t, - bool useBase = false, - int state = 0); - static wxVisualAttributes - GetDefaultAttributesFromGTKWidget(wxGtkWidgetNewFromStr_t, - bool useBase = false, - int state = 0); - - static wxVisualAttributes - GetDefaultAttributesFromGTKWidget(wxGtkWidgetNewFromAdj_t, - bool useBase = false, - int state = 0); // Widgets that use the style->base colour for the BG colour should // override this and return true. @@ -97,6 +80,12 @@ protected: // Fix sensitivity due to bug in GTK+ < 2.14 void GTKFixSensitivity(bool onlyIfUnderMouse = true); + // Ask GTK+ for preferred size. Use it after setting the font. + wxSize GTKGetPreferredSize(GtkWidget* widget) const; + + // Inner margins in a GtkEntry + wxPoint GTKGetEntryMargins(GtkEntry* entry) const; + private: DECLARE_DYNAMIC_CLASS(wxControl) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/cursor.h b/Externals/wxWidgets3/include/wx/gtk/cursor.h index 583d9889e1..e1915efc1d 100644 --- a/Externals/wxWidgets3/include/wx/gtk/cursor.h +++ b/Externals/wxWidgets3/include/wx/gtk/cursor.h @@ -2,7 +2,6 @@ // Name: wx/gtk/cursor.h // Purpose: // Author: Robert Roebling -// Id: $Id: cursor.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/dataform.h b/Externals/wxWidgets3/include/wx/gtk/dataform.h index 6ec92c66c2..b7c3be71f3 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dataform.h +++ b/Externals/wxWidgets3/include/wx/gtk/dataform.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.10.99 (extracted from gtk/dataobj.h) -// RCS-ID: $Id: dataform.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/dataobj.h b/Externals/wxWidgets3/include/wx/gtk/dataobj.h index 108250ee08..859093fcb2 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dataobj.h +++ b/Externals/wxWidgets3/include/wx/gtk/dataobj.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dataobj.h // Purpose: declaration of the wxDataObject // Author: Robert Roebling -// RCS-ID: $Id: dataobj.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/dataobj2.h b/Externals/wxWidgets3/include/wx/gtk/dataobj2.h index 1e6f81919d..62f380a429 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dataobj2.h +++ b/Externals/wxWidgets3/include/wx/gtk/dataobj2.h @@ -3,7 +3,6 @@ // Purpose: declaration of standard wxDataObjectSimple-derived classes // Author: Robert Roebling // Created: 19.10.99 (extracted from gtk/dataobj.h) -// RCS-ID: $Id: dataobj2.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -49,7 +48,6 @@ public: } protected: - void Init() { m_pngData = NULL; m_pngSize = 0; } void Clear() { free(m_pngData); } void ClearAll() { Clear(); Init(); } @@ -57,6 +55,9 @@ protected: void *m_pngData; void DoConvertToPng(); + +private: + void Init() { m_pngData = NULL; m_pngSize = 0; } }; // ---------------------------------------------------------------------------- @@ -93,34 +94,19 @@ public: // wxURLDataObject is a specialization of wxDataObject for URLs // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxURLDataObject : public wxDataObjectSimple +class WXDLLIMPEXP_CORE wxURLDataObject : public wxDataObjectComposite { public: wxURLDataObject(const wxString& url = wxEmptyString); - wxString GetURL() const { return m_url; } - void SetURL(const wxString& url) { m_url = url; } - - virtual size_t GetDataSize() const; - virtual bool GetDataHere(void *buf) const; - virtual bool SetData(size_t len, const void *buf); - - // Must provide overloads to avoid hiding them (and warnings about it) - virtual size_t GetDataSize(const wxDataFormat&) const - { - return GetDataSize(); - } - virtual bool GetDataHere(const wxDataFormat&, void *buf) const - { - return GetDataHere(buf); - } - virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) - { - return SetData(len, buf); - } + wxString GetURL() const; + void SetURL(const wxString& url); private: - wxString m_url; + class wxTextURIListDataObject* const m_dobjURIList; + wxTextDataObject* const m_dobjText; + + wxDECLARE_NO_COPY_CLASS(wxURLDataObject); }; diff --git a/Externals/wxWidgets3/include/wx/gtk/dataview.h b/Externals/wxWidgets3/include/wx/gtk/dataview.h index 75463bd02d..44d2af93b2 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dataview.h +++ b/Externals/wxWidgets3/include/wx/gtk/dataview.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dataview.h // Purpose: wxDataViewCtrl GTK+2 implementation header // Author: Robert Roebling -// Id: $Id: dataview.h 70377 2012-01-17 14:05:17Z VS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/dc.h b/Externals/wxWidgets3/include/wx/gtk/dc.h index 3a2cc8afdc..7eb9dd1267 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dc.h +++ b/Externals/wxWidgets3/include/wx/gtk/dc.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dc.h // Purpose: // Author: Robert Roebling -// Id: $Id: dc.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,6 +9,107 @@ #ifndef _WX_GTKDC_H_ #define _WX_GTKDC_H_ +#ifdef __WXGTK3__ + +#include "wx/dcgraph.h" + +class wxGTKCairoDCImpl: public wxGCDCImpl +{ + typedef wxGCDCImpl base_type; +public: + wxGTKCairoDCImpl(wxDC* owner); + wxGTKCairoDCImpl(wxDC* owner, int); + wxGTKCairoDCImpl(wxDC* owner, wxWindow* window); + + virtual void DoDrawBitmap(const wxBitmap& bitmap, int x, int y, bool useMask); + virtual void DoDrawIcon(const wxIcon& icon, int x, int y); +#if wxUSE_IMAGE + virtual bool DoFloodFill(int x, int y, const wxColour& col, wxFloodFillStyle style); +#endif + virtual wxBitmap DoGetAsBitmap(const wxRect* subrect) const; + virtual bool DoGetPixel(int x, int y, wxColour* col) const; + virtual void DoGetSize(int* width, int* height) const; + virtual bool DoStretchBlit(int xdest, int ydest, int dstWidth, int dstHeight, wxDC* source, int xsrc, int ysrc, int srcWidth, int srcHeight, wxRasterOperationMode rop, bool useMask, int xsrcMask, int ysrcMask); + virtual void* GetCairoContext() const; + +protected: + int m_width, m_height; + + wxDECLARE_NO_COPY_CLASS(wxGTKCairoDCImpl); +}; +//----------------------------------------------------------------------------- + +class wxWindowDCImpl: public wxGTKCairoDCImpl +{ + typedef wxGTKCairoDCImpl base_type; +public: + wxWindowDCImpl(wxWindowDC* owner, wxWindow* window); + + wxDECLARE_NO_COPY_CLASS(wxWindowDCImpl); +}; +//----------------------------------------------------------------------------- + +class wxClientDCImpl: public wxGTKCairoDCImpl +{ + typedef wxGTKCairoDCImpl base_type; +public: + wxClientDCImpl(wxClientDC* owner, wxWindow* window); + + wxDECLARE_NO_COPY_CLASS(wxClientDCImpl); +}; +//----------------------------------------------------------------------------- + +class wxPaintDCImpl: public wxGTKCairoDCImpl +{ + typedef wxGTKCairoDCImpl base_type; +public: + wxPaintDCImpl(wxPaintDC* owner, wxWindow* window); + + wxDECLARE_NO_COPY_CLASS(wxPaintDCImpl); +}; +//----------------------------------------------------------------------------- + +class wxScreenDCImpl: public wxGTKCairoDCImpl +{ + typedef wxGTKCairoDCImpl base_type; +public: + wxScreenDCImpl(wxScreenDC* owner); + + wxDECLARE_NO_COPY_CLASS(wxScreenDCImpl); +}; +//----------------------------------------------------------------------------- + +class wxMemoryDCImpl: public wxGTKCairoDCImpl +{ + typedef wxGTKCairoDCImpl base_type; +public: + wxMemoryDCImpl(wxMemoryDC* owner); + wxMemoryDCImpl(wxMemoryDC* owner, wxBitmap& bitmap); + wxMemoryDCImpl(wxMemoryDC* owner, wxDC* dc); + virtual wxBitmap DoGetAsBitmap(const wxRect* subrect) const; + virtual void DoSelect(const wxBitmap& bitmap); + virtual const wxBitmap& GetSelectedBitmap() const; + virtual wxBitmap& GetSelectedBitmap(); + +private: + void Setup(); + wxBitmap m_bitmap; + + wxDECLARE_NO_COPY_CLASS(wxMemoryDCImpl); +}; +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGTKCairoDC: public wxDC +{ + typedef wxDC base_type; +public: + wxGTKCairoDC(cairo_t* cr); + + wxDECLARE_NO_COPY_CLASS(wxGTKCairoDC); +}; + +#else + #include "wx/dc.h" //----------------------------------------------------------------------------- @@ -35,7 +135,8 @@ public: virtual void EndPage() { } virtual GdkWindow* GetGDKWindow() const { return NULL; } - + virtual void* GetHandle() const { return GetGDKWindow(); } + // base class pure virtuals implemented here virtual void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); virtual void DoGetSizeMM(int* width, int* height) const; @@ -50,4 +151,5 @@ public: #define wxHAS_WORKING_GTK_DC_BLIT #endif +#endif #endif // _WX_GTKDC_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/dcclient.h b/Externals/wxWidgets3/include/wx/gtk/dcclient.h index c3eb92fcea..53469796a1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dcclient.h +++ b/Externals/wxWidgets3/include/wx/gtk/dcclient.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dcclient.h // Purpose: // Author: Robert Roebling -// Id: $Id: dcclient.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -11,10 +10,6 @@ #define _WX_GTKDCCLIENT_H_ #include "wx/gtk/dc.h" -#include "wx/dcclient.h" -#include "wx/region.h" - -class WXDLLIMPEXP_FWD_CORE wxWindow; //----------------------------------------------------------------------------- // wxWindowDCImpl @@ -44,9 +39,9 @@ public: double sa, double ea ); virtual void DoDrawPoint( wxCoord x, wxCoord y ); - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); diff --git a/Externals/wxWidgets3/include/wx/gtk/dcmemory.h b/Externals/wxWidgets3/include/wx/gtk/dcmemory.h index ede21042bd..8afb45c52e 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dcmemory.h +++ b/Externals/wxWidgets3/include/wx/gtk/dcmemory.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dcmemory.h // Purpose: // Author: Robert Roebling -// RCS-ID: $Id: dcmemory.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,7 +38,8 @@ public: // overridden from wxDCImpl virtual void DoGetSize( int *width, int *height ) const; virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const; - + virtual void* GetHandle() const; + // overridden for wxMemoryDC Impl virtual void DoSelect(const wxBitmap& bitmap); diff --git a/Externals/wxWidgets3/include/wx/gtk/dcscreen.h b/Externals/wxWidgets3/include/wx/gtk/dcscreen.h index 3fef9b1a6e..c91926b910 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dcscreen.h +++ b/Externals/wxWidgets3/include/wx/gtk/dcscreen.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dcscreen.h // Purpose: // Author: Robert Roebling -// Id: $Id: dcscreen.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -25,7 +24,7 @@ public: virtual void DoGetSize(int *width, int *height) const; -protected: +private: void Init(); DECLARE_ABSTRACT_CLASS(wxScreenDCImpl) diff --git a/Externals/wxWidgets3/include/wx/gtk/dialog.h b/Externals/wxWidgets3/include/wx/gtk/dialog.h index 4ad6d18bdc..bc6e8625bd 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dialog.h +++ b/Externals/wxWidgets3/include/wx/gtk/dialog.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: -// Id: $Id: dialog.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,7 +38,6 @@ public: virtual int ShowModal(); virtual void EndModal( int retCode ); virtual bool IsModal() const; - void SetModal( bool modal ); // implementation // -------------- diff --git a/Externals/wxWidgets3/include/wx/gtk/dirdlg.h b/Externals/wxWidgets3/include/wx/gtk/dirdlg.h index 78e8c02a96..8a05d55796 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dirdlg.h +++ b/Externals/wxWidgets3/include/wx/gtk/dirdlg.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dirdlg.h // Purpose: wxDirDialog // Author: Francesco Montorsi -// Id: $Id: dirdlg.h 70898 2012-03-14 12:32:27Z VZ $ // Copyright: (c) 2006 Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -42,6 +41,11 @@ public: // overrides from wxGenericDirDialog void SetPath(const wxString& path); + // Implementation only. + + void GTKOnAccept(); + void GTKOnCancel(); + protected: // override this from wxTLW since the native // form doesn't have any m_wxwindow @@ -51,10 +55,9 @@ protected: private: - void OnFakeOk( wxCommandEvent &event ); + wxString m_selectedDirectory; DECLARE_DYNAMIC_CLASS(wxDirDialog) - DECLARE_EVENT_TABLE() }; #endif // __GTKDIRDLGH__ diff --git a/Externals/wxWidgets3/include/wx/gtk/dnd.h b/Externals/wxWidgets3/include/wx/gtk/dnd.h index f7725017b5..0aea7b41f6 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dnd.h +++ b/Externals/wxWidgets3/include/wx/gtk/dnd.h @@ -2,7 +2,6 @@ // Name: wx/gtk/dnd.h // Purpose: declaration of the wxDropTarget class // Author: Robert Roebling -// RCS-ID: $Id: dnd.h 69020 2011-09-07 16:56:50Z PC $ // Copyright: (c) 1998 Vadim Zeitlin, Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -81,6 +80,17 @@ public: virtual ~wxDropSource(); + // set the icon corresponding to given drag result + void SetIcon(wxDragResult res, const wxIcon& icon) + { + if ( res == wxDragCopy ) + m_iconCopy = icon; + else if ( res == wxDragMove ) + m_iconMove = icon; + else + m_iconNone = icon; + } + // start drag action virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly); diff --git a/Externals/wxWidgets3/include/wx/gtk/dvrenderer.h b/Externals/wxWidgets3/include/wx/gtk/dvrenderer.h index a8a75dc4fd..dfaba5609a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dvrenderer.h +++ b/Externals/wxWidgets3/include/wx/gtk/dvrenderer.h @@ -3,7 +3,6 @@ // Purpose: wxDataViewRenderer for GTK wxDataViewCtrl implementation // Author: Robert Roebling, Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/gtk/dataview.h) -// RCS-ID: $Id: dvrenderer.h 69020 2011-09-07 16:56:50Z PC $ // Copyright: (c) 2006 Robert Roebling // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/gtk/dvrenderers.h b/Externals/wxWidgets3/include/wx/gtk/dvrenderers.h index 95b84d416b..385fa73a0b 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dvrenderers.h +++ b/Externals/wxWidgets3/include/wx/gtk/dvrenderers.h @@ -3,7 +3,6 @@ // Purpose: All GTK wxDataViewCtrl renderer classes // Author: Robert Roebling, Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/gtk/dataview.h) -// RCS-ID: $Id: dvrenderers.h 70300 2012-01-09 06:31:07Z PC $ // Copyright: (c) 2006 Robert Roebling // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence @@ -12,7 +11,12 @@ #ifndef _WX_GTK_DVRENDERERS_H_ #define _WX_GTK_DVRENDERERS_H_ -typedef struct _GdkRectangle GdkRectangle; +#ifdef __WXGTK3__ + typedef struct _cairo_rectangle_int cairo_rectangle_int_t; + typedef cairo_rectangle_int_t GdkRectangle; +#else + typedef struct _GdkRectangle GdkRectangle; +#endif // --------------------------------------------------------- // wxDataViewTextRenderer @@ -137,10 +141,9 @@ public: virtual GtkCellRendererText *GtkGetTextRenderer() const; -protected: +private: bool Init(wxDataViewCellMode mode, int align); -private: // Called from GtkGetTextRenderer() to really create the renderer if // necessary. void GtkInitTextRenderer(); diff --git a/Externals/wxWidgets3/include/wx/gtk/evtloop.h b/Externals/wxWidgets3/include/wx/gtk/evtloop.h index 7a5e31033f..ba8db406d5 100644 --- a/Externals/wxWidgets3/include/wx/gtk/evtloop.h +++ b/Externals/wxWidgets3/include/wx/gtk/evtloop.h @@ -3,7 +3,6 @@ // Purpose: wxGTK event loop implementation // Author: Vadim Zeitlin // Created: 2008-12-27 -// RCS-ID: $Id: evtloop.h 62475 2009-10-22 11:36:35Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -22,22 +21,19 @@ class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase public: wxGUIEventLoop(); - virtual int Run(); - virtual void Exit(int rc = 0); + virtual void ScheduleExit(int rc = 0); virtual bool Pending() const; virtual bool Dispatch(); virtual int DispatchTimeout(unsigned long timeout); virtual void WakeUp(); virtual bool YieldFor(long eventsToProcess); -#if wxUSE_EVENTLOOP_SOURCE - virtual wxEventLoopSource * - AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); -#endif // wxUSE_EVENTLOOP_SOURCE - void StoreGdkEventForLaterProcessing(GdkEvent* ev) { m_arrGdkEvents.Add(ev); } +protected: + virtual int DoRun(); + private: // the exit code of this event loop int m_exitcode; diff --git a/Externals/wxWidgets3/include/wx/gtk/evtloopsrc.h b/Externals/wxWidgets3/include/wx/gtk/evtloopsrc.h index 6a59895f64..f80523424d 100644 --- a/Externals/wxWidgets3/include/wx/gtk/evtloopsrc.h +++ b/Externals/wxWidgets3/include/wx/gtk/evtloopsrc.h @@ -3,7 +3,6 @@ // Purpose: wxGTKEventLoopSource class // Author: Vadim Zeitlin // Created: 2009-10-21 -// RCS-ID: $Id: evtloopsrc.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/filectrl.h b/Externals/wxWidgets3/include/wx/gtk/filectrl.h index 1551923ec3..3de17e3af8 100644 --- a/Externals/wxWidgets3/include/wx/gtk/filectrl.h +++ b/Externals/wxWidgets3/include/wx/gtk/filectrl.h @@ -4,7 +4,6 @@ // Author: Diaa M. Sami // Modified by: // Created: Aug-10-2007 -// RCS-ID: $Id: filectrl.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Diaa M. Sami // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -88,9 +87,8 @@ public: Create( parent, id, defaultDirectory, defaultFilename, wildCard, style, pos, size, name ); } - virtual ~wxGtkFileCtrl() {} + virtual ~wxGtkFileCtrl(); - void Init(); bool Create( wxWindow *parent, wxWindowID id, const wxString& defaultDirectory = wxEmptyString, @@ -134,6 +132,9 @@ protected: wxGtkFileChooser m_fc; wxString m_wildCard; +private: + void Init(); + DECLARE_DYNAMIC_CLASS( wxGtkFileCtrl ) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/filedlg.h b/Externals/wxWidgets3/include/wx/gtk/filedlg.h index 667e94a359..377734db79 100644 --- a/Externals/wxWidgets3/include/wx/gtk/filedlg.h +++ b/Externals/wxWidgets3/include/wx/gtk/filedlg.h @@ -2,7 +2,6 @@ // Name: wx/gtk/filedlg.h // Purpose: // Author: Robert Roebling -// Id: $Id: filedlg.h 70898 2012-03-14 12:32:27Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -43,7 +42,6 @@ public: virtual wxString GetPath() const; virtual void GetPaths(wxArrayString& paths) const; - virtual wxString GetDirectory() const; virtual wxString GetFilename() const; virtual void GetFilenames(wxArrayString& files) const; virtual int GetFilterIndex() const; @@ -59,6 +57,9 @@ public: virtual bool SupportsExtraControl() const { return true; } + // Implementation only. + void GTKSelectionChanged(const wxString& filename); + protected: // override this from wxTLW since the native diff --git a/Externals/wxWidgets3/include/wx/gtk/filehistory.h b/Externals/wxWidgets3/include/wx/gtk/filehistory.h index 9125f89928..70a93d6f5e 100644 --- a/Externals/wxWidgets3/include/wx/gtk/filehistory.h +++ b/Externals/wxWidgets3/include/wx/gtk/filehistory.h @@ -3,7 +3,6 @@ // Purpose: GTK+ bits for wxFileHistory // Author: Vaclav Slavik // Created: 2010-05-06 -// RCS-ID: $Id: filehistory.h 64240 2010-05-07 06:45:48Z VS $ // Copyright: (c) 2010 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/filepicker.h b/Externals/wxWidgets3/include/wx/gtk/filepicker.h index ad6be66083..27e1fdc779 100644 --- a/Externals/wxWidgets3/include/wx/gtk/filepicker.h +++ b/Externals/wxWidgets3/include/wx/gtk/filepicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: filepicker.h 70043 2011-12-18 12:34:47Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -34,13 +33,6 @@ return NULL; \ } \ \ - virtual bool Destroy() \ - { \ - if (m_dialog) \ - m_dialog->Destroy(); \ - return wxButton::Destroy(); \ - } \ - \ /* even if wx derive from wxGenericFileButton, i.e. from wxButton, our */ \ /* native GTK+ widget does not derive from GtkButton thus *all* uses */ \ /* GTK_BUTTON(m_widget) macro done by wxButton must be bypassed to */ \ @@ -107,8 +99,6 @@ public: // overrides FILEDIRBTN_OVERRIDES protected: - virtual bool GTKShouldConnectSizeRequest() const { return false; } - wxDialog *m_dialog; private: @@ -178,13 +168,6 @@ public: // overrides FILEDIRBTN_OVERRIDES protected: - // common part of all ctors - void Init() - { - m_dialog = NULL; - m_bIgnoreNextChange = false; - } - wxDialog *m_dialog; public: // used by the GTK callback only @@ -194,6 +177,12 @@ public: // used by the GTK callback only void GTKUpdatePath(const char *gtkpath); private: + void Init() + { + m_dialog = NULL; + m_bIgnoreNextChange = false; + } + DECLARE_DYNAMIC_CLASS(wxDirButton) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/font.h b/Externals/wxWidgets3/include/wx/gtk/font.h index 53bc2d6441..a218a29dfe 100644 --- a/Externals/wxWidgets3/include/wx/gtk/font.h +++ b/Externals/wxWidgets3/include/wx/gtk/font.h @@ -2,7 +2,6 @@ // Name: wx/gtk/font.h // Purpose: // Author: Robert Roebling -// Id: $Id: font.h 70476 2012-01-29 08:14:34Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,7 +18,8 @@ class WXDLLIMPEXP_CORE wxFont : public wxFontBase public: wxFont() { } - // wxGTK-specific + wxFont(const wxFontInfo& info); + wxFont(const wxString& nativeFontInfoString) { Create(nativeFontInfoString); @@ -63,12 +63,6 @@ public: SetPixelSize(pixelSize); } - wxFont(int pointSize, - wxFontFamily family, - int flags = wxFONTFLAG_DEFAULT, - const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT); - bool Create(int size, wxFontFamily family, wxFontStyle style, @@ -119,15 +113,14 @@ public: protected: virtual void DoSetNativeFontInfo( const wxNativeFontInfo& info ); - // common part of all ctors - void Init(); - virtual wxGDIRefData* CreateGDIRefData() const; virtual wxGDIRefData* CloneGDIRefData(const wxGDIRefData* data) const; virtual wxFontFamily DoGetFamily() const; private: + void Init(); + DECLARE_DYNAMIC_CLASS(wxFont) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/fontdlg.h b/Externals/wxWidgets3/include/wx/gtk/fontdlg.h index 18db2771c0..4c5b57a3e3 100644 --- a/Externals/wxWidgets3/include/wx/gtk/fontdlg.h +++ b/Externals/wxWidgets3/include/wx/gtk/fontdlg.h @@ -3,13 +3,12 @@ // Purpose: wxFontDialog // Author: Robert Roebling // Created: -// RCS-ID: $Id: fontdlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __GTK_FONTDLGH__ -#define __GTK_FONTDLGH__ +#ifndef _WX_GTK_FONTDLG_H_ +#define _WX_GTK_FONTDLG_H_ //----------------------------------------------------------------------------- // wxFontDialog @@ -26,9 +25,6 @@ public: virtual ~wxFontDialog(); - // implementation only - void SetChosenFont(const char *name); - #if WXWIN_COMPATIBILITY_2_6 // deprecated interface, don't use wxDEPRECATED( wxFontDialog(wxWindow *parent, const wxFontData *data) ); @@ -38,7 +34,6 @@ protected: // create the GTK dialog virtual bool DoCreate(wxWindow *parent); -private: DECLARE_DYNAMIC_CLASS(wxFontDialog) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/fontpicker.h b/Externals/wxWidgets3/include/wx/gtk/fontpicker.h index 505090e762..65bb5c9593 100644 --- a/Externals/wxWidgets3/include/wx/gtk/fontpicker.h +++ b/Externals/wxWidgets3/include/wx/gtk/fontpicker.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Francesco Montorsi -// RCS-ID: $Id: fontpicker.h 69020 2011-09-07 16:56:50Z PC $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/frame.h b/Externals/wxWidgets3/include/wx/gtk/frame.h index a4a4bbe6f0..1f172c43c1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/frame.h +++ b/Externals/wxWidgets3/include/wx/gtk/frame.h @@ -2,7 +2,6 @@ // Name: wx/gtk/frame.h // Purpose: // Author: Robert Roebling -// Id: $Id: frame.h 66648 2011-01-08 06:42:41Z PC $ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -64,9 +63,6 @@ public: virtual bool SendIdleEvents(wxIdleEvent& event); protected: - // common part of all ctors - void Init(); - // override wxWindow methods to take into account tool/menu/statusbars virtual void DoGetClientSize( int *width, int *height ) const; @@ -76,6 +72,8 @@ protected: #endif // wxUSE_MENUS_NATIVE private: + void Init(); + long m_fsSaveFlag; DECLARE_DYNAMIC_CLASS(wxFrame) diff --git a/Externals/wxWidgets3/include/wx/gtk/gauge.h b/Externals/wxWidgets3/include/wx/gtk/gauge.h index 7f065f2657..8df47461e5 100644 --- a/Externals/wxWidgets3/include/wx/gtk/gauge.h +++ b/Externals/wxWidgets3/include/wx/gtk/gauge.h @@ -2,7 +2,6 @@ // Name: wx/gtk/gauge.h // Purpose: // Author: Robert Roebling -// Id: $Id: gauge.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -71,15 +70,14 @@ public: m_gaugePos; protected: - // common part of all ctors - void Init() { m_rangeMax = m_gaugePos = 0; } - // set the gauge value to the value of m_gaugePos void DoSetGauge(); virtual wxSize DoGetBestSize() const; private: + void Init() { m_rangeMax = m_gaugePos = 0; } + DECLARE_DYNAMIC_CLASS(wxGauge) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/glcanvas.h b/Externals/wxWidgets3/include/wx/gtk/glcanvas.h index 1d7d925501..01591149b5 100644 --- a/Externals/wxWidgets3/include/wx/gtk/glcanvas.h +++ b/Externals/wxWidgets3/include/wx/gtk/glcanvas.h @@ -4,7 +4,6 @@ // Author: Robert Roebling // Modified by: // Created: 17/8/98 -// RCS-ID: $Id: glcanvas.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,6 +38,7 @@ public: const int *attribList = NULL, const wxPalette& palette = wxNullPalette); + virtual bool SetBackgroundStyle(wxBackgroundStyle style); // implement wxGLCanvasX11 methods // -------------------------------- @@ -93,6 +93,9 @@ public: void OnInternalIdle(); bool m_exposed; +#ifdef __WXGTK3__ + cairo_t* m_cairoPaintContext; +#endif #if WXWIN_COMPATIBILITY_2_8 wxGLContext *m_sharedContext; diff --git a/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h b/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h index 5b0eca3b5a..21ee1b04b2 100644 --- a/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h +++ b/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h @@ -3,7 +3,6 @@ // Author: Robert Roebling // Purpose: GNOME printing support // Created: 09/20/04 -// RCS-ID: $Id: gprint.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: Robert Roebling // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -258,9 +257,9 @@ protected: void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); void DoDrawPoint(wxCoord x, wxCoord y); - void DoDrawLines(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); - void DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); - void DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20.0); void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); @@ -294,6 +293,8 @@ protected: virtual wxRect GetPaperRect() const; virtual int GetResolution() const; + virtual void* GetHandle() const { return (void*)m_gpc; } + private: wxPrintData m_printData; PangoContext *m_context; diff --git a/Externals/wxWidgets3/include/wx/gtk/gnome/gvfs.h b/Externals/wxWidgets3/include/wx/gtk/gnome/gvfs.h index 536da8c1f2..559f14f569 100644 --- a/Externals/wxWidgets3/include/wx/gtk/gnome/gvfs.h +++ b/Externals/wxWidgets3/include/wx/gtk/gnome/gvfs.h @@ -3,7 +3,6 @@ // Author: Robert Roebling // Purpose: GNOME VFS support // Created: 17/03/06 -// RCS-ID: $Id: gvfs.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: Robert Roebling // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/hildon/notifmsg.h b/Externals/wxWidgets3/include/wx/gtk/hildon/notifmsg.h index 3365527053..ade115fe8a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/hildon/notifmsg.h +++ b/Externals/wxWidgets3/include/wx/gtk/hildon/notifmsg.h @@ -3,7 +3,6 @@ // Purpose: Hildon implementation of wxNotificationMessage // Author: Vadim Zeitlin // Created: 2007-11-21 -// RCS-ID: $Id: notifmsg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/hyperlink.h b/Externals/wxWidgets3/include/wx/gtk/hyperlink.h index 7fdb40f020..0b6ce6bf9a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/hyperlink.h +++ b/Externals/wxWidgets3/include/wx/gtk/hyperlink.h @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 14/2/2007 -// RCS-ID: $Id: hyperlink.h 67378 2011-04-02 20:43:29Z PC $ // Copyright: (c) 2007 Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/infobar.h b/Externals/wxWidgets3/include/wx/gtk/infobar.h index 72df919e24..45563eb275 100644 --- a/Externals/wxWidgets3/include/wx/gtk/infobar.h +++ b/Externals/wxWidgets3/include/wx/gtk/infobar.h @@ -3,7 +3,6 @@ // Purpose: native implementation of wxInfoBar for GTK+ 2.18 and later // Author: Vadim Zeitlin // Created: 2009-09-26 -// RCS-ID: $Id: infobar.h 64213 2010-05-05 12:20:08Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -54,7 +53,6 @@ public: void GTKResponse(int btnid); protected: - virtual bool GTKShouldConnectSizeRequest() const { return false; } virtual void DoApplyWidgetStyle(GtkRcStyle *style); private: diff --git a/Externals/wxWidgets3/include/wx/gtk/listbox.h b/Externals/wxWidgets3/include/wx/gtk/listbox.h index b2862a935f..c40bda6a27 100644 --- a/Externals/wxWidgets3/include/wx/gtk/listbox.h +++ b/Externals/wxWidgets3/include/wx/gtk/listbox.h @@ -2,7 +2,6 @@ // Name: wx/gtk/listbox.h // Purpose: wxListBox class declaration // Author: Robert Roebling -// Id: $Id: listbox.h 67298 2011-03-23 17:36:10Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,7 +9,7 @@ #ifndef _WX_GTK_LISTBOX_H_ #define _WX_GTK_LISTBOX_H_ -struct _GtkTreeEntry; +struct _wxTreeEntry; struct _GtkTreeIter; //----------------------------------------------------------------------------- @@ -91,7 +90,7 @@ public: bool m_hasCheckBoxes; #endif // wxUSE_CHECKLISTBOX - struct _GtkTreeEntry* GTKGetEntry(unsigned pos) const; + struct _wxTreeEntry* GTKGetEntry(unsigned pos) const; void GTKDisableEvents(); void GTKEnableEvents(); @@ -111,6 +110,7 @@ protected: virtual int DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, void **clientData, wxClientDataType type); + virtual int DoInsertOneItem(const wxString& item, unsigned int pos); virtual void DoSetFirstItem(int n); virtual void DoSetItemClientData(unsigned int n, void* clientData); @@ -123,9 +123,6 @@ protected: // get the index for the given iterator, return wxNOT_FOUND on failure int GTKGetIndexFor(_GtkTreeIter& iter) const; - // set the specified item - void GTKSetItem(_GtkTreeIter& iter, const _GtkTreeEntry *entry); - // common part of DoSetFirstItem() and EnsureVisible() void DoScrollToCell(int n, float alignY, float alignX); diff --git a/Externals/wxWidgets3/include/wx/gtk/mdi.h b/Externals/wxWidgets3/include/wx/gtk/mdi.h index 6b7b50da20..02a61eb899 100644 --- a/Externals/wxWidgets3/include/wx/gtk/mdi.h +++ b/Externals/wxWidgets3/include/wx/gtk/mdi.h @@ -3,7 +3,6 @@ // Purpose: TDI-based MDI implementation for wxGTK // Author: Robert Roebling // Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes -// Id: $Id: mdi.h 69528 2011-10-25 16:56:57Z PC $ // Copyright: (c) 1998 Robert Roebling // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence @@ -67,11 +66,11 @@ public: virtual void OnInternalIdle(); protected: - void Init(); virtual void DoGetClientSize(int* width, int* height) const; private: friend class wxMDIChildFrame; + void Init(); DECLARE_DYNAMIC_CLASS(wxMDIParentFrame) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/menu.h b/Externals/wxWidgets3/include/wx/gtk/menu.h index 25302e3ace..fec12ba977 100644 --- a/Externals/wxWidgets3/include/wx/gtk/menu.h +++ b/Externals/wxWidgets3/include/wx/gtk/menu.h @@ -2,7 +2,6 @@ // Name: wx/gtk/menu.h // Purpose: // Author: Robert Roebling -// Id: $Id: menu.h 70350 2012-01-15 13:41:17Z VZ $ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,6 +20,7 @@ public: wxMenuBar(); wxMenuBar(long style); wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0); + ~wxMenuBar(); // implement base class (pure) virtuals virtual bool Append( wxMenu *menu, const wxString &title ); @@ -40,22 +40,21 @@ public: void SetLayoutDirection(wxLayoutDirection dir); wxLayoutDirection GetLayoutDirection() const; - // wxMenuBar is not a top level window but it still doesn't need a parent - // window - virtual bool GTKNeedsParent() const { return false; } - virtual void Attach(wxFrame *frame); virtual void Detach(); - // implementation only from now on - GtkWidget *m_menubar; // Public for hildon support - private: // common part of Append and Insert void GtkAppend(wxMenu* menu, const wxString& title, int pos = -1); void Init(size_t n, wxMenu *menus[], const wxString titles[], long style); + // wxMenuBar is not a top level window but it still doesn't need a parent + // window + virtual bool GTKNeedsParent() const { return false; } + + GtkWidget* m_menubar; + DECLARE_DYNAMIC_CLASS(wxMenuBar) }; @@ -82,7 +81,8 @@ public: // Returns the title, with mnemonics translated to wx format wxString GetTitle() const; - // TODO: virtual void SetTitle(const wxString& title); + // Sets the title, with mnemonics translated to gtk format + virtual void SetTitle(const wxString& title); // implementation GTK only GtkWidget *m_menu; // GtkMenu diff --git a/Externals/wxWidgets3/include/wx/gtk/menuitem.h b/Externals/wxWidgets3/include/wx/gtk/menuitem.h index 778eb8af83..c17ad03a97 100644 --- a/Externals/wxWidgets3/include/wx/gtk/menuitem.h +++ b/Externals/wxWidgets3/include/wx/gtk/menuitem.h @@ -2,7 +2,6 @@ // Name: wx/gtk/menuitem.h // Purpose: wxMenuItem class // Author: Robert Roebling -// RCS-ID: $Id: menuitem.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -36,14 +35,13 @@ public: virtual const wxBitmap& GetBitmap() const { return m_bitmap; } // implementation - void SetMenuItem(GtkWidget *menuItem) { m_menuItem = menuItem; } + void SetMenuItem(GtkWidget *menuItem); GtkWidget *GetMenuItem() const { return m_menuItem; } void SetGtkLabel(); #if WXWIN_COMPATIBILITY_2_8 // compatibility only, don't use in new code - wxDEPRECATED( - inline + wxDEPRECATED_CONSTRUCTOR( wxMenuItem(wxMenu *parentMenu, int id, const wxString& text, diff --git a/Externals/wxWidgets3/include/wx/gtk/minifram.h b/Externals/wxWidgets3/include/wx/gtk/minifram.h index ebcbeec33f..748f266a9a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/minifram.h +++ b/Externals/wxWidgets3/include/wx/gtk/minifram.h @@ -2,7 +2,6 @@ // Name: wx/gtk/minifram.h // Purpose: wxMiniFrame class // Author: Robert Roebling -// RCS-ID: $Id: minifram.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -33,6 +32,7 @@ public: { Create(parent, id, title, pos, size, style, name); } + ~wxMiniFrame(); bool Create(wxWindow *parent, wxWindowID id, diff --git a/Externals/wxWidgets3/include/wx/gtk/msgdlg.h b/Externals/wxWidgets3/include/wx/gtk/msgdlg.h index 90cc21da1f..670d7f9782 100644 --- a/Externals/wxWidgets3/include/wx/gtk/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/gtk/msgdlg.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2003/02/28 -// RCS-ID: $Id: msgdlg.h 68537 2011-08-04 22:53:42Z VZ $ // Copyright: (c) Vaclav Slavik, 2003 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/nonownedwnd.h b/Externals/wxWidgets3/include/wx/gtk/nonownedwnd.h index 8dcb75a696..70e853c1ce 100644 --- a/Externals/wxWidgets3/include/wx/gtk/nonownedwnd.h +++ b/Externals/wxWidgets3/include/wx/gtk/nonownedwnd.h @@ -3,7 +3,6 @@ // Purpose: wxGTK-specific wxNonOwnedWindow declaration. // Author: Vadim Zeitlin // Created: 2011-10-12 -// RCS-ID: $Id: nonownedwnd.h 69462 2011-10-18 21:56:52Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/notebook.h b/Externals/wxWidgets3/include/wx/gtk/notebook.h index 50cedf0171..6edbb84fb1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/notebook.h +++ b/Externals/wxWidgets3/include/wx/gtk/notebook.h @@ -3,7 +3,6 @@ // Purpose: wxNotebook class // Author: Robert Roebling // Modified by: -// RCS-ID: $Id: notebook.h 70112 2011-12-24 18:19:26Z VZ $ // Copyright: (c) Julian Smart and Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -107,9 +106,6 @@ public: bool DoPhase(int phase); #endif - // common part of all ctors - void Init(); - // Called by GTK event handler when the current page is definitely changed. void GTKOnPageChanged(); @@ -138,6 +134,7 @@ private: // the padding set by SetPadding() int m_padding; + void Init(); virtual void AddChildGTK(wxWindowGTK* child); DECLARE_DYNAMIC_CLASS(wxNotebook) diff --git a/Externals/wxWidgets3/include/wx/gtk/notifmsg.h b/Externals/wxWidgets3/include/wx/gtk/notifmsg.h new file mode 100644 index 0000000000..9135b3aee8 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/notifmsg.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/notifmsg.h +// Purpose: wxNotificationMessage for wxGTK. +// Author: Vadim Zeitlin +// Created: 2012-07-25 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_NOTIFMSG_H_ +#define _WX_GTK_NOTIFMSG_H_ + +typedef struct _NotifyNotification NotifyNotification; + +// ---------------------------------------------------------------------------- +// wxNotificationMessage +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase +{ +public: + wxNotificationMessage() { Init(); } + wxNotificationMessage(const wxString& title, + const wxString& message = wxString(), + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxNotificationMessageBase(title, message, parent, flags) + { + Init(); + } + + virtual ~wxNotificationMessage(); + + + virtual bool Show(int timeout = Timeout_Auto); + virtual bool Close(); + + // Set the name of the icon to use, overriding the default icon determined + // by the flags. Call with empty string to reset custom icon. + bool GTKSetIconName(const wxString& name); + +private: + void Init() { m_notification = NULL; } + + NotifyNotification* m_notification; + wxString m_iconName; + + wxDECLARE_NO_COPY_CLASS(wxNotificationMessage); +}; + +#endif // _WX_GTK_NOTIFMSG_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/pen.h b/Externals/wxWidgets3/include/wx/gtk/pen.h index 137066611c..85aa102747 100644 --- a/Externals/wxWidgets3/include/wx/gtk/pen.h +++ b/Externals/wxWidgets3/include/wx/gtk/pen.h @@ -2,7 +2,6 @@ // Name: wx/gtk/pen.h // Purpose: // Author: Robert Roebling -// Id: $Id: pen.h 69020 2011-09-07 16:56:50Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/popupwin.h b/Externals/wxWidgets3/include/wx/gtk/popupwin.h index 616ae41618..1c848795b9 100644 --- a/Externals/wxWidgets3/include/wx/gtk/popupwin.h +++ b/Externals/wxWidgets3/include/wx/gtk/popupwin.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: -// Id: $Id: popupwin.h 70739 2012-02-28 17:25:59Z PC $ // Copyright: (c) 2001 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/print.h b/Externals/wxWidgets3/include/wx/gtk/print.h index 3dceebb115..e4eae1cef3 100644 --- a/Externals/wxWidgets3/include/wx/gtk/print.h +++ b/Externals/wxWidgets3/include/wx/gtk/print.h @@ -3,7 +3,6 @@ // Author: Anthony Bretaudeau // Purpose: GTK printing support // Created: 2007-08-25 -// RCS-ID: $Id: print.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) Anthony Bretaudeau // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -19,8 +18,6 @@ #include "wx/printdlg.h" #include "wx/prntbase.h" #include "wx/dc.h" -#include "wx/cairo.h" - typedef struct _GtkPrintOperation GtkPrintOperation; typedef struct _GtkPrintContext GtkPrintContext; @@ -197,6 +194,7 @@ public: void SetPrintConfig( GtkPrintSettings * config ); GtkPrintOperation* GetPrintJob() { return m_job; } + void SetPrintJob(GtkPrintOperation *job) { m_job = job; } GtkPrintContext *GetPrintContext() { return m_context; } void SetPrintContext(GtkPrintContext *context) {m_context = context; } @@ -206,6 +204,8 @@ public: void SetPageSetupToSettings(GtkPrintSettings* settings, GtkPageSetup* page_setup); private: + // NB: m_config is created and owned by us, but the other objects are not + // and their accessors don't change their ref count. GtkPrintSettings *m_config; GtkPrintOperation *m_job; GtkPrintContext *m_context; @@ -227,7 +227,8 @@ public: bool IsOk() const; virtual void* GetCairoContext() const; - + virtual void* GetHandle() const; + bool CanDrawBitmap() const { return true; } void Clear(); void SetFont( const wxFont& font ); @@ -264,9 +265,9 @@ protected: void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); void DoDrawPoint(wxCoord x, wxCoord y); - void DoDrawLines(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); - void DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); - void DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); + void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20.0); void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); diff --git a/Externals/wxWidgets3/include/wx/gtk/private.h b/Externals/wxWidgets3/include/wx/gtk/private.h index 321ba28f3c..dfe8889798 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private.h +++ b/Externals/wxWidgets3/include/wx/gtk/private.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.03.02 -// RCS-ID: $Id: private.h 70475 2012-01-29 08:00:15Z PC $ // Copyright: (c) 2002 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -28,7 +27,7 @@ extern const gchar *wx_pango_version_check(int major, int minor, int micro); #if wxUSE_UNICODE - #define wxGTK_CONV(s) s.utf8_str() + #define wxGTK_CONV(s) (s).utf8_str() #define wxGTK_CONV_ENC(s, enc) wxGTK_CONV((s)) #define wxGTK_CONV_FONT(s, font) wxGTK_CONV((s)) #define wxGTK_CONV_SYS(s) wxGTK_CONV((s)) @@ -87,6 +86,17 @@ extern const gchar *wx_pango_version_check(int major, int minor, int micro); #define wxGTK_CONV_BACK_SYS(s) wxConvertFromGTK((s)) #endif +// Define a macro for converting wxString to char* in appropriate encoding for +// the file names. +#ifdef G_OS_WIN32 + // Under MSW, UTF-8 file name encodings are always used. + #define wxGTK_CONV_FN(s) (s).utf8_str() +#else + // Under Unix use GLib file name encoding (which is also UTF-8 by default + // but may be different from it). + #define wxGTK_CONV_FN(s) (s).fn_str() +#endif + // ---------------------------------------------------------------------------- // various private helper functions // ---------------------------------------------------------------------------- @@ -99,17 +109,18 @@ namespace wxGTKPrivate // // the returned widgets shouldn't be destroyed, this is done automatically on // shutdown -GtkWidget *GetButtonWidget(); -GtkWidget *GetCheckButtonWidget(); -GtkWidget *GetComboBoxWidget(); -GtkWidget *GetEntryWidget(); -GtkWidget *GetHeaderButtonWidgetFirst(); -GtkWidget *GetHeaderButtonWidgetLast(); -GtkWidget *GetHeaderButtonWidget(); -GtkWidget *GetRadioButtonWidget(); -GtkWidget *GetSplitterWidget(); -GtkWidget *GetTextEntryWidget(); -GtkWidget *GetTreeWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetButtonWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetCheckButtonWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetComboBoxWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetEntryWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetHeaderButtonWidgetFirst(); +WXDLLIMPEXP_CORE GtkWidget *GetHeaderButtonWidgetLast(); +WXDLLIMPEXP_CORE GtkWidget *GetHeaderButtonWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetNotebookWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetRadioButtonWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetSplitterWidget(wxOrientation orient = wxHORIZONTAL); +WXDLLIMPEXP_CORE GtkWidget *GetTextEntryWidget(); +WXDLLIMPEXP_CORE GtkWidget *GetTreeWidget(); } // wxGTKPrivate diff --git a/Externals/wxWidgets3/include/wx/gtk/private/dialogcount.h b/Externals/wxWidgets3/include/wx/gtk/private/dialogcount.h new file mode 100644 index 0000000000..b282e99ca5 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/private/dialogcount.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/private/dialogcount.h +// Purpose: Helper for temporarily changing wxOpenModalDialogsCount global. +// Author: Vadim Zeitlin +// Created: 2013-03-21 +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_PRIVATE_DIALOGCOUNT_H_ +#define _WX_GTK_PRIVATE_DIALOGCOUNT_H_ + +#include "wx/defs.h" + +// This global variable contains the number of currently opened modal dialogs. +// When it is non null, the global menu used in Ubuntu Unity needs to be +// explicitly disabled as this doesn't currently happen on its own due to a bug +// in Unity, see https://bugs.launchpad.net/indicator-appmenu/+bug/674605 +// +// For this to work, all modal dialogs must use wxOpenModalDialogLocker class +// below to increment this variable while they are indeed being modally shown. +// +// This variable is defined in src/gtk/toplevel.cpp +extern int wxOpenModalDialogsCount; + +// ---------------------------------------------------------------------------- +// wxOpenModalDialogLocker: Create an object of this class to increment +// wxOpenModalDialogsCount during its lifetime. +// ---------------------------------------------------------------------------- + +class wxOpenModalDialogLocker +{ +public: + wxOpenModalDialogLocker() + { + wxOpenModalDialogsCount++; + } + + ~wxOpenModalDialogLocker() + { + wxOpenModalDialogsCount--; + } + +private: + wxDECLARE_NO_COPY_CLASS(wxOpenModalDialogLocker); +}; + +#endif // _WX_GTK_PRIVATE_DIALOGCOUNT_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/private/error.h b/Externals/wxWidgets3/include/wx/gtk/private/error.h new file mode 100644 index 0000000000..5432b18bf3 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/private/error.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: gtk/private/error.h +// Purpose: Wrapper around GError. +// Author: Vadim Zeitlin +// Created: 2012-07-25 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_PRIVATE_ERROR_H_ +#define _WX_GTK_PRIVATE_ERROR_H_ + +// ---------------------------------------------------------------------------- +// wxGtkError wraps GError and releases it automatically. +// ---------------------------------------------------------------------------- + +// Create an object of this class and pass the result of its Out() method to a +// function taking "GError**", then use GetMessage() if the function returned +// false. +class wxGtkError +{ +public: + wxGtkError() { m_error = NULL; } + ~wxGtkError() { if ( m_error ) g_error_free(m_error); } + + GError** Out() + { + // This would result in a GError leak. + wxASSERT_MSG( !m_error, wxS("Can't reuse the same object.") ); + + return &m_error; + } + + wxString GetMessage() const + { + return wxString::FromUTF8(m_error->message); + } + +private: + GError* m_error; + + wxDECLARE_NO_COPY_CLASS(wxGtkError); +}; + +#endif // _WX_GTK_PRIVATE_ERROR_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/private/event.h b/Externals/wxWidgets3/include/wx/gtk/private/event.h index 7c1254fea8..eda9e6e7f4 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/event.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/event.h @@ -3,7 +3,6 @@ // Purpose: Helper functions for working with GDK and wx events // Author: Vaclav Slavik // Created: 2011-10-14 -// RCS-ID: $Id$ // Copyright: (c) 2011 Vaclav Slavik // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/gdkconv.h b/Externals/wxWidgets3/include/wx/gtk/private/gdkconv.h index d3a2ac872a..b63b0c74cd 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/gdkconv.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/gdkconv.h @@ -3,7 +3,6 @@ // Purpose: Helper functions for converting between GDK and wx types // Author: Vadim Zeitlin // Created: 2009-11-10 -// RCS-ID: $Id: gdkconv.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/gtk2-compat.h b/Externals/wxWidgets3/include/wx/gtk/private/gtk2-compat.h index fddeaafca9..20e9358d90 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/gtk2-compat.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/gtk2-compat.h @@ -3,7 +3,6 @@ // Purpose: Compatibility code for older GTK+ versions // Author: Vaclav Slavik // Created: 2011-03-25 -// RCS-ID: $Id$ // Copyright: (c) 2011 Vaclav Slavik // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -26,7 +25,7 @@ // functions even if GTK_CHECK_VERSION would indicate the function is // already available in GTK+. -#if !GTK_CHECK_VERSION(3,0,0) && !(defined(GTK_DISABLE_DEPRECATED) || defined(GSEAL_ENABLE)) +#ifndef __WXGTK3__ // ---------------------------------------------------------------------------- // the following were introduced in GTK+ 2.8 @@ -55,16 +54,13 @@ static inline gpointer wx_g_object_ref_sink(gpointer object) #define g_object_ref_sink wx_g_object_ref_sink // ---------------------------------------------------------------------------- -// the following were introduced in GTK+ 2.12 and GtkAboutDialog itself is not -// in 2.4 so skip this if we don't have it. -#if GTK_CHECK_VERSION(2,6,0) +// the following were introduced in GTK+ 2.12 static inline void wx_gtk_about_dialog_set_program_name(GtkAboutDialog* about, const gchar* name) { gtk_about_dialog_set_name(about, name); } #define gtk_about_dialog_set_program_name wx_gtk_about_dialog_set_program_name -#endif // 2.6.0 // ---------------------------------------------------------------------------- // the following were introduced in GTK+ 2.14 @@ -129,18 +125,6 @@ static inline guint16 wx_gtk_entry_get_text_length(GtkEntry* entry) } #define gtk_entry_get_text_length wx_gtk_entry_get_text_length -static inline GtkWidget* wx_gtk_font_selection_dialog_get_cancel_button(GtkFontSelectionDialog* fsd) -{ - return fsd->cancel_button; -} -#define gtk_font_selection_dialog_get_cancel_button wx_gtk_font_selection_dialog_get_cancel_button - -static inline GtkWidget* wx_gtk_font_selection_dialog_get_ok_button(GtkFontSelectionDialog* fsd) -{ - return fsd->ok_button; -} -#define gtk_font_selection_dialog_get_ok_button wx_gtk_font_selection_dialog_get_ok_button - static inline const guchar* wx_gtk_selection_data_get_data(GtkSelectionData* selection_data) { return selection_data->data; @@ -342,9 +326,66 @@ static inline GdkWindow* wx_gtk_entry_get_text_window(GtkEntry* entry) } #define gtk_entry_get_text_window wx_gtk_entry_get_text_window +// ---------------------------------------------------------------------------- +// the following were introduced in GTK+ 2.22 + +static inline GdkWindow* wx_gtk_button_get_event_window(GtkButton* button) +{ + return button->event_window; +} +#define gtk_button_get_event_window wx_gtk_button_get_event_window + +static inline GdkDragAction wx_gdk_drag_context_get_actions(GdkDragContext* context) +{ + return context->actions; +} +#define gdk_drag_context_get_actions wx_gdk_drag_context_get_actions + +static inline GdkDragAction wx_gdk_drag_context_get_selected_action(GdkDragContext* context) +{ + return context->action; +} +#define gdk_drag_context_get_selected_action wx_gdk_drag_context_get_selected_action + +static inline GdkDragAction wx_gdk_drag_context_get_suggested_action(GdkDragContext* context) +{ + return context->suggested_action; +} +#define gdk_drag_context_get_suggested_action wx_gdk_drag_context_get_suggested_action + +static inline GList* wx_gdk_drag_context_list_targets(GdkDragContext* context) +{ + return context->targets; +} +#define gdk_drag_context_list_targets wx_gdk_drag_context_list_targets + +static inline gint wx_gdk_visual_get_depth(GdkVisual* visual) +{ + return visual->depth; +} +#define gdk_visual_get_depth wx_gdk_visual_get_depth + +static inline gboolean wx_gtk_window_has_group(GtkWindow* window) +{ + return window->group != NULL; +} +#define gtk_window_has_group wx_gtk_window_has_group + // ---------------------------------------------------------------------------- // the following were introduced in GTK+ 2.24 +static inline GdkDisplay* wx_gdk_window_get_display(GdkWindow* window) +{ + return gdk_drawable_get_display(window); +} +#define gdk_window_get_display wx_gdk_window_get_display + +static inline GdkScreen* wx_gdk_window_get_screen(GdkWindow* window) +{ + return gdk_drawable_get_screen(window); +} +#define gdk_window_get_screen wx_gdk_window_get_screen + static inline gint wx_gdk_window_get_height(GdkWindow* window) { int h; @@ -369,8 +410,106 @@ static inline void wx_gdk_cairo_set_source_window(cairo_t* cr, GdkWindow* window #define gdk_cairo_set_source_window wx_gdk_cairo_set_source_window #endif -#endif // !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) +// ---------------------------------------------------------------------------- +// the following were introduced in GTK+ 3.0 +static inline void wx_gdk_window_get_geometry(GdkWindow* window, gint* x, gint* y, gint* width, gint* height) +{ + gdk_window_get_geometry(window, x, y, width, height, NULL); +} +#define gdk_window_get_geometry wx_gdk_window_get_geometry +static inline GtkWidget* wx_gtk_tree_view_column_get_button(GtkTreeViewColumn* tree_column) +{ + return tree_column->button; +} +#define gtk_tree_view_column_get_button wx_gtk_tree_view_column_get_button + +static inline GtkWidget* wx_gtk_box_new(GtkOrientation orientation, gint spacing) +{ + GtkWidget* widget; + if (orientation == GTK_ORIENTATION_HORIZONTAL) + widget = gtk_hbox_new(false, spacing); + else + widget = gtk_vbox_new(false, spacing); + return widget; +} +#define gtk_box_new wx_gtk_box_new + +static inline GtkWidget* wx_gtk_button_box_new(GtkOrientation orientation) +{ + GtkWidget* widget; + if (orientation == GTK_ORIENTATION_HORIZONTAL) + widget = gtk_hbutton_box_new(); + else + widget = gtk_vbutton_box_new(); + return widget; +} +#define gtk_button_box_new wx_gtk_button_box_new + +static inline GtkWidget* wx_gtk_scale_new(GtkOrientation orientation, GtkAdjustment* adjustment) +{ + GtkWidget* widget; + if (orientation == GTK_ORIENTATION_HORIZONTAL) + widget = gtk_hscale_new(adjustment); + else + widget = gtk_vscale_new(adjustment); + return widget; +} +#define gtk_scale_new wx_gtk_scale_new + +static inline GtkWidget* wx_gtk_scrollbar_new(GtkOrientation orientation, GtkAdjustment* adjustment) +{ + GtkWidget* widget; + if (orientation == GTK_ORIENTATION_HORIZONTAL) + widget = gtk_hscrollbar_new(adjustment); + else + widget = gtk_vscrollbar_new(adjustment); + return widget; +} +#define gtk_scrollbar_new wx_gtk_scrollbar_new + +static inline GtkWidget* wx_gtk_separator_new(GtkOrientation orientation) +{ + GtkWidget* widget; + if (orientation == GTK_ORIENTATION_HORIZONTAL) + widget = gtk_hseparator_new(); + else + widget = gtk_vseparator_new(); + return widget; +} +#define gtk_separator_new wx_gtk_separator_new + +static inline void wx_gtk_widget_get_preferred_height(GtkWidget* widget, gint* minimum, gint* natural) +{ + GtkRequisition req; + gtk_widget_size_request(widget, &req); + if (minimum) + *minimum = req.height; + if (natural) + *natural = req.height; +} +#define gtk_widget_get_preferred_height wx_gtk_widget_get_preferred_height + +static inline void wx_gtk_widget_get_preferred_width(GtkWidget* widget, gint* minimum, gint* natural) +{ + GtkRequisition req; + gtk_widget_size_request(widget, &req); + if (minimum) + *minimum = req.width; + if (natural) + *natural = req.width; +} +#define gtk_widget_get_preferred_width wx_gtk_widget_get_preferred_width + +static inline void wx_gtk_widget_get_preferred_size(GtkWidget* widget, GtkRequisition* minimum, GtkRequisition* natural) +{ + GtkRequisition* req = minimum; + if (req == NULL) + req = natural; + gtk_widget_size_request(widget, req); +} +#define gtk_widget_get_preferred_size wx_gtk_widget_get_preferred_size + +#endif // !__WXGTK3__ #endif // _WX_GTK_PRIVATE_COMPAT_H_ - diff --git a/Externals/wxWidgets3/include/wx/gtk/private/list.h b/Externals/wxWidgets3/include/wx/gtk/private/list.h index 0ec669317d..15ddf71cae 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/list.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/list.h @@ -3,7 +3,6 @@ // Purpose: wxGtkList class. // Author: Vadim Zeitlin // Created: 2011-08-21 -// RCS-ID: $Id: list.h 68842 2011-08-22 12:41:00Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/messagetype.h b/Externals/wxWidgets3/include/wx/gtk/private/messagetype.h index 72c41570e5..2c3a2a5a58 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/messagetype.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/messagetype.h @@ -3,7 +3,6 @@ // Purpose: translate between wx and GtkMessageType // Author: Vadim Zeitlin // Created: 2009-09-27 -// RCS-ID: $Id: messagetype.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/mnemonics.h b/Externals/wxWidgets3/include/wx/gtk/private/mnemonics.h index 07a363ba53..0b6e4ba45a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/mnemonics.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/mnemonics.h @@ -3,7 +3,6 @@ // Purpose: helper functions for dealing with GTK+ mnemonics // Author: Vadim Zeitlin // Created: 2007-11-12 -// RCS-ID: $Id: mnemonics.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/object.h b/Externals/wxWidgets3/include/wx/gtk/private/object.h index f420d65134..472e4c3ede 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/object.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/object.h @@ -3,7 +3,6 @@ // Purpose: wxGtkObject class declaration // Author: Vadim Zeitlin // Created: 2008-08-27 -// RCS-ID: $Id: object.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/string.h b/Externals/wxWidgets3/include/wx/gtk/private/string.h index 75b4fc3e4f..bd188d10f8 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/string.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/string.h @@ -3,7 +3,6 @@ // Purpose: wxGtkString class declaration // Author: Vadim Zeitlin // Created: 2006-10-19 -// RCS-ID: $Id: string.h 65680 2010-09-30 11:44:45Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/textmeasure.h b/Externals/wxWidgets3/include/wx/gtk/private/textmeasure.h new file mode 100644 index 0000000000..d27b096f26 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/private/textmeasure.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/private/textmeasure.h +// Purpose: wxGTK-specific declaration of wxTextMeasure class +// Author: Manuel Martin +// Created: 2012-10-05 +// Copyright: (c) 1997-2012 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_PRIVATE_TEXTMEASURE_H_ +#define _WX_GTK_PRIVATE_TEXTMEASURE_H_ + +// ---------------------------------------------------------------------------- +// wxTextMeasure +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindowDCImpl; + +class wxTextMeasure : public wxTextMeasureBase +{ +public: + wxEXPLICIT wxTextMeasure(const wxDC *dc, const wxFont *font = NULL) + : wxTextMeasureBase(dc, font) + { + Init(); + } + + wxEXPLICIT wxTextMeasure(const wxWindow *win, const wxFont *font = NULL) + : wxTextMeasureBase(win, font) + { + Init(); + } + +protected: + // Common part of both ctors. + void Init(); + + virtual void BeginMeasuring(); + virtual void EndMeasuring(); + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + virtual bool DoGetPartialTextExtents(const wxString& text, + wxArrayInt& widths, + double scaleX); + + // This class is only used for DC text measuring with GTK+ 2 as GTK+ 3 uses + // Cairo and not Pango for this. However it's still used even with GTK+ 3 + // for window text measuring, so the context and the layout are still + // needed. +#ifndef __WXGTK3__ + wxWindowDCImpl *m_wdc; +#endif // GTK+ < 3 + PangoContext *m_context; + PangoLayout *m_layout; + + wxDECLARE_NO_COPY_CLASS(wxTextMeasure); +}; + +#endif // _WX_GTK_PRIVATE_TEXTMEASURE_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/private/timer.h b/Externals/wxWidgets3/include/wx/gtk/private/timer.h index 509303cda6..89f1355bba 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/timer.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/timer.h @@ -2,7 +2,6 @@ // Name: wx/gtk/private/timer.h // Purpose: wxTimerImpl for wxGTK // Author: Robert Roebling -// Id: $Id: timer.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/private/treeentry_gtk.h b/Externals/wxWidgets3/include/wx/gtk/private/treeentry_gtk.h new file mode 100644 index 0000000000..17abe2fc77 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/private/treeentry_gtk.h @@ -0,0 +1,58 @@ +/* /////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/private/treeentry_gtk.h +// Purpose: GtkTreeEntry - a string/userdata combo for use with treeview +// Author: Ryan Norton +// Copyright: (c) 2006 Ryan Norton +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////// */ + +#ifndef _WX_GTK_TREE_ENTRY_H_ +#define _WX_GTK_TREE_ENTRY_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include /* for gpointer and gchar* etc. */ + +#define WX_TYPE_TREE_ENTRY wx_tree_entry_get_type() +#define WX_TREE_ENTRY(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, wx_tree_entry_get_type(), wxTreeEntry) +#define WX_IS_TREE_ENTRY(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, wx_tree_entry_get_type()) + +typedef struct _wxTreeEntry wxTreeEntry; + +typedef void (*wxTreeEntryDestroy)(wxTreeEntry* entry, void* context); + +struct _wxTreeEntry +{ + GObject parent; /* object instance */ + gchar* label; /* label - always copied by this object except on get */ + gchar* collate_key; /* collate key used for string comparisons/sorting */ + gpointer userdata; /* untouched userdata */ + wxTreeEntryDestroy destroy_func; /* called upon destruction - use for freeing userdata etc. */ + gpointer destroy_func_data; /* context passed to destroy_func */ +}; + +wxTreeEntry* wx_tree_entry_new(void); + +GType wx_tree_entry_get_type(void); + +char* wx_tree_entry_get_collate_key(wxTreeEntry* entry); + +char* wx_tree_entry_get_label(wxTreeEntry* entry); + +void* wx_tree_entry_get_userdata(wxTreeEntry* entry); + +void wx_tree_entry_set_label(wxTreeEntry* entry, const char* label); + +void wx_tree_entry_set_userdata(wxTreeEntry* entry, void* userdata); + +void wx_tree_entry_set_destroy_func(wxTreeEntry* entry, + wxTreeEntryDestroy destroy_func, + gpointer destroy_func_data); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _WX_GTK_TREE_ENTRY_H_ */ diff --git a/Externals/wxWidgets3/include/wx/gtk/private/win_gtk.h b/Externals/wxWidgets3/include/wx/gtk/private/win_gtk.h index 5d49572227..0fd421f3bc 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private/win_gtk.h +++ b/Externals/wxWidgets3/include/wx/gtk/private/win_gtk.h @@ -2,7 +2,6 @@ // Name: wx/gtk/private/win_gtk.h // Purpose: native GTK+ widget for wxWindow // Author: Robert Roebling -// Id: $Id: win_gtk.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////// */ @@ -10,8 +9,6 @@ #ifndef _WX_GTK_PIZZA_H_ #define _WX_GTK_PIZZA_H_ -#include - #define WX_PIZZA(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, wxPizza::type(), wxPizza) #define WX_IS_PIZZA(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, wxPizza::type()) @@ -23,16 +20,16 @@ struct WXDLLIMPEXP_CORE wxPizza static GtkWidget* New(long windowStyle = 0); static GType type(); - void move(GtkWidget* widget, int x, int y); - void put(GtkWidget* widget, int x, int y); + void move(GtkWidget* widget, int x, int y, int width, int height); + void put(GtkWidget* widget, int x, int y, int width, int height); void scroll(int dx, int dy); - void get_border_widths(int& x, int& y); + void get_border(GtkBorder& border); GtkFixed m_fixed; + GList* m_children; int m_scroll_x; int m_scroll_y; - int m_border_style; - bool m_is_scrollable; + int m_windowStyle; }; #endif // _WX_GTK_PIZZA_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/radiobox.h b/Externals/wxWidgets3/include/wx/gtk/radiobox.h index ced13bc390..a7f6bd9125 100644 --- a/Externals/wxWidgets3/include/wx/gtk/radiobox.h +++ b/Externals/wxWidgets3/include/wx/gtk/radiobox.h @@ -2,7 +2,6 @@ // Name: wx/gtk/radiobox.h // Purpose: // Author: Robert Roebling -// Id: $Id: radiobox.h 67298 2011-03-23 17:36:10Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,7 +27,7 @@ class WXDLLIMPEXP_CORE wxRadioBox : public wxControl, { public: // ctors and dtor - wxRadioBox() { Init(); } + wxRadioBox() { } wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title, @@ -41,8 +40,6 @@ public: const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr) { - Init(); - Create( parent, id, title, pos, size, n, choices, majorDim, style, val, name ); } @@ -57,8 +54,6 @@ public: const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr) { - Init(); - Create( parent, id, title, pos, size, choices, majorDim, style, val, name ); } diff --git a/Externals/wxWidgets3/include/wx/gtk/radiobut.h b/Externals/wxWidgets3/include/wx/gtk/radiobut.h index 60b508b148..165370aa12 100644 --- a/Externals/wxWidgets3/include/wx/gtk/radiobut.h +++ b/Externals/wxWidgets3/include/wx/gtk/radiobut.h @@ -2,7 +2,6 @@ // Name: wx/gtk/radiobut.h // Purpose: // Author: Robert Roebling -// Id: $Id: radiobut.h 62785 2009-12-05 19:25:04Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/region.h b/Externals/wxWidgets3/include/wx/gtk/region.h index 18b2f26169..a2231a1950 100644 --- a/Externals/wxWidgets3/include/wx/gtk/region.h +++ b/Externals/wxWidgets3/include/wx/gtk/region.h @@ -2,7 +2,6 @@ // Name: wx/gtk/region.h // Purpose: // Author: Robert Roebling -// Id: $Id: region.h 69815 2011-11-25 00:52:24Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,6 +9,10 @@ #ifndef _WX_GTK_REGION_H_ #define _WX_GTK_REGION_H_ +#ifdef __WXGTK3__ +typedef struct _cairo_region cairo_region_t; +#endif + // ---------------------------------------------------------------------------- // wxRegion // ---------------------------------------------------------------------------- @@ -56,12 +59,12 @@ public: virtual void Clear(); virtual bool IsEmpty() const; -public: - // Init with GdkRegion, set ref count to 2 so that - // the C++ class will not destroy the region! - wxRegion( GdkRegion *region ); - +#ifdef __WXGTK3__ + cairo_region_t* GetRegion() const; +#else + wxRegion(const GdkRegion* region); GdkRegion *GetRegion() const; +#endif protected: virtual wxGDIRefData *CreateGDIRefData() const; diff --git a/Externals/wxWidgets3/include/wx/gtk/scrolbar.h b/Externals/wxWidgets3/include/wx/gtk/scrolbar.h index 2ab5353ed8..e49bb7a2ce 100644 --- a/Externals/wxWidgets3/include/wx/gtk/scrolbar.h +++ b/Externals/wxWidgets3/include/wx/gtk/scrolbar.h @@ -2,7 +2,6 @@ // Name: wx/gtk/scrolbar.h // Purpose: // Author: Robert Roebling -// Id: $Id: scrolbar.h 67326 2011-03-28 06:27:49Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/scrolwin.h b/Externals/wxWidgets3/include/wx/gtk/scrolwin.h index d7f188bb90..c36040ce88 100644 --- a/Externals/wxWidgets3/include/wx/gtk/scrolwin.h +++ b/Externals/wxWidgets3/include/wx/gtk/scrolwin.h @@ -4,7 +4,6 @@ // Author: Robert Roebling // Modified by: Vadim Zeitlin (2005-10-10): wxScrolledWindow is now common // Created: 01/02/97 -// RCS-ID: $Id: scrolwin.h 58773 2009-02-08 20:51:44Z PC $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -30,6 +29,8 @@ public: bool noRefresh = false); virtual void AdjustScrollbars(); + virtual bool IsScrollbarShown(int orient) const; + protected: virtual void DoScroll(int x, int y); virtual void DoShowScrollbars(wxScrollbarVisibility horz, diff --git a/Externals/wxWidgets3/include/wx/gtk/setup0.h b/Externals/wxWidgets3/include/wx/gtk/setup0.h new file mode 100644 index 0000000000..ba0bee22fc --- /dev/null +++ b/Externals/wxWidgets3/include/wx/gtk/setup0.h @@ -0,0 +1,1665 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 0 + +// This setting determines the compatibility with 2.8 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_8 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// wxDEBUG_LEVEL will be defined as 1 in wx/debug.h so normally there is no +// need to define it here. You may do it for two reasons: either completely +// disable/compile out the asserts in release version (then do it inside #ifdef +// NDEBUG) or, on the contrary, enable more asserts, including the usually +// disabled ones, in the debug build (then do it inside #ifndef NDEBUG) +// +// #ifdef NDEBUG +// #define wxDEBUG_LEVEL 0 +// #else +// #define wxDEBUG_LEVEL 2 +// #endif + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug build (_DEBUG +// is defined) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// The rest of the options in this section are obsolete and not supported, +// enable them at your own risk. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for MinGW/Cygwin. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// These settings are obsolete: the library is always built in Unicode mode +// now, only set wxUSE_UNICODE to 0 to compile legacy code in ANSI mode if +// absolutely necessary -- updating it is strongly recommended as the ANSI mode +// will disappear completely in future wxWidgets releases. +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 1 +#endif + +// wxUSE_WCHAR_T is required by wxWidgets now, don't change. +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// Enable the use of compiler-specific thread local storage keyword, if any. +// This is used for wxTLS_XXX() macros implementation and normally should use +// the compiler-provided support as it's simpler and more efficient, but must +// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using +// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS +// support that results in crashes when any TLS variables are used. So if you +// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set +// this to 0. +// +// Default is 1, but set to 0 if the scenario above is applicable. +#define wxUSE_COMPILER_TLS 1 + +// ---------------------------------------------------------------------------- +// Interoperability with the standard library. +// ---------------------------------------------------------------------------- + +// Set wxUSE_STL to 1 to enable maximal interoperability with the standard +// library, even at the cost of backwards compatibility. +// +// Default is 0 +// +// Recommended setting: 0 as the options below already provide a relatively +// good level of interoperability and changing this option arguably isn't worth +// diverging from the official builds of the library. +#define wxUSE_STL 0 + +// This is not a real option but is used as the default value for +// wxUSE_STD_IOSTREAM, wxUSE_STD_STRING and wxUSE_STD_CONTAINERS. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library headers, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_DEFAULT 0 +#else + #define wxUSE_STD_DEFAULT 1 +#endif + +// Use standard C++ containers to implement wxVector<>, wxStack<>, wxDList<> +// and wxHashXXX<> classes. If disabled, wxWidgets own (mostly compatible but +// usually more limited) implementations are used which allows to avoid the +// dependency on the C++ run-time library. +// +// Notice that the compilers mentioned in wxUSE_STD_DEFAULT comment above don't +// support using standard containers and that VC6 needs non-default options for +// such build to avoid getting "fatal error C1076: compiler limit : internal +// heap limit reached; use /Zm to specify a higher limit" in its own standard +// headers, so you need to ensure you do increase the heap size before enabling +// this option for this compiler. +// +// Default is 0 for compatibility reasons. +// +// Recommended setting: 1 unless compatibility with the official wxWidgets +// build and/or the existing code is a concern. +#define wxUSE_STD_CONTAINERS 0 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled, wx streams are used everywhere and wxWidgets doesn't depend on the +// standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 1 if compiler supports it. +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM wxUSE_STD_DEFAULT + +// Enable minimal interoperability with the standard C++ string class if 1. +// "Minimal" means that wxString can be constructed from std::string or +// std::wstring but can't be implicitly converted to them. You need to enable +// the option below for the latter. +// +// Default is 1 for most compilers. +// +// Recommended setting: 1 unless you want to ensure your program doesn't use +// the standard C++ library at all. +#define wxUSE_STD_STRING wxUSE_STD_DEFAULT + +// Make wxString as much interchangeable with std::[w]string as possible, in +// particular allow implicit conversion of wxString to either of these classes. +// This comes at a price (or a benefit, depending on your point of view) of not +// allowing implicit conversion to "const char *" and "const wchar_t *". +// +// Because a lot of existing code relies on these conversions, this option is +// disabled by default but can be enabled for your build if you don't care +// about compatibility. +// +// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// +// Recommended setting: 0 to remain compatible with the official builds of +// wxWidgets. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL + +// VC++ 4.2 and above allows and but you can't mix +// them. Set this option to 1 to use , 0 to use . +// +// Note that newer compilers (including VC++ 7.1 and later) don't support +// wxUSE_IOSTREAMH == 1 and so will be used anyhow. +// +// Default is 0. +// +// Recommended setting: 0, only set to 1 if you use a really old compiler +#define wxUSE_IOSTREAMH 0 + + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_BASE64 to 1, to compile in Base64 support. This is required for +// storing binary data in wxConfig on most platforms. +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_BASE64 1 + +// Set this to 1 to be able to use wxEventLoop even in console applications +// (i.e. using base library only, without GUI). This is mostly useful for +// processing socket events but is also necessary to use timers in console +// applications +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_CONSOLE_EVENTLOOP 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Set wxUSE_FSWATCHER to 1 if you want to enable wxFileSystemWatcher +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_FSWATCHER 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to use ipv6 socket classes (requires wxUSE_SOCKETS) +// +// Notice that currently setting this option under Windows will result in +// programs which can only run on recent OS versions (with ws2_32.dll +// installed) which is why it is disabled by default. +// +// Default is 1. +// +// Recommended setting: 1 if you need IPv6 support +#define wxUSE_IPV6 0 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontEnumerator class +#define wxUSE_FONTENUM 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for wxAny class, the successor for wxVariant. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size by a small amount, +// or your compiler cannot for some reason cope with complexity of templates used. +#define wxUSE_ANY 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + +// Use wxWidget's Ribbon classes for interfaces +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_RIBBON 1 + +// Use wxPropertyGrid. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_PROPGRID 1 + +// Use wxStyledTextCtrl, a wxWidgets implementation of Scintilla. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STC 1 + +// Use wxWidget's web viewing classes +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WEBVIEW 1 + +// Use the IE wxWebView backend +// +// Default is 1 on MSW +// +// Recommended setting: 1 +#ifdef __WXMSW__ +#define wxUSE_WEBVIEW_IE 1 +#else +#define wxUSE_WEBVIEW_IE 0 +#endif + +// Use the WebKit wxWebView backend +// +// Default is 1 on GTK and OSX +// +// Recommended setting: 1 +#if defined(__WXGTK__) || defined(__WXOSX__) +#define wxUSE_WEBVIEW_WEBKIT 1 +#else +#define wxUSE_WEBVIEW_WEBKIT 0 +#endif + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows gdiplus.dll is loaded dynamically which means +// that nothing special needs to be done as long as you don't use +// wxGraphicsContext at all or only use it on XP and later systems but you +// still do need to distribute it yourself for an application using +// wxGraphicsContext to be runnable on pre-XP systems. +// +// Default is 1 except if you're using a non-Microsoft compiler under Windows +// as only MSVC7+ is known to ship with gdiplus.h. For other compilers (e.g. +// mingw32) you may need to install the headers (and just the headers) +// yourself. If you do, change the setting below manually. +// +// Recommended setting: 1 if supported by the compilation environment + +// notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is +// included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined +#ifdef _MSC_VER +# if _MSC_VER >= 1310 + // MSVC7.1+ comes with new enough Platform SDK, enable + // wxGraphicsContext support for it +# define wxUSE_GRAPHICS_CONTEXT 1 +# else + // MSVC 6 didn't include GDI+ headers so disable by default, enable it + // here if you use MSVC 6 with a newer SDK +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#else + // Disable support for other Windows compilers, enable it if your compiler + // comes with new enough SDK or you installed the headers manually. + // + // Notice that this will be set by configure under non-Windows platforms + // anyhow so the value there is not important. +# define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// Enable wxGraphicsContext implementation using Cairo library. +// +// This is not needed under Windows and detected automatically by configure +// under other systems, however you may set this to 1 manually if you installed +// Cairo under Windows yourself and prefer to use it instead the native GDI+ +// implementation. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_CAIRO 0 + + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// Support markup in control labels, i.e. provide wxControl::SetLabelMarkup(). +// Currently markup is supported only by a few controls and only some ports but +// their number will increase with time. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you want to save on code size) +#define wxUSE_MARKUP 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BANNERWINDOW 1 // wxBannerWindow +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_COMMANDLINKBUTTON 1 // wxCommandLinkButton +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_EDITABLELISTBOX 1 // wxEditableListBox +#define wxUSE_FILECTRL 1 // wxFileCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HEADERCTRL 1 // wxHeaderCtrl +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_RICHMSGDLG 1 // wxRichMessageDialog +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TIMEPICKCTRL 1 // wxTimePickerCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl +#define wxUSE_TREELISTCTRL 1 // wxTreeListCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTaskBarIcon is a small notification icon shown in the system toolbar or +// dock. +// +// Default is 1. +// +// Recommended setting: 1 (but can be set to 0 if you don't need it) +#define wxUSE_TASKBARICON 1 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// wxRearrangeCtrl is a wxCheckListBox with two buttons allowing to move items +// up and down in it. It is also used as part of wxRearrangeDialog. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 (currently used only by +// wxHeaderCtrl) +#define wxUSE_REARRANGECTRL 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Use the standard art provider. The icons returned by this provider are +// embedded into the library as XPMs so disabling it reduces the library size +// somewhat but this should only be done if you use your own custom art +// provider returning the icons or never use any icons not provided by the +// native art provider (which might not be implemented at all for some +// platforms) or by the Tango icons provider (if it's not itself disabled +// below). +// +// Default is 1. +// +// Recommended setting: 1 unless you use your own custom art provider. +#define wxUSE_ARTPROVIDER_STD 1 + +// Use art provider providing Tango icons: this art provider has higher quality +// icons than the default ones using smaller size XPM icons without +// transparency but the embedded PNG icons add to the library size. +// +// Default is 1 under non-GTK ports. Under wxGTK the native art provider using +// the GTK+ stock icons replaces it so it is normally not necessary. +// +// Recommended setting: 1 but can be turned off to reduce the library size. +#define wxUSE_ARTPROVIDER_TANGO 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxInfoBar class. +// +// Default is 1. +// +// Recommended setting: 1 (but can be disabled without problems as nothing +// depends on it) +#define wxUSE_INFOBAR 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxNotificationMessage. +// +// wxNotificationMessage allows to show non-intrusive messages to the user +// using balloons, banners, popups or whatever is the appropriate method for +// the current platform. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTIFICATION_MESSAGE 1 + +// wxPreferencesEditor provides a common API for different ways of presenting +// the standard "Preferences" or "Properties" dialog under different platforms +// (e.g. some use modal dialogs, some use modeless ones; some apply the changes +// immediately while others require an explicit "Apply" button). +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_PREFERENCES_EDITOR 1 + +// wxRichToolTip is a customizable tooltip class which has more functionality +// than the stock (but native, unlike this class) wxToolTip. +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely set to 0 if you don't need it) +#define wxUSE_RICHTOOLTIP 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// Use reference counted ID management: this means that wxWidgets will track +// the automatically allocated ids (those used when you use wxID_ANY when +// creating a window, menu or toolbar item &c) instead of just supposing that +// the program never runs out of them. This is mostly useful only under wxMSW +// where the total ids range is limited to SHRT_MIN..SHRT_MAX and where +// long-running programs can run into problems with ids reuse without this. On +// the other platforms, where the ids have the full int range, this shouldn't +// be necessary. +#ifdef __WXMSW__ +#define wxUSE_AUTOID_MANAGEMENT 1 +#else +#define wxUSE_AUTOID_MANAGEMENT 0 +#endif + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// wxFileHistory class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_FILE_HISTORY 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1 and, under Windows, also to add opengl32.lib and glu32.lib to the +// list of libraries used to link your application (although this is done +// implicitly for Microsoft Visual C++ users). +// +// Default is 1 unless the compiler is known to ship without the necessary +// headers (Digital Mars) or the platform doesn't support OpenGL (Windows CE). +// +// Recommended setting: 1 if you intend to use OpenGL, can be safely set to 0 +// otherwise. +#define wxUSE_GLCANVAS 1 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running. +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// Compile wxUIActionSimulator class? +#define wxUSE_UIACTIONSIMULATOR 1 + +// ---------------------------------------------------------------------------- +// wxDC classes for various output formats +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// Set to 1 to compile in support for wxSVGFileDC, a wxDC subclass which allows +// to create files in SVG (Scalable Vector Graphics) format. +#define wxUSE_SVG 1 + +// Should wxDC provide SetTransformMatrix() and related methods? +// +// Default is 1 but can be set to 0 if this functionality is not used. Notice +// that currently only wxMSW supports this so setting this to 0 doesn't change +// much for non-MSW platforms (although it will still save a few bytes +// probably). +// +// Recommended setting: 1. +#define wxUSE_DC_TRANSFORM_MATRIX 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +/* --- start MSW options --- */ +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 1 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 1 + +// wxDC caching implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmap data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 + +// Set this to 1 to compile in wxRegKey class. +// +// Default is 1 +// +// Recommended setting: 1, this is used internally by wx in a few places +#define wxUSE_REGKEY 1 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile +#define wxUSE_RICHEDIT 1 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 1 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set this to 1 to enable MSW-specific wxTaskBarIcon::ShowBalloon() method. It +// is required by native wxNotificationMessage implementation. +// +// Default is 1 but disabled in wx/msw/chkconf.h if SDK is too old to contain +// the necessary declarations. +// +// Recommended setting: 1, set to 0 for a tiny library size reduction +#define wxUSE_TASKBARICON_BALLOONS 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 0 + +// Set to 1 to enable .INI files based wxConfig implementation (wxIniConfig) +// +// Default is 0. +// +// Recommended setting: 0, nobody uses .INI files any more +#define wxUSE_INICONF 0 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// Set this to 1 to be able to use wxTimePickerCtrlGeneric in addition to the +// native wxTimePickerCtrl for the platforms that have the latter (MSW). +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_TIMEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 +/* --- end MSW options --- */ + +// GTK-specific options used when not using configure. As we can't test for the +// exact GTK version (without including GTK+ headers that we don't want to +// include from our own public headers), just assume a recent GTK 2.x. +#define __WXGTK20__ +#define __WXGTK210__ +#define __WXGTK218__ +//#define __WXGTK3__ + +#endif // _WX_SETUP_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/slider.h b/Externals/wxWidgets3/include/wx/gtk/slider.h index 01fc6136f0..f8833c4685 100644 --- a/Externals/wxWidgets3/include/wx/gtk/slider.h +++ b/Externals/wxWidgets3/include/wx/gtk/slider.h @@ -2,7 +2,6 @@ // Name: wx/gtk/slider.h // Purpose: // Author: Robert Roebling -// Id: $Id: slider.h 65680 2010-09-30 11:44:45Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -30,6 +29,7 @@ public: Create( parent, id, value, minValue, maxValue, pos, size, style, validator, name ); } + ~wxSlider(); bool Create(wxWindow *parent, wxWindowID id, diff --git a/Externals/wxWidgets3/include/wx/gtk/spinbutt.h b/Externals/wxWidgets3/include/wx/gtk/spinbutt.h index a38cd703c1..4a9d20461e 100644 --- a/Externals/wxWidgets3/include/wx/gtk/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/gtk/spinbutt.h @@ -3,7 +3,6 @@ // Purpose: wxSpinButton class // Author: Robert Roebling // Modified by: -// RCS-ID: $Id: spinbutt.h 62785 2009-12-05 19:25:04Z PC $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/spinctrl.h b/Externals/wxWidgets3/include/wx/gtk/spinctrl.h index d0c4d35ebd..ef7b6edb7d 100644 --- a/Externals/wxWidgets3/include/wx/gtk/spinctrl.h +++ b/Externals/wxWidgets3/include/wx/gtk/spinctrl.h @@ -3,7 +3,6 @@ // Purpose: wxSpinCtrl class // Author: Robert Roebling // Modified by: -// RCS-ID: $Id: spinctrl.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -73,13 +72,15 @@ protected: void GtkEnableEvents() const; virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; // Widgets that use the style->base colour for the BG colour should // override this and return true. virtual bool UseGTKStyleBase() const { return true; } - DECLARE_DYNAMIC_CLASS(wxSpinCtrlGTKBase) + friend class wxSpinCtrlEventDisabler; + DECLARE_EVENT_TABLE() }; @@ -90,7 +91,7 @@ protected: class WXDLLIMPEXP_CORE wxSpinCtrl : public wxSpinCtrlGTKBase { public: - wxSpinCtrl() {} + wxSpinCtrl() { Init(); } wxSpinCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxString& value = wxEmptyString, @@ -100,6 +101,8 @@ public: int min = 0, int max = 100, int initial = 0, const wxString& name = wxS("wxSpinCtrl")) { + Init(); + Create(parent, id, value, pos, size, style, min, max, initial, name); } @@ -128,6 +131,18 @@ public: void SetRange( int minVal, int maxVal ) { DoSetRange(minVal, maxVal); } void SetIncrement(int inc) { DoSetIncrement(inc); } + virtual int GetBase() const { return m_base; } + virtual bool SetBase(int base); + +private: + // Common part of all ctors. + void Init() + { + m_base = 10; + } + + int m_base; + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) }; @@ -181,6 +196,9 @@ public: void SetIncrement(double inc) { DoSetIncrement(inc); } void SetDigits(unsigned digits); + virtual int GetBase() const { return 10; } + virtual bool SetBase(int WXUNUSED(base)) { return false; } + DECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/statbmp.h b/Externals/wxWidgets3/include/wx/gtk/statbmp.h index 2c98b31496..b7bba950d0 100644 --- a/Externals/wxWidgets3/include/wx/gtk/statbmp.h +++ b/Externals/wxWidgets3/include/wx/gtk/statbmp.h @@ -2,7 +2,6 @@ // Name: wx/gtk/statbmp.h // Purpose: // Author: Robert Roebling -// Id: $Id: statbmp.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/statbox.h b/Externals/wxWidgets3/include/wx/gtk/statbox.h index 0d9ab6f624..80dbb7f594 100644 --- a/Externals/wxWidgets3/include/wx/gtk/statbox.h +++ b/Externals/wxWidgets3/include/wx/gtk/statbox.h @@ -2,7 +2,6 @@ // Name: wx/gtk/statbox.h // Purpose: // Author: Robert Roebling -// Id: $Id: statbox.h 70738 2012-02-28 17:06:56Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/statline.h b/Externals/wxWidgets3/include/wx/gtk/statline.h index 04f9e56822..aa4077671f 100644 --- a/Externals/wxWidgets3/include/wx/gtk/statline.h +++ b/Externals/wxWidgets3/include/wx/gtk/statline.h @@ -2,7 +2,6 @@ // Name: wx/gtk/statline.h // Purpose: // Author: Robert Roebling -// Id: $Id: statline.h 43874 2006-12-09 14:52:59Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/stattext.h b/Externals/wxWidgets3/include/wx/gtk/stattext.h index 7412e70449..f6d88cb83a 100644 --- a/Externals/wxWidgets3/include/wx/gtk/stattext.h +++ b/Externals/wxWidgets3/include/wx/gtk/stattext.h @@ -2,7 +2,6 @@ // Name: wx/gtk/stattext.h // Purpose: // Author: Robert Roebling -// Id: $Id: stattext.h 67062 2011-02-27 12:48:07Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -48,10 +47,6 @@ protected: virtual bool GTKWidgetNeedsMnemonic() const; virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); - virtual void DoSetSize(int x, int y, - int width, int height, - int sizeFlags = wxSIZE_AUTO); - virtual wxSize DoGetBestSize() const; virtual wxString DoGetLabel() const; diff --git a/Externals/wxWidgets3/include/wx/gtk/taskbar.h b/Externals/wxWidgets3/include/wx/gtk/taskbar.h index ba47591d5f..03bd8daff0 100644 --- a/Externals/wxWidgets3/include/wx/gtk/taskbar.h +++ b/Externals/wxWidgets3/include/wx/gtk/taskbar.h @@ -3,7 +3,6 @@ // Purpose: wxTaskBarIcon class for GTK2 // Author: Paul Cornett // Created: 2009-02-08 -// RCS-ID: $Id: taskbar.h 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) 2009 Paul Cornett // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -14,7 +13,7 @@ class WXDLLIMPEXP_ADV wxTaskBarIcon: public wxTaskBarIconBase { public: - wxTaskBarIcon(); + wxTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE); ~wxTaskBarIcon(); virtual bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxString()); virtual bool RemoveIcon(); diff --git a/Externals/wxWidgets3/include/wx/gtk/textctrl.h b/Externals/wxWidgets3/include/wx/gtk/textctrl.h index fb214dc5f9..9fefd91975 100644 --- a/Externals/wxWidgets3/include/wx/gtk/textctrl.h +++ b/Externals/wxWidgets3/include/wx/gtk/textctrl.h @@ -3,7 +3,6 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// Id: $Id: textctrl.h 68450 2011-07-29 15:11:54Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -145,28 +144,26 @@ public: GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); protected: - // wxGTK-specific: called recursively by Enable, - // to give widgets an oppprtunity to correct their colours after they - // have been changed by Enable - virtual void OnEnabled(bool enable); - // overridden wxWindow virtual methods virtual wxSize DoGetBestSize() const; virtual void DoApplyWidgetStyle(GtkRcStyle *style); virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + virtual void DoFreeze(); virtual void DoThaw(); - // common part of all ctors - void Init(); - // Widgets that use the style->base colour for the BG colour should // override this and return true. virtual bool UseGTKStyleBase() const { return true; } virtual void DoSetValue(const wxString &value, int flags = 0); + // Override this to use either GtkEntry or GtkTextView IME depending on the + // kind of control we are. + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + virtual wxPoint DoPositionToCoords(long pos) const; // wrappers hiding the differences between functions doing the same thing @@ -179,6 +176,8 @@ protected: void GTKSetJustification(); private: + void Init(); + // overridden wxTextEntry virtual methods virtual GtkEditable *GetEditable() const; virtual GtkEntry *GetEntry() const; diff --git a/Externals/wxWidgets3/include/wx/gtk/textentry.h b/Externals/wxWidgets3/include/wx/gtk/textentry.h index c9084a53f4..5df686cf24 100644 --- a/Externals/wxWidgets3/include/wx/gtk/textentry.h +++ b/Externals/wxWidgets3/include/wx/gtk/textentry.h @@ -3,7 +3,6 @@ // Purpose: wxGTK-specific wxTextEntry implementation // Author: Vadim Zeitlin // Created: 2007-09-24 -// RCS-ID: $Id: textentry.h 67509 2011-04-16 17:27:04Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,6 +10,7 @@ #ifndef _WX_GTK_TEXTENTRY_H_ #define _WX_GTK_TEXTENTRY_H_ +typedef struct _GdkEventKey GdkEventKey; typedef struct _GtkEditable GtkEditable; typedef struct _GtkEntry GtkEntry; @@ -50,8 +50,18 @@ public: // implementation only from now on void SendMaxLenEvent(); + bool GTKEntryOnInsertText(const char* text); protected: + // This method must be called from the derived class Create() to connect + // the handlers for the clipboard (cut/copy/paste) events. + void GTKConnectClipboardSignals(GtkWidget* entry); + + // And this one to connect "insert-text" signal. + void GTKConnectInsertTextSignal(GtkEntry* entry); + + + virtual void DoSetValue(const wxString& value, int flags); virtual wxString DoGetValue() const; // margins functions @@ -60,6 +70,9 @@ protected: virtual bool DoAutoCompleteStrings(const wxArrayString& choices); + // Override the base class method to use GtkEntry IM context. + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + private: // implement this to return the associated GtkEntry or another widget // implementing GtkEditable diff --git a/Externals/wxWidgets3/include/wx/gtk/tglbtn.h b/Externals/wxWidgets3/include/wx/gtk/tglbtn.h index 514f5e4e7e..d6975311f4 100644 --- a/Externals/wxWidgets3/include/wx/gtk/tglbtn.h +++ b/Externals/wxWidgets3/include/wx/gtk/tglbtn.h @@ -5,7 +5,6 @@ // Author: John Norris, minor changes by Axel Schlueter // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) 2000 Johnny C. Norris II // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -15,13 +14,6 @@ #include "wx/bitmap.h" -//----------------------------------------------------------------------------- -// classes -//----------------------------------------------------------------------------- - -class WXDLLIMPEXP_FWD_CORE wxToggleButton; -class WXDLLIMPEXP_FWD_CORE wxToggleBitmapButton; - //----------------------------------------------------------------------------- // wxToggleButton //----------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/include/wx/gtk/toolbar.h b/Externals/wxWidgets3/include/wx/gtk/toolbar.h index ea71a5c91b..d504b6c2e8 100644 --- a/Externals/wxWidgets3/include/wx/gtk/toolbar.h +++ b/Externals/wxWidgets3/include/wx/gtk/toolbar.h @@ -2,7 +2,6 @@ // Name: wx/gtk/toolbar.h // Purpose: GTK toolbar // Author: Robert Roebling -// RCS-ID: $Id: toolbar.h 70854 2012-03-10 00:01:09Z RD $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -73,6 +72,9 @@ public: // -------------------------- protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_DEFAULT; } + virtual wxSize DoGetBestSize() const; virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; diff --git a/Externals/wxWidgets3/include/wx/gtk/tooltip.h b/Externals/wxWidgets3/include/wx/gtk/tooltip.h index e82880d638..25c682b428 100644 --- a/Externals/wxWidgets3/include/wx/gtk/tooltip.h +++ b/Externals/wxWidgets3/include/wx/gtk/tooltip.h @@ -2,7 +2,6 @@ // Name: wx/gtk/tooltip.h // Purpose: wxToolTip class // Author: Robert Roebling -// Id: $Id: tooltip.h 67298 2011-03-23 17:36:10Z PC $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/gtk/toplevel.h b/Externals/wxWidgets3/include/wx/gtk/toplevel.h index c17f62ed77..9f9374b06b 100644 --- a/Externals/wxWidgets3/include/wx/gtk/toplevel.h +++ b/Externals/wxWidgets3/include/wx/gtk/toplevel.h @@ -2,7 +2,6 @@ // Name: wx/gtk/toplevel.h // Purpose: // Author: Robert Roebling -// Id: $Id: toplevel.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -95,6 +94,8 @@ public: virtual void GTKHandleRealized(); + void GTKConfigureEvent(int x, int y); + // do *not* call this to iconize the frame, this is a private function! void SetIconizeState(bool iconic); @@ -109,7 +110,11 @@ public: m_gdkDecor; // size of WM decorations - wxSize m_decorSize; + struct DecorSize + { + int left, right, top, bottom; + }; + DecorSize m_decorSize; // private gtk_timeout_add result for mimicing wxUSER_ATTENTION_INFO and // wxUSER_ATTENTION_ERROR difference, -2 for no hint, -1 for ERROR hint, rest for GtkTimeout handle. @@ -120,7 +125,7 @@ public: // return the size of the window without WM decorations void GTKDoGetSize(int *width, int *height) const; - void GTKUpdateDecorSize(const wxSize& decorSize); + void GTKUpdateDecorSize(const DecorSize& decorSize); protected: // give hints to the Window Manager for how the size @@ -128,9 +133,6 @@ protected: virtual void DoSetSizeHints( int minW, int minH, int maxW, int maxH, int incW, int incH); - // common part of all ctors - void Init(); - // move the window to the specified location and resize it virtual void DoMoveWindow(int x, int y, int width, int height); @@ -148,7 +150,11 @@ protected: bool m_deferShow; private: - wxSize& GetCachedDecorSize(); + void Init(); + DecorSize& GetCachedDecorSize(); + + // size hint increments + int m_incWidth, m_incHeight; // is the frame currently iconized? bool m_isIconized; diff --git a/Externals/wxWidgets3/include/wx/gtk/webview_webkit.h b/Externals/wxWidgets3/include/wx/gtk/webview_webkit.h index cfb7e08aaa..e1a01bf811 100644 --- a/Externals/wxWidgets3/include/wx/gtk/webview_webkit.h +++ b/Externals/wxWidgets3/include/wx/gtk/webview_webkit.h @@ -2,7 +2,6 @@ // Name: include/gtk/wx/webview.h // Purpose: GTK webkit backend for web view component // Author: Robert Roebling, Marianne Gagnon -// Id: $Id: webview_webkit.h 70768 2012-03-01 16:44:31Z PC $ // Copyright: (c) 2010 Marianne Gagnon, 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -10,7 +9,7 @@ #ifndef _WX_GTK_WEBKITCTRL_H_ #define _WX_GTK_WEBKITCTRL_H_ -#include "wx/setup.h" +#include "wx/defs.h" #if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) @@ -26,7 +25,7 @@ typedef struct _WebKitWebView WebKitWebView; class WXDLLIMPEXP_WEBVIEW wxWebViewWebKit : public wxWebView { public: - wxWebViewWebKit() { Init(); } + wxWebViewWebKit(); wxWebViewWebKit(wxWindow *parent, wxWindowID id = wxID_ANY, @@ -35,8 +34,6 @@ public: const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxWebViewNameStr) { - Init(); - Create(parent, id, url, pos, size, style, name); } @@ -47,6 +44,8 @@ public: const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxWebViewNameStr); + virtual ~wxWebViewWebKit(); + virtual bool Enable( bool enable = true ); // implementation @@ -59,10 +58,11 @@ public: virtual void LoadURL(const wxString& url); virtual void GoBack(); virtual void GoForward(); - virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT); + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT); virtual bool CanGoBack() const; virtual bool CanGoForward() const; virtual void ClearHistory(); + virtual void EnableContextMenu(bool enable = true); virtual void EnableHistory(bool enable = true); virtual wxVector > GetBackwardHistory(); virtual wxVector > GetForwardHistory(); @@ -71,9 +71,6 @@ public: virtual wxString GetCurrentTitle() const; virtual wxString GetPageSource() const; virtual wxString GetPageText() const; - //We do not want to hide the other overloads - using wxWebView::SetPage; - virtual void SetPage(const wxString& html, const wxString& baseUrl); virtual void Print(); virtual bool IsBusy() const; @@ -97,6 +94,9 @@ public: virtual void Undo(); virtual void Redo(); + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT); + //Editing functions virtual void SetEditable(bool enable = true); virtual bool IsEditable() const; @@ -110,11 +110,13 @@ public: virtual void ClearSelection(); virtual void RunScript(const wxString& javascript); - + //Virtual Filesystem Support virtual void RegisterHandler(wxSharedPtr handler); virtual wxVector > GetHandlers() { return m_handlerList; } + virtual void* GetNativeBackend() const { return m_web_view; } + /** TODO: check if this can be made private * The native control has a getter to check for busy state, but except in * very recent versions of webkit this getter doesn't say everything we need @@ -128,8 +130,12 @@ public: //We use this flag to stop recursion when we load a page from the navigation //callback, mainly when loading a VFS page bool m_guard; + //This flag is use to indicate when a navigation event is the result of a + //create-web-view signal and so we need to send a new window event + bool m_creating; protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl); virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; @@ -140,6 +146,9 @@ private: void SetWebkitZoom(float level); float GetWebkitZoom() const; + //Find helper function + void FindClear(); + // focus event handler: calls GTKUpdateBitmap() void GTKOnFocus(wxFocusEvent& event); @@ -148,9 +157,30 @@ private: wxVector > m_handlerList; + //variables used for Find() + int m_findFlags; + wxString m_findText; + int m_findPosition; + int m_findCount; + wxDECLARE_DYNAMIC_CLASS(wxWebViewWebKit); }; +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewWebKit; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); } +}; + + #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__) #endif diff --git a/Externals/wxWidgets3/include/wx/gtk/webviewhistoryitem_webkit.h b/Externals/wxWidgets3/include/wx/gtk/webviewhistoryitem_webkit.h index cbadf4ef5f..a798efdda6 100644 --- a/Externals/wxWidgets3/include/wx/gtk/webviewhistoryitem_webkit.h +++ b/Externals/wxWidgets3/include/wx/gtk/webviewhistoryitem_webkit.h @@ -2,7 +2,6 @@ // Name: include/wx/gtk/webviewhistoryitem.h // Purpose: wxWebViewHistoryItem header for GTK // Author: Steven Lamerton -// Id: $Id: webviewhistoryitem_webkit.h 69770 2011-11-17 01:23:03Z RD $ // Copyright: (c) 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,7 @@ class WXDLLIMPEXP_WEBVIEW wxWebViewHistoryItem { public: - wxWebViewHistoryItem(const wxString& url, const wxString& title) : + wxWebViewHistoryItem(const wxString& url, const wxString& title) : m_url(url), m_title(title) {} wxString GetUrl() { return m_url; } wxString GetTitle() { return m_title; } diff --git a/Externals/wxWidgets3/include/wx/gtk/window.h b/Externals/wxWidgets3/include/wx/gtk/window.h index 7238d6149b..6c36ce99c1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/window.h +++ b/Externals/wxWidgets3/include/wx/gtk/window.h @@ -2,7 +2,6 @@ // Name: wx/gtk/window.h // Purpose: // Author: Robert Roebling -// Id: $Id: window.h 70569 2012-02-11 16:26:52Z VZ $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,9 +11,16 @@ #include "wx/dynarray.h" -// helper structure that holds class that holds GtkIMContext object and -// some additional data needed for key events processing -struct wxGtkIMData; +#ifdef __WXGTK3__ + typedef struct _cairo cairo_t; + typedef struct _GtkStyleProvider GtkStyleProvider; + #define WXUNUSED_IN_GTK3(x) +#else + #define WXUNUSED_IN_GTK3(x) x +#endif + +typedef struct _GdkEventKey GdkEventKey; +typedef struct _GtkIMContext GtkIMContext; WX_DEFINE_EXPORTED_ARRAY_PTR(GdkWindow *, wxArrayGdkWindows); @@ -52,8 +58,6 @@ public: // implement base class (pure) virtual methods // ------------------------------------------- - virtual bool Destroy(); - virtual void Raise(); virtual void Lower(); @@ -140,12 +144,13 @@ public: // Internal addition of child windows void DoAddChild(wxWindowGTK *child); - // This methods sends wxPaintEvents to the window. It reads the - // update region, breaks it up into rects and sends an event - // for each rect. It is also responsible for background erase - // events and NC paint events. It is called from "draw" and - // "expose" handlers as well as from ::Update() - void GtkSendPaintEvents(); + // This method sends wxPaintEvents to the window. + // It is also responsible for background erase events. +#ifdef __WXGTK3__ + void GTKSendPaintEvents(cairo_t* cr); +#else + void GTKSendPaintEvents(const GdkRegion* region); +#endif // The methods below are required because many native widgets // are composed of several subwidgets and setting a style for @@ -177,11 +182,6 @@ public: static wxLayoutDirection GTKGetLayout(GtkWidget *widget); static void GTKSetLayout(GtkWidget *widget, wxLayoutDirection dir); - // return true if this window must have a non-NULL parent, false if it can - // be created without parent (normally only top level windows but in wxGTK - // there is also the exception of wxMenuBar) - virtual bool GTKNeedsParent() const { return !IsTopLevel(); } - // This is called when capture is taken from the window. It will // fire off capture lost events. void GTKReleaseMouseAndNotify(); @@ -196,6 +196,7 @@ public: // Called when m_widget becomes realized. Derived classes must call the // base class method if they override it. virtual void GTKHandleRealized(); + void GTKHandleUnrealize(); protected: // for controls composed of multiple GTK widgets, return true to eliminate @@ -247,7 +248,11 @@ public: // position and size of the window int m_x, m_y; int m_width, m_height; - int m_oldClientWidth,m_oldClientHeight; + int m_clientWidth, m_clientHeight; + // Whether the client size variables above are known to be correct + // (because they have been validated by a size-allocate) and should + // be used to report client size + bool m_useCachedClientSize; // see the docs in src/gtk/window.cpp GtkWidget *m_widget; // mostly the widget seen by the rest of GTK @@ -265,7 +270,39 @@ public: void GTKDisableFocusOutEvent(); void GTKEnableFocusOutEvent(); - wxGtkIMData *m_imData; + + // Input method support + + // The IM context used for generic, i.e. non-native, windows. + // + // It might be a good idea to avoid allocating it unless key events from + // this window are really needed but currently we do it unconditionally. + // + // For native widgets (i.e. those for which IsOfStandardClass() returns + // true) it is NULL. + GtkIMContext* m_imContext; + + // Pointer to the event being currently processed by the IME or NULL if not + // inside key handling. + GdkEventKey* m_imKeyEvent; + + // This method generalizes gtk_im_context_filter_keypress(): for the + // generic windows it does just that but it's overridden by the classes + // wrapping native widgets that use IM themselves and so provide specific + // methods for accessing it such gtk_entry_im_context_filter_keypress(). + virtual int GTKIMFilterKeypress(GdkEventKey* event) const; + + // This method must be called from the derived classes "insert-text" signal + // handlers to check if the text is not being inserted by the IM and, if + // this is the case, generate appropriate wxEVT_CHAR events for it. + // + // Returns true if we did generate and process events corresponding to this + // text or false if we didn't handle it. + bool GTKOnInsertText(const char* text); + + // This is just a helper of GTKOnInsertText() which is also used by GTK+ + // "commit" signal handler. + bool GTKDoInsertTextFromIM(const char* text); // indices for the arrays below @@ -300,14 +337,11 @@ public: // extra (wxGTK-specific) flags bool m_noExpose:1; // wxGLCanvas has its own redrawing bool m_nativeSizeEvent:1; // wxGLCanvas sends wxSizeEvent upon "alloc_size" - bool m_hasVMT:1; // set after PostCreation() is called bool m_isScrolling:1; // dragging scrollbar thumb? bool m_clipPaintRegion:1; // true after ScrollWindow() wxRegion m_nativeUpdateRegion; // not transformed for RTL bool m_dirtyTabOrder:1; // tab order changed, GTK focus // chain needs update - bool m_needsStyleChange:1; // May not be able to change - // background style until OnIdle bool m_mouseButtonDown:1; bool m_showOnIdle:1; // postpone showing the window until idle @@ -344,13 +378,19 @@ protected: void GTKFreezeWidget(GtkWidget *w); void GTKThawWidget(GtkWidget *w); + void GTKDisconnect(void* instance); #if wxUSE_TOOLTIPS virtual void DoSetToolTip( wxToolTip *tip ); #endif // wxUSE_TOOLTIPS - // common part of all ctors (not virtual because called from ctor) - void Init(); + // Create a GtkScrolledWindow containing the given widget (usually + // m_wxwindow but not necessarily) and assigns it to m_widget. Also shows + // the widget passed to it. + // + // Can be only called if we have either wxHSCROLL or wxVSCROLL in our + // style. + void GTKCreateScrolledWindowWith(GtkWidget* view); virtual void DoMoveInTabOrder(wxWindow *win, WindowOrder move); virtual bool DoNavigateIn(int flags); @@ -359,20 +399,21 @@ protected: // Copies m_children tab order to GTK focus chain: void RealizeTabOrder(); +#ifndef __WXGTK3__ // Called by ApplyWidgetStyle (which is called by SetFont() and // SetXXXColour etc to apply style changed to native widgets) to create - // modified GTK style with non-standard attributes. If forceStyle=true, - // creates empty GtkRcStyle if there are no modifications, otherwise - // returns NULL in such case. - GtkRcStyle *GTKCreateWidgetStyle(bool forceStyle = false); + // modified GTK style with non-standard attributes. + GtkRcStyle* GTKCreateWidgetStyle(); +#endif - // Overridden in many GTK widgets who have to handle subwidgets - virtual void GTKApplyWidgetStyle(bool forceStyle = false); + void GTKApplyWidgetStyle(bool forceStyle = false); // helper function to ease native widgets wrapping, called by // ApplyWidgetStyle -- override this, not ApplyWidgetStyle virtual void DoApplyWidgetStyle(GtkRcStyle *style); + void GTKApplyStyle(GtkWidget* widget, GtkRcStyle* style); + // sets the border of a given GtkScrolledWindow from a wx style static void GTKScrolledWindowSetBorder(GtkWidget* w, int style); @@ -382,14 +423,16 @@ protected: // just as it does. unsigned long GTKConnectWidget(const char *signal, wxGTKCallback callback); - // Return true from here if PostCreation() should connect to size_request - // signal: this is done by default but doesn't work for some native - // controls which override this function to return false - virtual bool GTKShouldConnectSizeRequest() const { return !IsTopLevel(); } - void ConstrainSize(); private: + void Init(); + + // return true if this window must have a non-NULL parent, false if it can + // be created without parent (normally only top level windows but in wxGTK + // there is also the exception of wxMenuBar) + virtual bool GTKNeedsParent() const { return !IsTopLevel(); } + enum ScrollUnit { ScrollUnit_Line, ScrollUnit_Page, ScrollUnit_Max }; // common part of ScrollLines() and ScrollPages() and could be used, in the @@ -400,6 +443,19 @@ private: bool DoScrollByUnits(ScrollDir dir, ScrollUnit unit, int units); virtual void AddChildGTK(wxWindowGTK* child); +#ifdef __WXGTK3__ + // paint context is stashed here so wxPaintDC can use it + cairo_t* m_paintContext; + // style provider for "background-image" + GtkStyleProvider* m_styleProvider; + +public: + cairo_t* GTKPaintContext() const + { + return m_paintContext; + } +#endif + DECLARE_DYNAMIC_CLASS(wxWindowGTK) wxDECLARE_NO_COPY_CLASS(wxWindowGTK); }; diff --git a/Externals/wxWidgets3/include/wx/hash.h b/Externals/wxWidgets3/include/wx/hash.h index c30644fcfb..452040ba31 100644 --- a/Externals/wxWidgets3/include/wx/hash.h +++ b/Externals/wxWidgets3/include/wx/hash.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: VZ at 25.02.00: type safe hashes with WX_DECLARE_HASH() // Created: 01/02/97 -// RCS-ID: $Id: hash.h 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/hashmap.h b/Externals/wxWidgets3/include/wx/hashmap.h index f7288a6df0..ed26c35418 100644 --- a/Externals/wxWidgets3/include/wx/hashmap.h +++ b/Externals/wxWidgets3/include/wx/hashmap.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon // Modified by: // Created: 29/01/2002 -// RCS-ID: $Id: hashmap.h 69568 2011-10-27 22:26:10Z VZ $ // Copyright: (c) Mattia Barbon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -467,7 +466,7 @@ inline bool never_grow( size_t, size_t ) { return false; } inline bool never_shrink( size_t, size_t ) { return false; } inline bool grow_lf70( size_t buckets, size_t items ) { - return float(items)/float(buckets) >= 0.85; + return float(items)/float(buckets) >= 0.85f; } #endif // various hash map implementations @@ -483,8 +482,9 @@ inline bool grow_lf70( size_t buckets, size_t items ) #ifndef wxNEEDS_WX_HASH_MAP // integer types -class WXDLLIMPEXP_BASE wxIntegerHash +struct WXDLLIMPEXP_BASE wxIntegerHash { +private: WX_HASH_MAP_NAMESPACE::hash longHash; WX_HASH_MAP_NAMESPACE::hash ulongHash; WX_HASH_MAP_NAMESPACE::hash intHash; @@ -527,9 +527,8 @@ public: #else // wxNEEDS_WX_HASH_MAP // integer types -class WXDLLIMPEXP_BASE wxIntegerHash +struct WXDLLIMPEXP_BASE wxIntegerHash { -public: wxIntegerHash() { } unsigned long operator()( long x ) const { return (unsigned long)x; } unsigned long operator()( unsigned long x ) const { return x; } @@ -547,9 +546,8 @@ public: #endif // !wxNEEDS_WX_HASH_MAP/wxNEEDS_WX_HASH_MAP -class WXDLLIMPEXP_BASE wxIntegerEqual +struct WXDLLIMPEXP_BASE wxIntegerEqual { -public: wxIntegerEqual() { } bool operator()( long a, long b ) const { return a == b; } bool operator()( unsigned long a, unsigned long b ) const { return a == b; } @@ -566,9 +564,8 @@ public: }; // pointers -class WXDLLIMPEXP_BASE wxPointerHash +struct WXDLLIMPEXP_BASE wxPointerHash { -public: wxPointerHash() { } #ifdef wxNEEDS_WX_HASH_MAP @@ -580,9 +577,8 @@ public: wxPointerHash& operator=(const wxPointerHash&) { return *this; } }; -class WXDLLIMPEXP_BASE wxPointerEqual +struct WXDLLIMPEXP_BASE wxPointerEqual { -public: wxPointerEqual() { } bool operator()( const void* a, const void* b ) const { return a == b; } @@ -590,9 +586,8 @@ public: }; // wxString, char*, wchar_t* -class WXDLLIMPEXP_BASE wxStringHash +struct WXDLLIMPEXP_BASE wxStringHash { -public: wxStringHash() {} unsigned long operator()( const wxString& x ) const { return stringHash( x.wx_str() ); } @@ -616,9 +611,8 @@ public: wxStringHash& operator=(const wxStringHash&) { return *this; } }; -class WXDLLIMPEXP_BASE wxStringEqual +struct WXDLLIMPEXP_BASE wxStringEqual { -public: wxStringEqual() {} bool operator()( const wxString& a, const wxString& b ) const { return a == b; } @@ -689,8 +683,7 @@ public: \ /* count() == 0 | 1 */ \ size_type count( const const_key_type& key ) \ { \ - /* explicit cast needed to suppress CodeWarrior warnings */ \ - return (size_type)(GetNode( key ) ? 1 : 0); \ + return GetNode( key ) ? 1u : 0u; \ } \ } diff --git a/Externals/wxWidgets3/include/wx/hashset.h b/Externals/wxWidgets3/include/wx/hashset.h index e5f4d10eca..8cd1becf9b 100644 --- a/Externals/wxWidgets3/include/wx/hashset.h +++ b/Externals/wxWidgets3/include/wx/hashset.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon // Modified by: // Created: 11/08/2003 -// RCS-ID: $Id: hashset.h 69568 2011-10-27 22:26:10Z VZ $ // Copyright: (c) Mattia Barbon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -46,7 +45,7 @@ // we need to define the class declared by _WX_DECLARE_HASH_SET as a class and // not a typedef to allow forward declaring it -#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \ +#define _WX_DECLARE_HASH_SET_IMPL( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \ CLASSEXP CLASSNAME \ : public WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T > \ { \ @@ -69,6 +68,31 @@ public: \ {} \ } +// In some standard library implementations (in particular, the libstdc++ that +// ships with g++ 4.7), std::unordered_set inherits privately from its hasher +// and comparator template arguments for purposes of empty base optimization. +// As a result, in the declaration of a class deriving from std::unordered_set +// the names of the hasher and comparator classes are interpreted as naming +// the base class which is inaccessible. +// The workaround is to prefix the class names with 'struct'; however, don't +// do this on MSVC because it causes a warning there if the class was +// declared as a 'class' rather than a 'struct' (and MSVC's std::unordered_set +// implementation does not suffer from the access problem). +#ifdef _MSC_VER +#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) STRUCTNAME +#else +#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) struct STRUCTNAME +#endif + +#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \ + _WX_DECLARE_HASH_SET_IMPL( \ + KEY_T, \ + WX_MAYBE_PREFIX_WITH_STRUCT(HASH_T), \ + WX_MAYBE_PREFIX_WITH_STRUCT(KEY_EQ_T), \ + PTROP, \ + CLASSNAME, \ + CLASSEXP) + #else // no appropriate STL class, use our own implementation // this is a complex way of defining an easily inlineable identity function... diff --git a/Externals/wxWidgets3/include/wx/headercol.h b/Externals/wxWidgets3/include/wx/headercol.h index 34231fe83e..1002c0f562 100644 --- a/Externals/wxWidgets3/include/wx/headercol.h +++ b/Externals/wxWidgets3/include/wx/headercol.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxHeaderColumn class // Author: Vadim Zeitlin // Created: 2008-12-02 -// RCS-ID: $Id: headercol.h 69174 2011-09-21 15:07:46Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/headerctrl.h b/Externals/wxWidgets3/include/wx/headerctrl.h index 5477ea568d..78d7117b9f 100644 --- a/Externals/wxWidgets3/include/wx/headerctrl.h +++ b/Externals/wxWidgets3/include/wx/headerctrl.h @@ -3,7 +3,6 @@ // Purpose: wxHeaderCtrlBase class: interface of wxHeaderCtrl // Author: Vadim Zeitlin // Created: 2008-12-01 -// RCS-ID: $Id: headerctrl.h 70338 2012-01-14 16:51:57Z VS $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -210,6 +209,10 @@ protected: // indices after the number of columns changed void DoResizeColumnIndices(wxArrayInt& colIndices, unsigned int count); +protected: + // this window doesn't look nice with the border so don't use it by default + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + private: // methods implementing our public API and defined in platform-specific // implementations @@ -222,8 +225,6 @@ private: virtual void DoSetColumnsOrder(const wxArrayInt& order) = 0; virtual wxArrayInt DoGetColumnsOrder() const = 0; - // this window doesn't look nice with the border so don't use it by default - virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } // event handlers void OnSeparatorDClick(wxHeaderCtrlEvent& event); @@ -352,7 +353,10 @@ private: void Init(); // bring the column count in sync with the number of columns we store - void UpdateColumnCount() { SetColumnCount(m_cols.size()); } + void UpdateColumnCount() + { + SetColumnCount(static_cast(m_cols.size())); + } // all our current columns @@ -418,24 +422,24 @@ private: }; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_CLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_RIGHT_CLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_MIDDLE_CLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_CLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RIGHT_CLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_MIDDLE_CLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_DCLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_RIGHT_DCLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_MIDDLE_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RIGHT_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_MIDDLE_DCLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_SEPARATOR_DCLICK, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_SEPARATOR_DCLICK, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_BEGIN_RESIZE, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_RESIZING, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_END_RESIZE, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_BEGIN_RESIZE, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_RESIZING, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_END_RESIZE, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_BEGIN_REORDER, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_END_REORDER, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_BEGIN_REORDER, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_END_REORDER, wxHeaderCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED, wxHeaderCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_HEADER_DRAGGING_CANCELLED, wxHeaderCtrlEvent ); typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&); @@ -443,7 +447,7 @@ typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&); wxEVENT_HANDLER_CAST(wxHeaderCtrlEventFunction, func) #define wx__DECLARE_HEADER_EVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_HEADER_ ## evt, id, wxHeaderCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_HEADER_ ## evt, id, wxHeaderCtrlEventHandler(fn)) #define EVT_HEADER_CLICK(id, fn) wx__DECLARE_HEADER_EVT(CLICK, id, fn) #define EVT_HEADER_RIGHT_CLICK(id, fn) wx__DECLARE_HEADER_EVT(RIGHT_CLICK, id, fn) @@ -464,6 +468,21 @@ typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&); #define EVT_HEADER_DRAGGING_CANCELLED(id, fn) wx__DECLARE_HEADER_EVT(DRAGGING_CANCELLED, id, fn) +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_HEADER_CLICK wxEVT_HEADER_CLICK +#define wxEVT_COMMAND_HEADER_RIGHT_CLICK wxEVT_HEADER_RIGHT_CLICK +#define wxEVT_COMMAND_HEADER_MIDDLE_CLICK wxEVT_HEADER_MIDDLE_CLICK +#define wxEVT_COMMAND_HEADER_DCLICK wxEVT_HEADER_DCLICK +#define wxEVT_COMMAND_HEADER_RIGHT_DCLICK wxEVT_HEADER_RIGHT_DCLICK +#define wxEVT_COMMAND_HEADER_MIDDLE_DCLICK wxEVT_HEADER_MIDDLE_DCLICK +#define wxEVT_COMMAND_HEADER_SEPARATOR_DCLICK wxEVT_HEADER_SEPARATOR_DCLICK +#define wxEVT_COMMAND_HEADER_BEGIN_RESIZE wxEVT_HEADER_BEGIN_RESIZE +#define wxEVT_COMMAND_HEADER_RESIZING wxEVT_HEADER_RESIZING +#define wxEVT_COMMAND_HEADER_END_RESIZE wxEVT_HEADER_END_RESIZE +#define wxEVT_COMMAND_HEADER_BEGIN_REORDER wxEVT_HEADER_BEGIN_REORDER +#define wxEVT_COMMAND_HEADER_END_REORDER wxEVT_HEADER_END_REORDER +#define wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED wxEVT_HEADER_DRAGGING_CANCELLED + #endif // wxUSE_HEADERCTRL #endif // _WX_HEADERCTRL_H_ diff --git a/Externals/wxWidgets3/include/wx/help.h b/Externals/wxWidgets3/include/wx/help.h index e76d713189..17539c1b32 100644 --- a/Externals/wxWidgets3/include/wx/help.h +++ b/Externals/wxWidgets3/include/wx/help.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: help.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/helpbase.h b/Externals/wxWidgets3/include/wx/helpbase.h index e133370528..9a924fd38e 100644 --- a/Externals/wxWidgets3/include/wx/helpbase.h +++ b/Externals/wxWidgets3/include/wx/helpbase.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: helpbase.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/helphtml.h b/Externals/wxWidgets3/include/wx/helphtml.h index 15d9bfe19b..87bc81dfbd 100644 --- a/Externals/wxWidgets3/include/wx/helphtml.h +++ b/Externals/wxWidgets3/include/wx/helphtml.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-05-24 -// RCS-ID: $Id: helphtml.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/helpwin.h b/Externals/wxWidgets3/include/wx/helpwin.h index f519067623..b73a62ebaf 100644 --- a/Externals/wxWidgets3/include/wx/helpwin.h +++ b/Externals/wxWidgets3/include/wx/helpwin.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: helpwin.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/htmllbox.h b/Externals/wxWidgets3/include/wx/htmllbox.h index 8e051b371f..27c3a36c30 100644 --- a/Externals/wxWidgets3/include/wx/htmllbox.h +++ b/Externals/wxWidgets3/include/wx/htmllbox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 31.05.03 -// RCS-ID: $Id: htmllbox.h 68460 2011-07-30 11:30:08Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/hyperlink.h b/Externals/wxWidgets3/include/wx/hyperlink.h index 5d0decb63a..db183d5a2e 100644 --- a/Externals/wxWidgets3/include/wx/hyperlink.h +++ b/Externals/wxWidgets3/include/wx/hyperlink.h @@ -4,7 +4,6 @@ // Author: David Norris , Otto Wyss // Modified by: Ryan Norton, Francesco Montorsi // Created: 04/02/2005 -// RCS-ID: $Id: hyperlink.h 66696 2011-01-16 23:24:21Z VZ $ // Copyright: (c) 2005 David Norris // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -88,7 +87,7 @@ public: class WXDLLIMPEXP_FWD_ADV wxHyperlinkEvent; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_COMMAND_HYPERLINK, wxHyperlinkEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_HYPERLINK, wxHyperlinkEvent ); // // An event fired when the user clicks on the label in a hyperlink control. @@ -99,7 +98,7 @@ class WXDLLIMPEXP_ADV wxHyperlinkEvent : public wxCommandEvent public: wxHyperlinkEvent() {} wxHyperlinkEvent(wxObject *generator, wxWindowID id, const wxString& url) - : wxCommandEvent(wxEVT_COMMAND_HYPERLINK, id), + : wxCommandEvent(wxEVT_HYPERLINK, id), m_url(url) { SetEventObject(generator); @@ -132,7 +131,7 @@ typedef void (wxEvtHandler::*wxHyperlinkEventFunction)(wxHyperlinkEvent&); wxEVENT_HANDLER_CAST(wxHyperlinkEventFunction, func) #define EVT_HYPERLINK(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_HYPERLINK, id, wxHyperlinkEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_HYPERLINK, id, wxHyperlinkEventHandler(fn)) #if defined(__WXGTK210__) && !defined(__WXUNIVERSAL__) @@ -166,6 +165,8 @@ typedef void (wxEvtHandler::*wxHyperlinkEventFunction)(wxHyperlinkEvent&); }; #endif +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_HYPERLINK wxEVT_HYPERLINK #endif // wxUSE_HYPERLINKCTRL diff --git a/Externals/wxWidgets3/include/wx/icon.h b/Externals/wxWidgets3/include/wx/icon.h index 421f7c5ba6..27bb3e6921 100644 --- a/Externals/wxWidgets3/include/wx/icon.h +++ b/Externals/wxWidgets3/include/wx/icon.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: icon.h 70353 2012-01-15 14:46:41Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -30,7 +29,11 @@ #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM #include "wx/motif/icon.h" #elif defined(__WXGTK20__) - #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #else + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/generic/icon.h" #elif defined(__WXGTK__) #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM diff --git a/Externals/wxWidgets3/include/wx/iconbndl.h b/Externals/wxWidgets3/include/wx/iconbndl.h index f0bbb403d9..50ad64261d 100644 --- a/Externals/wxWidgets3/include/wx/iconbndl.h +++ b/Externals/wxWidgets3/include/wx/iconbndl.h @@ -4,7 +4,6 @@ // Author: Mattia barbon // Modified by: // Created: 23.03.02 -// RCS-ID: $Id: iconbndl.h 70455 2012-01-24 22:17:47Z VZ $ // Copyright: (c) Mattia Barbon // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/iconloc.h b/Externals/wxWidgets3/include/wx/iconloc.h index c2c6ef5485..9baaaa5297 100644 --- a/Externals/wxWidgets3/include/wx/iconloc.h +++ b/Externals/wxWidgets3/include/wx/iconloc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 21.06.2003 -// RCS-ID: $Id: iconloc.h 70808 2012-03-04 20:31:42Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagbmp.h b/Externals/wxWidgets3/include/wx/imagbmp.h index 123c2176e3..262373a70e 100644 --- a/Externals/wxWidgets3/include/wx/imagbmp.h +++ b/Externals/wxWidgets3/include/wx/imagbmp.h @@ -2,7 +2,6 @@ // Name: wx/imagbmp.h // Purpose: wxImage BMP, ICO, CUR and ANI handlers // Author: Robert Roebling, Chris Elliott -// RCS-ID: $Id: imagbmp.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Robert Roebling, Chris Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/image.h b/Externals/wxWidgets3/include/wx/image.h index 70167b104c..3e7f39eb0d 100644 --- a/Externals/wxWidgets3/include/wx/image.h +++ b/Externals/wxWidgets3/include/wx/image.h @@ -2,7 +2,6 @@ // Name: wx/image.h // Purpose: wxImage class // Author: Robert Roebling -// RCS-ID: $Id: image.h 69760 2011-11-14 13:35:52Z VZ $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -71,7 +70,7 @@ enum wxImageResizeQuality wxIMAGE_QUALITY_NORMAL = wxIMAGE_QUALITY_NEAREST, // highest (but best) quality - wxIMAGE_QUALITY_HIGH + wxIMAGE_QUALITY_HIGH = 4 }; // alpha channel values: fully transparent, default threshold separating diff --git a/Externals/wxWidgets3/include/wx/imaggif.h b/Externals/wxWidgets3/include/wx/imaggif.h index 1650e6ead1..1d76a632c8 100644 --- a/Externals/wxWidgets3/include/wx/imaggif.h +++ b/Externals/wxWidgets3/include/wx/imaggif.h @@ -2,7 +2,6 @@ // Name: wx/imaggif.h // Purpose: wxImage GIF handler // Author: Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K -// RCS-ID: $Id: imaggif.h 66800 2011-01-28 07:27:34Z DS $ // Copyright: (c) 1999-2011 Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagiff.h b/Externals/wxWidgets3/include/wx/imagiff.h index 6778722cd6..f7307ba5e1 100644 --- a/Externals/wxWidgets3/include/wx/imagiff.h +++ b/Externals/wxWidgets3/include/wx/imagiff.h @@ -2,7 +2,6 @@ // Name: wx/imagiff.h // Purpose: wxImage handler for Amiga IFF images // Author: Steffen Gutmann -// RCS-ID: $Id: imagiff.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Steffen Gutmann, 2002 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagjpeg.h b/Externals/wxWidgets3/include/wx/imagjpeg.h index 0c2161bab3..53f6e06170 100644 --- a/Externals/wxWidgets3/include/wx/imagjpeg.h +++ b/Externals/wxWidgets3/include/wx/imagjpeg.h @@ -2,7 +2,6 @@ // Name: wx/imagjpeg.h // Purpose: wxImage JPEG handler // Author: Vaclav Slavik -// RCS-ID: $Id: imagjpeg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imaglist.h b/Externals/wxWidgets3/include/wx/imaglist.h index 9e5719a145..72255ac710 100644 --- a/Externals/wxWidgets3/include/wx/imaglist.h +++ b/Externals/wxWidgets3/include/wx/imaglist.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: imaglist.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagpcx.h b/Externals/wxWidgets3/include/wx/imagpcx.h index 2321d4e0b0..cc9d54fa8a 100644 --- a/Externals/wxWidgets3/include/wx/imagpcx.h +++ b/Externals/wxWidgets3/include/wx/imagpcx.h @@ -2,7 +2,6 @@ // Name: wx/imagpcx.h // Purpose: wxImage PCX handler // Author: Guillermo Rodriguez Garcia -// RCS-ID: $Id: imagpcx.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1999 Guillermo Rodriguez Garcia // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagpng.h b/Externals/wxWidgets3/include/wx/imagpng.h index ad19bf3e92..55adcd5f97 100644 --- a/Externals/wxWidgets3/include/wx/imagpng.h +++ b/Externals/wxWidgets3/include/wx/imagpng.h @@ -2,7 +2,6 @@ // Name: wx/imagpng.h // Purpose: wxImage PNG handler // Author: Robert Roebling -// RCS-ID: $Id: imagpng.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagpnm.h b/Externals/wxWidgets3/include/wx/imagpnm.h index 439cfd30a0..aab7c76faa 100644 --- a/Externals/wxWidgets3/include/wx/imagpnm.h +++ b/Externals/wxWidgets3/include/wx/imagpnm.h @@ -2,7 +2,6 @@ // Name: wx/imagpnm.h // Purpose: wxImage PNM handler // Author: Sylvain Bougnoux -// RCS-ID: $Id: imagpnm.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Sylvain Bougnoux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagtga.h b/Externals/wxWidgets3/include/wx/imagtga.h index 54d5ef0e09..d11083785f 100644 --- a/Externals/wxWidgets3/include/wx/imagtga.h +++ b/Externals/wxWidgets3/include/wx/imagtga.h @@ -2,7 +2,6 @@ // Name: wx/imagtga.h // Purpose: wxImage TGA handler // Author: Seth Jackson -// RCS-ID: $Id: imagtga.h 59461 2009-03-09 23:13:34Z VZ $ // Copyright: (c) 2005 Seth Jackson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagtiff.h b/Externals/wxWidgets3/include/wx/imagtiff.h index e9b00aa989..9182e67173 100644 --- a/Externals/wxWidgets3/include/wx/imagtiff.h +++ b/Externals/wxWidgets3/include/wx/imagtiff.h @@ -2,7 +2,6 @@ // Name: wx/imagtiff.h // Purpose: wxImage TIFF handler // Author: Robert Roebling -// RCS-ID: $Id: imagtiff.h 68785 2011-08-19 03:47:40Z DS $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/imagxpm.h b/Externals/wxWidgets3/include/wx/imagxpm.h index a128b7ebac..16477b2d57 100644 --- a/Externals/wxWidgets3/include/wx/imagxpm.h +++ b/Externals/wxWidgets3/include/wx/imagxpm.h @@ -2,7 +2,6 @@ // Name: wx/imagxpm.h // Purpose: wxImage XPM handler // Author: Vaclav Slavik -// RCS-ID: $Id: imagxpm.h 59460 2009-03-09 23:08:36Z VZ $ // Copyright: (c) 2001 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/infobar.h b/Externals/wxWidgets3/include/wx/infobar.h index eca08e3260..be390a856e 100644 --- a/Externals/wxWidgets3/include/wx/infobar.h +++ b/Externals/wxWidgets3/include/wx/infobar.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxInfoBarBase defining common API of wxInfoBar // Author: Vadim Zeitlin // Created: 2009-07-28 -// RCS-ID: $Id: infobar.h 64213 2010-05-05 12:20:08Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/init.h b/Externals/wxWidgets3/include/wx/init.h index 2070d84319..6ce8e82876 100644 --- a/Externals/wxWidgets3/include/wx/init.h +++ b/Externals/wxWidgets3/include/wx/init.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29.06.2003 -// RCS-ID: $Id: init.h 64531 2010-06-09 13:23:13Z FM $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -53,6 +52,12 @@ extern int WXDLLIMPEXP_BASE wxEntry(int& argc, char **argv); #endif// wxUSE_UNICODE +// Under Windows we define additional wxEntry() overloads with signature +// compatible with WinMain() and not the traditional main(). +#if wxUSE_GUI && defined(__WINDOWS__) + #include "wx/msw/init.h" +#endif + // ---------------------------------------------------------------------------- // Using the library without (explicit) application object: you may avoid using // wxDECLARE_APP and wxIMPLEMENT_APP macros and call the functions below instead at diff --git a/Externals/wxWidgets3/include/wx/intl.h b/Externals/wxWidgets3/include/wx/intl.h index a2785fd97f..fea4d2d65b 100644 --- a/Externals/wxWidgets3/include/wx/intl.h +++ b/Externals/wxWidgets3/include/wx/intl.h @@ -5,7 +5,6 @@ // Modified by: Michael N. Filippov // (2003/09/30 - plural forms support) // Created: 29/01/98 -// RCS-ID: $Id: intl.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -308,12 +307,6 @@ public: return wxGetTranslation(origString, origString2, n, domain); } - // this is hack to work around a problem with wxGetTranslation() which - // returns const wxString& and not wxString, so when it returns untranslated - // string, it needs to have a copy of it somewhere - static const wxString& GetUntranslatedString(const wxString& str) - { return wxTranslations::GetUntranslatedString(str); } - // Returns the current short name for the locale const wxString& GetName() const { return m_strShort; } diff --git a/Externals/wxWidgets3/include/wx/iosfwrap.h b/Externals/wxWidgets3/include/wx/iosfwrap.h index 020d45882d..13fb1f7f89 100644 --- a/Externals/wxWidgets3/include/wx/iosfwrap.h +++ b/Externals/wxWidgets3/include/wx/iosfwrap.h @@ -4,7 +4,6 @@ // Author: Jan van Dijk // Modified by: // Created: 18.12.2002 -// RCS-ID: $Id: iosfwrap.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ioswrap.h b/Externals/wxWidgets3/include/wx/ioswrap.h index 50ba04a1dc..5805588ead 100644 --- a/Externals/wxWidgets3/include/wx/ioswrap.h +++ b/Externals/wxWidgets3/include/wx/ioswrap.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.02.99 -// RCS-ID: $Id: ioswrap.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ipc.h b/Externals/wxWidgets3/include/wx/ipc.h index 14650aea1d..36542e5f09 100644 --- a/Externals/wxWidgets3/include/wx/ipc.h +++ b/Externals/wxWidgets3/include/wx/ipc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 15.04.02 -// RCS-ID: $Id: ipc.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2002 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ipcbase.h b/Externals/wxWidgets3/include/wx/ipcbase.h index 87d7bcdca3..4d69958e4c 100644 --- a/Externals/wxWidgets3/include/wx/ipcbase.h +++ b/Externals/wxWidgets3/include/wx/ipcbase.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 4/1/98 -// RCS-ID: $Id: ipcbase.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/itemid.h b/Externals/wxWidgets3/include/wx/itemid.h index ff867ef3ec..99897e9c17 100644 --- a/Externals/wxWidgets3/include/wx/itemid.h +++ b/Externals/wxWidgets3/include/wx/itemid.h @@ -3,7 +3,6 @@ // Purpose: wxItemId class declaration. // Author: Vadim Zeitlin // Created: 2011-08-17 -// RCS-ID: $Id: itemid.h 68916 2011-08-27 14:11:03Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/joystick.h b/Externals/wxWidgets3/include/wx/joystick.h index ba36f5e956..733ad7de8a 100644 --- a/Externals/wxWidgets3/include/wx/joystick.h +++ b/Externals/wxWidgets3/include/wx/joystick.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) wxWidgets Team -// RCS-ID: $Id: joystick.h 70808 2012-03-04 20:31:42Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/kbdstate.h b/Externals/wxWidgets3/include/wx/kbdstate.h index d3f927f77a..ab0df32d1c 100644 --- a/Externals/wxWidgets3/include/wx/kbdstate.h +++ b/Externals/wxWidgets3/include/wx/kbdstate.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxKeyboardState class // Author: Vadim Zeitlin // Created: 2008-09-19 -// RCS-ID: $Id: kbdstate.h 70579 2012-02-13 15:23:33Z SC $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -55,7 +54,14 @@ public: } // returns true if any modifiers at all are pressed - bool HasModifiers() const { return GetModifiers() != wxMOD_NONE; } + bool HasAnyModifiers() const { return GetModifiers() != wxMOD_NONE; } + + // returns true if any modifiers changing the usual key interpretation are + // pressed, notably excluding Shift + bool HasModifiers() const + { + return ControlDown() || RawControlDown() || AltDown(); + } // accessors for individual modifier keys bool ControlDown() const { return m_controlDown; } diff --git a/Externals/wxWidgets3/include/wx/language.h b/Externals/wxWidgets3/include/wx/language.h index d37f1da48c..2d196b6639 100644 --- a/Externals/wxWidgets3/include/wx/language.h +++ b/Externals/wxWidgets3/include/wx/language.h @@ -3,7 +3,6 @@ // Purpose: wxLanguage enum // Author: Vadim Zeitlin // Created: 2010-04-23 -// RCS-ID: $Id: language.h 64225 2010-05-06 12:40:11Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/layout.h b/Externals/wxWidgets3/include/wx/layout.h index a94ed4f759..30d46c2490 100644 --- a/Externals/wxWidgets3/include/wx/layout.h +++ b/Externals/wxWidgets3/include/wx/layout.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: layout.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/laywin.h b/Externals/wxWidgets3/include/wx/laywin.h index c27d1e7dbe..e3f6b6eeea 100644 --- a/Externals/wxWidgets3/include/wx/laywin.h +++ b/Externals/wxWidgets3/include/wx/laywin.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: laywin.h 33948 2005-05-04 18:57:50Z JS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/link.h b/Externals/wxWidgets3/include/wx/link.h index 394f2422ea..c422fc17af 100644 --- a/Externals/wxWidgets3/include/wx/link.h +++ b/Externals/wxWidgets3/include/wx/link.h @@ -3,7 +3,6 @@ // Purpose: macros to force linking modules which might otherwise be // discarded by the linker // Author: Vaclav Slavik -// RCS-ID: $Id: link.h 35722 2005-09-26 12:29:25Z VZ $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/list.h b/Externals/wxWidgets3/include/wx/list.h index a74a8fc7b8..160b3b8ba4 100644 --- a/Externals/wxWidgets3/include/wx/list.h +++ b/Externals/wxWidgets3/include/wx/list.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added // Created: 29/01/98 -// RCS-ID: $Id: list.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -32,6 +31,7 @@ #include "wx/defs.h" #include "wx/object.h" #include "wx/string.h" +#include "wx/vector.h" #if wxUSE_STD_CONTAINERS #include "wx/beforestd.h" @@ -148,21 +148,22 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) decl _WX_LIST_HELPER_##liT \ { \ typedef elT _WX_LIST_ITEM_TYPE_##liT; \ + typedef std::list BaseListType; \ public: \ + static BaseListType EmptyList; \ static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ }; \ \ WX_LIST_VC6_WORKAROUND(elT, liT, decl) \ - decl liT : public std::list \ + class liT : public std::list \ { \ private: \ typedef std::list BaseListType; \ - static BaseListType EmptyList; \ \ bool m_destroy; \ \ public: \ - decl compatibility_iterator \ + class compatibility_iterator \ { \ private: \ /* Workaround for broken VC6 nested class name resolution */ \ @@ -174,7 +175,7 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) \ public: \ compatibility_iterator() \ - : m_iter(EmptyList.end()), m_list( NULL ) {} \ + : m_iter(_WX_LIST_HELPER_##liT::EmptyList.end()), m_list( NULL ) {} \ compatibility_iterator( liT* li, iterator i ) \ : m_iter( i ), m_list( li ) {} \ compatibility_iterator( const liT* li, iterator i ) \ @@ -216,7 +217,7 @@ inline const void *wxListCastElementToVoidPtr(const wxString& str) } \ int IndexOf() const \ { \ - return *this ? std::distance( m_list->begin(), m_iter ) \ + return *this ? (int)std::distance( m_list->begin(), m_iter ) \ : wxNOT_FOUND; \ } \ }; \ @@ -1214,6 +1215,23 @@ public: // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } #endif // !wxUSE_STD_CONTAINERS + +#ifndef __VISUALC6__ + template + wxVector AsVector() const + { + wxVector vector(size()); + size_t i = 0; + + for ( const_iterator it = begin(); it != end(); ++it ) + { + vector[i++] = static_cast(*it); + } + + return vector; + } +#endif // !__VISUALC6__ + }; #if !wxUSE_STD_CONTAINERS diff --git a/Externals/wxWidgets3/include/wx/listbase.h b/Externals/wxWidgets3/include/wx/listbase.h index b28b9f64a3..80f65f2a33 100644 --- a/Externals/wxWidgets3/include/wx/listbase.h +++ b/Externals/wxWidgets3/include/wx/listbase.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.12.99 -// RCS-ID: $Id: listbase.h 70286 2012-01-07 16:11:10Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -415,7 +414,7 @@ public: // // Returns the index of the newly inserted column or -1 on error. long AppendColumn(const wxString& heading, - int format = wxLIST_FORMAT_LEFT, + wxListColumnFormat format = wxLIST_FORMAT_LEFT, int width = -1); // Add a new column to the control at the position "col". @@ -446,6 +445,8 @@ public: virtual int GetColumnWidth(int col) const = 0; virtual bool SetColumnWidth(int col, int width) = 0; + // return the attribute for the item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; // Other miscellaneous accessors. // ------------------------------ @@ -454,12 +455,23 @@ public: bool InReportView() const { return HasFlag(wxLC_REPORT); } bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + // Enable or disable beep when incremental match doesn't find any item. + // Only implemented in the generic version currently. + virtual void EnableBellOnNoMatch(bool WXUNUSED(on) = true) { } + + void EnableAlternateRowColours(bool enable = true); + void SetAlternateRowColour(const wxColour& colour); + protected: // Real implementations methods to which our public forwards. virtual long DoInsertColumn(long col, const wxListItem& info) = 0; // Overridden methods of the base class. virtual wxSize DoGetBestClientSize() const; + +private: + // user defined color to draw row lines, may be invalid + wxListItemAttr m_alternateRowColour; }; // ---------------------------------------------------------------------------- @@ -502,11 +514,11 @@ public: long GetMask() const { return m_item.m_mask; } const wxListItem& GetItem() const { return m_item; } - // for wxEVT_COMMAND_LIST_CACHE_HINT only + // for wxEVT_LIST_CACHE_HINT only long GetCacheFrom() const { return m_oldItemIndex; } long GetCacheTo() const { return m_itemIndex; } - // was label editing canceled? (for wxEVT_COMMAND_LIST_END_LABEL_EDIT only) + // was label editing canceled? (for wxEVT_LIST_END_LABEL_EDIT only) bool IsEditCancelled() const { return m_editCancelled; } void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } @@ -514,7 +526,7 @@ public: //protected: -- not for backwards compatibility int m_code; - long m_oldItemIndex; // only for wxEVT_COMMAND_LIST_CACHE_HINT + long m_oldItemIndex; // only for wxEVT_LIST_CACHE_HINT long m_itemIndex; int m_col; wxPoint m_pointDrag; @@ -532,27 +544,27 @@ private: // wxListCtrl event macros // ---------------------------------------------------------------------------- -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_BEGIN_DRAG, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_BEGIN_RDRAG, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_DELETE_ITEM, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_RDRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_BEGIN_LABEL_EDIT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_END_LABEL_EDIT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_DELETE_ITEM, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_DELETE_ALL_ITEMS, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_KEY_DOWN, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_INSERT_ITEM, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_COL_CLICK, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_CACHE_HINT, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_COL_DRAGGING, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_COL_END_DRAG, wxListEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LIST_ITEM_FOCUSED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_SELECTED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_DESELECTED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_KEY_DOWN, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_INSERT_ITEM, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_RIGHT_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_MIDDLE_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_ACTIVATED, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_CACHE_HINT, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_RIGHT_CLICK, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_BEGIN_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_DRAGGING, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_COL_END_DRAG, wxListEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LIST_ITEM_FOCUSED, wxListEvent ); typedef void (wxEvtHandler::*wxListEventFunction)(wxListEvent&); @@ -560,7 +572,7 @@ typedef void (wxEvtHandler::*wxListEventFunction)(wxListEvent&); wxEVENT_HANDLER_CAST(wxListEventFunction, func) #define wx__DECLARE_LISTEVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_LIST_ ## evt, id, wxListEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_LIST_ ## evt, id, wxListEventHandler(fn)) #define EVT_LIST_BEGIN_DRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_DRAG, id, fn) #define EVT_LIST_BEGIN_RDRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_RDRAG, id, fn) @@ -586,6 +598,28 @@ typedef void (wxEvtHandler::*wxListEventFunction)(wxListEvent&); #define EVT_LIST_CACHE_HINT(id, fn) wx__DECLARE_LISTEVT(CACHE_HINT, id, fn) +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_LIST_BEGIN_DRAG wxEVT_LIST_BEGIN_DRAG +#define wxEVT_COMMAND_LIST_BEGIN_RDRAG wxEVT_LIST_BEGIN_RDRAG +#define wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT wxEVT_LIST_BEGIN_LABEL_EDIT +#define wxEVT_COMMAND_LIST_END_LABEL_EDIT wxEVT_LIST_END_LABEL_EDIT +#define wxEVT_COMMAND_LIST_DELETE_ITEM wxEVT_LIST_DELETE_ITEM +#define wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS wxEVT_LIST_DELETE_ALL_ITEMS +#define wxEVT_COMMAND_LIST_ITEM_SELECTED wxEVT_LIST_ITEM_SELECTED +#define wxEVT_COMMAND_LIST_ITEM_DESELECTED wxEVT_LIST_ITEM_DESELECTED +#define wxEVT_COMMAND_LIST_KEY_DOWN wxEVT_LIST_KEY_DOWN +#define wxEVT_COMMAND_LIST_INSERT_ITEM wxEVT_LIST_INSERT_ITEM +#define wxEVT_COMMAND_LIST_COL_CLICK wxEVT_LIST_COL_CLICK +#define wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK wxEVT_LIST_ITEM_RIGHT_CLICK +#define wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK wxEVT_LIST_ITEM_MIDDLE_CLICK +#define wxEVT_COMMAND_LIST_ITEM_ACTIVATED wxEVT_LIST_ITEM_ACTIVATED +#define wxEVT_COMMAND_LIST_CACHE_HINT wxEVT_LIST_CACHE_HINT +#define wxEVT_COMMAND_LIST_COL_RIGHT_CLICK wxEVT_LIST_COL_RIGHT_CLICK +#define wxEVT_COMMAND_LIST_COL_BEGIN_DRAG wxEVT_LIST_COL_BEGIN_DRAG +#define wxEVT_COMMAND_LIST_COL_DRAGGING wxEVT_LIST_COL_DRAGGING +#define wxEVT_COMMAND_LIST_COL_END_DRAG wxEVT_LIST_COL_END_DRAG +#define wxEVT_COMMAND_LIST_ITEM_FOCUSED wxEVT_LIST_ITEM_FOCUSED + #endif // _WX_LISTCTRL_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/listbook.h b/Externals/wxWidgets3/include/wx/listbook.h index f7e4bfc389..1c7cdbd923 100644 --- a/Externals/wxWidgets3/include/wx/listbook.h +++ b/Externals/wxWidgets3/include/wx/listbook.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.08.03 -// RCS-ID: $Id: listbook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -17,12 +16,13 @@ #if wxUSE_LISTBOOK #include "wx/bookctrl.h" +#include "wx/containr.h" class WXDLLIMPEXP_FWD_CORE wxListView; class WXDLLIMPEXP_FWD_CORE wxListEvent; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LISTBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_LISTBOOK_PAGE_CHANGING, wxBookCtrlEvent ); // wxListbook flags #define wxLB_DEFAULT wxBK_DEFAULT @@ -36,7 +36,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING // wxListbook // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxListbook : public wxBookCtrlBase +class WXDLLIMPEXP_CORE wxListbook : public wxNavigationEnabled { public: wxListbook() { } @@ -87,9 +87,8 @@ protected: wxBookCtrlEvent* CreatePageChangingEvent() const; void MakeChangedEvent(wxBookCtrlEvent &event); - // get flags for different list control modes - long GetListCtrlIconViewFlags() const; - long GetListCtrlReportViewFlags() const; + // Get the correct wxListCtrl flags to use depending on our own flags. + long GetListCtrlFlags() const; // event handlers void OnListSelected(wxListEvent& event); @@ -116,10 +115,14 @@ typedef wxBookCtrlEventFunction wxListbookEventFunction; #define wxListbookEventHandler(func) wxBookCtrlEventHandler(func) #define EVT_LISTBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_LISTBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) #define EVT_LISTBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_LISTBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED wxEVT_LISTBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING wxEVT_LISTBOOK_PAGE_CHANGING #endif // wxUSE_LISTBOOK diff --git a/Externals/wxWidgets3/include/wx/listbox.h b/Externals/wxWidgets3/include/wx/listbox.h index ee900dce9d..afb0220036 100644 --- a/Externals/wxWidgets3/include/wx/listbox.h +++ b/Externals/wxWidgets3/include/wx/listbox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.10.99 -// RCS-ID: $Id: listbox.h 65935 2010-10-27 23:21:55Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/listctrl.h b/Externals/wxWidgets3/include/wx/listctrl.h index 5f17cfde7d..51aca4a1b1 100644 --- a/Externals/wxWidgets3/include/wx/listctrl.h +++ b/Externals/wxWidgets3/include/wx/listctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.12.99 -// RCS-ID: $Id: listctrl.h 70808 2012-03-04 20:31:42Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/listimpl.cpp b/Externals/wxWidgets3/include/wx/listimpl.cpp index 771b41dcc2..f3a4a1bdfe 100644 --- a/Externals/wxWidgets3/include/wx/listimpl.cpp +++ b/Externals/wxWidgets3/include/wx/listimpl.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 16/11/98 -// RCS-ID: $Id: listimpl.cpp 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,7 @@ { \ delete X; \ } \ - name::BaseListType name::EmptyList; + _WX_LIST_HELPER_##name::BaseListType _WX_LIST_HELPER_##name::EmptyList; #else // !wxUSE_STD_CONTAINERS #undef WX_DEFINE_LIST_2 diff --git a/Externals/wxWidgets3/include/wx/log.h b/Externals/wxWidgets3/include/wx/log.h index 8f0679b243..be0a245a49 100644 --- a/Externals/wxWidgets3/include/wx/log.h +++ b/Externals/wxWidgets3/include/wx/log.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: log.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,6 +12,7 @@ #define _WX_LOG_H_ #include "wx/defs.h" +#include "wx/cpp.h" // ---------------------------------------------------------------------------- // types @@ -1330,28 +1330,42 @@ WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); // following arguments are not even evaluated which is good as it avoids // unnecessary overhead) // -// Note: the strange if/else construct is needed to make the following code +// Note: the strange (because executing at most once) for() loop because we +// must arrange for wxDO_LOG() to be at the end of the macro and using a +// more natural "if (IsLevelEnabled()) wxDO_LOG()" would result in wrong +// behaviour for the following code ("else" would bind to the wrong "if"): // // if ( cond ) // wxLogError("!!!"); // else // ... // -// work as expected, without it the second "else" would match the "if" -// inside wxLogError(). Unfortunately code like +// See also #11829 for the problems with other simpler approaches, +// notably the need for two macros due to buggy __LINE__ in MSVC. // -// if ( cond ) -// wxLogError("!!!"); -// -// now provokes "suggest explicit braces to avoid ambiguous 'else'" -// warnings from g++ 4.3 and later with -Wparentheses on but they can be -// easily fixed by adding curly braces around wxLogError() and at least -// the code still does do the right thing. +// Note 2: Unfortunately we can't use the same solution for all compilers +// because the loop-based one results in problems with MSVC6 due to its +// wrong (pre-C++98) rules for the scope of the variables declared +// inside the loop, as this prevents us from using wxLogXXX() in switch +// statement clauses ("initialization of loopvar skipped by case"). So +// for now, i.e. while we still support VC6, use the previous solution +// for it (FIXME-VC6). +#ifdef __VISUALC6__ #define wxDO_LOG_IF_ENABLED(level) \ if ( !wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT) ) \ {} \ else \ wxDO_LOG(level) +#else +#define wxDO_LOG_IF_ENABLED_HELPER(level, loopvar) \ + for ( bool loopvar = false; \ + !loopvar && wxLog::IsLevelEnabled(wxLOG_##level, wxLOG_COMPONENT); \ + loopvar = true ) \ + wxDO_LOG(level) + +#define wxDO_LOG_IF_ENABLED(level) \ + wxDO_LOG_IF_ENABLED_HELPER(level, wxMAKE_UNIQUE_NAME(wxlogcheck)) +#endif // wxLogFatalError() is special as it can't be disabled #define wxLogFatalError wxDO_LOG(FatalError) @@ -1437,7 +1451,7 @@ WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); else \ wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).Log - #define wxVLogStatus(format, argptr) \ + #define wxVLogStatus \ wxMAKE_LOGGER(Status).MaybeStore(wxLOG_KEY_FRAME).LogV #endif // wxUSE_GUI diff --git a/Externals/wxWidgets3/include/wx/longlong.h b/Externals/wxWidgets3/include/wx/longlong.h index e190ec804b..8a2848c54a 100644 --- a/Externals/wxWidgets3/include/wx/longlong.h +++ b/Externals/wxWidgets3/include/wx/longlong.h @@ -5,7 +5,6 @@ // Author: Jeffrey C. Ollie , Vadim Zeitlin // Modified by: // Created: 10.02.99 -// RCS-ID: $Id: longlong.h 68472 2011-07-31 13:25:33Z VS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -1067,7 +1066,7 @@ inline wxULongLong operator+(unsigned long l, const wxULongLong& ull) { return u inline wxLongLong operator-(unsigned long l, const wxULongLong& ull) { wxULongLong ret = wxULongLong(l) - ull; - return wxLongLong((long)ret.GetHi(),ret.GetLo()); + return wxLongLong((wxInt32)ret.GetHi(),ret.GetLo()); } #if wxUSE_LONGLONG_NATIVE && wxUSE_STREAMS diff --git a/Externals/wxWidgets3/include/wx/math.h b/Externals/wxWidgets3/include/wx/math.h index 0978a84dcc..2787163f78 100644 --- a/Externals/wxWidgets3/include/wx/math.h +++ b/Externals/wxWidgets3/include/wx/math.h @@ -4,7 +4,6 @@ * Author: John Labenski and others * Modified by: * Created: 02/02/03 -* RCS-ID: $Id: math.h 70796 2012-03-04 00:29:31Z VZ $ * Copyright: (c) John Labenski * Licence: wxWindows licence */ @@ -52,20 +51,29 @@ #endif -/* unknown __VISAGECC__, __SYMANTECCC__ */ +#ifdef __cplusplus -#if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) +/* Any C++11 compiler should provide isfinite() */ +#if __cplusplus >= 201103 + #include + #define wxFinite(x) std::isfinite(x) +#elif defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) #include #define wxFinite(x) _finite(x) -#elif defined(__MINGW64__) +#elif defined(__MINGW64__) || defined(__clang__) /* add more compilers with C99 support here: using C99 isfinite() is preferable to using BSD-ish finite() */ - #define wxFinite(x) isfinite(x) + #if defined(_GLIBCXX_CMATH) || defined(_LIBCPP_CMATH) + // these headers #undef isfinite + #define wxFinite(x) std::isfinite(x) + #else + #define wxFinite(x) isfinite(x) + #endif #elif ( defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ - defined(__HPUX__)||defined(__MWERKS__) ) && ( !defined(wxOSX_USE_IPHONE) || wxOSX_USE_IPHONE == 0 ) + defined(__HPUX__) ) && ( !defined(wxOSX_USE_IPHONE) || wxOSX_USE_IPHONE == 0 ) #ifdef __SOLARIS__ #include #endif @@ -79,52 +87,52 @@ #define wxIsNaN(x) _isnan(x) #elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ - defined(__HPUX__)||defined(__MWERKS__) + defined(__HPUX__) #define wxIsNaN(x) isnan(x) #else #define wxIsNaN(x) ((x) != (x)) #endif -#ifdef __cplusplus +#ifdef __INTELC__ - #ifdef __INTELC__ - - inline bool wxIsSameDouble(double x, double y) - { - // VZ: this warning, given for operators==() and !=() is not wrong, as == - // shouldn't be used with doubles, but we get too many of them and - // removing these operators is probably not a good idea - // - // Maybe we should always compare doubles up to some "epsilon" precision - #pragma warning(push) - - // floating-point equality and inequality comparisons are unreliable - #pragma warning(disable: 1572) - - return x == y; - - #pragma warning(pop) - } - - #else /* !__INTELC__ */ - - inline bool wxIsSameDouble(double x, double y) { return x == y; } - - #endif /* __INTELC__/!__INTELC__ */ - - inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } - - inline int wxRound(double x) + inline bool wxIsSameDouble(double x, double y) { - wxASSERT_MSG( x > INT_MIN - 0.5 && x < INT_MAX + 0.5, - wxT("argument out of supported range") ); + // VZ: this warning, given for operators==() and !=() is not wrong, as == + // shouldn't be used with doubles, but we get too many of them and + // removing these operators is probably not a good idea + // + // Maybe we should always compare doubles up to some "epsilon" precision + #pragma warning(push) - #if defined(HAVE_ROUND) - return int(round(x)); - #else - return (int)(x < 0 ? x - 0.5 : x + 0.5); - #endif + // floating-point equality and inequality comparisons are unreliable + #pragma warning(disable: 1572) + + return x == y; + + #pragma warning(pop) } + +#else /* !__INTELC__ */ + wxGCC_WARNING_SUPPRESS(float-equal) + inline bool wxIsSameDouble(double x, double y) { return x == y; } + wxGCC_WARNING_RESTORE(float-equal) + +#endif /* __INTELC__/!__INTELC__ */ + +inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } + +inline int wxRound(double x) +{ + wxASSERT_MSG( x > INT_MIN - 0.5 && x < INT_MAX + 0.5, + wxT("argument out of supported range") ); + + #if defined(HAVE_ROUND) + return int(round(x)); + #else + return (int)(x < 0 ? x - 0.5 : x + 0.5); + #endif +} + #endif /* __cplusplus */ diff --git a/Externals/wxWidgets3/include/wx/matrix.h b/Externals/wxWidgets3/include/wx/matrix.h index b23ff530fc..859c2a28d1 100644 --- a/Externals/wxWidgets3/include/wx/matrix.h +++ b/Externals/wxWidgets3/include/wx/matrix.h @@ -4,7 +4,6 @@ // Author: Chris Breeze, Julian Smart // Modified by: Klaas Holwerda // Created: 01/02/97 -// RCS-ID: $Id: matrix.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart, Chris Breeze // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/mdi.h b/Externals/wxWidgets3/include/wx/mdi.h index df6283eb2a..837c132822 100644 --- a/Externals/wxWidgets3/include/wx/mdi.h +++ b/Externals/wxWidgets3/include/wx/mdi.h @@ -5,7 +5,6 @@ // Vadim Zeitlin (base MDI classes refactoring) // Copyright: (c) 1998 Julian Smart // (c) 2008 Vadim Zeitlin -// RCS-ID: $Id: mdi.h 70790 2012-03-04 00:29:03Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -123,6 +122,10 @@ public: virtual wxMDIClientWindow *OnCreateClient(); protected: + // Override to pass menu/toolbar events to the active child first. + virtual bool TryBefore(wxEvent& event); + + // This is wxMDIClientWindow for all the native implementations but not for // the generic MDI version which has its own wxGenericMDIClientWindow and // so we store it as just a base class pointer because we don't need its @@ -369,6 +372,31 @@ inline wxMDIClientWindow *wxMDIParentFrameBase::OnCreateClient() return new wxMDIClientWindow; } +inline bool wxMDIParentFrameBase::TryBefore(wxEvent& event) +{ + // Menu (and toolbar) events should be sent to the active child frame + // first, if any. + if ( event.GetEventType() == wxEVT_MENU || + event.GetEventType() == wxEVT_UPDATE_UI ) + { + wxMDIChildFrame * const child = GetActiveChild(); + if ( child ) + { + // However avoid sending the event back to the child if it's + // currently being propagated to us from it. + wxWindow* const + from = static_cast(event.GetPropagatedFrom()); + if ( !from || !from->IsDescendant(child) ) + { + if ( child->ProcessWindowEventLocally(event) ) + return true; + } + } + } + + return wxFrame::TryBefore(event); +} + #endif // wxUSE_MDI #endif // _WX_MDI_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/mediactrl.h b/Externals/wxWidgets3/include/wx/mediactrl.h index 2757cf7641..4d0fd7b0f1 100644 --- a/Externals/wxWidgets3/include/wx/mediactrl.h +++ b/Externals/wxWidgets3/include/wx/mediactrl.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 11/07/04 -// RCS-ID: $Id: mediactrl.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -242,7 +241,7 @@ protected: // for wxMediaCtrl. Backends are searched alphabetically - // the one with the earliest letter is tried first. // -// Note that this is currently not API or ABI compatable - +// Note that this is currently not API or ABI compatible - // so statically link or make the client compile on-site. // // ---------------------------------------------------------------------------- @@ -392,7 +391,7 @@ protected: }; // ---------------------------------------------------------------------------- -// End compilation gaurd +// End compilation guard // ---------------------------------------------------------------------------- #endif // wxUSE_MEDIACTRL diff --git a/Externals/wxWidgets3/include/wx/memconf.h b/Externals/wxWidgets3/include/wx/memconf.h index 392abba040..3dbec634e1 100644 --- a/Externals/wxWidgets3/include/wx/memconf.h +++ b/Externals/wxWidgets3/include/wx/memconf.h @@ -6,7 +6,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.01.00 -// RCS-ID: $Id: memconf.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/memory.h b/Externals/wxWidgets3/include/wx/memory.h index 17f1149b7b..834ae4efd6 100644 --- a/Externals/wxWidgets3/include/wx/memory.h +++ b/Externals/wxWidgets3/include/wx/memory.h @@ -4,7 +4,6 @@ // Author: Arthur Seaton, Julian Smart // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: memory.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -43,14 +42,14 @@ WXDLLIMPEXP_BASE void wxDebugFree(void * buf, bool isVect = false); #if defined(__SUNCC__) #define wxUSE_ARRAY_MEMORY_OPERATORS 0 -#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) || defined( __MWERKS__) +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) #define wxUSE_ARRAY_MEMORY_OPERATORS 1 #elif defined (__SGI_CC_) // only supported by -n32 compilers #ifndef __EDG_ABI_COMPATIBILITY_VERSION #define wxUSE_ARRAY_MEMORY_OPERATORS 0 #endif -#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) || defined( __MWERKS__) +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) #define wxUSE_ARRAY_MEMORY_OPERATORS 1 #else // ::operator new[] is a recent C++ feature, so assume it's not supported @@ -110,8 +109,8 @@ void operator delete[] (void * buf); #endif // wxUSE_ARRAY_MEMORY_OPERATORS #endif // defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE)) -// VC++ 6.0 and MWERKS -#if ( defined(__VISUALC__) && (__VISUALC__ >= 1200) ) || defined(__MWERKS__) +// VC++ 6.0 +#if ( defined(__VISUALC__) && (__VISUALC__ >= 1200) ) inline void operator delete(void* pData, wxChar* /* fileName */, int /* lineNum */) { wxDebugFree(pData, false); diff --git a/Externals/wxWidgets3/include/wx/menu.h b/Externals/wxWidgets3/include/wx/menu.h index 552ca8b286..e4dedcf2dd 100644 --- a/Externals/wxWidgets3/include/wx/menu.h +++ b/Externals/wxWidgets3/include/wx/menu.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 26.10.99 -// RCS-ID: $Id: menu.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/menuitem.h b/Externals/wxWidgets3/include/wx/menuitem.h index 3c0fdfc41b..4eb80b7b5b 100644 --- a/Externals/wxWidgets3/include/wx/menuitem.h +++ b/Externals/wxWidgets3/include/wx/menuitem.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 25.10.99 -// RCS-ID: $Id: menuitem.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -82,7 +81,13 @@ public: void SetKind(wxItemKind kind) { m_kind = kind; } bool IsSeparator() const { return m_kind == wxITEM_SEPARATOR; } - virtual void SetCheckable(bool checkable) { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; } + bool IsCheck() const { return m_kind == wxITEM_CHECK; } + bool IsRadio() const { return m_kind == wxITEM_RADIO; } + + virtual void SetCheckable(bool checkable) + { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; } + + // Notice that this doesn't quite match SetCheckable(). bool IsCheckable() const { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } diff --git a/Externals/wxWidgets3/include/wx/meta/convertible.h b/Externals/wxWidgets3/include/wx/meta/convertible.h index 84dba133c5..4599937821 100644 --- a/Externals/wxWidgets3/include/wx/meta/convertible.h +++ b/Externals/wxWidgets3/include/wx/meta/convertible.h @@ -3,7 +3,6 @@ // Purpose: Test if types are convertible // Author: Arne Steinarson // Created: 2008-01-10 -// RCS-ID: $Id: convertible.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2008 Arne Steinarson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/if.h b/Externals/wxWidgets3/include/wx/meta/if.h index 02df945708..f6f3672fc7 100644 --- a/Externals/wxWidgets3/include/wx/meta/if.h +++ b/Externals/wxWidgets3/include/wx/meta/if.h @@ -3,7 +3,6 @@ // Purpose: declares wxIf<> metaprogramming construct // Author: Vaclav Slavik // Created: 2008-01-22 -// RCS-ID: $Id: if.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2008 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/implicitconversion.h b/Externals/wxWidgets3/include/wx/meta/implicitconversion.h index 2057ec89c4..d596a6b248 100644 --- a/Externals/wxWidgets3/include/wx/meta/implicitconversion.h +++ b/Externals/wxWidgets3/include/wx/meta/implicitconversion.h @@ -3,7 +3,6 @@ // Purpose: Determine resulting type from implicit conversion // Author: Vaclav Slavik // Created: 2010-10-22 -// RCS-ID: $Id: implicitconversion.h 66054 2010-11-07 13:16:20Z VZ $ // Copyright: (c) 2010 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/int2type.h b/Externals/wxWidgets3/include/wx/meta/int2type.h index 53a1c4ea0a..7b8d5dc02c 100644 --- a/Externals/wxWidgets3/include/wx/meta/int2type.h +++ b/Externals/wxWidgets3/include/wx/meta/int2type.h @@ -3,7 +3,6 @@ // Purpose: Generate a unique type from a constant integer // Author: Arne Steinarson // Created: 2008-01-10 -// RCS-ID: $Id: int2type.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2008 Arne Steinarson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/movable.h b/Externals/wxWidgets3/include/wx/meta/movable.h index 0217a121c7..e3a9f9e96c 100644 --- a/Externals/wxWidgets3/include/wx/meta/movable.h +++ b/Externals/wxWidgets3/include/wx/meta/movable.h @@ -3,7 +3,6 @@ // Purpose: Test if a type is movable using memmove() etc. // Author: Vaclav Slavik // Created: 2008-01-21 -// RCS-ID: $Id: movable.h 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 2008 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/pod.h b/Externals/wxWidgets3/include/wx/meta/pod.h index ad9b42de14..b9dde13d65 100644 --- a/Externals/wxWidgets3/include/wx/meta/pod.h +++ b/Externals/wxWidgets3/include/wx/meta/pod.h @@ -3,7 +3,6 @@ // Purpose: Test if a type is POD // Author: Vaclav Slavik, Jaakko Salli // Created: 2010-06-14 -// RCS-ID: $Id: pod.h 64589 2010-06-14 15:12:37Z JMS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/meta/removeref.h b/Externals/wxWidgets3/include/wx/meta/removeref.h new file mode 100644 index 0000000000..e199d033f7 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/meta/removeref.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/meta/removeref.h +// Purpose: Allows to remove a reference from a type. +// Author: Vadim Zeitlin +// Created: 2012-10-21 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_META_REMOVEREF_H_ +#define _WX_META_REMOVEREF_H_ + +// wxRemoveRef<> is similar to C++11 std::remove_reference<> but works with all +// compilers (but, to compensate for this, doesn't work with rvalue references). + +// Except that it doesn't work with VC++ 6 as there doesn't seem to be any way +// to partially specialize a template for references with it. +#ifndef __VISUALC6__ + +template +struct wxRemoveRef +{ + typedef T type; +}; + +template +struct wxRemoveRef +{ + typedef T type; +}; + +#define wxHAS_REMOVEREF + +#endif // !__VISUALC6__ + +#endif // _WX_META_REMOVEREF_H_ diff --git a/Externals/wxWidgets3/include/wx/metafile.h b/Externals/wxWidgets3/include/wx/metafile.h index feaac82e7f..c34d8acef3 100644 --- a/Externals/wxWidgets3/include/wx/metafile.h +++ b/Externals/wxWidgets3/include/wx/metafile.h @@ -4,7 +4,6 @@ // Author: wxWidgets team // Modified by: // Created: 13.01.00 -// RCS-ID: $Id: metafile.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/mimetype.h b/Externals/wxWidgets3/include/wx/mimetype.h index a7933cd989..b3ae6b77b0 100644 --- a/Externals/wxWidgets3/include/wx/mimetype.h +++ b/Externals/wxWidgets3/include/wx/mimetype.h @@ -5,7 +5,6 @@ // Modified by: // Chris Elliott (biol75@york.ac.uk) 5 Dec 00: write support for Win32 // Created: 23.09.98 -// RCS-ID: $Id: mimetype.h 67384 2011-04-03 20:31:32Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/minifram.h b/Externals/wxWidgets3/include/wx/minifram.h index 8907b69ba4..f769c5a691 100644 --- a/Externals/wxWidgets3/include/wx/minifram.h +++ b/Externals/wxWidgets3/include/wx/minifram.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: minifram.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/modalhook.h b/Externals/wxWidgets3/include/wx/modalhook.h new file mode 100644 index 0000000000..55341f9bd9 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/modalhook.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/modalhook.h +// Purpose: Allows to hook into showing modal dialogs. +// Author: Vadim Zeitlin +// Created: 2013-05-19 +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MODALHOOK_H_ +#define _WX_MODALHOOK_H_ + +#include "wx/vector.h" + +class WXDLLIMPEXP_FWD_CORE wxDialog; + +// ---------------------------------------------------------------------------- +// Class allowing to be notified about any modal dialog calls. +// ---------------------------------------------------------------------------- + +// To be notified about entering and exiting modal dialogs and possibly to +// replace them with something else (e.g. just return a predefined value for +// testing), define an object of this class, override its Enter() and +// possibly Exit() methods and call Register() on it. +class WXDLLIMPEXP_CORE wxModalDialogHook +{ +public: + // Default ctor doesn't do anything, call Register() to activate the hook. + wxModalDialogHook() { } + + // Dtor unregisters the hook if it had been registered. + virtual ~wxModalDialogHook() { DoUnregister(); } + + // Register this hook as being active, i.e. its Enter() and Exit() methods + // will be called. + // + // Notice that the order of registration matters: the last hook registered + // is called first, and if its Enter() returns something != wxID_NONE, the + // subsequent hooks are skipped. + void Register(); + + // Unregister this hook. Notice that is done automatically from the dtor. + void Unregister(); + + // Called from wxWidgets code before showing any modal dialogs and calls + // Enter() for every registered hook. + static int CallEnter(wxDialog* dialog); + + // Called from wxWidgets code after dismissing the dialog and calls Exit() + // for every registered hook. + static void CallExit(wxDialog* dialog); + +protected: + // Called by wxWidgets before showing any modal dialogs, override this to + // be notified about this and return anything but wxID_NONE to skip showing + // the modal dialog entirely and just return the specified result. + virtual int Enter(wxDialog* dialog) = 0; + + // Called by wxWidgets after dismissing the modal dialog. Notice that it + // won't be called if Enter() hadn't been. + virtual void Exit(wxDialog* WXUNUSED(dialog)) { } + +private: + // Unregister the given hook, return true if it was done or false if the + // hook wasn't found. + bool DoUnregister(); + + // All the hooks in reverse registration order (i.e. in call order). + typedef wxVector Hooks; + static Hooks ms_hooks; + + wxDECLARE_NO_COPY_CLASS(wxModalDialogHook); +}; + +// Helper object used by WX_MODAL_DIALOG_HOOK below to ensure that CallExit() +// is called on scope exit. +class wxModalDialogHookExitGuard +{ +public: + wxEXPLICIT wxModalDialogHookExitGuard(wxDialog* dialog) + : m_dialog(dialog) + { + } + + ~wxModalDialogHookExitGuard() + { + wxModalDialogHook::CallExit(m_dialog); + } + +private: + wxDialog* const m_dialog; + + wxDECLARE_NO_COPY_CLASS(wxModalDialogHookExitGuard); +}; + +// This macro needs to be used at the top of every implementation of +// ShowModal() in order for wxModalDialogHook to work. +#define WX_HOOK_MODAL_DIALOG() \ + const int modalDialogHookRC = wxModalDialogHook::CallEnter(this); \ + if ( modalDialogHookRC != wxID_NONE ) \ + return modalDialogHookRC; \ + wxModalDialogHookExitGuard modalDialogHookExit(this) + +#endif // _WX_MODALHOOK_H_ diff --git a/Externals/wxWidgets3/include/wx/module.h b/Externals/wxWidgets3/include/wx/module.h index 7076830254..96600b76ca 100644 --- a/Externals/wxWidgets3/include/wx/module.h +++ b/Externals/wxWidgets3/include/wx/module.h @@ -4,7 +4,6 @@ // Author: Wolfram Gloger/adapted by Guilhem Lavaux // Modified by: // Created: 04/11/98 -// RCS-ID: $Id: module.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) Wolfram Gloger and Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/mousemanager.h b/Externals/wxWidgets3/include/wx/mousemanager.h index e9f88713a7..caa2abeaec 100644 --- a/Externals/wxWidgets3/include/wx/mousemanager.h +++ b/Externals/wxWidgets3/include/wx/mousemanager.h @@ -3,7 +3,6 @@ // Purpose: wxMouseEventsManager class declaration // Author: Vadim Zeitlin // Created: 2009-04-20 -// RCS-ID: $Id: mousemanager.h 60839 2009-05-31 14:43:01Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/mousestate.h b/Externals/wxWidgets3/include/wx/mousestate.h index 334b13fb15..2ea1cc5bf1 100644 --- a/Externals/wxWidgets3/include/wx/mousestate.h +++ b/Externals/wxWidgets3/include/wx/mousestate.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxMouseState class // Author: Vadim Zeitlin // Created: 2008-09-19 (extracted from wx/utils.h) -// RCS-ID: $Id: mousestate.h 70098 2011-12-23 05:59:59Z PC $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -100,13 +99,11 @@ public: case wxMOUSE_BTN_NONE: case wxMOUSE_BTN_MAX: - wxFAIL_MSG(wxS("invalid parameter")); - return false; - - default: - wxFAIL_MSG(wxS("unknown parameter")); - return false; + break; } + + wxFAIL_MSG(wxS("invalid parameter")); + return false; } diff --git a/Externals/wxWidgets3/include/wx/msgdlg.h b/Externals/wxWidgets3/include/wx/msgdlg.h index 6da9e0cd7f..8a234ac48f 100644 --- a/Externals/wxWidgets3/include/wx/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/msgdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: msgdlg.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -125,8 +124,12 @@ public: wxASSERT_MSG( !(style & wxYES) || !(style & wxOK), "wxOK and wxYES/wxNO can't be used together" ); - wxASSERT_MSG( (style & wxYES) || (style & wxOK), - "one of wxOK and wxYES/wxNO must be used" ); + // It is common to specify just the icon, without wxOK, in the existing + // code, especially one written by Windows programmers as MB_OK is 0 + // and so they're used to omitting wxOK. Don't complain about it but + // just add wxOK implicitly for compatibility. + if ( !(style & wxYES) && !(style & wxOK) ) + style |= wxOK; wxASSERT_MSG( (style & wxID_OK) != wxID_OK, "wxMessageBox: Did you mean wxOK (and not wxID_OK)?" ); @@ -205,8 +208,9 @@ public: { return m_help.empty() ? GetDefaultHelpLabel() : m_help; } // based on message dialog style, returns exactly one of: wxICON_NONE, - // wxICON_ERROR, wxICON_WARNING, wxICON_QUESTION, wxICON_INFORMATION - long GetEffectiveIcon() const + // wxICON_ERROR, wxICON_WARNING, wxICON_QUESTION, wxICON_INFORMATION, + // wxICON_AUTH_NEEDED + virtual long GetEffectiveIcon() const { if ( m_dialogStyle & wxICON_NONE ) return wxICON_NONE; diff --git a/Externals/wxWidgets3/include/wx/msgout.h b/Externals/wxWidgets3/include/wx/msgout.h index aca920bd0d..63b39b92c2 100644 --- a/Externals/wxWidgets3/include/wx/msgout.h +++ b/Externals/wxWidgets3/include/wx/msgout.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon // Modified by: // Created: 17.07.02 -// RCS-ID: $Id: msgout.h 61459 2009-07-18 23:22:51Z VZ $ // Copyright: (c) Mattia Barbon // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msgqueue.h b/Externals/wxWidgets3/include/wx/msgqueue.h index 479de02b20..8b8da87d18 100644 --- a/Externals/wxWidgets3/include/wx/msgqueue.h +++ b/Externals/wxWidgets3/include/wx/msgqueue.h @@ -3,7 +3,6 @@ // Purpose: Message queues for inter-thread communication // Author: Evgeniy Tarassov // Created: 2007-10-31 -// RCS-ID: $Id: msgqueue.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (C) 2007 TT-Solutions SARL // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/mstream.h b/Externals/wxWidgets3/include/wx/mstream.h index 7755376691..435aebdfb8 100644 --- a/Externals/wxWidgets3/include/wx/mstream.h +++ b/Externals/wxWidgets3/include/wx/mstream.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 11/07/98 -// RCS-ID: $Id: mstream.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/accel.h b/Externals/wxWidgets3/include/wx/msw/accel.h index b4dece3ddf..182662c209 100644 --- a/Externals/wxWidgets3/include/wx/msw/accel.h +++ b/Externals/wxWidgets3/include/wx/msw/accel.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 31/7/98 -// RCS-ID: $Id: accel.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/anybutton.h b/Externals/wxWidgets3/include/wx/msw/anybutton.h index cda386e798..e8226d51c3 100644 --- a/Externals/wxWidgets3/include/wx/msw/anybutton.h +++ b/Externals/wxWidgets3/include/wx/msw/anybutton.h @@ -3,7 +3,6 @@ // Purpose: wxAnyButton class // Author: Julian Smart // Created: 1997-02-01 (extracted from button.h) -// RCS-ID: $Id: anybutton.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/app.h b/Externals/wxWidgets3/include/wx/msw/app.h index 9020ffd48c..b1b65da13e 100644 --- a/Externals/wxWidgets3/include/wx/msw/app.h +++ b/Externals/wxWidgets3/include/wx/msw/app.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: app.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -126,81 +125,5 @@ inline int wxApp::GetShell32Version() #endif // __WXWINCE__ -// ---------------------------------------------------------------------------- -// MSW-specific wxEntry() overload and wxIMPLEMENT_WXWIN_MAIN definition -// ---------------------------------------------------------------------------- - -// we need HINSTANCE declaration to define WinMain() -#include "wx/msw/wrapwin.h" - -#ifndef SW_SHOWNORMAL - #define SW_SHOWNORMAL 1 -#endif - -// WinMain() is always ANSI, even in Unicode build, under normal Windows -// but is always Unicode under CE -#ifdef __WXWINCE__ - typedef wchar_t *wxCmdLineArgType; -#else - typedef char *wxCmdLineArgType; -#endif - -// wxMSW-only overloads of wxEntry() and wxEntryStart() which take the -// parameters passed to WinMain() instead of those passed to main() -extern WXDLLIMPEXP_CORE bool - wxEntryStart(HINSTANCE hInstance, - HINSTANCE hPrevInstance = NULL, - wxCmdLineArgType pCmdLine = NULL, - int nCmdShow = SW_SHOWNORMAL); - -extern WXDLLIMPEXP_CORE int - wxEntry(HINSTANCE hInstance, - HINSTANCE hPrevInstance = NULL, - wxCmdLineArgType pCmdLine = NULL, - int nCmdShow = SW_SHOWNORMAL); - -#if defined(__BORLANDC__) && wxUSE_UNICODE - // Borland C++ has the following nonstandard behaviour: when the -WU - // command line flag is used, the linker expects to find wWinMain instead - // of WinMain. This flag causes the compiler to define _UNICODE and - // UNICODE symbols and there's no way to detect its use, so we have to - // define both WinMain and wWinMain so that wxIMPLEMENT_WXWIN_MAIN works - // for both code compiled with and without -WU. - // See http://sourceforge.net/tracker/?func=detail&atid=309863&aid=1935997&group_id=9863 - // for more details. - #define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD \ - extern "C" int WINAPI wWinMain(HINSTANCE hInstance, \ - HINSTANCE hPrevInstance, \ - wchar_t * WXUNUSED(lpCmdLine), \ - int nCmdShow) \ - { \ - wxDISABLE_DEBUG_SUPPORT(); \ - \ - /* NB: wxEntry expects lpCmdLine argument to be char*, not */ \ - /* wchar_t*, but fortunately it's not used anywhere */ \ - /* and we can simply pass NULL in: */ \ - return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \ - } -#else - #define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD -#endif // defined(__BORLANDC__) && wxUSE_UNICODE - -#define wxIMPLEMENT_WXWIN_MAIN \ - extern "C" int WINAPI WinMain(HINSTANCE hInstance, \ - HINSTANCE hPrevInstance, \ - wxCmdLineArgType WXUNUSED(lpCmdLine), \ - int nCmdShow) \ - { \ - wxDISABLE_DEBUG_SUPPORT(); \ - \ - /* NB: We pass NULL in place of lpCmdLine to behave the same as */ \ - /* Borland-specific wWinMain() above. If it becomes needed */ \ - /* to pass lpCmdLine to wxEntry() here, you'll have to fix */ \ - /* wWinMain() above too. */ \ - return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \ - } \ - wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD - - #endif // _WX_APP_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/apptbase.h b/Externals/wxWidgets3/include/wx/msw/apptbase.h index 42548e4369..65a1b5bff3 100644 --- a/Externals/wxWidgets3/include/wx/msw/apptbase.h +++ b/Externals/wxWidgets3/include/wx/msw/apptbase.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.06.2003 -// RCS-ID: $Id: apptbase.h 67288 2011-03-22 17:15:56Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/apptrait.h b/Externals/wxWidgets3/include/wx/msw/apptrait.h index 2ef84e7cc1..f190da6dab 100644 --- a/Externals/wxWidgets3/include/wx/msw/apptrait.h +++ b/Externals/wxWidgets3/include/wx/msw/apptrait.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 21.06.2003 -// RCS-ID: $Id: apptrait.h 67288 2011-03-22 17:15:56Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -37,6 +36,8 @@ public: #if wxUSE_GUI +#if defined(__WXMSW__) + class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase { public: @@ -58,6 +59,38 @@ public: #endif // !__WXWINCE__ }; +#elif defined(__WXGTK__) + +class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual wxEventLoopBase *CreateEventLoop(); + virtual void *BeforeChildWaitLoop() { return NULL; } + virtual void AfterChildWaitLoop(void *WXUNUSED(data)) { } +#if wxUSE_TIMER + virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer); +#endif + +#if wxUSE_THREADS && defined(__WXGTK20__) + virtual void MutexGuiEnter(); + virtual void MutexGuiLeave(); +#endif + +#if wxUSE_THREADS + virtual bool DoMessageFromThreadWait() { return true; } + virtual WXDWORD WaitForThread(WXHANDLE hThread, int WXUNUSED(flags)) + { return DoSimpleWaitForThread(hThread); } +#endif // wxUSE_THREADS + virtual wxPortId GetToolkitVersion(int *majVer = NULL, int *minVer = NULL) const; + +#ifndef __WXWINCE__ + virtual bool CanUseStderr() { return false; } + virtual bool WriteToStderr(const wxString& WXUNUSED(text)) { return false; } +#endif // !__WXWINCE__ +}; + +#endif + #endif // wxUSE_GUI #endif // _WX_MSW_APPTRAIT_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/bitmap.h b/Externals/wxWidgets3/include/wx/msw/bitmap.h index 37cd4dabdb..ef07317b1d 100644 --- a/Externals/wxWidgets3/include/wx/msw/bitmap.h +++ b/Externals/wxWidgets3/include/wx/msw/bitmap.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: bitmap.h 66086 2010-11-10 13:51:51Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,6 +12,7 @@ #define _WX_BITMAP_H_ #include "wx/msw/gdiimage.h" +#include "wx/math.h" #include "wx/palette.h" class WXDLLIMPEXP_FWD_CORE wxBitmap; @@ -43,7 +43,8 @@ enum wxBitmapTransparency // NOTE: for wxMSW we don't use the wxBitmapBase base class declared in bitmap.h! // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage +class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage, + public wxBitmapHelpers { public: // default ctor creates an invalid bitmap, you must Create() it later @@ -143,6 +144,9 @@ public: virtual bool Create(int width, int height, const wxDC& dc); virtual bool Create(const void* data, wxBitmapType type, int width, int height, int depth = 1); + virtual bool CreateScaled(int w, int h, int d, double logicalScale) + { return Create(wxRound(w*logicalScale), wxRound(h*logicalScale), d); } + virtual bool LoadFile(const wxString& name, wxBitmapType type = wxBITMAP_DEFAULT_TYPE); virtual bool SaveFile(const wxString& name, wxBitmapType type, const wxPalette *cmap = NULL) const; @@ -159,7 +163,6 @@ public: #endif // wxUSE_PALETTE wxMask *GetMask() const; - wxBitmap GetMaskBitmap() const; void SetMask(wxMask *mask); // these functions are internal and shouldn't be used, they risk to @@ -167,6 +170,13 @@ public: bool HasAlpha() const; void UseAlpha(); + // support for scaled bitmaps + virtual double GetScaleFactor() const { return 1.0; } + virtual double GetScaledWidth() const { return GetWidth() / GetScaleFactor(); } + virtual double GetScaledHeight() const { return GetHeight() / GetScaleFactor(); } + virtual wxSize GetScaledSize() const + { return wxSize(wxRound(GetScaledWidth()), wxRound(GetScaledHeight())); } + // implementation only from now on // ------------------------------- @@ -237,6 +247,8 @@ public: bool Create(const wxBitmap& bitmap, int paletteIndex); bool Create(const wxBitmap& bitmap); + wxBitmap GetBitmap() const; + // Implementation WXHBITMAP GetMaskBitmap() const { return m_maskBitmap; } void SetMaskBitmap(WXHBITMAP bmp) { m_maskBitmap = bmp; } diff --git a/Externals/wxWidgets3/include/wx/msw/bmpbuttn.h b/Externals/wxWidgets3/include/wx/msw/bmpbuttn.h index 894260f4a0..e435673c2b 100644 --- a/Externals/wxWidgets3/include/wx/msw/bmpbuttn.h +++ b/Externals/wxWidgets3/include/wx/msw/bmpbuttn.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: bmpbuttn.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/bmpcbox.h b/Externals/wxWidgets3/include/wx/msw/bmpcbox.h index 33a7eb1bef..0462c46217 100644 --- a/Externals/wxWidgets3/include/wx/msw/bmpcbox.h +++ b/Externals/wxWidgets3/include/wx/msw/bmpcbox.h @@ -3,7 +3,6 @@ // Purpose: wxBitmapComboBox // Author: Jaakko Salli // Created: 2008-04-06 -// RCS-ID: $Id: bmpcbox.h 65091 2010-07-25 07:39:17Z JMS $ // Copyright: (c) 2008 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/brush.h b/Externals/wxWidgets3/include/wx/msw/brush.h index 21b8ce5fce..9665fd1133 100644 --- a/Externals/wxWidgets3/include/wx/msw/brush.h +++ b/Externals/wxWidgets3/include/wx/msw/brush.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: brush.h 54273 2008-06-17 17:28:26Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/button.h b/Externals/wxWidgets3/include/wx/msw/button.h index ac3545b6eb..26979a8939 100644 --- a/Externals/wxWidgets3/include/wx/msw/button.h +++ b/Externals/wxWidgets3/include/wx/msw/button.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: button.h 69984 2011-12-11 17:03:56Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/calctrl.h b/Externals/wxWidgets3/include/wx/msw/calctrl.h index e4a4932659..c5c51d9fde 100644 --- a/Externals/wxWidgets3/include/wx/msw/calctrl.h +++ b/Externals/wxWidgets3/include/wx/msw/calctrl.h @@ -2,7 +2,6 @@ // Name: wx/msw/calctrl.h // Purpose: wxCalendarCtrl control implementation for MSW // Author: Vadim Zeitlin -// RCS-ID: $Id: calctrl.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (C) 2008 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/caret.h b/Externals/wxWidgets3/include/wx/msw/caret.h index ed0e6cacaa..c179032d08 100644 --- a/Externals/wxWidgets3/include/wx/msw/caret.h +++ b/Externals/wxWidgets3/include/wx/msw/caret.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.05.99 -// RCS-ID: $Id: caret.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/checkbox.h b/Externals/wxWidgets3/include/wx/msw/checkbox.h index 9eebea0ae5..c1f0eff868 100644 --- a/Externals/wxWidgets3/include/wx/msw/checkbox.h +++ b/Externals/wxWidgets3/include/wx/msw/checkbox.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: checkbox.h 54008 2008-06-07 01:54:44Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -52,15 +51,18 @@ public: // returns true if the platform should explicitly apply a theme border virtual bool CanApplyThemeBorder() const { return false; } + // make the checkbox owner drawn or reset it to normal style + void MSWMakeOwnerDrawn(bool ownerDrawn); + + // implementation only from now on + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + protected: - virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetBestClientSize() const; virtual void DoSet3StateValue(wxCheckBoxState value); virtual wxCheckBoxState DoGet3StateValue() const; - // make the checkbox owner drawn or reset it to normal style - void MakeOwnerDrawn(bool ownerDrawn); - // return true if this checkbox is owner drawn bool IsOwnerDrawn() const; diff --git a/Externals/wxWidgets3/include/wx/msw/checklst.h b/Externals/wxWidgets3/include/wx/msw/checklst.h index 4814b0cce7..21b8651ac0 100644 --- a/Externals/wxWidgets3/include/wx/msw/checklst.h +++ b/Externals/wxWidgets3/include/wx/msw/checklst.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 16.11.97 -// RCS-ID: $Id: checklst.h 63226 2010-01-23 13:22:00Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -73,7 +72,7 @@ protected: // send an "item checked" event void SendEvent(unsigned int uiIndex) { - wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId()); + wxCommandEvent event(wxEVT_CHECKLISTBOX, GetId()); event.SetInt(uiIndex); event.SetEventObject(this); event.SetString(GetString(uiIndex)); diff --git a/Externals/wxWidgets3/include/wx/msw/chkconf.h b/Externals/wxWidgets3/include/wx/msw/chkconf.h index 637155d5f8..367f9e411e 100644 --- a/Externals/wxWidgets3/include/wx/msw/chkconf.h +++ b/Externals/wxWidgets3/include/wx/msw/chkconf.h @@ -4,7 +4,6 @@ * Author: Julian Smart * Modified by: * Created: 01/02/97 - * RCS-ID: $Id: chkconf.h 69845 2011-11-27 19:52:13Z VZ $ * Copyright: (c) Julian Smart * Licence: wxWindows licence */ @@ -155,12 +154,6 @@ # define wxUSE_STACKWALKER 0 #endif /* compiler doesn't support SEH */ -/* wxUSE_DEBUG_NEW_ALWAYS doesn't work with CodeWarrior */ -#if defined(__MWERKS__) -# undef wxUSE_DEBUG_NEW_ALWAYS -# define wxUSE_DEBUG_NEW_ALWAYS 0 -#endif - #if defined(__GNUWIN32__) /* These don't work as expected for mingw32 and cygwin32 */ # undef wxUSE_MEMORY_TRACING diff --git a/Externals/wxWidgets3/include/wx/msw/choice.h b/Externals/wxWidgets3/include/wx/msw/choice.h index e63382568c..a6c5703efc 100644 --- a/Externals/wxWidgets3/include/wx/msw/choice.h +++ b/Externals/wxWidgets3/include/wx/msw/choice.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Vadim Zeitlin to derive from wxChoiceBase // Created: 01/02/97 -// RCS-ID: $Id: choice.h 62960 2009-12-21 15:20:37Z JMS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,6 +11,8 @@ #ifndef _WX_CHOICE_H_ #define _WX_CHOICE_H_ +struct tagCOMBOBOXINFO; + // ---------------------------------------------------------------------------- // Choice item // ---------------------------------------------------------------------------- @@ -66,6 +67,8 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxChoiceNameStr); + virtual bool Show(bool show = true); + virtual void SetLabel(const wxString& label); virtual unsigned int GetCount() const; @@ -102,7 +105,8 @@ protected: // common part of all ctors void Init() { - m_lastAcceptedSelection = wxID_NONE; + m_lastAcceptedSelection = + m_pendingSelection = wxID_NONE; m_heightOwn = wxDefaultCoord; } @@ -123,6 +127,10 @@ protected: virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + + // Show or hide the popup part of the control. + void MSWDoPopupOrDismiss(bool show); // update the height of the drop down list to fit the number of items we // have (without changing the visible height) @@ -131,6 +139,10 @@ protected: // set the height of the visible part of the control to m_heightOwn void MSWUpdateVisibleHeight(); + // Call GetComboBoxInfo() and return false if it's not supported by this + // system. Notice that the caller must initialize info.cbSize. + bool MSWGetComboBoxInfo(tagCOMBOBOXINFO* info) const; + // create and initialize the control bool CreateAndInit(wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -150,10 +162,13 @@ protected: virtual void MSWEndDeferWindowPos(); #endif // wxUSE_DEFERRED_SIZING - // last "completed" selection, i.e. not the transient one while the user is - // browsing the popup list: this is only used when != wxID_NONE which is - // the case while the drop down is opened - int m_lastAcceptedSelection; + // These variables are only used while the drop down is opened. + // + // The first one contains the item that had been originally selected before + // the drop down was opened and the second one the item we should select + // when the drop down is closed again. + int m_lastAcceptedSelection, + m_pendingSelection; // the height of the control itself if it was set explicitly or // wxDefaultCoord if it hadn't diff --git a/Externals/wxWidgets3/include/wx/msw/clipbrd.h b/Externals/wxWidgets3/include/wx/msw/clipbrd.h index 729f2324fb..53e8a169f9 100644 --- a/Externals/wxWidgets3/include/wx/msw/clipbrd.h +++ b/Externals/wxWidgets3/include/wx/msw/clipbrd.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: clipbrd.h 61485 2009-07-20 23:54:08Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/colordlg.h b/Externals/wxWidgets3/include/wx/msw/colordlg.h index d4ff522142..76c7a37c74 100644 --- a/Externals/wxWidgets3/include/wx/msw/colordlg.h +++ b/Externals/wxWidgets3/include/wx/msw/colordlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: colordlg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/colour.h b/Externals/wxWidgets3/include/wx/msw/colour.h index ec68a14c98..4b359fb370 100644 --- a/Externals/wxWidgets3/include/wx/msw/colour.h +++ b/Externals/wxWidgets3/include/wx/msw/colour.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: colour.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/combo.h b/Externals/wxWidgets3/include/wx/msw/combo.h index 05724ea602..50dc6eba4f 100644 --- a/Externals/wxWidgets3/include/wx/msw/combo.h +++ b/Externals/wxWidgets3/include/wx/msw/combo.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id: combo.h 67276 2011-03-22 09:56:40Z JMS $ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/combobox.h b/Externals/wxWidgets3/include/wx/msw/combobox.h index 5b7c63d67a..8649187c09 100644 --- a/Externals/wxWidgets3/include/wx/msw/combobox.h +++ b/Externals/wxWidgets3/include/wx/msw/combobox.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: combobox.h 68808 2011-08-21 12:06:16Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -92,6 +91,7 @@ public: virtual void SetSelection(long from, long to) { wxTextEntry::SetSelection(from, to); } virtual int GetSelection() const { return wxChoice::GetSelection(); } + virtual bool ContainsHWND(WXHWND hWnd) const; virtual void GetSelection(long *from, long *to) const; virtual bool IsEditable() const; @@ -130,7 +130,8 @@ protected: #if wxUSE_TOOLTIPS virtual void DoSetToolTip(wxToolTip *tip); #endif - void MSWDoPopupOrDismiss(bool show); + + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; // this is the implementation of GetEditHWND() which can also be used when // we don't have the edit control, it simply returns NULL then diff --git a/Externals/wxWidgets3/include/wx/msw/commandlinkbutton.h b/Externals/wxWidgets3/include/wx/msw/commandlinkbutton.h index ea674840f1..bc4d4804d0 100644 --- a/Externals/wxWidgets3/include/wx/msw/commandlinkbutton.h +++ b/Externals/wxWidgets3/include/wx/msw/commandlinkbutton.h @@ -3,7 +3,6 @@ // Purpose: wxCommandLinkButton class // Author: Rickard Westerlund // Created: 2010-06-11 -// RCS-ID: $Id: commandlinkbutton.h 65327 2010-08-17 14:48:50Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/control.h b/Externals/wxWidgets3/include/wx/msw/control.h index cfcf22f9fc..29897ad9c3 100644 --- a/Externals/wxWidgets3/include/wx/msw/control.h +++ b/Externals/wxWidgets3/include/wx/msw/control.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: control.h 62151 2009-09-26 16:43:06Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/crashrpt.h b/Externals/wxWidgets3/include/wx/msw/crashrpt.h index 613b39a693..f354b482c2 100644 --- a/Externals/wxWidgets3/include/wx/msw/crashrpt.h +++ b/Externals/wxWidgets3/include/wx/msw/crashrpt.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 13.07.2003 -// RCS-ID: $Id: crashrpt.h 53816 2008-05-29 13:28:05Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ctrlsub.h b/Externals/wxWidgets3/include/wx/msw/ctrlsub.h index a8a71384ba..068be29e58 100644 --- a/Externals/wxWidgets3/include/wx/msw/ctrlsub.h +++ b/Externals/wxWidgets3/include/wx/msw/ctrlsub.h @@ -3,7 +3,6 @@ // Purpose: common functionality of wxItemContainer-derived controls // Author: Vadim Zeitlin // Created: 2007-07-25 -// RCS-ID: $Id: ctrlsub.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/cursor.h b/Externals/wxWidgets3/include/wx/msw/cursor.h index 28702c0400..aef2e2a516 100644 --- a/Externals/wxWidgets3/include/wx/msw/cursor.h +++ b/Externals/wxWidgets3/include/wx/msw/cursor.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: cursor.h 55884 2008-09-25 17:56:07Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/custombgwin.h b/Externals/wxWidgets3/include/wx/msw/custombgwin.h index fe5481f710..ca8d8bfc42 100644 --- a/Externals/wxWidgets3/include/wx/msw/custombgwin.h +++ b/Externals/wxWidgets3/include/wx/msw/custombgwin.h @@ -3,7 +3,6 @@ // Purpose: wxMSW implementation of wxCustomBackgroundWindow // Author: Vadim Zeitlin // Created: 2011-10-10 -// RCS-ID: $Id: custombgwin.h 69378 2011-10-11 17:07:43Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/datectrl.h b/Externals/wxWidgets3/include/wx/msw/datectrl.h index 7015019f53..e3f95e880e 100644 --- a/Externals/wxWidgets3/include/wx/msw/datectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/datectrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-09 -// RCS-ID: $Id: datectrl.h 69222 2011-09-29 13:43:02Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/datetimectrl.h b/Externals/wxWidgets3/include/wx/msw/datetimectrl.h index 0c783511c2..eb93f26ae1 100644 --- a/Externals/wxWidgets3/include/wx/msw/datetimectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/datetimectrl.h @@ -3,7 +3,6 @@ // Purpose: wxDateTimePickerCtrl for Windows. // Author: Vadim Zeitlin // Created: 2011-09-22 (extracted from wx/msw/datectrl.h). -// RCS-ID: $Id: datetimectrl.h 69489 2011-10-20 16:45:48Z VZ $ // Copyright: (c) 2005-2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/dc.h b/Externals/wxWidgets3/include/wx/msw/dc.h index 48fa925c24..8ec5a94729 100644 --- a/Externals/wxWidgets3/include/wx/msw/dc.h +++ b/Externals/wxWidgets3/include/wx/msw/dc.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dc.h 67588 2011-04-23 16:03:10Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -126,6 +125,8 @@ public: m_clipX2 = 0; } + void* GetHandle() const { return (void*)GetHDC(); } + const wxBitmap& GetSelectedBitmap() const { return m_selectedBitmap; } wxBitmap& GetSelectedBitmap() { return m_selectedBitmap; } @@ -247,12 +248,12 @@ public: virtual void DoGetSizeMM(int* width, int* height) const; - virtual void DoDrawLines(int n, wxPoint points[], + virtual void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset); - virtual void DoDrawPolygon(int n, wxPoint points[], + virtual void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); - virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle = wxODDEVEN_RULE); virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const diff --git a/Externals/wxWidgets3/include/wx/msw/dcclient.h b/Externals/wxWidgets3/include/wx/msw/dcclient.h index 22ec737e30..9399e5c4be 100644 --- a/Externals/wxWidgets3/include/wx/msw/dcclient.h +++ b/Externals/wxWidgets3/include/wx/msw/dcclient.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dcclient.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,16 +18,8 @@ #include "wx/dc.h" #include "wx/msw/dc.h" #include "wx/dcclient.h" -#include "wx/dynarray.h" -// ---------------------------------------------------------------------------- -// array types -// ---------------------------------------------------------------------------- - -// this one if used by wxPaintDC only -struct WXDLLIMPEXP_FWD_CORE wxPaintDCInfo; - -WX_DECLARE_EXPORTED_OBJARRAY(wxPaintDCInfo, wxArrayDCInfo); +class wxPaintDCInfo; // ---------------------------------------------------------------------------- // DC classes @@ -86,11 +77,13 @@ public: // find the entry for this DC in the cache (keyed by the window) static WXHDC FindDCInCache(wxWindow* win); -protected: - static wxArrayDCInfo ms_cache; + // This must be called by the code handling WM_PAINT to remove the DC + // cached for this window for the duration of this message processing. + static void EndPaint(wxWindow *win); - // find the entry for this DC in the cache (keyed by the window) - wxPaintDCInfo *FindInCache(size_t *index = NULL) const; +protected: + // Find the DC for this window in the cache, return NULL if not found. + static wxPaintDCInfo *FindInCache(wxWindow* win); DECLARE_CLASS(wxPaintDCImpl) wxDECLARE_NO_COPY_CLASS(wxPaintDCImpl); diff --git a/Externals/wxWidgets3/include/wx/msw/dcmemory.h b/Externals/wxWidgets3/include/wx/msw/dcmemory.h index 8f5c6b39f8..59fdbc11b9 100644 --- a/Externals/wxWidgets3/include/wx/msw/dcmemory.h +++ b/Externals/wxWidgets3/include/wx/msw/dcmemory.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dcmemory.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/dcprint.h b/Externals/wxWidgets3/include/wx/msw/dcprint.h index a6a876067d..85a60246dd 100644 --- a/Externals/wxWidgets3/include/wx/msw/dcprint.h +++ b/Externals/wxWidgets3/include/wx/msw/dcprint.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dcprint.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/dcscreen.h b/Externals/wxWidgets3/include/wx/msw/dcscreen.h index aef59cbb0a..f85bbe2ff3 100644 --- a/Externals/wxWidgets3/include/wx/msw/dcscreen.h +++ b/Externals/wxWidgets3/include/wx/msw/dcscreen.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dcscreen.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/dde.h b/Externals/wxWidgets3/include/wx/msw/dde.h index d3f024deee..558f66c40e 100644 --- a/Externals/wxWidgets3/include/wx/msw/dde.h +++ b/Externals/wxWidgets3/include/wx/msw/dde.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dde.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/debughlp.h b/Externals/wxWidgets3/include/wx/msw/debughlp.h index f5c34ec2b3..715814d0ae 100644 --- a/Externals/wxWidgets3/include/wx/msw/debughlp.h +++ b/Externals/wxWidgets3/include/wx/msw/debughlp.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-08 (extracted from msw/crashrpt.cpp) -// RCS-ID: $Id: debughlp.h 69845 2011-11-27 19:52:13Z VZ $ // Copyright: (c) 2003-2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -20,18 +19,21 @@ #endif // __WXWINCE__ #include "wx/msw/private.h" -// we need to determine whether we have the declarations for the function in -// debughlp.dll version 5.81 (at least) and we check for DBHLPAPI to test this -// -// reasons: -// - VC6 version of imagehlp.h doesn't define it -// - VC7 one does -// - testing for compiler version doesn't work as you can install and use -// the new SDK headers with VC6 -// -// in any case, the user may override by defining wxUSE_DBGHELP himself +// All known versions of imagehlp.h define API_VERSION_NUMBER but it's not +// documented, so deal with the possibility that it's not defined just in case. +#ifndef API_VERSION_NUMBER + #define API_VERSION_NUMBER 0 +#endif + +// wxUSE_DBGHELP is a bit special as it is not defined in wx/setup.h and we try +// to auto-detect whether we should be using debug help API or not ourselves +// below. However if the auto-detection fails, you can always predefine it as 0 +// to avoid even trying. #ifndef wxUSE_DBGHELP - #ifdef DBHLPAPI + // The version of imagehlp.h from VC6 (7) is too old and is missing some + // required symbols while the version from VC7 (9) is good enough. As we + // don't know anything about version 8, don't use it unless we can test it. + #if API_VERSION_NUMBER >= 9 #define wxUSE_DBGHELP 1 #else #define wxUSE_DBGHELP 0 diff --git a/Externals/wxWidgets3/include/wx/msw/dialog.h b/Externals/wxWidgets3/include/wx/msw/dialog.h index ad192925e1..5e6157426a 100644 --- a/Externals/wxWidgets3/include/wx/msw/dialog.h +++ b/Externals/wxWidgets3/include/wx/msw/dialog.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dialog.h 70511 2012-02-05 14:18:22Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/dib.h b/Externals/wxWidgets3/include/wx/msw/dib.h index f996d0de70..28663c35fa 100644 --- a/Externals/wxWidgets3/include/wx/msw/dib.h +++ b/Externals/wxWidgets3/include/wx/msw/dib.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.03.03 (replaces the old file with the same name) -// RCS-ID: $Id: dib.h 65959 2010-10-30 23:50:50Z VZ $ // Copyright: (c) 1997-2003 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,13 +11,16 @@ #ifndef _WX_MSW_DIB_H_ #define _WX_MSW_DIB_H_ -class WXDLLIMPEXP_FWD_CORE wxBitmap; class WXDLLIMPEXP_FWD_CORE wxPalette; #include "wx/msw/private.h" #if wxUSE_WXDIB +#ifdef __WXMSW__ + #include "wx/bitmap.h" +#endif // __WXMSW__ + // ---------------------------------------------------------------------------- // wxDIB: represents a DIB section // ---------------------------------------------------------------------------- @@ -37,9 +39,11 @@ public: wxDIB(int width, int height, int depth) { Init(); (void)Create(width, height, depth); } +#ifdef __WXMSW__ // create a DIB from the DDB wxDIB(const wxBitmap& bmp) { Init(); (void)Create(bmp); } +#endif // __WXMSW__ // create a DIB from the Windows DDB wxDIB(HBITMAP hbmp) @@ -53,7 +57,9 @@ public: // same as the corresponding ctors but with return value bool Create(int width, int height, int depth); +#ifdef __WXMSW__ bool Create(const wxBitmap& bmp) { return Create(GetHbitmapOf(bmp)); } +#endif bool Create(HBITMAP hbmp); bool Load(const wxString& filename); diff --git a/Externals/wxWidgets3/include/wx/msw/dirdlg.h b/Externals/wxWidgets3/include/wx/msw/dirdlg.h index 5e570c2274..b6939581ee 100644 --- a/Externals/wxWidgets3/include/wx/msw/dirdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/dirdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dirdlg.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,6 +27,11 @@ public: virtual int ShowModal(); private: + // The real implementations of ShowModal(), used for Windows versions + // before and since Vista. + int ShowSHBrowseForFolder(WXHWND owner); + int ShowIFileDialog(WXHWND owner); + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDirDialog) }; diff --git a/Externals/wxWidgets3/include/wx/msw/dragimag.h b/Externals/wxWidgets3/include/wx/msw/dragimag.h index 5118833235..e08723511a 100644 --- a/Externals/wxWidgets3/include/wx/msw/dragimag.h +++ b/Externals/wxWidgets3/include/wx/msw/dragimag.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: // Created: 08/04/99 -// RCS-ID: $Id: dragimag.h 70584 2012-02-15 00:35:25Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/enhmeta.h b/Externals/wxWidgets3/include/wx/msw/enhmeta.h index e1168ec707..3951bd7f5a 100644 --- a/Externals/wxWidgets3/include/wx/msw/enhmeta.h +++ b/Externals/wxWidgets3/include/wx/msw/enhmeta.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 13.01.00 -// RCS-ID: $Id: enhmeta.h 68317 2011-07-21 13:49:59Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/evtloop.h b/Externals/wxWidgets3/include/wx/msw/evtloop.h index 2d9b2e3e12..dee2c03db3 100644 --- a/Externals/wxWidgets3/include/wx/msw/evtloop.h +++ b/Externals/wxWidgets3/include/wx/msw/evtloop.h @@ -1,10 +1,9 @@ /////////////////////////////////////////////////////////////////////////////// // Name: wx/msw/evtloop.h -// Purpose: wxEventLoop class for MSW +// Purpose: wxEventLoop class for wxMSW port // Author: Vadim Zeitlin // Modified by: // Created: 2004-07-31 -// RCS-ID: $Id: evtloop.h 59161 2009-02-26 14:15:20Z VZ $ // Copyright: (c) 2003-2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -12,36 +11,15 @@ #ifndef _WX_MSW_EVTLOOP_H_ #define _WX_MSW_EVTLOOP_H_ -#if wxUSE_GUI #include "wx/dynarray.h" #include "wx/msw/wrapwin.h" #include "wx/window.h" -#endif +#include "wx/msw/evtloopconsole.h" // for wxMSWEventLoopBase // ---------------------------------------------------------------------------- // wxEventLoop // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxMSWEventLoopBase : public wxEventLoopManual -{ -public: - wxMSWEventLoopBase(); - - // implement base class pure virtuals - virtual bool Pending() const; - -protected: - // get the next message from queue and return true or return false if we - // got WM_QUIT or an error occurred - bool GetNextMessage(WXMSG *msg); - - // same as above but with a timeout and return value can be -1 meaning that - // time out expired in addition to - int GetNextMessageTimeout(WXMSG *msg, unsigned long timeout); -}; - -#if wxUSE_GUI - WX_DECLARE_EXPORTED_OBJARRAY(MSG, wxMSGArray); class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxMSWEventLoopBase @@ -93,27 +71,4 @@ private: static wxWindowMSW *ms_winCritical; }; -#else // !wxUSE_GUI - -#if wxUSE_CONSOLE_EVENTLOOP - -class WXDLLIMPEXP_BASE wxConsoleEventLoop : public wxMSWEventLoopBase -{ -public: - wxConsoleEventLoop() { } - - // override/implement base class virtuals - virtual bool Dispatch(); - virtual int DispatchTimeout(unsigned long timeout); - virtual void WakeUp(); - virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; } - - // MSW-specific function to process a single message - virtual void ProcessMessage(WXMSG *msg); -}; - -#endif // wxUSE_CONSOLE_EVENTLOOP - -#endif // wxUSE_GUI/!wxUSE_GUI - #endif // _WX_MSW_EVTLOOP_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/evtloopconsole.h b/Externals/wxWidgets3/include/wx/msw/evtloopconsole.h new file mode 100644 index 0000000000..36da6f640a --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/evtloopconsole.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/evtloopconsole.h +// Purpose: wxConsoleEventLoop class for Windows +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-07-31 +// Copyright: (c) 2003-2004 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_EVTLOOPCONSOLE_H_ +#define _WX_MSW_EVTLOOPCONSOLE_H_ + +class WXDLLIMPEXP_BASE wxMSWEventLoopBase : public wxEventLoopManual +{ +public: + wxMSWEventLoopBase(); + + // implement base class pure virtuals + virtual bool Pending() const; + +protected: + // get the next message from queue and return true or return false if we + // got WM_QUIT or an error occurred + bool GetNextMessage(WXMSG *msg); + + // same as above but with a timeout and return value can be -1 meaning that + // time out expired in addition to + int GetNextMessageTimeout(WXMSG *msg, unsigned long timeout); +}; + +#if wxUSE_CONSOLE_EVENTLOOP + +class WXDLLIMPEXP_BASE wxConsoleEventLoop : public wxMSWEventLoopBase +{ +public: + wxConsoleEventLoop() { } + + // override/implement base class virtuals + virtual bool Dispatch(); + virtual int DispatchTimeout(unsigned long timeout); + virtual void WakeUp(); + virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; } + + // Windows-specific function to process a single message + virtual void ProcessMessage(WXMSG *msg); +}; + +#endif // wxUSE_CONSOLE_EVENTLOOP + +#endif // _WX_MSW_EVTLOOPCONSOLE_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/fdrepdlg.h b/Externals/wxWidgets3/include/wx/msw/fdrepdlg.h index 7b86e7f014..af4de0d207 100644 --- a/Externals/wxWidgets3/include/wx/msw/fdrepdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/fdrepdlg.h @@ -4,7 +4,6 @@ // Author: Markus Greither // Modified by: 31.07.01: VZ: integrated into wxWidgets // Created: 23/03/2001 -// RCS-ID: $Id: fdrepdlg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Markus Greither // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/filedlg.h b/Externals/wxWidgets3/include/wx/msw/filedlg.h index 54a5c6c5c4..a1958bace7 100644 --- a/Externals/wxWidgets3/include/wx/msw/filedlg.h +++ b/Externals/wxWidgets3/include/wx/msw/filedlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: filedlg.h 62722 2009-11-26 16:17:00Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -44,6 +43,9 @@ public: // called from the hook procedure on CDN_INITDONE reception virtual void MSWOnInitDone(WXHWND hDlg); + // called from the hook procedure on CDN_SELCHANGE. + void MSWOnSelChange(WXHWND hDlg); + protected: #if !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) diff --git a/Externals/wxWidgets3/include/wx/msw/font.h b/Externals/wxWidgets3/include/wx/msw/font.h index 8c29e0e6dd..275c6d9962 100644 --- a/Externals/wxWidgets3/include/wx/msw/font.h +++ b/Externals/wxWidgets3/include/wx/msw/font.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: font.h 70446 2012-01-23 11:28:28Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -24,6 +23,8 @@ public: // ctors and such wxFont() { } + wxFont(const wxFontInfo& info); + #if FUTURE_WXWIN_COMPATIBILITY_3_0 wxFont(int size, int family, @@ -91,12 +92,6 @@ public: Create(info, hFont); } - wxFont(int pointSize, - wxFontFamily family, - int flags = wxFONTFLAG_DEFAULT, - const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT); - wxFont(const wxString& fontDesc); diff --git a/Externals/wxWidgets3/include/wx/msw/fontdlg.h b/Externals/wxWidgets3/include/wx/msw/fontdlg.h index 69ebb06f6d..ea7e7ef7e8 100644 --- a/Externals/wxWidgets3/include/wx/msw/fontdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/fontdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: fontdlg.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/frame.h b/Externals/wxWidgets3/include/wx/msw/frame.h index 7483e1c992..54ad3beec4 100644 --- a/Externals/wxWidgets3/include/wx/msw/frame.h +++ b/Externals/wxWidgets3/include/wx/msw/frame.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: frame.h 70511 2012-02-05 14:18:22Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -77,7 +76,6 @@ public: // event handlers bool HandleSize(int x, int y, WXUINT flag); bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); - bool HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu); // tooltip management #if wxUSE_TOOLTIPS @@ -105,6 +103,9 @@ public: // get the currently active menu: this is the same as the frame menu for // normal frames but is overridden by wxMDIParentFrame virtual WXHMENU MSWGetActiveMenu() const { return m_hMenu; } + + // Look up the menu in the menu bar. + virtual wxMenu* MSWFindMenuFromHMENU(WXHMENU hMenu); #endif // wxUSE_MENUS protected: @@ -131,18 +132,6 @@ protected: // wxMDIChildFrame bool MSWDoTranslateMessage(wxFrame *frame, WXMSG *msg); -#if wxUSE_MENUS - // handle WM_EXITMENULOOP message for Win95 only - bool HandleExitMenuLoop(WXWORD isPopup); - - // handle WM_(UN)INITMENUPOPUP message to generate wxEVT_MENU_OPEN/CLOSE - bool HandleMenuPopup(wxEventType evtType, WXHMENU hMenu); - - // Command part of HandleMenuPopup() and HandleExitMenuLoop(). - bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup); -#endif // wxUSE_MENUS - - virtual bool IsMDIChild() const { return false; } // get default (wxWidgets) icon for the frame diff --git a/Externals/wxWidgets3/include/wx/msw/fswatcher.h b/Externals/wxWidgets3/include/wx/msw/fswatcher.h index ea7ca41379..b73ee66188 100644 --- a/Externals/wxWidgets3/include/wx/msw/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/msw/fswatcher.h @@ -3,7 +3,6 @@ // Purpose: wxMSWFileSystemWatcher // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher.h 67693 2011-05-03 23:31:39Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/gauge.h b/Externals/wxWidgets3/include/wx/msw/gauge.h index a8632310c2..ac820e99b7 100644 --- a/Externals/wxWidgets3/include/wx/msw/gauge.h +++ b/Externals/wxWidgets3/include/wx/msw/gauge.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: gauge.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/gccpriv.h b/Externals/wxWidgets3/include/wx/msw/gccpriv.h index db4c72a84d..31453015b2 100644 --- a/Externals/wxWidgets3/include/wx/msw/gccpriv.h +++ b/Externals/wxWidgets3/include/wx/msw/gccpriv.h @@ -4,7 +4,6 @@ Author: Vadim Zeitlin Modified by: Created: - RCS-ID: $Id: gccpriv.h 36155 2005-11-10 16:16:05Z ABX $ Copyright: (c) Vadim Zeitlin Licence: wxWindows Licence */ @@ -74,15 +73,6 @@ #define __CYGWIN10__ #endif -/* Check for Mingw runtime version: */ -#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION) - #define wxCHECK_MINGW32_VERSION( major, minor ) \ - ( ( ( __MINGW32_MAJOR_VERSION > (major) ) \ - || ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) ) -#else - #define wxCHECK_MINGW32_VERSION( major, minor ) (0) -#endif - /* Mingw runtime 1.0-20010604 has some missing _tXXXX functions, so let's define them ourselves: */ #if defined(__GNUWIN32__) && wxCHECK_W32API_VERSION( 1, 0 ) \ diff --git a/Externals/wxWidgets3/include/wx/msw/gdiimage.h b/Externals/wxWidgets3/include/wx/msw/gdiimage.h index ab5145938e..d085e50a4a 100644 --- a/Externals/wxWidgets3/include/wx/msw/gdiimage.h +++ b/Externals/wxWidgets3/include/wx/msw/gdiimage.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.11.99 -// RCS-ID: $Id: gdiimage.h 66374 2010-12-14 18:43:49Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/genrcdefs.h b/Externals/wxWidgets3/include/wx/msw/genrcdefs.h index ee8bb676a8..8bab95b077 100644 --- a/Externals/wxWidgets3/include/wx/msw/genrcdefs.h +++ b/Externals/wxWidgets3/include/wx/msw/genrcdefs.h @@ -2,7 +2,6 @@ * Name: wx/msw/genrcdefs.h * Purpose: Emit preprocessor symbols into rcdefs.h for resource compiler * Author: Mike Wetherell - * RCS-ID: $Id: genrcdefs.h 46936 2007-06-25 14:04:34Z VS $ * Copyright: (c) 2005 Mike Wetherell * Licence: wxWindows licence */ @@ -13,7 +12,11 @@ EMIT(#ifndef _WX_RCDEFS_H) EMIT(#define _WX_RCDEFS_H) #ifdef _MSC_FULL_VER -EMIT(#define WX_MSC_FULL_VER _MSC_FULL_VER) +#if _MSC_FULL_VER < 140040130 +EMIT(#define wxUSE_RC_MANIFEST 1) +#endif +#else +EMIT(#define wxUSE_RC_MANIFEST 1) #endif #ifdef _M_AMD64 diff --git a/Externals/wxWidgets3/include/wx/msw/glcanvas.h b/Externals/wxWidgets3/include/wx/msw/glcanvas.h index 10566677ac..52b82f42a0 100644 --- a/Externals/wxWidgets3/include/wx/msw/glcanvas.h +++ b/Externals/wxWidgets3/include/wx/msw/glcanvas.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: glcanvas.h 54202 2008-06-14 01:44:13Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/headerctrl.h b/Externals/wxWidgets3/include/wx/msw/headerctrl.h index 7ddf38241a..db702c5a19 100644 --- a/Externals/wxWidgets3/include/wx/msw/headerctrl.h +++ b/Externals/wxWidgets3/include/wx/msw/headerctrl.h @@ -3,7 +3,6 @@ // Purpose: wxMSW native wxHeaderCtrl // Author: Vadim Zeitlin // Created: 2008-12-01 -// RCS-ID: $Id: headerctrl.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -46,7 +45,14 @@ public: virtual ~wxHeaderCtrl(); - + +protected: + // override wxWindow methods which must be implemented by a new control + virtual wxSize DoGetBestSize() const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + private: // implement base class pure virtuals virtual void DoSetCount(unsigned int count); @@ -58,12 +64,6 @@ private: virtual void DoSetColumnsOrder(const wxArrayInt& order); virtual wxArrayInt DoGetColumnsOrder() const; - // override wxWindow methods which must be implemented by a new control - virtual wxSize DoGetBestSize() const; - virtual void DoSetSize(int x, int y, - int width, int height, - int sizeFlags = wxSIZE_AUTO); - // override MSW-specific methods needed for new control virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); @@ -126,6 +126,9 @@ private: // the offset of the window used to emulate scrolling it int m_scrollOffset; + // actual column we are dragging or -1 if not dragging anything + int m_colBeingDragged; + wxDECLARE_NO_COPY_CLASS(wxHeaderCtrl); }; diff --git a/Externals/wxWidgets3/include/wx/msw/helpbest.h b/Externals/wxWidgets3/include/wx/msw/helpbest.h index 88eba1dc3f..4deffa4adb 100644 --- a/Externals/wxWidgets3/include/wx/msw/helpbest.h +++ b/Externals/wxWidgets3/include/wx/msw/helpbest.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon // Modified by: // Created: 02/04/2001 -// RCS-ID: $Id: helpbest.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Mattia Barbon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/helpchm.h b/Externals/wxWidgets3/include/wx/msw/helpchm.h index d3fdc9272b..17cda8ce00 100644 --- a/Externals/wxWidgets3/include/wx/msw/helpchm.h +++ b/Externals/wxWidgets3/include/wx/msw/helpchm.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 16/04/2000 -// RCS-ID: $Id: helpchm.h 67880 2011-06-07 14:28:55Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -63,7 +62,7 @@ protected: // the first 2 HtmlHelp() parameters bool CallHtmlHelp(unsigned cmd, WXWPARAM param) { - return CallHtmlHelp(GetParentWindow(), GetValidFilename().wx_str(), + return CallHtmlHelp(GetParentWindow(), GetValidFilename().t_str(), cmd, param); } diff --git a/Externals/wxWidgets3/include/wx/msw/helpwin.h b/Externals/wxWidgets3/include/wx/msw/helpwin.h index 828d2b6b4f..7cc5545435 100644 --- a/Externals/wxWidgets3/include/wx/msw/helpwin.h +++ b/Externals/wxWidgets3/include/wx/msw/helpwin.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: helpwin.h 67882 2011-06-07 16:48:36Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/hyperlink.h b/Externals/wxWidgets3/include/wx/msw/hyperlink.h index a12bae3f9b..847695b273 100644 --- a/Externals/wxWidgets3/include/wx/msw/hyperlink.h +++ b/Externals/wxWidgets3/include/wx/msw/hyperlink.h @@ -3,7 +3,6 @@ // Purpose: Hyperlink control // Author: Rickard Westerlund // Created: 2010-08-04 -// RCS-ID: $Id: hyperlink.h 65334 2010-08-17 16:55:32Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/icon.h b/Externals/wxWidgets3/include/wx/msw/icon.h index a94556179a..4737e449a4 100644 --- a/Externals/wxWidgets3/include/wx/msw/icon.h +++ b/Externals/wxWidgets3/include/wx/msw/icon.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: icon.h 56644 2008-11-02 02:39:52Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -65,6 +64,8 @@ public: wxBitmapType type = wxICON_DEFAULT_TYPE, int desiredWidth = -1, int desiredHeight = -1); + bool CreateFromHICON(WXHICON icon); + // implementation only from now on wxIconRefData *GetIconData() const { return (wxIconRefData *)m_refData; } diff --git a/Externals/wxWidgets3/include/wx/msw/imaglist.h b/Externals/wxWidgets3/include/wx/msw/imaglist.h index e0086f91b9..3f831f1832 100644 --- a/Externals/wxWidgets3/include/wx/msw/imaglist.h +++ b/Externals/wxWidgets3/include/wx/msw/imaglist.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: imaglist.h 59036 2009-02-19 20:26:00Z RR $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/iniconf.h b/Externals/wxWidgets3/include/wx/msw/iniconf.h index e22bc7d38c..63ebd00141 100644 --- a/Externals/wxWidgets3/include/wx/msw/iniconf.h +++ b/Externals/wxWidgets3/include/wx/msw/iniconf.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 27.07.98 -// RCS-ID: $Id: iniconf.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/init.h b/Externals/wxWidgets3/include/wx/msw/init.h new file mode 100644 index 0000000000..014dedbd09 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/init.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/init.h +// Purpose: Windows-specific wxEntry() overload +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_INIT_H_ +#define _WX_MSW_INIT_H_ + +// ---------------------------------------------------------------------------- +// Windows-specific wxEntry() overload and wxIMPLEMENT_WXWIN_MAIN definition +// ---------------------------------------------------------------------------- + +// we need HINSTANCE declaration to define WinMain() +#include "wx/msw/wrapwin.h" + +#ifndef SW_SHOWNORMAL + #define SW_SHOWNORMAL 1 +#endif + +// WinMain() is always ANSI, even in Unicode build, under normal Windows +// but is always Unicode under CE +#ifdef __WXWINCE__ + typedef wchar_t *wxCmdLineArgType; +#else + typedef char *wxCmdLineArgType; +#endif + +// Windows-only overloads of wxEntry() and wxEntryStart() which take the +// parameters passed to WinMain() instead of those passed to main() +extern WXDLLIMPEXP_CORE bool + wxEntryStart(HINSTANCE hInstance, + HINSTANCE hPrevInstance = NULL, + wxCmdLineArgType pCmdLine = NULL, + int nCmdShow = SW_SHOWNORMAL); + +extern WXDLLIMPEXP_CORE int + wxEntry(HINSTANCE hInstance, + HINSTANCE hPrevInstance = NULL, + wxCmdLineArgType pCmdLine = NULL, + int nCmdShow = SW_SHOWNORMAL); + +#if defined(__BORLANDC__) && wxUSE_UNICODE + // Borland C++ has the following nonstandard behaviour: when the -WU + // command line flag is used, the linker expects to find wWinMain instead + // of WinMain. This flag causes the compiler to define _UNICODE and + // UNICODE symbols and there's no way to detect its use, so we have to + // define both WinMain and wWinMain so that wxIMPLEMENT_WXWIN_MAIN works + // for both code compiled with and without -WU. + // See http://sourceforge.net/tracker/?func=detail&atid=309863&aid=1935997&group_id=9863 + // for more details. + #define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD \ + extern "C" int WINAPI wWinMain(HINSTANCE hInstance, \ + HINSTANCE hPrevInstance, \ + wchar_t * WXUNUSED(lpCmdLine), \ + int nCmdShow) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ + \ + /* NB: wxEntry expects lpCmdLine argument to be char*, not */ \ + /* wchar_t*, but fortunately it's not used anywhere */ \ + /* and we can simply pass NULL in: */ \ + return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \ + } +#else + #define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD +#endif // defined(__BORLANDC__) && wxUSE_UNICODE + +#define wxIMPLEMENT_WXWIN_MAIN \ + extern "C" int WINAPI WinMain(HINSTANCE hInstance, \ + HINSTANCE hPrevInstance, \ + wxCmdLineArgType WXUNUSED(lpCmdLine), \ + int nCmdShow) \ + { \ + wxDISABLE_DEBUG_SUPPORT(); \ + \ + /* NB: We pass NULL in place of lpCmdLine to behave the same as */ \ + /* Borland-specific wWinMain() above. If it becomes needed */ \ + /* to pass lpCmdLine to wxEntry() here, you'll have to fix */ \ + /* wWinMain() above too. */ \ + return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \ + } \ + wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD + + +#endif // _WX_MSW_INIT_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/joystick.h b/Externals/wxWidgets3/include/wx/msw/joystick.h index eeb5d9a3d6..b3f5e57105 100644 --- a/Externals/wxWidgets3/include/wx/msw/joystick.h +++ b/Externals/wxWidgets3/include/wx/msw/joystick.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: joystick.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/libraries.h b/Externals/wxWidgets3/include/wx/msw/libraries.h index 09ff8996d9..86e47195d1 100644 --- a/Externals/wxWidgets3/include/wx/msw/libraries.h +++ b/Externals/wxWidgets3/include/wx/msw/libraries.h @@ -3,7 +3,6 @@ * Purpose: Pragmas for linking libs conditionally * Author: Michael Wetherell * Modified by: - * RCS-ID: $Id: libraries.h 37045 2006-01-21 22:50:46Z MW $ * Copyright: (c) 2005 Michael Wetherell * Licence: wxWindows licence */ diff --git a/Externals/wxWidgets3/include/wx/msw/listbox.h b/Externals/wxWidgets3/include/wx/msw/listbox.h index 77080b3664..8d8bd01a87 100644 --- a/Externals/wxWidgets3/include/wx/msw/listbox.h +++ b/Externals/wxWidgets3/include/wx/msw/listbox.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: listbox.h 64548 2010-06-10 10:40:21Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -151,8 +150,6 @@ public: virtual void OnInternalIdle(); - virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); - protected: virtual wxSize DoGetBestClientSize() const; @@ -194,10 +191,6 @@ private: // i.e. if we need to call SetHorizontalExtent() from OnInternalIdle() bool m_updateHorizontalExtent; - // flag set to true when we get a keyboard event and reset to false when we - // get a mouse one: this is used to find the correct item for the selection - // event - bool m_selectedByKeyboard; DECLARE_DYNAMIC_CLASS_NO_COPY(wxListBox) }; diff --git a/Externals/wxWidgets3/include/wx/msw/listctrl.h b/Externals/wxWidgets3/include/wx/msw/listctrl.h index ff49f754bb..e3f0a7d1df 100644 --- a/Externals/wxWidgets3/include/wx/msw/listctrl.h +++ b/Externals/wxWidgets3/include/wx/msw/listctrl.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Agron Selimaj // Created: 01/02/97 -// RCS-ID: $Id: listctrl.h 70282 2012-01-07 15:09:43Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -384,6 +383,14 @@ protected: // common part of all ctors void Init(); + // Implement constrained best size calculation. + virtual int DoGetBestClientHeight(int width) const + { return MSWGetBestViewRect(width, -1).y; } + virtual int DoGetBestClientWidth(int height) const + { return MSWGetBestViewRect(-1, height).x; } + + wxSize MSWGetBestViewRect(int x, int y) const; + // Implement base class pure virtual methods. long DoInsertColumn(long col, const wxListItem& info); @@ -431,9 +438,6 @@ protected: // return the icon for the given item and column. virtual int OnGetItemColumnImage(long item, long column) const; - // return the attribute for the item (may return NULL if none) - virtual wxListItemAttr *OnGetItemAttr(long item) const; - // return the attribute for the given item and column (may return NULL if none) virtual wxListItemAttr *OnGetItemColumnAttr(long item, long WXUNUSED(column)) const { diff --git a/Externals/wxWidgets3/include/wx/msw/mdi.h b/Externals/wxWidgets3/include/wx/msw/mdi.h index 7fc574568a..a699a3125c 100644 --- a/Externals/wxWidgets3/include/wx/msw/mdi.h +++ b/Externals/wxWidgets3/include/wx/msw/mdi.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes // Created: 01/02/97 -// RCS-ID: $Id: mdi.h 61986 2009-09-21 08:44:42Z VZ $ // Copyright: (c) 1997 Julian Smart // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence @@ -110,9 +109,6 @@ public: #endif // wxUSE_MENUS protected: - // override to pass menu/toolbar events to the active child first - virtual bool TryBefore(wxEvent& event); - #if wxUSE_MENUS_NATIVE virtual void InternalSetMenuBar(); #endif // wxUSE_MENUS_NATIVE diff --git a/Externals/wxWidgets3/include/wx/msw/menu.h b/Externals/wxWidgets3/include/wx/msw/menu.h index 53bea80f91..5f4c9f1853 100644 --- a/Externals/wxWidgets3/include/wx/msw/menu.h +++ b/Externals/wxWidgets3/include/wx/msw/menu.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Vadim Zeitlin (wxMenuItem is now in separate file) // Created: 01/02/97 -// RCS-ID: $Id: menu.h 70350 2012-01-15 13:41:17Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/menuitem.h b/Externals/wxWidgets3/include/wx/msw/menuitem.h index 1ccc75bdea..d76bd11950 100644 --- a/Externals/wxWidgets3/include/wx/msw/menuitem.h +++ b/Externals/wxWidgets3/include/wx/msw/menuitem.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 11.11.97 -// RCS-ID: $Id: menuitem.h 70801 2012-03-04 00:29:55Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/metafile.h b/Externals/wxWidgets3/include/wx/msw/metafile.h index c1d022225e..8991f58c91 100644 --- a/Externals/wxWidgets3/include/wx/msw/metafile.h +++ b/Externals/wxWidgets3/include/wx/msw/metafile.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: VZ 07.01.00: implemented wxMetaFileDataObject // Created: 01/02/97 -// RCS-ID: $Id: metafile.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/microwin.h b/Externals/wxWidgets3/include/wx/msw/microwin.h index 29940abfaa..bb9861ab10 100644 --- a/Externals/wxWidgets3/include/wx/msw/microwin.h +++ b/Externals/wxWidgets3/include/wx/msw/microwin.h @@ -4,7 +4,6 @@ // Purpose: Extra implementation for MicroWindows // Author: Julian Smart // Created: 2001-05-31 -// RCS-ID: $Id: microwin.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/mimetype.h b/Externals/wxWidgets3/include/wx/msw/mimetype.h index d3a7bef054..90a7013b6f 100644 --- a/Externals/wxWidgets3/include/wx/msw/mimetype.h +++ b/Externals/wxWidgets3/include/wx/msw/mimetype.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.09.98 -// RCS-ID: $Id: mimetype.h 54434 2008-06-30 11:58:41Z RR $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/minifram.h b/Externals/wxWidgets3/include/wx/msw/minifram.h index d798228293..5e12562ebc 100644 --- a/Externals/wxWidgets3/include/wx/msw/minifram.h +++ b/Externals/wxWidgets3/include/wx/msw/minifram.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: minifram.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/missing.h b/Externals/wxWidgets3/include/wx/msw/missing.h index 34184c596d..d2782ef5d5 100644 --- a/Externals/wxWidgets3/include/wx/msw/missing.h +++ b/Externals/wxWidgets3/include/wx/msw/missing.h @@ -3,7 +3,6 @@ // Purpose: Declarations for parts of the Win32 SDK that are missing in // the versions that come with some compilers // Created: 2002/04/23 -// RCS-ID: $Id: missing.h 69844 2011-11-27 19:50:53Z VZ $ // Copyright: (c) 2002 Mattia Barbon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -77,12 +76,18 @@ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif + #ifndef WM_MOUSEHWHEEL + #define WM_MOUSEHWHEEL 0x020E + #endif #ifndef WHEEL_DELTA #define WHEEL_DELTA 120 #endif #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif + #ifndef SPI_GETWHEELSCROLLCHARS + #define SPI_GETWHEELSCROLLCHARS 108 + #endif #endif // wxUSE_MOUSEWHEEL // Needed by window.cpp @@ -648,6 +653,10 @@ typedef struct #define INET_E_CODE_INSTALL_SUPPRESSED 0x800C0400L #endif +#ifndef MUI_LANGUAGE_NAME +#define MUI_LANGUAGE_NAME 0x8 +#endif + //We need to check if we are using MinGW or mingw-w64 as their //definitions are different diff --git a/Externals/wxWidgets3/include/wx/msw/msgdlg.h b/Externals/wxWidgets3/include/wx/msw/msgdlg.h index 68358de1c1..3562a362c3 100644 --- a/Externals/wxWidgets3/include/wx/msw/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/msgdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: msgdlg.h 66237 2010-11-22 12:49:07Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,6 +26,8 @@ public: virtual int ShowModal(); + virtual long GetEffectiveIcon() const; + // implementation-specific // return the font used for the text in the message box diff --git a/Externals/wxWidgets3/include/wx/msw/mslu.h b/Externals/wxWidgets3/include/wx/msw/mslu.h index eccf13a26d..d8b9441b38 100644 --- a/Externals/wxWidgets3/include/wx/msw/mslu.h +++ b/Externals/wxWidgets3/include/wx/msw/mslu.h @@ -5,7 +5,6 @@ // Modified by: Vadim Zeitlin to move out various functions to other files // to fix header inter-dependencies // Created: 2002/02/17 -// RCS-ID: $Id: mslu.h 42462 2006-10-26 19:06:51Z VZ $ // Copyright: (c) 2002 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/msvcrt.h b/Externals/wxWidgets3/include/wx/msw/msvcrt.h index 317c41b24c..692f19ef35 100644 --- a/Externals/wxWidgets3/include/wx/msw/msvcrt.h +++ b/Externals/wxWidgets3/include/wx/msw/msvcrt.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 31.01.1999 -// RCS-ID: $Id: msvcrt.h 59725 2009-03-22 12:53:48Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/nonownedwnd.h b/Externals/wxWidgets3/include/wx/msw/nonownedwnd.h index 789a836aea..72e3e6b072 100644 --- a/Externals/wxWidgets3/include/wx/msw/nonownedwnd.h +++ b/Externals/wxWidgets3/include/wx/msw/nonownedwnd.h @@ -3,7 +3,6 @@ // Purpose: wxNonOwnedWindow declaration for wxMSW. // Author: Vadim Zeitlin // Created: 2011-10-09 -// RCS-ID: $Id: nonownedwnd.h 69462 2011-10-18 21:56:52Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/notebook.h b/Externals/wxWidgets3/include/wx/msw/notebook.h index bfed8f9794..ceda97127a 100644 --- a/Externals/wxWidgets3/include/wx/msw/notebook.h +++ b/Externals/wxWidgets3/include/wx/msw/notebook.h @@ -3,7 +3,6 @@ // Purpose: MSW/GTK compatible notebook (a.k.a. property sheet) // Author: Robert Roebling // Modified by: Vadim Zeitlin for Windows version -// RCS-ID: $Id: notebook.h 69793 2011-11-22 13:18:45Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/notifmsg.h b/Externals/wxWidgets3/include/wx/msw/notifmsg.h index f995230bd3..b7e0e0e867 100644 --- a/Externals/wxWidgets3/include/wx/msw/notifmsg.h +++ b/Externals/wxWidgets3/include/wx/msw/notifmsg.h @@ -3,7 +3,6 @@ // Purpose: implementation of wxNotificationMessage for Windows // Author: Vadim Zeitlin // Created: 2007-12-01 -// RCS-ID: $Id: notifmsg.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -23,8 +22,9 @@ public: wxNotificationMessage() { Init(); } wxNotificationMessage(const wxString& title, const wxString& message = wxString(), - wxWindow *parent = NULL) - : wxNotificationMessageBase(title, message, parent) + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxNotificationMessageBase(title, message, parent, flags) { Init(); } diff --git a/Externals/wxWidgets3/include/wx/msw/ole/access.h b/Externals/wxWidgets3/include/wx/msw/ole/access.h index 0dd88bb4da..980943edb8 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/access.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/access.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-02-12 -// RCS-ID: $Id: access.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2003 Julian Smart // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/activex.h b/Externals/wxWidgets3/include/wx/msw/ole/activex.h index 2acd893ace..76dca3c36e 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/activex.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/activex.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 8/18/05 -// RCS-ID: $Id: activex.h 70361 2012-01-15 19:05:34Z SJL $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/automtn.h b/Externals/wxWidgets3/include/wx/msw/ole/automtn.h index 3687aab7d7..a7c5f62a6b 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/automtn.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/automtn.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 11/6/98 -// RCS-ID: $Id: automtn.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,6 +20,7 @@ typedef void WXIDISPATCH; typedef unsigned short* WXBSTR; +typedef unsigned long WXLCID; #ifdef GetObject #undef GetObject @@ -106,9 +106,21 @@ public: bool GetObject(wxAutomationObject& obj, const wxString& property, int noArgs = 0, wxVariant args[] = NULL) const; bool GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, const wxVariant **args) const; -public: + // Returns the locale identifier used in automation calls. The default is + // LOCALE_SYSTEM_DEFAULT. Objects obtained by GetObject() inherit the + // locale identifier from the one that created them. + WXLCID GetLCID() const; + + // Sets the locale identifier to be used in automation calls performed by + // this object. The default is LOCALE_SYSTEM_DEFAULT. + void SetLCID(WXLCID lcid); + +public: // public for compatibility only, don't use m_dispatchPtr directly. WXIDISPATCH* m_dispatchPtr; +private: + WXLCID m_lcid; + wxDECLARE_NO_COPY_CLASS(wxAutomationObject); }; diff --git a/Externals/wxWidgets3/include/wx/msw/ole/dataform.h b/Externals/wxWidgets3/include/wx/msw/ole/dataform.h index 45e0e5e6d0..8ad64542d2 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/dataform.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/dataform.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.10.99 (extracted from msw/ole/dataobj.h) -// RCS-ID: $Id: dataform.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/dataobj.h b/Externals/wxWidgets3/include/wx/msw/ole/dataobj.h index 4bbd1c1b36..cc1002766a 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/dataobj.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/dataobj.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 10.05.98 -// RCS-ID: $Id: dataobj.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/dataobj2.h b/Externals/wxWidgets3/include/wx/msw/ole/dataobj2.h index 34ca81437f..9b97e9fb0a 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/dataobj2.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/dataobj2.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 21.10.99 -// RCS-ID: $Id: dataobj2.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/dropsrc.h b/Externals/wxWidgets3/include/wx/msw/ole/dropsrc.h index cf8fcf4fac..1c5f692702 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/dropsrc.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/dropsrc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.03.98 -// RCS-ID: $Id: dropsrc.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/ole/droptgt.h b/Externals/wxWidgets3/include/wx/msw/ole/droptgt.h index 9f815330cb..4cb9d3907d 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/droptgt.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/droptgt.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.03.98 -// RCS-ID: $Id: droptgt.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -19,6 +18,7 @@ // ---------------------------------------------------------------------------- class wxIDropTarget; +struct wxIDropTargetHelper; struct IDataObject; // ---------------------------------------------------------------------------- @@ -60,12 +60,26 @@ public: // GetData() when it's called from inside OnData() void MSWSetDataSource(IDataObject *pIDataSource); + // These functions take care of all things necessary to support native drag + // images. + // + // {Init,End}DragImageSupport() are called during Register/Revoke, + // UpdateDragImageOnXXX() functions are called on the corresponding drop + // target events. + void MSWInitDragImageSupport(); + void MSWEndDragImageSupport(); + void MSWUpdateDragImageOnData(wxCoord x, wxCoord y, wxDragResult res); + void MSWUpdateDragImageOnDragOver(wxCoord x, wxCoord y, wxDragResult res); + void MSWUpdateDragImageOnEnter(wxCoord x, wxCoord y, wxDragResult res); + void MSWUpdateDragImageOnLeave(); + private: // helper used by IsAcceptedData() and GetData() wxDataFormat MSWGetSupportedFormat(IDataObject *pIDataSource) const; - wxIDropTarget *m_pIDropTarget; // the pointer to our COM interface - IDataObject *m_pIDataSource; // the pointer to the source data object + wxIDropTarget *m_pIDropTarget; // the pointer to our COM interface + IDataObject *m_pIDataSource; // the pointer to the source data object + wxIDropTargetHelper *m_dropTargetHelper; // the drop target helper wxDECLARE_NO_COPY_CLASS(wxDropTarget); }; diff --git a/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h b/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h index dffb3b266e..1c25d36926 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.02.1998 -// RCS-ID: $Id: oleutils.h 70162 2011-12-29 11:26:05Z SN $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -50,7 +49,7 @@ inline bool wxOleInitialize() // needs non-default mode. if ( hr != RPC_E_CHANGED_MODE && FAILED(hr) ) { - wxLogError(_("Cannot initialize OLE")); + wxLogError(wxGetTranslation("Cannot initialize OLE")); return false; } @@ -192,7 +191,7 @@ private: // VZ: I don't know it's not done for compilers other than VC++ but I leave it // as is. Please note, though, that tracing OLE interface calls may be // incredibly useful when debugging OLE programs. -#if defined(__WXDEBUG__) && ( ( defined(__VISUALC__) && (__VISUALC__ >= 1000) ) || defined(__MWERKS__) ) +#if defined(__WXDEBUG__) && (( defined(__VISUALC__) && (__VISUALC__ >= 1000) )) // ---------------------------------------------------------------------------- // All OLE specific log functions have DebugTrace level (as LogTrace) // ---------------------------------------------------------------------------- @@ -237,6 +236,87 @@ private: // Convert variants class WXDLLIMPEXP_FWD_BASE wxVariant; +// wrapper for CURRENCY type used in VARIANT (VARIANT.vt == VT_CY) +class WXDLLIMPEXP_CORE wxVariantDataCurrency : public wxVariantData +{ +public: + wxVariantDataCurrency() { VarCyFromR8(0.0, &m_value); } + wxVariantDataCurrency(CURRENCY value) { m_value = value; } + + CURRENCY GetValue() const { return m_value; } + void SetValue(CURRENCY value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; + +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; + + wxVariantData* Clone() const { return new wxVariantDataCurrency(m_value); } + virtual wxString GetType() const { return wxS("currency"); } + + DECLARE_WXANY_CONVERSION() + +private: + CURRENCY m_value; +}; + + +// wrapper for SCODE type used in VARIANT (VARIANT.vt == VT_ERROR) +class WXDLLIMPEXP_CORE wxVariantDataErrorCode : public wxVariantData +{ +public: + wxVariantDataErrorCode(SCODE value = S_OK) { m_value = value; } + + SCODE GetValue() const { return m_value; } + void SetValue(SCODE value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; + +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; + + wxVariantData* Clone() const { return new wxVariantDataErrorCode(m_value); } + virtual wxString GetType() const { return wxS("errorcode"); } + + DECLARE_WXANY_CONVERSION() + +private: + SCODE m_value; +}; + +// wrapper for SAFEARRAY, used for passing multidimensional arrays in wxVariant +class WXDLLIMPEXP_CORE wxVariantDataSafeArray : public wxVariantData +{ +public: + wxEXPLICIT wxVariantDataSafeArray(SAFEARRAY* value = NULL) + { + m_value = value; + } + + SAFEARRAY* GetValue() const { return m_value; } + void SetValue(SAFEARRAY* value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; + +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; + + wxVariantData* Clone() const { return new wxVariantDataSafeArray(m_value); } + virtual wxString GetType() const { return wxS("safearray"); } + + DECLARE_WXANY_CONVERSION() + +private: + SAFEARRAY* m_value; +}; + + WXDLLIMPEXP_CORE bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant); WXDLLIMPEXP_CORE bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant); #endif // wxUSE_VARIANT diff --git a/Externals/wxWidgets3/include/wx/msw/ole/safearray.h b/Externals/wxWidgets3/include/wx/msw/ole/safearray.h new file mode 100644 index 0000000000..04dc335fdc --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/ole/safearray.h @@ -0,0 +1,394 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/ole/safearray.h +// Purpose: Helpers for working with OLE SAFEARRAYs. +// Author: PB +// Created: 2012-09-23 +// Copyright: (c) 2012 wxWidgets development team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSW_OLE_SAFEARRAY_H_ +#define _MSW_OLE_SAFEARRAY_H_ + +#include "wx/msw/ole/oleutils.h" + +#if wxUSE_OLE && wxUSE_VARIANT + +/* + wxSafeArray is wxWidgets wrapper for working with MS Windows SAFEARRAYs. + It also has convenience functions for converting between SAFEARRAY + and wxVariant with list type or wxArrayString. +*/ + +// The base class with type-independent methods. It exists solely in order to +// reduce the template bloat. +class WXDLLIMPEXP_CORE wxSafeArrayBase +{ +public: + // If owns a SAFEARRAY, it's unlocked and destroyed. + virtual ~wxSafeArrayBase() { Destroy(); } + + // Unlocks and destroys the owned SAFEARRAY. + void Destroy(); + + // Unlocks the owned SAFEARRAY, returns it and gives up its ownership. + SAFEARRAY* Detach(); + + // Returns true if has a valid SAFEARRAY. + bool HasArray() const { return m_array != NULL; } + + // Returns the number of dimensions. + size_t GetDim() const; + + // Returns lower bound for dimension dim in bound. Dimensions start at 1. + bool GetLBound(size_t dim, long& bound) const; + + // Returns upper bound for dimension dim in bound. Dimensions start at 1. + bool GetUBound(size_t dim, long& bound) const; + + // Returns element count for dimension dim. Dimensions start at 1. + size_t GetCount(size_t dim) const; + +protected: + // Default constructor, protected so the class can't be used on its own, + // it's only used as a base class of wxSafeArray<>. + wxSafeArrayBase() + { + m_array = NULL; + } + + bool Lock(); + bool Unlock(); + + SAFEARRAY* m_array; +}; + +// wxSafeArrayConvertor<> must be specialized for the type in order to allow +// using it with wxSafeArray<>. +// +// We specialize it below for the standard types. +template +struct wxSafeArrayConvertor {}; + +/** + Macro for specializing wxSafeArrayConvertor for simple types. + + The template parameters are: + - externType: basic C data type, e.g. wxFloat64 or wxInt32 + - varType: corresponding VARIANT type constant, e.g. VT_R8 or VT_I4. +*/ +#define wxSPECIALIZE_WXSAFEARRAY_CONVERTOR_SIMPLE(externType, varType) \ +template <> \ +struct wxSafeArrayConvertor \ +{ \ + typedef externType externT; \ + typedef externT internT; \ + static bool ToArray(const externT& from, internT& to) \ + { \ + to = from; \ + return true; \ + } \ + static bool FromArray(const internT& from, externT& to) \ + { \ + to = from; \ + return true; \ + } \ +} + +wxSPECIALIZE_WXSAFEARRAY_CONVERTOR_SIMPLE(wxInt16, VT_I2); +wxSPECIALIZE_WXSAFEARRAY_CONVERTOR_SIMPLE(wxInt32, VT_I4); +wxSPECIALIZE_WXSAFEARRAY_CONVERTOR_SIMPLE(wxFloat32, VT_R4); +wxSPECIALIZE_WXSAFEARRAY_CONVERTOR_SIMPLE(wxFloat64, VT_R8); + +// Specialization for VT_BSTR using wxString. +template <> +struct wxSafeArrayConvertor +{ + typedef wxString externT; + typedef BSTR internT; + + static bool ToArray(const wxString& from, BSTR& to) + { + BSTR bstr = wxConvertStringToOle(from); + + if ( !bstr && !from.empty() ) + { + // BSTR can be NULL for empty strings but if the string was + // not empty, it means we failed to allocate memory for it. + return false; + } + to = bstr; + return true; + } + + static bool FromArray(const BSTR from, wxString& to) + { + to = wxConvertStringFromOle(from); + return true; + } +}; + +// Specialization for VT_VARIANT using wxVariant. +template <> +struct wxSafeArrayConvertor +{ + typedef wxVariant externT; + typedef VARIANT internT; + + static bool ToArray(const wxVariant& from, VARIANT& to) + { + return wxConvertVariantToOle(from, to); + } + + static bool FromArray(const VARIANT& from, wxVariant& to) + { + return wxConvertOleToVariant(from, to); + } +}; + + +template +class wxSafeArray : public wxSafeArrayBase +{ +public: + typedef wxSafeArrayConvertor Convertor; + typedef typename Convertor::internT internT; + typedef typename Convertor::externT externT; + + // Default constructor. + wxSafeArray() + { + m_array = NULL; + } + + // Creates and locks a zero-based one-dimensional SAFEARRAY with the given + // number of elements. + bool Create(size_t count) + { + SAFEARRAYBOUND bound; + + bound.lLbound = 0; + bound.cElements = count; + return Create(&bound, 1); + } + + // Creates and locks a SAFEARRAY. See SafeArrayCreate() in MSDN + // documentation for more information. + bool Create(SAFEARRAYBOUND* bound, size_t dimensions) + { + wxCHECK_MSG( !m_array, false, wxS("Can't be created twice") ); + + m_array = SafeArrayCreate(varType, dimensions, bound); + if ( !m_array ) + return false; + + return Lock(); + } + + /** + Creates a 0-based one-dimensional SAFEARRAY from wxVariant with the + list type. + + Can be called only for wxSafeArray. + */ + bool CreateFromListVariant(const wxVariant& variant) + { + wxCHECK(varType == VT_VARIANT, false); + wxCHECK(variant.GetType() == wxS("list"), false); + + if ( !Create(variant.GetCount()) ) + return false; + + VARIANT* data = static_cast(m_array->pvData); + + for ( size_t i = 0; i < variant.GetCount(); i++) + { + if ( !Convertor::ToArray(variant[i], data[i]) ) + return false; + } + return true; + } + + /** + Creates a 0-based one-dimensional SAFEARRAY from wxArrayString. + + Can be called only for wxSafeArray. + */ + bool CreateFromArrayString(const wxArrayString& strings) + { + wxCHECK(varType == VT_BSTR, false); + + if ( !Create(strings.size()) ) + return false; + + BSTR* data = static_cast(m_array->pvData); + + for ( size_t i = 0; i < strings.size(); i++ ) + { + if ( !Convertor::ToArray(strings[i], data[i]) ) + return false; + } + return true; + } + + /** + Attaches and locks an existing SAFEARRAY. + The array must have the same VARTYPE as this wxSafeArray was + instantiated with. + */ + bool Attach(SAFEARRAY* array) + { + wxCHECK_MSG(!m_array && array, false, + wxS("Can only attach a valid array to an uninitialized one") ); + + VARTYPE vt; + HRESULT hr = SafeArrayGetVartype(array, &vt); + if ( FAILED(hr) ) + { + wxLogApiError(wxS("SafeArrayGetVarType()"), hr); + return false; + } + + wxCHECK_MSG(vt == varType, false, + wxS("Attaching array of invalid type")); + + m_array = array; + return Lock(); + } + + /** + Indices have the same row-column order as rgIndices in + SafeArrayPutElement(), i.e. they follow BASIC rules, NOT C ones. + */ + bool SetElement(long* indices, const externT& element) + { + wxCHECK_MSG( m_array, false, wxS("Uninitialized array") ); + wxCHECK_MSG( indices, false, wxS("Invalid index") ); + + internT* data; + + if ( FAILED( SafeArrayPtrOfIndex(m_array, indices, (void**)&data) ) ) + return false; + + return Convertor::ToArray(element, *data); + } + + /** + Indices have the same row-column order as rgIndices in + SafeArrayPutElement(), i.e. they follow BASIC rules, NOT C ones. + */ + bool GetElement(long* indices, externT& element) const + { + wxCHECK_MSG( m_array, false, wxS("Uninitialized array") ); + wxCHECK_MSG( indices, false, wxS("Invalid index") ); + + internT* data; + + if ( FAILED( SafeArrayPtrOfIndex(m_array, indices, (void**)&data) ) ) + return false; + + return Convertor::FromArray(*data, element); + } + + /** + Converts the array to a wxVariant with the list type, regardless of the + underlying SAFEARRAY type. + + If the array is multidimensional, it is flattened using the alghoritm + originally employed in wxConvertOleToVariant(). + */ + bool ConvertToVariant(wxVariant& variant) const + { + wxCHECK_MSG( m_array, false, wxS("Uninitialized array") ); + + size_t dims = m_array->cDims; + size_t count = 1; + + for ( size_t i = 0; i < dims; i++ ) + count *= m_array->rgsabound[i].cElements; + + const internT* data = static_cast(m_array->pvData); + externT element; + + variant.ClearList(); + for ( size_t i1 = 0; i1 < count; i1++ ) + { + if ( !Convertor::FromArray(data[i1], element) ) + { + variant.ClearList(); + return false; + } + variant.Append(element); + } + return true; + } + + /** + Converts an array to an ArrayString. + + Can be called only for wxSafeArray. If the array is + multidimensional, it is flattened using the alghoritm originally + employed in wxConvertOleToVariant(). + */ + bool ConvertToArrayString(wxArrayString& strings) const + { + wxCHECK_MSG( m_array, false, wxS("Uninitialized array") ); + wxCHECK(varType == VT_BSTR, false); + + size_t dims = m_array->cDims; + size_t count = 1; + + for ( size_t i = 0; i < dims; i++ ) + count *= m_array->rgsabound[i].cElements; + + const BSTR* data = static_cast(m_array->pvData); + wxString element; + + strings.clear(); + strings.reserve(count); + for ( size_t i1 = 0; i1 < count; i1++ ) + { + if ( !Convertor::FromArray(data[i1], element) ) + { + strings.clear(); + return false; + } + strings.push_back(element); + } + return true; + } + + static bool ConvertToVariant(SAFEARRAY* psa, wxVariant& variant) + { + wxSafeArray sa; + bool result = false; + + if ( sa.Attach(psa) ) + result = sa.ConvertToVariant(variant); + + if ( sa.HasArray() ) + sa.Detach(); + + return result; + } + + static bool ConvertToArrayString(SAFEARRAY* psa, wxArrayString& strings) + { + wxSafeArray sa; + bool result = false; + + if ( sa.Attach(psa) ) + result = sa.ConvertToArrayString(strings); + + if ( sa.HasArray() ) + sa.Detach(); + + return result; + } + + wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxSafeArray, varType); +}; + +#endif // wxUSE_OLE && wxUSE_VARIANT + +#endif // _MSW_OLE_SAFEARRAY_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/ole/uuid.h b/Externals/wxWidgets3/include/wx/msw/ole/uuid.h index c1753bb5ee..2408450611 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/uuid.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/uuid.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 11.07.97 -// RCS-ID: $Id: uuid.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence // diff --git a/Externals/wxWidgets3/include/wx/msw/ownerdrw.h b/Externals/wxWidgets3/include/wx/msw/ownerdrw.h index a8a67ca96f..789a7f2d77 100644 --- a/Externals/wxWidgets3/include/wx/msw/ownerdrw.h +++ b/Externals/wxWidgets3/include/wx/msw/ownerdrw.h @@ -4,7 +4,6 @@ // Author: Marcin Malich // Modified by: // Created: 2009-09-22 -// RCS-ID: $Id: ownerdrw.h 63220 2010-01-23 13:21:12Z VZ $ // Copyright: (c) 2009 Marcin Malich // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/palette.h b/Externals/wxWidgets3/include/wx/msw/palette.h index 35560e6012..78477b4320 100644 --- a/Externals/wxWidgets3/include/wx/msw/palette.h +++ b/Externals/wxWidgets3/include/wx/msw/palette.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: palette.h 70040 2011-12-17 23:52:47Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/panel.h b/Externals/wxWidgets3/include/wx/msw/panel.h index 9a2ab283c1..4762bef191 100644 --- a/Externals/wxWidgets3/include/wx/msw/panel.h +++ b/Externals/wxWidgets3/include/wx/msw/panel.h @@ -3,7 +3,6 @@ // Purpose: wxMSW-specific wxPanel class. // Author: Vadim Zeitlin // Created: 2011-03-18 -// RCS-ID: $Id: panel.h 70098 2011-12-23 05:59:59Z PC $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/pen.h b/Externals/wxWidgets3/include/wx/msw/pen.h index b55df15962..cb68780b43 100644 --- a/Externals/wxWidgets3/include/wx/msw/pen.h +++ b/Externals/wxWidgets3/include/wx/msw/pen.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Vadim Zeitlin: fixed operator=(), ==(), !=() // Created: 01/02/97 -// RCS-ID: $Id: pen.h 54273 2008-06-17 17:28:26Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/popupwin.h b/Externals/wxWidgets3/include/wx/msw/popupwin.h index eb45b36d2a..d95c1dabc0 100644 --- a/Externals/wxWidgets3/include/wx/msw/popupwin.h +++ b/Externals/wxWidgets3/include/wx/msw/popupwin.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.01.01 -// RCS-ID: $Id: popupwin.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,7 @@ public: bool Create(wxWindow *parent, int flags = wxBORDER_NONE); + virtual void SetFocus(); virtual bool Show(bool show = true); // return the style to be used for the popup windows diff --git a/Externals/wxWidgets3/include/wx/msw/printdlg.h b/Externals/wxWidgets3/include/wx/msw/printdlg.h index a8362bdd06..2955b89b3c 100644 --- a/Externals/wxWidgets3/include/wx/msw/printdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/printdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: printdlg.h 70636 2012-02-20 21:55:55Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/printwin.h b/Externals/wxWidgets3/include/wx/msw/printwin.h index d594083c97..e5ef80b043 100644 --- a/Externals/wxWidgets3/include/wx/msw/printwin.h +++ b/Externals/wxWidgets3/include/wx/msw/printwin.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: printwin.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private.h b/Externals/wxWidgets3/include/wx/msw/private.h index 75f5c65382..0f966b841b 100644 --- a/Externals/wxWidgets3/include/wx/msw/private.h +++ b/Externals/wxWidgets3/include/wx/msw/private.h @@ -6,7 +6,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: private.h 69758 2011-11-14 12:51:53Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -169,9 +168,9 @@ extern LONG APIENTRY _EXPORT // This one is a macro so that it can be tested with #ifdef, it will be // undefined if it cannot be implemented for a given compiler. -// Vc++, bcc, dmc, ow, mingw, codewarrior (and rsxnt) have _get_osfhandle. -// Cygwin has get_osfhandle. Others are currently unknown, e.g. Salford, -// Intel, Visual Age. +// Vc++, bcc, dmc, ow, mingw akk have _get_osfhandle() and Cygwin has +// get_osfhandle. Others are currently unknown, e.g. Salford, Intel, Visual +// Age. #if defined(__WXWINCE__) #define wxGetOSFHandle(fd) ((HANDLE)fd) #define wxOpenOSFHandle(h, flags) ((int)wxPtrToUInt(h)) @@ -181,8 +180,7 @@ extern LONG APIENTRY _EXPORT || defined(__BORLANDC__) \ || defined(__DMC__) \ || defined(__WATCOMC__) \ - || defined(__MINGW32__) \ - || (defined(__MWERKS__) && defined(__MSL__)) + || defined(__MINGW32__) #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd)) #define wxOpenOSFHandle(h, flags) (_open_osfhandle(wxPtrToUInt(h), flags)) #define wx_fdopen _fdopen @@ -219,6 +217,21 @@ struct WinStruct : public T }; +// Macros for converting wxString to the type expected by API functions. +// +// Normally it is enough to just use wxString::t_str() which is implicitly +// convertible to LPCTSTR, but in some cases an explicit conversion is required. +// +// In such cases wxMSW_CONV_LPCTSTR() should be used. But if an API function +// takes a non-const pointer, wxMSW_CONV_LPTSTR() which casts away the +// constness (but doesn't make it possible to really modify the returned +// pointer, of course) should be used. And if a string is passed as LPARAM, use +// wxMSW_CONV_LPARAM() which does the required ugly reinterpret_cast<> too. +#define wxMSW_CONV_LPCTSTR(s) static_cast((s).t_str()) +#define wxMSW_CONV_LPTSTR(s) const_cast(wxMSW_CONV_LPCTSTR(s)) +#define wxMSW_CONV_LPARAM(s) reinterpret_cast(wxMSW_CONV_LPCTSTR(s)) + + #if wxUSE_GUI #include "wx/gdicmn.h" @@ -418,8 +431,9 @@ private: class WindowHDC { public: + WindowHDC() : m_hwnd(NULL), m_hdc(NULL) { } WindowHDC(HWND hwnd) { m_hdc = ::GetDC(m_hwnd = hwnd); } - ~WindowHDC() { ::ReleaseDC(m_hwnd, m_hdc); } + ~WindowHDC() { if ( m_hwnd && m_hdc ) { ::ReleaseDC(m_hwnd, m_hdc); } } operator HDC() const { return m_hdc; } @@ -781,7 +795,7 @@ public: { if ( IsRegistered() ) { - if ( !::UnregisterClass(m_clsname.wx_str(), wxGetInstance()) ) + if ( !::UnregisterClass(m_clsname.t_str(), wxGetInstance()) ) { wxLogLastError(wxT("UnregisterClass")); } @@ -917,7 +931,7 @@ enum wxWinVersion WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); -#if wxUSE_GUI +#if wxUSE_GUI && defined(__WXMSW__) // cursor stuff extern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cpp @@ -1054,6 +1068,6 @@ inline void *wxSetWindowUserData(HWND hwnd, void *data) #endif // __WIN64__/__WIN32__ -#endif // wxUSE_GUI +#endif // wxUSE_GUI && __WXMSW__ #endif // _WX_PRIVATE_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/private/button.h b/Externals/wxWidgets3/include/wx/msw/private/button.h index c45bcf167a..9f605c66a3 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/button.h +++ b/Externals/wxWidgets3/include/wx/msw/private/button.h @@ -3,7 +3,6 @@ // Purpose: helper functions used with native BUTTON control // Author: Vadim Zeitlin // Created: 2008-06-07 -// RCS-ID: $Id: button.h 68922 2011-08-27 14:11:28Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/comptr.h b/Externals/wxWidgets3/include/wx/msw/private/comptr.h new file mode 100644 index 0000000000..194cf54f90 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/private/comptr.h @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/private/comptr.h +// Purpose: Smart pointer for COM interfaces. +// Author: PB +// Created: 2012-04-16 +// Copyright: (c) 2012 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_PRIVATE_COMPTR_H_ +#define _WX_MSW_PRIVATE_COMPTR_H_ + +// ---------------------------------------------------------------------------- +// wxCOMPtr: A minimalistic smart pointer for use with COM interfaces. +// ---------------------------------------------------------------------------- + +template +class wxCOMPtr +{ +public: + typedef T element_type; + + wxCOMPtr() + : m_ptr(NULL) + { + } + + wxEXPLICIT wxCOMPtr(T* ptr) + : m_ptr(ptr) + { + if ( m_ptr ) + m_ptr->AddRef(); + } + + wxCOMPtr(const wxCOMPtr& ptr) + : m_ptr(ptr.get()) + { + if ( m_ptr ) + m_ptr->AddRef(); + } + + ~wxCOMPtr() + { + if ( m_ptr ) + m_ptr->Release(); + } + + void reset(T* ptr = NULL) + { + if ( m_ptr != ptr) + { + if ( ptr ) + ptr->AddRef(); + if ( m_ptr ) + m_ptr->Release(); + m_ptr = ptr; + } + } + + wxCOMPtr& operator=(const wxCOMPtr& ptr) + { + reset(ptr.get()); + return *this; + } + + wxCOMPtr& operator=(T* ptr) + { + reset(ptr); + return *this; + } + + operator T*() const + { + return m_ptr; + } + + T& operator*() const + { + return *m_ptr; + } + + T* operator->() const + { + return m_ptr; + } + + // It would be better to forbid direct access completely but we do need + // for QueryInterface() and similar functions, so provide it but it can + // only be used to initialize the pointer, not to modify an existing one. + T** operator&() + { + wxASSERT_MSG(!m_ptr, + wxS("Can't get direct access to initialized pointer")); + + return &m_ptr; + } + + T* get() const + { + return m_ptr; + } + + bool operator<(T* ptr) const + { + return get() < ptr; + } + +private: + T* m_ptr; +}; + +// Define a helper for the macro below: we just need a function taking a +// pointer and not returning anything to avoid warnings about unused return +// value of the cast in the macro itself. +namespace wxPrivate { inline void PPV_ARGS_CHECK(void*) { } } + +// Takes the interface name and a pointer to a pointer of the interface type +// and expands into the IID of this interface and the same pointer but after a +// type-safety check. +// +// This is similar to the standard IID_PPV_ARGS macro but takes the pointer +// type instead of relying on the non-standard Microsoft __uuidof(). +#define wxIID_PPV_ARGS(IType, pType) \ + IID_##IType, \ + (wxPrivate::PPV_ARGS_CHECK(static_cast(*pType)), \ + reinterpret_cast(pType)) + +#endif // _WX_MSW_PRIVATE_COMPTR_H_ + diff --git a/Externals/wxWidgets3/include/wx/msw/private/datecontrols.h b/Externals/wxWidgets3/include/wx/msw/private/datecontrols.h index 4c8324b87c..9794cfae89 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/datecontrols.h +++ b/Externals/wxWidgets3/include/wx/msw/private/datecontrols.h @@ -3,7 +3,6 @@ // Purpose: implementation helpers for wxDatePickerCtrl and wxCalendarCtrl // Author: Vadim Zeitlin // Created: 2008-04-04 -// RCS-ID: $Id: datecontrols.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/dc.h b/Externals/wxWidgets3/include/wx/msw/private/dc.h index c3efeb2537..303cd19df6 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/dc.h +++ b/Externals/wxWidgets3/include/wx/msw/private/dc.h @@ -3,7 +3,6 @@ // Purpose: private wxMSW helpers for working with HDCs // Author: Vadim Zeitlin // Created: 2009-06-16 (extracted from src/msw/dc.cpp) -// RCS-ID: $Id: dc.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/fswatcher.h b/Externals/wxWidgets3/include/wx/msw/private/fswatcher.h index f5ef3bbd38..86f91dc3d0 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/msw/private/fswatcher.h @@ -3,7 +3,6 @@ // Purpose: File system watcher impl classes // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher.h 67806 2011-05-28 19:35:13Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/hiddenwin.h b/Externals/wxWidgets3/include/wx/msw/private/hiddenwin.h index 7f592e2e2e..3b52b60983 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/hiddenwin.h +++ b/Externals/wxWidgets3/include/wx/msw/private/hiddenwin.h @@ -3,7 +3,6 @@ // Purpose: Helper for creating a hidden window used by wxMSW internally. // Author: Vadim Zeitlin // Created: 2011-09-16 -// RCS-ID: $Id: hiddenwin.h 69170 2011-09-21 15:07:32Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/keyboard.h b/Externals/wxWidgets3/include/wx/msw/private/keyboard.h index 5817e09911..002303e967 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/keyboard.h +++ b/Externals/wxWidgets3/include/wx/msw/private/keyboard.h @@ -3,7 +3,6 @@ // Purpose: Helper keyboard-related functions. // Author: Vadim Zeitlin // Created: 2010-09-09 -// RCS-ID: $Id: keyboard.h 65590 2010-09-22 13:31:41Z VZ $ // Copyright: (c) 2010 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/metrics.h b/Externals/wxWidgets3/include/wx/msw/private/metrics.h index bab56ec9eb..0e1b41deb5 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/metrics.h +++ b/Externals/wxWidgets3/include/wx/msw/private/metrics.h @@ -3,7 +3,6 @@ // Purpose: various helper functions to retrieve system metrics // Author: Vadim Zeitlin // Created: 2008-09-05 -// RCS-ID: $Id: metrics.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/msgdlg.h b/Externals/wxWidgets3/include/wx/msw/private/msgdlg.h index 9598f7fc11..20ccc4fff0 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/private/msgdlg.h @@ -3,7 +3,6 @@ // Purpose: helper functions used with native message dialog // Author: Rickard Westerlund // Created: 2010-07-12 -// RCS-ID: $Id: msgdlg.h 68537 2011-08-04 22:53:42Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/pipestream.h b/Externals/wxWidgets3/include/wx/msw/private/pipestream.h new file mode 100644 index 0000000000..ba6d032bea --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/private/pipestream.h @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/private/pipestream.h +// Purpose: MSW wxPipeInputStream and wxPipeOutputStream declarations +// Author: Vadim Zeitlin +// Created: 2013-06-08 (extracted from src/msw/utilsexc.cpp) +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_PRIVATE_PIPESTREAM_H_ +#define _WX_MSW_PRIVATE_PIPESTREAM_H_ + +class wxPipeInputStream : public wxInputStream +{ +public: + wxEXPLICIT wxPipeInputStream(HANDLE hInput); + virtual ~wxPipeInputStream(); + + // returns true if the pipe is still opened + bool IsOpened() const { return m_hInput != INVALID_HANDLE_VALUE; } + + // returns true if there is any data to be read from the pipe + virtual bool CanRead() const; + +protected: + virtual size_t OnSysRead(void *buffer, size_t len); + +protected: + HANDLE m_hInput; + + wxDECLARE_NO_COPY_CLASS(wxPipeInputStream); +}; + +class wxPipeOutputStream: public wxOutputStream +{ +public: + wxEXPLICIT wxPipeOutputStream(HANDLE hOutput); + virtual ~wxPipeOutputStream() { Close(); } + bool Close(); + +protected: + size_t OnSysWrite(const void *buffer, size_t len); + +protected: + HANDLE m_hOutput; + + wxDECLARE_NO_COPY_CLASS(wxPipeOutputStream); +}; + +#endif // _WX_MSW_PRIVATE_PIPESTREAM_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/private/sockmsw.h b/Externals/wxWidgets3/include/wx/msw/private/sockmsw.h index 92fa1b99fe..e0f550d329 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/sockmsw.h +++ b/Externals/wxWidgets3/include/wx/msw/private/sockmsw.h @@ -6,7 +6,6 @@ // Copyright: (C) 1999-1997, Guilhem Lavaux // (C) 1999-2000, Guillermo Rodriguez Garcia // (C) 2008 Vadim Zeitlin -// RCS_ID: $Id: sockmsw.h 67254 2011-03-20 00:14:35Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/private/textmeasure.h b/Externals/wxWidgets3/include/wx/msw/private/textmeasure.h new file mode 100644 index 0000000000..ee14751a5b --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/private/textmeasure.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/private/textmeasure.h +// Purpose: wxMSW-specific declaration of wxTextMeasure class +// Author: Manuel Martin +// Created: 2012-10-05 +// Copyright: (c) 1997-2012 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_PRIVATE_TEXTMEASURE_H_ +#define _WX_MSW_PRIVATE_TEXTMEASURE_H_ + +#include "wx/msw/wrapwin.h" + +// ---------------------------------------------------------------------------- +// wxTextMeasure for MSW. +// ---------------------------------------------------------------------------- + +class wxTextMeasure : public wxTextMeasureBase +{ +public: + wxEXPLICIT wxTextMeasure(const wxDC *dc, const wxFont *font = NULL) + : wxTextMeasureBase(dc, font) + { + Init(); + } + + wxEXPLICIT wxTextMeasure(const wxWindow *win, const wxFont *font = NULL) + : wxTextMeasureBase(win, font) + { + Init(); + } + +protected: + void Init(); + + virtual void BeginMeasuring(); + virtual void EndMeasuring(); + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + virtual bool DoGetPartialTextExtents(const wxString& text, + wxArrayInt& widths, + double scaleX); + + + + // We use either the HDC of the provided wxDC or an HDC created for our + // window. + HDC m_hdc; + + // If we change the font in BeginMeasuring(), we restore it to the old one + // in EndMeasuring(). + HFONT m_hfontOld; + + wxDECLARE_NO_COPY_CLASS(wxTextMeasure); +}; + +#endif // _WX_MSW_PRIVATE_TEXTMEASURE_H_ diff --git a/Externals/wxWidgets3/include/wx/msw/private/timer.h b/Externals/wxWidgets3/include/wx/msw/private/timer.h index c45ba1df7e..71ce2ceec7 100644 --- a/Externals/wxWidgets3/include/wx/msw/private/timer.h +++ b/Externals/wxWidgets3/include/wx/msw/private/timer.h @@ -3,7 +3,6 @@ // Purpose: wxTimer class // Author: Julian Smart // Created: 01/02/97 -// RCS-ID: $Id: timer.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/progdlg.h b/Externals/wxWidgets3/include/wx/msw/progdlg.h index 096c89a94d..c63a0b66f8 100644 --- a/Externals/wxWidgets3/include/wx/msw/progdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/progdlg.h @@ -3,7 +3,6 @@ // Purpose: wxProgressDialog // Author: Rickard Westerlund // Created: 2010-07-22 -// RCS-ID: $Id: progdlg.h 69041 2011-09-10 03:26:37Z RD $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/radiobox.h b/Externals/wxWidgets3/include/wx/msw/radiobox.h index 4caefafb8f..53620db9b3 100644 --- a/Externals/wxWidgets3/include/wx/msw/radiobox.h +++ b/Externals/wxWidgets3/include/wx/msw/radiobox.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: radiobox.h 70498 2012-02-02 14:26:06Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -97,6 +96,7 @@ public: // override some base class methods virtual bool Show(bool show = true); virtual bool Enable(bool enable = true); + virtual bool CanBeFocused() const; virtual void SetFocus(); virtual bool SetFont(const wxFont& font); virtual bool ContainsHWND(WXHWND hWnd) const; @@ -113,10 +113,6 @@ public: virtual bool Reparent(wxWindowBase *newParent); - // we inherit a version always returning false from wxStaticBox, override - // it to behave normally - virtual bool AcceptsFocus() const { return wxControl::AcceptsFocus(); } - // returns true if the platform should explicitly apply a theme border virtual bool CanApplyThemeBorder() const { return false; } diff --git a/Externals/wxWidgets3/include/wx/msw/radiobut.h b/Externals/wxWidgets3/include/wx/msw/radiobut.h index f7387694e4..4e9af38f70 100644 --- a/Externals/wxWidgets3/include/wx/msw/radiobut.h +++ b/Externals/wxWidgets3/include/wx/msw/radiobut.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: radiobut.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/rcdefs.h b/Externals/wxWidgets3/include/wx/msw/rcdefs.h index 7d963d966a..8b9ac716f9 100644 --- a/Externals/wxWidgets3/include/wx/msw/rcdefs.h +++ b/Externals/wxWidgets3/include/wx/msw/rcdefs.h @@ -2,7 +2,6 @@ // Name: wx/msw/rcdefs.h // Purpose: Fallback for the generated rcdefs.h under the lib directory // Author: Mike Wetherell -// RCS-ID: $Id: rcdefs.h 36133 2005-11-08 22:49:46Z MW $ // Copyright: (c) 2005 Mike Wetherell // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -10,6 +9,33 @@ #ifndef _WX_RCDEFS_H #define _WX_RCDEFS_H -#define WX_CPU_X86 +#ifdef __GNUC__ + // We must be using windres which uses gcc as its preprocessor. We do need + // to generate the manifest then as gcc doesn't do it automatically and we + // can define the architecture macro on our own as all the usual symbols + // are available (unlike with Microsoft RC.EXE which doesn't predefine + // anything useful at all). + #ifndef wxUSE_RC_MANIFEST + #define wxUSE_RC_MANIFEST 1 + #endif + + #if defined __i386__ + #ifndef WX_CPU_X86 + #define WX_CPU_X86 + #endif + #elif defined __x86_64__ + #ifndef WX_CPU_AMD64 + #define WX_CPU_AMD64 + #endif + #elif defined __ia64__ + #ifndef WX_CPU_IA64 + #define WX_CPU_IA64 + #endif + #endif +#endif + +// Don't do anything here for the other compilers, in particular don't define +// WX_CPU_X86 here as we used to do. If people define wxUSE_RC_MANIFEST, they +// must also define the architecture constant correctly. #endif diff --git a/Externals/wxWidgets3/include/wx/msw/regconf.h b/Externals/wxWidgets3/include/wx/msw/regconf.h index 1f20255aa2..ec290ec88c 100644 --- a/Externals/wxWidgets3/include/wx/msw/regconf.h +++ b/Externals/wxWidgets3/include/wx/msw/regconf.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 27.04.98 -// RCS-ID: $Id: regconf.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/region.h b/Externals/wxWidgets3/include/wx/msw/region.h index 4c34c2c4a9..aba0d536dc 100644 --- a/Externals/wxWidgets3/include/wx/msw/region.h +++ b/Externals/wxWidgets3/include/wx/msw/region.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: region.h 57915 2009-01-08 16:43:56Z FM $ // Copyright: (c) 1997-2002 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/registry.h b/Externals/wxWidgets3/include/wx/msw/registry.h index 5f7c8cc7d8..20343a540b 100644 --- a/Externals/wxWidgets3/include/wx/msw/registry.h +++ b/Externals/wxWidgets3/include/wx/msw/registry.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.04.1998 -// RCS-ID: $Id: registry.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/richmsgdlg.h b/Externals/wxWidgets3/include/wx/msw/richmsgdlg.h index fb51a75499..20c8eb72da 100644 --- a/Externals/wxWidgets3/include/wx/msw/richmsgdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/richmsgdlg.h @@ -3,7 +3,6 @@ // Purpose: wxRichMessageDialog // Author: Rickard Westerlund // Created: 2010-07-04 -// RCS-ID: $Id: richmsgdlg.h 65349 2010-08-18 22:48:41Z VZ $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/scrolbar.h b/Externals/wxWidgets3/include/wx/msw/scrolbar.h index d33150bb16..1b7c86295d 100644 --- a/Externals/wxWidgets3/include/wx/msw/scrolbar.h +++ b/Externals/wxWidgets3/include/wx/msw/scrolbar.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: scrolbar.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/seh.h b/Externals/wxWidgets3/include/wx/msw/seh.h index cf203778e1..a331570d75 100644 --- a/Externals/wxWidgets3/include/wx/msw/seh.h +++ b/Externals/wxWidgets3/include/wx/msw/seh.h @@ -3,7 +3,6 @@ // Purpose: declarations for SEH (structured exceptions handling) support // Author: Vadim Zeitlin // Created: 2006-04-26 -// RCS-ID: $Id: seh.h 60934 2009-06-06 23:27:37Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -55,11 +54,11 @@ // as division by 0 or access violation) to C++ pseudo-exceptions extern void wxSETranslator(unsigned int code, EXCEPTION_POINTERS *ep); - // up to VC 9 this warning ("calling _set_se_translator() requires /EHa") + // up to VC 11 this warning ("calling _set_se_translator() requires /EHa") // is harmless and it's easier to suppress it than use different makefiles - // for VC5 and 6 (which don't support /EHa at all) and VC7 (which does + // for VC5 and 6 (which don't support /EHa at all) and VC7+ (which does // accept it but it seems to change nothing for it anyhow) - #if __VISUALC__ < 1600 + #if __VISUALC__ < 1800 #pragma warning(disable: 4535) #endif diff --git a/Externals/wxWidgets3/include/wx/msw/setup0.h b/Externals/wxWidgets3/include/wx/msw/setup0.h index 7b0bf0b25f..f0b2e646cb 100644 --- a/Externals/wxWidgets3/include/wx/msw/setup0.h +++ b/Externals/wxWidgets3/include/wx/msw/setup0.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: setup0.h 69463 2011-10-18 21:57:02Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -151,7 +150,7 @@ // In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If // this causes problems (e.g. link errors), set this to 0. You may need to set // this to 0 if using templates (at least for VC++). This switch is currently -// ignored for mingw / cygwin / CodeWarrior +// ignored for MinGW/Cygwin. // // Default is 0 // @@ -267,6 +266,17 @@ // Recommended setting: 1 if you want to support multiple languages #define wxUSE_PRINTF_POS_PARAMS 1 +// Enable the use of compiler-specific thread local storage keyword, if any. +// This is used for wxTLS_XXX() macros implementation and normally should use +// the compiler-provided support as it's simpler and more efficient, but must +// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using +// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS +// support that results in crashes when any TLS variables are used. So if you +// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set +// this to 0. +// +// Default is 1, but set to 0 if the scenario above is applicable. +#define wxUSE_COMPILER_TLS 1 // ---------------------------------------------------------------------------- // Interoperability with the standard library. @@ -1087,6 +1097,16 @@ // Recommended setting: 1 #define wxUSE_NOTIFICATION_MESSAGE 1 +// wxPreferencesEditor provides a common API for different ways of presenting +// the standard "Preferences" or "Properties" dialog under different platforms +// (e.g. some use modal dialogs, some use modeless ones; some apply the changes +// immediately while others require an explicit "Apply" button). +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_PREFERENCES_EDITOR 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/Externals/wxWidgets3/include/wx/msw/setup_inc.h b/Externals/wxWidgets3/include/wx/msw/setup_inc.h index 176796629d..6905a7a8e6 100644 --- a/Externals/wxWidgets3/include/wx/msw/setup_inc.h +++ b/Externals/wxWidgets3/include/wx/msw/setup_inc.h @@ -3,7 +3,6 @@ // Purpose: MSW-specific setup.h options // Author: Vadim Zeitlin // Created: 2007-07-21 (extracted from wx/msw/setup0.h) -// RCS-ID: $Id: setup_inc.h 69224 2011-09-29 13:43:15Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/slider.h b/Externals/wxWidgets3/include/wx/msw/slider.h index 99267d7ca3..a16c5952e0 100644 --- a/Externals/wxWidgets3/include/wx/msw/slider.h +++ b/Externals/wxWidgets3/include/wx/msw/slider.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: slider.h 68230 2011-07-11 22:49:33Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/sound.h b/Externals/wxWidgets3/include/wx/msw/sound.h index f8b1134229..9e7cc49698 100644 --- a/Externals/wxWidgets3/include/wx/msw/sound.h +++ b/Externals/wxWidgets3/include/wx/msw/sound.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: sound.h 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/spinbutt.h b/Externals/wxWidgets3/include/wx/msw/spinbutt.h index a459911a0d..d50912fbf8 100644 --- a/Externals/wxWidgets3/include/wx/msw/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/msw/spinbutt.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: spinbutt.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/spinctrl.h b/Externals/wxWidgets3/include/wx/msw/spinctrl.h index c1c0f7975d..9250292de0 100644 --- a/Externals/wxWidgets3/include/wx/msw/spinctrl.h +++ b/Externals/wxWidgets3/include/wx/msw/spinctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.07.99 -// RCS-ID: $Id: spinctrl.h 70799 2012-03-04 00:29:48Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -62,6 +61,11 @@ public: // another wxTextCtrl-like method void SetSelection(long from, long to); + // wxSpinCtrlBase methods + virtual int GetBase() const; + virtual bool SetBase(int base); + + // implementation only from now on // ------------------------------- @@ -111,6 +115,7 @@ protected: virtual void DoGetPosition(int *x, int *y) const; virtual void DoMoveWindow(int x, int y, int width, int height); virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; virtual void DoGetSize(int *width, int *height) const; virtual void DoGetClientSize(int *x, int *y) const; #if wxUSE_TOOLTIPS @@ -148,6 +153,12 @@ private: // Common part of all ctors. void Init(); + // Adjust the text control style depending on whether we need to enter only + // digits or may need to enter something else (e.g. "-" sign, "x" + // hexadecimal prefix, ...) in it. + void UpdateBuddyStyle(); + + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) DECLARE_EVENT_TABLE() wxDECLARE_NO_COPY_CLASS(wxSpinCtrl); diff --git a/Externals/wxWidgets3/include/wx/msw/stackwalk.h b/Externals/wxWidgets3/include/wx/msw/stackwalk.h index 21a28fbf69..6ff467205e 100644 --- a/Externals/wxWidgets3/include/wx/msw/stackwalk.h +++ b/Externals/wxWidgets3/include/wx/msw/stackwalk.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-08 -// RCS-ID: $Id: stackwalk.h 58093 2009-01-14 14:38:00Z FM $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/statbmp.h b/Externals/wxWidgets3/include/wx/msw/statbmp.h index c9cbcf21fc..165ddb5af1 100644 --- a/Externals/wxWidgets3/include/wx/msw/statbmp.h +++ b/Externals/wxWidgets3/include/wx/msw/statbmp.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: statbmp.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -58,7 +57,7 @@ public: virtual bool CanApplyThemeBorder() const { return false; } protected: - virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetBestClientSize() const; // ctor/dtor helpers void Init() { m_isIcon = true; m_image = NULL; m_currentHandle = 0; } @@ -76,6 +75,7 @@ protected: void DoPaintManually(wxPaintEvent& event); #endif // !__WXWINCE__ + void WXHandleSize(wxSizeEvent& event); // we can have either an icon or a bitmap bool m_isIcon; @@ -86,6 +86,7 @@ protected: private: DECLARE_DYNAMIC_CLASS(wxStaticBitmap) + wxDECLARE_EVENT_TABLE(); wxDECLARE_NO_COPY_CLASS(wxStaticBitmap); }; diff --git a/Externals/wxWidgets3/include/wx/msw/statbox.h b/Externals/wxWidgets3/include/wx/msw/statbox.h index 578bfd7a69..7721ccacb1 100644 --- a/Externals/wxWidgets3/include/wx/msw/statbox.h +++ b/Externals/wxWidgets3/include/wx/msw/statbox.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: statbox.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/statline.h b/Externals/wxWidgets3/include/wx/msw/statline.h index 002f8dc8ce..1d2662b3bb 100644 --- a/Externals/wxWidgets3/include/wx/msw/statline.h +++ b/Externals/wxWidgets3/include/wx/msw/statline.h @@ -3,7 +3,6 @@ // Purpose: MSW version of wxStaticLine class // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/stattext.h b/Externals/wxWidgets3/include/wx/msw/stattext.h index 7fbc8fd83d..9bbcca7141 100644 --- a/Externals/wxWidgets3/include/wx/msw/stattext.h +++ b/Externals/wxWidgets3/include/wx/msw/stattext.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: stattext.h 61169 2009-06-22 20:36:13Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/statusbar.h b/Externals/wxWidgets3/include/wx/msw/statusbar.h index c69be90c93..b1d352a7cc 100644 --- a/Externals/wxWidgets3/include/wx/msw/statusbar.h +++ b/Externals/wxWidgets3/include/wx/msw/statusbar.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.04.98 -// RCS-ID: $Id: statusbar.h 70310 2012-01-10 17:01:09Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/stdpaths.h b/Externals/wxWidgets3/include/wx/msw/stdpaths.h index 3ca578d71b..80ad985044 100644 --- a/Externals/wxWidgets3/include/wx/msw/stdpaths.h +++ b/Externals/wxWidgets3/include/wx/msw/stdpaths.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-10-19 -// RCS-ID: $Id: stdpaths.h 61662 2009-08-14 00:05:56Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -19,10 +18,6 @@ class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase { public: - // ctor calls IgnoreAppBuildSubDirs() and also sets up the object to use - // both vendor and application name by default - wxStandardPaths(); - // implement base class pure virtuals virtual wxString GetExecutablePath() const; virtual wxString GetConfigDir() const; @@ -67,6 +62,13 @@ public: static wxString MSWGetShellDir(int csidl); protected: + // Ctor is protected, use wxStandardPaths::Get() instead of instantiating + // objects of this class directly. + // + // It calls IgnoreAppBuildSubDirs() and also sets up the object to use + // both vendor and application name by default. + wxStandardPaths(); + // get the path corresponding to the given standard CSIDL_XXX constant static wxString DoGetDirectory(int csidl); diff --git a/Externals/wxWidgets3/include/wx/msw/subwin.h b/Externals/wxWidgets3/include/wx/msw/subwin.h index cf94679403..9e48b9e35f 100644 --- a/Externals/wxWidgets3/include/wx/msw/subwin.h +++ b/Externals/wxWidgets3/include/wx/msw/subwin.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-12-11 -// RCS-ID: $Id: subwin.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/taskbar.h b/Externals/wxWidgets3/include/wx/msw/taskbar.h index 103f8dd82a..c9a4a11ca5 100644 --- a/Externals/wxWidgets3/include/wx/msw/taskbar.h +++ b/Externals/wxWidgets3/include/wx/msw/taskbar.h @@ -5,7 +5,6 @@ // Author: Julian Smart // Modified by: Vaclav Slavik // Created: 24/3/98 -// RCS-ID: $Id: taskbar.h 50586 2007-12-08 20:51:21Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// @@ -21,7 +20,7 @@ class WXDLLIMPEXP_FWD_ADV wxTaskBarIconWindow; class WXDLLIMPEXP_ADV wxTaskBarIcon : public wxTaskBarIconBase { public: - wxTaskBarIcon(); + wxTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE); virtual ~wxTaskBarIcon(); // Accessors diff --git a/Externals/wxWidgets3/include/wx/msw/textctrl.h b/Externals/wxWidgets3/include/wx/msw/textctrl.h index cbcf8b772e..14265e7983 100644 --- a/Externals/wxWidgets3/include/wx/msw/textctrl.h +++ b/Externals/wxWidgets3/include/wx/msw/textctrl.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: textctrl.h 68450 2011-07-29 15:11:54Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -236,6 +235,7 @@ protected: bool SendUpdateEvent(); virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; #if wxUSE_RICHEDIT // Apply the character-related parts of wxTextAttr to the given selection diff --git a/Externals/wxWidgets3/include/wx/msw/textentry.h b/Externals/wxWidgets3/include/wx/msw/textentry.h index 3ba6dcb2ea..80b9e23966 100644 --- a/Externals/wxWidgets3/include/wx/msw/textentry.h +++ b/Externals/wxWidgets3/include/wx/msw/textentry.h @@ -3,7 +3,6 @@ // Purpose: wxMSW-specific wxTextEntry implementation // Author: Vadim Zeitlin // Created: 2007-09-26 -// RCS-ID: $Id: textentry.h 68918 2011-08-27 14:11:13Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -75,7 +74,9 @@ protected: // wxUSE_OLE as OleInitialize() is not called then #if wxUSE_OLE virtual bool DoAutoCompleteStrings(const wxArrayString& choices); +#if wxUSE_DYNLIB_CLASS virtual bool DoAutoCompleteFileNames(int flags); +#endif // wxUSE_DYNLIB_CLASS virtual bool DoAutoCompleteCustom(wxTextCompleter *completer); #endif // wxUSE_OLE diff --git a/Externals/wxWidgets3/include/wx/msw/tglbtn.h b/Externals/wxWidgets3/include/wx/msw/tglbtn.h index 7711f70bb6..091978b865 100644 --- a/Externals/wxWidgets3/include/wx/msw/tglbtn.h +++ b/Externals/wxWidgets3/include/wx/msw/tglbtn.h @@ -5,7 +5,6 @@ // Author: John Norris, minor changes by Axel Schlueter // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) 2000 Johnny C. Norris II // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/timectrl.h b/Externals/wxWidgets3/include/wx/msw/timectrl.h index 8fbb70196e..e39528a4e0 100644 --- a/Externals/wxWidgets3/include/wx/msw/timectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/timectrl.h @@ -3,7 +3,6 @@ // Purpose: wxTimePickerCtrl for Windows. // Author: Vadim Zeitlin // Created: 2011-09-22 -// RCS-ID: $Id: timectrl.h 69224 2011-09-29 13:43:15Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/tls.h b/Externals/wxWidgets3/include/wx/msw/tls.h index b42ee7694e..9d46cadf3e 100644 --- a/Externals/wxWidgets3/include/wx/msw/tls.h +++ b/Externals/wxWidgets3/include/wx/msw/tls.h @@ -3,7 +3,6 @@ // Purpose: Win32 implementation of wxTlsValue<> // Author: Vadim Zeitlin // Created: 2008-08-08 -// RCS-ID: $Id: tls.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/toolbar.h b/Externals/wxWidgets3/include/wx/msw/toolbar.h index 1fe458f2aa..0c6b7e9c9a 100644 --- a/Externals/wxWidgets3/include/wx/msw/toolbar.h +++ b/Externals/wxWidgets3/include/wx/msw/toolbar.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: toolbar.h 70854 2012-03-10 00:01:09Z RD $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,7 +26,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr) { Init(); @@ -39,7 +38,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr); virtual ~wxToolBar(); @@ -67,6 +66,7 @@ public: void OnMouseEvent(wxMouseEvent& event); void OnSysColourChanged(wxSysColourChangedEvent& event); + void OnEraseBackground(wxEraseEvent& event); void SetFocus() {} diff --git a/Externals/wxWidgets3/include/wx/msw/tooltip.h b/Externals/wxWidgets3/include/wx/msw/tooltip.h index 0a42cb5429..39ffe0d6da 100644 --- a/Externals/wxWidgets3/include/wx/msw/tooltip.h +++ b/Externals/wxWidgets3/include/wx/msw/tooltip.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 31.01.99 -// RCS-ID: $Id: tooltip.h 66053 2010-11-07 13:12:16Z VZ $ // Copyright: (c) 1999 Robert Roebling, Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -60,7 +59,7 @@ public: static void RelayEvent(WXMSG *msg); // add a window to the tooltip control - void Add(WXHWND hwnd); + void AddOtherWindow(WXHWND hwnd); // remove any tooltip from the window static void Remove(WXHWND hwnd, unsigned int id, const wxRect& rc); @@ -72,7 +71,7 @@ public: private: // Adds a window other than our main m_window to this tooltip. - void DoAddOtherWindow(WXHWND hWnd); + void DoAddHWND(WXHWND hWnd); // Perform the specified operation for the given window only. void DoSetTip(WXHWND hWnd); diff --git a/Externals/wxWidgets3/include/wx/msw/toplevel.h b/Externals/wxWidgets3/include/wx/msw/toplevel.h index 55afcbdb17..fd1de18d80 100644 --- a/Externals/wxWidgets3/include/wx/msw/toplevel.h +++ b/Externals/wxWidgets3/include/wx/msw/toplevel.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.09.01 -// RCS-ID: $Id: toplevel.h 70881 2012-03-12 11:42:49Z JS $ // Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -122,6 +121,22 @@ public: // returns true if the platform should explicitly apply a theme border virtual bool CanApplyThemeBorder() const { return false; } +#if wxUSE_MENUS + bool HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu); + + // handle WM_EXITMENULOOP message for Win95 only + bool HandleExitMenuLoop(WXWORD isPopup); + + // handle WM_(UN)INITMENUPOPUP message to generate wxEVT_MENU_OPEN/CLOSE + bool HandleMenuPopup(wxEventType evtType, WXHMENU hMenu); + + // Command part of HandleMenuPopup() and HandleExitMenuLoop(). + bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup); + + // Find the menu corresponding to the given handle. + virtual wxMenu* MSWFindMenuFromHMENU(WXHMENU hMenu); +#endif // wxUSE_MENUS + protected: // common part of all ctors void Init(); @@ -236,6 +251,10 @@ private: // MSWGetSystemMenu(). Owned by this window. wxMenu *m_menuSystem; + // The number of currently opened menus: 0 initially, 1 when a top level + // menu is opened, 2 when its submenu is opened and so on. + int m_menuDepth; + DECLARE_EVENT_TABLE() wxDECLARE_NO_COPY_CLASS(wxTopLevelWindowMSW); }; diff --git a/Externals/wxWidgets3/include/wx/msw/treectrl.h b/Externals/wxWidgets3/include/wx/msw/treectrl.h index c20974e8ab..5eeede8598 100644 --- a/Externals/wxWidgets3/include/wx/msw/treectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/treectrl.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Vadim Zeitlin to be less MSW-specific on 10/10/98 // Created: 01/02/97 -// RCS-ID: $Id: treectrl.h 64532 2010-06-09 13:55:48Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -212,6 +211,14 @@ public: virtual bool CanApplyThemeBorder() const { return false; } protected: + // Implement "update locking" in a custom way for this control. + virtual void DoFreeze(); + virtual void DoThaw(); + + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + // SetImageList helper void SetAnyImageList(wxImageList *imageList, int which); @@ -332,6 +339,9 @@ private: // whether we need to deselect other items on mouse up bool m_mouseUpDeselect; + // The size to restore the control to when it is thawed, see DoThaw(). + wxSize m_thawnSize; + friend class wxTreeItemIndirectData; friend class wxTreeSortHelper; diff --git a/Externals/wxWidgets3/include/wx/msw/uxtheme.h b/Externals/wxWidgets3/include/wx/msw/uxtheme.h index 75d9262a18..5c4eae981d 100644 --- a/Externals/wxWidgets3/include/wx/msw/uxtheme.h +++ b/Externals/wxWidgets3/include/wx/msw/uxtheme.h @@ -4,7 +4,6 @@ // Author: John Platts, Vadim Zeitlin // Modified by: // Created: 2003 -// RCS-ID: $Id: uxtheme.h 65955 2010-10-30 23:50:22Z VZ $ // Copyright: (c) 2003 John Platts, Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/webview_ie.h b/Externals/wxWidgets3/include/wx/msw/webview_ie.h index 62b9a49a01..bc19ee85ae 100644 --- a/Externals/wxWidgets3/include/wx/msw/webview_ie.h +++ b/Externals/wxWidgets3/include/wx/msw/webview_ie.h @@ -1,8 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: include/wx/msw/webviewie.h +// Name: include/wx/msw/webview_ie.h // Purpose: wxMSW IE wxWebView backend // Author: Marianne Gagnon -// Id: $Id: webview_ie.h 70499 2012-02-02 20:32:08Z SJL $ // Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,234 +18,22 @@ #include "wx/msw/ole/automtn.h" #include "wx/msw/ole/activex.h" #include "wx/msw/ole/oleutils.h" +#include "wx/msw/private/comptr.h" #include "wx/msw/wrapwin.h" #include "wx/msw/missing.h" +#include "wx/msw/webview_missing.h" #include "wx/sharedptr.h" #include "wx/vector.h" -/* Classes and definitions from urlmon.h vary in their - * completeness between compilers and versions of compilers. - * We implement our own versions here which should work - * for all compilers. The definitions are taken from the - * mingw-w64 headers which are public domain. - */ - -#ifndef REFRESH_NORMAL -#define REFRESH_NORMAL 0 -#endif - -#ifndef REFRESH_COMPLETELY -#define REFRESH_COMPLETELY 3 -#endif - -typedef enum __wxMIDL_IBindStatusCallback_0006 -{ - wxBSCF_FIRSTDATANOTIFICATION = 0x1, - wxBSCF_INTERMEDIATEDATANOTIFICATION = 0x2, - wxBSCF_LASTDATANOTIFICATION = 0x4, - wxBSCF_DATAFULLYAVAILABLE = 0x8, - wxBSCF_AVAILABLEDATASIZEUNKNOWN = 0x10 -} wxBSCF; - -EXTERN_C const IID CLSID_FileProtocol; - -typedef struct _tagwxBINDINFO -{ - ULONG cbSize; - LPWSTR szExtraInfo; - STGMEDIUM stgmedData; - DWORD grfBindInfoF; - DWORD dwBindVerb; - LPWSTR szCustomVerb; - DWORD cbstgmedData; - DWORD dwOptions; - DWORD dwOptionsFlags; - DWORD dwCodePage; - SECURITY_ATTRIBUTES securityAttributes; - IID iid; - IUnknown *pUnk; - DWORD dwReserved; -} wxBINDINFO; - -typedef struct _tagwxPROTOCOLDATA -{ - DWORD grfFlags; - DWORD dwState; - LPVOID pData; - ULONG cbData; -} wxPROTOCOLDATA; - -class wxIInternetBindInfo : public IUnknown -{ -public: - virtual HRESULT wxSTDCALL GetBindInfo(DWORD *grfBINDF,wxBINDINFO *pbindinfo) = 0; - virtual HRESULT wxSTDCALL GetBindString(ULONG ulStringType,LPOLESTR *ppwzStr, - ULONG cEl,ULONG *pcElFetched) = 0; -}; - -class wxIInternetProtocolSink : public IUnknown -{ -public: - virtual HRESULT wxSTDCALL Switch(wxPROTOCOLDATA *pProtocolData) = 0; - virtual HRESULT wxSTDCALL ReportProgress(ULONG ulStatusCode, - LPCWSTR szStatusText) = 0; - virtual HRESULT wxSTDCALL ReportData(DWORD grfBSCF,ULONG ulProgress, - ULONG ulProgressMax) = 0; - virtual HRESULT wxSTDCALL ReportResult(HRESULT hrResult,DWORD dwError, - LPCWSTR szResult) = 0; -}; - -class wxIInternetProtocolRoot : public IUnknown -{ -public: - virtual HRESULT wxSTDCALL Start(LPCWSTR szUrl,wxIInternetProtocolSink *pOIProtSink, - wxIInternetBindInfo *pOIBindInfo,DWORD grfPI, - HANDLE_PTR dwReserved) = 0; - virtual HRESULT wxSTDCALL Continue(wxPROTOCOLDATA *pProtocolData) = 0; - virtual HRESULT wxSTDCALL Abort(HRESULT hrReason,DWORD dwOptions) = 0; - virtual HRESULT wxSTDCALL Terminate(DWORD dwOptions) = 0; - virtual HRESULT wxSTDCALL Suspend(void) = 0; - virtual HRESULT wxSTDCALL Resume(void) = 0; -}; - - -class wxIInternetProtocol : public wxIInternetProtocolRoot -{ -public: - virtual HRESULT wxSTDCALL Read(void *pv,ULONG cb,ULONG *pcbRead) = 0; - virtual HRESULT wxSTDCALL Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin, - ULARGE_INTEGER *plibNewPosition) = 0; - virtual HRESULT wxSTDCALL LockRequest(DWORD dwOptions) = 0; - virtual HRESULT wxSTDCALL UnlockRequest(void) = 0; -}; - - -class wxIInternetSession : public IUnknown -{ - public: - virtual HRESULT wxSTDCALL RegisterNameSpace(IClassFactory *pCF,REFCLSID rclsid, - LPCWSTR pwzProtocol, - ULONG cPatterns, - const LPCWSTR *ppwzPatterns, - DWORD dwReserved) = 0; - virtual HRESULT wxSTDCALL UnregisterNameSpace(IClassFactory *pCF, - LPCWSTR pszProtocol) = 0; - virtual HRESULT wxSTDCALL RegisterMimeFilter(IClassFactory *pCF, - REFCLSID rclsid, - LPCWSTR pwzType) = 0; - virtual HRESULT wxSTDCALL UnregisterMimeFilter(IClassFactory *pCF, - LPCWSTR pwzType) = 0; - virtual HRESULT wxSTDCALL CreateBinding(LPBC pBC,LPCWSTR szUrl, - IUnknown *pUnkOuter,IUnknown **ppUnk, - wxIInternetProtocol **ppOInetProt, - DWORD dwOption) = 0; - virtual HRESULT wxSTDCALL SetSessionOption(DWORD dwOption,LPVOID pBuffer, - DWORD dwBufferLength, - DWORD dwReserved) = 0; - virtual HRESULT wxSTDCALL GetSessionOption(DWORD dwOption,LPVOID pBuffer, - DWORD *pdwBufferLength, - DWORD dwReserved) = 0; -}; - -/* END OF URLMON.H implementation */ - -/* Same goes for the mshtmhst.h, these are also taken - * from mingw-w64 headers. - */ - -typedef enum _tagwxDOCHOSTUIFLAG -{ - DOCHOSTUIFLAG_DIALOG = 0x1, - DOCHOSTUIFLAG_DISABLE_HELP_MENU = 0x2, - DOCHOSTUIFLAG_NO3DBORDER = 0x4, - DOCHOSTUIFLAG_SCROLL_NO = 0x8, - DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = 0x10, - DOCHOSTUIFLAG_OPENNEWWIN = 0x20, - DOCHOSTUIFLAG_DISABLE_OFFSCREEN = 0x40, - DOCHOSTUIFLAG_FLAT_SCROLLBAR = 0x80, - DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = 0x100, - DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = 0x200, - DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = 0x400, - DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = 0x800, - DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = 0x1000, - DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = 0x2000, - DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = 0x4000, - DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = 0x10000, - DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = 0x20000, - DOCHOSTUIFLAG_THEME = 0x40000, - DOCHOSTUIFLAG_NOTHEME = 0x80000, - DOCHOSTUIFLAG_NOPICS = 0x100000, - DOCHOSTUIFLAG_NO3DOUTERBORDER = 0x200000, - DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP = 0x400000, - DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK = 0x800000, - DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL = 0x1000000 -} DOCHOSTUIFLAG; - -typedef struct _tagwxDOCHOSTUIINFO -{ - ULONG cbSize; - DWORD dwFlags; - DWORD dwDoubleClick; - OLECHAR *pchHostCss; - OLECHAR *pchHostNS; -} DOCHOSTUIINFO; - -class wxIDocHostUIHandler : public IUnknown -{ -public: - virtual HRESULT wxSTDCALL ShowContextMenu(DWORD dwID, POINT *ppt, - IUnknown *pcmdtReserved, - IDispatch *pdispReserved) = 0; - - virtual HRESULT wxSTDCALL GetHostInfo(DOCHOSTUIINFO *pInfo) = 0; - - virtual HRESULT wxSTDCALL ShowUI(DWORD dwID, - IOleInPlaceActiveObject *pActiveObject, - IOleCommandTarget *pCommandTarget, - IOleInPlaceFrame *pFrame, - IOleInPlaceUIWindow *pDoc) = 0; - - virtual HRESULT wxSTDCALL HideUI(void) = 0; - - virtual HRESULT wxSTDCALL UpdateUI(void) = 0; - - virtual HRESULT wxSTDCALL EnableModeless(BOOL fEnable) = 0; - - virtual HRESULT wxSTDCALL OnDocWindowActivate(BOOL fActivate) = 0; - - virtual HRESULT wxSTDCALL OnFrameWindowActivate(BOOL fActivate) = 0; - - virtual HRESULT wxSTDCALL ResizeBorder(LPCRECT prcBorder, - IOleInPlaceUIWindow *pUIWindow, - BOOL fRameWindow) = 0; - - virtual HRESULT wxSTDCALL TranslateAccelerator(LPMSG lpMsg, - const GUID *pguidCmdGroup, - DWORD nCmdID) = 0; - - virtual HRESULT wxSTDCALL GetOptionKeyPath(LPOLESTR *pchKey, - DWORD dw) = 0; - - virtual HRESULT wxSTDCALL GetDropTarget(IDropTarget *pDropTarget, - IDropTarget **ppDropTarget) = 0; - - virtual HRESULT wxSTDCALL GetExternal(IDispatch **ppDispatch) = 0; - - virtual HRESULT wxSTDCALL TranslateUrl(DWORD dwTranslate, - OLECHAR *pchURLIn, - OLECHAR **ppchURLOut) = 0; - - virtual HRESULT wxSTDCALL FilterDataObject(IDataObject *pDO, - IDataObject **ppDORet) = 0; -}; - -/* END OF MSHTMHST.H implementation */ - struct IHTMLDocument2; +struct IHTMLElement; +struct IMarkupPointer; class wxFSFile; class ClassFactory; class wxIEContainer; class DocHostUIHandler; +class wxFindPointers; +class wxIInternetProtocol; class WXDLLIMPEXP_WEBVIEW wxWebViewIE : public wxWebView { @@ -287,7 +74,7 @@ public: virtual void ClearHistory(); virtual void EnableHistory(bool enable = true); virtual void Stop(); - virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT); + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT); virtual wxString GetPageSource() const; virtual wxString GetPageText() const; @@ -302,8 +89,6 @@ public: virtual void Print(); - virtual void SetPage(const wxString& html, const wxString& baseUrl); - virtual wxWebViewZoom GetZoom() const; virtual void SetZoom(wxWebViewZoom zoom); @@ -321,6 +106,9 @@ public: virtual void Undo(); virtual void Redo(); + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT); + //Editing functions virtual void SetEditable(bool enable = true); virtual bool IsEditable() const; @@ -338,6 +126,8 @@ public: //Virtual Filesystem Support virtual void RegisterHandler(wxSharedPtr handler); + virtual void* GetNativeBackend() const { return m_webBrowser; } + // ---- IE-specific methods // FIXME: I seem to be able to access remote webpages even in offline mode... @@ -355,12 +145,15 @@ public: DECLARE_EVENT_TABLE(); +protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl); + private: wxIEContainer* m_container; wxAutomationObject m_ie; IWebBrowser2* m_webBrowser; DWORD m_dwCookie; - DocHostUIHandler* m_uiHandler; + wxCOMPtr m_uiHandler; //We store the current zoom type; wxWebViewZoomType m_zoomType; @@ -380,16 +173,41 @@ private: bool m_historyLoadingFromList; bool m_historyEnabled; - //Generic helper functions for IHtmlDocument commands + //We store find flag, results and position. + wxVector m_findPointers; + int m_findFlags; + wxString m_findText; + int m_findPosition; + + //Generic helper functions bool CanExecCommand(wxString command) const; void ExecCommand(wxString command); - IHTMLDocument2* GetDocument() const; + wxCOMPtr GetDocument() const; + bool IsElementVisible(wxCOMPtr elm); + //Find helper functions. + void FindInternal(const wxString& text, int flags, int internal_flag); + long FindNext(int direction = 1); + void FindClear(); //Toggles control features see INTERNETFEATURELIST for values. bool EnableControlFeature(long flag, bool enable = true); wxDECLARE_DYNAMIC_CLASS(wxWebViewIE); }; +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryIE : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewIE; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewIE(parent, id, url, pos, size, style, name); } +}; + class VirtualProtocol : public wxIInternetProtocol { protected: @@ -402,7 +220,7 @@ protected: public: VirtualProtocol(wxSharedPtr handler); - ~VirtualProtocol() {} + virtual ~VirtualProtocol() {} //IUnknown DECLARE_IUNKNOWN_METHODS; @@ -436,7 +254,11 @@ public: class ClassFactory : public IClassFactory { public: - ClassFactory(wxSharedPtr handler) : m_handler(handler) {} + ClassFactory(wxSharedPtr handler) : m_handler(handler) + { AddRef(); } + virtual ~ClassFactory() {} + + wxString GetName() { return m_handler->GetName(); } //IClassFactory HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown* pUnkOuter, @@ -463,12 +285,13 @@ private: class DocHostUIHandler : public wxIDocHostUIHandler { public: - DocHostUIHandler() {}; - ~DocHostUIHandler() {}; + DocHostUIHandler(wxWebView* browser) { m_browser = browser; } + virtual ~DocHostUIHandler() {} + virtual HRESULT wxSTDCALL ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved); - + virtual HRESULT wxSTDCALL GetHostInfo(DOCHOSTUIINFO *pInfo); virtual HRESULT wxSTDCALL ShowUI(DWORD dwID, @@ -495,7 +318,7 @@ public: const GUID *pguidCmdGroup, DWORD nCmdID); - virtual HRESULT wxSTDCALL GetOptionKeyPath(LPOLESTR *pchKey, + virtual HRESULT wxSTDCALL GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw); virtual HRESULT wxSTDCALL GetDropTarget(IDropTarget *pDropTarget, @@ -511,6 +334,21 @@ public: IDataObject **ppDORet); //IUnknown DECLARE_IUNKNOWN_METHODS; + +private: + wxWebView* m_browser; +}; + +class wxFindPointers +{ +public: + wxFindPointers(wxIMarkupPointer *ptrBegin, wxIMarkupPointer *ptrEnd) + { + begin = ptrBegin; + end = ptrEnd; + } + //The two markup pointers. + wxIMarkupPointer *begin, *end; }; #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE && defined(__WXMSW__) diff --git a/Externals/wxWidgets3/include/wx/msw/webview_missing.h b/Externals/wxWidgets3/include/wx/msw/webview_missing.h new file mode 100644 index 0000000000..fc2b8bc045 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/msw/webview_missing.h @@ -0,0 +1,947 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/msw/webview_missing.h +// Purpose: Defintions / classes commonly missing used by wxWebViewIE +// Author: Steven Lamerton +// Copyright: (c) 2012 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + * Classes and definitions used by wxWebViewIE vary in their + * completeness between compilers and versions of compilers. + * We implement our own versions here which should work + * for all compilers. The definitions are taken from the + * mingw-w64 headers which are public domain. +*/ + +/* urlmon.h */ + +struct IHTMLElement; +struct IHTMLDocument2; + +#ifndef REFRESH_NORMAL +#define REFRESH_NORMAL 0 +#endif + +#ifndef REFRESH_COMPLETELY +#define REFRESH_COMPLETELY 3 +#endif + +typedef enum __wxMIDL_IBindStatusCallback_0006 +{ + wxBSCF_FIRSTDATANOTIFICATION = 0x1, + wxBSCF_INTERMEDIATEDATANOTIFICATION = 0x2, + wxBSCF_LASTDATANOTIFICATION = 0x4, + wxBSCF_DATAFULLYAVAILABLE = 0x8, + wxBSCF_AVAILABLEDATASIZEUNKNOWN = 0x10 +} wxBSCF; + +EXTERN_C const IID CLSID_FileProtocol; + +typedef struct _tagwxBINDINFO +{ + ULONG cbSize; + LPWSTR szExtraInfo; + STGMEDIUM stgmedData; + DWORD grfBindInfoF; + DWORD dwBindVerb; + LPWSTR szCustomVerb; + DWORD cbstgmedData; + DWORD dwOptions; + DWORD dwOptionsFlags; + DWORD dwCodePage; + SECURITY_ATTRIBUTES securityAttributes; + IID iid; + IUnknown *pUnk; + DWORD dwReserved; +} wxBINDINFO; + +typedef struct _tagwxPROTOCOLDATA +{ + DWORD grfFlags; + DWORD dwState; + LPVOID pData; + ULONG cbData; +} wxPROTOCOLDATA; + +class wxIInternetBindInfo : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL GetBindInfo(DWORD *grfBINDF, wxBINDINFO *pbindinfo) = 0; + virtual HRESULT wxSTDCALL GetBindString(ULONG ulStringType, LPOLESTR *ppwzStr, + ULONG cEl, ULONG *pcElFetched) = 0; +}; + +class wxIInternetProtocolSink : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL Switch(wxPROTOCOLDATA *pProtocolData) = 0; + virtual HRESULT wxSTDCALL ReportProgress(ULONG ulStatusCode, + LPCWSTR szStatusText) = 0; + virtual HRESULT wxSTDCALL ReportData(DWORD grfBSCF, ULONG ulProgress, + ULONG ulProgressMax) = 0; + virtual HRESULT wxSTDCALL ReportResult(HRESULT hrResult, DWORD dwError, + LPCWSTR szResult) = 0; +}; + +class wxIInternetProtocolRoot : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink, + wxIInternetBindInfo *pOIBindInfo, DWORD grfPI, + HANDLE_PTR dwReserved) = 0; + virtual HRESULT wxSTDCALL Continue(wxPROTOCOLDATA *pProtocolData) = 0; + virtual HRESULT wxSTDCALL Abort(HRESULT hrReason, DWORD dwOptions) = 0; + virtual HRESULT wxSTDCALL Terminate(DWORD dwOptions) = 0; + virtual HRESULT wxSTDCALL Suspend(void) = 0; + virtual HRESULT wxSTDCALL Resume(void) = 0; +}; + + +class wxIInternetProtocol : public wxIInternetProtocolRoot +{ +public: + virtual HRESULT wxSTDCALL Read(void *pv, ULONG cb, ULONG *pcbRead) = 0; + virtual HRESULT wxSTDCALL Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, + ULARGE_INTEGER *plibNewPosition) = 0; + virtual HRESULT wxSTDCALL LockRequest(DWORD dwOptions) = 0; + virtual HRESULT wxSTDCALL UnlockRequest(void) = 0; +}; + + +class wxIInternetSession : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL RegisterNameSpace(IClassFactory *pCF, REFCLSID rclsid, + LPCWSTR pwzProtocol, + ULONG cPatterns, + const LPCWSTR *ppwzPatterns, + DWORD dwReserved) = 0; + virtual HRESULT wxSTDCALL UnregisterNameSpace(IClassFactory *pCF, + LPCWSTR pszProtocol) = 0; + virtual HRESULT wxSTDCALL RegisterMimeFilter(IClassFactory *pCF, + REFCLSID rclsid, + LPCWSTR pwzType) = 0; + virtual HRESULT wxSTDCALL UnregisterMimeFilter(IClassFactory *pCF, + LPCWSTR pwzType) = 0; + virtual HRESULT wxSTDCALL CreateBinding(LPBC pBC, LPCWSTR szUrl, + IUnknown *pUnkOuter, IUnknown **ppUnk, + wxIInternetProtocol **ppOInetProt, + DWORD dwOption) = 0; + virtual HRESULT wxSTDCALL SetSessionOption(DWORD dwOption, LPVOID pBuffer, + DWORD dwBufferLength, + DWORD dwReserved) = 0; + virtual HRESULT wxSTDCALL GetSessionOption(DWORD dwOption, LPVOID pBuffer, + DWORD *pdwBufferLength, + DWORD dwReserved) = 0; +}; + +/* end of urlmon.h */ + +/* mshtmhst.h */ + +typedef enum _tagwxDOCHOSTUIFLAG +{ + DOCHOSTUIFLAG_DIALOG = 0x1, + DOCHOSTUIFLAG_DISABLE_HELP_MENU = 0x2, + DOCHOSTUIFLAG_NO3DBORDER = 0x4, + DOCHOSTUIFLAG_SCROLL_NO = 0x8, + DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = 0x10, + DOCHOSTUIFLAG_OPENNEWWIN = 0x20, + DOCHOSTUIFLAG_DISABLE_OFFSCREEN = 0x40, + DOCHOSTUIFLAG_FLAT_SCROLLBAR = 0x80, + DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = 0x100, + DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = 0x200, + DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = 0x400, + DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = 0x800, + DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = 0x1000, + DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = 0x2000, + DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = 0x4000, + DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = 0x10000, + DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = 0x20000, + DOCHOSTUIFLAG_THEME = 0x40000, + DOCHOSTUIFLAG_NOTHEME = 0x80000, + DOCHOSTUIFLAG_NOPICS = 0x100000, + DOCHOSTUIFLAG_NO3DOUTERBORDER = 0x200000, + DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP = 0x400000, + DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK = 0x800000, + DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL = 0x1000000 +} DOCHOSTUIFLAG; + +typedef struct _tagwxDOCHOSTUIINFO +{ + ULONG cbSize; + DWORD dwFlags; + DWORD dwDoubleClick; + OLECHAR *pchHostCss; + OLECHAR *pchHostNS; +} DOCHOSTUIINFO; + +class wxIDocHostUIHandler : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL ShowContextMenu(DWORD dwID, POINT *ppt, + IUnknown *pcmdtReserved, + IDispatch *pdispReserved) = 0; + + virtual HRESULT wxSTDCALL GetHostInfo(DOCHOSTUIINFO *pInfo) = 0; + + virtual HRESULT wxSTDCALL ShowUI(DWORD dwID, + IOleInPlaceActiveObject *pActiveObject, + IOleCommandTarget *pCommandTarget, + IOleInPlaceFrame *pFrame, + IOleInPlaceUIWindow *pDoc) = 0; + + virtual HRESULT wxSTDCALL HideUI(void) = 0; + + virtual HRESULT wxSTDCALL UpdateUI(void) = 0; + + virtual HRESULT wxSTDCALL EnableModeless(BOOL fEnable) = 0; + + virtual HRESULT wxSTDCALL OnDocWindowActivate(BOOL fActivate) = 0; + + virtual HRESULT wxSTDCALL OnFrameWindowActivate(BOOL fActivate) = 0; + + virtual HRESULT wxSTDCALL ResizeBorder(LPCRECT prcBorder, + IOleInPlaceUIWindow *pUIWindow, + BOOL fRameWindow) = 0; + + virtual HRESULT wxSTDCALL TranslateAccelerator(LPMSG lpMsg, + const GUID *pguidCmdGroup, + DWORD nCmdID) = 0; + + virtual HRESULT wxSTDCALL GetOptionKeyPath(LPOLESTR *pchKey, + DWORD dw) = 0; + + virtual HRESULT wxSTDCALL GetDropTarget(IDropTarget *pDropTarget, + IDropTarget **ppDropTarget) = 0; + + virtual HRESULT wxSTDCALL GetExternal(IDispatch **ppDispatch) = 0; + + virtual HRESULT wxSTDCALL TranslateUrl(DWORD dwTranslate, + OLECHAR *pchURLIn, + OLECHAR **ppchURLOut) = 0; + + virtual HRESULT wxSTDCALL FilterDataObject(IDataObject *pDO, + IDataObject **ppDORet) = 0; +}; + +/* end of mshtmhst.h */ + +/* mshtml.h */ + +typedef enum _tagwxPOINTER_GRAVITY +{ + wxPOINTER_GRAVITY_Left = 0, + wxPOINTER_GRAVITY_Right = 1, + wxPOINTER_GRAVITY_Max = 2147483647 +} wxPOINTER_GRAVITY; + +typedef enum _tagwxELEMENT_ADJACENCY +{ + wxELEM_ADJ_BeforeBegin = 0, + wxELEM_ADJ_AfterBegin = 1, + wxELEM_ADJ_BeforeEnd = 2, + wxELEM_ADJ_AfterEnd = 3, + wxELEMENT_ADJACENCY_Max = 2147483647 +} wxELEMENT_ADJACENCY; + +typedef enum _tagwxMARKUP_CONTEXT_TYPE +{ + wxCONTEXT_TYPE_None = 0, + wxCONTEXT_TYPE_Text = 1, + wxCONTEXT_TYPE_EnterScope = 2, + wxCONTEXT_TYPE_ExitScope = 3, + wxCONTEXT_TYPE_NoScope = 4, + wxMARKUP_CONTEXT_TYPE_Max = 2147483647 +} wxMARKUP_CONTEXT_TYPE; + +typedef enum _tagwxFINDTEXT_FLAGS +{ + wxFINDTEXT_BACKWARDS = 0x1, + wxFINDTEXT_WHOLEWORD = 0x2, + wxFINDTEXT_MATCHCASE = 0x4, + wxFINDTEXT_RAW = 0x20000, + wxFINDTEXT_MATCHDIAC = 0x20000000, + wxFINDTEXT_MATCHKASHIDA = 0x40000000, + wxFINDTEXT_MATCHALEFHAMZA = 0x80000000, + wxFINDTEXT_FLAGS_Max = 2147483647 +} wxFINDTEXT_FLAGS; + +typedef enum _tagwxMOVEUNIT_ACTION +{ + wxMOVEUNIT_PREVCHAR = 0, + wxMOVEUNIT_NEXTCHAR = 1, + wxMOVEUNIT_PREVCLUSTERBEGIN = 2, + wxMOVEUNIT_NEXTCLUSTERBEGIN = 3, + wxMOVEUNIT_PREVCLUSTEREND = 4, + wxMOVEUNIT_NEXTCLUSTEREND = 5, + wxMOVEUNIT_PREVWORDBEGIN = 6, + wxMOVEUNIT_NEXTWORDBEGIN = 7, + wxMOVEUNIT_PREVWORDEND = 8, + wxMOVEUNIT_NEXTWORDEND = 9, + wxMOVEUNIT_PREVPROOFWORD = 10, + wxMOVEUNIT_NEXTPROOFWORD = 11, + wxMOVEUNIT_NEXTURLBEGIN = 12, + wxMOVEUNIT_PREVURLBEGIN = 13, + wxMOVEUNIT_NEXTURLEND = 14, + wxMOVEUNIT_PREVURLEND = 15, + wxMOVEUNIT_PREVSENTENCE = 16, + wxMOVEUNIT_NEXTSENTENCE = 17, + wxMOVEUNIT_PREVBLOCK = 18, + wxMOVEUNIT_NEXTBLOCK = 19, + wxMOVEUNIT_ACTION_Max = 2147483647 +} wxMOVEUNIT_ACTION; + +typedef enum _tagwxELEMENT_TAG_ID +{ + wxTAGID_NULL = 0, wxTAGID_UNKNOWN = 1, wxTAGID_A = 2, wxTAGID_ACRONYM = 3, + wxTAGID_ADDRESS = 4, wxTAGID_APPLET = 5, wxTAGID_AREA = 6, wxTAGID_B = 7, + wxTAGID_BASE = 8, wxTAGID_BASEFONT = 9, wxTAGID_BDO = 10, + wxTAGID_BGSOUND = 11, wxTAGID_BIG = 12, wxTAGID_BLINK = 13, + wxTAGID_BLOCKQUOTE = 14, wxTAGID_BODY = 15, wxTAGID_BR = 16, + wxTAGID_BUTTON = 17, wxTAGID_CAPTION = 18, wxTAGID_CENTER = 19, + wxTAGID_CITE = 20, wxTAGID_CODE = 21, wxTAGID_COL = 22, + wxTAGID_COLGROUP = 23, wxTAGID_COMMENT = 24, wxTAGID_COMMENT_RAW = 25, + wxTAGID_DD = 26, wxTAGID_DEL = 27, wxTAGID_DFN = 28, wxTAGID_DIR = 29, + wxTAGID_DIV = 30, wxTAGID_DL = 31, wxTAGID_DT = 32, wxTAGID_EM = 33, + wxTAGID_EMBED = 34, wxTAGID_FIELDSET = 35, wxTAGID_FONT = 36, + wxTAGID_FORM = 37, wxTAGID_FRAME = 38, wxTAGID_FRAMESET = 39, + wxTAGID_GENERIC = 40, wxTAGID_H1 = 41, wxTAGID_H2 = 42, wxTAGID_H3 = 43, + wxTAGID_H4 = 44, wxTAGID_H5 = 45, wxTAGID_H6 = 46, wxTAGID_HEAD = 47, + wxTAGID_HR = 48, wxTAGID_HTML = 49, wxTAGID_I = 50, wxTAGID_IFRAME = 51, + wxTAGID_IMG = 52, wxTAGID_INPUT = 53, wxTAGID_INS = 54, wxTAGID_KBD = 55, + wxTAGID_LABEL = 56, wxTAGID_LEGEND = 57, wxTAGID_LI = 58, wxTAGID_LINK = 59, + wxTAGID_LISTING = 60, wxTAGID_MAP = 61, wxTAGID_MARQUEE = 62, + wxTAGID_MENU = 63, wxTAGID_META = 64, wxTAGID_NEXTID = 65, + wxTAGID_NOBR = 66, wxTAGID_NOEMBED = 67, wxTAGID_NOFRAMES = 68, + wxTAGID_NOSCRIPT = 69, wxTAGID_OBJECT = 70, wxTAGID_OL = 71, + wxTAGID_OPTION = 72, wxTAGID_P = 73, wxTAGID_PARAM = 74, + wxTAGID_PLAINTEXT = 75, wxTAGID_PRE = 76, wxTAGID_Q = 77, wxTAGID_RP = 78, + wxTAGID_RT = 79, wxTAGID_RUBY = 80, wxTAGID_S = 81, wxTAGID_SAMP = 82, + wxTAGID_SCRIPT = 83, wxTAGID_SELECT = 84, wxTAGID_SMALL = 85, + wxTAGID_SPAN = 86, wxTAGID_STRIKE = 87, wxTAGID_STRONG = 88, + wxTAGID_STYLE = 89, wxTAGID_SUB = 90, wxTAGID_SUP = 91, wxTAGID_TABLE = 92, + wxTAGID_TBODY = 93, wxTAGID_TC = 94, wxTAGID_TD = 95, wxTAGID_TEXTAREA = 96, + wxTAGID_TFOOT = 97, wxTAGID_TH = 98, wxTAGID_THEAD = 99, + wxTAGID_TITLE = 100, wxTAGID_TR = 101, wxTAGID_TT = 102, wxTAGID_U = 103, + wxTAGID_UL = 104, wxTAGID_VAR = 105, wxTAGID_WBR = 106, wxTAGID_XMP = 107, + wxTAGID_ROOT = 108, wxTAGID_OPTGROUP = 109, wxTAGID_COUNT = 110, + wxTAGID_LAST_PREDEFINED = 10000, wxELEMENT_TAG_ID_Max = 2147483647 +} wxELEMENT_TAG_ID; + +struct wxIHTMLStyle : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL put_fontFamily(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_fontFamily(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_fontStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_fontStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_fontVariant(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_fontVariant(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_fontWeight(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_fontWeight(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_fontSize(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_fontSize(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_font(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_font(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_color(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_color(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_background(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_background(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundColor(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_backgroundColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundImage(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_backgroundImage(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundRepeat(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_backgroundRepeat(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundAttachment(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_backgroundAttachment(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundPosition(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_backgroundPosition(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundPositionX(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_backgroundPositionX(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_backgroundPositionY(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_backgroundPositionY(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_wordSpacing(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_wordSpacing(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_letterSpacing(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_letterSpacing(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_textDecoration(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_textDecoration(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_textDecorationNone(VARIANT_BOOL v) = 0; + virtual HRESULT wxSTDCALL get_textDecorationNone(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL put_textDecorationUnderline(VARIANT_BOOL v) = 0; + virtual HRESULT wxSTDCALL get_textDecorationUnderline(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL put_textDecorationOverline(VARIANT_BOOL v) = 0; + virtual HRESULT wxSTDCALL get_textDecorationOverline(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL put_textDecorationLineThrough(VARIANT_BOOL v) = 0; + virtual HRESULT wxSTDCALL get_textDecorationLineThrough(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL put_textDecorationBlink(VARIANT_BOOL v) = 0; + virtual HRESULT wxSTDCALL get_textDecorationBlink(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL put_verticalAlign(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_verticalAlign(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_textTransform(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_textTransform(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_textAlign(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_textAlign(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_textIndent(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_textIndent(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_lineHeight(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_lineHeight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_marginTop(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_marginTop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_marginRight(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_marginRight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_marginBottom(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_marginBottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_marginLeft(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_marginLeft(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_margin(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_margin(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_paddingTop(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_paddingTop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_paddingRight(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_paddingRight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_paddingBottom(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_paddingBottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_paddingLeft(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_paddingLeft(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_padding(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_padding(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_border(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_border(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderTop(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderTop(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderRight(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderRight(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderBottom(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderBottom(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderLeft(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderLeft(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderColor(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderColor(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderTopColor(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderTopColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderRightColor(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderRightColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderBottomColor(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderBottomColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderLeftColor(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderLeftColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderWidth(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderWidth(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderTopWidth(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderTopWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderRightWidth(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderRightWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderBottomWidth(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderBottomWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderLeftWidth(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_borderLeftWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_borderStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderTopStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderTopStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderRightStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderRightStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderBottomStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderBottomStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_borderLeftStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_borderLeftStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_width(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_width(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_height(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_height(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_styleFloat(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_styleFloat(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_clear(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_clear(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_display(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_display(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_visibility(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_visibility(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_listStyleType(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_listStyleType(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_listStylePosition(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_listStylePosition(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_listStyleImage(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_listStyleImage(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_listStyle(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_listStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_whiteSpace(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_whiteSpace(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_top(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_top(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_left(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_left(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_position(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_zIndex(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_zIndex(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_overflow(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_overflow(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_pageBreakBefore(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_pageBreakBefore(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_pageBreakAfter(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_pageBreakAfter(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_cssText(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_cssText(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_pixelTop(long v) = 0; + virtual HRESULT wxSTDCALL get_pixelTop(long *p) = 0; + virtual HRESULT wxSTDCALL put_pixelLeft(long v) = 0; + virtual HRESULT wxSTDCALL get_pixelLeft(long *p) = 0; + virtual HRESULT wxSTDCALL put_pixelWidth(long v) = 0; + virtual HRESULT wxSTDCALL get_pixelWidth(long *p) = 0; + virtual HRESULT wxSTDCALL put_pixelHeight(long v) = 0; + virtual HRESULT wxSTDCALL get_pixelHeight(long *p) = 0; + virtual HRESULT wxSTDCALL put_posTop(float v) = 0; + virtual HRESULT wxSTDCALL get_posTop(float *p) = 0; + virtual HRESULT wxSTDCALL put_posLeft(float v) = 0; + virtual HRESULT wxSTDCALL get_posLeft(float *p) = 0; + virtual HRESULT wxSTDCALL put_posWidth(float v) = 0; + virtual HRESULT wxSTDCALL get_posWidth(float *p) = 0; + virtual HRESULT wxSTDCALL put_posHeight(float v) = 0; + virtual HRESULT wxSTDCALL get_posHeight(float *p) = 0; + virtual HRESULT wxSTDCALL put_cursor(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_cursor(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_clip(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_clip(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_filter(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_filter(BSTR *p) = 0; + virtual HRESULT wxSTDCALL setAttribute(BSTR strAttributeName, VARIANT AttributeValue, LONG lFlags = 1) = 0; + virtual HRESULT wxSTDCALL getAttribute(BSTR strAttributeName, LONG lFlags, VARIANT *AttributeValue) = 0; + virtual HRESULT wxSTDCALL removeAttribute(BSTR strAttributeName, LONG lFlags, VARIANT_BOOL *pfSuccess) = 0; + virtual HRESULT wxSTDCALL toString(BSTR *String) = 0; +}; + +struct wxIHTMLCurrentStyle : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL get_position(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_styleFloat(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_color(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_fontFamily(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_fontStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_fontVariant(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_fontWeight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_fontSize(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundImage(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundPositionX(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundPositionY(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundRepeat(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderLeftColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderTopColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderRightColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderBottomColor(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderTopStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderRightStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderBottomStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderLeftStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderTopWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderRightWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderBottomWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_borderLeftWidth(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_left(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_top(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_width(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_height(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_paddingLeft(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_paddingTop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_paddingRight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_paddingBottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_textAlign(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textDecoration(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_display(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_visibility(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_zIndex(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_letterSpacing(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_lineHeight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_textIndent(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_verticalAlign(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_backgroundAttachment(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_marginTop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_marginRight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_marginBottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_marginLeft(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_clear(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_listStyleType(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_listStylePosition(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_listStyleImage(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_clipTop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_clipRight(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_clipBottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_clipLeft(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_overflow(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_pageBreakBefore(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_pageBreakAfter(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_cursor(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_tableLayout(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderCollapse(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_direction(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_behavior(BSTR *p) = 0; + virtual HRESULT wxSTDCALL getAttribute(BSTR strAttributeName, LONG lFlags, VARIANT *AttributeValue) = 0; + virtual HRESULT wxSTDCALL get_unicodeBidi(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_right(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_bottom(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_imeMode(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_rubyAlign(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_rubyPosition(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_rubyOverhang(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textAutospace(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_lineBreak(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_wordBreak(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textJustify(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textJustifyTrim(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textKashida(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_blockDirection(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_layoutGridChar(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_layoutGridLine(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_layoutGridMode(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_layoutGridType(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderStyle(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderColor(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_borderWidth(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_padding(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_margin(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_accelerator(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_overflowX(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_overflowY(BSTR *p) = 0; + virtual HRESULT wxSTDCALL get_textTransform(BSTR *p) = 0; +}; + + +struct wxIHTMLRect : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL put_left(long v) = 0; + virtual HRESULT wxSTDCALL get_left(long *p) = 0; + virtual HRESULT wxSTDCALL put_top(long v) = 0; + virtual HRESULT wxSTDCALL get_top(long *p) = 0; + virtual HRESULT wxSTDCALL put_right(long v) = 0; + virtual HRESULT wxSTDCALL get_right(long *p) = 0; + virtual HRESULT wxSTDCALL put_bottom(long v) = 0; + virtual HRESULT wxSTDCALL get_bottom(long *p) = 0; +}; + +struct wxIHTMLRectCollection : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL get_length(long *p) = 0; + virtual HRESULT wxSTDCALL get__newEnum(IUnknown **p) = 0; + virtual HRESULT wxSTDCALL item(VARIANT *pvarIndex, VARIANT *pvarResult) = 0; +}; + +struct wxIHTMLFiltersCollection : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL get_length(long *p) = 0; + virtual HRESULT wxSTDCALL get__newEnum(IUnknown **p) = 0; + virtual HRESULT wxSTDCALL item(VARIANT *pvarIndex, VARIANT *pvarResult) = 0; +}; + +struct wxIHTMLElementCollection : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL toString(BSTR *String) = 0; + virtual HRESULT wxSTDCALL put_length(long v) = 0; + virtual HRESULT wxSTDCALL get_length(long *p) = 0; + virtual HRESULT wxSTDCALL get__newEnum(IUnknown **p) = 0; + virtual HRESULT wxSTDCALL item(VARIANT name, VARIANT index, IDispatch **pdisp) = 0; + virtual HRESULT wxSTDCALL tags(VARIANT tagName, IDispatch **pdisp) = 0; +}; + +struct wxIHTMLElement2 : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL get_scopeName(BSTR *p) = 0; + virtual HRESULT wxSTDCALL setCapture(VARIANT_BOOL containerCapture = -1) = 0; + virtual HRESULT wxSTDCALL releaseCapture(void) = 0; + virtual HRESULT wxSTDCALL put_onlosecapture(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onlosecapture(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL componentFromPoint(long x, long y, BSTR *component) = 0; + virtual HRESULT wxSTDCALL doScroll(VARIANT component) = 0; + virtual HRESULT wxSTDCALL put_onscroll(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onscroll(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondrag(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondrag(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondragend(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondragend(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondragenter(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondragenter(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondragover(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondragover(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondragleave(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondragleave(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_ondrop(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_ondrop(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onbeforecut(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onbeforecut(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_oncut(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_oncut(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onbeforecopy(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onbeforecopy(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_oncopy(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_oncopy(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onbeforepaste(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onbeforepaste(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onpaste(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onpaste(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_currentStyle(wxIHTMLCurrentStyle **p) = 0; + virtual HRESULT wxSTDCALL put_onpropertychange(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onpropertychange(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL getClientRects(wxIHTMLRectCollection **pRectCol) = 0; + virtual HRESULT wxSTDCALL getBoundingClientRect(wxIHTMLRect **pRect) = 0; + virtual HRESULT wxSTDCALL setExpression(BSTR propname, BSTR expression, BSTR language = L"") = 0; + virtual HRESULT wxSTDCALL getExpression(BSTR propname, VARIANT *expression) = 0; + virtual HRESULT wxSTDCALL removeExpression(BSTR propname, VARIANT_BOOL *pfSuccess) = 0; + virtual HRESULT wxSTDCALL put_tabIndex(short v) = 0; + virtual HRESULT wxSTDCALL get_tabIndex(short *p) = 0; + virtual HRESULT wxSTDCALL focus(void) = 0; + virtual HRESULT wxSTDCALL put_accessKey(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_accessKey(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_onblur(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onblur(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onfocus(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onfocus(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onresize(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onresize(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL blur(void) = 0; + virtual HRESULT wxSTDCALL addFilter(IUnknown *pUnk) = 0; + virtual HRESULT wxSTDCALL removeFilter(IUnknown *pUnk) = 0; + virtual HRESULT wxSTDCALL get_clientHeight(long *p) = 0; + virtual HRESULT wxSTDCALL get_clientWidth(long *p) = 0; + virtual HRESULT wxSTDCALL get_clientTop(long *p) = 0; + virtual HRESULT wxSTDCALL get_clientLeft(long *p) = 0; + virtual HRESULT wxSTDCALL attachEvent(BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL detachEvent(BSTR event, IDispatch *pDisp) = 0; + virtual HRESULT wxSTDCALL get_readyState(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onreadystatechange(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onreadystatechange(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onrowsdelete(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onrowsdelete(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_onrowsinserted(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onrowsinserted(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_oncellchange(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_oncellchange(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL put_dir(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_dir(BSTR *p) = 0; + virtual HRESULT wxSTDCALL createControlRange(IDispatch **range) = 0; + virtual HRESULT wxSTDCALL get_scrollHeight(long *p) = 0; + virtual HRESULT wxSTDCALL get_scrollWidth(long *p) = 0; + virtual HRESULT wxSTDCALL put_scrollTop(long v) = 0; + virtual HRESULT wxSTDCALL get_scrollTop(long *p) = 0; + virtual HRESULT wxSTDCALL put_scrollLeft(long v) = 0; + virtual HRESULT wxSTDCALL get_scrollLeft(long *p) = 0; + virtual HRESULT wxSTDCALL clearAttributes(void) = 0; + virtual HRESULT wxSTDCALL mergeAttributes(IHTMLElement *mergeThis) = 0; + virtual HRESULT wxSTDCALL put_oncontextmenu(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_oncontextmenu(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL insertAdjacentElement(BSTR where, IHTMLElement *insertedElement, IHTMLElement **inserted) = 0; + virtual HRESULT wxSTDCALL applyElement(IHTMLElement *apply, BSTR where, IHTMLElement **applied) = 0; + virtual HRESULT wxSTDCALL getAdjacentText(BSTR where, BSTR *text) = 0; + virtual HRESULT wxSTDCALL replaceAdjacentText(BSTR where, BSTR newText, BSTR *oldText) = 0; + virtual HRESULT wxSTDCALL get_canHaveChildren(VARIANT_BOOL *p) = 0; + virtual HRESULT wxSTDCALL addBehavior(BSTR bstrUrl, VARIANT *pvarFactory, long *pCookie) = 0; + virtual HRESULT wxSTDCALL removeBehavior(long cookie, VARIANT_BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL get_runtimeStyle(wxIHTMLStyle **p) = 0; + virtual HRESULT wxSTDCALL get_behaviorUrns(IDispatch **p) = 0; + virtual HRESULT wxSTDCALL put_tagUrn(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_tagUrn(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_onbeforeeditfocus(VARIANT v) = 0; + virtual HRESULT wxSTDCALL get_onbeforeeditfocus(VARIANT *p) = 0; + virtual HRESULT wxSTDCALL get_readyStateValue(long *p) = 0; + virtual HRESULT wxSTDCALL getElementsByTagName(BSTR v, + wxIHTMLElementCollection **pelColl) = 0; +}; + +struct wxIHTMLTxtRange : public IDispatch +{ +public: + virtual HRESULT wxSTDCALL get_htmlText(BSTR *p) = 0; + virtual HRESULT wxSTDCALL put_text(BSTR v) = 0; + virtual HRESULT wxSTDCALL get_text(BSTR *p) = 0; + virtual HRESULT wxSTDCALL parentElement(IHTMLElement **parent) = 0; + virtual HRESULT wxSTDCALL duplicate(wxIHTMLTxtRange **Duplicate) = 0; + virtual HRESULT wxSTDCALL inRange(wxIHTMLTxtRange *Range, VARIANT_BOOL *InRange) = 0; + virtual HRESULT wxSTDCALL isEqual(wxIHTMLTxtRange *Range, VARIANT_BOOL *IsEqual) = 0; + virtual HRESULT wxSTDCALL scrollIntoView(VARIANT_BOOL fStart = -1) = 0; + virtual HRESULT wxSTDCALL collapse(VARIANT_BOOL Start = -1) = 0; + virtual HRESULT wxSTDCALL expand(BSTR Unit, VARIANT_BOOL *Success) = 0; + virtual HRESULT wxSTDCALL move(BSTR Unit, long Count, long *ActualCount) = 0; + virtual HRESULT wxSTDCALL moveStart(BSTR Unit, long Count, long *ActualCount) = 0; + virtual HRESULT wxSTDCALL moveEnd(BSTR Unit, long Count, long *ActualCount) = 0; + virtual HRESULT wxSTDCALL select(void) = 0; + virtual HRESULT wxSTDCALL pasteHTML(BSTR html) = 0; + virtual HRESULT wxSTDCALL moveToElementText(IHTMLElement *element) = 0; + virtual HRESULT wxSTDCALL setEndPoint(BSTR how, wxIHTMLTxtRange *SourceRange) = 0; + virtual HRESULT wxSTDCALL compareEndPoints(BSTR how, wxIHTMLTxtRange *SourceRange, long *ret) = 0; + virtual HRESULT wxSTDCALL findText(BSTR String, long count, long Flags, VARIANT_BOOL *Success) = 0; + virtual HRESULT wxSTDCALL moveToPoint(long x, long y) = 0; + virtual HRESULT wxSTDCALL getBookmark(BSTR *Boolmark) = 0; + virtual HRESULT wxSTDCALL moveToBookmark(BSTR Bookmark, VARIANT_BOOL *Success) = 0; + virtual HRESULT wxSTDCALL queryCommandSupported(BSTR cmdID, VARIANT_BOOL *pfRet) = 0; + virtual HRESULT wxSTDCALL queryCommandEnabled(BSTR cmdID, VARIANT_BOOL *pfRet) = 0; + virtual HRESULT wxSTDCALL queryCommandState(BSTR cmdID, VARIANT_BOOL *pfRet) = 0; + virtual HRESULT wxSTDCALL queryCommandIndeterm(BSTR cmdID, VARIANT_BOOL *pfRet) = 0; + virtual HRESULT wxSTDCALL queryCommandText(BSTR cmdID, BSTR *pcmdText) = 0; + virtual HRESULT wxSTDCALL queryCommandValue(BSTR cmdID, VARIANT *pcmdValue) = 0; + virtual HRESULT wxSTDCALL execCommand(BSTR cmdID, VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet) = 0; + virtual HRESULT wxSTDCALL execCommandShowHelp(BSTR cmdID, VARIANT_BOOL *pfRet) = 0; +}; + +struct wxIMarkupContainer : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL OwningDoc(IHTMLDocument2 **ppDoc) = 0; +}; + +struct wxIMarkupPointer : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL OwningDoc(IHTMLDocument2 **ppDoc) = 0; + virtual HRESULT wxSTDCALL Gravity(wxPOINTER_GRAVITY *pGravity) = 0; + virtual HRESULT wxSTDCALL SetGravity(wxPOINTER_GRAVITY Gravity) = 0; + virtual HRESULT wxSTDCALL Cling(BOOL *pfCling) = 0; + virtual HRESULT wxSTDCALL SetCling(BOOL fCLing) = 0; + virtual HRESULT wxSTDCALL Unposition(void) = 0; + virtual HRESULT wxSTDCALL IsPositioned(BOOL *pfPositioned) = 0; + virtual HRESULT wxSTDCALL GetContainer(wxIMarkupContainer **ppContainer) = 0; + virtual HRESULT wxSTDCALL MoveAdjacentToElement(IHTMLElement *pElement, wxELEMENT_ADJACENCY eAdj) = 0; + virtual HRESULT wxSTDCALL MoveToPointer(wxIMarkupPointer *pPointer) = 0; + virtual HRESULT wxSTDCALL MoveToContainer(wxIMarkupContainer *pContainer, BOOL fAtStart) = 0; + virtual HRESULT wxSTDCALL Left(BOOL fMove, wxMARKUP_CONTEXT_TYPE *pContext, IHTMLElement **ppElement, long *pcch, OLECHAR *pchText) = 0; + virtual HRESULT wxSTDCALL Right(BOOL fMove, wxMARKUP_CONTEXT_TYPE *pContext, IHTMLElement **ppElement, long *pcch, OLECHAR *pchText) = 0; + virtual HRESULT wxSTDCALL CurrentScope(IHTMLElement **ppElemCurrent) = 0; + virtual HRESULT wxSTDCALL IsLeftOf(wxIMarkupPointer *pPointerThat, BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL IsLeftOfOrEqualTo(wxIMarkupPointer *pPointerThat, BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL IsRightOf(wxIMarkupPointer *pPointerThat, BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL IsRightOfOrEqualTo(wxIMarkupPointer *pPointerThat, BOOL *pfResult) = 0; + virtual HRESULT wxSTDCALL IsEqualTo(wxIMarkupPointer *pPointerThat, BOOL *pfAreEqual) = 0; + virtual HRESULT wxSTDCALL MoveUnit(wxMOVEUNIT_ACTION muAction) = 0; + virtual HRESULT wxSTDCALL FindText(OLECHAR *pchFindText, DWORD dwFlags, wxIMarkupPointer *pIEndMatch, wxIMarkupPointer *pIEndSearch) = 0; +}; + +struct wxIMarkupServices : public IUnknown +{ +public: + virtual HRESULT wxSTDCALL CreateMarkupPointer(wxIMarkupPointer **ppPointer) = 0; + virtual HRESULT wxSTDCALL CreateMarkupContainer(wxIMarkupContainer **ppMarkupContainer) = 0; + virtual HRESULT wxSTDCALL CreateElement(wxELEMENT_TAG_ID tagID, OLECHAR *pchAttributes, IHTMLElement **ppElement) = 0; + virtual HRESULT wxSTDCALL CloneElement(IHTMLElement *pElemCloneThis, IHTMLElement **ppElementTheClone) = 0; + virtual HRESULT wxSTDCALL InsertElement(IHTMLElement *pElementInsert, wxIMarkupPointer *pPointerStart, wxIMarkupPointer *pPointerFinish) = 0; + virtual HRESULT wxSTDCALL RemoveElement(IHTMLElement *pElementRemove) = 0; + virtual HRESULT wxSTDCALL Remove(wxIMarkupPointer *pPointerStart, wxIMarkupPointer *pPointerFinish) = 0; + virtual HRESULT wxSTDCALL Copy(wxIMarkupPointer *pPointerSourceStart, wxIMarkupPointer *pPointerSourceFinish, wxIMarkupPointer *pPointerTarget) = 0; + virtual HRESULT wxSTDCALL Move(wxIMarkupPointer *pPointerSourceStart, wxIMarkupPointer *pPointerSourceFinish, wxIMarkupPointer *pPointerTarget) = 0; + virtual HRESULT wxSTDCALL InsertText(OLECHAR *pchText, long cch, wxIMarkupPointer *pPointerTarget) = 0; + virtual HRESULT wxSTDCALL ParseString(OLECHAR *pchHTML, DWORD dwFlags, wxIMarkupContainer **ppContainerResult, wxIMarkupPointer *ppPointerStart, wxIMarkupPointer *ppPointerFinish) = 0; + virtual HRESULT wxSTDCALL ParseGlobal(HGLOBAL hglobalHTML, DWORD dwFlags, wxIMarkupContainer **ppContainerResult, wxIMarkupPointer *pPointerStart, wxIMarkupPointer *pPointerFinish) = 0; + virtual HRESULT wxSTDCALL IsScopedElement(IHTMLElement *pElement, BOOL *pfScoped) = 0; + virtual HRESULT wxSTDCALL GetElementTagId(IHTMLElement *pElement, wxELEMENT_TAG_ID *ptagId) = 0; + virtual HRESULT wxSTDCALL GetTagIDForName(BSTR bstrName, wxELEMENT_TAG_ID *ptagId) = 0; + virtual HRESULT wxSTDCALL GetNameForTagID(wxELEMENT_TAG_ID tagId, BSTR *pbstrName) = 0; + virtual HRESULT wxSTDCALL MovePointersToRange(wxIHTMLTxtRange *pIRange, wxIMarkupPointer *pPointerStart, wxIMarkupPointer *pPointerFinish) = 0; + virtual HRESULT wxSTDCALL MoveRangeToPointers(wxIMarkupPointer *pPointerStart, wxIMarkupPointer *pPointerFinish, wxIHTMLTxtRange *pIRange) = 0; + virtual HRESULT wxSTDCALL BeginUndoUnit(OLECHAR *pchTitle) = 0; + virtual HRESULT wxSTDCALL EndUndoUnit(void) = 0; +}; + +/* end of mshtml.h */ + +/* WinInet.h */ + +#ifndef HTTP_STATUS_BAD_REQUEST +#define HTTP_STATUS_BAD_REQUEST 400 +#endif + +#ifndef HTTP_STATUS_DENIED +#define HTTP_STATUS_DENIED 401 +#endif + +#ifndef HTTP_STATUS_PAYMENT_REQ +#define HTTP_STATUS_PAYMENT_REQ 402 +#endif + +#ifndef HTTP_STATUS_FORBIDDEN +#define HTTP_STATUS_FORBIDDEN 403 +#endif + +#ifndef HTTP_STATUS_NOT_FOUND +#define HTTP_STATUS_NOT_FOUND 404 +#endif + +#ifndef HTTP_STATUS_BAD_METHOD +#define HTTP_STATUS_BAD_METHOD 405 +#endif + +#ifndef HTTP_STATUS_NONE_ACCEPTABLE +#define HTTP_STATUS_NONE_ACCEPTABLE 406 +#endif + +#ifndef HTTP_STATUS_PROXY_AUTH_REQ +#define HTTP_STATUS_PROXY_AUTH_REQ 407 +#endif + +#ifndef HTTP_STATUS_REQUEST_TIMEOUT +#define HTTP_STATUS_REQUEST_TIMEOUT 408 +#endif + +#ifndef HTTP_STATUS_CONFLICT +#define HTTP_STATUS_CONFLICT 409 +#endif + +#ifndef HTTP_STATUS_GONE +#define HTTP_STATUS_GONE 410 +#endif + +#ifndef HTTP_STATUS_LENGTH_REQUIRED +#define HTTP_STATUS_LENGTH_REQUIRED 411 +#endif + +#ifndef HTTP_STATUS_PRECOND_FAILED +#define HTTP_STATUS_PRECOND_FAILED 412 +#endif + +#ifndef HTTP_STATUS_REQUEST_TOO_LARGE +#define HTTP_STATUS_REQUEST_TOO_LARGE 413 +#endif + +#ifndef HTTP_STATUS_URI_TOO_LONG +#define HTTP_STATUS_URI_TOO_LONG 414 +#endif + +#ifndef HTTP_STATUS_UNSUPPORTED_MEDIA +#define HTTP_STATUS_UNSUPPORTED_MEDIA 415 +#endif + +#ifndef HTTP_STATUS_RETRY_WITH +#define HTTP_STATUS_RETRY_WITH 449 +#endif + +#ifndef HTTP_STATUS_SERVER_ERROR +#define HTTP_STATUS_SERVER_ERROR 500 +#endif + +#ifndef HTTP_STATUS_NOT_SUPPORTED +#define HTTP_STATUS_NOT_SUPPORTED 501 +#endif + +#ifndef HTTP_STATUS_BAD_GATEWAY +#define HTTP_STATUS_BAD_GATEWAY 502 +#endif + +#ifndef HTTP_STATUS_SERVICE_UNAVAIL +#define HTTP_STATUS_SERVICE_UNAVAIL 503 +#endif + +#ifndef HTTP_STATUS_GATEWAY_TIMEOUT +#define HTTP_STATUS_GATEWAY_TIMEOUT 504 +#endif + +#ifndef HTTP_STATUS_VERSION_NOT_SUP +#define HTTP_STATUS_VERSION_NOT_SUP 505 +#endif + +/* end of WinInet.h */ + diff --git a/Externals/wxWidgets3/include/wx/msw/webviewhistoryitem_ie.h b/Externals/wxWidgets3/include/wx/msw/webviewhistoryitem_ie.h index acfec70014..6edfbb3932 100644 --- a/Externals/wxWidgets3/include/wx/msw/webviewhistoryitem_ie.h +++ b/Externals/wxWidgets3/include/wx/msw/webviewhistoryitem_ie.h @@ -2,7 +2,6 @@ // Name: include/wx/msw/webviewhistoryitem.h // Purpose: wxWebViewHistoryItem header for MSW // Author: Steven Lamerton -// Id: $Id: webviewhistoryitem_ie.h 69074 2011-09-12 18:35:39Z SJL $ // Copyright: (c) 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,7 @@ class WXDLLIMPEXP_WEBVIEW wxWebViewHistoryItem { public: - wxWebViewHistoryItem(const wxString& url, const wxString& title) : + wxWebViewHistoryItem(const wxString& url, const wxString& title) : m_url(url), m_title(title) {} wxString GetUrl() { return m_url; } wxString GetTitle() { return m_title; } diff --git a/Externals/wxWidgets3/include/wx/msw/wince/checklst.h b/Externals/wxWidgets3/include/wx/msw/wince/checklst.h index ef44415177..61121298bc 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/checklst.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/checklst.h @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 30.10.2005 -// RCS-ID: $Id: checklst.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/chkconf.h b/Externals/wxWidgets3/include/wx/msw/wince/chkconf.h index 872c8d8ccb..00785067ee 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/chkconf.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/chkconf.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-03-07 -// RCS-ID: $Id: chkconf.h 60495 2009-05-03 07:43:00Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/choicece.h b/Externals/wxWidgets3/include/wx/msw/wince/choicece.h index 255027d57c..e280be7fdc 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/choicece.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/choicece.h @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 29.07.2004 -// RCS-ID: $Id: choicece.h 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/helpwce.h b/Externals/wxWidgets3/include/wx/msw/wince/helpwce.h index 669d408fb0..20cd4e405c 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/helpwce.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/helpwce.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-07-12 -// RCS-ID: $Id: helpwce.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/libraries.h b/Externals/wxWidgets3/include/wx/msw/wince/libraries.h index 0d3c9a6226..d05e604ca2 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/libraries.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/libraries.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2004-04-11 -// RCS-ID: $Id: libraries.h 52163 2008-02-28 00:22:02Z VZ $ // Copyright: (c) 2004 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/missing.h b/Externals/wxWidgets3/include/wx/msw/wince/missing.h index 5f45e0a4d1..73f48bea1e 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/missing.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/missing.h @@ -4,7 +4,6 @@ // Author: Marco Cavallini // Modified by: // Created: 16/11/2002 -// RCS-ID: $Id: missing.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) KOAN SAS ( www.koansoftware.com ) // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/resources.h b/Externals/wxWidgets3/include/wx/msw/wince/resources.h index 3ccb65f567..f080518950 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/resources.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/resources.h @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 01.05.2004 -// RCS-ID: $Id: resources.h 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/setup.h b/Externals/wxWidgets3/include/wx/msw/wince/setup.h index a22f9ec48f..9da5f70df9 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/setup.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/setup.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: setup.h 69463 2011-10-18 21:57:02Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -151,7 +150,7 @@ // In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If // this causes problems (e.g. link errors), set this to 0. You may need to set // this to 0 if using templates (at least for VC++). This switch is currently -// ignored for mingw / cygwin / CodeWarrior +// ignored for MinGW/Cygwin. // // Default is 0 // @@ -267,6 +266,17 @@ // Recommended setting: 1 if you want to support multiple languages #define wxUSE_PRINTF_POS_PARAMS 1 +// Enable the use of compiler-specific thread local storage keyword, if any. +// This is used for wxTLS_XXX() macros implementation and normally should use +// the compiler-provided support as it's simpler and more efficient, but must +// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using +// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS +// support that results in crashes when any TLS variables are used. So if you +// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set +// this to 0. +// +// Default is 1, but set to 0 if the scenario above is applicable. +#define wxUSE_COMPILER_TLS 1 // ---------------------------------------------------------------------------- // Interoperability with the standard library. @@ -1087,6 +1097,16 @@ // Recommended setting: 1 #define wxUSE_NOTIFICATION_MESSAGE 1 +// wxPreferencesEditor provides a common API for different ways of presenting +// the standard "Preferences" or "Properties" dialog under different platforms +// (e.g. some use modal dialogs, some use modeless ones; some apply the changes +// immediately while others require an explicit "Apply" button). +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_PREFERENCES_EDITOR 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/Externals/wxWidgets3/include/wx/msw/wince/smartphone.rc b/Externals/wxWidgets3/include/wx/msw/wince/smartphone.rc index d1d7a53fb1..89ac65f450 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/smartphone.rc +++ b/Externals/wxWidgets3/include/wx/msw/wince/smartphone.rc @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 01.05.2004 -// RCS-ID: $Id: smartphone.rc 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wince/tbarwce.h b/Externals/wxWidgets3/include/wx/msw/wince/tbarwce.h index 41d44623b6..12cfd7e8fe 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/tbarwce.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/tbarwce.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-07-12 -// RCS-ID: $Id: tbarwce.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,7 +28,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr) { Create(parent, id, pos, size, style, name); @@ -39,7 +38,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr); // override/implement base class virtuals @@ -88,7 +87,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr, wxMenuBar* menuBar = NULL) { @@ -101,7 +100,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER | wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr, wxMenuBar* menuBar = NULL); diff --git a/Externals/wxWidgets3/include/wx/msw/wince/textctrlce.h b/Externals/wxWidgets3/include/wx/msw/wince/textctrlce.h index 0f4ecbca5b..3c51633b0a 100644 --- a/Externals/wxWidgets3/include/wx/msw/wince/textctrlce.h +++ b/Externals/wxWidgets3/include/wx/msw/wince/textctrlce.h @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 30.08.2004 -// RCS-ID: $Id: textctrlce.h 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) Wlodzimierz Skiba // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/window.h b/Externals/wxWidgets3/include/wx/msw/window.h index afb6df7a60..3475f3d6b7 100644 --- a/Externals/wxWidgets3/include/wx/msw/window.h +++ b/Externals/wxWidgets3/include/wx/msw/window.h @@ -5,7 +5,6 @@ // Modified by: Vadim Zeitlin on 13.05.99: complete refont of message handling, // elimination of Default(), ... // Created: 01/02/97 -// RCS-ID: $Id: window.h 69348 2011-10-09 22:01:57Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -67,6 +66,9 @@ public: virtual void Raise(); virtual void Lower(); + virtual bool BeginRepositioningChildren(); + virtual void EndRepositioningChildren(); + virtual bool Show(bool show = true); virtual bool ShowWithEffect(wxShowEffect effect, unsigned timeout = 0) @@ -345,12 +347,13 @@ public: bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags); bool HandleMouseMove(int x, int y, WXUINT flags); - bool HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam); + bool HandleMouseWheel(wxMouseWheelAxis axis, + WXWPARAM wParam, WXLPARAM lParam); bool HandleChar(WXWPARAM wParam, WXLPARAM lParam); bool HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam); bool HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam); -#if wxUSE_ACCEL +#if wxUSE_HOTKEY bool HandleHotKey(WXWPARAM wParam, WXLPARAM lParam); #endif #ifdef __WIN32__ @@ -409,6 +412,17 @@ public: // weird wxToolBar case and MSWGetBgBrushForChild() itself is used by // MSWGetBgBrush() to actually find the right brush to use. + // Adjust the origin for the brush returned by MSWGetBgBrushForChild(). + // + // This needs to be overridden for scrolled windows to ensure that the + // scrolling of their associated DC is taken into account. + // + // Both parameters must be non-NULL. + virtual void MSWAdjustBrushOrg(int* WXUNUSED(xOrg), + int* WXUNUSED(yOrg)) const + { + } + // The brush returned from here must remain valid at least until the next // event loop iteration. Returning 0, as is done by default, indicates // there is no custom background brush. diff --git a/Externals/wxWidgets3/include/wx/msw/winundef.h b/Externals/wxWidgets3/include/wx/msw/winundef.h index 4f1f74791a..af44c49aea 100644 --- a/Externals/wxWidgets3/include/wx/msw/winundef.h +++ b/Externals/wxWidgets3/include/wx/msw/winundef.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 16.05.99 -// RCS-ID: $Id: winundef.h 63658 2010-03-09 11:08:52Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -248,26 +247,20 @@ #endif -/* - When this file is included, sometimes the wxCHECK_W32API_VERSION macro - is undefined. With for example CodeWarrior this gives problems with - the following code: - #if 0 && wxCHECK_W32API_VERSION( 0, 5 ) - Because CodeWarrior does macro expansion before test evaluation. - We define wxCHECK_W32API_VERSION here if it's undefined. -*/ -#if !defined(__GNUG__) && !defined(wxCHECK_W32API_VERSION) - #define wxCHECK_W32API_VERSION(maj, min) (0) -#endif - // StartDoc #ifdef StartDoc #undef StartDoc - #if defined( __GNUG__ ) && !wxCHECK_W32API_VERSION( 0, 5 ) - #define DOCINFOW DOCINFO - #define DOCINFOA DOCINFO + + // Work around a bug in very old MinGW headers that didn't define DOCINFOW + // and DOCINFOA but only DOCINFO in both ANSI and Unicode. + #if defined( __GNUG__ ) + #if !wxCHECK_W32API_VERSION( 0, 5 ) + #define DOCINFOW DOCINFO + #define DOCINFOA DOCINFO + #endif #endif + #ifdef _UNICODE inline int StartDoc(HDC h, CONST DOCINFOW* info) { diff --git a/Externals/wxWidgets3/include/wx/msw/wrapcctl.h b/Externals/wxWidgets3/include/wx/msw/wrapcctl.h index 3164ec3856..036e191139 100644 --- a/Externals/wxWidgets3/include/wx/msw/wrapcctl.h +++ b/Externals/wxWidgets3/include/wx/msw/wrapcctl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.08.2003 -// RCS-ID: $Id: wrapcctl.h 57093 2008-12-03 21:53:10Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wrapcdlg.h b/Externals/wxWidgets3/include/wx/msw/wrapcdlg.h index 733e1b5f99..fe663119ec 100644 --- a/Externals/wxWidgets3/include/wx/msw/wrapcdlg.h +++ b/Externals/wxWidgets3/include/wx/msw/wrapcdlg.h @@ -4,7 +4,6 @@ // Author: Wlodzimierz ABX Skiba // Modified by: // Created: 22.03.2005 -// RCS-ID: $Id: wrapcdlg.h 43151 2006-11-07 09:08:33Z JS $ // Copyright: (c) 2005 Wlodzimierz Skiba // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wrapgdip.h b/Externals/wxWidgets3/include/wx/msw/wrapgdip.h index 0dcf913e09..04d4009a67 100644 --- a/Externals/wxWidgets3/include/wx/msw/wrapgdip.h +++ b/Externals/wxWidgets3/include/wx/msw/wrapgdip.h @@ -3,7 +3,6 @@ // Purpose: wrapper around header // Author: Vadim Zeitlin // Created: 2007-03-15 -// RCS-ID: $Id: wrapgdip.h 44815 2007-03-15 03:41:52Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wrapshl.h b/Externals/wxWidgets3/include/wx/msw/wrapshl.h index 872f78255c..8826a039ba 100644 --- a/Externals/wxWidgets3/include/wx/msw/wrapshl.h +++ b/Externals/wxWidgets3/include/wx/msw/wrapshl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-10-19 -// RCS-ID: $Id: wrapshl.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/msw/wrapwin.h b/Externals/wxWidgets3/include/wx/msw/wrapwin.h index 8ddd5fe79e..266179847e 100644 --- a/Externals/wxWidgets3/include/wx/msw/wrapwin.h +++ b/Externals/wxWidgets3/include/wx/msw/wrapwin.h @@ -3,7 +3,6 @@ // Purpose: Wrapper around , to be included instead of it // Author: Vaclav Slavik // Created: 2003/07/22 -// RCS-ID: $Id: wrapwin.h 69784 2011-11-17 16:43:34Z VZ $ // Copyright: (c) 2003 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -72,7 +71,7 @@ // #undef the macros defined in winsows.h which conflict with code elsewhere #include "wx/msw/winundef.h" -// Types DWORD_PTR, ULONG_PTR and so on are used for 64-bit compatability +// Types DWORD_PTR, ULONG_PTR and so on are used for 64-bit compatibility // in the WINAPI SDK (they are an integral type that is the size of a // pointer) on MSVC 7 and later. However, they are not available in older // Platform SDKs, and since they are typedefs and not #defines we simply diff --git a/Externals/wxWidgets3/include/wx/msw/wx.rc b/Externals/wxWidgets3/include/wx/msw/wx.rc index 5caede958e..702861a287 100644 --- a/Externals/wxWidgets3/include/wx/msw/wx.rc +++ b/Externals/wxWidgets3/include/wx/msw/wx.rc @@ -6,15 +6,10 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: wx.rc 46316 2007-06-04 09:01:37Z VS $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__MWERKS__) -#include -#else #include -#endif #if defined(_WIN32_WCE) #include "wx/msw/wince/wince.rc" @@ -54,7 +49,6 @@ WXCURSOR_PBRUSH CURSOR DISCARDABLE "wx/msw/pbrush.cur" WXCURSOR_PLEFT CURSOR DISCARDABLE "wx/msw/pntleft.cur" WXCURSOR_PRIGHT CURSOR DISCARDABLE "wx/msw/pntright.cur" WXCURSOR_BLANK CURSOR DISCARDABLE "wx/msw/blank.cur" -WXCURSOR_RIGHT_ARROW CURSOR DISCARDABLE "wx/msw/rightarr.cur" WXCURSOR_CROSS CURSOR DISCARDABLE "wx/msw/cross.cur" @@ -94,14 +88,15 @@ wxBITMAP_STD_COLOURS BITMAP "wx/msw/colours.bmp" ////////////////////////////////////////////////////////////////////////////// // -// Manifest file for Windows XP +// Include manifest file for common controls library v6 required to use themes. +// +// Predefining wxUSE_NO_MANIFEST as 1 always disables the use of the manifest. +// Otherwise we include it only if wxUSE_RC_MANIFEST is defined as 1. // #if !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) -// Visual Studio 2005 generates the manifest automatically and so we -// shouldn't include it in the resources manually: -#if !defined(WX_MSC_FULL_VER) || WX_MSC_FULL_VER < 140040130 +#if defined(wxUSE_RC_MANIFEST) && wxUSE_RC_MANIFEST // see "about isolated applications" topic in MSDN #ifdef ISOLATION_AWARE_ENABLED @@ -116,8 +111,16 @@ wxMANIFEST_ID 24 "wx/msw/amd64.manifest" wxMANIFEST_ID 24 "wx/msw/ia64.manifest" #elif defined(WX_CPU_X86) wxMANIFEST_ID 24 "wx/msw/wx.manifest" +#else +// Notice that if the manifest is included, WX_CPU_XXX constant corresponding +// to the architecture we're compiling for must be defined. This can be done +// either manually in your make/project file or by configuring the resource +// compiler paths to search in $(WXWIN)/lib/$(COMPILER_PREFIX)_lib/mswu[d] +// directory for its include files, as wx/msw/rcdefs.h file in this directory +// is generated during wxWidgets build and contains the correct definition. +#error "One of WX_CPU_XXX constants must be defined. See comment above." #endif -#endif // !defined(WX_MSC_FULL_VER) || WX_MSC_FULL_VER < 140040130 +#endif // wxUSE_RC_MANIFEST #endif // !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) diff --git a/Externals/wxWidgets3/include/wx/nativewin.h b/Externals/wxWidgets3/include/wx/nativewin.h index 20f637fb55..e0328e9583 100644 --- a/Externals/wxWidgets3/include/wx/nativewin.h +++ b/Externals/wxWidgets3/include/wx/nativewin.h @@ -3,7 +3,6 @@ // Purpose: classes allowing to wrap a native window handle // Author: Vadim Zeitlin // Created: 2008-03-05 -// RCS-ID: $Id: nativewin.h 62783 2009-12-05 17:31:07Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -39,9 +38,12 @@ typedef HWND wxNativeContainerWindowId; typedef HWND wxNativeContainerWindowHandle; #elif defined(__WXGTK__) - #include - - typedef GdkNativeWindow wxNativeContainerWindowId; + // GdkNativeWindow is guint32 under GDK/X11 and gpointer under GDK/WIN32 + #ifdef __UNIX__ + typedef unsigned long wxNativeContainerWindowId; + #else + typedef void *wxNativeContainerWindowId; + #endif typedef GdkWindow *wxNativeContainerWindowHandle; #else // no support for using native windows under this platform yet diff --git a/Externals/wxWidgets3/include/wx/nonownedwnd.h b/Externals/wxWidgets3/include/wx/nonownedwnd.h index 03888e4140..7d8709933d 100644 --- a/Externals/wxWidgets3/include/wx/nonownedwnd.h +++ b/Externals/wxWidgets3/include/wx/nonownedwnd.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2006-12-24 -// RCS-ID: $Id: nonownedwnd.h 70813 2012-03-05 13:00:57Z VZ $ // Copyright: (c) 2006 TT-Solutions // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/notebook.h b/Externals/wxWidgets3/include/wx/notebook.h index 98bb521f37..1535229aa0 100644 --- a/Externals/wxWidgets3/include/wx/notebook.h +++ b/Externals/wxWidgets3/include/wx/notebook.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 01.02.01 -// RCS-ID: $Id: notebook.h 66555 2011-01-04 08:31:53Z SC $ // Copyright: (c) 1996-2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -132,7 +131,7 @@ public: virtual wxColour GetThemeBackgroundColour() const { return wxNullColour; } - // send wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING/ED events + // send wxEVT_NOTEBOOK_PAGE_CHANGING/ED events // returns false if the change to nPage is vetoed by the program bool SendPageChangingEvent(int nPage); @@ -169,14 +168,14 @@ protected: typedef wxBookCtrlEventFunction wxNotebookEventFunction; #define wxNotebookEventHandler(func) wxBookCtrlEventHandler(func) -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_NOTEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_NOTEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); #define EVT_NOTEBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_NOTEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) #define EVT_NOTEBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_NOTEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) // ---------------------------------------------------------------------------- // wxNotebook class itself @@ -200,6 +199,10 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING #include "wx/os2/notebook.h" #endif +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_NOTEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_NOTEBOOK_PAGE_CHANGING + #endif // wxUSE_NOTEBOOK #endif diff --git a/Externals/wxWidgets3/include/wx/notifmsg.h b/Externals/wxWidgets3/include/wx/notifmsg.h index fd91fe2e3b..fe49c8763c 100644 --- a/Externals/wxWidgets3/include/wx/notifmsg.h +++ b/Externals/wxWidgets3/include/wx/notifmsg.h @@ -3,7 +3,6 @@ // Purpose: class allowing to show notification messages to the user // Author: Vadim Zeitlin // Created: 2007-11-19 -// RCS-ID: $Id: notifmsg.h 62071 2009-09-24 12:36:34Z JS $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -127,13 +126,14 @@ private: wxDECLARE_NO_COPY_CLASS(wxNotificationMessageBase); }; -#if defined(__WXGTK__) && (wxUSE_LIBHILDON || wxUSE_LIBHILDON2) - #include "wx/gtk/hildon/notifmsg.h" /* - TODO: provide support for - - libnotify (Gnome) - - Growl (http://growl.info/, OS X) + TODO: Implement under OS X using notification centre (10.8+) or + Growl (http://growl.info/) for the previous versions. */ +#if defined(__WXGTK__) && wxUSE_LIBNOTIFY + #include "wx/gtk/notifmsg.h" +#elif defined(__WXGTK__) && (wxUSE_LIBHILDON || wxUSE_LIBHILDON2) + #include "wx/gtk/hildon/notifmsg.h" #elif defined(__WXMSW__) && wxUSE_TASKBARICON && wxUSE_TASKBARICON_BALLOONS #include "wx/msw/notifmsg.h" #else diff --git a/Externals/wxWidgets3/include/wx/numdlg.h b/Externals/wxWidgets3/include/wx/numdlg.h index a3a1505fc2..c1c39742ec 100644 --- a/Externals/wxWidgets3/include/wx/numdlg.h +++ b/Externals/wxWidgets3/include/wx/numdlg.h @@ -4,7 +4,6 @@ // Author: John Labenski // Modified by: // Created: 07.02.04 (extracted from wx/textdlg.h) -// RCS-ID: $Id: numdlg.h 37157 2006-01-26 15:33:27Z ABX $ // Copyright: (c) John Labenski // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/object.h b/Externals/wxWidgets3/include/wx/object.h index 6e01ab8caa..04c6512254 100644 --- a/Externals/wxWidgets3/include/wx/object.h +++ b/Externals/wxWidgets3/include/wx/object.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Ron Lee // Created: 01/02/97 -// RCS-ID: $Id: object.h 66650 2011-01-08 08:03:42Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2001 Ron Lee // Licence: wxWindows licence @@ -195,9 +194,8 @@ inline T *wxCheckCast(const void *ptr, T * = NULL) #define _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET #endif -// Only VC++ 6 and CodeWarrior get overloaded delete that matches new -#if (defined(__VISUALC__) && (__VISUALC__ >= 1200)) || \ - (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) +// Only VC++ 6 gets overloaded delete that matches new +#if (defined(__VISUALC__) && (__VISUALC__ >= 1200)) #define _WX_WANT_DELETE_VOID_WXCHAR_INT #endif @@ -213,12 +211,6 @@ inline T *wxCheckCast(const void *ptr, T * = NULL) #if !defined(__VISUALC__) #define _WX_WANT_ARRAY_DELETE_VOID #endif - - // Only CodeWarrior 6 or higher - #if defined(__MWERKS__) && (__MWERKS__ >= 0x2400) - #define _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT - #endif - #endif // wxUSE_ARRAY_MEMORY_OPERATORS #endif // wxUSE_MEMORY_TRACING diff --git a/Externals/wxWidgets3/include/wx/odcombo.h b/Externals/wxWidgets3/include/wx/odcombo.h index 6e2d9efb86..af0f1160d8 100644 --- a/Externals/wxWidgets3/include/wx/odcombo.h +++ b/Externals/wxWidgets3/include/wx/odcombo.h @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id: odcombo.h 68460 2011-07-30 11:30:08Z VZ $ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -355,6 +354,10 @@ protected: // Callback for item width, or -1 for default/undetermined virtual wxCoord OnMeasureItemWidth( size_t item ) const; + // override base implementation so we can return the size for the + // largest item + virtual wxSize DoGetBestSize() const; + // Callback for background drawing. Flags are same as with // OnDrawItem. virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const; diff --git a/Externals/wxWidgets3/include/wx/osx/accel.h b/Externals/wxWidgets3/include/wx/osx/accel.h index 1a61174518..a6690acf5f 100644 --- a/Externals/wxWidgets3/include/wx/osx/accel.h +++ b/Externals/wxWidgets3/include/wx/osx/accel.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: accel.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/anybutton.h b/Externals/wxWidgets3/include/wx/osx/anybutton.h index 9e11031ae8..ffa28dfb6c 100644 --- a/Externals/wxWidgets3/include/wx/osx/anybutton.h +++ b/Externals/wxWidgets3/include/wx/osx/anybutton.h @@ -3,7 +3,6 @@ // Purpose: wxAnyButton class // Author: Stefan Csomor // Created: 1998-01-01 (extracted from button.h) -// RCS-ID: $Id: anybutton.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/app.h b/Externals/wxWidgets3/include/wx/osx/app.h index 3814c79462..723841913c 100644 --- a/Externals/wxWidgets3/include/wx/osx/app.h +++ b/Externals/wxWidgets3/include/wx/osx/app.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: app.h 68617 2011-08-09 22:17:12Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -83,14 +82,21 @@ public: // TODO change semantics to be in line with cocoa (make autrelease NOT increase the count) void MacAddToAutorelease( void* cfrefobj ); void MacReleaseAutoreleasePool(); + public: static wxWindow* s_captureWindow ; static long s_lastModifiers ; int m_nCmdShow; -private: // mac specifics +protected: +#if wxOSX_USE_COCOA + // override for support of custom app controllers + virtual WX_NSObject OSXCreateAppController(); +#endif + +private: virtual bool DoInitGui(); virtual void DoCleanUp(); @@ -109,10 +115,10 @@ public: // For embedded use. By default does nothing. virtual void MacHandleUnhandledEvent( WXEVENTREF ev ); - bool MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; - bool MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; - bool MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; - void MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; + bool MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , wxChar uniChar ) ; + bool MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , wxChar uniChar ) ; + bool MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar ) ; + void MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar ) ; #if wxOSX_USE_CARBON // we only have applescript on these virtual short MacHandleAEODoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ; @@ -135,7 +141,23 @@ public: virtual void MacNewFile() ; // in response of a reopen-application apple event virtual void MacReopenApp() ; +#if wxOSX_USE_COCOA_OR_IPHONE + // immediately before the native event loop launches + virtual void OSXOnWillFinishLaunching(); + // immediately when the native event loop starts, no events have been served yet + virtual void OSXOnDidFinishLaunching(); + // OS asks to terminate app, return no to stay running + virtual bool OSXOnShouldTerminate(); + // before application terminates + virtual void OSXOnWillTerminate(); +private: + bool m_onInitResult; + +public: + +#endif + // Hide the application windows the same as the system hide command would do it. void MacHideApp(); diff --git a/Externals/wxWidgets3/include/wx/osx/bitmap.h b/Externals/wxWidgets3/include/wx/osx/bitmap.h index 0f2d861083..8f51d7678f 100644 --- a/Externals/wxWidgets3/include/wx/osx/bitmap.h +++ b/Externals/wxWidgets3/include/wx/osx/bitmap.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: bitmap.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -57,6 +56,8 @@ public: bool Create(const wxBitmap& bitmap); bool Create(const wxMemoryBuffer& buf, int width , int height , int bytesPerRow ) ; + wxBitmap GetBitmap() const; + // Implementation below void Init() ; @@ -102,14 +103,19 @@ public: wxBitmap(const void* data, wxBitmapType type, int width, int height, int depth = 1); // creates an bitmap from the native image format - wxBitmap(CGImageRef image); + wxBitmap(CGImageRef image, double scale = 1.0); + wxBitmap(WX_NSImage image); + wxBitmap(CGContextRef bitmapcontext); + // Create a bitmap compatible with the given DC + wxBitmap(int width, int height, const wxDC& dc); + // If depth is omitted, will create a bitmap compatible with the display wxBitmap(int width, int height, int depth = -1) { (void)Create(width, height, depth); } wxBitmap(const wxSize& sz, int depth = -1) { (void)Create(sz, depth); } // Convert from wxImage: - wxBitmap(const wxImage& image, int depth = -1); + wxBitmap(const wxImage& image, int depth = -1, double scale = 1.0); // Convert from wxIcon wxBitmap(const wxIcon& icon) { CopyFromIcon(icon); } @@ -126,7 +132,15 @@ public: { return Create(sz.GetWidth(), sz.GetHeight(), depth); } virtual bool Create(const void* data, wxBitmapType type, int width, int height, int depth = 1); - bool Create( CGImageRef image ); + bool Create( CGImageRef image, double scale = 1.0 ); + bool Create( WX_NSImage image ); + bool Create( CGContextRef bitmapcontext); + + // Create a bitmap compatible with the given DC, inheriting its magnification factor + bool Create(int width, int height, const wxDC& dc); + + // Create a bitmap with a scale factor, width and height are multiplied with that factor + bool CreateScaled(int logwidth, int logheight, int depth, double logicalScale); // virtual bool Create( WXHICON icon) ; virtual bool LoadFile(const wxString& name, wxBitmapType type = wxBITMAP_DEFAULT_TYPE); @@ -190,6 +204,7 @@ public: void *BeginRawAccess() ; void EndRawAccess() ; + double GetScaleFactor() const; protected: virtual wxGDIRefData *CreateGDIRefData() const; virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; diff --git a/Externals/wxWidgets3/include/wx/osx/bmpbuttn.h b/Externals/wxWidgets3/include/wx/osx/bmpbuttn.h index a84403be6b..4a045fe0b6 100644 --- a/Externals/wxWidgets3/include/wx/osx/bmpbuttn.h +++ b/Externals/wxWidgets3/include/wx/osx/bmpbuttn.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: bmpbuttn.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/brush.h b/Externals/wxWidgets3/include/wx/osx/brush.h index df68d1c9c8..dc04a09b3d 100644 --- a/Externals/wxWidgets3/include/wx/osx/brush.h +++ b/Externals/wxWidgets3/include/wx/osx/brush.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: brush.h 54874 2008-07-31 09:59:04Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/button.h b/Externals/wxWidgets3/include/wx/osx/button.h index a9a7abbd99..8e8752288c 100644 --- a/Externals/wxWidgets3/include/wx/osx/button.h +++ b/Externals/wxWidgets3/include/wx/osx/button.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: button.h 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -49,6 +48,10 @@ public: virtual bool OSXHandleClicked( double timestampsec ); +#if wxOSX_USE_COCOA + void OSXUpdateAfterLabelChange(const wxString& label); +#endif + protected: DECLARE_DYNAMIC_CLASS(wxButton) }; diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h b/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h index 3322f0dcb9..68e395429d 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h @@ -4,7 +4,6 @@ * Author: Julian Smart * Modified by: * Created: 01/02/97 - * RCS-ID: $Id: chkconf.h 61926 2009-09-14 13:07:23Z SC $ * Copyright: (c) Julian Smart * Licence: wxWindows licence */ diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h b/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h index e4dfeb2940..6f7b05acdc 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h @@ -2,7 +2,6 @@ // Name: wx/osx/carbon/dataview.h // Purpose: wxDataViewCtrl native implementation header for carbon // Author: -// Id: $Id: dataview.h 57374 2009-01-27 // Copyright: (c) 2009 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h b/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h index b56e82076b..b20c9dd512 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h @@ -7,7 +7,6 @@ // Author: Jason Bagley // Modified by: // Created: 2004-30-01 -// RCS-ID: $Id: drawer.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Jason Bagley; Art & Logic, Inc. // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/evtloop.h b/Externals/wxWidgets3/include/wx/osx/carbon/evtloop.h index c327fff427..f18c7c9494 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/evtloop.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/evtloop.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2006-01-12 -// RCS-ID: $Id: evtloop.h 68302 2011-07-19 17:56:57Z SC $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -25,9 +24,8 @@ public: protected: virtual int DoDispatchTimeout(unsigned long timeout); - virtual void DoRun(); - - virtual void DoStop(); + virtual void OSXDoRun(); + virtual void OSXDoStop(); virtual CFRunLoopRef CFGetCurrentRunLoop() const; }; diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/mimetype.h b/Externals/wxWidgets3/include/wx/osx/carbon/mimetype.h index 61ab948825..837275285a 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/mimetype.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/mimetype.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 04/16/2005 -// RCS-ID: $Id: mimetype.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2005 Ryan Norton () // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private.h b/Externals/wxWidgets3/include/wx/osx/carbon/private.h index fb26d2687d..82db9b98e5 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: private.h 67233 2011-03-18 15:45:51Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -332,7 +331,6 @@ public : wxBitmap GetBitmap() const; void SetBitmap( const wxBitmap& bitmap ); void SetBitmapPosition( wxDirection dir ); - void SetupTabs( const wxNotebook ¬ebook ); void GetBestRect( wxRect *r ) const; bool IsEnabled() const; diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private/mactext.h b/Externals/wxWidgets3/include/wx/osx/carbon/private/mactext.h index b298c33506..d665abaa0d 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private/mactext.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private/mactext.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 03/02/99 -// RCS-ID: $Id: mactext.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private/overlay.h b/Externals/wxWidgets3/include/wx/osx/carbon/private/overlay.h index f684a407f4..f5ebe1d83e 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private/overlay.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private/overlay.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2006-10-20 -// RCS-ID: $Id: overlay.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private/print.h b/Externals/wxWidgets3/include/wx/osx/carbon/private/print.h index 90d1875537..b00fd619ef 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private/print.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private/print.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 03/02/99 -// RCS-ID: $Id: print.h 65680 2010-09-30 11:44:45Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private/timer.h b/Externals/wxWidgets3/include/wx/osx/carbon/private/timer.h index 7f34e6da7f..0d68d7a204 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private/timer.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private/timer.h @@ -3,7 +3,6 @@ // Purpose: wxTimer class // Author: Stefan Csomor // Created: 1998-01-01 -// RCS-ID: $Id: timer.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/region.h b/Externals/wxWidgets3/include/wx/osx/carbon/region.h index e15ca339d8..f9c3fe3dd3 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/region.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/region.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: region.h 69459 2011-10-18 21:56:40Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -55,6 +54,7 @@ protected: virtual bool DoOffset(wxCoord x, wxCoord y); virtual bool DoCombine(const wxRegion& region, wxRegionOp op); + virtual bool DoUnionWithRect(const wxRect& rect); private: DECLARE_DYNAMIC_CLASS(wxRegion) @@ -86,7 +86,7 @@ public: long GetWidth() const { return GetW(); } long GetH() const; long GetHeight() const { return GetH(); } - wxRect GetRect() const { return wxRect(GetX(), GetY(), GetWidth(), GetHeight()); } + wxRect GetRect() const { return wxRect((int)GetX(), (int)GetY(), (int)GetWidth(), (int)GetHeight()); } private: void SetRects(long numRects, wxRect *rects); diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/statbmp.h b/Externals/wxWidgets3/include/wx/osx/carbon/statbmp.h index 4ec79b1054..0f9ffb1763 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/statbmp.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/statbmp.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbmp.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/uma.h b/Externals/wxWidgets3/include/wx/osx/carbon/uma.h index cfb3f2f0cb..57b77f798c 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/uma.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/uma.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 03/02/99 -// RCS-ID: $Id: uma.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/checkbox.h b/Externals/wxWidgets3/include/wx/osx/checkbox.h index fc8e4fa977..3ba0accc90 100644 --- a/Externals/wxWidgets3/include/wx/osx/checkbox.h +++ b/Externals/wxWidgets3/include/wx/osx/checkbox.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: checkbox.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/checklst.h b/Externals/wxWidgets3/include/wx/osx/checklst.h index 35aed903f3..c23d36f562 100644 --- a/Externals/wxWidgets3/include/wx/osx/checklst.h +++ b/Externals/wxWidgets3/include/wx/osx/checklst.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: checklst.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/chkconf.h b/Externals/wxWidgets3/include/wx/osx/chkconf.h index 211411c961..c960923cc8 100644 --- a/Externals/wxWidgets3/include/wx/osx/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/chkconf.h @@ -4,7 +4,6 @@ * Author: Vadim Zeitlin * Modified by: * Created: 2005-04-05 (extracted from wx/chkconf.h) - * RCS-ID: $Id: chkconf.h 67497 2011-04-15 19:18:34Z DS $ * Copyright: (c) 2005 Vadim Zeitlin * Licence: wxWindows licence */ @@ -14,27 +13,6 @@ #ifndef _WX_OSX_CHKCONF_H_ #define _WX_OSX_CHKCONF_H_ - -#if wxUSE_STACKWALKER - /* not supported under Mac */ -# undef wxUSE_STACKWALKER -# define wxUSE_STACKWALKER 0 -#endif /* wxUSE_STACKWALKER */ - -/* - * disable the settings which don't work for some compilers - */ - -#if defined(__MWERKS__) - #undef wxUSE_DEBUG_NEW_ALWAYS - #define wxUSE_DEBUG_NEW_ALWAYS 0 - - /* DS: Fixes compilation when wxUSE_ON_FATAL_EXCEPTION is 1 */ - #ifndef wxTYPE_SA_HANDLER - #define wxTYPE_SA_HANDLER int - #endif -#endif - /* * check graphics context option, must be on for every os x platform * we only use core graphics now on all builds, try to catch attempts diff --git a/Externals/wxWidgets3/include/wx/osx/choice.h b/Externals/wxWidgets3/include/wx/osx/choice.h index 358c81f85e..0e108f4552 100644 --- a/Externals/wxWidgets3/include/wx/osx/choice.h +++ b/Externals/wxWidgets3/include/wx/osx/choice.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: choice.h 66993 2011-02-22 13:25:38Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -93,6 +92,10 @@ protected: wxArrayString m_strings; wxChoiceDataArray m_datas ; wxMenu* m_popUpMenu ; + +private: + // This should be called when the number of items in the control changes. + void DoAfterItemCountChange(); }; #endif diff --git a/Externals/wxWidgets3/include/wx/osx/clipbrd.h b/Externals/wxWidgets3/include/wx/osx/clipbrd.h index 5101b6700d..cba7a41e22 100644 --- a/Externals/wxWidgets3/include/wx/osx/clipbrd.h +++ b/Externals/wxWidgets3/include/wx/osx/clipbrd.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: clipbrd.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h b/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h index 3e1443eb11..9789e77d54 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h @@ -4,7 +4,6 @@ * Author: Stefan Csomor * Modified by: * Created: 2008-07-30 - * RCS-ID: $Id: chkconf.h 67232 2011-03-18 15:10:15Z DS $ * Copyright: (c) Stefan Csomor * Licence: wxWindows licence */ @@ -12,6 +11,17 @@ #ifndef _WX_OSX_COCOA_CHKCONF_H_ #define _WX_OSX_COCOA_CHKCONF_H_ +/* Many wchar functions (and also strnlen(), for some reason) are only + available since 10.7 so don't use them if we want to build the applications + that would run under 10.6 and earlier. */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 +#define HAVE_STRNLEN 1 +#define HAVE_WCSDUP 1 +#define HAVE_WCSNLEN 1 +#define HAVE_WCSCASECMP 1 +#define HAVE_WCSNCASECMP 1 +#endif + /* * native (1) or emulated (0) toolbar */ @@ -20,6 +30,13 @@ #define wxOSX_USE_NATIVE_TOOLBAR 1 #endif +/* + * leave is isFlipped and don't override + */ +#ifndef wxOSX_USE_NATIVE_FLIPPED + #define wxOSX_USE_NATIVE_FLIPPED 1 +#endif + /* * text rendering system */ diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/dataview.h b/Externals/wxWidgets3/include/wx/osx/cocoa/dataview.h index 0859b2dbae..2d33fff661 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/dataview.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/dataview.h @@ -2,7 +2,6 @@ // Name: wx/osx/cocoa/dataview.h // Purpose: wxDataViewCtrl native implementation header for carbon // Author: -// Id: $Id: dataview.h 57374 2009-01-27 // Copyright: (c) 2009 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/evtloop.h b/Externals/wxWidgets3/include/wx/osx/cocoa/evtloop.h index 4dae4c2184..ab15dd94af 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/evtloop.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/evtloop.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxGUIEventLoop for wxOSX/Cocoa // Author: Vadim Zeitlin // Created: 2008-12-28 -// RCS-ID: $Id: evtloop.h 68301 2011-07-19 16:17:44Z SC $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -23,12 +22,14 @@ public: virtual void WakeUp(); + void OSXUseLowLevelWakeup(bool useIt) + { m_osxLowLevelWakeUp = useIt ; } + protected: virtual int DoDispatchTimeout(unsigned long timeout); - virtual void DoRun(); - - virtual void DoStop(); + virtual void OSXDoRun(); + virtual void OSXDoStop(); virtual CFRunLoopRef CFGetCurrentRunLoop() const; @@ -39,6 +40,8 @@ protected: WXWindow m_dummyWindow; int m_modalNestedLevel; + + bool m_osxLowLevelWakeUp; }; #endif // _WX_OSX_COCOA_EVTLOOP_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private.h index 0e4a19ac8c..9dcbf365b7 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: private.h 70863 2012-03-10 13:13:51Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,9 +38,12 @@ OSStatus WXDLLIMPEXP_CORE wxMacDrawCGImage( CGContextRef inContext, const CGRect * inBounds, CGImageRef inImage) ; -WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromCGImage( CGImageRef image ); -CGImageRef WXDLLIMPEXP_CORE wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage ); +WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromCGImage( CGImageRef image, double scale = 1.0 ); +CGImageRef WXDLLIMPEXP_CORE wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage, double *scale = NULL ); +CGContextRef WXDLLIMPEXP_CORE wxOSXCreateBitmapContextFromNSImage( WX_NSImage nsimage); + wxBitmap WXDLLIMPEXP_CORE wxOSXCreateSystemBitmap(const wxString& id, const wxString &client, const wxSize& size); +WXWindow WXDLLIMPEXP_CORE wxOSXGetMainWindow(); class WXDLLIMPEXP_FWD_CORE wxDialog; @@ -88,6 +90,8 @@ public : virtual void SetNeedsDisplay( const wxRect* where = NULL ); virtual bool GetNeedsDisplay() const; + virtual void SetDrawingEnabled(bool enabled); + virtual bool CanFocus() const; // return true if successful virtual bool SetFocus(); @@ -104,6 +108,8 @@ public : void CaptureMouse(); void ReleaseMouse(); + void SetDropTarget(wxDropTarget* target); + wxInt32 GetValue() const; void SetValue( wxInt32 v ); wxBitmap GetBitmap() const; @@ -133,11 +139,17 @@ public : virtual void SetupKeyEvent(wxKeyEvent &wxevent, NSEvent * nsEvent, NSString* charString = NULL); virtual void SetupMouseEvent(wxMouseEvent &wxevent, NSEvent * nsEvent); + void SetupCoordinates(wxCoord &x, wxCoord &y, NSEvent *nsEvent); + virtual bool SetupCursor(NSEvent* event); +#if !wxOSX_USE_NATIVE_FLIPPED void SetFlipped(bool flipped); virtual bool IsFlipped() const { return m_isFlipped; } +#endif + virtual double GetContentScaleFactor() const; + // cocoa thunk connected calls virtual unsigned int draggingEntered(void* sender, WXWidget slf, void* _cmd); @@ -152,7 +164,9 @@ public : virtual bool acceptsFirstResponder(WXWidget slf, void* _cmd); virtual bool becomeFirstResponder(WXWidget slf, void* _cmd); virtual bool resignFirstResponder(WXWidget slf, void* _cmd); +#if !wxOSX_USE_NATIVE_FLIPPED virtual bool isFlipped(WXWidget slf, void* _cmd); +#endif virtual void drawRect(void* rect, WXWidget slf, void* _cmd); virtual void controlAction(WXWidget slf, void* _cmd, void* sender); @@ -165,7 +179,9 @@ public : protected: WXWidget m_osxView; NSEvent* m_lastKeyDownEvent; +#if !wxOSX_USE_NATIVE_FLIPPED bool m_isFlipped; +#endif // if it the control has an editor, that editor will already send some // events, don't resend them bool m_hasEditor; @@ -245,6 +261,8 @@ public : CGWindowLevel GetWindowLevel() const { return m_macWindowLevel; } void RestoreWindowLevel(); + + static WX_NSResponder GetNextFirstResponder() ; protected : CGWindowLevel m_macWindowLevel; WXWindow m_macWindow; @@ -252,7 +270,30 @@ protected : DECLARE_DYNAMIC_CLASS_NO_COPY(wxNonOwnedWindowCocoaImpl) }; +DECLARE_WXCOCOA_OBJC_CLASS( wxNSButton ); + +class wxButtonCocoaImpl : public wxWidgetCocoaImpl, public wxButtonImpl +{ +public: + wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v); + virtual void SetBitmap(const wxBitmap& bitmap); +#if wxUSE_MARKUP + virtual void SetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + + void SetPressedBitmap( const wxBitmap& bitmap ); + void GetLayoutInset(int &left , int &top , int &right, int &bottom) const; + void SetAcceleratorFromLabel(const wxString& label); + + NSButton *GetNSButton() const; +}; + #ifdef __OBJC__ + typedef void (*wxOSX_TextEventHandlerPtr)(NSView* self, SEL _cmd, NSString *event); + typedef void (*wxOSX_EventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); + typedef BOOL (*wxOSX_PerformKeyEventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); + typedef BOOL (*wxOSX_FocusHandlerPtr)(NSView* self, SEL _cmd); + WXDLLIMPEXP_CORE NSScreen* wxOSXGetMenuScreen(); WXDLLIMPEXP_CORE NSRect wxToNSRect( NSView* parent, const wxRect& r ); @@ -263,6 +304,8 @@ protected : NSRect WXDLLIMPEXP_CORE wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin = true ); + WXDLLIMPEXP_CORE NSView* wxOSXGetViewFromResponder( NSResponder* responder ); + // used for many wxControls @interface wxNSButton : NSButton @@ -310,6 +353,18 @@ protected : @end + @interface wxNSComboBox : NSComboBox + { + wxNSTextFieldEditor* fieldEditor; + } + + - (wxNSTextFieldEditor*) fieldEditor; + - (void) setFieldEditor:(wxNSTextFieldEditor*) fieldEditor; + + @end + + + @interface wxNSMenu : NSMenu { wxMenuImpl* impl; @@ -414,6 +469,8 @@ const short kwxCursorLast = kwxCursorWatch; extern ClassicCursor gMacCursors[]; +extern NSLayoutManager* gNSLayoutManager; + #endif #endif diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private/date.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private/date.h index 09624ab3f9..e7d9d40b6d 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private/date.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private/date.h @@ -3,7 +3,6 @@ // Purpose: NSDate-related helpers // Author: Vadim Zeitlin // Created: 2011-12-19 -// RCS-ID: $Id: date.h 70070 2011-12-20 21:27:09Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private/markuptoattr.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private/markuptoattr.h index 542ae6b608..1d23d8e3b4 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private/markuptoattr.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private/markuptoattr.h @@ -3,7 +3,6 @@ // Purpose: Class to convert markup to Cocoa attributed strings. // Author: Vadim Zeitlin // Created: 2011-02-22 -// RCS-ID: $Id: markuptoattr.h 67069 2011-02-27 12:48:46Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private/overlay.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private/overlay.h index 2af5b14842..5a49e8104e 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private/overlay.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private/overlay.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2006-10-20 -// RCS-ID: $Id: overlay.h 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private/textimpl.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private/textimpl.h index 841bf5bd08..767f31cddb 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private/textimpl.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private/textimpl.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 03/02/99 -// RCS-ID: $Id: textimpl.h 70354 2012-01-15 15:53:56Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -45,6 +44,10 @@ public : virtual bool SetHint(const wxString& hint); virtual void controlAction(WXWidget slf, void* _cmd, void *sender); + virtual bool becomeFirstResponder(WXWidget slf, void *_cmd); + virtual bool resignFirstResponder(WXWidget slf, void *_cmd); + + virtual void SetInternalSelection( long from , long to ); protected : NSTextField* m_textField; @@ -111,6 +114,10 @@ public : virtual void Popup(); virtual void Dismiss(); + virtual void SetEditable(bool editable); + + virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd); + private: NSComboBox* m_comboBox; }; diff --git a/Externals/wxWidgets3/include/wx/osx/colordlg.h b/Externals/wxWidgets3/include/wx/osx/colordlg.h index ea18736896..832b46cf0d 100644 --- a/Externals/wxWidgets3/include/wx/osx/colordlg.h +++ b/Externals/wxWidgets3/include/wx/osx/colordlg.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: colordlg.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/combobox.h b/Externals/wxWidgets3/include/wx/osx/combobox.h index ba55d4f160..d7d16f503f 100644 --- a/Externals/wxWidgets3/include/wx/osx/combobox.h +++ b/Externals/wxWidgets3/include/wx/osx/combobox.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: combobox.h 69956 2011-12-08 14:47:37Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -104,10 +103,10 @@ class WXDLLIMPEXP_CORE wxComboBox : virtual unsigned int GetCount() const; + virtual void SetValue(const wxString& value); // these methods are provided by wxTextEntry for the native impl. #if wxOSX_USE_CARBON // Text field functions - virtual void SetValue(const wxString& value); virtual wxString GetValue() const; virtual void WriteText(const wxString& text); diff --git a/Externals/wxWidgets3/include/wx/osx/config_xcode.h b/Externals/wxWidgets3/include/wx/osx/config_xcode.h index 5c92ac2032..e293e90aea 100644 --- a/Externals/wxWidgets3/include/wx/osx/config_xcode.h +++ b/Externals/wxWidgets3/include/wx/osx/config_xcode.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 29.04.04 -// RCS-ID: $Id: config_xcode.h 70021 2011-12-16 22:12:49Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -117,7 +116,6 @@ #define HAVE_LANGINFO_H 1 #define HAVE_WCSRTOMBS 1 #define HAVE_FPUTWS 1 -#define HAVE_STRCASECMP_IN_STRING_H 1 #define HAVE_WPRINTF 1 #define HAVE_VSWPRINTF 1 #define HAVE_VSWSCANF 1 @@ -133,9 +131,9 @@ #define WXWIN_OS_DESCRIPTION "Darwin 7.9.0 Power Macintosh" #define PACKAGE_BUGREPORT "wx-dev@lists.wxwidgets.org" #define PACKAGE_NAME "wxWidgets" -#define PACKAGE_STRING "wxWidgets 2.9.4" +#define PACKAGE_STRING "wxWidgets 3.0.0" #define PACKAGE_TARNAME "wxwidgets" -#define PACKAGE_VERSION "2.9.4" +#define PACKAGE_VERSION "3.0.0" // for regex #define WX_NO_REGEX_ADVANCED 1 diff --git a/Externals/wxWidgets3/include/wx/osx/control.h b/Externals/wxWidgets3/include/wx/osx/control.h index e68dca2fe9..f0d7c4606b 100644 --- a/Externals/wxWidgets3/include/wx/osx/control.h +++ b/Externals/wxWidgets3/include/wx/osx/control.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: control.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/cfdataref.h b/Externals/wxWidgets3/include/wx/osx/core/cfdataref.h index 4f710f223a..6c604cd069 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/cfdataref.h +++ b/Externals/wxWidgets3/include/wx/osx/core/cfdataref.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2007/05/10 -// RCS-ID: $Id: cfdataref.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2007 Stefan Csomor // Licence: wxWindows licence // Notes: See http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBinaryData/index.html diff --git a/Externals/wxWidgets3/include/wx/osx/core/cfref.h b/Externals/wxWidgets3/include/wx/osx/core/cfref.h index 8a9ea13c51..c4a6b3c17a 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/cfref.h +++ b/Externals/wxWidgets3/include/wx/osx/core/cfref.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: Stefan Csomor // Created: 2007/05/10 -// RCS-ID: $Id: cfref.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2007 David Elliott , Stefan Csomor // Licence: wxWindows licence // Notes: See http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/index.html diff --git a/Externals/wxWidgets3/include/wx/osx/core/cfstring.h b/Externals/wxWidgets3/include/wx/osx/core/cfstring.h index 01275cf73c..cbe092463b 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/cfstring.h +++ b/Externals/wxWidgets3/include/wx/osx/core/cfstring.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2004-10-29 (from code in wx/mac/carbon/private.h) -// RCS-ID: $Id: cfstring.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence // Usage: Darwin (base library) @@ -71,8 +70,10 @@ public: wxString AsString( wxFontEncoding encoding = wxFONTENCODING_DEFAULT ) const; static wxString AsString( CFStringRef ref, wxFontEncoding encoding = wxFONTENCODING_DEFAULT ) ; + static wxString AsStringWithNormalizationFormC( CFStringRef ref, wxFontEncoding encoding = wxFONTENCODING_DEFAULT ) ; #if wxOSX_USE_COCOA_OR_IPHONE static wxString AsString( NSString* ref, wxFontEncoding encoding = wxFONTENCODING_DEFAULT ) ; + static wxString AsStringWithNormalizationFormC( NSString* ref, wxFontEncoding encoding = wxFONTENCODING_DEFAULT ) ; #endif #if wxOSX_USE_COCOA_OR_IPHONE diff --git a/Externals/wxWidgets3/include/wx/osx/core/colour.h b/Externals/wxWidgets3/include/wx/osx/core/colour.h index 2765a4c20b..004b627f61 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/colour.h +++ b/Externals/wxWidgets3/include/wx/osx/core/colour.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: colour.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/dataview.h b/Externals/wxWidgets3/include/wx/osx/core/dataview.h index f02d328eea..61d05bf309 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/dataview.h +++ b/Externals/wxWidgets3/include/wx/osx/core/dataview.h @@ -3,7 +3,6 @@ // Name: wx/osx/core/dataview.h // Purpose: wxDataViewCtrl native implementation header for OSX // Author: -// Id: $Id: dataview.h 57374 2009-01-27 // Copyright: (c) 2009 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/evtloop.h b/Externals/wxWidgets3/include/wx/osx/core/evtloop.h new file mode 100644 index 0000000000..d2ff91d4c2 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/osx/core/evtloop.h @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/osx/core/evtloop.h +// Purpose: CoreFoundation-based event loop +// Author: Vadim Zeitlin +// Modified by: +// Created: 2006-01-12 +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OSX_CORE_EVTLOOP_H_ +#define _WX_OSX_CORE_EVTLOOP_H_ + +DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoop ); +DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopObserver ); + +class WXDLLIMPEXP_FWD_BASE wxCFEventLoopPauseIdleEvents; + +class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase +{ + friend class wxCFEventLoopPauseIdleEvents; +public: + wxCFEventLoop(); + virtual ~wxCFEventLoop(); + + // sets the "should exit" flag and wakes up the loop so that it terminates + // soon + virtual void ScheduleExit(int rc = 0); + + // return true if any events are available + virtual bool Pending() const; + + // dispatch a single event, return false if we should exit from the loop + virtual bool Dispatch(); + + // same as Dispatch() but doesn't wait for longer than the specified (in + // ms) timeout, return true if an event was processed, false if we should + // exit the loop or -1 if timeout expired + virtual int DispatchTimeout(unsigned long timeout); + + // implement this to wake up the loop: usually done by posting a dummy event + // to it (can be called from non main thread) + virtual void WakeUp(); + + virtual bool YieldFor(long eventsToProcess); + + bool ShouldProcessIdleEvents() const { return m_processIdleEvents ; } + +#if wxUSE_UIACTIONSIMULATOR + // notifies Yield and Dispatch to wait for at least one event before + // returning, this is necessary, because the synthesized events need to be + // converted by the OS before being available on the native event queue + void SetShouldWaitForEvent(bool should) { m_shouldWaitForEvent = should; } +#endif +protected: + // enters a loop calling OnNextIteration(), Pending() and Dispatch() and + // terminating when Exit() is called + virtual int DoRun(); + + void CommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity); + void DefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity); + + // set to false to avoid idling at unexpected moments - eg when having native message boxes + void SetProcessIdleEvents(bool process) { m_processIdleEvents = process; } + + static void OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info); + static void OSXDefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info); + + // get the currently executing CFRunLoop + virtual CFRunLoopRef CFGetCurrentRunLoop() const; + + virtual int DoDispatchTimeout(unsigned long timeout); + + virtual void OSXDoRun(); + virtual void OSXDoStop(); + + // the loop exit code + int m_exitcode; + + // cfrunloop + CFRunLoopRef m_runLoop; + + // common modes runloop observer + CFRunLoopObserverRef m_commonModeRunLoopObserver; + + // default mode runloop observer + CFRunLoopObserverRef m_defaultModeRunLoopObserver; + + // set to false to avoid idling at unexpected moments - eg when having native message boxes + bool m_processIdleEvents; + +#if wxUSE_UIACTIONSIMULATOR + bool m_shouldWaitForEvent; +#endif +private: + // process all already pending events and dispatch a new one (blocking + // until it appears in the event queue if necessary) + // + // returns the return value of DoDispatchTimeout() + int DoProcessEvents(); + + wxDECLARE_NO_COPY_CLASS(wxCFEventLoop); +}; + +class WXDLLIMPEXP_BASE wxCFEventLoopPauseIdleEvents : public wxObject +{ +public: + wxCFEventLoopPauseIdleEvents(); + virtual ~wxCFEventLoopPauseIdleEvents(); +private: + bool m_formerState; +}; + +#endif // _WX_OSX_EVTLOOP_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/core/hid.h b/Externals/wxWidgets3/include/wx/osx/core/hid.h index 2738f5a31b..20c1a7ba41 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/hid.h +++ b/Externals/wxWidgets3/include/wx/osx/core/hid.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 11/11/2003 -// RCS-ID: $Id: hid.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -34,7 +33,6 @@ //Darn apple - doesn't properly wrap their headers in extern "C"! //http://www.macosx.com/forums/archive/index.php/t-68069.html -//Needed for codewarrior link error with mach_port_deallocate() extern "C" { #include } diff --git a/Externals/wxWidgets3/include/wx/osx/core/joystick.h b/Externals/wxWidgets3/include/wx/osx/core/joystick.h index 4af96dae10..36941b5b0b 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/joystick.h +++ b/Externals/wxWidgets3/include/wx/osx/core/joystick.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2/13/2005 -// RCS-ID: $Id: joystick.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/mimetype.h b/Externals/wxWidgets3/include/wx/osx/core/mimetype.h index a6e5b1ead9..7f92a990ff 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/mimetype.h +++ b/Externals/wxWidgets3/include/wx/osx/core/mimetype.h @@ -4,7 +4,6 @@ // Author: Neil Perkins // Modified by: // Created: 2010-05-15 -// RCS-ID: $Id: mimetype.h 68563 2011-08-05 19:02:26Z VZ $ // Copyright: (C) 2010 Neil Perkins // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/objcid.h b/Externals/wxWidgets3/include/wx/osx/core/objcid.h new file mode 100644 index 0000000000..35238bb891 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/osx/core/objcid.h @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/osx/core/objcid.h +// Purpose: Define wxObjCID working in both C++ and Objective-C. +// Author: Vadim Zeitlin +// Created: 2012-05-20 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OSX_CORE_OBJCID_H_ +#define _WX_OSX_CORE_OBJCID_H_ + +// ---------------------------------------------------------------------------- +// wxObjCID: Equivalent of Objective-C "id" that works in C++ code. +// ---------------------------------------------------------------------------- + +#ifdef __OBJC__ + #define wxObjCID id +#else + typedef struct objc_object* wxObjCID; +#endif + +#endif // _WX_OSX_CORE_OBJCID_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/core/private.h b/Externals/wxWidgets3/include/wx/osx/core/private.h index 4b69c9bb90..18c3cc7b89 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/private.h +++ b/Externals/wxWidgets3/include/wx/osx/core/private.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: private.h 70354 2012-01-15 15:53:56Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -32,6 +31,23 @@ #define wxOSX_10_6_AND_LATER(x) #endif +// platform specific Clang analyzer support +#ifndef NS_RETURNS_RETAINED +# if WX_HAS_CLANG_FEATURE(attribute_ns_returns_retained) +# define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) +# else +# define NS_RETURNS_RETAINED +# endif +#endif + +#ifndef CF_RETURNS_RETAINED +# if WX_HAS_CLANG_FEATURE(attribute_cf_returns_retained) +# define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) +# else +# define CF_RETURNS_RETAINED +# endif +#endif + #if ( !wxUSE_GUI && !wxOSX_USE_IPHONE ) || wxOSX_USE_COCOA_OR_CARBON // Carbon functions are currently still used in wxOSX/Cocoa too (including @@ -105,7 +121,9 @@ WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithCFData( CFDataRe WXDLLIMPEXP_CORE CGDataConsumerRef wxMacCGDataConsumerCreateWithCFData( CFMutableDataRef data ); WXDLLIMPEXP_CORE CGDataProviderRef wxMacCGDataProviderCreateWithMemoryBuffer( const wxMemoryBuffer& buf ); -CGColorSpaceRef WXDLLIMPEXP_CORE wxMacGetGenericRGBColorSpace(void); +WXDLLIMPEXP_CORE CGColorSpaceRef wxMacGetGenericRGBColorSpace(void); + +WXDLLIMPEXP_CORE double wxOSXGetMainScreenContentScaleFactor(); class wxWindowMac; // to @@ -242,7 +260,7 @@ public : virtual void GetPosition( int &x, int &y ) const = 0; virtual void GetSize( int &width, int &height ) const = 0; virtual void SetControlSize( wxWindowVariant variant ) = 0; - virtual float GetContentScaleFactor() const + virtual double GetContentScaleFactor() const { return 1.0; } @@ -265,6 +283,8 @@ public : virtual bool NeedsFrame() const; virtual void SetNeedsFrame( bool needs ); + + virtual void SetDrawingEnabled(bool enabled); virtual bool CanFocus() const = 0; // return true if successful @@ -284,13 +304,16 @@ public : virtual void SetCursor( const wxCursor & cursor ) = 0; virtual void CaptureMouse() = 0; virtual void ReleaseMouse() = 0; + + virtual void SetDropTarget( wxDropTarget * WXUNUSED(dropTarget) ) {} virtual wxInt32 GetValue() const = 0; virtual void SetValue( wxInt32 v ) = 0; virtual wxBitmap GetBitmap() const = 0; virtual void SetBitmap( const wxBitmap& bitmap ) = 0; virtual void SetBitmapPosition( wxDirection dir ) = 0; - virtual void SetupTabs( const wxNotebook ¬ebook ) =0; + virtual void SetupTabs( const wxNotebook& WXUNUSED(notebook) ) {} + virtual int TabHitTest( const wxPoint & WXUNUSED(pt), long *flags ) {*flags=1; return -1;}; virtual void GetBestRect( wxRect *r ) const = 0; virtual bool IsEnabled() const = 0; virtual void Enable( bool enable ) = 0; @@ -319,9 +342,16 @@ public : // static methods for associating native controls and their implementations + // finds the impl associated with this native control static wxWidgetImpl* FindFromWXWidget(WXWidget control); + // finds the impl associated with this native control, if the native control itself is not known + // also checks whether its parent is eg a registered scrollview, ie whether the control is a native subpart + // of a known control + static wxWidgetImpl* + FindBestFromWXWidget(WXWidget control); + static void RemoveAssociations( wxWidgetImpl* impl); static void Associate( WXWidget control, wxWidgetImpl *impl ); @@ -844,7 +874,7 @@ public : virtual void ScreenToWindow( int *x, int *y ) = 0; virtual void WindowToScreen( int *x, int *y ) = 0; - + virtual bool IsActive() = 0; wxNonOwnedWindow* GetWXPeer() { return m_wxPeer; } diff --git a/Externals/wxWidgets3/include/wx/osx/core/private/datetimectrl.h b/Externals/wxWidgets3/include/wx/osx/core/private/datetimectrl.h index 499ff1b94a..18778d7da5 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/private/datetimectrl.h +++ b/Externals/wxWidgets3/include/wx/osx/core/private/datetimectrl.h @@ -3,7 +3,6 @@ // Purpose: // Author: Vadim Zeitlin // Created: 2011-12-19 -// RCS-ID: $Id: datetimectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/private/strconv_cf.h b/Externals/wxWidgets3/include/wx/osx/core/private/strconv_cf.h index 18eea2a0da..d22c73f72f 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/private/strconv_cf.h +++ b/Externals/wxWidgets3/include/wx/osx/core/private/strconv_cf.h @@ -4,7 +4,6 @@ // Author: David Elliott, Ryan Norton // Modified by: // Created: 2007-07-06 -// RCS-ID: $Id: strconv_cf.h 67215 2011-03-16 10:55:30Z SC $ // Copyright: (c) 2004 Ryan Norton // (c) 2007 David Elliott // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/osx/core/private/timer.h b/Externals/wxWidgets3/include/wx/osx/core/private/timer.h index ac5d34f4ac..2f191797d9 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/private/timer.h +++ b/Externals/wxWidgets3/include/wx/osx/core/private/timer.h @@ -3,7 +3,6 @@ // Purpose: wxTimer class based on core foundation // Author: Stefan Csomor // Created: 2008-07-16 -// RCS-ID: $Id: timer.h 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/core/stdpaths.h b/Externals/wxWidgets3/include/wx/osx/core/stdpaths.h index 67b7bffa4b..8ebe071e9c 100644 --- a/Externals/wxWidgets3/include/wx/osx/core/stdpaths.h +++ b/Externals/wxWidgets3/include/wx/osx/core/stdpaths.h @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004-10-27 -// RCS-ID: $Id: stdpaths.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -35,7 +34,6 @@ typedef __CFBundle * wxCFBundleRef; class WXDLLIMPEXP_BASE wxStandardPathsCF : public wxStandardPathsCFBase { public: - wxStandardPathsCF(); virtual ~wxStandardPathsCF(); // wxMac specific: allow user to specify a different bundle @@ -57,6 +55,10 @@ public: virtual wxString GetDocumentsDir() const; protected: + // Ctor is protected, use wxStandardPaths::Get() instead of instantiating + // objects of this class directly. + wxStandardPathsCF(); + // this function can be called with any of CFBundleCopyXXXURL function // pointer as parameter wxString GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const; diff --git a/Externals/wxWidgets3/include/wx/osx/cursor.h b/Externals/wxWidgets3/include/wx/osx/cursor.h index 024130c863..0dcf5be22d 100644 --- a/Externals/wxWidgets3/include/wx/osx/cursor.h +++ b/Externals/wxWidgets3/include/wx/osx/cursor.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: cursor.h 62771 2009-12-03 17:20:15Z PC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dataform.h b/Externals/wxWidgets3/include/wx/osx/dataform.h index 91cfcbc939..a9c7ba9e3c 100644 --- a/Externals/wxWidgets3/include/wx/osx/dataform.h +++ b/Externals/wxWidgets3/include/wx/osx/dataform.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor (lifted from dnd.h) // Modified by: // Created: 10/21/99 -// RCS-ID: $Id: dataform.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1999 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dataobj.h b/Externals/wxWidgets3/include/wx/osx/dataobj.h index c21b53b1b2..45a73f289f 100644 --- a/Externals/wxWidgets3/include/wx/osx/dataobj.h +++ b/Externals/wxWidgets3/include/wx/osx/dataobj.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor (adapted from Robert Roebling's gtk port) // Modified by: // Created: 10/21/99 -// RCS-ID: $Id: dataobj.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -25,12 +24,16 @@ public: #endif virtual bool IsSupportedFormat( const wxDataFormat& format, Direction dir = Get ) const; - void AddToPasteboard( void * pasteboardRef , int itemID ); + void AddToPasteboard( void * pasteboardRef , wxIntPtr itemID ); // returns true if the passed in format is present in the pasteboard static bool IsFormatInPasteboard( void * pasteboardRef, const wxDataFormat &dataFormat ); // returns true if any of the accepted formats of this dataobj is in the pasteboard bool HasDataInPasteboard( void * pasteboardRef ); bool GetFromPasteboard( void * pasteboardRef ); + +#if wxOSX_USE_COCOA + virtual void AddSupportedTypes( void* cfarray); +#endif }; #endif // _WX_MAC_DATAOBJ_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/dataobj2.h b/Externals/wxWidgets3/include/wx/osx/dataobj2.h index da97266641..dec7fe50bf 100644 --- a/Externals/wxWidgets3/include/wx/osx/dataobj2.h +++ b/Externals/wxWidgets3/include/wx/osx/dataobj2.h @@ -4,7 +4,6 @@ // Author: David Webster (adapted from Robert Roebling's gtk port // Modified by: // Created: 10/21/99 -// RCS-ID: $Id: dataobj2.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dataview.h b/Externals/wxWidgets3/include/wx/osx/dataview.h index f54188e3df..cffb3bf35f 100644 --- a/Externals/wxWidgets3/include/wx/osx/dataview.h +++ b/Externals/wxWidgets3/include/wx/osx/dataview.h @@ -2,7 +2,6 @@ // Name: wx/osx/dataview.h // Purpose: wxDataViewCtrl native implementation header for OSX // Author: -// Id: $Id: dataview.h 70496 2012-02-02 14:19:30Z VZ $ // Copyright: (c) 2009 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -300,6 +299,8 @@ private: wxDataViewColumnPtrArrayType m_ColumnPtrs; // all column pointers are stored in an array + wxDataViewModelNotifier* m_ModelNotifier; // stores the model notifier for the control (does not own the notifier) + // wxWidget internal stuff: DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) DECLARE_NO_COPY_CLASS(wxDataViewCtrl) diff --git a/Externals/wxWidgets3/include/wx/osx/datectrl.h b/Externals/wxWidgets3/include/wx/osx/datectrl.h index 026361aa2f..555ba68e99 100644 --- a/Externals/wxWidgets3/include/wx/osx/datectrl.h +++ b/Externals/wxWidgets3/include/wx/osx/datectrl.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxOSX-specific wxDatePickerCtrl class. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: datectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/datetimectrl.h b/Externals/wxWidgets3/include/wx/osx/datetimectrl.h index 2184229b12..9993970125 100644 --- a/Externals/wxWidgets3/include/wx/osx/datetimectrl.h +++ b/Externals/wxWidgets3/include/wx/osx/datetimectrl.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxOSX-specific wxDateTimePickerCtrl class. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: datetimectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dc.h b/Externals/wxWidgets3/include/wx/osx/dc.h index fca6654137..84bb59c077 100644 --- a/Externals/wxWidgets3/include/wx/osx/dc.h +++ b/Externals/wxWidgets3/include/wx/osx/dc.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dc.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dcclient.h b/Externals/wxWidgets3/include/wx/osx/dcclient.h index 6c078c8414..fca62cf35b 100644 --- a/Externals/wxWidgets3/include/wx/osx/dcclient.h +++ b/Externals/wxWidgets3/include/wx/osx/dcclient.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dcclient.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dcmemory.h b/Externals/wxWidgets3/include/wx/osx/dcmemory.h index ac671151d4..bace3c5a95 100644 --- a/Externals/wxWidgets3/include/wx/osx/dcmemory.h +++ b/Externals/wxWidgets3/include/wx/osx/dcmemory.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dcmemory.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dcprint.h b/Externals/wxWidgets3/include/wx/osx/dcprint.h index fadd05979c..ec9f785167 100644 --- a/Externals/wxWidgets3/include/wx/osx/dcprint.h +++ b/Externals/wxWidgets3/include/wx/osx/dcprint.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dcprint.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dcscreen.h b/Externals/wxWidgets3/include/wx/osx/dcscreen.h index be12a5d597..374f0efcd8 100644 --- a/Externals/wxWidgets3/include/wx/osx/dcscreen.h +++ b/Externals/wxWidgets3/include/wx/osx/dcscreen.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dcscreen.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dialog.h b/Externals/wxWidgets3/include/wx/osx/dialog.h index 6fbb1bba6d..3b0b724fb8 100644 --- a/Externals/wxWidgets3/include/wx/osx/dialog.h +++ b/Externals/wxWidgets3/include/wx/osx/dialog.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dialog.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dirdlg.h b/Externals/wxWidgets3/include/wx/osx/dirdlg.h index 1ea6fd2739..f355f604e8 100644 --- a/Externals/wxWidgets3/include/wx/osx/dirdlg.h +++ b/Externals/wxWidgets3/include/wx/osx/dirdlg.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dirdlg.h 67896 2011-06-09 00:28:28Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,10 +11,29 @@ #ifndef _WX_DIRDLG_H_ #define _WX_DIRDLG_H_ +#if wxOSX_USE_COCOA + DECLARE_WXCOCOA_OBJC_CLASS(NSOpenPanel); +#endif + class WXDLLIMPEXP_CORE wxDirDialog : public wxDirDialogBase { public: + wxDirDialog() { Init(); } + wxDirDialog(wxWindow *parent, + const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxT(""), + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxDirDialogNameStr) + { + Init(); + + Create(parent,message,defaultPath,style,pos,size,name); + } + + void Create(wxWindow *parent, const wxString& message = wxDirSelectorPromptStr, const wxString& defaultPath = wxT(""), long style = wxDD_DEFAULT_STYLE, @@ -34,14 +52,19 @@ public: virtual void ModalFinishedCallback(void* panel, int returnCode); #endif -protected: - - DECLARE_DYNAMIC_CLASS(wxDirDialog) - +private: #if wxOSX_USE_COCOA + // Create and initialize NSOpenPanel that we use in both ShowModal() and + // ShowWindowModal(). + WX_NSOpenPanel OSXCreatePanel() const; + WX_NSObject m_sheetDelegate; #endif + + // Common part of all ctors. + void Init(); + + DECLARE_DYNAMIC_CLASS(wxDirDialog) }; -#endif - // _WX_DIRDLG_H_ +#endif // _WX_DIRDLG_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/dnd.h b/Externals/wxWidgets3/include/wx/osx/dnd.h index 9899d8981f..7cd8ed2242 100644 --- a/Externals/wxWidgets3/include/wx/osx/dnd.h +++ b/Externals/wxWidgets3/include/wx/osx/dnd.h @@ -2,7 +2,6 @@ // Name: wx/osx/dnd.h // Purpose: Declaration of the wxDropTarget, wxDropSource class etc. // Author: Stefan Csomor -// RCS-ID: $Id: dnd.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 1998 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dvrenderer.h b/Externals/wxWidgets3/include/wx/osx/dvrenderer.h index 86704ce5e7..d7ded78464 100644 --- a/Externals/wxWidgets3/include/wx/osx/dvrenderer.h +++ b/Externals/wxWidgets3/include/wx/osx/dvrenderer.h @@ -3,7 +3,6 @@ // Purpose: wxDataViewRenderer for OS X wxDataViewCtrl implementations // Author: Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/osx/dataview.h) -// RCS-ID: $Id: dvrenderer.h 66403 2010-12-19 15:02:56Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/dvrenderers.h b/Externals/wxWidgets3/include/wx/osx/dvrenderers.h index caa99b5710..d046b1a851 100644 --- a/Externals/wxWidgets3/include/wx/osx/dvrenderers.h +++ b/Externals/wxWidgets3/include/wx/osx/dvrenderers.h @@ -3,7 +3,6 @@ // Purpose: All OS X wxDataViewCtrl renderer classes // Author: Vadim Zeitlin // Created: 2009-11-07 (extracted from wx/osx/dataview.h) -// RCS-ID: $Id: dvrenderers.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -103,6 +102,12 @@ public: wxString GetChoice(size_t index) const { return m_choices[index]; } const wxArrayString& GetChoices() const { return m_choices; } +#if wxOSX_USE_COCOA + virtual void OSXOnCellChanged(NSObject *value, + const wxDataViewItem& item, + unsigned col); +#endif // Cocoa + private: wxArrayString m_choices; diff --git a/Externals/wxWidgets3/include/wx/osx/evtloop.h b/Externals/wxWidgets3/include/wx/osx/evtloop.h index 26c75a7ac5..995a713701 100644 --- a/Externals/wxWidgets3/include/wx/osx/evtloop.h +++ b/Externals/wxWidgets3/include/wx/osx/evtloop.h @@ -6,7 +6,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2006-01-12 -// RCS-ID: $Id: evtloop.h 67724 2011-05-11 06:46:07Z SC $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -14,87 +13,6 @@ #ifndef _WX_OSX_EVTLOOP_H_ #define _WX_OSX_EVTLOOP_H_ -DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoop ); -DECLARE_WXOSX_OPAQUE_CFREF( CFRunLoopObserver ); - -class WXDLLIMPEXP_BASE wxCFEventLoop : public wxEventLoopBase -{ -public: - wxCFEventLoop(); - virtual ~wxCFEventLoop(); - - // enters a loop calling OnNextIteration(), Pending() and Dispatch() and - // terminating when Exit() is called - virtual int Run(); - - // sets the "should exit" flag and wakes up the loop so that it terminates - // soon - virtual void Exit(int rc = 0); - - // return true if any events are available - virtual bool Pending() const; - - // dispatch a single event, return false if we should exit from the loop - virtual bool Dispatch(); - - // same as Dispatch() but doesn't wait for longer than the specified (in - // ms) timeout, return true if an event was processed, false if we should - // exit the loop or -1 if timeout expired - virtual int DispatchTimeout(unsigned long timeout); - - // implement this to wake up the loop: usually done by posting a dummy event - // to it (can be called from non main thread) - virtual void WakeUp(); - - virtual bool YieldFor(long eventsToProcess); - -#if wxUSE_EVENTLOOP_SOURCE - virtual wxEventLoopSource * - AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); -#endif // wxUSE_EVENTLOOP_SOURCE - - -protected: - void CommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity); - void DefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity); - - static void OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info); - static void OSXDefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info); - - // get the currently executing CFRunLoop - virtual CFRunLoopRef CFGetCurrentRunLoop() const; - - virtual int DoDispatchTimeout(unsigned long timeout); - - virtual void DoRun(); - - virtual void DoStop(); - - // should we exit the loop? - bool m_shouldExit; - - // the loop exit code - int m_exitcode; - - // cfrunloop - CFRunLoopRef m_runLoop; - - // common modes runloop observer - CFRunLoopObserverRef m_commonModeRunLoopObserver; - - // default mode runloop observer - CFRunLoopObserverRef m_defaultModeRunLoopObserver; - -private: - // process all already pending events and dispatch a new one (blocking - // until it appears in the event queue if necessary) - // - // returns the return value of DoDispatchTimeout() - int DoProcessEvents(); -}; - -#if wxUSE_GUI - #ifdef __WXOSX_COCOA__ #include "wx/osx/cocoa/evtloop.h" #else @@ -109,17 +27,18 @@ class WXDLLIMPEXP_CORE wxModalEventLoop : public wxGUIEventLoop public: wxModalEventLoop(wxWindow *modalWindow); wxModalEventLoop(WXWindow modalNativeWindow); - + +#ifdef __WXOSX_COCOA__ + // skip wxGUIEventLoop to avoid missing Enter/Exit notifications + int Run() { return wxCFEventLoop::Run(); } +#endif protected: - virtual void DoRun(); - - virtual void DoStop(); + virtual void OSXDoRun(); + virtual void OSXDoStop(); // (in case) the modal window for this event loop wxNonOwnedWindow* m_modalWindow; WXWindow m_modalNativeWindow; }; -#endif // wxUSE_GUI - #endif // _WX_OSX_EVTLOOP_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/evtloopsrc.h b/Externals/wxWidgets3/include/wx/osx/evtloopsrc.h index 3f599fc05e..291ce0f1e4 100644 --- a/Externals/wxWidgets3/include/wx/osx/evtloopsrc.h +++ b/Externals/wxWidgets3/include/wx/osx/evtloopsrc.h @@ -3,7 +3,6 @@ // Purpose: wxCFEventLoopSource class // Author: Vadim Zeitlin // Created: 2009-10-21 -// RCS-ID: $Id: evtloopsrc.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,28 +10,32 @@ #ifndef _WX_OSX_EVTLOOPSRC_H_ #define _WX_OSX_EVTLOOPSRC_H_ -typedef struct __CFFileDescriptor *CFFileDescriptorRef; +typedef struct __CFSocket* CFSocketRef; // ---------------------------------------------------------------------------- // wxCFEventLoopSource: CoreFoundation-based wxEventLoopSource for OS X // ---------------------------------------------------------------------------- -class wxCFEventLoopSource : public wxEventLoopSource +class WXDLLIMPEXP_BASE wxCFEventLoopSource : public wxEventLoopSource { public: + // Create a new source in uninitialized state, call InitSocketRef() later + // to associate it with the socket it is going to use. wxCFEventLoopSource(wxEventLoopSourceHandler *handler, int flags) : wxEventLoopSource(handler, flags) { - m_cffd = NULL; + m_cfSocket = NULL; } - // we take ownership of this CFFileDescriptorRef - void SetFileDescriptor(CFFileDescriptorRef cffd); + // Finish initialization of the event loop source by providing the + // associated socket. This object takes ownership of it and will release it. + void InitSourceSocket(CFSocketRef cfSocket); + // Destructor deletes the associated socket. virtual ~wxCFEventLoopSource(); private: - CFFileDescriptorRef m_cffd; + CFSocketRef m_cfSocket; wxDECLARE_NO_COPY_CLASS(wxCFEventLoopSource); }; diff --git a/Externals/wxWidgets3/include/wx/osx/filedlg.h b/Externals/wxWidgets3/include/wx/osx/filedlg.h index 6dbc0cb50c..10342fa8a8 100644 --- a/Externals/wxWidgets3/include/wx/osx/filedlg.h +++ b/Externals/wxWidgets3/include/wx/osx/filedlg.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: filedlg.h 67896 2011-06-09 00:28:28Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,7 +30,23 @@ protected: wxArrayString m_paths; public: + wxFileDialog() { Init(); } wxFileDialog(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr) + { + Init(); + + Create(parent,message,defaultDir,defaultFile,wildCard,style,pos,sz,name); + } + + void Create(wxWindow *parent, const wxString& message = wxFileSelectorPromptStr, const wxString& defaultDir = wxEmptyString, const wxString& defaultFile = wxEmptyString, @@ -87,6 +102,10 @@ protected: WX_NSObject m_delegate; WX_NSObject m_sheetDelegate; #endif + +private: + // Common part of all ctors. + void Init(); }; #endif // _WX_FILEDLG_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/font.h b/Externals/wxWidgets3/include/wx/osx/font.h index e1fe572e58..3bec30a891 100644 --- a/Externals/wxWidgets3/include/wx/osx/font.h +++ b/Externals/wxWidgets3/include/wx/osx/font.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: font.h 70445 2012-01-23 11:28:21Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,6 +36,20 @@ public: // ctors and such wxFont() { } + wxFont(const wxFontInfo& info) + { + Create(info.GetPointSize(), + info.GetFamily(), + info.GetStyle(), + info.GetWeight(), + info.IsUnderlined(), + info.GetFaceName(), + info.GetEncoding()); + + if ( info.IsUsingSizeInPixels() ) + SetPixelSize(info.GetPixelSize()); + } + wxFont( wxOSXSystemFont systemFont ); #if wxOSX_USE_COCOA @@ -79,19 +92,6 @@ public: SetPixelSize(pixelSize); } - wxFont(int pointSize, - wxFontFamily family, - int flags = wxFONTFLAG_DEFAULT, - const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT) - { - Create(pointSize, family, - GetStyleFromFlags(flags), - GetWeightFromFlags(flags), - GetUnderlinedFromFlags(flags), - face, encoding); - } - bool Create(int size, wxFontFamily family, wxFontStyle style, @@ -121,6 +121,8 @@ public: virtual wxFontEncoding GetEncoding() const; virtual const wxNativeFontInfo *GetNativeFontInfo() const; + virtual bool IsFixedWidth() const; + virtual void SetPointSize(int pointSize); virtual void SetFamily(wxFontFamily family); virtual void SetStyle(wxFontStyle style); diff --git a/Externals/wxWidgets3/include/wx/osx/fontdlg.h b/Externals/wxWidgets3/include/wx/osx/fontdlg.h index 966a8fa937..e271578cdf 100644 --- a/Externals/wxWidgets3/include/wx/osx/fontdlg.h +++ b/Externals/wxWidgets3/include/wx/osx/fontdlg.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2004-09-25 -// RCS-ID: $Id: fontdlg.h 70497 2012-02-02 14:19:34Z VZ $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -124,25 +123,25 @@ public: /// Respond to colour change void OnColourChanged(wxCommandEvent& event); - /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for wxID_FONTDIALOG_FACENAME + /// wxEVT_LISTBOX event handler for wxID_FONTDIALOG_FACENAME void OnFontdialogFacenameSelected( wxCommandEvent& event ); - /// wxEVT_COMMAND_SPINCTRL_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE + /// wxEVT_SPINCTRL event handler for wxID_FONTDIALOG_FONTSIZE void OnFontdialogFontsizeUpdated( wxSpinEvent& event ); - /// wxEVT_COMMAND_TEXT_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE + /// wxEVT_TEXT event handler for wxID_FONTDIALOG_FONTSIZE void OnFontdialogFontsizeTextUpdated( wxCommandEvent& event ); - /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_BOLD + /// wxEVT_CHECKBOX event handler for wxID_FONTDIALOG_BOLD void OnFontdialogBoldClick( wxCommandEvent& event ); - /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_ITALIC + /// wxEVT_CHECKBOX event handler for wxID_FONTDIALOG_ITALIC void OnFontdialogItalicClick( wxCommandEvent& event ); - /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_UNDERLINED + /// wxEVT_CHECKBOX event handler for wxID_FONTDIALOG_UNDERLINED void OnFontdialogUnderlinedClick( wxCommandEvent& event ); - /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK + /// wxEVT_BUTTON event handler for wxID_OK void OnOkClick( wxCommandEvent& event ); /// Should we show tooltips? diff --git a/Externals/wxWidgets3/include/wx/osx/frame.h b/Externals/wxWidgets3/include/wx/osx/frame.h index ca6ffb51da..5902dc0c9c 100644 --- a/Externals/wxWidgets3/include/wx/osx/frame.h +++ b/Externals/wxWidgets3/include/wx/osx/frame.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: frame.h 70765 2012-03-01 15:04:42Z JS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/gauge.h b/Externals/wxWidgets3/include/wx/osx/gauge.h index 3e64fbb1c3..692c3b587a 100644 --- a/Externals/wxWidgets3/include/wx/osx/gauge.h +++ b/Externals/wxWidgets3/include/wx/osx/gauge.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: gauge.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/glcanvas.h b/Externals/wxWidgets3/include/wx/osx/glcanvas.h index 80973fea3a..1789a900f0 100644 --- a/Externals/wxWidgets3/include/wx/osx/glcanvas.h +++ b/Externals/wxWidgets3/include/wx/osx/glcanvas.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: glcanvas.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/helpxxxx.h b/Externals/wxWidgets3/include/wx/osx/helpxxxx.h index 1995c7d5f3..9a9fe4c67f 100644 --- a/Externals/wxWidgets3/include/wx/osx/helpxxxx.h +++ b/Externals/wxWidgets3/include/wx/osx/helpxxxx.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: helpxxxx.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/icon.h b/Externals/wxWidgets3/include/wx/osx/icon.h index 9053ffd1b5..bc6b721db6 100644 --- a/Externals/wxWidgets3/include/wx/osx/icon.h +++ b/Externals/wxWidgets3/include/wx/osx/icon.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: icon.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h b/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h index c402458f67..ffdc6b90ab 100644 --- a/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h @@ -4,7 +4,6 @@ * Author: Stefan Csomor * Modified by: * Created: 2008-07-30 - * RCS-ID: $Id: chkconf.h 69818 2011-11-25 14:37:03Z SC $ * Copyright: (c) Stefan Csomor * Licence: wxWindows licence */ @@ -20,7 +19,7 @@ * under a certain platform */ -#define wxOSX_USE_CORE_TEXT 0 +#define wxOSX_USE_CORE_TEXT 1 #define wxOSX_USE_ATSU_TEXT 0 #define wxHAS_OPENGL_ES diff --git a/Externals/wxWidgets3/include/wx/osx/iphone/private.h b/Externals/wxWidgets3/include/wx/osx/iphone/private.h index 03ead77125..e21dd388b0 100644 --- a/Externals/wxWidgets3/include/wx/osx/iphone/private.h +++ b/Externals/wxWidgets3/include/wx/osx/iphone/private.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: private.h 67233 2011-03-18 15:45:51Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -18,6 +17,11 @@ #import #endif +#include +#include +#include + + #if wxUSE_GUI OSStatus WXDLLIMPEXP_CORE wxMacDrawCGImage( @@ -56,7 +60,7 @@ public : virtual void GetPosition( int &x, int &y ) const; virtual void GetSize( int &width, int &height ) const; virtual void SetControlSize( wxWindowVariant variant ); - virtual float GetContentScaleFactor() const ; + virtual double GetContentScaleFactor() const ; virtual void SetNeedsDisplay( const wxRect* where = NULL ); virtual bool GetNeedsDisplay() const; diff --git a/Externals/wxWidgets3/include/wx/osx/iphone/private/textimpl.h b/Externals/wxWidgets3/include/wx/osx/iphone/private/textimpl.h index df1662ea02..7c9e5fd109 100644 --- a/Externals/wxWidgets3/include/wx/osx/iphone/private/textimpl.h +++ b/Externals/wxWidgets3/include/wx/osx/iphone/private/textimpl.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 03/02/99 -// RCS-ID: $Id: textimpl.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/joystick.h b/Externals/wxWidgets3/include/wx/osx/joystick.h index d9d2f06481..e5f834390a 100644 --- a/Externals/wxWidgets3/include/wx/osx/joystick.h +++ b/Externals/wxWidgets3/include/wx/osx/joystick.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: joystick.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/listbox.h b/Externals/wxWidgets3/include/wx/osx/listbox.h index 700ca7b815..60f4199e74 100644 --- a/Externals/wxWidgets3/include/wx/osx/listbox.h +++ b/Externals/wxWidgets3/include/wx/osx/listbox.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: listbox.h 65940 2010-10-28 10:27:32Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/listctrl.h b/Externals/wxWidgets3/include/wx/osx/listctrl.h index b0412f25f7..9f2fdfe984 100644 --- a/Externals/wxWidgets3/include/wx/osx/listctrl.h +++ b/Externals/wxWidgets3/include/wx/osx/listctrl.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: listctrl.h 70290 2012-01-08 00:55:22Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -291,9 +290,6 @@ class WXDLLIMPEXP_CORE wxListCtrl: public wxListCtrlBase // return the icon for the given item and column. virtual int OnGetItemColumnImage(long item, long column) const; - // return the attribute for the item (may return NULL if none) - virtual wxListItemAttr *OnGetItemAttr(long item) const; - /* Why should we need this function? Leave for now. * We might need it because item data may have changed, * but the display needs refreshing (in string callback mode) diff --git a/Externals/wxWidgets3/include/wx/osx/mdi.h b/Externals/wxWidgets3/include/wx/osx/mdi.h index 91d7b444a5..7a859d198d 100644 --- a/Externals/wxWidgets3/include/wx/osx/mdi.h +++ b/Externals/wxWidgets3/include/wx/osx/mdi.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: 2008-10-31 Vadim Zeitlin: derive from the base classes // Created: 1998-01-01 -// RCS-ID: $Id: mdi.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/osx/menu.h b/Externals/wxWidgets3/include/wx/osx/menu.h index 6429ca657d..3ef7699599 100644 --- a/Externals/wxWidgets3/include/wx/osx/menu.h +++ b/Externals/wxWidgets3/include/wx/osx/menu.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: menu.h 70350 2012-01-15 13:41:17Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -33,8 +32,6 @@ public: virtual ~wxMenu(); - virtual void Attach(wxMenuBarBase *menubar) ; - virtual void Break(); virtual void SetTitle(const wxString& title); @@ -77,17 +74,14 @@ private: // common part of all ctors void Init(); - // common part of Append/Insert (behaves as Append is pos == (size_t)-1) + // common part of Do{Append,Insert}(): behaves as Append if pos == -1 bool DoInsertOrAppend(wxMenuItem *item, size_t pos = (size_t)-1); - // terminate the current radio group, if any - void EndRadioGroup(); - // Common part of HandleMenu{Opened,Closed}(). void DoHandleMenuOpenedOrClosed(wxEventType evtType); - // if TRUE, insert a breal before appending the next item + // if TRUE, insert a break before appending the next item bool m_doBreak; // in this menu rearranging of menu items (esp hiding) is allowed @@ -96,9 +90,6 @@ private: // don't trigger native events bool m_noEventsMode; - // the position of the first item in the current radio group or -1 - int m_startRadioGroup; - wxMenuImpl* m_peer; DECLARE_DYNAMIC_CLASS(wxMenu) diff --git a/Externals/wxWidgets3/include/wx/osx/menuitem.h b/Externals/wxWidgets3/include/wx/osx/menuitem.h index a72f1831ca..69dc7e7bcb 100644 --- a/Externals/wxWidgets3/include/wx/osx/menuitem.h +++ b/Externals/wxWidgets3/include/wx/osx/menuitem.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 11.11.97 -// RCS-ID: $Id: menuitem.h 66904 2011-02-16 16:37:24Z SC $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -46,16 +45,32 @@ public: virtual void SetBitmap(const wxBitmap& bitmap) ; virtual const wxBitmap& GetBitmap() const { return m_bitmap; } + + // Implementation only from now on. + // update the os specific representation void UpdateItemBitmap() ; void UpdateItemText() ; void UpdateItemStatus() ; // mark item as belonging to the given radio group - void SetAsRadioGroupStart(); + void SetAsRadioGroupStart(bool start = true); void SetRadioGroupStart(int start); void SetRadioGroupEnd(int end); + // return true if this is the starting item of a radio group + bool IsRadioGroupStart() const; + + // get the start of the radio group this item belongs to: should not be + // called for the starting radio group item itself because it doesn't have + // this information + int GetRadioGroupStart() const; + + // get the end of the radio group this item belongs to: should be only + // called for the starting radio group item, i.e. if IsRadioGroupStart() is + // true + int GetRadioGroupEnd() const; + wxMenuItemImpl* GetPeer() { return m_peer; } private: void UncheckRadio() ; diff --git a/Externals/wxWidgets3/include/wx/osx/metafile.h b/Externals/wxWidgets3/include/wx/osx/metafile.h index 2a7e13e252..973a5736a4 100644 --- a/Externals/wxWidgets3/include/wx/osx/metafile.h +++ b/Externals/wxWidgets3/include/wx/osx/metafile.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: metafile.h 70710 2012-02-27 15:37:24Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/minifram.h b/Externals/wxWidgets3/include/wx/osx/minifram.h index 8b7b67e3de..00fe6e474a 100644 --- a/Externals/wxWidgets3/include/wx/osx/minifram.h +++ b/Externals/wxWidgets3/include/wx/osx/minifram.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: minifram.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/msgdlg.h b/Externals/wxWidgets3/include/wx/osx/msgdlg.h index 173cab4994..871d32f940 100644 --- a/Externals/wxWidgets3/include/wx/osx/msgdlg.h +++ b/Externals/wxWidgets3/include/wx/osx/msgdlg.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: msgdlg.h 68537 2011-08-04 22:53:42Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/nonownedwnd.h b/Externals/wxWidgets3/include/wx/osx/nonownedwnd.h index b6b014f30b..edc3f04e62 100644 --- a/Externals/wxWidgets3/include/wx/osx/nonownedwnd.h +++ b/Externals/wxWidgets3/include/wx/osx/nonownedwnd.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-03-24 -// RCS-ID: $Id: nonownedwnd.h 70488 2012-01-31 17:39:39Z SC $ // Copyright: (c) 2008 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -65,7 +64,7 @@ public: virtual void UnsubclassWin(); virtual wxPoint GetClientAreaOrigin() const; - + // implement base class pure virtuals virtual bool SetTransparent(wxByte alpha); @@ -105,7 +104,7 @@ public: #if wxOSX_USE_COCOA_OR_IPHONE // override the base class method to return an NSWindow instead of NSView - virtual void *OSXGetViewOrWindow() const { return GetWXWindow(); } + virtual void *OSXGetViewOrWindow() const; #endif // Cocoa // osx specific event handling common for all osx-ports diff --git a/Externals/wxWidgets3/include/wx/osx/notebook.h b/Externals/wxWidgets3/include/wx/osx/notebook.h index 62a1accc33..7e0ac72291 100644 --- a/Externals/wxWidgets3/include/wx/osx/notebook.h +++ b/Externals/wxWidgets3/include/wx/osx/notebook.h @@ -3,7 +3,6 @@ // Purpose: MSW/GTK compatible notebook (a.k.a. property sheet) // Author: Stefan Csomor // Modified by: -// RCS-ID: $Id: notebook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/palette.h b/Externals/wxWidgets3/include/wx/osx/palette.h index 3f10196a17..86e014f80f 100644 --- a/Externals/wxWidgets3/include/wx/osx/palette.h +++ b/Externals/wxWidgets3/include/wx/osx/palette.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: palette.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/pen.h b/Externals/wxWidgets3/include/wx/osx/pen.h index cf8091f5f8..391344850c 100644 --- a/Externals/wxWidgets3/include/wx/osx/pen.h +++ b/Externals/wxWidgets3/include/wx/osx/pen.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: pen.h 58739 2009-02-07 23:23:18Z KO $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/pnghand.h b/Externals/wxWidgets3/include/wx/osx/pnghand.h index 135725528b..c040521337 100644 --- a/Externals/wxWidgets3/include/wx/osx/pnghand.h +++ b/Externals/wxWidgets3/include/wx/osx/pnghand.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: pnghand.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/popupwin.h b/Externals/wxWidgets3/include/wx/osx/popupwin.h index 3027d5f26c..ac42cd64dd 100644 --- a/Externals/wxWidgets3/include/wx/osx/popupwin.h +++ b/Externals/wxWidgets3/include/wx/osx/popupwin.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: -// RCS-ID: $Id: popupwin.h 70848 2012-03-09 05:50:58Z PC $ // Copyright: (c) 2006 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -27,8 +26,6 @@ public: bool Create(wxWindow *parent, int flags = wxBORDER_NONE); - virtual bool Show(bool show = true); - DECLARE_DYNAMIC_CLASS_NO_COPY(wxPopupWindow) }; diff --git a/Externals/wxWidgets3/include/wx/osx/printdlg.h b/Externals/wxWidgets3/include/wx/osx/printdlg.h index ab87b870e0..d2601eccbe 100644 --- a/Externals/wxWidgets3/include/wx/osx/printdlg.h +++ b/Externals/wxWidgets3/include/wx/osx/printdlg.h @@ -6,7 +6,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: printdlg.h 70636 2012-02-20 21:55:55Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/printmac.h b/Externals/wxWidgets3/include/wx/osx/printmac.h index 6017955bfe..fb68fd8d5f 100644 --- a/Externals/wxWidgets3/include/wx/osx/printmac.h +++ b/Externals/wxWidgets3/include/wx/osx/printmac.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: printmac.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/private/glgrab.h b/Externals/wxWidgets3/include/wx/osx/private/glgrab.h index 3ec2df8f4e..a3ceabe689 100644 --- a/Externals/wxWidgets3/include/wx/osx/private/glgrab.h +++ b/Externals/wxWidgets3/include/wx/osx/private/glgrab.h @@ -4,7 +4,7 @@ extern "C" { #endif - CGImageRef grabViaOpenGL(CGDirectDisplayID display, + CF_RETURNS_RETAINED CGImageRef grabViaOpenGL(CGDirectDisplayID display, CGRect srcRect); #if defined __cplusplus diff --git a/Externals/wxWidgets3/include/wx/osx/radiobox.h b/Externals/wxWidgets3/include/wx/osx/radiobox.h index 5ca8856e20..f591a7df9b 100644 --- a/Externals/wxWidgets3/include/wx/osx/radiobox.h +++ b/Externals/wxWidgets3/include/wx/osx/radiobox.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: radiobox.h 69544 2011-10-26 05:39:18Z RD $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/radiobut.h b/Externals/wxWidgets3/include/wx/osx/radiobut.h index ded6f4b832..649a544c3c 100644 --- a/Externals/wxWidgets3/include/wx/osx/radiobut.h +++ b/Externals/wxWidgets3/include/wx/osx/radiobut.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: radiobut.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/scrolbar.h b/Externals/wxWidgets3/include/wx/osx/scrolbar.h index 79698bee52..2115ca5479 100644 --- a/Externals/wxWidgets3/include/wx/osx/scrolbar.h +++ b/Externals/wxWidgets3/include/wx/osx/scrolbar.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/setup0.h b/Externals/wxWidgets3/include/wx/osx/setup0.h index 46bad79d19..cbcd58af13 100644 --- a/Externals/wxWidgets3/include/wx/osx/setup0.h +++ b/Externals/wxWidgets3/include/wx/osx/setup0.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Stefan Csomor // Created: 1998-01-01 -// RCS-ID: $Id: setup0.h 70395 2012-01-19 08:55:41Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -152,7 +151,7 @@ // In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If // this causes problems (e.g. link errors), set this to 0. You may need to set // this to 0 if using templates (at least for VC++). This switch is currently -// ignored for mingw / cygwin / CodeWarrior +// ignored for MinGW/Cygwin. // // Default is 0 // @@ -268,6 +267,17 @@ // Recommended setting: 1 if you want to support multiple languages #define wxUSE_PRINTF_POS_PARAMS 1 +// Enable the use of compiler-specific thread local storage keyword, if any. +// This is used for wxTLS_XXX() macros implementation and normally should use +// the compiler-provided support as it's simpler and more efficient, but must +// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using +// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS +// support that results in crashes when any TLS variables are used. So if you +// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set +// this to 0. +// +// Default is 1, but set to 0 if the scenario above is applicable. +#define wxUSE_COMPILER_TLS 1 // ---------------------------------------------------------------------------- // Interoperability with the standard library. @@ -1088,6 +1098,20 @@ // Recommended setting: 1 #define wxUSE_NOTIFICATION_MESSAGE 1 +// wxPreferencesEditor provides a common API for different ways of presenting +// the standard "Preferences" or "Properties" dialog under different platforms +// (e.g. some use modal dialogs, some use modeless ones; some apply the changes +// immediately while others require an explicit "Apply" button). +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#ifdef __WXOSX_IPHONE__ +#define wxUSE_PREFERENCES_EDITOR 0 +#else +#define wxUSE_PREFERENCES_EDITOR 1 +#endif + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // @@ -1501,19 +1525,6 @@ // Mac-specific settings // ---------------------------------------------------------------------------- -// override some settings for Metrowerks -// -// VZ: isn't this file only used when building with Metrowerks anyhow? -// CS: no, it is also used by the Xcode projects -#ifdef __MWERKS__ - #undef wxUSE_DEBUG_CONTEXT - #define wxUSE_DEBUG_CONTEXT 1 - - #undef wxUSE_STD_IOSTREAM - // CS: I have to set this to 0 now, as shared builds are having problems - #define wxUSE_STD_IOSTREAM 0 -#endif - #undef wxUSE_GRAPHICS_CONTEXT #define wxUSE_GRAPHICS_CONTEXT 1 diff --git a/Externals/wxWidgets3/include/wx/osx/slider.h b/Externals/wxWidgets3/include/wx/osx/slider.h index 2984b3948a..bd99512dca 100644 --- a/Externals/wxWidgets3/include/wx/osx/slider.h +++ b/Externals/wxWidgets3/include/wx/osx/slider.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: slider.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/sound.h b/Externals/wxWidgets3/include/wx/osx/sound.h index 45538773d0..f406537927 100644 --- a/Externals/wxWidgets3/include/wx/osx/sound.h +++ b/Externals/wxWidgets3/include/wx/osx/sound.h @@ -5,7 +5,6 @@ // Author: Ryan Norton, Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: sound.h 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Ryan Norton, Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/spinbutt.h b/Externals/wxWidgets3/include/wx/osx/spinbutt.h index a02abcb94d..b294851f96 100644 --- a/Externals/wxWidgets3/include/wx/osx/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/osx/spinbutt.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: spinbutt.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/srchctrl.h b/Externals/wxWidgets3/include/wx/osx/srchctrl.h index 3477c25e25..ee926cf5f4 100644 --- a/Externals/wxWidgets3/include/wx/osx/srchctrl.h +++ b/Externals/wxWidgets3/include/wx/osx/srchctrl.h @@ -3,7 +3,6 @@ // Purpose: mac carbon wxSearchCtrl class // Author: Vince Harron // Created: 2006-02-19 -// RCS-ID: $Id: srchctrl.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: Vince Harron // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/statbox.h b/Externals/wxWidgets3/include/wx/osx/statbox.h index cdbdead32e..5b5f049c58 100644 --- a/Externals/wxWidgets3/include/wx/osx/statbox.h +++ b/Externals/wxWidgets3/include/wx/osx/statbox.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbox.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/statline.h b/Externals/wxWidgets3/include/wx/osx/statline.h index 8b2628fa13..bd94398239 100644 --- a/Externals/wxWidgets3/include/wx/osx/statline.h +++ b/Externals/wxWidgets3/include/wx/osx/statline.h @@ -3,7 +3,6 @@ // Purpose: a generic wxStaticLine class used for mac before adaptation // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/stattext.h b/Externals/wxWidgets3/include/wx/osx/stattext.h index 18372b9500..3b4b9b6637 100644 --- a/Externals/wxWidgets3/include/wx/osx/stattext.h +++ b/Externals/wxWidgets3/include/wx/osx/stattext.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: stattext.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/statusbr.h b/Externals/wxWidgets3/include/wx/osx/statusbr.h index ea90f0a649..74ae67758c 100644 --- a/Externals/wxWidgets3/include/wx/osx/statusbr.h +++ b/Externals/wxWidgets3/include/wx/osx/statusbr.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statusbr.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/taskbarosx.h b/Externals/wxWidgets3/include/wx/osx/taskbarosx.h index dba4a86bb1..7d13df747e 100644 --- a/Externals/wxWidgets3/include/wx/osx/taskbarosx.h +++ b/Externals/wxWidgets3/include/wx/osx/taskbarosx.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 04/04/2003 -// RCS-ID: $Id: taskbarosx.h 67084 2011-02-28 10:12:06Z SC $ // Copyright: (c) Ryan Norton, 2003 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// @@ -19,21 +18,7 @@ class WXDLLIMPEXP_ADV wxTaskBarIcon : public wxTaskBarIconBase { DECLARE_DYNAMIC_CLASS_NO_COPY(wxTaskBarIcon) public: - // type of taskbar item to create (currently only DOCK is implemented) - enum wxTaskBarIconType - { - DOCK -#if wxOSX_USE_COCOA - , CUSTOM_STATUSITEM -#endif -#if wxOSX_USE_COCOA - , DEFAULT_TYPE = CUSTOM_STATUSITEM -#else - , DEFAULT_TYPE = DOCK -#endif - }; - - wxTaskBarIcon(wxTaskBarIconType iconType = DEFAULT_TYPE); + wxTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE); virtual ~wxTaskBarIcon(); // returns true if the taskbaricon is in the global menubar diff --git a/Externals/wxWidgets3/include/wx/osx/textctrl.h b/Externals/wxWidgets3/include/wx/osx/textctrl.h index 70e0863c35..53604bab7b 100644 --- a/Externals/wxWidgets3/include/wx/osx/textctrl.h +++ b/Externals/wxWidgets3/include/wx/osx/textctrl.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: textctrl.h 70355 2012-01-15 15:54:53Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/textentry.h b/Externals/wxWidgets3/include/wx/osx/textentry.h index 7a6a66f58b..2362cae8af 100644 --- a/Externals/wxWidgets3/include/wx/osx/textentry.h +++ b/Externals/wxWidgets3/include/wx/osx/textentry.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Kevin Ollivier // Created: 1998-01-01 -// RCS-ID: $Id: textentry.h 67526 2011-04-17 23:14:15Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -80,6 +79,8 @@ public: virtual void SetSelection(long from, long to); virtual void SetEditable(bool editable); + virtual bool SendMaxLenEvent(); + // Implementation // -------------- diff --git a/Externals/wxWidgets3/include/wx/osx/tglbtn.h b/Externals/wxWidgets3/include/wx/osx/tglbtn.h index e68a2ba60c..eaa48e8b81 100644 --- a/Externals/wxWidgets3/include/wx/osx/tglbtn.h +++ b/Externals/wxWidgets3/include/wx/osx/tglbtn.h @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.h 67949 2011-06-16 00:43:22Z RD $ // Copyright: (c) 2004 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/timectrl.h b/Externals/wxWidgets3/include/wx/osx/timectrl.h index 2d093acd54..6673fcce38 100644 --- a/Externals/wxWidgets3/include/wx/osx/timectrl.h +++ b/Externals/wxWidgets3/include/wx/osx/timectrl.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxOSX-specific wxTimePickerCtrl class. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: timectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/toolbar.h b/Externals/wxWidgets3/include/wx/osx/toolbar.h index f4a21982a6..2cbd0d7c6a 100644 --- a/Externals/wxWidgets3/include/wx/osx/toolbar.h +++ b/Externals/wxWidgets3/include/wx/osx/toolbar.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: toolbar.h 70854 2012-03-10 00:01:09Z RD $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,7 +28,7 @@ class WXDLLIMPEXP_CORE wxToolBar: public wxToolBarBase inline wxToolBar(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER|wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr) { Init(); @@ -38,7 +37,7 @@ class WXDLLIMPEXP_CORE wxToolBar: public wxToolBarBase virtual ~wxToolBar(); bool Create(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxNO_BORDER|wxTB_HORIZONTAL, + long style = wxTB_HORIZONTAL, const wxString& name = wxToolBarNameStr); virtual void SetWindowStyleFlag(long style); @@ -72,6 +71,10 @@ class WXDLLIMPEXP_CORE wxToolBar: public wxToolBarBase #endif #if wxOSX_USE_NATIVE_TOOLBAR + // make all tools selectable + void OSXSetSelectableTools(bool set); + void OSXSelectTool(int toolId); + bool MacInstallNativeToolbar(bool usesNative); void MacUninstallNativeToolbar(); bool MacWantsNativeToolbar(); diff --git a/Externals/wxWidgets3/include/wx/osx/tooltip.h b/Externals/wxWidgets3/include/wx/osx/tooltip.h index a9b8467b45..f05122ba00 100644 --- a/Externals/wxWidgets3/include/wx/osx/tooltip.h +++ b/Externals/wxWidgets3/include/wx/osx/tooltip.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 31.01.99 -// RCS-ID: $Id: tooltip.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 1999 Robert Roebling, Vadim Zeitlin, Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/osx/toplevel.h b/Externals/wxWidgets3/include/wx/osx/toplevel.h index afe1f1d80f..73b218fe75 100644 --- a/Externals/wxWidgets3/include/wx/osx/toplevel.h +++ b/Externals/wxWidgets3/include/wx/osx/toplevel.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 20.09.01 -// RCS-ID: $Id: toplevel.h 70295 2012-01-08 14:52:47Z VZ $ // Copyright: (c) 2001 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -74,6 +73,9 @@ public: virtual void SetTitle( const wxString& title); virtual wxString GetTitle() const; + virtual void SetLabel(const wxString& label) { SetTitle( label ); } + virtual wxString GetLabel() const { return GetTitle(); } + virtual void OSXSetModified(bool modified); virtual bool OSXIsModified() const; diff --git a/Externals/wxWidgets3/include/wx/osx/treectrl.h b/Externals/wxWidgets3/include/wx/osx/treectrl.h index 090111624f..587325b85a 100644 --- a/Externals/wxWidgets3/include/wx/osx/treectrl.h +++ b/Externals/wxWidgets3/include/wx/osx/treectrl.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: treectrl.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -236,20 +235,20 @@ protected: }; /* - wxEVT_COMMAND_TREE_BEGIN_DRAG, - wxEVT_COMMAND_TREE_BEGIN_RDRAG, - wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, - wxEVT_COMMAND_TREE_END_LABEL_EDIT, - wxEVT_COMMAND_TREE_DELETE_ITEM, - wxEVT_COMMAND_TREE_GET_INFO, - wxEVT_COMMAND_TREE_SET_INFO, - wxEVT_COMMAND_TREE_ITEM_EXPANDED, - wxEVT_COMMAND_TREE_ITEM_EXPANDING, - wxEVT_COMMAND_TREE_ITEM_COLLAPSED, - wxEVT_COMMAND_TREE_ITEM_COLLAPSING, - wxEVT_COMMAND_TREE_SEL_CHANGED, - wxEVT_COMMAND_TREE_SEL_CHANGING, - wxEVT_COMMAND_TREE_KEY_DOWN + wxEVT_TREE_BEGIN_DRAG, + wxEVT_TREE_BEGIN_RDRAG, + wxEVT_TREE_BEGIN_LABEL_EDIT, + wxEVT_TREE_END_LABEL_EDIT, + wxEVT_TREE_DELETE_ITEM, + wxEVT_TREE_GET_INFO, + wxEVT_TREE_SET_INFO, + wxEVT_TREE_ITEM_EXPANDED, + wxEVT_TREE_ITEM_EXPANDING, + wxEVT_TREE_ITEM_COLLAPSED, + wxEVT_TREE_ITEM_COLLAPSING, + wxEVT_TREE_SEL_CHANGED, + wxEVT_TREE_SEL_CHANGING, + wxEVT_TREE_KEY_DOWN */ class WXDLLIMPEXP_CORE wxTreeEvent: public wxCommandEvent @@ -272,20 +271,36 @@ public: typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); -#define EVT_TREE_BEGIN_DRAG(id, fn) { wxEVT_COMMAND_TREE_BEGIN_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_BEGIN_RDRAG(id, fn) { wxEVT_COMMAND_TREE_BEGIN_RDRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) { wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_END_LABEL_EDIT(id, fn) { wxEVT_COMMAND_TREE_END_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_DELETE_ITEM(id, fn) { wxEVT_COMMAND_TREE_DELETE_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_GET_INFO(id, fn) { wxEVT_COMMAND_TREE_GET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_SET_INFO(id, fn) { wxEVT_COMMAND_TREE_SET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_ITEM_EXPANDED(id, fn) { wxEVT_COMMAND_TREE_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_ITEM_EXPANDING(id, fn) { wxEVT_COMMAND_TREE_ITEM_EXPANDING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_ITEM_COLLAPSED(id, fn) { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_ITEM_COLLAPSING(id, fn) { wxEVT_COMMAND_TREE_ITEM_COLLAPSING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_SEL_CHANGED(id, fn) { wxEVT_COMMAND_TREE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_SEL_CHANGING(id, fn) { wxEVT_COMMAND_TREE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, -#define EVT_TREE_KEY_DOWN(id, fn) { wxEVT_COMMAND_TREE_KEY_DOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_BEGIN_DRAG(id, fn) { wxEVT_TREE_BEGIN_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_BEGIN_RDRAG(id, fn) { wxEVT_TREE_BEGIN_RDRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) { wxEVT_TREE_BEGIN_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_END_LABEL_EDIT(id, fn) { wxEVT_TREE_END_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_DELETE_ITEM(id, fn) { wxEVT_TREE_DELETE_ITEM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_GET_INFO(id, fn) { wxEVT_TREE_GET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_SET_INFO(id, fn) { wxEVT_TREE_SET_INFO, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_ITEM_EXPANDED(id, fn) { wxEVT_TREE_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_ITEM_EXPANDING(id, fn) { wxEVT_TREE_ITEM_EXPANDING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_ITEM_COLLAPSED(id, fn) { wxEVT_TREE_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_ITEM_COLLAPSING(id, fn) { wxEVT_TREE_ITEM_COLLAPSING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_SEL_CHANGED(id, fn) { wxEVT_TREE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_SEL_CHANGING(id, fn) { wxEVT_TREE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, +#define EVT_TREE_KEY_DOWN(id, fn) { wxEVT_TREE_KEY_DOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTreeEventFunction) & fn, NULL }, + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREE_BEGIN_DRAG wxEVT_TREE_BEGIN_DRAG +#define wxEVT_COMMAND_TREE_BEGIN_RDRAG wxEVT_TREE_BEGIN_RDRAG +#define wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT wxEVT_TREE_BEGIN_LABEL_EDIT +#define wxEVT_COMMAND_TREE_END_LABEL_EDIT wxEVT_TREE_END_LABEL_EDIT +#define wxEVT_COMMAND_TREE_DELETE_ITEM wxEVT_TREE_DELETE_ITEM +#define wxEVT_COMMAND_TREE_GET_INFO wxEVT_TREE_GET_INFO +#define wxEVT_COMMAND_TREE_SET_INFO wxEVT_TREE_SET_INFO +#define wxEVT_COMMAND_TREE_ITEM_EXPANDED wxEVT_TREE_ITEM_EXPANDED +#define wxEVT_COMMAND_TREE_ITEM_EXPANDING wxEVT_TREE_ITEM_EXPANDING +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSED wxEVT_TREE_ITEM_COLLAPSED +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSING wxEVT_TREE_ITEM_COLLAPSING +#define wxEVT_COMMAND_TREE_SEL_CHANGED wxEVT_TREE_SEL_CHANGED +#define wxEVT_COMMAND_TREE_SEL_CHANGING wxEVT_TREE_SEL_CHANGING +#define wxEVT_COMMAND_TREE_KEY_DOWN wxEVT_TREE_KEY_DOWN #endif // _WX_TREECTRL_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/webview_webkit.h b/Externals/wxWidgets3/include/wx/osx/webview_webkit.h index d0a93e653e..803f8b0b29 100644 --- a/Externals/wxWidgets3/include/wx/osx/webview_webkit.h +++ b/Externals/wxWidgets3/include/wx/osx/webview_webkit.h @@ -5,7 +5,6 @@ // Author: Jethro Grassie / Kevin Ollivier / Marianne Gagnon // Modified by: // Created: 2004-4-16 -// RCS-ID: $Id: webview_webkit.h 69074 2011-09-12 18:35:39Z SJL $ // Copyright: (c) Jethro Grassie / Kevin Ollivier / Marianne Gagnon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,6 +20,8 @@ #include "wx/control.h" #include "wx/webview.h" +#include "wx/osx/core/objcid.h" + // ---------------------------------------------------------------------------- // Web Kit Control // ---------------------------------------------------------------------------- @@ -52,15 +53,11 @@ public: virtual bool CanGoForward() const; virtual void GoBack(); virtual void GoForward(); - virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT); + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT); virtual void Stop(); virtual wxString GetPageSource() const; virtual wxString GetPageText() const; - //We do not want to hide the other overloads - using wxWebView::SetPage; - virtual void SetPage(const wxString& html, const wxString& baseUrl); - virtual void Print(); virtual void LoadURL(const wxString& url); @@ -74,20 +71,28 @@ public: virtual bool CanSetZoomType(wxWebViewZoomType type) const; virtual bool IsBusy() const { return m_busy; } - + //History functions virtual void ClearHistory(); virtual void EnableHistory(bool enable = true); virtual wxVector > GetBackwardHistory(); virtual wxVector > GetForwardHistory(); virtual void LoadHistoryItem(wxSharedPtr item); - + //Undo / redo functionality virtual bool CanUndo() const; virtual bool CanRedo() const; virtual void Undo(); virtual void Redo(); + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT) + { + wxUnusedVar(text); + wxUnusedVar(flags); + return wxNOT_FOUND; + } + //Clipboard functions virtual bool CanCut() const { return true; } virtual bool CanCopy() const { return true; } @@ -95,11 +100,11 @@ public: virtual void Cut(); virtual void Copy(); virtual void Paste(); - + //Editing functions virtual void SetEditable(bool enable = true); virtual bool IsEditable() const; - + //Selection virtual void DeleteSelection(); virtual bool HasSelection() const; @@ -107,12 +112,14 @@ public: virtual wxString GetSelectedText() const; virtual wxString GetSelectedSource() const; virtual void ClearSelection(); - + void RunScript(const wxString& javascript); - + //Virtual Filesystem Support virtual void RegisterHandler(wxSharedPtr handler); + virtual void* GetNativeBackend() const { return m_webView; } + // ---- methods not from the parent (common) interface bool CanGetPageSource() const; @@ -141,6 +148,8 @@ public: bool m_busy; protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl); + DECLARE_EVENT_TABLE() void MacVisibilityChanged(); @@ -149,7 +158,7 @@ private: wxWindowID m_windowID; wxString m_pageTitle; - struct objc_object *m_webView; + wxObjCID m_webView; // we may use this later to setup our own mouse events, // so leave it in for now. @@ -158,6 +167,20 @@ private: //TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this. }; -#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT +class WXDLLIMPEXP_WEBVIEW wxWebViewFactoryWebKit : public wxWebViewFactory +{ +public: + virtual wxWebView* Create() { return new wxWebViewWebKit; } + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) + { return new wxWebViewWebKit(parent, id, url, pos, size, style, name); } +}; + +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT #endif // _WX_WEBKIT_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/webviewhistoryitem_webkit.h b/Externals/wxWidgets3/include/wx/osx/webviewhistoryitem_webkit.h index 05976803f5..f1c2d5f655 100644 --- a/Externals/wxWidgets3/include/wx/osx/webviewhistoryitem_webkit.h +++ b/Externals/wxWidgets3/include/wx/osx/webviewhistoryitem_webkit.h @@ -2,7 +2,6 @@ // Name: include/wx/osx/webviewhistoryitem.h // Purpose: wxWebViewHistoryItem header for OSX // Author: Steven Lamerton -// Id: $Id: webviewhistoryitem_webkit.h 69074 2011-09-12 18:35:39Z SJL $ // Copyright: (c) 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -15,6 +14,8 @@ #if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && (defined(__WXOSX_COCOA__) \ || defined(__WXOSX_CARBON__)) +#include "wx/osx/core/objcid.h" + class WXDLLIMPEXP_WEBVIEW wxWebViewHistoryItem { public: @@ -27,9 +28,9 @@ public: private: wxString m_url, m_title; - struct objc_object *m_histItem; + wxObjCID m_histItem; }; -#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT #endif // _WX_OSX_WEBVIEWHISTORYITEM_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/window.h b/Externals/wxWidgets3/include/wx/osx/window.h index 1ac3916a8c..623493aa1e 100644 --- a/Externals/wxWidgets3/include/wx/osx/window.h +++ b/Externals/wxWidgets3/include/wx/osx/window.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: window.h 70765 2012-03-01 15:04:42Z JS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -55,6 +54,8 @@ public: long style = 0, const wxString& name = wxPanelNameStr ); + virtual void SendSizeEvent(int flags = 0); + // implement base class pure virtuals virtual void SetLabel( const wxString& label ); virtual wxString GetLabel() const; @@ -95,7 +96,7 @@ public: virtual int GetCharHeight() const; virtual int GetCharWidth() const; - + public: virtual void SetScrollbar( int orient, int pos, int thumbVisible, int range, bool refresh = true ); @@ -259,7 +260,10 @@ public: // optimization to avoid creating a user pane in wxWindow::Create if we already know // we will replace it with our own peer void DontCreatePeer(); - + + // return true unless DontCreatePeer() had been called + bool ShouldCreatePeer() const; + // sets the native implementation wrapper, can replace an existing peer, use peer = NULL to // release existing peer void SetPeer(wxOSXWidgetImpl* peer); @@ -273,7 +277,7 @@ public: // // this is useful for a few Cocoa function which can work with either views // or windows indiscriminately, e.g. for setting NSViewAnimationTargetKey - virtual void *OSXGetViewOrWindow() const { return GetHandle(); } + virtual void *OSXGetViewOrWindow() const; #endif // Cocoa void * MacGetCGContextRef() { return m_cgContextRef ; } @@ -283,10 +287,11 @@ public: virtual bool OSXHandleClicked( double timestampsec ); virtual bool OSXHandleKeyEvent( wxKeyEvent& event ); + virtual void OSXSimulateFocusEvents(); bool IsNativeWindowWrapper() const { return m_isNativeWindowWrapper; } - float GetContentScaleFactor() const ; + double GetContentScaleFactor() const ; // internal response to size events virtual void MacOnInternalSize() {} diff --git a/Externals/wxWidgets3/include/wx/overlay.h b/Externals/wxWidgets3/include/wx/overlay.h index 7f29b4fc71..adde26db86 100644 --- a/Externals/wxWidgets3/include/wx/overlay.h +++ b/Externals/wxWidgets3/include/wx/overlay.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2006-10-20 -// RCS-ID: $Id: overlay.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ownerdrw.h b/Externals/wxWidgets3/include/wx/ownerdrw.h index 37a525844e..b25f5cc71a 100644 --- a/Externals/wxWidgets3/include/wx/ownerdrw.h +++ b/Externals/wxWidgets3/include/wx/ownerdrw.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Marcin Malich // Created: 11.11.97 -// RCS-ID: $Id: ownerdrw.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/palette.h b/Externals/wxWidgets3/include/wx/palette.h index 4c29f23b98..85bf7dd689 100644 --- a/Externals/wxWidgets3/include/wx/palette.h +++ b/Externals/wxWidgets3/include/wx/palette.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: palette.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/panel.h b/Externals/wxWidgets3/include/wx/panel.h index 18c7aacd47..11fc2c6416 100644 --- a/Externals/wxWidgets3/include/wx/panel.h +++ b/Externals/wxWidgets3/include/wx/panel.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: panel.h 69378 2011-10-11 17:07:43Z VZ $ // Copyright: (c) Julian Smart // (c) 2011 Vadim Zeitlin // Licence: wxWindows Licence diff --git a/Externals/wxWidgets3/include/wx/paper.h b/Externals/wxWidgets3/include/wx/paper.h index 89dfe20d3c..d50d549804 100644 --- a/Externals/wxWidgets3/include/wx/paper.h +++ b/Externals/wxWidgets3/include/wx/paper.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: paper.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/pen.h b/Externals/wxWidgets3/include/wx/pen.h index 75147dcf37..e55b046eff 100644 --- a/Externals/wxWidgets3/include/wx/pen.h +++ b/Externals/wxWidgets3/include/wx/pen.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: pen.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -32,15 +31,14 @@ enum wxPenStyle wxPENSTYLE_STIPPLE_MASK = wxSTIPPLE_MASK, wxPENSTYLE_STIPPLE = wxSTIPPLE, - wxPENSTYLE_BDIAGONAL_HATCH = wxBDIAGONAL_HATCH, - wxPENSTYLE_CROSSDIAG_HATCH = wxCROSSDIAG_HATCH, - wxPENSTYLE_FDIAGONAL_HATCH = wxFDIAGONAL_HATCH, - wxPENSTYLE_CROSS_HATCH = wxCROSS_HATCH, - wxPENSTYLE_HORIZONTAL_HATCH = wxHORIZONTAL_HATCH, - wxPENSTYLE_VERTICAL_HATCH = wxVERTICAL_HATCH, - - wxPENSTYLE_FIRST_HATCH = wxFIRST_HATCH, - wxPENSTYLE_LAST_HATCH = wxLAST_HATCH + wxPENSTYLE_BDIAGONAL_HATCH = wxHATCHSTYLE_BDIAGONAL, + wxPENSTYLE_CROSSDIAG_HATCH = wxHATCHSTYLE_CROSSDIAG, + wxPENSTYLE_FDIAGONAL_HATCH = wxHATCHSTYLE_FDIAGONAL, + wxPENSTYLE_CROSS_HATCH = wxHATCHSTYLE_CROSS, + wxPENSTYLE_HORIZONTAL_HATCH = wxHATCHSTYLE_HORIZONTAL, + wxPENSTYLE_VERTICAL_HATCH = wxHATCHSTYLE_VERTICAL, + wxPENSTYLE_FIRST_HATCH = wxHATCHSTYLE_FIRST, + wxPENSTYLE_LAST_HATCH = wxHATCHSTYLE_LAST }; enum wxPenJoin diff --git a/Externals/wxWidgets3/include/wx/persist.h b/Externals/wxWidgets3/include/wx/persist.h index 2ac6a4423e..45ed61eb9e 100644 --- a/Externals/wxWidgets3/include/wx/persist.h +++ b/Externals/wxWidgets3/include/wx/persist.h @@ -3,7 +3,6 @@ // Purpose: common classes for persistence support // Author: Vadim Zeitlin // Created: 2009-01-18 -// RCS-ID: $Id: persist.h 69583 2011-10-30 10:08:18Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/persist/bookctrl.h b/Externals/wxWidgets3/include/wx/persist/bookctrl.h index e01b19eaec..38eee262e9 100644 --- a/Externals/wxWidgets3/include/wx/persist/bookctrl.h +++ b/Externals/wxWidgets3/include/wx/persist/bookctrl.h @@ -3,7 +3,6 @@ // Purpose: persistence support for wxBookCtrl // Author: Vadim Zeitlin // Created: 2009-01-19 -// RCS-ID: $Id: bookctrl.h 58529 2009-01-30 21:38:29Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/persist/splitter.h b/Externals/wxWidgets3/include/wx/persist/splitter.h index 5f8fe34158..d8369c3783 100644 --- a/Externals/wxWidgets3/include/wx/persist/splitter.h +++ b/Externals/wxWidgets3/include/wx/persist/splitter.h @@ -3,7 +3,6 @@ // Purpose: Persistence support for wxSplitterWindow. // Author: Vadim Zeitlin // Created: 2011-08-31 -// RCS-ID: $Id: splitter.h 69582 2011-10-30 10:08:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/persist/toplevel.h b/Externals/wxWidgets3/include/wx/persist/toplevel.h index 34b4890625..7d79f23460 100644 --- a/Externals/wxWidgets3/include/wx/persist/toplevel.h +++ b/Externals/wxWidgets3/include/wx/persist/toplevel.h @@ -3,7 +3,6 @@ // Purpose: persistence support for wxTLW // Author: Vadim Zeitlin // Created: 2009-01-19 -// RCS-ID: $Id: toplevel.h 58529 2009-01-30 21:38:29Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/persist/treebook.h b/Externals/wxWidgets3/include/wx/persist/treebook.h index 0156fb8b94..1c0ba94631 100644 --- a/Externals/wxWidgets3/include/wx/persist/treebook.h +++ b/Externals/wxWidgets3/include/wx/persist/treebook.h @@ -3,7 +3,6 @@ // Purpose: persistence support for wxBookCtrl // Author: Vadim Zeitlin // Created: 2009-01-19 -// RCS-ID: $Id: treebook.h 58529 2009-01-30 21:38:29Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/persist/window.h b/Externals/wxWidgets3/include/wx/persist/window.h index 08d0e54c9a..279e11d26d 100644 --- a/Externals/wxWidgets3/include/wx/persist/window.h +++ b/Externals/wxWidgets3/include/wx/persist/window.h @@ -3,7 +3,6 @@ // Purpose: wxPersistentWindow declaration // Author: Vadim Zeitlin // Created: 2009-01-23 -// RCS-ID: $Id: window.h 59262 2009-03-02 12:10:40Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/pickerbase.h b/Externals/wxWidgets3/include/wx/pickerbase.h index ff5c86f0de..3c761da876 100644 --- a/Externals/wxWidgets3/include/wx/pickerbase.h +++ b/Externals/wxWidgets3/include/wx/pickerbase.h @@ -5,7 +5,6 @@ // Modified by: // Created: 14/4/2006 // Copyright: (c) Vadim Zeitlin, Francesco Montorsi -// RCS-ID: $Id: pickerbase.h 68921 2011-08-27 14:11:25Z VZ $ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -106,6 +105,11 @@ public: // public API wxControl *GetPickerCtrl() { return m_picker; } + void SetTextCtrl(wxTextCtrl* text) + { m_text = text; } + void SetPickerCtrl(wxControl* picker) + { m_picker = picker; } + // methods that derived class must/may override virtual void UpdatePickerFromTextCtrl() = 0; virtual void UpdateTextCtrlFromPicker() = 0; diff --git a/Externals/wxWidgets3/include/wx/platform.h b/Externals/wxWidgets3/include/wx/platform.h index 74ad218a3a..53b04e522d 100644 --- a/Externals/wxWidgets3/include/wx/platform.h +++ b/Externals/wxWidgets3/include/wx/platform.h @@ -4,7 +4,6 @@ * Author: Vadim Zeitlin * Modified by: * Created: 29.10.01 (extracted from wx/defs.h) -* RCS-ID: $Id: platform.h 70757 2012-02-29 22:40:24Z VZ $ * Copyright: (c) 1997-2001 Vadim Zeitlin * Licence: wxWindows licence */ @@ -14,16 +13,6 @@ #ifndef _WX_PLATFORM_H_ #define _WX_PLATFORM_H_ - - -/* - Codewarrior doesn't define any Windows symbols until some headers - are included -*/ -#ifdef __MWERKS__ -# include -#endif - #ifdef __WXMAC_XCODE__ # include # include @@ -37,6 +26,12 @@ # ifndef MAC_OS_X_VERSION_10_6 # define MAC_OS_X_VERSION_10_6 1060 # endif +# ifndef MAC_OS_X_VERSION_10_7 +# define MAC_OS_X_VERSION_10_7 1070 +# endif +# ifndef MAC_OS_X_VERSION_10_8 +# define MAC_OS_X_VERSION_10_8 1080 +# endif # include "wx/osx/config_xcode.h" # ifndef __WXOSX__ # define __WXOSX__ 1 @@ -47,14 +42,20 @@ #endif /* - first define Windows symbols if they're not defined on the command line: we - can autodetect everything we need if _WIN32 is defined + We use __WINDOWS__ as our main identification symbol for Microsoft Windows + but it's actually not predefined directly by any commonly used compilers + (only Watcom defines it itself and it's not supported any longer), so we + define it ourselves if any of the following macros is defined: + + - MSVC _WIN32 (notice that this is also defined under Win64) + - Borland __WIN32__ + - Our __WXMSW__ which selects Windows as platform automatically */ -#if defined(__CYGWIN__) && defined(__WINDOWS__) -# ifndef __WXMSW__ -# define __WXMSW__ -# endif -#endif +#if defined(_WIN32) || defined(__WIN32__) || defined(__WXMSW__) +# ifndef __WINDOWS__ +# define __WINDOWS__ +# endif /* !__WINDOWS__ */ +#endif /* Any standard symbol indicating Windows */ #if defined(_WIN64) # ifndef _WIN32 @@ -71,14 +72,12 @@ # endif /* !__WIN64__ */ #endif /* _WIN64 */ -#if (defined(_WIN32) || defined(WIN32) || defined(__NT__) || defined(__WXWINCE__)) \ - && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) -# ifndef __WXMSW__ -# define __WXMSW__ -# endif -#endif /* Win32 */ +#if defined(__WINDOWS__) + /* Select wxMSW under Windows if no other port is specified. */ +# if !defined(__WXMSW__) && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) +# define __WXMSW__ +# endif -#if defined(__WXMSW__) # if !defined(__WINDOWS__) # define __WINDOWS__ # endif @@ -94,7 +93,25 @@ # ifndef __WIN32__ # define __WIN32__ # endif -#endif /* __WXMSW__ */ +#endif /* __WINDOWS__ */ + +/* Don't use widget toolkit specific code in non-GUI code */ +#if defined(wxUSE_GUI) && !wxUSE_GUI +# ifdef __WXMSW__ +# undef __WXMSW__ +# endif +# ifdef __WXGTK__ +# undef __WXGTK__ +# endif +#endif + +#if defined(__WXGTK__) && defined(__WINDOWS__) + +# ifdef __WXMSW__ +# undef __WXMSW__ +# endif + +#endif /* __WXGTK__ && __WINDOWS__ */ /* detect MS SmartPhone */ #if defined( WIN32_PLATFORM_WFSP ) @@ -154,24 +171,18 @@ # include "wx/android/config_android.h" #endif +#include "wx/compiler.h" + /* Include wx/setup.h for the Unix platform defines generated by configure and the library compilation options Note that it must be included before defining hardware symbols below as they - could be already defined by configure + could be already defined by configure but it must be included after defining + the compiler macros above as msvc/wx/setup.h relies on them under Windows. */ #include "wx/setup.h" -#ifdef __GCCXML__ - /* - we're using gccxml to create an XML representation of the entire - wxWidgets interface; use a special setup_gccxml.h file to fix some - of the stuff #defined by the real setup.h - */ - #include "wx/setup_gccxml.h" -#endif - /* Convenience for any optional classes that use the wxAnyButton base class. */ @@ -236,11 +247,6 @@ # endif #endif /* wxUSE_UNICODE */ -#if defined( __MWERKS__ ) && !defined(__INTEL__) -/* otherwise MSL headers bring in WIN32 dependant APIs */ -#undef UNICODE -#endif - /* test for old versions of Borland C, normally need at least 5.82, Turbo @@ -279,25 +285,6 @@ # define wxCOMPILER_BROKEN_CONCAT_OPER #endif /* __BORLANDC__ */ -/* - Define Watcom-specific macros. -*/ -#ifndef __WATCOMC__ -# define wxWATCOM_VERSION(major,minor) 0 -# define wxCHECK_WATCOM_VERSION(major,minor) 0 -# define wxONLY_WATCOM_EARLIER_THAN(major,minor) 0 -# define WX_WATCOM_ONLY_CODE( x ) -#else -# if __WATCOMC__ < 1200 -# error "Only Open Watcom is supported in this release" -# endif - -# define wxWATCOM_VERSION(major,minor) ( major * 100 + minor * 10 + 1100 ) -# define wxCHECK_WATCOM_VERSION(major,minor) ( __WATCOMC__ >= wxWATCOM_VERSION(major,minor) ) -# define wxONLY_WATCOM_EARLIER_THAN(major,minor) ( __WATCOMC__ < wxWATCOM_VERSION(major,minor) ) -# define WX_WATCOM_ONLY_CODE( x ) x -#endif - /* OS: first of all, test for MS-DOS platform. We must do this before testing for Unix, because DJGPP compiler defines __unix__ under MS-DOS @@ -347,12 +334,6 @@ # endif # endif /* SGI */ -# if defined(__SUNPRO_CC) -# ifndef __SUNCC__ -# define __SUNCC__ __SUNPRO_CC -# endif /* Sun CC */ -# endif /* Sun CC */ - # ifdef __EMX__ # define OS2EMX_PLAIN_CHAR # endif @@ -397,17 +378,6 @@ # endif # endif -/* - OS: Classic Mac OS - */ -#elif defined(applec) || \ - defined(THINK_C) || \ - (defined(__MWERKS__) && !defined(__INTEL__)) - /* MacOS */ -# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) -# define wxSIZE_T_IS_ULONG -# endif - /* OS: OS/2 */ @@ -432,61 +402,22 @@ # define wxSIZE_T_IS_UINT /* - OS: Otherwise it must be Windows + OS: Windows */ -#else /* Windows */ -# ifndef __WINDOWS__ -# define __WINDOWS__ -# endif /* Windows */ +#elif defined(__WINDOWS__) /* to be changed for Win64! */ # ifndef __WIN32__ # error "__WIN32__ should be defined for Win32 and Win64, Win16 is not supported" # endif - /* - define another standard symbol for Microsoft Visual C++: the standard - one (_MSC_VER) is also defined by Metrowerks compiler - */ -# if defined(_MSC_VER) && !defined(__MWERKS__) -# define __VISUALC__ _MSC_VER - - /* - define special symbols for different VC version instead of writing tests - for magic numbers such as 1200, 1300 &c repeatedly - */ -# if __VISUALC__ < 1100 -# error "This Visual C++ version is too old and not supported any longer." -# elif __VISUALC__ < 1200 -# define __VISUALC5__ -# elif __VISUALC__ < 1300 -# define __VISUALC6__ -# elif __VISUALC__ < 1400 -# define __VISUALC7__ -# elif __VISUALC__ < 1500 -# define __VISUALC8__ -# elif __VISUALC__ < 1600 -# define __VISUALC9__ -# elif __VISUALC__ < 1700 -# define __VISUALC10__ -# elif __VISUALC__ < 1800 -# define __VISUALC11__ -# else -# pragma message("Please update wx/platform.h to recognize this VC++ version") -# endif - -# elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__) -# define __BORLANDC__ -# elif defined(__WATCOMC__) -# elif defined(__SC__) -# define __SYMANTECC__ -# endif /* compiler */ - /* size_t is the same as unsigned int for all Windows compilers we know, */ /* so define it if it hadn't been done by configure yet */ # if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) && !defined(__WIN64__) # define wxSIZE_T_IS_UINT # endif +#else +# error "Unknown platform." #endif /* OS */ /* @@ -501,18 +432,6 @@ # define __X__ #endif -#ifdef __SC__ -# ifdef __DMC__ -# define __DIGITALMARS__ -# else -# define __SYMANTEC__ -# endif -#endif - -#ifdef __INTEL_COMPILER -# define __INTELC__ -#endif - /* We get "Large Files (ILP32) not supported in strict ANSI mode." #error from HP-UX standard headers when compiling with g++ without this: @@ -528,69 +447,23 @@ # include "wx/msw/libraries.h" #endif -/* - This macro can be used to test the gcc version and can be used like this: - -# if wxCHECK_GCC_VERSION(3, 1) - ... we have gcc 3.1 or later ... -# else - ... no gcc at all or gcc < 3.1 ... -# endif -*/ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) - #define wxCHECK_GCC_VERSION( major, minor ) \ - ( ( __GNUC__ > (major) ) \ - || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) -#else - #define wxCHECK_GCC_VERSION( major, minor ) 0 -#endif - #if defined(__BORLANDC__) || (defined(__GNUC__) && __GNUC__ < 3) #define wxNEEDS_CHARPP #endif -/* - This macro can be used to test the Visual C++ version. -*/ -#ifndef __VISUALC__ -# define wxVISUALC_VERSION(major) 0 -# define wxCHECK_VISUALC_VERSION(major) 0 -#else -# define wxVISUALC_VERSION(major) ( (6 + major) * 100 ) -# define wxCHECK_VISUALC_VERSION(major) ( __VISUALC__ >= wxVISUALC_VERSION(major) ) -#endif - -/* - This macro can be used to check that the version of mingw32 compiler is - at least maj.min - */ #if ( defined( __GNUWIN32__ ) || defined( __MINGW32__ ) || \ ( defined( __CYGWIN__ ) && defined( __WINDOWS__ ) ) || \ wxCHECK_WATCOM_VERSION(1,0) ) && \ !defined(__DOS__) && \ !defined(__WXPM__) && \ !defined(__WXMOTIF__) && \ - !defined(__WXGTK__) && \ !defined(__WXX11__) # include "wx/msw/gccpriv.h" #else # undef wxCHECK_W32API_VERSION # define wxCHECK_W32API_VERSION(maj, min) (0) -# undef wxCHECK_MINGW32_VERSION -# define wxCHECK_MINGW32_VERSION(maj, min) (0) #endif -/** - This is similar to wxCHECK_GCC_VERSION but for Sun CC compiler. - */ -#ifdef __SUNCC__ - /* - __SUNCC__ is 0xVRP where V is major version, R release and P patch level - */ - #define wxCHECK_SUNCC_VERSION(maj, min) (__SUNCC__ >= (((maj)<<8) | ((min)<<4))) -#else - #define wxCHECK_SUNCC_VERSION(maj, min) (0) -#endif /* Handle Darwin gcc universal compilation. Don't do this in an Apple- @@ -644,8 +517,7 @@ checking for any OS X port (Carbon and Cocoa) and __WXMAC__ is an old name for it. */ -#if defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__) || defined(__WXOSX_IPHONE__) \ - || (defined(__DARWIN__) && !wxUSE_GUI) +#if defined(__WXOSX_CARBON__) || defined(__WXOSX_COCOA__) || defined(__WXOSX_IPHONE__) # ifndef __WXOSX__ # define __WXOSX__ 1 # endif @@ -684,6 +556,12 @@ # ifndef MAC_OS_X_VERSION_10_6 # define MAC_OS_X_VERSION_10_6 1060 # endif +# ifndef MAC_OS_X_VERSION_10_7 +# define MAC_OS_X_VERSION_10_7 1070 +# endif +# ifndef MAC_OS_X_VERSION_10_8 +# define MAC_OS_X_VERSION_10_8 1080 +# endif # else # error "only mach-o configurations are supported" # endif @@ -770,7 +648,7 @@ /* Choose which method we will use for updating menus * - in OnIdle, or when we receive a wxEVT_MENU_OPEN event. - * Presently, only Windows and GTK+ support wxEVT_MENU_OPEN. + * Presently, only Windows, OS X and GTK+ support wxEVT_MENU_OPEN. */ #ifndef wxUSE_IDLEMENUUPDATES # if (defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXOSX__)) && !defined(__WXUNIVERSAL__) diff --git a/Externals/wxWidgets3/include/wx/platinfo.h b/Externals/wxWidgets3/include/wx/platinfo.h index 8adabba16b..f82080e587 100644 --- a/Externals/wxWidgets3/include/wx/platinfo.h +++ b/Externals/wxWidgets3/include/wx/platinfo.h @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 07.07.2006 (based on wxToolkitInfo) -// RCS-ID: $Id: platinfo.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) 2006 Francesco Montorsi // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/popupwin.h b/Externals/wxWidgets3/include/wx/popupwin.h index e6ed10c4e3..6b61517f39 100644 --- a/Externals/wxWidgets3/include/wx/popupwin.h +++ b/Externals/wxWidgets3/include/wx/popupwin.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.01.01 -// RCS-ID: $Id: popupwin.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -130,7 +129,7 @@ protected: // get alerted when child gets deleted from under us void OnDestroy(wxWindowDestroyEvent& event); -#if defined(__WXMSW__) ||(defined(__WXMAC__) && wxOSX_USE_CARBON) +#if defined(__WXMSW__) ||(defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON) // Check if the mouse needs to be captured or released: we must release // when it's inside our window if we want the embedded controls to work. void OnIdle(wxIdleEvent& event); diff --git a/Externals/wxWidgets3/include/wx/position.h b/Externals/wxWidgets3/include/wx/position.h index 20776de396..bd324e2343 100644 --- a/Externals/wxWidgets3/include/wx/position.h +++ b/Externals/wxWidgets3/include/wx/position.h @@ -3,7 +3,6 @@ // Purpose: Common structure and methods for positional information. // Author: Vadim Zeitlin, Robin Dunn, Brad Anderson, Bryan Petty // Created: 2007-03-13 -// RCS-ID: $Id: position.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2007 The wxWidgets Team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/power.h b/Externals/wxWidgets3/include/wx/power.h index ea3a11c9fc..17e81b6efb 100644 --- a/Externals/wxWidgets3/include/wx/power.h +++ b/Externals/wxWidgets3/include/wx/power.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2006-05-27 -// RCS-ID: $Id: power.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/preferences.h b/Externals/wxWidgets3/include/wx/preferences.h new file mode 100644 index 0000000000..7eee648289 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/preferences.h @@ -0,0 +1,145 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/preferences.h +// Purpose: Declaration of wxPreferencesEditor class. +// Author: Vaclav Slavik +// Created: 2013-02-19 +// Copyright: (c) 2013 Vaclav Slavik +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PREFERENCES_H_ +#define _WX_PREFERENCES_H_ + +#include "wx/defs.h" + +#if wxUSE_PREFERENCES_EDITOR + +#include "wx/bitmap.h" +#include "wx/vector.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +class wxPreferencesEditorImpl; + +#if defined(__WXOSX_COCOA__) + // GetLargeIcon() is used + #define wxHAS_PREF_EDITOR_ICONS + // Changes should be applied immediately + #define wxHAS_PREF_EDITOR_APPLY_IMMEDIATELY + // The dialog is shown non-modally. + #define wxHAS_PREF_EDITOR_MODELESS +#elif defined(__WXGTK__) + // Changes should be applied immediately + #define wxHAS_PREF_EDITOR_APPLY_IMMEDIATELY + // The dialog is shown non-modally. + #define wxHAS_PREF_EDITOR_MODELESS +#endif + +// ---------------------------------------------------------------------------- +// wxPreferencesEditor: Native preferences editing +// ---------------------------------------------------------------------------- + +// One page of a preferences window +class WXDLLIMPEXP_CORE wxPreferencesPage +{ +public: + wxPreferencesPage() {} + virtual ~wxPreferencesPage() {} + + // Name of the page, used e.g. for tabs + virtual wxString GetName() const = 0; + + // Return 32x32 icon used for the page. Currently only used on OS X, where + // implementation is required; unused on other platforms. Because of this, + // the method is only pure virtual on platforms that use it. +#ifdef wxHAS_PREF_EDITOR_ICONS + virtual wxBitmap GetLargeIcon() const = 0; +#else + virtual wxBitmap GetLargeIcon() const { return wxBitmap(); } +#endif + + // Create a window (usually a wxPanel) for this page. The caller takes + // ownership of the returned window. + virtual wxWindow *CreateWindow(wxWindow *parent) = 0; + + wxDECLARE_NO_COPY_CLASS(wxPreferencesPage); +}; + + +// Helper for implementing some common pages (General, Advanced) +class WXDLLIMPEXP_CORE wxStockPreferencesPage : public wxPreferencesPage +{ +public: + enum Kind + { + Kind_General, + Kind_Advanced + }; + + wxStockPreferencesPage(Kind kind) : m_kind(kind) {} + Kind GetKind() const { return m_kind; } + + virtual wxString GetName() const; +#ifdef __WXOSX_COCOA__ + virtual wxBitmap GetLargeIcon() const; +#endif + +private: + Kind m_kind; +}; + + +// Notice that this class does not inherit from wxWindow. +class WXDLLIMPEXP_CORE wxPreferencesEditor +{ +public: + // Ctor creates an empty editor, use AddPage() to add controls to it. + wxPreferencesEditor(const wxString& title = wxString()); + + // Dtor destroys the dialog if still shown. + virtual ~wxPreferencesEditor(); + + // Add a new page to the editor. The editor takes ownership of the page + // and won't delete it until it is destroyed itself. + void AddPage(wxPreferencesPage *page); + + // Show the preferences dialog or bring it to the top if it's already + // shown. Notice that this method may or may not block depending on the + // platform, i.e. depending on whether the dialog is modal or not. + virtual void Show(wxWindow* parent); + + // Hide the currently shown dialog, if any. This is typically used to + // dismiss the dialog if the object whose preferences it is editing was + // closed. + void Dismiss(); + + // Whether changes to values in the pages should be applied immediately + // (OS X, GTK+) or only when the user clicks OK/Apply (Windows) + static bool ShouldApplyChangesImmediately() + { +#ifdef wxHAS_PREF_EDITOR_APPLY_IMMEDIATELY + return true; +#else + return false; +#endif + } + + // Whether the dialog is shown modally, i.e. Show() blocks, or not. + static bool ShownModally() + { +#ifdef wxHAS_PREF_EDITOR_MODELESS + return false; +#else + return true; +#endif + } + +private: + wxPreferencesEditorImpl* m_impl; + + wxDECLARE_NO_COPY_CLASS(wxPreferencesEditor); +}; + +#endif // wxUSE_PREFERENCES_EDITOR + +#endif // _WX_PREFERENCES_H_ diff --git a/Externals/wxWidgets3/include/wx/print.h b/Externals/wxWidgets3/include/wx/print.h index 9d11bb741a..56ebcf6597 100644 --- a/Externals/wxWidgets3/include/wx/print.h +++ b/Externals/wxWidgets3/include/wx/print.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: print.h 54125 2008-06-11 19:17:41Z SC $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/printdlg.h b/Externals/wxWidgets3/include/wx/printdlg.h index 826fbca204..d7e7e4e267 100644 --- a/Externals/wxWidgets3/include/wx/printdlg.h +++ b/Externals/wxWidgets3/include/wx/printdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: printdlg.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/eventloopsourcesmanager.h b/Externals/wxWidgets3/include/wx/private/eventloopsourcesmanager.h new file mode 100644 index 0000000000..54ce5b0fce --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/eventloopsourcesmanager.h @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/eventloopsourcesmanager.h +// Purpose: declares wxEventLoopSourcesManagerBase class +// Author: Rob Bresalier +// Created: 2013-06-19 +// Copyright: (c) 2013 Rob Bresalier +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_ +#define _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_ + +// For pulling in the value of wxUSE_EVENTLOOP_SOURCE +#include "wx/evtloop.h" + +class WXDLLIMPEXP_BASE wxEventLoopSourcesManagerBase +{ +public: +#if wxUSE_EVENTLOOP_SOURCE + virtual wxEventLoopSource* + AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags) = 0; +#endif +}; + +#endif // _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_ diff --git a/Externals/wxWidgets3/include/wx/private/fd.h b/Externals/wxWidgets3/include/wx/private/fd.h index 57a4c1b9b8..3f4a604c37 100644 --- a/Externals/wxWidgets3/include/wx/private/fd.h +++ b/Externals/wxWidgets3/include/wx/private/fd.h @@ -3,7 +3,6 @@ // Purpose: private stuff for working with file descriptors // Author: Vadim Zeitlin // Created: 2008-11-23 (moved from wx/unix/private.h) -// RCS-ID: $Id: fd.h 62790 2009-12-06 02:29:42Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/fdiodispatcher.h b/Externals/wxWidgets3/include/wx/private/fdiodispatcher.h index aef0dc88e0..0b85505cc0 100644 --- a/Externals/wxWidgets3/include/wx/private/fdiodispatcher.h +++ b/Externals/wxWidgets3/include/wx/private/fdiodispatcher.h @@ -4,7 +4,6 @@ // Authors: Lukasz Michalski // Created: December 2006 // Copyright: (c) Lukasz Michalski -// RCS-ID: $Id: fdiodispatcher.h 61686 2009-08-17 23:02:29Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/fdioeventloopsourcehandler.h b/Externals/wxWidgets3/include/wx/private/fdioeventloopsourcehandler.h new file mode 100644 index 0000000000..f457a09e5c --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/fdioeventloopsourcehandler.h @@ -0,0 +1,38 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/fdioeventloopsourcehandler.h +// Purpose: declares wxFDIOEventLoopSourceHandler class +// Author: Rob Bresalier, Vadim Zeitlin +// Created: 2013-06-13 (extracted from src/unix/evtloopunix.cpp) +// Copyright: (c) 2009 Vadim Zeitlin +// (c) 2013 Rob Bresalier +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H +#define _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H + +#include "wx/evtloopsrc.h" + +// This class is a temporary bridge between event loop sources and +// FDIODispatcher. It is going to be removed soon, when all subject interfaces +// are modified +class wxFDIOEventLoopSourceHandler : public wxFDIOHandler +{ +public: + wxEXPLICIT wxFDIOEventLoopSourceHandler(wxEventLoopSourceHandler* handler) + : m_handler(handler) + { + } + + // Just forward to the real handler. + virtual void OnReadWaiting() { m_handler->OnReadWaiting(); } + virtual void OnWriteWaiting() { m_handler->OnWriteWaiting(); } + virtual void OnExceptionWaiting() { m_handler->OnExceptionWaiting(); } + +protected: + wxEventLoopSourceHandler* const m_handler; + + wxDECLARE_NO_COPY_CLASS(wxFDIOEventLoopSourceHandler); +}; + +#endif // _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H diff --git a/Externals/wxWidgets3/include/wx/private/fdiohandler.h b/Externals/wxWidgets3/include/wx/private/fdiohandler.h index e7fa5efbd2..94e36490cd 100644 --- a/Externals/wxWidgets3/include/wx/private/fdiohandler.h +++ b/Externals/wxWidgets3/include/wx/private/fdiohandler.h @@ -3,7 +3,6 @@ // Purpose: declares wxFDIOHandler class // Author: Vadim Zeitlin // Created: 2009-08-17 -// RCS-ID: $Id: fdiohandler.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/fdiomanager.h b/Externals/wxWidgets3/include/wx/private/fdiomanager.h index 46b6996280..0721886f35 100644 --- a/Externals/wxWidgets3/include/wx/private/fdiomanager.h +++ b/Externals/wxWidgets3/include/wx/private/fdiomanager.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxFDIOManager // Author: Vadim Zeitlin // Created: 2009-08-17 -// RCS-ID: $Id: fdiomanager.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/fileback.h b/Externals/wxWidgets3/include/wx/private/fileback.h index a65b3419c9..aaf5ab4afb 100644 --- a/Externals/wxWidgets3/include/wx/private/fileback.h +++ b/Externals/wxWidgets3/include/wx/private/fileback.h @@ -2,7 +2,6 @@ // Name: wx/private/fileback.h // Purpose: Back an input stream with memory or a file // Author: Mike Wetherell -// RCS-ID: $Id: fileback.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2006 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/filename.h b/Externals/wxWidgets3/include/wx/private/filename.h index d2ac7c2c55..a4ed481020 100644 --- a/Externals/wxWidgets3/include/wx/private/filename.h +++ b/Externals/wxWidgets3/include/wx/private/filename.h @@ -4,7 +4,6 @@ // Author: Mike Wetherell // Modified by: // Created: 2006-10-22 -// RCS-ID: $Id: filename.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2006 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/flagscheck.h b/Externals/wxWidgets3/include/wx/private/flagscheck.h index 742eb02e87..3e3d9fbaae 100644 --- a/Externals/wxWidgets3/include/wx/private/flagscheck.h +++ b/Externals/wxWidgets3/include/wx/private/flagscheck.h @@ -3,7 +3,6 @@ // Purpose: helpers for checking that (bit)flags don't overlap // Author: Vaclav Slavik // Created: 2008-02-21 -// RCS-ID: $Id: flagscheck.h 59016 2009-02-19 05:34:25Z PC $ // Copyright: (c) 2008 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/fontmgr.h b/Externals/wxWidgets3/include/wx/private/fontmgr.h index e29ac1eece..c00270a6b1 100644 --- a/Externals/wxWidgets3/include/wx/private/fontmgr.h +++ b/Externals/wxWidgets3/include/wx/private/fontmgr.h @@ -3,7 +3,6 @@ // Purpose: font management for ports that don't have their own // Author: Vaclav Slavik // Created: 2006-11-18 -// RCS-ID: $Id: fontmgr.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) // (c) 2006 REA Elektronik GmbH // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/private/fswatcher.h b/Externals/wxWidgets3/include/wx/private/fswatcher.h index 8f6f72ed47..cfffba4a89 100644 --- a/Externals/wxWidgets3/include/wx/private/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/private/fswatcher.h @@ -3,7 +3,6 @@ // Purpose: File system watcher impl classes // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -49,8 +48,13 @@ public: virtual bool Add(const wxFSWatchInfo& winfo) { - wxCHECK_MSG( m_watches.find(winfo.GetPath()) == m_watches.end(), false, - "Path '%s' is already watched"); + if ( m_watches.find(winfo.GetPath()) != m_watches.end() ) + { + wxLogTrace(wxTRACE_FSWATCHER, + "Path '%s' is already watched", winfo.GetPath()); + // This can happen if a dir is watched, then a parent tree added + return true; + } // construct watch entry wxSharedPtr watch(new wxFSWatchEntry(winfo)); @@ -66,8 +70,13 @@ public: virtual bool Remove(const wxFSWatchInfo& winfo) { wxFSWatchEntries::iterator it = m_watches.find(winfo.GetPath()); - wxCHECK_MSG( it != m_watches.end(), false, "Path '%s' is not watched"); - + if ( it == m_watches.end() ) + { + wxLogTrace(wxTRACE_FSWATCHER, + "Path '%s' is not watched", winfo.GetPath()); + // This can happen if a dir is watched, then a parent tree added + return true; + } wxSharedPtr watch = it->second; m_watches.erase(it); return DoRemove(watch); @@ -79,6 +88,12 @@ public: return true; } + // Check whether any filespec matches the file's ext (if present) + bool MatchesFilespec(const wxFileName& fn, const wxString& filespec) const + { + return filespec.empty() || wxMatchWild(filespec, fn.GetFullName()); + } + protected: virtual bool DoAdd(wxSharedPtr watch) = 0; diff --git a/Externals/wxWidgets3/include/wx/private/graphics.h b/Externals/wxWidgets3/include/wx/private/graphics.h index 5d87cacc8f..a5f303dd47 100644 --- a/Externals/wxWidgets3/include/wx/private/graphics.h +++ b/Externals/wxWidgets3/include/wx/private/graphics.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Stefan Csomor -// RCS-ID: $Id: graphics.h 67232 2011-03-18 15:10:15Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,6 +27,18 @@ class WXDLLIMPEXP_CORE wxGraphicsObjectRefData : public wxObjectRefData wxGraphicsRenderer* m_renderer; } ; +class WXDLLIMPEXP_CORE wxGraphicsBitmapData : public wxGraphicsObjectRefData +{ +public : + wxGraphicsBitmapData( wxGraphicsRenderer* renderer) : + wxGraphicsObjectRefData(renderer) {} + + virtual ~wxGraphicsBitmapData() {} + + // returns the native representation + virtual void * GetNativeBitmap() const = 0; +} ; + class WXDLLIMPEXP_CORE wxGraphicsMatrixData : public wxGraphicsObjectRefData { public : diff --git a/Externals/wxWidgets3/include/wx/private/markupparser.h b/Externals/wxWidgets3/include/wx/private/markupparser.h index 46da973b80..855d92ad05 100644 --- a/Externals/wxWidgets3/include/wx/private/markupparser.h +++ b/Externals/wxWidgets3/include/wx/private/markupparser.h @@ -3,7 +3,6 @@ // Purpose: Classes for parsing simple markup. // Author: Vadim Zeitlin // Created: 2011-02-16 -// RCS-ID: $Id: markupparser.h 67076 2011-02-27 18:36:52Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/markupparserattr.h b/Externals/wxWidgets3/include/wx/private/markupparserattr.h index 1cce2f8cce..d433879daf 100644 --- a/Externals/wxWidgets3/include/wx/private/markupparserattr.h +++ b/Externals/wxWidgets3/include/wx/private/markupparserattr.h @@ -3,7 +3,6 @@ // Purpose: Classes mapping markup attributes to wxFont/wxColour. // Author: Vadim Zeitlin // Created: 2011-02-18 -// RCS-ID: $Id: markupparserattr.h 70447 2012-01-23 11:28:32Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/overlay.h b/Externals/wxWidgets3/include/wx/private/overlay.h index 6b85653a87..1149701f7c 100644 --- a/Externals/wxWidgets3/include/wx/private/overlay.h +++ b/Externals/wxWidgets3/include/wx/private/overlay.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2006-10-20 -// RCS-ID: $Id: overlay.h 54125 2008-06-11 19:17:41Z SC $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/pipestream.h b/Externals/wxWidgets3/include/wx/private/pipestream.h new file mode 100644 index 0000000000..f14d9aba79 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/pipestream.h @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/pipestream.h +// Purpose: Declares wxPipeInputStream and wxPipeOutputStream. +// Author: Vadim Zeitlin +// Modified by: Rob Bresalier +// Created: 2013-04-27 +// Copyright: (c) 2003 Vadim Zeitlin +// (c) 2013 Rob Bresalier +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_PIPESTREAM_H_ +#define _WX_PRIVATE_PIPESTREAM_H_ + +#include "wx/platform.h" + +// wxPipeInputStream is a platform-dependent input stream class (i.e. deriving, +// possible indirectly, from wxInputStream) for reading from a pipe, i.e. a +// pipe FD under Unix or a pipe HANDLE under MSW. It provides a single extra +// IsOpened() method. +// +// wxPipeOutputStream is similar but has no additional methods at all. +#ifdef __UNIX__ + #include "wx/unix/private/pipestream.h" +#elif defined(__WINDOWS__) && !defined(__WXWINCE__) + #include "wx/msw/private/pipestream.h" +#endif + +#endif // _WX_PRIVATE_PIPESTREAM_H_ diff --git a/Externals/wxWidgets3/include/wx/private/preferences.h b/Externals/wxWidgets3/include/wx/private/preferences.h new file mode 100644 index 0000000000..8b926450b9 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/preferences.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/preferences.h +// Purpose: wxPreferencesEditorImpl declaration. +// Author: Vaclav Slavik +// Created: 2013-02-19 +// Copyright: (c) 2013 Vaclav Slavik +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_PREFERENCES_H_ +#define _WX_PRIVATE_PREFERENCES_H_ + +#include "wx/preferences.h" + +#if wxUSE_TOOLBAR && defined(__WXOSX_COCOA__) && wxOSX_USE_NATIVE_TOOLBAR + #define wxHAS_PREF_EDITOR_NATIVE +#endif + +// ---------------------------------------------------------------------------- +// wxPreferencesEditorImpl: defines wxPreferencesEditor implementation. +// ---------------------------------------------------------------------------- + +class wxPreferencesEditorImpl +{ +public: + // This is implemented in a platform-specific way. + static wxPreferencesEditorImpl* Create(const wxString& title); + + // These methods simply mirror the public wxPreferencesEditor ones. + virtual void AddPage(wxPreferencesPage* page) = 0; + virtual void Show(wxWindow* parent) = 0; + virtual void Dismiss() = 0; + + virtual ~wxPreferencesEditorImpl() {} + +protected: + wxPreferencesEditorImpl() {} +}; + +#endif // _WX_PRIVATE_PREFERENCES_H_ diff --git a/Externals/wxWidgets3/include/wx/private/richtooltip.h b/Externals/wxWidgets3/include/wx/private/richtooltip.h index 1334778e56..89ce193fa4 100644 --- a/Externals/wxWidgets3/include/wx/private/richtooltip.h +++ b/Externals/wxWidgets3/include/wx/private/richtooltip.h @@ -3,7 +3,6 @@ // Purpose: wxRichToolTipImpl declaration. // Author: Vadim Zeitlin // Created: 2011-10-18 -// RCS-ID: $Id: richtooltip.h 69463 2011-10-18 21:57:02Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -29,11 +28,12 @@ public: const wxColour& colEnd) = 0; virtual void SetCustomIcon(const wxIcon& icon) = 0; virtual void SetStandardIcon(int icon) = 0; - virtual void SetTimeout(unsigned milliseconds) = 0; + virtual void SetTimeout(unsigned milliseconds, + unsigned millisecondsShowdelay = 0) = 0; virtual void SetTipKind(wxTipKind tipKind) = 0; virtual void SetTitleFont(const wxFont& font) = 0; - virtual void ShowFor(wxWindow* win) = 0; + virtual void ShowFor(wxWindow* win, const wxRect* rect = NULL) = 0; virtual ~wxRichToolTipImpl() { } diff --git a/Externals/wxWidgets3/include/wx/private/sckaddr.h b/Externals/wxWidgets3/include/wx/private/sckaddr.h index cebd608d0e..ba2063ed9e 100644 --- a/Externals/wxWidgets3/include/wx/private/sckaddr.h +++ b/Externals/wxWidgets3/include/wx/private/sckaddr.h @@ -3,7 +3,6 @@ // Purpose: wxSockAddressImpl // Author: Vadim Zeitlin // Created: 2008-12-28 -// RCS-ID: $Id: sckaddr.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/selectdispatcher.h b/Externals/wxWidgets3/include/wx/private/selectdispatcher.h index 1e573277ef..644377739f 100644 --- a/Externals/wxWidgets3/include/wx/private/selectdispatcher.h +++ b/Externals/wxWidgets3/include/wx/private/selectdispatcher.h @@ -4,7 +4,6 @@ // Authors: Lukasz Michalski and Vadim Zeitlin // Created: December 2006 // Copyright: (c) Lukasz Michalski -// RCS-ID: $Id: selectdispatcher.h 63716 2010-03-20 12:45:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/socket.h b/Externals/wxWidgets3/include/wx/private/socket.h index 1664066d65..973b764f7d 100644 --- a/Externals/wxWidgets3/include/wx/private/socket.h +++ b/Externals/wxWidgets3/include/wx/private/socket.h @@ -3,7 +3,6 @@ // Purpose: wxSocketImpl and related declarations // Authors: Guilhem Lavaux, Vadim Zeitlin // Created: April 1997 -// RCS-ID: $Id: socket.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1997 Guilhem Lavaux // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence @@ -51,7 +50,7 @@ having been defined in sys/types.h" when winsock.h is included later and doesn't seem to be necessary anyhow. It's not needed under Mac neither. */ -#if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__) +#if !defined(__WXMAC__) && !defined(__WXMSW__) && !defined(__WXWINCE__) #include #endif @@ -79,10 +78,6 @@ // define some symbols which winsock.h defines but traditional BSD headers // don't -#ifndef __WINDOWS__ - #define SOCKET int -#endif - #ifndef INVALID_SOCKET #define INVALID_SOCKET (-1) #endif @@ -293,7 +288,7 @@ public: // TODO: make these fields protected and provide accessors for those of // them that wxSocketBase really needs //protected: - SOCKET m_fd; + wxSOCKET_T m_fd; int m_initialRecvBufferSize; int m_initialSendBufferSize; diff --git a/Externals/wxWidgets3/include/wx/private/streamtempinput.h b/Externals/wxWidgets3/include/wx/private/streamtempinput.h new file mode 100644 index 0000000000..df937cf574 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/streamtempinput.h @@ -0,0 +1,134 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/streamtempinput.h +// Purpose: defines wxStreamTempInputBuffer which is used by Unix and MSW +// implementations of wxExecute; this file is only used by the +// library and never by the user code +// Author: Vadim Zeitlin +// Modified by: Rob Bresalier +// Created: 2013-05-04 +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_STREAMTEMPINPUT_H +#define _WX_PRIVATE_STREAMTEMPINPUT_H + +#include "wx/private/pipestream.h" + +// ---------------------------------------------------------------------------- +// wxStreamTempInputBuffer +// ---------------------------------------------------------------------------- + +/* + wxStreamTempInputBuffer is a hack which we need to solve the problem of + executing a child process synchronously with IO redirecting: when we do + this, the child writes to a pipe we open to it but when the pipe buffer + (which has finite capacity, e.g. commonly just 4Kb) becomes full we have to + read data from it because the child blocks in its write() until then and if + it blocks we are never going to return from wxExecute() so we dead lock. + + So here is the fix: we now read the output as soon as it appears into a temp + buffer (wxStreamTempInputBuffer object) and later just stuff it back into + the stream when the process terminates. See supporting code in wxExecute() + itself as well. + + Note that this is horribly inefficient for large amounts of output (count + the number of times we copy the data around) and so a better API is badly + needed! However it's not easy to devise a way to do this keeping backwards + compatibility with the existing wxExecute(wxEXEC_SYNC)... +*/ +class wxStreamTempInputBuffer +{ +public: + wxStreamTempInputBuffer() + { + m_stream = NULL; + m_buffer = NULL; + m_size = 0; + } + + // call to associate a stream with this buffer, otherwise nothing happens + // at all + void Init(wxPipeInputStream *stream) + { + wxASSERT_MSG( !m_stream, wxS("Can only initialize once") ); + + m_stream = stream; + } + + // check for input on our stream and cache it in our buffer if any + // + // return true if anything was done + bool Update() + { + if ( !m_stream || !m_stream->CanRead() ) + return false; + + // realloc in blocks of 4Kb: this is the default (and minimal) buffer + // size of the Unix pipes so it should be the optimal step + // + // NB: don't use "static int" in this inline function, some compilers + // (e.g. IBM xlC) don't like it + enum { incSize = 4096 }; + + void *buf = realloc(m_buffer, m_size + incSize); + if ( !buf ) + return false; + + m_buffer = buf; + m_stream->Read((char *)m_buffer + m_size, incSize); + m_size += m_stream->LastRead(); + + return true; + } + + // check if can continue reading from the stream, this is used to disable + // the callback once we can't read anything more + bool Eof() const + { + // If we have no stream, always return true as we can't read any more. + return !m_stream || m_stream->Eof(); + } + + // read everything remaining until the EOF, this should only be called once + // the child process terminates and we know that no more data is coming + bool ReadAll() + { + while ( !Eof() ) + { + if ( !Update() ) + return false; + } + + return true; + } + + // dtor puts the data buffered during this object lifetime into the + // associated stream + ~wxStreamTempInputBuffer() + { + if ( m_buffer ) + { + m_stream->Ungetch(m_buffer, m_size); + free(m_buffer); + } + } + + const void *GetBuffer() const { return m_buffer; } + + size_t GetSize() const { return m_size; } + +private: + // the stream we're buffering, if NULL we don't do anything at all + wxPipeInputStream *m_stream; + + // the buffer of size m_size (NULL if m_size == 0) + void *m_buffer; + + // the size of the buffer + size_t m_size; + + wxDECLARE_NO_COPY_CLASS(wxStreamTempInputBuffer); +}; + +#endif // _WX_PRIVATE_STREAMTEMPINPUT_H diff --git a/Externals/wxWidgets3/include/wx/private/textmeasure.h b/Externals/wxWidgets3/include/wx/private/textmeasure.h new file mode 100644 index 0000000000..69fbf85ab2 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/private/textmeasure.h @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/textmeasure.h +// Purpose: declaration of wxTextMeasure class +// Author: Manuel Martin +// Created: 2012-10-05 +// Copyright: (c) 1997-2012 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_TEXTMEASURE_H_ +#define _WX_PRIVATE_TEXTMEASURE_H_ + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +// ---------------------------------------------------------------------------- +// wxTextMeasure: class used to measure text extent. +// ---------------------------------------------------------------------------- + +class wxTextMeasureBase +{ +public: + // The first ctor argument must be non-NULL, i.e. each object of this class + // is associated with either a valid wxDC or a valid wxWindow. The font can + // be NULL to use the current DC/window font or can be specified explicitly. + wxTextMeasureBase(const wxDC *dc, const wxFont *theFont); + wxTextMeasureBase(const wxWindow *win, const wxFont *theFont); + + // Even though this class is not supposed to be used polymorphically, give + // it a virtual dtor to avoid compiler warnings. + virtual ~wxTextMeasureBase() { } + + + // Return the extent of a single line string. + void GetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + // The same for a multiline (with '\n') string. + void GetMultiLineTextExtent(const wxString& text, + wxCoord *width, + wxCoord *height, + wxCoord *heightOneLine = NULL); + + // Find the dimensions of the largest string. + wxSize GetLargestStringExtent(size_t n, const wxString* strings); + wxSize GetLargestStringExtent(const wxArrayString& strings) + { + return GetLargestStringExtent(strings.size(), &strings[0]); + } + + // Fill the array with the widths for each "0..N" substrings for N from 1 + // to text.length(). + // + // The scaleX argument is the horizontal scale used by wxDC and is only + // used in the generic implementation. + bool GetPartialTextExtents(const wxString& text, + wxArrayInt& widths, + double scaleX); + + + // These functions are called by our public methods before and after each + // call to DoGetTextExtent(). Derived classes may override them to prepare + // for -- possibly several -- subsequent calls to DoGetTextExtent(). + // + // As these calls must be always paired, they're never called directly but + // only by our friend MeasuringGuard class. + // + // NB: They're public only to allow VC6 to compile this code, there doesn't + // seem to be any way to give MeasuringGuard access to them (FIXME-VC6) + virtual void BeginMeasuring() { } + virtual void EndMeasuring() { } + + // This is another method which is only used by MeasuringGuard. + bool IsUsingDCImpl() const { return m_useDCImpl; } + +protected: + // RAII wrapper for the two methods above. + class MeasuringGuard + { + public: + MeasuringGuard(wxTextMeasureBase& tm) : m_tm(tm) + { + // BeginMeasuring() should only be called if we have a native DC, + // so don't call it if we delegate to a DC of unknown type. + if ( !m_tm.IsUsingDCImpl() ) + m_tm.BeginMeasuring(); + } + + ~MeasuringGuard() + { + if ( !m_tm.IsUsingDCImpl() ) + m_tm.EndMeasuring(); + } + + private: + wxTextMeasureBase& m_tm; + }; + + + // The main function of this class, to be implemented in platform-specific + // way used by all our public methods. + // + // The width and height pointers here are never NULL and the input string + // is not empty. + virtual void DoGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL) = 0; + + // The real implementation of GetPartialTextExtents(). + // + // On input, widths array contains text.length() zero elements and the text + // is guaranteed to be non-empty. + virtual bool DoGetPartialTextExtents(const wxString& text, + wxArrayInt& widths, + double scaleX) = 0; + + // Call either DoGetTextExtent() or wxDC::GetTextExtent() depending on the + // value of m_useDCImpl. + // + // This must be always used instead of calling DoGetTextExtent() directly! + void CallGetTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL); + + // Return a valid font: if one was given to us in the ctor, use this one, + // otherwise use the current font of the associated wxDC or wxWindow. + wxFont GetFont() const; + + + // Exactly one of m_dc and m_win is non-NULL for any given object of this + // class. + const wxDC* const m_dc; + const wxWindow* const m_win; + + // If this is true, simply forward to wxDC::GetTextExtent() from our + // CallGetTextExtent() instead of calling our own DoGetTextExtent(). + // + // We need this because our DoGetTextExtent() typically only works with + // native DCs, i.e. those having an HDC under Windows or using Pango under + // GTK+. However wxTextMeasure object can be constructed for any wxDC, not + // necessarily a native one and in this case we must call back into the DC + // implementation of text measuring itself. + bool m_useDCImpl; + + // This one can be NULL or not. + const wxFont* const m_font; + + wxDECLARE_NO_COPY_CLASS(wxTextMeasureBase); +}; + +// Include the platform dependant class declaration, if any. +#if defined(__WXGTK20__) + #include "wx/gtk/private/textmeasure.h" +#elif defined(__WXMSW__) + #include "wx/msw/private/textmeasure.h" +#else // no platform-specific implementation of wxTextMeasure yet + #include "wx/generic/private/textmeasure.h" + + #define wxUSE_GENERIC_TEXTMEASURE 1 +#endif + +#ifndef wxUSE_GENERIC_TEXTMEASURE + #define wxUSE_GENERIC_TEXTMEASURE 0 +#endif + +#endif // _WX_PRIVATE_TEXTMEASURE_H_ diff --git a/Externals/wxWidgets3/include/wx/private/threadinfo.h b/Externals/wxWidgets3/include/wx/private/threadinfo.h index 5a3b433871..27a71674b0 100644 --- a/Externals/wxWidgets3/include/wx/private/threadinfo.h +++ b/Externals/wxWidgets3/include/wx/private/threadinfo.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxThreadSpecificInfo: thread-specific information // Author: Vadim Zeitlin // Created: 2009-07-13 -// RCS-ID: $Id: threadinfo.h 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -11,25 +10,30 @@ #ifndef _WX_PRIVATE_THREADINFO_H_ #define _WX_PRIVATE_THREADINFO_H_ -#if wxUSE_THREADS - -#include "wx/tls.h" +#include "wx/defs.h" class WXDLLIMPEXP_FWD_BASE wxLog; +#if wxUSE_INTL +#include "wx/hashset.h" +WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, + wxLocaleUntranslatedStrings); +#endif + + // ---------------------------------------------------------------------------- // wxThreadSpecificInfo: contains all thread-specific information used by wx // ---------------------------------------------------------------------------- -// currently the only thread-specific information we use is the active wxLog -// target but more could be added in the future (e.g. current wxLocale would be -// a likely candidate) and we will group all of them in this struct to avoid -// consuming more TLS slots than necessary as there is only a limited number of -// them - -// NB: this must be a POD to be stored in TLS -struct wxThreadSpecificInfo +// Group all thread-specific information we use (e.g. the active wxLog target) +// a in this class to avoid consuming more TLS slots than necessary as there is +// only a limited number of them. +class wxThreadSpecificInfo { +public: + // Return this thread's instance. + static wxThreadSpecificInfo& Get(); + // the thread-specific logger or NULL if the thread is using the global one // (this is not used for the main thread which always uses the global // logger) @@ -42,13 +46,24 @@ struct wxThreadSpecificInfo // because the default, for 0-initialized struct, should be to enable // logging bool loggingDisabled; + +#if wxUSE_INTL + // Storage for wxTranslations::GetUntranslatedString() + wxLocaleUntranslatedStrings untranslatedStrings; +#endif + +#if wxUSE_THREADS + // Cleans up storage for the current thread. Should be called when a thread + // is being destroyed. If it's not called, the only bad thing that happens + // is that the memory is deallocated later, on process termination. + static void ThreadCleanUp(); +#endif + +private: + wxThreadSpecificInfo() : logger(NULL), loggingDisabled(false) {} }; -// currently this is defined in src/common/log.cpp -extern wxTLS_TYPE(wxThreadSpecificInfo) wxThreadInfoVar; -#define wxThreadInfo wxTLS_VALUE(wxThreadInfoVar) - -#endif // wxUSE_THREADS +#define wxThreadInfo wxThreadSpecificInfo::Get() #endif // _WX_PRIVATE_THREADINFO_H_ diff --git a/Externals/wxWidgets3/include/wx/private/timer.h b/Externals/wxWidgets3/include/wx/private/timer.h index d345d3fcb3..5f4ce0d511 100644 --- a/Externals/wxWidgets3/include/wx/private/timer.h +++ b/Externals/wxWidgets3/include/wx/private/timer.h @@ -3,7 +3,6 @@ // Purpose: Base class for wxTimer implementations // Author: Lukasz Michalski // Created: 31.10.2006 -// RCS-ID: $Id: timer.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2006-2007 wxWidgets dev team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/window.h b/Externals/wxWidgets3/include/wx/private/window.h index ab4c5533f1..1192fb97b2 100644 --- a/Externals/wxWidgets3/include/wx/private/window.h +++ b/Externals/wxWidgets3/include/wx/private/window.h @@ -3,7 +3,6 @@ // Purpose: misc wxWindow helpers // Author: Vaclav Slavik // Created: 2010-01-21 -// RCS-ID: $Id: window.h 63251 2010-01-24 11:51:09Z VS $ // Copyright: (c) 2010 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/private/wxprintf.h b/Externals/wxWidgets3/include/wx/private/wxprintf.h index 0bb0098cb5..00013c193a 100644 --- a/Externals/wxWidgets3/include/wx/private/wxprintf.h +++ b/Externals/wxWidgets3/include/wx/private/wxprintf.h @@ -4,7 +4,6 @@ // Author: Ove Kaven // Modified by: Ron Lee, Francesco Montorsi // Created: 09/04/99 -// RCS-ID: $Id: wxprintf.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) wxWidgets copyright // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -22,11 +21,6 @@ #include -#if defined(__MWERKS__) && __MSL__ >= 0x6000 -namespace std {} -using namespace std ; -#endif - // prefer snprintf over sprintf #if defined(__VISUALC__) || \ (defined(__BORLANDC__) && __BORLANDC__ >= 0x540) diff --git a/Externals/wxWidgets3/include/wx/prntbase.h b/Externals/wxWidgets3/include/wx/prntbase.h index 8b71a0658f..a6f22fa098 100644 --- a/Externals/wxWidgets3/include/wx/prntbase.h +++ b/Externals/wxWidgets3/include/wx/prntbase.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: prntbase.h 68026 2011-06-22 22:58:07Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -40,6 +39,8 @@ class WXDLLIMPEXP_FWD_CORE wxPreviewFrame; class WXDLLIMPEXP_FWD_CORE wxPrintFactory; class WXDLLIMPEXP_FWD_CORE wxPrintNativeDataBase; class WXDLLIMPEXP_FWD_CORE wxPrintPreview; +class WXDLLIMPEXP_FWD_CORE wxPrintAbortDialog; +class WXDLLIMPEXP_FWD_CORE wxStaticText; class wxPrintPageMaxCtrl; class wxPrintPageTextCtrl; @@ -188,7 +189,7 @@ public: wxPrinterBase(wxPrintDialogData *data = NULL); virtual ~wxPrinterBase(); - virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual wxPrintAbortDialog *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); virtual wxPrintDialogData& GetPrintDialogData() const; @@ -228,7 +229,7 @@ public: wxPrinter(wxPrintDialogData *data = NULL); virtual ~wxPrinter(); - virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual wxPrintAbortDialog *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); virtual bool Setup(wxWindow *parent); @@ -259,7 +260,7 @@ private: class WXDLLIMPEXP_CORE wxPrintout: public wxObject { public: - wxPrintout(const wxString& title = _("Printout")); + wxPrintout(const wxString& title = wxGetTranslation("Printout")); virtual ~wxPrintout(); virtual bool OnBeginDocument(int startPage, int endPage); @@ -391,7 +392,7 @@ class WXDLLIMPEXP_CORE wxPreviewFrame: public wxFrame public: wxPreviewFrame(wxPrintPreviewBase *preview, wxWindow *parent, - const wxString& title = _("Print Preview"), + const wxString& title = wxGetTranslation("Print Preview"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE | wxFRAME_FLOAT_ON_PARENT, @@ -733,18 +734,20 @@ class WXDLLIMPEXP_CORE wxPrintAbortDialog: public wxDialog { public: wxPrintAbortDialog(wxWindow *parent, - const wxString& title, + const wxString& documentTitle, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxT("dialog")) - : wxDialog(parent, wxID_ANY, title, pos, size, style, name) - { - } + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxT("dialog")); + + void SetProgress(int currentPage, int totalPages, + int currentCopy, int totalCopies); void OnCancel(wxCommandEvent& event); private: + wxStaticText *m_progress; + DECLARE_EVENT_TABLE() wxDECLARE_NO_COPY_CLASS(wxPrintAbortDialog); }; diff --git a/Externals/wxWidgets3/include/wx/process.h b/Externals/wxWidgets3/include/wx/process.h index 39b5b637f1..4c0018e6a6 100644 --- a/Externals/wxWidgets3/include/wx/process.h +++ b/Externals/wxWidgets3/include/wx/process.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Vadim Zeitlin to check error codes, added Detach() method // Created: 24/06/98 -// RCS-ID: $Id: process.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -104,6 +103,15 @@ public: wxInputStream *errStream); #endif // wxUSE_STREAMS + // priority + // Sets the priority to the given value: see wxPRIORITY_XXX constants. + // + // NB: the priority can only be set before the process is created + void SetPriority(unsigned priority); + + // Get the current priority. + unsigned GetPriority() const { return m_priority; } + // implementation only - don't use! // -------------------------------- @@ -116,6 +124,8 @@ protected: int m_id; long m_pid; + unsigned m_priority; + #if wxUSE_STREAMS // these streams are connected to stdout, stderr and stdin of the child // process respectively (yes, m_inputStream corresponds to stdout -- very diff --git a/Externals/wxWidgets3/include/wx/progdlg.h b/Externals/wxWidgets3/include/wx/progdlg.h index e6d4132765..e17d37ea3e 100644 --- a/Externals/wxWidgets3/include/wx/progdlg.h +++ b/Externals/wxWidgets3/include/wx/progdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: progdlg.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/propdlg.h b/Externals/wxWidgets3/include/wx/propdlg.h index 4bad68bb32..1f91c6fbc3 100644 --- a/Externals/wxWidgets3/include/wx/propdlg.h +++ b/Externals/wxWidgets3/include/wx/propdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: propdlg.h 33948 2005-05-04 18:57:50Z JS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/protocol/file.h b/Externals/wxWidgets3/include/wx/protocol/file.h index c77a1f7dc8..fd44ce593a 100644 --- a/Externals/wxWidgets3/include/wx/protocol/file.h +++ b/Externals/wxWidgets3/include/wx/protocol/file.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 1997 -// RCS-ID: $Id: file.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/protocol/ftp.h b/Externals/wxWidgets3/include/wx/protocol/ftp.h index bae8c78fdc..a87a638066 100644 --- a/Externals/wxWidgets3/include/wx/protocol/ftp.h +++ b/Externals/wxWidgets3/include/wx/protocol/ftp.h @@ -5,7 +5,6 @@ // Modified by: Mark Johnson, wxWindows@mj10777.de // 20000917 : RmDir, GetLastResult, GetList // Created: 07/07/1997 -// RCS-ID: $Id: ftp.h 67384 2011-04-03 20:31:32Z DS $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/protocol/http.h b/Externals/wxWidgets3/include/wx/protocol/http.h index d3fff96500..cfa2e6f944 100644 --- a/Externals/wxWidgets3/include/wx/protocol/http.h +++ b/Externals/wxWidgets3/include/wx/protocol/http.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Simo Virokannas (authentication, Dec 2005) // Created: August 1997 -// RCS-ID: $Id: http.h 70408 2012-01-20 12:22:25Z VZ $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -36,6 +35,7 @@ public: wxString GetHeader(const wxString& header) const; int GetResponse() const { return m_http_response; } + void SetMethod(const wxString& method) { m_method = method; } void SetHeader(const wxString& header, const wxString& h_data); bool SetPostText(const wxString& contentType, const wxString& data, @@ -51,19 +51,12 @@ public: wxDEPRECATED(void SetPostBuffer(const wxString& post_buf)); protected: - enum wxHTTP_Req - { - wxHTTP_GET, - wxHTTP_POST, - wxHTTP_HEAD - }; - typedef wxStringToStringHashMap::iterator wxHeaderIterator; typedef wxStringToStringHashMap::const_iterator wxHeaderConstIterator; typedef wxStringToStringHashMap::iterator wxCookieIterator; typedef wxStringToStringHashMap::const_iterator wxCookieConstIterator; - bool BuildRequest(const wxString& path, wxHTTP_Req req); + bool BuildRequest(const wxString& path, const wxString& method); void SendHeaders(); bool ParseHeaders(); @@ -81,6 +74,7 @@ protected: // internal variables: + wxString m_method; wxStringToStringHashMap m_cookies; wxStringToStringHashMap m_headers; diff --git a/Externals/wxWidgets3/include/wx/protocol/log.h b/Externals/wxWidgets3/include/wx/protocol/log.h index 700c94029d..df373b928f 100644 --- a/Externals/wxWidgets3/include/wx/protocol/log.h +++ b/Externals/wxWidgets3/include/wx/protocol/log.h @@ -3,7 +3,6 @@ // Purpose: wxProtocolLog class for logging network exchanges // Author: Troelsk, Vadim Zeitlin // Created: 2009-03-06 -// RCS-ID: $Id: log.h 59404 2009-03-07 13:58:39Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/protocol/protocol.h b/Externals/wxWidgets3/include/wx/protocol/protocol.h index 6664f9e875..e6a32ef55c 100644 --- a/Externals/wxWidgets3/include/wx/protocol/protocol.h +++ b/Externals/wxWidgets3/include/wx/protocol/protocol.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 10/07/1997 -// RCS-ID: $Id: protocol.h 64532 2010-06-09 13:55:48Z FM $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ptr_scpd.h b/Externals/wxWidgets3/include/wx/ptr_scpd.h index cdc325ee56..76d8e42146 100644 --- a/Externals/wxWidgets3/include/wx/ptr_scpd.h +++ b/Externals/wxWidgets3/include/wx/ptr_scpd.h @@ -3,7 +3,6 @@ // Purpose: compatibility wrapper for wxScoped{Ptr,Array} // Author: Vadim Zeitlin // Created: 2009-02-03 -// RCS-ID: $Id: ptr_scpd.h 58643 2009-02-04 08:06:42Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ptr_shrd.h b/Externals/wxWidgets3/include/wx/ptr_shrd.h index 90cd0fa968..635cfe36e0 100644 --- a/Externals/wxWidgets3/include/wx/ptr_shrd.h +++ b/Externals/wxWidgets3/include/wx/ptr_shrd.h @@ -3,7 +3,6 @@ // Purpose: compatibility wrapper for wx/sharedptr.h // Author: Vadim Zeitlin // Created: 2009-02-03 -// RCS-ID: $Id: ptr_shrd.h 58643 2009-02-04 08:06:42Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/quantize.h b/Externals/wxWidgets3/include/wx/quantize.h index dcc62d65f4..d323a3504c 100644 --- a/Externals/wxWidgets3/include/wx/quantize.h +++ b/Externals/wxWidgets3/include/wx/quantize.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 22/6/2000 -// RCS-ID: $Id: quantize.h 52834 2008-03-26 15:06:00Z FM $ // Copyright: (c) Julian Smart // Licence: ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/radiobox.h b/Externals/wxWidgets3/include/wx/radiobox.h index 7b7960c215..acfa9e8f8a 100644 --- a/Externals/wxWidgets3/include/wx/radiobox.h +++ b/Externals/wxWidgets3/include/wx/radiobox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 10.09.00 -// RCS-ID: $Id: radiobox.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/radiobut.h b/Externals/wxWidgets3/include/wx/radiobut.h index d69ec49579..427787341e 100644 --- a/Externals/wxWidgets3/include/wx/radiobut.h +++ b/Externals/wxWidgets3/include/wx/radiobut.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07.09.00 -// RCS-ID: $Id: radiobut.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/range.h b/Externals/wxWidgets3/include/wx/range.h index 47e835cb8a..d59646e12a 100644 --- a/Externals/wxWidgets3/include/wx/range.h +++ b/Externals/wxWidgets3/include/wx/range.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2011-01-07 -// RCS-ID: $Id: range.h 66625 2011-01-07 17:42:39Z SC $ // Copyright: (c) 2011 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/rawbmp.h b/Externals/wxWidgets3/include/wx/rawbmp.h index 2fca1857d4..adcf81f398 100644 --- a/Externals/wxWidgets3/include/wx/rawbmp.h +++ b/Externals/wxWidgets3/include/wx/rawbmp.h @@ -4,7 +4,6 @@ // Author: Eric Kidd, Vadim Zeitlin // Modified by: // Created: 10.03.03 -// RCS-ID: $Id: rawbmp.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 2002 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/rearrangectrl.h b/Externals/wxWidgets3/include/wx/rearrangectrl.h index 0e74187b14..b54b04fa11 100644 --- a/Externals/wxWidgets3/include/wx/rearrangectrl.h +++ b/Externals/wxWidgets3/include/wx/rearrangectrl.h @@ -3,7 +3,6 @@ // Purpose: various controls for rearranging the items interactively // Author: Vadim Zeitlin // Created: 2008-12-15 -// RCS-ID: $Id: rearrangectrl.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/recguard.h b/Externals/wxWidgets3/include/wx/recguard.h index 88af6fb72f..d7775b995b 100644 --- a/Externals/wxWidgets3/include/wx/recguard.h +++ b/Externals/wxWidgets3/include/wx/recguard.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 14.08.2003 -// RCS-ID: $Id: recguard.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/regex.h b/Externals/wxWidgets3/include/wx/regex.h index 6150130874..0b1836e344 100644 --- a/Externals/wxWidgets3/include/wx/regex.h +++ b/Externals/wxWidgets3/include/wx/regex.h @@ -4,7 +4,6 @@ // Author: Karsten Ballueder // Modified by: VZ at 13.07.01 (integrated to wxWin) // Created: 05.02.2000 -// RCS-ID: $Id: regex.h 57777 2009-01-02 17:29:32Z PC $ // Copyright: (c) 2000 Karsten Ballueder // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/region.h b/Externals/wxWidgets3/include/wx/region.h index c032903f3d..64a8e05532 100644 --- a/Externals/wxWidgets3/include/wx/region.h +++ b/Externals/wxWidgets3/include/wx/region.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: region.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/renderer.h b/Externals/wxWidgets3/include/wx/renderer.h index 9722ddecf9..97152e32e3 100644 --- a/Externals/wxWidgets3/include/wx/renderer.h +++ b/Externals/wxWidgets3/include/wx/renderer.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.07.2003 -// RCS-ID: $Id: renderer.h 65947 2010-10-30 15:57:32Z VS $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/richmsgdlg.h b/Externals/wxWidgets3/include/wx/richmsgdlg.h index 6d1ac376fd..1fbc96428f 100644 --- a/Externals/wxWidgets3/include/wx/richmsgdlg.h +++ b/Externals/wxWidgets3/include/wx/richmsgdlg.h @@ -3,7 +3,6 @@ // Purpose: wxRichMessageDialogBase // Author: Rickard Westerlund // Created: 2010-07-03 -// RCS-ID: $Id: richmsgdlg.h 70165 2011-12-29 14:42:13Z SN $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,8 +26,8 @@ public: const wxString& caption, long style ) : wxGenericMessageDialog( parent, message, caption, style ), - m_detailsExpanderCollapsedLabel( _("&See details") ), - m_detailsExpanderExpandedLabel( _("&Hide details") ), + m_detailsExpanderCollapsedLabel( wxGetTranslation("&See details") ), + m_detailsExpanderExpandedLabel( wxGetTranslation("&Hide details") ), m_checkBoxValue( false ) { } diff --git a/Externals/wxWidgets3/include/wx/richtooltip.h b/Externals/wxWidgets3/include/wx/richtooltip.h index 0005edb8b1..1187e67ed1 100644 --- a/Externals/wxWidgets3/include/wx/richtooltip.h +++ b/Externals/wxWidgets3/include/wx/richtooltip.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxRichToolTip class. // Author: Vadim Zeitlin // Created: 2011-10-07 -// RCS-ID: $Id: richtooltip.h 69480 2011-10-19 21:53:10Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -76,7 +75,8 @@ public: // elapses but this method can be used to change this or also disable // hiding the tooltip automatically entirely by passing 0 in this parameter // (but doing this can result in native version not being used). - void SetTimeout(unsigned milliseconds); + // Optionally specify a show delay. + void SetTimeout(unsigned milliseconds, unsigned millisecondsShowdelay = 0); // Choose the tip kind, possibly none. By default the tip is positioned // automatically, as if wxTipKind_Auto was used. @@ -86,8 +86,8 @@ public: // or colour appropriate for the current platform. void SetTitleFont(const wxFont& font); - // Show the tooltip for the given window. - void ShowFor(wxWindow* win); + // Show the tooltip for the given window and optionally a specified area. + void ShowFor(wxWindow* win, const wxRect* rect = NULL); // Non-virtual dtor as this class is not supposed to be derived from. ~wxRichToolTip(); diff --git a/Externals/wxWidgets3/include/wx/rtti.h b/Externals/wxWidgets3/include/wx/rtti.h index 43e3939c41..51017baa2f 100644 --- a/Externals/wxWidgets3/include/wx/rtti.h +++ b/Externals/wxWidgets3/include/wx/rtti.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Ron Lee // Created: 01/02/97 -// RCS-ID: $Id: rtti.h 67879 2011-06-07 13:06:17Z VZ $ // Copyright: (c) 1997 Julian Smart // (c) 2001 Ron Lee // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/sashwin.h b/Externals/wxWidgets3/include/wx/sashwin.h index c99a94b4ab..21967a5c7e 100644 --- a/Externals/wxWidgets3/include/wx/sashwin.h +++ b/Externals/wxWidgets3/include/wx/sashwin.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: sashwin.h 33948 2005-05-04 18:57:50Z JS $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/sckaddr.h b/Externals/wxWidgets3/include/wx/sckaddr.h index 2c10fac890..4ceefdf35c 100644 --- a/Externals/wxWidgets3/include/wx/sckaddr.h +++ b/Externals/wxWidgets3/include/wx/sckaddr.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Vadim Zeitlin to switch to wxSockAddressImpl implementation // Created: 26/04/1997 -// RCS-ID: $Id: sckaddr.h 59099 2009-02-22 23:38:52Z VZ $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // (c) 2008, 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/sckipc.h b/Externals/wxWidgets3/include/wx/sckipc.h index cffa67c674..3801da8cf9 100644 --- a/Externals/wxWidgets3/include/wx/sckipc.h +++ b/Externals/wxWidgets3/include/wx/sckipc.h @@ -6,7 +6,6 @@ // Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 // (callbacks deprecated) Mar 2000 // Created: 1993 -// RCS-ID: $Id: sckipc.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart 1993 // (c) Guilhem Lavaux 1997, 1998 // (c) 2000 Guillermo Rodriguez diff --git a/Externals/wxWidgets3/include/wx/sckstrm.h b/Externals/wxWidgets3/include/wx/sckstrm.h index 09e6ebb0be..31f32706e9 100644 --- a/Externals/wxWidgets3/include/wx/sckstrm.h +++ b/Externals/wxWidgets3/include/wx/sckstrm.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 17/07/97 -// RCS-ID: $Id: sckstrm.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/scopedarray.h b/Externals/wxWidgets3/include/wx/scopedarray.h index 11cc04130a..e6246a235e 100644 --- a/Externals/wxWidgets3/include/wx/scopedarray.h +++ b/Externals/wxWidgets3/include/wx/scopedarray.h @@ -3,7 +3,6 @@ // Purpose: scoped smart pointer class // Author: Vadim Zeitlin // Created: 2009-02-03 -// RCS-ID: $Id: scopedarray.h 70109 2011-12-24 15:43:14Z VZ $ // Copyright: (c) Jesse Lovelace and original Boost authors (see below) // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/scopedptr.h b/Externals/wxWidgets3/include/wx/scopedptr.h index 84285ae40c..5cc0c0770d 100644 --- a/Externals/wxWidgets3/include/wx/scopedptr.h +++ b/Externals/wxWidgets3/include/wx/scopedptr.h @@ -3,7 +3,6 @@ // Purpose: scoped smart pointer class // Author: Jesse Lovelace // Created: 06/01/02 -// RCS-ID: $Id: scopedptr.h 64222 2010-05-06 05:43:01Z VS $ // Copyright: (c) Jesse Lovelace and original Boost authors (see below) // (c) 2009 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/scopeguard.h b/Externals/wxWidgets3/include/wx/scopeguard.h index c0c354536a..83bc1b5180 100644 --- a/Externals/wxWidgets3/include/wx/scopeguard.h +++ b/Externals/wxWidgets3/include/wx/scopeguard.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.07.2003 -// RCS-ID: $Id: scopeguard.h 67592 2011-04-24 13:14:47Z VS $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/scrolbar.h b/Externals/wxWidgets3/include/wx/scrolbar.h index 648f09fe0e..21f2d75a8a 100644 --- a/Externals/wxWidgets3/include/wx/scrolbar.h +++ b/Externals/wxWidgets3/include/wx/scrolbar.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: scrolbar.h 67254 2011-03-20 00:14:35Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/scrolwin.h b/Externals/wxWidgets3/include/wx/scrolwin.h index 8989d3738f..370969929e 100644 --- a/Externals/wxWidgets3/include/wx/scrolwin.h +++ b/Externals/wxWidgets3/include/wx/scrolwin.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 30.08.00 -// RCS-ID: $Id: scrolwin.h 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,6 +36,10 @@ enum wxScrollbarVisibility // // So we have // +// wxAnyScrollHelperBase +// | +// | +// \|/ // wxScrollHelperBase // | // | @@ -56,7 +59,51 @@ enum wxScrollbarVisibility // // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxScrollHelperBase +// This class allows reusing some of wxScrollHelperBase functionality in +// wxVarScrollHelperBase in wx/vscroll.h without duplicating its code. +class WXDLLIMPEXP_CORE wxAnyScrollHelperBase +{ +public: + wxEXPLICIT wxAnyScrollHelperBase(wxWindow* win); + virtual ~wxAnyScrollHelperBase() {} + + // Disable use of keyboard keys for scrolling. By default cursor movement + // keys (including Home, End, Page Up and Down) are used to scroll the + // window appropriately. If the derived class uses these keys for something + // else, e.g. changing the currently selected item, this function can be + // used to disable this behaviour as it's not only not necessary then but + // can actually be actively harmful if another object forwards a keyboard + // event corresponding to one of the above keys to us using + // ProcessWindowEvent() because the event will always be processed which + // can be undesirable. + void DisableKeyboardScrolling() { m_kbdScrollingEnabled = false; } + + // Override this function to draw the graphic (or just process EVT_PAINT) + virtual void OnDraw(wxDC& WXUNUSED(dc)) { } + + // change the DC origin according to the scroll position. + virtual void DoPrepareDC(wxDC& dc) = 0; + + // Simple accessor for the window that is really being scrolled. + wxWindow *GetTargetWindow() const { return m_targetWindow; } + + + // The methods called from the window event handlers. + void HandleOnChar(wxKeyEvent& event); + void HandleOnPaint(wxPaintEvent& event); + +protected: + // the window that receives the scroll events and the window to actually + // scroll, respectively + wxWindow *m_win, + *m_targetWindow; + + // whether cursor keys should scroll the window + bool m_kbdScrollingEnabled; +}; + +// This is the class containing the guts of (uniform) scrolling logic. +class WXDLLIMPEXP_CORE wxScrollHelperBase : public wxAnyScrollHelperBase { public: // ctor must be given the associated window @@ -101,24 +148,20 @@ public: DoShowScrollbars(horz, vert); } + // Test whether the specified scrollbar is shown. + virtual bool IsScrollbarShown(int orient) const = 0; + // Enable/disable Windows scrolling in either direction. If true, wxWidgets // scrolls the canvas and only a bit of the canvas is invalidated; no // Clear() is necessary. If false, the whole canvas is invalidated and a // Clear() is necessary. Disable for when the scroll increment is used to // actually scroll a non-constant distance + // + // Notice that calling this method with a false argument doesn't disable + // scrolling the window in this direction, it just changes the mechanism by + // which it is implemented to not use wxWindow::ScrollWindow(). virtual void EnableScrolling(bool x_scrolling, bool y_scrolling); - // Disable use of keyboard keys for scrolling. By default cursor movement - // keys (including Home, End, Page Up and Down) are used to scroll the - // window appropriately. If the derived class uses these keys for something - // else, e.g. changing the currently selected item, this function can be - // used to disable this behaviour as it's not only not necessary then but - // can actually be actively harmful if another object forwards a keyboard - // event corresponding to one of the above keys to us using - // ProcessWindowEvent() because the event will always be processed which - // can be undesirable. - void DisableKeyboardScrolling() { m_kbdScrollingEnabled = false; } - // Get the view start void GetViewStart(int *x, int *y) const { DoGetViewStart(x, y); } @@ -167,15 +210,10 @@ public: // child of it in order to scroll only a portion the area between the // scrollbars (spreadsheet: only cell area will move). void SetTargetWindow(wxWindow *target); - wxWindow *GetTargetWindow() const; void SetTargetRect(const wxRect& rect) { m_rectToScroll = rect; } wxRect GetTargetRect() const { return m_rectToScroll; } - // Override this function to draw the graphic (or just process EVT_PAINT) - virtual void OnDraw(wxDC& WXUNUSED(dc)) { } - - // change the DC origin according to the scroll position. virtual void DoPrepareDC(wxDC& dc); // are we generating the autoscroll events? @@ -195,8 +233,6 @@ public: // the methods to be called from the window event handlers void HandleOnScroll(wxScrollWinEvent& event); void HandleOnSize(wxSizeEvent& event); - void HandleOnPaint(wxPaintEvent& event); - void HandleOnChar(wxKeyEvent& event); void HandleOnMouseEnter(wxMouseEvent& event); void HandleOnMouseLeave(wxMouseEvent& event); #if wxUSE_MOUSEWHEEL @@ -252,10 +288,6 @@ protected: // delete the event handler we installed void DeleteEvtHandler(); - // calls wxScrollHelperEvtHandler::ResetDrawnFlag(), see explanation - // in wxScrollHelperEvtHandler::ProcessEvent() - void ResetDrawnFlag(); - // this function should be overridden to return the size available for // m_targetWindow inside m_win of the given size // @@ -276,13 +308,14 @@ protected: double m_scaleX; double m_scaleY; - wxWindow *m_win, - *m_targetWindow; - wxRect m_rectToScroll; wxTimer *m_timerAutoScroll; + // The number of pixels to scroll in horizontal and vertical directions + // respectively. + // + // If 0, means that the scrolling in the given direction is disabled. int m_xScrollPixelsPerLine; int m_yScrollPixelsPerLine; int m_xScrollPosition; @@ -295,8 +328,6 @@ protected: bool m_xScrollingEnabled; bool m_yScrollingEnabled; - bool m_kbdScrollingEnabled; - #if wxUSE_MOUSEWHEEL int m_wheelRotation; #endif // wxUSE_MOUSEWHEEL @@ -312,6 +343,8 @@ protected: public: \ virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ virtual bool Layout() { return ScrollLayout(); } \ + virtual bool CanScroll(int orient) const \ + { return IsScrollbarShown(orient); } \ virtual void DoSetVirtualSize(int x, int y) \ { ScrollDoSetVirtualSize(x, y); } \ virtual wxSize GetBestVirtualSize() const \ @@ -376,24 +409,38 @@ public: this->MacSetClipChildren(true); #endif - this->Connect(wxEVT_PAINT, wxPaintEventHandler(wxScrolled::OnPaint)); - // by default, we're scrollable in both directions (but if one of the // styles is specified explicitly, we shouldn't add the other one // automatically) if ( !(style & (wxHSCROLL | wxVSCROLL)) ) style |= wxHSCROLL | wxVSCROLL; +#ifdef __WXOSX__ + bool retval = T::Create(parent, winid, pos, size, style, name); + if ( retval && (style & wxALWAYS_SHOW_SB) ) + ShowScrollbars(wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS); + return retval; +#else + if ( style & wxALWAYS_SHOW_SB ) + ShowScrollbars(wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS); + return T::Create(parent, winid, pos, size, style, name); +#endif } +#ifdef __WXMSW__ // we need to return a special WM_GETDLGCODE value to process just the // arrows but let the other navigation characters through -#ifdef __WXMSW__ virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { return FilterMSWWindowProc(nMsg, T::MSWWindowProc(nMsg, wParam, lParam)); } + + // Take into account the scroll origin. + virtual void MSWAdjustBrushOrg(int* xOrg, int* yOrg) const + { + CalcUnscrolledPosition(*xOrg, *yOrg, xOrg, yOrg); + } #endif // __WXMSW__ WX_FORWARD_TO_SCROLL_HELPER() @@ -405,16 +452,6 @@ protected: } private: - // this is needed for wxEVT_PAINT processing hack described in - // wxScrollHelperEvtHandler::ProcessEvent() - void OnPaint(wxPaintEvent& event) - { - // the user code didn't really draw the window if we got here, so set - // this flag to try to call OnDraw() later - ResetDrawnFlag(); - event.Skip(); - } - // VC++ 6 gives warning for the declaration of template member function // without definition #ifndef __VISUALC6__ diff --git a/Externals/wxWidgets3/include/wx/selstore.h b/Externals/wxWidgets3/include/wx/selstore.h index 0c6aaa1a21..4361a11a9c 100644 --- a/Externals/wxWidgets3/include/wx/selstore.h +++ b/Externals/wxWidgets3/include/wx/selstore.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 08.06.03 (extracted from src/generic/listctrl.cpp) -// RCS-ID: $Id: selstore.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2000-2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/settings.h b/Externals/wxWidgets3/include/wx/settings.h index 7f4fd837f1..f90ae071ba 100644 --- a/Externals/wxWidgets3/include/wx/settings.h +++ b/Externals/wxWidgets3/include/wx/settings.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: settings.h 67018 2011-02-25 09:38:35Z JS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/setup_inc.h b/Externals/wxWidgets3/include/wx/setup_inc.h index 32b19dfbb8..7e1ec6f4b6 100644 --- a/Externals/wxWidgets3/include/wx/setup_inc.h +++ b/Externals/wxWidgets3/include/wx/setup_inc.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: -// RCS-ID: $Id: setup_inc.h 69463 2011-10-18 21:57:02Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -147,7 +146,7 @@ // In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If // this causes problems (e.g. link errors), set this to 0. You may need to set // this to 0 if using templates (at least for VC++). This switch is currently -// ignored for mingw / cygwin / CodeWarrior +// ignored for MinGW/Cygwin. // // Default is 0 // @@ -263,6 +262,17 @@ // Recommended setting: 1 if you want to support multiple languages #define wxUSE_PRINTF_POS_PARAMS 1 +// Enable the use of compiler-specific thread local storage keyword, if any. +// This is used for wxTLS_XXX() macros implementation and normally should use +// the compiler-provided support as it's simpler and more efficient, but must +// not use it if wxWidgets is used in a dynamically loaded Win32 (i.e. using +// LoadLibrary()/GetProcAddress()) as this triggers a bug in compiler TLS +// support that results in crashes when any TLS variables are used. So if you +// are building a Win32 DLL using wxWidgets that can be loaded dynamically, set +// this to 0. +// +// Default is 1, but set to 0 if the scenario above is applicable. +#define wxUSE_COMPILER_TLS 1 // ---------------------------------------------------------------------------- // Interoperability with the standard library. @@ -1083,6 +1093,16 @@ // Recommended setting: 1 #define wxUSE_NOTIFICATION_MESSAGE 1 +// wxPreferencesEditor provides a common API for different ways of presenting +// the standard "Preferences" or "Properties" dialog under different platforms +// (e.g. some use modal dialogs, some use modeless ones; some apply the changes +// immediately while others require an explicit "Apply" button). +// +// Default is 1. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it) +#define wxUSE_PREFERENCES_EDITOR 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/Externals/wxWidgets3/include/wx/setup_redirect.h b/Externals/wxWidgets3/include/wx/setup_redirect.h index 87a9c3d85a..7648c198ba 100644 --- a/Externals/wxWidgets3/include/wx/setup_redirect.h +++ b/Externals/wxWidgets3/include/wx/setup_redirect.h @@ -6,7 +6,6 @@ * whereby a setup.h is created under the lib directory. * * Copyright: (c) Vadim Zeitlin - * RCS-ID: $Id: setup_redirect.h 33948 2005-05-04 18:57:50Z JS $ * Licence: wxWindows Licence */ diff --git a/Externals/wxWidgets3/include/wx/sharedptr.h b/Externals/wxWidgets3/include/wx/sharedptr.h index 3c354f8f88..a9b6442c09 100644 --- a/Externals/wxWidgets3/include/wx/sharedptr.h +++ b/Externals/wxWidgets3/include/wx/sharedptr.h @@ -3,7 +3,6 @@ // Purpose: Shared pointer based on the counted_ptr<> template, which // is in the public domain // Author: Robert Roebling, Yonat Sharon -// RCS-ID: $Id: sharedptr.h 67232 2011-03-18 15:10:15Z DS $ // Copyright: Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,6 +30,14 @@ public: m_ref = new reftype(ptr); } + template + wxEXPLICIT wxSharedPtr(T* ptr, Deleter d) + : m_ref(NULL) + { + if (ptr) + m_ref = new reftype_with_deleter(ptr, d); + } + ~wxSharedPtr() { Release(); } wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); } @@ -92,6 +99,14 @@ public: m_ref = new reftype(ptr); } + template + void reset(T* ptr, Deleter d) + { + Release(); + if (ptr) + m_ref = new reftype_with_deleter(ptr, d); + } + bool unique() const { return (m_ref ? m_ref->m_count == 1 : true); } long use_count() const { return (m_ref ? (long)m_ref->m_count : 0); } @@ -99,10 +114,24 @@ private: struct reftype { - reftype( T* ptr = NULL, unsigned count = 1 ) : m_ptr(ptr), m_count(count) {} + reftype(T* ptr) : m_ptr(ptr), m_count(1) {} + virtual ~reftype() {} + virtual void delete_ptr() { delete m_ptr; } + T* m_ptr; wxAtomicInt m_count; - }* m_ref; + }; + + template + struct reftype_with_deleter : public reftype + { + reftype_with_deleter(T* ptr, Deleter d) : reftype(ptr), m_deleter(d) {} + virtual void delete_ptr() { m_deleter(this->m_ptr); } + + Deleter m_deleter; + }; + + reftype* m_ref; void Acquire(reftype* ref) { @@ -115,10 +144,9 @@ private: { if (m_ref) { - wxAtomicDec( m_ref->m_count ); - if (m_ref->m_count == 0) + if (!wxAtomicDec( m_ref->m_count )) { - delete m_ref->m_ptr; + m_ref->delete_ptr(); delete m_ref; } m_ref = NULL; diff --git a/Externals/wxWidgets3/include/wx/simplebook.h b/Externals/wxWidgets3/include/wx/simplebook.h new file mode 100644 index 0000000000..d54ebc45b6 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/simplebook.h @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/simplebook.h +// Purpose: wxBookCtrlBase-derived class without any controller. +// Author: Vadim Zeitlin +// Created: 2012-08-21 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SIMPLEBOOK_H_ +#define _WX_SIMPLEBOOK_H_ + +#include "wx/bookctrl.h" + +#if wxUSE_BOOKCTRL + +#include "wx/vector.h" + +// ---------------------------------------------------------------------------- +// wxSimplebook: a book control without any user-actionable controller. +// ---------------------------------------------------------------------------- + +// NB: This class doesn't use DLL export declaration as it's fully inline. + +class wxSimplebook : public wxBookCtrlBase +{ +public: + wxSimplebook() + { + Init(); + } + + wxSimplebook(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + : wxBookCtrlBase(parent, winid, pos, size, style | wxBK_TOP, name) + { + Init(); + } + + + // Methods specific to this class. + + // A method allowing to add a new page without any label (which is unused + // by this control) and show it immediately. + bool ShowNewPage(wxWindow* page) + { + return AddPage(page, wxString(), true /* select it */); + } + + + // Set effect to use for showing/hiding pages. + void SetEffects(wxShowEffect showEffect, wxShowEffect hideEffect) + { + m_showEffect = showEffect; + m_hideEffect = hideEffect; + } + + // Or the same effect for both of them. + void SetEffect(wxShowEffect effect) + { + SetEffects(effect, effect); + } + + // And the same for time outs. + void SetEffectsTimeouts(unsigned showTimeout, unsigned hideTimeout) + { + m_showTimeout = showTimeout; + m_hideTimeout = hideTimeout; + } + + void SetEffectTimeout(unsigned timeout) + { + SetEffectsTimeouts(timeout, timeout); + } + + + // Implement base class pure virtual methods. + + // Page management + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = NO_IMAGE) + { + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) + return false; + + m_pageTexts.insert(m_pageTexts.begin() + n, text); + + if ( !DoSetSelectionAfterInsertion(n, bSelect) ) + page->Hide(); + + return true; + } + + virtual int SetSelection(size_t n) + { + return DoSetSelection(n, SetSelection_SendEvent); + } + + virtual int ChangeSelection(size_t n) + { + return DoSetSelection(n); + } + + // Neither labels nor images are supported but we still store the labels + // just in case the user code attaches some importance to them. + virtual bool SetPageText(size_t n, const wxString& strText) + { + wxCHECK_MSG( n < GetPageCount(), false, wxS("Invalid page") ); + + m_pageTexts[n] = strText; + + return true; + } + + virtual wxString GetPageText(size_t n) const + { + wxCHECK_MSG( n < GetPageCount(), wxString(), wxS("Invalid page") ); + + return m_pageTexts[n]; + } + + virtual bool SetPageImage(size_t WXUNUSED(n), int WXUNUSED(imageId)) + { + return false; + } + + virtual int GetPageImage(size_t WXUNUSED(n)) const + { + return NO_IMAGE; + } + +protected: + virtual void UpdateSelectedPage(size_t newsel) + { + m_selection = newsel; + } + + virtual wxBookCtrlEvent* CreatePageChangingEvent() const + { + return new wxBookCtrlEvent(wxEVT_BOOKCTRL_PAGE_CHANGING, + GetId()); + } + + virtual void MakeChangedEvent(wxBookCtrlEvent& event) + { + event.SetEventType(wxEVT_BOOKCTRL_PAGE_CHANGED); + } + + virtual wxWindow *DoRemovePage(size_t page) + { + wxWindow* const win = wxBookCtrlBase::DoRemovePage(page); + if ( win ) + { + m_pageTexts.erase(m_pageTexts.begin() + page); + + DoSetSelectionAfterRemoval(page); + } + + return win; + } + + virtual void DoSize() + { + wxWindow* const page = GetCurrentPage(); + if ( page ) + page->SetSize(GetPageRect()); + } + + virtual void DoShowPage(wxWindow* page, bool show) + { + if ( show ) + page->ShowWithEffect(m_showEffect, m_showTimeout); + else + page->HideWithEffect(m_hideEffect, m_hideTimeout); + } + +private: + void Init() + { + // We don't need any border as we don't have anything to separate the + // page contents from. + SetInternalBorder(0); + + // No effects by default. + m_showEffect = + m_hideEffect = wxSHOW_EFFECT_NONE; + + m_showTimeout = + m_hideTimeout = 0; + } + + wxVector m_pageTexts; + + wxShowEffect m_showEffect, + m_hideEffect; + + unsigned m_showTimeout, + m_hideTimeout; + + wxDECLARE_NO_COPY_CLASS(wxSimplebook); +}; + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_SIMPLEBOOK_H_ diff --git a/Externals/wxWidgets3/include/wx/sizer.h b/Externals/wxWidgets3/include/wx/sizer.h index 249f2d8389..7d20b548c8 100644 --- a/Externals/wxWidgets3/include/wx/sizer.h +++ b/Externals/wxWidgets3/include/wx/sizer.h @@ -4,7 +4,6 @@ // Author: Robert Roebling and Robin Dunn // Modified by: Ron Lee, Vadim Zeitlin (wxSizerFlags) // Created: -// RCS-ID: $Id: sizer.h 69970 2011-12-10 04:34:06Z RD $ // Copyright: (c) Robin Dunn, Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -125,6 +124,10 @@ public: wxSizerFlags& Border(int direction, int borderInPixels) { + wxCHECK_MSG( !(direction & ~wxALL), *this, + wxS("direction must be a combination of wxDirection ") + wxS("enum values.") ); + m_flags &= ~wxALL; m_flags |= direction; @@ -311,6 +314,10 @@ public: { return m_minSize; } wxSize GetMinSizeWithBorder() const; + wxSize GetMaxSize() const + { return IsWindow() ? m_window->GetMaxSize() : wxDefaultSize; } + wxSize GetMaxSizeWithBorder() const; + void SetMinSize(const wxSize& size) { if ( IsWindow() ) @@ -436,6 +443,10 @@ protected: void DoSetSizer(wxSizer *sizer); void DoSetSpacer(const wxSize& size); + // Add the border specified for this item to the given size + // if it's != wxDefaultSize, just return wxDefaultSize otherwise. + wxSize AddBorderToSize(const wxSize& size) const; + // discriminated union: depending on m_kind one of the fields is valid enum { @@ -601,7 +612,7 @@ public: virtual void DeleteWindows(); // Inform sizer about the first direction that has been decided (by parent item) - // Returns true if it made use of the informtion (and recalculated min size) + // Returns true if it made use of the information (and recalculated min size) virtual bool InformFirstDirection( int WXUNUSED(direction), int WXUNUSED(size), int WXUNUSED(availableOtherDir) ) { return false; } @@ -703,6 +714,10 @@ public: void Show(bool show) { ShowItems(show); } + // This is the ShowItems() counterpart and returns true if any of the sizer + // items are shown. + virtual bool AreAnyItemsShown() const; + protected: wxSize m_size; wxSize m_minSize; @@ -798,7 +813,7 @@ protected: "Can't calculate number of cols if number of rows is not specified" ); - return (m_children.GetCount() + m_rows - 1) / m_rows; + return int(m_children.GetCount() + m_rows - 1) / m_rows; } int CalcRows() const @@ -809,7 +824,7 @@ protected: "Can't calculate number of cols if number of rows is not specified" ); - return (m_children.GetCount() + m_cols - 1) / m_cols; + return int(m_children.GetCount() + m_cols - 1) / m_cols; } private: @@ -1021,6 +1036,7 @@ public: // override to hide/show the static box as well virtual void ShowItems (bool show); + virtual bool AreAnyItemsShown() const; virtual bool Detach( wxWindow *window ); virtual bool Detach( wxSizer *sizer ) { return wxBoxSizer::Detach(sizer); } diff --git a/Externals/wxWidgets3/include/wx/slider.h b/Externals/wxWidgets3/include/wx/slider.h index e6d9f5e6ea..e3ab597b0c 100644 --- a/Externals/wxWidgets3/include/wx/slider.h +++ b/Externals/wxWidgets3/include/wx/slider.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 09.02.01 -// RCS-ID: $Id: slider.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 1996-2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/snglinst.h b/Externals/wxWidgets3/include/wx/snglinst.h index 930209d4e5..61213a86cf 100644 --- a/Externals/wxWidgets3/include/wx/snglinst.h +++ b/Externals/wxWidgets3/include/wx/snglinst.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 08.06.01 -// RCS-ID: $Id: snglinst.h 61945 2009-09-16 12:38:00Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/socket.h b/Externals/wxWidgets3/include/wx/socket.h index 4b69eb2440..35ff266216 100644 --- a/Externals/wxWidgets3/include/wx/socket.h +++ b/Externals/wxWidgets3/include/wx/socket.h @@ -4,7 +4,6 @@ // Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia // Modified by: // Created: April 1997 -// RCS-ID: $Id: socket.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -30,6 +29,16 @@ class wxSocketImpl; // Types and constants // ------------------------------------------------------------------------ +// Define the type of native sockets. +#if defined(__WINDOWS__) + // Although socket descriptors are still 32 bit values, even under Win64, + // the socket type is 64 bit there. + typedef wxUIntPtr wxSOCKET_T; +#else + typedef int wxSOCKET_T; +#endif + + // Types of different socket notifications or events. // // NB: the values here should be consecutive and start with 0 as they are @@ -71,13 +80,17 @@ enum wxSocketError // socket options/flags bit masks enum { - wxSOCKET_NONE = 0, - wxSOCKET_NOWAIT = 1, - wxSOCKET_WAITALL = 2, - wxSOCKET_BLOCK = 4, - wxSOCKET_REUSEADDR = 8, - wxSOCKET_BROADCAST = 16, - wxSOCKET_NOBIND = 32 + wxSOCKET_NONE = 0x0000, + wxSOCKET_NOWAIT_READ = 0x0001, + wxSOCKET_NOWAIT_WRITE = 0x0002, + wxSOCKET_NOWAIT = wxSOCKET_NOWAIT_READ | wxSOCKET_NOWAIT_WRITE, + wxSOCKET_WAITALL_READ = 0x0004, + wxSOCKET_WAITALL_WRITE = 0x0008, + wxSOCKET_WAITALL = wxSOCKET_WAITALL_READ | wxSOCKET_WAITALL_WRITE, + wxSOCKET_BLOCK = 0x0010, + wxSOCKET_REUSEADDR = 0x0020, + wxSOCKET_BROADCAST = 0x0040, + wxSOCKET_NOBIND = 0x0080 }; typedef int wxSocketFlags; @@ -123,6 +136,8 @@ public: bool IsData() { return WaitForRead(0, 0); } bool IsDisconnected() const { return !IsConnected(); } wxUint32 LastCount() const { return m_lcount; } + wxUint32 LastReadCount() const { return m_lcount_read; } + wxUint32 LastWriteCount() const { return m_lcount_write; } wxSocketError LastError() const; void SaveState(); void RestoreState(); @@ -171,6 +186,8 @@ public: bool GetOption(int level, int optname, void *optval, int *optlen); bool SetOption(int level, int optname, const void *optval, int optlen); wxUint32 GetLastIOSize() const { return m_lcount; } + wxUint32 GetLastIOReadSize() const { return m_lcount_read; } + wxUint32 GetLastIOWriteSize() const { return m_lcount_write; } // event handling void *GetClientData() const { return m_clientData; } @@ -179,6 +196,9 @@ public: void SetNotify(wxSocketEventFlags flags); void Notify(bool notify); + // Get the underlying socket descriptor. + wxSOCKET_T GetSocket() const; + // initialize/shutdown the sockets (done automatically so there is no need // to call these functions usually) // @@ -254,6 +274,8 @@ private: bool m_writing; // busy writing? bool m_closed; // was the other end closed? wxUint32 m_lcount; // last IO transaction size + wxUint32 m_lcount_read; // last IO transaction size of Read() direction. + wxUint32 m_lcount_write; // last IO transaction size of Write() direction. unsigned long m_timeout; // IO timeout value in seconds // (TODO: remove, wxSocketImpl has it too) wxList m_states; // stack of states (TODO: remove!) diff --git a/Externals/wxWidgets3/include/wx/sound.h b/Externals/wxWidgets3/include/wx/sound.h index 863b1d3298..b81a11cb46 100644 --- a/Externals/wxWidgets3/include/wx/sound.h +++ b/Externals/wxWidgets3/include/wx/sound.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2004/02/01 -// RCS-ID: $Id: sound.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2004, Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/spinbutt.h b/Externals/wxWidgets3/include/wx/spinbutt.h index ad0b12c8a2..cb11e29833 100644 --- a/Externals/wxWidgets3/include/wx/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/spinbutt.h @@ -4,7 +4,6 @@ // Author: Julian Smart, Vadim Zeitlin // Modified by: // Created: 23.07.99 -// RCS-ID: $Id: spinbutt.h 66625 2011-01-07 17:42:39Z SC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/spinctrl.h b/Externals/wxWidgets3/include/wx/spinctrl.h index 19fce4df50..7a7b3a4bd9 100644 --- a/Externals/wxWidgets3/include/wx/spinctrl.h +++ b/Externals/wxWidgets3/include/wx/spinctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.07.99 -// RCS-ID: $Id: spinctrl.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,8 +20,8 @@ // Events class WXDLLIMPEXP_FWD_CORE wxSpinDoubleEvent; -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, wxSpinDoubleEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SPINCTRL, wxSpinEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SPINCTRLDOUBLE, wxSpinDoubleEvent); // ---------------------------------------------------------------------------- // A spin ctrl is a text control with a spin button which is usually used to @@ -51,6 +50,10 @@ public: virtual void SetSnapToTicks(bool snap_to_ticks) = 0; // void SetDigits(unsigned digits) - wxSpinCtrlDouble only + // The base for numbers display, e.g. 10 or 16. + virtual int GetBase() const = 0; + virtual bool SetBase(int base) = 0; + // Select text in the textctrl virtual void SetSelection(long from, long to) = 0; @@ -100,10 +103,10 @@ typedef void (wxEvtHandler::*wxSpinDoubleEventFunction)(wxSpinDoubleEvent&); // macros for handling spinctrl events #define EVT_SPINCTRL(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_SPINCTRL_UPDATED, id, wxSpinEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_SPINCTRL, id, wxSpinEventHandler(fn)) #define EVT_SPINCTRLDOUBLE(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, id, wxSpinDoubleEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_SPINCTRLDOUBLE, id, wxSpinDoubleEventHandler(fn)) // ---------------------------------------------------------------------------- // include the platform-dependent class implementation @@ -113,9 +116,7 @@ typedef void (wxEvtHandler::*wxSpinDoubleEventFunction)(wxSpinDoubleEvent&); // wxSpinCtrlDouble implementations or neither, define the appropriate symbols // and include the generic version if necessary to provide the missing class(es) -#if defined(__WXUNIVERSAL__) || \ - defined(__WXMOTIF__) || \ - defined(__WXCOCOA__) +#if defined(__WXUNIVERSAL__) // nothing, use generic controls #elif defined(__WXMSW__) #define wxHAS_NATIVE_SPINCTRL @@ -130,15 +131,25 @@ typedef void (wxEvtHandler::*wxSpinDoubleEventFunction)(wxSpinDoubleEvent&); #elif defined(__WXGTK__) #define wxHAS_NATIVE_SPINCTRL #include "wx/gtk1/spinctrl.h" -#elif defined(__WXMAC__) - #define wxHAS_NATIVE_SPINCTRL - #include "wx/osx/spinctrl.h" #endif // platform #if !defined(wxHAS_NATIVE_SPINCTRL) || !defined(wxHAS_NATIVE_SPINCTRLDOUBLE) #include "wx/generic/spinctlg.h" #endif +namespace wxPrivate +{ + +// This is an internal helper function currently used by all ports: return the +// string containing hexadecimal representation of the given number. +extern wxString wxSpinCtrlFormatAsHex(long val, long maxVal); + +} // namespace wxPrivate + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SPINCTRL_UPDATED wxEVT_SPINCTRL +#define wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED wxEVT_SPINCTRLDOUBLE + #endif // wxUSE_SPINCTRL #endif // _WX_SPINCTRL_H_ diff --git a/Externals/wxWidgets3/include/wx/splash.h b/Externals/wxWidgets3/include/wx/splash.h index acd87fc136..e4fb0c21ee 100644 --- a/Externals/wxWidgets3/include/wx/splash.h +++ b/Externals/wxWidgets3/include/wx/splash.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: splash.h 33948 2005-05-04 18:57:50Z JS $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/splitter.h b/Externals/wxWidgets3/include/wx/splitter.h index 27b1fa41a3..f36d2923df 100644 --- a/Externals/wxWidgets3/include/wx/splitter.h +++ b/Externals/wxWidgets3/include/wx/splitter.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: splitter.h 58718 2009-02-07 18:59:25Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -37,10 +36,10 @@ class WXDLLIMPEXP_FWD_CORE wxSplitterEvent; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, wxSplitterEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, wxSplitterEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, wxSplitterEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_SPLITTER_UNSPLIT, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_SASH_POS_CHANGED, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_SASH_POS_CHANGING, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_DOUBLECLICKED, wxSplitterEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_SPLITTER_UNSPLIT, wxSplitterEvent ); #include "wx/generic/splitter.h" diff --git a/Externals/wxWidgets3/include/wx/srchctrl.h b/Externals/wxWidgets3/include/wx/srchctrl.h index bae24ec5d1..3ca462258c 100644 --- a/Externals/wxWidgets3/include/wx/srchctrl.h +++ b/Externals/wxWidgets3/include/wx/srchctrl.h @@ -3,7 +3,6 @@ // Purpose: wxSearchCtrlBase class // Author: Vince Harron // Created: 2006-02-18 -// RCS-ID: $Id: srchctrl.h 68911 2011-08-27 12:13:23Z VZ $ // Copyright: (c) Vince Harron // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -42,8 +41,8 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxSearchCtrlNameStr[]; -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SEARCHCTRL_CANCEL_BTN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SEARCHCTRL_SEARCH_BTN, wxCommandEvent); // ---------------------------------------------------------------------------- // a search ctrl is a text control with a search button and a cancel button @@ -89,10 +88,14 @@ private: // ---------------------------------------------------------------------------- #define EVT_SEARCHCTRL_CANCEL_BTN(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, id, wxCommandEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_SEARCHCTRL_CANCEL_BTN, id, wxCommandEventHandler(fn)) #define EVT_SEARCHCTRL_SEARCH_BTN(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, id, wxCommandEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_SEARCHCTRL_SEARCH_BTN, id, wxCommandEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN wxEVT_SEARCHCTRL_CANCEL_BTN +#define wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN wxEVT_SEARCHCTRL_SEARCH_BTN #endif // wxUSE_SEARCHCTRL diff --git a/Externals/wxWidgets3/include/wx/sstream.h b/Externals/wxWidgets3/include/wx/sstream.h index 405af50f4e..b0b2290fbc 100644 --- a/Externals/wxWidgets3/include/wx/sstream.h +++ b/Externals/wxWidgets3/include/wx/sstream.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-09-19 -// RCS-ID: $Id: sstream.h 67968 2011-06-16 16:22:15Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/stackwalk.h b/Externals/wxWidgets3/include/wx/stackwalk.h index 22cf370868..1133d6ef7c 100644 --- a/Externals/wxWidgets3/include/wx/stackwalk.h +++ b/Externals/wxWidgets3/include/wx/stackwalk.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-07 -// RCS-ID: $Id: stackwalk.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/statbmp.h b/Externals/wxWidgets3/include/wx/statbmp.h index d42ea8d804..e86f45b59c 100644 --- a/Externals/wxWidgets3/include/wx/statbmp.h +++ b/Externals/wxWidgets3/include/wx/statbmp.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 25.08.00 -// RCS-ID: $Id: statbmp.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/statbox.h b/Externals/wxWidgets3/include/wx/statbox.h index c49a70ef31..d01f257969 100644 --- a/Externals/wxWidgets3/include/wx/statbox.h +++ b/Externals/wxWidgets3/include/wx/statbox.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: statbox.h 67280 2011-03-22 14:17:38Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,6 +16,7 @@ #if wxUSE_STATBOX #include "wx/control.h" +#include "wx/containr.h" extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticBoxNameStr[]; @@ -24,13 +24,12 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxStaticBoxNameStr[]; // wxStaticBox: a grouping box with a label // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxStaticBoxBase : public wxControl +class WXDLLIMPEXP_CORE wxStaticBoxBase : public wxNavigationEnabled { public: - wxStaticBoxBase() { } + wxStaticBoxBase(); // overridden base class virtuals - virtual bool AcceptsFocus() const { return false; } virtual bool HasTransparentBackground() { return true; } // implementation only: this is used by wxStaticBoxSizer to account for the diff --git a/Externals/wxWidgets3/include/wx/statline.h b/Externals/wxWidgets3/include/wx/statline.h index 148b96af48..4f9e0f1561 100644 --- a/Externals/wxWidgets3/include/wx/statline.h +++ b/Externals/wxWidgets3/include/wx/statline.h @@ -3,7 +3,6 @@ // Purpose: wxStaticLine class interface // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/stattext.h b/Externals/wxWidgets3/include/wx/stattext.h index a3165cc877..fa29077526 100644 --- a/Externals/wxWidgets3/include/wx/stattext.h +++ b/Externals/wxWidgets3/include/wx/stattext.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: stattext.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/statusbr.h b/Externals/wxWidgets3/include/wx/statusbr.h index f76eb72864..17e033ffc3 100644 --- a/Externals/wxWidgets3/include/wx/statusbr.h +++ b/Externals/wxWidgets3/include/wx/statusbr.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05.02.00 -// RCS-ID: $Id: statusbr.h 70808 2012-03-04 20:31:42Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -45,6 +44,7 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusBarNameStr[]; #define wxSB_NORMAL 0x0000 #define wxSB_FLAT 0x0001 #define wxSB_RAISED 0x0002 +#define wxSB_SUNKEN 0x0003 // ---------------------------------------------------------------------------- // wxStatusBarPane: an helper for wxStatusBar @@ -53,7 +53,7 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusBarNameStr[]; class WXDLLIMPEXP_CORE wxStatusBarPane { public: - wxStatusBarPane(int style = wxSB_NORMAL, size_t width = 0) + wxStatusBarPane(int style = wxSB_NORMAL, int width = 0) : m_nStyle(style), m_nWidth(width) { m_bEllipsized = false; } @@ -119,7 +119,7 @@ public: // set the number of fields and call SetStatusWidths(widths) if widths are // given virtual void SetFieldsCount(int number = 1, const int *widths = NULL); - int GetFieldsCount() const { return m_panes.GetCount(); } + int GetFieldsCount() const { return (int)m_panes.GetCount(); } // field text // ---------- @@ -150,10 +150,7 @@ public: // field styles // ------------ - // Set the field style. Use either wxSB_NORMAL (default) for a standard 3D - // border around a field, wxSB_FLAT for no border around a field, so that it - // appears flat or wxSB_POPOUT to make the field appear raised. - // Setting field styles only works on wxMSW + // Set the field border style to one of wxSB_XXX values. virtual void SetStatusStyles(int n, const int styles[]); int GetStatusStyle(int n) const diff --git a/Externals/wxWidgets3/include/wx/stdpaths.h b/Externals/wxWidgets3/include/wx/stdpaths.h index 5288ae626a..9d92044457 100644 --- a/Externals/wxWidgets3/include/wx/stdpaths.h +++ b/Externals/wxWidgets3/include/wx/stdpaths.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-10-17 -// RCS-ID: $Id: stdpaths.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -142,9 +141,6 @@ public: virtual wxString GetTempDir() const; - // ctor for the base class - wxStandardPathsBase(); - // virtual dtor for the base class virtual ~wxStandardPathsBase(); @@ -158,6 +154,10 @@ public: protected: + // Ctor is protected as this is a base class which should never be created + // directly. + wxStandardPathsBase(); + // append the path component, with a leading path separator if a // path separator or dot (.) is not already at the end of dir static wxString AppendPathComponent(const wxString& dir, const wxString& component); @@ -210,6 +210,12 @@ public: virtual wxString GetPluginsDir() const { return m_prefix; } virtual wxString GetDocumentsDir() const { return m_prefix; } +protected: + // Ctor is protected because wxStandardPaths::Get() should always be used + // to access the global wxStandardPaths object of the correct type instead + // of creating one of a possibly wrong type yourself. + wxStandardPaths() { } + private: wxString m_prefix; }; diff --git a/Externals/wxWidgets3/include/wx/stdstream.h b/Externals/wxWidgets3/include/wx/stdstream.h index 4e3ab6dc65..73ac0ac260 100644 --- a/Externals/wxWidgets3/include/wx/stdstream.h +++ b/Externals/wxWidgets3/include/wx/stdstream.h @@ -4,7 +4,6 @@ // wxInputStream and wxOutputStream // Author: Jonathan Liu // Created: 2009-05-02 -// RCS-ID: $Id: stdstream.h 70515 2012-02-05 14:18:37Z VZ $ // Copyright: (c) 2009 Jonathan Liu // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/stockitem.h b/Externals/wxWidgets3/include/wx/stockitem.h index e174d05dc3..72d3e714d8 100644 --- a/Externals/wxWidgets3/include/wx/stockitem.h +++ b/Externals/wxWidgets3/include/wx/stockitem.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2004-08-15 -// RCS-ID: $Id: stockitem.h 63383 2010-02-04 01:33:32Z VZ $ // Copyright: (c) Vaclav Slavik, 2004 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -73,7 +72,7 @@ WXDLLIMPEXP_CORE wxString wxGetStockHelpString(wxWindowID id, #ifdef __WXGTK20__ -// Translates stock ID to GTK+'s stock item string indentifier: +// Translates stock ID to GTK+'s stock item string identifier: WXDLLIMPEXP_CORE const char *wxGetStockGtkID(wxWindowID id); #endif diff --git a/Externals/wxWidgets3/include/wx/stopwatch.h b/Externals/wxWidgets3/include/wx/stopwatch.h index da5069e975..248f757520 100644 --- a/Externals/wxWidgets3/include/wx/stopwatch.h +++ b/Externals/wxWidgets3/include/wx/stopwatch.h @@ -4,7 +4,6 @@ // Author: Julian Smart (wxTimer), Sylvain Bougnoux (wxStopWatch), // Vadim Zeitlin (time functions, current wxStopWatch) // Created: 26.06.03 (extracted from wx/timer.h) -// RCS-ID: $Id: stopwatch.h 69838 2011-11-27 19:50:27Z VZ $ // Copyright: (c) 1998-2003 Julian Smart, Sylvain Bougnoux // (c) 2011 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/strconv.h b/Externals/wxWidgets3/include/wx/strconv.h index 26b5314ca5..3dc3752186 100644 --- a/Externals/wxWidgets3/include/wx/strconv.h +++ b/Externals/wxWidgets3/include/wx/strconv.h @@ -4,7 +4,6 @@ // Author: Ove Kaaven, Robert Roebling, Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: strconv.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 1998 Ove Kaaven, Robert Roebling // (c) 1998-2006 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/stream.h b/Externals/wxWidgets3/include/wx/stream.h index 7103c8d970..0c380d6aaf 100644 --- a/Externals/wxWidgets3/include/wx/stream.h +++ b/Externals/wxWidgets3/include/wx/stream.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux, Guillermo Rodriguez Garcia, Vadim Zeitlin // Modified by: // Created: 11/07/98 -// RCS-ID: $Id: stream.h 68331 2011-07-22 16:16:00Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -128,6 +127,11 @@ public: // it means that EOF has been reached. virtual wxInputStream& Read(void *buffer, size_t size); + // Read exactly the given number of bytes, unlike Read(), which may read + // less than the requested amount of data without returning an error, this + // method either reads all the data or returns false. + bool ReadAll(void *buffer, size_t size); + // copy the entire contents of this stream into streamOut, stopping only // when EOF is reached or an error occurs wxInputStream& Read(wxOutputStream& streamOut); @@ -233,6 +237,12 @@ public: void PutC(char c); virtual wxOutputStream& Write(const void *buffer, size_t size); + + // This is ReadAll() equivalent for Write(): it either writes exactly the + // given number of bytes or returns false, unlike Write() which can write + // less data than requested but still return without error. + bool WriteAll(const void *buffer, size_t size); + wxOutputStream& Write(wxInputStream& stream_in); virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); @@ -270,16 +280,17 @@ class WXDLLIMPEXP_BASE wxCountingOutputStream : public wxOutputStream public: wxCountingOutputStream(); - wxFileOffset GetLength() const; + virtual wxFileOffset GetLength() const; bool Ok() const { return IsOk(); } - bool IsOk() const { return true; } + virtual bool IsOk() const { return true; } protected: virtual size_t OnSysWrite(const void *buffer, size_t size); virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); virtual wxFileOffset OnSysTell() const; - size_t m_currentPos; + size_t m_currentPos, + m_lastPos; DECLARE_DYNAMIC_CLASS(wxCountingOutputStream) wxDECLARE_NO_COPY_CLASS(wxCountingOutputStream); @@ -640,6 +651,54 @@ protected: inline wxStreamBuffer *wxBufferedOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } #endif // WXWIN_COMPATIBILITY_2_6 +// --------------------------------------------------------------------------- +// wxWrapperInputStream: forwards all IO to another stream. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxWrapperInputStream : public wxFilterInputStream +{ +public: + // Constructor fully initializing the stream. The overload taking pointer + // takes ownership of the parent stream, the one taking reference does not. + // + // Notice that this class also has a default ctor but it's protected as the + // derived class is supposed to take care of calling InitParentStream() if + // it's used. + wxWrapperInputStream(wxInputStream& stream); + wxWrapperInputStream(wxInputStream* stream); + + // Override the base class methods to forward to the wrapped stream. + virtual wxFileOffset GetLength() const; + virtual bool IsSeekable() const; + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + // Ensure that our own last error is the same as that of the real stream. + // + // This method is const because the error must be updated even from const + // methods (in other words, it really should have been mutable in the first + // place). + void SynchronizeLastError() const + { + const_cast(this)-> + Reset(m_parent_i_stream->GetLastError()); + } + + // Default constructor, use InitParentStream() later. + wxWrapperInputStream(); + + // Set up the wrapped stream for an object initialized using the default + // constructor. The ownership logic is the same as above. + void InitParentStream(wxInputStream& stream); + void InitParentStream(wxInputStream* stream); + + wxDECLARE_NO_COPY_CLASS(wxWrapperInputStream); +}; + + #endif // wxUSE_STREAMS #endif // _WX_WXSTREAM_H__ diff --git a/Externals/wxWidgets3/include/wx/string.h b/Externals/wxWidgets3/include/wx/string.h index 930e822d25..ef1a8d9aa8 100644 --- a/Externals/wxWidgets3/include/wx/string.h +++ b/Externals/wxWidgets3/include/wx/string.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: string.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -43,10 +42,6 @@ # include #endif -#ifdef HAVE_STRCASECMP_IN_STRINGS_H - #include // for strcasecmp() -#endif // HAVE_STRCASECMP_IN_STRINGS_H - #include "wx/wxcrtbase.h" // for wxChar, wxStrlen() etc. #include "wx/strvararg.h" #include "wx/buffer.h" // for wxCharBuffer @@ -134,69 +129,18 @@ namespace wxPrivate // backwards compatibility only. // checks whether the passed in pointer is NULL and if the string is empty -wxDEPRECATED( inline bool IsEmpty(const char *p) ); +wxDEPRECATED_MSG("use wxIsEmpty() instead") inline bool IsEmpty(const char *p) { return (!p || !*p); } // safe version of strlen() (returns 0 if passed NULL pointer) -wxDEPRECATED( inline size_t Strlen(const char *psz) ); +wxDEPRECATED_MSG("use wxStrlen() instead") inline size_t Strlen(const char *psz) { return psz ? strlen(psz) : 0; } // portable strcasecmp/_stricmp -wxDEPRECATED( inline int Stricmp(const char *psz1, const char *psz2) ); +wxDEPRECATED_MSG("use wxStricmp() instead") inline int Stricmp(const char *psz1, const char *psz2) -{ -#if defined(__VISUALC__) && defined(__WXWINCE__) - register char c1, c2; - do { - c1 = tolower(*psz1++); - c2 = tolower(*psz2++); - } while ( c1 && (c1 == c2) ); - - return c1 - c2; -#elif defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) ) - return _stricmp(psz1, psz2); -#elif defined(__SC__) - return _stricmp(psz1, psz2); -#elif defined(__BORLANDC__) - return stricmp(psz1, psz2); -#elif defined(__WATCOMC__) - return stricmp(psz1, psz2); -#elif defined(__DJGPP__) - return stricmp(psz1, psz2); -#elif defined(__EMX__) - return stricmp(psz1, psz2); -#elif defined(__WXPM__) - return stricmp(psz1, psz2); -#elif defined(HAVE_STRCASECMP_IN_STRING_H) || \ - defined(HAVE_STRCASECMP_IN_STRINGS_H) || \ - defined(__GNUWIN32__) - return strcasecmp(psz1, psz2); -#elif defined(__MWERKS__) && !defined(__INTEL__) - register char c1, c2; - do { - c1 = tolower(*psz1++); - c2 = tolower(*psz2++); - } while ( c1 && (c1 == c2) ); - - return c1 - c2; -#else - // almost all compilers/libraries provide this function (unfortunately under - // different names), that's why we don't implement our own which will surely - // be more efficient than this code (uncomment to use): - /* - register char c1, c2; - do { - c1 = tolower(*psz1++); - c2 = tolower(*psz2++); - } while ( c1 && (c1 == c2) ); - - return c1 - c2; - */ - - #error "Please define string case-insensitive compare for your OS/compiler" -#endif // OS/compiler -} + { return wxCRT_StricmpA(psz1, psz2); } #endif // WXWIN_COMPATIBILITY_2_8 @@ -897,7 +841,7 @@ public: public: \ WX_DEFINE_ITERATOR_CATEGORY(WX_STR_ITERATOR_TAG) \ typedef wxUniChar value_type; \ - typedef int difference_type; \ + typedef ptrdiff_t difference_type; \ typedef reference_type reference; \ typedef pointer_type pointer; \ \ @@ -1150,6 +1094,25 @@ public: #undef WX_STR_ITERATOR_TAG #undef WX_STR_ITERATOR_IMPL + // This method is mostly used by wxWidgets itself and return the offset of + // the given iterator in bytes relative to the start of the buffer + // representing the current string contents in the current locale encoding. + // + // It is inefficient as it involves converting part of the string to this + // encoding (and also unsafe as it simply returns 0 if the conversion fails) + // and so should be avoided if possible, wx itself only uses it to implement + // backwards-compatible API. + ptrdiff_t IterOffsetInMBStr(const const_iterator& i) const + { + const wxString str(begin(), i); + + // This is logically equivalent to strlen(str.mb_str()) but avoids + // actually converting the string to multibyte and just computes the + // length that it would have after conversion. + size_t ofs = wxConvLibc.FromWChar(NULL, 0, str.wc_str(), str.length()); + return ofs == wxCONV_FAILED ? 0 : static_cast(ofs); + } + friend class iterator; friend class const_iterator; @@ -2613,9 +2576,21 @@ public: return *this; } + // This is a non-standard-compliant overload taking the first "len" + // characters of the source string. wxString& assign(const wxString& str, size_t len) { +#if wxUSE_STRING_POS_CACHE + // It is legal to pass len > str.length() to wxStringImpl::assign() but + // by restricting it here we save some work for that function so it's not + // really less efficient and, at the same time, ensure that we don't + // cache invalid length. + const size_t lenSrc = str.length(); + if ( len > lenSrc ) + len = lenSrc; + wxSTRING_SET_CACHED_LENGTH(len); +#endif // wxUSE_STRING_POS_CACHE m_impl.assign(str.m_impl, 0, str.LenToImpl(len)); @@ -2657,7 +2632,7 @@ public: wxString& assign(const char *sz, size_t n) { - wxSTRING_SET_CACHED_LENGTH(n); + wxSTRING_INVALIDATE_CACHE(); SubstrBufFromMB str(ImplStr(sz, n)); m_impl.assign(str.data, str.len); @@ -3473,7 +3448,7 @@ private: void DoUngetWriteBuf(size_t nLen) { - wxSTRING_SET_CACHED_LENGTH(nLen); + wxSTRING_INVALIDATE_CACHE(); m_impl.DoUngetWriteBuf(nLen); } diff --git a/Externals/wxWidgets3/include/wx/stringimpl.h b/Externals/wxWidgets3/include/wx/stringimpl.h index fd611454ca..50d4af9c64 100644 --- a/Externals/wxWidgets3/include/wx/stringimpl.h +++ b/Externals/wxWidgets3/include/wx/stringimpl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: stringimpl.h 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/stringops.h b/Externals/wxWidgets3/include/wx/stringops.h index cb37ac4f99..301a7bf843 100644 --- a/Externals/wxWidgets3/include/wx/stringops.h +++ b/Externals/wxWidgets3/include/wx/stringops.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2007-04-16 -// RCS-ID: $Id: stringops.h 59795 2009-03-23 23:11:55Z VZ $ // Copyright: (c) 2007 REA Elektronik GmbH // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/strvararg.h b/Externals/wxWidgets3/include/wx/strvararg.h index 78f44579db..dc566e9443 100644 --- a/Externals/wxWidgets3/include/wx/strvararg.h +++ b/Externals/wxWidgets3/include/wx/strvararg.h @@ -3,7 +3,6 @@ // Purpose: macros for implementing type-safe vararg passing of strings // Author: Vaclav Slavik // Created: 2007-02-19 -// RCS-ID: $Id: strvararg.h 67760 2011-05-17 22:12:39Z VZ $ // Copyright: (c) 2007 REA Elektronik GmbH // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -309,14 +308,13 @@ struct wxFormatStringArgumentFinder // the correct type (one of wxFormatString::Arg_XXX or-combination in // 'expected_mask'). #define wxASSERT_ARG_TYPE(fmt, index, expected_mask) \ - do \ - { \ + wxSTATEMENT_MACRO_BEGIN \ if ( !fmt ) \ break; \ const int argtype = fmt->GetArgumentType(index); \ wxASSERT_MSG( (argtype & (expected_mask)) == argtype, \ "format specifier doesn't match argument type" ); \ - } while ( wxFalse ) + wxSTATEMENT_MACRO_END #else // Just define it to suppress "unused parameter" warnings for the // parameters which we don't use otherwise diff --git a/Externals/wxWidgets3/include/wx/sysopt.h b/Externals/wxWidgets3/include/wx/sysopt.h index 15de001e44..63474c0660 100644 --- a/Externals/wxWidgets3/include/wx/sysopt.h +++ b/Externals/wxWidgets3/include/wx/sysopt.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2001-07-10 -// RCS-ID: $Id: sysopt.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/tarstrm.h b/Externals/wxWidgets3/include/wx/tarstrm.h index 71fbb7006e..906d4383ec 100644 --- a/Externals/wxWidgets3/include/wx/tarstrm.h +++ b/Externals/wxWidgets3/include/wx/tarstrm.h @@ -2,7 +2,6 @@ // Name: wx/tarstrm.h // Purpose: Streams for Tar files // Author: Mike Wetherell -// RCS-ID: $Id: tarstrm.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2004 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/taskbar.h b/Externals/wxWidgets3/include/wx/taskbar.h index 0e7de72668..4a81088b01 100644 --- a/Externals/wxWidgets3/include/wx/taskbar.h +++ b/Externals/wxWidgets3/include/wx/taskbar.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Julian Smart -// RCS-ID: $Id: taskbar.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,6 +19,21 @@ class WXDLLIMPEXP_FWD_ADV wxTaskBarIconEvent; +// ---------------------------------------------------------------------------- + +// type of taskbar item to create. Only applicable in wxOSX_COCOA +enum wxTaskBarIconType +{ + wxTBI_DOCK, + wxTBI_CUSTOM_STATUSITEM, +#if defined(wxOSX_USE_COCOA) && wxOSX_USE_COCOA + wxTBI_DEFAULT_TYPE = wxTBI_CUSTOM_STATUSITEM +#else + wxTBI_DEFAULT_TYPE = wxTBI_DOCK +#endif +}; + + // ---------------------------------------------------------------------------- // wxTaskBarIconBase: define wxTaskBarIcon interface // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/include/wx/tbarbase.h b/Externals/wxWidgets3/include/wx/tbarbase.h index fb4e7fde74..c9ff7f430c 100644 --- a/Externals/wxWidgets3/include/wx/tbarbase.h +++ b/Externals/wxWidgets3/include/wx/tbarbase.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: tbarbase.h 70854 2012-03-10 00:01:09Z RD $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -609,6 +608,9 @@ public: #endif protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + // to implement in derived classes // ------------------------------- diff --git a/Externals/wxWidgets3/include/wx/testing.h b/Externals/wxWidgets3/include/wx/testing.h new file mode 100644 index 0000000000..57d9d0990c --- /dev/null +++ b/Externals/wxWidgets3/include/wx/testing.h @@ -0,0 +1,351 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/testing.h +// Purpose: helpers for GUI testing +// Author: Vaclav Slavik +// Created: 2012-08-28 +// Copyright: (c) 2012 Vaclav Slavik +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TESTING_H_ +#define _WX_TESTING_H_ + +#include "wx/debug.h" +#include "wx/string.h" +#include "wx/modalhook.h" + +class WXDLLIMPEXP_FWD_CORE wxMessageDialogBase; +class WXDLLIMPEXP_FWD_CORE wxFileDialogBase; + +// ---------------------------------------------------------------------------- +// testing API +// ---------------------------------------------------------------------------- + +// Don't include this code when building the library itself +#ifndef WXBUILDING + +#include "wx/beforestd.h" +#include +#include +#include +#include "wx/afterstd.h" +#include "wx/cpp.h" +#include "wx/dialog.h" +#include "wx/msgdlg.h" +#include "wx/filedlg.h" + +class wxTestingModalHook; + +// Non-template base class for wxExpectModal (via wxExpectModalBase). +// Only used internally. +class wxModalExpectation +{ +public: + wxModalExpectation() : m_isOptional(false) {} + virtual ~wxModalExpectation() {} + + bool IsOptional() const { return m_isOptional; } + + virtual int Invoke(wxDialog *dlg) const = 0; + + virtual wxString GetDescription() const = 0; + +protected: + // Is this dialog optional, i.e. not required to be shown? + bool m_isOptional; +}; + + +// This must be specialized for each type. The specialization MUST be derived +// from wxExpectModalBase. +template class wxExpectModal {}; + + +/** + Base class for wxExpectModal specializations. + + Every such specialization must be derived from wxExpectModalBase; there's + no other use for this class than to serve as wxExpectModal's base class. + + T must be a class derived from wxDialog. + */ +template +class wxExpectModalBase : public wxModalExpectation +{ +public: + typedef T DialogType; + typedef wxExpectModal ExpectationType; + + /** + Returns a copy of the expectation where the expected dialog is marked + as optional. + + Optional dialogs aren't required to appear, it's not an error if they + don't. + */ + ExpectationType Optional() const + { + ExpectationType e(*static_cast(this)); + e.m_isOptional = true; + return e; + } + +protected: + virtual int Invoke(wxDialog *dlg) const + { + DialogType *t = dynamic_cast(dlg); + if ( t ) + return OnInvoked(t); + else + return wxID_NONE; // not handled + } + + /// Returns description of the expected dialog (by default, its class). + virtual wxString GetDescription() const + { + return wxCLASSINFO(T)->GetClassName(); + } + + /** + This method is called when ShowModal() was invoked on a dialog of type T. + + @return Return value is used as ShowModal()'s return value. + */ + virtual int OnInvoked(DialogType *dlg) const = 0; +}; + + +// wxExpectModal specializations for common dialogs: + +template<> +class wxExpectModal : public wxExpectModalBase +{ +public: + wxExpectModal(int id) + { + switch ( id ) + { + case wxYES: + m_id = wxID_YES; + break; + case wxNO: + m_id = wxID_NO; + break; + case wxCANCEL: + m_id = wxID_CANCEL; + break; + case wxOK: + m_id = wxID_OK; + break; + case wxHELP: + m_id = wxID_HELP; + break; + default: + m_id = id; + break; + } + } + +protected: + virtual int OnInvoked(wxMessageDialog *WXUNUSED(dlg)) const + { + return m_id; + } + + int m_id; +}; + +#if wxUSE_FILEDLG + +template<> +class wxExpectModal : public wxExpectModalBase +{ +public: + wxExpectModal(const wxString& path, int id = wxID_OK) + : m_path(path), m_id(id) + { + } + +protected: + virtual int OnInvoked(wxFileDialog *dlg) const + { + dlg->SetPath(m_path); + return m_id; + } + + wxString m_path; + int m_id; +}; + +#endif + +// Implementation of wxModalDialogHook for use in testing, with +// wxExpectModal and the wxTEST_DIALOG() macro. It is not intended for +// direct use, use the macro instead. +class wxTestingModalHook : public wxModalDialogHook +{ +public: + wxTestingModalHook() + { + Register(); + } + + // Called to verify that all expectations were met. This cannot be done in + // the destructor, because ReportFailure() may throw (either because it's + // overriden or because wx's assertions handling is, globally). And + // throwing from the destructor would introduce all sort of problems, + // including messing up the order of errors in some cases. + void CheckUnmetExpectations() + { + while ( !m_expectations.empty() ) + { + const wxModalExpectation *expect = m_expectations.front(); + m_expectations.pop(); + if ( expect->IsOptional() ) + continue; + + ReportFailure + ( + wxString::Format + ( + "Expected %s dialog was not shown.", + expect->GetDescription() + ) + ); + break; + } + } + + void AddExpectation(const wxModalExpectation& e) + { + m_expectations.push(&e); + } + +protected: + virtual int Enter(wxDialog *dlg) + { + while ( !m_expectations.empty() ) + { + const wxModalExpectation *expect = m_expectations.front(); + m_expectations.pop(); + + int ret = expect->Invoke(dlg); + if ( ret != wxID_NONE ) + return ret; // dialog shown as expected + + // not showing an optional dialog is OK, but showing an unexpected + // one definitely isn't: + if ( !expect->IsOptional() ) + { + ReportFailure + ( + wxString::Format + ( + "A %s dialog was shown unexpectedly, expected %s.", + dlg->GetClassInfo()->GetClassName(), + expect->GetDescription() + ) + ); + return wxID_NONE; + } + // else: try the next expectation in the chain + } + + ReportFailure + ( + wxString::Format + ( + "A dialog (%s) was shown unexpectedly.", + dlg->GetClassInfo()->GetClassName() + ) + ); + return wxID_NONE; + } + +protected: + virtual void ReportFailure(const wxString& msg) + { + wxFAIL_MSG( msg ); + } + +private: + std::queue m_expectations; + + wxDECLARE_NO_COPY_CLASS(wxTestingModalHook); +}; + + +// Redefining this value makes it possible to customize the hook class, +// including e.g. its error reporting. +#define wxTEST_DIALOG_HOOK_CLASS wxTestingModalHook + +#define WX_TEST_IMPL_ADD_EXPECTATION(pos, expect) \ + const wxModalExpectation& wx_exp##pos = expect; \ + wx_hook.AddExpectation(wx_exp##pos); + +/** + Runs given code with all modal dialogs redirected to wxExpectModal + hooks, instead of being shown to the user. + + The first argument is any valid expression, typically a function call. The + remaining arguments are wxExpectModal instances defining the dialogs + that are expected to be shown, in order of appearance. + + Some typical examples: + + @code + wxTEST_DIALOG + ( + rc = dlg.ShowModal(), + wxExpectModal(wxGetCwd() + "/test.txt") + ); + @endcode + + Sometimes, the code may show more than one dialog: + + @code + wxTEST_DIALOG + ( + RunSomeFunction(), + wxExpectModal(wxNO), + wxExpectModal(wxYES), + wxExpectModal(wxGetCwd() + "/test.txt") + ); + @endcode + + Notice that wxExpectModal has some convenience methods for further + tweaking the expectations. For example, it's possible to mark an expected + dialog as @em optional for situations when a dialog may be shown, but isn't + required to, by calling the Optional() method: + + @code + wxTEST_DIALOG + ( + RunSomeFunction(), + wxExpectModal(wxNO), + wxExpectModal(wxGetCwd() + "/test.txt").Optional() + ); + @endcode + + @note By default, errors are reported with wxFAIL_MSG(). You may customize this by + implementing a class derived from wxTestingModalHook, overriding its + ReportFailure() method and redefining the wxTEST_DIALOG_HOOK_CLASS + macro to be the name of this class. + + @note Custom dialogs are supported too. All you have to do is to specialize + wxExpectModal<> for your dialog type and implement its OnInvoked() + method. + */ +#ifdef HAVE_VARIADIC_MACROS +#define wxTEST_DIALOG(codeToRun, ...) \ + { \ + wxTEST_DIALOG_HOOK_CLASS wx_hook; \ + wxCALL_FOR_EACH(WX_TEST_IMPL_ADD_EXPECTATION, __VA_ARGS__) \ + codeToRun; \ + wx_hook.CheckUnmetExpectations(); \ + } +#endif /* HAVE_VARIADIC_MACROS */ + +#endif // !WXBUILDING + +#endif // _WX_TESTING_H_ diff --git a/Externals/wxWidgets3/include/wx/textbuf.h b/Externals/wxWidgets3/include/wx/textbuf.h index 0db6a65279..a2511b427d 100644 --- a/Externals/wxWidgets3/include/wx/textbuf.h +++ b/Externals/wxWidgets3/include/wx/textbuf.h @@ -20,7 +20,7 @@ // constants // ---------------------------------------------------------------------------- -// the line termination type (kept wxTextFileType name for compability) +// the line termination type (kept wxTextFileType name for compatibility) enum wxTextFileType { wxTextFileType_None, // incomplete (the last line of the file only) diff --git a/Externals/wxWidgets3/include/wx/textcompleter.h b/Externals/wxWidgets3/include/wx/textcompleter.h index fa422d309d..bc4135f8bf 100644 --- a/Externals/wxWidgets3/include/wx/textcompleter.h +++ b/Externals/wxWidgets3/include/wx/textcompleter.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxTextCompleter class. // Author: Vadim Zeitlin // Created: 2011-04-13 -// RCS-ID: $Id: textcompleter.h 67525 2011-04-17 23:14:11Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/textctrl.h b/Externals/wxWidgets3/include/wx/textctrl.h index eb7a03c96e..83634e1885 100644 --- a/Externals/wxWidgets3/include/wx/textctrl.h +++ b/Externals/wxWidgets3/include/wx/textctrl.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 13.07.99 -// RCS-ID: $Id: textctrl.h 70446 2012-01-23 11:28:28Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -28,7 +27,6 @@ // some compilers don't have standard compliant rdbuf() (and MSVC has it only // in its new iostream library, not in the old one used with iostream.h) #if defined(__WATCOMC__) || \ - defined(__MWERKS__) || \ ((defined(__VISUALC5__) || defined(__VISUALC6__)) && wxUSE_IOSTREAMH) #define wxHAS_TEXT_WINDOW_STREAM 0 #elif wxUSE_STD_IOSTREAM @@ -167,13 +165,16 @@ enum wxTextAttrFlags wxTEXT_ATTR_BACKGROUND_COLOUR = 0x00000002, wxTEXT_ATTR_FONT_FACE = 0x00000004, - wxTEXT_ATTR_FONT_SIZE = 0x00000008, + wxTEXT_ATTR_FONT_POINT_SIZE = 0x00000008, + wxTEXT_ATTR_FONT_PIXEL_SIZE = 0x10000000, wxTEXT_ATTR_FONT_WEIGHT = 0x00000010, wxTEXT_ATTR_FONT_ITALIC = 0x00000020, wxTEXT_ATTR_FONT_UNDERLINE = 0x00000040, wxTEXT_ATTR_FONT_STRIKETHROUGH = 0x08000000, wxTEXT_ATTR_FONT_ENCODING = 0x02000000, wxTEXT_ATTR_FONT_FAMILY = 0x04000000, + wxTEXT_ATTR_FONT_SIZE = \ + ( wxTEXT_ATTR_FONT_POINT_SIZE | wxTEXT_ATTR_FONT_PIXEL_SIZE ), wxTEXT_ATTR_FONT = \ ( wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT | \ wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE | wxTEXT_ATTR_FONT_STRIKETHROUGH | wxTEXT_ATTR_FONT_ENCODING | wxTEXT_ATTR_FONT_FAMILY ), @@ -241,7 +242,9 @@ enum wxTextAttrBulletStyle wxTEXT_ATTR_BULLET_STYLE_ALIGN_LEFT = 0x00000000, wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT = 0x00001000, - wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE = 0x00002000 + wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE = 0x00002000, + + wxTEXT_ATTR_BULLET_STYLE_CONTINUATION = 0x00004000 }; /*! @@ -299,8 +302,11 @@ public: // Equality test bool operator== (const wxTextAttr& attr) const; - // Partial equality test - bool EqPartial(const wxTextAttr& attr) const; + // Partial equality test. If @a weakTest is @true, attributes of this object do not + // have to be present if those attributes of @a attr are present. If @a weakTest is + // @false, the function will fail if an attribute is present in @a attr but not + // in this object. + bool EqPartial(const wxTextAttr& attr, bool weakTest = true) const; // Get attributes from font. bool GetFontAttributes(const wxFont& font, int flags = wxTEXT_ATTR_FONT); @@ -313,7 +319,9 @@ public: void SetLeftIndent(int indent, int subIndent = 0) { m_leftIndent = indent; m_leftSubIndent = subIndent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; } void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; } - void SetFontSize(int pointSize) { m_fontSize = pointSize; m_flags |= wxTEXT_ATTR_FONT_SIZE; } + void SetFontSize(int pointSize) { m_fontSize = pointSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_POINT_SIZE; } + void SetFontPointSize(int pointSize) { m_fontSize = pointSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_POINT_SIZE; } + void SetFontPixelSize(int pixelSize) { m_fontSize = pixelSize; m_flags &= ~wxTEXT_ATTR_FONT_SIZE; m_flags |= wxTEXT_ATTR_FONT_PIXEL_SIZE; } void SetFontStyle(wxFontStyle fontStyle) { m_fontStyle = fontStyle; m_flags |= wxTEXT_ATTR_FONT_ITALIC; } void SetFontWeight(wxFontWeight fontWeight) { m_fontWeight = fontWeight; m_flags |= wxTEXT_ATTR_FONT_WEIGHT; } void SetFontFaceName(const wxString& faceName) { m_fontFaceName = faceName; m_flags |= wxTEXT_ATTR_FONT_FACE; } @@ -323,7 +331,7 @@ public: void SetFontFamily(wxFontFamily family) { m_fontFamily = family; m_flags |= wxTEXT_ATTR_FONT_FAMILY; } // Set font - void SetFont(const wxFont& font, int flags = wxTEXT_ATTR_FONT) { GetFontAttributes(font, flags); } + void SetFont(const wxFont& font, int flags = (wxTEXT_ATTR_FONT & ~wxTEXT_ATTR_FONT_PIXEL_SIZE)) { GetFontAttributes(font, flags); } void SetFlags(long flags) { m_flags = flags; } @@ -390,6 +398,8 @@ public: bool HasRightIndent() const { return HasFlag(wxTEXT_ATTR_RIGHT_INDENT); } bool HasFontWeight() const { return HasFlag(wxTEXT_ATTR_FONT_WEIGHT); } bool HasFontSize() const { return HasFlag(wxTEXT_ATTR_FONT_SIZE); } + bool HasFontPointSize() const { return HasFlag(wxTEXT_ATTR_FONT_POINT_SIZE); } + bool HasFontPixelSize() const { return HasFlag(wxTEXT_ATTR_FONT_PIXEL_SIZE); } bool HasFontItalic() const { return HasFlag(wxTEXT_ATTR_FONT_ITALIC); } bool HasFontUnderlined() const { return HasFlag(wxTEXT_ATTR_FONT_UNDERLINE); } bool HasFontStrikethrough() const { return HasFlag(wxTEXT_ATTR_FONT_STRIKETHROUGH); } @@ -432,7 +442,7 @@ public: // is non-NULL, then it will be used to mask out those attributes that are the same in style // and compareWith, for situations where we don't want to explicitly set inherited attributes. bool Apply(const wxTextAttr& style, const wxTextAttr* compareWith = NULL); - + // merges the attributes of the base and the overlay objects and returns // the result; the parameter attributes take precedence // @@ -725,6 +735,9 @@ public: wxTextEntry::SetValue(value); } + // wxTextEntry overrides + virtual bool SetHint(const wxString& hint); + // wxWindow overrides virtual wxVisualAttributes GetDefaultAttributes() const { @@ -743,9 +756,6 @@ protected: int overflow(int i); #endif // wxHAS_TEXT_WINDOW_STREAM - virtual bool DoLoadFile(const wxString& file, int fileType); - virtual bool DoSaveFile(const wxString& file, int fileType); - // Another wxTextAreaBase override. virtual bool IsValidPosition(long pos) const { @@ -791,17 +801,17 @@ protected: class WXDLLIMPEXP_FWD_CORE wxTextUrlEvent; -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_URL, wxTextUrlEvent); -wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TEXT_MAXLEN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_URL, wxTextUrlEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_TEXT_MAXLEN, wxCommandEvent); class WXDLLIMPEXP_CORE wxTextUrlEvent : public wxCommandEvent { public: wxTextUrlEvent(int winid, const wxMouseEvent& evtMouse, long start, long end) - : wxCommandEvent(wxEVT_COMMAND_TEXT_URL, winid), + : wxCommandEvent(wxEVT_TEXT_URL, winid), m_evtMouse(evtMouse), m_start(start), m_end(end) { } wxTextUrlEvent(const wxTextUrlEvent& event) @@ -810,7 +820,7 @@ public: m_start(event.m_start), m_end(event.m_end) { } - // get the mouse event which happend over the URL + // get the mouse event which happened over the URL const wxMouseEvent& GetMouseEvent() const { return m_evtMouse; } // get the start of the URL @@ -844,12 +854,12 @@ typedef void (wxEvtHandler::*wxTextUrlEventFunction)(wxTextUrlEvent&); wxEVENT_HANDLER_CAST(wxTextUrlEventFunction, func) #define wx__DECLARE_TEXTEVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TEXT_ ## evt, id, wxTextEventHandler(fn)) #define wx__DECLARE_TEXTURLEVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) -#define EVT_TEXT(id, fn) wx__DECLARE_TEXTEVT(UPDATED, id, fn) +#define EVT_TEXT(id, fn) wx__DECLARE_EVT1(wxEVT_TEXT, id, wxTextEventHandler(fn)) #define EVT_TEXT_ENTER(id, fn) wx__DECLARE_TEXTEVT(ENTER, id, fn) #define EVT_TEXT_URL(id, fn) wx__DECLARE_TEXTURLEVT(URL, id, fn) #define EVT_TEXT_MAXLEN(id, fn) wx__DECLARE_TEXTEVT(MAXLEN, id, fn) @@ -898,6 +908,12 @@ private: #endif // wxHAS_TEXT_WINDOW_STREAM +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TEXT_UPDATED wxEVT_TEXT +#define wxEVT_COMMAND_TEXT_ENTER wxEVT_TEXT_ENTER +#define wxEVT_COMMAND_TEXT_URL wxEVT_TEXT_URL +#define wxEVT_COMMAND_TEXT_MAXLEN wxEVT_TEXT_MAXLEN + #endif // wxUSE_TEXTCTRL #endif diff --git a/Externals/wxWidgets3/include/wx/textdlg.h b/Externals/wxWidgets3/include/wx/textdlg.h index e4bc1178a9..509b700ba6 100644 --- a/Externals/wxWidgets3/include/wx/textdlg.h +++ b/Externals/wxWidgets3/include/wx/textdlg.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: textdlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/textentry.h b/Externals/wxWidgets3/include/wx/textentry.h index aeeffa652b..2707afa203 100644 --- a/Externals/wxWidgets3/include/wx/textentry.h +++ b/Externals/wxWidgets3/include/wx/textentry.h @@ -3,7 +3,6 @@ // Purpose: declares wxTextEntry interface defining a simple text entry // Author: Vadim Zeitlin // Created: 2007-09-24 -// RCS-ID: $Id: textentry.h 68918 2011-08-27 14:11:13Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -98,6 +97,8 @@ public: virtual void SetSelection(long from, long to) = 0; virtual void SelectAll() { SetSelection(-1, -1); } + virtual void SelectNone() + { const long pos = GetInsertionPoint(); SetSelection(pos, pos); } virtual void GetSelection(long *from, long *to) const = 0; bool HasSelection() const; virtual wxString GetStringSelection() const; @@ -171,20 +172,20 @@ public: // implementation only // ------------------- - // generate the wxEVT_COMMAND_TEXT_UPDATED event for GetEditableWindow(), + // generate the wxEVT_TEXT event for GetEditableWindow(), // like SetValue() does and return true if the event was processed // // NB: this is public for wxRichTextCtrl use only right now, do not call it static bool SendTextUpdatedEvent(wxWindow *win); - // generate the wxEVT_COMMAND_TEXT_UPDATED event for this window + // generate the wxEVT_TEXT event for this window bool SendTextUpdatedEvent() { return SendTextUpdatedEvent(GetEditableWindow()); } - // generate the wxEVT_COMMAND_TEXT_UPDATED event for this window if the + // generate the wxEVT_TEXT event for this window if the // events are not currently disabled void SendTextUpdatedEventIfAllowed() { diff --git a/Externals/wxWidgets3/include/wx/textfile.h b/Externals/wxWidgets3/include/wx/textfile.h index 394aa5bf87..e6aa3ba663 100644 --- a/Externals/wxWidgets3/include/wx/textfile.h +++ b/Externals/wxWidgets3/include/wx/textfile.h @@ -6,7 +6,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 03.04.98 -// RCS-ID: $Id: textfile.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/textwrapper.h b/Externals/wxWidgets3/include/wx/textwrapper.h index f776b9939e..a708cebd75 100644 --- a/Externals/wxWidgets3/include/wx/textwrapper.h +++ b/Externals/wxWidgets3/include/wx/textwrapper.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxTextWrapper class // Author: Vadim Zeitlin // Created: 2009-05-31 (extracted from dlgcmn.cpp via wx/private/stattext.h) -// RCS-ID: $Id: textwrapper.h 70433 2012-01-22 00:58:05Z VZ $ // Copyright: (c) 1999, 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/tglbtn.h b/Externals/wxWidgets3/include/wx/tglbtn.h index 72966cc759..8cb2a2e891 100644 --- a/Externals/wxWidgets3/include/wx/tglbtn.h +++ b/Externals/wxWidgets3/include/wx/tglbtn.h @@ -5,7 +5,6 @@ // Author: John Norris, minor changes by Axel Schlueter // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) 2000 Johnny C. Norris II // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -22,7 +21,7 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxCheckBoxNameStr[]; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOGGLEBUTTON, wxCommandEvent ); // ---------------------------------------------------------------------------- // wxToggleButtonBase @@ -72,7 +71,7 @@ protected: #define EVT_TOGGLEBUTTON(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, id, wxCommandEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TOGGLEBUTTON, id, wxCommandEventHandler(fn)) #if defined(__WXUNIVERSAL__) #include "wx/univ/tglbtn.h" @@ -93,6 +92,9 @@ protected: #include "wx/os2/tglbtn.h" #endif +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TOGGLEBUTTON_CLICKED wxEVT_TOGGLEBUTTON + #endif // wxUSE_TOGGLEBTN #endif // _WX_TOGGLEBUTTON_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/thread.h b/Externals/wxWidgets3/include/wx/thread.h index 59ccfc952a..6806d82fea 100644 --- a/Externals/wxWidgets3/include/wx/thread.h +++ b/Externals/wxWidgets3/include/wx/thread.h @@ -5,7 +5,6 @@ // Modified by: Vadim Zeitlin (modifications partly inspired by omnithreads // package from Olivetti & Oracle Research Laboratory) // Created: 04/13/98 -// RCS-ID: $Id: thread.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -86,12 +85,12 @@ enum wxThreadWait #endif }; -// defines the interval of priority +// Obsolete synonyms for wxPRIORITY_XXX for backwards compatibility-only enum { - WXTHREAD_MIN_PRIORITY = 0u, - WXTHREAD_DEFAULT_PRIORITY = 50u, - WXTHREAD_MAX_PRIORITY = 100u + WXTHREAD_MIN_PRIORITY = wxPRIORITY_MIN, + WXTHREAD_DEFAULT_PRIORITY = wxPRIORITY_DEFAULT, + WXTHREAD_MAX_PRIORITY = wxPRIORITY_MAX }; // There are 2 types of mutexes: normal mutexes and recursive ones. The attempt @@ -266,10 +265,6 @@ private: // // if CRITICAL_SECTION size changes in Windows, you'll get an assert from // thread.cpp and will need to increase the buffer size - // - // finally, we need this typedef instead of declaring m_buffer directly - // because otherwise the assert mentioned above wouldn't compile with some - // compilers (notably CodeWarrior 8) #ifdef __WIN64__ typedef char wxCritSectBuffer[40]; #else // __WIN32__ @@ -349,10 +344,23 @@ public: // the lock on the associated mutex object, before returning. wxCondError Wait(); + // std::condition_variable-like variant that evaluates the associated condition + template + wxCondError Wait(const Functor& predicate) + { + while ( !predicate() ) + { + wxCondError e = Wait(); + if ( e != wxCOND_NO_ERROR ) + return e; + } + return wxCOND_NO_ERROR; + } + // exactly as Wait() except that it may also return if the specified // timeout elapses even if the condition hasn't been signalled: in this - // case, the return value is false, otherwise (i.e. in case of a normal - // return) it is true + // case, the return value is wxCOND_TIMEOUT, otherwise (i.e. in case of a + // normal return) it is wxCOND_NO_ERROR. // // the timeout parameter specifies an interval that needs to be waited for // in milliseconds @@ -562,7 +570,8 @@ public: wxThreadError Resume(); // priority - // Sets the priority to "prio": see WXTHREAD_XXX_PRIORITY constants + // Sets the priority to "prio" which must be in 0..100 range (see + // also wxPRIORITY_XXX constants). // // NB: the priority can only be set before the thread is created void SetPriority(unsigned int prio); @@ -605,6 +614,8 @@ protected: // of this thread. virtual void *Entry() = 0; + // use this to call the Entry() virtual method + void *CallEntry(); // Callbacks which may be overridden by the derived class to perform some // specific actions when the thread is deleted or killed. By default they @@ -844,7 +855,7 @@ public: #if wxUSE_THREADS -#if defined(__WINDOWS__) || defined(__OS2__) || defined(__EMX__) || defined(__WXOSX__) +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__EMX__) || defined(__DARWIN__) // unlock GUI if there are threads waiting for and lock it back when // there are no more of them - should be called periodically by the main // thread @@ -856,7 +867,7 @@ public: // wakes up the main thread if it's sleeping inside ::GetMessage() extern void WXDLLIMPEXP_BASE wxWakeUpMainThread(); -#ifndef __WXOSX__ +#ifndef __DARWIN__ // return true if the main thread is waiting for some other to terminate: // wxApp then should block all "dangerous" messages extern bool WXDLLIMPEXP_BASE wxIsWaitingForThread(); diff --git a/Externals/wxWidgets3/include/wx/thrimpl.cpp b/Externals/wxWidgets3/include/wx/thrimpl.cpp index 39a75a770b..000b24d589 100644 --- a/Externals/wxWidgets3/include/wx/thrimpl.cpp +++ b/Externals/wxWidgets3/include/wx/thrimpl.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 04.06.02 (extracted from src/*/thread.cpp files) -// RCS-ID: $Id: thrimpl.cpp 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) Vadim Zeitlin (2002) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -343,8 +342,16 @@ wxSemaError wxSemaphore::Post() // ---------------------------------------------------------------------------- #include "wx/utils.h" +#include "wx/private/threadinfo.h" +#include "wx/scopeguard.h" void wxThread::Sleep(unsigned long milliseconds) { wxMilliSleep(milliseconds); } + +void *wxThread::CallEntry() +{ + wxON_BLOCK_EXIT0(wxThreadSpecificInfo::ThreadCleanUp); + return Entry(); +} diff --git a/Externals/wxWidgets3/include/wx/time.h b/Externals/wxWidgets3/include/wx/time.h index 4dc6bf8d19..644422392f 100644 --- a/Externals/wxWidgets3/include/wx/time.h +++ b/Externals/wxWidgets3/include/wx/time.h @@ -3,7 +3,6 @@ // Purpose: Miscellaneous time-related functions. // Author: Vadim Zeitlin // Created: 2011-11-26 -// RCS-ID: $Id: time.h 69846 2011-11-27 20:28:43Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/timectrl.h b/Externals/wxWidgets3/include/wx/timectrl.h index 832cc67708..928d9aedf3 100644 --- a/Externals/wxWidgets3/include/wx/timectrl.h +++ b/Externals/wxWidgets3/include/wx/timectrl.h @@ -3,7 +3,6 @@ // Purpose: Declaration of wxTimePickerCtrl class. // Author: Vadim Zeitlin // Created: 2011-09-22 -// RCS-ID: $Id: timectrl.h 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -50,9 +49,42 @@ public: /* We also inherit Set/GetValue() methods from the base class which define our public API. Notice that the date portion of the date passed as - input is ignored and for the result date it's always today, but only - the time part of wxDateTime objects is really significant here. + input or received as output is or should be ignored, only the time part + of wxDateTime objects is really significant here. Use Set/GetTime() + below for possibly simpler interface. */ + + // Set the given time. + bool SetTime(int hour, int min, int sec) + { + // Notice that we should use a date on which DST doesn't change to + // avoid any problems with time discontinuity so use a fixed date (on + // which nobody changes DST) instead of e.g. today. + wxDateTime dt(1, wxDateTime::Jan, 2012, hour, min, sec); + if ( !dt.IsValid() ) + { + // No need to assert here, wxDateTime already does it for us. + return false; + } + + SetValue(dt); + + return true; + } + + // Get the current time components. All pointers must be non-NULL. + bool GetTime(int* hour, int* min, int* sec) const + { + wxCHECK_MSG( hour && min && sec, false, + wxS("Time component pointers must be non-NULL") ); + + const wxDateTime::Tm tm = GetValue().GetTm(); + *hour = tm.hour; + *min = tm.min; + *sec = tm.sec; + + return true; + } }; #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) diff --git a/Externals/wxWidgets3/include/wx/timer.h b/Externals/wxWidgets3/include/wx/timer.h index 5400c76b23..8ee5684e00 100644 --- a/Externals/wxWidgets3/include/wx/timer.h +++ b/Externals/wxWidgets3/include/wx/timer.h @@ -5,7 +5,6 @@ // Modified by: Vadim Zeitlin (wxTimerBase) // Guillermo Rodriguez (global clean up) // Created: 04/01/98 -// RCS-ID: $Id: timer.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -81,6 +80,10 @@ public: // timer if it is already running virtual bool Start(int milliseconds = -1, bool oneShot = false); + // start the timer for one iteration only, this is just a simple wrapper + // for Start() + bool StartOnce(int milliseconds = -1) { return Start(milliseconds, true); } + // stop the timer, does nothing if the timer is not running virtual void Stop(); diff --git a/Externals/wxWidgets3/include/wx/tipdlg.h b/Externals/wxWidgets3/include/wx/tipdlg.h index b5d0361249..e0093855fb 100644 --- a/Externals/wxWidgets3/include/wx/tipdlg.h +++ b/Externals/wxWidgets3/include/wx/tipdlg.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 28.06.99 -// RCS-ID: $Id: tipdlg.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/tipwin.h b/Externals/wxWidgets3/include/wx/tipwin.h index 94ec56305f..a2ca0f13e2 100644 --- a/Externals/wxWidgets3/include/wx/tipwin.h +++ b/Externals/wxWidgets3/include/wx/tipwin.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 10.09.00 -// RCS-ID: $Id: tipwin.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/tls.h b/Externals/wxWidgets3/include/wx/tls.h index 0dfa87d2c5..6a4ee03786 100644 --- a/Externals/wxWidgets3/include/wx/tls.h +++ b/Externals/wxWidgets3/include/wx/tls.h @@ -3,7 +3,6 @@ // Purpose: Implementation of thread local storage // Author: Vadim Zeitlin // Created: 2008-08-08 -// RCS-ID: $Id: tls.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -22,10 +21,13 @@ #if !wxUSE_THREADS #define wxHAS_COMPILER_TLS #define wxTHREAD_SPECIFIC_DECL +// otherwise try to find the compiler-specific way to handle TLS unless +// explicitly disabled by setting wxUSE_COMPILER_TLS to 0 (it is 1 by default). +#elif wxUSE_COMPILER_TLS // __thread keyword is not supported correctly by MinGW, at least in some // configurations, see http://sourceforge.net/support/tracker.php?aid=2837047 // and when in doubt we prefer to not use it at all. -#elif defined(HAVE___THREAD_KEYWORD) && !defined(__MINGW32__) +#if defined(HAVE___THREAD_KEYWORD) && !defined(__MINGW32__) #define wxHAS_COMPILER_TLS #define wxTHREAD_SPECIFIC_DECL __thread // MSVC has its own version which might be supported by some other Windows @@ -33,7 +35,8 @@ #elif wxCHECK_VISUALC_VERSION(7) #define wxHAS_COMPILER_TLS #define wxTHREAD_SPECIFIC_DECL __declspec(thread) -#endif +#endif // compilers +#endif // wxUSE_COMPILER_TLS // ---------------------------------------------------------------------------- // define wxTLS_TYPE() diff --git a/Externals/wxWidgets3/include/wx/tokenzr.h b/Externals/wxWidgets3/include/wx/tokenzr.h index 9243bc3cb8..2eb6519709 100644 --- a/Externals/wxWidgets3/include/wx/tokenzr.h +++ b/Externals/wxWidgets3/include/wx/tokenzr.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: (or rather rewritten by) Vadim Zeitlin // Created: 04/22/98 -// RCS-ID: $Id: tokenzr.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/toolbar.h b/Externals/wxWidgets3/include/wx/toolbar.h index 5e6298320e..49a446e777 100644 --- a/Externals/wxWidgets3/include/wx/toolbar.h +++ b/Externals/wxWidgets3/include/wx/toolbar.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.11.99 -// RCS-ID: $Id: toolbar.h 70345 2012-01-15 01:05:28Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -60,7 +59,9 @@ enum wxTB_BOTTOM = 0x2000, // lay out toolbar at the right edge of the window - wxTB_RIGHT = 0x4000 + wxTB_RIGHT = 0x4000, + + wxTB_DEFAULT_STYLE = wxTB_HORIZONTAL | wxTB_FLAT }; #if wxUSE_TOOLBAR diff --git a/Externals/wxWidgets3/include/wx/toolbook.h b/Externals/wxWidgets3/include/wx/toolbook.h index 2efd27434e..45730cd9c4 100644 --- a/Externals/wxWidgets3/include/wx/toolbook.h +++ b/Externals/wxWidgets3/include/wx/toolbook.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2006-01-29 -// RCS-ID: $Id: toolbook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) 2006 Julian Smart // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -17,12 +16,13 @@ #if wxUSE_TOOLBOOK #include "wx/bookctrl.h" +#include "wx/containr.h" class WXDLLIMPEXP_FWD_CORE wxToolBarBase; class WXDLLIMPEXP_FWD_CORE wxCommandEvent; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOOLBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TOOLBOOK_PAGE_CHANGING, wxBookCtrlEvent ); // Use wxButtonToolBar @@ -40,7 +40,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING // wxToolbook // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxToolbook : public wxBookCtrlBase +class WXDLLIMPEXP_CORE wxToolbook : public wxNavigationEnabled { public: wxToolbook() @@ -128,16 +128,20 @@ private: // ---------------------------------------------------------------------------- // wxToolbookEvent is obsolete and defined for compatibility only -typedef wxBookCtrlEvent wxToolbookEvent; +#define wxToolbookEvent wxBookCtrlEvent typedef wxBookCtrlEventFunction wxToolbookEventFunction; #define wxToolbookEventHandler(func) wxBookCtrlEventHandler(func) #define EVT_TOOLBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TOOLBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) #define EVT_TOOLBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TOOLBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED wxEVT_TOOLBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING wxEVT_TOOLBOOK_PAGE_CHANGING #endif // wxUSE_TOOLBOOK diff --git a/Externals/wxWidgets3/include/wx/tooltip.h b/Externals/wxWidgets3/include/wx/tooltip.h index b8a1da9c86..0948e65eff 100644 --- a/Externals/wxWidgets3/include/wx/tooltip.h +++ b/Externals/wxWidgets3/include/wx/tooltip.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Robert Roebling -// RCS-ID: $Id: tooltip.h 67254 2011-03-20 00:14:35Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/toplevel.h b/Externals/wxWidgets3/include/wx/toplevel.h index bf1049350c..b36b30e6cf 100644 --- a/Externals/wxWidgets3/include/wx/toplevel.h +++ b/Externals/wxWidgets3/include/wx/toplevel.h @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin, Vaclav Slavik // Modified by: // Created: 06.08.01 -// RCS-ID: $Id: toplevel.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Vaclav Slavik // Licence: wxWindows licence @@ -20,7 +19,6 @@ #include "wx/nonownedwnd.h" #include "wx/iconbndl.h" -#include "wx/containr.h" #include "wx/weakref.h" // the default names for various classes @@ -157,8 +155,7 @@ enum // wxTopLevelWindow: a top level (as opposed to child) window // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxTopLevelWindowBase : - public wxNavigationEnabled +class WXDLLIMPEXP_CORE wxTopLevelWindowBase : public wxNonOwnedWindow { public: // construction @@ -224,7 +221,9 @@ public: virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); // Is this the active frame (highlighted in the taskbar)? - virtual bool IsActive() { return wxGetTopLevelParent(FindFocus()) == this; } + // + // A TLW is active only if it contains the currently focused window. + virtual bool IsActive() { return IsDescendant(FindFocus()); } // this function may be overridden to return false to allow closing the // application even when this top level window is still open @@ -270,7 +269,6 @@ public: wxWindow *SetTmpDefaultItem(wxWindow *win) { wxWindow *old = GetDefaultItem(); m_winTmpDefault = win; return old; } - // implementation only from now on // ------------------------------- @@ -303,6 +301,13 @@ public: virtual void SetRepresentedFilename(const wxString& WXUNUSED(filename)) { } +#if wxUSE_MENUS || wxUSE_TOOLBAR + // show help text for the currently selected menu or toolbar item + // (typically in the status bar) or hide it and restore the status bar text + // originally shown before the menu was opened if show == false + virtual void DoGiveHelp(const wxString& WXUNUSED(text), bool WXUNUSED(show)) {} +#endif + protected: // the frame client to screen translation should take account of the // toolbar which may shift the origin of the client area diff --git a/Externals/wxWidgets3/include/wx/tracker.h b/Externals/wxWidgets3/include/wx/tracker.h index 94afcab73f..d8f272822c 100644 --- a/Externals/wxWidgets3/include/wx/tracker.h +++ b/Externals/wxWidgets3/include/wx/tracker.h @@ -3,7 +3,6 @@ // Purpose: Support class for object lifetime tracking (wxWeakRef) // Author: Arne Steinarson // Created: 28 Dec 07 -// RCS-ID: $Id: tracker.h 51448 2008-01-29 17:41:10Z RD $ // Copyright: (c) 2007 Arne Steinarson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/translation.h b/Externals/wxWidgets3/include/wx/translation.h index 1320e75953..187caf366b 100644 --- a/Externals/wxWidgets3/include/wx/translation.h +++ b/Externals/wxWidgets3/include/wx/translation.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Vaclav Slavik, // Michael N. Filippov // Created: 2010-04-23 -// RCS-ID: $Id: translation.h 64597 2010-06-16 14:09:32Z VS $ // Copyright: (c) 1998 Vadim Zeitlin // (c) 2010 Vaclav Slavik // Licence: wxWindows licence @@ -132,6 +131,11 @@ public: // get languages available for this app wxArrayString GetAvailableTranslations(const wxString& domain) const; + // find best translation language for given domain + wxString GetBestTranslation(const wxString& domain, wxLanguage msgIdLanguage); + wxString GetBestTranslation(const wxString& domain, + const wxString& msgIdLanguage = "en"); + // add standard wxWidgets catalog ("wxstd") bool AddStdCatalog(); @@ -149,12 +153,11 @@ public: bool IsLoaded(const wxString& domain) const; // access to translations - const wxString& GetString(const wxString& origString, - const wxString& domain = wxEmptyString) const; - const wxString& GetString(const wxString& origString, - const wxString& origString2, - unsigned n, - const wxString& domain = wxEmptyString) const; + const wxString *GetTranslatedString(const wxString& origString, + const wxString& domain = wxEmptyString) const; + const wxString *GetTranslatedString(const wxString& origString, + unsigned n, + const wxString& domain = wxEmptyString) const; wxString GetHeaderValue(const wxString& header, const wxString& domain = wxEmptyString) const; @@ -166,11 +169,7 @@ public: private: // perform loading of the catalog via m_loader - bool LoadCatalog(const wxString& domain, const wxString& lang); - - // find best translation for given domain - wxString ChooseLanguageForDomain(const wxString& domain, - const wxString& msgIdLang); + bool LoadCatalog(const wxString& domain, const wxString& lang, const wxString& msgIdLang); // find catalog by name in a linked list, return NULL if !found wxMsgCatalog *FindCatalog(const wxString& domain) const; @@ -242,11 +241,13 @@ protected: // get the translation of the string in the current locale inline const wxString& wxGetTranslation(const wxString& str, - const wxString& domain = wxEmptyString) + const wxString& domain = wxString()) { wxTranslations *trans = wxTranslations::Get(); - if ( trans ) - return trans->GetString(str, domain); + const wxString *transStr = trans ? trans->GetTranslatedString(str, domain) + : NULL; + if ( transStr ) + return *transStr; else // NB: this function returns reference to a string, so we have to keep // a copy of it somewhere @@ -256,11 +257,13 @@ inline const wxString& wxGetTranslation(const wxString& str, inline const wxString& wxGetTranslation(const wxString& str1, const wxString& str2, unsigned n, - const wxString& domain = wxEmptyString) + const wxString& domain = wxString()) { wxTranslations *trans = wxTranslations::Get(); - if ( trans ) - return trans->GetString(str1, str2, n, domain); + const wxString *transStr = trans ? trans->GetTranslatedString(str1, n, domain) + : NULL; + if ( transStr ) + return *transStr; else // NB: this function returns reference to a string, so we have to keep // a copy of it somewhere diff --git a/Externals/wxWidgets3/include/wx/treebase.h b/Externals/wxWidgets3/include/wx/treebase.h index dc03d28f88..4efbf05074 100644 --- a/Externals/wxWidgets3/include/wx/treebase.h +++ b/Externals/wxWidgets3/include/wx/treebase.h @@ -4,7 +4,6 @@ // Author: Julian Smart et al // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: treebase.h 68812 2011-08-21 14:08:56Z VZ $ // Copyright: (c) 1997,1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -257,21 +256,21 @@ public: // accessors // get the item on which the operation was performed or the newly - // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events + // selected item for wxEVT_TREE_SEL_CHANGED/ING events wxTreeItemId GetItem() const { return m_item; } void SetItem(const wxTreeItemId& item) { m_item = item; } - // for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events, get the previously + // for wxEVT_TREE_SEL_CHANGED/ING events, get the previously // selected item wxTreeItemId GetOldItem() const { return m_itemOld; } void SetOldItem(const wxTreeItemId& item) { m_itemOld = item; } // the point where the mouse was when the drag operation started (for - // wxEVT_COMMAND_TREE_BEGIN_(R)DRAG events only) or click position + // wxEVT_TREE_BEGIN_(R)DRAG events only) or click position wxPoint GetPoint() const { return m_pointDrag; } void SetPoint(const wxPoint& pt) { m_pointDrag = pt; } - // keyboard data (for wxEVT_COMMAND_TREE_KEY_DOWN only) + // keyboard data (for wxEVT_TREE_KEY_DOWN only) const wxKeyEvent& GetKeyEvent() const { return m_evtKey; } int GetKeyCode() const { return m_evtKey.GetKeyCode(); } void SetKeyEvent(const wxKeyEvent& evt) { m_evtKey = evt; } @@ -309,33 +308,33 @@ typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); // tree control events and macros for handling them // ---------------------------------------------------------------------------- -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_BEGIN_RDRAG, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_GET_INFO, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_SET_INFO, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_EXPANDING, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_COLLAPSING, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_KEY_DOWN, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_END_DRAG, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, wxTreeEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_DRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_RDRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_BEGIN_LABEL_EDIT, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_END_LABEL_EDIT, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_DELETE_ITEM, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_GET_INFO, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SET_INFO, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_EXPANDED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_EXPANDING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_COLLAPSED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_COLLAPSING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SEL_CHANGED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_SEL_CHANGING, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_KEY_DOWN, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_ACTIVATED, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_RIGHT_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_MIDDLE_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_END_DRAG, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_STATE_IMAGE_CLICK, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_GETTOOLTIP, wxTreeEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREE_ITEM_MENU, wxTreeEvent ); #define wxTreeEventHandler(func) \ wxEVENT_HANDLER_CAST(wxTreeEventFunction, func) #define wx__DECLARE_TREEEVT(evt, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREE_ ## evt, id, wxTreeEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREE_ ## evt, id, wxTreeEventHandler(fn)) // GetItem() returns the item being dragged, GetPoint() the mouse coords // @@ -396,6 +395,29 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREE_ITEM_MENU, wxTree // GetItem() is the item for which the tooltip is being requested #define EVT_TREE_ITEM_GETTOOLTIP(id, fn) wx__DECLARE_TREEEVT(ITEM_GETTOOLTIP, id, fn) +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREE_BEGIN_DRAG wxEVT_TREE_BEGIN_DRAG +#define wxEVT_COMMAND_TREE_BEGIN_RDRAG wxEVT_TREE_BEGIN_RDRAG +#define wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT wxEVT_TREE_BEGIN_LABEL_EDIT +#define wxEVT_COMMAND_TREE_END_LABEL_EDIT wxEVT_TREE_END_LABEL_EDIT +#define wxEVT_COMMAND_TREE_DELETE_ITEM wxEVT_TREE_DELETE_ITEM +#define wxEVT_COMMAND_TREE_GET_INFO wxEVT_TREE_GET_INFO +#define wxEVT_COMMAND_TREE_SET_INFO wxEVT_TREE_SET_INFO +#define wxEVT_COMMAND_TREE_ITEM_EXPANDED wxEVT_TREE_ITEM_EXPANDED +#define wxEVT_COMMAND_TREE_ITEM_EXPANDING wxEVT_TREE_ITEM_EXPANDING +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSED wxEVT_TREE_ITEM_COLLAPSED +#define wxEVT_COMMAND_TREE_ITEM_COLLAPSING wxEVT_TREE_ITEM_COLLAPSING +#define wxEVT_COMMAND_TREE_SEL_CHANGED wxEVT_TREE_SEL_CHANGED +#define wxEVT_COMMAND_TREE_SEL_CHANGING wxEVT_TREE_SEL_CHANGING +#define wxEVT_COMMAND_TREE_KEY_DOWN wxEVT_TREE_KEY_DOWN +#define wxEVT_COMMAND_TREE_ITEM_ACTIVATED wxEVT_TREE_ITEM_ACTIVATED +#define wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK wxEVT_TREE_ITEM_RIGHT_CLICK +#define wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK wxEVT_TREE_ITEM_MIDDLE_CLICK +#define wxEVT_COMMAND_TREE_END_DRAG wxEVT_TREE_END_DRAG +#define wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK wxEVT_TREE_STATE_IMAGE_CLICK +#define wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP wxEVT_TREE_ITEM_GETTOOLTIP +#define wxEVT_COMMAND_TREE_ITEM_MENU wxEVT_TREE_ITEM_MENU + #endif // wxUSE_TREECTRL #endif // _WX_TREEBASE_H_ diff --git a/Externals/wxWidgets3/include/wx/treebook.h b/Externals/wxWidgets3/include/wx/treebook.h index 86bdf0b0da..bd59338952 100644 --- a/Externals/wxWidgets3/include/wx/treebook.h +++ b/Externals/wxWidgets3/include/wx/treebook.h @@ -4,7 +4,6 @@ // Author: Evgeniy Tarassov, Vadim Zeitlin // Modified by: // Created: 2005-09-15 -// RCS-ID: $Id: treebook.h 68810 2011-08-21 14:08:49Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -17,6 +16,7 @@ #if wxUSE_TREEBOOK #include "wx/bookctrl.h" +#include "wx/containr.h" #include "wx/treectrl.h" // for wxArrayTreeItemIds typedef wxWindow wxTreebookPage; @@ -27,7 +27,7 @@ class WXDLLIMPEXP_FWD_CORE wxTreeEvent; // wxTreebook // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxTreebook : public wxBookCtrlBase +class WXDLLIMPEXP_CORE wxTreebook : public wxNavigationEnabled { public: // Constructors and such @@ -229,27 +229,33 @@ private: // ---------------------------------------------------------------------------- // wxTreebookEvent is obsolete and defined for compatibility only -typedef wxBookCtrlEvent wxTreebookEvent; +#define wxTreebookEvent wxBookCtrlEvent typedef wxBookCtrlEventFunction wxTreebookEventFunction; #define wxTreebookEventHandler(func) wxBookCtrlEventHandler(func) -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED, wxBookCtrlEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_COLLAPSED, wxBookCtrlEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_EXPANDED, wxBookCtrlEvent ); #define EVT_TREEBOOK_PAGE_CHANGED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) #define EVT_TREEBOOK_PAGE_CHANGING(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) #define EVT_TREEBOOK_NODE_COLLAPSED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_COLLAPSED, winid, wxBookCtrlEventHandler(fn)) #define EVT_TREEBOOK_NODE_EXPANDED(winid, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED, winid, wxBookCtrlEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_EXPANDED, winid, wxBookCtrlEventHandler(fn)) + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED wxEVT_TREEBOOK_PAGE_CHANGED +#define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING wxEVT_TREEBOOK_PAGE_CHANGING +#define wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED wxEVT_TREEBOOK_NODE_COLLAPSED +#define wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED wxEVT_TREEBOOK_NODE_EXPANDED #endif // wxUSE_TREEBOOK diff --git a/Externals/wxWidgets3/include/wx/treectrl.h b/Externals/wxWidgets3/include/wx/treectrl.h index feefbd7638..89493c3bbb 100644 --- a/Externals/wxWidgets3/include/wx/treectrl.h +++ b/Externals/wxWidgets3/include/wx/treectrl.h @@ -5,7 +5,6 @@ // Modified by: // Created: // Copyright: (c) Karsten Ballueder -// RCS-ID: $Id: treectrl.h 70345 2012-01-15 01:05:28Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -289,10 +288,10 @@ public: // delete this item and associated data if any virtual void Delete(const wxTreeItemId& item) = 0; // delete all children (but don't delete the item itself) - // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events + // NB: this won't send wxEVT_TREE_ITEM_DELETED events virtual void DeleteChildren(const wxTreeItemId& item) = 0; // delete all items from the tree - // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events + // NB: this won't send wxEVT_TREE_ITEM_DELETED events virtual void DeleteAllItems() = 0; // expand this item @@ -349,6 +348,10 @@ public: virtual void EndEditLabel(const wxTreeItemId& item, bool discardChanges = false) = 0; + // Enable or disable beep when incremental match doesn't find any item. + // Only implemented in the generic version currently. + virtual void EnableBellOnNoMatch(bool WXUNUSED(on) = true) { } + // sorting // ------- diff --git a/Externals/wxWidgets3/include/wx/treelist.h b/Externals/wxWidgets3/include/wx/treelist.h index bb4f3b0f11..d06e35e869 100644 --- a/Externals/wxWidgets3/include/wx/treelist.h +++ b/Externals/wxWidgets3/include/wx/treelist.h @@ -3,7 +3,6 @@ // Purpose: wxTreeListCtrl class declaration. // Author: Vadim Zeitlin // Created: 2011-08-17 -// RCS-ID: $Id: treelist.h 69619 2011-10-31 19:41:06Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -47,6 +46,7 @@ enum wxTL_CHECKBOX = 0x0002, // Show checkboxes in the first column. wxTL_3STATE = 0x0004, // Allow 3rd state in checkboxes. wxTL_USER_3STATE = 0x0008, // Allow user to set 3rd state. + wxTL_NO_HEADER = 0x0010, // Column titles not visible. wxTL_DEFAULT_STYLE = wxTL_SINGLE, wxTL_STYLE_MASK = wxTL_SINGLE | @@ -453,7 +453,7 @@ private: // wxTreeListEvent: event generated by wxTreeListCtrl. // ---------------------------------------------------------------------------- -class wxTreeListEvent : public wxNotifyEvent +class WXDLLIMPEXP_ADV wxTreeListEvent : public wxNotifyEvent { public: // Default ctor is provided for wxRTTI needs only but should never be used. @@ -514,7 +514,7 @@ private: friend class wxTreeListCtrl; - wxDECLARE_DYNAMIC_CLASS(wxTreeListEvent); + wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTreeListEvent); }; // Event types and event table macros. @@ -525,11 +525,11 @@ typedef void (wxEvtHandler::*wxTreeListEventFunction)(wxTreeListEvent&); wxEVENT_HANDLER_CAST(wxTreeListEventFunction, func) #define wxEVT_TREELIST_GENERIC(name, id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_TREELIST_##name, id, wxTreeListEventHandler(fn)) + wx__DECLARE_EVT1(wxEVT_TREELIST_##name, id, wxTreeListEventHandler(fn)) #define wxDECLARE_TREELIST_EVENT(name) \ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, \ - wxEVT_COMMAND_TREELIST_##name, \ + wxEVT_TREELIST_##name, \ wxTreeListEvent) wxDECLARE_TREELIST_EVENT(SELECTION_CHANGED); @@ -562,6 +562,15 @@ wxDECLARE_TREELIST_EVENT(COLUMN_SORTED); #undef wxDECLARE_TREELIST_EVENT +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_TREELIST_SELECTION_CHANGED wxEVT_TREELIST_SELECTION_CHANGED +#define wxEVT_COMMAND_TREELIST_ITEM_EXPANDING wxEVT_TREELIST_ITEM_EXPANDING +#define wxEVT_COMMAND_TREELIST_ITEM_EXPANDED wxEVT_TREELIST_ITEM_EXPANDED +#define wxEVT_COMMAND_TREELIST_ITEM_CHECKED wxEVT_TREELIST_ITEM_CHECKED +#define wxEVT_COMMAND_TREELIST_ITEM_ACTIVATED wxEVT_TREELIST_ITEM_ACTIVATED +#define wxEVT_COMMAND_TREELIST_ITEM_CONTEXT_MENU wxEVT_TREELIST_ITEM_CONTEXT_MENU +#define wxEVT_COMMAND_TREELIST_COLUMN_SORTED wxEVT_TREELIST_COLUMN_SORTED + #endif // wxUSE_TREELISTCTRL #endif // _WX_TREELIST_H_ diff --git a/Externals/wxWidgets3/include/wx/txtstrm.h b/Externals/wxWidgets3/include/wx/txtstrm.h index c7376c818e..90e6bbb22a 100644 --- a/Externals/wxWidgets3/include/wx/txtstrm.h +++ b/Externals/wxWidgets3/include/wx/txtstrm.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 28/06/1998 -// RCS-ID: $Id: txtstrm.h 67286 2011-03-22 17:15:45Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/typeinfo.h b/Externals/wxWidgets3/include/wx/typeinfo.h index 3eac14c2dc..a783af5d56 100644 --- a/Externals/wxWidgets3/include/wx/typeinfo.h +++ b/Externals/wxWidgets3/include/wx/typeinfo.h @@ -3,7 +3,6 @@ // Purpose: wxTypeId implementation // Author: Jaakko Salli // Created: 2009-11-19 -// RCS-ID: $Id: typeinfo.h 66734 2011-01-23 10:13:49Z JMS $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/types.h b/Externals/wxWidgets3/include/wx/types.h index 5be184cfe6..2e58582168 100644 --- a/Externals/wxWidgets3/include/wx/types.h +++ b/Externals/wxWidgets3/include/wx/types.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: types.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/uiaction.h b/Externals/wxWidgets3/include/wx/uiaction.h index af2b162c49..fb96523544 100644 --- a/Externals/wxWidgets3/include/wx/uiaction.h +++ b/Externals/wxWidgets3/include/wx/uiaction.h @@ -4,7 +4,6 @@ // Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin // Modified by: // Created: 2010-03-06 -// RCS-ID: $Id: uiaction.h 69762 2011-11-15 15:56:55Z VZ $ // Copyright: (c) Kevin Ollivier // (c) 2010 Steven Lamerton // (c) 2010 Vadim Zeitlin @@ -45,7 +44,9 @@ public: bool MouseDblClick(int button = wxMOUSE_BTN_LEFT); bool MouseDragDrop(long x1, long y1, long x2, long y2, int button = wxMOUSE_BTN_LEFT); - + bool MouseDragDrop(const wxPoint& p1, const wxPoint& p2, + int button = wxMOUSE_BTN_LEFT) + { return MouseDragDrop(p1.x, p1.y, p2.x, p2.y, button); } // Keyboard simulation // ------------------- diff --git a/Externals/wxWidgets3/include/wx/unichar.h b/Externals/wxWidgets3/include/wx/unichar.h index 730152f938..a661e5a4e2 100644 --- a/Externals/wxWidgets3/include/wx/unichar.h +++ b/Externals/wxWidgets3/include/wx/unichar.h @@ -3,7 +3,6 @@ // Purpose: wxUniChar and wxUniCharRef classes // Author: Vaclav Slavik // Created: 2007-03-19 -// RCS-ID: $Id: unichar.h 62738 2009-11-28 14:37:03Z VZ $ // Copyright: (c) 2007 REA Elektronik GmbH // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -35,17 +34,10 @@ public: wxUniChar(char c) { m_value = From8bit(c); } wxUniChar(unsigned char c) { m_value = From8bit((char)c); } - // Create the character from a wchar_t character value. -#if wxWCHAR_T_IS_REAL_TYPE - wxUniChar(wchar_t c) { m_value = c; } -#endif - - wxUniChar(int c) { m_value = c; } - wxUniChar(unsigned int c) { m_value = c; } - wxUniChar(long int c) { m_value = c; } - wxUniChar(unsigned long int c) { m_value = c; } - wxUniChar(short int c) { m_value = c; } - wxUniChar(unsigned short int c) { m_value = c; } +#define wxUNICHAR_DEFINE_CTOR(type) \ + wxUniChar(type c) { m_value = (value_type)c; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_CTOR) +#undef wxUNICHAR_DEFINE_CTOR wxUniChar(const wxUniCharRef& c); @@ -94,15 +86,11 @@ public: // functions operator char() const { return To8bit(m_value); } operator unsigned char() const { return (unsigned char)To8bit(m_value); } -#if wxWCHAR_T_IS_REAL_TYPE - operator wchar_t() const { return (wchar_t)m_value; } -#endif - operator int() const { return (int)m_value; } - operator unsigned int() const { return (unsigned int)m_value; } - operator long int() const { return (long int)m_value; } - operator unsigned long int() const { return (unsigned long)m_value; } - operator short int() const { return (short int)m_value; } - operator unsigned short int() const { return (unsigned short int)m_value; } + +#define wxUNICHAR_DEFINE_OPERATOR_PAREN(type) \ + operator type() const { return (type)m_value; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_PAREN) +#undef wxUNICHAR_DEFINE_OPERATOR_PAREN // We need this operator for the "*p" part of expressions like "for ( // const_iterator p = begin() + nStart; *p; ++p )". In this case, @@ -121,34 +109,27 @@ public: wxUniChar& operator=(const wxUniCharRef& c); wxUniChar& operator=(char c) { m_value = From8bit(c); return *this; } wxUniChar& operator=(unsigned char c) { m_value = From8bit((char)c); return *this; } -#if wxWCHAR_T_IS_REAL_TYPE - wxUniChar& operator=(wchar_t c) { m_value = c; return *this; } -#endif - wxUniChar& operator=(int c) { m_value = c; return *this; } - wxUniChar& operator=(unsigned int c) { m_value = c; return *this; } - wxUniChar& operator=(long int c) { m_value = c; return *this; } - wxUniChar& operator=(unsigned long int c) { m_value = c; return *this; } - wxUniChar& operator=(short int c) { m_value = c; return *this; } - wxUniChar& operator=(unsigned short int c) { m_value = c; return *this; } + +#define wxUNICHAR_DEFINE_OPERATOR_EQUAL(type) \ + wxUniChar& operator=(type c) { m_value = (value_type)c; return *this; } + wxDO_FOR_INT_TYPES(wxUNICHAR_DEFINE_OPERATOR_EQUAL) +#undef wxUNICHAR_DEFINE_OPERATOR_EQUAL // Comparison operators: +#define wxDEFINE_UNICHAR_CMP_WITH_INT(T, op) \ + bool operator op(T c) const { return m_value op (value_type)c; } // define the given comparison operator for all the types #define wxDEFINE_UNICHAR_OPERATOR(op) \ bool operator op(const wxUniChar& c) const { return m_value op c.m_value; }\ bool operator op(char c) const { return m_value op From8bit(c); } \ bool operator op(unsigned char c) const { return m_value op From8bit((char)c); } \ - wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return m_value op (value_type)c; } ) \ - bool operator op(int c) const { return m_value op (value_type)c; } \ - bool operator op(unsigned int c) const { return m_value op (value_type)c; } \ - bool operator op(short int c) const { return m_value op (value_type)c; } \ - bool operator op(unsigned short int c) const { return m_value op (value_type)c; } \ - bool operator op(long int c) const { return m_value op (value_type)c; } \ - bool operator op(unsigned long int c) const { return m_value op (value_type)c; } + wxDO_FOR_INT_TYPES_1(wxDEFINE_UNICHAR_CMP_WITH_INT, op) wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHAR_OPERATOR) #undef wxDEFINE_UNICHAR_OPERATOR +#undef wxDEFINE_UNCHAR_CMP_WITH_INT // this is needed for expressions like 'Z'-c int operator-(const wxUniChar& c) const { return m_value - c.m_value; } @@ -243,53 +224,35 @@ public: wxUniCharRef& operator=(const wxUniCharRef& c) { if (&c != this) *this = c.UniChar(); return *this; } - wxUniCharRef& operator=(char c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(unsigned char c) { return *this = wxUniChar(c); } -#if wxWCHAR_T_IS_REAL_TYPE - wxUniCharRef& operator=(wchar_t c) { return *this = wxUniChar(c); } -#endif - wxUniCharRef& operator=(int c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(unsigned int c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(short int c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(unsigned short int c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(long int c) { return *this = wxUniChar(c); } - wxUniCharRef& operator=(unsigned long int c) { return *this = wxUniChar(c); } +#define wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL(type) \ + wxUniCharRef& operator=(type c) { return *this = wxUniChar(c); } + wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL) +#undef wxUNICHAR_REF_DEFINE_OPERATOR_EQUAL // Conversions to the same types as wxUniChar is convertible too: - operator char() const { return UniChar(); } - operator unsigned char() const { return UniChar(); } -#if wxWCHAR_T_IS_REAL_TYPE - operator wchar_t() const { return UniChar(); } -#endif - operator int() const { return UniChar(); } - operator unsigned int() const { return UniChar(); } - operator short int() const { return UniChar(); } - operator unsigned short int() const { return UniChar(); } - operator long int() const { return UniChar(); } - operator unsigned long int() const { return UniChar(); } +#define wxUNICHAR_REF_DEFINE_OPERATOR_PAREN(type) \ + operator type() const { return UniChar(); } + wxDO_FOR_CHAR_INT_TYPES(wxUNICHAR_REF_DEFINE_OPERATOR_PAREN) +#undef wxUNICHAR_REF_DEFINE_OPERATOR_PAREN // see wxUniChar::operator bool etc. for explanation operator bool() const { return (bool)UniChar(); } bool operator!() const { return !UniChar(); } bool operator&&(bool v) const { return UniChar() && v; } +#define wxDEFINE_UNICHARREF_CMP_WITH_INT(T, op) \ + bool operator op(T c) const { return UniChar() op c; } + // Comparison operators: #define wxDEFINE_UNICHARREF_OPERATOR(op) \ bool operator op(const wxUniCharRef& c) const { return UniChar() op c.UniChar(); }\ bool operator op(const wxUniChar& c) const { return UniChar() op c; } \ - bool operator op(char c) const { return UniChar() op c; } \ - bool operator op(unsigned char c) const { return UniChar() op c; } \ - wxIF_WCHAR_T_TYPE( bool operator op(wchar_t c) const { return UniChar() op c; } ) \ - bool operator op(int c) const { return UniChar() op c; } \ - bool operator op(unsigned int c) const { return UniChar() op c; } \ - bool operator op(short int c) const { return UniChar() op c; } \ - bool operator op(unsigned short int c) const { return UniChar() op c; } \ - bool operator op(long int c) const { return UniChar() op c; } \ - bool operator op(unsigned long int c) const { return UniChar() op c; } + wxDO_FOR_CHAR_INT_TYPES_1(wxDEFINE_UNICHARREF_CMP_WITH_INT, op) wxFOR_ALL_COMPARISONS(wxDEFINE_UNICHARREF_OPERATOR) #undef wxDEFINE_UNICHARREF_OPERATOR +#undef wxDEFINE_UNICHARREF_CMP_WITH_INT // for expressions like c-'A': int operator-(const wxUniCharRef& c) const { return UniChar() - c.UniChar(); } @@ -329,17 +292,13 @@ inline wxUniChar& wxUniChar::operator=(const wxUniCharRef& c) // Comparison operators for the case when wxUniChar(Ref) is the second operand // implemented in terms of member comparison functions -#define wxCMP_REVERSE(c1, c2, op) c2 op c1 +wxDEFINE_COMPARISONS_BY_REV(char, const wxUniChar&) +wxDEFINE_COMPARISONS_BY_REV(char, const wxUniCharRef&) -wxDEFINE_COMPARISONS(char, const wxUniChar&, wxCMP_REVERSE) -wxDEFINE_COMPARISONS(char, const wxUniCharRef&, wxCMP_REVERSE) +wxDEFINE_COMPARISONS_BY_REV(wchar_t, const wxUniChar&) +wxDEFINE_COMPARISONS_BY_REV(wchar_t, const wxUniCharRef&) -wxDEFINE_COMPARISONS(wchar_t, const wxUniChar&, wxCMP_REVERSE) -wxDEFINE_COMPARISONS(wchar_t, const wxUniCharRef&, wxCMP_REVERSE) - -wxDEFINE_COMPARISONS(const wxUniChar&, const wxUniCharRef&, wxCMP_REVERSE) - -#undef wxCMP_REVERSE +wxDEFINE_COMPARISONS_BY_REV(const wxUniChar&, const wxUniCharRef&) // for expressions like c-'A': inline int operator-(char c1, const wxUniCharRef& c2) { return -(c2 - c1); } diff --git a/Externals/wxWidgets3/include/wx/unix/app.h b/Externals/wxWidgets3/include/wx/unix/app.h index bcca5afb95..f14df9ec3f 100644 --- a/Externals/wxWidgets3/include/wx/unix/app.h +++ b/Externals/wxWidgets3/include/wx/unix/app.h @@ -3,7 +3,6 @@ // Purpose: wxAppConsole implementation for Unix // Author: Lukasz Michalski // Created: 28/01/2005 -// RCS-ID: $Id: app.h 56994 2008-11-28 12:47:07Z VZ $ // Copyright: (c) Lukasz Michalski // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -11,10 +10,17 @@ //Ensure that sigset_t is being defined #include +class wxFDIODispatcher; +class wxFDIOHandler; +class wxWakeUpPipe; + // wxApp subclass implementing event processing for console applications class WXDLLIMPEXP_BASE wxAppConsole : public wxAppConsoleBase { public: + wxAppConsole(); + virtual ~wxAppConsole(); + // override base class initialization virtual bool Initialize(int& argc, wxChar** argv); @@ -38,6 +44,14 @@ public: // handlers for them void CheckSignal(); + // Register the signal wake up pipe with the given dispatcher. + // + // This is used by wxExecute(wxEXEC_NOEVENTS) implementation only. + // + // The pointer to the handler used for processing events on this descriptor + // is returned so that it can be deleted when we no longer needed it. + wxFDIOHandler* RegisterSignalWakeUpPipe(wxFDIODispatcher& dispatcher); + private: // signal handler set up by SetSignalHandler() for all signals we handle, // it just adds the signal to m_signalsCaught -- the real processing is @@ -52,4 +66,8 @@ private: // the signal handlers WX_DECLARE_HASH_MAP(int, SignalHandler, wxIntegerHash, wxIntegerEqual, SignalHandlerHash); SignalHandlerHash m_signalHandlerHash; + + // pipe used for wake up signal handling: if a signal arrives while we're + // blocking for input, writing to this pipe triggers a call to our CheckSignal() + wxWakeUpPipe *m_signalWakeUpPipe; }; diff --git a/Externals/wxWidgets3/include/wx/unix/apptbase.h b/Externals/wxWidgets3/include/wx/unix/apptbase.h index a6e6021dbc..6ce6f152c3 100644 --- a/Externals/wxWidgets3/include/wx/unix/apptbase.h +++ b/Externals/wxWidgets3/include/wx/unix/apptbase.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.06.2003 -// RCS-ID: $Id: apptbase.h 61688 2009-08-17 23:02:46Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -12,9 +11,12 @@ #ifndef _WX_UNIX_APPTBASE_H_ #define _WX_UNIX_APPTBASE_H_ -struct wxEndProcessData; -struct wxExecuteData; +#include "wx/evtloop.h" +#include "wx/evtloopsrc.h" + +class wxExecuteData; class wxFDIOManager; +class wxEventLoopSourcesManagerBase; // ---------------------------------------------------------------------------- // wxAppTraits: the Unix version adds extra hooks needed by Unix code @@ -26,23 +28,13 @@ public: // wxExecute() support methods // --------------------------- - // wait for the process termination, return whatever wxExecute() must - // return + // Wait for the process termination and return its exit code or -1 on error. // - // base class implementation handles all cases except wxEXEC_SYNC without - // wxEXEC_NOEVENTS one which is implemented at the GUI level + // Notice that this is only used when execData.flags contains wxEXEC_SYNC + // and does not contain wxEXEC_NOEVENTS, i.e. when we need to really wait + // until the child process exit and dispatch the events while doing it. virtual int WaitForChild(wxExecuteData& execData); - // integrate the monitoring of the given fd with the port-specific event - // loop: when this fd, which corresponds to a dummy pipe opened between the - // parent and child processes, is closed by the child, the parent is - // notified about this via a call to wxHandleProcessTermination() function - // - // the default implementation uses wxFDIODispatcher and so is suitable for - // the console applications or ports which don't have any specific event - // loop - virtual int AddProcessCallback(wxEndProcessData *data, int fd); - #if wxUSE_SOCKETS // return a pointer to the object which should be used to integrate // monitoring of the file descriptors to the event loop (currently this is @@ -56,11 +48,19 @@ public: virtual wxFDIOManager *GetFDIOManager(); #endif // wxUSE_SOCKETS +#if wxUSE_CONSOLE_EVENTLOOP + // Return a non-NULL pointer to the object responsible for managing the + // event loop sources in this kind of application. + virtual wxEventLoopSourcesManagerBase* GetEventLoopSourcesManager(); +#endif // wxUSE_CONSOLE_EVENTLOOP + protected: - // a helper for the implementation of WaitForChild() in wxGUIAppTraits: - // checks the streams used for redirected IO in execData and returns true - // if there is any activity in them - bool CheckForRedirectedIO(wxExecuteData& execData); + // Wait for the process termination by running the given event loop until + // this happens. + // + // This is used by the public WaitForChild() after creating the event loop + // of the appropriate kind. + int RunLoopUntilChildExit(wxExecuteData& execData, wxEventLoopBase& loop); }; #endif // _WX_UNIX_APPTBASE_H_ diff --git a/Externals/wxWidgets3/include/wx/unix/apptrait.h b/Externals/wxWidgets3/include/wx/unix/apptrait.h index 533b771f6a..3fbe4d82da 100644 --- a/Externals/wxWidgets3/include/wx/unix/apptrait.h +++ b/Externals/wxWidgets3/include/wx/unix/apptrait.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.06.2003 -// RCS-ID: $Id: apptrait.h 61688 2009-08-17 23:02:46Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -51,9 +50,6 @@ class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase public: virtual wxEventLoopBase *CreateEventLoop(); virtual int WaitForChild(wxExecuteData& execData); -#ifdef wxHAS_GUI_PROCESS_CALLBACKS - virtual int AddProcessCallback(wxEndProcessData *data, int fd); -#endif #if wxUSE_TIMER virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer); #endif @@ -67,10 +63,6 @@ public: #endif virtual wxPortId GetToolkitVersion(int *majVer = NULL, int *minVer = NULL) const; -#if defined(__WXGTK__) && wxUSE_INTL - virtual void SetLocale(); -#endif // __WXGTK__ - #ifdef __WXGTK20__ virtual wxString GetDesktopEnvironment() const; virtual wxString GetStandardCmdLineOptions(wxArrayString& names, @@ -92,6 +84,8 @@ public: #endif #endif // wxUSE_SOCKETS + + virtual wxEventLoopSourcesManagerBase* GetEventLoopSourcesManager(); }; #endif // wxUSE_GUI diff --git a/Externals/wxWidgets3/include/wx/unix/chkconf.h b/Externals/wxWidgets3/include/wx/unix/chkconf.h index c6b9133701..b8a1904133 100644 --- a/Externals/wxWidgets3/include/wx/unix/chkconf.h +++ b/Externals/wxWidgets3/include/wx/unix/chkconf.h @@ -3,7 +3,6 @@ * Purpose: Unix-specific config settings consistency checks * Author: Vadim Zeitlin * Created: 2007-07-14 - * RCS-ID: $Id: chkconf.h 63306 2010-01-29 13:07:26Z VZ $ * Copyright: (c) 2007 Vadim Zeitlin * Licence: wxWindows licence */ diff --git a/Externals/wxWidgets3/include/wx/unix/evtloop.h b/Externals/wxWidgets3/include/wx/unix/evtloop.h index 68921913d0..2b91c72375 100644 --- a/Externals/wxWidgets3/include/wx/unix/evtloop.h +++ b/Externals/wxWidgets3/include/wx/unix/evtloop.h @@ -3,7 +3,6 @@ // Purpose: declares wxEventLoop class // Author: Lukasz Michalski (lm@zork.pl) // Created: 2007-05-07 -// RCS-ID: $Id: evtloop.h 65680 2010-09-30 11:44:45Z VZ $ // Copyright: (c) 2007 Lukasz Michalski // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -17,13 +16,9 @@ // wxConsoleEventLoop // ---------------------------------------------------------------------------- +class wxEventLoopSource; class wxFDIODispatcher; -class wxUnixEventLoopSource; - -namespace wxPrivate -{ - class PipeIOHandler; -} +class wxWakeUpPipeMT; class WXDLLIMPEXP_BASE wxConsoleEventLoop #ifdef __WXOSX__ @@ -45,18 +40,16 @@ public: virtual bool IsOk() const { return m_dispatcher != NULL; } virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; } -#if wxUSE_EVENTLOOP_SOURCE - virtual wxEventLoopSource * - AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); -#endif // wxUSE_EVENTLOOP_SOURCE - protected: virtual void OnNextIteration(); private: // pipe used for wake up messages: when a child thread wants to wake up // the event loop in the main thread it writes to this pipe - wxPrivate::PipeIOHandler *m_wakeupPipe; + wxWakeUpPipeMT *m_wakeupPipe; + + // the event loop source used to monitor this pipe + wxEventLoopSource* m_wakeupSource; // either wxSelectDispatcher or wxEpollDispatcher wxFDIODispatcher *m_dispatcher; diff --git a/Externals/wxWidgets3/include/wx/unix/evtloopsrc.h b/Externals/wxWidgets3/include/wx/unix/evtloopsrc.h index 47b58a7ffc..4c2cfec167 100644 --- a/Externals/wxWidgets3/include/wx/unix/evtloopsrc.h +++ b/Externals/wxWidgets3/include/wx/unix/evtloopsrc.h @@ -3,7 +3,6 @@ // Purpose: wxUnixEventLoopSource class // Author: Vadim Zeitlin // Created: 2009-10-21 -// RCS-ID: $Id: evtloopsrc.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/execute.h b/Externals/wxWidgets3/include/wx/unix/execute.h index c27ec3ba76..9756c00a7d 100644 --- a/Externals/wxWidgets3/include/wx/unix/execute.h +++ b/Externals/wxWidgets3/include/wx/unix/execute.h @@ -2,65 +2,56 @@ // Name: wx/unix/execute.h // Purpose: private details of wxExecute() implementation // Author: Vadim Zeitlin -// Id: $Id: execute.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Robert Roebling, Julian Smart, Vadim Zeitlin +// (c) 2013 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_UNIX_EXECUTE_H #define _WX_UNIX_EXECUTE_H -#include "wx/unix/pipe.h" +#include "wx/app.h" +#include "wx/hashmap.h" +#include "wx/process.h" -class WXDLLIMPEXP_FWD_BASE wxProcess; -class wxStreamTempInputBuffer; +#if wxUSE_STREAMS + #include "wx/unix/pipe.h" + #include "wx/private/streamtempinput.h" +#endif -struct wxEndProcessData -{ - wxEndProcessData() - { - pid = - tag = - exitcode = -1; - process = NULL; - async = false; - } - - int pid; // pid of the process - int tag; // port dependent value - wxProcess *process; // if !NULL: notified on process termination - int exitcode; // the exit code - bool async; // if true, delete us on process termination -}; - -// struct in which information is passed from wxExecute() to wxAppTraits -// methods -struct wxExecuteData +class wxEventLoopBase; + +// Information associated with a running child process. +class wxExecuteData { +public: wxExecuteData() { flags = pid = 0; + exitcode = -1; process = NULL; -#if wxUSE_STREAMS - bufOut = - bufErr = NULL; + syncEventLoop = NULL; +#if wxUSE_STREAMS fdOut = fdErr = wxPipe::INVALID_FD; #endif // wxUSE_STREAMS } - // get the FD corresponding to the read end of the process end detection - // pipe and close the write one - int GetEndProcReadFD() - { - const int fd = pipeEndProcDetect.Detach(wxPipe::Read); - pipeEndProcDetect.Close(); - return fd; - } + // This must be called in the parent process as soon as fork() returns to + // update us with the effective child PID. It also ensures that we handle + // SIGCHLD to be able to detect when this PID exits, so wxTheApp must be + // available. + void OnStart(int pid); + + // Called when the child process exits. + void OnExit(int exitcode); + + // Return true if we should (or already did) redirect the child IO. + bool IsRedirected() const { return process && process->IsRedirected(); } // wxExecute() flags @@ -69,26 +60,43 @@ struct wxExecuteData // the pid of the child process int pid; + // The exit code of the process, set once the child terminates. + int exitcode; + // the associated process object or NULL wxProcess *process; - // pipe used for end process detection - wxPipe pipeEndProcDetect; + // Local event loop used to wait for the child process termination in + // synchronous execution case. We can't create it ourselves as its exact + // type depends on the application kind (console/GUI), so we rely on + // wxAppTraits setting up this pointer to point to the appropriate object. + wxEventLoopBase *syncEventLoop; #if wxUSE_STREAMS // the input buffer bufOut is connected to stdout, this is why it is // called bufOut and not bufIn - wxStreamTempInputBuffer *bufOut, - *bufErr; + wxStreamTempInputBuffer bufOut, + bufErr; // the corresponding FDs, -1 if not redirected int fdOut, fdErr; #endif // wxUSE_STREAMS + + +private: + // SIGCHLD signal handler that checks whether any of the currently running + // children have exited. + static void OnSomeChildExited(int sig); + + // All currently running child processes indexed by their PID. + // + // Notice that the container doesn't own its elements. + WX_DECLARE_HASH_MAP(int, wxExecuteData*, wxIntegerHash, wxIntegerEqual, + ChildProcessesData); + static ChildProcessesData ms_childProcesses; + + wxDECLARE_NO_COPY_CLASS(wxExecuteData); }; -// this function is called when the process terminates from port specific -// callback function and is common to all ports (src/unix/utilsunx.cpp) -extern WXDLLIMPEXP_BASE void wxHandleProcessTermination(wxEndProcessData *proc_data); - #endif // _WX_UNIX_EXECUTE_H diff --git a/Externals/wxWidgets3/include/wx/unix/fontutil.h b/Externals/wxWidgets3/include/wx/unix/fontutil.h index 503502f50e..64cb3a3ccd 100644 --- a/Externals/wxWidgets3/include/wx/unix/fontutil.h +++ b/Externals/wxWidgets3/include/wx/unix/fontutil.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05.11.99 -// RCS-ID: $Id: fontutil.h 58227 2009-01-19 13:55:27Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/fswatcher_inotify.h b/Externals/wxWidgets3/include/wx/unix/fswatcher_inotify.h index 49a6381b99..1881966053 100644 --- a/Externals/wxWidgets3/include/wx/unix/fswatcher_inotify.h +++ b/Externals/wxWidgets3/include/wx/unix/fswatcher_inotify.h @@ -3,7 +3,6 @@ // Purpose: wxInotifyFileSystemWatcher // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_inotify.h 62474 2009-10-22 11:35:43Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,8 @@ public: virtual ~wxInotifyFileSystemWatcher(); + void OnDirDeleted(const wxString& path); + protected: bool Init(); }; diff --git a/Externals/wxWidgets3/include/wx/unix/fswatcher_kqueue.h b/Externals/wxWidgets3/include/wx/unix/fswatcher_kqueue.h index 303922db94..a324eb7efd 100644 --- a/Externals/wxWidgets3/include/wx/unix/fswatcher_kqueue.h +++ b/Externals/wxWidgets3/include/wx/unix/fswatcher_kqueue.h @@ -3,7 +3,6 @@ // Purpose: wxKqueueFileSystemWatcher // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_kqueue.h 62474 2009-10-22 11:35:43Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/glx11.h b/Externals/wxWidgets3/include/wx/unix/glx11.h index 66e945fa3c..34ed4dd46d 100644 --- a/Externals/wxWidgets3/include/wx/unix/glx11.h +++ b/Externals/wxWidgets3/include/wx/unix/glx11.h @@ -3,7 +3,6 @@ // Purpose: class common for all X11-based wxGLCanvas implementations // Author: Vadim Zeitlin // Created: 2007-04-15 -// RCS-ID: $Id: glx11.h 54022 2008-06-08 00:12:12Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/joystick.h b/Externals/wxWidgets3/include/wx/unix/joystick.h index 498e36a4c5..ef7a5db223 100644 --- a/Externals/wxWidgets3/include/wx/unix/joystick.h +++ b/Externals/wxWidgets3/include/wx/unix/joystick.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: joystick.h 50443 2007-12-03 02:55:14Z PC $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/mimetype.h b/Externals/wxWidgets3/include/wx/unix/mimetype.h index 18876579a7..df76534aa5 100644 --- a/Externals/wxWidgets3/include/wx/unix/mimetype.h +++ b/Externals/wxWidgets3/include/wx/unix/mimetype.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.09.98 -// RCS-ID: $Id: mimetype.h 62356 2009-10-09 17:39:19Z PC $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/pipe.h b/Externals/wxWidgets3/include/wx/unix/pipe.h index ae698a8f05..1bde4228a7 100644 --- a/Externals/wxWidgets3/include/wx/unix/pipe.h +++ b/Externals/wxWidgets3/include/wx/unix/pipe.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 24.06.2003 (extracted from src/unix/utilsunx.cpp) -// RCS-ID: $Id: pipe.h 66152 2010-11-14 14:04:37Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -13,6 +12,7 @@ #define _WX_UNIX_PIPE_H_ #include +#include #include "wx/log.h" #include "wx/intl.h" @@ -44,7 +44,7 @@ public: { if ( pipe(m_fds) == -1 ) { - wxLogSysError(_("Pipe creation failed")); + wxLogSysError(wxGetTranslation("Pipe creation failed")); return false; } @@ -98,41 +98,5 @@ private: int m_fds[2]; }; -#if wxUSE_STREAMS && wxUSE_FILE - -#include "wx/wfstream.h" - -// ---------------------------------------------------------------------------- -// wxPipeInputStream: stream for reading from a pipe -// ---------------------------------------------------------------------------- - -class wxPipeInputStream : public wxFileInputStream -{ -public: - wxPipeInputStream(int fd) : wxFileInputStream(fd) { } - - // return TRUE if the pipe is still opened - bool IsOpened() const { return !Eof(); } - - // return TRUE if we have anything to read, don't block - virtual bool CanRead() const; -}; - -// ---------------------------------------------------------------------------- -// wxPipeOutputStream: stream for writing to a pipe -// ---------------------------------------------------------------------------- - -class wxPipeOutputStream : public wxFileOutputStream -{ -public: - wxPipeOutputStream(int fd) : wxFileOutputStream(fd) { } - - // Override the base class version to ignore "pipe full" errors: this is - // not an error for this class. - size_t OnSysWrite(const void *buffer, size_t size); -}; - -#endif // wxUSE_STREAMS && wxUSE_FILE - #endif // _WX_UNIX_PIPE_H_ diff --git a/Externals/wxWidgets3/include/wx/unix/private.h b/Externals/wxWidgets3/include/wx/unix/private.h index de839f01f9..fafc5435db 100644 --- a/Externals/wxWidgets3/include/wx/unix/private.h +++ b/Externals/wxWidgets3/include/wx/unix/private.h @@ -3,7 +3,6 @@ // Purpose: miscellaneous private things for Unix wx ports // Author: Vadim Zeitlin // Created: 2005-09-25 -// RCS-ID: $Id: private.h 56927 2008-11-23 01:52:20Z VZ $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/epolldispatcher.h b/Externals/wxWidgets3/include/wx/unix/private/epolldispatcher.h index 79d0334559..c73411f221 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/epolldispatcher.h +++ b/Externals/wxWidgets3/include/wx/unix/private/epolldispatcher.h @@ -4,7 +4,6 @@ // Authors: Lukasz Michalski // Created: April 2007 // Copyright: (c) Lukasz Michalski -// RCS-ID: $Id: epolldispatcher.h 67254 2011-03-20 00:14:35Z DS $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/executeiohandler.h b/Externals/wxWidgets3/include/wx/unix/private/executeiohandler.h new file mode 100644 index 0000000000..2a7c2d7aa3 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/unix/private/executeiohandler.h @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/private/executeiohandler.h +// Purpose: IO handler class for the FD used by wxExecute() under Unix +// Author: Rob Bresalier, Vadim Zeitlin +// Created: 2013-01-06 +// Copyright: (c) 2013 Rob Bresalier, Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PRIVATE_EXECUTEIOHANDLER_H_ +#define _WX_UNIX_PRIVATE_EXECUTEIOHANDLER_H_ + +#include "wx/private/streamtempinput.h" + +// This class handles IO events on the pipe FD connected to the child process +// stdout/stderr and is used by wxExecute(). +// +// Currently it can derive from either wxEventLoopSourceHandler or +// wxFDIOHandler depending on the kind of dispatcher/event loop it is used +// with. In the future, when we get rid of wxFDIOHandler entirely, it will +// derive from wxEventLoopSourceHandler only. +template +class wxExecuteIOHandlerBase : public T +{ +public: + wxExecuteIOHandlerBase(int fd, wxStreamTempInputBuffer& buf) + : m_fd(fd), + m_buf(buf) + { + m_callbackDisabled = false; + } + + // Called when the associated descriptor is available for reading. + virtual void OnReadWaiting() + { + // Sync process, process all data coming at us from the pipe so that + // the pipe does not get full and cause a deadlock situation. + m_buf.Update(); + + if ( m_buf.Eof() ) + DisableCallback(); + } + + // These methods are never called as we only monitor the associated FD for + // reading, but we still must implement them as they're pure virtual in the + // base class. + virtual void OnWriteWaiting() { } + virtual void OnExceptionWaiting() { } + + // Disable any future calls to our OnReadWaiting(), can be called when + // we're sure that no more input is forthcoming. + void DisableCallback() + { + if ( !m_callbackDisabled ) + { + m_callbackDisabled = true; + + DoDisable(); + } + } + +protected: + const int m_fd; + +private: + virtual void DoDisable() = 0; + + wxStreamTempInputBuffer& m_buf; + + // If true, DisableCallback() had been already called. + bool m_callbackDisabled; + + wxDECLARE_NO_COPY_CLASS(wxExecuteIOHandlerBase); +}; + +// This is the version used with wxFDIODispatcher, which must be passed to the +// ctor in order to register this handler with it. +class wxExecuteFDIOHandler : public wxExecuteIOHandlerBase +{ +public: + wxExecuteFDIOHandler(wxFDIODispatcher& dispatcher, + int fd, + wxStreamTempInputBuffer& buf) + : wxExecuteIOHandlerBase(fd, buf), + m_dispatcher(dispatcher) + { + dispatcher.RegisterFD(fd, this, wxFDIO_INPUT); + } + + virtual ~wxExecuteFDIOHandler() + { + DisableCallback(); + } + +private: + virtual void DoDisable() + { + m_dispatcher.UnregisterFD(m_fd); + } + + wxFDIODispatcher& m_dispatcher; + + wxDECLARE_NO_COPY_CLASS(wxExecuteFDIOHandler); +}; + +// And this is the version used with an event loop. As AddSourceForFD() is +// static, we don't require passing the event loop to the ctor but an event +// loop must be running to handle our events. +class wxExecuteEventLoopSourceHandler + : public wxExecuteIOHandlerBase +{ +public: + wxExecuteEventLoopSourceHandler(int fd, wxStreamTempInputBuffer& buf) + : wxExecuteIOHandlerBase(fd, buf) + { + m_source = wxEventLoop::AddSourceForFD(fd, this, wxEVENT_SOURCE_INPUT); + } + + virtual ~wxExecuteEventLoopSourceHandler() + { + DisableCallback(); + } + +private: + virtual void DoDisable() + { + delete m_source; + m_source = NULL; + } + + wxEventLoopSource* m_source; + + wxDECLARE_NO_COPY_CLASS(wxExecuteEventLoopSourceHandler); +}; + +#endif // _WX_UNIX_PRIVATE_EXECUTEIOHANDLER_H_ diff --git a/Externals/wxWidgets3/include/wx/unix/private/fdiounix.h b/Externals/wxWidgets3/include/wx/unix/private/fdiounix.h index b4681b9ef1..2807821e19 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/fdiounix.h +++ b/Externals/wxWidgets3/include/wx/unix/private/fdiounix.h @@ -3,7 +3,6 @@ // Purpose: wxFDIOManagerUnix class used by console Unix applications // Author: Vadim Zeitlin // Created: 2009-08-17 -// RCS-ID: $Id: fdiounix.h 64140 2010-04-25 21:33:16Z FM $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/fswatcher_inotify.h b/Externals/wxWidgets3/include/wx/unix/private/fswatcher_inotify.h index b850153e69..249450eb50 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/fswatcher_inotify.h +++ b/Externals/wxWidgets3/include/wx/unix/private/fswatcher_inotify.h @@ -3,7 +3,6 @@ // Purpose: File system watcher impl classes // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_inotify.h 62475 2009-10-22 11:36:35Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/fswatcher_kqueue.h b/Externals/wxWidgets3/include/wx/unix/private/fswatcher_kqueue.h index 744277491c..de3d489a38 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/fswatcher_kqueue.h +++ b/Externals/wxWidgets3/include/wx/unix/private/fswatcher_kqueue.h @@ -3,7 +3,6 @@ // Purpose: File system watcher impl classes // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_kqueue.h 62475 2009-10-22 11:36:35Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/pipestream.h b/Externals/wxWidgets3/include/wx/unix/private/pipestream.h new file mode 100644 index 0000000000..313a271741 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/unix/private/pipestream.h @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/private/pipestream.h +// Purpose: Unix wxPipeInputStream and wxPipeOutputStream declarations +// Author: Vadim Zeitlin +// Created: 2013-06-08 (extracted from wx/unix/pipe.h) +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PRIVATE_PIPESTREAM_H_ +#define _WX_UNIX_PRIVATE_PIPESTREAM_H_ + +#include "wx/wfstream.h" + +class wxPipeInputStream : public wxFileInputStream +{ +public: + wxEXPLICIT wxPipeInputStream(int fd) : wxFileInputStream(fd) { } + + // return true if the pipe is still opened + bool IsOpened() const { return !Eof(); } + + // return true if we have anything to read, don't block + virtual bool CanRead() const; +}; + +class wxPipeOutputStream : public wxFileOutputStream +{ +public: + wxPipeOutputStream(int fd) : wxFileOutputStream(fd) { } + + // Override the base class version to ignore "pipe full" errors: this is + // not an error for this class. + size_t OnSysWrite(const void *buffer, size_t size); +}; + +#endif // _WX_UNIX_PRIVATE_PIPESTREAM_H_ diff --git a/Externals/wxWidgets3/include/wx/unix/private/sockunix.h b/Externals/wxWidgets3/include/wx/unix/private/sockunix.h index d17e06a9c2..642ef43bfa 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/sockunix.h +++ b/Externals/wxWidgets3/include/wx/unix/private/sockunix.h @@ -3,7 +3,6 @@ // Purpose: wxSocketImpl implementation for Unix systems // Authors: Guilhem Lavaux, Vadim Zeitlin // Created: April 1997 -// RCS-ID: $Id: sockunix.h 65581 2010-09-21 11:56:53Z VZ $ // Copyright: (c) 1997 Guilhem Lavaux // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/unix/private/timer.h b/Externals/wxWidgets3/include/wx/unix/private/timer.h index 764f3a9954..6275b53d91 100644 --- a/Externals/wxWidgets3/include/wx/unix/private/timer.h +++ b/Externals/wxWidgets3/include/wx/unix/private/timer.h @@ -3,7 +3,6 @@ // Purpose: wxTimer for wxBase (unix) // Author: Lukasz Michalski // Created: 15/01/2005 -// RCS-ID: $Id: timer.h 69839 2011-11-27 19:50:33Z VZ $ // Copyright: (c) Lukasz Michalski // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/private/wakeuppipe.h b/Externals/wxWidgets3/include/wx/unix/private/wakeuppipe.h new file mode 100644 index 0000000000..a601478a9f --- /dev/null +++ b/Externals/wxWidgets3/include/wx/unix/private/wakeuppipe.h @@ -0,0 +1,101 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/private/wakeuppipe.h +// Purpose: Helper class allowing to wake up the main thread. +// Author: Vadim Zeitlin +// Created: 2013-06-09 (extracted from src/unix/evtloopunix.cpp) +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ +#define _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ + +#include "wx/unix/pipe.h" +#include "wx/evtloopsrc.h" + +// ---------------------------------------------------------------------------- +// wxWakeUpPipe: allows to wake up the event loop by writing to it +// ---------------------------------------------------------------------------- + +// This class is not MT-safe, see wxWakeUpPipeMT below for a wake up pipe +// usable from other threads. + +class wxWakeUpPipe : public wxEventLoopSourceHandler +{ +public: + // Create and initialize the pipe. + // + // It's the callers responsibility to add the read end of this pipe, + // returned by GetReadFd(), to the code blocking on input. + wxWakeUpPipe(); + + // Wake up the blocking operation involving this pipe. + // + // It simply writes to the write end of the pipe. + // + // As indicated by its name, this method does no locking and so can be + // called only from the main thread. + void WakeUpNoLock(); + + // Same as WakeUp() but without locking. + + // Return the read end of the pipe. + int GetReadFd() { return m_pipe[wxPipe::Read]; } + + + // Implement wxEventLoopSourceHandler pure virtual methods + virtual void OnReadWaiting(); + virtual void OnWriteWaiting() { } + virtual void OnExceptionWaiting() { } + +private: + wxPipe m_pipe; + + // This flag is set to true after writing to the pipe and reset to false + // after reading from it in the main thread. Having it allows us to avoid + // overflowing the pipe with too many writes if the main thread can't keep + // up with reading from it. + bool m_pipeIsEmpty; +}; + +// ---------------------------------------------------------------------------- +// wxWakeUpPipeMT: thread-safe version of wxWakeUpPipe +// ---------------------------------------------------------------------------- + +// This class can be used from multiple threads, i.e. its WakeUp() can be +// called concurrently. +#if wxUSE_THREADS + +class wxWakeUpPipeMT : public wxWakeUpPipe +{ +public: + wxWakeUpPipeMT() { } + + // Thread-safe wrapper around WakeUpNoLock(): can be called from another + // thread to wake up the main one. + void WakeUp() + { + wxCriticalSectionLocker lock(m_pipeLock); + + WakeUpNoLock(); + } + + virtual void OnReadWaiting() + { + wxCriticalSectionLocker lock(m_pipeLock); + + wxWakeUpPipe::OnReadWaiting(); + } + +private: + // Protects access to m_pipeIsEmpty. + wxCriticalSection m_pipeLock; +}; + +#else // !wxUSE_THREADS + +typedef wxWakeUpPipe wxWakeUpPipeMT; + +#endif // wxUSE_THREADS/!wxUSE_THREADS + +#endif // _WX_UNIX_PRIVATE_WAKEUPPIPE_H_ diff --git a/Externals/wxWidgets3/include/wx/unix/sound.h b/Externals/wxWidgets3/include/wx/unix/sound.h index d2f2220b5b..76efeae3dc 100644 --- a/Externals/wxWidgets3/include/wx/unix/sound.h +++ b/Externals/wxWidgets3/include/wx/unix/sound.h @@ -4,7 +4,6 @@ // Author: Julian Smart, Vaclav Slavik // Modified by: // Created: 25/10/98 -// RCS-ID: $Id: sound.h 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Julian Smart, Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/stackwalk.h b/Externals/wxWidgets3/include/wx/unix/stackwalk.h index 666bd377f7..e99741934a 100644 --- a/Externals/wxWidgets3/include/wx/unix/stackwalk.h +++ b/Externals/wxWidgets3/include/wx/unix/stackwalk.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-19 -// RCS-ID: $Id: stackwalk.h 58093 2009-01-14 14:38:00Z FM $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/stdpaths.h b/Externals/wxWidgets3/include/wx/unix/stdpaths.h index 338866248d..2f111992a3 100644 --- a/Externals/wxWidgets3/include/wx/unix/stdpaths.h +++ b/Externals/wxWidgets3/include/wx/unix/stdpaths.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2004-10-19 -// RCS-ID: $Id: stdpaths.h 53094 2008-04-08 13:52:39Z JS $ // Copyright: (c) 2004 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -51,6 +50,11 @@ public: virtual wxString GetDocumentsDir() const; #endif +protected: + // Ctor is protected, use wxStandardPaths::Get() instead of instantiating + // objects of this class directly. + wxStandardPaths() { } + private: wxString m_prefix; }; diff --git a/Externals/wxWidgets3/include/wx/unix/taskbarx11.h b/Externals/wxWidgets3/include/wx/unix/taskbarx11.h index df30f94183..02a9200941 100644 --- a/Externals/wxWidgets3/include/wx/unix/taskbarx11.h +++ b/Externals/wxWidgets3/include/wx/unix/taskbarx11.h @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 04/04/2003 -// RCS-ID: $Id: taskbarx11.h 62789 2009-12-05 19:57:58Z PC $ // Copyright: (c) Vaclav Slavik, 2003 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/tls.h b/Externals/wxWidgets3/include/wx/unix/tls.h index 8dcd51bceb..ce61e6fff7 100644 --- a/Externals/wxWidgets3/include/wx/unix/tls.h +++ b/Externals/wxWidgets3/include/wx/unix/tls.h @@ -3,7 +3,6 @@ // Purpose: Pthreads implementation of wxTlsValue<> // Author: Vadim Zeitlin // Created: 2008-08-08 -// RCS-ID: $Id: tls.h 63653 2010-03-08 12:21:58Z VS $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/unix/utilsx11.h b/Externals/wxWidgets3/include/wx/unix/utilsx11.h index 32f83827e9..29898372fa 100644 --- a/Externals/wxWidgets3/include/wx/unix/utilsx11.h +++ b/Externals/wxWidgets3/include/wx/unix/utilsx11.h @@ -4,7 +4,6 @@ // Author: Mattia Barbon, Vaclav Slavik, Vadim Zeitlin // Modified by: // Created: 25.03.02 -// RCS-ID: $Id: utilsx11.h 65397 2010-08-24 11:23:22Z JJ $ // Copyright: (c) wxWidgets team // (c) 2010 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/uri.h b/Externals/wxWidgets3/include/wx/uri.h index 27b941437a..758bd72e27 100644 --- a/Externals/wxWidgets3/include/wx/uri.h +++ b/Externals/wxWidgets3/include/wx/uri.h @@ -4,7 +4,6 @@ // Author: Ryan Norton // Vadim Zeitlin (UTF-8 URI support, many other changes) // Created: 07/01/2004 -// RCS-ID: $Id: uri.h 54727 2008-07-20 12:57:47Z VZ $ // Copyright: (c) 2004 Ryan Norton // 2008 Vadim Zeitlin // Licence: wxWindows Licence diff --git a/Externals/wxWidgets3/include/wx/url.h b/Externals/wxWidgets3/include/wx/url.h index 65bd493383..572cae8b11 100644 --- a/Externals/wxWidgets3/include/wx/url.h +++ b/Externals/wxWidgets3/include/wx/url.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Ryan Norton // Created: 20/07/1997 -// RCS-ID: $Id: url.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1997, 1998 Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/ustring.h b/Externals/wxWidgets3/include/wx/ustring.h index d888d77d49..7c58fddd8a 100644 --- a/Externals/wxWidgets3/include/wx/ustring.h +++ b/Externals/wxWidgets3/include/wx/ustring.h @@ -3,7 +3,6 @@ // Purpose: 32-bit string (UCS-4) // Author: Robert Roebling // Copyright: (c) Robert Roebling -// RCS-ID: $Id: ustring.h 66654 2011-01-08 17:33:51Z PC $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/utils.h b/Externals/wxWidgets3/include/wx/utils.h index bccc7411a8..92701eae15 100644 --- a/Externals/wxWidgets3/include/wx/utils.h +++ b/Externals/wxWidgets3/include/wx/utils.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: utils.h 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -54,7 +53,7 @@ class WXDLLIMPEXP_FWD_BASE wxArrayInt; class WXDLLIMPEXP_FWD_BASE wxProcess; class WXDLLIMPEXP_FWD_CORE wxFrame; class WXDLLIMPEXP_FWD_CORE wxWindow; -class WXDLLIMPEXP_FWD_CORE wxWindowList; +class wxWindowList; class WXDLLIMPEXP_FWD_CORE wxEventLoop; // ---------------------------------------------------------------------------- @@ -130,12 +129,7 @@ wxDEPRECATED_INLINE(inline bool wxStringEq(const wchar_t *s1, const wchar_t *s2) // ---------------------------------------------------------------------------- // Sound the bell -#if !defined __EMX__ && \ - (defined __WXMOTIF__ || defined __WXGTK__ || defined __WXX11__) WXDLLIMPEXP_CORE void wxBell(); -#else -WXDLLIMPEXP_BASE void wxBell(); -#endif #if wxUSE_MSGDLG // Show wxWidgets information @@ -278,13 +272,13 @@ inline bool wxPlatformIs(int platform) { return wxPlatform::Is(platform); } // ---------------------------------------------------------------------------- // Ensure subsequent IDs don't clash with this one -WXDLLIMPEXP_BASE void wxRegisterId(long id); +WXDLLIMPEXP_BASE void wxRegisterId(int id); // Return the current ID -WXDLLIMPEXP_BASE long wxGetCurrentId(); +WXDLLIMPEXP_BASE int wxGetCurrentId(); // Generate a unique ID -WXDLLIMPEXP_BASE long wxNewId(); +WXDLLIMPEXP_BASE int wxNewId(); // ---------------------------------------------------------------------------- // Various conversions @@ -823,6 +817,10 @@ WXDLLIMPEXP_CORE bool wxYieldIfNeeded(); // Return the pointer to the resource data. This pointer is read-only, use // the overload below if you need to modify the data. // + // Notice that the resource type can be either a real string or an integer + // produced by MAKEINTRESOURCE(). In particular, any standard resource type, + // i.e any RT_XXX constant, could be passed here. + // // Returns true on success, false on failure. Doesn't log an error message // if the resource is not found (because this could be expected) but does // log one if any other error occurs. @@ -830,7 +828,7 @@ WXDLLIMPEXP_CORE bool wxYieldIfNeeded(); wxLoadUserResource(const void **outData, size_t *outLen, const wxString& resourceName, - const wxString& resourceType = wxUserResourceStr, + const wxChar* resourceType = wxUserResourceStr, WXHINSTANCE module = 0); // This function allocates a new buffer and makes a copy of the resource @@ -840,7 +838,7 @@ WXDLLIMPEXP_CORE bool wxYieldIfNeeded(); // Returns NULL on failure. WXDLLIMPEXP_BASE char* wxLoadUserResource(const wxString& resourceName, - const wxString& resourceType = wxUserResourceStr, + const wxChar* resourceType = wxUserResourceStr, int* pLen = NULL, WXHINSTANCE module = 0); #endif // __WINDOWS__ diff --git a/Externals/wxWidgets3/include/wx/valgen.h b/Externals/wxWidgets3/include/wx/valgen.h index 9e6f0c3479..c24142e791 100644 --- a/Externals/wxWidgets3/include/wx/valgen.h +++ b/Externals/wxWidgets3/include/wx/valgen.h @@ -3,7 +3,6 @@ // Purpose: wxGenericValidator class // Author: Kevin Smith // Created: Jan 22 1999 -// RCS-ID: $Id: valgen.h 68217 2011-07-09 23:37:28Z VZ $ // Copyright: (c) 1999 Julian Smart (assigned from Kevin) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/validate.h b/Externals/wxWidgets3/include/wx/validate.h index d94f89c09e..0adf3bf477 100644 --- a/Externals/wxWidgets3/include/wx/validate.h +++ b/Externals/wxWidgets3/include/wx/validate.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: validate.h 66966 2011-02-19 12:32:59Z VZ $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,6 +36,11 @@ class WXDLLIMPEXP_CORE wxValidator : public wxEvtHandler { public: wxValidator(); + wxValidator(const wxValidator& other) + : wxEvtHandler() + , m_validatorWindow(other.m_validatorWindow) + { + } virtual ~wxValidator(); // Make a clone of this validator (or return NULL) - currently necessary @@ -87,7 +91,7 @@ private: static bool ms_isSilent; DECLARE_DYNAMIC_CLASS(wxValidator) - wxDECLARE_NO_COPY_CLASS(wxValidator); + wxDECLARE_NO_ASSIGN_CLASS(wxValidator); }; extern WXDLLIMPEXP_DATA_CORE(const wxValidator) wxDefaultValidator; diff --git a/Externals/wxWidgets3/include/wx/valtext.h b/Externals/wxWidgets3/include/wx/valtext.h index a012ef62ad..93f5dd614e 100644 --- a/Externals/wxWidgets3/include/wx/valtext.h +++ b/Externals/wxWidgets3/include/wx/valtext.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Francesco Montorsi // Created: 29/01/98 -// RCS-ID: $Id: valtext.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/variant.h b/Externals/wxWidgets3/include/wx/variant.h index 6f82698856..39adc729b9 100644 --- a/Externals/wxWidgets3/include/wx/variant.h +++ b/Externals/wxWidgets3/include/wx/variant.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 10/09/98 -// RCS-ID: $Id: variant.h 66608 2011-01-06 11:06:12Z SC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -570,7 +569,11 @@ bool classname##VariantData::Eq(wxVariantData& data) const \ var.GetWxObjectPtr() : NULL)); // Replacement for using wxDynamicCast on a wxVariantData object -#define wxDynamicCastVariantData(data, classname) dynamic_cast(data) +#ifndef wxNO_RTTI + #define wxDynamicCastVariantData(data, classname) dynamic_cast(data) +#endif + +#define wxStaticCastVariantData(data, classname) static_cast(data) extern wxVariant WXDLLIMPEXP_BASE wxNullVariant; diff --git a/Externals/wxWidgets3/include/wx/variantbase.h b/Externals/wxWidgets3/include/wx/variantbase.h index 3f06c96e0e..732671bdd5 100644 --- a/Externals/wxWidgets3/include/wx/variantbase.h +++ b/Externals/wxWidgets3/include/wx/variantbase.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: Francesco Montorsi // Created: 10/09/98 -// RCS-ID: $Id: variantbase.h 66584 2011-01-05 06:56:36Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/vector.h b/Externals/wxWidgets3/include/wx/vector.h index e95d4103ef..dffb19fc9d 100644 --- a/Externals/wxWidgets3/include/wx/vector.h +++ b/Externals/wxWidgets3/include/wx/vector.h @@ -28,7 +28,6 @@ inline void wxVectorSort(wxVector& v) #else // !wxUSE_STD_CONTAINERS -#include "wx/utils.h" #include "wx/scopeguard.h" #include "wx/meta/movable.h" #include "wx/meta/if.h" @@ -37,6 +36,15 @@ inline void wxVectorSort(wxVector& v) #include // for placement new #include "wx/afterstd.h" +// wxQsort is declared in wx/utils.h, but can't include that file here, +// it indirectly includes this file. Just lovely... +typedef int (*wxSortCallback)(const void* pItem1, + const void* pItem2, + const void* user_data); +WXDLLIMPEXP_BASE void wxQsort(void* pbase, size_t total_elems, + size_t size, wxSortCallback cmp, + const void* user_data); + namespace wxPrivate { @@ -131,9 +139,11 @@ public: typedef size_t difference_type; typedef T value_type; typedef value_type* pointer; + typedef const value_type* const_pointer; typedef value_type* iterator; typedef const value_type* const_iterator; typedef value_type& reference; + typedef const value_type& const_reference; class reverse_iterator { @@ -175,6 +185,51 @@ public: private: value_type *m_ptr; + + friend class const_reverse_iterator; + }; + + class const_reverse_iterator + { + public: + const_reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT const_reverse_iterator(const_iterator it) : m_ptr(it) { } + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + const_reverse_iterator(const const_reverse_iterator& it) : m_ptr(it.m_ptr) { } + + const_reference operator*() const { return *m_ptr; } + const_pointer operator->() const { return m_ptr; } + + const_iterator base() const { return m_ptr; } + + const_reverse_iterator& operator++() + { --m_ptr; return *this; } + const_reverse_iterator operator++(int) + { const_reverse_iterator tmp = *this; --m_ptr; return tmp; } + const_reverse_iterator& operator--() + { ++m_ptr; return *this; } + const_reverse_iterator operator--(int) + { const_reverse_iterator tmp = *this; ++m_ptr; return tmp; } + + const_reverse_iterator operator+(difference_type n) const + { return const_reverse_iterator(m_ptr - n); } + const_reverse_iterator& operator+=(difference_type n) + { m_ptr -= n; return *this; } + const_reverse_iterator operator-(difference_type n) const + { return const_reverse_iterator(m_ptr + n); } + const_reverse_iterator& operator-=(difference_type n) + { m_ptr += n; return *this; } + + const_reference operator[](difference_type n) const + { return *(*this + n); } + + bool operator ==(const const_reverse_iterator& it) const + { return m_ptr == it.m_ptr; } + bool operator !=(const const_reverse_iterator& it) const + { return m_ptr != it.m_ptr; } + + protected: + const value_type *m_ptr; }; wxVector() : m_size(0), m_capacity(0), m_values(NULL) {} @@ -200,11 +255,39 @@ public: Copy(c); } + template + wxVector(InputIterator first, InputIterator last) + : m_size(0), m_capacity(0), m_values(NULL) + { + assign(first, last); + } + ~wxVector() { clear(); } + void assign(size_type p_size, const value_type& v) + { + clear(); + reserve(p_size); + for ( size_t n = 0; n < p_size; n++ ) + push_back(v); + } + + template + void assign(InputIterator first, InputIterator last) + { + clear(); + + // Notice that it would be nice to call reserve() here but we can't do + // it for arbitrary input iterators, we should have a dispatch on + // iterator type and call it if possible. + + for ( InputIterator it = first; it != last; ++it ) + push_back(*it); + } + void swap(wxVector& v) { wxSwap(m_size, v.m_size); @@ -234,10 +317,12 @@ public: // increase the size twice, unless we're already too big or unless // more is requested // - // NB: casts to size_type are needed to suppress mingw32 warnings about - // mixing enums and ints in the same expression + // NB: casts to size_type are needed to suppress warnings about + // mixing enumeral and non-enumeral type in conditional expression const size_type increment = m_size > 0 - ? wxMin(m_size, (size_type)ALLOC_MAX_SIZE) + ? m_size < ALLOC_MAX_SIZE + ? m_size + : (size_type)ALLOC_MAX_SIZE : (size_type)ALLOC_INITIAL_SIZE; if ( m_capacity + increment > n ) n = m_capacity + increment; @@ -335,6 +420,9 @@ public: reverse_iterator rbegin() { return reverse_iterator(end() - 1); } reverse_iterator rend() { return reverse_iterator(begin() - 1); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end() - 1); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin() - 1); } + iterator insert(iterator it, const value_type& v = value_type()) { // NB: this must be done before reserve(), because reserve() diff --git a/Externals/wxWidgets3/include/wx/version.h b/Externals/wxWidgets3/include/wx/version.h index fb634a97fb..c762d9a9f0 100644 --- a/Externals/wxWidgets3/include/wx/version.h +++ b/Externals/wxWidgets3/include/wx/version.h @@ -4,7 +4,6 @@ * Author: Julian Smart * Modified by: Ryan Norton (Converted to C) * Created: 29/01/98 - * RCS-ID: $Id: version.h 70021 2011-12-16 22:12:49Z VZ $ * Copyright: (c) 1998 Julian Smart * Licence: wxWindows licence */ @@ -26,11 +25,11 @@ */ /* NB: this file is parsed by automatic tools so don't change its format! */ -#define wxMAJOR_VERSION 2 -#define wxMINOR_VERSION 9 -#define wxRELEASE_NUMBER 4 +#define wxMAJOR_VERSION 3 +#define wxMINOR_VERSION 0 +#define wxRELEASE_NUMBER 0 #define wxSUBRELEASE_NUMBER 0 -#define wxVERSION_STRING wxT("wxWidgets 2.9.4") +#define wxVERSION_STRING wxT("wxWidgets 3.0.0 RC1") /* nothing to update below this line when updating the version */ /* ---------------------------------------------------------------------------- */ diff --git a/Externals/wxWidgets3/include/wx/versioninfo.h b/Externals/wxWidgets3/include/wx/versioninfo.h index 8e7723f08d..79469111a6 100644 --- a/Externals/wxWidgets3/include/wx/versioninfo.h +++ b/Externals/wxWidgets3/include/wx/versioninfo.h @@ -3,7 +3,6 @@ // Purpose: declaration of wxVersionInfo class // Author: Troels K // Created: 2010-11-22 -// RCS-ID: $Id: versioninfo.h 66474 2010-12-27 20:47:12Z RD $ // Copyright: (c) 2010 wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/vidmode.h b/Externals/wxWidgets3/include/wx/vidmode.h index 9c462dd0b5..550bb3b4bc 100644 --- a/Externals/wxWidgets3/include/wx/vidmode.h +++ b/Externals/wxWidgets3/include/wx/vidmode.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 27.09.2003 (extracted from wx/display.h) -// RCS-ID: $Id: vidmode.h 53124 2008-04-11 09:52:04Z VS $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/vlbox.h b/Externals/wxWidgets3/include/wx/vlbox.h index 62f0299b23..1981110509 100644 --- a/Externals/wxWidgets3/include/wx/vlbox.h +++ b/Externals/wxWidgets3/include/wx/vlbox.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 31.05.03 -// RCS-ID: $Id: vlbox.h 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -247,7 +246,7 @@ protected: // common part of all ctors void Init(); - // send the wxEVT_COMMAND_LISTBOX_SELECTED event + // send the wxEVT_LISTBOX event void SendSelectedEvent(); virtual void InitEvent(wxCommandEvent& event, int n); diff --git a/Externals/wxWidgets3/include/wx/volume.h b/Externals/wxWidgets3/include/wx/volume.h index 441e3e996f..fd6a8370e0 100644 --- a/Externals/wxWidgets3/include/wx/volume.h +++ b/Externals/wxWidgets3/include/wx/volume.h @@ -4,7 +4,6 @@ // Author: George Policello // Modified by: // Created: 28 Jan 02 -// RCS-ID: $Id: volume.h 56910 2008-11-22 15:54:33Z FM $ // Copyright: (c) 2002 George Policello // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/vscroll.h b/Externals/wxWidgets3/include/wx/vscroll.h index 6bf9623c36..2312d78f0b 100644 --- a/Externals/wxWidgets3/include/wx/vscroll.h +++ b/Externals/wxWidgets3/include/wx/vscroll.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Brad Anderson, Bryan Petty // Created: 30.05.03 -// RCS-ID: $Id: vscroll.h 70085 2011-12-22 01:26:11Z RD $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,6 +13,7 @@ #include "wx/panel.h" #include "wx/position.h" +#include "wx/scrolwin.h" class WXDLLIMPEXP_FWD_CORE wxVarScrollHelperEvtHandler; @@ -24,6 +24,11 @@ class WXDLLIMPEXP_FWD_CORE wxVarScrollHelperEvtHandler; // scrolwin.h) for the purpose of reducing code duplication | // through the use of mix-in classes. | // | +// wxAnyScrollHelperBase | +// | | +// | | +// | | +// V | // wxVarScrollHelperBase | // / \ | // / \ | @@ -59,7 +64,7 @@ class WXDLLIMPEXP_FWD_CORE wxVarScrollHelperEvtHandler; // required virtual functions that need to be implemented for any orientation // specific work. -class WXDLLIMPEXP_CORE wxVarScrollHelperBase +class WXDLLIMPEXP_CORE wxVarScrollHelperBase : public wxAnyScrollHelperBase { public: // constructors and such @@ -115,10 +120,6 @@ public: // child of it in order to scroll only a portion the area between the // scrollbars (spreadsheet: only cell area will move). virtual void SetTargetWindow(wxWindow *target); - virtual wxWindow *GetTargetWindow() const { return m_targetWindow; } - - // Override this function to draw the graphic (or just process EVT_PAINT) - //virtual void OnDraw(wxDC& WXUNUSED(dc)) { } // change the DC origin according to the scroll position. To properly // forward calls to wxWindow::Layout use WX_FORWARD_TO_SCROLL_HELPER() @@ -257,12 +258,6 @@ protected: void IncOrient(wxCoord& x, wxCoord& y, wxCoord inc); private: - - // the window that receives the scroll events and the window to actually - // scroll, respectively - wxWindow *m_win, - *m_targetWindow; - // the total number of (logical) units size_t m_unitMax; diff --git a/Externals/wxWidgets3/include/wx/weakref.h b/Externals/wxWidgets3/include/wx/weakref.h index 496d90cb29..b692f037e8 100644 --- a/Externals/wxWidgets3/include/wx/weakref.h +++ b/Externals/wxWidgets3/include/wx/weakref.h @@ -3,7 +3,6 @@ // Purpose: wxWeakRef - Generic weak references for wxWidgets // Author: Arne Steinarson // Created: 27 Dec 07 -// RCS-ID: $Id: weakref.h 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2007 Arne Steinarson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -227,14 +226,14 @@ public: template wxWeakRef(TDerived* pobj) { - Assign(pobj); + this->Assign(pobj); } // We need this copy ctor, since otherwise a default compiler (binary) copy // happens (if embedded as an object member). wxWeakRef(const wxWeakRef& wr) { - Assign(wr.get()); + this->Assign(wr.get()); } wxWeakRef& operator=(const wxWeakRef& wr) diff --git a/Externals/wxWidgets3/include/wx/webview.h b/Externals/wxWidgets3/include/wx/webview.h index 993d99cfa5..25a235da9d 100644 --- a/Externals/wxWidgets3/include/wx/webview.h +++ b/Externals/wxWidgets3/include/wx/webview.h @@ -2,13 +2,12 @@ // Name: webview.h // Purpose: Common interface and events for web view component // Author: Marianne Gagnon -// Id: $Id: webview.h 70038 2011-12-17 23:52:40Z VZ $ // Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_WEB_VIEW_H_ -#define _WX_WEB_VIEW_H_ +#ifndef _WX_WEBVIEW_H_ +#define _WX_WEBVIEW_H_ #include "wx/defs.h" @@ -32,47 +31,51 @@ class wxFSFile; class wxFileSystem; +class wxWebView; enum wxWebViewZoom { - wxWEB_VIEW_ZOOM_TINY, - wxWEB_VIEW_ZOOM_SMALL, - wxWEB_VIEW_ZOOM_MEDIUM, - wxWEB_VIEW_ZOOM_LARGE, - wxWEB_VIEW_ZOOM_LARGEST + wxWEBVIEW_ZOOM_TINY, + wxWEBVIEW_ZOOM_SMALL, + wxWEBVIEW_ZOOM_MEDIUM, + wxWEBVIEW_ZOOM_LARGE, + wxWEBVIEW_ZOOM_LARGEST }; enum wxWebViewZoomType { //Scales entire page, including images - wxWEB_VIEW_ZOOM_TYPE_LAYOUT, - wxWEB_VIEW_ZOOM_TYPE_TEXT + wxWEBVIEW_ZOOM_TYPE_LAYOUT, + wxWEBVIEW_ZOOM_TYPE_TEXT }; enum wxWebViewNavigationError { - wxWEB_NAV_ERR_CONNECTION, - wxWEB_NAV_ERR_CERTIFICATE, - wxWEB_NAV_ERR_AUTH, - wxWEB_NAV_ERR_SECURITY, - wxWEB_NAV_ERR_NOT_FOUND, - wxWEB_NAV_ERR_REQUEST, - wxWEB_NAV_ERR_USER_CANCELLED, - wxWEB_NAV_ERR_OTHER + wxWEBVIEW_NAV_ERR_CONNECTION, + wxWEBVIEW_NAV_ERR_CERTIFICATE, + wxWEBVIEW_NAV_ERR_AUTH, + wxWEBVIEW_NAV_ERR_SECURITY, + wxWEBVIEW_NAV_ERR_NOT_FOUND, + wxWEBVIEW_NAV_ERR_REQUEST, + wxWEBVIEW_NAV_ERR_USER_CANCELLED, + wxWEBVIEW_NAV_ERR_OTHER }; enum wxWebViewReloadFlags { //Default, may access cache - wxWEB_VIEW_RELOAD_DEFAULT, - wxWEB_VIEW_RELOAD_NO_CACHE + wxWEBVIEW_RELOAD_DEFAULT, + wxWEBVIEW_RELOAD_NO_CACHE }; -enum wxWebViewBackend +enum wxWebViewFindFlags { - wxWEB_VIEW_BACKEND_DEFAULT, - wxWEB_VIEW_BACKEND_WEBKIT, - wxWEB_VIEW_BACKEND_IE + wxWEBVIEW_FIND_WRAP = 0x0001, + wxWEBVIEW_FIND_ENTIRE_WORD = 0x0002, + wxWEBVIEW_FIND_MATCH_CASE = 0x0004, + wxWEBVIEW_FIND_HIGHLIGHT_RESULT = 0x0008, + wxWEBVIEW_FIND_BACKWARDS = 0x0010, + wxWEBVIEW_FIND_DEFAULT = 0 }; //Base class for custom scheme handlers @@ -89,10 +92,33 @@ private: extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewNameStr[]; extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewDefaultURLStr[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendDefault[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendIE[]; +extern WXDLLIMPEXP_DATA_WEBVIEW(const char) wxWebViewBackendWebKit[]; + +class WXDLLIMPEXP_WEBVIEW wxWebViewFactory : public wxObject +{ +public: + virtual wxWebView* Create() = 0; + virtual wxWebView* Create(wxWindow* parent, + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxWebViewNameStr) = 0; +}; + +WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringWebViewFactoryMap); class WXDLLIMPEXP_WEBVIEW wxWebView : public wxControl { public: + wxWebView() + { + m_showMenu = true; + } + virtual ~wxWebView() {} virtual bool Create(wxWindow* parent, @@ -103,36 +129,49 @@ public: long style = 0, const wxString& name = wxWebViewNameStr) = 0; - static wxWebView* New(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT); + // Factory methods allowing the use of custom factories registered with + // RegisterFactory + static wxWebView* New(const wxString& backend = wxWebViewBackendDefault); static wxWebView* New(wxWindow* parent, - wxWindowID id, - const wxString& url = wxWebViewDefaultURLStr, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT, - long style = 0, - const wxString& name = wxWebViewNameStr); + wxWindowID id, + const wxString& url = wxWebViewDefaultURLStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& backend = wxWebViewBackendDefault, + long style = 0, + const wxString& name = wxWebViewNameStr); - //General methods + static void RegisterFactory(const wxString& backend, + wxSharedPtr factory); + + // General methods + virtual void EnableContextMenu(bool enable = true) + { + m_showMenu = enable; + } virtual wxString GetCurrentTitle() const = 0; virtual wxString GetCurrentURL() const = 0; // TODO: handle choosing a frame when calling GetPageSource()? virtual wxString GetPageSource() const = 0; virtual wxString GetPageText() const = 0; virtual bool IsBusy() const = 0; + virtual bool IsContextMenuEnabled() const { return m_showMenu; } virtual bool IsEditable() const = 0; virtual void LoadURL(const wxString& url) = 0; virtual void Print() = 0; virtual void RegisterHandler(wxSharedPtr handler) = 0; - virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT) = 0; + virtual void Reload(wxWebViewReloadFlags flags = wxWEBVIEW_RELOAD_DEFAULT) = 0; virtual void RunScript(const wxString& javascript) = 0; virtual void SetEditable(bool enable = true) = 0; - virtual void SetPage(const wxString& html, const wxString& baseUrl) = 0; - virtual void SetPage(wxInputStream& html, wxString baseUrl) + void SetPage(const wxString& html, const wxString& baseUrl) + { + DoSetPage(html, baseUrl); + } + void SetPage(wxInputStream& html, wxString baseUrl) { wxStringOutputStream stream; stream.Write(html); - SetPage(stream.GetString(), baseUrl); + DoSetPage(stream.GetString(), baseUrl); } virtual void Stop() = 0; @@ -176,6 +215,21 @@ public: virtual void Undo() = 0; virtual void Redo() = 0; + //Get the pointer to the underlying native engine. + virtual void* GetNativeBackend() const = 0; + //Find function + virtual long Find(const wxString& text, int flags = wxWEBVIEW_FIND_DEFAULT) = 0; + +protected: + virtual void DoSetPage(const wxString& html, const wxString& baseUrl) = 0; + +private: + static void InitFactoryMap(); + static wxStringWebViewFactoryMap::iterator FindFactory(const wxString &backend); + + bool m_showMenu; + static wxStringWebViewFactoryMap m_factoryMap; + wxDECLARE_ABSTRACT_CLASS(wxWebView); }; @@ -200,12 +254,12 @@ private: wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWebViewEvent); }; -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_NAVIGATING, wxWebViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_NAVIGATED, wxWebViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_LOADED, wxWebViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, wxWebViewEvent ); -wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NAVIGATING, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NAVIGATED, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_LOADED, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); typedef void (wxEvtHandler::*wxWebViewEventFunction) (wxWebViewEvent&); @@ -213,30 +267,38 @@ typedef void (wxEvtHandler::*wxWebViewEventFunction) #define wxWebViewEventHandler(func) \ wxEVENT_HANDLER_CAST(wxWebViewEventFunction, func) -#define EVT_WEB_VIEW_NAVIGATING(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, id, \ +#define EVT_WEBVIEW_NAVIGATING(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NAVIGATING, id, \ wxWebViewEventHandler(fn)) -#define EVT_WEB_VIEW_NAVIGATED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, id, \ +#define EVT_WEBVIEW_NAVIGATED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NAVIGATED, id, \ wxWebViewEventHandler(fn)) -#define EVT_WEB_VIEW_LOADED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_LOADED, id, \ +#define EVT_WEBVIEW_LOADED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_LOADED, id, \ wxWebViewEventHandler(fn)) -#define EVT_WEB_VIEW_ERROR(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_ERROR, id, \ +#define EVT_WEBVIEW_ERROR(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_ERROR, id, \ wxWebViewEventHandler(fn)) -#define EVT_WEB_VIEW_NEWWINDOW(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, id, \ +#define EVT_WEBVIEW_NEWWINDOW(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_NEWWINDOW, id, \ wxWebViewEventHandler(fn)) -#define EVT_WEB_VIEW_TITLE_CHANGED(id, fn) \ - wx__DECLARE_EVT1(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, id, \ +#define EVT_WEBVIEW_TITLE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_WEBVIEW_TITLE_CHANGED, id, \ wxWebViewEventHandler(fn)) +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_WEBVIEW_NAVIGATING wxEVT_WEBVIEW_NAVIGATING +#define wxEVT_COMMAND_WEBVIEW_NAVIGATED wxEVT_WEBVIEW_NAVIGATED +#define wxEVT_COMMAND_WEBVIEW_LOADED wxEVT_WEBVIEW_LOADED +#define wxEVT_COMMAND_WEBVIEW_ERROR wxEVT_WEBVIEW_ERROR +#define wxEVT_COMMAND_WEBVIEW_NEWWINDOW wxEVT_WEBVIEW_NEWWINDOW +#define wxEVT_COMMAND_WEBVIEW_TITLE_CHANGED wxEVT_WEBVIEW_TITLE_CHANGED + #endif // wxUSE_WEBVIEW -#endif // _WX_WEB_VIEW_H_ +#endif // _WX_WEBVIEW_H_ diff --git a/Externals/wxWidgets3/include/wx/webviewarchivehandler.h b/Externals/wxWidgets3/include/wx/webviewarchivehandler.h index 4cd91dc4af..8b2eb19908 100644 --- a/Externals/wxWidgets3/include/wx/webviewarchivehandler.h +++ b/Externals/wxWidgets3/include/wx/webviewarchivehandler.h @@ -2,13 +2,12 @@ // Name: webviewarchivehandler.h // Purpose: Custom webview handler to allow archive browsing // Author: Steven Lamerton -// Id: $Id: webviewarchivehandler.h 69316 2011-10-05 21:21:51Z SJL $ // Copyright: (c) 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_WEB_VIEW_FILE_HANDLER_H_ -#define _WX_WEB_VIEW_FILE_HANDLER_H_ +#ifndef _WX_WEBVIEW_FILE_HANDLER_H_ +#define _WX_WEBVIEW_FILE_HANDLER_H_ #include "wx/setup.h" @@ -20,7 +19,7 @@ class wxFileSystem; #include "wx/webview.h" //Loads from uris such as scheme:///C:/example/example.html or archives such as -//scheme:///C:/example/example.zip;protocol=zip/example.html +//scheme:///C:/example/example.zip;protocol=zip/example.html class WXDLLIMPEXP_WEBVIEW wxWebViewArchiveHandler : public wxWebViewHandler { @@ -34,4 +33,4 @@ private: #endif // wxUSE_WEBVIEW -#endif // _WX_WEB_VIEW_FILE_HANDLER_H_ +#endif // _WX_WEBVIEW_FILE_HANDLER_H_ diff --git a/Externals/wxWidgets3/include/wx/webviewfshandler.h b/Externals/wxWidgets3/include/wx/webviewfshandler.h new file mode 100644 index 0000000000..ebdbbcb906 --- /dev/null +++ b/Externals/wxWidgets3/include/wx/webviewfshandler.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: webviewfshandler.h +// Purpose: Custom webview handler for virtual file system +// Author: Nick Matthews +// Copyright: (c) 2012 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// Based on webviewarchivehandler.h file by Steven Lamerton + +#ifndef _WX_WEBVIEW_FS_HANDLER_H_ +#define _WX_WEBVIEW_FS_HANDLER_H_ + +#include "wx/setup.h" + +#if wxUSE_WEBVIEW + +class wxFSFile; +class wxFileSystem; + +#include "wx/webview.h" + +//Loads from uris such as scheme:example.html + +class WXDLLIMPEXP_WEBVIEW wxWebViewFSHandler : public wxWebViewHandler +{ +public: + wxWebViewFSHandler(const wxString& scheme); + virtual ~wxWebViewFSHandler(); + virtual wxFSFile* GetFile(const wxString &uri); +private: + wxFileSystem* m_fileSystem; +}; + +#endif // wxUSE_WEBVIEW + +#endif // _WX_WEBVIEW_FS_HANDLER_H_ diff --git a/Externals/wxWidgets3/include/wx/wfstream.h b/Externals/wxWidgets3/include/wx/wfstream.h index 753e8349d7..613b4c273b 100644 --- a/Externals/wxWidgets3/include/wx/wfstream.h +++ b/Externals/wxWidgets3/include/wx/wfstream.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: // Created: 11/07/98 -// RCS-ID: $Id: wfstream.h 62995 2009-12-27 19:39:55Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -42,6 +41,8 @@ public: virtual bool IsOk() const; bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + wxFile* GetFile() const { return m_file; } + protected: wxFileInputStream(); @@ -72,6 +73,8 @@ public: virtual bool IsOk() const; bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + wxFile* GetFile() const { return m_file; } + protected: wxFileOutputStream(); @@ -169,6 +172,8 @@ public: virtual bool IsOk() const; bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + wxFFile* GetFile() const { return m_file; } + protected: wxFFileInputStream(); @@ -199,6 +204,8 @@ public: virtual bool IsOk() const; bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + wxFFile* GetFile() const { return m_file; } + protected: wxFFileOutputStream(); diff --git a/Externals/wxWidgets3/include/wx/window.h b/Externals/wxWidgets3/include/wx/window.h index 3ec3b57692..fc37b81944 100644 --- a/Externals/wxWidgets3/include/wx/window.h +++ b/Externals/wxWidgets3/include/wx/window.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: Ron Lee // Created: 01/02/97 -// RCS-ID: $Id: window.h 70838 2012-03-07 23:50:21Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -379,6 +378,13 @@ public: *h = s.y; } + // Determine the best size in the other direction if one of them is + // fixed. This is used with windows that can wrap their contents and + // returns input-independent best size for the others. + int GetBestHeight(int width) const; + int GetBestWidth(int height) const; + + void SetScrollHelper( wxScrollHelper *sh ) { m_scrollHelper = sh; } wxScrollHelper *GetScrollHelper() { return m_scrollHelper; } @@ -393,13 +399,18 @@ public: // minimum size, giving priority to the min size components, and // returns the results. virtual wxSize GetEffectiveMinSize() const; - wxDEPRECATED( wxSize GetBestFittingSize() const ); // replaced by GetEffectiveMinSize - wxDEPRECATED( wxSize GetAdjustedMinSize() const ); // replaced by GetEffectiveMinSize + + wxDEPRECATED_MSG("use GetEffectiveMinSize() instead") + wxSize GetBestFittingSize() const; + wxDEPRECATED_MSG("use GetEffectiveMinSize() instead") + wxSize GetAdjustedMinSize() const; // A 'Smart' SetSize that will fill in default size values with 'best' // size. Sets the minsize to what was passed in. void SetInitialSize(const wxSize& size=wxDefaultSize); - wxDEPRECATED( void SetBestFittingSize(const wxSize& size=wxDefaultSize) ); // replaced by SetInitialSize + + wxDEPRECATED_MSG("use SetInitialSize() instead") + void SetBestFittingSize(const wxSize& size=wxDefaultSize); // the generic centre function - centers the window on parent by` @@ -514,6 +525,11 @@ public: return wxSize( wxMax( client.x, best.x ), wxMax( client.y, best.y ) ); } + // returns the magnification of the content of this window + // eg 2.0 for a window on a retina screen + virtual double GetContentScaleFactor() const + { return 1.0; } + // return the size of the left/right and top/bottom borders in x and y // components of the result respectively virtual wxSize GetWindowBorderSize() const; @@ -548,6 +564,43 @@ public: // this is the same as SendSizeEventToParent() but using PostSizeEvent() void PostSizeEventToParent() { SendSizeEventToParent(wxSEND_EVENT_POST); } + // These functions should be used before repositioning the children of + // this window to reduce flicker or, in MSW case, even avoid display + // corruption in some situations (so they're more than just optimization). + // + // EndRepositioningChildren() should be called if and only if + // BeginRepositioningChildren() returns true. To ensure that this is always + // done automatically, use ChildrenRepositioningGuard class below. + virtual bool BeginRepositioningChildren() { return false; } + virtual void EndRepositioningChildren() { } + + // A simple helper which ensures that EndRepositioningChildren() is called + // from its dtor if and only if calling BeginRepositioningChildren() from + // the ctor returned true. + class ChildrenRepositioningGuard + { + public: + // Notice that window can be NULL here, for convenience. In this case + // this class simply doesn't do anything. + wxEXPLICIT ChildrenRepositioningGuard(wxWindowBase* win) + : m_win(win), + m_callEnd(win && win->BeginRepositioningChildren()) + { + } + + ~ChildrenRepositioningGuard() + { + if ( m_callEnd ) + m_win->EndRepositioningChildren(); + } + + private: + wxWindowBase* const m_win; + const bool m_callEnd; + + wxDECLARE_NO_COPY_CLASS(ChildrenRepositioningGuard); + }; + // window state // ------------ @@ -675,8 +728,13 @@ public: virtual bool AcceptsFocusFromKeyboard() const { return AcceptsFocus(); } - // this is mostly a helper for the various functions using it below - bool CanBeFocused() const { return IsShown() && IsEnabled(); } + // Can this window be focused right now, in its current state? This + // shouldn't be called at all if AcceptsFocus() returns false. + // + // It is a convenient helper for the various functions using it below + // but also a hook allowing to override the default logic for some rare + // cases (currently just wxRadioBox in wxMSW) when it's inappropriate. + virtual bool CanBeFocused() const { return IsShown() && IsEnabled(); } // can this window itself have focus? bool IsFocusable() const { return AcceptsFocus() && CanBeFocused(); } @@ -740,8 +798,12 @@ public: // is this window a top level one? virtual bool IsTopLevel() const; + // is this window a child or grand child of this one (inside the same + // TLW)? + bool IsDescendant(wxWindowBase* win) const; + // it doesn't really change parent, use Reparent() instead - void SetParent( wxWindowBase *parent ) { m_parent = (wxWindow *)parent; } + void SetParent( wxWindowBase *parent ); // change the real parent of this window, return true if the parent // was changed, false otherwise (error or newParent == oldParent) virtual bool Reparent( wxWindowBase *newParent ); @@ -1164,11 +1226,7 @@ public: // ---------- // can the window have the scrollbar in this orientation? - bool CanScroll(int orient) const - { - return (m_windowStyle & - (orient == wxHORIZONTAL ? wxHSCROLL : wxVSCROLL)) != 0; - } + virtual bool CanScroll(int orient) const; // does the window have the scrollbar in this orientation? bool HasScrollbar(int orient) const; @@ -1500,11 +1558,6 @@ protected: // widgets state are necessary virtual void DoEnable(bool WXUNUSED(enable)) { } - // called when the on-screen widget state changes and provides an - // an opportunity for the widget to update its visual state (colours, - // fonts, anything else) as necessary - virtual void OnEnabled(bool WXUNUSED(enabled)) { } - // the window id - a number which uniquely identifies a window among // its siblings unless it is wxID_ANY @@ -1633,8 +1686,10 @@ protected: // recalculated each time the value is needed. wxSize m_bestSizeCache; - wxDEPRECATED( void SetBestSize(const wxSize& size) ); // use SetInitialSize - wxDEPRECATED( virtual void SetInitialBestSize(const wxSize& size) ); // use SetInitialSize + wxDEPRECATED_MSG("use SetInitialSize() instead.") + void SetBestSize(const wxSize& size); + wxDEPRECATED_MSG("use SetInitialSize() instead.") + virtual void SetInitialBestSize(const wxSize& size); @@ -1683,6 +1738,14 @@ protected: // (GetBorderSize() will be used to add them) virtual wxSize DoGetBestClientSize() const { return wxDefaultSize; } + // These two methods can be overridden to implement intelligent + // width-for-height and/or height-for-width best size determination for the + // window. By default the fixed best size is used. + virtual int DoGetBestClientHeight(int WXUNUSED(width)) const + { return wxDefaultCoord; } + virtual int DoGetBestClientWidth(int WXUNUSED(height)) const + { return wxDefaultCoord; } + // this is the virtual function to be overridden in any derived class which // wants to change how SetSize() or Move() works - it is called by all // versions of these functions in the base class @@ -1749,7 +1812,7 @@ protected: static void NotifyCaptureLost(); private: - // recursively call our own and our children OnEnabled() when the + // recursively call our own and our children DoEnable() when the // enabled/disabled status changed because a parent window had been // enabled/disabled void NotifyWindowOnEnableChange(bool enabled); @@ -1770,15 +1833,6 @@ private: // base for dialog unit conversion, i.e. average character size wxSize GetDlgUnitBase() const; - // the stack of windows which have captured the mouse - static struct WXDLLIMPEXP_FWD_CORE wxWindowNext *ms_winCaptureNext; - - // the window that currently has mouse capture - static wxWindow *ms_winCaptureCurrent; - - // indicates if execution is inside CaptureMouse/ReleaseMouse - static bool ms_winCaptureChanging; - // number of Freeze() calls minus the number of Thaw() calls: we're frozen // (i.e. not being updated) if it is positive @@ -1913,8 +1967,7 @@ extern WXDLLIMPEXP_CORE wxWindow *wxGetActiveWindow(); WXDLLIMPEXP_CORE wxWindow* wxGetTopLevelParent(wxWindow *win); #if WXWIN_COMPATIBILITY_2_6 - // deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId() - wxDEPRECATED( wxWindowID NewControlId() ); + wxDEPRECATED_MSG("use wxWindow::NewControlId() instead") inline wxWindowID NewControlId() { return wxWindowBase::NewControlId(); } #endif // WXWIN_COMPATIBILITY_2_6 diff --git a/Externals/wxWidgets3/include/wx/windowid.h b/Externals/wxWidgets3/include/wx/windowid.h index bca21fb42f..0c174b5f0c 100644 --- a/Externals/wxWidgets3/include/wx/windowid.h +++ b/Externals/wxWidgets3/include/wx/windowid.h @@ -3,7 +3,6 @@ // Purpose: wxWindowID class - a class for managing window ids // Author: Brian Vanderburg II // Created: 2007-09-21 -// RCS-ID: $Id: windowid.h 51123 2008-01-09 04:08:33Z PC $ // Copyright: (c) 2007 Brian Vanderburg II // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -43,7 +42,7 @@ public: wxWindowIDRef(long id) { - Init(id); + Init(wxWindowID(id)); } wxWindowIDRef(const wxWindowIDRef& id) @@ -66,7 +65,7 @@ public: wxWindowIDRef& operator=(long id) { - Assign(id); + Assign(wxWindowID(id)); return *this; } diff --git a/Externals/wxWidgets3/include/wx/windowptr.h b/Externals/wxWidgets3/include/wx/windowptr.h new file mode 100644 index 0000000000..bebcf6ad8f --- /dev/null +++ b/Externals/wxWidgets3/include/wx/windowptr.h @@ -0,0 +1,63 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/windowptr.h +// Purpose: smart pointer for holding wxWindow instances +// Author: Vaclav Slavik +// Created: 2013-09-01 +// Copyright: (c) 2013 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOWPTR_H_ +#define _WX_WINDOWPTR_H_ + +#include "wx/sharedptr.h" + +// ---------------------------------------------------------------------------- +// wxWindowPtr: A smart pointer with correct wxWindow destruction. +// ---------------------------------------------------------------------------- + +namespace wxPrivate +{ + +struct wxWindowDeleter +{ + void operator()(wxWindow *win) + { + win->Destroy(); + } +}; + +} // namespace wxPrivate + +template +class wxWindowPtr : public wxSharedPtr +{ +public: + typedef T element_type; + + wxEXPLICIT wxWindowPtr(element_type* win) + : wxSharedPtr(win, wxPrivate::wxWindowDeleter()) + { + } + + wxWindowPtr() {} + wxWindowPtr(const wxWindowPtr& tocopy) : wxSharedPtr(tocopy) {} + + wxWindowPtr& operator=(const wxWindowPtr& tocopy) + { + wxSharedPtr::operator=(tocopy); + return *this; + } + + wxWindowPtr& operator=(element_type* win) + { + return operator=(wxWindowPtr(win)); + } + + void reset(T* ptr = NULL) + { + wxSharedPtr::reset(ptr, wxPrivate::wxWindowDeleter()); + } +}; + +#endif // _WX_WINDOWPTR_H_ diff --git a/Externals/wxWidgets3/include/wx/withimages.h b/Externals/wxWidgets3/include/wx/withimages.h index f8ce1c85e4..89120d3eb7 100644 --- a/Externals/wxWidgets3/include/wx/withimages.h +++ b/Externals/wxWidgets3/include/wx/withimages.h @@ -3,7 +3,6 @@ // Purpose: Declaration of a simple wxWithImages class. // Author: Vadim Zeitlin // Created: 2011-08-17 -// RCS-ID: $Id: withimages.h 68813 2011-08-21 14:52:16Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wizard.h b/Externals/wxWidgets3/include/wx/wizard.h index bd23ce582a..82dc438ac4 100644 --- a/Externals/wxWidgets3/include/wx/wizard.h +++ b/Externals/wxWidgets3/include/wx/wizard.h @@ -9,7 +9,6 @@ // Added wxWIZARD_HELP event // Robert Vazan (sizers) // Created: 15.08.99 -// RCS-ID: $Id: wizard.h 70630 2012-02-20 11:38:52Z JS $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -114,7 +113,7 @@ private: // wxWizardPageSimple just returns the pointers given to the ctor and is useful // to create a simple wizard where the order of pages never changes. // -// OTOH, it is also possible to dynamicly decide which page to return (i.e. +// OTOH, it is also possible to dynamically decide which page to return (i.e. // depending on the user's choices) as the wizard sample shows - in order to do // this, you must derive from wxWizardPage directly. // ---------------------------------------------------------------------------- @@ -147,7 +146,15 @@ public: void SetPrev(wxWizardPage *prev) { m_prev = prev; } void SetNext(wxWizardPage *next) { m_next = next; } - // a convenience function to make the pages follow each other + // Convenience functions to make the pages follow each other without having + // to call their SetPrev() or SetNext() explicitly. + wxWizardPageSimple& Chain(wxWizardPageSimple* next) + { + SetNext(next); + next->SetPrev(this); + return *next; + } + static void Chain(wxWizardPageSimple *first, wxWizardPageSimple *second) { wxCHECK_RET( first && second, diff --git a/Externals/wxWidgets3/include/wx/wrapsizer.h b/Externals/wxWidgets3/include/wx/wrapsizer.h index 728acc1d63..a4d6145002 100644 --- a/Externals/wxWidgets3/include/wx/wrapsizer.h +++ b/Externals/wxWidgets3/include/wx/wrapsizer.h @@ -3,7 +3,6 @@ // Purpose: provide wrapping sizer for layout (wxWrapSizer) // Author: Arne Steinarson // Created: 2008-05-08 -// RCS-ID: $Id: wrapsizer.h 53541 2008-05-10 17:48:44Z PC $ // Copyright: (c) Arne Steinarson // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wupdlock.h b/Externals/wxWidgets3/include/wx/wupdlock.h index eb7614be06..eb799a82e9 100644 --- a/Externals/wxWidgets3/include/wx/wupdlock.h +++ b/Externals/wxWidgets3/include/wx/wupdlock.h @@ -3,7 +3,6 @@ // Purpose: wxWindowUpdateLocker prevents window redrawing // Author: Vadim Zeitlin // Created: 2006-03-06 -// RCS-ID: $Id: wupdlock.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wx.h b/Externals/wxWidgets3/include/wx/wx.h index 0055778b01..9f6a42cb13 100644 --- a/Externals/wxWidgets3/include/wx/wx.h +++ b/Externals/wxWidgets3/include/wx/wx.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: wx.h 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wxchar.h b/Externals/wxWidgets3/include/wx/wxchar.h index 052b237fcb..597bbe1599 100644 --- a/Externals/wxWidgets3/include/wx/wxchar.h +++ b/Externals/wxWidgets3/include/wx/wxchar.h @@ -4,7 +4,6 @@ // Author: Joel Farley, Ove KÃ¥ven // Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee // Created: 1998/06/12 -// RCS-ID: $Id: wxchar.h 61961 2009-09-18 16:16:12Z VZ $ // Copyright: (c) 1998-2006 wxWidgets dev team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wxcrt.h b/Externals/wxWidgets3/include/wx/wxcrt.h index e464e36c80..dd579364fa 100644 --- a/Externals/wxWidgets3/include/wx/wxcrt.h +++ b/Externals/wxWidgets3/include/wx/wxcrt.h @@ -5,7 +5,6 @@ // Author: Joel Farley, Ove Kaaven // Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee, Vaclav Slavik // Created: 1998/06/12 -// RCS-ID: $Id: wxcrt.h 68594 2011-08-08 08:33:19Z VZ $ // Copyright: (c) 1998-2006 wxWidgets dev team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wxcrtbase.h b/Externals/wxWidgets3/include/wx/wxcrtbase.h index 4d3d9ebb22..16f6499229 100644 --- a/Externals/wxWidgets3/include/wx/wxcrtbase.h +++ b/Externals/wxWidgets3/include/wx/wxcrtbase.h @@ -5,7 +5,6 @@ * Author: Joel Farley, Ove Kaaven * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee * Created: 1998/06/12 - * RCS-ID: $Id: wxcrtbase.h 70345 2012-01-15 01:05:28Z VZ $ * Copyright: (c) 1998-2006 wxWidgets dev team * Licence: wxWindows licence */ @@ -63,7 +62,7 @@ define it ourselves for them */ #ifndef isascii - #if defined(__MWERKS__) || defined(__WX_STRICT_ANSI_GCC__) + #if defined(__WX_STRICT_ANSI_GCC__) #define wxNEED_ISASCII #elif defined(_WIN32_WCE) #if _WIN32_WCE <= 211 @@ -84,9 +83,7 @@ /* string.h functions */ #ifndef strdup - #if defined(__MWERKS__) && !defined(__MACH__) && (__MSL__ < 0x00008000) - #define wxNEED_STRDUP - #elif defined(__WXWINCE__) + #if defined(__WXWINCE__) #if _WIN32_WCE <= 211 #define wxNEED_STRDUP #endif @@ -105,21 +102,6 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #endif /* _WIN32_WCE */ -#if defined(__MWERKS__) - /* Metrowerks only has wide char support for OS X >= 10.3 */ - #if !defined(__DARWIN__) || \ - (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3) - #define wxHAVE_MWERKS_UNICODE - #endif - - #ifdef wxHAVE_MWERKS_UNICODE - #define HAVE_WPRINTF 1 - #define HAVE_WCSRTOMBS 1 - #define HAVE_VSWPRINTF 1 - #endif -#endif /* __MWERKS__ */ - - /* ------------------------------------------------------------------------- UTF-8 locale handling ------------------------------------------------------------------------- */ @@ -181,17 +163,15 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); #define wxCRT_StrxfrmW wcsxfrm #endif /* __WXWINCE__ */ -/* Almost all compiler have strdup(), but not quite all: CodeWarrior under - Mac and VC++ for Windows CE don't provide it. Another special case is gcc in - strict ANSI mode: normally it doesn't provide strdup() but MinGW does - provide it under MSVC-compatible name so test for it before checking - __WX_STRICT_ANSI_GCC__. */ -#if (defined(__VISUALC__) && __VISUALC__ >= 1400) || \ - defined(__MINGW32__) +/* Almost all compilers have strdup(), but VC++ and MinGW call it _strdup(). + And it's not available in MinGW strict ANSI mode nor under Windows CE. */ +#if (defined(__VISUALC__) && __VISUALC__ >= 1400) #define wxCRT_StrdupA _strdup -#elif !((defined(__MWERKS__) && defined(__WXMAC__)) || \ - defined(__WXWINCE__) || \ - defined(__WX_STRICT_ANSI_GCC__)) +#elif defined(__MINGW32__) + #ifndef __WX_STRICT_ANSI_GCC__ + #define wxCRT_StrdupA _strdup + #endif +#elif !defined(__WXWINCE__) #define wxCRT_StrdupA strdup #endif @@ -268,8 +248,7 @@ WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); defined(__EMX__) || defined(__DJGPP__) #define wxCRT_StricmpA stricmp #define wxCRT_StrnicmpA strnicmp -#elif defined(__SYMANTEC__) || defined(__VISUALC__) || \ - (defined(__MWERKS__) && defined(__INTEL__)) +#elif defined(__SYMANTEC__) || (defined(__VISUALC__) && !defined(__WXWINCE__)) #define wxCRT_StricmpA _stricmp #define wxCRT_StrnicmpA _strnicmp #elif defined(__UNIX__) || (defined(__GNUWIN32__) && !defined(__WX_STRICT_ANSI_GCC__)) @@ -574,14 +553,7 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); #define wxCRT_AtoiA atoi #define wxCRT_AtolA atol -#if defined(__MWERKS__) - #if defined(__MSL__) - #define wxCRT_AtofW watof - #define wxCRT_AtoiW watoi - #define wxCRT_AtolW watol - /* else: use ANSI versions */ - #endif -#elif defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__) +#if defined(wxHAVE_TCHAR_SUPPORT) && !defined(__WX_STRICT_ANSI_GCC__) #define wxCRT_AtoiW _wtoi #define wxCRT_AtolW _wtol /* _wtof doesn't exist */ @@ -593,21 +565,6 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); /* wcstoi doesn't exist */ #endif -/* - There are 2 unrelated problems with these functions under Mac: - a) Metrowerks MSL CRT implements them strictly in C99 sense and - doesn't support (very common) extension of allowing to call - mbstowcs(NULL, ...) which makes it pretty useless as you can't - know the size of the needed buffer - b) OS X <= 10.2 declares and even defined these functions but - doesn't really implement them -- they always return an error - - So use our own replacements in both cases. - */ -#if defined(__MWERKS__) && defined(__MSL__) - #define wxNEED_WX_MBSTOWCS -#endif - #ifdef __DARWIN__ #if !defined(__WXOSX_IPHONE__) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 #define wxNEED_WX_MBSTOWCS diff --git a/Externals/wxWidgets3/include/wx/wxcrtvararg.h b/Externals/wxWidgets3/include/wx/wxcrtvararg.h index fbc8efdc75..c3a306be85 100644 --- a/Externals/wxWidgets3/include/wx/wxcrtvararg.h +++ b/Externals/wxWidgets3/include/wx/wxcrtvararg.h @@ -5,7 +5,6 @@ // Author: Joel Farley, Ove KÃ¥ven // Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee // Created: 2007-02-19 -// RCS-ID: $Id: wxcrtvararg.h 61961 2009-09-18 16:16:12Z VZ $ // Copyright: (c) 2007 REA Elektronik GmbH // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -150,12 +149,8 @@ #define wxCRT_VsnprintfW _vsnwprintf #endif - /* - All versions of CodeWarrior supported by wxWidgets apparently - have both snprintf() and vsnprintf() - */ #if defined(HAVE_VSNPRINTF) \ - || defined(__MWERKS__) || defined(__WATCOMC__) + || defined(__WATCOMC__) #ifdef HAVE_BROKEN_VSNPRINTF_DECL #define wxCRT_VsnprintfA wx_fixed_vsnprintf #else diff --git a/Externals/wxWidgets3/include/wx/wxhtml.h b/Externals/wxWidgets3/include/wx/wxhtml.h index 795bb83212..9759dac060 100644 --- a/Externals/wxWidgets3/include/wx/wxhtml.h +++ b/Externals/wxWidgets3/include/wx/wxhtml.h @@ -2,7 +2,6 @@ // Name: wx/wxhtml.h // Purpose: wxHTML library for wxWidgets // Author: Vaclav Slavik -// RCS-ID: $Id: wxhtml.h 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1999 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/wxprec.h b/Externals/wxWidgets3/include/wx/wxprec.h index d1e3fe8a30..2b50dff4b3 100644 --- a/Externals/wxWidgets3/include/wx/wxprec.h +++ b/Externals/wxWidgets3/include/wx/wxprec.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: wxprec.h 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,6 @@ #if defined(__VISUALC__) || \ defined(__DMC__) || \ defined(__VISAGECPP__) || \ - defined(__MWERKS__) || \ defined(__WATCOMC__) || \ defined(__BORLANDC__) @@ -41,11 +39,13 @@ #include "wx/chartype.h" // include standard Windows headers -#if defined(__WXMSW__) +#if defined(__WINDOWS__) #include "wx/msw/wrapwin.h" + #include "wx/msw/private.h" +#endif +#if defined(__WXMSW__) #include "wx/msw/wrapcctl.h" #include "wx/msw/wrapcdlg.h" - #include "wx/msw/private.h" #include "wx/msw/missing.h" #endif diff --git a/Externals/wxWidgets3/include/wx/x11/private/wrapxkb.h b/Externals/wxWidgets3/include/wx/x11/private/wrapxkb.h new file mode 100644 index 0000000000..d13100e7dc --- /dev/null +++ b/Externals/wxWidgets3/include/wx/x11/private/wrapxkb.h @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/x11/private/wrapxkb.h +// Purpose: Private header wrapping X11/XKBlib.h inclusion. +// Author: Vadim Zeitlin +// Created: 2012-05-07 +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _X11_PRIVATE_WRAPXKB_H_ +#define _X11_PRIVATE_WRAPXKB_H_ + +#ifdef HAVE_X11_XKBLIB_H + /* under HP-UX and Solaris 2.6, at least, XKBlib.h defines structures with + * field named "explicit" - which is, of course, an error for a C++ + * compiler. To be on the safe side, just redefine it everywhere. */ + #define explicit __wx_explicit + + #include + + #undef explicit +#endif // HAVE_X11_XKBLIB_H + +#endif // _X11_PRIVATE_WRAPXKB_H_ diff --git a/Externals/wxWidgets3/include/wx/xlocale.h b/Externals/wxWidgets3/include/wx/xlocale.h index e8d02331a1..6a01ad311a 100644 --- a/Externals/wxWidgets3/include/wx/xlocale.h +++ b/Externals/wxWidgets3/include/wx/xlocale.h @@ -3,7 +3,6 @@ // Purpose: Header to provide some xlocale wrappers // Author: Brian Vanderburg II, Vadim Zeitlin // Created: 2008-01-07 -// RCS-ID: $Id: xlocale.h 64109 2010-04-22 14:16:12Z VZ $ // Copyright: (c) 2008 Brian Vanderburg II // 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/xpmdecod.h b/Externals/wxWidgets3/include/wx/xpmdecod.h index be97599289..68edc924e7 100644 --- a/Externals/wxWidgets3/include/wx/xpmdecod.h +++ b/Externals/wxWidgets3/include/wx/xpmdecod.h @@ -2,7 +2,6 @@ // Name: wx/xpmdecod.h // Purpose: wxXPMDecoder, XPM reader for wxImage and wxBitmap // Author: Vaclav Slavik -// CVS-ID: $Id: xpmdecod.h 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 2001 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/xpmhand.h b/Externals/wxWidgets3/include/wx/xpmhand.h index 4207f7da80..0952748d80 100644 --- a/Externals/wxWidgets3/include/wx/xpmhand.h +++ b/Externals/wxWidgets3/include/wx/xpmhand.h @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: -// RCS-ID: $Id: xpmhand.h 33948 2005-05-04 18:57:50Z JS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/xti.h b/Externals/wxWidgets3/include/wx/xti.h index abd8ae0934..75f594f494 100644 --- a/Externals/wxWidgets3/include/wx/xti.h +++ b/Externals/wxWidgets3/include/wx/xti.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xti.h 70396 2012-01-19 09:00:29Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/xti2.h b/Externals/wxWidgets3/include/wx/xti2.h index 70d3c154d8..16e5f212f1 100644 --- a/Externals/wxWidgets3/include/wx/xti2.h +++ b/Externals/wxWidgets3/include/wx/xti2.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xti2.h 66651 2011-01-08 10:22:30Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor ///////////////////////////////////////////////////////////////////////////// @@ -124,7 +123,7 @@ wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \ _DEFAULT_CONSTRUCTOR(name) \ _DEFAULT_CONVERTERS(name) \ void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \ -{ (*fn)( &wxANY_AS(data, name) ); } \ + { name o = wxANY_AS(data, name); (*fn)( &o ); } \ \ const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \ wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ diff --git a/Externals/wxWidgets3/include/wx/xtictor.h b/Externals/wxWidgets3/include/wx/xtictor.h index bb380703a7..6969463f38 100644 --- a/Externals/wxWidgets3/include/wx/xtictor.h +++ b/Externals/wxWidgets3/include/wx/xtictor.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xtictor.h 66626 2011-01-07 17:43:12Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/include/wx/xtihandler.h b/Externals/wxWidgets3/include/wx/xtihandler.h index aafa2ad1ca..c63ddb3a36 100644 --- a/Externals/wxWidgets3/include/wx/xtihandler.h +++ b/Externals/wxWidgets3/include/wx/xtihandler.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xtihandler.h 66651 2011-01-08 10:22:30Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor // Licence: wxWindows licence @@ -94,7 +93,7 @@ private: #define wxHANDLER(name,eventClassType) \ static wxHandlerInfo _handlerInfo##name( first, class_t::GetClassInfoStatic(), \ wxT(#name), (wxObjectEventFunction) (wxEventFunction) &name, \ - CLASSINFO( eventClassType ) ); + wxCLASSINFO( eventClassType ) ); #define wxBEGIN_HANDLERS_TABLE(theClass) \ wxHandlerInfo *theClass::GetHandlersStatic() \ diff --git a/Externals/wxWidgets3/include/wx/xtiprop.h b/Externals/wxWidgets3/include/wx/xtiprop.h index 75539f51e4..18626f2982 100644 --- a/Externals/wxWidgets3/include/wx/xtiprop.h +++ b/Externals/wxWidgets3/include/wx/xtiprop.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xtiprop.h 70398 2012-01-19 09:50:46Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor // Licence: wxWindows licence @@ -177,7 +176,7 @@ public: if ( m_setter ) m_setter->Set( object, value ); else - wxLogError( _("SetProperty called w/o valid setter") ); + wxLogError( wxGetTranslation("SetProperty called w/o valid setter") ); } // Getting a simple property (non-collection) @@ -186,7 +185,7 @@ public: if ( m_getter ) m_getter->Get( object, result ); else - wxLogError( _("GetProperty called w/o valid getter") ); + wxLogError( wxGetTranslation("GetProperty called w/o valid getter") ); } // Adding an element to a collection property @@ -195,7 +194,7 @@ public: if ( m_adder ) m_adder->Add( object, value ); else - wxLogError( _("AddToPropertyCollection called w/o valid adder") ); + wxLogError( wxGetTranslation("AddToPropertyCollection called w/o valid adder") ); } // Getting a collection property @@ -204,7 +203,7 @@ public: if ( m_collectionGetter ) m_collectionGetter->Get( obj, result); else - wxLogError( _("GetPropertyCollection called w/o valid collection getter") ); + wxLogError( wxGetTranslation("GetPropertyCollection called w/o valid collection getter") ); } virtual bool HasSetter() const { return m_setter != NULL; } @@ -257,14 +256,14 @@ public: virtual void AddToPropertyCollection(wxObject *WXUNUSED(object), const wxAny &WXUNUSED(value)) const { - wxLogError( _("AddToPropertyCollection called on a generic accessor") ); + wxLogError( wxGetTranslation("AddToPropertyCollection called on a generic accessor") ); } // Getting a collection property virtual void GetPropertyCollection( const wxObject *WXUNUSED(obj), wxAnyList &WXUNUSED(result)) const { - wxLogError ( _("GetPropertyCollection called on a generic accessor") ); + wxLogError ( wxGetTranslation("GetPropertyCollection called on a generic accessor") ); } private: @@ -536,13 +535,13 @@ class WXDLLIMPEXP_FWD_BASE wxStringToAnyHashMap : public wxStringToAnyHashMapBas &_accessor##pname, flags, help, group ); #define wxEVENT_PROPERTY( name, eventType, eventClass ) \ - static wxEventSourceTypeInfo _typeInfo##name( eventType, CLASSINFO( eventClass ) ); \ + static wxEventSourceTypeInfo _typeInfo##name( eventType, wxCLASSINFO( eventClass ) ); \ static wxPropertyInfo _propertyInfo##name( first,class_t::GetClassInfoStatic(), \ wxT(#name), &_typeInfo##name, NULL, wxAny() ); #define wxEVENT_RANGE_PROPERTY( name, eventType, lastEventType, eventClass ) \ static wxEventSourceTypeInfo _typeInfo##name( eventType, lastEventType, \ - CLASSINFO( eventClass ) ); \ + wxCLASSINFO( eventClass ) ); \ static wxPropertyInfo _propertyInfo##name( first, class_t::GetClassInfoStatic(), \ wxT(#name), &_typeInfo##name, NULL, wxAny() ); diff --git a/Externals/wxWidgets3/include/wx/xtistrm.h b/Externals/wxWidgets3/include/wx/xtistrm.h index e304803494..0621ead1ea 100644 --- a/Externals/wxWidgets3/include/wx/xtistrm.h +++ b/Externals/wxWidgets3/include/wx/xtistrm.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 27/07/03 -// RCS-ID: $Id: xtistrm.h 70396 2012-01-19 09:00:29Z SC $ // Copyright: (c) 2003 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/xtitypes.h b/Externals/wxWidgets3/include/wx/xtitypes.h index 6724bf4c35..afd5c07b45 100644 --- a/Externals/wxWidgets3/include/wx/xtitypes.h +++ b/Externals/wxWidgets3/include/wx/xtitypes.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Francesco Montorsi // Created: 27/07/03 -// RCS-ID: $Id: xtitypes.h 70384 2012-01-18 14:05:39Z SC $ // Copyright: (c) 1997 Julian Smart // (c) 2003 Stefan Csomor // Licence: wxWindows licence @@ -236,7 +235,7 @@ void wxFlagsToString( wxString &s, const e& data ) #define wxBEGIN_FLAGS( e ) \ wxEnumMemberData s_enumDataMembers##e[] = { -#define wxFLAGS_MEMBER( v ) { wxT(#v), v }, +#define wxFLAGS_MEMBER( v ) { wxT(#v), static_cast(v) }, #define wxEND_FLAGS( e ) \ { NULL, 0 } }; \ diff --git a/Externals/wxWidgets3/include/wx/xtixml.h b/Externals/wxWidgets3/include/wx/xtixml.h index 5eaf03fa51..100e0653e1 100644 --- a/Externals/wxWidgets3/include/wx/xtixml.h +++ b/Externals/wxWidgets3/include/wx/xtixml.h @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 27/07/03 -// RCS-ID: $Id: xtixml.h 70397 2012-01-19 09:45:49Z SC $ // Copyright: (c) 2003 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/zipstrm.h b/Externals/wxWidgets3/include/wx/zipstrm.h index 0d71075225..9cd7631944 100644 --- a/Externals/wxWidgets3/include/wx/zipstrm.h +++ b/Externals/wxWidgets3/include/wx/zipstrm.h @@ -2,7 +2,6 @@ // Name: wx/zipstrm.h // Purpose: Streams for Zip files // Author: Mike Wetherell -// RCS-ID: $Id: zipstrm.h 58757 2009-02-08 11:45:59Z VZ $ // Copyright: (c) Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/include/wx/zstream.h b/Externals/wxWidgets3/include/wx/zstream.h index 421116e45b..193bb79d4e 100644 --- a/Externals/wxWidgets3/include/wx/zstream.h +++ b/Externals/wxWidgets3/include/wx/zstream.h @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Mike Wetherell // Created: 11/07/98 -// RCS-ID: $Id: zstream.h 66259 2010-11-25 00:53:44Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/aui/auibar.cpp b/Externals/wxWidgets3/src/aui/auibar.cpp index b6654e2fb4..2bfcbe1b6a 100644 --- a/Externals/wxWidgets3/src/aui/auibar.cpp +++ b/Externals/wxWidgets3/src/aui/auibar.cpp @@ -1,3 +1,4 @@ +// XXX comex: scale support /////////////////////////////////////////////////////////////////////////////// // Name: src/aui/auibar.cpp @@ -5,7 +6,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: auibar.cpp 70748 2012-02-29 13:58:52Z VZ $ // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -44,11 +44,11 @@ WX_DEFINE_OBJARRAY(wxAuiToolBarItemArray) -wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); IMPLEMENT_CLASS(wxAuiToolBar, wxControl) @@ -101,7 +101,7 @@ public: bool ProcessEvent(wxEvent& evt) { - if (evt.GetEventType() == wxEVT_COMMAND_MENU_SELECTED) + if (evt.GetEventType() == wxEVT_MENU) { m_lastId = evt.GetId(); return true; @@ -214,6 +214,19 @@ void wxAuiDefaultToolBarArt::DrawBackground( dc.GradientFillLinear(rect, startColour, endColour, wxSOUTH); } +void wxAuiDefaultToolBarArt::DrawPlainBackground(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& _rect) +{ + wxRect rect = _rect; + rect.height++; + + dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + + dc.DrawRectangle(rect.GetX() - 1, rect.GetY() - 1, + rect.GetWidth() + 2, rect.GetHeight() + 1); +} + void wxAuiDefaultToolBarArt::DrawLabel( wxDC& dc, wxWindow* WXUNUSED(wnd), @@ -267,11 +280,11 @@ void wxAuiDefaultToolBarArt::DrawButton( { bmpX = rect.x + (rect.width/2) - - (item.GetBitmap().GetWidth()/2); + (item.GetBitmap().GetScaledWidth()/2); bmpY = rect.y + ((rect.height-textHeight)/2) - - (item.GetBitmap().GetHeight()/2); + (item.GetBitmap().GetScaledHeight()/2); textX = rect.x + (rect.width/2) - (textWidth/2) + 1; textY = rect.y + rect.height - textHeight - 1; @@ -282,9 +295,9 @@ void wxAuiDefaultToolBarArt::DrawButton( bmpY = rect.y + (rect.height/2) - - (item.GetBitmap().GetHeight()/2); + (item.GetBitmap().GetScaledHeight()/2); - textX = bmpX + 3 + item.GetBitmap().GetWidth(); + textX = bmpX + 3 + item.GetBitmap().GetScaledWidth(); textY = rect.y + (rect.height/2) - (textHeight/2); @@ -313,7 +326,7 @@ void wxAuiDefaultToolBarArt::DrawButton( } else if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED) { - // it's important to put this code in an else statment after the + // it's important to put this code in an else statement after the // hover, otherwise hovers won't draw properly for checked items dc.SetPen(wxPen(m_highlightColour)); dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(170))); @@ -378,20 +391,20 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton( dropBmpX = dropDownRect.x + (dropDownRect.width/2) - - (m_buttonDropDownBmp.GetWidth()/2); + (m_buttonDropDownBmp.GetScaledWidth()/2); dropBmpY = dropDownRect.y + (dropDownRect.height/2) - - (m_buttonDropDownBmp.GetHeight()/2); + (m_buttonDropDownBmp.GetScaledHeight()/2); if (m_textOrientation == wxAUI_TBTOOL_TEXT_BOTTOM) { bmpX = buttonRect.x + (buttonRect.width/2) - - (item.GetBitmap().GetWidth()/2); + (item.GetBitmap().GetScaledWidth()/2); bmpY = buttonRect.y + ((buttonRect.height-textHeight)/2) - - (item.GetBitmap().GetHeight()/2); + (item.GetBitmap().GetScaledHeight()/2); textX = rect.x + (rect.width/2) - (textWidth/2) + 1; textY = rect.y + rect.height - textHeight - 1; @@ -402,9 +415,9 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton( bmpY = rect.y + (rect.height/2) - - (item.GetBitmap().GetHeight()/2); + (item.GetBitmap().GetScaledHeight()/2); - textX = bmpX + 3 + item.GetBitmap().GetWidth(); + textX = bmpX + 3 + item.GetBitmap().GetScaledWidth(); textY = rect.y + (rect.height/2) - (textHeight/2); @@ -541,8 +554,8 @@ wxSize wxAuiDefaultToolBarArt::GetToolSize( if (!item.GetBitmap().IsOk() && !(m_flags & wxAUI_TB_TEXT)) return wxSize(16,16); - int width = item.GetBitmap().GetWidth(); - int height = item.GetBitmap().GetHeight(); + int width = item.GetBitmap().GetScaledWidth(); + int height = item.GetBitmap().GetScaledHeight(); if (m_flags & wxAUI_TB_TEXT) { @@ -682,8 +695,8 @@ void wxAuiDefaultToolBarArt::DrawOverflowButton(wxDC& dc, } } - int x = rect.x+1+(rect.width-m_overflowBmp.GetWidth())/2; - int y = rect.y+1+(rect.height-m_overflowBmp.GetHeight())/2; + int x = rect.x+1+(rect.width-m_overflowBmp.GetScaledWidth())/2; + int y = rect.y+1+(rect.height-m_overflowBmp.GetScaledHeight())/2; dc.DrawBitmap(m_overflowBmp, x, y, true); } @@ -798,23 +811,13 @@ BEGIN_EVENT_TABLE(wxAuiToolBar, wxControl) EVT_SET_CURSOR(wxAuiToolBar::OnSetCursor) END_EVENT_TABLE() - -wxAuiToolBar::wxAuiToolBar(wxWindow* parent, - wxWindowID id, - const wxPoint& position, - const wxSize& size, - long style) - : wxControl(parent, - id, - position, - size, - style | wxBORDER_NONE) +void wxAuiToolBar::Init() { m_sizer = new wxBoxSizer(wxHORIZONTAL); m_buttonWidth = -1; m_buttonHeight = -1; m_sizerElementCount = 0; - m_actionPos = wxPoint(-1,-1); + m_actionPos = wxDefaultPosition; m_actionItem = NULL; m_tipItem = NULL; m_art = new wxAuiDefaultToolBarArt; @@ -824,15 +827,34 @@ wxAuiToolBar::wxAuiToolBar(wxWindow* parent, m_gripperSizerItem = NULL; m_overflowSizerItem = NULL; m_dragging = false; + m_gripperVisible = false; + m_overflowVisible = false; + m_overflowState = 0; + m_orientation = wxHORIZONTAL; +} + +bool wxAuiToolBar::Create(wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) +{ + style = style|wxBORDER_NONE; + + if (!wxControl::Create(parent, id, pos, size, style)) + return false; + + m_windowStyle = style; + + m_gripperVisible = (style & wxAUI_TB_GRIPPER) ? true : false; + m_overflowVisible = (style & wxAUI_TB_OVERFLOW) ? true : false; + m_orientation = GetOrientation(style); if (m_orientation == wxBOTH) { m_orientation = wxHORIZONTAL; } - m_style = style | wxBORDER_NONE; - m_gripperVisible = (m_style & wxAUI_TB_GRIPPER) ? true : false; - m_overflowVisible = (m_style & wxAUI_TB_OVERFLOW) ? true : false; - m_overflowState = 0; + SetMargins(5, 5, 2, 2); SetFont(*wxNORMAL_FONT); SetArtFlags(); @@ -840,8 +862,9 @@ wxAuiToolBar::wxAuiToolBar(wxWindow* parent, if (style & wxAUI_TB_HORZ_LAYOUT) SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT); SetBackgroundStyle(wxBG_STYLE_CUSTOM); -} + return true; +} wxAuiToolBar::~wxAuiToolBar() { @@ -857,20 +880,20 @@ void wxAuiToolBar::SetWindowStyleFlag(long style) wxControl::SetWindowStyleFlag(style); - m_style = style; + m_windowStyle = style; if (m_art) { SetArtFlags(); } - if (m_style & wxAUI_TB_GRIPPER) + if (m_windowStyle & wxAUI_TB_GRIPPER) m_gripperVisible = true; else m_gripperVisible = false; - if (m_style & wxAUI_TB_OVERFLOW) + if (m_windowStyle & wxAUI_TB_OVERFLOW) m_overflowVisible = true; else m_overflowVisible = false; @@ -881,11 +904,6 @@ void wxAuiToolBar::SetWindowStyleFlag(long style) SetToolTextOrientation(wxAUI_TBTOOL_TEXT_BOTTOM); } -long wxAuiToolBar::GetWindowStyleFlag() const -{ - return m_style; -} - void wxAuiToolBar::SetArtProvider(wxAuiToolBarArt* art) { delete m_art; @@ -1256,16 +1274,16 @@ void wxAuiToolBar::SetToolDropDown(int tool_id, bool dropdown) if (!item) return; - item->m_dropDown = dropdown; + item->SetHasDropDown(dropdown); } bool wxAuiToolBar::GetToolDropDown(int tool_id) const { wxAuiToolBarItem* item = FindTool(tool_id); if (!item) - return 0; + return false; - return item->m_dropDown; + return item->HasDropDown(); } void wxAuiToolBar::SetToolSticky(int tool_id, bool sticky) @@ -1368,9 +1386,9 @@ void wxAuiToolBar::SetGripperVisible(bool visible) { m_gripperVisible = visible; if (visible) - m_style |= wxAUI_TB_GRIPPER; + m_windowStyle |= wxAUI_TB_GRIPPER; else - m_style &= ~wxAUI_TB_GRIPPER; + m_windowStyle &= ~wxAUI_TB_GRIPPER; Realize(); Refresh(false); } @@ -1385,9 +1403,9 @@ void wxAuiToolBar::SetOverflowVisible(bool visible) { m_overflowVisible = visible; if (visible) - m_style |= wxAUI_TB_OVERFLOW; + m_windowStyle |= wxAUI_TB_OVERFLOW; else - m_style &= ~wxAUI_TB_OVERFLOW; + m_windowStyle &= ~wxAUI_TB_OVERFLOW; Refresh(false); } @@ -1406,6 +1424,9 @@ bool wxAuiToolBar::SetFont(const wxFont& font) void wxAuiToolBar::SetHoverItem(wxAuiToolBarItem* pitem) { + if (pitem && (pitem->m_state & wxAUI_BUTTON_STATE_DISABLED)) + pitem = NULL; + wxAuiToolBarItem* former_hover = NULL; size_t i, count; @@ -1671,7 +1692,7 @@ wxSize wxAuiToolBar::GetHintSize(int dock_direction) const bool wxAuiToolBar::IsPaneValid(const wxAuiPaneInfo& pane) const { - return IsPaneValid(m_style, pane); + return IsPaneValid(m_windowStyle, pane); } bool wxAuiToolBar::IsPaneValid(long style, const wxAuiPaneInfo& pane) @@ -1705,7 +1726,7 @@ bool wxAuiToolBar::IsPaneValid(long style) const void wxAuiToolBar::SetArtFlags() const { - unsigned int artflags = m_style & ~wxAUI_ORIENTATION_MASK; + unsigned int artflags = m_windowStyle & ~wxAUI_ORIENTATION_MASK; if (m_orientation == wxVERTICAL) { artflags |= wxAUI_TB_VERTICAL; @@ -1940,7 +1961,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal) vert_sizer->AddStretchSpacer(1); ctrl_m_sizerItem = vert_sizer->Add(item.m_window, 0, wxEXPAND); vert_sizer->AddStretchSpacer(1); - if ( (m_style & wxAUI_TB_TEXT) && + if ( (m_windowStyle & wxAUI_TB_TEXT) && m_toolTextOrientation == wxAUI_TBTOOL_TEXT_BOTTOM && !item.GetLabel().empty() ) { @@ -1990,7 +2011,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal) // add drop down area m_overflowSizerItem = NULL; - if (m_style & wxAUI_TB_OVERFLOW) + if (m_windowStyle & wxAUI_TB_OVERFLOW) { int overflow_size = m_art->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE); if (overflow_size > 0 && m_overflowVisible) @@ -2057,7 +2078,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal) m_minWidth = size.x; m_minHeight = size.y; - if ((m_style & wxAUI_TB_NO_AUTORESIZE) == 0) + if ((m_windowStyle & wxAUI_TB_NO_AUTORESIZE) == 0) { wxSize curSize = GetClientSize(); wxSize new_size = GetMinSize(); @@ -2277,7 +2298,7 @@ void wxAuiToolBar::OnIdle(wxIdleEvent& evt) // pane state member is public, so it might have been changed // without going through wxPaneInfo::SetFlag() check bool ok = pane.IsOk(); - wxCHECK2_MSG(!ok || IsPaneValid(m_style, pane), ok = false, + wxCHECK2_MSG(!ok || IsPaneValid(m_windowStyle, pane), ok = false, "window settings and pane settings are incompatible"); if (ok) { @@ -2299,7 +2320,7 @@ void wxAuiToolBar::OnIdle(wxIdleEvent& evt) } } else if (pane.IsResizable() && - GetOrientation(m_style) == wxBOTH) + GetOrientation(m_windowStyle) == wxBOTH) { // changing orientation in OnSize causes havoc int x, y; @@ -2359,8 +2380,10 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) bool horizontal = m_orientation == wxHORIZONTAL; - - m_art->DrawBackground(dc, this, cli_rect); + if (m_windowStyle & wxAUI_TB_PLAIN_BACKGROUND) + m_art->DrawPlainBackground(dc, this, cli_rect); + else + m_art->DrawBackground(dc, this, cli_rect); int gripperSize = m_art->GetElementSize(wxAUI_TBART_GRIPPER_SIZE); int dropdown_size = m_art->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE); @@ -2403,41 +2426,36 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) break; } - if (item.m_kind == wxITEM_SEPARATOR) + switch ( item.m_kind ) { - // draw a separator - m_art->DrawSeparator(dc, this, item_rect); - } - else if (item.m_kind == wxITEM_LABEL) - { - // draw a text label only - m_art->DrawLabel(dc, this, item, item_rect); - } - else if (item.m_kind == wxITEM_NORMAL) - { - // draw a regular button or dropdown button - if (!item.m_dropDown) + case wxITEM_NORMAL: + // draw a regular or dropdown button + if (!item.m_dropDown) + m_art->DrawButton(dc, this, item, item_rect); + else + m_art->DrawDropDownButton(dc, this, item, item_rect); + break; + + case wxITEM_CHECK: + case wxITEM_RADIO: + // draw a toggle button m_art->DrawButton(dc, this, item, item_rect); - else - m_art->DrawDropDownButton(dc, this, item, item_rect); - } - else if (item.m_kind == wxITEM_CHECK) - { - // draw either a regular or dropdown toggle button - if (!item.m_dropDown) - m_art->DrawButton(dc, this, item, item_rect); - else - m_art->DrawDropDownButton(dc, this, item, item_rect); - } - else if (item.m_kind == wxITEM_RADIO) - { - // draw a toggle button - m_art->DrawButton(dc, this, item, item_rect); - } - else if (item.m_kind == wxITEM_CONTROL) - { - // draw the control's label - m_art->DrawControlLabel(dc, this, item, item_rect); + break; + + case wxITEM_SEPARATOR: + // draw a separator + m_art->DrawSeparator(dc, this, item_rect); + break; + + case wxITEM_LABEL: + // draw a text label only + m_art->DrawLabel(dc, this, item, item_rect); + break; + + case wxITEM_CONTROL: + // draw the control's label + m_art->DrawControlLabel(dc, this, item, item_rect); + break; } // fire a signal to see if the item wants to be custom-rendered @@ -2488,7 +2506,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) m_overflowVisible && overflow_rect.Contains(evt.m_x, evt.m_y)) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, -1); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_OVERFLOW_CLICK, -1); e.SetEventObject(this); e.SetToolId(-1); e.SetClickPoint(wxPoint(evt.GetX(), evt.GetY())); @@ -2527,9 +2545,9 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) Refresh(false); if (res != -1) { - wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, res); - e.SetEventObject(this); - GetParent()->GetEventHandler()->ProcessEvent(e); + wxCommandEvent event(wxEVT_MENU, res); + event.SetEventObject(this); + GetParent()->GetEventHandler()->ProcessEvent(event); } } @@ -2553,7 +2571,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) UnsetToolTip(); // fire the tool dropdown event - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, m_actionItem->m_toolId); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, m_actionItem->m_toolId); e.SetEventObject(this); e.SetToolId(m_actionItem->m_toolId); @@ -2580,6 +2598,11 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) if(!GetEventHandler()->ProcessEvent(e) || e.GetSkipped()) CaptureMouse(); + // Ensure hovered item is really ok, as mouse may have moved during + // event processing + wxPoint cursor_pos_after_evt = ScreenToClient(wxGetMousePosition()); + SetHoverItem(FindToolByPosition(cursor_pos_after_evt.x, cursor_pos_after_evt.y)); + DoIdleUpdate(); } } @@ -2591,11 +2614,9 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) SetPressedItem(NULL); - wxAuiToolBarItem* hitItem = FindToolByPosition(evt.GetX(), evt.GetY()); - if (hitItem && !(hitItem->m_state & wxAUI_BUTTON_STATE_DISABLED)) - { - SetHoverItem(hitItem); - } + wxAuiToolBarItem* hitItem; + hitItem = FindToolByPosition(evt.GetX(), evt.GetY()); + SetHoverItem(hitItem); if (m_dragging) { @@ -2613,7 +2634,7 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) { UnsetToolTip(); - wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_actionItem->m_toolId); + wxCommandEvent e(wxEVT_MENU, m_actionItem->m_toolId); e.SetEventObject(this); if (hitItem->m_kind == wxITEM_CHECK || hitItem->m_kind == wxITEM_RADIO) @@ -2636,6 +2657,12 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) ReleaseMouse(); GetEventHandler()->ProcessEvent(e); + + // Ensure hovered item is really ok, as mouse may have moved during + // event processing + wxPoint cursor_pos_after_evt = ScreenToClient(wxGetMousePosition()); + SetHoverItem(FindToolByPosition(cursor_pos_after_evt.x, cursor_pos_after_evt.y)); + DoIdleUpdate(); } else @@ -2686,7 +2713,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) if (m_actionItem && hitItem == m_actionItem) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, m_actionItem->m_toolId); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_RIGHT_CLICK, m_actionItem->m_toolId); e.SetEventObject(this); e.SetToolId(m_actionItem->m_toolId); e.SetClickPoint(m_actionPos); @@ -2696,7 +2723,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) else { // right-clicked on the invalid area of the toolbar - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, -1); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_RIGHT_CLICK, -1); e.SetEventObject(this); e.SetToolId(-1); e.SetClickPoint(m_actionPos); @@ -2757,7 +2784,7 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) { if (hitItem->m_kind == wxITEM_NORMAL) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, m_actionItem->m_toolId); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_MIDDLE_CLICK, m_actionItem->m_toolId); e.SetEventObject(this); e.SetToolId(m_actionItem->m_toolId); e.SetClickPoint(m_actionPos); @@ -2781,7 +2808,7 @@ void wxAuiToolBar::OnMotion(wxMouseEvent& evt) { // TODO: sending this event only makes sense if there is an 'END_DRAG' // event sent sometime in the future (see OnLeftUp()) - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, GetId()); + wxAuiToolBarEvent e(wxEVT_AUITOOLBAR_BEGIN_DRAG, GetId()); e.SetEventObject(this); e.SetToolId(m_actionItem->m_toolId); m_dragging = GetEventHandler()->ProcessEvent(e) && !e.GetSkipped(); @@ -2808,10 +2835,7 @@ void wxAuiToolBar::OnMotion(wxMouseEvent& evt) } else { - if (hitItem && (hitItem->m_state & wxAUI_BUTTON_STATE_DISABLED)) - SetHoverItem(NULL); - else - SetHoverItem(hitItem); + SetHoverItem(hitItem); // tooltips handling wxAuiToolBarItem* packingHitItem; diff --git a/Externals/wxWidgets3/src/aui/auibook.cpp b/Externals/wxWidgets3/src/aui/auibook.cpp index f299944023..2d1787ee0a 100644 --- a/Externals/wxWidgets3/src/aui/auibook.cpp +++ b/Externals/wxWidgets3/src/aui/auibook.cpp @@ -2,7 +2,7 @@ // Name: src/aui/auibook.cpp // Purpose: wxaui: wx advanced user interface - notebook // Author: Benjamin I. Williams -// Modified by: +// Modified by: Jens Lody // Created: 2006-06-28 // Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 @@ -24,14 +24,11 @@ #ifndef WX_PRECOMP #include "wx/settings.h" - #include "wx/image.h" - #include "wx/menu.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" #endif #include "wx/aui/tabmdi.h" -#include "wx/dcbuffer.h" - -#include "wx/renderer.h" #ifdef __WXMAC__ #include "wx/osx/private.h" @@ -41,1256 +38,28 @@ WX_DEFINE_OBJARRAY(wxAuiNotebookPageArray) WX_DEFINE_OBJARRAY(wxAuiTabContainerButtonArray) -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEvent); -wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_PAGE_CLOSED, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_CANCEL_DRAG, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_DRAG_DONE, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEvent); +wxDEFINE_EVENT(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebookEvent); IMPLEMENT_CLASS(wxAuiNotebook, wxControl) IMPLEMENT_CLASS(wxAuiTabCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxBookCtrlEvent) - - - -// these functions live in dockart.cpp -- they'll eventually -// be moved to a new utility cpp file - -wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, - const wxColour& color); - -wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size); - -static void DrawButtons(wxDC& dc, - const wxRect& _rect, - const wxBitmap& bmp, - const wxColour& bkcolour, - int button_state) -{ - wxRect rect = _rect; - - if (button_state == wxAUI_BUTTON_STATE_PRESSED) - { - rect.x++; - rect.y++; - } - - if (button_state == wxAUI_BUTTON_STATE_HOVER || - button_state == wxAUI_BUTTON_STATE_PRESSED) - { - dc.SetBrush(wxBrush(bkcolour.ChangeLightness(120))); - dc.SetPen(wxPen(bkcolour.ChangeLightness(75))); - - // draw the background behind the button - dc.DrawRectangle(rect.x, rect.y, 15, 15); - } - - // draw the button itself - dc.DrawBitmap(bmp, rect.x, rect.y, true); -} - -static void IndentPressedBitmap(wxRect* rect, int button_state) -{ - if (button_state == wxAUI_BUTTON_STATE_PRESSED) - { - rect->x++; - rect->y++; - } -} - - - -// -- GUI helper classes and functions -- - -class wxAuiCommandCapture : public wxEvtHandler -{ -public: - - wxAuiCommandCapture() { m_lastId = 0; } - int GetCommandId() const { return m_lastId; } - - bool ProcessEvent(wxEvent& evt) - { - if (evt.GetEventType() == wxEVT_COMMAND_MENU_SELECTED) - { - m_lastId = evt.GetId(); - return true; - } - - if (GetNextHandler()) - return GetNextHandler()->ProcessEvent(evt); - - return false; - } - -private: - int m_lastId; -}; - - -// -- bitmaps -- - -#if defined( __WXMAC__ ) - static const unsigned char close_bits[]={ - 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, - 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, - 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; -#elif defined( __WXGTK__) - static const unsigned char close_bits[]={ - 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, - 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, - 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#else - static const unsigned char close_bits[]={ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9, - 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -#endif - -static const unsigned char left_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0xfe, - 0x1f, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -static const unsigned char right_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9f, 0xff, 0x1f, 0xff, - 0x1f, 0xfe, 0x1f, 0xfc, 0x1f, 0xfe, 0x1f, 0xff, 0x9f, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -static const unsigned char list_bits[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0f, 0xf8, 0xff, 0xff, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - - - - -// -- wxAuiDefaultTabArt class implementation -- - -wxAuiDefaultTabArt::wxAuiDefaultTabArt() -{ - m_normalFont = *wxNORMAL_FONT; - m_selectedFont = *wxNORMAL_FONT; - m_selectedFont.SetWeight(wxBOLD); - m_measuringFont = m_selectedFont; - - m_fixedTabWidth = 100; - m_tabCtrlHeight = 0; - -#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON - wxColor baseColour = wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground)); -#else - wxColor baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); -#endif - - // the baseColour is too pale to use as our base colour, - // so darken it a bit -- - if ((255-baseColour.Red()) + - (255-baseColour.Green()) + - (255-baseColour.Blue()) < 60) - { - baseColour = baseColour.ChangeLightness(92); - } - - m_activeColour = baseColour; - m_baseColour = baseColour; - wxColor borderColour = baseColour.ChangeLightness(75); - - m_borderPen = wxPen(borderColour); - m_baseColourPen = wxPen(m_baseColour); - m_baseColourBrush = wxBrush(m_baseColour); - - m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - - m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - - m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - - m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); - - m_flags = 0; -} - -wxAuiDefaultTabArt::~wxAuiDefaultTabArt() -{ -} - -wxAuiTabArt* wxAuiDefaultTabArt::Clone() -{ - return new wxAuiDefaultTabArt(*this); -} - -void wxAuiDefaultTabArt::SetFlags(unsigned int flags) -{ - m_flags = flags; -} - -void wxAuiDefaultTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, - size_t tab_count) -{ - m_fixedTabWidth = 100; - - int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; - - if (m_flags & wxAUI_NB_CLOSE_BUTTON) - tot_width -= m_activeCloseBmp.GetWidth(); - if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) - tot_width -= m_activeWindowListBmp.GetWidth(); - - if (tab_count > 0) - { - m_fixedTabWidth = tot_width/(int)tab_count; - } - - - if (m_fixedTabWidth < 100) - m_fixedTabWidth = 100; - - if (m_fixedTabWidth > tot_width/2) - m_fixedTabWidth = tot_width/2; - - if (m_fixedTabWidth > 220) - m_fixedTabWidth = 220; - - m_tabCtrlHeight = tab_ctrl_size.y; -} - - -void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& rect) -{ - // draw background - - wxColor top_color = m_baseColour.ChangeLightness(90); - wxColor bottom_color = m_baseColour.ChangeLightness(170); - wxRect r; - - if (m_flags &wxAUI_NB_BOTTOM) - r = wxRect(rect.x, rect.y, rect.width+2, rect.height); - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - r = wxRect(rect.x, rect.y, rect.width+2, rect.height-3); - - dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); - - - // draw base lines - - dc.SetPen(m_borderPen); - int y = rect.GetHeight(); - int w = rect.GetWidth(); - - if (m_flags &wxAUI_NB_BOTTOM) - { - dc.SetBrush(wxBrush(bottom_color)); - dc.DrawRectangle(-1, 0, w+2, 4); - } - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - { - dc.SetBrush(m_baseColourBrush); - dc.DrawRectangle(-1, y-4, w+2, 4); - } -} - - -// DrawTab() draws an individual tab. -// -// dc - output dc -// in_rect - rectangle the tab should be confined to -// caption - tab's caption -// active - whether or not the tab is active -// out_rect - actual output rectangle -// x_extent - the advance x; where the next tab should start - -void wxAuiDefaultTabArt::DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& page, - const wxRect& in_rect, - int close_button_state, - wxRect* out_tab_rect, - wxRect* out_button_rect, - int* x_extent) -{ - wxCoord normal_textx, normal_texty; - wxCoord selected_textx, selected_texty; - wxCoord texty; - - // if the caption is empty, measure some temporary text - wxString caption = page.caption; - if (caption.empty()) - caption = wxT("Xj"); - - dc.SetFont(m_selectedFont); - dc.GetTextExtent(caption, &selected_textx, &selected_texty); - - dc.SetFont(m_normalFont); - dc.GetTextExtent(caption, &normal_textx, &normal_texty); - - // figure out the size of the tab - wxSize tab_size = GetTabSize(dc, - wnd, - page.caption, - page.bitmap, - page.active, - close_button_state, - x_extent); - - wxCoord tab_height = m_tabCtrlHeight - 3; - wxCoord tab_width = tab_size.x; - wxCoord tab_x = in_rect.x; - wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - - - caption = page.caption; - - - // select pen, brush and font for the tab to be drawn - - if (page.active) - { - dc.SetFont(m_selectedFont); - texty = selected_texty; - } - else - { - dc.SetFont(m_normalFont); - texty = normal_texty; - } - - - // create points that will make the tab outline - - int clip_width = tab_width; - if (tab_x + clip_width > in_rect.x + in_rect.width) - clip_width = (in_rect.x + in_rect.width) - tab_x; - -/* - wxPoint clip_points[6]; - clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); - clip_points[1] = wxPoint(tab_x, tab_y+2); - clip_points[2] = wxPoint(tab_x+2, tab_y); - clip_points[3] = wxPoint(tab_x+clip_width-1, tab_y); - clip_points[4] = wxPoint(tab_x+clip_width+1, tab_y+2); - clip_points[5] = wxPoint(tab_x+clip_width+1, tab_y+tab_height-3); - - // FIXME: these ports don't provide wxRegion ctor from array of points -#if !defined(__WXDFB__) && !defined(__WXCOCOA__) - // set the clipping region for the tab -- - wxRegion clipping_region(WXSIZEOF(clip_points), clip_points); - dc.SetClippingRegion(clipping_region); -#endif // !wxDFB && !wxCocoa -*/ - // since the above code above doesn't play well with WXDFB or WXCOCOA, - // we'll just use a rectangle for the clipping region for now -- - dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3); - - - wxPoint border_points[6]; - if (m_flags &wxAUI_NB_BOTTOM) - { - border_points[0] = wxPoint(tab_x, tab_y); - border_points[1] = wxPoint(tab_x, tab_y+tab_height-6); - border_points[2] = wxPoint(tab_x+2, tab_y+tab_height-4); - border_points[3] = wxPoint(tab_x+tab_width-2, tab_y+tab_height-4); - border_points[4] = wxPoint(tab_x+tab_width, tab_y+tab_height-6); - border_points[5] = wxPoint(tab_x+tab_width, tab_y); - } - else //if (m_flags & wxAUI_NB_TOP) {} - { - border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); - border_points[1] = wxPoint(tab_x, tab_y+2); - border_points[2] = wxPoint(tab_x+2, tab_y); - border_points[3] = wxPoint(tab_x+tab_width-2, tab_y); - border_points[4] = wxPoint(tab_x+tab_width, tab_y+2); - border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4); - } - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - - int drawn_tab_yoff = border_points[1].y; - int drawn_tab_height = border_points[0].y - border_points[1].y; - - - if (page.active) - { - // draw active tab - - // draw base background color - wxRect r(tab_x, tab_y, tab_width, tab_height); - dc.SetPen(wxPen(m_activeColour)); - dc.SetBrush(wxBrush(m_activeColour)); - dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4); - - // this white helps fill out the gradient at the top of the tab - dc.SetPen(*wxWHITE_PEN); - dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4); - - // these two points help the rounded corners appear more antialiased - dc.SetPen(wxPen(m_activeColour)); - dc.DrawPoint(r.x+2, r.y+1); - dc.DrawPoint(r.x+r.width-2, r.y+1); - - // set rectangle down a bit for gradient drawing - r.SetHeight(r.GetHeight()/2); - r.x += 2; - r.width -= 3; - r.y += r.height; - r.y -= 2; - - // draw gradient background - wxColor top_color = *wxWHITE; - wxColor bottom_color = m_activeColour; - dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); - } - else - { - // draw inactive tab - - wxRect r(tab_x, tab_y+1, tab_width, tab_height-3); - - // start the gradent up a bit and leave the inside border inset - // by a pixel for a 3D look. Only the top half of the inactive - // tab will have a slight gradient - r.x += 3; - r.y++; - r.width -= 4; - r.height /= 2; - r.height--; - - // -- draw top gradient fill for glossy look - wxColor top_color = m_baseColour; - wxColor bottom_color = top_color.ChangeLightness(160); - dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); - - r.y += r.height; - r.y--; - - // -- draw bottom fill for glossy look - top_color = m_baseColour; - bottom_color = m_baseColour; - dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); - } - - // draw tab outline - dc.SetPen(m_borderPen); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawPolygon(WXSIZEOF(border_points), border_points); - - // there are two horizontal grey lines at the bottom of the tab control, - // this gets rid of the top one of those lines in the tab control - if (page.active) - { - if (m_flags &wxAUI_NB_BOTTOM) - dc.SetPen(wxPen(m_baseColour.ChangeLightness(170))); - // TODO: else if (m_flags &wxAUI_NB_LEFT) {} - // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} - else //for wxAUI_NB_TOP - dc.SetPen(m_baseColourPen); - dc.DrawLine(border_points[0].x+1, - border_points[0].y, - border_points[5].x, - border_points[5].y); - } - - - int text_offset = tab_x + 8; - int close_button_width = 0; - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - close_button_width = m_activeCloseBmp.GetWidth(); - } - - int bitmap_offset = 0; - if (page.bitmap.IsOk()) - { - bitmap_offset = tab_x + 8; - - // draw bitmap - dc.DrawBitmap(page.bitmap, - bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), - true); - - text_offset = bitmap_offset + page.bitmap.GetWidth(); - text_offset += 3; // bitmap padding - - } - else - { - text_offset = tab_x + 8; - } - - - wxString draw_text = wxAuiChopText(dc, - caption, - tab_width - (text_offset-tab_x) - close_button_width); - - // draw tab text - dc.DrawText(draw_text, - text_offset, - drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1); - - // draw focus rectangle - if (page.active && (wnd->FindFocus() == wnd)) - { - wxRect focusRectText(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1), - selected_textx, selected_texty); - - wxRect focusRect; - wxRect focusRectBitmap; - - if (page.bitmap.IsOk()) - focusRectBitmap = wxRect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), - page.bitmap.GetWidth(), page.bitmap.GetHeight()); - - if (page.bitmap.IsOk() && draw_text.IsEmpty()) - focusRect = focusRectBitmap; - else if (!page.bitmap.IsOk() && !draw_text.IsEmpty()) - focusRect = focusRectText; - else if (page.bitmap.IsOk() && !draw_text.IsEmpty()) - focusRect = focusRectText.Union(focusRectBitmap); - - focusRect.Inflate(2, 2); - - wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); - } - - // draw close button if necessary - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - wxBitmap bmp = m_disabledCloseBmp; - - if (close_button_state == wxAUI_BUTTON_STATE_HOVER || - close_button_state == wxAUI_BUTTON_STATE_PRESSED) - { - bmp = m_activeCloseBmp; - } - - int offsetY = tab_y-1; - if (m_flags & wxAUI_NB_BOTTOM) - offsetY = 1; - - wxRect rect(tab_x + tab_width - close_button_width - 1, - offsetY + (tab_height/2) - (bmp.GetHeight()/2), - close_button_width, - tab_height); - - IndentPressedBitmap(&rect, close_button_state); - dc.DrawBitmap(bmp, rect.x, rect.y, true); - - *out_button_rect = rect; - } - - *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); - - dc.DestroyClippingRegion(); -} - -int wxAuiDefaultTabArt::GetIndentSize() -{ - return 5; -} - -wxSize wxAuiDefaultTabArt::GetTabSize(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxString& caption, - const wxBitmap& bitmap, - bool WXUNUSED(active), - int close_button_state, - int* x_extent) -{ - wxCoord measured_textx, measured_texty, tmp; - - dc.SetFont(m_measuringFont); - dc.GetTextExtent(caption, &measured_textx, &measured_texty); - - dc.GetTextExtent(wxT("ABCDEFXj"), &tmp, &measured_texty); - - // add padding around the text - wxCoord tab_width = measured_textx; - wxCoord tab_height = measured_texty; - - // if the close button is showing, add space for it - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - tab_width += m_activeCloseBmp.GetWidth() + 3; - - // if there's a bitmap, add space for it - if (bitmap.IsOk()) - { - tab_width += bitmap.GetWidth(); - tab_width += 3; // right side bitmap padding - tab_height = wxMax(tab_height, bitmap.GetHeight()); - } - - // add padding - tab_width += 16; - tab_height += 10; - - if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) - { - tab_width = m_fixedTabWidth; - } - - *x_extent = tab_width; - - return wxSize(tab_width, tab_height); -} - - -void wxAuiDefaultTabArt::DrawButton(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& in_rect, - int bitmap_id, - int button_state, - int orientation, - wxRect* out_rect) -{ - wxBitmap bmp; - wxRect rect; - - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledCloseBmp; - else - bmp = m_activeCloseBmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledLeftBmp; - else - bmp = m_activeLeftBmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledRightBmp; - else - bmp = m_activeRightBmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledWindowListBmp; - else - bmp = m_activeWindowListBmp; - break; - } - - - if (!bmp.IsOk()) - return; - - rect = in_rect; - - if (orientation == wxLEFT) - { - rect.SetX(in_rect.x); - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); - rect.SetWidth(bmp.GetWidth()); - rect.SetHeight(bmp.GetHeight()); - } - else - { - rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()); - } - - IndentPressedBitmap(&rect, button_state); - dc.DrawBitmap(bmp, rect.x, rect.y, true); - - *out_rect = rect; -} - -int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - int /*active_idx*/) -{ - wxMenu menuPopup; - - size_t i, count = pages.GetCount(); - for (i = 0; i < count; ++i) - { - const wxAuiNotebookPage& page = pages.Item(i); - wxString caption = page.caption; - - // if there is no caption, make it a space. This will prevent - // an assert in the menu code. - if (caption.IsEmpty()) - caption = wxT(" "); - - wxMenuItem* item = new wxMenuItem(NULL, 1000+i, caption); - if (page.bitmap.IsOk()) - item->SetBitmap(page.bitmap); - menuPopup.Append(item); - } - - // find out where to put the popup menu of window items - wxPoint pt = ::wxGetMousePosition(); - pt = wnd->ScreenToClient(pt); - - // find out the screen coordinate at the bottom of the tab ctrl - wxRect cli_rect = wnd->GetClientRect(); - pt.y = cli_rect.y + cli_rect.height; - - wxAuiCommandCapture* cc = new wxAuiCommandCapture; - wnd->PushEventHandler(cc); - wnd->PopupMenu(&menuPopup, pt); - int command = cc->GetCommandId(); - wnd->PopEventHandler(true); - - if (command >= 1000) - return command-1000; - - return -1; -} - -int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - const wxSize& requiredBmp_size) -{ - wxClientDC dc(wnd); - dc.SetFont(m_measuringFont); - - // sometimes a standard bitmap size needs to be enforced, especially - // if some tabs have bitmaps and others don't. This is important because - // it prevents the tab control from resizing when tabs are added. - wxBitmap measureBmp; - if (requiredBmp_size.IsFullySpecified()) - { - measureBmp.Create(requiredBmp_size.x, - requiredBmp_size.y); - } - - - int max_y = 0; - size_t i, page_count = pages.GetCount(); - for (i = 0; i < page_count; ++i) - { - wxAuiNotebookPage& page = pages.Item(i); - - wxBitmap bmp; - if (measureBmp.IsOk()) - bmp = measureBmp; - else - bmp = page.bitmap; - - // we don't use the caption text because we don't - // want tab heights to be different in the case - // of a very short piece of text on one tab and a very - // tall piece of text on another tab - int x_ext = 0; - wxSize s = GetTabSize(dc, - wnd, - wxT("ABCDEFGHIj"), - bmp, - true, - wxAUI_BUTTON_STATE_HIDDEN, - &x_ext); - - max_y = wxMax(max_y, s.y); - } - - return max_y+2; -} - -void wxAuiDefaultTabArt::SetNormalFont(const wxFont& font) -{ - m_normalFont = font; -} - -void wxAuiDefaultTabArt::SetSelectedFont(const wxFont& font) -{ - m_selectedFont = font; -} - -void wxAuiDefaultTabArt::SetMeasuringFont(const wxFont& font) -{ - m_measuringFont = font; -} - -void wxAuiDefaultTabArt::SetColour(const wxColour& colour) -{ - m_baseColour = colour; - m_borderPen = wxPen(m_baseColour.ChangeLightness(75)); - m_baseColourPen = wxPen(m_baseColour); - m_baseColourBrush = wxBrush(m_baseColour); -} - -void wxAuiDefaultTabArt::SetActiveColour(const wxColour& colour) -{ - m_activeColour = colour; -} - -// -- wxAuiSimpleTabArt class implementation -- - -wxAuiSimpleTabArt::wxAuiSimpleTabArt() -{ - m_normalFont = *wxNORMAL_FONT; - m_selectedFont = *wxNORMAL_FONT; - m_selectedFont.SetWeight(wxBOLD); - m_measuringFont = m_selectedFont; - - m_flags = 0; - m_fixedTabWidth = 100; - - wxColour baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - - wxColour backgroundColour = baseColour; - wxColour normaltabColour = baseColour; - wxColour selectedtabColour = *wxWHITE; - - m_bkBrush = wxBrush(backgroundColour); - m_normalBkBrush = wxBrush(normaltabColour); - m_normalBkPen = wxPen(normaltabColour); - m_selectedBkBrush = wxBrush(selectedtabColour); - m_selectedBkPen = wxPen(selectedtabColour); - - m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - - m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - - m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - - m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); - -} - -wxAuiSimpleTabArt::~wxAuiSimpleTabArt() -{ -} - -wxAuiTabArt* wxAuiSimpleTabArt::Clone() -{ - return new wxAuiSimpleTabArt(*this); -} - -void wxAuiSimpleTabArt::SetFlags(unsigned int flags) -{ - m_flags = flags; -} - -void wxAuiSimpleTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, - size_t tab_count) -{ - m_fixedTabWidth = 100; - - int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; - - if (m_flags & wxAUI_NB_CLOSE_BUTTON) - tot_width -= m_activeCloseBmp.GetWidth(); - if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) - tot_width -= m_activeWindowListBmp.GetWidth(); - - if (tab_count > 0) - { - m_fixedTabWidth = tot_width/(int)tab_count; - } - - - if (m_fixedTabWidth < 100) - m_fixedTabWidth = 100; - - if (m_fixedTabWidth > tot_width/2) - m_fixedTabWidth = tot_width/2; - - if (m_fixedTabWidth > 220) - m_fixedTabWidth = 220; -} - -void wxAuiSimpleTabArt::SetColour(const wxColour& colour) -{ - m_bkBrush = wxBrush(colour); - m_normalBkBrush = wxBrush(colour); - m_normalBkPen = wxPen(colour); -} - -void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour) -{ - m_selectedBkBrush = wxBrush(colour); - m_selectedBkPen = wxPen(colour); -} - -void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& rect) -{ - // draw background - dc.SetBrush(m_bkBrush); - dc.SetPen(*wxTRANSPARENT_PEN); - dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2); - - // draw base line - dc.SetPen(*wxGREY_PEN); - dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1); -} - - -// DrawTab() draws an individual tab. -// -// dc - output dc -// in_rect - rectangle the tab should be confined to -// caption - tab's caption -// active - whether or not the tab is active -// out_rect - actual output rectangle -// x_extent - the advance x; where the next tab should start - -void wxAuiSimpleTabArt::DrawTab(wxDC& dc, - wxWindow* wnd, - const wxAuiNotebookPage& page, - const wxRect& in_rect, - int close_button_state, - wxRect* out_tab_rect, - wxRect* out_button_rect, - int* x_extent) -{ - wxCoord normal_textx, normal_texty; - wxCoord selected_textx, selected_texty; - wxCoord textx, texty; - - // if the caption is empty, measure some temporary text - wxString caption = page.caption; - if (caption.empty()) - caption = wxT("Xj"); - - dc.SetFont(m_selectedFont); - dc.GetTextExtent(caption, &selected_textx, &selected_texty); - - dc.SetFont(m_normalFont); - dc.GetTextExtent(caption, &normal_textx, &normal_texty); - - // figure out the size of the tab - wxSize tab_size = GetTabSize(dc, - wnd, - page.caption, - page.bitmap, - page.active, - close_button_state, - x_extent); - - wxCoord tab_height = tab_size.y; - wxCoord tab_width = tab_size.x; - wxCoord tab_x = in_rect.x; - wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - - caption = page.caption; - - // select pen, brush and font for the tab to be drawn - - if (page.active) - { - dc.SetPen(m_selectedBkPen); - dc.SetBrush(m_selectedBkBrush); - dc.SetFont(m_selectedFont); - textx = selected_textx; - texty = selected_texty; - } - else - { - dc.SetPen(m_normalBkPen); - dc.SetBrush(m_normalBkBrush); - dc.SetFont(m_normalFont); - textx = normal_textx; - texty = normal_texty; - } - - - // -- draw line -- - - wxPoint points[7]; - points[0].x = tab_x; - points[0].y = tab_y + tab_height - 1; - points[1].x = tab_x + tab_height - 3; - points[1].y = tab_y + 2; - points[2].x = tab_x + tab_height + 3; - points[2].y = tab_y; - points[3].x = tab_x + tab_width - 2; - points[3].y = tab_y; - points[4].x = tab_x + tab_width; - points[4].y = tab_y + 2; - points[5].x = tab_x + tab_width; - points[5].y = tab_y + tab_height - 1; - points[6] = points[0]; - - dc.SetClippingRegion(in_rect); - - dc.DrawPolygon(WXSIZEOF(points) - 1, points); - - dc.SetPen(*wxGREY_PEN); - - //dc.DrawLines(active ? WXSIZEOF(points) - 1 : WXSIZEOF(points), points); - dc.DrawLines(WXSIZEOF(points), points); - - - int text_offset; - - int close_button_width = 0; - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - close_button_width = m_activeCloseBmp.GetWidth(); - text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2); - } - else - { - text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2); - } - - // set minimum text offset - if (text_offset < tab_x + tab_height) - text_offset = tab_x + tab_height; - - // chop text if necessary - wxString draw_text = wxAuiChopText(dc, - caption, - tab_width - (text_offset-tab_x) - close_button_width); - - // draw tab text - dc.DrawText(draw_text, - text_offset, - (tab_y + tab_height)/2 - (texty/2) + 1); - - - // draw focus rectangle - if (page.active && (wnd->FindFocus() == wnd)) - { - wxRect focusRect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), - selected_textx, selected_texty); - - focusRect.Inflate(2, 2); - - wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); - } - - // draw close button if necessary - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - { - wxBitmap bmp; - if (page.active) - bmp = m_activeCloseBmp; - else - bmp = m_disabledCloseBmp; - - wxRect rect(tab_x + tab_width - close_button_width - 1, - tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, - close_button_width, - tab_height - 1); - DrawButtons(dc, rect, bmp, *wxWHITE, close_button_state); - - *out_button_rect = rect; - } - - - *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); - - dc.DestroyClippingRegion(); -} - -int wxAuiSimpleTabArt::GetIndentSize() -{ - return 0; -} - -wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxString& caption, - const wxBitmap& WXUNUSED(bitmap), - bool WXUNUSED(active), - int close_button_state, - int* x_extent) -{ - wxCoord measured_textx, measured_texty; - - dc.SetFont(m_measuringFont); - dc.GetTextExtent(caption, &measured_textx, &measured_texty); - - wxCoord tab_height = measured_texty + 4; - wxCoord tab_width = measured_textx + tab_height + 5; - - if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) - tab_width += m_activeCloseBmp.GetWidth(); - - if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) - { - tab_width = m_fixedTabWidth; - } - - *x_extent = tab_width - (tab_height/2) - 1; - - return wxSize(tab_width, tab_height); -} - - -void wxAuiSimpleTabArt::DrawButton(wxDC& dc, - wxWindow* WXUNUSED(wnd), - const wxRect& in_rect, - int bitmap_id, - int button_state, - int orientation, - wxRect* out_rect) -{ - wxBitmap bmp; - wxRect rect; - - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledCloseBmp; - else - bmp = m_activeCloseBmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledLeftBmp; - else - bmp = m_activeLeftBmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledRightBmp; - else - bmp = m_activeRightBmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabledWindowListBmp; - else - bmp = m_activeWindowListBmp; - break; - } - - if (!bmp.IsOk()) - return; - - rect = in_rect; - - if (orientation == wxLEFT) - { - rect.SetX(in_rect.x); - rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); - rect.SetWidth(bmp.GetWidth()); - rect.SetHeight(bmp.GetHeight()); - } - else - { - rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), - ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), - bmp.GetWidth(), bmp.GetHeight()); - } - - - DrawButtons(dc, rect, bmp, *wxWHITE, button_state); - - *out_rect = rect; -} - -int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, - const wxAuiNotebookPageArray& pages, - int active_idx) -{ - wxMenu menuPopup; - - size_t i, count = pages.GetCount(); - for (i = 0; i < count; ++i) - { - const wxAuiNotebookPage& page = pages.Item(i); - menuPopup.AppendCheckItem(1000+i, page.caption); - } - - if (active_idx != -1) - { - menuPopup.Check(1000+active_idx, true); - } - - // find out where to put the popup menu of window - // items. Subtract 100 for now to center the menu - // a bit, until a better mechanism can be implemented - wxPoint pt = ::wxGetMousePosition(); - pt = wnd->ScreenToClient(pt); - if (pt.x < 100) - pt.x = 0; - else - pt.x -= 100; - - // find out the screen coordinate at the bottom of the tab ctrl - wxRect cli_rect = wnd->GetClientRect(); - pt.y = cli_rect.y + cli_rect.height; - - wxAuiCommandCapture* cc = new wxAuiCommandCapture; - wnd->PushEventHandler(cc); - wnd->PopupMenu(&menuPopup, pt); - int command = cc->GetCommandId(); - wnd->PopEventHandler(true); - - if (command >= 1000) - return command-1000; - - return -1; -} - -int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd, - const wxAuiNotebookPageArray& WXUNUSED(pages), - const wxSize& WXUNUSED(requiredBmp_size)) -{ - wxClientDC dc(wnd); - dc.SetFont(m_measuringFont); - int x_ext = 0; - wxSize s = GetTabSize(dc, - wnd, - wxT("ABCDEFGHIj"), - wxNullBitmap, - true, - wxAUI_BUTTON_STATE_HIDDEN, - &x_ext); - return s.y+3; -} - -void wxAuiSimpleTabArt::SetNormalFont(const wxFont& font) -{ - m_normalFont = font; -} - -void wxAuiSimpleTabArt::SetSelectedFont(const wxFont& font) -{ - m_selectedFont = font; -} - -void wxAuiSimpleTabArt::SetMeasuringFont(const wxFont& font) -{ - m_measuringFont = font; -} - - - - // -- wxAuiTabContainer class implementation -- @@ -1654,7 +423,7 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) size_t button_count = m_buttons.GetCount(); // create off-screen bitmap - bmp.Create(m_rect.GetWidth(), m_rect.GetHeight()); + bmp.Create(m_rect.GetWidth(), m_rect.GetHeight(),*raw_dc); dc.SelectObject(bmp); if (!dc.IsOk()) @@ -1758,10 +527,8 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) int left_buttons_width = 0; int right_buttons_width = 0; - int offset = 0; - // draw the buttons on the right side - offset = m_rect.x + m_rect.width; + int offset = m_rect.x + m_rect.width; for (i = 0; i < button_count; ++i) { wxAuiTabContainerButton& button = m_buttons.Item(button_count - i - 1); @@ -1974,10 +741,8 @@ bool wxAuiTabContainer::IsTabVisible(int tabPage, int tabOffset, wxDC* dc, wxWin int left_buttons_width = 0; int right_buttons_width = 0; - int offset = 0; - // calculate size of the buttons on the right side - offset = m_rect.x + m_rect.width; + int offset = m_rect.x + m_rect.width; for (i = 0; i < button_count; ++i) { wxAuiTabContainerButton& button = m_buttons.Item(button_count - i - 1); @@ -2156,7 +921,7 @@ bool wxAuiTabContainer::ButtonHitTest(int x, int y, static void ShowWnd(wxWindow* wnd, bool show) { #if wxUSE_MDI - if (wnd->IsKindOf(CLASSINFO(wxAuiMDIChildFrame))) + if (wxDynamicCast(wnd, wxAuiMDIChildFrame)) { wxAuiMDIChildFrame* cf = (wxAuiMDIChildFrame*)wnd; cf->DoShow(show); @@ -2281,10 +1046,10 @@ void wxAuiTabCtrl::OnLeftDown(wxMouseEvent& evt) // wxAuiNotebooks always want to receive this event // even if the tab is already active, because they may // have multiple tab controls - if (new_selection != GetActivePage() || - GetParent()->IsKindOf(CLASSINFO(wxAuiNotebook))) + if ((new_selection != GetActivePage() || + wxDynamicCast(GetParent(), wxAuiNotebook)) && !m_hoverButton) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_PAGE_CHANGING, m_windowId); e.SetSelection(new_selection); e.SetOldSelection(GetActivePage()); e.SetEventObject(this); @@ -2311,7 +1076,7 @@ void wxAuiTabCtrl::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) { m_isDragging = false; - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, m_windowId); + wxAuiNotebookEvent evt(wxEVT_AUINOTEBOOK_CANCEL_DRAG, m_windowId); evt.SetSelection(GetIdxFromWindow(m_clickTab)); evt.SetOldSelection(evt.GetSelection()); evt.SetEventObject(this); @@ -2328,11 +1093,11 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) { m_isDragging = false; - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, m_windowId); - evt.SetSelection(GetIdxFromWindow(m_clickTab)); - evt.SetOldSelection(evt.GetSelection()); - evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_END_DRAG, m_windowId); + e.SetSelection(GetIdxFromWindow(m_clickTab)); + e.SetOldSelection(e.GetSelection()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); return; } @@ -2356,11 +1121,11 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) if (!(m_pressedButton->curState & wxAUI_BUTTON_STATE_DISABLED)) { - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, m_windowId); - evt.SetSelection(GetIdxFromWindow(m_clickTab)); - evt.SetInt(m_pressedButton->id); - evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BUTTON, m_windowId); + e.SetSelection(GetIdxFromWindow(m_clickTab)); + e.SetInt(m_pressedButton->id); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); } m_pressedButton = NULL; @@ -2377,7 +1142,7 @@ void wxAuiTabCtrl::OnMiddleUp(wxMouseEvent& evt) if (!TabHitTest(evt.m_x, evt.m_y, &wnd)) return; - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); GetEventHandler()->ProcessEvent(e); @@ -2389,7 +1154,7 @@ void wxAuiTabCtrl::OnMiddleDown(wxMouseEvent& evt) if (!TabHitTest(evt.m_x, evt.m_y, &wnd)) return; - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); GetEventHandler()->ProcessEvent(e); @@ -2401,7 +1166,7 @@ void wxAuiTabCtrl::OnRightUp(wxMouseEvent& evt) if (!TabHitTest(evt.m_x, evt.m_y, &wnd)) return; - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); GetEventHandler()->ProcessEvent(e); @@ -2413,7 +1178,7 @@ void wxAuiTabCtrl::OnRightDown(wxMouseEvent& evt) if (!TabHitTest(evt.m_x, evt.m_y, &wnd)) return; - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); GetEventHandler()->ProcessEvent(e); @@ -2425,7 +1190,7 @@ void wxAuiTabCtrl::OnLeftDClick(wxMouseEvent& evt) wxAuiTabContainerButton* button; if (!TabHitTest(evt.m_x, evt.m_y, &wnd) && !ButtonHitTest(evt.m_x, evt.m_y, &button)) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BG_DCLICK, m_windowId); e.SetEventObject(this); GetEventHandler()->ProcessEvent(e); } @@ -2468,17 +1233,31 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) } } +#if wxUSE_TOOLTIPS + wxWindow* wnd = NULL; + if (evt.Moving() && TabHitTest(evt.m_x, evt.m_y, &wnd)) + { + wxString tooltip(m_pages[GetIdxFromWindow(wnd)].tooltip); + + // If the text changes, set it else, keep old, to avoid + // 'moving tooltip' effect + if (GetToolTipText() != tooltip) + SetToolTip(tooltip); + } + else + UnsetToolTip(); +#endif // wxUSE_TOOLTIPS if (!evt.LeftIsDown() || m_clickPt == wxDefaultPosition) return; if (m_isDragging) { - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, m_windowId); - evt.SetSelection(GetIdxFromWindow(m_clickTab)); - evt.SetOldSelection(evt.GetSelection()); - evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_DRAG_MOTION, m_windowId); + e.SetSelection(GetIdxFromWindow(m_clickTab)); + e.SetOldSelection(e.GetSelection()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); return; } @@ -2489,11 +1268,11 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) if (abs(pos.x - m_clickPt.x) > drag_x_threshold || abs(pos.y - m_clickPt.y) > drag_y_threshold) { - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, m_windowId); - evt.SetSelection(GetIdxFromWindow(m_clickTab)); - evt.SetOldSelection(evt.GetSelection()); - evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BEGIN_DRAG, m_windowId); + e.SetSelection(GetIdxFromWindow(m_clickTab)); + e.SetOldSelection(e.GetSelection()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); m_isDragging = true; } @@ -2538,7 +1317,7 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event) if (idx != -1) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_PAGE_CHANGING, m_windowId); e.SetSelection(idx); e.SetOldSelection(GetActivePage()); e.SetEventObject(this); @@ -2674,7 +1453,7 @@ void wxAuiTabCtrl::OnChar(wxKeyEvent& event) if (newPage != -1) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_PAGE_CHANGING, m_windowId); e.SetSelection(newPage); e.SetOldSelection(newPage); e.SetEventObject(this); @@ -2763,7 +1542,10 @@ public: for (i = 0; i < page_count; ++i) { - int height = m_rect.height - m_tabCtrlHeight; + wxAuiNotebookPage& page = pages.Item(i); + int border_space = m_tabs->GetArtProvider()->GetAdditionalBorderSpace(page.window); + + int height = m_rect.height - m_tabCtrlHeight - border_space; if ( height < 0 ) { // avoid passing negative height to wxWindow::SetSize(), this @@ -2771,21 +1553,25 @@ public: height = 0; } - wxAuiNotebookPage& page = pages.Item(i); if (m_tabs->GetFlags() & wxAUI_NB_BOTTOM) { - page.window->SetSize(m_rect.x, m_rect.y, m_rect.width, height); + page.window->SetSize(m_rect.x + border_space, + m_rect.y + border_space, + m_rect.width - 2 * border_space, + height); } else //TODO: if (GetFlags() & wxAUI_NB_TOP) { - page.window->SetSize(m_rect.x, m_rect.y + m_tabCtrlHeight, - m_rect.width, height); + page.window->SetSize(m_rect.x + border_space, + m_rect.y + m_tabCtrlHeight, + m_rect.width - 2 * border_space, + height); } // TODO: else if (GetFlags() & wxAUI_NB_LEFT){} // TODO: else if (GetFlags() & wxAUI_NB_RIGHT){} #if wxUSE_MDI - if (page.window->IsKindOf(CLASSINFO(wxAuiMDIChildFrame))) + if (wxDynamicCast(page.window, wxAuiMDIChildFrame)) { wxAuiMDIChildFrame* wnd = (wxAuiMDIChildFrame*)page.window; wnd->ApplyMDIChildFrameRect(); @@ -2828,37 +1614,37 @@ BEGIN_EVENT_TABLE(wxAuiNotebook, wxControl) EVT_SIZE(wxAuiNotebook::OnSize) EVT_CHILD_FOCUS(wxAuiNotebook::OnChildFocusNotebook) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, + wxEVT_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebook::OnTabClicked) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, + wxEVT_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebook::OnTabBeginDrag) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, + wxEVT_AUINOTEBOOK_END_DRAG, wxAuiNotebook::OnTabEndDrag) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, + wxEVT_AUINOTEBOOK_CANCEL_DRAG, wxAuiNotebook::OnTabCancelDrag) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, + wxEVT_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebook::OnTabDragMotion) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_BUTTON, + wxEVT_AUINOTEBOOK_BUTTON, wxAuiNotebook::OnTabButton) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, + wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, wxAuiNotebook::OnTabMiddleDown) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, + wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebook::OnTabMiddleUp) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, + wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, wxAuiNotebook::OnTabRightDown) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, + wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebook::OnTabRightUp) EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, - wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, + wxEVT_AUINOTEBOOK_BG_DCLICK, wxAuiNotebook::OnTabBgDClick) EVT_NAVIGATION_KEY(wxAuiNotebook::OnNavigationKeyNotebook) END_EVENT_TABLE() @@ -3204,7 +1990,7 @@ bool wxAuiNotebook::DeletePage(size_t page_idx) #if wxUSE_MDI // actually destroy the window now - if (wnd->IsKindOf(CLASSINFO(wxAuiMDIChildFrame))) + if (wxDynamicCast(wnd, wxAuiMDIChildFrame)) { // delete the child frame with pending delete, as is // customary with frame windows @@ -3357,6 +2143,37 @@ wxString wxAuiNotebook::GetPageText(size_t page_idx) const return page_info.caption; } +bool wxAuiNotebook::SetPageToolTip(size_t page_idx, const wxString& text) +{ + if (page_idx >= m_tabs.GetPageCount()) + return false; + + // update our own tab catalog + wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx); + page_info.tooltip = text; + + wxAuiTabCtrl* ctrl; + int ctrl_idx; + if (!FindTab(page_info.window, &ctrl, &ctrl_idx)) + return false; + + wxAuiNotebookPage& info = ctrl->GetPage(ctrl_idx); + info.tooltip = text; + + // NB: we don't update the tooltip if it is already being displayed, it + // typically never happens, no need to code that + return true; +} + +wxString wxAuiNotebook::GetPageToolTip(size_t page_idx) const +{ + if (page_idx >= m_tabs.GetPageCount()) + return wxString(); + + const wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx); + return page_info.tooltip; +} + bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap) { if (page_idx >= m_tabs.GetPageCount()) @@ -3665,10 +2482,21 @@ void wxAuiNotebook::OnTabClicked(wxAuiNotebookEvent& evt) SetSelectionToWindow(wnd); } -void wxAuiNotebook::OnTabBgDClick(wxAuiNotebookEvent& WXUNUSED(evt)) +void wxAuiNotebook::OnTabBgDClick(wxAuiNotebookEvent& evt) { + // select the tab ctrl which received the db click + int selection; + wxWindow* wnd; + wxAuiTabCtrl* ctrl = (wxAuiTabCtrl*)evt.GetEventObject(); + if ( (ctrl != NULL) + && ((selection = ctrl->GetActivePage()) != wxNOT_FOUND) + && ((wnd = ctrl->GetWindowFromIdx(selection)) != NULL)) + { + SetSelectionToWindow(wnd); + } + // notify owner that the tabbar background has been double-clicked - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BG_DCLICK, m_windowId); e.SetEventObject(this); GetEventHandler()->ProcessEvent(e); } @@ -3724,6 +2552,7 @@ void wxAuiNotebook::OnTabDragMotion(wxAuiNotebookEvent& evt) wxWindow* src_tab = dest_tabs->GetWindowFromIdx(src_idx); dest_tabs->MovePage(src_tab, dest_idx); + m_tabs.MovePage(m_tabs.GetPage(src_idx).window, dest_idx); dest_tabs->SetActivePage((size_t)dest_idx); dest_tabs->DoShowHide(); dest_tabs->Refresh(); @@ -3746,11 +2575,11 @@ void wxAuiNotebook::OnTabDragMotion(wxAuiNotebookEvent& evt) return; // make sure we are not over the hint window - if (!tab_ctrl->IsKindOf(CLASSINFO(wxFrame))) + if (!wxDynamicCast(tab_ctrl, wxFrame)) { while (tab_ctrl) { - if (tab_ctrl->IsKindOf(CLASSINFO(wxAuiTabCtrl))) + if (wxDynamicCast(tab_ctrl, wxAuiTabCtrl)) break; tab_ctrl = tab_ctrl->GetParent(); } @@ -3832,7 +2661,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) while (tab_ctrl) { - if (tab_ctrl->IsKindOf(CLASSINFO(wxAuiTabCtrl))) + if (wxDynamicCast(tab_ctrl, wxAuiTabCtrl)) break; tab_ctrl = tab_ctrl->GetParent(); } @@ -3845,7 +2674,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) { // find out from the destination control // if it's ok to drop this tab here - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_ALLOW_DND, m_windowId); e.SetSelection(evt.GetSelection()); e.SetOldSelection(evt.GetSelection()); e.SetEventObject(this); @@ -3908,7 +2737,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) if (insert_idx == -1) insert_idx = dest_tabs->GetPageCount(); dest_tabs->InsertPage(page_info.window, page_info, insert_idx); - nb->m_tabs.AddPage(page_info.window, page_info); + nb->m_tabs.InsertPage(page_info.window, page_info, insert_idx); nb->DoSizing(); dest_tabs->DoShowHide(); @@ -3918,7 +2747,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) nb->SetSelectionToPage(page_info); // notify owner that the tab has been dragged - wxAuiNotebookEvent e2(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, m_windowId); + wxAuiNotebookEvent e2(wxEVT_AUINOTEBOOK_DRAG_DONE, m_windowId); e2.SetSelection(evt.GetSelection()); e2.SetOldSelection(evt.GetSelection()); e2.SetEventObject(this); @@ -4027,7 +2856,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) } // notify owner that the tab has been dragged - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_DRAG_DONE, m_windowId); e.SetSelection(evt.GetSelection()); e.SetOldSelection(evt.GetSelection()); e.SetEventObject(this); @@ -4164,9 +2993,21 @@ void wxAuiNotebook::OnChildFocusNotebook(wxChildFocusEvent& evt) } - // change the tab selection to the child - // which was focused - int idx = m_tabs.GetIdxFromWindow(evt.GetWindow()); + // find the page containing the focused child + wxWindow* win = evt.GetWindow(); + while ( win ) + { + // pages have the notebook as the parent, so stop when we reach one + // (and also stop in the impossible case of no parent at all) + wxWindow* const parent = win->GetParent(); + if ( !parent || parent == this ) + break; + + win = parent; + } + + // change the tab selection to this page + int idx = m_tabs.GetIdxFromWindow(win); if (idx != -1 && idx != m_curPage) { SetSelection(idx); @@ -4270,7 +3111,7 @@ void wxAuiNotebook::OnTabButton(wxAuiNotebookEvent& evt) wxWindow* close_wnd = tabs->GetWindowFromIdx(selection); // ask owner if it's ok to close the tab - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_PAGE_CLOSE, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(close_wnd)); const int idx = m_tabs.GetIdxFromWindow(close_wnd); e.SetSelection(idx); @@ -4282,7 +3123,7 @@ void wxAuiNotebook::OnTabButton(wxAuiNotebookEvent& evt) #if wxUSE_MDI - if (close_wnd->IsKindOf(CLASSINFO(wxAuiMDIChildFrame))) + if (wxDynamicCast(close_wnd, wxAuiMDIChildFrame)) { close_wnd->Close(); } @@ -4296,7 +3137,7 @@ void wxAuiNotebook::OnTabButton(wxAuiNotebookEvent& evt) } // notify owner that the tab has been closed - wxAuiNotebookEvent e2(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, m_windowId); + wxAuiNotebookEvent e2(wxEVT_AUINOTEBOOK_PAGE_CLOSED, m_windowId); e2.SetSelection(idx); e2.SetEventObject(this); GetEventHandler()->ProcessEvent(e2); @@ -4311,7 +3152,7 @@ void wxAuiNotebook::OnTabMiddleDown(wxAuiNotebookEvent& evt) wxAuiTabCtrl* tabs = (wxAuiTabCtrl*)evt.GetEventObject(); wxWindow* wnd = tabs->GetWindowFromIdx(evt.GetSelection()); - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); GetEventHandler()->ProcessEvent(e); @@ -4327,7 +3168,7 @@ void wxAuiNotebook::OnTabMiddleUp(wxAuiNotebookEvent& evt) wxAuiTabCtrl* tabs = (wxAuiTabCtrl*)evt.GetEventObject(); wxWindow* wnd = tabs->GetWindowFromIdx(evt.GetSelection()); - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); if (GetEventHandler()->ProcessEvent(e)) @@ -4350,7 +3191,7 @@ void wxAuiNotebook::OnTabRightDown(wxAuiNotebookEvent& evt) wxAuiTabCtrl* tabs = (wxAuiTabCtrl*)evt.GetEventObject(); wxWindow* wnd = tabs->GetWindowFromIdx(evt.GetSelection()); - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); GetEventHandler()->ProcessEvent(e); @@ -4362,7 +3203,7 @@ void wxAuiNotebook::OnTabRightUp(wxAuiNotebookEvent& evt) wxAuiTabCtrl* tabs = (wxAuiTabCtrl*)evt.GetEventObject(); wxWindow* wnd = tabs->GetWindowFromIdx(evt.GetSelection()); - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); GetEventHandler()->ProcessEvent(e); @@ -4420,34 +3261,6 @@ int wxAuiNotebook::GetHeightForPageHeight(int pageHeight) return tabCtrlHeight + pageHeight + decorHeight; } -// Advances the selection, generation page selection events -void wxAuiNotebook::AdvanceSelection(bool forward) -{ - if (GetPageCount() <= 1) - return; - - int currentSelection = GetSelection(); - - if (forward) - { - if (currentSelection == (int) (GetPageCount() - 1)) - return; - else if (currentSelection == -1) - currentSelection = 0; - else - currentSelection ++; - } - else - { - if (currentSelection <= 0) - return; - else - currentSelection --; - } - - SetSelection(currentSelection); -} - // Shows the window menu bool wxAuiNotebook::ShowWindowMenu() { @@ -4457,7 +3270,7 @@ bool wxAuiNotebook::ShowWindowMenu() if (idx != -1) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, tabCtrl->GetId()); + wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_PAGE_CHANGING, tabCtrl->GetId()); e.SetSelection(idx); e.SetOldSelection(tabCtrl->GetActivePage()); e.SetEventObject(tabCtrl); @@ -4469,11 +3282,11 @@ bool wxAuiNotebook::ShowWindowMenu() return false; } -void wxAuiNotebook::Thaw() +void wxAuiNotebook::DoThaw() { DoSizing(); - wxControl::Thaw(); + wxBookCtrlBase::DoThaw(); } void wxAuiNotebook::SetPageSize (const wxSize& WXUNUSED(size)) @@ -4498,13 +3311,6 @@ bool wxAuiNotebook::SetPageImage(size_t n, int imageId) return SetPageBitmap(n, GetImageList()->GetBitmap(imageId)); } -wxWindow* wxAuiNotebook::GetCurrentPage () const -{ - const int sel = GetSelection(); - - return sel == wxNOT_FOUND ? NULL : GetPage(sel); -} - int wxAuiNotebook::ChangeSelection(size_t n) { return DoModifySelection(n, false); @@ -4570,7 +3376,7 @@ int wxAuiNotebook::DoModifySelection(size_t n, bool events) bool vetoed = false; - wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); + wxAuiNotebookEvent evt(wxEVT_AUINOTEBOOK_PAGE_CHANGING, m_windowId); if(events) { @@ -4589,7 +3395,7 @@ int wxAuiNotebook::DoModifySelection(size_t n, bool events) // program allows the page change if(events) { - evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED); + evt.SetEventType(wxEVT_AUINOTEBOOK_PAGE_CHANGED); (void)GetEventHandler()->ProcessEvent(evt); } diff --git a/Externals/wxWidgets3/src/aui/descrip.mms b/Externals/wxWidgets3/src/aui/descrip.mms old mode 100755 new mode 100644 index d2b4d86895..9eb2dff9e7 --- a/Externals/wxWidgets3/src/aui/descrip.mms +++ b/Externals/wxWidgets3/src/aui/descrip.mms @@ -2,7 +2,7 @@ # * # Make file for VMS * # Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * -# Date : 14 December 2010 * +# Date : 2 April 2011 * # * #***************************************************************************** .first @@ -44,10 +44,10 @@ CC_DEFINE = cc $(CFLAGS)$(CC_DEFINE) $(MMS$TARGET_NAME).c OBJECTS = dockart.obj,floatpane.obj,framemanager.obj,auibook.obj,tabmdi.obj,\ - auibar.obj + auibar.obj,tabart.obj SOURCES = dockart.cpp floatpane.cpp framemanager.cpp auibook.cpp tabmdi.cpp \ - auibar.cpp + auibar.cpp tabart.cpp all : $(SOURCES) $(MMS)$(MMSQUALIFIERS) $(OBJECTS) @@ -75,3 +75,4 @@ framemanager.obj : framemanager.cpp auibook.obj : auibook.cpp tabmdi.obj : tabmdi.cpp auibar.obj : auibar.cpp +tabart.obj : tabart.cpp diff --git a/Externals/wxWidgets3/src/aui/dockart.cpp b/Externals/wxWidgets3/src/aui/dockart.cpp index 74dac023ce..df5c65febe 100644 --- a/Externals/wxWidgets3/src/aui/dockart.cpp +++ b/Externals/wxWidgets3/src/aui/dockart.cpp @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: dockart.cpp 69590 2011-10-30 14:20:03Z VZ $ // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -27,6 +26,8 @@ #include "wx/aui/framemanager.h" #include "wx/aui/dockart.h" +#include "wx/aui/auibook.h" +#include "wx/aui/tabart.h" #ifndef WX_PRECOMP #include "wx/settings.h" @@ -43,11 +44,14 @@ #ifdef __WXGTK__ #include #include "wx/renderer.h" -#if GTK_CHECK_VERSION(2,0,0) +#ifdef __WXGTK20__ #include "wx/gtk/private/gtk2-compat.h" #else #define gtk_widget_is_drawable GTK_WIDGET_DRAWABLE #endif +#ifdef __WXGTK3__ + #include "wx/graphics.h" +#endif #endif @@ -420,11 +424,17 @@ void wxAuiDefaultDockArt::DrawSash(wxDC& dc, wxWindow *window, int orientation, gtk_paint_handle ( gtk_widget_get_style(window->m_wxwindow), +#ifdef __WXGTK3__ + static_cast(dc.GetGraphicsContext()->GetNativeContext()), +#else window->GTKGetDrawingWindow(), +#endif // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, GTK_STATE_NORMAL, GTK_SHADOW_NONE, +#ifndef __WXGTK3__ NULL /* no clipping */, +#endif window->m_wxwindow, "paned", rect.x, @@ -457,7 +467,7 @@ void wxAuiDefaultDockArt::DrawBackground(wxDC& dc, wxWindow *WXUNUSED(window), i dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); } -void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const wxRect& _rect, +void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow* window, const wxRect& _rect, wxAuiPaneInfo& pane) { dc.SetPen(m_borderPen); @@ -483,10 +493,21 @@ void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const } else { - for (i = 0; i < border_width; ++i) + // notebooks draw the border themselves, so they can use native rendering (e.g. tabartgtk) + wxAuiTabArt* art = 0; + wxAuiNotebook* nb = wxDynamicCast(window, wxAuiNotebook); + if (nb) + art = nb->GetArtProvider(); + + if (art) + art->DrawBorder(dc, window, rect); + else { - dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); - rect.Deflate(1); + for (i = 0; i < border_width; ++i) + { + dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); + rect.Deflate(1); + } } } } diff --git a/Externals/wxWidgets3/src/aui/floatpane.cpp b/Externals/wxWidgets3/src/aui/floatpane.cpp index a4ce130fd8..837c0a0aa5 100644 --- a/Externals/wxWidgets3/src/aui/floatpane.cpp +++ b/Externals/wxWidgets3/src/aui/floatpane.cpp @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: floatpane.cpp 69590 2011-10-30 14:20:03Z VZ $ // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -216,6 +215,9 @@ void wxAuiFloatingFrame::OnMoveEvent(wxMoveEvent& event) return; } + // as on OSX moving windows are not getting all move events, only sporadically, this difference + // is almost always big on OSX, so avoid this early exit opportunity +#ifndef __WXOSX__ // skip if moving too fast to avoid massive redraws and // jumping hint windows if ((abs(winRect.x - m_lastRect.x) > 3) || @@ -235,6 +237,7 @@ void wxAuiFloatingFrame::OnMoveEvent(wxMoveEvent& event) return; } +#endif // prevent frame redocking during resize if (m_lastRect.GetSize() != winRect.GetSize()) @@ -281,7 +284,10 @@ void wxAuiFloatingFrame::OnMoveEvent(wxMoveEvent& event) if (m_last3Rect.IsEmpty()) return; - OnMoving(event.GetRect(), dir); + if ( event.GetEventType() == wxEVT_MOVING ) + OnMoving(event.GetRect(), dir); + else + OnMoving(wxRect(event.GetPosition(),GetSize()), dir); } void wxAuiFloatingFrame::OnIdle(wxIdleEvent& event) @@ -337,7 +343,7 @@ void wxAuiFloatingFrame::OnActivate(wxActivateEvent& event) } // utility function which determines the state of the mouse button -// (independant of having a wxMouseEvent handy) - utimately a better +// (independent of having a wxMouseEvent handy) - utimately a better // mechanism for this should be found (possibly by adding the // functionality to wxWidgets itself) bool wxAuiFloatingFrame::isMouseDown() diff --git a/Externals/wxWidgets3/src/aui/framemanager.cpp b/Externals/wxWidgets3/src/aui/framemanager.cpp index 1fee9e8ffa..20e654791a 100644 --- a/Externals/wxWidgets3/src/aui/framemanager.cpp +++ b/Externals/wxWidgets3/src/aui/framemanager.cpp @@ -4,7 +4,6 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: framemanager.cpp 70807 2012-03-04 20:31:34Z VZ $ // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -822,7 +821,7 @@ void wxAuiManager::UpdateHintWindowConfig() wxWindow* w = m_frame; while (w) { - if (w->IsKindOf(CLASSINFO(wxFrame))) + if (wxDynamicCast(w, wxFrame)) { wxFrame* f = static_cast(w); can_do_transparent = f->CanSetTransparent(); @@ -913,7 +912,7 @@ void wxAuiManager::SetManagedWindow(wxWindow* wnd) // we need to add the MDI client window as the default // center pane - if (m_frame->IsKindOf(CLASSINFO(wxMDIParentFrame))) + if (wxDynamicCast(m_frame, wxMDIParentFrame)) { wxMDIParentFrame* mdi_frame = (wxMDIParentFrame*)m_frame; wxWindow* client_window = mdi_frame->GetClientWindow(); @@ -924,7 +923,7 @@ void wxAuiManager::SetManagedWindow(wxWindow* wnd) wxAuiPaneInfo().Name(wxT("mdiclient")). CenterPane().PaneBorder(false)); } - else if (m_frame->IsKindOf(CLASSINFO(wxAuiMDIParentFrame))) + else if (wxDynamicCast(m_frame, wxAuiMDIParentFrame)) { wxAuiMDIParentFrame* mdi_frame = (wxAuiMDIParentFrame*)m_frame; wxAuiMDIClientWindow* client_window = mdi_frame->GetClientWindow(); @@ -1097,7 +1096,7 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& paneInfo) if (pinfo.HasGripper()) { - if (pinfo.window->IsKindOf(CLASSINFO(wxAuiToolBar))) + if (wxDynamicCast(pinfo.window, wxAuiToolBar)) { // prevent duplicate gripper -- both wxAuiManager and wxAuiToolBar // have a gripper control. The toolbar's built-in gripper @@ -1117,7 +1116,7 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& paneInfo) pinfo.best_size = pinfo.window->GetClientSize(); #if wxUSE_TOOLBAR - if (pinfo.window->IsKindOf(CLASSINFO(wxToolBar))) + if (wxDynamicCast(pinfo.window, wxToolBar)) { // GetClientSize() doesn't get the best size for // a toolbar under some newer versions of wxWidgets, @@ -3236,16 +3235,16 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, // determine the mouse offset and the pane size, both in the // direction of the dock itself, and perpendicular to the dock - int offset, size; + int mouseOffset, size; if (part->orientation == wxVERTICAL) { - offset = pt.y - part->rect.y; + mouseOffset = pt.y - part->rect.y; size = part->rect.GetHeight(); } else { - offset = pt.x - part->rect.x; + mouseOffset = pt.x - part->rect.x; size = part->rect.GetWidth(); } @@ -3253,7 +3252,7 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, // if we are in the top/left part of the pane, // insert the pane before the pane being hovered over - if (offset <= size/2) + if (mouseOffset <= size/2) { drop_position = part->pane->dock_pos; DoInsertPane(panes, @@ -3265,7 +3264,7 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, // if we are in the bottom/right part of the pane, // insert the pane before the pane being hovered over - if (offset > size/2) + if (mouseOffset > size/2) { drop_position = part->pane->dock_pos+1; DoInsertPane(panes, @@ -3313,7 +3312,7 @@ void wxAuiManager::ShowHint(const wxRect& rect) m_hintFadeAmt = m_hintFadeMax; if ((m_flags & wxAUI_MGR_HINT_FADE) - && !((m_hintWnd->IsKindOf(CLASSINFO(wxPseudoTransparentFrame))) && + && !((wxDynamicCast(m_hintWnd, wxPseudoTransparentFrame)) && (m_flags & wxAUI_MGR_NO_VENETIAN_BLINDS_FADE)) ) m_hintFadeAmt = 0; @@ -3367,15 +3366,15 @@ void wxAuiManager::ShowHint(const wxRect& rect) pane.frame && pane.frame->IsShown()) { - wxRect rect = pane.frame->GetRect(); + wxRect r = pane.frame->GetRect(); #ifdef __WXGTK__ // wxGTK returns the client size, not the whole frame size - rect.width += 15; - rect.height += 35; - rect.Inflate(5); + r.width += 15; + r.height += 35; + r.Inflate(5); #endif - clip.Subtract(rect); + clip.Subtract(r); } } @@ -3959,7 +3958,7 @@ void wxAuiManager::OnSize(wxSizeEvent& event) Repaint(); #if wxUSE_MDI - if (m_frame->IsKindOf(CLASSINFO(wxMDIParentFrame))) + if (wxDynamicCast(m_frame, wxMDIParentFrame)) { // for MDI parent frames, this event must not // be "skipped". In other words, the parent frame @@ -3983,7 +3982,7 @@ void wxAuiManager::OnFindManager(wxAuiManagerEvent& evt) } // if we are managing a child frame, get the 'real' manager - if (window->IsKindOf(CLASSINFO(wxAuiFloatingFrame))) + if (wxDynamicCast(window, wxAuiFloatingFrame)) { wxAuiFloatingFrame* float_frame = static_cast(window); evt.SetManager(float_frame->GetOwnerManager()); @@ -4126,7 +4125,7 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event) if (part->pane && part->pane->window && managed_wnd && - managed_wnd->IsKindOf(CLASSINFO(wxAuiFloatingFrame))) + wxDynamicCast(managed_wnd, wxAuiFloatingFrame)) { wxAuiFloatingFrame* floating_frame = (wxAuiFloatingFrame*)managed_wnd; wxAuiManager* owner_mgr = floating_frame->GetOwnerManager(); @@ -4211,7 +4210,7 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event) #if wxUSE_STATUSBAR // if there's a status control, the available // height decreases accordingly - if (m_frame && m_frame->IsKindOf(CLASSINFO(wxFrame))) + if (wxDynamicCast(m_frame, wxFrame)) { wxFrame* frame = static_cast(m_frame); wxStatusBar* status = frame->GetStatusBar(); @@ -4640,7 +4639,7 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) // We can't move the child window so we need to get the frame that // we want to be really moving. This is probably not the best place // to do this but at least it fixes the bug (#13177) for now. - if (!m_actionWindow->IsKindOf(CLASSINFO(wxAuiFloatingFrame))) + if (!wxDynamicCast(m_actionWindow, wxAuiFloatingFrame)) { wxAuiPaneInfo& pane = GetPane(m_actionWindow); m_actionWindow = pane.frame; @@ -4658,8 +4657,8 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) pane.SetFlag(wxAuiPaneInfo::actionPane, true); - wxPoint pt = event.GetPosition(); - DoDrop(m_docks, m_panes, pane, pt, m_actionOffset); + wxPoint point = event.GetPosition(); + DoDrop(m_docks, m_panes, pane, point, m_actionOffset); // if DoDrop() decided to float the pane, set up // the floating pane's initial position @@ -4793,7 +4792,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) } else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && !pane.IsMaximized()) { - // fire pane close event + // fire pane maximize event wxAuiManagerEvent e(wxEVT_AUI_PANE_MAXIMIZE); e.SetManager(this); e.SetPane(evt.pane); @@ -4807,7 +4806,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) } else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && pane.IsMaximized()) { - // fire pane close event + // fire pane restore event wxAuiManagerEvent e(wxEVT_AUI_PANE_RESTORE); e.SetManager(this); e.SetPane(evt.pane); @@ -4819,11 +4818,29 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) Update(); } } - else if (evt.button == wxAUI_BUTTON_PIN) + else if (evt.button == wxAUI_BUTTON_PIN && + (m_flags & wxAUI_MGR_ALLOW_FLOATING) && pane.IsFloatable()) { - if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && - pane.IsFloatable()) - pane.Float(); + if (pane.IsMaximized()) + { + // If the pane is maximized, the original state must be restored + // before trying to float the pane, otherwise the other panels + // wouldn't appear correctly when it becomes floating. + wxAuiManagerEvent e(wxEVT_AUI_PANE_RESTORE); + e.SetManager(this); + e.SetPane(evt.pane); + ProcessMgrEvent(e); + + if (e.GetVeto()) + { + // If it can't be restored, it can't be floated neither. + return; + } + + RestorePane(pane); + } + + pane.Float(); Update(); } } diff --git a/Externals/wxWidgets3/src/aui/tabart.cpp b/Externals/wxWidgets3/src/aui/tabart.cpp new file mode 100644 index 0000000000..f736f0b6e5 --- /dev/null +++ b/Externals/wxWidgets3/src/aui/tabart.cpp @@ -0,0 +1,1319 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/aui/tabart.cpp +// Purpose: wxaui: wx advanced user interface - notebook-art +// Author: Benjamin I. Williams +// Modified by: Jens Lody (moved from auibook.cpp in extra file) +// Created: 2012-03-21 +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_AUI + +#ifndef WX_PRECOMP + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/bitmap.h" + #include "wx/menu.h" +#endif + +#include "wx/renderer.h" +#include "wx/aui/auibook.h" +#include "wx/aui/framemanager.h" +#include "wx/aui/dockart.h" + +#ifdef __WXMAC__ +#include "wx/osx/private.h" +#endif + + +// -- GUI helper classes and functions -- + +class wxAuiCommandCapture : public wxEvtHandler +{ +public: + + wxAuiCommandCapture() { m_lastId = 0; } + int GetCommandId() const { return m_lastId; } + + bool ProcessEvent(wxEvent& evt) + { + if (evt.GetEventType() == wxEVT_MENU) + { + m_lastId = evt.GetId(); + return true; + } + + if (GetNextHandler()) + return GetNextHandler()->ProcessEvent(evt); + + return false; + } + +private: + int m_lastId; +}; + + +// these functions live in dockart.cpp -- they'll eventually +// be moved to a new utility cpp file + +wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, + const wxColour& color); + +wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size); + +static void DrawButtons(wxDC& dc, + const wxRect& _rect, + const wxBitmap& bmp, + const wxColour& bkcolour, + int button_state) +{ + wxRect rect = _rect; + + if (button_state == wxAUI_BUTTON_STATE_PRESSED) + { + rect.x++; + rect.y++; + } + + if (button_state == wxAUI_BUTTON_STATE_HOVER || + button_state == wxAUI_BUTTON_STATE_PRESSED) + { + dc.SetBrush(wxBrush(bkcolour.ChangeLightness(120))); + dc.SetPen(wxPen(bkcolour.ChangeLightness(75))); + + // draw the background behind the button + dc.DrawRectangle(rect.x, rect.y, 15, 15); + } + + // draw the button itself + dc.DrawBitmap(bmp, rect.x, rect.y, true); +} + +static void IndentPressedBitmap(wxRect* rect, int button_state) +{ + if (button_state == wxAUI_BUTTON_STATE_PRESSED) + { + rect->x++; + rect->y++; + } +} + +// -- bitmaps -- + +#if defined( __WXMAC__ ) + static const unsigned char close_bits[]={ + 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, + 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, + 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; +#elif defined( __WXGTK__) + static const unsigned char close_bits[]={ + 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, + 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, + 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +#else + static const unsigned char close_bits[]={ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9, + 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +#endif + +static const unsigned char left_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0xfe, + 0x1f, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +static const unsigned char right_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9f, 0xff, 0x1f, 0xff, + 0x1f, 0xfe, 0x1f, 0xfc, 0x1f, 0xfe, 0x1f, 0xff, 0x9f, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +static const unsigned char list_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xf8, 0xff, 0xff, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + + + + +// -- wxAuiGenericTabArt class implementation -- + +wxAuiGenericTabArt::wxAuiGenericTabArt() +{ + m_normalFont = *wxNORMAL_FONT; + m_selectedFont = *wxNORMAL_FONT; + m_selectedFont.SetWeight(wxBOLD); + m_measuringFont = m_selectedFont; + + m_fixedTabWidth = 100; + m_tabCtrlHeight = 0; + +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON + wxColor baseColour = wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground)); +#else + wxColor baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); +#endif + + // the baseColour is too pale to use as our base colour, + // so darken it a bit -- + if ((255-baseColour.Red()) + + (255-baseColour.Green()) + + (255-baseColour.Blue()) < 60) + { + baseColour = baseColour.ChangeLightness(92); + } + + m_activeColour = baseColour; + m_baseColour = baseColour; + wxColor borderColour = baseColour.ChangeLightness(75); + + m_borderPen = wxPen(borderColour); + m_baseColourPen = wxPen(m_baseColour); + m_baseColourBrush = wxBrush(m_baseColour); + + m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + + m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + + m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + + m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + + m_flags = 0; +} + +wxAuiGenericTabArt::~wxAuiGenericTabArt() +{ +} + +wxAuiTabArt* wxAuiGenericTabArt::Clone() +{ + return new wxAuiGenericTabArt(*this); +} + +void wxAuiGenericTabArt::SetFlags(unsigned int flags) +{ + m_flags = flags; +} + +void wxAuiGenericTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count) +{ + m_fixedTabWidth = 100; + + int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; + + if (m_flags & wxAUI_NB_CLOSE_BUTTON) + tot_width -= m_activeCloseBmp.GetWidth(); + if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) + tot_width -= m_activeWindowListBmp.GetWidth(); + + if (tab_count > 0) + { + m_fixedTabWidth = tot_width/(int)tab_count; + } + + + if (m_fixedTabWidth < 100) + m_fixedTabWidth = 100; + + if (m_fixedTabWidth > tot_width/2) + m_fixedTabWidth = tot_width/2; + + if (m_fixedTabWidth > 220) + m_fixedTabWidth = 220; + + m_tabCtrlHeight = tab_ctrl_size.y; +} + + +void wxAuiGenericTabArt::DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect) +{ + int i, border_width = GetBorderWidth(wnd); + + wxRect theRect(rect); + for (i = 0; i < border_width; ++i) + { + dc.DrawRectangle(theRect.x, theRect.y, theRect.width, theRect.height); + theRect.Deflate(1); + } +} + +void wxAuiGenericTabArt::DrawBackground(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& rect) +{ + // draw background + + wxColor top_color = m_baseColour.ChangeLightness(90); + wxColor bottom_color = m_baseColour.ChangeLightness(170); + wxRect r; + + if (m_flags &wxAUI_NB_BOTTOM) + r = wxRect(rect.x, rect.y, rect.width+2, rect.height); + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + r = wxRect(rect.x, rect.y, rect.width+2, rect.height-3); + + dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); + + + // draw base lines + + dc.SetPen(m_borderPen); + int y = rect.GetHeight(); + int w = rect.GetWidth(); + + if (m_flags &wxAUI_NB_BOTTOM) + { + dc.SetBrush(wxBrush(bottom_color)); + dc.DrawRectangle(-1, 0, w+2, 4); + } + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + { + dc.SetBrush(m_baseColourBrush); + dc.DrawRectangle(-1, y-4, w+2, 4); + } +} + + +// DrawTab() draws an individual tab. +// +// dc - output dc +// in_rect - rectangle the tab should be confined to +// caption - tab's caption +// active - whether or not the tab is active +// out_rect - actual output rectangle +// x_extent - the advance x; where the next tab should start + +void wxAuiGenericTabArt::DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent) +{ + wxCoord normal_textx, normal_texty; + wxCoord selected_textx, selected_texty; + wxCoord texty; + + // if the caption is empty, measure some temporary text + wxString caption = page.caption; + if (caption.empty()) + caption = wxT("Xj"); + + dc.SetFont(m_selectedFont); + dc.GetTextExtent(caption, &selected_textx, &selected_texty); + + dc.SetFont(m_normalFont); + dc.GetTextExtent(caption, &normal_textx, &normal_texty); + + // figure out the size of the tab + wxSize tab_size = GetTabSize(dc, + wnd, + page.caption, + page.bitmap, + page.active, + close_button_state, + x_extent); + + wxCoord tab_height = m_tabCtrlHeight - 3; + wxCoord tab_width = tab_size.x; + wxCoord tab_x = in_rect.x; + wxCoord tab_y = in_rect.y + in_rect.height - tab_height; + + + caption = page.caption; + + + // select pen, brush and font for the tab to be drawn + + if (page.active) + { + dc.SetFont(m_selectedFont); + texty = selected_texty; + } + else + { + dc.SetFont(m_normalFont); + texty = normal_texty; + } + + + // create points that will make the tab outline + + int clip_width = tab_width; + if (tab_x + clip_width > in_rect.x + in_rect.width) + clip_width = (in_rect.x + in_rect.width) - tab_x; + +/* + wxPoint clip_points[6]; + clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); + clip_points[1] = wxPoint(tab_x, tab_y+2); + clip_points[2] = wxPoint(tab_x+2, tab_y); + clip_points[3] = wxPoint(tab_x+clip_width-1, tab_y); + clip_points[4] = wxPoint(tab_x+clip_width+1, tab_y+2); + clip_points[5] = wxPoint(tab_x+clip_width+1, tab_y+tab_height-3); + + // FIXME: these ports don't provide wxRegion ctor from array of points +#if !defined(__WXDFB__) && !defined(__WXCOCOA__) + // set the clipping region for the tab -- + wxRegion clipping_region(WXSIZEOF(clip_points), clip_points); + dc.SetClippingRegion(clipping_region); +#endif // !wxDFB && !wxCocoa +*/ + // since the above code above doesn't play well with WXDFB or WXCOCOA, + // we'll just use a rectangle for the clipping region for now -- + dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3); + + + wxPoint border_points[6]; + if (m_flags &wxAUI_NB_BOTTOM) + { + border_points[0] = wxPoint(tab_x, tab_y); + border_points[1] = wxPoint(tab_x, tab_y+tab_height-6); + border_points[2] = wxPoint(tab_x+2, tab_y+tab_height-4); + border_points[3] = wxPoint(tab_x+tab_width-2, tab_y+tab_height-4); + border_points[4] = wxPoint(tab_x+tab_width, tab_y+tab_height-6); + border_points[5] = wxPoint(tab_x+tab_width, tab_y); + } + else //if (m_flags & wxAUI_NB_TOP) {} + { + border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); + border_points[1] = wxPoint(tab_x, tab_y+2); + border_points[2] = wxPoint(tab_x+2, tab_y); + border_points[3] = wxPoint(tab_x+tab_width-2, tab_y); + border_points[4] = wxPoint(tab_x+tab_width, tab_y+2); + border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4); + } + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + + int drawn_tab_yoff = border_points[1].y; + int drawn_tab_height = border_points[0].y - border_points[1].y; + + + if (page.active) + { + // draw active tab + + // draw base background color + wxRect r(tab_x, tab_y, tab_width, tab_height); + dc.SetPen(wxPen(m_activeColour)); + dc.SetBrush(wxBrush(m_activeColour)); + dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4); + + // this white helps fill out the gradient at the top of the tab + dc.SetPen(*wxWHITE_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4); + + // these two points help the rounded corners appear more antialiased + dc.SetPen(wxPen(m_activeColour)); + dc.DrawPoint(r.x+2, r.y+1); + dc.DrawPoint(r.x+r.width-2, r.y+1); + + // set rectangle down a bit for gradient drawing + r.SetHeight(r.GetHeight()/2); + r.x += 2; + r.width -= 3; + r.y += r.height; + r.y -= 2; + + // draw gradient background + wxColor top_color = *wxWHITE; + wxColor bottom_color = m_activeColour; + dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); + } + else + { + // draw inactive tab + + wxRect r(tab_x, tab_y+1, tab_width, tab_height-3); + + // start the gradent up a bit and leave the inside border inset + // by a pixel for a 3D look. Only the top half of the inactive + // tab will have a slight gradient + r.x += 3; + r.y++; + r.width -= 4; + r.height /= 2; + r.height--; + + // -- draw top gradient fill for glossy look + wxColor top_color = m_baseColour; + wxColor bottom_color = top_color.ChangeLightness(160); + dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); + + r.y += r.height; + r.y--; + + // -- draw bottom fill for glossy look + top_color = m_baseColour; + bottom_color = m_baseColour; + dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); + } + + // draw tab outline + dc.SetPen(m_borderPen); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawPolygon(WXSIZEOF(border_points), border_points); + + // there are two horizontal grey lines at the bottom of the tab control, + // this gets rid of the top one of those lines in the tab control + if (page.active) + { + if (m_flags &wxAUI_NB_BOTTOM) + dc.SetPen(wxPen(m_baseColour.ChangeLightness(170))); + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + else //for wxAUI_NB_TOP + dc.SetPen(m_baseColourPen); + dc.DrawLine(border_points[0].x+1, + border_points[0].y, + border_points[5].x, + border_points[5].y); + } + + + int text_offset = tab_x + 8; + int close_button_width = 0; + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + close_button_width = m_activeCloseBmp.GetWidth(); + } + + int bitmap_offset = 0; + if (page.bitmap.IsOk()) + { + bitmap_offset = tab_x + 8; + + // draw bitmap + dc.DrawBitmap(page.bitmap, + bitmap_offset, + drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), + true); + + text_offset = bitmap_offset + page.bitmap.GetWidth(); + text_offset += 3; // bitmap padding + + } + else + { + text_offset = tab_x + 8; + } + + + wxString draw_text = wxAuiChopText(dc, + caption, + tab_width - (text_offset-tab_x) - close_button_width); + + // draw tab text + dc.DrawText(draw_text, + text_offset, + drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1); + + // draw focus rectangle + if (page.active && (wnd->FindFocus() == wnd)) + { + wxRect focusRectText(text_offset, (drawn_tab_yoff + (drawn_tab_height)/2 - (texty/2) - 1), + selected_textx, selected_texty); + + wxRect focusRect; + wxRect focusRectBitmap; + + if (page.bitmap.IsOk()) + focusRectBitmap = wxRect(bitmap_offset, drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), + page.bitmap.GetWidth(), page.bitmap.GetHeight()); + + if (page.bitmap.IsOk() && draw_text.IsEmpty()) + focusRect = focusRectBitmap; + else if (!page.bitmap.IsOk() && !draw_text.IsEmpty()) + focusRect = focusRectText; + else if (page.bitmap.IsOk() && !draw_text.IsEmpty()) + focusRect = focusRectText.Union(focusRectBitmap); + + focusRect.Inflate(2, 2); + + wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); + } + + // draw close button if necessary + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + wxBitmap bmp = m_disabledCloseBmp; + + if (close_button_state == wxAUI_BUTTON_STATE_HOVER || + close_button_state == wxAUI_BUTTON_STATE_PRESSED) + { + bmp = m_activeCloseBmp; + } + + int offsetY = tab_y-1; + if (m_flags & wxAUI_NB_BOTTOM) + offsetY = 1; + + wxRect rect(tab_x + tab_width - close_button_width - 1, + offsetY + (tab_height/2) - (bmp.GetHeight()/2), + close_button_width, + tab_height); + + IndentPressedBitmap(&rect, close_button_state); + dc.DrawBitmap(bmp, rect.x, rect.y, true); + + *out_button_rect = rect; + } + + *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); + + dc.DestroyClippingRegion(); +} + +int wxAuiGenericTabArt::GetIndentSize() +{ + return 5; +} + +int wxAuiGenericTabArt::GetBorderWidth(wxWindow* wnd) +{ + wxAuiManager* mgr = wxAuiManager::GetManager(wnd); + if (mgr) + { + wxAuiDockArt* art = mgr->GetArtProvider(); + if (art) + return art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE); + } + return 1; +} + +int wxAuiGenericTabArt::GetAdditionalBorderSpace(wxWindow* WXUNUSED(wnd)) +{ + return 0; +} + +wxSize wxAuiGenericTabArt::GetTabSize(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxString& caption, + const wxBitmap& bitmap, + bool WXUNUSED(active), + int close_button_state, + int* x_extent) +{ + wxCoord measured_textx, measured_texty, tmp; + + dc.SetFont(m_measuringFont); + dc.GetTextExtent(caption, &measured_textx, &measured_texty); + + dc.GetTextExtent(wxT("ABCDEFXj"), &tmp, &measured_texty); + + // add padding around the text + wxCoord tab_width = measured_textx; + wxCoord tab_height = measured_texty; + + // if the close button is showing, add space for it + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + tab_width += m_activeCloseBmp.GetWidth() + 3; + + // if there's a bitmap, add space for it + if (bitmap.IsOk()) + { + tab_width += bitmap.GetWidth(); + tab_width += 3; // right side bitmap padding + tab_height = wxMax(tab_height, bitmap.GetHeight()); + } + + // add padding + tab_width += 16; + tab_height += 10; + + if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) + { + tab_width = m_fixedTabWidth; + } + + *x_extent = tab_width; + + return wxSize(tab_width, tab_height); +} + + +void wxAuiGenericTabArt::DrawButton(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) +{ + wxBitmap bmp; + wxRect rect; + + switch (bitmap_id) + { + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledCloseBmp; + else + bmp = m_activeCloseBmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledLeftBmp; + else + bmp = m_activeLeftBmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledRightBmp; + else + bmp = m_activeRightBmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledWindowListBmp; + else + bmp = m_activeWindowListBmp; + break; + } + + + if (!bmp.IsOk()) + return; + + rect = in_rect; + + if (orientation == wxLEFT) + { + rect.SetX(in_rect.x); + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); + rect.SetWidth(bmp.GetWidth()); + rect.SetHeight(bmp.GetHeight()); + } + else + { + rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()); + } + + IndentPressedBitmap(&rect, button_state); + dc.DrawBitmap(bmp, rect.x, rect.y, true); + + *out_rect = rect; +} + +int wxAuiGenericTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int /*active_idx*/) +{ + wxMenu menuPopup; + + size_t i, count = pages.GetCount(); + for (i = 0; i < count; ++i) + { + const wxAuiNotebookPage& page = pages.Item(i); + wxString caption = page.caption; + + // if there is no caption, make it a space. This will prevent + // an assert in the menu code. + if (caption.IsEmpty()) + caption = wxT(" "); + + wxMenuItem* item = new wxMenuItem(NULL, 1000+i, caption); + if (page.bitmap.IsOk()) + item->SetBitmap(page.bitmap); + menuPopup.Append(item); + } + + // find out where to put the popup menu of window items + wxPoint pt = ::wxGetMousePosition(); + pt = wnd->ScreenToClient(pt); + + // find out the screen coordinate at the bottom of the tab ctrl + wxRect cli_rect = wnd->GetClientRect(); + pt.y = cli_rect.y + cli_rect.height; + + wxAuiCommandCapture* cc = new wxAuiCommandCapture; + wnd->PushEventHandler(cc); + wnd->PopupMenu(&menuPopup, pt); + int command = cc->GetCommandId(); + wnd->PopEventHandler(true); + + if (command >= 1000) + return command-1000; + + return -1; +} + +int wxAuiGenericTabArt::GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& requiredBmp_size) +{ + wxClientDC dc(wnd); + dc.SetFont(m_measuringFont); + + // sometimes a standard bitmap size needs to be enforced, especially + // if some tabs have bitmaps and others don't. This is important because + // it prevents the tab control from resizing when tabs are added. + wxBitmap measureBmp; + if (requiredBmp_size.IsFullySpecified()) + { + measureBmp.Create(requiredBmp_size.x, + requiredBmp_size.y); + } + + + int max_y = 0; + size_t i, page_count = pages.GetCount(); + for (i = 0; i < page_count; ++i) + { + wxAuiNotebookPage& page = pages.Item(i); + + wxBitmap bmp; + if (measureBmp.IsOk()) + bmp = measureBmp; + else + bmp = page.bitmap; + + // we don't use the caption text because we don't + // want tab heights to be different in the case + // of a very short piece of text on one tab and a very + // tall piece of text on another tab + int x_ext = 0; + wxSize s = GetTabSize(dc, + wnd, + wxT("ABCDEFGHIj"), + bmp, + true, + wxAUI_BUTTON_STATE_HIDDEN, + &x_ext); + + max_y = wxMax(max_y, s.y); + } + + return max_y+2; +} + +void wxAuiGenericTabArt::SetNormalFont(const wxFont& font) +{ + m_normalFont = font; +} + +void wxAuiGenericTabArt::SetSelectedFont(const wxFont& font) +{ + m_selectedFont = font; +} + +void wxAuiGenericTabArt::SetMeasuringFont(const wxFont& font) +{ + m_measuringFont = font; +} + +void wxAuiGenericTabArt::SetColour(const wxColour& colour) +{ + m_baseColour = colour; + m_borderPen = wxPen(m_baseColour.ChangeLightness(75)); + m_baseColourPen = wxPen(m_baseColour); + m_baseColourBrush = wxBrush(m_baseColour); +} + +void wxAuiGenericTabArt::SetActiveColour(const wxColour& colour) +{ + m_activeColour = colour; +} + +// -- wxAuiSimpleTabArt class implementation -- + +wxAuiSimpleTabArt::wxAuiSimpleTabArt() +{ + m_normalFont = *wxNORMAL_FONT; + m_selectedFont = *wxNORMAL_FONT; + m_selectedFont.SetWeight(wxBOLD); + m_measuringFont = m_selectedFont; + + m_flags = 0; + m_fixedTabWidth = 100; + + wxColour baseColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + + wxColour backgroundColour = baseColour; + wxColour normaltabColour = baseColour; + wxColour selectedtabColour = *wxWHITE; + + m_bkBrush = wxBrush(backgroundColour); + m_normalBkBrush = wxBrush(normaltabColour); + m_normalBkPen = wxPen(normaltabColour); + m_selectedBkBrush = wxBrush(selectedtabColour); + m_selectedBkPen = wxPen(selectedtabColour); + + m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + + m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + + m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + + m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + +} + +wxAuiSimpleTabArt::~wxAuiSimpleTabArt() +{ +} + +wxAuiTabArt* wxAuiSimpleTabArt::Clone() +{ + return new wxAuiSimpleTabArt(*this); +} + +void wxAuiSimpleTabArt::SetFlags(unsigned int flags) +{ + m_flags = flags; +} + +void wxAuiSimpleTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count) +{ + m_fixedTabWidth = 100; + + int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; + + if (m_flags & wxAUI_NB_CLOSE_BUTTON) + tot_width -= m_activeCloseBmp.GetWidth(); + if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) + tot_width -= m_activeWindowListBmp.GetWidth(); + + if (tab_count > 0) + { + m_fixedTabWidth = tot_width/(int)tab_count; + } + + + if (m_fixedTabWidth < 100) + m_fixedTabWidth = 100; + + if (m_fixedTabWidth > tot_width/2) + m_fixedTabWidth = tot_width/2; + + if (m_fixedTabWidth > 220) + m_fixedTabWidth = 220; +} + +void wxAuiSimpleTabArt::SetColour(const wxColour& colour) +{ + m_bkBrush = wxBrush(colour); + m_normalBkBrush = wxBrush(colour); + m_normalBkPen = wxPen(colour); +} + +void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour) +{ + m_selectedBkBrush = wxBrush(colour); + m_selectedBkPen = wxPen(colour); +} + +void wxAuiSimpleTabArt::DrawBorder(wxDC& dc, wxWindow* wnd, const wxRect& rect) +{ + int i, border_width = GetBorderWidth(wnd); + + wxRect theRect(rect); + for (i = 0; i < border_width; ++i) + { + dc.DrawRectangle(theRect.x, theRect.y, theRect.width, theRect.height); + theRect.Deflate(1); + } +} + +void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& rect) +{ + // draw background + dc.SetBrush(m_bkBrush); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2); + + // draw base line + dc.SetPen(*wxGREY_PEN); + dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1); +} + + +// DrawTab() draws an individual tab. +// +// dc - output dc +// in_rect - rectangle the tab should be confined to +// caption - tab's caption +// active - whether or not the tab is active +// out_rect - actual output rectangle +// x_extent - the advance x; where the next tab should start + +void wxAuiSimpleTabArt::DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& page, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent) +{ + wxCoord normal_textx, normal_texty; + wxCoord selected_textx, selected_texty; + wxCoord textx, texty; + + // if the caption is empty, measure some temporary text + wxString caption = page.caption; + if (caption.empty()) + caption = wxT("Xj"); + + dc.SetFont(m_selectedFont); + dc.GetTextExtent(caption, &selected_textx, &selected_texty); + + dc.SetFont(m_normalFont); + dc.GetTextExtent(caption, &normal_textx, &normal_texty); + + // figure out the size of the tab + wxSize tab_size = GetTabSize(dc, + wnd, + page.caption, + page.bitmap, + page.active, + close_button_state, + x_extent); + + wxCoord tab_height = tab_size.y; + wxCoord tab_width = tab_size.x; + wxCoord tab_x = in_rect.x; + wxCoord tab_y = in_rect.y + in_rect.height - tab_height; + + caption = page.caption; + + // select pen, brush and font for the tab to be drawn + + if (page.active) + { + dc.SetPen(m_selectedBkPen); + dc.SetBrush(m_selectedBkBrush); + dc.SetFont(m_selectedFont); + textx = selected_textx; + texty = selected_texty; + } + else + { + dc.SetPen(m_normalBkPen); + dc.SetBrush(m_normalBkBrush); + dc.SetFont(m_normalFont); + textx = normal_textx; + texty = normal_texty; + } + + + // -- draw line -- + + wxPoint points[7]; + points[0].x = tab_x; + points[0].y = tab_y + tab_height - 1; + points[1].x = tab_x + tab_height - 3; + points[1].y = tab_y + 2; + points[2].x = tab_x + tab_height + 3; + points[2].y = tab_y; + points[3].x = tab_x + tab_width - 2; + points[3].y = tab_y; + points[4].x = tab_x + tab_width; + points[4].y = tab_y + 2; + points[5].x = tab_x + tab_width; + points[5].y = tab_y + tab_height - 1; + points[6] = points[0]; + + dc.SetClippingRegion(in_rect); + + dc.DrawPolygon(WXSIZEOF(points) - 1, points); + + dc.SetPen(*wxGREY_PEN); + + //dc.DrawLines(active ? WXSIZEOF(points) - 1 : WXSIZEOF(points), points); + dc.DrawLines(WXSIZEOF(points), points); + + + int text_offset; + + int close_button_width = 0; + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + close_button_width = m_activeCloseBmp.GetWidth(); + text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2); + } + else + { + text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2); + } + + // set minimum text offset + if (text_offset < tab_x + tab_height) + text_offset = tab_x + tab_height; + + // chop text if necessary + wxString draw_text = wxAuiChopText(dc, + caption, + tab_width - (text_offset-tab_x) - close_button_width); + + // draw tab text + dc.DrawText(draw_text, + text_offset, + (tab_y + tab_height)/2 - (texty/2) + 1); + + + // draw focus rectangle + if (page.active && (wnd->FindFocus() == wnd)) + { + wxRect focusRect(text_offset, ((tab_y + tab_height)/2 - (texty/2) + 1), + selected_textx, selected_texty); + + focusRect.Inflate(2, 2); + + wxRendererNative::Get().DrawFocusRect(wnd, dc, focusRect, 0); + } + + // draw close button if necessary + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + wxBitmap bmp; + if (page.active) + bmp = m_activeCloseBmp; + else + bmp = m_disabledCloseBmp; + + wxRect rect(tab_x + tab_width - close_button_width - 1, + tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1, + close_button_width, + tab_height - 1); + DrawButtons(dc, rect, bmp, *wxWHITE, close_button_state); + + *out_button_rect = rect; + } + + + *out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height); + + dc.DestroyClippingRegion(); +} + +int wxAuiSimpleTabArt::GetIndentSize() +{ + return 0; +} + +int wxAuiSimpleTabArt::GetBorderWidth(wxWindow* wnd) +{ + wxAuiManager* mgr = wxAuiManager::GetManager(wnd); + if (mgr) + { + wxAuiDockArt* art = mgr->GetArtProvider(); + if (art) + return art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE); + } + return 1; +} + +int wxAuiSimpleTabArt::GetAdditionalBorderSpace(wxWindow* WXUNUSED(wnd)) +{ + return 0; +} + +wxSize wxAuiSimpleTabArt::GetTabSize(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxString& caption, + const wxBitmap& WXUNUSED(bitmap), + bool WXUNUSED(active), + int close_button_state, + int* x_extent) +{ + wxCoord measured_textx, measured_texty; + + dc.SetFont(m_measuringFont); + dc.GetTextExtent(caption, &measured_textx, &measured_texty); + + wxCoord tab_height = measured_texty + 4; + wxCoord tab_width = measured_textx + tab_height + 5; + + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + tab_width += m_activeCloseBmp.GetWidth(); + + if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH) + { + tab_width = m_fixedTabWidth; + } + + *x_extent = tab_width - (tab_height/2) - 1; + + return wxSize(tab_width, tab_height); +} + + +void wxAuiSimpleTabArt::DrawButton(wxDC& dc, + wxWindow* WXUNUSED(wnd), + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) +{ + wxBitmap bmp; + wxRect rect; + + switch (bitmap_id) + { + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledCloseBmp; + else + bmp = m_activeCloseBmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledLeftBmp; + else + bmp = m_activeLeftBmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledRightBmp; + else + bmp = m_activeRightBmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabledWindowListBmp; + else + bmp = m_activeWindowListBmp; + break; + } + + if (!bmp.IsOk()) + return; + + rect = in_rect; + + if (orientation == wxLEFT) + { + rect.SetX(in_rect.x); + rect.SetY(((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2)); + rect.SetWidth(bmp.GetWidth()); + rect.SetHeight(bmp.GetHeight()); + } + else + { + rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), + ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), + bmp.GetWidth(), bmp.GetHeight()); + } + + + DrawButtons(dc, rect, bmp, *wxWHITE, button_state); + + *out_rect = rect; +} + +int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int active_idx) +{ + wxMenu menuPopup; + + size_t i, count = pages.GetCount(); + for (i = 0; i < count; ++i) + { + const wxAuiNotebookPage& page = pages.Item(i); + menuPopup.AppendCheckItem(1000+i, page.caption); + } + + if (active_idx != -1) + { + menuPopup.Check(1000+active_idx, true); + } + + // find out where to put the popup menu of window + // items. Subtract 100 for now to center the menu + // a bit, until a better mechanism can be implemented + wxPoint pt = ::wxGetMousePosition(); + pt = wnd->ScreenToClient(pt); + if (pt.x < 100) + pt.x = 0; + else + pt.x -= 100; + + // find out the screen coordinate at the bottom of the tab ctrl + wxRect cli_rect = wnd->GetClientRect(); + pt.y = cli_rect.y + cli_rect.height; + + wxAuiCommandCapture* cc = new wxAuiCommandCapture; + wnd->PushEventHandler(cc); + wnd->PopupMenu(&menuPopup, pt); + int command = cc->GetCommandId(); + wnd->PopEventHandler(true); + + if (command >= 1000) + return command-1000; + + return -1; +} + +int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& WXUNUSED(pages), + const wxSize& WXUNUSED(requiredBmp_size)) +{ + wxClientDC dc(wnd); + dc.SetFont(m_measuringFont); + int x_ext = 0; + wxSize s = GetTabSize(dc, + wnd, + wxT("ABCDEFGHIj"), + wxNullBitmap, + true, + wxAUI_BUTTON_STATE_HIDDEN, + &x_ext); + return s.y+3; +} + +void wxAuiSimpleTabArt::SetNormalFont(const wxFont& font) +{ + m_normalFont = font; +} + +void wxAuiSimpleTabArt::SetSelectedFont(const wxFont& font) +{ + m_selectedFont = font; +} + +void wxAuiSimpleTabArt::SetMeasuringFont(const wxFont& font) +{ + m_measuringFont = font; +} + +#endif // wxUSE_AUI diff --git a/Externals/wxWidgets3/src/aui/tabartgtk.cpp b/Externals/wxWidgets3/src/aui/tabartgtk.cpp new file mode 100644 index 0000000000..1c86fbe9d0 --- /dev/null +++ b/Externals/wxWidgets3/src/aui/tabartgtk.cpp @@ -0,0 +1,512 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/aui/tabartgtk.cpp +// Purpose: implementation of the wxAuiGTKTabArt +// Author: Jens Lody and Teodor Petrov +// Modified by: +// Created: 2012-03-23 +// Copyright: (c) 2012 Jens Lody +// and Teodor Petrov +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_AUI + +#ifndef WX_PRECOMP + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/image.h" +#endif + +#include "wx/gtk/dc.h" +#include "wx/gtk/private.h" + +#include + +#include "wx/aui/auibook.h" +#include "wx/aui/tabartgtk.h" +#include "wx/renderer.h" + +namespace +{ + +static int s_CloseIconSize = 16; // default size + +} + +wxAuiGtkTabArt::wxAuiGtkTabArt() + +{ +} + +wxAuiTabArt* wxAuiGtkTabArt::Clone() +{ + wxAuiGtkTabArt* clone = new wxAuiGtkTabArt(); + + clone->SetNormalFont(m_normalFont); + clone->SetSelectedFont(m_normalFont); + clone->SetMeasuringFont(m_normalFont); + + return clone; +} + +void wxAuiGtkTabArt::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(wnd), const wxRect& rect) +{ + wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl(); + GdkWindow* window = impldc->GetGDKWindow(); + + gtk_style_apply_default_background(gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget()), + window, + true, + GTK_STATE_NORMAL, + NULL, + rect.x, rect.y, rect.width, rect.height); +} + +void wxAuiGtkTabArt::DrawBorder(wxDC& WXUNUSED(dc), wxWindow* wnd, const wxRect& rect) +{ + int generic_border_width = wxAuiGenericTabArt::GetBorderWidth(wnd); + + if (!wnd) return; + if (!wnd->m_wxwindow) return; + if (!gtk_widget_is_drawable(wnd->m_wxwindow)) return; + + GtkStyle *style_notebook = gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget()); + + gtk_paint_box(style_notebook, wnd->GTKGetDrawingWindow(), GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, wnd->m_wxwindow, + const_cast("notebook"), + rect.x + generic_border_width + 1, rect.y + generic_border_width + 1, + rect.width - (generic_border_width + 1), rect.height - (generic_border_width + 1)); +} + +void ButtonStateAndShadow(int button_state, GtkStateType &state, GtkShadowType &shadow) +{ + + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + { + state = GTK_STATE_INSENSITIVE; + shadow = GTK_SHADOW_ETCHED_IN; + } + else if (button_state & wxAUI_BUTTON_STATE_HOVER) + { + state = GTK_STATE_PRELIGHT; + shadow = GTK_SHADOW_OUT; + } + else if (button_state & wxAUI_BUTTON_STATE_PRESSED) + { + state = GTK_STATE_ACTIVE; + shadow = GTK_SHADOW_IN; + } + else + { + state = GTK_STATE_NORMAL; + shadow = GTK_SHADOW_OUT; + } +} + +wxRect DrawCloseButton(wxDC& dc, + GtkWidget *widget, + int button_state, + wxRect const &in_rect, + int orientation, + GdkRectangle* clipRect) +{ + GtkStyle *style_button = gtk_widget_get_style(wxGTKPrivate::GetButtonWidget()); + int xthickness = style_button->xthickness; + int ythickness = style_button->ythickness; + + wxBitmap bmp(gtk_widget_render_icon(widget, GTK_STOCK_CLOSE, GTK_ICON_SIZE_SMALL_TOOLBAR, "tab")); + + if(bmp.GetWidth() != s_CloseIconSize || bmp.GetHeight() != s_CloseIconSize) + { + wxImage img = bmp.ConvertToImage(); + img.Rescale(s_CloseIconSize, s_CloseIconSize); + bmp = img; + } + + int button_size = s_CloseIconSize + 2 * xthickness; + + wxRect out_rect; + + if (orientation == wxLEFT) + out_rect.x = in_rect.x - ythickness; + else + out_rect.x = in_rect.x + in_rect.width - button_size - ythickness; + + out_rect.y = in_rect.y + (in_rect.height - button_size) / 2; + out_rect.width = button_size; + out_rect.height = button_size; + + wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl(); + GdkWindow* window = impldc->GetGDKWindow(); + + if (button_state == wxAUI_BUTTON_STATE_HOVER) + { + gtk_paint_box(style_button, window, + GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, clipRect, widget, "button", + out_rect.x, out_rect.y, out_rect.width, out_rect.height); + } + else if (button_state == wxAUI_BUTTON_STATE_PRESSED) + { + gtk_paint_box(style_button, window, + GTK_STATE_ACTIVE, GTK_SHADOW_IN, clipRect, widget, "button", + out_rect.x, out_rect.y, out_rect.width, out_rect.height); + } + + + dc.DrawBitmap(bmp, out_rect.x + xthickness, out_rect.y + ythickness, true); + + return out_rect; +} + +void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& page, + const wxRect& in_rect, int close_button_state, wxRect* out_tab_rect, + wxRect* out_button_rect, int* x_extent) +{ + GtkWidget *widget = wnd->GetHandle(); + GtkStyle *style_notebook = gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget()); + + wxRect const &window_rect = wnd->GetRect(); + + int focus_width = 0; + + gtk_widget_style_get(wxGTKPrivate::GetNotebookWidget(), + "focus-line-width", &focus_width, + NULL); + + int tab_pos; + if (m_flags &wxAUI_NB_BOTTOM) + tab_pos = wxAUI_NB_BOTTOM; + else //if (m_flags & wxAUI_NB_TOP) {} + tab_pos = wxAUI_NB_TOP; + + // TODO: else if (m_flags &wxAUI_NB_LEFT) {} + // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} + + // figure out the size of the tab + wxSize tab_size = GetTabSize(dc, wnd, page.caption, page.bitmap, + page.active, close_button_state, x_extent); + + wxRect tab_rect = in_rect; + tab_rect.width = tab_size.x; + tab_rect.height = tab_size.y; + tab_rect.y += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + + if (page.active) + tab_rect.height += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + + int gap_rect_height = 10 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + int gap_rect_x = 1, gap_start = 0, gap_width = 0; + int gap_rect_y = tab_rect.y - gap_rect_height; + int gap_rect_width = window_rect.width; + + switch (tab_pos) + { + case wxAUI_NB_TOP: + tab_rect.y -= 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + if (!page.active) + tab_rect.y += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + gap_rect_y = tab_rect.y + tab_rect.height - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; + // fall through + case wxAUI_NB_BOTTOM: + gap_start = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder / 2; + gap_width = tab_rect.width; + break; + // TODO: case wxAUI_NB_LEFT: break; + // TODO: case wxAUI_NB_RIGHT: break; + } + tab_rect.y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; + gap_rect_y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2; + + int padding = focus_width + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + + int clip_width = tab_rect.width; + if (tab_rect.x + tab_rect.width > in_rect.x + in_rect.width) + clip_width = (in_rect.x + in_rect.width) - tab_rect.x; + + dc.SetClippingRegion(tab_rect.x, tab_rect.y - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder, clip_width, tab_rect.height + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder); + + GdkRectangle area; + area.x = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder; + area.y = tab_rect.y - 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + area.width = clip_width + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder; + area.height = tab_rect.height + 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder; + + wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl(); + GdkWindow* window = impldc->GetGDKWindow(); + + // Before drawing the active tab itself, draw a box without border, because some themes + // have transparent gaps and a line would be visible at the bottom of the tab + if (page.active) + gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height); + + if (tab_pos == wxAUI_NB_BOTTOM) + { + if (page.active) + { + gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height, + GTK_POS_BOTTOM, gap_start , gap_width); + } + gtk_paint_extension(style_notebook, window, + page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT, + &area, widget, + const_cast("tab"), + tab_rect.x, tab_rect.y, + tab_rect.width, tab_rect.height, + GTK_POS_TOP); + } + else + { + if (page.active) + { + gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height, + GTK_POS_TOP, gap_start , gap_width); + } + gtk_paint_extension(style_notebook, window, + page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT, + &area, widget, + const_cast("tab"), + tab_rect.x, tab_rect.y, + tab_rect.width, tab_rect.height, + GTK_POS_BOTTOM); + } + + // After drawing the inactive tab itself, draw a box with the same dimensions as the gap-box, + // otherwise we don't get a gap-box, if the active tab is invisible + if (!page.active) + gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, widget, + const_cast("notebook"), + gap_rect_x, gap_rect_y, + gap_rect_width, gap_rect_height); + + wxCoord textX = tab_rect.x + padding + style_notebook->xthickness; + + int bitmap_offset = 0; + if (page.bitmap.IsOk()) + { + bitmap_offset = textX; + + // draw bitmap + int bitmapY = tab_rect.y +(tab_rect.height - page.bitmap.GetHeight()) / 2; + if(!page.active) + { + if (tab_pos == wxAUI_NB_TOP) + bitmapY += style_notebook->ythickness / 2; + else + bitmapY -= style_notebook->ythickness / 2; + } + dc.DrawBitmap(page.bitmap, + bitmap_offset, + bitmapY, + true); + + textX += page.bitmap.GetWidth() + padding; + } + + wxCoord textW, textH, textY; + + dc.SetFont(m_normalFont); + dc.GetTextExtent(page.caption, &textW, &textH); + textY = tab_rect.y + (tab_rect.height - textH) / 2; + if(!page.active) + { + if (tab_pos == wxAUI_NB_TOP) + textY += style_notebook->ythickness / 2; + else + textY -= style_notebook->ythickness / 2; + } + + // draw tab text + GdkColor text_colour = page.active ? style_notebook->fg[GTK_STATE_NORMAL] : style_notebook->fg[GTK_STATE_ACTIVE]; + dc.SetTextForeground(wxColor(text_colour)); + GdkRectangle focus_area; + + int padding_focus = padding - focus_width; + focus_area.x = tab_rect.x + padding_focus; + focus_area.y = textY - focus_width; + focus_area.width = tab_rect.width - 2 * padding_focus; + focus_area.height = textH + 2 * focus_width; + + if(page.active && (wnd->FindFocus() == wnd) && focus_area.x <= (area.x + area.width)) + { + // clipping seems not to work here, so we we have to recalc the focus-area manually + if((focus_area.x + focus_area.width) > (area.x + area.width)) + focus_area.width = area.x + area.width - focus_area.x + focus_width - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder; + gtk_paint_focus (style_notebook, window, + GTK_STATE_ACTIVE, NULL, widget, "tab", + focus_area.x, focus_area.y, focus_area.width, focus_area.height); + } + + dc.DrawText(page.caption, textX, textY); + + // draw close-button on tab (if enabled) + if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) + { + wxRect rect(tab_rect.x, tab_rect.y, tab_rect.width - style_notebook->xthickness, tab_rect.height); + if(!page.active) + { + if (tab_pos == wxAUI_NB_TOP) + rect.y += style_notebook->ythickness / 2; + else + rect.y -= style_notebook->ythickness / 2; + } + *out_button_rect = DrawCloseButton(dc, widget, close_button_state, rect, wxRIGHT, &area); + } + + if ( clip_width < tab_rect.width ) + tab_rect.width = clip_width; + *out_tab_rect = tab_rect; + + dc.DestroyClippingRegion(); +} + +wxRect DrawSimpleArrow(wxDC& dc, + GtkWidget *widget, + int button_state, + wxRect const &in_rect, + int orientation, + GtkArrowType arrow_type) +{ + int scroll_arrow_hlength, scroll_arrow_vlength; + gtk_widget_style_get(widget, + "scroll-arrow-hlength", &scroll_arrow_hlength, + "scroll-arrow-vlength", &scroll_arrow_vlength, + NULL); + + GtkStateType state; + GtkShadowType shadow; + ButtonStateAndShadow(button_state, state, shadow); + + wxRect out_rect; + + if (orientation == wxLEFT) + out_rect.x = in_rect.x; + else + out_rect.x = in_rect.x + in_rect.width - scroll_arrow_hlength; + out_rect.y = (in_rect.y + in_rect.height - 3 * gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget())->ythickness - scroll_arrow_vlength) / 2; + out_rect.width = scroll_arrow_hlength; + out_rect.height = scroll_arrow_vlength; + + wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl(); + GdkWindow* window = impldc->GetGDKWindow(); + gtk_paint_arrow (gtk_widget_get_style(wxGTKPrivate::GetButtonWidget()), window, state, shadow, NULL, widget, "notebook", + arrow_type, TRUE, out_rect.x, out_rect.y, out_rect.width, out_rect.height); + + return out_rect; +} + +void wxAuiGtkTabArt::DrawButton(wxDC& dc, wxWindow* wnd, + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) +{ + GtkWidget *widget = wnd->GetHandle(); + wxRect rect = in_rect; + if (m_flags &wxAUI_NB_BOTTOM) + rect.y += 2 * gtk_widget_get_style(wxGTKPrivate::GetButtonWidget())->ythickness; + + switch (bitmap_id) + { + case wxAUI_BUTTON_CLOSE: + rect.y -= 2 * gtk_widget_get_style(wxGTKPrivate::GetButtonWidget())->ythickness; + rect = DrawCloseButton(dc, widget, button_state, rect, orientation, NULL); + break; + + case wxAUI_BUTTON_LEFT: + rect = DrawSimpleArrow(dc, widget, button_state, rect, orientation, GTK_ARROW_LEFT); + break; + + case wxAUI_BUTTON_RIGHT: + rect = DrawSimpleArrow(dc, widget, button_state, rect, orientation, GTK_ARROW_RIGHT); + break; + + case wxAUI_BUTTON_WINDOWLIST: + { + rect.height -= 4 * gtk_widget_get_style(wxGTKPrivate::GetButtonWidget())->ythickness; + rect.width = rect.height; + rect.x = in_rect.x + in_rect.width - rect.width; + + if (button_state == wxAUI_BUTTON_STATE_HOVER) + wxRendererNative::Get().DrawComboBoxDropButton(wnd, dc, rect, wxCONTROL_CURRENT); + else if (button_state == wxAUI_BUTTON_STATE_PRESSED) + wxRendererNative::Get().DrawComboBoxDropButton(wnd, dc, rect, wxCONTROL_PRESSED); + else + wxRendererNative::Get().DrawDropArrow(wnd, dc, rect); + } + break; + } + + *out_rect = rect; +} + + +int wxAuiGtkTabArt::GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size) +{ + SetMeasuringFont(m_normalFont); + SetSelectedFont(m_normalFont); + int tab_height = 3 * gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget())->ythickness + wxAuiGenericTabArt::GetBestTabCtrlSize(wnd, pages, required_bmp_size); + return tab_height; +} + +int wxAuiGtkTabArt::GetBorderWidth(wxWindow* wnd) +{ + return wxAuiGenericTabArt::GetBorderWidth(wnd) + wxMax(GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder, + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder); +} + +int wxAuiGtkTabArt::GetAdditionalBorderSpace(wxWindow* wnd) +{ + return 2 * GetBorderWidth(wnd); +} + +wxSize wxAuiGtkTabArt::GetTabSize(wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int close_button_state, + int* x_extent) +{ + wxSize s = wxAuiGenericTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent); + + int overlap = 0; + gtk_widget_style_get (wnd->GetHandle(), + "focus-line-width", &overlap, + NULL); + *x_extent -= overlap; + return s; +} +#endif // wxUSE_AUI diff --git a/Externals/wxWidgets3/src/aui/tabmdi.cpp b/Externals/wxWidgets3/src/aui/tabmdi.cpp index 413bfaf780..70c1a734e8 100644 --- a/Externals/wxWidgets3/src/aui/tabmdi.cpp +++ b/Externals/wxWidgets3/src/aui/tabmdi.cpp @@ -4,7 +4,6 @@ // Author: Hans Van Leemputten // Modified by: Benjamin I. Williams / Kirix Corporation // Created: 29/07/2002 -// RCS-ID: $Id: tabmdi.cpp 70909 2012-03-15 13:49:54Z VZ $ // Copyright: (c) Hans Van Leemputten // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,6 +37,7 @@ #endif //WX_PRECOMP #include "wx/stockitem.h" +#include "wx/aui/dockart.h" enum MDI_MENU_ID { @@ -79,6 +79,8 @@ wxAuiMDIParentFrame::wxAuiMDIParentFrame(wxWindow *parent, wxAuiMDIParentFrame::~wxAuiMDIParentFrame() { + // Avoid having GetActiveChild() called after m_pClientWindow is destroyed + SendDestroyEvent(); // Make sure the client window is destructed before the menu bars are! wxDELETE(m_pClientWindow); @@ -211,7 +213,8 @@ bool wxAuiMDIParentFrame::ProcessEvent(wxEvent& event) // let the active child (if any) process the event first. bool res = false; - if (m_pActiveChild && + wxAuiMDIChildFrame* pActiveChild = GetActiveChild(); + if (pActiveChild && event.IsCommandEvent() && event.GetEventObject() != m_pClientWindow && !(event.GetEventType() == wxEVT_ACTIVATE || @@ -222,7 +225,7 @@ bool wxAuiMDIParentFrame::ProcessEvent(wxEvent& event) event.GetEventType() == wxEVT_COMMAND_KILL_FOCUS ) ) { - res = m_pActiveChild->GetEventHandler()->ProcessEvent(event); + res = pActiveChild->GetEventHandler()->ProcessEvent(event); } if (!res) @@ -240,12 +243,19 @@ bool wxAuiMDIParentFrame::ProcessEvent(wxEvent& event) wxAuiMDIChildFrame *wxAuiMDIParentFrame::GetActiveChild() const { - return m_pActiveChild; + // We can be called before the client window is created, so check for its + // existence. + wxAuiMDIClientWindow* const client = GetClientWindow(); + return client ? client->GetActiveChild() : NULL; } void wxAuiMDIParentFrame::SetActiveChild(wxAuiMDIChildFrame* pChildFrame) { - m_pActiveChild = pChildFrame; + wxAuiMDIClientWindow* const client = GetClientWindow(); + if (client && client->GetActiveChild() != pChildFrame) + { + client->SetActiveChild(pChildFrame); + } } wxAuiMDIClientWindow *wxAuiMDIParentFrame::GetClientWindow() const @@ -286,7 +296,6 @@ void wxAuiMDIParentFrame::Init() { m_pLastEvt = NULL; m_pClientWindow = NULL; - m_pActiveChild = NULL; #if wxUSE_MENUS m_pWindowMenu = NULL; m_pMyMenuBar = NULL; @@ -326,18 +335,24 @@ void wxAuiMDIParentFrame::DoHandleMenu(wxCommandEvent& event) switch (event.GetId()) { case wxWINDOWCLOSE: - if (m_pActiveChild) - m_pActiveChild->Close(); + { + wxAuiMDIChildFrame* pActiveChild = GetActiveChild(); + if (pActiveChild) + pActiveChild->Close(); break; + } case wxWINDOWCLOSEALL: - while (m_pActiveChild) + { + wxAuiMDIChildFrame* pActiveChild; + while ((pActiveChild = GetActiveChild()) != NULL) { - if (!m_pActiveChild->Close()) + if (!pActiveChild->Close()) { return; // failure } } break; + } case wxWINDOWNEXT: ActivateNext(); break; @@ -496,12 +511,21 @@ bool wxAuiMDIChildFrame::Create(wxAuiMDIParentFrame* parent, SetMDIParentFrame(parent); - // this is the currently active child - parent->SetActiveChild(this); - m_title = title; pClientWindow->AddPage(this, title, m_activateOnCreate); + + // Check that the parent notion of the active child coincides with our one. + // This is less obvious that it seems because we must honour + // m_activateOnCreate flag but only if it's not the first child because + // this one becomes active unconditionally. + wxASSERT_MSG + ( + (m_activateOnCreate || pClientWindow->GetPageCount() == 1) + == (parent->GetActiveChild() == this), + wxS("Logic error: child [not] activated when it should [not] have been.") + ); + pClientWindow->Refresh(); return true; @@ -522,7 +546,6 @@ bool wxAuiMDIChildFrame::Destroy() event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); - pParentFrame->SetActiveChild(NULL); pParentFrame->SetChildMenuBar(NULL); } @@ -697,6 +720,14 @@ void wxAuiMDIChildFrame::Init() bool wxAuiMDIChildFrame::Show(bool show) { + // wxAuiMDIChildFrame uses m_activateOnCreate only to decide whether to + // activate the frame when it is created. After Create() is called, + // m_activateOnCreate will never be read again. Therefore, calling this + // function after Create() is pointless and you probably want to call + // Activate() instead. + wxCHECK_MSG( !GetHandle(), false, + wxS("Show() has no effect after Create(). Do you mean Activate()?") ); + m_activateOnCreate = show; // do nothing @@ -786,6 +817,15 @@ int wxAuiMDIClientWindow::SetSelection(size_t nPage) return wxAuiNotebook::SetSelection(nPage); } +wxAuiMDIChildFrame* wxAuiMDIClientWindow::GetActiveChild() +{ + const int sel = GetSelection(); + if ( sel == wxNOT_FOUND ) + return NULL; + + return wxStaticCast(GetPage(sel), wxAuiMDIChildFrame); +} + void wxAuiMDIClientWindow::PageChanged(int old_selection, int new_selection) { // don't do anything if the page doesn't actually change diff --git a/Externals/wxWidgets3/src/common/accelcmn.cpp b/Externals/wxWidgets3/src/common/accelcmn.cpp index 960c6ac7c3..003ecbc514 100644 --- a/Externals/wxWidgets3/src/common/accelcmn.cpp +++ b/Externals/wxWidgets3/src/common/accelcmn.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of platform-independent wxAcceleratorEntry parts // Author: Vadim Zeitlin // Created: 2007-05-05 -// RCS-ID: $Id: accelcmn.cpp 69853 2011-11-28 10:24:13Z SC $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -302,30 +301,43 @@ bool wxAcceleratorEntry::FromString(const wxString& str) return ParseAccel(str, &m_flags, &m_keyCode); } -wxString wxAcceleratorEntry::ToString() const +namespace +{ + +wxString PossiblyLocalize(const wxString& str, bool localize) +{ + return localize ? wxGetTranslation(str) : str; +} + +} + +wxString wxAcceleratorEntry::AsPossiblyLocalizedString(bool localized) const { wxString text; int flags = GetFlags(); if ( flags & wxACCEL_ALT ) - text += _("Alt+"); + text += PossiblyLocalize(wxTRANSLATE("Alt+"), localized); if ( flags & wxACCEL_CTRL ) - text += _("Ctrl+"); + text += PossiblyLocalize(wxTRANSLATE("Ctrl+"), localized); if ( flags & wxACCEL_SHIFT ) - text += _("Shift+"); + text += PossiblyLocalize(wxTRANSLATE("Shift+"), localized); #if defined(__WXMAC__) || defined(__WXCOCOA__) if ( flags & wxACCEL_RAW_CTRL ) - text += _("RawCtrl+"); + text += PossiblyLocalize(wxTRANSLATE("RawCtrl+"), localized); #endif const int code = GetKeyCode(); if ( code >= WXK_F1 && code <= WXK_F12 ) - text << _("F") << code - WXK_F1 + 1; + text << PossiblyLocalize(wxTRANSLATE("F"), localized) + << code - WXK_F1 + 1; else if ( code >= WXK_NUMPAD0 && code <= WXK_NUMPAD9 ) - text << _("KP_") << code - WXK_NUMPAD0; + text << PossiblyLocalize(wxTRANSLATE("KP_"), localized) + << code - WXK_NUMPAD0; else if ( code >= WXK_SPECIAL1 && code <= WXK_SPECIAL20 ) - text << _("SPECIAL") << code - WXK_SPECIAL1 + 1; + text << PossiblyLocalize(wxTRANSLATE("SPECIAL"), localized) + << code - WXK_SPECIAL1 + 1; else // check the named keys { size_t n; @@ -334,7 +346,7 @@ wxString wxAcceleratorEntry::ToString() const const wxKeyName& kn = wxKeyNames[n]; if ( code == kn.code ) { - text << wxGetTranslation(kn.name); + text << PossiblyLocalize(kn.name, localized); break; } } diff --git a/Externals/wxWidgets3/src/common/accesscmn.cpp b/Externals/wxWidgets3/src/common/accesscmn.cpp index 385a33936a..660f1090df 100644 --- a/Externals/wxWidgets3/src/common/accesscmn.cpp +++ b/Externals/wxWidgets3/src/common/accesscmn.cpp @@ -3,7 +3,6 @@ // Author: Julian Smart // Modified by: // Created: 2003-02-12 -// RCS-ID: $Id: accesscmn.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/affinematrix2d.cpp b/Externals/wxWidgets3/src/common/affinematrix2d.cpp index 0b1b9207dc..5013b31f15 100644 --- a/Externals/wxWidgets3/src/common/affinematrix2d.cpp +++ b/Externals/wxWidgets3/src/common/affinematrix2d.cpp @@ -127,19 +127,19 @@ void wxAffineMatrix2D::Scale(wxDouble xScale, wxDouble yScale) m_22 *= yScale; } -// add the rotation to this matrix (counter clockwise, radians) -// | cos -sin 0 | | m_11 m_12 0 | -// | sin cos 0 | x | m_21 m_22 0 | +// add the rotation to this matrix (clockwise, radians) +// | cos sin 0 | | m_11 m_12 0 | +// | -sin cos 0 | x | m_21 m_22 0 | // | 0 0 1 | | m_tx m_ty 1 | -void wxAffineMatrix2D::Rotate(wxDouble ccRadians) +void wxAffineMatrix2D::Rotate(wxDouble cRadians) { - wxDouble c = cos(ccRadians); - wxDouble s = sin(ccRadians); + wxDouble c = cos(cRadians); + wxDouble s = sin(cRadians); - wxDouble e11 = c*m_11 - s*m_21; - wxDouble e12 = c*m_12 - s*m_22; - m_21 = s*m_11 + c*m_21; - m_22 = s*m_12 + c*m_22; + wxDouble e11 = c*m_11 + s*m_21; + wxDouble e12 = c*m_12 + s*m_22; + m_21 = c*m_21 - s*m_11; + m_22 = c*m_22 - s*m_12; m_11 = e11; m_12 = e12; } @@ -159,7 +159,7 @@ wxAffineMatrix2D::DoTransformPoint(const wxPoint2DDouble& src) const return src; return wxPoint2DDouble(src.m_x * m_11 + src.m_y * m_21 + m_tx, - src.m_y * m_12 + src.m_y * m_22 + m_ty); + src.m_x * m_12 + src.m_y * m_22 + m_ty); } // applies the matrix except for translations @@ -173,7 +173,7 @@ wxAffineMatrix2D::DoTransformDistance(const wxPoint2DDouble& src) const return src; return wxPoint2DDouble(src.m_x * m_11 + src.m_y * m_21, - src.m_y * m_12 + src.m_y * m_22); + src.m_x * m_12 + src.m_y * m_22); } bool wxAffineMatrix2D::IsIdentity() const diff --git a/Externals/wxWidgets3/src/common/anidecod.cpp b/Externals/wxWidgets3/src/common/anidecod.cpp index 841d4d7483..d62c00b455 100644 --- a/Externals/wxWidgets3/src/common/anidecod.cpp +++ b/Externals/wxWidgets3/src/common/anidecod.cpp @@ -2,7 +2,6 @@ // Name: src/common/anidecod.cpp // Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation // Author: Francesco Montorsi -// RCS-ID: $Id: anidecod.cpp 67708 2011-05-05 23:52:07Z DS $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/animatecmn.cpp b/Externals/wxWidgets3/src/common/animatecmn.cpp index 29e9915de3..c8fb083300 100644 --- a/Externals/wxWidgets3/src/common/animatecmn.cpp +++ b/Externals/wxWidgets3/src/common/animatecmn.cpp @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified By: // Created: 24/09/2006 -// Id: $Id: animatecmn.cpp 60864 2009-06-01 20:54:03Z VZ $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/any.cpp b/Externals/wxWidgets3/src/common/any.cpp index f391a5f98a..f866c59448 100644 --- a/Externals/wxWidgets3/src/common/any.cpp +++ b/Externals/wxWidgets3/src/common/any.cpp @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: 07/05/2009 -// RCS-ID: $Id: any.cpp 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -374,7 +373,7 @@ bool wxAnyConvertString(const wxString& value, else if ( wxANY_VALUE_TYPE_CHECK_TYPE(dstType, double) ) { double value2; - if ( !value.ToDouble(&value2) ) + if ( !value.ToCDouble(&value2) ) return false; wxAnyValueTypeImplDouble::SetValue(value2, dst); } @@ -453,7 +452,7 @@ bool wxAnyValueTypeImplDouble::ConvertValue(const wxAnyValueBuffer& src, } else if ( wxANY_VALUE_TYPE_CHECK_TYPE(dstType, wxString) ) { - wxString s = wxString::Format(wxS("%.14g"), value); + wxString s = wxString::FromCDouble(value, 14); wxAnyValueTypeImpl::SetValue(s, dst); } else @@ -484,7 +483,9 @@ WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl) class wxAnyNullValue { -private: +protected: + // this field is unused, but can't be private to avoid Clang's + // "Private field 'm_dummy' is not used" warning void* m_dummy; }; diff --git a/Externals/wxWidgets3/src/common/appbase.cpp b/Externals/wxWidgets3/src/common/appbase.cpp index 8cdf4e26fe..da6f2948ef 100644 --- a/Externals/wxWidgets3/src/common/appbase.cpp +++ b/Externals/wxWidgets3/src/common/appbase.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.06.2003 (extracted from common/appcmn.cpp) -// RCS-ID: $Id: appbase.cpp 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -47,10 +46,15 @@ #include "wx/tokenzr.h" #include "wx/thread.h" -#if wxUSE_EXCEPTIONS && wxUSE_STL - #include - #include -#endif +#if wxUSE_STL + #if wxUSE_EXCEPTIONS + #include + #include + #endif + #if wxUSE_INTL + #include + #endif +#endif // wxUSE_STL #if !defined(__WINDOWS__) || defined(__WXMICROWIN__) #include // for SIGTRAP used by wxTrap() @@ -169,10 +173,6 @@ wxAppConsoleBase::~wxAppConsoleBase() bool wxAppConsoleBase::Initialize(int& WXUNUSED(argc), wxChar **WXUNUSED(argv)) { -#if wxUSE_INTL - GetTraits()->SetLocale(); -#endif // wxUSE_INTL - return true; } @@ -255,6 +255,10 @@ int wxAppConsoleBase::OnRun() return MainLoop(); } +void wxAppConsoleBase::OnLaunched() +{ +} + int wxAppConsoleBase::OnExit() { #if wxUSE_CONFIG @@ -303,6 +307,15 @@ wxAppTraits *wxAppConsoleBase::GetTraitsIfExists() return app ? app->GetTraits() : NULL; } +/* static */ +wxAppTraits& wxAppConsoleBase::GetValidTraits() +{ + static wxConsoleAppTraits s_traitsConsole; + wxAppTraits* const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + + return traits ? *traits : s_traitsConsole; +} + // ---------------------------------------------------------------------------- // wxEventLoop redirection // ---------------------------------------------------------------------------- @@ -311,6 +324,9 @@ int wxAppConsoleBase::MainLoop() { wxEventLoopBaseTiedPtr mainLoop(&m_mainLoop, CreateMainLoop()); + if (wxTheApp) + wxTheApp->OnLaunched(); + return m_mainLoop ? m_mainLoop->Run() : -1; } @@ -779,6 +795,18 @@ void wxAppConsoleBase::OnAssert(const wxChar *file, OnAssertFailure(file, line, NULL, cond, msg); } +// ---------------------------------------------------------------------------- +// Miscellaneous other methods +// ---------------------------------------------------------------------------- + +void wxAppConsoleBase::SetCLocale() +{ + // We want to use the user locale by default in GUI applications in order + // to show the numbers, dates &c in the familiar format -- and also accept + // this format on input (especially important for decimal comma/dot). + wxSetlocale(LC_ALL, ""); +} + // ============================================================================ // other classes implementations // ============================================================================ @@ -831,14 +859,6 @@ bool wxConsoleAppTraitsBase::HasStderr() // wxAppTraits // ---------------------------------------------------------------------------- -#if wxUSE_INTL -void wxAppTraitsBase::SetLocale() -{ - wxSetlocale(LC_ALL, ""); - wxUpdateLocaleIsUtf8(); -} -#endif - #if wxUSE_THREADS void wxMutexGuiEnterImpl(); void wxMutexGuiLeaveImpl(); @@ -953,7 +973,7 @@ wxString wxAppTraitsBase::GetAssertStackTrace() static const int maxLines = 20; StackDump dump; - dump.Walk(2, maxLines); // don't show OnAssert() call itself + dump.Walk(8, maxLines); // 8 is chosen to hide all OnAssert() calls stackTrace = dump.GetStackTrace(); const int count = stackTrace.Freq(wxT('\n')); @@ -1014,6 +1034,8 @@ void wxAbort() #if wxDEBUG_LEVEL // break into the debugger +#ifndef wxTrap + void wxTrap() { #if defined(__WINDOWS__) && !defined(__WXMICROWIN__) @@ -1027,6 +1049,8 @@ void wxTrap() #endif // Win/Unix } +#endif // wxTrap already defined as a macro + // default assert handler static void wxDefaultAssertHandler(const wxString& file, @@ -1176,6 +1200,8 @@ static void LINKAGEMODE SetTraceMasks() #if wxDEBUG_LEVEL +bool wxTrapInAssert = false; + static bool DoShowAssertDialog(const wxString& msg) { @@ -1190,11 +1216,18 @@ bool DoShowAssertDialog(const wxString& msg) wxT("You can also choose [Cancel] to suppress ") wxT("further warnings."); - switch ( ::MessageBox(NULL, msgDlg.wx_str(), wxT("wxWidgets Debug Alert"), + switch ( ::MessageBox(NULL, msgDlg.t_str(), wxT("wxWidgets Debug Alert"), MB_YESNOCANCEL | MB_ICONSTOP ) ) { case IDYES: - wxTrap(); + // If we called wxTrap() directly from here, the programmer would + // see this function and a few more calls between his own code and + // it in the stack trace which would be perfectly useless and often + // confusing. So instead just set the flag here and let the macros + // defined in wx/debug.h call wxTrap() themselves, this ensures + // that the debugger will show the line in the user code containing + // the failing assert. + wxTrapInAssert = true; break; case IDCANCEL: diff --git a/Externals/wxWidgets3/src/common/appcmn.cpp b/Externals/wxWidgets3/src/common/appcmn.cpp index 6c7129139a..821f695bac 100644 --- a/Externals/wxWidgets3/src/common/appcmn.cpp +++ b/Externals/wxWidgets3/src/common/appcmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 18.10.99 -// RCS-ID: $Id: appcmn.cpp 70353 2012-01-15 14:46:41Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -84,6 +83,27 @@ wxAppBase::wxAppBase() bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig) { +#ifdef __WXOSX__ + // Mac OS X passes a process serial number command line argument when + // the application is launched from the Finder. This argument must be + // removed from the command line arguments before being handled by the + // application (otherwise applications would need to handle it) + // + // Notice that this has to be done for all ports that can be used under OS + // X (e.g. wxGTK) and not just wxOSX itself, hence this code is here and + // not in a port-specific file. + if ( argcOrig > 1 ) + { + static const wxChar *ARG_PSN = wxT("-psn_"); + if ( wxStrncmp(argvOrig[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 ) + { + // remove this argument + --argcOrig; + memmove(argvOrig + 1, argvOrig + 2, argcOrig * sizeof(wxChar*)); + } + } +#endif // __WXOSX__ + if ( !wxAppConsole::Initialize(argcOrig, argvOrig) ) return false; diff --git a/Externals/wxWidgets3/src/common/arcall.cpp b/Externals/wxWidgets3/src/common/arcall.cpp index bedf19becd..49776dcce5 100644 --- a/Externals/wxWidgets3/src/common/arcall.cpp +++ b/Externals/wxWidgets3/src/common/arcall.cpp @@ -2,7 +2,6 @@ // Name: src/common/arcall.cpp // Purpose: wxArchive link all archive streams // Author: Mike Wetherell -// RCS-ID: $Id: arcall.cpp 42508 2006-10-27 09:53:38Z MW $ // Copyright: (c) 2006 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/arcfind.cpp b/Externals/wxWidgets3/src/common/arcfind.cpp index dc9a0d179a..6f90d5cc50 100644 --- a/Externals/wxWidgets3/src/common/arcfind.cpp +++ b/Externals/wxWidgets3/src/common/arcfind.cpp @@ -2,7 +2,6 @@ // Name: src/common/arcfind.cpp // Purpose: Streams for archive formats // Author: Mike Wetherell -// RCS-ID: $Id: arcfind.cpp 46391 2007-06-10 17:42:41Z VS $ // Copyright: (c) Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/archive.cpp b/Externals/wxWidgets3/src/common/archive.cpp index 1c2dfdb44c..360f22936c 100644 --- a/Externals/wxWidgets3/src/common/archive.cpp +++ b/Externals/wxWidgets3/src/common/archive.cpp @@ -2,7 +2,6 @@ // Name: src/common/archive.cpp // Purpose: Streams for archive formats // Author: Mike Wetherell -// RCS-ID: $Id: archive.cpp 42508 2006-10-27 09:53:38Z MW $ // Copyright: (c) Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/arrstr.cpp b/Externals/wxWidgets3/src/common/arrstr.cpp index c186bb0da2..f66fcdd4ee 100644 --- a/Externals/wxWidgets3/src/common/arrstr.cpp +++ b/Externals/wxWidgets3/src/common/arrstr.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 29/01/98 -// RCS-ID: $Id: arrstr.cpp 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/artprov.cpp b/Externals/wxWidgets3/src/common/artprov.cpp index 5377d3e560..f2551614d4 100644 --- a/Externals/wxWidgets3/src/common/artprov.cpp +++ b/Externals/wxWidgets3/src/common/artprov.cpp @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 18/03/2002 -// RCS-ID: $Id: artprov.cpp 70154 2011-12-28 13:51:29Z VZ $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/artstd.cpp b/Externals/wxWidgets3/src/common/artstd.cpp index fe65503986..471146647b 100644 --- a/Externals/wxWidgets3/src/common/artstd.cpp +++ b/Externals/wxWidgets3/src/common/artstd.cpp @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 18/03/2002 -// RCS-ID: $Id: artstd.cpp 70893 2012-03-13 17:23:58Z JS $ // Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/arttango.cpp b/Externals/wxWidgets3/src/common/arttango.cpp index ae01e9e85a..156ae8fc06 100644 --- a/Externals/wxWidgets3/src/common/arttango.cpp +++ b/Externals/wxWidgets3/src/common/arttango.cpp @@ -3,7 +3,6 @@ // Purpose: art provider using embedded PNG versions of Tango icons // Author: Vadim Zeitlin // Created: 2010-12-27 -// RCS-ID: $Id: arttango.cpp 70154 2011-12-28 13:51:29Z VZ $ // Copyright: (c) 2010 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/base64.cpp b/Externals/wxWidgets3/src/common/base64.cpp index fc0cb57755..5ee3a7a3c7 100644 --- a/Externals/wxWidgets3/src/common/base64.cpp +++ b/Externals/wxWidgets3/src/common/base64.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of BASE64 encoding/decoding functions // Author: Charles Reimers, Vadim Zeitlin // Created: 2007-06-18 -// RCS-ID: $Id: base64.cpp 61753 2009-08-23 22:25:12Z VZ $ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/bmpbase.cpp b/Externals/wxWidgets3/src/common/bmpbase.cpp index 403470fe29..763b9597f9 100644 --- a/Externals/wxWidgets3/src/common/bmpbase.cpp +++ b/Externals/wxWidgets3/src/common/bmpbase.cpp @@ -3,7 +3,6 @@ // Purpose: wxBitmapBase // Author: VaclavSlavik // Created: 2001/04/11 -// RCS-ID: $Id: bmpbase.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 2001, Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -23,6 +22,12 @@ #include "wx/image.h" #endif // WX_PRECOMP +#if wxUSE_IMAGE && wxUSE_LIBPNG && wxUSE_STREAMS + #define wxHAS_PNG_LOAD + + #include "wx/mstream.h" +#endif + // ---------------------------------------------------------------------------- // wxVariant support // ---------------------------------------------------------------------------- @@ -37,6 +42,31 @@ IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxIcon,WXDLLEXPORT) //WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl) #endif +// ---------------------------------------------------------------------------- +// wxBitmapHelpers +// ---------------------------------------------------------------------------- + +// wxOSX has a native version and doesn't use this one. + +#ifndef __WXOSX__ + +/* static */ +wxBitmap wxBitmapHelpers::NewFromPNGData(const void* data, size_t size) +{ + wxBitmap bitmap; + +#ifdef wxHAS_PNG_LOAD + wxMemoryInputStream is(data, size); + wxImage image(is, wxBITMAP_TYPE_PNG); + if ( image.IsOk() ) + bitmap = wxBitmap(image); +#endif // wxHAS_PNG_LOAD + + return bitmap; +} + +#endif // !__WXOSX__ + // ---------------------------------------------------------------------------- // wxBitmapBase // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/common/bmpbtncmn.cpp b/Externals/wxWidgets3/src/common/bmpbtncmn.cpp index 8c2e3e0d1b..8760c70c09 100644 --- a/Externals/wxWidgets3/src/common/bmpbtncmn.cpp +++ b/Externals/wxWidgets3/src/common/bmpbtncmn.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: bmpbtncmn.cpp 66584 2011-01-05 06:56:36Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,9 @@ #include "wx/image.h" #endif +#include "wx/artprov.h" +#include "wx/renderer.h" + // ---------------------------------------------------------------------------- // XTI // ---------------------------------------------------------------------------- @@ -90,4 +92,67 @@ bitmap "focus" , bitmap "disabled" , */ +namespace +{ + +#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP + +wxBitmap +GetCloseButtonBitmap(wxWindow *win, + const wxSize& size, + const wxColour& colBg, + int flags = 0) +{ + wxBitmap bmp(size); + wxMemoryDC dc(bmp); + dc.SetBackground(colBg); + dc.Clear(); + wxRendererNative::Get(). + DrawTitleBarBitmap(win, dc, size, wxTITLEBAR_BUTTON_CLOSE, flags); + return bmp; +} + +#endif // wxHAS_DRAW_TITLE_BAR_BITMAP + +} // anonymous namespace + +/* static */ +wxBitmapButton* +wxBitmapButtonBase::NewCloseButton(wxWindow* parent, wxWindowID winid) +{ + wxCHECK_MSG( parent, NULL, wxS("Must have a valid parent") ); + + const wxColour colBg = parent->GetBackgroundColour(); + +#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP + const wxSize sizeBmp = wxArtProvider::GetSizeHint(wxART_BUTTON); + wxBitmap bmp = GetCloseButtonBitmap(parent, sizeBmp, colBg); +#else // !wxHAS_DRAW_TITLE_BAR_BITMAP + wxBitmap bmp = wxArtProvider::GetBitmap(wxART_CLOSE, wxART_BUTTON); +#endif // wxHAS_DRAW_TITLE_BAR_BITMAP + + wxBitmapButton* const button = new wxBitmapButton + ( + parent, + winid, + bmp, + wxDefaultPosition, + wxDefaultSize, + wxBORDER_NONE + ); + +#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP + button->SetBitmapPressed( + GetCloseButtonBitmap(parent, sizeBmp, colBg, wxCONTROL_PRESSED)); + + button->SetBitmapCurrent( + GetCloseButtonBitmap(parent, sizeBmp, colBg, wxCONTROL_CURRENT)); +#endif // wxHAS_DRAW_TITLE_BAR_BITMAP + + // The button should blend with its parent background. + button->SetBackgroundColour(colBg); + + return button; +} + #endif // wxUSE_BMPBUTTON diff --git a/Externals/wxWidgets3/src/common/bmpcboxcmn.cpp b/Externals/wxWidgets3/src/common/bmpcboxcmn.cpp index 2606b8c57d..1fa3c83ffa 100644 --- a/Externals/wxWidgets3/src/common/bmpcboxcmn.cpp +++ b/Externals/wxWidgets3/src/common/bmpcboxcmn.cpp @@ -3,7 +3,6 @@ // Purpose: wxBitmapComboBox // Author: Jaakko Salli // Created: 2008-04-09 -// RCS-ID: $Id: bmpcboxcmn.cpp 66728 2011-01-22 14:38:36Z DS $ // Copyright: (c) 2008 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/bookctrl.cpp b/Externals/wxWidgets3/src/common/bookctrl.cpp index c722822df5..4b321322b4 100644 --- a/Externals/wxWidgets3/src/common/bookctrl.cpp +++ b/Externals/wxWidgets3/src/common/bookctrl.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.08.03 -// RCS-ID: $Id: bookctrl.cpp 70153 2011-12-28 13:51:25Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -105,27 +104,21 @@ void wxBookCtrlBase::DoInvalidateBestSize() wxSize wxBookCtrlBase::CalcSizeFromPage(const wxSize& sizePage) const { - // We need to add the size of the controller and the border between if it's - // shown. Notice that we don't use GetControllerSize() here as it returns - // the actual size while we want the best size here. + // Add the size of the controller and the border between if it's shown. if ( !m_bookctrl || !m_bookctrl->IsShown() ) return sizePage; - const wxSize sizeController = m_bookctrl->GetBestSize(); + // Notice that the controller size is its current size while we really want + // to have its best size. So we only take into account its size in the + // direction in which we should add it but not in the other one, where the + // controller size is determined by the size of wxBookCtrl itself. + const wxSize sizeController = GetControllerSize(); wxSize size = sizePage; if ( IsVertical() ) - { - if ( sizeController.x > sizePage.x ) - size.x = sizeController.x; size.y += sizeController.y + GetInternalBorder(); - } else // left/right aligned - { size.x += sizeController.x + GetInternalBorder(); - if ( sizeController.y > sizePage.y ) - size.y = sizeController.y; - } return size; } @@ -139,26 +132,22 @@ wxSize wxBookCtrlBase::DoGetBestSize() const { wxSize bestSize; - // iterate over all pages, get the largest width and height - const size_t nCount = m_pages.size(); - for ( size_t nPage = 0; nPage < nCount; nPage++ ) + if (m_fitToCurrentPage && GetCurrentPage()) { - const wxWindow * const pPage = m_pages[nPage]; - if( pPage ) + bestSize = GetCurrentPage()->GetBestSize(); + } + else + { + // iterate over all pages, get the largest width and height + const size_t nCount = m_pages.size(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) { - wxSize childBestSize(pPage->GetBestSize()); - - if ( childBestSize.x > bestSize.x ) - bestSize.x = childBestSize.x; - - if ( childBestSize.y > bestSize.y ) - bestSize.y = childBestSize.y; + const wxWindow * const pPage = m_pages[nPage]; + if ( pPage ) + bestSize.IncTo(pPage->GetBestSize()); } } - if (m_fitToCurrentPage && GetCurrentPage()) - bestSize = GetCurrentPage()->GetBestSize(); - // convert display area to window area, adding the size necessary for the // tabs wxSize best = CalcSizeFromPage(bestSize); @@ -288,19 +277,19 @@ wxSize wxBookCtrlBase::GetControllerSize() const if ( !m_bookctrl || !m_bookctrl->IsShown() ) return wxSize(0, 0); - const wxSize sizeClient = GetClientSize(), - sizeCtrl = m_bookctrl->GetBestSize(); + const wxSize sizeClient = GetClientSize(); wxSize size; + // Ask for the best width/height considering the other direction. if ( IsVertical() ) { size.x = sizeClient.x; - size.y = sizeCtrl.y; + size.y = m_bookctrl->GetBestHeight(sizeClient.x); } else // left/right aligned { - size.x = sizeCtrl.x; + size.x = m_bookctrl->GetBestWidth(sizeClient.y); size.y = sizeClient.y; } @@ -441,6 +430,18 @@ int wxBookCtrlBase::GetNextPage(bool forward) const return nPage; } +int wxBookCtrlBase::FindPage(const wxWindow* page) const +{ + const size_t nCount = m_pages.size(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) + { + if ( m_pages[nPage] == page ) + return (int)nPage; + } + + return wxNOT_FOUND; +} + bool wxBookCtrlBase::DoSetSelectionAfterInsertion(size_t n, bool bSelect) { if ( bSelect ) @@ -454,6 +455,26 @@ bool wxBookCtrlBase::DoSetSelectionAfterInsertion(size_t n, bool bSelect) return true; } +void wxBookCtrlBase::DoSetSelectionAfterRemoval(size_t n) +{ + if ( m_selection >= (int)n ) + { + // ensure that the selection is valid + int sel; + if ( GetPageCount() == 0 ) + sel = wxNOT_FOUND; + else + sel = m_selection ? m_selection - 1 : 0; + + // if deleting current page we shouldn't try to hide it + m_selection = m_selection == (int)n ? wxNOT_FOUND + : m_selection - 1; + + if ( sel != wxNOT_FOUND && sel != m_selection ) + SetSelection(sel); + } +} + int wxBookCtrlBase::DoSetSelection(size_t n, int flags) { wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, @@ -478,11 +499,11 @@ int wxBookCtrlBase::DoSetSelection(size_t n, int flags) if ( !(flags & SetSelection_SendEvent) || allowed) { if ( oldSel != wxNOT_FOUND ) - m_pages[oldSel]->Hide(); + DoShowPage(m_pages[oldSel], false); wxWindow *page = m_pages[n]; page->SetSize(GetPageRect()); - page->Show(); + DoShowPage(page, true); // change selection now to ignore the selection change event UpdateSelectedPage(n); diff --git a/Externals/wxWidgets3/src/common/btncmn.cpp b/Externals/wxWidgets3/src/common/btncmn.cpp index e59d7118ac..cbbfd0f14e 100644 --- a/Externals/wxWidgets3/src/common/btncmn.cpp +++ b/Externals/wxWidgets3/src/common/btncmn.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of wxButtonBase // Author: Vadim Zeitlin // Created: 2007-04-08 -// RCS-ID: $Id: btncmn.cpp 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -75,7 +74,7 @@ wxEND_FLAGS( wxButtonStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxButton, wxControl, "wx/button.h") wxBEGIN_PROPERTIES_TABLE(wxButton) -wxEVENT_PROPERTY( Click, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEvent ) +wxEVENT_PROPERTY( Click, wxEVT_BUTTON, wxCommandEvent ) wxPROPERTY( Font, wxFont, SetFont, GetFont, wxEMPTY_PARAMETER_VALUE, \ 0 /*flags*/, wxT("The font associated with the button label"), wxT("group")) diff --git a/Externals/wxWidgets3/src/common/cairo.cpp b/Externals/wxWidgets3/src/common/cairo.cpp index 7425bf2afa..a10ca6499f 100644 --- a/Externals/wxWidgets3/src/common/cairo.cpp +++ b/Externals/wxWidgets3/src/common/cairo.cpp @@ -3,7 +3,6 @@ // Purpose: Cairo library // Author: Anthony Betaudeau // Created: 2007-08-25 -// RCS-ID: $Id: cairo.cpp 69486 2011-10-20 04:58:00Z RD $ // Copyright: (c) Anthony Bretaudeau // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,14 +15,18 @@ #pragma hdrstop #endif +#if wxUSE_CAIRO + // keep cairo.h from defining dllimport as we're defining the symbols inside // the wx dll in order to load them dynamically. #define cairo_public -#include "wx/cairo.h" +#include #include "wx/dynlib.h" -#if wxUSE_CAIRO +#ifdef __WXMSW__ +#include "wx/msw/wrapwin.h" +#endif #ifdef __WXMAC__ #include "wx/osx/private.h" @@ -375,18 +378,13 @@ bool wxCairo::IsOk() // implementation of the functions themselves // ============================================================================ -extern "C" -{ - bool wxCairoInit() { return wxCairo::Initialize(); } -void wxCairoCleanUp() +extern "C" { - wxCairo::CleanUp(); -} #define wxIMPL_CAIRO_FUNC(rettype, name, params, args, defret) \ rettype name params \ diff --git a/Externals/wxWidgets3/src/common/calctrlcmn.cpp b/Externals/wxWidgets3/src/common/calctrlcmn.cpp index 93ac0dbc9f..2b869127b2 100644 --- a/Externals/wxWidgets3/src/common/calctrlcmn.cpp +++ b/Externals/wxWidgets3/src/common/calctrlcmn.cpp @@ -2,7 +2,6 @@ // Name: src/common/calctrlcmn.cpp // Author: Marcin Wojdyr // Created: 2008-03-26 -// RCS-ID: $Id: calctrlcmn.cpp 69224 2011-09-29 13:43:15Z VZ $ // Copyright: (C) Marcin Wojdyr // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/checkboxcmn.cpp b/Externals/wxWidgets3/src/common/checkboxcmn.cpp index f3f245cf96..b31d85338d 100644 --- a/Externals/wxWidgets3/src/common/checkboxcmn.cpp +++ b/Externals/wxWidgets3/src/common/checkboxcmn.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: checkboxcmn.cpp 66592 2011-01-05 18:27:58Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -68,7 +67,7 @@ wxEND_FLAGS( wxCheckBoxStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckBox, wxControl, "wx/checkbox.h") wxBEGIN_PROPERTIES_TABLE(wxCheckBox) - wxEVENT_PROPERTY( Click, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEvent ) + wxEVENT_PROPERTY( Click, wxEVT_CHECKBOX, wxCommandEvent ) wxPROPERTY( Font, wxFont, SetFont, GetFont, wxEMPTY_PARAMETER_VALUE, \ 0 /*flags*/, wxT("Helpstring"), wxT("group")) diff --git a/Externals/wxWidgets3/src/common/checklstcmn.cpp b/Externals/wxWidgets3/src/common/checklstcmn.cpp index 6f9ace5d60..be56ca3e17 100644 --- a/Externals/wxWidgets3/src/common/checklstcmn.cpp +++ b/Externals/wxWidgets3/src/common/checklstcmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 16.11.97 -// RCS-ID: $Id: checklstcmn.cpp 66584 2011-01-05 06:56:36Z PC $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -87,7 +86,7 @@ wxEND_FLAGS( wxCheckListBoxStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckListBox, wxListBox, "wx/checklst.h") wxBEGIN_PROPERTIES_TABLE(wxCheckListBox) - wxEVENT_PROPERTY( Toggle, wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, wxCommandEvent ) + wxEVENT_PROPERTY( Toggle, wxEVT_CHECKLISTBOX, wxCommandEvent ) wxPROPERTY_FLAGS( WindowStyle, wxCheckListBoxStyle, long, SetWindowStyleFlag, \ GetWindowStyleFlag, wxEMPTY_PARAMETER_VALUE, wxLB_OWNERDRAW /*flags*/, \ wxT("Helpstring"), wxT("group")) // style @@ -99,4 +98,22 @@ wxCONSTRUCTOR_4( wxCheckListBox, wxWindow*, Parent, wxWindowID, Id, \ wxPoint, Position, wxSize, Size ) +// ============================================================================ +// implementation +// ============================================================================ + +unsigned int wxCheckListBoxBase::GetCheckedItems(wxArrayInt& checkedItems) const +{ + unsigned int const numberOfItems = GetCount(); + + checkedItems.clear(); + for ( unsigned int i = 0; i < numberOfItems; ++i ) + { + if ( IsChecked(i) ) + checkedItems.push_back(i); + } + + return checkedItems.size(); +} + #endif diff --git a/Externals/wxWidgets3/src/common/choiccmn.cpp b/Externals/wxWidgets3/src/common/choiccmn.cpp index 075823d0ea..6ac940b424 100644 --- a/Externals/wxWidgets3/src/common/choiccmn.cpp +++ b/Externals/wxWidgets3/src/common/choiccmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 26.07.99 -// RCS-ID: $Id: choiccmn.cpp 66574 2011-01-04 14:13:29Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,6 +27,8 @@ #include "wx/choice.h" +#include "wx/private/textmeasure.h" + #ifndef WX_PRECOMP #endif @@ -68,7 +69,7 @@ wxEND_FLAGS( wxChoiceStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxChoice, wxControl, "wx/choice.h") wxBEGIN_PROPERTIES_TABLE(wxChoice) -wxEVENT_PROPERTY( Select, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEvent ) +wxEVENT_PROPERTY( Select, wxEVT_CHOICE, wxCommandEvent ) wxPROPERTY( Font, wxFont, SetFont, GetFont , wxEMPTY_PARAMETER_VALUE, \ 0 /*flags*/, wxT("Helpstring"), wxT("group")) @@ -103,6 +104,21 @@ wxChoiceBase::~wxChoiceBase() // this destructor is required for Darwin } +wxSize wxChoiceBase::DoGetBestSize() const +{ + // a reasonable width for an empty choice list + wxSize best(80, -1); + + const unsigned int nItems = GetCount(); + if ( nItems > 0 ) + { + wxTextMeasure txm(this); + best.x = txm.GetLargestStringExtent(GetStrings()).x; + } + + return best; +} + // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/common/clipcmn.cpp b/Externals/wxWidgets3/src/common/clipcmn.cpp index 4ee1d89a8c..b108944252 100644 --- a/Externals/wxWidgets3/src/common/clipcmn.cpp +++ b/Externals/wxWidgets3/src/common/clipcmn.cpp @@ -4,7 +4,6 @@ // Author: Robert Roebling // Modified by: // Created: 28.06.99 -// RCS-ID: $Id: clipcmn.cpp 61485 2009-07-20 23:54:08Z VZ $ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/clntdata.cpp b/Externals/wxWidgets3/src/common/clntdata.cpp index b702cff3b8..1cb5595785 100644 --- a/Externals/wxWidgets3/src/common/clntdata.cpp +++ b/Externals/wxWidgets3/src/common/clntdata.cpp @@ -4,7 +4,6 @@ // Author: Robin Dunn // Modified by: // Created: 9-Oct-2001 -// RCS-ID: $Id: clntdata.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/clrpickercmn.cpp b/Externals/wxWidgets3/src/common/clrpickercmn.cpp index 1dc183a0af..8320178596 100644 --- a/Externals/wxWidgets3/src/common/clrpickercmn.cpp +++ b/Externals/wxWidgets3/src/common/clrpickercmn.cpp @@ -4,7 +4,6 @@ // Author: Francesco Montorsi (readapted code written by Vadim Zeitlin) // Modified by: // Created: 15/04/2006 -// RCS-ID: $Id: clrpickercmn.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Vadim Zeitlin, Francesco Montorsi // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -39,7 +38,7 @@ const char wxColourPickerWidgetNameStr[] = "colourpickerwidget"; // implementation // ============================================================================ -wxDEFINE_EVENT(wxEVT_COMMAND_COLOURPICKER_CHANGED, wxColourPickerEvent); +wxDEFINE_EVENT(wxEVT_COLOURPICKER_CHANGED, wxColourPickerEvent); IMPLEMENT_DYNAMIC_CLASS(wxColourPickerCtrl, wxPickerBase) IMPLEMENT_DYNAMIC_CLASS(wxColourPickerEvent, wxEvent) @@ -68,7 +67,7 @@ bool wxColourPickerCtrl::Create( wxWindow *parent, wxWindowID id, // complete sizer creation wxPickerBase::PostCreation(); - m_picker->Connect(wxEVT_COMMAND_COLOURPICKER_CHANGED, + m_picker->Connect(wxEVT_COLOURPICKER_CHANGED, wxColourPickerEventHandler(wxColourPickerCtrl::OnColourChange), NULL, this); @@ -96,13 +95,6 @@ void wxColourPickerCtrl::UpdatePickerFromTextCtrl() { wxASSERT(m_text); - if (m_bIgnoreNextTextCtrlUpdate) - { - // ignore this update - m_bIgnoreNextTextCtrlUpdate = false; - return; - } - // wxString -> wxColour conversion wxColour col(m_text->GetValue()); if ( !col.IsOk() ) @@ -123,11 +115,9 @@ void wxColourPickerCtrl::UpdateTextCtrlFromPicker() if (!m_text) return; // no textctrl to update - // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED - // which will trigger a unneeded UpdateFromTextCtrl(); thus before using - // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag... - m_bIgnoreNextTextCtrlUpdate = true; - m_text->SetValue(M_PICKER->GetColour().GetAsString()); + // Take care to use ChangeValue() here and not SetValue() to avoid + // infinite recursion. + m_text->ChangeValue(M_PICKER->GetColour().GetAsString()); } diff --git a/Externals/wxWidgets3/src/common/cmdline.cpp b/Externals/wxWidgets3/src/common/cmdline.cpp index e270ade86f..e8892831ac 100644 --- a/Externals/wxWidgets3/src/common/cmdline.cpp +++ b/Externals/wxWidgets3/src/common/cmdline.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05.01.00 -// RCS-ID: $Id: cmdline.cpp 68316 2011-07-21 13:49:55Z VZ $ // Copyright: (c) 2000 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -682,7 +681,15 @@ int wxCmdLineParser::Parse(bool showUsage) continue; } - +#ifdef __WXOSX__ + if ( arg == wxT("-ApplePersistenceIgnoreState") ) + { + maybeOption = false; + + continue; + } +#endif + // empty argument or just '-' is not an option but a parameter if ( maybeOption && arg.length() > 1 && // FIXME-UTF8: use wc_str() after removing ANSI build @@ -969,8 +976,8 @@ int wxCmdLineParser::Parse(bool showUsage) case wxCMD_LINE_VAL_DATE: { wxDateTime dt; - wxString::const_iterator end; - if ( !dt.ParseDate(value, &end) || end != value.end() ) + wxString::const_iterator endDate; + if ( !dt.ParseDate(value, &endDate) || endDate != value.end() ) { errorMsg << wxString::Format(_("Option '%s': '%s' cannot be converted to a date."), name.c_str(), value.c_str()) @@ -1377,6 +1384,23 @@ static wxString GetLongOptionName(wxString::const_iterator p, Windows conventions for the command line handling, not Unix ones. For instance, backslash is not special except when it precedes double quote when it does quote it. + + TODO: Rewrite this to follow the even more complicated rule used by Windows + CommandLineToArgv(): + + * A string of backslashes not followed by a quotation mark has no special + meaning. + * An even number of backslashes followed by a quotation mark is treated as + pairs of protected backslashes, followed by a word terminator. + * An odd number of backslashes followed by a quotation mark is treated as + pairs of protected backslashes, followed by a protected quotation mark. + + See http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx + + It could also be useful to provide a converse function which is also + non-trivial, see + + http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx */ /* static */ diff --git a/Externals/wxWidgets3/src/common/cmdproc.cpp b/Externals/wxWidgets3/src/common/cmdproc.cpp index 75ef4d3166..54f14ea028 100644 --- a/Externals/wxWidgets3/src/common/cmdproc.cpp +++ b/Externals/wxWidgets3/src/common/cmdproc.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart (extracted from docview.h by VZ) // Modified by: // Created: 05.11.00 -// RCS-ID: $Id: cmdproc.cpp 70460 2012-01-25 00:05:12Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/cmndata.cpp b/Externals/wxWidgets3/src/common/cmndata.cpp index 95de654375..18b2ef927f 100644 --- a/Externals/wxWidgets3/src/common/cmndata.cpp +++ b/Externals/wxWidgets3/src/common/cmndata.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: cmndata.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/colourcmn.cpp b/Externals/wxWidgets3/src/common/colourcmn.cpp index d596deec62..12b5f2007c 100644 --- a/Externals/wxWidgets3/src/common/colourcmn.cpp +++ b/Externals/wxWidgets3/src/common/colourcmn.cpp @@ -4,7 +4,6 @@ // Author: Francesco Montorsi // Modified by: // Created: 20/4/2006 -// RCS-ID: $Id: colourcmn.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Francesco Montorsi // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -273,6 +272,16 @@ void wxColourBase::MakeDisabled(unsigned char* r, unsigned char* g, unsigned cha *b = AlphaBlend(*b, brightness, 0.4); } +wxColour& wxColourBase::MakeDisabled(unsigned char brightness) +{ + unsigned char r = Red(), + g = Green(), + b = Blue(); + MakeDisabled(&r, &g, &b, brightness); + Set(r, g, b, Alpha()); + return static_cast(*this); +} + // AlphaBlend is used by ChangeLightness and MakeDisabled // static diff --git a/Externals/wxWidgets3/src/common/colourdata.cpp b/Externals/wxWidgets3/src/common/colourdata.cpp index 49996df461..3569c50514 100644 --- a/Externals/wxWidgets3/src/common/colourdata.cpp +++ b/Externals/wxWidgets3/src/common/colourdata.cpp @@ -1,7 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/common/colourdata.cpp // Author: Julian Smart -// RCS-ID: $Id: colourdata.cpp 66615 2011-01-07 05:26:57Z PC $ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -105,4 +104,64 @@ bool wxColourData::FromString(const wxString& str) } return success; } + +#if wxUSE_COLOURDLG + +#include "wx/colordlg.h" + +wxColour wxGetColourFromUser(wxWindow *parent, + const wxColour& colInit, + const wxString& caption, + wxColourData *ptrData) +{ + // contains serialized representation of wxColourData used the last time + // the dialog was shown: we want to reuse it the next time in order to show + // the same custom colours to the user (and we can't just have static + // wxColourData itself because it's a GUI object and so should be destroyed + // before GUI shutdown and doing it during static cleanup is too late) + static wxString s_strColourData; + + wxColourData data; + if ( !ptrData ) + { + ptrData = &data; + if ( !s_strColourData.empty() ) + { + if ( !data.FromString(s_strColourData) ) + { + wxFAIL_MSG( "bug in wxColourData::FromString()?" ); + } + +#ifdef __WXMSW__ + // we don't get back the "choose full" flag value from the native + // dialog and so we can't preserve it between runs, so we decide to + // always use it as it seems better than not using it (user can + // just ignore the extra controls in the dialog but having to click + // a button each time to show them would be very annoying + data.SetChooseFull(true); +#endif // __WXMSW__ + } + } + + if ( colInit.IsOk() ) + { + ptrData->SetColour(colInit); + } + + wxColour colRet; + wxColourDialog dialog(parent, ptrData); + if (!caption.empty()) + dialog.SetTitle(caption); + if ( dialog.ShowModal() == wxID_OK ) + { + *ptrData = dialog.GetColourData(); + colRet = ptrData->GetColour(); + s_strColourData = ptrData->ToString(); + } + //else: leave colRet invalid + + return colRet; +} + +#endif // wxUSE_COLOURDLG #endif // wxUSE_COLOURDLG || wxUSE_COLOURPICKERCTRL diff --git a/Externals/wxWidgets3/src/common/combocmn.cpp b/Externals/wxWidgets3/src/common/combocmn.cpp index de33d29646..82d1657960 100644 --- a/Externals/wxWidgets3/src/common/combocmn.cpp +++ b/Externals/wxWidgets3/src/common/combocmn.cpp @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id: combocmn.cpp 69005 2011-09-05 20:08:04Z RD $ // Copyright: (c) 2005 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -23,26 +22,15 @@ #pragma hdrstop #endif +#include "wx/combo.h" + +#ifdef __WXMSW__ +#include "wx/msw/private.h" +#endif + #if wxUSE_COMBOBOX #include "wx/combobox.h" extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox"; -#endif - -#if wxUSE_COMBOCTRL - -#ifndef WX_PRECOMP - #include "wx/app.h" - #include "wx/log.h" - #include "wx/dcclient.h" - #include "wx/settings.h" - #include "wx/timer.h" - #include "wx/textctrl.h" -#endif - -#include "wx/tooltip.h" - -#include "wx/combo.h" - // ---------------------------------------------------------------------------- // XTI @@ -87,8 +75,8 @@ wxEND_FLAGS( wxComboBoxStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxComboBox, wxControl, "wx/combobox.h") wxBEGIN_PROPERTIES_TABLE(wxComboBox) -wxEVENT_PROPERTY( Select, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEvent ) -wxEVENT_PROPERTY( TextEnter, wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent ) +wxEVENT_PROPERTY( Select, wxEVT_COMBOBOX, wxCommandEvent ) +wxEVENT_PROPERTY( TextEnter, wxEVT_TEXT_ENTER, wxCommandEvent ) // TODO DELEGATES wxPROPERTY( Font, wxFont, SetFont, GetFont, wxEMPTY_PARAMETER_VALUE, \ @@ -110,6 +98,21 @@ wxEMPTY_HANDLERS_TABLE(wxComboBox) wxCONSTRUCTOR_5( wxComboBox, wxWindow*, Parent, wxWindowID, Id, \ wxString, Value, wxPoint, Position, wxSize, Size ) +#endif // wxUSE_COMBOBOX + +#if wxUSE_COMBOCTRL + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/timer.h" + #include "wx/textctrl.h" +#endif + +#include "wx/tooltip.h" + // constants // ---------------------------------------------------------------------------- @@ -389,7 +392,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) wxWindow* popup = m_combo->GetPopupControl()->GetControl(); wxWindow* winpopup = m_combo->GetPopupWindow(); - if ( + if ( !winFocused || ( winFocused != m_focusStart && winFocused != popup && winFocused->GetParent() != popup && @@ -398,6 +401,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) winFocused != m_combo && winFocused != m_combo->GetButton() // GTK (atleast) requires this ) + ) { m_combo->HidePopup(true); } @@ -489,9 +493,8 @@ bool wxComboPopupWindow::Show( bool show ) m_inShow++; - wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) ); - - wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this; + wxPopupTransientWindow* const + ptw = static_cast(this); if ( show != ptw->IsShown() ) { @@ -518,7 +521,7 @@ bool wxComboPopupWindow::ProcessLeftDown(wxMouseEvent& event) void wxComboPopupWindow::OnDismiss() { wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent(); - wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), + wxASSERT_MSG( wxDynamicCast(combo, wxComboCtrlBase), wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); combo->OnPopupDismiss(true); @@ -766,7 +769,7 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) if ( m_combo->GetTextCtrl() ) m_combo->GetTextCtrl()->SelectAll(); else - m_combo->SetSelection(-1,-1); + m_combo->SelectAll(); } // Send focus indication to parent. @@ -1096,10 +1099,10 @@ wxComboCtrlBase::CreateTextCtrl(int style) // Connecting the events is currently the most reliable way wxWindowID id = m_text->GetId(); - m_text->Connect(id, wxEVT_COMMAND_TEXT_UPDATED, + m_text->Connect(id, wxEVT_TEXT, wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), NULL, this); - m_text->Connect(id, wxEVT_COMMAND_TEXT_ENTER, + m_text->Connect(id, wxEVT_TEXT_ENTER, wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), NULL, this); @@ -1360,22 +1363,52 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust wxSize wxComboCtrlBase::DoGetBestSize() const { - wxSize sizeText(150,0); + int width = m_text ? m_text->GetBestSize().x : 80; - if ( m_text ) - sizeText = m_text->GetBestSize(); + return GetSizeFromTextSize(width); +} - // TODO: Better method to calculate close-to-native control height. +wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + // Calculate close-to-native control height int fhei; + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + fhei = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight()); +#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__) + // Control creation is not entirely cheap, so cache the heights to + // avoid repeatedly creating dummy controls: + static wxString s_last_font; + static int s_last_fhei = -1; + wxString fontdesc; + if ( m_font.IsOk() ) + fontdesc = m_font.GetNativeFontInfoDesc(); + if ( s_last_fhei != -1 && fontdesc == s_last_font ) + { + fhei = s_last_fhei; + } + else + { + wxComboBox* cb = new wxComboBox; + cb->Hide(); + cb->Create(const_cast(this), wxID_ANY); + if ( m_font.IsOk() ) + cb->SetFont(m_font); + s_last_font = fontdesc; + s_last_fhei = fhei = cb->GetBestSize().y; + cb->Destroy(); + } +#else if ( m_font.IsOk() ) fhei = (m_font.GetPointSize()*2) + 5; else if ( wxNORMAL_FONT->IsOk() ) fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5; else - fhei = sizeText.y + 4; + fhei = 22; +#endif // only for wxComboBox on MSW or GTK - // Need to force height to accomodate bitmap? + // Need to force height to accommodate bitmap? int btnSizeY = m_btnSize.y; if ( m_bmpNormal.IsOk() && fhei < btnSizeY ) fhei = btnSizeY; @@ -1393,11 +1426,6 @@ wxSize wxComboCtrlBase::DoGetBestSize() const fhei += 4; */ - // Final adjustments -#ifdef __WXGTK__ - fhei += 1; -#endif - #ifdef __WXMAC__ // these are the numbers from the HIG: switch ( m_windowVariant ) @@ -1416,11 +1444,19 @@ wxSize wxComboCtrlBase::DoGetBestSize() const #endif fhei += 2 * FOCUS_RING; - int width = sizeText.x + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH; - wxSize ret(width, fhei); - CacheBestSize(ret); - return ret; + // Calculate width + int fwid = xlen + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH; + + // Add the margins we have previously set + wxPoint marg( GetMargins() ); + fwid += wxMax(0, marg.x); + fhei += wxMax(0, marg.y); + + if ( ylen > 0 ) + fhei += ylen - GetCharHeight(); + + return wxSize(fwid, fhei); } void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event ) @@ -1771,7 +1807,7 @@ void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) return; } - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + if ( event.GetEventType() == wxEVT_TEXT ) { if ( m_ignoreEvtText > 0 ) { @@ -2034,19 +2070,23 @@ void wxComboCtrlBase::OnCharEvent(wxKeyEvent& event) void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { -// On Mac, this leads to infinite recursion and eventually a crash -#ifndef __WXMAC__ + // On Mac, setting focus here leads to infinite recursion and eventually + // a crash due to the SetFocus call producing another event. + // Handle Mac in OnIdleEvent using m_resetFocus. + if ( event.GetEventType() == wxEVT_SET_FOCUS ) { - wxWindow* tc = GetTextCtrl(); - if ( tc && tc != DoFindFocus() ) + if ( GetTextCtrl() && !GetTextCtrl()->HasFocus() ) { - tc->SetFocus(); +#ifdef __WXMAC__ + m_resetFocus = true; +#else + GetTextCtrl()->SetFocus(); +#endif } } - + Refresh(); -#endif } void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) @@ -2054,9 +2094,8 @@ void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) if ( m_resetFocus ) { m_resetFocus = false; - wxWindow* tc = GetTextCtrl(); - if ( tc ) - tc->SetFocus(); + if ( GetTextCtrl() ) + GetTextCtrl()->SetFocus(); } } @@ -2214,7 +2253,7 @@ void wxComboCtrlBase::OnButtonClick() void wxComboCtrlBase::Popup() { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + wxCommandEvent event(wxEVT_COMBOBOX_DROPDOWN, GetId()); event.SetEventObject(this); HandleWindowEvent(event); @@ -2500,7 +2539,7 @@ void wxComboCtrlBase::OnPopupDismiss(bool generateEvent) if ( generateEvent ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + wxCommandEvent event(wxEVT_COMBOBOX_CLOSEUP, GetId()); event.SetEventObject(this); HandleWindowEvent(event); } diff --git a/Externals/wxWidgets3/src/common/config.cpp b/Externals/wxWidgets3/src/common/config.cpp index e6916ff8d9..852dd13f17 100644 --- a/Externals/wxWidgets3/src/common/config.cpp +++ b/Externals/wxWidgets3/src/common/config.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 07.04.98 -// RCS-ID: $Id: config.cpp 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1997 Karsten Ballueder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/src/common/containr.cpp b/Externals/wxWidgets3/src/common/containr.cpp index 2b3e7d414e..50bbd6aefa 100644 --- a/Externals/wxWidgets3/src/common/containr.cpp +++ b/Externals/wxWidgets3/src/common/containr.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 06.08.01 -// RCS-ID: $Id: containr.cpp 68502 2011-08-03 00:45:42Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -47,14 +46,25 @@ // wxControlContainerBase // ---------------------------------------------------------------------------- -void wxControlContainerBase::SetCanFocus(bool acceptsFocus) +void wxControlContainerBase::UpdateParentCanFocus() { - if ( acceptsFocus == m_acceptsFocus ) - return; + // In the ports where it does something non trivial, the parent window + // should only be focusable if it doesn't have any focusable children + // (e.g. native focus handling in wxGTK totally breaks down otherwise). + m_winParent->SetCanFocus(m_acceptsFocusSelf && !m_acceptsFocusChildren); +} - m_acceptsFocus = acceptsFocus; +bool wxControlContainerBase::UpdateCanFocusChildren() +{ + const bool acceptsFocusChildren = HasAnyFocusableChildren(); + if ( acceptsFocusChildren != m_acceptsFocusChildren ) + { + m_acceptsFocusChildren = acceptsFocusChildren; - m_winParent->SetCanFocus(m_acceptsFocus); + UpdateParentCanFocus(); + } + + return m_acceptsFocusChildren; } bool wxControlContainerBase::HasAnyFocusableChildren() const @@ -70,6 +80,30 @@ bool wxControlContainerBase::HasAnyFocusableChildren() const if ( !m_winParent->IsClientAreaChild(child) ) continue; + // Here we check whether the child can accept the focus at all, as we + // want to try focusing it later even if it can't accept it right now. + if ( child->AcceptsFocusRecursively() ) + return true; + } + + return false; +} + +bool wxControlContainerBase::HasAnyChildrenAcceptingFocus() const +{ + const wxWindowList& children = m_winParent->GetChildren(); + for ( wxWindowList::const_iterator i = children.begin(), + end = children.end(); + i != end; + ++i ) + { + const wxWindow * const child = *i; + + if ( !m_winParent->IsClientAreaChild(child) ) + continue; + + // Here we check if the child accepts focus right now as we need to + // know if we can give the focus to it or not. if ( child->CanAcceptFocus() ) return true; } @@ -118,6 +152,11 @@ bool wxControlContainerBase::DoSetFocus() return ret; } +bool wxControlContainerBase::AcceptsFocus() const +{ + return m_acceptsFocusSelf && m_winParent->CanBeFocused(); +} + bool wxControlContainerBase::SetFocusToChild() { return wxSetFocusToChild(m_winParent, &m_winLastFocused); @@ -174,19 +213,6 @@ void wxControlContainer::SetLastFocus(wxWindow *win) wxLogTrace(TRACE_FOCUS, wxT("No more last focus")); } } - - // propagate the last focus upwards so that our parent can set focus back - // to us if it loses it now and regains later; do *not* do this if we are - // a toplevel window (e.g. wxDialog) that has another frame as its parent - if ( !m_winParent->IsTopLevel() ) - { - wxWindow *parent = m_winParent->GetParent(); - if ( parent ) - { - wxChildFocusEvent eventFocus(m_winParent); - parent->GetEventHandler()->ProcessEvent(eventFocus); - } - } } // -------------------------------------------------------------------- @@ -194,7 +220,7 @@ void wxControlContainer::SetLastFocus(wxWindow *win) // within the same group. Used by wxSetFocusToChild on wxMSW // -------------------------------------------------------------------- -#if defined(__WXMSW__) && wxUSE_RADIOBTN +#if wxUSE_RADIOBTN wxRadioButton* wxGetPreviousButtonInGroup(wxRadioButton *btn) { @@ -653,17 +679,27 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) // It might happen that the window got reparented if ( (*childLastFocused)->GetParent() == win ) { - // And it also could have become hidden in the meanwhile, in this - // case focus its parent instead. - while ( !(*childLastFocused)->IsShown() ) + // And it also could have become hidden in the meanwhile + // We want to focus on the deepest widget visible + wxWindow *deepestVisibleWindow = NULL; + + while ( *childLastFocused ) { + if ( (*childLastFocused)->IsShown() ) + { + if ( !deepestVisibleWindow ) + deepestVisibleWindow = *childLastFocused; + } + else + deepestVisibleWindow = NULL; + *childLastFocused = (*childLastFocused)->GetParent(); - if ( !*childLastFocused ) - break; } - if ( *childLastFocused ) + if ( deepestVisibleWindow ) { + *childLastFocused = deepestVisibleWindow; + wxLogTrace(TRACE_FOCUS, wxT("SetFocusToChild() => last child (0x%p)."), (*childLastFocused)->GetHandle()); diff --git a/Externals/wxWidgets3/src/common/convauto.cpp b/Externals/wxWidgets3/src/common/convauto.cpp index 83c1ec3d0f..6a5fba4ecb 100644 --- a/Externals/wxWidgets3/src/common/convauto.cpp +++ b/Externals/wxWidgets3/src/common/convauto.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of wxConvAuto // Author: Vadim Zeitlin // Created: 2006-04-04 -// RCS-ID: $Id: convauto.cpp 69675 2011-11-05 11:23:41Z VZ $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/cshelp.cpp b/Externals/wxWidgets3/src/common/cshelp.cpp index d05bb9265d..26484e26a2 100644 --- a/Externals/wxWidgets3/src/common/cshelp.cpp +++ b/Externals/wxWidgets3/src/common/cshelp.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart, Vadim Zeitlin // Modified by: // Created: 08/09/2000 -// RCS-ID: $Id: cshelp.cpp 68859 2011-08-23 04:55:46Z DS $ // Copyright: (c) 2000 Julian Smart, Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/ctrlcmn.cpp b/Externals/wxWidgets3/src/common/ctrlcmn.cpp index 3fc3cd64a3..32bce06c6f 100644 --- a/Externals/wxWidgets3/src/common/ctrlcmn.cpp +++ b/Externals/wxWidgets3/src/common/ctrlcmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 26.07.99 -// RCS-ID: $Id: ctrlcmn.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -149,6 +148,12 @@ void wxControlBase::DoUpdateWindowUI(wxUpdateUIEvent& event) #endif // wxUSE_RADIOBTN } +wxSize wxControlBase::DoGetSizeFromTextSize(int WXUNUSED(xlen), + int WXUNUSED(ylen)) const +{ + return wxSize(-1, -1); +} + /* static */ wxString wxControlBase::GetLabelText(const wxString& label) { @@ -534,15 +539,10 @@ wxString wxControlBase::Ellipsize(const wxString& label, const wxDC& dc, // add this (ellipsized) row to the rest of the label ret << curLine; if ( pc == label.end() ) - { - // NOTE: this is the return which always exits the function - return ret; - } - else - { - ret << *pc; - curLine.clear(); - } + break; + + ret << *pc; + curLine.clear(); } // we need to remove mnemonics from the label for correct calculations else if ( *pc == wxS('&') && (flags & wxELLIPSIZE_FLAGS_PROCESS_MNEMONICS) ) @@ -565,14 +565,9 @@ wxString wxControlBase::Ellipsize(const wxString& label, const wxDC& dc, } } - // this return would generate a - // warning C4702: unreachable code - // with MSVC since the function always exits from inside the loop - //return ret; + return ret; } - - // ---------------------------------------------------------------------------- // wxStaticBitmap // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/common/ctrlsub.cpp b/Externals/wxWidgets3/src/common/ctrlsub.cpp index d1524dde1a..7bf15a9295 100644 --- a/Externals/wxWidgets3/src/common/ctrlsub.cpp +++ b/Externals/wxWidgets3/src/common/ctrlsub.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 22.10.99 -// RCS-ID: $Id: ctrlsub.cpp 66664 2011-01-10 12:00:54Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -292,4 +291,19 @@ wxControlWithItemsBase::InitCommandEventWithItems(wxCommandEvent& event, int n) } } +void wxControlWithItemsBase::SendSelectionChangedEvent(wxEventType eventType) +{ + const int n = GetSelection(); + if ( n == wxNOT_FOUND ) + return; + + wxCommandEvent event(eventType, m_windowId); + event.SetInt(n); + event.SetEventObject(this); + event.SetString(GetStringSelection()); + InitCommandEventWithItems(event, n); + + HandleWindowEvent(event); +} + #endif // wxUSE_CONTROLS diff --git a/Externals/wxWidgets3/src/common/datavcmn.cpp b/Externals/wxWidgets3/src/common/datavcmn.cpp index 2eb5731566..2cad362531 100644 --- a/Externals/wxWidgets3/src/common/datavcmn.cpp +++ b/Externals/wxWidgets3/src/common/datavcmn.cpp @@ -3,7 +3,6 @@ // Purpose: wxDataViewCtrl base classes and common parts // Author: Robert Roebling // Created: 2006/02/20 -// RCS-ID: $Id: datavcmn.cpp 70377 2012-01-17 14:05:17Z VS $ // Copyright: (c) 2006, Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -308,15 +307,6 @@ void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier ) int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, unsigned int column, bool ascending ) const { - // sort branches before leaves - bool item1_is_container = IsContainer(item1); - bool item2_is_container = IsContainer(item2); - - if (item1_is_container && !item2_is_container) - return 1; - if (item2_is_container && !item1_is_container) - return -1; - wxVariant value1,value2; GetValue( value1, item1, column ); GetValue( value2, item2, column ); @@ -500,33 +490,6 @@ wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const return wxDataViewItem( m_hash[row] ); } -bool wxDataViewIndexListModel::HasDefaultCompare() const -{ - return !m_ordered; -} - -int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1, - const wxDataViewItem& item2, - unsigned int WXUNUSED(column), - bool ascending) const -{ - if (m_ordered) - { - unsigned int pos1 = wxPtrToUInt(item1.GetID()); // -1 not needed here - unsigned int pos2 = wxPtrToUInt(item2.GetID()); // -1 not needed here - - if (ascending) - return pos1 - pos2; - else - return pos2 - pos1; - } - - if (ascending) - return GetRow(item1) - GetRow(item2); - - return GetRow(item2) - GetRow(item1); -} - unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const { if (item.IsOk()) @@ -686,7 +649,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner(); // Before doing anything we send an event asking if editing of this item is really wanted. - wxDataViewEvent start_event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, dv_ctrl->GetId() ); + wxDataViewEvent start_event( wxEVT_DATAVIEW_ITEM_START_EDITING, dv_ctrl->GetId() ); start_event.SetDataViewColumn( GetOwner() ); start_event.SetModel( dv_ctrl->GetModel() ); start_event.SetItem( item ); @@ -719,7 +682,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la #endif // Now we should send Editing Started event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); event.SetModel( dv_ctrl->GetModel() ); event.SetItem( item ); @@ -742,6 +705,9 @@ void wxDataViewRendererBase::DestroyEditControl() wxPendingDelete.Append(handler); wxPendingDelete.Append(m_editorCtrl); + + // Ensure that DestroyEditControl() is not called again for this control. + m_editorCtrl.Release(); } void wxDataViewRendererBase::CancelEditing() @@ -770,7 +736,7 @@ bool wxDataViewRendererBase::FinishEditing() unsigned int col = GetOwner()->GetModelColumn(); // Now we should send Editing Done event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); event.SetModel( dv_ctrl->GetModel() ); event.SetItem( m_item ); @@ -805,6 +771,20 @@ void wxDataViewRendererBase::PrepareForItem(const wxDataViewModel *model, } +int wxDataViewRendererBase::GetEffectiveAlignment() const +{ + int alignment = GetAlignment(); + + if ( alignment == wxDVR_DEFAULT_ALIGNMENT ) + { + // if we don't have an explicit alignment ourselves, use that of the + // column in horizontal direction and default vertical alignment + alignment = GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL; + } + + return alignment; +} + // ---------------------------------------------------------------------------- // wxDataViewCustomRendererBase // ---------------------------------------------------------------------------- @@ -841,40 +821,38 @@ wxDataViewCustomRendererBase::WXCallRender(wxRect rectCell, wxDC *dc, int state) // adjust the rectangle ourselves to account for the alignment wxRect rectItem = rectCell; - const int align = GetAlignment(); - if ( align != wxDVR_DEFAULT_ALIGNMENT ) + const int align = GetEffectiveAlignment(); + + const wxSize size = GetSize(); + + // take alignment into account only if there is enough space, otherwise + // show as much contents as possible + // + // notice that many existing renderers (e.g. wxDataViewSpinRenderer) + // return hard-coded size which can be more than they need and if we + // trusted their GetSize() we'd draw the text out of cell bounds + // entirely + + if ( size.x >= 0 && size.x < rectCell.width ) { - const wxSize size = GetSize(); + if ( align & wxALIGN_CENTER_HORIZONTAL ) + rectItem.x += (rectCell.width - size.x)/2; + else if ( align & wxALIGN_RIGHT ) + rectItem.x += rectCell.width - size.x; + // else: wxALIGN_LEFT is the default - // take alignment into account only if there is enough space, otherwise - // show as much contents as possible - // - // notice that many existing renderers (e.g. wxDataViewSpinRenderer) - // return hard-coded size which can be more than they need and if we - // trusted their GetSize() we'd draw the text out of cell bounds - // entirely + rectItem.width = size.x; + } - if ( size.x >= 0 && size.x < rectCell.width ) - { - if ( align & wxALIGN_CENTER_HORIZONTAL ) - rectItem.x += (rectCell.width - size.x)/2; - else if ( align & wxALIGN_RIGHT ) - rectItem.x += rectCell.width - size.x; - // else: wxALIGN_LEFT is the default + if ( size.y >= 0 && size.y < rectCell.height ) + { + if ( align & wxALIGN_CENTER_VERTICAL ) + rectItem.y += (rectCell.height - size.y)/2; + else if ( align & wxALIGN_BOTTOM ) + rectItem.y += rectCell.height - size.y; + // else: wxALIGN_TOP is the default - rectItem.width = size.x; - } - - if ( size.y >= 0 && size.y < rectCell.height ) - { - if ( align & wxALIGN_CENTER_VERTICAL ) - rectItem.y += (rectCell.height - size.y)/2; - else if ( align & wxALIGN_BOTTOM ) - rectItem.y += rectCell.height - size.y; - // else: wxALIGN_TOP is the default - - rectItem.height = size.y; - } + rectItem.height = size.y; } @@ -943,16 +921,8 @@ wxDataViewCustomRendererBase::RenderText(const wxString& text, } // get the alignment to use - int align = GetAlignment(); - if ( align == wxDVR_DEFAULT_ALIGNMENT ) - { - // if we don't have an explicit alignment ourselves, use that of the - // column in horizontal direction and default vertical alignment - align = GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL; - } - dc->DrawLabel(ellipsizedText.empty() ? text : ellipsizedText, - rectText, align); + rectText, GetEffectiveAlignment()); } //----------------------------------------------------------------------------- @@ -1429,30 +1399,30 @@ void wxDataViewCtrlBase::StartEditor(const wxDataViewItem& item, unsigned int co IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent) -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_CACHE_HINT, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_CACHE_HINT, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_DROP, wxDataViewEvent ); @@ -1738,12 +1708,17 @@ unsigned int wxDataViewListStore::GetColumnCount() const return m_cols.GetCount(); } +unsigned int wxDataViewListStore::GetItemCount() const +{ + return m_data.size(); +} + wxString wxDataViewListStore::GetColumnType( unsigned int pos ) const { return m_cols[pos]; } -void wxDataViewListStore::AppendItem( const wxVector &values, wxClientData *data ) +void wxDataViewListStore::AppendItem( const wxVector &values, wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1752,7 +1727,7 @@ void wxDataViewListStore::AppendItem( const wxVector &values, wxClien RowAppended(); } -void wxDataViewListStore::PrependItem( const wxVector &values, wxClientData *data ) +void wxDataViewListStore::PrependItem( const wxVector &values, wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1762,7 +1737,7 @@ void wxDataViewListStore::PrependItem( const wxVector &values, wxClie } void wxDataViewListStore::InsertItem( unsigned int row, const wxVector &values, - wxClientData *data ) + wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1794,6 +1769,22 @@ void wxDataViewListStore::DeleteAllItems() Reset( 0 ); } +void wxDataViewListStore::SetItemData( const wxDataViewItem& item, wxUIntPtr data ) +{ + wxDataViewListStoreLine* line = m_data[GetRow(item)]; + if (!line) return; + + line->SetData( data ); +} + +wxUIntPtr wxDataViewListStore::GetItemData( const wxDataViewItem& item ) const +{ + wxDataViewListStoreLine* line = m_data[GetRow(item)]; + if (!line) return static_cast(NULL); + + return line->GetData(); +} + void wxDataViewListStore::GetValueByRow( wxVariant &value, unsigned int row, unsigned int col ) const { wxDataViewListStoreLine *line = m_data[row]; @@ -2196,10 +2187,7 @@ void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item ) wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item ); if (!parent_node) return; - wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); - if (!node) return; - - parent_node->GetChildren().DeleteObject( node ); + parent_node->GetChildren().DeleteObject( FindNode(item) ); } void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item ) diff --git a/Externals/wxWidgets3/src/common/datetime.cpp b/Externals/wxWidgets3/src/common/datetime.cpp index e131abdbc8..669d0a3269 100644 --- a/Externals/wxWidgets3/src/common/datetime.cpp +++ b/Externals/wxWidgets3/src/common/datetime.cpp @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 11.05.99 -// RCS-ID: $Id: datetime.cpp 70796 2012-03-04 00:29:31Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // parts of code taken from sndcal library by Scott E. Lee: // @@ -1130,10 +1129,37 @@ wxDateTime& wxDateTime::Set(const struct tm& tm) return *this; } - else + + // mktime() only adjusts tm_wday, tm_yday and tm_isdst fields normally, if + // it changed anything else, it must have performed the DST adjustment. But + // the trouble with this is that different implementations do it + // differently, e.g. GNU libc moves the time forward if the specified time + // is invalid in the local time zone, while MSVC CRT moves it backwards + // which is especially pernicious as it can change the date if the DST + // starts at midnight, as it does in some time zones (see #15419), and this + // is completely unexpected for the code working with dates only. + // + // So standardize on moving the time forwards to have consistent behaviour + // under all platforms and to avoid the problem above. + if ( tm2.tm_hour != tm.tm_hour ) { - return Set(timet); + tm2 = tm; + tm2.tm_hour++; + if ( tm2.tm_hour == 24 ) + { + // This shouldn't normally happen as the DST never starts at 23:00 + // but if it does, we have a problem as we need to adjust the day + // as well. However we stop here, i.e. we don't adjust the month + // (or the year) because mktime() is supposed to take care of this + // for us. + tm2.tm_hour = 0; + tm2.tm_mday++; + } + + timet = mktime(&tm2); } + + return Set(timet); } wxDateTime& wxDateTime::Set(wxDateTime_t hour, @@ -1602,6 +1628,56 @@ wxDateTime& wxDateTime::Add(const wxDateSpan& diff) return *this; } +wxDateSpan wxDateTime::DiffAsDateSpan(const wxDateTime& dt) const +{ + wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime")); + + // If dt is larger than this, calculations below needs to be inverted. + int inv = 1; + if ( dt > *this ) + inv = -1; + + int y = GetYear() - dt.GetYear(); + int m = GetMonth() - dt.GetMonth(); + int d = GetDay() - dt.GetDay(); + + // If month diff is negative, dt is the year before, so decrease year + // and set month diff to its inverse, e.g. January - December should be 1, + // not -11. + if ( m * inv < 0 || (m == 0 && d * inv < 0)) + { + m += inv * MONTHS_IN_YEAR; + y -= inv; + } + + // Same logic for days as for months above. + if ( d * inv < 0 ) + { + // Use number of days in month from the month which end date we're + // crossing. That is month before this for positive diff, and this + // month for negative diff. + // If we're on january and using previous month, we get december + // previous year, but don't care, december has same amount of days + // every year. + wxDateTime::Month monthfordays = GetMonth(); + if (inv > 0 && monthfordays == wxDateTime::Jan) + monthfordays = wxDateTime::Dec; + else if (inv > 0) + monthfordays = static_cast(monthfordays - 1); + + d += inv * wxDateTime::GetNumberOfDays(monthfordays, GetYear()); + m -= inv; + } + + int w = d / DAYS_PER_WEEK; + + // Remove weeks from d, since wxDateSpan only keep days as the ones + // not in complete weeks + d -= w * DAYS_PER_WEEK; + + return wxDateSpan(y, m, w, d); +} + // ---------------------------------------------------------------------------- // Weekday and monthday stuff // ---------------------------------------------------------------------------- @@ -1871,7 +1947,6 @@ wxDateTime::GetWeekOfYear(wxDateTime::WeekFlags flags, const TimeZone& tz) const { // adjust the weekdays to non-US style. wdYearStart = ConvertWeekDayToMondayBase(wdYearStart); - wdTarget = ConvertWeekDayToMondayBase(wdTarget); // quoting from http://www.cl.cam.ac.uk/~mgk25/iso-time.html: // @@ -1887,22 +1962,24 @@ wxDateTime::GetWeekOfYear(wxDateTime::WeekFlags flags, const TimeZone& tz) const // // if Jan 1 is Thursday or less, it is in the first week of this year - if ( wdYearStart < 4 ) - { - // count the number of entire weeks between Jan 1 and this date - week = (nDayInYear + wdYearStart + 6 - wdTarget)/7; + int dayCountFix = wdYearStart < 4 ? 6 : -1; - // be careful to check for overflow in the next year - if ( week == 53 && tm.mday - wdTarget > 28 ) - week = 1; - } - else // Jan 1 is in the last week of the previous year + // count the number of week + week = (nDayInYear + wdYearStart + dayCountFix) / DAYS_PER_WEEK; + + // check if we happen to be at the last week of previous year: + if ( week == 0 ) { - // check if we happen to be at the last week of previous year: - if ( tm.mon == Jan && tm.mday < 8 - wdYearStart ) - week = wxDateTime(31, Dec, GetYear()-1).GetWeekOfYear(); - else - week = (nDayInYear + wdYearStart - 1 - wdTarget)/7; + week = wxDateTime(31, Dec, GetYear() - 1).GetWeekOfYear(); + } + else if ( week == 53 ) + { + int wdYearEnd = (wdYearStart + 364 + IsLeapYear(GetYear())) + % DAYS_PER_WEEK; + + // Week 53 only if last day of year is Thursday or later. + if ( wdYearEnd < 3 ) + week = 1; } } diff --git a/Externals/wxWidgets3/src/common/datetimefmt.cpp b/Externals/wxWidgets3/src/common/datetimefmt.cpp index a96f09e2ce..4855025050 100644 --- a/Externals/wxWidgets3/src/common/datetimefmt.cpp +++ b/Externals/wxWidgets3/src/common/datetimefmt.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 11.05.99 -// RCS-ID: $Id: datetimefmt.cpp 70847 2012-03-09 01:09:25Z VZ $ // Copyright: (c) 1999 Vadim Zeitlin // parts of code taken from sndcal library by Scott E. Lee: // @@ -291,8 +290,14 @@ ParseFormatAt(wxString::const_iterator& p, const wxString str(p, end); wxString::const_iterator endParse; wxDateTime dt; - if ( dt.ParseFormat(str, fmt, &endParse) || - (!fmtAlt.empty() && dt.ParseFormat(str, fmtAlt, &endParse)) ) + + // Use a default date outside of the DST period to avoid problems with + // parsing the time differently depending on the today's date (which is used + // as the fall back date if none is explicitly specified). + static const wxDateTime dtDef(1, wxDateTime::Jan, 2012); + + if ( dt.ParseFormat(str, fmt, dtDef, &endParse) || + (!fmtAlt.empty() && dt.ParseFormat(str, fmtAlt, dtDef, &endParse)) ) { p += endParse - str.begin(); } @@ -508,7 +513,7 @@ wxString wxDateTime::Format(const wxString& formatp, const TimeZone& tz) const // (indirectly) set the year correctly while ( (nLostWeekDays % 7) != 0 ) { - nLostWeekDays += year++ % 4 ? 1 : 2; + nLostWeekDays += (year++ % 4) ? 1 : 2; } // finally move the year below 2000 so that the 2-digit @@ -649,6 +654,18 @@ wxString wxDateTime::Format(const wxString& formatp, const TimeZone& tz) const case wxT('z'): // time zone as [-+]HHMM { int ofs = tz.GetOffset(); + + // The time zone offset does not include the DST, but + // we do need to take it into account when showing the + // time in the local time zone to the user. + if ( ofs == -wxGetTimeZone() && IsDST() == 1 ) + { + // FIXME: As elsewhere in wxDateTime, we assume + // that the DST is always 1 hour, but this is not + // true in general. + ofs += 3600; + } + if ( ofs < 0 ) { res += '-'; @@ -929,6 +946,26 @@ wxDateTime::ParseRfc822Date(const wxString& date, wxString::const_iterator *end) return true; } +const char* wxDateTime::ParseRfc822Date(const char* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseRfc822Date(dateStr, &end) ) + return NULL; + + return date + dateStr.IterOffsetInMBStr(end); +} + +const wchar_t* wxDateTime::ParseRfc822Date(const wchar_t* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseRfc822Date(dateStr, &end) ) + return NULL; + + return date + (end - dateStr.begin()); +} + bool wxDateTime::ParseFormat(const wxString& date, const wxString& format, @@ -1563,6 +1600,32 @@ wxDateTime::ParseFormat(const wxString& date, return true; } +const char* +wxDateTime::ParseFormat(const char* date, + const wxString& format, + const wxDateTime& dateDef) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseFormat(dateStr, format, dateDef, &end) ) + return NULL; + + return date + dateStr.IterOffsetInMBStr(end); +} + +const wchar_t* +wxDateTime::ParseFormat(const wchar_t* date, + const wxString& format, + const wxDateTime& dateDef) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseFormat(dateStr, format, dateDef, &end) ) + return NULL; + + return date + (end - dateStr.begin()); +} + bool wxDateTime::ParseDateTime(const wxString& date, wxString::const_iterator *end) { @@ -1616,6 +1679,26 @@ wxDateTime::ParseDateTime(const wxString& date, wxString::const_iterator *end) return true; } +const char* wxDateTime::ParseDateTime(const char* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseDateTime(dateStr, &end) ) + return NULL; + + return date + dateStr.IterOffsetInMBStr(end); +} + +const wchar_t* wxDateTime::ParseDateTime(const wchar_t* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseDateTime(dateStr, &end) ) + return NULL; + + return date + (end - dateStr.begin()); +} + bool wxDateTime::ParseDate(const wxString& date, wxString::const_iterator *end) { @@ -1653,12 +1736,12 @@ wxDateTime::ParseDate(const wxString& date, wxString::const_iterator *end) if ( len > lenRest ) continue; - const wxString::const_iterator pEnd = p + len; - if ( wxString(p, pEnd).CmpNoCase(dateStr) == 0 ) + const wxString::const_iterator pEndStr = p + len; + if ( wxString(p, pEndStr).CmpNoCase(dateStr) == 0 ) { // nothing can follow this, so stop here - p = pEnd; + p = pEndStr; int dayDiffFromToday = literalDates[n].dayDiffFromToday; *this = Today(); @@ -1667,7 +1750,7 @@ wxDateTime::ParseDate(const wxString& date, wxString::const_iterator *end) *this += wxDateSpan::Days(dayDiffFromToday); } - *end = pEnd; + *end = pEndStr; return true; } @@ -1973,6 +2056,26 @@ wxDateTime::ParseDate(const wxString& date, wxString::const_iterator *end) return true; } +const char* wxDateTime::ParseDate(const char* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseDate(dateStr, &end) ) + return NULL; + + return date + dateStr.IterOffsetInMBStr(end); +} + +const wchar_t* wxDateTime::ParseDate(const wchar_t* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseDate(dateStr, &end) ) + return NULL; + + return date + (end - dateStr.begin()); +} + bool wxDateTime::ParseTime(const wxString& time, wxString::const_iterator *end) { @@ -2013,6 +2116,8 @@ wxDateTime::ParseTime(const wxString& time, wxString::const_iterator *end) "%H:%M:%S", // could be the same or 24 hour one so try it too "%I:%M %p", // 12hour with AM/PM but without seconds "%H:%M", // and a possibly 24 hour version without seconds + "%I %p", // just hour with AM/AM + "%H", // just hour in 24 hour version "%X", // possibly something from above or maybe something // completely different -- try it last @@ -2028,6 +2133,26 @@ wxDateTime::ParseTime(const wxString& time, wxString::const_iterator *end) return false; } +const char* wxDateTime::ParseTime(const char* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseTime(dateStr, &end) ) + return NULL; + + return date + dateStr.IterOffsetInMBStr(end); +} + +const wchar_t* wxDateTime::ParseTime(const wchar_t* date) +{ + wxString::const_iterator end; + wxString dateStr(date); + if ( !ParseTime(dateStr, &end) ) + return NULL; + + return date + (end - dateStr.begin()); +} + // ---------------------------------------------------------------------------- // Workdays and holidays support // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/common/datstrm.cpp b/Externals/wxWidgets3/src/common/datstrm.cpp index 9b271ce7ee..904e692e51 100644 --- a/Externals/wxWidgets3/src/common/datstrm.cpp +++ b/Externals/wxWidgets3/src/common/datstrm.cpp @@ -4,7 +4,6 @@ // Author: Guilhem Lavaux // Modified by: Mickael Gilabert // Created: 28/06/98 -// RCS-ID: $Id: datstrm.cpp 61764 2009-08-26 20:44:01Z VZ $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -24,34 +23,69 @@ #include "wx/math.h" #endif //WX_PRECOMP -// --------------------------------------------------------------------------- -// wxDataInputStream -// --------------------------------------------------------------------------- - -#if wxUSE_UNICODE -wxDataInputStream::wxDataInputStream(wxInputStream& s, const wxMBConv& conv) - : m_input(&s), m_be_order(false), m_conv(conv.Clone()) -#else -wxDataInputStream::wxDataInputStream(wxInputStream& s) - : m_input(&s), m_be_order(false) -#endif +namespace { + +// helper unions used to swap bytes of floats and doubles +union Float32Data +{ + wxFloat32 f; + wxUint32 i; +}; + +union Float64Data +{ + wxFloat64 f; + wxUint32 i[2]; +}; + +} // anonymous namespace + +// ---------------------------------------------------------------------------- +// wxDataStreamBase +// ---------------------------------------------------------------------------- + +wxDataStreamBase::wxDataStreamBase(const wxMBConv& conv) +#if wxUSE_UNICODE + : m_conv(conv.Clone()) +#endif // wxUSE_UNICODE +{ + // It is unused in non-Unicode build, so suppress a warning there. + wxUnusedVar(conv); + + m_be_order = false; + + // For compatibility with the existing data files, we use extended + // precision if it is available, i.e. if wxUSE_APPLE_IEEE is on. +#if wxUSE_APPLE_IEEE + m_useExtendedPrecision = true; +#endif // wxUSE_APPLE_IEEE } -wxDataInputStream::~wxDataInputStream() +#if wxUSE_UNICODE +void wxDataStreamBase::SetConv( const wxMBConv &conv ) +{ + delete m_conv; + m_conv = conv.Clone(); +} +#endif + +wxDataStreamBase::~wxDataStreamBase() { #if wxUSE_UNICODE delete m_conv; #endif // wxUSE_UNICODE } -#if wxUSE_UNICODE -void wxDataInputStream::SetConv( const wxMBConv &conv ) +// --------------------------------------------------------------------------- +// wxDataInputStream +// --------------------------------------------------------------------------- + +wxDataInputStream::wxDataInputStream(wxInputStream& s, const wxMBConv& conv) + : wxDataStreamBase(conv), + m_input(&s) { - delete m_conv; - m_conv = conv.Clone(); } -#endif #if wxHAS_INT64 wxUint64 wxDataInputStream::Read64() @@ -97,13 +131,48 @@ wxUint8 wxDataInputStream::Read8() double wxDataInputStream::ReadDouble() { #if wxUSE_APPLE_IEEE - char buf[10]; + if ( m_useExtendedPrecision ) + { + char buf[10]; - m_input->Read(buf, 10); - return wxConvertFromIeeeExtended((const wxInt8 *)buf); -#else - return 0.0; -#endif + m_input->Read(buf, 10); + return wxConvertFromIeeeExtended((const wxInt8 *)buf); + } + else +#endif // wxUSE_APPLE_IEEE + { + Float64Data floatData; + + if ( m_be_order == (wxBYTE_ORDER == wxBIG_ENDIAN) ) + { + floatData.i[0] = Read32(); + floatData.i[1] = Read32(); + } + else + { + floatData.i[1] = Read32(); + floatData.i[0] = Read32(); + } + + return static_cast(floatData.f); + } +} + +float wxDataInputStream::ReadFloat() +{ +#if wxUSE_APPLE_IEEE + if ( m_useExtendedPrecision ) + { + return (float)ReadDouble(); + } + else +#endif // wxUSE_APPLE_IEEE + { + Float32Data floatData; + + floatData.i = Read32(); + return static_cast(floatData.f); + } } wxString wxDataInputStream::ReadString() @@ -114,11 +183,10 @@ wxString wxDataInputStream::ReadString() if ( len > 0 ) { #if wxUSE_UNICODE - wxCharBuffer tmp(len + 1); + wxCharBuffer tmp(len); if ( tmp ) { m_input->Read(tmp.data(), len); - tmp.data()[len] = '\0'; ret = m_conv->cMB2WX(tmp.data()); } #else @@ -378,6 +446,14 @@ void wxDataInputStream::ReadDouble(double *buffer, size_t size) } } +void wxDataInputStream::ReadFloat(float *buffer, size_t size) +{ + for (wxUint32 i=0; i>(wxString& s) { s = ReadString(); @@ -448,15 +524,15 @@ wxDataInputStream& wxDataInputStream::operator>>(wxLongLong& i) } #endif // wxLongLong_t -wxDataInputStream& wxDataInputStream::operator>>(double& i) +wxDataInputStream& wxDataInputStream::operator>>(double& d) { - i = ReadDouble(); + d = ReadDouble(); return *this; } wxDataInputStream& wxDataInputStream::operator>>(float& f) { - f = (float)ReadDouble(); + f = ReadFloat(); return *this; } @@ -464,31 +540,12 @@ wxDataInputStream& wxDataInputStream::operator>>(float& f) // wxDataOutputStream // --------------------------------------------------------------------------- -#if wxUSE_UNICODE wxDataOutputStream::wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv) - : m_output(&s), m_be_order(false), m_conv(conv.Clone()) -#else -wxDataOutputStream::wxDataOutputStream(wxOutputStream& s) - : m_output(&s), m_be_order(false) -#endif + : wxDataStreamBase(conv), + m_output(&s) { } -wxDataOutputStream::~wxDataOutputStream() -{ -#if wxUSE_UNICODE - delete m_conv; -#endif // wxUSE_UNICODE -} - -#if wxUSE_UNICODE -void wxDataOutputStream::SetConv( const wxMBConv &conv ) -{ - delete m_conv; - m_conv = conv.Clone(); -} -#endif - #if wxHAS_INT64 void wxDataOutputStream::Write64(wxUint64 i) { @@ -544,22 +601,49 @@ void wxDataOutputStream::WriteString(const wxString& string) void wxDataOutputStream::WriteDouble(double d) { - char buf[10]; - #if wxUSE_APPLE_IEEE - wxConvertToIeeeExtended(d, (wxInt8 *)buf); -#else - wxUnusedVar(d); -#if !defined(__VMS__) && !defined(__GNUG__) -#ifdef _MSC_VER -# pragma message("wxDataOutputStream::WriteDouble() not using IeeeExtended - will not work!") -#else -# pragma warning "wxDataOutputStream::WriteDouble() not using IeeeExtended - will not work!" -#endif -#endif - buf[0] = '\0'; -#endif - m_output->Write(buf, 10); + if ( m_useExtendedPrecision ) + { + char buf[10]; + + wxConvertToIeeeExtended(d, (wxInt8 *)buf); + m_output->Write(buf, 10); + } + else +#endif // wxUSE_APPLE_IEEE + { + Float64Data floatData; + + floatData.f = (wxFloat64)d; + + if ( m_be_order == (wxBYTE_ORDER == wxBIG_ENDIAN) ) + { + Write32(floatData.i[0]); + Write32(floatData.i[1]); + } + else + { + Write32(floatData.i[1]); + Write32(floatData.i[0]); + } + } +} + +void wxDataOutputStream::WriteFloat(float f) +{ +#if wxUSE_APPLE_IEEE + if ( m_useExtendedPrecision ) + { + WriteDouble((double)f); + } + else +#endif // wxUSE_APPLE_IEEE + { + Float32Data floatData; + + floatData.f = (wxFloat32)f; + Write32(floatData.i); + } } #if wxHAS_INT64 @@ -673,6 +757,14 @@ void wxDataOutputStream::WriteDouble(const double *buffer, size_t size) } } +void wxDataOutputStream::WriteFloat(const float *buffer, size_t size) +{ + for (wxUint32 i=0; i widthTextMax ) - widthTextMax = widthLine; - heightTextTotal += heightLine; - } - - if ( pc == text.end() ) - { - break; - } - else // '\n' - { - curLine.clear(); - } - } - else - { - curLine += *pc; - } - } - - if ( x ) - *x = widthTextMax; - if ( y ) - *y = heightTextTotal; - if ( h ) - *h = heightLine; + wxTextMeasure tm(GetOwner(), font && font->IsOk() ? font : &m_font); + tm.GetMultiLineTextExtent(text, x, y, h); } void wxDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, @@ -718,8 +622,8 @@ void wxDCImpl::DrawPolygon(const wxPointList *list, void wxDCImpl::DoDrawPolyPolygon(int n, - int count[], - wxPoint points[], + const int count[], + const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) { @@ -769,11 +673,11 @@ void wxDCImpl::DrawSpline(wxCoord x1, wxCoord y1, DrawSpline(WXSIZEOF(points), points); } -void wxDCImpl::DrawSpline(int n, wxPoint points[]) +void wxDCImpl::DrawSpline(int n, const wxPoint points[]) { wxPointList list; for ( int i = 0; i < n; i++ ) - list.Append(&points[i]); + list.Append(const_cast(&points[i])); DrawSpline(&list); } @@ -895,7 +799,7 @@ void wxDCImpl::DoDrawSpline( const wxPointList *points ) { wxCHECK_RET( IsOk(), wxT("invalid window dc") ); - wxPoint *p; + const wxPoint *p; double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; double x1, y1, x2, y2; @@ -904,7 +808,7 @@ void wxDCImpl::DoDrawSpline( const wxPointList *points ) // empty list return; - p = (wxPoint *)node->GetData(); + p = node->GetData(); x1 = p->x; y1 = p->y; @@ -1292,7 +1196,7 @@ void wxDC::DrawLabel(const wxString& text, { if ( pc - text.begin() == indexAccel ) { - // remeber to draw underscore here + // remember to draw underscore here GetTextExtent(curLine, &startUnderscore, NULL); curLine += *pc; GetTextExtent(curLine, &endUnderscore, NULL); diff --git a/Externals/wxWidgets3/src/common/dcbufcmn.cpp b/Externals/wxWidgets3/src/common/dcbufcmn.cpp index 8b230ad299..ee50d2311a 100644 --- a/Externals/wxWidgets3/src/common/dcbufcmn.cpp +++ b/Externals/wxWidgets3/src/common/dcbufcmn.cpp @@ -4,7 +4,6 @@ // Author: Ron Lee, Jaakko Salli // Modified by: // Created: Sep-20-2006 -// RCS-ID: $Id: dcbufcmn.cpp 67659 2011-05-01 15:47:46Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -114,7 +113,10 @@ void wxBufferedDC::UseBuffer(wxCoord w, wxCoord h) m_buffer = wxSharedDCBufferManager::GetBuffer(w, h); m_style |= wxBUFFER_USES_SHARED_BUFFER; + m_area.Set(w,h); } + else + m_area = m_buffer->GetSize(); SelectObject(*m_buffer); @@ -138,21 +140,24 @@ void wxBufferedDC::UnMask() if ( m_style & wxBUFFER_CLIENT_AREA ) GetDeviceOrigin(&x, &y); - // avoid blitting too much: if we were created for a bigger bitmap (and - // reused for a smaller one later) we should only blit the real bitmap area - // and not the full allocated back buffer - int widthDC, - heightDC; + // It's possible that the buffer may be bigger than the area that needs to + // be drawn (the client size of the window is smaller than the bitmap, or + // a shared bitmap has been reused for a smaller area, etc.) so avoid + // blitting too much if possible, but only use the real DC size if the + // wxBUFFER_VIRTUAL_AREA style is not set. + int width = m_area.GetWidth(), + height = m_area.GetHeight(); - m_dc->GetSize(&widthDC, &heightDC); + if (! m_style & wxBUFFER_VIRTUAL_AREA) + { + int widthDC, + heightDC; + m_dc->GetSize(&widthDC, &heightDC); + width = wxMin(width, widthDC); + height = wxMin(height, heightDC); + } - int widthBuf = m_buffer->GetWidth(), - heightBuf = m_buffer->GetHeight(); - - m_dc->Blit(0, 0, - wxMin(widthDC, widthBuf), wxMin(heightDC, heightBuf), - this, - -x, -y); + m_dc->Blit(0, 0, width, height, this, -x, -y); m_dc = NULL; if ( m_style & wxBUFFER_USES_SHARED_BUFFER ) diff --git a/Externals/wxWidgets3/src/common/dcgraph.cpp b/Externals/wxWidgets3/src/common/dcgraph.cpp index 633c482240..a44ac2cb91 100644 --- a/Externals/wxWidgets3/src/common/dcgraph.cpp +++ b/Externals/wxWidgets3/src/common/dcgraph.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: -// RCS-ID: $Id: dcgraph.cpp 70844 2012-03-08 17:06:06Z PC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -18,24 +17,12 @@ #if wxUSE_GRAPHICS_CONTEXT -#include "wx/graphics.h" #include "wx/dcgraph.h" #ifndef WX_PRECOMP #include "wx/icon.h" - #include "wx/bitmap.h" + #include "wx/dcclient.h" #include "wx/dcmemory.h" - #include "wx/region.h" -#endif - -#include "wx/dcclient.h" - -#ifdef __WXOSX_OR_COCOA__ -#ifdef __WXOSX_IPHONE__ - #include -#else - #include -#endif #endif //----------------------------------------------------------------------------- @@ -155,7 +142,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxGCDCImpl, wxDCImpl) wxGCDCImpl::wxGCDCImpl( wxDC *owner ) : wxDCImpl( owner ) { - Init(); + Init(wxGraphicsContext::Create()); } void wxGCDCImpl::SetGraphicsContext( wxGraphicsContext* ctx ) @@ -177,26 +164,21 @@ void wxGCDCImpl::SetGraphicsContext( wxGraphicsContext* ctx ) wxGCDCImpl::wxGCDCImpl( wxDC *owner, const wxWindowDC& dc ) : wxDCImpl( owner ) { - Init(); - SetGraphicsContext( wxGraphicsContext::Create(dc) ); + Init(wxGraphicsContext::Create(dc)); m_window = dc.GetWindow(); } wxGCDCImpl::wxGCDCImpl( wxDC *owner, const wxMemoryDC& dc ) : wxDCImpl( owner ) { - Init(); - wxGraphicsContext* context; - context = wxGraphicsContext::Create(dc); - SetGraphicsContext( context ); + Init(wxGraphicsContext::Create(dc)); } #if wxUSE_PRINTING_ARCHITECTURE wxGCDCImpl::wxGCDCImpl( wxDC *owner, const wxPrinterDC& dc ) : wxDCImpl( owner ) { - Init(); - SetGraphicsContext( wxGraphicsContext::Create(dc) ); + Init(wxGraphicsContext::Create(dc)); } #endif @@ -204,12 +186,18 @@ wxGCDCImpl::wxGCDCImpl( wxDC *owner, const wxPrinterDC& dc ) : wxGCDCImpl::wxGCDCImpl(wxDC *owner, const wxEnhMetaFileDC& dc) : wxDCImpl(owner) { - Init(); - SetGraphicsContext(wxGraphicsContext::Create(dc)); + Init(wxGraphicsContext::Create(dc)); } #endif -void wxGCDCImpl::Init() +wxGCDCImpl::wxGCDCImpl(wxDC* owner, int) + : wxDCImpl(owner) +{ + // derived class will set a context + Init(NULL); +} + +void wxGCDCImpl::Init(wxGraphicsContext* ctx) { m_ok = false; m_colour = true; @@ -220,11 +208,13 @@ void wxGCDCImpl::Init() m_font = *wxNORMAL_FONT; m_brush = *wxWHITE_BRUSH; - m_graphicContext = wxGraphicsContext::Create(); + m_graphicContext = NULL; + if (ctx) + SetGraphicsContext(ctx); + m_logicalFunctionSupported = true; } - wxGCDCImpl::~wxGCDCImpl() { delete m_graphicContext; @@ -236,8 +226,8 @@ void wxGCDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawBitmap - invalid DC") ); wxCHECK_RET( bmp.IsOk(), wxT("wxGCDC(cg)::DoDrawBitmap - invalid bitmap") ); - int w = bmp.GetWidth(); - int h = bmp.GetHeight(); + int w = bmp.GetScaledWidth(); + int h = bmp.GetScaledHeight(); if ( bmp.GetDepth() == 1 ) { m_graphicContext->SetPen(*wxTRANSPARENT_PEN); @@ -298,22 +288,8 @@ void wxGCDCImpl::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoSetClippingRegion - invalid DC") ); m_graphicContext->Clip( x, y, w, h ); - if ( m_clipping ) - { - m_clipX1 = wxMax( m_clipX1, x ); - m_clipY1 = wxMax( m_clipY1, y ); - m_clipX2 = wxMin( m_clipX2, (x + w) ); - m_clipY2 = wxMin( m_clipY2, (y + h) ); - } - else - { - m_clipping = true; - m_clipX1 = x; - m_clipY1 = y; - m_clipX2 = x + w; - m_clipY2 = y + h; - } + wxDCImpl::DoSetClippingRegion(x, y, w, h); } void wxGCDCImpl::DoSetDeviceClippingRegion( const wxRegion ®ion ) @@ -385,7 +361,7 @@ void wxGCDCImpl::SetTextForeground( const wxColour &col ) // don't set m_textForegroundColour to an invalid colour as we'd crash // later then (we use m_textForegroundColour.GetColor() without checking // in a few places) - if ( col.IsOk() && col != m_textForegroundColour ) + if ( col.IsOk() ) { m_textForegroundColour = col; m_graphicContext->SetFont( m_font, m_textForegroundColour ); @@ -399,35 +375,6 @@ void wxGCDCImpl::SetTextBackground( const wxColour &col ) m_textBackgroundColour = col; } -void wxGCDCImpl::SetMapMode( wxMappingMode mode ) -{ - switch (mode) - { - case wxMM_TWIPS: - SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); - break; - - case wxMM_POINTS: - SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); - break; - - case wxMM_METRIC: - SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); - break; - - case wxMM_LOMETRIC: - SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); - break; - - case wxMM_TEXT: - default: - SetLogicalScale( 1.0, 1.0 ); - break; - } - - ComputeScaleAndOrigin(); -} - wxSize wxGCDCImpl::GetPPI() const { return wxSize(72, 72); @@ -448,7 +395,7 @@ void wxGCDCImpl::ComputeScaleAndOrigin() // the logical origin sets the origin to have new coordinates m_matrixCurrent.Translate( m_deviceOriginX - m_logicalOriginX * m_signX * m_scaleX, - m_deviceOriginY-m_logicalOriginY * m_signY * m_scaleY); + m_deviceOriginY - m_logicalOriginY * m_signY * m_scaleY); m_matrixCurrent.Scale( m_scaleX * m_signX, m_scaleY * m_signY ); @@ -457,6 +404,16 @@ void wxGCDCImpl::ComputeScaleAndOrigin() } } +void* wxGCDCImpl::GetHandle() const +{ + void* cgctx = NULL; + wxGraphicsContext* gc = GetGraphicsContext(); + if (gc) { + cgctx = gc->GetNativeContext(); + } + return cgctx; +} + void wxGCDCImpl::SetPalette( const wxPalette& WXUNUSED(palette) ) { @@ -472,18 +429,12 @@ void wxGCDCImpl::SetFont( const wxFont &font ) m_font = font; if ( m_graphicContext ) { - wxFont f = font; - if ( f.IsOk() ) - f.SetPointSize( /*LogicalToDeviceYRel*/(font.GetPointSize())); - m_graphicContext->SetFont( f, m_textForegroundColour ); + m_graphicContext->SetFont(font, m_textForegroundColour); } } void wxGCDCImpl::SetPen( const wxPen &pen ) { - if ( m_pen == pen ) - return; - m_pen = pen; if ( m_graphicContext ) { @@ -493,9 +444,6 @@ void wxGCDCImpl::SetPen( const wxPen &pen ) void wxGCDCImpl::SetBrush( const wxBrush &brush ) { - if (m_brush == brush) - return; - m_brush = brush; if ( m_graphicContext ) { @@ -505,9 +453,6 @@ void wxGCDCImpl::SetBrush( const wxBrush &brush ) void wxGCDCImpl::SetBackground( const wxBrush &brush ) { - if (m_backgroundBrush == brush) - return; - m_backgroundBrush = brush; if (!m_backgroundBrush.IsOk()) return; @@ -515,9 +460,6 @@ void wxGCDCImpl::SetBackground( const wxBrush &brush ) void wxGCDCImpl::SetLogicalFunction( wxRasterOperationMode function ) { - if (m_logicalFunction == function) - return; - m_logicalFunction = function; wxCompositionMode mode = TranslateRasterOp( function ); @@ -665,7 +607,7 @@ void wxGCDCImpl::DoDrawPoint( wxCoord x, wxCoord y ) DoDrawLine( x , y , x + 1 , y + 1 ); } -void wxGCDCImpl::DoDrawLines(int n, wxPoint points[], +void wxGCDCImpl::DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset) { wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawLines - invalid DC") ); @@ -699,7 +641,7 @@ void wxGCDCImpl::DoDrawSpline(const wxPointList *points) // empty list return; - wxPoint *p = node->GetData(); + const wxPoint *p = node->GetData(); wxCoord x1 = p->x; wxCoord y1 = p->y; @@ -743,7 +685,7 @@ void wxGCDCImpl::DoDrawSpline(const wxPointList *points) } #endif // wxUSE_SPLINES -void wxGCDCImpl::DoDrawPolygon( int n, wxPoint points[], +void wxGCDCImpl::DoDrawPolygon( int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle ) { @@ -772,8 +714,8 @@ void wxGCDCImpl::DoDrawPolygon( int n, wxPoint points[], } void wxGCDCImpl::DoDrawPolyPolygon(int n, - int count[], - wxPoint points[], + const int count[], + const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) @@ -1089,7 +1031,10 @@ void wxGCDCImpl::Clear(void) m_graphicContext->SetPen( p ); wxCompositionMode formerMode = m_graphicContext->GetCompositionMode(); m_graphicContext->SetCompositionMode(wxCOMPOSITION_SOURCE); - DoDrawRectangle( 0, 0, 32000 , 32000 ); + // maximum positive coordinate Cairo can handle is 2^23 - 1 + DoDrawRectangle( + DeviceToLogicalX(0), DeviceToLogicalY(0), + DeviceToLogicalXRel(0x007fffff), DeviceToLogicalYRel(0x007fffff)); m_graphicContext->SetCompositionMode(formerMode); m_graphicContext->SetPen( m_pen ); m_graphicContext->SetBrush( m_brush ); @@ -1147,6 +1092,7 @@ void wxGCDCImpl::DoGradientFillLinear(const wxRect& rect, m_graphicContext->SetPen(*wxTRANSPARENT_PEN); m_graphicContext->DrawRectangle(rect.x,rect.y,rect.width,rect.height); m_graphicContext->SetPen(m_pen); + m_graphicContext->SetBrush(m_brush); } void wxGCDCImpl::DoGradientFillConcentric(const wxRect& rect, @@ -1175,6 +1121,7 @@ void wxGCDCImpl::DoGradientFillConcentric(const wxRect& rect, m_graphicContext->DrawRectangle(rect.x,rect.y,rect.width,rect.height); m_graphicContext->SetPen(m_pen); + m_graphicContext->SetBrush(m_brush); } void wxGCDCImpl::DoDrawCheckMark(wxCoord x, wxCoord y, diff --git a/Externals/wxWidgets3/src/common/dcsvg.cpp b/Externals/wxWidgets3/src/common/dcsvg.cpp index 5f4514e9bb..6fd0c2a46f 100644 --- a/Externals/wxWidgets3/src/common/dcsvg.cpp +++ b/Externals/wxWidgets3/src/common/dcsvg.cpp @@ -3,7 +3,6 @@ // Purpose: SVG sample // Author: Chris Elliott // Modified by: -// RCS-ID: $Id: dcsvg.cpp 67883 2011-06-07 22:27:35Z VZ $ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -130,6 +129,9 @@ void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, dou m_OK = true; + m_clipUniqueId = 0; + m_clipNestingLevel = 0; + m_mm_to_pix_x = dpi/25.4; m_mm_to_pix_y = dpi/25.4; @@ -153,21 +155,21 @@ void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, dou m_filename = filename; m_sub_images = 0; wxString s; - s = wxT("") + wxString(wxT("\n")); + s = wxT("\n"); write(s); - s = wxT(" ") + wxString(wxT("\n")); + s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"); write(s); - s = wxT(" \n"), NumStr(float(Width)/dpi*2.54), NumStr(float(Height)/dpi*2.54), Width, Height ); + s.Printf( wxT(" width=\"%scm\" height=\"%scm\" viewBox=\"0 0 %d %d \">\n"), NumStr(float(Width)/dpi*2.54), NumStr(float(Height)/dpi*2.54), Width, Height ); write(s); - s = wxT("SVG Picture created as ") + wxFileName(filename).GetFullName() + wxT(" ") + wxT("\n"); + s = wxT("SVG Picture created as ") + wxFileName(filename).GetFullName() + wxT(" \n"); write(s); - s = wxString (wxT("Picture generated by wxSVG ")) + wxSVGVersion + wxT(" ")+ wxT("\n"); + s = wxString (wxT("Picture generated by wxSVG ")) + wxSVGVersion + wxT(" \n"); write(s); - s = wxT("") + wxString(wxT("\n")); + s = wxT("\n"); write(s); } } @@ -195,7 +197,7 @@ wxSize wxSVGFileDCImpl::GetPPI() const void wxSVGFileDCImpl::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) { - if (m_graphics_changed) NewGraphics(); + NewGraphicsIfNeeded(); wxString s; s.Printf ( wxT(" \n"), x1,y1,x2,y2 ); if (m_OK) @@ -206,7 +208,7 @@ void wxSVGFileDCImpl::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 CalcBoundingBox(x2, y2); } -void wxSVGFileDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset ) +void wxSVGFileDCImpl::DoDrawLines(int n, const wxPoint points[], wxCoord xoffset , wxCoord yoffset ) { for ( int i = 1; i < n; i++ ) { @@ -218,8 +220,8 @@ void wxSVGFileDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxC void wxSVGFileDCImpl::DoDrawPoint (wxCoord x1, wxCoord y1) { wxString s; - if (m_graphics_changed) NewGraphics(); - s = wxT(" ") + wxString(wxT("\n")); + NewGraphicsIfNeeded(); + s = wxT(" \n"); write(s); DoDrawLine ( x1,y1,x1,y1 ); s = wxT(""); @@ -239,7 +241,7 @@ void wxSVGFileDCImpl::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle) { //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW - if (m_graphics_changed) NewGraphics(); + NewGraphicsIfNeeded(); wxString s, sTmp; // calculate bounding box @@ -253,23 +255,26 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor CalcBoundingBox((wxCoord)(x + w*cos(rad)), (wxCoord)(y - h*sin(rad))); // wxT("bottom left") and wxT("bottom right") - x += (wxCoord)(h*sin(rad)); - y += (wxCoord)(h*cos(rad)); - CalcBoundingBox(x, y); CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad))); + CalcBoundingBox((wxCoord)(x + h*sin(rad) + w*cos(rad)), (wxCoord)(y + h*cos(rad) - w*sin(rad))); if (m_backgroundMode == wxBRUSHSTYLE_SOLID) { // draw background first // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background - sTmp.Printf ( wxT(" "), NumStr(-angle), x,y ); s += sTmp + wxT("\n"); write(s); } + + // convert x,y to SVG text x,y (the coordinates of the text baseline) + x = (wxCoord)(x + (h-desc)*sin(rad)); + y = (wxCoord)(y + (h-desc)*cos(rad)); + //now do the text itself s.Printf (wxT(" \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n"; + + write(svg); + + // Re-apply current graphics to ensure proper xml nesting + DoStartNewGraphics(); + + m_clipUniqueId++; + m_clipNestingLevel++; +} + +void wxSVGFileDCImpl::DestroyClippingRegion() +{ + wxString svg; + + // End current graphics element to ensure proper xml nesting (e.g. graphics + // might have been changed inside the clipping region) + svg << "\n"; + + // Close clipping group elements + for ( size_t i = 0; i < m_clipUniqueId; i++ ) + { + svg << ""; + } + svg << "\n"; + + write(svg); + + // Re-apply current graphics (e.g. brush may have been changed inside one + // of the clipped regions - that change will have been lost after xml + // elements for the clipped region have been closed). + DoStartNewGraphics(); + + m_clipUniqueId = 0; +} + void wxSVGFileDCImpl::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const { @@ -512,7 +570,6 @@ void wxSVGFileDCImpl::SetBackgroundMode( int mode ) void wxSVGFileDCImpl::SetBrush(const wxBrush& brush) - { m_brush = brush; @@ -529,11 +586,23 @@ void wxSVGFileDCImpl::SetPen(const wxPen& pen) m_graphics_changed = true; } -void wxSVGFileDCImpl::NewGraphics() +void wxSVGFileDCImpl::NewGraphicsIfNeeded() { - wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn; + if ( !m_graphics_changed ) + return; - sBrush = wxT("\n\n")); + + DoStartNewGraphics(); +} + +void wxSVGFileDCImpl::DoStartNewGraphics() +{ + wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast; + + sBrush = wxS(""), m_pen.GetWidth(), NumStr(m_logicalOriginX), NumStr(m_logicalOriginY), NumStr(m_scaleX), NumStr(m_scaleY) ); - s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxT("\n") + sWarn; + s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxT("\n"); write(s); - m_graphics_changed = false; } @@ -614,7 +682,7 @@ void wxSVGFileDCImpl::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ ) { - if (m_graphics_changed) NewGraphics(); + NewGraphicsIfNeeded(); wxString sTmp, s, sPNG; if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL ) diff --git a/Externals/wxWidgets3/src/common/debugrpt.cpp b/Externals/wxWidgets3/src/common/debugrpt.cpp index 230033a476..7f3c5fba07 100644 --- a/Externals/wxWidgets3/src/common/debugrpt.cpp +++ b/Externals/wxWidgets3/src/common/debugrpt.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-17 -// RCS-ID: $Id: debugrpt.cpp 65101 2010-07-25 11:26:04Z FM $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -33,8 +32,12 @@ #if wxUSE_DEBUGREPORT && wxUSE_XML #include "wx/debugrpt.h" +#if wxUSE_FFILE + #include "wx/ffile.h" +#elif wxUSE_FILE + #include "wx/file.h" +#endif -#include "wx/ffile.h" #include "wx/filename.h" #include "wx/dir.h" #include "wx/dynlib.h" @@ -188,16 +191,14 @@ wxDebugReport::wxDebugReport() // directory, so do our best to create a unique name ourselves // // of course, this doesn't protect us against malicious users... - wxFileName fn; - fn.AssignTempFileName(appname); #if wxUSE_DATETIME m_dir.Printf(wxT("%s%c%s_dbgrpt-%lu-%s"), - fn.GetPath().c_str(), wxFILE_SEP_PATH, appname.c_str(), + wxFileName::GetTempDir(), wxFILE_SEP_PATH, appname, wxGetProcessId(), - wxDateTime::Now().Format(wxT("%Y%m%dT%H%M%S")).c_str()); + wxDateTime::Now().Format(wxT("%Y%m%dT%H%M%S"))); #else m_dir.Printf(wxT("%s%c%s_dbgrpt-%lu"), - fn.GetPath().c_str(), wxFILE_SEP_PATH, appname.c_str(), + wxFileName::GetTempDir(), wxFILE_SEP_PATH, appname, wxGetProcessId()); #endif @@ -290,17 +291,25 @@ wxDebugReport::AddText(const wxString& filename, const wxString& text, const wxString& description) { +#if wxUSE_FFILE || wxUSE_FILE wxASSERT_MSG( !wxFileName(filename).IsAbsolute(), wxT("filename should be relative to debug report directory") ); - wxFileName fn(GetDirectory(), filename); - wxFFile file(fn.GetFullPath(), wxT("w")); - if ( !file.IsOpened() || !file.Write(text) ) + const wxString fullPath = wxFileName(GetDirectory(), filename).GetFullPath(); +#if wxUSE_FFILE + wxFFile file(fullPath, wxT("w")); +#elif wxUSE_FILE + wxFile file(fullPath, wxFile::write); +#endif + if ( !file.IsOpened() || !file.Write(text, wxConvAuto()) ) return false; AddFile(filename, description); return true; +#else // !wxUSE_FFILE && !wxUSE_FILE + return false; +#endif } void wxDebugReport::RemoveFile(const wxString& name) @@ -616,6 +625,8 @@ void wxDebugReportCompress::SetCompressedFileBaseName(const wxString& name) bool wxDebugReportCompress::DoProcess() { +#define HAS_FILE_STREAMS (wxUSE_STREAMS && (wxUSE_FILE || wxUSE_FFILE)) +#if HAS_FILE_STREAMS const size_t count = GetFilesCount(); if ( !count ) return false; @@ -632,7 +643,14 @@ bool wxDebugReportCompress::DoProcess() fn.SetExt("zip"); // create the streams - wxFFileOutputStream os(fn.GetFullPath(), wxT("wb")); + const wxString ofullPath = fn.GetFullPath(); +#if wxUSE_FFILE + wxFFileOutputStream os(ofullPath, wxT("wb")); +#elif wxUSE_FILE + wxFileOutputStream os(ofullPath); +#endif + if ( !os.IsOk() ) + return false; wxZipOutputStream zos(os, 9); // add all files to the ZIP one @@ -647,8 +665,12 @@ bool wxDebugReportCompress::DoProcess() if ( !zos.PutNextEntry(ze) ) return false; - const wxFileName filename(GetDirectory(), name); - wxFFileInputStream is(filename.GetFullPath()); + const wxString ifullPath = wxFileName(GetDirectory(), name).GetFullPath(); +#if wxUSE_FFILE + wxFFileInputStream is(ifullPath); +#elif wxUSE_FILE + wxFileInputStream is(ifullPath); +#endif if ( !is.IsOk() || !zos.Write(is).IsOk() ) return false; } @@ -656,9 +678,12 @@ bool wxDebugReportCompress::DoProcess() if ( !zos.Close() ) return false; - m_zipfile = fn.GetFullPath(); + m_zipfile = ofullPath; return true; +#else + return false; +#endif // HAS_FILE_STREAMS } // ---------------------------------------------------------------------------- @@ -687,7 +712,7 @@ bool wxDebugReportUpload::DoProcess() wxArrayString output, errors; int rc = wxExecute(wxString::Format ( - wxT("%s -F %s=@\"%s\" %s"), + wxT("%s -F \"%s=@%s\" %s"), m_curlCmd.c_str(), m_inputField.c_str(), GetCompressedFileName().c_str(), diff --git a/Externals/wxWidgets3/src/common/descrip.mms b/Externals/wxWidgets3/src/common/descrip.mms index 8273a164af..18ffe12cb3 100644 --- a/Externals/wxWidgets3/src/common/descrip.mms +++ b/Externals/wxWidgets3/src/common/descrip.mms @@ -2,7 +2,7 @@ # * # Make file for VMS * # Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * -# Date : 6 December 2011 * +# Date : 19 September 2013 * # * #***************************************************************************** .first @@ -224,7 +224,8 @@ OBJECTS3=listctrlcmn.obj,socketiohandler.obj,fdiodispatcher.obj,\ statbmpcmn.obj,dirctrlcmn.obj,gridcmn.obj,odcombocmn.obj,\ spinbtncmn.obj,scrolbarcmn.obj,colourdata.obj,fontdata.obj,\ valnum.obj,numformatter.obj,markupparser.obj,\ - affinematrix2d.obj,richtooltipcmn.obj,persist.obj,time.obj + affinematrix2d.obj,richtooltipcmn.obj,persist.obj,time.obj,\ + textmeasurecmn.obj,modalhook.obj,threadinfo.obj OBJECTS_MOTIF=radiocmn.obj,combocmn.obj @@ -428,7 +429,8 @@ SOURCES = \ bmpbtncmn.cpp,checklstcmn.cpp,statbmpcmn.cpp,dirctrlcmn.cpp,\ gridcmn.cpp,odcombocmn.cpp,spinbtncmn.cpp,scrolbarcmn.cpp,\ colourdata.cpp,fontdata.cpp affinematrix2d.cpp\ - richtooltipcmn.cpp persist.cpp time.cpp + richtooltipcmn.cpp persist.cpp time.cpp textmeasurecmn.cpp \ + modalhook.cpp all : $(SOURCES) $(MMS)$(MMSQUALIFIERS) $(OBJECTS) @@ -588,6 +590,7 @@ platinfo.obj : platinfo.cpp popupcmn.obj : popupcmn.cpp prntbase.obj : prntbase.cpp process.obj : process.cpp + cxx $(CXXFLAGS)$(CXX_DEFINE)/warn=disable=(UNSCOMZER) process.cpp protocol.obj : protocol.cpp quantize.obj : quantize.cpp radiocmn.obj : radiocmn.cpp @@ -713,3 +716,6 @@ affinematrix2d.obj : affinematrix2d.cpp richtooltipcmn.obj : richtooltipcmn.cpp persist.obj : persist.cpp time.obj : time.cpp +textmeasurecmn.obj : textmeasurecmn.cpp +modalhook.obj : modalhook.cpp +threadinfo.obj : threadinfo.cpp diff --git a/Externals/wxWidgets3/src/common/dircmn.cpp b/Externals/wxWidgets3/src/common/dircmn.cpp index 96e44ab144..11856868f8 100644 --- a/Externals/wxWidgets3/src/common/dircmn.cpp +++ b/Externals/wxWidgets3/src/common/dircmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 19.05.01 -// RCS-ID: $Id: dircmn.cpp 66089 2010-11-10 13:52:10Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -72,6 +71,28 @@ bool wxDir::HasSubDirs(const wxString& spec) const #endif // !Unix +// ---------------------------------------------------------------------------- +// wxDir::GetNameWithSep() +// ---------------------------------------------------------------------------- + +wxString wxDir::GetNameWithSep() const +{ + // Note that for historical reasons (i.e. because GetName() was there + // first) we implement this one in terms of GetName() even though it might + // actually make more sense to reverse this logic. + + wxString name = GetName(); + if ( !name.empty() ) + { + // Notice that even though GetName() isn't supposed to return the + // separator, it can still be present for the root directory name. + if ( name.Last() != wxFILE_SEP_PATH ) + name += wxFILE_SEP_PATH; + } + + return name; +} + // ---------------------------------------------------------------------------- // wxDir::Traverse() // ---------------------------------------------------------------------------- @@ -87,14 +108,15 @@ size_t wxDir::Traverse(wxDirTraverser& sink, size_t nFiles = 0; // the name of this dir with path delimiter at the end - wxString prefix = GetName(); - prefix += wxFILE_SEP_PATH; + const wxString prefix = GetNameWithSep(); // first, recurse into subdirs if ( flags & wxDIR_DIRS ) { wxString dirname; - for ( bool cont = GetFirst(&dirname, wxEmptyString, wxDIR_DIRS | (flags & wxDIR_HIDDEN) ); + for ( bool cont = GetFirst(&dirname, wxEmptyString, + (flags & ~(wxDIR_FILES | wxDIR_DOTDOT)) + | wxDIR_DIRS); cont; cont = cont && GetNext(&dirname) ) { diff --git a/Externals/wxWidgets3/src/common/dirctrlcmn.cpp b/Externals/wxWidgets3/src/common/dirctrlcmn.cpp index 87e627b025..617875f1f7 100644 --- a/Externals/wxWidgets3/src/common/dirctrlcmn.cpp +++ b/Externals/wxWidgets3/src/common/dirctrlcmn.cpp @@ -4,7 +4,6 @@ // Author: Harm van der Heijden, Robert Roebling, Julian Smart // Modified by: // Created: 12/12/98 -// RCS-ID: $Id: dirctrlcmn.cpp 66592 2011-01-05 18:27:58Z PC $ // Copyright: (c) Harm van der Heijden, Robert Roebling and Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/dlgcmn.cpp b/Externals/wxWidgets3/src/common/dlgcmn.cpp index 1fb9b03f7d..df7ecdff59 100644 --- a/Externals/wxWidgets3/src/common/dlgcmn.cpp +++ b/Externals/wxWidgets3/src/common/dlgcmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 28.06.99 -// RCS-ID: $Id: dlgcmn.cpp 69458 2011-10-18 21:56:36Z VZ $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -43,6 +42,7 @@ #include "wx/bookctrl.h" #include "wx/scrolwin.h" #include "wx/textwrapper.h" +#include "wx/modalhook.h" #if wxUSE_DISPLAY #include "wx/display.h" @@ -125,7 +125,7 @@ END_EVENT_TABLE() wxDialogLayoutAdapter* wxDialogBase::sm_layoutAdapter = NULL; bool wxDialogBase::sm_layoutAdaptation = false; -void wxDialogBase::Init() +wxDialogBase::wxDialogBase() { m_returnCode = 0; m_affirmativeId = wxID_OK; @@ -422,7 +422,7 @@ bool wxDialogBase::EmulateButtonClickIfPresent(int id) if ( !btn || !btn->IsEnabled() || !btn->IsShown() ) return false; - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, id); + wxCommandEvent event(wxEVT_BUTTON, id); event.SetEventObject(btn); btn->GetEventHandler()->ProcessEvent(event); @@ -461,14 +461,16 @@ bool wxDialogBase::SendCloseButtonClickEvent() bool wxDialogBase::IsEscapeKey(const wxKeyEvent& event) { - // for most platforms, Esc key is used to close the dialogs - return event.GetKeyCode() == WXK_ESCAPE && - event.GetModifiers() == wxMOD_NONE; + // For most platforms, Esc key is used to close the dialogs. + // + // Notice that we intentionally don't check for modifiers here, Shift-Esc, + // Alt-Esc and so on still close the dialog, typically. + return event.GetKeyCode() == WXK_ESCAPE; } void wxDialogBase::OnCharHook(wxKeyEvent& event) { - if ( event.GetKeyCode() == WXK_ESCAPE ) + if ( IsEscapeKey(event) ) { if ( SendCloseButtonClickEvent() ) { diff --git a/Externals/wxWidgets3/src/common/dndcmn.cpp b/Externals/wxWidgets3/src/common/dndcmn.cpp index 5b9cb42593..5bd9e13454 100644 --- a/Externals/wxWidgets3/src/common/dndcmn.cpp +++ b/Externals/wxWidgets3/src/common/dndcmn.cpp @@ -3,7 +3,6 @@ // Author: Robert Roebling // Modified by: // Created: 19.10.99 -// RCS-ID: $Id: dndcmn.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/common/dobjcmn.cpp b/Externals/wxWidgets3/src/common/dobjcmn.cpp index 14f40b8ff1..5e4d43dcc0 100644 --- a/Externals/wxWidgets3/src/common/dobjcmn.cpp +++ b/Externals/wxWidgets3/src/common/dobjcmn.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Robert Roebling // Modified by: // Created: 19.10.99 -// RCS-ID: $Id: dobjcmn.cpp 70908 2012-03-15 13:49:49Z VZ $ // Copyright: (c) wxWidgets Team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -24,6 +23,8 @@ #include "wx/app.h" #endif +#include "wx/textbuf.h" + // ---------------------------------------------------------------------------- // lists // ---------------------------------------------------------------------------- @@ -299,13 +300,14 @@ bool wxTextDataObject::SetData(const wxDataFormat& format, size_t wxTextDataObject::GetDataSize(const wxDataFormat& format) const { + const wxString& text = GetText(); if ( format == wxDF_UNICODETEXT || wxLocaleIsUtf8 ) { - return m_text.utf8_length(); + return text.utf8_length(); } else // wxDF_TEXT { - const wxCharBuffer buf(wxConvLocal.cWC2MB(m_text.wc_str())); + const wxCharBuffer buf(wxConvLocal.cWC2MB(text.wc_str())); return buf ? strlen(buf) : 0; } } @@ -315,13 +317,14 @@ bool wxTextDataObject::GetDataHere(const wxDataFormat& format, void *buf) const if ( !buf ) return false; + const wxString& text = GetText(); if ( format == wxDF_UNICODETEXT || wxLocaleIsUtf8 ) { - memcpy(buf, m_text.utf8_str(), m_text.utf8_length()); + memcpy(buf, text.utf8_str(), text.utf8_length()); } else // wxDF_TEXT { - const wxCharBuffer bufLocal(wxConvLocal.cWC2MB(m_text.wc_str())); + const wxCharBuffer bufLocal(wxConvLocal.cWC2MB(text.wc_str())); if ( !bufLocal ) return false; @@ -346,11 +349,11 @@ bool wxTextDataObject::SetData(const wxDataFormat& format, // is not in UTF-8 so do an extra check for tranquility, it shouldn't // matter much if we lose a bit of performance when pasting from // clipboard - m_text = wxString::FromUTF8(buf, len); + SetText(wxString::FromUTF8(buf, len)); } else // wxDF_TEXT, convert from current (non-UTF8) locale { - m_text = wxConvLocal.cMB2WC(buf, len, NULL); + SetText(wxConvLocal.cMB2WC(buf, len, NULL)); } return true; @@ -404,29 +407,153 @@ bool wxTextDataObject::SetData(const wxDataFormat& format, #else // !wxNEEDS_UTF{8,16}_FOR_TEXT_DATAOBJ +// NB: This branch, using native wxChar for the clipboard, is only used under +// Windows currently. It's just a coincidence, but Windows is also the only +// platform where we need to convert the text to the native EOL format, so +// wxTextBuffer::Translate() is only used here and not in the code above. + size_t wxTextDataObject::GetDataSize() const { - return GetTextLength() * sizeof(wxChar); + return (wxTextBuffer::Translate(GetText()).length() + 1)*sizeof(wxChar); } bool wxTextDataObject::GetDataHere(void *buf) const { + const wxString textNative = wxTextBuffer::Translate(GetText()); + // NOTE: use wxTmemcpy() instead of wxStrncpy() to allow // retrieval of strings with embedded NULLs - wxTmemcpy( (wxChar*)buf, GetText().c_str(), GetTextLength() ); + wxTmemcpy(static_cast(buf), + textNative.t_str(), + textNative.length() + 1); return true; } bool wxTextDataObject::SetData(size_t len, const void *buf) { - SetText( wxString((const wxChar*)buf, len/sizeof(wxChar)) ); + const wxString + text = wxString(static_cast(buf), len/sizeof(wxChar)); + SetText(wxTextBuffer::Translate(text, wxTextFileType_Unix)); return true; } #endif // different wxTextDataObject implementations +// ---------------------------------------------------------------------------- +// wxHTMLDataObject +// ---------------------------------------------------------------------------- + +size_t wxHTMLDataObject::GetDataSize() const +{ + // Ensure that the temporary string returned by GetHTML() is kept alive for + // as long as we need it here. + const wxString& htmlStr = GetHTML(); + const wxScopedCharBuffer buffer(htmlStr.utf8_str()); + + size_t size = buffer.length(); + +#ifdef __WXMSW__ + // On Windows we need to add some stuff to the string to satisfy + // its clipboard format requirements. + size += 400; +#endif + + return size; +} + +bool wxHTMLDataObject::GetDataHere(void *buf) const +{ + if ( !buf ) + return false; + + // Windows and Mac always use UTF-8, and docs suggest GTK does as well. + const wxString& htmlStr = GetHTML(); + const wxScopedCharBuffer html(htmlStr.utf8_str()); + if ( !html ) + return false; + + char* const buffer = static_cast(buf); + +#ifdef __WXMSW__ + // add the extra info that the MSW clipboard format requires. + + // Create a template string for the HTML header... + strcpy(buffer, + "Version:0.9\r\n" + "StartHTML:00000000\r\n" + "EndHTML:00000000\r\n" + "StartFragment:00000000\r\n" + "EndFragment:00000000\r\n" + "\r\n" + "\r\n"); + + // Append the HTML... + strcat(buffer, html); + strcat(buffer, "\r\n"); + // Finish up the HTML format... + strcat(buffer, + "\r\n" + "\r\n" + ""); + + // Now go back, calculate all the lengths, and write out the + // necessary header information. Note, wsprintf() truncates the + // string when you overwrite it so you follow up with code to replace + // the 0 appended at the end with a '\r'... + char *ptr = strstr(buffer, "StartHTML"); + sprintf(ptr+10, "%08u", (unsigned)(strstr(buffer, "") - buffer)); + *(ptr+10+8) = '\r'; + + ptr = strstr(buffer, "EndHTML"); + sprintf(ptr+8, "%08u", (unsigned)strlen(buffer)); + *(ptr+8+8) = '\r'; + + ptr = strstr(buffer, "StartFragment"); + sprintf(ptr+14, "%08u", (unsigned)(strstr(buffer, "", fragmentStart) + 3; + int endCommentStart = html.rfind("------------>-------------->... + * -------- |scanline| |scanline| + * |edgelist| |edgelist| + * --------- --------- + * | | + * | | + * V V + * list of ETEs list of ETEs + * + * where ETE is an EdgeTableEntry data structure, + * and there is one ScanLineList per scanline at + * which an edge is initially entered. + * + */ + +static bool +miCreateETandAET(int count, const wxPoint * pts, EdgeTable *ET, EdgeTableEntry *AET, + EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock) +{ + const wxPoint* top, *bottom; + const wxPoint* PrevPt, *CurrPt; + int iSLLBlock = 0; + + int dy; + + if (count < 2) return TRUE; + + /* + * initialize the Active Edge Table + */ + AET->next = (EdgeTableEntry *)NULL; + AET->back = (EdgeTableEntry *)NULL; + AET->nextWETE = (EdgeTableEntry *)NULL; + AET->bres.minor = INT_MIN; + + /* + * initialize the Edge Table. + */ + ET->scanlines.next = (ScanLineList *)NULL; + ET->ymax = INT_MIN; + ET->ymin = INT_MAX; + pSLLBlock->next = (ScanLineListBlock *)NULL; + + PrevPt = &pts[count-1]; + + /* + * for each vertex in the array of points. + * In this loop we are dealing with two vertices at + * a time -- these make up one edge of the polygon. + */ + while (count--) + { + CurrPt = pts++; + + /* + * find out which point is above and which is below. + */ + if (PrevPt->y > CurrPt->y) + { + bottom = PrevPt, top = CurrPt; + pETEs->ClockWise = 0; + } + else + { + bottom = CurrPt, top = PrevPt; + pETEs->ClockWise = 1; + } + + /* + * don't add horizontal edges to the Edge table. + */ + if (bottom->y != top->y) + { + pETEs->ymax = bottom->y-1; /* -1 so we don't get last scanline */ + + /* + * initialize integer edge algorithm + */ + dy = bottom->y - top->y; + BRESINITPGONSTRUCT(dy, top->x, bottom->x, pETEs->bres); + + if (!miInsertEdgeInET(ET, pETEs, top->y, &pSLLBlock, &iSLLBlock)) + { + miFreeStorage(pSLLBlock->next); + return FALSE; + } + + ET->ymax = wxMax(ET->ymax, PrevPt->y); + ET->ymin = wxMin(ET->ymin, PrevPt->y); + pETEs++; + } + + PrevPt = CurrPt; + } + return TRUE; +} + +/* + * loadAET + * + * This routine moves EdgeTableEntries from the + * EdgeTable into the Active Edge Table, + * leaving them sorted by smaller x coordinate. + * + */ + +static void +miloadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) +{ + EdgeTableEntry *pPrevAET; + EdgeTableEntry *tmp; + + pPrevAET = AET; + AET = AET->next; + while (ETEs) + { + while (AET && (AET->bres.minor < ETEs->bres.minor)) + { + pPrevAET = AET; + AET = AET->next; + } + tmp = ETEs->next; + ETEs->next = AET; + if (AET) + AET->back = ETEs; + ETEs->back = pPrevAET; + pPrevAET->next = ETEs; + pPrevAET = ETEs; + + ETEs = tmp; + } +} + +/* + * computeWAET + * + * This routine links the AET by the + * nextWETE (winding EdgeTableEntry) link for + * use by the winding number rule. The final + * Active Edge Table (AET) might look something + * like: + * + * AET + * ---------- --------- --------- + * |ymax | |ymax | |ymax | + * | ... | |... | |... | + * |next |->|next |->|next |->... + * |nextWETE| |nextWETE| |nextWETE| + * --------- --------- ^-------- + * | | | + * V-------------------> V---> ... + * + */ +static void +micomputeWAET(EdgeTableEntry *AET) +{ + EdgeTableEntry *pWETE; + int inside = 1; + int isInside = 0; + + AET->nextWETE = (EdgeTableEntry *)NULL; + pWETE = AET; + AET = AET->next; + while (AET) + { + if (AET->ClockWise) + isInside++; + else + isInside--; + + if ((!inside && !isInside) || + ( inside && isInside)) + { + pWETE->nextWETE = AET; + pWETE = AET; + inside = !inside; + } + AET = AET->next; + } + pWETE->nextWETE = (EdgeTableEntry *)NULL; +} + +/* + * InsertionSort + * + * Just a simple insertion sort using + * pointers and back pointers to sort the Active + * Edge Table. + * + */ + +static int +miInsertionSort(EdgeTableEntry *AET) +{ + EdgeTableEntry *pETEchase; + EdgeTableEntry *pETEinsert; + EdgeTableEntry *pETEchaseBackTMP; + int changed = 0; + + AET = AET->next; + while (AET) + { + pETEinsert = AET; + pETEchase = AET; + while (pETEchase->back->bres.minor > AET->bres.minor) + pETEchase = pETEchase->back; + + AET = AET->next; + if (pETEchase != pETEinsert) + { + pETEchaseBackTMP = pETEchase->back; + pETEinsert->back->next = AET; + if (AET) + AET->back = pETEinsert->back; + pETEinsert->next = pETEchase; + pETEchase->back->next = pETEinsert; + pETEchase->back = pETEinsert; + pETEinsert->back = pETEchaseBackTMP; + changed = 1; + } + } + return(changed); +} + +/* + * Clean up our act. + */ +static void +miFreeStorage(ScanLineListBlock *pSLLBlock) +{ + ScanLineListBlock *tmpSLLBlock; + + while (pSLLBlock) + { + tmpSLLBlock = pSLLBlock->next; + free(pSLLBlock); + pSLLBlock = tmpSLLBlock; + } +} + +/* mipolygen.c */ + +static bool +scanFillGeneralPoly( wxRegion* rgn, + int count, /* number of points */ + const wxPoint *ptsIn, /* the points */ + wxPolygonFillMode fillStyle + ) +{ + EdgeTableEntry *pAET; /* the Active Edge Table */ + int y; /* the current scanline */ + int nPts = 0; /* number of pts in buffer */ + EdgeTableEntry *pWETE; /* Winding Edge Table */ + ScanLineList *pSLL; /* Current ScanLineList */ + wxPoint * ptsOut; /* ptr to output buffers */ + int *width; + wxPoint FirstPoint[NUMPTSTOBUFFER]; /* the output buffers */ + int FirstWidth[NUMPTSTOBUFFER]; + EdgeTableEntry *pPrevAET; /* previous AET entry */ + EdgeTable ET; /* Edge Table header node */ + EdgeTableEntry AET; /* Active ET header node */ + EdgeTableEntry *pETEs; /* Edge Table Entries buff */ + ScanLineListBlock SLLBlock; /* header for ScanLineList */ + int fixWAET = 0; + + if (count < 3) + return(TRUE); + + if(!(pETEs = (EdgeTableEntry *) + malloc(sizeof(EdgeTableEntry) * count))) + return(FALSE); + ptsOut = FirstPoint; + width = FirstWidth; + if (!miCreateETandAET(count, ptsIn, &ET, &AET, pETEs, &SLLBlock)) + { + free(pETEs); + return(FALSE); + } + pSLL = ET.scanlines.next; + + if (fillStyle == wxODDEVEN_RULE) + { + /* + * for each scanline + */ + for (y = ET.ymin; y < ET.ymax; y++) + { + /* + * Add a new edge to the active edge table when we + * get to the next edge. + */ + if (pSLL && y == pSLL->scanline) + { + miloadAET(&AET, pSLL->edgelist); + pSLL = pSLL->next; + } + pPrevAET = &AET; + pAET = AET.next; + + /* + * for each active edge + */ + while (pAET) + { + ptsOut->x = pAET->bres.minor; + ptsOut++->y = y; + *width++ = pAET->next->bres.minor - pAET->bres.minor; + nPts++; + + /* + * send out the buffer when its full + */ + if (nPts == NUMPTSTOBUFFER) + { + // (*pgc->ops->FillSpans)(dst, pgc, + // nPts, FirstPoint, FirstWidth,1); + + for ( int i = 0 ; i < nPts; ++i) + { + wxRect rect; + rect.y = FirstPoint[i].y; + rect.x = FirstPoint[i].x; + rect.height = 1; + rect.width = FirstWidth[i]; + rgn->Union(rect); + } + ptsOut = FirstPoint; + width = FirstWidth; + nPts = 0; + } + EVALUATEEDGEEVENODD(pAET, pPrevAET, y) + EVALUATEEDGEEVENODD(pAET, pPrevAET, y); + } + miInsertionSort(&AET); + } + } + else /* default to WindingNumber */ + { + /* + * for each scanline + */ + for (y = ET.ymin; y < ET.ymax; y++) + { + /* + * Add a new edge to the active edge table when we + * get to the next edge. + */ + if (pSLL && y == pSLL->scanline) + { + miloadAET(&AET, pSLL->edgelist); + micomputeWAET(&AET); + pSLL = pSLL->next; + } + pPrevAET = &AET; + pAET = AET.next; + pWETE = pAET; + + /* + * for each active edge + */ + while (pAET) + { + /* + * if the next edge in the active edge table is + * also the next edge in the winding active edge + * table. + */ + if (pWETE == pAET) + { + ptsOut->x = pAET->bres.minor; + ptsOut++->y = y; + *width++ = pAET->nextWETE->bres.minor - pAET->bres.minor; + nPts++; + + /* + * send out the buffer + */ + if (nPts == NUMPTSTOBUFFER) + { + // (*pgc->ops->FillSpans)(dst, pgc, + // nPts, FirstPoint, FirstWidth,1); + for ( int i = 0 ; i < nPts ; ++i) + { + wxRect rect; + rect.y = FirstPoint[i].y; + rect.x = FirstPoint[i].x; + rect.height = 1; + rect.width = FirstWidth[i]; + rgn->Union(rect); + } + ptsOut = FirstPoint; + width = FirstWidth; + nPts = 0; + } + + pWETE = pWETE->nextWETE; + while (pWETE != pAET) + EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET); + pWETE = pWETE->nextWETE; + } + EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET); + } + + /* + * reevaluate the Winding active edge table if we + * just had to resort it or if we just exited an edge. + */ + if (miInsertionSort(&AET) || fixWAET) + { + micomputeWAET(&AET); + fixWAET = 0; + } + } + } + + /* + * Get any spans that we missed by buffering + */ + // (*pgc->ops->FillSpans)(dst, pgc, + // nPts, FirstPoint, FirstWidth,1); + for ( int i = 0 ; i < nPts; ++i) + { + wxRect rect; + rect.y = FirstPoint[i].y; + rect.x = FirstPoint[i].x; + rect.height = 1; + rect.width = FirstWidth[i]; + rgn->Union(rect); + } + + free(pETEs); + miFreeStorage(SLLBlock.next); + return(TRUE); +} + +#endif + wxRegion::wxRegion(size_t n, const wxPoint *points, wxPolygonFillMode fillStyle) { // Set the region to a polygon shape generically using a bitmap with the // polygon drawn on it. m_refData = new wxRegionRefData(); - + +#if OSX_USE_SCANLINES + scanFillGeneralPoly(this,n,points,fillStyle); +#else wxCoord mx = 0; wxCoord my = 0; wxPoint p; @@ -125,7 +981,8 @@ wxRegion::wxRegion(size_t n, const wxPoint *points, wxPolygonFillMode fillStyle) bmp.SetMask(new wxMask(bmp, *wxBLACK)); // Use it to set this region - Union(bmp); + Union(bmp); +#endif } wxRegion::~wxRegion() @@ -169,6 +1026,21 @@ bool wxRegion::DoOffset(wxCoord x, wxCoord y) return true ; } +bool wxRegion::DoUnionWithRect(const wxRect& rect) +{ + if ( !m_refData ) + { + m_refData = new wxRegionRefData(rect.x , rect.y , rect.width , rect.height); + return true; + } + + AllocExclusive(); + + CGRect r = CGRectMake(rect.x , rect.y , rect.width , rect.height); + HIShapeUnionWithRect(M_REGION , &r); + + return true; +} //! Union /e region with this. bool wxRegion::DoCombine(const wxRegion& region, wxRegionOp op) @@ -303,7 +1175,7 @@ wxRegionContain wxRegion::DoContainsPoint(wxCoord x, wxCoord y) const if (!m_refData) return wxOutRegion; - CGPoint p = { x, y } ; + CGPoint p = CGPointMake( x, y ) ; if (HIShapeContainsPoint( M_REGION , &p ) ) return wxInRegion; @@ -406,40 +1278,6 @@ public : long m_current ; }; -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - -OSStatus wxMacRegionToRectsCounterCallback( - UInt16 message, RgnHandle WXUNUSED(region), const Rect *WXUNUSED(rect), void *data ) -{ - long *m_numRects = (long*) data ; - if ( message == kQDRegionToRectsMsgInit ) - { - (*m_numRects) = 0 ; - } - else if (message == kQDRegionToRectsMsgParse) - { - (*m_numRects) += 1 ; - } - - return noErr; -} - -OSStatus wxMacRegionToRectsSetterCallback( - UInt16 message, RgnHandle WXUNUSED(region), const Rect *rect, void *data ) -{ - if (message == kQDRegionToRectsMsgParse) - { - RegionToRectsCallbackData *cb = (RegionToRectsCallbackData*) data ; - cb->m_rects[cb->m_current++] = wxRect( rect->left , rect->top , rect->right - rect->left , rect->bottom - rect->top ) ; - } - - return noErr; -} - -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - OSStatus wxOSXRegionToRectsCounterCallback( int message, HIShapeRef WXUNUSED(region), const CGRect *WXUNUSED(rect), void *data ) { @@ -468,8 +1306,6 @@ OSStatus wxOSXRegionToRectsSetterCallback( return noErr; } -#endif - void wxRegionIterator::Reset(const wxRegion& region) { m_current = 0; @@ -490,51 +1326,20 @@ void wxRegionIterator::Reset(const wxRegion& region) m_rects = new wxRect[m_numRects]; m_rects[0] = m_region.GetBox(); #endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( HIShapeEnumerate != NULL ) + OSStatus err = HIShapeEnumerate (OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsCounterCallback, + (void*)&m_numRects); + if (err == noErr) { - OSStatus err = HIShapeEnumerate (OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsCounterCallback, - (void*)&m_numRects); - if (err == noErr) - { - m_rects = new wxRect[m_numRects]; - RegionToRectsCallbackData data ; - data.m_rects = m_rects ; - data.m_current = 0 ; - HIShapeEnumerate( OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsSetterCallback, - (void*)&data ); - } - else - { - m_numRects = 0; - } + m_rects = new wxRect[m_numRects]; + RegionToRectsCallbackData data ; + data.m_rects = m_rects ; + data.m_current = 0 ; + HIShapeEnumerate( OTHER_M_REGION(region), kHIShapeParseFromTopLeft, wxOSXRegionToRectsSetterCallback, + (void*)&data ); } else -#endif { -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - OSStatus err = noErr; - RgnHandle rgn = NewRgn(); - HIShapeGetAsQDRgn(OTHER_M_REGION(region), rgn); - - err = QDRegionToRects (rgn, kQDParseRegionFromTopLeft, wxMacRegionToRectsCounterCallback - , (void*)&m_numRects); - if (err == noErr) - { - m_rects = new wxRect[m_numRects]; - RegionToRectsCallbackData data ; - data.m_rects = m_rects ; - data.m_current = 0 ; - QDRegionToRects( rgn , kQDParseRegionFromTopLeft, wxMacRegionToRectsSetterCallback, - (void*)&data ); - } - else - { - m_numRects = 0; - } - DisposeRgn( rgn ); -#endif + m_numRects = 0; } } } diff --git a/Externals/wxWidgets3/src/osx/carbon/renderer.cpp b/Externals/wxWidgets3/src/osx/carbon/renderer.cpp index 38d3dc298b..4669639e79 100644 --- a/Externals/wxWidgets3/src/osx/carbon/renderer.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/renderer.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 20.07.2003 -// RCS-ID: $Id: renderer.cpp 68148 2011-07-04 14:05:14Z VZ $ // Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -31,6 +30,7 @@ #include "wx/renderer.h" #include "wx/graphics.h" #include "wx/dcgraph.h" +#include "wx/splitter.h" #include "wx/osx/private.h" #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP @@ -123,6 +123,8 @@ public: int flags = 0); #endif // wxHAS_DRAW_TITLE_BAR_BITMAP + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); + private: void DrawMacThemeButton(wxWindow *win, wxDC& dc, @@ -182,7 +184,7 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, drawInfo.version = 0; drawInfo.kind = kThemeListHeaderButton; drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive; - drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff; + drawInfo.value = (flags & wxCONTROL_PRESSED) ? kThemeButtonOn : kThemeButtonOff; drawInfo.adornment = kThemeAdornmentNone; // The down arrow is drawn automatically, change it to an up arrow if needed. @@ -192,7 +194,7 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect ); // If we don't want any arrows we need to draw over the one already there - if ( (flags & wxCONTROL_SELECTED) && (sortArrow == wxHDR_SORT_ICON_NONE) ) + if ( (flags & wxCONTROL_PRESSED) && (sortArrow == wxHDR_SORT_ICON_NONE) ) { // clip to the header rectangle CGContextSaveGState( cgContext ); @@ -208,12 +210,12 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, // Reserve room for the arrows before writing the label, and turn off the // flags we've already handled wxRect newRect(rect); - if ( (flags & wxCONTROL_SELECTED) && (sortArrow != wxHDR_SORT_ICON_NONE) ) + if ( (flags & wxCONTROL_PRESSED) && (sortArrow != wxHDR_SORT_ICON_NONE) ) { newRect.width -= 12; sortArrow = wxHDR_SORT_ICON_NONE; } - flags &= ~wxCONTROL_SELECTED; + flags &= ~wxCONTROL_PRESSED; return DrawHeaderButtonContents(win, dc, newRect, flags, sortArrow, params); } @@ -279,6 +281,37 @@ void wxRendererMac::DrawTreeItemButton( wxWindow *win, } } +wxSplitterRenderParams +wxRendererMac::GetSplitterParams(const wxWindow *win) +{ + // see below + SInt32 sashWidth, + border; +#if wxOSX_USE_COCOA + if ( win->HasFlag(wxSP_3DSASH) ) + GetThemeMetric( kThemeMetricPaneSplitterHeight, &sashWidth ); // Cocoa == Carbon == 7 + else if ( win->HasFlag(wxSP_NOSASH) ) // actually Cocoa doesn't allow 0 + sashWidth = 0; + else // no 3D effect - Cocoa [NSSplitView dividerThickNess] for NSSplitViewDividerStyleThin + sashWidth = 1; +#else // Carbon + if ( win->HasFlag(wxSP_3DSASH) ) + GetThemeMetric( kThemeMetricPaneSplitterHeight, &sashWidth ); + else if ( win->HasFlag(wxSP_NOSASH) ) + sashWidth = 0; + else // no 3D effect + GetThemeMetric( kThemeMetricSmallPaneSplitterHeight, &sashWidth ); +#endif // Cocoa/Carbon + + if ( win->HasFlag(wxSP_3DBORDER) ) + border = 2; + else // no 3D effect + border = 0; + + return wxSplitterRenderParams(sashWidth, border, false); +} + + void wxRendererMac::DrawSplitterSash( wxWindow *win, wxDC& dc, const wxSize& size, @@ -288,7 +321,9 @@ void wxRendererMac::DrawSplitterSash( wxWindow *win, { bool hasMetal = win->MacGetTopLevelWindow()->GetExtraStyle() & wxFRAME_EX_METAL; SInt32 height; - GetThemeMetric( kThemeMetricSmallPaneSplitterHeight, &height ); + + height = wxRendererNative::Get().GetSplitterParams(win).widthSash; + HIRect splitterRect; if (orient == wxVERTICAL) splitterRect = CGRectMake( position, 0, height, size.y ); @@ -323,11 +358,14 @@ void wxRendererMac::DrawSplitterSash( wxWindow *win, CGContextFillRect(cgContext,splitterRect); } - HIThemeSplitterDrawInfo drawInfo; - drawInfo.version = 0; - drawInfo.state = kThemeStateActive; - drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; - HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + if ( win->HasFlag(wxSP_3DSASH) ) + { + HIThemeSplitterDrawInfo drawInfo; + drawInfo.version = 0; + drawInfo.state = kThemeStateActive; + drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; + HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + } } } @@ -385,7 +423,7 @@ wxRendererMac::DrawMacThemeButton(wxWindow *win, drawInfo.version = 0; drawInfo.kind = kind; drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive; - drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff; + drawInfo.value = (flags & wxCONTROL_PRESSED) ? kThemeButtonOn : kThemeButtonOff; if (flags & wxCONTROL_UNDETERMINED) drawInfo.value = kThemeButtonMixed; drawInfo.adornment = adornment; @@ -403,7 +441,7 @@ wxRendererMac::DrawCheckBox(wxWindow *win, int flags) { if (flags & wxCONTROL_CHECKED) - flags |= wxCONTROL_SELECTED; + flags |= wxCONTROL_PRESSED; int kind; @@ -555,7 +593,7 @@ void wxRendererMac::DrawRadioBitmap(wxWindow* win, wxDC& dc, kind = kThemeRadioButton; if (flags & wxCONTROL_CHECKED) - flags |= wxCONTROL_SELECTED; + flags |= wxCONTROL_PRESSED; DrawMacThemeButton(win, dc, rect, flags, kind, kThemeAdornmentNone); diff --git a/Externals/wxWidgets3/src/osx/carbon/scrolbar.cpp b/Externals/wxWidgets3/src/osx/carbon/scrolbar.cpp index 7e784b4326..006e93a351 100644 --- a/Externals/wxWidgets3/src/osx/carbon/scrolbar.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/scrolbar.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar.cpp 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/settings.cpp b/Externals/wxWidgets3/src/osx/carbon/settings.cpp index 38866268ed..193da854b3 100644 --- a/Externals/wxWidgets3/src/osx/carbon/settings.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/settings.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: settings.cpp 67018 2011-02-25 09:38:35Z JS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/slider.cpp b/Externals/wxWidgets3/src/osx/carbon/slider.cpp index 38f88781af..e5f6f3f4b5 100644 --- a/Externals/wxWidgets3/src/osx/carbon/slider.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/slider.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: slider.cpp 67416 2011-04-08 15:09:38Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -48,7 +47,7 @@ wxWidgetImplType* wxWidgetImpl::CreateSlider( wxWindowMac* wxpeer, if ( style & wxSL_AUTOTICKS ) tickMarks = (maximum - minimum) + 1; // +1 for the 0 value - // keep the number of tickmarks from becoming unwieldly, therefore below it is ok to cast + // keep the number of tickmarks from becoming unwieldy, therefore below it is ok to cast // it to a UInt16 while (tickMarks > 20) tickMarks /= 5; diff --git a/Externals/wxWidgets3/src/osx/carbon/sound.cpp b/Externals/wxWidgets3/src/osx/carbon/sound.cpp index 63681725bd..7fadb12eaa 100644 --- a/Externals/wxWidgets3/src/osx/carbon/sound.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/sound.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: Stefan Csomor // Created: 1998-01-01 -// RCS-ID: $Id: sound.cpp 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/spinbutt.cpp b/Externals/wxWidgets3/src/osx/carbon/spinbutt.cpp index abe9e81628..061956428e 100644 --- a/Externals/wxWidgets3/src/osx/carbon/spinbutt.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/spinbutt.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: spinbutt.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/srchctrl.cpp b/Externals/wxWidgets3/src/osx/carbon/srchctrl.cpp index 777628d0a5..56056d95a5 100644 --- a/Externals/wxWidgets3/src/osx/carbon/srchctrl.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/srchctrl.cpp @@ -3,7 +3,6 @@ // Purpose: implements mac carbon wxSearchCtrl // Author: Vince Harron // Created: 2006-02-19 -// RCS-ID: $Id: srchctrl.cpp 66826 2011-02-02 07:55:57Z SC $ // Copyright: Vince Harron // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/statbmp.cpp b/Externals/wxWidgets3/src/osx/carbon/statbmp.cpp index 2c4f291b48..7a4ed047a5 100644 --- a/Externals/wxWidgets3/src/osx/carbon/statbmp.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/statbmp.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbmp.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/statbox.cpp b/Externals/wxWidgets3/src/osx/carbon/statbox.cpp index f254906fb8..5e5d9027ac 100644 --- a/Externals/wxWidgets3/src/osx/carbon/statbox.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/statbox.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbox.cpp 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/statbrma.cpp b/Externals/wxWidgets3/src/osx/carbon/statbrma.cpp index 7985a3f977..cc7e463ba1 100644 --- a/Externals/wxWidgets3/src/osx/carbon/statbrma.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/statbrma.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbrma.cpp 61624 2009-08-06 00:01:43Z VZ $ // Copyright: (c) 1998 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -114,7 +113,11 @@ void wxStatusBarMac::DoUpdateStatusText(int number) rect.height = h ; Refresh( true, &rect ); + // we should have to force the update here + // TODO Remove if no regressions occur +#if 0 Update(); +#endif } void wxStatusBarMac::OnPaint(wxPaintEvent& WXUNUSED(event)) diff --git a/Externals/wxWidgets3/src/osx/carbon/statline.cpp b/Externals/wxWidgets3/src/osx/carbon/statline.cpp index 2d75520df6..62a3db302c 100644 --- a/Externals/wxWidgets3/src/osx/carbon/statline.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/statline.cpp @@ -3,7 +3,6 @@ // Purpose: wxStaticLine class // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline.cpp 66555 2011-01-04 08:31:53Z SC $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/statlmac.cpp b/Externals/wxWidgets3/src/osx/carbon/statlmac.cpp index 9380d6f9a8..415d236f5a 100644 --- a/Externals/wxWidgets3/src/osx/carbon/statlmac.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/statlmac.cpp @@ -3,7 +3,6 @@ // Purpose: a generic wxStaticLine class // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statlmac.cpp 61724 2009-08-21 10:41:26Z VZ $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/stattext.cpp b/Externals/wxWidgets3/src/osx/carbon/stattext.cpp index 5536aa1d36..8b0c9714c4 100644 --- a/Externals/wxWidgets3/src/osx/carbon/stattext.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/stattext.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: stattext.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/taskbar.cpp b/Externals/wxWidgets3/src/osx/carbon/taskbar.cpp index 9eb7e26191..f8a8c4821e 100644 --- a/Externals/wxWidgets3/src/osx/carbon/taskbar.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/taskbar.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 09/25/2004 -// RCS-ID: $Id: taskbar.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 2004 Ryan Norton // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -60,7 +59,7 @@ public: : wxTopLevelWindow(NULL, wxID_ANY, wxEmptyString), m_impl(impl) { Connect( - -1, wxEVT_COMMAND_MENU_SELECTED, + -1, wxEVT_MENU, wxCommandEventHandler(wxTaskBarIconWindow::OnMenuEvent) ); } @@ -241,7 +240,7 @@ wxDockEventHandler(EventHandlerCallRef WXUNUSED(inHandlerCallRef), // Performs a top-to-bottom copy of the input menu and all of its // submenus. // -// This is mostly needed for 2.4 compatability. However wxPython and others +// This is mostly needed for 2.4 compatibility. However wxPython and others // still use this way of setting the taskbarmenu. //----------------------------------------------------------------------------- wxMenu * wxDeepCopyMenu( wxMenu *menu ) @@ -463,14 +462,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler) // // Note that we only support DOCK currently as others require cocoa and // also some require hacks and other such things. (MenuExtras are -// actually seperate programs that also require a special undocumented id +// actually separate programs that also require a special undocumented id // hack and other such fun stuff). //----------------------------------------------------------------------------- wxTaskBarIcon::wxTaskBarIcon(wxTaskBarIconType WXUNUSED_UNLESS_DEBUG(nType)) { wxASSERT_MSG( - nType == DOCK, - wxT("Only the DOCK implementation of wxTaskBarIcon on Mac-Carbon is currently supported!") ); + nType == wxTBI_DOCK, + wxT("Only the wxTBI_DOCK implementation of wxTaskBarIcon on Mac-Carbon is currently supported!") ); m_impl = new wxDockTaskBarIcon(this); } diff --git a/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp b/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp index c3f0ecf999..02ba93ad33 100644 --- a/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Ryan Norton (MLTE GetLineLength and GetLineText) // Created: 1998-01-01 -// RCS-ID: $Id: textctrl.cpp 66028 2010-11-05 21:38:25Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -434,7 +433,7 @@ static pascal OSStatus wxMacUnicodeTextControlControlEventHandler( EventHandlerC ControlPartCode controlPart = cEvent.GetParameter(kEventParamControlPart , typeControlPartCode ); if ( controlPart == kControlFocusNoPart ) { - // about to loose focus -> store selection to field + // about to lose focus -> store selection to field focus->GetData( 0, kControlEditTextSelectionTag, &focus->m_selection ); } result = CallNextEventHandler(handler,event) ; diff --git a/Externals/wxWidgets3/src/osx/carbon/tglbtn.cpp b/Externals/wxWidgets3/src/osx/carbon/tglbtn.cpp index b7fc74bc2f..d4593c0a24 100644 --- a/Externals/wxWidgets3/src/osx/carbon/tglbtn.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/tglbtn.cpp @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.cpp 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/thread.cpp b/Externals/wxWidgets3/src/osx/carbon/thread.cpp index 790f45cd3d..dcb7bd778a 100644 --- a/Externals/wxWidgets3/src/osx/carbon/thread.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/thread.cpp @@ -4,7 +4,6 @@ // Author: Original from Wolfram Gloger/Guilhem Lavaux/Vadim Zeitlin // Modified by: Aj Lavin, Stefan Csomor // Created: 04/22/98 -// RCS-ID: $Id: thread.cpp 69883 2011-12-01 14:22:15Z VZ $ // Copyright: (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998), // Vadim Zeitlin (1999), Stefan Csomor (2000) // Licence: wxWindows licence @@ -475,7 +474,7 @@ public: { m_tid = kInvalidID; m_state = STATE_NEW; - m_prio = WXTHREAD_DEFAULT_PRIORITY; + m_prio = wxPRIORITY_DEFAULT; m_notifyQueueId = kInvalidID; m_exitcode = 0; m_cancelled = false ; @@ -624,7 +623,7 @@ OSStatus wxThreadInternal::MacThreadStart(void *parameter) if ( !dontRunAtAll ) { - pthread->m_exitcode = thread->Entry(); + pthread->m_exitcode = thread->CallEntry(); { wxCriticalSectionLocker lock(thread->m_critsect); @@ -656,6 +655,9 @@ bool wxThreadInternal::Create( wxThread *thread, unsigned int stackSize ) wxASSERT_MSG( m_state == STATE_NEW && !m_tid, wxT("Create()ing thread twice?") ); + if ( thread->IsDetached() ) + Detach(); + OSStatus err = noErr; m_thread = thread; @@ -664,7 +666,7 @@ bool wxThreadInternal::Create( wxThread *thread, unsigned int stackSize ) OSStatus err = MPCreateQueue( &m_notifyQueueId ); if (err != noErr) { - wxLogSysError( wxT("Cant create the thread event queue") ); + wxLogSysError( wxT("Can't create the thread event queue") ); return false; } @@ -683,7 +685,7 @@ bool wxThreadInternal::Create( wxThread *thread, unsigned int stackSize ) return false; } - if ( m_prio != WXTHREAD_DEFAULT_PRIORITY ) + if ( m_prio != wxPRIORITY_DEFAULT ) SetPriority( m_prio ); return true; @@ -868,13 +870,9 @@ wxThreadError wxThread::Create( unsigned int stackSize ) { wxCriticalSectionLocker lock(m_critsect); - if ( m_isDetached ) - m_internal->Detach() ; - if ( !m_internal->Create(this, stackSize) ) { m_internal->SetState( STATE_EXITED ); - return wxTHREAD_NO_RESOURCE; } @@ -885,6 +883,17 @@ wxThreadError wxThread::Run() { wxCriticalSectionLocker lock(m_critsect); + // Create the thread if it wasn't created yet with an explicit + // Create() call: + if ( m_internal->GetId() == kInvalidID ) + { + if ( !m_internal->Create(this, stackSize) ) + { + m_internal->SetState( STATE_EXITED ); + return wxTHREAD_NO_RESOURCE; + } + } + wxCHECK_MSG( m_internal->GetId(), wxTHREAD_MISC_ERROR, wxT("must call wxThread::Create() first") ); @@ -1110,8 +1119,7 @@ bool wxThread::TestDestroy() void wxThread::SetPriority(unsigned int prio) { - wxCHECK_RET( ((int)WXTHREAD_MIN_PRIORITY <= (int)prio) && - ((int)prio <= (int)WXTHREAD_MAX_PRIORITY), + wxCHECK_RET( wxPRIORITY_MIN <= prio && prio <= wxPRIORITY_MAX, wxT("invalid thread priority") ); wxCriticalSectionLocker lock(m_critsect); diff --git a/Externals/wxWidgets3/src/osx/carbon/timer.cpp b/Externals/wxWidgets3/src/osx/carbon/timer.cpp index 441a8ea8c7..be218af294 100644 --- a/Externals/wxWidgets3/src/osx/carbon/timer.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/timer.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: timer.cpp 64943 2010-07-13 13:29:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp b/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp index 15eab65220..a44e23bbda 100644 --- a/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: toolbar.cpp 67230 2011-03-18 14:20:12Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -932,6 +931,15 @@ wxToolBar::~wxToolBar() if ( !m_macToolbar ) return; + // it might already have been uninstalled due to a previous call to Destroy, but in case + // wasn't, do so now, otherwise redraw events may occur for deleted objects + bool ownToolbarInstalled = false; + MacTopLevelHasNativeToolbar( &ownToolbarInstalled ); + if (ownToolbarInstalled) + { + MacUninstallNativeToolbar(); + } + CFIndex count = CFGetRetainCount( m_macToolbar ) ; // Leopard seems to have one refcount more, so we cannot check reliably at the moment if ( UMAGetSystemVersion() < 0x1050 ) @@ -1111,7 +1119,7 @@ bool wxToolBar::MacInstallNativeToolbar(bool usesNative) // which we don't want in this case wxSize sz = GetParent()->GetSize(); ShowHideWindowToolbar( tlw, true, false ); - // Restore the orginal size + // Restore the original size GetParent()->SetSize( sz ); ChangeWindowAttributes( tlw, kWindowToolbarButtonAttribute, 0 ); diff --git a/Externals/wxWidgets3/src/osx/carbon/tooltip.cpp b/Externals/wxWidgets3/src/osx/carbon/tooltip.cpp index b86c426815..66f99826e0 100644 --- a/Externals/wxWidgets3/src/osx/carbon/tooltip.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/tooltip.cpp @@ -2,7 +2,6 @@ // Name: src/osx/carbon/tooltip.cpp // Purpose: wxToolTip implementation // Author: Stefan Csomor -// Id: $Id: tooltip.cpp 64656 2010-06-20 18:18:23Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/uma.cpp b/Externals/wxWidgets3/src/osx/carbon/uma.cpp index 1a51c2ecee..2773665f4a 100644 --- a/Externals/wxWidgets3/src/osx/carbon/uma.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/uma.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: uma.cpp 68721 2011-08-16 12:17:13Z SC $ // Copyright: (c) Stefan Csomor // Licence: The wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/carbon/utils.cpp b/Externals/wxWidgets3/src/osx/carbon/utils.cpp index c3d40685f4..8598ad1be8 100644 --- a/Externals/wxWidgets3/src/osx/carbon/utils.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/utils.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utils.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -45,13 +44,7 @@ #include "wx/evtloop.h" -#if defined(__MWERKS__) && wxUSE_UNICODE -#if __MWERKS__ < 0x4100 - #include -#endif -#endif - -#if wxUSE_BASE +#if wxUSE_GUI // Emit a beeeeeep void wxBell() @@ -69,10 +62,6 @@ void wxBell() #endif } -#endif // wxUSE_BASE - -#if wxUSE_GUI - wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) { return new wxOSXTimerImpl(timer); diff --git a/Externals/wxWidgets3/src/osx/carbon/utilscocoa.mm b/Externals/wxWidgets3/src/osx/carbon/utilscocoa.mm index 752d9e78c5..000f6710a4 100644 --- a/Externals/wxWidgets3/src/osx/carbon/utilscocoa.mm +++ b/Externals/wxWidgets3/src/osx/carbon/utilscocoa.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utilscocoa.mm 70399 2012-01-19 14:04:47Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -193,7 +192,7 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) } static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } -static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, tan(DegToRad(11)), 1, 0, 0 }; +static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, static_cast(tan(DegToRad(11))), 1, 0, 0 }; WX_NSFont wxFont::OSXCreateNSFont(const wxNativeFontInfo* info) { @@ -343,6 +342,19 @@ WX_UIFont wxFont::OSXCreateUIFont(const wxNativeFontInfo* info) return uiFont; } +#endif + +// ---------------------------------------------------------------------------- +// NSWindow Utils +// ---------------------------------------------------------------------------- + +#if wxOSX_USE_COCOA + +WXWindow wxOSXGetMainWindow() +{ + return [NSApp mainWindow]; +} + #endif // ---------------------------------------------------------------------------- // NSImage Utils @@ -368,6 +380,33 @@ wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, c #endif } +double wxOSXGetMainScreenContentScaleFactor() +{ + double scale; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 + if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) + { + scale=[[UIScreen mainScreen] scale]; + } + else +#endif + { + scale=1.0; + } + + return scale; +} + +#endif + +#if wxOSX_USE_CARBON + +double wxOSXGetMainScreenContentScaleFactor() +{ + return 1.0; +} + #endif #if wxOSX_USE_COCOA @@ -375,18 +414,17 @@ wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &client, c wxBitmap wxOSXCreateSystemBitmap(const wxString& name, const wxString &WXUNUSED(client), const wxSize& WXUNUSED(size)) { wxCFStringRef cfname(name); - wxCFRef image( wxOSXCreateCGImageFromNSImage([NSImage imageNamed:cfname.AsNSString()]) ); - return wxBitmap( image ); + return wxBitmap( [NSImage imageNamed:cfname.AsNSString()] ); } // From "Cocoa Drawing Guide:Working with Images" -WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image ) +WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image, double scaleFactor ) { NSRect imageRect = NSMakeRect(0.0, 0.0, 0.0, 0.0); // Get the image dimensions. - imageRect.size.height = CGImageGetHeight(image); - imageRect.size.width = CGImageGetWidth(image); + imageRect.size.height = CGImageGetHeight(image)/scaleFactor; + imageRect.size.width = CGImageGetWidth(image)/scaleFactor; // Create a new image to receive the Quartz image data. NSImage *newImage = [[NSImage alloc] initWithSize:imageRect.size]; @@ -409,22 +447,57 @@ WX_NSImage wxOSXGetNSImageFromCGImage( CGImageRef image ) return( newImage ); } -CGImageRef wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage ) +CGContextRef WXDLLIMPEXP_CORE wxOSXCreateBitmapContextFromNSImage( WX_NSImage nsimage) { // based on http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg18065.html - - CGImageRef image = NULL; + + CGContextRef hbitmap = NULL; if (nsimage != nil) { + double scale = wxOSXGetMainScreenContentScaleFactor(); + NSSize imageSize = [nsimage size]; - CGContextRef context = CGBitmapContextCreate(NULL, imageSize.width, imageSize.height, 8, 0, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst); - NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; + + hbitmap = CGBitmapContextCreate(NULL, imageSize.width*scale, imageSize.height*scale, 8, 0, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst); + CGContextScaleCTM( hbitmap, scale, scale ); + + NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:hbitmap flipped:NO]; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:nsGraphicsContext]; [[NSColor whiteColor] setFill]; NSRectFill(NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height)); [nsimage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; [NSGraphicsContext setCurrentContext:nsGraphicsContext]; + } + return hbitmap; +} + +double wxOSXGetMainScreenContentScaleFactor() +{ +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) + if ( [ [NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)] ) + return [[NSScreen mainScreen] backingScaleFactor]; + else +#endif + return 1.0; +} + +CGImageRef wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage, double *scaleptr ) +{ + // based on http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg18065.html + + CGImageRef image = NULL; + if (nsimage != nil) + { + CGContextRef context = wxOSXCreateBitmapContextFromNSImage(nsimage); + if ( scaleptr ) + { + // determine content scale + CGRect userrect = CGRectMake(0, 0, 10, 10); + CGRect devicerect; + devicerect = CGContextConvertRectToDeviceSpace(context, userrect); + *scaleptr = devicerect.size.height / userrect.size.height; + } image = CGBitmapContextCreateImage(context); CFRelease(context); } diff --git a/Externals/wxWidgets3/src/osx/carbon/window.cpp b/Externals/wxWidgets3/src/osx/carbon/window.cpp index 3b1e3f79a4..5a4a0bf791 100644 --- a/Externals/wxWidgets3/src/osx/carbon/window.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/window.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: window.cpp 69440 2011-10-16 15:59:31Z SJL $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -87,6 +86,12 @@ WXWidget wxWidgetImpl::FindFocus() return control; } +// no compositing to take into account under carbon +wxWidgetImpl* wxWidgetImpl::FindBestFromWXWidget(WXWidget control) +{ + return FindFromWXWidget(control); +} + // --------------------------------------------------------------------------- // Carbon Events // --------------------------------------------------------------------------- @@ -653,8 +658,7 @@ WXDLLEXPORT pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef ha I don't have time to look into that right now. -- CL */ - if ( wxTheApp->MacSendCharEvent( - focus , message , 0 , when , 0 , 0 , uniChars[pos] ) ) + if ( wxTheApp->MacSendCharEvent( focus , message , 0 , when , uniChars[pos] ) ) { result = noErr ; } @@ -666,15 +670,13 @@ WXDLLEXPORT pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef ha case kEventTextInputUnicodeForKeyEvent : { UInt32 keyCode, modifiers ; - Point point ; EventRef rawEvent ; unsigned char charCode ; GetEventParameter( event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent ) ; - GetEventParameter( rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode ); + GetEventParameter( rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode ); GetEventParameter( rawEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode ); GetEventParameter( rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers ); - GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point ); UInt32 message = (keyCode << 8) + charCode; @@ -686,8 +688,7 @@ WXDLLEXPORT pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef ha WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ; wxTheApp->MacSetCurrentEvent( event , handler ) ; - if ( wxTheApp->MacSendCharEvent( - focus , message , modifiers , when , point.h , point.v , uniChars[pos] ) ) + if ( wxTheApp->MacSendCharEvent( focus , message , modifiers , when , uniChars[pos] ) ) { result = noErr ; } @@ -1408,7 +1409,15 @@ void wxMacControl::Enable( bool enable ) void wxMacControl::SetDrawingEnabled( bool enable ) { - HIViewSetDrawingEnabled( m_controlRef , enable ); + if ( enable ) + { + HIViewSetDrawingEnabled( m_controlRef , true ); + HIViewSetNeedsDisplay( m_controlRef, true); + } + else + { + HIViewSetDrawingEnabled( m_controlRef , false ); + } } void wxMacControl::GetRectInWindowCoords( Rect *r ) diff --git a/Externals/wxWidgets3/src/osx/checkbox_osx.cpp b/Externals/wxWidgets3/src/osx/checkbox_osx.cpp index 6ec54eaaea..6e4d58a680 100644 --- a/Externals/wxWidgets3/src/osx/checkbox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/checkbox_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: checkbox_osx.cpp 67892 2011-06-08 23:02:25Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -128,7 +127,7 @@ bool wxCheckBox::OSXHandleClicked( double WXUNUSED(timestampsec) ) if (sendEvent) { - wxCommandEvent event( wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId ); + wxCommandEvent event( wxEVT_CHECKBOX, m_windowId ); event.SetInt( newState ); event.SetEventObject( this ); ProcessCommand( event ); diff --git a/Externals/wxWidgets3/src/osx/checklst_osx.cpp b/Externals/wxWidgets3/src/osx/checklst_osx.cpp index 1dd27e13d3..8b4b28a897 100644 --- a/Externals/wxWidgets3/src/osx/checklst_osx.cpp +++ b/Externals/wxWidgets3/src/osx/checklst_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: checklst_osx.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -116,7 +115,7 @@ void wxCheckListBox::SetValueCallback( unsigned int n, wxListWidgetColumn* col , { Check( n, value.IsChecked() ); - wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId() ); + wxCommandEvent event( wxEVT_CHECKLISTBOX, GetId() ); event.SetInt( n ); event.SetString( GetString( n ) ); event.SetEventObject( this ); diff --git a/Externals/wxWidgets3/src/osx/choice_osx.cpp b/Externals/wxWidgets3/src/osx/choice_osx.cpp index 611ccabfbc..fd9a59daa7 100644 --- a/Externals/wxWidgets3/src/osx/choice_osx.cpp +++ b/Externals/wxWidgets3/src/osx/choice_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: choice_osx.cpp 67343 2011-03-30 14:16:04Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -100,6 +99,13 @@ bool wxChoice::Create(wxWindow *parent, // adding/deleting items to/from the list // ---------------------------------------------------------------------------- +void wxChoice::DoAfterItemCountChange() +{ + InvalidateBestSize(); + + GetPeer()->SetMaximum( GetCount() ); +} + int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, unsigned int pos, void **clientData, wxClientDataType type) @@ -132,7 +138,7 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, AssignNewItemClientData(idx, clientData, i, type); } - GetPeer()->SetMaximum( GetCount() ); + DoAfterItemCountChange(); return pos - 1; } @@ -148,8 +154,8 @@ void wxChoice::DoDeleteOneItem(unsigned int n) m_strings.RemoveAt( n ) ; m_datas.RemoveAt( n ) ; - GetPeer()->SetMaximum( GetCount() ) ; + DoAfterItemCountChange(); } void wxChoice::DoClear() @@ -162,7 +168,7 @@ void wxChoice::DoClear() m_strings.Empty() ; m_datas.Empty() ; - GetPeer()->SetMaximum( 0 ) ; + DoAfterItemCountChange(); } // ---------------------------------------------------------------------------- @@ -229,60 +235,20 @@ void * wxChoice::DoGetItemClientData(unsigned int n) const bool wxChoice::OSXHandleClicked( double WXUNUSED(timestampsec) ) { - wxCommandEvent event( wxEVT_COMMAND_CHOICE_SELECTED, m_windowId ); - - // actually n should be made sure by the os to be a valid selection, but ... - int n = GetSelection(); - if ( n > -1 ) - { - event.SetInt( n ); - event.SetString( GetStringSelection() ); - event.SetEventObject( this ); - - if ( HasClientObjectData() ) - event.SetClientObject( GetClientObject( n ) ); - else if ( HasClientUntypedData() ) - event.SetClientData( GetClientData( n ) ); - - ProcessCommand( event ); - } + SendSelectionChangedEvent(wxEVT_CHOICE); return true ; } wxSize wxChoice::DoGetBestSize() const { - int lbWidth = GetCount() > 0 ? 20 : 100; // some defaults - wxSize baseSize = wxWindow::DoGetBestSize(); - int lbHeight = baseSize.y; - int wLine; + // We use the base window size for the height (which is wrong as it doesn't + // take the font into account -- TODO) and add some margins to the width + // computed by the base class method to account for the arrow. + const int lbHeight = wxWindow::DoGetBestSize().y; - { - wxClientDC dc(const_cast(this)); - - // Find the widest line - for(unsigned int i = 0; i < GetCount(); i++) - { - wxString str(GetString(i)); - - wxCoord width, height ; - dc.GetTextExtent( str , &width, &height); - wLine = width ; - - lbWidth = wxMax( lbWidth, wLine ) ; - } - - // Add room for the popup arrow - lbWidth += 2 * lbHeight ; - - wxCoord width, height ; - dc.GetTextExtent( wxT("X"), &width, &height); - int cx = width ; - - lbWidth += cx ; - } - - return wxSize( lbWidth, lbHeight ); + return wxSize(wxChoiceBase::DoGetBestSize().x + 2*lbHeight + GetCharWidth(), + lbHeight); } #endif // wxUSE_CHOICE diff --git a/Externals/wxWidgets3/src/osx/cocoa/aboutdlg.mm b/Externals/wxWidgets3/src/osx/cocoa/aboutdlg.mm index 3182a3f052..45b5456c76 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/aboutdlg.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/aboutdlg.mm @@ -3,7 +3,6 @@ // Purpose: native wxAboutBox() implementation for wxMac // Author: Vadim Zeitlin // Created: 2006-10-08 -// RCS-ID: $Id: aboutdlg.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -81,7 +80,8 @@ void wxAboutBox(const wxAboutDialogInfo& info, wxWindow *parent) if ( info.HasVersion() ) { opts.Set(CFSTR("Version"),info.GetVersion()); - opts.Set(CFSTR("ApplicationVersion"),info.GetLongVersion()); + if ( info.GetLongVersion() != (_("Version ")+info.GetVersion())) + opts.Set(CFSTR("ApplicationVersion"),info.GetLongVersion()); } if ( info.HasCopyright() ) diff --git a/Externals/wxWidgets3/src/osx/cocoa/anybutton.mm b/Externals/wxWidgets3/src/osx/cocoa/anybutton.mm index 866866f350..299dcba2bc 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/anybutton.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/anybutton.mm @@ -3,7 +3,6 @@ // Purpose: wxAnyButton // Author: Stefan Csomor // Created: 1998-01-01 (extracted from button.mm) -// RCS-ID: $Id: anybutton.mm 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/button.mm b/Externals/wxWidgets3/src/osx/cocoa/button.mm index e775a3b7bc..35c2c4d941 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/button.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/button.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: button.mm 70402 2012-01-19 15:01:01Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,6 +15,8 @@ #endif #include "wx/button.h" +#include "wx/toplevel.h" +#include "wx/tglbtn.h" #include "wx/osx/private.h" @@ -81,136 +82,216 @@ - (NSControlSize)controlSize; @end -namespace +wxButtonCocoaImpl::wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v) +: wxWidgetCocoaImpl(wxpeer, v) { + SetNeedsFrame(false); +} -class wxButtonCocoaImpl : public wxWidgetCocoaImpl, public wxButtonImpl +void wxButtonCocoaImpl::SetBitmap(const wxBitmap& bitmap) { -public: - wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v) - : wxWidgetCocoaImpl(wxpeer, v) + // switch bezel style for plain pushbuttons + if ( bitmap.IsOk() ) { - SetNeedsFrame(false); + if ([GetNSButton() bezelStyle] == NSRoundedBezelStyle) + [GetNSButton() setBezelStyle:NSRegularSquareBezelStyle]; } - - virtual void SetBitmap(const wxBitmap& bitmap) + else { - // switch bezel style for plain pushbuttons - if ( bitmap.IsOk() ) - { - if ([GetNSButton() bezelStyle] == NSRoundedBezelStyle) - [GetNSButton() setBezelStyle:NSRegularSquareBezelStyle]; - } - else - { - [GetNSButton() setBezelStyle:NSRoundedBezelStyle]; - } - - wxWidgetCocoaImpl::SetBitmap(bitmap); + [GetNSButton() setBezelStyle:NSRoundedBezelStyle]; } + + wxWidgetCocoaImpl::SetBitmap(bitmap); +} #if wxUSE_MARKUP - virtual void SetLabelMarkup(const wxString& markup) - { - wxMarkupToAttrString toAttr(GetWXPeer(), markup); - NSMutableAttributedString *attrString = toAttr.GetNSAttributedString(); - - // Button text is always centered. - NSMutableParagraphStyle * - paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - [paragraphStyle setAlignment: NSCenterTextAlignment]; - [attrString addAttribute:NSParagraphStyleAttributeName - value:paragraphStyle - range:NSMakeRange(0, [attrString length])]; - [paragraphStyle release]; - - [GetNSButton() setAttributedTitle:attrString]; - } +void wxButtonCocoaImpl::SetLabelMarkup(const wxString& markup) +{ + wxMarkupToAttrString toAttr(GetWXPeer(), markup); + NSMutableAttributedString *attrString = toAttr.GetNSAttributedString(); + + // Button text is always centered. + NSMutableParagraphStyle * + paragraphStyle = [[NSMutableParagraphStyle alloc] init]; + [paragraphStyle setAlignment: NSCenterTextAlignment]; + [attrString addAttribute:NSParagraphStyleAttributeName + value:paragraphStyle + range:NSMakeRange(0, [attrString length])]; + [paragraphStyle release]; + + [GetNSButton() setAttributedTitle:attrString]; +} #endif // wxUSE_MARKUP - void SetPressedBitmap( const wxBitmap& bitmap ) +void wxButtonCocoaImpl::SetPressedBitmap( const wxBitmap& bitmap ) +{ + NSButton* button = GetNSButton(); + [button setAlternateImage: bitmap.GetNSImage()]; + if ( GetWXPeer()->IsKindOf(wxCLASSINFO(wxToggleButton)) ) + { + [button setButtonType:NSToggleButton]; + } + else { - NSButton* button = GetNSButton(); - [button setAlternateImage: bitmap.GetNSImage()]; [button setButtonType:NSMomentaryChangeButton]; } +} - void GetLayoutInset(int &left , int &top , int &right, int &bottom) const - { - left = top = right = bottom = 0; - NSControlSize size = NSRegularControlSize; - if ( [m_osxView respondsToSelector:@selector(controlSize)] ) - size = [m_osxView controlSize]; - else if ([m_osxView respondsToSelector:@selector(cell)]) - { - id cell = [(id)m_osxView cell]; - if ([cell respondsToSelector:@selector(controlSize)]) - size = [cell controlSize]; - } - - if ( [GetNSButton() bezelStyle] == NSRoundedBezelStyle ) - { - switch( size ) - { - case NSRegularControlSize: - left = right = 6; - top = 4; - bottom = 8; - break; - case NSSmallControlSize: - left = right = 5; - top = 4; - bottom = 7; - break; - case NSMiniControlSize: - left = right = 1; - top = 0; - bottom = 2; - break; - } - } - } - - -private: - NSButton *GetNSButton() const - { - wxASSERT( [m_osxView isKindOfClass:[NSButton class]] ); - - return static_cast(m_osxView); - } -}; - -} // anonymous namespace - -extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); - -// set bezel style depending on the wxBORDER_XXX flags specified by the style -void SetBezelStyleFromBorderFlags(NSButton *v, long style) +void wxButtonCocoaImpl::GetLayoutInset(int &left , int &top , int &right, int &bottom) const { - if ( style & wxBORDER_NONE ) + left = top = right = bottom = 0; + NSControlSize size = NSRegularControlSize; + if ( [m_osxView respondsToSelector:@selector(controlSize)] ) + size = [m_osxView controlSize]; + else if ([m_osxView respondsToSelector:@selector(cell)]) { - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - [v setBordered:NO]; + id cell = [(id)m_osxView cell]; + if ([cell respondsToSelector:@selector(controlSize)]) + size = [cell controlSize]; } - else // we do have a border + + if ( [GetNSButton() bezelStyle] == NSRoundedBezelStyle ) { - // see trac #11128 for a thorough discussion - if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) - [v setBezelStyle:NSRegularSquareBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) - [v setBezelStyle:NSSmallSquareBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - else - [v setBezelStyle:NSRegularSquareBezelStyle]; + switch( size ) + { + case NSRegularControlSize: + left = right = 6; + top = 4; + bottom = 8; + break; + case NSSmallControlSize: + left = right = 5; + top = 4; + bottom = 7; + break; + case NSMiniControlSize: + left = right = 1; + top = 0; + bottom = 2; + break; + } } } +void wxButtonCocoaImpl::SetAcceleratorFromLabel(const wxString& label) +{ + const int accelPos = wxControl::FindAccelIndex(label); + if ( accelPos != wxNOT_FOUND ) + { + wxString accelstring(label[accelPos + 1]); // Skip '&' itself + accelstring.MakeLower(); + wxCFStringRef cfText(accelstring); + [GetNSButton() setKeyEquivalent:cfText.AsNSString()]; + [GetNSButton() setKeyEquivalentModifierMask:NSCommandKeyMask]; + } + else + { + [GetNSButton() setKeyEquivalent:@""]; + } +} + +NSButton *wxButtonCocoaImpl::GetNSButton() const +{ + wxASSERT( [m_osxView isKindOfClass:[NSButton class]] ); + + return static_cast(m_osxView); +} + +// Set bezel style depending on the wxBORDER_XXX flags specified by the style +// and also accounting for the label (bezels are different for multiline +// buttons and normal ones) and the ID (special bezel is used for help button). +// +// This is extern because it's also used in src/osx/cocoa/tglbtn.mm. +extern "C" +void +SetBezelStyleFromBorderFlags(NSButton *v, + long style, + wxWindowID winid, + const wxString& label = wxString(), + const wxBitmap& bitmap = wxBitmap()) +{ + // We can't display a custom label inside a button with help bezel style so + // we only use it if we are using the default label. wxButton itself checks + // if the label is just "Help" in which case it discards it and passes us + // an empty string. + if ( winid == wxID_HELP && label.empty() ) + { + [v setBezelStyle:NSHelpButtonBezelStyle]; + } + else + { + // We can't use rounded bezel styles neither for multiline buttons nor + // for buttons containing (big) icons as they are only meant to be used + // at certain sizes, so the style used depends on whether the label is + // single or multi line. + const bool + isSimpleText = (label.find_first_of("\n\r") == wxString::npos) + && (!bitmap.IsOk() || bitmap.GetHeight() < 20); + + NSBezelStyle bezel; + switch ( style & wxBORDER_MASK ) + { + case wxBORDER_NONE: + bezel = NSShadowlessSquareBezelStyle; + [v setBordered:NO]; + break; + + case wxBORDER_SIMPLE: + bezel = NSShadowlessSquareBezelStyle; + break; + + case wxBORDER_SUNKEN: + bezel = isSimpleText ? NSTexturedRoundedBezelStyle + : NSSmallSquareBezelStyle; + break; + + default: + wxFAIL_MSG( "Unknown border style" ); + // fall through + + case 0: + case wxBORDER_STATIC: + case wxBORDER_RAISED: + case wxBORDER_THEME: + bezel = isSimpleText ? NSRoundedBezelStyle + : NSRegularSquareBezelStyle; + break; + } + + [v setBezelStyle:bezel]; + } +} + +// Set the keyboard accelerator key from the label (e.g. "Click &Me") +void wxButton::OSXUpdateAfterLabelChange(const wxString& label) +{ + wxButtonCocoaImpl *impl = static_cast(GetPeer()); + + // Update the bezel style as may be necessary if our new label is multi + // line while the old one wasn't (or vice versa). + SetBezelStyleFromBorderFlags(impl->GetNSButton(), + GetWindowStyle(), + GetId(), + label); + + + // Skip setting the accelerator for the default buttons as this would + // overwrite the default "Enter" which should be preserved. + wxTopLevelWindow * const + tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + if ( tlw ) + { + if ( tlw->GetDefaultItem() == this ) + return; + } + + impl->SetAcceleratorFromLabel(label); +} + wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID id, + wxWindowID winid, const wxString& label, const wxPoint& pos, const wxSize& size, @@ -220,53 +301,12 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - // We can't display a custom label inside a button with help bezel style so - // we only use it if we are using the default label. wxButton itself checks - // if the label is just "Help" in which case it discards it and passes us - // an empty string. - if ( id == wxID_HELP && label.empty() ) - { - [v setBezelStyle:NSHelpButtonBezelStyle]; - } - else - { - if ( style & wxBORDER_NONE ) - { - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - [v setBordered:NO]; - } - else - { - // the following styles only exist for certain sizes, so avoid them for - // multi-line - if ( label.Find('\n' ) == wxNOT_FOUND && label.Find('\r' ) == wxNOT_FOUND) - { - if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) - [v setBezelStyle:NSRoundedBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) - [v setBezelStyle:NSTexturedRoundedBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - else - [v setBezelStyle:NSRoundedBezelStyle]; - } - else - { - if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) - [v setBezelStyle:NSRegularSquareBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) - [v setBezelStyle:NSSmallSquareBezelStyle]; - else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - else - [v setBezelStyle:NSRegularSquareBezelStyle]; - } + SetBezelStyleFromBorderFlags(v, style, winid, label); - } - } - [v setButtonType:NSMomentaryPushInButton]; - return new wxButtonCocoaImpl( wxpeer, v ); + wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v ); + impl->SetAcceleratorFromLabel(label); + return impl; } void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault ) @@ -274,7 +314,10 @@ void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault ) if ( [m_osxView isKindOfClass:[NSButton class]] ) { if ( isDefault ) + { [(NSButton*)m_osxView setKeyEquivalent: @"\r" ]; + [(NSButton*)m_osxView setKeyEquivalentModifierMask: 0]; + } else [(NSButton*)m_osxView setKeyEquivalent: @"" ]; } @@ -290,7 +333,7 @@ void wxWidgetCocoaImpl::PerformClick() wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), + wxWindowID winid, const wxBitmap& bitmap, const wxPoint& pos, const wxSize& size, @@ -300,7 +343,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - SetBezelStyleFromBorderFlags(v, style); + SetBezelStyleFromBorderFlags(v, style, winid, wxString(), bitmap); if (bitmap.IsOk()) [v setImage:bitmap.GetNSImage() ]; @@ -447,7 +490,7 @@ public : wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(winid), + wxWindowID winid, const wxString& label, const wxPoint& pos, const wxSize& size, @@ -459,7 +502,7 @@ wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, if ( !label.empty() ) [v setTitle:wxCFStringRef(label).AsNSString()]; - SetBezelStyleFromBorderFlags(v, style); + SetBezelStyleFromBorderFlags(v, style, winid, label); return new wxDisclosureTriangleCocoaImpl( wxpeer, v ); } diff --git a/Externals/wxWidgets3/src/osx/cocoa/checkbox.mm b/Externals/wxWidgets3/src/osx/cocoa/checkbox.mm index bc77962d08..941ea79a5a 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/checkbox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/checkbox.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-08-20 -// RCS-ID: $Id: checkbox.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/choice.mm b/Externals/wxWidgets3/src/osx/cocoa/choice.mm index c9303988ad..0068d5d31d 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/choice.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/choice.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: choice.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/colour.mm b/Externals/wxWidgets3/src/osx/cocoa/colour.mm index c0acfd67e4..73df7fbf01 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/colour.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/colour.mm @@ -4,7 +4,6 @@ // Author: Kevin Ollivier // Modified by: // Created: 2009-10-31 -// RCS-ID: $Id: colour.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Kevin Ollivier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -42,5 +41,5 @@ wxColour::wxColour(WX_NSColor col) WX_NSColor wxColour::OSXGetNSColor() const { - return [NSColor colorWithDeviceRed:m_red / 255.0 green:m_green / 255.0 blue:m_blue / 255.0 alpha:m_alpha / 255.0]; + return [NSColor colorWithCalibratedRed:m_red / 255.0 green:m_green / 255.0 blue:m_blue / 255.0 alpha:m_alpha / 255.0]; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/combobox.mm b/Externals/wxWidgets3/src/osx/cocoa/combobox.mm index 61734d91cc..e817c64d8c 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/combobox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/combobox.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: combobox.mm 69948 2011-12-07 23:41:06Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,6 +13,7 @@ #if wxUSE_COMBOBOX #include "wx/combobox.h" +#include "wx/evtloop.h" #ifndef WX_PRECOMP #include "wx/menu.h" @@ -35,12 +35,6 @@ @end -@interface wxNSComboBox : NSComboBox -{ -} - -@end - @implementation wxNSComboBox + (void)initialize @@ -53,6 +47,33 @@ } } +- (void) dealloc +{ + [fieldEditor release]; + [super dealloc]; +} + +// Over-riding NSComboBox onKeyDown method doesn't work for key events. +// Ensure that we can use our own wxNSTextFieldEditor to catch key events. +// See windowWillReturnFieldEditor in nonownedwnd.mm. +// Key events will be caught and handled via wxNSTextFieldEditor onkey... +// methods in textctrl.mm. + +- (void) setFieldEditor:(wxNSTextFieldEditor*) editor +{ + if ( editor != fieldEditor ) + { + [editor retain]; + [fieldEditor release]; + fieldEditor = editor; + } +} + +- (wxNSTextFieldEditor*) fieldEditor +{ + return fieldEditor; +} + - (void)controlTextDidChange:(NSNotification *)aNotification { wxUnusedVar(aNotification); @@ -61,7 +82,7 @@ { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); + wxCommandEvent event(wxEVT_TEXT, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( static_cast(wxpeer)->GetValue() ); wxpeer->HandleWindowEvent( event ); @@ -75,15 +96,20 @@ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl && impl->ShouldSendEvents()) { - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); + wxComboBox* wxpeer = static_cast(impl->GetWXPeer()); if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, wxpeer->GetId()); + const int sel = wxpeer->GetSelection(); + + wxCommandEvent event(wxEVT_COMBOBOX, wxpeer->GetId()); event.SetEventObject( wxpeer ); - event.SetInt( static_cast(wxpeer)->GetSelection() ); + event.SetInt( sel ); + event.SetString( wxpeer->GetString(sel) ); // For some reason, wxComboBox::GetValue will not return the newly selected item // while we're inside this callback, so use AddPendingEvent to make sure // GetValue() returns the right value. + wxpeer->GetEventHandler()->AddPendingEvent( event ); + } } } @@ -99,6 +125,30 @@ wxNSComboBoxControl::~wxNSComboBoxControl() { } +void wxNSComboBoxControl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) +{ + // NSComboBox has its own event loop, which reacts very badly to our synthetic + // events used to signal when a wxEvent is posted, so during that time we switch + // the wxEventLoop::WakeUp implementation to a lower-level version + + bool reset = false; + wxEventLoop* const loop = (wxEventLoop*) wxEventLoopBase::GetActive(); + + if ( loop != NULL && [event type] == NSLeftMouseDown ) + { + reset = true; + loop->OSXUseLowLevelWakeup(true); + } + + wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + superimpl(slf, (SEL)_cmd, event); + + if ( reset ) + { + loop->OSXUseLowLevelWakeup(false); + } +} + int wxNSComboBoxControl::GetSelectedItem() const { return [m_comboBox indexOfSelectedItem]; @@ -145,6 +195,7 @@ void wxNSComboBoxControl::Clear() { SendEvents(false); [m_comboBox removeAllItems]; + [m_comboBox setStringValue:@""]; SendEvents(true); } @@ -177,6 +228,15 @@ void wxNSComboBoxControl::Dismiss() [ax accessibilitySetValue: [NSNumber numberWithBool: NO] forAttribute: NSAccessibilityExpandedAttribute]; } +void wxNSComboBoxControl::SetEditable(bool editable) +{ + // TODO: unfortunately this does not work, setEditable just means the same as CB_READONLY + // I don't see a way to access the text field directly + + // Behavior NONE <- SELECTECTABLE + [m_comboBox setEditable:editable]; +} + wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxComboBox* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), diff --git a/Externals/wxWidgets3/src/osx/cocoa/dataview.mm b/Externals/wxWidgets3/src/osx/cocoa/dataview.mm index ad8dfe54ec..d2d219d18e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/dataview.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/dataview.mm @@ -4,7 +4,6 @@ // Author: // Modified by: // Created: 2009-01-31 -// RCS-ID: $Id: dataview.mm$ // Copyright: // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -542,7 +541,7 @@ outlineView:(NSOutlineView*)outlineView wxCHECK_MSG( dvc->GetModel(), false, "Pointer to model not set correctly." ); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_DROP, dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_DROP, dvc->GetId()); event.SetEventObject(dvc); event.SetItem(wxDataViewItemFromItem(item)); event.SetModel(dvc->GetModel()); @@ -753,7 +752,7 @@ outlineView:(NSOutlineView*)outlineView // send first the event to wxWidgets that the sorting has changed so that // the program can do special actions before the sorting actually starts: - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dvc->GetId()); // variable defintion + wxDataViewEvent event(wxEVT_DATAVIEW_COLUMN_SORTED,dvc->GetId()); // variable definition event.SetEventObject(dvc); if (noOfDescriptors > 0) @@ -792,7 +791,7 @@ outlineView:(NSOutlineView*)outlineView wxCHECK_MSG(dvc->GetModel(), false, "Pointer to model not set correctly."); wxDataViewEvent - event(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE,dvc->GetId()); + event(wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE,dvc->GetId()); event.SetEventObject(dvc); event.SetItem(wxDataViewItemFromItem(item)); @@ -897,7 +896,7 @@ outlineView:(NSOutlineView*)outlineView // send a begin drag event for all selected items and proceed with // dragging unless the event is vetoed: wxDataViewEvent - event(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG,dvc->GetId()); + event(wxEVT_DATAVIEW_ITEM_BEGIN_DRAG,dvc->GetId()); event.SetEventObject(dvc); event.SetModel(dvc->GetModel()); @@ -926,7 +925,8 @@ outlineView:(NSOutlineView*)outlineView size_t const dataSize = event.GetDataObject()->GetDataSize(idDataFormat); size_t const dataBufferSize = sizeof(wxDataFormatId)+dataSize; // variable definitions (used in all case statements): - wxMemoryBuffer dataBuffer(dataBufferSize); + // give additional headroom for trailing NULL + wxMemoryBuffer dataBuffer(dataBufferSize+4); dataBuffer.AppendData(&idDataFormat,sizeof(wxDataFormatId)); switch (idDataFormat) @@ -958,13 +958,13 @@ outlineView:(NSOutlineView*)outlineView break; default: wxFAIL_MSG("Data object has invalid or unsupported data format"); - [dataArray release]; return NO; } } delete[] dataFormats; delete itemObject; if (dataStringAvailable) + { if (itemStringAvailable) { if (itemCounter > 0) @@ -973,10 +973,10 @@ outlineView:(NSOutlineView*)outlineView } else dataStringAvailable = false; + } } else { - [dataArray release]; delete itemObject; return NO; // dragging was vetoed or no data available } @@ -1167,6 +1167,23 @@ outlineView:(NSOutlineView*)outlineView @implementation wxCustomCell +#if 0 // starting implementation for custom cell clicks + +- (id)init +{ + self = [super init]; + [self setAction:@selector(clickedAction)]; + [self setTarget:self]; + return self; +} + +- (void) clickedAction: (id) sender +{ + wxUnusedVar(sender); +} + +#endif + -(NSSize) cellSize { wxCustomRendererObject * const @@ -1608,7 +1625,7 @@ outlineView:(NSOutlineView*)outlineView // sent whether the cell is editable or not wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_ACTIVATED,dvc->GetId()); event.SetEventObject(dvc); @@ -1629,7 +1646,7 @@ outlineView:(NSOutlineView*)outlineView // menu should be shown or not wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,dvc->GetId()); wxDataViewItemArray selectedItems; @@ -1650,7 +1667,7 @@ outlineView:(NSOutlineView*)outlineView // // delegate methods // --(void) outlineView:(NSOutlineView*)outlineView mouseDownInHeaderOfTableColumn:(NSTableColumn*)tableColumn +-(void) outlineView:(NSOutlineView*)outlineView didClickTableColumn:(NSTableColumn*)tableColumn { wxDataViewColumn* const col([static_cast(tableColumn) getColumnPointer]); @@ -1658,7 +1675,7 @@ outlineView:(NSOutlineView*)outlineView wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); wxDataViewEvent - event(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK,dvc->GetId()); + event(wxEVT_DATAVIEW_COLUMN_HEADER_CLICK,dvc->GetId()); // first, send an event that the user clicked into a column's header: @@ -1685,7 +1702,7 @@ outlineView:(NSOutlineView*)outlineView NSArray* sortDescriptors; NSSortDescriptor* sortDescriptor; - sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[NSString stringWithFormat:@"%d",[outlineView columnWithIdentifier:[tableColumn identifier]]] + sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[NSString stringWithFormat:@"%ld",(long)[outlineView columnWithIdentifier:[tableColumn identifier]]] ascending:YES]; sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; [tableColumn setSortDescriptorPrototype:sortDescriptor]; @@ -1700,7 +1717,7 @@ outlineView:(NSOutlineView*)outlineView wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_COLLAPSING,dvc->GetId()); event.SetEventObject(dvc); @@ -1718,7 +1735,7 @@ outlineView:(NSOutlineView*)outlineView wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_EXPANDING,dvc->GetId()); event.SetEventObject(dvc); @@ -1793,7 +1810,7 @@ outlineView:(NSOutlineView*)outlineView wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_COLUMN_REORDERED,dvc->GetId()); event.SetEventObject(dvc); @@ -1806,7 +1823,7 @@ outlineView:(NSOutlineView*)outlineView { wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_COLLAPSED,dvc->GetId()); event.SetEventObject(dvc); @@ -1819,7 +1836,7 @@ outlineView:(NSOutlineView*)outlineView { wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_EXPANDED,dvc->GetId()); event.SetEventObject(dvc); @@ -1834,7 +1851,7 @@ outlineView:(NSOutlineView*)outlineView wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl(); - wxDataViewEvent event(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dvc->GetId()); + wxDataViewEvent event(wxEVT_DATAVIEW_SELECTION_CHANGED,dvc->GetId()); event.SetEventObject(dvc); event.SetModel(dvc->GetModel()); @@ -1869,7 +1886,7 @@ outlineView:(NSOutlineView*)outlineView // now, send the event: wxDataViewEvent - event(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dvc->GetId()); + event(wxEVT_DATAVIEW_ITEM_EDITING_STARTED,dvc->GetId()); event.SetEventObject(dvc); event.SetItem( @@ -1889,9 +1906,9 @@ outlineView:(NSOutlineView*)outlineView // even if no event indicating a start of an editing session has been sent // (see Documentation for NSControl controlTextDidEndEditing:); this is // not expected by a user of the wxWidgets library and therefore an - // wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE event is only sent if a - // corresponding wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED has been sent - // before; to check if a wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED has + // wxEVT_DATAVIEW_ITEM_EDITING_DONE event is only sent if a + // corresponding wxEVT_DATAVIEW_ITEM_EDITING_STARTED has been sent + // before; to check if a wxEVT_DATAVIEW_ITEM_EDITING_STARTED has // been sent the last edited column/row are valid: if ( currentlyEditedColumn != -1 && currentlyEditedRow != -1 ) { @@ -1904,7 +1921,7 @@ outlineView:(NSOutlineView*)outlineView // send event to wxWidgets: wxDataViewEvent - event(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dvc->GetId()); + event(wxEVT_DATAVIEW_ITEM_EDITING_DONE,dvc->GetId()); event.SetEventObject(dvc); event.SetItem( @@ -1948,6 +1965,9 @@ wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer, [scrollview setAutohidesScrollers:YES]; [scrollview setDocumentView:m_OutlineView]; + // we cannot call InstallHandler(m_OutlineView) here, because we are handling + // our action:s ourselves, only associate the view with this impl + Associate(m_OutlineView,this); // initialize the native control itself too InitOutlineView(style); } @@ -2620,12 +2640,11 @@ wxDataViewRenderer::OSXOnCellChanged(NSObject *object, const wxDataViewItem& item, unsigned col) { - // TODO: we probably should get rid of this code entirely and make this - // function pure virtual, but currently we still have some native - // renderers (wxDataViewChoiceRenderer) which don't override it and - // there is also wxDataViewCustomRenderer for which it's not obvious - // how it should be implemented so keep this "auto-deduction" of - // variant type from NSObject for now + // TODO: This code should really be removed and this function be made pure + // virtual. We just need to decide what to do with custom renderers + // (i.e. wxDataViewCustomRenderer), currently OS X "in place" editing + // which doesn't really create an editor control is not compatible + // with the in place editing under other platforms. wxVariant value; if ( [object isKindOfClass:[NSString class]] ) @@ -2698,7 +2717,7 @@ void wxDataViewRenderer::OSXApplyAttr(const wxDataViewItemAttr& attr) } const wxColour& c = attr.GetColour(); - colText = [NSColor colorWithDeviceRed:c.Red() / 255. + colText = [NSColor colorWithCalibratedRed:c.Red() / 255. green:c.Green() / 255. blue:c.Blue() / 255. alpha:c.Alpha() / 255.]; @@ -2856,6 +2875,17 @@ wxDataViewChoiceRenderer::wxDataViewChoiceRenderer(const wxArrayString& choices, [cell release]; } +void +wxDataViewChoiceRenderer::OSXOnCellChanged(NSObject *value, + const wxDataViewItem& item, + unsigned col) +{ + // At least under OS X 10.7 we get the index of the item selected and not + // its string. + wxDataViewModel *model = GetOwner()->GetOwner()->GetModel(); + model->ChangeValue(GetChoice(ObjectToLong(value)), item, col); +} + bool wxDataViewChoiceRenderer::MacRender() { if (GetValue().GetType() == GetVariantType()) @@ -2995,6 +3025,8 @@ bool wxDataViewIconTextRenderer::MacRender() iconText << GetValue(); if (iconText.GetIcon().IsOk()) [cell setImage:[[wxBitmap(iconText.GetIcon()).GetNSImage() retain] autorelease]]; + else + [cell setImage:nil]; [cell setStringValue:[[wxCFStringRef(iconText.GetText()).AsNSString() retain] autorelease]]; return true; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/datetimectrl.mm b/Externals/wxWidgets3/src/osx/cocoa/datetimectrl.mm index 4e8a44e894..575a8a2b48 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/datetimectrl.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/datetimectrl.mm @@ -3,7 +3,6 @@ // Purpose: Implementation of wxDateTimePickerCtrl for Cocoa. // Author: Vadim Zeitlin // Created: 2011-12-18 -// Version: $Id$ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -78,7 +77,12 @@ public: virtual void SetDateTime(const wxDateTime& dt) { - [View() setDateValue: NSDateFromWX(dt)]; + wxDateTime dtFrom, dtTo; + + if ( GetDateRange(&dtFrom,&dtTo) == false || + ( (!dtFrom.IsValid() || dtFrom <= dt) && + (!dtTo.IsValid() || dt <= dtTo ) ) ) + [View() setDateValue: NSDateFromWX(dt)]; } virtual wxDateTime GetDateTime() const @@ -172,7 +176,9 @@ wxDateTimeWidgetImpl::CreateDateTimePicker(wxDateTimePickerCtrl* wxpeer, } wxDateTimeWidgetImpl* c = new wxDateTimeWidgetCocoaImpl(wxpeer, v); +#if !wxOSX_USE_NATIVE_FLIPPED c->SetFlipped(false); +#endif return c; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/dialog.mm b/Externals/wxWidgets3/src/osx/cocoa/dialog.mm index ad0a972e2f..8b1e48f1b4 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/dialog.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/dialog.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dialog.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/dirdlg.mm b/Externals/wxWidgets3/src/osx/cocoa/dirdlg.mm index ff8bd78924..ef8886ac69 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/dirdlg.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/dirdlg.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-08-30 -// RCS-ID: $Id: dirdlg.mm 67897 2011-06-09 00:29:13Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,12 +30,19 @@ #endif #include "wx/filename.h" +#include "wx/evtloop.h" +#include "wx/modalhook.h" #include "wx/osx/private.h" IMPLEMENT_CLASS(wxDirDialog, wxDialog) -wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, +void wxDirDialog::Init() +{ + m_sheetDelegate = nil; +} + +void wxDirDialog::Create(wxWindow *parent, const wxString& message, const wxString& defaultPath, long style, const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(size), const wxString& WXUNUSED(name)) { @@ -54,12 +60,8 @@ wxDirDialog::~wxDirDialog() [m_sheetDelegate release]; } -void wxDirDialog::ShowWindowModal() +WX_NSOpenPanel wxDirDialog::OSXCreatePanel() const { - wxCFStringRef dir( m_path ); - - m_modality = wxDIALOG_MODALITY_WINDOW_MODAL; - NSOpenPanel *oPanel = [NSOpenPanel openPanel]; [oPanel setCanChooseDirectories:YES]; [oPanel setResolvesAliases:YES]; @@ -68,38 +70,40 @@ void wxDirDialog::ShowWindowModal() wxCFStringRef cf( m_message ); [oPanel setMessage:cf.AsNSString()]; - if ( HasFlag(wxDD_NEW_DIR_BUTTON) ) + if ( !HasFlag(wxDD_DIR_MUST_EXIST) ) [oPanel setCanCreateDirectories:YES]; - + + return oPanel; +} + +void wxDirDialog::ShowWindowModal() +{ wxNonOwnedWindow* parentWindow = NULL; - + if (GetParent()) parentWindow = dynamic_cast(wxGetTopLevelParent(GetParent())); - - wxASSERT_MSG(parentWindow, "Window modal display requires parent."); - - if (parentWindow) - { - NSWindow* nativeParent = parentWindow->GetWXWindow(); - [oPanel beginSheetForDirectory:dir.AsNSString() file:nil types: nil - modalForWindow: nativeParent modalDelegate: m_sheetDelegate - didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) - contextInfo: nil]; - } + + wxCHECK_RET(parentWindow, "Window modal display requires parent."); + + m_modality = wxDIALOG_MODALITY_WINDOW_MODAL; + + NSOpenPanel *oPanel = OSXCreatePanel(); + + NSWindow* nativeParent = parentWindow->GetWXWindow(); + wxCFStringRef dir( m_path ); + [oPanel beginSheetForDirectory:dir.AsNSString() file:nil types: nil + modalForWindow: nativeParent modalDelegate: m_sheetDelegate + didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) + contextInfo: nil]; } int wxDirDialog::ShowModal() { - NSOpenPanel *oPanel = [NSOpenPanel openPanel]; - [oPanel setCanChooseDirectories:YES]; - [oPanel setResolvesAliases:YES]; - [oPanel setCanChooseFiles:NO]; + WX_HOOK_MODAL_DIALOG(); - wxCFStringRef cf( m_message ); - [oPanel setMessage:cf.AsNSString()]; + wxCFEventLoopPauseIdleEvents pause; - if ( HasFlag(wxDD_NEW_DIR_BUTTON) ) - [oPanel setCanCreateDirectories:YES]; + NSOpenPanel *oPanel = OSXCreatePanel(); wxCFStringRef dir( m_path ); @@ -120,11 +124,11 @@ void wxDirDialog::ModalFinishedCallback(void* panel, int returnCode) if (returnCode == NSOKButton ) { NSOpenPanel* oPanel = (NSOpenPanel*)panel; - SetPath( wxCFStringRef::AsString([[oPanel filenames] objectAtIndex:0])); + SetPath( wxCFStringRef::AsStringWithNormalizationFormC([[oPanel filenames] objectAtIndex:0])); result = wxID_OK; } SetReturnCode(result); - + if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); } diff --git a/Externals/wxWidgets3/src/osx/cocoa/dnd.mm b/Externals/wxWidgets3/src/osx/cocoa/dnd.mm index befc2fdad8..47faae9b16 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/dnd.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/dnd.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dnd.mm 70810 2012-03-05 06:10:19Z SC $ // Copyright: (c) 1998 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm b/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm index d41450df54..2a27139d35 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Stefan Csomor // Modified by: // Created: 2006-01-12 -// RCS-ID: $Id: evtloop.mm 70786 2012-03-03 13:09:54Z SC $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -32,6 +31,7 @@ #endif // WX_PRECOMP #include "wx/log.h" +#include "wx/scopeguard.h" #include "wx/osx/private.h" @@ -109,6 +109,7 @@ wxGUIEventLoop::wxGUIEventLoop() m_dummyWindow = nil; m_modalNestedLevel = 0; m_modalWindow = NULL; + m_osxLowLevelWakeUp = false; } wxGUIEventLoop::~wxGUIEventLoop() @@ -239,28 +240,124 @@ int wxGUIEventLoop::DoDispatchTimeout(unsigned long timeout) } } -void wxGUIEventLoop::DoRun() +static int gs_loopNestingLevel = 0; + +void wxGUIEventLoop::OSXDoRun() { - wxMacAutoreleasePool autoreleasepool; - [NSApp run]; + /* + In order to properly nest GUI event loops in Cocoa, it is important to + have [NSApp run] only as the main/outermost event loop. There are many + problems if [NSApp run] is used as an inner event loop. The main issue + is that a call to [NSApp stop] is needed to exit an [NSApp run] event + loop. But the [NSApp stop] has some side effects that we do not want - + such as if there was a modal dialog box with a modal event loop running, + that event loop would also get exited, and the dialog would be closed. + The call to [NSApp stop] would also cause the enclosing event loop to + exit as well. + + webkit's webcore library uses CFRunLoopRun() for nested event loops. See + the log of the commit log about the change in webkit's webcore module: + http://www.mail-archive.com/webkit-changes@lists.webkit.org/msg07397.html + + See here for the latest run loop that is used in webcore: + https://github.com/WebKit/webkit/blob/master/Source/WebCore/platform/mac/RunLoopMac.mm + + CFRunLoopRun() was tried for the nested event loop here but it causes a + problem in that all user input is disabled - and there is no way to + re-enable it. The caller of this event loop may not want user input + disabled (such as synchronous wxExecute with wxEXEC_NODISABLE flag). + + In order to have an inner event loop where user input can be enabled, + the old wxCocoa code that used the [NSApp nextEventMatchingMask] was + borrowed but changed to use blocking instead of polling. By specifying + 'distantFuture' in 'untildate', we can have it block until the next + event. Then we can keep looping on each new event until m_shouldExit is + raised to exit the event loop. + */ + gs_loopNestingLevel++; + wxON_BLOCK_EXIT_SET(gs_loopNestingLevel, gs_loopNestingLevel - 1); + + while ( !m_shouldExit ) + { + // By putting this inside the loop, we can drain it in each + // loop iteration. + wxMacAutoreleasePool autoreleasepool; + + if ( gs_loopNestingLevel == 1 ) + { + // Use -[NSApplication run] for the main run loop. + [NSApp run]; + } + else + { + // We use this blocking call to [NSApp nextEventMatchingMask:...] + // because the other methods (such as CFRunLoopRun() and [runLoop + // runMode:beforeDate] were always disabling input to the windows + // (even if we wanted it enabled). + // + // Here are the other run loops which were tried, but always left + // user input disabled: + // + // [runLoop runMode:NSDefaultRunLoopMode beforeDate:date]; + // CFRunLoopRun(); + // CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10 , true); + // + // Using [NSApp nextEventMatchingMask:...] would leave windows + // enabled if we wanted them to be, so that is why it is used. + NSEvent *event = [NSApp + nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantFuture] + inMode:NSDefaultRunLoopMode + dequeue: YES]; + + [NSApp sendEvent: event]; + + /** + The NSApplication documentation states that: + + " + This method is invoked automatically in the main event loop + after each event when running in NSDefaultRunLoopMode or + NSModalRunLoopMode. This method is not invoked automatically + when running in NSEventTrackingRunLoopMode. + " + + So to be safe, we also invoke it here in this event loop. + + See: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html + */ + [NSApp updateWindows]; + } + } + + // Wake up the enclosing loop so that it can check if it also needs + // to exit. + WakeUp(); } -void wxGUIEventLoop::DoStop() +void wxGUIEventLoop::OSXDoStop() { - // only calling stop: is not enough when called from a runloop-observer, - // therefore add a dummy event, to make sure the runloop gets another round - [NSApp stop:0]; + // We should only stop the top level event loop. + if ( gs_loopNestingLevel <= 1 ) + { + [NSApp stop:0]; + } + + // For the top level loop only calling stop: is not enough when called from + // a runloop-observer, therefore add a dummy event, to make sure the + // runloop gets another round. And for the nested loops we need to wake it + // up to notice that it should exit, so do this unconditionally. WakeUp(); } void wxGUIEventLoop::WakeUp() { // NSEvent* cevent = [NSApp currentEvent]; - NSString* mode = [[NSRunLoop mainRunLoop] currentMode]; + // NSString* mode = [[NSRunLoop mainRunLoop] currentMode]; // when already in a mouse event handler, don't add higher level event // if ( cevent != nil && [cevent type] <= NSMouseMoved && ) - if ( [NSEventTrackingRunLoopMode isEqualToString:mode] ) + if ( m_osxLowLevelWakeUp /* [NSEventTrackingRunLoopMode isEqualToString:mode] */ ) { // NSLog(@"event for wakeup %@ in mode %@",cevent,mode); wxCFEventLoop::WakeUp(); @@ -304,7 +401,7 @@ wxModalEventLoop::wxModalEventLoop(WXWindow modalNativeWindow) // END move into a evtloop_osx.cpp -void wxModalEventLoop::DoRun() +void wxModalEventLoop::OSXDoRun() { wxMacAutoreleasePool pool; @@ -323,7 +420,7 @@ void wxModalEventLoop::DoRun() [NSApp runModalForWindow:m_modalNativeWindow]; } -void wxModalEventLoop::DoStop() +void wxModalEventLoop::OSXDoStop() { [NSApp abortModal]; } @@ -459,4 +556,4 @@ wxWindowDisabler::~wxWindowDisabler() } delete m_winDisabled; -} \ No newline at end of file +} diff --git a/Externals/wxWidgets3/src/osx/cocoa/filedlg.mm b/Externals/wxWidgets3/src/osx/cocoa/filedlg.mm index 55a7034131..67f58554c4 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/filedlg.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/filedlg.mm @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2004-10-02 -// RCS-ID: $Id: filedlg.mm 67897 2011-06-09 00:29:13Z SC $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -34,9 +33,13 @@ #include "wx/filename.h" #include "wx/tokenzr.h" +#include "wx/evtloop.h" #include "wx/osx/private.h" #include "wx/sysopt.h" +#include "wx/modalhook.h" + +#include // ============================================================================ // implementation @@ -49,6 +52,32 @@ // then the delegate method - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename will have to // be implemented +namespace +{ + +bool HasAppKit_10_6() +{ + // Even if we require 10.6, we might be loaded by an application that + // was linked against 10.5. setAllowedFileTypes will still be ignored + // in this case. From NSSavePanel.h: + // NSOpenPanel: On versions less than 10.6, this property is ignored. + // For applications that link against 10.6 and higher, this property will + // determine which files should be enabled in the open panel. + int32_t version = NSVersionOfLinkTimeLibrary("AppKit"); + if (version == -1) + { + // If we're loaded by an application that doesn't link against AppKit, + // use the runtime version instead. This check will not work for the + // case above. + version = NSVersionOfRunTimeLibrary("AppKit"); + } + + // Notice that this still works correctly even if version is -1. + return version >= 0x40e2400 /* version of 10.6 AppKit */; +} + +} // anonymous namespace + @interface wxOpenPanelDelegate : NSObject wxOSX_10_6_AND_LATER() { wxFileDialog* _dialog; @@ -157,13 +186,20 @@ IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) -wxFileDialog::wxFileDialog( +void wxFileDialog::Init() +{ + m_filterIndex = -1; + m_delegate = nil; + m_sheetDelegate = nil; +} + +void wxFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& sz, const wxString& name) - : wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name) { - m_filterIndex = -1; + wxFileDialogBase::Create(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name); + m_sheetDelegate = [[ModalDialogDelegate alloc] init]; [(ModalDialogDelegate*)m_sheetDelegate setImplementation: this]; } @@ -367,7 +403,7 @@ wxWindow* wxFileDialog::CreateFilterPanel(wxWindow *extracontrol) if ( m_firstFileTypeFilter >= 0 ) m_filterChoice->SetSelection(m_firstFileTypeFilter); } - m_filterChoice->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(wxFileDialog::OnFilterSelected), NULL, this); + m_filterChoice->Connect(wxEVT_CHOICE, wxCommandEventHandler(wxFileDialog::OnFilterSelected), NULL, this); } if(extracontrol) @@ -418,6 +454,11 @@ bool wxFileDialog::CheckFile( const wxString& filename ) void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) { NSSavePanel* panel = (NSSavePanel*) nativeWindow; + // for sandboxed app we cannot access the outer structures + // this leads to problems with extra controls, so as a temporary + // workaround for crashes we don't support those yet + if ( [panel contentView] == nil ) + return; wxNonOwnedWindow::Create( GetParent(), nativeWindow ); wxWindow* extracontrol = NULL; @@ -428,7 +469,6 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) } NSView* accView = nil; - m_delegate = nil; if ( m_useFileTypeFilter ) { @@ -436,7 +476,7 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) accView = m_filterPanel->GetHandle(); if( HasFlag(wxFD_OPEN) ) { - if ( UMAGetSystemVersion() < 0x1060 ) + if ( UMAGetSystemVersion() < 0x1060 || !HasAppKit_10_6() ) { wxOpenPanelDelegate* del = [[wxOpenPanelDelegate alloc]init]; [del setFileDialog:this]; @@ -466,6 +506,10 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) int wxFileDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + + wxCFEventLoopPauseIdleEvents pause; + wxMacAutoreleasePool autoreleasepool; wxCFStringRef cf( m_message ); @@ -585,20 +629,22 @@ int wxFileDialog::ShowModal() [oPanel setMessage:cf.AsNSString()]; [oPanel setAllowsMultipleSelection: (HasFlag(wxFD_MULTIPLE) ? YES : NO )]; - if ( UMAGetSystemVersion() < 0x1060 ) - { - returnCode = [oPanel runModalForDirectory:m_dir.IsEmpty() ? nil : dir.AsNSString() - file:file.AsNSString() types:(m_delegate == nil ? types : nil)]; - } - else +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 + if ( UMAGetSystemVersion() >= 0x1060 && HasAppKit_10_6() ) { [oPanel setAllowedFileTypes: (m_delegate == nil ? types : nil)]; if ( !m_dir.IsEmpty() ) [oPanel setDirectoryURL:[NSURL fileURLWithPath:dir.AsNSString() - isDirectory:YES]]; + isDirectory:YES]]; returnCode = [oPanel runModal]; } - + else +#endif + { + returnCode = [oPanel runModalForDirectory:m_dir.IsEmpty() ? nil : dir.AsNSString() + file:file.AsNSString() types:(m_delegate == nil ? types : nil)]; + } + ModalFinishedCallback(oPanel, returnCode); } @@ -615,7 +661,7 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) NSSavePanel* sPanel = (NSSavePanel*)panel; result = wxID_OK; - m_path = wxCFStringRef::AsString([sPanel filename]); + m_path = wxCFStringRef::AsStringWithNormalizationFormC([sPanel filename]); m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly( m_path ); if (m_filterChoice) @@ -634,7 +680,7 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) NSArray* filenames = [oPanel filenames]; for ( size_t i = 0 ; i < [filenames count] ; ++ i ) { - wxString fnstr = wxCFStringRef::AsString([filenames objectAtIndex:i]); + wxString fnstr = wxCFStringRef::AsStringWithNormalizationFormC([filenames objectAtIndex:i]); m_paths.Add( fnstr ); m_fileNames.Add( wxFileNameFromPath(fnstr) ); if ( i == 0 ) @@ -657,7 +703,9 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); - UnsubclassWin(); + // workaround for sandboxed app, see above + if ( m_isNativeWindowWrapper ) + UnsubclassWin(); [(NSSavePanel*) panel setAccessoryView:nil]; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/gauge.mm b/Externals/wxWidgets3/src/osx/cocoa/gauge.mm index fb3ce4998d..cf82bd434b 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/gauge.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/gauge.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: gauge.mm 69931 2011-12-05 00:00:58Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm b/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm index 18b89f2f66..c1f80b852e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: glcanvas.mm 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -39,7 +38,9 @@ WXGLContext WXGLCreateContext( WXGLPixelFormat pixelFormat, WXGLContext shareCon { WXGLContext context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext: shareContext]; if ( !context ) + { wxFAIL_MSG("NSOpenGLContext creation failed"); + } return context ; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/listbox.mm b/Externals/wxWidgets3/src/osx/cocoa/listbox.mm index e214b12abe..0cc450997e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/listbox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/listbox.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: listbox.mm 67888 2011-06-08 22:50:28Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -303,7 +302,7 @@ protected: wxListBox *list = static_cast ( impl->GetWXPeer()); wxCHECK_RET( list != NULL , wxT("Listbox expected")); - wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() ); + wxCommandEvent event( wxEVT_LISTBOX, list->GetId() ); if ((row < 0) || (row > (int) list->GetCount())) // OS X can select an item below the last item return; @@ -314,6 +313,24 @@ protected: } +- (void)setFont:(NSFont *)aFont +{ + NSArray *tableColumns = [self tableColumns]; + unsigned int columnIndex = [tableColumns count]; + while (columnIndex--) + [[(NSTableColumn *)[tableColumns objectAtIndex:columnIndex] dataCell] setFont:aFont]; + + [self setRowHeight:[gNSLayoutManager defaultLineHeightForFont:aFont]+2]; +} + +- (void) setControlSize:(NSControlSize) size +{ + NSArray *tableColumns = [self tableColumns]; + unsigned int columnIndex = [tableColumns count]; + while (columnIndex--) + [[(NSTableColumn *)[tableColumns objectAtIndex:columnIndex] dataCell] setControlSize:size]; +} + @end // @@ -369,6 +386,11 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const [col1 setWidth:1000]; } [col1 setResizingMask: NSTableColumnAutoresizingMask]; + + wxListBox *list = static_cast ( GetWXPeer()); + if ( list != NULL ) + [[col1 dataCell] setFont:list->GetFont().OSXGetNSFont()]; + wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable ); [col1 setColumn:wxcol]; @@ -388,6 +410,39 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , con [checkbox setTitle:@""]; [checkbox setButtonType:NSSwitchButton]; [col1 setDataCell:checkbox] ; + + wxListBox *list = static_cast ( GetWXPeer()); + if ( list != NULL ) + { + NSControlSize size = NSRegularControlSize; + + switch ( list->GetWindowVariant() ) + { + case wxWINDOW_VARIANT_NORMAL : + size = NSRegularControlSize; + break ; + + case wxWINDOW_VARIANT_SMALL : + size = NSSmallControlSize; + break ; + + case wxWINDOW_VARIANT_MINI : + size = NSMiniControlSize; + break ; + + case wxWINDOW_VARIANT_LARGE : + size = NSRegularControlSize; + break ; + + default: + break ; + } + + [[col1 dataCell] setControlSize:size]; + // although there is no text, it may help to get the correct vertical layout + [[col1 dataCell] setFont:list->GetFont().OSXGetNSFont()]; + } + [checkbox release]; unsigned formerColCount = [m_tableView numberOfColumns]; @@ -555,8 +610,8 @@ wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer, wxListWidgetCocoaImpl* c = new wxListWidgetCocoaImpl( wxpeer, scrollview, tableview, ds ); // temporary hook for dnd - [tableview registerForDraggedTypes:[NSArray arrayWithObjects: - NSStringPboardType, NSFilenamesPboardType, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]]; + // [tableview registerForDraggedTypes:[NSArray arrayWithObjects: + // NSStringPboardType, NSFilenamesPboardType, (NSString*) kPasteboardTypeFileURLPromise, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]]; [ds setImplementation:c]; return c; diff --git a/Externals/wxWidgets3/src/osx/cocoa/mediactrl.mm b/Externals/wxWidgets3/src/osx/cocoa/mediactrl.mm index 33381967df..73624098c5 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/mediactrl.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/mediactrl.mm @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 02/03/05 -// RCS-ID: $Id: mediactrl.mm 39285 2006-05-23 11:04:37Z ABX $ // Copyright: (c) 2004-2005 Ryan Norton, (c) 2005 David Elliot // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -55,9 +54,6 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" -#import -#import - class WXDLLIMPEXP_FWD_MEDIA wxQTMediaBackend; @interface wxQTMovie : QTMovie { @@ -191,21 +187,22 @@ private: } } --(void)loadStateChanged:(QTMovie *)movie +-(void)loadStateChanged:(NSNotification *)notification { + QTMovie *movie = [notification object]; long loadState = [[movie attributeForKey:QTMovieLoadStateAttribute] longValue]; - if (loadState >= QTMovieLoadStatePlayable) - { - // the movie has loaded enough media data to begin playing - } - else if (loadState >= QTMovieLoadStateLoaded) - { - m_backend->FinishLoad(); - } - else if (loadState == -1) + if ( loadState == QTMovieLoadStateError ) { // error occurred } + else if (loadState >= QTMovieLoadStatePlayable) + { + // the movie has loaded enough media data to begin playing, but we don't have an event for that yet + } + else if (loadState >= QTMovieLoadStateComplete) // we might use QTMovieLoadStatePlaythroughOK + { + m_backend->FinishLoad(); + } } -(BOOL)isPlaying @@ -227,8 +224,8 @@ private: IMPLEMENT_DYNAMIC_CLASS(wxQTMediaBackend, wxMediaBackend); wxQTMediaBackend::wxQTMediaBackend() : - m_interfaceflags(wxMEDIACTRLPLAYERCONTROLS_NONE), - m_movie(nil), m_movieview(nil) + m_movie(nil), m_movieview(nil), + m_interfaceflags(wxMEDIACTRLPLAYERCONTROLS_NONE) { } @@ -283,13 +280,30 @@ bool wxQTMediaBackend::Load(const wxString& fileName) bool wxQTMediaBackend::Load(const wxURI& location) { wxCFStringRef uri(location.BuildURI()); - - [m_movie release]; - wxQTMovie* movie = [[wxQTMovie alloc] initWithURL: [NSURL URLWithString: uri.AsNSString()] error: nil ]; + NSURL *url = [NSURL URLWithString: uri.AsNSString()]; + if (! [wxQTMovie canInitWithURL:url]) + return false; + + [m_movie release]; + wxQTMovie* movie = [[wxQTMovie alloc] initWithURL:url error: nil ]; + m_movie = movie; - [m_movie setBackend:this]; - [m_movieview setMovie:movie]; + if (movie != nil) + { + [m_movie setBackend:this]; + [m_movieview setMovie:movie]; + + // If the media file is able to be loaded quickly then there may not be + // any QTMovieLoadStateDidChangeNotification message sent, so we need to + // also check the load state here and finish our initialization if it has + // been loaded. + long loadState = [[m_movie attributeForKey:QTMovieLoadStateAttribute] longValue]; + if (loadState >= QTMovieLoadStateComplete) + { + FinishLoad(); + } + } return movie != nil; } @@ -298,12 +312,10 @@ void wxQTMediaBackend::FinishLoad() { DoShowPlayerControls(m_interfaceflags); - NSRect r =[m_movieview movieBounds]; - m_bestSize.x = r.size.width; - m_bestSize.y = r.size.height; + NSSize s = [[m_movie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue]; + m_bestSize = wxSize(s.width, s.height); NotifyMovieLoaded(); - } bool wxQTMediaBackend::Play() @@ -394,6 +406,7 @@ wxSize wxQTMediaBackend::GetVideoSize() const void wxQTMediaBackend::Move(int x, int y, int w, int h) { + // as we have a native player, no need to move the video area } bool wxQTMediaBackend::ShowPlayerControls(wxMediaCtrlPlayerControls flags) @@ -413,6 +426,8 @@ void wxQTMediaBackend::DoShowPlayerControls(wxMediaCtrlPlayerControls flags) } else { + [m_movieview setControllerVisible:YES]; + [m_movieview setStepButtonsVisible:(flags & wxMEDIACTRLPLAYERCONTROLS_STEP) ? YES:NO]; [m_movieview setVolumeButtonVisible:(flags & wxMEDIACTRLPLAYERCONTROLS_VOLUME) ? YES:NO]; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/menu.mm b/Externals/wxWidgets3/src/osx/cocoa/menu.mm index dc0b61a2ed..9733bc56cd 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/menu.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/menu.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: menu.mm 70401 2012-01-19 14:59:35Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -67,8 +66,8 @@ - (void)menuNeedsUpdate:(NSMenu*)smenu; #else - (void)menuWillOpen:(NSMenu *)menu; -- (void)menuDidClose:(NSMenu *)menu; #endif +- (void)menuDidClose:(NSMenu *)menu; - (void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item; @end @@ -105,6 +104,7 @@ wxpeer->HandleMenuOpened(); } } +#endif - (void)menuDidClose:(NSMenu *)smenu { @@ -117,7 +117,6 @@ wxpeer->HandleMenuClosed(); } } -#endif - (void)menu:(NSMenu *)smenu willHighlightItem:(NSMenuItem *)item { @@ -155,7 +154,6 @@ public : } [menu setDelegate:controller]; [m_osxMenu setImplementation:this]; - [menu setAutoenablesItems:NO]; // gc aware if ( m_osxMenu ) CFRetain(m_osxMenu); @@ -167,7 +165,7 @@ public : virtual void InsertOrAppend(wxMenuItem *pItem, size_t pos) { NSMenuItem* nsmenuitem = (NSMenuItem*) pItem->GetPeer()->GetHMenuItem(); - // make sure a call of SetSubMenu is also reflected (occuring after Create) + // make sure a call of SetSubMenu is also reflected (occurring after Create) // update the native menu item accordingly if ( pItem->IsSubMenu() ) diff --git a/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm b/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm index fe92deac10..eadec5cda6 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: menuitem.mm 69205 2011-09-27 07:21:44Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -311,6 +310,10 @@ bool wxMenuItemCocoaImpl::DoDefault() [theNSApplication unhideAllApplications:nil]; handled=true; } + else if (menuid == wxApp::s_macExitMenuItemId) + { + wxTheApp->ExitMainLoop(); + } return handled; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/msgdlg.mm b/Externals/wxWidgets3/src/osx/cocoa/msgdlg.mm index 4134406e47..fb52f0a7a0 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/msgdlg.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/msgdlg.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: msgdlg.mm 70926 2012-03-17 10:52:34Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,6 +19,8 @@ #include "wx/control.h" #include "wx/thread.h" +#include "wx/evtloop.h" +#include "wx/modalhook.h" #include "wx/osx/private.h" @@ -61,6 +62,10 @@ wxMessageDialog::~wxMessageDialog() int wxMessageDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + + wxCFEventLoopPauseIdleEvents pause; + int resultbutton = wxID_CANCEL; const long style = GetMessageDialogStyle(); diff --git a/Externals/wxWidgets3/src/osx/cocoa/nonownedwnd.mm b/Externals/wxWidgets3/src/osx/cocoa/nonownedwnd.mm index 3e4eb9a7b4..9e79c6a458 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/nonownedwnd.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/nonownedwnd.mm @@ -4,7 +4,6 @@ // Author: DavidStefan Csomor // Modified by: // Created: 2008-06-20 -// RCS-ID: $Id: nonownedwnd.mm 70862 2012-03-10 12:37:58Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -111,7 +110,7 @@ bool shouldHandleSelector(SEL selector) return (wxNonOwnedWindowCocoaImpl*) wxNonOwnedWindowImpl::FindFromWXWindow( self ); } -// TODO in cocoa everything during a drag is sent to the NSWindow the mouse down occured, +// TODO in cocoa everything during a drag is sent to the NSWindow the mouse down occurred, // this does not conform to the wx behaviour if the window is not captured, so try to resend // or capture all wx mouse event handling at the tlw as we did for carbon @@ -145,6 +144,8 @@ bool shouldHandleSelector(SEL selector) // wx native implementation // +static NSResponder* s_nextFirstResponder = NULL; + @interface wxNSWindow : NSWindow { } @@ -152,6 +153,7 @@ bool shouldHandleSelector(SEL selector) - (void) sendEvent:(NSEvent *)event; - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen; - (void)noResponderFor: (SEL) selector; +- (BOOL)makeFirstResponder:(NSResponder *)aResponder; @end @implementation wxNSWindow @@ -206,6 +208,14 @@ bool shouldHandleSelector(SEL selector) return YES; } +- (BOOL)makeFirstResponder:(NSResponder *)aResponder +{ + s_nextFirstResponder = aResponder; + BOOL retval = [super makeFirstResponder:aResponder]; + s_nextFirstResponder = nil; + return retval; +} + @end @interface wxNSPanel : NSPanel @@ -215,6 +225,7 @@ bool shouldHandleSelector(SEL selector) - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen; - (void)noResponderFor: (SEL) selector; - (void)sendEvent:(NSEvent *)event; +- (BOOL)makeFirstResponder:(NSResponder *)aResponder; @end @implementation wxNSPanel @@ -265,6 +276,14 @@ bool shouldHandleSelector(SEL selector) } } +- (BOOL)makeFirstResponder:(NSResponder *)aResponder +{ + s_nextFirstResponder = aResponder; + BOOL retval = [super makeFirstResponder:aResponder]; + s_nextFirstResponder = nil; + return retval; +} + @end @@ -450,12 +469,19 @@ extern int wxOSXGetIdFromSelector(SEL action ); if ( wxpeer ) { wxpeer->HandleActivated(0, false); + // as for wx the deactivation also means losing focus we + // must trigger this manually + [window makeFirstResponder:nil]; + + // TODO Remove if no problems arise with Popup Windows +#if 0 // Needed for popup window since the firstResponder // (focus in wx) doesn't change when this // TLW becomes inactive. wxFocusEvent event( wxEVT_KILL_FOCUS, wxpeer->GetId()); event.SetEventObject(wxpeer); wxpeer->HandleWindowEvent(event); +#endif } } } @@ -477,6 +503,19 @@ extern int wxOSXGetIdFromSelector(SEL action ); } return editor; } + else if ([anObject isKindOfClass:[wxNSComboBox class]]) + { + wxNSComboBox * cb = (wxNSComboBox*) anObject; + wxNSTextFieldEditor* editor = [cb fieldEditor]; + if ( editor == nil ) + { + editor = [[wxNSTextFieldEditor alloc] init]; + [editor setFieldEditor:YES]; + [cb setFieldEditor:editor]; + [editor release]; + } + return editor; + } return nil; } @@ -517,6 +556,12 @@ wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() if ( !m_wxPeer->IsNativeWindowWrapper() ) { [m_macWindow setDelegate:nil]; + + // make sure we remove this first, otherwise the ref count will not lead to the + // native window's destruction + if ([m_macWindow parentWindow] != 0) + [[m_macWindow parentWindow] removeChildWindow: m_macWindow]; + [m_macWindow release]; } } @@ -542,12 +587,12 @@ long style, long extraStyle, const wxString& WXUNUSED(name) ) if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || GetWXPeer()->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) - { m_macWindow = [wxNSPanel alloc]; - } else m_macWindow = [wxNSWindow alloc]; + [m_macWindow setAcceptsMouseMovedEvents:YES]; + CGWindowLevel level = kCGNormalWindowLevel; if ( style & wxFRAME_TOOL_WINDOW ) @@ -613,7 +658,7 @@ long style, long extraStyle, const wxString& WXUNUSED(name) ) // If the parent is modal, windows with wxFRAME_FLOAT_ON_PARENT style need // to be in kCGUtilityWindowLevel and not kCGFloatingWindowLevel to stay // above the parent. - wxDialog * const parentDialog = wxDynamicCast(parent, wxDialog); + wxDialog * const parentDialog = parent == NULL ? NULL : wxDynamicCast(parent->MacGetTopLevelWindow(), wxDialog); if (parentDialog && parentDialog->IsModal()) { if (level == kCGFloatingWindowLevel) @@ -679,14 +724,35 @@ bool wxNonOwnedWindowCocoaImpl::Show(bool show) if ( show ) { wxNonOwnedWindow* wxpeer = GetWXPeer(); - if (wxpeer && !(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW)) - [m_macWindow makeKeyAndOrderFront:nil]; - else - [m_macWindow orderFront:nil]; + if ( wxpeer ) + { + // add to parent window before showing + wxDialog * const dialog = wxDynamicCast(wxpeer, wxDialog); + if ( wxpeer->GetParent() && dialog && dialog->IsModal()) + { + NSView * parentView = wxpeer->GetParent()->GetPeer()->GetWXWidget(); + if ( parentView ) + { + NSWindow* parentNSWindow = [parentView window]; + if ( parentNSWindow ) + [parentNSWindow addChildWindow:m_macWindow ordered:NSWindowAbove]; + } + } + + if (!(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW)) + [m_macWindow makeKeyAndOrderFront:nil]; + else + [m_macWindow orderFront:nil]; + } [[m_macWindow contentView] setNeedsDisplay: YES]; } else + { + // avoid propagation of orderOut to parent + if ([m_macWindow parentWindow] != 0) + [[m_macWindow parentWindow] removeChildWindow: m_macWindow]; [m_macWindow orderOut:nil]; + } return true; } @@ -737,7 +803,8 @@ void wxNonOwnedWindowCocoaImpl::SetExtraStyle( long exStyle ) void wxNonOwnedWindowCocoaImpl::SetWindowStyleFlag( long style ) { - if (m_macWindow) + // don't mess with native wrapped windows, they might throw an exception when their level is changed + if (!m_wxPeer->IsNativeWindowWrapper() && m_macWindow) { CGWindowLevel level = kCGNormalWindowLevel; @@ -993,6 +1060,12 @@ void wxNonOwnedWindowCocoaImpl::RestoreWindowLevel() [m_macWindow setLevel:m_macWindowLevel]; } +WX_NSResponder wxNonOwnedWindowCocoaImpl::GetNextFirstResponder() +{ + return s_nextFirstResponder; +} + + // // // diff --git a/Externals/wxWidgets3/src/osx/cocoa/notebook.mm b/Externals/wxWidgets3/src/osx/cocoa/notebook.mm index 11c4c27dc6..d71ca4047c 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/notebook.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/notebook.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: notebook.mm 67887 2011-06-08 22:48:29Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -94,6 +93,84 @@ @end +// ======================================================================== +// WXCTabViewImageItem +// ======================================================================== +@interface WXCTabViewImageItem : NSTabViewItem +{ + NSImage *m_image; +} +- (id)init; +- (void)dealloc; +- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel; +- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect; +- (NSImage*)image; +- (void)setImage:(NSImage*)image; +@end // interface WXCTabViewImageItem : NSTabViewItem + + +@implementation WXCTabViewImageItem : NSTabViewItem +- (id)init +{ + m_image = nil; + return [super initWithIdentifier:nil]; +} +- (void)dealloc +{ + [m_image release]; + [super dealloc]; +} +- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel +{ + NSSize labelSize = [super sizeOfLabel:shouldTruncateLabel]; + if(!m_image) + return labelSize; + NSSize imageSize = [m_image size]; + // scale image size + if(imageSize.height > labelSize.height) + { + imageSize.width *= labelSize.height/imageSize.height; + imageSize.height *= labelSize.height/imageSize.height; + [m_image setScalesWhenResized:YES]; + [m_image setSize: imageSize]; + } + labelSize.width += imageSize.width; + return labelSize; +} +- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect +{ + if(m_image) + { + NSSize imageSize = [m_image size]; + [m_image compositeToPoint:NSMakePoint(tabRect.origin.x, + tabRect.origin.y+imageSize.height) + operation:NSCompositeSourceOver]; + tabRect.size.width -= imageSize.width; + tabRect.origin.x += imageSize.width; + } + [super drawLabel:shouldTruncateLabel inRect:tabRect]; +} +- (NSImage*)image +{ + return m_image; +} +- (void)setImage:(NSImage*)image +{ + [image retain]; + [m_image release]; + m_image = image; + if(!m_image) + return; + [[NSPasteboard generalPasteboard] + declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] + owner:nil]; + [[NSPasteboard generalPasteboard] + setData:[m_image TIFFRepresentation] + forType:NSTIFFPboardType]; +} +@end // implementation WXCTabViewImageItem : NSTabViewItem + + class wxCocoaTabView : public wxWidgetCocoaImpl { public: @@ -143,7 +220,7 @@ public: { for ( int i = cocoacount ; i < maximum ; ++i ) { - NSTabViewItem* item = [[NSTabViewItem alloc] init]; + NSTabViewItem* item = [[WXCTabViewImageItem alloc] init]; [slf addTabViewItem:item]; [item release]; } @@ -177,11 +254,33 @@ public: const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( i ) ) ; if ( bmap.IsOk() ) { - // TODO how to set an image on a tab + [(WXCTabViewImageItem*) item setImage: bmap.GetNSImage()]; } } } } + + int TabHitTest(const wxPoint & pt, long* flags) + { + int retval = wxNOT_FOUND; + + NSPoint nspt = wxToNSPoint( m_osxView, pt ); + + wxNSTabView* slf = (wxNSTabView*) m_osxView; + + NSTabViewItem* hitItem = [slf tabViewItemAtPoint:nspt]; + + if (!hitItem) { + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + } else { + retval = [slf indexOfTabViewItem:hitItem]; + if ( flags ) + *flags = wxBK_HITTEST_ONLABEL; + } + + return retval; + } }; diff --git a/Externals/wxWidgets3/src/osx/cocoa/overlay.mm b/Externals/wxWidgets3/src/osx/cocoa/overlay.mm index 1ec5a95b2d..55c6c09dd2 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/overlay.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/overlay.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2006-10-20 -// RCS-ID: $Id: overlay.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/preferences.mm b/Externals/wxWidgets3/src/osx/cocoa/preferences.mm new file mode 100644 index 0000000000..7b51732bf0 --- /dev/null +++ b/Externals/wxWidgets3/src/osx/cocoa/preferences.mm @@ -0,0 +1,261 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/osx/cocoa/preferences.cpp +// Purpose: Native OS X implementation of wxPreferencesEditor. +// Author: Vaclav Slavik +// Created: 2013-02-19 +// Copyright: (c) 2013 Vaclav Slavik +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PREFERENCES_EDITOR + +#include "wx/private/preferences.h" + +#ifdef wxHAS_PREF_EDITOR_NATIVE + +#include "wx/frame.h" +#include "wx/sharedptr.h" +#include "wx/toolbar.h" +#include "wx/vector.h" +#include "wx/weakref.h" +#include "wx/windowid.h" +#include "wx/osx/private.h" + +#import + + +wxBitmap wxStockPreferencesPage::GetLargeIcon() const +{ + switch ( m_kind ) + { + case Kind_General: + return wxBitmap([NSImage imageNamed:NSImageNamePreferencesGeneral]); + case Kind_Advanced: + return wxBitmap([NSImage imageNamed:NSImageNameAdvanced]); + } + return wxBitmap(); // silence compiler warning +} + + +class wxCocoaPrefsWindow : public wxFrame +{ +public: + wxCocoaPrefsWindow(const wxString& title) + : wxFrame(NULL, wxID_ANY, title, + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX)), + m_toolbarRealized(false), + m_visiblePage(NULL) + { + m_toolbar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxTB_FLAT | wxTB_TEXT); + m_toolbar->SetToolBitmapSize(wxSize(32,32)); + m_toolbar->OSXSetSelectableTools(true); + SetToolBar(m_toolbar); + + m_toolbar->Bind(wxEVT_TOOL, + &wxCocoaPrefsWindow::OnPageChanged, this); + Bind(wxEVT_CLOSE_WINDOW, &wxCocoaPrefsWindow::OnClose, this); + } + + void AddPage(wxPreferencesPage *page) + { + wxASSERT_MSG( !m_toolbarRealized, + "can't add more preferences pages after showing the window" ); + + const wxString title = page->GetName(); + wxBitmap bmp(page->GetLargeIcon()); + wxASSERT_MSG( bmp.IsOk(), "OS X requires valid bitmap for preference page" ); + + int toolId = wxIdManager::ReserveId(); + wxToolBarToolBase *tool = m_toolbar->AddTool(toolId, title, bmp); + + wxSharedPtr info(new PageInfo(page)); + m_pages.push_back(info); + + tool->SetClientData(info.get()); + } + + virtual bool Show(bool show) + { + if ( show && !m_toolbarRealized ) + { + m_toolbar->Realize(); + m_toolbarRealized = true; + + const wxToolBarToolBase *first = m_toolbar->GetToolByPos(0); + wxCHECK_MSG( first, false, "no preferences panels" ); + OnSelectPageForTool(first); + m_toolbar->OSXSelectTool(first->GetId()); + } + + return wxFrame::Show(show); + } + + virtual bool ShouldPreventAppExit() const { return false; } + +protected: + // Native preferences windows resize when the selected panel changes and + // the resizing is animated, so we need to override DoMoveWindow. + virtual void DoMoveWindow(int x, int y, int width, int height) + { + NSRect r = wxToNSRect(NULL, wxRect(x, y, width, height)); + NSWindow *win = (NSWindow*)GetWXWindow(); + [win setFrame:r display:YES animate:YES]; + } + + +private: + void OnSelectPageForTool(const wxToolBarToolBase *tool) + { + PageInfo *info = static_cast(tool->GetClientData()); + wxCHECK_RET( info, "toolbar item lacks client data" ); + + if ( !info->win ) + { + info->win = info->page->CreateWindow(this); + info->win->Hide(); + info->win->Fit(); + // fill the page with data using wxEVT_INIT_DIALOG/TransferDataToWindow: + info->win->InitDialog(); + } + + // When the page changes in a native preferences dialog, the sequence + // of events is thus: + + // 1. the old page is hidden, only gray background remains + if ( m_visiblePage ) + m_visiblePage->Hide(); + m_visiblePage = info->win; + + // 2. window is resized to fix the new page, with animation + // (in our case, using overriden DoMoveWindow()) + SetClientSize(info->win->GetSize()); + + // 3. new page is shown and the title updated. + info->win->Show(); + SetTitle(info->page->GetName()); + + // TODO: Preferences window may have some pages resizeable and some + // non-resizable on OS X; the whole window is or is not resizable + // depending on which page is selected. + // + // We'll need to add wxPreferencesPage::IsResizable() virtual + // method to implement this. + } + + void OnPageChanged(wxCommandEvent& event) + { + wxToolBarToolBase *tool = m_toolbar->FindById(event.GetId()); + wxCHECK_RET( tool, "invalid tool ID" ); + OnSelectPageForTool(tool); + } + + void OnClose(wxCloseEvent& e) + { + // Instead of destroying the window, just hide it, it could be + // reused again by another invocation of the editor. + Hide(); + } + +private: + struct PageInfo : public wxObject + { + PageInfo(wxPreferencesPage *p) : page(p), win(NULL) {} + + wxSharedPtr page; + wxWindow *win; + }; + // All pages. Use shared pointer to be able to get pointers to PageInfo structs + wxVector< wxSharedPtr > m_pages; + + wxToolBar *m_toolbar; + bool m_toolbarRealized; + wxWindow *m_visiblePage; +}; + + +class wxCocoaPreferencesEditorImpl : public wxPreferencesEditorImpl +{ +public: + wxCocoaPreferencesEditorImpl(const wxString& title) + : m_win(NULL), m_title(title) + { + } + + virtual ~wxCocoaPreferencesEditorImpl() + { + // m_win may already be destroyed if this destructor is called from + // wxApp's destructor. In that case, all windows -- including this + // one -- would already be destroyed by now. + if ( m_win ) + m_win->Destroy(); + } + + virtual void AddPage(wxPreferencesPage* page) + { + GetWin()->AddPage(page); + } + + virtual void Show(wxWindow* WXUNUSED(parent)) + { + // OS X preferences windows don't have parents, they are independent + // windows, so we just ignore the 'parent' argument. + wxWindow *win = GetWin(); + win->Show(); + win->Raise(); + } + + virtual void Dismiss() + { + // Don't destroy the window, only hide it, because OS X preferences + // window typically remember their state even when closed. Reopening + // the window should show it in the exact same state the user left it. + GetWin()->Hide(); + } + +private: + // Use this function to access m_win, so that the window is only created on + // demand when actually needed. + wxCocoaPrefsWindow* GetWin() + { + if ( !m_win ) + { + if ( m_title.empty() ) + m_title = _("Preferences"); + + m_win = new wxCocoaPrefsWindow(m_title); + } + + return m_win; + } + + wxWeakRef m_win; + + wxString m_title; +}; + +/*static*/ +wxPreferencesEditorImpl* wxPreferencesEditorImpl::Create(const wxString& title) +{ + return new wxCocoaPreferencesEditorImpl(title); +} + +#endif // wxHAS_PREF_EDITOR_NATIVE + +#endif // wxUSE_PREFERENCES_EDITOR diff --git a/Externals/wxWidgets3/src/osx/cocoa/printdlg.mm b/Externals/wxWidgets3/src/osx/cocoa/printdlg.mm index e7ccdaca0a..06c7e15950 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/printdlg.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/printdlg.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: printdlg.mm 70707 2012-02-27 15:20:19Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,6 +13,7 @@ #if wxUSE_PRINTING_ARCHITECTURE #include "wx/printdlg.h" +#include "wx/modalhook.h" #ifndef WX_PRECOMP #include "wx/object.h" @@ -59,12 +59,19 @@ void wxOSXCocoaPrintData::UpdateToPMState() int wxMacPrintDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + m_printDialogData.GetPrintData().ConvertToNative(); int result = wxID_CANCEL; NSPrintPanel* panel = [NSPrintPanel printPanel]; NSPrintInfo* printInfo = ((wxOSXCocoaPrintData*)m_printDialogData.GetPrintData().GetNativeData())->GetNSPrintInfo(); + + NSMutableDictionary* dict = [printInfo printSettings]; + [dict setValue:[NSNumber numberWithInt:m_printDialogData.GetMinPage()] forKey:@"com_apple_print_PrintSettings_PMFirstPage"]; + [dict setValue:[NSNumber numberWithInt:m_printDialogData.GetMaxPage()] forKey:@"com_apple_print_PrintSettings_PMLastPage"]; + if ( (NSInteger)[panel runModalWithPrintInfo:printInfo] == NSOKButton ) { result = wxID_OK; @@ -77,6 +84,8 @@ int wxMacPrintDialog::ShowModal() int wxMacPageSetupDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + m_pageSetupData.GetPrintData().ConvertToNative(); ((wxOSXCocoaPrintData*)m_pageSetupData.GetPrintData().GetNativeData())->TransferFrom( &m_pageSetupData ); diff --git a/Externals/wxWidgets3/src/osx/cocoa/radiobut.mm b/Externals/wxWidgets3/src/osx/cocoa/radiobut.mm index 48ca2dbaa9..05e1a021d2 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/radiobut.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/radiobut.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: ??/??/98 -// RCS-ID: $Id: radiobut.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) AUTHOR // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,6 +15,87 @@ #include "wx/radiobut.h" #include "wx/osx/private.h" +// ugly workaround for the fact that since 10.8 is treating all subviews of a view +// which share the same action selector as a group and sets their value automatically +// so we are creating different selectors and iterate through them +// as we are assigning their selectors as actions + +#include + +const int maxAlternateActions = 100; +NSString* alternateActionsSelector = @"controlAction%d:"; + +extern void wxOSX_controlAction(NSView* self, SEL _cmd, id sender); + +@interface wxNSRadioButton : NSButton +{ + NSTrackingRectTag rectTag; +} + +@end + +@implementation wxNSRadioButton ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + for ( int i = 1 ; i <= maxAlternateActions ; i++ ) + { + class_addMethod(self, NSSelectorFromString([NSString stringWithFormat: alternateActionsSelector, i]), (IMP) wxOSX_controlAction, "v@:@" ); + } + } +} + +- (void) setState: (NSInteger) v +{ + [super setState:v]; + // [[self cell] setState:v]; +} + +- (int) intValue +{ + switch ( [self state] ) + { + case NSOnState: + return 1; + case NSMixedState: + return 2; + default: + return 0; + } +} + +- (void) setIntValue: (int) v +{ + switch( v ) + { + case 2: + [self setState:NSMixedState]; + break; + case 1: + [self setState:NSOnState]; + break; + default : + [self setState:NSOffState]; + break; + } +} + +- (void) setTrackingTag: (NSTrackingRectTag)tag +{ + rectTag = tag; +} + +- (NSTrackingRectTag) trackingTag +{ + return rectTag; +} + +@end + wxWidgetImplType* wxWidgetImpl::CreateRadioButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), @@ -26,10 +106,16 @@ wxWidgetImplType* wxWidgetImpl::CreateRadioButton( wxWindowMac* wxpeer, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; - wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; + wxNSRadioButton* v = [[wxNSRadioButton alloc] initWithFrame:r]; [v setButtonType:NSRadioButton]; + static int alternateAction = 1; + + [v setAction: NSSelectorFromString([NSString stringWithFormat: alternateActionsSelector, alternateAction])]; + if ( ++alternateAction > maxAlternateActions ) + alternateAction = 1; + wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); return c; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm b/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm index 2016cc5124..6559a8d47c 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/slider.mm b/Externals/wxWidgets3/src/osx/cocoa/slider.mm index 310e0fef0b..2803fbcd32 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/slider.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/slider.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: slider.mm 67887 2011-06-08 22:48:29Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/spinbutt.mm b/Externals/wxWidgets3/src/osx/cocoa/spinbutt.mm index 5aadd66e87..67675aba9f 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/spinbutt.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/spinbutt.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: spinbutt.mm 70259 2012-01-04 07:54:00Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/srchctrl.mm b/Externals/wxWidgets3/src/osx/cocoa/srchctrl.mm index 55d1442e6a..880d590773 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/srchctrl.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/srchctrl.mm @@ -3,7 +3,6 @@ // Purpose: implements mac carbon wxSearchCtrl // Author: Vince Harron // Created: 2006-02-19 -// RCS-ID: $Id: srchctrl.mm 67905 2011-06-09 01:25:27Z SC $ // Copyright: Vince Harron // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/statbox.mm b/Externals/wxWidgets3/src/osx/cocoa/statbox.mm index 307255eb9f..1a346a4d75 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/statbox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/statbox.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbox.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -73,7 +72,9 @@ wxWidgetImplType* wxWidgetImpl::CreateGroupBox( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSBox* v = [[wxNSBox alloc] initWithFrame:r]; wxStaticBoxCocoaImpl* c = new wxStaticBoxCocoaImpl( wxpeer, v ); +#if !wxOSX_USE_NATIVE_FLIPPED c->SetFlipped(false); +#endif return c; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/statline.mm b/Externals/wxWidgets3/src/osx/cocoa/statline.mm index de356d2338..8590d36740 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/statline.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/statline.mm @@ -3,7 +3,6 @@ // Purpose: wxStaticLine class // Author: Stefan Csomor // Created: 28.06.99 -// Version: $Id: statline.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) 2008 Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/stattext.mm b/Externals/wxWidgets3/src/osx/cocoa/stattext.mm index 77c7ed19af..832b319017 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/stattext.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/stattext.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: stattext.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -102,7 +101,7 @@ private: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineBreakMode:m_lineBreak]; int style = GetWXPeer()->GetWindowStyleFlag(); - if (style & wxALIGN_CENTER) + if (style & wxALIGN_CENTER_HORIZONTAL) [paragraphStyle setAlignment: NSCenterTextAlignment]; else if (style & wxALIGN_RIGHT) [paragraphStyle setAlignment: NSRightTextAlignment]; diff --git a/Externals/wxWidgets3/src/osx/cocoa/taskbar.mm b/Externals/wxWidgets3/src/osx/cocoa/taskbar.mm index f3cca4a6f9..06342b4e72 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/taskbar.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/taskbar.mm @@ -4,7 +4,6 @@ // Author: David Elliott, Stefan Csomor // Modified by: // Created: 2004/01/24 -// RCS-ID: $Id: taskbar.mm 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 2004 David Elliott, Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// @@ -141,9 +140,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler) wxTaskBarIcon::wxTaskBarIcon(wxTaskBarIconType iconType) { - if(iconType == DOCK) + if(iconType == wxTBI_DOCK) m_impl = new wxTaskBarIconDockImpl(this); - else if(iconType == CUSTOM_STATUSITEM) + else if(iconType == wxTBI_CUSTOM_STATUSITEM) m_impl = new wxTaskBarIconCustomStatusItemImpl(this); else { m_impl = NULL; @@ -338,7 +337,7 @@ wxTaskBarIconCustomStatusItemImpl::~wxTaskBarIconCustomStatusItemImpl() { } -bool wxTaskBarIconCustomStatusItemImpl::SetIcon(const wxIcon& icon, const wxString& WXUNUSED(tooltip)) +bool wxTaskBarIconCustomStatusItemImpl::SetIcon(const wxIcon& icon, const wxString& tooltip) { if(!m_statusItem) { @@ -347,6 +346,7 @@ bool wxTaskBarIconCustomStatusItemImpl::SetIcon(const wxIcon& icon, const wxStri m_target = [[wxOSXStatusItemTarget alloc] init]; [m_target setImplementation:this]; + [m_statusItem setHighlightMode:YES]; [m_statusItem setTarget:m_target]; [m_statusItem setAction:@selector(clickedAction:)]; [m_statusItem sendActionOn:NSLeftMouseDownMask]; @@ -367,6 +367,8 @@ bool wxTaskBarIconCustomStatusItemImpl::SetIcon(const wxIcon& icon, const wxStri } [m_statusItem setImage:m_icon.GetNSImage()]; + wxCFStringRef cfTooltip(tooltip); + [m_statusItem setToolTip:cfTooltip.AsNSString()]; return true; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm b/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm index 280d236b59..6c38fdf74f 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Ryan Norton (MLTE GetLineLength and GetLineText) // Created: 1998-01-01 -// RCS-ID: $Id: textctrl.mm 70667 2012-02-22 08:24:09Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -111,6 +110,7 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; @interface wxMaximumLengthFormatter : NSFormatter { int maxLength; + wxTextEntry* field; } @end @@ -119,7 +119,7 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; - (id)init { - [super init]; + self = [super init]; maxLength = 0; return self; } @@ -148,12 +148,17 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; int len = [*partialStringPtr length]; if ( maxLength > 0 && len > maxLength ) { - // TODO wxEVT_COMMAND_TEXT_MAXLEN + field->SendMaxLenEvent(); return NO; } return YES; } +- (void) setTextEntry:(wxTextEntry*) tf +{ + field = tf; +} + @end @implementation wxNSSecureTextField @@ -182,7 +187,11 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) { - impl->DoNotifyFocusEvent( false, NULL ); + NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder(); + NSView* otherView = wxOSXGetViewFromResponder(responder); + + wxWidgetImpl* otherWindow = impl->FindBestFromWXWidget(otherView); + impl->DoNotifyFocusEvent( false, otherWindow ); } } @@ -206,7 +215,7 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton); if ( def && def->IsEnabled() ) { - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); + wxCommandEvent event(wxEVT_BUTTON, def->GetId() ); event.SetEventObject(def); def->Command(event); handled = YES; @@ -336,7 +345,11 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) { - impl->DoNotifyFocusEvent( false, NULL ); + NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder(); + NSView* otherView = wxOSXGetViewFromResponder(responder); + + wxWidgetImpl* otherWindow = impl->FindBestFromWXWidget(otherView); + impl->DoNotifyFocusEvent( false, otherWindow ); } } @@ -499,7 +512,18 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) { - impl->DoNotifyFocusEvent( false, NULL ); + wxNSTextFieldControl* timpl = dynamic_cast(impl); + if ( fieldEditor ) + { + NSRange range = [fieldEditor selectedRange]; + timpl->SetInternalSelection(range.location, range.location + range.length); + } + + NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder(); + NSView* otherView = wxOSXGetViewFromResponder(responder); + + wxWidgetImpl* otherWindow = impl->FindBestFromWXWidget(otherView); + impl->DoNotifyFocusEvent( false, otherWindow ); } } @end @@ -515,7 +539,8 @@ wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) [m_scrollView setHasVerticalScroller:YES]; [m_scrollView setHasHorizontalScroller:NO]; - [m_scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + // TODO Remove if no regression, this was causing automatic resizes of multi-line textfields when the tlw changed + // [m_scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; NSSize contentSize = [m_scrollView contentSize]; wxNSTextView* tv = [[wxNSTextView alloc] initWithFrame: NSMakeRect(0, 0, @@ -688,24 +713,35 @@ void wxNSTextViewControl::SetStyle(long start, long end, const wxTextAttr& style) { - if (m_textView) { + if ( !m_textView ) + return; + + if ( start == -1 && end == -1 ) + { + NSMutableDictionary* const + attrs = [NSMutableDictionary dictionaryWithCapacity:3]; + if ( style.HasFont() ) + [attrs setValue:style.GetFont().OSXGetNSFont() forKey:NSFontAttributeName]; + if ( style.HasBackgroundColour() ) + [attrs setValue:style.GetBackgroundColour().OSXGetNSColor() forKey:NSBackgroundColorAttributeName]; + if ( style.HasTextColour() ) + [attrs setValue:style.GetTextColour().OSXGetNSColor() forKey:NSForegroundColorAttributeName]; + + [m_textView setTypingAttributes:attrs]; + } + else // Set the attributes just for this range. + { NSRange range = NSMakeRange(start, end-start); - if (start == -1 && end == -1) - range = [m_textView selectedRange]; NSTextStorage* storage = [m_textView textStorage]; - - wxFont font = style.GetFont(); - if (style.HasFont() && font.IsOk()) - [storage addAttribute:NSFontAttributeName value:font.OSXGetNSFont() range:range]; - - wxColour bgcolor = style.GetBackgroundColour(); - if (style.HasBackgroundColour() && bgcolor.IsOk()) - [storage addAttribute:NSBackgroundColorAttributeName value:bgcolor.OSXGetNSColor() range:range]; - - wxColour fgcolor = style.GetTextColour(); - if (style.HasTextColour() && fgcolor.IsOk()) - [storage addAttribute:NSForegroundColorAttributeName value:fgcolor.OSXGetNSColor() range:range]; + if ( style.HasFont() ) + [storage addAttribute:NSFontAttributeName value:style.GetFont().OSXGetNSFont() range:range]; + + if ( style.HasBackgroundColour() ) + [storage addAttribute:NSBackgroundColorAttributeName value:style.GetBackgroundColour().OSXGetNSColor() range:range]; + + if ( style.HasTextColour() ) + [storage addAttribute:NSForegroundColorAttributeName value:style.GetTextColour().OSXGetNSColor() range:range]; } } @@ -774,6 +810,7 @@ void wxNSTextFieldControl::SetMaxLength(unsigned long len) { wxMaximumLengthFormatter* formatter = [[[wxMaximumLengthFormatter alloc] init] autorelease]; [formatter setMaxLength:len]; + [formatter setTextEntry:GetTextEntry()]; [m_textField setFormatter:formatter]; } @@ -852,11 +889,11 @@ void wxNSTextFieldControl::SetSelection( long from , long to ) { [editor setSelectedRange:NSMakeRange(from, to-from)]; } - else - { - m_selStart = from; - m_selEnd = to; - } + + // the editor might still be in existence, but we might be already passed our 'focus lost' storage + // of the selection, so make sure we copy this + m_selStart = from; + m_selEnd = to; } void wxNSTextFieldControl::WriteText(const wxString& str) @@ -867,7 +904,12 @@ void wxNSTextFieldControl::WriteText(const wxString& str) if ( editor ) { wxMacEditHelper helper(m_textField); + BOOL hasUndo = [editor respondsToSelector:@selector(setAllowsUndo:)]; + if ( hasUndo ) + [(NSTextView*)editor setAllowsUndo:NO]; [editor insertText:wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; + if ( hasUndo ) + [(NSTextView*)editor setAllowsUndo:YES]; } else { @@ -888,13 +930,59 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), wxWindow* wxpeer = (wxWindow*) GetWXPeer(); if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); + wxCommandEvent event(wxEVT_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( GetTextEntry()->GetValue() ); wxpeer->HandleWindowEvent( event ); } } +void wxNSTextFieldControl::SetInternalSelection( long from , long to ) +{ + m_selStart = from; + m_selEnd = to; +} + +// as becoming first responder on a window - triggers a resign on the same control, we have to avoid +// the resign notification writing back native selection values before we can set our own + +static WXWidget s_widgetBecomingFirstResponder = nil; + +bool wxNSTextFieldControl::becomeFirstResponder(WXWidget slf, void *_cmd) +{ + s_widgetBecomingFirstResponder = slf; + bool retval = wxWidgetCocoaImpl::becomeFirstResponder(slf, _cmd); + s_widgetBecomingFirstResponder = nil; + if ( retval ) + { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + long textLength = [[m_textField stringValue] length]; + m_selStart = wxMin(textLength,wxMax(m_selStart,0)) ; + m_selEnd = wxMax(0,wxMin(textLength,m_selEnd)) ; + + [editor setSelectedRange:NSMakeRange(m_selStart, m_selEnd-m_selStart)]; + } + } + return retval; +} + +bool wxNSTextFieldControl::resignFirstResponder(WXWidget slf, void *_cmd) +{ + if ( slf != s_widgetBecomingFirstResponder ) + { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + NSRange range = [editor selectedRange]; + m_selStart = range.location; + m_selEnd = range.location + range.length; + } + } + return wxWidgetCocoaImpl::resignFirstResponder(slf, _cmd); +} + bool wxNSTextFieldControl::SetHint(const wxString& hint) { wxCFStringRef hintstring(hint); @@ -918,11 +1006,12 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxWidgetCocoaImpl* c = NULL; - if ( style & wxTE_MULTILINE || style & wxTE_RICH || style & wxTE_RICH2 ) + if ( style & wxTE_MULTILINE ) { wxNSTextScrollView* v = nil; v = [[wxNSTextScrollView alloc] initWithFrame:r]; c = new wxNSTextViewControl( wxpeer, v ); + c->SetNeedsFocusRect( true ); } else { @@ -932,24 +1021,39 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, else v = [[wxNSTextField alloc] initWithFrame:r]; - if ( style & wxNO_BORDER ) + if ( style & wxTE_RIGHT) { - // FIXME: How can we remove the native control's border? - // setBordered is separate from the text ctrl's border. + [v setAlignment:NSRightTextAlignment]; } - + else if ( style & wxTE_CENTRE) + { + [v setAlignment:NSCenterTextAlignment]; + } + NSTextFieldCell* cell = [v cell]; [cell setScrollable:YES]; // TODO: Remove if we definitely are sure, it's not needed // as setting scrolling to yes, should turn off any wrapping // [cell setLineBreakMode:NSLineBreakByClipping]; - [v setBezeled:NO]; - [v setBordered:NO]; - c = new wxNSTextFieldControl( wxpeer, wxpeer, v ); + + if ( (style & wxNO_BORDER) || (style & wxSIMPLE_BORDER) ) + { + // under 10.7 the textcontrol can draw its own focus + // even if no border is shown, on previous systems + // we have to emulate this + [v setBezeled:NO]; + [v setBordered:NO]; + if ( UMAGetSystemVersion() < 0x1070 ) + c->SetNeedsFocusRect( true ); + } + else + { + // use native border + c->SetNeedsFrame(false); + } } - c->SetNeedsFocusRect( true ); return c; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/tglbtn.mm b/Externals/wxWidgets3/src/osx/cocoa/tglbtn.mm index c31590e8fe..3dd6dedd87 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/tglbtn.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/tglbtn.mm @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn.mm 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,12 +26,16 @@ // from button.mm -extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); +extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, + long style, + wxWindowID winid = wxID_ANY, + const wxString& label = wxString(), + const wxBitmap& bitmap = wxBitmap()); wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), - const wxString& WXUNUSED(label), + wxWindowID winid, + const wxString& label, const wxPoint& pos, const wxSize& size, long style, @@ -41,16 +44,16 @@ wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - SetBezelStyleFromBorderFlags(v, style); + SetBezelStyleFromBorderFlags(v, style, winid, label); [v setButtonType:NSOnOffButton]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); + wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v ); return c; } wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), + wxWindowID winid, const wxBitmap& label, const wxPoint& pos, const wxSize& size, @@ -60,13 +63,13 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; + SetBezelStyleFromBorderFlags(v, style, winid, wxString(), label); + if (label.IsOk()) [v setImage:label.GetNSImage() ]; - SetBezelStyleFromBorderFlags(v, style); - [v setButtonType:NSOnOffButton]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); + wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v ); return c; } diff --git a/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm b/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm index ba1b60bcac..ebca4f42e1 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: toolbar.mm 70851 2012-03-09 12:49:59Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -305,8 +304,11 @@ private: @interface wxNSToolbarDelegate : NSObject wxOSX_10_6_AND_LATER() { + bool m_isSelectable; } +- (void)setSelectable:(bool) value; + - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; @@ -363,6 +365,17 @@ private: @implementation wxNSToolbarDelegate +- (id)init +{ + m_isSelectable = false; + return [super init]; +} + +- (void)setSelectable:(bool) value +{ + m_isSelectable = true; +} + - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { wxUnusedVar(toolbar); @@ -377,8 +390,10 @@ private: - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { - wxUnusedVar(toolbar); - return nil; + if ( m_isSelectable ) + return [[toolbar items] valueForKey:@"itemIdentifier"]; + else + return nil; } - (NSToolbarItem*) toolbar:(NSToolbar*) toolbar itemForItemIdentifier:(NSString*) itemIdentifier willBeInsertedIntoToolbar:(BOOL) flag @@ -1228,9 +1243,6 @@ bool wxToolBar::Realize() SetInitialSize( wxSize(m_minWidth, m_minHeight)); SendSizeEventToParent(); - wxWindow * const parent = GetParent(); - if ( parent && !parent->IsBeingDeleted() ) - parent->MacOnInternalSize(); return true; } @@ -1428,7 +1440,9 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) wxNSToolBarButton* v = [[wxNSToolBarButton alloc] initWithFrame:toolrect]; - [v setBezelStyle:NSRegularSquareBezelStyle]; + [v setBezelStyle:NSSmallSquareBezelStyle]; + [[v cell] setControlSize:NSSmallControlSize]; + [v setFont:[NSFont fontWithName:[[v font] fontName] size:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; [v setBordered:NO]; [v setButtonType: ( tool->CanBeToggled() ? NSToggleButton : NSMomentaryPushInButton )]; [v setImplementation:tool]; @@ -1447,7 +1461,8 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) #endif // wxOSX_USE_NATIVE_TOOLBAR tool->SetControlHandle( controlHandle ); - tool->UpdateImages(); + if ( !(style & wxTB_NOICONS) ) + tool->UpdateImages(); tool->UpdateLabel(); if ( style & wxTB_NOICONS ) @@ -1589,45 +1604,41 @@ void wxToolBar::OnPaint(wxPaintEvent& event) int w, h; GetSize( &w, &h ); - bool drawMetalTheme = MacGetTopLevelWindow()->GetExtraStyle() & wxFRAME_EX_METAL; - - if ( UMAGetSystemVersion() < 0x1050 ) - { - if ( !drawMetalTheme ) - { - HIThemePlacardDrawInfo info; - memset( &info, 0, sizeof(info) ); - info.version = 0; - info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive; - - CGContextRef cgContext = (CGContextRef) MacGetCGContextRef(); - HIRect rect = CGRectMake( 0, 0, w, h ); - HIThemeDrawPlacard( &rect, &info, cgContext, kHIThemeOrientationNormal ); - } - else - { - // leave the background as it is (striped or metal) - } - } - else - { - wxPaintDC dc(this); - - wxRect rect(0,0,w,h); - - dc.GradientFillLinear( rect , wxColour( 0xCC,0xCC,0xCC ), wxColour( 0xA8,0xA8,0xA8 ) , wxSOUTH ); - dc.SetPen( wxPen( wxColour( 0x51,0x51,0x51 ) ) ); - if ( HasFlag(wxTB_LEFT) ) - dc.DrawLine(w-1, 0, w-1, h); - else if ( HasFlag(wxTB_RIGHT) ) - dc.DrawLine(0, 0, 0, h); - else if ( HasFlag(wxTB_BOTTOM) ) - dc.DrawLine(0, 0, w, 0); - else if ( HasFlag(wxTB_TOP) ) - dc.DrawLine(0, h-1, w, h-1); - } + wxPaintDC dc(this); + + wxRect rect(0,0,w,h); + + dc.GradientFillLinear( rect , wxColour( 0xCC,0xCC,0xCC ), wxColour( 0xA8,0xA8,0xA8 ) , wxSOUTH ); + dc.SetPen( wxPen( wxColour( 0x51,0x51,0x51 ) ) ); + if ( HasFlag(wxTB_LEFT) ) + dc.DrawLine(w-1, 0, w-1, h); + else if ( HasFlag(wxTB_RIGHT) ) + dc.DrawLine(0, 0, 0, h); + else if ( HasFlag(wxTB_BOTTOM) ) + dc.DrawLine(0, 0, w, 0); + else if ( HasFlag(wxTB_TOP) ) + dc.DrawLine(0, h-1, w, h-1); } event.Skip(); } +#if wxOSX_USE_NATIVE_TOOLBAR +void wxToolBar::OSXSetSelectableTools(bool set) +{ + wxCHECK_RET( m_macToolbar, "toolbar must be non-NULL" ); + [(wxNSToolbarDelegate*)[(NSToolbar*)m_macToolbar delegate] setSelectable:set]; +} + +void wxToolBar::OSXSelectTool(int toolId) +{ + wxToolBarToolBase *tool = FindById(toolId); + wxCHECK_RET( tool, "invalid tool ID" ); + wxCHECK_RET( m_macToolbar, "toolbar must be non-NULL" ); + + wxString identifier = wxString::Format(wxT("%ld"), (long)tool); + wxCFStringRef cfidentifier(identifier, wxFont::GetDefaultEncoding()); + [(NSToolbar*)m_macToolbar setSelectedItemIdentifier:cfidentifier.AsNSString()]; +} +#endif // wxOSX_USE_NATIVE_TOOLBAR + #endif // wxUSE_TOOLBAR diff --git a/Externals/wxWidgets3/src/osx/cocoa/tooltip.mm b/Externals/wxWidgets3/src/osx/cocoa/tooltip.mm index 5a33db72bd..d36bbeba52 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/tooltip.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/tooltip.mm @@ -2,7 +2,6 @@ // Name: src/osx/cocoa/tooltip.mm // Purpose: wxToolTip implementation // Author: Stefan Csomor -// Id: $Id: tooltip.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/cocoa/utils.mm b/Externals/wxWidgets3/src/osx/cocoa/utils.mm index 5b23abb85d..3e07d7dc2c 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/utils.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/utils.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utils.mm 68958 2011-08-30 09:02:11Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,7 +36,7 @@ #if wxOSX_USE_COCOA -#if wxUSE_BASE +#if wxUSE_GUI // Emit a beeeeeep void wxBell() @@ -45,13 +44,10 @@ void wxBell() NSBeep(); } -#endif // wxUSE_BASE - -#if wxUSE_GUI - @implementation wxNSAppController -- (void)applicationWillFinishLaunching:(NSNotification *)application { +- (void)applicationWillFinishLaunching:(NSNotification *)application +{ wxUnusedVar(application); // we must install our handlers later than setting the app delegate, because otherwise our handlers @@ -65,6 +61,12 @@ void wxBell() [appleEventManager setEventHandler:self andSelector:@selector(handleOpenAppEvent:withReplyEvent:) forEventClass:kCoreEventClass andEventID:kAEOpenApplication]; + wxTheApp->OSXOnWillFinishLaunching(); +} + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + wxTheApp->OSXOnDidFinishLaunching(); } - (void)application:(NSApplication *)sender openFiles:(NSArray *)fileNames @@ -75,7 +77,7 @@ void wxBell() const size_t count = [fileNames count]; for (i = 0; i < count; i++) { - fileList.Add( wxCFStringRef::AsString([fileNames objectAtIndex:i]) ); + fileList.Add( wxCFStringRef::AsStringWithNormalizationFormC([fileNames objectAtIndex:i]) ); } wxTheApp->MacOpenFiles(fileList); @@ -123,9 +125,7 @@ void wxBell() - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { wxUnusedVar(sender); - wxCloseEvent event; - wxTheApp->OnQueryEndSession(event); - if ( event.GetVeto() ) + if ( !wxTheApp->OSXOnShouldTerminate() ) return NSTerminateCancel; return NSTerminateNow; @@ -133,9 +133,7 @@ void wxBell() - (void)applicationWillTerminate:(NSNotification *)application { wxUnusedVar(application); - wxCloseEvent event; - event.SetCanVeto(false); - wxTheApp->OnEndSession(event); + wxTheApp->OSXOnWillTerminate(); } - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender @@ -241,15 +239,66 @@ void wxBell() } @end +// here we subclass NSApplication, for the purpose of being able to override sendEvent. +@interface wxNSApplication : NSApplication +{ + BOOL firstPass; +} + +- (id)init; + +- (void)sendEvent:(NSEvent *)anEvent; + +@end + +@implementation wxNSApplication + +- (id)init +{ + self = [super init]; + firstPass = YES; + return self; +} + +/* This is needed because otherwise we don't receive any key-up events for command-key + combinations (an AppKit bug, apparently) */ +- (void)sendEvent:(NSEvent *)anEvent +{ + if ([anEvent type] == NSKeyUp && ([anEvent modifierFlags] & NSCommandKeyMask)) + [[self keyWindow] sendEvent:anEvent]; + else + [super sendEvent:anEvent]; + + if ( firstPass ) + { + [NSApp stop:nil]; + firstPass = NO; + return; + } +} + +@end + +WX_NSObject appcontroller = nil; + +NSLayoutManager* gNSLayoutManager = nil; + +WX_NSObject wxApp::OSXCreateAppController() +{ + return [[wxNSAppController alloc] init]; +} + bool wxApp::DoInitGui() { wxMacAutoreleasePool pool; - [NSApplication sharedApplication]; if (!sm_isEmbedded) { - wxNSAppController* controller = [[wxNSAppController alloc] init]; - [NSApp setDelegate:controller]; + [wxNSApplication sharedApplication]; + + appcontroller = OSXCreateAppController(); + [NSApp setDelegate:appcontroller]; + [NSColor setIgnoresAlpha:NO]; // calling finishLaunching so early before running the loop seems to trigger some 'MenuManager compatibility' which leads // to the duplication of menus under 10.5 and a warning under 10.6 @@ -257,11 +306,32 @@ bool wxApp::DoInitGui() [NSApp finishLaunching]; #endif } + gNSLayoutManager = [[NSLayoutManager alloc] init]; + return true; } +bool wxApp::CallOnInit() +{ + wxMacAutoreleasePool autoreleasepool; + m_onInitResult = false; + [NSApp run]; + return m_onInitResult; +} + void wxApp::DoCleanUp() { + if ( appcontroller != nil ) + { + [NSApp setDelegate:nil]; + [appcontroller release]; + appcontroller = nil; + } + if ( gNSLayoutManager != nil ) + { + [gNSLayoutManager release]; + gNSLayoutManager = nil; + } } void wxClientDisplayRect(int *x, int *y, int *width, int *height) diff --git a/Externals/wxWidgets3/src/osx/cocoa/window.mm b/Externals/wxWidgets3/src/osx/cocoa/window.mm index dd8fb68e53..78cd6f99aa 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/window.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/window.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-06-20 -// RCS-ID: $Id: window.mm 70863 2012-03-10 13:13:51Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,6 +16,7 @@ #include "wx/log.h" #include "wx/textctrl.h" #include "wx/combobox.h" + #include "wx/radiobut.h" #endif #ifdef __WXMAC__ @@ -41,7 +41,7 @@ // Get the window with the focus -NSView* GetViewFromResponder( NSResponder* responder ) +NSView* wxOSXGetViewFromResponder( NSResponder* responder ) { NSView* view = nil; if ( [responder isKindOfClass:[NSTextView class]] ) @@ -64,16 +64,29 @@ NSView* GetFocusedViewInWindow( NSWindow* keyWindow ) { NSView* focusedView = nil; if ( keyWindow != nil ) - focusedView = GetViewFromResponder([keyWindow firstResponder]); + focusedView = wxOSXGetViewFromResponder([keyWindow firstResponder]); return focusedView; } WXWidget wxWidgetImpl::FindFocus() { - return GetFocusedViewInWindow( [NSApp keyWindow] ); + return GetFocusedViewInWindow( [NSApp keyWindow] );; } +wxWidgetImpl* wxWidgetImpl::FindBestFromWXWidget(WXWidget control) +{ + wxWidgetImpl* impl = FindFromWXWidget(control); + + // NSScrollViews can have their subviews like NSClipView + // therefore check and use the NSScrollView peer in that case + if ( impl == NULL && [[control superview] isKindOfClass:[NSScrollView class]]) + impl = FindFromWXWidget([control superview]); + + return impl; +} + + NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin ) { int x, y, w, h ; @@ -96,6 +109,22 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const @end // wxNSView +@interface wxNSView(TextInput) + +- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange; +- (void)doCommandBySelector:(SEL)aSelector; +- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange; +- (void)unmarkText; +- (NSRange)selectedRange; +- (NSRange)markedRange; +- (BOOL)hasMarkedText; +- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange; +- (NSArray*)validAttributesForMarkedText; +- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange; +- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint; + +@end + @interface NSView(PossibleMethods) - (void)setTitle:(NSString *)aString; - (void)setStringValue:(NSString *)aString; @@ -293,59 +322,70 @@ long wxOSXTranslateCocoaKey( NSEvent* event, int eventType ) case 48: retval = WXK_TAB; break; - - case 75: // / - retval = WXK_NUMPAD_DIVIDE; - break; - case 67: // * - retval = WXK_NUMPAD_MULTIPLY; - break; - case 78: // - - retval = WXK_NUMPAD_SUBTRACT; - break; - case 69: // + - retval = WXK_NUMPAD_ADD; - break; - case 76: // Enter - retval = WXK_NUMPAD_ENTER; - break; - case 65: // . - retval = WXK_NUMPAD_DECIMAL; - break; - case 82: // 0 - retval = WXK_NUMPAD0; - break; - case 83: // 1 - retval = WXK_NUMPAD1; - break; - case 84: // 2 - retval = WXK_NUMPAD2; - break; - case 85: // 3 - retval = WXK_NUMPAD3; - break; - case 86: // 4 - retval = WXK_NUMPAD4; - break; - case 87: // 5 - retval = WXK_NUMPAD5; - break; - case 88: // 6 - retval = WXK_NUMPAD6; - break; - case 89: // 7 - retval = WXK_NUMPAD7; - break; - case 91: // 8 - retval = WXK_NUMPAD8; - break; - case 92: // 9 - retval = WXK_NUMPAD9; - break; default: - //retval = [event keyCode]; break; } + + // Check for NUMPAD keys. For KEY_UP/DOWN events we need to use the + // WXK_NUMPAD constants, but for the CHAR event we want to use the + // standard ascii values + if ( eventType != wxEVT_CHAR ) + { + switch( [event keyCode] ) + { + case 75: // / + retval = WXK_NUMPAD_DIVIDE; + break; + case 67: // * + retval = WXK_NUMPAD_MULTIPLY; + break; + case 78: // - + retval = WXK_NUMPAD_SUBTRACT; + break; + case 69: // + + retval = WXK_NUMPAD_ADD; + break; + case 76: // Enter + retval = WXK_NUMPAD_ENTER; + break; + case 65: // . + retval = WXK_NUMPAD_DECIMAL; + break; + case 82: // 0 + retval = WXK_NUMPAD0; + break; + case 83: // 1 + retval = WXK_NUMPAD1; + break; + case 84: // 2 + retval = WXK_NUMPAD2; + break; + case 85: // 3 + retval = WXK_NUMPAD3; + break; + case 86: // 4 + retval = WXK_NUMPAD4; + break; + case 87: // 5 + retval = WXK_NUMPAD5; + break; + case 88: // 6 + retval = WXK_NUMPAD6; + break; + case 89: // 7 + retval = WXK_NUMPAD7; + break; + case 91: // 8 + retval = WXK_NUMPAD8; + break; + case 92: // 9 + retval = WXK_NUMPAD9; + break; + default: + //retval = [event keyCode]; + break; + } + } return retval; } @@ -455,13 +495,15 @@ bool g_lastButtonWasFakeRight = false ; @interface NSEvent (DeviceDelta) - (CGFloat)deviceDeltaX; - (CGFloat)deviceDeltaY; + +// 10.7+ +- (BOOL)hasPreciseScrollingDeltas; +- (CGFloat)scrollingDeltaX; +- (CGFloat)scrollingDeltaY; @end -void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) +void wxWidgetCocoaImpl::SetupCoordinates(wxCoord &x, wxCoord &y, NSEvent* nsEvent) { - int eventType = [nsEvent type]; - UInt32 modifiers = [nsEvent modifierFlags] ; - NSPoint locationInWindow = [nsEvent locationInWindow]; // adjust coordinates for the window of the target view @@ -469,20 +511,30 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve { if ( [nsEvent window] != nil ) locationInWindow = [[nsEvent window] convertBaseToScreen:locationInWindow]; - + if ( [m_osxView window] != nil ) locationInWindow = [[m_osxView window] convertScreenToBase:locationInWindow]; } - + NSPoint locationInView = [m_osxView convertPoint:locationInWindow fromView:nil]; wxPoint locationInViewWX = wxFromNSPoint( m_osxView, locationInView ); + + x = locationInViewWX.x; + y = locationInViewWX.y; + +} + +void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) +{ + int eventType = [nsEvent type]; + UInt32 modifiers = [nsEvent modifierFlags] ; + + SetupCoordinates(wxevent.m_x, wxevent.m_y, nsEvent); // these parameters are not given for all events UInt32 button = [nsEvent buttonNumber]; UInt32 clickCount = 0; - wxevent.m_x = locationInViewWX.x; - wxevent.m_y = locationInViewWX.y; wxevent.m_shiftDown = modifiers & NSShiftKeyMask; wxevent.m_rawControlDown = modifiers & NSControlKeyMask; wxevent.m_altDown = modifiers & NSAlternateKeyMask; @@ -609,32 +661,52 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ; - // see http://developer.apple.com/qa/qa2005/qa1453.html - // for more details on why we have to look for the exact type - - const EventRef cEvent = (EventRef) [nsEvent eventRef]; - bool isMouseScrollEvent = false; - if ( cEvent ) - isMouseScrollEvent = ::GetEventKind(cEvent) == kEventMouseScroll; - - if ( isMouseScrollEvent ) + if ( UMAGetSystemVersion() >= 0x1070 ) { - deltaX = [nsEvent deviceDeltaX]; - deltaY = [nsEvent deviceDeltaY]; + if ( [nsEvent hasPreciseScrollingDeltas] ) + { + deltaX = [nsEvent scrollingDeltaX]; + deltaY = [nsEvent scrollingDeltaY]; + } + else + { + deltaX = [nsEvent scrollingDeltaX] * 10; + deltaY = [nsEvent scrollingDeltaY] * 10; + } } else { - deltaX = ([nsEvent deltaX] * 10); - deltaY = ([nsEvent deltaY] * 10); + const EventRef cEvent = (EventRef) [nsEvent eventRef]; + // see http://developer.apple.com/qa/qa2005/qa1453.html + // for more details on why we have to look for the exact type + + bool isMouseScrollEvent = false; + if ( cEvent ) + isMouseScrollEvent = ::GetEventKind(cEvent) == kEventMouseScroll; + + if ( isMouseScrollEvent ) + { + deltaX = [nsEvent deviceDeltaX]; + deltaY = [nsEvent deviceDeltaY]; + } + else + { + deltaX = ([nsEvent deltaX] * 10); + deltaY = ([nsEvent deltaY] * 10); + } } wxevent.m_wheelDelta = 10; wxevent.m_linesPerAction = 1; + wxevent.m_columnsPerAction = 1; if ( fabs(deltaX) > fabs(deltaY) ) { - wxevent.m_wheelAxis = 1; - wxevent.m_wheelRotation = (int)deltaX; + // wx conventions for horizontal are inverted from vertical (originating from native msw behavior) + // right and up are positive values, left and down are negative values, while on OSX right and down + // are negative and left and up are positive. + wxevent.m_wheelAxis = wxMOUSE_WHEEL_HORIZONTAL; + wxevent.m_wheelRotation = -(int)deltaX; } else { @@ -762,8 +834,89 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve } [super removeTrackingRect:tag]; } + +#if wxOSX_USE_NATIVE_FLIPPED +- (BOOL)isFlipped +{ + return YES; +} +#endif + +- (BOOL) canBecomeKeyView +{ + wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if ( viewimpl && viewimpl->IsUserPane() && viewimpl->GetWXPeer() ) + return viewimpl->GetWXPeer()->AcceptsFocus(); + return NO; +} + @end // wxNSView +// We need to adopt NSTextInputClient protocol in order to interpretKeyEvents: to work. +// Currently, only insertText:(replacementRange:) is +// implemented here, and the rest of the methods are stubs. +// It is hoped that someday IME-related functionality is implemented in +// wxWidgets and the methods of this protocol are fully working. + +@implementation wxNSView(TextInput) + +void wxOSX_insertText(NSView* self, SEL _cmd, NSString* text); + +- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange +{ + wxOSX_insertText(self, @selector(insertText:), aString); +} + +- (void)doCommandBySelector:(SEL)aSelector +{ + // these are already caught in the keyEvent handler +} + +- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange +{ +} + +- (void)unmarkText +{ +} + +- (NSRange)selectedRange +{ + return NSMakeRange(NSNotFound, 0); +} + +- (NSRange)markedRange +{ + return NSMakeRange(NSNotFound, 0); +} + +- (BOOL)hasMarkedText +{ + return NO; +} + +- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange +{ + return nil; +} + +- (NSArray*)validAttributesForMarkedText +{ + return nil; +} + +- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange +{ + return NSMakeRect(0, 0, 0, 0); +} +- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint +{ + return NSNotFound; +} + +@end // wxNSView(TextInput) + + // // event handlers // @@ -890,6 +1043,8 @@ BOOL wxOSX_resignFirstResponder(NSView* self, SEL _cmd) return impl->resignFirstResponder(self, _cmd); } +#if !wxOSX_USE_NATIVE_FLIPPED + BOOL wxOSX_isFlipped(NSView* self, SEL _cmd) { wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); @@ -899,6 +1054,8 @@ BOOL wxOSX_isFlipped(NSView* self, SEL _cmd) return impl->isFlipped(self, _cmd) ? YES:NO; } +#endif + typedef void (*wxOSX_DrawRectHandlerPtr)(NSView* self, SEL _cmd, NSRect rect); void wxOSX_drawRect(NSView* self, SEL _cmd, NSRect rect) @@ -1112,24 +1269,29 @@ bool wxWidgetCocoaImpl::performDragOperation(void* s, WXWidget WXUNUSED(slf), vo return result != wxDragNone; } -typedef void (*wxOSX_TextEventHandlerPtr)(NSView* self, SEL _cmd, NSString *event); -typedef void (*wxOSX_EventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); -typedef BOOL (*wxOSX_PerformKeyEventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); -typedef BOOL (*wxOSX_FocusHandlerPtr)(NSView* self, SEL _cmd); - void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { + // we are getting moved events for all windows in the hierarchy, not something wx expects + // therefore we only handle it for the deepest child in the hierarchy + if ( [event type] == NSMouseMoved ) + { + NSView* hitview = [[[slf window] contentView] hitTest:[event locationInWindow]]; + if ( hitview == NULL || hitview != slf) + return; + } + if ( !DoHandleMouseEvent(event) ) { // for plain NSView mouse events would propagate to parents otherwise - if (!IsUserPane()) + // scrollwheel events have to be propagated if not handled in all cases + if (!IsUserPane() || [event type] == NSScrollWheel ) { wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; superimpl(slf, (SEL)_cmd, event); // super of built-ins keeps the mouse up, as wx expects this event, we have to synthesize it - - if ( [ event type] == NSLeftMouseDown ) + // only trigger if at this moment the mouse is already up + if ( [ event type] == NSLeftMouseDown && !wxGetMouseState().LeftIsDown() ) { wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; @@ -1143,20 +1305,45 @@ void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) void wxWidgetCocoaImpl::cursorUpdate(WX_NSEvent event, WXWidget slf, void *_cmd) { - NSCursor *cursor = (NSCursor*)GetWXPeer()->GetCursor().GetHCURSOR(); - if (cursor == NULL) + if ( !SetupCursor(event) ) { wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; - superimpl(slf, (SEL)_cmd, event); + superimpl(slf, (SEL)_cmd, event); } - else + } + +bool wxWidgetCocoaImpl::SetupCursor(WX_NSEvent event) +{ + extern wxCursor gGlobalCursor; + + if ( gGlobalCursor.IsOk() ) { - [cursor set]; + gGlobalCursor.MacInstall(); + return true; + } + else + { + wxWindow* cursorTarget = GetWXPeer(); + wxCoord x,y; + SetupCoordinates(x, y, event); + wxPoint cursorPoint( x , y ) ; + + while ( cursorTarget && !cursorTarget->MacSetupCursor( cursorPoint ) ) + { + // at least in GTK cursor events are not propagated either ... +#if 1 + cursorTarget = NULL; +#else + cursorTarget = cursorTarget->GetParent() ; + if ( cursorTarget ) + cursorPoint += cursorTarget->GetPosition(); +#endif + } + + return cursorTarget != NULL; } } - - void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { if ( [event type] == NSKeyDown ) @@ -1202,14 +1389,14 @@ bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, voi { wxEvtHandler * const handler = m_wxPeer->GetEventHandler(); - wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); + wxCommandEvent command_event( wxEVT_MENU, command ); command_event.SetEventObject( wxevent.GetEventObject() ); handled = handler->ProcessEvent( command_event ); if ( !handled ) { // accelerators can also be used with buttons, try them too - command_event.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED); + command_event.SetEventType(wxEVT_BUTTON); handled = handler->ProcessEvent( command_event ); } } @@ -1253,20 +1440,17 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) { wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; BOOL r = superimpl(slf, (SEL)_cmd); - // get the current focus after running resignFirstResponder - // note that this value isn't reliable, it might return the same view that - // is resigning - NSView* otherView = FindFocus(); - wxWidgetImpl* otherWindow = FindFromWXWidget(otherView); + + NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder(); + NSView* otherView = wxOSXGetViewFromResponder(responder); - // It doesn't make sense to notify about the loss of focus if we're not - // really losing it and the window which has just gained focus is the same - // one as this window itself. Of course, this should never happen in the - // first place but somehow it does in wxGrid code and without this check we - // enter into an infinite recursion, see #12267. + wxWidgetImpl* otherWindow = FindBestFromWXWidget(otherView); + + // It doesn't make sense to notify about the loss of focus if it's the same + // control in the end, and just a different subview if ( otherWindow == this ) return r; - + // NSTextViews have an editor as true responder, therefore the might get the // resign notification if their editor takes over, don't trigger any event then if ( r && !m_hasEditor) @@ -1276,11 +1460,14 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) return r; } -bool wxWidgetCocoaImpl::isFlipped(WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd)) +#if !wxOSX_USE_NATIVE_FLIPPED + +bool wxWidgetCocoaImpl::isFlipped(WXWidget slf, void *WXUNUSED(_cmd)) { return m_isFlipped; } +#endif #define OSX_DEBUG_DRAWING 0 @@ -1289,15 +1476,20 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) // preparing the update region wxRegion updateRgn; + + // since adding many rects to a region is a costly process, by default use the bounding rect +#if 0 const NSRect *rects; NSInteger count; - [slf getRectsBeingDrawn:&rects count:&count]; for ( int i = 0 ; i < count ; ++i ) { updateRgn.Union(wxFromNSRect(slf, rects[i])); } - +#else + updateRgn.Union(wxFromNSRect(slf,*(NSRect*)rect)); +#endif + wxWindow* wxpeer = GetWXPeer(); if ( wxpeer->MacGetLeftBorderSize() != 0 || wxpeer->MacGetTopBorderSize() != 0 ) @@ -1352,7 +1544,7 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) CGContextStrokePath(context); #endif - if ( !m_isFlipped ) + if ( ![slf isFlipped] ) { CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height ); CGContextScaleCTM( context, 1, -1 ); @@ -1374,7 +1566,7 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) CGContextSaveGState( context ); } // as we called restore above, we have to flip again if necessary - if ( !m_isFlipped ) + if ( ![slf isFlipped] ) { CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height ); CGContextScaleCTM( context, 1, -1 ); @@ -1417,7 +1609,10 @@ void wxWidgetCocoaImpl::controlAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_c { wxWindow* wxpeer = (wxWindow*) GetWXPeer(); if ( wxpeer ) + { + wxpeer->OSXSimulateFocusEvents(); wxpeer->OSXHandleClicked(0); + } } void wxWidgetCocoaImpl::controlDoubleAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender)) @@ -1499,7 +1694,9 @@ void wxOSXCocoaClassAddWXMethods(Class c) wxOSX_CLASS_ADD_METHOD(c, @selector(becomeFirstResponder), (IMP) wxOSX_becomeFirstResponder, "c@:" ) wxOSX_CLASS_ADD_METHOD(c, @selector(resignFirstResponder), (IMP) wxOSX_resignFirstResponder, "c@:" ) +#if !wxOSX_USE_NATIVE_FLIPPED wxOSX_CLASS_ADD_METHOD(c, @selector(isFlipped), (IMP) wxOSX_isFlipped, "c@:" ) +#endif wxOSX_CLASS_ADD_METHOD(c, @selector(drawRect:), (IMP) wxOSX_drawRect, "v@:{_NSRect={_NSPoint=ff}{_NSSize=ff}}" ) wxOSX_CLASS_ADD_METHOD(c, @selector(controlAction:), (IMP) wxOSX_controlAction, "v@:@" ) @@ -1557,7 +1754,9 @@ wxWidgetCocoaImpl::wxWidgetCocoaImpl() void wxWidgetCocoaImpl::Init() { m_osxView = NULL; +#if !wxOSX_USE_NATIVE_FLIPPED m_isFlipped = true; +#endif m_lastKeyDownEvent = NULL; m_hasEditor = false; } @@ -1587,6 +1786,17 @@ void wxWidgetCocoaImpl::SetVisibility( bool visible ) [m_osxView setHidden:(visible ? NO:YES)]; } +double wxWidgetCocoaImpl::GetContentScaleFactor() const +{ +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + NSWindow* tlw = [m_osxView window]; + if ( [ tlw respondsToSelector:@selector(backingScaleFactor) ] ) + return [tlw backingScaleFactor]; + else +#endif + return 1.0; +} + // ---------------------------------------------------------------------------- // window animation stuff // ---------------------------------------------------------------------------- @@ -1632,7 +1842,6 @@ void wxWidgetCocoaImpl::SetVisibility( bool visible ) wxUnusedVar(progress); m_win->SendSizeEvent(); - m_win->MacOnInternalSize(); } - (void)animationDidEnd:(NSAnimation*)animation @@ -1809,7 +2018,6 @@ wxWidgetCocoaImpl::ShowViewOrWindowWithEffect(wxWindow *win, // refresh it once again after the end to ensure that everything is in // place win->SendSizeEvent(); - win->MacOnInternalSize(); } [anim setDelegate:nil]; @@ -2072,6 +2280,27 @@ bool wxWidgetCocoaImpl::SetFocus() return true; } +void wxWidgetCocoaImpl::SetDropTarget(wxDropTarget* target) +{ + [m_osxView unregisterDraggedTypes]; + + if ( target == NULL ) + return; + + wxDataObject* dobj = target->GetDataObject(); + + if( dobj ) + { + CFMutableArrayRef typesarray = CFArrayCreateMutable(kCFAllocatorDefault,0,&kCFTypeArrayCallBacks); + dobj->AddSupportedTypes(typesarray); + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + [targetView registerForDraggedTypes:(NSArray*)typesarray]; + CFRelease(typesarray); + } +} void wxWidgetCocoaImpl::RemoveFromParent() { @@ -2083,6 +2312,9 @@ void wxWidgetCocoaImpl::Embed( wxWidgetImpl *parent ) NSView* container = parent->GetWXWidget() ; wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; [container addSubview:m_osxView]; + + if( m_wxPeer->IsFrozen() ) + [[m_osxView window] disableFlushWindow]; } void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &col ) @@ -2330,14 +2562,33 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant ) if ([cell respondsToSelector:@selector(setControlSize:)]) [cell setControlSize:size]; } + + // we need to propagate this to inner views as well + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + { + NSView* targetView = [(NSScrollView*) m_osxView documentView]; + + if ( [targetView respondsToSelector:@selector(setControlSize:)] ) + [targetView setControlSize:size]; + else if ([targetView respondsToSelector:@selector(cell)]) + { + id cell = [(id)targetView cell]; + if ([cell respondsToSelector:@selector(setControlSize:)]) + [cell setControlSize:size]; + } + } } void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool) { - if ([m_osxView respondsToSelector:@selector(setFont:)]) - [m_osxView setFont: font.OSXGetNSFont()]; - if ([m_osxView respondsToSelector:@selector(setTextColor:)]) - [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + if ([targetView respondsToSelector:@selector(setFont:)]) + [targetView setFont: font.OSXGetNSFont()]; + if ([targetView respondsToSelector:@selector(setTextColor:)]) + [targetView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) green:(CGFloat) (col.Green() / 255.0) blue:(CGFloat) (col.Blue() / 255.0) alpha:(CGFloat) (col.Alpha() / 255.0)]]; @@ -2363,7 +2614,13 @@ void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control ) if ([c respondsToSelector:@selector(setAction:)]) { [c setTarget: c]; - [c setAction: @selector(controlAction:)]; + if ( dynamic_cast(GetWXPeer()) ) + { + // everything already set up + } + else + [c setAction: @selector(controlAction:)]; + if ([c respondsToSelector:@selector(setDoubleAction:)]) { [c setDoubleAction: @selector(controlDoubleAction:)]; @@ -2371,17 +2628,25 @@ void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control ) } NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingCursorUpdate|NSTrackingMouseMoved|NSTrackingActiveAlways|NSTrackingInVisibleRect; - NSTrackingArea* area = [[NSTrackingArea alloc] initWithRect: NSZeroRect options: options owner: m_osxView userInfo: nil]; + NSTrackingArea* area = [[NSTrackingArea alloc] initWithRect: NSZeroRect options: options owner: m_osxView userInfo: nil]; [m_osxView addTrackingArea: area]; [area release]; } bool wxWidgetCocoaImpl::DoHandleCharEvent(NSEvent *event, NSString *text) { - wxKeyEvent wxevent(wxEVT_CHAR); - SetupKeyEvent( wxevent, event, text ); + bool result = false; + + for (NSUInteger i = 0; i < [text length]; ++i) + { + wxKeyEvent wxevent(wxEVT_CHAR); + unichar c = [text characterAtIndex:i]; + SetupKeyEvent( wxevent, event, [NSString stringWithCharacters:&c length:1]); - return GetWXPeer()->OSXHandleKeyEvent(wxevent); + result = GetWXPeer()->OSXHandleKeyEvent(wxevent) || result; + } + + return result; } bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) @@ -2407,7 +2672,7 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) if ( !result ) { - if ( IsUserPane() && [event type] == NSKeyDown) + if ( [event type] == NSKeyDown) { long keycode = wxOSXTranslateCocoaKey( event, wxEVT_CHAR ); @@ -2416,12 +2681,20 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars wxKeyEvent wxevent2(wxevent) ; wxevent2.SetEventType(wxEVT_CHAR); + SetupKeyEvent( wxevent2, event ); wxevent2.m_keyCode = keycode; result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); } + else if (wxevent.CmdDown()) + { + wxKeyEvent wxevent2(wxevent) ; + wxevent2.SetEventType(wxEVT_CHAR); + SetupKeyEvent( wxevent2, event ); + result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); + } else { - if ( !wxevent.CmdDown() ) + if ( IsUserPane() && !wxevent.CmdDown() ) { if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; @@ -2440,7 +2713,11 @@ bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event) { wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; - return GetWXPeer()->HandleWindowEvent(wxevent); + bool result = GetWXPeer()->HandleWindowEvent(wxevent); + + (void)SetupCursor(event); + + return result; } void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* otherWindow) @@ -2468,7 +2745,7 @@ void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* oth event.SetWindow(otherWindow->GetWXPeer()); thisWindow->HandleWindowEvent(event) ; } - else // !receivedFocuss + else // !receivedFocus { #if wxUSE_CARET if ( thisWindow->GetCaret() ) @@ -2502,19 +2779,37 @@ void wxWidgetCocoaImpl::SetCursor(const wxCursor& cursor) void wxWidgetCocoaImpl::CaptureMouse() { - [[m_osxView window] disableCursorRects]; + // TODO remove if we don't get into problems with cursor settings + // [[m_osxView window] disableCursorRects]; } void wxWidgetCocoaImpl::ReleaseMouse() { - [[m_osxView window] enableCursorRects]; + // TODO remove if we don't get into problems with cursor settings + // [[m_osxView window] enableCursorRects]; } +#if !wxOSX_USE_NATIVE_FLIPPED + void wxWidgetCocoaImpl::SetFlipped(bool flipped) { m_isFlipped = flipped; } +#endif + +void wxWidgetCocoaImpl::SetDrawingEnabled(bool enabled) +{ + if ( enabled ) + { + [[m_osxView window] enableFlushWindow]; + [m_osxView setNeedsDisplay:YES]; + } + else + { + [[m_osxView window] disableFlushWindow]; + } +} // // Factory methods // @@ -2526,10 +2821,6 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSView* v = [[wxNSView alloc] initWithFrame:r]; - // temporary hook for dnd - [v registerForDraggedTypes:[NSArray arrayWithObjects: - NSStringPboardType, NSFilenamesPboardType, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v, false, true ); return c; } @@ -2543,11 +2834,13 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) { NSView* cv = [tlw contentView]; c = new wxWidgetCocoaImpl( now, cv, true ); - // increase ref count, because the impl destructor will decrement it again - CFRetain(cv); - if ( !now->IsShown() ) - [cv setHidden:NO]; - + if ( cv != nil ) + { + // increase ref count, because the impl destructor will decrement it again + CFRetain(cv); + if ( !now->IsShown() ) + [cv setHidden:NO]; + } } else { diff --git a/Externals/wxWidgets3/src/osx/combobox_osx.cpp b/Externals/wxWidgets3/src/osx/combobox_osx.cpp index abcae432bb..faf325a867 100644 --- a/Externals/wxWidgets3/src/osx/combobox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/combobox_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: combobox_osx.cpp 69948 2011-12-07 23:41:06Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -131,11 +130,13 @@ unsigned int wxComboBox::GetCount() const void wxComboBox::DoDeleteOneItem(unsigned int n) { + m_datas.RemoveAt(n); GetComboPeer()->RemoveItem(n); } void wxComboBox::DoClear() { + m_datas.Clear(); GetComboPeer()->Clear(); } @@ -187,10 +188,21 @@ wxString wxComboBox::GetStringSelection() const return sel == wxNOT_FOUND ? wxString() : GetString(sel); } +void wxComboBox::SetValue(const wxString& value) +{ + if ( HasFlag(wxCB_READONLY) ) + SetStringSelection( value ) ; + else + wxTextEntry::SetValue( value ); +} + void wxComboBox::SetString(unsigned int n, const wxString& s) { - Delete(n); - Insert(s, n); + // Notice that we shouldn't delete and insert the item in this control + // itself as this would also affect the client data which we need to + // preserve here. + GetComboPeer()->RemoveItem(n); + GetComboPeer()->InsertItem(n, s); SetValue(s); // changing the item in the list won't update the display item } @@ -202,7 +214,7 @@ void wxComboBox::EnableTextChangedEvents(bool WXUNUSED(enable)) bool wxComboBox::OSXHandleClicked( double WXUNUSED(timestampsec) ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId ); + wxCommandEvent event(wxEVT_COMBOBOX, m_windowId ); event.SetInt(GetSelection()); event.SetEventObject(this); event.SetString(GetStringSelection()); diff --git a/Externals/wxWidgets3/src/osx/core/bitmap.cpp b/Externals/wxWidgets3/src/osx/core/bitmap.cpp index 3b7eaeadd8..2edc5ed7ee 100644 --- a/Externals/wxWidgets3/src/osx/core/bitmap.cpp +++ b/Externals/wxWidgets3/src/osx/core/bitmap.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: bitmap.cpp 70737 2012-02-28 16:30:58Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -25,6 +24,8 @@ #include "wx/rawbmp.h" +#include "wx/filename.h" + IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) @@ -56,8 +57,10 @@ class WXDLLEXPORT wxBitmapRefData: public wxGDIRefData friend class WXDLLIMPEXP_FWD_CORE wxIcon; friend class WXDLLIMPEXP_FWD_CORE wxCursor; public: + wxBitmapRefData(int width , int height , int depth, double logicalscale); wxBitmapRefData(int width , int height , int depth); - wxBitmapRefData(CGImageRef image); + wxBitmapRefData(CGContextRef context); + wxBitmapRefData(CGImageRef image, double scale); wxBitmapRefData(); wxBitmapRefData(const wxBitmapRefData &tocopy); @@ -75,7 +78,7 @@ public: int GetWidth() const { return m_width; } int GetHeight() const { return m_height; } int GetDepth() const { return m_depth; } - + double GetScaleFactor() const { return m_scaleFactor; } void *GetRawAccess() const; void *BeginRawAccess(); void EndRawAccess(); @@ -98,13 +101,10 @@ public: // rescaled to 16 x 16 bool HasNativeSize(); +#ifndef __WXOSX_IPHONE__ // caller should increase ref count if needed longer // than the bitmap exists IconRef GetIconRef(); - -#ifndef __WXOSX_IPHONE__ - // returns a Pict from the bitmap content - PicHandle GetPictHandle(); #endif CGContextRef GetBitmapContext() const; @@ -112,7 +112,9 @@ public: int GetBytesPerRow() const { return m_bytesPerRow; } private : bool Create(int width , int height , int depth); - bool Create( CGImageRef image ); + bool Create(int width , int height , int depth, double logicalScale); + bool Create( CGImageRef image, double scale ); + bool Create( CGContextRef bitmapcontext); void Init(); int m_width; @@ -125,11 +127,12 @@ public: bool m_ok; mutable CGImageRef m_cgImageRef; - IconRef m_iconRef; #ifndef __WXOSX_IPHONE__ - PicHandle m_pictHandle; + IconRef m_iconRef; #endif + CGContextRef m_hBitmap; + double m_scaleFactor; }; @@ -189,13 +192,6 @@ void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bi info->contentType = kControlContentCGImageRef ; info->u.imageRef = (CGImageRef) bmap->CreateCGImage() ; } - else - { -#ifndef __LP64__ - info->contentType = kControlContentPictHandle ; - info->u.picture = bmap->GetPictHandle() ; -#endif - } } } @@ -247,18 +243,18 @@ void wxBitmapRefData::Init() #ifndef __WXOSX_IPHONE__ m_iconRef = NULL ; - m_pictHandle = NULL ; #endif m_hBitmap = NULL ; m_rawAccessCount = 0 ; m_hasAlpha = false; + m_scaleFactor = 1.0; } wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData &tocopy) : wxGDIRefData() { Init(); - Create(tocopy.m_width, tocopy.m_height, tocopy.m_depth); + Create(tocopy.m_width, tocopy.m_height, tocopy.m_depth, tocopy.m_scaleFactor); if (tocopy.m_bitmapMask) m_bitmapMask = new wxMask(*tocopy.m_bitmapMask); @@ -282,14 +278,26 @@ wxBitmapRefData::wxBitmapRefData( int w , int h , int d ) Create( w , h , d ) ; } -wxBitmapRefData::wxBitmapRefData(CGImageRef image) +wxBitmapRefData::wxBitmapRefData(int w , int h , int d, double logicalscale) +{ + Init() ; + Create( w , h , d, logicalscale ) ; +} + +wxBitmapRefData::wxBitmapRefData(CGContextRef context) { Init(); - Create( image ); + Create( context ); +} + +wxBitmapRefData::wxBitmapRefData(CGImageRef image, double scale) +{ + Init(); + Create( image, scale ); } // code from Technical Q&A QA1509 -bool wxBitmapRefData::Create(CGImageRef image) +bool wxBitmapRefData::Create(CGImageRef image, double scale) { if ( image != NULL ) { @@ -297,6 +305,7 @@ bool wxBitmapRefData::Create(CGImageRef image) m_height = CGImageGetHeight(image); m_depth = 32; m_hBitmap = NULL; + m_scaleFactor = scale; m_bytesPerRow = GetBestBytesPerRow( m_width * 4 ) ; size_t size = m_bytesPerRow * m_height ; @@ -306,7 +315,7 @@ bool wxBitmapRefData::Create(CGImageRef image) memset( data , 0 , size ) ; m_memBuf.UngetWriteBuf( size ) ; CGImageAlphaInfo alpha = CGImageGetAlphaInfo(image); - if ( alpha == kCGImageAlphaNone || alpha == kCGImageAlphaNoneSkipLast || alpha == kCGImageAlphaNoneSkipLast ) + if ( alpha == kCGImageAlphaNone || alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast ) { m_hBitmap = CGBitmapContextCreate((char*) data, m_width, m_height, 8, m_bytesPerRow, wxMacGetGenericRGBColorSpace(), kCGImageAlphaNoneSkipFirst ); } @@ -315,12 +324,12 @@ bool wxBitmapRefData::Create(CGImageRef image) m_hasAlpha = true; m_hBitmap = CGBitmapContextCreate((char*) data, m_width, m_height, 8, m_bytesPerRow, wxMacGetGenericRGBColorSpace(), kCGImageAlphaPremultipliedFirst ); } - CGRect rect = {{0,0},{m_width,m_height}}; + CGRect rect = CGRectMake(0,0,m_width,m_height); CGContextDrawImage(m_hBitmap, rect, image); wxASSERT_MSG( m_hBitmap , wxT("Unable to create CGBitmapContext context") ) ; CGContextTranslateCTM( m_hBitmap, 0, m_height ); - CGContextScaleCTM( m_hBitmap, 1, -1 ); + CGContextScaleCTM( m_hBitmap, 1*m_scaleFactor, -1*m_scaleFactor ); } /* data != NULL */ } m_ok = ( m_hBitmap != NULL ) ; @@ -329,6 +338,41 @@ bool wxBitmapRefData::Create(CGImageRef image) } +bool wxBitmapRefData::Create(CGContextRef context) +{ + if ( context != NULL && CGBitmapContextGetData(context) ) + { + m_hBitmap = context; + m_bytesPerRow = CGBitmapContextGetBytesPerRow(context); + m_width = CGBitmapContextGetWidth(context); + m_height = CGBitmapContextGetHeight(context); + m_depth = CGBitmapContextGetBitsPerPixel(context) ; + + // our own contexts conform to this, always. + wxASSERT( m_depth == 32 ); + + // determine content scale + CGRect userrect = CGRectMake(0, 0, 10, 10); + CGRect devicerect; + devicerect = CGContextConvertRectToDeviceSpace(context, userrect); + m_scaleFactor = devicerect.size.height / userrect.size.height; + + CGImageAlphaInfo alpha = CGBitmapContextGetAlphaInfo(context); + + if ( alpha == kCGImageAlphaNone || alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast ) + { + // no alpha + } + else + { + m_hasAlpha = true; + } + } + m_ok = ( m_hBitmap != NULL ) ; + + return m_ok ; +} + bool wxBitmapRefData::Create( int w , int h , int d ) { m_width = wxMax(1, w); @@ -347,13 +391,19 @@ bool wxBitmapRefData::Create( int w , int h , int d ) m_hBitmap = CGBitmapContextCreate((char*) data, m_width, m_height, 8, m_bytesPerRow, wxMacGetGenericRGBColorSpace(), kCGImageAlphaNoneSkipFirst ); wxASSERT_MSG( m_hBitmap , wxT("Unable to create CGBitmapContext context") ) ; CGContextTranslateCTM( m_hBitmap, 0, m_height ); - CGContextScaleCTM( m_hBitmap, 1, -1 ); + CGContextScaleCTM( m_hBitmap, 1*m_scaleFactor, -1*m_scaleFactor ); } /* data != NULL */ m_ok = ( m_hBitmap != NULL ) ; return m_ok ; } +bool wxBitmapRefData::Create( int w , int h , int d, double logicalScale ) +{ + m_scaleFactor = logicalScale; + return Create(w*logicalScale,h*logicalScale,d); +} + void wxBitmapRefData::UseAlpha( bool use ) { if ( m_hasAlpha == use ) @@ -365,7 +415,7 @@ void wxBitmapRefData::UseAlpha( bool use ) m_hBitmap = CGBitmapContextCreate((char*) m_memBuf.GetData(), m_width, m_height, 8, m_bytesPerRow, wxMacGetGenericRGBColorSpace(), m_hasAlpha ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst ); wxASSERT_MSG( m_hBitmap , wxT("Unable to create CGBitmapContext context") ) ; CGContextTranslateCTM( m_hBitmap, 0, m_height ); - CGContextScaleCTM( m_hBitmap, 1, -1 ); + CGContextScaleCTM( m_hBitmap, 1*m_scaleFactor, -1*m_scaleFactor ); } void *wxBitmapRefData::GetRawAccess() const @@ -379,8 +429,8 @@ void *wxBitmapRefData::BeginRawAccess() wxCHECK_MSG( IsOk(), NULL, wxT("invalid bitmap") ) ; wxASSERT( m_rawAccessCount == 0 ) ; #ifndef __WXOSX_IPHONE__ - wxASSERT_MSG( m_pictHandle == NULL && m_iconRef == NULL , - wxT("Currently, modifing bitmaps that are used in controls already is not supported") ) ; + wxASSERT_MSG( m_iconRef == NULL , + wxT("Currently, modifing bitmaps that are used in controls already is not supported") ) ; #endif ++m_rawAccessCount ; @@ -428,8 +478,39 @@ IconRef wxBitmapRefData::GetIconRef() OSType dataType = 0 ; OSType maskType = 0 ; + // since we don't have PICT conversion available, use + // the next larger standard icon size + // TODO: Use NSImage + if (sz <= 16) + sz = 16; + else if ( sz <= 32) + sz = 32; + else if ( sz <= 48) + sz = 48; + else if ( sz <= 128) + sz = 128; + else if ( sz <= 256) + sz = 256; + else if ( sz <= 512) + sz = 512; + else if ( sz <= 1024) + sz = 1024; + switch (sz) { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + case 1024: + dataType = kIconServices1024PixelDataARGB; + break; +#endif + case 512: + dataType = kIconServices512PixelDataARGB; + break; + + case 256: + dataType = kIconServices256PixelDataARGB; + break; + case 128: dataType = kIconServices128PixelDataARGB ; break; @@ -581,11 +662,6 @@ IconRef wxBitmapRefData::GetIconRef() DisposeHandle( maskdata ) ; } } - else - { - PicHandle pic = GetPictHandle() ; - SetIconFamilyData( iconFamily, 'PICT' , (Handle) pic ) ; - } // transform into IconRef // cleaner version existing from 10.3 upwards @@ -600,10 +676,6 @@ IconRef wxBitmapRefData::GetIconRef() return m_iconRef ; } -PicHandle wxBitmapRefData::GetPictHandle() -{ - return m_pictHandle ; -} #endif CGImageRef wxBitmapRefData::CreateCGImage() const @@ -743,13 +815,6 @@ void wxBitmapRefData::Free() ReleaseIconRef( m_iconRef ) ; m_iconRef = NULL ; } - -#ifndef __LP64__ - if ( m_pictHandle ) - { - m_pictHandle = NULL ; - } -#endif #endif if ( m_hBitmap ) { @@ -886,9 +951,9 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits { if ( no_bits == 1 ) { - int linesize = ( the_width / (sizeof(unsigned char) * 8)) ; - if ( the_width % (sizeof(unsigned char) * 8) ) - linesize += sizeof(unsigned char); + int linesize = the_width / 8; + if ( the_width % 8 ) + linesize++; unsigned char* linestart = (unsigned char*) bits ; unsigned char* destptr = (unsigned char*) BeginRawAccess() ; @@ -935,14 +1000,19 @@ wxBitmap::wxBitmap(const void* data, wxBitmapType type, int width, int height, i (void) Create(data, type, width, height, depth); } +wxBitmap::wxBitmap(int width, int height, const wxDC& dc) +{ + (void)Create(width, height, dc); +} + wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type) { LoadFile(filename, type); } -wxBitmap::wxBitmap(CGImageRef image) +wxBitmap::wxBitmap(CGImageRef image, double scale) { - (void) Create(image); + (void) Create(image,scale); } wxGDIRefData* wxBitmap::CreateGDIRefData() const @@ -1001,10 +1071,34 @@ IconRef wxBitmap::CreateIconRef() const #if wxOSX_USE_COCOA +wxBitmap::wxBitmap(WX_NSImage image) +{ + (void)Create(image); +} + +bool wxBitmap::Create(WX_NSImage image) +{ + return Create(wxOSXCreateBitmapContextFromNSImage(image)); +} + +wxBitmap::wxBitmap(CGContextRef bitmapcontext) +{ + (void)Create(bitmapcontext); +} + +bool wxBitmap::Create(CGContextRef bitmapcontext) +{ + UnRef(); + + m_refData = new wxBitmapRefData( bitmapcontext ); + + return M_BITMAPDATA->IsOk() ; +} + WX_NSImage wxBitmap::GetNSImage() const { wxCFRef< CGImageRef > cgimage(CreateCGImage()); - return wxOSXGetNSImageFromCGImage( cgimage ); + return wxOSXGetNSImageFromCGImage( cgimage, GetScaleFactor() ); } #endif @@ -1026,29 +1120,34 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const (rect.y+rect.height <= GetHeight()), wxNullBitmap, wxT("invalid bitmap or bitmap region") ); - wxBitmap ret( rect.width, rect.height, GetDepth() ); + wxBitmap ret; + double scale = GetScaleFactor(); + ret.CreateScaled( rect.width, rect.height, GetDepth(), scale ); wxASSERT_MSG( ret.IsOk(), wxT("GetSubBitmap error") ); - int destwidth = rect.width ; - int destheight = rect.height ; + int destwidth = rect.width*scale ; + int destheight = rect.height*scale ; { unsigned char *sourcedata = (unsigned char*) GetRawAccess() ; unsigned char *destdata = (unsigned char*) ret.BeginRawAccess() ; - wxASSERT( (sourcedata != NULL) && (destdata != NULL) ) ; + wxASSERT((sourcedata != NULL) && (destdata != NULL)); - int sourcelinesize = GetBitmapData()->GetBytesPerRow() ; - int destlinesize = ret.GetBitmapData()->GetBytesPerRow() ; - unsigned char *source = sourcedata + rect.x * 4 + rect.y * sourcelinesize ; - unsigned char *dest = destdata ; - - for (int yy = 0; yy < destheight; ++yy, source += sourcelinesize , dest += destlinesize) + if ( (sourcedata != NULL) && (destdata != NULL) ) { - memcpy( dest , source , destlinesize ) ; + int sourcelinesize = GetBitmapData()->GetBytesPerRow() ; + int destlinesize = ret.GetBitmapData()->GetBytesPerRow() ; + unsigned char *source = sourcedata + int(rect.x * scale * 4 + rect.y *scale * sourcelinesize) ; + unsigned char *dest = destdata ; + + for (int yy = 0; yy < destheight; ++yy, source += sourcelinesize , dest += destlinesize) + { + memcpy( dest , source , destlinesize ) ; + } } + ret.EndRawAccess() ; } - ret.EndRawAccess() ; if ( M_BITMAPDATA->m_bitmapMask ) { @@ -1063,15 +1162,18 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const unsigned char *destdata = (unsigned char * ) maskbuf.GetWriteBuf( maskbufsize ) ; wxASSERT( (source != NULL) && (destdata != NULL) ) ; - source += rect.x * kMaskBytesPerPixel + rect.y * sourcelinesize ; - unsigned char *dest = destdata ; - - for (int yy = 0; yy < destheight; ++yy, source += sourcelinesize , dest += destlinesize) + if ( (source != NULL) && (destdata != NULL) ) { - memcpy( dest , source , destlinesize ) ; - } + source += rect.x * kMaskBytesPerPixel + rect.y * sourcelinesize ; + unsigned char *dest = destdata ; - maskbuf.UngetWriteBuf( maskbufsize ) ; + for (int yy = 0; yy < destheight; ++yy, source += sourcelinesize , dest += destlinesize) + { + memcpy( dest , source , destlinesize ) ; + } + + maskbuf.UngetWriteBuf( maskbufsize ) ; + } ret.SetMask( new wxMask( maskbuf , destwidth , destheight , rowBytes ) ) ; } else if ( HasAlpha() ) @@ -1092,12 +1194,29 @@ bool wxBitmap::Create(int w, int h, int d) return M_BITMAPDATA->IsOk() ; } +bool wxBitmap::Create(int w, int h, const wxDC& dc) +{ + double factor = dc.GetContentScaleFactor(); + return CreateScaled(w,h,wxBITMAP_SCREEN_DEPTH, factor); +} -bool wxBitmap::Create(CGImageRef image) +bool wxBitmap::CreateScaled(int w, int h, int d, double logicalScale) { UnRef(); - m_refData = new wxBitmapRefData( image ); + if ( d < 0 ) + d = wxDisplayDepth() ; + + m_refData = new wxBitmapRefData( w , h , d, logicalScale ); + + return M_BITMAPDATA->IsOk() ; +} + +bool wxBitmap::Create(CGImageRef image, double scale) +{ + UnRef(); + + m_refData = new wxBitmapRefData( image, scale ); return M_BITMAPDATA->IsOk() ; } @@ -1106,6 +1225,8 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) { UnRef(); + // XXX comex: how exactly is this supposed to work!? @2x support isn't used in this case + /* wxBitmapHandler *handler = FindHandler(type); if ( handler ) @@ -1115,12 +1236,32 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) return handler->LoadFile(this, filename, type, -1, -1); } else + */ { #if wxUSE_IMAGE - wxImage loadimage(filename, type); + double scale = 1.0; + wxString fname = filename; + + if ( type == wxBITMAP_TYPE_PNG ) + { + if ( wxOSXGetMainScreenContentScaleFactor() > 1.9 ) + { + wxFileName fn(filename); + fn.MakeAbsolute(); + fn.SetName(fn.GetName()+"@2x"); + + if ( fn.Exists() ) + { + fname = fn.GetFullPath(); + scale = 2.0; + } + } + } + + wxImage loadimage(fname, type); if (loadimage.IsOk()) { - *this = loadimage; + *this = wxBitmap(loadimage,-1,scale); return true; } @@ -1152,7 +1293,7 @@ bool wxBitmap::Create(const void* data, wxBitmapType type, int width, int height #if wxUSE_IMAGE -wxBitmap::wxBitmap(const wxImage& image, int depth) +wxBitmap::wxBitmap(const wxImage& image, int depth, double scale) { wxCHECK_RET( image.IsOk(), wxT("invalid image") ); @@ -1162,7 +1303,7 @@ wxBitmap::wxBitmap(const wxImage& image, int depth) wxBitmapRefData* bitmapRefData; - m_refData = bitmapRefData = new wxBitmapRefData( width , height , depth ) ; + m_refData = bitmapRefData = new wxBitmapRefData( width/scale, height/scale, depth, scale) ; if ( bitmapRefData->IsOk()) { @@ -1372,6 +1513,13 @@ int wxBitmap::GetWidth() const return M_BITMAPDATA->GetWidth() ; } +double wxBitmap::GetScaleFactor() const +{ + wxCHECK_MSG( IsOk(), -1, wxT("invalid bitmap") ); + + return M_BITMAPDATA->GetScaleFactor() ; +} + int wxBitmap::GetDepth() const { wxCHECK_MSG( IsOk(), -1, wxT("invalid bitmap") ); @@ -1607,37 +1755,60 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) size_t size = m_bytesPerRow * m_height ; unsigned char * destdatabase = (unsigned char*) m_memBuf.GetWriteBuf( size ) ; wxASSERT( destdatabase != NULL ) ; - - memset( destdatabase , 0 , size ) ; - unsigned char * srcdatabase = (unsigned char*) bitmap.GetRawAccess() ; - size_t sourceBytesRow = bitmap.GetBitmapData()->GetBytesPerRow(); - - for ( int y = 0 ; y < m_height ; ++y , srcdatabase+= sourceBytesRow, destdatabase += m_bytesPerRow) + if ( destdatabase != NULL) { - unsigned char *srcdata = srcdatabase ; - unsigned char *destdata = destdatabase ; - unsigned char r, g, b; + memset( destdatabase , 0 , size ) ; + unsigned char * srcdatabase = (unsigned char*) bitmap.GetRawAccess() ; + size_t sourceBytesRow = bitmap.GetBitmapData()->GetBytesPerRow(); - for ( int x = 0 ; x < m_width ; ++x ) + for ( int y = 0 ; y < m_height ; ++y , srcdatabase+= sourceBytesRow, destdatabase += m_bytesPerRow) { - srcdata++ ; - r = *srcdata++ ; - g = *srcdata++ ; - b = *srcdata++ ; + unsigned char *srcdata = srcdatabase ; + unsigned char *destdata = destdatabase ; + unsigned char r, g, b; - if ( colour == wxColour( r , g , b ) ) - *destdata++ = 0xFF ; - else - *destdata++ = 0x00 ; + for ( int x = 0 ; x < m_width ; ++x ) + { + srcdata++ ; + r = *srcdata++ ; + g = *srcdata++ ; + b = *srcdata++ ; + + if ( colour == wxColour( r , g , b ) ) + *destdata++ = 0xFF ; + else + *destdata++ = 0x00 ; + } } } - m_memBuf.UngetWriteBuf( size ) ; RealizeNative() ; return true; } +wxBitmap wxMask::GetBitmap() const +{ + wxBitmap bitmap(m_width, m_height, 1); + unsigned char* dst = static_cast(bitmap.BeginRawAccess()); + const int dst_stride = bitmap.GetBitmapData()->GetBytesPerRow(); + const unsigned char* src = static_cast(GetRawAccess()); + for (int j = 0; j < m_height; j++, src += m_bytesPerRow, dst += dst_stride) + { + unsigned char* d = dst; + for (int i = 0; i < m_width; i++) + { + const unsigned char byte = src[i]; + *d++ = 0xff; + *d++ = byte; + *d++ = byte; + *d++ = byte; + } + } + bitmap.EndRawAccess(); + return bitmap; +} + WXHBITMAP wxMask::GetHBITMAP() const { return m_maskBitmap ; @@ -1682,7 +1853,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxPNGResourceHandler, wxBundleResourceHandler) class WXDLLEXPORT wxJPEGResourceHandler: public wxBundleResourceHandler { - DECLARE_DYNAMIC_CLASS(wxPNGResourceHandler) + DECLARE_DYNAMIC_CLASS(wxJPEGResourceHandler) public: inline wxJPEGResourceHandler() @@ -1703,9 +1874,23 @@ bool wxBundleResourceHandler::LoadFile(wxBitmap *bitmap, { wxString ext = GetExtension().Lower(); wxCFStringRef resname(name); + wxCFStringRef resname2x(name+"@2x"); wxCFStringRef restype(ext); + double scale = 1.0; - wxCFRef imageURL(CFBundleCopyResourceURL(CFBundleGetMainBundle(), resname, restype, NULL)); + wxCFRef imageURL; + + if ( wxOSXGetMainScreenContentScaleFactor() > 1.9 ) + { + imageURL.reset(CFBundleCopyResourceURL(CFBundleGetMainBundle(), resname2x, restype, NULL)); + scale = 2.0; + } + + if ( imageURL.get() == NULL ) + { + imageURL.reset(CFBundleCopyResourceURL(CFBundleGetMainBundle(), resname, restype, NULL)); + scale = 1.0; + } if ( imageURL.get() != NULL ) { @@ -1721,7 +1906,7 @@ bool wxBundleResourceHandler::LoadFile(wxBitmap *bitmap, kCGRenderingIntentDefault); if ( image != NULL ) { - bitmap->Create(image); + bitmap->Create(image,scale); CGImageRelease(image); } } @@ -1729,6 +1914,18 @@ bool wxBundleResourceHandler::LoadFile(wxBitmap *bitmap, return false ; } +/* static */ +wxBitmap wxBitmapHelpers::NewFromPNGData(const void* data, size_t size) +{ + wxCFRef + provider(CGDataProviderCreateWithData(NULL, data, size, NULL) ); + wxCFRef + image(CGImageCreateWithPNGDataProvider(provider, NULL, true, + kCGRenderingIntentDefault)); + + return wxBitmap(image); +} + void wxBitmap::InitStandardHandlers() { #if wxOSX_USE_COCOA_OR_CARBON diff --git a/Externals/wxWidgets3/src/osx/core/cfstring.cpp b/Externals/wxWidgets3/src/osx/core/cfstring.cpp index c2d08701b0..384bf88e72 100644 --- a/Externals/wxWidgets3/src/osx/core/cfstring.cpp +++ b/Externals/wxWidgets3/src/osx/core/cfstring.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2004-10-29 (from code in src/osx/carbon/utils.cpp) -// RCS-ID: $Id: cfstring.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence // Usage: Darwin (base library) @@ -632,6 +631,18 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN } } +wxString wxCFStringRef::AsStringWithNormalizationFormC( CFStringRef ref, wxFontEncoding encoding ) +{ + if ( !ref ) + return wxEmptyString ; + + CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, ref); + CFStringNormalize(cfMutableString,kCFStringNormalizationFormC); + wxString str = wxCFStringRef::AsString(ref,encoding); + CFRelease(cfMutableString); + return str; +} + wxString wxCFStringRef::AsString( CFStringRef ref, wxFontEncoding WXUNUSED_IN_UNICODE(encoding) ) { if ( !ref ) @@ -687,7 +698,12 @@ wxString wxCFStringRef::AsString( NSString* ref, wxFontEncoding encoding ) { return AsString( (CFStringRef) ref, encoding ); } -#endif + +wxString wxCFStringRef::AsStringWithNormalizationFormC( NSString* ref, wxFontEncoding encoding ) +{ + return AsStringWithNormalizationFormC( (CFStringRef) ref, encoding ); +} +#endif // wxOSX_USE_COCOA_OR_IPHONE // diff --git a/Externals/wxWidgets3/src/osx/core/colour.cpp b/Externals/wxWidgets3/src/osx/core/colour.cpp index 75388b74a1..e39d215cdc 100644 --- a/Externals/wxWidgets3/src/osx/core/colour.cpp +++ b/Externals/wxWidgets3/src/osx/core/colour.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: colour.cpp 70400 2012-01-19 14:06:36Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -70,7 +69,7 @@ void wxColour::InitRGBA (ChannelType r, ChannelType g, ChannelType b, ChannelTyp m_alpha = a ; CGColorRef col = 0 ; -#if wxOSX_USE_COCOA_OR_CARBON && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#if wxOSX_USE_COCOA_OR_CARBON if ( CGColorCreateGenericRGB != NULL ) col = CGColorCreateGenericRGB( (CGFloat)(r / 255.0), (CGFloat) (g / 255.0), (CGFloat) (b / 255.0), (CGFloat) (a / 255.0) ); else @@ -91,17 +90,8 @@ void wxColour::InitRGBColor( const RGBColor& col ) m_green = col.green >> 8; m_alpha = wxALPHA_OPAQUE; CGColorRef cfcol; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( CGColorCreateGenericRGB != NULL ) - cfcol = CGColorCreateGenericRGB((CGFloat)(col.red / 65535.0), (CGFloat)(col.green / 65535.0), + cfcol = CGColorCreateGenericRGB((CGFloat)(col.red / 65535.0), (CGFloat)(col.green / 65535.0), (CGFloat)(col.blue / 65535.0), (CGFloat) 1.0 ); - else -#endif - { - CGFloat components[4] = { (CGFloat)(col.red / 65535.0), (CGFloat)(col.green / 65535.0), - (CGFloat)(col.blue / 65535.0), (CGFloat) 1.0 } ; - cfcol = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ; - } wxASSERT_MSG(cfcol != NULL, "Invalid CoreGraphics Color"); m_cgColour.reset( cfcol ); } diff --git a/Externals/wxWidgets3/src/osx/core/dcmemory.cpp b/Externals/wxWidgets3/src/osx/core/dcmemory.cpp index 7143745124..a7a47d6213 100644 --- a/Externals/wxWidgets3/src/osx/core/dcmemory.cpp +++ b/Externals/wxWidgets3/src/osx/core/dcmemory.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 01/02/97 -// RCS-ID: $Id: dcmemory.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -76,8 +75,9 @@ void wxMemoryDCImpl::DoSelect( const wxBitmap& bitmap ) if ( m_selected.GetDepth() != 1 ) m_selected.UseAlpha() ; m_selected.BeginRawAccess() ; - m_width = bitmap.GetWidth(); - m_height = bitmap.GetHeight(); + m_width = bitmap.GetScaledWidth(); + m_height = bitmap.GetScaledHeight(); + m_contentScaleFactor = bitmap.GetScaleFactor(); CGColorSpaceRef genericColorSpace = wxMacGetGenericRGBColorSpace(); CGContextRef bmCtx = (CGContextRef) m_selected.GetHBITMAP(); @@ -100,9 +100,9 @@ void wxMemoryDCImpl::DoGetSize( int *width, int *height ) const if (m_selected.IsOk()) { if (width) - (*width) = m_selected.GetWidth(); + (*width) = m_selected.GetScaledWidth(); if (height) - (*height) = m_selected.GetHeight(); + (*height) = m_selected.GetScaledHeight(); } else { diff --git a/Externals/wxWidgets3/src/osx/core/display.cpp b/Externals/wxWidgets3/src/osx/core/display.cpp index 06764a2f27..b1961bc92e 100644 --- a/Externals/wxWidgets3/src/osx/core/display.cpp +++ b/Externals/wxWidgets3/src/osx/core/display.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton & Brian Victor // Modified by: Royce Mitchell III, Vadim Zeitlin // Created: 06/21/02 -// RCS-ID: $Id: display.cpp 66843 2011-02-05 16:36:18Z VZ $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp b/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp index 93f835078a..e3e0752f04 100644 --- a/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp +++ b/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp @@ -3,8 +3,8 @@ // Purpose: wxEventLoop implementation common to both Carbon and Cocoa // Author: Vadim Zeitlin // Created: 2009-10-18 -// RCS-ID: $Id: evtloop_cf.cpp 70504 2012-02-03 17:27:17Z VZ $ // Copyright: (c) 2009 Vadim Zeitlin +// (c) 2013 Rob Bresalier // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -25,8 +25,6 @@ #include "wx/evtloop.h" -#if wxUSE_EVENTLOOP_SOURCE - #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/app.h" @@ -44,110 +42,30 @@ #include "wx/nonownedwnd.h" #endif +#include + // ============================================================================ // wxCFEventLoopSource and wxCFEventLoop implementation // ============================================================================ -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -namespace +#if wxUSE_EVENTLOOP_SOURCE + +void wxCFEventLoopSource::InitSourceSocket(CFSocketRef cfSocket) { + wxASSERT_MSG( !m_cfSocket, "shouldn't be called more than once" ); -void EnableDescriptorCallBacks(CFFileDescriptorRef cffd, int flags) -{ - if ( flags & wxEVENT_SOURCE_INPUT ) - CFFileDescriptorEnableCallBacks(cffd, kCFFileDescriptorReadCallBack); - if ( flags & wxEVENT_SOURCE_OUTPUT ) - CFFileDescriptorEnableCallBacks(cffd, kCFFileDescriptorWriteCallBack); -} - -void -wx_cffiledescriptor_callback(CFFileDescriptorRef cffd, - CFOptionFlags flags, - void *ctxData) -{ - wxLogTrace(wxTRACE_EVT_SOURCE, - "CFFileDescriptor callback, flags=%d", flags); - - wxCFEventLoopSource * const - source = static_cast(ctxData); - - wxEventLoopSourceHandler * const - handler = source->GetHandler(); - if ( flags & kCFFileDescriptorReadCallBack ) - handler->OnReadWaiting(); - if ( flags & kCFFileDescriptorWriteCallBack ) - handler->OnWriteWaiting(); - - // we need to re-enable callbacks to be called again - EnableDescriptorCallBacks(cffd, source->GetFlags()); -} - -} // anonymous namespace - -wxEventLoopSource * -wxCFEventLoop::AddSourceForFD(int fd, - wxEventLoopSourceHandler *handler, - int flags) -{ - wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); - - wxScopedPtr - source(new wxCFEventLoopSource(handler, flags)); - - CFFileDescriptorContext ctx = { 0, source.get(), NULL, NULL, NULL }; - wxCFRef - cffd(CFFileDescriptorCreate - ( - kCFAllocatorDefault, - fd, - true, // close on invalidate - wx_cffiledescriptor_callback, - &ctx - )); - if ( !cffd ) - return NULL; - - wxCFRef - cfsrc(CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault, cffd, 0)); - if ( !cfsrc ) - return NULL; - - CFRunLoopRef cfloop = CFGetCurrentRunLoop(); - CFRunLoopAddSource(cfloop, cfsrc, kCFRunLoopDefaultMode); - - // Enable the callbacks initially. - EnableDescriptorCallBacks(cffd, source->GetFlags()); - - source->SetFileDescriptor(cffd.release()); - - return source.release(); -} - -void wxCFEventLoopSource::SetFileDescriptor(CFFileDescriptorRef cffd) -{ - wxASSERT_MSG( !m_cffd, "shouldn't be called more than once" ); - - m_cffd = cffd; + m_cfSocket = cfSocket; } wxCFEventLoopSource::~wxCFEventLoopSource() { - if ( m_cffd ) - CFRelease(m_cffd); + if ( m_cfSocket ) + { + CFSocketInvalidate(m_cfSocket); + CFRelease(m_cfSocket); + } } -#else // OS X < 10.5 - -wxEventLoopSource * -wxCFEventLoop::AddSourceForFD(int WXUNUSED(fd), - wxEventLoopSourceHandler * WXUNUSED(handler), - int WXUNUSED(flags)) -{ - return NULL; -} - -#endif // MAC_OS_X_VERSION_MAX_ALLOWED - #endif // wxUSE_EVENTLOOP_SOURCE void wxCFEventLoop::OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info) @@ -176,13 +94,13 @@ void wxCFEventLoop::CommonModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(obs // and this input is only removed from it when pending event handlers are // executed) - if ( wxTheApp ) + if ( wxTheApp && ShouldProcessIdleEvents() ) wxTheApp->ProcessPendingEvents(); } if ( activity & kCFRunLoopBeforeWaiting ) { - if ( ProcessIdle() ) + if ( ShouldProcessIdleEvents() && ProcessIdle() ) { WakeUp(); } @@ -214,7 +132,12 @@ wxCFEventLoop::DefaultModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(observe wxCFEventLoop::wxCFEventLoop() { m_shouldExit = false; + m_processIdleEvents = true; +#if wxUSE_UIACTIONSIMULATOR + m_shouldWaitForEvent = false; +#endif + m_runLoop = CFGetCurrentRunLoop(); CFRunLoopObserverContext ctxt; @@ -223,18 +146,19 @@ wxCFEventLoop::wxCFEventLoop() m_commonModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXCommonModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_commonModeRunLoopObserver, kCFRunLoopCommonModes); - CFRelease(m_commonModeRunLoopObserver); m_defaultModeRunLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, (CFRunLoopObserverCallBack) wxCFEventLoop::OSXDefaultModeObserverCallBack, &ctxt ); CFRunLoopAddObserver(m_runLoop, m_defaultModeRunLoopObserver, kCFRunLoopDefaultMode); - CFRelease(m_defaultModeRunLoopObserver); } wxCFEventLoop::~wxCFEventLoop() { CFRunLoopRemoveObserver(m_runLoop, m_commonModeRunLoopObserver, kCFRunLoopCommonModes); CFRunLoopRemoveObserver(m_runLoop, m_defaultModeRunLoopObserver, kCFRunLoopDefaultMode); + + CFRelease(m_defaultModeRunLoopObserver); + CFRelease(m_commonModeRunLoopObserver); } @@ -309,7 +233,17 @@ bool wxCFEventLoop::Pending() const int wxCFEventLoop::DoProcessEvents() { - return DispatchTimeout( 0 ); +#if wxUSE_UIACTIONSIMULATOR + if ( m_shouldWaitForEvent ) + { + int handled = DispatchTimeout( 1000 ); + wxASSERT_MSG( handled == 1, "No Event Available"); + m_shouldWaitForEvent = false; + return handled; + } + else +#endif + return DispatchTimeout( 0 ); } bool wxCFEventLoop::Dispatch() @@ -361,7 +295,7 @@ int wxCFEventLoop::DoDispatchTimeout(unsigned long timeout) return 1; } -void wxCFEventLoop::DoRun() +void wxCFEventLoop::OSXDoRun() { for ( ;; ) { @@ -382,23 +316,15 @@ void wxCFEventLoop::DoRun() } } -void wxCFEventLoop::DoStop() +void wxCFEventLoop::OSXDoStop() { CFRunLoopStop(CFGetCurrentRunLoop()); } // enters a loop calling OnNextIteration(), Pending() and Dispatch() and // terminating when Exit() is called -int wxCFEventLoop::Run() +int wxCFEventLoop::DoRun() { - // event loops are not recursive, you need to create another loop! - wxCHECK_MSG( !IsRunning(), -1, wxT("can't reenter a message loop") ); - - // ProcessIdle() and ProcessEvents() below may throw so the code here should - // be exception-safe, hence we must use local objects for all actions we - // should undo - wxEventLoopActivator activate(this); - // we must ensure that OnExit() is called even if an exception is thrown // from inside ProcessEvents() but we must call it from Exit() in normal // situations because it is supposed to be called synchronously, @@ -411,7 +337,7 @@ int wxCFEventLoop::Run() { #endif // wxUSE_EXCEPTIONS - DoRun(); + OSXDoRun(); #if wxUSE_EXCEPTIONS // exit the outer loop as well @@ -445,11 +371,30 @@ int wxCFEventLoop::Run() // sets the "should exit" flag and wakes up the loop so that it terminates // soon -void wxCFEventLoop::Exit(int rc) +void wxCFEventLoop::ScheduleExit(int rc) { m_exitcode = rc; m_shouldExit = true; - DoStop(); + OSXDoStop(); +} + +wxCFEventLoopPauseIdleEvents::wxCFEventLoopPauseIdleEvents() +{ + wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); + if ( cfl ) + { + m_formerState = cfl->ShouldProcessIdleEvents(); + cfl->SetProcessIdleEvents(false); + } + else + m_formerState = true; +} + +wxCFEventLoopPauseIdleEvents::~wxCFEventLoopPauseIdleEvents() +{ + wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); + if ( cfl ) + cfl->SetProcessIdleEvents(m_formerState); } // TODO Move to thread_osx.cpp diff --git a/Externals/wxWidgets3/src/osx/core/fontenum.cpp b/Externals/wxWidgets3/src/osx/core/fontenum.cpp index fb4ed5640b..658701bc82 100644 --- a/Externals/wxWidgets3/src/osx/core/fontenum.cpp +++ b/Externals/wxWidgets3/src/osx/core/fontenum.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: fontenum.cpp 70712 2012-02-27 15:41:35Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -31,66 +30,104 @@ // wxFontEnumerator // ---------------------------------------------------------------------------- +#if wxOSX_USE_IPHONE +extern CFArrayRef CopyAvailableFontFamilyNames(); +#endif + bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool fixedWidthOnly) { - if ( fixedWidthOnly ) - { - wxFAIL_MSG( "enumerating only fixed width fonts not supported" ); - return false; - } - - wxArrayString fontFamilies ; - -#if wxOSX_USE_ATSU_TEXT || wxOSX_USE_CORE_TEXT - - // - // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html - // - - ATSFontFamilyIterator theFontFamilyIterator = NULL; - ATSFontFamilyRef theATSFontFamilyRef = 0; - OSStatus status = noErr; - - // Create the iterator - status = ATSFontFamilyIteratorCreate(kATSFontContextLocal, nil,nil, - kATSOptionFlagsUnRestrictedScope, - &theFontFamilyIterator ); + wxArrayString fontFamilies ; wxUint32 macEncoding = wxMacGetSystemEncFromFontEnc(encoding) ; - - while (status == noErr) + +#if wxOSX_USE_CORE_TEXT { - // Get the next font in the iteration. - status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef ); - if(status == noErr) + CFArrayRef cfFontFamilies = nil; + +#if wxOSX_USE_COCOA_OR_CARBON +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + if ( UMAGetSystemVersion() >= 0x1060 ) + cfFontFamilies = CTFontManagerCopyAvailableFontFamilyNames(); + else +#endif { - if ( encoding != wxFONTENCODING_SYSTEM ) +#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6) + // + // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html + // + + CFMutableArrayRef atsfontnames = CFArrayCreateMutable(kCFAllocatorDefault,0,&kCFTypeArrayCallBacks);; + + ATSFontFamilyIterator theFontFamilyIterator = NULL; + ATSFontFamilyRef theATSFontFamilyRef = 0; + OSStatus status = noErr; + + // Create the iterator + status = ATSFontFamilyIteratorCreate(kATSFontContextLocal, nil,nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator ); + + while (status == noErr) { - TextEncoding fontFamiliyEncoding = ATSFontFamilyGetEncoding(theATSFontFamilyRef) ; - if ( fontFamiliyEncoding != macEncoding ) - continue ; + // Get the next font in the iteration. + status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef ); + if(status == noErr) + { + CFStringRef theName = NULL; + ATSFontFamilyGetName(theATSFontFamilyRef, kATSOptionFlagsDefault, &theName); + CFArrayAppendValue(atsfontnames, theName); + CFRelease(theName); + + } + else if (status == kATSIterationScopeModified) // Make sure the font database hasn't changed. + { + // reset the iterator + status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator); + CFArrayRemoveAllValues(atsfontnames); + } } + ATSFontFamilyIteratorRelease(&theFontFamilyIterator); + cfFontFamilies = atsfontnames; +#endif + } +#elif wxOSX_USE_IPHONE + cfFontFamilies = CopyAvailableFontFamilyNames(); +#endif + + CFIndex count = CFArrayGetCount(cfFontFamilies); + for(CFIndex i = 0; i < count; i++) + { + CFStringRef fontName = (CFStringRef)CFArrayGetValueAtIndex(cfFontFamilies, i); - // TODO: determine fixed widths ... - - CFStringRef theName = NULL; - ATSFontFamilyGetName(theATSFontFamilyRef, kATSOptionFlagsDefault, &theName); - wxCFStringRef cfName(theName) ; + if ( encoding != wxFONTENCODING_SYSTEM || fixedWidthOnly) + { + wxCFRef font(CTFontCreateWithName(fontName, 12.0, NULL)); + if ( encoding != wxFONTENCODING_SYSTEM ) + { + CFStringEncoding fontFamiliyEncoding = CTFontGetStringEncoding(font); + if ( fontFamiliyEncoding != macEncoding ) + continue; + } + + if ( fixedWidthOnly ) + { + CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(font); + if ( (traits & kCTFontMonoSpaceTrait) == 0 ) + continue; + } + + } + + wxCFStringRef cfName(wxCFRetain(fontName)) ; fontFamilies.Add(cfName.AsString(wxLocale::GetSystemEncoding())); } - else if (status == kATSIterationScopeModified) // Make sure the font database hasn't changed. - { - // reset the iterator - status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil, - kATSOptionFlagsUnRestrictedScope, - &theFontFamilyIterator); - fontFamilies.Clear() ; - } + + CFRelease(cfFontFamilies); } - ATSFontFamilyIteratorRelease(&theFontFamilyIterator); #endif - for ( size_t i = 0 ; i < fontFamilies.Count() ; ++i ) { if ( OnFacename( fontFamilies[i] ) == false ) diff --git a/Externals/wxWidgets3/src/osx/core/glgrab.cpp b/Externals/wxWidgets3/src/osx/core/glgrab.cpp index 74644b45c7..669f2ba6c4 100644 --- a/Externals/wxWidgets3/src/osx/core/glgrab.cpp +++ b/Externals/wxWidgets3/src/osx/core/glgrab.cpp @@ -39,6 +39,7 @@ #import #import +#include "wx/osx/core/private.h" #include "wx/osx/private/glgrab.h" extern CGColorSpaceRef wxMacGetGenericRGBColorSpace(); @@ -114,7 +115,6 @@ CGImageRef grabViaOpenGL(CGDirectDisplayID display, CGRect srcRect) void * data; long bytewidth; GLint width, height; - long bytes; CGLContextObj glContextObj; CGLPixelFormatObj pixelFormatObj ; @@ -156,7 +156,6 @@ CGImageRef grabViaOpenGL(CGDirectDisplayID display, CGRect srcRect) bytewidth = width * 4; // Assume 4 bytes/pixel for now bytewidth = (bytewidth + 3) & ~3; // Align to 4 bytes - bytes = bytewidth * height; // width * height /* Build bitmap context */ data = malloc(height * bytewidth); diff --git a/Externals/wxWidgets3/src/osx/core/hid.cpp b/Externals/wxWidgets3/src/osx/core/hid.cpp index 30df548e65..92c874aa26 100644 --- a/Externals/wxWidgets3/src/osx/core/hid.cpp +++ b/Externals/wxWidgets3/src/osx/core/hid.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 11/11/2003 -// RCS-ID: $Id: hid.cpp 70251 2012-01-03 10:34:14Z SC $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -36,7 +35,7 @@ #include "wx/module.h" #endif -#include "wx/osx/core/cfstring.h" +#include "wx/osx/private.h" // ============================================================================ // implementation @@ -97,7 +96,7 @@ bool wxHIDDevice::Create (int nClass, int nType, int nDev) CFRelease(pClass); } - //Now get the maching services + //Now get the matching services io_iterator_t pIterator; if( IOServiceGetMatchingServices(m_pPort, pDictionary, &pIterator) != kIOReturnSuccess ) @@ -261,7 +260,7 @@ size_t wxHIDDevice::GetCount (int nClass, int nType) CFRelease(pClass); } - //Now get the maching services + //Now get the matching services io_iterator_t pIterator; if( IOServiceGetMatchingServices(pPort, pDictionary, &pIterator) != kIOReturnSuccess ) @@ -379,7 +378,7 @@ bool wxHIDDevice::IsActive(int nIndex) // ---------------------------------------------------------------------------- bool wxHIDDevice::HasElement(int nIndex) { - return (void*) m_pCookies[nIndex] != NULL; + return m_pCookies[nIndex] != 0; } // ---------------------------------------------------------------------------- @@ -673,73 +672,8 @@ bool wxGetKeyState (wxKeyCode key) wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key != WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons")); - if (wxHIDModule::sm_keyboards.GetCount() == 0) - { - int nKeyboards = wxHIDKeyboard::GetCount(); - - for(int i = 1; i <= nKeyboards; ++i) - { - wxHIDKeyboard* keyboard = new wxHIDKeyboard(); - if(keyboard->Create(i)) - { - wxHIDModule::sm_keyboards.Add(keyboard); - } - else - { - delete keyboard; - break; - } - } - - wxASSERT_MSG(wxHIDModule::sm_keyboards.GetCount() != 0, - wxT("No keyboards found!")); - } - - for(size_t i = 0; i < wxHIDModule::sm_keyboards.GetCount(); ++i) - { - wxHIDKeyboard* keyboard = (wxHIDKeyboard*) - wxHIDModule::sm_keyboards[i]; - - switch(key) - { - case WXK_SHIFT: - if( keyboard->IsActive(WXK_SHIFT) || - keyboard->IsActive(WXK_RSHIFT) ) - { - return true; - } - break; - case WXK_ALT: - if( keyboard->IsActive(WXK_ALT) || - keyboard->IsActive(WXK_RALT) ) - { - return true; - } - break; - case WXK_CONTROL: - if( keyboard->IsActive(WXK_CONTROL) || - keyboard->IsActive(WXK_RCONTROL) ) - { - return true; - } - break; - case WXK_RAW_CONTROL: - if( keyboard->IsActive(WXK_RAW_CONTROL) || - keyboard->IsActive(WXK_RAW_RCONTROL) ) - { - return true; - } - break; - default: - if( keyboard->IsActive(key) ) - { - return true; - } - break; - } - } - - return false; //not down/error + CGKeyCode cgcode = wxCharCodeWXToOSX((wxKeyCode)key); + return CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState, cgcode); } #endif //__DARWIN__ diff --git a/Externals/wxWidgets3/src/osx/core/hidjoystick.cpp b/Externals/wxWidgets3/src/osx/core/hidjoystick.cpp index 2eb4feb2e2..4a8273838e 100644 --- a/Externals/wxWidgets3/src/osx/core/hidjoystick.cpp +++ b/Externals/wxWidgets3/src/osx/core/hidjoystick.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2/13/2005 -// RCS-ID: $Id: hidjoystick.cpp 70404 2012-01-19 15:06:22Z SC $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -566,7 +565,7 @@ void wxHIDJoystick::BuildCookies(CFArrayRef Array) // // I wasted two hours of my life on this line :( - // accidently removed it during some source cleaning... + // accidentally removed it during some source cleaning... // MakeCookies(Array); @@ -782,7 +781,7 @@ void* wxJoystickThread::Entry() // // This is where the REAL dirty work gets done. // -// 1) Loops through each event the queue has recieved +// 1) Loops through each event the queue has received // 2) First, checks if the thread that is running the loop for // the polling has ended - if so it breaks out // 3) Next, it checks if there was an error getting this event from diff --git a/Externals/wxWidgets3/src/osx/core/mimetype.cpp b/Externals/wxWidgets3/src/osx/core/mimetype.cpp index 83c7c54b22..7d5de4bba9 100644 --- a/Externals/wxWidgets3/src/osx/core/mimetype.cpp +++ b/Externals/wxWidgets3/src/osx/core/mimetype.cpp @@ -4,7 +4,6 @@ // Author: Neil Perkins // Modified by: // Created: 2010-05-15 -// RCS-ID: $Id: mimetype.cpp 68563 2011-08-05 19:02:26Z VZ $ // Copyright: (C) 2010 Neil Perkins // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -244,7 +243,7 @@ wxMimeTypesManagerImpl::~wxMimeTypesManagerImpl() // Init / shutdown functions // // The Launch Services / UTI API provides no helpful way of getting a list -// of all registered types. Instead the API is focused arround looking up +// of all registered types. Instead the API is focused around looking up // information for a particular file type once you already have some // identifying piece of information. In order to get a list of registered // types it would first be necessary to get a list of all bundles exporting diff --git a/Externals/wxWidgets3/src/osx/core/printmac.cpp b/Externals/wxWidgets3/src/osx/core/printmac.cpp index a0558ee26f..148d1b65af 100644 --- a/Externals/wxWidgets3/src/osx/core/printmac.cpp +++ b/Externals/wxWidgets3/src/osx/core/printmac.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart, Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: printmac.cpp 70884 2012-03-12 17:47:18Z SC $ // Copyright: (c) Julian Smart, Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/core/sockosx.cpp b/Externals/wxWidgets3/src/osx/core/sockosx.cpp index 2b9bc131be..9a540058ce 100644 --- a/Externals/wxWidgets3/src/osx/core/sockosx.cpp +++ b/Externals/wxWidgets3/src/osx/core/sockosx.cpp @@ -3,7 +3,6 @@ // Purpose: wxSocketImpl implementation for OS X // Authors: Brian Victor, Vadim Zeitlin // Created: February 2002 -// RCS-ID: $Id: sockosx.cpp 67280 2011-03-22 14:17:38Z DS $ // Copyright: (c) 2002 Brian Victor // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/src/osx/core/sound.cpp b/Externals/wxWidgets3/src/osx/core/sound.cpp index de50b6e587..815ba16420 100644 --- a/Externals/wxWidgets3/src/osx/core/sound.cpp +++ b/Externals/wxWidgets3/src/osx/core/sound.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Stefan Csomor // Created: 2009-01-01 -// RCS-ID: $Id: sound.cpp 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -51,7 +50,7 @@ protected: }; wxOSXAudioToolboxSoundData::wxOSXAudioToolboxSoundData(const wxString& fileName) : - m_soundID(NULL) + m_soundID(0) { m_sndname = fileName; } diff --git a/Externals/wxWidgets3/src/osx/core/stdpaths_cf.cpp b/Externals/wxWidgets3/src/osx/core/stdpaths_cf.cpp index aebb1d752c..86b34e646c 100644 --- a/Externals/wxWidgets3/src/osx/core/stdpaths_cf.cpp +++ b/Externals/wxWidgets3/src/osx/core/stdpaths_cf.cpp @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2004-10-27 -// RCS-ID: $Id: stdpaths_cf.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2004 David Elliott // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -83,7 +82,7 @@ static wxString BundleRelativeURLToPath(CFURLRef relativeURL) wxCHECK_MSG(absoluteURL, wxEmptyString, wxT("Failed to resolve relative URL to absolute URL")); CFStringRef cfStrPath = CFURLCopyFileSystemPath(absoluteURL,kDefaultPathStyle); CFRelease(absoluteURL); - return wxCFStringRef(cfStrPath).AsString(wxLocale::GetSystemEncoding()); + return wxCFStringRef::AsStringWithNormalizationFormC(cfStrPath); } wxString wxStandardPathsCF::GetFromFunc(wxCFURLRef (*func)(wxCFBundleRef)) const diff --git a/Externals/wxWidgets3/src/osx/core/strconv_cf.cpp b/Externals/wxWidgets3/src/osx/core/strconv_cf.cpp index 0685ba2b45..a385e528b3 100644 --- a/Externals/wxWidgets3/src/osx/core/strconv_cf.cpp +++ b/Externals/wxWidgets3/src/osx/core/strconv_cf.cpp @@ -4,7 +4,6 @@ // Author: David Elliott // Modified by: // Created: 2007-07-06 -// RCS-ID: $Id: strconv_cf.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2007 David Elliott // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/core/timer.cpp b/Externals/wxWidgets3/src/osx/core/timer.cpp index 98cd9d05ea..b78d63c5e6 100644 --- a/Externals/wxWidgets3/src/osx/core/timer.cpp +++ b/Externals/wxWidgets3/src/osx/core/timer.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-07-01 -// RCS-ID: $Id: timer.cpp 65561 2010-09-17 11:17:55Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/core/utilsexc_base.cpp b/Externals/wxWidgets3/src/osx/core/utilsexc_base.cpp index 3476c5a28d..f510abc37a 100644 --- a/Externals/wxWidgets3/src/osx/core/utilsexc_base.cpp +++ b/Externals/wxWidgets3/src/osx/core/utilsexc_base.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 2005-06-21 -// RCS-ID: $Id: utilsexc_base.cpp 68506 2011-08-03 15:46:43Z JS $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence // Notes: Source was originally in utilsexc_cf.cpp,1.6 then moved @@ -54,12 +53,6 @@ extern WXDLLIMPEXP_BASE wxSocketManager *wxOSXSocketManagerCF; wxSocketManager *wxOSXSocketManagerCF = NULL; #endif // wxUSE_SOCKETS -extern bool WXDLLEXPORT wxIsDebuggerRunning() -{ - // TODO : try to find out ... - return false; -} - #if ( !wxUSE_GUI && !wxOSX_USE_IPHONE ) || wxOSX_USE_COCOA_OR_CARBON // have a fast version for mac code that returns the version as a return value diff --git a/Externals/wxWidgets3/src/osx/core/utilsexc_cf.cpp b/Externals/wxWidgets3/src/osx/core/utilsexc_cf.cpp index 394d7fcd2d..2a8c436223 100644 --- a/Externals/wxWidgets3/src/osx/core/utilsexc_cf.cpp +++ b/Externals/wxWidgets3/src/osx/core/utilsexc_cf.cpp @@ -4,8 +4,8 @@ // Author: David Elliott, Ryan Norton (wxMacExecute) // Modified by: Stefan Csomor (added necessary wxT for unicode builds) // Created: 2004-11-04 -// RCS-ID: $Id: utilsexc_cf.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) David Elliott, Ryan Norton +// (c) 2013 Rob Bresalier // Licence: wxWindows licence // Notes: This code comes from src/osx/carbon/utilsexc.cpp,1.11 ///////////////////////////////////////////////////////////////////////////// @@ -15,103 +15,159 @@ #include "wx/log.h" #include "wx/utils.h" #endif //ndef WX_PRECOMP -#include "wx/unix/execute.h" #include "wx/stdpaths.h" #include "wx/app.h" #include "wx/apptrait.h" #include "wx/thread.h" #include "wx/process.h" +#include "wx/evtloop.h" +#include "wx/evtloopsrc.h" +#include "wx/private/eventloopsourcesmanager.h" + #include #include -/*! - Called due to source signal detected by the CFRunLoop. - This is nearly identical to the wxGTK equivalent. - */ -extern "C" void WXCF_EndProcessDetector(CFSocketRef s, - CFSocketCallBackType WXUNUSED(callbackType), - CFDataRef WXUNUSED(address), - void const *WXUNUSED(data), - void *info) -{ - /* - Either our pipe was closed or the process ended successfully. Either way, - we're done. It's not if waitpid is going to magically succeed when - we get fired again. CFSocketInvalidate closes the fd for us and also - invalidates the run loop source for us which should cause it to - release the CFSocket (thus causing it to be deallocated) and remove - itself from the runloop which should release it and cause it to also - be deallocated. Of course, it's possible the RunLoop hangs onto - one or both of them by retaining/releasing them within its stack - frame. However, that shouldn't be depended on. Assume that s is - deallocated due to the following call. - */ - CFSocketInvalidate(s); +#if wxUSE_EVENTLOOP_SOURCE - // Now tell wx that the process has ended. - wxHandleProcessTermination(static_cast(info)); +namespace +{ + +extern "C" +void +wx_socket_callback(CFSocketRef WXUNUSED(s), + CFSocketCallBackType callbackType, + CFDataRef WXUNUSED(address), + void const *WXUNUSED(data), + void *ctxData) +{ + wxLogTrace(wxTRACE_EVT_SOURCE, + "CFSocket callback, type=%d", static_cast(callbackType)); + + wxCFEventLoopSource * const + source = static_cast(ctxData); + + wxEventLoopSourceHandler * const + handler = source->GetHandler(); + + switch ( callbackType ) + { + case kCFSocketReadCallBack: + handler->OnReadWaiting(); + break; + + case kCFSocketWriteCallBack: + handler->OnWriteWaiting(); + break; + + default: + wxFAIL_MSG( "Unexpected callback type." ); + } } -/*! - Implements the GUI-specific AddProcessCallback() for both wxMac and - wxCocoa using the CFSocket/CFRunLoop API which is available to both. - Takes advantage of the fact that sockets on UNIX are just regular - file descriptors and thus even a non-socket file descriptor can - apparently be used with CFSocket so long as you only tell CFSocket - to do things with it that would be valid for a non-socket fd. - */ -int wxGUIAppTraits::AddProcessCallback(wxEndProcessData *proc_data, int fd) +} // anonymous namespace + +class wxCFEventLoopSourcesManager : public wxEventLoopSourcesManagerBase { - static int s_last_tag = 0; - CFSocketContext context = - { 0 - , static_cast(proc_data) - , NULL - , NULL - , NULL - }; - CFSocketRef cfSocket = CFSocketCreateWithNative(kCFAllocatorDefault,fd,kCFSocketReadCallBack,&WXCF_EndProcessDetector,&context); - if(cfSocket == NULL) +public: + wxEventLoopSource * + AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags) { - wxLogError(wxT("Failed to create socket for end process detection")); - return 0; - } - CFRunLoopSourceRef runLoopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, /*highest priority:*/0); - if(runLoopSource == NULL) - { - wxLogError(wxT("Failed to create CFRunLoopSource from CFSocket for end process detection")); - // closes the fd.. we can't really stop it, nor do we necessarily want to. - CFSocketInvalidate(cfSocket); - CFRelease(cfSocket); - return 0; - } - // Now that the run loop source has the socket retained and we no longer - // need to refer to it within this method, we can release it. - CFRelease(cfSocket); + wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); - CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); - // Now that the run loop has the source retained we can release it. - CFRelease(runLoopSource); + wxScopedPtr + source(new wxCFEventLoopSource(handler, flags)); - /* - Feed wx some bullshit.. we don't use it since CFSocket helpfully passes - itself into our callback and that's enough to be able to - CFSocketInvalidate it which is all we need to do to get everything we - just created to be deallocated. - */ - return ++s_last_tag; + CFSocketContext context = { 0, source.get(), NULL, NULL, NULL }; + + int callbackTypes = 0; + if ( flags & wxEVENT_SOURCE_INPUT ) + callbackTypes |= kCFSocketReadCallBack; + if ( flags & wxEVENT_SOURCE_OUTPUT ) + callbackTypes |= kCFSocketWriteCallBack; + + wxCFRef + cfSocket(CFSocketCreateWithNative + ( + kCFAllocatorDefault, + fd, + callbackTypes, + &wx_socket_callback, + &context + )); + + if ( !cfSocket ) + { + wxLogError(wxS("Failed to create event loop source socket.")); + return NULL; + } + + // Adjust the socket options to suit our needs: + CFOptionFlags sockopt = CFSocketGetSocketFlags(cfSocket); + + // First, by default, write callback is not called repeatedly when data + // can be written to the socket but we need this behaviour so request + // it explicitly. + if ( flags & wxEVENT_SOURCE_OUTPUT ) + sockopt |= kCFSocketAutomaticallyReenableWriteCallBack; + + // Second, we use the socket to monitor the FD but it doesn't own it, + // so prevent the FD from being closed when the socket is invalidated. + sockopt &= ~kCFSocketCloseOnInvalidate; + + CFSocketSetSocketFlags(cfSocket, sockopt); + + wxCFRef + runLoopSource(CFSocketCreateRunLoopSource + ( + kCFAllocatorDefault, + cfSocket, + 0 // Lowest index means highest priority + )); + if ( !runLoopSource ) + { + wxLogError(wxS("Failed to create low level event loop source.")); + CFSocketInvalidate(cfSocket); + return NULL; + } + + // Save the socket so that we can remove it later if asked to. + source->InitSourceSocket(cfSocket.release()); + + CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); + + return source.release(); + } +}; + +wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager() +{ + static wxCFEventLoopSourcesManager s_eventLoopSourcesManager; + + return &s_eventLoopSourcesManager; } +#endif // wxUSE_EVENTLOOP_SOURCE + ///////////////////////////////////////////////////////////////////////////// // NOTE: This doesn't really belong here but this was a handy file to // put it in because it's already compiled for wxCocoa and wxMac GUI lib. #if wxUSE_STDPATHS -static wxStandardPathsCF gs_stdPaths; wxStandardPaths& wxGUIAppTraits::GetStandardPaths() { + // Derive a class just to be able to create it: wxStandardPaths ctor is + // protected to prevent its misuse, but it also means we can't create an + // object of this class directly. + class wxStandardPathsDefault : public wxStandardPathsCF + { + public: + wxStandardPathsDefault() { } + }; + + static wxStandardPathsDefault gs_stdPaths; + return gs_stdPaths; } #endif diff --git a/Externals/wxWidgets3/src/osx/dataview_osx.cpp b/Externals/wxWidgets3/src/osx/dataview_osx.cpp index 2e6c92c85f..799e752e15 100644 --- a/Externals/wxWidgets3/src/osx/dataview_osx.cpp +++ b/Externals/wxWidgets3/src/osx/dataview_osx.cpp @@ -2,7 +2,6 @@ // Name: src/osx/dataview_osx.cpp // Purpose: wxDataViewCtrl native mac implementation // Author: -// Id: $Id: dataview_osx.cpp 70377 2012-01-17 14:05:17Z VS $ // Copyright: (c) 2009 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -127,7 +126,7 @@ bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item) if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item)) { // sent the equivalent wxWidget event: - wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); + wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); dataViewEvent.SetEventObject(m_DataViewCtrlPtr); dataViewEvent.SetItem(item); @@ -147,7 +146,7 @@ bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items) { size_t const noOfItems = items.GetCount(); - wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); + wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); dataViewEvent.SetEventObject(m_DataViewCtrlPtr); @@ -213,7 +212,7 @@ bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsign wxCHECK_MSG(GetOwner() != NULL,false,"Owner not initialized."); if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item)) { - wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); + wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId()); dataViewEvent.SetEventObject(m_DataViewCtrlPtr); dataViewEvent.SetColumn(col); @@ -348,6 +347,11 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr) wxDataViewCtrl::~wxDataViewCtrl() { ClearColumns(); + + // Ensure that the already destructed controls is not notified about changes + // in the model any more. + if (m_ModelNotifier != NULL) + m_ModelNotifier->GetOwner()->RemoveNotifier(m_ModelNotifier); } void wxDataViewCtrl::Init() @@ -355,6 +359,7 @@ void wxDataViewCtrl::Init() m_CustomRendererPtr = NULL; m_Deleting = false; m_cgContext = NULL; + m_ModelNotifier = NULL; } bool wxDataViewCtrl::Create(wxWindow *parent, @@ -381,10 +386,19 @@ bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model) wxCHECK_MSG(dataViewWidgetPtr != NULL,false,"Pointer to native control must not be NULL."); + + // We could have been associated with another model previously, break the + // association in this case. + if ( m_ModelNotifier ) + m_ModelNotifier->GetOwner()->RemoveNotifier(m_ModelNotifier); + if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model)) { if (model != NULL) - model->AddNotifier(new wxOSXDataViewModelNotifier(this)); + { + m_ModelNotifier = new wxOSXDataViewModelNotifier(this); + model->AddNotifier(m_ModelNotifier); + } return true; } else diff --git a/Externals/wxWidgets3/src/osx/datectrl_osx.cpp b/Externals/wxWidgets3/src/osx/datectrl_osx.cpp index 9739977155..c10b778068 100644 --- a/Externals/wxWidgets3/src/osx/datectrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/datectrl_osx.cpp @@ -3,7 +3,6 @@ // Purpose: Implementation of wxDatePickerCtrl for OS X. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: datectrl_osx.cpp 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/datetimectrl_osx.cpp b/Externals/wxWidgets3/src/osx/datetimectrl_osx.cpp index 45a65dd8ab..628fb8be5d 100644 --- a/Externals/wxWidgets3/src/osx/datetimectrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/datetimectrl_osx.cpp @@ -3,7 +3,6 @@ // Purpose: Implementation of wxDateTimePickerCtrl for OS X. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: datetimectrl_osx.cpp 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -28,6 +27,7 @@ #ifndef WX_PRECOMP #endif // WX_PRECOMP +#include "wx/datectrl.h" #include "wx/datetimectrl.h" #include "wx/osx/core/private/datetimectrl.h" @@ -43,7 +43,19 @@ wxDateTimeWidgetImpl* wxDateTimePickerCtrl::GetDateTimePeer() const void wxDateTimePickerCtrl::SetValue(const wxDateTime& dt) { - GetDateTimePeer()->SetDateTime(dt); + if ( dt.IsValid() ) + { + GetDateTimePeer()->SetDateTime(dt); + } + else // invalid date + { + wxASSERT_MSG( HasFlag(wxDP_ALLOWNONE), + wxT("this control must have a valid date") ); + + // TODO setting to an invalid date is not natively supported + // so we must implement a UI for that ourselves + GetDateTimePeer()->SetDateTime(dt); + } } wxDateTime wxDateTimePickerCtrl::GetValue() const diff --git a/Externals/wxWidgets3/src/osx/dialog_osx.cpp b/Externals/wxWidgets3/src/osx/dialog_osx.cpp index 56a106f713..fe870deaed 100644 --- a/Externals/wxWidgets3/src/osx/dialog_osx.cpp +++ b/Externals/wxWidgets3/src/osx/dialog_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dialog_osx.cpp 68719 2011-08-16 12:00:52Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,6 +12,7 @@ #include "wx/dialog.h" #include "wx/evtloop.h" +#include "wx/modalhook.h" #ifndef WX_PRECOMP #include "wx/app.h" @@ -115,7 +115,12 @@ bool wxDialog::Show(bool show) if ( !show ) { - switch( m_modality ) + const int modalityOrig = m_modality; + + // complete the 'hiding' before we send the event + m_modality = wxDIALOG_MODALITY_NONE; + + switch ( modalityOrig ) { case wxDIALOG_MODALITY_WINDOW_MODAL: EndWindowModal(); // OS X implementation method for cleanup @@ -124,7 +129,6 @@ bool wxDialog::Show(bool show) default: break; } - m_modality = wxDIALOG_MODALITY_NONE; } return true; @@ -133,6 +137,8 @@ bool wxDialog::Show(bool show) // Replacement for Show(true) for modal dialogs - returns return code int wxDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + m_modality = wxDIALOG_MODALITY_APP_MODAL; Show(); diff --git a/Externals/wxWidgets3/src/osx/dnd_osx.cpp b/Externals/wxWidgets3/src/osx/dnd_osx.cpp index 1cafad2d4a..ab6f153b53 100644 --- a/Externals/wxWidgets3/src/osx/dnd_osx.cpp +++ b/Externals/wxWidgets3/src/osx/dnd_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dnd_osx.cpp 69677 2011-11-05 11:23:48Z VZ $ // Copyright: (c) 1998 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/fontutil.cpp b/Externals/wxWidgets3/src/osx/fontutil.cpp index 600d4acd6c..35d9cdc62b 100644 --- a/Externals/wxWidgets3/src/osx/fontutil.cpp +++ b/Externals/wxWidgets3/src/osx/fontutil.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Stefan Csomor // Modified by: // Created: 05.11.99 -// RCS-ID: $Id: fontutil.cpp 54962 2008-08-03 17:34:59Z SC $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/gauge_osx.cpp b/Externals/wxWidgets3/src/osx/gauge_osx.cpp index ed9b22c4c7..40e4c71cd8 100644 --- a/Externals/wxWidgets3/src/osx/gauge_osx.cpp +++ b/Externals/wxWidgets3/src/osx/gauge_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: gauge_osx.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/glcanvas_osx.cpp b/Externals/wxWidgets3/src/osx/glcanvas_osx.cpp index 5e53aabfc4..3610ccff48 100644 --- a/Externals/wxWidgets3/src/osx/glcanvas_osx.cpp +++ b/Externals/wxWidgets3/src/osx/glcanvas_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: glcanvas_osx.cpp 65561 2010-09-17 11:17:55Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/imaglist.cpp b/Externals/wxWidgets3/src/osx/imaglist.cpp index 89f851940a..300a143bfd 100644 --- a/Externals/wxWidgets3/src/osx/imaglist.cpp +++ b/Externals/wxWidgets3/src/osx/imaglist.cpp @@ -2,7 +2,6 @@ // Name: src/osx/imaglist.cpp // Purpose: // Author: Robert Roebling -// RCS_ID: $Id: imaglist.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -74,16 +73,16 @@ int wxImageList::Add( const wxIcon &bitmap ) int wxImageList::Add( const wxBitmap &bitmap ) { - wxASSERT_MSG( (bitmap.GetWidth() >= m_width && bitmap.GetHeight() == m_height) + wxASSERT_MSG( (bitmap.GetScaledWidth() >= m_width && bitmap.GetScaledHeight() == m_height) || (m_width == 0 && m_height == 0), wxT("invalid bitmap size in wxImageList: this might work ") wxT("on this platform but definitely won't under Windows.") ); // Mimic behaviour of Windows ImageList_Add that automatically breaks up the added // bitmap into sub-images of the correct size - if (m_width > 0 && bitmap.GetWidth() > m_width && bitmap.GetHeight() >= m_height) + if (m_width > 0 && bitmap.GetScaledWidth() > m_width && bitmap.GetScaledHeight() >= m_height) { - int numImages = bitmap.GetWidth() / m_width; + int numImages = bitmap.GetScaledWidth() / m_width; for (int subIndex = 0; subIndex < numImages; subIndex++) { wxRect rect(m_width * subIndex, 0, m_width, m_height); @@ -98,8 +97,8 @@ int wxImageList::Add( const wxBitmap &bitmap ) if (m_width == 0 && m_height == 0) { - m_width = bitmap.GetWidth(); - m_height = bitmap.GetHeight(); + m_width = bitmap.GetScaledWidth(); + m_height = bitmap.GetScaledHeight(); } return m_images.GetCount() - 1; @@ -276,8 +275,8 @@ bool wxImageList::GetSize( int index, int &width, int &height ) const else { wxBitmap *bm = static_cast< wxBitmap* >(obj ) ; - width = bm->GetWidth(); - height = bm->GetHeight(); + width = bm->GetScaledWidth(); + height = bm->GetScaledHeight(); } return true; diff --git a/Externals/wxWidgets3/src/osx/iphone/anybutton.mm b/Externals/wxWidgets3/src/osx/iphone/anybutton.mm index ffdf3262e4..f9182c3170 100644 --- a/Externals/wxWidgets3/src/osx/iphone/anybutton.mm +++ b/Externals/wxWidgets3/src/osx/iphone/anybutton.mm @@ -3,7 +3,6 @@ // Purpose: wxAnyButton // Author: Stefan Csomor // Created: 1998-01-01 (extracted from button.mm) -// RCS-ID: $Id: anybutton.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/button.mm b/Externals/wxWidgets3/src/osx/iphone/button.mm index f50d62946c..8ee98a3571 100644 --- a/Externals/wxWidgets3/src/osx/iphone/button.mm +++ b/Externals/wxWidgets3/src/osx/iphone/button.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: button.mm 67931 2011-06-14 13:00:42Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/checkbox.mm b/Externals/wxWidgets3/src/osx/iphone/checkbox.mm index 9f6acc292a..de9f8c0876 100644 --- a/Externals/wxWidgets3/src/osx/iphone/checkbox.mm +++ b/Externals/wxWidgets3/src/osx/iphone/checkbox.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-08-20 -// RCS-ID: $Id: checkbox.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/dialog.mm b/Externals/wxWidgets3/src/osx/iphone/dialog.mm index 3c29fd61af..88beac34c3 100644 --- a/Externals/wxWidgets3/src/osx/iphone/dialog.mm +++ b/Externals/wxWidgets3/src/osx/iphone/dialog.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: dialog.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/evtloop.mm b/Externals/wxWidgets3/src/osx/iphone/evtloop.mm index 149ae67683..f928274e41 100644 --- a/Externals/wxWidgets3/src/osx/iphone/evtloop.mm +++ b/Externals/wxWidgets3/src/osx/iphone/evtloop.mm @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin, Stefan Csomor // Modified by: // Created: 2006-01-12 -// RCS-ID: $Id: evtloop.mm 69525 2011-10-25 11:51:36Z SC $ // Copyright: (c) 2006 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -83,7 +82,7 @@ wxGUIEventLoop::wxGUIEventLoop() { } -void wxGUIEventLoop::DoRun() +void wxGUIEventLoop::OSXDoRun() { if ( IsMain() ) { @@ -93,7 +92,7 @@ void wxGUIEventLoop::DoRun() } else { - wxCFEventLoop::DoRun(); + wxCFEventLoop::OSXDoRun(); } } @@ -102,9 +101,9 @@ int wxGUIEventLoop::DoDispatchTimeout(unsigned long timeout) return wxCFEventLoop::DoDispatchTimeout(timeout); } -void wxGUIEventLoop::DoStop() +void wxGUIEventLoop::OSXDoStop() { - return wxCFEventLoop::DoStop(); + return wxCFEventLoop::OSXDoStop(); } CFRunLoopRef wxGUIEventLoop::CFGetCurrentRunLoop() const @@ -136,12 +135,12 @@ wxModalEventLoop::wxModalEventLoop(WXWindow modalNativeWindow) // END move into a evtloop_osx.cpp -void wxModalEventLoop::DoRun() +void wxModalEventLoop::OSXDoRun() { // presentModalViewController:animated: } -void wxModalEventLoop::DoStop() +void wxModalEventLoop::OSXDoStop() { // (void)dismissModalViewControllerAnimated:(BOOL)animated } diff --git a/Externals/wxWidgets3/src/osx/iphone/gauge.mm b/Externals/wxWidgets3/src/osx/iphone/gauge.mm index 347184145f..7ea73e294a 100644 --- a/Externals/wxWidgets3/src/osx/iphone/gauge.mm +++ b/Externals/wxWidgets3/src/osx/iphone/gauge.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: gauge.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/glcanvas.mm b/Externals/wxWidgets3/src/osx/iphone/glcanvas.mm index 3c3609a62c..9883f9f0e3 100644 --- a/Externals/wxWidgets3/src/osx/iphone/glcanvas.mm +++ b/Externals/wxWidgets3/src/osx/iphone/glcanvas.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: glcanvas.mm 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -142,15 +141,13 @@ - (void) setContext:(EAGLContext*) ctx { context = ctx; [EAGLContext setCurrentContext:ctx]; -#if 0 - CGRect newRect = [self frame]; - if ( /* (CGRectEqualToRect(newRect, oldRect) == NO && ![self isHidden] && newRect.size.width > 0 && newRect.size.height > 0 ) - || */ viewFramebuffer == 0 ) + + if ( viewFramebuffer == 0 ) { [self destroyFramebuffer]; [self createFramebuffer]; } -#endif + glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); } diff --git a/Externals/wxWidgets3/src/osx/iphone/msgdlg.mm b/Externals/wxWidgets3/src/osx/iphone/msgdlg.mm index cf9f31e98e..3431cb5a91 100644 --- a/Externals/wxWidgets3/src/osx/iphone/msgdlg.mm +++ b/Externals/wxWidgets3/src/osx/iphone/msgdlg.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: msgdlg.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,6 +19,7 @@ #include "wx/thread.h" #include "wx/osx/private.h" +#include "wx/modalhook.h" IMPLEMENT_CLASS(wxMessageDialog, wxDialog) @@ -36,6 +36,8 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, int wxMessageDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + int resultbutton = wxID_CANCEL; const long style = GetMessageDialogStyle(); diff --git a/Externals/wxWidgets3/src/osx/iphone/nonownedwnd.mm b/Externals/wxWidgets3/src/osx/iphone/nonownedwnd.mm index 6707e674ad..b7082f89c8 100644 --- a/Externals/wxWidgets3/src/osx/iphone/nonownedwnd.mm +++ b/Externals/wxWidgets3/src/osx/iphone/nonownedwnd.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-06-20 -// RCS-ID: $Id: nonownedwnd.mm 69526 2011-10-25 11:52:02Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -352,7 +351,15 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) wxWidgetIPhoneImpl* impl = new wxWidgetIPhoneImpl( now, contentview, true ); impl->InstallEventHandler(); - [toplevelwindow addSubview:contentview]; + + if ([toplevelwindow respondsToSelector:@selector(setRootViewController:)]) + { + toplevelwindow.rootViewController = controller; + } + else + { + [toplevelwindow addSubview:contentview]; + } return impl; } @@ -396,6 +403,21 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) return YES; } +// iOS 6 support, right now unconditionally supporting all orientations, TODO use a orientation mask + +-(BOOL)shouldAutorotate +{ + return YES; +} + + - (NSUInteger)supportedInterfaceOrientations +{ + return UIInterfaceOrientationMaskAll; +} + + + + - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { wxWidgetIPhoneImpl* impl = (wxWidgetIPhoneImpl* ) wxWidgetImpl::FindFromWXWidget( [self view] ); @@ -454,6 +476,7 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) footerView = frame->GetToolBar()->GetHandle(); } } + return footerView; } @end diff --git a/Externals/wxWidgets3/src/osx/iphone/scrolbar.mm b/Externals/wxWidgets3/src/osx/iphone/scrolbar.mm index 5b091a4fce..031feeb088 100644 --- a/Externals/wxWidgets3/src/osx/iphone/scrolbar.mm +++ b/Externals/wxWidgets3/src/osx/iphone/scrolbar.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/slider.mm b/Externals/wxWidgets3/src/osx/iphone/slider.mm index f91de107ea..eb22a66e6c 100644 --- a/Externals/wxWidgets3/src/osx/iphone/slider.mm +++ b/Externals/wxWidgets3/src/osx/iphone/slider.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: slider.mm 67232 2011-03-18 15:10:15Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/stattext.mm b/Externals/wxWidgets3/src/osx/iphone/stattext.mm index debf6b625e..b0994d0733 100644 --- a/Externals/wxWidgets3/src/osx/iphone/stattext.mm +++ b/Externals/wxWidgets3/src/osx/iphone/stattext.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: stattext.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/iphone/textctrl.mm b/Externals/wxWidgets3/src/osx/iphone/textctrl.mm index 3f27e13848..8fa70b90ad 100644 --- a/Externals/wxWidgets3/src/osx/iphone/textctrl.mm +++ b/Externals/wxWidgets3/src/osx/iphone/textctrl.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Ryan Norton (MLTE GetLineLength and GetLineText) // Created: 1998-01-01 -// RCS-ID: $Id: textctrl.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -189,7 +188,7 @@ protected : wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); if ( wxpeer && wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); + wxCommandEvent event(wxEVT_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( static_cast(wxpeer)->GetValue() ); wxpeer->HandleWindowEvent( event ); @@ -663,7 +662,7 @@ void wxUITextFieldControl::controlAction(WXWidget WXUNUSED(slf), wxWindow* wxpeer = (wxWindow*) GetWXPeer(); if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); + wxCommandEvent event(wxEVT_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( static_cast(wxpeer)->GetValue() ); wxpeer->HandleWindowEvent( event ); @@ -674,6 +673,7 @@ bool wxUITextFieldControl::SetHint(const wxString& hint) { wxCFStringRef hintstring(hint); [m_textField setPlaceholder:hintstring.AsNSString()]; + return true; } #endif diff --git a/Externals/wxWidgets3/src/osx/iphone/toolbar.mm b/Externals/wxWidgets3/src/osx/iphone/toolbar.mm index 4308b3c9f5..589c3f7028 100644 --- a/Externals/wxWidgets3/src/osx/iphone/toolbar.mm +++ b/Externals/wxWidgets3/src/osx/iphone/toolbar.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: toolbar.mm 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -249,6 +248,7 @@ bool wxToolBar::Create( SetPeer(new wxWidgetIPhoneImpl( this, toolbar )); MacPostControlCreate(pos, size) ; + return true; } wxToolBar::~wxToolBar() diff --git a/Externals/wxWidgets3/src/osx/iphone/utils.mm b/Externals/wxWidgets3/src/osx/iphone/utils.mm index d2d0f55ac3..633c7b72ac 100644 --- a/Externals/wxWidgets3/src/osx/iphone/utils.mm +++ b/Externals/wxWidgets3/src/osx/iphone/utils.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utils.mm 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -39,13 +38,6 @@ #if 1 // wxUSE_BASE -// Emit a beeeeeep -void wxBell() -{ - // would be kSystemSoundID_UserPreferredAlert but since the headers aren't correct, add it manually - AudioServicesPlayAlertSound(0x00001000 ); -} - // ---------------------------------------------------------------------------- // Common Event Support // ---------------------------------------------------------------------------- @@ -57,13 +49,21 @@ void wxBell() @implementation wxAppDelegate +- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + wxUnusedVar(application); + wxUnusedVar(launchOptions); + wxTheApp->OSXOnWillFinishLaunching(); + return YES; +} + - (void)applicationDidFinishLaunching:(UIApplication *)application { - wxTheApp->OnInit(); + wxTheApp->OSXOnDidFinishLaunching(); } - (void)applicationWillTerminate:(UIApplication *)application { - wxCloseEvent event; - wxTheApp->OnEndSession(event); + wxUnusedVar(application); + wxTheApp->OSXOnWillTerminate(); } - (void)dealloc { @@ -91,6 +91,13 @@ void wxApp::DoCleanUp() #if wxUSE_GUI +// Emit a beeeeeep +void wxBell() +{ + // would be kSystemSoundID_UserPreferredAlert but since the headers aren't correct, add it manually + AudioServicesPlayAlertSound(0x00001000 ); +} + // ---------------------------------------------------------------------------- // Launch default browser // ---------------------------------------------------------------------------- @@ -118,6 +125,11 @@ extern UIFont* CreateUIFont( const wxFont& font ) return [UIFont fontWithName:wxCFStringRef(font.GetFaceName() ).AsNSString() size:font.GetPointSize()]; } +CFArrayRef CopyAvailableFontFamilyNames() +{ + return (CFArrayRef) [[UIFont familyNames] retain]; +} + extern void DrawTextInContext( CGContextRef context, CGPoint where, UIFont *font, NSString* text ) { bool contextChanged = ( UIGraphicsGetCurrentContext() != context ); diff --git a/Externals/wxWidgets3/src/osx/iphone/window.mm b/Externals/wxWidgets3/src/osx/iphone/window.mm index 2a71b7fc23..b4b8c4ac36 100644 --- a/Externals/wxWidgets3/src/osx/iphone/window.mm +++ b/Externals/wxWidgets3/src/osx/iphone/window.mm @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2008-06-20 -// RCS-ID: $Id: window.mm 69754 2011-11-14 07:52:33Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -561,10 +560,22 @@ void wxWidgetIPhoneImpl::GetBestRect( wxRect *r ) const bool wxWidgetIPhoneImpl::IsEnabled() const { + UIView* targetView = m_osxView; + // TODO add support for documentViews + + if ( [targetView respondsToSelector:@selector(isEnabled) ] ) + return [targetView isEnabled]; + + return true; } void wxWidgetIPhoneImpl::Enable( bool enable ) { + UIView* targetView = m_osxView; + // TODO add support for documentViews + + if ( [targetView respondsToSelector:@selector(setEnabled:) ] ) + [targetView setEnabled:enable]; } void wxWidgetIPhoneImpl::SetMinimum( wxInt32 v ) @@ -577,10 +588,12 @@ void wxWidgetIPhoneImpl::SetMaximum( wxInt32 v ) wxInt32 wxWidgetIPhoneImpl::GetMinimum() const { + return 0; } wxInt32 wxWidgetIPhoneImpl::GetMaximum() const { + return 0; } void wxWidgetIPhoneImpl::PulseGauge() @@ -595,7 +608,7 @@ void wxWidgetIPhoneImpl::SetControlSize( wxWindowVariant variant ) { } -float wxWidgetIPhoneImpl::GetContentScaleFactor() const +double wxWidgetIPhoneImpl::GetContentScaleFactor() const { if ( [m_osxView respondsToSelector:@selector(contentScaleFactor) ]) return [m_osxView contentScaleFactor]; @@ -779,7 +792,7 @@ void wxWidgetIPhoneImpl::controlTextDidChange() wxTextCtrl* wxpeer = wxDynamicCast((wxWindow*)GetWXPeer(),wxTextCtrl); if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); + wxCommandEvent event(wxEVT_TEXT, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( wxpeer->GetValue() ); wxpeer->HandleWindowEvent( event ); diff --git a/Externals/wxWidgets3/src/osx/listbox_osx.cpp b/Externals/wxWidgets3/src/osx/listbox_osx.cpp index 8d6182dd9b..c48607ea5a 100644 --- a/Externals/wxWidgets3/src/osx/listbox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/listbox_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: listbox_osx.cpp 70685 2012-02-25 22:29:25Z JS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -133,6 +132,11 @@ void wxListBox::FreeData() void wxListBox::DoSetFirstItem(int n) { + // osx actually only has an implementation for ensuring the visibility of a row, it does so + // by scrolling the minimal amount necessary from the current scrolling position. + // in order to get the same behaviour I'd have to make sure first that the last line is visible, + // followed by a scrollRowToVisible for the desired line + GetListPeer()->ListScrollTo( GetCount()-1 ); GetListPeer()->ListScrollTo( n ); } @@ -388,8 +392,8 @@ void wxListBox::SetString(unsigned int n, const wxString& s) void wxListBox::HandleLineEvent( unsigned int n, bool doubleClick ) { - wxCommandEvent event( doubleClick ? wxEVT_COMMAND_LISTBOX_DOUBLECLICKED : - wxEVT_COMMAND_LISTBOX_SELECTED, GetId() ); + wxCommandEvent event( doubleClick ? wxEVT_LISTBOX_DCLICK : + wxEVT_LISTBOX, GetId() ); event.SetEventObject( this ); if ( HasClientObjectData() ) event.SetClientObject( GetClientObject(n) ); diff --git a/Externals/wxWidgets3/src/osx/menu_osx.cpp b/Externals/wxWidgets3/src/osx/menu_osx.cpp index ffd9f3c0e0..2bf5cede9e 100644 --- a/Externals/wxWidgets3/src/osx/menu_osx.cpp +++ b/Externals/wxWidgets3/src/osx/menu_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: menu_osx.cpp 70480 2012-01-30 16:25:22Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -57,7 +56,6 @@ static const int idMenuTitle = -3; void wxMenu::Init() { m_doBreak = false; - m_startRadioGroup = -1; m_allowRearrange = true; m_noEventsMode = false; @@ -89,13 +87,6 @@ void wxMenu::Break() // not available on the mac platform } -void wxMenu::Attach(wxMenuBarBase *menubar) -{ - wxMenuBase::Attach(menubar); - - EndRadioGroup(); -} - void wxMenu::SetAllowRearrange( bool allow ) { m_allowRearrange = allow; @@ -108,18 +99,20 @@ void wxMenu::SetNoEventsMode( bool noEvents ) // function appends a new item or submenu to the menu // append a new item or submenu to the menu -bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) +bool wxMenu::DoInsertOrAppend(wxMenuItem *item, size_t pos) { - wxASSERT_MSG( pItem != NULL, wxT("can't append NULL item to the menu") ); - GetPeer()->InsertOrAppend( pItem, pos ); + wxASSERT_MSG( item != NULL, wxT("can't append NULL item to the menu") ); + GetPeer()->InsertOrAppend( item, pos ); - if ( pItem->IsSeparator() ) + bool check = false; + + if ( item->IsSeparator() ) { // nothing to do here } else { - wxMenu *pSubMenu = pItem->GetSubMenu() ; + wxMenu *pSubMenu = item->GetSubMenu() ; if ( pSubMenu != NULL ) { wxASSERT_MSG( pSubMenu->GetHMenu() != NULL , wxT("invalid submenu added")); @@ -127,10 +120,112 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) pSubMenu->DoRearrange(); } + else if ( item->IsRadio() ) + { + // If a previous or next item is a radio button, add this radio + // button to the existing radio group. Otherwise start a new one + // for it. + wxMenuItemList& items = GetMenuItems(); + + size_t const + posItem = pos == (size_t)-1 ? items.GetCount() - 1 : pos; + + wxMenuItemList::compatibility_iterator node = items.Item(posItem); + wxCHECK_MSG( node, false, wxS("New item must have been inserted") ); + + bool foundGroup = false; + if ( node->GetPrevious() ) + { + wxMenuItem* const prev = node->GetPrevious()->GetData(); + + if ( prev->IsRadio() ) + { + // This item is in the same group as the preceding one so + // we should use the same starting item, but getting it is + // a bit difficult as we can't query the start radio group + // item for it. + const int groupStart = prev->IsRadioGroupStart() + ? posItem - 1 + : prev->GetRadioGroupStart(); + item->SetRadioGroupStart(groupStart); + + // We must also account for the new item by incrementing + // the index of the last item in this group. + wxMenuItem* const first = items.Item(groupStart)->GetData(); + first->SetRadioGroupEnd(first->GetRadioGroupEnd() + 1); + + foundGroup = true; + } + } + + if ( !foundGroup && node->GetNext() ) + { + wxMenuItem* const next = node->GetNext()->GetData(); + + if ( next->IsRadio() ) + { + // This item is the new starting item of this group as the + // previous item is not a radio item. + wxASSERT_MSG( next->IsRadioGroupStart(), + wxS("Where is the start of this group?") ); + + // The index of the last item of the radio group must be + // incremented to account for the new item. + item->SetAsRadioGroupStart(); + item->SetRadioGroupEnd(next->GetRadioGroupEnd() + 1); + + // And the previous start item is not one any longer. + next->SetAsRadioGroupStart(false); + + foundGroup = true; + } + } + + if ( !foundGroup ) + { + // start a new radio group + item->SetAsRadioGroupStart(); + item->SetRadioGroupEnd(posItem); + + // ensure that we have a checked item in the radio group + check = true; + } + } else { - if ( pItem->GetId() == idMenuTitle ) - pItem->GetMenu()->Enable( idMenuTitle, false ); + if ( item->GetId() == idMenuTitle ) + item->GetMenu()->Enable( idMenuTitle, false ); + } + } + + // We also need to update the indices of radio group start and end we store + // in any existing radio items after this item. + if ( pos < GetMenuItemCount() - 1 ) // takes into account pos == -1 case + { + for ( wxMenuItemList::compatibility_iterator + node = GetMenuItems().Item(pos + 1); + node; + node = node->GetNext() ) + { + wxMenuItem* const item = node->GetData(); + if ( item->IsRadio() ) + { + if ( item->IsRadioGroupStart() ) + { + // If the starting item is after the just inserted one, + // then the end one must be after it too and needs to be + // updated. + item->SetRadioGroupEnd(item->GetRadioGroupEnd() + 1); + } + else // Not the first radio group item. + { + // We need to update the start item index only if it is + // after the just inserted item. + const int groupStart = item->GetRadioGroupStart(); + if ( (size_t)groupStart > pos ) + item->SetRadioGroupStart(groupStart + 1); + } + } } } @@ -138,66 +233,18 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) if ( IsAttached() && GetMenuBar()->IsAttached() ) GetMenuBar()->Refresh(); - return true ; -} + if ( check ) + item->Check(true); -void wxMenu::EndRadioGroup() -{ - // we're not inside a radio group any longer - m_startRadioGroup = -1; + return true ; } wxMenuItem* wxMenu::DoAppend(wxMenuItem *item) { - wxCHECK_MSG( item, NULL, wxT("NULL item in wxMenu::DoAppend") ); + if (wxMenuBase::DoAppend(item) && DoInsertOrAppend(item) ) + return item; - bool check = false; - - if ( item->GetKind() == wxITEM_RADIO ) - { - int count = GetMenuItemCount(); - - if ( m_startRadioGroup == -1 ) - { - // start a new radio group - m_startRadioGroup = count; - - // for now it has just one element - item->SetAsRadioGroupStart(); - item->SetRadioGroupEnd(m_startRadioGroup); - - // ensure that we have a checked item in the radio group - check = true; - } - else // extend the current radio group - { - // we need to update its end item - item->SetRadioGroupStart(m_startRadioGroup); - wxMenuItemList::compatibility_iterator node = GetMenuItems().Item(m_startRadioGroup); - - if ( node ) - { - node->GetData()->SetRadioGroupEnd(count); - } - else - { - wxFAIL_MSG( wxT("where is the radio group start item?") ); - } - } - } - else // not a radio item - { - EndRadioGroup(); - } - - if ( !wxMenuBase::DoAppend(item) || !DoInsertOrAppend(item) ) - return NULL; - - if ( check ) - // check the item initially - item->Check(true); - - return item; + return NULL; } wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item) @@ -210,14 +257,33 @@ wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item) wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) { - if ( m_startRadioGroup != -1 ) + if ( item->IsRadio() ) { // Check if we're removing the item starting the radio group - if ( GetMenuItems().Item(m_startRadioGroup)->GetData() == item ) + if ( item->IsRadioGroupStart() ) { - // Yes, we do, so reset its index as the next item added shouldn't - // count as part of the same radio group anyhow. - m_startRadioGroup = -1; + // Yes, we do, update the next radio group item, if any, to be the + // start one now. + const int endGroup = item->GetRadioGroupEnd(); + + wxMenuItemList::compatibility_iterator + node = GetMenuItems().Item(endGroup); + wxASSERT_MSG( node, wxS("Should have valid radio group end") ); + + while ( node->GetData() != item ) + { + const wxMenuItemList::compatibility_iterator + prevNode = node->GetPrevious(); + wxMenuItem* const prevItem = prevNode->GetData(); + if ( prevItem == item ) + { + prevItem->SetAsRadioGroupStart(); + prevItem->SetRadioGroupEnd(endGroup); + break; + } + + node = prevNode; + } } } @@ -428,7 +494,7 @@ bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow ) { if ( senderWindow != NULL ) { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED , menuid); + wxCommandEvent event(wxEVT_MENU , menuid); event.SetEventObject(this); event.SetInt(item->IsCheckable() ? item->IsChecked() : -1); @@ -517,10 +583,37 @@ wxMenuBar* wxMenuBar::s_macCommonMenuBar = NULL ; bool wxMenuBar::s_macAutoWindowMenu = true ; WXHMENU wxMenuBar::s_macWindowMenuHandle = NULL ; + +wxMenu* emptyMenuBar = NULL; + const int firstMenuPos = 1; // to account for the 0th application menu on mac void wxMenuBar::Init() { + if ( emptyMenuBar == NULL ) + { + emptyMenuBar = new wxMenu(); + + wxMenu* appleMenu = new wxMenu(); + appleMenu->SetAllowRearrange(false); +#if !wxOSX_USE_CARBON + // standard menu items, handled in wxMenu::HandleCommandProcess(), see above: + wxString hideLabel; + hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); + appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" ); + appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" ); + appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") ); + appleMenu->AppendSeparator(); + + // Do always add "Quit" item unconditionally however, it can't be disabled. + wxString quitLabel; + quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); + appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" ); +#endif // !wxOSX_USE_CARBON + + emptyMenuBar->AppendSubMenu(appleMenu, "\x14") ; + } + m_eventHandler = this; m_menuBarFrame = NULL; m_rootMenu = new wxMenu(); @@ -598,8 +691,16 @@ wxMenuBar::~wxMenuBar() if (s_macInstalledMenuBar == this) { + emptyMenuBar->GetPeer()->MakeRoot(); s_macInstalledMenuBar = NULL; } + wxDELETE( m_rootMenu ); + // apple menu is a submenu, therefore we don't have to delete it + m_appleMenu = NULL; + + // deleting the root menu also removes all its wxMenu* submenus, therefore + // we must avoid double deleting them in the superclass destructor + m_menus.clear(); } void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(rect)) @@ -616,11 +717,10 @@ void wxMenuBar::MacInstallMenuBar() // hide items in the apple menu that don't exist in the wx menubar - int menuid = 0; wxMenuItem* appleItem = NULL; wxMenuItem* wxItem = NULL; - menuid = wxApp::s_macAboutMenuItemId; + int menuid = wxApp::s_macAboutMenuItemId; appleItem = m_appleMenu->FindItem(menuid); wxItem = FindItem(menuid); if ( appleItem != NULL ) @@ -889,6 +989,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) return false; m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) ); + menu->SetTitle(title); return true; } diff --git a/Externals/wxWidgets3/src/osx/menuitem_osx.cpp b/Externals/wxWidgets3/src/osx/menuitem_osx.cpp index bf1e4f7931..34a9996173 100644 --- a/Externals/wxWidgets3/src/osx/menuitem_osx.cpp +++ b/Externals/wxWidgets3/src/osx/menuitem_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: menuitem_osx.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -218,9 +217,9 @@ void wxMenuItem::UpdateItemText() // radio group stuff // ----------------- -void wxMenuItem::SetAsRadioGroupStart() +void wxMenuItem::SetAsRadioGroupStart(bool start) { - m_isRadioGroupStart = true; + m_isRadioGroupStart = start; } void wxMenuItem::SetRadioGroupStart(int start) @@ -239,6 +238,27 @@ void wxMenuItem::SetRadioGroupEnd(int end) m_radioGroup.end = end; } +bool wxMenuItem::IsRadioGroupStart() const +{ + return m_isRadioGroupStart; +} + +int wxMenuItem::GetRadioGroupStart() const +{ + wxASSERT_MSG( !m_isRadioGroupStart, + wxS("shouldn't be called for the first radio item") ); + + return m_radioGroup.start; +} + +int wxMenuItem::GetRadioGroupEnd() const +{ + wxASSERT_MSG( m_isRadioGroupStart, + wxS("shouldn't be called for the first radio item") ); + + return m_radioGroup.end; +} + // ---------------------------------------------------------------------------- // wxMenuItemBase // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/minifram.cpp b/Externals/wxWidgets3/src/osx/minifram.cpp index 56b0228822..0b5e463efd 100644 --- a/Externals/wxWidgets3/src/osx/minifram.cpp +++ b/Externals/wxWidgets3/src/osx/minifram.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: minifram.cpp 54962 2008-08-03 17:34:59Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp b/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp index 95a0ba3a14..9e7f1e185c 100644 --- a/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp +++ b/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of wxNonOwnedWindow // Author: Stefan Csomor // Created: 2008-03-24 -// RCS-ID: $Id: nonownedwnd_osx.cpp 70765 2012-03-01 15:04:42Z JS $ // Copyright: (c) Stefan Csomor 2008 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -249,10 +248,7 @@ bool wxNonOwnedWindow::OSXShowWithEffect(bool show, { // as apps expect a size event to occur when the window is shown, // generate one when it is shown with effect too - MacOnInternalSize(); - wxSizeEvent event(GetSize(), m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } return true; @@ -310,13 +306,9 @@ void wxNonOwnedWindow::HandleActivated( double timestampsec, bool didActivate ) HandleWindowEvent(wxevent); } -void wxNonOwnedWindow::HandleResized( double timestampsec ) +void wxNonOwnedWindow::HandleResized( double WXUNUSED(timestampsec) ) { - MacOnInternalSize(); - wxSizeEvent wxevent( GetSize() , GetId()); - wxevent.SetTimestamp( (int) (timestampsec * 1000) ); - wxevent.SetEventObject( this ); - HandleWindowEvent(wxevent); + SendSizeEvent(); // we have to inform some controls that have to reset things // relative to the toplevel window (e.g. OpenGL buffers) wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified @@ -387,10 +379,7 @@ bool wxNonOwnedWindow::Show(bool show) if ( show ) { // because apps expect a size event to occur at this moment - MacOnInternalSize(); - wxSizeEvent event(GetSize() , m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } return true ; @@ -507,6 +496,11 @@ WXWindow wxNonOwnedWindow::GetWXWindow() const return m_nowpeer ? m_nowpeer->GetWXWindow() : NULL; } +void *wxNonOwnedWindow::OSXGetViewOrWindow() const +{ + return GetWXWindow(); +} + // --------------------------------------------------------------------------- // Shape implementation // --------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/notebook_osx.cpp b/Externals/wxWidgets3/src/osx/notebook_osx.cpp index 218a984007..59a329d5e7 100644 --- a/Externals/wxWidgets3/src/osx/notebook_osx.cpp +++ b/Externals/wxWidgets3/src/osx/notebook_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: notebook_osx.cpp 70340 2012-01-14 17:57:08Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -173,11 +172,19 @@ wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage) wxNotebookPage* page = m_pages[nPage] ; m_pages.RemoveAt(nPage); + m_images.RemoveAt(nPage); MacSetupTabs(); - if (m_selection >= (int)GetPageCount()) - m_selection = GetPageCount() - 1; + if ( m_selection >= (int)nPage ) + { + if ( GetPageCount() == 0 ) + m_selection = wxNOT_FOUND; + else + m_selection = m_selection ? m_selection - 1 : 0; + + GetPeer()->SetValue( m_selection + 1 ) ; + } if (m_selection >= 0) m_pages[m_selection]->Show(true); @@ -190,7 +197,8 @@ wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage) // remove all pages bool wxNotebook::DeleteAllPages() { - WX_CLEAR_ARRAY(m_pages) ; + WX_CLEAR_ARRAY(m_pages); + m_images.clear(); MacSetupTabs(); m_selection = wxNOT_FOUND ; InvalidateBestSize(); @@ -247,64 +255,7 @@ bool wxNotebook::InsertPage(size_t nPage, int wxNotebook::HitTest(const wxPoint& pt, long *flags) const { - int resultV = wxNOT_FOUND; -#ifdef __WXOSX_CARBON__ - const int countPages = GetPageCount(); - - // we have to convert from Client to Window relative coordinates - wxPoint adjustedPt = pt + GetClientAreaOrigin(); - // and now to HIView native ones - adjustedPt.x -= MacGetLeftBorderSize() ; - adjustedPt.y -= MacGetTopBorderSize() ; - - HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ; - HIViewPartCode outPart = 0 ; - OSStatus err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - int max = GetPeer()->GetMaximum() ; - if ( outPart == 0 && max > 0 ) - { - // this is a hack, as unfortunately a hit on an already selected tab returns 0, - // so we have to go some extra miles to make sure we select something different - // and try again .. - int val = GetPeer()->GetValue() ; - int maxval = max ; - if ( max == 1 ) - { - GetPeer()->SetMaximum( 2 ) ; - maxval = 2 ; - } - - if ( val == 1 ) - GetPeer()->SetValue( maxval ) ; - else - GetPeer()->SetValue( 1 ) ; - - err = HIViewGetPartHit( GetPeer()->GetControlRef(), &hipoint, &outPart ); - - GetPeer()->SetValue( val ) ; - if ( max == 1 ) - GetPeer()->SetMaximum( 1 ) ; - } - - if ( outPart >= 1 && outPart <= countPages ) - resultV = outPart - 1 ; - - if (flags != NULL) - { - *flags = 0; - - // we cannot differentiate better - if (resultV >= 0) - *flags |= wxBK_HITTEST_ONLABEL; - else - *flags |= wxBK_HITTEST_NOWHERE; - } -#else - wxUnusedVar(pt); - wxUnusedVar(flags); -#endif - return resultV; + return GetPeer()->TabHitTest(pt,flags); } // Added by Mark Newsam @@ -342,6 +293,7 @@ void wxNotebook::OnSize(wxSizeEvent& event) pPage->SetSize(rect, wxSIZE_FORCE_EVENT); } +#if 0 // deactivate r65078 for the moment // If the selected page is hidden at this point, the notebook // has become visible for the first time after creation, and // we postponed showing the page in ChangePage(). @@ -355,6 +307,7 @@ void wxNotebook::OnSize(wxSizeEvent& event) pPage->SetFocus(); } } +#endif // Processing continues to next OnSize event.Skip(); @@ -480,6 +433,7 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) if ( nSel != wxNOT_FOUND ) { wxNotebookPage *pPage = m_pages[nSel]; +#if 0 // deactivate r65078 for the moment if ( IsShownOnScreen() ) { pPage->Show( true ); @@ -494,6 +448,10 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) // We Show() the selected page in our OnSize handler, // unless it already is shown. } +#else + pPage->Show( true ); + pPage->SetFocus(); +#endif } m_selection = nSel; @@ -508,7 +466,7 @@ bool wxNotebook::OSXHandleClicked( double WXUNUSED(timestampsec) ) if ( newSel != m_selection ) { wxBookCtrlEvent changing( - wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId, + wxEVT_NOTEBOOK_PAGE_CHANGING, m_windowId, newSel , m_selection ); changing.SetEventObject( this ); HandleWindowEvent( changing ); @@ -516,7 +474,7 @@ bool wxNotebook::OSXHandleClicked( double WXUNUSED(timestampsec) ) if ( changing.IsAllowed() ) { wxBookCtrlEvent event( - wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId, + wxEVT_NOTEBOOK_PAGE_CHANGED, m_windowId, newSel, m_selection ); event.SetEventObject( this ); HandleWindowEvent( event ); diff --git a/Externals/wxWidgets3/src/osx/palette.cpp b/Externals/wxWidgets3/src/osx/palette.cpp index e232a3241d..ecd9b2da3c 100644 --- a/Externals/wxWidgets3/src/osx/palette.cpp +++ b/Externals/wxWidgets3/src/osx/palette.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: palette.cpp 67216 2011-03-16 10:56:41Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/pen.cpp b/Externals/wxWidgets3/src/osx/pen.cpp index d49f596e70..8f95d03efa 100644 --- a/Externals/wxWidgets3/src/osx/pen.cpp +++ b/Externals/wxWidgets3/src/osx/pen.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: pen.cpp 67681 2011-05-03 16:29:04Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/printdlg_osx.cpp b/Externals/wxWidgets3/src/osx/printdlg_osx.cpp index ef7945fdbf..c84039c272 100644 --- a/Externals/wxWidgets3/src/osx/printdlg_osx.cpp +++ b/Externals/wxWidgets3/src/osx/printdlg_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: printdlg_osx.cpp 70636 2012-02-20 21:55:55Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/radiobox_osx.cpp b/Externals/wxWidgets3/src/osx/radiobox_osx.cpp index 2177d58ee7..d728bd821e 100644 --- a/Externals/wxWidgets3/src/osx/radiobox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/radiobox_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: JS Lair (99/11/15) first implementation // Created: 1998-01-01 -// RCS-ID: $Id: radiobox_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,7 +37,7 @@ void wxRadioBox::OnRadioButton( wxCommandEvent &outer ) { if ( outer.IsChecked() ) { - wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId ); + wxCommandEvent event( wxEVT_RADIOBOX, m_windowId ); int i = GetSelection() ; event.SetInt(i); event.SetString(GetString(i)); @@ -265,7 +264,7 @@ void wxRadioBox::SetString(unsigned int item,const wxString& label) } // Sets a button by passing the desired position. This does not cause -// wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted +// wxEVT_RADIOBOX event to get emitted // void wxRadioBox::SetSelection(int item) { diff --git a/Externals/wxWidgets3/src/osx/radiobut_osx.cpp b/Externals/wxWidgets3/src/osx/radiobut_osx.cpp index 96b5140d59..51a7655b7e 100644 --- a/Externals/wxWidgets3/src/osx/radiobut_osx.cpp +++ b/Externals/wxWidgets3/src/osx/radiobut_osx.cpp @@ -4,7 +4,6 @@ // Author: AUTHOR // Modified by: JS Lair (99/11/15) adding the cyclic group notion for radiobox // Created: ??/??/98 -// RCS-ID: $Id: radiobut_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) AUTHOR // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -127,7 +126,7 @@ bool wxRadioButton::OSXHandleClicked( double WXUNUSED(timestampsec) ) SetValue( true ); - wxCommandEvent event2( wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId ); + wxCommandEvent event2( wxEVT_RADIOBUTTON, m_windowId ); event2.SetEventObject( this ); event2.SetInt( true ); ProcessCommand( event2 ); diff --git a/Externals/wxWidgets3/src/osx/scrolbar_osx.cpp b/Externals/wxWidgets3/src/osx/scrolbar_osx.cpp index 495b10c2bd..3d6d8f2961 100644 --- a/Externals/wxWidgets3/src/osx/scrolbar_osx.cpp +++ b/Externals/wxWidgets3/src/osx/scrolbar_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: scrolbar_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/slider_osx.cpp b/Externals/wxWidgets3/src/osx/slider_osx.cpp index 2482cce0fc..5d658fe181 100644 --- a/Externals/wxWidgets3/src/osx/slider_osx.cpp +++ b/Externals/wxWidgets3/src/osx/slider_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: slider_osx.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -105,6 +104,7 @@ bool wxSlider::Create(wxWindow *parent, SetPeer(wxWidgetImpl::CreateSlider( this, parent, id, value, minValue, maxValue, pos, size, style, GetExtraStyle() )); +#if 0 if (style & wxSL_VERTICAL) // Forces SetSize to use the proper width SetSizeHints(10, -1, 10, -1); @@ -115,7 +115,8 @@ bool wxSlider::Create(wxWindow *parent, // NB: SetSizeHints is overloaded by wxSlider and will substitute 10 with the // proper dimensions, it also means other people cannot bugger the slider with // other values - +#endif + if (style & wxSL_LABELS) { m_macMinimumStatic = new wxStaticText( parent, wxID_ANY, wxEmptyString ); @@ -297,7 +298,7 @@ void wxSlider::TriggerScrollEvent( wxEventType scrollEvent) event.SetEventObject( this ); HandleWindowEvent( event ); - wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, m_windowId ); + wxCommandEvent cevent( wxEVT_SLIDER, m_windowId ); cevent.SetInt( value ); cevent.SetEventObject( this ); HandleWindowEvent( cevent ); @@ -476,6 +477,7 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) // yet another hack since this is a composite control // when wxSlider has it's size hardcoded, we're not allowed to // change the size. But when the control has labels, we DO need + // to resize the internal Mac control to accommodate the text labels. // We need to trick the wxWidgets resize mechanism so that we can // resize the slider part of the control ONLY. @@ -486,7 +488,7 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) if (GetWindowStyle() & wxSL_LABELS) { - // make sure we don't allow the entire control to be resized accidently + // make sure we don't allow the entire control to be resized accidentally if (width == GetSize().x) m_minWidth = -1; } diff --git a/Externals/wxWidgets3/src/osx/sound_osx.cpp b/Externals/wxWidgets3/src/osx/sound_osx.cpp index 19422e1a80..8543b2c06d 100644 --- a/Externals/wxWidgets3/src/osx/sound_osx.cpp +++ b/Externals/wxWidgets3/src/osx/sound_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 2009-09-01 -// RCS-ID: $Id: sound_osx.cpp 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/spinbutt_osx.cpp b/Externals/wxWidgets3/src/osx/spinbutt_osx.cpp index c5fde47655..16732ab9a4 100644 --- a/Externals/wxWidgets3/src/osx/spinbutt_osx.cpp +++ b/Externals/wxWidgets3/src/osx/spinbutt_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: spinbutt_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/srchctrl_osx.cpp b/Externals/wxWidgets3/src/osx/srchctrl_osx.cpp index 520bb209e5..00d96f1585 100644 --- a/Externals/wxWidgets3/src/osx/srchctrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/srchctrl_osx.cpp @@ -3,7 +3,6 @@ // Purpose: implements mac carbon wxSearchCtrl // Author: Vince Harron // Created: 2006-02-19 -// RCS-ID: $Id: srchctrl_osx.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: Vince Harron // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -203,7 +202,7 @@ bool wxSearchCtrl::Create(wxWindow *parent, wxWindowID id, bool wxSearchCtrl::HandleSearchFieldSearchHit() { - wxCommandEvent event(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, m_windowId ); + wxCommandEvent event(wxEVT_SEARCHCTRL_SEARCH_BTN, m_windowId ); event.SetEventObject(this); // provide the string to search for directly in the event, this is more @@ -215,7 +214,7 @@ bool wxSearchCtrl::HandleSearchFieldSearchHit() bool wxSearchCtrl::HandleSearchFieldCancelHit() { - wxCommandEvent event(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, m_windowId ); + wxCommandEvent event(wxEVT_SEARCHCTRL_CANCEL_BTN, m_windowId ); event.SetEventObject(this); return ProcessCommand(event); } diff --git a/Externals/wxWidgets3/src/osx/statbox_osx.cpp b/Externals/wxWidgets3/src/osx/statbox_osx.cpp index b1cbd5f47d..bfdcb53bbf 100644 --- a/Externals/wxWidgets3/src/osx/statbox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/statbox_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: statbox_osx.cpp 67243 2011-03-19 08:36:23Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -40,29 +39,18 @@ bool wxStaticBox::Create( wxWindow *parent, void wxStaticBox::GetBordersForSizer(int *borderTop, int *borderOther) const { - static int extraTop = -1; // Uninitted - static int other = 5; - - if ( extraTop == -1 ) - { - // The minimal border used for the top. - // Later on, the staticbox's font height is added to this. - extraTop = 0; - - // As indicated by the HIG, Panther needs an extra border of 11 - // pixels (otherwise overlapping occurs at the top). The "other" - // border has to be 11. - extraTop = 11; -#if wxOSX_USE_COCOA - other = 17; -#else - other = 11; -#endif - } + static int extraTop = 11; + static int other = 11; *borderTop = extraTop; if ( !m_label.empty() ) + { +#if wxOSX_USE_COCOA + *borderTop += 11; +#else *borderTop += GetCharHeight(); +#endif + } *borderOther = other; } diff --git a/Externals/wxWidgets3/src/osx/statline_osx.cpp b/Externals/wxWidgets3/src/osx/statline_osx.cpp index af4f20ad3c..81b8a9a885 100644 --- a/Externals/wxWidgets3/src/osx/statline_osx.cpp +++ b/Externals/wxWidgets3/src/osx/statline_osx.cpp @@ -3,7 +3,6 @@ // Purpose: a generic wxStaticLine class // Author: Vadim Zeitlin // Created: 28.06.99 -// Version: $Id: statline_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/stattext_osx.cpp b/Externals/wxWidgets3/src/osx/stattext_osx.cpp index e1a033ab2e..a9de6772c1 100644 --- a/Externals/wxWidgets3/src/osx/stattext_osx.cpp +++ b/Externals/wxWidgets3/src/osx/stattext_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: stattext_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -46,6 +45,14 @@ bool wxStaticText::Create( wxWindow *parent, MacPostControlCreate( pos, size ); SetLabel(label); + if ( HasFlag(wxST_NO_AUTORESIZE) ) + { + // Normally this is done in SetLabel() below but we avoid doing it when + // this style is used, so we need to explicitly do it in the ctor in + // this case or otherwise the control would retain its initial tiny size. + InvalidateBestSize(); + SetInitialSize(size); + } return true; } diff --git a/Externals/wxWidgets3/src/osx/textctrl_osx.cpp b/Externals/wxWidgets3/src/osx/textctrl_osx.cpp index cddfdbcdef..dcfc0e15b4 100644 --- a/Externals/wxWidgets3/src/osx/textctrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/textctrl_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Ryan Norton (MLTE GetLineLength and GetLineText) // Created: 1998-01-01 -// RCS-ID: $Id: textctrl_osx.cpp 70355 2012-01-15 15:54:53Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -285,7 +284,7 @@ void wxTextCtrl::Copy() { if (CanCopy()) { - wxClipboardTextEvent evt(wxEVT_COMMAND_TEXT_COPY, GetId()); + wxClipboardTextEvent evt(wxEVT_TEXT_COPY, GetId()); evt.SetEventObject(this); if (!GetEventHandler()->ProcessEvent(evt)) { @@ -298,7 +297,7 @@ void wxTextCtrl::Cut() { if (CanCut()) { - wxClipboardTextEvent evt(wxEVT_COMMAND_TEXT_CUT, GetId()); + wxClipboardTextEvent evt(wxEVT_TEXT_CUT, GetId()); evt.SetEventObject(this); if (!GetEventHandler()->ProcessEvent(evt)) { @@ -313,7 +312,7 @@ void wxTextCtrl::Paste() { if (CanPaste()) { - wxClipboardTextEvent evt(wxEVT_COMMAND_TEXT_PASTE, GetId()); + wxClipboardTextEvent evt(wxEVT_TEXT_PASTE, GetId()); evt.SetEventObject(this); if (!GetEventHandler()->ProcessEvent(evt)) { @@ -401,7 +400,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) case WXK_RETURN: if (m_windowStyle & wxTE_PROCESS_ENTER) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); + wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); event.SetEventObject( this ); event.SetString( GetValue() ); if ( HandleWindowEvent(event) ) @@ -416,7 +415,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton); if ( def && def->IsEnabled() ) { - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); + wxCommandEvent event(wxEVT_BUTTON, def->GetId() ); event.SetEventObject(def); def->Command(event); @@ -469,7 +468,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) key == WXK_DELETE || key == WXK_BACK) { - wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); + wxCommandEvent event1(wxEVT_TEXT, m_windowId); event1.SetEventObject( this ); wxPostEvent( GetEventHandler(), event1 ); } diff --git a/Externals/wxWidgets3/src/osx/textentry_osx.cpp b/Externals/wxWidgets3/src/osx/textentry_osx.cpp index 889e6f6e34..67a858ea8f 100644 --- a/Externals/wxWidgets3/src/osx/textentry_osx.cpp +++ b/Externals/wxWidgets3/src/osx/textentry_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: Kevin Ollivier // Created: 1998-01-01 -// RCS-ID: $Id: textentry_osx.cpp 70379 2012-01-17 21:54:02Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -224,6 +223,23 @@ bool wxTextEntry::IsEditable() const return m_editable ; } +bool wxTextEntry::SendMaxLenEvent() +{ + wxWindow *win = GetEditableWindow(); + wxCHECK_MSG( win, false, "can't send an event without a window" ); + + wxCommandEvent event(wxEVT_TEXT_MAXLEN, win->GetId()); + + // do not do this as it could be very inefficient if the text control + // contains a lot of text and we're not using ref-counted wxString + // implementation -- instead, event.GetString() will query the control for + // its current text if needed + //event.SetString(win->GetValue()); + + event.SetEventObject(win); + return win->HandleWindowEvent(event); +} + // ---------------------------------------------------------------------------- // Undo/redo // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/tglbtn_osx.cpp b/Externals/wxWidgets3/src/osx/tglbtn_osx.cpp index 4ccee37f7a..f1ba9cd00e 100644 --- a/Externals/wxWidgets3/src/osx/tglbtn_osx.cpp +++ b/Externals/wxWidgets3/src/osx/tglbtn_osx.cpp @@ -5,7 +5,6 @@ // Author: Stefan Csomor // Modified by: // Created: 08.02.01 -// RCS-ID: $Id: tglbtn_osx.cpp 67949 2011-06-16 00:43:22Z RD $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,7 +30,7 @@ // ---------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl) -wxDEFINE_EVENT( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEvent ); +wxDEFINE_EVENT( wxEVT_TOGGLEBUTTON, wxCommandEvent ); // ============================================================================ // implementation @@ -94,7 +93,7 @@ void wxToggleButton::Command(wxCommandEvent & event) bool wxToggleButton::OSXHandleClicked( double WXUNUSED(timestampsec) ) { - wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId); + wxCommandEvent event(wxEVT_TOGGLEBUTTON, m_windowId); event.SetInt(GetValue()); event.SetEventObject(this); ProcessCommand(event); diff --git a/Externals/wxWidgets3/src/osx/timectrl_osx.cpp b/Externals/wxWidgets3/src/osx/timectrl_osx.cpp index 87a143d043..2ed85d3c20 100644 --- a/Externals/wxWidgets3/src/osx/timectrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/timectrl_osx.cpp @@ -3,7 +3,6 @@ // Purpose: Implementation of wxTimePickerCtrl for OS X. // Author: Vadim Zeitlin // Created: 2011-12-18 -// RCS-ID: $Id: timectrl_osx.cpp 70071 2011-12-20 21:27:14Z VZ $ // Copyright: (c) 2011 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/toolbar_osx.cpp b/Externals/wxWidgets3/src/osx/toolbar_osx.cpp index 59f0720a34..502e1f4573 100644 --- a/Externals/wxWidgets3/src/osx/toolbar_osx.cpp +++ b/Externals/wxWidgets3/src/osx/toolbar_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $Id: toolbar_osx.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/osx/toplevel_osx.cpp b/Externals/wxWidgets3/src/osx/toplevel_osx.cpp index f0ee0b15b7..b0dc820904 100644 --- a/Externals/wxWidgets3/src/osx/toplevel_osx.cpp +++ b/Externals/wxWidgets3/src/osx/toplevel_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 24.09.01 -// RCS-ID: $Id: toplevel_osx.cpp 70295 2012-01-08 14:52:47Z VZ $ // Copyright: (c) 2001-2004 Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -106,7 +105,13 @@ bool wxTopLevelWindowMac::Destroy() if (m_nowpeer && m_nowpeer->GetWXWindow()) ClearKeyboardFocus( (WindowRef)m_nowpeer->GetWXWindow() ); #endif - return wxTopLevelWindowBase::Destroy(); + // delayed destruction: the tlw will be deleted during the next idle + // loop iteration + if ( !wxPendingDelete.Member(this) ) + wxPendingDelete.Append(this); + + Hide(); + return true; } @@ -181,7 +186,8 @@ void wxTopLevelWindowMac::ShowWithoutActivating() m_nowpeer->ShowWithoutActivating(); - // TODO: Should we call EVT_SIZE here? + // because apps expect a size event to occur at this moment + SendSizeEvent(); } bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style) diff --git a/Externals/wxWidgets3/src/osx/uiaction_osx.cpp b/Externals/wxWidgets3/src/osx/uiaction_osx.cpp index 05d858f34b..c916923a3f 100644 --- a/Externals/wxWidgets3/src/osx/uiaction_osx.cpp +++ b/Externals/wxWidgets3/src/osx/uiaction_osx.cpp @@ -4,7 +4,6 @@ // Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin // Modified by: // Created: 2010-03-06 -// RCS-ID: $Id: uiaction_osx.cpp 70402 2012-01-19 15:01:01Z SC $ // Copyright: (c) Kevin Ollivier // (c) 2010 Steven Lamerton // (c) 2010 Vadim Zeitlin @@ -26,6 +25,8 @@ #include "wx/osx/private.h" #include "wx/osx/core/cfref.h" +#include "wx/evtloop.h" + namespace { @@ -51,7 +52,53 @@ CGEventType CGEventTypeForMouseButton(int button, bool isDown) return isDown ? kCGEventOtherMouseDown : kCGEventOtherMouseUp; } } + +CGEventType CGEventTypeForMouseDrag(int button) +{ + switch ( button ) + { + case wxMOUSE_BTN_LEFT: + return kCGEventLeftMouseDragged; + break; + + case wxMOUSE_BTN_RIGHT: + return kCGEventRightMouseDragged; + break; + + // All the other buttons use the constant OtherMouseDown but we still + // want to check for invalid parameters so assert first + default: + wxFAIL_MSG("Unsupported button passed in."); + // fall back to the only known remaining case + + case wxMOUSE_BTN_MIDDLE: + return kCGEventOtherMouseDragged; + break; + } +} + +CGMouseButton CGButtonForMouseButton(int button) +{ + switch ( button ) + { + case wxMOUSE_BTN_LEFT: + return kCGMouseButtonLeft; + + case wxMOUSE_BTN_RIGHT: + return kCGMouseButtonRight; + + // All the other buttons use the constant OtherMouseDown but we still + // want to check for invalid parameters so assert first + default: + wxFAIL_MSG("Unsupported button passed in."); + // fall back to the only known remaining case + + case wxMOUSE_BTN_MIDDLE: + return kCGMouseButtonCenter; + } +} + CGPoint GetMousePosition() { int x, y; @@ -70,14 +117,17 @@ bool wxUIActionSimulator::MouseDown(int button) { CGEventType type = CGEventTypeForMouseButton(button, true); wxCFRef event( - CGEventCreateMouseEvent(NULL, type, GetMousePosition(), button)); + CGEventCreateMouseEvent(NULL, type, GetMousePosition(), CGButtonForMouseButton(button))); if ( !event ) return false; CGEventSetType(event, type); CGEventPost(tap, event); - + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + return true; } @@ -97,6 +147,10 @@ bool wxUIActionSimulator::MouseMove(long x, long y) CGEventSetType(event, type); CGEventPost(tap, event); + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + return true; } @@ -104,14 +158,85 @@ bool wxUIActionSimulator::MouseUp(int button) { CGEventType type = CGEventTypeForMouseButton(button, false); wxCFRef event( - CGEventCreateMouseEvent(NULL, type, GetMousePosition(), button)); + CGEventCreateMouseEvent(NULL, type, GetMousePosition(), CGButtonForMouseButton(button))); if ( !event ) return false; CGEventSetType(event, type); CGEventPost(tap, event); + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + + return true; +} +bool wxUIActionSimulator::MouseDblClick(int button) +{ + CGEventType downtype = CGEventTypeForMouseButton(button, true); + CGEventType uptype = CGEventTypeForMouseButton(button, false); + wxCFRef event( + CGEventCreateMouseEvent(NULL, downtype, GetMousePosition(), CGButtonForMouseButton(button))); + + if ( !event ) + return false; + + CGEventSetType(event,downtype); + CGEventPost(tap, event); + + CGEventSetType(event, uptype); + CGEventPost(tap, event); + + CGEventSetIntegerValueField(event, kCGMouseEventClickState, 2); + CGEventSetType(event, downtype); + CGEventPost(tap, event); + + CGEventSetType(event, uptype); + CGEventPost(tap, event); + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + + return true; +} + +bool wxUIActionSimulator::MouseDragDrop(long x1, long y1, long x2, long y2, + int button) +{ + CGPoint pos1,pos2; + pos1.x = x1; + pos1.y = y1; + pos2.x = x2; + pos2.y = y2; + + CGEventType downtype = CGEventTypeForMouseButton(button, true); + CGEventType uptype = CGEventTypeForMouseButton(button, false); + CGEventType dragtype = CGEventTypeForMouseDrag(button) ; + + wxCFRef event( + CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, pos1, CGButtonForMouseButton(button))); + + if ( !event ) + return false; + + CGEventSetType(event,kCGEventMouseMoved); + CGEventPost(tap, event); + + CGEventSetType(event,downtype); + CGEventPost(tap, event); + + + CGEventSetType(event, dragtype); + CGEventSetLocation(event,pos2); + CGEventPost(tap, event); + + CGEventSetType(event, uptype); + CGEventPost(tap, event); + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + return true; } @@ -126,6 +251,10 @@ wxUIActionSimulator::DoKey(int keycode, int WXUNUSED(modifiers), bool isDown) return false; CGEventPost(kCGHIDEventTap, event); + wxCFEventLoop* loop = dynamic_cast(wxEventLoop::GetActive()); + if (loop) + loop->SetShouldWaitForEvent(true); + return true; } diff --git a/Externals/wxWidgets3/src/osx/utils_osx.cpp b/Externals/wxWidgets3/src/osx/utils_osx.cpp index df16891635..bfcf65f57c 100644 --- a/Externals/wxWidgets3/src/osx/utils_osx.cpp +++ b/Externals/wxWidgets3/src/osx/utils_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: utils_osx.cpp 69543 2011-10-26 05:38:24Z SC $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -35,21 +34,13 @@ // #include "MoreFilesX.h" -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - #include -#endif +#include #include "wx/osx/private.h" #include "wx/osx/private/timer.h" #include "wx/evtloop.h" -#if defined(__MWERKS__) && wxUSE_UNICODE -#if __MWERKS__ < 0x4100 - #include -#endif -#endif - // Check whether this window wants to process messages, e.g. Stop button // in long calculations. bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) @@ -96,6 +87,7 @@ int wxDisplayDepth() theDepth = 32; // some reasonable default CFRelease(encoding); + CGDisplayModeRelease(currentMode); } else #endif @@ -253,9 +245,26 @@ CGColorSpaceRef wxMacGetGenericRGBColorSpace() CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) { - CGColorRef color ; - HIThemeBrushCreateCGColor( brush, &color ); - return color; + const int maxcachedbrush = 58+5; // negative indices are for metabrushes, cache down to -5) + int brushindex = brush+5; + if ( brushindex < 0 || brushindex > maxcachedbrush ) + { + CGColorRef color ; + HIThemeBrushCreateCGColor( brush, &color ); + return color; + } + else + { + static bool inited = false; + static CGColorRef themecolors[maxcachedbrush+1]; + if ( !inited ) + { + for ( int i = 0 ; i <= maxcachedbrush ; ++i ) + HIThemeBrushCreateCGColor( i-5, &themecolors[i] ); + inited = true; + } + return CGColorRetain(themecolors[brushindex ]); + } } //--------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/webview_webkit.mm b/Externals/wxWidgets3/src/osx/webview_webkit.mm index 20eee17382..a311bb3d34 100644 --- a/Externals/wxWidgets3/src/osx/webview_webkit.mm +++ b/Externals/wxWidgets3/src/osx/webview_webkit.mm @@ -5,7 +5,6 @@ // Author: Jethro Grassie / Kevin Ollivier / Marianne Gagnon // Modified by: // Created: 2004-4-16 -// RCS-ID: $Id: webview_webkit.mm 69074 2011-09-12 18:35:39Z SJL $ // Copyright: (c) Jethro Grassie / Kevin Ollivier / Marianne Gagnon // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -103,7 +102,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, UInt32 keyCode ; UInt32 modifiers ; - Point point ; UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; #if wxUSE_UNICODE @@ -135,13 +133,11 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, #endif GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, - sizeof(char), NULL, &charCode ); + 1, NULL, &charCode ); GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode ); GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers ); - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL, - sizeof(Point), NULL, &point ); UInt32 message = (keyCode << 8) + charCode; switch ( GetEventKind( event ) ) @@ -155,7 +151,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, wxTheApp->MacSetCurrentEvent( event , handler ) ; if ( /* focus && */ wxTheApp->MacSendKeyDownEvent( - focus, message, modifiers, when, point.h, point.v, uniChar[0])) + focus, message, modifiers, when, uniChar[0])) { result = noErr ; } @@ -165,7 +161,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, case kEventRawKeyUp : if ( /* focus && */ wxTheApp->MacSendKeyUpEvent( - focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) + focus , message , modifiers , when , uniChar[0] ) ) { result = noErr ; } @@ -179,8 +175,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, event.m_controlDown = modifiers & controlKey; event.m_altDown = modifiers & optionKey; event.m_metaDown = modifiers & cmdKey; - event.m_x = point.h; - event.m_y = point.v; #if wxUSE_UNICODE event.m_uniChar = uniChar[0] ; @@ -315,6 +309,15 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebViewWebKitEventHandler ) @end +@interface WebViewUIDelegate : NSObject +{ + wxWebViewWebKit* webKitWindow; +} + +- initWithWxWindow: (wxWebViewWebKit*)inWindow; + +@end + //We use a hash to map scheme names to wxWebViewHandler WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringToWebHandlerMap); @@ -386,6 +389,11 @@ bool wxWebViewWebKit::Create(wxWindow *parent, [m_webView setPolicyDelegate:policyDelegate]; + WebViewUIDelegate* uiDelegate = + [[WebViewUIDelegate alloc] initWithWxWindow: this]; + + [m_webView setUIDelegate:uiDelegate]; + //Register our own class for custom scheme handling [NSURLProtocol registerClass:[WebViewCustomProtocol class]]; @@ -397,14 +405,19 @@ wxWebViewWebKit::~wxWebViewWebKit() { WebViewLoadDelegate* loadDelegate = [m_webView frameLoadDelegate]; WebViewPolicyDelegate* policyDelegate = [m_webView policyDelegate]; + WebViewUIDelegate* uiDelegate = [m_webView UIDelegate]; [m_webView setFrameLoadDelegate: nil]; [m_webView setPolicyDelegate: nil]; + [m_webView setUIDelegate: nil]; if (loadDelegate) [loadDelegate release]; if (policyDelegate) [policyDelegate release]; + + if (uiDelegate) + [uiDelegate release]; } // ---------------------------------------------------------------------------- @@ -448,7 +461,7 @@ void wxWebViewWebKit::Reload(wxWebViewReloadFlags flags) if ( !m_webView ) return; - if (flags & wxWEB_VIEW_RELOAD_NO_CACHE) + if (flags & wxWEBVIEW_RELOAD_NO_CACHE) { // TODO: test this indeed bypasses the cache [[m_webView preferences] setUsesPageCache:NO]; @@ -557,7 +570,7 @@ void wxWebViewWebKit::Print() { [op setShowsPrintPanel: showPrompt]; // in my tests, the progress bar always freezes and it stops the whole - // print operation. do not turn this to true unless there is a + // print operation. do not turn this to true unless there is a // workaround for the bug. [op setShowsProgressPanel: false]; } @@ -585,7 +598,7 @@ void wxWebViewWebKit::SetZoomType(wxWebViewZoomType zoomType) { // there is only one supported zoom type at the moment so this setter // does nothing beyond checking sanity - wxASSERT(zoomType == wxWEB_VIEW_ZOOM_TYPE_TEXT); + wxASSERT(zoomType == wxWEBVIEW_ZOOM_TYPE_TEXT); } wxWebViewZoomType wxWebViewWebKit::GetZoomType() const @@ -593,7 +606,7 @@ wxWebViewZoomType wxWebViewWebKit::GetZoomType() const // for now that's the only one that is supported // FIXME: does the default zoom type change depending on webkit versions? :S // Then this will be wrong - return wxWEB_VIEW_ZOOM_TYPE_TEXT; + return wxWEBVIEW_ZOOM_TYPE_TEXT; } bool wxWebViewWebKit::CanSetZoomType(wxWebViewZoomType type) const @@ -603,7 +616,7 @@ bool wxWebViewWebKit::CanSetZoomType(wxWebViewZoomType type) const // for now that's the only one that is supported // TODO: I know recent versions of webkit support layout zoom too, // check if we can support it - case wxWEB_VIEW_ZOOM_TYPE_TEXT: + case wxWEBVIEW_ZOOM_TYPE_TEXT: return true; default: @@ -631,10 +644,11 @@ void wxWebViewWebKit::SetScrollPos(int pos) wxString wxWebViewWebKit::GetSelectedText() const { - NSString* selection = [[m_webView selectedDOMRange] markupString]; - if (!selection) return wxEmptyString; + DOMRange* dr = [m_webView selectedDOMRange]; + if ( !dr ) + return wxString(); - return wxStringWithNSString(selection); + return wxStringWithNSString([dr toString]); } void wxWebViewWebKit::RunScript(const wxString& javascript) @@ -648,7 +662,7 @@ void wxWebViewWebKit::RunScript(const wxString& javascript) void wxWebViewWebKit::OnSize(wxSizeEvent &event) { -#if defined(__WXMAC_) && wxOSX_USE_CARBON +#if defined(__WXMAC__) && wxOSX_USE_CARBON // This is a nasty hack because WebKit seems to lose its position when it is // embedded in a control that is not itself the content view for a TLW. // I put it in OnSize because these calcs are not perfect, and in fact are @@ -694,7 +708,7 @@ void wxWebViewWebKit::OnSize(wxSizeEvent &event) // we want is the root view, because we need to make the y origin relative // to the very top of the window, not its contents, since we later flip // the y coordinate for Cocoa. - HIViewConvertRect (&rect, m_peer->GetControlRef(), + HIViewConvertRect (&rect, GetPeer()->GetControlRef(), HIViewGetRoot( (WindowRef) MacGetTopLevelWindowRef() )); @@ -768,28 +782,28 @@ wxWebViewZoom wxWebViewWebKit::GetZoom() const // arbitrary way to map float zoom to our common zoom enum if (zoom <= 0.55) { - return wxWEB_VIEW_ZOOM_TINY; + return wxWEBVIEW_ZOOM_TINY; } else if (zoom > 0.55 && zoom <= 0.85) { - return wxWEB_VIEW_ZOOM_SMALL; + return wxWEBVIEW_ZOOM_SMALL; } else if (zoom > 0.85 && zoom <= 1.15) { - return wxWEB_VIEW_ZOOM_MEDIUM; + return wxWEBVIEW_ZOOM_MEDIUM; } else if (zoom > 1.15 && zoom <= 1.45) { - return wxWEB_VIEW_ZOOM_LARGE; + return wxWEBVIEW_ZOOM_LARGE; } else if (zoom > 1.45) { - return wxWEB_VIEW_ZOOM_LARGEST; + return wxWEBVIEW_ZOOM_LARGEST; } // to shut up compilers, this can never be reached logically wxASSERT(false); - return wxWEB_VIEW_ZOOM_MEDIUM; + return wxWEBVIEW_ZOOM_MEDIUM; } void wxWebViewWebKit::SetZoom(wxWebViewZoom zoom) @@ -797,23 +811,23 @@ void wxWebViewWebKit::SetZoom(wxWebViewZoom zoom) // arbitrary way to map our common zoom enum to float zoom switch (zoom) { - case wxWEB_VIEW_ZOOM_TINY: + case wxWEBVIEW_ZOOM_TINY: SetWebkitZoom(0.4f); break; - case wxWEB_VIEW_ZOOM_SMALL: + case wxWEBVIEW_ZOOM_SMALL: SetWebkitZoom(0.7f); break; - case wxWEB_VIEW_ZOOM_MEDIUM: + case wxWEBVIEW_ZOOM_MEDIUM: SetWebkitZoom(1.0f); break; - case wxWEB_VIEW_ZOOM_LARGE: + case wxWEBVIEW_ZOOM_LARGE: SetWebkitZoom(1.3); break; - case wxWEB_VIEW_ZOOM_LARGEST: + case wxWEBVIEW_ZOOM_LARGEST: SetWebkitZoom(1.6); break; @@ -823,7 +837,7 @@ void wxWebViewWebKit::SetZoom(wxWebViewZoom zoom) } -void wxWebViewWebKit::SetPage(const wxString& src, const wxString& baseUrl) +void wxWebViewWebKit::DoSetPage(const wxString& src, const wxString& baseUrl) { if ( !m_webView ) return; @@ -891,20 +905,18 @@ void wxWebViewWebKit::SelectAll() wxString wxWebViewWebKit::GetSelectedSource() const { - wxString script = ("var range = window.getSelection().getRangeAt(0);" - "var element = document.createElement('div');" - "element.appendChild(range.cloneContents());" - "return element.innerHTML;"); - id result = [[m_webView windowScriptObject] - evaluateWebScript:wxNSStringWithWxString(script)]; - return wxStringWithNSString([result stringValue]); + DOMRange* dr = [m_webView selectedDOMRange]; + if ( !dr ) + return wxString(); + + return wxStringWithNSString([dr markupString]); } wxString wxWebViewWebKit::GetPageText() const { - id result = [[m_webView windowScriptObject] - evaluateWebScript:@"document.body.textContent"]; - return wxStringWithNSString([result stringValue]); + NSString *result = [m_webView stringByEvaluatingJavaScriptFromString: + @"document.body.textContent"]; + return wxStringWithNSString(result); } void wxWebViewWebKit::EnableHistory(bool enable) @@ -1018,7 +1030,7 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATED, webKitWindow->GetId(), wxStringWithNSString( url ), target); @@ -1036,7 +1048,7 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, + wxWebViewEvent event(wxEVT_WEBVIEW_LOADED, webKitWindow->GetId(), wxStringWithNSString( url ), target); @@ -1048,7 +1060,7 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) { - *out = wxWEB_NAV_ERR_OTHER; + *out = wxWEBVIEW_NAV_ERR_OTHER; if ([[error domain] isEqualToString:NSURLErrorDomain]) { @@ -1057,7 +1069,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) case NSURLErrorCannotFindHost: case NSURLErrorFileDoesNotExist: case NSURLErrorRedirectToNonExistentLocation: - *out = wxWEB_NAV_ERR_NOT_FOUND; + *out = wxWEBVIEW_NAV_ERR_NOT_FOUND; break; case NSURLErrorResourceUnavailable: @@ -1067,7 +1079,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) #endif case NSURLErrorBadURL: case NSURLErrorFileIsDirectory: - *out = wxWEB_NAV_ERR_REQUEST; + *out = wxWEBVIEW_NAV_ERR_REQUEST; break; case NSURLErrorTimedOut: @@ -1078,21 +1090,21 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) //case NSURLErrorInternationalRoamingOff: //case NSURLErrorCallIsActive: //case NSURLErrorDataNotAllowed: - *out = wxWEB_NAV_ERR_CONNECTION; + *out = wxWEBVIEW_NAV_ERR_CONNECTION; break; case NSURLErrorCancelled: case NSURLErrorUserCancelledAuthentication: - *out = wxWEB_NAV_ERR_USER_CANCELLED; + *out = wxWEBVIEW_NAV_ERR_USER_CANCELLED; break; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 case NSURLErrorCannotDecodeRawData: case NSURLErrorCannotDecodeContentData: case NSURLErrorCannotParseResponse: #endif case NSURLErrorBadServerResponse: - *out = wxWEB_NAV_ERR_REQUEST; + *out = wxWEBVIEW_NAV_ERR_REQUEST; break; case NSURLErrorUserAuthenticationRequired: @@ -1100,11 +1112,11 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 case NSURLErrorClientCertificateRequired: #endif - *out = wxWEB_NAV_ERR_AUTH; + *out = wxWEBVIEW_NAV_ERR_AUTH; break; case NSURLErrorNoPermissionsToReadFile: - *out = wxWEB_NAV_ERR_SECURITY; + *out = wxWEBVIEW_NAV_ERR_SECURITY; break; case NSURLErrorServerCertificateHasBadDate: @@ -1112,7 +1124,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) case NSURLErrorServerCertificateHasUnknownRoot: case NSURLErrorServerCertificateNotYetValid: case NSURLErrorClientCertificateRejected: - *out = wxWEB_NAV_ERR_CERTIFICATE; + *out = wxWEBVIEW_NAV_ERR_CERTIFICATE; break; } } @@ -1136,7 +1148,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, + wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString); @@ -1162,7 +1174,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, + wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString); @@ -1178,11 +1190,11 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) forFrame:(WebFrame *)frame { wxString target = wxStringWithNSString([frame name]); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + wxWebViewEvent event(wxEVT_WEBVIEW_TITLE_CHANGED, webKitWindow->GetId(), webKitWindow->GetCurrentURL(), target); - + event.SetString(wxStringWithNSString(title)); if (webKitWindow && webKitWindow->GetEventHandler()) @@ -1210,7 +1222,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) webKitWindow->m_busy = true; NSString *url = [[request URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, + wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING, webKitWindow->GetId(), wxStringWithNSString( url ), target); @@ -1228,7 +1240,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) } } -- (void)webView:(WebView *)sender +- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName @@ -1237,7 +1249,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) wxUnusedVar(actionInformation); NSString *url = [[request URL] absoluteString]; - wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, + wxWebViewEvent event(wxEVT_WEBVIEW_NEWWINDOW, webKitWindow->GetId(), wxStringWithNSString( url ), ""); @@ -1277,26 +1289,38 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) NSURLRequest *request = [self request]; NSString* path = [[request URL] absoluteString]; + id client = [self client]; + wxString wxpath = wxStringWithNSString(path); wxString scheme = wxStringWithNSString([[request URL] scheme]); wxFSFile* file = g_stringHandlerMap[scheme]->GetFile(wxpath); + + if (!file) + { + NSError *error = [[NSError alloc] initWithDomain:NSURLErrorDomain + code:NSURLErrorFileDoesNotExist + userInfo:nil]; + + [client URLProtocol:self didFailWithError:error]; + + return; + } + size_t length = file->GetStream()->GetLength(); NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:wxNSStringWithWxString(file->GetMimeType()) - expectedContentLength:length + expectedContentLength:length textEncodingName:nil]; - + //Load the data, we malloc it so it is tidied up properly void* buffer = malloc(length); file->GetStream()->Read(buffer, length); NSData *data = [[NSData alloc] initWithBytesNoCopy:buffer length:length]; - - id client = [self client]; //We do not support caching anything yet - [client URLProtocol:self didReceiveResponse:response + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //Set the data @@ -1315,4 +1339,32 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) @end + +@implementation WebViewUIDelegate + +- initWithWxWindow: (wxWebViewWebKit*)inWindow +{ + [super init]; + webKitWindow = inWindow; // non retained + return self; +} + +- (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView +{ + wxUnusedVar(sender); + wxUnusedVar(frameView); + + webKitWindow->Print(); +} + +- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element + defaultMenuItems:(NSArray *) defaultMenuItems +{ + if(webKitWindow->IsContextMenuEnabled()) + return defaultMenuItems; + else + return nil; +} +@end + #endif //wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT diff --git a/Externals/wxWidgets3/src/osx/window_osx.cpp b/Externals/wxWidgets3/src/osx/window_osx.cpp index 5021bebb0d..afbf5a0a32 100644 --- a/Externals/wxWidgets3/src/osx/window_osx.cpp +++ b/Externals/wxWidgets3/src/osx/window_osx.cpp @@ -4,7 +4,6 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: window_osx.cpp 70765 2012-03-01 15:04:42Z JS $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -301,6 +300,11 @@ wxOSXWidgetImpl* wxWindowMac::GetPeer() const return m_peer == kOSXNoWidgetImpl ? NULL : m_peer ; } +bool wxWindowMac::ShouldCreatePeer() const +{ + return m_peer != kOSXNoWidgetImpl; +} + void wxWindowMac::DontCreatePeer() { m_peer = kOSXNoWidgetImpl; @@ -345,7 +349,11 @@ void wxWindowMac::SetPeer(wxOSXWidgetImpl* peer) GetParent()->MacChildAdded() ; // adjust font, controlsize etc - DoSetWindowVariant( m_windowVariant ) ; + GetPeer()->SetControlSize( m_windowVariant ); + InheritAttributes(); + // in case nothing has been set, use the variant default fonts + if ( !m_hasFont ) + DoSetWindowVariant( m_windowVariant ); GetPeer()->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ; @@ -378,7 +386,7 @@ bool wxWindowMac::MacIsUserPane() const /* * Right now we have the following setup : * a border that is not part of the native control is always outside the - * control's border (otherwise we loose all native intelligence, future ways + * control's border (otherwise we lose all native intelligence, future ways * may be to have a second embedding control responsible for drawing borders * and backgrounds eventually) * so all this border calculations have to be taken into account when calling @@ -407,6 +415,9 @@ bool wxWindowMac::Create(wxWindowMac *parent, m_windowVariant = parent->GetWindowVariant() ; + m_hScrollBarAlwaysShown = + m_vScrollBarAlwaysShown = HasFlag(wxALWAYS_SHOW_SB); + if ( m_peer != kOSXNoWidgetImpl ) { SetPeer(wxWidgetImpl::CreateUserPane( this, parent, id, pos, size , style, GetExtraStyle() )); @@ -484,39 +495,6 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) return; GetPeer()->SetControlSize( variant ); -#if wxOSX_USE_CARBON - ControlSize size ; - - // we will get that from the settings later - // and make this NORMAL later, but first - // we have a few calculations that we must fix - - switch ( variant ) - { - case wxWINDOW_VARIANT_NORMAL : - size = kControlSizeNormal; - break ; - - case wxWINDOW_VARIANT_SMALL : - size = kControlSizeSmall; - break ; - - case wxWINDOW_VARIANT_MINI : - // not always defined in the headers - size = 3 ; - break ; - - case wxWINDOW_VARIANT_LARGE : - size = kControlSizeLarge; - break ; - - default: - wxFAIL_MSG(wxT("unexpected window variant")); - break ; - } - GetPeer()->SetData(kControlEntireControl, kControlSizeTag, &size ) ; -#endif - switch ( variant ) { @@ -630,6 +608,27 @@ void wxWindowMac::SetFocus() GetPeer()->SetFocus() ; } +void wxWindowMac::OSXSimulateFocusEvents() +{ + wxWindow* former = FindFocus() ; + if ( former != NULL && former != this ) + { + { + wxFocusEvent event( wxEVT_KILL_FOCUS, former->GetId()); + event.SetEventObject(former); + event.SetWindow(this); + former->HandleWindowEvent(event) ; + } + + { + wxFocusEvent event(wxEVT_SET_FOCUS, former->GetId()); + event.SetEventObject(former); + event.SetWindow(this); + former->HandleWindowEvent(event); + } + } +} + void wxWindowMac::DoCaptureMouse() { wxApp::s_captureWindow = (wxWindow*) this ; @@ -655,10 +654,8 @@ void wxWindowMac::SetDropTarget(wxDropTarget *pDropTarget) delete m_dropTarget; m_dropTarget = pDropTarget; - if ( m_dropTarget != NULL ) - { - // TODO: - } + + GetPeer()->SetDropTarget(m_dropTarget) ; } #endif @@ -877,9 +874,22 @@ void wxWindowMac::DoGetClientSize( int *x, int *y ) const #endif if (x) - *x = ww; + { + // we shouldn't return invalid width + if ( ww < 0 ) + ww = 0; + + *x = ww; + } + if (y) - *y = hh; + { + // we shouldn't return invalid height + if ( hh < 0 ) + hh = 0; + + *y = hh; + } } bool wxWindowMac::SetCursor(const wxCursor& cursor) @@ -1065,11 +1075,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) if ( doResize ) { MacRepositionScrollBars() ; - MacOnInternalSize(); - wxSize size(actualWidth, actualHeight); - wxSizeEvent event(size, m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } } } @@ -1123,6 +1129,12 @@ wxSize wxWindowMac::DoGetBestSize() const } } +void wxWindowMac::SendSizeEvent(int flags) +{ + MacOnInternalSize(); + wxWindowBase::SendSizeEvent(flags); +} + // set the size of the window: if the dimensions are positive, just use them, // but if any of them is equal to -1, it means that we must find the value for // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in @@ -1149,10 +1161,7 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (sizeFlags & wxSIZE_FORCE_EVENT) { - MacOnInternalSize(); - wxSizeEvent event( wxSize(width,height), GetId() ); - event.SetEventObject( this ); - HandleWindowEvent( event ); + SendSizeEvent(); } return; @@ -1225,7 +1234,7 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight) } } -float wxWindowMac::GetContentScaleFactor() const +double wxWindowMac::GetContentScaleFactor() const { return GetPeer()->GetContentScaleFactor(); } @@ -1311,7 +1320,6 @@ void wxWindowMac::MacHiliteChanged() void wxWindowMac::MacEnabledStateChanged() { - OnEnabled( GetPeer()->IsEnabled() ); } // @@ -1392,27 +1400,23 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect) if ( !IsShownOnScreen() ) return ; + + if ( IsFrozen() ) + return; GetPeer()->SetNeedsDisplay( rect ) ; } void wxWindowMac::DoFreeze() { -#if wxOSX_USE_CARBON if ( GetPeer() && GetPeer()->IsOk() ) GetPeer()->SetDrawingEnabled( false ) ; -#endif } void wxWindowMac::DoThaw() { -#if wxOSX_USE_CARBON if ( GetPeer() && GetPeer()->IsOk() ) - { GetPeer()->SetDrawingEnabled( true ) ; - GetPeer()->InvalidateWithChildren() ; - } -#endif } wxWindow *wxGetActiveWindow() @@ -1688,10 +1692,7 @@ void wxWindowMac::DoUpdateScrollbarVisibility() MacRepositionScrollBars() ; if ( triggerSizeEvent ) { - MacOnInternalSize(); - wxSizeEvent event(GetSize(), m_windowId); - event.SetEventObject(this); - HandleWindowEvent(event); + SendSizeEvent(); } #endif } @@ -1825,6 +1826,8 @@ bool wxWindowMac::MacSetupCursor( const wxPoint& pt ) if ( wxRect2DInt( clientorigin.x , clientorigin.y , clientsize.x , clientsize.y ).Contains( wxPoint2DInt( pt ) ) ) { wxSetCursorEvent event( pt.x , pt.y ); + event.SetId(GetId()); + event.SetEventObject(this); bool processedEvtSetCursor = HandleWindowEvent(event); if ( processedEvtSetCursor && event.HasCursor() ) @@ -2200,7 +2203,8 @@ bool wxWindowMac::MacHasScrollBarCorner() const const wxFrame *frame = wxDynamicCast( win, wxFrame ) ; if ( frame ) { - if ( frame->GetWindowStyleFlag() & wxRESIZE_BORDER ) + // starting from 10.7 there are no resize indicators anymore + if ( (frame->GetWindowStyleFlag() & wxRESIZE_BORDER) && UMAGetSystemVersion() < 0x1070) { // Parent frame has resize handle wxPoint frameBottomRight = frame->GetScreenRect().GetBottomRight(); @@ -2531,7 +2535,7 @@ Rect wxMacGetBoundsForControl( wxWindowMac* window , const wxPoint& pos , const int x, y, w, h ; window->MacGetBoundsForControl( pos , size , x , y, w, h , adjustForOrigin ) ; - Rect bounds = { y, x, y + h, x + w }; + Rect bounds = { static_cast(y), static_cast(x), static_cast(y + h), static_cast(x + w) }; return bounds ; } @@ -2541,6 +2545,11 @@ bool wxWindowMac::OSXHandleClicked( double WXUNUSED(timestampsec) ) return false; } +void *wxWindowMac::OSXGetViewOrWindow() const +{ + return GetHandle(); +} + wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF event ) { #if wxOSX_USE_COCOA_OR_CARBON @@ -2630,20 +2639,18 @@ wxHotKeyHandler(EventHandlerCallRef WXUNUSED(nextHandler), unsigned char charCode ; UInt32 keyCode ; UInt32 modifiers ; - Point where ; UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; - GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode ); + GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode ); GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode ); GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers ); - GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &where ); UInt32 keymessage = (keyCode << 8) + charCode; wxKeyEvent wxevent(wxEVT_HOTKEY); wxevent.SetId(hotKeyId.id); wxTheApp->MacCreateKeyEvent( wxevent, s_hotkeys[i].window , keymessage , - modifiers , when , where.h , where.v , 0 ) ; + modifiers , when , 0 ) ; s_hotkeys[i].window->HandleWindowEvent(wxevent); } @@ -2713,7 +2720,7 @@ bool wxWindowMac::RegisterHotKey(int hotkeyId, int modifiers, int keycode) bool wxWindowMac::UnregisterHotKey(int hotkeyId) { - for ( unsigned i = s_hotkeys.size()-1; i>=0; -- i ) + for ( int i = ((int)s_hotkeys.size())-1; i>=0; -- i ) { if ( s_hotkeys[i].keyId == hotkeyId ) { @@ -2752,13 +2759,13 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event ) { wxEvtHandler * const handler = ancestor->GetEventHandler(); - wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); + wxCommandEvent command_event( wxEVT_MENU, command ); handled = handler->ProcessEvent( command_event ); if ( !handled ) { // accelerators can also be used with buttons, try them too - command_event.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED); + command_event.SetEventType(wxEVT_BUTTON); handled = handler->ProcessEvent( command_event ); } @@ -2787,6 +2794,10 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event ) // wxWidgetImpl // +// we are maintaining a n:1 map from native controls (ControlRef / NSView*) to their wxWidgetImpl +// n:1 because we might have an embedded view eg within a scrollview, both being part of the same impl +// the impl is calling Associate with its newly created native control(s), e.g. in InstallHandler + WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap); static MacControlMap wxWinMacControlList; @@ -2886,3 +2897,7 @@ bool wxWidgetImpl::NeedsFrame() const { return m_needsFrame; } + +void wxWidgetImpl::SetDrawingEnabled(bool WXUNUSED(enabled)) +{ +} diff --git a/Externals/wxWidgets3/src/unix/apptraits.cpp b/Externals/wxWidgets3/src/unix/apptraits.cpp index e4f7098042..d29f9acdbb 100644 --- a/Externals/wxWidgets3/src/unix/apptraits.cpp +++ b/Externals/wxWidgets3/src/unix/apptraits.cpp @@ -3,7 +3,6 @@ // Purpose: implementation of wxGUIAppTraits for Unix systems // Author: Vadim Zeitlin // Created: 2008-03-22 -// RCS-ID: $Id: apptraits.cpp 52742 2008-03-23 18:24:27Z PC $ // Copyright: (c) 2008 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -30,6 +29,7 @@ #endif // WX_PRECOMP #include "wx/unix/execute.h" +#include "wx/evtloop.h" // ============================================================================ // implementation @@ -37,47 +37,15 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) { - const int flags = execData.flags; - if ( !(flags & wxEXEC_SYNC) || (flags & wxEXEC_NOEVENTS) ) - { - // async or blocking sync cases are already handled by the base class - // just fine, no need to duplicate its code here - return wxAppTraits::WaitForChild(execData); - } - - // here we're dealing with the case of synchronous execution when we want - // to process the GUI events while waiting for the child termination - - wxEndProcessData endProcData; - endProcData.pid = execData.pid; - endProcData.tag = AddProcessCallback - ( - &endProcData, - execData.GetEndProcReadFD() - ); - endProcData.async = false; - - // prepare to wait for the child termination: show to the user that we're // busy and refuse all input unless explicitly told otherwise wxBusyCursor bc; - wxWindowDisabler wd(!(flags & wxEXEC_NODISABLE)); + wxWindowDisabler wd(!(execData.flags & wxEXEC_NODISABLE)); - // endProcData.pid will be set to 0 from wxHandleProcessTermination() when - // the process terminates - while ( endProcData.pid != 0 ) - { - // don't consume 100% of the CPU while we're sitting in this - // loop - if ( !CheckForRedirectedIO(execData) ) - wxMilliSleep(1); - - // give the toolkit a chance to call wxHandleProcessTermination() here - // and also repaint the GUI and handle other accumulated events - wxYield(); - } - - return endProcData.exitcode; + // Allocate an event loop that will be used to wait for the process + // to terminate, will handle stdout, stderr, and any other events and pass + // it to the common (to console and GUI) code which will run it. + wxGUIEventLoop loop; + return RunLoopUntilChildExit(execData, loop); } - diff --git a/Externals/wxWidgets3/src/unix/appunix.cpp b/Externals/wxWidgets3/src/unix/appunix.cpp index 5c6f8e5e00..62f0c79ec9 100644 --- a/Externals/wxWidgets3/src/unix/appunix.cpp +++ b/Externals/wxWidgets3/src/unix/appunix.cpp @@ -3,7 +3,6 @@ // Purpose: wxAppConsole with wxMainLoop implementation // Author: Lukasz Michalski // Created: 28/01/2005 -// RCS-ID: $Id: appunix.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Lukasz Michalski // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,6 +19,10 @@ #endif #include "wx/evtloop.h" +#include "wx/scopedptr.h" +#include "wx/unix/private/wakeuppipe.h" +#include "wx/private/fdiodispatcher.h" +#include "wx/private/fdioeventloopsourcehandler.h" #include #include @@ -29,6 +32,58 @@ #define SA_RESTART 0 #endif +// ---------------------------------------------------------------------------- +// Helper class calling CheckSignal() on wake up +// ---------------------------------------------------------------------------- + +namespace +{ + +class SignalsWakeUpPipe : public wxWakeUpPipe +{ +public: + // Ctor automatically registers this pipe with the event loop. + SignalsWakeUpPipe() + { + m_source = wxEventLoopBase::AddSourceForFD + ( + GetReadFd(), + this, + wxEVENT_SOURCE_INPUT + ); + } + + virtual void OnReadWaiting() + { + // The base class wxWakeUpPipe::OnReadWaiting() needs to be called in order + // to read the data out of the wake up pipe and clear it for next time. + wxWakeUpPipe::OnReadWaiting(); + + if ( wxTheApp ) + wxTheApp->CheckSignal(); + } + + virtual ~SignalsWakeUpPipe() + { + delete m_source; + } + +private: + wxEventLoopSource* m_source; +}; + +} // anonymous namespace + +wxAppConsole::wxAppConsole() +{ + m_signalWakeUpPipe = NULL; +} + +wxAppConsole::~wxAppConsole() +{ + delete m_signalWakeUpPipe; +} + // use unusual names for arg[cv] to avoid clashes with wxApp members with the // same names bool wxAppConsole::Initialize(int& argc_, wxChar** argv_) @@ -41,14 +96,23 @@ bool wxAppConsole::Initialize(int& argc_, wxChar** argv_) return true; } +// The actual signal handler. It does as little as possible (because very few +// things are safe to do from inside a signal handler) and just ensures that +// CheckSignal() will be called later from SignalsWakeUpPipe::OnReadWaiting(). void wxAppConsole::HandleSignal(int signal) { wxAppConsole * const app = wxTheApp; if ( !app ) return; + // Register the signal that is caught. sigaddset(&(app->m_signalsCaught), signal); - app->WakeUpIdle(); + + // Wake up the application for handling the signal. + // + // Notice that we must have a valid wake up pipe here as we only install + // our signal handlers after allocating it. + app->m_signalWakeUpPipe->WakeUpNoLock(); } void wxAppConsole::CheckSignal() @@ -66,6 +130,27 @@ void wxAppConsole::CheckSignal() } } +wxFDIOHandler* wxAppConsole::RegisterSignalWakeUpPipe(wxFDIODispatcher& dispatcher) +{ + wxCHECK_MSG( m_signalWakeUpPipe, NULL, "Should be allocated" ); + + // we need a bridge to wxFDIODispatcher + // + // TODO: refactor the code so that only wxEventLoopSourceHandler is used + wxScopedPtr + fdioHandler(new wxFDIOEventLoopSourceHandler(m_signalWakeUpPipe)); + + if ( !dispatcher.RegisterFD + ( + m_signalWakeUpPipe->GetReadFd(), + fdioHandler.get(), + wxFDIO_INPUT + ) ) + return NULL; + + return fdioHandler.release(); +} + // the type of the signal handlers we use is "void(*)(int)" while the real // signal handlers are extern "C" and so have incompatible type and at least // Sun CC warns about it, so use explicit casts to suppress these warnings as @@ -80,6 +165,13 @@ bool wxAppConsole::SetSignalHandler(int signal, SignalHandler handler) const bool install = (SignalHandler_t)handler != SIG_DFL && (SignalHandler_t)handler != SIG_IGN; + if ( !m_signalWakeUpPipe ) + { + // Create the pipe that the signal handler will use to cause the event + // loop to call wxAppConsole::CheckSignal(). + m_signalWakeUpPipe = new SignalsWakeUpPipe(); + } + struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = (SignalHandler_t)&wxAppConsole::HandleSignal; diff --git a/Externals/wxWidgets3/src/unix/descrip.mms b/Externals/wxWidgets3/src/unix/descrip.mms index 21d2bf97bf..5ca84694c0 100644 --- a/Externals/wxWidgets3/src/unix/descrip.mms +++ b/Externals/wxWidgets3/src/unix/descrip.mms @@ -2,7 +2,7 @@ # * # Make file for VMS * # Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * -# Date : 7 January 2011 * +# Date : 20 August 2013 * # * #***************************************************************************** .first @@ -62,7 +62,7 @@ OBJECTS = appunix.obj,apptraits.obj,\ stdpaths.obj,\ taskbarx11.obj,\ timerunx.obj,evtloopunix.obj,fdiounix.obj,uiactionx11.obj,\ - mediactrl.obj + mediactrl.obj,wakeuppipe.obj SOURCES = appunix.cpp,apptraits.cpp,\ dialup.cpp,\ @@ -83,7 +83,7 @@ SOURCES = appunix.cpp,apptraits.cpp,\ stdpaths.cpp,\ taskbarx11.cpp,\ timerunx.cpp,evtloopunix.cpp,fdiounix.cpp,uiactionx11.cpp,\ - mediactrl.cpp + mediactrl.cpp,wakeuppipe.cpp all : $(SOURCES) $(MMS)$(MMSQUALIFIERS) $(OBJECTS) @@ -132,3 +132,4 @@ evtloopunix.obj : evtloopunix.cpp fdiounix.obj : fdiounix.cpp uiactionx11.obj : uiactionx11.cpp mediactrl.obj : mediactrl.cpp +wakeuppipe.obj : wakeuppipe.cpp diff --git a/Externals/wxWidgets3/src/unix/dialup.cpp b/Externals/wxWidgets3/src/unix/dialup.cpp index aa3193f0b7..95d37b22ef 100644 --- a/Externals/wxWidgets3/src/unix/dialup.cpp +++ b/Externals/wxWidgets3/src/unix/dialup.cpp @@ -4,7 +4,6 @@ // Author: Karsten Ballüder // Modified by: // Created: 03.10.99 -// RCS-ID: $Id: dialup.cpp 69910 2011-12-02 12:04:42Z VZ $ // Copyright: (c) Karsten Ballüder // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -36,7 +35,6 @@ #include #include #include -#define __STRICT_ANSI__ #include #include #include diff --git a/Externals/wxWidgets3/src/unix/dir.cpp b/Externals/wxWidgets3/src/unix/dir.cpp index 27d2765f68..f88a594935 100644 --- a/Externals/wxWidgets3/src/unix/dir.cpp +++ b/Externals/wxWidgets3/src/unix/dir.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 08.12.99 -// RCS-ID: $Id: dir.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,6 +30,7 @@ #include "wx/dir.h" #include "wx/filefn.h" // for wxMatchWild +#include "wx/filename.h" #include #include @@ -149,13 +149,20 @@ bool wxDirData::Read(wxString *filename) break; } - // check the type now - if ( !(m_flags & wxDIR_FILES) && !wxDir::Exists(path + de_d_name) ) + // check the type now: notice that we may want to check the type of + // the path itself and not whatever it points to in case of a symlink + wxFileName fn = wxFileName::DirName(path + de_d_name); + if ( m_flags & wxDIR_NO_FOLLOW ) + { + fn.DontFollowLink(); + } + + if ( !(m_flags & wxDIR_FILES) && !fn.DirExists() ) { // it's a file, but we don't want them continue; } - else if ( !(m_flags & wxDIR_DIRS) && wxDir::Exists(path + de_d_name) ) + else if ( !(m_flags & wxDIR_DIRS) && fn.DirExists() ) { // it's a dir, and we don't want it continue; @@ -235,19 +242,26 @@ wxString wxDir::GetName() const if ( m_data ) { name = M_DIR->GetName(); - if ( !name.empty() && (name.Last() == wxT('/')) ) + + // Notice that we need to check for length > 1 as we shouldn't remove + // the last slash from the root directory! + if ( name.length() > 1 && (name.Last() == wxT('/')) ) { - // chop off the last (back)slash - name.Truncate(name.length() - 1); + // chop off the last slash + name.RemoveLast(); } } return name; } -wxDir::~wxDir() +void wxDir::Close() { - delete M_DIR; + if ( m_data ) + { + delete m_data; + m_data = NULL; + } } // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/unix/displayx11.cpp b/Externals/wxWidgets3/src/unix/displayx11.cpp index b2826775ed..87dedfc530 100644 --- a/Externals/wxWidgets3/src/unix/displayx11.cpp +++ b/Externals/wxWidgets3/src/unix/displayx11.cpp @@ -4,7 +4,6 @@ // Author: Brian Victor, Vadim Zeitlin // Modified by: // Created: 12/05/02 -// RCS-ID: $Id: displayx11.cpp 64388 2010-05-23 16:31:33Z PC $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -382,7 +381,7 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& WXUNUSED(mode)) #include "wx/utils.h" -#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 || !defined(GDK_WINDOWING_X11) void wxClientDisplayRect(int *x, int *y, int *width, int *height) { @@ -424,6 +423,8 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) Display * const dpy = wxGetX11Display(); wxCHECK_RET( dpy, wxT("can't be called before initializing the GUI") ); + wxRect rectClient; + const Atom atomWorkArea = XInternAtom(dpy, "_NET_WORKAREA", True); if ( atomWorkArea ) { @@ -459,29 +460,46 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) numItems != 4 ) { wxLogDebug(wxT("XGetWindowProperty(\"_NET_WORKAREA\") failed")); - return; } - - if ( x ) - *x = workareas[0]; - if ( y ) - *y = workareas[1]; - if ( width ) - *width = workareas[2]; - if ( height ) - *height = workareas[3]; - - return; + else + { + rectClient = wxRect(workareas[0], workareas[1], + workareas[2], workareas[3]); + } } } - // if we get here, _NET_WORKAREA is not supported so return the entire - // screen size as fall back - if (x) - *x = 0; - if (y) - *y = 0; - wxDisplaySize(width, height); + // Although _NET_WORKAREA is supposed to return the client size of the + // screen, not all implementations are conforming, apparently, see #14419, + // so make sure we return a subset of the primary display. + wxRect rectFull; +#if wxUSE_DISPLAY + ScreensInfo screens; + const ScreenInfo& info = screens[0]; + rectFull = wxRect(info.x_org, info.y_org, info.width, info.height); +#else + wxDisplaySize(&rectFull.width, &rectFull.height); +#endif + + if ( !rectClient.width || !rectClient.height ) + { + // _NET_WORKAREA not available or didn't work, fall back to the total + // display size. + rectClient = rectFull; + } + else + { + rectClient = rectClient.Intersect(rectFull); + } + + if ( x ) + *x = rectClient.x; + if ( y ) + *y = rectClient.y; + if ( width ) + *width = rectClient.width; + if ( height ) + *height = rectClient.height; } #endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON diff --git a/Externals/wxWidgets3/src/unix/dlunix.cpp b/Externals/wxWidgets3/src/unix/dlunix.cpp index cb4e6737ab..881ea77687 100644 --- a/Externals/wxWidgets3/src/unix/dlunix.cpp +++ b/Externals/wxWidgets3/src/unix/dlunix.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-16 (extracted from common/dynlib.cpp) -// RCS-ID: $Id: dlunix.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2000-2005 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -65,15 +64,6 @@ // constants // ---------------------------------------------------------------------------- -// standard shared libraries extensions for different Unix versions -#if defined(__HPUX__) - const wxString wxDynamicLibrary::ms_dllext(".sl"); -#elif defined(__DARWIN__) - const wxString wxDynamicLibrary::ms_dllext(".bundle"); -#else - const wxString wxDynamicLibrary::ms_dllext(".so"); -#endif - // ============================================================================ // wxDynamicLibrary implementation // ============================================================================ diff --git a/Externals/wxWidgets3/src/unix/epolldispatcher.cpp b/Externals/wxWidgets3/src/unix/epolldispatcher.cpp index 15aaf8a2df..1efc707d00 100644 --- a/Externals/wxWidgets3/src/unix/epolldispatcher.cpp +++ b/Externals/wxWidgets3/src/unix/epolldispatcher.cpp @@ -3,7 +3,6 @@ // Purpose: implements dispatcher for epoll_wait() call // Author: Lukasz Michalski // Created: April 2007 -// RCS-ID: $Id: epolldispatcher.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2007 Lukasz Michalski // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/evtloopunix.cpp b/Externals/wxWidgets3/src/unix/evtloopunix.cpp index dc76b3c418..daeac691d1 100644 --- a/Externals/wxWidgets3/src/unix/evtloopunix.cpp +++ b/Externals/wxWidgets3/src/unix/evtloopunix.cpp @@ -3,8 +3,9 @@ // Purpose: wxEventLoop implementation // Author: Lukasz Michalski (lm@zork.pl) // Created: 2007-05-07 -// RCS-ID: $Id: evtloopunix.cpp 65992 2010-11-02 11:57:19Z VZ $ // Copyright: (c) 2006 Zork Lukasz Michalski +// (c) 2009, 2013 Vadim Zeitlin +// (c) 2013 Rob Bresalier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -28,124 +29,22 @@ #include "wx/log.h" #endif -#include #include "wx/apptrait.h" #include "wx/scopedptr.h" #include "wx/thread.h" #include "wx/module.h" -#include "wx/unix/pipe.h" #include "wx/unix/private/timer.h" #include "wx/unix/private/epolldispatcher.h" +#include "wx/unix/private/wakeuppipe.h" #include "wx/private/selectdispatcher.h" +#include "wx/private/eventloopsourcesmanager.h" +#include "wx/private/fdioeventloopsourcehandler.h" +#include "wx/private/eventloopsourcesmanager.h" #if wxUSE_EVENTLOOP_SOURCE #include "wx/evtloopsrc.h" #endif // wxUSE_EVENTLOOP_SOURCE -#define TRACE_EVENTS wxT("events") - -// =========================================================================== -// wxEventLoop::PipeIOHandler implementation -// =========================================================================== - -namespace wxPrivate -{ - -// pipe used for wake up messages: when a child thread wants to wake up -// the event loop in the main thread it writes to this pipe -class PipeIOHandler : public wxFDIOHandler -{ -public: - // default ctor does nothing, call Create() to really initialize the - // object - PipeIOHandler() { } - - bool Create(); - - // this method can be, and normally is, called from another thread - void WakeUp(); - - int GetReadFd() { return m_pipe[wxPipe::Read]; } - - // implement wxFDIOHandler pure virtual methods - virtual void OnReadWaiting(); - virtual void OnWriteWaiting() { } - virtual void OnExceptionWaiting() { } - -private: - wxPipe m_pipe; -}; - -// ---------------------------------------------------------------------------- -// initialization -// ---------------------------------------------------------------------------- - -bool PipeIOHandler::Create() -{ - if ( !m_pipe.Create() ) - { - wxLogError(_("Failed to create wake up pipe used by event loop.")); - return false; - } - - if ( !m_pipe.MakeNonBlocking(wxPipe::Read) ) - { - wxLogSysError(_("Failed to switch wake up pipe to non-blocking mode")); - return false; - } - - wxLogTrace(TRACE_EVENTS, wxT("Wake up pipe (%d, %d) created"), - m_pipe[wxPipe::Read], m_pipe[wxPipe::Write]); - - return true; -} - -// ---------------------------------------------------------------------------- -// wakeup handling -// ---------------------------------------------------------------------------- - -void PipeIOHandler::WakeUp() -{ - if ( write(m_pipe[wxPipe::Write], "s", 1) != 1 ) - { - // don't use wxLog here, we can be in another thread and this could - // result in dead locks - perror("write(wake up pipe)"); - } -} - -void PipeIOHandler::OnReadWaiting() -{ - // got wakeup from child thread: read all data available in pipe just to - // make it empty (even though we write one byte at a time from WakeUp(), - // it could have been called several times) - char buf[4]; - for ( ;; ) - { - const int size = read(GetReadFd(), buf, WXSIZEOF(buf)); - - if ( size == 0 || (size == -1 && (errno == EAGAIN || errno == EINTR)) ) - { - // nothing left in the pipe (EAGAIN is expected for an FD with - // O_NONBLOCK) - break; - } - - if ( size == -1 ) - { - wxLogSysError(_("Failed to read from wake-up pipe")); - - break; - } - } - - // writing to the wake up pipe will make wxConsoleEventLoop return from - // wxFDIODispatcher::Dispatch() it might be currently blocking in, nothing - // else needs to be done -} - -} // namespace wxPrivate - // =========================================================================== // wxEventLoop implementation // =========================================================================== @@ -156,34 +55,44 @@ void PipeIOHandler::OnReadWaiting() wxConsoleEventLoop::wxConsoleEventLoop() { - m_wakeupPipe = new wxPrivate::PipeIOHandler(); - if ( !m_wakeupPipe->Create() ) - { - wxDELETE(m_wakeupPipe); - m_dispatcher = NULL; - return; - } + // Be pessimistic initially and assume that we failed to initialize. + m_dispatcher = NULL; + m_wakeupPipe = NULL; + m_wakeupSource = NULL; + // Create the pipe. + wxScopedPtr wakeupPipe(new wxWakeUpPipeMT); + const int pipeFD = wakeupPipe->GetReadFd(); + if ( pipeFD == wxPipe::INVALID_FD ) + return; + + // And start monitoring it in our event loop. + m_wakeupSource = wxEventLoopBase::AddSourceForFD + ( + pipeFD, + wakeupPipe.get(), + wxFDIO_INPUT + ); + + if ( !m_wakeupSource ) + return; + + // This is a bit ugly but we know that AddSourceForFD() used the currently + // active dispatcher to register this source, so use the same one for our + // other operations. Of course, currently the dispatcher returned by + // wxFDIODispatcher::Get() is always the same one anyhow so it doesn't + // really matter, but if we started returning different things later, it + // would. m_dispatcher = wxFDIODispatcher::Get(); - if ( !m_dispatcher ) - return; - m_dispatcher->RegisterFD - ( - m_wakeupPipe->GetReadFd(), - m_wakeupPipe, - wxFDIO_INPUT - ); + m_wakeupPipe = wakeupPipe.release(); } wxConsoleEventLoop::~wxConsoleEventLoop() { if ( m_wakeupPipe ) { - if ( m_dispatcher ) - { - m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd()); - } + delete m_wakeupSource; delete m_wakeupPipe; } @@ -195,54 +104,37 @@ wxConsoleEventLoop::~wxConsoleEventLoop() #if wxUSE_EVENTLOOP_SOURCE -// This class is a temporary bridge between event loop sources and -// FDIODispatcher. It is going to be removed soon, when all subject interfaces -// are modified -class wxFDIOEventLoopSourceHandler : public wxFDIOHandler +class wxConsoleEventLoopSourcesManager : public wxEventLoopSourcesManagerBase { public: - wxFDIOEventLoopSourceHandler(wxEventLoopSourceHandler* handler) : - m_impl(handler) { } - - virtual void OnReadWaiting() + wxEventLoopSource* AddSourceForFD( int fd, + wxEventLoopSourceHandler *handler, + int flags) { - m_impl->OnReadWaiting(); - } - virtual void OnWriteWaiting() - { - m_impl->OnWriteWaiting(); - } + wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); - virtual void OnExceptionWaiting() - { - m_impl->OnExceptionWaiting(); - } + wxLogTrace(wxTRACE_EVT_SOURCE, + "Adding event loop source for fd=%d", fd); -protected: - wxEventLoopSourceHandler* m_impl; + // we need a bridge to wxFDIODispatcher + // + // TODO: refactor the code so that only wxEventLoopSourceHandler is used + wxScopedPtr + fdioHandler(new wxFDIOEventLoopSourceHandler(handler)); + + if ( !wxFDIODispatcher::Get()->RegisterFD(fd, fdioHandler.get(), flags) ) + return NULL; + + return new wxUnixEventLoopSource(wxFDIODispatcher::Get(), fdioHandler.release(), + fd, handler, flags); + } }; -wxEventLoopSource * -wxConsoleEventLoop::AddSourceForFD(int fd, - wxEventLoopSourceHandler *handler, - int flags) +wxEventLoopSourcesManagerBase* wxAppTraits::GetEventLoopSourcesManager() { - wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); + static wxConsoleEventLoopSourcesManager s_eventLoopSourcesManager; - wxLogTrace(wxTRACE_EVT_SOURCE, - "Adding event loop source for fd=%d", fd); - - // we need a bridge to wxFDIODispatcher - // - // TODO: refactor the code so that only wxEventLoopSourceHandler is used - wxScopedPtr - fdioHandler(new wxFDIOEventLoopSourceHandler(handler)); - - if ( !m_dispatcher->RegisterFD(fd, fdioHandler.get(), flags) ) - return NULL; - - return new wxUnixEventLoopSource(m_dispatcher, fdioHandler.release(), - fd, handler, flags); + return &s_eventLoopSourcesManager; } wxUnixEventLoopSource::~wxUnixEventLoopSource() diff --git a/Externals/wxWidgets3/src/unix/fdiounix.cpp b/Externals/wxWidgets3/src/unix/fdiounix.cpp index d149105f49..766316d6fe 100644 --- a/Externals/wxWidgets3/src/unix/fdiounix.cpp +++ b/Externals/wxWidgets3/src/unix/fdiounix.cpp @@ -3,7 +3,6 @@ // Purpose: wxFDIOManager implementation for console Unix applications // Author: Vadim Zeitlin // Created: 2009-08-17 -// RCS-ID: $Id: fdiounix.cpp 62187 2009-09-28 15:35:48Z PC $ // Copyright: (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/fontenum.cpp b/Externals/wxWidgets3/src/unix/fontenum.cpp index 07abe2b9a8..cc7ee1dad4 100644 --- a/Externals/wxWidgets3/src/unix/fontenum.cpp +++ b/Externals/wxWidgets3/src/unix/fontenum.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 01.10.99 -// RCS-ID: $Id: fontenum.cpp 58909 2009-02-15 12:48:31Z FM $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/fontutil.cpp b/Externals/wxWidgets3/src/unix/fontutil.cpp index 140a07e92b..4eecb5009a 100644 --- a/Externals/wxWidgets3/src/unix/fontutil.cpp +++ b/Externals/wxWidgets3/src/unix/fontutil.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 05.11.99 -// RCS-ID: $Id: fontutil.cpp 70740 2012-02-28 18:06:22Z PC $ // Copyright: (c) Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,12 +28,12 @@ #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/font.h" // wxFont enums - #include "wx/encinfo.h" #include "wx/hash.h" #include "wx/utils.h" // for wxGetDisplay() #include "wx/module.h" #endif // PCH +#include "wx/encinfo.h" #include "wx/fontmap.h" #include "wx/tokenzr.h" #include "wx/fontenum.h" @@ -64,14 +63,24 @@ void wxNativeFontInfo::Init() { description = NULL; + m_underlined = false; + m_strikethrough = false; } void wxNativeFontInfo::Init(const wxNativeFontInfo& info) { if (info.description) + { description = pango_font_description_copy(info.description); + m_underlined = info.GetUnderlined(); + m_strikethrough = info.GetStrikethrough(); + } else + { description = NULL; + m_underlined = false; + m_strikethrough = false; + } } void wxNativeFontInfo::Free() @@ -130,12 +139,12 @@ wxFontWeight wxNativeFontInfo::GetWeight() const bool wxNativeFontInfo::GetUnderlined() const { - return false; + return m_underlined; } bool wxNativeFontInfo::GetStrikethrough() const { - return false; + return m_strikethrough; } wxString wxNativeFontInfo::GetFaceName() const @@ -262,16 +271,18 @@ void wxNativeFontInfo::SetWeight(wxFontWeight weight) } } -void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined)) +void wxNativeFontInfo::SetUnderlined(bool underlined) { - // wxWindowDCImpl::DoDrawText will take care of rendering font with - // the underline attribute! - wxFAIL_MSG( "not implemented" ); + // Pango doesn't have the underlined attribute so we store it separately + // (and handle it specially in wxWindowDCImpl::DoDrawText()). + m_underlined = underlined; } -void wxNativeFontInfo::SetStrikethrough(bool WXUNUSED(strikethrough)) +void wxNativeFontInfo::SetStrikethrough(bool strikethrough) { - wxFAIL_MSG( "not implemented" ); + // As with the underlined attribute above, we handle this one separately as + // Pango doesn't support it as part of the font description. + m_strikethrough = strikethrough; } bool wxNativeFontInfo::SetFaceName(const wxString& facename) @@ -306,25 +317,34 @@ void wxNativeFontInfo::SetFamily(wxFontFamily family) case wxFONTFAMILY_ROMAN: // corresponds to the serif font family in the page linked above + facename.Add(wxS("Serif")); + facename.Add(wxS("DejaVu Serif")); + facename.Add(wxS("DejaVu LGC Serif")); + facename.Add(wxS("Bitstream Vera Serif")); + facename.Add(wxS("Liberation Serif")); + facename.Add(wxS("FreeSerif")); + facename.Add(wxS("Luxi Serif")); + facename.Add(wxS("Times New Roman")); facename.Add(wxS("Century Schoolbook L")); facename.Add(wxS("URW Bookman L")); facename.Add(wxS("URW Palladio L")); - facename.Add(wxS("DejaVu Serif")); - facename.Add(wxS("FreeSerif")); - facename.Add(wxS("Times New Roman")); facename.Add(wxS("Times")); break; case wxFONTFAMILY_TELETYPE: case wxFONTFAMILY_MODERN: // corresponds to the monospace font family in the page linked above + facename.Add(wxS("Monospace")); facename.Add(wxS("DejaVu Sans Mono")); - facename.Add(wxS("Nimbus Mono L")); + facename.Add(wxS("DejaVu LGC Sans Mono")); facename.Add(wxS("Bitstream Vera Sans Mono")); - facename.Add(wxS("Andale Mono")); - facename.Add(wxS("Lucida Sans Typewriter")); + facename.Add(wxS("Liberation Mono")); facename.Add(wxS("FreeMono")); + facename.Add(wxS("Luxi Mono")); facename.Add(wxS("Courier New")); + facename.Add(wxS("Lucida Sans Typewriter")); + facename.Add(wxS("Nimbus Mono L")); + facename.Add(wxS("Andale Mono")); facename.Add(wxS("Courier")); break; @@ -332,13 +352,17 @@ void wxNativeFontInfo::SetFamily(wxFontFamily family) case wxFONTFAMILY_DEFAULT: default: // corresponds to the sans-serif font family in the page linked above + facename.Add(wxS("Sans")); facename.Add(wxS("DejaVu Sans")); - facename.Add(wxS("URW Gothic L")); - facename.Add(wxS("Nimbus Sans L")); + facename.Add(wxS("DejaVu LGC Sans")); facename.Add(wxS("Bitstream Vera Sans")); - facename.Add(wxS("Lucida Sans")); - facename.Add(wxS("Arial")); + facename.Add(wxS("Liberation Sans")); facename.Add(wxS("FreeSans")); + facename.Add(wxS("Luxi Sans")); + facename.Add(wxS("Arial")); + facename.Add(wxS("Lucida Sans")); + facename.Add(wxS("Nimbus Sans L")); + facename.Add(wxS("URW Gothic L")); break; } @@ -352,6 +376,14 @@ void wxNativeFontInfo::SetEncoding(wxFontEncoding WXUNUSED(encoding)) bool wxNativeFontInfo::FromString(const wxString& s) { + wxString str(s); + + // Pango font description doesn't have 'underlined' or 'strikethrough' + // attributes, so we handle them specially by extracting them from the + // string before passing it to Pango. + m_underlined = str.StartsWith(wxS("underlined "), &str); + m_strikethrough = str.StartsWith(wxS("strikethrough "), &str); + if (description) pango_font_description_free( description ); @@ -362,7 +394,6 @@ bool wxNativeFontInfo::FromString(const wxString& s) // we do the check on the size here using same (arbitrary) limits used by // pango > 1.13. Note that the segfault could happen also for pointsize // smaller than this limit !! - wxString str(s); const size_t pos = str.find_last_of(wxS(" ")); double size; if ( pos != wxString::npos && wxString(str, pos + 1).ToDouble(&size) ) @@ -394,8 +425,18 @@ bool wxNativeFontInfo::FromString(const wxString& s) wxString wxNativeFontInfo::ToString() const { wxGtkString str(pango_font_description_to_string( description )); + wxString desc = wxPANGO_CONV_BACK(str); - return wxPANGO_CONV_BACK(str); + // Augment the string with the attributes not handled by Pango. + // + // Notice that we must add them in the same order they are extracted in + // FromString() above. + if (m_strikethrough) + desc.insert(0, wxS("strikethrough ")); + if (m_underlined) + desc.insert(0, wxS("underlined ")); + + return desc; } bool wxNativeFontInfo::FromUserString(const wxString& s) @@ -947,9 +988,9 @@ bool wxTestFontEncoding(const wxNativeEncodingInfo& info) { wxString fontspec; fontspec.Printf(wxT("-*-%s-*-*-*-*-*-*-*-*-*-*-%s-%s"), - !info.facename ? wxT("*") : info.facename.c_str(), - info.xregistry.c_str(), - info.xencoding.c_str()); + info.facename.empty() ? wxString("*") : info.facename, + info.xregistry, + info.xencoding); return wxTestFontSpec(fontspec); } diff --git a/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp b/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp index d5c05f177e..117a036d4e 100644 --- a/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp +++ b/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp @@ -3,7 +3,6 @@ // Purpose: inotify-based wxFileSystemWatcher implementation // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_inotify.cpp 64656 2010-06-20 18:18:23Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -139,6 +138,9 @@ public: wxFAIL_MSG( wxString::Format("Path %s is not watched", watch->GetPath()) ); } + // Cache the wd in case any events arrive late + m_staleDescriptors.Add(watch->GetWatchDescriptor()); + watch->SetWatchDescriptor(-1); return true; } @@ -217,24 +219,98 @@ protected: // will be already removed from our list at that time if (inevt.mask & IN_IGNORED) { + // It is now safe to remove it from the stale descriptors too, we + // won't get any more events for it. + // However if we're here because a dir that we're still watching + // has just been deleted, its wd won't be on this list + const int pos = m_staleDescriptors.Index(inevt.wd); + if ( pos != wxNOT_FOUND ) + { + m_staleDescriptors.RemoveAt(static_cast(pos)); + wxLogTrace(wxTRACE_FSWATCHER, + "Removed wd %i from the stale-wd cache", inevt.wd); + } return; } // get watch entry for this event wxFSWatchEntryDescriptors::iterator it = m_watchMap.find(inevt.wd); - wxCHECK_RET(it != m_watchMap.end(), - "Watch descriptor not present in the watch map!"); - wxFSWatchEntry& watch = *(it->second); + // wd will be -1 for IN_Q_OVERFLOW, which would trigger the wxFAIL_MSG + if (inevt.wd != -1) + { + if (it == m_watchMap.end()) + { + // It's not in the map; check if was recently removed from it. + if (m_staleDescriptors.Index(inevt.wd) != wxNOT_FOUND) + { + wxLogTrace(wxTRACE_FSWATCHER, + "Got an event for stale wd %i", inevt.wd); + } + else + { + // In theory we shouldn't reach here. In practice, some + // events, e.g. IN_MODIFY, arrive just after the IN_IGNORED + // so their wd has already been discarded. Warn about them. + wxFileSystemWatcherEvent + event + ( + wxFSW_EVENT_WARNING, + wxString::Format + ( + _("Unexpected event for \"%s\": no " + "matching watch descriptor."), + inevt.len ? inevt.name : "" + ) + ); + SendEvent(event); + + } + + // In any case, don't process this event: it's either for an + // already removed entry, or for an unknown one. + return; + } + } + int nativeFlags = inevt.mask; int flags = Native2WatcherFlags(nativeFlags); // check out for error/warning condition if (flags & wxFSW_EVENT_WARNING || flags & wxFSW_EVENT_ERROR) { - wxString errMsg = GetErrorDescription(Watcher2NativeFlags(flags)); + wxString errMsg = GetErrorDescription(nativeFlags); wxFileSystemWatcherEvent event(flags, errMsg); SendEvent(event); + return; + } + + if (inevt.wd == -1) + { + // Although this is not supposed to happen, we seem to be getting + // occasional IN_ACCESS/IN_MODIFY events without valid watch value. + wxFileSystemWatcherEvent + event + ( + wxFSW_EVENT_WARNING, + wxString::Format + ( + _("Invalid inotify event for \"%s\""), + inevt.len ? inevt.name : "" + ) + ); + SendEvent(event); + return; + } + + wxFSWatchEntry& watch = *(it->second); + + // Now IN_UNMOUNT. We must do so here, as it's not in the watch flags + if (nativeFlags & IN_UNMOUNT) + { + wxFileName path = GetEventPath(watch, inevt); + wxFileSystemWatcherEvent event(wxFSW_EVENT_UNMOUNT, path, path); + SendEvent(event); } // filter out ignored events and those not asked for. // we never filter out warnings or exceptions @@ -242,11 +318,92 @@ protected: { return; } + + // Creation + // We need do something here only if the original watch was recursive; + // we don't watch a child dir itself inside a non-tree watch. + // We watch only dirs explicitly, so we don't want file IN_CREATEs. + // Distinguish by whether nativeFlags contain IN_ISDIR + else if ((nativeFlags & IN_CREATE) && + (watch.GetType() == wxFSWPath_Tree) && (inevt.mask & IN_ISDIR)) + { + wxFileName fn = GetEventPath(watch, inevt); + // Though it's a dir, fn treats it as a file. So: + fn.AssignDir(fn.GetFullPath()); + + if (m_watcher->AddAny(fn, wxFSW_EVENT_ALL, + wxFSWPath_Tree, watch.GetFilespec())) + { + // Tell the owner, in case it's interested + // If there's a filespec, assume he's not + if (watch.GetFilespec().empty()) + { + wxFileSystemWatcherEvent event(flags, fn, fn); + SendEvent(event); + } + } + } + + // Deletion + // We watch only dirs explicitly, so we don't want file IN_DELETEs. + // We obviously can't check using DirExists() as the object has been + // deleted; and nativeFlags here doesn't contain IN_ISDIR, even for + // a dir. Fortunately IN_DELETE_SELF doesn't happen for files. We need + // to do something here only inside a tree watch, or if it's the parent + // dir that's deleted. Otherwise let the parent dir cope + else if ((nativeFlags & IN_DELETE_SELF) && + ((watch.GetType() == wxFSWPath_Dir) || + (watch.GetType() == wxFSWPath_Tree))) + { + // We must remove the deleted directory from the map, so that + // DoRemoveInotify() isn't called on it in the future. Don't assert + // if the wd isn't found: repeated IN_DELETE_SELFs can occur + wxFileName fn = GetEventPath(watch, inevt); + wxString path(fn.GetPathWithSep()); + + if (m_watchMap.erase(inevt.wd) == 1) + { + // Delete from wxFileSystemWatcher + wxDynamicCast(m_watcher, wxInotifyFileSystemWatcher)-> + OnDirDeleted(path); + + // Now remove from our local list of watched items + wxFSWatchEntries::iterator wit = + m_watches.find(path); + if (wit != m_watches.end()) + { + m_watches.erase(wit); + } + + // Cache the wd in case any events arrive late + m_staleDescriptors.Add(inevt.wd); + } + + // Tell the owner, in case it's interested + // If there's a filespec, assume he's not + if (watch.GetFilespec().empty()) + { + wxFileSystemWatcherEvent event(flags, fn, fn); + SendEvent(event); + } + } + // renames else if (nativeFlags & IN_MOVE) { - wxInotifyCookies::iterator it = m_cookies.find(inevt.cookie); - if ( it == m_cookies.end() ) + // IN_MOVE events are produced in the following circumstances: + // * A move within a dir (what the user sees as a rename) gives an + // IN_MOVED_FROM and IN_MOVED_TO pair, each with the same path. + // * A move within watched dir foo/ e.g. from foo/bar1/ to foo/bar2/ + // will also produce such a pair, but with different paths. + // * A move to baz/ will give only an IN_MOVED_FROM for foo/bar1; + // if baz/ is inside a different watch, that gets the IN_MOVED_TO. + + // The first event to arrive, usually the IN_MOVED_FROM, is + // cached to await a matching IN_MOVED_TO; should none arrive, the + // unpaired event will be processed later in ProcessRenames(). + wxInotifyCookies::iterator it2 = m_cookies.find(inevt.cookie); + if ( it2 == m_cookies.end() ) { int size = sizeof(inevt) + inevt.len; inotify_event* e = (inotify_event*) operator new (size); @@ -257,22 +414,47 @@ protected: } else { - inotify_event& oldinevt = *(it->second); + inotify_event& oldinevt = *(it2->second); - wxFileSystemWatcherEvent event(flags); - if ( inevt.mask & IN_MOVED_FROM ) + // Tell the owner, in case it's interested + // If there's a filespec, assume he's not + if ( watch.GetFilespec().empty() ) { - event.SetPath(GetEventPath(watch, inevt)); - event.SetNewPath(GetEventPath(watch, oldinevt)); - } - else - { - event.SetPath(GetEventPath(watch, oldinevt)); - event.SetNewPath(GetEventPath(watch, inevt)); - } - SendEvent(event); + // The the only way to know the path for the first event, + // normally the IN_MOVED_FROM, is to retrieve the watch + // corresponding to oldinevt. This is needed for a move + // within a watch. + wxFSWatchEntry* oldwatch; + wxFSWatchEntryDescriptors::iterator oldwatch_it = + m_watchMap.find(oldinevt.wd); + if (oldwatch_it != m_watchMap.end()) + { + oldwatch = oldwatch_it->second; + } + else + { + wxLogTrace(wxTRACE_FSWATCHER, + "oldinevt's watch descriptor not in the watch map"); + // For want of a better alternative, use 'watch'. That + // will work fine for renames, though not for moves + oldwatch = &watch; + } - m_cookies.erase(it); + wxFileSystemWatcherEvent event(flags); + if ( inevt.mask & IN_MOVED_FROM ) + { + event.SetPath(GetEventPath(watch, inevt)); + event.SetNewPath(GetEventPath(*oldwatch, oldinevt)); + } + else + { + event.SetPath(GetEventPath(*oldwatch, oldinevt)); + event.SetNewPath(GetEventPath(watch, inevt)); + } + SendEvent(event); + } + + m_cookies.erase(it2); delete &oldinevt; } } @@ -280,13 +462,19 @@ protected: else { wxFileName path = GetEventPath(watch, inevt); - wxFileSystemWatcherEvent event(flags, path, path); - SendEvent(event); + // For files, check that it matches any filespec + if ( MatchesFilespec(path, watch.GetFilespec()) ) + { + wxFileSystemWatcherEvent event(flags, path, path); + SendEvent(event); + } } } void ProcessRenames() { + // After all of a batch of events has been processed, this deals with + // any still-unpaired IN_MOVED_FROM or IN_MOVED_TO events. wxInotifyCookies::iterator it = m_cookies.begin(); while ( it != m_cookies.end() ) { @@ -297,14 +485,26 @@ protected: // get watch entry for this event wxFSWatchEntryDescriptors::iterator wit = m_watchMap.find(inevt.wd); - wxCHECK_RET(wit != m_watchMap.end(), - "Watch descriptor not present in the watch map!"); - - wxFSWatchEntry& watch = *(wit->second); - int flags = Native2WatcherFlags(inevt.mask); - wxFileName path = GetEventPath(watch, inevt); - wxFileSystemWatcherEvent event(flags, path, path); - SendEvent(event); + if (wit == m_watchMap.end()) + { + wxLogTrace(wxTRACE_FSWATCHER, + "Watch descriptor not present in the watch map!"); + } + else + { + // Tell the owner, in case it's interested + // If there's a filespec, assume he's not + wxFSWatchEntry& watch = *(wit->second); + if ( watch.GetFilespec().empty() ) + { + int flags = Native2WatcherFlags(inevt.mask); + wxFileName path = GetEventPath(watch, inevt); + { + wxFileSystemWatcherEvent event(flags, path, path); + SendEvent(event); + } + } + } m_cookies.erase(it); delete &inevt; @@ -344,9 +544,12 @@ protected: wxString mask = (inevt.mask & IN_ISDIR) ? wxString::Format("IS_DIR | %u", inevt.mask & ~IN_ISDIR) : wxString::Format("%u", inevt.mask); + const char* name = ""; + if (inevt.len) + name = inevt.name; return wxString::Format("Event: wd=%d, mask=%s, cookie=%u, len=%u, " "name=%s", inevt.wd, mask, inevt.cookie, - inevt.len, inevt.name); + inevt.len, name); } static wxFileName GetEventPath(const wxFSWatchEntry& watch, @@ -354,17 +557,40 @@ protected: { // only when dir is watched, we have non-empty e.name wxFileName path = watch.GetPath(); - if (path.IsDir()) + if (path.IsDir() && inevt.len) { path = wxFileName(path.GetPath(), inevt.name); } return path; } - static int Watcher2NativeFlags(int WXUNUSED(flags)) + static int Watcher2NativeFlags(int flags) { - // TODO: it would be nice to subscribe only to the events we really need - return IN_ALL_EVENTS; + // Start with the standard case of wanting all events + if (flags == wxFSW_EVENT_ALL) + { + return IN_ALL_EVENTS; + } + + static const int flag_mapping[][2] = { + { wxFSW_EVENT_ACCESS, IN_ACCESS }, + { wxFSW_EVENT_MODIFY, IN_MODIFY }, + { wxFSW_EVENT_ATTRIB, IN_ATTRIB }, + { wxFSW_EVENT_RENAME, IN_MOVE }, + { wxFSW_EVENT_CREATE, IN_CREATE }, + { wxFSW_EVENT_DELETE, IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF }, + { wxFSW_EVENT_UNMOUNT, IN_UNMOUNT } + // wxFSW_EVENT_ERROR/WARNING make no sense here + }; + + int native_flags = 0; + for ( unsigned int i=0; i < WXSIZEOF(flag_mapping); ++i) + { + if (flags & flag_mapping[i][0]) + native_flags |= flag_mapping[i][1]; + } + + return native_flags; } static int Native2WatcherFlags(int flags) @@ -372,7 +598,7 @@ protected: static const int flag_mapping[][2] = { { IN_ACCESS, wxFSW_EVENT_ACCESS }, // generated during read! { IN_MODIFY, wxFSW_EVENT_MODIFY }, - { IN_ATTRIB, 0 }, + { IN_ATTRIB, wxFSW_EVENT_ATTRIB }, { IN_CLOSE_WRITE, 0 }, { IN_CLOSE_NOWRITE, 0 }, { IN_OPEN, 0 }, @@ -383,10 +609,10 @@ protected: { IN_DELETE_SELF, wxFSW_EVENT_DELETE }, { IN_MOVE_SELF, wxFSW_EVENT_DELETE }, - { IN_UNMOUNT, wxFSW_EVENT_ERROR }, + { IN_UNMOUNT, wxFSW_EVENT_UNMOUNT}, { IN_Q_OVERFLOW, wxFSW_EVENT_WARNING}, - // ignored, because this is genereted mainly by watcher::Remove() + // ignored, because this is generated mainly by watcher::Remove() { IN_IGNORED, 0 } }; @@ -409,8 +635,6 @@ protected: { switch ( flag ) { - case IN_UNMOUNT: - return _("File system containing watched object was unmounted"); case IN_Q_OVERFLOW: return _("Event queue overflowed"); } @@ -422,6 +646,7 @@ protected: wxFSWSourceHandler* m_handler; // handler for inotify event source wxFSWatchEntryDescriptors m_watchMap; // inotify wd=>wxFSWatchEntry* map + wxArrayInt m_staleDescriptors; // stores recently-removed watches wxInotifyCookies m_cookies; // map to track renames wxEventLoopSource* m_source; // our event loop source @@ -486,6 +711,19 @@ bool wxInotifyFileSystemWatcher::Init() return m_service->Init(); } +void wxInotifyFileSystemWatcher::OnDirDeleted(const wxString& path) +{ + if (!path.empty()) + { + wxFSWatchInfoMap::iterator it = m_watches.find(path); + wxCHECK_RET(it != m_watches.end(), + wxString::Format("Path '%s' is not watched", path)); + + // path has been deleted, so we must forget it whatever its refcount + m_watches.erase(it); + } +} + #endif // wxHAS_INOTIFY #endif // wxUSE_FSWATCHER diff --git a/Externals/wxWidgets3/src/unix/fswatcher_kqueue.cpp b/Externals/wxWidgets3/src/unix/fswatcher_kqueue.cpp index 0068a095ac..2bc1634dfc 100644 --- a/Externals/wxWidgets3/src/unix/fswatcher_kqueue.cpp +++ b/Externals/wxWidgets3/src/unix/fswatcher_kqueue.cpp @@ -3,7 +3,6 @@ // Purpose: kqueue-based wxFileSystemWatcher implementation // Author: Bartosz Bekier // Created: 2009-05-26 -// RCS-ID: $Id: fswatcher_kqueue.cpp 67677 2011-05-03 10:40:28Z VZ $ // Copyright: (c) 2009 Bartosz Bekier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -149,8 +148,7 @@ public: // TODO more error conditions according to man // XXX closing file descriptor removes the watch. The logic resides in // the watch which is not nice, but effective and simple - bool ret = watch->Close(); - if (ret == -1) + if ( !watch->Close() ) { wxLogSysError(_("Unable to remove kqueue watch")); return false; diff --git a/Externals/wxWidgets3/src/unix/glx11.cpp b/Externals/wxWidgets3/src/unix/glx11.cpp index 7bfb310c93..ec2bd5b098 100644 --- a/Externals/wxWidgets3/src/unix/glx11.cpp +++ b/Externals/wxWidgets3/src/unix/glx11.cpp @@ -3,7 +3,6 @@ // Purpose: code common to all X11-based wxGLCanvas implementations // Author: Vadim Zeitlin // Created: 2007-04-15 -// RCS-ID: $Id: glx11.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/joystick.cpp b/Externals/wxWidgets3/src/unix/joystick.cpp index f87698d17e..cf9cc33b3e 100644 --- a/Externals/wxWidgets3/src/unix/joystick.cpp +++ b/Externals/wxWidgets3/src/unix/joystick.cpp @@ -4,7 +4,6 @@ // Author: Ported to Linux by Guilhem Lavaux // Modified by: // Created: 05/23/98 -// RCS-ID: $Id: joystick.cpp 58381 2009-01-25 11:58:39Z FM $ // Copyright: (c) Guilhem Lavaux // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -19,6 +18,7 @@ #ifndef WX_PRECOMP #include "wx/event.h" #include "wx/window.h" + #include "wx/log.h" #endif //WX_PRECOMP #include "wx/thread.h" @@ -136,6 +136,14 @@ void* wxJoystickThread::Entry() if ((j_evt.type & JS_EVENT_AXIS) && (j_evt.number < wxJS_MAX_AXES)) { + // Ignore invalid axis. + if ( j_evt.number >= wxJS_MAX_AXES ) + { + wxLogDebug(wxS("Invalid axis index %d in joystick message."), + j_evt.number); + continue; + } + if ( (m_axe[j_evt.number] + m_threshold < j_evt.value) || (m_axe[j_evt.number] - m_threshold > j_evt.value) ) { diff --git a/Externals/wxWidgets3/src/unix/mediactrl.cpp b/Externals/wxWidgets3/src/unix/mediactrl.cpp index 5e299ba297..f01b1f15fd 100644 --- a/Externals/wxWidgets3/src/unix/mediactrl.cpp +++ b/Externals/wxWidgets3/src/unix/mediactrl.cpp @@ -4,7 +4,6 @@ // Author: Ryan Norton // Modified by: // Created: 02/04/05 -// RCS-ID: $Id: mediactrl.cpp 70622 2012-02-18 19:43:03Z SN $ // Copyright: (c) 2004-2005 Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -34,7 +33,9 @@ #include "wx/timer.h" // wxTimer #endif +#include "wx/filesys.h" // FileNameToURL() #include "wx/thread.h" // wxMutex/wxMutexLocker +#include "wx/vector.h" // wxVector #ifdef __WXGTK__ #include @@ -185,6 +186,7 @@ public: virtual double GetVolume(); //------------implementation from now on----------------------------------- + bool CheckForErrors(); bool DoLoad(const wxString& locstring); wxMediaCtrl* GetControl() { return m_ctrl; } // for C Callbacks void HandleStateChange(GstElementState oldstate, GstElementState newstate); @@ -205,6 +207,23 @@ public: wxMutex m_asynclock; // See "discussion of internals" class wxGStreamerMediaEventHandler* m_eventHandler; // see below + // Mutex protecting just the variables below which are set from + // gst_error_callback() called from a different thread. + wxMutex m_mutexErr; + struct Error + { + Error(const gchar* message, const gchar* debug) + : m_message(message, wxConvUTF8), + m_debug(debug, wxConvUTF8) + { + } + + wxString m_message, + m_debug; + }; + + wxVector m_errors; + friend class wxGStreamerMediaEventHandler; friend class wxGStreamerLoadWaitTimer; DECLARE_DYNAMIC_CLASS(wxGStreamerMediaBackend) @@ -256,15 +275,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxGStreamerMediaBackend, wxMediaBackend) //----------------------------------------------------------------------------- #ifdef __WXGTK__ extern "C" { -static gboolean gtk_window_expose_callback(GtkWidget *widget, - GdkEventExpose *event, - wxGStreamerMediaBackend *be) +static gboolean +#ifdef __WXGTK3__ +draw(GtkWidget* widget, cairo_t* cr, wxGStreamerMediaBackend* be) +#else +expose_event(GtkWidget* widget, GdkEventExpose* event, wxGStreamerMediaBackend* be) +#endif { - if(event->count > 0) - return FALSE; - - GdkWindow* window = gtk_widget_get_window(widget); - // I've seen this recommended somewhere... // TODO: Is this needed? Maybe it is just cruft... // gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), @@ -282,9 +299,17 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget, else { // draw a black background like some other backends do.... - gdk_draw_rectangle (window, widget->style->black_gc, TRUE, 0, 0, +#ifdef __WXGTK3__ + GtkAllocation a; + gtk_widget_get_allocation(widget, &a); + cairo_rectangle(cr, 0, 0, a.width, a.height); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_fill(cr); +#else + gdk_draw_rectangle (event->window, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); +#endif } return FALSE; @@ -310,11 +335,15 @@ static gint gtk_window_realize_callback(GtkWidget* widget, wxASSERT(window); gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), - GDK_WINDOW_XWINDOW( window ) + GDK_WINDOW_XID(window) ); g_signal_connect (be->GetControl()->m_wxwindow, - "expose_event", - G_CALLBACK(gtk_window_expose_callback), be); +#ifdef __WXGTK3__ + "draw", G_CALLBACK(draw), +#else + "expose_event", G_CALLBACK(expose_event), +#endif + be); return 0; } } @@ -371,15 +400,10 @@ static void gst_error_callback(GstElement *WXUNUSED(play), GstElement *WXUNUSED(src), GError *err, gchar *debug, - wxGStreamerMediaBackend* WXUNUSED(be)) + wxGStreamerMediaBackend* be) { - wxString sError; - sError.Printf(wxT("gst_error_callback\n") - wxT("Error Message:%s\nDebug:%s\n"), - (const wxChar*)wxConvUTF8.cMB2WX(err->message), - (const wxChar*)wxConvUTF8.cMB2WX(debug)); - wxLogTrace(wxTRACE_GStreamer, sError); - wxLogSysError(sError); + wxMutexLocker lock(be->m_mutexErr); + be->m_errors.push_back(wxGStreamerMediaBackend::Error(err->message, debug)); } } @@ -470,6 +494,15 @@ static gboolean gst_bus_async_callback(GstBus* WXUNUSED(bus), GstMessage* message, wxGStreamerMediaBackend* be) { + if ( GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR ) + { + GError* error; + gchar* debug; + gst_message_parse_error(message, &error, &debug); + gst_error_callback(NULL, NULL, error, debug, be); + return FALSE; + } + if(((GstElement*)GST_MESSAGE_SRC(message)) != be->m_playbin) return TRUE; if(be->m_asynclock.TryLock() != wxMUTEX_NO_ERROR) @@ -490,14 +523,7 @@ static gboolean gst_bus_async_callback(GstBus* WXUNUSED(bus), gst_finish_callback(NULL, be); break; } - case GST_MESSAGE_ERROR: - { - GError* error; - gchar* debug; - gst_message_parse_error(message, &error, &debug); - gst_error_callback(NULL, NULL, error, debug, be); - break; - } + default: break; } @@ -716,16 +742,19 @@ void wxGStreamerMediaBackend::SetupXOverlay() #endif gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_xoverlay), #ifdef __WXGTK__ - GDK_WINDOW_XWINDOW( window ) + GDK_WINDOW_XID(window) #else ctrl->GetHandle() #endif ); #ifdef __WXGTK__ g_signal_connect(m_ctrl->m_wxwindow, - // m_ctrl->m_wxwindow/*m_ctrl->m_widget*/, - "expose_event", - G_CALLBACK(gtk_window_expose_callback), this); +#ifdef __WXGTK3__ + "draw", G_CALLBACK(draw), +#else + "expose_event", G_CALLBACK(expose_event), +#endif + this); } // end if GtkPizza realized #endif } @@ -956,6 +985,32 @@ wxGStreamerMediaBackend::~wxGStreamerMediaBackend() } } +//----------------------------------------------------------------------------- +// wxGStreamerMediaBackend::CheckForErrors +// +// Reports any errors received from gstreamer. Should be called after any +// failure. +//----------------------------------------------------------------------------- +bool wxGStreamerMediaBackend::CheckForErrors() +{ + wxMutexLocker lock(m_mutexErr); + if ( m_errors.empty() ) + return false; + + for ( unsigned n = 0; n < m_errors.size(); n++ ) + { + const Error& err = m_errors[n]; + + wxLogTrace(wxTRACE_GStreamer, + "gst_error_callback: %s", err.m_debug); + wxLogError(_("Media playback error: %s"), err.m_message); + } + + m_errors.clear(); + + return true; +} + //----------------------------------------------------------------------------- // wxGStreamerMediaBackend::CreateControl // @@ -979,11 +1034,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, char **argvGST = new char*[wxTheApp->argc + 1]; for ( i = 0; i < wxTheApp->argc; i++ ) { -#if wxUSE_UNICODE_WCHAR - argvGST[i] = wxStrdupA(wxConvUTF8.cWX2MB(wxTheApp->argv[i])); -#else argvGST[i] = wxStrdupA(wxTheApp->argv[i].utf8_str()); -#endif } argvGST[wxTheApp->argc] = NULL; @@ -1159,7 +1210,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, //----------------------------------------------------------------------------- bool wxGStreamerMediaBackend::Load(const wxString& fileName) { - return DoLoad(wxString( wxT("file://") ) + fileName); + return DoLoad(wxFileSystem::FileNameToURL(fileName)); } //----------------------------------------------------------------------------- @@ -1212,9 +1263,10 @@ bool wxGStreamerMediaBackend::DoLoad(const wxString& locstring) GST_STATE_READY) == GST_STATE_FAILURE || !SyncStateChange(m_playbin, GST_STATE_READY)) { - wxLogSysError(wxT("wxGStreamerMediaBackend::Load - ") - wxT("Could not set initial state to ready")); - return false; + CheckForErrors(); + + wxLogError(_("Failed to prepare playing \"%s\"."), locstring); + return false; } // free current media resources @@ -1234,11 +1286,18 @@ bool wxGStreamerMediaBackend::DoLoad(const wxString& locstring) GST_STATE_PAUSED) == GST_STATE_FAILURE || !SyncStateChange(m_playbin, GST_STATE_PAUSED)) { + CheckForErrors(); return false; // no real error message needed here as this is // generic failure 99% of the time (i.e. no // source etc.) and has an error message } + // It may happen that both calls above succeed but we actually had some + // errors during the pipeline setup and it doesn't play. E.g. this happens + // if XVideo extension is unavailable but xvimagesink is still used. + if ( CheckForErrors() ) + return false; + NotifyMovieLoaded(); // Notify the user - all we can do for now return true; @@ -1256,7 +1315,11 @@ bool wxGStreamerMediaBackend::Play() { if (gst_element_set_state (m_playbin, GST_STATE_PLAYING) == GST_STATE_FAILURE) + { + CheckForErrors(); return false; + } + return true; } @@ -1272,7 +1335,10 @@ bool wxGStreamerMediaBackend::Pause() m_llPausedPos = wxGStreamerMediaBackend::GetPosition(); if (gst_element_set_state (m_playbin, GST_STATE_PAUSED) == GST_STATE_FAILURE) + { + CheckForErrors(); return false; + } return true; } @@ -1292,6 +1358,7 @@ bool wxGStreamerMediaBackend::Stop() GST_STATE_PAUSED) == GST_STATE_FAILURE || !SyncStateChange(m_playbin, GST_STATE_PAUSED)) { + CheckForErrors(); wxLogSysError(wxT("Could not set state to paused for Stop()")); return false; } diff --git a/Externals/wxWidgets3/src/unix/mimetype.cpp b/Externals/wxWidgets3/src/unix/mimetype.cpp index ec2a0b9605..265f86aae0 100644 --- a/Externals/wxWidgets3/src/unix/mimetype.cpp +++ b/Externals/wxWidgets3/src/unix/mimetype.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 23.09.98 -// RCS-ID: $Id: mimetype.cpp 70622 2012-02-18 19:43:03Z SN $ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/net.cpp b/Externals/wxWidgets3/src/unix/net.cpp index b703530415..3125aadc2c 100644 --- a/Externals/wxWidgets3/src/unix/net.cpp +++ b/Externals/wxWidgets3/src/unix/net.cpp @@ -4,7 +4,6 @@ // Author: Karsten Ballüder // Modified by: // Created: 03.10.99 -// RCS-ID: $Id: net.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) Karsten Ballüder // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/snglinst.cpp b/Externals/wxWidgets3/src/unix/snglinst.cpp index f3f7627ec4..f8f1c3b4e0 100644 --- a/Externals/wxWidgets3/src/unix/snglinst.cpp +++ b/Externals/wxWidgets3/src/unix/snglinst.cpp @@ -5,7 +5,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 09.06.01 -// RCS-ID: $Id: snglinst.cpp 64940 2010-07-13 13:29:13Z VZ $ // Copyright: (c) 2001 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/sockunix.cpp b/Externals/wxWidgets3/src/unix/sockunix.cpp index 88b8ea06ca..7d47f18e95 100644 --- a/Externals/wxWidgets3/src/unix/sockunix.cpp +++ b/Externals/wxWidgets3/src/unix/sockunix.cpp @@ -4,7 +4,6 @@ // Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia, David Elliott, // Vadim Zeitlin // Created: April 1997 -// RCS-ID: $Id: sockunix.cpp 61813 2009-09-03 00:24:21Z VZ $ // Copyright: (c) 1997 Guilhem Lavaux // (c) 2008 Vadim Zeitlin // Licence: wxWindows licence diff --git a/Externals/wxWidgets3/src/unix/sound.cpp b/Externals/wxWidgets3/src/unix/sound.cpp index 4adc31d6fa..c6ff1bd420 100644 --- a/Externals/wxWidgets3/src/unix/sound.cpp +++ b/Externals/wxWidgets3/src/unix/sound.cpp @@ -4,7 +4,6 @@ // Author: Marcel Rasche, Vaclav Slavik // Modified by: // Created: 25/10/98 -// RCS-ID: $Id: sound.cpp 69178 2011-09-21 15:08:02Z VZ $ // Copyright: (c) Julian Smart, Open Source Applications Foundation // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/sound_sdl.cpp b/Externals/wxWidgets3/src/unix/sound_sdl.cpp index cdafcc4c4c..0fc4ebf3ff 100644 --- a/Externals/wxWidgets3/src/unix/sound_sdl.cpp +++ b/Externals/wxWidgets3/src/unix/sound_sdl.cpp @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 2004/01/31 -// RCS-ID: $Id: sound_sdl.cpp 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) 2004, Open Source Applications Foundation // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -213,7 +212,11 @@ bool wxSoundBackendSDL::OpenAudio() { #if wxUSE_LOG_DEBUG char driver[256]; +#if SDL_MAJOR_VERSION == 1 SDL_AudioDriverName(driver, 256); +#elif SDL_MAJOR_VERSION > 1 + strncpy(driver, SDL_GetCurrentAudioDriver(), 256); +#endif wxLogTrace(wxT("sound"), wxT("opened audio, driver '%s'"), wxString(driver, wxConvLocal).c_str()); #endif diff --git a/Externals/wxWidgets3/src/unix/stackwalk.cpp b/Externals/wxWidgets3/src/unix/stackwalk.cpp index 3f8141a91a..e8cf6edff3 100644 --- a/Externals/wxWidgets3/src/unix/stackwalk.cpp +++ b/Externals/wxWidgets3/src/unix/stackwalk.cpp @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 2005-01-18 -// RCS-ID: $Id: stackwalk.cpp 67254 2011-03-20 00:14:35Z DS $ // Copyright: (c) 2005 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -130,10 +129,12 @@ void wxStackFrame::OnGetName() m_module.assign(syminfo, posOpen); } +#ifndef __WXOSX__ else // not in "module(funcname+offset)" format { m_module = syminfo; } +#endif // !__WXOSX__ } @@ -180,17 +181,18 @@ void wxStackWalker::ProcessFrames(size_t skip) if (!ms_symbols || !m_depth) return; - // we have 3 more "intermediate" frames which the calling code doesn't know - // about, account for them - skip += 3; + // we are another level down from Walk(), so adjust the number of stack + // frames to skip accordingly + skip += 1; // call addr2line only once since this call may be very slow // (it has to load in memory the entire EXE of this app which may be quite // big, especially if it contains debug info and is compiled statically!) - int towalk = InitFrames(frames, m_depth - skip, &ms_addresses[skip], &ms_symbols[skip]); + int numFrames = InitFrames(frames, m_depth - skip, + &ms_addresses[skip], &ms_symbols[skip]); // now do user-defined operations on each frame - for ( int n = 0; n < towalk - (int)skip; n++ ) + for ( int n = 0; n < numFrames; n++ ) OnStackFrame(frames[n]); } @@ -204,6 +206,28 @@ void wxStackWalker::FreeStack() m_depth = 0; } +namespace +{ + +// Helper function to read a line from the file and return it without the +// trailing newline. Line number is only used for error reporting. +bool ReadLine(FILE* fp, unsigned long num, wxString* line) +{ + if ( !fgets(g_buf, WXSIZEOF(g_buf), fp) ) + { + wxLogDebug(wxS("cannot read address information for stack frame #%lu"), + num); + return false; + } + + *line = wxString::FromAscii(g_buf); + line->RemoveLast(); + + return true; +} + +} // anonymous namespace + int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo) { // we need to launch addr2line tool to get this information and we need to @@ -220,9 +244,13 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha } } - // build the (long) command line for executing addr2line in an optimized way - // (e.g. use always chars, even in Unicode build: popen() always takes chars) + // build the command line for executing addr2line or atos under OS X using + // char* directly to avoid the conversions from Unicode +#ifdef __WXOSX__ + int len = snprintf(g_buf, BUFSIZE, "atos -p %d", (int)getpid()); +#else int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", (const char*) exepath.mb_str()); +#endif len = (len <= 0) ? strlen(g_buf) : len; // in case snprintf() is broken for (size_t i=0; i // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -122,7 +121,7 @@ wxString wxStandardPaths::GetExecutablePath() const wxString exeStr; char buf[4096]; - int result = readlink("/proc/self/exe", buf, WXSIZEOF(buf) - sizeof(char)); + int result = readlink("/proc/self/exe", buf, WXSIZEOF(buf) - 1); if ( result != -1 ) { buf[result] = '\0'; // readlink() doesn't NUL-terminate the buffer diff --git a/Externals/wxWidgets3/src/unix/taskbarx11.cpp b/Externals/wxWidgets3/src/unix/taskbarx11.cpp index 6ff97ff6e2..146d2ccd9c 100644 --- a/Externals/wxWidgets3/src/unix/taskbarx11.cpp +++ b/Externals/wxWidgets3/src/unix/taskbarx11.cpp @@ -4,7 +4,6 @@ // Author: Vaclav Slavik // Modified by: // Created: 04/04/2003 -// RCS-ID: $Id: taskbarx11.cpp 61508 2009-07-23 20:30:22Z VZ $ // Copyright: (c) Vaclav Slavik, 2003 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/threadpsx.cpp b/Externals/wxWidgets3/src/unix/threadpsx.cpp index 95e235a05f..4efe5d56f1 100644 --- a/Externals/wxWidgets3/src/unix/threadpsx.cpp +++ b/Externals/wxWidgets3/src/unix/threadpsx.cpp @@ -4,7 +4,6 @@ // Author: Original from Wolfram Gloger/Guilhem Lavaux // Modified by: K. S. Sreeram (2002): POSIXified wxCondition, added wxSemaphore // Created: 04/22/98 -// RCS-ID: $Id: threadpsx.cpp 69881 2011-12-01 14:22:07Z VZ $ // Copyright: (c) Wolfram Gloger (1996, 1997) // Guilhem Lavaux (1998) // Vadim Zeitlin (1999-2002) @@ -54,10 +53,17 @@ #include #endif +#ifdef HAVE_ABI_FORCEDUNWIND + #include +#endif + +#ifdef HAVE_SETPRIORITY + #include // for setpriority() +#endif + // we use wxFFile under Linux in GetCPUCount() #ifdef __LINUX__ #include "wx/ffile.h" - #include // for setpriority() #endif #define THR_ID_CAST(id) (reinterpret_cast(id)) @@ -703,6 +709,8 @@ public: static void *PthreadStart(wxThread *thread); // thread actions + // create the thread + wxThreadError Create(wxThread *thread, unsigned int stackSize); // start the thread wxThreadError Run(); // unblock the thread allowing it to run @@ -740,6 +748,8 @@ public: // id pthread_t GetId() const { return m_threadId; } pthread_t *GetIdPtr() { return &m_threadId; } + // "created" flag + bool WasCreated() const { return m_created; } // "cancelled" flag void SetCancelFlag() { m_cancelled = true; } bool WasCancelled() const { return m_cancelled; } @@ -770,6 +780,9 @@ private: wxThreadState m_state; // see wxThreadState enum int m_prio; // in wxWidgets units: from 0 to 100 + // this flag is set when the thread was successfully created + bool m_created; + // this flag is set when the thread should terminate bool m_cancelled; @@ -851,12 +864,24 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) wxTRY { - pthread->m_exitcode = thread->Entry(); + pthread->m_exitcode = thread->CallEntry(); wxLogTrace(TRACE_THREADS, wxT("Thread %p Entry() returned %lu."), THR_ID(pthread), wxPtrToUInt(pthread->m_exitcode)); } +#ifdef HAVE_ABI_FORCEDUNWIND + // When using common C++ ABI under Linux we must always rethrow this + // special exception used to unwind the stack when the thread was + // cancelled, otherwise the thread library would simply terminate the + // program, see http://udrepper.livejournal.com/21541.html + catch ( abi::__forced_unwind& ) + { + wxCriticalSectionLocker lock(thread->m_critsect); + pthread->SetState(STATE_EXITED); + throw; + } +#endif // HAVE_ABI_FORCEDUNWIND wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) { @@ -937,8 +962,9 @@ void wxThreadInternal::Cleanup(wxThread *thread) wxThreadInternal::wxThreadInternal() { m_state = STATE_NEW; + m_created = false; m_cancelled = false; - m_prio = WXTHREAD_DEFAULT_PRIORITY; + m_prio = wxPRIORITY_DEFAULT; m_threadId = 0; m_exitcode = 0; @@ -954,6 +980,132 @@ wxThreadInternal::~wxThreadInternal() { } +#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE + #define WXUNUSED_STACKSIZE(identifier) identifier +#else + #define WXUNUSED_STACKSIZE(identifier) WXUNUSED(identifier) +#endif + +wxThreadError wxThreadInternal::Create(wxThread *thread, + unsigned int WXUNUSED_STACKSIZE(stackSize)) +{ + if ( GetState() != STATE_NEW ) + { + // don't recreate thread + return wxTHREAD_RUNNING; + } + + // set up the thread attribute: right now, we only set thread priority + pthread_attr_t attr; + pthread_attr_init(&attr); + +#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE + if (stackSize) + pthread_attr_setstacksize(&attr, stackSize); +#endif + +#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS + int policy; + if ( pthread_attr_getschedpolicy(&attr, &policy) != 0 ) + { + wxLogError(_("Cannot retrieve thread scheduling policy.")); + } + +#ifdef __VMS__ + /* the pthread.h contains too many spaces. This is a work-around */ +# undef sched_get_priority_max +#undef sched_get_priority_min +#define sched_get_priority_max(_pol_) \ + (_pol_ == SCHED_OTHER ? PRI_FG_MAX_NP : PRI_FIFO_MAX) +#define sched_get_priority_min(_pol_) \ + (_pol_ == SCHED_OTHER ? PRI_FG_MIN_NP : PRI_FIFO_MIN) +#endif + + int max_prio = sched_get_priority_max(policy), + min_prio = sched_get_priority_min(policy), + prio = GetPriority(); + + if ( min_prio == -1 || max_prio == -1 ) + { + wxLogError(_("Cannot get priority range for scheduling policy %d."), + policy); + } + else if ( max_prio == min_prio ) + { + if ( prio != wxPRIORITY_DEFAULT ) + { + // notify the programmer that this doesn't work here + wxLogWarning(_("Thread priority setting is ignored.")); + } + //else: we have default priority, so don't complain + + // anyhow, don't do anything because priority is just ignored + } + else + { + struct sched_param sp; + if ( pthread_attr_getschedparam(&attr, &sp) != 0 ) + { + wxFAIL_MSG(wxT("pthread_attr_getschedparam() failed")); + } + + sp.sched_priority = min_prio + (prio*(max_prio - min_prio))/100; + + if ( pthread_attr_setschedparam(&attr, &sp) != 0 ) + { + wxFAIL_MSG(wxT("pthread_attr_setschedparam(priority) failed")); + } + } +#endif // HAVE_THREAD_PRIORITY_FUNCTIONS + +#ifdef HAVE_PTHREAD_ATTR_SETSCOPE + // this will make the threads created by this process really concurrent + if ( pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) != 0 ) + { + wxFAIL_MSG(wxT("pthread_attr_setscope(PTHREAD_SCOPE_SYSTEM) failed")); + } +#endif // HAVE_PTHREAD_ATTR_SETSCOPE + + // VZ: assume that this one is always available (it's rather fundamental), + // if this function is ever missing we should try to use + // pthread_detach() instead (after thread creation) + if ( thread->IsDetached() ) + { + if ( pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0 ) + { + wxFAIL_MSG(wxT("pthread_attr_setdetachstate(DETACHED) failed")); + } + + // never try to join detached threads + Detach(); + } + //else: threads are created joinable by default, it's ok + + // create the new OS thread object + int rc = pthread_create + ( + GetIdPtr(), + &attr, + wxPthreadStart, + (void *)thread + ); + + if ( pthread_attr_destroy(&attr) != 0 ) + { + wxFAIL_MSG(wxT("pthread_attr_destroy() failed")); + } + + if ( rc != 0 ) + { + SetState(STATE_EXITED); + + return wxTHREAD_NO_RESOURCE; + } + + m_created = true; + return wxTHREAD_NO_ERROR; +} + wxThreadError wxThreadInternal::Run() { wxCHECK_MSG( GetState() == STATE_NEW, wxTHREAD_RUNNING, @@ -1127,18 +1279,23 @@ wxThreadIdType wxThread::GetCurrentId() bool wxThread::SetConcurrency(size_t level) { -#ifdef HAVE_THR_SETCONCURRENCY +#ifdef HAVE_PTHREAD_SET_CONCURRENCY + int rc = pthread_setconcurrency( level ); +#elif defined(HAVE_THR_SETCONCURRENCY) int rc = thr_setconcurrency(level); - if ( rc != 0 ) - { - wxLogSysError(rc, wxT("thr_setconcurrency() failed")); - } - - return rc == 0; #else // !HAVE_THR_SETCONCURRENCY // ok only for the default value - return level == 0; + int rc = level == 0 ? 0 : -1; #endif // HAVE_THR_SETCONCURRENCY/!HAVE_THR_SETCONCURRENCY + + if ( rc != 0 ) + { + wxLogSysError(rc, _("Failed to set thread concurrency level to %lu"), + static_cast(level)); + return false; + } + + return true; } // ----------------------------------------------------------------------------- @@ -1159,136 +1316,25 @@ wxThread::wxThread(wxThreadKind kind) m_isDetached = kind == wxTHREAD_DETACHED; } -#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE - #define WXUNUSED_STACKSIZE(identifier) identifier -#else - #define WXUNUSED_STACKSIZE(identifier) WXUNUSED(identifier) -#endif - -wxThreadError wxThread::Create(unsigned int WXUNUSED_STACKSIZE(stackSize)) +wxThreadError wxThread::Create(unsigned int stackSize) { - if ( m_internal->GetState() != STATE_NEW ) - { - // don't recreate thread - return wxTHREAD_RUNNING; - } + wxCriticalSectionLocker lock(m_critsect); - // set up the thread attribute: right now, we only set thread priority - pthread_attr_t attr; - pthread_attr_init(&attr); - -#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE - if (stackSize) - pthread_attr_setstacksize(&attr, stackSize); -#endif - -#ifdef HAVE_THREAD_PRIORITY_FUNCTIONS - int policy; - if ( pthread_attr_getschedpolicy(&attr, &policy) != 0 ) - { - wxLogError(_("Cannot retrieve thread scheduling policy.")); - } - -#ifdef __VMS__ - /* the pthread.h contains too many spaces. This is a work-around */ -# undef sched_get_priority_max -#undef sched_get_priority_min -#define sched_get_priority_max(_pol_) \ - (_pol_ == SCHED_OTHER ? PRI_FG_MAX_NP : PRI_FIFO_MAX) -#define sched_get_priority_min(_pol_) \ - (_pol_ == SCHED_OTHER ? PRI_FG_MIN_NP : PRI_FIFO_MIN) -#endif - - int max_prio = sched_get_priority_max(policy), - min_prio = sched_get_priority_min(policy), - prio = m_internal->GetPriority(); - - if ( min_prio == -1 || max_prio == -1 ) - { - wxLogError(_("Cannot get priority range for scheduling policy %d."), - policy); - } - else if ( max_prio == min_prio ) - { - if ( prio != WXTHREAD_DEFAULT_PRIORITY ) - { - // notify the programmer that this doesn't work here - wxLogWarning(_("Thread priority setting is ignored.")); - } - //else: we have default priority, so don't complain - - // anyhow, don't do anything because priority is just ignored - } - else - { - struct sched_param sp; - if ( pthread_attr_getschedparam(&attr, &sp) != 0 ) - { - wxFAIL_MSG(wxT("pthread_attr_getschedparam() failed")); - } - - sp.sched_priority = min_prio + (prio*(max_prio - min_prio))/100; - - if ( pthread_attr_setschedparam(&attr, &sp) != 0 ) - { - wxFAIL_MSG(wxT("pthread_attr_setschedparam(priority) failed")); - } - } -#endif // HAVE_THREAD_PRIORITY_FUNCTIONS - -#ifdef HAVE_PTHREAD_ATTR_SETSCOPE - // this will make the threads created by this process really concurrent - if ( pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) != 0 ) - { - wxFAIL_MSG(wxT("pthread_attr_setscope(PTHREAD_SCOPE_SYSTEM) failed")); - } -#endif // HAVE_PTHREAD_ATTR_SETSCOPE - - // VZ: assume that this one is always available (it's rather fundamental), - // if this function is ever missing we should try to use - // pthread_detach() instead (after thread creation) - if ( m_isDetached ) - { - if ( pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0 ) - { - wxFAIL_MSG(wxT("pthread_attr_setdetachstate(DETACHED) failed")); - } - - // never try to join detached threads - m_internal->Detach(); - } - //else: threads are created joinable by default, it's ok - - // create the new OS thread object - int rc = pthread_create - ( - m_internal->GetIdPtr(), - &attr, - wxPthreadStart, - (void *)this - ); - - if ( pthread_attr_destroy(&attr) != 0 ) - { - wxFAIL_MSG(wxT("pthread_attr_destroy() failed")); - } - - if ( rc != 0 ) - { - m_internal->SetState(STATE_EXITED); - - return wxTHREAD_NO_RESOURCE; - } - - return wxTHREAD_NO_ERROR; + return m_internal->Create(this, stackSize); } wxThreadError wxThread::Run() { wxCriticalSectionLocker lock(m_critsect); - wxCHECK_MSG( m_internal->GetId(), wxTHREAD_MISC_ERROR, - wxT("must call wxThread::Create() first") ); + // Create the thread if it wasn't created yet with an explicit + // Create() call: + if ( !m_internal->WasCreated() ) + { + wxThreadError rv = m_internal->Create(this, 0); + if ( rv != wxTHREAD_NO_ERROR ) + return rv; + } return m_internal->Run(); } @@ -1299,8 +1345,7 @@ wxThreadError wxThread::Run() void wxThread::SetPriority(unsigned int prio) { - wxCHECK_RET( ((int)WXTHREAD_MIN_PRIORITY <= (int)prio) && - ((int)prio <= (int)WXTHREAD_MAX_PRIORITY), + wxCHECK_RET( wxPRIORITY_MIN <= prio && prio <= wxPRIORITY_MAX, wxT("invalid thread priority") ); wxCriticalSectionLocker lock(m_critsect); @@ -1326,8 +1371,7 @@ void wxThread::SetPriority(unsigned int prio) // // FIXME this is not true for 2.6!! - // map wx priorites WXTHREAD_MIN_PRIORITY..WXTHREAD_MAX_PRIORITY - // to Unix priorities 20..-20 + // map wx priorites 0..100 to Unix priorities 20..-20 if ( setpriority(PRIO_PROCESS, 0, -(2*(int)prio)/5 + 20) == -1 ) { wxLogError(_("Failed to set thread priority %d."), prio); @@ -1832,7 +1876,7 @@ static void DeleteThread(wxThread *This) } } -#ifndef __WXOSX__ +#ifndef __DARWIN__ void wxMutexGuiEnterImpl() { diff --git a/Externals/wxWidgets3/src/unix/timerunx.cpp b/Externals/wxWidgets3/src/unix/timerunx.cpp index e20034b32c..1d99805f54 100644 --- a/Externals/wxWidgets3/src/unix/timerunx.cpp +++ b/Externals/wxWidgets3/src/unix/timerunx.cpp @@ -3,7 +3,6 @@ // Purpose: wxTimer implementation for non-GUI applications under Unix // Author: Lukasz Michalski // Created: 15/01/2005 -// RCS-ID: $Id: timerunx.cpp 69839 2011-11-27 19:50:33Z VZ $ // Copyright: (c) 2007 Lukasz Michalski // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// diff --git a/Externals/wxWidgets3/src/unix/uiactionx11.cpp b/Externals/wxWidgets3/src/unix/uiactionx11.cpp index c9e87870fe..a19a3d2284 100644 --- a/Externals/wxWidgets3/src/unix/uiactionx11.cpp +++ b/Externals/wxWidgets3/src/unix/uiactionx11.cpp @@ -4,7 +4,6 @@ // Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin // Modified by: // Created: 2010-03-06 -// RCS-ID: $Id: uiactionx11.cpp 69626 2011-11-01 12:04:27Z VZ $ // Copyright: (c) Kevin Ollivier // (c) 2010 Steven Lamerton // (c) 2010 Vadim Zeitlin @@ -16,6 +15,8 @@ #if wxUSE_UIACTIONSIMULATOR #include "wx/uiaction.h" +#include "wx/event.h" +#include "wx/evtloop.h" #include #include @@ -88,6 +89,15 @@ bool wxUIActionSimulator::MouseMove(long x, long y) Window root = display.DefaultRoot(); XWarpPointer(display, None, root, 0, 0, 0, 0, x, y); + // At least with wxGTK we must always process the pending events before the + // mouse position change really takes effect, so just do it from here + // instead of forcing the client code using this function to always use + // wxYield() which is unnecessary under the other platforms. + if ( wxEventLoopBase* const loop = wxEventLoop::GetActive() ) + { + loop->YieldFor(wxEVT_CATEGORY_USER_INPUT); + } + return true; } diff --git a/Externals/wxWidgets3/src/unix/utilsunx.cpp b/Externals/wxWidgets3/src/unix/utilsunx.cpp index 8ee71798fb..98548a2e3f 100644 --- a/Externals/wxWidgets3/src/unix/utilsunx.cpp +++ b/Externals/wxWidgets3/src/unix/utilsunx.cpp @@ -2,8 +2,8 @@ // Name: src/unix/utilsunx.cpp // Purpose: generic Unix implementation of many wx functions (for wxBase) // Author: Vadim Zeitlin -// Id: $Id: utilsunx.cpp 67411 2011-04-06 17:04:12Z PC $ // Copyright: (c) 1998 Robert Roebling, Vadim Zeitlin +// (c) 2013 Rob Bresalier, Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -37,6 +37,7 @@ #include "wx/apptrait.h" #include "wx/process.h" +#include "wx/scopedptr.h" #include "wx/thread.h" #include "wx/cmdline.h" @@ -46,11 +47,12 @@ #include "wx/private/selectdispatcher.h" #include "wx/private/fdiodispatcher.h" #include "wx/unix/execute.h" +#include "wx/unix/pipe.h" #include "wx/unix/private.h" -#ifdef wxHAS_GENERIC_PROCESS_CALLBACK -#include "wx/private/fdiodispatcher.h" -#endif +#include "wx/evtloop.h" +#include "wx/mstream.h" +#include "wx/private/fdioeventloopsourcehandler.h" #include #include // waitpid() @@ -63,32 +65,12 @@ #if HAS_PIPE_STREAMS -// define this to let wxexec.cpp know that we know what we're doing -#define _WX_USED_BY_WXEXECUTE_ -#include "../common/execcmn.cpp" +#include "wx/private/pipestream.h" +#include "wx/private/streamtempinput.h" +#include "wx/unix/private/executeiohandler.h" #endif // HAS_PIPE_STREAMS -#if defined(__MWERKS__) && defined(__MACH__) - #ifndef WXWIN_OS_DESCRIPTION - #define WXWIN_OS_DESCRIPTION "MacOS X" - #endif - #ifndef HAVE_NANOSLEEP - #define HAVE_NANOSLEEP - #endif - #ifndef HAVE_UNAME - #define HAVE_UNAME - #endif - - // our configure test believes we can use sigaction() if the function is - // available but Metrowekrs with MSL run-time does have the function but - // doesn't have sigaction struct so finally we can't use it... - #ifdef __MSL__ - #undef wxUSE_ON_FATAL_EXCEPTION - #define wxUSE_ON_FATAL_EXCEPTION 0 - #endif -#endif - // not only the statfs syscall is called differently depending on platform, but // one of its incarnations, statvfs(), takes different arguments under // different platforms and even different versions of the same system (Solaris @@ -137,7 +119,6 @@ #include #include #include -#include // for O_WRONLY and friends #include // nanosleep() and/or usleep() #include // isspace() #include // needed for FD_SETSIZE @@ -152,6 +133,10 @@ #include // for SAGET and MINFO structures #endif +#ifdef HAVE_SETPRIORITY + #include // for setpriority() +#endif + // ---------------------------------------------------------------------------- // conditional compilation // ---------------------------------------------------------------------------- @@ -502,6 +487,83 @@ long wxExecute(wchar_t **wargv, int flags, wxProcess *process, #endif // wxUSE_UNICODE +namespace +{ + +// Helper function of wxExecute(): wait for the process termination without +// dispatching any events. +// +// This is used in wxEXEC_NOEVENTS case. +int BlockUntilChildExit(wxExecuteData& execData) +{ + wxCHECK_MSG( wxTheApp, -1, + wxS("Can't block until child exit without wxTheApp") ); + +#if wxUSE_SELECT_DISPATCHER + + // Even if we don't want to dispatch events, we still need to handle + // child IO notifications and process termination concurrently, i.e. + // we can't simply block waiting for the child to terminate as we would + // dead lock if it writes more than the pipe buffer size (typically + // 4KB) bytes of output -- it would then block waiting for us to read + // the data while we'd block waiting for it to terminate. + // + // So while we don't use the full blown event loop, we still do use a + // dispatcher with which we register just the 3 FDs we're interested + // in: the child stdout and stderr and the pipe written to by the + // signal handler so that we could react to the child process + // termination too. + + // Notice that we must create a new dispatcher object here instead of + // reusing the global wxFDIODispatcher::Get() because we want to + // monitor only the events on the FDs explicitly registered with this + // one and not all the other ones that could be registered with the + // global dispatcher (think about the case of nested wxExecute() calls). + wxSelectDispatcher dispatcher; + + // Do register all the FDs we want to monitor here: first, the one used to + // handle the signals asynchronously. + wxScopedPtr + signalHandler(wxTheApp->RegisterSignalWakeUpPipe(dispatcher)); + +#if wxUSE_STREAMS + // And then the two for the child output and error streams if necessary. + wxScopedPtr + stdoutHandler, + stderrHandler; + if ( execData.IsRedirected() ) + { + stdoutHandler.reset(new wxExecuteFDIOHandler + ( + dispatcher, + execData.fdOut, + execData.bufOut + )); + stderrHandler.reset(new wxExecuteFDIOHandler + ( + dispatcher, + execData.fdErr, + execData.bufErr + )); + } +#endif // wxUSE_STREAMS + + // And dispatch until the PID is reset from wxExecuteData::OnExit(). + while ( execData.pid ) + { + dispatcher.Dispatch(); + } + + return execData.exitcode; +#else // !wxUSE_SELECT_DISPATCHER + wxFAIL_MSG( wxS("Can't block until child exit without wxSelectDispatcher") ); + + return -1; +#endif // wxUSE_SELECT_DISPATCHER/!wxUSE_SELECT_DISPATCHER +} + +} // anonymous namespace + // wxExecute: the real worker function long wxExecute(char **argv, int flags, wxProcess *process, const wxExecuteEnv *env) @@ -536,21 +598,14 @@ long wxExecute(char **argv, int flags, wxProcess *process, } #endif // __DARWIN__ - // this struct contains all information which we use for housekeeping - wxExecuteData execData; + wxScopedPtr execDataPtr(new wxExecuteData); + wxExecuteData& execData = *execDataPtr; + execData.flags = flags; execData.process = process; - // create pipes - if ( !execData.pipeEndProcDetect.Create() ) - { - wxLogError( _("Failed to execute '%s'\n"), *argv ); - - return ERROR_RETURN_CODE; - } - - // pipes for inter process communication + // create pipes for inter process communication wxPipe pipeIn, // stdin pipeOut, // stdout pipeErr; // stderr @@ -565,6 +620,21 @@ long wxExecute(char **argv, int flags, wxProcess *process, } } + // priority: we need to map wxWidgets priority which is in the range 0..100 + // to Unix nice value which is in the range -20..19. As there is an odd + // number of elements in our range and an even number in the Unix one, we + // have to do it in this rather ugly way to guarantee that: + // 1. wxPRIORITY_{MIN,DEFAULT,MAX} map to -20, 0 and 19 respectively. + // 2. The mapping is monotonously increasing. + // 3. The mapping is onto the target range. + int prio = process ? process->GetPriority() : 0; + if ( prio <= 50 ) + prio = (2*prio)/5 - 20; + else if ( prio < 55 ) + prio = 1; + else + prio = (2*prio)/5 - 21; + // fork the process // // NB: do *not* use vfork() here, it completely breaks this code for some @@ -598,6 +668,13 @@ long wxExecute(char **argv, int flags, wxProcess *process, } #endif // !__VMS +#if defined(HAVE_SETPRIORITY) + if ( prio && setpriority(PRIO_PROCESS, 0, prio) != 0 ) + { + wxLogSysError(_("Failed to set process priority")); + } +#endif // HAVE_SETPRIORITY + // redirect stdin, stdout and stderr if ( pipeIn.IsOk() ) { @@ -620,13 +697,6 @@ long wxExecute(char **argv, int flags, wxProcess *process, // the descriptors do not need to be closed but for now this is better // than never closing them at all as wx code never used FD_CLOEXEC. - // Note that while the reading side of the end process detection pipe - // can be safely closed, we should keep the write one opened, it will - // be only closed when the process terminates resulting in a read - // notification to the parent - const int fdEndProc = execData.pipeEndProcDetect.Detach(wxPipe::Write); - execData.pipeEndProcDetect.Close(); - // TODO: Iterating up to FD_SETSIZE is both inefficient (because it may // be quite big) and incorrect (because in principle we could // have more opened descriptions than this number). Unfortunately @@ -638,8 +708,7 @@ long wxExecute(char **argv, int flags, wxProcess *process, { if ( fd != STDIN_FILENO && fd != STDOUT_FILENO && - fd != STDERR_FILENO && - fd != fdEndProc ) + fd != STDERR_FILENO ) { close(fd); } @@ -702,18 +771,11 @@ long wxExecute(char **argv, int flags, wxProcess *process, } else // we're in parent { - // save it for WaitForChild() use - execData.pid = pid; - if (execData.process) - execData.process->SetPid(pid); // and also in the wxProcess + execData.OnStart(pid); // prepare for IO redirection #if HAS_PIPE_STREAMS - // the input buffer bufOut is connected to stdout, this is why it is - // called bufOut and not bufIn - wxStreamTempInputBuffer bufOut, - bufErr; if ( process && process->IsRedirected() ) { @@ -744,14 +806,14 @@ long wxExecute(char **argv, int flags, wxProcess *process, process->SetPipeStreams(outStream, inStream, errStream); - bufOut.Init(outStream); - bufErr.Init(errStream); + if ( flags & wxEXEC_SYNC ) + { + execData.bufOut.Init(outStream); + execData.bufErr.Init(errStream); - execData.bufOut = &bufOut; - execData.bufErr = &bufErr; - - execData.fdOut = fdOut; - execData.fdErr = fdErr; + execData.fdOut = fdOut; + execData.fdErr = fdErr; + } } #endif // HAS_PIPE_STREAMS @@ -762,14 +824,32 @@ long wxExecute(char **argv, int flags, wxProcess *process, pipeErr.Close(); } - // we want this function to work even if there is no wxApp so ensure - // that we have a valid traits pointer - wxConsoleAppTraits traitsConsole; - wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - if ( !traits ) - traits = &traitsConsole; + // For the asynchronous case we don't have to do anything else, just + // let the process run. + if ( !(flags & wxEXEC_SYNC) ) + { + // Ensure that the housekeeping data is kept alive, it will be + // destroyed only when the child terminates. + execDataPtr.release(); - return traits->WaitForChild(execData); + return execData.pid; + } + + + // If we don't need to dispatch any events, things are relatively + // simple and we don't need to delegate to wxAppTraits. + if ( flags & wxEXEC_NOEVENTS ) + { + return BlockUntilChildExit(execData); + } + + + // If we do need to dispatch events, enter a local event loop waiting + // until the child exits. As the exact kind of event loop depends on + // the sort of application we're in (console or GUI), we delegate this + // to wxAppTraits which virtualizes all the differences between the + // console and the GUI programs. + return wxApp::GetValidTraits().WaitForChild(execData); } #if !defined(__VMS) && !defined(__INTEL_COMPILER) @@ -834,15 +914,25 @@ wxString wxGetUserHome( const wxString &user ) // network and user id routines // ---------------------------------------------------------------------------- -// private utility function which returns output of the given command, removing -// the trailing newline -static wxString wxGetCommandOutput(const wxString &cmd) +// Private utility function which returns output of the given command, removing +// the trailing newline. +// +// Note that by default use Latin-1 just to ensure that we never fail, but if +// the encoding is known (e.g. UTF-8 for lsb_release), it should be explicitly +// used instead. +static wxString +wxGetCommandOutput(const wxString &cmd, wxMBConv& conv = wxConvISO8859_1) { - FILE *f = popen(cmd.ToAscii(), "r"); + // Suppress stderr from the shell to avoid outputting errors if the command + // doesn't exist. + FILE *f = popen((cmd + " 2>/dev/null").ToAscii(), "r"); if ( !f ) { - wxLogSysError(wxT("Executing \"%s\" failed"), cmd.c_str()); - return wxEmptyString; + // Notice that this doesn't happen simply if the command doesn't exist, + // but only in case of some really catastrophic failure inside popen() + // so we should really notify the user about this as this is not normal. + wxLogSysError(wxT("Executing \"%s\" failed"), cmd); + return wxString(); } wxString s; @@ -852,7 +942,7 @@ static wxString wxGetCommandOutput(const wxString &cmd) if ( !fgets(buf, sizeof(buf), f) ) break; - s += wxString::FromAscii(buf); + s += wxString(buf, conv); } pclose(f); @@ -993,26 +1083,41 @@ bool wxIsPlatform64Bit() } #ifdef __LINUX__ + +static bool +wxGetValueFromLSBRelease(wxString arg, const wxString& lhs, wxString* rhs) +{ + // lsb_release seems to just read a global file which is always in UTF-8 + // and hence its output is always in UTF-8 as well, regardless of the + // locale currently configured by our environment. + return wxGetCommandOutput(wxS("lsb_release ") + arg, wxConvUTF8) + .StartsWith(lhs, rhs); +} + wxLinuxDistributionInfo wxGetLinuxDistributionInfo() { - const wxString id = wxGetCommandOutput(wxT("lsb_release --id")); - const wxString desc = wxGetCommandOutput(wxT("lsb_release --description")); - const wxString rel = wxGetCommandOutput(wxT("lsb_release --release")); - const wxString codename = wxGetCommandOutput(wxT("lsb_release --codename")); - wxLinuxDistributionInfo ret; - id.StartsWith("Distributor ID:\t", &ret.Id); - desc.StartsWith("Description:\t", &ret.Description); - rel.StartsWith("Release:\t", &ret.Release); - codename.StartsWith("Codename:\t", &ret.CodeName); + if ( !wxGetValueFromLSBRelease(wxS("--id"), wxS("Distributor ID:\t"), + &ret.Id) ) + { + // Don't bother to continue, lsb_release is probably not available. + return ret; + } + + wxGetValueFromLSBRelease(wxS("--description"), wxS("Description:\t"), + &ret.Description); + wxGetValueFromLSBRelease(wxS("--release"), wxS("Release:\t"), + &ret.Release); + wxGetValueFromLSBRelease(wxS("--codename"), wxS("Codename:\t"), + &ret.CodeName); return ret; } -#endif +#endif // __LINUX__ // these functions are in src/osx/utilsexc_base.cpp for wxMac -#ifndef __WXMAC__ +#ifndef __DARWIN__ wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) { @@ -1048,7 +1153,7 @@ wxString wxGetOsDescription() return wxGetCommandOutput(wxT("uname -s -r -m")); } -#endif // !__WXMAC__ +#endif // !__DARWIN__ unsigned long wxGetProcessId() { @@ -1327,141 +1432,73 @@ bool wxHandleFatalExceptions(bool doit) // wxExecute support // ---------------------------------------------------------------------------- -int wxAppTraits::AddProcessCallback(wxEndProcessData *data, int fd) +int wxAppTraits::WaitForChild(wxExecuteData& execData) { - // define a custom handler processing only the closure of the descriptor - struct wxEndProcessFDIOHandler : public wxFDIOHandler +#if wxUSE_CONSOLE_EVENTLOOP + wxConsoleEventLoop loop; + return RunLoopUntilChildExit(execData, loop); +#else // !wxUSE_CONSOLE_EVENTLOOP + wxFAIL_MSG( wxS("Can't wait for child process without wxConsoleEventLoop") ); + + return -1; +#endif // wxUSE_CONSOLE_EVENTLOOP/!wxUSE_CONSOLE_EVENTLOOP +} + +// This function is common code for both console and GUI applications and used +// by wxExecute() to wait for the child exit while dispatching events. +// +// Notice that it should not be used for all the other cases, e.g. when we +// don't need to wait for the child (wxEXEC_ASYNC) or when the events must not +// dispatched (wxEXEC_NOEVENTS). +int +wxAppTraits::RunLoopUntilChildExit(wxExecuteData& execData, + wxEventLoopBase& loop) +{ + // It is possible that wxExecuteData::OnExit() had already been called + // and reset the PID to 0, in which case we don't need to do anything + // at all. + if ( !execData.pid ) + return execData.exitcode; + +#if wxUSE_STREAMS + // Monitor the child streams if necessary. + wxScopedPtr + stdoutHandler, + stderrHandler; + if ( execData.IsRedirected() ) { - wxEndProcessFDIOHandler(wxEndProcessData *data, int fd) - : m_data(data), m_fd(fd) - { - } + stdoutHandler.reset(new wxExecuteEventLoopSourceHandler + ( + execData.fdOut, execData.bufOut + )); + stderrHandler.reset(new wxExecuteEventLoopSourceHandler + ( + execData.fdErr, execData.bufErr + )); + } +#endif // wxUSE_STREAMS - virtual void OnReadWaiting() - { - wxFDIODispatcher::Get()->UnregisterFD(m_fd); - close(m_fd); + // Store the event loop in the data associated with the child + // process so that it could exit the loop when the child exits. + execData.syncEventLoop = &loop; - wxHandleProcessTermination(m_data); + // And run it. + loop.Run(); - delete this; - } - - virtual void OnWriteWaiting() { wxFAIL_MSG("unreachable"); } - virtual void OnExceptionWaiting() { wxFAIL_MSG("unreachable"); } - - wxEndProcessData * const m_data; - const int m_fd; - }; - - wxFDIODispatcher::Get()->RegisterFD - ( - fd, - new wxEndProcessFDIOHandler(data, fd), - wxFDIO_INPUT - ); - return fd; // unused, but return something unique for the tag + // The exit code will have been set when the child termination was detected. + return execData.exitcode; } -bool wxAppTraits::CheckForRedirectedIO(wxExecuteData& execData) -{ -#if HAS_PIPE_STREAMS - bool hasIO = false; +// ---------------------------------------------------------------------------- +// wxExecuteData +// ---------------------------------------------------------------------------- - if ( execData.bufOut && execData.bufOut->Update() ) - hasIO = true; - - if ( execData.bufErr && execData.bufErr->Update() ) - hasIO = true; - - return hasIO; -#else // !HAS_PIPE_STREAMS - wxUnusedVar(execData); - - return false; -#endif // HAS_PIPE_STREAMS/!HAS_PIPE_STREAMS -} - -// helper classes/functions used by WaitForChild() namespace { -// convenient base class for IO handlers which are registered for read -// notifications only and which also stores the FD we're reading from -// -// the derived classes still have to implement OnReadWaiting() -class wxReadFDIOHandler : public wxFDIOHandler -{ -public: - wxReadFDIOHandler(wxFDIODispatcher& disp, int fd) : m_fd(fd) - { - if ( fd ) - disp.RegisterFD(fd, this, wxFDIO_INPUT); - } - - virtual void OnWriteWaiting() { wxFAIL_MSG("unreachable"); } - virtual void OnExceptionWaiting() { wxFAIL_MSG("unreachable"); } - -protected: - const int m_fd; - - wxDECLARE_NO_COPY_CLASS(wxReadFDIOHandler); -}; - -// class for monitoring our end of the process detection pipe, simply sets a -// flag when input on the pipe (which must be due to EOF) is detected -class wxEndHandler : public wxReadFDIOHandler -{ -public: - wxEndHandler(wxFDIODispatcher& disp, int fd) - : wxReadFDIOHandler(disp, fd) - { - m_terminated = false; - } - - bool Terminated() const { return m_terminated; } - - virtual void OnReadWaiting() { m_terminated = true; } - -private: - bool m_terminated; - - wxDECLARE_NO_COPY_CLASS(wxEndHandler); -}; - -#if HAS_PIPE_STREAMS - -// class for monitoring our ends of child stdout/err, should be constructed -// with the FD and stream from wxExecuteData and will do nothing if they're -// invalid -// -// unlike wxEndHandler this class registers itself with the provided dispatcher -class wxRedirectedIOHandler : public wxReadFDIOHandler -{ -public: - wxRedirectedIOHandler(wxFDIODispatcher& disp, - int fd, - wxStreamTempInputBuffer *buf) - : wxReadFDIOHandler(disp, fd), - m_buf(buf) - { - } - - virtual void OnReadWaiting() - { - m_buf->Update(); - } - -private: - wxStreamTempInputBuffer * const m_buf; - - wxDECLARE_NO_COPY_CLASS(wxRedirectedIOHandler); -}; - -#endif // HAS_PIPE_STREAMS - -// helper function which calls waitpid() and analyzes the result -int DoWaitForChild(int pid, int flags = 0) +// Helper function that checks whether the child with the given PID has exited +// and fills the provided parameter with its return code if it did. +bool CheckForChildExit(int pid, int* exitcodeOut) { wxASSERT_MSG( pid > 0, "invalid PID" ); @@ -1470,124 +1507,150 @@ int DoWaitForChild(int pid, int flags = 0) // loop while we're getting EINTR for ( ;; ) { - rc = waitpid(pid, &status, flags); + rc = waitpid(pid, &status, WNOHANG); if ( rc != -1 || errno != EINTR ) break; } - if ( rc == 0 ) + switch ( rc ) { - // This can only happen if the child application closes our dummy pipe - // that is used to monitor its lifetime; in that case, our best bet is - // to pretend the process did terminate, because otherwise wxExecute() - // would hang indefinitely (OnReadWaiting() won't be called again, the - // descriptor is closed now). - wxLogDebug("Child process (PID %d) still alive but pipe closed so " - "generating a close notification", pid); - } - else if ( rc == -1 ) - { - wxLogLastError(wxString::Format("waitpid(%d)", pid)); - } - else // child did terminate - { - wxASSERT_MSG( rc == pid, "unexpected waitpid() return value" ); + case 0: + // No error but the child is still running. + return false; - // notice that the caller expects the exit code to be signed, e.g. -1 - // instead of 255 so don't assign WEXITSTATUS() to an int - signed char exitcode; - if ( WIFEXITED(status) ) - exitcode = WEXITSTATUS(status); - else if ( WIFSIGNALED(status) ) - exitcode = -WTERMSIG(status); - else - { - wxLogError("Child process (PID %d) exited for unknown reason, " - "status = %d", pid, status); - exitcode = -1; - } + case -1: + // Checking child status failed. Invalid PID? + wxLogLastError(wxString::Format("waitpid(%d)", pid)); + return false; - return exitcode; + default: + // Child did terminate. + wxASSERT_MSG( rc == pid, "unexpected waitpid() return value" ); + + // notice that the caller expects the exit code to be signed, e.g. -1 + // instead of 255 so don't assign WEXITSTATUS() to an int + signed char exitcode; + if ( WIFEXITED(status) ) + exitcode = WEXITSTATUS(status); + else if ( WIFSIGNALED(status) ) + exitcode = -WTERMSIG(status); + else + { + wxLogError("Child process (PID %d) exited for unknown reason, " + "status = %d", pid, status); + exitcode = -1; + } + + if ( exitcodeOut ) + *exitcodeOut = exitcode; + + return true; } - - return -1; } } // anonymous namespace -int wxAppTraits::WaitForChild(wxExecuteData& execData) +wxExecuteData::ChildProcessesData wxExecuteData::ms_childProcesses; + +/* static */ +void wxExecuteData::OnSomeChildExited(int WXUNUSED(sig)) { - if ( !(execData.flags & wxEXEC_SYNC) ) - { - // asynchronous execution: just launch the process and return, - // endProcData will be destroyed when it terminates (currently we leak - // it if the process doesn't terminate before we do and this should be - // fixed but it's not a real leak so it's not really very high - // priority) - wxEndProcessData *endProcData = new wxEndProcessData; - endProcData->process = execData.process; - endProcData->pid = execData.pid; - endProcData->tag = AddProcessCallback - ( - endProcData, - execData.GetEndProcReadFD() - ); - endProcData->async = true; + // We know that some child process has terminated, but we don't know which + // one, so check all of them (notice that more than one could have exited). + // + // An alternative approach would be to call waitpid(-1, &status, WNOHANG) + // (in a loop to take care of the multiple children exiting case) and + // perhaps this would be more efficient. But for now this seems to work. - return execData.pid; - } - //else: synchronous execution case -#if HAS_PIPE_STREAMS && wxUSE_SOCKETS - wxProcess * const process = execData.process; - if ( process && process->IsRedirected() ) + // Make a copy of the list before iterating over it to avoid problems due + // to deleting entries from it in the process. + const ChildProcessesData allChildProcesses = ms_childProcesses; + for ( ChildProcessesData::const_iterator it = allChildProcesses.begin(); + it != allChildProcesses.end(); + ++it ) { - // we can't simply block waiting for the child to terminate as we would - // dead lock if it writes more than the pipe buffer size (typically - // 4KB) bytes of output -- it would then block waiting for us to read - // the data while we'd block waiting for it to terminate + const int pid = it->first; + + // Check whether this child exited. + int exitcode; + if ( !CheckForChildExit(pid, &exitcode) ) + continue; + + // And handle its termination if it did. // - // so multiplex here waiting for any input from the child or closure of - // the pipe used to indicate its termination - wxSelectDispatcher disp; - - wxEndHandler endHandler(disp, execData.GetEndProcReadFD()); - - wxRedirectedIOHandler outHandler(disp, execData.fdOut, execData.bufOut), - errHandler(disp, execData.fdErr, execData.bufErr); - - while ( !endHandler.Terminated() ) - { - disp.Dispatch(); - } + // Notice that this will implicitly remove it from ms_childProcesses. + it->second->OnExit(exitcode); } - //else: no IO redirection, just block waiting for the child to exit -#endif // HAS_PIPE_STREAMS - - return DoWaitForChild(execData.pid); } -void wxHandleProcessTermination(wxEndProcessData *data) +void wxExecuteData::OnStart(int pid_) { - data->exitcode = DoWaitForChild(data->pid, WNOHANG); + wxCHECK_RET( wxTheApp, + wxS("Ensure wxTheApp is set before calling wxExecute()") ); - // notify user about termination if required - if ( data->process ) + // Setup the signal handler for SIGCHLD to be able to detect the child + // termination. + // + // Notice that SetSignalHandler() is idempotent, so it's fine to call + // it more than once with the same handler. + wxTheApp->SetSignalHandler(SIGCHLD, OnSomeChildExited); + + + // Remember the child PID to be able to wait for it later. + pid = pid_; + + // Also save it in wxProcess where it will be accessible to the user code. + if ( process ) + process->SetPid(pid); + + // Finally, add this object itself to the list of child processes so that + // we can check for its termination the next time we get SIGCHLD. + ms_childProcesses[pid] = this; +} + +void wxExecuteData::OnExit(int exitcode_) +{ + // Remove this process from the hash list of child processes that are + // still open as soon as possible to ensure we don't process it again even + // if another SIGCHLD happens. + if ( !ms_childProcesses.erase(pid) ) { - data->process->OnTerminate(data->pid, data->exitcode); + wxFAIL_MSG(wxString::Format(wxS("Data for PID %d not in the list?"), pid)); } - if ( data->async ) + + exitcode = exitcode_; + +#if wxUSE_STREAMS + if ( IsRedirected() ) { - // in case of asynchronous execution we don't need this data any more + // Read the remaining data in a blocking way: this is fine because the + // child has already exited and hence all the data must be already + // available in the streams buffers. + bufOut.ReadAll(); + bufErr.ReadAll(); + } +#endif // wxUSE_STREAMS + + // Notify user about termination if required + if ( !(flags & wxEXEC_SYNC) ) + { + if ( process ) + process->OnTerminate(pid, exitcode); + + // in case of asynchronous execution we don't need this object any more // after the child terminates - delete data; + delete this; } else // sync execution { // let wxExecute() know that the process has terminated - data->pid = 0; + pid = 0; + + // Stop the event loop for synchronous wxExecute() if we're running one. + if ( syncEventLoop ) + syncEventLoop->ScheduleExit(); } } - diff --git a/Externals/wxWidgets3/src/unix/utilsx11.cpp b/Externals/wxWidgets3/src/unix/utilsx11.cpp index c5fc2e7421..12ff73e6a3 100644 --- a/Externals/wxWidgets3/src/unix/utilsx11.cpp +++ b/Externals/wxWidgets3/src/unix/utilsx11.cpp @@ -4,7 +4,6 @@ // Author: Mattia Barbon, Vaclav Slavik, Robert Roebling // Modified by: // Created: 25.03.02 -// RCS-ID: $Id: utilsx11.cpp 70741 2012-02-28 18:23:39Z PC $ // Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,8 +37,13 @@ #ifdef __WXGTK__ #include +#ifdef GDK_WINDOWING_X11 #include #endif +#endif + +// Only X11 backend is supported for wxGTK here +#if !defined(__WXGTK__) || defined(GDK_WINDOWING_X11) // Various X11 Atoms used in this file: static Atom _NET_WM_STATE = 0; @@ -849,6 +853,8 @@ bool wxGetKeyState(wxKeyCode key) return key_vector[keyCode >> 3] & (1 << (keyCode & 7)); } +#endif // !defined(__WXGTK__) || defined(GDK_WINDOWING_X11) + // ---------------------------------------------------------------------------- // Launch document with default app // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/unix/wakeuppipe.cpp b/Externals/wxWidgets3/src/unix/wakeuppipe.cpp new file mode 100644 index 0000000000..1bd33d6021 --- /dev/null +++ b/Externals/wxWidgets3/src/unix/wakeuppipe.cpp @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/unix/wakeuppipe.cpp +// Purpose: Implementation of wxWakeUpPipe class. +// Author: Vadim Zeitlin +// Created: 2013-06-09 (extracted from src/unix/evtloopunix.cpp) +// Copyright: (c) 2013 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif // WX_PRECOMP + +#include "wx/unix/private/wakeuppipe.h" + +#include + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define TRACE_EVENTS wxT("events") + +// ============================================================================ +// wxWakeUpPipe implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// initialization +// ---------------------------------------------------------------------------- + +wxWakeUpPipe::wxWakeUpPipe() +{ + m_pipeIsEmpty = true; + + if ( !m_pipe.Create() ) + { + wxLogError(_("Failed to create wake up pipe used by event loop.")); + return; + } + + + if ( !m_pipe.MakeNonBlocking(wxPipe::Read) ) + { + wxLogSysError(_("Failed to switch wake up pipe to non-blocking mode")); + return; + } + + wxLogTrace(TRACE_EVENTS, wxT("Wake up pipe (%d, %d) created"), + m_pipe[wxPipe::Read], m_pipe[wxPipe::Write]); +} + +// ---------------------------------------------------------------------------- +// wakeup handling +// ---------------------------------------------------------------------------- + +void wxWakeUpPipe::WakeUpNoLock() +{ + // No need to do anything if the pipe already contains something. + if ( !m_pipeIsEmpty ) + return; + + if ( write(m_pipe[wxPipe::Write], "s", 1) != 1 ) + { + // don't use wxLog here, we can be in another thread and this could + // result in dead locks + perror("write(wake up pipe)"); + } + else + { + // We just wrote to it, so it's not empty any more. + m_pipeIsEmpty = false; + } +} + +void wxWakeUpPipe::OnReadWaiting() +{ + // got wakeup from child thread, remove the data that provoked it from the + // pipe + + char buf[4]; + for ( ;; ) + { + const int size = read(GetReadFd(), buf, WXSIZEOF(buf)); + + if ( size > 0 ) + { + wxASSERT_MSG( size == 1, "Too many writes to wake-up pipe?" ); + + break; + } + + if ( size == 0 || (size == -1 && errno == EAGAIN) ) + { + // No data available, not an error (but still surprising, + // spurious wakeup?) + break; + } + + if ( errno == EINTR ) + { + // We were interrupted, try again. + continue; + } + + wxLogSysError(_("Failed to read from wake-up pipe")); + + return; + } + + // The pipe is empty now, so future calls to WakeUp() would need to write + // to it again. + m_pipeIsEmpty = true; +} diff --git a/Externals/wxWidgets3/wx/wxcocoa.h b/Externals/wxWidgets3/wx/wxcocoa.h index 33a19cda5b..e05ccb3909 100644 --- a/Externals/wxWidgets3/wx/wxcocoa.h +++ b/Externals/wxWidgets3/wx/wxcocoa.h @@ -1267,5 +1267,8 @@ /* define this when wxDC::Blit() respects SetDeviceOrigin() in wxGTK */ /* #undef wxHAS_WORKING_GTK_DC_BLIT */ +#define wxUSE_COMPILER_TLS 1 +#define wxUSE_PREFERENCES_EDITOR 1 + #endif /* __WX_SETUP_H__ */ diff --git a/Externals/wxWidgets3/wx/wxgtk.h b/Externals/wxWidgets3/wx/wxgtk.h index bcbdd9be37..c8c4eba86b 100644 --- a/Externals/wxWidgets3/wx/wxgtk.h +++ b/Externals/wxWidgets3/wx/wxgtk.h @@ -1256,5 +1256,8 @@ /* define this when wxDC::Blit() respects SetDeviceOrigin() in wxGTK */ /* #undef wxHAS_WORKING_GTK_DC_BLIT */ +#define wxUSE_COMPILER_TLS 1 +#define wxUSE_PREFERENCES_EDITOR 1 + #endif /* __WX_SETUP_H__ */ diff --git a/Externals/wxWidgets3/wx/wxmsw.h b/Externals/wxWidgets3/wx/wxmsw.h index 0205c8c66e..93950bf567 100644 --- a/Externals/wxWidgets3/wx/wxmsw.h +++ b/Externals/wxWidgets3/wx/wxmsw.h @@ -1634,5 +1634,8 @@ #define wxUSE_CRASHREPORT 1 /* --- end MSW options --- */ +#define wxUSE_COMPILER_TLS 1 +#define wxUSE_PREFERENCES_EDITOR 1 + #endif // _WX_SETUP_H_ diff --git a/Externals/zlib/zlib.vcxproj b/Externals/zlib/zlib.vcxproj index e4432e2612..f890251da5 100644 --- a/Externals/zlib/zlib.vcxproj +++ b/Externals/zlib/zlib.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,112 +19,30 @@ - {3E1339F5-9311-4122-9442-369702E8FCAD} - zlib + {FF213B23-2C26-4214-9F88-85271E557E87} - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - + + @@ -151,6 +61,12 @@ + + + + + + @@ -164,9 +80,6 @@ - - - diff --git a/Externals/zlib/zlib.vcxproj.filters b/Externals/zlib/zlib.vcxproj.filters deleted file mode 100644 index 5e4b0a7921..0000000000 --- a/Externals/zlib/zlib.vcxproj.filters +++ /dev/null @@ -1,96 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - - - - {e2f2d23a-ab40-4d71-ad14-caf68f21801b} - - - {58aaeb81-b6bc-4175-94c7-baa2db0b1827} - - - \ No newline at end of file diff --git a/Installer/Dolphin.ico b/Installer/Dolphin.ico index 8ebe725760..ead8505da0 100644 Binary files a/Installer/Dolphin.ico and b/Installer/Dolphin.ico differ diff --git a/Installer/GetSVNRev.nsi b/Installer/GetSVNRev.nsi deleted file mode 100644 index c9f0c166d7..0000000000 --- a/Installer/GetSVNRev.nsi +++ /dev/null @@ -1,11 +0,0 @@ -OutFile "GetSVNRev.exe" -SilentInstall silent - -Section - ; Create template for SubWCRev - FileOpen $R0 "svnrev_template.txt" w - FileWrite $R0 '!define PRODUCT_VERSION "$$WCREV$$"' - FileClose $R0 - ; Make a file with only rev # in it - Exec "..\Source\Core\Common\SubWCRev.exe ..\ svnrev_template.txt svnrev.txt" -SectionEnd \ No newline at end of file diff --git a/Installer/Installer.nsi b/Installer/Installer.nsi new file mode 100644 index 0000000000..3543d149b5 --- /dev/null +++ b/Installer/Installer.nsi @@ -0,0 +1,187 @@ +!define PRODUCT_VERSION 4.0 + +!define BASE_DIR "..\Binary\${DOLPHIN_ARCH}" + +; HM NIS Edit Wizard helper defines +!define PRODUCT_PUBLISHER "Dolphin Development Team" +!define PRODUCT_WEB_SITE "https://dolphin-emu.org/" +!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" + +SetCompressor /SOLID lzma + +; MUI 1.67 compatible ------ +!include "MUI.nsh" + +; MUI Settings +!define MUI_ABORTWARNING +!define MUI_ICON "Dolphin.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + +; Language Selection Dialog Settings +!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" +!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" +!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" + +; License page +!insertmacro MUI_PAGE_LICENSE "..\License.txt" +; Components page +!insertmacro MUI_PAGE_COMPONENTS +; Directory page +!insertmacro MUI_PAGE_DIRECTORY +; Instfiles page +!insertmacro MUI_PAGE_INSTFILES +; Finish page +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_INSTFILES + +; Language files +!insertmacro MUI_LANGUAGE "Afrikaans" +!insertmacro MUI_LANGUAGE "Albanian" +!insertmacro MUI_LANGUAGE "Arabic" +!insertmacro MUI_LANGUAGE "Basque" +!insertmacro MUI_LANGUAGE "Belarusian" +!insertmacro MUI_LANGUAGE "Bosnian" +!insertmacro MUI_LANGUAGE "Breton" +!insertmacro MUI_LANGUAGE "Bulgarian" +!insertmacro MUI_LANGUAGE "Catalan" +!insertmacro MUI_LANGUAGE "Croatian" +!insertmacro MUI_LANGUAGE "Czech" +!insertmacro MUI_LANGUAGE "Danish" +!insertmacro MUI_LANGUAGE "Dutch" +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "Estonian" +!insertmacro MUI_LANGUAGE "Farsi" +!insertmacro MUI_LANGUAGE "Finnish" +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "Galician" +!insertmacro MUI_LANGUAGE "German" +!insertmacro MUI_LANGUAGE "Greek" +!insertmacro MUI_LANGUAGE "Hebrew" +!insertmacro MUI_LANGUAGE "Hungarian" +!insertmacro MUI_LANGUAGE "Icelandic" +!insertmacro MUI_LANGUAGE "Indonesian" +!insertmacro MUI_LANGUAGE "Irish" +!insertmacro MUI_LANGUAGE "Italian" +!insertmacro MUI_LANGUAGE "Japanese" +!insertmacro MUI_LANGUAGE "Korean" +!insertmacro MUI_LANGUAGE "Kurdish" +!insertmacro MUI_LANGUAGE "Latvian" +!insertmacro MUI_LANGUAGE "Lithuanian" +!insertmacro MUI_LANGUAGE "Luxembourgish" +!insertmacro MUI_LANGUAGE "Macedonian" +!insertmacro MUI_LANGUAGE "Malay" +!insertmacro MUI_LANGUAGE "Mongolian" +!insertmacro MUI_LANGUAGE "Norwegian" +!insertmacro MUI_LANGUAGE "NorwegianNynorsk" +!insertmacro MUI_LANGUAGE "Polish" +!insertmacro MUI_LANGUAGE "Portuguese" +!insertmacro MUI_LANGUAGE "PortugueseBR" +!insertmacro MUI_LANGUAGE "Romanian" +!insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "Serbian" +!insertmacro MUI_LANGUAGE "SerbianLatin" +!insertmacro MUI_LANGUAGE "SimpChinese" +!insertmacro MUI_LANGUAGE "Slovak" +!insertmacro MUI_LANGUAGE "Slovenian" +!insertmacro MUI_LANGUAGE "Spanish" +!insertmacro MUI_LANGUAGE "SpanishInternational" +!insertmacro MUI_LANGUAGE "Swedish" +!insertmacro MUI_LANGUAGE "Thai" +!insertmacro MUI_LANGUAGE "TradChinese" +!insertmacro MUI_LANGUAGE "Turkish" +!insertmacro MUI_LANGUAGE "Ukrainian" +!insertmacro MUI_LANGUAGE "Uzbek" +!insertmacro MUI_LANGUAGE "Welsh" + +; Reserve files +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + +; MUI end ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +!define UN_NAME "Uninstall $(^Name)" +OutFile "dolphin-${DOLPHIN_ARCH}-${PRODUCT_VERSION}.exe" +InstallDir "${BASE_INSTALL_DIR}\$(^Name)" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show + +Function .onInit + !insertmacro MUI_LANGDLL_DISPLAY +FunctionEnd + +Section "Base" SEC01 + SectionIn RO + SetShellVarContext all + ; Dolphin exe and dlls + ; TODO: Make a nice subsection-ized display + SetOutPath "$INSTDIR" + SetOverwrite ifnewer + File "${BASE_DIR}\Dolphin.exe" + File "${BASE_DIR}\license.txt" + File "${BASE_DIR}\*.dll" + File /r "${BASE_DIR}\Languages" + File /r "${BASE_DIR}\Sys" + + ; This needs to be done after Dolphin.exe is copied + CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\Dolphin.exe" + CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\Dolphin.exe" + + SetOutPath "$TEMP" + SetOverwrite on + File /r "dxredist" +SectionEnd + +Section "DirectX Runtime" SEC02 + DetailPrint "Running DirectX runtime setup..." + ExecWait '"$TEMP\dxredist\DXSETUP.exe" /silent' + DetailPrint "Finished DirectX runtime setup" +SectionEnd + +Section -AdditionalIcons + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" "$INSTDIR\uninst.exe" +SectionEnd + +Section -Post + WriteUninstaller "$INSTDIR\uninst.exe" + WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Dolphin.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Dolphin.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" +SectionEnd + +; Section descriptions +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Installs all files required to run the Dolphin Emulator." + !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "Installs the recommended DirectX runtime libraries that are needed by Dolphin." +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Section Uninstall + SetShellVarContext all + ; Only uninstall what we put there; all $INSTDIR\User is left as is + Delete "$INSTDIR\uninst.exe" + Delete "$INSTDIR\license.txt" + Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\Dolphin.exe" + + Delete "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" + Delete "$DESKTOP\${PRODUCT_NAME}.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" + + RMDir "$SMPROGRAMS\${PRODUCT_NAME}" + RMDir /r "$INSTDIR\Sys" + RMDir /r "$INSTDIR\Languages" + RMDir "$INSTDIR" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + SetAutoClose true +SectionEnd diff --git a/Installer/Installer_win32.nsi b/Installer/Installer_win32.nsi index e56436104d..35d5d1f622 100644 --- a/Installer/Installer_win32.nsi +++ b/Installer/Installer_win32.nsi @@ -1,239 +1,5 @@ -!system "GetSVNRev.exe" ; ATTENTION: This MUST be run before this script -!include "svnrev.txt" ; !defines PRODUCT_VERSION -!define BASE_DIR "..\Binary\win32" +!define DOLPHIN_ARCH Win32 +!define BASE_INSTALL_DIR "$PROGRAMFILES32" +!define PRODUCT_NAME "Dolphin x86" -; HM NIS Edit Wizard helper defines -!define PRODUCT_NAME "Dolphin" -!define PRODUCT_PUBLISHER "Dolphin Team" -!define PRODUCT_WEB_SITE "http://www.dolphin-emu.com" -!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Dolphin.exe" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" - -SetCompressor lzma - -; MUI 1.67 compatible ------ -!include "MUI.nsh" - -; MUI Settings -!define MUI_ABORTWARNING -!define MUI_ICON "Dolphin.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" - -; Language Selection Dialog Settings -!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" -!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" -!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" - -; License page -!insertmacro MUI_PAGE_LICENSE "Licence.txt" -; Components page -!insertmacro MUI_PAGE_COMPONENTS -; Directory page -!insertmacro MUI_PAGE_DIRECTORY -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES -; Finish page -; We launch the desktop shortcut to set the working dir -!define MUI_FINISHPAGE_RUN -!define MUI_FINISHPAGE_RUN_TEXT "Start $(^Name)" -!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchDolphin" -!insertmacro MUI_PAGE_FINISH - -; Uninstaller pages -!insertmacro MUI_UNPAGE_INSTFILES - -; Language files -!insertmacro MUI_LANGUAGE "Afrikaans" -!insertmacro MUI_LANGUAGE "Albanian" -!insertmacro MUI_LANGUAGE "Arabic" -!insertmacro MUI_LANGUAGE "Basque" -!insertmacro MUI_LANGUAGE "Belarusian" -!insertmacro MUI_LANGUAGE "Bosnian" -!insertmacro MUI_LANGUAGE "Breton" -!insertmacro MUI_LANGUAGE "Bulgarian" -!insertmacro MUI_LANGUAGE "Catalan" -!insertmacro MUI_LANGUAGE "Croatian" -!insertmacro MUI_LANGUAGE "Czech" -!insertmacro MUI_LANGUAGE "Danish" -!insertmacro MUI_LANGUAGE "Dutch" -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_LANGUAGE "Estonian" -!insertmacro MUI_LANGUAGE "Farsi" -!insertmacro MUI_LANGUAGE "Finnish" -!insertmacro MUI_LANGUAGE "French" -!insertmacro MUI_LANGUAGE "Galician" -!insertmacro MUI_LANGUAGE "German" -!insertmacro MUI_LANGUAGE "Greek" -!insertmacro MUI_LANGUAGE "Hebrew" -!insertmacro MUI_LANGUAGE "Hungarian" -!insertmacro MUI_LANGUAGE "Icelandic" -!insertmacro MUI_LANGUAGE "Indonesian" -!insertmacro MUI_LANGUAGE "Irish" -!insertmacro MUI_LANGUAGE "Italian" -!insertmacro MUI_LANGUAGE "Japanese" -!insertmacro MUI_LANGUAGE "Korean" -!insertmacro MUI_LANGUAGE "Kurdish" -!insertmacro MUI_LANGUAGE "Latvian" -!insertmacro MUI_LANGUAGE "Lithuanian" -!insertmacro MUI_LANGUAGE "Luxembourgish" -!insertmacro MUI_LANGUAGE "Macedonian" -!insertmacro MUI_LANGUAGE "Malay" -!insertmacro MUI_LANGUAGE "Mongolian" -!insertmacro MUI_LANGUAGE "Norwegian" -!insertmacro MUI_LANGUAGE "NorwegianNynorsk" -!insertmacro MUI_LANGUAGE "Polish" -!insertmacro MUI_LANGUAGE "Portuguese" -!insertmacro MUI_LANGUAGE "PortugueseBR" -!insertmacro MUI_LANGUAGE "Romanian" -!insertmacro MUI_LANGUAGE "Russian" -!insertmacro MUI_LANGUAGE "Serbian" -!insertmacro MUI_LANGUAGE "SerbianLatin" -!insertmacro MUI_LANGUAGE "SimpChinese" -!insertmacro MUI_LANGUAGE "Slovak" -!insertmacro MUI_LANGUAGE "Slovenian" -!insertmacro MUI_LANGUAGE "Spanish" -!insertmacro MUI_LANGUAGE "SpanishInternational" -!insertmacro MUI_LANGUAGE "Swedish" -!insertmacro MUI_LANGUAGE "Thai" -!insertmacro MUI_LANGUAGE "TradChinese" -!insertmacro MUI_LANGUAGE "Turkish" -!insertmacro MUI_LANGUAGE "Ukrainian" -!insertmacro MUI_LANGUAGE "Uzbek" -!insertmacro MUI_LANGUAGE "Welsh" - -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -; MUI end ------ - -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -!define UN_NAME "Uninstall $(^Name)" -OutFile "Dolphin_Installer_win32.exe" -InstallDir "$PROGRAMFILES\$(^Name)" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - -Function .onInit - !insertmacro MUI_LANGDLL_DISPLAY -FunctionEnd - -Section "Base" SEC01 - SetShellVarContext all - ; Dolphin exe and dlls - ; TODO: Make a nice subsection-ized display - SetOutPath "$INSTDIR" - SetOverwrite ifnewer - File "${BASE_DIR}\Dolphin.exe" - File "..\Externals\WiiUse\Win32\wiiuse.dll" - File "..\Externals\SDL\win32\SDL.dll" - File "..\Externals\OpenAL\win32\OpenAL32.dll" - File "..\Externals\OpenAL\win32\wrap_oal.dll" - ; This needs to be done after Dolphin.exe is copied - CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Dolphin.lnk" "$INSTDIR\Dolphin.exe" - CreateShortCut "$DESKTOP\Dolphin.lnk" "$INSTDIR\Dolphin.exe" - - ; Plugins - SetOutPath "$INSTDIR\Plugins" - SetOverwrite ifnewer - File "${BASE_DIR}\Plugins\Plugin_DSP_HLE.dll" - File "${BASE_DIR}\Plugins\Plugin_DSP_LLE.dll" - File "${BASE_DIR}\Plugins\Plugin_nJoy_SDL.dll" - File "${BASE_DIR}\Plugins\Plugin_nJoy_SDL_Test.dll" - File "${BASE_DIR}\Plugins\Plugin_PadSimple.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoDX9.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoOGL.dll" - File "${BASE_DIR}\Plugins\Plugin_Wiimote.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoSW.dll" - - ; GC/Wii static settings - SetOutPath "$INSTDIR\Sys\GC" - SetOverwrite ifnewer - File "..\Data\Sys\GC\font_ansi.bin" - File "..\Data\Sys\GC\font_sjis.bin" - SetOutPath "$INSTDIR\Sys\Wii" - SetOverwrite ifnewer - File "..\Data\Sys\Wii\setting-eur.txt" - File "..\Data\Sys\Wii\setting-jpn.txt" - File "..\Data\Sys\Wii\setting-usa.txt" - - ; GC/Wii User settings - SetOutPath "$INSTDIR\User\GC" - SetOutPath "$INSTDIR\User\Wii\shared2\sys" - SetOverwrite ifnewer - File "..\Data\User\Wii\shared2\sys\readme.txt" - File "..\Data\User\Wii\shared2\sys\SYSCONF" - - ; GameConfigs - SetOutPath "$INSTDIR\User\GameConfig" - SetOverwrite ifnewer - File "..\Data\User\GameConfig\*.*" -SectionEnd - -Section -AdditionalIcons - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" "$INSTDIR\uninst.exe" -SectionEnd - -Section -Post - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" -SectionEnd - -; Section descriptions -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "It is recommended that you install all of the included files." -!insertmacro MUI_FUNCTION_DESCRIPTION_END - - -Function un.onUninstSuccess - HideWindow - MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was uninstalled successfully.$\r$\n\ - ATTENTION: You must manually delete$\r$\n$INSTDIR" -FunctionEnd - -Function un.onInit -!insertmacro MUI_UNGETLANGUAGE - MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to remove $(^Name)?" IDYES +2 - Abort -FunctionEnd - -Section Uninstall - SetShellVarContext all - ; Only uninstall what we put there; all $INSTDIR\User is left as is - Delete "$INSTDIR\uninst.exe" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\Plugins\*.dll" - Delete "$INSTDIR\Sys\Wii\setting-usa.txt" - Delete "$INSTDIR\Sys\Wii\setting-jpn.txt" - Delete "$INSTDIR\Sys\Wii\setting-eur.txt" - Delete "$INSTDIR\Sys\GC\font_sjis.bin" - Delete "$INSTDIR\Sys\GC\font_ansi.bin" - Delete "$INSTDIR\Dolphin.exe" - - Delete "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" - Delete "$DESKTOP\Dolphin.lnk" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\Dolphin.lnk" - - RMDir "$SMPROGRAMS\${PRODUCT_NAME}" - RMDir "$INSTDIR\Sys\GC" - RMDir "$INSTDIR\Sys\Wii" - RMDir "$INSTDIR\Sys" - RMDir "$INSTDIR\Plugins" - RMDir "$INSTDIR" - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" - SetAutoClose true -SectionEnd - -Function LaunchDolphin - ExecShell "" "$DESKTOP\Dolphin.lnk" -FunctionEnd +!include Installer.nsi \ No newline at end of file diff --git a/Installer/Installer_x64.nsi b/Installer/Installer_x64.nsi index ff78b5aa5d..3b6ee79f50 100644 --- a/Installer/Installer_x64.nsi +++ b/Installer/Installer_x64.nsi @@ -1,249 +1,5 @@ -!system "GetSVNRev.exe" ; ATTENTION: This MUST be run before this script -!include "svnrev.txt" ; !defines PRODUCT_VERSION -!define BASE_DIR "..\Binary\x64" +!define DOLPHIN_ARCH x64 +!define BASE_INSTALL_DIR "$PROGRAMFILES64" +!define PRODUCT_NAME "Dolphin" -; HM NIS Edit Wizard helper defines -!define PRODUCT_NAME "Dolphin x64" -!define PRODUCT_PUBLISHER "Dolphin Team" -!define PRODUCT_WEB_SITE "http://www.dolphin-emu.com" -!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Dolphin.exe" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" - -SetCompressor lzma - -; MUI 1.67 compatible ------ -!include "MUI.nsh" - -; MUI Settings -!define MUI_ABORTWARNING -!define MUI_ICON "Dolphin.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" - -; Language Selection Dialog Settings -!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" -!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" -!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" - -; License page -!insertmacro MUI_PAGE_LICENSE "Licence.txt" -; Components page -!insertmacro MUI_PAGE_COMPONENTS -; Directory page -!insertmacro MUI_PAGE_DIRECTORY -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES -; Finish page -; We launch the desktop shortcut to set the working dir -!define MUI_FINISHPAGE_RUN -!define MUI_FINISHPAGE_RUN_TEXT "Start $(^Name)" -!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchDolphin" -!insertmacro MUI_PAGE_FINISH - -; Uninstaller pages -!insertmacro MUI_UNPAGE_INSTFILES - -; Language files -!insertmacro MUI_LANGUAGE "Afrikaans" -!insertmacro MUI_LANGUAGE "Albanian" -!insertmacro MUI_LANGUAGE "Arabic" -!insertmacro MUI_LANGUAGE "Basque" -!insertmacro MUI_LANGUAGE "Belarusian" -!insertmacro MUI_LANGUAGE "Bosnian" -!insertmacro MUI_LANGUAGE "Breton" -!insertmacro MUI_LANGUAGE "Bulgarian" -!insertmacro MUI_LANGUAGE "Catalan" -!insertmacro MUI_LANGUAGE "Croatian" -!insertmacro MUI_LANGUAGE "Czech" -!insertmacro MUI_LANGUAGE "Danish" -!insertmacro MUI_LANGUAGE "Dutch" -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_LANGUAGE "Estonian" -!insertmacro MUI_LANGUAGE "Farsi" -!insertmacro MUI_LANGUAGE "Finnish" -!insertmacro MUI_LANGUAGE "French" -!insertmacro MUI_LANGUAGE "Galician" -!insertmacro MUI_LANGUAGE "German" -!insertmacro MUI_LANGUAGE "Greek" -!insertmacro MUI_LANGUAGE "Hebrew" -!insertmacro MUI_LANGUAGE "Hungarian" -!insertmacro MUI_LANGUAGE "Icelandic" -!insertmacro MUI_LANGUAGE "Indonesian" -!insertmacro MUI_LANGUAGE "Irish" -!insertmacro MUI_LANGUAGE "Italian" -!insertmacro MUI_LANGUAGE "Japanese" -!insertmacro MUI_LANGUAGE "Korean" -!insertmacro MUI_LANGUAGE "Kurdish" -!insertmacro MUI_LANGUAGE "Latvian" -!insertmacro MUI_LANGUAGE "Lithuanian" -!insertmacro MUI_LANGUAGE "Luxembourgish" -!insertmacro MUI_LANGUAGE "Macedonian" -!insertmacro MUI_LANGUAGE "Malay" -!insertmacro MUI_LANGUAGE "Mongolian" -!insertmacro MUI_LANGUAGE "Norwegian" -!insertmacro MUI_LANGUAGE "NorwegianNynorsk" -!insertmacro MUI_LANGUAGE "Polish" -!insertmacro MUI_LANGUAGE "Portuguese" -!insertmacro MUI_LANGUAGE "PortugueseBR" -!insertmacro MUI_LANGUAGE "Romanian" -!insertmacro MUI_LANGUAGE "Russian" -!insertmacro MUI_LANGUAGE "Serbian" -!insertmacro MUI_LANGUAGE "SerbianLatin" -!insertmacro MUI_LANGUAGE "SimpChinese" -!insertmacro MUI_LANGUAGE "Slovak" -!insertmacro MUI_LANGUAGE "Slovenian" -!insertmacro MUI_LANGUAGE "Spanish" -!insertmacro MUI_LANGUAGE "SpanishInternational" -!insertmacro MUI_LANGUAGE "Swedish" -!insertmacro MUI_LANGUAGE "Thai" -!insertmacro MUI_LANGUAGE "TradChinese" -!insertmacro MUI_LANGUAGE "Turkish" -!insertmacro MUI_LANGUAGE "Ukrainian" -!insertmacro MUI_LANGUAGE "Uzbek" -!insertmacro MUI_LANGUAGE "Welsh" - -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -; MUI end ------ - -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -!define UN_NAME "Uninstall $(^Name)" -OutFile "Dolphin_Installer_x64.exe" -InstallDir "$PROGRAMFILES64\$(^Name)" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - -Function .onInit - !include "x64.nsh" - ; This checks if nsis is running under wow64 (since nsis is only 32bit) - ; hopefully this will be dependable in the future too... - ${If} ${RunningX64} - !insertmacro MUI_LANGDLL_DISPLAY - SetRegView 64 - ${Else} - MessageBox MB_OK|MB_ICONSTOP "You cannot run this version of Dolphin on your OS.$\r$\n\ - Please use a 64-bit OS or download a 32-bit version of Dolphin." - Quit - ${EndIf} -FunctionEnd - -Section "Complete" SEC01 - SetShellVarContext all - ; Dolphin exe and dlls - ; TODO: Make a nice subsection-ized display - SetOutPath "$INSTDIR" - SetOverwrite ifnewer - File "${BASE_DIR}\Dolphin.exe" - File "..\Externals\WiiUse\X64\wiiuse.dll" - File "..\Externals\SDL\x64\SDL.dll" - File "..\Externals\OpenAL\win64\OpenAL32.dll" - File "..\Externals\OpenAL\win64\wrap_oal.dll" - ; This needs to be done after Dolphin.exe is copied - CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Dolphin x64.lnk" "$INSTDIR\Dolphin.exe" - CreateShortCut "$DESKTOP\Dolphin x64.lnk" "$INSTDIR\Dolphin.exe" - - ; Plugins - SetOutPath "$INSTDIR\Plugins" - SetOverwrite ifnewer - File "${BASE_DIR}\Plugins\Plugin_DSP_HLE.dll" - File "${BASE_DIR}\Plugins\Plugin_DSP_LLE.dll" - File "${BASE_DIR}\Plugins\Plugin_nJoy_SDL.dll" - File "${BASE_DIR}\Plugins\Plugin_nJoy_SDL_Test.dll" - File "${BASE_DIR}\Plugins\Plugin_PadSimple.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoDX9.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoOGL.dll" - File "${BASE_DIR}\Plugins\Plugin_Wiimote.dll" - File "${BASE_DIR}\Plugins\Plugin_VideoSW.dll" - - ; GC/Wii static settings - SetOutPath "$INSTDIR\Sys\GC" - SetOverwrite ifnewer - File "..\Data\Sys\GC\font_ansi.bin" - File "..\Data\Sys\GC\font_sjis.bin" - SetOutPath "$INSTDIR\Sys\Wii" - SetOverwrite ifnewer - File "..\Data\Sys\Wii\setting-eur.txt" - File "..\Data\Sys\Wii\setting-jpn.txt" - File "..\Data\Sys\Wii\setting-usa.txt" - - ; GC/Wii User settings - SetOutPath "$INSTDIR\User\GC" - SetOutPath "$INSTDIR\User\Wii\shared2\sys" - SetOverwrite ifnewer - File "..\Data\User\Wii\shared2\sys\readme.txt" - File "..\Data\User\Wii\shared2\sys\SYSCONF" - - ; GameConfigs - SetOutPath "$INSTDIR\User\GameConfig" - SetOverwrite ifnewer - File "..\Data\User\GameConfig\*.*" -SectionEnd - -Section -AdditionalIcons - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" "$INSTDIR\uninst.exe" -SectionEnd - -Section -Post - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" -SectionEnd - -; Section descriptions -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "It is recommended that you install all of the included files." -!insertmacro MUI_FUNCTION_DESCRIPTION_END - - -Function un.onUninstSuccess - HideWindow - MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was uninstalled successfully.$\r$\n\ - ATTENTION: You must manually delete$\r$\n$INSTDIR" -FunctionEnd - -Function un.onInit -!insertmacro MUI_UNGETLANGUAGE - MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to remove $(^Name)?" IDYES +2 - Abort -FunctionEnd - -Section Uninstall - SetShellVarContext all - ; Only uninstall what we put there; all $INSTDIR\User is left as is - Delete "$INSTDIR\uninst.exe" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\Plugins\*.dll" - Delete "$INSTDIR\Sys\Wii\setting-usa.txt" - Delete "$INSTDIR\Sys\Wii\setting-jpn.txt" - Delete "$INSTDIR\Sys\Wii\setting-eur.txt" - Delete "$INSTDIR\Sys\GC\font_sjis.bin" - Delete "$INSTDIR\Sys\GC\font_ansi.bin" - Delete "$INSTDIR\Dolphin.exe" - - Delete "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" - Delete "$DESKTOP\Dolphin x64.lnk" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\Dolphin x64.lnk" - - RMDir "$SMPROGRAMS\${PRODUCT_NAME}" - RMDir "$INSTDIR\Sys\GC" - RMDir "$INSTDIR\Sys\Wii" - RMDir "$INSTDIR\Sys" - RMDir "$INSTDIR\Plugins" - RMDir "$INSTDIR" - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" - SetAutoClose true -SectionEnd - -Function LaunchDolphin - ExecShell "" "$DESKTOP\Dolphin x64.lnk" -FunctionEnd +!include Installer.nsi \ No newline at end of file diff --git a/Installer/dxredist/APR2007_xinput_x64.cab b/Installer/dxredist/APR2007_xinput_x64.cab new file mode 100644 index 0000000000..732f8a8f36 Binary files /dev/null and b/Installer/dxredist/APR2007_xinput_x64.cab differ diff --git a/Installer/dxredist/APR2007_xinput_x86.cab b/Installer/dxredist/APR2007_xinput_x86.cab new file mode 100644 index 0000000000..f414d55571 Binary files /dev/null and b/Installer/dxredist/APR2007_xinput_x86.cab differ diff --git a/Installer/dxredist/DSETUP.dll b/Installer/dxredist/DSETUP.dll new file mode 100644 index 0000000000..691025af7e Binary files /dev/null and b/Installer/dxredist/DSETUP.dll differ diff --git a/Installer/dxredist/DXSETUP.exe b/Installer/dxredist/DXSETUP.exe new file mode 100644 index 0000000000..5d062aa978 Binary files /dev/null and b/Installer/dxredist/DXSETUP.exe differ diff --git a/Installer/dxredist/dsetup32.dll b/Installer/dxredist/dsetup32.dll new file mode 100644 index 0000000000..1781afa4b0 Binary files /dev/null and b/Installer/dxredist/dsetup32.dll differ diff --git a/Installer/dxredist/dxupdate.cab b/Installer/dxredist/dxupdate.cab new file mode 100644 index 0000000000..ed3b5b89f5 Binary files /dev/null and b/Installer/dxredist/dxupdate.cab differ diff --git a/Languages/Languages.vcxproj b/Languages/Languages.vcxproj index 1e1ac6d7ba..d18452f8c2 100644 --- a/Languages/Languages.vcxproj +++ b/Languages/Languages.vcxproj @@ -1,6 +1,14 @@  - + + + Debug + Win32 + + + Debug + x64 + Release Win32 @@ -10,104 +18,74 @@ x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C} - Languages + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5} - + Utility - NotSet + true + v120 + + + Utility + true + v120 Utility - NotSet + false + v120 Utility - NotSet - - - Utility - NotSet + false + v120 - + - - - - - + - ..\Binary\$(Platform)\ - ..\Binary\$(Platform)\ - ..\Binary\$(Platform)\ - ..\Binary\$(Platform)\ + $(BinaryOutputDir) - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Languages/po/ar.po b/Languages/po/ar.po index 91df1051ad..47704ddddf 100644 --- a/Languages/po/ar.po +++ b/Languages/po/ar.po @@ -4,13 +4,15 @@ # # Translators: # mansoor, 2011 +# mansoor , 2013 +# moceap , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: glennricster \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 16:15+0000\n" +"Last-Translator: mansoor \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/dolphin-emu/" "language/ar/)\n" "Language: ar\n" @@ -20,13 +22,13 @@ msgstr "" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" -msgstr "(كثير جدا العرض)" +msgstr "(عرض أشياء كثير جدًا)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " لعبة : " @@ -34,7 +36,7 @@ msgstr " لعبة : " msgid "! NOT" msgstr "! لا" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +45,7 @@ msgstr "" "\"%s\" لا وجود لها.\n" " إنشاء جديد بطاقة الذاكرة ?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -58,42 +60,42 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sنسخ%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s موجود بالÙعل، الكتابة Ùوقة؟" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s Ùشل ÙÙŠ أن تكون نقيت. ربما كانت الصورة معطوب." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -102,22 +104,27 @@ msgstr "" "%s Ùشل تحميل ÙÙŠ بطاقة الذاكرة \n" "المل٠ليس كبيرا بما يكÙÙŠ لتكون بطاقة الذاكرة مل٠صحيح (0x%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s Ùشل ÙÙŠ Ùتح" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s مل٠0 بايت" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s مضغوط بالÙعل! لا يستطيع أن يضغط أكثر من ذلك." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s اسم المل٠طويل جدا الحد الاقصى هو 45 " @@ -146,7 +153,7 @@ msgstr "" msgid "&& AND" msgstr "&& Ùˆ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&حول البرنامج " @@ -154,7 +161,7 @@ msgstr "&حول البرنامج " msgid "&Boot from DVD Drive..." msgstr "&التشغيل من محرك الاقراص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&نقاط التوقÙ" @@ -162,7 +169,7 @@ msgstr "&نقاط التوقÙ" msgid "&Browse for ISOs..." msgstr "&استعراض الايزو " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&مدير الاسرار" @@ -170,11 +177,11 @@ msgstr "&مدير الاسرار" msgid "&DSP Settings" msgstr "&إعدادات الصوت" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&مسح ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&حذ٠تحديد ايزو" @@ -186,11 +193,11 @@ msgstr "&محاكاة" msgid "&File" msgstr "&ملÙ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&الاطار المسبق" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&ملء الشاشة" @@ -198,7 +205,7 @@ msgstr "&ملء الشاشة" msgid "&Graphics Settings" msgstr "&إعدادات الرسومات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&مساعدة" @@ -206,7 +213,7 @@ msgstr "&مساعدة" msgid "&Hotkey Settings" msgstr "&إعدادات الاختصارات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -218,11 +225,11 @@ msgstr "&تحميل الحالة" msgid "&Memcard Manager (GC)" msgstr "&بطاقه الذكره جيم كيوب" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&الذاكرة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Ùتح" @@ -230,51 +237,51 @@ msgstr "&Ùتح" msgid "&Options" msgstr "&خيارات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&وقÙØ©" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&ابداء اللعبه" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&خصائص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&وضع للقراءة Ùقط" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&تحديث القائمة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&تسجل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&إعادة اللعبه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&الصوت" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "اغلق اللعبه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&أدوات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Ùديو" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&القائمة" @@ -282,7 +289,7 @@ msgstr "&القائمة" msgid "&Wiimote Settings" msgstr "&إعدادات تحكم الوي" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&معلومات عن اللعبة" @@ -307,9 +314,8 @@ msgid "(off)" msgstr "(ايقاÙ)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^أض٠" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -319,7 +325,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 بت" @@ -335,7 +341,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 بت" @@ -351,7 +357,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 بت" @@ -363,7 +369,7 @@ msgstr "<أدخل اسم هنا>" msgid "" msgstr "<لم يتم العثور على القرارات>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<لا شيء>" @@ -371,7 +377,7 @@ msgstr "<لا شيء>" msgid "" msgstr "<اضغط على Ù…Ùتاح>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<النظام>" @@ -380,12 +386,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "ناÙذة اللعب عبر النت Ù…Ùتوح بالÙعل!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "اللعبة ليست قيد التشغيل حاليا." @@ -396,7 +402,6 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -405,36 +410,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"تنبيه:\n" -"\n" -"سو٠تلعب شبكة حاليا تعمل Ùقط بشكل صحيح عند استخدام الإعدادات التالية:\n" -" - Dual Core [ايقاÙ]\n" -" - Audio Throttle [إيقاÙ]\n" -" - DSP-HLE with \"Null Audio\" or DSP-LLE\n" -" - ضبط عدد تحكم التي سيتم استخدامها وحدة التحكم القياسية\n" -"\n" -"على جميع اللاعبين محاولة استخدام Ù†Ùس الإصدار دولÙين Ùˆ الإعـدادات.\n" -"تعطيل كاÙØ© بطاقات الذاكرة أو إرسالها لجميع اللاعبين قبل بدء.\n" -"لم يتم دعم تنÙيذ ويموت.\n" -"\n" -"يجب عليك إعادة توجيه البرنامج منÙØ° الهوست!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "اسرار" @@ -477,66 +468,66 @@ msgid "" "%s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "" @@ -550,11 +541,11 @@ msgstr "كرت الشاشه :" msgid "Add" msgstr "أضÙ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "إضاÙØ© رمز ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "أض٠باتش" @@ -562,9 +553,9 @@ msgstr "أض٠باتش" msgid "Add new pane" msgstr "إضاÙØ© جزء جديد" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "أضÙ" @@ -606,32 +597,32 @@ msgstr "متقدم" msgid "Advanced Settings" msgstr "إعدادات متقدمة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "جميع ملÙات الجيم كيوب (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Ø­Ùظ جميع الحالات (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "جميع ملÙات ايزو الوي" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "جميع مضغوط GC/Wii ISO files (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "جميع الملÙات (*.*)|*.*" @@ -641,7 +632,7 @@ msgstr "تحليل" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:286 msgid "Angle" -msgstr "" +msgstr "الزاوية" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:376 msgid "Anisotropic Filtering:" @@ -651,19 +642,19 @@ msgstr "تصÙية متباينة الخواص :" msgid "Anti-Aliasing:" msgstr "تنعيم الحواÙ:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "محمل التطبيق هو حجم الخطأ... هل حقا محمل التطبيق؟" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader غير قادر على تحميل مل٠من" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "تطبيق" @@ -677,7 +668,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا حدد إيقاÙ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "العربية" @@ -686,21 +677,25 @@ msgstr "العربية" msgid "Are you sure you want to delete \"%s\"?" msgstr "هل أنت متأكد أنك تريد حذ٠\"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" msgstr "هل أنت متأكد أنك تريد حذ٠هذه الملÙØŸ " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "هل أنت متأكد أنك تريد حذ٠هذه الملÙات؟" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "نسبة العرض :" @@ -709,12 +704,12 @@ msgstr "نسبة العرض :" msgid "At least one pane must remain open." msgstr "يجب أن لا يقل عن جزء واحد لا تزال Ù…Ùتوحة." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "الصوت" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "صوت الخلÙية :" @@ -722,7 +717,7 @@ msgstr "صوت الخلÙية :" msgid "AudioCommon: Error opening AO device.\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "تلقائي" @@ -761,16 +756,16 @@ msgstr "BP تسجل" msgid "Back" msgstr "رجوع" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "إعدادات الخلÙية" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "الخلÙية:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "خلÙية الإدخال" @@ -779,24 +774,24 @@ msgstr "خلÙية الإدخال" msgid "Backward" msgstr "الى الوراء" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "سيء بداية المل٠" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "ميزان لوح" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "بنر" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "تÙاصيل بنر" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "بنر:" @@ -816,7 +811,7 @@ msgstr "إعدادات أساسية" msgid "Bass" msgstr "صوت عميق" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "كتلة الاختباري جدول تخصيص Ùشل" @@ -837,7 +832,7 @@ msgid "Blue Right" msgstr "اليمين أزرق" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "أسÙÙ„" @@ -846,27 +841,27 @@ msgstr "أسÙÙ„" msgid "Bound Controls: %lu" msgstr "يلزم التحكم: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "معطلة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "أستعرض" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "لتصÙØ­ دليل لإضاÙØ©" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "لاستعراض الدليل ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "لاستعراض الدليل الإخراج" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "العازلة :" @@ -876,7 +871,7 @@ msgstr "العازلة :" msgid "Buttons" msgstr "أزرار" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -920,33 +915,33 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "إلغاء" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "لا يمكن Ùتح %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "لا يمكن إلغاء تسجيل الأحداث مع الأحداث المعلقة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -957,7 +952,7 @@ msgstr "" "%s\n" "ليست ذاكرة جيم كيوب مل٠بطاقة صالحة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -969,7 +964,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "الكاتالونية" @@ -977,11 +972,11 @@ msgstr "الكاتالونية" msgid "Center" msgstr "مركز" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "تغيير" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "تغيير &القرص" @@ -989,11 +984,11 @@ msgstr "تغيير &القرص" msgid "Change Disc" msgstr "تغيير القرص" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "تغيير اللعبة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1009,11 +1004,11 @@ msgstr "Changes sign to zFar Parameter (بعد التصحيح)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Changes sign to zNear Parameter (بعد التصحيح)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "تغيير هذه ليس لها أي أثر ÙÙŠ حين أن المحاكي قيد التشغيل!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "شات" @@ -1021,47 +1016,47 @@ msgstr "شات" msgid "Cheat Code" msgstr "اسرار" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "بحث عن اسرار" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "قائمة الاسرار" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "تحقق سلامة التقسيم" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "التحقق من سلامة ..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "الصينية المبسطة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "الصينية التقليدية" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "DVD اختيار الدليل أصل :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Choose a NAND root directory:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "اختيار ايزو الاÙتراضية :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "اختيار دليل لإضاÙØ©" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "اختيار مل٠لÙتح" @@ -1069,15 +1064,15 @@ msgstr "اختيار مل٠لÙتح" msgid "Choose a memory card:" msgstr "اختيار بطاقة الذاكرة :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" "اختيار مل٠لاستخدام راÙعة التطبيقات: (ينطبق على الأقراص مصنوعة من الادله Ùقط)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "اختيار مجلد لاستخراج" @@ -1096,7 +1091,7 @@ msgstr "الكلاسيكية" msgid "Clear" msgstr "أزال" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1106,7 +1101,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "إغلاق" @@ -1115,11 +1110,11 @@ msgstr "إغلاق" msgid "Co&nfigure..." msgstr "الإعدادات العامة" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "رمز المعلومات" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "رمز: " @@ -1131,24 +1126,24 @@ msgstr "الأمر" msgid "Comment" msgstr "التعليق" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "التعليق:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "ضغط ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "اختيار ضغط ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "ضغط ايزو" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "إعدادات" @@ -1162,18 +1157,18 @@ msgstr "إعدادات" msgid "Configure Control" msgstr "إعدادات التحكم" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "تكوين منصات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "إعدادات" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "تأكيد الكتابة Ùوق ملÙ" @@ -1186,17 +1181,16 @@ msgstr "تأكيد على التوقÙ" msgid "Connect" msgstr "اتصال" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "ربط كيبورد يو اس بي" +msgstr "توصيل ميزان لوح" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "ربط كيبورد يو اس بي" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr " توصيل ويموت%i" @@ -1217,7 +1211,7 @@ msgstr "توصيل ويموت 3" msgid "Connect Wiimote 4" msgstr "توصيل ويموت 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "توصيل" @@ -1227,7 +1221,7 @@ msgstr "وحدة التحكم" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:88 msgid "Continuous Scanning" -msgstr "" +msgstr "البحث المستمر" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:33 msgid "Control" @@ -1237,7 +1231,7 @@ msgstr "عصا تحكم" msgid "Convert to GCI" msgstr "GCIتحويل إلى " -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Ùشل نسخ" @@ -1246,21 +1240,16 @@ msgstr "Ùشل نسخ" msgid "Copy to Memcard %c" msgstr "نسخ إلى بطاقة الذاكرة %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "الأساسية" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "لا يمكن إنشاء %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "لا يمكن تهيئة الخلÙية %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1271,24 +1260,16 @@ msgstr "" "backup. يرجى ملاحظة أن جيم كيوب الأصلي وأقراص الوي لا يمكن قراءتها من قبل " "معظم أجهزة الكمبيوتر محركات الأقراص دي ÙÙŠ دي." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "لا يمكن التعر٠مل٠ايزو %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "لا يمكن Ø­Ùظ %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"تعذر تعيين منصات. وغادر لاعب أو لعبة قيد التشغيل حاليا!\n" -"(منصات الإعداد أثناء قيد التشغيل اللعبة غير معتمد حتى الآن)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1302,11 +1283,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "لا يمكن العثور Ùتح الأوامر للتمديد 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1314,17 +1295,17 @@ msgstr "" "لا يمكن التهيئة الأساسية.\n" "تحقق التكوين الخاص بك." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "الاحصاء :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "البلد:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "إنشاء رموز اسرار" @@ -1359,12 +1340,12 @@ msgstr "" msgid "Crossfade" msgstr "الإبهات المتداخل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "هاك مخصص العرض" @@ -1372,11 +1353,11 @@ msgstr "هاك مخصص العرض" msgid "Custom Projection Hack Settings" msgstr "إعدادات هاك مخصص العرض" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "تخصيص بعض المعلمات العرض على إملائي." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "التشيكية" @@ -1388,36 +1369,36 @@ msgstr "D" msgid "D-Pad" msgstr "الاسهم" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "الصوت" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "محرك محاكي الصوت" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE emulation (سريع)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE interpreter (بطيء)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "إعدادات الصوت" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD Root:" @@ -1429,15 +1410,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "بساط الرقص" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "حجم البيانات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "التاريخ :" @@ -1466,29 +1447,28 @@ msgstr "التصحيح" msgid "Decimal" msgstr "عشري" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ضغط ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "اختيار إلغاء ضغط ايزو " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "ÙÙƒ ايزو" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "تحديث القائمة" +msgstr "تقليل حدود الإطار" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "الاÙتراضي" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ايزو الاÙتراضية :" @@ -1530,8 +1510,8 @@ msgstr "" msgid "Device" msgstr "أداة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "إعدادات الجهاز" @@ -1539,15 +1519,12 @@ msgstr "إعدادات الجهاز" msgid "Dial" msgstr "الاتصال الهاتÙÙŠ" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1599,18 +1576,14 @@ msgstr "" "إذا لم تكن متأكدا اترك هذا غير محددة." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"تخطي الوجهة ÙÙŠ كثير من الألعاب لمختل٠التأثيرات الرسومية.\n" -"\n" -"إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "القرص" @@ -1637,24 +1610,59 @@ msgstr "" msgid "Divide" msgstr "انقسام" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "هل تريد اغلق اللعبة الحالية؟" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "دولÙين" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s إعدادات الرسومات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "موقع دولÙين" @@ -1670,12 +1678,12 @@ msgstr "إعدادات تحكم الوي" msgid "Dolphin FIFO" msgstr "دولÙين" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "إعدادات تحكم الجيم كيوب" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "" @@ -1683,37 +1691,34 @@ msgstr "" msgid "Dolphin Wiimote Configuration" msgstr "إعدادات تحكم الوي" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "دولÙين على مدونة قوقل" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" "لايمكن العثور على اي لعبه جيم كيوب او وي . دبل كيك هنا لاستعراض الملÙات " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" "تم تعيين دولÙين حاليا إخÙاء جميع الألعاب. دبل كليك هنا لإظهار جميع الألعاب..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." -msgstr "" +msgstr "دولÙين غير قادر على إكمال الإجراء المطلوب ." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"تمكين الوصول السريع القرص.اللازمة لعدد قليل من الألعاب. (ON = Fast, OFF = " -"Compatible)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1733,11 +1738,11 @@ msgstr "%lu وأضا٠%lu تم تحميل الاسرار " msgid "Drums" msgstr "الطبول" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "وهمي " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Dump Audio" @@ -1783,9 +1788,9 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "الهولندية" @@ -1806,7 +1811,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "أوروبا" @@ -1814,7 +1819,7 @@ msgstr "أوروبا" msgid "Early Memory Updates" msgstr "بداية تحديث الذاكرة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "تحرير" @@ -1822,7 +1827,7 @@ msgstr "تحرير" msgid "Edit ActionReplay Code" msgstr "تعديل رمز ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "تعديل الاعدادات" @@ -1830,12 +1835,12 @@ msgstr "تعديل الاعدادات" msgid "Edit Patch" msgstr "تعديل الباتش" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "تعديل المنظور الحالي" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "تحرير" @@ -1847,7 +1852,7 @@ msgstr "تأثير" msgid "Embedded Frame Buffer" msgstr "عازل الإطار المضمن " -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "المحاكي قيد التشغيل بالÙعل" @@ -1880,7 +1885,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "محاكاة ويموت" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "حالة المحاكاه: " @@ -1905,15 +1910,15 @@ msgstr "" "يتطلب ملء الشاشة للعمل.\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "تمكين منع الدمج" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "تمكين تنظيم حساب الإطار" @@ -1925,7 +1930,7 @@ msgstr "تمكين التخزين المؤقت" msgid "Enable Cheats" msgstr "تمكين الاسرار " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Enable Dual Core" @@ -1933,7 +1938,7 @@ msgstr "Enable Dual Core" msgid "Enable Dual Core (speedup)" msgstr "Enable Dual Core (لزيادة السرعة)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Enable Idle Skipping" @@ -1941,7 +1946,7 @@ msgstr "Enable Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Enable Idle Skipping (لزيادة السرعة)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "MMU تمكين" @@ -1949,15 +1954,15 @@ msgstr "MMU تمكين" msgid "Enable Progressive Scan" msgstr "تمكين المسح التقدمي" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "تمكين شاشة التوقÙ" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "" +msgstr "تمكين بيانات مكبر صوت" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "تمكين شاشة عريضة" @@ -1979,7 +1984,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا حدد X1." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2015,31 +2020,25 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "تمكين هذا لتسريع أسطورة زيلدا : الشÙÙ‚ الاميرة. لتعطيل أي لعبة أخرى." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "يمكن توقعات مخصص هاك" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -2054,7 +2053,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذه غير محددة." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2074,9 +2073,9 @@ msgstr "" msgid "End" msgstr "نهاية" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "الإنجليزية" @@ -2099,21 +2098,20 @@ msgstr "دخول %d/%d" msgid "Entry 1/%d" msgstr "دخول 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "المساواة" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "خطأ" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "خطأ ÙÙŠ تحميل اللغة المختارة. يتراجع إلى النظام الاÙتراضية." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2138,7 +2136,6 @@ msgid "Euphoria" msgstr "" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2147,16 +2144,20 @@ msgstr "" msgid "Execute" msgstr "تنÙيذ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "خروج" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "تصدير جميع الحÙظ الوي" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Ùشل تصدير" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Ùشل تصدير" @@ -2164,7 +2165,7 @@ msgstr "Ùشل تصدير" msgid "Export Recording" msgstr "تصدير تسجيل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "تصدير تسجيل" @@ -2172,7 +2173,7 @@ msgstr "تصدير تسجيل" msgid "Export Save" msgstr "تصدير Ø­Ùظ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "تصدير Ø­Ùظ الوي" @@ -2180,15 +2181,15 @@ msgstr "تصدير Ø­Ùظ الوي" msgid "Export all saves" msgstr "تصدير جميع الحÙظ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Ùشل تصدير، حاول مرة أخرى؟" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Ùشل تصدير" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "تصدير Ø­Ùظ باسم" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "تمديد" @@ -2204,44 +2205,44 @@ msgstr "معلمة إضاÙية" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "استخراج كاÙØ© الملÙات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "استخراج Apploader" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "استخراج دليل" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "استخراج الملÙات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "استخراج التقسيم" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "استخراج %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "استخراج كاÙØ© الملÙات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "استخراج دليل" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "استخراج" @@ -2253,15 +2254,15 @@ msgstr "بايت" msgid "FIFO Player" msgstr "لاعبين" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "Ùرنسا" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "الحجم :" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "خطأ الاتصال" @@ -2269,11 +2270,15 @@ msgstr "خطأ الاتصال" msgid "Failed to download codes." msgstr "اللعبه لاتوجد ÙÙŠ قاعده البيانات." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Ùشل ÙÙŠ الاستخراج إلى %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2301,20 +2306,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Ùشل ÙÙŠ قراءة banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2325,73 +2330,78 @@ msgstr "" "Memcard may be truncated\n" "FilePosition:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Ùشل ÙÙŠ قراءة البيانات من مل٠%d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Ùشل ÙÙŠ قراءة معر٠Ùريد من صورة القرص" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Ùشل لكتابة bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Ùشل لكتابة عنوان لمل٠%d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "الÙارسية" @@ -2403,17 +2413,17 @@ msgstr "سريع" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr " لا يعمل ÙÙŠ كل لعبة MMU إصدار سريع من." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "لاعبين" @@ -2437,7 +2447,7 @@ msgstr "" "قد لا يمكن Ùتح ملÙ\n" "أو لا يكون امتداد صالح" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2450,20 +2460,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "لم يتم التعر٠على المل٠كمل٠بطاقة ذاكرة" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "مل٠غير مضغوط " -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "الملÙات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "نوع المل٠غير معروÙ! لن تÙتح!" @@ -2497,7 +2507,7 @@ msgstr "Ùرض وحدة التحكم على النظام الياباني" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:407 msgid "Force Texture Filtering" -msgstr "" +msgstr "نتقية الرسوميات بالقوة" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:91 msgid "" @@ -2523,7 +2533,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2533,7 +2543,7 @@ msgstr "" "ترك دون ,المحاكي يكون اÙتراضي على النظام الانجليزي ويتيح هذا الاعداد تلقائيا " "عند اللعب اليابانية ." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2552,6 +2562,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2593,9 +2608,9 @@ msgstr "إطارات لتسجيل" msgid "Free Look" msgstr "تحكم بكاميرا اللعبة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "الÙرنسية" @@ -2608,7 +2623,7 @@ msgstr "الحنق" msgid "From" msgstr "من" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "شاشه كامله" @@ -2620,35 +2635,35 @@ msgstr "دقة العرض :" msgid "GCI File(*.gci)" msgstr "GCI File(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "تحكم الجيم كيوب" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:667 msgid "GX_CMD_INVL_VC" -msgstr "" +msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "معر٠اللعبة:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "لعبة تستخدم بالÙعل!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "اللعبة ليست على التوالي!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" -msgstr "" +msgstr "لم يتم العثور على اللعبة !" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "إعدادات معينه للعبه" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "إعدادات اللعبة" @@ -2665,20 +2680,20 @@ msgid "Gamecube &Pad Settings" msgstr "إعدادات تحكم جيم كيوب" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "بطاقه ذاكره الجيم كيوب (*.raw,*.gcp) " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "إعدادات تحكم جيم كيوب" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "تحميل اسرار" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2699,26 +2714,26 @@ msgstr "عام" msgid "General Settings" msgstr "الإعدادات العامة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "الألمانية" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "الرسومات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "إعدادات الرسومات" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "أكبر من" @@ -2738,7 +2753,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا، اترك هذا التحقق." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "اليونانية" @@ -2762,11 +2777,11 @@ msgstr "غيتار" msgid "Hacks" msgstr "هاك" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "عنوان اختباري Ùشل" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "العبرية" @@ -2778,7 +2793,7 @@ msgstr "ارتÙاع" msgid "Help" msgstr "مساعدة" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2790,7 +2805,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2843,7 +2858,7 @@ msgstr "إعدادات الاختصارات" msgid "Hotkeys" msgstr "الاختصارات" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "الهنغارية" @@ -2851,29 +2866,29 @@ msgstr "الهنغارية" msgid "Hybrid Wiimote" msgstr "ويموت هجين" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL إعدادات" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2885,15 +2900,15 @@ msgstr "IR المؤشر" msgid "IR Sensitivity:" msgstr "IR حساسية:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "تÙاصيل ايزو" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "مجلد الايزو" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "إيطاليا" @@ -2901,7 +2916,7 @@ msgstr "إيطاليا" msgid "Icon" msgstr " أيقونة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2945,9 +2960,13 @@ msgstr "" msgid "Import Save" msgstr "Ø­Ùظ استيراد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Ùشل الاستيراد، حاول مرة أخرى؟" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr " استيراد Ø­Ùظ الوي" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Ùشل الاستيراد" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -2965,21 +2984,16 @@ msgid "" "but does not have a correct header" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "تتعطل ÙÙŠ اللعبة" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "ÙÙŠ اللعبة" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "حد الإطار:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "معلومات" @@ -2999,7 +3013,7 @@ msgstr "إدراج" msgid "Insert Encrypted or Decrypted code here..." msgstr "إدراج رمز المشÙرة أو ÙÙƒ Ø´Ùرة هنا" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "SD Card ادرج " @@ -3007,36 +3021,37 @@ msgstr "SD Card ادرج " msgid "Insert name here.." msgstr "أدخل اسم هنا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "wad تثبيت" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "تثبيت إلى قائمة الوي" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "wad تثبيت" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "تحقق من سلامة الخطأ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "التحقق من سلامة الانتهاء" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "انتهاء التدقيق من سلامة لم يتم العثور على أخطاء" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3047,7 +3062,7 @@ msgstr "" msgid "Interface" msgstr "الواجهة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "واجهة الإعدادات" @@ -3072,20 +3087,20 @@ msgstr "" msgid "Internal Resolution:" msgstr "الدقة الداخلية :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" -msgstr "" +msgstr " (بطيئة جدا) Interpreter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "تتعطل ÙÙŠ المقدمة" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "قيمة غير صالحة!" @@ -3093,16 +3108,16 @@ msgstr "قيمة غير صالحة!" msgid "Invalid bat.map or dir entry" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "غير صالح نوع الحدث %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "مل٠غير صالح" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3110,7 +3125,7 @@ msgid "" " You may need to redump this game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "تسجيل المل٠غير صالح" @@ -3126,34 +3141,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "غير صالح حالة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "الإيطالية" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "اليابان" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "اليابانية" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "كوريا" @@ -3175,8 +3192,9 @@ msgstr "إبقاء الناÙذة على أعلى" msgid "Key" msgstr "المÙتاح" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "الكورية" @@ -3198,12 +3216,12 @@ msgstr "L-Analog" msgid "Language:" msgstr "اللغة :" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3237,7 +3255,7 @@ msgid "" "Middle-click to clear." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "أقل من" @@ -3254,58 +3272,48 @@ msgid "Load Custom Textures" msgstr "تحميل القوام المخصص" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&تحميل الحالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "1 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "2 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "3 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "4 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "5 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "6 تحميل حالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "7 تحميل حالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "8 تحميل حالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "1 تحميل حالة " #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "1 تحميل حالة " +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3336,19 +3344,18 @@ msgid "Load State Slot 8" msgstr "8 تحميل حالة" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "1 تحميل حالة " +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "تحميل حالة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "تحميل قائمة نظام الوي" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "تحميل قائمة نظام الوي %d%c" @@ -3367,10 +3374,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "قيمة تحميل إعداد مسبق من هاك نماذج المتوÙرة." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "المحلية" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "سجل" @@ -3403,12 +3406,12 @@ msgstr "" msgid "Logger Outputs" msgstr "مختلÙان النواتج" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "تسجيل" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "إنقطع الإتصال الملقم!" @@ -3416,14 +3419,14 @@ msgstr "إنقطع الإتصال الملقم!" msgid "M Button" msgstr "M Button" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU سرعة هاك" @@ -3437,11 +3440,11 @@ msgstr "" msgid "Main Stick" msgstr "العصا الأيسر" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "معر٠المنتج :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "المنتج :" @@ -3472,7 +3475,7 @@ msgid "Memory Byte" msgstr "ذاكرة بايت" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "بطاقة الذاكرة" @@ -3482,7 +3485,7 @@ msgid "" "could mangle stuff!" msgstr "إدارة بطاقة الذاكرة تنبية قم بعمل نسخة احتياطية قبل الاستخدام" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3499,7 +3502,7 @@ msgstr "" "%s\n" "هل ترغب ÙÙŠ نسخ المل٠القديم إلى هذا الموقع الجديد?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "حجم بطاقة الذاكرة لا تتطابق مع حجم المل٠" @@ -3507,7 +3510,7 @@ msgstr "حجم بطاقة الذاكرة لا تتطابق مع حجم المل msgid "Menu" msgstr "القائمة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "الميكروÙون" @@ -3520,7 +3523,7 @@ msgstr "منخÙض" msgid "Misc" msgstr "متÙرقات" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "إعدادات منوعة" @@ -3545,11 +3548,11 @@ msgstr "" msgid "Monospaced font" msgstr "الخط أحادي المساÙØ©" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "موشن بلس" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "محرك" @@ -3668,15 +3671,15 @@ msgstr "التبويب" msgid "NP Up" msgstr "Ùوق" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "الاسم :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "الاسم :" @@ -3686,7 +3689,7 @@ msgstr "الاسم :" msgid "Native GCI files(*.gci)" msgstr "Native GCI files(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "بحث جديد" @@ -3695,7 +3698,7 @@ msgstr "بحث جديد" msgid "Next Page" msgstr "الصÙحة التالية" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "البحث التالي" @@ -3703,19 +3706,19 @@ msgstr "البحث التالي" msgid "Nickname :" msgstr "اسمك :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "لا يوجد بلد (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "لم يتم العثور على الايزو " #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "لا يوجد مخرجات صوتية" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "لم يتم العثور على مل٠البنر %s" @@ -3735,48 +3738,49 @@ msgstr "لا يوجد مل٠تحميل" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:426 msgid "No free dir index entries" -msgstr "" +msgstr "لا يوجد مدخلات مجلدات Ùهرسية حرة" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:907 msgid "No recorded file" msgstr "لا مل٠مسجل" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "لا Ø­Ùظ المجلد نتيجة البحث عن العنوان %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "لا شيء" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "النرويجية" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "لا يساوي" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "غير مجموعة" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "غير متصل" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "ملاحظات" @@ -3797,7 +3801,7 @@ msgstr "إشعار" msgid "Num Lock" msgstr "ارقام القÙÙ„" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "عدد من رموز :" @@ -3818,7 +3822,7 @@ msgstr "الهدÙ" msgid "Object Range" msgstr "نطاق الهدÙ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "إيقاÙ" @@ -3830,25 +3834,29 @@ msgstr "تعويض :" msgid "On-Screen Display Messages" msgstr "عرض الرسائل التي تظهر على الشاشة" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "تسجيل اون لاين" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Ùقط %d كتل متاحة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Ùتح" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Ùتح المجلد المتضمن" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "اÙتح مجلد Ø­Ùظ الوي" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Ùتح الملÙ" @@ -3868,13 +3876,19 @@ msgstr "OpenAL : لا يمكن Ùتح الجهاز %s" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:502 msgid "OpenCL Texture Decoder" -msgstr "" +msgstr "Ù…ÙÙƒ رسوميات OpenCL" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:503 msgid "OpenMP Texture Decoder" +msgstr "Ù…ÙÙƒ رسوميات OpenMP" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "خيارات" @@ -3884,22 +3898,18 @@ msgid "Orange" msgstr "البرتقالي" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"ترتيب الملÙات ÙÙŠ دليل الملÙات لا تتطابق مع ترتيب كتلة\n" -"انقر بالزر الأيمن للتصدير كاÙØ© Ø­Ùظ,\n" -"واستيراد وحÙظ لبطاقة ذاكرة جديدة\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "أخرى" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3911,15 +3921,15 @@ msgstr "" msgid "Output" msgstr "الإخراج" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "تشغيل التسجيل" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "تحكم" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "تحكم" @@ -3943,17 +3953,17 @@ msgstr "الÙقرة" msgid "Parameters" msgstr "معلمات" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "قسم %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "باتش" @@ -3961,8 +3971,8 @@ msgstr "باتش" msgid "Paths" msgstr "مسارات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "وقÙØ©" @@ -3975,7 +3985,7 @@ msgstr "توق٠ÙÙŠ نهاية الÙيلم" msgid "Per-Pixel Lighting" msgstr "لكل بكسل إضاءة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "مثالية" @@ -3985,9 +3995,9 @@ msgid "Perspective %d" msgstr "مشهد %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "بدأ اللعبه" @@ -3999,7 +4009,7 @@ msgstr "تشغيل التسجيل" msgid "Play/Pause" msgstr "بدأ/ايقاÙ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "قابلة للتشغيل" @@ -4007,11 +4017,11 @@ msgstr "قابلة للتشغيل" msgid "Playback Options" msgstr "خيارات التشغيل" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "لاعبين" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "يرجى تأكيد" @@ -4023,23 +4033,23 @@ msgstr "الرجاء إنشاء منظور قبل الحÙظ" msgid "Plus-Minus" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "البولندية" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "تحكم 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "تحكم 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "تحكم 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "تحكم 4" @@ -4048,11 +4058,11 @@ msgstr "تحكم 4" msgid "Port :" msgstr "المنÙØ° :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "البرتغالية" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "البرتغالية البرازيلية" @@ -4060,17 +4070,17 @@ msgstr "البرتغالية البرازيلية" msgid "Post-Processing Effect:" msgstr "بعد معالجة تأثير:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -4087,7 +4097,7 @@ msgstr "الصÙحة السابقة" msgid "Previous Page" msgstr "الصÙحة السابقة" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "القيمة السابقة" @@ -4103,7 +4113,7 @@ msgstr "المل٠الشخصي" msgid "Properties" msgstr "خصائص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "إزالة التخزين المؤقت" @@ -4112,7 +4122,7 @@ msgid "Question" msgstr "السؤال" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "خروج" @@ -4134,7 +4144,7 @@ msgstr "R-Analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "روسيا" @@ -4173,6 +4183,10 @@ msgstr "ويموت حقيقي " msgid "Record" msgstr "تسجيل" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "مدخلات السجل" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "تسجيل معلومات" @@ -4208,7 +4222,7 @@ msgstr "" "إذا لم تكن متأكدا حدد لا شيء." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "تحديث" @@ -4217,14 +4231,14 @@ msgstr "تحديث" msgid "Refresh List" msgstr "تحديث قائمة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "تحديث القائمة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "إزالة" @@ -4247,7 +4261,7 @@ msgstr "تقدم إلى الشاشة الرئيسية" msgid "Reset" msgstr "إعادة ضبط" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "النتائج" @@ -4255,9 +4269,9 @@ msgstr "النتائج" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "الاصدار:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4268,18 +4282,17 @@ msgstr "اليمين" msgid "Right Stick" msgstr "العصا الايمن" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "هزاز" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "الروسية" @@ -4292,7 +4305,7 @@ msgid "Safe" msgstr "آمنة" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Ø­Ùظ" @@ -4302,23 +4315,20 @@ msgid "Save GCI as..." msgstr "GCI Ø­Ùظ باسم " #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Ø­Ùظ الحالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Ø­Ùظ الحالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "1 Ø­Ùظ حالة" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "1 Ø­Ùظ حالة" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4349,32 +4359,31 @@ msgid "Save State Slot 8" msgstr "8 Ø­Ùظ حالة" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "1 Ø­Ùظ حالة" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Ø­Ùظ حالة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Ø­Ùظ باسم" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Ø­Ùظ مضغوط GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Ø­Ùظ المنظور الحالي" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Ø­Ùظ الضغط GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4383,20 +4392,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "EFB Copia a escala" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Ùحص %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "بحث ايزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Ùحص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "التقاط صوره" @@ -4408,11 +4417,11 @@ msgstr "انتقل تأمين" msgid "Search" msgstr "بحث" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "بحث Ùلتر" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "البحث ÙÙŠ المجلدات الÙرعية" @@ -4435,12 +4444,12 @@ msgstr "" msgid "Select" msgstr "حدد" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "اختر مل٠تسجيل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "لتثبيت wad حدد ملÙ" @@ -4462,19 +4471,19 @@ msgstr "اختر Ø­Ùظ مل٠للاستيراد" msgid "Select floating windows" msgstr "اختر النواÙØ° العائمة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "حدد المل٠لتحميل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "حدد Ø­Ùظ الملÙ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "حدد حالة التحميل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "حدد حالة الحÙظ" @@ -4496,7 +4505,7 @@ msgstr "" "\n" "إذاغير متأكد حدد التلقائي." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "اختيار المل٠التحكم الشخصي غير موجود " @@ -4520,27 +4529,28 @@ msgstr "" "إذا لم تكن متأكدا، استخدم دقة سطح المكتب.\n" "إذا لم تكن متأكدا من ذلك ØŒ استخدم أعلى دقة." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "إرسال" @@ -4552,16 +4562,16 @@ msgstr "موضع الاستشعار:" msgid "Separator" msgstr "الÙاصل" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "الصربية" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "المنÙØ° التسلسلي 1 -- وهذا هو المنÙØ° الذي الأجهزة مثل استخدام محول شبكة" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "تعيين كاÙتراضي ايزو" @@ -4570,7 +4580,7 @@ msgstr "تعيين كاÙتراضي ايزو" msgid "Set as default Memcard %c" msgstr "تعيين كاÙتراضي بطاقة الذاكرة %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4581,19 +4591,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "إعدادات" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: الإعداد غير قادر على إيجاد ملÙ" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "هزة" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "الاسم المختصر :" @@ -4601,23 +4611,27 @@ msgstr "الاسم المختصر :" msgid "Shoulder Buttons" msgstr "أزرار الكتÙ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "اظهار &لوحة المراقبة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "اظهار السجل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "عرض شريط الحالة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "أظهر شريط الأدوات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "المظهر الاÙتراضي" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "اظهر محرك الاقراص" @@ -4629,11 +4643,11 @@ msgstr "إظهار نسخة الصادرات للمناطق" msgid "Show FPS" msgstr "أظهر عدد الاطارات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Ùرنسا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "جيم كيوب" @@ -4641,35 +4655,35 @@ msgstr "جيم كيوب" msgid "Show Input Display" msgstr "إظهار مدخلات العرض" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "إيطاليا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "اليابان" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "كوريا" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "أظهر اللغة :" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "عرض سجل الاعدادات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "اوروبا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "عرض الاجهزه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "إظهار المناطق" @@ -4677,27 +4691,27 @@ msgstr "إظهار المناطق" msgid "Show Statistics" msgstr "إظهار الإحصاءات" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "تايوان" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "امريكا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Wad اظهار" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "الوي" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "ظهور رسالة قبل وق٠اللعبة." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4715,7 +4729,7 @@ msgstr "إظهار اول كتلة" msgid "Show lag counter" msgstr "إظهار عداد التأخر" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4749,7 +4763,7 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "غير معروÙ" @@ -4763,23 +4777,24 @@ msgstr "" "\n" "إذا لم تكن متأكدا ترك هذا غير محددة." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "ويموت جانبي" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "الصينية المبسطة" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "الحجم" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "تخطي البيوس" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4803,17 +4818,17 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Ùتحة %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "A خانة " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "B خانة " @@ -4821,7 +4836,7 @@ msgstr "B خانة " msgid "Snapshot" msgstr "لقطة" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Software Renderer" @@ -4836,27 +4851,27 @@ msgstr "" "انها Ù…Ùيدة Ùقط لأغراض التصحيح.\n" "هل حقا تريد تمكين تقديم البرامج؟ إذا لم تكن متأكدا، اختر 'لا'.." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "إعدادات الصوت" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "غير صالحة %s خلÙية الصوت." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Ùشل إنشاء المخزن المؤقت الصوت : %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "مجال" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "الأسبانية" @@ -4884,37 +4899,29 @@ msgstr "" "\n" "إذا لم تكن متأكدا حدد 528*640 ." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "تسريع معدل نقل القرص" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "مربع العصا" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "وحدة تحكم القياسية" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "بدء &اللعب عبر الشبكة" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "بدء التسجيل" @@ -4922,7 +4929,7 @@ msgstr "بدء التسجيل" msgid "Start Recording" msgstr "بدء التسجيل" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "الحالة" @@ -4930,7 +4937,7 @@ msgstr "الحالة" msgid "State Saves" msgstr "Ø­Ùظ الحالة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "عجلة القيادة" @@ -4939,7 +4946,7 @@ msgid "Stick" msgstr "عصا" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "اغلق اللعبه" @@ -4970,39 +4977,40 @@ msgstr "داعب الأ وتار" msgid "Subtract" msgstr "طرح" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "بنجاح تصدير المل٠إلى %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "استيرادها بنجاح Ø­Ùظ الملÙات" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "هز" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "نظام اللغة :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "تايوان" @@ -5027,13 +5035,13 @@ msgstr "الجدول الأيسر" msgid "Table Right" msgstr "الجدول الأيمن" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "اخذ لقطه من الشاشه" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5043,7 +5051,7 @@ msgstr "اختبار" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:445 msgid "Texture" -msgstr "" +msgstr "الرسوميات" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:462 msgid "Texture Cache" @@ -5053,11 +5061,11 @@ msgstr "Texture Cache" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr " بنجاح wad وقد تم تركيب" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "عنوان غير صالح" @@ -5065,13 +5073,13 @@ msgstr "عنوان غير صالح" msgid "The checksum was successfully fixed" msgstr "تم إصلاح بنجاح الاختباري" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "الدليل المختار هو بالÙعل ÙÙŠ قائمة" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5093,7 +5101,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "المل٠%s بالÙعل Ù…Ùتوح، لن المل٠غير عنوان مكتوب." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "لا وجود له (%s) المل٠الذي حددته" @@ -5126,61 +5134,61 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Ø­Ùظ تحاول نسخة له حجم مل٠غير صالح" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" "لا يتم اعتماد اللغة المحددة من قبل النظام. يتراجع إلى النظام الاÙتراضية." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "الملقم والعميل إصدارات لعب نت تتعارض" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "الملقم ممتلئ" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "أجاب الخادم : اللعبة قيد التشغيل حاليا" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "بعث الملقم رسالة خطأ غير معروÙ" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "قيمة غير صالحة" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "ثيم:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "تجاوز هذه الإعدادات إعدادات دولÙين الأساسية ." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "هذه المحاكاة إعادة العمل لا تدعم تعديل الرموز التي اعادتها العمل Ù†Ùسه." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "هذا يمكن أن يسبب بطء ÙÙŠ القائمة لوى وبعض الألعاب." @@ -5196,18 +5204,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"لجعلها Ùعالة Audio Throttle يجب عليك تعطيل NTSC:60, PAL:50 إذا قمت بتعيين " -"حد الإطار أعلى من السرعة لعبة الاÙتراضية " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5215,7 +5220,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "هذا تسمح لك التعديل اليدوي رسائل كتبها هذا المؤل٠مل٠التكوين" @@ -5224,12 +5229,12 @@ msgstr "هذا تسمح لك التعديل اليدوي رسائل كتبها msgid "Threshold" msgstr "بداية" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "إمالة" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "العنوان" @@ -5243,21 +5248,18 @@ msgid "Toggle All Log Types" msgstr "تبديل جميع أنواع السجل" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "نسبة العرض :" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Copies" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "تبديل جميع أنواع السجل" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "اللعب بالشاشة كاملة" @@ -5267,15 +5269,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "أعلى" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "الصينية التقليدية" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "حاول تحميل نوع مل٠غير معروÙ." @@ -5293,7 +5296,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "التركية" @@ -5309,12 +5312,12 @@ msgstr "نوع" msgid "UDP Port:" msgstr "UDP منÙØ° :" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "غير معروÙ" @@ -5323,7 +5326,7 @@ msgstr "غير معروÙ" msgid "UNKNOWN_%02X" msgstr "غير معروÙ_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "امريكا" @@ -5336,9 +5339,9 @@ msgstr "" "الدخول غير معدل." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5346,7 +5349,7 @@ msgstr "" "decrypted code. Make sure you typed it correctly.\n" "هل ترغب ÙÙŠ تجاهل هذا الخط ØŒ ومواصلة تحليل?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "غير محدود %i" @@ -5356,19 +5359,18 @@ msgid "Undo Load State" msgstr "التراجع عن تحميل الحالة" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "التراجع عن تحميل الحالة" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "غير معروÙ" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "" @@ -5383,12 +5385,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "تلقى رسالة مجهولة مع معر٠: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5398,16 +5400,16 @@ msgstr "" msgid "Up" msgstr "أعلى" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "التحديث" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "ويموت مستقيم" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "(PAL60) استخدم وضع " @@ -5415,7 +5417,7 @@ msgstr "(PAL60) استخدم وضع " msgid "Use Fullscreen" msgstr "استخدام شاشة كاملة" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "استخدام الهيكس" @@ -5444,6 +5446,15 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5466,12 +5477,11 @@ msgstr "Ùائدة" msgid "V-Sync" msgstr "تحديد أقصى معدل الاطار" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU سرعة هاك" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "القيمة" @@ -5479,7 +5489,7 @@ msgstr "القيمة" msgid "Value:" msgstr "القيمة:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "القيمة:" @@ -5491,7 +5501,7 @@ msgstr "" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Ùديو" @@ -5499,17 +5509,17 @@ msgstr "Ùديو" msgid "Virtual" msgstr "الظاهري" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "الصوت" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "خطأ ÙÙŠ إنشاء wad: Ùشل التثبيت %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "خطأ ÙÙŠ إنشاء wad: Ùشل التثبيت %s" @@ -5531,19 +5541,19 @@ msgstr "" msgid "Warning" msgstr "التنبيه" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "تحذير -- ايزو ابتداء من الخطأ وضع وحدة التحكم!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5567,7 +5577,7 @@ msgstr "" "ولها Ù†Ùس اسم المل٠على بطاقة ذاكرة الخاصة بك\n" "تستمر?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5575,7 +5585,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5583,7 +5593,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5623,19 +5633,15 @@ msgstr "عرض" msgid "Wii" msgstr "الوي" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "جهاز الوي" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND Root:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "استيراد Ø­Ùظ الوي" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "ملÙات Ø­Ùظ الوي (*.bin)|*.bin" @@ -5644,16 +5650,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: لا يمكن القراءة من الملÙ" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "تحكم الوي" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "تحكم الوي" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "ويموت %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "ويموت متصل" @@ -5661,7 +5673,7 @@ msgstr "ويموت متصل" msgid "Wiimote Motor" msgstr "محرك ويموت" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "إعدادات ويموت" @@ -5685,14 +5697,14 @@ msgstr "نواÙØ° اليمين" msgid "Word Wrap" msgstr "كلمة ختامية" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "العمل" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5712,21 +5724,36 @@ msgstr "الكتابة على الملÙ" msgid "Write to Window" msgstr "الكتابة إلى ناÙذة" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Ùشل إنشاء المخزن المؤقت الصوت : %s" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5756,11 +5783,11 @@ msgstr "لا يمكنك إغلاق أجزاء الصÙحات التي Ùيها." msgid "You must choose a game!!" msgstr "عليك اختيار لعبة!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "يجب إدخال اسم!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "يجب إدخال صالح العشري، أو الست عشرية قيمة ثماني." @@ -5768,7 +5795,7 @@ msgstr "يجب إدخال صالح العشري، أو الست عشرية قي msgid "You must enter a valid profile name." msgstr "يجب إدخال اسم المل٠صالح." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "يجب إعادة تشغيل دولÙين من أجل التغيير ناÙØ° المÙعول." @@ -5779,7 +5806,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5796,15 +5823,15 @@ msgstr "" "يجب أن يكون 0x%04x (but is 0x%04llx)\n" "هل تريد إنشاء واحدة جديدة?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP هاك" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "" @@ -5862,20 +5889,24 @@ msgstr "" "\n" "إذا لم تكن متأكدا اترك هذا غير محددة." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: قراءة Ø´Ùرة تشغيل من %x. الرجاء التقرير." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute returned -1 on application run!" @@ -5891,29 +5922,11 @@ msgstr "zNear تصحيح: " msgid "| OR" msgstr "أو" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Accurate VBeam emulation" +#~ msgid "Could not create %s" +#~ msgstr "لا يمكن إنشاء %s" -#~ msgid "Enable Hotkeys" -#~ msgstr "تمكين الاختصارات" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Failed to Listen!!" -#~ msgstr "لم اسمع!" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Ùشل تحميل hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic اعدادات" - -#~ msgid "Last Overwritten State" -#~ msgstr "الكتابة Ùوق آخر حالة" - -#~ msgid "Last Saved State" -#~ msgstr "آخر حالة محÙوظة" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "إعادة تحميل حالة ويموت" - -#~ msgid "Set" -#~ msgstr "ضبط" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: قراءة Ø´Ùرة تشغيل من %x. الرجاء التقرير." diff --git a/Languages/po/ca.po b/Languages/po/ca.po index b094d1d84c..da030e908d 100644 --- a/Languages/po/ca.po +++ b/Languages/po/ca.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: Puniasterus \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/dolphin-emu/" "language/ca/)\n" "Language: ca\n" @@ -22,13 +22,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(massa per ensenyar)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Joc:" @@ -36,7 +36,7 @@ msgstr "Joc:" msgid "! NOT" msgstr "! NO" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -45,7 +45,7 @@ msgstr "" "\"%s \" no existeix.\n" " Crear una nova targeta de memòria de 16MB?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" no és un fitxer GCM/ISO valid, o no és una ISO GC/Wii." @@ -60,28 +60,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sCopia%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" -msgstr "" +msgstr "mostres %d" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" -msgstr "" +msgstr "mostres %d (nivell de qualitat %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s ja existeix, vols sobreescriure?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s no s'ha pogut esborrar. Probablement, la imatge està danyada." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -90,7 +90,7 @@ msgstr "" "%s ha fallat la càrrega com a targeta de memòria\n" "La mida del fitxer no és vàlida (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -99,7 +99,7 @@ msgstr "" "%s ha fallat la càrrega com a targeta de memòria\n" "La mida de la targeta no és vàlida (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -109,22 +109,27 @@ msgstr "" "El fitxer no és suficientment gran per ser una targeta de memòria vàlida (0x" "%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s no s'ha pogut obrir" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s és un arxiu de 0 bytes" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s ja està comprimit! No es pot comprimir encara més." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -155,7 +160,7 @@ msgstr "%u Blocs lliures; %u entrades de dir. lliures" msgid "&& AND" msgstr "&& I" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Sobre..." @@ -163,7 +168,7 @@ msgstr "&Sobre..." msgid "&Boot from DVD Drive..." msgstr "&Arrencar des de la unitat de DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Punts d'interrupció" @@ -171,7 +176,7 @@ msgstr "&Punts d'interrupció" msgid "&Browse for ISOs..." msgstr "&Cerca ISOs..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Gestor de &Trucs" @@ -179,11 +184,11 @@ msgstr "Gestor de &Trucs" msgid "&DSP Settings" msgstr "Configuració de &DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Eliminar ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Eliminar ISOs seleccionades..." @@ -195,11 +200,11 @@ msgstr "&Emulació" msgid "&File" msgstr "&Arxiu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Avança imatge" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Pantalla completa" @@ -207,7 +212,7 @@ msgstr "&Pantalla completa" msgid "&Graphics Settings" msgstr "Configuració de &gràfics" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Ajuda" @@ -215,7 +220,7 @@ msgstr "&Ajuda" msgid "&Hotkey Settings" msgstr "Configuració de &tecles d'accés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -227,11 +232,11 @@ msgstr "&Càrrega estat" msgid "&Memcard Manager (GC)" msgstr "&Administrador de targeta de memòria (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memòria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Obrir..." @@ -239,51 +244,51 @@ msgstr "&Obrir..." msgid "&Options" msgstr "&Opcions" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Executar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Propietats" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "Modalitat de només &lectura" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Actualitzar llista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registres" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reiniciar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&So" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Aturar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Eines" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Vídeo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Visualitzar" @@ -291,7 +296,7 @@ msgstr "&Visualitzar" msgid "&Wiimote Settings" msgstr "Configuració &Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -316,9 +321,8 @@ msgid "(off)" msgstr "(Deshabilitat)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ Afegir" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -326,25 +330,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "" +msgstr "1.5x Natiu (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bits" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "" +msgstr "1x Natiu (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "" +msgstr "2.5x Natiu (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "" +msgstr "2x Natiu (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bits" @@ -354,33 +358,33 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "" +msgstr "3x Natiu (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "" +msgstr "4x Natiu (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bits" #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:30 msgid "" -msgstr "" +msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:263 msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:150 msgid "" -msgstr "" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -389,12 +393,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Una finestra de NetPlay ja està oberta!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "No s'està executant cap joc actualment." @@ -407,7 +411,6 @@ msgstr "" "Has de connectar manualment els wiimotes." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -416,42 +419,24 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"ALERTA:\n" -"\n" -"NetPlay actualment només funciona correctament quan s'utilitza la següent " -"configuració:\n" -" -Doble nucli [Apagat]\n" -" -Regulació de so [Apagat]\n" -" -DSP-HLE amb \"Null Àudio\" o DSP-LLE\n" -" -Establiu manualment el nombre exacte dels controladors que s'utilitzaran " -"per [Controlador estàndard]\n" -"\n" -"Tots els jugadors han d'intentar utilitzar la mateixa versió dels Dolphin " -"amb la mateixa configuració. \n" -"Deshabilitar totes les targetes de memòria o enviar-los a tots els jugadors " -"abans de començar. \n" -"Suport per al Wiimote no ha estat implementat.\n" -"\n" -"Has de redireccionar el port TCP per fer d'amfitrió!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" -msgstr "AM-placa base" +msgstr "Placa base AM" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" -msgstr "Codis AR " +msgstr "Codis AR" #: Source/Core/DolphinWX/Src/AboutDolphin.h:21 msgid "About Dolphin" @@ -498,7 +483,7 @@ msgstr "" "Codi culpable: \n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -506,7 +491,7 @@ msgstr "" "Error d'Action Replay: Mida no vàlida (%08x: Adreça = %08x) a codi afegit " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -514,7 +499,7 @@ msgid "" msgstr "" "Error d'Action Replay: Mida no vàlida (%08x: Adreça = %08X) a emplenar (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -523,7 +508,7 @@ msgstr "" "Error d Action Replay: Mida no vàlida (%08x: Adreça = %08x) a escriure i " "farciment de RAM (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -532,13 +517,13 @@ msgstr "" "Error d'Action Replay: Mida no vàlida (%08x: Adreça = %08x) a l'escriure al " "punter (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" "Error d'Action Replay: Valor no vàlid (%08x) en la copia de memòria (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -548,27 +533,27 @@ msgstr "" "(% s)\n" "Els Codis Mestres no fan falta. No els utilitzis." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Error d'Action Replay: línia de codi AR no vàlida: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Codi condicional: Mida no vàlida %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Tipus de codi Normal no vàlid %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Codi Normal %i: %08x subtipus invàlid (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Codi Normal 0: Subtipus no vàlid %08x (%s)" @@ -582,11 +567,11 @@ msgstr "Adaptador:" msgid "Add" msgstr "Afegeix" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Afegeix codi ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Afegeix Pedaç" @@ -594,9 +579,9 @@ msgstr "Afegeix Pedaç" msgid "Add new pane" msgstr "Afegeix una nova finestra" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Afegir..." @@ -652,32 +637,32 @@ msgstr "Avançada" msgid "Advanced Settings" msgstr "Configuració avançada" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Tots els arxius GC/Wii (elf, dol, gcm, iso, ciso, GCZ, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Totes les imatges GC/Wii (gcm, iso, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Tots els fitxers GameCube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Tots els Estats Guardats (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Tots els fitxers ISO Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Tots els fitxers ISO comprimits de GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Tots els fitxers (*.*)|*.*" @@ -697,19 +682,19 @@ msgstr "Filtrat anisotròpic:" msgid "Anti-Aliasing:" msgstr "Anti-Aliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader té una mida dolenta... realment és un apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader no s'ha pogut carregar des de l'arxiu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Aplicar" @@ -723,7 +708,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat (off)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Àrab" @@ -732,7 +717,7 @@ msgstr "Àrab" msgid "Are you sure you want to delete \"%s\"?" msgstr "Estàs segur que vols suprimir \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -740,15 +725,20 @@ msgstr "" "Estàs segur que vols eliminar aquests arxius? \n" "No es podran recuperar mai més!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Estàs segur d'eliminar aquest fitxer? Aquesta acció serà definitiva!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (experimental)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (experimental)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Relació d'aspecte:" @@ -757,12 +747,12 @@ msgstr "Relació d'aspecte:" msgid "At least one pane must remain open." msgstr "Almenys un panell ha de romandre obert." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Àudio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Suport d'àudio:" @@ -770,7 +760,7 @@ msgstr "Suport d'àudio:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Error en obrir el dispositiu AO \n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -809,16 +799,16 @@ msgstr "Registre BP" msgid "Back" msgstr "Enrere" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Configuració del motor" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Suport:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Suport d'entrada" @@ -827,7 +817,7 @@ msgstr "Suport d'entrada" msgid "Backward" msgstr "Suport" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Mala capçalera a l'arxiu" @@ -836,15 +826,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Imatge" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detalls del Imatge" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Imatge:" @@ -864,7 +854,7 @@ msgstr "Configuració bàsica" msgid "Bass" msgstr "Baix" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "La comprovació de la «checksum» de la taula de blocs ha fallat" @@ -885,7 +875,7 @@ msgid "Blue Right" msgstr "Blau dret" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Fons" @@ -894,27 +884,27 @@ msgstr "Fons" msgid "Bound Controls: %lu" msgstr "Controls enllaçats: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Trencat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Examinar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Examineu un directori per afegir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Examina un directori ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Examina el directori de sortida" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -924,7 +914,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Botons" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -971,33 +961,33 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "" +msgstr "No es pot trobar un WiiMote pel gestor de connexió %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" -msgstr "" +msgstr "No es pot llegir del DVD_Plugin - DVD-Interface: Error Fatal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Cancel·lar" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "No es pot obrir% s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "No es pot des-registrar esdeveniments amb esdeveniments pendents" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1008,7 +998,7 @@ msgstr "" "%s\n" "No és un arxiu de targeta de memòria gamecube vàlid." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1020,7 +1010,7 @@ msgstr "" msgid "Caps Lock" msgstr "Bloc Maj." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Català" @@ -1028,11 +1018,11 @@ msgstr "Català" msgid "Center" msgstr "Centre" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Canviar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Canviar &Disc..." @@ -1040,11 +1030,11 @@ msgstr "Canviar &Disc..." msgid "Change Disc" msgstr "Canviar Disc" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Canvi de joc" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1060,11 +1050,11 @@ msgstr "Canvia el signe del paràmetre zLluny (després de correcció)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Canvia el signe del paràmetre zAprop (després de correcció)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Canviar això no tindrà cap efecte mentre l'emulador s'executa!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1072,47 +1062,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Codi de trucs" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Cerca trucs" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Administrador de trucs" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Comprovar la integritat de la partició" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Comprovant integritat..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Xinès (simplificat)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Xinès (tradicional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Tria un directori arrel del DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Tria el directori arrel del NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Triar una ISO per defecte:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Trieu un directori per afegir" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Trieu un arxiu per obrir" @@ -1120,7 +1110,7 @@ msgstr "Trieu un arxiu per obrir" msgid "Choose a memory card:" msgstr "Triar una targeta de memòria:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1128,8 +1118,8 @@ msgstr "" "Trieu l'arxiu a utilitzar com «apploader»: (s'aplica als discos construïts a " "partir de només els directoris)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Selecciona la carpeta on extreure" @@ -1148,7 +1138,7 @@ msgstr "Clàssic" msgid "Clear" msgstr "Esborrar" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1158,7 +1148,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Tancar" @@ -1167,11 +1157,11 @@ msgstr "Tancar" msgid "Co&nfigure..." msgstr "&Configurar..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Codi d'Informació" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Codi:" @@ -1183,24 +1173,24 @@ msgstr "Comanda" msgid "Comment" msgstr "Comentari" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Comentari:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimir ISOs seleccionades..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Comprimeix ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configuració" @@ -1214,18 +1204,18 @@ msgstr "Configuració" msgid "Configure Control" msgstr "Configurar Control" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configurar Control" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configuració..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Confirmar contraescriptura del fitxer" @@ -1238,17 +1228,16 @@ msgstr "Confirmar a l'aturar" msgid "Connect" msgstr "Connectar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Connectar el teclat USB" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Connectar el teclat USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Connectar Wiimote %i" @@ -1269,7 +1258,7 @@ msgstr "Connectar Wiimote 3" msgid "Connect Wiimote 4" msgstr "Connectar Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Connectant..." @@ -1289,7 +1278,7 @@ msgstr "Control" msgid "Convert to GCI" msgstr "Convertir a GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Copia fallada" @@ -1298,21 +1287,16 @@ msgstr "Copia fallada" msgid "Copy to Memcard %c" msgstr "Copiar a la targeta de memòria %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Nucli" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "No s'ha pogut crear %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "No s'ha pogut inicialitzar el suport %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1323,25 +1307,16 @@ msgstr "" "Wii. Els discs originals de Gamecube i Wii no es poden llegir per la majoria " "de lectors DVD." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "No es pot reconèixer el fitxer ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "No s'ha pogut desar %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"No s'ha pogut establir les controls. El jugador esquerra o el joc s'està " -"executant actualment! \n" -"(Configurar els controls mentre el joc s'executa no està actualment suportat)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1355,11 +1330,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "No s'ha trobat la comanda d'obertura per l'extensió 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1367,17 +1342,17 @@ msgstr "" "No s'ha pogut inicialitzar el nucli. \n" "Verifiqueu la configuració." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Compta:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "País:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Crear Codi AR" @@ -1412,12 +1387,12 @@ msgstr "" msgid "Crossfade" msgstr "Atenuar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" -msgstr "" +msgstr "El directori axtual ha canviat de %s a %s després de wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Projecció personalitzada" @@ -1425,11 +1400,11 @@ msgstr "Projecció personalitzada" msgid "Custom Projection Hack Settings" msgstr "Configuració de la projecció personalitzada" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Configuració d'alguns paràmetres de projecció Ortogràfica." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Txec" @@ -1441,36 +1416,36 @@ msgstr "D" msgid "D-Pad" msgstr "Direcció digital" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Motor d'emulació DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulació DSP HLE (ràpid)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Intèrpret DSP LLE (lent)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Recompilador DSP LLE " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Configuració DSP " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Arrel del DVD:" @@ -1482,15 +1457,15 @@ msgstr "DVDLowRead - Error fatal: error al llegir el volumen" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Error fatal: error al llegir el volumen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Mida de dades" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Data:" @@ -1519,29 +1494,28 @@ msgstr "Depuració" msgid "Decimal" msgstr "Decimals" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Descomprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Descomprimir ISO seleccionades..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Descomprimint ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Actualitza la llista de jocs" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Per defecte" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO per defecte:" @@ -1584,8 +1558,8 @@ msgstr "" msgid "Device" msgstr "Dispositiu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Configuració del dispositiu" @@ -1593,15 +1567,12 @@ msgstr "Configuració del dispositiu" msgid "Dial" msgstr "Dial" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1616,7 +1587,7 @@ msgstr "Deshabilitar" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Desactivar destinació Alfa" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1654,19 +1625,17 @@ msgstr "" "Si no n'estàs segur, deixa-ho desmarcat." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Saltar el destí del pas d'alfa que utilitzen molts de jocs per varis efectes " -"gràfics.\n" -"\n" -"Si no n'estàs segur, deixa-ho desactivat." +"Desactiva l'emulació d'una característica de maquinari anomenada destinació " +"Alfa, que s'utilitza en molts jocs per a diversos efectes gràfics. Si no " +"n'estàs segur, deixa-ho sense marcar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disc" @@ -1693,24 +1662,59 @@ msgstr "" msgid "Divide" msgstr "Divideix" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Voleu aturar l'emulació actual?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Decodificador Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Configuració de gràfics de Dolphin %s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Lloc &Web Dolphin" @@ -1726,12 +1730,12 @@ msgstr "Configuració de Wiimote emulat" msgid "Dolphin FIFO" msgstr "FIFO Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Configuració del control GC Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin Pel·lícules TAS (*.dtm)" @@ -1739,11 +1743,11 @@ msgstr "Dolphin Pel·lícules TAS (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Configuració Wiimote Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin a &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1751,7 +1755,7 @@ msgstr "" "Dolphin no ha pogut trobar cap ISO GC/Wii. Fes doble clic aquí per buscar-" "les..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1759,19 +1763,18 @@ msgstr "" "Dolphin està actualment configurat per ocultar tots els jocs. Fea doble clic " "aquí per mostrar-los tots..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin no ha pogut completar l'acció sol·licitada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Habilitar l'accés al disc ràpid. Necessari per a alguns jocs. (Activat = " -"ràpid, Desactivat = Compatible)" +"Duplica la velocitat de rellotge de la GPU emulada. Pot accelerar alguns " +"jocs (ON = Ràpid, OFF = Compatible)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1791,11 +1794,11 @@ msgstr "Descarregat %lu codis. (Afegits %lu)" msgid "Drums" msgstr "Tambors" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Maniquí" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Bolcat d'àudio" @@ -1842,9 +1845,9 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holandès" @@ -1869,7 +1872,7 @@ msgstr "" "Dolphin, probablement serà necessari reiniciar el Windows per veure el nou " "controlador." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1877,7 +1880,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Actualitzacions recents de memòria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Edita" @@ -1885,7 +1888,7 @@ msgstr "Edita" msgid "Edit ActionReplay Code" msgstr "Modificar codi ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Modificar configuració" @@ -1893,12 +1896,12 @@ msgstr "Modificar configuració" msgid "Edit Patch" msgstr "Modificar el pedaç" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Modificar perspectiva actual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Modificació..." @@ -1910,7 +1913,7 @@ msgstr "Efecte" msgid "Embedded Frame Buffer" msgstr "Activar la memòria cau d'imatge («Frame Buffer»)" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "El fil de l'emulador ja s'està executant" @@ -1948,7 +1951,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Wiimote emulat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Estat d'emulació:" @@ -1973,15 +1976,15 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Habilitar el registre de logs d'AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Habilitar fusió de Bloc" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Permetre el càlcul del quadre delimitador" @@ -1993,7 +1996,7 @@ msgstr "Habilitar memòria cau" msgid "Enable Cheats" msgstr "Activar Trucs" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Habilitar Doble nucli" @@ -2001,7 +2004,7 @@ msgstr "Habilitar Doble nucli" msgid "Enable Dual Core (speedup)" msgstr "Habilitar Doble nucli (acceleració)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Habilitar salt d'inactiu" @@ -2009,7 +2012,7 @@ msgstr "Habilitar salt d'inactiu" msgid "Enable Idle Skipping (speedup)" msgstr "Habilitar salt d'inactiu (acceleració)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Habilitar MMU" @@ -2017,7 +2020,7 @@ msgstr "Habilitar MMU" msgid "Enable Progressive Scan" msgstr "Habilitar exploració &Progressiva" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Habilitar el protector de pantalla" @@ -2025,7 +2028,7 @@ msgstr "Habilitar el protector de pantalla" msgid "Enable Speaker Data" msgstr "Activar altaveu de dades" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Habilitar pantalla panoràmica" @@ -2048,7 +2051,7 @@ msgstr "" "\n" "Si no n'estàs segur, selecciona 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2084,7 +2087,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desactivat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2092,11 +2095,11 @@ msgstr "" "Activa aquesta opció per accelerar The Legend of Zelda: Twilight Princess. " "Deshabilitar per a qualsevol altre joc." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Activa la modificació personalitzada de projecció" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2104,19 +2107,11 @@ msgstr "" "Activa la emulació de Dolby Pro Logic II fent servir 5.1 surround. No " "disponible a OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "Activa la emulació de Dolby Pro Logic II. Només pel motor OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Activa la emulació de Dolby Pro Logic II. Només pel motor OpenAL. Pot ser " -"que tinguis que renombrar soft_oal.dll a OpenAL.dll perquè funcioni." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2129,7 +2124,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desactivat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2151,9 +2146,9 @@ msgstr "" msgid "End" msgstr "Fi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Anglès" @@ -2176,23 +2171,22 @@ msgstr "Entrada %d/%d" msgid "Entry 1/%d" msgstr "Entrada 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Igual" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Error" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Error en carregar l'idioma seleccionat. Es retorna a l'idioma per defecte " "del sistema." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2219,7 +2213,6 @@ msgid "Euphoria" msgstr "Eufòria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2229,16 +2222,20 @@ msgstr "" msgid "Execute" msgstr "Executar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Fallada d'exportació" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportar fitxer" @@ -2246,7 +2243,7 @@ msgstr "Exportar fitxer" msgid "Export Recording" msgstr "Exportar gravació" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportar gravació..." @@ -2254,7 +2251,7 @@ msgstr "Exportar gravació..." msgid "Export Save" msgstr "Exportar partida desada" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportar partida desada Wii (Experimental)" @@ -2262,15 +2259,15 @@ msgstr "Exportar partida desada Wii (Experimental)" msgid "Export all saves" msgstr "Exportar totes les partides desades" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportació fallada, intenteu de nou?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Desar exportació com a..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extensió" @@ -2286,44 +2283,44 @@ msgstr "Paràmetre addicional" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Paràmetre addicional útil només a ''Metroid: Other M''." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extreure tots els arxius..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extreure Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extreure DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extreure directori..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extreure arxiu..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extreure partició..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extraient %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extreure tots els arxius" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extraient Directori" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extraient..." @@ -2335,15 +2332,15 @@ msgstr "Byte FIFO" msgid "FIFO Player" msgstr "Jugador FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANÇA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Mida FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Error al connectar!" @@ -2351,11 +2348,15 @@ msgstr "Error al connectar!" msgid "Failed to download codes." msgstr "Error al descarregar codis." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Error a l' extreure a %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2391,20 +2392,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Error al llegir %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "No s'ha pogut llegir Imatge.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" -msgstr "" +msgstr "Error al llegir la capçalera bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2415,7 +2416,7 @@ msgstr "" "La targeta de memòria pot estar trencada\n" "Posició de l'arxiu:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2423,7 +2424,7 @@ msgstr "" "No s'ha pogut llegir la còpia de taula d'assignació de blocs correctament\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2431,17 +2432,17 @@ msgstr "" "No s'ha pogut llegir la taula d'assignació de blocs correctament\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "No s'han pogut llegir les dades des del fitxer %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" -msgstr "" +msgstr "Error al llegir les dades del fitxer: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2449,7 +2450,7 @@ msgstr "" "No s'ha pogut llegir la carpeta de còpia correctament\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2457,11 +2458,11 @@ msgstr "" "No es pot llegir el directori correctament \n" "(0x2000-0x3fff)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "Error al llegir la capçalera" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2469,29 +2470,34 @@ msgstr "" "No s'ha pogut llegir la capçalera correctament\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "No s'ha pogut llegir Identificador únic de la imatge de disc" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "No s'ha pogut escriure BT.DINF a SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "No s'ha pogut escriure bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "No s'ha pogut escriure la capçalera per %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "No s'ha pogut escriure la capçalera pel fitxer% d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Persa" @@ -2503,11 +2509,11 @@ msgstr "Ràpid" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Versió ràpida de la MMU. No funciona per a tots els jocs." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2515,7 +2521,7 @@ msgstr "" "Desincronització fatal. Cancel·lant reproducció. (Error a PlayWiimote: %u != " "%u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Jugador fifo" @@ -2539,7 +2545,7 @@ msgstr "" "L'arxiu no s'ha pogut obrir \n" "o no té una extensió vàlida" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2552,20 +2558,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "L'arxiu no es pot reconèixer com una targeta de memòria" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Arxiu no comprimit" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Mode d'obertura desconegut: 0x% 02x " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Sistema d'arxius" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Tipus de fitxer 'ini' és desconegut! No s'obrirà!" @@ -2626,7 +2632,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2636,7 +2642,7 @@ msgstr "" "Sent desactivat, dolphin posa per defecte NTSC-U i automàticament ho activa " "quant es juga amb jocs Japonesos." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2657,6 +2663,11 @@ msgstr "" msgid "Found %d results for '" msgstr "Trobats %d resultats per '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2698,9 +2709,9 @@ msgstr "Imatges a Enregistrar" msgid "Free Look" msgstr "Visió lliure" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francès" @@ -2713,7 +2724,7 @@ msgstr "Trasts" msgid "From" msgstr "de" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Pantalla completa" @@ -2725,7 +2736,7 @@ msgstr "Resolució de pantalla a pantalla completa:" msgid "GCI File(*.gci)" msgstr "Arxiu de GCI (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "Control GC" @@ -2733,27 +2744,27 @@ msgstr "Control GC" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID del Joc:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "El joc encara està en marxa!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "El joc no està funcionant!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Joc no trobat!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Configuració de jocs específics" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Configuració de joc" @@ -2770,20 +2781,20 @@ msgid "Gamecube &Pad Settings" msgstr "Configuració control «&Gamecube»" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Targetes de memòria per GameCube (*.raw, *.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Configuració control Gamecube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Codis Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2806,28 +2817,28 @@ msgstr "General" msgid "General Settings" msgstr "Configuració General" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Alemany" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "Aconseguir codi AR: l'índex és major que la grandària de la llista de codis " "%lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Gràfics" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Configuració de gràfics" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Més gran que" @@ -2849,7 +2860,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grec" @@ -2873,11 +2884,11 @@ msgstr "Guitarra" msgid "Hacks" msgstr "Modificacions" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Comprovació de la checksum de capçalera ha fallat" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebreu" @@ -2889,7 +2900,7 @@ msgstr "Alçada" msgid "Help" msgstr "Ajuda" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2900,8 +2911,17 @@ msgid "" "\n" "Sayonara!\n" msgstr "" +"Hola,\n" +"\n" +"Dolphin requereix Mac OS X 10.7 o superior.\n" +"Desafortunadament estàs utilitzant una versió antiga d'OS X.\n" +"La darrera versió de Doplhin compatible amb OS X10.6 és Dolphin 3.5\n" +"Si us plau actualitza a 10.7 o superior per utilitzar la versió més nova de " +"Dolphin.\n" +"\n" +"Adéu!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2954,7 +2974,7 @@ msgstr "Tecla d'accés de configuració" msgid "Hotkeys" msgstr "Tecles d'accés" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Hongarès" @@ -2962,31 +2982,35 @@ msgstr "Hongarès" msgid "Hybrid Wiimote" msgstr "Wiimote Híbrid" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Ha Tractat d'obtenir dades d'un bitllet desconegut:%08x/" "%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" +"IOCTL_ES_LAUNCH: Joc ha intentat de tornar a carregar IOS o un títol que no " +"està disponible en el seu bolcat de la NAND\n" +"TitleID %016llx.\n" +"Probablement Dolphin es penjarà ara." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - destinació dolenta" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Configuració de IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2998,15 +3022,15 @@ msgstr "Punter IR" msgid "IR Sensitivity:" msgstr "Sensibilitat d'IR:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Detalls d'ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Directoris ISO:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITÀLIA" @@ -3014,7 +3038,7 @@ msgstr "ITÀLIA" msgid "Icon" msgstr "Icona" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3058,9 +3082,13 @@ msgstr "" msgid "Import Save" msgstr "Desar importació" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Fallada a l'importació, tornar a provar?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3082,21 +3110,16 @@ msgstr "" "L'Arxiu importat té extensio sav \n" "però la capçalera és incorrecte" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "En Joc" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "En-joc" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Limit d'imatges/s:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3116,7 +3139,7 @@ msgstr "Insereix" msgid "Insert Encrypted or Decrypted code here..." msgstr "Inserta el codi xifrat o desxifrat aquí..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Inserir la targeta SD" @@ -3124,38 +3147,39 @@ msgstr "Inserir la targeta SD" msgid "Insert name here.." msgstr "Introduïu un nom aquí .." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Instal·lar WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Instal·lar al Menú de Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler cridat, però aquesta plataforma no està suportada " "encara." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Instal·lant WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Error de comprovació d'integritat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Comprovació d'integritat finalitzat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Comprovació d'integritat finalitzat. No s'han trobat errors." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3168,7 +3192,7 @@ msgstr "" msgid "Interface" msgstr "Interfície" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Configuració d'interfície" @@ -3193,20 +3217,20 @@ msgstr "Error intern LZO - lzo_init () ha fallat" msgid "Internal Resolution:" msgstr "Resolució Interna:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" -msgstr "" +msgstr "Intèrpret (MOLT lent)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Introducció" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Mida no vàlida (%x) o paraula màgica (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Valor invàlid!" @@ -3214,16 +3238,16 @@ msgstr "Valor invàlid!" msgid "Invalid bat.map or dir entry" msgstr "Invàlid bat.map o entrada al directori" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Tipus d'esdeveniment invàlid %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Arxiu invàlid" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3234,7 +3258,7 @@ msgstr "" "% s\n" "És possible que necessiti re-descarregar aquest joc." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Enregistrament de fitxer invàlid" @@ -3250,34 +3274,36 @@ msgstr "Cerca de cadena invàlida (no s'ha pogut convertir a número)" msgid "Invalid search string (only even string lengths supported)" msgstr "Cerca de cadena invàlida (només es soporten algunes longituds)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Estat invàlid" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italià" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPÓ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" -msgstr "" +msgstr "Recompilador JIT (recomanat)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Recompilador experimental JITIL" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonès" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "COREA" @@ -3299,8 +3325,9 @@ msgstr "Mantenir la finestra sempre visible" msgid "Key" msgstr "Clau" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Corea" @@ -3322,12 +3349,12 @@ msgstr "L-Analògic" msgid "Language:" msgstr "Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latència:" @@ -3366,7 +3393,7 @@ msgstr "" "Clic Esquerra/Dreta per més opcions. \n" "Clic Mig per deshabilitar." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Menys de" @@ -3383,58 +3410,48 @@ msgid "Load Custom Textures" msgstr "Carrega textures personalitzades" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Càrrega estat" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Carregar ranura d'estat 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Carregar ranura d'estat 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Carregar ranura d'estat 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Carregar ranura d'estat 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Carregar ranura d'estat 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Carregar ranura d'estat 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Carregar ranura d'estat 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Carregar ranura d'estat 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Carregar ranura d'estat 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Carregar ranura d'estat 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3465,19 +3482,18 @@ msgid "Load State Slot 8" msgstr "Carregar ranura d'estat 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Carregar ranura d'estat 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Carregar Estat..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Carregar el menú del sistema Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Carregar menú del sistema Wii %d%c" @@ -3496,10 +3512,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Carrega els valors preestablerts dels patrons disponibles." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Local" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Registre Log" @@ -3532,12 +3544,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Sortides del registrador Log" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Inici de sessió" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Perdut la connexió amb el servidor!" @@ -3545,7 +3557,7 @@ msgstr "Perdut la connexió amb el servidor!" msgid "M Button" msgstr "Botó M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3554,7 +3566,7 @@ msgstr "" "desajust MD5 \n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Modificació de velocitat MMU" @@ -3568,11 +3580,11 @@ msgstr "Arxius MadCatz Gameshark (*.gcs)" msgid "Main Stick" msgstr "Palanca principal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID Fabricant:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Fabricant:" @@ -3603,7 +3615,7 @@ msgid "Memory Byte" msgstr "Byte de memòria" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Targeta de memòria" @@ -3615,7 +3627,7 @@ msgstr "" "Targeta de memòria Administrador ADVERTÈNCIA-Fes còpies de seguretat abans " "d'utilitzar, hauria d'estar arreglat, però pots perdre dades!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3632,7 +3644,7 @@ msgstr "" "%s \n" "Voleu copiar el fitxer antic a aquesta nova ubicació? \n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "La mida de la targeta de memòria no correspon a la mida de la capçalera" @@ -3641,7 +3653,7 @@ msgstr "" msgid "Menu" msgstr "Menú" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Micròfon" @@ -3654,7 +3666,7 @@ msgstr "Mínim" msgid "Misc" msgstr "Varis" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Varies Configuracions" @@ -3679,11 +3691,11 @@ msgstr "" msgid "Monospaced font" msgstr "Fonts d'espiat simple" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus®" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3804,15 +3816,15 @@ msgstr "NP Tabulador" msgid "NP Up" msgstr "NP Amunt" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nom:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nom:" @@ -3822,7 +3834,7 @@ msgstr "Nom:" msgid "Native GCI files(*.gci)" msgstr "Arxius natius GCI (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nou escaneig" @@ -3831,7 +3843,7 @@ msgstr "Nou escaneig" msgid "Next Page" msgstr "Pàgina següent" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Següent escaneig" @@ -3839,19 +3851,19 @@ msgstr "Següent escaneig" msgid "Nickname :" msgstr "Sobrenom:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "No país (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "No s'han trobat ISOs o WADs" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "No hi ha sortida d'àudio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "No s'ha trobat la imatge pel joc %s" @@ -3877,42 +3889,45 @@ msgstr "No hi ha entrades lliures a l'índex de directoris" msgid "No recorded file" msgstr "Arxiu no enregistrat" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "No s'ha trobat la carpeta de partides desades per el joc %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Cap" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Noruega Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "No igual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Sense establir" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" +"No és una partida guardada Wii o hi ha hagut un error de lectura de la mida " +"de la capçalera del fitxer %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "No està connectat" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notes" @@ -3933,7 +3948,7 @@ msgstr "Avís" msgid "Num Lock" msgstr "Bloq Numèric" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Nombre de codis:" @@ -3954,7 +3969,7 @@ msgstr "Objecte" msgid "Object Range" msgstr "Rang d'objecte" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Apagar" @@ -3966,25 +3981,29 @@ msgstr "Desplaçament:" msgid "On-Screen Display Messages" msgstr "Missatges en pantalla" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Només queden %d blocs disponibles" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Obrir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Obrir directori &contingut" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Obrir la carpeta de partide&s desades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Obrir fitxer..." @@ -4010,7 +4029,13 @@ msgstr "Descodificador de textura OpenCL" msgid "OpenMP Texture Decoder" msgstr "Activar descodificador de textura OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opcions" @@ -4020,22 +4045,21 @@ msgid "Orange" msgstr "Taronja" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"L'ordre dels arxius en el directori no coincideix amb l'ordre de blocs\n" -"Feu clic dret i exporteu totes les partides desades,\n" -"i importeu les partides desades una targeta de memòria nova\n" +"L'ordre dels arxius en el directori no corresponen amb l'ordre de blocs\n" +"Fes clic dret i exporta tots els guardats,\n" +"i importa les partides a una nova targeta de memòria\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Altres" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4047,15 +4071,15 @@ msgstr "" msgid "Output" msgstr "Sortida" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "&Reproduir gravació..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Control" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Control" @@ -4079,17 +4103,17 @@ msgstr "Paràgraf" msgid "Parameters" msgstr "Paràmetres" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partició %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Pedaços" @@ -4097,8 +4121,8 @@ msgstr "Pedaços" msgid "Paths" msgstr "Camins" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausa" @@ -4111,7 +4135,7 @@ msgstr "Pausar al acabar la pel·lícula" msgid "Per-Pixel Lighting" msgstr "Il·luminació per píxel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfecte" @@ -4121,9 +4145,9 @@ msgid "Perspective %d" msgstr "Perspectiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Executar" @@ -4135,7 +4159,7 @@ msgstr "Reproduir enregistrament" msgid "Play/Pause" msgstr "Reproduir/Pausa" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Jugable" @@ -4143,11 +4167,11 @@ msgstr "Jugable" msgid "Playback Options" msgstr "Opcions de reproducció" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Jugadors" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Confirma..." @@ -4159,23 +4183,23 @@ msgstr "Creeu una perspectiva abans de desar" msgid "Plus-Minus" msgstr "Més-Menys" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polonès" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4184,11 +4208,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portuguès" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portuguès (Brasil)" @@ -4196,17 +4220,17 @@ msgstr "Portuguès (Brasil)" msgid "Post-Processing Effect:" msgstr "Efectes de post-procés:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Final prematur de la pel·lícula a PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Final prematur de la pel·lícula a PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Final prematur de la pel·lícula a PlayWiimote. %u > %u" @@ -4223,7 +4247,7 @@ msgstr "Pàgina anterior" msgid "Previous Page" msgstr "Pàgina anterior" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valor anterior" @@ -4239,7 +4263,7 @@ msgstr "Perfil" msgid "Properties" msgstr "Propietats" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Netejar memòria cau" @@ -4248,7 +4272,7 @@ msgid "Question" msgstr "Pregunta" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Sortir" @@ -4270,7 +4294,7 @@ msgstr "R-Analògic" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RÚSSIA" @@ -4309,6 +4333,10 @@ msgstr "Wiimotes reals" msgid "Record" msgstr "Enregistrar" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Informació d'enregistrament" @@ -4345,7 +4373,7 @@ msgstr "" "Si no n'estàs segur, selecciona Cap." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Actualitzar" @@ -4354,14 +4382,14 @@ msgstr "Actualitzar" msgid "Refresh List" msgstr "Actualitzar llista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Actualitza la llista de jocs" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Treure" @@ -4384,7 +4412,7 @@ msgstr "Renderitzar a la finestra principal" msgid "Reset" msgstr "Reiniciar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultats" @@ -4392,9 +4420,9 @@ msgstr "Resultats" msgid "Return" msgstr "Tornar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisió:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4405,18 +4433,17 @@ msgstr "Dreta" msgid "Right Stick" msgstr "Palanca dreta" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibració" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Rus" @@ -4429,7 +4456,7 @@ msgid "Safe" msgstr "Segur" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Desar" @@ -4439,23 +4466,20 @@ msgid "Save GCI as..." msgstr "Anomena i desa GCI..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "&Desa l'estat" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "&Desa l'estat" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Desar ranura estat 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Desar ranura estat 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4486,32 +4510,31 @@ msgid "Save State Slot 8" msgstr "Desar ranura estat 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Desar ranura estat 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Desar Estat..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Desar com..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Desar GCM/ISO comprimit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Desar perspectiva actual" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Desar GCM/ISO descomprimit" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4521,20 +4544,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "Copia EFB escalada" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Escanejant %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Cercant ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Cercant..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Capturar" @@ -4546,11 +4569,11 @@ msgstr "Bloc desplaçament" msgid "Search" msgstr "Buscar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtre de cerca" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Cercar en subcarpetes" @@ -4573,12 +4596,12 @@ msgstr "La secció %s no trobada a SYSCONF" msgid "Select" msgstr "Seleccionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Selecciona el fitxer de gravació" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Selecciona un fitxer WAD de Wii per instal·lar" @@ -4599,19 +4622,19 @@ msgstr "Selecciona un arxiu per guardar la importació" msgid "Select floating windows" msgstr "Selecciona finestres flotants" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Selecciona el fitxer a carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Selecciona el fitxer de partida guardada" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Selecciona l'estat a carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Selecciona l'estat a guardar" @@ -4633,7 +4656,7 @@ msgstr "" "\n" "Si no n'estàs segur, selecciona Automàtic." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "El perfil del controlador seleccionat no existeix" @@ -4657,27 +4680,28 @@ msgstr "" "Si no n'estàs segur, utilitza la resolució de l'escriptori.\n" "Si encara no n'estàs segurs, utilitza la resolució més alta que et funcioni." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Enviar" @@ -4689,18 +4713,18 @@ msgstr "Barra de sensors de posició" msgid "Separator" msgstr "Separador" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbi" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Port Sèrie 1 - Aquest és el port que utilitzen els dispositius com " "l'adaptador de xarxa" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Definir la imatge ISO per &defecte" @@ -4709,7 +4733,7 @@ msgstr "Definir la imatge ISO per &defecte" msgid "Set as default Memcard %c" msgstr "Definir com a targeta de memòria predeterminada %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4724,19 +4748,19 @@ msgstr "" "Ajusta la latència (en ms). Valors més alts poden reduir el soroll. Només " "pel motor Open AL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Configuració..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: No es troba el fitxer de configuració" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Sacsejar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Nom curt:" @@ -4744,23 +4768,27 @@ msgstr "Nom curt:" msgid "Shoulder Buttons" msgstr "Botons LR" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Mostrar &Consola" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Mostrar &Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Mostrar Barra d'e&stat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Mostrar Barra d'&eines" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Mostrar unitats" @@ -4772,11 +4800,11 @@ msgstr "Mostrar regions de copia EFB" msgid "Show FPS" msgstr "Mostra FPS (imatges/s)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Mostrar França" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Mostrar GameCube" @@ -4784,35 +4812,35 @@ msgstr "Mostrar GameCube" msgid "Show Input Display" msgstr "Mostrar entrada" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Mostrar Itàlia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Mostrar Japó" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Mostrar Corea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Mostrar Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Mostrar la &Configuració del registre de log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Mostrar PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Mostrar Plataformes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Mostrar Regions" @@ -4820,27 +4848,27 @@ msgstr "Mostrar Regions" msgid "Show Statistics" msgstr "Mostrar estadístiques" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Mostrar Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Mostrar EUA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Mostrar Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Mostrar Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Mostrar un missatge de confirmació abans d'aturar el joc." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4858,7 +4886,7 @@ msgstr "Mostra primer bloc" msgid "Show lag counter" msgstr "Mostrar contador de lag" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4896,7 +4924,7 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Mostrar desconeguda" @@ -4910,23 +4938,24 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote horitzontal" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Xinès simplificat" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Mida" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Saltar BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Saltar la neteja DCBZ" @@ -4951,17 +4980,17 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Ranura %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Ranura A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Ranura B" @@ -4969,7 +4998,7 @@ msgstr "Ranura B" msgid "Snapshot" msgstr "Captura" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderitzat per programari" @@ -4985,27 +5014,27 @@ msgstr "" "Realment vols activar el renderitzat per software? Si no n'estàs segur, " "selecciona 'No'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Configuració de so" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Suport de so %s invàlid." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Ha fallat la creació del buffer de so: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Espai" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Espanyol" @@ -5033,37 +5062,29 @@ msgstr "" "\n" "Si no n'estàs segur, selecciona 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Accelerar la tassa de transferència de Disc" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Palanca quadrada" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Control estàndard" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Començar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Iniciar &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Iniciar grava&ció" @@ -5071,7 +5092,7 @@ msgstr "Iniciar grava&ció" msgid "Start Recording" msgstr "Iniciar gravació" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Estat" @@ -5079,7 +5100,7 @@ msgstr "Estat" msgid "State Saves" msgstr "Estats desats" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volant" @@ -5088,7 +5109,7 @@ msgid "Stick" msgstr "Palanca" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Aturar" @@ -5119,39 +5140,40 @@ msgstr "Cop" msgid "Subtract" msgstr "Extreure" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Arxiu exportat amb èxit a %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Arxius de partides desades importats correctament" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Oscil·lació" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" -msgstr "" +msgstr "Sincronitzar subprocés de GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Idioma del sistema:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5176,13 +5198,13 @@ msgstr "Taula esquerra" msgid "Table Right" msgstr "Taula dreta" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Capturar pantalla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5202,11 +5224,11 @@ msgstr "Memòria cau de textura" msgid "Texture Format Overlay" msgstr "Superposició del format de textura" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "El WAD s'ha instal·lat amb èxit" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "L'adreça és invàlida" @@ -5214,13 +5236,13 @@ msgstr "L'adreça és invàlida" msgid "The checksum was successfully fixed" msgstr "La suma de comprovació s'ha fixat amb èxit" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "El directori triat ja és a la llista" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5243,7 +5265,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "El fitxer %s ja estava oberta, la capçalera de l'arxiu no s'escriurà." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "L'arxiu especificat (%s) no existeix" @@ -5277,7 +5299,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "El fitxer de partida guardada que està intentant copiar té la mida invàlida" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5285,36 +5307,36 @@ msgstr "" "L'idioma seleccionat no és compatible amb el seu sistema. Es tornarà a " "l'idioma per defecte del sistema." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "El servidor i les versions de client NetPlay són incompatibles!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "El servidor està ple!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "El servidor ha espòs: el joc està en marxa!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "El servidor ha enviat un missatge d'error desconegut!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "L'arxiu especificat \"%s\" no existeix" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "El valor és invàlid." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema visual:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5322,7 +5344,7 @@ msgstr "" "Hi ha d'haver una entrada per 00000001/00000002. El seu bolcat de la NAND " "probablement és incompleta." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5330,7 +5352,7 @@ msgstr "" "Aquesta configuració sobreescriu la configuració de Dolphin.\n" "Indeterminat vol dir que el joc utilitza el valor de Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5338,7 +5360,7 @@ msgstr "" "Aquest simulador d'ActionReplay no és compatible amb els codis que " "modifiquen ActionReplay." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Pot causar alentiment al Menú Wii i alguns jocs." @@ -5362,19 +5384,19 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desactivat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Si s'ha establert un límit al nombre d'imatges per segon major que la " -"velocitat del joc màxima (NTSC: 60, PAL: 50), també cal deshabilitar la " -"regulació de so DSP per a fer-ho efectiu." +"Això limita la velocitat de joc a un nombre específic de fotogrames per " +"segon (velocitat completa és 60 per NTSC i 50 per PAL). També pots utilitzar " +"la regulació d'àudio amb el DSP (pot arreglar els clics d'àudio, però pot " +"causar soroll constant depenent del joc)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5386,7 +5408,7 @@ msgstr "" "Causa millores importants de velocitat en ordinadors amb més d'un nucli, " "però també poden causar interferències/fallades." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Li permetrà editar manualment el fitxer de configuració INI" @@ -5395,12 +5417,12 @@ msgstr "Li permetrà editar manualment el fitxer de configuració INI" msgid "Threshold" msgstr "Llindar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Inclinació" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Títol" @@ -5414,21 +5436,18 @@ msgid "Toggle All Log Types" msgstr "Activar tots els tipus de registre de Log" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Relació d'aspecte:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Còpies EFB" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Activar tots els tipus de registre de Log" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Activar pantalla completa" @@ -5438,15 +5457,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Dalt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Xinès tradicional" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "S'ha intentat de carregar un tipus de fitxer desconegut." @@ -5466,7 +5486,7 @@ msgstr "" "Intentant de llegir des d'un SYSCONF invàlid \n" "identificadors de Wiimote bt no estan disponibles" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turc" @@ -5482,12 +5502,12 @@ msgstr "Tipus" msgid "UDP Port:" msgstr "Port UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "Wiimote UDP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "DESCONEGUT" @@ -5496,7 +5516,7 @@ msgstr "DESCONEGUT" msgid "UNKNOWN_%02X" msgstr "DESCONEGUT_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "EUA" @@ -5509,9 +5529,9 @@ msgstr "" "No s'ha modificat l'entrada." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5519,7 +5539,7 @@ msgstr "" "desenciptat vàlid. Assegura't d'haver-lo escrit correctament.\n" "Vols ignorar aquesta línia i continuar analitzant?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "%i Indefinit" @@ -5529,19 +5549,18 @@ msgid "Undo Load State" msgstr "Desfer la càrrega de l'estat" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Desfer la càrrega de l'estat" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Trucada inesperada a 0x80? Cancel·lant..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Desconegut" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Comanda de DVD desconeguda %08x - error crític" @@ -5549,19 +5568,19 @@ msgstr "Comanda de DVD desconeguda %08x - error crític" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:444 #, c-format msgid "Unknown command 0x%08x" -msgstr "" +msgstr "Comanda desconeguda 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Tipus desconegut d'entrada %i a SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Missatge desconegut rebut amb id: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5572,16 +5591,16 @@ msgstr "" msgid "Up" msgstr "Amunt" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Actualitzar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote vertical" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Utilitzar mode EuRGB60 (PAL60)" @@ -5589,7 +5608,7 @@ msgstr "Utilitzar mode EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Utilitzar pantalla completa" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Utilitzar hexadecimal" @@ -5618,6 +5637,15 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5641,12 +5669,11 @@ msgstr "Utilitat" msgid "V-Sync" msgstr "Sincronització Vertical" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Modificació de velocitat MMU" +msgstr "Hack de velocitat VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valor" @@ -5654,7 +5681,7 @@ msgstr "Valor" msgid "Value:" msgstr "Valor:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Valor:" @@ -5666,7 +5693,7 @@ msgstr "Verbositat" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Vídeo" @@ -5674,17 +5701,17 @@ msgstr "Vídeo" msgid "Virtual" msgstr "Virtual" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volum" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "instal·lació del WAD ha fallat: Error en crear %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Instal·lació del WAD ha fallat: Error en crear tiquet" @@ -5706,19 +5733,19 @@ msgstr "" msgid "Warning" msgstr "Advertència" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Advertència - Inicialitzant DOL en mode de consola incorrecte!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Advertència - Inicialitzant ELF en mode de consola incorrecte!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Advertència - Inicialitzant ISO en mode de consola incorrecte!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5744,7 +5771,7 @@ msgstr "" "i que tenen el mateix nom que un arxiu a la targeta de memòria\n" "Voleu continuar?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5756,7 +5783,7 @@ msgstr "" "altre guardat abans de continuar, o carregar aquest amb el mode de només " "lectura desactivat." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5768,7 +5795,7 @@ msgstr "" "aquest amb el mode de només lectura desactivat. Si no probablement tindràs " "una desincronització." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5822,19 +5849,15 @@ msgstr "Ample" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Consola Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Arrel de la NAND:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importar partida guardada Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Arxius de partida guardada Wii (*.bin)|*.bin" @@ -5843,16 +5866,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: No s'ha pogut llegir des de l'arxiu" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote connectat" @@ -5860,7 +5889,7 @@ msgstr "Wiimote connectat" msgid "Wiimote Motor" msgstr "Motor de Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Configuració de Wiimote" @@ -5884,16 +5913,16 @@ msgstr "Finestra dreta" msgid "Word Wrap" msgstr "Envoltant de paraula" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Treballant..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Escriu memcards (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5911,21 +5940,36 @@ msgstr "Escriu en un Fitxer" msgid "Write to Window" msgstr "Escriu a una Finestra" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice ha fallat:%#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 init ha fallat:%#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "La creació de la veu principal XAudio2 ha fallat:%#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice ha fallat:%#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 init ha fallat:%#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "La creació de la veu principal XAudio2 ha fallat:%#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "Registre XF" @@ -5955,11 +5999,11 @@ msgstr "No pots tancar panells que tenen pàgines." msgid "You must choose a game!!" msgstr "Heu de triar un joc!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Heu d'introduir un nom!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Heu d'entrar un decimal, hexadecimal o octal vàlid." @@ -5967,7 +6011,7 @@ msgstr "Heu d'entrar un decimal, hexadecimal o octal vàlid." msgid "You must enter a valid profile name." msgstr "Heu d'introduir un nom de perfil vàlid." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Ha de reiniciar Dolphin perquè el canvi tingui efecte." @@ -5978,7 +6022,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5997,15 +6041,15 @@ msgstr "" "Hauria de ser 0x%04x (però és 0x%04llx) \n" "Vol generar un de nou?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "Modificador ZTP" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Codi Zero 3 no està suportat" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Codi Zero desconegut per Dolphin: %08x" @@ -6065,20 +6109,24 @@ msgstr "" "\n" "Si no n'estàs segur, deixa-ho desmarcat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Llegint Opcode des de%x Si us plau, informeu." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute Ha retornat -1 en l'execució de l'aplicació!" @@ -6094,56 +6142,11 @@ msgstr "Correcció ZAprop" msgid "| OR" msgstr "| O" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulació acurada de Vbeam" +#~ msgid "Could not create %s" +#~ msgstr "No s'ha pogut crear %s" -#~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" -#~ "\n" -#~ "If unsure, leave this unchecked." -#~ msgstr "" -#~ "Permet activar certes opcions via les tecles d'accés ràpid 3 (Resolució " -#~ "interna), 4 (Relació despecte ), 5 (Copies EFB ) i 6 (Boira) dins de la " -#~ "finestra d'emulació.\n" -#~ "\n" -#~ "Si no n'estàs segur, deixa-ho desactivat." +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Enable Hotkeys" -#~ msgstr "Activar tecles d'accés ràpid" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Error a l'escoltar!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "No s'ha pogut carregar bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "No s'ha pogut carregar hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Configuració del micro de GC" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "S'ha cridat HCI_CMD_INQUIRY , si us plau informeu!" - -#~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Si el FPS és irregular, aquesta opció pot ser útil. (Activat = " -#~ "compatible, Desactivat = ràpid)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Últim estat sobreescrit" - -#~ msgid "Last Saved State" -#~ msgstr "Últim estat desat" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Tornar a connectar el Wiimote al carregar l'estat" - -#~ msgid "Set" -#~ msgstr "Definir" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Salta pas Dest. Alpha" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Llegint Opcode des de%x Si us plau, informeu." diff --git a/Languages/po/cs.po b/Languages/po/cs.po index b679eadfcd..fbdb85dfee 100644 --- a/Languages/po/cs.po +++ b/Languages/po/cs.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-11 08:08+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-17 21:42+0000\n" "Last-Translator: ZbynÄ›k Schwarz \n" "Language-Team: Czech (http://www.transifex.com/projects/p/dolphin-emu/" "language/cs/)\n" @@ -19,13 +19,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(příliÅ¡ mnoho pro zobrazení)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Hra : " @@ -33,7 +33,7 @@ msgstr " Hra : " msgid "! NOT" msgstr "! NE" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -42,7 +42,7 @@ msgstr "" "\"%s\" neexistuje.\n" " VytvoÅ™it novou 16MB Paměťovou kartu?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" je neplatný soubor GCM/ISO, nebo není GC/Wii ISO." @@ -57,28 +57,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopírovat%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d vzorků" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d vzorků (úroveň kvality %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s už existuje, pÅ™epsat?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s nelze vyÄistit. Obraz je pravdÄ›podobnÄ› poÅ¡kozen." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -87,7 +87,7 @@ msgstr "" "%s nelze naÄíst jako paměťovou kartu\n" "Soubor karty je neplatný (0x%x bajtů)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -96,7 +96,7 @@ msgstr "" "%s nelze naÄíst jako paměťovou kartu\n" "Velikost karty je neplatná (0x%x bajtů)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -106,22 +106,27 @@ msgstr "" "soubor není dostateÄnÄ› velký, aby byl platným souborem paměťové karty (0x%x " "bajtů)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s nelze otevřít" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s selhalo: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s má velikost 0 bajtů" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s je už komprimován! Nelze dále komprimovat." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s je jako jméno příliÅ¡ dlouhé, max znaků je 45" @@ -150,7 +155,7 @@ msgstr "%u Volných Bloků; %u Volných Záznamů Adr" msgid "&& AND" msgstr "&& A" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "O progr&amu..." @@ -158,7 +163,7 @@ msgstr "O progr&amu..." msgid "&Boot from DVD Drive..." msgstr "&Zavést z DVD Mechaniky..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Body pÅ™eruÅ¡ení" @@ -166,7 +171,7 @@ msgstr "&Body pÅ™eruÅ¡ení" msgid "&Browse for ISOs..." msgstr "&Procházet pro ISO..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Správce &Cheatů" @@ -174,11 +179,11 @@ msgstr "Správce &Cheatů" msgid "&DSP Settings" msgstr "&DSP Nastavení" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Smazat ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Smazat vybraná ISO..." @@ -190,11 +195,11 @@ msgstr "&Emulace" msgid "&File" msgstr "&Soubor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Postup snímkem" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Celá obrazovka" @@ -202,7 +207,7 @@ msgstr "&Celá obrazovka" msgid "&Graphics Settings" msgstr "&Grafická nastavení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&NápovÄ›da" @@ -210,7 +215,7 @@ msgstr "&NápovÄ›da" msgid "&Hotkey Settings" msgstr "Nastavení &klávesových zkratek" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -222,11 +227,11 @@ msgstr "&Nahrát Stav" msgid "&Memcard Manager (GC)" msgstr "Správce Pa&měťových karet (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "Pa&měť" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Otevřít..." @@ -234,51 +239,51 @@ msgstr "&Otevřít..." msgid "&Options" msgstr "V&olby" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pauza" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&PÅ™ehrát" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Vlastnosti" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Režim pouze pro Ätení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Obnovit Seznam" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registry" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Resetovat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Zvuk" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "Za&stavit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "Nás&troje" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Zobrazit" @@ -286,7 +291,7 @@ msgstr "&Zobrazit" msgid "&Wiimote Settings" msgstr "&Wiimote Nastavení" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -311,9 +316,8 @@ msgid "(off)" msgstr "(vypnuto)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ PŘIDAT" +msgstr "+ PŘIDAT" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -323,7 +327,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Původní (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -339,7 +343,7 @@ msgstr "2.5x Původní (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Původní (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -355,7 +359,7 @@ msgstr "3x Původní (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Původní (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -367,7 +371,7 @@ msgstr "" msgid "" msgstr "<Žádné rozliÅ¡ení nenalezeno>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -375,7 +379,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -384,12 +388,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Okno NetPlay je už otevÅ™ené!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Hra v souÄasnosti neběží!" @@ -411,38 +415,35 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "POZOR:\n" "\n" -"Netplay bude v souÄasnosti správnÄ› fungovat pouze pÅ™i použití následujících " -"nastavení:\n" +"Netplay bude správnÄ› fungovat pouze pÅ™i použití následujících nastavení:\n" " - Dvojité Jádro [VYPNUTO]\n" -" - PÅ™iÅ¡krcení Zvuku [VYPNUTO]\n" -" - DSP-HLE s \"Nulovým Zvukem\" nebo DSP-LLE\n" -" - RuÄnÄ› nastavit pÅ™esné Äíslo ovladaÄů, které budou použity na [Standardní " -"OvladaÄ]\n" +" - Jádro emulátoru DSP musí být stejné na vÅ¡ech poÄítaÄích!\n" +" - DSP na samostatném vláknÄ› [VYPNUTO]\n" +" - Limit snímků NENà nastaven na [Zvuk]\n" "\n" -"VÅ¡ichni hráÄi by mÄ›li používat stejné nastavení i verzi Dolphina.\n" -"Zakázat vÅ¡echny paměťové karty nebo je poslat hráÄům pÅ™ed spuÅ¡tÄ›ním.\n" +"VÅ¡ichni hráÄi by mÄ›li používat stejné nastavení i verzi Dolphin.\n" +"VÅ¡echny paměťové karty musí být mezi hráÄi stejné nebo zakázané.\n" "Podpora Wiimote nebyla jeÅ¡tÄ› zavedena.\n" "\n" -"Musíte pÅ™esmÄ›rovat Váš TCP port na hostitele!!" +"Hostitel musí mít zvolený port TCP pÅ™esmÄ›rován/otevÅ™en!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM Základní Deska" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Kódy AR" @@ -490,7 +491,7 @@ msgstr "" "Viníkem je Kód:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -498,7 +499,7 @@ msgstr "" "Chyba Action Replay: Neplatná velikost (%08x : adresa = %08x) v Kódu PÅ™idat " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -507,7 +508,7 @@ msgstr "" "Chyba Action Replay: Neplatná velikost (%08x : adresa = %08x) v Naplnit a " "Sesunout (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -516,7 +517,7 @@ msgstr "" "Chyba Action Replay: Neplatná velikost (%08x : adresa = %08x) v Ram Zápisu A " "NaplnÄ›ní (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -525,12 +526,12 @@ msgstr "" "Chyba Action Replay: Neplatná velikost (%08x : adresa = %08x) v Zápisu Do " "Ukazatele (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Chyba Action Replay: Neplatná hodnota (%08x) v Kopii PamÄ›ti (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -539,27 +540,27 @@ msgstr "" "Chyba Action Replay: Hlavní Kód a Zápis do CCXXXXXX nejsou zavedeny (%s)\n" "Hlavní kódy nejsou potÅ™eba, nepoužívejte je." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Chyba Action Replay: neplatný řádek kódu AR: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Podmínkový kód: Neplatná Velikost %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Neplatný Normální Kód Typu %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normální Kód %i: Neplatný podtyp %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normální Kód 0: Neplatný Podtyp %08x (%s)" @@ -573,11 +574,11 @@ msgstr "Adaptér:" msgid "Add" msgstr "PÅ™idat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "PÅ™idat kód ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "PÅ™idat Záplatu" @@ -585,9 +586,9 @@ msgstr "PÅ™idat Záplatu" msgid "Add new pane" msgstr "PÅ™idat nový panel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "PÅ™idat..." @@ -643,32 +644,32 @@ msgstr "PokroÄilé" msgid "Advanced Settings" msgstr "PokroÄilá Nastavení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "VÅ¡echny soubory GC/Wii (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "VÅ¡echny obrazy GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "VÅ¡echny soubory Gamecube GCM )gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "VÅ¡echny Uložené Stavy (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "VÅ¡echny soubory Wii ISO (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "VÅ¡echny komprimované soubory GC/WII ISO (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "VÅ¡echny soubory (*.*)|*.*" @@ -688,19 +689,19 @@ msgstr "Anizotropní Filtrování:" msgid "Anti-Aliasing:" msgstr "Vyhlazení okrajů" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "ZavadÄ›Ä aplikace má Å¡patnou velikost... je to vážnÄ› zavadÄ›Ä?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "ZavadÄ›Ä aplikace nemohl naÄíst soubor" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "ZavadÄ›Ä aplikace:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Použít" @@ -714,7 +715,7 @@ msgstr "" "\n" " Pokud si nejste jisti, zvolte (vypnuto)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "ArabÅ¡tina" @@ -723,7 +724,7 @@ msgstr "ArabÅ¡tina" msgid "Are you sure you want to delete \"%s\"?" msgstr "Jste si jisti, že chcete smazat \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -731,15 +732,20 @@ msgstr "" "Jste si jisti, že chcete tyto soubory smazat?\n" "Budou navždy ztraceny!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Opravdu chcete smazat tento soubor? Bude navždy ztracen!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (experimentální)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (experimentální)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "PomÄ›r Stran:" @@ -748,12 +754,12 @@ msgstr "PomÄ›r Stran:" msgid "At least one pane must remain open." msgstr "Alespoň jeden panel musí být otevÅ™en." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" -msgstr "Audio" +msgstr "Zvuk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Podpůrná vrstva zvuku:" @@ -761,7 +767,7 @@ msgstr "Podpůrná vrstva zvuku:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Chyba pÅ™i otevírání zařízení zvukového výstupu.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -800,16 +806,16 @@ msgstr "Registr BP" msgid "Back" msgstr "ZpÄ›t" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Nastavení podpůrné vrstvy" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Podpůrná vrstva:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Zadní Vstup" @@ -818,24 +824,24 @@ msgstr "Zadní Vstup" msgid "Backward" msgstr "Dozadu" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Å patná hlaviÄka souboru" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Rola-Bola" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Plakát" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detaily Plakátu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Plakát:" @@ -855,7 +861,7 @@ msgstr "Základní nastavení" msgid "Bass" msgstr "Basy" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Kontrolní souÄet AlokaÄní Tabulky Bloku selhal" @@ -876,7 +882,7 @@ msgid "Blue Right" msgstr "Modrá vpravo" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Dole" @@ -885,27 +891,27 @@ msgstr "Dole" msgid "Bound Controls: %lu" msgstr "Spojené ovladaÄe: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Rozbité" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Procházet" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Procházet pro pÅ™idání adresáře" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Procházet pro adresář ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Procházet pro výstupní adresář" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Vyrovnávací paměť:" @@ -915,7 +921,7 @@ msgstr "Vyrovnávací paměť:" msgid "Buttons" msgstr "TlaÄítka" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -929,11 +935,11 @@ msgstr "C" #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:65 msgid "C Stick" -msgstr "Kr Stick" +msgstr "Kruhová páÄka" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:64 msgid "C-Stick" -msgstr "Kr-Stick" +msgstr "Kruhová páÄka" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:774 msgid "CP reg" @@ -962,33 +968,33 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Nelze najít Wiimote pomocí obslužné rutiny spojení %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Nelze Äíst ze zásuvného modulu DVD - DVD-Rozhraní: Závažná chyba" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "ZruÅ¡it" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Nelze otevřít %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Nelze odhlásit události, když jsou oÄekávány" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -999,7 +1005,7 @@ msgstr "" "%s\n" "není platný soubor paměťové karty gamecube" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1011,7 +1017,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "KatalánÅ¡tina" @@ -1019,11 +1025,11 @@ msgstr "KatalánÅ¡tina" msgid "Center" msgstr "StÅ™ed" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "ZmÄ›nit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "VymÄ›nit &Disk..." @@ -1031,11 +1037,11 @@ msgstr "VymÄ›nit &Disk..." msgid "Change Disc" msgstr "VymÄ›nit Disk" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "ZmÄ›nit hru" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1051,11 +1057,11 @@ msgstr "ZmÄ›ní znaménko na Parametr zFar (po korekci)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "ZmÄ›ní znaménko na Parametr zNear (po korekci)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "ZmÄ›na tohoto se neprojeví, pokud emulátor běží!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1063,47 +1069,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Cheat Kód" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Hledání Cheatů" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Správce Cheatů" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Zkontrolovat celistvost oddílu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Kontrolování celistvosti..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "ČínÅ¡tina (ZjednoduÅ¡ená)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "ČínÅ¡tina (TradiÄní)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Zvolte koÅ™enový adresář DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Zvolte koÅ™enový adresář NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Zvolte výchozí ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Zvolte adresář k pÅ™idání" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Zvolte soubor k otevÅ™ení" @@ -1111,7 +1117,7 @@ msgstr "Zvolte soubor k otevÅ™ení" msgid "Choose a memory card:" msgstr "Zvolte paměťovou kartu:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1119,14 +1125,14 @@ msgstr "" "Zvolte soubor, který má být použit jako zavadÄ›Ä aplikace: (platí pouze pro " "disky sestavené z adresářů)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Zvolte adresář pro umístÄ›ní extrakce" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:285 msgid "Circle Stick" -msgstr "Kruhový Stick" +msgstr "Kruhová páÄka" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:56 msgid "Classic" @@ -1139,7 +1145,7 @@ msgstr "Klasické" msgid "Clear" msgstr "VyÄistit" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1148,7 +1154,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Zavřít" @@ -1157,11 +1163,11 @@ msgstr "Zavřít" msgid "Co&nfigure..." msgstr "&Nastavit..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Informace o kódu" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kód:" @@ -1173,24 +1179,24 @@ msgstr "Příkaz" msgid "Comment" msgstr "Komentář" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Komentář:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Komprimovat ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Komprimovat vybraná ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Komprimuji ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Nastavení" @@ -1204,18 +1210,18 @@ msgstr "Nastavit" msgid "Configure Control" msgstr "Nastavit Ovládání" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Nastavit Pady" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Nastavit..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Potvrdit PÅ™epsání Souboru" @@ -1228,17 +1234,16 @@ msgstr "PÅ™i zastavení Potvrdit" msgid "Connect" msgstr "PÅ™ipojit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "PÅ™ipojit USB Klávesnici" +msgstr "PÅ™ipojit Rola-Bola" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "PÅ™ipojit USB Klávesnici" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "PÅ™ipojit Wiimote %i" @@ -1259,7 +1264,7 @@ msgstr "PÅ™ipojit Wiimote 3" msgid "Connect Wiimote 4" msgstr "PÅ™ipojit Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "PÅ™ipojuji..." @@ -1279,7 +1284,7 @@ msgstr "Ctrl" msgid "Convert to GCI" msgstr "PÅ™evést na GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopírování selhalo" @@ -1288,21 +1293,16 @@ msgstr "Kopírování selhalo" msgid "Copy to Memcard %c" msgstr "Kopírovat na Paměťovou kartu %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Jádro" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Nelze vytvoÅ™it %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Nelze spustit podpůrnou vrstvu %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1313,24 +1313,16 @@ msgstr "" "Wii. Nezapomeňte, že původní disky GameCube a Wii nepÅ™eÄte vÄ›tÅ¡ina PC DVD " "mechanik." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Nelze rozpoznat ISO soubor %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Nelze uložit %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Nelze nastavit pady. HrÃ¡Ä odeÅ¡el, nebo hra v souÄasnosti běží!.\n" -"(nastavení padů za bÄ›hu hry není jeÅ¡tÄ› podporováno)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1351,11 +1343,11 @@ msgstr "" "Objevila se tato chyba po pÅ™esunu adresáře s emulátorem?\n" "Pokud ano, pak je tÅ™eba znovu zadat umístÄ›ní vaší paměťové karty v nastavení." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Nelze najít příkaz pro otevÅ™ení přípony 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1363,17 +1355,17 @@ msgstr "" "Nelze spustit jádro.\n" "Zkontrolujte VaÅ¡e nastavení." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "PoÄet:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "ZemÄ›:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "VytvoÅ™it AR kód" @@ -1408,12 +1400,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "SouÄasný adresář se zmÄ›nil z %s na %s po wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Vlastní Hack Projekce" @@ -1421,11 +1413,11 @@ msgstr "Vlastní Hack Projekce" msgid "Custom Projection Hack Settings" msgstr "Nastavení Vlastního Hacku Projekce" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "PÅ™izpůsobte nÄ›které Ortografické parametry Projekce" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "ÄŒeÅ¡tina" @@ -1437,36 +1429,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Jádro Emulátoru DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE emulace (rychlé)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE pÅ™evadÄ›Ä (pomalé)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE rekompilátor" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP na samostatném vláknÄ›" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Nastavení DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE na samostatném vláknÄ›" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "KoÅ™en DVD:" @@ -1478,15 +1470,15 @@ msgstr "DVDLowRead - Fatální chyba: nelze Äíst ze svazku" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Fatální chyba: nelze pÅ™eÄíst svazek" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "TaneÄní podložka" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Velikost data" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Datum:" @@ -1515,29 +1507,28 @@ msgstr "LadÄ›ní" msgid "Decimal" msgstr "Desetinné" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Dekomprimovat ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Dekomprimovat vybraná ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Dekomprimuji ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Obnovit seznam her" +msgstr "Snížit limit snímků" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Výchozí" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Výchozí ISO:" @@ -1581,8 +1572,8 @@ msgstr "" msgid "Device" msgstr "Zařízení" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Nastavení Zařízení" @@ -1590,15 +1581,12 @@ msgstr "Nastavení Zařízení" msgid "Dial" msgstr "Kruhová stupnice" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1613,7 +1601,7 @@ msgstr "Zakázat" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Zakázat cílovou průhlednost" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1650,19 +1638,19 @@ msgstr "" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"PÅ™eskoÄit průchod cílové průhlednosti používaný ve vÄ›tÅ¡inÄ› her pro různé " -"grafické efekty.\n" +"Zakáže emulaci hardwarové funkce nazvanou Cílová průhlednost, která je " +"používána v mnoha hrách pro různé grafické efekty.\n" +"\n" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disk" @@ -1689,24 +1677,90 @@ msgstr "" msgid "Divide" msgstr "RozdÄ›lit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Chcete souÄasnou emulaci zastavit?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dekodér Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"VÅ¡echna práva vyhrazena (c) 2003-2013+ Dolphin Team\n" +"\n" +"VÄ›tev: %s\n" +"Revize: %s\n" +"Sestaveno: %s %s\n" +"\n" +"Dolphin je emulátor Gamecube/Wii, který původnÄ›\n" +"vytvoÅ™ili uživatelé F|RES a ector.\n" +"Dnes je Dolphin svobodný software s mnoha\n" +"pÅ™ispÄ›vateli, příliÅ¡ mnoho na to, aby zde byli vÅ¡ichni uvedeni.\n" +"Pokud máte zájem, staÄí navÅ¡tívit stránku projektu na\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Zvláštní podÄ›kování patří uživatelům Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 a Hotquik za jejich\n" +"zpÄ›tné inženýrství a dokumentaci/ukázky.\n" +"\n" +"Velice dÄ›kujeme Gillesu Mouchardovim jehož emulátor\n" +"Microlib PPCm náš vývoj nastartoval.\n" +"\n" +"DÄ›kujeme Franku Willemu za jeho PowerPC disassembler,\n" +"který jsme my a or9 pozmÄ›nili, aby mohl používat i Gecko.\n" +"\n" +"DÄ›kujeme uživatelům hcs/destop za jejich dekodér GC ADPCM.\n" +"\n" +"Nejsme nijak spjaty s firmou Nintendo.\n" +"Gamecube a Wii jsou obchodní znaÄky firmy Nintendo.\n" +"Emulátor je pouze pro studijní úÄely\n" +"a nemÄ›l by být používán ke spuÅ¡tÄ›ní her,\n" +"které legálnÄ› nevlastníte." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s Grafická Nastavení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "&Webová stránka Dolphin" @@ -1722,12 +1776,12 @@ msgstr "Nastavení Emulovaného Dolphin Wiimote" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GCPad Nastavení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Doplhin Filmy TAS (*.dtm)" @@ -1735,11 +1789,11 @@ msgstr "Doplhin Filmy TAS (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote Nastavení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin na &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1747,7 +1801,7 @@ msgstr "" "Dolphin nemohl nalézt žádná GX/Wii ISO. KliknÄ›te zde dvakrát k prohledání " "souborů..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1755,19 +1809,18 @@ msgstr "" "Dolphin je v souÄasnosti nastaven na skrytí vÅ¡ech her. KliknÄ›te zde dvakrát " "pro zobrazení vÅ¡ech her..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolhpin nemohl dokonÄit požadovanou Äinnost." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Zapnout rychlý přístup k disku. NÄ›které hry to potÅ™ebují. (ZAPNUTO = rychlé, " -"VYPNUTO = Kompatibilní)" +"Zdvojnásobí taktovací frekvenci emulovaného GPU. Může zrychlit nÄ›které hry " +"(Zapnuto = Rychlé, Vypnuto = Kompatibilní)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1787,11 +1840,11 @@ msgstr "Stáhnuto %lu kódů. (přídáno %lu)" msgid "Drums" msgstr "Bubny" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Atrapa" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Vypsat Zvuk" @@ -1837,9 +1890,9 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "NizozemÅ¡tina" @@ -1863,7 +1916,7 @@ msgstr "" "Pokud jste nedávno vaÅ¡i instalaci Dolphin aktualizovali, je v tomto bodÄ› " "pravdÄ›podobnÄ› tÅ™eba restartovat, aby Windows uvidÄ›l nový ovladaÄ." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EVROPA" @@ -1871,7 +1924,7 @@ msgstr "EVROPA" msgid "Early Memory Updates" msgstr "PÅ™edÄasné Aktualizace PamÄ›ti" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Upravit" @@ -1879,7 +1932,7 @@ msgstr "Upravit" msgid "Edit ActionReplay Code" msgstr "Upravit kód ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Upravit nastavení" @@ -1887,12 +1940,12 @@ msgstr "Upravit nastavení" msgid "Edit Patch" msgstr "Upravit záplatu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Upravit souÄasnou perspektivu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Upravit" @@ -1904,7 +1957,7 @@ msgstr "Efekt" msgid "Embedded Frame Buffer" msgstr "VnoÅ™ená Vyr. PamÄ›t Snímků" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Vlákno Emulace již běží" @@ -1942,7 +1995,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Emulovaný Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Stav Emulace:" @@ -1966,15 +2019,15 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Povolit protokolování AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Zapnout SluÄování Bloků" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Povolit výpoÄet ohraniÄujícího rámeÄku" @@ -1986,7 +2039,7 @@ msgstr "Povolit vyrovnávací paměť" msgid "Enable Cheats" msgstr "Povolit Cheaty" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Povolit dvojité jádro" @@ -1994,7 +2047,7 @@ msgstr "Povolit dvojité jádro" msgid "Enable Dual Core (speedup)" msgstr "Zapnout dvojité jádro (zrychlení)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Povolit PÅ™eskakování NeÄinných Příkazů" @@ -2002,7 +2055,7 @@ msgstr "Povolit PÅ™eskakování NeÄinných Příkazů" msgid "Enable Idle Skipping (speedup)" msgstr "Povolit PÅ™eskakování NeÄinných Příkazů (zrychlení)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Zapnout MMU" @@ -2010,7 +2063,7 @@ msgstr "Zapnout MMU" msgid "Enable Progressive Scan" msgstr "Povolit Progresivní Skenování" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Povolit SpoÅ™iÄ Obrazovky" @@ -2018,7 +2071,7 @@ msgstr "Povolit SpoÅ™iÄ Obrazovky" msgid "Enable Speaker Data" msgstr "Povolit data reproduktorů" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Povolit Å irokoúhlou obrazovku" @@ -2040,7 +2093,7 @@ msgstr "" "\n" "Pokud si nejste jisti, zvolte 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2077,7 +2130,7 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2085,11 +2138,11 @@ msgstr "" "Povolte toto pro zrychlení The Legend of Zelda: Twilight Princess. Zakažte " "pro VÅ ECHNY ostatní hry." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Povolit Vlastní Hack Projekce" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2097,22 +2150,13 @@ msgstr "" "Povolí emulaci Dolby Pro Logic II používající prostorový zvuk 5.1. Není " "dostupné v OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Povolí emulaci Dolby Pro Logic II používající prostorový zvuk 5.1. Pouze pro " "podpůrnou vrstvu OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Povolí emulaci Dolby Pro Logic II používající prostorový zvuk 5.1. Pouze pro " -"podpůrnou vrstvu OpenAL. Možná bude tÅ™eba pÅ™ejmenovat soft_oal.dll na " -"OpenAL32.dll aby toto fungovalo." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2125,7 +2169,7 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2147,9 +2191,9 @@ msgstr "" msgid "End" msgstr "End" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "AngliÄtina" @@ -2172,22 +2216,21 @@ msgstr "Záznam %d/%d" msgid "Entry 1/%d" msgstr "Záznam 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Rovná se" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Chyba" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Chyba pÅ™i nahrávání zvoleného jazyka. Vracím se na výchozí jazyk systému." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2214,7 +2257,6 @@ msgid "Euphoria" msgstr "Euforie" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Obslužná rutina výjimky - přístup pod paměťovým místem. %08llx%08llx" @@ -2223,16 +2265,20 @@ msgstr "Obslužná rutina výjimky - přístup pod paměťovým místem. %08llx% msgid "Execute" msgstr "Spustit" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "UkonÄit" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exportovat vÅ¡echny uložené hry Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Export Selhal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportovat Soubor" @@ -2240,7 +2286,7 @@ msgstr "Exportovat Soubor" msgid "Export Recording" msgstr "Exportovat Nahrávku" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportovat Nahrávku..." @@ -2248,7 +2294,7 @@ msgstr "Exportovat Nahrávku..." msgid "Export Save" msgstr "Exportovat Uloženou hru" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportovat uloženou hru Wii (Experimentální)" @@ -2256,15 +2302,15 @@ msgstr "Exportovat uloženou hru Wii (Experimentální)" msgid "Export all saves" msgstr "Exportovat vÅ¡echny Uložené hry" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportování selhalo, zkusit znovu?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Export selhal" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportovat Uloženou hru jako..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Rozšíření" @@ -2280,44 +2326,44 @@ msgstr "Extra Parametr" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Extra Parametr užiteÄný pouze v ''Metroid: Other M''" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extrahovat VÅ¡echny Soubory..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extrahovat ZavadÄ›Ä Aplikace..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extrahovat DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extrahovat Adresář..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extrahovat Soubor..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extrahovat Oddíl..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extrahuji %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extrahuji VÅ¡echny Soubory" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extrahuji Adresář" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extrahuji..." @@ -2329,15 +2375,15 @@ msgstr "FIFO Bajt" msgid "FIFO Player" msgstr "PÅ™ehrávaÄ FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANCIE" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Velikost FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "PÅ™ipojení Selhalo!" @@ -2345,11 +2391,15 @@ msgstr "PÅ™ipojení Selhalo!" msgid "Failed to download codes." msgstr "Stahování kódů selhalo." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Nelze extrahovat do %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2378,6 +2428,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Nelze naÄíst bthprops.cpl! PÅ™ipojení opravdových Wiimote nebude fungovat a " +"Dolphin může být neÄekanÄ› ukonÄen!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2385,21 +2437,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Nelze naÄíst hid.dll! PÅ™ipojení opravdových Wiimote nebude fungovat a " +"Dolphin může být neÄekanÄ› ukonÄen!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Nelze pÅ™eÄíst %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Nelze Äíst z banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Nelze pÅ™eÄíst hlaviÄku bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2410,7 +2464,7 @@ msgstr "" "Data v paměťové kartÄ› můžou být zkrácena\n" "Pozice souboru: %llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2418,7 +2472,7 @@ msgstr "" "Nelze správnÄ› Äíst zálohu alokaÄní tabulky bloku\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2426,17 +2480,17 @@ msgstr "" "Nelze správnÄ› Äíst alokaÄní tabulku bloku\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Nelze Äíst data ze souboru %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "ÄŒtení dat ze souboru selhalo: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2444,7 +2498,7 @@ msgstr "" "Nelze správnÄ› Äíst zálohu adresáře\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2452,11 +2506,11 @@ msgstr "" "Nelze správnÄ› Äíst adresář\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Nelze pÅ™eÄíst hlaviÄku" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2464,29 +2518,34 @@ msgstr "" "Nelze správnÄ› Äíst hlaviÄku\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Nelze pÅ™eÄíst hlaviÄku souboru %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Nelze pÅ™eÄíst jedineÄné ID z obrazu disku" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Selhal zápis BT.DINF do SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Zápis bkhdr selhal" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Nelze zapsat data do souboru: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Zápis hlaviÄky selhal pro %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Selhal zápis hlaviÄky souboru %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "PerÅ¡tina" @@ -2496,13 +2555,13 @@ msgstr "Rychlá" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Rychlý výpoÄet hloubky" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Rychlá verze MMU. Nefunguje v každé hÅ™e." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2510,7 +2569,7 @@ msgstr "" "závažná desynchronizace. PÅ™ehrávání ukonÄeno. (Chyba v PlayWiimote: %u != " "%u, bajt %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "PÅ™ehrávaÄ Fifo" @@ -2534,7 +2593,7 @@ msgstr "" "Soubor nelze otevřít\n" "nebo nemá platnou příponu" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2547,20 +2606,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Soubor nerozpoznán jako paměťová karta" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Soubor není komprimovaný" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Neznámý režim otevÅ™ení : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Souborový systém" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Typ souboru 'ini' je neznámý! Nelze otevřít!" @@ -2620,7 +2679,7 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2630,7 +2689,7 @@ msgstr "" "Pokud není zaÅ¡krtnuto, Dolphin standardnÄ› pÅ™ejde na NTSC-U a automaticky " "zapne toto nastavení pÅ™i hraní Japonských her." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2644,13 +2703,18 @@ msgstr "DopÅ™edu" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "PÅ™esmÄ›rování portu (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "Nalezeno %d výsledků pro '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Nalezeno %x souborů uložené hry" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2692,9 +2756,9 @@ msgstr "Snímky k Nahrání" msgid "Free Look" msgstr "Rozhlížení pomocí myÅ¡i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "FrancouzÅ¡tina" @@ -2707,7 +2771,7 @@ msgstr "Pražce" msgid "From" msgstr "Z" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "CelObr" @@ -2719,7 +2783,7 @@ msgstr "RozliÅ¡ení celé obrazovky:" msgid "GCI File(*.gci)" msgstr "Soubor GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GCPad" @@ -2727,27 +2791,27 @@ msgstr "GCPad" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID Hry:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Hra už běží!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Hra neběží!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Hra nenalezena!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Nastavení Konkrétní Hry" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Nastavení Hry" @@ -2764,20 +2828,20 @@ msgid "Gamecube &Pad Settings" msgstr "Nastavení Gamecube &Pad" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Paměťové karty Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Gamecube Pad nastavení" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Kódy Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2798,26 +2862,26 @@ msgstr "Obecné" msgid "General Settings" msgstr "Obecná Nastavení" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "NÄ›mÄina" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Index je vÄ›tší než velikost seznamu ar kódu %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafika" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Grafická nastavení" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "VÄ›tší než" @@ -2838,7 +2902,7 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto zaÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "ŘeÄtina" @@ -2862,11 +2926,11 @@ msgstr "Kytara" msgid "Hacks" msgstr "Hacky" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Kontrolní souÄet hlaviÄky selhal" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "HebrejÅ¡tina" @@ -2878,7 +2942,7 @@ msgstr "Výška" msgid "Help" msgstr "NápovÄ›da" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2900,7 +2964,7 @@ msgstr "" "\n" "Sajonara!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2952,7 +3016,7 @@ msgstr "Nastavení klávesových zkratek" msgid "Hotkeys" msgstr "Klávesové zkratky" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "MaÄarÅ¡tina" @@ -2960,16 +3024,16 @@ msgstr "MaÄarÅ¡tina" msgid "Hybrid Wiimote" msgstr "Hybridní Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS: Pokus o získání dat z neznámého lístku: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -2978,15 +3042,15 @@ msgstr "" "IDNázvu %016llx.\n" "Dolphin se teÄ pravdÄ›podobnÄ› zasekne." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - Å¡patný cíl" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Nastavení IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "InfrÄ." @@ -2998,15 +3062,15 @@ msgstr "InfraÄer. Ukazovátko" msgid "IR Sensitivity:" msgstr "Citlivost InfraÄer.:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Detaily ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Adresáře ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITÃLIE" @@ -3014,7 +3078,7 @@ msgstr "ITÃLIE" msgid "Icon" msgstr "Ikona" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3058,9 +3122,13 @@ msgstr "" msgid "Import Save" msgstr "Importovat Uloženou hru" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Import selhal, zkusit znovu?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importovat uloženou hru Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Import selhal" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3082,21 +3150,16 @@ msgstr "" "\"Importovaný soubor má příponu sav\n" "ale nemá správnou hlaviÄku\"" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Ve HÅ™e" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Ve HÅ™e" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Limit Snímků:" +msgstr "Zvýšit omezení snímků" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3116,7 +3179,7 @@ msgstr "Vložit" msgid "Insert Encrypted or Decrypted code here..." msgstr "Zde vložte ZaÅ¡ifrovaný nebo RozÅ¡ifrovaný kód..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Vložit SD Kartu" @@ -3124,38 +3187,39 @@ msgstr "Vložit SD Kartu" msgid "Insert name here.." msgstr "Zde vložte jméno..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Instalovat WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Instalovat do Wii Menu" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "Byl zavolán InstallExceptionHandler, ale tato platforma toto jeÅ¡tÄ› " "nepodporuje." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Instaluji WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Chyba v kontrole celistvosti" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Kontrola celistvosti dokonÄena" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Kontrola celistvosti dokonÄena. Nebyly nalezeny žádné chyby." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3168,7 +3232,7 @@ msgstr "" msgid "Interface" msgstr "Rozhraní" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Nastavení Rozhraní" @@ -3193,20 +3257,20 @@ msgstr "VnitÅ™ní chyba LZO - lzo_init() selhalo" msgid "Internal Resolution:" msgstr "VnitÅ™ní RozliÅ¡ení:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "PÅ™evadÄ›Ä (VELMI pomalé)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Neplatná Velikost(%x) nebo Kouzelné slovo (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Neplatná Hodnota!" @@ -3214,16 +3278,16 @@ msgstr "Neplatná Hodnota!" msgid "Invalid bat.map or dir entry" msgstr "Neplatný bat.map nebo záznam adr." -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Neplatná událost typu %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Neplatný soubor" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3234,7 +3298,7 @@ msgstr "" "%s\n" "Možná budete muset hru znovu vypsat." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Neplatný soubor s nahrávkou" @@ -3250,34 +3314,36 @@ msgstr "Neplatný Å™etÄ›zec hledání (nelze pÅ™evést na Äíslo)" msgid "Invalid search string (only even string lengths supported)" msgstr "Neplatný Å™etÄ›zec hledání (jsou podporovány pouze sudé délky Å™etÄ›zce)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Neplatný stav" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "ItalÅ¡tina" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPONSKO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Rekompilátor (doporuÄeno)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL experimentální rekompilátor" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "JaponÅ¡tina" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3299,8 +3365,9 @@ msgstr "Okno vždy navrchu" msgid "Key" msgstr "Klávesa" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "KorejÅ¡tina" @@ -3322,12 +3389,12 @@ msgstr "Levý Analog" msgid "Language:" msgstr "Jazyk:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Poslední %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "ZpoždÄ›ní:" @@ -3338,7 +3405,7 @@ msgstr "Vlevo" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:64 msgid "Left Stick" -msgstr "Levý Stick" +msgstr "Levá páÄka" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:273 msgid "" @@ -3366,7 +3433,7 @@ msgstr "" "Levé/Pravé kliknutí pro více možností.\n" "ProstÅ™ední pro vymazání." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Menší než" @@ -3383,58 +3450,48 @@ msgid "Load Custom Textures" msgstr "Nahrát Vlastní Textury" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Nahrát Stav" +msgstr "NaÄíst stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Nahrát Slot Stavu 1" +msgstr "NaÄíst 1. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Nahrát Slot Stavu 2" +msgstr "NaÄíst 2. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Nahrát Slot Stavu 3" +msgstr "NaÄíst 3. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Nahrát Slot Stavu 4" +msgstr "NaÄíst 4. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Nahrát Slot Stavu 5" +msgstr "NaÄíst 5. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Nahrát Slot Stavu 6" +msgstr "NaÄíst 6. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Nahrát Slot Stavu 7" +msgstr "NaÄíst 7. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Nahrát Slot Stavu 8" +msgstr "NaÄíst 8. uložený stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Nahrát Slot Stavu 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Nahrát Slot Stavu 1" +msgstr "NaÄíst stav v pozici 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3465,19 +3522,18 @@ msgid "Load State Slot 8" msgstr "Nahrát Slot Stavu 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Nahrát Slot Stavu 1" +msgstr "NaÄíst stav v pozici 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Nahrát Stav..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Nahrát Systémové Menu Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Nahrát Systémové Menu Wii %d%c" @@ -3496,10 +3552,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "NaÄíst pÅ™ednastavené hodnoty z dostupných hackových vzorů." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Místní" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Záznam" @@ -3532,12 +3584,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Výstup ZapisovaÄe" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Protokolování" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "PÅ™ipojení k serveru ztraceno!" @@ -3545,7 +3597,7 @@ msgstr "PÅ™ipojení k serveru ztraceno!" msgid "M Button" msgstr "TlaÄítko M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3554,7 +3606,7 @@ msgstr "" "MD5 se neshoduje\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Hack Rychlosti" @@ -3566,13 +3618,13 @@ msgstr "Soubory MadCatz Gameshark (*.gcs)" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:63 #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:38 msgid "Main Stick" -msgstr "Hlavní Stick" +msgstr "Hlavní páÄka" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID Výrobce:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Výrobce:" @@ -3608,7 +3660,7 @@ msgid "Memory Byte" msgstr "Bajt PamÄ›ti" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Paměťová karta" @@ -3620,7 +3672,7 @@ msgstr "" "Správce Paměťových karet Varování-PÅ™ed použitím zálohujte, mÄ›l by být " "spravený, ale mohl by vÄ›ci poÅ¡kodit!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3637,7 +3689,7 @@ msgstr "" "%s\n" "ChtÄ›li byste starý soubor zkopírovat do nového umístÄ›ní?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "Velikost paměťové karty se neshoduje s velikosti hlaviÄky" @@ -3645,7 +3697,7 @@ msgstr "Velikost paměťové karty se neshoduje s velikosti hlaviÄky" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mikrofon" @@ -3658,7 +3710,7 @@ msgstr "Min" msgid "Misc" msgstr "Ostatní" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Ostatní Nastavení" @@ -3683,11 +3735,11 @@ msgstr "" msgid "Monospaced font" msgstr "Písmo se stejnou rozteÄí" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3808,15 +3860,15 @@ msgstr "NK Tab" msgid "NP Up" msgstr "NK Nahoru" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Jméno:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Jméno: " @@ -3826,7 +3878,7 @@ msgstr "Jméno: " msgid "Native GCI files(*.gci)" msgstr "Původní soubory CGI(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nové Skenování" @@ -3835,7 +3887,7 @@ msgstr "Nové Skenování" msgid "Next Page" msgstr "Další Stránka" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Další Skenování" @@ -3843,11 +3895,11 @@ msgstr "Další Skenování" msgid "Nickname :" msgstr "PÅ™ezdívka :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Žádná ZemÄ› (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Nenalezena žádná ISO nebo WADS" @@ -3855,7 +3907,7 @@ msgstr "Nenalezena žádná ISO nebo WADS" msgid "No audio output" msgstr "Žádný zvukový výstup" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nebyl nalezen žádný plakát s názvem %s" @@ -3881,42 +3933,43 @@ msgstr "Žádné volné záznamy indexu adresáře" msgid "No recorded file" msgstr "Žádný soubor s nahrávkou" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Nebyl nalezen žádný ukládací adresář pro název %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Žádný" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norský BokmÃ¥l" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Nerovná se" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Nenastaven" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "není uložená hra Wii nebo nelze Äíst z hlaviÄky souboru o velikosti %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "NepÅ™ipojen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Poznámky" @@ -3937,7 +3990,7 @@ msgstr "UpozornÄ›ní" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "PoÄet Kódů:" @@ -3958,7 +4011,7 @@ msgstr "Objekt" msgid "Object Range" msgstr "Rozsah Objektu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Vypnuto" @@ -3970,25 +4023,29 @@ msgstr "Logická Adresa:" msgid "On-Screen Display Messages" msgstr "Zobrazovat zprávy na obrazovce" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online &dokumentace" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Pouze bloky %d jsou dostupné" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Otevřít" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Otevřít &adresář umístÄ›ní" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Otevřít Wii adre&sář uložení" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Otevřít soubor..." @@ -4014,7 +4071,15 @@ msgstr "OpenCL Dekodér Textury" msgid "OpenMP Texture Decoder" msgstr "OpenMP Dekodér Textury" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"OtevÅ™e výchozí nastavení (pouze pro Ätení) této hry v externím textovém " +"editoru." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Volby" @@ -4024,14 +4089,13 @@ msgid "Orange" msgstr "Oranžová" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" "PoÅ™adí souborů v Adresáři Souborů se neshoduje s poÅ™adím bloku\n" -"KliknÄ›te pravým tlaÄítkem a exportujte vÅ¡echna uložení,\n" +"KliknÄ›te pravým tlaÄítkem a exportujte vÅ¡echna uložení\n" "a importujte je do nové paměťové karty\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 @@ -4039,7 +4103,7 @@ msgstr "" msgid "Other" msgstr "Jiné" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4050,15 +4114,15 @@ msgstr "" msgid "Output" msgstr "Výstup" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "S&pustit nahrávku..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad " @@ -4082,17 +4146,17 @@ msgstr "Odstavec" msgid "Parameters" msgstr "Parametry" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Oddíl %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Oddíl neexistuje: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Záplaty" @@ -4100,8 +4164,8 @@ msgstr "Záplaty" msgid "Paths" msgstr "Cesty" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pozastavit" @@ -4114,7 +4178,7 @@ msgstr "Pozastavit na konci filmu" msgid "Per-Pixel Lighting" msgstr "OsvÄ›tlení Podle Pixelu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Dokonalá" @@ -4124,9 +4188,9 @@ msgid "Perspective %d" msgstr "Perspektiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Spustit" @@ -4138,7 +4202,7 @@ msgstr "PÅ™ehrát nahrávku" msgid "Play/Pause" msgstr "PÅ™ehrát/Pozastavit" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Hratelné" @@ -4146,11 +4210,11 @@ msgstr "Hratelné" msgid "Playback Options" msgstr "Možnosti PÅ™ehrávání" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "HráÄi" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Prosím potvrÄte..." @@ -4162,23 +4226,23 @@ msgstr "PÅ™ed uložením si prosím vytvoÅ™te perspektivu" msgid "Plus-Minus" msgstr "Plus-Mínus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "PolÅ¡tina" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4187,11 +4251,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "PortugalÅ¡tina" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "PortugalÅ¡tina (Brazilská)" @@ -4199,17 +4263,17 @@ msgstr "PortugalÅ¡tina (Brazilská)" msgid "Post-Processing Effect:" msgstr "Efekt Následného Zpracování:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "PÅ™edÄasný konec filmu v PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "PÅ™edÄasný konec filmu v PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "PÅ™edÄasný konec filmu v PlayWiimote. %u > %u" @@ -4226,7 +4290,7 @@ msgstr "PÅ™ed. stránka" msgid "Previous Page" msgstr "PÅ™edchozí Stránka" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "PÅ™edchozí Hodnota" @@ -4242,7 +4306,7 @@ msgstr "Profil" msgid "Properties" msgstr "Vlastnosti" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Zahodit Vyrovnávací Paměť" @@ -4251,7 +4315,7 @@ msgid "Question" msgstr "Otázka" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "UkonÄit" @@ -4273,13 +4337,13 @@ msgstr "Pravý Analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSKO" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Rádius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4295,7 +4359,7 @@ msgstr "Opravdová" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Opravdové Rola-Bola" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4312,6 +4376,10 @@ msgstr "Opravdové Wiimoty" msgid "Record" msgstr "Nahrávat" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Zaznamenat vstup" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Informace o Nahrávání" @@ -4347,7 +4415,7 @@ msgstr "" "Pokud si nejste jisti, vyberte Žádný." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Obnovit" @@ -4356,14 +4424,14 @@ msgstr "Obnovit" msgid "Refresh List" msgstr "Obnovit Seznam" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Obnovit seznam her" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Odstranit" @@ -4386,7 +4454,7 @@ msgstr "Vykreslit do Hlavního okna" msgid "Reset" msgstr "Resetovat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Výsledky" @@ -4394,9 +4462,9 @@ msgstr "Výsledky" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revize:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4405,22 +4473,20 @@ msgstr "Vpravo" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:65 msgid "Right Stick" -msgstr "Pravý Stick" +msgstr "Pravá páÄka" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibrace" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Spustit DSP HLE a LLE na samostatném vláknÄ› (nedoporuÄeno: může způsobit " -"problémy se zvukem u HLE a zasekávání u LLE)." +"Spustit DSP LLE na samostatném vláknÄ› (nedoporuÄeno: může způsobit zaseknutí)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "RuÅ¡tina" @@ -4433,7 +4499,7 @@ msgid "Safe" msgstr "BezpeÄná" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Uložit" @@ -4443,23 +4509,20 @@ msgid "Save GCI as..." msgstr "Uložit GCI jako..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Uložit Sta&v" +msgstr "NaÄíst nejstarší stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Uložit Sta&v" +msgstr "Uložit stav" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Uložit do Slotu Stavu 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Uložit do Slotu Stavu 1" +msgstr "Uložit stav do pozice 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4490,32 +4553,31 @@ msgid "Save State Slot 8" msgstr "Uložit do Slotu Stavu 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Uložit do Slotu Stavu 1" +msgstr "Uložit stav do pozice 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Uložit Stav..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Uložit jako" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Uložit komprimované GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Uložit souÄasnou perspektivu" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Uložit dekomprimované GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Uložený stav filmu %s je poÅ¡kozen, nahrávání filmu je zastaveno..." @@ -4524,20 +4586,20 @@ msgstr "Uložený stav filmu %s je poÅ¡kozen, nahrávání filmu je zastaveno... msgid "Scaled EFB Copy" msgstr "EFB Kopie ZmÄ›nÄ›né Velikosti" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Skenuji %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Skenuji pro ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Skenuji..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "SnímkObrz" @@ -4549,11 +4611,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Hledat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Hledat Filtr" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Hledat Podadresáře" @@ -4576,12 +4638,12 @@ msgstr "Sekce %s nebyla v SYSCONF nalezena" msgid "Select" msgstr "Vybrat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Vyberte Soubor s Nahrávkou" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Vyberte soubor Wii WAD k instalování" @@ -4603,19 +4665,19 @@ msgstr "Vyberte soubor s uloženou pozicí pro import" msgid "Select floating windows" msgstr "Vybrat plovoucí okna" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Vyberte soubor k nahrání" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Vyberte soubor s uloženou hrou" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Vyberte stav k nahrání" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Vyberte stav k uložení" @@ -4635,7 +4697,7 @@ msgstr "" "Vynutit 4:3: Roztáhne obraz na pomÄ›r4:3.\n" "Roztáhnout do okna: Roztáhne obraz do velikosti okna." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Vybraný profil ovladaÄe neexistuje" @@ -4660,39 +4722,28 @@ msgstr "" "Pokud si stále nejste jisti, použijte takové nejvyšší rozliÅ¡ení, které Vám " "funguje." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Zvolí jaké grafické API bude vnitÅ™nÄ› použito.\n" -"Direct3D 9 je vÄ›tÅ¡inou nejrychlejší. OpenGL je ale pÅ™esnÄ›jší. Direct3D 11 je " -"nÄ›kde mezi nimi.\n" -"Nezapomeňte, že podpůrné vrstvy Direct3D jsou dostupné pouze ve Windows.\n" -"\n" -"Pokud si nejste jisti, použijte Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Zvolí jaké grafické API bude vnitÅ™nÄ› použito.\n" -"Direct3D 9 je vÄ›tÅ¡inou nejrychlejší. OpenGL je ale pÅ™esnÄ›jší. Direct3D 11 je " -"nÄ›kde mezi nimi.\n" -"Nezapomeňte, že podpůrné vrstvy Direct3D jsou dostupné pouze ve Windows.\n" -"\n" -"Pokud si nejste jisti, použijte OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Poslat" @@ -4704,18 +4755,18 @@ msgstr "UmístÄ›ní Senzorové TyÄe:" msgid "Separator" msgstr "OddÄ›lovaÄ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "SrbÅ¡tina" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Sériový port 1 - Tito je port, který používají zařízení jako internetový " "adaptér" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Nastavit jako &výchozí ISO" @@ -4724,7 +4775,7 @@ msgstr "Nastavit jako &výchozí ISO" msgid "Set as default Memcard %c" msgstr "Nastavit jako výchozí paměťovou kartu %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive: Index je vÄ›tší než velikost seznamu ar kódu %lu" @@ -4737,19 +4788,19 @@ msgstr "" "Nastavá zpoždÄ›ní (v ms). Vyšší hodnoty mohou snížit praskání zvuku. Pouze " "pro podpůrnou vrstvu OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Nastavení..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Nelze najít soubor s nastavením" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Nelze vytvoÅ™it soubor nastavení" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "TÅ™es" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Krátké Jméno:" @@ -4757,23 +4808,27 @@ msgstr "Krátké Jméno:" msgid "Shoulder Buttons" msgstr "Zadní TlaÄítka" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Zobrazit &Konzoli" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Zobrazit Záznam" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Zobrazit &Stavový řádek" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Zobrazit Panel Nás&trojů" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Zobrazit výchozí" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Zobrazit Disky" @@ -4785,11 +4840,11 @@ msgstr "Zobrazit EFB Regiony Kopie" msgid "Show FPS" msgstr "Zobrazit Snímky za Sekundu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Zobrazit Francii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Zobrazit GameCube" @@ -4797,35 +4852,35 @@ msgstr "Zobrazit GameCube" msgid "Show Input Display" msgstr "Zobrazit Obrazovku Vstupu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Zobrazit Itálii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Zobrazit JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Zobrazit Koreu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Jazyk Zobrazení:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Zobrazit Nastavení &Záznamu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Zobrazit PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Zobrazit Platformy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Zobrazit Regiony" @@ -4833,27 +4888,27 @@ msgstr "Zobrazit Regiony" msgid "Show Statistics" msgstr "Zobrazit Statistiky" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Zobrazit Tchaj-wan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Zobrazit USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Zobrazit Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Zobrazit Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Zobrazí rámeÄek s potvrzením pÅ™ed zastavením hry." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4871,7 +4926,7 @@ msgstr "Zobrazit první blok" msgid "Show lag counter" msgstr "Zobrazit poÄítadlo zpoždÄ›ní" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4909,7 +4964,7 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Zobrazit neznámé" @@ -4923,23 +4978,24 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Å ikmý Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "ZjednoduÅ¡ená ÄínÅ¡tina" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Velikost" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "PÅ™eskoÄit BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "PÅ™eskoÄit ÄiÅ¡tÄ›ní DCBZ" @@ -4963,17 +5019,17 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4981,7 +5037,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Snímek" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Softwarový VykreslovaÄ" @@ -4998,27 +5054,27 @@ msgstr "" "Opravdu chcete zapnout softwarové vykreslování? Pokud si nejste jisti, " "zvolte 'Ne'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Nastavení Zvuku" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Podpůrná vrstva zvuku %s je neplatná." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "VytvoÅ™ení vyrovnávací pamÄ›ti zvuku selhalo: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Mezerník" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Å panÄ›lÅ¡tina" @@ -5046,37 +5102,29 @@ msgstr "" "\n" "Pokud si nejste jisti, zvolte 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Zvýšit rychlost pÅ™enosu Disku" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" -msgstr "ÄŒtvercový Stick" +msgstr "ÄŒtvercová páÄka" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standardní OvladaÄ" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Spustit &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "ZaÄít na&hrávat" @@ -5084,7 +5132,7 @@ msgstr "ZaÄít na&hrávat" msgid "Start Recording" msgstr "ZaÄít Nahrávat" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Stav" @@ -5092,16 +5140,16 @@ msgstr "Stav" msgid "State Saves" msgstr "Ukládání stavu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volant" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:57 msgid "Stick" -msgstr "Stick" +msgstr "PáÄka" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Zastavit" @@ -5132,28 +5180,28 @@ msgstr "Brnkat" msgid "Subtract" msgstr "OdeÄíst" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Soubor úspěšnÄ› exportován do %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Uložení byly úspěšnÄ› importovány" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Å védÅ¡tina" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Å vihnutí" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synchronizovat vlákno GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5161,12 +5209,13 @@ msgstr "" "Synchronizuje vlákna GPU a CPU, aby se zabránilo náhodným zasekáváním v " "režimu dvojitého jádra. (ZAPNUTO = Kompatibilní, VYPNUTO = Rychlé)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Jazyk Systému:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TCHAJ-WAN" @@ -5191,13 +5240,13 @@ msgstr "Deska vlevo" msgid "Table Right" msgstr "Deska vpravo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "VytvoÅ™it Snímek Obrazovky" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bonga)" @@ -5217,11 +5266,11 @@ msgstr "Vyrovnávací Paměť Textur" msgid "Texture Format Overlay" msgstr "PÅ™ekryv Formátu Textury" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD byl úspěšnÄ› nainstalován" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Adresa je neplatná" @@ -5229,13 +5278,13 @@ msgstr "Adresa je neplatná" msgid "The checksum was successfully fixed" msgstr "Kontrolní souÄet byl úspěšnÄ› opraven" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Zvolený adresář je už v seznamu" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5258,7 +5307,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Soubor %s je už otevÅ™en, hlaviÄka souboru nebude zapsána." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Zadaný soubor (%s) neexistuje" @@ -5291,7 +5340,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Uložená hra, kterou se snažíte zkopírovat má neplatnou délku souboru" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5299,36 +5348,36 @@ msgstr "" "Zvolený jazyk není VaÅ¡im systémem podporován. Vracím se na výchozí jazyk " "systému." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Verze serveru a Netplay klienta jsou nekompatibilní!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Server je plný!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Server odpovÄ›dÄ›l: hra v souÄasnosti běží!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Server zaslal neznámou chybovou zprávu!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Zadaný soubor \"%s\" neexistuje" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Hodnota je neplatná" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Vzhled:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5336,7 +5385,7 @@ msgstr "" "Musí existovat lístek pro 00000001/00000002. VaÅ¡e NAND vypsání je " "pravdÄ›podobnÄ› neúplné" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5344,7 +5393,7 @@ msgstr "" "Tato nastavení potlaÄí hlavní nastavení Dolphinu.\n" "NeurÄený znamená, že hra použije nastavení Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5352,7 +5401,7 @@ msgstr "" "Tento simulátor action replay nepodporuje kód, který mÄ›ní samotný Action " "Replay." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Toto může způsobit zpomalení ve Wii Menu a v nÄ›kterých hrách." @@ -5376,19 +5425,19 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Pokud nastavíte limit snímků vÄ›tší než plná rychlost hry (NTSC:60, PAL:50), " -"mÄ›li byste také vypnout PÅ™iÅ¡krcení Zvuku v DSP (v závislosti na hÅ™e může " -"spravit klikání zvuku, ale také může způsobit neustálý hluk)." +"Toto omezí rychlost hry na zadaný poÄet snímků za sekundu (plná rychlost je " +"60 pro NTSC a 50 pro PAL). Nebo můžete použít Zvuk pro pÅ™iÅ¡krcení DSP (v " +"závislosti na hÅ™e může spravit klikání zvuku, ale také může způsobit " +"neustálý hluk)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5399,7 +5448,7 @@ msgstr "" "Způsobí výrazné zvýšení rychlosti na PC s více než jedním jádrem, ale také " "může způsobovat obÄasné chyby/pády." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Tohle Vám umožní RuÄnÄ› Upravovat konfiguraÄní soubory INI" @@ -5408,12 +5457,12 @@ msgstr "Tohle Vám umožní RuÄnÄ› Upravovat konfiguraÄní soubory INI" msgid "Threshold" msgstr "Práh" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "NaklánÄ›ní" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Název" @@ -5427,39 +5476,37 @@ msgid "Toggle All Log Types" msgstr "Zapnout VÅ¡echny Typy Záznamů" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "PomÄ›r Stran:" +msgstr "PÅ™epínat pomÄ›r stran" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Kopie" +msgstr "PÅ™epínat kopie EFB" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Zapnout VÅ¡echny Typy Záznamů" +msgstr "PÅ™epínat mlhu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "PÅ™epnout na Celou Obrazovku" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "PÅ™epínat IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "NahoÅ™e" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "TradiÄní ČínÅ¡tina" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Pokus o naÄtení souboru neznámého typu." @@ -5479,7 +5526,7 @@ msgstr "" "Pokus o Ätení z neplatného SYSCONF\n" "ID bt wiimote nejsou dostupné" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "TureÄtina" @@ -5495,12 +5542,12 @@ msgstr "Typ" msgid "UDP Port:" msgstr "UDP Port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "NEZNÃMÃ" @@ -5509,7 +5556,7 @@ msgstr "NEZNÃMÃ" msgid "UNKNOWN_%02X" msgstr "NEZNÃMÉ_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5522,9 +5569,9 @@ msgstr "" "Záznam není zmÄ›nÄ›n." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5532,7 +5579,7 @@ msgstr "" "rozÅ¡ifrovaný kód. UjistÄ›te se, že jste ho správnÄ› zadali.\n" "ChtÄ›li byste tento řádek ignorovat a pokraÄovat v analýze?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Nedefinován %i" @@ -5542,19 +5589,18 @@ msgid "Undo Load State" msgstr "Vrátit zpÄ›t Nahrání Stavu" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Vrátit zpÄ›t Nahrání Stavu" +msgstr "Vrátit zpÄ›t Uložení Stavu" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "NeoÄekávané volání 0x80? UkonÄování..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Neznámé" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Neznámý příkaz DVD %08x - závažná chyba" @@ -5569,12 +5615,12 @@ msgstr "Neznámý příkaz 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Neznámý záznam typu %i v SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "PÅ™ijata neznámá zpráva s id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "Neznámá zpráva s id:%d pÅ™ijata od hráÄe:%d Vyhazuji hráÄe!" @@ -5584,16 +5630,16 @@ msgstr "Neznámá zpráva s id:%d pÅ™ijata od hráÄe:%d Vyhazuji hráÄe!" msgid "Up" msgstr "Nahoru" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Aktualizovat" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Svislý Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Použít režim EuRGB60 (PAL60)" @@ -5601,7 +5647,7 @@ msgstr "Použít režim EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Použít Celou Obrazovku" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Použít Å estnáctkovou soustavu" @@ -5616,6 +5662,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Použít ménÄ› pÅ™esný algoritmus k výpoÄtu hodnot hloubky.\n" +"V nÄ›kterých hrách způsobuje problémy, ale může také pÅ™inést dobré " +"zrychlení.\n" +"\n" +"Pokud si nejste jisti, nechejte toto zaÅ¡krtnuté." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5630,6 +5681,20 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Používá nebezpeÄné operace pro zrychlení vysílání vertexů v OpenGL. U " +"podporovaných grafických procesorů nejsou známy žádné problémy, jinak ale " +"způsobuje vážné problémy se stabilitou a obrazem.\n" +"\n" +"Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5652,12 +5717,11 @@ msgstr "Pomůcky" msgid "V-Sync" msgstr "V-Synch" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Hack Rychlosti" +msgstr "Hack rychlosti VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Hodnota" @@ -5665,7 +5729,7 @@ msgstr "Hodnota" msgid "Value:" msgstr "Hodnota:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Hodnota:" @@ -5675,9 +5739,9 @@ msgstr "Úroveň" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hack vysílání vertexů" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Obraz" @@ -5685,17 +5749,17 @@ msgstr "Obraz" msgid "Virtual" msgstr "Virtuální" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Hlasitost" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Instalace WAD selhala: chyba pÅ™i vytváření %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Instalace WAD selhala: chyba pÅ™i vytváření lístku" @@ -5717,19 +5781,19 @@ msgstr "" msgid "Warning" msgstr "Varování" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Varování - DOL se spouÅ¡tí ve Å¡patném režimu konzole!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Varování - ELF se spouÅ¡tí ve Å¡patném režimu konzole!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Varování - ISO se spouÅ¡tí ve Å¡patném režimu konzole!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5753,7 +5817,7 @@ msgstr "" "a mají stejný název jako soubor na VaÅ¡i paměťové kartÄ›\n" "PokraÄovat?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5765,7 +5829,7 @@ msgstr "" "mÄ›li naÄíst jinou pozici, nebo tento stav naÄíst bez zapnutého režimu pouze " "pro Ätení." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5777,7 +5841,7 @@ msgstr "" "naÄíst bez zapnutého režimu pouze pro Ätení. Jinak pravdÄ›podobnÄ› dojde k " "desynchronizaci." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5831,19 +5895,15 @@ msgstr "Šířka" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Konzole Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii KoÅ™en NAND:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Import uložených pozic Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii soubory s uložením (*.bin)|*.bin" @@ -5852,16 +5912,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD Nelze Äíst ze souboru" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote PÅ™ipojen" @@ -5869,7 +5935,7 @@ msgstr "Wiimote PÅ™ipojen" msgid "Wiimote Motor" msgstr "Wiimote Motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote nastavení" @@ -5893,16 +5959,16 @@ msgstr "Klávesa Windows Vpravo" msgid "Word Wrap" msgstr "Zalamování textu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Pracuji..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Zapsat paměťové karty (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5920,21 +5986,36 @@ msgstr "Zapsat do Souboru" msgid "Write to Window" msgstr "Zapsat do Okna" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice selhalo: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 spuÅ¡tÄ›ní selhalo: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 vytvoÅ™ení hlavního hlasu selhalo: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice selhalo: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 spuÅ¡tÄ›ní selhalo: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 vytvoÅ™ení hlavního hlasu selhalo: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5969,11 +6050,11 @@ msgstr "Nemůžete zavřít panely, které mají uvnitÅ™ stránky." msgid "You must choose a game!!" msgstr "Musíte si zvolit hru!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Musíte zadat jméno!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" "Musíte zadat platnou hodnotu v desítkové, Å¡estnáctkové nebo osmiÄkové " @@ -5983,7 +6064,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "Musíte zadat platné jméno profilu." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Pro uplatnÄ›ní zmÄ›n musíte Dolphin restartovat." @@ -5997,7 +6078,7 @@ msgstr "" "ChtÄ›li byste nyní pÅ™estat a problém opravit?\n" "Pokud zvolíte \"Ne\", mlže být zvuk poÅ¡kozený." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6016,15 +6097,15 @@ msgstr "" "MÄ›l by být 0x%04x (ale je 0x%04llx)\n" "Chcete vytvoÅ™it nový?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Kód Zero 3 není podporován" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Nulový kód, který dolphin nezná: %08x" @@ -6084,20 +6165,24 @@ msgstr "" "\n" "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "zavadÄ›Ä aplikace (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: PÅ™eÄten Opcode z %x. Prosím nahlaste." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "neznámá konfigurace %d (oÄekáváno %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "pÅ™ijata neznámá zpráva" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute pÅ™i bÄ›hu aplikace vrátil -1!" @@ -6113,75 +6198,48 @@ msgstr "Korekce zNear:" msgid "| OR" msgstr "| NEBO" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Precizní emulace VBeam" +#~ msgid "Could not create %s" +#~ msgstr "Nelze vytvoÅ™it %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Upravit místní zmÄ›ny nastavení" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "OtevÅ™e uživatelem zadané zmÄ›ny nastavení v externím textovém editoru." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Umožní pÅ™epínání jistých možností pomocí klávesových zkratek 3 (VnitÅ™ní " -#~ "rozliÅ¡ení), 4(PomÄ›r stran), 5 (Kopie EFB) a 6 (Mlha) uvnitÅ™ okna " -#~ "emulace.\n" +#~ "Zvolí jaké grafické API bude vnitÅ™nÄ› použito.\n" +#~ "Direct3D 9 je vÄ›tÅ¡inou nejrychlejší. OpenGL je ale pÅ™esnÄ›jší. Direct3D 11 " +#~ "je nÄ›kde mezi nimi.\n" +#~ "Nezapomeňte, že podpůrné vrstvy Direct3D jsou dostupné pouze ve Windows.\n" #~ "\n" -#~ "Pokud si nejste jisti, nechejte toto odÅ¡krtnuté." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Nelze najít Wiimote podle bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Povolit klávesové zkratky" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Naslouchání Selhalo!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Nelze nahrát bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Nelze nahrát hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Nastavení GCMic" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "Byl zavolán HCI_CMD_INQUIRY, prosím ohlaste!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "ZmÄ›nÄ›né nahrávání vyrovnávací pamÄ›ti" +#~ "Pokud si nejste jisti, použijte Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Pokud jsou SzS nestálé, tato volba může pomoci. (ZAPNUTO = Kompatibilní, " -#~ "VYPNUTO = Rychlé)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Poslední PÅ™epsaný Stav" - -#~ msgid "Last Saved State" -#~ msgstr "Poslední Uložený Stav" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Znovu pÅ™ipojit Wiimote pÅ™i Nahrání Stavu" - -#~ msgid "Set" -#~ msgstr "Nastavit" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Vypnout Průchod Cíl. Průhl." - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Použít pozmÄ›nÄ›nou strategii nahrávání pro proudový pÅ™enos vertexů.\n" -#~ "VÄ›tÅ¡inou umožňuje zrychlení, ale specifikace OpenGL ji zakazuje a může " -#~ "způsobit vážné chyby.\n" +#~ "Zvolí jaké grafické API bude vnitÅ™nÄ› použito.\n" +#~ "Direct3D 9 je vÄ›tÅ¡inou nejrychlejší. OpenGL je ale pÅ™esnÄ›jší. Direct3D 11 " +#~ "je nÄ›kde mezi nimi.\n" +#~ "Nezapomeňte, že podpůrné vrstvy Direct3D jsou dostupné pouze ve Windows.\n" #~ "\n" -#~ "Pokud si nejste jisti, nechejte odÅ¡krtnuté." +#~ "Pokud si nejste jisti, použijte OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: PÅ™eÄten Opcode z %x. Prosím nahlaste." diff --git a/Languages/po/de.po b/Languages/po/de.po index cb256465d0..d92c8676c4 100644 --- a/Languages/po/de.po +++ b/Languages/po/de.po @@ -3,17 +3,19 @@ # This file is distributed under the same license as the dolphin-emu package. # # Translators: +# turbedi , 2013 # DasD aus der Spree , 2013 # DefenderX , 2013 # Ghabry , 2013 # JackyCola , LucasX , 2011 # no_cluez , 2013 +# Shinrai, 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-05 23:28+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-21 12:39+0000\n" "Last-Translator: Ghabry \n" "Language-Team: German (http://www.transifex.com/projects/p/dolphin-emu/" "language/de/)\n" @@ -23,13 +25,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" -msgstr " (zu viele zum anzeigen)" +msgstr " (zu viele anzuzeigen)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Spiel: " @@ -37,7 +39,7 @@ msgstr " Spiel: " msgid "! NOT" msgstr "! NICHT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -46,10 +48,10 @@ msgstr "" "\"%s\" existiert nicht.\n" "Eine neue 16MB Memcard erstellen?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." -msgstr "\"%s\" ist kein gültiges GC/Wii-Image oder kein GC/Wii-Image." +msgstr "\"%s\" ist keine gültige GCM/ISO-Datei oder kein GC/Wii-Image." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:730 #, c-format @@ -61,40 +63,40 @@ msgstr "%08X:" msgid "%1$sCopy%1$s" msgstr "%1$sKopieren%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" -msgstr "" +msgstr "%d Samples" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" -msgstr "" +msgstr "%d Samples (Qualität %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "" "%s ist bereits vorhanden.\n" -"Vorhandene Datei ersetzen?" +"Vorhandene Datei überschreiben?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" -"%s konnte nicht komprimiert werden, möglicherweise ist das Image fehlerhaft." +"%s konnte nicht komprimiert werden. Möglicherweise ist das Image fehlerhaft." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" "%s konnte nicht als Speicherkarte geladen werden.\n" -"Die Dateigröße der Speicherkarten-Datei ist ungültig (0x%x bytes)." +"Die Dateigröße ist ungültig (0x%x bytes)." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -103,32 +105,37 @@ msgstr "" "%s konnte nicht als Speicherkarte geladen werden.\n" "Die Speicherkartengröße ist ungültig (0x%x bytes)." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -"%s konnte nicht als Memory Card geladen werden\n" -"Die Datei ist nicht groß genug um eine gültige Memory Card Datei zu sein (0x" -"%x bytes)" +"%s konnte nicht als Speicherkarte geladen werden.\n" +"Die Datei ist nicht groß genug um eine gültige Speicherkartendatei zu sein " +"(0x%x bytes)." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s konnte nicht geöffnet werden." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s fehlgeschlagen: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "Die Datei %s ist 0 Byte groß." -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." -msgstr "%s ist bereits komprimiert und kann nicht erneut komprimiert werden." +msgstr "%s ist bereits komprimiert und kann nicht weiter komprimiert werden." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "Der Dateiname %s ist zu lang (maximal 45 Zeichen)" @@ -157,7 +164,7 @@ msgstr "%u freie Blöcke; %u freie Verzeichniseinträge" msgid "&& AND" msgstr "&& UND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "Ãœber &Dolphin" @@ -165,7 +172,7 @@ msgstr "Ãœber &Dolphin" msgid "&Boot from DVD Drive..." msgstr "Von &DVD-Laufwerk starten..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Haltepunkte" @@ -173,7 +180,7 @@ msgstr "&Haltepunkte" msgid "&Browse for ISOs..." msgstr "Nach ISOs &suchen..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Cheat-Manager" @@ -181,11 +188,11 @@ msgstr "&Cheat-Manager" msgid "&DSP Settings" msgstr "&DSP-Einstellungen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "ISO &löschen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "Ausgewählte ISOs &löschen" @@ -197,11 +204,11 @@ msgstr "&Emulation" msgid "&File" msgstr "&Datei" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Einzelbildwiedergabe" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Vollbild" @@ -209,15 +216,15 @@ msgstr "&Vollbild" msgid "&Graphics Settings" msgstr "&Grafikeinstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Hilfe" #: Source/Core/DolphinWX/Src/FrameTools.cpp:182 msgid "&Hotkey Settings" -msgstr "&Tastenkürzel Einstellungen" +msgstr "&Tastenkürzel-Einstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -229,11 +236,11 @@ msgstr "Spielstand &laden" msgid "&Memcard Manager (GC)" msgstr "&Speicherkarten-Verwaltung (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Arbeitsspeicher" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "Ö&ffnen..." @@ -241,51 +248,51 @@ msgstr "Ö&ffnen..." msgid "&Options" msgstr "&Optionen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "Pau&se" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Start" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Eigenschaften" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "S&chreibgeschützer Modus" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "Liste &aktualisieren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Register" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "S&ound" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "Sto&pp" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "E&xtras" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Ansicht" @@ -293,7 +300,7 @@ msgstr "&Ansicht" msgid "&Wiimote Settings" msgstr "&Wiimote-Einstellungen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -318,9 +325,8 @@ msgid "(off)" msgstr "(aus)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ HINZUF." +msgstr "+ HINZUF." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -328,25 +334,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "" +msgstr "1.5x Nativ (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 Bit" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "" +msgstr "1x Nativ (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "" +msgstr "2.5x Nativ (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "" +msgstr "2x Nativ (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 Bit" @@ -356,13 +362,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "" +msgstr "3x Nativ (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "" +msgstr "4x Nativ (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 Bit" @@ -374,7 +380,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -382,7 +388,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -391,12 +397,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Ein NetPlay-Fenster ist bereits geöffnet!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Derzeit wird kein Spiel ausgeführt." @@ -418,39 +424,37 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ACHTUNG:\n" "\n" -"NetPlay funktioniert derzeit nur mit den folgenden Einstellungen:\n" -" - Dual Core [Aus]\n" -" - Audio Throttle [Aus]\n" -" - DSP-HLE mit \"Null Audio\" oder DSP-LLE\n" -" - Genaue Anzahl der als [Standard Controller] benutzten Eingabegeräte muss " -"manuell festgelegt werden.\n" +"Netplay funktioniert nur mit den folgenden Einstellungen:\n" +"- Dual Core aktivieren [AUS]\n" +" - DSP-Emulationsengine muss auf allen Computern gleich sein!\n" +" - DSP in eigenem Thread [AUS]\n" +" - Framebegrenzung NICHT auf [AUDIO] gesetzt\n" "\n" -"Alle Spieler sollten die gleiche Dolphin Version und Einstellungen " +"Alle Spieler sollten die gleiche Dolphin-Version und Einstellungen " "verwenden.\n" -"Deaktiviere die Memory-Cards, oder sende sie vor dem Spielen an alle anderen " -"Spieler.\n" -"Wiimote Unterstützung wurde für NetPlay noch nicht implementiert.\n" +"Alle Speicherkarten müssen bei allen Spielern identisch oder deaktiviert " +"sein.\n" +"Wiimote-Unterstützung wurde für NetPlay noch nicht implementiert.\n" "\n" -"TCP Port zum Hoster muss geöffnet sein!!" +"Der Host muss den gewählten TCP-Port geöffnet haben!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR Codes" @@ -477,7 +481,7 @@ msgstr "" "Einige Spiele benötigen eine exakte Emulation von EFB-Kopien, für bestimmte " "Grafikeffekte oder Gameplayfunktionen.\n" "\n" -"In der Regel ist \"EFB to Texture\" ausreichend." +"Im Zweifel, wähle stattdessen EFB to Texture." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:255 msgid "Action" @@ -493,20 +497,20 @@ msgid "" "%s" msgstr "" "Action Replay Code Entschlüsselungfehler:\n" -"Ãœbereinstimmungs Check fehlgeschlagen\n" +"Ãœbereinstimmungscheck fehlgeschlagen\n" "\n" "Fehlerhafter Code:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -"Action Replay Fehler: Fehlerhafte Größe (%08x : address = %08x) im folgendem " -"Code (%s)" +"Action Replay Fehler: Ungültige Größe (%08x : address = %08x) in Add Code " +"(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -515,7 +519,7 @@ msgstr "" "Action Replay Fehler: Ungültige Größe (%08x : address = %08x) in Fill and " "Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -524,55 +528,54 @@ msgstr "" "Action Replay Fehler: Ungültige Größe (%08x : address = %08x) in Ram Write " "And Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -"Action Replay Fehler: Fehlerhafte Größe (%08x : address = %08x) im " -"geschriebennen Pointer (%s)" +"Action Replay Fehler: Ungültige Größe (%08x : address = %08x) in Write To " +"Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" -msgstr "" -"Action Replay Fehler: Fehlerhafte Größe (%08x) im kopierten Speicher (%s)" +msgstr "Action Replay Fehler: Ungültiger Wert (%08x) in Memory Copy (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -"Action Replay Fehler: Master code and Write zu CCXXXXXX beinhaltet nicht " +"Action Replay Fehler: Master code und Write To CCXXXXXX nicht integriert " "(%s)\n" -"Master Codes werden nicht benötigt. Benutze keine Master Codes." +"Master Codes werden nicht benötigt. Benutzen Sie keine Master Codes." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" -msgstr "Action Replay Fehler: Fehlerhafter AR-Code in Zeile: %s" +msgstr "Action Replay Fehler: Ungültiger AR-Code in Zeile: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" -msgstr "Action Replay: Conditional Code: ungültige Größe %08x (%s)" +msgstr "Action Replay: Conditional Code: Ungültige Größe %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" -msgstr "Action Replay: Ungültiger Normal Code %08x (%s)" +msgstr "Action Replay: Ungültiger Normal Code Typ %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normaler Code %i: ungültiger Subtype %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" -msgstr "Action Replay: Normal Code 0: ungültiger Subtype %08x (%s)" +msgstr "Action Replay: Normal Code 0: Ungültiger Subtype %08x (%s)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:248 msgid "Adapter:" @@ -583,11 +586,11 @@ msgstr "Grafikkarte:" msgid "Add" msgstr "Hinzufügen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "ActionReplay-Code hinzufügen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Patch hinzufügen" @@ -595,9 +598,9 @@ msgstr "Patch hinzufügen" msgid "Add new pane" msgstr "Neue Palette hinzufügen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Hinzufügen..." @@ -617,8 +620,8 @@ msgid "" msgstr "" "Füge den ermittelten Wert in den Parameter zFar ein.\n" "Es gibt zwei Möglichkeiten zum Bestimmen der Gleitkommazahl.\n" -"Beispiel: Gebe ''200'' oder ''0.0002'' direkt ein, es ergibt denn gleich " -"Effekte, der ermittelte Wert wird ''0.0002'' sein.\n" +"Beispiel: ''200'' oder ''0.0002'' direkt eingeben, das ergibt den gleichen " +"Effekt, der ermittelte Wert wird ''0.0002'' sein.\n" "Wert: (0->+/-Integer) oder (0->+/-FP[6 Nachkommastellen])\n" "\n" "NOTIZ: Prüfe im Logfenster/Konsole die ermittelten Werte." @@ -635,15 +638,15 @@ msgid "" msgstr "" "Füge den ermittelten Wert in den Parameter zNear ein.\n" "Es gibt zwei Möglichkeiten zum Bestimmen der Gleitkommazahl.\n" -"Beispiel: Gebe ''200'' oder ''0.0002'' direkt ein, es ergibt denn gleich " -"Effekte, der ermittelte Wert wird ''0.0002'' sein.\n" +"Beispiel: ''200'' oder ''0.0002'' direkt eingeben, das ergibt den gleichen " +"Effekt, der ermittelte Wert wird ''0.0002'' sein.\n" "Wert: (0->+/-Integer) oder (0->+/-FP[6 Nachkommastellen])\n" "\n" "NOTIZ: Prüfe im Logfenster/Konsole die ermittelten Werte." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:808 msgid "Adjust the analog control pressure required to activate buttons." -msgstr "Einstellung des benötigten Drucks um Analoge Tasten zu aktivieren." +msgstr "Einstellung des benötigten analogen Drucks um Tasten zu aktivieren." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:520 msgid "Advanced" @@ -653,32 +656,32 @@ msgstr "Erweitert" msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Alle GC/Wii-Dateien (elf, dol, gcm, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Alle GC/Wii-Imagedateien (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Alle Gamecube GCM-Dateien (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Alle Speicherstände (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" -msgstr "Alle Wii ISO Dateien (iso)" +msgstr "Alle Wii-ISO-Dateien (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Alle komprimierten GC/Wii ISO Dateien (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Alle Dateien (*.*)|*.*" @@ -688,30 +691,30 @@ msgstr "Analysiere" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:286 msgid "Angle" -msgstr "" +msgstr "Winkel" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:376 msgid "Anisotropic Filtering:" -msgstr "Anisotrope Filterung:" +msgstr "Anisotropische Filterung:" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:359 msgid "Anti-Aliasing:" -msgstr "Antialiasing:" +msgstr "Anti-Aliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" "Der Apploader hat eine falsche Größe... ist dies wirklich ein AppLoader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Kann Apploader aus dieser Datei nicht laden." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Ãœbernehmen" @@ -721,19 +724,20 @@ msgid "" "\n" "If unsure, select (off)." msgstr "" -"Schaltet einen Post-Processing Effekt wenn ein Frame beendet wurde. Wenn " -"unsicher, wähle (aus)." +"Post-Processing-Effekt anwenden, wenn ein Frame beendet wurde. \n" +"\n" +"Im Zweifel, wähle (aus)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabisch" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:667 #, c-format msgid "Are you sure you want to delete \"%s\"?" -msgstr "Möchtest du wirklich \"%s\" löschen?" +msgstr "Möchtest du \"%s\" wirklich löschen?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -741,16 +745,21 @@ msgstr "" "Sollen diese Dateien wirklich gelöscht werden?\n" "Löschen kann nicht rückgängig gemacht werden!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Soll die Datei gelöscht werden? Löschen kann nicht Rückgängig gemacht werden." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "ARM JIT (Experimentell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "ARM JIT (Experimentell)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Seitenverhältnis:" @@ -759,20 +768,20 @@ msgstr "Seitenverhältnis:" msgid "At least one pane must remain open." msgstr "Mindestens eine Palette muss geöffnet bleiben." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" -msgstr "Audio Backend:" +msgstr "Audio-Backend:" #: Source/Core/AudioCommon/Src/AOSoundStream.cpp:28 msgid "AudioCommon: Error opening AO device.\n" -msgstr "AudioCommon: Fehler beim öffnen des AO-Gerätes.\n" +msgstr "AudioCommon: Fehler beim Öffnen des AO-Geräts.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automatisch" @@ -783,11 +792,11 @@ msgstr "Automatisch (Vielfaches von 640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:346 msgid "Auto (Window Size)" -msgstr "Automatisch (Fenstergröße)" +msgstr "Automatisch (Fenstermodus)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:306 msgid "Auto adjust Window Size" -msgstr "Lege die Größe des Fenstermodus automatisch fest." +msgstr "Fenstergröße automatisch festlegen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:77 msgid "" @@ -795,9 +804,9 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Passt die Fenstergröße deine Bildschirmauflösung automatisch an.\n" +"Passt die Fenstergröße automatisch der Bildschirmauflösung an.\n" "\n" -"Wenn du dir unsicher bist lass diesen Punkt ausgeschaltet." +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:705 msgid "B" @@ -811,42 +820,42 @@ msgstr "BP-Register" msgid "Back" msgstr "Zurück" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Backend-Einstellungen" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" -msgstr "Hintergrund-Eingabe" +msgstr "Hintergrundeingabe" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:267 msgid "Backward" msgstr "Rückwärts" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" -msgstr "Ungültige Header-Datei" +msgstr "Ungültiger Datei-Header" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Bannerdetails" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -866,7 +875,7 @@ msgstr "Grundeinstellungen" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Blockzuteilungs-Tabellen-Prüfsumme fehlerhaft." @@ -887,7 +896,7 @@ msgid "Blue Right" msgstr "Blau rechts" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Unten" @@ -896,27 +905,27 @@ msgstr "Unten" msgid "Bound Controls: %lu" msgstr "Steuerung festlegen: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Defekt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Durchsuchen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" -msgstr "Ordner suchen und hinzufügen" +msgstr "Verzeichnis auswählen und hinzufügen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." -msgstr "ISO-Verzeichnis hinzufügen..." +msgstr "ISO-Verzeichnis auswählen..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Ausgabeverzeichnis auswählen" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -926,11 +935,13 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Tasten" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." msgstr "" +"Umgeht die Leerung des Datencaches von der DCBZ-Anweisung. Für gewöhnlich " +"deaktiviert lassen." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:706 msgid "C" @@ -950,7 +961,7 @@ msgstr "CP reg" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:554 msgid "CPU Emulator Engine" -msgstr "CPU Emulator Engine" +msgstr "CPU-Emulations-Engine" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:500 msgid "Cache Display Lists" @@ -964,41 +975,41 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Kalkuliert die Lichtberechnung von 3D Grafiken eher pro Pixel als pro " +"Kalkuliert die Lichtberechnung von 3D Grafiken pro Pixel anstatt pro " "Vertex.\n" -"Verlangsamt Emulation um einige Prozent (GPU Abhängig).\n" -"Für Gewöhnlich ist das eine sichere Verbesserung, kann aber Probleme " -"verursachen.\n" +"Verlangsamt Emulation um einige Prozent (abhängig von der GPU).\n" +"Für gewöhnlich ist das eine sichere Verbesserung, kann aber gelegentlich " +"Probleme verursachen.\n" "\n" -"Wenn du dir unsicher bist, wähle es nicht aus." +"Im Zweifel deaktiviert lassen." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "" +msgstr "WiiMote konnte nicht bei Verbindungs-Handle %02x gefunden werden" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" -msgstr "" +msgstr "Kann nicht von DVD_Plugin/DVD-Schnittstelle lesen: Fataler Fehler" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Abbrechen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Kann %s nicht öffnen" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" -msgstr "Kann während ausstehenden Events keine bereits Events de-registrieren." +msgstr "Kann während ausstehenden Events keine Events entregistrieren." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1008,19 +1019,19 @@ msgstr "" "Die Datei %s kann nicht als Speicherkarte verwendet werden, weil sie keine " "gültige Gamecube-Speicherkarte ist." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" msgstr "" "Diese Datei kann nicht als Speicherkarte verwendet werden.\n" -"Versuchts du möglicherweise die selbe Datei in beiden Slots zu verwenden?" +"Versuchst du möglicherweise die selbe Datei in beiden Slots zu verwenden?" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:39 msgid "Caps Lock" msgstr "Feststelltaste" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Katalanisch" @@ -1028,11 +1039,11 @@ msgstr "Katalanisch" msgid "Center" msgstr "Mitte" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Wechseln" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Disc &wechseln..." @@ -1040,11 +1051,11 @@ msgstr "Disc &wechseln..." msgid "Change Disc" msgstr "Disc wechseln" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Spiel wechseln" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1054,82 +1065,82 @@ msgstr "" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:47 msgid "Changes sign to zFar Parameter (after correction)" -msgstr "Parameter sign zu zFar ändern (nach Korrektur)" +msgstr "Sign zu zFar Parameter ändern (nach Korrektur)" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:42 msgid "Changes sign to zNear Parameter (after correction)" -msgstr "Parameter sign zu zNear ändern (nach Korrektur)" +msgstr "Sign zu zNear Parameter ändern (nach Korrektur)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "Änderung dieser Option zeigt keine Auswirkung, solange die Emulation läuft." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:34 msgid "Cheat Code" -msgstr "Cheat Code" +msgstr "Cheatcode" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Cheatsuche" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Cheat-Verwaltung" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Prüfe die Unversehrtheit der Partition" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." -msgstr "Prüfe die Unversehrtheit der Partition..." +msgstr "Prüfe Unversehrtheit..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinesisch (Vereinfacht)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinesisch (Traditionell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 -msgid "Choose a DVD root directory:" -msgstr "Wähle ein Standard DVD-Verzeichnis:" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 -msgid "Choose a NAND root directory:" -msgstr "Wähle ein NAND Stammverzeichnis" +msgid "Choose a DVD root directory:" +msgstr "Wähle ein DVD-Stammverzeichnis:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 +msgid "Choose a NAND root directory:" +msgstr "Wähle ein NAND-Stammverzeichnis:" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Standard ISO auswählen:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Ordner zum Hinzufügen auswählen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Datei zum Öffnen auswählen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:204 msgid "Choose a memory card:" -msgstr "Wähle eine Memory Card:" +msgstr "Wähle eine Speicherkarte:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" "Wähle eine Datei als Apploader aus: (Gilt nur für Discs aus Verzeichnissen)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Zielordner für Extraktion auswählen" @@ -1146,19 +1157,19 @@ msgstr "Klassik" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:537 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:968 msgid "Clear" -msgstr "Löschen" +msgstr "Leeren" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." msgstr "" -"Client kann während ein Spiel emmuliert wird, nicht verbunden werden! " -"NetPlay ist deaktiviert. Sie müssen zuerst manuell das Spiel beenden." +"Client kann während ein Spiel emuliert wird nicht verbunden werden! NetPlay " +"ist deaktiviert. Sie müssen zuerst manuell das Spiel beenden." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Schließen" @@ -1167,11 +1178,11 @@ msgstr "Schließen" msgid "Co&nfigure..." msgstr "&Einstellungen..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Code-Info" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Code:" @@ -1183,24 +1194,24 @@ msgstr "Befehl" msgid "Comment" msgstr "Kommentar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Kommentar:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "ISO komprimieren..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Ausgewählte ISOs komprimieren..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Komprimiere ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Einstellungen" @@ -1212,20 +1223,20 @@ msgstr "Einstellungen" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:102 msgid "Configure Control" -msgstr "Steuerung bearbeiten" +msgstr "Steuerung konfigurieren" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Pads konfigurieren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Einstellungen ...." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Ãœberschreiben Bestätigen" @@ -1238,17 +1249,16 @@ msgstr "Beim Beenden bestätigen" msgid "Connect" msgstr "Verbinden" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "USB-Tastatur angeschlossen" +msgstr "Balance Bord anschließen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" -msgstr "USB-Tastatur angeschlossen" +msgstr "USB-Tastatur verbunden" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Wiimote %i verbinden" @@ -1269,7 +1279,7 @@ msgstr "Wiimote 3 verbinden" msgid "Connect Wiimote 4" msgstr "Wiimote 4 verbinden" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Verbinden..." @@ -1279,7 +1289,7 @@ msgstr "Konsole" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:88 msgid "Continuous Scanning" -msgstr "" +msgstr "Durchgehendes Suchen" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:33 msgid "Control" @@ -1289,7 +1299,7 @@ msgstr "Strg" msgid "Convert to GCI" msgstr "Zu GCI konvertieren" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopieren fehlgeschlagen" @@ -1298,21 +1308,16 @@ msgstr "Kopieren fehlgeschlagen" msgid "Copy to Memcard %c" msgstr "Auf Memcard %c kopieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Kern" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "%s konnte nicht erstellt werden" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Konnte Backend %s nicht initialisieren." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1323,22 +1328,16 @@ msgstr "" "dies ist kein GC/Wii Backup. Bitte beachten Sie, dass die ursprünglichen GC/" "Wii-Discs von den meisten PC-DVD-Laufwerken nicht gelesen werden können." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Konnte ISO-Datei %s nicht erkennen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Konnte %s nicht speichern" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1362,11 +1361,11 @@ msgstr "" "Wenn einer dieser Fälle zutriffst, solltest du den Speicherort der " "Speicherkarte in den Optionen ändern." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" -msgstr "Konnte denn Befehl zum öffnen der Dateierweiterung 'ini' nicht finden!" +msgstr "Konnte den Befehl zum Öffnen der Dateierweiterung 'ini' nicht finden!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1374,17 +1373,17 @@ msgstr "" "Konnte Kern nicht initialisieren.\n" "Ãœberprüfe deine Konfiguration." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Anzahl:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Land:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "AR-Code erstellen" @@ -1403,7 +1402,7 @@ msgstr "Kritisch" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:560 msgid "Crop" -msgstr "Abschneiden" +msgstr "Zuschneiden" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:120 msgid "" @@ -1413,18 +1412,19 @@ msgid "" msgstr "" "Schneidet das Bild von 4:3 auf 5:4 bzw. von 16:9 auf 16:10 zurecht.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:52 msgid "Crossfade" -msgstr "Fadenkreuz" +msgstr "Ãœberblendung" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" +"Aktuelles Verzeichnis wurde gemäß wxFileSelector von %s nach %s geändert!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Benutzerdefinierter Projection-Hack" @@ -1432,11 +1432,11 @@ msgstr "Benutzerdefinierter Projection-Hack" msgid "Custom Projection Hack Settings" msgstr "Benutzerdefinierter Projection-Hack Einstellungen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." -msgstr "Einige orthographische Projection Parameter anpassen." +msgstr "Einige orthographische Projection-Parameter anpassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tschechisch" @@ -1448,36 +1448,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" -msgstr "DSP Emulator Engine" +msgstr "DSP-Emulations-Engine" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE Emulation (schnell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE Interpreter (langsam)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE Recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "DSP-Einstellungen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSP LLE in eigenem Thread" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD Laufwerk:" @@ -1491,15 +1491,15 @@ msgstr "" "DVDLowUnencryptedRead - Kritischer Fehler: Datenträger kann nicht gelesen " "werden." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Tanzmatte" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Datengröße" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Datum:" @@ -1528,35 +1528,34 @@ msgstr "Debug" msgid "Decimal" msgstr "Komma" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ISO dekomprimieren..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Ausgewählte ISOs dekomprimieren..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Dekomprimiere ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Spieleliste aktualisieren" +msgstr "Framebegrenzung reduzieren" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Standard" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" -msgstr "Standard ISO:" +msgstr "Standard-ISO:" #: Source/Core/DolphinWX/Src/LogWindow.cpp:107 msgid "Default font" -msgstr "Standard Schriftart" +msgstr "Standardschriftart" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:19 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:981 @@ -1570,7 +1569,7 @@ msgstr "Spielstand löschen" #: Source/Core/VideoCommon/Src/AVIDump.cpp:64 #, c-format msgid "Delete the existing file '%s'?" -msgstr "Wollen Sie die vorhandende Datei '%s' löschen?" +msgstr "Vorhandende Datei '%s' löschen?" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:680 msgid "Description" @@ -1586,14 +1585,16 @@ msgid "" "Detected attempt to read more data from the DVD than fit inside the out " "buffer. Clamp." msgstr "" +"Versuch erkannt, mehr Daten von der DVD zu lesen als in den Out Buffer " +"passen. Abgeklemmt." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:118 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:953 msgid "Device" msgstr "Gerät" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Geräteeinstellungen" @@ -1601,21 +1602,18 @@ msgstr "Geräteeinstellungen" msgid "Dial" msgstr "Skala" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" msgstr "" -"Die Verzeichnis-Prüfsumme ist fehlerhaft,\n" -"und ebenfalls die Backup-Verzeichnis-Prüfsumme." +"Verzeichnis-Prüfsumme und\n" +"Backup-Verzeichnis-Prüfsumme sind fehlerhaft." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:444 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:486 @@ -1624,7 +1622,7 @@ msgstr "Deaktivieren" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Destination Alpha deaktivieren" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1640,9 +1638,9 @@ msgid "" msgstr "" "Deaktiviert jegliche XFB-Emulation.\n" "Dadurch wird die Emulation beschleunigt, auf Kosten von vielen Problemen in " -"davon abhängigen Spielen (insbesondere Homebrew)´.\n" +"davon abhängigen Spielen (insbesondere Homebrew).\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:96 msgid "" @@ -1654,11 +1652,11 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "Deaktiviert die Emulation von EFB-Kopien.\n" -"Diese werden oft für Post-Processing- oder Render to Texture-Effekte " -"verwendet. Die Option ist zwar mit einer schnelleren Emulation verbunden, " +"Diese werden oft für Post-Processing- oder Render-to-Texture-Effekte " +"verwendet. Die Option ist zwar mit einer schnelleren Emulation verbunden " "aber verursacht fast immer Probleme.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 msgid "" @@ -1667,15 +1665,19 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Deaktiviert die Emulation einer Hardwarefunktion namens Destination Alpha, " +"welche in vielen Spielen für verschiedene grafische Effekte benutzt wird.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disc" #: Source/Core/DiscIO/Src/DriveBlob.cpp:94 #: Source/Core/DiscIO/Src/DriveBlob.cpp:113 msgid "Disc Read Error" -msgstr "Disc Lesefehler" +msgstr "Disc-Lesefehler" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:321 msgid "Display" @@ -1689,30 +1691,96 @@ msgid "" msgstr "" "Zeigt die vom Emulator gelesenen Eingaben an.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/WXInputBase.cpp:67 msgid "Divide" msgstr "Division" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Laufende Emulation stoppen?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" -msgstr "Dolby Pro Logic II Dekodierer" +msgstr "Dolby Pro Logic II Dekoder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin-Team\n" +"\n" +"Zweig: %s\n" +"Revision: %s\n" +"Kompiliert: %s @ %s\n" +"\n" +"Dolphin ist ein GameCube/Wii-Emulator der\n" +"ursprünglich von F|RES und ector geschrieben wurde.\n" +"Heute ist Dolphin ein Open Source-Projekt mit vielen\n" +"Mitwirkenden, zu vielen um sie alle aufzuzählen.\n" +"Wenn du interessiert bist, besuche die Projektseite\n" +"unter http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Besonderer Dank geht an Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 und Hotquik für ihr\n" +"Reverse Engineering und Dokumente / Demos.\n" +"\n" +"Großer Dank geht an Gilles Mouchard, dessen\n" +"Microlib PPC-Emulator unserer Entwicklung einen\n" +"großen Sprung nach vorne gab.\n" +"\n" +"Danke an Frank Wille für seinen PowerPC-Disassembler,\n" +"welchen or9 und wir um Gekko-Spezifika erweiterten.\n" +"\n" +"Danke an hcs/destop für ihren GC ADPCM-Dekodierer.\n" +"\n" +"Wir stehen in keiner Verbindung mit Nintendo.\n" +"GameCube und Wii sind Markenzeichen von Nintendo.\n" +"Der Emulator ist nur für Bildungszwecke und sollte nicht\n" +"für Spiele benutzt werden, die du nicht legal besitzt." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" -msgstr "Dolphin %s Grafik Einstellungen" +msgstr "Dolphin %s Grafikeinstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin-&Webseite" @@ -1722,58 +1790,57 @@ msgstr "Dolphin-Einstellungen" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:197 msgid "Dolphin Emulated Wiimote Configuration" -msgstr "Dolphin Emulierte-Wiimote Einstellungen" +msgstr "Dolphin Emulierte Wiimote-Einstellungen" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:382 msgid "Dolphin FIFO" msgstr "Dolphin-FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" -msgstr "Dolphin GCPad Konfiguration" +msgstr "Dolphin GCPad-Einstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" -msgstr "Dolphin TAS Filme (*.dtm)" +msgstr "Dolphin TAS-Filme (*.dtm)" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:8 msgid "Dolphin Wiimote Configuration" -msgstr "Dolphin Wiimote Einstellungen" +msgstr "Dolphin Wiimote-Einstellungen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin auf &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -"Dolphin konnte keine GC oder Wii ISOs finden. Hier doppelklicken um nach " -"ISOs zu suchen..." +"Dolphin konnte keine GC/Wii-ISOs finden. Hier doppelklicken um nach ISOs zu " +"suchen..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" -"Dolphin ist so eingestellt, dass alle Spiele versteckt werden. Hier " -"doppelklicken um alle Spiele anzuzeigen..." +"Dolphin versteckt momentan alle Spiele. Hier doppelklicken um alle Spiele " +"anzuzeigen..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin war nicht in der Lage die gewünschte Aktion auszuführen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Aktiviert schnellen Zugriff auf die Disc. Wird für einige Spiele benötigt. " -"(ON = Schnell, OFF = Kompatibel)" +"Verdoppelt die Taktfrequenz der emulierten GPU. Kann einige Spiele " +"beschleunigen (AN = Geschwindigkeit, AUS = Kompatibilität) " #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1782,7 +1849,7 @@ msgstr "Unten" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:45 msgid "Download Codes (WiiRD Database)" -msgstr "Codes Herunterladen (WiiRD)" +msgstr "Codes herunterladen (WiiRD-Datenbank)" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:292 #, c-format @@ -1793,11 +1860,11 @@ msgstr "%lu Codes heruntergeladen. (%lu hinzugefügt)" msgid "Drums" msgstr "Trommeln" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Dummy" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Audio dumpen" @@ -1822,7 +1889,7 @@ msgstr "" "Schreibt alle während der Emulation gerenderten Bilder in eine AVI-Datei in " "User/Dump/Frames.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:112 msgid "" @@ -1830,10 +1897,10 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Speichert alle während der Emulation decodierten Spiele-Texturen in den " +"Schreibt alle während der Emulation decodierten Spiele-Texturen in den " "Ordner User/Dump/Textures//.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:114 msgid "" @@ -1841,14 +1908,14 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Speichert alle während der Emulation erzeugten EFB-Kopien in den Ordner User/" +"Schreibt alle während der Emulation erzeugten EFB-Kopien in den Ordner User/" "Dump/Textures/.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holländisch" @@ -1858,7 +1925,7 @@ msgstr "&Beenden" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:442 msgid "EFB Copies" -msgstr "EFB Kopien" +msgstr "EFB-Kopien" #: Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp:210 #, c-format @@ -1868,27 +1935,27 @@ msgid "" "reboot is probably required at this point to get Windows to see the new " "driver." msgstr "" -"FEHLER: Diese Version von Dolphin benötigt einen TAP-Win32 Treiber, mit " +"FEHLER: Diese Version von Dolphin benötigt einen TAP-Win32-Treiber, mit " "mindestens Version %d.%d -- Wenn du Dolphin kürzlich aktualisiert hast, ist " "eventuell ein Neustart nötig, damit Windows den neuen Treiber erkennt." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:143 msgid "Early Memory Updates" -msgstr "Frühe Speicher Updates" +msgstr "Frühe Speicher-Updates" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Bearbeiten" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.h:17 msgid "Edit ActionReplay Code" -msgstr "ActionReplay Code bearbeiten" +msgstr "ActionReplay-Code bearbeiten" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Einstellungen bearbeiten" @@ -1896,12 +1963,12 @@ msgstr "Einstellungen bearbeiten" msgid "Edit Patch" msgstr "Patch bearbeiten" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Aktuelle Ansicht ändern" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Bearbeiten..." @@ -1911,9 +1978,9 @@ msgstr "Effekt" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:436 msgid "Embedded Frame Buffer" -msgstr "" +msgstr "Frame Buffer eingebunden" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Emu-Thread läuft bereits." @@ -1926,11 +1993,11 @@ msgid "" "If unsure, check virtual XFB emulation instead." msgstr "" "Aktiviert die exakte Emulation von XFB.\n" -"Dies beinträchtigt die emulationsgeschwindigkeit erheblich und verhindert " +"Dies beinträchtigt die Emulationsgeschwindigkeit erheblich und verhindert " "das Rendern in hohen Auflösungen, wird aber für die korrekte Emulation " "einiger Spiele benötigt.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel, aktiviere stattdessen die virtuelle XFB-Emulation." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:110 msgid "" @@ -1943,19 +2010,19 @@ msgid "" msgstr "" "Emuliert XFB unter Verwendung von GPU-Texturobjekten.\n" "Dies behebt Probleme in vielen Spielen, die ohne XFB-Emulation nicht " -"funktionieren und nebenbei erheblich schneller als die exakte XFB-Emulation " -"ist. Dennoch ist diese Option für viele Spiele (insbesondere Homebrew) nicht " +"funktionieren und ist nicht so langsam wie die tatsächliche XFB-Emulation. " +"Dennoch ist diese Option für viele Spiele (insbesondere Homebrew) nicht " "ausreichend.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Emulated Wiimote" msgstr "Emulierte Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " -msgstr "Status:" +msgstr "Emulationsstatus:" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:22 msgid "Enable" @@ -1970,21 +2037,22 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Aktiviert, sofern von deiner GPU unterstützt, 3D-Effekte mittels " -"Stereoskopie unter Verwendung der Nvidia 3D Vision-Technologie.\n" -"Verursacht gerne Probleme und funktioniert nur im Vollbildmodus.\n" +"Aktiviert 3D-Effekte mittels Stereoskopie unter Verwendung der Nvidia 3D " +"Vision-Technologie, sofern von deiner GPU unterstützt,.\n" +"Verursacht möglicherweise Probleme.\n" +"Funktioniert nur im Vollbildmodus.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" -msgstr "AR Logging aktivieren" +msgstr "AR-Logging aktivieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Blockvereinigung aktivieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Aktiviere Bounding Box Calculation" @@ -1996,7 +2064,7 @@ msgstr "Aktiviere Cache" msgid "Enable Cheats" msgstr "Cheats aktivieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Dual Core aktivieren" @@ -2004,15 +2072,15 @@ msgstr "Dual Core aktivieren" msgid "Enable Dual Core (speedup)" msgstr "Dual Core aktivieren (Beschleunigung)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Idle-Skipping aktivieren" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:548 msgid "Enable Idle Skipping (speedup)" -msgstr "Idle-Skipping aktivieren (schneller)" +msgstr "Idle-Skipping aktivieren (Beschleunigung)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "MMU aktivieren" @@ -2020,17 +2088,17 @@ msgstr "MMU aktivieren" msgid "Enable Progressive Scan" msgstr "Progressiven Scan aktivieren" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Bildschirmschoner aktivieren" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "" +msgstr "Lautsprecherdaten aktivieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" -msgstr "Breitbildmodus" +msgstr "Breitbild aktivieren" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:527 msgid "Enable Wireframe" @@ -2044,14 +2112,19 @@ msgid "" "\n" "If unsure, select 1x." msgstr "" +"Anisotropische Filterung aktivieren.\n" +"Verbessert die Texturenqualität bei schrägen Blickwinkeln.\n" +"Kann bei einigen wenigen Spielen Fehler verursachen.\n" +"\n" +"Im Zweifel, wähle 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" msgstr "" "Aktiviert schnellen Zugriff auf die Disc. Wird für einige Spiele benötigt. " -"(ON = Schnell, OFF = Kompatibel)" +"(AN = Geschwindigkeit, AUS = Kompatibilität)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:803 msgid "Enable pages" @@ -2064,6 +2137,11 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Aktiviere dies, wenn du den ganzen Bildschirm zum Rendern verwenden " +"möchtest.\n" +"Wenn dies deaktiviert ist, wird ein Renderfenster erstellt.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:80 msgid "" @@ -2072,39 +2150,37 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Aktiviere dies, wenn du das Hauptfenster von Dolphin zum Rendern verwenden " +"willst anstelle eines getrennten Renderfensters.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "" -"Dies aktivieren, um \"The Legend of Zelda: Twilight Princess\" zu " -"beschleunigen. Dies für JEDES andere Spiel deaktivieren." +"Aktiviere dies, um \"The Legend of Zelda: Twilight Princess\" zu " +"beschleunigen. Für JEDES andere Spiel deaktivieren." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Benutzerdefinierten Projection-Hack aktivieren" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -"Dolby Pro Logic II Emulation wird aktiviert, indem 5.1 Surround verwendet " +"Dolby Pro Logic II-Emulation wird aktiviert, indem 5.1 Surround verwendet " "wird. Nicht für OS X verfügbar." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" -"Dolby Pro Logic II Emulation wird aktiviert, indem 5.1 Surround verwendet " -"wird. Funktioniert nur mit OpenAL backend." - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" +"Dolby Pro Logic II-Emulation wird aktiviert, indem 5.1 Surround verwendet " +"wird. Funktioniert nur mit OpenAL Backend." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" @@ -2113,14 +2189,19 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Aktiviert Progressiven Scan wenn er von der emulierten Software unterstützt " +"wird.\n" +"Dies betrifft die meisten Spiele nicht.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" msgstr "" -"Aktiviert die Speicher-Verwaltungs-Einheit, die für einige Spiele gebraucht " -"wird. (ON = Kompatibel, OFF = Schnell)" +"Aktiviert die Speicher-Verwaltungseinheit, die für einige Spiele gebraucht " +"wird. (AN = Kompatibilität, AUS = Geschwindigkeit)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:117 msgid "" @@ -2128,14 +2209,17 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Frame Dumps mit dem FFV1-Codec komprimieren.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/WXInputBase.cpp:40 msgid "End" msgstr "Ende" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Englisch" @@ -2158,30 +2242,29 @@ msgstr "Eintrag %d/%d" msgid "Entry 1/%d" msgstr "Eintrag 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Gleich" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Fehler" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -"Fehler beim Laden der ausgewählten Sprache. Kehre nun zu dem Systemstandart " +"Fehler beim Laden der ausgewählten Sprache. Kehre nun zum Systemstandard " "zurück." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " "Aborting savestate load..." msgstr "" -"Fehler: Nach \"%s\" wurde %d (0x%X), anstatt %d (0x%X) gefunden. Spielstand " -"laden wird abgebrochen..." +"Fehler: Nach \"%s\" wurde %d (0x%X), anstatt Save Marker %d (0x%X) gefunden. " +"Spielstand laden wird abgebrochen..." #: Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp:329 #, c-format @@ -2190,7 +2273,8 @@ msgid "" "fonts correctly, or crash." msgstr "" "Fehler: Versuche auf Schriftart %s zuzugreifen, aber sie wurde nicht " -"geladen. Das Spiel wird die Schriftart nicht anzeigen, oder Abstürzen." +"geladen. Spiele werden die Schriftart nicht korrekt darstellen oder " +"abstürzen." #: Source/Core/DolphinWX/Src/WXInputBase.cpp:17 msgid "Escape" @@ -2198,28 +2282,31 @@ msgstr "Escape" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:30 msgid "Euphoria" -msgstr "Euphorie" +msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" -msgstr "" +msgstr "Ausnahmeprotokoll - Zugriff unter Speicherplatz. %08llx%08llx" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:48 msgid "Execute" msgstr "Ausführen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Beenden" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Alle Wii-Spielstände exportieren" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Exportieren fehlgeschlagen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Datei exportieren" @@ -2227,7 +2314,7 @@ msgstr "Datei exportieren" msgid "Export Recording" msgstr "Aufnahme exportieren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Aufnahme exportieren..." @@ -2235,29 +2322,29 @@ msgstr "Aufnahme exportieren..." msgid "Export Save" msgstr "Spielstand exportieren" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" -msgstr "Wii Spielstand exportieren (Experimentell)..." +msgstr "Wii-Spielstand exportieren (Experimentell)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:793 msgid "Export all saves" msgstr "Alle Spielstände exportieren" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportieren fehlgeschlagen, ein weiteres mal versuchen?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Exportieren fehlgeschlagen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Spielstand exportieren als..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Erweiterung" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:484 msgid "External Frame Buffer" -msgstr "" +msgstr "Externer Frame Buffer" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:48 msgid "Extra Parameter" @@ -2267,64 +2354,64 @@ msgstr "Extra Parameter" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Extra Parameter nur in ''Metroid: Other M'' sinnvoll." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Alle Dateien extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Apploader extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOL extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Ordner extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Datei extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Partition extrahieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extrahiere %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extrahiere alle Dateien" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" -msgstr "Extrahiere Ordner" +msgstr "Extrahiere Verzeichnis" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extrahieren..." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:904 msgid "FIFO Byte" -msgstr "FIFO Byte" +msgstr "FIFO-Byte" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:32 msgid "FIFO Player" -msgstr "FIFO Player" +msgstr "FIFO-Player" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANKREICH" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" -msgstr "FST Größe:" +msgstr "FST-Größe:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Verbindungsaufbau fehlgeschlagen!" @@ -2332,11 +2419,15 @@ msgstr "Verbindungsaufbau fehlgeschlagen!" msgid "Failed to download codes." msgstr "Download der Codes fehlgeschlagen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Extrahieren nach %s ist fehlgeschlagen!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2349,6 +2440,15 @@ msgid "" "You may use the DSP HLE engine which does not require ROM dumps.\n" "(Choose it from the \"Audio\" tab of the configuration dialog.)" msgstr "" +"DSP-ROM konnte nicht geladen werden:\t %s\n" +"\n" +"Diese Datei wird für DSP LLE benötigt.\n" +"Sie ist nicht in Dolphin enthalten, da sie urheberrechtlich geschützte Daten " +"beinhaltet.\n" +"Benutze DSPSpy um die Datei von deiner echten Konsole zu dumpen.\n" +"\n" +"Du kannst die DSP HLE-Engine benutzen, welche keine ROM-Dumps benötigt.\n" +"(Diese kannst du im Audio-Tab in den Einstellungen auswählen.)" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:108 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:131 @@ -2356,6 +2456,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Bthprops.cpl konnte nicht geladen werden! Echte Wiimotes werden nicht " +"funktionieren und Dolphin kann unerwartet abstürzen!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2363,21 +2465,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Hid.dll konnte nicht geladen werden! Echte Wiimotes werden nicht " +"funktionieren und Dolphin kann unerwartet abstürzen!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Konnte %s nicht lesen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Fehler beim Lesen von banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" -msgstr "" +msgstr "Fehler beim Lesen des BK-Headers" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2388,83 +2492,88 @@ msgstr "" "Die Speicherkarte ist vermutlich unvollständig.\n" "FilePosition: %llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -"Konnte das Blockzuteilungtabellen-Backup nicht richtig lesen\n" +"Konnte das Blockzuteilungtabellen-Backup nicht korrekt lesen\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -"Konnte die Blockzuteilungtabellen nicht richtig lesen\n" +"Konnte die Blockzuteilungtabellen nicht korrekt lesen\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Fehler beim Lesen von Daten aus Datei %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" -msgstr "" +msgstr "Fehler beim Lesen von Daten aus der Datei: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -"Konnte das Backup-Verzeichnis nicht richtig lesen\n" +"Konnte das Backup-Verzeichnis nicht korrekt lesen\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -"Konnte das Verzeichnis nicht richtig lesen\n" +"Konnte das Verzeichnis nicht korrekt lesen\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "Fehler beim Lesen des Headers" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -"Konnte den Header nicht richtig lesen\n" +"Konnte den Header nicht korrekt lesen\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Fehler beim Lesen des Headers für Datei %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Fehler beim Lesen einer eindeutigen ID des Disc-Images." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Fehler beim Schreiben von BT.DINF nach SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Fehler beim Schreiben von bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Fehler beim Schreiben von Daten in Datei: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Fehler beim Schreiben eines Header für %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Fehler beim Schreiben eines Header für Datei %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2474,21 +2583,23 @@ msgstr "Schnell" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Schnelle Tiefenberechnung" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." -msgstr "Schnellere Version der MMU. Funktioniert nicht mit allen Spielen." +msgstr "Schnelle Version der MMU. Funktioniert nicht mit allen Spielen." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" +"Fataler Desync. Wiedergabe wird abgebrochen. (Fehler in PlayWiimote: %u != " +"%u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" -msgstr "Fifo Player" +msgstr "Fifo-Player" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:86 msgid "File Info" @@ -2510,33 +2621,33 @@ msgstr "" "Datei konnte nicht geöffnet werden\n" "oder hat keine gültige Erweiterung" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" "valid extensions are (.raw/.gcp)" msgstr "" -"Die Datei besitzt die Erweiterung \"%s\",\n" +"Datei besitzt die Erweiterung \"%s\",\n" "gültige Erweiterungen sind (.raw/.gcp)." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:412 msgid "File is not recognized as a memcard" -msgstr "Diese Datei wird nicht als Memorycard anerkannt." +msgstr "Diese Datei wird nicht als Speicherkarte erkannt." -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Datei nicht komprimiert" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" -msgstr "FileIO: Unbekanter Open-Modus : 0x%02x" +msgstr "FileIO: Unbekanter Öffnen-Modus : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Dateisystem" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Der Datentyp 'ini' ist unbekannt! Wird nicht geöffnet!" @@ -2579,6 +2690,12 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Erzwingt Texturfilterung, auch wenn das emulierte Spiel dies explizit " +"deaktiviert.\n" +"Verbessert die Texturenqualität geringfügig aber verursacht Fehler in " +"einigen Spielen.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:83 msgid "" @@ -2588,23 +2705,26 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "Zwingt das Spiel, Grafiken für Breitbild-Auflösungen auszugeben.\n" -"Dies kann Grafikfehler verursachen!\n" +"Dies kann Grafikfehler verursachen.\n" "\n" -"Aktiviere diese Option nur, wenn du weißt, was du tust." +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" +"Erzwingt den NTSC-J-Modus um die japanische ROM-Schriftart zu verwenden.\n" +"Deaktiviert benutzt Dolphin die Standardeinstellung NTSC-U und aktiviert " +"diese Option automatisch wenn japanische Spiele gespielt werden." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" msgstr "" -"Das Format ähnelt dem ASCII-Zeichensatz (NTSC\\PAL)?\n" +"Als ASCII-Zeichensatz formatieren (NTSC/PAL)?\n" "Wähle 'Nein' für SJIS (NTSC-J)." #: Source/Core/InputCommon/Src/ControllerEmu.cpp:266 @@ -2613,13 +2733,18 @@ msgstr "Vorwärts" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Port öffnen (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "%d Ergebnisse gefunden für '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "%x Spielstände gefunden." + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2635,7 +2760,7 @@ msgstr "Einzelbildwiedergabe" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:547 msgid "Frame Dumps use FFV1" -msgstr "" +msgstr "Frame-Dumps verwenden FFV1" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:215 msgid "Frame Info" @@ -2643,7 +2768,7 @@ msgstr "Bildinfo" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:103 msgid "Frame Range" -msgstr "" +msgstr "Bildbereich" #: Source/Core/DolphinWX/Src/FrameTools.cpp:139 msgid "Frame S&kipping" @@ -2659,24 +2784,24 @@ msgstr "Bilder zum Aufzeichnen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:545 msgid "Free Look" -msgstr "Frei Umsehen" +msgstr "Freies Umsehen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Französisch" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:42 msgid "Frets" -msgstr "" +msgstr "Frets" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:105 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:124 msgid "From" -msgstr "von" +msgstr "Von" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Vollbild" @@ -2686,43 +2811,43 @@ msgstr "Vollbildauflösung:" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:524 msgid "GCI File(*.gci)" -msgstr "GCI Datei(*.gci)" +msgstr "GCI-Datei(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" -msgstr "GC-Pad" +msgstr "GCPad" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:667 msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Spiel-ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" -msgstr "Spiel wird bereits emuliert!" +msgstr "Spiel läuft bereits!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" -msgstr "Spiel wird nicht emuliert!" +msgstr "Spiel läuft nicht!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Spiel nicht gefunden!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" -msgstr "Spiel-Spezifische Einstellungen" +msgstr "Spielspezifische Einstellungen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Spieleinstellungen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:515 msgid "GameCube Savegame files(*.gci;*.gcs;*.sav)" -msgstr "GameCube Speicherdateien (*.gci;*.gcs;*.sav)" +msgstr "GameCube-Speicherdateien (*.gci;*.gcs;*.sav)" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:541 msgid "Gamecube" @@ -2730,23 +2855,23 @@ msgstr "Gamecube" #: Source/Core/DolphinWX/Src/FrameTools.cpp:180 msgid "Gamecube &Pad Settings" -msgstr "GameCube &Pad Einstellungen" +msgstr "GameCube &Pad-Einstellungen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Gamecube-Speicherkarten (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" -msgstr "Gamecube Pad Einstellungen" +msgstr "Gamecube Pad-Einstellungen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko-Codes" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2754,6 +2879,10 @@ msgid "" "native code handler by placing the codehandler.bin file into the Sys " "directory and restarting Dolphin.)" msgstr "" +"Fehler beim Starten von GeckoCodes (CT%i CST%i) (%s)\n" +"(Fehlerhafter Code oder der Code-Typ wird noch nicht unterstützt. Versuche " +"den nativen Code-Handler zu benutzen, indem du die Datei Codehandler.bin in " +"das Sys-Verzeichnis verschiebst und Dolphin neustartest.)" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:160 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:538 @@ -2765,26 +2894,26 @@ msgstr "Allgemein" msgid "General Settings" msgstr "Allgemeine Einstellungen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Deutsch" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Der Index ist größer als AR-Codelisten-Größe %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafik" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Grafikeinstellungen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Größer als" @@ -2798,8 +2927,15 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Verbessert die Qualität von Texturen, die durch den Render-to-Texture-Effekt " +"generiert werden, deutlich.\n" +"Erhöhe die interne Auflösung um diesen Effekt zu verstärken.\n" +"Reduziert die Leistung geringfügig und kann Abstürze verursachen (wenn auch " +"unwahrscheinlich).\n" +"\n" +"Im Zweifel aktiviert lassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Griechisch" @@ -2823,11 +2959,11 @@ msgstr "Gitarre" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Header-Prüfsumme fehlerhaft" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebräisch" @@ -2839,7 +2975,7 @@ msgstr "Höhe" msgid "Help" msgstr "Hilfe" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2850,8 +2986,17 @@ msgid "" "\n" "Sayonara!\n" msgstr "" +"Hi,\n" +"\n" +"Dolphin benötigt Mac OS X 10.7 oder besser.\n" +"Leider besitzt du eine alte Version von OS X.\n" +"Die letzte Dolphin-Version die OS X 10.6 unterstützt ist Dolphin 3.5\n" +"Bitte upgrade auf 10.7 oder besser um die neueste Dolphin-Version zu " +"benutzen.\n" +"\n" +"Sayonara!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2862,7 +3007,7 @@ msgid "" msgstr "" "Hi,\n" "\n" -"Dolphin benötigt einen CPU der SSE2 unterstützt.\n" +"Dolphin benötigt einen CPU der SSE2-Erweiterungen unterstützt.\n" "Leider unterstützt Ihr CPU dies nicht, deshalb wird Dolphin nicht " "ausgeführt.\n" "\n" @@ -2874,7 +3019,7 @@ msgstr "Verbergen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:308 msgid "Hide Mouse Cursor" -msgstr "Mauszeiger ausblenden" +msgstr "Mauszeiger verstecken" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:79 msgid "" @@ -2882,6 +3027,9 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Versteckt den Mauszeiger, wenn er sich über dem Emulationsfenster.\n" +"\n" +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/WXInputBase.cpp:41 msgid "Home" @@ -2894,14 +3042,14 @@ msgstr "Host" #: Source/Core/DolphinWX/Src/HotkeyDlg.h:31 msgid "Hotkey Configuration" -msgstr "Kurztastenbelegung" +msgstr "Tastenkürzelbelegung" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:288 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:581 msgid "Hotkeys" -msgstr "Kurztasten" +msgstr "Tastenkürzel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Ungarisch" @@ -2909,31 +3057,35 @@ msgstr "Ungarisch" msgid "Hybrid Wiimote" msgstr "Hybride Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Versucht Daten von einem unbekannten Ticket zu bekommen: " "%08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" +"IOCTL_ES_LAUNCH: Das Spiel versucht ein IOS oder einen Titel der nicht in " +"deinem NAND-Dump verfügbar ist neu zu laden.\n" +"TitleID %016llx.\n" +"Dolphin wird sich jetzt wahrscheinlich aufhängen." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - Fehlerhaftes Ziel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL-Einstellungen" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2945,15 +3097,15 @@ msgstr "IR-Zeiger" msgid "IR Sensitivity:" msgstr "IR-Empfindlichkeit:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO-Details" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO-Verzeichnisse" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIEN" @@ -2961,11 +3113,13 @@ msgstr "ITALIEN" msgid "Icon" msgstr "Symbol" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." msgstr "" +"Wenn aktiviert werden die Bounding Box-Register aktualisiert. Wird von den " +"Paper Mario-Spielen verwendet." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:439 msgid "Ignore Format Changes" @@ -2979,6 +3133,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Ignoriere jegliche Änderung am EFB-Format.\n" +"Verbessert die Leistung in vielen Spielen ohne negative Auswirkungen, in " +"einigen wenigen erzeugt es allerdings Grafikfehler.\n" +"\n" +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:94 msgid "" @@ -2988,21 +3147,30 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Ignoriert jegliche Anfragen der CPU von der EFB zu lesen oder zu schreiben.\n" +"Verbessert die Leistung in einigen Spielen, kann aber einige spielabhängige " +"oder grafische Effekte deaktivieren.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:791 msgid "Import Save" msgstr "Spielstand importieren" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importieren fehlgeschlagen, noch einmal versuchen?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Wii-Spielstand importieren" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importieren fehlgeschlagen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" "Imported file has gsc extension\n" "but does not have a correct header" msgstr "" -"Die importierte Datei hat die Erweiterung gsc, aber besitzt keinen korrekten " +"Importierte Datei hat die Erweiterung GSC, aber besitzt keinen korrekten " "Header." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:429 @@ -3014,24 +3182,19 @@ msgid "" "Imported file has sav extension\n" "but does not have a correct header" msgstr "" -"Importierte Datei hat die Erweiterung sav,\n" +"Importierte Datei hat die Erweiterung SAV,\n" "aber besitzt keinen korrekten Header." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Im Spiel" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "In-Game" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Framelimit:" +msgstr "Framebegrenzung erhöhen" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3051,63 +3214,66 @@ msgstr "Einfügen" msgid "Insert Encrypted or Decrypted code here..." msgstr "Verschlüsselten oder unverschlüsselten Code hier eingeben..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" -msgstr "SD-Karte eingesetzt" +msgstr "SD-Karte einfügen" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:21 msgid "Insert name here.." -msgstr "Namen hier eingeben.." +msgstr "Name hier eingeben.." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "WAD installieren" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Zum Wii-Menü hinzufügen" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -"InstallExceptionHandler aufgerufen, aber diese Platform unterstüzt diesn " +"InstallExceptionHandler aufgerufen, aber diese Platform unterstüzt diesen " "noch nicht." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "WAD installieren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" -msgstr "" +msgstr "Fehler bei der Unversehrtheitsprüfung" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" -msgstr "" +msgstr "Unversehrtheitsprüfung abgeschlossen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." -msgstr "" +msgstr "Unversehrtheitsprüfung abgeschlossen. Es wurden keine Fehler gefunden." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " "or has been patched incorrectly." msgstr "" +"Unversehrtheitsprüfung für Partition %d fehlgeschlagen. Der Dump ist " +"möglicherweise fehlerhaft oder wurde fehlerhaft gepatcht." #: Source/Core/DolphinWX/Src/ConfigMain.cpp:539 msgid "Interface" -msgstr "Oberfläche" +msgstr "Benutzeroberfläche" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Benutzeroberflächeneinstellungen" #: Source/Core/Core/Src/State.cpp:269 msgid "Internal LZO Error - compression failed" -msgstr "Internationaler LZO-Fehler - Komprimierung fehlgeschlagen" +msgstr "Interner LZO-Fehler - Komprimierung fehlgeschlagen" #: Source/Core/Core/Src/State.cpp:393 #, c-format @@ -3115,32 +3281,31 @@ msgid "" "Internal LZO Error - decompression failed (%d) (%li, %li) \n" "Try loading the state again" msgstr "" -"Internationaler LZO-Fehler - Dekomprimierung fehlgeschlagen (%d) (%li, " -"%li) \n" -"Versuche diesen Status nochmal zu laden." +"Interner LZO-Fehler - Dekomprimierung fehlgeschlagen (%d) (%li, %li) \n" +"Versuche diesen Stand nochmal zu laden." #: Source/Core/Core/Src/State.cpp:530 msgid "Internal LZO Error - lzo_init() failed" -msgstr "Internationaler LZO-Fehler - lzo_init() fehlerhaft" +msgstr "Interner LZO-Fehler - lzo_init() fehlgeschlagen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:353 msgid "Internal Resolution:" -msgstr "" +msgstr "Interne Auflösung:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (SEHR langsam)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" -msgstr "" +msgstr "Ungültige Größe(%x) oder Magisches Wort (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Ungültiger Wert!" @@ -3148,70 +3313,72 @@ msgstr "Ungültiger Wert!" msgid "Invalid bat.map or dir entry" msgstr "Ungültige bat.map oder Verzeichnis-Eintrag" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Ungültiger Ereignis-Typ %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ungültige Datei" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" "%s\n" " You may need to redump this game." msgstr "" -"Ungültige opening.bnr gefunden in gcm:\n" +"Ungültige opening.bnr gefunden in GCM:\n" "%s\n" -" Möglicherweise müssen Sie dieses Spiel neu dumpen." +"Möglicherweise müssen Sie dieses Spiel neu dumpen." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ungültige Aufnahmedatei" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:471 msgid "Invalid search parameters (no object selected)" -msgstr "" +msgstr "Ungültige Suchparameter (kein Objekt ausgewählt)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:454 msgid "Invalid search string (couldn't convert to number)" -msgstr "" +msgstr "Ungültiger Suchbegriff (konnte nicht zu Zahl konvertieren)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:442 msgid "Invalid search string (only even string lengths supported)" -msgstr "" +msgstr "Ungültiger Suchbegriff (nur gerade Zeichenlängen werden unterstützt)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" -msgstr "Ungültiger Status" +msgstr "Ungültiger Stand" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italienisch" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT-Recompiler (Empfohlen)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL-Recompiler (Experimentell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japanisch" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3221,17 +3388,21 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Spielfenster überlappt alle anderen Fenster.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:307 msgid "Keep window on top" -msgstr "" +msgstr "Fenster immer im Vordergrund" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:257 msgid "Key" msgstr "Taste" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Koreanisch" @@ -3253,12 +3424,12 @@ msgstr "L-Analog" msgid "Language:" msgstr "Sprache:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Letzte %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latenz:" @@ -3276,8 +3447,8 @@ msgid "" "Left click to detect hotkeys.\n" "Enter space to clear." msgstr "" -"Zum Erkennen, auf Tastenkürzel linksklicken.\n" -"Drücken Sie die Leertaste, zum löschen." +"Zum Erkennen der Tastenkürzel linksklicken.\n" +"Leertaste zum Löschen." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:742 msgid "" @@ -3294,16 +3465,16 @@ msgid "" "Left/Right-click for more options.\n" "Middle-click to clear." msgstr "" -"Links/Rechts-Klick für mehr Optionen.\n" +"Links-/Rechtsklick für weitere Optionen.\n" "Mittlere Maustaste zum Löschen." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Kleiner als" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:552 msgid "Limit by FPS" -msgstr "" +msgstr "FPS beschränken" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:979 msgid "Load" @@ -3314,104 +3485,93 @@ msgid "Load Custom Textures" msgstr "Lade benutzerdefinierte Texturen" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "Spielstand &laden" +msgstr "Lade Status" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Status aus Slot 1 laden" +msgstr "Lade Status zuletzt 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Status aus Slot 2 laden" +msgstr "Lade Status zuletzt 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Status aus Slot 3 laden" +msgstr "Lade Status zuletzt 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Status aus Slot 4 laden" +msgstr "Lade Status zuletzt 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Status aus Slot 5 laden" +msgstr "Lade Status zuletzt 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Status aus Slot 6 laden" +msgstr "Lade Status zuletzt 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Status aus Slot 7 laden" +msgstr "Lade Status zuletzt 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Status aus Slot 8 laden" +msgstr "Lade Status zuletzt 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "Status aus Slot 1 laden" +msgstr "Stand aus Slot 1 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Status aus Slot 1 laden" +msgstr "Lade Status aus Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "Status aus Slot 2 laden" +msgstr "Stand aus Slot 2 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "Status aus Slot 3 laden" +msgstr "Stand aus Slot 3 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "Status aus Slot 4 laden" +msgstr "Stand aus Slot 4 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "Status aus Slot 5 laden" +msgstr "Stand aus Slot 5 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "Status aus Slot 6 laden" +msgstr "Stand aus Slot 6 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "Status aus Slot 7 laden" +msgstr "Stand aus Slot 7 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "Status aus Slot 8 laden" +msgstr "Stand aus Slot 8 laden" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Status aus Slot 1 laden" +msgstr "Lade Status aus Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." -msgstr "Status laden..." +msgstr "Stand laden..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wii-Systemmenü laden" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" -msgstr "Wii-Systemmenü %d%c laden" +msgstr "Wii-Systemmenü laden %d%c" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:113 msgid "" @@ -3419,14 +3579,13 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Benutzerdefinierte Texturen aus User/Load/Textures// laden.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/PHackSettings.cpp:37 msgid "Load preset values from hack patterns available." -msgstr "" - -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Lokal" +msgstr "Voreinstellungswerte aus Hackvorlagen verfügbar" #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" @@ -3434,15 +3593,15 @@ msgstr "Log" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:13 msgid "Log Configuration" -msgstr "" +msgstr "Log-Einstellungen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:305 msgid "Log FPS to file" -msgstr "" +msgstr "FPS in Datei loggen" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:83 msgid "Log Types" -msgstr "" +msgstr "Log-Typen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:104 msgid "" @@ -3451,17 +3610,22 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Gerenderte Frames pro Sekunde in User/Logs/fps.txt loggen.\n" +"Verwenden Sie diese Funktion wenn Sie die Leistung von Dolphin messen " +"wollen.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:68 msgid "Logger Outputs" -msgstr "" +msgstr "Logger-Ausgabe" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Logging" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Die Verbindung zum Server wurde getrennt!" @@ -3469,34 +3633,34 @@ msgstr "Die Verbindung zum Server wurde getrennt!" msgid "M Button" msgstr "Mittlere Taste" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -"MD5 Konflikt\n" +"Unterschiedliche MD5-Prüfsummen\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Speed Hack" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:517 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:556 msgid "MadCatz Gameshark files(*.gcs)" -msgstr "MadCatz Gameshark Dateien(*.gcs)" +msgstr "MadCatz Gameshark-Dateien(*.gcs)" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:63 #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:38 msgid "Main Stick" msgstr "Main Stick" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Hersteller-ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Hersteller:" @@ -3508,6 +3672,12 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Macht entfernte Objekte deutlicher indem Nebel entfernt wird, erhöht dadurch " +"die allgemeine Detailfülle.\n" +"Nebel zu deaktivieren kann einige Spiele unspielbar machen, die die korrekte " +"Nebelemulation benötigen.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:113 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:116 @@ -3516,18 +3686,19 @@ msgstr "Max" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:435 msgid "Memcard already has a save for this title" -msgstr "Die Speicherkarte enthält bereits ein Spiel mit dem gleichen Titel." +msgstr "" +"Die Speicherkarte enthält bereits einen Speicherstand für diesen Titel." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:278 msgid "Memcard already opened" -msgstr "Memorycard ist bereits geöffnet" +msgstr "Speicherkarte ist bereits geöffnet" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:924 msgid "Memory Byte" -msgstr "Seicherbyte" +msgstr "Speicherbyte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Speicherkarte" @@ -3536,10 +3707,10 @@ msgid "" "Memory Card Manager WARNING-Make backups before using, should be fixed but " "could mangle stuff!" msgstr "" -"Memory-Card Manager WARNUNG - Erstelle Backups bevor der Benutzung. Dies " -"sollte zwar gefixt sein, aber könnte dennoch Probleme machen (mangle stuff)!" +"Speicherkarten-Manager WARNUNG - Erstelle Backups vor der Benutzung. Dies " +"sollte zwar behoben sein, aber könnte dennoch Fehler verursachen!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3549,14 +3720,14 @@ msgid "" "%s\n" "Would you like to copy the old file to this new location?\n" msgstr "" -"Der Memory Card Dateiname in Slot %c is ungültig,\n" -"die Region ist nicht festgelegt.\n" +"Der Speicherkarten-Dateiname in Slot %c is ungültig,\n" +"Region ist nicht festgelegt.\n" "\n" -"Slot %c Path wurde geändert zu:\n" +"Slot %c Pfad wurde geändert zu:\n" "%s\n" -"Möchten Sie die alte Datei, zu diesem neuen Speicherort kopieren?\n" +"Möchten Sie die alte Datei zum neuen Speicherort kopieren?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "Die Dateigröße der Speicherkarte stimmt nicht mit der Dateigrößenangabe im " @@ -3566,7 +3737,7 @@ msgstr "" msgid "Menu" msgstr "Menü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mikrofon" @@ -3579,7 +3750,7 @@ msgstr "Min" msgid "Misc" msgstr "Sonstiges" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Sonstige Einstellungen" @@ -3595,16 +3766,20 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Modifiziere Texturen um das Format anzuzeigen, in dem sie geschrieben sind. " +"Benötigt in den meisten Fällen einen Reset der Emulation.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/LogWindow.cpp:108 msgid "Monospaced font" -msgstr "Monospaced Schriftart" +msgstr "Schrift mit gleichmäßigen Zeichenabständen" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3630,7 +3805,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:62 msgid "Multiply" -msgstr "Multiplikation" +msgstr "Multiplizieren" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:659 msgid "NOP" @@ -3638,7 +3813,7 @@ msgstr "NOP" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:637 msgid "NOTE: Stream size doesn't match actual data length\n" -msgstr "" +msgstr "HINWEIS: Streamgröße entspricht nicht der tatsächlichen Datenlänge\n" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:116 msgid "NP Add" @@ -3678,7 +3853,7 @@ msgstr "Num Gleich" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:103 msgid "NP Home" -msgstr "" +msgstr "Num Home" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:112 msgid "NP Insert" @@ -3706,7 +3881,7 @@ msgstr "Num Rechts" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:117 msgid "NP Separator" -msgstr "" +msgstr "Num Trennzeichen" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:96 msgid "NP Space" @@ -3724,15 +3899,15 @@ msgstr "Num Tab" msgid "NP Up" msgstr "Num Hoch" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Name:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Name: " @@ -3740,9 +3915,9 @@ msgstr "Name: " #: Source/Core/DolphinWX/Src/MemcardManager.cpp:516 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:555 msgid "Native GCI files(*.gci)" -msgstr "Native GCI Dateien(*.gci)" +msgstr "Native GCI-Dateien(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Neue Suche" @@ -3751,7 +3926,7 @@ msgstr "Neue Suche" msgid "Next Page" msgstr "Nächste Seite" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Nächste Suche" @@ -3759,22 +3934,22 @@ msgstr "Nächste Suche" msgid "Nickname :" msgstr "Nickname:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Kein Land (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Keine ISOs oder WADs gefunden" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "Keine Audioausgabe" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" -msgstr "Keine Banner-Datei für Tittel %s gefunden." +msgstr "Keine Banner-Datei für Titel %s gefunden." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:771 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:778 @@ -3783,7 +3958,7 @@ msgstr "Keine Beschreibung vorhanden" #: Source/Core/DolphinWX/Src/FrameAui.cpp:535 msgid "No docking" -msgstr "Nicht Andocken" +msgstr "Kein Docking" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:871 msgid "No file loaded" @@ -3795,46 +3970,47 @@ msgstr "Keine freien Verzeichnis-Indexeinträge." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:907 msgid "No recorded file" -msgstr "" +msgstr "Keine Aufnahmedatei" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" -msgstr "Keinen Spielstand-Ordner für Tittel %s gefunden." +msgstr "Kein Spielstand-Ordner für Titel %s gefunden." -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Keine" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norwegisch" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Ungleich" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Nicht Festgelegt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Dies ist kein Wii-Spielstand oder das Lesen der Größenangabe im Dateiheader " "%x ist gescheitert." -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" -msgstr "Nicht Verbunden" +msgstr "Nicht verbunden" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notizen" @@ -3849,13 +4025,13 @@ msgstr "Notizen: " #: Source/Core/DolphinWX/Src/FrameAui.cpp:667 #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:31 msgid "Notice" -msgstr "Notizen" +msgstr "Hinweis" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:92 msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Codeanzahl:" @@ -3866,7 +4042,7 @@ msgstr "Nunchuk" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:27 msgid "Nunchuk Acceleration" -msgstr "Nunchuck Beschleunigung" +msgstr "Nunchuck-Beschleunigung" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:889 msgid "Object" @@ -3874,9 +4050,9 @@ msgstr "Objekt" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:122 msgid "Object Range" -msgstr "" +msgstr "Objektreichweite" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Aus" @@ -3886,27 +4062,31 @@ msgstr "Offset:" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:589 msgid "On-Screen Display Messages" -msgstr "" +msgstr "Bildschirmnachrichten" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online-&Dokumentation" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Nur %d Blöcke verfügbar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Öffnen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Beinhaltenden &Ordner öffnen..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" -msgstr "&Wii Spielstand-Ordner öffnen..." +msgstr "&Wii-Spielstand-Ordner öffnen..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Datei öffnen..." @@ -3926,13 +4106,21 @@ msgstr "OpenAL: Kann Gerät %s nicht öffnen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:502 msgid "OpenCL Texture Decoder" -msgstr "OpenCL Textur-Dekoder" +msgstr "OpenCL Texturen-Dekodierer" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:503 msgid "OpenMP Texture Decoder" msgstr "OpenMP Texturen Dekodierer" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Öffnet die Standard-Konfiguration für dieses Spiel (schreibgeschützt) in " +"einem externen Texteditor." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Einstellungen" @@ -3942,43 +4130,42 @@ msgid "Orange" msgstr "Orange" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"Die Reihenfolge der Dateien im Datei-Verzeichnis übereinstimmen nicht mit " -"der Block-Reihenfolge,\n" -"klicke Rechts und exportiere alle Spielstände,\n" -"und importiere die Spielstände auf eine neue Memorycard.\n" +"Die Reihenfolge der Dateien im Datei-Verzeichnis stimmen nicht mit der Block-" +"Reihenfolge überein,\n" +"Rechtsklicke und exportiere alle Spielstände\n" +"und importiere sie auf eine neue Speicherkarte.\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Andere" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." msgstr "" -"Der andere Client wurde, während das Spiel läuft, getrennt! Nun ist NetPlay " -"inaktiv. Beenden Sie nun manuell das Spiel." +"Der andere Client wurde während des laufenden Spiels getrennt! NetPlay ist " +"deaktiviert. Beenden Sie das Spiel manuell." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:528 msgid "Output" msgstr "Ausgabe" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Au&fnahme abspielen..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad " @@ -4002,39 +4189,39 @@ msgstr "Paragraph" msgid "Parameters" msgstr "Parameter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partition %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Partition existiert nicht: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" -msgstr "Patche" +msgstr "Patches" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:543 msgid "Paths" msgstr "Pfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pause" #: Source/Core/DolphinWX/Src/FrameTools.cpp:129 msgid "Pause at end of movie" -msgstr "" +msgstr "Pause am Ende des Films" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:406 msgid "Per-Pixel Lighting" -msgstr "" +msgstr "Per-Pixel Lighting" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfekt" @@ -4044,9 +4231,9 @@ msgid "Perspective %d" msgstr "Perspektive %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Start" @@ -4058,21 +4245,21 @@ msgstr "Aufnahme abspielen" msgid "Play/Pause" msgstr "Start/Pause" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Spielbar" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:141 msgid "Playback Options" -msgstr "" +msgstr "Wiedergabeoptionen" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Spieler" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." -msgstr "Bitte Bestätigen..." +msgstr "Bitte bestätigen..." #: Source/Core/DolphinWX/Src/FrameAui.cpp:612 msgid "Please create a perspective before saving" @@ -4082,23 +4269,23 @@ msgstr "Bitte legen Sie vor dem Speichern eine Perspektive fest" msgid "Plus-Minus" msgstr "Plus-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polnisch" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4:" @@ -4107,36 +4294,36 @@ msgstr "Port 4:" msgid "Port :" msgstr "Port:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugiesisch" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugiesisch (Brasilianisch)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:400 msgid "Post-Processing Effect:" -msgstr "" +msgstr "Nachbearbeitungseffekt:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" -msgstr "" +msgstr "Vorzeitiges Filmende in PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" -msgstr "" +msgstr "Vorzeitiges Filmende in PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" -msgstr "" +msgstr "Vorzeitiges Filmende in PlayWiimote. %u > %u" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:35 msgid "Presets: " -msgstr "" +msgstr "Voreinstellungen:" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:192 msgid "Prev Page" @@ -4146,7 +4333,7 @@ msgstr "Vorh. Seite" msgid "Previous Page" msgstr "Vorherige Seite" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Vorheriger Wert" @@ -4162,7 +4349,7 @@ msgstr "Profil" msgid "Properties" msgstr "Eigenschaften" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Cache leeren" @@ -4171,7 +4358,7 @@ msgid "Question" msgstr "Frage" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Beenden" @@ -4193,21 +4380,21 @@ msgstr "R-Analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSSLAND" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" -msgstr "Weite" +msgstr "Reichweite" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:178 msgid "Read-only mode" -msgstr "Nur-Lese-Modus" +msgstr "Schreibgeschützter Modus" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:488 msgid "Real" @@ -4215,7 +4402,7 @@ msgstr "Echt" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Echtes Balance Board" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4230,15 +4417,19 @@ msgstr "Echte Wiimotes" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:410 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:801 msgid "Record" -msgstr "" +msgstr "Aufnahme" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Eingabe aufzeichnen" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" -msgstr "" +msgstr "Aufnahmeinformationen" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:189 msgid "Recording Options" -msgstr "" +msgstr "Aufnahmeoptionen" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp:25 msgid "Red" @@ -4260,9 +4451,16 @@ msgid "" "\n" "If unsure, select None." msgstr "" +"Verringert den durch Rasterisierung von 3D Grafiken entstandenen " +"Treppeneffekt.\n" +"Lässt das gerenderte Bild feiner aussehen.\n" +"Verlangsamt die Emulationsgeschwindigkeit deutlich und verursacht " +"gelegentlich Probleme.\n" +"\n" +"Im Zweifel, \"Keine\" auswählen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Aktualisieren" @@ -4271,14 +4469,14 @@ msgstr "Aktualisieren" msgid "Refresh List" msgstr "Liste aktualisieren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Spieleliste aktualisieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Entfernen" @@ -4288,17 +4486,20 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Szene als Drahtgittermodell rendern.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:309 msgid "Render to Main Window" -msgstr "Im Hauptfenster Rendern" +msgstr "Im Hauptfenster rendern" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:172 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:970 msgid "Reset" msgstr "Zurücksetzen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Ergebnisse" @@ -4306,9 +4507,9 @@ msgstr "Ergebnisse" msgid "Return" msgstr "Eingabe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revision:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4319,31 +4520,32 @@ msgstr "Rechts" msgid "Right Stick" msgstr "Stick rechts" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Rumble" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" +"Führt DSP LLE in einem eigenen Thread aus (nicht empfohlen: kann zum " +"Einfrieren führen)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russisch" #: Source/Core/DolphinWX/Src/FrameTools.cpp:150 msgid "Sa&ve State" -msgstr "S&tatus speichern" +msgstr "S&tand speichern" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:476 msgid "Safe" msgstr "Sicher" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Speichern" @@ -4353,23 +4555,20 @@ msgid "Save GCI as..." msgstr "GCI speichern unter..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "S&tatus speichern" +msgstr "Ältesten Status speichern" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "S&tatus speichern" +msgstr "Status speichern" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "In Slot 1 speichern" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "In Slot 1 speichern" +msgstr "Speichere Status in Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4400,54 +4599,53 @@ msgid "Save State Slot 8" msgstr "In Slot 8 speichern" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "In Slot 1 speichern" +msgstr "Speichere Status in Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Spiel speichern..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Speichern unter..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Komprimierte GCM/ISO speichern" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Aktuelle Perspektive speichern" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Dekomprimierte GCM/ISO speichern" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." -msgstr "Film-Status %s ist fehlerhaft, breche die Filmaufnahme ab..." +msgstr "Spielstandfilm %s ist fehlerhaft, breche die Filmaufnahme ab..." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:405 msgid "Scaled EFB Copy" -msgstr "" +msgstr "Skalierte EFB-Kopie" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" -msgstr "Scannen %s" +msgstr "Suche %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Suche nach ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Suche..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ScrShot" @@ -4459,11 +4657,11 @@ msgstr "Scroll-Lock" msgid "Search" msgstr "Suche" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Suchfilter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Unterordner durchsuchen" @@ -4473,27 +4671,27 @@ msgstr "Suche derzeitiges Objekt" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:242 msgid "Search for hex Value:" -msgstr "" +msgstr "Suche nach Hex-Wert:" #: Source/Core/Common/Src/SysConf.h:90 Source/Core/Common/Src/SysConf.h:113 #: Source/Core/Common/Src/SysConf.h:133 Source/Core/Common/Src/SysConf.h:154 #, c-format msgid "Section %s not found in SYSCONF" -msgstr "Ausgewähltes %s nicht gefunden in SYSCONF" +msgstr "Abschnitt %s nicht gefunden in SYSCONF" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:46 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:539 msgid "Select" msgstr "Auswählen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Aufnahmedatei auswählen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" -msgstr "Wähle eine Wii WAD zum Installieren aus." +msgstr "Wähle eine Wii-WAD zum Installieren aus." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:74 msgid "" @@ -4501,6 +4699,9 @@ msgid "" "\n" "If unsure, use the first one." msgstr "" +"Wähle ein Anzeigegerät aus.\n" +"\n" +"Im Zweifel, wähle den ersten Eintrag." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:510 msgid "Select a save file to import" @@ -4510,19 +4711,19 @@ msgstr "Speicherdatei zum Importieren auswählen" msgid "Select floating windows" msgstr "Wähle unverankerte Fenster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Datei zum Laden auswählen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Wii-Spielstand auswählen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Status zum Laden auswählen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Status zum Speichern auswählen" @@ -4536,10 +4737,17 @@ msgid "" "\n" "If unsure, select Auto." msgstr "" +"Seitenverhältnis beim Rendern auswählen:\n" +"Auto: Natives Seitenverhältnis benutzen\n" +"Erzwinge 16:9: Bild auf das Verhältnis 16:9 strecken\n" +"Erzwinge 4:3: Bild auf das Verhältnis 4:3 strecken.\n" +"An Fenster anpassen: Bild auf Fenstergröße strecken.\n" +"\n" +"Im Zweifel, wähle \"Auto\"." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" -msgstr "" +msgstr "Ausgewähltes Controller-Profil existiert nicht" #: Source/Core/DolphinWX/Src/LogWindow.cpp:109 msgid "Selected font" @@ -4554,28 +4762,35 @@ msgid "" "If unsure, use your desktop resolution.\n" "If still unsure, use the highest resolution which works for you." msgstr "" - -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"Wählt die Bildschirmauflösung für Vollbild aus.\n" +"Sollte immer größer oder gleich zur internen Auflösung sein.\n" +"Auswirkungen auf die Leistung sind vernachlässigbar.\n" "\n" -"If unsure, use Direct3D 11." -msgstr "" +"Im Zweifel, wähle deine Desktopauflösung,\n" +"oder die höchste Auflösung die für dich funktioniert." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Senden" @@ -4587,18 +4802,17 @@ msgstr "Position der Sensorleiste:" msgid "Separator" msgstr "Trennzeichen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbisch" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" -"Serieller Port 1 - Dies ist der Port, den Geräte, wie der Net-Adapter, " -"benutzen." +"Serieller Port 1 - Dies ist der Port den Geräte wie der Net-Adapter benutzen." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Als &Standard-ISO festlegen" @@ -4607,7 +4821,7 @@ msgstr "Als &Standard-ISO festlegen" msgid "Set as default Memcard %c" msgstr "Als Standard-Speicherkarte %c auswählen" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4618,96 +4832,102 @@ msgid "" "Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL " "backend only." msgstr "" +"Bestimmt die Latenzzeit (in ms): Höhere Werte können Knistergeräusche " +"reduzieren. Nur OpenAL-Backend." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Einstellungen..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Kann die Einstellungsdatei nicht finden" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Einstellungsdatei konnte nicht erstellt werden" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Schütteln" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Kurzer Name:" #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:92 msgid "Shoulder Buttons" -msgstr "" +msgstr "Schultertasten" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "&Konsole anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "&Log anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "&Statusleiste anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "&Werkzeugleiste anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Standard anzeigen" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Laufwerke anzeigen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:528 msgid "Show EFB Copy Regions" -msgstr "" +msgstr "EFB-Kopie-Regionen anzeigen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:304 msgid "Show FPS" msgstr "FPS anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Frankreich anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "GameCube anzeigen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:559 msgid "Show Input Display" -msgstr "" +msgstr "Eingabebildschirm anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Italien anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "JAP anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Korea anzeigen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" -msgstr "Anzeigen auf:" +msgstr "Anzeigesprache:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" -msgstr "" +msgstr "Log-Einstellungen anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PAL anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Plattformen anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Regionen anzeigen" @@ -4715,27 +4935,27 @@ msgstr "Regionen anzeigen" msgid "Show Statistics" msgstr "Statistiken anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Taiwan anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "USA anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Wad anzeigen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii anzeigen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Vor dem Beenden der Emulation bestätigen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4753,30 +4973,33 @@ msgstr "Ersten Block anzeigen" #: Source/Core/DolphinWX/Src/FrameTools.cpp:131 msgid "Show lag counter" -msgstr "" +msgstr "Lag-Zähler anzeigen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " "information, and JIT cache clearing." msgstr "" +"Nachrichten im Emulationsfenster anzeigen.\n" +"Diese Nachrichten beinhalten Speichervorgänge auf der Speicherkarte, Video-" +"Backend- und CPU-Informationen und JIT-Cache-Leerungen." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:815 msgid "Show save blocks" -msgstr "Blöcke anzeigen" +msgstr "Spielstandblöcke anzeigen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:813 msgid "Show save comment" -msgstr "Kommentar anzeigen" +msgstr "Spielstandkommentar anzeigen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:814 msgid "Show save icon" -msgstr "Symbol anzeigen" +msgstr "Spielstandsymbol anzeigen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:812 msgid "Show save title" -msgstr "Namen anzeigen" +msgstr "Spielstandtitel anzeigen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:103 msgid "" @@ -4785,10 +5008,14 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Gerenderte Frames pro Sekunde als Maß der Emulationsgeschwindigkeit " +"anzeigen.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" -msgstr "Unbekannte Anzeigen" +msgstr "Unbekannte anzeigen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:106 msgid "" @@ -4796,30 +5023,34 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Verschiedene Statistiken anzeigen.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" -msgstr "" +msgstr "Seitwärts gerichtete Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Chinesisch (Vereinfacht)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Größe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "BIOS überspringen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" -msgstr "" +msgstr "DCBZ-Leerung überspringen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:455 msgid "Skip EFB Access from CPU" -msgstr "" +msgstr "EFB-Zugang von CPU überspringen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:125 msgid "" @@ -4830,18 +5061,25 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Beschleunigt EFB zu RAM-Kopien geringfügig auf Kosten der " +"Emulationsgenauigkeit.\n" +"Verbessert auch gelegentlich die Bildqualität.\n" +"Wenn Fehler auftreten, erhöhe die Texturen-Cache-Genauigkeit oder " +"deaktiviere diese Option.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B:" @@ -4849,7 +5087,7 @@ msgstr "Slot B:" msgid "Snapshot" msgstr "Snapshot" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Software-Renderer" @@ -4860,34 +5098,39 @@ msgid "" "It's only useful for debugging purposes.\n" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" +"Software Rendering ist eine Größenordnung langsamer als die anderen " +"Backends.\n" +"Nur nützlich für Debug-Zwecke.\n" +"Möchtst du wirklich Software Rendering aktivieren? Im Zweifel, wähle \"Nein" +"\"." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Audio-Einstellungen" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Sound-Backend %s ist ungültig." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" -msgstr "Erstellen des Sound-Buffer fehlgeschlagen: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" +msgstr "Erstellen des Sound-Buffers fehlgeschlagen: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Leertaste" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spanisch" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:114 msgid "Speaker Volume:" -msgstr "" +msgstr "Lautsprecher-Lautstärke" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:93 msgid "" @@ -4900,38 +5143,38 @@ msgid "" "\n" "If unsure, select 640x528." msgstr "" +"Bestimmt die Auflösung in der gerendert wird. Eine hohe Auflösung wird die " +"Bildqualität deutlich verbessern aber geht auch sehr auf die Leistung und " +"kann in bestimmten Spielen Fehler verursachen.\n" +"\"Vielfaches von 640x528\" ist etwas langsamer als \"Fenstergröße\" aber " +"verursacht weniger Fehler. Im Allgemeinen gilt, je geringer die interne " +"Auflösung, desto besser die Leistung.\n" +"\n" +"Im Zweifel, wähle 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Disc-Ãœbertragungsrate beschleunigen" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" -msgstr "" +msgstr "Quadrat-Stick" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standard-Controller" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "&NetPlay starten" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "&Aufnahme starten" @@ -4939,7 +5182,7 @@ msgstr "&Aufnahme starten" msgid "Start Recording" msgstr "Aufnahme starten" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Status" @@ -4947,7 +5190,7 @@ msgstr "Status" msgid "State Saves" msgstr "Status" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Lenkrad" @@ -4956,7 +5199,7 @@ msgid "Stick" msgstr "Stick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Stopp" @@ -4969,6 +5212,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Speichert EFB-Kopien in GPU-Texturobjekten.\n" +"Dies ist nicht so genau, funktioniert aber gut genug für die meisten Spiele " +"und hat einen großen Geschwindigkeitsvorteil gegenüber EFB zu RAM.\n" +"\n" +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Stretch to Window" @@ -4982,46 +5230,49 @@ msgstr "Klimpern" msgid "Subtract" msgstr "Subtrahieren" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Die Datei wurde erfolgreich nach %s exportiert" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Die gespeicherte Datei wurde erfolgreich importiert" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Schwedisch" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Schwingen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "GPU-Thread synchronisieren" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" +"Synchronisiert die GPU- und CPU-Threads um willkürliche Aufhänger mit Dual " +"Core zu vermeiden. (AN = Kompatibilität, AUS = Geschwindigkeit)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Systemsprache:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" #: Source/Core/DolphinWX/Src/FrameTools.cpp:128 #: Source/Core/DolphinWX/Src/TASInputDlg.h:19 msgid "TAS Input" -msgstr "" +msgstr "TAS-Eingabe" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:15 msgid "Tab" @@ -5033,21 +5284,21 @@ msgstr "Nebeneinander öffnen" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:41 msgid "Table Left" -msgstr "" +msgstr "Tisch links" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:42 msgid "Table Right" -msgstr "" +msgstr "Tisch rechts" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Screenshot erstellen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" -msgstr "" +msgstr "TaruKonga (Bongos)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:535 msgid "Test" @@ -5059,17 +5310,17 @@ msgstr "Textur" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:462 msgid "Texture Cache" -msgstr "" +msgstr "Texturen-Cache" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:530 msgid "Texture Format Overlay" -msgstr "" +msgstr "Texturenformat-Ãœberlagerung" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "Die WAD-Datei wurde erfolgreich installiert" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Die Adresse ist ungültig" @@ -5077,13 +5328,13 @@ msgstr "Die Adresse ist ungültig" msgid "The checksum was successfully fixed" msgstr "Die Prüfsumme wurde erfolgreich korrigiert" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Der ausgewählte Ordner befindet sich bereits in der Liste" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5108,14 +5359,14 @@ msgstr "" "Die Datei %s wurde bereits geöffnet, der Header für die Datei wird nicht " "geschrieben." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Die angegebene Datei (%s) existiert nicht" #: Source/Core/DolphinWX/Src/FrameAui.cpp:666 msgid "The name can not be empty" -msgstr "Der Name kann nicht leer bleiben." +msgstr "Der Name darf nicht leer bleiben." #: Source/Core/DolphinWX/Src/FrameAui.cpp:658 msgid "The name can not contain the character ','" @@ -5123,7 +5374,7 @@ msgstr "Der Name darf nicht das Zeichen \",\" enthalten" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:129 msgid "The resulting decrypted AR code doesn't contain any lines." -msgstr "" +msgstr "Der resultierende entschlüsselte AR-Code enthält keine Zeilen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:99 msgid "" @@ -5132,59 +5383,63 @@ msgid "" "\n" "If unsure, use the rightmost value." msgstr "" +"Je sicherer dies angepasst wird, desto seltener verpasst der Emulator Textur-" +"Updates vom RAM.\n" +"\n" +"Im Zweifel, den Wert ganz rechts wählen." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:432 msgid "The save you are trying to copy has an invalid file size" msgstr "" "Der Spielstand, den du kopieren möchtest, hat eine ungültige Dateigröße." -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" "Die ausgewählte Sprache wird von Ihrem System nicht unterstützt. Kehre nun " -"zum Systemstandart zurück." +"zum Systemstandard zurück." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "" -"Die Version von dem Server und Client´s NetPlay sind zueinander inkompatibel!" +"Die NetPlay-Version von Server und Client sind nicht zueinander kompatibel!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Der Server ist voll!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Der Server meldet: Das Spiel läuft derzeit!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Der Server sendete einen unbekannten Fehler!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Die ausgewählte Datei \"%s\" existiert nicht" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Der eingegebene Wert ist ungültig" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Design:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -"Es müsste ein Ticket für 00000001/00000002 vorhanden sein. Ihr NAND-Dump ist " +"Es muss ein Ticket für 00000001/00000002 vorhanden sein. Ihr NAND-Dump ist " "wahrscheinlich unvollständig." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5193,15 +5448,15 @@ msgstr "" "Grau hinterlegte Kästchen bedeuten, dass die globalen Einstellungen benutzt " "werden." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" -"Dieser Action-Replay-Simulator unterstützt keine Codes, die sich selber " -"verändern können." +"Dieser Action-Replay-Simulator unterstützt keine Codes, die Action Replay " +"selbst verändern können." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Dies könnte zu Verlangsamung im Wii-Menü und einigen Spielen führen." @@ -5216,90 +5471,101 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Diese Einstellung erlaubt es dir, die Kamera im Spiel zu bewegen.\n" +"Halte die rechte Maustaste gedrückt und bewege die Maus um die Kamera zu " +"schwenken, halte die linke Maustaste gedrückt um sie zu bewegen.\n" +"Halte SHIFT und drücke eine der WASD-Tasten um die Kamera eine bestimmte " +"Entfernung zu bewegen (SHIFT+0 um sie schneller zu bewegen und SHIFT+9 um " +"sie langsamer zu bewegen). Drücke Shift+R um die Kamera zurückzusetzen.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" +"Beschränkt die Spielgeschwindigkeit auf die angegebene Anzahl von Bildern " +"pro Sekunde (Volle Geschwindigkeit entspricht 60 für NTSC und 50 für PAL). " +"Alternativ kann DSP benutzt werden um den Ton zu drosseln (kann je nach " +"Spiel Knistern beheben aber auch durchgehendes Rauschen verursachen)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" "Causes major speed improvements on PCs with more than one core, but can also " "cause occasional crashes/glitches." msgstr "" -"Teilt die Video und CPU Threads, damit diese auf unterschiedlichen Kernen " +"Teilt die Video- und CPU-Threads, damit diese auf unterschiedlichen Kernen " "laufen können.\n" "Bewirkt eine wesentliche Verbesserung der Geschwindigkeit auf PCs mit mehr " "als einem Kern,\n" "kann aber gelegentlich Abstürze/Fehler verursachen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" -msgstr "" +msgstr "Erlaubt manuelles Editieren der INI-Konfigurationsdatei" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:237 #: Source/Core/InputCommon/Src/ControllerEmu.cpp:242 msgid "Threshold" msgstr "Schwelle" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Neigung" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Titel" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:112 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:131 msgid "To" -msgstr "" +msgstr "Zu" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:59 msgid "Toggle All Log Types" -msgstr "" +msgstr "Alle Log-Typen umschalten" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Seitenverhältnis:" +msgstr "Seitenverhältnis umschalten" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Kopien" +msgstr "EFB-Kopien umschalten" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 msgid "Toggle Fog" -msgstr "" +msgstr "Nebel umschalten" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Vollbildmodus umschalten" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "IR umschalten" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Oben" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chinesisch (Traditionell)" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." -msgstr "Versuche gerade einen unbekannten Dateityp zu Laden." +msgstr "Versuchte einen unbekannten Dateityp zu laden." #: Source/Core/Core/Src/HW/GCPadEmu.cpp:67 msgid "Triggers" @@ -5307,23 +5573,23 @@ msgstr "Schultertasten" #: Source/Core/Common/Src/SysConf.h:78 Source/Core/Common/Src/SysConf.h:101 msgid "Trying to read from invalid SYSCONF" -msgstr "Versuche gerade eine ungültige SYSCONF zu Lesen" +msgstr "Versuchte eine ungültige SYSCONF zu lesen" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:31 msgid "" "Trying to read from invalid SYSCONF\n" "Wiimote bt ids are not available" msgstr "" -"Versuche gerade eine ungültige SYSCONF zu Lesen\n" +"Versuchte eine ungültige SYSCONF zu lesen\n" "Wiimote BT-IDs sind nicht verfügbar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Türkisch" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:33 msgid "Turntable" -msgstr "" +msgstr "Turntable" #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:58 msgid "Type" @@ -5331,14 +5597,14 @@ msgstr "Typ" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:30 msgid "UDP Port:" -msgstr "UDP Port:" +msgstr "UDP-Port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP-Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "UNBEKANNT" @@ -5347,7 +5613,7 @@ msgstr "UNBEKANNT" msgid "UNKNOWN_%02X" msgstr "UNBEKANNT_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5356,38 +5622,43 @@ msgid "" "Unable to create patch from given values.\n" "Entry not modified." msgstr "" +"Konnte Patch aus eingegebenen Werten nicht erstellen.\n" +"Eintrag nicht verändert." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" +"Konnte Zeile %lu des eingegebenen AR-Codes nicht als gültigen, " +"verschlüsselten oder entschlüsselten Code parsen. Prüfe, dass du ihn richtig " +"eingegeben hast.\n" +"Möchtest du diese Zeile ignorieren und mit dem Parsen fortfahren?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Undefiniert %i" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:229 msgid "Undo Load State" -msgstr "Status laden rückgängig machen" +msgstr "Status Laden rückgängig machen" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Status laden rückgängig machen" +msgstr "Speicherstand rückgängig machen" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." -msgstr "" +msgstr "Unerwarteter 0x80 Aufruf? Abbruch..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Unbekannt" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Unbekannter DVD-Befehl %08x - fataler Fehler" @@ -5400,14 +5671,14 @@ msgstr "Unbekannter Befehl 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" -msgstr "Unbekannter Eintrag-Typ %i in SYSCONF (%s@%x)!" +msgstr "Unbekannter Eintragstyp %i in SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Unbekannte Meldung mit ID: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5418,16 +5689,16 @@ msgstr "" msgid "Up" msgstr "Hoch" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Update" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" -msgstr "" +msgstr "Aufrechte Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "EuRGB60 Modus (PAL60) verwenden" @@ -5435,7 +5706,7 @@ msgstr "EuRGB60 Modus (PAL60) verwenden" msgid "Use Fullscreen" msgstr "Verwende gesamten Bildschirm" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Hex verwenden" @@ -5450,6 +5721,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Benutzt einen weniger genauen Algorithmus um Tiefenwerte zu berechnen.\n" +"Verursacht Fehler in einigen Spielen, kann aber einen ordentlichen " +"Geschwindigkeitsvorteil bringen.\n" +"\n" +"Im Zweifel aktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5458,6 +5734,25 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Verwendet mehrere Threads um Texturen zu dekodieren.\n" +"Kann die Emulation beschleunigen (vor allem auf CPUs mit mehr als zwei " +"Kernen.)\n" +"\n" +"Im Zweifel deaktiviert lassen." + +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Benutzt unsichere Operationen um Vertex-Streaming in OpenGL zu " +"beschleunigen. Auf unterstützten GPUs sind keine Probleme bekannt, ansonsten " +"können aber schwerwiegende Stabilitätsprobleme und Grafikfehler auftreten.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" @@ -5467,6 +5762,12 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Wenn eine Shaderzusammenstellung versagt wird für gewöhnlich eine " +"Fehlermeldung angezeigt.\n" +"Diese Meldung kann allerdings mit dieser Option übersprungen werden um " +"unterbrechungsfreies Spielen zu gewährleisten.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:550 msgid "Utility" @@ -5476,12 +5777,11 @@ msgstr "Hilfsmittel" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Speed Hack" +msgstr "VBeam Speed-Hack" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Wert" @@ -5489,19 +5789,19 @@ msgstr "Wert" msgid "Value:" msgstr "Wert:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Wert: " #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:38 msgid "Verbosity" -msgstr "Ausführung" +msgstr "Ausführlichkeit" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Vertex-Streaming-Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video" @@ -5509,17 +5809,17 @@ msgstr "Video" msgid "Virtual" msgstr "Virtuell" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Lautstärke" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD-Installation fehlgeschlagen: Konnte %s nicht erstellen" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD-Installation fehlgeschlagen: Fehler bei der Ticket-Erstellung" @@ -5530,6 +5830,10 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Warte auf vertikale Austastung um Tearing zu reduzieren.\n" +"Reduziert die Leistung wenn die Emulationsgeschwindigkeit unter 100% liegt.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/Common/Src/MsgHandler.cpp:53 #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:33 @@ -5537,19 +5841,19 @@ msgstr "" msgid "Warning" msgstr "Warnungen" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" -msgstr "Warnung - Starte DOL im falschen Consolen-Modus!" +msgstr "Warnung - Starte DOL im falschen Konsolenmodus!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" -msgstr "Warnung - Starte ELF im falschen Consolen-Modus!" +msgstr "Warnung - Starte ELF im falschen Konsolenmodus!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" -msgstr "Warnung - Starte ISO im falschen Consolen-Modus!" +msgstr "Warnung - Starte ISO im falschen Konsolenmodus!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5573,7 +5877,7 @@ msgstr "" "besitzen.\n" "Möchtest du fortfahren?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5582,10 +5886,10 @@ msgid "" msgstr "" "Warnung: Du hast einen Spielstand geladen, dessen Speicherpunkt hinter dem " "Ende der aktuellen Aufnahme liegt. (Byte %u > %u) (Frame %u > %u). Lade " -"einen anderen Spielstand, bevor du fortfährst oder lade diesen Spielstand im " -"schreibgeschützen Modus." +"einen anderen Spielstand bevor du fortfährst oder lade diesen Spielstand " +"nicht im schreibgeschützen Modus." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5593,11 +5897,11 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" "Warnung: Du hast einen Spielstand geladen, dessen Aufnahme bei Byte %d (0x" -"%X) nicht übereinstimmt. Lade einen anderen Spielstand, bevor du fortfährst " -"oder lade diesen Spielstand im schreibgeschützen Modus, andernfalls könnten " -"Desyncs auftreten." +"%X) nicht übereinstimmt. Lade einen anderen Spielstand bevor du fortfährst " +"oder lade diesen Spielstand nicht im schreibgeschützen Modus, andernfalls " +"könnten Desyncs auftreten." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5617,8 +5921,8 @@ msgid "" msgstr "" "Warnung: Du hast einen Spielstand geladen, dessen Aufnahme bei Frame %d " "nicht übereinstimmt. Lade einen anderen Spielstand, bevor du fortfährst oder " -"lade diesen Spielstand mit deaktiviertem Schreibschutz, andernfalls könnten " -"Desyncs auftreten.\n" +"lade diesen Spielstand nicht im schreibgeschützten Modus, andernfalls " +"könnten Desyncs auftreten.\n" "\n" "Weitere Informationen: Die aktuelle Aufnahme hat eine Länge von %d Frames " "und die Aufnahme vom Spielstand ist %d Frames lang.\n" @@ -5640,7 +5944,7 @@ msgstr "WaveFileWriter - Konnte Datei nicht öffnen." #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:60 msgid "Whammy" -msgstr "" +msgstr "Whammy" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:409 msgid "Widescreen Hack" @@ -5648,25 +5952,21 @@ msgstr "Breitbild-Hack" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:300 msgid "Width" -msgstr "Weite" +msgstr "Breite" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:542 msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii-Konsole" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" -msgstr "" +msgstr "Wii-NAND-Root:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wii-Spielstand importieren" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii-Speicherdaten (*.bin)|*.bin" @@ -5675,24 +5975,30 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Konnte die Datei nicht lesen" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" -msgstr "Wiimote Verbunden" +msgstr "Wiimote angeschlossen" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:108 msgid "Wiimote Motor" -msgstr "Wiimote Motor" +msgstr "Wiimote-Motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote-Einstellungen" @@ -5716,16 +6022,16 @@ msgstr "Windows Rechts" msgid "Word Wrap" msgstr "Zeilenumbruch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Arbeite..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Schreibe Speicherkarten (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5733,7 +6039,7 @@ msgstr "In Konsole ausgeben" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:54 msgid "Write to Debugger" -msgstr "" +msgstr "In Debugger ausgeben" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:44 msgid "Write to File" @@ -5741,22 +6047,37 @@ msgstr "In Datei ausgeben" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:48 msgid "Write to Window" -msgstr "" +msgstr "In Fenster ausgeben" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice fehlgeschlagen: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Initialisierung von XAudio2 gescheitert: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" -msgstr "" +msgstr "Erstellung von XAudio2 Master Voice fehlgeschlagen: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice fehlgeschlagen: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Initialisierung von XAudio2 gescheitert: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Erstellung von XAudio2 Master Voice fehlgeschlagen: %#X" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" @@ -5772,17 +6093,17 @@ msgid "" "All Wii games will work correctly, and most GC games should also work fine, " "but the GBA/IPL/CARD UCodes will not work.\n" msgstr "" -"Du verwendest das freie DSP-ROM vom Dolphin Team.\n" -"Alle Wii- und die meisten GameCube-Spiele werden problemlos funktionen, aber " -"die GBA/IPL/CARD-UCodes nicht.\n" +"Du verwendest eine freie DSP-ROM vom Dolphin-Team.\n" +"Alle Wii- und die meisten GameCube-Spiele werden problemlos funktionieren, " +"aber die GBA/IPL/CARD-UCodes nicht.\n" #: Source/Core/Core/Src/DSP/DSPCore.cpp:116 msgid "" "You are using an old free DSP ROM made by the Dolphin Team.\n" "Only games using the Zelda UCode will work correctly.\n" msgstr "" -"Du verwendest ein veraltetes, freies DSP-ROM vom Dolphin Team.\n" -"Nur Spiele, die den Zelda-UCode verwenden werden korrekt funktionieren.\n" +"Du verwendest eine veraltete, freie DSP-ROM vom Dolphin-Team.\n" +"Nur Spiele die den Zelda-UCode verwenden, werden korrekt funktionieren.\n" #: Source/Core/DolphinWX/Src/FrameAui.cpp:63 msgid "You can't close panes that have pages in them." @@ -5790,21 +6111,21 @@ msgstr "Es können keine Paletten geschlossen werden, die Seiten behinhalten." #: Source/Core/DolphinWX/Src/NetWindow.cpp:240 msgid "You must choose a game!!" -msgstr "Sie müssen ein Spiel auswählen!" +msgstr "Du musst ein Spiel auswählen!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Du musst einen Namen eingeben!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Du musst eine gültige Dezimal-, Hexadezimal- oder Oktalzahl eingeben." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:655 msgid "You must enter a valid profile name." -msgstr "Sie müssen einen gültigen Profilamen eingeben!" +msgstr "Du musst einen gültigen Profilnamen eingeben!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Sie müssen Dolphin neu starten, damit die Änderungen wirksam werden." @@ -5814,11 +6135,11 @@ msgid "" "Would you like to stop now to fix the problem?\n" "If you select \"No\", audio might be garbled." msgstr "" -"Dein DSP-ROMs haben ungültige Hashwerte.\n" -"Möchtest du die Emulation anhalten und das Problem beheben?\n" -"Wenn du \"Nein\" wählst, könnte die Audiowiedergabe merkwürdig klingen." +"Deine DSP-ROMs haben ungültige Hashwerte.\n" +"Möchtest du die Emulation beenden um das Problem zu beheben?\n" +"Wenn du \"Nein\" wählst, könnte die Audiowiedergabe verzerrt klingen." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5837,18 +6158,18 @@ msgstr "" "Erwartet wurde eine Größe von 0x%04x (aber deine ist 0x%04llx).\n" "Soll eine neue Datei generiert werden?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP-Hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" -msgstr "Zero 3 Code wird nicht unterstüzt" +msgstr "Zero 3-Code wird nicht unterstützt" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" -msgstr "Der Zero Code ist in Dolphin unbekannt: %08x" +msgstr "Der Zero-Code ist Dolphin unbekannt: %08x" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:480 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:504 @@ -5862,6 +6183,10 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"[DEFEKT]\n" +"Hebe die Regionen hervor, aus denen der EFB kopiert wurde.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/PHackSettings.cpp:78 msgid "[Custom]" @@ -5877,6 +6202,14 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"[EXPERIMENTELL]\n" +"Versucht die Emulationsgeschwindigkeit zu beschleunigen indem es die " +"Texturendekodierung auf die GPU mit OpenCL-Framework auslagert.\n" +"Verusacht jedoch momentan Texturenfehler in verschiedenen Spielen. Es ist " +"ebenfalls in den meisten Fällen langsamer als die reguläre " +"Texturendekodierung der CPU.\n" +"\n" +"Im Zweifel deaktiviert lassen." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:122 msgid "" @@ -5886,65 +6219,89 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"[EXPERIMENTELL]\n" +"Beschleunigt die Emulation ein wenig indem Displaylisten in den Cache " +"geladen werden.\n" +"Verursacht jedoch möglicherweise Probleme.\n" +"\n" +"Im Zweifel deaktiviert lassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "Apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Lesen des Opcode aus %x. Bitte berichten." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "Unbekannte Funktion %d (%d erwartet)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "Unbekannte Meldung erhalten" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute gab beim Anwendungsstart -1 zurück!" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:43 msgid "zFar Correction: " -msgstr "zFar Korrektion: " +msgstr "zFar-Korrektur:" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:38 msgid "zNear Correction: " -msgstr "zNear Korrektion: " +msgstr "zNear-Korrektur:" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:545 msgid "| OR" msgstr "| ODER" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Genaue VBeam Emulation" +#~ msgid "Could not create %s" +#~ msgstr "%s konnte nicht erstellt werden" -#~ msgid "Enable Hotkeys" -#~ msgstr "Kurztasten aktivieren" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "bthprops.cpl konnte nicht geladen werden." +#~ msgid "Edit Local Overrides" +#~ msgstr "Lokale Ãœberbrückungen bearbeiten" -#~ msgid "Failed to load hid.dll" -#~ msgstr "Fehler beim Laden von hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic Konfiguration" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY wurde aufgerufen, bitte berichten!" +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Öffnet die benutzerdefinierten Ãœberbrückungen in einem externen " +#~ "Texteditor." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Wenn die FPS sprunghaft ist, kann diese Option helfen. (ON = Kompatibel, " -#~ "OFF = Schnell)" +#~ "Bestimmt welche Grafik-API intern verwendet wird.\n" +#~ "Direct3D 9 ist für gewöhnlich die schnellste. OpenGL ist allerdings " +#~ "genauer. Direct3D 11 liegt irgendwo dazwischen.\n" +#~ "Beachte, dass die Direct3D-Backends nur auf Windows verfügbar sind.\n" +#~ "\n" +#~ "Im Zweifel, verwende Direct3D 11." -#~ msgid "Last Overwritten State" -#~ msgstr "Letzter überschriebener Status" +#~ msgid "" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use OpenGL." +#~ msgstr "" +#~ "Bestimmt welche Grafik-API intern verwendet wird.\n" +#~ "Direct3D 9 ist für gewöhnlich die schnellste. OpenGL ist allerdings " +#~ "genauer. Direct3D 11 liegt irgendwo dazwischen.\n" +#~ "Beachte, dass die Direct3D-Backends nur auf Windows verfügbar sind.\n" +#~ "\n" +#~ "Im Zweifel, verwende OpenGL." -#~ msgid "Last Saved State" -#~ msgstr "Letzter gespeicherter Status" - -#~ msgid "Set" -#~ msgstr "Zuweisen" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Lesen des Opcode aus %x. Bitte berichten." diff --git a/Languages/po/dolphin-emu.pot b/Languages/po/dolphin-emu.pot index 5f7d5bc380..7613cd2f11 100644 --- a/Languages/po/dolphin-emu.pot +++ b/Languages/po/dolphin-emu.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,13 +17,13 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "" @@ -31,14 +31,14 @@ msgstr "" msgid "! NOT" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" " Create a new 16MB Memcard?" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -53,64 +53,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -139,7 +144,7 @@ msgstr "" msgid "&& AND" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "" @@ -147,7 +152,7 @@ msgstr "" msgid "&Boot from DVD Drive..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "" @@ -155,7 +160,7 @@ msgstr "" msgid "&Browse for ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "" @@ -163,11 +168,11 @@ msgstr "" msgid "&DSP Settings" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "" @@ -179,11 +184,11 @@ msgstr "" msgid "&File" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "" @@ -191,7 +196,7 @@ msgstr "" msgid "&Graphics Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "" @@ -199,7 +204,7 @@ msgstr "" msgid "&Hotkey Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "" @@ -211,11 +216,11 @@ msgstr "" msgid "&Memcard Manager (GC)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "" @@ -223,51 +228,51 @@ msgstr "" msgid "&Options" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "" @@ -275,7 +280,7 @@ msgstr "" msgid "&Wiimote Settings" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "" @@ -311,7 +316,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "" @@ -327,7 +332,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "" @@ -343,7 +348,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "" @@ -355,7 +360,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -363,7 +368,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -372,12 +377,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "" @@ -396,23 +401,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "" @@ -451,66 +455,66 @@ msgid "" "%s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "" @@ -524,11 +528,11 @@ msgstr "" msgid "Add" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "" @@ -536,9 +540,9 @@ msgstr "" msgid "Add new pane" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "" @@ -580,32 +584,32 @@ msgstr "" msgid "Advanced Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "" @@ -625,19 +629,19 @@ msgstr "" msgid "Anti-Aliasing:" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "" @@ -648,7 +652,7 @@ msgid "" "If unsure, select (off)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "" @@ -657,21 +661,25 @@ msgstr "" msgid "Are you sure you want to delete \"%s\"?" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "" @@ -680,12 +688,12 @@ msgstr "" msgid "At least one pane must remain open." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "" @@ -693,7 +701,7 @@ msgstr "" msgid "AudioCommon: Error opening AO device.\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "" @@ -729,16 +737,16 @@ msgstr "" msgid "Back" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "" @@ -747,7 +755,7 @@ msgstr "" msgid "Backward" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "" @@ -756,15 +764,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "" @@ -784,7 +792,7 @@ msgstr "" msgid "Bass" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "" @@ -805,7 +813,7 @@ msgid "Blue Right" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "" @@ -814,27 +822,27 @@ msgstr "" msgid "Bound Controls: %lu" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "" @@ -844,7 +852,7 @@ msgstr "" msgid "Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -883,33 +891,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -917,7 +925,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -927,7 +935,7 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "" @@ -935,11 +943,11 @@ msgstr "" msgid "Center" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "" @@ -947,11 +955,11 @@ msgstr "" msgid "Change Disc" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -965,11 +973,11 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "" @@ -977,47 +985,47 @@ msgstr "" msgid "Cheat Code" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "" @@ -1025,14 +1033,14 @@ msgstr "" msgid "Choose a memory card:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "" @@ -1051,7 +1059,7 @@ msgstr "" msgid "Clear" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1059,7 +1067,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "" @@ -1068,11 +1076,11 @@ msgstr "" msgid "Co&nfigure..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "" @@ -1084,24 +1092,24 @@ msgstr "" msgid "Comment" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "" @@ -1115,18 +1123,18 @@ msgstr "" msgid "Configure Control" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "" @@ -1139,16 +1147,16 @@ msgstr "" msgid "Connect" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 msgid "Connect Balance Board" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "" @@ -1169,7 +1177,7 @@ msgstr "" msgid "Connect Wiimote 4" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "" @@ -1189,7 +1197,7 @@ msgstr "" msgid "Convert to GCI" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "" @@ -1198,21 +1206,16 @@ msgstr "" msgid "Copy to Memcard %c" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1220,22 +1223,16 @@ msgid "" "most PC DVD drives." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1249,27 +1246,27 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "" @@ -1301,12 +1298,12 @@ msgstr "" msgid "Crossfade" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "" @@ -1314,11 +1311,11 @@ msgstr "" msgid "Custom Projection Hack Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "" @@ -1330,36 +1327,36 @@ msgstr "" msgid "D-Pad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "" @@ -1371,15 +1368,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "" @@ -1408,16 +1405,16 @@ msgstr "" msgid "Decimal" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "" @@ -1429,7 +1426,7 @@ msgstr "" msgid "Default" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "" @@ -1471,8 +1468,8 @@ msgstr "" msgid "Device" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "" @@ -1480,15 +1477,11 @@ msgstr "" msgid "Dial" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +msgid "Direct3D" msgstr "" -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" -msgstr "" - -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1534,7 +1527,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "" @@ -1558,24 +1551,59 @@ msgstr "" msgid "Divide" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "" @@ -1591,12 +1619,12 @@ msgstr "" msgid "Dolphin FIFO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "" @@ -1604,28 +1632,28 @@ msgstr "" msgid "Dolphin Wiimote Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" @@ -1649,11 +1677,11 @@ msgstr "" msgid "Drums" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "" @@ -1690,9 +1718,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "" @@ -1713,7 +1741,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "" @@ -1721,7 +1749,7 @@ msgstr "" msgid "Early Memory Updates" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "" @@ -1729,7 +1757,7 @@ msgstr "" msgid "Edit ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "" @@ -1737,12 +1765,12 @@ msgstr "" msgid "Edit Patch" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "" @@ -1754,7 +1782,7 @@ msgstr "" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "" @@ -1781,7 +1809,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "" @@ -1799,15 +1827,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1819,7 +1847,7 @@ msgstr "" msgid "Enable Cheats" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "" @@ -1827,7 +1855,7 @@ msgstr "" msgid "Enable Dual Core (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "" @@ -1835,7 +1863,7 @@ msgstr "" msgid "Enable Idle Skipping (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "" @@ -1843,7 +1871,7 @@ msgstr "" msgid "Enable Progressive Scan" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "" @@ -1851,7 +1879,7 @@ msgstr "" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "" @@ -1868,7 +1896,7 @@ msgid "" "If unsure, select 1x." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1894,31 +1922,25 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -1929,7 +1951,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -1946,9 +1968,9 @@ msgstr "" msgid "End" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "" @@ -1971,21 +1993,20 @@ msgstr "" msgid "Entry 1/%d" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2008,7 +2029,6 @@ msgid "Euphoria" msgstr "" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2017,16 +2037,20 @@ msgstr "" msgid "Execute" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "" @@ -2034,7 +2058,7 @@ msgstr "" msgid "Export Recording" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "" @@ -2042,7 +2066,7 @@ msgstr "" msgid "Export Save" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "" @@ -2050,15 +2074,15 @@ msgstr "" msgid "Export all saves" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "" @@ -2074,44 +2098,44 @@ msgstr "" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "" @@ -2123,15 +2147,15 @@ msgstr "" msgid "FIFO Player" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "" @@ -2139,11 +2163,15 @@ msgstr "" msgid "Failed to download codes." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2171,20 +2199,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2192,73 +2220,78 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "" @@ -2270,17 +2303,17 @@ msgstr "" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "" @@ -2302,7 +2335,7 @@ msgid "" "or does not have a valid extension" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2313,20 +2346,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "" @@ -2378,14 +2411,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2404,6 +2437,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2445,9 +2483,9 @@ msgstr "" msgid "Free Look" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "" @@ -2460,7 +2498,7 @@ msgstr "" msgid "From" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "" @@ -2472,7 +2510,7 @@ msgstr "" msgid "GCI File(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "" @@ -2480,27 +2518,27 @@ msgstr "" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "" @@ -2517,20 +2555,20 @@ msgid "Gamecube &Pad Settings" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2549,26 +2587,26 @@ msgstr "" msgid "General Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "" @@ -2583,7 +2621,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "" @@ -2607,11 +2645,11 @@ msgstr "" msgid "Hacks" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "" @@ -2623,7 +2661,7 @@ msgstr "" msgid "Help" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2635,7 +2673,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2678,7 +2716,7 @@ msgstr "" msgid "Hotkeys" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "" @@ -2686,29 +2724,29 @@ msgstr "" msgid "Hybrid Wiimote" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "" @@ -2720,15 +2758,15 @@ msgstr "" msgid "IR Sensitivity:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "" @@ -2736,7 +2774,7 @@ msgstr "" msgid "Icon" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2768,8 +2806,12 @@ msgstr "" msgid "Import Save" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 @@ -2788,20 +2830,16 @@ msgid "" "but does not have a correct header" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 msgid "Increase Frame limit" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "" @@ -2821,7 +2859,7 @@ msgstr "" msgid "Insert Encrypted or Decrypted code here..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "" @@ -2829,36 +2867,37 @@ msgstr "" msgid "Insert name here.." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2869,7 +2908,7 @@ msgstr "" msgid "Interface" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "" @@ -2892,20 +2931,20 @@ msgstr "" msgid "Internal Resolution:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "" @@ -2913,16 +2952,16 @@ msgstr "" msgid "Invalid bat.map or dir entry" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -2930,7 +2969,7 @@ msgid "" " You may need to redump this game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "" @@ -2946,34 +2985,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "" @@ -2992,8 +3033,9 @@ msgstr "" msgid "Key" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "" @@ -3015,12 +3057,12 @@ msgstr "" msgid "Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3052,7 +3094,7 @@ msgid "" "Middle-click to clear." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "" @@ -3144,15 +3186,15 @@ msgstr "" msgid "Load State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "" @@ -3168,10 +3210,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "" @@ -3200,12 +3238,12 @@ msgstr "" msgid "Logger Outputs" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "" @@ -3213,14 +3251,14 @@ msgstr "" msgid "M Button" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "" @@ -3234,11 +3272,11 @@ msgstr "" msgid "Main Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "" @@ -3269,7 +3307,7 @@ msgid "Memory Byte" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "" @@ -3279,7 +3317,7 @@ msgid "" "could mangle stuff!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3290,7 +3328,7 @@ msgid "" "Would you like to copy the old file to this new location?\n" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3298,7 +3336,7 @@ msgstr "" msgid "Menu" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "" @@ -3311,7 +3349,7 @@ msgstr "" msgid "Misc" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "" @@ -3332,11 +3370,11 @@ msgstr "" msgid "Monospaced font" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "" @@ -3448,15 +3486,15 @@ msgstr "" msgid "NP Up" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "" @@ -3466,7 +3504,7 @@ msgstr "" msgid "Native GCI files(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "" @@ -3475,7 +3513,7 @@ msgstr "" msgid "Next Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "" @@ -3483,11 +3521,11 @@ msgstr "" msgid "Nickname :" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "" @@ -3495,7 +3533,7 @@ msgstr "" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "" @@ -3521,42 +3559,43 @@ msgstr "" msgid "No recorded file" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "" @@ -3577,7 +3616,7 @@ msgstr "" msgid "Num Lock" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "" @@ -3598,7 +3637,7 @@ msgstr "" msgid "Object Range" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "" @@ -3610,25 +3649,29 @@ msgstr "" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "" @@ -3654,7 +3697,13 @@ msgstr "" msgid "OpenMP Texture Decoder" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "" @@ -3675,7 +3724,7 @@ msgstr "" msgid "Other" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3685,15 +3734,15 @@ msgstr "" msgid "Output" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "" @@ -3717,17 +3766,17 @@ msgstr "" msgid "Parameters" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "" @@ -3735,8 +3784,8 @@ msgstr "" msgid "Paths" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "" @@ -3749,7 +3798,7 @@ msgstr "" msgid "Per-Pixel Lighting" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "" @@ -3759,9 +3808,9 @@ msgid "Perspective %d" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "" @@ -3773,7 +3822,7 @@ msgstr "" msgid "Play/Pause" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "" @@ -3781,11 +3830,11 @@ msgstr "" msgid "Playback Options" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "" @@ -3797,23 +3846,23 @@ msgstr "" msgid "Plus-Minus" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "" @@ -3822,11 +3871,11 @@ msgstr "" msgid "Port :" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "" @@ -3834,17 +3883,17 @@ msgstr "" msgid "Post-Processing Effect:" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3861,7 +3910,7 @@ msgstr "" msgid "Previous Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "" @@ -3877,7 +3926,7 @@ msgstr "" msgid "Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "" @@ -3886,7 +3935,7 @@ msgid "Question" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "" @@ -3908,7 +3957,7 @@ msgstr "" msgid "RAM" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "" @@ -3947,6 +3996,10 @@ msgstr "" msgid "Record" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "" @@ -3977,7 +4030,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "" @@ -3986,14 +4039,14 @@ msgstr "" msgid "Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "" @@ -4013,7 +4066,7 @@ msgstr "" msgid "Reset" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "" @@ -4021,7 +4074,7 @@ msgstr "" msgid "Return" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4034,18 +4087,17 @@ msgstr "" msgid "Right Stick" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "" @@ -4058,7 +4110,7 @@ msgid "Safe" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "" @@ -4115,28 +4167,28 @@ msgstr "" msgid "Save State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4145,20 +4197,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "" @@ -4170,11 +4222,11 @@ msgstr "" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "" @@ -4197,12 +4249,12 @@ msgstr "" msgid "Select" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "" @@ -4221,19 +4273,19 @@ msgstr "" msgid "Select floating windows" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "" @@ -4248,7 +4300,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4266,27 +4318,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "" @@ -4298,16 +4351,16 @@ msgstr "" msgid "Separator" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "" @@ -4316,7 +4369,7 @@ msgstr "" msgid "Set as default Memcard %c" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4327,19 +4380,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "" @@ -4347,23 +4400,27 @@ msgstr "" msgid "Shoulder Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "" @@ -4375,11 +4432,11 @@ msgstr "" msgid "Show FPS" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "" @@ -4387,35 +4444,35 @@ msgstr "" msgid "Show Input Display" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "" @@ -4423,27 +4480,27 @@ msgstr "" msgid "Show Statistics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4458,7 +4515,7 @@ msgstr "" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4489,7 +4546,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "" @@ -4500,23 +4557,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4534,17 +4592,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "" @@ -4552,7 +4610,7 @@ msgstr "" msgid "Snapshot" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "" @@ -4564,27 +4622,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 #, c-format -msgid "Sound buffer creation failed: %s" +msgid "Sound buffer creation failed: %08x" msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "" @@ -4604,37 +4662,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "" @@ -4642,7 +4692,7 @@ msgstr "" msgid "Start Recording" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "" @@ -4650,7 +4700,7 @@ msgstr "" msgid "State Saves" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -4659,7 +4709,7 @@ msgid "Stick" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "" @@ -4685,39 +4735,40 @@ msgstr "" msgid "Subtract" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "" @@ -4742,13 +4793,13 @@ msgstr "" msgid "Table Right" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -4768,11 +4819,11 @@ msgstr "" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "" @@ -4780,13 +4831,13 @@ msgstr "" msgid "The checksum was successfully fixed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4805,7 +4856,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "" @@ -4834,60 +4885,60 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" @@ -4903,7 +4954,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -4911,7 +4962,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -4919,7 +4970,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" @@ -4928,12 +4979,12 @@ msgstr "" msgid "Threshold" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "" @@ -4958,7 +5009,7 @@ msgstr "" msgid "Toggle Fog" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "" @@ -4968,15 +5019,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "" @@ -4994,7 +5046,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "" @@ -5010,12 +5062,12 @@ msgstr "" msgid "UDP Port:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "" @@ -5024,7 +5076,7 @@ msgstr "" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "" @@ -5037,12 +5089,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "" @@ -5059,11 +5111,11 @@ msgstr "" msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "" @@ -5078,12 +5130,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5093,16 +5145,16 @@ msgstr "" msgid "Up" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "" @@ -5110,7 +5162,7 @@ msgstr "" msgid "Use Fullscreen" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "" @@ -5134,6 +5186,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5151,11 +5212,11 @@ msgstr "" msgid "V-Sync" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "" @@ -5163,7 +5224,7 @@ msgstr "" msgid "Value:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "" @@ -5175,7 +5236,7 @@ msgstr "" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "" @@ -5183,17 +5244,17 @@ msgstr "" msgid "Virtual" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5211,19 +5272,19 @@ msgstr "" msgid "Warning" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5240,7 +5301,7 @@ msgid "" "Continue?" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5248,7 +5309,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5256,7 +5317,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5296,19 +5357,15 @@ msgstr "" msgid "Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "" @@ -5317,16 +5374,21 @@ msgid "WiiWAD: Could not read from file" msgstr "" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +msgid "Wiimote " +msgstr "" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "" @@ -5334,7 +5396,7 @@ msgstr "" msgid "Wiimote Motor" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "" @@ -5358,14 +5420,14 @@ msgstr "" msgid "Word Wrap" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5385,21 +5447,36 @@ msgstr "" msgid "Write to Window" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5429,11 +5506,11 @@ msgstr "" msgid "You must choose a game!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" @@ -5441,7 +5518,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" @@ -5452,7 +5529,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5466,15 +5543,15 @@ msgid "" "Do you want to generate a new one?" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "" @@ -5516,20 +5593,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "" - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "" diff --git a/Languages/po/el.po b/Languages/po/el.po index 057acead14..eedb444914 100644 --- a/Languages/po/el.po +++ b/Languages/po/el.po @@ -5,12 +5,13 @@ # Translators: # Gpower2 , 2011 # link_to_the_past , 2013 +# Godfath3r , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 19:05+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-18 14:27+0000\n" "Last-Translator: link_to_the_past \n" "Language-Team: Greek (http://www.transifex.com/projects/p/dolphin-emu/" "language/el/)\n" @@ -20,13 +21,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(πολλά αποτελέσματα για να εμφανιστοÏν)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Παιχνίδι : " @@ -34,7 +35,7 @@ msgstr "Παιχνίδι : " msgid "! NOT" msgstr "! NOT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +44,7 @@ msgstr "" "Το \"%s\" δεν υπάÏχει.\n" "ΔημιουÏγία καινοÏÏιας Memcard 16MB;" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -59,29 +60,29 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sΑντιγÏαφή%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d δείγματα" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d δείγματα (επίπεδο ποιότητας %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s υπάÏχει ήδη, θέλετε αντικατάσταση;" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" "%s απέτυχε να γίνει scrubbed. Πιθανότατα το αÏχείο εικόνας είναι φθαÏμένο." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -90,7 +91,7 @@ msgstr "" "%s απέτυχε να φοÏτώσει ως κάÏτα μνήμης\n" " Το μέγεθος του αÏχείου της κάÏτας δεν είναι έγκυÏο (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -99,7 +100,7 @@ msgstr "" "%s απέτυχε να φοÏτώσει ως κάÏτα μνήμης\n" " Το μέγεθος της κάÏτας δεν είναι έγκυÏο (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -109,22 +110,27 @@ msgstr "" "το αÏχείο δεν είναι αÏκετά μεγάλο ώστε να αποτελεί έγκυÏο αÏχείο κάÏτας " "μνήμης (0x%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "αποτυχία ανοίγματος %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s απέτυχε: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "Το %s είναι ένα αÏχείο με 0 byte" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "Το %s είναι ήδη συμπιεσμένο! Δε γίνεται να συμπιεστεί πεÏαιτέÏω." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -155,7 +161,7 @@ msgstr "%u ΕλεÏθεÏα μπλοκ; %u ΕλεÏθεÏες Θέσεις Φα msgid "&& AND" msgstr "&& AND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&ΠεÏί..." @@ -163,7 +169,7 @@ msgstr "&ΠεÏί..." msgid "&Boot from DVD Drive..." msgstr "&Εκκίνηση από τον οδηγό DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Σημεία Διακοπής" @@ -171,7 +177,7 @@ msgstr "&Σημεία Διακοπής" msgid "&Browse for ISOs..." msgstr "&ΕÏÏεση ISO..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&ΔιαχειÏιστής Cheat" @@ -179,11 +185,11 @@ msgstr "&ΔιαχειÏιστής Cheat" msgid "&DSP Settings" msgstr "&Ρυθμίσεις DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&ΔιαγÏαφή ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&ΔιαγÏαφή επιλεγμένων ISO..." @@ -195,11 +201,11 @@ msgstr "&Εξομοίωση" msgid "&File" msgstr "&ΑÏχείο" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&ΠÏοώθηση ανά ΚαÏέ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&ΠλήÏης Οθόνη" @@ -207,7 +213,7 @@ msgstr "&ΠλήÏης Οθόνη" msgid "&Graphics Settings" msgstr "&Ρυθμίσεις ΓÏαφικών" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Βοήθεια" @@ -215,7 +221,7 @@ msgstr "&Βοήθεια" msgid "&Hotkey Settings" msgstr "&Ρυθμίσεις ΠλήκτÏων Συντόμευσης" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -227,11 +233,11 @@ msgstr "&ΦόÏτωση Σημείου Αποθήκευσης" msgid "&Memcard Manager (GC)" msgstr "&ΔιαχειÏιστής ΚαÏτών Μνήμης (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Μνήμη" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Άνοιγμα..." @@ -239,51 +245,51 @@ msgstr "&Άνοιγμα..." msgid "&Options" msgstr "&Ρυθμίσεις" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&ΠαÏση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&ΑναπαÏαγωγή" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Ιδιότητες" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Μόνο Για Ανάγνωση (ΕγγÏαφής)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Ανανέωση Λίστας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&ΚαταχωÏητές" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Επανεκκίνηση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Ήχος" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Διακοπή" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&ΕÏγαλεία" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Βίντεο" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&ΠÏοβολή" @@ -291,7 +297,7 @@ msgstr "&ΠÏοβολή" msgid "&Wiimote Settings" msgstr "&Ρυθμίσεις Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -316,9 +322,8 @@ msgid "(off)" msgstr "(ανενεÏγό)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -328,7 +333,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x ΑÏχική (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -344,7 +349,7 @@ msgstr "2.5x ΑÏχική (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x ΑÏχική (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -360,7 +365,7 @@ msgstr "3x ΑÏχική (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x ΑÏχική (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -372,7 +377,7 @@ msgstr "<Εισάγετε όνομα εδώ>" msgid "" msgstr "<Δε βÏέθηκαν αναλÏσεις>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<Τίποτα>" @@ -380,7 +385,7 @@ msgstr "<Τίποτα>" msgid "" msgstr "<Πατήστε ΠλήκτÏο>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<Συστήματος>" @@ -389,14 +394,14 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Ένα παÏάθυÏο NetPlay είναι ήδη ανοιχτό!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." -msgstr "Αυτή τη στιγμή δεν εκτελείται κάπιο παιχνίδι." +msgstr "Αυτή τη στιγμή δεν εκτελείται κάποιο παιχνίδι." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:85 msgid "" @@ -416,38 +421,37 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ΠΡΟΣΟΧΗ:\n" "\n" "Η λειτουÏγία NetPlay λειτουÏγεί σωστά μόνο με τις παÏακάτω Ïυθμίσεις:\n" -" - ΔÏο ΠυÏήνες [ΑÎΕÎΕΡΓΟ]\n" -" - Throttle Ήχου [ΑÎΕÎΕΡΓΟ]\n" -" - DSP-HLE με \"Null Audio\" ή DSP-LLE\n" -" - ΧειÏοκίνητη εισαγωγή του ακÏιβοÏÏ‚ αÏÎ¹Î¸Î¼Î¿Ï Ï„Ï‰Î½ ελεγκτών που θα " -"χÏησιμοποιηθοÏν σαν [Τυπικός Ελεγκτής]\n" +" - ΕνεÏγοποίηση Î”Î¹Ï€Î»Î¿Ï Î Ï…Ïήνα [ΑÎΕÎΕΡΓΟ]\n" +" - Η Μηχανή Εξομοίωσης DSP Ï€Ïέπει να είναι η ίδια σε όλους τους " +"υπολογιστές!\n" +" - DSP σε ΞεχωÏιστό Îήμα [ΑÎΕÎΕΡΓΟ]\n" +" - Ο ΠεÏιοÏισμός των ΚαÏέ να ΜΗΠέχει οÏιστεί σε [Ήχο]\n" "\n" "Όλοι οι παίκτες Ï€Ïέπει να έχουν την ίδια έκδοση και Ïυθμίσεις του Dolphin.\n" -"ΑπενεÏγοποιήστε όλες τις κάÏτες μνήμης ή στείλτε τες σε όλους τους παίκτες " -"Ï€Ïιν την εκκίνηση.\n" -"Η υποστήÏιξη Wiimote δεν έχει ακόμα υλοποιηθεί.\n" +"Όλες οι κάÏτες μνήμης Ï€Ïέπει να είναι ίδιες ανάμεσα στους παίκτες ή " +"απενεÏγοποιημένες.\n" +"Η υποστήÏιξη Wiimote δεν έχει ακόμα υλοποιηθεί!\n" "\n" -"Θα Ï€Ïέπει να έχετε κάνει Ï€Ïοώθηση της πόÏτας TCP στον host!!" +"Ο host θα Ï€Ïέπει να έχει την επιλεγμένη TCP port ανοιχτή/Ï€Ïοωθημένη!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Κωδικοί AR" @@ -496,7 +500,7 @@ msgstr "" "ΠÏοβληματικός Κωδικός:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -504,7 +508,7 @@ msgstr "" "Σφάλμα Action Replay: Μη έγκυÏο μέγεθος (%08x : διεÏθυνση = %08x) στην " "ΠÏοσθήκη ÎšÏ‰Î´Î¹ÎºÎ¿Ï (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -513,7 +517,7 @@ msgstr "" "Σφάλμα Action Replay: Μη έγκυÏο μέγεθος (%08x : διεÏθυνση = %08x) σε Fill " "και Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -522,7 +526,7 @@ msgstr "" "Σφάλμα Action Replay: Μη έγκυÏο μέγεθος (%08x : διεÏθυνση = %08x) σε Ram " "Write και Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -531,12 +535,12 @@ msgstr "" "Σφάλμα Action Replay: Μη έγκυÏο μέγεθος (%08x : διεÏθυνση = %08x) σε Write " "To Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Σφάλμα Action Replay: Μη έγκυÏη τιμή (%08x) σε Memory Copy (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -546,27 +550,27 @@ msgstr "" "έχουν υλοποιηθεί (%s)\n" "Δεν χÏειάζονται master codes. Μην χÏησιμοποιείτε master codes." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Σφάλμα Action Replay: μη έγκυÏη γÏαμμή κώδικα AR: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Conditional Code: Μη έγκυÏο μέγεθος %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Μη έγκυÏος Normal Code Type %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Code %i: Μη έγκυÏο subtype %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Code 0: Μη έγκυÏο Subtype %08x (%s)" @@ -580,11 +584,11 @@ msgstr "ΠÏοσαÏμογέας:" msgid "Add" msgstr "ΠÏοσθήκη" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "ΠÏοσθήκη ÎšÏ‰Î´Î¹ÎºÎ¿Ï ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "ΠÏοσθήκη Patch" @@ -592,9 +596,9 @@ msgstr "ΠÏοσθήκη Patch" msgid "Add new pane" msgstr "ΠÏοσθήκη νέου pane" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "ΠÏοσθήκη..." @@ -638,32 +642,32 @@ msgstr "Για Ï€ÏοχωÏημένους" msgid "Advanced Settings" msgstr "Ρυθμίσεις για ΠÏοχωÏημένους" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Όλα τα αÏχεία GC/Wii (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Όλες οι εικόνες GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Όλα τα αÏχεία Gamecube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Όλα τα Σημεία Αποθήκευσης(sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Όλα τα αÏχεία Wii ISO (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Όλα τα συμπιεσμένα αÏχεία GC/Wii ISO (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Όλα τα αÏχεία (*.*)|*.*" @@ -683,19 +687,19 @@ msgstr "ΑνισοτÏοπικό ΦιλτÏάÏισμα:" msgid "Anti-Aliasing:" msgstr "Εξομάλυνση ΟÏίων:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Ο Apploader έχει λάθος μέγεθος... είναι Ï€Ïάγματι apploader;" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Ο Apploader απέτυχε να φοÏτωθεί από αÏχείο" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "ΕφαÏμογή" @@ -709,7 +713,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, επιλέξτε (ανενεÏγό)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "ΑÏαβικά" @@ -718,7 +722,7 @@ msgstr "ΑÏαβικά" msgid "Are you sure you want to delete \"%s\"?" msgstr "Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε το \"%s\";" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -726,17 +730,22 @@ msgstr "" "Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε αυτά τα αÏχεία;\n" "Θα εξαφανιστοÏν για πάντα!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε αυτό το αÏχείο; Θα εξαφανιστεί για " "πάντα!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (πειÏαματικός)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (πειÏαματικός)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Αναλογία Οθόνης:" @@ -745,12 +754,12 @@ msgstr "Αναλογία Οθόνης:" msgid "At least one pane must remain open." msgstr "Τουλάχιστον ένα pane Ï€Ïέπει να μένει ανοιχτό." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ήχος" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Backend Ήχου:" @@ -758,7 +767,7 @@ msgstr "Backend Ήχου:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Σφάλμα ανοίγματος AO συσκευής.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Αυτόματα" @@ -798,16 +807,16 @@ msgstr "BP ΚαταχωÏητές" msgid "Back" msgstr "Πίσω" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Backend Ρυθμίσεις" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "ΧειÏισμός με Ανεστίαστο ΠαÏαθ." @@ -816,24 +825,24 @@ msgstr "ΧειÏισμός με Ανεστίαστο ΠαÏαθ." msgid "Backward" msgstr "Πίσω" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Μη ΈγκυÏη Κεφαλίδα ΑÏχείου" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Σανίδα ΙσοÏÏοπίας" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Εικονίδιο" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "ΛεπτομέÏειες Εικονιδίου:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Εικονίδιο:" @@ -853,7 +862,7 @@ msgstr "Βασικές Ρυθμίσεις" msgid "Bass" msgstr "Μπάσο" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Αποτυχία ελέγχου checksum για τον BAT" @@ -874,7 +883,7 @@ msgid "Blue Right" msgstr "Δεξί Μπλε" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Βάση" @@ -883,27 +892,27 @@ msgstr "Βάση" msgid "Bound Controls: %lu" msgstr "Δεσμευμένοι ΧειÏισμοί: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Χαλασμένο" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "ΕÏÏεση" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "ΕÏÏεση φακέλου για Ï€Ïοσθήκη" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "ΕÏÏεση φακέλου ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "ΕÏÏεση φακέλου Ï€ÏοοÏισμοÏ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -913,7 +922,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Κουμπιά" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -960,34 +969,34 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Αδυναμία εÏÏεσης του WiiMote με handle σÏνδεσης %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Αδυναμία ανάγνωσης από το DVD_Plugin - DVD-Interface: ΚÏίσιμο Σφάλμα" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "ΆκυÏο" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Αποτυχία ανοίγματος %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" "Δεν μποÏεί να γίνει κατάÏγηση καταχώÏησης συμβάντων όταν οÏισμένα εκκÏεμοÏν." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -998,7 +1007,7 @@ msgstr "" "%s\n" "δεν είναι έγκυÏο αÏχείο κάÏτας μνήμης gamecube" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1010,7 +1019,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Καταλανικά" @@ -1018,11 +1027,11 @@ msgstr "Καταλανικά" msgid "Center" msgstr "ΚέντÏο" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Αλλαγή" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Αλλαγή &Δίσκου..." @@ -1030,11 +1039,11 @@ msgstr "Αλλαγή &Δίσκου..." msgid "Change Disc" msgstr "Αλλαγή Δίσκου" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Αλλαγή ΠαιχνιδιοÏ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1044,17 +1053,17 @@ msgstr "" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:47 msgid "Changes sign to zFar Parameter (after correction)" -msgstr "" +msgstr "Αλλαγή Ï€Ïοσήμου της παÏαμέτÏου zFar (μετά την διόÏθωση)" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:42 msgid "Changes sign to zNear Parameter (after correction)" -msgstr "" +msgstr "Αλλαγή Ï€Ïοσήμου της παÏαμέτÏου zNear (μετά την διόÏθωση)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Αυτή η αλλαγή δε θα έχει επίπτωση όσο ο εξομοιωτής εκτελείται!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Συνομιλία" @@ -1062,47 +1071,47 @@ msgstr "Συνομιλία" msgid "Cheat Code" msgstr "Κωδικός Cheat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Αναζήτηση Cheat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "ΔιαχείÏιση Cheat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Έλεγχος ΑκεÏαιότητας Κατάτμησης" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Έλεγχος ακεÏαιότητας..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Κινέζικα (Απλοποιημένα)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Κινέζικα (ΠαÏαδοσιακά)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Επιλέξτε έναν φάκελο Ïίζας DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Επιλέξτε έναν φάκελο Ïίζας NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Επιλέξτε ένα Ï€Ïοεπιλεγμένο ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Επιλέξτε έναν φάκελο για Ï€Ïοσθήκη" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Επιλέξτε ένα αÏχείο για άνοιγμα" @@ -1110,7 +1119,7 @@ msgstr "Επιλέξτε ένα αÏχείο για άνοιγμα" msgid "Choose a memory card:" msgstr "Επιλέξτε μια κάÏτα μνήμης:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1118,8 +1127,8 @@ msgstr "" "Επιλέξτε ένα αÏχείο για χÏήση ως apploader: (έχει εφαÏμογή σε δίσκους που " "απαÏτίζονται μόνο από φακέλους)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Επιλέξτε τον φάκελο Ï€Ïος αποσυμπίεση" @@ -1138,7 +1147,7 @@ msgstr "Κλασικό ΧειÏιστήÏιο" msgid "Clear" msgstr "ΚαθάÏισ." -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1148,7 +1157,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Κλείσιμο" @@ -1157,11 +1166,11 @@ msgstr "Κλείσιμο" msgid "Co&nfigure..." msgstr "Ρυ&θμίσεις..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "ΠληÏοφοÏίες ΚωδικοÏ" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Κωδικός: " @@ -1173,24 +1182,24 @@ msgstr "Εντολή" msgid "Comment" msgstr "Σχόλιο" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Σχόλιο:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Συμπίεση ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Συμπίεση επιλεγμένων ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Συμπίεση ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Ρυθμίσεις" @@ -1204,18 +1213,18 @@ msgstr "Ρυθμίσεις" msgid "Configure Control" msgstr "Ρυθμίσεις ΧειÏιστηÏίου" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Ρυθμίσεις ΧειÏιστηÏίων" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Γενικές Ρυθμίσεις..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Επιβεβαίωση Αντικατάστασης ΑÏχείου" @@ -1228,17 +1237,16 @@ msgstr "Επιβεβαίωση Διακοπής" msgid "Connect" msgstr "ΣÏνδεση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "ΣÏνδεση ΠληκτÏολογίου USB" +msgstr "ΣÏνδεση Σανίδας ΙσοÏÏοπίας" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "ΣÏνδεση ΠληκτÏολογίου USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "ΣÏνδεση Wiimote %i" @@ -1259,7 +1267,7 @@ msgstr "ΣÏνδεση Wiimote 3" msgid "Connect Wiimote 4" msgstr "ΣÏνδεση Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Γίνεται ΣÏνδεση..." @@ -1279,7 +1287,7 @@ msgstr "ΧειÏιστήÏιο" msgid "Convert to GCI" msgstr "ΜετατÏοπή σε GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Η αντιγÏαφή απέτυχε" @@ -1288,21 +1296,16 @@ msgstr "Η αντιγÏαφή απέτυχε" msgid "Copy to Memcard %c" msgstr "ΑντιγÏαφή στην κάÏτα μνήμης %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "ΠυÏήνας" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Αποτυχία δημιουÏγίας %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Αποτυχία εκκίνησης backend %s" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1314,26 +1317,16 @@ msgstr "" " Σημειώστε πως αυθεντικοί Gamecube και Wii δίσκοι δεν μποÏοÏν να αναγνωστοÏν " "από τους πεÏισσότεÏους PC DVD οδηγοÏÏ‚." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Αποτυχία αναγνώÏισης του αÏχείου ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Αποτυχία αποθήκευσης του %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Αδυναμία καθοÏÎ¹ÏƒÎ¼Î¿Ï Ï‡ÎµÎ¹ÏιστηÏίων. Ο παίκτης εγκατέλειψε ή το παιχνίδι " -"Ï„Ïέχει!\n" -"(ο καθοÏισμός των χειÏιστηÏίων ενώ το παιχνίδι Ï„Ïέχει δεν υποστηÏίζεται Ï€Ïος " -"το παÏόν)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1355,11 +1348,11 @@ msgstr "" "Άμα ναι, τότε μποÏεί να χÏειαστεί να οÏίσετε ξανά την θέση της κάÏτας μνήμης " "στις Ïυθμίσεις." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Αδυναμία εÏÏεσης εντολής ανοίγματος για την επέκταση 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1367,17 +1360,17 @@ msgstr "" "Αδυναμία εκκίνησης του πυÏήνα.\n" "Ελέξγτε τις Ïυθμίσεις σας." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Πλήθος:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "ΧώÏα:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "ΔημιουÏγία ÎšÏ‰Î´Î¹ÎºÎ¿Ï AR" @@ -1412,12 +1405,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Ο Ï„Ïέχων φάκελος άλλαξε από %s σε %s μετά από τον wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "ΠÏοσαÏμοζόμενο Projection Hack" @@ -1425,11 +1418,11 @@ msgstr "ΠÏοσαÏμοζόμενο Projection Hack" msgid "Custom Projection Hack Settings" msgstr "Ρυθμίσεις ΠÏοσαÏμοζόμενου Projection Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "ΠÏοσαÏμόστε οÏισμένες παÏαμέτÏους ΟÏθογÏαφικής ΠÏοβολής." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Τσέχικα" @@ -1441,36 +1434,36 @@ msgstr "D" msgid "D-Pad" msgstr "Ψηφιακό Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "Ήχος (DSP)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Μηχανή Εξομοίωσης DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE εξομοίωση (γÏήγοÏη)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE interpreter (αÏγή)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP σε ΞεχωÏιστό Îήμα" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Ρυθμίσεις ήχου (DSP)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE σε ΞεχωÏιστό Îήμα" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Ρίζα DVD:" @@ -1483,15 +1476,15 @@ msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" "DVDLowUnencryptedRead - Σφάλμα ΤεÏματισμοÏ: αποτυχία ανάγνωσης από τον τομέα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Χαλάκι ΧοÏοÏ" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Μέγεθος Δεδομένων" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "ΗμεÏομηνία:" @@ -1520,29 +1513,28 @@ msgstr "Debugging" msgid "Decimal" msgstr "Δεκαδικός" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Αποσυμπίεση ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Αποσυμπίεση επιλεγμένων ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Γίνεται αποσυμπίεση ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Ανανέωση λίστας παιχνιδιών" +msgstr "Μείωση ΟÏίου ΚαÏέ" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "ΠÏοεπιλ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ΠÏοεπιλεγμένο ISO:" @@ -1586,8 +1578,8 @@ msgstr "" msgid "Device" msgstr "Συσκευή" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Ρυθμίσεις Συσκευής" @@ -1595,15 +1587,12 @@ msgstr "Ρυθμίσεις Συσκευής" msgid "Dial" msgstr "Dial" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1618,7 +1607,7 @@ msgstr "ΑπενεÏγοποίηση" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "ΑπενεÏγοποίηση Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1655,19 +1644,19 @@ msgstr "" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"ΠαÏάλειψη του destination alpha pass που χÏησιμοποιείται από Ï€Î¿Î»Î»Î¬ παιχνίδια " -"σε διάφοÏα γÏαφικά εφέ.\n" +"ΑπενεÏγοποιεί την εξομοίωση ενός χαÏακτηÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Ï„Î¿Ï… Ï…Î»Î¹ÎºÎ¿Ï Ï€Î¿Ï… ονομάζεται " +"destination alpha pass, και το οποίο χÏησιμοποιείται από πολλά παιχνίδια για " +"διάφοÏα γÏαφικά εφέ.\n" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Δίσκος" @@ -1694,24 +1683,91 @@ msgstr "" msgid "Divide" msgstr "Divide" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Θέλετε να σταματήσετε την Ï„Ïέχουσα εξομοίωση;" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II αποκωδικοποιητής" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Το Dolphin είναι ένας Gamecube/Wii εξομοιωτής, ο οποίος\n" +"γÏάφτηκε αÏχικά από τον F|RES και τον ector.\n" +"ΣήμεÏα το Dolphin είναι ένα έÏγο Î±Î½Î¿Î¹Ï‡Ï„Î¿Ï ÎºÏŽÎ´Î¹ÎºÎ± με πολλοÏÏ‚\n" +"να συνεισφέÏουν, πάÏα πολλοÏÏ‚ για να αναφεÏθοÏν εδώ.\n" +"Εάν σας ενδιαφέÏει, απλά ελέγξτε την σελίδα του έÏγου στο\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"ΙδιαίτεÏες ευχαÏιστίες στον Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 και Hotquik για το\n" +"reverse engineering και τα docs/demos.\n" +"\n" +"Ένα μεγάλο ευχαÏιστώ στον Gilles Mouchard του οποίου ο\n" +" Microlib PPC εξομοιωτής έδωσε έναυσμα στην ανάπτυξη.\n" +"\n" +"ΕυχαÏιστώ τον Frank Wille για τον PowerPC disassembler,\n" +"τον οποίο ο or9 και εμείς Ï„Ïοποποιήσαμε για να συμπεÏιληφθοÏν \n" +"λεπτομέÏειες για τον Gekko.\n" +"\n" +"ΕυχαÏιστοÏμε τους hcs/destop για τον GC ADPCM decoder.\n" +"\n" +"Εμείς δεν συνδεόμαστε με την Nintendo με οποιονδήποτε Ï„Ïόπο.\n" +"Gamecube και Wii είναι εμποÏικά σήματα της Nintendo.\n" +"Ο εξομοιωτής είναι για εκπαιδευτικοÏÏ‚ σκοποÏÏ‚ μόνο\n" +"και δεν Ï€Ïέπει να χÏησιμοποιηθεί για να παίξετε παιχνίδια \n" +"τα οποία δεν κατέχετε νόμιμα." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Ρυθμίσεις ΓÏαφικών Dolphin %s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Ιστοσελίδα του &Dolphin" @@ -1727,12 +1783,12 @@ msgstr "Ρυθμίσεις Εξομοιωμένου Dolphin Wiimote" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Ρυθμίσεις Dolphin GCPad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS Ταινίες (*.dtm)" @@ -1740,11 +1796,11 @@ msgstr "Dolphin TAS Ταινίες (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Ρυθμίσεις Dolphin Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin στο &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1752,7 +1808,7 @@ msgstr "" "Το Dolphin δεν μπόÏεσε να βÏει GC/Wii ISO. Κάντε διπλό κλίκ εδώ για εÏÏεση " "αÏχείων..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1760,19 +1816,18 @@ msgstr "" "Το Dolphin είναι Ïυθμισμένο να αποκÏÏπτει όλα τα παιχνίδια. Κάντε διπλό κλίκ " "εδώ για να εμφανιστοÏν όλα τα παιχνίδια..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Το Dolphin δεν μπόÏεσε να ολοκληÏώσει την ζητοÏμενη ενέÏγεια." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"ΕνεÏγοποιεί τη γÏήγοÏη Ï€Ïόσβαση δίσκου. ΑπαÏαίτητο για μεÏικά παιχνίδια. " -"(ΕÎΕΡΓΟ = ΓÏήγοÏο, ΑÎΕÎΕΡΓΟ = Συμβατό)" +"Διπλασιάζει την συχνότητα του ÏÎ¿Î»Î¿Î³Î¹Î¿Ï Ï„Î·Ï‚ εξομοιωμένης GPU. ΜποÏεί να " +"επιταχÏνει οÏισμένα παιχνίδια (ΕÎΕΡΓΟ = ΤαχÏτητα, ΑÎΕÎΕΡΓΟ = Συμβατότητα)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1792,11 +1847,11 @@ msgstr "ΜεταφοÏτώθηκαν %lu κωδικοί. (Ï€Ïοστέθηκαν msgid "Drums" msgstr "ΤÏμπανα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Dummy" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Εξαγωγή Ήχου" @@ -1844,9 +1899,9 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Ολλανδικά" @@ -1871,7 +1926,7 @@ msgstr "" "Dolphin σας, πιθανότατα απαιτείται μία επανεκκίνηση ώστε τα Windows να δοÏνε " "τους νέους οδηγοÏÏ‚." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "ΕΥΡΩΠΗ" @@ -1879,7 +1934,7 @@ msgstr "ΕΥΡΩΠΗ" msgid "Early Memory Updates" msgstr "ΕνημεÏώσεις Μνήμης ÎωÏίς" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "ΕπεξεÏγασία" @@ -1887,7 +1942,7 @@ msgstr "ΕπεξεÏγασία" msgid "Edit ActionReplay Code" msgstr "ΕπεξεÏγασία ÎšÏ‰Î´Î¹ÎºÎ¿Ï ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "ΕπεξεÏγασία Ρυθμίσεων" @@ -1895,12 +1950,12 @@ msgstr "ΕπεξεÏγασία Ρυθμίσεων" msgid "Edit Patch" msgstr "ΕπεξεÏγασία Patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "ΕπεξεÏγασία Ï„Ïέχουσας οπτικής" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "ΕπεξεÏγασία..." @@ -1912,7 +1967,7 @@ msgstr "Εφέ" msgid "Embedded Frame Buffer" msgstr "Embedded Frame Buffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Το νήμα εξομοίωσης εκτελείται ήδη" @@ -1951,7 +2006,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Εξομοιωμένο Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Κατάσταση ΛειτουÏγίας:" @@ -1975,15 +2030,15 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "ΕνεÏγοποίηση ΚαταγÏαφής AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "ΕνεÏγοποίηση Block Merging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "ΕνεÏγοποίηση Bounding Box Υπολογισμών" @@ -1995,7 +2050,7 @@ msgstr "ΕνεÏγοποίηση Cache" msgid "Enable Cheats" msgstr "ΕνεÏγοποίηση Cheat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "ΕνεÏγοποίηση Î”Î¹Ï€Î»Î¿Ï Î Ï…Ïήνα" @@ -2003,7 +2058,7 @@ msgstr "ΕνεÏγοποίηση Î”Î¹Ï€Î»Î¿Ï Î Ï…Ïήνα" msgid "Enable Dual Core (speedup)" msgstr "ΕνεÏγοποίηση Î”Î¹Ï€Î»Î¿Ï Î Ï…Ïήνα (επιτάχυνση)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "ΕνεÏγοποίηση Idle Skipping" @@ -2011,7 +2066,7 @@ msgstr "ΕνεÏγοποίηση Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "ΕνεÏγοποίηση Idle Skipping (επιτάχυνση)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "ΕνεÏγοποίηση MMU" @@ -2019,7 +2074,7 @@ msgstr "ΕνεÏγοποίηση MMU" msgid "Enable Progressive Scan" msgstr "ΕνεÏγοποίηση ΠÏοοδευτικής ΣάÏωσης" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "ΕνεÏγοποίηση ΠÏοφÏλαξης Οθόνης" @@ -2027,7 +2082,7 @@ msgstr "ΕνεÏγοποίηση ΠÏοφÏλαξης Οθόνης" msgid "Enable Speaker Data" msgstr "ΕνεÏγοποίηση Δεδομένων Ηχείου" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "ΕνεÏγοποίηση ΕυÏείας Οθόνης" @@ -2050,7 +2105,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, επιλέξτε 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2087,7 +2142,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2095,11 +2150,11 @@ msgstr "" "ΕνεÏγοποιήστε το για να επιταχÏνετε το The Legend of Zelda: Twilight " "Princess. ΑπενεÏγοποιήστε το για τα υπόλοιπα παιχνίδια." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "ΕνεÏγοποιεί το ΠÏοσαÏμοζόμενο Projection Hack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2107,22 +2162,13 @@ msgstr "" "ΕνεÏγοποιεί την Dolby Pro Logic II εξομοίωση χÏησιμοποιώντας 5.1 surround. " "Δεν διατίθεται για OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "ΕνεÏγοποιεί την Dolby Pro Logic II εξομοίωση χÏησιμοποιώντας 5.1 surround. " "Μόνο για OpenAL backend." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"ΕνεÏγοποιεί την Dolby Pro Logic II εξομοίωση χÏησιμοποιώντας 5.1 surround. " -"Μόνο για OpenAL backend. ΜποÏεί να χÏειαστεί να μετονομάσετε το soft_oal.dll " -"σε OpenAL32.dll για να λειτουÏγήσει." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2135,7 +2181,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2157,9 +2203,9 @@ msgstr "" msgid "End" msgstr "Τέλος" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Αγγλικά" @@ -2182,23 +2228,22 @@ msgstr "ΕγγÏαφή %d/%d" msgid "Entry 1/%d" msgstr "ΕγγÏαφή 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Ίσο" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Σφάλμα" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Αποτυχία φόÏτωσης της επιλεγμένης γλώσσας. ΕπαναφοÏά στην Ï€Ïοεπιλογή " "συστήματος." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2226,7 +2271,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2236,16 +2280,20 @@ msgstr "" msgid "Execute" msgstr "Εκτέλεση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Έξοδος" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Εξαγωγή Όλων Των ΑποθηκεÏσεων Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Αποτυχία Εξαγωγής" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Εξαγωγή ΑÏχείου" @@ -2253,7 +2301,7 @@ msgstr "Εξαγωγή ΑÏχείου" msgid "Export Recording" msgstr "Εξαγωγή ΕγγÏαφής" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Εξαγωγή ΕγγÏαφής..." @@ -2261,7 +2309,7 @@ msgstr "Εξαγωγή ΕγγÏαφής..." msgid "Export Save" msgstr "Εξαγωγή Αποθήκευσης" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Εξαγωγή Αποθήκευσης Wii (ΠειÏαματικό)" @@ -2269,15 +2317,15 @@ msgstr "Εξαγωγή Αποθήκευσης Wii (ΠειÏαματικό)" msgid "Export all saves" msgstr "Εξαγωγή όλων των αποθηκεÏσεων" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Αποτυχία εξαγωγής, Ï€Ïοσπάθεια ξανά;" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Αποτυχία εξαγωγής" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Εξαγωγή αποθήκευσης ως..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Επέκταση" @@ -2293,44 +2341,44 @@ msgstr "Επιπλέον ΠαÏάμετÏος" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Η Επιπλέον ΠαÏάμετÏος είναι χÏήσιμη μόνο στο ''Metroid: Other M''." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Εξαγωγή όλων των αÏχείων..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Εξαγωγή Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Εξαγωγή DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Εξαγωγή Φακέλου..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Εξαγωγή ΑÏχείου..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Εξαγωγή Κατάτμησης..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Γίνεται εξαγωγή %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Γίνεται εξαγωγή όλων των αÏχείων" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Γίνεται εξαγωγή φακέλου" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Γίνεται εξαγωγή..." @@ -2342,15 +2390,15 @@ msgstr "FIFO Byte" msgid "FIFO Player" msgstr "ΑναπαÏαγωγή FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "ΓΑΛΛΙΑ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Μέγεθος FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Αποτυχία σÏνδεσης!" @@ -2358,11 +2406,15 @@ msgstr "Αποτυχία σÏνδεσης!" msgid "Failed to download codes." msgstr "Αποτυχία μεταφόÏτωσης κωδικών." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Αποτυχία εξαγωγής στο %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2392,6 +2444,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Αποτυχία φόÏτωσης του bthprops.cpl! Δεν θα δουλέψει η σÏνδεση Ï€Ïαγματικών " +"Wiimotes και το Dolphin μποÏεί να τεÏματιστεί αναπάντεχα!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2399,21 +2453,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Αποτυχία φόÏτωσης του hid.dll! Δεν θα δουλέψει η σÏνδεση Ï€Ïαγματικών " +"Wiimotes και το Dolphin μποÏεί να τεÏματιστεί αναπάντεχα!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Αποτυχία ανάγνωσης %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Αποτυχία ανάγνωσης banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Αποτυχία ανάγνωσης της κεφαλίδας bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2424,7 +2480,7 @@ msgstr "" "ΜποÏεί να έχουν πεÏικοπεί τα δεδομένα στην κάÏτα μνήμης\n" "Θέση αÏχείου:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2432,7 +2488,7 @@ msgstr "" "Αποτυχία σωστής ανάγνωσης του αντιγÏάφου ασφαλείας του BAT\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2440,17 +2496,17 @@ msgstr "" "Αποτυχία σωστής ανάγνωσης του BAT\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Αποτυχία ανάγνωσης δεδομένων από το αÏχείο %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Αποτυχία ανάγνωσης δεδομένων από το αÏχείο: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2458,7 +2514,7 @@ msgstr "" "Αποτυχία σωστής ανάγνωσης του αντιγÏάφου ασφαλείας των φακέλων\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2466,11 +2522,11 @@ msgstr "" "Αποτυχία σωστής ανάγνωσης των φακέλων\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Αποτυχία ανάγνωσης κεφαλίδας" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2478,29 +2534,34 @@ msgstr "" "Αποτυχία σωστής ανάγνωσης της κεφαλίδας\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Αποτυχία ανάγνωσης της κεφαλίδας για το αÏχείο %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Αποτυχία ανάγνωσης Î¼Î¿Î½Î±Î´Î¹ÎºÎ¿Ï ID από την εικόνα δίσκου" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Αποτυχία εγγÏαφής του BT.DINF στο SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Αποτυχία εγγÏαφής του bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Αποτυχία εγγÏαφής δεδομένων στο αÏχείο: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Αποτυχία εγγÏαφής της κεφαλίδας για το %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Αποτυχία εγγÏαφής της κεφαλίδας για το αÏχείο %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "ΠεÏσικά" @@ -2510,13 +2571,13 @@ msgstr "ΓÏήγοÏη" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "ΓÏήγοÏος Υπολογισμός Βάθους" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "ΓÏήγοÏη έκδοση του MMU. Δε δουλεÏει για όλα τα παιχνίδια." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2524,7 +2585,7 @@ msgstr "" "ΑνεπανόÏθωτος αποσυγχÏονισμός. ΑκÏÏωση αναπαÏαγωγής. (Σφάλμα σε " "PlayWiimote: %u != %u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "ΑναπαÏαγωγή Fifo" @@ -2548,7 +2609,7 @@ msgstr "" "Το αÏχείο απέτυχε στο άνοιγμα\n" "ή δεν έχει έγκυÏη επέκταση" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2561,20 +2622,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Το αÏχείο δεν αναγνωÏίζεται σαν κάÏτα μνήμης" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Το αÏχείο δεν είναι συμπιεσμένο" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Άγνωστη λειτουÏγία ανοίγματος : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "ΑÏχεία δίσκου" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Ο Ï„Ïπος αÏχείου 'ini' είναι άγνωστος! Δε θα γίνει άνοιγμα!" @@ -2635,7 +2696,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2646,7 +2707,7 @@ msgstr "" "Άμα αφεθεί αποεπιλεγμένο, το dolphin Ï€Ïοεπιλέγει τη NTSC-U και ενεÏγοποιεί " "αυτόματα αυτήν την ÏÏθμιση όταν παίζονται Ιαπωνικά παιχνίδια." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2660,13 +2721,18 @@ msgstr "ΜπÏοστά" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "ΠÏοώθηση θÏÏας (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "Î’Ïέθηκαν %d αποτελέσματα για '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Î’Ïέθηκαν %x αÏχεία αποθήκευσης" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2708,9 +2774,9 @@ msgstr "ΚαÏέ ΠÏος ΕγγÏαφή" msgid "Free Look" msgstr "ΕλεÏθεÏη Ματιά" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Γαλλικά" @@ -2723,7 +2789,7 @@ msgstr "Frets" msgid "From" msgstr "Από" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "ΠλήÏης Οθόνη" @@ -2735,7 +2801,7 @@ msgstr "Ανάλυση ΠλήÏους Οθόνης:" msgid "GCI File(*.gci)" msgstr "ΑÏχεία GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GCPad" @@ -2743,27 +2809,27 @@ msgstr "GCPad" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID ΠαιχνιδιοÏ:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Το παιχνίδι εκτελείται ήδη!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Το παιχνίδι δεν εκτελείται!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Το παιχνίδι δεν βÏέθηκε!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Ρυθμίσεις ΣυγκεκÏιμένου ΠαιχνιδιοÏ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Ρυθμίσεις ΠαιχνιδιοÏ" @@ -2780,20 +2846,20 @@ msgid "Gamecube &Pad Settings" msgstr "Ρυθμίσεις Gamecube &Pad" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "ΚάÏτες Μνήμης Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Ρυθμίσεις ΧειÏιστηÏίου Gamecube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Κωδικοί Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2816,28 +2882,28 @@ msgstr "Γενικά" msgid "General Settings" msgstr "Γενικές Ρυθμίσεις" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "ΓεÏμανικά" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "GetARCode: Ο δείκτης είναι μεγαλÏτεÏος από το μέγεθος %lu της λίστας των " "κωδικών ar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "ΓÏαφικά" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Ρυθμίσεις ΓÏαφικών" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "ΜεγαλÏτεÏο από" @@ -2859,7 +2925,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το επιλεγμένο." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Ελληνικά" @@ -2883,11 +2949,11 @@ msgstr "ΚιθάÏα" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Αποτυχία ελέγχου κεφαλίδας" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "ΕβÏαϊκά" @@ -2899,7 +2965,7 @@ msgstr "Ύψος" msgid "Help" msgstr "Βοήθεια" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2921,7 +2987,7 @@ msgstr "" "\n" "Αντίο!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2974,7 +3040,7 @@ msgstr "Ρυθμίσεις ΠλήκτÏων Συντόμευσης" msgid "Hotkeys" msgstr "ΠλήκτÏα Συντόμευσης" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "ΟυγγÏικά" @@ -2982,18 +3048,18 @@ msgstr "ΟυγγÏικά" msgid "Hybrid Wiimote" msgstr "ΥβÏιδικό Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: ΑπόπειÏα ανάγνωσης δεδομένων από ένα άγνωστο εισιτήÏιο: " "%08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3002,15 +3068,15 @@ msgstr "" "TitleID %016llx.\n" "Το Dolphin πιθανότατα θα κολλήσει Ï„ÏŽÏα." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - μη έγκυÏος Ï€ÏοοÏισμός" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Ρυθμίσεις IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3022,15 +3088,15 @@ msgstr "Δείκτης IR" msgid "IR Sensitivity:" msgstr "Ευαισθησία IR:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ΛεπτομέÏειες ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Φάκελοι ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ΙΤΑΛΙΑ" @@ -3038,7 +3104,7 @@ msgstr "ΙΤΑΛΙΑ" msgid "Icon" msgstr "Εικονίδιο" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3083,9 +3149,13 @@ msgstr "" msgid "Import Save" msgstr "Εισαγωγή Αποθήκευσης" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Αποτυχία εισαγωγής, δοκιμή ξανά;" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Εισαγωγή Αποθήκευσης Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Η εισαγωγή απέτυχε" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3107,21 +3177,16 @@ msgstr "" "Το εισαγώμενο αÏχείο έχει sav επέκταση\n" "άλλα δεν έχει σωστή κεφαλίδα." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Εντός ΠαιχνιδιοÏ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Εντός ΠαιχνιδιοÏ" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "ΠεÏιοÏισμός ΚαÏέ:" +msgstr "ΑÏξηση ΟÏίου ΚαÏέ" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "ΠληÏοφοÏίες" @@ -3141,7 +3206,7 @@ msgstr "Εισάγετε" msgid "Insert Encrypted or Decrypted code here..." msgstr "Εισάγετε Κωδικοποιημένο ή μη Κωδικό εδώ..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Εισαγωγή ΚάÏτας SD" @@ -3149,38 +3214,39 @@ msgstr "Εισαγωγή ΚάÏτας SD" msgid "Insert name here.." msgstr "Εισάγετε όνομα εδώ..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Εγκατάσταση WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Εγκατάσταση στο ÎœÎµÎ½Î¿Ï Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler καλέστηκε, αλλά αυτή η πλατφόÏμα δεν το υποστηÏίζει " "ακόμα." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Γίνεται εγκατάσταση WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Σφάλμα Ελέγχου ΑκεÏαιότητας" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Ο έλεγχος ακεÏαιότητας ολοκληÏώθηκε." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Ο έλεγχος ακεÏαιότητας ολοκληÏώθηκε. Δε βÏέθηκαν σφάλματα." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3193,7 +3259,7 @@ msgstr "" msgid "Interface" msgstr "Διεπαφή" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Ρυθμίσεις Διεπαφής" @@ -3218,20 +3284,20 @@ msgstr "ΕσωτεÏικό Σφάλμα LZO - αποτυχία lzo_init()" msgid "Internal Resolution:" msgstr "ΕσωτεÏική Ανάλυση:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (ΠΟΛΥ αÏγός)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Εισαγωγή" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Μη έγκυÏο μέγεθος (%x) ή μαγική λέξη (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Μη έγκυÏη τιμή!" @@ -3239,16 +3305,16 @@ msgstr "Μη έγκυÏη τιμή!" msgid "Invalid bat.map or dir entry" msgstr "Μη έγκυÏο bat.map ή εγγÏαφή φακέλου" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Μη έγκυÏος Ï„Ïπος συμβάντος %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Μη έγκυÏο αÏχείο" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3259,7 +3325,7 @@ msgstr "" "%s\n" " Ίσως χÏειαστεί να ξαναεξάγετε την εικόνα Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ï€Î±Î¹Ï‡Î½Î¹Î´Î¹Î¿Ï Î±Ï€ÏŒ τον δίσκο." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Μη έγκυÏο αÏχείο εγγÏαφής" @@ -3275,34 +3341,36 @@ msgstr "Μη έγκυÏο string αναζήτησης (δεν μποÏεί να msgid "Invalid search string (only even string lengths supported)" msgstr "Μη έγκυÏο string αναζήτησης (μόνο ζυγά μήκη string υποστηÏίζονται)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Μη έγκυÏο κατάσταση" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Ιταλικά" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "ΙΑΠΩÎΙΑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Recompiler (Ï€Ïοτείνεται)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL πειÏαματικός recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Ιαπωνικά" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "ΚΟΡΕΑ" @@ -3324,8 +3392,9 @@ msgstr "ΔιατήÏηση ΠαÏαθÏÏου στην ΚοÏυφή" msgid "Key" msgstr "ΠλήκτÏο" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "ΚοÏεάτικα" @@ -3347,12 +3416,12 @@ msgstr "L-Αναλογική" msgid "Language:" msgstr "Γλώσσα:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Τελευταίο %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "ΧÏονοκαθυστέÏηση: " @@ -3391,7 +3460,7 @@ msgstr "" "ΑÏιστεÏÏŒ/Δεξί κλικ για πεÏισσότεÏες επιλογές.\n" "Μεσαίο κλικ για καθάÏισμα." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "ΜικÏότεÏο από" @@ -3408,58 +3477,48 @@ msgid "Load Custom Textures" msgstr "ΦόÏτωση ΤÏοποποιημένων Υφών" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&ΦόÏτωση Σημείου Αποθήκευσης" +msgstr "ΦόÏτωση Σημείου Αποθήκευσης" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 1" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 2" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 3" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 4" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 5" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 6" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 7" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 8" +msgstr "ΦόÏτωση Τελευταίας Αποθήκευσης 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "ΦόÏτωση Σημείου Αποθήκευσης 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 1" +msgstr "ΦόÏτωση Σημείου Αποθήκευσης 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3490,19 +3549,18 @@ msgid "Load State Slot 8" msgstr "ΦόÏτωση Σημείου Αποθήκευσης 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "ΦόÏτωση Σημείου Αποθήκευσης 1" +msgstr "ΦόÏτωση Σημείου Αποθήκευσης 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "ΦόÏτωση Σημείου Αποθήκευσης..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "ΦόÏτωση ÎœÎµÎ½Î¿Ï Î£Ï…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "ΦόÏτωση ÎœÎµÎ½Î¿Ï Î£Ï…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ Wii %d%c" @@ -3521,10 +3579,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "ΦόÏτωση Ï€Ïοεπιλεγμένων τιμών από διαθέσιμα Ï€Ïότυπα hack." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Τοπικό" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "ΚαταγÏαφή" @@ -3558,12 +3612,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Έξοδοι ΚαταγÏαφής" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "ΚαταγÏαφή" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Χάθηκε η σÏνδεση με τον διακομιστή!" @@ -3571,7 +3625,7 @@ msgstr "Χάθηκε η σÏνδεση με τον διακομιστή!" msgid "M Button" msgstr "M Button" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3580,9 +3634,9 @@ msgstr "" "Ασυμφωνία MD5\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" -msgstr "MMU Speed Hack" +msgstr "MMU Hack ΤαχÏτητας" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:517 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:556 @@ -3594,11 +3648,11 @@ msgstr "ΑÏχεία MadCatz Gameshark (*.gcs)" msgid "Main Stick" msgstr "ΚÏÏιο Stick" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID ΔημιουÏγοÏ:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "ΔημιουÏγός:" @@ -3635,7 +3689,7 @@ msgid "Memory Byte" msgstr "Memory Byte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "ΚάÏτα Μνήμης" @@ -3647,7 +3701,7 @@ msgstr "" "ΔιαχειÏιστής ΚαÏτών Μνήμης ΠΡΟΕΙΔΟΠΟΙΗΣΗ-Κάντε αντίγÏαφα ασφαλείας Ï€Ïιν την " "χÏήση, αν και διοÏθωμένος μποÏεί να χαλάσει Ï€Ïάγματα!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3664,7 +3718,7 @@ msgstr "" "%s\n" "Θέλετε να αντιγÏάψετε το παλιό αÏχείο σε αυτή την νέα τοποθεσία;\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "Το μέγεθος του αÏχείου της κάÏτας μνήμης δεν ταιÏιάζει με το μέγεθος της " @@ -3674,7 +3728,7 @@ msgstr "" msgid "Menu" msgstr "ΜενοÏ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "ΜικÏόφωνο" @@ -3687,7 +3741,7 @@ msgstr "Ελάχιστη" msgid "Misc" msgstr "ΔιάφοÏα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "ΔιάφοÏες Ρυθμίσεις" @@ -3713,11 +3767,11 @@ msgstr "" msgid "Monospaced font" msgstr "Ισοπλατής γÏαμματοσειÏά" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "ΜοτέÏ" @@ -3837,15 +3891,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Up" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Όνομα:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Όνομα: " @@ -3855,7 +3909,7 @@ msgstr "Όνομα: " msgid "Native GCI files(*.gci)" msgstr "ΑÏχεία Native GCI (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Îέα Ανίχνευση" @@ -3864,7 +3918,7 @@ msgstr "Îέα Ανίχνευση" msgid "Next Page" msgstr "Επόμενη Σελίδα" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Επόμενη Ανίχνευση" @@ -3872,11 +3926,11 @@ msgstr "Επόμενη Ανίχνευση" msgid "Nickname :" msgstr "Ψευδώνυμο :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Καμία ΧώÏα (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Δε βÏέθηκαν ISO ή WAD" @@ -3884,7 +3938,7 @@ msgstr "Δε βÏέθηκαν ISO ή WAD" msgid "No audio output" msgstr "Καμία έξοδος ήχου" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Δε βÏέθηκε αÏχείο εικονιδίου για τον τίτλο %s" @@ -3910,44 +3964,45 @@ msgstr "Δεν υπάÏχουν ελεÏθεÏες εγγÏαφές φακέλω msgid "No recorded file" msgstr "Κανένα εγγεγÏαμένο αÏχείο" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Δε βÏέθηκε φάκελος αποθήκευσης για τον τίτλο %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Καμία" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "ÎοÏβηγικά Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Όχι ίσο" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Μη ΟÏισμένο" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Δεν είναι σημείο αποθήκευσης wii ή αποτυχία ανάγνωσης κεφαλίδας αÏχείου " "μεγέθους %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Μη Συνδεδεμένο" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Σημειώσεις" @@ -3968,7 +4023,7 @@ msgstr "Σημείωση" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "ΑÏιθμός Κωδικών: " @@ -3989,7 +4044,7 @@ msgstr "Αντικείμενο" msgid "Object Range" msgstr "ΕÏÏος Αντικειμένου" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "ΑνενεÏγός" @@ -4001,25 +4056,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "Απεικόνιση Μηνυμάτων Στην Οθόνη" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online &ΕγχειÏίδια " + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Διαθέσιμα μόνο %d μπλοκ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Άνοιγμα" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Άνοιγμα &τοποθεσίας αÏχείου" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Άνοιγμα φακέλου αποθήκευσης Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Άνοιγμα αÏχείου..." @@ -4045,7 +4104,15 @@ msgstr "OpenCL Αποκωδικοποιητής Υφών" msgid "OpenMP Texture Decoder" msgstr "OpenMP Αποκωδικοποιητής Υφών" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Ανοίγει τις Ï€Ïοεπιλεγμένες (μόνο για ανάγνωση) Ïυθμίσεις για αυτό το " +"παιχνίδι σε έναν εξωτεÏικό επεξεÏγαστή κειμένου." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Ρυθμίσεις" @@ -4055,7 +4122,6 @@ msgid "Orange" msgstr "ΠοÏτοκαλί" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -4071,7 +4137,7 @@ msgstr "" msgid "Other" msgstr "Άλλα" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4083,15 +4149,15 @@ msgstr "" msgid "Output" msgstr "Έξοδος" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Αναπα&Ïαγωγή ΕγγÏαφής" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "ΧειÏιστήÏιο" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "ΧειÏιστήÏιο" @@ -4115,17 +4181,17 @@ msgstr "ΠαÏάγÏαφος" msgid "Parameters" msgstr "ΠαÏάμετÏοι" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Κατάτμηση %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Η κατάτμηση δεν υπάÏχει: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patches" @@ -4133,8 +4199,8 @@ msgstr "Patches" msgid "Paths" msgstr "Φάκελοι" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "ΠαÏση" @@ -4147,7 +4213,7 @@ msgstr "ΠαÏση στο τέλος της ταινίας" msgid "Per-Pixel Lighting" msgstr "Φωτισμός ανά Pixel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Τέλειο" @@ -4157,9 +4223,9 @@ msgid "Perspective %d" msgstr "Οπτική %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "ΑναπαÏαγωγή" @@ -4171,7 +4237,7 @@ msgstr "ΑναπαÏαγωγή ΕγγÏαφής" msgid "Play/Pause" msgstr "ΑναπαÏαγωγή/ΠαÏση" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Παίζεται" @@ -4179,11 +4245,11 @@ msgstr "Παίζεται" msgid "Playback Options" msgstr "Ρυθμίσεις ΑναπαÏαγωγής" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Παίχτες" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "ΠαÏακαλώ επιβεβαιώστε..." @@ -4195,23 +4261,23 @@ msgstr "ΠαÏακαλώ δημιουÏγήστε μια οπτική Ï€Ïιν msgid "Plus-Minus" msgstr "Plus-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Πολωνέζικα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "ΘÏÏα 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "ΘÏÏα 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "ΘÏÏα 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "ΘÏÏα 4" @@ -4220,11 +4286,11 @@ msgstr "ΘÏÏα 4" msgid "Port :" msgstr "ΘÏÏα :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "ΠοÏτογαλικά" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "ΠοÏτογαλικά (Î’Ïαζιλιάνικα)" @@ -4232,17 +4298,17 @@ msgstr "ΠοÏτογαλικά (Î’Ïαζιλιάνικα)" msgid "Post-Processing Effect:" msgstr "Post-Processing Εφέ:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "ΠÏόωÏος τεÏματισμός της ταινίας σε PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "ΠÏόωÏος τεÏματισμός της ταινίας σε PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "ΠÏόωÏος τεÏματισμός της ταινίας σε PlayWiimote. %u > %u" @@ -4259,7 +4325,7 @@ msgstr "ΠÏοηγοÏμενη Σελίδα" msgid "Previous Page" msgstr "ΠÏοηγοÏμενη Σελίδα" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "ΠÏοηγοÏμενη Τιμή" @@ -4275,7 +4341,7 @@ msgstr "ΠÏοφίλ" msgid "Properties" msgstr "Ιδιότητες" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "ΚαθαÏισμός Cache" @@ -4284,7 +4350,7 @@ msgid "Question" msgstr "ΕÏώτηση" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Έξοδος" @@ -4306,13 +4372,13 @@ msgstr "R-Αναλογική" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "ΡΩΣΙΑ" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Ακτίνα" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4328,7 +4394,7 @@ msgstr "ΠÏαγματικό" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "ΠÏαγματική Σανίδα ΙσοÏÏοπίας" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4345,6 +4411,10 @@ msgstr "ΠÏαγματικά Wiimotes" msgid "Record" msgstr "ΕγγÏαφή" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "ΕγγÏαφή χειÏισμών" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "ΠληÏοφοÏίες ΕγγÏαφής" @@ -4380,7 +4450,7 @@ msgstr "" "Αν δεν είστε σίγουÏοι, επιλέξτε Καμία." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Ανανέωση" @@ -4389,14 +4459,14 @@ msgstr "Ανανέωση" msgid "Refresh List" msgstr "Ανανέωση Λίστας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Ανανέωση λίστας παιχνιδιών" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "ΑφαίÏεση" @@ -4419,7 +4489,7 @@ msgstr "ΑναπαÏαγωγή στο ΚεντÏικό ΠαÏάθυÏο" msgid "Reset" msgstr "Επανεκκίνηση" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Αποτελέσματα" @@ -4427,9 +4497,9 @@ msgstr "Αποτελέσματα" msgid "Return" msgstr "Return" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revision:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4440,20 +4510,19 @@ msgstr "Δεξιά" msgid "Right Stick" msgstr "Δεξί Stick" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Δόνηση" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Εκτέλεση DSP HLE και LLE σε ξεχωÏιστό νήμα (δεν Ï€Ïοτείνεται: μποÏεί να " -"Ï€Ïοκαλέσει Ï€Ïοβλήματα στον ήχο με HLE και κολλήματα με LLE)." +"Εκτέλεση DSP LLE σε ξεχωÏιστό νήμα (δεν Ï€Ïοτείνεται: μποÏεί να Ï€Ïοκαλέσει " +"κολλήματα)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Ρώσικα" @@ -4466,7 +4535,7 @@ msgid "Safe" msgstr "Ασφαλής" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Αποθήκ." @@ -4476,23 +4545,20 @@ msgid "Save GCI as..." msgstr "Αποθήκευση GCI ως..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Απ&οθήκευση Σημείου Αποθήκευσης" +msgstr "Αποθήκευση ΠαλαιότεÏου Σημείου" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Απ&οθήκευση Σημείου Αποθήκευσης" +msgstr "Αποθήκευση Σημείου" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Αποθήκευση Σημείου Αποθήκευσης 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Αποθήκευση Σημείου Αποθήκευσης 1" +msgstr "Αποθήκευση Σημείου Αποθήκευσης 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4523,32 +4589,31 @@ msgid "Save State Slot 8" msgstr "Αποθήκευση Σημείου Αποθήκευσης 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Αποθήκευση Σημείου Αποθήκευσης 1" +msgstr "Αποθήκευση Σημείου Αποθήκευσης 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Αποθήκευση Σημείου..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Αποθήκευση ως..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Αποθήκευση συμπιεσμένου GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Αποθήκευση Ï„Ïέχουσας οπτικής" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Αποθήκευση αποσυμπιεσμένου GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4559,20 +4624,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "ΚλιμακοÏμενα EFB ΑντίγÏαφα" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Ανίχνευση %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Αναζήτηση για ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Ανίχνευση..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Στιγμιότυπο" @@ -4584,11 +4649,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Αναζήτηση" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "ΦίλτÏο Αναζήτησης" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Αναζήτηση σε Υποφακέλους" @@ -4611,12 +4676,12 @@ msgstr "Η ενότητα %s δε βÏέθηκε στο SYSCONF" msgid "Select" msgstr "Επιλογή" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Επιλέξτε το ΑÏχείο ΕγγÏαφής" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Επιλέξτε ένα Wii WAD αÏχείο για εγκατάσταση" @@ -4638,19 +4703,19 @@ msgstr "Επιλέξτε ένα αÏχείο αποθήκευσης για ει msgid "Select floating windows" msgstr "Επιλέξτε αιωÏοÏμενα παÏάθυÏα" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Επιλέξτε το αÏχείο για φόÏτωση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Επιλέξτε αÏχείο αποθήκευσης" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Επιλέξτε το σημείο φόÏτωσης" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Επιλέξτε το σημείο αποθήκευσης" @@ -4673,7 +4738,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι επιλέξτε Αυτόματα." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Το επιλεγμένο Ï€Ïοφίλ χειÏÎ¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ υπάÏχει" @@ -4698,39 +4763,28 @@ msgstr "" "σας.\n" "Αν πάλι δεν είστε σίγουÏοι, χÏησιμοποιήστε την υψηλότεÏη λειτουÏγική ανάλυση." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Επιλέγει το API γÏαφικών που θα χÏησιμοποιηθεί εσωτεÏικά.\n" -"Το Direct3D 9 συνήθως είναι το γÏηγοÏότεÏο. Το OpenGL είναι πεÏισσότεÏο " -"ακÏιβές όμως. Το Direct3D 11 βÏίσκεται κάπου ενδιάμεσα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ δÏο.\n" -"Σημειώστε ότι τα Direct3D backends είναι διαθέσιμα μόνο στα Windows.\n" -"\n" -"Αν δεν είστε σίγουÏοι, χÏησιμοποιήστε το Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Επιλέγει το API γÏαφικών που θα χÏησιμοποιηθεί εσωτεÏικά.\n" -"Το Direct3D 9 συνήθως είναι το γÏηγοÏότεÏο. Το OpenGL είναι πεÏισσότεÏο " -"ακÏιβές όμως. Το Direct3D 11 βÏίσκεται κάπου ενδιάμεσα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ δÏο.\n" -"Σημειώστε ότι τα Direct3D backends είναι διαθέσιμα μόνο στα Windows.\n" -"\n" -"Αν δεν είστε σίγουÏοι, χÏησιμοποιήστε το OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Αποστολή" @@ -4742,18 +4796,18 @@ msgstr "Θέση Sensor Bar:" msgid "Separator" msgstr "ΔιαχωÏιστής" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "ΣεÏβικά" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "ΣειÏιακή ΘÏÏα 1 - Αυτή είναι η θÏÏα που χÏησιμοποιοÏν οι συσκευές όπως ο " "Ï€ÏοσαÏμογέας δικτÏου" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "ΟÏισμός ως Ï€Ïοεπιλεγμένο &ISO" @@ -4762,7 +4816,7 @@ msgstr "ΟÏισμός ως Ï€Ïοεπιλεγμένο &ISO" msgid "Set as default Memcard %c" msgstr "ΟÏισμός ως Ï€Ïοεπιλεγμένη ΚάÏτα Μνήμης %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4777,19 +4831,19 @@ msgstr "" "ΟÏίζει την χÏονοκαθυστέÏηση (σε ms). ΥψηλότεÏες τιμές μποÏεί να μειώσουν τις " "διακοπές στον ήχο. Μόνο για OpenAL backend." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Ρυθμίσεις..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem:Αδυναμία εÏÏεσης αÏχείου Ïυθμίσεων" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Αδυναμία δημιουÏγίας αÏχείου Ïυθμίσεων" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "ΚοÏνημα" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "ΣÏντομο Όνομα:" @@ -4797,23 +4851,27 @@ msgstr "ΣÏντομο Όνομα:" msgid "Shoulder Buttons" msgstr "Κουμπιά Shoulder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Εμφάνιση &Κονσόλας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Εμφάνιση ΠαÏαθÏÏου Κατα&γÏαφής " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Εμφάνιση ΜπάÏας Κατάστασης" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Εμφάνιση ΓÏαμμής &ΕÏγαλείων" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Εμφάνιση ΠÏοεπιλογών" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Εμφάνιση Οδηγών" @@ -4825,11 +4883,11 @@ msgstr "Εμφάνιση ΠεÏιοχών EFB ΑντιγÏαφών" msgid "Show FPS" msgstr "Εμφάνιση FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Εμφάνιση Γαλλίας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Εμφάνιση GameCube" @@ -4837,35 +4895,35 @@ msgstr "Εμφάνιση GameCube" msgid "Show Input Display" msgstr "Εμφάνιση ΠÏοβολής ΧειÏισμών" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Εμφάνιση Ιταλίας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Εμφάνιση JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Εμφάνιση ΚοÏέας" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Εμφάνιση Γλώσσας:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Εμφάνιση Ρυθμίσεων &ΚαταγÏαφέα" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Εμφάνιση PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Εμφάνιση ΠλατφόÏμας" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Εμφάνιση ΠεÏιοχών" @@ -4873,27 +4931,27 @@ msgstr "Εμφάνιση ΠεÏιοχών" msgid "Show Statistics" msgstr "Εμφάνιση Στατιστικών" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Εμφάνιση Ταϊβάν" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Εμφάνιση USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Εμφάνιση Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Εμφάνιση Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Εμφάνιση επιβεβαίωσης Ï€Ïιν τη διακοπή ενός παιχνιδιοÏ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4912,7 +4970,7 @@ msgstr "Εμφάνιση Ï€Ïώτου μπλοκ" msgid "Show lag counter" msgstr "Εμφάνιση μετÏητή καθυστέÏησης " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4951,7 +5009,7 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Εμφάνιση Αγνώστων" @@ -4965,23 +5023,24 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "ΟÏιζόντια Θέση Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Κινέζικα Απλοποιημένα" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Μέγεθος" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "ΠαÏάλειψη BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "ΠαÏάληψη εκκαθάÏισης DCBZ" @@ -5006,17 +5065,17 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Θέση %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Θέση Α" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Θέση Î’" @@ -5024,7 +5083,7 @@ msgstr "Θέση Î’" msgid "Snapshot" msgstr "Στιγμιότυπο" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Απεικόνιση ΛογισμικοÏ" @@ -5041,27 +5100,27 @@ msgstr "" "Θέλετε όντως να χÏησιμοποιήσετε την απεικόνιση λογισμικοÏ; Αν δεν είστε " "σίγουÏοι, επιλέξτε 'Όχι'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Ρυθμίσεις Ήχου" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Το backend ήχου %s δεν είναι έγκυÏο." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Αποτυχία δημιουÏγίας buffer ήχου: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Space" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Ισπανικά" @@ -5090,37 +5149,29 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, επιλέξτε 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Επιτάχυνση του Î¡Ï…Î¸Î¼Î¿Ï ÎœÎµÏ„Î±Ï†Î¿Ïάς από τον Δίσκο" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "ΤετÏάγωνο Stick" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Τυπικός Controller" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Εκκίνηση" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Εκκίνηση ΛειτουÏγίας &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Εκκίνηση Ε&γγÏαφής" @@ -5128,7 +5179,7 @@ msgstr "Εκκίνηση Ε&γγÏαφής" msgid "Start Recording" msgstr "Εκκίνηση ΕγγÏαφής" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Λειτ." @@ -5136,7 +5187,7 @@ msgstr "Λειτ." msgid "State Saves" msgstr "Σημεία Αποθήκευσης" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Τιμόνι" @@ -5145,7 +5196,7 @@ msgid "Stick" msgstr "Stick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Διακοπή" @@ -5176,28 +5227,28 @@ msgstr "Strum" msgid "Subtract" msgstr "Subtract" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Επιτυχής εξαγωγή αÏχείου στο %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Επιτυχής εισαγωγή σημείων αποθήκευσης" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Σουηδικά" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Swing" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "ΣυγχÏονισμός του νήματος της GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5206,12 +5257,13 @@ msgstr "" "κολλήματα σε λειτουÏγία Î”Î¹Ï€Î»Î¿Ï Î Ï…Ïήνα . (ΕνεÏγό = Συμβατότητα, ΑνενεÏγό = " "ΤαχÏτητα)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Γλώσσα Συστήματος:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "ΤΑΪΒΑÎ" @@ -5236,13 +5288,13 @@ msgstr "ΑÏιστεÏÏŒ Table" msgid "Table Right" msgstr "Δεξί Table" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "ΔημιουÏγία Στιγμιότυπου" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5262,11 +5314,11 @@ msgstr "Cache Υφών" msgid "Texture Format Overlay" msgstr "Επικάλυψη Του Format Υφών" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "Το WAD εγκαταστάθηκε με επιτυχία" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Η διεÏθυνση είναι άκυÏη" @@ -5274,13 +5326,13 @@ msgstr "Η διεÏθυνση είναι άκυÏη" msgid "The checksum was successfully fixed" msgstr "Το checksum διοÏθώθηκε με επιτυχία" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Ο επιλεγμένος φάκελος βÏίσκεται ήδη στη λίστα" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5303,7 +5355,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Το αÏχείο %s ήταν ήδη ανοιχτό, η κεφαλίδα του αÏχείου δε θα γÏαφεί." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Το αÏχείο που επιλέξατε (%s) δεν υπάÏχει" @@ -5338,7 +5390,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "Το σημείο αποθήκευσης που Ï€Ïοσπαθείτε να αντιγÏάψετε έχει μη έγκυÏο μέγεθος" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5346,36 +5398,36 @@ msgstr "" "Η επιλεγμένη γλώσσα δεν υποστηÏίζεται από το σÏστημά σας. ΕπαναφοÏά στην " "Ï€Ïοεπιλογή συστήματος." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Οι εκδόσεις NetPlay του διακομιστή και του πελάτη δεν είναι συμβατές!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Ο διακομιστής είναι γεμάτος!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Ο διακομιστής απάντησε: το παιχνίδι Ï„Ïέχει!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Ο διακομιστής επέστÏεψε ένα άγνωστο μήνυμα σφάλματος!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Το επιλεγμένο αÏχείο \"%s\" δεν υπάÏχει" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Η τιμή είναι άκυÏη" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Θέμα:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5383,7 +5435,7 @@ msgstr "" "ΠÏέπει να υπάÏχει εισητήÏιο για 00000001/00000002. Το NAND dump σας είναι " "πιθανότατα ημιτελές." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5392,7 +5444,7 @@ msgstr "" "Αν είναι ακαθόÏιστη η επιλογή το παιχνίδι χÏησιμοποιεί τις γενικές Ïυθμίσεις " "του Dolphin. " -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5400,7 +5452,7 @@ msgstr "" "Αυτός ο Ï€Ïοσομοιωτής action replay δεν υποστηÏίζει κωδικοÏÏ‚ που αλλάζουν το " "ίδιο το Action Replay." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "Αυτό μποÏεί να Ï€Ïοκαλέσει καθυστεÏήσεις στο ÎœÎµÎ½Î¿Ï Wii και σε μεÏικά " @@ -5429,20 +5481,20 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Αν θέσετε τιμή υψηλότεÏη από την πλήÏη ταχÏτητα του Ï€Î±Î¹Ï‡Î½Î¹Î´Î¹Î¿Ï (NTSC:60, " -"PAL:50), χÏησιμοποιήστε τον ήχο για να κάνετε Throttle μέσω DSP (μποÏεί να " +"ΠεÏιοÏίζει την ταχÏτητα του Ï€Î±Î¹Ï‡Î½Î¹Î´Î¹Î¿Ï ÏƒÏ„Î¿ Ï€ÏοκαθοÏισμένο αÏιθμό των καÏέ " +"ανά δευτεÏόλεπτο (η πλήÏης ταχÏτητα είναι 60 για NTSC και 50 για PAL). " +"Εναλλακτικά, επιλέξτε το \"Ήχος\" για να κάνετε Throttle μέσω DSP (μποÏεί να " "διοÏθώσει οÏισμένα κλικαÏίσματα στον ήχο άλλα και να Ï€Ïοκαλέσει συνεχές " -"θόÏυβο αναλόγα με το παιχνίδι)." +"θόÏυβο ανάλογα με το παιχνίδι)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5454,7 +5506,7 @@ msgstr "" "ΠÏοκαλεί μεγάλη επιτάχυνση σε PC με πεÏισσότεÏους από έναν πυÏήνες,\n" "αλλά μποÏεί να Ï€Ïοκαλέσει κÏασαÏίσματα ή άλλα Ï€Ïοβλήματα. " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" "Αυτό σας επιτÏέπει την χειÏοκίνητη επεξεÏγασία του αÏχείου Ïυθμίσεων INI" @@ -5464,12 +5516,12 @@ msgstr "" msgid "Threshold" msgstr "Κατώφλι" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Πλάγιασμα" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Τίτλος" @@ -5483,39 +5535,37 @@ msgid "Toggle All Log Types" msgstr "Εναλλαγή Όλων ΤÏπων ΚαταγÏαφής " #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Αναλογία Οθόνης:" +msgstr "Εναλλαγή Αναλογίας Οθόνης" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB ΑντίγÏαφα" +msgstr "Εναλλαγή EFB ΑντίγÏαφα" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Εναλλαγή Όλων ΤÏπων ΚαταγÏαφής " +msgstr "Εναλλαγή Ομίχλης" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Εναλλαγή ΠλήÏους Οθόνης" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Εναλλαγή ΕσωτεÏικής Ανάλυσης" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "ΚοÏυφή" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Κινέζικα ΠαÏαδοσιακά " -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "ΠÏοσπάθεια φόÏτωσης ενός άγνωστου Ï„Ïπου αÏχείο." @@ -5535,7 +5585,7 @@ msgstr "" "ΠÏοσπάθεια ανάγνωσης από ένα μη έγκυÏο SYSCONF\n" "Τα Wiimote bt ids δεν είναι διαθέσιμα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "ΤουÏκικά" @@ -5551,12 +5601,12 @@ msgstr "ΤÏπος" msgid "UDP Port:" msgstr "ΠόÏτα UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ΑΓÎΩΣΤΟ" @@ -5565,7 +5615,7 @@ msgstr "ΑΓÎΩΣΤΟ" msgid "UNKNOWN_%02X" msgstr "ΑΓÎΩΣΤΟ_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "ΗΠΑ" @@ -5578,9 +5628,9 @@ msgstr "" "Η entry δεν μεταβλήθηκε." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5589,7 +5639,7 @@ msgstr "" "τον πληκτÏολογήσατε σωστά.\n" "Θα θέλατε να αγνοήσετε αυτήν την γÏαμμή και να συνεχίσετε με το parsing;" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Μη οÏισμένο %i" @@ -5599,19 +5649,18 @@ msgid "Undo Load State" msgstr "ΑναίÏεση ΦόÏτωσης Σημείου Αποθ. " #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "ΑναίÏεση ΦόÏτωσης Σημείου Αποθ. " +msgstr "ΑναίÏεση Αποθήκευσης Σημείου Αποθ. " #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Αναπάντεχη 0x80 κλήση; Ματαίωση..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Άγνωστο" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Άγνωστη εντολή DVD %08x - κÏίσιμο σφάλμα" @@ -5626,12 +5675,12 @@ msgstr "Άγνωστη εντολή 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Άγνωστος Ï„Ïπος καταχώÏησης %i στο SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Ελήφθη άγνωστο μήνυμα με id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "Ελήφθη άγνωστο μήνυμα με:%d από τον παίκτη:%d ΑποσÏνδεση παίκτη!" @@ -5641,16 +5690,16 @@ msgstr "Ελήφθη άγνωστο μήνυμα με:%d από τον παίκ msgid "Up" msgstr "Πάνω" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "ΕνημέÏωση" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Κάθετη Θέση Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "ΧÏήση ΛειτουÏγίας EuRGB60 (PAL60)" @@ -5658,7 +5707,7 @@ msgstr "ΧÏήση ΛειτουÏγίας EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "ΧÏήση ΠλήÏους Οθόνης" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "ΧÏήση Hex" @@ -5673,6 +5722,12 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"ΧÏησιμοποιήστε έναν λιγότεÏο ακÏιβή αλγόÏιθμο για τον υπολογισμό των τιμών " +"βάθους.\n" +"ΠÏοκαλεί Ï€Ïοβλήματα σε μεÏικά παιχνίδια, αλλά μποÏεί να δώσει μια αξιοπÏεπή " +"επιτάχυνση.\n" +"\n" +"Αν δεν είστε σίγουÏοι, αφήστε το επιλεγμένο." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5687,6 +5742,20 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"ΧÏησιμοποιεί μη ασφαλείς Ï€Ïάξεις για να επιταχÏνει την Ïοή των κοÏυφών στο " +"OpenGL. Δεν υπάÏχουν γνωστά Ï€Ïοβλήματα σε GPUs που το υποστηÏίζουν, αλλά θα " +"Ï€Ïοκαλέσει σοβαÏά Ï€Ïοβλήματα σταθεÏότητας και στα γÏαφικά διαφοÏετικά.\n" +"\n" +"Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5710,12 +5779,11 @@ msgstr "ΕÏγαλεία" msgid "V-Sync" msgstr "Κάθετος ΣυγχÏονισμός" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Speed Hack" +msgstr "VBeam Hack ΤαχÏτητας" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Τιμή" @@ -5723,7 +5791,7 @@ msgstr "Τιμή" msgid "Value:" msgstr "Τιμή:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Τιμή: " @@ -5733,9 +5801,9 @@ msgstr "Αναλυτικότητα" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hack Ροής ΚοÏυφών" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Βίντεο" @@ -5743,17 +5811,17 @@ msgstr "Βίντεο" msgid "Virtual" msgstr "Εικονικό" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Ένταση" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Αποτυχία εγκατάστασης WAD: σφάλμα κατά τη δημιουÏγία του %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Αποτυχία εγκατάστασης WAD: σφάλμα κατά τη δημιουÏγία του εισιτηÏίου" @@ -5776,19 +5844,19 @@ msgstr "" msgid "Warning" msgstr "ΠÏοειδοποίηση" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "ΠÏοειδοποίηση - εκκίνηση DOL σε λάθος λειτουÏγία κονσόλας!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "ΠÏοειδοποίηση - εκκίνηση ELF σε λάθος λειτουÏγία κονσόλας!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "ΠÏοειδοποίηση - εκκίνηση ISO σε λάθος λειτουÏγία κονσόλας!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5814,7 +5882,7 @@ msgstr "" "και έχουν το ίδιο όνομα με αÏχεία στη memcard\n" "Συνέχεια;" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5826,7 +5894,7 @@ msgstr "" "φοÏτώσετε άλλο σημείο αποθήκευσης Ï€ÏÏ‰Ï„Î¿Ï ÏƒÏ…Î½ÎµÏ‡Î¯ÏƒÎµÏ„Îµ ή να φοÏτώσετε το Ï„Ïέχων " "με απενεÏγοποιημένη την λειτουÏγία Μόνο Για Ανάγνωση (ΕγγÏαφής)." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5839,7 +5907,7 @@ msgstr "" "την λειτουÏγία Μόνο Για Ανάγνωση (ΕγγÏαφής). Ειδάλλως πιθανώς θα εμφανιστεί " "ασυγχÏονισμός." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5895,19 +5963,15 @@ msgstr "Πλάτος" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii Κονσόλα" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND Ρίζα:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Εισαγωγή Αποθήκευσης Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "ΑÏχεία αποθήκευσης Wii (*.bin)|*.bin" @@ -5916,16 +5980,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Αδυναμία ανάγνωσης από αÏχείο" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Συνδεδεμένο Wiimote" @@ -5933,7 +6003,7 @@ msgstr "Συνδεδεμένο Wiimote" msgid "Wiimote Motor" msgstr "ÎœÎ¿Ï„Î­Ï Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Ρυθμίσεις Wiimote" @@ -5957,16 +6027,16 @@ msgstr "Windows Right" msgid "Word Wrap" msgstr "Αναδίπλωση Λέξεων" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Σε εÏγασία..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "ΕγγÏαφή ΚαÏτών Μνήμης (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5984,21 +6054,36 @@ msgstr "ΕγγÏαφή σε ΑÏχείο" msgid "Write to Window" msgstr "ΕγγÏαφή στο ΠαÏάθυÏο" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "Αποτυχία CreateSourceVoice XAudio2: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Αποτυχία αÏχικοποίησης XAudio2: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "Αποτυχία δημιουÏγίας κεντÏικής φωνής XAudio2: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "Αποτυχία CreateSourceVoice XAudio2: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Αποτυχία αÏχικοποίησης XAudio2: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Αποτυχία δημιουÏγίας κεντÏικής φωνής XAudio2: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -6036,11 +6121,11 @@ msgstr "Δεν μποÏείτε να κλείσετε pane που έχουν σ msgid "You must choose a game!!" msgstr "ΠÏέπει να επιλέξετε ένα παιχνίδι!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "ΠÏέπει να εισάγετε ένα όνομα!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "ΠÏέπει να εισάγετε μία έγκυÏη οκταδική ή δεκαεξαδική τιμή." @@ -6048,7 +6133,7 @@ msgstr "ΠÏέπει να εισάγετε μία έγκυÏη οκταδική msgid "You must enter a valid profile name." msgstr "ΠÏέπει να εισάγετε ένα έγκυÏο όνομα Ï€Ïοφίλ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" "ΠÏέπει να κάνετε επανεκκίνηση του Dolphin για να έχει επίπτωση αυτή η αλλαγή." @@ -6063,7 +6148,7 @@ msgstr "" "Θέλετε να γίνει διακοπή Ï„ÏŽÏα για να διοÏθώσετε το Ï€Ïόβλημα;\n" "Εάν επιλέξετε \"Όχι\", ο ήχος μποÏεί να είναι χαλασμένος." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6082,15 +6167,15 @@ msgstr "" "Θα έπÏεπε να είναι 0x%04x (αλλά είναι 0x%04llx)\n" "Θέλετε να δημιουÏγηθεί ένα καινοÏÏιο;" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Δεν υποστηÏίζεται ο Zero 3 code" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Άγνωστος Zero code: %08x" @@ -6149,20 +6234,24 @@ msgstr "" "\n" "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Ανάγνωση Opcode από %x. ΠαÏακαλώ να το αναφέÏετε." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "άγνωστο flavor %d (αναμενόταν %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "ελήφθη άγνωστο μήνυμα" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "Το wxExecute επέστÏεψε -1 κατά την εκκίνηση της εφαÏμογής!" @@ -6178,76 +6267,49 @@ msgstr "zNear ΔιόÏθωση: " msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "ΑκÏιβής VBeam εξομοίωση" +#~ msgid "Could not create %s" +#~ msgstr "Αποτυχία δημιουÏγίας %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "ΕπεξεÏγασία Τοπικών Ρυθμίσεων" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Ανοίγει τις τοπικές Ïυθμίσεις του χÏήστη σε έναν εξωτεÏικό επεξεÏγαστή " +#~ "κειμένου." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "ΕπιτÏέπει την εναλλαγή οÏισμένων επιλογών με τα πλήκτÏα συντόμευσης 3 " -#~ "(ΕσωτεÏική Ανάλυση), 4 (Αναλογία Οθόνης), 5 (EFB ΑντίγÏαφα) και 6 " -#~ "(Ομίχλη) μέσα από το παÏάθυÏο εξομοίωσης.\n" +#~ "Επιλέγει το API γÏαφικών που θα χÏησιμοποιηθεί εσωτεÏικά.\n" +#~ "Το Direct3D 9 συνήθως είναι το γÏηγοÏότεÏο. Το OpenGL είναι πεÏισσότεÏο " +#~ "ακÏιβές όμως. Το Direct3D 11 βÏίσκεται κάπου ενδιάμεσα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ δÏο.\n" +#~ "Σημειώστε ότι τα Direct3D backends είναι διαθέσιμα μόνο στα Windows.\n" #~ "\n" -#~ " Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Αποτυχία εÏÏεσης WiiMote με bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "ΕνεÏγοποίηση ΣυντομεÏσεων" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Αποτυχία ακÏόασης!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Αποτυχία φόÏτωσης bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Αποτυχία φόÏτωσης hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Ρυθμίσεις ΜικÏοφώνου GC" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "Γίνεται κλήση του HCI_CMD_INQUIRY, παÏακαλώ αναφέÏετε!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "ΧακαÏισμένο Ανέβασμα Buffer" +#~ "Αν δεν είστε σίγουÏοι, χÏησιμοποιήστε το Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Αν τα FPS διακυμαίνονται, αυτή η επιλογή μποÏείο να βοηθήσει. (ΕνεÏγό = " -#~ "Συμβατό, ΑνενεÏγό = ΓÏήγοÏο)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Τελευταίο ΕπαναγÏαμμένο Σημείο Αποθ." - -#~ msgid "Last Saved State" -#~ msgstr "Τελευταίο Αποθηκευμένο Σημείο Αποθ." - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "ΕπανασÏνδεση Wiimote Κατά Την ΦόÏτωση Σημείου Αποθήκευσης" - -#~ msgid "Set" -#~ msgstr "ΟÏισμός" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "ΠαÏάλειψη Dest. Alpha Pass" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "ΧÏησιμοποιείται μια χακαÏισμένη στÏατηγική ανεβάσματος για την Ïοή των " -#~ "γωνιών.\n" -#~ "Αυτό συνήθως αυξάνει την ταχÏτητα, αλλά απαγοÏεÏεται απο τις Ï€ÏοδιαγÏαφές " -#~ "του OpenGL και μποÏεί να Ï€Ïοκαλέσει μεγάλα Ï€Ïοβλήματα.\n" +#~ "Επιλέγει το API γÏαφικών που θα χÏησιμοποιηθεί εσωτεÏικά.\n" +#~ "Το Direct3D 9 συνήθως είναι το γÏηγοÏότεÏο. Το OpenGL είναι πεÏισσότεÏο " +#~ "ακÏιβές όμως. Το Direct3D 11 βÏίσκεται κάπου ενδιάμεσα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ δÏο.\n" +#~ "Σημειώστε ότι τα Direct3D backends είναι διαθέσιμα μόνο στα Windows.\n" #~ "\n" -#~ "Αν δεν είστε σίγουÏοι, αφήστε το αποεπιλεγμένο." +#~ "Αν δεν είστε σίγουÏοι, χÏησιμοποιήστε το OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Ανάγνωση Opcode από %x. ΠαÏακαλώ να το αναφέÏετε." diff --git a/Languages/po/en.po b/Languages/po/en.po index bb5201b3e1..46a2b7906e 100644 --- a/Languages/po/en.po +++ b/Languages/po/en.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emu\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" "PO-Revision-Date: 2011-01-06 14:53+0100\n" "Last-Translator: BhaaL \n" "Language-Team: \n" @@ -16,13 +16,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "" @@ -30,14 +30,14 @@ msgstr "" msgid "! NOT" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" " Create a new 16MB Memcard?" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -52,64 +52,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -138,7 +143,7 @@ msgstr "" msgid "&& AND" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "" @@ -146,7 +151,7 @@ msgstr "" msgid "&Boot from DVD Drive..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "" @@ -154,7 +159,7 @@ msgstr "" msgid "&Browse for ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "" @@ -162,11 +167,11 @@ msgstr "" msgid "&DSP Settings" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "" @@ -178,11 +183,11 @@ msgstr "" msgid "&File" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "" @@ -190,7 +195,7 @@ msgstr "" msgid "&Graphics Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "" @@ -198,7 +203,7 @@ msgstr "" msgid "&Hotkey Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "" @@ -210,11 +215,11 @@ msgstr "" msgid "&Memcard Manager (GC)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "" @@ -222,51 +227,51 @@ msgstr "" msgid "&Options" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "" @@ -274,7 +279,7 @@ msgstr "" msgid "&Wiimote Settings" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "" @@ -310,7 +315,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "" @@ -326,7 +331,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "" @@ -342,7 +347,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "" @@ -354,7 +359,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -362,7 +367,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -371,12 +376,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "" @@ -395,23 +400,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "" @@ -450,66 +454,66 @@ msgid "" "%s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "" @@ -523,11 +527,11 @@ msgstr "" msgid "Add" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "" @@ -535,9 +539,9 @@ msgstr "" msgid "Add new pane" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "" @@ -579,32 +583,32 @@ msgstr "" msgid "Advanced Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "" @@ -624,19 +628,19 @@ msgstr "" msgid "Anti-Aliasing:" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "" @@ -647,7 +651,7 @@ msgid "" "If unsure, select (off)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "" @@ -656,21 +660,25 @@ msgstr "" msgid "Are you sure you want to delete \"%s\"?" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "" @@ -679,12 +687,12 @@ msgstr "" msgid "At least one pane must remain open." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "" @@ -692,7 +700,7 @@ msgstr "" msgid "AudioCommon: Error opening AO device.\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "" @@ -728,16 +736,16 @@ msgstr "" msgid "Back" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "" @@ -746,7 +754,7 @@ msgstr "" msgid "Backward" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "" @@ -755,15 +763,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "" @@ -783,7 +791,7 @@ msgstr "" msgid "Bass" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "" @@ -804,7 +812,7 @@ msgid "Blue Right" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "" @@ -813,27 +821,27 @@ msgstr "" msgid "Bound Controls: %lu" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "" @@ -843,7 +851,7 @@ msgstr "" msgid "Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -882,33 +890,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -916,7 +924,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -926,7 +934,7 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "" @@ -934,11 +942,11 @@ msgstr "" msgid "Center" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "" @@ -946,11 +954,11 @@ msgstr "" msgid "Change Disc" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -964,11 +972,11 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "" @@ -976,47 +984,47 @@ msgstr "" msgid "Cheat Code" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "" @@ -1024,14 +1032,14 @@ msgstr "" msgid "Choose a memory card:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "" @@ -1050,7 +1058,7 @@ msgstr "" msgid "Clear" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1058,7 +1066,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "" @@ -1067,11 +1075,11 @@ msgstr "" msgid "Co&nfigure..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "" @@ -1083,24 +1091,24 @@ msgstr "" msgid "Comment" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "" @@ -1114,18 +1122,18 @@ msgstr "" msgid "Configure Control" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "" @@ -1138,16 +1146,16 @@ msgstr "" msgid "Connect" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 msgid "Connect Balance Board" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "" @@ -1168,7 +1176,7 @@ msgstr "" msgid "Connect Wiimote 4" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "" @@ -1188,7 +1196,7 @@ msgstr "" msgid "Convert to GCI" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "" @@ -1197,21 +1205,16 @@ msgstr "" msgid "Copy to Memcard %c" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1219,22 +1222,16 @@ msgid "" "most PC DVD drives." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1248,27 +1245,27 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "" @@ -1300,12 +1297,12 @@ msgstr "" msgid "Crossfade" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "" @@ -1313,11 +1310,11 @@ msgstr "" msgid "Custom Projection Hack Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "" @@ -1329,36 +1326,36 @@ msgstr "" msgid "D-Pad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "" @@ -1370,15 +1367,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "" @@ -1407,16 +1404,16 @@ msgstr "" msgid "Decimal" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "" @@ -1428,7 +1425,7 @@ msgstr "" msgid "Default" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "" @@ -1470,8 +1467,8 @@ msgstr "" msgid "Device" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "" @@ -1479,15 +1476,11 @@ msgstr "" msgid "Dial" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +msgid "Direct3D" msgstr "" -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" -msgstr "" - -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1533,7 +1526,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "" @@ -1557,24 +1550,59 @@ msgstr "" msgid "Divide" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "" @@ -1590,12 +1618,12 @@ msgstr "" msgid "Dolphin FIFO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "" @@ -1603,28 +1631,28 @@ msgstr "" msgid "Dolphin Wiimote Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" @@ -1648,11 +1676,11 @@ msgstr "" msgid "Drums" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "" @@ -1689,9 +1717,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "" @@ -1712,7 +1740,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "" @@ -1720,7 +1748,7 @@ msgstr "" msgid "Early Memory Updates" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "" @@ -1728,7 +1756,7 @@ msgstr "" msgid "Edit ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "" @@ -1736,12 +1764,12 @@ msgstr "" msgid "Edit Patch" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "" @@ -1753,7 +1781,7 @@ msgstr "" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "" @@ -1780,7 +1808,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "" @@ -1798,15 +1826,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1818,7 +1846,7 @@ msgstr "" msgid "Enable Cheats" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "" @@ -1826,7 +1854,7 @@ msgstr "" msgid "Enable Dual Core (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "" @@ -1834,7 +1862,7 @@ msgstr "" msgid "Enable Idle Skipping (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "" @@ -1842,7 +1870,7 @@ msgstr "" msgid "Enable Progressive Scan" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "" @@ -1850,7 +1878,7 @@ msgstr "" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "" @@ -1867,7 +1895,7 @@ msgid "" "If unsure, select 1x." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1893,31 +1921,25 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -1928,7 +1950,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -1945,9 +1967,9 @@ msgstr "" msgid "End" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "" @@ -1970,21 +1992,20 @@ msgstr "" msgid "Entry 1/%d" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2007,7 +2028,6 @@ msgid "Euphoria" msgstr "" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2016,16 +2036,20 @@ msgstr "" msgid "Execute" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "" @@ -2033,7 +2057,7 @@ msgstr "" msgid "Export Recording" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "" @@ -2041,7 +2065,7 @@ msgstr "" msgid "Export Save" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "" @@ -2049,15 +2073,15 @@ msgstr "" msgid "Export all saves" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "" @@ -2073,44 +2097,44 @@ msgstr "" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "" @@ -2122,15 +2146,15 @@ msgstr "" msgid "FIFO Player" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "" @@ -2138,11 +2162,15 @@ msgstr "" msgid "Failed to download codes." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2170,20 +2198,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2191,73 +2219,78 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "" @@ -2269,17 +2302,17 @@ msgstr "" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "" @@ -2301,7 +2334,7 @@ msgid "" "or does not have a valid extension" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2312,20 +2345,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "" @@ -2377,14 +2410,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2403,6 +2436,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2444,9 +2482,9 @@ msgstr "" msgid "Free Look" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "" @@ -2459,7 +2497,7 @@ msgstr "" msgid "From" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "" @@ -2471,7 +2509,7 @@ msgstr "" msgid "GCI File(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "" @@ -2479,27 +2517,27 @@ msgstr "" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "" @@ -2516,20 +2554,20 @@ msgid "Gamecube &Pad Settings" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2548,26 +2586,26 @@ msgstr "" msgid "General Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "" @@ -2582,7 +2620,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "" @@ -2606,11 +2644,11 @@ msgstr "" msgid "Hacks" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "" @@ -2622,7 +2660,7 @@ msgstr "" msgid "Help" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2634,7 +2672,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2677,7 +2715,7 @@ msgstr "" msgid "Hotkeys" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "" @@ -2685,29 +2723,29 @@ msgstr "" msgid "Hybrid Wiimote" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "" @@ -2719,15 +2757,15 @@ msgstr "" msgid "IR Sensitivity:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "" @@ -2735,7 +2773,7 @@ msgstr "" msgid "Icon" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2767,8 +2805,12 @@ msgstr "" msgid "Import Save" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 @@ -2787,20 +2829,16 @@ msgid "" "but does not have a correct header" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 msgid "Increase Frame limit" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "" @@ -2820,7 +2858,7 @@ msgstr "" msgid "Insert Encrypted or Decrypted code here..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "" @@ -2828,36 +2866,37 @@ msgstr "" msgid "Insert name here.." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2868,7 +2907,7 @@ msgstr "" msgid "Interface" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "" @@ -2891,20 +2930,20 @@ msgstr "" msgid "Internal Resolution:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "" @@ -2912,16 +2951,16 @@ msgstr "" msgid "Invalid bat.map or dir entry" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -2929,7 +2968,7 @@ msgid "" " You may need to redump this game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "" @@ -2945,34 +2984,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "" @@ -2991,8 +3032,9 @@ msgstr "" msgid "Key" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "" @@ -3014,12 +3056,12 @@ msgstr "" msgid "Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3051,7 +3093,7 @@ msgid "" "Middle-click to clear." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "" @@ -3143,15 +3185,15 @@ msgstr "" msgid "Load State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "" @@ -3167,10 +3209,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "" @@ -3199,12 +3237,12 @@ msgstr "" msgid "Logger Outputs" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "" @@ -3212,14 +3250,14 @@ msgstr "" msgid "M Button" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "" @@ -3233,11 +3271,11 @@ msgstr "" msgid "Main Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "" @@ -3268,7 +3306,7 @@ msgid "Memory Byte" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "" @@ -3278,7 +3316,7 @@ msgid "" "could mangle stuff!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3289,7 +3327,7 @@ msgid "" "Would you like to copy the old file to this new location?\n" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3297,7 +3335,7 @@ msgstr "" msgid "Menu" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "" @@ -3310,7 +3348,7 @@ msgstr "" msgid "Misc" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "" @@ -3331,11 +3369,11 @@ msgstr "" msgid "Monospaced font" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "" @@ -3447,15 +3485,15 @@ msgstr "" msgid "NP Up" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "" @@ -3465,7 +3503,7 @@ msgstr "" msgid "Native GCI files(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "" @@ -3474,7 +3512,7 @@ msgstr "" msgid "Next Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "" @@ -3482,11 +3520,11 @@ msgstr "" msgid "Nickname :" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "" @@ -3494,7 +3532,7 @@ msgstr "" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "" @@ -3520,42 +3558,43 @@ msgstr "" msgid "No recorded file" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "" @@ -3576,7 +3615,7 @@ msgstr "" msgid "Num Lock" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "" @@ -3597,7 +3636,7 @@ msgstr "" msgid "Object Range" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "" @@ -3609,25 +3648,29 @@ msgstr "" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "" @@ -3653,7 +3696,13 @@ msgstr "" msgid "OpenMP Texture Decoder" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "" @@ -3674,7 +3723,7 @@ msgstr "" msgid "Other" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3684,15 +3733,15 @@ msgstr "" msgid "Output" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "" @@ -3716,17 +3765,17 @@ msgstr "" msgid "Parameters" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "" @@ -3734,8 +3783,8 @@ msgstr "" msgid "Paths" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "" @@ -3748,7 +3797,7 @@ msgstr "" msgid "Per-Pixel Lighting" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "" @@ -3758,9 +3807,9 @@ msgid "Perspective %d" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "" @@ -3772,7 +3821,7 @@ msgstr "" msgid "Play/Pause" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "" @@ -3780,11 +3829,11 @@ msgstr "" msgid "Playback Options" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "" @@ -3796,23 +3845,23 @@ msgstr "" msgid "Plus-Minus" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "" @@ -3821,11 +3870,11 @@ msgstr "" msgid "Port :" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "" @@ -3833,17 +3882,17 @@ msgstr "" msgid "Post-Processing Effect:" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3860,7 +3909,7 @@ msgstr "" msgid "Previous Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "" @@ -3876,7 +3925,7 @@ msgstr "" msgid "Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "" @@ -3885,7 +3934,7 @@ msgid "Question" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "" @@ -3907,7 +3956,7 @@ msgstr "" msgid "RAM" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "" @@ -3946,6 +3995,10 @@ msgstr "" msgid "Record" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "" @@ -3976,7 +4029,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "" @@ -3985,14 +4038,14 @@ msgstr "" msgid "Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "" @@ -4012,7 +4065,7 @@ msgstr "" msgid "Reset" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "" @@ -4020,7 +4073,7 @@ msgstr "" msgid "Return" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4033,18 +4086,17 @@ msgstr "" msgid "Right Stick" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "" @@ -4057,7 +4109,7 @@ msgid "Safe" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "" @@ -4114,28 +4166,28 @@ msgstr "" msgid "Save State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4144,20 +4196,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "" @@ -4169,11 +4221,11 @@ msgstr "" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "" @@ -4196,12 +4248,12 @@ msgstr "" msgid "Select" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "" @@ -4220,19 +4272,19 @@ msgstr "" msgid "Select floating windows" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "" @@ -4247,7 +4299,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4265,27 +4317,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "" @@ -4297,16 +4350,16 @@ msgstr "" msgid "Separator" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "" @@ -4315,7 +4368,7 @@ msgstr "" msgid "Set as default Memcard %c" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4326,19 +4379,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "" @@ -4346,23 +4399,27 @@ msgstr "" msgid "Shoulder Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "" @@ -4374,11 +4431,11 @@ msgstr "" msgid "Show FPS" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "" @@ -4386,35 +4443,35 @@ msgstr "" msgid "Show Input Display" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "" @@ -4422,27 +4479,27 @@ msgstr "" msgid "Show Statistics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4457,7 +4514,7 @@ msgstr "" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4488,7 +4545,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "" @@ -4499,23 +4556,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4533,17 +4591,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "" @@ -4551,7 +4609,7 @@ msgstr "" msgid "Snapshot" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "" @@ -4563,27 +4621,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 #, c-format -msgid "Sound buffer creation failed: %s" +msgid "Sound buffer creation failed: %08x" msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "" @@ -4603,37 +4661,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "" @@ -4641,7 +4691,7 @@ msgstr "" msgid "Start Recording" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "" @@ -4649,7 +4699,7 @@ msgstr "" msgid "State Saves" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -4658,7 +4708,7 @@ msgid "Stick" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "" @@ -4684,39 +4734,40 @@ msgstr "" msgid "Subtract" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "" @@ -4741,13 +4792,13 @@ msgstr "" msgid "Table Right" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -4767,11 +4818,11 @@ msgstr "" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "" @@ -4779,13 +4830,13 @@ msgstr "" msgid "The checksum was successfully fixed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4804,7 +4855,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "" @@ -4833,60 +4884,60 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" @@ -4902,7 +4953,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -4910,7 +4961,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -4918,7 +4969,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" @@ -4927,12 +4978,12 @@ msgstr "" msgid "Threshold" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "" @@ -4957,7 +5008,7 @@ msgstr "" msgid "Toggle Fog" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "" @@ -4967,15 +5018,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "" @@ -4993,7 +5045,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "" @@ -5009,12 +5061,12 @@ msgstr "" msgid "UDP Port:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "" @@ -5023,7 +5075,7 @@ msgstr "" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "" @@ -5036,12 +5088,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "" @@ -5058,11 +5110,11 @@ msgstr "" msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "" @@ -5077,12 +5129,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5092,16 +5144,16 @@ msgstr "" msgid "Up" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "" @@ -5109,7 +5161,7 @@ msgstr "" msgid "Use Fullscreen" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "" @@ -5133,6 +5185,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5150,11 +5211,11 @@ msgstr "" msgid "V-Sync" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "" @@ -5162,7 +5223,7 @@ msgstr "" msgid "Value:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "" @@ -5174,7 +5235,7 @@ msgstr "" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "" @@ -5182,17 +5243,17 @@ msgstr "" msgid "Virtual" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5210,19 +5271,19 @@ msgstr "" msgid "Warning" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5239,7 +5300,7 @@ msgid "" "Continue?" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5247,7 +5308,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5255,7 +5316,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5295,19 +5356,15 @@ msgstr "" msgid "Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "" @@ -5316,16 +5373,21 @@ msgid "WiiWAD: Could not read from file" msgstr "" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +msgid "Wiimote " +msgstr "" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "" @@ -5333,7 +5395,7 @@ msgstr "" msgid "Wiimote Motor" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "" @@ -5357,14 +5419,14 @@ msgstr "" msgid "Word Wrap" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5384,21 +5446,36 @@ msgstr "" msgid "Write to Window" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5428,11 +5505,11 @@ msgstr "" msgid "You must choose a game!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" @@ -5440,7 +5517,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" @@ -5451,7 +5528,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5465,15 +5542,15 @@ msgid "" "Do you want to generate a new one?" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "" @@ -5515,20 +5592,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "" - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "" diff --git a/Languages/po/es.po b/Languages/po/es.po index ccc87a5c2a..da1c6e3339 100644 --- a/Languages/po/es.po +++ b/Languages/po/es.po @@ -8,13 +8,14 @@ # dfersd01 , 2013 # Puniasterus , 2013 # Puniasterus , 2013 +# Sithdown , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-17 21:42+0000\n" -"Last-Translator: Puniasterus \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-20 12:03+0000\n" +"Last-Translator: Petiso_Carambanal \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/dolphin-emu/" "language/es/)\n" "Language: es\n" @@ -23,13 +24,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(demasiados para mostrar)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Juego:" @@ -37,7 +38,7 @@ msgstr " Juego:" msgid "! NOT" msgstr "! NO" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -46,7 +47,7 @@ msgstr "" "\"%s\" no existe.\n" "¿Crear una nueva tarjeta de memoria de 16 MB?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" no es un archivo GCM/ISO válido, o no es una ISO GC/Wii." @@ -61,28 +62,28 @@ msgstr "%08X:" msgid "%1$sCopy%1$s" msgstr "%1$sCopiar%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "muestras %d" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "muestras %d (nivel de calidad %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s ya existe. ¿Sobrescribir?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s falló al ser \"scrubbed\". Probablemente la imagen esté corrupta." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -91,7 +92,7 @@ msgstr "" "%s falló al cargar como una tarjeta de memoria.\n" "El tamaño de la tarjeta no es válido (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -100,7 +101,7 @@ msgstr "" "%s falló al cargar como una tarjeta de memoria.\n" "El tamaño de la tarjeta no es válido (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -110,22 +111,27 @@ msgstr "" "El fichero no es suficientemente grande para ser un fichero de tarjeta de " "memoria válido(0x%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "Fallo al abrir %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s falló: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s es un archivo de 0 bytes" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "¡%s ya está comprimido! No puede comprimirse más." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -156,7 +162,7 @@ msgstr "%u Bloques libres; %u entradas de dir. libres" msgid "&& AND" msgstr "&& Y" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Acerca de..." @@ -164,7 +170,7 @@ msgstr "&Acerca de..." msgid "&Boot from DVD Drive..." msgstr "&Iniciar desde unidad de DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Puntos de partida" @@ -172,7 +178,7 @@ msgstr "&Puntos de partida" msgid "&Browse for ISOs..." msgstr "&Buscar ISO en..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Administrador de &trucos" @@ -180,11 +186,11 @@ msgstr "Administrador de &trucos" msgid "&DSP Settings" msgstr "&Configuración DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Borrar ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Borrar ISO seleccionadas..." @@ -196,11 +202,11 @@ msgstr "&Emulación" msgid "&File" msgstr "&Archivo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "Avanzar &frame" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Pantalla completa" @@ -208,7 +214,7 @@ msgstr "&Pantalla completa" msgid "&Graphics Settings" msgstr "&Configuración gráfica" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Ayuda" @@ -216,7 +222,7 @@ msgstr "&Ayuda" msgid "&Hotkey Settings" msgstr "&Configuración de atajos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -228,11 +234,11 @@ msgstr "&Cargar estado" msgid "&Memcard Manager (GC)" msgstr "&Administrador de tarjetas de memoria (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memoria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Abrir..." @@ -240,51 +246,51 @@ msgstr "&Abrir..." msgid "&Options" msgstr "&Opciones" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Jugar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Propiedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Modo de solo lectura" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Actualizar lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registros" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reiniciar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Sonido" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Detener" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Herramientas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Vídeo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Vista" @@ -292,7 +298,7 @@ msgstr "&Vista" msgid "&Wiimote Settings" msgstr "&Configuración de wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -317,9 +323,8 @@ msgid "(off)" msgstr "(off)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -329,7 +334,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Nativo (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -345,7 +350,7 @@ msgstr "2.5x Nativo (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Nativo (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -361,7 +366,7 @@ msgstr "3x Nativo (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Nativo (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -373,7 +378,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -381,7 +386,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -390,12 +395,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "¡¡Una ventana de NetPlay ya está abierta!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Ningún juego está emulándose actualmente." @@ -417,39 +422,36 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"ALERTA:\n" +"AVISO:\n" "\n" -"NetPlay solo funcionará adecuadamente con la siguiente configuración:\n" -" - Doble núcleo [OFF]\n" -" - Audio regulado [OFF]\n" -" - DSP-HLE con \"Audio Nulo\" o DSP-LLE\n" -" - Configurar manualmente el número exacto de controles que se usarán a " -"[Control estándar]\n" +"Netplay solo funcionará con los siguientes ajustes:\n" +" - Activar Dual Core [OFF]\n" +" - DSP Emulator Engine debe ser el mismo en todos los ordenadores!\n" +" - DSP on Dedicated Thread [OFF]\n" +" - Framelimit NOT configurado a [Audio]\n" "\n" -"Todos los jugadores deben intentar tener la misma versión de Dolphin y la " -"misma configuración.\n" -"Deshabilita todas las tarjetas de memoria, o envíeselas a los jugadores " -"antes de comenzar.\n" -"El soporte para wiimote no ha sido implementado.\n" +"Todos los jugadores deben usar la misma versión de Dolphin\n" +"Todas las tarjetas de memoria deben ser idénticas entre jugadores o estar " +"desactivadas.\n" +"¡El soporte de Wiimote no está implementado!\n" "\n" -"¡¡Debes redireccionar el puerto TCP para alojar!!" +"¡El host debe elegir la apertura/reenvio de puertos TCP!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "Placa base AM" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Códigos AR" @@ -498,7 +500,7 @@ msgstr "" "Código culpable:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -506,7 +508,7 @@ msgstr "" "Error de Action Replay: Tamaño no válido (%08x : dirección = %08x) en " "Añadido de código (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -515,7 +517,7 @@ msgstr "" "Error de Action Replay: Tamaño no válido (%08x : dirección = %08x) en Fill " "and Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -524,7 +526,7 @@ msgstr "" "Error de Action Replay: Tamaño no válido (%08x : dirección = %08x) en " "escritura y llenado de RAM (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -533,13 +535,13 @@ msgstr "" "Error de Action Replay: Tamaño no válido (%08x : dirección = %08x) en " "Escribir con el puntero (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" "Error de Action Replay: Valor no válido (%08x) en copia de la memoria (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -549,27 +551,27 @@ msgstr "" "implementados (%s)\n" "Los códigos maestros no son necesarios. No los uses." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Error de Action Replay: Línea de código AR no válida: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Error de Action Replay: Código condicional: Tamaño no válido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Error de Action Replay: Tipo de Código Normal no válido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Código Normal %i: Subtipo no válido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Código Normal 0: Subtipo no válido %08x (%s)" @@ -583,11 +585,11 @@ msgstr "Adaptador:" msgid "Add" msgstr "Añadir" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Añadir código ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Añadir parche" @@ -595,9 +597,9 @@ msgstr "Añadir parche" msgid "Add new pane" msgstr "Añadir nueva ventana" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Añadir..." @@ -654,32 +656,32 @@ msgstr "Avanzado" msgid "Advanced Settings" msgstr "Configuración avanzada" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Todos los archivos de GC/Wii (elf, dol, gcm, iso, wbfs, ciso, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Todas las imágenes de GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Todos los archivos Gamecube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Todos los estados guardados (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Todos los archivos ISO de Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Todos los archivos ISO comprimidos de GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Todos los archivos (*.*)|*.*" @@ -699,19 +701,19 @@ msgstr "Filtro anisotrópico:" msgid "Anti-Aliasing:" msgstr "Antialias:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader tiene tamaño incorrecto... ¿Es realmente un apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader no puede cargar desde el archivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Aplicar" @@ -725,7 +727,7 @@ msgstr "" "\n" "Si no estás seguro, selecciona (off)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Ãrabe" @@ -734,7 +736,7 @@ msgstr "Ãrabe" msgid "Are you sure you want to delete \"%s\"?" msgstr "¿Estás seguro de que quieres borrar \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -742,15 +744,20 @@ msgstr "" "¿Seguro que quieres borrar estos archivos?\n" "¡Desaparecerán para siempre!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "¿Seguro que quieres borrar este archivo? ¡Desaparecerá para siempre!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (experimental)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (experimental)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Relación de aspecto:" @@ -759,12 +766,12 @@ msgstr "Relación de aspecto:" msgid "At least one pane must remain open." msgstr "Al menos una ventana debe permancer abierta." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Motor de audio:" @@ -772,7 +779,7 @@ msgstr "Motor de audio:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Error al abrir dispositivo AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automático" @@ -811,42 +818,42 @@ msgstr "Registro BP" msgid "Back" msgstr "Atrás" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Configuración del motor" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Motor:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" -msgstr "Detectar entrada sin foco" +msgstr "Entrada sin foco" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:267 msgid "Backward" msgstr "Atrás" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Cabecera de archivo incorrecta" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Imagen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detalles de la imagen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Imagen:" @@ -866,7 +873,7 @@ msgstr "Configuración básica" msgid "Bass" msgstr "Bajo" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "La suma de verificación de la tabla de localización de bloques falló" @@ -887,7 +894,7 @@ msgid "Blue Right" msgstr "Azul derecha" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Inferior" @@ -896,27 +903,27 @@ msgstr "Inferior" msgid "Bound Controls: %lu" msgstr "Controles asignados: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Roto" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Buscar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Busca un directorio para añadir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Buscar un directorio de ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Busca un directorio de salida" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Búfer:" @@ -926,12 +933,12 @@ msgstr "Búfer:" msgid "Buttons" msgstr "Botones" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." msgstr "" -"Saltar la limpieza de la caché de la instrucción DCBZ. Normalmente deja esta " +"Salta la limpieza de la caché de la instrucción DCBZ. Normalmente deja esta " "opción deshabilitada." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:706 @@ -975,33 +982,33 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "No se puede encontrar un WiiMote por el manejador de conexión %02x" +msgstr "No se puede encontrar un WiiMote por el gestor de conexión %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "No se puede leer del DVD_Plugin - DVD-Interface: Error Fatal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Cancelar" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "No se puede abrir %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "No se puede cancelar el registro de eventos con eventos pendientes" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1012,7 +1019,7 @@ msgstr "" "%s\n" "no es un fichero válido de tarjeta de memoria de Gamecube" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1024,7 +1031,7 @@ msgstr "" msgid "Caps Lock" msgstr "Bloq Mayús" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalán" @@ -1032,11 +1039,11 @@ msgstr "Catalán" msgid "Center" msgstr "Centro" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Cambiar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Cambiar &disco..." @@ -1044,11 +1051,11 @@ msgstr "Cambiar &disco..." msgid "Change Disc" msgstr "Cambiar disco" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Cambiar juego" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1064,12 +1071,12 @@ msgstr "Cambia el signo del parámetro zFar (después de la corrección)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Cambia el signo del parámetro zNear (después de la corrección)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "¡Cambiar esto no tendrá ningún efecto mientras el emulador esté ejecutandose!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1077,47 +1084,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Código de truco" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Buscar trucos" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Administrador de trucos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Comprobar integridad de la partición" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Comprobando integridad..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chino (Simplificado)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chino (Tradicional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Escoge un directorio raíz de DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Escoge un directorio raíz para la NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Escoge una ISO por defecto:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Escoge un directorio para añadir" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Escoge un archivo para abrir" @@ -1125,7 +1132,7 @@ msgstr "Escoge un archivo para abrir" msgid "Choose a memory card:" msgstr "Escoge una tarjeta de memoria:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1133,8 +1140,8 @@ msgstr "" "Escoge el archivo a usar como apploader: (se aplica a los discos construidos " "a partir de directorios solamente)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Escoge la carpeta de destino" @@ -1153,7 +1160,7 @@ msgstr "Clásico" msgid "Clear" msgstr "Limpiar" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1163,7 +1170,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Cerrar" @@ -1172,11 +1179,11 @@ msgstr "Cerrar" msgid "Co&nfigure..." msgstr "Co&nfigurar..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Información del código" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Código:" @@ -1188,24 +1195,24 @@ msgstr "Comando" msgid "Comment" msgstr "Comentario" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Comentario:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimir ISOs seleccionadas..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Comprimiendo ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configuración" @@ -1219,18 +1226,18 @@ msgstr "Configurar" msgid "Configure Control" msgstr "Configurar control" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configurar mandos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configurar..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Confirmar sobrescritura de archivo" @@ -1243,17 +1250,16 @@ msgstr "Confirmar al detenerse" msgid "Connect" msgstr "Conectar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Conectar teclado USB" +msgstr "Conectar la Balance Board" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Conectar teclado USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Conectar Wiimote %i" @@ -1274,7 +1280,7 @@ msgstr "Conectar Wiimote 3" msgid "Connect Wiimote 4" msgstr "Conectar Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Conectando..." @@ -1294,7 +1300,7 @@ msgstr "Control" msgid "Convert to GCI" msgstr "Convertir a GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Fallo al copiar" @@ -1303,21 +1309,16 @@ msgstr "Fallo al copiar" msgid "Copy to Memcard %c" msgstr "Copiar a tarjeta de memoria %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Núcleo" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "No se pudo crear %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "No se pudo inicializar el motor %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1328,26 +1329,16 @@ msgstr "" "seguridad de GC/Wii. Ten en cuenta que discos de Gamecube o Wii originales " "no pueden ser leídos en la mayoría de los lectores DVD." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "No se pudo reconocer el archivo ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "No se pudo guardar %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"No se pudieron definir los pads. ¡El jugador se fue, o el juego aún se está " -"ejecutándo!\n" -"(definir los pads mientras el juego está ejecutándose no está permitido " -"todavía)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1369,11 +1360,11 @@ msgstr "" "Si es así, entonces es posible que tengas que volver a especificar la " "ubicación de la tarjeta de memoria en las opciones." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "No se pudo encontrar el comando para abrir la extensión 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1381,17 +1372,17 @@ msgstr "" "No se pudo iniciar el núcleo.\n" "Revisa tu configuración." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Cuenta:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "País:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Crear Código AR" @@ -1424,15 +1415,15 @@ msgstr "" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:52 msgid "Crossfade" -msgstr "Desvanecimiento cruzado" +msgstr "Fundido" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" "¡El directorio actual ha cambiado de %s a %s después de wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Hack de proyección personalizado" @@ -1440,11 +1431,11 @@ msgstr "Hack de proyección personalizado" msgid "Custom Projection Hack Settings" msgstr "Configuración del hack de proyección personalizado" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Personalizar algunos párametros de la proyección ortográfica." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Checo" @@ -1456,36 +1447,36 @@ msgstr "D" msgid "D-Pad" msgstr "Pad direccional" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Motor de emulación DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulación DSP HLE (rápido)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Intérprete DSP LLE (lento)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Recompilador DSP LLE" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP en proceso dedicado" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Configuración DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLLE en un hilo separado." + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Raíz DVD:" @@ -1497,15 +1488,15 @@ msgstr "DVDLowRead - Error fatal: fallo al leer del volumen" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Error fatal: fallo al leer el volumen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Alfombra de baile" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Tamaño de datos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Fecha:" @@ -1534,29 +1525,28 @@ msgstr "Depuración" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Descomprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Descomprimir ISO seleccionadas..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Descomprimir ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Actualizar lista de juegos" +msgstr "Reducir límite de Frames" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Predeterminado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO por defecto:" @@ -1600,8 +1590,8 @@ msgstr "" msgid "Device" msgstr "Dispositivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Configuración del dispositivo" @@ -1609,15 +1599,12 @@ msgstr "Configuración del dispositivo" msgid "Dial" msgstr "Marcar" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1632,7 +1619,7 @@ msgstr "Deshabilitar" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Desactivar destino Alfa" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1670,19 +1657,18 @@ msgstr "" "Si no estás seguro, déjala sin marcar." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Salta el destino del pase alfa usado en muchos juegos para varios efectos " -"gráficos.\n" +"Desactiva la emulación de una característica de hardware llamada destino " +"alfa, que se utiliza en muchos juegos para diversos efectos gráficos.\n" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disco" @@ -1709,24 +1695,92 @@ msgstr "" msgid "Divide" msgstr "Dividir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "¿Quieres detener la emulación actual?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Decodificador Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revisión: %s\n" +"Compilado: %s @ %s\n" +"\n" +"Dolphin es un emulador de Gamecube/Wii que fue\n" +"originalmente escrito por F|RES y ector.\n" +"Hoy Dolphin es un proyecto open surce con muchos desarroladores\n" +"demasiados para ennumerarlos.\n" +"Si estas interesado consulta la web del proyecto en\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Agradecimientos especiales a Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik por su\n" +"ingeneria inversa y la documentación/demos.\n" +"\n" +"Agradecimientos enormes a Gilles Mouchard \n" +"cuyo emulador de Microlib PPC permitió a \n" +"nuestro desarrollo un comienzo rápido.\n" +"\n" +"Gracias a Frank Wille por su desamblandor de PowerPC ,\n" +"which or9 y nosotros modificamos para incluir las especificaciones de " +"Gekko.\n" +"\n" +"Gracias a hcs/destop por su decodificador de GC ADPCM.\n" +"\n" +"No estamos afiliados con Nintendo de ninguna forma.\n" +"Gamecube and Wii son marcas registradas de Nintendo.\n" +"El emulador es para fines educativos\n" +"y no debe ser usado para jugar a juegos\n" +"que no se posean legalmente." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Configuración gráfica %s de Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "&Website de Dolphin" @@ -1742,12 +1796,12 @@ msgstr "Configuración de Wiimote emulado de Dolphin" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Configuración de GCPad Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Películas TAS de Dolphin (*.dtm)" @@ -1755,11 +1809,11 @@ msgstr "Películas TAS de Dolphin (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Configuración de Wiimote de Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin en &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1767,7 +1821,7 @@ msgstr "" "Dolphin no pudo encontrar ninguna ISO de GC/Wii. Haz doble clic aquí para " "buscar..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1775,19 +1829,18 @@ msgstr "" "Dolphin está configurado actualmente para esconder todos los juegos. Haz " "doble clic aquí para mostrarlos..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin no ha podido completar la acción solicitada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Habilitar acceso rápido al disco. Es necesario para algunos juegos. (ON = " -"Rápido, OFF = Compatible)" +"Duplica la velocidad de reloj de la GPU emulada. Puede acelerar algunos " +"juegos (ON = Rápido, OFF = Compatible)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1807,11 +1860,11 @@ msgstr "Se descargaron %lu códigos. (%lu añadidos)" msgid "Drums" msgstr "Tambores" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Falso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Depósito de audio" @@ -1857,9 +1910,9 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holandés" @@ -1884,7 +1937,7 @@ msgstr "" "de Dolphin, puede que se necesite reiniciar para que Windows reconozca el " "nuevo controlador." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1892,7 +1945,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Actualización frecuente de memoria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Editar" @@ -1900,7 +1953,7 @@ msgstr "Editar" msgid "Edit ActionReplay Code" msgstr "Editar código ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Editar configuración" @@ -1908,12 +1961,12 @@ msgstr "Editar configuración" msgid "Edit Patch" msgstr "Editar parche" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Editar perspectiva actual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Editar..." @@ -1925,7 +1978,7 @@ msgstr "Efecto" msgid "Embedded Frame Buffer" msgstr "Búfer de fotogramas embebido" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "El proceso de emulación ya está ejecutándose" @@ -1964,7 +2017,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Wiimote emulado" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Estado de emulación:" @@ -1988,15 +2041,15 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Habilitar Registro de AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Habilitar asociación de bloques" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Permitir el cálculo del cuadro delimitador" @@ -2008,7 +2061,7 @@ msgstr "Habilitar caché" msgid "Enable Cheats" msgstr "Habilitar trucos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Habilitar doble núcleo" @@ -2016,7 +2069,7 @@ msgstr "Habilitar doble núcleo" msgid "Enable Dual Core (speedup)" msgstr "Habilitar doble núcleo (mejora)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Habilitar salto de fotogramas inactivos" @@ -2024,7 +2077,7 @@ msgstr "Habilitar salto de fotogramas inactivos" msgid "Enable Idle Skipping (speedup)" msgstr "Habilitar salto de fotogramas inactivos (mejora)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Habilitar MMU" @@ -2032,7 +2085,7 @@ msgstr "Habilitar MMU" msgid "Enable Progressive Scan" msgstr "Habilitar escaneado progresivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Habilitar salvapantallas" @@ -2040,7 +2093,7 @@ msgstr "Habilitar salvapantallas" msgid "Enable Speaker Data" msgstr "Activar datos de altavoz" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Habilitar pantalla panorámica" @@ -2062,7 +2115,7 @@ msgstr "" "\n" "Si no estás seguro, elige 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2099,7 +2152,7 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2107,11 +2160,11 @@ msgstr "" "Habilitar esto para acelerar The Legend of Zelda: Twilight Princess. " "Deshabilitar para CUALQUIER OTRO juego." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Habilta un hack de proyección personalizado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2119,19 +2172,11 @@ msgstr "" "Activa la emulación de Dolby Pro Logic II usando 5.1 surround. No disponible " "en OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "Activa la emulación de Dolby Pro Logic II. Solo para el motor OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Activa la emulación de Dolby Pro Logic II. Solo para el motor OpenAL. " -"Requiere que renombres soft_oal.dll a OpenAL32.dll para que funcione." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2144,7 +2189,7 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2166,9 +2211,9 @@ msgstr "" msgid "End" msgstr "Fin" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Inglés" @@ -2191,23 +2236,22 @@ msgstr "Entrada %d/%d" msgid "Entry 1/%d" msgstr "Entrada 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Igual" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Error" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Error al cargar el idioma seleccionado. Volviendo al predeterminado del " "sistema." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2234,7 +2278,6 @@ msgid "Euphoria" msgstr "Euforia" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Exception handler - acceso debajo del espacio de memoria. %08llx%08llx" @@ -2243,16 +2286,20 @@ msgstr "Exception handler - acceso debajo del espacio de memoria. %08llx%08llx" msgid "Execute" msgstr "Ejecutar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Salir" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exportar todos los guardados de Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Fallo al exportar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportar archivo" @@ -2260,7 +2307,7 @@ msgstr "Exportar archivo" msgid "Export Recording" msgstr "Exportar grabación" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportar grabación..." @@ -2268,7 +2315,7 @@ msgstr "Exportar grabación..." msgid "Export Save" msgstr "Exportar guardado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportar guardado a uno de Wii (experimental)" @@ -2276,15 +2323,15 @@ msgstr "Exportar guardado a uno de Wii (experimental)" msgid "Export all saves" msgstr "Exportar todos los guardados" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Fallo al exportar. ¿Intentar de nuevo?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Exportación fallada." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportar guardado como..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extensión" @@ -2300,44 +2347,44 @@ msgstr "Parámetro extra" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Parámetro extra que es útil en «Metroid: Other M» exclusivamente." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extraer todos los archivos..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extraer Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extraer DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extraer directorio..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extraer archivo..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extraer partición..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extrayendo %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extrayendo todos los archivos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extrayendo directorio" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extrayendo..." @@ -2349,15 +2396,15 @@ msgstr "Byte de FIFO" msgid "FIFO Player" msgstr "Jugador FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANCIA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Tamaño del FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "¡Fallo al conectar!" @@ -2365,11 +2412,15 @@ msgstr "¡Fallo al conectar!" msgid "Failed to download codes." msgstr "Fallo al descargar los códigos." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Fallo al extraer a %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2397,6 +2448,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Fallo al cargar bthprops.dll. La conexión de mandos reales no funcionará y " +"Dolphin puede fallar inesperadamente." #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2404,21 +2457,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Fallo al cargar hid.dll. La conexión de mandos reales no funcionará y " +"Dolphin puede fallar inesperadamente." -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Error al leer %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Fallo al leer banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Fallo al leer la cabecera bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2429,7 +2484,7 @@ msgstr "" "La tarjeta de memoria puede estar truncada.\n" "Posición del fichero:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2437,7 +2492,7 @@ msgstr "" "Falló leer la tabla de asignación de bloques de respaldo correctamente\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2445,17 +2500,17 @@ msgstr "" "Falló leer la tabla de asignación de bloques correctamente\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Fallo al leer los datos del archivo %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Fallo al leer los datos del archivo: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2463,7 +2518,7 @@ msgstr "" "Falló la lectura del directorio de respaldo\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2471,11 +2526,11 @@ msgstr "" "Falló la lectura del directorio\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Fallo al leer la cabecera" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2483,29 +2538,34 @@ msgstr "" "Falló leer la cabecera correctamente\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Fallo al leer la cabecera del fichero %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Fallo al leer la ID única de la imagen de disco" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Fallo al escribir BT.DINF a SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Fallo al escribir bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Fallo al escribir los datos en el fichero %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Fallo al escribir la cabecera para %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Fallo al escribir la cabecera para el archivo %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Persa" @@ -2515,13 +2575,13 @@ msgstr "Rápido" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Cálculo de profundidad rápido" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Versión rápida del MMU. No funciona para todos los juegos." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2529,7 +2589,7 @@ msgstr "" "Desincronización fatal. Cancelando reproducción. (Error en PlayWiimote: %u !" "= %u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Jugador Fifo" @@ -2553,7 +2613,7 @@ msgstr "" "El archivo no pudo ser abierto\n" "o no tiene una extensión válida" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2566,20 +2626,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "El archivo no es reconocido como una tarjeta de memoria" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Archivo sin comprimir" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Modo desconocido de apertura : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Sistema de archivos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "¡Tipo de archivo 'ini' desconocido¡ !No se abrirá!" @@ -2642,7 +2702,7 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2652,7 +2712,7 @@ msgstr "" "Deja sin marcar, Dolphin por defecto usa NTSC-U y activa automáticamente " "esta característica cuando se juega a juegos japoneses." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2666,13 +2726,18 @@ msgstr "Adelante" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Reenviar puerto (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "%d coincidencias para '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Encontrados %x ficheros de guardado" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2714,9 +2779,9 @@ msgstr "Frames a grabar" msgid "Free Look" msgstr "Cámara libre" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francés" @@ -2729,7 +2794,7 @@ msgstr "Cuerdas" msgid "From" msgstr "Desde" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Pant. compl." @@ -2741,7 +2806,7 @@ msgstr "Resolución en pantalla completa:" msgid "GCI File(*.gci)" msgstr "Archivo GCI (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "Pad GC" @@ -2749,27 +2814,27 @@ msgstr "Pad GC" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID del juego:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "¡El juego ya está ejecutándose!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "¡El juego no está ejecutándose!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "¡Juego no encontrado!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Configuración específica del juego" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Configurar Juego" @@ -2786,20 +2851,20 @@ msgid "Gamecube &Pad Settings" msgstr "&Configuración del mando Gamecube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Tarjetas de memoria de Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Configuración del Pad de Gamecube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Códigos Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2822,27 +2887,27 @@ msgstr "General" msgid "General Settings" msgstr "Ajustes generales" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Alemán" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "GetARCode: El índice es mayor que el tamaño de la lista de códigos AR %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Gráficos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Configuración gráfica" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Mayor que" @@ -2864,7 +2929,7 @@ msgstr "" "\n" "Si no estás seguro, déjala marcada." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Griego" @@ -2888,11 +2953,11 @@ msgstr "Guitarra" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Falló la suma de verificación de cabecera" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebreo" @@ -2904,7 +2969,7 @@ msgstr "Altura" msgid "Help" msgstr "Ayuda" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2925,7 +2990,7 @@ msgstr "" "\n" "¡Adiós!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2978,7 +3043,7 @@ msgstr "Configuración de atajos" msgid "Hotkeys" msgstr "Atajos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Húngaro" @@ -2986,18 +3051,18 @@ msgstr "Húngaro" msgid "Hybrid Wiimote" msgstr "Wiimote híbrido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Se trató de obtener los datos de un ticket desconocido: " "%08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3006,15 +3071,15 @@ msgstr "" "TitleID %016llx.\n" "Dolphin probablemente se colgará ahora." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - destino incorrecto" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Configuración IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3026,15 +3091,15 @@ msgstr "Puntero IR" msgid "IR Sensitivity:" msgstr "Sensibilidad IR:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Detalles de la ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Directorios de ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIA" @@ -3042,7 +3107,7 @@ msgstr "ITALIA" msgid "Icon" msgstr "Icono" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3086,9 +3151,13 @@ msgstr "" msgid "Import Save" msgstr "Importar Guardado" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Fallo al importar. ¿Probar otra vez?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importar guardado de Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importación fallada" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3110,21 +3179,16 @@ msgstr "" "El archivo importado tiene extensión .sav\n" "pero no tiene la cabecera correcta" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "En juego" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "En juego" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Límite de fotogramas:" +msgstr "Aumentar límite de Frames" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Información" @@ -3144,7 +3208,7 @@ msgstr "Insertar" msgid "Insert Encrypted or Decrypted code here..." msgstr "Insertar código encriptado o desencriptado aquí..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Insertar tarjeta SD" @@ -3152,38 +3216,39 @@ msgstr "Insertar tarjeta SD" msgid "Insert name here.." msgstr "Insertar un nombre aquí.." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Instalar WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Instalar al menú de la Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "Se ha llamado InstallExceptionHandler, pero esta plataforma no lo soporta " "todavía." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Instalando WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Error de comprobación de la integridad" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Comprobación de la integridad finalizada" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Comprobación de la integridad finalizada. No se encontraron errores." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3196,7 +3261,7 @@ msgstr "" msgid "Interface" msgstr "Interfaz" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Configuración de la interfaz" @@ -3221,20 +3286,20 @@ msgstr "Error Interno de LZO - lzo_init() falló" msgid "Internal Resolution:" msgstr "Resolución interna:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Intérprete (MUY lento)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Tamaño no válido(%x) o Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "¡Valor no válido!" @@ -3242,16 +3307,16 @@ msgstr "¡Valor no válido!" msgid "Invalid bat.map or dir entry" msgstr "bat.map o entrada de directorio no válido" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Evento de tipo %i no válido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Archivo no válido" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3262,7 +3327,7 @@ msgstr "" "%s\n" "Puede ser que necesites volcar este juego de nuevo." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Archivo de grabación no válido" @@ -3278,34 +3343,36 @@ msgstr "Cadena de búsqueda incorrecta (no se pudo convertir en un número)" msgid "Invalid search string (only even string lengths supported)" msgstr "Búsqueda de cadena incorrecta (solo se soportan algunas longitudes)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Estado no válido" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italiano" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPÓN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "Recompilador JIT (recomendado)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Recompilador experimental JITIL" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonés" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "COREA" @@ -3327,8 +3394,9 @@ msgstr "Mantener la ventana siempre visible" msgid "Key" msgstr "Clave" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Coreano" @@ -3350,12 +3418,12 @@ msgstr "L-Analógico" msgid "Language:" msgstr "Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Último %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latencia:" @@ -3394,7 +3462,7 @@ msgstr "" "Clic izq./der. para más opciones.\n" "Clic medio para borrar." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Menor que" @@ -3411,58 +3479,48 @@ msgid "Load Custom Textures" msgstr "Cargar texturas personalizadas" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Cargar estado" +msgstr "Cargar estado" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "&Cargar estado 1" +msgstr "Cargar último estado 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "&Cargar estado 2" +msgstr "Cargar último estado 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "&Cargar estado 3" +msgstr "Cargar último estado 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "&Cargar estado 4" +msgstr "Cargar último estado 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "&Cargar estado 5" +msgstr "Cargar último estado 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "&Cargar estado 6" +msgstr "Cargar último estado 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "&Cargar estado 7" +msgstr "Cargar último estado 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "&Cargar estado 8" +msgstr "Cargar último estado 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "&Cargar estado 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "&Cargar estado 1" +msgstr "Cargar estado 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3493,19 +3551,18 @@ msgid "Load State Slot 8" msgstr "&Cargar estado 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "&Cargar estado 1" +msgstr "Cargar estado 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Cargar estado..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Cargar Menú de sistema Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Cargar Menú de sistema Wii %d %c" @@ -3524,10 +3581,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Cargar valores ya definidos de los patrones de hack disponibles." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Local" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Registrar" @@ -3561,12 +3614,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Salida de registro" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Registrando" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "¡Se perdió la conexión con el servidor!" @@ -3574,7 +3627,7 @@ msgstr "¡Se perdió la conexión con el servidor!" msgid "M Button" msgstr "Botón M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3583,7 +3636,7 @@ msgstr "" "MD5 no coinciden\n" "%016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Hack de velocidad MMU" @@ -3597,11 +3650,11 @@ msgstr "Archivos MadCatz Gameshark (*.gcs)" msgid "Main Stick" msgstr "Stick principal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID del fabricante:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Fabricante:" @@ -3613,8 +3666,8 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Hace que los objetos distantes más visibles mediante la eliminación de " -"niebla, lo que aumenta el detalle general.\n" +"Hace los objetos distantes más visibles mediante la eliminación de niebla, " +"lo que aumenta el detalle en general.\n" "Desactivar la niebla provocará que algunos juegos basados en la emulación de " "niebla dejen de funcionar correctamente.\n" "\n" @@ -3638,7 +3691,7 @@ msgid "Memory Byte" msgstr "Byte de memoria" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Tarjeta de memoria" @@ -3650,7 +3703,7 @@ msgstr "" "Administrador de tarjetas de memoria. ADVERTENCIA: Haz copias antes de " "usarlo; debería estar arreglado, ¡pero puede estropear cosas!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3667,7 +3720,7 @@ msgstr "" "%s\n" "¿Deseas copiar el viejo archivo a esta nueva dirección?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "El tamaño del fichero de la tarjeta de memoria no corresponde con el tamaño " @@ -3677,7 +3730,7 @@ msgstr "" msgid "Menu" msgstr "Menú" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mic" @@ -3690,7 +3743,7 @@ msgstr "Mín." msgid "Misc" msgstr "Varios" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Configuraciones varias" @@ -3715,11 +3768,11 @@ msgstr "" msgid "Monospaced font" msgstr "Fuente monoespaciada" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3839,15 +3892,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Arriba" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nombre:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nombre:" @@ -3857,7 +3910,7 @@ msgstr "Nombre:" msgid "Native GCI files(*.gci)" msgstr "Archivos nativos GCI (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nuevo escaneado" @@ -3866,7 +3919,7 @@ msgstr "Nuevo escaneado" msgid "Next Page" msgstr "Próxima página" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Próximo escaneado" @@ -3874,11 +3927,11 @@ msgstr "Próximo escaneado" msgid "Nickname :" msgstr "Apodo:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Ningún país (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Ninguna ISO o WAD ha sido encontrada." @@ -3886,10 +3939,10 @@ msgstr "Ninguna ISO o WAD ha sido encontrada." msgid "No audio output" msgstr "Sin salida de audio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" -msgstr "No se encontró un archivo de banner para el juego %s" +msgstr "No se encontró una imagen para el juego %s" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:771 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:778 @@ -3912,44 +3965,45 @@ msgstr "No hay entradas de índice de directorio libres" msgid "No recorded file" msgstr "No hay grabaciones guardadas" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "No se encontró carpeta de guardado para el juego %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Ninguno" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Noruego Bokmal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "No igual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "No definido" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "No es un guardado de Wii o fallo de lectura para la cabecera de archivo de " "tamaño %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Sin conectar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notas" @@ -3970,7 +4024,7 @@ msgstr "Aviso" msgid "Num Lock" msgstr "Bloq Num" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Número de códigos:" @@ -3991,7 +4045,7 @@ msgstr "Objeto" msgid "Object Range" msgstr "Rango de objeto" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Off" @@ -4003,25 +4057,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "Mensajes en pantalla" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "&Documentación online" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Solo %d bloques disponibles" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Abrir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Abrir directorio &contenedor" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Abrir carpeta de guardado&s de Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Abrir archivo..." @@ -4047,7 +4105,15 @@ msgstr "Descodificador de texturas OpenCL" msgid "OpenMP Texture Decoder" msgstr "Descodificador de texturas OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Abre la configuración por defecto (modo solo lectura) para este juego en un " +"editor de texto externo." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opciones" @@ -4057,7 +4123,6 @@ msgid "Orange" msgstr "Naranja" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -4073,7 +4138,7 @@ msgstr "" msgid "Other" msgstr "Otros" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4085,15 +4150,15 @@ msgstr "" msgid "Output" msgstr "Salida" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "&Reproducir grabación" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad" @@ -4117,17 +4182,17 @@ msgstr "Párrafo" msgid "Parameters" msgstr "Parámetros" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partición %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "No existe la partición: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Parches" @@ -4135,8 +4200,8 @@ msgstr "Parches" msgid "Paths" msgstr "Directorios" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausa" @@ -4149,7 +4214,7 @@ msgstr "Pausar al acabar la película" msgid "Per-Pixel Lighting" msgstr "Iluminación por píxel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfecto" @@ -4159,9 +4224,9 @@ msgid "Perspective %d" msgstr "Perspectiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Reproducir" @@ -4173,7 +4238,7 @@ msgstr "Reproducir grabación" msgid "Play/Pause" msgstr "Reproducir/pausa" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Jugable" @@ -4181,11 +4246,11 @@ msgstr "Jugable" msgid "Playback Options" msgstr "Opciones de reproducción" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Jugadores" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Confirma, por favor..." @@ -4197,23 +4262,23 @@ msgstr "Por favor, crea una perspectiva antes de guardar" msgid "Plus-Minus" msgstr "Más-menos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polaco" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Puerto 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Puerto 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Puerto 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Puerto 4" @@ -4222,11 +4287,11 @@ msgstr "Puerto 4" msgid "Port :" msgstr "Puerto:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugués" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugués (Brasil)" @@ -4234,17 +4299,17 @@ msgstr "Portugués (Brasil)" msgid "Post-Processing Effect:" msgstr "Efecto de posprocesado:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Final prematuro de la película en PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Final prematuro de la película en PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Final prematuro de la película en PlayWiimote. %u > %u" @@ -4261,7 +4326,7 @@ msgstr "Página previa" msgid "Previous Page" msgstr "Página previa" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valor anterior" @@ -4277,7 +4342,7 @@ msgstr "Perfil" msgid "Properties" msgstr "Propiedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Limpiar caché" @@ -4286,7 +4351,7 @@ msgid "Question" msgstr "Pregunta" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Salir" @@ -4308,13 +4373,13 @@ msgstr "R-Analógico" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSIA" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radio" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4330,7 +4395,7 @@ msgstr "Real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Balance Board real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4347,6 +4412,10 @@ msgstr "Wiimotes reales" msgid "Record" msgstr "Grabar" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Grabar entrada" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Información de la grabación" @@ -4382,7 +4451,7 @@ msgstr "" "Si no estás seguro, selecciona Ninguno." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Actualizar" @@ -4391,14 +4460,14 @@ msgstr "Actualizar" msgid "Refresh List" msgstr "Actualizar lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Actualizar lista de juegos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Eliminar" @@ -4421,7 +4490,7 @@ msgstr "Renderizar a ventana principal" msgid "Reset" msgstr "Reiniciar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultados" @@ -4429,9 +4498,9 @@ msgstr "Resultados" msgid "Return" msgstr "Volver" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisión:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4442,20 +4511,19 @@ msgstr "Derecha" msgid "Right Stick" msgstr "Stick Derecho" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibración" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Ejecutar DSP HLE y LLE en un proceso dedicado (no recomendado: podría causar " -"interferencias de audio con HLE y se cuelgue con LLE)." +"Ejecuta DSP LLE en un hilo dedicado (no está recomendado: puede causar " +"congelamientos)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Ruso" @@ -4468,7 +4536,7 @@ msgid "Safe" msgstr "Seguro" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Guardar" @@ -4478,12 +4546,10 @@ msgid "Save GCI as..." msgstr "Guardar GCI como..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Guardar estado" +msgstr "Guardar el estado más antiguo" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" msgstr "Guardar estado" @@ -4492,9 +4558,8 @@ msgid "Save State Slot 1" msgstr "Guardar estado 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Guardar estado 1" +msgstr "Ranura de guardado 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4525,32 +4590,31 @@ msgid "Save State Slot 8" msgstr "Guardar estado 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Guardar estado 1" +msgstr "Ranura de guardado 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Guardar estado..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Guardar como..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Guardar GCM/ISO comprimido" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Guardar perspectiva actual" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Guardar GCM/ISO descomprimido" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4561,20 +4625,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "EFB Copia a escala" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Escaneando %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Buscando ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Escaneando..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Pantallazo" @@ -4586,11 +4650,11 @@ msgstr "Bloq. desplazamiento" msgid "Search" msgstr "Buscar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtro de búsqueda" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Buscar en subcarpetas" @@ -4613,12 +4677,12 @@ msgstr "No se ha encontrado la sección %s en SYSCONF" msgid "Select" msgstr "Seleccionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Seleccionar archivo de grabación" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Elige un WAD de Wii para instalar" @@ -4640,19 +4704,19 @@ msgstr "Selecciona un archivo de guardado para importar" msgid "Select floating windows" msgstr "Selecciona las ventanas flotantes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Selecciona el archivo para cargar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Selecciona el archivo de guardado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Selecciona el estado para cargar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Selecciona el estado para guardar" @@ -4674,7 +4738,7 @@ msgstr "" "\n" "Si no estás seguro, elige Automático." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "El perfil del controlador escogido no existe" @@ -4699,40 +4763,28 @@ msgstr "" "Si no estás seguro, elige la resolución que uses en el escritorio.\n" "Si sigues inseguro, elige la mayor resolución que te funcione." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Elige la aplicación gráfica para ser usada internamente.\n" -"Direct3D 9 habitualmente es la más rápida. OpenGL es más exacta. Direct3D 11 " -"está entre las dos.\n" -"Los sistemas Direct3D solo están disponibles en Windows.\n" -"\n" -"Si no estás seguro, utiliza Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Elige la aplicación gráfica para ser usada internamente.\n" -"Direct3D 9 habitualmente es la más rápida. OpenGL es más exacta. Direct3D 11 " -"está entre las dos.\n" -"Los sistemas Direct3D solo están disponibles en Windows.\n" -"\n" -"\n" -"Si no estás seguro, utiliza OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Enviar" @@ -4744,18 +4796,18 @@ msgstr "Posición de la barra sensora:" msgid "Separator" msgstr "Separador" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Puerto serie 1 - Este es el puerto que dispositivos como el adaptador de red " "usan." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Definir como ISO por &defecto" @@ -4764,7 +4816,7 @@ msgstr "Definir como ISO por &defecto" msgid "Set as default Memcard %c" msgstr "Definir como Memory Card por defecto %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4779,19 +4831,19 @@ msgstr "" "Ajusta la latencia (en ms). Valores más altos pueden reducir el petardeo del " "audio. Solo para el motor OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Configuración..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: No se puede encontrar el archivo de configuración" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: No se puede crear el archivo de configuración" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Sacudir" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Nombre corto:" @@ -4799,23 +4851,27 @@ msgstr "Nombre corto:" msgid "Shoulder Buttons" msgstr "Botones laterales" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Mostrar &consola" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Mostrar ®istro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Mostrar barra de e&stado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Mostrar barra de herramien&tas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Mostrar valores por defecto" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Mostrar unidades" @@ -4827,11 +4883,11 @@ msgstr "Mostrar regiones de copiado de EFB" msgid "Show FPS" msgstr "Mostrar FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Mostrar Francia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Mostrar Gamecube" @@ -4839,35 +4895,35 @@ msgstr "Mostrar Gamecube" msgid "Show Input Display" msgstr "Mostrar entrada" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Mostrar Italia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Mostrar JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Mostrar Corea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Mostrar idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Mostrar configuración de ®istro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Mostrar PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Mostrar plataformas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Mostrar regiones" @@ -4875,27 +4931,27 @@ msgstr "Mostrar regiones" msgid "Show Statistics" msgstr "Mostar estadísticas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Mostrar Taiwán" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Mostrar USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Mostrar WAD" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Mostrar Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Mostrar una ventana de confirmación antes de detener un juego." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4914,7 +4970,7 @@ msgstr "Mostrar primer bloque" msgid "Show lag counter" msgstr "Mostrar contador de lag" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4952,7 +5008,7 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Mostrar desconocido" @@ -4966,23 +5022,24 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote de costado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Tamaño" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Saltar BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Saltar limpieza DCBZ" @@ -5007,17 +5064,17 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Ranura %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Ranura A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Ranura B" @@ -5025,7 +5082,7 @@ msgstr "Ranura B" msgid "Snapshot" msgstr "Instántanea" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderizado por software" @@ -5041,27 +5098,27 @@ msgstr "" "¿Realmente quieres activar renderizado por software? Si no estás seguro, " "elige No." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Configuración de sonido" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "El motor de sonido %s no es válido." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Falló la creación del búfer de sonido: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Espacio" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Español" @@ -5089,37 +5146,29 @@ msgstr "" "\n" "Si no estás seguro, elige 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Acelerar la transferencia de disco" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Stick cuadrado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Control estándar" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Comenzar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Comenzar &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Comenzar graba&ción" @@ -5127,7 +5176,7 @@ msgstr "Comenzar graba&ción" msgid "Start Recording" msgstr "Comenzar grabación" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Estado" @@ -5135,7 +5184,7 @@ msgstr "Estado" msgid "State Saves" msgstr "Estados guardados" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volante" @@ -5144,7 +5193,7 @@ msgid "Stick" msgstr "Stick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Detener" @@ -5175,41 +5224,42 @@ msgstr "Rasgar" msgid "Subtract" msgstr "Sustraer" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Se exportó correctamente al archivo %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Los archivos de guardado se han importado con éxito." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Sueco" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Oscilar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Sincronizar subproceso de GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -"Sincroniza los subprocesos la GPU y la CPU para ayudar a prevenir bloqueos " -"aleatorios en el modo a Doble Núcleo. (ON = Compatible, OFF = rápido)" +"Sincroniza los procesos de la GPU y la CPU para ayudar a prevenir bloqueos " +"aleatorios en el modo a Doble Núcleo. (ON = Compatible, OFF = Rápido)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Idioma del sistema:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWÃN" @@ -5234,13 +5284,13 @@ msgstr "Tabla izquierda" msgid "Table Right" msgstr "Tabla derecha" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Captura de pantalla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5260,11 +5310,11 @@ msgstr "Caché de texturas" msgid "Texture Format Overlay" msgstr "Superposición del formato de la textura" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "El WAD ha sido instalado con éxito" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "La dirección no es válida" @@ -5272,13 +5322,13 @@ msgstr "La dirección no es válida" msgid "The checksum was successfully fixed" msgstr "La suma de verificación fue reparada con éxito." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "El directorio escogido ya se encuentra en la lista" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5302,7 +5352,7 @@ msgid "The file %s was already open, the file header will not be written." msgstr "" "El archivo %s ya estaba abierto, la cabecera de archivo no será escrita." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "El archivo especificado (%s) no existe" @@ -5336,7 +5386,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "El guardado que está tratando de copiar tiene un tamaño de archivo no válido" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5344,36 +5394,36 @@ msgstr "" "El idioma seleccionado no es soportado por tu sistema. Volviendo al " "predeterminado del sistema." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "¡Las versiones de NetPlay del client y el servidor son incompatibles!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "¡El servidor está lleno!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "El servidor respondió: ¡el juego actualmente está funcionando!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "¡El servidor envió un mensaje de error desconocido!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "El archivo especificado \"%s\" no existe" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "El valor no es válido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5381,7 +5431,7 @@ msgstr "" "Debe haber un ticket para 00000001/00000002. Probablemente su volcado de " "NAND esté incompleto." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5389,7 +5439,7 @@ msgstr "" "Estas opciones remplazan a las opciones de núcleo de Dolphin.\n" "Sin determinar significa que el juego usa la configuración de Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5397,7 +5447,7 @@ msgstr "" "El simulador de Action Replay no soporta códigos que modifiquen al Action " "Replay." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "Esto podría provocar peor rendimiento en el Menú de Wii y algunos juegos." @@ -5423,20 +5473,19 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Si defines un límite de fotogramas mayor que la velocidad de juego completa " -"(NTSC: 60, PAL: 50), también debes deshabilitar la regulación de audio en " -"DSP para que tenga efecto (debería arreglar los \"clics\" de audio, pero " -"puede causar ruido constante dependiendo del juego)." +"Esto limita la velocidad de juego a un número específico de fotogramas por " +"segundo (velocidad completa es 60 para NTSC y 50 para PAL). También puedes " +"utilizar la regulación de audio con el DSP (puede arreglar los clics de " +"audio, pero puede causar ruido constante dependiendo del juego)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5448,7 +5497,7 @@ msgstr "" "Provoca mejoras de velocidad muy grandes en PC con mas de un núcleo, pero " "puede ocasionar errores gráficos o del programa." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Esto te permitirá editar manualmente el archivo de configuración INI" @@ -5457,12 +5506,12 @@ msgstr "Esto te permitirá editar manualmente el archivo de configuración INI" msgid "Threshold" msgstr "Límite" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Inclinar" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Título" @@ -5476,39 +5525,37 @@ msgid "Toggle All Log Types" msgstr "Alternar todos los tipos de registro" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Relación de aspecto:" +msgstr "Activar relación de aspecto" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Copias de EFB" +msgstr "Activar copias de EFB" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Alternar todos los tipos de registro" +msgstr "Activar niebla" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Cambiar a pantalla completa" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Activar IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Superior" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chino tradicional" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Se trató de cargar un archivo de tipo desconocido." @@ -5528,7 +5575,7 @@ msgstr "" "Intentando leer de un SYSCONF no válido\n" "bt ids del Wiimote no están disponibles" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turco" @@ -5544,12 +5591,12 @@ msgstr "Tipo" msgid "UDP Port:" msgstr "Puerto UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "DESCONOCIDO" @@ -5558,7 +5605,7 @@ msgstr "DESCONOCIDO" msgid "UNKNOWN_%02X" msgstr "DESCONOCIDO_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "EUA" @@ -5571,9 +5618,9 @@ msgstr "" "Entrada no modificada." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5581,7 +5628,7 @@ msgstr "" "válido cifrado o descifrado. Asegúrate de que la has escrito correctamente.\n" "¿Te gustaría hacer caso omiso de esta línea y continuar el análisis?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Indefinido %i" @@ -5591,19 +5638,18 @@ msgid "Undo Load State" msgstr "Deshacer cargar estado" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Deshacer cargar estado" +msgstr "Deshacer estado guardado" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "¿Llamada inesperada a 0x80? Cancelando..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Desconocido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Comando desconocido de DVD %08x - error fatal" @@ -5618,12 +5664,12 @@ msgstr "Comando desconocido 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "¡Entrada desconocida de tipo %i en SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Se recibió un mensaje desconocido de id: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5634,16 +5680,16 @@ msgstr "" msgid "Up" msgstr "Arriba" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Actualizar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote parado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Usar Modo EuRGB60 (PAL60)" @@ -5651,7 +5697,7 @@ msgstr "Usar Modo EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Usar pantalla completa" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Usar hexadecimal" @@ -5666,6 +5712,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Usa un sistema menos preciso para calcular los valores de profundidad.\n" +"Provoca pequeños errores en unos pocos juegos pero da un notable aumento de " +"velocidad.\n" +"\n" +"Si dudas déjalo sin marcar." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5680,6 +5731,20 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Usa operaciones inseguras para acelerar el streaming de vértices en Open GL. " +"No hay problemas conocidos en GPUs soportadas, pero causa problemas severos " +"y errores gráficos en las demás.\n" +"\n" +"Si dudas, déjalo sin marcar." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5703,12 +5768,11 @@ msgstr "Utilidad" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Hack de velocidad MMU" +msgstr "Hack de velocidad VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valor" @@ -5716,7 +5780,7 @@ msgstr "Valor" msgid "Value:" msgstr "Valor:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Valor:" @@ -5726,9 +5790,9 @@ msgstr "Verbosidad" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hack del streaming de vértices" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Vídeo" @@ -5736,17 +5800,17 @@ msgstr "Vídeo" msgid "Virtual" msgstr "Virtual" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volumen" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "La instalación del WAD falló: error al crear %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "La instalación del WAD falló: error al crear el ticket" @@ -5769,19 +5833,19 @@ msgstr "" msgid "Warning" msgstr "Advertencia" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "¡Advertencia - arrancando un DOL en un modo de consola incorrecto!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "¡Advertencia - arrancando un ELF en un modo de consola incorrecto!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "¡Advertencia - arrancando un ISO en un modo de consola incorrecto!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5807,7 +5871,7 @@ msgstr "" "y tienen el mismo nombre que el archivo en tu memcard\n" "¿Continuar?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5818,7 +5882,7 @@ msgstr "" "actual.(Byte %u > %u) (frame %u > %u). Deberías cargar otro guardado antes " "de continuar, o cargar éste sin el modo de solo lectura." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5830,7 +5894,7 @@ msgstr "" "con el modo de solo lectura desactivado. De lo contrario probablemente " "obtengas una desincronización." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5885,19 +5949,15 @@ msgstr "Ancho" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Consola Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Raíz de la NAND de Wii:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importar guardado de Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Archivos de guardado Wii (*.bin)|*.bin" @@ -5906,16 +5966,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: No se pudo leer el archivo" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote conectado" @@ -5923,7 +5989,7 @@ msgstr "Wiimote conectado" msgid "Wiimote Motor" msgstr "Motor Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Configuración Wiimote" @@ -5947,16 +6013,16 @@ msgstr "Windows Derecha" msgid "Word Wrap" msgstr "Word Wrap" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Trabajando..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Escribir memcards (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5974,21 +6040,36 @@ msgstr "Escribir al archivo" msgid "Write to Window" msgstr "Escribir a la ventana" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice falló: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 init falló: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 creación de voz maestra falló: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice falló: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 init falló: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 creación de voz maestra falló: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "Registro XF" @@ -6023,11 +6104,11 @@ msgstr "No puede cerrar ventanas que tengan páginas en ellas." msgid "You must choose a game!!" msgstr "¡¡Debes elegir un juego!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "¡Debes escribir un nombre!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Debes introducir un valor decimal o hexadecimal válido." @@ -6035,7 +6116,7 @@ msgstr "Debes introducir un valor decimal o hexadecimal válido." msgid "You must enter a valid profile name." msgstr "Debes introducir un nombre de perfil válido." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Debes reiniciar Dolphin para que el cambio tenga efecto." @@ -6049,7 +6130,7 @@ msgstr "" "¿Deseas detener ahora para arreglar el problema?\n" "Si seleccionas \"No\", el audio se oirá con ruidos." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6068,15 +6149,15 @@ msgstr "" "Debería ser 0x%04x (pero es 0x%04llx)\n" "¿Quiere crear uno nuevo?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "Zelda TP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Código Zero 3 no soportado" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Código cero desconocido para Dolphin: %08x" @@ -6137,20 +6218,24 @@ msgstr "" "\n" "Si no estás seguro, déjala sin marcar." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Leyendo Opcode desde %x. Por favor, comunícalo." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "Resultado desconocido %d (esperado %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "Mensaje desconocido recibido" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "¡wxExecute dio un -1 al iniciar la aplicación!" @@ -6166,76 +6251,48 @@ msgstr "Correción zNear:" msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulación de VBeam precisa" +#~ msgid "Could not create %s" +#~ msgstr "No se pudo crear %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Editar cambios locales" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "Abre los cambios locales del usuario en un editor de texto externo" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Permite alternar algunas opciones a través de las teclas de acceso rápido " -#~ "3 (Resolución interna), 4 (Relación de apecto), 5 (Copias EFB) y 6 " -#~ "(Niebla) en la ventana de emulación.\n" +#~ "Elige la aplicación gráfica para ser usada internamente.\n" +#~ "Direct3D 9 habitualmente es la más rápida. OpenGL es más exacta. Direct3D " +#~ "11 está entre las dos.\n" +#~ "Los sistemas Direct3D solo están disponibles en Windows.\n" #~ "\n" -#~ "Si no estás seguro, déjala sin marcar." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "" -#~ "No se puede encontrar el WiiMote por bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Habilitar atajos" - -#~ msgid "Failed to Listen!!" -#~ msgstr "¡Fallo al escuchar!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Fallo al cargar bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Fallo al cargar hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Configuración del micro de GC" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY ha sido llamada; ¡por favor, comunícalo!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Búfer hackeado cargado" +#~ "Si no estás seguro, utiliza Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Si los FPS son erróneos, esta opción puede ayudar. (ON = Compatible, OFF " -#~ "= Rápido)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Último estado sobrescrito" - -#~ msgid "Last Saved State" -#~ msgstr "Último estado guardado" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Reconectar Wiimote al cargar estado" - -#~ msgid "Set" -#~ msgstr "Definir" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Saltar pase de alpha en dest." - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Utilizar un búfer de carga hackeada a los vértices de flujo.\n" -#~ "Normalmente mejora la velocidad, pero esta prohibido en OpenGL y puede " -#~ "causar errores graves.\n" +#~ "Elige la aplicación gráfica para ser usada internamente.\n" +#~ "Direct3D 9 habitualmente es la más rápida. OpenGL es más exacta. Direct3D " +#~ "11 está entre las dos.\n" +#~ "Los sistemas Direct3D solo están disponibles en Windows.\n" #~ "\n" -#~ "Si no estás seguro, déjala desmarcada." +#~ "\n" +#~ "Si no estás seguro, utiliza OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Leyendo Opcode desde %x. Por favor, comunícalo." diff --git a/Languages/po/fa.po b/Languages/po/fa.po index a04c0faec7..09c328496c 100644 --- a/Languages/po/fa.po +++ b/Languages/po/fa.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: Delayline \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Persian (http://www.transifex.com/projects/p/dolphin-emu/" "language/fa/)\n" "Language: fa\n" @@ -19,13 +19,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(برای نمایش دادن بسیار زیاد است)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "بازی :" @@ -33,7 +33,7 @@ msgstr "بازی :" msgid "! NOT" msgstr "! نه" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -42,7 +42,7 @@ msgstr "" "\"%s\" وجود ندارد.\n" "یک کارت حاÙظه Û±Û¶ مگا بایتی جدید ساخته شود؟" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -59,28 +59,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sÚ©Ù¾ÛŒ%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s وجود دارد، بازنویسی شود؟" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s تمیز کارى آیزو با شکست مواجه شد. شاید Ùایل آیزو خراب است." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -89,7 +89,7 @@ msgstr "" "%s بارگذاری بعنوان کارت حاÙظه با شکست مواجه شد \n" "حجم Ùایل کارت نامعتبر است (0x%x بایت)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -98,7 +98,7 @@ msgstr "" "%s بارگذاری بعنوان کارت حاÙظه با شکست مواجه شد \n" "حجم کارت حاÙظه نامعتبر است (0x%x بایت)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -107,22 +107,27 @@ msgstr "" "%s بارگذاری بعنوان کارت حاÙظه با شکست مواجه شد \n" "Ùایل به اندازه کاÙÛŒ بزرگ نیست Ú©Ù‡ یک Ùایل کارت حاÙظه معتبر باشد (0x%x بایت)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s بازکردن با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s یک Ùایل با حجم Û° بایت است" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s Ùشرده شده است! توان Ùشرده سازی بیشتر را ندارد." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s برای اسم Ùایل بسیار دراز است، حداکثر تعداد کاراکترها Û´Ûµ است" @@ -151,7 +156,7 @@ msgstr "%u بلوک های آزاد; %u ورودی های پوشه آزاد" msgid "&& AND" msgstr "&& Ùˆ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&درباره..." @@ -159,7 +164,7 @@ msgstr "&درباره..." msgid "&Boot from DVD Drive..." msgstr "&بوت شدن از درایو دی ÙˆÛŒ دی..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&نقاط انÙصال" @@ -167,7 +172,7 @@ msgstr "&نقاط انÙصال" msgid "&Browse for ISOs..." msgstr "&مرور برای Ùایل های آیزو..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "مدیریت کدهای &تقلب" @@ -175,11 +180,11 @@ msgstr "مدیریت کدهای &تقلب" msgid "&DSP Settings" msgstr "تنظیمات پردازشگر &صدای دلÙین" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&حذ٠آیزو..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&حذ٠آیزو های انتخاب شده..." @@ -191,11 +196,11 @@ msgstr "&برابرسازی" msgid "&File" msgstr "&Ùایل" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&پيشروى Ùریم" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&تمام صÙحه" @@ -203,7 +208,7 @@ msgstr "&تمام صÙحه" msgid "&Graphics Settings" msgstr "تنظیمات &گراÙیک" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Ú©Ù…Ú©" @@ -211,7 +216,7 @@ msgstr "&Ú©Ù…Ú©" msgid "&Hotkey Settings" msgstr "تنظیم &شرت کاتها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&جیت" @@ -223,11 +228,11 @@ msgstr "&بارگذاری وضعیت" msgid "&Memcard Manager (GC)" msgstr "مدیر &کارت حاÙظه (گیم کیوب)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&حاÙظه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&باز کردن..." @@ -235,51 +240,51 @@ msgstr "&باز کردن..." msgid "&Options" msgstr "&گزینه ها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "Ù…Ú©Ø«" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&شروع بازی" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "خواص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&حالت Ùقط خواندنی" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&به روز کردن لیست" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "ثبت کردن" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "شروع &دوباره" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&صدا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&توقÙ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&ابزارها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&ویدیو" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&دیدگاه" @@ -287,7 +292,7 @@ msgstr "&دیدگاه" msgid "&Wiimote Settings" msgstr "تنظیمات &ویموت" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&ویکی" @@ -312,9 +317,8 @@ msgid "(off)" msgstr "(خاموش)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ اضاÙÙ‡ کردن" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -324,7 +328,7 @@ msgstr "Û°xÛ´Û´" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "Û±Û¶ بیت" @@ -340,7 +344,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "Û³Û² بیت" @@ -356,7 +360,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "Û¸ بیت" @@ -368,7 +372,7 @@ msgstr "<اسم را اینجا وارد کنید>" msgid "" msgstr "<سایز تصویر پیدا نشد>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<هیچ>" @@ -376,7 +380,7 @@ msgstr "<هیچ>" msgid "" msgstr "<تکمه Ùشارى>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<سیستم>" @@ -385,12 +389,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "پنجره نت پلی از قبل باز است!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "بازی در حال حاضر اجرا نشده است." @@ -401,7 +405,6 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -410,39 +413,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"اخطار:\n" -"\n" -"در حال حاضر نت پلی تنها زمانی به درستی کار خواهد کرد Ú©Ù‡ از تنظیمات زیر " -"استÙاده Ù…ÛŒ کند:\n" -"- پردازنده با دو هسته یا بیشتر [خاموش]\n" -"- دریچه صدا [خاموش]\n" -"- برابرسازی سطح بالای پردازشگر صدای دلÙین با \"Null Audio\" یا برابرسازی سطح " -"پائین پردازشگر صدای دلÙین\n" -"- تعداد دقیق کنترولر هایی Ú©Ù‡ استÙاده خواهند شد را به صورت دستی تنظیم کنید " -"[کنترولر استاندارد]\n" -"تمام بازیکنان باید سعی کنند Ú©Ù‡ از همان تنظیمات Ùˆ نسخه دلÙین استÙاده کنند.\n" -"تمام کارت های حاÙظه را از کار بیاندازید یا پیش از شروع آنها را به تمام " -"بازیکنان بÙرستید.\n" -"پشتیبانی ویموت اجرا نشده است.\n" -"\n" -"شما باید درگاه TCP را به میزبان ارسال کنید!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "بÙرد٠مادر ای ام" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "کدهای اکشن ریپلی" @@ -491,14 +477,14 @@ msgstr "" "کد خراب:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" "خطای اکشن ریپلی: سایز نامعتبر (%08x : آدرس = %08x) در اضاÙÙ‡ کردن کد (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -506,7 +492,7 @@ msgid "" msgstr "" "خطای اکشن ریپلی: سایز نامعتبر (%08x : آدرس = %08x) در پر Ùˆ اسلاید کردن (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -515,7 +501,7 @@ msgstr "" "خطای اکشن ریپلی: سایز نامعتبر (%08x : آدرس = %08x) در پر کردن Ùˆ نوشتن حاÙظه " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -523,12 +509,12 @@ msgid "" msgstr "" "خطای اکشن ریپلی: سایز نامعتبر (%08x : آدرس = %08x) در نوشتن به اشاره گر (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "خطای اکشن ریپلی: مقدار نامعتبر (%08x) در Ú©Ù¾ÛŒ حاÙظه (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -537,27 +523,27 @@ msgstr "" "خطای اکشن ریپلی: کد مستر Ùˆ نوشتن به CCXXXXXX تکمیل نشده است (%s)\n" "به کدهای مستر نیاز نیست. از کدهای مستر استÙاده نکنید." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "خطای اکشن ریپلی: خط کد نامعتبر اکشن ریپلی: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "خطای اکشن ریپلی: کد نامعلوم: سایز نامعتبر %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "خطای اکشن ریپلی: الگوی کد عادی نامعتبر %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "خطای اکشن ریپلی: کد عادی %i: کد Ùرعی نامعتبر %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "خطای اکشن ریپلی: کد عادی Û°: کد Ùرعی نامعتبر %08x (%s)" @@ -571,11 +557,11 @@ msgstr "آداپتور:" msgid "Add" msgstr "اضاÙÙ‡ کردن" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "اضاÙÙ‡ کردن کد اکشن ریپلی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "اضاÙÙ‡ کردن وصله" @@ -583,9 +569,9 @@ msgstr "اضاÙÙ‡ کردن وصله" msgid "Add new pane" msgstr "اضاÙÙ‡ کردن تکه جدید" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "اضاÙÙ‡ کردن..." @@ -641,32 +627,32 @@ msgstr "پیشرÙته" msgid "Advanced Settings" msgstr "تنظیمات پیشرÙته" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "همه Ùایل های گیم کیوب/ÙˆÛŒ (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "همه ایمیجهای گیم کیوب/ÙˆÛŒ (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "همه Ùایل های گیم کیوب جی سی ام (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "همه وضعیت های ذخیره (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "همه Ùایل های آیزو ÙˆÛŒ (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "همه Ùایل های آیزو Ùشرده شده گیم کیوب/ÙˆÛŒ (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "همه Ùایل ها (*.*)|*.*" @@ -686,19 +672,19 @@ msgstr "Ùیلتر ناهمسانگر:" msgid "Anti-Aliasing:" msgstr "آنتی آلیاسینگ:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "سایز بارگذار برنامه اشتباه است...آیا این واقعا بارگذار برنامه است؟" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "بارگذار برنامه ناتوان در بارگذاری از Ùایل" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "بار گذار برنامه:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "اعمال کردن" @@ -712,7 +698,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، (خاموش) را انتخاب کنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "عربی" @@ -721,7 +707,7 @@ msgstr "عربی" msgid "Are you sure you want to delete \"%s\"?" msgstr "آیا شما مطمئن هستید Ú©Ù‡ میخواهید \"%s\" را حذ٠کنید؟" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -729,17 +715,21 @@ msgstr "" "آیا شما مطمئن هستید Ú©Ù‡ میخواهید این Ùایلها را حذ٠کنید؟\n" "این Ùایل ها برای همیشه از بین خواهند رÙت!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "آیا شما مطمئن هستید Ú©Ù‡ میخواهید این Ùایل را حذ٠کنید؟ این Ùایل برای همیشه " "از بین خواهند رÙت!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "نسبت طول به عرض تصویر:" @@ -748,12 +738,12 @@ msgstr "نسبت طول به عرض تصویر:" msgid "At least one pane must remain open." msgstr "حداقل یک قطه Ù…ÛŒ بایست باز بماند." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "صدا" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "پشتوانه صدا:" @@ -761,7 +751,7 @@ msgstr "پشتوانه صدا:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: خطا در باز کردن دستگاه خروجی صدا.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "اتوماتیک" @@ -800,16 +790,16 @@ msgstr "ثبت اشاره گر پایه" msgid "Back" msgstr "برگشت" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "تنظیمات پشتوانه" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "پشتوانه:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "ورودی پس زمینه" @@ -818,7 +808,7 @@ msgstr "ورودی پس زمینه" msgid "Backward" msgstr "به عقب" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "سرخط ناصحیح Ùایل" @@ -827,15 +817,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "نشان" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "جزئیات نشان" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "نشان:" @@ -855,7 +845,7 @@ msgstr "تنظیمات بنیانی" msgid "Bass" msgstr "بم" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Ú†Ú© سام جدول تخصیص بلوک با شکست مواجه شد" @@ -876,7 +866,7 @@ msgid "Blue Right" msgstr "آبی راست" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "پائین" @@ -885,27 +875,27 @@ msgstr "پائین" msgid "Bound Controls: %lu" msgstr "کنترل های محدودیت: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "خراب" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "مرور" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "مرور برای پوشه جهت اضاÙÙ‡ کردن" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "مرور برای پوشه آیزو..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "مرور برای پوشه خروجی" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "حاÙظه موقت:" @@ -915,7 +905,7 @@ msgstr "حاÙظه موقت:" msgid "Buttons" msgstr "دکمه ها" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -961,33 +951,33 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "لغو کردن" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "قادر به باز گشایی نیست %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "رویدادهایی را Ú©Ù‡ معوق اند نمی تواند از ثبت درآورد." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -998,7 +988,7 @@ msgstr "" "%s\n" "این یک Ùایل کارت حاÙظه معتبر گیم کیوب نیست" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1010,7 +1000,7 @@ msgstr "" msgid "Caps Lock" msgstr "کپس لاک" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "کاتالان" @@ -1018,11 +1008,11 @@ msgstr "کاتالان" msgid "Center" msgstr "مرکز" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "تعویض" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "تعویض &دیسک..." @@ -1030,11 +1020,11 @@ msgstr "تعویض &دیسک..." msgid "Change Disc" msgstr "تعویض دیسک" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "تعویض بازی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1050,12 +1040,12 @@ msgstr "تغییرات علامت به پارامتر z دور (بعد از تص msgid "Changes sign to zNear Parameter (after correction)" msgstr "تغییرات علامت به پارامتر z نزدیک (بعد از تصحیح)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "تغییر دادن این مورد در حالی Ú©Ù‡ برابرساز در حال اجراست اثری نخواهد داشت!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Ú¯Ù¾ زدن" @@ -1063,47 +1053,47 @@ msgstr "Ú¯Ù¾ زدن" msgid "Cheat Code" msgstr "کد تقلب" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "جستجوی کد تقلب" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "مدیر کدهای تقلب" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "برسی عدم نقص پارتیشن" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "برسی عدم نقص..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "چینی (ساده شده)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "چینی (سنتی)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "انتخاب یک پوشه ریشه برای دی ÙˆÛŒ دی:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "انتخاب یک پوشه ریشه برای نند:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "انتخاب آیزو پیش Ùرض:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "انتخاب پوشه برای اضاÙÙ‡ کردن" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "انتخاب Ùایل برای باز کردن" @@ -1111,7 +1101,7 @@ msgstr "انتخاب Ùایل برای باز کردن" msgid "Choose a memory card:" msgstr "انتخاب کارت حاÙظه:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1119,8 +1109,8 @@ msgstr "" "انتخاب Ùایل برای استÙاده بعنوان بارگذار برنامه: (به دیسک هایی Ú©Ù‡ Ùقط از پوشه " "ها ساخته شده اند اعمال Ù…ÛŒ کند)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "انتخاب پوشه برای استخراج به آن" @@ -1139,7 +1129,7 @@ msgstr "کلاسیک" msgid "Clear" msgstr "پاک کردن" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1149,7 +1139,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "بستن" @@ -1158,11 +1148,11 @@ msgstr "بستن" msgid "Co&nfigure..." msgstr "Ù¾ÛŒ&کربندی..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "مشخصات کد" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "کد:" @@ -1174,24 +1164,24 @@ msgstr "دستور" msgid "Comment" msgstr "توضیح" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "توضیح:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Ùشرده کردن آیزو..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Ùشرده کردن آیزو های انتخاب شده..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "در حال Ùشرده کردن آیزو" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "پیکربندی" @@ -1205,18 +1195,18 @@ msgstr "پیکربندی" msgid "Configure Control" msgstr "کنترل پیکربندی" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "پیکربندی گیم پدها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "پیکربندی..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "تائید بازنویسی Ùایل" @@ -1229,17 +1219,16 @@ msgstr "تائید برای توقÙ" msgid "Connect" msgstr "اتصال" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "اتصال کیبورد USB" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "اتصال کیبورد USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "اتصال ویموت %i" @@ -1260,7 +1249,7 @@ msgstr "اتصال ویموت Û³" msgid "Connect Wiimote 4" msgstr "اتصال ویموت Û´" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "در حال اتصال..." @@ -1280,7 +1269,7 @@ msgstr "کنترل" msgid "Convert to GCI" msgstr "تبدیل به جی سی Ø¢ÛŒ" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Ú©Ù¾ÛŒ با شکست مواجه شد" @@ -1289,21 +1278,16 @@ msgstr "Ú©Ù¾ÛŒ با شکست مواجه شد" msgid "Copy to Memcard %c" msgstr "Ú©Ù¾ÛŒ به کارت حاÙظه %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "هسته" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "قادر به ساخت نیست %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "قادر به نصب پشتوانه نیست %s" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1314,25 +1298,16 @@ msgstr "" "نیست. لطÙا توجه داشته باشید Ú©Ù‡ دیسک های اصلی گیم کیوب/ÙˆÛŒ توسط اکثر دی ÙˆÛŒ دی " "درایوهای کامپیوتر قابل خواندن نیستند." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "قادر به تشخیص Ùایل آیزو %s نبود" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "قادر به ذخیره کردن نیست %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"قادر به ست کردن گیم پدها نیست. بازی Ú©Ù† بازی را ترک کرده Ùˆ یا بازی در حال " -"اجرا است!\n" -"(ست کردن گیم پدها در حالی Ú©Ù‡ بازی در حال اجرا است Ùعلا پشتیبانی نمی شود)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1346,11 +1321,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "قادر به یاÙتن دستور باز برای پسوند 'ini' نیست!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1358,17 +1333,17 @@ msgstr "" "قادر به اينيت کردن هسته نیست.\n" "تنظیمات خود را Ú†Ú© کنید." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "شماردن:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "کشور:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "ساخت کد اکشن ریپلی" @@ -1403,12 +1378,12 @@ msgstr "" msgid "Crossfade" msgstr "ضرب دری" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Ù‡Ú© کردن دستی تصویر" @@ -1416,11 +1391,11 @@ msgstr "Ù‡Ú© کردن دستی تصویر" msgid "Custom Projection Hack Settings" msgstr "تنظیمات مربوط به Ù‡Ú© کردن دستی تصویر" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "دستکاری برخی از پارامتر های خطوط عمودی تصویر." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "چکوسلواکی" @@ -1432,36 +1407,36 @@ msgstr "D" msgid "D-Pad" msgstr "پد هدایتی" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "پردازشگر صدای دلÙین" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "موتور برابرساز پردازشگر صدای دلÙین" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "برابرسازی سطح بالای پردازشگر صدای دلÙین (سریع)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Ù…Ùسر سطح پائین پردازشگر صدای دلÙین (کند)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "ری کامپایلر سطح پائین پردازشگر صدای دلÙین" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "تنظیمات پردازشگر صدای دلÙین" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "ریشه دی ÙˆÛŒ دی:" @@ -1476,15 +1451,15 @@ msgstr "" "خواندن سطح پائین کد گشایی شده دی ÙˆÛŒ دی - خطای مهلک: خواندن از روی دیسک با " "شکست مواجه شد" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "اندازه داده" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "تاریخ:" @@ -1513,29 +1488,28 @@ msgstr "اشکال زدائی کردن" msgid "Decimal" msgstr "دسیمال" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ناهمÙشرده کردن آیزو..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "ناهمÙشرده کردن آیزو های انتخاب شده..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "در حال ناهمÙشرده کردن آیزو" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "به روز کردن لیست بازی" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "پیش Ùرز" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "آیزو پیش Ùرز:" @@ -1579,8 +1553,8 @@ msgstr "" msgid "Device" msgstr "دستگاه" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "تنظیمات دستگاه" @@ -1588,15 +1562,12 @@ msgstr "تنظیمات دستگاه" msgid "Dial" msgstr "شماره گیری" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D Û±Û±" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D Û¹" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1649,19 +1620,14 @@ msgstr "" "اگر در این مورد اطمینان ندارید، این گزینه را رها کنید." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"از قلم انداختن مقصد آلÙا پاس در بسیاری از بازی ها برای اÙکت های متÙرقه " -"گراÙیک استÙاده Ù…ÛŒ شود.\n" -"\n" -"اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "دیسک" @@ -1688,24 +1654,59 @@ msgstr "" msgid "Divide" msgstr "تقسیم" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "آیا Ù…ÛŒ خواهید برابرسازی Ùعلی را متوق٠کنید؟" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "کدبردار دالبی پرو لاجیک دو" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "دلÙین" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "دلÙین %s پیکربندی گراÙیک" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "&وب سایت دلÙین" @@ -1721,12 +1722,12 @@ msgstr "پیکربندی ویمیوت برابرسازی شده دلÙین" msgid "Dolphin FIFO" msgstr "دلÙین ÙÛŒÙÙˆ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "پیکربندی گیم پد گیم کیوب دلÙین" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Ùیلم های تاس دلÙین (*.dtm)" @@ -1734,11 +1735,11 @@ msgstr "Ùیلم های تاس دلÙین (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "پیکربندی ویموت دلÙین" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "دلÙین در &Ú¯ÙˆÚ¯Ù„ کد" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1746,7 +1747,7 @@ msgstr "" "دلÙین قادر به پیدا کردن آیزو های گیم کیوب/ÙˆÛŒ نیست. برای مرور Ùایل ها دو بار " "اینجا کلیک کنید..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1754,19 +1755,16 @@ msgstr "" "دلÙین در حال حاضر ست شده است Ú©Ù‡ همه بازی ها را مخÙÛŒ کند. برای نمایش بازی ها " "دو بار اینجا کلیک کنید..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "دلÙین نتوانست عمل خواسته شده را تکمیل کند." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Ùعال کردن دسترسی سریع به دیسک. این امر برای اجرای تعداد محدودی از بازی ها " -"لازم است. (ON=سریع، OFF=سازگار)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1786,11 +1784,11 @@ msgstr "%lu کد دانلود شد. (%lu عدد اضاÙÙ‡ شد)" msgid "Drums" msgstr "طبل ها" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "مصنوعی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "نسخه برداری صدا" @@ -1838,9 +1836,9 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "هلندی" @@ -1865,7 +1863,7 @@ msgstr "" "اندازی مجدد در این مرحله برای اینکه ویندوز درایور جدید را شناسایی کند لازم " "باشد." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "اروپا" @@ -1873,7 +1871,7 @@ msgstr "اروپا" msgid "Early Memory Updates" msgstr "به روز شدن های اولیه حاÙظه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "ویرایش" @@ -1881,7 +1879,7 @@ msgstr "ویرایش" msgid "Edit ActionReplay Code" msgstr "ویرایش کدهای اکشن ریپلی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "ویرایش پیکربندی" @@ -1889,12 +1887,12 @@ msgstr "ویرایش پیکربندی" msgid "Edit Patch" msgstr "ویرایش وصله" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "ویرایش چشم انداز جاری" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "ویرایش..." @@ -1906,7 +1904,7 @@ msgstr "اÙکت" msgid "Embedded Frame Buffer" msgstr "حاÙظه میانجی Ùریم جاساز شده" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "ریسمان شبیه ساز قبلا اجرا شده است" @@ -1945,7 +1943,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "ویموت برابرسازی شده" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "وضعیت برابرساز:" @@ -1969,15 +1967,15 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Ùعال کردن واقعه نگاری اکشن ریپلی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Ùعال کردن ادغام بلوک" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Ùعال کردن محاسبه حد جعبه" @@ -1989,7 +1987,7 @@ msgstr "Ùعال کردن حاÙظه ميانى" msgid "Enable Cheats" msgstr "Ùعال کردن کدهای تقلب" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Ùعال کردن پردازنده با دو هسته یا بیشتر" @@ -1997,7 +1995,7 @@ msgstr "Ùعال کردن پردازنده با دو هسته یا بیشتر" msgid "Enable Dual Core (speedup)" msgstr "Ùعال کردن پردازنده با دو هسته یا بیشتر (بالا بردن سرعت)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Ùعال کردن جهش بیکاری" @@ -2005,7 +2003,7 @@ msgstr "Ùعال کردن جهش بیکاری" msgid "Enable Idle Skipping (speedup)" msgstr "Ùعال کردن جهش بیکاری (بالا بردن سرعت)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Ùعال کردن واحد مدیریت حاÙظه" @@ -2013,7 +2011,7 @@ msgstr "Ùعال کردن واحد مدیریت حاÙظه" msgid "Enable Progressive Scan" msgstr "Ùعال کردن پويش تصاعدی (Progressive Scan)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Ùعال کردن اسکیرین سیور" @@ -2021,7 +2019,7 @@ msgstr "Ùعال کردن اسکیرین سیور" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Ùعال کردن صÙحه عریض" @@ -2043,7 +2041,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، حالت 1x را انتخاب کنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2079,7 +2077,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2087,11 +2085,11 @@ msgstr "" "برای بالا بردن سرعت بازی اÙسانه زلدا: شاهدخت سپیده دم این گزینه را Ùعال " "کنید. غیرÙعال برای هر بازی دیگر." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Ùعال کردن پروژه Ù‡Ú© دستی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2099,22 +2097,13 @@ msgstr "" "Ùعال کردن برابر سازی دالبی پرو لاجیک دو توسط خروجی Ùراگیر 5.1 (Surround). در " "OSX موجود نیست." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Ùعال کردن برابر سازی دالبی پرو لاجیک دو توسط خروجی Ùراگیر 5.1 (Surround). " "Ùقط پشتوانه اپن ای ال (OpenAL)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Ùعال کردن برابر سازی دالبی پرو لاجیک دو توسط خروجی Ùراگیر 5.1 (Surround). " -"Ùقط پشتوانه اپن ای ال (OpenAL). شاید تغییر نام soft_oal.dll به OpenAL32.dll " -"برای به کار انداختن این امکان احتیاج باشد." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2127,7 +2116,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2149,9 +2138,9 @@ msgstr "" msgid "End" msgstr "پایان" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "انگلیسی" @@ -2174,22 +2163,21 @@ msgstr "ورودی %d/%d" msgid "Entry 1/%d" msgstr "ورودی 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "همگن" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "خطا" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "بارگذاری زبان انتخاب شده با شکست مواجه شد. برگشت به زبان پیش Ùرض سیستم." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2216,7 +2204,6 @@ msgid "Euphoria" msgstr "خوشی" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "دستگذار استثناء - دسترسی Ùضای پایینی حاÙظه. %08llx%08llx" @@ -2225,16 +2212,20 @@ msgstr "دستگذار استثناء - دسترسی Ùضای پایینی حا msgid "Execute" msgstr "اجرا کردن" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "صادر کردن با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "صادر کردن Ùایل" @@ -2242,7 +2233,7 @@ msgstr "صادر کردن Ùایل" msgid "Export Recording" msgstr "صادر کردن ضبط" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "صادر کردن ضبط..." @@ -2250,7 +2241,7 @@ msgstr "صادر کردن ضبط..." msgid "Export Save" msgstr "صادر کردن ذخیره" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "صادر کردن Ùایل ذخیره ÙˆÛŒ (آزمایشی)" @@ -2258,15 +2249,15 @@ msgstr "صادر کردن Ùایل ذخیره ÙˆÛŒ (آزمایشی)" msgid "Export all saves" msgstr "صادر کردن همه ذخیره ها" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "صادر کردن با شکست مواجه شد، کوشش دوباره؟" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "صادر کردن ذخیره بعنوان..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "پسوند" @@ -2282,44 +2273,44 @@ msgstr "پارامتر اضاÙÛŒ" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "پارامترهای یدکی Ù…Ùید تنها برای \"Metroid Other M\"." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "استخراج همه Ùایل ها..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "استخراج بارگذار برنامه..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "استخراج دال..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "استخراج پوشه..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "استخراج Ùایل..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "استخراج پارتیشن..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "استخراج کردن %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "استخراج کردن همه Ùایل ها" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "استخراج کردن پوشه" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "استخراج کردن..." @@ -2331,15 +2322,15 @@ msgstr "بایت ÙÛŒÙÙˆ" msgid "FIFO Player" msgstr "پخش کننده ÙÛŒÙÙˆ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "Ùرانسه" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "اندازه ا٠اس تی:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "اتصال با شکست مواجه شد!" @@ -2347,11 +2338,15 @@ msgstr "اتصال با شکست مواجه شد!" msgid "Failed to download codes." msgstr "دانلود کدها با شکست مواجه شد." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "استخراج به %s با شکست مواجه شد!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2388,20 +2383,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "خواندن %s با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "خواندن banner.bin با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2412,7 +2407,7 @@ msgstr "" "امکان ناقص بودن کارت حاÙظه وجود دارد\n" "موقعیت Ùایل:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2420,7 +2415,7 @@ msgstr "" "خواندن صحیح بکاپ جدول تخصیص بلوک با شکست مواجه شد\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2428,17 +2423,17 @@ msgstr "" "خواندن صحیح جدول تخصیص بلوک با شکست مواجه شد\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "خواندن داده از Ùایل با شکست مواجه شد %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2446,7 +2441,7 @@ msgstr "" "خواندن صحیح بکاپ پوشه با شکست مواجه شد\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2454,11 +2449,11 @@ msgstr "" "خواندن صحیح پوشه با شکست مواجه شد\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2466,29 +2461,34 @@ msgstr "" "خواندن سرخط با شکست مواجه شد\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "خواندن Ø¢ÛŒ دی یگانه از ایمیج دیسک با شکست مواجه شد" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "نوشتن BT.DINF به SYSCONF با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "نوشتن bkhdr با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "نوشتن سرخط برای %s با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "نوشتن سرخط برای Ùایل %d با شکست مواجه شد" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "پارسی" @@ -2500,18 +2500,18 @@ msgstr "سریع" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "نسخه سریع واحد مدیریت حاÙظه. برای همه بازی ها عمل نمی کند." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" "همگاه سازی مجدد مهلک. خروج نمایش. (خطا در ویموت پخش: %u !=%u, بایت %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "پخش کننده ÙÛŒÙÙˆ" @@ -2535,7 +2535,7 @@ msgstr "" "Ùایل قادر به باز شدن نیست\n" "یا دارای پسوند معتبر نیست" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2548,20 +2548,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Ùایل به عنوان کارت حاÙظه شناخته نشده است" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Ùایل Ùشرده نیست" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "ورودی/خروجی Ùایل: حالت گشودن ناشناس : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Ùایل سیستم" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "نوع Ùایل 'ini' ناشناس است! باز نخواهد شد!" @@ -2622,7 +2622,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2632,7 +2632,7 @@ msgstr "" "این گزینه را رها کنید، حالت پیش Ùرض دلÙین NTSC-U Ù…ÛŒ باشد, دلÙین به طور " "خودکار این گزینه را برای بازی های ژاپنی Ùعال Ù…ÛŒ کند." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2653,6 +2653,11 @@ msgstr "" msgid "Found %d results for '" msgstr "پیدا کردن نتایج %d برای '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2694,9 +2699,9 @@ msgstr "Ùریم ها برای ضبط شدن" msgid "Free Look" msgstr "نگاه آزاد" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Ùرانسوی" @@ -2709,7 +2714,7 @@ msgstr "تحریک" msgid "From" msgstr "از" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "تمام صÙحه" @@ -2721,7 +2726,7 @@ msgstr "وضوح حالت تمام صÙحه:" msgid "GCI File(*.gci)" msgstr "Ùایل جی سی Ø¢ÛŒ(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "گیم پد گیم کیوب" @@ -2729,27 +2734,27 @@ msgstr "گیم پد گیم کیوب" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Ø¢ÛŒ دی بازی:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "بازی قبلا اجرا شده است!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "بازی اجرا نشده است!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "تنظیمات مشخصات بازی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "پیکربندی بازی" @@ -2766,20 +2771,20 @@ msgid "Gamecube &Pad Settings" msgstr "تنظیمات &دسته گیم کیوب" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "کارت های حاÙظه گیم کیوب (*.raw.*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "تنظیمات دسته گیم کیوب" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "کدهای گیکو" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2802,26 +2807,26 @@ msgstr "Ú©Ù„ÛŒ" msgid "General Settings" msgstr "تنظیمات جامع" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "آلمانی" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "گرÙتن کد اکشن ریپلی: Ùهرست بزرگتر از سایز لیست است %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "گراÙیک" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "تنظیمات گراÙیک" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "بزرگتر از" @@ -2842,7 +2847,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را رها کنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "یونانی" @@ -2866,11 +2871,11 @@ msgstr "گیتار" msgid "Hacks" msgstr "Ù‡Ú©" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Ú†Ú© کردن سر خط برای یاÙتن خطا با شکست مواجه شد" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "عبری" @@ -2882,7 +2887,7 @@ msgstr "ارتÙاع" msgid "Help" msgstr "Ú©Ù…Ú©" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2894,7 +2899,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2948,7 +2953,7 @@ msgstr "پیکربندی شرت کات" msgid "Hotkeys" msgstr "شرت کاتها" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "مجارستانی" @@ -2956,30 +2961,30 @@ msgstr "مجارستانی" msgid "Hybrid Wiimote" msgstr "ویموت مخلوط" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: آزمایش برای گرÙتن داده از یک بلیط ناشناخته: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - مقصد ناصحیح" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "تنظیمات Ø¢ÛŒ Ù¾ÛŒ ال" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "Ùروسرخ" @@ -2991,15 +2996,15 @@ msgstr "اشاره گر Ùروسرخ" msgid "IR Sensitivity:" msgstr "میزان حساسیت Ùروسرخ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "جزئیات آیزو" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "پوشه های آیزو" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ایتالیا" @@ -3007,7 +3012,7 @@ msgstr "ایتالیا" msgid "Icon" msgstr "تندیس" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3051,9 +3056,13 @@ msgstr "" msgid "Import Save" msgstr "وارد کردن ذخیره" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "وارد کردن با شکست مواجه شد، سعی دوباره؟" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3075,21 +3084,16 @@ msgstr "" "پسوند Ùایل وارد شده اس ای ÙˆÛŒ Ù…ÛŒ باشد\n" "اما دارای سرخط صحیح نمی باشد" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "در بازی" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "در بازی" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "حد Ùریم:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "مشخصات" @@ -3109,7 +3113,7 @@ msgstr "درج" msgid "Insert Encrypted or Decrypted code here..." msgstr "درج کد رمز شده Ùˆ یا کش٠شده..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "درج کارت اس دی" @@ -3117,38 +3121,39 @@ msgstr "درج کارت اس دی" msgid "Insert name here.." msgstr "درج اسم..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "نصب واد" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "نصب به Ùهرست انتخاب ÙˆÛŒ" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "نصب دستگذار استثناء Ùراخوانده شد، اما این پلتÙورم هنوز از این امکان پشتیبانی " "نمی کند." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "در حال نصب واد..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "خطای بررسی درست بودن" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "بررسی درست بودن به پایان رسید" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "بررسی درست بودن به پایان رسید. خطایی پیدا نشد." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3161,7 +3166,7 @@ msgstr "" msgid "Interface" msgstr "واسط گراÙیک" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "تنظیمات واسط گراÙیک" @@ -3186,20 +3191,20 @@ msgstr "خطای داخلی LZO - lzo_init() با شکست مواجه شد" msgid "Internal Resolution:" msgstr "وضوح داخلی:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "صÙحه نخست" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "سایز نا معتبر (%x) یا کلمه جادو (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "مقدار نامعتبر!" @@ -3207,16 +3212,16 @@ msgstr "مقدار نامعتبر!" msgid "Invalid bat.map or dir entry" msgstr "bat.map نامعتبر یا ورودی پوشه" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "نوع واقعه نامعتبر %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ùایل نامعتبر" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3227,7 +3232,7 @@ msgstr "" "%s\n" "شاید لازم باشد شما مجدد از این بازی نسخه برداری کنید." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ùایل ضبط نامعتبر" @@ -3243,34 +3248,36 @@ msgstr "رشته جستجوی نامعتبر (قادر به تبدیل به عد msgid "Invalid search string (only even string lengths supported)" msgstr "رشته جستجوی نامعتبر (Ùقط رشته های با طول زوج پشتیبانی Ù…ÛŒ شود)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "وضعیت نامعتبر" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "ایتالیایی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "ژاپن" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "ژاپنی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "کره" @@ -3292,8 +3299,9 @@ msgstr "بر راس Ù†Ú¯Ù‡ داشتن پنجره" msgid "Key" msgstr "کلید" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "کره ای" @@ -3315,12 +3323,12 @@ msgstr "ال آنالوگ" msgid "Language:" msgstr "زبان:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "زمان بيکارى:" @@ -3359,7 +3367,7 @@ msgstr "" "کلیک Ú†Ù¾/راست برای گزینه های بیشتر.\n" "کلیک وسط برای پاک کردن." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "کمتر از" @@ -3376,58 +3384,48 @@ msgid "Load Custom Textures" msgstr "بارگذاری باÙت اشیاء دلخواه" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&بارگذاری وضعیت" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "بارگذاری وضعیت - شکا٠۱" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "بارگذاری وضعیت - شکا٠۲" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "بارگذاری وضعیت - شکا٠۳" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "بارگذاری وضعیت - شکا٠۴" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "بارگذاری وضعیت - شکا٠۵" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "بارگذاری وضعیت - شکا٠۶" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "بارگذاری وضعیت - شکا٠۷" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "بارگذاری وضعیت - شکا٠۸" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "بارگذاری وضعیت - شکا٠۱" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "بارگذاری وضعیت - شکا٠۱" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3458,19 +3456,18 @@ msgid "Load State Slot 8" msgstr "بارگذاری وضعیت - شکا٠۸" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "بارگذاری وضعیت - شکا٠۱" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "بارگذاری وضعیت..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "بارگذاری منوی سیستم ÙˆÛŒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "بارگذاری منوی سیستم ÙˆÛŒ %d%c" @@ -3489,10 +3486,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "بارگذاری مقدار های از پیش تنظیم شده از الگوهای Ù‡Ú© موجود است." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "محلی" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "ثبت وقایع" @@ -3525,12 +3518,12 @@ msgstr "" msgid "Logger Outputs" msgstr "خروجی های واقعه نگار" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "واقعه نگاری" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "ارتباط با سرور قطع شد!" @@ -3538,7 +3531,7 @@ msgstr "ارتباط با سرور قطع شد!" msgid "M Button" msgstr "دکمه ام" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3547,7 +3540,7 @@ msgstr "" "Ú†Ú© سام MD5 ناهمسان است\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Ù‡Ú© کردن سرعت واحد مدیریت حاÙظه" @@ -3561,11 +3554,11 @@ msgstr "Ùایل های گیم شارک مد کتذ (*.gcs)" msgid "Main Stick" msgstr "استیک اصلی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Ø¢ÛŒ دی سازنده" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "سازنده" @@ -3596,7 +3589,7 @@ msgid "Memory Byte" msgstr "بایت حاÙظه" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "کارت حاÙظه" @@ -3608,7 +3601,7 @@ msgstr "" "اخطار: قبل از استÙاده از کارت حاÙظه بک آپ بگیرید، شاید درست شود اما اطلاعات " "از بین خواهد رÙت!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3625,7 +3618,7 @@ msgstr "" "%s\n" "آیا مایل هستید Ùایل قبلی را به مکان جدید Ú©Ù¾ÛŒ کنید؟\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "سایز کارت حاÙظه با سرخط تطابق ندارد" @@ -3633,7 +3626,7 @@ msgstr "سایز کارت حاÙظه با سرخط تطابق ندارد" msgid "Menu" msgstr "Ùهرست انتخاب" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "میکروÙÙ†" @@ -3646,7 +3639,7 @@ msgstr "حداقل" msgid "Misc" msgstr "متÙرقه" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "تنظیمات متÙرقه" @@ -3671,11 +3664,11 @@ msgstr "" msgid "Monospaced font" msgstr "Ùونت هم عرض" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "موشن پلاس" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "موتور" @@ -3795,15 +3788,15 @@ msgstr "تب ان Ù¾ÛŒ" msgid "NP Up" msgstr "بالا ان Ù¾ÛŒ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "اسم:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "اسم:" @@ -3813,7 +3806,7 @@ msgstr "اسم:" msgid "Native GCI files(*.gci)" msgstr "Ùایل های جی سی Ø¢ÛŒ محلی(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "پویش جدید" @@ -3822,7 +3815,7 @@ msgstr "پویش جدید" msgid "Next Page" msgstr "صÙحه بعد" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "پویش بعدی" @@ -3830,11 +3823,11 @@ msgstr "پویش بعدی" msgid "Nickname :" msgstr "اسم مستعار :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "بدون کشور (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "هیچ آیزو یا وادی پیدا نشد" @@ -3842,7 +3835,7 @@ msgstr "هیچ آیزو یا وادی پیدا نشد" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Ùایل نشان برای عنوان %s پیدا نشد" @@ -3868,42 +3861,43 @@ msgstr "بدون مقادیر اطلاعاتی Ùهرست پوشه آزاد" msgid "No recorded file" msgstr "بدون Ùایل ضبط شده" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "پوشه Ùایل ذخیره برای عنوان %s پیدا نشد" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "هیچ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "بوکمال نروژی" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "برابر نیست" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "ست نشده است" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "متصل نشده است" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "یادداشت ها" @@ -3924,7 +3918,7 @@ msgstr "توجه" msgid "Num Lock" msgstr "Ù‚ÙÙ„ کلید نام لاک" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "تعداد کدها:" @@ -3945,7 +3939,7 @@ msgstr "شیی" msgid "Object Range" msgstr "محدوده شیی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "خاموش" @@ -3957,25 +3951,29 @@ msgstr "اÙست:" msgid "On-Screen Display Messages" msgstr "پیام های روی صÙحه نمایش" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Ùقط بلوک های %d موجود است" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "گشودن" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "باز کردن پوشه &شامل" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "باز کردن پوشه &ذخیره ÙˆÛŒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "گشودن Ùایل..." @@ -4001,7 +3999,13 @@ msgstr "کدبرداری باÙت اشیاء توسط OpenCL" msgid "OpenMP Texture Decoder" msgstr "کدبرداری باÙت اشیاء توسط OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "گزینه ها" @@ -4011,22 +4015,18 @@ msgid "Orange" msgstr "نارنجی" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"ترتیب Ùایل ها در پوشه Ùایل با ترتیب بلوک یکسان نیست\n" -"کلیک راست کنید Ùˆ تمام ذخیره ها را صادر کنید،\n" -"Ùˆ ذخیره ها را به کارت حاÙظه ای جدید وارد کنید\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "غیره" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4038,15 +4038,15 @@ msgstr "" msgid "Output" msgstr "خروجی" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "ض&بط کردن بازی..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "گیم پد" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "گیم پد" @@ -4070,17 +4070,17 @@ msgstr "پاراگراÙ" msgid "Parameters" msgstr "پارامترها" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "پارتیشن %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "وصله ها" @@ -4088,8 +4088,8 @@ msgstr "وصله ها" msgid "Paths" msgstr "مسیرها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Ù…Ú©Ø«" @@ -4102,7 +4102,7 @@ msgstr "Ù…Ú©Ø« در پایان Ùیلم" msgid "Per-Pixel Lighting" msgstr "نورپردازی به ازای هر پیکسل" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "کامل" @@ -4112,9 +4112,9 @@ msgid "Perspective %d" msgstr "چشم انداز %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "شروع بازی" @@ -4126,7 +4126,7 @@ msgstr "شروع ضبط" msgid "Play/Pause" msgstr "شروع بازی/Ù…Ú©Ø«" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "قابل بازی" @@ -4134,11 +4134,11 @@ msgstr "قابل بازی" msgid "Playback Options" msgstr "گزینه های بازنواخت" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "بازی کنان" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "لطÙا تایید کنید..." @@ -4150,23 +4150,23 @@ msgstr "لطÙا قبل از ذخیره کردن یک چشم انداز بساز msgid "Plus-Minus" msgstr "مینوس پلاس" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "لهستانی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "درگاه Û±" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "درگاه Û²" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "درگاه Û³" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "درگاه Û´" @@ -4175,11 +4175,11 @@ msgstr "درگاه Û´" msgid "Port :" msgstr "درگاه :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "پرتقالی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "پرتقالی (برزیلی)" @@ -4187,17 +4187,17 @@ msgstr "پرتقالی (برزیلی)" msgid "Post-Processing Effect:" msgstr "اÙکت ها:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "پایان نابهنگام Ùیلم در کنترل کننده پخش. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "پایان نابهنگام Ùیلم در ویموت پخش. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "پایان نابهنگام Ùیلم در ویموت پخش. %u > %u" @@ -4214,7 +4214,7 @@ msgstr "صÙحه قبلی" msgid "Previous Page" msgstr "صÙحه قبلی" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "مقدار قبلی" @@ -4230,7 +4230,7 @@ msgstr "پروÙایل" msgid "Properties" msgstr "خواص" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "پاکسازی حاÙظه ميانى" @@ -4239,7 +4239,7 @@ msgid "Question" msgstr "سوال" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "خارج شدن" @@ -4261,7 +4261,7 @@ msgstr "آر آنالوگ" msgid "RAM" msgstr "حاÙطه رم" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "روسیه" @@ -4300,6 +4300,10 @@ msgstr "ویموت های واقعی" msgid "Record" msgstr "ضبط" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "اطلاعات ضبط" @@ -4336,7 +4340,7 @@ msgstr "" "اگر در این مورد اطمینان ندارید، \"هیچ\" را انتخاب کنید." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "به روز کردن" @@ -4345,14 +4349,14 @@ msgstr "به روز کردن" msgid "Refresh List" msgstr "به روز کردن لیست" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "به روز کردن لیست بازی" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "پاک کردن" @@ -4375,7 +4379,7 @@ msgstr "نمایش در پنجره اصلی" msgid "Reset" msgstr "شروع دوباره" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "نتایج" @@ -4383,7 +4387,7 @@ msgstr "نتایج" msgid "Return" msgstr "برگشت" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4396,18 +4400,17 @@ msgstr "راست" msgid "Right Stick" msgstr "استیک راست" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "شوک" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "روسی" @@ -4420,7 +4423,7 @@ msgid "Safe" msgstr "بی خطر" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "ذخیره" @@ -4430,23 +4433,20 @@ msgid "Save GCI as..." msgstr "ذخیره جی سی Ø¢ÛŒ بعنوان..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "ذخ&یره وضعیت" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "ذخ&یره وضعیت" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "ذخیره وضعیت - شکا٠۱" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "ذخیره وضعیت - شکا٠۱" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4477,32 +4477,31 @@ msgid "Save State Slot 8" msgstr "ذخیره وضعیت - شکا٠۸" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "ذخیره وضعیت - شکا٠۱" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "ذخیره وضعیت..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "ذخیره بعنوان..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "ذخیره جی سی ام/آیزو Ùشرده شده" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "دخیره چشم انداز Ùعلی" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "ذخیره جی سی ام/آیزو ناهمÙشرده شده" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "ذخیره وضعیت Ùیلم %s خراب است، ضبط Ùیلم میایستد..." @@ -4511,20 +4510,20 @@ msgstr "ذخیره وضعیت Ùیلم %s خراب است، ضبط Ùیلم Ù…ÛŒ msgid "Scaled EFB Copy" msgstr "Ú©Ù¾ÛŒ ای ا٠بی تغییر سایز یاÙته" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "در حال پویش %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "پویش برای Ùایل های آیزو" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "در حال پویش..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "عکس Ùوری" @@ -4536,11 +4535,11 @@ msgstr "اسکرول لاک" msgid "Search" msgstr "جستجو" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Ùیلتر جستجو" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "جستجوی پوشه های Ùرعی" @@ -4563,12 +4562,12 @@ msgstr "بخش %s در SYSCONF پیدا نشد" msgid "Select" msgstr "انتخاب" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "انتخاب Ùایل ضبط شده" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "انتخاب Ùایل ÙˆÛŒ واد برای نصب" @@ -4590,19 +4589,19 @@ msgstr "یک Ùایل ذخیره برای وارد کردن انتخاب Ú©Ù†ÛŒ msgid "Select floating windows" msgstr "انتخاب پنجره های شناور" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "انتخاب Ùایل برای بارگذاری" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "انتخاب Ùایل ذخیره" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "انتخاب وضعیت برای بارگذاری" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "انتخاب وضعیت برای ذخیره" @@ -4625,7 +4624,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، اتوماتیک را انتخاب کنید." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "پروÙایل انتخاب شده وجود ندارد" @@ -4650,27 +4649,28 @@ msgstr "" "اگر همچنان اطمینان ندارید، از بالاترین وضوحی Ú©Ù‡ برای شما کار Ù…ÛŒ کند استÙاده " "کنید." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Ùرستادن" @@ -4682,18 +4682,18 @@ msgstr "موقعیت سنسور بار:" msgid "Separator" msgstr "جدا کننده" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "صربستانی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "درگاه سریال Û± - این درگاهی است Ú©Ù‡ دستگاه هایی مانند آداپتور شبکه از آن " "استÙاده Ù…ÛŒ کنند" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "ست کردن بعنوان آیزو &پیش Ùرض" @@ -4702,7 +4702,7 @@ msgstr "ست کردن بعنوان آیزو &پیش Ùرض" msgid "Set as default Memcard %c" msgstr "ست کردن بعنوان کارت حاÙظه پیش Ùرض %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4717,19 +4717,19 @@ msgstr "" "ست کردن زمان بيکارى (بر حسب میلی ثانیه). مقادیر بالاتر این زمان Ù…ÛŒ تواند " "صدای ترق Ùˆ تروق را کاهش دهد. Ùقط پشتوانه اپن ای ال (OpenAL)." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "تنظیمات..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "برپاکردن حاÙظه ÙˆÛŒ: ناتوان در پیدا کردن Ùایل تنظیم" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "لرزش" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "اسم کوتاه:" @@ -4737,23 +4737,27 @@ msgstr "اسم کوتاه:" msgid "Shoulder Buttons" msgstr "دکمه های شانه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "نمایش &میز Ùرمان" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "نمایش &ثبت وقایع" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "نمایش نوار &وضعیت" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "نمایش نوار &ابزار" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "نمایش درایوها" @@ -4765,11 +4769,11 @@ msgstr "نمایش مناطق Ú©Ù¾ÛŒ ای ا٠بی" msgid "Show FPS" msgstr "نمایش Ùریم بر ثانیه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "نمایش Ùرانسه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "نمایش گیم کیوب" @@ -4777,35 +4781,35 @@ msgstr "نمایش گیم کیوب" msgid "Show Input Display" msgstr "نمایش ورودی تصویر" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "نمایش ایتالیا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "نمایش ژاپن" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "نمایش کره" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "نمایش زبان:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "نمایش &پیکربندی ثبت وقایع" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "نمایش پال" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "نمایش پایگاه ها" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "نمایش مناطق" @@ -4813,27 +4817,27 @@ msgstr "نمایش مناطق" msgid "Show Statistics" msgstr "نمایش آمار" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "نمایش تایوان" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "نمایش ایالات متحده آمریکا" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "نمایش واد" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "نمایش ÙˆÛŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "نمایش پنجره تایید قبل از متوق٠کردن بازی." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4852,7 +4856,7 @@ msgstr "نمایش بلوک اول" msgid "Show lag counter" msgstr "نمایش شمارنده تاخیر" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4889,7 +4893,7 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "نمایش ناشناخته" @@ -4903,23 +4907,24 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "ویموت Ùرعی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "چینی ساده شده" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "سایز" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "جهش از روی بایوس" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "از قلم انداختن پاکسازی DCBZ" @@ -4944,17 +4949,17 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "شکا٠%i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "شکا٠ای" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "شکا٠بی" @@ -4962,7 +4967,7 @@ msgstr "شکا٠بی" msgid "Snapshot" msgstr "عکس Ùوری" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "ارائه دهنده نرم اÙزاری" @@ -4979,27 +4984,27 @@ msgstr "" "آیا شما واقعا قصد Ùعال کردن این گزینه را دارید؟ اگر در این مورد اطمینان " "ندارید، 'نه' را انتخاب کنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "تنظیمات صدا" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "پشتوانه صدا %s معتبر نیست." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "ایجاد حاÙظه میانجی صدا با شکست مواجه شد: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Ùضا" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "اسپانیایی" @@ -5026,37 +5031,29 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه \"Û¶Û´Û°xÛµÛ²Û¸\" را انتخاب کنید." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "بالا بردن نرخ نقل Ùˆ انتقال دادهای دیسک" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "استیک مربع" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "کنترولر استاندارد" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "شروع" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "شروع &نت پلی" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "شروع &ضبط" @@ -5064,7 +5061,7 @@ msgstr "شروع &ضبط" msgid "Start Recording" msgstr "شروع ضبط" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "وضعیت" @@ -5072,7 +5069,7 @@ msgstr "وضعیت" msgid "State Saves" msgstr "ذخیره های وضعیت" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "چرخ Ùرمان" @@ -5081,7 +5078,7 @@ msgid "Stick" msgstr "استیک" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "توقÙ" @@ -5112,39 +5109,40 @@ msgstr "مرتعش کردن" msgid "Subtract" msgstr "کاستن" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "صادر کردن Ùایل به %s با موÙقیت انجام شد" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Ùایل های ذخیره با موÙقیت وارد شدند" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "نوسان" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "زبان سیستم:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "تایوان" @@ -5169,13 +5167,13 @@ msgstr "جدول Ú†Ù¾" msgid "Table Right" msgstr "جدول راست" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "گرÙتن عکس Ùوری" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "تارو کونگا (بنگوس)" @@ -5195,11 +5193,11 @@ msgstr "حاÙظه ميانى باÙت اشیاء" msgid "Texture Format Overlay" msgstr "قالب بندی باÙت اشیاء" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "واد با موÙقیت نصب شد" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "آدرس بی اعتبار است" @@ -5207,13 +5205,13 @@ msgstr "آدرس بی اعتبار است" msgid "The checksum was successfully fixed" msgstr "Ú†Ú© سام با موÙقیت درست شد" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "پوشه برگزیده قبلا در لیست بوده است" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5236,7 +5234,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Ùایل %s قبلا باز بود، سرخط Ùایل نوشته نخواهد شد." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Ùایلی Ú©Ù‡ شما مشخص (%s) کرده اید وجود ندارد" @@ -5269,43 +5267,43 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "سایز Ùایل ذخیره ای Ú©Ù‡ سعی در Ú©Ù¾ÛŒ کردن آن دارید بی اعتبار است" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" "زبان انتخاب شده توسط سیستم شما پشتیبانی نمی شود. برگشت به زبان پیش Ùرض سیستم." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "نسخه سرور Ùˆ نت پلی مشتری نا سازگار است!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "سرور پر شده است!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "سرور پاسخ داد: بازی در حال اجراست!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "سرور یک پیغام خطای ناشناخته Ùرستاد!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Ùایل مشخص شده \"%s\" وجود ندارد" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "مقدار بی اعتبار است" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "تم:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5313,7 +5311,7 @@ msgstr "" "باید بلیطی برای Û°Û°Û°Û°Û°Û°Û°Û±/Û°Û°Û°Û°Û°Û°Û°Û² وجود داشته باشد. نسخه برداری نند شما " "احتمالا ناقص است." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5321,7 +5319,7 @@ msgstr "" "این تنظیمات تنظیمات هسته دلÙین را خنثی Ù…ÛŒ کند.\n" "نامعین یعنی بازی از تنظیمات دلÙین استÙاده Ù…ÛŒ کند." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5329,7 +5327,7 @@ msgstr "" "این شبیه ساز اکشن ریپلی از کدهایی Ú©Ù‡ توسط خود اکشن ریپلی پیراسته شده باشد " "پشتیبانی نمی کند." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "این مورد میتواند سبب کند شدن منوی ÙˆÛŒ Ùˆ تعدادی از بازی ها شود." @@ -5353,19 +5351,15 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"اگر شما حد Ùریم را بالاتر از سرعت کامل بازی تنظیم کنید (NTSC:Û¶Û°ØŒ PAL:ÛµÛ°). " -"استÙاده کنید از دریچه صدا با استÙاده از پردازشگر صدای دلÙین (شاید صدا های " -"تیک را درست کند اما همچنین Ù…ÛŒ تواند موجب نویز ثابت بسته به بازی شود)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5377,7 +5371,7 @@ msgstr "" "سبب اÙزایش چشم گیر سرعت روی کامپیوترهایی با بیش از یک هسته Ù…ÛŒ شود، اما " "همچنین Ù…ÛŒ تواند خرابی های گاه Ùˆ بی گاه را سبب شود." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "این مورد به شما اجازه خواهد داد تا Ùایل پیکربندی INI را ویرایش کنید" @@ -5386,12 +5380,12 @@ msgstr "این مورد به شما اجازه خواهد داد تا Ùایل msgid "Threshold" msgstr "سرحد" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "لرزیدن" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "عنوان" @@ -5405,21 +5399,18 @@ msgid "Toggle All Log Types" msgstr "تبدیل انواع ثبت وقایع" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "نسبت طول به عرض تصویر:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Ú©Ù¾ÛŒ های ای ا٠بی" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "تبدیل انواع ثبت وقایع" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "تبدیل حالت تمام صÙحه" @@ -5429,15 +5420,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "بالا" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "چینی سنتی" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "آزمایش برای بارگذاری Ùایل ناشناخته." @@ -5457,7 +5449,7 @@ msgstr "" "تلاش برای خواندن از SYSCONF نامعتبر\n" "Ø¢ÛŒ دی های بلوتوث ویموت موجود نیست" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "ترکی" @@ -5473,12 +5465,12 @@ msgstr "نوع" msgid "UDP Port:" msgstr "درگاه UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "ویموت UDP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ناشناخته" @@ -5487,7 +5479,7 @@ msgstr "ناشناخته" msgid "UNKNOWN_%02X" msgstr "ناشناخته_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "ایالات متحده آمریکا" @@ -5500,9 +5492,9 @@ msgstr "" "ورودی اصلاح نشد." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5510,7 +5502,7 @@ msgstr "" "معتبر. وارسی کنید Ú©Ù‡ کد را درست وارد کرده باشید.\n" "آیا مایل هستید Ú©Ù‡ این خط را نادیده بگیرید Ùˆ به تجزیه ادامه دهید؟" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "تعری٠نشده %i" @@ -5520,19 +5512,18 @@ msgid "Undo Load State" msgstr "خنثی کردن وضعیت بارگذاری" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "خنثی کردن وضعیت بارگذاری" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Ùرمان 0x80 غیرمنتظره؟ برنامه در حال اجرا متوق٠می شود..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "ناشناخته" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "دستور دی ÙˆÛŒ دی ناشناخته %08x - خطای مهلک" @@ -5547,12 +5538,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "نوع ورودی ناشناخته %i در SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "پیام ناشناخته با Ø¢ÛŒ دی %d دریاÙت شد" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "پیام ناشناخته با Ø¢ÛŒ دی:%d از بازیکن:%d بیرون انداختن بازیکن!" @@ -5562,16 +5553,16 @@ msgstr "پیام ناشناخته با Ø¢ÛŒ دی:%d از بازیکن:%d بیر msgid "Up" msgstr "بالا" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "به روز کردن" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "ویموت عمودی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "استÙاده از حالت پال Û¶Û° هرتز (PAL60)" @@ -5579,7 +5570,7 @@ msgstr "استÙاده از حالت پال Û¶Û° هرتز (PAL60)" msgid "Use Fullscreen" msgstr "استÙاده از حالت تمام صÙحه" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "استÙاده از حالت شانزده شانزدهی" @@ -5608,6 +5599,15 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5630,12 +5630,11 @@ msgstr "کاربردی" msgid "V-Sync" msgstr "هماهنگ کردن Ùرکانس عمودی بازی با صÙحه نمایش" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Ù‡Ú© کردن سرعت واحد مدیریت حاÙظه" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "مقدار" @@ -5643,7 +5642,7 @@ msgstr "مقدار" msgid "Value:" msgstr "مقدار:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "مقدار:" @@ -5655,7 +5654,7 @@ msgstr "دراز نویسی" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "ویدیو" @@ -5663,17 +5662,17 @@ msgstr "ویدیو" msgid "Virtual" msgstr "مجازی" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "حجم صدا" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "نصب واد با شکست مواجه شد: خطای ایجاد %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "نصب واد با شکست مواجه شد: خطای ایجاد بلیط" @@ -5694,19 +5693,19 @@ msgstr "" msgid "Warning" msgstr "اخطار" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "اخطار - شروع دال در حالت کنسول اشتباه!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "اخطار - شروع ای ال ا٠در حالت کنسول اشتباه!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "اخطار - شروع آیزو در حالت کنسول اشتباه!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5730,7 +5729,7 @@ msgstr "" "Ùˆ داشتن اسم یکسان مانند یک Ùایل در کارت حاÙظه شما\n" "ادامه Ù…ÛŒ دهید؟" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5742,7 +5741,7 @@ msgstr "" "دیگری را بارگذاری کنید، یا این وضعیت را با حالت Ùقط خواندنی خاموش بارگذاری " "کنید." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5753,7 +5752,7 @@ msgstr "" "ندارد. قبل از ادامه شما باید ذخیره دیگری را بارگذاری کنید، یا این وضعیت را " "با حالت Ùقط خواندنی خاموش بارگذاری کنید. وگرنه شاید شما دچار نا همزمانی شوید." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5807,19 +5806,15 @@ msgstr "عرض" msgid "Wii" msgstr "ÙˆÛŒ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "میز Ùرمان ÙˆÛŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "ریشه ÙˆÛŒ نند:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "وارد کردن Ùایل ذخیره ÙˆÛŒ" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Ùایل های ذخیره ÙˆÛŒ (*.bin)|*.bin" @@ -5828,16 +5823,22 @@ msgid "WiiWAD: Could not read from file" msgstr "ÙˆÛŒ واد: ناتوان در خواندن از Ùایل" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "ویموت" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "ویموت" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "ویموت %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "ویموت متصل شد" @@ -5845,7 +5846,7 @@ msgstr "ویموت متصل شد" msgid "Wiimote Motor" msgstr "موتور ویموت" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "تنظیمات ویموت" @@ -5869,14 +5870,14 @@ msgstr "پنجره ها راست" msgid "Word Wrap" msgstr "پیچیدن کلمه" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "در حال کار..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5896,21 +5897,36 @@ msgstr "نوشتن به Ùایل" msgid "Write to Window" msgstr "نوشتن در پنجره" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "صدای اکس Û² (XAdudio2) - ساخت آوای منبع با شکست مواجه شد: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "صدای اکس Û² (XAdudio2) - اينيت با شکست مواجه شد: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "صدای اکس Û² (XAdudio2) - ساخت آوای مستر منبع با شکست مواجه شد: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "صدای اکس Û² (XAdudio2) - ساخت آوای منبع با شکست مواجه شد: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "صدای اکس Û² (XAdudio2) - اينيت با شکست مواجه شد: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "صدای اکس Û² (XAdudio2) - ساخت آوای مستر منبع با شکست مواجه شد: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "ثبت اکس اÙ" @@ -5940,11 +5956,11 @@ msgstr "شما نمی توانید قطعاتی Ú©Ù‡ حاوی صÙحات Ù…ÛŒ ب msgid "You must choose a game!!" msgstr "شما باید یک بازی انتخاب کنید!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "شما باید یک اسم وارد کنید!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "شما باید یک مقدار صحیح برای دسیمال، هگزادسیمال یا اکتال وارد کنید." @@ -5952,7 +5968,7 @@ msgstr "شما باید یک مقدار صحیح برای دسیمال، هگز msgid "You must enter a valid profile name." msgstr "شما باید یک اسم معتبر برای پروÙایل وارد کنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "برای اعمال تغییرات شما باید دلÙین را از نو اجرا کنید." @@ -5963,7 +5979,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5982,15 +5998,15 @@ msgstr "" "سایز Ùایل باید 0x%04x باشد (اما سایز این Ùایل 0x%04llx است)\n" "آیا میخواهید یک Ùایل جدید تولید شود؟" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "Ù‡Ú© اÙسانه زلدا: شاهدخت سپیده دم" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "کد صÙر Û³ پشتیبانی نمی شود" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "کد ناشناخته صÙر به دلÙین: %08x" @@ -6049,20 +6065,24 @@ msgstr "" "\n" "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "بارگذار برنامه (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "خطای iCacheJIT: خواندن شناسنده از %x. لطÙا گزارش دهید." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "خطای 1- wxExecute در اجرای برنامه!" @@ -6078,55 +6098,11 @@ msgstr "اصلاح z نزدیک:" msgid "| OR" msgstr "| یا" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "برابرسازی دقیق ÙˆÛŒ بیم" +#~ msgid "Could not create %s" +#~ msgstr "قادر به ساخت نیست %s" -#~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" -#~ "\n" -#~ "If unsure, leave this unchecked." -#~ msgstr "" -#~ "اجازه کنترل برخی گزینه ها توسط کلیدهای میانبر Û³ (وضوح داخلی)ØŒ Û´ (نسبت " -#~ "طول به عرض)ØŒ Ûµ (Ú©Ù¾ÛŒ ای ا٠بی) Ùˆ Û¶ (مه) در داخل پنجره برابرساز را میدهد.\n" -#~ "\n" -#~ "اگر در این مورد اطمینان ندارید، این گزینه را Ùعال نکنید." +#~ msgid "Direct3D11" +#~ msgstr "Direct3D Û±Û±" -#~ msgid "Enable Hotkeys" -#~ msgstr "Ùعال کردن شرت کاتها" - -#~ msgid "Failed to Listen!!" -#~ msgstr "پذیرÙتن با شکست مواجه شد!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "بارگذاری bthprops.cpl با شکست مواجه شد" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "بارگذاری hid.dll با شکست مواجه شد" - -#~ msgid "GCMic Configuration" -#~ msgstr "پیکربندی میکروÙÙ† گیم کیوب" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIY Ùرا خوانده شد، لطÙا گزارش دهید!" - -#~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "اگر تعداد Ùریم های نمایش داده شده بر ثانیه نامنظم است، شاید این گزینه به " -#~ "رÙع آن Ú©Ù…Ú© کند. (روشن = سازگار، خاموش = سریع)" - -#~ msgid "Last Overwritten State" -#~ msgstr "آخرین وضعیت بازنویسی شده" - -#~ msgid "Last Saved State" -#~ msgstr "آخرین وضعیت ذخیره شده" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "برقراری ارتباط مجدد ویموت در بارگذاری وضعیت" - -#~ msgid "Set" -#~ msgstr "ست" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "از قلم انداختن مقصد آلÙا پاس" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "خطای iCacheJIT: خواندن شناسنده از %x. لطÙا گزارش دهید." diff --git a/Languages/po/fr.po b/Languages/po/fr.po index 1d418cb143..6c54dd3989 100644 --- a/Languages/po/fr.po +++ b/Languages/po/fr.po @@ -4,13 +4,19 @@ # # Translators: # FRtranslator , 2013 +# FRtranslator , 2013 +# RyDroid , 2013 +# RyDroid , 2013 +# RyDroid , 2013 +# toadjaune , 2013 +# toadjaune , 2013 # Vinet Sebastien , 2011 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-18 10:41+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-12 20:17+0000\n" "Last-Translator: FRtranslator \n" "Language-Team: French (http://www.transifex.com/projects/p/dolphin-emu/" "language/fr/)\n" @@ -20,13 +26,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" -msgstr "(trop nombreux pour être affichés)" +msgstr " (trop nombreux pour être affichés)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Jeu :" @@ -34,7 +40,7 @@ msgstr "Jeu :" msgid "! NOT" msgstr "! NOT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +49,7 @@ msgstr "" "\"%s\" n'existe pas.\n" " Voulez-vous créer une nouvelle carte mémoire de 16MB ?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -59,28 +65,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sCopie%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d échantillons" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d échantillons (de qualité niveau %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s existe déjà. Voulez-vous le remplacer ?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s n'a pas pu être compressé. L'image est probablement corrompue." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -89,7 +95,7 @@ msgstr "" "%s n'a pu être lu en tant que carte mémoire.\n" " La taille du fichier de la carte n'est pas valide (0x%x octets)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -98,7 +104,7 @@ msgstr "" "%s n'a pu être lu en tant que carte mémoire.\n" " La taille de la carte n'est pas valide (0x%x octets)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -108,22 +114,27 @@ msgstr "" "Le fichier n'est pas assez grand pour être un fichier de carte mémoire " "valide (0x%x octets)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "Impossible d'ouvrir %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s a échoué: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s est un fichier de 0 octet" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s est déjà compressé. Impossible de le compresser d'avantage." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s est un nom de fichier trop long, le maximum est de 45 caractères." @@ -152,15 +163,15 @@ msgstr "%u blocs libres, %u entrées de rép. libres" msgid "&& AND" msgstr "&& AND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." -msgstr "&A propos..." +msgstr "&À propos..." #: Source/Core/DolphinWX/Src/FrameTools.cpp:100 msgid "&Boot from DVD Drive..." msgstr "&Démarrer à partir du lecteur..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Points d'arrêt" @@ -168,7 +179,7 @@ msgstr "&Points d'arrêt" msgid "&Browse for ISOs..." msgstr "&Rechercher des ISOs" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Gestionnaire de &cheats" @@ -176,27 +187,27 @@ msgstr "Gestionnaire de &cheats" msgid "&DSP Settings" msgstr "Paramètres &DSP (audio)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Supprimer l'ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Supprimer les ISO sélectionnés" #: Source/Core/DolphinWX/Src/FrameTools.cpp:172 msgid "&Emulation" -msgstr "&Emulation" +msgstr "&Émulation" #: Source/Core/DolphinWX/Src/FrameTools.cpp:114 msgid "&File" msgstr "&Fichier" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Avancement d'image" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Plein écran" @@ -204,7 +215,7 @@ msgstr "&Plein écran" msgid "&Graphics Settings" msgstr "Paramètres &Graphiques" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Aide" @@ -212,7 +223,7 @@ msgstr "&Aide" msgid "&Hotkey Settings" msgstr "Paramètres des &Raccouris clavier" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -224,11 +235,11 @@ msgstr "&Charger l'état" msgid "&Memcard Manager (GC)" msgstr "Gestionnaire de cartes &mémoires (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Mémoire" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Ouvrir..." @@ -236,51 +247,51 @@ msgstr "&Ouvrir..." msgid "&Options" msgstr "&Options" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pause" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Démarrer" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Propriétés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "Mode &Lecture seule" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "Rafraîchir la &liste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registres" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Son" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Stop" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Outils" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Vidéo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Affichage" @@ -288,7 +299,7 @@ msgstr "&Affichage" msgid "&Wiimote Settings" msgstr "Paramètres de la &Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -306,16 +317,15 @@ msgstr "(-)+zNear" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:86 msgid "(UNKNOWN)" -msgstr "Inconnu" +msgstr "(Inconnu)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:385 msgid "(off)" msgstr "(aucun)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -325,7 +335,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1,5x la réso. native (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -341,7 +351,7 @@ msgstr "2,5x la réso. native (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x la réso. native (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -357,7 +367,7 @@ msgstr "3x la réso. native (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x la réso. native (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -369,7 +379,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -377,7 +387,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -386,12 +396,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Une fenêtre Netplay est déjà ouverte !" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Il n'y a pas de jeu en cours d'émulation." @@ -413,45 +423,43 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"ATTENTION :\n" +"ALERTE :\n" "\n" -"NetPlay fonctionnera correctement uniquement avec ces paramètres :\n" -" - Dual Core désactivé\n" -" - Audio Throttle désactivé\n" -" - DSP-HLE avec \"Null Audio\" ou le DSL-LLE\n" -" - Spécifier manuellement le nombre de contôleurs qui seront utilisés dans " -"[Contrôleur standard]\n" +"Netplay marchera seulement avec les paramètres suivants :\n" +" - Double cÅ“ur activé [OFF]\n" +" - Le moteur d'émulation DSP doit être le même sur tous les ordinateurs !\n" +" - DSP sur un thread dédié [OFF]\n" +" - La limite de frame pas fixée en fonction de l'[audio]\n" "\n" -"Tous les joueurs devraient essayer d'utiliser la même version de Dolphin et " -"les mêmes paramètres.\n" -"Désactiver toutes les cartes mémoires, ou sinon les envoyer à tous les " -"joueurs avant de démarrer.\n" -"La prise en charge de la Wiimote n'est pas encore implémentée.\n" +"Tous les joueurs devraient utiliser la même version de Dolphin et les mêmes " +"paramètres.\n" +"Toutes les cartes mémoires doivent être identiques entre joueurs, ou " +"désactivées.\n" +"La prise en charge de la Wiimote n'a pas été implémentée !\n" "\n" -"Vous devez indiquer le port TCP à l'hôte !!" +"L'hôte doit avoir le port TCP choisi ouvert/transmis !\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Codes AR" #: Source/Core/DolphinWX/Src/AboutDolphin.h:21 msgid "About Dolphin" -msgstr "A propos de Dolphin" +msgstr "À propos de Dolphin" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:24 msgid "Acceleration" @@ -469,7 +477,7 @@ msgid "" "\n" "If unsure, check EFB to Texture instead." msgstr "" -"Emule fidèlement les copies d'EFB.\n" +"Émule fidèlement les copies d'EFB.\n" "Certains jeux requièrent ceci pour certains effets graphiques ou " "fonctionnalités dans le jeu.\n" "\n" @@ -488,13 +496,13 @@ msgid "" "Culprit Code:\n" "%s" msgstr "" -"Erreur de décryption du Code Action Replay :\n" +"Erreur de décryptage du Code Action Replay :\n" "Echec de vérification de la parité\n" "\n" -"Culprit Code:\n" +"Code coupable :\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -502,7 +510,7 @@ msgstr "" "Erreur Action Replay : Taille non valide (%08x : adresse = %08x) dans le " "code Ajout (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -511,31 +519,31 @@ msgstr "" "Erreur Action Replay : Taille non valide (%08x : adresse = %08x) dans le " "code Remplir et déplacer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" "Erreur Action Replay : Taille non valide (%08x : adresse = %08x) dans " -"l'écriture de la RAM et Remplir (%s)" +"Écriture dans la RAM et Remplir (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -"Erreur Action Replay : Taille non valide (%08x : adresse = %08x) dans Ecrire " +"Erreur Action Replay : Taille non valide (%08x : adresse = %08x) dans Écrire " "vers Pointeur (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" "Erreur Action Replay : Valeur non valide (%08x) dans la Copie de mémoire (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -545,27 +553,27 @@ msgstr "" "(%s)\n" "Les Master codes ne sont pas requis. Ne les utilisez pas." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Erreur Action Replay : code AR non valide à la ligne %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay : Code Conditionnel : Taille non valide %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay : Type de Code Normal non valide %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay ; Code Normal %i : Sous-type non valide %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay : Code Normal 0 : Sous-type non valide %08x (%s)" @@ -579,11 +587,11 @@ msgstr "Carte :" msgid "Add" msgstr "Ajouter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Ajouter un code ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Ajouter un patch" @@ -591,9 +599,9 @@ msgstr "Ajouter un patch" msgid "Add new pane" msgstr "Ajouter un nouveau panneau" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Ajouter..." @@ -650,32 +658,32 @@ msgstr "Avancé" msgid "Advanced Settings" msgstr "Paramètres avancés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Tous les fichiers GC/Wii (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Toutes les images GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Tous les fichiers GameCube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Tous les états sauvegardés (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Tous les fichiers ISO Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" -msgstr "Tous les fichiers ISO compressés GC/Wii (gcz)" +msgstr "Tous les fichiers ISO compressés de GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Tous les fichiers (*.*)|*.*" @@ -695,19 +703,19 @@ msgstr "Filtrage anisotropique :" msgid "Anti-Aliasing:" msgstr "Anti-Aliasing :" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "L'apploader n'a pas la bonne taille... est-ce vraiment un apploader ?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "L'apploader ne peut charger depuis ce fichier" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Appliquer" @@ -722,7 +730,7 @@ msgstr "" "\n" "Dans le doute, sélectionnez (aucun)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabe" @@ -731,7 +739,7 @@ msgstr "Arabe" msgid "Are you sure you want to delete \"%s\"?" msgstr "Êtes-vous sûr de vouloir supprimer \"%s\" ?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -739,17 +747,22 @@ msgstr "" "Êtes-vous sûr de vouloir supprimer ces fichiers ?\n" "Ils seront définitivement supprimés !" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" -"Êtes-vous sûr de vouloir supprimer ce fichier ? Il sera supprimé " +"Êtes-vous sûr de vouloir supprimer ce fichier ? Il sera supprimé " "définitivement !" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "ARM JIT (expérimental)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "ARM JIT (expérimental)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Format d'écran :" @@ -758,12 +771,12 @@ msgstr "Format d'écran :" msgid "At least one pane must remain open." msgstr "Au moins un panneau doit rester ouvert." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Moteur audio :" @@ -771,7 +784,7 @@ msgstr "Moteur audio :" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon : impossible d'ouvrir le périphérique AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -810,16 +823,16 @@ msgstr "Registres BP" msgid "Back" msgstr "Retour" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Paramètres de l'interface audio" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Moteur :" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Entrée en arrière-plan" @@ -828,24 +841,24 @@ msgstr "Entrée en arrière-plan" msgid "Backward" msgstr "Arrière" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Mauvaise entête de fichier" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Bannière" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Détails de la bannière" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Bannière :" @@ -865,10 +878,10 @@ msgstr "Paramètres de base" msgid "Bass" msgstr "Basse" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "" -"Echec de la vérification de la somme de contrôle de la Table d'Allocation de " +"Échec de la vérification de la somme de contrôle de la Table d'Allocation de " "Blocs" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:625 @@ -888,7 +901,7 @@ msgid "Blue Right" msgstr "Bleu Droite" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Bas" @@ -897,27 +910,27 @@ msgstr "Bas" msgid "Bound Controls: %lu" msgstr "Contrôles liés : %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Corrompu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Parcourir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Choisir un dossier à ajouter" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Rechercher un dossier contenant des ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Parcourir un dossier de destination" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer :" @@ -927,7 +940,7 @@ msgstr "Buffer :" msgid "Buttons" msgstr "Boutons" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -941,7 +954,7 @@ msgstr "C" #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:65 msgid "C Stick" -msgstr "Stick-C" +msgstr "Stick C" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:64 msgid "C-Stick" @@ -975,34 +988,34 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Impossible de trouver la Wiimote par le gestionnaire de connexion %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Impossible de lire depuis DVD_Plugin - erreur fatale de DVD-Interface" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Annuler" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Impossible d'ouvrir %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" "Impossible de désenregistrer des évènements alors qu'il y en a en attente." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1013,7 +1026,7 @@ msgstr "" "%s\n" "n'est pas un fichier de carte mémoire GameCube valide." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1025,7 +1038,7 @@ msgstr "" msgid "Caps Lock" msgstr "Verr Maj" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalan" @@ -1033,11 +1046,11 @@ msgstr "Catalan" msgid "Center" msgstr "Centre" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Changer" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "&Changer de disque..." @@ -1045,11 +1058,11 @@ msgstr "&Changer de disque..." msgid "Change Disc" msgstr "Changer de disque" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Changer de Jeu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1065,11 +1078,11 @@ msgstr "Change le signe du paramètre zFar (après correction)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Change le signe du paramètre zNear (après correction)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Changer ceci n'aura aucun effet durant l'émulation !" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1077,47 +1090,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Cheat Code" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Rechercher un cheat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Gestionnaire de Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Vérifier l'intégrité de la partition" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Vérification de l'intégrité..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinois (simplifié)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinois (traditionnel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Choisir un dossier racine pour le DVD :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Choisir un dossier racine pour la NAND :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Choisir un ISO par défaut" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Choisir un dossier à ajouter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Choisir un fichier à ouvrir" @@ -1125,7 +1138,7 @@ msgstr "Choisir un fichier à ouvrir" msgid "Choose a memory card:" msgstr "Choisir une carte mémoire :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1133,8 +1146,8 @@ msgstr "" "Choisir un fichier comme apploader : (uniquement pour les disques créés à " "partir de dossiers)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Choisir le dossier de destination de l'extraction" @@ -1153,7 +1166,7 @@ msgstr "Classique" msgid "Clear" msgstr "Effacer" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1163,7 +1176,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Fermer" @@ -1172,11 +1185,11 @@ msgstr "Fermer" msgid "Co&nfigure..." msgstr "Co&nfigurer..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Info du code" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Code :" @@ -1188,24 +1201,24 @@ msgstr "Commande" msgid "Comment" msgstr "Commentaire" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Commentaire :" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Compresser l'ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Compresser les ISO sélectionnés..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Compression de l'ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configurer" @@ -1219,18 +1232,18 @@ msgstr "Configurer" msgid "Configure Control" msgstr "Configurer le contrôle" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configurer les manettes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configurer" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Confirmer l'écrasement du fichier" @@ -1243,17 +1256,16 @@ msgstr "Confirmer l'arrêt de l'émulation" msgid "Connect" msgstr "Connecter" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Connecter le clavier USB" +msgstr "Connecter la Balance Board" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Connecter le clavier USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Connecter la Wiimote %i" @@ -1274,7 +1286,7 @@ msgstr "Connecter la 3è Wiimote" msgid "Connect Wiimote 4" msgstr "Connecter la 4è Wiimote" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Connexion..." @@ -1294,30 +1306,25 @@ msgstr "Contrôle" msgid "Convert to GCI" msgstr "Convertir en GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" -msgstr "Echec de la copie" +msgstr "Échec de la copie" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:789 #, c-format msgid "Copy to Memcard %c" msgstr "Copier vers la carte mémoire %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Core" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Impossible de créer %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Impossible d'initialiser le moteur %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1329,26 +1336,16 @@ msgstr "" "GameCube et Wii ne peuvent pas être plus par la plupart des lecteurs DVD sur " "PC." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Impossible de reconnaître le fichier ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Impossible de sauvegarder %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Impossible de définir les manettes. Le joueur a quitté le jeu ou le jeu est " -"en cours d'exécution !\n" -"(le paramétrage des manettes pendant l'émulation du jeu n'est pas encore " -"pris en charge)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1370,11 +1367,11 @@ msgstr "" "Dans ce cas, vous devez à nouveau spécifier l'emplacement du fichier de " "sauvegarde dans les options." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Impossible de trouver la commande d'ouverture pour l'extension 'ini' !" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1382,17 +1379,17 @@ msgstr "" "Impossible d'initialiser les composants de base.\n" "Vérifiez votre configuration." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Nombre :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Pays :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Créer un code AR" @@ -1427,12 +1424,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Le répertoire en cours a changé de %s vers %s après wxFileSelector !" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Hack de projection personnalisé" @@ -1440,11 +1437,11 @@ msgstr "Hack de projection personnalisé" msgid "Custom Projection Hack Settings" msgstr "Paramètres du hack de projection personnalisé" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Personnalise certains paramètres de projection orthographique." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tchèque" @@ -1456,36 +1453,36 @@ msgstr "D" msgid "D-Pad" msgstr "Pad numérique" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Moteur d'émulation du DSP (Audio)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulation du DSP en HLE (rapide)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Interpréteur du DSP en LLE (lent)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Recompilateur du DSP en LLE" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP sur un thread dédié" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Paramètres DSP (audio)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSP LLE sur un thread dédié" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Racine du DVD :" @@ -1497,15 +1494,15 @@ msgstr "DVDLowRead - Erreur fatale : impossible de lire le volume" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Erreur fatale : impossible de lire le volume" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Dance Mat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Taille des données" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Date :" @@ -1528,35 +1525,34 @@ msgstr "Débug" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:532 msgid "Debugging" -msgstr "Débug" +msgstr "Débugage" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:66 msgid "Decimal" msgstr "Décimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Décompresser l'ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Décompresser les ISO sélectionnés..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Décompression de l'ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Rafraîchir la liste des jeux" +msgstr "Baisser la limite d'image/s" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Par défaut" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO par défaut :" @@ -1600,8 +1596,8 @@ msgstr "" msgid "Device" msgstr "Appareil" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Paramètres de la console virtuelle" @@ -1609,15 +1605,12 @@ msgstr "Paramètres de la console virtuelle" msgid "Dial" msgstr "Appel" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1632,7 +1625,7 @@ msgstr "Désactiver" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Désactiver Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1669,19 +1662,18 @@ msgstr "" "Dans le doute, décochez cette case." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Saute la passe alpha de destination, utilisée dans beaucoup de jeux pour " -"divers effets graphiques.\n" +"Désactive l'émulation d'une fonctionnalité matérielle nommée Passe alpha de " +"destination, utilisée dans beaucoup de jeux pour divers effets graphiques.\n" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disque" @@ -1708,24 +1700,90 @@ msgstr "" msgid "Divide" msgstr "Diviser" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Voulez-vous arrêter l'émulation en cours ?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Décodeur Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ par l'équipe de Dolphin\n" +"\n" +"Branche : %s\n" +"Révision: %s\n" +"Compilé le %s @ %s\n" +"\n" +"Dolphin est un émulateur de Gamecube et Wii,\n" +"écrit à l'origine par by F|RES et ector.\n" +"Aujourd'hui, Dolphin est un projet open source\n" +"avec beaucoup de contributeurs, trop pour être cités.\n" +"Si vous êtes intéressés, rendez-vous sur le page du projet à\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Remerciements particuliers à Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 et Hotquik pour leurs démos\n" +"de rétro-ingénieurie et leurs docs et démos.\n" +"\n" +"Grands mercis à Gilles Mouchard dont l'émulateur Microlib PPC\n" +"a donné un coup de pouce au début du développement.\n" +"\n" +"Merci à Frank Wille pour son désassembleur PowerPC,\n" +"que or9 et nous avons modifié pour inclure les spécificités Gekko.\n" +"\n" +"Merci à hcs/destop pour leur décodeur GC ADPCM.\n" +"\n" +"Nous ne sommes d'aucune manière affiliés à Nintendo.\n" +"Gamecube et Wii sont des marques déposées de Nintendo.\n" +"Cet émulateur est à des fins d'éducation uniquement\n" +"et ne devrait pas être utilisé pour jouer à des jeux\n" +"que vous ne possédez pas légalement." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Configuration des graphismes %s pour Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Site &web de Dolphin" @@ -1741,12 +1799,12 @@ msgstr "Configuration de la Wiimote pour Dolphin" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Configuration de la manette GC pour Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Films TAS Dolphin (*.dtm)" @@ -1754,11 +1812,11 @@ msgstr "Films TAS Dolphin (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Configuration de la Wiimote pour Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin dans &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1766,7 +1824,7 @@ msgstr "" "Dolphin n'a pas trouvé d'ISO GC/Wii. Double-cliquez ici pour chercher des " "fichiers..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1774,19 +1832,18 @@ msgstr "" "Dolphin est paramétré pour cacher tous les jeux. Double-cliquez ici pour " "afficher tous les jeux..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin n'a pas pu exécuter l'action demandée." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Activer l'accès disque rapide. Requis pour certains jeux. (MARCHE = Rapide, " -"ARRÊT = Compatible)" +"Double la fréquence d'horloge du GPU émulé. Peut accélérer certains jeux " +"(Coché = rapide, Décoché = compatible)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1806,11 +1863,11 @@ msgstr "%lu codes ont été téléchargés. (%lu ajoutés)" msgid "Drums" msgstr "Percussions" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Factice" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Enregistrer le son" @@ -1857,9 +1914,9 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Néerlandais" @@ -1884,7 +1941,7 @@ msgstr "" "distribution de Dolphin, un redémarrage est probablement nécessaire pour que " "Windows charge le nouveau pilote." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "Europe" @@ -1892,30 +1949,30 @@ msgstr "Europe" msgid "Early Memory Updates" msgstr "Premières mises à jour de mémoire" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" -msgstr "Editer" +msgstr "Éditer" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.h:17 msgid "Edit ActionReplay Code" -msgstr "Editer le code ActionReplay" +msgstr "Éditer le code ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" -msgstr "Editer la configuration" +msgstr "Éditer la configuration" #: Source/Core/DolphinWX/Src/PatchAddEdit.h:17 msgid "Edit Patch" -msgstr "Editer le patch" +msgstr "Éditer le patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Modifier la perspective actuelle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." -msgstr "Editer..." +msgstr "Éditer..." #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:48 msgid "Effect" @@ -1925,7 +1982,7 @@ msgstr "Effets" msgid "Embedded Frame Buffer" msgstr "Buffer d'image embarqué" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Thread d'émulation déjà en cours d'exécution" @@ -1937,7 +1994,7 @@ msgid "" "\n" "If unsure, check virtual XFB emulation instead." msgstr "" -"Emule précisément les XFB.\n" +"Émule précisément les XFB.\n" "Ralentit beaucoup l'émulation et empêche le rendu en haute résolution, mais " "est nécessaire pour émuler certains jeux correctement.\n" "\n" @@ -1952,20 +2009,21 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"Emule les XFB en utilisant les objets de texture du GPU.\n" +"Émule les XFB en utilisant les objets de texture du GPU.\n" "Corrige beaucoup de jeux qui ne fonctionnent pas sans émulation de XFB, sans " "être aussi lent qu'une réelle émulation de l'XFB. Cependant, cela peut ne " "pas fonctionner pour beaucoup d'autres jeux (particulièrement les " "applications homebrew).\n" +"\n" "Dans le doute, sélectionnez cette case." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Emulated Wiimote" msgstr "Wiimote émulée" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " -msgstr "Etat de l'émulation :" +msgstr "État de l'émulation :" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:22 msgid "Enable" @@ -1987,15 +2045,15 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Activer la journalisation AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Activer l'assemblage de blocs" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Active le calcul de la boîte liée." @@ -2007,15 +2065,15 @@ msgstr "Activer le cache" msgid "Enable Cheats" msgstr "Activer les Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Activer le Dual Core" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:547 msgid "Enable Dual Core (speedup)" -msgstr "Activer le Dual Core (plus rapide)" +msgstr "Activer le double cÅ“ur (plus rapide)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Activer le saut d'inactivité" @@ -2023,15 +2081,15 @@ msgstr "Activer le saut d'inactivité" msgid "Enable Idle Skipping (speedup)" msgstr "Activer le saut d'inactivité (plus rapide)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Activer le MMU" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:564 msgid "Enable Progressive Scan" -msgstr "Activer le Progressive Scan" +msgstr "Activer le balayage progressif" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Activer l'économiseur d'écran" @@ -2039,7 +2097,7 @@ msgstr "Activer l'économiseur d'écran" msgid "Enable Speaker Data" msgstr "Activer les données du haut-parleur" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Activer l'écran large (16/9è)" @@ -2062,7 +2120,7 @@ msgstr "" "\n" "Dans le doute, sélectionnez 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2099,7 +2157,7 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2107,11 +2165,11 @@ msgstr "" "Activer ceci pour accélérer La légende de Zelda : Twilight Princess. " "Désactiver pour TOUS les autres jeux." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Active un hack de projection personnalisé" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2119,22 +2177,13 @@ msgstr "" "Active l'émulation Dolby Pro Logic II en utilisant le son surround 5.1. Non " "disponible sur OS X." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Active l'émulation Dolby Pro Logic II en utilisant le son surround 5.1. " "Uniquement avec le moteur OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Active l'émulation Dolby Pro Logic II en utilisant le son surround 5.1. " -"Uniquement avec le moteur OpenAL. Il peut être nécessaire de renommer le " -"fichier soft_oal.dll en OpenAL32.dll pour que cela fonctionne." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2148,7 +2197,7 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2170,9 +2219,9 @@ msgstr "" msgid "End" msgstr "Fin" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Anglais" @@ -2195,23 +2244,22 @@ msgstr "Entrée %d/%d" msgid "Entry 1/%d" msgstr "Entrée 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" -msgstr "Egal" +msgstr "Égal" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Erreur" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Erreur lors du chargement de la langue sélectionnée. Retour à la langue par " "défaut du système." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2238,7 +2286,6 @@ msgid "Euphoria" msgstr "Euphorie" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2248,16 +2295,20 @@ msgstr "" msgid "Execute" msgstr "Exécuter" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Quitter" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exporter toutes les sauvegardes Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Echec de l'exportation" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exporter un fichier" @@ -2265,7 +2316,7 @@ msgstr "Exporter un fichier" msgid "Export Recording" msgstr "Exporter l'enregistrement..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exporter l'enregistrement..." @@ -2273,7 +2324,7 @@ msgstr "Exporter l'enregistrement..." msgid "Export Save" msgstr "Exporter une sauvegarde" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exporter une sauvegarde Wii (expérimental)" @@ -2281,15 +2332,15 @@ msgstr "Exporter une sauvegarde Wii (expérimental)" msgid "Export all saves" msgstr "Exporter toutes les sauvegardes" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "L'exportation a échoué. Essayer de nouveau ?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "L'exportation a échoué" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exporter l'enregistrement sous..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extension" @@ -2303,46 +2354,46 @@ msgstr "Paramètres supplémentaires" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:49 msgid "Extra Parameter useful in ''Metroid: Other M'' only." -msgstr "Paramètre supplémentaire utile dans ''Metroid: Other M'' uniquement." +msgstr "Paramètre supplémentaire utile dans ''Metroid: Other M'' uniquement." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extraire tous les fichiers..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extraire l'Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extraire le DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." -msgstr "Extraire un dossier..." +msgstr "Extraire le dossier..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." -msgstr "Extraire un fichier..." +msgstr "Extraire le fichier..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." -msgstr "Extraire une partition..." +msgstr "Extraire la partition..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extraction de %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extraction de tous les fichiers" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extraction du dossier" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extraction..." @@ -2354,15 +2405,15 @@ msgstr "Octet FIFO" msgid "FIFO Player" msgstr "Lecteur FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "France" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Taille FST :" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Connexion impossible !" @@ -2370,11 +2421,15 @@ msgstr "Connexion impossible !" msgid "Failed to download codes." msgstr "Impossible de télécharger les codes." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Impossible d'extraire vers %s !" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2394,7 +2449,7 @@ msgstr "" "Utilisez DSPSpy pour extraire le fichier de votre console.\n" "\n" "Vous pouvez utiliser le moteur DSP HLE à la place, celui-ci ne requiert pas " -"d'extration de ROM.\n" +"d'extraction de ROM.\n" "(Sélectionnez-le depuis l'onglet \"Audio\" dans la fenêtre de configuration.)" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:108 @@ -2403,6 +2458,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Impossible de charger bthprops.cpl ! Vous ne pourrez pas connecter de " +"Wiimote et Dolphin peut planter inopinément !" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2410,21 +2467,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Impossible de charger hid.dll ! Vous ne pourrez pas connecter de Wiimote et " +"Dolphin peut planter inopinément !" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Impossible de lire %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Impossible de lire banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Impossible de lire l'entête bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2435,7 +2494,7 @@ msgstr "" "La carte mémoire est peut-être tronquée\n" "Position du fichier : %llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2444,7 +2503,7 @@ msgstr "" "blocs\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2452,17 +2511,17 @@ msgstr "" "Impossible de lire correctement la table d'allocation des blocs\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Impossible de lire les données du fichier %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Impossible de lire les données du fichier %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2470,7 +2529,7 @@ msgstr "" "Impossible de lire correctement la sauvegarde des dossiers\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2478,11 +2537,11 @@ msgstr "" "Impossible de lire le dossier correctement\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Impossible de lire l'entête" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2490,29 +2549,34 @@ msgstr "" "Impossible de lire l'entête correctement\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Impossible de lire l'entête du fichier %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Impossible de lire l'ID unique depuis l'image du disque" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Impossible d'écrire BT.DINF vers SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Impossible d'écrire bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Impossible d'écrire dans le fichier: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Impossible d'écrire l'entête de %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Impossible d'écire l'entête du fichier %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Perse" @@ -2522,13 +2586,13 @@ msgstr "Rapide" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Calcul rapide de la profondeur" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Version rapide de la MMU. Ne fonctionne pas avec tous les jeux." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2536,7 +2600,7 @@ msgstr "" "Désynchro fatale. Abandon de la lecure. (Erreur dans Play Wiimote : %u != " "%u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Lecteur FIFO" @@ -2560,7 +2624,7 @@ msgstr "" "Le fichier n'a pu être ouvert\n" "ou n'a pas d'extension valide" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2573,20 +2637,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Le fichier n'est pas reconnu comme une carte mémoire" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Fichier non compressé" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO : mode d'ouverture inconnu : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Système de fichiers" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Type de fichier 'ini' est inconnu ! Ne sera pas ouvert !" @@ -2648,7 +2712,7 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2658,7 +2722,7 @@ msgstr "" "Si cette case est décochée, Dolphin sera par défaut en NTSC-U et activera " "automatiquement cette option lorsque des jeux japonais seront lancés." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2672,13 +2736,18 @@ msgstr "Avant" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Faire suivre le port (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "Trouvé %d résultats pour '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "%x fichiers de sauvegarde trouvés" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2720,9 +2789,9 @@ msgstr "Images à enregistrer :" msgid "Free Look" msgstr "Vue libre" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Français" @@ -2735,7 +2804,7 @@ msgstr "Frets" msgid "From" msgstr "De" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Plein écran" @@ -2747,7 +2816,7 @@ msgstr "Résolution en Plein écran :" msgid "GCI File(*.gci)" msgstr "Fichier GCI (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "Manette GC" @@ -2755,27 +2824,27 @@ msgstr "Manette GC" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID du jeu :" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Le jeu est déjà en cours d'émulation !" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Le jeu n'est pas en cours d'émulation !" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Jeu non trouvé !" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Paramètres spécifiques au jeu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Config du Jeu" @@ -2792,20 +2861,20 @@ msgid "Gamecube &Pad Settings" msgstr "Paramètres de la &manette GameCube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Carte mémoires de GameCube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Paramètres de la manette GameCube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Codes Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2813,7 +2882,7 @@ msgid "" "native code handler by placing the codehandler.bin file into the Sys " "directory and restarting Dolphin.)" msgstr "" -"Echec de l'exécution du GeckoCode (CT%i CST%i) (%s)\n" +"Échec de l'exécution du GeckoCode (CT%i CST%i) (%s)\n" "(ou c'est un mauvais code, ou il n'est pas encore pris en charge. Essayez " "avec le code natif en plaçant le fichier codehandler.bin dans le répertoire " "Sys, puis redémarrez Dolphin.)" @@ -2828,27 +2897,27 @@ msgstr "Général" msgid "General Settings" msgstr "Paramètres généraux" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Allemand" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "GetARCode : l'index est plus grand que la taille de la liste de codes %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Graphismes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Paramètres graphiques" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Plus grand que" @@ -2871,7 +2940,7 @@ msgstr "" "\n" "Dans le doute, cochez cette case." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grèque" @@ -2895,11 +2964,11 @@ msgstr "Guitare" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Echec de la vérification de la somme de contrôle de l'entête" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hébreu" @@ -2911,7 +2980,7 @@ msgstr "Hauteur" msgid "Help" msgstr "Aide" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2932,7 +3001,7 @@ msgstr "" "\n" "Sayonara !\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2987,7 +3056,7 @@ msgstr "Configuration des raccourcis clavier" msgid "Hotkeys" msgstr "Raccourcis clavier" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Hongrois" @@ -2995,18 +3064,18 @@ msgstr "Hongrois" msgid "Hybrid Wiimote" msgstr "Wiimote hybride" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS : Impossible d'obtenir des données à partir d'un ticket " "inconnu : %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3015,15 +3084,15 @@ msgstr "" "ID du titre : %016llx.\n" "Dolphin va probablement se bloquer maintenant." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - mauvaise destination" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Paramètres IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3035,15 +3104,15 @@ msgstr "Pointeur IR" msgid "IR Sensitivity:" msgstr "Sensibilité de l'IR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Détails de l'ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Dossiers des ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "Italie" @@ -3051,7 +3120,7 @@ msgstr "Italie" msgid "Icon" msgstr "Icône" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3095,9 +3164,13 @@ msgstr "" msgid "Import Save" msgstr "Importer une sauvegarde" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "L'importation a échoué. Essayer de nouveau ?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importer la sauvegarde Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Échec de l'importation" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3119,21 +3192,16 @@ msgstr "" "Le fichier importé a l'extension SAV\n" "mais n'a pas une entête valide" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Dans le jeu" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Dans le jeu" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Image/s max :" +msgstr "Augmenter la limite d'image/s" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3153,7 +3221,7 @@ msgstr "Insérer" msgid "Insert Encrypted or Decrypted code here..." msgstr "Indiquer un code crypté ou décrypté ici..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Insérer une carte SD" @@ -3161,38 +3229,39 @@ msgstr "Insérer une carte SD" msgid "Insert name here.." msgstr "Indiquer un nom ici..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Installer un WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Installer dans le menu Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler a été appelé, mais cette plateforme ne le prend pas " "encore en charge." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Installation du WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Erreur lors de la vérification de l'intégrité" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Vérification de l'intégrité terminée" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Vérification de l'intégrité terminée. Aucune erreur trouvée." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3205,7 +3274,7 @@ msgstr "" msgid "Interface" msgstr "Interface" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Paramètres de l'interface" @@ -3230,20 +3299,20 @@ msgstr "Erreur interne LZO - échec de lzo_init()" msgid "Internal Resolution:" msgstr "Résolution interne :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpréteur (TRÈS lent)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Taille invalide (%x) ou mot Magique (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Valeur non valide !" @@ -3251,16 +3320,16 @@ msgstr "Valeur non valide !" msgid "Invalid bat.map or dir entry" msgstr "bar.map ou entrée dir non valide" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Type d'évènement non valide : %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Fichier non valide" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3271,7 +3340,7 @@ msgstr "" "%s\n" "Vous devriez copier à nouveau ce jeu." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Fichier d'enregitrement non valide" @@ -3289,34 +3358,36 @@ msgstr "" "Texte de recherche non valide (seules les longueurs de chaînes de caractères " "sont prises en charge)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" -msgstr "Etat non valide" +msgstr "État non valide" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italien" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "Japon" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "Recompilateur JIT (recommandé)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Recompilateur expérimental JITIL" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonais" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "Corée" @@ -3338,8 +3409,9 @@ msgstr "Toujours au premier plan" msgid "Key" msgstr "Touche" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Coréen" @@ -3361,12 +3433,12 @@ msgstr "L Analog." msgid "Language:" msgstr "Langue :" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Dernier %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latence :" @@ -3405,7 +3477,7 @@ msgstr "" "Clic gauche/droit pour plus d'options.\n" "Clic sur molette pour effacer." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Plus petit que" @@ -3422,58 +3494,48 @@ msgid "Load Custom Textures" msgstr "Charger textures personnalisées" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Charger l'état" +msgstr "Charger l'état" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Charger l'état du Slot 1" +msgstr "Charger le dernier état 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Charger l'état du Slot 2" +msgstr "Charger le dernier état 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Charger l'état du Slot 3" +msgstr "Charger le dernier état 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Charger l'état du Slot 4" +msgstr "Charger le dernier état 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Charger l'état du Slot 5" +msgstr "Charger le dernier état 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Charger l'état du Slot 6" +msgstr "Charger le dernier état 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Charger l'état du Slot 7" +msgstr "Charger le dernier état 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Charger l'état du Slot 8" +msgstr "Charger le dernier état 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Charger l'état du Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Charger l'état du Slot 1" +msgstr "Charger le dernier état 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3504,19 +3566,18 @@ msgid "Load State Slot 8" msgstr "Charger l'état du Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Charger l'état du Slot 1" +msgstr "Charger le dernier état 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Charger un état..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Charger le Menu Système Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Charger le Menu Système Wii %d%c" @@ -3537,10 +3598,6 @@ msgstr "" "Charger les valeurs de pré-réglage à partir de la palette de hack " "disponibles." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Local" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Journal" @@ -3574,12 +3631,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Sorties des journalisations" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Journalisation" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Connexion au serveur perdue !" @@ -3587,7 +3644,7 @@ msgstr "Connexion au serveur perdue !" msgid "M Button" msgstr "Bouton M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3596,7 +3653,7 @@ msgstr "" "MD5 non concordant\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Hack de vitesse pour le MMU" @@ -3610,11 +3667,11 @@ msgstr "Fichiers MadCatz Gameshark (*.gcs)" msgid "Main Stick" msgstr "Stick principal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID concepteur :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Concepteur :" @@ -3651,7 +3708,7 @@ msgid "Memory Byte" msgstr "Octet mémoire" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Carte mémoire" @@ -3663,7 +3720,7 @@ msgstr "" "Gestionnaire de cartes mémoires | ATTENTION : Faites des sauvegardes avant " "utilisation, devrait être OK mais corruption possible de données !" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3680,7 +3737,7 @@ msgstr "" "%s\n" "Voulez-vous copier l'ancien fichier vers ce nouvel endroit ?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "La taille du fichier de la carte mémoire ne correspond pas à la taille de " @@ -3690,7 +3747,7 @@ msgstr "" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Micro" @@ -3703,7 +3760,7 @@ msgstr "Min" msgid "Misc" msgstr "Divers" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Paramètres divers" @@ -3729,11 +3786,11 @@ msgstr "" msgid "Monospaced font" msgstr "Police mono-espacée." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Vibreur" @@ -3853,15 +3910,15 @@ msgstr "NP Tabulation" msgid "NP Up" msgstr "NP Haut" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nom :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nom :" @@ -3871,7 +3928,7 @@ msgstr "Nom :" msgid "Native GCI files(*.gci)" msgstr "Fichiers natifs GCI (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nouvelle recherche" @@ -3880,7 +3937,7 @@ msgstr "Nouvelle recherche" msgid "Next Page" msgstr "Page suivante" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Recherche suivante" @@ -3888,11 +3945,11 @@ msgstr "Recherche suivante" msgid "Nickname :" msgstr "Pseudo :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Pas de pays (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Aucun ISO ou WAD trouvé" @@ -3900,7 +3957,7 @@ msgstr "Aucun ISO ou WAD trouvé" msgid "No audio output" msgstr "Pas de sortie audio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Aucune bannière trouvée pour le titre %s" @@ -3926,44 +3983,45 @@ msgstr "Aucune entrée de dossier d'index libre" msgid "No recorded file" msgstr "Aucun fichier enregistré" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Aucun dossier de sauvegarde trouvé pour le titre %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Aucune" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norvégien BokmÃ¥l" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Différent" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Non défini" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Ce n'est pas une sauvegarde Wii ou échec de le lecture de la taille de " "l'entête du fichier %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Non connectée" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notes" @@ -3984,7 +4042,7 @@ msgstr "Note" msgid "Num Lock" msgstr "Verr. Num" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Nombre de codes :" @@ -4005,7 +4063,7 @@ msgstr "Objet" msgid "Object Range" msgstr "Plage d'objets :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Arrêt" @@ -4017,25 +4075,29 @@ msgstr "Offset :" msgid "On-Screen Display Messages" msgstr "Afficher les messages informatifs" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "&Documentation en ligne" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "%d blocs disponibles seulement" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Ouvrir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Ouvrir l'emplacement du fichier" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Ouvrir le dossier de &sauvegarde Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Ouvrir un fichier..." @@ -4061,7 +4123,15 @@ msgstr "Décodeur de texture OpenCL" msgid "OpenMP Texture Decoder" msgstr "Décodeur de texture OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Ouvre la configuration par défaut pour ce jeu dans un éditeur de texte " +"externe (lecture seule)" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Options" @@ -4071,7 +4141,6 @@ msgid "Orange" msgstr "Orange" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -4080,14 +4149,14 @@ msgstr "" "L'ordre des fichiers dans le Dossier de fichiers ne correspond pas à l'ordre " "des blocs\n" "Faites un clic droit et exportez toutes les sauvegardes,\n" -"et importez les sauvegardes vers une nouvelle carte mémoire\n" +"puis importez les sauvegardes vers une nouvelle carte mémoire\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Autres" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4099,15 +4168,15 @@ msgstr "" msgid "Output" msgstr "Sortie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Jouer l'enregistrement..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Manette" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Manette " @@ -4131,17 +4200,17 @@ msgstr "Paragraphe" msgid "Parameters" msgstr "Paramètres" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partition %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "La partition n'existe pas : %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patchs" @@ -4149,8 +4218,8 @@ msgstr "Patchs" msgid "Paths" msgstr "Chemins" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pause" @@ -4163,7 +4232,7 @@ msgstr "Faire une pause à la fin du film" msgid "Per-Pixel Lighting" msgstr "Eclairage par pixel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Parfait" @@ -4173,9 +4242,9 @@ msgid "Perspective %d" msgstr "Perspective %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Démarrer" @@ -4187,7 +4256,7 @@ msgstr "Jouer l'enregistrement..." msgid "Play/Pause" msgstr "Démarrer/Arrêter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Jouable" @@ -4195,11 +4264,11 @@ msgstr "Jouable" msgid "Playback Options" msgstr "Options de lecture" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Joueurs" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Veuillez confirmer..." @@ -4211,23 +4280,23 @@ msgstr "Merci de créer une perspective avant de sauvegarder" msgid "Plus-Minus" msgstr "Plus-Moins" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polonais" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4236,11 +4305,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugais" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugais (brésilien)" @@ -4248,17 +4317,17 @@ msgstr "Portugais (brésilien)" msgid "Post-Processing Effect:" msgstr "Effet de Post-processing :" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Fin de film prématurée dans Play Controller (%u + 8 > %u)" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Fin de film prématurée dans Play Wiimote (%u + %d > %u)" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Fin de film prématurée dans Play Wiimote (%u > %u)" @@ -4275,7 +4344,7 @@ msgstr "Page préc." msgid "Previous Page" msgstr "Page précédente" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valeur précédente" @@ -4291,7 +4360,7 @@ msgstr "Profil" msgid "Properties" msgstr "Propriétés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Vider le cache" @@ -4300,7 +4369,7 @@ msgid "Question" msgstr "Question" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Quitter" @@ -4322,13 +4391,13 @@ msgstr "R Analog." msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "Russie" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4344,7 +4413,7 @@ msgstr "Réel" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Balance Board physique" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4361,6 +4430,10 @@ msgstr "Wiimote physique" msgid "Record" msgstr "Enregistrer" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Entrée mémoire" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Infos sur l'enregistrement" @@ -4397,7 +4470,7 @@ msgstr "" "Dans le doute, sélectionnez Aucune." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Rafraîchir" @@ -4406,14 +4479,14 @@ msgstr "Rafraîchir" msgid "Refresh List" msgstr "Rafraîchir la liste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Rafraîchir la liste des jeux" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Retirer" @@ -4436,7 +4509,7 @@ msgstr "Rendu dans la fenêtre principale" msgid "Reset" msgstr "Reset" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Résultats" @@ -4444,9 +4517,9 @@ msgstr "Résultats" msgid "Return" msgstr "Entrée" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Révision :" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4457,20 +4530,19 @@ msgstr "Droite" msgid "Right Stick" msgstr "Stick Droit" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Rumble" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Exécute les DSP HLE et LLE sur un thread dédié (non recommandé : peut " -"provoquer des pépins avec le HLE et des blocages avec le LLE)." +"Éxécuter DSP LLE sur un thread dédié (non recommandé : peut causer des " +"blocages)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russe" @@ -4483,7 +4555,7 @@ msgid "Safe" msgstr "Sûr " #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Sauver" @@ -4493,23 +4565,20 @@ msgid "Save GCI as..." msgstr "Enregistrer GCI sous..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Sau&vegarder l'état" +msgstr "Sauvegarder l'ancien état" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Sau&vegarder l'état" +msgstr "Sauvegarder l'état" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Sauvegarder l'état vers le Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Sauvegarder l'état vers le Slot 1" +msgstr "Sauvegarder l'état au Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4540,32 +4609,31 @@ msgid "Save State Slot 8" msgstr "Sauvegarder l'état vers le Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Sauvegarder l'état vers le Slot 1" +msgstr "Sauvegarder l'état au Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Enregistrer l'état" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Enregistrer sous..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Sauver le fichier compressé GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Sauvegarder la perspective actuelle" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Sauvegarder le fichier GCM/ISO décompressé" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4576,20 +4644,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "Copie à l'échelle de l'EFB" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Analyse de %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Recherche d'ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Recherche..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Capt écran" @@ -4601,11 +4669,11 @@ msgstr "Arrêt défil." msgid "Search" msgstr "Rechercher" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Fitre de recherche" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Chercher dans sous-dossiers" @@ -4626,14 +4694,14 @@ msgstr "La section %s n'a pas été trouvée dans SYSCONF" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:46 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:539 msgid "Select" -msgstr "Select" +msgstr "Sélectionner" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Sélectionner le fichier d'enregistrement" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Sélectionner un fichier WAD de Wii à installer" @@ -4655,19 +4723,19 @@ msgstr "Sélectionner un fichier de sauvegarde à importer" msgid "Select floating windows" msgstr "Sélectionner les fenêtres flottantes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Sélectionner le fichier à charger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Sélectionner le fichier à enregistrer" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Sélectionner l'état à charger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Sélectionner l'état à enregistrer" @@ -4690,7 +4758,7 @@ msgstr "" "\n" "Dans le doute, choisissez Auto." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Le profil de controleur sélectionné n'existe pas" @@ -4715,39 +4783,28 @@ msgstr "" "Si vous ne savez toujours pas, sélectionnez la plus haute résolution " "affichée." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Sélectionne quel moteur graphique doit être utilisé en interne.\n" -"Direct3D 9 est généralement le plus rapide. OpenGL est le plus précis. " -"Direct3D 11 est entre les deux.\n" -"Les moteurs Direct3D ne sont disponibles que pour Windows.\n" -"\n" -"Dans le doute, sélectionnez Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Sélectionne quel moteur graphique doit être utilisé en interne.\n" -"Direct3D 9 est généralement le plus rapide. OpenGL est le plus précis. " -"Direct3D 11 est entre les deux.\n" -"Les moteurs Direct3D ne sont disponibles que pour Windows.\n" -"\n" -"Dans le doute, sélectionnez OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Envoyer" @@ -4759,18 +4816,18 @@ msgstr "Position de la Sensor Bar :" msgid "Separator" msgstr "Séparateur" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Port série 1 - C'est le port que les périphériques tels que l'adaptateur " "ethernet utilisent" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Définir comme l'ISO par &défaut" @@ -4779,7 +4836,7 @@ msgstr "Définir comme l'ISO par &défaut" msgid "Set as default Memcard %c" msgstr "Définir comme carte mémoire par défaut : %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4794,19 +4851,19 @@ msgstr "" "Configure la latence (en ms). Des valeurs plus élevées peuvent réduire le " "craquement audio. Uniquement avec le moteur OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Configurer..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Impossible de trouver le fichier des paramètres" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Impossible de créer le fichier de paramètres" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Secouement" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Nom court :" @@ -4814,23 +4871,27 @@ msgstr "Nom court :" msgid "Shoulder Buttons" msgstr "Boutons latéraux" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Afficher la &Console" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Afficher le &journal" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Afficher la barre d'&état" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Afficher la barre d'&outils" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Afficher les paramètres par défaut" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Afficher les lecteurs" @@ -4842,11 +4903,11 @@ msgstr "Afficher les régions copiées d'EFB" msgid "Show FPS" msgstr "Afficher les FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Afficher France" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Afficher GameCube" @@ -4854,35 +4915,35 @@ msgstr "Afficher GameCube" msgid "Show Input Display" msgstr "Afficher le graphisme en entrée" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Afficher Italie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Afficher Japon" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Afficher Corée" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Afficher la langue :" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Afficher la config. de journalisation" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Afficher PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Afficher les plateformes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Afficher les régions" @@ -4890,27 +4951,27 @@ msgstr "Afficher les régions" msgid "Show Statistics" msgstr "Afficher les statistiques" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Afficher Taïwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Afficher USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Afficher WAD" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Afficher Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Demande confirmation avant d'arrêter le jeu." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4929,7 +4990,7 @@ msgstr "Afficher le premier bloc" msgid "Show lag counter" msgstr "Afficher le compteur de lag" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4967,7 +5028,7 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Afficher les inconnus" @@ -4981,23 +5042,24 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote à l'horizontale" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Chinois simplifié" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Taille" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Ne pas exécuter le BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Ignorer le vidage DCBZ" @@ -5022,17 +5084,17 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -5040,7 +5102,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Capture" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Rendu logiciel" @@ -5057,27 +5119,27 @@ msgstr "" "Êtes-vous certain d'activer le rendu logiciel ? Dans le doute, choisissez " "'Non'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Paramètres audio" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Le moteur audio %s n'est pas valide" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Echec de la création du buffer audio : %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Espace" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Espagnol" @@ -5105,37 +5167,29 @@ msgstr "" "\n" "Dans le doute, sélectionnez 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Accélerer le taux de transfert du disque" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Stick carré" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Contrôleur standard" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Démarrer &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Commencer l'enregistrement" @@ -5143,15 +5197,15 @@ msgstr "Commencer l'enregistrement" msgid "Start Recording" msgstr "Commencer l'enregistrement" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" -msgstr "Etat" +msgstr "État" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:161 msgid "State Saves" -msgstr "Etats" +msgstr "États sauvegardés" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volant" @@ -5160,7 +5214,7 @@ msgid "Stick" msgstr "Stick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Arrêter" @@ -5181,7 +5235,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Stretch to Window" -msgstr "Etirer à la fenêtre" +msgstr "Étirer à la fenêtre" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:47 msgid "Strum" @@ -5191,28 +5245,28 @@ msgstr "Gratter" msgid "Subtract" msgstr "Soustraire" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Fichier exporté avec succès vers %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Fichiers de sauvegarde importés avec succès" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Suédois" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Balancement" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synchroniser le thread du GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5220,12 +5274,13 @@ msgstr "" "Synchronise les transferts entre le GPU et le CPU pour éviter des blocages " "aléatoires en mode Dual Core. (Coché = Compatible, Décoché = Rapide)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Langue du système :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "Taïwan" @@ -5250,13 +5305,13 @@ msgstr "Table Gauche" msgid "Table Right" msgstr "Table Droite" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Capture d'écran" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5276,11 +5331,11 @@ msgstr "Cache de texture" msgid "Texture Format Overlay" msgstr "Infos de format de texture" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "Le WAD a été installé avec succès" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "L'adresse n'est pas valide" @@ -5288,13 +5343,13 @@ msgstr "L'adresse n'est pas valide" msgid "The checksum was successfully fixed" msgstr "La somme de contrôle a été corrigée avec succès" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Le dossier sélectionné est déjà dans la liste" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5317,7 +5372,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Le fichier %s a déjà été ouvert, son entête n'a pas pu être écrite." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Le fichier que vous avez spécifié (%s) n'existe pas" @@ -5351,7 +5406,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "La sauvegarde que vous essayez de copier a une taille de fichier non valide" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5359,36 +5414,36 @@ msgstr "" "La langue sélectionnée n'est pas prise en charge par votre système. Retour à " "la langue par défaut du système." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Les versions NetPlay du serveur et du client sont incompatibles !" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Le serveur est plein !" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Le serveur a répondu que le jeu est déjà en cours d'exécution !" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Le serveur a envoyé un message d'erreur inconnu !" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Le fichier spécifié \"%s\" n'existe pas" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "La valeur n'est pas valide" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Thème :" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5396,7 +5451,7 @@ msgstr "" "Il doit y avoir un ticket pour 00000001/00000002. Votre copie de la NAND est " "probablement incomplète." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5404,7 +5459,7 @@ msgstr "" "Ces paramètres écrasent ceux de Dolphin.\n" "Indéterminé signifie que les paramètres de Dolphin sont appliqués." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5412,7 +5467,7 @@ msgstr "" "Ce simulateur d'Action Replay ne prend pas en charge les codes qui modifient " "l'Action Replay lui-même." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Ceci peut ralentir le Menu Wii et quelques jeux." @@ -5437,20 +5492,19 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Si vous définissez le limitateur de vitesse (Image /s max) à une valeur plus " -"élevée que la vitesse du jeu (NTSC:60, PAL:50), activer le contrôle audio " -"pour DSP (peut éliminer les clics audio mais peut causer un bruit constant " -"selon les jeux)." +"Ceci limite la vitesse du jeu au nombre spécifié d'images par seconde (60 i/" +"s pour le NTSC, 50 i/s pour le PAL). Vous pouvez à la place utiliser Audio " +"pour gérer via le DSP (peut éliminer les problèmes audio, mais peut " +"provoquer un bruit constant selon les jeux).²" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5463,7 +5517,7 @@ msgstr "" "qui plus d'un coeur, mais peut occasionnellement causer des petits pépins ou " "des plantages." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" "Ceci vous permettra de modifier manuellement le fichier de configuration INI" @@ -5473,12 +5527,12 @@ msgstr "" msgid "Threshold" msgstr "Seuil" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Tilt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Titre" @@ -5492,39 +5546,37 @@ msgid "Toggle All Log Types" msgstr "Activer tous les types de journaux" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Format d'écran :" +msgstr "Activer le ratio hauteur/largeur" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Copies de l'EFB" +msgstr "Activer les copies EFB" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Activer tous les types de journaux" +msgstr "Activer le brouillard" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Activer le plein écran" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Activer l'IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Haut" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chinois traditionnel" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Echec de chargement d'un type de fichier inconnu." @@ -5544,7 +5596,7 @@ msgstr "" "Essai de lecture à partir d'un SYSCONF non valide\n" "Les IDs BT de la Wiimote ne sont pas disponibles" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turque" @@ -5560,12 +5612,12 @@ msgstr "Type" msgid "UDP Port:" msgstr "Port UDP :" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "Wiimote UDP :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "Inconnu" @@ -5574,7 +5626,7 @@ msgstr "Inconnu" msgid "UNKNOWN_%02X" msgstr "Inconnu_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5587,9 +5639,9 @@ msgstr "" "L'entrée n'a pas été modifiée." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5597,7 +5649,7 @@ msgstr "" "décrypté valide. Veuillez vérifier que vous l'avez correctement tapé.\n" "Voulez-vous ignorer cette ligne et continuer l'analyse ?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "%i non défini" @@ -5607,19 +5659,18 @@ msgid "Undo Load State" msgstr "&Annuler le lancement d'état" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "&Annuler le lancement d'état" +msgstr "Annuler la sauvegarde de l'état" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Appel 0x80 inattendu. Abandon..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Inconnu" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Commande DVD inconnue %08x - erreur fatale" @@ -5634,12 +5685,12 @@ msgstr "Commande 0x%08x inconnue" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Type d'entrée %i inconnue dans SYSCONF (%s@%x) !" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Reception d'un message inconnu avec l'ID : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5650,16 +5701,16 @@ msgstr "" msgid "Up" msgstr "Haut" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Mettre à jour" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote debout" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Utiliser le mode EuRGB60 (PAL60)" @@ -5667,7 +5718,7 @@ msgstr "Utiliser le mode EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "&Plein écran" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Utiliser Hexa" @@ -5682,6 +5733,12 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Utiliser un algorithme moins précis pour calculer les valeurs de " +"profondeur.\n" +"Provoque des soucis dans quelques jeux mais peut donner une bonne " +"accélération.\n" +"\n" +"Dans le doute, cochez cette case." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5696,6 +5753,21 @@ msgstr "" "\n" "Dans le doute, décochez cette case." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Utilise des opérations peu sûres pour accélérer le streaming des vertex dans " +"OpenGL. Il n'y a pas de problèmes connus sur les GPU pris en charge, mais " +"dans le cas contraire il causera des problèmes sévères de stabilité et " +"graphiques . \n" +"\n" +"Dans le doute, décochez cette case." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5719,12 +5791,11 @@ msgstr "Utilitaires" msgid "V-Sync" msgstr "Synchro verticale" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Hack de vitesse pour le MMU" +msgstr "Hack de vitesse VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valeur" @@ -5732,9 +5803,9 @@ msgstr "Valeur" msgid "Value:" msgstr "Valeur :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " -msgstr "Valeur" +msgstr "Valeur :" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:38 msgid "Verbosity" @@ -5742,9 +5813,9 @@ msgstr "Niveau de détail" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hack de flux de vertex" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Vidéo" @@ -5752,19 +5823,19 @@ msgstr "Vidéo" msgid "Virtual" msgstr "Virtuel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volume" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" -msgstr "Echec de l'installation du WAD : erreur lors de la création de %s" +msgstr "Échec de l'installation du WAD : erreur lors de la création de %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" -msgstr "Echec de l'installation du WAD : erreur lors de la création du ticket" +msgstr "Échec de l'installation du WAD : erreur lors de la création du ticket" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:84 msgid "" @@ -5784,19 +5855,19 @@ msgstr "" msgid "Warning" msgstr "Attention" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Attention : démarrage du DOL dans un mauvais mode de console !" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Attention : démarrage de l'ELF dans un mauvais mode de console !" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Attention : démarrage d\" l'ISO dans un mauvais mode de console !" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5822,7 +5893,7 @@ msgstr "" "et vont avoir le même nom que le fichier sur votre carte mémoire\n" "Continuer ?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5834,7 +5905,7 @@ msgstr "" "autre sauvegarde avant de continuer, ou charger cette sauvegarde en " "désactivant le mode Lecture seule." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5846,7 +5917,7 @@ msgstr "" "charger cet état en désactivant le mode Lecture seule. Dans le cas " "contraire, il y aura probablement une désynchronisation." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5901,19 +5972,15 @@ msgstr "Largeur" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Console Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Racine de la NAND (Wii) :" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importer une sauvegarde Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Fichiers de sauvegarde Wii (*.bin)|*.bin" @@ -5922,16 +5989,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD : impossible de lire le fichier" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote connectée" @@ -5939,7 +6012,7 @@ msgstr "Wiimote connectée" msgid "Wiimote Motor" msgstr "Vibreur de la Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Paramètres de la Wiimote" @@ -5963,47 +6036,62 @@ msgstr "Windows Droit" msgid "Word Wrap" msgstr "Casse" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Travail..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Écriture carte mémoire (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" -msgstr "Ecrire dans la console" +msgstr "Écrire dans la console" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:54 msgid "Write to Debugger" -msgstr "Ecrire dans le débugueur" +msgstr "Écrire dans le débugueur" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:44 msgid "Write to File" -msgstr "Ecrire dans le fichier" +msgstr "Écrire dans le fichier" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:48 msgid "Write to Window" -msgstr "Ecrire dans la fenêtre" +msgstr "Écrire dans la fenêtre" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" -msgstr "Echec de XAudio2 CreateSourceVoice : %#X" +msgstr "Échec de XAudio2 CreateSourceVoice : %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" -msgstr "Echec de l'initialisation de XAudio2 : %#X" +msgstr "Échec de l'initialisation de XAudio2 : %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" -msgstr "Echec de la création de la voix principale dans XAudio2 : %#X" +msgstr "Échec de la création de la voix principale dans XAudio2 : %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "Échec de XAudio2 CreateSourceVoice : %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Échec de l'initialisation de XAudio2 : %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Échec de la création de la voix principale dans XAudio2 : %#X" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" @@ -6041,11 +6129,11 @@ msgstr "Vous ne pouvez pas fermer des panneaux contenant des appels." msgid "You must choose a game!!" msgstr "Vous devez choisir un jeu !!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Vous devez entrer un nom !" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Vous devez entrer une valeur décimale, hexadécimale ou octale valide." @@ -6053,7 +6141,7 @@ msgstr "Vous devez entrer une valeur décimale, hexadécimale ou octale valide." msgid "You must enter a valid profile name." msgstr "Vous devez entrer un profil de nom valide." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Vous devez redémarrer Dolphin pour que ce changement prenne effet." @@ -6067,7 +6155,7 @@ msgstr "" "Voulez-vous arrêter l'émulation maintenant pour corriger le problème ?\n" "Si vous choisissez \"Non\", l'audio pourra être déformé." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6086,15 +6174,15 @@ msgstr "" "Il devrait être de 0x%04x (au lieu de 0x%04llx).\n" "Voulez-vous en générer un nouveau ?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" -msgstr "ZTP hack" +msgstr "Hack ZTP" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Code Zero 3 non pris en charge" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero code inconnu pour Dolphin : %08x" @@ -6153,20 +6241,24 @@ msgstr "" "\n" "Dans le doute, décochez cette case." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT : Lecture de l'Opcode depuis %x. Merci de nous le signaler." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "flavor inconnu %d (%d attendu)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "Message inconnu reçu" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute a retourné -1 sur l'exécution de l'application !" @@ -6180,78 +6272,52 @@ msgstr "Correction zNear :" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:545 msgid "| OR" -msgstr "| OR" +msgstr "| OU" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulation fidèle VBeam" +#~ msgid "Could not create %s" +#~ msgstr "Impossible de créer %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Modifier les paramètres personnalisés" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Ouvre la configuration personnalisée pour ce jeu dans un éditeur de texte " +#~ "externe" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Permet d'activer certaines options via les raccourcis clavier dans la " -#~ "fenêtre d'émulation : 3 (résolution interne), 4 (ratio d'image), 5 (Copie " -#~ "d'EFB), et 6 (Brouillard) .\n" +#~ "Sélectionne quel moteur graphique doit être utilisé en interne.\n" +#~ "Direct3D 9 est généralement le plus rapide. OpenGL est le plus précis. " +#~ "Direct3D 11 est entre les deux.\n" +#~ "Les moteurs Direct3D ne sont disponibles que pour Windows.\n" #~ "\n" -#~ "Dans le doute, décochez cette case." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "" -#~ "Impossible de trouver la Wiimote par bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Activer les touches de raccourci" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Ecoute impossible !" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Impossible de charger bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Impossible de charger hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Configuration du micro GC" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "Appel de HCI_CMD_INQUIRY, veuillez nous le signaler !" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hack de Transmission du Buffer" +#~ "Dans le doute, sélectionnez Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Si les FPS ne sont pas corrects, cette option peut résoudre le souci. (ON " -#~ "= Compatible, OFF = Vitesse)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Dernier état écrasé" - -#~ msgid "Last Saved State" -#~ msgstr "Dernier état sauvegardé" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Reconnecter la Wiimote lors du chargement d'un état" - -#~ msgid "Set" -#~ msgstr "Paramétrer" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Ignorer Passe Alpha de dest." - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Utiliser une stratégie hackée d'envoi pour transmettre les sommets.\n" -#~ "Cela permet d'accélérer le rendu, mais est interdit par les " -#~ "spécifications d'OpenGL et peut provoquer de gros bugs graphiques.\n" +#~ "Sélectionne quel moteur graphique doit être utilisé en interne.\n" +#~ "Direct3D 9 est généralement le plus rapide. OpenGL est le plus précis. " +#~ "Direct3D 11 est entre les deux.\n" +#~ "Les moteurs Direct3D ne sont disponibles que pour Windows.\n" #~ "\n" -#~ "Dans le doute, décochez cette case." +#~ "Dans le doute, sélectionnez OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "" +#~ "iCacheJIT : Lecture de l'Opcode depuis %x. Merci de nous le signaler." diff --git a/Languages/po/he.po b/Languages/po/he.po index 3206b17564..e84837fbf8 100644 --- a/Languages/po/he.po +++ b/Languages/po/he.po @@ -8,23 +8,24 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" "Last-Translator: delroth \n" -"Language-Team: LANGUAGE \n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/dolphin-emu/" +"language/he/)\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(×רוך מידי)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "משחק:" @@ -32,14 +33,14 @@ msgstr "משחק:" msgid "! NOT" msgstr "! ל×" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" " Create a new 16MB Memcard?" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -54,64 +55,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "%1$sהעתק%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -140,7 +146,7 @@ msgstr "" msgid "&& AND" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&×ודות" @@ -148,7 +154,7 @@ msgstr "&×ודות" msgid "&Boot from DVD Drive..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "" @@ -156,7 +162,7 @@ msgstr "" msgid "&Browse for ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "" @@ -164,11 +170,11 @@ msgstr "" msgid "&DSP Settings" msgstr "הגדרות קול" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "" @@ -180,11 +186,11 @@ msgstr "" msgid "&File" msgstr "&קובץ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&מסך מל×" @@ -192,7 +198,7 @@ msgstr "&מסך מל×" msgid "&Graphics Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&עזרה" @@ -200,7 +206,7 @@ msgstr "&עזרה" msgid "&Hotkey Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "" @@ -212,11 +218,11 @@ msgstr "" msgid "&Memcard Manager (GC)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "" @@ -224,51 +230,51 @@ msgstr "" msgid "&Options" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&שחק" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&קול" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&עצור" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "" @@ -276,7 +282,7 @@ msgstr "" msgid "&Wiimote Settings" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "" @@ -312,7 +318,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "" @@ -328,7 +334,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "" @@ -344,7 +350,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "" @@ -356,7 +362,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -364,7 +370,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -373,12 +379,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "" @@ -397,23 +403,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "" @@ -452,66 +457,66 @@ msgid "" "%s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "" @@ -525,11 +530,11 @@ msgstr "" msgid "Add" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "" @@ -537,9 +542,9 @@ msgstr "" msgid "Add new pane" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "" @@ -581,32 +586,32 @@ msgstr "" msgid "Advanced Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "" @@ -626,19 +631,19 @@ msgstr "" msgid "Anti-Aliasing:" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "" @@ -649,7 +654,7 @@ msgid "" "If unsure, select (off)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "" @@ -658,21 +663,25 @@ msgstr "" msgid "Are you sure you want to delete \"%s\"?" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "" @@ -681,12 +690,12 @@ msgstr "" msgid "At least one pane must remain open." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "" @@ -694,7 +703,7 @@ msgstr "" msgid "AudioCommon: Error opening AO device.\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "" @@ -730,16 +739,16 @@ msgstr "" msgid "Back" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "" @@ -748,7 +757,7 @@ msgstr "" msgid "Backward" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "" @@ -757,15 +766,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "" @@ -785,7 +794,7 @@ msgstr "" msgid "Bass" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "" @@ -806,7 +815,7 @@ msgid "Blue Right" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "" @@ -815,27 +824,27 @@ msgstr "" msgid "Bound Controls: %lu" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "" @@ -845,7 +854,7 @@ msgstr "" msgid "Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -884,33 +893,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -918,7 +927,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -928,7 +937,7 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "" @@ -936,11 +945,11 @@ msgstr "" msgid "Center" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "" @@ -948,11 +957,11 @@ msgstr "" msgid "Change Disc" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -966,11 +975,11 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "" @@ -978,47 +987,47 @@ msgstr "" msgid "Cheat Code" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "" @@ -1026,14 +1035,14 @@ msgstr "" msgid "Choose a memory card:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "" @@ -1052,7 +1061,7 @@ msgstr "" msgid "Clear" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1060,7 +1069,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "" @@ -1069,11 +1078,11 @@ msgstr "" msgid "Co&nfigure..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "" @@ -1085,24 +1094,24 @@ msgstr "" msgid "Comment" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "" @@ -1116,18 +1125,18 @@ msgstr "" msgid "Configure Control" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "" @@ -1140,16 +1149,16 @@ msgstr "" msgid "Connect" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 msgid "Connect Balance Board" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "" @@ -1170,7 +1179,7 @@ msgstr "" msgid "Connect Wiimote 4" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "" @@ -1190,7 +1199,7 @@ msgstr "" msgid "Convert to GCI" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "" @@ -1199,21 +1208,16 @@ msgstr "" msgid "Copy to Memcard %c" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1221,22 +1225,16 @@ msgid "" "most PC DVD drives." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1250,27 +1248,27 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "" @@ -1302,12 +1300,12 @@ msgstr "" msgid "Crossfade" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "" @@ -1315,11 +1313,11 @@ msgstr "" msgid "Custom Projection Hack Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "" @@ -1331,36 +1329,36 @@ msgstr "" msgid "D-Pad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "קול" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "הגדרות קול" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "" @@ -1372,15 +1370,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "" @@ -1409,16 +1407,16 @@ msgstr "" msgid "Decimal" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "" @@ -1430,7 +1428,7 @@ msgstr "" msgid "Default" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "" @@ -1472,8 +1470,8 @@ msgstr "" msgid "Device" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "" @@ -1481,15 +1479,11 @@ msgstr "" msgid "Dial" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +msgid "Direct3D" msgstr "" -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" -msgstr "" - -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1535,7 +1529,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "" @@ -1559,24 +1553,59 @@ msgstr "" msgid "Divide" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "" @@ -1592,12 +1621,12 @@ msgstr "" msgid "Dolphin FIFO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "" @@ -1605,28 +1634,28 @@ msgstr "" msgid "Dolphin Wiimote Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" @@ -1650,11 +1679,11 @@ msgstr "" msgid "Drums" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "" @@ -1691,9 +1720,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "" @@ -1714,7 +1743,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "" @@ -1722,7 +1751,7 @@ msgstr "" msgid "Early Memory Updates" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "" @@ -1730,7 +1759,7 @@ msgstr "" msgid "Edit ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "" @@ -1738,12 +1767,12 @@ msgstr "" msgid "Edit Patch" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "" @@ -1755,7 +1784,7 @@ msgstr "" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "" @@ -1782,7 +1811,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "" @@ -1800,15 +1829,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1820,7 +1849,7 @@ msgstr "" msgid "Enable Cheats" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "" @@ -1828,7 +1857,7 @@ msgstr "" msgid "Enable Dual Core (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "" @@ -1836,7 +1865,7 @@ msgstr "" msgid "Enable Idle Skipping (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "" @@ -1844,7 +1873,7 @@ msgstr "" msgid "Enable Progressive Scan" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "" @@ -1852,7 +1881,7 @@ msgstr "" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "" @@ -1869,7 +1898,7 @@ msgid "" "If unsure, select 1x." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1895,31 +1924,25 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -1930,7 +1953,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -1947,9 +1970,9 @@ msgstr "" msgid "End" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "" @@ -1972,21 +1995,20 @@ msgstr "" msgid "Entry 1/%d" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2009,7 +2031,6 @@ msgid "Euphoria" msgstr "" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2018,16 +2039,20 @@ msgstr "" msgid "Execute" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "" @@ -2035,7 +2060,7 @@ msgstr "" msgid "Export Recording" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "" @@ -2043,7 +2068,7 @@ msgstr "" msgid "Export Save" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "" @@ -2051,15 +2076,15 @@ msgstr "" msgid "Export all saves" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "" @@ -2075,44 +2100,44 @@ msgstr "" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "" @@ -2124,15 +2149,15 @@ msgstr "" msgid "FIFO Player" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "" @@ -2140,11 +2165,15 @@ msgstr "" msgid "Failed to download codes." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2172,20 +2201,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2193,73 +2222,78 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "" @@ -2271,17 +2305,17 @@ msgstr "" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "" @@ -2303,7 +2337,7 @@ msgid "" "or does not have a valid extension" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2314,20 +2348,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "" @@ -2379,14 +2413,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2405,6 +2439,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2446,9 +2485,9 @@ msgstr "" msgid "Free Look" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "" @@ -2461,7 +2500,7 @@ msgstr "" msgid "From" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "" @@ -2473,7 +2512,7 @@ msgstr "" msgid "GCI File(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "" @@ -2481,27 +2520,27 @@ msgstr "" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "" @@ -2518,20 +2557,20 @@ msgid "Gamecube &Pad Settings" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2550,26 +2589,26 @@ msgstr "" msgid "General Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "" @@ -2584,7 +2623,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "" @@ -2608,11 +2647,11 @@ msgstr "" msgid "Hacks" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "" @@ -2624,7 +2663,7 @@ msgstr "" msgid "Help" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2636,7 +2675,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2679,7 +2718,7 @@ msgstr "" msgid "Hotkeys" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "" @@ -2687,29 +2726,29 @@ msgstr "" msgid "Hybrid Wiimote" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "" @@ -2721,15 +2760,15 @@ msgstr "" msgid "IR Sensitivity:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "" @@ -2737,7 +2776,7 @@ msgstr "" msgid "Icon" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2769,8 +2808,12 @@ msgstr "" msgid "Import Save" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 @@ -2789,20 +2832,16 @@ msgid "" "but does not have a correct header" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 msgid "Increase Frame limit" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "" @@ -2822,7 +2861,7 @@ msgstr "" msgid "Insert Encrypted or Decrypted code here..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "" @@ -2830,36 +2869,37 @@ msgstr "" msgid "Insert name here.." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2870,7 +2910,7 @@ msgstr "" msgid "Interface" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "" @@ -2893,20 +2933,20 @@ msgstr "" msgid "Internal Resolution:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "" @@ -2914,16 +2954,16 @@ msgstr "" msgid "Invalid bat.map or dir entry" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -2931,7 +2971,7 @@ msgid "" " You may need to redump this game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "" @@ -2947,34 +2987,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "" @@ -2993,8 +3035,9 @@ msgstr "" msgid "Key" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "" @@ -3016,12 +3059,12 @@ msgstr "" msgid "Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3053,7 +3096,7 @@ msgid "" "Middle-click to clear." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "" @@ -3145,15 +3188,15 @@ msgstr "" msgid "Load State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "" @@ -3169,10 +3212,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "" @@ -3201,12 +3240,12 @@ msgstr "" msgid "Logger Outputs" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "" @@ -3214,14 +3253,14 @@ msgstr "" msgid "M Button" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "" @@ -3235,11 +3274,11 @@ msgstr "" msgid "Main Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "" @@ -3270,7 +3309,7 @@ msgid "Memory Byte" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "" @@ -3280,7 +3319,7 @@ msgid "" "could mangle stuff!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3291,7 +3330,7 @@ msgid "" "Would you like to copy the old file to this new location?\n" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3299,7 +3338,7 @@ msgstr "" msgid "Menu" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "" @@ -3312,7 +3351,7 @@ msgstr "" msgid "Misc" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "" @@ -3333,11 +3372,11 @@ msgstr "" msgid "Monospaced font" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "" @@ -3449,15 +3488,15 @@ msgstr "" msgid "NP Up" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "" @@ -3467,7 +3506,7 @@ msgstr "" msgid "Native GCI files(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "" @@ -3476,7 +3515,7 @@ msgstr "" msgid "Next Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "" @@ -3484,11 +3523,11 @@ msgstr "" msgid "Nickname :" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "" @@ -3496,7 +3535,7 @@ msgstr "" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "" @@ -3522,42 +3561,43 @@ msgstr "" msgid "No recorded file" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "" @@ -3578,7 +3618,7 @@ msgstr "" msgid "Num Lock" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "" @@ -3599,7 +3639,7 @@ msgstr "" msgid "Object Range" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "" @@ -3611,25 +3651,29 @@ msgstr "" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "" @@ -3655,7 +3699,13 @@ msgstr "" msgid "OpenMP Texture Decoder" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "" @@ -3676,7 +3726,7 @@ msgstr "" msgid "Other" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3686,15 +3736,15 @@ msgstr "" msgid "Output" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "" @@ -3718,17 +3768,17 @@ msgstr "" msgid "Parameters" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "" @@ -3736,8 +3786,8 @@ msgstr "" msgid "Paths" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "" @@ -3750,7 +3800,7 @@ msgstr "" msgid "Per-Pixel Lighting" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "" @@ -3760,9 +3810,9 @@ msgid "Perspective %d" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "" @@ -3774,7 +3824,7 @@ msgstr "" msgid "Play/Pause" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "" @@ -3782,11 +3832,11 @@ msgstr "" msgid "Playback Options" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "" @@ -3798,23 +3848,23 @@ msgstr "" msgid "Plus-Minus" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "" @@ -3823,11 +3873,11 @@ msgstr "" msgid "Port :" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "" @@ -3835,17 +3885,17 @@ msgstr "" msgid "Post-Processing Effect:" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3862,7 +3912,7 @@ msgstr "" msgid "Previous Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "" @@ -3878,7 +3928,7 @@ msgstr "" msgid "Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "" @@ -3887,7 +3937,7 @@ msgid "Question" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "" @@ -3909,7 +3959,7 @@ msgstr "" msgid "RAM" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "" @@ -3948,6 +3998,10 @@ msgstr "" msgid "Record" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "" @@ -3978,7 +4032,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "" @@ -3987,14 +4041,14 @@ msgstr "" msgid "Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "" @@ -4014,7 +4068,7 @@ msgstr "" msgid "Reset" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "" @@ -4022,7 +4076,7 @@ msgstr "" msgid "Return" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4035,18 +4089,17 @@ msgstr "" msgid "Right Stick" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "" @@ -4059,7 +4112,7 @@ msgid "Safe" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "" @@ -4116,28 +4169,28 @@ msgstr "" msgid "Save State Slot 9" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4146,20 +4199,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "" @@ -4171,11 +4224,11 @@ msgstr "" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "" @@ -4198,12 +4251,12 @@ msgstr "" msgid "Select" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "" @@ -4222,19 +4275,19 @@ msgstr "" msgid "Select floating windows" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "" @@ -4249,7 +4302,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4267,27 +4320,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "" @@ -4299,16 +4353,16 @@ msgstr "" msgid "Separator" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "" @@ -4317,7 +4371,7 @@ msgstr "" msgid "Set as default Memcard %c" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4328,19 +4382,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "" @@ -4348,23 +4402,27 @@ msgstr "" msgid "Shoulder Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "" @@ -4376,11 +4434,11 @@ msgstr "" msgid "Show FPS" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "" @@ -4388,35 +4446,35 @@ msgstr "" msgid "Show Input Display" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "" @@ -4424,27 +4482,27 @@ msgstr "" msgid "Show Statistics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4459,7 +4517,7 @@ msgstr "" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4490,7 +4548,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "" @@ -4501,23 +4559,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4535,17 +4594,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "" @@ -4553,7 +4612,7 @@ msgstr "" msgid "Snapshot" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "" @@ -4565,27 +4624,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 #, c-format -msgid "Sound buffer creation failed: %s" +msgid "Sound buffer creation failed: %08x" msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "" @@ -4605,37 +4664,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "" @@ -4643,7 +4694,7 @@ msgstr "" msgid "Start Recording" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "" @@ -4651,7 +4702,7 @@ msgstr "" msgid "State Saves" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -4660,7 +4711,7 @@ msgid "Stick" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "" @@ -4686,39 +4737,40 @@ msgstr "" msgid "Subtract" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "" @@ -4743,13 +4795,13 @@ msgstr "" msgid "Table Right" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -4769,11 +4821,11 @@ msgstr "" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "" @@ -4781,13 +4833,13 @@ msgstr "" msgid "The checksum was successfully fixed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4806,7 +4858,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "" @@ -4835,60 +4887,60 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" @@ -4904,7 +4956,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -4912,7 +4964,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -4920,7 +4972,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" @@ -4929,12 +4981,12 @@ msgstr "" msgid "Threshold" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "" @@ -4959,7 +5011,7 @@ msgstr "" msgid "Toggle Fog" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "" @@ -4969,15 +5021,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "" @@ -4995,7 +5048,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "" @@ -5011,12 +5064,12 @@ msgstr "" msgid "UDP Port:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "" @@ -5025,7 +5078,7 @@ msgstr "" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "" @@ -5038,12 +5091,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "" @@ -5060,11 +5113,11 @@ msgstr "" msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "" @@ -5079,12 +5132,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5094,16 +5147,16 @@ msgstr "" msgid "Up" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "" @@ -5111,7 +5164,7 @@ msgstr "" msgid "Use Fullscreen" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "" @@ -5135,6 +5188,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5152,11 +5214,11 @@ msgstr "" msgid "V-Sync" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "" @@ -5164,7 +5226,7 @@ msgstr "" msgid "Value:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "" @@ -5176,7 +5238,7 @@ msgstr "" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "" @@ -5184,17 +5246,17 @@ msgstr "" msgid "Virtual" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5212,19 +5274,19 @@ msgstr "" msgid "Warning" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5241,7 +5303,7 @@ msgid "" "Continue?" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5249,7 +5311,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5257,7 +5319,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5297,19 +5359,15 @@ msgstr "" msgid "Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "" @@ -5318,16 +5376,21 @@ msgid "WiiWAD: Could not read from file" msgstr "" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +msgid "Wiimote " +msgstr "" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "" @@ -5335,7 +5398,7 @@ msgstr "" msgid "Wiimote Motor" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "" @@ -5359,14 +5422,14 @@ msgstr "" msgid "Word Wrap" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5386,21 +5449,36 @@ msgstr "" msgid "Write to Window" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5430,11 +5508,11 @@ msgstr "" msgid "You must choose a game!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" @@ -5442,7 +5520,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" @@ -5453,7 +5531,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5467,15 +5545,15 @@ msgid "" "Do you want to generate a new one?" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "" @@ -5517,20 +5595,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "" - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "" diff --git a/Languages/po/hu.po b/Languages/po/hu.po index 3c65c5be09..46bb8ee213 100644 --- a/Languages/po/hu.po +++ b/Languages/po/hu.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: Delirious \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/dolphin-emu/" "language/hu/)\n" "Language: hu\n" @@ -20,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr " (túl sok kijelzÅ‘)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Játék:" @@ -34,7 +34,7 @@ msgstr "Játék:" msgid "! NOT" msgstr "! NEM" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +43,7 @@ msgstr "" "Nincs \"%s\".\n" " Létrehozol egy új 16 MB-os memóriakártyát?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" egy érvénytelen GCM/ISO fájl, vagy nem GC/Wii ISO." @@ -58,28 +58,28 @@ msgstr "%08X:" msgid "%1$sCopy%1$s" msgstr "%1$sMásolás%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s már van, felülírod?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s tisztítása sikertelen. Valószínűleg a képfájl sérült." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -88,7 +88,7 @@ msgstr "" "%s memóriakártyakénti betöltése sikertelen\n" " A kártya fájlmérete nem megfelelÅ‘ (0x%x bájt)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -97,7 +97,7 @@ msgstr "" "%s memóriakártyakénti betöltése sikertelen\n" " A kártya mérete nem megfelelÅ‘ (0x%x bájt)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -107,22 +107,27 @@ msgstr "" "a fájl nem elég nagy ahhoz, hogy megfelelÅ‘ memóriakártya fájl lehessen (0x%x " "bájt)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s megnyitása sikertelen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s egy 0 bájt méretű fájl" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s már tömörítve van! Nem tömöríthetÅ‘ tovább." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s túl hossz fájlnévnek, maximum 45 karakter" @@ -151,7 +156,7 @@ msgstr "%u szabad blokk; %u szabad könyvtár bejegyzés" msgid "&& AND" msgstr "&& ÉS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Névjegy..." @@ -159,7 +164,7 @@ msgstr "&Névjegy..." msgid "&Boot from DVD Drive..." msgstr "&Bootolás DVD meghajtóról..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Töréspontok" @@ -167,7 +172,7 @@ msgstr "&Töréspontok" msgid "&Browse for ISOs..." msgstr "&ISO fájlok tallózása..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Csalás kezelÅ‘" @@ -175,11 +180,11 @@ msgstr "&Csalás kezelÅ‘" msgid "&DSP Settings" msgstr "&Hang beállítások" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&ISO törlése..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&A kiválasztott ISO fájlok törlése..." @@ -191,11 +196,11 @@ msgstr "&Emuláció" msgid "&File" msgstr "&Fájl" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Képkocka léptetés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Teljes nézet" @@ -203,7 +208,7 @@ msgstr "&Teljes nézet" msgid "&Graphics Settings" msgstr "&Grafikai beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Súgó" @@ -211,7 +216,7 @@ msgstr "&Súgó" msgid "&Hotkey Settings" msgstr "&Gyorsbillentyű beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -223,11 +228,11 @@ msgstr "&Ãllás betöltése" msgid "&Memcard Manager (GC)" msgstr "&Memóriakártya kezelÅ‘ (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memória" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Megnyitás..." @@ -235,51 +240,51 @@ msgstr "&Megnyitás..." msgid "&Options" msgstr "&Beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Szünet" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Indítás" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Tulajdonságok" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Ãrásvédett mód" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&A lista frissítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Regiszterek" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Alapra állítás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Hang" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Leállítás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Eszközök" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Kép" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Nézet" @@ -287,7 +292,7 @@ msgstr "&Nézet" msgid "&Wiimote Settings" msgstr "&Wiimote beállítások" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -312,9 +317,8 @@ msgid "(off)" msgstr "(ki)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ HOZZÃADÃS" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -324,7 +328,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -340,7 +344,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -356,7 +360,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -368,7 +372,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -376,7 +380,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -385,12 +389,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Már egy NetPlay ablak nyitva van!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "A játék jelenleg nem fut." @@ -403,7 +407,6 @@ msgstr "" "Kézileg kell csatlakoztatni a Wiimote irányítókat." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -412,39 +415,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"FIGYELEM:\n" -"\n" -"A NetPlay jelenleg csak a következÅ‘ beállítások használatával működik " -"megfelelÅ‘en:\n" -" - Kétmagos mód [KI]\n" -" - Hang szabályozás [KI]\n" -" - DSP-HLE \"Null Audio\" használatával vagy DSP-LLE\n" -" - Kézileg legyen beállítva az irányítók pontos száma, amik használva " -"lesznek, mint [szabvány irányító]\n" -"\n" -"Minden játékosnak azonos Dolphin verziót és beállításokat kell használnia.\n" -"Legyen minden memóriakártya kikapcsolva vagy mindenkinek továbbítani kell a " -"játék megkezdése elÅ‘tt.\n" -"Wiimote támogatás még nem működik.\n" -"\n" -"Továbbítani kell a TCP portot a host számára!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM alaplap" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR kódok" @@ -493,7 +479,7 @@ msgstr "" "FelelÅ‘s kód:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -501,7 +487,7 @@ msgstr "" "Action Replay hiba: érvénytelen méret (%08x : address = %08x) a kód " "hozzáadásban (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -510,7 +496,7 @@ msgstr "" "Action Replay hiba: érvénytelen méret (%08x : address = %08x) a kitöltésben " "és regiszterben (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -519,7 +505,7 @@ msgstr "" "Action Replay hiba: érvénytelen méret (%08x : address = %08x) a RAM írásban " "és kitöltésben (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -528,12 +514,12 @@ msgstr "" "Action Replay hiba: érvénytelen méret (%08x : address = %08x) a mutató " "írásában (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay hiba: érvénytelen érték (%08x) a memória másolásban (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -542,27 +528,27 @@ msgstr "" "Action Replay hiba: Mester kód és CCXXXXXX írása nincs beépítve (%s)\n" "Mester kódokra nincs szükség. Ne használj mester kódokat." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay hiba: érvénytelen AR kód a(z) %s. sorban" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Feltételes kód: Érvénytelen méret %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Érvénytelen szabályszerű kód típus %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Szabályszerű kód %i: Érvénytelen alfaj %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Szabályszerű kód 0: Érvénytelen alfaj %08x (%s)" @@ -576,11 +562,11 @@ msgstr "Adapter:" msgid "Add" msgstr "Hozzáadás" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "ActionReplay kód hozzáadása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Patch hozzáadása" @@ -588,9 +574,9 @@ msgstr "Patch hozzáadása" msgid "Add new pane" msgstr "Új mezÅ‘ hozzáadása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Hozzáadás..." @@ -648,32 +634,32 @@ msgstr "Haladó" msgid "Advanced Settings" msgstr "Haladó beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Minden GC/Wii fájl (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Minden GC/Wii képfájl (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Minden Gamecube GCM fájl (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Minden állásmentés (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Minden Wii ISO fájl (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Minden tömörített GC/Wii ISO fájl (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Minden fájl (*.*)|*.*" @@ -693,20 +679,20 @@ msgstr "Anizotrópikus szűrés:" msgid "Anti-Aliasing:" msgstr "Élsimítás:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" "A betöltÅ‘ program nem megfelelÅ‘ méretű...ez tényleg egy betöltÅ‘ program?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "A betöltÅ‘ program nem képes fájlból betölteni" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "BetöltÅ‘ program:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Alkalmaz" @@ -720,7 +706,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, válaszd ezt: (ki)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arab" @@ -729,7 +715,7 @@ msgstr "Arab" msgid "Are you sure you want to delete \"%s\"?" msgstr "Biztos törlöd ezt: \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -737,15 +723,20 @@ msgstr "" "Biztos törlöd ezeket a fájlokat?\n" "Végleg el fognak veszni!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Biztos törlöd ezt a fájlt? Végleg el fog veszni!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (kísérleti)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (kísérleti)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Képarány:" @@ -754,12 +745,12 @@ msgstr "Képarány:" msgid "At least one pane must remain open." msgstr "Legalább egy mezÅ‘nek megnyitva kell maradnia." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Hang" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Hang feldolgozó:" @@ -767,7 +758,7 @@ msgstr "Hang feldolgozó:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Hiba az AO eszköz megnyitásakor.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automatikus" @@ -806,16 +797,16 @@ msgstr "BP regiszter " msgid "Back" msgstr "Hátra" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Feldolgozó beállításai" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Feldolgozó:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Háttér bemenet" @@ -824,7 +815,7 @@ msgstr "Háttér bemenet" msgid "Backward" msgstr "Vissza" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Rossz fájl fejléc" @@ -833,15 +824,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Játék kép" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Játék kép részletek" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Játék kép:" @@ -861,7 +852,7 @@ msgstr "Alap beállítások" msgid "Bass" msgstr "Basszus" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Block Allocation Table ellenÅ‘rzÅ‘ összege nem megfelelÅ‘" @@ -882,7 +873,7 @@ msgid "Blue Right" msgstr "Kék jobbra" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Gomb" @@ -891,27 +882,27 @@ msgstr "Gomb" msgid "Bound Controls: %lu" msgstr "Összekötött irányítások: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Hibás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Tallózás" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Hozzáadandó könyvtár tallózása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Egy ISO könyvtár tallózása..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Kimeneti könyvtár tallózása" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Puffer:" @@ -921,7 +912,7 @@ msgstr "Puffer:" msgid "Buttons" msgstr "Gombok" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -968,33 +959,33 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Mégse" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "%s nem nyitható meg" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Nem lehet esemény bejegyzéseket törölni függÅ‘ben lévÅ‘ eseményekkel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1005,7 +996,7 @@ msgstr "" "%s\n" "fájl nem megfelelÅ‘ GameCube memóriakártya fájl" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1017,7 +1008,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Katalán" @@ -1025,11 +1016,11 @@ msgstr "Katalán" msgid "Center" msgstr "Közép" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Váltás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Lemez &váltás..." @@ -1037,11 +1028,11 @@ msgstr "Lemez &váltás..." msgid "Change Disc" msgstr "Lemez váltás" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Játék váltás" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1057,11 +1048,11 @@ msgstr "Megváltoztatja a zFar paraméterhez tartozó jegyet (javítás után)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Megváltoztatja a zNear paraméterhez tartozó jegyet (javítás után)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "A változtatások nem érvényesülnek ameddig fut az emulátor!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Csevegés" @@ -1069,47 +1060,47 @@ msgstr "Csevegés" msgid "Cheat Code" msgstr "Csalás kód" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Csalás keresés" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Csalás kezelÅ‘" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Partíció integritás ellenÅ‘rzés" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Integritás ellenÅ‘rzés..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Kínai (egyszerűsített)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Kínai (hagyományos)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Válassz DVD gyökér könyvtárat:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Válassz NAND gyökér könyvtárat:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Válassz alapértelmezett ISO fájlt:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Válassz hozzáadandó könyvtárat" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Válasz megnyitandó fájl" @@ -1117,7 +1108,7 @@ msgstr "Válasz megnyitandó fájl" msgid "Choose a memory card:" msgstr "Válassz memóriakártyát:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1125,8 +1116,8 @@ msgstr "" "Válassz betöltÅ‘ programnak használandó fájlt: (csak könyvtárakból " "létrehozott lemezekre érvényesíthetÅ‘)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Válassz mappát a kitömörítéshez" @@ -1145,7 +1136,7 @@ msgstr "Klasszikus" msgid "Clear" msgstr "Törlés" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1155,7 +1146,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Bezárás" @@ -1164,11 +1155,11 @@ msgstr "Bezárás" msgid "Co&nfigure..." msgstr "Be&állítások..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Kód infó" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kód:" @@ -1180,24 +1171,24 @@ msgstr "Parancs" msgid "Comment" msgstr "Megjegyzés" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Megjegyzés:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "ISO tömörítése..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Kiválasztott ISO tömörítése..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "ISO tömörítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Beállítások" @@ -1211,18 +1202,18 @@ msgstr "Beállítások" msgid "Configure Control" msgstr "Irányítás beállítás" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Irányítók beállítása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Beállítások..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Fájl felülírás jóváhagyása" @@ -1235,17 +1226,16 @@ msgstr "Kilépéskor megerÅ‘sítés" msgid "Connect" msgstr "Csatlakozás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "USB billentyűzet csatlakoztatása" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "USB billentyűzet csatlakoztatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "%i Wiimote csatlakoztatása" @@ -1266,7 +1256,7 @@ msgstr "Wiimote 3 csatlakoztatása" msgid "Connect Wiimote 4" msgstr "Wiimote 4 csatlakoztatása" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Csatlakozás..." @@ -1286,7 +1276,7 @@ msgstr "Irányítás" msgid "Convert to GCI" msgstr "Konvertálás: GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Másolás sikertelen" @@ -1295,21 +1285,16 @@ msgstr "Másolás sikertelen" msgid "Copy to Memcard %c" msgstr "%c. memóriakártyára másolás" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Mag" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "%s nem hozható létre" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "%s hang feldolgozó iniciálása sikertelen." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1320,24 +1305,16 @@ msgstr "" "biztonsági mentés. Célszerű tudni, hogy az eredeti Gamecube és Wii " "lemezeket a legtöbb számítógépes DVD meghajtó nem képes olvasni." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "%s ISO fájl nem ismerhetÅ‘ fel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "%s nem menthetÅ‘ el" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Irányítók beállítása nem sikerült. A játékos kilépett vagy a játék épp fut!\n" -"(irányítók beállítása még nem támogatott miközben a játék fut)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1351,11 +1328,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Az 'ini' kiterjesztéshez nem található nyitott parancs!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1363,17 +1340,17 @@ msgstr "" "A mag nem iniciálható.\n" "EllenÅ‘rizd a beállításokat." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Számláló:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Ország:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "AR kód létrehozása" @@ -1408,12 +1385,12 @@ msgstr "" msgid "Crossfade" msgstr "Kereszthalkítás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Egyedi megjelenítési hack" @@ -1421,11 +1398,11 @@ msgstr "Egyedi megjelenítési hack" msgid "Custom Projection Hack Settings" msgstr "Egyedi megjelenítési hack beállítások" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Néhány ortografikus megjelenítési paraméter egyedi beállítása." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Cseh" @@ -1437,36 +1414,36 @@ msgstr "D" msgid "D-Pad" msgstr "Digitális irányok" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "Hang" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP emulátor motor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE emuláció (gyors)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE interpreter (lassú)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Hang (DSP) beállítások" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD gyökér könyvtár:" @@ -1478,15 +1455,15 @@ msgstr "DVDLowRead - Végzetes hiba: kötetbÅ‘l kiolvasás sikertelen" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Végzetes hiba: kötetbÅ‘l kiolvasás sikertelen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Adatok mérete" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Dátum:" @@ -1515,29 +1492,28 @@ msgstr "Hibakeresés" msgid "Decimal" msgstr "Decimális" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ISO kitömörítése..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "A kiválasztott ISO fájlok kitömörítése..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "ISO kitömörítés" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Játéklista frissítése" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Alap" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Alapértelmezett ISO:" @@ -1581,8 +1557,8 @@ msgstr "" msgid "Device" msgstr "Eszköz" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Eszköz beállítások" @@ -1590,15 +1566,12 @@ msgstr "Eszköz beállítások" msgid "Dial" msgstr "Tárcsa" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1652,19 +1625,14 @@ msgstr "" "Ha bizonytalan vagy, hagyd kijelöletlenül." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"A sok játékban különféle grafikai effektusokhoz használt destination alpha " -"pass figyelmen kívül hagyása.\n" -"\n" -"Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Lemez" @@ -1691,24 +1659,59 @@ msgstr "" msgid "Divide" msgstr "Megosztás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Le akarod állítani az éppen működÅ‘ emulációt?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II dekóder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s grafikai beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin &weblap" @@ -1724,12 +1727,12 @@ msgstr "Dolphin emulált Wiimote beállítások" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GCPad beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS videók (*.dtm)" @@ -1737,11 +1740,11 @@ msgstr "Dolphin TAS videók (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote beállítások" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin &Google Code oldal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1749,7 +1752,7 @@ msgstr "" "Dolphin nem talált egyetlen GC/Wii ISO fájlt sem. Fájlok tallózásához dupla " "kattintás ide..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1757,19 +1760,16 @@ msgstr "" "A Dolphin beállításai végett jelenleg a játékok rejtve vannak. Dupla " "kattintás ide a játékok megjelenítéséhez..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "A Dolphin nem tudta elvégezni a kívánt műveletet." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Gyors lemez hozzáférés használata. Szükséges néhány játékhoz. (BE = gyors, " -"KI = kompatibilis)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1789,11 +1789,11 @@ msgstr "Letöltve %lu kód. (hozzáadva %lu)" msgid "Drums" msgstr "Dobok" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Utánzat" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Hang mentése" @@ -1840,9 +1840,9 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holland" @@ -1867,7 +1867,7 @@ msgstr "" "valószínűleg újra kell indítanod a számítógépet, hogy a Windows felismerje " "az új illesztÅ‘programot." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EURÓPA" @@ -1875,7 +1875,7 @@ msgstr "EURÓPA" msgid "Early Memory Updates" msgstr "Korai memória frissítés" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Szerkesztés" @@ -1883,7 +1883,7 @@ msgstr "Szerkesztés" msgid "Edit ActionReplay Code" msgstr "ActionReplay kód szerkesztése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Beállítások szerkesztése" @@ -1891,12 +1891,12 @@ msgstr "Beállítások szerkesztése" msgid "Edit Patch" msgstr "Patch szerkesztése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Jelenlegi perspektíva szerkesztése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Szerkesztés..." @@ -1908,7 +1908,7 @@ msgstr "Effektus" msgid "Embedded Frame Buffer" msgstr "Beágyazott képkocka puffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Az emuláció már fut" @@ -1946,7 +1946,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Emulált Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Emuláció állapota:" @@ -1970,15 +1970,15 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "AR naplózás bekapcsolása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Blokk csatlakozás használata" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Bounding Box kalkuláció használata" @@ -1990,7 +1990,7 @@ msgstr "Gyorsítótár használata" msgid "Enable Cheats" msgstr "Csalások használata" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Kétmagos mód használata" @@ -1998,7 +1998,7 @@ msgstr "Kétmagos mód használata" msgid "Enable Dual Core (speedup)" msgstr "Kétmagos mód használata (gyorsítás)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Tétlen állapot mellÅ‘zése" @@ -2006,7 +2006,7 @@ msgstr "Tétlen állapot mellÅ‘zése" msgid "Enable Idle Skipping (speedup)" msgstr "Tétlen állapot mellÅ‘zése (gyorsítás)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "MMU használata" @@ -2014,7 +2014,7 @@ msgstr "MMU használata" msgid "Enable Progressive Scan" msgstr "Progresszív pásztázás használata" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "KépernyÅ‘védÅ‘ bekapcsolása" @@ -2022,7 +2022,7 @@ msgstr "KépernyÅ‘védÅ‘ bekapcsolása" msgid "Enable Speaker Data" msgstr "Hangszóró adatok bekapcsolása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "SzéleskijelzÅ‘ bekapcsolása" @@ -2044,7 +2044,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, válaszd ezt: 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2080,7 +2080,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2088,11 +2088,11 @@ msgstr "" "Használatával The Legend of Zelda: Twilight Princess játék sebessége " "növekedik. A TÖBBI játéknál legyen kikapcsolva." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Egyedi megjelenítési hack használata" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2100,22 +2100,13 @@ msgstr "" "Dolby Pro Logic II emuláció bekapcsolása 5.1 surround hanggal. Nem működik " "OSX alatt." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Dolby Pro Logic II emuláció bekapcsolása 5.1 surround hanggal. Csak OpenAl " "feldolgozó esetén." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Dolby Pro Logic II emuláció bekapcsolása 5.1 surround hanggal. Csak OpenAl " -"feldolgozó esetén. Működéshez szükség lehet a soft_oal.dll átnevezésére " -"OpenAL32.dll névre." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2129,7 +2120,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2151,9 +2142,9 @@ msgstr "" msgid "End" msgstr "Vége" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Angol" @@ -2176,23 +2167,22 @@ msgstr "%d/%d bejegyzés" msgid "Entry 1/%d" msgstr "1/%d bejegyzés" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "EgyenlÅ‘" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Hiba" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Hiba a kiválasztott nyelv betöltése közben. Rendszer alapértelmezett " "visszaállítva." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2220,7 +2210,6 @@ msgid "Euphoria" msgstr "Eufória" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Kivétel kezelÅ‘ - memória terület alatti hozzáférés. %08llx%08llx" @@ -2229,16 +2218,20 @@ msgstr "Kivétel kezelÅ‘ - memória terület alatti hozzáférés. %08llx%08llx" msgid "Execute" msgstr "Végrehajtás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Exportálás sikertelen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Fájl exportálása" @@ -2246,7 +2239,7 @@ msgstr "Fájl exportálása" msgid "Export Recording" msgstr "Felvétel exportálása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Felvétel exportálása..." @@ -2254,7 +2247,7 @@ msgstr "Felvétel exportálása..." msgid "Export Save" msgstr "Mentés exportálása" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Wii mentés exportálása (kísérleti)" @@ -2262,15 +2255,15 @@ msgstr "Wii mentés exportálása (kísérleti)" msgid "Export all saves" msgstr "Minden mentés exportálása" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportálás sikertelen. Újra megpróbálod?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportálás mentése másként..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "KiegészítÅ‘" @@ -2286,44 +2279,44 @@ msgstr "Extra paraméter" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Az extra paraméter csak a ''Metroid: Other M'' játékban hasznos." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Minden fájl kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "BetöltÅ‘ program kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOL kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Könyvtár kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Fájl kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Partíció kitömörítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s kitömörítése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Minden fájl kitömörítése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Könyvtár kitömörítése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Kitömörítés..." @@ -2335,15 +2328,15 @@ msgstr "FIFO bájt" msgid "FIFO Player" msgstr "FIFO lejátszó" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANCIAORSZÃG" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST méret:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Csatlakozás sikertelen!" @@ -2351,11 +2344,15 @@ msgstr "Csatlakozás sikertelen!" msgid "Failed to download codes." msgstr "Kódok letöltése sikertelen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Kitömörítés nem sikerült ide: %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2391,20 +2388,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "%s olvasása sikertelen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "A banner.bin beolvasása sikertelen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2415,7 +2412,7 @@ msgstr "" "A memóriakártya sérülhetett\n" "FilePosition:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2424,7 +2421,7 @@ msgstr "" "sikertelen\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2432,17 +2429,17 @@ msgstr "" "A blokk kiosztási tábla pontos kiolvasása sikertelen\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "%d fájlból történÅ‘ adatok kiolvasása nem sikerült" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2450,7 +2447,7 @@ msgstr "" "A könyvtár biztonsági mentés pontos visszaolvasása nem sikerült\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2458,11 +2455,11 @@ msgstr "" "A könyvtár pontos kiolvasása nem sikerült\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2470,29 +2467,34 @@ msgstr "" "A fejléc pontos kiolvasása nem sikerült\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "A lemezképfájl egyedi azonosítójának kiolvasása sikertelen" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "A BT.DINF írása a SYSCONF fájlba sikertelen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "A bkhdr írása sikertelen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Fejléc írása sikertelen a(z) %s számára" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Fejléc írása sikertelen a(z) %d fájl számára" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2504,11 +2506,11 @@ msgstr "Gyors" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "MMU gyors verziója. Nem működik minden játéknál." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2516,7 +2518,7 @@ msgstr "" "Végzetes deszinkronizáció. Visszajátszás leállítása. (PlayWiimote hiba: %u !" "= %u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo lejátszó" @@ -2540,7 +2542,7 @@ msgstr "" "A fájl nem nyitható meg\n" "vagy a kiterjesztése nem megfelelÅ‘" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2553,20 +2555,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "A fájl nem ismerhetÅ‘ fel memóriakártyaként" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "A fájl nincs tömörítve" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Ismeretlen megnyitási mód : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Fájlrendszer" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Az 'ini' fájltípus ismeretlen! Nem lesz megnyitva!" @@ -2627,7 +2629,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2637,7 +2639,7 @@ msgstr "" "Hagyd kijelöletlenül, a Dolphin alapértelmezett az NTSC-U és automatikusan " "bekapcsolódik ez a beállítás japán játékok használatakor." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2658,6 +2660,11 @@ msgstr "" msgid "Found %d results for '" msgstr "Találat: %d eredmény ehhez: '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2699,9 +2706,9 @@ msgstr "RögzítendÅ‘ képkockák" msgid "Free Look" msgstr "Szabad nézet" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francia" @@ -2714,7 +2721,7 @@ msgstr "Frets" msgid "From" msgstr "EttÅ‘l:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Teljes méret" @@ -2726,7 +2733,7 @@ msgstr "Teljes kijelzÅ‘s felbontás:" msgid "GCI File(*.gci)" msgstr "GCI fájl(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC irányító" @@ -2734,27 +2741,27 @@ msgstr "GC irányító" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Játék azonosító:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "A játék már fut!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "A játék nem fut!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "A játék nem található!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "A játék sajátos beállításai" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Játék konfig" @@ -2771,20 +2778,20 @@ msgid "Gamecube &Pad Settings" msgstr "Gamecube &irányító beállítások" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Gamecube memóriakártyák (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Gamecube irányító beállítások" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko kódok" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2807,26 +2814,26 @@ msgstr "Ãltalános" msgid "General Settings" msgstr "Ãltalános beállítások" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Német" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: A jelzÅ‘szám nagyobb mint az ar kód lista mérete %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafika" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Grafikai beállítások" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Nagyobb mint" @@ -2848,7 +2855,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelölve." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Görög" @@ -2872,11 +2879,11 @@ msgstr "Gitár" msgid "Hacks" msgstr "Hackek" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "A fejléc ellenÅ‘rzÅ‘ összege hibás" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Héber" @@ -2888,7 +2895,7 @@ msgstr "Magasság" msgid "Help" msgstr "Súgó" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2900,7 +2907,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2953,7 +2960,7 @@ msgstr "Gyorsbillentyű beállítások" msgid "Hotkeys" msgstr "Gyorsbill." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Magyar" @@ -2961,31 +2968,31 @@ msgstr "Magyar" msgid "Hybrid Wiimote" msgstr "Hibrid Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Adatok kinyerése megkísérelve egy ismeretlen jegybÅ‘l: " "%08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - rossz cél" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL beállítások" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2997,15 +3004,15 @@ msgstr "IR mutató" msgid "IR Sensitivity:" msgstr "IR érzékenysége:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO részletek" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO könyvtárak" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "OLASZORSZÃG" @@ -3013,7 +3020,7 @@ msgstr "OLASZORSZÃG" msgid "Icon" msgstr "Ikon" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3058,9 +3065,13 @@ msgstr "" msgid "Import Save" msgstr "Mentés importálása" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importálás sikertelen, megpróbálod újra?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3082,21 +3093,16 @@ msgstr "" "Az importált fájl sav kiterjesztésű\n" "de nem rendelkezik megfelelÅ‘ fejléccel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Elindul" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Elindul" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Képkocka korlát:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Infó" @@ -3116,7 +3122,7 @@ msgstr "Insert" msgid "Insert Encrypted or Decrypted code here..." msgstr "Lekódolt vagy kódolatlan kód beszúrása ide..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "SD kártya behelyezése" @@ -3124,37 +3130,38 @@ msgstr "SD kártya behelyezése" msgid "Insert name here.." msgstr "Ãrj be ide nevet..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "WAD telepítése" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Telepítés a Wii menübe" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler elÅ‘idézve, de ez a platform még nem támogatja azt." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "WAD telepítése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Integritás ellenÅ‘rzési hiba" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Integritás ellenÅ‘rzés befejezÅ‘dött" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Integritás ellenÅ‘rzés befejezÅ‘dött. Nem találhatóak hibák." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3167,7 +3174,7 @@ msgstr "" msgid "Interface" msgstr "Felhasználói felület" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Felület beállítások" @@ -3192,20 +3199,20 @@ msgstr "BelsÅ‘ LZO hiba - lzo_init() sikertelen" msgid "Internal Resolution:" msgstr "BelsÅ‘ felbontás:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (NAGYON lassú)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intró" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Érvénytelen méret(%x) vagy mágikus szó (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Érvénytelen érték!" @@ -3213,16 +3220,16 @@ msgstr "Érvénytelen érték!" msgid "Invalid bat.map or dir entry" msgstr "Érvénytelen bat.map vagy könyvtár bejegyzés" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Érvénytelen esemény fajta %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Érvénytelen fájl" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3233,7 +3240,7 @@ msgstr "" "%s\n" " Valószínűleg újra le kell mentened a játékot." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Nem megfelelÅ‘ rögzített fájl" @@ -3252,34 +3259,36 @@ msgstr "" "Érvénytelen keresési karakterlánc (még csak a karakterlánc hosszúsága " "támogatott)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Nem megfelelÅ‘ mentés" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Olasz" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPÃN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Recompiler (ajánlott)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL kísérleti recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japán" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3301,8 +3310,9 @@ msgstr "Ablak legfelül tartása" msgid "Key" msgstr "Bill." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Koreai" @@ -3324,12 +3334,12 @@ msgstr "Bal analóg" msgid "Language:" msgstr "Nyelv:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Késleltetés:" @@ -3368,7 +3378,7 @@ msgstr "" "Bal/jobb kattintás további beállításokhoz.\n" "KözépsÅ‘ kattintás a törléshez." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Kevesebb mint" @@ -3385,58 +3395,48 @@ msgid "Load Custom Textures" msgstr "Egyedi textúrák betöltése" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Ãllás betöltése" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Ãllás betöltése az 1. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Ãllás betöltése a 2. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Ãllás betöltése a 3. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Ãllás betöltése a 4. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Ãllás betöltése az 5. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Ãllás betöltése a 6. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Ãllás betöltése a 7. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Ãllás betöltése a 8. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Ãllás betöltése az 1. helyrÅ‘l" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Ãllás betöltése az 1. helyrÅ‘l" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3467,19 +3467,18 @@ msgid "Load State Slot 8" msgstr "Ãllás betöltése a 8. helyrÅ‘l" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Ãllás betöltése az 1. helyrÅ‘l" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Ãllás betöltése..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wii rendszer menü betöltése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Wii rendszer menü betöltése %d%c" @@ -3498,10 +3497,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Gombkiosztási értékek betöltése a hack mintákból rendelkezésre áll." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Helyi" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Napló" @@ -3535,12 +3530,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Napló kimenetek" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Naplózás" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Kapcsolat elveszett a szerverrel!" @@ -3548,7 +3543,7 @@ msgstr "Kapcsolat elveszett a szerverrel!" msgid "M Button" msgstr "M gomb" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3557,7 +3552,7 @@ msgstr "" "MD5 eltérés\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU sebesség növelÅ‘ hack" @@ -3571,11 +3566,11 @@ msgstr "MadCatz Gameshark fájlok (*.gcs)" msgid "Main Stick" msgstr "FÅ‘kar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Gyártó azonosító:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Gyártó:" @@ -3612,7 +3607,7 @@ msgid "Memory Byte" msgstr "Memória bájt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Memóriakártya" @@ -3624,7 +3619,7 @@ msgstr "" "Memóriakártya kezelÅ‘ FIGYELMEZTETÉS - Készíts biztonsági mentést a " "használata elÅ‘tt, helyreállítható de a meglévÅ‘ adatok sérülhetnek!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3641,7 +3636,7 @@ msgstr "" "%s\n" "Ãt akarod másolni a régi fájlt erre az új helyre?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "A memóriakártya fájlmérete nem egyezik a fejléc méretével" @@ -3649,7 +3644,7 @@ msgstr "A memóriakártya fájlmérete nem egyezik a fejléc méretével" msgid "Menu" msgstr "Menü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mikrofon" @@ -3662,7 +3657,7 @@ msgstr "Min" msgid "Misc" msgstr "Egyebek" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Egyéb beállítások" @@ -3687,11 +3682,11 @@ msgstr "" msgid "Monospaced font" msgstr "Azonos szélességű betűtípus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3811,15 +3806,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Up" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Cím:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Név:" @@ -3829,7 +3824,7 @@ msgstr "Név:" msgid "Native GCI files(*.gci)" msgstr "Natív GCI fájlok (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Új keresés" @@ -3838,7 +3833,7 @@ msgstr "Új keresés" msgid "Next Page" msgstr "KövetkezÅ‘ lap" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "KövetkezÅ‘ keresés" @@ -3846,11 +3841,11 @@ msgstr "KövetkezÅ‘ keresés" msgid "Nickname :" msgstr "Becenév:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Nincs ország (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Nem találhatók sem ISO sem WAD fájlok" @@ -3858,7 +3853,7 @@ msgstr "Nem találhatók sem ISO sem WAD fájlok" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nem található játék kép fájl a(z) %s játékhoz" @@ -3884,42 +3879,43 @@ msgstr "Nincs üres könyvtári jelzÅ‘szám bejegyzés" msgid "No recorded file" msgstr "Nincs rögzített fájl" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "%s játékhoz nem található mentési mappa" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Nincs" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norvég" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Nem egyenlÅ‘" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Nincs beállítva" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Nincs csatlakoztatva" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Megjegyzés" @@ -3940,7 +3936,7 @@ msgstr "Megjegyzés" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Kódok száma:" @@ -3961,7 +3957,7 @@ msgstr "Elem" msgid "Object Range" msgstr "Elem hatótáv" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Ki" @@ -3973,25 +3969,29 @@ msgstr "Eltolás:" msgid "On-Screen Display Messages" msgstr "KépernyÅ‘n megjelenÅ‘ üzenetek" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Csak %d blokk szabad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Megnyitás" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "A játékot &tartalmazó mappa megnyitása" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Wii &mentések mappa megnyitása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Fájl megnyitása..." @@ -4017,7 +4017,13 @@ msgstr "OpenCL textúra dekódoló" msgid "OpenMP Texture Decoder" msgstr "OpenMP textúra dekódoló" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "LehetÅ‘ségek" @@ -4027,22 +4033,18 @@ msgid "Orange" msgstr "Narancs" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"A fájlok sorrendje a fájl könyvtárban nem azonos a blokkok sorrendjével\n" -"Jobb kattintás az összes fájl exportálásához,\n" -"és az állásmentések importálásához az új memóriakártyára\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Egyéb" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4054,15 +4056,15 @@ msgstr "" msgid "Output" msgstr "Kimenet" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "F&elvétel visszajátszása..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Irányító" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Irányító" @@ -4086,17 +4088,17 @@ msgstr "Paragraph" msgid "Parameters" msgstr "Paraméterek" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "%i partíció" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Javítások" @@ -4104,8 +4106,8 @@ msgstr "Javítások" msgid "Paths" msgstr "Mappák" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Szünet" @@ -4118,7 +4120,7 @@ msgstr "Szünet a videó végén" msgid "Per-Pixel Lighting" msgstr "Képpont alapú fényhatások" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Tökéletes" @@ -4128,9 +4130,9 @@ msgid "Perspective %d" msgstr "%d perspektíva" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Indítás" @@ -4142,7 +4144,7 @@ msgstr "Felvétel visszajátszása" msgid "Play/Pause" msgstr "Indítás/Szünet" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Játszható" @@ -4150,11 +4152,11 @@ msgstr "Játszható" msgid "Playback Options" msgstr "Visszajátszási lehetÅ‘ségek" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Játékosok" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Változtatás jóváhagyása..." @@ -4166,23 +4168,23 @@ msgstr "Hozz elÅ‘ször létre egy perspektívát mielÅ‘tt mentenél" msgid "Plus-Minus" msgstr "Plusz - minusz" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Lengyel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "1. port" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "2. port" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "3. port" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "4. port" @@ -4191,11 +4193,11 @@ msgstr "4. port" msgid "Port :" msgstr "Port:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugál" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugál (brazil)" @@ -4203,17 +4205,17 @@ msgstr "Portugál (brazil)" msgid "Post-Processing Effect:" msgstr "Utófeldolgozási effektus:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Túl korai PlayController videó befejezés. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Túl korai PlayWiimote videó befejezés. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Túl korai PlayWiimote videó befejezés. %u > %u" @@ -4230,7 +4232,7 @@ msgstr "ElÅ‘zÅ‘ lap" msgid "Previous Page" msgstr "ElÅ‘zÅ‘ lap" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "ElÅ‘zÅ‘ érték" @@ -4246,7 +4248,7 @@ msgstr "Profil" msgid "Properties" msgstr "Tulajdonságok" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Gyorsítótár ürítése" @@ -4255,7 +4257,7 @@ msgid "Question" msgstr "Kérdés" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Kilépés" @@ -4277,7 +4279,7 @@ msgstr "Jobb analóg" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "OROSZORSZÃG" @@ -4316,6 +4318,10 @@ msgstr "Valódi Wiimote-ok" msgid "Record" msgstr "Rögzítés" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Rögzítési infó" @@ -4351,7 +4357,7 @@ msgstr "" "Ha bizonytalan vagy, válaszd ezt: Nincs. " #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Frissítés" @@ -4360,14 +4366,14 @@ msgstr "Frissítés" msgid "Refresh List" msgstr "A lista frissítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Játéklista frissítése" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Törlés" @@ -4390,7 +4396,7 @@ msgstr "Megjelenítés a fÅ‘ablakban" msgid "Reset" msgstr "Alapra állítás" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Eredmények" @@ -4398,7 +4404,7 @@ msgstr "Eredmények" msgid "Return" msgstr "Return" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4411,18 +4417,17 @@ msgstr "Jobbra" msgid "Right Stick" msgstr "Jobb kar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Rumble funkció" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Orosz" @@ -4435,7 +4440,7 @@ msgid "Safe" msgstr "Biztonságos" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Mentés" @@ -4445,23 +4450,20 @@ msgid "Save GCI as..." msgstr "GCI mentése másként..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Ãl&lás mentése" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Ãl&lás mentése" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Ãllás mentés az 1. helyre" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Ãllás mentés az 1. helyre" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4492,32 +4494,31 @@ msgid "Save State Slot 8" msgstr "Ãllás mentés a 8. helyre" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Ãllás mentés az 1. helyre" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Ãllás mentése..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Mentés másként..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Tömörített GCM/ISO mentése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Jelenlegi perspektíva mentése" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Kitömörített GCM/ISO mentése" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "%s állásmentés videója sérült, videó rögzítése leáll..." @@ -4526,20 +4527,20 @@ msgstr "%s állásmentés videója sérült, videó rögzítése leáll..." msgid "Scaled EFB Copy" msgstr "Méretezett EFB másolat" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Keresés %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "ISO fájlok keresése" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Keresés..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Pillanatkép" @@ -4551,11 +4552,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Keresés" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Keresési szűrÅ‘" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Keresés az almappákban" @@ -4578,12 +4579,12 @@ msgstr "%s rész nem található a SYSCONF fájlban" msgid "Select" msgstr "Választás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Válassz rögzítendÅ‘ fájlt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Válassz telepítendÅ‘ Wii WAD fájlt" @@ -4605,19 +4606,19 @@ msgstr "Válassz importálandó mentési fájlt" msgid "Select floating windows" msgstr "Válassz lebegÅ‘ ablakokat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "BetöltendÅ‘ fájl kiválasztása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Válassz mentési fájlt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Válassz betöltendÅ‘ állásmentést" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Válassz mentendÅ‘ állást" @@ -4639,7 +4640,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, válaszd ezt: Automatikus." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "A megadott irányító profil nem létezik" @@ -4663,39 +4664,28 @@ msgstr "" "Ha bizonytalan vagy, használd az asztali felbontást.\n" "Ha továbbra is bizonytalan vagy, használd a legmagasabb működÅ‘ felbontást." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"A belsÅ‘leg használni kívánt grafikai API kiválasztása.\n" -"Direct3D 9 többnyire a leggyorsabb. OpenGL viszont pontosabb. Direct3D 11 " -"valahol a kettÅ‘ közt van.\n" -"Érdemes tudni, hogy a Direct3D leképzÅ‘k csak Windows rendszereken működnek.\n" -"\n" -"Ha bizonytalan vagy, legyen a Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"A belsÅ‘leg használni kívánt grafikai API kiválasztása.\n" -"Direct3D 9 többnyire a leggyorsabb. OpenGL viszont pontosabb. Direct3D 11 " -"valahol a kettÅ‘ közt van.\n" -"Érdemes tudni, hogy a Direct3D leképzÅ‘k csak Windows rendszereken működnek.\n" -"\n" -"Ha bizonytalan vagy, legyen az OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Küldés" @@ -4707,17 +4697,17 @@ msgstr "ÉrzékelÅ‘ helyzete:" msgid "Separator" msgstr "Elválasztó" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Szerb" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "1. soros port - Ezt a portot használják azok az eszközök, mint a net adapter" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Beállítás &alapértelmezett ISO fájlként" @@ -4726,7 +4716,7 @@ msgstr "Beállítás &alapértelmezett ISO fájlként" msgid "Set as default Memcard %c" msgstr "Beállítás alapértelmezett %c. memóriakártyaként" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4740,19 +4730,19 @@ msgstr "" "Késleltetés beállítása (ms). Magasabb értékek csökkenthetik a hang " "recsegést. Csak OpenAL feldolgozó estén." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Beállítások..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Nem található a beállítási fájl" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Rázás" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Rövid cím:" @@ -4760,23 +4750,27 @@ msgstr "Rövid cím:" msgid "Shoulder Buttons" msgstr "Oldalsó gombok" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Konzol &mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Napló &mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Ãllapotsor &mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Eszközsor &mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Meghajtók mutatása" @@ -4788,11 +4782,11 @@ msgstr "EFB másolat régiók megjelenítése" msgid "Show FPS" msgstr "FPS kijelzése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Franciaország mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "GameCube mutatása" @@ -4800,35 +4794,35 @@ msgstr "GameCube mutatása" msgid "Show Input Display" msgstr "Bemeneti kijelzÅ‘ megjelenítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Olaszország mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "JAP mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Korea mutatása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "A játék nyelve:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Napló &beállítások megjelenítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PAL mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Platformok mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Régiók mutatása" @@ -4836,27 +4830,27 @@ msgstr "Régiók mutatása" msgid "Show Statistics" msgstr "Statisztikák megjelenítése" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Tajvan mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "USA mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Wad mutatása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii mutatása" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "A játék leállítása elÅ‘tt megjelenik egy megerÅ‘sítÅ‘ ablak." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4874,7 +4868,7 @@ msgstr "Az elsÅ‘ blokk megjelenítése" msgid "Show lag counter" msgstr "Késési idÅ‘ számláló megjelenítése" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4912,7 +4906,7 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Ismeretlen mutatása" @@ -4926,23 +4920,24 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Oldalt tartott Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Egyszerűsített kínai" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Méret" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "BIOS kihagyása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "DCBZ törlés kihagyása" @@ -4966,17 +4961,17 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "%i hely" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "A hely" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "B hely" @@ -4984,7 +4979,7 @@ msgstr "B hely" msgid "Snapshot" msgstr "Pillanatkép" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Szoftveres képalkotó" @@ -5001,27 +4996,27 @@ msgstr "" "Biztosan be kívánod kapcsolni a szoftveres képalkotót? Ha bizonytalan vagy, " "válaszd ezt: 'Nem'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Hang beállítások" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Érvénytelen %s hang feldolgozó." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Hang puffer létrehozása sikertelen: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Szóköz" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spanyol" @@ -5049,37 +5044,29 @@ msgstr "" "\n" "Ha bizonytalan vagy, válaszd ezt: 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "A lemez adatátviteli arány gyorsítása" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Négyzetes kar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Normál irányító" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Indítás" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "&NetPlay indítása" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Felvétel in&dítása" @@ -5087,7 +5074,7 @@ msgstr "Felvétel in&dítása" msgid "Start Recording" msgstr "Felvétel indítása" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Ãllap." @@ -5095,7 +5082,7 @@ msgstr "Ãllap." msgid "State Saves" msgstr "Ãllás mentések" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Kormánykerék" @@ -5104,7 +5091,7 @@ msgid "Stick" msgstr "Kar" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Leállítás" @@ -5136,28 +5123,28 @@ msgstr "Strum" msgid "Subtract" msgstr "Kivonás" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Fájl sikeresen exportálva a(z) %s helyre" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Mentés fájlok sikeresen importálva" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Lengetés" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "VGA szál szinkronizálása" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5166,12 +5153,13 @@ msgstr "" "véletlenszerű kifagyásokat kétmagos mód esetén. (BE = Kompatibilis, KI = " "Gyors)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Rendszer nyelv:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAJVAN" @@ -5196,13 +5184,13 @@ msgstr "Tábla balra" msgid "Table Right" msgstr "Tábla jobbra" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Pillanatkép készítése" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5222,11 +5210,11 @@ msgstr "Textúra gyorsítótár" msgid "Texture Format Overlay" msgstr "Textúra formátum átfedés" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "A WAD sikeresen telepítve" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "A cím érvénytelen" @@ -5234,13 +5222,13 @@ msgstr "A cím érvénytelen" msgid "The checksum was successfully fixed" msgstr "Az ellenÅ‘rzÅ‘ összeg sikeresen javítva" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "A választott könyvtár már szerepel a listán" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5263,7 +5251,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "%s fáj már meg van nyitva, a fájl fejléce nem írható." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Az általad megadott (%s) fájl nem létezik" @@ -5296,7 +5284,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "A másolni kívánt mentés érvénytelen méretű" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5304,36 +5292,36 @@ msgstr "" "A választott nyelvet nem támogatja az oprációs rendszer. Visszaállás a " "rendszer alapértelmezettre." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "A szerver és kliens NetPlay verziói nem kompatibilisek!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "A szerver megtelt!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "A szerver válasza: a játék már fut!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "A szerver ismeretlen hibaüzenetet küldött!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "A megadott \"%s\" fájl nem létezik" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Az érték érvénytelen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Kinézet:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5341,7 +5329,7 @@ msgstr "" "Kell lennie egy jegynek itt: 00000001/00000002. A NAND mentésed valószínűleg " "befejezetlen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5349,7 +5337,7 @@ msgstr "" "Ezek a beállítások felülírják a Dolphin mag beállításait.\n" "A módosítatlan opcióknál a játék a Dolphin beállításait használja." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5357,7 +5345,7 @@ msgstr "" "Az action replay szimulátor nem támogat olyan kódokat, amelyek módosítját " "magát az Action Replay-t." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Ez lassulást okozhat a Wii menüben és néhány játékban." @@ -5382,20 +5370,15 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Ha a képkocka korlátozást magasabbra állítottad a játék teljes sebességénél " -"(NTSC: 60, PAL: 50), akkor válaszd a Hang lehetÅ‘séget a lassításhoz a DSP " -"használatával (javíthatja a hang kattogást, de ugyanakkor folyamatos zajt is " -"okozhat játékfüggÅ‘en). " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5407,7 +5390,7 @@ msgstr "" "SzámottevÅ‘ sebességnövekedés érhetÅ‘ el egynél több magos számítógépeken, " "ugyanakkor véletlenszerű fagyásokat/hibákat is okozhat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Ez által kézileg szerkesztheted az INI konfigurációs fájlt" @@ -5416,12 +5399,12 @@ msgstr "Ez által kézileg szerkesztheted az INI konfigurációs fájlt" msgid "Threshold" msgstr "Küszöbérték" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Billentés" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Cím" @@ -5435,21 +5418,18 @@ msgid "Toggle All Log Types" msgstr "Minden napló típus kijelölése" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Képarány:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB másolatok" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Minden napló típus kijelölése" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Váltás teljes nézetre" @@ -5459,15 +5439,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Fent" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Hagyományos kínai" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Próbálkozás egy ismeretlen fájltípus betöltésével. " @@ -5487,7 +5468,7 @@ msgstr "" "Olvasási próbálkozás az érvénytelen SYSCONF fájlból\n" "Nem találhatóak Wiimote bt azonosítók " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Török" @@ -5503,12 +5484,12 @@ msgstr "Típus" msgid "UDP Port:" msgstr "UDP port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ISMERETLEN" @@ -5517,7 +5498,7 @@ msgstr "ISMERETLEN" msgid "UNKNOWN_%02X" msgstr "ISMERETLEN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5530,9 +5511,9 @@ msgstr "" "Bejegyzés módosítás nem történt." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5540,7 +5521,7 @@ msgstr "" "történÅ‘ elemzése nem lehetséges. GyÅ‘zÅ‘dj meg róla, hogy helyesen írtad be.\n" "Szeretnéd átugrani ezt a sort és folytatni az elemzést?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Meghatározatlan %i" @@ -5550,19 +5531,18 @@ msgid "Undo Load State" msgstr "Ãllás betöltés törlése" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Ãllás betöltés törlése" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Váratlan 0x80 hivás? Megszakítás..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Ismeretlen" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Ismeretlen DVD parancs: %08x - végzetes hiba" @@ -5577,12 +5557,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Ismeretlen bejegyzés típus %i a SYSCONF fájlban (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Ismeretlen üzenet érkezett ezzel az azonosítóval : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5594,16 +5574,16 @@ msgstr "" msgid "Up" msgstr "Fel" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Frissítés" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "ElÅ‘re tartott Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "EuRGB60 mód (PAL60) használata" @@ -5611,7 +5591,7 @@ msgstr "EuRGB60 mód (PAL60) használata" msgid "Use Fullscreen" msgstr "Teljes nézet használata" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Hexa használat" @@ -5640,6 +5620,15 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5663,12 +5652,11 @@ msgstr "Kellékek" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU sebesség növelÅ‘ hack" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Érték" @@ -5676,7 +5664,7 @@ msgstr "Érték" msgid "Value:" msgstr "Érték:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Érték:" @@ -5688,7 +5676,7 @@ msgstr "Verbosity" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Kép" @@ -5696,17 +5684,17 @@ msgstr "Kép" msgid "Virtual" msgstr "Virtuális" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "HangerÅ‘" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD telepítési hiba: hiba a(z) %s létrehozása közben" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD telepítési hiba: hiba a cimke létrehozásakor" @@ -5728,19 +5716,19 @@ msgstr "" msgid "Warning" msgstr "Figyelem" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Figyelem - DOL indítása nem megfelelÅ‘ konzol módban!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Figyelem - ELF indítása nem megfelelÅ‘ konzol módban!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Figyelem - ISO indítása nem megfelelÅ‘ konzol módban!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5764,7 +5752,7 @@ msgstr "" "és azonos néven fog szerepelni a memóriakártyán lévÅ‘kkel\n" "Folytatod?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5776,7 +5764,7 @@ msgstr "" "másik mentést, vagy betöltheted ezt a mentést az írásvédett mód kikapcsolása " "után." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5788,7 +5776,7 @@ msgstr "" "betöltheted ezt a mentést az írásvédett mód kikapcsolása után. EllenkezÅ‘ " "esetben szinkronizációs hibák jelentkezhetnek." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5843,19 +5831,15 @@ msgstr "Szélesség" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii konzol" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND gyökér könyvtár:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wii mentés importálása" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii mentés fájlok (*.bin)|*.bin" @@ -5864,16 +5848,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Fájlból olvasás nem sikerült" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote csatlakoztatva" @@ -5881,7 +5871,7 @@ msgstr "Wiimote csatlakoztatva" msgid "Wiimote Motor" msgstr "Wiimote motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote beállítások" @@ -5905,14 +5895,14 @@ msgstr "Jobb Windows" msgid "Word Wrap" msgstr "Word Wrap" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Folyamatban..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5932,21 +5922,36 @@ msgstr "Ãrás fájlba" msgid "Write to Window" msgstr "Ãrás az ablakba" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice hiba: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 iniciálási hiba: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 fÅ‘ hang létrehozási hiba: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice hiba: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 iniciálási hiba: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 fÅ‘ hang létrehozási hiba: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5983,11 +5988,11 @@ msgstr "Nem zárhatod be a lapokat tartalmazó táblákat." msgid "You must choose a game!!" msgstr "Választanod kell egy játékot!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Meg kell adnod egy nevet!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" "Be kell írnod egy érvényes decimális, hexadecimális vagy oktális értéket." @@ -5996,7 +6001,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "Meg kell adnod egy érvényes profil nevet." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" "Újra kell indítanod a Dolphin emulátort a változtatások érvényesítéséhez." @@ -6011,7 +6016,7 @@ msgstr "" "Le kívánod állítani a probléma javítást most?\n" "Ha a választásod \"Nem\", akkor a hang torz lehet." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6030,15 +6035,15 @@ msgstr "" "0x%04x méretűnek kellene lennie (azonban 0x%04llx méretű)\n" "Akarsz újat létrehozni?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 kód nem támogatott" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero ismeretlen az emulátor számára: %08x" @@ -6097,20 +6102,24 @@ msgstr "" "\n" "Ha bizonytalan vagy, hagyd kijelöletlenül." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "betöltÅ‘ program (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Opcode olvasása innen %x. Kérlek jelentsd." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute visszatért -1 alkalmazás fut!" @@ -6126,72 +6135,43 @@ msgstr "zNear javítás: " msgid "| OR" msgstr "| VAGY" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Pontos VBeam emuláció" +#~ msgid "Could not create %s" +#~ msgstr "%s nem hozható létre" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Bizonyos opciók elérhetÅ‘vé válnak gyorsbillentyűkkel: 3. (BelsÅ‘ " -#~ "felbontás), 4. (Képarány), 5. (EFB másolat) és 6. (Köd) a emulációs " -#~ "ablakon belül.\n" +#~ "A belsÅ‘leg használni kívánt grafikai API kiválasztása.\n" +#~ "Direct3D 9 többnyire a leggyorsabb. OpenGL viszont pontosabb. Direct3D 11 " +#~ "valahol a kettÅ‘ közt van.\n" +#~ "Érdemes tudni, hogy a Direct3D leképzÅ‘k csak Windows rendszereken " +#~ "működnek.\n" #~ "\n" -#~ "Ha bizonytalan vagy, hagyd kijelöletlenül." - -#~ msgid "Enable Hotkeys" -#~ msgstr "Gyorsbillentyűk használata" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Meghallgatás sikertelen!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "A bthprops.cpl betöltése sikertelen" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "A hid.dll betöltése sikertelen" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic beállítások" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY kiadva, kérlek jelentsd!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hekkelt puffer feltöltés" +#~ "Ha bizonytalan vagy, legyen a Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Ha az FPS értéke szabálytalan, akkor ez a beállítás segíthet. (BE = " -#~ "kompatibilis, KI = gyors)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Az utolsó felülírt mentés" - -#~ msgid "Last Saved State" -#~ msgstr "Utolsó mentett állás" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Wiimote újracsatlakoztatása állás betöltéskor" - -#~ msgid "Set" -#~ msgstr "Beáll." - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Dest. Alpha Pass kihagyása" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Egy hekkelt feltöltési stratégiát használ az adatfolyam tetÅ‘pontokhoz.\n" -#~ "Ez többnyire gyorsítás, de nem engedélyezett az OpenGL kikötések által és " -#~ "komoly hibákat okozhat.\n" +#~ "A belsÅ‘leg használni kívánt grafikai API kiválasztása.\n" +#~ "Direct3D 9 többnyire a leggyorsabb. OpenGL viszont pontosabb. Direct3D 11 " +#~ "valahol a kettÅ‘ közt van.\n" +#~ "Érdemes tudni, hogy a Direct3D leképzÅ‘k csak Windows rendszereken " +#~ "működnek.\n" #~ "\n" -#~ "Ha bizonytalan vagy, hagyd kijelöletlenül." +#~ "Ha bizonytalan vagy, legyen az OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Opcode olvasása innen %x. Kérlek jelentsd." diff --git a/Languages/po/it.po b/Languages/po/it.po index afde69e1b1..3a4626ae92 100644 --- a/Languages/po/it.po +++ b/Languages/po/it.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-16 08:31+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 17:08+0000\n" "Last-Translator: Mewster \n" "Language-Team: Italian (http://www.transifex.com/projects/p/dolphin-emu/" "language/it/)\n" @@ -20,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr " (troppi per la visualizzazione)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Gioco : " @@ -34,7 +34,7 @@ msgstr " Gioco : " msgid "! NOT" msgstr "! NOT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +43,7 @@ msgstr "" "\"%s\" non esiste.\n" " Creare una nuova Memory Card da 16MB?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" è un file GCM/ISO non valido, oppure non è un ISO GC/Wii." @@ -58,29 +58,29 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sCopia%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d stadi" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d stadi (livello di qualità %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s esiste già, vuoi sovrascrivere?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" "Fallito il tentativo di ripulire %s. È possibile che l'immagine sia corrotta." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -89,7 +89,7 @@ msgstr "" "Fallito il tentativo di caricare %s come memory card\n" "La dimensione del file non è valida (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -98,7 +98,7 @@ msgstr "" "Fallito il tentativo di caricare %s come memory card\n" "La dimensione della card non è valida (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -108,22 +108,27 @@ msgstr "" "Il file non è abbastanza largo per essere un valido file memory card (0x%x " "bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "Fallito il tentativo di aprire %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s fallito: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "Il file %s possiede una dimensione di 0 bytes" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s è già compresso! Impossibile comprimere ulteriormente." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s è un nome troppo lungo per il file; massimo 45 caratteri" @@ -152,7 +157,7 @@ msgstr "%u Blocchi Liberi; %u Voci Directory Libere" msgid "&& AND" msgstr "&& AND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&A proposito di..." @@ -160,7 +165,7 @@ msgstr "&A proposito di..." msgid "&Boot from DVD Drive..." msgstr "Avvia da &Unità DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Punti di interruzione" @@ -168,7 +173,7 @@ msgstr "&Punti di interruzione" msgid "&Browse for ISOs..." msgstr "&Sfoglia ISO..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Gestore &Trucchi" @@ -176,11 +181,11 @@ msgstr "Gestore &Trucchi" msgid "&DSP Settings" msgstr "Impostazioni &DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Elimina ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Elimina ISO selezionate..." @@ -192,11 +197,11 @@ msgstr "&Emulazione" msgid "&File" msgstr "&File" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Fotogramma per Fotogramma" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Schermo Intero" @@ -204,7 +209,7 @@ msgstr "&Schermo Intero" msgid "&Graphics Settings" msgstr "Impostazioni &Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Aiuto" @@ -212,7 +217,7 @@ msgstr "&Aiuto" msgid "&Hotkey Settings" msgstr "Impostazioni &Tasti di Scelta Rapida" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -224,11 +229,11 @@ msgstr "&Carica Stato di Gioco" msgid "&Memcard Manager (GC)" msgstr "Gestore &Memory Card (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memoria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Apri..." @@ -236,51 +241,51 @@ msgstr "&Apri..." msgid "&Options" msgstr "&Opzioni" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Gioca" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Proprietà" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "Modalità in &Sola-lettura" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Aggiorna Elenco" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registri" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Resetta" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Suono" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Arresta" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Strumenti" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Visualizza" @@ -288,7 +293,7 @@ msgstr "&Visualizza" msgid "&Wiimote Settings" msgstr "Impostazioni &Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -313,9 +318,8 @@ msgid "(off)" msgstr "(nessuno)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -325,7 +329,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Nativo (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -341,7 +345,7 @@ msgstr "2.5x Nativo (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Nativo (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -357,7 +361,7 @@ msgstr "3x Nativo (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Nativo (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -369,7 +373,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -377,7 +381,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -386,12 +390,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Una finestra di NetPlay risulta già aperta!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Al momento non c'è alcun gioco in esecuzione." @@ -413,23 +417,21 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ATTENZIONE:\n" "\n" -"La modalità NetPlay funzionerà correttamente solo quando verranno utilizzate " -"le seguenti impostazioni:\n" -" - Dual Core [OFF]\n" -" - DSP-HLE impostato su \"Null Audio\" oppure DSP-LLE\n" -" - Impostare manualmente il numero esatto dei controller che verranno " -"utilizzati come [Controller Standard]\n" +"La modalità NetPlay funzionerà solamente con le seguenti impostazioni:\n" +" - Abilita Dual Core [SPENTO]\n" +" - DSP Emulator Engine uguale per ogni computer!\n" +" - DSP su Thread Dedicato [SPENTO]\n" +" - Framelimiter NON settato su [Audio]\n" "\n" "Tutti i giocatori devono cercare di utilizzare le stesse impostazioni e " "versioni di Dolphin.\n" @@ -437,15 +439,15 @@ msgstr "" "tutti i giocatori prima di iniziare.\n" "Il supporto per il Wiimote non è stato implementato.\n" "\n" -"E' necessario inoltrare la porta TCP all'host!!" +"L'host deve inoltre avere aperto/inoltrato le porte TCP scelte!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "Baseboard AM" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Codici AR" @@ -494,7 +496,7 @@ msgstr "" "Codice Incriminato:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -502,7 +504,7 @@ msgstr "" "Errore Action Replay: Dimensioni non valide (%08x : indirizzo = %08x) in " "Aggiungi Codice (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -511,7 +513,7 @@ msgstr "" "Errore Action Replay: Dimensioni non valide (%08x : indirizzo = %08x) nelle " "istruzioni Fill e Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -520,7 +522,7 @@ msgstr "" "Errore Action Replay: Dimensioni non valide (%08x : indirizzo = %08x) nelle " "istruzioni Ram Write e Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -529,14 +531,14 @@ msgstr "" "Errore Action Replay: Dimensioni non valide (%08x : indirizzo = %08x) " "nell'istruzione Write To Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" "Errore Action Replay: Valore non valido (%08x) nell'istruzione Memory Copy " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -545,27 +547,27 @@ msgstr "" "Errore Action Replay: Master Code e Write To CCXXXXXX non implementati (%s)\n" "I Master Code non sono necessari. Non usarli." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Errore Action Replay: codice AR non valido in riga: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Conditional Code: Dimensioni non valide %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Normal Code Type %08x (%s) non valido" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Code %i: Sottotipo %08x (%s) non valido" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Code 0: Sottotipo %08x (%s) non valido" @@ -579,11 +581,11 @@ msgstr "Adattatore:" msgid "Add" msgstr "Aggiungi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Aggiungi Codice ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Aggiungi Patch" @@ -591,9 +593,9 @@ msgstr "Aggiungi Patch" msgid "Add new pane" msgstr "Aggiungi nuovo riquadro" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Aggiungi..." @@ -653,32 +655,32 @@ msgstr "Avanzate" msgid "Advanced Settings" msgstr "Impostazioni Avanzate" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Tutti i file GC/Wii (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Tutti i file immagine GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Tutti i file Gamecube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Tutti i Salvataggi di Stati di Gioco (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Tutti i file ISO Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Tutti i file GC/Wii ISO compressi (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Tutti i file (*.*)|*.*" @@ -698,19 +700,19 @@ msgstr "Filtraggio Anisotropico:" msgid "Anti-Aliasing:" msgstr "Anti-Aliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "L'apploader possiede dimensioni errate... è davvero un apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "L'Apploader non riesce a caricare dal file" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Applica" @@ -724,7 +726,7 @@ msgstr "" "\n" "Nel dubbio, seleziona (nessuno)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabo" @@ -733,7 +735,7 @@ msgstr "Arabo" msgid "Are you sure you want to delete \"%s\"?" msgstr "Sei sicuro di voler eliminare \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -741,16 +743,21 @@ msgstr "" "Sei sicuro di voler eliminare questi file?\n" "Andranno persi definitivamente!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Sei sicuro di voler eliminare questo file? Sarà cancellato definitivamente!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (sperimentale)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (sperimentale)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Rapporto d'Aspetto:" @@ -759,12 +766,12 @@ msgstr "Rapporto d'Aspetto:" msgid "At least one pane must remain open." msgstr "Almeno un riquadro deve rimanere aperto." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Motore Audio:" @@ -772,7 +779,7 @@ msgstr "Motore Audio:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Errore nell'apertura della periferica AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -812,16 +819,16 @@ msgstr "Registro BP" msgid "Back" msgstr "Indietro" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Impostazioni Motore" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Motore:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Input in Background" @@ -830,24 +837,24 @@ msgstr "Input in Background" msgid "Backward" msgstr "all'Indietro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "File Header corrotto" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Dettagli Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -867,7 +874,7 @@ msgstr "Impostazioni di Base" msgid "Bass" msgstr "Basso" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Fallita verifica checksum della Tabella di Allocazione Blocchi" @@ -888,7 +895,7 @@ msgid "Blue Right" msgstr "Blu Destro" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Sotto" @@ -897,27 +904,27 @@ msgstr "Sotto" msgid "Bound Controls: %lu" msgstr "Controlli Associati: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Corrotto" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Sfoglia" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Cerca una directory da aggiungere" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Seleziona una directory per le ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Seleziona la directory di destinazione" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -927,7 +934,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Pulsanti" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -975,33 +982,33 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Impossibile trovare il WiiMote sull'handler di connessione %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Impossibile leggere da DVD_Plugin - DVD-Interface: Errore Fatale" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Annulla" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Impossibile aprire %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Impossibile annullare con eventi in sospeso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1012,7 +1019,7 @@ msgstr "" "%s\n" "non è un file memory card per gamecube valido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1024,7 +1031,7 @@ msgstr "" msgid "Caps Lock" msgstr "Bloc Maiusc" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalano" @@ -1032,11 +1039,11 @@ msgstr "Catalano" msgid "Center" msgstr "Area Centrale" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Cambia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Cambia &Disco..." @@ -1044,11 +1051,11 @@ msgstr "Cambia &Disco..." msgid "Change Disc" msgstr "Cambia Disco" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Cambia Gioco" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1064,13 +1071,13 @@ msgstr "Cambia segno al Parametro zFar (dopo la correzione)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Cambia segno al Parametro zNear (dopo la correzione)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "La modifica di quest'opzione non avrà alcun effetto finché l'emulatore è in " "esecuzione!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1078,47 +1085,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Codice Trucco" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Cerca Trucco" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Gestore Trucchi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Verifica l'Integrità della Partizione" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Sto verificando l'integrità..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Cinese (Semplificato)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Cinese (Tradizionale)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Imposta la directory principale per i DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Imposta la directory principale della NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Scegli una ISO predefinita:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Scegli una directory da aggiungere" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Scegli un file da aprire" @@ -1126,7 +1133,7 @@ msgstr "Scegli un file da aprire" msgid "Choose a memory card:" msgstr "Scegli una memory card:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1134,8 +1141,8 @@ msgstr "" "Scegli il file da utilizzare come apploader: (vale solo per i dischi " "costituiti da directory)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Scegli la cartella in cui estrarre" @@ -1154,7 +1161,7 @@ msgstr "Classic Controller" msgid "Clear" msgstr "Pulisci" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1164,7 +1171,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Chiudi" @@ -1173,11 +1180,11 @@ msgstr "Chiudi" msgid "Co&nfigure..." msgstr "Co&nfigura..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Codice Info" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Codice: " @@ -1189,24 +1196,24 @@ msgstr "Comando" msgid "Comment" msgstr "Note" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Note:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimi ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimi le ISO selezionate..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Compressione ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configurazione" @@ -1218,20 +1225,20 @@ msgstr "Configura" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:102 msgid "Configure Control" -msgstr "Configura Controllo" +msgstr "Configura Vibrazione" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configura i Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configura..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Conferma la Sovrascrittura del File" @@ -1244,17 +1251,16 @@ msgstr "Arresto su Conferma" msgid "Connect" msgstr "Collega" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Collega Tastiera USB" +msgstr "Collega Balance Board" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Collega Tastiera USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Collega Wiimote %i" @@ -1275,7 +1281,7 @@ msgstr "Collega Wiimote 3" msgid "Connect Wiimote 4" msgstr "Collega Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Connessione in corso..." @@ -1295,7 +1301,7 @@ msgstr "Control" msgid "Convert to GCI" msgstr "Converti in GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Copia non riuscita" @@ -1304,21 +1310,16 @@ msgstr "Copia non riuscita" msgid "Copy to Memcard %c" msgstr "Copia nella Memory Card %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Core" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Impossibile creare %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Impossibile inizializzare il motore %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1329,26 +1330,16 @@ msgstr "" "backup GC/Wii. Tieni presente che la maggior parte delle unità DVD nei PC " "non riesce a leggere i dischi originali GameCube/Wii." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Impossibile riconoscere il file ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Impossibile salvare %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Impossibile impostare i pad. Il giocatore è uscito oppure il gioco è " -"attualmente in esecuzione!\n" -"(l'impostazione dei pads durante l'esecuzione del gioco è una funzione al " -"momento non supportata)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1370,11 +1361,11 @@ msgstr "" "Se è così, allora potresti dover reimpostare la posizione della memory card " "nelle opzioni." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Impossibile trovare il comando di apertura per l'estensione 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1382,17 +1373,17 @@ msgstr "" "Impossibile inizializzare i componenti di base.\n" "Verifica la tua configurazione." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Conteggio:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Paese:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Crea Codice AR" @@ -1427,12 +1418,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Directory attuale cambiata da %s a %s dopo wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Projection Hack Personalizzato" @@ -1440,11 +1431,11 @@ msgstr "Projection Hack Personalizzato" msgid "Custom Projection Hack Settings" msgstr "Impostazioni Personalizzate Projection Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Personalizza alcuni parametri di Orthographic Projection" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Ceco" @@ -1456,36 +1447,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP Emulator Engine" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulazione DSP HLE (veloce)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Interprete DSP LLE (lento)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Ricompilatore DSP LLE" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP su Thread Dedicato" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Impostazioni DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE su Thread Separato" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD Root:" @@ -1497,15 +1488,15 @@ msgstr "DVDLowRead - Errore Fatale: fallita lettura dal volume" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Errore Fatale: fallita lettura dal volume" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Dance Mat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Dimensione Dati" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Data:" @@ -1534,29 +1525,28 @@ msgstr "Debugging" msgid "Decimal" msgstr "." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Decomprimi ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Decomprimi ISO selezionate..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Decompressione ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Aggiorna l'elenco dei giochi" +msgstr "Diminuisci limite Frame" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Default" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO Predefinita:" @@ -1600,8 +1590,8 @@ msgstr "" msgid "Device" msgstr "Periferica" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Impostazioni Periferica" @@ -1609,15 +1599,12 @@ msgstr "Impostazioni Periferica" msgid "Dial" msgstr "Manopola" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1632,7 +1619,7 @@ msgstr "Disabilita" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Disabilita Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1669,7 +1656,6 @@ msgstr "" "Nel dubbio, lascia deselezionato." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" @@ -1681,7 +1667,7 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disco" @@ -1708,24 +1694,91 @@ msgstr "" msgid "Divide" msgstr "/" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Vuoi interrompere l'emulazione in corso?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Decoder Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revisione: %s\n" +"Compilato il: %s @ %s\n" +"\n" +"Dolphin è un emulatore Gamecube/Wii,\n" +"originariamente creato da F|RES ed ector.\n" +"Oggi Dolphin è un progetto open source dai tanti\n" +"collaboratori, troppi per essere elencati.\n" +"Se sei interessato, vai a vedere la pagina del progetto\n" +"su http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Ringraziamenti speciali a Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 e Hotquik per i loro\n" +"reverse engineering e documentazioni/demo.\n" +"\n" +"Grandi ringraziamenti a Gilles Mouchard il cui emulatore\n" +"Microlib PPC ha contribuito allo sviluppo iniziale.\n" +"\n" +"Grazie a Frank Wille per il suo disassembler PowerPC,\n" +"che or9 e noi abbiamo modificato per includere\n" +"le specifiche di Gekko\n" +"\n" +"Grazie a hcs/destop per i loro decoder GC ADPCM.\n" +"\n" +"Non siamo associati in alcun modo con Nintendo.\n" +"Gamecube e Wii sono marchi di proprietà di Nintendo.\n" +"L'emulatore esiste per scopi educativi, e non\n" +"dovrebbe essere utilizzato per giocare a giochi\n" +"che non possiedi legalmente." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin - Configurazione Video %s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Sito &Web Dolphin" @@ -1741,12 +1794,12 @@ msgstr "Dolphin - Configurazione Wiimote Emulato" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin - Configurazione Controller GC" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Filmati TAS Dolphin (*.dtm)" @@ -1754,18 +1807,18 @@ msgstr "Filmati TAS Dolphin (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin - Configurazione Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin in &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" "Dolphin non trova nessuna ISO GC/Wii. Doppioclicca qui per cercare i file..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1773,19 +1826,18 @@ msgstr "" "Dolphin è attualmente impostato per nascondere tutti i giochi. Doppioclicca " "qui per mostrare tutti i giochi..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin è impossibilitato a completare l'azione richiesta." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Abilita l'accesso rapido al disco. Necessario per alcuni giochi. (ON = " -"Velocità, OFF = Compatibilità)" +"Raddoppia la velocità di clock della GPU emulata. Potrebbe velocizzare " +"alcuni giochi (ON = Velocità. OFF = Compatibilità)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1805,11 +1857,11 @@ msgstr "Scaricati codici %lu. (%lu aggiunti)" msgid "Drums" msgstr "Percussioni/Batteria" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Fittizio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Salva l'Audio" @@ -1855,9 +1907,9 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Olandese" @@ -1882,15 +1934,15 @@ msgstr "" "potrebbe essere necessario un riavvio per permettere a Windows di " "riconoscere il nuovo driver." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:143 msgid "Early Memory Updates" -msgstr "Aggiornamenti di Memoria Preliminari" +msgstr "Aggiornamenti Anticipati della Memoria" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Modifica" @@ -1898,7 +1950,7 @@ msgstr "Modifica" msgid "Edit ActionReplay Code" msgstr "Modifica Codice ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Modifica Configurazione" @@ -1906,12 +1958,12 @@ msgstr "Modifica Configurazione" msgid "Edit Patch" msgstr "Modifica Patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Modifica prospettiva corrente" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Modifica..." @@ -1923,7 +1975,7 @@ msgstr "Effetto" msgid "Embedded Frame Buffer" msgstr "Embedded Frame Buffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Thread dell'Emulatore già in esecuzione" @@ -1962,9 +2014,9 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Wiimote Emulato" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " -msgstr "Stato dell'Emulazione: " +msgstr "Stato d'Emulazione: " #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:22 msgid "Enable" @@ -1986,15 +2038,15 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Abilita Logging AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Attiva Unione Blocchi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Abilita Calcolo delle Bounding Box" @@ -2006,7 +2058,7 @@ msgstr "Abilita Cache" msgid "Enable Cheats" msgstr "Abilita Trucchi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Abilita Dual Core" @@ -2014,7 +2066,7 @@ msgstr "Abilita Dual Core" msgid "Enable Dual Core (speedup)" msgstr "Abilita Dual Core (aumenta la velocità)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Abilita Idle Skipping" @@ -2022,7 +2074,7 @@ msgstr "Abilita Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Abilita Idle Skipping (aumenta la velocità)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Abilita MMU" @@ -2030,7 +2082,7 @@ msgstr "Abilita MMU" msgid "Enable Progressive Scan" msgstr "Abilita Scansione Progressiva" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Abilita Screen Saver" @@ -2038,7 +2090,7 @@ msgstr "Abilita Screen Saver" msgid "Enable Speaker Data" msgstr "Abilita Dati Altoparlante" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Abilita WideScreen" @@ -2061,7 +2113,7 @@ msgstr "" "\n" "Nel dubbio, seleziona 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2098,7 +2150,7 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2106,11 +2158,11 @@ msgstr "" "Se attivato, velocizza The Legend of Zelda: Twilight Princess. Da " "disattivare per qualsiasi altro gioco." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Abilita Projection Hack Personalizzato" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2118,22 +2170,13 @@ msgstr "" "Abilita l'emulazione Dolby Pro Logic II utilizzando il surround 5.1. Non " "disponibile su OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Abilita l'emulazione Dolby Pro Logic II utilizzando il surround 5.1. Solo " "con motore OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Abilita l'emulazione Dolby Pro Logic II utilizzando il surround 5.1. Solo " -"con motore OpenAL. Potrebbe essere necessario rinominare soft_oal.dll in " -"OpenAL32.dll perché funzioni." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2146,7 +2189,7 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2168,9 +2211,9 @@ msgstr "" msgid "End" msgstr "Fine" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Inglese" @@ -2193,23 +2236,22 @@ msgstr "Voce %d/%d" msgid "Entry 1/%d" msgstr "Voce 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Uguale" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" -msgstr "Errore/i" +msgstr "Errore" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Errore nel caricamento della lingua selezionata. Ritorno alla lingua di " "sistema." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2236,7 +2278,6 @@ msgid "Euphoria" msgstr "Euforia" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2247,16 +2288,20 @@ msgstr "" msgid "Execute" msgstr "Esegui" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Esci" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Esporta tutti i Salvataggi Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Esportazione non Riuscita" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Esporta File" @@ -2264,7 +2309,7 @@ msgstr "Esporta File" msgid "Export Recording" msgstr "Esporta Registrazione" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Esporta Registrazione..." @@ -2272,7 +2317,7 @@ msgstr "Esporta Registrazione..." msgid "Export Save" msgstr "Esporta Salvataggio" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Esporta salvataggio Wii (Sperimentale)" @@ -2280,15 +2325,15 @@ msgstr "Esporta salvataggio Wii (Sperimentale)" msgid "Export all saves" msgstr "Esporta tutti i salvataggi" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Esportazione non riuscita, riprovare?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Esportazione non riuscita" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Esporta salvataggio come..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Estensione" @@ -2304,44 +2349,44 @@ msgstr "Parametro Extra" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Il Parametro Extra è utile solo in ''Metroid: Other M''." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Estrai Tutti i File..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Estrai Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Estrai DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Estrai Directory..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Estrai File..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Estrai Partizione..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Estrazione %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Estrazione di Tutti i File" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Estrazione Directory" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Estrazione..." @@ -2353,15 +2398,15 @@ msgstr "Byte FIFO" msgid "FIFO Player" msgstr "Lettore FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANCIA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Dimensione FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Connessione non riuscita!" @@ -2369,11 +2414,15 @@ msgstr "Connessione non riuscita!" msgid "Failed to download codes." msgstr "Download dei codici non riuscito." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Estrazione in %s non riuscita!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2403,6 +2452,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Impossibile caricare bthprops.cpl! Non sarà possibile connettere veri " +"Wiimote e Dolphin stesso potrebbe crashare!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2410,21 +2461,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Impossibile caricare hid.dll! Non sarà possibile connettere veri Wiimote e " +"Dolphin stesso potrebbe crashare!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Fallita lettura di %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Accesso a banner.bin non riuscito" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Fallita lettura dell'header bk" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2435,7 +2488,7 @@ msgstr "" "La Memory Card potrebbe essere incompleta\n" "FilePosition:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2443,7 +2496,7 @@ msgstr "" "Fallita lettura del backup della tabella di allocazione blocchi\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2451,17 +2504,17 @@ msgstr "" "Fallita lettura della tabella di allocazione blocchi\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Fallita la lettura del file %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Fallita lettura dei dati dal file: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2469,7 +2522,7 @@ msgstr "" "Accesso alla directory di backup non riuscito\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2477,11 +2530,11 @@ msgstr "" "Accesso alla directory non riuscito\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Fallita lettura dell'header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2489,29 +2542,34 @@ msgstr "" "Fallita lettura dell'header\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Fallita lettura dell'header del file %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Lettura dell'ID univoco dall'immagine del disco non riuscita" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Scrittura di BT.DINF su SYSCONF non riuscita" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Scrittura bkhdr non riuscita" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Fallita scrittura di dati sul file: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Fallita la scrittura dell'intestazione di %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Fallita la scrittura dell'intestazione del file %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2521,13 +2579,13 @@ msgstr "Rapida" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Calcolo Rapido di Profondità" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Versione velocizzata della MMU. Non funziona per tutti i giochi." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2535,7 +2593,7 @@ msgstr "" "Desincronizzazione fatale. Interruzione della riproduzione. (Errore in " "PlayWiimote: %u != %u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Lettore Fifo" @@ -2559,7 +2617,7 @@ msgstr "" "Il file non può essere aperto\n" "o non possiede un'estensione valida" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2572,20 +2630,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Il file non è riconosciuto come una memory card" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "File non compresso" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Modalità di apertura sconosciuta : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Filesystem" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Il tipo 'ini' è sconosciuto! Il file non verrà aperto!" @@ -2647,7 +2705,7 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2658,7 +2716,7 @@ msgstr "" "abilita automaticamente questa impostazione durante l'utilizzo dei giochi " "giapponesi." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2672,13 +2730,18 @@ msgstr "in Avanti" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Forward port (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "Trovati %d risultati per '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Trovati %x file di salvataggio" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2720,9 +2783,9 @@ msgstr "Fotogrammi da Registrare:" msgid "Free Look" msgstr "Visuale Libera" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francese" @@ -2735,7 +2798,7 @@ msgstr "Tasti" msgid "From" msgstr "Da" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Schermo Intero" @@ -2747,7 +2810,7 @@ msgstr "Risoluzione a Schermo Intero" msgid "GCI File(*.gci)" msgstr "File GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "Pad GC" @@ -2755,27 +2818,27 @@ msgstr "Pad GC" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID Gioco:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Il Gioco è già in esecuzione!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Il Gioco non è in esecuzione!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Gioco non trovato!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Impostazioni Specifiche del Gioco" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Configurazione di Gioco" @@ -2792,20 +2855,20 @@ msgid "Gamecube &Pad Settings" msgstr "Impostazioni &Controlli GameCube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Schede di Memoria GameCube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Impostazioni Controlli GameCube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Codici Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2828,28 +2891,28 @@ msgstr "Generale" msgid "General Settings" msgstr "Impostazioni Generali" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Tedesco" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "GetARCode: Indice troppo grande rispetto alla dimensione dell'elenco dei " "codici AR %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Impostazioni Grafiche" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Maggiore di" @@ -2872,7 +2935,7 @@ msgstr "" "\n" "Nel dubbio, lascia selezionato." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Greco" @@ -2896,11 +2959,11 @@ msgstr "Chitarra" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Somma di controllo dell'intestazione non riuscita" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Ebreaico" @@ -2912,7 +2975,7 @@ msgstr "Altezza" msgid "Help" msgstr "Aiuto" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2933,7 +2996,7 @@ msgstr "" "\n" "Sayonara!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2986,7 +3049,7 @@ msgstr "Configurazione Tasti di Scelta Rapida" msgid "Hotkeys" msgstr "Tasti di Scelta Rapida" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Ungherese" @@ -2994,18 +3057,18 @@ msgstr "Ungherese" msgid "Hybrid Wiimote" msgstr "Wiimote Ibrido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Tentativo di ottenere dati da un ticket sconosciuto: %08x/" "%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3014,15 +3077,15 @@ msgstr "" "TitleID %016llx.\n" "Ora Dolphin probabilmente si bloccherà." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - Destinazione invalida" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Impostazioni IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "Puntamento IR" @@ -3034,15 +3097,15 @@ msgstr "Puntatore a infrarossi (IR)" msgid "IR Sensitivity:" msgstr "Sensibilità IR:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Dettagli ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Directory ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIA" @@ -3050,7 +3113,7 @@ msgstr "ITALIA" msgid "Icon" msgstr "Icona" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3095,9 +3158,13 @@ msgstr "" msgid "Import Save" msgstr "Importa Salvataggio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importazione non riuscita, riprovare?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importa Salvataggi Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importazione non riuscita" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3119,21 +3186,16 @@ msgstr "" "Il file importato ha estensione .sav\n" "ma non ha un'intestazione corretta" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "In Game" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "In-Game" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Framelimiter:" +msgstr "Aumenta limite Frame" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3153,7 +3215,7 @@ msgstr "Ins" msgid "Insert Encrypted or Decrypted code here..." msgstr "Inserisci qui il codice Criptato o Decriptato..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Inserisci SD Card" @@ -3161,38 +3223,39 @@ msgstr "Inserisci SD Card" msgid "Insert name here.." msgstr "Inserire qui il nome..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Installa WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Installa nel Menu Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "Chiamata di InstallExceptionHandler avvenuta, tuttavia questa piattaforma " "non la supporta ancora." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Installazione WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Errore di Controllo d'Integrità" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Controllo d'integrità completato" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Controllo d'integrità completato. Non sono stati trovati errori." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3205,7 +3268,7 @@ msgstr "" msgid "Interface" msgstr "Interfaccia" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Impostazioni Interfaccia" @@ -3230,20 +3293,20 @@ msgstr "Errore Interno LZO - lzo_init() fallito" msgid "Internal Resolution:" msgstr "Risoluzione Interna:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interprete (MOLTO lento)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Dimensione (%x) o Magic word (%x) non valida" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Valore non Valido!" @@ -3251,16 +3314,16 @@ msgstr "Valore non Valido!" msgid "Invalid bat.map or dir entry" msgstr "bat.map o voce directory non valide" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Tipo di evento %i non valido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "File non valido" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3271,7 +3334,7 @@ msgstr "" "%s\n" "È possibile che sia necessario il redumping del gioco." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "File di registrazione non valido" @@ -3289,34 +3352,36 @@ msgstr "" "Stringa di ricerca non valida (solo stringhe di lunghezza pari sono " "supportate)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Stato non valido" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italiano" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "GIAPPONE" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "Ricompilatore JIT (consigliato)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Ricompilatore sperimentale JITIL" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Giapponese" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3338,8 +3403,9 @@ msgstr "Finestra sempre in cima" msgid "Key" msgstr "Combinazione Tasti" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Coreano" @@ -3361,12 +3427,12 @@ msgstr "L-Analogico" msgid "Language:" msgstr "Lingua:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Salvataggio in %i Posizione" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latenza:" @@ -3405,7 +3471,7 @@ msgstr "" "Click sinistro/destro per altre opzioni.\n" "Click centrale del mouse per cancellare." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Minore di" @@ -3422,58 +3488,48 @@ msgid "Load Custom Textures" msgstr "Carica Texture Personalizzate" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Carica Stato di Gioco" +msgstr "Carica Stato di Gioco" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Carica Stato di Gioco da Slot 1" +msgstr "Carica Stato di Gioco in Posizione 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Carica Stato di Gioco da Slot 2" +msgstr "Carica Stato di Gioco in Posizione 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Carica Stato di Gioco da Slot 3" +msgstr "Carica Stato di Gioco in Posizione 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Carica Stato di Gioco da Slot 4" +msgstr "Carica Stato di Gioco in Posizione 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Carica Stato di Gioco da Slot 5" +msgstr "Carica Stato di Gioco in Posizione 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Carica Stato di Gioco da Slot 6" +msgstr "Carica Stato di Gioco in Posizione 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Carica Stato di Gioco da Slot 7" +msgstr "Carica Stato di Gioco in Posizione 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Carica Stato di Gioco da Slot 8" +msgstr "Carica Stato di Gioco in Posizione 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Carica Stato di Gioco da Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Carica Stato di Gioco da Slot 1" +msgstr "Carica Stato di Gioco nello Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3504,19 +3560,18 @@ msgid "Load State Slot 8" msgstr "Carica Stato di Gioco da Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Carica Stato di Gioco da Slot 1" +msgstr "Carica Stato di Gioco nello Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Carica Stato di Gioco..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Carica Menu di Sistema Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Carica il Menu di Sistema Wii %d%c" @@ -3535,10 +3590,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Carica valori preimpostati dai modelli hack disponibili." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Locale" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Log" @@ -3571,12 +3622,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Destinazione Logger" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Registrazione Eventi" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Persa connessione al server!" @@ -3584,7 +3635,7 @@ msgstr "Persa connessione al server!" msgid "M Button" msgstr "Pulsante M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3593,9 +3644,9 @@ msgstr "" "L'MD5 non corrisponde\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" -msgstr "Hack Velocità MMU" +msgstr "Speed Hack MMU" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:517 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:556 @@ -3607,11 +3658,11 @@ msgstr "File Gameshark MadCatz(*.gcs)" msgid "Main Stick" msgstr "Levetta Principale" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID Produttore:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Produttore:" @@ -3648,7 +3699,7 @@ msgid "Memory Byte" msgstr "Byte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Scheda di Memoria" @@ -3657,10 +3708,10 @@ msgid "" "Memory Card Manager WARNING-Make backups before using, should be fixed but " "could mangle stuff!" msgstr "" -"Gestore Scheda di Memoria - AVVISO: Eseguire una copia di sicurezza prima " +"Gestore Schede di Memoria - AVVISO: Eseguire una copia di sicurezza prima " "dell'uso!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3670,14 +3721,14 @@ msgid "" "%s\n" "Would you like to copy the old file to this new location?\n" msgstr "" -"Il Nome file della Scheda di Memoria nell'Ingresso %c non è corretto\n" -"Regione non specificata\n" +"Il Nome file della Memory Card nell'Ingresso %c non è corretto\n" +"Regionalità non specificata\n" "\n" "Il percorso dell'Ingresso %c è stato cambiato in\n" "%s\n" "Si desidera copiare il precedente file in questa nuova locazione?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "La dimensione della Memory Card non coincide con la dimensione " @@ -3687,7 +3738,7 @@ msgstr "" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mic" @@ -3700,7 +3751,7 @@ msgstr "Min" msgid "Misc" msgstr "Varie" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Impostazioni Varie" @@ -3725,11 +3776,11 @@ msgstr "" msgid "Monospaced font" msgstr "Carattere a spaziatura fissa" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motore" @@ -3849,15 +3900,15 @@ msgstr "TN Tab" msgid "NP Up" msgstr "TN Su" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nome:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nome: " @@ -3867,7 +3918,7 @@ msgstr "Nome: " msgid "Native GCI files(*.gci)" msgstr "File GCI nativi(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nuova Ricerca" @@ -3876,7 +3927,7 @@ msgstr "Nuova Ricerca" msgid "Next Page" msgstr "Pagina Successiva" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Ricerca Successiva" @@ -3884,11 +3935,11 @@ msgstr "Ricerca Successiva" msgid "Nickname :" msgstr "Nickname:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Nessun Paese (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Nessun ISO o WAD trovati" @@ -3896,7 +3947,7 @@ msgstr "Nessun ISO o WAD trovati" msgid "No audio output" msgstr "Nessun output audio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nessun file banner trovato per il titolo %s" @@ -3922,44 +3973,45 @@ msgstr "Nessuna voce di directory libera" msgid "No recorded file" msgstr "Nessun file registrato" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Nessuna cartella di salvataggio trovata per il titolo %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Nessuno" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norvegese" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Diverso" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Non Impostato" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Non è un file di salvataggio Wii o fallita lettura a causa della dimensione " "%x dell'intestazione del file" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Non collegato" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Note" @@ -3980,7 +4032,7 @@ msgstr "Avviso/i" msgid "Num Lock" msgstr "Bloc Num" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Numero Di Codici:" @@ -4001,7 +4053,7 @@ msgstr "Oggetto" msgid "Object Range" msgstr "Intervallo Oggetto" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Off" @@ -4013,25 +4065,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "Mostra Messaggi su Schermo" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "&Documentazione Online" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Solo %d blocchi disponibili" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Apri" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Apri &percorso file" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Apri cartella dei &salvataggi" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Apri file..." @@ -4057,7 +4113,15 @@ msgstr "Decoder Texture OpenCL" msgid "OpenMP Texture Decoder" msgstr "Decoder Texture OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Apre il file di configurazione (in sola lettura) predefinito per questo " +"gioco in un editor di testo separato." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opzioni" @@ -4067,24 +4131,21 @@ msgid "Orange" msgstr "Arancione" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"L'ordine dei file nella File Directory non corrisponde con l'ordine dei " -"blocchi\n" -"Clicca col tasto destro del mouse ed esporta tutti i salvataggi,\n" -"successivamente eseguire l'importazione di questi ultimi in una nuova memory " -"card\n" +"L'ordine dei file nella cartella non corrisponde all'ordine dei blocchi\n" +"Clicca il tasto destro ed esporta tutti i salvataggi,\n" +"e importali in una nuova memory card.\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Altro" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4096,15 +4157,15 @@ msgstr "" msgid "Output" msgstr "Output" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "&Riproduci Registrazione..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad " @@ -4128,17 +4189,17 @@ msgstr "Paragrafo" msgid "Parameters" msgstr "Parametri" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partizione %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Partizione inesistente: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patch" @@ -4146,8 +4207,8 @@ msgstr "Patch" msgid "Paths" msgstr "Percorsi" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausa" @@ -4160,7 +4221,7 @@ msgstr "Pausa al termine del filmato" msgid "Per-Pixel Lighting" msgstr "Illuminazione Per-Pixel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfetto" @@ -4170,9 +4231,9 @@ msgid "Perspective %d" msgstr "Prospettiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Gioca" @@ -4184,7 +4245,7 @@ msgstr "Riproduci Registrazione" msgid "Play/Pause" msgstr "Gioca/Pausa" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Giocabile" @@ -4192,11 +4253,11 @@ msgstr "Giocabile" msgid "Playback Options" msgstr "Opzioni di Riproduzione" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Giocatori" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Per favore confermare..." @@ -4208,23 +4269,23 @@ msgstr "Si prega di creare un prospettiva prima di salvare" msgid "Plus-Minus" msgstr "Più-Meno" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polacco" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Porta 1:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Porta 2:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Porta 3:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Porta 4:" @@ -4233,11 +4294,11 @@ msgstr "Porta 4:" msgid "Port :" msgstr "Porta:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portoghese" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portoghese (Brasiliano)" @@ -4245,17 +4306,17 @@ msgstr "Portoghese (Brasiliano)" msgid "Post-Processing Effect:" msgstr "Effetto di Post-Processing:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Termine prematuro del filmato in PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Termine prematuro del filmato in PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Termine prematuro del filmato in PlayWiimote. %u > %u" @@ -4272,7 +4333,7 @@ msgstr "Pag. Precedente" msgid "Previous Page" msgstr "Pagina Precedente" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valore Precedente" @@ -4288,7 +4349,7 @@ msgstr "Profilo" msgid "Properties" msgstr "Proprietà" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Ripulisci Cache" @@ -4297,7 +4358,7 @@ msgid "Question" msgstr "Conferma" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Esci" @@ -4319,17 +4380,17 @@ msgstr "R-Analogico" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSSIA" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" -msgstr "Gamma" +msgstr "Intensità" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:178 msgid "Read-only mode" @@ -4341,7 +4402,7 @@ msgstr "Reale" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Balance Board Reale" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4358,6 +4419,10 @@ msgstr "Wiimote Reali" msgid "Record" msgstr "Registra" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Registra input" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Info di Registrazione" @@ -4393,7 +4458,7 @@ msgstr "" "Nel dubbio, seleziona Nessuno." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Aggiorna" @@ -4402,14 +4467,14 @@ msgstr "Aggiorna" msgid "Refresh List" msgstr "Aggiorna Elenco" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Aggiorna l'elenco dei giochi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Rimuovi" @@ -4432,7 +4497,7 @@ msgstr "Renderizza nella Finestra Principale" msgid "Reset" msgstr "Resetta" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Risultati" @@ -4440,9 +4505,9 @@ msgstr "Risultati" msgid "Return" msgstr "Invio" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisione:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4453,20 +4518,18 @@ msgstr "Destra" msgid "Right Stick" msgstr "Levetta Destra" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibrazione" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Avvia DSP HLE e LLE su un thread dedicato (non consigliato: potrebbe causare " -"glitch al sonoro con HLE e bloccarsi con LLE)" +"Esegue DSP LLE su un thread dedicato (non consigliato: potrebbe bloccarsi)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russo" @@ -4479,7 +4542,7 @@ msgid "Safe" msgstr "Sicura" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Salva" @@ -4489,23 +4552,20 @@ msgid "Save GCI as..." msgstr "Salva GCI come.." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Sal&va Stato di Gioco" +msgstr "Salva sul più vecchio Stato di Gioco" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Sal&va Stato di Gioco" +msgstr "Salva Stato di Gioco" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Salva Stato di Gioco nello Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Salva Stato di Gioco nello Slot 1" +msgstr "Salva Stato di Gioco nello Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4536,32 +4596,31 @@ msgid "Save State Slot 8" msgstr "Salva Stato di Gioco nello Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Salva Stato di Gioco nello Slot 1" +msgstr "Salva Stato di Gioco nello Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Salva Stato di Gioco..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Salva come..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Salva GCM/ISO compressa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Salva prospettiva corrente" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Salva GCM/ISO decompressa" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Il salvataggio del filmato %s è corrotto, arresto registrazione..." @@ -4570,20 +4629,20 @@ msgstr "Il salvataggio del filmato %s è corrotto, arresto registrazione..." msgid "Scaled EFB Copy" msgstr "Copia EFB in scala" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Analizzo %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Ricerca ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Ricerca..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Screenshot" @@ -4595,11 +4654,11 @@ msgstr "Bloc Scroll" msgid "Search" msgstr "Cerca" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtro di Ricerca" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Cerca nelle Sottocartelle" @@ -4622,12 +4681,12 @@ msgstr "Sezione %s non trovata in SYSCONF" msgid "Select" msgstr "Seleziona" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Seleziona la Registrazione" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Seleziona un file WAD Wii da installare" @@ -4649,19 +4708,19 @@ msgstr "Seleziona un file di salvataggio da importare" msgid "Select floating windows" msgstr "Seleziona finestre libere/mobili" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Seleziona il file da caricare" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Seleziona il file di salvataggio" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Seleziona lo stato di gioco da caricare" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Seleziona lo stato di gioco da salvare" @@ -4684,7 +4743,7 @@ msgstr "" "\n" "Nel dubbio, seleziona Auto." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Il profilo controller selezionato non esiste" @@ -4708,39 +4767,28 @@ msgstr "" "Nel dubbio, usa la stessa risoluzione del desktop.\n" "Se sei ancora incerto, usa la più alta risoluzione funzionante." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Scegli quale API grafica usare internamente.\n" -"Direct3D 9 è di solito la più rapida. OpenGL è la più precisa. Direct3D 11 " -"si posiziona tra le due.\n" -"Tieni presente che i motori Direct3D sono disponibili soltanto su Windows.\n" -"\n" -"Nel dubbio, usa Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Scegli quale API grafica usare internamente.\n" -"Direct3D 9 è di solito la più rapida. OpenGL è la più precisa. Direct3D 11 " -"si posiziona tra le due.\n" -"Tieni presente che i motori Direct3D sono disponibili soltanto su Windows.\n" -"\n" -"Nel dubbio, usa Direct3D 11." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Invia" @@ -4752,18 +4800,18 @@ msgstr "Posizione della Sensor Bar: " msgid "Separator" msgstr "Separatore" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Porta Seriale 1 - Questa porta viene utilizzata da dispositivi come " "l'adattatore di rete" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Imposta come ISO &predefinita" @@ -4772,7 +4820,7 @@ msgstr "Imposta come ISO &predefinita" msgid "Set as default Memcard %c" msgstr "Imposta %c come Memory Card predefinita" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4787,19 +4835,19 @@ msgstr "" "Imposta la latenza (in ms). Valori maggiori possono ridurre la scattosità " "dell'audio. Solo con motore OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Impostazioni..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Impossible trovare il file di configurazione" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Impossibile creare file di configurazione" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Scuoti" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Nome breve:" @@ -4807,23 +4855,27 @@ msgstr "Nome breve:" msgid "Shoulder Buttons" msgstr "Tasti Dorsali" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Mostra &Console" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Mostra Finestra di &Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Mostra Barra di &Stato" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Mostra Barra degli St&rumenti" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Mostra Predefiniti" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Mostra Unità a Disco" @@ -4835,11 +4887,11 @@ msgstr "Mostra le Regioni di Copia dell'EFB" msgid "Show FPS" msgstr "Mostra FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Mostra Francia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Mostra GameCube" @@ -4847,35 +4899,35 @@ msgstr "Mostra GameCube" msgid "Show Input Display" msgstr "Mostra Tasti di Input" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Mostra Italia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Mostra JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Mostra Corea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Mostra Lingua:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Mostra &Configurazione Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Mostra PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Mostra Piattaforme" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Mostra Regioni" @@ -4883,27 +4935,27 @@ msgstr "Mostra Regioni" msgid "Show Statistics" msgstr "Mostra Informazioni" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Mostra Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Mostra USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Mostra Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Mostra Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Mostra una messaggio di conferma prima di arrestare un gioco." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4922,7 +4974,7 @@ msgstr "Mostra primo blocco" msgid "Show lag counter" msgstr "Mostra contatore lag" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4960,7 +5012,7 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Mostra sconosciuto" @@ -4974,23 +5026,24 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote in posizione di traverso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Cinese Semplificato" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Dimensioni" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Salta BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Salta ripulitura DCBZ" @@ -5014,17 +5067,17 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" -msgstr "Ingresso %i" +msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Ingresso A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Ingresso B" @@ -5032,7 +5085,7 @@ msgstr "Ingresso B" msgid "Snapshot" msgstr "Stamp" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderer Software" @@ -5048,27 +5101,27 @@ msgstr "" "È utile solamente ai fini di debugging.\n" "Vuoi davvero abilitare il rendering software? Nel dubbio, seleziona 'No'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Impostazioni Audio" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Il motore audio %s non è valido." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Creazione del buffer audio non riuscita: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Spazio" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spagnolo" @@ -5096,37 +5149,29 @@ msgstr "" "\n" "Nel dubbio, seleziona 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" -msgstr "Aumenta la velocità di trasferimento del Disco" - -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" +msgstr "Aumenta la velocità di trasferimento dal Disco" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Squadratura" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Controller Standard" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Avvia &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Avvia Re&gistrazione" @@ -5134,7 +5179,7 @@ msgstr "Avvia Re&gistrazione" msgid "Start Recording" msgstr "Avvia Registrazione" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Stato" @@ -5142,7 +5187,7 @@ msgstr "Stato" msgid "State Saves" msgstr "Stati di Gioco" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volante" @@ -5151,7 +5196,7 @@ msgid "Stick" msgstr "Levetta" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Arresta" @@ -5182,28 +5227,28 @@ msgstr "Strimpellata" msgid "Subtract" msgstr "-" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Il file è stato esportato in %s con successo" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "I file di salvataggio sono stati importati con successo." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Svedese" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Ruota/Oscilla" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Sincronizza thread GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5211,12 +5256,13 @@ msgstr "" "Sincronizza i thread della GPU e della CPU per prevenire alcuni blocchi " "casuali in modalità Dual Core. (ON = Compatibilità, OFF = Velocità)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Lingua di Sistema:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5241,13 +5287,13 @@ msgstr "Semipiano sinistro" msgid "Table Right" msgstr "Semipiano destro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Cattura uno Screenshot" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongo)" @@ -5267,11 +5313,11 @@ msgstr "Cache Texture" msgid "Texture Format Overlay" msgstr "Overlay Formato Texture" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "Il WAD è stato installato con successo" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "L'indirizzo non è valido" @@ -5279,13 +5325,13 @@ msgstr "L'indirizzo non è valido" msgid "The checksum was successfully fixed" msgstr "Il checksum è stato corretto con successo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "La directory scelta è già in lista" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5308,7 +5354,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Il file %s è già stato aperto, l'intestazione non verrà scritta." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Il file specificato (%s) non esiste" @@ -5341,7 +5387,7 @@ msgstr "" "Il file di salvataggio che si sta provando a copiare ha una dimensione non " "valida" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5349,36 +5395,36 @@ msgstr "" "La lingua selezionata non è supportata dal tuo sistema. Ritorno alla " "predefinita di sistema." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Le versioni di NetPlay del server e del client non sono compatibili!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Il server è pieno!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Il server ha risposto: il gioco è correntemente in esecuzione!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Il server invia un messaggio d'errore sconosciuto!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "il file specificato \"%s\" non esiste" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Il valore non è valido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5386,23 +5432,22 @@ msgstr "" "Deve esistere un ticket per 00000001/00000002. Il dump della tua NAND è " "probabilmente incompleto." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "" -"Queste impostazioni sovrascrivono quelle generiche di Dolphin. \n" -"Per impostazione 'indeterminata' si intende che il gioco utilizza " -"l'impostazione di Dolphin." +"Queste impostazioni possono sovrascrivere quelle settate in Dolphin. \n" +"L'opzione 'indeterminato' utilizzerà le impostazioni di Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" "Questo simulatore di action replay non supporta codici automodificanti." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "Ciò potrebbe causare rallentamenti all'interno del Menu Wii e in alcuni " @@ -5428,47 +5473,46 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Imposta un limite ai frame disegnati ogni secondo diverso dal valore " -"standard (NTSC:60, PAL:50)" +"Limita la velocità del gioco a uno specifico numero di frame ogni secondo " +"(il massimo della velocità è 60 per lo standard NTSC e 50 per PAL). In " +"alternativa, usa Audio per velocizzare in accordo con il DSP (potrebbe " +"correggere l'audio a scatti ma potrebbe causare un rumore costante a seconda " +"del gioco)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" "Causes major speed improvements on PCs with more than one core, but can also " "cause occasional crashes/glitches." msgstr "" -"Consente di separare il processo (thread) dedicato al Video da quello " -"adibito\n" -"ai calcoli della CPU in modo da poterli eseguire su nuclei (cores) " -"distinti.\n" -"Migliora la velocità sui PC con più di un core,\n" -"ma può anche provocare occasionali crash/difetti." +"Consente di avviare su thread diversi i calcoli dedicati all'output video e " +"quelli dedicati alla CPU per poterli eseguire su core distinti.\n" +"Migliora la velocità sui PC multiprocessore, ma può anche ma può anche " +"provocare occasionali crash o malfunzionamenti." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" -msgstr "" -"Questo vi permetterà di modificare manualmente il file di configurazione INI" +msgstr "Permette di modificare manualmente il file di configurazione INI" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:237 #: Source/Core/InputCommon/Src/ControllerEmu.cpp:242 msgid "Threshold" msgstr "Sensibilità" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Inclina" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Titolo" @@ -5482,39 +5526,37 @@ msgid "Toggle All Log Types" msgstr "Seleziona/Deseleziona tutti i Tipi di Log" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Rapporto d'Aspetto:" +msgstr "Imposta Aspetto" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Copie EFB" +msgstr "Imposta Copie EFB" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Seleziona/Deseleziona tutti i Tipi di Log" +msgstr "Imposta Nebbia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Visualizza a Schermo Intero" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Imposta IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Sopra" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Cinese Tradizionale" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Tentativo di caricamento di un tipo di file sconosciuto." @@ -5534,7 +5576,7 @@ msgstr "" "Tentativo di lettura da una SYSCONF non valida\n" "Gli identificativi Wiimote bt non sono disponibili" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turco" @@ -5550,12 +5592,12 @@ msgstr "Tipo" msgid "UDP Port:" msgstr "Porta UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "Wiimote UDP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "SCONOSCIUTO" @@ -5564,7 +5606,7 @@ msgstr "SCONOSCIUTO" msgid "UNKNOWN_%02X" msgstr "UNKNOWN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5577,9 +5619,9 @@ msgstr "" "Voce non modificata." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5587,7 +5629,7 @@ msgstr "" "%lu del codice AR inserito. Assicurati di averlo inserito correttamente.\n" "Vuoi ignorare questa riga e continuare l'analisi?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "%i non definito" @@ -5597,19 +5639,18 @@ msgid "Undo Load State" msgstr "Annulla Caricamento Stato di Gioco" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Annulla Caricamento Stato di Gioco" +msgstr "Annulla Salvataggio dello Stato di Gioco" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Chiamata 0x80 inaspettata? Interruzione..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Sconosciuto" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Comando DVD %08x sconosciuto - errore fatale" @@ -5624,12 +5665,12 @@ msgstr "Comando 0x%08x sconosciuto" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Voce %i sconosciuta in SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Messaggio ricevuto sconosciuto avente id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5641,16 +5682,16 @@ msgstr "" msgid "Up" msgstr "Su" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Aggiorna" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote in posizione verticale" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Utilizza Modalità EuRGB60 (PAL60)" @@ -5658,7 +5699,7 @@ msgstr "Utilizza Modalità EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Usa Schermo Intero" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Usa Hex" @@ -5673,6 +5714,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Utilizza un algoritmo meno preciso per calcolare i valori di profondità.\n" +"Causa problemi in alcuni giochi ma potrebbe fornire un buon aumento di " +"velocità.\n" +"\n" +"Nel dubbio, lascia selezionato." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5687,6 +5733,20 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Utilizza operazioni instabili per velocizzare il vertex streaming in OpenGL. " +"Non ci sono problemi conosciuti sulle GPU supportate, ma nelle altre causerà " +"seri problemi grafici e di stabilità.\n" +"\n" +"Nel dubbio, lascia deselezionato." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5710,12 +5770,11 @@ msgstr "Utilità" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Hack Velocità MMU" +msgstr "Speed Hack VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valore" @@ -5723,7 +5782,7 @@ msgstr "Valore" msgid "Value:" msgstr "Valore:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Valore: " @@ -5733,9 +5792,9 @@ msgstr "Verboso" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Vertex Streaming Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video" @@ -5743,17 +5802,17 @@ msgstr "Video" msgid "Virtual" msgstr "Virtuale" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volume" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Installazione WAD non riuscita: errore nella creazione di %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Fallita installazione del WAD: errore durante la creazione del ticket" @@ -5775,19 +5834,19 @@ msgstr "" msgid "Warning" msgstr "Attenzione" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Attenzione - avvio DOL in modalità console errata!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Attenzione - avvio ELF in modalità console errata!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Attenzione - avvio ISO in modalità console errata!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5813,7 +5872,7 @@ msgstr "" "dal nome uguale a quello dei file sulla tua memory card\n" "Continuare?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5825,7 +5884,7 @@ msgstr "" "salvataggio prima di continuare, o caricare questo stesso stato con modalità " "sola-lettura off." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5837,7 +5896,7 @@ msgstr "" "caricare questo stato in modalità sola-lettura off. Altrimenti probabilmente " "riscontrerai una desincronizzazione." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5892,19 +5951,15 @@ msgstr "Larghezza" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Console Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Root NAND Wii:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importa Salvataggi Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "File di Salvataggio Wii (*.bin)|*.bin" @@ -5913,16 +5968,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Impossibile leggere dal file" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote Collegato" @@ -5930,7 +5991,7 @@ msgstr "Wiimote Collegato" msgid "Wiimote Motor" msgstr "Vibrazione Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Impostazioni Wiimote" @@ -5954,16 +6015,16 @@ msgstr "Windows Destro" msgid "Word Wrap" msgstr "Adatta Testo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Attività in corso..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Scrivi Memory Card (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5981,21 +6042,36 @@ msgstr "Scrivi su File" msgid "Write to Window" msgstr "Scrivi in Finestra" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "CreateSourceVoice XAudio2 non riuscita: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Inizializzazione XAudio2 non riuscita: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "Creazione master voice XAudio2 non riuscita: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "CreateSourceVoice XAudio2 non riuscita: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Inizializzazione XAudio2 non riuscita: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Creazione master voice XAudio2 non riuscita: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -6031,11 +6107,11 @@ msgstr "Non è possibile chiudere riquadri che hanno pagine al loro interno" msgid "You must choose a game!!" msgstr "È necessario selezionare un gioco!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Devi inserire un nome!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "È necessario inserire un valore decimale, esadecimale o ottale." @@ -6043,7 +6119,7 @@ msgstr "È necessario inserire un valore decimale, esadecimale o ottale." msgid "You must enter a valid profile name." msgstr "Devi inserire un nome valido per il profilo." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "È necessario riavviare Dolphin affinché le modifiche abbiano effetto." @@ -6057,7 +6133,7 @@ msgstr "" "Vuoi interrompere ora l'emulazione per correggere il problema?\n" "Se scegli \"No\", l'audio potrebbe essere disturbato." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6076,15 +6152,15 @@ msgstr "" "Dovrebbe essere 0x%04x (invece di 0x%04llx)\n" "Desideri generarne uno nuovo?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "Hack ZTP" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 codice non supportato" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero codice sconosciuto per dolphin: %08x" @@ -6143,22 +6219,26 @@ msgstr "" "\n" "Nel dubbio, lascia deselezionato." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Lettura Opcode da %x. Si prega di segnalarlo." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "caratteristica sconosciuta %d (ci si aspettava %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "messaggio sconosciuto ricevuto" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" -msgstr "valore wxExecute ritornato -1 su applicazione in esecuzione!" +msgstr "wxExecute ritorna -1 all'avvio dell'applicazione!" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:43 msgid "zFar Correction: " @@ -6172,76 +6252,51 @@ msgstr "Correzione zNear: " msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulazione VBeam accurata" +#~ msgid "Could not create %s" +#~ msgstr "Impossibile creare %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Modifica Sovrascritture Locali" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Apre le sovrascritture specificate dall'utente in un editor di testo " +#~ "separato." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Permettere l'attivazione di alcune impostazioni internamente alla " -#~ "finestra d'emulazione tramite i tasti rapidi 3 (Risoluzione Interna), 4 " -#~ "(Rapporto d'Aspetto), 5 (Copia EFB) e 6 (Nebbia).\n" +#~ "Scegli quale API grafica usare internamente.\n" +#~ "Direct3D 9 è di solito la più rapida. OpenGL è la più precisa. Direct3D " +#~ "11 si posiziona tra le due.\n" +#~ "Tieni presente che i motori Direct3D sono disponibili soltanto su " +#~ "Windows.\n" #~ "\n" -#~ "Nel dubbio, lascia deselezionato." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "" -#~ "Impossibile trovare il WiiMote sul bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Abilita Tasti di Scelta Rapida" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Fallita operazione di Ascolto!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Caricamento bthprops.cpl non riuscito" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Caricamento hid.dll non riuscito" - -#~ msgid "GCMic Configuration" -#~ msgstr "Configurazione GCMic" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "Chiamata a HCI_CMD_INQUIRY, si prega di segnalarlo!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr " Upload Modificato del Buffer" +#~ "Nel dubbio, usa Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Se il framerate risulta incoerente o incostante, questa opzione potrebbe " -#~ "porvi rimedio. (ON = Compatibilità, OFF = Velocità)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Ultimo Stato di Gioco Sovrascritto" - -#~ msgid "Last Saved State" -#~ msgstr "Ultimo Stato di Gioco Salvato" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Riconnetti il Wiimote al Caricamento di uno Stato di Gioco" - -#~ msgid "Set" -#~ msgstr "Imposta" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Salta Destination Alpha" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Utilizza una strategia particolare di uploading per il vertex stream.\n" -#~ "Di solito velocizza l'emulazione, ma è vietato dalle specifiche OpenGL e " -#~ "potrebbe causare pesanti artefatti.\n" +#~ "Scegli quale API grafica usare internamente.\n" +#~ "Direct3D 9 è di solito la più rapida. OpenGL è la più precisa. Direct3D " +#~ "11 si posiziona tra le due.\n" +#~ "Tieni presente che i motori Direct3D sono disponibili soltanto su " +#~ "Windows.\n" #~ "\n" -#~ "Nel dubbio, lascia deselezionato." +#~ "Nel dubbio, usa Direct3D 11." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Lettura Opcode da %x. Si prega di segnalarlo." diff --git a/Languages/po/ja.po b/Languages/po/ja.po index 5f7362c007..bfd207366d 100644 --- a/Languages/po/ja.po +++ b/Languages/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-16 23:40+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-20 13:38+0000\n" "Last-Translator: DanbSky \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/dolphin-emu/" "language/ja/)\n" @@ -20,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(該当数ãŒå¤šã™ãŽã¾ã™)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "タイトル:" @@ -34,7 +34,7 @@ msgstr "タイトル:" msgid "! NOT" msgstr "! (...ã§ç„¡ã„)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +43,7 @@ msgstr "" "メモリーカードファイル \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“。\n" " 容é‡16MBã§æ–°ãŸã«ä½œæˆã—ã¾ã™ã‹ ?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" ã¯ç„¡åŠ¹ãªãƒ•ã‚¡ã‚¤ãƒ«ã€ã¾ãŸã¯ã‚²ãƒ¼ãƒ ã‚­ãƒ¥ãƒ¼ãƒ–ï¼Wii ã®ISOã§ã¯ã‚ã‚Šã¾ã›ã‚“" @@ -58,28 +58,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$s コピー %1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d x" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d x (å“質 %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s ã®ã‚¹ã‚¯ãƒ©ãƒ“ングã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãŠãらã壊れã¦ã„ã¾ã™ã€‚" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -88,7 +88,7 @@ msgstr "" "%s メモリーカードã®èª­ã¿è¾¼ã¿ã«å¤±æ•—\n" " ä¸æ­£ãªã‚«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã§ã™ (0x%x ãƒã‚¤ãƒˆ)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -97,7 +97,7 @@ msgstr "" "%s メモリーカードã®èª­ã¿è¾¼ã¿ã«å¤±æ•—\n" " ä¸æ­£ãªã‚«ãƒ¼ãƒ‰å®¹é‡ã§ã™ (0x%x ãƒã‚¤ãƒˆ)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -107,22 +107,27 @@ msgstr "" "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºã¯å°ã•ã™ãŽã¾ã™ã€‚æ­£ã—ã„ファイルã§ã¯ã‚ã‚Šã¾ã›ã‚“ (0x%x ãƒã‚¤" "ト)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s ã‚’é–‹ãã®ã«å¤±æ•—" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s failed: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s ã¯0ãƒã‚¤ãƒˆã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s ã¯åœ§ç¸®æ¸ˆã¿ã§ã™ï¼ã“れ以上圧縮ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s ã¯ãƒ•ã‚¡ã‚¤ãƒ«åãŒé•·ã™ãŽã¾ã™ã€45文字ã¾ã§ã«åŽã‚ã¦ãã ã•ã„" @@ -151,7 +156,7 @@ msgstr "%u ブロック空ã | %u エントリ空ã" msgid "&& AND" msgstr "&& (...ã¨...)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "Dolphinã«ã¤ã„ã¦(&A)" @@ -159,7 +164,7 @@ msgstr "Dolphinã«ã¤ã„ã¦(&A)" msgid "&Boot from DVD Drive..." msgstr "DVDドライブã‹ã‚‰èµ·å‹•(&B)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "ブレークãƒã‚¤ãƒ³ãƒˆ(&B)" @@ -167,7 +172,7 @@ msgstr "ブレークãƒã‚¤ãƒ³ãƒˆ(&B)" msgid "&Browse for ISOs..." msgstr "ISOファイルã®ã‚るフォルダをé¸æŠž(&B)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "ãƒãƒ¼ãƒˆã‚³ãƒ¼ãƒ‰ç·¨é›†ãƒ„ール(&C)" @@ -175,11 +180,11 @@ msgstr "ãƒãƒ¼ãƒˆã‚³ãƒ¼ãƒ‰ç·¨é›†ãƒ„ール(&C)" msgid "&DSP Settings" msgstr "サウンド設定(&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "ã“ã®ã‚¿ã‚¤ãƒˆãƒ«ã®å®Ÿä½“を削除(&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "é¸æŠžã—ãŸã‚¿ã‚¤ãƒˆãƒ«ã®å®Ÿä½“ã‚’å…¨ã¦å‰Šé™¤(&D)" @@ -191,11 +196,11 @@ msgstr "エミュレーション(&E)" msgid "&File" msgstr "ファイル(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "Frame Advance(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "全画é¢è¡¨ç¤º(&F)" @@ -203,7 +208,7 @@ msgstr "全画é¢è¡¨ç¤º(&F)" msgid "&Graphics Settings" msgstr "グラフィック設定(&G)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "ヘルプ(&H)" @@ -211,7 +216,7 @@ msgstr "ヘルプ(&H)" msgid "&Hotkey Settings" msgstr "ホットキーã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º(&H)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -223,11 +228,11 @@ msgstr "ステートロード(&L)" msgid "&Memcard Manager (GC)" msgstr "GCメモリーカードマãƒãƒ¼ã‚¸ãƒ£(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memory" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "é–‹ã(&O)" @@ -235,51 +240,51 @@ msgstr "é–‹ã(&O)" msgid "&Options" msgstr "設定(&O)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "一時åœæ­¢(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "開始(&P)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "プロパティ(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "読ã¿è¾¼ã¿å°‚用 (&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "ゲームリストをå†æ›´æ–°(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "レジスタ(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "リセット(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "サウンド(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "åœæ­¢(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "ツール(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "æç”»(&V)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "表示(&V)" @@ -287,7 +292,7 @@ msgstr "表示(&V)" msgid "&Wiimote Settings" msgstr "Wii入力設定(&W)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "å…¬å¼Wiki(英語)ã§å‹•ä½œçŠ¶æ³ã‚’確èª(&W)" @@ -312,9 +317,8 @@ msgid "(off)" msgstr "オフ" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ (...ã«åŠ ãˆã¦)" +msgstr "+ (...ã«åŠ ãˆã¦)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -324,7 +328,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Native (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 ビット" @@ -340,7 +344,7 @@ msgstr "2.5x Native (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Native (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 ビット" @@ -356,7 +360,7 @@ msgstr "3x Native (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Native (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 ビット" @@ -368,7 +372,7 @@ msgstr "コードåを入力ã—ã¦ãã ã•ã„" msgid "" msgstr "<対応ã§ãる解åƒåº¦ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "ãªã—" @@ -376,7 +380,7 @@ msgstr "ãªã—" msgid "" msgstr "入力を待機..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<システムã®è¨€èªžï¼ž" @@ -385,12 +389,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "ãƒãƒƒãƒˆãƒ—レイウィンドウã¯ã™ã§ã«é–‹ã‹ã‚Œã¦ã„ã¾ã™ï¼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "ゲームã¯ç¾åœ¨ã€èµ·å‹•ã•ã‚Œã¦ã„ã¾ã›ã‚“" @@ -412,37 +416,36 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "~ãƒãƒƒãƒˆãƒ—レイã«é–¢ã—ã¦ã®æ³¨æ„事項~\n" "\n" "ç¾åœ¨ãƒãƒƒãƒˆãƒ—レイã¯ä»¥ä¸‹ã®è¨­å®šã§ã—ã‹ã†ã¾ã動作ã—ã¾ã›ã‚“。\n" -" - ãƒ‡ãƒ¥ã‚¢ãƒ«ã‚³ã‚¢å‡¦ç† ã€ç„¡åŠ¹ã€‘\n" -" - Audio Throttle ã€ç„¡åŠ¹ã€‘\n" -" - サウンド出力API ã‚’ \"No Audio Output\"ã«è¨­å®šã€ã¾ãŸã¯ DSP-LLE を使用\n" -" - コントローラã®æ•°ã‚’æ­£ã—ã設定ã™ã‚‹ã€‚ã¾ãŸç¾åœ¨ã¯ [標準コントローラ] ã®ã¿å‹•ä½œ\n" +" - デュアルコア動作を行ㆠã€ç„¡åŠ¹ã€‘\n" +" - DSPエミュレータ方å¼ã¯å…¨ã¦ã®ãƒ—レイヤーã§çµ±ä¸€ã—ã¦ãŠã\n" +" - DSP on Dedicated Threadã€ç„¡åŠ¹ã€‘\n" +" - フレームリミットã¯ã€Œã‚µã‚¦ãƒ³ãƒ‰ã€â€ä»¥å¤–â€ã«è¨­å®šã™ã‚‹ã“ã¨\n" "\n" "å…¨ã¦ã®ãƒ—レーヤーã¯Dolphinã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’åŒä¸€ã«æƒãˆã€è¨­å®šã‚‚統一ã™ã‚‹ã“ã¨ã€‚\n" "メモリーカードã¯ç„¡åŠ¹ã«ã—ã¦ãŠãã‹ã€å‚加ã™ã‚‹ãƒ—レーヤーã«åŒä¸€ã®ã‚‚ã®ã‚’å‰ã‚‚ã£ã¦é…" "布ã—ã¦ãŠã。\n" -"Wii リモコンã®ã‚µãƒãƒ¼ãƒˆã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n" +"Wii リモコンã®å…¥åŠ›ã‚µãƒãƒ¼ãƒˆã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n" "\n" -"TCPãƒãƒ¼ãƒˆã®é–‹æ”¾ã‚’忘れãšã«ï¼" +"ホストå´ã¯ã€TCPãƒãƒ¼ãƒˆã®é–‹æ”¾ã‚’忘れãšã«ï¼\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "Triforce基æ¿" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "アクションリプレイコード" @@ -490,14 +493,14 @@ msgstr "" "å•é¡Œã®ã‚るコード:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" "Action Replay エラー: ä¸æ­£ãªã‚µã‚¤ã‚º (%08x : address = %08x) in Add Code (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -506,7 +509,7 @@ msgstr "" "Action Replay エラー: ä¸æ­£ãªã‚µã‚¤ã‚º (%08x : address = %08x) in Fill and Slide " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -515,7 +518,7 @@ msgstr "" "Action Replay エラー: ä¸æ­£ãªã‚µã‚¤ã‚º (%08x : address = %08x) in Ram Write And " "Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -524,12 +527,12 @@ msgstr "" "Action Replay エラー: ä¸æ­£ãªã‚µã‚¤ã‚º (%08x : address = %08x) in Write To " "Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay エラー: ä¸æ­£ãªå€¤ (%08x) in Memory Copy (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -539,27 +542,27 @@ msgstr "" "(%s)\n" "マスターコードã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。使用ã—ãªã„ã§ãã ã•ã„。" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "エラー: 無効ãªã‚³ãƒ¼ãƒ‰ ライン: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: æ¡ä»¶ä»˜ãコード: ä¸æ­£ãªã‚µã‚¤ã‚º %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: ä¸æ­£ãªç¨®é¡žã®é€šå¸¸ã‚³ãƒ¼ãƒ‰ %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: 通常コード %i: ä¸æ­£ãªã‚µãƒ–タイプ %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: 通常コード 0: ä¸æ­£ãªã‚µãƒ–タイプ %08x (%s)" @@ -573,11 +576,11 @@ msgstr "ビデオカード:" msgid "Add" msgstr "追加" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "コードを追加" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "パッãƒã‚’追加" @@ -585,9 +588,9 @@ msgstr "パッãƒã‚’追加" msgid "Add new pane" msgstr "Add new pane" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "追加" @@ -641,32 +644,32 @@ msgstr "高度ãªè¨­å®š" msgid "Advanced Settings" msgstr "高度ãªè¨­å®š" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "å…¨ã¦ã® GC/Wii ファイル (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "å…¨ã¦ã® GC/Wii イメージ (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "GC GCMファイル (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "å…¨ã¦ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚»ãƒ¼ãƒ–ファイル (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Wii ISOファイル (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "圧縮ã•ã‚ŒãŸGC/Wii ISOファイル (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« (*.*)|*.*" @@ -686,20 +689,20 @@ msgstr "異方性フィルタリング:" msgid "Anti-Aliasing:" msgstr "アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹ï¼š" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" "Apploader ã®ã‚µã‚¤ã‚ºãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ¬å½“ã«Apploaderã§ã™ã‹ï¼Ÿ" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader ファイルã‹ã‚‰èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "é©ç”¨" @@ -713,7 +716,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€ã‚ªãƒ•ã€‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "アラビア語" @@ -722,7 +725,7 @@ msgstr "アラビア語" msgid "Are you sure you want to delete \"%s\"?" msgstr "\"%s\" ã“ã®ãƒ—ロファイルを削除ã—ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -730,15 +733,20 @@ msgstr "" "ã“れら複数ã®ã‚¿ã‚¤ãƒˆãƒ«ã®å®Ÿä½“ファイルを削除ã—ã¾ã™ã‹ï¼Ÿ\n" "å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "ã“ã®ã‚¿ã‚¤ãƒˆãƒ«ã®å®Ÿä½“ファイルを削除ã—ã¾ã™ã‹ï¼Ÿå…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (実験的)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (実験的)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "アスペクト比:" @@ -747,12 +755,12 @@ msgstr "アスペクト比:" msgid "At least one pane must remain open." msgstr "At least one pane must remain open." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "サウンド" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "出力API (Audio Backend)" @@ -760,7 +768,7 @@ msgstr "出力API (Audio Backend)" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Error opening AO device.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "自動" @@ -799,16 +807,16 @@ msgstr "BP register " msgid "Back" msgstr "Back" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "出力設定" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "æç”»API:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰å…¥åŠ›ã‚’許å¯" @@ -817,24 +825,24 @@ msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰å…¥åŠ›ã‚’許å¯" msgid "Backward" msgstr "後方" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "ファイルヘッダã®ä¸è‰¯" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "ãƒãƒ©ãƒ³ã‚¹Wii ボード" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "ãƒãƒŠãƒ¼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "ãƒãƒŠãƒ¼ã®è©³ç´°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "ãƒãƒŠãƒ¼è¡¨ç¤º" @@ -854,7 +862,7 @@ msgstr "基本設定" msgid "Bass" msgstr "ãƒã‚¹ãƒ‰ãƒ©" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Block Allocation Table checksum failed" @@ -875,7 +883,7 @@ msgid "Blue Right" msgstr "é’ - å³" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "下部" @@ -884,27 +892,27 @@ msgstr "下部" msgid "Bound Controls: %lu" msgstr "コマンド数: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "ダメダメ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "é¸æŠž" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "ゲームリストã«è¿½åŠ ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "ISOã®ã‚るフォルダをブラウズ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "出力先をé¸æŠž" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "ãƒãƒƒãƒ•ã‚¡ï¼š" @@ -914,7 +922,7 @@ msgstr "ãƒãƒƒãƒ•ã‚¡ï¼š" msgid "Buttons" msgstr "ボタン" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -961,33 +969,33 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Can't find WiiMote by connection handle %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "キャンセル" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "%s ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Cannot unregister events with events pending" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -998,7 +1006,7 @@ msgstr "" "%s\n" "ã“ã‚Œã¯ä¸æ­£ãªãƒ¡ãƒ¢ãƒªãƒ¼ã‚«ãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿ã§ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1010,7 +1018,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "カタルーニャ語" @@ -1018,11 +1026,11 @@ msgstr "カタルーニャ語" msgid "Center" msgstr "Center" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "変更" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "ディスクã®å…¥ã‚Œæ›¿ãˆ(&D)" @@ -1030,11 +1038,11 @@ msgstr "ディスクã®å…¥ã‚Œæ›¿ãˆ(&D)" msgid "Change Disc" msgstr "ディスクã®å…¥ã‚Œæ›¿ãˆ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "ゲームを変更" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1050,11 +1058,11 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "ã“ã®è¨­å®šã¯æ¬¡å›žã®ã‚²ãƒ¼ãƒ é–‹å§‹æ™‚ã«å映ã•ã‚Œã¾ã™ï¼" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "ãƒãƒ£ãƒƒãƒˆæ¬„" @@ -1062,47 +1070,47 @@ msgstr "ãƒãƒ£ãƒƒãƒˆæ¬„" msgid "Cheat Code" msgstr "ãƒãƒ¼ãƒˆã‚³ãƒ¼ãƒ‰" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "コードサーãƒ" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "ãƒãƒ¼ãƒˆã‚³ãƒ¼ãƒ‰ç·¨é›†ãƒ„ール" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "パーティションã®æ•´åˆæ€§ã‚’ãƒã‚§ãƒƒã‚¯" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "簡体字中国語" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "ç¹ä½“字中国語" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "DVDルートフォルダをé¸æŠžã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "NANDã®ã‚るルートフォルダをé¸æŠžã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "ディスクãƒãƒ£ãƒ³ãƒãƒ«ã«è¡¨ç¤ºã™ã‚‹ã‚¿ã‚¤ãƒˆãƒ«ã‚’é¸æŠž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "追加ã—ãŸã„フォルダをé¸æŠž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "メモリーカードをé¸æŠž" @@ -1110,7 +1118,7 @@ msgstr "メモリーカードをé¸æŠž" msgid "Choose a memory card:" msgstr "メモリーカードをé¸æŠž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1118,8 +1126,8 @@ msgstr "" "apploaderã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžï¼š(フォルダã‹ã‚‰ã®ã¿æ§‹ç¯‰ã•ã‚ŒãŸãƒ‡ã‚£ã‚¹ã‚¯ã«" "é©ç”¨ã•ã‚Œã¾ã™)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "ä¿å­˜å…ˆã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„" @@ -1138,7 +1146,7 @@ msgstr "クラシックコントローラ" msgid "Clear" msgstr "全消去" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1148,7 +1156,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "é–‰ã˜ã‚‹" @@ -1157,11 +1165,11 @@ msgstr "é–‰ã˜ã‚‹" msgid "Co&nfigure..." msgstr "Dolphin本体ã®è¨­å®š(&N)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "コードã®æƒ…å ±" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "コード:" @@ -1173,24 +1181,24 @@ msgstr "Command" msgid "Comment" msgstr "コメント" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "ゲーム紹介" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "ã“ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’圧縮" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "é¸æŠžã—ãŸISOファイルを全ã¦åœ§ç¸®" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "圧縮ã—ã¦ã„ã¾ã™..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "本体設定" @@ -1204,18 +1212,18 @@ msgstr "設定" msgid "Configure Control" msgstr "コントロールã®è¨­å®š" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "パッド設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Dolphin本体ã®è¨­å®šã‚’è¡Œã„ã¾ã™" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "ファイルã®ä¸Šæ›¸ãを確èª" @@ -1228,17 +1236,16 @@ msgstr "動作åœæ­¢æ™‚ã«ç¢ºèª" msgid "Connect" msgstr "接続" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "USBキーボードã®æŽ¥ç¶šã‚’エミュレート" +msgstr "ãƒãƒ©ãƒ³ã‚¹Wii ボードを接続" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "USBキーボードã®æŽ¥ç¶šã‚’エミュレート" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "%iPã®Wii リモコンを接続" @@ -1259,7 +1266,7 @@ msgstr "3Pã®Wii リモコンを接続" msgid "Connect Wiimote 4" msgstr "4Pã®Wii リモコンを接続" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "接続中..." @@ -1279,7 +1286,7 @@ msgstr "Control" msgid "Convert to GCI" msgstr "GCIファイルã«å¤‰æ›" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "コピーã«å¤±æ•—" @@ -1288,21 +1295,16 @@ msgstr "コピーã«å¤±æ•—" msgid "Copy to Memcard %c" msgstr "メモリーカード%cã«ã‚³ãƒ”ー" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "コア" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "%s を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Could not initialize backend %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1313,24 +1315,16 @@ msgstr "" "プディスクã§ã¯ã‚ã‚Šã¾ã›ã‚“。オリジナルã®GC/Wii ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¯ã»ã¨ã‚“ã©ã®PC用DVDド" "ライブã§ã¯èª­ã¿è¾¼ã‚ãªã„点ã«ç•™æ„ã—ã¦ãã ã•ã„" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "ISOファイル %s ã‚’èªè­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "%s をセーブã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"ç¾åœ¨ãƒ‘ッド設定を行ãˆã¾ã›ã‚“。 プレーヤーãŒæ®‹ã£ã¦ã„ã‚‹ã‹ã‚²ãƒ¼ãƒ ãŒèµ·å‹•ä¸­ã§ã™ï¼\n" -"(ゲーム中ã®è¨­å®šå¤‰æ›´ã¯ç¾åœ¨ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1351,11 +1345,11 @@ msgstr "" "メモリーカードファイルをデフォルトã®å ´æ‰€ã‹ã‚‰ç§»å‹•ã—ãŸå ´åˆã¯ã€æœ¬ä½“設定よりãã®" "場所をå†æŒ‡å®šã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "æ‹¡å¼µå­'ini'ã«å¯¾ã—ã¦é–¢é€£ä»˜ã‘られã¦ã„るプログラムãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1363,17 +1357,17 @@ msgstr "" "コアをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n" "設定を確èªã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "該当:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "発売国" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "アクションリプレイコードを作æˆ" @@ -1409,12 +1403,12 @@ msgstr "" msgid "Crossfade" msgstr "クロスフェーダー" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Current directory changed from %s to %s after wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Custom Projection Hack" @@ -1422,11 +1416,11 @@ msgstr "Custom Projection Hack" msgid "Custom Projection Hack Settings" msgstr "Custom Projection Hackã®è¨­å®š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "設定画é¢ã«å…¥ã‚Šã¾ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "ãƒã‚§ã‚³èªž" @@ -1438,36 +1432,36 @@ msgstr "D" msgid "D-Pad" msgstr "å字キー" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "サウンド" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSPエミュレーション方å¼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP-HLE エミュレーション (高速)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP-LLE インタプリタ (低速)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP-LLE リコンパイラ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP on Dedicated Thread" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "サウンドã«é–¢ã™ã‚‹è¨­å®šã‚’è¡Œã„ã¾ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE on Separate Thread" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVDルート" @@ -1479,15 +1473,15 @@ msgstr "DVDLowRead - Fatal Error: failed to read from volume" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "マットコントローラ" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "データサイズ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "発売日" @@ -1516,29 +1510,28 @@ msgstr "デãƒãƒƒã‚°ç”¨é …ç›®" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ISOファイルã¸å¾©å…ƒ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "é¸æŠžã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’å…¨ã¦ISOファイルã¸å¾©å…ƒ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "復元中..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "ゲームリストをå†æ›´æ–°ã—ã¾ã™" +msgstr "フレームリミットを下ã’ã‚‹" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "既定" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "デフォルトISO" @@ -1582,8 +1575,8 @@ msgstr "" msgid "Device" msgstr "デãƒã‚¤ã‚¹" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "デãƒã‚¤ã‚¹è¨­å®š" @@ -1591,15 +1584,12 @@ msgstr "デãƒã‚¤ã‚¹è¨­å®š" msgid "Dial" msgstr "ダイアル" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1614,7 +1604,7 @@ msgstr "無効化" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Disable Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1650,19 +1640,18 @@ msgstr "" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"多ãã®ã‚¿ã‚¤ãƒˆãƒ«ã§ç”»é¢åŠ¹æžœã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ã€ã‚¢ãƒ«ãƒ•ã‚¡é€éŽå‡¦ç†ã‚’スキップ ã—ã¾" -"ã™ã€‚\n" +"アルファãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢æ©Ÿèƒ½ã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ 無効化ã—ã¾ã™ã€‚" +"多ãã®ã‚²ãƒ¼ãƒ ã§ã¯ç”»é¢ã‚¨ãƒ•ã‚§ã‚¯ãƒˆã®ãŸã‚ã«ä½¿ã‚ã‚Œã¦ã„ã¾ã™ã€‚\n" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "ディスク" @@ -1689,24 +1678,90 @@ msgstr "" msgid "Divide" msgstr "Divide" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "動作中ã®ã‚²ãƒ¼ãƒ ã‚’åœæ­¢ã—ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II decoder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator is for educational purposes only\n" +"and should not be used to play games you do\n" +"not legally own." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s グラフィック設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin Webサイト(&W)" @@ -1722,12 +1777,12 @@ msgstr "Wii リモコンã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³è¨­å®š" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "GCコントローラ設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS ムービー (*.dtm)" @@ -1735,11 +1790,11 @@ msgstr "Dolphin TAS ムービー (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Wiiリモコンã®è¨­å®š" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin 開発状æ³(&G)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1747,7 +1802,7 @@ msgstr "" "ゲームリストã¯ç©ºã§ã™ã€‚ã“ã®æ–‡ç« ã‚’ダブルクリックã—㦠GC/Wii ã®ISO ã¾ãŸã¯ WBFS " "ã‚‚ã—ã㯠WADファイルã®ã‚るフォルダをé¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1755,19 +1810,18 @@ msgstr "" "リスト中ã®å…¨ã¦ã®ã‚²ãƒ¼ãƒ ãŒè¨­å®šã«ã‚ˆã‚Šè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã›ã‚“。ã“ã®æ–‡ç« ã‚’ダブルクリッ" "クã™ã‚‹ã¨è¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "è¦æ±‚ã•ã‚ŒãŸæ“作を完了ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"ディスクã®èª­ã¿å–り速度をå‘上ã•ã›ã¾ã™ã€‚å¿…è¦ã«ãªã‚‹ã‚¿ã‚¤ãƒˆãƒ«ã¯ã‚ãšã‹ã§ã™ [有効ï¼" -"ロード時間短縮ï¼ç„¡åŠ¹ï¼äº’æ›æ€§ãƒ»å®‰å®šæ€§é‡è¦–]" +"GPUã®ã‚¯ãƒ­ãƒƒã‚¯ãƒ¬ãƒ¼ãƒˆã‚’2å€ã«ã—ã¦å‹•ä½œã•ã›ã¾ã™ã€‚ã„ãã¤ã‹ã®ã‚¿ã‚¤ãƒˆãƒ«ã§é€Ÿåº¦ã®å‘上ãŒ" +"ç‹™ãˆã¾ã™ã€‚[有効ï¼å‹•ä½œé€Ÿåº¦å‘上ï¼ç„¡åŠ¹ï¼äº’æ›æ€§é‡è¦–]" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1787,11 +1841,11 @@ msgstr "%lu個ã®ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚( æ–°è¦è¿½åŠ ï¼š %lu個 )" msgid "Drums" msgstr "ドラムコントローラ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "ダミーデãƒã‚¤ã‚¹" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "サウンドã®ãƒ€ãƒ³ãƒ—" @@ -1838,9 +1892,9 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "オランダ語" @@ -1864,7 +1918,7 @@ msgstr "" "Dolphinã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’æ›´æ–°ã—ãŸå ´åˆã¯ã€ãƒ‰ãƒ©ã‚¤ãƒã‚’èªè­˜ã•ã›ã‚‹ãŸã‚ã«Windowsã®å†èµ·" "å‹•ãŒå¿…è¦ã«ãªã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "欧州" @@ -1872,7 +1926,7 @@ msgstr "欧州" msgid "Early Memory Updates" msgstr "Early Memory Updates" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "編集" @@ -1880,7 +1934,7 @@ msgstr "編集" msgid "Edit ActionReplay Code" msgstr "コードを編集" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "iniを編集" @@ -1888,12 +1942,12 @@ msgstr "iniを編集" msgid "Edit Patch" msgstr "パッãƒã‚’編集" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Edit current perspective" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "編集" @@ -1905,7 +1959,7 @@ msgstr "エフェクト" msgid "Embedded Frame Buffer" msgstr "Embedded Frame Buffer (内蔵フレームãƒãƒƒãƒ•ã‚¡)" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "エミュレーションスレッドã¯ã™ã§ã«ç¨¼åƒä¸­ã§ã™" @@ -1933,7 +1987,7 @@ msgid "" "If unsure, leave this checked." msgstr "" "GPUテクスãƒãƒ£ã‚ªãƒ–ジェクトã¨ã—ã¦XFBをエミュレートã—ã¾ã™ã€‚\n" -"XFBエミュレーションãŒå¿…è¦ãªã‚¿ã‚¤ãƒˆãƒ«ã®ã»ã¨ã‚“ã©ã‚’ã€Real】設定よりも高速㫠動作" +"XFBエミュレーションãŒå¿…è¦ãªã‚¿ã‚¤ãƒˆãƒ«ã®ã»ã¨ã‚“ã©ã‚’ ã€Real】設定よりも高速ã«å‹•ä½œ" "ã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ \n" "ãŸã ã€Homebrewアプリãªã©ã®å…ƒã€…XFBãŒå¿…è¦ã§ãªã„ゲームã¯ä¸Šæ‰‹ã動作 ã—ãªããªã‚Šã¾" "ã™ã€‚\n" @@ -1944,7 +1998,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Wii リモコンをエミュレート" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "動作状æ³ï¼š" @@ -1964,19 +2018,19 @@ msgstr "" "立体視表示を有効ã«ã—ã¾ã™ã€‚使用ã™ã‚‹ã«ã¯GPUã«ã‚ˆã‚‹ Nvidia 3D Vision ã®ã‚µãƒãƒ¼ãƒˆãŒ" "å¿…è¦ã§ã™ã€‚\n" "ã»ã¨ã‚“ã©ã®å ´åˆä½•ã‹ã—らã®å•é¡ŒãŒç™ºç”Ÿã™ã‚‹ã§ã—ょã†ã€‚\n" -"ã“ã®æ©Ÿèƒ½ã¯ãƒ•ãƒ«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³è¡¨ç¤ºæ™‚ã®ã¿å‹•ä½œã—ã¾ã™ã€‚\n" +"ã“ã®æ©Ÿèƒ½ã¯å…¨ç”»é¢è¡¨ç¤ºæ™‚ã®ã¿å‹•ä½œã—ã¾ã™ã€‚\n" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "アクションリプレイコードã®ãƒ­ã‚°ã‚’å–å¾—ã™ã‚‹" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Enable Block Merging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Enable Bounding Box Calculation" @@ -1988,7 +2042,7 @@ msgstr "Enable Cache" msgid "Enable Cheats" msgstr "ãƒãƒ¼ãƒˆã‚³ãƒ¼ãƒ‰ã‚’有効化" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Enable Dual Core" @@ -1996,7 +2050,7 @@ msgstr "Enable Dual Core" msgid "Enable Dual Core (speedup)" msgstr "デュアルコア動作を行ㆠ(速度å‘上)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Enable Idle Skipping" @@ -2004,7 +2058,7 @@ msgstr "Enable Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "アイドルスキップ処ç†ã‚’行ㆠ(速度å‘上)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Enable MMU" @@ -2012,7 +2066,7 @@ msgstr "Enable MMU" msgid "Enable Progressive Scan" msgstr "プログレッシブ表示を有効化" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "スクリーンセーãƒãƒ¼ã‚’有効化" @@ -2020,7 +2074,7 @@ msgstr "スクリーンセーãƒãƒ¼ã‚’有効化" msgid "Enable Speaker Data" msgstr "スピーカー出力ã®æœ‰åŠ¹åŒ–" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Enable WideScreen" @@ -2042,7 +2096,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€1x】をé¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2077,7 +2131,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2085,11 +2139,11 @@ msgstr "" "トワイライトプリンセスã«ãŠã„ã¦ã€åºƒå¤§ãªã‚¨ãƒªã‚¢ã§ç™ºç”Ÿã™ã‚‹FPS低下を抑ãˆã¾ã™ã€‚ä»–ã®" "タイトルã§ã¯ç„¡åŠ¹ã«ã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Enables Custom Projection Hack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2097,22 +2151,13 @@ msgstr "" "Dolby Pro Logic II を使用ã—ãŸ5.1サラウンドã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’è¡Œã„ã¾ã™ã€‚OSX " "ã«ã¯ç¾åœ¨æœªå¯¾å¿œã§ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Dolby Pro Logic II を使用ã—ãŸ5.1サラウンドã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’è¡Œã„ã¾ã™ã€‚" "OpenALã®ã¿å¯¾å¿œ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Dolby Pro Logic II を使用ã—ãŸ5.1サラウンドã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’è¡Œã„ã¾ã™ã€‚" -"OpenALã®ã¿å¯¾å¿œã€‚『soft_oal.dllã€ã‚’『OenAL32.dllã€ã«ãƒªãƒãƒ¼ãƒ ã™ã‚‹ã“ã¨ã§å‹•ä½œã—ã¾" -"ã™" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2125,7 +2170,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2147,9 +2192,9 @@ msgstr "" msgid "End" msgstr "End" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "英語" @@ -2172,22 +2217,21 @@ msgstr "エントリ %d/%d" msgid "Entry 1/%d" msgstr "エントリ 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "ã«ä¸€è‡´ã™ã‚‹" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "エラー" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "é¸æŠžã—ãŸè¨€èªžã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚<システムã®è¨€èªžï¼žã«è¨­å®šã‚’戻ã—ã¾ã™" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2212,7 +2256,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Exception handler - access below memory space. %08llx%08llx" @@ -2221,16 +2264,20 @@ msgstr "Exception handler - access below memory space. %08llx%08llx" msgid "Execute" msgstr "Execute" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Dolphin を終了" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "å…¨ã¦ã®Wiiセーブデータをエクスãƒãƒ¼ãƒˆ" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "エクスãƒãƒ¼ãƒˆã«å¤±æ•—" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "ファイルを抽出" @@ -2238,7 +2285,7 @@ msgstr "ファイルを抽出" msgid "Export Recording" msgstr "録画ファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "録画ファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" @@ -2246,7 +2293,7 @@ msgstr "録画ファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" msgid "Export Save" msgstr "セーブデータをエクスãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "セーブデータをエクスãƒãƒ¼ãƒˆ (実験的)" @@ -2254,15 +2301,15 @@ msgstr "セーブデータをエクスãƒãƒ¼ãƒˆ (実験的)" msgid "Export all saves" msgstr "å…¨ã¦ã®ã‚»ãƒ¼ãƒ–データをエクスãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "エクスãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚リトライã—ã¾ã™ã‹ï¼Ÿ" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "エクスãƒãƒ¼ãƒˆã«å¤±æ•—" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "セーブデータã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå…ˆã‚’é¸æŠž" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "拡張コントローラ" @@ -2278,44 +2325,44 @@ msgstr "特殊パラメータ" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "『メトロイド Other Mã€ã®ã¿ã«æœ‰ç”¨ãªè¨­å®šã§ã™" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Apploaderを抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOLを抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "ã“ã®ãƒ‘ーティションを抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s を抽出" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’エクスãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "フォルダをエクスãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "抽出ã—ã¦ã„ã¾ã™..." @@ -2327,15 +2374,15 @@ msgstr "FIFO ãƒã‚¤ãƒˆ" msgid "FIFO Player" msgstr "FIFO プレーヤー" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "フランス" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FSTサイズ" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "接続ã«å¤±æ•—ï¼" @@ -2343,11 +2390,15 @@ msgstr "接続ã«å¤±æ•—ï¼" msgid "Failed to download codes." msgstr "コードã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "%s ã¸ã®æŠ½å‡ºã«å¤±æ•—" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2375,6 +2426,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"実機リモコンã®åˆ©ç”¨ã«å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ« bthprops.cpl ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" +"Dolphin を強制終了ã—ã¾ã™" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2382,21 +2435,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"実機リモコンã®åˆ©ç”¨ã«å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ« hid.dll ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚Dolphin " +"を強制終了ã—ã¾ã™" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" -msgstr "" +msgstr "Failed to read %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Failed to read banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Failed to read bk header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2407,7 +2462,7 @@ msgstr "" "Memcard may be truncated\n" "FilePosition:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2415,7 +2470,7 @@ msgstr "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2423,17 +2478,17 @@ msgstr "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Failed to read data from file %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Failed to read data from file: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2441,7 +2496,7 @@ msgstr "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2449,11 +2504,11 @@ msgstr "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Failed to read header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2461,29 +2516,34 @@ msgstr "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "ファイル %d ã®ãƒ˜ãƒƒãƒ€èª­ã¿è¾¼ã¿ã«å¤±æ•—" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Failed to read unique ID from disc image" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Failed to write BT.DINF to SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Failed to write bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "次ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Failed to write header for %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Failed to write header for file %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "ペルシア語" @@ -2493,13 +2553,13 @@ msgstr "Fast" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Fast Depth Calculation" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "高速ãªMMUを使用ã—ã¾ã™ã€‚å…¨ã¦ã®ã‚²ãƒ¼ãƒ ã§ã†ã¾ãå‹•ãã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2507,7 +2567,7 @@ msgstr "" "致命的ãªdesyncãŒç™ºç”Ÿã—ãŸãŸã‚å†ç”Ÿã‚’中止ã—ã¾ã™ã€‚ (Error in PlayWiimote: %u != " "%u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "FIFO プレーヤー" @@ -2531,7 +2591,7 @@ msgstr "" "ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ\n" "ã‚‚ã—ãã¯æœ‰åŠ¹ãªæ‹¡å¼µå­ã§ã¯ã‚ã‚Šã¾ã›ã‚“" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2544,20 +2604,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ¡ãƒ¢ãƒªãƒ¼ã‚«ãƒ¼ãƒ‰ã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "圧縮ã•ã‚Œã¦ã„ãªã„ファイル" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Unknown open mode : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "構造" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr " 'ini' ã¯ä¸æ˜Žãªæ‹¡å¼µå­ã§ã™ã€‚é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ï¼" @@ -2619,7 +2679,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2630,7 +2690,7 @@ msgstr "" "ãƒã‚§ãƒƒã‚¯ã‚’外ã—ãŸçŠ¶æ…‹ã§ã¯Dolphin㯠NTSC-U を使用ã—ã¾ã™ãŒã€æ—¥æœ¬ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’プレ" "イ時ã«ã¯è‡ªå‹•çš„ã«ã“ã®è¨­å®šã¯æœ‰åŠ¹ã«ãªã‚Šã¾ã™" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2644,13 +2704,18 @@ msgstr "å‰æ–¹" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "ãƒãƒ¼ãƒˆé–‹æ”¾ã‚’自動ã§è¨­å®š (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "検索çµæžœï¼š%d 件 '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr " %x 個ã®ã‚»ãƒ¼ãƒ–データãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2692,9 +2757,9 @@ msgstr "録画フレーム数設定" msgid "Free Look" msgstr "フリールック" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "フランス語" @@ -2707,7 +2772,7 @@ msgstr "フレットボタン" msgid "From" msgstr "開始" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "全画é¢" @@ -2719,7 +2784,7 @@ msgstr "全画é¢è¡¨ç¤ºæ™‚ã®è§£åƒåº¦ï¼š" msgid "GCI File(*.gci)" msgstr "GCI ファイル (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "入力(GC)" @@ -2727,27 +2792,27 @@ msgstr "入力(GC)" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ゲームID" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "ã™ã§ã«èµ·å‹•ã—ã¦ã„ã¾ã™ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "ゲームãŒèµ·å‹•ã—ã¦ã„ã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "ゲームãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "固有設定" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "ゲーム設定" @@ -2764,20 +2829,20 @@ msgid "Gamecube &Pad Settings" msgstr "ゲームキューブ入力設定(&P)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "メモリーカードファイル (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "ゲームキューブã®å…¥åŠ›è¨­å®šã‚’è¡Œã„ã¾ã™" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Geckoコード" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2800,27 +2865,27 @@ msgstr "一般" msgid "General Settings" msgstr "一般" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "ドイツ語" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" "GetARCode: インデックスã®ã‚µã‚¤ã‚ºãŒã‚³ãƒ¼ãƒ‰ãƒªã‚¹ãƒˆã®ã‚µã‚¤ã‚ºã‚’上回ã£ã¦ã„ã¾ã™ %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "ビデオ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "æç”»ã«é–¢ã™ã‚‹è¨­å®šã‚’è¡Œã„ã¾ã™" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "より大ãã„" @@ -2840,7 +2905,7 @@ msgstr "" "動作速度ã¯å°‘々低下ã—ã€ã¾ã‚Œã«æç”»ãƒã‚°ã®åŽŸå› ã«ã‚‚ãªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’外ã•ãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "ギリシア語" @@ -2864,11 +2929,11 @@ msgstr "ギターコントローラ" msgid "Hacks" msgstr "高速化(Hacks)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Header checksum failed" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "ヘブライ語" @@ -2880,7 +2945,7 @@ msgstr "範囲(縦)" msgid "Help" msgstr "ヘルプ" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2901,7 +2966,7 @@ msgstr "" "\n" "ã•ã‚ˆãªã‚‰ï¼\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2955,7 +3020,7 @@ msgstr "ホットキーã®è¨­å®š" msgid "Hotkeys" msgstr "ホットキー" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "ãƒãƒ³ã‚¬ãƒªãƒ¼èªž" @@ -2963,16 +3028,16 @@ msgstr "ãƒãƒ³ã‚¬ãƒªãƒ¼èªž" msgid "Hybrid Wiimote" msgstr "Hybrid Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -2981,15 +3046,15 @@ msgstr "" "TitleID %016llx.\n" " Dolphin ã‚’åœæ­¢ã—ã¾ã™" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - bad destination" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL設定" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "ãƒã‚¤ãƒ³ã‚¿" @@ -3001,15 +3066,15 @@ msgstr "IR ãƒã‚¤ãƒ³ã‚¿" msgid "IR Sensitivity:" msgstr "感度" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ゲームã®è©³ç´°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "フォルダ一覧" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "イタリア" @@ -3017,7 +3082,7 @@ msgstr "イタリア" msgid "Icon" msgstr "アイコン" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3060,9 +3125,13 @@ msgstr "" msgid "Import Save" msgstr "セーブデータをインãƒãƒ¼ãƒˆ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "インãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚リトライã—ã¾ã™ã‹ï¼Ÿ" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Wii セーブデータã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "インãƒãƒ¼ãƒˆã«å¤±æ•—" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3084,21 +3153,16 @@ msgstr "" "インãƒãƒ¼ãƒˆã•ã‚ŒãŸã®ã¯'sav'ファイルã®ã‚ˆã†ã§ã™\n" "ã—ã‹ã—æ­£ã—ã„ヘッダã§ã¯ã‚ã‚Šã¾ã›ã‚“" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "ソコソコ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "ゲーム内" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "フレームリミット:" +msgstr "フレームリミットを上ã’ã‚‹" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "情報" @@ -3118,7 +3182,7 @@ msgstr "Insert" msgid "Insert Encrypted or Decrypted code here..." msgstr "ã“ã“ã«æš—å·åŒ–or復å·åŒ–ã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã‚’貼り付ã‘ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "SDカードã®æŒ¿å…¥ã‚’エミュレート" @@ -3126,38 +3190,39 @@ msgstr "SDカードã®æŒ¿å…¥ã‚’エミュレート" msgid "Insert name here.." msgstr "コードåを入力ã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Wiiメニューã«WADファイルを追加" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Wiiメニューã¸ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã—ãŸãŒã€ã“ã®ãƒ—ラットフォームã¯ã¾ã ã‚µ" "ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "追加ã—ã¦ã„ã¾ã™..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "エラーãŒç¢ºèªã•ã‚Œã¾ã—ãŸï¼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "完了" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "ãƒã‚§ãƒƒã‚¯çµ‚了。整åˆæ€§ã«å•é¡Œã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3170,7 +3235,7 @@ msgstr "" msgid "Interface" msgstr "表示" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Dolphinã®è¡¨ç¤ºã«é–¢ã™ã‚‹è¨­å®š" @@ -3185,7 +3250,7 @@ msgid "" "Try loading the state again" msgstr "" "Internal LZO Error - decompression failed (%d) (%li, %li) \n" -"ã‚‚ã†ä¸€åº¦ãƒ­ãƒ¼ãƒ‰ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„" +"ã‚‚ã†ä¸€åº¦ã‚¹ãƒ†ãƒ¼ãƒˆãƒ­ãƒ¼ãƒ‰ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„" #: Source/Core/Core/Src/State.cpp:530 msgid "Internal LZO Error - lzo_init() failed" @@ -3195,20 +3260,20 @@ msgstr "Internal LZO Error - lzo_init() failed" msgid "Internal Resolution:" msgstr "内部解åƒåº¦ã®å¤‰æ›´ï¼š" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (éžå¸¸ã«ä½Žé€Ÿ)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "イントロ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Invalid Size(%x) or Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "無効ãªå€¤ã§ã™ï¼" @@ -3216,16 +3281,16 @@ msgstr "無効ãªå€¤ã§ã™ï¼" msgid "Invalid bat.map or dir entry" msgstr "Invalid bat.map or dir entry" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Invalid event type %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "ä¸æ­£ãªãƒ•ã‚¡ã‚¤ãƒ«" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3236,7 +3301,7 @@ msgstr "" "%s\n" " ã“ã®ã‚²ãƒ¼ãƒ ã‚’ダンプã—ãªãŠã—ã¦ãã ã•ã„" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "ä¸æ­£ãªéŒ²ç”»ãƒ•ã‚¡ã‚¤ãƒ«" @@ -3252,34 +3317,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "ä¸æ­£ãªã‚¹ãƒ†ãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "イタリア語" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "日本" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Recompiler (推奨)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL experimental recompiler (実験的)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "日本語" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "韓国" @@ -3302,8 +3369,9 @@ msgstr "最å‰é¢ã«è¡¨ç¤º" msgid "Key" msgstr "キー設定" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "韓国語" @@ -3325,12 +3393,12 @@ msgstr "L (アナログ)" msgid "Language:" msgstr "GUI言語:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "%iã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "レイテンシー:" @@ -3369,7 +3437,7 @@ msgstr "" "å·¦orå³ã‚¯ãƒªãƒƒã‚¯ã§è¨­å®šç”»é¢ã«å…¥ã‚Šã¾ã™\n" "中クリックã§æ¶ˆåŽ»ã—ã¾ã™" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "よりå°ã•ã„" @@ -3386,58 +3454,48 @@ msgid "Load Custom Textures" msgstr "カスタムテクスãƒãƒ£ã‚’読ã¿è¾¼ã‚€" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "ステートロード(&L)" +msgstr "ステートロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "ステートロード - スロット 1" +msgstr "1ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "ステートロード - スロット 2" +msgstr "2ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "ステートロード - スロット 3" +msgstr "3ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "ステートロード - スロット 4" +msgstr "4ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "ステートロード - スロット 5" +msgstr "5ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "ステートロード - スロット 6" +msgstr "6ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "ステートロード - スロット 7" +msgstr "7ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "ステートロード - スロット 8" +msgstr "8ã¤å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚’ロード" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "ステートロード - スロット 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "ステートロード - スロット 1" +msgstr "ステートロード - スロット 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3468,19 +3526,18 @@ msgid "Load State Slot 8" msgstr "ステートロード - スロット 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "ステートロード - スロット 1" +msgstr "ステートロード - スロット 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "ファイルã‹ã‚‰ãƒ­ãƒ¼ãƒ‰" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wiiメニューを起動" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Wiiメニューを起動 ( ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š%d %c )" @@ -3500,10 +3557,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "特定ã®ã‚²ãƒ¼ãƒ å‘ã‘ã®è¨­å®šå€¤ã‚’読ã¿è¾¼ã¿ã¾ã™" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "ローカル" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "ログ" @@ -3535,12 +3588,12 @@ msgstr "" msgid "Logger Outputs" msgstr "ログ出力先" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "ログ" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "サーãƒãƒ¼ã¨ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•ã‚Œã¾ã—ãŸï¼" @@ -3548,7 +3601,7 @@ msgstr "サーãƒãƒ¼ã¨ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•ã‚Œã¾ã—ãŸï¼" msgid "M Button" msgstr "M Button" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3557,7 +3610,7 @@ msgstr "" "MD5ã®ä¸æ•´åˆ\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Speed Hack" @@ -3571,11 +3624,11 @@ msgstr "MadCatz Gameshark セーブファイル(*.gcs)" msgid "Main Stick" msgstr "コントロールスティック" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "メーカーID" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "メーカー" @@ -3611,7 +3664,7 @@ msgid "Memory Byte" msgstr "メモリãƒã‚¤ãƒˆ" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "メモリーカード" @@ -3621,7 +3674,7 @@ msgid "" "could mangle stuff!" msgstr "メモリーカードマãƒãƒ¼ã‚¸ãƒ£ã€€ï½žä½¿ç”¨å‰ã«ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’ï¼" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3638,7 +3691,7 @@ msgstr "" "%s\n" "ã“ã®å ´æ‰€ã«å¤ã„ファイルをコピーã—ã¾ã™ã‹ï¼Ÿ\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "メモリカードã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒã€ãƒ˜ãƒƒãƒ€ã®ã‚µã‚¤ã‚ºã«ä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“" @@ -3646,7 +3699,7 @@ msgstr "メモリカードã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒã€ãƒ˜ãƒƒãƒ€ã®ã‚µã‚¤ã‚ºã« msgid "Menu" msgstr "メニュー" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "マイク" @@ -3659,7 +3712,7 @@ msgstr "最å°" msgid "Misc" msgstr "ãã®ä»–" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "ãã®ä»–ã®è¨­å®š" @@ -3684,11 +3737,11 @@ msgstr "" msgid "Monospaced font" msgstr "等幅フォント" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "モーションプラス" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "モーター" @@ -3807,15 +3860,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Up" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "åå‰" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "åå‰ï¼š " @@ -3825,7 +3878,7 @@ msgstr "åå‰ï¼š " msgid "Native GCI files(*.gci)" msgstr "ãƒã‚¤ãƒ†ã‚£ãƒ– GCI ファイル(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "æ–°è¦æ¤œç´¢" @@ -3834,7 +3887,7 @@ msgstr "æ–°è¦æ¤œç´¢" msgid "Next Page" msgstr "次ã®ãƒšãƒ¼ã‚¸" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "続ã‘ã¦æ¤œç´¢" @@ -3842,11 +3895,11 @@ msgstr "続ã‘ã¦æ¤œç´¢" msgid "Nickname :" msgstr "ニックãƒãƒ¼ãƒ ï¼š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "No Country (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "リストã«é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ï¼" @@ -3854,7 +3907,7 @@ msgstr "リストã«é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“ï¼" msgid "No audio output" msgstr "出力ã—ãªã„" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "%s ã®ãƒãƒŠãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“" @@ -3880,42 +3933,43 @@ msgstr "空ãエントリãŒã‚ã‚Šã¾ã›ã‚“" msgid "No recorded file" msgstr "録画ファイルãªã—" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "%s ã®ã‚»ãƒ¼ãƒ–フォルダãŒã‚ã‚Šã¾ã›ã‚“" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "ãªã—" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "ノルウェー語" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "ã«ä¸€è‡´ã—ãªã„" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "未確èª" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "Not a Wii save or read failure for file header size %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "未接続" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "ノート" @@ -3936,7 +3990,7 @@ msgstr "注æ„" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "行数:" @@ -3957,7 +4011,7 @@ msgstr "オブジェクト" msgid "Object Range" msgstr "オブジェクトã®ç¯„囲" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "オフ" @@ -3969,25 +4023,29 @@ msgstr "オフセット値:" msgid "On-Screen Display Messages" msgstr "オンスクリーンメッセージを表示" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "オンラインガイドを表示(&D)" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "残り %d ブロックã—ã‹ã‚ã‚Šã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "é–‹ã" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "実体ã®ã‚るフォルダを開ã(&C)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "セーブデータã®ã‚るフォルダを開ã(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "èµ·å‹•ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" @@ -4013,7 +4071,13 @@ msgstr "OpenCL Texture Decoder" msgid "OpenMP Texture Decoder" msgstr "OpenMP Texture Decoder" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "設定" @@ -4023,22 +4087,21 @@ msgid "Orange" msgstr "オレンジ" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«é †åºãŒã€ãƒ–ロックã®é †åºã¨ä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“\n" -"å³ã‚¯ãƒªãƒƒã‚¯ã‹ã‚‰ã€Žå…¨ã¦ã®ã‚»ãƒ¼ãƒ–データをエクスãƒãƒ¼ãƒˆã€ã‚’実行ã—ã¦ã€\n" -"æ–°ã—ã„メモリーカードã«ã‚»ãƒ¼ãƒ–データを移行ã—ã¦ãã ã•ã„\n" +"ファイルディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«é †åºãŒã€ãƒ–ロック順åºã¨ä¸€è‡´ã—ã¾ã›ã‚“\n" +"å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰å…¨ã¦ã®ã‚»ãƒ¼ãƒ–データをエクスãƒãƒ¼ãƒˆã—ã€\n" +"æ–°ã—ãメモリーカードを作æˆã—ã¦ã€ãã“ã¸ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’è¡Œã£ã¦ãã ã•ã„\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "ãã®ä»–" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4050,15 +4113,15 @@ msgstr "" msgid "Output" msgstr "出力" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "録画ファイルをå†ç”Ÿ(&L)" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "パッド" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad " @@ -4082,17 +4145,17 @@ msgstr "Paragraph" msgid "Parameters" msgstr "パラメータ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "パーティション %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "パーティションãŒå­˜åœ¨ã—ã¾ã›ã‚“: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "パッãƒ" @@ -4100,8 +4163,8 @@ msgstr "パッãƒ" msgid "Paths" msgstr "フォルダ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "一時åœæ­¢" @@ -4114,7 +4177,7 @@ msgstr "å†ç”Ÿçµ‚了時ã«ä¸€æ™‚åœæ­¢" msgid "Per-Pixel Lighting" msgstr "Per-Pixel Lighting" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "カンペキï¼" @@ -4124,9 +4187,9 @@ msgid "Perspective %d" msgstr "Perspective %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "開始" @@ -4138,7 +4201,7 @@ msgstr "録画ファイルをå†ç”Ÿ" msgid "Play/Pause" msgstr "開始ï¼ä¸€æ™‚åœæ­¢" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "サクサク" @@ -4146,11 +4209,11 @@ msgstr "サクサク" msgid "Playback Options" msgstr "å†ç”Ÿã‚ªãƒ—ション" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "プレイヤー一覧" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "確èª" @@ -4162,23 +4225,23 @@ msgstr "Please create a perspective before saving" msgid "Plus-Minus" msgstr "Plus-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "ãƒãƒ¼ãƒˆ 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "ãƒãƒ¼ãƒˆ 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "ãƒãƒ¼ãƒˆ 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "ãƒãƒ¼ãƒˆ 4" @@ -4187,11 +4250,11 @@ msgstr "ãƒãƒ¼ãƒˆ 4" msgid "Port :" msgstr "ãƒãƒ¼ãƒˆ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "ãƒãƒ«ãƒˆã‚¬ãƒ«èªž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "ブラジル語" @@ -4199,17 +4262,17 @@ msgstr "ブラジル語" msgid "Post-Processing Effect:" msgstr "Post-Processing Effect:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -4226,7 +4289,7 @@ msgstr "å‰ã®ãƒšãƒ¼ã‚¸" msgid "Previous Page" msgstr "å‰ã®ãƒšãƒ¼ã‚¸" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "ã“ã“よりå‰" @@ -4242,7 +4305,7 @@ msgstr "プロファイル" msgid "Properties" msgstr "プロパティ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "キャッシュã®æ•´é “を実行" @@ -4251,7 +4314,7 @@ msgid "Question" msgstr "確èª" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "終了" @@ -4273,13 +4336,13 @@ msgstr "R (アナログ)" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "ロシア" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "範囲" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4295,7 +4358,7 @@ msgstr "Real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "実機ãƒãƒ©ãƒ³ã‚¹Wii ボードを接続" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4312,6 +4375,10 @@ msgstr "実機Wii リモコンã®è¨­å®š" msgid "Record" msgstr "録画" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "入力を記録" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "録画情報" @@ -4348,7 +4415,7 @@ msgstr "" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€ãªã—】ã®ã¾ã¾ã«ã—ã¦ãŠã„ã¦ãã ã•ã„。" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "å†æ›´æ–°" @@ -4357,14 +4424,14 @@ msgstr "å†æ›´æ–°" msgid "Refresh List" msgstr "ゲームリストをå†æ›´æ–°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "ゲームリストをå†æ›´æ–°ã—ã¾ã™" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "削除" @@ -4387,7 +4454,7 @@ msgstr "メインウィンドウ部分ã«æç”»" msgid "Reset" msgstr "åˆæœŸåŒ–" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "çµæžœè¡¨ç¤ºæ¬„" @@ -4395,9 +4462,9 @@ msgstr "çµæžœè¡¨ç¤ºæ¬„" msgid "Return" msgstr "Return" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "リビジョン" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4408,20 +4475,18 @@ msgstr "å³" msgid "Right Stick" msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "振動" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"DSPã®å‡¦ç†ã‚’別スレッドã«åˆ†é›¢ã—ã¦è¡Œã„ã¾ã™ (éžæŽ¨å¥¨:音ã®å•é¡Œã‚„フリーズ等ã®ãƒªã‚¹ã‚¯" -"有)" +"DSP-LLEã®å‡¦ç†ã‚’別スレッドã«åˆ†é›¢ã—ã¦è¡Œã„ã¾ã™ (éžæŽ¨å¥¨:フリーズã®åŽŸå› ã«ãªã‚Šã¾ã™)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "ロシア語" @@ -4434,7 +4499,7 @@ msgid "Safe" msgstr "Safe" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "ä¿å­˜" @@ -4444,23 +4509,20 @@ msgid "Save GCI as..." msgstr "セーブデータã®ä¿å­˜å…ˆã‚’é¸æŠž" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "ステートセーブ(&V)" +msgstr "最å¤ã®ã‚¹ãƒ†ãƒ¼ãƒˆã«ä¸Šæ›¸ãä¿å­˜" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "ステートセーブ(&V)" +msgstr "ステートセーブ" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "ステートセーブ - スロット 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "ステートセーブ - スロット 1" +msgstr "ステートセーブ - スロット 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4491,32 +4553,31 @@ msgid "Save State Slot 8" msgstr "ステートセーブ - スロット 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "ステートセーブ - スロット 1" +msgstr "ステートセーブ - スロット 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "ファイルã¨ã—ã¦ä¿å­˜" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "ファイルã¨ã—ã¦ä¿å­˜" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "圧縮ã™ã‚‹ã‚¿ã‚¤ãƒˆãƒ«ã®ä¿å­˜å…ˆã‚’é¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Save current perspective" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "復元ã™ã‚‹ã‚¿ã‚¤ãƒˆãƒ«ã®ä¿å­˜å…ˆã‚’é¸æŠž" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Savestate movie %s ã®ç ´æを確èªã—ã¾ã—ãŸã€‚録画を中止ã—ã¦ã„ã¾ã™..." @@ -4525,20 +4586,20 @@ msgstr "Savestate movie %s ã®ç ´æを確èªã—ã¾ã—ãŸã€‚録画を中止㗠msgid "Scaled EFB Copy" msgstr "Scaled EFB Copy" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "確èªã—ã¦ã„ã¾ã™... .%s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "確èªä¸­..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "確èªä¸­..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ç”»é¢æ’®å½±" @@ -4550,11 +4611,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "検索" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "フィルタリング" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "サブフォルダも検索" @@ -4577,12 +4638,12 @@ msgstr "Section %s not found in SYSCONF" msgid "Select" msgstr "é¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "録画ファイルをé¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "追加ã™ã‚‹WADファイルをé¸æŠž" @@ -4604,19 +4665,19 @@ msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ã‚»ãƒ¼ãƒ–ファイルをé¸æŠž" msgid "Select floating windows" msgstr "Select floating windows" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "ロードã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "セーブファイルをé¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "ロードã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆã‚»ãƒ¼ãƒ–ファイルをé¸æŠž" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "ステートセーブã®ä¿å­˜å…ˆã‚’é¸æŠž" @@ -4636,7 +4697,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€è‡ªå‹•ã€‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "é¸æŠžã•ã‚ŒãŸãƒ—ロファイルã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -4653,46 +4714,35 @@ msgid "" "If unsure, use your desktop resolution.\n" "If still unsure, use the highest resolution which works for you." msgstr "" -"フルスクリーン表示時ã®è§£åƒåº¦ã‚’é¸æŠžã—ã¾ã™ã€‚\n" +"全画é¢è¡¨ç¤ºæ™‚ã®è§£åƒåº¦ã‚’é¸æŠžã—ã¾ã™ã€‚\n" "内部解åƒåº¦ã¨åŒã˜ã‹ã€ãれより上ã®è§£åƒåº¦ã‚’é¸æŠžã—ã¦ãã ã•ã„。 高解åƒåº¦ã§ã‚ã£ã¦ã‚‚" "動作速度ã«ã¯ã»ã¨ã‚“ã©å½±éŸ¿ã—ã¾ã›ã‚“。\n" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—ã®è§£åƒåº¦ã¨åŒã˜ã‚‚ã®ã‚’ã€\n" "ã‚‚ã—ãã¯ã€æ­£å¸¸ã«å‹•ä½œã™ã‚‹ä¸€ç•ªé«˜ã„解åƒåº¦ã‚’é¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"æç”»ã«ä½¿ç”¨ã™ã‚‹ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹APIã‚’é¸æŠžã—ã¾ã™ã€‚\n" -"通常ã€Direct3D9】ãŒæœ€ã‚‚高速ã§ã™ãŒã€ã€OpenGL】ã¯ã‚ˆã‚Šæ­£ç¢ºã§ã™ã€‚\n" -"ã€Direct3D11】ã¯2ã¤ã®é–“ã®ã‚ˆã†ãªå‹•ä½œã«ãªã‚Šã¾ã™ã€‚\n" -"Direct3D9/Direct3D11 㯠Windows ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚\n" -"\n" -"よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€Direct3D11】をé¸æŠžã—ã¦ãã ã•ã„。" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"æç”»ã«ä½¿ç”¨ã™ã‚‹ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹APIã‚’é¸æŠžã—ã¾ã™ã€‚\n" -"通常ã€Direct3D9】ãŒæœ€ã‚‚高速ã§ã™ãŒã€ã€OpenGL】ã¯ã‚ˆã‚Šæ­£ç¢ºã§ã™ã€‚\n" -"ã€Direct3D11】ã¯2ã¤ã®é–“ã®ã‚ˆã†ãªå‹•ä½œã«ãªã‚Šã¾ã™ã€‚\n" -"Direct3D9/Direct3D11 㯠Windows ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚\n" -"\n" -"よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€OpenGL】をé¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "é€ä¿¡" @@ -4704,16 +4754,16 @@ msgstr "センサーãƒãƒ¼ã®ä½ç½®" msgid "Separator" msgstr "Separator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "セルビア語" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "シリアルãƒãƒ¼ãƒˆï¼šãƒ–ロードãƒãƒ³ãƒ‰ã‚¢ãƒ€ãƒ—ã‚¿ãªã©ã®ãƒ‡ãƒã‚¤ã‚¹ãŒæŽ¥ç¶šã§ãã¾ã™" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Wiiメニュー(ディスクãƒãƒ£ãƒ³ãƒãƒ«)ã«è¡¨ç¤º(&D)" @@ -4722,7 +4772,7 @@ msgstr "Wiiメニュー(ディスクãƒãƒ£ãƒ³ãƒãƒ«)ã«è¡¨ç¤º(&D)" msgid "Set as default Memcard %c" msgstr "メモリーカード%cを既定ã¨ã—ã¦è¨­å®š" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4737,19 +4787,19 @@ msgstr "" "レイテンシーを調整ã—ã¾ã™ï¼ˆå˜ä½ï¼šms)。高ãã™ã‚‹ã“ã¨ã§éŸ³ã®å•é¡Œã‚’軽減ã§ãã¾ã™ã€‚" "OpenALã®ã¿" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "設定" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Cant find setting file" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Cant create setting file" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "シェイク" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "通称" @@ -4757,23 +4807,27 @@ msgstr "通称" msgid "Shoulder Buttons" msgstr "LRトリガー" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "コンソール(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "ログを表示(&L)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "ステータスãƒãƒ¼(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "ツールãƒãƒ¼(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "DVDドライブ内ã®ã‚½ãƒ•ãƒˆã‚’表示" @@ -4785,11 +4839,11 @@ msgstr "Show EFB Copy Regions" msgid "Show FPS" msgstr "FPSを表示" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "フランス" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "ゲームキューブ" @@ -4797,35 +4851,35 @@ msgstr "ゲームキューブ" msgid "Show Input Display" msgstr "キー入力を表示" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "イタリア" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "日本" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "韓国" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "次ã®è¨€èªžã§è¡¨ç¤º" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "ログã®è¨­å®šã‚’表示(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PALè¦æ ¼" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "特定機種ã®ã‚½ãƒ•ãƒˆã ã‘を表示" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "特定リージョンã®ã‚½ãƒ•ãƒˆã ã‘を表示" @@ -4833,27 +4887,27 @@ msgstr "特定リージョンã®ã‚½ãƒ•ãƒˆã ã‘を表示" msgid "Show Statistics" msgstr "統計情報を表示" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "å°æ¹¾" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "アメリカåˆè¡†å›½" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "WAD(Wiiウェア/VC/ãƒãƒ£ãƒ³ãƒãƒ«)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "ゲームåœæ­¢å‰ã«ç¢ºèªã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒè¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4871,7 +4925,7 @@ msgstr "ブロック開始ä½ç½®ã‚’表示" msgid "Show lag counter" msgstr "ラグカウンターを表示" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4909,7 +4963,7 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "ä¸æ˜Ž" @@ -4923,23 +4977,24 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "横æŒã¡(Sideways)ã§ä½¿ç”¨" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "簡体字中国語" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "サイズ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "BIOSをスキップ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Skip DCBZ clearing" @@ -4964,17 +5019,17 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "スロット %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "スロットA" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "スロットB" @@ -4982,7 +5037,7 @@ msgstr "スロットB" msgid "Snapshot" msgstr "スクリーンショット" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Software Renderer" @@ -4997,27 +5052,27 @@ msgstr "" "デãƒãƒƒã‚°ç”¨é€”ã¨ã—ã¦ã®ã¿æœ‰ç”¨ãªã‚‚ã®ã§ã™ã€‚\n" "ãã‚Œã§ã‚‚使用ã—ã¾ã™ã‹ï¼Ÿã‚ˆã分ã‹ã‚‰ãªã‘ã‚Œã°ã€é¸æŠžã—ãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "サウンド設定" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Sound backend %s is not valid." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Sound buffer creation failed: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Space" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "スペイン語" @@ -5045,37 +5100,29 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€1x Native】をé¸æŠžã—ã¦ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Speed up Disc Transfer Rate" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "丸ã¿" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "標準コントローラ" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "スタート" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "ãƒãƒƒãƒˆãƒ—レイを開始(&N)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "録画を開始(&C)" @@ -5083,7 +5130,7 @@ msgstr "録画を開始(&C)" msgid "Start Recording" msgstr "録画を開始" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "動作率" @@ -5091,7 +5138,7 @@ msgstr "動作率" msgid "State Saves" msgstr "ステートセーブï¼ãƒ­ãƒ¼ãƒ‰" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "SPEED FORCE" @@ -5100,7 +5147,7 @@ msgid "Stick" msgstr "スティック" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "åœæ­¢" @@ -5131,28 +5178,28 @@ msgstr "ストラム" msgid "Subtract" msgstr "Subtract" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "%s ã¸ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "セーブファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "スウェーデン語" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "å‹•ã" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synchronize GPU thread" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5160,12 +5207,13 @@ msgstr "" "CPUï¼GPUスレッドをåŒæœŸã•ã›ã‚‹ã“ã¨ã§ãƒ‡ãƒ¥ã‚¢ãƒ«ã‚³ã‚¢å‹•ä½œæ™‚ã®ãƒ•ãƒªãƒ¼ã‚ºã‚’抑制ã—ã¾ã™ " "[有効ï¼äº’æ›æ€§ãƒ»å®‰å®šæ€§é‡è¦–ï¼ç„¡åŠ¹ï¼å‹•ä½œé€Ÿåº¦å‘上]" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "システムã®è¨€èªžï¼š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "å°æ¹¾" @@ -5190,13 +5238,13 @@ msgstr "左テーブル" msgid "Table Right" msgstr "å³ãƒ†ãƒ¼ãƒ–ル" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "ç”»é¢æ’®å½±" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "タルコンガ" @@ -5216,11 +5264,11 @@ msgstr "Texture Cache" msgid "Texture Format Overlay" msgstr "テクスãƒãƒ£ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæƒ…報表示" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WADファイルã®è¿½åŠ ã«æˆåŠŸ" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "無効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™" @@ -5228,13 +5276,13 @@ msgstr "無効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™" msgid "The checksum was successfully fixed" msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ä¿®æ­£ã«æˆåŠŸã—ã¾ã—ãŸ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã¯ã™ã§ã«ãƒªã‚¹ãƒˆã«å­˜åœ¨ã—ã¾ã™ï¼" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5258,7 +5306,7 @@ msgid "The file %s was already open, the file header will not be written." msgstr "" "ファイル %s ã¯æ—¢ã«é–‹ã‹ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ˜ãƒƒãƒ€ãƒ¼ã¯æ›¸ãè¾¼ã¾ã‚Œã¾ã›ã‚“。" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "指定ã—ãŸãƒ•ã‚¡ã‚¤ãƒ« (%s) ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -5273,7 +5321,7 @@ msgstr "',' ã‚’å«ã‚€åå‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:129 msgid "The resulting decrypted AR code doesn't contain any lines." -msgstr "復å·åŒ–ã—ã¾ã—ãŸãŒã€ã“ã®ã‚³ãƒ¼ãƒ‰ã«ã¯ä¸€ã¤ã‚‚è¡ŒãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" +msgstr "復å·åŒ–ã—ã¾ã—ãŸãŒã€ã“ã®ã‚³ãƒ¼ãƒ‰ã«ã¯ã²ã¨ã¤ã‚‚è¡ŒãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:99 msgid "" @@ -5291,7 +5339,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "コピーã—よã†ã¨ã—ã¦ã„るセーブファイルã®ã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5299,43 +5347,43 @@ msgstr "" "é¸æŠžã—ãŸè¨€èªžã¯ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。デフォルト設定を使用ã—" "ã¾ã™" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "サーãƒãƒ¼ã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ãƒãƒƒãƒˆãƒ—レイã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼ã¯æº€å“¡ã§ã™ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "サーãƒãƒ¼ã‚ˆã‚Šï¼šã“ã®ã‚²ãƒ¼ãƒ ã¯ã€ç¾åœ¨å®Ÿè¡Œä¸­ã§ã™ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "サーãƒãƒ¼ã¯ã€ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—ãŸï¼" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "無効ãªå€¤ã§ã™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "テーマ:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" "00000001/00000002ã®ãƒã‚±ãƒƒãƒˆãŒå¿…è¦ã§ã™ã€‚ãŠãらãä¸å®Œå…¨ãªNANDダンプã§ã™ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5345,7 +5393,7 @@ msgstr "" "   本体設定ã§ãƒ‡ãƒ¥ã‚¢ãƒ«ã‚³ã‚¢å‡¦ç†ã‚’有効化ã—ã¦ã„ã‚‹å ´åˆã§ã‚‚ã€ã“ã®ã‚²ãƒ¼ãƒ ã®ã¿ã‚·ãƒ³ã‚°" "ルコア動作ãŒå¯èƒ½" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5353,7 +5401,7 @@ msgstr "" "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãƒªãƒ—レイシミュレータã¯ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãƒªãƒ—レイãã®ã‚‚ã®ã‚’変更ã™ã‚‹" "コードã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "有効ã«ã—ã¦ã„ã‚‹ã¨Wiiメニューやã„ãã¤ã‹ã®ã‚¿ã‚¤ãƒˆãƒ«ã§å‹•ä½œé€Ÿåº¦ãŒä½Žä¸‹ã™ã‚‹å ´åˆãŒã‚ã‚Š" @@ -5379,15 +5427,19 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" +"指定ã—ãŸFPSã®å€¤ã«ã‚²ãƒ¼ãƒ ã‚¹ãƒ”ードをåˆã‚ã›ã‚‹ã‚ªãƒ—ションã§ã™ã€‚(ノート:NTSCã¯60ã€" +"PALã¯50ãŒãƒ•ãƒ«ã‚¹ãƒ”ード)ã€ã‚µã‚¦ãƒ³ãƒ‰ã€‘ã‚’é¸æŠžã™ã‚‹ã¨DSPã®å‡¦ç†ã«æ²¿ã£ãŸé€Ÿåº¦ã¨ãªã‚Šã€ã“" +"ã‚Œã¯ä¸€éƒ¨ã®ã‚²ãƒ¼ãƒ ã§ã‚¯ãƒªãƒƒã‚¯ãƒŽã‚¤ã‚ºã‚’改善ã—ã¾ã™ãŒã€åˆ¥ã®ãƒŽã‚¤ã‚ºã‚’生ã¿å‡ºã™å¯èƒ½æ€§ãŒ" +"ã‚ã‚Šã¾ã™ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5398,7 +5450,7 @@ msgstr "" "有効ã«ã™ã‚‹ã¨å‹•ä½œé€Ÿåº¦ãŒå¤§ããå‘上ã—ã¾ã™ãŒã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚„ãƒã‚°ã®åŽŸå› ã«ãªã‚‹å ´åˆã‚‚" "ã‚ã‚Šã¾ã™" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "ã“ã®ã‚²ãƒ¼ãƒ ã®è¨­å®šã‚’テキストã§ç·¨é›†ã—ã¾ã™" @@ -5407,12 +5459,12 @@ msgstr "ã“ã®ã‚²ãƒ¼ãƒ ã®è¨­å®šã‚’テキストã§ç·¨é›†ã—ã¾ã™" msgid "Threshold" msgstr "ã—ãã„値" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "傾ã" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "タイトル" @@ -5426,39 +5478,37 @@ msgid "Toggle All Log Types" msgstr "å…¨ã¦ã®ãƒ­ã‚°æƒ…報をé¸æŠžï¼è§£é™¤" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "アスペクト比:" +msgstr "アスペクト比 設定切替" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Copies" +msgstr "EFB Copies 設定切替" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "å…¨ã¦ã®ãƒ­ã‚°æƒ…報をé¸æŠžï¼è§£é™¤" +msgstr "ãƒ•ã‚©ã‚°å‡¦ç† è¨­å®šåˆ‡æ›¿" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" -msgstr "フルスクリーン表示切り替ãˆ" +msgstr "全画é¢è¡¨ç¤º 切替" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "内部解åƒåº¦ 設定切替" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "上部" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "ç¹ä½“字中国語" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "ä¸æ˜Žãªãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—を読ã¿è¾¼ã‚‚ã†ã¨ã—ã¾ã—ãŸ" @@ -5478,7 +5528,7 @@ msgstr "" "Trying to read from invalid SYSCONF\n" "Wiimote bt ids are not available" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "トルコ語" @@ -5494,12 +5544,12 @@ msgstr "å½¢å¼" msgid "UDP Port:" msgstr "UDPãƒãƒ¼ãƒˆ:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDPã§æŽ¥ç¶š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ä¸æ˜Ž" @@ -5508,7 +5558,7 @@ msgstr "ä¸æ˜Ž" msgid "UNKNOWN_%02X" msgstr "UNKNOWN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "アメリカåˆè¡†å›½" @@ -5521,9 +5571,9 @@ msgstr "" "入力ã•ã‚ŒãŸå€¤ãŒä¸æ­£ã§ã™ã€‚" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5531,29 +5581,28 @@ msgstr "" "èªã—ã¦ä¸‹ã•ã„。\n" "ã“ã®è¡Œã‚’無視ã—ã¦è§£æžã‚’続ã‘ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "未定義 %i" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:229 msgid "Undo Load State" -msgstr "ステートロードå‰ã®çŠ¶æ…‹ã«æˆ»ã™" +msgstr "ç›´å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ­ãƒ¼ãƒ‰ã®å–消" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "ステートロードå‰ã®çŠ¶æ…‹ã«æˆ»ã™" +msgstr "ç›´å‰ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚»ãƒ¼ãƒ–ã®å–消" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Unexpected 0x80 call? Aborting..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "フィルタ無ã—" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Unknown DVD command %08x - fatal error" @@ -5568,12 +5617,12 @@ msgstr "Unknown command 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Unknown entry type %i in SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "次ã®IDã‹ã‚‰ä¸æ˜Žãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5583,24 +5632,24 @@ msgstr "" msgid "Up" msgstr "上" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "å†å–å¾—" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "直立状態(Upright)ã§ä½¿ç”¨" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "EuRGB60 (PAL60) モードを使用" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:295 msgid "Use Fullscreen" -msgstr "フルスクリーンã§è¡¨ç¤º" +msgstr "全画é¢ã§è¡¨ç¤º" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "16進" @@ -5615,6 +5664,10 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"ä¸æ­£ç¢ºãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§æ·±åº¦ã®å€¤ã‚’求ã‚るよã†ã«ã—ã¾ã™ã€‚\n" +"ã„ãã¤ã‹ã®ã‚¿ã‚¤ãƒˆãƒ«ã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã™ãŒã€å‹•ä½œé€Ÿåº¦ã®å‘上㌠期待ã§ãã¾ã™ã€‚\n" +"\n" +"よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’外ã•ãªã„ã§ãã ã•ã„。" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5628,6 +5681,20 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"推奨ã•ã‚Œãªã„方法ã§OpenGLã®é ‚点ストリームã®å‡¦ç†é€Ÿåº¦ã‚’å‘上ã•ã›ã¾ã™ã€‚\n" +"サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹GPUã§ã¯ç‰¹ã«å•é¡Œã«ãªã‚Šã¾ã›ã‚“ãŒã€ãã†ã§ãªã„å ´åˆã¯ ã“ã®ã‚ªãƒ—" +"ションã¯æ·±åˆ»ãªä¸å…·åˆã‚’ã‚‚ãŸã‚‰ã—ã¾ã™ã€‚\n" +"\n" +"よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5651,12 +5718,11 @@ msgstr "ユーティリティ" msgid "V-Sync" msgstr "åž‚ç›´åŒæœŸ (V-Sync)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Speed Hack" +msgstr "VBeam Speed Hack" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "値" @@ -5664,7 +5730,7 @@ msgstr "値" msgid "Value:" msgstr "値:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "値:" @@ -5674,9 +5740,9 @@ msgstr "Verbosityモード" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Vertex Streaming Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "æç”»" @@ -5684,17 +5750,17 @@ msgstr "æç”»" msgid "Virtual" msgstr "Virtual" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "音é‡" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD installation failed: error creating %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD installation failed: error creating ticket" @@ -5716,19 +5782,19 @@ msgstr "" msgid "Warning" msgstr "警告" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Warning - starting DOL in wrong console mode!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Warning - starting ELF in wrong console mode!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Warning - starting ISO in wrong console mode!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5753,7 +5819,7 @@ msgstr "" "\n" "続ã‘ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5761,7 +5827,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5769,7 +5835,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5809,19 +5875,15 @@ msgstr "範囲(横)" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii コンソール" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NANDルート" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wiiã®ã‚»ãƒ¼ãƒ–データをインãƒãƒ¼ãƒˆ" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wiiセーブデータ (*.bin)|*.bin" @@ -5830,16 +5892,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: ファイルã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "入力(Wii)" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "入力(Wii)" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wii リモコン %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wii リモコン接続中" @@ -5847,7 +5915,7 @@ msgstr "Wii リモコン接続中" msgid "Wiimote Motor" msgstr "Wii リモコンã®æŒ¯å‹•ã‚’有効化" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wii リモコンã®è¨­å®šã‚’è¡Œã„ã¾ã™" @@ -5871,16 +5939,16 @@ msgstr "Windows Right" msgid "Word Wrap" msgstr "ワードラップ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "動作中..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "メモリーカードã¸ã®æ›¸è¾¼ã‚’許å¯" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5898,21 +5966,36 @@ msgstr "ファイルã«å‡ºåŠ›" msgid "Write to Window" msgstr "ウィンドウã«å‡ºåŠ›" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice failed: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 init failed: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 master voice creation failed: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice failed: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 init failed: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 master voice creation failed: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5948,11 +6031,11 @@ msgstr "You can't close panes that have pages in them." msgid "You must choose a game!!" msgstr "ソフトãŒé¸ã°ã‚Œã¦ã„ã¾ã›ã‚“" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "åå‰ãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "10進数・16進数・8進数ã„ãšã‚Œã‹ã®æœ‰åŠ¹ãªå€¤ã‚’入力ã—ã¦ãã ã•ã„。" @@ -5960,7 +6043,7 @@ msgstr "10進数・16進数・8進数ã„ãšã‚Œã‹ã®æœ‰åŠ¹ãªå€¤ã‚’入力ã—㦠msgid "You must enter a valid profile name." msgstr "有効ãªãƒ—ロファイルåを入力ã—ã¦ãã ã•ã„" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "変更を有効ã«ã™ã‚‹ã«ã¯Dolphinã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„" @@ -5974,7 +6057,7 @@ msgstr "" "ã“ã®å•é¡Œã‚’修正ã™ã‚‹ãŸã‚ã«å‹•ä½œã‚’åœæ­¢ã—ã¾ã™ã‹ï¼Ÿ\n" "\"ã„ã„ãˆ\"ã‚’é¸æŠžã—ãŸå ´åˆã€æ­ªã‚“ã éŸ³ã®ã¾ã¾ã‚²ãƒ¼ãƒ ãŒå§‹ã¾ã‚‹ã§ã—ょã†" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5993,15 +6076,15 @@ msgstr "" "æ­£ã—ã㯠0x%04x (ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ 0x%04llx)\n" "æ–°ã—ã作æˆã—ã¾ã™ã‹ï¼Ÿ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "03コードã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero code unknown to dolphin: %08x" @@ -6059,20 +6142,24 @@ msgstr "" "\n" "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Reading Opcode from %x. Please report." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr " " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "unknown flavor %d (expected %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "unknown message received" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute returned -1 on application run!" @@ -6088,79 +6175,41 @@ msgstr "zNear 補正値:" msgid "| OR" msgstr "| (...ã‚‚ã—ãã¯)" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Accurate VBeam emulation" +#~ msgid "Could not create %s" +#~ msgstr "%s を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "エミュレーション中ã«æ•°å­—キー(テンキーã§ãªã„æ–¹)を押ã™ã“ã¨ã§ã€ 一部ã®ã‚ªãƒ—" -#~ "ションをリアルタイムã«å¤‰æ›´ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚\n" +#~ "æç”»ã«ä½¿ç”¨ã™ã‚‹ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹APIã‚’é¸æŠžã—ã¾ã™ã€‚\n" +#~ "通常ã€Direct3D9】ãŒæœ€ã‚‚高速ã§ã™ãŒã€ã€OpenGL】ã¯ã‚ˆã‚Šæ­£ç¢ºã§ã™ã€‚\n" +#~ "ã€Direct3D11】ã¯2ã¤ã®é–“ã®ã‚ˆã†ãªå‹•ä½œã«ãªã‚Šã¾ã™ã€‚\n" +#~ "Direct3D9/Direct3D11 㯠Windows ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚\n" #~ "\n" -#~ "3-内部解åƒåº¦\n" -#~ "4-アスペクト比\n" -#~ "5-EFB\n" -#~ "6-Fog\n" -#~ "\n" -#~ "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "ホットキーを使用" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Listenã«å¤±æ•—ï¼" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Failed to load bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Failed to load hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "マイクã®è¨­å®š" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY is called, please report!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hacked Buffer Upload" +#~ "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€Direct3D11】をé¸æŠžã—ã¦ãã ã•ã„。" #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "FPSãŒå®‰å®šã—ãªã„ゲームã§åŠ¹æžœãŒã‚ã‚Šã¾ã™ [有効ï¼äº’æ›æ€§å‘上ï¼ç„¡åŠ¹ï¼å‹•ä½œé€Ÿåº¦å‘" -#~ "上]" - -#~ msgid "Last Overwritten State" -#~ msgstr "最後ã«ä¸Šæ›¸ãã—ãŸã‚¹ãƒ†ãƒ¼ãƒˆã‚»ãƒ¼ãƒ–" - -#~ msgid "Last Saved State" -#~ msgstr "最新ã®ã‚¹ãƒ†ãƒ¼ãƒˆã‚»ãƒ¼ãƒ–" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "ステートロード時ã«Wii リモコンをå†æŽ¥ç¶š" - -#~ msgid "Set" -#~ msgstr "é©ç”¨" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Skip Dest. Alpha Pass" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "頂点ストリームã®ã‚¢ãƒƒãƒ—ロード方法を工夫ã—ã€é€Ÿåº¦ã‚’å‘上ã•ã›ã¾ã™ã€‚\n" -#~ "ãŸã ã—OpenGLã®ä»•æ§˜ã‹ã‚‰å¤–ã‚Œã¦ã„ã‚‹ã®ã§ã€å¤§ããªãƒã‚°ã® 原因ã«ãªã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚Š" -#~ "ã¾ã™ã€‚\n" +#~ "æç”»ã«ä½¿ç”¨ã™ã‚‹ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹APIã‚’é¸æŠžã—ã¾ã™ã€‚\n" +#~ "通常ã€Direct3D9】ãŒæœ€ã‚‚高速ã§ã™ãŒã€ã€OpenGL】ã¯ã‚ˆã‚Šæ­£ç¢ºã§ã™ã€‚\n" +#~ "ã€Direct3D11】ã¯2ã¤ã®é–“ã®ã‚ˆã†ãªå‹•ä½œã«ãªã‚Šã¾ã™ã€‚\n" +#~ "Direct3D9/Direct3D11 㯠Windows ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚\n" #~ "\n" -#~ "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ãƒã‚§ãƒƒã‚¯ã‚’入れãªã„ã§ãã ã•ã„。" +#~ "よã分ã‹ã‚‰ãªã‘ã‚Œã°ã€ã€OpenGL】をé¸æŠžã—ã¦ãã ã•ã„。" + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Reading Opcode from %x. Please report." diff --git a/Languages/po/ko.po b/Languages/po/ko.po index 9c58749f07..5912cd7da7 100644 --- a/Languages/po/ko.po +++ b/Languages/po/ko.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-11 01:47+0000\n" -"Last-Translator: Siegfried \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Korean (http://www.transifex.com/projects/p/dolphin-emu/" "language/ko/)\n" "Language: ko\n" @@ -20,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr " (í‘œì‹œí•˜ê¸°ì— ë„ˆë¬´ 많ì€)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "게임 :" @@ -34,7 +34,7 @@ msgstr "게임 :" msgid "! NOT" msgstr "! NOT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +43,7 @@ msgstr "" "\"%s\"ê°€ 존재하지 않습니다.\n" " 새로운 16MB 메모리카드를 ìƒì„±í•´ìš”?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\"는 비ì í•© GCM/ISO 파ì¼ìž„, í˜¹ì€ GC/Wii ISOê°€ 아님." @@ -58,28 +58,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$s복사%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d 샘플들" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d 샘플들 (품질 수준 %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%sê°€ ì´ë¯¸ 존재함, ë®ì–´ì”니까?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s ê°€ 실패해서 취소ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ë¯¸ì§€ê°€ ì†ìƒëœ 것 같습니다." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -88,7 +88,7 @@ msgstr "" "%s 는 ë©”ëª¨ë¦¬ì¹´ë“œë¡œì¨ ë¶ˆëŸ¬ì˜¤ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤ \n" " ì¹´ë“œ íŒŒì¼ í¬ê¸°ê°€ 유효하지 않습니다 (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -97,7 +97,7 @@ msgstr "" "%s 는 ë©”ëª¨ë¦¬ì¹´ë“œë¡œì¨ ë¡œë“œí•˜ëŠ”ë°ì— 실패했습니다 \n" " ì¹´ë“œ í¬ê¸°ê°€ 유효하지 않습니다 (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -106,22 +106,27 @@ msgstr "" "%s 는 ë©”ëª¨ë¦¬ì¹´ë“œë¡œì¨ ë¶ˆëŸ¬ì˜¤ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤ \n" "파ì¼ì´ 유효한 메모리 ì¹´ë“œ 파ì¼ì´ ë  ë§Œí¼ ì¶©ë¶„ížˆ í¬ì§€ 않습니다. (0x%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%sê°€ ì—´ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s 는 0 ë°”ì´íŠ¸ 파ì¼ìž„" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s 는 ì´ë¯¸ 압축ë¨! ê·¸ê²ƒì„ ë”ì´ìƒ 압축할 수 없습니다." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s 는 너무 긴 파ì¼ì´ë¦„ 입니다, 최대 글ìžìˆ˜ëŠ” 45 입니다." @@ -150,7 +155,7 @@ msgstr "%u 빈 블럭; %u 빈 디렉토리 엔트리" msgid "&& AND" msgstr "&& AND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "ëŒí•€ì— 대해(&A)..." @@ -158,7 +163,7 @@ msgstr "ëŒí•€ì— 대해(&A)..." msgid "&Boot from DVD Drive..." msgstr "DVD ë“œë¼ì´ë¸Œì—ì„œ 부트(&B)..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "브레ì´í¬í¬ì¸íŠ¸(&B)" @@ -166,7 +171,7 @@ msgstr "브레ì´í¬í¬ì¸íŠ¸(&B)" msgid "&Browse for ISOs..." msgstr "ISO í´ë”íƒìƒ‰(&B)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "치트 매니저(&C)" @@ -174,11 +179,11 @@ msgstr "치트 매니저(&C)" msgid "&DSP Settings" msgstr "오디오 설정(&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "ISO ì‚­ì œ(&D)..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "ì„ íƒëœ ISO들 ì‚­ì œ(&D)..." @@ -190,11 +195,11 @@ msgstr "ì—뮬레ì´ì…˜(&E)" msgid "&File" msgstr "파ì¼(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "프레임 진행(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "전체화면(&F)" @@ -202,7 +207,7 @@ msgstr "전체화면(&F)" msgid "&Graphics Settings" msgstr "그래픽 설정(&G)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "ë„움(&H)" @@ -210,7 +215,7 @@ msgstr "ë„움(&H)" msgid "&Hotkey Settings" msgstr "단축키 설정(&H)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -222,11 +227,11 @@ msgstr "ìƒíƒœ 로드(&L)" msgid "&Memcard Manager (GC)" msgstr "메모리 ì¹´ë“œ 매니저(GC) (&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "메모리(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "열기(&O)..." @@ -234,51 +239,51 @@ msgstr "열기(&O)..." msgid "&Options" msgstr "옵션(&O)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "ì¼ì‹œì •ì§€(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "실행(&P)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "ì†ì„±(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "ì½ê¸°-ì „ìš© 모드(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "ê²Œìž„ëª©ë¡ ìƒˆë¡œ 고침(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "레지스터들(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "리셋(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "사운드(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "중지(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "ë„구(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "비디오(&V)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "보기(&V)" @@ -286,7 +291,7 @@ msgstr "보기(&V)" msgid "&Wiimote Settings" msgstr "위모트 설정(&W)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "위키(&W)" @@ -311,9 +316,8 @@ msgid "(off)" msgstr "(ë”)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -323,7 +327,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x ì›ë³¸ (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 비트" @@ -339,7 +343,7 @@ msgstr "2.5x ì›ë³¸ (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x ì›ë³¸ (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 비트" @@ -355,7 +359,7 @@ msgstr "3x ì›ë³¸ (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x ì›ë³¸ (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 비트" @@ -367,7 +371,7 @@ msgstr "<ì—¬ê¸°ì— ì´ë¦„ì„ ë„£ìœ¼ì„¸ìš”>" msgid "" msgstr "<ë°œê²¬ëœ í•´ìƒë„ê°€ ì—†ìŒ>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<ì—†ìŒ>" @@ -375,7 +379,7 @@ msgstr "<ì—†ìŒ>" msgid "" msgstr "<키를 누르세요>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<시스템>" @@ -384,12 +388,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "ë„·í”Œë ˆì´ ìœˆë„ìš°ê°€ ì´ë¯¸ 열려있습니다!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "현재 ê²Œìž„ì´ êµ¬ë™ë˜ê³  있지 않습니다." @@ -402,7 +406,6 @@ msgstr "" "위모트를 수ë™ìœ¼ë¡œ 연결해야합니다." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -411,38 +414,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"알림:\n" -"\n" -"넷플레ì´ëŠ” ë‹¤ìŒ ì„¤ì •ë“¤ì„ ì‚¬ìš©í•  ë•Œë§Œì´ í˜„ìž¬ 제대로 ìž‘ë™í•  ê²ë‹ˆë‹¤:\n" -" - 듀얼 코어 [ë”]\n" -" - 오디오 병목 [ë”]\n" -" - DSP-HLE \"소리 ì—†ìŒ\"으로 í˜¹ì€ DSP-LLE\n" -" - 수ë™ìœ¼ë¡œ [스í…다드 컨트롤러]ì— ì‚¬ìš©ë˜ì–´ì§ˆ 정확한 ì»¨íŠ¸ë¡¤ëŸ¬ë“¤ì˜ ìˆ˜ë¥¼ 설정하" -"세요\n" -"\n" -"모든 플레ì´ì–´ë“¤ì€ ê°™ì€ ëŒí•€ 버전과 ì„¤ì •ë“¤ì„ ì‚¬ìš©í•˜ë„ë¡ ì‹œë„해야합니다.\n" -"모든 메모리 카드를 ë„거나 ì‹œìž‘í•˜ê¸°ì „ì— ê·¸ê²ƒë“¤ì„ ëª¨ë“  플레ì´ì–´ë“¤ì—게 보내세" -"ìš”.\n" -"위모트 지ì›ì€ 시행ë˜ì§€ 않었습니다.\n" -"\n" -"TCP í¬íŠ¸ë¥¼ í˜¸ìŠ¤íŠ¸ì— ì „ë‹¬í•´ì•¼í•©ë‹ˆë‹¤!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-기반보드" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR 코드" @@ -490,14 +477,14 @@ msgstr "" "ë²”ì¸ ì½”ë“œ:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© í¬ê¸° (%08x : address = %08x) 코드 추가 (%s)ì—" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -506,7 +493,7 @@ msgstr "" "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© í¬ê¸° (%08x : address = %08x) 채우기와 슬ë¼ì´ë“œ(%s)" "ì—" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -515,7 +502,7 @@ msgstr "" "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© í¬ê¸° (%08x : address = %08x) 램 쓰기와 채우기 (%s)" "ì—" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -523,12 +510,12 @@ msgid "" msgstr "" "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© í¬ê¸° (%08x : address = %08x) í¬ì¸í„° (%s)ì— ì“°ê¸°ì—" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© í¬ê¸° (%08x), 메모리 복사 (%s)ì—" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -538,27 +525,27 @@ msgstr "" "(%s)\n" "마스터 코드가 필요하지 않습니다. 마스터 코드를 사용하지 마세요." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì—러: 비ì í•© AR 코드 ë¼ì¸: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "ì•¡ì…˜ 리플레ì´: ì¡°ê±´ì  ì½”ë“œ: 비ì í•© í¬ê¸° %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "ì•¡ì…˜ 리플레ì´: 비ì í•© ì¼ë°˜ 코드 타입 %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "ì•¡ì…˜ 리플레ì´: ì¼ë°˜ 코드 %i: 비ì í•© 서브타입 %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "ì•¡ì…˜ 리플레ì´: ì¼ë°˜ 코드 0: 비ì í•© 서브타입 %08x (%s)" @@ -572,11 +559,11 @@ msgstr "어댑터:" msgid "Add" msgstr "추가" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "ì•¡ì…˜ë¦¬í”Œë ˆì´ ì½”ë“œ 추가" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "패치 추가" @@ -584,9 +571,9 @@ msgstr "패치 추가" msgid "Add new pane" msgstr "새로운 ì°½ 추가" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "추가..." @@ -642,32 +629,32 @@ msgstr "고급" msgid "Advanced Settings" msgstr "고급 설정" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "모든 GC/Wii 파ì¼ë“¤ (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "모든 GC/Wii ì´ë¯¸ì§€ë“¤ (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "모든 게임í브 GCM 파ì¼ë“¤ (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "모든 ìƒíƒœë“¤ 저장 (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "모든 Wii ISO 파ì¼ë“¤ (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "모든 ì••ì¶•ëœ GC/Wii ISO 파ì¼ë“¤ (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "모든 íŒŒì¼ (*.*)|*.*" @@ -687,19 +674,19 @@ msgstr "비등방성 í•„í„°ë§:" msgid "Anti-Aliasing:" msgstr "안티-앨리어싱:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "앱로ë”ê°€ ìž˜ëª»ëœ í¬ê¸°ìž„... ì •ë§ ì•±ë¡œë”입니까?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "앱로ë”ê°€ 파ì¼ë¡œ 부터 로드할 수 ì—†ìŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "앱로ë”:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "ì ìš©" @@ -713,7 +700,7 @@ msgstr "" "\n" "모르겠으면, (ë„기)를 ì„ íƒí•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "ì•„ëžì–´" @@ -722,7 +709,7 @@ msgstr "ì•„ëžì–´" msgid "Are you sure you want to delete \"%s\"?" msgstr "\"%s\" 를 ì •ë§ë¡œ 지우고 싶습니까?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -730,15 +717,20 @@ msgstr "" "ì´ íŒŒì¼ë“¤ì„ ì •ë§ë¡œ 지우고 싶습니까?\n" "ê·¸ê²ƒë“¤ì€ ì˜ì›ížˆ 사ë¼ì§‘니다!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "ì´ íŒŒì¼ì„ ì •ë§ë¡œ 지우고 싶습니까? ê·¸ê²ƒì€ ì˜ì›ížˆ 사ë¼ì§‘니다!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (실험ì )" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (실험ì )" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "종횡비:" @@ -747,12 +739,12 @@ msgstr "종횡비:" msgid "At least one pane must remain open." msgstr "ì ì–´ë„ í•˜ë‚˜ì˜ ì°½ì´ ì—´ë ¤ 있어야합니다." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "오디오" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "오디오 백엔드:" @@ -760,7 +752,7 @@ msgstr "오디오 백엔드:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: AO 장치를 열기 ì—러.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "ìžë™" @@ -799,16 +791,16 @@ msgstr "BP 레지스터" msgid "Back" msgstr "뒤로" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "백엔드 설정" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "백엔드:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "백그ë¼ìš´ë“œ ìž…ë ¥" @@ -817,24 +809,24 @@ msgstr "백그ë¼ìš´ë“œ ìž…ë ¥" msgid "Backward" msgstr "뒤로" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "ë°°ë“œ íŒŒì¼ í—¤ë”" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "밸런스 ë³´ë“œ" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr " 배너" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "배너 세부사항" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "배너:" @@ -854,7 +846,7 @@ msgstr "기본 설정" msgid "Bass" msgstr "ë² ì´ìŠ¤" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "블럭 할당 í…Œì´ë¸” ì²´í¬ì„¬ì„ 실패했습니다" @@ -875,7 +867,7 @@ msgid "Blue Right" msgstr "파랑 오른쪽" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "아래" @@ -884,27 +876,27 @@ msgstr "아래" msgid "Bound Controls: %lu" msgstr "바운드 컨트롤들: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "고장남" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "í´ë”íƒìƒ‰" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "추가할 디렉토리 둘러보기" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "ISO 디렉토리 불러오기..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "출력 디렉토리 둘러보기" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "버í¼:" @@ -914,7 +906,7 @@ msgstr "버í¼:" msgid "Buttons" msgstr "버튼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -959,33 +951,33 @@ msgstr "" "\n" "모르겠으면, ì–¸ì²´í¬ ìƒíƒœë¡œ ë‘세요." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "%02x ì—°ê²°í•¸ë“¤ì— ì˜í•´ 위모트를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "DVD_í”ŒëŸ¬ê·¸ì¸ - DVD-ì¸í„°íŽ˜ì´ìŠ¤ì—ì„œ ì½ì„ 수 ì—†ìŒ: ì¹˜ëª…ì  ì—러" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "취소" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "%s를 열수 ì—†ìŒ" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "ì´ë²¤íŠ¸ë“¤ ë¯¸í•´ê²°ì„ ì§€ë‹Œ ì´ë²¤íŠ¸ë“¤ì„ 등ë¡í•˜ì§€ ì•Šì„ ìˆ˜ ì—†ìŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -996,7 +988,7 @@ msgstr "" "%s\n" "는 유효한 게임í브 메모리 ì¹´ë“œ 파ì¼ì´ 아닙니다" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1008,7 +1000,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "카탈로니아어" @@ -1016,11 +1008,11 @@ msgstr "카탈로니아어" msgid "Center" msgstr "중앙" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "변경" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "ë””ìŠ¤í¬ ë³€ê²½(&D)..." @@ -1028,11 +1020,11 @@ msgstr "ë””ìŠ¤í¬ ë³€ê²½(&D)..." msgid "Change Disc" msgstr "ë””ìŠ¤í¬ ë³€ê²½" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "게임 변경" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1048,11 +1040,11 @@ msgstr "표시를 zì›ê±°ë¦¬ 파ë¼ë¯¸í„°ë¡œ 변경 (ì •ì • 후ì—)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "표시를 z근거리 파ë¼ë¯¸í„°ë¡œ 변경 (ì •ì • 후ì—)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "ì—뮬레ì´í„°ê°€ ìž‘ë™í•˜ê³  있는 ë™ì•ˆì— ì´ ë³€ê²½ì€ íš¨ê³¼ê°€ ì—†ì„ ê²ë‹ˆë‹¤!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "채팅" @@ -1060,47 +1052,47 @@ msgstr "채팅" msgid "Cheat Code" msgstr "치트 코드" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "치트 찾기" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "치트들 관리ìž" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "파티션 완전성 ì²´í¬" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "파티션 완전성 ì²´í¬ì¤‘..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "중국어 (간소화)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "중국어 (전통)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "DVD 루트 디렉토리 ì„ íƒ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "NAND 루트 디렉토리 ì„ íƒ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "ë””í´íŠ¸ ISO ì„ íƒ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "추가할 디렉토리 ì„ íƒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "열려는 íŒŒì¼ ì„ íƒ" @@ -1108,15 +1100,15 @@ msgstr "열려는 íŒŒì¼ ì„ íƒ" msgid "Choose a memory card:" msgstr "메모리 ì¹´ë“œ ì„ íƒ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" "앱로ë”ë¡œ 사용할 파ì¼ì„ ì„ íƒ: (디렉토리들로만 êµ¬ì„±ëœ ë””ìŠ¤í¬ë“¤ì—게만 ì ìš©ë¨)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "압축해제할 í´ë”를 ì„ íƒ" @@ -1135,7 +1127,7 @@ msgstr "í´ëž˜ì‹" msgid "Clear" msgstr "깨ë—ì´" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1145,7 +1137,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "닫기" @@ -1154,11 +1146,11 @@ msgstr "닫기" msgid "Co&nfigure..." msgstr "환경설정(&n)..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "코드 ì •ë³´" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "코드:" @@ -1170,24 +1162,24 @@ msgstr "명령" msgid "Comment" msgstr "주ì„" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "주ì„:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "ISO 압축..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "ì„ íƒëœ ISO들 압축..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "ISO 압축하기" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr " 환경 " @@ -1201,18 +1193,18 @@ msgstr "환경설정" msgid "Configure Control" msgstr "컨트롤 설정" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "패드들 설정" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "환경설정..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "íŒŒì¼ ë®ì–´ì“°ê¸° 확정" @@ -1225,17 +1217,16 @@ msgstr "중지시 확ì¸" msgid "Connect" msgstr "ì—°ê²°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "USB 키보드 ì—°ê²°" +msgstr "밸런스 ë³´ë“œ ì—°ê²°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "USB 키보드 ì—°ê²°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "위모트 %i ì—°ê²°" @@ -1256,7 +1247,7 @@ msgstr "위모트 3 ì—°ê²°" msgid "Connect Wiimote 4" msgstr "위모트 4 ì—°ê²°" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "연결중..." @@ -1276,7 +1267,7 @@ msgstr "컨트롤" msgid "Convert to GCI" msgstr "GCI ë¡œ 변환" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "복사 실패했습니다" @@ -1285,21 +1276,16 @@ msgstr "복사 실패했습니다" msgid "Copy to Memcard %c" msgstr "메모리카드 %c ì— ë³µì‚¬" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "코어" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "%s 를 ìƒì„±í•  수 없었습니다" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "백엔드 %s 를 초기화할 수 없었습니다" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1310,24 +1296,16 @@ msgstr "" "ë°±ì—…ì´ ì•„ë‹˜. ë³¸ëž˜ì˜ ê²Œìž„í브와 Wii 디스í¬ë“¤ì€ ëŒ€ë¶€ë¶„ì˜ PC DVD ë“œë¼ì´ë¸Œë“¤ì—ì„œ " "ì½ì–´ì§ˆ 수 ì—†ìŒì„ 아세요." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "%s ISO 파ì¼ì„ ì¸ì‹í•  수 없었습니다" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "%s 를 저장할 수 없었습니다" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"íŒ¨ë“œë“¤ì„ ì„¤ì •í•  수 없었습니다. 플레ì´ì–´ê°€ 떠났거나 ê²Œìž„ì´ í˜„ìž¬ 구ë™ì¤‘!\n" -"(ê²Œìž„ì´ êµ¬ë™ì¤‘ì¼ ë•Œ íŒ¨ë“œë“¤ì„ ì„¤ì •í•˜ê¸°ëŠ” ì•„ì§ ì§€ì›ë˜ì§€ 않습니다)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1347,11 +1325,11 @@ msgstr "" "ì—뮬레ì´í„° 디렉토리를 ì´ë™í•œ í›„ì— ì´ ë©”ì‹œì§€ë¥¼ 받고 있나요?\n" "그렇다면, 옵션ì—ì„œ 메모리카드 위치를 재지정해야 í• ê²ë‹ˆë‹¤." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "í™•ìž¥ìž 'ini'ì— ëŒ€í•œ 열린 ëª…ë ¹ì„ ë°œê²¬í•  수 없었습니다!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1359,17 +1337,17 @@ msgstr "" "코어를 초기화할 수 없었습니다\n" "ë‹¹ì‹ ì˜ í™˜ê²½ì„¤ì •ì„ ì²´í¬í•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "카운트:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "êµ­ê°€:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "AR 코드 ìƒì„±" @@ -1404,12 +1382,12 @@ msgstr "" msgid "Crossfade" msgstr "í¬ë¡œìŠ¤íŽ˜ì´ë“œ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "wxFileSelectorí›„ì— í˜„ìž¬ 디렉토리가 %sì—ì„œ %së¡œ 변경ë¨!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "ì‚¬ìš©ìž ì§€ì • 프로ì ì…˜ 핵:" @@ -1417,11 +1395,11 @@ msgstr "ì‚¬ìš©ìž ì§€ì • 프로ì ì…˜ 핵:" msgid "Custom Projection Hack Settings" msgstr "ì‚¬ìš©ìž ì§€ì • 프로ì ì…˜ 핵 설정" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "ì¼ë¶€ ì • íˆ¬ì˜ íŒŒë¼ë¯¸í„°ë“¤ì„ 커스터마ì´ì¦ˆ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "ì²´ì½”" @@ -1433,36 +1411,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-패드" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "오디오" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP ì—뮬레ì´í„° 엔진" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE ì—뮬레ì´ì…˜ (빠름)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE ì¸í„°í”„리터 (ëŠë¦¼)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE 리컴파ì¼ëŸ¬" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "ì „ìš© 쓰레드ìƒì— DSP" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "DSP 설정" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD 루트:" @@ -1474,15 +1452,15 @@ msgstr "DVD저수준ì½ê¸° - ì¹˜ëª…ì  ì—러: 볼륨ì—ì„œ ì½ê¸°ë¥¼ 실패했 msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVD저수준비암호화ì½ê¸° - ì¹˜ëª…ì  ì—러: 볼륨ì—ì„œ ì½ê¸°ë¥¼ 실패했습니다." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "댄스 매트" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "ë°ì´í„° í¬ê¸°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "날짜:" @@ -1511,29 +1489,28 @@ msgstr "디버깅" msgid "Decimal" msgstr "10진수ì˜" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "ISO 압축해제..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "ì„ íƒëœ ISO들 압축해제..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "ISO 압축해제하기" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "게임 ëª©ë¡ ìƒˆë¡œ 고침" +msgstr "프레임 제한 ê°ì†Œ" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "기본" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "기본 ISO:" @@ -1577,8 +1554,8 @@ msgstr "" msgid "Device" msgstr "장비" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "장비 설정" @@ -1586,15 +1563,12 @@ msgstr "장비 설정" msgid "Dial" msgstr "다ì´ì–¼" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1609,7 +1583,7 @@ msgstr "비활성" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "목ì ì§€ 알파 비활성" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1644,19 +1618,18 @@ msgstr "" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"다양한 그래픽 íš¨ê³¼ë“¤ì„ ìœ„í•´ ë§Žì€ ê²Œìž„ë“¤ì—ì„œ 사용ë˜ëŠ” \"목표 알파 패스\"를 스" -"킵합니다.\n" +"다양한 그래픽 íš¨ê³¼ë“¤ì„ ìœ„í•´ ë§Žì€ ê²Œìž„ë“¤ì—ì„œ 사용ë˜ëŠ”, 목ì ì§€ ì•ŒíŒŒë¼ ë¶ˆë¦¬ëŠ” 하" +"드웨어 íŠ¹ì„±ì˜ ì—뮬레ì´ì…˜ì„ 비활성화합니다.\n" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "디스í¬" @@ -1683,24 +1656,59 @@ msgstr "" msgid "Divide" msgstr "나누기" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "현재 ì—뮬레ì´ì…˜ì„ 중단하고 싶습니까?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "ëŒë¹„ 프로 ë¡œì§ II 디코ë”" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "ëŒí•€" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "ëŒí•€ %s 그래픽 환경설정" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "ëŒí•€ 웹 사ì´íŠ¸(&W)" @@ -1716,12 +1724,12 @@ msgstr "ëŒí•€ ì—ë®¬ëœ ìœ„ëª¨íŠ¸ 환경설정" msgid "Dolphin FIFO" msgstr "ëŒí•€ FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "ëŒí•€ GC패드 환경설정" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "ëŒí•€ TAS ë™ì˜ìƒ (*.dtm)" @@ -1729,11 +1737,11 @@ msgstr "ëŒí•€ TAS ë™ì˜ìƒ (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "ëŒí•€ 위모트 환경설정" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "ëŒí•€ 구글 코드(&G)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1741,7 +1749,7 @@ msgstr "" "ëŒí•€ì´ ì–´ëŠ GC/Wii ISOë„ ì°¾ì„ ìˆ˜ 없었습니다. 파ì¼ì„ 둘러보려면 여기를 ë”블í´" "릭하세요..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1749,18 +1757,18 @@ msgstr "" "ëŒí•€ì´ 현재 모든 ê²Œìž„ë“¤ì„ ìˆ¨ê¸°ê²Œ 설정ë¨. 모든 ê²Œìž„ë“¤ì„ ë³´ë ¤ë©´ 여기를 ë”블í´" "릭..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "ëŒí•€ì´ ìš”ì²­ëœ ì•¡ì…˜ì„ ì™„ìˆ˜í•  수 없었습니다." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"빠른 ë””ìŠ¤í¬ ì—‘ì„¸ìŠ¤ 활성. ì¼ë¶€ 게임들ì—ì„œ 요구ë¨. (켬 = 빠른, ë” = 호환성)" +"ì—ë®¬ëœ GPU í´ëŸ­ ì†ë„를 ë‘ë°°ë¡œ 합니다. ì¼ë¶€ ê²Œìž„ë“¤ì´ ë¹¨ë¼ì§ˆì§€ë„ (켬 = 빠름, " +"ë” = 호환성)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1780,11 +1788,11 @@ msgstr "%lu ì½”ë“œë“¤ì´ ë‹¤ìš´ë¡œë“œë¨. (ì¶”ê°€ëœ %lu)" msgid "Drums" msgstr "드럼" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "ë”미" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "오디오 ë¤í”„" @@ -1830,9 +1838,9 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "네ëœëž€ë“œì–´" @@ -1856,7 +1864,7 @@ msgstr "" "-- ìµœê·¼ì— ëŒí•€ ë°°í¬ë¥¼ 업그레ì´ë“œí–ˆë‹¤ë©´, 윈ë„우즈가 새로운 ë“œë¼ì´ë²„를 ì¸ì‹í•˜" "는 ê´€ì ì—ì„œ ìž¬ë¶€íŒ…ì´ í•„ìš”í•  ê²ë‹ˆë‹¤." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "유럽" @@ -1864,7 +1872,7 @@ msgstr "유럽" msgid "Early Memory Updates" msgstr "빠른 메모리 ì—…ë°ì´íŠ¸" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "편집" @@ -1872,7 +1880,7 @@ msgstr "편집" msgid "Edit ActionReplay Code" msgstr "ì•¡ì…˜ë¦¬í”Œë ˆì´ ì½”ë“œ 편집" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "환경 편집" @@ -1880,12 +1888,12 @@ msgstr "환경 편집" msgid "Edit Patch" msgstr "패치 편집" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "현재 ê´€ì  íŽ¸ì§‘" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "편집..." @@ -1897,7 +1905,7 @@ msgstr "효과" msgid "Embedded Frame Buffer" msgstr "내장형 프레임 버í¼" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "ì—뮬 쓰레드가 ì´ë¯¸ 구ë™ì¤‘ìž„" @@ -1935,7 +1943,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "ì—ë®¬ëœ ìœ„ëª¨íŠ¸" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "ì—뮬레ì´ì…˜ ìƒíƒœ:" @@ -1959,15 +1967,15 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "AR 로깅 활성" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "ë¸”ë¡ í•©ì¹˜ê¸° 활성" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "바운딩 박스 계산 켜기" @@ -1979,7 +1987,7 @@ msgstr "ìºì‰¬ 활성" msgid "Enable Cheats" msgstr "치트 활성" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "듀얼 코어 활성" @@ -1987,7 +1995,7 @@ msgstr "듀얼 코어 활성" msgid "Enable Dual Core (speedup)" msgstr "듀얼 코어 활성 (ì†ë„ìƒìŠ¹)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "ì•„ì´ë“¤ 스킵 활성" @@ -1995,7 +2003,7 @@ msgstr "ì•„ì´ë“¤ 스킵 활성" msgid "Enable Idle Skipping (speedup)" msgstr "ì•„ì´ë“¤ 스킵 활성 (ì†ë„ìƒìŠ¹)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "MMU 활성" @@ -2003,7 +2011,7 @@ msgstr "MMU 활성" msgid "Enable Progressive Scan" msgstr "프로그레시브 스캔 활성" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "스í¬ë¦° 세ì´ë²„ 활성" @@ -2011,7 +2019,7 @@ msgstr "스í¬ë¦° 세ì´ë²„ 활성" msgid "Enable Speaker Data" msgstr "스피커 ë°ì´í„°ë¥¼ 켭니다" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "와ì´ë“œìŠ¤í¬ë¦° 활성" @@ -2033,7 +2041,7 @@ msgstr "" "\n" "모르겠으면, 1x를 ì„ íƒí•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2068,7 +2076,7 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2076,32 +2084,24 @@ msgstr "" "The Legend of Zelda: Twilight Princess를 ì†ë„를 올리려면 켬. 다른 ê²Œìž„ì„ ìœ„í•´" "서는 ë”." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "ì‚¬ìš©ìž ì§€ì • 프로ì ì…˜ 핵 활성화" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" "5.1 ì„œë¼ìš´ë“œë¥¼ ì´ìš©í•œ ëŒë¹„ 프로 ë¡œì§ II ì—뮬레ì´ì…˜ì„ 켭니다. OSXì—서는 ì•Šë¨." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "5.1 ì„œë¼ìš´ë“œë¥¼ ì´ìš©í•œ ëŒë¹„ 프로 ë¡œì§ II ì—뮬레ì´ì…˜ì„ 켭니다. OpenAL 백엔드 ì „" "ìš©." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"5.1 ì„œë¼ìš´ë“œë¥¼ ì´ìš©í•œ ëŒë¹„ 프로 ë¡œì§ II ì—뮬레ì´ì…˜ì„ 켭니다. OpenAL 백엔드 ì „" -"ìš©. ìž‘ë™ì‹œí‚¤ë ¤ë©´ soft_oal.dll ì„ OpenAL32.dll ë¡œ ì´ë¦„바꾸기가 필요할 지ë„." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2114,7 +2114,7 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2134,9 +2134,9 @@ msgstr "" msgid "End" msgstr "ë" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "ì˜ì–´" @@ -2159,21 +2159,20 @@ msgstr "엔트리 %d/%d" msgid "Entry 1/%d" msgstr "엔트리 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "ê°™ìŒ" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "ì—러" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "ì„ íƒëœ 언어 로딩 ì—러. 시스템 기본으로 ëŒì•„갑니다." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2200,7 +2199,6 @@ msgid "Euphoria" msgstr "유í¬ë¦¬ì•„" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "예외 핸들러 - 메모리 공간 아래를 ì ‘ê·¼. %08llx%08llx" @@ -2209,16 +2207,20 @@ msgstr "예외 핸들러 - 메모리 공간 아래를 ì ‘ê·¼. %08llx%08llx" msgid "Execute" msgstr "실행" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" +msgstr "나가기" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "내보내기 실패했습니다" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "íŒŒì¼ ë‚´ë³´ë‚´ê¸°" @@ -2226,7 +2228,7 @@ msgstr "íŒŒì¼ ë‚´ë³´ë‚´ê¸°" msgid "Export Recording" msgstr "(ìž…ë ¥) ê¸°ë¡ ë‚´ë³´ë‚´ê¸°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "(ìž…ë ¥) ê¸°ë¡ ë‚´ë³´ë‚´ê¸°..." @@ -2234,7 +2236,7 @@ msgstr "(ìž…ë ¥) ê¸°ë¡ ë‚´ë³´ë‚´ê¸°..." msgid "Export Save" msgstr "저장 내보내기" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Wii 저장 내보내기 (실험ì )" @@ -2242,15 +2244,15 @@ msgstr "Wii 저장 내보내기 (실험ì )" msgid "Export all saves" msgstr "모든 ì €ìž¥ë“¤ì„ ë‚´ë³´ë‚´ê¸°" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "내보내기 실패했습니다, 다시 ì‹œë„?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "ì €ìž¥ì„ ë‹¤ë¥¸ ì´ë¦„으로 내보내기..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "확장" @@ -2266,44 +2268,44 @@ msgstr "추가 매개변수" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "추가 매개변수는 ''Metroid: Other M''ì—서만 유용합니다." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "모든 파ì¼ë“¤ 압축풀기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "ì•±ë¡œë” ì••ì¶•í’€ê¸°..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOL 압축풀기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "디렉토리 압축풀기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "íŒŒì¼ ì••ì¶• 풀기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "파티션 압축풀기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s 압축풀기" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "모든 파ì¼ë“¤ 압축풀기" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "디렉토리 압축풀기" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "압축풀기..." @@ -2315,15 +2317,15 @@ msgstr "FIFO ë°”ì´íŠ¸" msgid "FIFO Player" msgstr "FIFO 플레ì´ì–´" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "프랑스" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST í¬ê¸°:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "ì—°ê²°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤!" @@ -2331,11 +2333,15 @@ msgstr "ì—°ê²°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤!" msgid "Failed to download codes." msgstr "코드들 ë‹¤ìš´ë¡œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "%së¡œ 압축풀기 실패했습니다!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2363,6 +2369,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"bthprops.cpl ë¡œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤! 리얼 위모트 ì—°ê²°ì´ ìž‘ë™í•˜ì§€ 않습니다 그래" +"ì„œ ëŒí•€ì´ ê°‘ìžê¸° ê¹¨ì§ˆì§€ë„ ëª¨ë¦…ë‹ˆë‹¤!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2370,21 +2378,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"hid.dll ë¡œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤! 리얼 위모트 ì—°ê²°ì´ ìž‘ë™í•˜ì§€ 않습니다 그래서 ëŒí•€" +"ì´ ê°‘ìžê¸° ê¹¨ì§ˆì§€ë„ ëª¨ë¦…ë‹ˆë‹¤!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "%s ì½ê¸°ì— 실패" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "banner.bin ì½ê¸°ì— 실패했습니다" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "bk í—¤ë” ì½ê¸°ì— 실패했습니다" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2395,7 +2405,7 @@ msgstr "" "메모리카드가 ìž˜ë ¸ì„ ì§€ë„\n" "파ì¼ìœ„치:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2403,7 +2413,7 @@ msgstr "" "블럭 할당 í…Œì´ë¸” ë°±ì—…ì„ ì˜¬ë°”ë¥´ê²Œ ì½ê¸°ì— 실패했습니다\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2411,17 +2421,17 @@ msgstr "" "블럭 할당 í…Œì´ë¸”ì„ ì˜¬ë°”ë¥´ê²Œ ì½ê¸°ì— 실패했습니다\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "%d 파ì¼ë¡œ 부터 ë°ì´í„° ì½ê¸° 실패" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "파ì¼: %s ì—ì„œ ë°ì´í„° ì½ê¸°ì— 실패했습니다" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2429,7 +2439,7 @@ msgstr "" "디렉토리 ë°±ì—…ì„ ì˜¬ë°”ë¥´ê²Œ ì½ê¸°ì— 실패했습니다\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2437,11 +2447,11 @@ msgstr "" "디렉토리를 올바르게 ì½ê¸°ì— 실패했습니다\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "í—¤ë” ì½ê¸°ì— 실패했습니다" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2449,29 +2459,34 @@ msgstr "" "í•´ë”를 올바르게 ì½ê¸°ì— 실패했습니다\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "ë””ìŠ¤í¬ ì´ë¯¸ì§€ë¡œ 부터 유ì¼í•œ ID를 ì½ê¸°ì— 실패했습니다" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "BT.DINF를 SYSCONFë¡œ ì“°ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "bkhdr를 ì“°ê¸°ì— ì‹¤íŒ¨" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "%s ì— ëŒ€í•œ í—¤ë” ì“°ê¸°ì— ì‹¤íŒ¨" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "%d 파ì¼ì— 대한 í—¤ë” ì“°ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "페르시아어" @@ -2481,13 +2496,13 @@ msgstr "빠름" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "빠른 ê¹Šì´ ê³„ì‚°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "MMUì˜ ë¹ ë¥¸ 버전. 모든 ê²Œìž„ì— ëŒ€í•´ ìž‘ë™í•˜ì§€ëŠ” 않는다." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2495,7 +2510,7 @@ msgstr "" "ì¹˜ëª…ì  ë¹„ë™ê¸°. 재ìƒì„ 중단합니다. (PlayWiimoteì—ì„œ ì—러: %u != %u, byte " "%u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "FIFO 플레ì´ì–´" @@ -2519,7 +2534,7 @@ msgstr "" "파ì¼ì„ ì—´ 수 없었습니다\n" "í˜¹ì€ ì í•©í•œ 확장ìžê°€ 아닙니다" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2532,20 +2547,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "파ì¼ì´ 메모리카드로 ì¸ì‹ë˜ì§€ 않는다" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "파ì¼ì´ 압축ë˜ì§€ 않었습니다" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: 알려지지 ì•Šì€ ì—´ê¸° 모드: 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "파ì¼ì‹œìŠ¤í…œ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "'ini'파ì¼íƒ€ìž…ì€ ì•Œë ¤ì§€ì§€ ì•ŠìŒ! 열지 않겠습니다!" @@ -2605,7 +2620,7 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2615,7 +2630,7 @@ msgstr "" "언체í¬ë¡œ ë‘ë©´, ëŒí•€ ê¸°ë³¸ì€ NTSC-U ì´ê³  ì¼ë³¸ ê²Œìž„ë“¤ì„ í”Œë ˆì´í•  ë•Œ ìžë™ì ìœ¼ë¡œ " "ì´ ì„¸íŒ…ì´ í™œì„±í™”ë©ë‹ˆë‹¤." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2629,13 +2644,18 @@ msgstr "앞으로" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "ì•ž í¬íŠ¸(UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "%d ê°œ 찾았습니다 '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2677,9 +2697,9 @@ msgstr "녹화할 프레임" msgid "Free Look" msgstr "ìžìœ ë¡œìš´ 보기" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "프랑스어" @@ -2692,7 +2712,7 @@ msgstr "프렛들" msgid "From" msgstr "From" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "전체화면" @@ -2704,7 +2724,7 @@ msgstr "전체화면 í•´ìƒë„:" msgid "GCI File(*.gci)" msgstr "GCI 파ì¼(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC패드" @@ -2712,27 +2732,27 @@ msgstr "GC패드" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "게임 ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "ê²Œìž„ì´ ì´ë¯¸ 구ë™ì¤‘입니다!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "ê²Œìž„ì´ êµ¬ë™ì¤‘ì´ì§€ 않습니다!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "ê²Œìž„ì´ ì—†ìŠµë‹ˆë‹¤!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "게임-ìƒì„¸ 설정" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "게임환경" @@ -2749,20 +2769,20 @@ msgid "Gamecube &Pad Settings" msgstr "게임í브 패드 설정(&P)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "게임í브 메모리 카드들 (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "게임í브 패드 설정" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko 코드" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2784,26 +2804,26 @@ msgstr "ì¼ë°˜" msgid "General Settings" msgstr "ì¼ë°˜ 설정" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "ë…ì¼ì–´" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: ì¸ë±ìŠ¤ê°€ ar 코드 리스트 í¬ê¸° %lu 보다 ë” í½ë‹ˆë‹¤ " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "그래픽" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "그래픽 설정" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "보다 í°" @@ -2824,7 +2844,7 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ ì²´í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "그리스어" @@ -2848,11 +2868,11 @@ msgstr "기타" msgid "Hacks" msgstr "핵" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "í—¤ë” ì²´í¬ì„¬ 실패했습니다" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "히브리어" @@ -2864,7 +2884,7 @@ msgstr "높ì´" msgid "Help" msgstr "ë„움" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2884,7 +2904,7 @@ msgstr "" "\n" "사요나ë¼!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2937,7 +2957,7 @@ msgstr "단축키 설정" msgid "Hotkeys" msgstr "단축키들" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "í—가리어" @@ -2945,18 +2965,18 @@ msgstr "í—가리어" msgid "Hybrid Wiimote" msgstr "하ì´ë¸Œë¦¬ë“œ 위모트" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: 알려지지 ì•Šì€ í‹°ì¼“: %08x/%08x ì—ì„œ ë°ì´í„°ë¥¼ 얻으려 ì‹œë„í–ˆ" "습니다" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -2965,15 +2985,15 @@ msgstr "" "TitleID %016llx.\n" "ëŒí•€ì€ ì´ì œ 멈추려할 것입니다." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - ìž˜ëª»ëœ ëŒ€ìƒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL 설정" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2985,15 +3005,15 @@ msgstr "IR í¬ì¸í„°" msgid "IR Sensitivity:" msgstr "IR ê°ë„:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO 세부사항" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO 디렉토리들" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ì´íƒˆë¦¬ì•„" @@ -3001,7 +3021,7 @@ msgstr "ì´íƒˆë¦¬ì•„" msgid "Icon" msgstr "ì•„ì´ì½˜" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3045,9 +3065,13 @@ msgstr "" msgid "Import Save" msgstr "ì €ìž¥ì„ ê°€ì ¸ì˜¤ê¸°" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "가져오기 실패했습니다, 재시ë„?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3069,21 +3093,16 @@ msgstr "" "가져온 파ì¼ì´ sav 확장ìžë¥¼ 지닌다\n" "하지만 올바른 í•´ë”를 지니지 않는다" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "게임안" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "게임-안" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "프레임제한:" +msgstr "프레임 제한 ì¦ê°€" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "ì •ë³´" @@ -3103,7 +3122,7 @@ msgstr "삽입" msgid "Insert Encrypted or Decrypted code here..." msgstr "암호화ë˜ê±°ë‚˜ 암호해ë…ëœ ì½”ë“œë¥¼ ì—¬ê¸°ì— ì‚½ìž…í•˜ì„¸ìš”..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "SD ì¹´ë“œ 삽입" @@ -3111,38 +3130,39 @@ msgstr "SD ì¹´ë“œ 삽입" msgid "Insert name here.." msgstr "ì´ë¦„ì„ ì—¬ê¸°ì— ë„£ìœ¼ì‹œì˜¤..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "WAD 설치" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Wii ë©”ë‰´ì— ì„¤ì¹˜" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler 호출ë¨, 하지만 ì´ í”Œëž«í¼ì€ ì•„ì§ ê·¸ê²ƒì„ ì§€ì›í•˜ì§€ 않습" "니다." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "WAD 설치하기..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "완전성 ì²´í¬ ì—러" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "완전성 ì²´í¬ ì™„ë£Œë¨" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "완전성 ì²´í¬ê°€ 완료ë˜ì—ˆìŠµë‹ˆë‹¤. ì—러가 발견ë˜ì§€ 않었습니다." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3155,7 +3175,7 @@ msgstr "" msgid "Interface" msgstr "ì¸í„°íŽ˜ì´ìŠ¤" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "ì¸í„°íŽ˜ì´ìŠ¤ 설정" @@ -3180,20 +3200,20 @@ msgstr "내부 LZO ì—러 - lzo_init() 실패했습니다" msgid "Internal Resolution:" msgstr "내부 í•´ìƒë„:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "ì¸í„°í”„리터 (매우 ëŠë¦¼)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "소개화면" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "비ì í•© í¬ê¸°(%x) í˜¹ì€ ë§ˆë²• ë‚±ë§ (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "비ì í•© ê°’!" @@ -3201,16 +3221,16 @@ msgstr "비ì í•© ê°’!" msgid "Invalid bat.map or dir entry" msgstr "비ì í•© bat.map í˜¹ì€ ë””ë ‰í† ë¦¬ 엔트리" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "비ì í•© ì´ë²¤íŠ¸ 타입 %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "비ì í•© 파ì¼" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3221,7 +3241,7 @@ msgstr "" "%s\n" " ë‹¹ì‹ ì€ ì´ ê²Œìž„ì„ ë¦¬ë¤í”„해야할 지ë„." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "비ì í•© ê¸°ë¡ íŒŒì¼" @@ -3237,34 +3257,36 @@ msgstr "비ì í•© 찾기 ìŠ¤íŠ¸ë§ (숫ìžë¡œ ë³€í™˜ë  ìˆ˜ 없었습니다)" msgid "Invalid search string (only even string lengths supported)" msgstr "비ì í•© 찾기 ìŠ¤íŠ¸ë§ (ì§ìˆ˜ ê¸¸ì´ ìŠ¤íŠ¸ë§ë§Œ 지ì›ë©ë‹ˆë‹¤)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "비ì í•© ìƒíƒœ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "ì´íƒˆë¦¬ì•„ì–´" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "ì¼ë³¸" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT 리컴파ì¼ëŸ¬ (권장)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL ì‹¤í—˜ì  ë¦¬ì»´íŒŒì¼ëŸ¬" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "ì¼ë³¸ì–´" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "한국" @@ -3286,8 +3308,9 @@ msgstr "윈ë„우를 맨위로 유지" msgid "Key" msgstr " [ 키 ]" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "한국어" @@ -3309,12 +3332,12 @@ msgstr "L-아날로그" msgid "Language:" msgstr "언어:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "최근 %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "지연:" @@ -3353,7 +3376,7 @@ msgstr "" "좌/ìš°-í´ë¦­ 옵션들 ë”.\n" "중-í´ë¦­ 지우기." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "보다 ë” ì ì€" @@ -3370,58 +3393,48 @@ msgid "Load Custom Textures" msgstr "커스텀 í…스처 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "ìƒíƒœ 로드(&L)" +msgstr "ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "슬롯1 ìƒíƒœ 로드" +msgstr "최근 1 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "슬롯2 ìƒíƒœ 로드" +msgstr "최근 2 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "슬롯3 ìƒíƒœ 로드" +msgstr "최근 3 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "슬롯4 ìƒíƒœ 로드" +msgstr "최근 4 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "슬롯5 ìƒíƒœ 로드" +msgstr "최근 5 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "슬롯6 ìƒíƒœ 로드" +msgstr "최근 6 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "슬롯7 ìƒíƒœ 로드" +msgstr "최근 7 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "슬롯8 ìƒíƒœ 로드" +msgstr "최근 8 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "슬롯1 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "슬롯1 ìƒíƒœ 로드" +msgstr "최근 10 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3452,19 +3465,18 @@ msgid "Load State Slot 8" msgstr "슬롯8 ìƒíƒœ 로드" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "슬롯1 ìƒíƒœ 로드" +msgstr "최근 9 ìƒíƒœ 로드" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "ìƒíƒœ 로드..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wii 시스템 메뉴 로드" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Wii 시스템 메뉴 %d %c 로드" @@ -3483,10 +3495,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "핵 패턴들로 부터 사용 가능한 사전설정 ê°’ì„ ë¡œë“œí•©ë‹ˆë‹¤." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "지역" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "로그" @@ -3519,12 +3527,12 @@ msgstr "" msgid "Logger Outputs" msgstr "로거 출력" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "로깅" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "ì„œë²„ì— ì—°ê²°ì„ ìžƒì–´ë²„ë¦¼!" @@ -3532,7 +3540,7 @@ msgstr "ì„œë²„ì— ì—°ê²°ì„ ìžƒì–´ë²„ë¦¼!" msgid "M Button" msgstr "M 버튼" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3541,7 +3549,7 @@ msgstr "" "MD5 미스매치\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU 스피드 핵" @@ -3555,11 +3563,11 @@ msgstr "MadCatz ê²Œìž„ìƒ¤í¬ íŒŒì¼ë“¤(*.gcs)" msgid "Main Stick" msgstr "ë©”ì¸ ìŠ¤í‹±" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "제작사 ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "제작사:" @@ -3596,7 +3604,7 @@ msgid "Memory Byte" msgstr "메모리 ë°”ì´íŠ¸" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "메모리 ì¹´ë“œ" @@ -3608,7 +3616,7 @@ msgstr "" "메모리 ì¹´ë“œ 메니저 경고-사용하기 ì „ì— ë°±ì—…ì„ ë§Œë“œì„¸ìš”, ê³ ì³ì ¸ì•¼ 겠지만 훼ì†" "ë  ìˆ˜ 있습니다." -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3625,7 +3633,7 @@ msgstr "" "%së¡œ\n" "ì˜¤ëž˜ëœ íŒŒì¼ì„ ì´ ìƒˆë¡œìš´ 위치로 복사하고 싶습니까?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "메모리카드 파ì¼í¬ê¸°ê°€ í—¤ë” í¬ê¸°ì™€ 불ì¼ì¹˜í•©ë‹ˆë‹¤" @@ -3633,7 +3641,7 @@ msgstr "메모리카드 파ì¼í¬ê¸°ê°€ í—¤ë” í¬ê¸°ì™€ 불ì¼ì¹˜í•©ë‹ˆë‹¤" msgid "Menu" msgstr "메뉴" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "마ì´í¬" @@ -3646,7 +3654,7 @@ msgstr "최소값" msgid "Misc" msgstr "기타" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "기타 설정" @@ -3671,11 +3679,11 @@ msgstr "" msgid "Monospaced font" msgstr "단ì¼ë„어쓰기 í°íŠ¸" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "모션 플러스" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "모터" @@ -3794,15 +3802,15 @@ msgstr "NP 탭" msgid "NP Up" msgstr "NP 위" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "ì´ë¦„:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "ì´ë¦„:" @@ -3812,7 +3820,7 @@ msgstr "ì´ë¦„:" msgid "Native GCI files(*.gci)" msgstr "ì›ë³¸ GCI 파ì¼ë“¤(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "새로운 스캔" @@ -3821,7 +3829,7 @@ msgstr "새로운 스캔" msgid "Next Page" msgstr "ë‹¤ìŒ íŽ˜ì´ì§€" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "ë‹¤ìŒ ìŠ¤ìº”" @@ -3829,11 +3837,11 @@ msgstr "ë‹¤ìŒ ìŠ¤ìº”" msgid "Nickname :" msgstr "별명 :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "êµ­ê°€ ì—†ìŒ (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "ISO나 WADSê°€ ì—†ìŒ" @@ -3841,7 +3849,7 @@ msgstr "ISO나 WADSê°€ ì—†ìŒ" msgid "No audio output" msgstr "오디오 ì¶œë ¥ì´ ì—†ìŠµë‹ˆë‹¤" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "%s 타ì´í‹€ì— 대한 배너 파ì¼ì´ ì—†ìŒ" @@ -3867,42 +3875,43 @@ msgstr "빈 디렉토리 ëª©ë¡ ì—”íŠ¸ë¦¬ë“¤ì´ ì—†ìŒ" msgid "No recorded file" msgstr "ë…¹í™”ëœ íŒŒì¼ì´ ì—†ìŒ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "%s 타ì´í‹€ì— 대한 저장 í´ë”ê°€ ì—†ìŒ" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "ì—†ìŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "ë…¸ë¥´ì›¨ì´ ë¶ëª°ì–´" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "같지 ì•ŠìŒ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "설정 안함" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "Wii ì €ìž¥ì´ ì•„ë‹ˆê±°ë‚˜ íŒŒì¼ í—¤ë” í¬ê¸° %x ì— ëŒ€í•œ ì½ê¸° 실패 " -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "ì—°ê²°ë˜ì§€ ì•ŠìŒ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "참고 사항" @@ -3923,7 +3932,7 @@ msgstr "알림" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "코드 번호:" @@ -3944,7 +3953,7 @@ msgstr "오브ì íŠ¸" msgid "Object Range" msgstr "오브ì íŠ¸ 범위" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "ë”" @@ -3956,25 +3965,29 @@ msgstr "오프셋:" msgid "On-Screen Display Messages" msgstr "온-스í¬ë¦° 메시지 보여주기" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "%d 블럭들만 유용한" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "열기" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "ë‹´ê³  있는 í´ë” 열기(&c)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Wii 저장 í´ë” 열기(&s)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "íŒŒì¼ ì—´ê¸°..." @@ -4000,7 +4013,13 @@ msgstr "OpenCL í…스처 디코ë”" msgid "OpenMP Texture Decoder" msgstr "OpenMP í…스처 디코ë”" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "옵션" @@ -4010,19 +4029,21 @@ msgid "Orange" msgstr "주황" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" -msgstr "íŒŒì¼ ë””ë ‰í† ë¦¬ì•ˆì— íŒŒì¼ì˜ 순서가 블럭 순서와 맞지 않습니다\n" +msgstr "" +"íŒŒì¼ ë””ë ‰í† ë¦¬ ì•ˆì— íŒŒì¼ë“¤ 순서가 블럭 순서와 맞지 않습니다\n" +"ìš°í´ë¦­í•˜ì‹œê³  모든 세ì´ë¸Œë“¤ì„ 내보네세요,\n" +"그리고 새로운 메모리카드로 세ì´ë¸Œë“¤ì„ 가져오세요\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "다른 것들" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4034,15 +4055,15 @@ msgstr "" msgid "Output" msgstr "출력" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "(ìž…ë ¥) ê¸°ë¡ ìž¬ìƒ(&l)..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "패드" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "패드" @@ -4066,17 +4087,17 @@ msgstr "단ë½" msgid "Parameters" msgstr "매개변수들" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "파티션 %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "íŒŒí‹°ì…˜ì´ ì¡´ìž¬í•˜ì§€ 않습니다: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "패치" @@ -4084,8 +4105,8 @@ msgstr "패치" msgid "Paths" msgstr "경로" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "ì¼ì‹œì •ì§€" @@ -4098,7 +4119,7 @@ msgstr "ë¬´ë¹„ì˜ ëì—ì„œ 멈추기" msgid "Per-Pixel Lighting" msgstr "픽셀단위 ê´‘ì›" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "완벽한" @@ -4108,9 +4129,9 @@ msgid "Perspective %d" msgstr "ê´€ì  %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr " 실행 " @@ -4122,7 +4143,7 @@ msgstr "(ìž…ë ¥) ê¸°ë¡ ìž¬ìƒ" msgid "Play/Pause" msgstr "실행/ì¼ì‹œì •ì§€" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "플레ì´ê°€ëŠ¥" @@ -4130,11 +4151,11 @@ msgstr "플레ì´ê°€ëŠ¥" msgid "Playback Options" msgstr "ìž¬ìƒ ì˜µì…˜" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "플레ì´ì–´" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "확ì¸í•´ì£¼ì„¸ìš”..." @@ -4146,23 +4167,23 @@ msgstr "ì €ìž¥í•˜ê¸°ì „ì— ê´€ì ì„ ìƒì„±í•´ 주세요." msgid "Plus-Minus" msgstr "플러스-마ì´ë„ˆìŠ¤" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "í´ëž€ë“œì–´" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "í¬íŠ¸ 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "í¬íŠ¸ 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "í¬íŠ¸ 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "í¬íŠ¸ 4" @@ -4171,11 +4192,11 @@ msgstr "í¬íŠ¸ 4" msgid "Port :" msgstr "í¬íŠ¸:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "í¬ë¥´íˆ¬ê°ˆì–´" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "í¬ë¥´íˆ¬ê°ˆì–´ (브ë¼ì§ˆ)" @@ -4183,17 +4204,17 @@ msgstr "í¬ë¥´íˆ¬ê°ˆì–´ (브ë¼ì§ˆ)" msgid "Post-Processing Effect:" msgstr "후-처리 효과:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "PlayControllerì— ì˜ìƒë§ˆë¬´ë¦¬ê°€ 미완성ë˜ì—ˆìŠµë‹ˆë‹¤. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "PlayWiimoteì— ì˜ìƒ 마무리가 미완성ë˜ì—ˆìŠµë‹ˆë‹¤. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "PlayWiimoteì— ì˜ìƒ 마무리가 미완성ë˜ì—ˆìŠµë‹ˆë‹¤. %u > %u" @@ -4210,7 +4231,7 @@ msgstr "ì´ì „ 페ì´ì§€" msgid "Previous Page" msgstr "ì´ì „ 페ì´ì§€" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "ì´ì „ ê°’" @@ -4226,7 +4247,7 @@ msgstr "프로파ì¼" msgid "Properties" msgstr "ì†ì„±" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "ìºì‰¬ 제거(Purge)" @@ -4235,7 +4256,7 @@ msgid "Question" msgstr "질문" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "종료" @@ -4257,13 +4278,13 @@ msgstr "R-아날로그" msgid "RAM" msgstr "램" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "러시아" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "반지름" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4279,7 +4300,7 @@ msgstr "실제" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "리얼 밸런스 ë³´ë“œ" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4296,6 +4317,10 @@ msgstr "리얼 위모트" msgid "Record" msgstr "녹화" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "녹화 ì •ë³´" @@ -4331,7 +4356,7 @@ msgstr "" "모르겠으면, ì—†ìŒì„ ì„ íƒí•˜ì„¸ìš”." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "갱신" @@ -4340,14 +4365,14 @@ msgstr "갱신" msgid "Refresh List" msgstr "ëª©ë¡ ìƒˆë¡œ 고침" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "게임 ëª©ë¡ ìƒˆë¡œ 고침" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "제거" @@ -4370,7 +4395,7 @@ msgstr "ë©”ì¸ ìœˆë„ìš°ì— ë Œë”" msgid "Reset" msgstr "리셋" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "ê²°ê³¼" @@ -4378,9 +4403,9 @@ msgstr "ê²°ê³¼" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "개정íŒ:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4391,20 +4416,17 @@ msgstr "오른쪽" msgid "Right Stick" msgstr "오른쪽 스틱" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "진ë™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"DSP HLE와 LLE를 ì „ìš© 쓰레드ìƒì—ì„œ 구ë™í•©ë‹ˆë‹¤ (권장ë˜ì§€ 않습니다: HLE로는 오디" -"오 ê²°í•¨ë“¤ì„ ìœ ë°œí•˜ê³  LLE로는 얼어버릴지 모릅니다)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "러시아어" @@ -4417,7 +4439,7 @@ msgid "Safe" msgstr "안전" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "저장" @@ -4427,23 +4449,20 @@ msgid "Save GCI as..." msgstr "다른 ì´ë¦„으로 GCI 저장..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "ìƒíƒœ 저장(&v) " +msgstr "가장 ì˜¤ëž˜ëœ ìƒíƒœ 저장" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "ìƒíƒœ 저장(&v) " +msgstr "ìƒíƒœ 저장" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "슬롯1 ìƒíƒœ 저장" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "슬롯1 ìƒíƒœ 저장" +msgstr "슬롯 10 ìƒíƒœ 저장" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4474,32 +4493,31 @@ msgid "Save State Slot 8" msgstr "슬롯8 ìƒíƒœ 저장" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "슬롯1 ìƒíƒœ 저장" +msgstr "슬롯 9 ìƒíƒœ 저장" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "ìƒíƒœ 저장..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "다른 ì´ë¦„으로 저장..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "ì••ì¶•ëœ GCM/ISO를 저장" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "현재 ê´€ì ì„ 저장" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "압축풀린 GCM/ISO를 저장" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "%s ì˜ìƒ ìƒíƒœì €ìž¥ì´ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤, ì˜ìƒ ê¸°ë¡ ì¤‘ì§€..." @@ -4508,20 +4526,20 @@ msgstr "%s ì˜ìƒ ìƒíƒœì €ìž¥ì´ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤, ì˜ìƒ ê¸°ë¡ ì¤‘ì§€... msgid "Scaled EFB Copy" msgstr "스케ì¼ëœ EFB 복사" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "스ìºë‹ %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "ISOë“¤ì„ ê²€ì‚¬í•˜ê¸°" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "스ìºë‹..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "스í¬ë¦°ìƒ·" @@ -4533,11 +4551,11 @@ msgstr "스í¬ë¡¤ ë½" msgid "Search" msgstr "찾기" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "í•„í„° 찾기" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "하위í´ë”들 찾기" @@ -4560,12 +4578,12 @@ msgstr "섹션 %s를 SYSCONFì—ì„œ ì°¾ì„ ìˆ˜ ì—†ìŒ" msgid "Select" msgstr "ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "ê¸°ë¡ íŒŒì¼ ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "설치할 Wii WAD íŒŒì¼ ì„ íƒ" @@ -4587,19 +4605,19 @@ msgstr "가져올 저장 파ì¼ì„ ì„ íƒ" msgid "Select floating windows" msgstr "유ë™ì ì¸ 윈ë„우즈 ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "로드할 íŒŒì¼ ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "저장 파ì¼ì„ ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "로드할 ìƒíƒœ ì„ íƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "저장할 ìƒíƒœ ì„ íƒ" @@ -4621,7 +4639,7 @@ msgstr "" "\n" "모르겠으면, ìžë™ì„ ì„ íƒí•˜ì„¸ìš”." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "ì„ íƒëœ 컨트롤러 프로파ì¼ì´ 존재하지 않습니다" @@ -4645,39 +4663,28 @@ msgstr "" "모르겠으면, ë°ìŠ¤í¬íƒ‘ í•´ìƒë„를 사용하세요.\n" "ê·¸ëž˜ë„ ëª¨ë¥´ê² ìœ¼ë©´, ìž‘ë™í•˜ëŠ” 최고 í•´ìƒë„를 사용하세요." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"내부ì ìœ¼ë¡œ 사용할 그래픽 API를 ì„ íƒí•©ë‹ˆë‹¤.\n" -"Direct3D 9ì€ ë³´í†µ 가장 빠릅니다. OpenGLì´ ë” ì •í™•í•˜ê¸´í•©ë‹ˆë‹¤. Direct3D 11ì€ " -"둘 사ì´ì¯¤ 입니다.\n" -"Direct3D ë°±ì—”ë“œë“¤ì€ ìœˆë„우즈들ì—서만 ì´ìš©í•  수 있다는 ê²ƒì„ ì•Œì•„ë‘세요.\n" -"\n" -"모르겠으면, Direct3D 11ì„ ì‚¬ìš©í•˜ì„¸ìš”." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"내부ì ìœ¼ë¡œ ì–´ë–¤ 그래픽 API를 사용할지 ì„ íƒí•©ë‹ˆë‹¤.\n" -"Direct3D 9ì€ ë³´í†µ 가장 빠릅니다. OpenGLì€ ë” ì •í™•í•˜ê¸´ 합니다. Dirct3D 11ì€ " -"둘 ì‚¬ì´ ì–´ë”˜ê°€ìž…ë‹ˆë‹¤.\n" -"Direct3D ë°±ì—”ë“œë“¤ì€ ìœˆë„우즈들ì—서만 ì´ìš©í•  수 있다는 ê²ƒì„ ì•Œì•„ë‘세요.\n" -"\n" -"모르겠으면, Direct3D 9ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "보내기" @@ -4689,16 +4696,16 @@ msgstr "센서 ë°” 위치:" msgid "Separator" msgstr "분리ìž" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "세르비아어" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "시리얼 í¬íŠ¸ 1 - ì´ê²ƒì€ ë„· ì–´ëŒ‘í„°ê°™ì€ ë””ë°”ì´ìŠ¤ê°€ 사용하는 í¬íŠ¸ì´ë‹¤" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "ë””í´íŠ¸ ISOë¡œ 설정(&d)" @@ -4707,7 +4714,7 @@ msgstr "ë””í´íŠ¸ ISOë¡œ 설정(&d)" msgid "Set as default Memcard %c" msgstr "기본 메모리카드 %c ë¡œ 설정" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive: 목ë¡ì´ ar 코드 ëª©ë¡ í¬ê¸° %lu 보다 ë” í½ë‹ˆë‹¤" @@ -4720,19 +4727,19 @@ msgstr "" "지연(ms 단위로)ì„ ì„¤ì •í•©ë‹ˆë‹¤. ë” ë†’ì€ ê°’ì€ ì˜¤ë””ì˜¤ íŠì„ ì¤„ì¼ ì§€ë„ ëª¨ë¦…ë‹ˆë‹¤. " "OpenAL 백엔드 ì „ìš©." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "설정..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: 설정 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "í”들기" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "단축 ì´ë¦„:" @@ -4740,23 +4747,27 @@ msgstr "단축 ì´ë¦„:" msgid "Shoulder Buttons" msgstr "ìˆ„ë” ë²„íŠ¼" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "콘솔 보기(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "로그 보기(&L)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "ìƒíƒœë°” 표시(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "툴바 표시(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "ë“œë¼ì´ë¸Œ 표시" @@ -4768,11 +4779,11 @@ msgstr "EFB 복사 ì˜ì—­" msgid "Show FPS" msgstr "FPS 보기" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "프랑스" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "게임í브" @@ -4780,35 +4791,35 @@ msgstr "게임í브" msgid "Show Input Display" msgstr "ìž…ë ¥ 표시 보기" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "ì´íƒˆë¦¬ì•„" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "JAP (ì¼ë³¸ ë°©ì‹)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "한국" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "언어 보기:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "로그 환경설정(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PAL (유럽 ë°©ì‹)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "í”Œëž«í¼ í‘œì‹œ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "지역 표시" @@ -4816,27 +4827,27 @@ msgstr "지역 표시" msgid "Show Statistics" msgstr "통계들" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "타ì´ì™„" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "USA (미국 ë°©ì‹)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "ê²Œìž„ì„ ë©ˆì¶”ê¸° ì „ì— í™•ì¸ ìƒìž 보여주기." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4854,7 +4865,7 @@ msgstr "첫번째 블럭 보기" msgid "Show lag counter" msgstr "ëž™ 계측기 보여주기" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4891,7 +4902,7 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "알려지지 ì•ŠìŒ" @@ -4905,23 +4916,24 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "사ì´ë“œì›¨ì´ 위모트" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "간소화 중국어" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "í¬ê¸°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "ë°”ì´ì˜¤ìŠ¤ 스킵" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "DCBZ 청소 건너뛰기" @@ -4945,17 +4957,17 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "슬롯 %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "슬롯 A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "슬롯 B" @@ -4963,7 +4975,7 @@ msgstr "슬롯 B" msgid "Snapshot" msgstr "스냅샷" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "소프트웨어 ë Œë”러" @@ -4978,27 +4990,27 @@ msgstr "" "디버깅 목ì ìœ¼ë¡œë§Œ 유용합니다.\n" "소프트웨어 ë Œë”ë§ì„ í™œì„±ì„ ì •ë§ ì›í•©ë‹ˆê¹Œ? 모르겠으면, '아니오'를 ì„ íƒí•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "사운드 설정" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "사운드 백엔드 %s는 ì í•©í•˜ì§€ 않습니다." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "사운드 ë²„í¼ ìƒì„± 실패했습니다: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "스페ì´ìŠ¤" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "스페ì¸ì–´" @@ -5026,37 +5038,29 @@ msgstr "" "\n" "모르겠으면, 640x528를 ì„ íƒí•˜ì„¸ìš”." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "ë””ìŠ¤í¬ ì „ì†¡ìœ¨ ì†ë„ ìƒìŠ¹" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "스퀘어 스틱" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "표준 컨트롤러" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "시작" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "ë„·í”Œë ˆì´ ì‹œìž‘(&N)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "(ìž…ë ¥) ê¸°ë¡ ì‹œìž‘(&c)" @@ -5064,7 +5068,7 @@ msgstr "(ìž…ë ¥) ê¸°ë¡ ì‹œìž‘(&c)" msgid "Start Recording" msgstr "(ìž…ë ¥) ê¸°ë¡ ì‹œìž‘" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "ìƒíƒœ" @@ -5072,7 +5076,7 @@ msgstr "ìƒíƒœ" msgid "State Saves" msgstr "ìƒíƒœ 저장" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "운전대" @@ -5081,7 +5085,7 @@ msgid "Stick" msgstr "스틱" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "중지" @@ -5111,28 +5115,28 @@ msgstr "스트럼" msgid "Subtract" msgstr "빼기" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "성공ì ìœ¼ë¡œ 파ì¼ì„ %së¡œ 내보냈ìŒ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "세ì´ë¸Œ 파ì¼ë“¤ì„ 성공ì ìœ¼ë¡œ 가져왔ìŒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "스웨ë´ì–´" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "스윙" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "GPU 쓰레드 ë™ê¸°í™”" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5140,12 +5144,13 @@ msgstr "" "듀얼 코어 모드ì—ì„œ ëžœë¤ í”„ë¦¬ì§•ë“¤ 막기를 ë•ê¸°ìœ„í•´ GPU와 CPU ì“°ë ˆë“œë“¤ì„ ë™ê¸°í™”" "합니다. (켬 = 호환성, ë” = 빠름)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "시스템 언어:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "타ì´ì™„" @@ -5170,13 +5175,13 @@ msgstr "í…Œì´ë¸” 왼쪽" msgid "Table Right" msgstr "í…Œì´ë¸” 오른쪽" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "스í¬ë¦°ìƒ· ì°ê¸°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "타루콩가 (봉고스)" @@ -5196,11 +5201,11 @@ msgstr "í…스처 ìºì‰¬" msgid "Texture Format Overlay" msgstr "í…스처 í¬ë©§ 오버레ì´" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WADê°€ 성공ì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "ê·¸ 주소는 비ì í•© 입니다" @@ -5208,13 +5213,13 @@ msgstr "ê·¸ 주소는 비ì í•© 입니다" msgid "The checksum was successfully fixed" msgstr "ì²´í¬ì„¬ì´ 성공ì ìœ¼ë¡œ ê³ ì³ì¡ŒìŠµë‹ˆë‹¤" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "ì„ íƒëœ 디렉토리는 ì´ë¯¸ ë¦¬ìŠ¤íŠ¸ì— ìžˆë‹¤" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5237,7 +5242,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "%s 파ì¼ì´ ì´ë¯¸ ì—´ë ¤ 있었습니다, íŒŒì¼ í—¤ë”는 기ë¡ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "ë‹¹ì‹ ì´ ê¸°ìˆ í•œ íŒŒì¼ (%s)는 존재하지 않습니다" @@ -5269,7 +5274,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "ë‹¹ì‹ ì´ ë³µì‚¬í•˜ë ¤ëŠ” ì €ìž¥ì€ ë¹„ì í•© íŒŒì¼ í¬ê¸°ìž…니다." -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5277,36 +5282,36 @@ msgstr "" "ì„ íƒëœ 언어는 ë‹¹ì‹ ì˜ ì‹œìŠ¤í…œì—ì„œ 지ì›ë˜ì§€ 않습니다. 시스템 ë””í´íŠ¸ë¡œ ëŒì•„갑니" "다." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "서버와 í´ë¼ì´ì–¸íŠ¸ì˜ ë„·í”Œë ˆì´ ë²„ì „ë“¤ì´ í˜¸í™˜ë˜ì§€ 않는다!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "서버가 ê°€ë“ì°¸!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "서버가 ì‘답했습니다: ê·¸ ê²Œìž„ì€ í˜„ìž¬ 구ë™ì¤‘ì´ë‹¤!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "서버가 알려지지 ì•Šì€ ì—러 메시지를 보냈ìŒ!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "ê¸°ìˆ ëœ \"%s\" 파ì¼ì€ 존재하지 않는다" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "ê°’ì´ ë¹„ì í•© 합니다" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "테마:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5314,7 +5319,7 @@ msgstr "" "00000001/00000002ì— ëŒ€í•œ í‹°ì¼“ì´ ìžˆì–´ì•¼í•œë‹¤. ë‹¹ì‹ ì˜ NAND ë¤í”„는 ì•„ë§ˆë„ ë¯¸ì™„ì„±" "ì´ë‹¤." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5322,7 +5327,7 @@ msgstr "" "ì´ ì„¤ì •ë“¤ì€ í•µì‹¬ ëŒí•€ ì„¤ì •ë“¤ì„ ë®ì–´ì”니다.\n" "ê²°ì •ë˜ì§€ì•Šì€ ê²ƒì€ ê²Œìž„ì´ ëŒí•€ì˜ ì„¤ì •ì„ ì‚¬ìš©í•¨ì„ ëœ»í•©ë‹ˆë‹¤." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5330,7 +5335,7 @@ msgstr "" "ì´ ì•¡ì…˜ ë¦¬í”Œë ˆì´ ì‹œë®¬ë ˆì´í„°ëŠ” ì•¡ì…˜ ë¦¬í”Œë ˆì´ ìŠ¤ìŠ¤ë¡œ 수정한 코드를 지ì›í•˜ì§€ ì•Š" "는다." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "ì´ê²ƒì€ Wii 메뉴와 ì¼ë¶€ 게임들ì—ì„œ ëŠë ¤ì§ì„ 유발할 수 있다." @@ -5354,19 +5359,18 @@ msgstr "" "\\n\n" "모르겠으면. ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"í”„ë ˆìž„ì œí•œì„ ê²Œìž„ í’€ 스피드 (NTSC:60, PAL:50)보다 ë” ë†’ê²Œ 설정하려면, DSP를 " -"ì´ìš©í•´ 오디오 ë³‘ëª©ì„ ì‚¬ìš©í•˜ì„¸ìš” (ê²Œìž„ì— ë”°ë¼ì„œëŠ” 소리 ëŠê¹€ë“¤ì„ 고칠지 모르지" -"만 ë˜í•œ 지ì†ì ì¸ ìž¡ìŒì„ 유발할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤)." +"ì´ê²ƒì€ 게임 스피드를 ëª…ì‹œëœ ì´ˆë‹¹ 프레임 수치로 제한합니다 (í’€ 스피드는 NTSC " +"60 PAL 50 입니다). 대안으로, DSP (오디오 í´ë¦­ë“¤ì„ 고치나 ë˜í•œ ê²Œìž„ì— ë”°ë¼ì„œ" +"는 지ì†ì ì¸ ë…¸ì´ì¦ˆë¥¼ 유발할 수 있는)를 ì´ìš©í•˜ëŠ” 오디오 ë³‘ëª©ì„ ì‚¬ìš©í•©ë‹ˆë‹¤." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5378,7 +5382,7 @@ msgstr "" "ë‘ê°œ ì´ìƒì˜ 코어를 가진 PC들 ìƒì—ì„œ 주요 ì†ë„ í–¥ìƒë“¤ì„ 유발한다, 하지만 ê°‘ìž‘" "스런 깨ì§/ê²°í•¨ë“¤ì„ ì¼ìœ¼í‚¬ ìˆ˜ë„ ìžˆë‹¤." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "ì´ê²ƒì€ 수ë™ìœ¼ë¡œ INI 환경파ì¼ì„ 수정하게 해줄ê²ë‹ˆë‹¤" @@ -5387,12 +5391,12 @@ msgstr "ì´ê²ƒì€ 수ë™ìœ¼ë¡œ INI 환경파ì¼ì„ 수정하게 해줄ê²ë‹ˆë‹¤" msgid "Threshold" msgstr "한계ì " -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "기울기" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr " 제목" @@ -5406,39 +5410,37 @@ msgid "Toggle All Log Types" msgstr "모든 로그 타입 토글" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "종횡비:" +msgstr "화면 비율 토글" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB 복사" +msgstr "EFB 복사 토글" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "모든 로그 타입 토글" +msgstr "안개 토글" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "전체화면 토글" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "IR 토글" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "위" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "전통 중국어" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "알려지지 ì•Šì€ íŒŒì¼ íƒ€ìž…ì„ ë¡œë“œì‹œë„했다." @@ -5458,7 +5460,7 @@ msgstr "" "효한 SYSCONFì—ì„œ ì½ê¸° ì‹œë„\n" "위모트 bt idë“¤ì€ ìœ ìš©í•˜ì§€ 않습니다" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "터키어" @@ -5474,12 +5476,12 @@ msgstr "타입" msgid "UDP Port:" msgstr "UDP í¬íŠ¸:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP 위모트" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "알려지지 ì•ŠìŒ" @@ -5488,7 +5490,7 @@ msgstr "알려지지 ì•ŠìŒ" msgid "UNKNOWN_%02X" msgstr "알려지지않ì€_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "미국" @@ -5501,9 +5503,9 @@ msgstr "" "í•­ëª©ì´ ìˆ˜ì •ë˜ì§€ 않았습니다." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5511,7 +5513,7 @@ msgstr "" "니다. 올바로 타ì´í•‘했는지 확ì¸í•˜ì„¸ìš”\n" "ì´ ë¼ì¸ì„ 무시하고 분ì„ì„ ê³„ì†í•˜ê² ìŠµë‹ˆê¹Œ?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "ì •ì˜ë˜ì§€ ì•Šì€ %i" @@ -5521,19 +5523,18 @@ msgid "Undo Load State" msgstr "ìƒíƒœ 로드 ë˜ëŒë¦¼" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "ìƒíƒœ 로드 ë˜ëŒë¦¼" +msgstr "ìƒíƒœ 저장 풀기" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "예ìƒí•˜ì§€ 못한 0x80 콜? 중단시킴..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "알려지지 ì•Šì€" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "알려지지 ì•Šì€ DVD 명령 %08x - ì¹˜ëª…ì  ì—러" @@ -5548,12 +5549,12 @@ msgstr "알려지지 ì•Šì€ ëª…ë ¹ 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "알려지지 ì•Šì€ ì—”íŠ¸ë¦¬ 타입 %i SYSCONF (%s@%x)안ì—!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "id : %dì˜ ì•Œë ¤ì§€ì§€ ì•Šì€ ë©”ì‹œì§€ë¥¼ 받었다" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5564,16 +5565,16 @@ msgstr "" msgid "Up" msgstr "위" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "ì—…ë°ì´íŠ¸" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "ì—…ë¼ì´íŠ¸ 위모트" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "EuRGB60 모드 (PAL60) 사용" @@ -5581,7 +5582,7 @@ msgstr "EuRGB60 모드 (PAL60) 사용" msgid "Use Fullscreen" msgstr "전체화면 사용" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "16진수 사용" @@ -5596,6 +5597,10 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"ê¹Šì´ ê°’ë“¤ì„ ê³„ì‚°í•˜ê¸° 위해 ëœ ì í™•í•œ ì•Œê³ ë¦¬ì¦˜ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n" +"소수 게임들ì—ì„œ ì´ìŠˆë“¤ì„ 유발하지만 ê´œì°®ì€ ì†ë„ì¦ê°€ë¥¼ 줄것입니다.\n" +"\n" +"모르겠으면, ì´ê²ƒì„ ì²´í¬ë¡œ ë‘세요." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5609,6 +5614,15 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5631,12 +5645,11 @@ msgstr "유틸리티" msgid "V-Sync" msgstr "수ì§-ë™ê¸°í™”" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU 스피드 핵" +msgstr "VBeam 스피드 핵" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "ê°’" @@ -5644,7 +5657,7 @@ msgstr "ê°’" msgid "Value:" msgstr "ê°’:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "ê°’:" @@ -5654,9 +5667,9 @@ msgstr "ìƒì„¸ì„¤ëª…" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "버í…스 ìŠ¤íŠ¸ë¦¬ë° í•µ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "비디오" @@ -5664,17 +5677,17 @@ msgstr "비디오" msgid "Virtual" msgstr "ê°€ìƒ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "볼륨" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD 설치 실패했습니다: ì—러 ìƒì„± %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD 설치 실패했습니다: ì—러 ìƒì„± 티켓" @@ -5696,19 +5709,19 @@ msgstr "" msgid "Warning" msgstr "경고" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "경고 - ìž˜ëª»ëœ ì½˜ì†” 모드ì—ì„œ DOLì„ ì‹œìž‘!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "경고 - ìž˜ëª»ëœ ì½˜ì†” 모드ì—ì„œ ELF 시작!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "경고 - ìž˜ëª»ëœ ì½˜ì†” 모드ì—ì„œ ISO 시작!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5732,7 +5745,7 @@ msgstr "" "그리고 ë‹¹ì‹ ì˜ ë©”ëª¨ë¦¬ì¹´ë“œì— íŒŒì¼ë¡œ ê°™ì€ ì´ë¦„ì„ ê°€ì§‘ë‹ˆë‹¤\n" "계ì†í•©ë‹ˆê¹Œ?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5743,7 +5756,7 @@ msgstr "" "%u > %u). You should load another save before continuing, or load this state " "with read-only mode off." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5754,7 +5767,7 @@ msgstr "" "ì „ì— ë‹¤ë¥¸ 세ì´ë¸Œë¥¼ 로드해야합니다, í˜¹ì€ ì½ê¸°-ì „ìš© 모드를 ë„ê³  로드하세요. ê·¸" "렇지 않으면 ì•„ë§ˆë„ ì‹±í¬ ì–´ê¸‹ë‚¨ì´ ìƒê¸¸ê²ë‹ˆë‹¤." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5808,19 +5821,15 @@ msgstr "너비" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii 콘솔" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND 루트:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wii 저장 가져오기" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii 저장 파ì¼ë“¤ (*.bin)|*.bin" @@ -5829,16 +5838,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: 파ì¼ë¡œ 부터 ì½ì„ 수 없었습니다" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "위모트" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "위모트" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "위모트 %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "위모트가 ì—°ê²°ë¨" @@ -5846,7 +5861,7 @@ msgstr "위모트가 ì—°ê²°ë¨" msgid "Wiimote Motor" msgstr "위모트 모터" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "위모트 설정" @@ -5870,16 +5885,16 @@ msgstr "윈ë„우즈 오른쪽" msgid "Word Wrap" msgstr "ìžë™ 줄바꿈" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "ìž‘ë™ì¤‘..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "메모리카드를 기ë¡í•©ë‹ˆë‹¤ (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5897,21 +5912,36 @@ msgstr "파ì¼ì— 쓰기" msgid "Write to Window" msgstr "윈ë„ìš°ì— ì“°ê¸°" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice 실패: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 초기화 실패: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 매스터 ë³´ì´ìŠ¤ ìƒì„± 실패: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice 실패: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 초기화 실패: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 매스터 ë³´ì´ìŠ¤ ìƒì„± 실패: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF 레지" @@ -5946,11 +5976,11 @@ msgstr "ë‹¹ì‹ ì€ íŽ˜ì´ì§€ë“¤ì„ 가진 ì°½ì„ ë‹«ì„ ìˆ˜ 없습니다." msgid "You must choose a game!!" msgstr "ê²Œìž„ì„ ì„ íƒí•´ì•¼ 합니다!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "ì´ë¦„ì„ ë„£ì–´ì•¼ 합니다!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "ì í•©í•œ 10진수나 16진수나 8진수 ê°’ì„ ë„£ì–´ì•¼ 합니다." @@ -5958,7 +5988,7 @@ msgstr "ì í•©í•œ 10진수나 16진수나 8진수 ê°’ì„ ë„£ì–´ì•¼ 합니다." msgid "You must enter a valid profile name." msgstr "ì í•©í•œ í”„ë¡œíŒŒì¼ ì´ë¦„ì„ ë„£ì–´ì•¼ 합니다." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "ë³€ê²½ì´ ì ìš©ë˜ë ¤ë©´ ëŒí•€ì„ 재시작 해야 합니다." @@ -5972,7 +6002,7 @@ msgstr "" "문제를 고치기위해 지금 중단하시겠습니까?\n" "\"아니오\"를 ì„ íƒí•˜ë©´, 오디오가 ì™œê³¡ë  ì§€ë„ ëª¨ë¦…ë‹ˆë‹¤." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5991,15 +6021,15 @@ msgstr "" "0x%04x ì´ì–´ì•¼í•©ë‹ˆë‹¤ (하지만 0x%04llx ìž„) \n" "새로 ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP 핵" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 코드는 지ì›ë˜ì§€ 않습니다" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "ëŒí•€ì— 알려지지 ì•Šì€ Zero 코드: %08x" @@ -6057,20 +6087,24 @@ msgstr "" "\n" "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "ì•±ë¡œë” (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: %x ì—ì„œ 옵코드 ì½ê¸°. 보고해주세요." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "들" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "애플리케ì´ì…˜ 구ë™ìƒì—ì„œ wxExecuteê°€ -1ì„ ë°˜í™˜í–ˆìŠµë‹ˆë‹¤!" @@ -6086,74 +6120,41 @@ msgstr "z근거리 ì •ì •:" msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "정확한 VBeam ì—뮬레ì´ì…˜" +#~ msgid "Could not create %s" +#~ msgstr "%s 를 ìƒì„±í•  수 없었습니다" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "ì—뮬레ì´ì…˜ 창안ì—ì„œ 3(내부 í•´ìƒë„), 4(종횡비), 5(EFB 복사), 6(안개) 핫키들" -#~ "ì„ í†µí•´ 특정 옵션들 í† ê¸€ì„ í—ˆìš©í•©ë‹ˆë‹¤.\\n\n" -#~ "\\n\n" -#~ "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "bd: %02x:%02x:%02x:%02x:%02x:%02x ì— ì˜í•´ 위모트를 ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#~ msgid "Enable Hotkeys" -#~ msgstr "단축키 활성(그래픽 컨트롤)" - -#~ msgid "Failed to Listen!!" -#~ msgstr "ë“£ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "bthprops.cpl ë¡œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." - -#~ msgid "Failed to load hid.dll" -#~ msgstr "hid.dll ë¡œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic 환경설정" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRYê°€ 호출ë¨, 보고해주세요!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "핵 ë²„í¼ ì—…ë¡œë“œ" +#~ "내부ì ìœ¼ë¡œ 사용할 그래픽 API를 ì„ íƒí•©ë‹ˆë‹¤.\n" +#~ "Direct3D 9ì€ ë³´í†µ 가장 빠릅니다. OpenGLì´ ë” ì •í™•í•˜ê¸´í•©ë‹ˆë‹¤. Direct3D 11" +#~ "ì€ ë‘˜ 사ì´ì¯¤ 입니다.\n" +#~ "Direct3D ë°±ì—”ë“œë“¤ì€ ìœˆë„우즈들ì—서만 ì´ìš©í•  수 있다는 ê²ƒì„ ì•Œì•„ë‘세요.\n" +#~ "\n" +#~ "모르겠으면, Direct3D 11ì„ ì‚¬ìš©í•˜ì„¸ìš”." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "FPSê°€ 불규칙ì ì´ë©´, ì´ ì˜µì…˜ì´ ë„ì›€ì´ ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. (켬 = 호환성, ë” = " -#~ "빠름)" - -#~ msgid "Last Overwritten State" -#~ msgstr "마지막 ë®ì–´ì¨ì§„ ìƒíƒœ" - -#~ msgid "Last Saved State" -#~ msgstr "마지막 ì €ìž¥ëœ ìƒíƒœ" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "ìƒíƒœ 로딩시 위모트 재연결" - -#~ msgid "Set" -#~ msgstr "설정" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "목ì ì§€. 알파 패스 스킵" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "버í…ìŠ¤ë“¤ì„ ìŠ¤íŠ¸ë¦¼í•˜ê¸° 위해 핵 업로드를 사용합니다.\n" -#~ "ì´ê²ƒì€ 보통 스피드가 올ë¼ê°‘니다, 하지만 OpenGL ì‚¬ì–‘ì— ì˜í•´ 금지ë˜ê³  ì—„ì²­" -#~ "ë‚œ ê²°í•¨ë“¤ì„ ìœ ë°œí• ì§€ë„ ëª¨ë¦…ë‹ˆë‹¤.\n" +#~ "내부ì ìœ¼ë¡œ ì–´ë–¤ 그래픽 API를 사용할지 ì„ íƒí•©ë‹ˆë‹¤.\n" +#~ "Direct3D 9ì€ ë³´í†µ 가장 빠릅니다. OpenGLì€ ë” ì •í™•í•˜ê¸´ 합니다. Dirct3D 11" +#~ "ì€ ë‘˜ ì‚¬ì´ ì–´ë”˜ê°€ìž…ë‹ˆë‹¤.\n" +#~ "Direct3D ë°±ì—”ë“œë“¤ì€ ìœˆë„우즈들ì—서만 ì´ìš©í•  수 있다는 ê²ƒì„ ì•Œì•„ë‘세요.\n" #~ "\n" -#~ "모르겠으면, ì´ê²ƒì„ 언체í¬ë¡œ ë‘세요." +#~ "모르겠으면, Direct3D 9ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: %x ì—ì„œ 옵코드 ì½ê¸°. 보고해주세요." diff --git a/Languages/po/nb.po b/Languages/po/nb.po index b61a31e9ff..409a55a721 100644 --- a/Languages/po/nb.po +++ b/Languages/po/nb.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the dolphin-emu package. # # Translators: +# chriztr , 2013 # KHRZ , 2013 -# Knut , 2011 +# KHRZ , 2011,2013 +# KHRZ , 2011 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-18 22:56-0500\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-17 20:01+0000\n" "Last-Translator: KHRZ \n" "Language-Team: Norwegian BokmÃ¥l (http://www.transifex.com/projects/p/dolphin-" "emu/language/nb/)\n" @@ -20,13 +22,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" -msgstr "(for mange til til Ã¥ vises)" +msgstr "(for mange Ã¥ vise)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Spill :" @@ -34,7 +36,7 @@ msgstr "Spill :" msgid "! NOT" msgstr "! IKKE" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +45,7 @@ msgstr "" "\"%s\" eksisterer ikke.\n" " Lag et nytt 16MB Minnekort?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" er en ugyldig GCM/ISO-fil, eller ikke en GC/Wii ISO." @@ -58,28 +60,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopier%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d samples" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d samples (kvalitetsnivÃ¥ %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s eksisterer allerede. Overskriv?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s mislykket i Ã¥ skrubbe. Sannsynligvis er bildefilen korrupt." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -88,7 +90,7 @@ msgstr "" "%s mislyktes i Ã¥ laste som et minnekort \n" " Minnekortstørrelse er ugyldig (0x%x byte)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -97,7 +99,7 @@ msgstr "" "%s mislyktes i Ã¥ laste som et minnekort \n" " Minnekortstørrelse ugyldig (0x%x byte)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -106,22 +108,27 @@ msgstr "" "%s mislyktes i Ã¥ laste som et minnekort \n" " Minnekortstørrelse er for liten til Ã¥ være et gyldig minnekort (0x%x byte)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s kunne ikke Ã¥pne" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s mislyktes: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s er en 0-byte fil" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s er allerede komprimert! Kan ikke komprimere videre." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s er for langt for et filnavn, maks antall tegn er 45" @@ -150,7 +157,7 @@ msgstr "%u Ledige Blokker; %u Ledige Dir Entries" msgid "&& AND" msgstr "&& OG" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Om..." @@ -158,15 +165,15 @@ msgstr "&Om..." msgid "&Boot from DVD Drive..." msgstr "&Start fra DVD-stasjon..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" -msgstr "&Breakpoints" +msgstr "&Brytepunkter" #: Source/Core/DolphinWX/Src/FrameTools.cpp:111 msgid "&Browse for ISOs..." -msgstr "&Bla etter ISO-filer..." +msgstr "&Søk etter ISO-filer..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Jukse&kode-manager" @@ -174,13 +181,13 @@ msgstr "Jukse&kode-manager" msgid "&DSP Settings" msgstr "Innstillinger for &DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Slett ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." -msgstr "&Slett valgte ISO-filer..." +msgstr "&Slett merkede ISO-filer..." #: Source/Core/DolphinWX/Src/FrameTools.cpp:172 msgid "&Emulation" @@ -190,43 +197,43 @@ msgstr "&Emulasjon" msgid "&File" msgstr "&Fil" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" -msgstr "&Bilde Forover" +msgstr "&Bilde for bilde" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Fullskjerm" #: Source/Core/DolphinWX/Src/FrameTools.cpp:178 msgid "&Graphics Settings" -msgstr "&Konfigurer Grafikk" +msgstr "&Grafikkinstllinger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Hjelp" #: Source/Core/DolphinWX/Src/FrameTools.cpp:182 msgid "&Hotkey Settings" -msgstr "Innstillinger for &Hot-tast" +msgstr "Innstillinger for &hurtigtaster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" #: Source/Core/DolphinWX/Src/FrameTools.cpp:149 msgid "&Load State" -msgstr "Last &inn Save State" +msgstr "Ã…pne hurtiglagring" #: Source/Core/DolphinWX/Src/FrameTools.cpp:192 msgid "&Memcard Manager (GC)" msgstr "&Minnekort Manager (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Minne" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Ã…pne..." @@ -234,59 +241,59 @@ msgstr "&Ã…pne..." msgid "&Options" msgstr "&Innstillinger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pause" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Spill" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Egenskaper" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" -msgstr "Les-kun &modus" +msgstr "Skrivebeskyttet-&modus" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Oppdater liste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registre" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Restart" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Lyd" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "S&topp" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Verktøy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "Vi&s" #: Source/Core/DolphinWX/Src/FrameTools.cpp:181 msgid "&Wiimote Settings" -msgstr "Innstillinger for &Wiimote" +msgstr "Innstillinger for &Wiikontroller" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -311,9 +318,8 @@ msgid "(off)" msgstr "(av)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ LEGG TIL" +msgstr "+ LEGG TIL" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -321,25 +327,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "1.5x Innfødt (960x792)" +msgstr "1.5x Opprinnelig størrelse (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16-bit" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "1x Innfødt (640x528)" +msgstr "1x Opprinnelig størrelse (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "2.5x Innfødt (1600x1320)" +msgstr "2.5x Opprinnelig størrelse (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "2x Innfødt (1280x1056)" +msgstr "2x Opprinnelig størrelse (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32-bit" @@ -349,13 +355,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "3x Innfødt (1920x1584)" +msgstr "3x Opprinnelig størrelse (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "4x Innfødt (2560x2112)" +msgstr "4x Opprinnelig størrelse (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8-bit" @@ -367,15 +373,15 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:150 msgid "" -msgstr "" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -384,12 +390,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Et NetPlay-vindu er allerede oppe!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Det kjøres ingen spill nÃ¥." @@ -411,39 +417,48 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ADVARSEL:\n" "\n" -"NetPlay vil kun fungere ordentlig under følgende innstillinger:\n" -" - Dobbelkjerne [AV]\n" -" - Audio Throttle [AV]\n" -" - DSP-HLE med \"Null Audio\" eller DSP-LLE\n" -" - Antall brukte kontrollere som brukes mÃ¥ manuelt settes til [Standard " -"Controller]\n" "\n" -"Alle spillere bør bruke samme versjon av Dolphin og de samme " -"innstillingene.\n" -"Enten skru av bruk av minnekort, eller send nøyaktig kopi til alle " -"spillere.\n" -"Det er foreløpig ingen støtte for Wiimote-er.\n" "\n" -"Du mÃ¥ fremme TCP-porten til verten!!" +"Netplay vil kun fungere under følgende innstillinger:\n" +"\n" +"- Tillat Dobbelkjerne [AV]\n" +"\n" +"- DSP emulator motor mÃ¥ være det samme pÃ¥ alle datamaskiner!\n" +"\n" +"- DSP pÃ¥ Dedikert CPU-trÃ¥d [AV]\n" +"\n" +"- Bilde-pr-sekund-begrensning: IKKE satt til [Audio]\n" +"\n" +"\n" +"\n" +"Alle spillere bør bruke den samme Dolphin-versjonen og innstillinger.\n" +"\n" +"Alle minnekort mÃ¥ være identiske mellom spillerne, eller deaktivert.\n" +"\n" +"Wiimote-støtte har enda ikke blitt implementert!\n" +"\n" +"\n" +"\n" +"Hosten mÃ¥ ha valgt TCP-port Ã¥pen/forwarded!\n" +"\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "" @@ -492,7 +507,7 @@ msgstr "" "Skyldig-kode:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -500,7 +515,7 @@ msgstr "" "Action Replay Feil: Ugyldig størrelse (%08x : addresse = %08x) i Legg Til " "Kode (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -509,7 +524,7 @@ msgstr "" "Action Replay Feil: Ugyldig størrelse (%08x : addresse = %08x) in Fyll Og " "Skli (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -518,7 +533,7 @@ msgstr "" "Action Replay Feil: Ugyldig størrelse (%08x : addresse = %08x) i Ram-skriv " "Og Fyll (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -527,12 +542,12 @@ msgstr "" "Action Replay Feil: Ugyldig størrelse (%08x : addresse = %08x) i Skriv Til " "Peker (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay Feil: Ugyldig verdi (%08x) i Minnekopi (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -542,27 +557,27 @@ msgstr "" "(%s)\n" " Master koder behøves ikke. Ikke bruk master koder." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay Feil: Ugyldig AR-kode linje: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Kondisjonsbasert Kode: Ugyldig Størrelse %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Ugyldig Normal Kodetype %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Kode %i: ugyldig Sub-type %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Kode 0: Ugyldig Sub-type %08x (%s)" @@ -576,11 +591,11 @@ msgstr "Adapter:" msgid "Add" msgstr "Legg Til" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Legg til Action Replay Kode" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Legg til Patch" @@ -588,9 +603,9 @@ msgstr "Legg til Patch" msgid "Add new pane" msgstr "Legg til ny rute" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Legg til..." @@ -644,34 +659,34 @@ msgstr "Avansert" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:568 msgid "Advanced Settings" -msgstr "Avanserte Innstillinger" +msgstr "Avanserte innstillinger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Alle GameCube/Wii filer (elf, dol, gcm, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Alle GameCube/Wii avbildningsfiler/rip (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Alle GameCube GCM-filer (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" -msgstr "Alle Save States (sav, s##)" +msgstr "Alle hurtiglagringene (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Alle Wii ISO-filer (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Alle komprimerte GC/Wii-filer (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Alle filer (*.*)|*.*" @@ -685,27 +700,27 @@ msgstr "Vinkel" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:376 msgid "Anisotropic Filtering:" -msgstr "Anisotropisk Filtrering:" +msgstr "Anisotropisk filtrering:" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:359 msgid "Anti-Aliasing:" msgstr "Kantutjevning:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" "Applikasjonslasteren er i feil størrelse... er dette virkelig en " "applikasjonslaster?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Applikasjonlaster klarte ikke Ã¥ laste fra fil" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Applikasjonslaster:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Bruk" @@ -719,7 +734,7 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabisk" @@ -728,7 +743,7 @@ msgstr "Arabisk" msgid "Are you sure you want to delete \"%s\"?" msgstr "Er du sikker pÃ¥ at du vil slette \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -736,17 +751,22 @@ msgstr "" "Er du sikker pÃ¥ at du vil slette disse filene?\n" "De vil bli borte for alltid!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Er du sikker pÃ¥ at du vil slette denne filen?\n" "Den vil bli borte for alltid!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (eksperimentell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (eksperimentell)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Aspektforhold:" @@ -755,12 +775,12 @@ msgstr "Aspektforhold:" msgid "At least one pane must remain open." msgstr "Minst en rute mÃ¥ stÃ¥ Ã¥pen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Audio Backend:" @@ -768,7 +788,7 @@ msgstr "Audio Backend:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Feil ved Ã¥pning av AO-device.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automatisk" @@ -793,7 +813,7 @@ msgid "" msgstr "" "Justerer automatisk vindusstørrelsen til din interne oppløsning.\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis usikker, la stÃ¥ deaktivert." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:705 msgid "B" @@ -807,16 +827,16 @@ msgstr "BP-register" msgid "Back" msgstr "Tilbake" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Backend-innstillinger" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Bakgrunnsinndata" @@ -825,24 +845,24 @@ msgstr "Bakgrunnsinndata" msgid "Backward" msgstr "Bakover" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "DÃ¥rlig Fil-header" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balansebrett" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Bannerdetaljer" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -862,7 +882,7 @@ msgstr "Grunnleggende Innstillinger" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Blokkallokasjontabellsjekksum feilet" @@ -883,7 +903,7 @@ msgid "Blue Right" msgstr "BlÃ¥ Høyre" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Bunn" @@ -892,27 +912,27 @@ msgstr "Bunn" msgid "Bound Controls: %lu" msgstr "Bundede Kontroller: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Ødelagt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" -msgstr "Bla i" +msgstr "Bla etter" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Bla etter en mappe Ã¥ legge til" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Bla etter en ISO-mappe..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Bla etter lagringssted" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -922,7 +942,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Knapper" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -968,33 +988,33 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Kan ikke finne WiiMote fra koblingshandler %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Kan ikke lese fra DVD_Plugin - DVD-Interface: Fatal Feil" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Avbryt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Kan ikke Ã¥pne %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Kan ikke avregistrere events med events under behandling" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1005,7 +1025,7 @@ msgstr "" " %s\n" " er ikke en gyldig GameCube-minnekortfil." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1017,7 +1037,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Katalansk" @@ -1025,11 +1045,11 @@ msgstr "Katalansk" msgid "Center" msgstr "Senter" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Endre" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Endre &Disk..." @@ -1037,11 +1057,11 @@ msgstr "Endre &Disk..." msgid "Change Disc" msgstr "Endre Disk" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Endre Spill" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1057,11 +1077,11 @@ msgstr "Endringer signeres til zFar-parameteren (etter korreksjon)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Endringer signeres til zNear-parameteren (etter korreksjon)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Ã… endre dette vil ikke ha noen effekt mens emulatoren kjører!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1069,47 +1089,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Juksekode" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Juksekodesøk" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Juksekode Manager" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Sjekk partisjonsintegritet" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Sjekker integritet..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Kinesisk (Simplifisert)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Kinesisk (Tradisjonell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Velg en DVD-rotmappe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Velg en NAND-rotmappe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Velg en standard-ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Velg en mappe Ã¥ legge til" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Velg en fil Ã¥ Ã¥pne" @@ -1117,7 +1137,7 @@ msgstr "Velg en fil Ã¥ Ã¥pne" msgid "Choose a memory card:" msgstr "Velg et minnekort:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1125,8 +1145,8 @@ msgstr "" "Velg fil til Ã¥ bruke som applikasjonslaster: (gjelder kun for disker laget " "fra mapper)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Velg mappen Ã¥ ekstrahere til" @@ -1145,7 +1165,7 @@ msgstr "Klassisk" msgid "Clear" msgstr "Tøm" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1155,7 +1175,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Lukk" @@ -1164,11 +1184,11 @@ msgstr "Lukk" msgid "Co&nfigure..." msgstr "Ko&nfigurer..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Kodeinfo" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kode:" @@ -1180,24 +1200,24 @@ msgstr "Kommando" msgid "Comment" msgstr "Kommentar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Kommentar:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Komprimer ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Komprimer valgte ISO-er..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Komprimerer ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Konfig" @@ -1211,18 +1231,18 @@ msgstr "Konfigurer" msgid "Configure Control" msgstr "Konfigurer Kontroller" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Konfigurer Kontrollere" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Konfigurer..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Bekreft filoverskriving" @@ -1235,38 +1255,37 @@ msgstr "Bekreft ved Stans" msgid "Connect" msgstr "Koble til" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Koble til USB-tastatur" +msgstr "Koble til balansebrett" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Koble til USB-tastatur" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" -msgstr "Koble til Wiimote %i" +msgstr "Koble til Wiikontroller %i" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:184 msgid "Connect Wiimote 1" -msgstr "Koble til Wiimote 1" +msgstr "Koble til Wiikontroller 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:185 msgid "Connect Wiimote 2" -msgstr "Koble til Wiimote 2" +msgstr "Koble til Wiikontroller 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:186 msgid "Connect Wiimote 3" -msgstr "Koble til Wiimote 3" +msgstr "Koble til Wiikontroller 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:187 msgid "Connect Wiimote 4" -msgstr "Koble til Wiimote 4" +msgstr "Koble til Wiikontroller 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Kobler til..." @@ -1286,30 +1305,25 @@ msgstr "Kontroll" msgid "Convert to GCI" msgstr "Konverter til GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopi feilet" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:789 #, c-format msgid "Copy to Memcard %c" -msgstr "Kopier til Minnekort %c" +msgstr "Kopier til minnekort %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Kjerne" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Kunne ikke lage %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Kunne ikke initialisere backend %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1320,25 +1334,16 @@ msgstr "" "ikke en GC/Wii-backup. Vennligst merk at originale GameCube og Wii-disker " "ikke kan leses av de fleste PC-DVD-diskstasjoner." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Kunne ikke gjennkjenne ISO-fil %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Kunne ikke lagre %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Kunne ikke stille inn kontroller. Spilleren har forlatt spillet, eller " -"spillet kjører ikke!\n" -"(Ã… stille inn kontrollere mens spillet kjøret er foreløpig ikke støttet)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1365,11 +1370,11 @@ msgstr "" "I sÃ¥ tilfelle, mÃ¥ du kanskje re-spesifisere minnekortslokasjonen i " "innstillingene." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Kunne ikke finne Ã¥pningskommandoen for utvidelsen 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1377,17 +1382,17 @@ msgstr "" "Kunne ikke initialisere kjernen.\n" "Sjekk kofigurasjonen din." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Antall:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Land:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Lag AR-kode" @@ -1422,24 +1427,24 @@ msgstr "" msgid "Crossfade" msgstr "Kryssutfase" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "NÃ¥værende mappe endret fra %s til %s etter wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" -msgstr "Selvdefinert Projeksjons-hack" +msgstr "Selvdefinert projeksjons-hack" #: Source/Core/DolphinWX/Src/PHackSettings.h:17 msgid "Custom Projection Hack Settings" -msgstr "Innstillinger for Selvdefinerte Projeksjons-hack" +msgstr "Innstillinger for selvdefinerte projeksjons-hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." -msgstr "Selvdefiner noen Ortografisk Projeksjons-parametere." +msgstr "Selvdefiner noen ortografisk projeksjons-parametere." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tsjekkisk" @@ -1451,36 +1456,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "CPU Emulatormotor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE-emulering (raskt)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE interpreter (tregt)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE re-kompilering" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP pÃ¥ Dedikert TrÃ¥d" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Innstillinger for DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE pÃ¥ Separat TrÃ¥d" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD-rot:" @@ -1492,15 +1497,15 @@ msgstr "DVDLowRead - Fatal Feil: Mislyktes i Ã¥ lese fra volum" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Fatal Feil: Mislyktes i Ã¥ lese fra volum" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Dansematte" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Datastørrelse" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Dato:" @@ -1529,29 +1534,28 @@ msgstr "Debugging" msgid "Decimal" msgstr "Desimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Dekomprimer ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Dekomprimer valgte ISO-filer..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Dekomprimerer ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Oppdater spilliste" +msgstr "Reduser bilder i sekundet begrensning" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Standard" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Standard-ISO:" @@ -1566,7 +1570,7 @@ msgstr "Slett" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:790 msgid "Delete Save" -msgstr "Slett Lagringsfil" +msgstr "Slett lagringsfil" #: Source/Core/VideoCommon/Src/AVIDump.cpp:64 #, c-format @@ -1595,24 +1599,21 @@ msgstr "" msgid "Device" msgstr "Device" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" -msgstr "Innstillinger for device" +msgstr "Innstillinger for enhet" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:49 msgid "Dial" msgstr "Ring" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1627,7 +1628,7 @@ msgstr "Deaktiver" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Deaktiver Destinasjon Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1664,19 +1665,18 @@ msgstr "" "Hvis usikker, la stÃ¥ avslÃ¥tt." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Dropper destinasjon alpha pass, brukt i mange spill for diverse grafiske " -"effekter.\n" +"Deaktiverer emulasjonen for maskinvarefunksjonen som kalles \"destinasjon " +"alpha\" som er brukt i mange spill for forskjellige grafiske effekter.\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis du er usikker sÃ¥ la denne være urørt!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disk" @@ -1703,45 +1703,141 @@ msgstr "" msgid "Divide" msgstr "Del" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Vil du stoppe pÃ¥gÃ¥ende emulering?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II-dekoder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"\n" +"Copyright(c) 2003-2013+ Dolphin Team\n" +"\n" +"\n" +"\n" +"Branch: %s\n" +"\n" +"Revisjon: %s\n" +"\n" +"Kompilert: %s @ %s\n" +"\n" +"\n" +"\n" +"Dolphin er en GameCube/Wii emulator, som ble\n" +"\n" +"opprinnelig skrevet av F|RES og ector.\n" +"\n" +"Idag er Dolphin et Ã¥pent-kildekode prosjekt med mange\n" +"\n" +"bidragsytere, for mange til Ã¥ oppramses.\n" +"\n" +"Om interessert, gÃ¥ til prosjektsiden ved\n" +"\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"\n" +"\n" +"Spesiell takk til Bushing, Costis, CrowTRobo,\n" +"\n" +"Marcan, Segjer, Titanik, or9 og Hotquik for deres\n" +"\n" +"reverse engineering og dokumentasjon/demoer.\n" +"\n" +"\n" +"\n" +"Stor takk til Gilles Mouchard hvorav hans Microlib PPC-\n" +"\n" +"emulator ga vÃ¥r utvikling en kjappstart.\n" +"\n" +"\n" +"\n" +"Takk til Frank Wille for hans PowerPC disassembler,\n" +"\n" +"som or9 og vi modifiserte til Ã¥ innkludere Gekko spesifiker.\n" +"\n" +"\n" +"\n" +"Takk til hcs/destop for deres GC ADPCM-dekoder.\n" +"\n" +"\n" +"\n" +"Vi er ikke affiliert med Nintendo pÃ¥ noen mÃ¥te.\n" +"\n" +"GameCube og Wii er varemerker av Nintendo.\n" +"\n" +"Emulatoren er kun for utdanningshensikt,\n" +"\n" +"og mÃ¥ ikke brukes til Ã¥ spille spill du ikke\n" +"\n" +"lovlig eier." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" -msgstr "Dolphin %s Grafikkinstillinger" +msgstr "Dolphin %s Grafikkinnstillinger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" -msgstr "Dolphin &Webside" +msgstr "Dolphins &nettside" #: Source/Core/DolphinWX/Src/ConfigMain.h:24 msgid "Dolphin Configuration" -msgstr "Konfigurer Dolphin" +msgstr "Konfigurer dolphin" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:197 msgid "Dolphin Emulated Wiimote Configuration" -msgstr "Dolphin Emulert Wiimote Konfigurasjon" +msgstr "Dolphin emulert Wiikontroller konfigurasjon" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:382 msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GC-kontroll konfigurasjon" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS-Filmer (*.dtm)" @@ -1749,11 +1845,11 @@ msgstr "Dolphin TAS-Filmer (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote Konfigurasjon" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin pÃ¥ &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1761,7 +1857,7 @@ msgstr "" "Dolphin kunne ikke finne noen GC/Wii ISO-filer. Dobbeltklikk her for Ã¥ bla " "etter filer..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1769,19 +1865,18 @@ msgstr "" "Dolphin er satt til Ã¥ gjemme alle spill. Dobbeltklikk her for Ã¥ vise alle " "spill..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin kunne ikke fullføre den forespurte handligen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Aktiver rask disktilgang. Trengs for noen fÃ¥ spill. (PÃ… = Raskt, AV = " -"Kompitabelt)" +"Dobler den emulerte klokkehastigheten for GPU'en. Dette kan øke hastigheten " +"i noen spill (PÃ… = Kjapp, AV = Kompatiblitet)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1801,11 +1896,11 @@ msgstr "Lastet ned %lu koder. (la til %lu)" msgid "Drums" msgstr "Trommer" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Juksedukke" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Dump Audio" @@ -1851,9 +1946,9 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Nederlansk" @@ -1877,15 +1972,15 @@ msgstr "" "%d. %d -- Hvis du nylig har oppdatert din Dolphin distribusjon, kreves " "sannsynligvis en reboot for at Windows skal detektere defn nye driveren." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:143 msgid "Early Memory Updates" -msgstr "Tidlige Minneoppdateringer" +msgstr "Tidlige minneoppdateringer" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Endre" @@ -1893,20 +1988,20 @@ msgstr "Endre" msgid "Edit ActionReplay Code" msgstr "Endre ActionReplay-kode" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" -msgstr "Endre Konfigurasjon" +msgstr "Endre konfigurasjon" #: Source/Core/DolphinWX/Src/PatchAddEdit.h:17 msgid "Edit Patch" -msgstr "Endre Patch" +msgstr "Endre patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Endre nÃ¥værende perspektiv" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Endre..." @@ -1918,7 +2013,7 @@ msgstr "Effekt" msgid "Embedded Frame Buffer" msgstr "Embedded Frame Buffer (EFB)" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Emulator-CPU-trÃ¥den kjører allerede" @@ -1954,9 +2049,9 @@ msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Emulated Wiimote" -msgstr "Emulert Wiimote" +msgstr "Emulert Wiikontroller" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Emulasjonsstatus:" @@ -1980,15 +2075,15 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Aktiver AR-logging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Aktiver Block Merging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Aktiver Bounding Box-kalkulasjoner" @@ -1998,17 +2093,17 @@ msgstr "Aktiver cache" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:549 msgid "Enable Cheats" -msgstr "Aktiver Juksekoder" +msgstr "Aktiver juksekoder" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" -msgstr "Aktiver Dobbelkjerne" +msgstr "Aktiver bruk av dobbelkjerne" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:547 msgid "Enable Dual Core (speedup)" -msgstr "Aktiver Dobbelkjerne (for bedre ytelse)" +msgstr "Aktiver bruk av dobbelkjerne (for bedre ytelse)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Aktiver Idle Skipping" @@ -2016,29 +2111,29 @@ msgstr "Aktiver Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Aktiver Idle Skipping (for bedre ytelse)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Aktiver MMU" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:564 msgid "Enable Progressive Scan" -msgstr "Aktiver Progressiv Skanning" +msgstr "Aktiver progressiv skanning" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" -msgstr "Aktiver Skjermsparer" +msgstr "Aktiver skjermbeskytter" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "Tillat Høytaler Data" +msgstr "Tillat høytaler data" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" -msgstr "Aktiver Widescreen" +msgstr "Aktiver widescreen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:527 msgid "Enable Wireframe" -msgstr "Aktiver WireFrame" +msgstr "Aktiver wireframe" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:85 msgid "" @@ -2053,7 +2148,7 @@ msgstr "" "\n" "Hvis usikker, velg 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2089,7 +2184,7 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2097,11 +2192,11 @@ msgstr "" "Aktiver dette for Ã¥ bedre ytelsen i The Legend Of Zelda: Twillight Princess. " "Deaktiver for andre spill." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Tillater Selvdefinerte Projeksjons-hack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2109,22 +2204,13 @@ msgstr "" "Aktiver Dolby Pro Logic II-emulering med 5.1 surround. Ikke tilgjengelig pÃ¥ " "OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Aktiver Dolphin Pro Logic II-emulering med 5.1 surround. Kun for OpenAL " "backend." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Aktiver Dolby Pro Logic II-emulering med 5.1 surround. Kun for OpenAL " -"backend. Det kan hende soft_oal.dll mÃ¥ omdøpes til OpenAL32.dll for at det " -"skal fungere." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2138,7 +2224,7 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2160,9 +2246,9 @@ msgstr "" msgid "End" msgstr "Slutt" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Engelsk" @@ -2185,21 +2271,20 @@ msgstr "Entry %d/%d" msgid "Entry 1/%d" msgstr "Entry 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Lik" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Feil" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "Feil ved lasting av valgt sprÃ¥k. Faller tilbake til systemstandarden." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2226,7 +2311,6 @@ msgid "Euphoria" msgstr "Euforia" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Unntakshandler - tilgang under minneomrÃ¥de. %08llx%08llx" @@ -2235,32 +2319,36 @@ msgstr "Unntakshandler - tilgang under minneomrÃ¥de. %08llx%08llx" msgid "Execute" msgstr "Kjør" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Avslutt" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Eksporter alle Wii-lagringsfiler" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Eksportering mislyktes" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" -msgstr "Eksporter Fil" +msgstr "Eksporter fil" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:177 msgid "Export Recording" -msgstr "Eksporter Opptak" +msgstr "Eksporter opptak" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." -msgstr "Eksporter Opptak..." +msgstr "Eksporter opptak..." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:792 msgid "Export Save" -msgstr "Eksporter Lagringsfil" +msgstr "Eksporter lagringsfil" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Eksporter Wii-lagringsfil (Eksperimentiell)" @@ -2268,68 +2356,68 @@ msgstr "Eksporter Wii-lagringsfil (Eksperimentiell)" msgid "Export all saves" msgstr "Eksporter alle lagringsfiler" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Eksportering mislyktes, prøv igjen?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Eksportering mislyktes" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Eksporter lagringsfil som..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Utvidelse" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:484 msgid "External Frame Buffer" -msgstr "Ekstern Bildebuffer (EFB)" +msgstr "Ekstern bildebuffer (EFB)" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:48 msgid "Extra Parameter" -msgstr "Ekstra Parameter" +msgstr "Ekstra parameter" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:49 msgid "Extra Parameter useful in ''Metroid: Other M'' only." -msgstr "Ekstra Parameter nyttig kun i ''Metroid: Other M\"." +msgstr "Ekstra parameter nyttig kun i ''Metroid: Other M\"." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." -msgstr "Ekstraher Alle Filer..." +msgstr "Ekstraher alle filer..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." -msgstr "Ekstraher Applikasjonslaster..." +msgstr "Ekstraher applikasjonslaster..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Ekstraher DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." -msgstr "Ekstraher Mappe..." +msgstr "Ekstraher mappe..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." -msgstr "Ekstraher Fil..." +msgstr "Ekstraher fil..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." -msgstr "Ekstraher Partisjon..." +msgstr "Ekstraher partisjon..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Ekstraherer %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" -msgstr "Ekstraherer Alle Filer" +msgstr "Ekstraherer alle filer" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" -msgstr "Ekstraherer Mappe" +msgstr "Ekstraherer mappe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Ekstraherer..." @@ -2341,27 +2429,31 @@ msgstr "FIFO-Byte" msgid "FIFO Player" msgstr "FIFO-spiller" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANKRIKE" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST-størrelse:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" -msgstr "Tilkobling Mislyktes!" +msgstr "Tilkobling mislyktes!" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:305 msgid "Failed to download codes." msgstr "Nedlasting av koder mislyktes." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Ekstrahering til %s mislyktes!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2389,6 +2481,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Mislyktes Ã¥ laste inn bthprops.cpl! Ã… koble til ekte Wii-kontrollere vil " +"ikke fungere og Dolphin kan kræsje tilfeldig!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2396,21 +2490,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Mislyktes Ã¥ laste inn hid.dll! Ã… koble til ekte Wii-kontrollere vil ikke " +"fungere og Dolphin kan kræsje tilfeldig!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Mislyktes i Ã¥ lese %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Kunne ikke lese banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Kunne ikke lese bk-header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2421,7 +2517,7 @@ msgstr "" " Minnekortet kan ha blitt trunktert\n" " Filposisjon:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2429,7 +2525,7 @@ msgstr "" "Kunne ikke lese blokkallokasjonstabell-backup'en korrekt\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2437,17 +2533,17 @@ msgstr "" "Kunne ikke lese blokkallokasjonstabell-backup'en korrekt\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Kunne ikke lese data fra filen %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Kunne ikke lese data fra fil: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2455,7 +2551,7 @@ msgstr "" "Kunne ikke lese mappesti-backup'en korrekt\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2463,41 +2559,46 @@ msgstr "" "Kunne ikke lese mappestien korrekt\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Kunne ikke lese header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -"kunne ikke lese headeren korrekt\n" +"Kunne ikke lese headeren korrekt\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Kunne ikke lese header for fil %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Kunne ikke lese unik ID fra disk-bildet" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Kunne ikke skrive BT.DINF til SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Kunne ikke skrive bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Kunne ikke skrive data til fil: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Kunne ikke skrive header for %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Kunne ikke skrive header for filen %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Persisk" @@ -2507,13 +2608,13 @@ msgstr "Rask" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Kjapp dyp kalkulasjon" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Rask versjon av MMU. Fungerer ikke for alle spill." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2521,7 +2622,7 @@ msgstr "" "Fatal desynkronisering. Avbryter avspilling. (Feil i PlayWiimote: %u != %u, " "byte %u)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo-spiller" @@ -2545,7 +2646,7 @@ msgstr "" "Filen kunne ikke Ã¥pnes\n" "eller har ingen gyldig utvidelse" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2558,20 +2659,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Filen kjennes ikke igjen som et minnekort" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Filen ikke komprimert" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Ukjent Ã¥penmodus: 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Filsystem" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Filtypen 'ini' er ukjent! kan ikke Ã¥pnes!" @@ -2585,11 +2686,11 @@ msgstr "Finn forrige" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:626 msgid "First Block" -msgstr "Første Blokk" +msgstr "Første blokk" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:799 msgid "Fix Checksums" -msgstr "Fiks Sjekksummer" +msgstr "Fiks sjekksummer" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Force 16:9" @@ -2601,11 +2702,11 @@ msgstr "Tving 4:3" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:555 msgid "Force Console as NTSC-J" -msgstr "Tving Konsoll til NTSC-J" +msgstr "Tving konsoll til NTSC-J" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:407 msgid "Force Texture Filtering" -msgstr "Tving Teksturfiltrering" +msgstr "Tving teksturfiltrering" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:91 msgid "" @@ -2632,7 +2733,7 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2642,7 +2743,7 @@ msgstr "" "Er dette avslÃ¥tt, benytter Dolphin NTSC-U som standard og gÃ¥r automatisk " "over til denne innstillingen nÃ¥r japanske spill spilles." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2656,13 +2757,18 @@ msgstr "Send frem" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Forward port (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "Fant %d resultater for '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Fant %x lagringsfiler" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2674,7 +2780,7 @@ msgstr "Stillbilde" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:173 msgid "Frame Advance" -msgstr "Bilde-for-bilde Modus" +msgstr "Bilde-for-bilde modus" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:547 msgid "Frame Dumps use FFV1" @@ -2698,15 +2804,15 @@ msgstr "Framelimit:" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:191 msgid "Frames To Record" -msgstr "Bilder Til Opptak" +msgstr "Bilder til opptak:" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:545 msgid "Free Look" -msgstr "Fri Utkikk" +msgstr "Fri utkikk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Fransk" @@ -2719,9 +2825,9 @@ msgstr "Frets" msgid "From" msgstr "Fra" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" -msgstr "FullSkj" +msgstr "Fullskjerm" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:264 msgid "Fullscreen resolution:" @@ -2731,7 +2837,7 @@ msgstr "Fullskjermsoppløsning:" msgid "GCI File(*.gci)" msgstr "GCI Fil(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC-kontroll" @@ -2739,29 +2845,29 @@ msgstr "GC-kontroll" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Spill-ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Spillet kjører allerede!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Et spill kjører ikke!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Spill ikke funnet!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Spill-spesifikke Innstillinger" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" -msgstr "SpillKonfigurasjon" +msgstr "Spillkonfigurasjon" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:515 msgid "GameCube Savegame files(*.gci;*.gcs;*.sav)" @@ -2776,20 +2882,20 @@ msgid "Gamecube &Pad Settings" msgstr "Innstillinger for &GameCube-kontroll" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "GameCube-minnekort (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Innstillinger for GameCube-kontroll" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko-juksekoder" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2810,30 +2916,30 @@ msgstr "Generelt" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:153 msgid "General Settings" -msgstr "Generelle Innstillinger" +msgstr "Generelle innstillinger" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Tysk" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Indeksen er større enn AR-kodelistens størrelse %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafikk" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" -msgstr "Innstillinger for Grafikk" +msgstr "Innstillinger for grafikk" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" -msgstr "Større Enn" +msgstr "Større enn" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:87 msgid "" @@ -2853,7 +2959,7 @@ msgstr "" " \n" " Hvis usikker, la stÃ¥ deaktivert." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Gresk" @@ -2863,11 +2969,11 @@ msgstr "Grønn" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:28 msgid "Green Left" -msgstr "Grønn Venstre" +msgstr "Grønn venstre" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:29 msgid "Green Right" -msgstr "Grønn Høyre" +msgstr "Grønn høyre" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:39 msgid "Guitar" @@ -2877,11 +2983,11 @@ msgstr "Gitar" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Header-sjekksum feilet" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebraisk" @@ -2893,7 +2999,7 @@ msgstr "Høyde" msgid "Help" msgstr "Hjelp" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2920,7 +3026,7 @@ msgstr "" "\n" "Sayonara!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2942,7 +3048,7 @@ msgstr "Gjem" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:308 msgid "Hide Mouse Cursor" -msgstr "Gjem Musepeker" +msgstr "Gjem musepeker" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:79 msgid "" @@ -2965,31 +3071,31 @@ msgstr "Vert" #: Source/Core/DolphinWX/Src/HotkeyDlg.h:31 msgid "Hotkey Configuration" -msgstr "Konfigurer Snarveistaster" +msgstr "Konfigurer hurtigtaster" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:288 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:581 msgid "Hotkeys" -msgstr "Snarveistaster" +msgstr "Hurtigtaster" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Ungarsk" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Hybrid Wiimote" -msgstr "Hybrid Wiimote" +msgstr "Hybrid Wiikontroller" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS: Forsøkte Ã¥ fÃ¥ data fra en ukjent billett: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3000,15 +3106,15 @@ msgstr "" "\n" "Dolphin vil sannsynligvis krasje nÃ¥." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - dÃ¥rlig destinasjon" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Innstillinger for IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3020,15 +3126,15 @@ msgstr "IR-peker" msgid "IR Sensitivity:" msgstr "IR-sensitivitet:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO-detaljer" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO-mapper" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIA" @@ -3036,7 +3142,7 @@ msgstr "ITALIA" msgid "Icon" msgstr "Ikon" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3046,7 +3152,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:439 msgid "Ignore Format Changes" -msgstr "Ignorer Formatendringer" +msgstr "Ignorer formatendringer" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:95 msgid "" @@ -3078,11 +3184,15 @@ msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:791 msgid "Import Save" -msgstr "Importer Lagringsfil" +msgstr "Importer lagringsfil" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importering mislyktes, prøv igjen?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importer Wii-lagringsfil" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importering mislyktes" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3104,21 +3214,16 @@ msgstr "" "Importert fil har .sav-utvidelse\n" "men har ikke korrekt header" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "I spillet" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "I spillet" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Framelimit:" +msgstr "Øke bilder i sekundet begrensning" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3132,13 +3237,13 @@ msgstr "Inndata" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:50 msgid "Insert" -msgstr "Sett Inn" +msgstr "Sett inn" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:166 msgid "Insert Encrypted or Decrypted code here..." -msgstr "Sett Inn Kryptert eller Dekryptert kode her..." +msgstr "Sett inn Kryptert eller Dekryptert kode her..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Sett inn SD-kort" @@ -3146,36 +3251,37 @@ msgstr "Sett inn SD-kort" msgid "Insert name here.." msgstr "Sett inn navn her..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Installer WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Installer til Wii Meny" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "InstallExceptionHandler kalt, men denne plattformen støtter den ikke." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Installer WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Feil i Integritetssjekk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Integritetssjekk fullført" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Integritetssjekk fullført. Ingen feil ble oppdaget." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3188,7 +3294,7 @@ msgstr "" msgid "Interface" msgstr "Kontrollpanel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Innstillinger for kontrollpanel" @@ -3211,22 +3317,22 @@ msgstr "Intern LZO-feil - lzo_init() mislyktes" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:353 msgid "Internal Resolution:" -msgstr "Intern Oppløsning:" +msgstr "Intern bildeoppløsning:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (VELDIG treg)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Ugyldig størrelse (%x) eller magisk ord (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Ugyldig verdi!" @@ -3234,16 +3340,16 @@ msgstr "Ugyldig verdi!" msgid "Invalid bat.map or dir entry" msgstr "Ugyldig bat.map eller mappesti" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Ugyldig event-type %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ugyldig fil" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3254,7 +3360,7 @@ msgstr "" "%s\n" " Det kan hende du mÃ¥ re-dumpe dette spillet." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ugyldig opptaksfil" @@ -3270,34 +3376,36 @@ msgstr "Ugyldig søkestring (kunne ikke konverte til tall)" msgid "Invalid search string (only even string lengths supported)" msgstr "Ugyldig søkestring (bare strenger av partallslengde støttes)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" -msgstr "Ugyldig save state" +msgstr "Ugyldig hurtiglagring" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italiensk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT rekompilator (anbefalt)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL eksperimentell rekompilator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japansk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3309,7 +3417,7 @@ msgid "" msgstr "" "Hold spillvinduet pÃ¥ toppen av alle andre vinduer.\n" " \n" -" Hvis usikker, la stÃ¥ uaktivert." +" Hvis usikker, la stÃ¥ deaktivert." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:307 msgid "Keep window on top" @@ -3319,8 +3427,9 @@ msgstr "Hold vindu pÃ¥ toppen" msgid "Key" msgstr "Tast" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Koreansk" @@ -3342,12 +3451,12 @@ msgstr "Venstre-Analog" msgid "Language:" msgstr "SprÃ¥k:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Siste %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Forsinkelse:" @@ -3386,9 +3495,9 @@ msgstr "" "Venstre/Høyre-klikk for flere alternativer.\n" "Middelklikk for Ã¥ tømme." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" -msgstr "Mindre Enn" +msgstr "Mindre enn" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:552 msgid "Limit by FPS" @@ -3400,104 +3509,93 @@ msgstr "Last inn" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:542 msgid "Load Custom Textures" -msgstr "Last inn Kustomiserte Teksturer" +msgstr "Last inn brukerlagde teksturer" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "Last &inn Save State" +msgstr "Last inn hurtiglagring" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Last Inn Save State Slot 1" +msgstr "Last inn hurtiglagring siste 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Last Inn Save State Slot 2" +msgstr "Last inn hurtiglagring siste 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Last Inn Save State Slot 3" +msgstr "Last inn hurtiglagring siste 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Last Inn Save State Slot 4" +msgstr "Last inn hurtiglagring siste 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Last Inn Save State Slot 5" +msgstr "Last inn hurtiglagring siste 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Last Inn Save State Slot 6" +msgstr "Last inn hurtiglagring siste 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Last Inn Save State Slot 7" +msgstr "Last inn hurtiglagring siste 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Last Inn Save State Slot 8" +msgstr "Last inn hurtiglagring siste 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "Last Inn Save State Slot 1" +msgstr "Ã…pne hurtiglagringsplass nr. 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Last Inn Save State Slot 1" +msgstr "Last inn hurtiglagring siste 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "Last Inn Save State Slot 2" +msgstr "Ã…pne hurtiglagringsplass nr. 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "Last Inn Save State Slot 3" +msgstr "Ã…pne hurtiglagringsplass nr. 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "Last Inn Save State Slot 4" +msgstr "Ã…pne hurtiglagringsplass nr. 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "Last Inn Save State Slot 5" +msgstr "Ã…pne hurtiglagringsplass nr. 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "Last Inn Save State Slot 6" +msgstr "Ã…pne hurtiglagringsplass nr. 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "Last Inn Save State Slot 7" +msgstr "Ã…pne hurtiglagringsplass nr. 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "Last Inn Save State Slot 8" +msgstr "Ã…pne hurtiglagringsplass nr. 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Last Inn Save State Slot 1" +msgstr "Last inn hurtiglagring siste 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." -msgstr "Last Inn Save State..." +msgstr "Ã…pne hurtiglagring..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Last inn Wii System Meny" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Last inn Wii System Meny %d %c" @@ -3508,17 +3606,13 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Laster inn kustomiserte teksturer fra mappen User/Load/Textures//\n" +"Laster inn brukerlagde teksturer fra mappen User/Load/Textures//\n" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." #: Source/Core/DolphinWX/Src/PHackSettings.cpp:37 msgid "Load preset values from hack patterns available." -msgstr "Last in pre-satte verdier fra tilgjengelige hack-mønstre." - -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Lokal" +msgstr "Last in forhÃ¥ndsvalgte verdier fra tilgjengelige hack-mønstre." #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" @@ -3526,7 +3620,7 @@ msgstr "Logg" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:13 msgid "Log Configuration" -msgstr "Konfigurer Logg" +msgstr "Logg-innstillinger" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:305 msgid "Log FPS to file" @@ -3550,12 +3644,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Logger utdata" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Logging" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Mistet koblingen til server!" @@ -3563,7 +3657,7 @@ msgstr "Mistet koblingen til server!" msgid "M Button" msgstr "M-knappen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3572,7 +3666,7 @@ msgstr "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Ytelses-hack for MMU" @@ -3586,11 +3680,11 @@ msgstr "MadCatz Gameshark-filer(*.gcs)" msgid "Main Stick" msgstr "Hoved-joystick" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Skaper-ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Skaper:" @@ -3604,7 +3698,7 @@ msgid "" msgstr "" "Gjør objekter langt unna mer synlige ved Ã¥ fjerne tÃ¥ke, slik at det " "generelle detaljenivÃ¥et øker.\n" -" Ã… deaktivere tÃ¥ke vil ødelegge noen spill som avhenger av skikkelig " +"Ã… deaktivere tÃ¥ke vil ødelegge noen spill som avhenger av skikkelig " "tÃ¥keemulering.\n" " \n" " Hvis usikker, la stÃ¥ deaktivert." @@ -3627,7 +3721,7 @@ msgid "Memory Byte" msgstr "Memory Byte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Minnekort" @@ -3639,7 +3733,7 @@ msgstr "" "Minnekort Manager ADVARSEL - Lag backup før du benytter, det skal bli " "fikset, men den kan tukle med lagringsfilene dine!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3656,7 +3750,7 @@ msgstr "" "%s\n" "Vil du kopiere den gamle filen til denne nye plasseringen?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "Minnekortfilstørrelse matcher ikke header-størrelsen" @@ -3664,7 +3758,7 @@ msgstr "Minnekortfilstørrelse matcher ikke header-størrelsen" msgid "Menu" msgstr "Meny" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mic" @@ -3677,7 +3771,7 @@ msgstr "Minimum" msgid "Misc" msgstr "Diverse" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Diverse Innstillinger" @@ -3693,20 +3787,20 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Modifiser teksturer til Ã¥ vise formatet de er enkodet i. Krever vanligvis en " -"emulasjonsreset.\n" +"Modifiser teksturer til Ã¥ vise formatet de er kodet i. Krever vanligvis en " +"restart av pÃ¥gÃ¥ende emulasjon..\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis usikker, la stÃ¥ deaktivert." #: Source/Core/DolphinWX/Src/LogWindow.cpp:108 msgid "Monospaced font" msgstr "Mono-mellomrom tekst-font" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3755,7 +3849,7 @@ msgstr "NP Desimal" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:113 msgid "NP Delete" -msgstr "NP Slett" +msgstr "NP Delete" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:120 msgid "NP Divide" @@ -3767,7 +3861,7 @@ msgstr "NP Ned" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:110 msgid "NP End" -msgstr "NP Slutt" +msgstr "NP End" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:98 msgid "NP Enter" @@ -3807,7 +3901,7 @@ msgstr "NP Høyre" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:117 msgid "NP Separator" -msgstr "NP Separatør" +msgstr "NP Mellomrom" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:96 msgid "NP Space" @@ -3815,7 +3909,7 @@ msgstr "NP Mellomrom" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:118 msgid "NP Subtract" -msgstr "NP Trekk Fra" +msgstr "NP Minus" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:97 msgid "NP Tab" @@ -3825,15 +3919,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Opp" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Navn:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Navn:" @@ -3843,7 +3937,7 @@ msgstr "Navn:" msgid "Native GCI files(*.gci)" msgstr "Maskinvare-innfødte GCI-filer(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nytt Søk" @@ -3852,7 +3946,7 @@ msgstr "Nytt Søk" msgid "Next Page" msgstr "Neste Side" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Neste Søk" @@ -3860,19 +3954,19 @@ msgstr "Neste Søk" msgid "Nickname :" msgstr "Brukernavn :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Intet Land (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Ingen ISO- eller WAD-filer funnet" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "Ingen audio-output" +msgstr "Ingen lydutgang" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Inngen banner-fil funnet for tittelen %s" @@ -3898,42 +3992,43 @@ msgstr "Ingen ledige mappestiindeks-entries" msgid "No recorded file" msgstr "Ingen opptaksfil" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Ingen lagringsmappe funnet for tittel %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Ingen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norsk BokmÃ¥l" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" -msgstr "Ikke Lik" +msgstr "Ikke lik" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" -msgstr "Ikke Satt" +msgstr "Ikke satt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "Ikke en Wii-lagringsfil, eller lesefeil for filheaderstørrelse %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Ikke tilkoblet" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notater" @@ -3954,7 +4049,7 @@ msgstr "Merknad" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Antall koder:" @@ -3975,7 +4070,7 @@ msgstr "Objekt" msgid "Object Range" msgstr "Objekt Radius" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Av" @@ -3987,41 +4082,45 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "On-Screen Meldinger" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online & Dokumentasjon" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Kun %d blokker tilgjengelig" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Ã…pne" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Ã…pne &tilholdsmappe" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Ã…pne Wii-&lagringsfil-mappe" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Ã…pne fil..." #: Source/Core/AudioCommon/Src/OpenALStream.cpp:48 #, c-format msgid "OpenAL: can't create context for device %s" -msgstr "OpenAL: Kan ikke lage kontekst for device %s" +msgstr "OpenAL: Kan ikke lage forbindelse med enheten %s" #: Source/Core/AudioCommon/Src/OpenALStream.cpp:59 msgid "OpenAL: can't find sound devices" -msgstr "OpenAL: Kan ikke finne lyd-device" +msgstr "OpenAL: Kan ikke finne lydenhet" #: Source/Core/AudioCommon/Src/OpenALStream.cpp:53 #, c-format msgid "OpenAL: can't open device %s" -msgstr "OpenAL: Kan ikke Ã¥pne device %s" +msgstr "OpenAL: Kan ikke Ã¥pne enhet %s" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:502 msgid "OpenCL Texture Decoder" @@ -4031,7 +4130,15 @@ msgstr "OpenCL Teksturdekoder" msgid "OpenMP Texture Decoder" msgstr "OpenMP Teksturdekoder" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Ã…pner standard (read-only) konfigurasjon for dette spillet i en ekstern " +"teksteditor." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Alternativer" @@ -4041,42 +4148,42 @@ msgid "Orange" msgstr "Oransje" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"Rekkefølgen av filer if Filmappen matcher ikke blokkrekkefølgen\n" -"Høyreklikk og eksporter all lagringsfilene,\n" -"og importer lagringsfilene til et nytt minnekort\n" +"Rekkefølgen med filer i minnekortet stemmer ikke overrens med block-" +"rekkefølgen\n" +"Høyreklikk og eksporter alt du har lagret,\n" +"og importer dette inn pÃ¥ et nytt minnekort\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Annet" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." msgstr "" -"Den andre klienten koblet fra mens spillet kjører! NetPlay er frakoblet. Du " +"Den andre klienten koblet fra mens spillet kjøret! NetPlay er frakoblet. Du " "mÃ¥ stoppe spillet manuelt." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:528 msgid "Output" msgstr "Utdata" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." -msgstr "Spi&llopptak..." +msgstr "Spi&ll av opptak..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Kontroll" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Kontroll" @@ -4100,17 +4207,17 @@ msgstr "Paragraf" msgid "Parameters" msgstr "Parametere" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partisjon %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Partisjonen finnes ikke: &lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patcher" @@ -4118,8 +4225,8 @@ msgstr "Patcher" msgid "Paths" msgstr "Mappestier" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pause" @@ -4132,7 +4239,7 @@ msgstr "Pause pÃ¥ slutten av filmen" msgid "Per-Pixel Lighting" msgstr "Per-Pikselbelysning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfekt" @@ -4142,21 +4249,21 @@ msgid "Perspective %d" msgstr "Perspektiv %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Spill" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:176 msgid "Play Recording" -msgstr "Spill Opptak" +msgstr "Spill av opptak" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:170 msgid "Play/Pause" msgstr "Spill/Pause" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Spillbar" @@ -4164,11 +4271,11 @@ msgstr "Spillbar" msgid "Playback Options" msgstr "Avspillingsalterntiver" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Spillere" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Vennligst bekreft..." @@ -4180,23 +4287,23 @@ msgstr "Vennligst lag et persektiv før du lagrer" msgid "Plus-Minus" msgstr "Pluss-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polsk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4205,11 +4312,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugisisk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugisisk (Brasilsk)" @@ -4217,36 +4324,36 @@ msgstr "Portugisisk (Brasilsk)" msgid "Post-Processing Effect:" msgstr "postprosesseringseffekt:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Prematur filmslutt i PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" -msgstr "Prematur filmslutt i PlayWiiote. %u + %d > %u" +msgstr "Prematur filmslutt i PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Prematur filmslutt i PlayWiimote. %u > %u" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:35 msgid "Presets: " -msgstr "ForhÃ¥ndssatte:" +msgstr "ForhÃ¥ndsinnstillinger:" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:192 msgid "Prev Page" -msgstr "Forrige Side" +msgstr "Forrige side" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:800 msgid "Previous Page" -msgstr "Forrige Side" +msgstr "Forrige side" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" -msgstr "Forrige Verdi" +msgstr "Forrige verdi" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:47 msgid "Print" @@ -4260,16 +4367,16 @@ msgstr "Profil" msgid "Properties" msgstr "Egenskaper" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" -msgstr "Tøm Cache" +msgstr "Tøm hurtigbuffer" #: Source/Core/Common/Src/MsgHandler.cpp:52 msgid "Question" msgstr "SpørsmÃ¥l" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Avslutt" @@ -4291,13 +4398,13 @@ msgstr "Høyre-analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSSLAND" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4305,7 +4412,7 @@ msgstr "Rekkevidde" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:178 msgid "Read-only mode" -msgstr "Les-kun-modus" +msgstr "Skrivebeskyttet-modus" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:488 msgid "Real" @@ -4313,15 +4420,15 @@ msgstr "Ekte" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Ekte balansebrett" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" -msgstr "Ekte Wiimote" +msgstr "Ekte Wiikontroller" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:80 msgid "Real Wiimotes" -msgstr "Ekte WiiMote" +msgstr "Ekte Wiikontrollere" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:180 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:205 @@ -4330,6 +4437,10 @@ msgstr "Ekte WiiMote" msgid "Record" msgstr "Opptak" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Gjør input opptak" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Opptaksinformasjon" @@ -4366,7 +4477,7 @@ msgstr "" "Hvis usikker, velg ingen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Oppdater" @@ -4375,14 +4486,14 @@ msgstr "Oppdater" msgid "Refresh List" msgstr "Oppdater liste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Oppdater spilliste" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Fjern" @@ -4394,18 +4505,18 @@ msgid "" msgstr "" "Render scenen som en wireframe.\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis usikker, la stÃ¥ deaktivert." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:309 msgid "Render to Main Window" -msgstr "Render til Hovedvindu" +msgstr "Spill i hovedvinduet" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:172 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:970 msgid "Reset" msgstr "Restart" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultater" @@ -4413,9 +4524,9 @@ msgstr "Resultater" msgid "Return" msgstr "Tilbake" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisjon:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4426,20 +4537,18 @@ msgstr "Høyre" msgid "Right Stick" msgstr "Høyre Joystick" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Rumble" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Kjør DSP HLE og LLE pÃ¥ en dedikert trÃ¥d (ikke anbefalt: Kan forÃ¥rsake audio-" -"bugs med HLE og krasj med LLE)." +"Kjør DSP LLE pÃ¥ en dedikert CPU-trÃ¥d (ikke anbefalt: Kan forÃ¥rsake frys)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russisk" @@ -4452,7 +4561,7 @@ msgid "Safe" msgstr "Sikker" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Lagre" @@ -4462,79 +4571,75 @@ msgid "Save GCI as..." msgstr "Lagre GCI som..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Lagre Sa&ve State" +msgstr "Lagre eldste hurtiglagring" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Lagre Sa&ve State" +msgstr "Lagre hurtiglagring" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" -msgstr "Lagre Save State Slot 1" +msgstr "Hurtiglagringsplass nr. 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Lagre Save State Slot 1" +msgstr "Lagre hurtiglagring nr 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" -msgstr "Lagre Save State Slot 2" +msgstr "Hurtiglagringsplass nr. 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:210 msgid "Save State Slot 3" -msgstr "Lagre Save State Slot 3" +msgstr "Hurtiglagringsplass nr. 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:211 msgid "Save State Slot 4" -msgstr "Lagre Save State Slot 4" +msgstr "Hurtiglagringsplass nr. 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:212 msgid "Save State Slot 5" -msgstr "Lagre Save State Slot 5" +msgstr "Hurtiglagringsplass nr. 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:213 msgid "Save State Slot 6" -msgstr "Lagre Save State Slot 6" +msgstr "Hurtiglagringsplass nr. 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:214 msgid "Save State Slot 7" -msgstr "Lagre Save State Slot 7" +msgstr "Hurtiglagringsplass nr. 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:215 msgid "Save State Slot 8" -msgstr "Lagre Save State Slot 8" +msgstr "Hurtiglagringsplass nr. 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Lagre Save State Slot 1" +msgstr "Lagre hurtiglagring nr 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." -msgstr "Lagre Save State..." +msgstr "Hurtiglagring..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Lagre som..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Lagre komprimert GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Lagre nÃ¥værende perspektiv" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Lagre dekomprimert GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Save State-film %s er korrupt, opptak avsluttes..." @@ -4543,20 +4648,20 @@ msgstr "Save State-film %s er korrupt, opptak avsluttes..." msgid "Scaled EFB Copy" msgstr "Skalert EFB-kopi" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Søker i %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Søker etter ISO-filer" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Søker..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "SkjDump" @@ -4568,11 +4673,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Søk" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Søkefilter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Søk i Undermapper" @@ -4595,12 +4700,12 @@ msgstr "Seksjon %s ikke funnet i SYSCONF" msgid "Select" msgstr "Velg" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" -msgstr "Velg Opptaksfil" +msgstr "Velg opptaksfil" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Velg en Wii WAD-fil Ã¥ innstallere" @@ -4622,19 +4727,19 @@ msgstr "Velg en lagringsfil Ã¥ importere" msgid "Select floating windows" msgstr "Velg flytvindu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Velg fil Ã¥ laste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Velg lagringsfil" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Velg en save state Ã¥ laste" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Velg en save state Ã¥ lagre" @@ -4656,7 +4761,7 @@ msgstr "" "\n" "Hvis usikker, velg Automatisk." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Valgt kontrolprofil eksisterer ikke" @@ -4680,39 +4785,28 @@ msgstr "" "Hvis usikker, velg skrivebordsoppløsningen din.\n" "Hvis fortsatt usikker, bruk den høyeste oppløsingen som fungerer for deg." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Velg hvilken grafikk-API som skal brukes internt.\n" -" Direct3D 9 er vanligvis den raskeste. OpenGL er mer nøyaktig. Direct3D 11 " -"ligger et sted imellom de to.\n" -" Merk at Direct3D bakendene kun er tilgjengelig pÃ¥ Windows.\n" -" \n" -" Hvis usikker, benytt Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Velg hvilken grafikk-API som skal brukes internt.\n" -" Direct3D 9 er vanligvis den raskeste. OpenGL er mer nøyaktig. Direct3D 11 " -"ligger et sted imellom de to.\n" -" Merk at Direct3D bakendene kun er tilgjengelig pÃ¥ Windows.\n" -" \n" -" Hvis usikker, benytt OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Send" @@ -4724,16 +4818,16 @@ msgstr "Sensorbarposisjon:" msgid "Separator" msgstr "Separatør" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbisk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "Serieport 1 - Dette er porten enheter som nettadapter bruker" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Sett som &standard-ISO" @@ -4742,7 +4836,7 @@ msgstr "Sett som &standard-ISO" msgid "Set as default Memcard %c" msgstr "Sett som standard Minnekort %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive: indeks er større enn AR-kodelistestørrelsen %lu" @@ -4755,19 +4849,19 @@ msgstr "" "Sett forsinkelsen (i ms). Høyere verdier kan redusere audioknaking. Kun for " "OpenAL backend." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Innstillinger..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Kan ikke finne konfigurasjonsfilen" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Kan ikke lage innstillingsfil" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Rist" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Kortnavn:" @@ -4775,23 +4869,27 @@ msgstr "Kortnavn:" msgid "Shoulder Buttons" msgstr "Skulderknapper" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Vis &Konsoll" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Vis &Logg" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Vis &Statusbar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Vis &Verktøylinje" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Vis Standardverdier" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Vis DVD-stasjoner" @@ -4803,11 +4901,11 @@ msgstr "Vis Kopieringsregioner for EFB" msgid "Show FPS" msgstr "Vis Bildefrekvens (FPS)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Vis Frankrike" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Vis GameCube" @@ -4815,35 +4913,35 @@ msgstr "Vis GameCube" msgid "Show Input Display" msgstr "Vis Inndata" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Vis Italia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Vis JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Vis Korea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Vis SprÃ¥k:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Vis Loggk&onfigurasjon" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Vis PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Vis Plattformer" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Vis Regioner" @@ -4851,27 +4949,27 @@ msgstr "Vis Regioner" msgid "Show Statistics" msgstr "Vis Statistikker" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Vis Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Vis USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Vis WAD" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Vis Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Vis en bekreftelsesboks før spill stoppes." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4890,7 +4988,7 @@ msgstr "Vis første blokk" msgid "Show lag counter" msgstr "Vis lagteller" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4927,7 +5025,7 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Vis ukjent" @@ -4941,23 +5039,24 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Sideveis-pekende Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Simplifisert Kinesisk" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Størrelse" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Dropp BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Hopp over DCBZ-tømming" @@ -4981,17 +5080,17 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4999,7 +5098,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Stillbilde" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Software-renderer" @@ -5014,27 +5113,27 @@ msgstr "" "Det er kun nyttig for Ã¥ debugge.\n" "Vil du virkelig benytte programvarerendering? Hvis usikker, velg 'nei'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Innstillinger for Audio" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Audio backend %s er ugyldig" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Laging av lydbuffer mislyktes: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Mellomrom" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spansk" @@ -5061,53 +5160,45 @@ msgstr "" "\n" "Hvis usikker, velg 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Øk diskoverføringshatighet" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Kvadrat-joystick" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standardkontroller" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Start &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" -msgstr "Begynn &Opptak" +msgstr "Start &opptak" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:175 msgid "Start Recording" -msgstr "Begynn Opptak" +msgstr "Start opptak" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" -msgstr "Save State" +msgstr "Hurtiglagring" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:161 msgid "State Saves" -msgstr "Save State-lagringsfiler" +msgstr "Hurtiglagringsfiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Ratt" @@ -5116,7 +5207,7 @@ msgid "Stick" msgstr "Joystick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Stopp" @@ -5147,28 +5238,28 @@ msgstr "Klimpre" msgid "Subtract" msgstr "Trekk Fra" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Eksportering av fil til %s vellykket" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Importering av lagringsfiler vellykket" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Svensk" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Sving" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synkroniser GPU-trÃ¥d" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5176,12 +5267,13 @@ msgstr "" "Synkroniserer GPU- og CPU-trÃ¥dene for Ã¥ hindre tilfeldige krasj i " "dobbelkjernemodus. (PÃ… = kompatibel, AV = raskt)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "SystemsprÃ¥k:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5206,13 +5298,13 @@ msgstr "Tabell Venstre" msgid "Table Right" msgstr "Tabell Høyre" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" -msgstr "Ta Skjermbilde" +msgstr "Ta skjermbilde" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongoer)" @@ -5230,13 +5322,13 @@ msgstr "Tekstur-cache" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:530 msgid "Texture Format Overlay" -msgstr "Teksturformat Overlegg" +msgstr "Teksturformat overlegg" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "Installasjon av WAD-fil var vellykket" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Adressen er ugyldig" @@ -5244,13 +5336,13 @@ msgstr "Adressen er ugyldig" msgid "The checksum was successfully fixed" msgstr "Fiksing av sjekksummen var vellykket" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Den valgte mappen finnes allerede i listen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5273,7 +5365,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Filen %s er allerede Ã¥pen, fil-headeren vil ikke bli skrevet." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Filen du spesifiserte (%s) eksisterer ikke" @@ -5284,7 +5376,7 @@ msgstr "Navnet kan ikke være blankt" #: Source/Core/DolphinWX/Src/FrameAui.cpp:658 msgid "The name can not contain the character ','" -msgstr "navnet kan ikke inneholde tegnet ','" +msgstr "Navnet kan ikke inneholde tegnet ','" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:129 msgid "The resulting decrypted AR code doesn't contain any lines." @@ -5306,50 +5398,50 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Lagringsfilen du forsøker Ã¥ Ã¥pne har en ugyldig filstørrelse" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" -"Det valgte sprÃ¥ket støttes ikke av ditt system. Faller tilbake til standard." +"Det valgte sprÃ¥ket støttes ikke av ditt system. GÃ¥r tilbake til standard." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Serverens og klientens NetPlay-versjoner er ukompitable!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Serveren er full!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Serveren responderte: Spillet kjører!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" -msgstr "Serveren sente en ukjent feilmelding!" +msgstr "Serveren sendte en ukjent feilmelding!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Den spesifiserte filen \"%s\" eksisterer ikke" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Verdien er ugyldig" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" "Det mÃ¥ være en billett for 00000001/00000002. Din NAND-dump er ukomplett." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5357,7 +5449,7 @@ msgstr "" "Disse innstillingene overstyrer Dolphins kjerneinnstillinger.\n" "Ubestemt betyr at spillet bruker Dolphins kjerneinnstillinger." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5365,7 +5457,7 @@ msgstr "" "Denne Action Replay-simulatoren støtter ikke koder som modifiserer selve " "Action Replay." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Dette kan føre til ytelsesreduksjon i Wii Meny og noen spill." @@ -5384,21 +5476,20 @@ msgstr "" "høyre museknapp og flytt musen for Ã¥ snu pÃ¥ kameraet. Hold nede SHIFT og " "press en av tastene WASD for Ã¥ flytte kameraet en viss distanse (SHIFT + 0 " "for Ã¥ flytte raskere og SHIFT + 9 for Ã¥ flytte saktere). Trykk SHIFT + R for " -"Ã¥ resette kameraet. Hvis usikker, la stÃ¥ avslÃ¥tt." +"Ã¥ resette kameraet. Hvis usikker, la stÃ¥ deaktivert." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Hvis du setter Bildebegrensning høyere enn spillets fulle hastighet " -"(NTSC:60, PAL:50). Bruk audio for Ã¥ begrense ved Ã¥ bruke DSP (kan muligens " -"fikse audioklikk, men kan ogsÃ¥ forÃ¥rsake støy, avhengig av spillet)." +"Dette begrenser hastigheten til et bestemt antall bilder per sekund (60 for " +"NTSC og 50 for PAL). Alternativt kan du bruke innstillingen Audio (kan fikse " +"diverse klikkelyder, men kan ogsÃ¥ forÃ¥rsake konstant støy i enkelte spill)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5410,7 +5501,7 @@ msgstr "" "Øker ytelsen pÃ¥ datamaskiner med mer enn én kjerne,\n" "men kan ogsÃ¥ føre til feil/krasj." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Dette lar deg manuelt endre INI-konfigurasjonsfilen" @@ -5419,12 +5510,12 @@ msgstr "Dette lar deg manuelt endre INI-konfigurasjonsfilen" msgid "Threshold" msgstr "Terskel" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Tilt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Tittel" @@ -5435,42 +5526,40 @@ msgstr "Til" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:59 msgid "Toggle All Log Types" -msgstr "Vipp Alle Loggtyper" +msgstr "Bytt alle loggtypene" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Aspektforhold:" +msgstr "Skift bildestørrelse" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB-kopier" +msgstr "SlÃ¥ pÃ¥ EFB-kopi" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Vipp Alle Loggtyper" +msgstr "SlÃ¥ pÃ¥ tÃ¥ke" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" -msgstr "Vipp Mellom Vindu/Fullskjerm" +msgstr "Bytt mellom fullskjermspilling eller vinduspilling." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "SlÃ¥ pÃ¥ IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Topp" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Tradisjonell Kinesisk" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Forsøkte Ã¥ laste en ukjent filtype." @@ -5488,9 +5577,9 @@ msgid "" "Wiimote bt ids are not available" msgstr "" "Forsøker Ã¥ lese fra ugyldig SYSCONF\n" -"Wiimote bt ids er ikke tilgjengelig" +"Wiikontroller bt ids er ikke tilgjengelig" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Tyrkisk" @@ -5506,12 +5595,12 @@ msgstr "Type" msgid "UDP Port:" msgstr "UDP Port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "UKJENT" @@ -5520,7 +5609,7 @@ msgstr "UKJENT" msgid "UNKNOWN_%02X" msgstr "UKJENT_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5533,9 +5622,9 @@ msgstr "" " Modifiseringen ble ikke gjort." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5543,29 +5632,28 @@ msgstr "" "kryptert eller dekryptert kode. Sørg for at du tastet den inn korrekt.\n" "Ønsker du Ã¥ ignorere denne linjen og fortsette parsering?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Udefinert %i" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:229 msgid "Undo Load State" -msgstr "Angre Lasting av Save State" +msgstr "Angre Ã¥pning av hurtiglagring" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Angre Lasting av Save State" +msgstr "Angre hurtiglagring" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Uforventet 0x80 kall? Avbryter..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Ukjent" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Ukjent DVD-kommando%08x - fatal feil" @@ -5580,12 +5668,12 @@ msgstr "Ukjent kommando 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Ukjent entry-type %i in SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Ukjent melding mottatt med ID: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "Ukjent melding mottatt med ID: %d fra spiller: %d Sparker spiller!" @@ -5595,30 +5683,30 @@ msgstr "Ukjent melding mottatt med ID: %d fra spiller: %d Sparker spiller!" msgid "Up" msgstr "Opp" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Oppdater" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Mot-skjerm-pekende Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Bruk EuRGB60-modus (PAL60)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:295 msgid "Use Fullscreen" -msgstr "Bruk Fullskjerm" +msgstr "Bruk fullskjerm" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Bruk Hex" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:587 msgid "Use Panic Handlers" -msgstr "Bruk Panikkadvarslere" +msgstr "Bruk panikkadvarslere" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:90 msgid "" @@ -5627,6 +5715,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Bruk en mindre nøyaktig algoritme for Ã¥ beregne dybde verdier. âŽ\n" +"Kan forÃ¥rsake problemer i enkelte spill, men kan gi en anstendig " +"hastighetsøkning. âŽ\n" +"âŽ\n" +"Hvis du er usikker sÃ¥ la denne være aktivert." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5639,7 +5732,23 @@ msgstr "" "Kan resultere i en ytelsesøkning (spesielt pÃ¥ CPU-er med mer enn to " "kjerner.)\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis usikker, la stÃ¥ deaktivert." + +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Bruker usikre operasjoner for Ã¥ øke farten pÃ¥ vertex streaming i OpenGL. Det " +"er ingen kjente problemer med dette pÃ¥ støttede GPU'er, men det vil skape " +"stor ustabilitet og grafiske feil pÃ¥ andre.\n" +"\n" +"\n" +"\n" +"Hvis usikker, la stÃ¥ umerket." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" @@ -5653,7 +5762,7 @@ msgstr "" "En kan derimot droppe disse pop-up-ene for Ã¥ tillate uavbrutt spilling ved Ã¥ " "aktivere dette alternativet.\n" "\n" -"Hvis usikker, la stÃ¥ avslÃ¥tt." +"Hvis usikker, la stÃ¥ deaktivert." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:550 msgid "Utility" @@ -5661,14 +5770,13 @@ msgstr "Verktøyet" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:294 msgid "V-Sync" -msgstr "Vertikal Synkronisering" +msgstr "Vertikal synkronisering" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Ytelses-hack for MMU" +msgstr "VBeam Speed Hack" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Verdi" @@ -5676,7 +5784,7 @@ msgstr "Verdi" msgid "Value:" msgstr "Verdi:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Verdi:" @@ -5686,9 +5794,9 @@ msgstr "Verbøsitet" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Vertex Streaming Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video" @@ -5696,17 +5804,17 @@ msgstr "Video" msgid "Virtual" msgstr "Virtuell" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volum" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD-installasjon feilet: Skaper feil %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD-installasjon mislyktes: Feil ved ticket-laging" @@ -5728,19 +5836,19 @@ msgstr "" msgid "Warning" msgstr "Advarsel" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Advarsel - starter DOL i feil konsollmodus!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Advarsel - starter ELF i feil konsollmodus!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Advarsel - starter ISO i feil konsollmodus!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5764,7 +5872,7 @@ msgstr "" "og har samme navn som en fil pÃ¥ ditt minnekort\n" "Fortsette?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5775,7 +5883,7 @@ msgstr "" "spilles. (Byte %u > %u) (Frame %u > %u). Du burde laste en annen savestate " "før du fortsetter, eller laste denne savestate-en med kun-les modus av." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5787,7 +5895,7 @@ msgstr "" "denne savestate-en med les-kun modus av. Ellers fÃ¥r du sannsynligvis en " "desynkronisering." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5842,19 +5950,15 @@ msgstr "Bredde" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii-konsoll" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND-rot:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importer Wii-lagringsfil" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii-lagringsfiler (*.bin)|*.bin" @@ -5863,30 +5967,36 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Kunne ikke lese fra fil" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" -msgstr "Wiimote" +msgstr "Wiikontroller" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiikontroller" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" -msgstr "WiiMote %i" +msgstr "Wiikontroller %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" -msgstr "Wiimote Tilkoblet" +msgstr "Wiikontroller tilkoblet" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:108 msgid "Wiimote Motor" -msgstr "Wiimote-motor" +msgstr "Wiikontroller-motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" -msgstr "Innstillinger for Wiimote" +msgstr "Innstillinger for Wiikontroller" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:48 msgid "Wiimotes" -msgstr "WiiMote-er" +msgstr "Wiikontrollere" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:121 msgid "Windows Left" @@ -5904,48 +6014,63 @@ msgstr "Windows Høyre" msgid "Word Wrap" msgstr "Ordkrumning" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Arbeider..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Skriv til minnekortene (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" -msgstr "Skriv til Konsoll" +msgstr "Skriv til konsoll" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:54 msgid "Write to Debugger" -msgstr "Skriv til Debugger" +msgstr "Skriv til debugger" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:44 msgid "Write to File" -msgstr "Skriv til Fil" +msgstr "Skriv til fil" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:48 msgid "Write to Window" -msgstr "Skriv til Vindu ->" +msgstr "Skriv til vindu ->" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice mislyktes: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2-initialisering mislyktes: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 master voice-laging mislyktes: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice mislyktes: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2-initialisering mislyktes: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 master voice-laging mislyktes: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF-register" @@ -5980,11 +6105,11 @@ msgstr "Du kan ikke lukke panelene som har sider/faner i dem." msgid "You must choose a game!!" msgstr "Du mÃ¥ velge et spill!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Du mÃ¥ skrive inn et navn!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Du mÃ¥ skrive inn en gyldig desimal, hexadesimal eller octal verdi." @@ -5992,7 +6117,7 @@ msgstr "Du mÃ¥ skrive inn en gyldig desimal, hexadesimal eller octal verdi." msgid "You must enter a valid profile name." msgstr "Du mÃ¥ skrive inn et gyldig profilnavn." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Du mÃ¥ restarte Dolphin for at endringen skal tre i kraft." @@ -6006,7 +6131,7 @@ msgstr "" " Vil du stoppe nÃ¥ for Ã¥ fikse problemet=\n" " Hvis du velger \"Nei\", kan audio ha knasing." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6025,15 +6150,15 @@ msgstr "" "Den skal være 0x%04x (men er 0x%04llx)\n" "Ønsker du Ã¥ generere en ny en?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP-hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3-kode støttes ikke" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero-kode ukjent for Dolphin: %08x" @@ -6091,104 +6216,80 @@ msgstr "" "\n" "Hvis usikker, la stÃ¥ avslÃ¥tt." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "applikasjonslaster (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Leser Opcode fra %x. Vennligst rapporter." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "Ukjent smak %d (forventet %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "Ukjent melding mottatt" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute returnerte -1 pÃ¥ applikasjonskjøring!" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:43 msgid "zFar Correction: " -msgstr "zFar Korreksjon: " +msgstr "zFar korreksjon: " #: Source/Core/DolphinWX/Src/PHackSettings.cpp:38 msgid "zNear Correction: " -msgstr "zNear Korreksjon: " +msgstr "zNear korreksjon: " #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:545 msgid "| OR" msgstr "| ELLER" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Nøyaktig VBeam-emulering" +#~ msgid "Could not create %s" +#~ msgstr "Kunne ikke lage %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Endre Lokale Overkjøringer" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "Ã…pner de valgte overkjøringene i en ekstern teksteditor." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Tillater bytting mellom visse innstilliner via snarveistastene 3 (intern " -#~ "oppløsning), 4 (Aspekt ratio), 5 (Kopier EFB) og 6 (TÃ¥ke) i " -#~ "emuleringsvinduet.\n" +#~ "Velg hvilken grafikk-API som skal brukes internt.\n" +#~ " Direct3D 9 er vanligvis den raskeste. OpenGL er mer nøyaktig. Direct3D " +#~ "11 ligger et sted imellom de to.\n" +#~ " Merk at Direct3D bakendene kun er tilgjengelig pÃ¥ Windows.\n" #~ " \n" -#~ " Hvis usikker, la stÃ¥ uaktivert." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Kan ikke finne WiiMote med bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Aktiver Snarveistaster" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Lytting Mislyktes!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Kunne ikke laste bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Kunne ikke laste hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic-konfigurasjon" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY ble kalt, venligst rapporter!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hacket Bufferopplastning" +#~ " Hvis usikker, benytt Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Hvis bilderatioen er erratisk, kan denne innstillingen hjelpe. (PÃ… = " -#~ "Kompitabelt, AV = Raskt)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Siste Overskrevne Save State:" - -#~ msgid "Last Saved State" -#~ msgstr "Siste Save State:" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Gjenntilkoble Wiimote ved Lasting av Save State" - -#~ msgid "Set" -#~ msgstr "Sett" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Dropp Dest. Alpha Pass" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Bruk en hacket opplastningsstrategi for Ã¥ streame punkter.\n" -#~ " Dette vil vanligvis øke ytelsen, men er forbudt av OpenGL " -#~ "spesifikasjonen og kan forÃ¥rsake store bugs.\n" +#~ "Velg hvilken grafikk-API som skal brukes internt.\n" +#~ " Direct3D 9 er vanligvis den raskeste. OpenGL er mer nøyaktig. Direct3D " +#~ "11 ligger et sted imellom de to.\n" +#~ " Merk at Direct3D bakendene kun er tilgjengelig pÃ¥ Windows.\n" #~ " \n" -#~ " Hvis usikker, la stÃ¥ deaktivert." +#~ " Hvis usikker, benytt OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Leser Opcode fra %x. Vennligst rapporter." diff --git a/Languages/po/nl.po b/Languages/po/nl.po index c328901193..f65bbb1eb9 100644 --- a/Languages/po/nl.po +++ b/Languages/po/nl.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-17 16:38+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-15 14:49+0000\n" "Last-Translator: Garteal \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/dolphin-emu/" "language/nl/)\n" @@ -21,13 +21,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(te veel om weer te geven)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Spel :" @@ -35,7 +35,7 @@ msgstr " Spel :" msgid "! NOT" msgstr "! NIET" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -44,7 +44,7 @@ msgstr "" "\"%s\" bestaat niet.\n" "Wilt u een nieuwe 16MB geheugenkaart aanmaken?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" is een onjuist GCM/ISO bestand of het is geen GC/Wii ISO." @@ -59,29 +59,29 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopieer%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d samples" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d samples (kwaliteitsniveau %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s bestaat al, wilt u het vervangen?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" "Het lukte niet om %s te comprimeren. Waarschijnlijk is de image corrupt." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -90,7 +90,7 @@ msgstr "" "%s kon niet worden geladen als een geheugenkaart\\n\n" "Bestandsgrootte op kaart is onjuist (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -99,7 +99,7 @@ msgstr "" "%s kon niet worden geladen als een geheugenkaart\\n\n" "Kaartgrootte is onjuist (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -109,22 +109,27 @@ msgstr "" "Bestand is niet groot genoeg om een geldige geheugenkaart bestand te zijn (0x" "%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "Kon %s niet openen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s gefaald: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s is een 0 byte bestand" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s is al gecomprimeerd! Kan niet nog meer comprimeren." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s is te lang voor de bestandsnaam, maximaal aantal karakters is 45" @@ -153,7 +158,7 @@ msgstr "%u Vrije Blokken; %u Vrije Bestands Invoer" msgid "&& AND" msgstr "&& EN" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Over..." @@ -161,7 +166,7 @@ msgstr "&Over..." msgid "&Boot from DVD Drive..." msgstr "&Start van DVD Drive..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Breekpunten" @@ -169,7 +174,7 @@ msgstr "&Breekpunten" msgid "&Browse for ISOs..." msgstr "&Blader voor ISOs..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Cheats Manager" @@ -177,11 +182,11 @@ msgstr "&Cheats Manager" msgid "&DSP Settings" msgstr "&DSP Instellingen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Verwijder ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Verwijder geselecteerde ISOs..." @@ -193,11 +198,11 @@ msgstr "&Emulatie" msgid "&File" msgstr "&Bestand" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Frame Avanceren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Volledig Scherm" @@ -205,7 +210,7 @@ msgstr "&Volledig Scherm" msgid "&Graphics Settings" msgstr "&Grafische Instellingen " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Help" @@ -213,7 +218,7 @@ msgstr "&Help" msgid "&Hotkey Settings" msgstr "&Sneltoets Instellingen " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -225,11 +230,11 @@ msgstr "&Laad staat" msgid "&Memcard Manager (GC)" msgstr "&Geheugenkaart Manager (GC) " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Geheugen " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Open..." @@ -237,51 +242,51 @@ msgstr "&Open..." msgid "&Options" msgstr "&Opties " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pauze" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Speel " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Eigenschappen " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Alleen-lezen modus" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Lijst Vernieuwen " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registers" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Geluid " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Stop" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Tools" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Bekijk " @@ -289,7 +294,7 @@ msgstr "&Bekijk " msgid "&Wiimote Settings" msgstr "&Wiimote Instellingen " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -314,9 +319,8 @@ msgid "(off)" msgstr "(uit) " #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ERBIJ" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -326,7 +330,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Native (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -342,7 +346,7 @@ msgstr "2.5x Native (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Native (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -358,7 +362,7 @@ msgstr "3x Native (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Native (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -370,7 +374,7 @@ msgstr " " msgid "" msgstr " " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -378,7 +382,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -387,12 +391,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Er is al een NetPlay venster geopend!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Er staat geen spel aan." @@ -414,40 +418,37 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ALERT:\n" "\n" -"NetPlay zal op dit moment alleen goed werken wanneer u de volgende " +"Netplay zal op dit moment alleen goed werken wanneer je de volgende " "instellingen gebruikt:\n" " - Dual Core [UIT]\n" -" - Audio Throttle [UIT]\n" -" - DSP-HLE met \"Null Audio\" of DSP-LLE\n" -" - Zet handmatig het exact aantal controller dat gebruikt word voor de " -"[Standaard Controller]\n" +" - DSP Emulator Engine moet hetzelfde zijn op alle computers!\n" +" - DSP op toegeweide thread [UIT]\n" +" - Framelimit NIET op [Audio]\n" "\n" -"Alle spelers moeten proberen om dezelfde Dolphin versie en instellingen te " -"gebruiken.\n" +"Alle spelers moeten dezelfde Dolphin versie en instellingen gebruiken.\n" "Schakel alle geheugenkaarten uit of stuur ze naar alle spelers voor het " "spelen.\n" "Wiimote ondersteuning is niet geïmplementeerd.\n" "\n" -"Je moet de TCP poort forwarden voor het hosten!!" +"Je moet de TCP poort forwarden voor het hosten!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR Codes" @@ -496,7 +497,7 @@ msgstr "" "Verantwoordelijke code:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -504,7 +505,7 @@ msgstr "" "Action Replay Fout: Verkeerde grootte (%08x : address = %08x) in Voeg Code " "Toe (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -513,7 +514,7 @@ msgstr "" "Action Replay Fout: Verkeerde grootte (%08x : adres = %08x) in Vul en Schuif " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -522,7 +523,7 @@ msgstr "" "Action Replay Fout: Verkeerde grootte (%08x : adres = %08x) in Ram Schrijf " "En Vul (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -531,12 +532,12 @@ msgstr "" "Action Replay Fout: Verkeerde grootte (%08x : adres = %08x) in Schrijf Naar " "Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay Fout: Verkeerde waarde (%08x) in Geheugen Kopie (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -546,27 +547,27 @@ msgstr "" "geimplementeerd (%s)\\n\n" "Master codes zijn niet nodig. Gebruik geen master codes." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay Fout: foutive AR code regel: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Conditionele Code: Onjuiste Grootte %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Onjuiste Normal Code Type %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Code %i: Onjuist subtype %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Code 0: Onjuist Subtype %08x (%s)" @@ -580,11 +581,11 @@ msgstr "Adapter:" msgid "Add" msgstr "Voeg toe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Voeg een ActionReplay Code toe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Voeg een Patch toe" @@ -592,9 +593,9 @@ msgstr "Voeg een Patch toe" msgid "Add new pane" msgstr "Voeg een nieuwe paneel toe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Voeg toe..." @@ -651,32 +652,32 @@ msgstr "Geavanceerd" msgid "Advanced Settings" msgstr "Geavanceerde Instellingen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Alle GC/Wii bestanden (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Alle GC/Wii images (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Alle Gamecube GCM bestanden (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Alle Save Staten (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Alle Wii ISO Bestanden (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Alle gecomprimeerde GC/Wii ISO-bestanden (GCZ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Alle Bestanden (*.*)|*.*" @@ -696,19 +697,19 @@ msgstr "Anisotropic Filtering:" msgid "Anti-Aliasing:" msgstr "Anti-Aliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader heeft de verkeerde grootte.. is het wel echt een Apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader kan het bestand niet laden" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader :" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Toepassen" @@ -722,7 +723,7 @@ msgstr "" "\n" "In geval van twijfel selecteer (uit)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabisch" @@ -731,7 +732,7 @@ msgstr "Arabisch" msgid "Are you sure you want to delete \"%s\"?" msgstr "Weet je zeker dat je \"%s\"? wilt verwijderen?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -739,17 +740,22 @@ msgstr "" "Weet je zeker dat je dit bestand wilt verwijderen?\n" "Deze gegevens zijn niet terug te halen!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Weet je zeker dat je dit bestand wilt verwijderen? Deze gegevens zijn niet " "terug te halen!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (Experimenteel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (Experimenteel)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Beeldverhouding:" @@ -758,12 +764,12 @@ msgstr "Beeldverhouding:" msgid "At least one pane must remain open." msgstr "Er moet tenminste één paneel open blijven." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Geluid" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Geluid Backend:" @@ -771,7 +777,7 @@ msgstr "Geluid Backend:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Fout bij het openen van een AO toestel. \n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -810,16 +816,16 @@ msgstr "BP register " msgid "Back" msgstr "Terug" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Backend Instellingen" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Geluids backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Achtergrond invoer" @@ -828,24 +834,24 @@ msgstr "Achtergrond invoer" msgid "Backward" msgstr "Terug" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Verkeerde bestands header" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Banner Details" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -865,7 +871,7 @@ msgstr "Basis Instellingen" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Block Allocation Table checksum is mislukt" @@ -886,7 +892,7 @@ msgid "Blue Right" msgstr "Blauw Rechts" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Onder" @@ -895,27 +901,27 @@ msgstr "Onder" msgid "Bound Controls: %lu" msgstr "Gekoppelde controls: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Defect" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Zoek" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Zoek een folder om toe te voegen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Zoek een ISO folder" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Zoek een uitvoer folder" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -925,7 +931,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Knoppen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -973,33 +979,33 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Kan Wiimote met verbinding %02x niet vinden" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Kan niet lezen van DVD_Plugin - DVD-Interface: Fatale Error" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Annuleer" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Kan %s niet openen" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Kan geen events afmelden als er events in afwachting zijn" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1010,7 +1016,7 @@ msgstr "" "%s\\n\n" "is geen geldig gamecube geheugenkaart bestand." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1022,7 +1028,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalaans" @@ -1030,11 +1036,11 @@ msgstr "Catalaans" msgid "Center" msgstr "Middelpunt" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Verander" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Verander &Schijf" @@ -1042,11 +1048,11 @@ msgstr "Verander &Schijf" msgid "Change Disc" msgstr "Verander Schijf" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Spel veranderen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1062,11 +1068,11 @@ msgstr "Verandert teken van zVer parameter (na correctie)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Verandert teken van zDichtbij parameter (na correctie)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Het heeft geen effect als je dit veranderd wanneer de emulator draait!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1074,47 +1080,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Cheat Code" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Cheat Zoeken" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Cheats Manager" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Controleer Partitie integriteit" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Integriteit controleren..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinees (Vereenvoudigd)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinees (Traditioneel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Kies een DVD Station:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Kies een NAND basismap:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Kies een standaard ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Kies een folder om toe te voegen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Kies een bestand om te openen" @@ -1122,7 +1128,7 @@ msgstr "Kies een bestand om te openen" msgid "Choose a memory card:" msgstr "Kies een geheugen kaart:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1130,8 +1136,8 @@ msgstr "" "Kies Bestand te gebruiken als apploader: (geldt voor disks die alleen mappen " "uit mappen zijn opgebouwd)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Kies de folder om naar uit te pakken" @@ -1150,7 +1156,7 @@ msgstr "Klassiek" msgid "Clear" msgstr "Legen" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1160,7 +1166,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Sluit" @@ -1169,11 +1175,11 @@ msgstr "Sluit" msgid "Co&nfigure..." msgstr "In&stellingen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Code Info" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Code: " @@ -1185,24 +1191,24 @@ msgstr "Commando" msgid "Comment" msgstr "Reactie" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Reactie:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimeer ISO ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimeer geselecteerde ISO's ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "ISO wordt gecomprimeerd" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Config" @@ -1216,18 +1222,18 @@ msgstr "Configureer" msgid "Configure Control" msgstr "Configureer Besturing" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configureer Besturing Pads" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configureer..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Bevestig om bestand over te schrijven." @@ -1240,17 +1246,16 @@ msgstr "Bevestiging bij Stop" msgid "Connect" msgstr "Verbind" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Verbind USB Toetsenbord" +msgstr "Verbind Balance Board" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Verbind USB Toetsenbord" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Verbind Wiimote %i" @@ -1271,7 +1276,7 @@ msgstr "Verbind Wiimote 3" msgid "Connect Wiimote 4" msgstr "Verbind Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Verbinden..." @@ -1291,7 +1296,7 @@ msgstr "Bestuur" msgid "Convert to GCI" msgstr "Omzetten naar GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopiëren mislukt" @@ -1300,21 +1305,16 @@ msgstr "Kopiëren mislukt" msgid "Copy to Memcard %c" msgstr "Kopieer naar MemKaart %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Core" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Het volgende bestanden kon niet gemaakt worden %s " - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Kon de %s backend niet initialiseren." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1325,25 +1325,16 @@ msgstr "" "geen GC/Wii backup.Meeste PC DVD drives kunnen geen originele Gamecube en " "Wii schijven lezen!" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Kon ISO bestand %s niet herkennen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Kon %s niet opslaan" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Kon de pads niet instellen. De speler heeft het spel verlaten, of het spel " -"draait nog!\n" -"(pads instellen terwijl het spel draait wordt nog niet ondersteund)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1365,11 +1356,11 @@ msgstr "" "Zo ja, dan moet je je memory card locatie opnieuw aangeven in de " "configuratie." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Kon geen open commando vinden voor extensie 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1377,17 +1368,17 @@ msgstr "" "Kon de kern niet initialiseren.\n" "Controleer je instellingen." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Tel:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Land:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Maak AR Code" @@ -1422,12 +1413,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Huidige map verandert van %s naar %s na wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Aangepaste Projectie Hack" @@ -1435,11 +1426,11 @@ msgstr "Aangepaste Projectie Hack" msgid "Custom Projection Hack Settings" msgstr "Aangepaste Projectie Instellingen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Pas sommige orthogonale projectie parameters aan." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tsjechisch" @@ -1451,36 +1442,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP Emulator Motor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE emulatie (snel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE Interpreteer (Behoorlijk langzaam)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE hercompileerder" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP op toegeweide thread" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "DSP Instellingen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE op toegeweide thread" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD Station:" @@ -1492,15 +1483,15 @@ msgstr "DVDLowRead - Fatale Error: kan het volume niet lezen" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Fatale Error: kan het volume niet lezen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Dansmat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Data grootte" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Datum:" @@ -1529,29 +1520,28 @@ msgstr "Fouthersteller" msgid "Decimal" msgstr "Decimaal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Decomprimeer ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Decomprimeer geselecteerde ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Decomprimeer ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Ververs de speellijst" +msgstr "Verlaag framelimit" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Standaard" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Standaard ISO:" @@ -1595,8 +1585,8 @@ msgstr "" msgid "Device" msgstr "Apparaat" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Apparaat Instellingen" @@ -1604,15 +1594,12 @@ msgstr "Apparaat Instellingen" msgid "Dial" msgstr "Bellen" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1627,7 +1614,7 @@ msgstr "Uitschakelen" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Disable Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1664,7 +1651,6 @@ msgstr "" "In geval van twijfel leeg laten." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" @@ -1676,7 +1662,7 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Schijf" @@ -1703,24 +1689,88 @@ msgstr "" msgid "Divide" msgstr "Verdelen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Wil je de emulatie stoppen?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II decodering" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branche: %s\n" +"Revisie: %s\n" +"Gecompiled op: %s @ %s\n" +"\n" +"Dolphin is een Gamecube/Wii emulator dat oorspronkelijk was ontwikkeld door " +"F|RES en ector. Tegenwoordig is Dolphin een open source project met vele " +"bijdragers, te veel om op te noemen.\n" +"Als je geïnteresseerd bent, bezoek onze project pagina op\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Speciale dank aan Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 en Hotquik voor hun\n" +"reverse engineering en docs/demos.\n" +"\n" +"Grote dank aan Gilles Mouchard wiens Microlib PPC\n" +"emulator onze ontwikkeling een grote schop vooruit gaf.\n" +"\n" +"Dank aan Frank Wille voor zijn PowerPC disassembler,\n" +"dat or9 en wij hebben aangepast om de Gekko bijzonderheden te omvatten.\n" +"\n" +"Dank aan hcs/destop voor hun GC ADPCM decoder.\n" +"\n" +"We zijn niet verbonden met Nintendo op geen enkele manier.\n" +"Gamecube en Wii zijn handelsmerken van Nintendo.\n" +"De emulator is alleen voor educatieve doeleinden\n" +"en mag niet worden gebruikt om spellen te spelen die je niet legaal bezit." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s Grafische Configuratie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin &Web Site" @@ -1736,12 +1786,12 @@ msgstr "Dolphin Geëmuleerde Wiimote configuratie" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GCPad Configuratie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS Film (*.dtm)" @@ -1749,18 +1799,18 @@ msgstr "Dolphin TAS Film (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote configuratie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin op &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" "Dolphin kan geen GC/Wii ISO's vinden. Dubbelklik om bestanden te zoeken..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1768,19 +1818,18 @@ msgstr "" "Dolphin is ingesteld om alle spellen te verbergen. Dubbelklik hier om alle " "spellen te weergeven..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin kan de verzochte actie niet uitvoeren." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Activeer snelle schijf toegang. Nodig voor een aantal spelletjes. (AAN = " -"Snel, UIT = Compatibel)" +"Verdubbelt de geemuleerde GPU clock snelheid. Kan de emulatie versnellen. " +"(AAN = Snel, UIT = Compatibel)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1800,11 +1849,11 @@ msgstr "%lu codes gedownload. (%lu toegevoegd)" msgid "Drums" msgstr "Drums" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Pop" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Dump Geluid" @@ -1850,9 +1899,9 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Nederlands" @@ -1876,7 +1925,7 @@ msgstr "" "versie %d.%d -- Als je recentelijk Dolphin hebt geupgrade is het mogelijk " "dat je Windows moet herstarten om deze de driver te detecteren." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1884,7 +1933,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Vroege Geheugen Updates" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Wijzig" @@ -1892,7 +1941,7 @@ msgstr "Wijzig" msgid "Edit ActionReplay Code" msgstr "Wijzig ActionReplay Code" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Wijzig Configuratie" @@ -1900,12 +1949,12 @@ msgstr "Wijzig Configuratie" msgid "Edit Patch" msgstr "Wijzig Patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Wijzig het huidige perspectief" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Wijzig..." @@ -1917,7 +1966,7 @@ msgstr "Effect" msgid "Embedded Frame Buffer" msgstr "Ingebedde Frame Buffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Emu Thread draait al!" @@ -1955,7 +2004,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Geëmuleerde Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Emulatie Staat:" @@ -1979,15 +2028,15 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Activeer AR Logging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Activeer Block Merging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Activeer Bounding Box Berekeningen" @@ -1999,7 +2048,7 @@ msgstr "Activeer Cache" msgid "Enable Cheats" msgstr "Activeer Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Activeer Dual Core" @@ -2007,7 +2056,7 @@ msgstr "Activeer Dual Core" msgid "Enable Dual Core (speedup)" msgstr "Activeer Dual Core (verhoogt de snelheid)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Activeer Idle Skipping" @@ -2015,7 +2064,7 @@ msgstr "Activeer Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Activeer Idle Skipping (verhoogt de snelheid)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Activeer MMU" @@ -2023,7 +2072,7 @@ msgstr "Activeer MMU" msgid "Enable Progressive Scan" msgstr "Activeer Progressive Scan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Activeer Schermbeveiliger" @@ -2031,7 +2080,7 @@ msgstr "Activeer Schermbeveiliger" msgid "Enable Speaker Data" msgstr "Activeer Speaker Data" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Activeer BreedBeeld" @@ -2053,7 +2102,7 @@ msgstr "" "\n" "In geval van twijfel selecteer 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2089,7 +2138,7 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2097,11 +2146,11 @@ msgstr "" "Activeer dit om The Legend of Zelda: Twilight Princess te versnellen. " "Uitschakelen voor elk ander spel." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Schakelt aangepaste projectie hack in" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2109,22 +2158,13 @@ msgstr "" "Activeert Dolby Pro Logic II emulatie met 5.1 surround. Niet beschikbaar met " "OSX" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Activeert Dolby Pro Logic II emulatie met 5.1 surround. Alleen voor OpenAL " "backend." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Activeert Dolby Pro Logic II emulatie met 5.1 surround. Allen voor OpenAL " -"backend. Het hernoemen van soft_oal.dll naa OpenAL32.dll kan nodig zijn om " -"het werkend te maken." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2138,7 +2178,7 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2160,9 +2200,9 @@ msgstr "" msgid "End" msgstr "Einde" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Engels" @@ -2185,23 +2225,22 @@ msgstr "Toegang %d/%d" msgid "Entry 1/%d" msgstr "Toegang 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Gelijk" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Error (Fout)" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Fout bij het laden van de geselecteerde taal. Dolphin zal terugvallen op de " "systeemtaal." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2229,7 +2268,6 @@ msgid "Euphoria" msgstr "Euforie" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Exception handler - toegang onder geheugen ruimte. %08llx%08llx" @@ -2238,16 +2276,20 @@ msgstr "Exception handler - toegang onder geheugen ruimte. %08llx%08llx" msgid "Execute" msgstr "Uitvoeren" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Sluit" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exporteer alle Wii saves" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Exporteren Mislukt" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exporteer Bestand" @@ -2255,7 +2297,7 @@ msgstr "Exporteer Bestand" msgid "Export Recording" msgstr "Exporteer Opname..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exporteer Opname..." @@ -2263,7 +2305,7 @@ msgstr "Exporteer Opname..." msgid "Export Save" msgstr "Exporteer Save" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exporteer Wii save (Experimenteel)" @@ -2271,15 +2313,15 @@ msgstr "Exporteer Wii save (Experimenteel)" msgid "Export all saves" msgstr "Exporteer alle saves..." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Uitpakken is mislukt, opnieuw proberen?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Exporteren mislukt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exporteer save als..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extensie" @@ -2295,44 +2337,44 @@ msgstr "Extra Parameter" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Extra parameter, alleen nuttig in \"Metroid: Other M\"." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Alle Bestanden Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Apploader Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOL Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Map Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Bestand Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Partitie Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Alle Bestanden Uitpakken" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Uitpakken van de map" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Uitpakken..." @@ -2344,15 +2386,15 @@ msgstr "FIFO Byte" msgid "FIFO Player" msgstr "FIFO Speler" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "Frankrijk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST Groote:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Verbinden Mislukt!" @@ -2360,11 +2402,15 @@ msgstr "Verbinden Mislukt!" msgid "Failed to download codes." msgstr "Mislukt om de codes te downloaden." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Mislukt om naar %s uit te pakken!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2393,6 +2439,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Fout tijdens het laden van bthprops.cpl! Je kunt echte Wiimotes niet meer " +"verbinden en Dolphin kan onverwachts crashen!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2400,21 +2448,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Fout tijdens het laden van hid.dll! Je kunt echte Wiimotes niet meer " +"verbinden en Dolphin kan onverwachts crashen!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Kon geen data lezen van %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Mislukt om banner.bin te lezen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "bk header lezen mislukt" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2425,7 +2475,7 @@ msgstr "" "De geheugenkaart is wellicht afgeknot\\n\n" "BestandsPositie:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2433,7 +2483,7 @@ msgstr "" "Het lezen van de block allocation table backup is mislukt\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2441,17 +2491,17 @@ msgstr "" "Het lezen van de block allocation table is mislukt\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Mislukt om gegevens uit %d te lezen" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Kon geen data lezen van bestand: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2459,7 +2509,7 @@ msgstr "" "Het lezen van de map backup is mislukt\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2467,11 +2517,11 @@ msgstr "" "Het lezen van de map is mislukt\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Kon de header niet lezen" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2479,29 +2529,34 @@ msgstr "" "Het lezen van de header is mislukt\n" "(0x000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Kon de header niet lezen voor bestand %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Het lezen van de unieke ID van de schijf image is mislukt" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Het schrijven van BT.DINF naar SYSCONF is mislukt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Mislukt om te schrijven bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Kon geen data schrijven in bestand: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Het schrijven van header voor %s is mislukt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Het schrijven van header voor bestanden %d is mislukt" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2511,13 +2566,13 @@ msgstr "Snel" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Snelle Diepte Calculatie" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Snelle versie van de MMU. Werkt niet voor elk spel." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2525,7 +2580,7 @@ msgstr "" "Fatale desync. Terugspelen wordt geannuleerd. (Fout in SpeelWiimote: %u != " "%u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo Speler" @@ -2549,7 +2604,7 @@ msgstr "" "Bestand kon niet geopend worden\n" "of heeft geen valide extensie" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2562,20 +2617,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Bestand is niet herkend als geheugenkaart" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Bestand niet gecompressed" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Onbekende open mode: 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Bestand systeem" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Bestandstype 'ini' is onbekend! Kan niet openen!" @@ -2636,7 +2691,7 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2647,7 +2702,7 @@ msgstr "" "deze instelling automatisch aanzetten als je de Japanese versie van spellen " "speelt." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2661,13 +2716,18 @@ msgstr "Vooruit" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Poort forwarden (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "%d resulataten gevonden voor '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "%x saves gevonden" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2709,9 +2769,9 @@ msgstr "Frames om op te nemen" msgid "Free Look" msgstr "Vrije kijk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Frans" @@ -2724,7 +2784,7 @@ msgstr "Frets" msgid "From" msgstr "Van" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Volledig scherm" @@ -2736,7 +2796,7 @@ msgstr "Volledige Scherm Resolutie:" msgid "GCI File(*.gci)" msgstr "GCI Bestand(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GCPad" @@ -2744,27 +2804,27 @@ msgstr "GCPad" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Spel ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Het spel draait al!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Het spel draait niet!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Spel niet gevonden!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Spel Specifieke Instellingen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Spel Config" @@ -2781,20 +2841,20 @@ msgid "Gamecube &Pad Settings" msgstr "Gamecube &Pad Instellingen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Gamecube Memory Kaarten (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Gamecube Pad Instellingen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko Codes" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2817,26 +2877,26 @@ msgstr "Algemeen" msgid "General Settings" msgstr "Algemene Instellingen" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Duits" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Index is groter dan de grootte van de AR code lijst %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafische" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Grafische instellingen" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Grooter dan" @@ -2859,7 +2919,7 @@ msgstr "" "\n" "Bij geval van twijfel gemarkeerd laten." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grieks" @@ -2883,11 +2943,11 @@ msgstr "Gitaar" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Header checksum is mislukt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebreeuws" @@ -2899,7 +2959,7 @@ msgstr "Hoogte" msgid "Help" msgstr "Help" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2920,7 +2980,7 @@ msgstr "" "\n" "Sayonara!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2972,7 +3032,7 @@ msgstr "Sneltoets Configuratie" msgid "Hotkeys" msgstr "Hotkeys" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Hongaarse" @@ -2980,18 +3040,18 @@ msgstr "Hongaarse" msgid "Hybrid Wiimote" msgstr "Hybride Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Poging tot verkrijgen van data van een onbekende ticket: " "%08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -3000,15 +3060,15 @@ msgstr "" "TitleID %016llx.\n" "Dolphin zal waarschijnlijk blijven hangen." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - onjuiste bestemming" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL Instellingen" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3020,15 +3080,15 @@ msgstr "IR Aanwijzer" msgid "IR Sensitivity:" msgstr "IR Gevoeligheid:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO Details" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO Map" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIË" @@ -3036,7 +3096,7 @@ msgstr "ITALIË" msgid "Icon" msgstr "Icoon" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3080,9 +3140,13 @@ msgstr "" msgid "Import Save" msgstr "Importeer Save" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importeren is mislukt, opnieuw proberen?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importeer Wii save" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importeren mislukt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3104,21 +3168,16 @@ msgstr "" "Geimporteerd bestand heeft sav extension\n" "maar heeft geen juiste header" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "In Game" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "In-Game" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Framelimiet:" +msgstr "Verhoog framelimit" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3138,7 +3197,7 @@ msgstr "Toevoegen" msgid "Insert Encrypted or Decrypted code here..." msgstr "Voer Gecodeerde of Gedecodeerde code hier in..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Schakel SD Card in" @@ -3146,38 +3205,39 @@ msgstr "Schakel SD Card in" msgid "Insert name here.." msgstr "Voeg naam hier toe" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Installeer WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Installeren in Wii-menu" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler opgeroepen, maar dit platform ondersteund dit nog " "niet." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "WAD aan het installeren..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Integriteitscontrole Fout" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Integriteitscontrole afgerond" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Integriteitscontrole afgerond. Geen fouten gevonden." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3190,7 +3250,7 @@ msgstr "" msgid "Interface" msgstr "Interface Instellingen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Interface Instellingen" @@ -3215,20 +3275,20 @@ msgstr "Interne LZO fout - lzo_init() is mislukt" msgid "Internal Resolution:" msgstr "Interne Resolutie:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreteer (Behoorlijk langzaam)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Onjuiste grootte (%x) of Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Onjuiste waarde!" @@ -3236,16 +3296,16 @@ msgstr "Onjuiste waarde!" msgid "Invalid bat.map or dir entry" msgstr "Onjuiste bat.map of map vermelding" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Onjuist event type %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Onjuist bestand" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3256,7 +3316,7 @@ msgstr "" "%s\n" "Wellicht moet je dit spel opnieuw dumpen" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Onjuist opname bestand" @@ -3272,34 +3332,36 @@ msgstr "Ongeldige zoekopdracht (niet in staat naar nummers te converteren)" msgid "Invalid search string (only even string lengths supported)" msgstr "Ongeldige zoekopdracht (alleen even string lengte ondersteund)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Onjuiste staat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italië" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Recompiler (aanbevolen)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL experimentele recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japans" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3321,8 +3383,9 @@ msgstr "Houdt venster bovenop" msgid "Key" msgstr "Toets" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Koreaans" @@ -3344,12 +3407,12 @@ msgstr "L-Analoog" msgid "Language:" msgstr "Taal:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Laatste %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Wachttijd:" @@ -3388,7 +3451,7 @@ msgstr "" "Links / Rechts-klik voor meer opties.\n" "Midden-klik om te wissen." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Minder dan" @@ -3405,58 +3468,48 @@ msgid "Load Custom Textures" msgstr "Laad Aangepaste Textures" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Laad staat" +msgstr "Laad staat" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Laad staat 1" +msgstr "Laad laatste staat 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Laad staat 2" +msgstr "Laad laatste staat 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Laad staat 3" +msgstr "Laad laatste staat 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Laad staat 4" +msgstr "Laad laatste staat 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Laad staat 5" +msgstr "Laad laatste staat 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Laad staat 6" +msgstr "Laad laatste staat 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Laad staat 7" +msgstr "Laad laatste staat 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Laad staat 8" +msgstr "Laad laatste staat 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Laad staat 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Laad staat 1" +msgstr "Laad staat 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3487,19 +3540,18 @@ msgid "Load State Slot 8" msgstr "Laad staat 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Laad staat 1" +msgstr "Laad staat 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Laad staat..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Laad Wii System Menu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Laad Wii System Menu %d%c" @@ -3518,10 +3570,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Laad vooraf ingestelde waardes van de beschikbare hack patronen." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Lokaal" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Logboek" @@ -3554,12 +3602,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Logger Uitvoer" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Logboek Bijhouden" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Verbinding met de server verloren!" @@ -3567,7 +3615,7 @@ msgstr "Verbinding met de server verloren!" msgid "M Button" msgstr "M Knop" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3576,7 +3624,7 @@ msgstr "" "Verkeerde MD5\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Snelheids Hack" @@ -3590,11 +3638,11 @@ msgstr "MadCatz Gameshark bestanden(*.gcs)" msgid "Main Stick" msgstr "Hoofd Knuppel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Maker ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Maker:" @@ -3630,7 +3678,7 @@ msgid "Memory Byte" msgstr "Geheugen Byte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Geheugen Kaart" @@ -3642,7 +3690,7 @@ msgstr "" "Geheugenkaart Manager Waarschuwing - Maak backups voor gebruik, het zou " "moeten werken" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3659,7 +3707,7 @@ msgstr "" "%s\n" "Wil je de oude bestanden naar de nieuwe lokatie kopiëren?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" "Het formaat van de geheugenkaart komt niet overeen met het formaat van de " @@ -3669,7 +3717,7 @@ msgstr "" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Microfoon" @@ -3682,7 +3730,7 @@ msgstr "Min" msgid "Misc" msgstr "Overig" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Overige Instellingen" @@ -3707,11 +3755,11 @@ msgstr "" msgid "Monospaced font" msgstr "Niet-proportioneel (monospace) lettertype" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3831,15 +3879,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Omhoog" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Naam:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Naam:" @@ -3849,7 +3897,7 @@ msgstr "Naam:" msgid "Native GCI files(*.gci)" msgstr "Native GCI-bestanden (*. GCI)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nieuwe Scan" @@ -3858,7 +3906,7 @@ msgstr "Nieuwe Scan" msgid "Next Page" msgstr "Volgende Pagina" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Volgende Scan" @@ -3866,11 +3914,11 @@ msgstr "Volgende Scan" msgid "Nickname :" msgstr "Gebruikersnaam :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Geen land (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Geen ISOs of WADS gevonden." @@ -3878,7 +3926,7 @@ msgstr "Geen ISOs of WADS gevonden." msgid "No audio output" msgstr "Geen audio output" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Geen banner gevonden voor titel %s" @@ -3904,43 +3952,44 @@ msgstr "Geen vrije map indexes" msgid "No recorded file" msgstr "Geen opgenomen bestand" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Geen save map gevonden voor titel %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Geen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Noorweegse Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Niet gelijk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Niet ingesteld" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Geen Wii save of het lezen van de grootte van bestandsheader %x is mislukt" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Niet verbonden" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Opmerkingen" @@ -3961,7 +4010,7 @@ msgstr "Opmerkingen" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Aantal Codes:" @@ -3982,7 +4031,7 @@ msgstr "Object" msgid "Object Range" msgstr "Object Bereik" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Uit" @@ -3994,25 +4043,29 @@ msgstr "Afstand:" msgid "On-Screen Display Messages" msgstr "In-Scherm Berichtgeving" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online & Documentatie" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Er zijn maar %d blocks beschikaarr" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Open" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Open &bevattende map" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Open Wii &save map" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Open Bestand..." @@ -4038,7 +4091,15 @@ msgstr "OpenCL Texture Decoder" msgid "OpenMP Texture Decoder" msgstr "OpenMP Texture Decoder" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Opent de standaard (alleen lezen) configuratie voor deze spel in een externe " +"tekst editor." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opties" @@ -4048,7 +4109,6 @@ msgid "Orange" msgstr "Oranje" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -4064,7 +4124,7 @@ msgstr "" msgid "Other" msgstr "Overige" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4076,15 +4136,15 @@ msgstr "" msgid "Output" msgstr "Uitgang" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Opname afspelen" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad" @@ -4108,17 +4168,17 @@ msgstr "Paragraaf" msgid "Parameters" msgstr "Parameters" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partitie %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Patitie bestaat niet: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patches" @@ -4126,8 +4186,8 @@ msgstr "Patches" msgid "Paths" msgstr "Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pauze" @@ -4140,7 +4200,7 @@ msgstr "Pauze aan het eind van de film" msgid "Per-Pixel Lighting" msgstr "Per-Pixel Belichting" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfect" @@ -4150,9 +4210,9 @@ msgid "Perspective %d" msgstr "Perspectief %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Speel" @@ -4164,7 +4224,7 @@ msgstr "Speel Opname" msgid "Play/Pause" msgstr "Spel/Pauze" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Speelbaar" @@ -4172,11 +4232,11 @@ msgstr "Speelbaar" msgid "Playback Options" msgstr "Terugspeel Opties" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Spelers" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Bevestig alsjeblieft..." @@ -4188,23 +4248,23 @@ msgstr "Maak een perspectief voor het opslaan" msgid "Plus-Minus" msgstr "Ongeveer" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Pools" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Poort 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Poort 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Poort 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Poort 4" @@ -4213,11 +4273,11 @@ msgstr "Poort 4" msgid "Port :" msgstr "Poort :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugees" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugees (Braziliaans)" @@ -4225,17 +4285,17 @@ msgstr "Portugees (Braziliaans)" msgid "Post-Processing Effect:" msgstr "Post-Processing Effect:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Vroegtijdige beeïndiging van filmpje in PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Vroegtijdige beeïndiging van filmpje in PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Vroegtijdige beeïndiging van filmpje in PlayWiimote. %u > %u" @@ -4252,7 +4312,7 @@ msgstr "Vorige Pagina" msgid "Previous Page" msgstr "Vorige Pagina" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Vorige waarden" @@ -4268,7 +4328,7 @@ msgstr "Profiel" msgid "Properties" msgstr "Eigenschappen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Cache leegmaken" @@ -4277,7 +4337,7 @@ msgid "Question" msgstr "Vraag" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Stoppen" @@ -4299,13 +4359,13 @@ msgstr "R-Analoog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSLAND" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radius" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4321,7 +4381,7 @@ msgstr "Echt" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Echte Balance Board" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4338,6 +4398,10 @@ msgstr "Echte Wiimotes" msgid "Record" msgstr "Speel Opnemen" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Neem input op" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Opname Informatie" @@ -4373,7 +4437,7 @@ msgstr "" "In geval van twijfel selecteer Geen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Ververs" @@ -4382,14 +4446,14 @@ msgstr "Ververs" msgid "Refresh List" msgstr "Lijst Verversen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Ververs de speellijst" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Verwijder" @@ -4413,7 +4477,7 @@ msgstr "Geef weer op hoofdscherm" msgid "Reset" msgstr "Opnieuw" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultaten" @@ -4421,9 +4485,9 @@ msgstr "Resultaten" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisie:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4434,20 +4498,19 @@ msgstr "Rechts" msgid "Right Stick" msgstr "Rechter Stick" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Rumble" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Zet DSP HLE en LLE op een toegeweide thread (niet aangeraden omdat het audio " -"problemen kan veroorzaken met HLE en freezes met LLE)." +"Zet DSP LLE op een toegeweide thread (niet aangeraden omdat het freezes kan " +"veroorzaken)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russisch" @@ -4460,7 +4523,7 @@ msgid "Safe" msgstr "Betrouwbaar" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Opslaan" @@ -4470,23 +4533,20 @@ msgid "Save GCI as..." msgstr "Sla GCI op als..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "S&la Staat Op" +msgstr "Sla oudste staat op" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "S&la Staat Op" +msgstr "Sla staat op" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Sla Staat 1 Op" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Sla Staat 1 Op" +msgstr "Sla Staat 10 op" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4517,32 +4577,31 @@ msgid "Save State Slot 8" msgstr "Sla Staat 8 Op" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Sla Staat 1 Op" +msgstr "Sla Staat 9 op" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Sla staat op als..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Opslaan als..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Sla gecomprimeerde GCM / ISO op" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Sla huidige perspectief op" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Sla gedecomprimeerd GCM / ISO op" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Save staat film %s is corrupt, het opnemen van de film is gestopt..." @@ -4551,20 +4610,20 @@ msgstr "Save staat film %s is corrupt, het opnemen van de film is gestopt..." msgid "Scaled EFB Copy" msgstr "Geschaalde EFB Kopie" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Scannen van %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Scannen voor ISO's" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Scannen..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ScrShot" @@ -4576,11 +4635,11 @@ msgstr "Scroll Slot" msgid "Search" msgstr "Zoeken" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Zoekfilter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Zoeken in submappen" @@ -4603,12 +4662,12 @@ msgstr "Sectie %s niet gevonden in SYSCONF" msgid "Select" msgstr "Selecteer" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Selecteer de opname Bestand" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Selecteer een Wii WAD bestand om te installeren" @@ -4630,19 +4689,19 @@ msgstr "Selecteer een save file om te importeren" msgid "Select floating windows" msgstr "Selecteer zwevende vensters" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Selecteer het bestand om het te laden" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Selecteer het save - bestand" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Selecteer de Staat om te laden" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Selecteer de Staat om op te slaan" @@ -4662,7 +4721,7 @@ msgstr "" "Force 4:3: Strek de afbeelding naar een beeldverhouding van 4:3\n" "Stretch naar het venster: Stretch de afbeelding naar je venster grootte." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Geselecteerd controller profiel bestaat niet" @@ -4687,39 +4746,28 @@ msgstr "" "In geval van twijfel, gebruik je desktop resolutie. \n" "Als je nog steeds twijfelt, gebruik de hoogste resolutie die voor jou werkt." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Selecteer de intern te gebruiken grafische API.\n" -"Direct3D 9 is meestal de snelste. OpenGL is echter nauwkeuriger. Direct3D 11 " -"zit ergens tussenin.\n" -"Let erop dat de Direct3D backends alleen op Windows beschikbaar zijn.\n" -"\n" -"In geval van twijfel gebruik Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Selecteer de intern te gebruiken grafische API.\n" -"Direct3D 9 is meestal de snelste. OpenGL is echter nauwkeuriger. Direct3D 11 " -"zit ergens tussenin.\n" -"Let erop dat de Direct3D backends alleen op Windows beschikbaar zijn.\n" -"\n" -"In geval van twijfel gebruik OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Verzend" @@ -4731,17 +4779,17 @@ msgstr "Sensor Bar Positie:" msgid "Separator" msgstr "Scheidingsteken" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Servisch" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Serial Port 1 - Dit is de poort die apparaten zoals de net-adapter gebruiken" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Ingesteld als &standaard ISO" @@ -4750,7 +4798,7 @@ msgstr "Ingesteld als &standaard ISO" msgid "Set as default Memcard %c" msgstr "Ingesteld als standaard memcard% c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4764,19 +4812,19 @@ msgstr "" "Zet de wachttijd (in ms). Hogere waarden kunnen krakende audio verminderen. " "Alleen voor OpenAL instellingen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Instellingen..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Kan het instellingen bestand niet vinden" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Kan het instellingen bestand niet aanmaken" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Schudden" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Korte Naam:" @@ -4784,23 +4832,27 @@ msgstr "Korte Naam:" msgid "Shoulder Buttons" msgstr "Schouder Knoppen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Toon &Console" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Toon &Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Toon &Statusbar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Toon &Toolbar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Toon standaarden" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Toon Schijven" @@ -4812,11 +4864,11 @@ msgstr "Weergeef EFB Kopie Regios" msgid "Show FPS" msgstr "Toon FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Toon Frans" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Toon Gamecube" @@ -4824,35 +4876,35 @@ msgstr "Toon Gamecube" msgid "Show Input Display" msgstr "Toon Input Venster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Toon Italië" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Toon JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Toon Korea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Toon Taal:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Bekijk Log &Configuratie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Toon PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Toon Platformen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Toon Regio" @@ -4860,27 +4912,27 @@ msgstr "Toon Regio" msgid "Show Statistics" msgstr "Weergeef statistieken" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Toon Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Toon USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Toon Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Toon Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Toon een bevestigingsvenster voordat u stopt met een spel." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4898,7 +4950,7 @@ msgstr "Toon eerste blok" msgid "Show lag counter" msgstr "Toon vertragingsteller" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4936,7 +4988,7 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Toon onbekend" @@ -4950,23 +5002,24 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Zijdelings Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Vereenvoudigd Chinees" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Grootte" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Sla BIOS Over" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Sla het legen van DCBZ over" @@ -4991,17 +5044,17 @@ msgstr "" "\n" "Bij geval van twijfel ongemarkeerd laten." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -5009,7 +5062,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Snapshot" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Software Weergever" @@ -5025,27 +5078,27 @@ msgstr "" "Weet je zeker dat je software rendering aan wil zetten? In geval van " "twijfel, selecteer 'Nee'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Geluids Instellingen" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Geluids backend %s is niet juist." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Het aanmaken van de geluids buffer is mislukt: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Ruimte" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spaans" @@ -5073,37 +5126,29 @@ msgstr "" "\n" "In geval van twijfel selecteer 640x528" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Versnel Disc Transfer Rate" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Vierkante knuppel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standaard Controller" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Start &netplay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Start Op&nemen" @@ -5111,7 +5156,7 @@ msgstr "Start Op&nemen" msgid "Start Recording" msgstr "Start Opnemen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Staat" @@ -5119,7 +5164,7 @@ msgstr "Staat" msgid "State Saves" msgstr "Opgeslage Staten" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Stuurwiel" @@ -5128,7 +5173,7 @@ msgid "Stick" msgstr "Knuppel" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Stop" @@ -5159,28 +5204,28 @@ msgstr "Strum" msgid "Subtract" msgstr "Onttrekken " -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Bestand succesvol gexporteerd naar %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Succesvol save games geimporteerd" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Zweeds" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Zwaai" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synchroniseer GPU thread" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5188,12 +5233,13 @@ msgstr "" "Synchroniseert de GPU en CPU threads om willekeurige freezes te voorkomen in " "Dual Core modus. (Aan = Compatibel, Uit = Snel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Systeem Taal:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5218,13 +5264,13 @@ msgstr "Linker Tabel" msgid "Table Right" msgstr "Rechter Tabel" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Neem een Schermafdruk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5244,11 +5290,11 @@ msgstr "Texture Cache" msgid "Texture Format Overlay" msgstr "Texture Formaat Overlay" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "De WAD is succesvol geinstalleerd" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Het adres is onjuist" @@ -5256,13 +5302,13 @@ msgstr "Het adres is onjuist" msgid "The checksum was successfully fixed" msgstr "De checksum was met succes gefixt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "De gekozen map is al in de lijst" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5286,7 +5332,7 @@ msgid "The file %s was already open, the file header will not be written." msgstr "" "Het bestand %s was al open, de bestands header zal niet worden weggeschreven." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Het opgegeven bestand(%s) bestaat niet" @@ -5321,7 +5367,7 @@ msgstr "" "Het save bestand dat je probeert te kopiëren heeft een onjuiste bestands " "grootte" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5329,36 +5375,36 @@ msgstr "" "De geselecteerde taal wordt niet door je systeem ondersteund. Dolphin zal " "terugvallen op je systeems taal." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "De NetPlay versie van de server en client zijn incompatibel!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "De server is vol!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "De server reageerde: het spel draait al!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "De server verstuurde een onbekende foutmelding!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Het opgegeven bestand \"%s\" bestaat niet" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "De waarde is onjuist" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Thema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5366,7 +5412,7 @@ msgstr "" "Er moet een ticket zijn voor 00000001/00000002. Je NAND dump is " "waarschijnlijk incompleet." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5374,7 +5420,7 @@ msgstr "" "Deze instellingen overschrijven interne Dolphin instellingen.\n" "Onbepaald betekent dat het spel maakt gebruik van Dolphin's instellingen." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5382,7 +5428,7 @@ msgstr "" "Deze action replay simulator ondersteund geen codes die de Action Replay " "zelf aanpassen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Dit kan leiden tot vertraging van het Wii-menu en een aantal games." @@ -5405,20 +5451,19 @@ msgstr "" "\\n\n" "Bij twijfel, ongeselecteerd laten." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Als je de Framelimiet hoger zet dan de snelheid van het spel (NTSC: 60, PAL: " -"50). Gebruik de Audio om te versnellen met behulp van DSP (kan het klikkend " -"geluid verhelpen, maar kan ook constant lawaai ten gevolge hebben, " -"afhankelijk van welk spel gebruikt wordt)." +"Dit limiteert de emulatie snelheid naar de gespecificeerde frames per " +"seconde. (NTSC: 60, PAL: 50). Gebruik Audio om het te limiteren met behulp " +"van de DSP (kan het klikkend geluid verhelpen, maar kan ook constant lawaai " +"ten gevolge hebben, afhankelijk van welk spel gespeelt wordt)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5430,7 +5475,7 @@ msgstr "" "Leidt tot grote snelheid verbeteringen op pc's met meer dan een kern, maar " "kan ook leiden tot crashes / glitches zo nu en dan." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Dit laat je handmatig het INI configuratie bestand wijzigen" @@ -5439,12 +5484,12 @@ msgstr "Dit laat je handmatig het INI configuratie bestand wijzigen" msgid "Threshold" msgstr "Drempelwaarde" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Kantelen" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Titel" @@ -5458,39 +5503,37 @@ msgid "Toggle All Log Types" msgstr "Zet Alle Log Types Aan" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Beeldverhouding:" +msgstr "Schakel beeldverhouding" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Regio kopie" +msgstr "Schakel EFB kopieën" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Zet Alle Log Types Aan" +msgstr "Schakel fog" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Volledig Scherm Inschakelen" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Schakel IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Boven" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chinees (Traditioneel)" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Poging tot het laden van een onbekend bestands type." @@ -5510,7 +5553,7 @@ msgstr "" "Poging tot het inlezen van een ongeldige SYSCONF\n" "Wiimote bt ids zijn niet beschikbaar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turks" @@ -5526,12 +5569,12 @@ msgstr "Type" msgid "UDP Port:" msgstr "UDP Port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ONBEKEND" @@ -5540,7 +5583,7 @@ msgstr "ONBEKEND" msgid "UNKNOWN_%02X" msgstr "ONBEKEND_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5553,9 +5596,9 @@ msgstr "" "Entry niet aangepast." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5564,7 +5607,7 @@ msgstr "" "manier hebt ingevoerd. \n" "Wil je deze regel negeren en verder gaan met verwerken?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Onbepaalde %i" @@ -5574,19 +5617,18 @@ msgid "Undo Load State" msgstr "Ongedaan maken van Load staat" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Ongedaan maken van Load staat" +msgstr "Save staat ongedaan maken" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Onverwachtte 0x80 fout? Annuleren..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Onbekend" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Onbekend DVD commando %08x - fatale fout" @@ -5601,12 +5643,12 @@ msgstr "Onbekende commando 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Onbekende vermeldingstype %i in SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Onbekend bericht ontvangen met id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5618,16 +5660,16 @@ msgstr "" msgid "Up" msgstr "Omhoog" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Update" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote rechtop" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Gebruik EuRGB60 Mode (PAL60)" @@ -5635,7 +5677,7 @@ msgstr "Gebruik EuRGB60 Mode (PAL60)" msgid "Use Fullscreen" msgstr "Gebruik &Volledig Scherm" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Gebruik Hex" @@ -5650,6 +5692,10 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Gebruikt een minder accurate algoritme om de diepte waardes te calculeren.\n" +"Kan problemen in een paar spellen geven, maar geeft een redelijke speedup.\n" +"\n" +"In geval van twijfel leeg laten." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5663,6 +5709,20 @@ msgstr "" "\n" "In geval van twijfel ongemarkeerd laten." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Gebruikt onveilige operaties om de vertex streaming te versnellen in OpenGL. " +"Er zijn geen problemen op ondersteunde GPU's, maar het kan voor " +"stabiliteits- en grafische problemen zorgen.\n" +"\n" +"In geval van twijfel leeg laten." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5685,12 +5745,11 @@ msgstr "Hulpprogramma" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Snelheids Hack" +msgstr "VBeam Speed Hack" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Waarde" @@ -5698,7 +5757,7 @@ msgstr "Waarde" msgid "Value:" msgstr "Waarde:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Waarde:" @@ -5708,9 +5767,9 @@ msgstr "Breedsprakigheid" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Vertex Streaming Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video" @@ -5718,17 +5777,17 @@ msgstr "Video" msgid "Virtual" msgstr "Virtueel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volume" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD installatie mislukt: fout bij het creëren van %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD installatie mislukt: fout bij het creëren van ticket" @@ -5750,19 +5809,19 @@ msgstr "" msgid "Warning" msgstr "Waarschuwing" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Waarschuwing - DOL wordt in de verkeerde console mode gestart!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Waarschuwing - ELF wordt in de verkeerde console mode gestart!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Waarschuwing - ISO wordt in de verkeerde console mode gestart!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5787,7 +5846,7 @@ msgstr "" "en heeft dezelfde naam als een bestand op je geheugenkaart\n" "Doorgaan?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5798,7 +5857,7 @@ msgstr "" "> %u) (frame %u > %u). Je dient een andere save te laden voordat je verder " "gaat, of deze staat laden met alleen-lezen uitgeschakeld. " -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5810,7 +5869,7 @@ msgstr "" "of deze staat laden met alleen-lezen uitgeschakeld. Anders zullen er " "waarschijnlijk synchronisatie problemen optreden. " -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5866,19 +5925,15 @@ msgstr "Breedte" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii Console " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND basismap:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wii Save Importeren" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii save bestanden (*.bin)|*.bin" @@ -5887,16 +5942,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Kon het bestand niet lezen" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote Connected" @@ -5904,7 +5965,7 @@ msgstr "Wiimote Connected" msgid "Wiimote Motor" msgstr "Wiimote Motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote instellingen" @@ -5928,16 +5989,16 @@ msgstr "Venster Rechts" msgid "Word Wrap" msgstr "Regelafbreking" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Werken..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Schrijf memcards (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5955,21 +6016,36 @@ msgstr "Schrijf naar Bestand" msgid "Write to Window" msgstr "Schrijf naar venster" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice is mislukt: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 initialisatie mislukt: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 master voice creatie mislukt: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice is mislukt: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 initialisatie mislukt: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 master voice creatie mislukt: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF Reg" @@ -6004,11 +6080,11 @@ msgstr "U kunt geen panelen sluiten die paginas bevatten." msgid "You must choose a game!!" msgstr "Je moet een spel kiezen!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Je moet een naam invoeren!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Je moet een juiste decimale, hexadecimale of octale waarde opgeven" @@ -6016,7 +6092,7 @@ msgstr "Je moet een juiste decimale, hexadecimale of octale waarde opgeven" msgid "You must enter a valid profile name." msgstr "Je moet een geldige profiel naam invoeren!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Je moet Dolphin herstarten voordat deze optie effect zal hebben." @@ -6030,7 +6106,7 @@ msgstr "" "Wil je nu stoppen om het probleem op te lossen?\n" "Als je \"Nee\" selecteert kan het geluid vervromd klinken." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6049,15 +6125,15 @@ msgstr "" "Het zou 0x%04x moet zijn, maar is 0x%04llx \n" "Wil je een nieuwe genereren?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 code niet ondersteund" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero code onbekend voor Dolphin: %08x" @@ -6115,20 +6191,24 @@ msgstr "" "\n" "In geval van twijfel leeg laten." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "applader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Lezen van Opcode vanaf %x. Graag rapporteren." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "onbekende flavor %d (verwacht %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "onbekende bericht ontvangen" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute retourneerde -1 bij het draaien van de applicatie!" @@ -6144,75 +6224,49 @@ msgstr "zDichtbij correctie:" msgid "| OR" msgstr "| OF" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Nauwkeurige VBeam emulatie" +#~ msgid "Could not create %s" +#~ msgstr "Het volgende bestanden kon niet gemaakt worden %s " + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Wijzig lokale overschrijvingen" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Opent de gebruiker gespecificeerde overschrijvingen in een externe tekst " +#~ "editor." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Laat wisseling van sommige opties toe via de sneltoetsen 3 (Interne " -#~ "Resolutie ), 4 (Beeldverhouding), 5 (copy EFB) en 6 (Mist) binnen het " -#~ "emulatie venster.\\n\n" -#~ "\\n\n" -#~ "Bij twijfel, ongeselecteerd laten." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Kan Wiimote niet vinden op bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Activeer Sneltoetsen" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Luisteren Mislukt!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Kon bthprops.cpl niet laden" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Mislukt om hid.dll te laden" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic configuratie" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY is opgeroepen, rapport dit alstubliefst!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Gehackte Buffer Upload" +#~ "Selecteer de intern te gebruiken grafische API.\n" +#~ "Direct3D 9 is meestal de snelste. OpenGL is echter nauwkeuriger. Direct3D " +#~ "11 zit ergens tussenin.\n" +#~ "Let erop dat de Direct3D backends alleen op Windows beschikbaar zijn.\n" +#~ "\n" +#~ "In geval van twijfel gebruik Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Als de FPS onregelmatig is dan kan deze optie helpen. (AAN = Veilig, UIT " -#~ "= Snel)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Laatste Overgeschreven Staat" - -#~ msgid "Last Saved State" -#~ msgstr "Laatste Opgeslagen Staat" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Herverbind Wiimote bij Staat Laden" - -#~ msgid "Set" -#~ msgstr "Stel" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Sla Dest. Alpha Pass over" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Gebruik een gehackte upload strategy om vertices te streamen.\n" -#~ "Dit verhoogt meestal de emulatie snelheid, maar is verboden door de " -#~ "OpenGL specificaties en kan glitches veroorzaken.\n" +#~ "Selecteer de intern te gebruiken grafische API.\n" +#~ "Direct3D 9 is meestal de snelste. OpenGL is echter nauwkeuriger. Direct3D " +#~ "11 zit ergens tussenin.\n" +#~ "Let erop dat de Direct3D backends alleen op Windows beschikbaar zijn.\n" #~ "\n" -#~ "In geval van twijfel laat dit uitgevinkt." +#~ "In geval van twijfel gebruik OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Lezen van Opcode vanaf %x. Graag rapporteren." diff --git a/Languages/po/pl.po b/Languages/po/pl.po index 14edac3371..03910ce86b 100644 --- a/Languages/po/pl.po +++ b/Languages/po/pl.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-18 20:46+0000\n" -"Last-Translator: Baszta \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Polish (http://www.transifex.com/projects/p/dolphin-emu/" "language/pl/)\n" "Language: pl\n" @@ -21,13 +21,13 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(za dużo do wyÅ›wietlenia)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Gra :" @@ -35,7 +35,7 @@ msgstr "Gra :" msgid "! NOT" msgstr "! NOT" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -44,7 +44,7 @@ msgstr "" "\"%s\" nie istnieje.\n" "Stworzyć nowÄ… 16MB kartÄ™ pamiÄ™ci?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -61,29 +61,29 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopiuj%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d próbki" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d próbki (poziom jakoÅ›ci %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s już istnieje, zastÄ…pić?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "" "Oczyszczanie %s nie powiodÅ‚o siÄ™. Obraz prawdopodobnie jest uszkodzony." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -92,7 +92,7 @@ msgstr "" "Wczytanie %s jako karty pamiÄ™ci nie powiodÅ‚o siÄ™\n" "NiewÅ‚aÅ›ciwa wielkość pliku (0x%x bajtów)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -101,7 +101,7 @@ msgstr "" "Wczytanie %s jako karty pamiÄ™ci nie powiodÅ‚o siÄ™\n" "NiewÅ‚aÅ›ciwa wielkość karty (0x%x bajtów)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -111,22 +111,27 @@ msgstr "" "Plik nie jest wystarczajÄ…cej wielkoÅ›ci by być poprawnym plikiem karty " "pamiÄ™ci (0x%x bajtów)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "Nie można otworzyć %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s jest plikiem o wadze 0 bajtów" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s jest już skompresowany! Bardziej siÄ™ nie da." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "Nazwa pliku %s jest zbyt dÅ‚uga, max 45 znaków" @@ -155,7 +160,7 @@ msgstr "%u wolnych bloków; %u wolnych wejść katalogowych" msgid "&& AND" msgstr "&& AND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&O programie..." @@ -163,7 +168,7 @@ msgstr "&O programie..." msgid "&Boot from DVD Drive..." msgstr "&ZaÅ‚aduj z napÄ™du DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Breakpointy" @@ -171,7 +176,7 @@ msgstr "&Breakpointy" msgid "&Browse for ISOs..." msgstr "&ZaÅ‚aduj z ISO..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Menadżer cheatów" @@ -179,11 +184,11 @@ msgstr "&Menadżer cheatów" msgid "&DSP Settings" msgstr "&Ustawienia DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&UsuÅ„ ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&UsuÅ„ wybrane ISO..." @@ -195,11 +200,11 @@ msgstr "&Emulacja" msgid "&File" msgstr "&Plik" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Wyprzedzanie klatek" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&PeÅ‚ny ekran" @@ -207,7 +212,7 @@ msgstr "&PeÅ‚ny ekran" msgid "&Graphics Settings" msgstr "&Ustawienia graficzne" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Pomoc" @@ -215,7 +220,7 @@ msgstr "&Pomoc" msgid "&Hotkey Settings" msgstr "Ustawienia &hotkey'ów" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -227,11 +232,11 @@ msgstr "&Wczytaj stan" msgid "&Memcard Manager (GC)" msgstr "&Menadżer karty pamiÄ™ci (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Pamięć" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Otwórz..." @@ -239,51 +244,51 @@ msgstr "&Otwórz..." msgid "&Options" msgstr "&Opcje" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Wstrzymaj" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Graj" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&WÅ‚aÅ›ciwoÅ›ci" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "Tryb &Tylko do odczytu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&OdÅ›wież listÄ™" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Rejestry" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&DźwiÄ™k" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Stop" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&NarzÄ™dzia" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Wideo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Widok" @@ -291,7 +296,7 @@ msgstr "&Widok" msgid "&Wiimote Settings" msgstr "&Ustawienia Wiilota" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -316,9 +321,8 @@ msgid "(off)" msgstr "(wyÅ‚Ä…czone)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -328,7 +332,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x Native (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bitów" @@ -344,7 +348,7 @@ msgstr "2.5x Native (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x Native (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bity" @@ -360,7 +364,7 @@ msgstr "3x Native (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x Native (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bitów" @@ -372,7 +376,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -380,7 +384,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -389,12 +393,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Okno NetPlay jest już otwarte!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Gra nie jest aktualnie uruchomiona." @@ -407,7 +411,6 @@ msgstr "" "Należy rÄ™cznie podÅ‚Ä…czyć Wiiloty." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -416,37 +419,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"Uwaga:\n" -"\n" -"NetPlay obecnie dziaÅ‚a poprawnie z podanymi ustawieniami:\n" -" - 2 rdzenie [OFF]\n" -" - Audio Throttle [OFF]\n" -" - DSP-HLE z \"Null Audio\" lub DSP-LLE\n" -" - RÄ™czne ustawienie iloÅ›ci kontrolerów używajÄ…c [Kontroler standardowy]\n" -"\n" -"Wszyscy gracze powinni używać tej samej wersji programu oraz ustawieÅ„.\n" -"WyÅ‚Ä…cz wszystkie karty pamiÄ™ci lub wyÅ›lij je do wszystkich graczy przed " -"rozpoczÄ™ciem.\n" -"Wsparcie dla Wiilota nie zostaÅ‚o jeszcze zaimplementowane.\n" -"\n" -"Wymagane jest przekierowanie portu TCP do hosta!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Kody AR" @@ -494,7 +482,7 @@ msgstr "" "Kod:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -502,7 +490,7 @@ msgstr "" "BÅ‚Ä…d Action Replay: NiewÅ‚aÅ›ciwy rozmiar (%08x : address = %08x) w Add Code " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -511,7 +499,7 @@ msgstr "" "BÅ‚Ä…d Action Replay: NiewÅ‚aÅ›ciwy rozmiar (%08x : address = %08x) w Fill and " "Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -520,7 +508,7 @@ msgstr "" "BÅ‚Ä…d Action Replay: NiewÅ‚aÅ›ciwy rozmiar (%08x : address = %08x) w Ram Write " "And Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -529,12 +517,12 @@ msgstr "" "BÅ‚Ä…d Action Replay: NiewÅ‚aÅ›ciwy rozmiar (%08x : address = %08x) w Write To " "Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "BÅ‚Ä…d Action Replay: NiewÅ‚aÅ›ciwa wartość (%08x) w Memory Copy (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -544,27 +532,27 @@ msgstr "" "zaimplementowane (%s)\n" "Master kody nie sÄ… potrzebne. Nie używaj master kodów." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "BÅ‚Ä…d Action Replay: niewÅ‚aÅ›ciwa linia kodu AR: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Conditional Code: NiewÅ‚aÅ›ciwy rozmiar %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: NiewÅ‚aÅ›ciwy typ Normal Code %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Code %i: NiewÅ‚aÅ›ciwy podtyp %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Code 0: NiewÅ‚aÅ›ciwy podtyp %08x (%s)" @@ -578,11 +566,11 @@ msgstr "Adapter:" msgid "Add" msgstr "Dodaj" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Dodaj kod ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Dodaj Å‚atkÄ™" @@ -590,9 +578,9 @@ msgstr "Dodaj Å‚atkÄ™" msgid "Add new pane" msgstr "Dodaj nowy panel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Dodaj..." @@ -648,32 +636,32 @@ msgstr "Zaawansowane" msgid "Advanced Settings" msgstr "Ustawienia zaawansowane" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Wszystkie pliki GC/Wii (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Wszystkie obrazy GC/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Pliki GCM" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Stany zapisu (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Wszystkie obrazy Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Spakowane obrazy GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Wszystkie pliki (*.*)|*.*" @@ -693,19 +681,19 @@ msgstr "Filtrowanie anizotropowe:" msgid "Anti-Aliasing:" msgstr "Antyaliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader niewÅ‚aÅ›ciwego rozmiaru... Czy to rzeczywiÅ›cie apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader nie mógÅ‚ wczytać z pliku" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Zastosuj" @@ -719,7 +707,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, wybierz (wyÅ‚Ä…czone)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabski" @@ -728,7 +716,7 @@ msgstr "Arabski" msgid "Are you sure you want to delete \"%s\"?" msgstr "Czy jesteÅ› pewny by usunÄ…c \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -736,15 +724,20 @@ msgstr "" "Czy jesteÅ› pewny by usunÄ…c te pliki?\n" "PrzepadnÄ… na zawsze!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Czy jesteÅ› pewny by usunÄ…c ten plik? Przepadnie na zawsze!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (eksperymentalne)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (eksperymentalne)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Proporcje ekranu:" @@ -753,12 +746,12 @@ msgstr "Proporcje ekranu:" msgid "At least one pane must remain open." msgstr "Przynajmniej jeden panel musi pozostać otwarty." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Audio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Audio Backend :" @@ -766,7 +759,7 @@ msgstr "Audio Backend :" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: BÅ‚Ä…d otwarcia urzÄ…dzenia AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -805,16 +798,16 @@ msgstr "BP rejestr" msgid "Back" msgstr "Wstecz" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Ustawienia Backend'u" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend :" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "WejÅ›cie w tle" @@ -823,7 +816,7 @@ msgstr "WejÅ›cie w tle" msgid "Backward" msgstr "W tyÅ‚" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "ZÅ‚y nagłówek pliku" @@ -832,15 +825,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Baner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Szczegóły banera" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Baner:" @@ -860,7 +853,7 @@ msgstr "Ustawienia podstawowe" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Suma kontrolna Block Allocation Table nie powiodÅ‚a siÄ™" @@ -881,7 +874,7 @@ msgid "Blue Right" msgstr "Niebieski prawo" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Dół" @@ -890,27 +883,27 @@ msgstr "Dół" msgid "Bound Controls: %lu" msgstr "Bound Controls: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Zepsuty" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Szukaj" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Szukaj folder do dodania" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Szukaj folder ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Szukaj folderu wyjÅ›ciowego" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Bufor:" @@ -920,7 +913,7 @@ msgstr "Bufor:" msgid "Buttons" msgstr "Przyciski" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -965,33 +958,33 @@ msgstr "" "Zazwyczaj bezpieczne ulepszenie, ale czasami może powodować bÅ‚Ä™dy.\\nW razie " "wÄ…tpliwoÅ›ci, pozostaw wÅ‚Ä…czone." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Nie można odnaleźć Wiilota przez handle poÅ‚Ä…czenia %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Nie można odczytać z wtyczki DVD - Interfejs DVD: Poważny bÅ‚Ä…d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Anuluj" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Nie moża otworzyć %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Nie można wyrejestrować zdarzeÅ„ podczas ich wykonywania" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1002,7 +995,7 @@ msgstr "" "%s\n" "nie jest wÅ‚aÅ›ciwym plikiem karty pamiÄ™ci GC" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1014,7 +1007,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "KataloÅ„ski" @@ -1022,11 +1015,11 @@ msgstr "KataloÅ„ski" msgid "Center" msgstr "Åšrodek" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "ZmieÅ„" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "ZmieÅ„ &dysk" @@ -1034,11 +1027,11 @@ msgstr "ZmieÅ„ &dysk" msgid "Change Disc" msgstr "ZmieÅ„ dysk" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "ZmieÅ„ grÄ™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1054,12 +1047,12 @@ msgstr "Zmienia symbol do parametru zFar (po poprawce)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Zmienia symbol do parametru zNear (po poprawce)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "Zmiana tego nie bÄ™dzie miaÅ‚a wpÅ‚ywu jeÅ›li emulator jest w trakcie pracy!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1067,47 +1060,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Cheat Code" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Szukaj cheatów" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Menadżer cheatów" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Sprawdź integralność partycji" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Sprawdzanie integralnoÅ›ci..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "ChiÅ„ski uproszczony" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinski (Tradycyjny)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Wybierz folder źródÅ‚owy DVD" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Wybierz folder źródÅ‚owy NAND" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Wybierz domyÅ›lne ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Wybierz folder do dodania" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Wybierz plik do otwarcia" @@ -1115,7 +1108,7 @@ msgstr "Wybierz plik do otwarcia" msgid "Choose a memory card:" msgstr "Wybierz kartÄ™ pamiÄ™ci:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1123,8 +1116,8 @@ msgstr "" "Wybierz plik używany jako apploader: (dotyczy dysków stworzonych tylko z " "folderów)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Wypakuj do" @@ -1143,7 +1136,7 @@ msgstr "Classic" msgid "Clear" msgstr "Wyczyść" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1153,7 +1146,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Zamknij" @@ -1162,11 +1155,11 @@ msgstr "Zamknij" msgid "Co&nfigure..." msgstr "Ko&nfiguruj..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Info kodu" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kod:" @@ -1178,24 +1171,24 @@ msgstr "Polecenie" msgid "Comment" msgstr "Komentarz" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Komentarz:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Kompresuj ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Kompresuj wybrane ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Kompresowanie ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Konfig" @@ -1209,18 +1202,18 @@ msgstr "Konfiguracja" msgid "Configure Control" msgstr "Konfiguracja sterowania" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Konfiguracja padów" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Konfiguruj..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Potwierdź nadpis pliku" @@ -1233,17 +1226,16 @@ msgstr "Potwierdź przy zatrzymaniu" msgid "Connect" msgstr "PoÅ‚Ä…cz" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "PodÅ‚Ä…cz klawiaturÄ™ USB" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "PodÅ‚Ä…cz klawiaturÄ™ USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "PoÅ‚Ä…cz Wiilot %i" @@ -1264,7 +1256,7 @@ msgstr "PoÅ‚Ä…cz Wiilot 3" msgid "Connect Wiimote 4" msgstr "PoÅ‚Ä…cz Wiilot 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "ÅÄ…czÄ™..." @@ -1284,7 +1276,7 @@ msgstr "Sterowanie" msgid "Convert to GCI" msgstr "Konwertuj do GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopiowanie nie powiodÅ‚o siÄ™" @@ -1293,21 +1285,16 @@ msgstr "Kopiowanie nie powiodÅ‚o siÄ™" msgid "Copy to Memcard %c" msgstr "Kopiuj do Memcard %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "RdzeÅ„" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Nie można utworzyć %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Beckend %s nie mógÅ‚ zostać zainicjalizowany." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1318,24 +1305,16 @@ msgstr "" "Wii. Zwróć uwagÄ™, że oryginalne noÅ›niki GC i Wii nie bÄ™dÄ… odczytywane przez " "wiÄ™kszość napÄ™dów DVD." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Nie rozpoznao pliku ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Nie można zapisać %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Nie można ustawić pada. Gracz odszedÅ‚ lub gra jest uruchomiona!\n" -"(Ustawienie padów podczas uruchomionej gry, nie jest jeszcze wspierane)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1356,11 +1335,11 @@ msgstr "" "Czy wiadomość ta pojawia siÄ™ po przeniesieniu folderu emulatora?\n" "JeÅ›li tak, należy ponownie okreÅ›lić Å›cieżki kart pamiÄ™ci w opcjach programu." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Nie odnaleziono polecenia otwarcia dla rozszerzenia 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1368,17 +1347,17 @@ msgstr "" "Nie można zainicjować rdzenia.\n" "Sprawdź konfiguracjÄ™." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Ilość:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Kraj:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Utwórz kod AR" @@ -1413,12 +1392,12 @@ msgstr "" msgid "Crossfade" msgstr "Suwak" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Aktualny folder zmieniono z %s na %s po wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Custom Projection Hack" @@ -1426,11 +1405,11 @@ msgstr "Custom Projection Hack" msgid "Custom Projection Hack Settings" msgstr "Ustawienia Custom Projection Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "WÅ‚asne parametry Orthographic Projection" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Czeski" @@ -1442,36 +1421,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP Emulator Engine" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE emulacja (szybkie)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE interpreter (wolne)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE rekompilator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "Dedykowany wÄ…tek dla DSPLLE" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Ustawienia DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "ŹródÅ‚o DVD:" @@ -1483,15 +1462,15 @@ msgstr "DVDLowRead - Fatal Error: bÅ‚Ä…d odczytu dysku" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Fatal Error: bÅ‚Ä…d odczytu dysku" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Rozmiar danych" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Data:" @@ -1520,29 +1499,28 @@ msgstr "Debugowanie" msgid "Decimal" msgstr "DziesiÄ™tnie" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Wypakuj ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Wypakuj wybrane ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Wypakowywanie ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "OdÅ›wież listÄ™ gier" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "DomyÅ›lne" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "DomyÅ›lne ISO:" @@ -1586,8 +1564,8 @@ msgstr "" msgid "Device" msgstr "UrzÄ…dzenie" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Ustawienia urzÄ…dzenia" @@ -1595,15 +1573,12 @@ msgstr "Ustawienia urzÄ…dzenia" msgid "Dial" msgstr "PokrÄ™tÅ‚o" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1655,19 +1630,14 @@ msgstr "" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"PomiÅ„ destination alpha pass używany w wielu grach dla niektórych efektów " -"graficznych.\n" -"\n" -"W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Dysk" @@ -1694,24 +1664,59 @@ msgstr "" msgid "Divide" msgstr "Podziel" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Zatrzymać aktualnÄ… emulacjÄ™?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dekoder Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Ustawienia graficzne %s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin strona &WWW" @@ -1727,12 +1732,12 @@ msgstr "Konfiguracja emulowanego Wiilota" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Konfiguracja GCPad'a" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Filmy TAS (*.dtm)" @@ -1740,11 +1745,11 @@ msgstr "Filmy TAS (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Konfiguracja Wiilot'a" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin na &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1752,7 +1757,7 @@ msgstr "" "Program nie mógÅ‚ znaleść żadnych obrazów GC/Wii ISO. Kliknij tutaj by " "przeglÄ…dać pliki..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1760,19 +1765,16 @@ msgstr "" "Program jest obecnie ustawiony by ukrywać wszystkie gry. Kliknij tutaj by " "pokazać wszystkie gry..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Program nie byÅ‚ w stanie zakoÅ„czyć żądanej akcji." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"WÅ‚Ä…cz szybki dostÄ™p do dysku. Wymagane dla kilku gier. (ON = szybko, OFF = " -"kompatybilne)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1792,11 +1794,11 @@ msgstr "Pobrano %lu kodów. (dodano %lu)" msgid "Drums" msgstr "Perkusja" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Atrapa" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Zrzut audio" @@ -1842,9 +1844,9 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holenderski" @@ -1868,7 +1870,7 @@ msgstr "" "%d. %d -- JeÅ›li ostatnio aktualizowaÅ‚eÅ› program, ponowne uruchomienie " "systemu jest wymagane aby sterownik zaczÄ…Å‚ dziaÅ‚ać." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "Europa" @@ -1876,7 +1878,7 @@ msgstr "Europa" msgid "Early Memory Updates" msgstr "Early Memory Updates" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Edycja" @@ -1884,7 +1886,7 @@ msgstr "Edycja" msgid "Edit ActionReplay Code" msgstr "Edytuj kody ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Edytuj konfiguracjÄ™" @@ -1892,12 +1894,12 @@ msgstr "Edytuj konfiguracjÄ™" msgid "Edit Patch" msgstr "Edytuj patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Edytuj bierzÄ…cÄ… perspektywÄ™" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Edytuj..." @@ -1909,7 +1911,7 @@ msgstr "Efekt" msgid "Embedded Frame Buffer" msgstr "Embedded Frame Buffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "WÄ…tek emulacji jest już uruchomiony" @@ -1948,7 +1950,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Emulowany Wiilot" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Stan emulacji:" @@ -1972,15 +1974,15 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "WÅ‚Ä…cz log AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "WÅ‚Ä…cz Å‚Ä…czenie bloków" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "WÅ‚Ä…cz Bounding Box Calculation" @@ -1992,7 +1994,7 @@ msgstr "WÅ‚Ä…cz cache" msgid "Enable Cheats" msgstr "WÅ‚Ä…cz kody" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "WÅ‚Ä…cz 2 rdzenie" @@ -2000,7 +2002,7 @@ msgstr "WÅ‚Ä…cz 2 rdzenie" msgid "Enable Dual Core (speedup)" msgstr "WÅ‚Ä…cz 2 rdzenie (przyspieszenie)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "WÅ‚Ä…cz Idle Skipping" @@ -2008,7 +2010,7 @@ msgstr "WÅ‚Ä…cz Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "WÅ‚Ä…cz Idle Skipping (przyspieszenie)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "WÅ‚Ä…cz MMU" @@ -2016,7 +2018,7 @@ msgstr "WÅ‚Ä…cz MMU" msgid "Enable Progressive Scan" msgstr "WÅ‚Ä…cz Progressive Scan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "WÅ‚Ä…cz wygaszacz ekranu" @@ -2024,7 +2026,7 @@ msgstr "WÅ‚Ä…cz wygaszacz ekranu" msgid "Enable Speaker Data" msgstr "WÅ‚Ä…cz dane gÅ‚osu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "WÅ‚Ä…cz WideScreen" @@ -2046,7 +2048,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, wybierz 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2082,7 +2084,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2090,32 +2092,23 @@ msgstr "" "WÅ‚Ä…cz to by przyspieszyć The Legend of Zelda: Twilight Princess. WyÅ‚Ä…cz dla " "KAÅ»DEJ innej gry." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "WÅ‚Ä…cza Custom Projection Hack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" "WÅ‚Ä…cza emulacjÄ™ Dolby Pro Logic II używajÄ…c 5.1 surround. NiedostÄ™pne na OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "WÅ‚Ä…cza emulacjÄ™ Dolby Pro Logic II używajÄ…c 5.1 surround. Tylko OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"WÅ‚Ä…cza emulacjÄ™ Dolby Pro Logic II używajÄ…c 5.1 surround. Tylko OpenAL. " -"Zmiana nazwy pliku soft_oal.dll na OpenAL32.dll może spowodować, że ta opcja " -"zacznie dziaÅ‚ać." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2128,7 +2121,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2150,9 +2143,9 @@ msgstr "" msgid "End" msgstr "Koniec" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Angielski" @@ -2175,21 +2168,20 @@ msgstr "WejÅ›cie %d/%d" msgid "Entry 1/%d" msgstr "WejÅ›cie 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Równy" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "BÅ‚Ä…d" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "BÅ‚Ä…d wczytywania wybranego jÄ™zyka. Ustawienia domyÅ›lne." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2216,7 +2208,6 @@ msgid "Euphoria" msgstr "Euforia" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Handler wyjÄ…tku - dostÄ™p poniżej obszaru pamiÄ™ci. %08llx%08llx" @@ -2225,16 +2216,20 @@ msgstr "Handler wyjÄ…tku - dostÄ™p poniżej obszaru pamiÄ™ci. %08llx%08llx" msgid "Execute" msgstr "Wykonaj" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Eksportuj nieudany" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Eksportuj plik" @@ -2242,7 +2237,7 @@ msgstr "Eksportuj plik" msgid "Export Recording" msgstr "Eksportuj nagranie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Eksportuj nagranie..." @@ -2250,7 +2245,7 @@ msgstr "Eksportuj nagranie..." msgid "Export Save" msgstr "Eksportuj zapis" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Eksportuj zapis Wii (eksperymentalne)" @@ -2258,15 +2253,15 @@ msgstr "Eksportuj zapis Wii (eksperymentalne)" msgid "Export all saves" msgstr "Eksportuj wszystkie zapisy" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Eksport nieudany, ponowić?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Eksportuj zapis jako..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Rozszerzenie" @@ -2282,44 +2277,44 @@ msgstr "Parametr Dodatkowy" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Parametr Dodatkowy przydatny tylko w ''Metroid: Other M\"." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Wypakuj wszystkie pliki..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Wypakuj Apploader'a..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Wypakuj DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Wypakuj folder..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Wypakuj plik..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Wypakuj partycjÄ™..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Wypakowywanie %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Wypakowywanie wszystkich plików" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Wypakowywanie folderu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Wypakowywanie..." @@ -2331,15 +2326,15 @@ msgstr "Bajt FIFO" msgid "FIFO Player" msgstr "FIFO Player" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "Francja" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Rozmiar FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "PoÅ‚Ä…czenie nieudane!" @@ -2347,11 +2342,15 @@ msgstr "PoÅ‚Ä…czenie nieudane!" msgid "Failed to download codes." msgstr "Pobieranie kodów nieudane!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Wypakowanie do %s nie udaÅ‚o siÄ™!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2387,20 +2386,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Nieudany odczyt %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "BÅ‚Ä…d odczytu banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Odczyt nagłówka bk nie powiódÅ‚ siÄ™" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2411,7 +2410,7 @@ msgstr "" "Karta pamiÄ™ci może być okrojona\n" "FilePosition:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2419,7 +2418,7 @@ msgstr "" "BÅ‚Ä…d poprawnego odczytu block allocation table backup\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2427,17 +2426,17 @@ msgstr "" "BÅ‚Ä…d poprawnego odczytu block allocation table\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Odczyt z %d nieudany" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Odczyt z pliku %s nie powiódÅ‚ siÄ™" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2445,7 +2444,7 @@ msgstr "" "BÅ‚Ä…d poprawnego odczytu folderu zapasowego\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2453,11 +2452,11 @@ msgstr "" "BÅ‚Ä…d poprawnego odczytu folderu\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Odczyt nagłówka nie powiódÅ‚ siÄ™" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2465,29 +2464,34 @@ msgstr "" "BÅ‚Ä…d poprawnego odczytu nagłówka\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "BÅ‚Ä…d odczytu unikalnego ID z obrazu dysku" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "BÅ‚Ä…d zapisu BT.DINF do SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Zapis bkhdr nie powiódÅ‚ siÄ™" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Zapis nagłówka do %s nie powiódÅ‚ siÄ™" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "BÅ‚Ä…d zapisu nagłówka do pliku %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2499,11 +2503,11 @@ msgstr "Szybki" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Szybka wersja MMU. Nie funkcjonuje dla każdej gry." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2511,7 +2515,7 @@ msgstr "" "Fatal desync. Anulowanie playback'u. (BÅ‚Ä…d w PlayWiimote: %u != %u, byte " "%u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo Player" @@ -2535,7 +2539,7 @@ msgstr "" "Nie można otworzyć pliku\n" "lub posiada niewÅ‚aÅ›ciwe rozszerzenie" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2548,20 +2552,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Plik nierozpoznany jako karta pamiÄ™ci" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Plik nie skompresowany" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Nieznany tryb otwarcia: 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "System plików" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Nieznany plik typu 'ini'! Nie otworzy siÄ™!" @@ -2621,7 +2625,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2631,7 +2635,7 @@ msgstr "" "Pozostaw wyÅ‚Ä…czone, domyÅ›lnie NTSC-U i automatycznie wÅ‚Ä…cza gdy gramy w " "japoÅ„skie gry." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2652,6 +2656,11 @@ msgstr "" msgid "Found %d results for '" msgstr "Znaleziono %d dla '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2693,9 +2702,9 @@ msgstr "Klatki do nagrania" msgid "Free Look" msgstr "Free Look" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francuski" @@ -2708,7 +2717,7 @@ msgstr "Gryfy" msgid "From" msgstr "Z" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "FullScr" @@ -2720,7 +2729,7 @@ msgstr "Rozdzielczość peÅ‚noekranowa:" msgid "GCI File(*.gci)" msgstr "Plik GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GCPad" @@ -2728,27 +2737,27 @@ msgstr "GCPad" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID gry:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Gra jest już uruchomiona!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Gra nie jest uruchomiona!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Nie znaleziono gry!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Specyficzne ustawienia gry" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Konfiguracja gry" @@ -2765,20 +2774,20 @@ msgid "Gamecube &Pad Settings" msgstr "Ustawienia &pada GC" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Karty pamiÄ™ci GC (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Ustawienia pada GC" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Kody Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2801,26 +2810,26 @@ msgstr "Główne" msgid "General Settings" msgstr "Ustawienia ogólne" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Niemiecki" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Indeks jest wiÄ™kszy niż rozmiar listy kodów AR %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafika" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Ustawienia graficzne" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "WiÄ™kszy niż" @@ -2842,7 +2851,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grecki" @@ -2866,11 +2875,11 @@ msgstr "Gitara" msgid "Hacks" msgstr "Hacki" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Suma kontrolna nagłówka nie powiodÅ‚a siÄ™" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebrajski" @@ -2882,7 +2891,7 @@ msgstr "Wysokość" msgid "Help" msgstr "Pomoc" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2903,7 +2912,7 @@ msgstr "" "\n" "Narka!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2954,7 +2963,7 @@ msgstr "Konfiguracja skrótów klawiszowych" msgid "Hotkeys" msgstr "Skróty klawiszowe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "WÄ™gierski" @@ -2962,17 +2971,17 @@ msgstr "WÄ™gierski" msgid "Hybrid Wiimote" msgstr "Hybrydowy Wiilot" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Próba otrzymania danych z nieznanego ticket'u: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -2981,15 +2990,15 @@ msgstr "" "TitleID %016llx.\n" "Program teraz chyba siÄ™ zawiesi :C" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - zÅ‚a Å›cieżka" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Ustawienia IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3001,15 +3010,15 @@ msgstr "Wskaźnik IR" msgid "IR Sensitivity:" msgstr "CzuÅ‚ość IR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Szczegóły ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Foldery ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "WÅ‚ochy" @@ -3017,7 +3026,7 @@ msgstr "WÅ‚ochy" msgid "Icon" msgstr "Ikona" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3061,9 +3070,13 @@ msgstr "" msgid "Import Save" msgstr "Importuj zapis" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importowanie nie powiodÅ‚o siÄ™, próbować ponownie?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3085,21 +3098,16 @@ msgstr "" "Zaimportowany plik posiada rozszerzenie sav\n" "lecz nie posiada wÅ‚aÅ›ciwego nagłówka" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "W grze" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "W grze" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Limit klatek:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3119,7 +3127,7 @@ msgstr "Wstaw" msgid "Insert Encrypted or Decrypted code here..." msgstr "Wprowadź zaszyfrowany/zdeszyfrowany kod tutaj..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Włóż kartÄ™ SD" @@ -3127,37 +3135,38 @@ msgstr "Włóż kartÄ™ SD" msgid "Insert name here.." msgstr "Wprowadź nazwÄ™ tutaj..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Zainstaluj WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Zainstaluj do Wii Menu" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler wywoÅ‚any, ale ta platforma nie wspiera go jeszcze." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Instalacja WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "BÅ‚Ä…d sprawdzania integralnoÅ›ci" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Sprawdzanie integralnoÅ›ci zakoÅ„czone" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Sprawdzanie integralnoÅ›ci zakoÅ„czone. Nie znaleziono bÅ‚Ä™dów." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3170,7 +3179,7 @@ msgstr "" msgid "Interface" msgstr "Interfejs" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Ustawienia interfejsu" @@ -3195,20 +3204,20 @@ msgstr "WewnÄ™trzny bÅ‚Ä…d LZO - lzo_init() nie powiodÅ‚o siÄ™" msgid "Internal Resolution:" msgstr "WewnÄ™trzna rozdzielczość:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreter (BARDZO wolne)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "NiewÅ‚aÅ›ciwy rozmiar (%x) lub Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "NiewÅ‚aÅ›ciwa wartość!" @@ -3216,16 +3225,16 @@ msgstr "NiewÅ‚aÅ›ciwa wartość!" msgid "Invalid bat.map or dir entry" msgstr "NiewÅ‚aÅ›ciwe bat.map lub wejÅ›cie folderu" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "NiewÅ‚aÅ›ciwy typ zdarzenia %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "NiewÅ‚aÅ›ciwy plik" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3236,7 +3245,7 @@ msgstr "" "%s\n" "BÄ™dziesz musiaÅ‚ ponownie zrzucić grÄ™." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "NewÅ‚aÅ›ciwy plik nagrania" @@ -3254,34 +3263,36 @@ msgstr "" "NiewÅ‚aÅ›ciwy Å‚aÅ„cuch przeszukiwania (wspierane sÄ… tylko równe dÅ‚ugoÅ›ci " "Å‚aÅ„cucha)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "NiewÅ‚aÅ›ciwy stan" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "WÅ‚oski" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "Japonia" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT Recompiler (zalecane)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL experimental recompiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "JapoÅ„ski" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "Korea" @@ -3303,8 +3314,9 @@ msgstr "Okno na wierzchu" msgid "Key" msgstr "Klawisz" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "KoreaÅ„ski" @@ -3326,12 +3338,12 @@ msgstr "L-Analog" msgid "Language:" msgstr "JÄ™zyk:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Opóźnienie:" @@ -3370,7 +3382,7 @@ msgstr "" "LPM/PPM wiÄ™cej opcji.\n" "ÅšPM by wyczyÅ›cić." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Mniej niż" @@ -3387,58 +3399,48 @@ msgid "Load Custom Textures" msgstr "Wczytaj wÅ‚asne tekstury" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Wczytaj stan" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Wczytaj stan Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Wczytaj stan Slot 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Wczytaj stan Slot 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Wczytaj stan Slot 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Wczytaj stan Slot 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Wczytaj stan Slot 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Wczytaj stan Slot 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Wczytaj stan Slot 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Wczytaj stan Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Wczytaj stan Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3469,19 +3471,18 @@ msgid "Load State Slot 8" msgstr "Wczytaj stan Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Wczytaj stan Slot 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Wczytaj stan..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wczytaj Wii System Menu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Wczytaj Wii System Menu %d %c" @@ -3500,10 +3501,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Åaduje wartoÅ›ci wczeÅ›niej ustawione z dostÄ™pnych hack patterns" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Lokalny" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Log" @@ -3536,12 +3533,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Logger Outputs" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Logging" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "PoÅ‚Ä…czenie z serwerem przerwane!" @@ -3549,7 +3546,7 @@ msgstr "PoÅ‚Ä…czenie z serwerem przerwane!" msgid "M Button" msgstr "M Button" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3558,7 +3555,7 @@ msgstr "" "MD5 niepoprawne\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Speed Hack" @@ -3572,11 +3569,11 @@ msgstr "Pliki MadCatz Gameshark(*.gcs)" msgid "Main Stick" msgstr "Główna gaÅ‚ka" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID twórcy:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Twórca:" @@ -3613,7 +3610,7 @@ msgid "Memory Byte" msgstr "Bajt pamiÄ™ci" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Karta pamiÄ™ci" @@ -3625,7 +3622,7 @@ msgstr "" "Memory Card Manager OSTRZEÅ»ENIE - Twórz kopie zapasowe przed użyciem, " "powinno zostać naprawione, ale może namieszać!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3642,7 +3639,7 @@ msgstr "" "%s\n" "Czy chcesz skopiować stary plik do nowej lokacji?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "Wielkość pliku karty pamiÄ™ci nie odpowiada wielkoÅ›ci nagłówka" @@ -3650,7 +3647,7 @@ msgstr "Wielkość pliku karty pamiÄ™ci nie odpowiada wielkoÅ›ci nagłówka" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mikrofon" @@ -3663,7 +3660,7 @@ msgstr "Min" msgid "Misc" msgstr "Różne" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Ustawienia różne" @@ -3688,11 +3685,11 @@ msgstr "" msgid "Monospaced font" msgstr "Nieproporcjonalna czcionka" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3812,15 +3809,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Up" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nazwa:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nazwa:" @@ -3830,7 +3827,7 @@ msgstr "Nazwa:" msgid "Native GCI files(*.gci)" msgstr "Natywne pliki GCI(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nowe skanowanie" @@ -3839,7 +3836,7 @@ msgstr "Nowe skanowanie" msgid "Next Page" msgstr "NastÄ™pna strona" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "NastÄ™pne skanowanie" @@ -3847,11 +3844,11 @@ msgstr "NastÄ™pne skanowanie" msgid "Nickname :" msgstr "Ksywa:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "No Country (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Nie odnaleziono IOS/WAD" @@ -3859,7 +3856,7 @@ msgstr "Nie odnaleziono IOS/WAD" msgid "No audio output" msgstr "Brak wyjÅ›cia audio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nie odnaleziono pliku banera dla tytuÅ‚u %s" @@ -3885,42 +3882,43 @@ msgstr "Brak wolnych wejść folderów" msgid "No recorded file" msgstr "Brak nagranego pliku" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Nie odnaleziono folderu zapisu dla tytuÅ‚u %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Å»adne" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norweski" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Nie równe" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Nie ustawiono" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "To nie jest zapis Wii lub bÅ‚Ä…d odczytu rozmiaru nagłówka pliku %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Nie poÅ‚Ä…czono" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notatki" @@ -3941,7 +3939,7 @@ msgstr "Uwagi" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Liczba kodów:" @@ -3962,7 +3960,7 @@ msgstr "Objekt" msgid "Object Range" msgstr "ZasiÄ™g objektu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "WyÅ‚Ä…czone" @@ -3974,25 +3972,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "On-Screen Display Messages" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "DostÄ™pnych tylko %d bloków" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Otwórz" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Otwórz &folder zawartoÅ›ci" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Otwórz folder &zapisów Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Otwórz plik..." @@ -4018,7 +4020,13 @@ msgstr "OpenCL Texture Decoder" msgid "OpenMP Texture Decoder" msgstr "OpenMP Texture Decoder" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opcje" @@ -4028,22 +4036,18 @@ msgid "Orange" msgstr "PomaraÅ„czowy" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"Kolejność plików w folderze niezgodna z kolejnoÅ›cia bloków\n" -"PPM i wyeksportuj wszystkie zapisy,\n" -"nastÄ™pnie zaimportuj te zapisy do nowej karty pamiÄ™ci\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "PozostaÅ‚e" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4055,15 +4059,15 @@ msgstr "" msgid "Output" msgstr "WyjÅ›cie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Od&twórz nagranie" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Pad" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Pad " @@ -4087,17 +4091,17 @@ msgstr "Paragraf" msgid "Parameters" msgstr "Paramerty" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partycja %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patche" @@ -4105,8 +4109,8 @@ msgstr "Patche" msgid "Paths" msgstr "Åšcieżki" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pause" @@ -4119,7 +4123,7 @@ msgstr "Zatrzymaj na koncu filmu" msgid "Per-Pixel Lighting" msgstr "Per-Pixel Lighting" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfekcyjny" @@ -4129,9 +4133,9 @@ msgid "Perspective %d" msgstr "Perspekrtywa %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Play" @@ -4143,7 +4147,7 @@ msgstr "Odtwórz nagranie" msgid "Play/Pause" msgstr "Play/Pause" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Grywalny" @@ -4151,11 +4155,11 @@ msgstr "Grywalny" msgid "Playback Options" msgstr "Opcje playback'u" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Gracze" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Potwierdź..." @@ -4167,23 +4171,23 @@ msgstr "ProszÄ™ utworzyć perspektywÄ™ przed zapisem" msgid "Plus-Minus" msgstr "Plus-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polski" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4192,11 +4196,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugalski" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugalski (Brazylijski)" @@ -4204,17 +4208,17 @@ msgstr "Portugalski (Brazylijski)" msgid "Post-Processing Effect:" msgstr "Post-Processing Effect:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Premature movie end in PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Premature movie end in PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Premature movie end in PlayWiimote. %u > %u" @@ -4231,7 +4235,7 @@ msgstr "Poprzednia strona" msgid "Previous Page" msgstr "Poprzednia strona" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Poprzednia wartość" @@ -4247,7 +4251,7 @@ msgstr "Profil" msgid "Properties" msgstr "WÅ‚aÅ›ciwoÅ›ci" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Purge Cache" @@ -4256,7 +4260,7 @@ msgid "Question" msgstr "Pytanie" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Zamknij" @@ -4278,7 +4282,7 @@ msgstr "R-Analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "Rosja" @@ -4317,6 +4321,10 @@ msgstr "Prawdziwe Wiiloty" msgid "Record" msgstr "Nagranie" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Informacje nagrywania" @@ -4352,7 +4360,7 @@ msgstr "" "W razie wÄ…tpliwoÅ›ci, wybierz Å»adne." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "OdÅ›wież" @@ -4361,14 +4369,14 @@ msgstr "OdÅ›wież" msgid "Refresh List" msgstr "OdÅ›wież listÄ™" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "OdÅ›wież listÄ™ gier" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "UsuÅ„" @@ -4391,7 +4399,7 @@ msgstr "Generuj w oknie głównym" msgid "Reset" msgstr "Reset" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Wynik" @@ -4399,7 +4407,7 @@ msgstr "Wynik" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4412,20 +4420,17 @@ msgstr "Prawo" msgid "Right Stick" msgstr "GaÅ‚ka prawa" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Wibracje" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Wykonuj DSPLLE na dedykowanym wÄ…tku (niezalecane: może powodować bÅ‚Ä™dy audio " -"z HLE oraz zawieszanie z LLE)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Rosyjski" @@ -4438,7 +4443,7 @@ msgid "Safe" msgstr "Bezpieczny" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Zapisz" @@ -4448,23 +4453,20 @@ msgid "Save GCI as..." msgstr "Zapisz GCI jako..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Zapisz &stan" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Zapisz &stan" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Slot stanu 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Slot stanu 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4495,32 +4497,31 @@ msgid "Save State Slot 8" msgstr "Slot stanu 9" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Slot stanu 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Zapisz stan..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Zapisz jako..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Zapisz spakowany GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Zapisz bierzÄ…cÄ… perspektywÄ™" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Zapisz wypakowany GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Stan zapisu filmu %s jest uszkodzony, nagrywanie zatrzymane..." @@ -4529,20 +4530,20 @@ msgstr "Stan zapisu filmu %s jest uszkodzony, nagrywanie zatrzymane..." msgid "Scaled EFB Copy" msgstr "Scaled EFB Copy" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "SknaujÄ™ %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "PrzeszukujÄ™ obrazy ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "PrzeszukujÄ™..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ScrShot" @@ -4554,11 +4555,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Szukaj" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtr wyszukiwania" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Przeszukuj podfoldery" @@ -4581,12 +4582,12 @@ msgstr "Nie odnaleziono sekcji %s w SYSCONF" msgid "Select" msgstr "Select" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Wybierz plik nagrania" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Wybierz plik Wii WAD do zainstalowania" @@ -4608,19 +4609,19 @@ msgstr "Wybierz plik zapisu do importowania" msgid "Select floating windows" msgstr "Select floating windows" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Wybierz plik do wczytania" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Wybierz plik do zapisu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Wybierz stan do wczytania" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Wybierz stan do zapisu" @@ -4642,7 +4643,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, wybierz Auto." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Wybrany progil kontrolera nie istnieje" @@ -4666,39 +4667,28 @@ msgstr "" "W razie wÄ…tpliwoÅ›ci, użyj rozdzielczoÅ›ci komputera.\n" "JeÅ›li nadal masz wÄ…tpliwoÅ›ci, użyj najwyższej dziaÅ‚ajÄ…cej rozdzielczoÅ›ci." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Wybiera, które graficzne API ma być użyte wewnÄ™trznie.\n" -"Direct3D 9 zazwyczaj jest najszybsze. OpenGL jest bardziej dokÅ‚adne. " -"Direct3D 11 jest pomiÄ™dzy tymi opcjami.\n" -"Należy zauważyć, że Direct3D dostÄ™pny jest tylko pod systemami Windows.\n" -"\n" -"W razie wÄ…tpliwoÅ›ci, użyj Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Wybiera, które graficzne API ma być użyte wewnÄ™trznie.\n" -"Direct3D 9 zazwyczaj jest najszybsze. OpenGL jest bardziej dokÅ‚adne. " -"Direct3D 11 jest pomiÄ™dzy tymi opcjami.\n" -"Należy zauważyć, że Direct3D dostÄ™pny jest tylko pod systemami Windows.\n" -"\n" -"W razie wÄ…tpliwoÅ›ci, użyj OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "WyÅ›lij" @@ -4710,16 +4700,16 @@ msgstr "Pozycja Sensor Bar'a" msgid "Separator" msgstr "Separator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbski" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "Serial Port 1 - Port używany przez urzÄ…dzenia takie jak net adapter" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Ustaw jako domyÅ›lne ISO" @@ -4728,7 +4718,7 @@ msgstr "Ustaw jako domyÅ›lne ISO" msgid "Set as default Memcard %c" msgstr "Ustaw jako domyÅ›lnÄ… kartÄ™ pamiÄ™ci %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive: Indeks jest wiÄ™kszy niz rozmiar listy kodu AR %lu" @@ -4741,19 +4731,19 @@ msgstr "" "Ustaw opóźnienie (ms). Wyższe wartoÅ›ci mogÄ… zniwelować trzaski dźwiÄ™ków. " "Tylko OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Ustawienia..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Nie można odnaleźć pliku konfiguracyjnego" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "WstrzÄ…s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Krótka nazwa:" @@ -4761,23 +4751,27 @@ msgstr "Krótka nazwa:" msgid "Shoulder Buttons" msgstr "Przyciski tylnie" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Pokaż &konsolÄ™" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Pokaż &Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Pokaż pasek &stanu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Pokaż pasek &narzÄ™dzi" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Pokaż napÄ™dy" @@ -4789,11 +4783,11 @@ msgstr "Pokaż EFB Copy Regions" msgid "Show FPS" msgstr "Pokaż FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Pokaż FrancjÄ™" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Pokaż GameCube" @@ -4801,35 +4795,35 @@ msgstr "Pokaż GameCube" msgid "Show Input Display" msgstr "Pokaż Input Display" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Pokaż WÅ‚ochy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Pokaż JaponiÄ™" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Pokaż KoreÄ™" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Pokaż jÄ™zyk:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Pokaż &konfiguracjÄ™ logu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Pokaż PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Pokaż platformy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Pokaż regiony" @@ -4837,27 +4831,27 @@ msgstr "Pokaż regiony" msgid "Show Statistics" msgstr "Pokaż statystyki" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Pokaż Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Pokaż USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Pokaż WAD" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Pokaż Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Pokazuje okno potwierdzenia przed zatrzymaniem gry." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4875,7 +4869,7 @@ msgstr "Pokaż pierwszy blok" msgid "Show lag counter" msgstr "Pokaż licznik opóźnienia" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4912,7 +4906,7 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Pokaż niewiadome" @@ -4926,23 +4920,24 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Willot bokiem" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "ChiÅ„ski uproszczony" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Rozmiar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "PomiÅ„ BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "PomiÅ„ oczyszczanie DCBZ" @@ -4966,17 +4961,17 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4984,7 +4979,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Snapshot" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderer Programowy" @@ -5000,27 +4995,27 @@ msgstr "" "Czy na pewno chcesz wÅ‚Ä…czyć renderowanie programowe? W razie wÄ…tpliwoÅ›ci, " "wybierz 'Nie'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Ustawienia dźwiÄ™ku" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "NiewÅ‚aÅ›ciwy sound beckend %s." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Utworzenie bufora dźwiÄ™ku nie powiodÅ‚o siÄ™: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Space" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "HiszpaÅ„ski" @@ -5048,37 +5043,29 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, wybierz 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Przyspiesz Disc Transfer Rate" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Square Stick" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standardowy kontroler" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Start &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "&Rozpocznij nagrywanie" @@ -5086,7 +5073,7 @@ msgstr "&Rozpocznij nagrywanie" msgid "Start Recording" msgstr "Rozpocznij nagrywanie" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Stan" @@ -5094,7 +5081,7 @@ msgstr "Stan" msgid "State Saves" msgstr "Stany zapisu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Kierownica" @@ -5103,7 +5090,7 @@ msgid "Stick" msgstr "GaÅ‚ka" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Stop" @@ -5134,28 +5121,28 @@ msgstr "Struny" msgid "Subtract" msgstr "WyciÄ…gnij" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Sukcesywnie wyeksportowano plik do %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Importowanie zapisów zakoÅ„czone powodzeniem" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Zamach" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synchronizuj wÄ…tek GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5163,12 +5150,13 @@ msgstr "" "Synchronizuje wÄ…tki GPU i CPU by zapobiec zawieszaniu w trybie dwóch rdzeni " "(ON = zgodne, OFF = szybkie)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "JÄ™zyk systemu:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "Taiwan" @@ -5193,13 +5181,13 @@ msgstr "Talerz lewo" msgid "Table Right" msgstr "Talerz prawo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Zrób zdjÄ™cie" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5219,11 +5207,11 @@ msgstr "Cache tekstur" msgid "Texture Format Overlay" msgstr "Format pokrycia tekstur" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD zainstalowany poprawnie" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "NieprawidÅ‚owy adres" @@ -5231,13 +5219,13 @@ msgstr "NieprawidÅ‚owy adres" msgid "The checksum was successfully fixed" msgstr "Suma kontrolna poprawnie naprawiona" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Wybrany folder jest już na liÅ›cie" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5260,7 +5248,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Plik %s jest już otwarty, nagłówek pliku nie zostanie zapisany." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Plik, który wybraÅ‚eÅ› (%s) nie istnieje" @@ -5293,43 +5281,43 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Zapis, który chcesz skopiować posiada niewÅ‚aÅ›ciwÄ… wielkość pliku." -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" "Wybrany jÄ™zyk nie jest wspierany przez Twój system. Ustawienia domyÅ›lne." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Wersje NetPlay klienta i serwera sÄ… niekompatybilne!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Serwer peÅ‚ny!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Odpowiedź serwera: gra aktualnie uruchomiona!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Serwer odesÅ‚aÅ‚ nieznany bÅ‚Ä…d!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Wskazany plik \"%s\" nie istnieje." -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "NiewÅ‚aÅ›ciwa wartość" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Kompozycja:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5337,7 +5325,7 @@ msgstr "" "Tutaj musi być ticket dla 00000001/00000002. Twój zrzut NAND jes " "prawdopodobnie niekompletny." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5345,7 +5333,7 @@ msgstr "" "Te ustawienia przewyższaja źródÅ‚owe ustawienia programu.\n" "NieokreÅ›lone ustawienia odczytywane sÄ… ze źródÅ‚owych." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5353,7 +5341,7 @@ msgstr "" "Ten symulator action replay nie wspiera kodów, które modyfikujÄ… Action " "Replay'a." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Może powodować spowolnienie w Wii Menu i niektórych grach." @@ -5377,19 +5365,15 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"JeÅ›li ustawisz limitu klatek wiÄ™kszego niż peÅ‚na szybkość gry (NTSC:60, " -"PAL:50), ustaw Audio Throttle w DSP (może naprawić klikania dźwiÄ™ku, ale " -"może spowodować trwaÅ‚y szum zależnie od gry)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5400,7 +5384,7 @@ msgstr "" "Znacznie zwiÄ™ksza wydajność na komputerach z wiÄ™cej niż jednym rdzeniem, ale " "powoduje także okazjonalne bÅ‚edy." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Pozwala na rÄ™cznÄ… edycjÄ™ pliku konfiguracyjnego." @@ -5409,12 +5393,12 @@ msgstr "Pozwala na rÄ™cznÄ… edycjÄ™ pliku konfiguracyjnego." msgid "Threshold" msgstr "Threshold" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Przechylenie" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "TytuÅ‚" @@ -5428,21 +5412,18 @@ msgid "Toggle All Log Types" msgstr "PrzeÅ‚Ä…cz wszystkie typy logów" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Proporcje ekranu:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Copies" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "PrzeÅ‚Ä…cz wszystkie typy logów" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "PrzeÅ‚Ä…cz na peÅ‚ny ekran" @@ -5452,15 +5433,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Góra" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "ChiÅ„ski tradycyjny" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Próbowano odczytać nieznany typ pliku." @@ -5480,7 +5462,7 @@ msgstr "" "Próba odczytu z niewÅ‚aÅ›ciwego SYSCONF\n" "bt id Wiilota niedostÄ™pne" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turecki" @@ -5496,12 +5478,12 @@ msgstr "Typ" msgid "UDP Port:" msgstr "Port UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiilot" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "Nieznany" @@ -5510,7 +5492,7 @@ msgstr "Nieznany" msgid "UNKNOWN_%02X" msgstr "Nieznany_%X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5523,9 +5505,9 @@ msgstr "" "WejÅ›cie nie zostaÅ‚o zmienione." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5533,7 +5515,7 @@ msgstr "" "zaszyfrowanego/odszyfrowanego kodu. Sprawdź poprawność wpisanego kodu.\n" "Czy chcesz pominąć liniÄ™ i kontynuować analizÄ™?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Niezdefiniowane %i" @@ -5543,19 +5525,18 @@ msgid "Undo Load State" msgstr "Cofnij wczytywanie stanu" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Cofnij wczytywanie stanu" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Nieoczekiwane wywoÅ‚anie 0x80? Przerywanie..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Nieznany" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Nieznane polecenie DVD %08x - poważny bÅ‚Ä…d" @@ -5570,12 +5551,12 @@ msgstr "Nieznane polecenie 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Nieznany typ wejÅ›cia %i w SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Nieznana wiadomość o ID: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "Nieznana wiadomość o ID: %d od gracza: %d Gracz wylatuje!" @@ -5585,16 +5566,16 @@ msgstr "Nieznana wiadomość o ID: %d od gracza: %d Gracz wylatuje!" msgid "Up" msgstr "Góra" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Aktualizuj" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Willot pionowo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Użyj trybu EuRGB60 (PAL60)" @@ -5602,7 +5583,7 @@ msgstr "Użyj trybu EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Użyj trybu peÅ‚noekranowego" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Użyj HEX" @@ -5630,6 +5611,15 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5653,12 +5643,11 @@ msgstr "NarzÄ™dzie" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Speed Hack" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Wartość" @@ -5666,7 +5655,7 @@ msgstr "Wartość" msgid "Value:" msgstr "Wartość:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Wartość:" @@ -5678,7 +5667,7 @@ msgstr "Verbosity" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Wideo" @@ -5686,17 +5675,17 @@ msgstr "Wideo" msgid "Virtual" msgstr "Wirtualny" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Poziom" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Instalacja WAD nie powiodÅ‚a siÄ™: bÅ‚Ä…d tworzenia %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Instalacja WAD nie powiodÅ‚a siÄ™: bÅ‚Ä…d tworzenia biletu" @@ -5718,19 +5707,19 @@ msgstr "" msgid "Warning" msgstr "Ostrzeżenie" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Ostrzeżenie - uruchomienie DOL w zÅ‚ym trybie konsoli!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Ostrzeżenie - uruchomienie ELF w zÅ‚ym trybie konsoli!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Ostrzeżenie - uruchomienie ISO w zÅ‚ym trybie konsoli!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5754,7 +5743,7 @@ msgstr "" "i majÄ… takÄ… samÄ… nazwÄ™ jak plik na Twojej karcie pamiÄ™ci\n" "Kontynuować?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5765,7 +5754,7 @@ msgstr "" "> %u) (klatka %u > %u). Powinien zostać wczytany inny zapis przed " "kontynuacjÄ… lub wczytaj ten stan z wyÅ‚Ä…czonym trybem tylko do odczytu." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5777,7 +5766,7 @@ msgstr "" "ten stan z wyÅ‚Ä…czonym trybem tylko do odczytu. W przeciwnym razie może " "nastÄ…pić desynchronizacja." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5831,19 +5820,15 @@ msgstr "Szerokość" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Konsola Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "ŹródÅ‚o Wii NAND:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Import zapisów Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Pliki zapisu Wii (*.bin)|*.bin" @@ -5852,16 +5837,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: nie moża odczytać z pliku" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiilot" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiilot" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiilot %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiilot poÅ‚Ä…czony" @@ -5869,7 +5860,7 @@ msgstr "Wiilot poÅ‚Ä…czony" msgid "Wiimote Motor" msgstr "Wiilot Motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Ustawienia Wiilota" @@ -5893,14 +5884,14 @@ msgstr "Windows Right" msgid "Word Wrap" msgstr "Zawijanie wierszy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "PracujÄ™..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5920,21 +5911,36 @@ msgstr "Zapisz do pliku" msgid "Write to Window" msgstr "Wpisz do okna" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice nie powiodÅ‚o siÄ™: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Inicjalizacja XAudio2 nie powiodÅ‚a siÄ™: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "Utworzenie XAudio2 master voice nie powiodÅ‚o siÄ™: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice nie powiodÅ‚o siÄ™: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Inicjalizacja XAudio2 nie powiodÅ‚a siÄ™: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Utworzenie XAudio2 master voice nie powiodÅ‚o siÄ™: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5969,11 +5975,11 @@ msgstr "Nie możesz zamknąć paneli jeÅ›li sÄ… w nich strony." msgid "You must choose a game!!" msgstr "Wybierz grÄ™!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Musisz wprowadzić nazwÄ™!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" "Musisz wprowadzić poprawnÄ… wartość dziesiÄ™tnÄ…, szestnastkowÄ… lub ósemkowÄ…." @@ -5982,7 +5988,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "Musisz wprowadzić poprawnÄ… nazwÄ™ profilu." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Musisz ponownie uruchomić program w celu zaaplikowania zmian." @@ -5996,7 +6002,7 @@ msgstr "" "Czy chcesz zatrzymać i naprawić problrm?\n" "JeÅ›li wybierzesz \"Nie\", audio bÄ™dzie znieksztaÅ‚cone." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6015,15 +6021,15 @@ msgstr "" "Powinno być 0x%04x (jest 0x%04llx)\n" "Czy chcesz wygenerować nowy?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Kod 3 zero niewspierany" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Kod zero nieznany dla programu: %08x" @@ -6082,20 +6088,24 @@ msgstr "" "\n" "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Odczyt Opcode z %x. Raportuj." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute zwróciÅ‚ -1 przy uruchamianiu programu!" @@ -6111,75 +6121,41 @@ msgstr "zNear Correction: " msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulacja Accurate VBeam" +#~ msgid "Could not create %s" +#~ msgstr "Nie można utworzyć %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Pozwala na zmianÄ™ okreÅ›lonych opcji dziÄ™ki klawiszom skrótów 3 " -#~ "(WewnÄ™trzna rozdzielczość), 4 (Proporcje ekranu), 5 (Copy EFB) i 6 (MgÅ‚a) " -#~ "wewnÄ…trz okna emulacji.\n" +#~ "Wybiera, które graficzne API ma być użyte wewnÄ™trznie.\n" +#~ "Direct3D 9 zazwyczaj jest najszybsze. OpenGL jest bardziej dokÅ‚adne. " +#~ "Direct3D 11 jest pomiÄ™dzy tymi opcjami.\n" +#~ "Należy zauważyć, że Direct3D dostÄ™pny jest tylko pod systemami Windows.\n" #~ "\n" -#~ "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Nie można odnaleźć Wiilota po bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "WÅ‚Ä…cz skróty klawiszowe" - -#~ msgid "Failed to Listen!!" -#~ msgstr "NasÅ‚uchiwanie nieudane!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Åadowanie bthprops.cpl nie udaÅ‚o siÄ™" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Åadowanie hid.dll nie udaÅ‚o siÄ™" - -#~ msgid "GCMic Configuration" -#~ msgstr "Konfiguracja GCMic" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY wywoÅ‚any, raportuj!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hacked Buffer Upload" +#~ "W razie wÄ…tpliwoÅ›ci, użyj Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "JeÅ›li FPS jest niezrównoważony, ta opcja może pomóc. (ON = kompatybilny, " -#~ "OFF = szybko)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Ostatni nadpisany stan" - -#~ msgid "Last Saved State" -#~ msgstr "Ostatni zapisany stan" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "PodÅ‚acz ponownie Wiilota gdy wczytywany jest stan" - -#~ msgid "Set" -#~ msgstr "Ustaw" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "PomiÅ„ Dest. Alpha Pass" - -#~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Należy użyć strategii hackowanego wgrywania do wierzchoÅ‚ków.\n" -#~ "Zazwyczaj przyspiesza, ale jest zakazane przez specyfikacjÄ™ OpenGL i może " -#~ "powodować spore bÅ‚Ä™dy.\n" +#~ "Wybiera, które graficzne API ma być użyte wewnÄ™trznie.\n" +#~ "Direct3D 9 zazwyczaj jest najszybsze. OpenGL jest bardziej dokÅ‚adne. " +#~ "Direct3D 11 jest pomiÄ™dzy tymi opcjami.\n" +#~ "Należy zauważyć, że Direct3D dostÄ™pny jest tylko pod systemami Windows.\n" #~ "\n" -#~ "W razie wÄ…tpliwoÅ›ci, pozostaw wyÅ‚Ä…czone." +#~ "W razie wÄ…tpliwoÅ›ci, użyj OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Odczyt Opcode z %x. Raportuj." diff --git a/Languages/po/pt.po b/Languages/po/pt.po index 3e54f34d73..62db97137d 100644 --- a/Languages/po/pt.po +++ b/Languages/po/pt.po @@ -3,28 +3,30 @@ # This file is distributed under the same license as the dolphin-emu package. # # Translators: +# 100tpt <100nome.portugal@gmail.com>, 2013 # Zilaan , 2011 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: delroth \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-16 18:55+0000\n" +"Last-Translator: 100tpt <100nome.portugal@gmail.com>\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/dolphin-emu/" +"language/pt/)\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(demasiados para mostrar)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Jogo: " @@ -32,7 +34,7 @@ msgstr "Jogo: " msgid "! NOT" msgstr "! NÃO" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -41,7 +43,7 @@ msgstr "" "\"%s\" Inexistente.\n" " Criar um novo cartão de memória de 16MB?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" Ficheiro GCM/ISO inválido, ou não é um ISO de GC/Wii." @@ -56,64 +58,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "%1$sCopiar%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" -msgstr "" +msgstr "%d amostras" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" -msgstr "" +msgstr "%d amostras (nível de qualidade %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s já existe, substituir?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s falha ao ficar scrubbed. Provavelmente a imagem está corrompida." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s falha ao abrir" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s é um ficheiro com 0 bytes" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s já está comprimido! Não é possível comprimir mais." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "" @@ -143,7 +150,7 @@ msgstr "%u Blocos livres; %u Entradas de directórios livres" msgid "&& AND" msgstr "&& E" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Sobre..." @@ -151,7 +158,7 @@ msgstr "&Sobre..." msgid "&Boot from DVD Drive..." msgstr "&Arrancar através da unidade de DVD ..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Pontos de partida" @@ -159,7 +166,7 @@ msgstr "&Pontos de partida" msgid "&Browse for ISOs..." msgstr "&Procurar ISOs..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Gestor de Cheats" @@ -167,11 +174,11 @@ msgstr "&Gestor de Cheats" msgid "&DSP Settings" msgstr "&Definições de DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Eliminar ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Eliminar ISOs seleccionados..." @@ -183,11 +190,11 @@ msgstr "&Emulação" msgid "&File" msgstr "&Ficheiro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Avançar Quadro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Ecrã Inteiro" @@ -195,7 +202,7 @@ msgstr "&Ecrã Inteiro" msgid "&Graphics Settings" msgstr "&Definições Gráficas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Ajuda" @@ -203,7 +210,7 @@ msgstr "&Ajuda" msgid "&Hotkey Settings" msgstr "&Definições de Teclas de Atalho" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -215,11 +222,11 @@ msgstr "&Carregar Estado" msgid "&Memcard Manager (GC)" msgstr "&Gestor de Cartão de Memória(GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memória" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Abrir..." @@ -227,51 +234,51 @@ msgstr "&Abrir..." msgid "&Options" msgstr "&Opções" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Começar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Propriedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Modo só de leitura" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Actualizar lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Som" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Parar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Ferramentas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Vídeo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Ver" @@ -279,7 +286,7 @@ msgstr "&Ver" msgid "&Wiimote Settings" msgstr "&Definições Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -304,9 +311,8 @@ msgid "(off)" msgstr "(desligado)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -316,7 +322,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -332,7 +338,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -348,7 +354,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -360,7 +366,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -368,7 +374,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -377,12 +383,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Uma janela NetPlay já está aberta!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Nenhum jogo actualmente a correr." @@ -393,7 +399,6 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -402,39 +407,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"ALERTA:\n" -"\n" -"NetPlay só irá funcionar correctamente se utilizar as definições seguintes:\n" -" - Dual Core [OFF]\n" -" - Regulador Ãudio [OFF]\n" -" - DSP-HLE com \"Null Audio\" ou DSP-LLE\n" -" - Defina manualmente o número exacto de comandos que serão usados [Comando " -"Padrão]\n" -"\n" -"Todos os jogadores devem tentar usar a mesma versão e definições do " -"Dolphin.\n" -"Desactive todos os cartões de memória ou atribua-os aos jogadores todos " -"antes de começar.\n" -"suporte Wiimote ainda não foi implementado.\n" -"\n" -"Tem que fazer forward TCP para ser host!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Códigos AR" @@ -478,7 +466,7 @@ msgstr "" "Culprit Code:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -486,7 +474,7 @@ msgstr "" "Erro Action Replay: Tamanho Inválido (%08x : address = %08x) em Adição de " "Código (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -495,7 +483,7 @@ msgstr "" "Erro Action Replay: Tamanho inválido (%08x : address = %08x) em " "Preenchimento e Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -504,7 +492,7 @@ msgstr "" "Erro Action Replay: Tamanho inválido (%08x : address = %08x) em Escrita e " "Preenchimento Ram (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -513,39 +501,39 @@ msgstr "" "Erro Action Replay: Tamanho inválido (%08x : address = %08x) em Escrita para " "Ponteiro (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Erro Action Replay: Valor inválido (%08x) em cópia de memória (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Erro Action Replay: linha de código AR inválida: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay:Código Condicional: Tamanho Inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Tipo de código normal inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Código normal %i: Subtipo inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Código Normal 0: Subtipo Inválido %08x (%s)" @@ -559,11 +547,11 @@ msgstr "Adaptador:" msgid "Add" msgstr "Adicionar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Adicionar Código ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Adicionar Patch" @@ -571,9 +559,9 @@ msgstr "Adicionar Patch" msgid "Add new pane" msgstr "Adicionar novo painel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Adicionar..." @@ -630,42 +618,42 @@ msgstr "Avançadas" msgid "Advanced Settings" msgstr "Definições avançadas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Todos os ficheiros Gamecube GCM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Todos os Estados Guardados (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Todos os ficheiros Wii ISO (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Todos os ficheiros GC/Wii ISO comprimidos (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Todos os ficheiros (*.*)|*.*" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:271 msgid "Analyze" -msgstr "" +msgstr "Analisar" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:286 msgid "Angle" -msgstr "" +msgstr "Ângulo" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:376 msgid "Anisotropic Filtering:" @@ -675,19 +663,19 @@ msgstr "Filtro Anisotrópico" msgid "Anti-Aliasing:" msgstr "Anti-Serrilhamento" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader é do tamanho errado...é mesmo uma apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader impossibilitada de carregar através do ficheiro" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Aplicar" @@ -701,7 +689,7 @@ msgstr "" "\n" "Em caso de dúvida, seleccione (off)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Ãrabe" @@ -710,7 +698,7 @@ msgstr "Ãrabe" msgid "Are you sure you want to delete \"%s\"?" msgstr "Tem a certeza que quer apagar \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -718,17 +706,21 @@ msgstr "" "Tem a certeza que quer apagar estes ficheiros?\n" "Serão eliminados permanentemente!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Tem a certeza que quer eliminar este ficheiro? Será eliminado " "permanentemente!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Proporção de ecrã:" @@ -737,12 +729,12 @@ msgstr "Proporção de ecrã:" msgid "At least one pane must remain open." msgstr "Pelo menos um painel deve manter-se aberto." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ãudio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Ãudio Backend :" @@ -750,7 +742,7 @@ msgstr "Ãudio Backend :" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Erro ao abrir dispositivo AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automático" @@ -789,16 +781,16 @@ msgstr "" msgid "Back" msgstr "Trás" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Definições Backend" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Introdução em segundo plano" @@ -807,7 +799,7 @@ msgstr "Introdução em segundo plano" msgid "Backward" msgstr "Retroceder" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Cabeçalho de ficheiro inválido" @@ -816,15 +808,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detalhes de Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -844,7 +836,7 @@ msgstr "Definições Básicas" msgid "Bass" msgstr "Baixo" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Verificação da Tabela de Atribuição de Blocos falhou" @@ -865,7 +857,7 @@ msgid "Blue Right" msgstr "Azul Direita" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Inferior" @@ -874,27 +866,27 @@ msgstr "Inferior" msgid "Bound Controls: %lu" msgstr "Controlos agregados: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Inactivo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Procurar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Procurar por uma pasta para adicionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Procurar por uma pasta de ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Procurar por pasta de destino" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -904,7 +896,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Botões" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -950,33 +942,33 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Cancelar" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Impossível abrir %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Impossível retirar registo de eventos quando há eventos pendentes" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -984,7 +976,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -996,7 +988,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalão" @@ -1004,11 +996,11 @@ msgstr "Catalão" msgid "Center" msgstr "Centro" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Mudar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Mudar &Disco..." @@ -1016,11 +1008,11 @@ msgstr "Mudar &Disco..." msgid "Change Disc" msgstr "Mudar Disco" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Mudar de Jogo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1036,12 +1028,12 @@ msgstr "Alterações assinaladas a parâmetro zFar (após correcção)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Mudanças assinaladas a parâmetro zNear (após correcção)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "Alterações não vão surtir efeito enquanto o emulador estiver em execução!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Conversa" @@ -1049,47 +1041,47 @@ msgstr "Conversa" msgid "Cheat Code" msgstr "Código de Cheat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Procura de Cheats" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Gestor de Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." -msgstr "" +msgstr "A verificar integridade..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinês (Simplificado)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinês (Tradicional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Escolha uma pasta de raiz do DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Escolha uma pasta de raiz NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Escolha um ISO padrão:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Escolha uma pasta para adicionar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Escolha um ficheiro para abrir" @@ -1097,7 +1089,7 @@ msgstr "Escolha um ficheiro para abrir" msgid "Choose a memory card:" msgstr "Escolha um cartão de memória:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1105,8 +1097,8 @@ msgstr "" "Escolha o ficheiro a usar como apploader: (aplica-se a apenas a discos " "construídos através de pastas)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Escolha a pasta para extrair" @@ -1125,7 +1117,7 @@ msgstr "Clássico" msgid "Clear" msgstr "Limpar" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1135,7 +1127,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Fechar" @@ -1144,11 +1136,11 @@ msgstr "Fechar" msgid "Co&nfigure..." msgstr "Co&nfigurar..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Info de Código" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Código:" @@ -1160,24 +1152,24 @@ msgstr "Comando" msgid "Comment" msgstr "Comentário" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Comentar:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimir ISOs seleccionados..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "A comprimir ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configurar" @@ -1191,18 +1183,18 @@ msgstr "Configuração" msgid "Configure Control" msgstr "Configuração de Controlos" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configuração de Comandos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configurar..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Confirmar Substituição de Ficheiro" @@ -1215,17 +1207,16 @@ msgstr "Confirmar Ao Parar" msgid "Connect" msgstr "Conectar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Conectar Teclado USB" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Conectar Teclado USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Conectar Wiimote %i" @@ -1246,7 +1237,7 @@ msgstr "Conectar Wiimote 3" msgid "Connect Wiimote 4" msgstr "Conectar Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "A conectar..." @@ -1266,7 +1257,7 @@ msgstr "Controlo" msgid "Convert to GCI" msgstr "Converter para GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Cópia Falhou" @@ -1275,21 +1266,16 @@ msgstr "Cópia Falhou" msgid "Copy to Memcard %c" msgstr "Copiar para o Cartão de memória %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Core" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Não foi possível criar %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Não foi possível iniciar o backend %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1300,25 +1286,16 @@ msgstr "" "de GC/Wii. Tenha atenção que discos de jogos originais Gamecube ou Wii não " "serão lidos na maioria das unidades de DVD." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Não foi possível reconhecer ficheiro ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Não foi possível guardar %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Não foi possível definir os comandos. O jogador saiu ou o jogo está em " -"execução!\n" -"(definir os controlos enquanto o jogo está em execução ainda não é suportado)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1332,11 +1309,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Não foi possível encontrar comando aberto para a extensão 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1344,17 +1321,17 @@ msgstr "" "Não foi possível iniciar o core.\n" "Verifique a sua configuração." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Contador:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "País" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Criar um código AR" @@ -1369,7 +1346,7 @@ msgstr "Criador:" #: Source/Core/Common/Src/MsgHandler.cpp:54 msgid "Critical" -msgstr "" +msgstr "Crítico" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:560 msgid "Crop" @@ -1389,12 +1366,12 @@ msgstr "" msgid "Crossfade" msgstr "Desvanecimento cruzado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Hack de projecção personalizada" @@ -1402,11 +1379,11 @@ msgstr "Hack de projecção personalizada" msgid "Custom Projection Hack Settings" msgstr "Definições de Hack de projecção customizada" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Personalizar alguns parâmetros de Projecção Ortogonal." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Checo" @@ -1418,36 +1395,36 @@ msgstr "" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Motor de Emulador DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulação de DSP HLE (rápido)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Interpretador DSP LLE (lento)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Recompilador de DSP LLE" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Definições de DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Raiz de DVD:" @@ -1459,15 +1436,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Dimensão de Dados" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Data:" @@ -1496,29 +1473,28 @@ msgstr "Depuração" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Descomprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Descomprimir ISOs seleccionados..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "A descomprimir ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Actualizar lista de Jogos" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Padrão" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO Padrão:" @@ -1562,8 +1538,8 @@ msgstr "" msgid "Device" msgstr "Dispositivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Definições de Dispositivo" @@ -1571,15 +1547,12 @@ msgstr "Definições de Dispositivo" msgid "Dial" msgstr "Marcação" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1631,19 +1604,14 @@ msgstr "" "Em caso de dúvida, mantenha esta opção desactivada." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Salta a passagem de destino alfa utilizada em muitos jogos para diversos " -"efeitos gráficos.\n" -"\n" -"Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disco" @@ -1670,24 +1638,59 @@ msgstr "" msgid "Divide" msgstr "Dividir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Deseja parar a emulação actual?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s Configurações Gráficas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin &Web Site" @@ -1703,12 +1706,12 @@ msgstr "Configuração da emulação de Wiimote" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Configuração de GCPad " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS filmes (*.dtm)" @@ -1716,11 +1719,11 @@ msgstr "Dolphin TAS filmes (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Configuração Dolphin do Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin em &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1728,7 +1731,7 @@ msgstr "" "O Dolphin não conseguiu encontrar ISOs de GC/Wii. Duplo clique aqui para " "procurar ficheiros..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1736,19 +1739,16 @@ msgstr "" "Dolphin está actualmente definido para esconder todos os jogos. Duplo " "clique aqui para mostrar todos os jogos..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Activar acesso rápido ao disco. Necessário para alguns jogos. (ON = Rápido, " -"OFF = Compatível)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1768,11 +1768,11 @@ msgstr "Descarregados %lu códigos. (adicionados %lu)" msgid "Drums" msgstr "Tambores" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Dummy" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Depositar Ãudio" @@ -1819,9 +1819,9 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holandês" @@ -1842,7 +1842,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1850,7 +1850,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Actualizações de Memória Inicial" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Editar" @@ -1858,7 +1858,7 @@ msgstr "Editar" msgid "Edit ActionReplay Code" msgstr "Editar Código ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Editar Configuração" @@ -1866,12 +1866,12 @@ msgstr "Editar Configuração" msgid "Edit Patch" msgstr "Editar Patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Editar perspectiva actual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Editar..." @@ -1883,7 +1883,7 @@ msgstr "Efeito" msgid "Embedded Frame Buffer" msgstr "Frame Buffer Embutido" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Thread de Emulador já em execução" @@ -1921,7 +1921,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Wiimote Emulado" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Estado da Emulação:" @@ -1945,15 +1945,15 @@ msgstr "" "Necessita de ecrã inteiro para funcionar.\n" "Em caso de dúvida mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Activar Execução de relatórios AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Activar Fusão de blocos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1965,7 +1965,7 @@ msgstr "Activar Cache" msgid "Enable Cheats" msgstr "Activar Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Activar Dual Core" @@ -1973,7 +1973,7 @@ msgstr "Activar Dual Core" msgid "Enable Dual Core (speedup)" msgstr "Activar Dual Core (aumento de desempenho)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Activar Idle Skipping" @@ -1981,7 +1981,7 @@ msgstr "Activar Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Activar Idle Skipping (aumento de desempenho)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Activar MMU" @@ -1989,7 +1989,7 @@ msgstr "Activar MMU" msgid "Enable Progressive Scan" msgstr "Activar Progressive Scan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Activar Protector de Ecrã" @@ -1997,7 +1997,7 @@ msgstr "Activar Protector de Ecrã" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Activar Ecrã Panorâmico" @@ -2019,7 +2019,7 @@ msgstr "" "\n" "Em caso de dúvida, seleccione 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2056,7 +2056,7 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2064,25 +2064,19 @@ msgstr "" "Activar isto para aumentar desempenho no The Legend of Zelda: Twilight " "Princess. Desactive para qualquer outro jogo." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Hack de projecção customizada" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -2097,7 +2091,7 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2119,9 +2113,9 @@ msgstr "" msgid "End" msgstr "Fim" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Inglês" @@ -2144,23 +2138,22 @@ msgstr "Entrada %d/%d" msgid "Entry 1/%d" msgstr "Entrada 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Igual" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Erro" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" "Erro ao carregar o idioma seleccionado. Será revertido para o idioma padrão " "do sistema." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2185,7 +2178,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2195,16 +2187,20 @@ msgstr "" msgid "Execute" msgstr "Executar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Sair" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exportar Todos os Jogos Guardados Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "A Exportação Falhou" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportar Ficheiro" @@ -2212,7 +2208,7 @@ msgstr "Exportar Ficheiro" msgid "Export Recording" msgstr "Exportar Gravação" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportar Gravação..." @@ -2220,7 +2216,7 @@ msgstr "Exportar Gravação..." msgid "Export Save" msgstr "Exportar Jogo Guardado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportar jogo guardado Wii (Experimental)" @@ -2228,15 +2224,15 @@ msgstr "Exportar jogo guardado Wii (Experimental)" msgid "Export all saves" msgstr "Exportar todos os jogos guardados" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportação falhou, tentar novamente?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "A exportação falhou" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportar guardar como..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extensão" @@ -2252,44 +2248,44 @@ msgstr "Parâmetro Extra" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Parâmetro Extra apenas útil em \"Metroid: Other M\"." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extrair Todos os Ficheiros..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extrair Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extrair DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extrair Pasta..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extrair Ficheiro..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extrair Partição..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "A Extrair %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "A Extrair Todos os Ficheiros" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "A Extrair Pasta" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "A Extrair..." @@ -2301,15 +2297,15 @@ msgstr "FIFO Byte" msgid "FIFO Player" msgstr "Reprodutor FIFO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANÇA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Tamanho FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "A Conexão Falhou!" @@ -2317,11 +2313,15 @@ msgstr "A Conexão Falhou!" msgid "Failed to download codes." msgstr "Falha ao descarregar códigos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Falha ao extrair para %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2358,20 +2358,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Falha ao ler banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2379,7 +2379,7 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2388,7 +2388,7 @@ msgstr "" "atribuídos\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2396,17 +2396,17 @@ msgstr "" "Falha ao ler a tabela de blocos atribuídos\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Falha ao ler dados do ficheiro %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2414,7 +2414,7 @@ msgstr "" "Falha ao ler correctamente a pasta com cópia de segurança\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2422,11 +2422,11 @@ msgstr "" "Falha ao ler a pasta correctamente\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "Falha ao ler cabeçalho" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2434,29 +2434,34 @@ msgstr "" "Falha ao ler o cabeçalho correctamente\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Falha ao ler ID único da imagem do disco" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Falha ao escrever BT.DINF para SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Falha ao escrever bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Falha ao escrever cabeçalho para %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Falha ao escrever cabeçalho para o ficheiro %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "" @@ -2468,17 +2473,17 @@ msgstr "Rápido" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Versão rápida do MMU. Não funciona em todos os jogos." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Reprodutor Fifo" @@ -2502,7 +2507,7 @@ msgstr "" "O ficheiro não pôde ser aberto\n" "ou não tem uma extensão válida" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2515,30 +2520,30 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Ficheiros não são reconhecidos como sendo de cartão de memória" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Ficheiro não comprimido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Modo aberto desconhecido : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Sistema de ficheiros" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Tipo de ficheiro 'ini' é desconhecido! Não será aberto!" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:253 msgid "Find next" -msgstr "" +msgstr "Procurar seguinte" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:254 msgid "Find previous" -msgstr "" +msgstr "Procurar anterior" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:626 msgid "First Block" @@ -2589,7 +2594,7 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2599,7 +2604,7 @@ msgstr "" "Se deixar desactivada, o dolphin utiliza a NTSC-U como padrão e " "automaticamente activa esta definição quando um jogo Japonês é jogado." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2618,6 +2623,11 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" +msgstr "Encontrados %d resultados para '" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 @@ -2661,9 +2671,9 @@ msgstr "Quadros para Gravar" msgid "Free Look" msgstr "Vista Livre" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francês" @@ -2676,7 +2686,7 @@ msgstr "Trastes" msgid "From" msgstr "De" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Ecrã Inteiro" @@ -2688,7 +2698,7 @@ msgstr "Resolução em ecrã Inteiro:" msgid "GCI File(*.gci)" msgstr "Ficheiro GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "ComandoGC" @@ -2696,27 +2706,27 @@ msgstr "ComandoGC" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID do Jogo:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "O jogo já está a correr!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "O jogo não está a correr!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" -msgstr "" +msgstr "Jogo não encontrado!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Definições específicas por jogo" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Configuração de Jogo" @@ -2733,20 +2743,20 @@ msgid "Gamecube &Pad Settings" msgstr "Definições de Comando &Gamecube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Cartões de memória Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Definições de Comando Gamecube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Códigos Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2765,26 +2775,26 @@ msgstr "Geral" msgid "General Settings" msgstr "Definições Gerais" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Alemão" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Index é maior que o tamanho da lista de código %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Gráficos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Definições Gráficas" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Maior Que" @@ -2799,7 +2809,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grego" @@ -2823,11 +2833,11 @@ msgstr "Guitarra" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Verificação de Cabeçalho falhou" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebraico" @@ -2839,7 +2849,7 @@ msgstr "Altura" msgid "Help" msgstr "Ajuda" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2851,7 +2861,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2903,7 +2913,7 @@ msgstr "Configuração de Teclas de atalho" msgid "Hotkeys" msgstr "Teclas de Atalho" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Húngaro" @@ -2911,31 +2921,31 @@ msgstr "Húngaro" msgid "Hybrid Wiimote" msgstr "Wiimote Hibrido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS:Tentativa de obter dados de um ticket desconhecido: %08x/" "%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - destino inválido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Definições IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IV" @@ -2947,15 +2957,15 @@ msgstr "Ponteiro Infra Vermelho" msgid "IR Sensitivity:" msgstr "Sensibilidade de Infra Vermelhos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Detalhes ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Pastas ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "Itália" @@ -2963,7 +2973,7 @@ msgstr "Itália" msgid "Icon" msgstr "Ãcone" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3005,9 +3015,13 @@ msgstr "" msgid "Import Save" msgstr "Importar Jogo Guardado" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importação falhou, tentar novamente?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importar Jogo Guardado Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "A importação falhou" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3029,21 +3043,16 @@ msgstr "" "O ficheiro importado tem a extensão sav\n" "mas não tem um cabeçalho correcto" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Em Jogo" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Em-Jogo" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Limite de Quadros:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Informação" @@ -3063,7 +3072,7 @@ msgstr "Inserir" msgid "Insert Encrypted or Decrypted code here..." msgstr "Insira o código criptográfado ou \"descriptografado\" aqui..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Inserir Cartão SD" @@ -3071,37 +3080,38 @@ msgstr "Inserir Cartão SD" msgid "Insert name here.." msgstr "Introduza o nome aqui..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Instalar WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Instalar para o Menu Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler chamado, mas esta plataforma ainda não a suporta." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "A Instalar WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3112,7 +3122,7 @@ msgstr "" msgid "Interface" msgstr "Iinterface" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Definições de interface" @@ -3137,20 +3147,20 @@ msgstr "Erro interno de LZO - lzo_init() falhou" msgid "Internal Resolution:" msgstr "Resolução Interna:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Tamanho Inválido(%x) ou palavra mágica (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Valor inválido!" @@ -3158,16 +3168,16 @@ msgstr "Valor inválido!" msgid "Invalid bat.map or dir entry" msgstr "bat.map inválido ou entrada de pasta" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Tipo de evento inválido %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ficheiro inválido" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3178,7 +3188,7 @@ msgstr "" "%s\n" " Poderá ter que refazer o depósito deste jogo." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ficheiro de Gravação inválido" @@ -3194,34 +3204,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Estado Inválido" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italiano" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPÃO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonês" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "COREIA" @@ -3240,8 +3252,9 @@ msgstr "" msgid "Key" msgstr "Tecla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Coreano" @@ -3263,12 +3276,12 @@ msgstr "L-Analógico" msgid "Language:" msgstr "Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3307,7 +3320,7 @@ msgstr "" "Clique Esquerdo/Direito para mais opções.\n" "Botão do meio para limpar." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Inferior que" @@ -3324,58 +3337,48 @@ msgid "Load Custom Textures" msgstr "Carregar Texturas Personalizadas" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Carregar Estado" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Carregar Estado Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Carregar Estado Slot 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Carregar Estado Slot 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Carregar Estado Slot 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Carregar Estado Slot 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Carregar Estado Slot 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Carregar Estado Slot 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Carregar Estado Slot 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Carregar Estado Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Carregar Estado Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3406,19 +3409,18 @@ msgid "Load State Slot 8" msgstr "Carregar Estado Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Carregar Estado Slot 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Carregar Estado..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Carregar Sistema de Menu Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Carregar Sistema de Menu Wii %d%c" @@ -3437,10 +3439,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Carregar Valores de origem para padrões de hack disponíveis." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Local" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Relatório" @@ -3469,12 +3467,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Saídas de Gerador de Relatórios" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Relatório em execução" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "A ligação ao servidor perdeu-se!" @@ -3482,7 +3480,7 @@ msgstr "A ligação ao servidor perdeu-se!" msgid "M Button" msgstr "Botão M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3491,7 +3489,7 @@ msgstr "" "MD5 não combina\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Hack de velocidade" @@ -3505,11 +3503,11 @@ msgstr "ficheiros MadCatz Gameshark(*.gcs)" msgid "Main Stick" msgstr "Stick Principal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID do autor:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Fabricante:" @@ -3540,7 +3538,7 @@ msgid "Memory Byte" msgstr "Byte de Memória" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Cartão de memória" @@ -3552,7 +3550,7 @@ msgstr "" "Gestor de Cartões de memória AVISO-Faça cópias de segurança antes de " "utilizar, deve estar corrigido mas também pode danificar!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3569,7 +3567,7 @@ msgstr "" "%s\n" "Quer fazer uma cópia do ficheiro antigo para esta nova localização?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3577,7 +3575,7 @@ msgstr "" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mic" @@ -3590,7 +3588,7 @@ msgstr "Min" msgid "Misc" msgstr "Diversos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Configurações Diversas" @@ -3615,11 +3613,11 @@ msgstr "" msgid "Monospaced font" msgstr "Tipo de letra monoespaçada" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3739,15 +3737,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Cima" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nome:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nome:" @@ -3757,7 +3755,7 @@ msgstr "Nome:" msgid "Native GCI files(*.gci)" msgstr "Ficheiros GCI nativos(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nova procura" @@ -3766,7 +3764,7 @@ msgstr "Nova procura" msgid "Next Page" msgstr "Próxima Página" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Próxima Procura" @@ -3774,19 +3772,19 @@ msgstr "Próxima Procura" msgid "Nickname :" msgstr "Alcunha :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Sem País (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Nenhum ISO ou WAD encontrado" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "Sem saída de áudio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nenhum ficheiro banner foi encontrado para o título %s" @@ -3794,7 +3792,7 @@ msgstr "Nenhum ficheiro banner foi encontrado para o título %s" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:771 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:778 msgid "No description available" -msgstr "" +msgstr "Nenhuma descrição disponível" #: Source/Core/DolphinWX/Src/FrameAui.cpp:535 msgid "No docking" @@ -3812,42 +3810,43 @@ msgstr "Sem entradas de índice para pastas livres" msgid "No recorded file" msgstr "Nenhum ficheiro de gravação" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Não foi encontrada a pasta de jogo guardado para o título %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Nenhum" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Bokmaal Norueguês" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Não igual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Não definido" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Não conectado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notas" @@ -3868,7 +3867,7 @@ msgstr "Noticia" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Número De Códigos" @@ -3889,7 +3888,7 @@ msgstr "Objecto" msgid "Object Range" msgstr "Alcance de Objecto" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Desligado" @@ -3901,25 +3900,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online e documentação" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Apenas %d blocos disponíveis" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Abrir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Abrir &Pasta" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Abrir Pasta de &Jogo guardado Wii " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Abrir ficheiro..." @@ -3945,7 +3948,13 @@ msgstr "Descodificador de Textura OpenCL" msgid "OpenMP Texture Decoder" msgstr "Descodificador de Textura OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opções" @@ -3955,22 +3964,18 @@ msgid "Orange" msgstr "Laranja" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"A ordem dos ficheiros na pasta não combina com a ordem dos blocos\n" -"Botão direito e exporte todos os jogos guardados,\n" -"e importe os jogos guardados para um novo cartão de memória\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "Outro" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3982,15 +3987,15 @@ msgstr "" msgid "Output" msgstr "Destino" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "R&eproduzir Gravação..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Comando" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Comando" @@ -4014,17 +4019,17 @@ msgstr "Parágrafo" msgid "Parameters" msgstr "Parâmetros" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partição %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patches" @@ -4032,21 +4037,21 @@ msgstr "Patches" msgid "Paths" msgstr "Caminhos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausa" #: Source/Core/DolphinWX/Src/FrameTools.cpp:129 msgid "Pause at end of movie" -msgstr "" +msgstr "Fazer pausa no fim do filme" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:406 msgid "Per-Pixel Lighting" msgstr "Iluminação por Pixel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfeito" @@ -4056,9 +4061,9 @@ msgid "Perspective %d" msgstr "Perspectiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Começar" @@ -4070,7 +4075,7 @@ msgstr "Tocar Gravação" msgid "Play/Pause" msgstr "Começar/Pausar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Jogável" @@ -4078,11 +4083,11 @@ msgstr "Jogável" msgid "Playback Options" msgstr "Opções de Reprodução" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Jogadores" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Por favor confirme..." @@ -4094,23 +4099,23 @@ msgstr "Por favor crie uma perspectiva antes de guardar" msgid "Plus-Minus" msgstr "Mais-Menos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polaco" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4119,11 +4124,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Português" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Português (Brasileiro)" @@ -4131,17 +4136,17 @@ msgstr "Português (Brasileiro)" msgid "Post-Processing Effect:" msgstr "Efeito de Pós-Processamento" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -4158,7 +4163,7 @@ msgstr "Pág Anterior" msgid "Previous Page" msgstr "Página Anterior" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valor anterior" @@ -4174,7 +4179,7 @@ msgstr "Perfil" msgid "Properties" msgstr "Propriedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Limpar Cache" @@ -4183,7 +4188,7 @@ msgid "Question" msgstr "Questão" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Sair" @@ -4205,7 +4210,7 @@ msgstr "R-Analógico" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSSIA" @@ -4235,7 +4240,7 @@ msgstr "Wiimote Real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:80 msgid "Real Wiimotes" -msgstr "" +msgstr "Wiimotes Reais" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:180 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:205 @@ -4244,6 +4249,10 @@ msgstr "" msgid "Record" msgstr "Gravar" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Gravar entradas" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Informação de Gravação" @@ -4280,7 +4289,7 @@ msgstr "" "Em caso de dúvida, seleccione Nenhum." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Actualizar" @@ -4289,14 +4298,14 @@ msgstr "Actualizar" msgid "Refresh List" msgstr "Actualizar Lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Actualizar lista de Jogos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Remover" @@ -4319,7 +4328,7 @@ msgstr "Renderizar para a Janela Principal" msgid "Reset" msgstr "Reset" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultados" @@ -4327,9 +4336,9 @@ msgstr "Resultados" msgid "Return" msgstr "Return" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisão:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4340,18 +4349,17 @@ msgstr "Direita" msgid "Right Stick" msgstr "Stick Direito" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibração" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russo" @@ -4364,7 +4372,7 @@ msgid "Safe" msgstr "Seguro" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Guardar" @@ -4374,23 +4382,20 @@ msgid "Save GCI as..." msgstr "Guardar GCI como..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Gua&rdar Estado" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Gua&rdar Estado" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Guardar Estado Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Guardar Estado Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4421,32 +4426,31 @@ msgid "Save State Slot 8" msgstr "Guardar Estado Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Guardar Estado Slot 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Guardar Estado..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Guardar como..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Guardar GCM/ISO comprimido" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Guardar perspectiva actual" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Jogo guardado descomprimido GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "O filme de Savestate %s está corrupto, gravação de filme a parar..." @@ -4455,20 +4459,20 @@ msgstr "O filme de Savestate %s está corrupto, gravação de filme a parar..." msgid "Scaled EFB Copy" msgstr "Cópia EFB Escalada" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "A procurar %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "A procurar ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Em Analise..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ScrShot" @@ -4480,11 +4484,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtro de Pesquisa" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Procurar em Sub-Pastas" @@ -4507,12 +4511,12 @@ msgstr "Selecção %s não encontrada em SYSCONF" msgid "Select" msgstr "Seleccionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Seleccione o Ficheiro de Gravação" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Seleccione um ficheiro Wii WAD para instalar" @@ -4534,19 +4538,19 @@ msgstr "Seleccione um ficheiro de jogo guardado para importar" msgid "Select floating windows" msgstr "Seleccionar janelas flutuantes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Seleccione o ficheiro para carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Seleccione o ficheiro de jogo guardado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Seleccione o estado para carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Seleccione o estado para gravar" @@ -4568,7 +4572,7 @@ msgstr "" "da sua proporção.\n" "Em caso de dúvida, seleccione Automático." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4592,27 +4596,28 @@ msgstr "" "Em caso de dúvida, utilize a resolução do ambiente de trabalho.\n" "Se ainda tiver dúvidas, utilize a resolução mais alta que funcione melhor." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Enviar" @@ -4624,18 +4629,18 @@ msgstr "Posição da Barra de Sensor:" msgid "Separator" msgstr "Separador" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Sérvio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Serial Port 1 - Esta é a porta em que dispositivos tais como adaptadores de " "rede utilizam" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Definir como ISO &padrão" @@ -4644,7 +4649,7 @@ msgstr "Definir como ISO &padrão" msgid "Set as default Memcard %c" msgstr "Definir como cartão de memória padrão %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive:O Index é maior que a lista de códigos ar %lu" @@ -4655,19 +4660,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Definições..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Não consegue encontrar o ficheiro de definições" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Abanar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Abreviatura:" @@ -4675,23 +4680,27 @@ msgstr "Abreviatura:" msgid "Shoulder Buttons" msgstr "Botões Shoulder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Mostrar &Consola" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Mostrar &Relatório" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Mostrar &Barra de estado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Mostrar Barra de Ferramen&tas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Mostrar Unidades" @@ -4703,11 +4712,11 @@ msgstr "Mostrar Regiões de Cópia EFB" msgid "Show FPS" msgstr "Mostrar FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Mostrar França" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Mostrar GameCube" @@ -4715,35 +4724,35 @@ msgstr "Mostrar GameCube" msgid "Show Input Display" msgstr "Mostrar visualização de Entradas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Mostrar Itália" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Mostrar Japão" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Mostrar Coreia" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Mostrar Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Mostrar &Configuração de Relatório" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Mostrar Pal" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Mostrar Plataformas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Mostrar Regiões" @@ -4751,27 +4760,27 @@ msgstr "Mostrar Regiões" msgid "Show Statistics" msgstr "Mostrar Estatísticas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Mostrar Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Mostrar EUA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Mostrar Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Mostrar Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Mostrar uma caixa de confirmação antes de parar um jogo." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4789,7 +4798,7 @@ msgstr "Mostrar primeiro bloco" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4824,7 +4833,7 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Mostrar desconhecido" @@ -4838,23 +4847,24 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote na horizontal" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Chinês Simplificado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Dimensão" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Saltar Bios" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4879,17 +4889,17 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4897,7 +4907,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Captura de ecrã" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderizador por Software" @@ -4914,27 +4924,27 @@ msgstr "" "Tem a certeza que quer activar a renderização por software? Em caso de " "dúvida, seleccione 'Não'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Definições de Som" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Backend de Som %s não é válido" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Criação do buffer de som falhou: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Espaço" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Espanhol" @@ -4962,37 +4972,29 @@ msgstr "" "\n" "Em caso de dúvida, seleccione 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Aumente a taxa de transferência do disco" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Stick quadrado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Comando padrão" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Começar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Começar &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "&Começar Gravação" @@ -5000,7 +5002,7 @@ msgstr "&Começar Gravação" msgid "Start Recording" msgstr "Começar Gravação" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Estado" @@ -5008,7 +5010,7 @@ msgstr "Estado" msgid "State Saves" msgstr "Estados Guardados" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -5017,7 +5019,7 @@ msgid "Stick" msgstr "Stick" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Parar" @@ -5048,39 +5050,40 @@ msgstr "Strum" msgid "Subtract" msgstr "Subtrair" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Ficheiros extraídos com sucesso para %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Sucesso na importação de ficheiros de jogo guardado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Balanço" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Idioma do sistema:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5105,13 +5108,13 @@ msgstr "Table Esquerda" msgid "Table Right" msgstr "Table Direita" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Tirar Screenshot" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -5131,11 +5134,11 @@ msgstr "Cache de Textura" msgid "Texture Format Overlay" msgstr "Formato da textura" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "O WAD foi instalado correctamente" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "O caminho é inválido" @@ -5143,13 +5146,13 @@ msgstr "O caminho é inválido" msgid "The checksum was successfully fixed" msgstr "A checksum foi reparada com sucesso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "A pasta escolhida já está na lista" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5174,7 +5177,7 @@ msgstr "" "O ficheiro %s já estava aberto, o cabeçalho do ficheiro não poderá ser " "escrito." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "O ficheiro que especificou (%s) não existe" @@ -5204,7 +5207,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "O Jogo Guardado que está a tentar copiar tem um tamanho de ficheiro inválido" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5212,36 +5215,36 @@ msgstr "" "O idioma seleccionado não é suportado pelo seu sistema. A repor padrão do " "sistema." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "O servidor e a versão NetPlay do cliente são incompatíveis" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "O servidor está cheio!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "O servidor respondeu: O jogo está a correr neste momento!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "O servidor enviou uma mensagem de erro desconhecida!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "O ficheiro especificado \"%s\" não existe" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "O valor é inválido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" -msgstr "" +msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5249,7 +5252,7 @@ msgstr "" "Tem que existir um ticket para 00000001/00000002. O seu NAND depositado está " "provavelmente incompleto." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5257,7 +5260,7 @@ msgstr "" "Estas definições substituem as definições raiz do Dolphin .\n" "Indeterminado significa que o jogo usa as definições do Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5265,7 +5268,7 @@ msgstr "" "Este simulador de Action Replay não suporta códigos que modifiquem o próprio " "Action Replay" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Isto poderá causar lentidão no menu Wii e em alguns jogos." @@ -5281,7 +5284,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -5289,7 +5292,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5301,7 +5304,7 @@ msgstr "" "Provoca aumentos significativos de velocidade em PCs com mais de um núcleo, " "mas também poderá causar crashes ou falhas." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Isto permite a edição manual do ficheiro de configuração INI" @@ -5310,12 +5313,12 @@ msgstr "Isto permite a edição manual do ficheiro de configuração INI" msgid "Threshold" msgstr "Limite" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Tilt" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Título" @@ -5329,21 +5332,18 @@ msgid "Toggle All Log Types" msgstr "Alternar Todos os Tipos de Relatório" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Proporção de ecrã:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Cópias EFB" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Alternar Todos os Tipos de Relatório" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Alternar Ecrã Inteiro" @@ -5353,15 +5353,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Topo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chinês Tradicional" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Tentou carregar um tipo de ficheiro desconhecido." @@ -5381,7 +5382,7 @@ msgstr "" "Tentativa de leitura inválida de SYSCONF\n" " ids bt de wiimote não estão disponíveis" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turco" @@ -5397,12 +5398,12 @@ msgstr "Tipo" msgid "UDP Port:" msgstr "Porta UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "DESCONHECIDO" @@ -5411,7 +5412,7 @@ msgstr "DESCONHECIDO" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "EUA" @@ -5422,9 +5423,9 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5432,7 +5433,7 @@ msgstr "" "encriptado ou desencriptado válido. Verifique se o escreveu correctamente.\n" "Quer ignorar esta linha e continuar a analisar?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Indefinido %i" @@ -5442,19 +5443,18 @@ msgid "Undo Load State" msgstr "Retroceder Carregamento de Estado" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Retroceder Carregamento de Estado" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Desconhecido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Comando de DVD desconhecido %08x - Erro fatal" @@ -5462,19 +5462,19 @@ msgstr "Comando de DVD desconhecido %08x - Erro fatal" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:444 #, c-format msgid "Unknown command 0x%08x" -msgstr "" +msgstr "Comando desconhecido 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Tipo de entrada desconhecida %i em SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Mensagem desconhecida recebida com a id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5486,16 +5486,16 @@ msgstr "" msgid "Up" msgstr "Cima" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Actualizar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote na vertical" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Usar modo EuRGB60 (PAL60)" @@ -5503,7 +5503,7 @@ msgstr "Usar modo EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Utilizar Ecrã Inteiro" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Usar Hex" @@ -5532,6 +5532,15 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5555,12 +5564,11 @@ msgstr "Utilidade" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Hack de velocidade" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valor" @@ -5568,7 +5576,7 @@ msgstr "Valor" msgid "Value:" msgstr "Valor:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Valor: " @@ -5580,7 +5588,7 @@ msgstr "Verbosidade" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Vídeo" @@ -5588,17 +5596,17 @@ msgstr "Vídeo" msgid "Virtual" msgstr "Virtual" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volume" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Instalação WAD falhou: erro ao criar %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5621,19 +5629,19 @@ msgstr "" msgid "Warning" msgstr "Aviso" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Aviso - a começar DOL em modo errado de consola!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Aviso - A iniciar um ELF em modo errado de consola!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Aviso - A iniciar um ISO em modo errado de consola!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5658,7 +5666,7 @@ msgstr "" "e tem o mesmo nome que um ficheiro no seu cartão de memória\n" "Continuar?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5666,7 +5674,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5674,7 +5682,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5714,19 +5722,15 @@ msgstr "Largura" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Consola Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Raiz de NAND Wii:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importação de Jogo Guardado Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Ficheiros de jogo guardado Wii (*.bin)|*.bin" @@ -5735,16 +5739,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Não foi possível ler do ficheiro" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote Conectado" @@ -5752,13 +5762,13 @@ msgstr "Wiimote Conectado" msgid "Wiimote Motor" msgstr "Motor de Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Definições de Wiimote" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:48 msgid "Wiimotes" -msgstr "" +msgstr "Wiimotes" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:121 msgid "Windows Left" @@ -5776,14 +5786,14 @@ msgstr "Janelas Direita" msgid "Word Wrap" msgstr "Moldar o texto" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "A trabalhar..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5803,21 +5813,36 @@ msgstr "Escrever para Ficheiro" msgid "Write to Window" msgstr "Escrever para a Janela" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice falhou: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Inicialização do XAudio2 falhou: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "Criação de master voice do XAudio2 falhou: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice falhou: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Inicialização do XAudio2 falhou: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Criação de master voice do XAudio2 falhou: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5847,11 +5872,11 @@ msgstr "Não pode fechar painéis que contenham páginas." msgid "You must choose a game!!" msgstr "Tem que escolher um jogo!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Tem que introduzir um nome!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Tem que introduzir um valor decimal, hexadecimal ou octal válido." @@ -5859,7 +5884,7 @@ msgstr "Tem que introduzir um valor decimal, hexadecimal ou octal válido." msgid "You must enter a valid profile name." msgstr "Tem que introduzir um nome de perfil válido." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Tem que reiniciar o Dolphin para que as alterações sejam efectuadas" @@ -5870,7 +5895,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5889,15 +5914,15 @@ msgstr "" "Deveria ser 0x%04x (mas é 0x%04llx)\n" "Pretende gerar um novo?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Código Zero 3 não é suportado" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Código Zero desconhecido para o Dolphin: %08x" @@ -5957,20 +5982,24 @@ msgstr "" "\n" "Em caso de dúvida, mantenha esta opção desactivada." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: A ler Opcode de %x. Por favor reportar." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "mensagem desconhecida recebida" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute devolveu -1 quando a aplicação executou!" @@ -5986,41 +6015,11 @@ msgstr "Correcção zNear: " msgid "| OR" msgstr "| OU" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulação VBeam precisa" +#~ msgid "Could not create %s" +#~ msgstr "Não foi possível criar %s" -#~ msgid "Enable Hotkeys" -#~ msgstr "Activar Teclas de Atalho" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Failed to Listen!!" -#~ msgstr "A Escuta Falhou!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Falha ao carregar bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Falha ao carregar hid.dll" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY é chamada, Por favor reporte!" - -#~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "Se os FPS são erráticos, esta opção poderá ajudar. (ON = Compatível, OFF " -#~ "= Rápido)" - -#~ msgid "Last Overwritten State" -#~ msgstr "Último estado Substituído" - -#~ msgid "Last Saved State" -#~ msgstr "Último Estado Guardado" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Reconectar Wiimote ao Carregar Estado" - -#~ msgid "Set" -#~ msgstr "Definir" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Saltar Dest. Alpha Pass" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: A ler Opcode de %x. Por favor reportar." diff --git a/Languages/po/pt_BR.po b/Languages/po/pt_BR.po index 9c8a588503..5b680970ff 100644 --- a/Languages/po/pt_BR.po +++ b/Languages/po/pt_BR.po @@ -6,14 +6,17 @@ # Maldonny , 2013 # Dante Jr. , 2011 # Runo , 2013 -# Mateus B. Cassiano , 2013 +# Maldonny , 2013 +# Mateus Cassiano , 2013 +# Mateus Cassiano , 2013 +# Runo , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-08 18:30+0000\n" -"Last-Translator: Runo \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-14 12:33+0000\n" +"Last-Translator: Maldonny \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "dolphin-emu/language/pt_BR/)\n" "Language: pt_BR\n" @@ -22,13 +25,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(muitos para mostrar)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Jogo : " @@ -36,7 +39,7 @@ msgstr " Jogo : " msgid "! NOT" msgstr "! NÃO" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -45,7 +48,7 @@ msgstr "" "\"%s\" não existe.\n" "Criar um novo Memory Card de 16MB?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -61,28 +64,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sCopiar%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d amostras" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d amostras (nível de qualidade %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s já existe, deseja substituir?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s não pôde ser \"limpo\". A imagem provavelmente está corrompida." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -91,7 +94,7 @@ msgstr "" "%s falhou ao ser carregado como Memory Card\n" " O tamanho é inválido (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -100,32 +103,37 @@ msgstr "" "%s falhou ao ser carregado como Memory Card\n" " O tamanho é inválido (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -"%s não pôde ser carregado como um MemoryCard \n" +"%s não pôde ser carregado como um Memory Card \n" "o arquivo não é grande o bastante para ser um arquivo de Memory Card (0x%x " "bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" -msgstr "%s Falha na abertura" +msgstr "Falha ao abrir %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s falhou: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s é um arquivo de 0 bytes" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s Já está comprimido! Não é possível comprimir mais." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s é muito longo para o nome do arquivo, o máximo de caractéres é 45" @@ -154,7 +162,7 @@ msgstr "%u Blocos Livres; %u Entradas de Diretórios Livres" msgid "&& AND" msgstr "&& E" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Sobre..." @@ -162,7 +170,7 @@ msgstr "&Sobre..." msgid "&Boot from DVD Drive..." msgstr "&Carregar a Partir do Drive de DVD..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Pontos de Interrupção" @@ -170,7 +178,7 @@ msgstr "&Pontos de Interrupção" msgid "&Browse for ISOs..." msgstr "&Procurar por ISOs..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Gerenciador de &Cheats" @@ -178,11 +186,11 @@ msgstr "Gerenciador de &Cheats" msgid "&DSP Settings" msgstr "Configurações do &DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Deletar ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Deletar ISOs selecionadas..." @@ -194,11 +202,11 @@ msgstr "&Emulação" msgid "&File" msgstr "&Arquivo" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "Avançar Quadro" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Tela Cheia" @@ -206,31 +214,31 @@ msgstr "&Tela Cheia" msgid "&Graphics Settings" msgstr "Configurações de &Gráficos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Ajuda" #: Source/Core/DolphinWX/Src/FrameTools.cpp:182 msgid "&Hotkey Settings" -msgstr "Configurações de &Atalho" +msgstr "Configurações de &Teclas de Atalho" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" #: Source/Core/DolphinWX/Src/FrameTools.cpp:149 msgid "&Load State" -msgstr "&Carregar Estado" +msgstr "&Carregar Instante Salvo" #: Source/Core/DolphinWX/Src/FrameTools.cpp:192 msgid "&Memcard Manager (GC)" msgstr "Gerenciador de Cartão de &Memória (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memória" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Abrir..." @@ -238,51 +246,51 @@ msgstr "&Abrir..." msgid "&Options" msgstr "&Opções" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Jogar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Propriedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Modo Somente Leitura" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Recarregar Lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registradores" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" -msgstr "&Reset" +msgstr "&Reiniciar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Som" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Parar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "Ferramen&tas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Ver" @@ -290,7 +298,7 @@ msgstr "&Ver" msgid "&Wiimote Settings" msgstr "Configurações de &Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -315,9 +323,8 @@ msgid "(off)" msgstr "(desligado)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ADD" +msgstr "+ ADD" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -325,25 +332,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "" +msgstr "1.5x Nativo (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "" +msgstr "1x Nativo (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "" +msgstr "2.5x Nativo (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "" +msgstr "2x Nativo (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -353,13 +360,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "" +msgstr "3x Nativo (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "" +msgstr "4x Nativo (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -371,7 +378,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -379,7 +386,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -388,12 +395,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Uma janela de Netplay já está aberta!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Não tem nenhum jogo rodando no momento." @@ -415,40 +422,35 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" "ALERTA:\n" "\n" -"O NetPlay atualmente irá funcionar corretamente apenas usando as " -"configurações a seguir:\n" -" - Dual Core [DESLIGADO]\n" -" - Aceleração de Audio [Desligado]\n" -" - DSP-HLE com \"Audio Nulo\" ou DSP-LLE\n" -" - Manualmente configurar o número exato de controles a serem usados para " -"[Controle Padrão]\n" +"Netplay só funcionará com as seguintes configurações:\n" +" - Ativar Dois Núcleos [OFF]\n" +" - O emulador do motor DSP deve ser o mesmo em TODOS os PCs!\n" +" - DSP em um Thread Dedicado [OFF]\n" +" - Limite de quadros não definido para [Audio]\n" "\n" -"Todos os jogadores devem tentar usar a mesma versão e configuração do " -"Dolphin.\n" -"Desative todos os cartões de memórias ou mande eles para todos os jogadores " -"antes de começar .\n" -"Suport ao wiimote não foi implementado.\n" +"Todos os jogadores devem usar a mesma versão e configurações do Dolphin.\n" +"Todos os memory cards devem ser iguais ou desativados.\n" +"Suporte ao Wiimote não deve estar ativado!\n" "\n" -"Você deve redirecionar as portas TCP para ser o Host!!" +"O host deve escolher uma porta TCP aberta/encaminhada! \n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "Códigos AR" @@ -497,7 +499,7 @@ msgstr "" "Código Culpado:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -505,7 +507,7 @@ msgstr "" "Erro no Action Replay: Tamanho inválido (%08x : address = %08x) em Add Code " "(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -514,7 +516,7 @@ msgstr "" "Erro no Action Replay: Tamanho inválido (%08x : address = %08x) em Fill e " "Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -523,7 +525,7 @@ msgstr "" "Erro no Action Replay: Tamanho inválido (%08x : address = %08x) em RAM Write " "e Fill (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -532,12 +534,12 @@ msgstr "" "Erro no Action Replay: Tamanho inválido (%08x : address = %08x) em Write to " "Pointer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Erro no Action Replay: Valor inválido (%08x) na Cópia de Memória (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -547,27 +549,27 @@ msgstr "" "(%s)\n" "Master codes não são necessários. Não use master codes." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Erro no Action Replay: Linha de código AR inválida: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Código Condicional: Tamanho Inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Tipo de Normal Code Inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Code %i: Subtipo inválido %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Code 0: Subtipo inválido %08x (%s)" @@ -581,11 +583,11 @@ msgstr "Adaptador:" msgid "Add" msgstr "Adicionar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Adicionar Código de ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Adicionar Patch" @@ -593,9 +595,9 @@ msgstr "Adicionar Patch" msgid "Add new pane" msgstr "Adicionar novo painel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Adicionar..." @@ -651,32 +653,32 @@ msgstr "Avançado" msgid "Advanced Settings" msgstr "Configurações Avançadas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Todos os arquivos de GC/WII (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Todas as imagens CG/Wii (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Todos os arquivos Gamecube CGM (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" -msgstr "Todos os Pontos de Jogo Salvos (sav, s##)" +msgstr "Todos os Instantes Salvos (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Todos os Arquivos ISO Wii" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Todos os arquivos ISO GC/Wii comprimidos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Todos os arquivos (*.*)|*.*" @@ -696,19 +698,19 @@ msgstr "Filtragem Anisotrópica" msgid "Anti-Aliasing:" msgstr "Anti-Aliasing:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "O Apploader é do tamanho errado... Isso é mesmo um Apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "O Apploader não pôde carregar do arquivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Aplicar" @@ -722,7 +724,7 @@ msgstr "" "\n" "Se estiver em dúvida, selecione (desligado)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Ãrabe" @@ -731,7 +733,7 @@ msgstr "Ãrabe" msgid "Are you sure you want to delete \"%s\"?" msgstr "Você tem certeza de que quer apagar \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -739,17 +741,22 @@ msgstr "" "Você tem certeza que deseja apagar estes arquivos?\n" "Eles estarão perdidos para sempre!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Você tem certeza que quer deletar este arquivo? Ele ficará perdido para " "sempre!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (experimental)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (experimental)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Proporção:" @@ -758,12 +765,12 @@ msgstr "Proporção:" msgid "At least one pane must remain open." msgstr "Pelo menos um painél deve permanecer aberto." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ãudio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Backend de Audio" @@ -771,7 +778,7 @@ msgstr "Backend de Audio" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Erro ao abrir o dispositivo AO.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Automático" @@ -810,16 +817,16 @@ msgstr "Registrador BP" msgid "Back" msgstr "Voltar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Configurações do Backend" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Input em Background" @@ -828,24 +835,24 @@ msgstr "Input em Background" msgid "Backward" msgstr "Para trás" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Header de Arquivo Ruim" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detalhes de Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -865,7 +872,7 @@ msgstr "Configurações Básicas" msgid "Bass" msgstr "Baixo" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Falha no teste de Mesa de Alocação de Blocos" @@ -886,7 +893,7 @@ msgid "Blue Right" msgstr "Azul Direito" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Embaixo" @@ -895,27 +902,27 @@ msgstr "Embaixo" msgid "Bound Controls: %lu" msgstr "Controles Acoplados: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Quebrado" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Procurar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Procurar por um diretório para adicionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Procurar por um diretório de ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Procurar por um diretório de output" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -925,7 +932,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Botões" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -939,11 +946,11 @@ msgstr "C" #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:65 msgid "C Stick" -msgstr "C Stick" +msgstr "Analógico C" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:64 msgid "C-Stick" -msgstr "C-Stick" +msgstr "Analógico-C" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:774 msgid "CP reg" @@ -951,7 +958,7 @@ msgstr "CP reg" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:554 msgid "CPU Emulator Engine" -msgstr "Engine de Emulação do CPU" +msgstr "Motor de Emulação do CPU" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:500 msgid "Cache Display Lists" @@ -971,33 +978,33 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "" +msgstr "Não foi possível encontrar o WiiMote pela conexão %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Não é possível ler do DVD_Plugin - DVD-Interface: Erro Fatal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Cancelar" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Não é possível abrir %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Não é possível cancelar o registro de evnetos com eventos pendentes" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1008,7 +1015,7 @@ msgstr "" "%s\n" "não é um arquivo de Memory Card válido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1020,7 +1027,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalão" @@ -1028,11 +1035,11 @@ msgstr "Catalão" msgid "Center" msgstr "Centralizar" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Mudar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Mudar &Disco..." @@ -1040,11 +1047,11 @@ msgstr "Mudar &Disco..." msgid "Change Disc" msgstr "Mudar o Disco" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Mudar Jogo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1060,11 +1067,11 @@ msgstr "Muda o sinal para o parâmetro do zFar (após a correção)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Muda o sinal para o parâmetro do zNear (após a correção)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Mudar isso não vai ter efeito enquanto o emulador estiver rodando!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat" @@ -1072,47 +1079,47 @@ msgstr "Chat" msgid "Cheat Code" msgstr "Códigos de Cheat" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Busca de Cheats" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Gerenciador de Cheat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Checar Integridade da Partição" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Checando Integridade..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinês (Simplificado)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinês (Tradicional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Escolher um diretório raiz de DVD:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Escolha um diretório raíz para o NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Escolher uma ISO padrão:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Escolher um diretório para adicionar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Escolher um arquivo para abrir" @@ -1120,7 +1127,7 @@ msgstr "Escolher um arquivo para abrir" msgid "Choose a memory card:" msgstr "Escolher um cartão de memória:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1128,8 +1135,8 @@ msgstr "" "Escolher um arquivo para ser usado como apploader: (aplicável somente para " "discos construídos de diretórios)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Escolha a pasta para extrair" @@ -1148,7 +1155,7 @@ msgstr "Clássico" msgid "Clear" msgstr "Limpar" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1158,7 +1165,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Fechar" @@ -1167,11 +1174,11 @@ msgstr "Fechar" msgid "Co&nfigure..." msgstr "Co&nfigurar..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Informação do Código" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Código:" @@ -1183,24 +1190,24 @@ msgstr "Comandos" msgid "Comment" msgstr "Comentário" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Comentário:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Comprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Comprimir ISOs selecionadas..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Comprimindo ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Configurar" @@ -1214,18 +1221,18 @@ msgstr "Configurar" msgid "Configure Control" msgstr "Configurar Controle" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Configurar Controles" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Configurar..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Confirmar sobrescrição de arquivo" @@ -1238,17 +1245,16 @@ msgstr "Confirmar ao Parar" msgid "Connect" msgstr "Conectar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Conectar Teclado USB" +msgstr "Conectar Balance Board" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Conectar Teclado USB" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Conectar Wiimote %i" @@ -1269,7 +1275,7 @@ msgstr "Conectar Wiimote 3" msgid "Connect Wiimote 4" msgstr "Conectar Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Conectando..." @@ -1289,7 +1295,7 @@ msgstr "Controle" msgid "Convert to GCI" msgstr "Converter para GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Falha na Cópia" @@ -1298,21 +1304,16 @@ msgstr "Falha na Cópia" msgid "Copy to Memcard %c" msgstr "Copiar para Cartão de Memória %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Núcleo" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Não pôde criar %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Não foi possível inicializar o Backend 5s. %s" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1323,25 +1324,16 @@ msgstr "" "cópia de GC/Wii. Note que os discos originais de Gamecube e Wii não podem " "ser lidos pela maioria dos leitores de DVD dos PCs." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Não foi possível reconhecer o arquivo ISO %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Não foi possível salvar %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Não foi possível definir os controles. O jogador saiu ou o jogo está rodando " -"no momento!\n" -"(Definir os controles durante o jogo ainda não é suportado)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1354,12 +1346,20 @@ msgid "" "If so, then you may need to re-specify your memory card location in the " "options." msgstr "" +"Não foi possível gravar no arquivo de Memory Card %s.\n" +"\n" +"Você está executando o Dolphin em um CD/DVD, ou o arquivo está protegido de " +"gravação?\n" +"\n" +"Você recebeu esta mensagem após mudar o diretório do emulador?\n" +"Se sim, então você precisa especificar a localização do Memory Card na " +"opções." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Não foi possível encontrar comando de abertura para a extensão 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1367,17 +1367,17 @@ msgstr "" "Não foi possível iniciar o Núcleo (core). \n" "Cheque suas configurações" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Contagem:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "País:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Criar Código AR" @@ -1412,12 +1412,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Diretória atual foi alterado de %s para %s conforme wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Hack de Projeção Customizado" @@ -1425,11 +1425,11 @@ msgstr "Hack de Projeção Customizado" msgid "Custom Projection Hack Settings" msgstr "Configurações de Hack de Projeção Customizado" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Cuztomize alguns parâmetros de Projeção Ortográfica." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tcheco" @@ -1441,36 +1441,36 @@ msgstr "D" msgid "D-Pad" msgstr "Direcional Digital" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" -msgstr "Engine de Emulação do DSP" +msgstr "Motor de Emulação do DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "Emulação HLE do DSP (rápido)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Interpretador LLE do DSP (lento)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "Recompilador LLE do DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP em um Thread Dedicado" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Configurações de Ãudio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE em um Thread Separado" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "Raiz do DVD:" @@ -1482,15 +1482,15 @@ msgstr "DVDLowRead - Erro Fatal: falha ao ler do volume" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Erro Fatal: falha ao ler do volume" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Tapete de Dança" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Tamanho de Arquivo" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Data:" @@ -1519,29 +1519,28 @@ msgstr "Debugging" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Descomprimir ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Descomprimir ISOs selecionados..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Descomprimindo ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Atualizar a lista de jogos" +msgstr "Diminuir limite de Quadros" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Padrão" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "ISO Padrão:" @@ -1585,8 +1584,8 @@ msgstr "" msgid "Device" msgstr "Dispositivo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Configurações de Dispositivo" @@ -1594,15 +1593,12 @@ msgstr "Configurações de Dispositivo" msgid "Dial" msgstr "Discar" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1617,7 +1613,7 @@ msgstr "Desativar" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Desabilitar Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1654,19 +1650,18 @@ msgstr "" "Se estiver em dúvida, deixe isto desativado." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"Não faz o passe de destino Alfa usado em muitos jogos para vários efeitos " -"gráficos.\n" +"Desabilita a emulação de um recurso de hardware chamado Destination Alpha, " +"que é usado em muitos jogos para criar vários efeitos gráficos.\n" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disco" @@ -1693,24 +1688,90 @@ msgstr "" msgid "Divide" msgstr "Dividir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Você quer parar a emulação atual?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" -msgstr "Decoder Dolby Pro Logic II" +msgstr "Decodificador Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revisão: %s\n" +"Compilado: %s @ %s\n" +"\n" +"Dolphin é um emulador de Gamecube/Wii, que foi\n" +"escrito originalmente por F|RES e ector.\n" +"Hoje o Dolphin é um projeto de código aberto com \n" +"muitos contribuidores, muitos para listar.\n" +"Se tiver algum interesse, visite a página do projeto em\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Agradecimentos especiais à Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 e Hotquik por fazer a\n" +"engenharia reversa e pelos docs/demos.\n" +"\n" +"Somos muito gratos à Gilles Mouchard cujo \n" +"Microlib PPC emulator ajudou nosso projeto.\n" +"\n" +"Agradecemos à Frank Wille pelo PowerPC disassembler,\n" +"que modificamos para incluir as especificações Gekko.\n" +"\n" +"Agradecemos à hcs/destop por seu GC ADPCM decoder.\n" +"\n" +"Não possuímos nenhum tipo de ligação com a Nintendo.\n" +"Gamecube e Wii são produtos da Nintendo.\n" +"Este emulador é apenas para fins educacionais\n" +"e não deve ser usado para rodar jogos que você\n" +"não possui legalmente." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Configurações %s Gráficas do Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "&Web Site do Dolphin" @@ -1726,12 +1787,12 @@ msgstr "Configuração de Wiimote Emulado do Dolphin" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Configuração do GCPad do Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Filmes TAS do Dolphin (*.dtm)" @@ -1739,19 +1800,19 @@ msgstr "Filmes TAS do Dolphin (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Configuração de Wiimote Dolphin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin no &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -"Dolphin não pôde encontrar ISOs GC/Wii. Duplo-clique aqui para procurar por " -"arquivos..." +"Dolphin não pôde encontrar ISOs de GC/Wii. Clique duas vezes aqui para " +"procurar por arquivos..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1759,19 +1820,18 @@ msgstr "" "Dolphin atualmente está configurado para esconder todos os jogos. Duplo-" "clique aqui para mostrar todos os jogos..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "O Dolphin não conseguiu completar a ação requisitada." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Ativar acesso rápido de disco. Necessário para alguns jogos.(ON = Rapido, " -"OFF = Compativel)" +"Duplica a taxa de emulação da GPU. Pode acelerar alguns jogos (ON = Rápido, " +"OFF = Compatível)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1791,11 +1851,11 @@ msgstr "Códigos %lu baixados. (Adicionados %lu)" msgid "Drums" msgstr "Bateria" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Dummy" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Extrair Ãudio" @@ -1841,9 +1901,9 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Holandês" @@ -1868,7 +1928,7 @@ msgstr "" "PC é provavelmente necessário no momento para que o Windows veja o novo " "driver." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1876,7 +1936,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Atualizações prévias de Memória" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Editar" @@ -1884,7 +1944,7 @@ msgstr "Editar" msgid "Edit ActionReplay Code" msgstr "Editar Código ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Editar Configuração" @@ -1892,12 +1952,12 @@ msgstr "Editar Configuração" msgid "Edit Patch" msgstr "Editar Patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Editar perspectiva atual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Editar..." @@ -1909,9 +1969,9 @@ msgstr "Efeito" msgid "Embedded Frame Buffer" msgstr "Frame Buffer Embutido" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" -msgstr "Este Segmento de Emulação já está rodando" +msgstr "Este Thread de Emulação já está rodando" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:111 msgid "" @@ -1947,7 +2007,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Emular Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Estado de Emulação" @@ -1971,15 +2031,15 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Ativar Registro AR" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Ativar Block Merging" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Ativar Cálculo de Caixas Limitadoras" @@ -1991,7 +2051,7 @@ msgstr "Ativar Cache" msgid "Enable Cheats" msgstr "Ativar Cheats" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Ativar Modo de Dois Núcleos" @@ -1999,7 +2059,7 @@ msgstr "Ativar Modo de Dois Núcleos" msgid "Enable Dual Core (speedup)" msgstr "Ativar Modo de Dois Núcleos (Aumento na velocidade)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Ativar Idle Skipping" @@ -2007,7 +2067,7 @@ msgstr "Ativar Idle Skipping" msgid "Enable Idle Skipping (speedup)" msgstr "Ativar Idle Skipping (Aumento na velocidade)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Ativar MMU" @@ -2015,7 +2075,7 @@ msgstr "Ativar MMU" msgid "Enable Progressive Scan" msgstr "Ativar Varredura Progressiva" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Ativar Salva-Tela" @@ -2023,7 +2083,7 @@ msgstr "Ativar Salva-Tela" msgid "Enable Speaker Data" msgstr "Ativar Dados do Auto-falante" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Ativar WideScreen" @@ -2046,7 +2106,7 @@ msgstr "" "\n" "Se estiver em dúvida, selecione 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2082,7 +2142,7 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2090,11 +2150,11 @@ msgstr "" "Ative isso para ter ganho de velocidade em The legend of Zelda: Twilight " "Princess. Disative para QUALQUER UM outro jogo." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Ativa Hack de Projeção Personalizado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2102,22 +2162,13 @@ msgstr "" "Habilita emulação do Dolby Pro Logic II usando surround 5.1. Não disponível " "no OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Habilita emulação do Dolby Pro Logic II usando surround 5.1. Disponível " "apenas no backend OpenAL." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Habilita emulação do Dolby Pro Logic II usando surround 5.1. Disponível " -"apenas no backend OpenAL. Talvez seja necessário renomear o soft_oal.dll " -"para OpenAL32.dll para que funcione." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2130,7 +2181,7 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2152,9 +2203,9 @@ msgstr "" msgid "End" msgstr "Fim" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Inglês" @@ -2177,21 +2228,20 @@ msgstr "Entry %d/%d" msgid "Entry 1/%d" msgstr "Entry 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Igual" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Erro" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "Erro ao carregar o idioma selecionado. Voltando ao padrão do sistema." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2218,7 +2268,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2228,16 +2277,20 @@ msgstr "" msgid "Execute" msgstr "Executar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Sair" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exportar todos os saves do Wii" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Falha na Exportação" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportar Arquivo" @@ -2245,7 +2298,7 @@ msgstr "Exportar Arquivo" msgid "Export Recording" msgstr "Exportar Gravação" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportar Gravação..." @@ -2253,7 +2306,7 @@ msgstr "Exportar Gravação..." msgid "Export Save" msgstr "Exportar Save" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportar save do Wii (Experimental)" @@ -2261,15 +2314,15 @@ msgstr "Exportar save do Wii (Experimental)" msgid "Export all saves" msgstr "Exportar todos os saves" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Falha na exportação, tentar novamente?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Falha na exportação" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportar Salvar como..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Extensão" @@ -2285,44 +2338,44 @@ msgstr "Parâmetro Extra" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Parâmetro Extra útil apenas em \"Metroid Other M\"" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extrair Todos os arquivos..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extrair Apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extrair DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extrair diretorio..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extrair Arquivo..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extrair Partição..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extraindo %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extraindo todos os arquivos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extraindo diretorio" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extraindo..." @@ -2334,15 +2387,15 @@ msgstr "Byte do FIFO" msgid "FIFO Player" msgstr "FIFO Player" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANÇA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Tamanho FST:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Falha ao Conectar\"" @@ -2350,11 +2403,15 @@ msgstr "Falha ao Conectar\"" msgid "Failed to download codes." msgstr "Falha ao dazer o download de códigos." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Falha ao extrair %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2373,7 +2430,7 @@ msgstr "" "Ele não stá incluso no Dolphin por conter dados com direitos autorais.\n" "Use o DSPSpy para fazer o dump do arquivo do seu console.\n" "\n" -"Você pode usar a engine HLE do DSP que não precisa do dump da ROM.\n" +"Você pode usar o motor HLE do DSP que não precisa do dump da ROM.\n" "(Escolha-o na aba \"Ãudio\" da Janela de Configuração.)" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:108 @@ -2382,6 +2439,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Falha ao carregar bthprops.cpl! Conectar Wiimotes reais não irá funcionar e " +"o Dolphin pode fechar inesperadamente!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2389,21 +2448,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Falha ao carregar hid.dll! Conectar Wiimotes reais não irá funcionar e o " +"Dolphin pode fechar inesperadamente!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Falha ao ler %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Falha ao ler banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Falha ao ler o bk header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2414,7 +2475,7 @@ msgstr "" "O Memory Card pode estar truncado\n" "Posição no Arquivo:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2422,7 +2483,7 @@ msgstr "" "Falha ao ler mesa de alocação de blocos corretamente\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2430,17 +2491,17 @@ msgstr "" "Falha ao ler mesa de alocação de blocos corretamente\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Falha ao ler dados do arquivo %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Falha ao ler dados do arquivo: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2448,7 +2509,7 @@ msgstr "" "Não foii possível ler o Backup do diretório corretamente\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2456,11 +2517,11 @@ msgstr "" "Não foi possível ler o diretório corretamente\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Falha ao ler o header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2468,29 +2529,34 @@ msgstr "" "Não foi possível ler o header corretamente\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Falha ao ler o header para o arquivo %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Não foi possível ler ID exclusivo da imagem do disco" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Falha ao escrever BT.DINF no SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Falha ao escrever bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Falha ao escrever dados no arquivo: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Falha ao escrever o header para %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Falha ao escrever o header para o arquivo %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Persa" @@ -2500,13 +2566,13 @@ msgstr "Rápido" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Cálculo Rápido de Profundidade" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Rápida versão do MMU. Não funciona para todos os jogos." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2514,7 +2580,7 @@ msgstr "" "Desincronização fatal. Abortando reprodução. (Erro em PlayWiimote: %u != %u, " "byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo Player" @@ -2538,7 +2604,7 @@ msgstr "" "O arquivo não pode ser aberto\n" "ou não tem uma extensão válida" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2551,20 +2617,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Arquivo não reconhecido como Memory Card" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Arquivo não comprimido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Modo de abertura desconhecido : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Arquivo de sistema" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Tipo do arquivo 'ini' desconhecido! Não vai abrir!" @@ -2625,7 +2691,7 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2635,7 +2701,7 @@ msgstr "" "Se isto ficar desativado, o Dolphin usa NTSC-U e ativa esta opção " "automaticamente quando você jogar jogos japoneses." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2649,13 +2715,18 @@ msgstr "Para frente" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "Porta adiante (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "%d resultados encontrados para '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "%x arquivos salvos encontrados" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2671,7 +2742,7 @@ msgstr "Avançar Quadro" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:547 msgid "Frame Dumps use FFV1" -msgstr "Extração de Quadros usam FFV1" +msgstr "Extração de Quadros usando FFV1" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:215 msgid "Frame Info" @@ -2697,9 +2768,9 @@ msgstr "QUadros para Capturar" msgid "Free Look" msgstr "Olhar Livre" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Francês" @@ -2712,7 +2783,7 @@ msgstr "Notas" msgid "From" msgstr "De" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Tela Cheia" @@ -2724,7 +2795,7 @@ msgstr "Resolução da Tela Cheia:" msgid "GCI File(*.gci)" msgstr "Arquivo GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GCPad" @@ -2732,27 +2803,27 @@ msgstr "GCPad" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID do jogo:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "O jogo já está rodando!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "O jogo não está rodando!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Jogo não encontrado!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Opções especificas do jogo" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Opçõesdojogo" @@ -2769,20 +2840,20 @@ msgid "Gamecube &Pad Settings" msgstr "Configurações de &Controle de Gamecube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Memory Cards do Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Configurações do controle de Gamecube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Códigos Gecko" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2805,26 +2876,26 @@ msgstr "Geral" msgid "General Settings" msgstr "Configurações Gerais" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Alemão" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: O índice é maior que a lista de códigos AR de tamanho %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Gráficos" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Configurações Gráficas" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Maior do que" @@ -2846,7 +2917,7 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto ativado." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grego" @@ -2870,11 +2941,11 @@ msgstr "Guitarra" msgid "Hacks" msgstr "Hacks" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "A checagem do header falhou" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebreu" @@ -2886,7 +2957,7 @@ msgstr "Altura" msgid "Help" msgstr "Ajuda" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2906,7 +2977,7 @@ msgstr "" "\n" "Até mais!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2952,14 +3023,14 @@ msgstr "Host" #: Source/Core/DolphinWX/Src/HotkeyDlg.h:31 msgid "Hotkey Configuration" -msgstr "Configuração de hotkey" +msgstr "Configuração de Teclas de Atalho" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:288 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:581 msgid "Hotkeys" -msgstr "Hotkeys" +msgstr "Teclas de Atalho" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Húngaro" @@ -2967,30 +3038,34 @@ msgstr "Húngaro" msgid "Hybrid Wiimote" msgstr "Wiimote Hibrido" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS:Tentou adiquirir dados de um ticket desconhecido: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" +"IOCTL_ES_LAUNCH: O jogo tentou recarregar um IOS ou um título não disponível " +"no dump do seu NAND\n" +"TitleID %016llx.\n" +"Dolphin provavelmente vai travar agora." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - Destino ruim" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "Definições de IPL" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3002,15 +3077,15 @@ msgstr "Ponteiro IR" msgid "IR Sensitivity:" msgstr "Sensibilidade IR:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Detalhes da ISO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Diretórios de ISO" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITÃLIA" @@ -3018,7 +3093,7 @@ msgstr "ITÃLIA" msgid "Icon" msgstr "Icone" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3062,9 +3137,13 @@ msgstr "" msgid "Import Save" msgstr "Importar Save" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Falha na Importação, tentar novamente?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importar jogo salvo do Wii" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Falha na importação" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3086,21 +3165,16 @@ msgstr "" "O arquivo importado tem a extensão sav\n" "mas não tem um header correto" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Funciona" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "In-Game" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Limitador de FPS:" +msgstr "Aumentar limite de Quadros" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3120,7 +3194,7 @@ msgstr "Inserir" msgid "Insert Encrypted or Decrypted code here..." msgstr "Inserir Código Encryptado ou Decriptado aqui..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Insira cartão SD" @@ -3128,38 +3202,39 @@ msgstr "Insira cartão SD" msgid "Insert name here.." msgstr "Insira nome aqui.." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Instalar WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Instalar para o menu do WII" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler foi chamado, mas esta plataforma ainda não tem " "suporte a ele." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Instalando WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Erro na Checagem de Integridade" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Checagem de Integridade completa" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Checagem de Integridade completa. Nenhum erro foi encontrado." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3172,7 +3247,7 @@ msgstr "" msgid "Interface" msgstr "Interface" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Opções de interface" @@ -3197,20 +3272,20 @@ msgstr "Erro Interno do LZO - lzo_init() falhou" msgid "Internal Resolution:" msgstr "Resolução Interna:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpretador (MUITO lento)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Tamanho Inválido(%x) ou palavra Mágica(%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Valor Inválido!" @@ -3218,16 +3293,16 @@ msgstr "Valor Inválido!" msgid "Invalid bat.map or dir entry" msgstr "Bat.map ou entrada de Diretório inválidas" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Tipo de evento %i inválido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Arquivo inválido" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3236,9 +3311,9 @@ msgid "" msgstr "" "Arquivo opening.bnr inválido encontrado no gcm:\n" "%s\n" -"Você pode precisar refazer o dump deste jogo." +"Você pode precisar extraí-lo novamente do jogo." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Arquivo de gravação inválido" @@ -3256,34 +3331,36 @@ msgstr "" "String de busca inválida (apenas comprimentos correspondentes de string são " "suportados)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Estado Salvo Inválido" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italiano" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPÃO" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "Recompilador JIT (Recomendado)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Recompilador experimental JITIL" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonês" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "CORÉIA" @@ -3303,10 +3380,11 @@ msgstr "Manter Janela no Topo" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:257 msgid "Key" -msgstr "Chave" +msgstr "Tecla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Coreano" @@ -3328,12 +3406,12 @@ msgstr "L-Analógico" msgid "Language:" msgstr "Linguagem:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Último %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latência:" @@ -3351,7 +3429,7 @@ msgid "" "Left click to detect hotkeys.\n" "Enter space to clear." msgstr "" -"Clique com o botão esquerdo para detectar atalhos de teclado.\n" +"Clique com o botão esquerdo para detectar teclas de atalho.\n" "Pressione Enter para deixar vazio." #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:742 @@ -3372,7 +3450,7 @@ msgstr "" "Clique da Esquerda/Direita para mais opções.\n" "Clique do meio para limpar." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Menor que" @@ -3389,101 +3467,90 @@ msgid "Load Custom Textures" msgstr "Carregar Texturas Personalizadas" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Carregar Estado" +msgstr "Carregar Instante Salvo" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Carregar Estado do Slot 1" +msgstr "Carregar Último Instante Salvo 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Carregar Estado do Slot 2" +msgstr "Carregar Último Instante Salvo 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Carregar Estado do Slot 3" +msgstr "Carregar Último Instante Salvo 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Carregar Estado do Slot 4" +msgstr "Carregar Último Instante Salvo 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Carregar Estado do Slot 5" +msgstr "Carregar Último Instante Salvo 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Carregar Estado do Slot 6" +msgstr "Carregar Último Instante Salvo 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Carregar Estado do Slot 7" +msgstr "Carregar Último Instante Salvo 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Carregar Estado do Slot 8" +msgstr "Carregar Último Instante Salvo 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "Carregar Estado do Slot 1" +msgstr "Carregar Instante Salvo do Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Carregar Estado do Slot 1" +msgstr "Carregar Instante Salvo do Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "Carregar Estado do Slot 2" +msgstr "Carregar Instante Salvo do Slot 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "Carregar Estado do Slot 3" +msgstr "Carregar Instante Salvo do Slot 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "Carregar Estado do Slot 4" +msgstr "Carregar Instante Salvo do Slot 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "Carregar Estado do Slot 5" +msgstr "Carregar Instante Salvo do Slot 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "Carregar Estado do Slot 6" +msgstr "Carregar Instante Salvo do Slot 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "Carregar Estado do Slot 7" +msgstr "Carregar Instante Salvo do Slot 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "Carregar Estado do Slot 8" +msgstr "Carregar Instante Salvo do Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Carregar Estado do Slot 1" +msgstr "Carregar Instante Salvo do Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." -msgstr "Carregar State..." +msgstr "Carregar Instante Salvo..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Carregar Menu de Sistema do Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Carregar Menu de Sistema do Wii %d %c" @@ -3503,10 +3570,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Carregar valores predefinidos dos padrões de hacks disponíveis." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Local" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Log" @@ -3539,12 +3602,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Resposta do Logger" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Logando" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "A conexão com o servidor foi perdida!" @@ -3552,7 +3615,7 @@ msgstr "A conexão com o servidor foi perdida!" msgid "M Button" msgstr "Butão M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3561,7 +3624,7 @@ msgstr "" "Incompatibilidade do MD5\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Hack de velocidade MMU" @@ -3575,11 +3638,11 @@ msgstr "Arquivos de Gameshark MadCatz(*.gcs)" msgid "Main Stick" msgstr "Analógico Principal" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID da fabricante:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Fabricante:" @@ -3616,7 +3679,7 @@ msgid "Memory Byte" msgstr "Byte de Memória" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Cartão de memoria" @@ -3625,10 +3688,10 @@ msgid "" "Memory Card Manager WARNING-Make backups before using, should be fixed but " "could mangle stuff!" msgstr "" -"AVISO do Gerenciador de- Memory Card - Faça backupsantes de usar, deve estar " -"funcionando mas pode corromper coisas!" +"AVISO - Faça backups antes de usar, deve estar funcionando mas pode " +"corromper coisas!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3645,7 +3708,7 @@ msgstr "" "%s\n" "Você gostaria de copiar o arquivo antigo para o novo local?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "O tamanho do arquivo do Memory Card é diferente do tamanho do header" @@ -3653,7 +3716,7 @@ msgstr "O tamanho do arquivo do Memory Card é diferente do tamanho do header" msgid "Menu" msgstr "Menu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Microfone" @@ -3666,7 +3729,7 @@ msgstr "Mínimo" msgid "Misc" msgstr "Diversas" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Opções diversas" @@ -3692,11 +3755,11 @@ msgstr "" msgid "Monospaced font" msgstr "Fonte Monospaced" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3815,15 +3878,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Cima" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Nome:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Nome:" @@ -3833,7 +3896,7 @@ msgstr "Nome:" msgid "Native GCI files(*.gci)" msgstr "Arquivos GCI nativos(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Nova Busca" @@ -3842,7 +3905,7 @@ msgstr "Nova Busca" msgid "Next Page" msgstr "Próxima Página" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Próxima Busca" @@ -3850,11 +3913,11 @@ msgstr "Próxima Busca" msgid "Nickname :" msgstr "Nick:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Sem região (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Sem ISOs ou WADs achados" @@ -3862,7 +3925,7 @@ msgstr "Sem ISOs ou WADs achados" msgid "No audio output" msgstr "Nenhuma saída de áudio" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Nenhum arquivo de banner encontrado para o título %s" @@ -3888,43 +3951,44 @@ msgstr "Não há entradas de índice de diretório livres" msgid "No recorded file" msgstr "Nenhum arquivo gravado" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Nenhuma pasta de salva encontrada para o título %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Nenhum" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norueguês Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Não igual" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Indefinido" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" "Nenhum arquivo salvo do Wii save ou falha ao ler o header de tamanho %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Não conectado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notas" @@ -3945,7 +4009,7 @@ msgstr "Noticía" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Números dos códigos:" @@ -3966,7 +4030,7 @@ msgstr "Objeto" msgid "Object Range" msgstr "Alcance do Objeto" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Desligado" @@ -3978,25 +4042,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "Mostrar Mensagens na Tela" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "&Documentação Online" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Apenas %d blocos disponíveis" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Abrir" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Abrir &conteúdo da pasta" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Abrir pasta do &save do WII" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Abrir Arquivo..." @@ -4022,7 +4090,15 @@ msgstr "Decodificador de Texturas OpenCL" msgid "OpenMP Texture Decoder" msgstr "Decodificador de Texturas OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Abre a configuração padrão (somente leitura) para este jogo em um editor de " +"texto externo." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opções" @@ -4032,14 +4108,13 @@ msgid "Orange" msgstr "Laranja" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"A ordem dos arquivos no Diretório de Arquivos não bate\n" -"Clique com o botão direito e exporte todos os salvas,\n" +"A ordem dos arquivos no Diretório de Arquivos não bate \n" +"Clique com o botão direito e exporte todos os jogos salvos, \n" "e importe-os para um novo Memory Card\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 @@ -4047,7 +4122,7 @@ msgstr "" msgid "Other" msgstr "Outros" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4059,15 +4134,15 @@ msgstr "" msgid "Output" msgstr "Saída" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "R&eproduzir gravação..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Controle" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Controle" @@ -4091,17 +4166,17 @@ msgstr "Parágrafo" msgid "Parameters" msgstr "Parâmetros" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partição %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Partição não existe: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patches" @@ -4109,8 +4184,8 @@ msgstr "Patches" msgid "Paths" msgstr "Diretórios" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausar" @@ -4123,7 +4198,7 @@ msgstr "Pausar no fim do vídeo" msgid "Per-Pixel Lighting" msgstr "Iluminação Por Pixels" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfeito" @@ -4133,9 +4208,9 @@ msgid "Perspective %d" msgstr "Perspectiva %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Executar" @@ -4147,7 +4222,7 @@ msgstr "Reproduzir Gravação" msgid "Play/Pause" msgstr "Executar/Pausar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Jogável" @@ -4155,11 +4230,11 @@ msgstr "Jogável" msgid "Playback Options" msgstr "Opções de Reprodução" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Jogadores" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Favor confirmar..." @@ -4171,23 +4246,23 @@ msgstr "Favor criar uma perspectiva antes de salvar" msgid "Plus-Minus" msgstr "Positivo-Negativo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polonês" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Porta 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Porta 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Porta 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Porta 4" @@ -4196,11 +4271,11 @@ msgstr "Porta 4" msgid "Port :" msgstr "Porta:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Português" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Português (Brasil)" @@ -4208,17 +4283,17 @@ msgstr "Português (Brasil)" msgid "Post-Processing Effect:" msgstr "Efeito Pós-Processamento" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "Fim prematuro do vídeo no PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "Fim prematuro do vídeo no PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "Fim prematuro do vídeo no PlayWiimote. %u > %u" @@ -4235,7 +4310,7 @@ msgstr "Pág. Anterior" msgid "Previous Page" msgstr "Página Anterior" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Valor anterior" @@ -4251,7 +4326,7 @@ msgstr "Perfil" msgid "Properties" msgstr "Propriedades" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Limpar o Cache" @@ -4260,7 +4335,7 @@ msgid "Question" msgstr "Questão" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Sair" @@ -4282,13 +4357,13 @@ msgstr "R-Analógico" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" -msgstr "Russia" +msgstr "RÚSSIA" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Alcance" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4304,7 +4379,7 @@ msgstr "Real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Balance Board Real" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4321,6 +4396,10 @@ msgstr "Wiimotes Reais" msgid "Record" msgstr "Gravar" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Gravar entrada" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Informações de Gravação" @@ -4349,14 +4428,14 @@ msgid "" "\n" "If unsure, select None." msgstr "" -"Reduz a quantidade de aliasing causado pela rasterização de gráficos 3D.\n" +"Reduz a quantidade de serrilhados causado pela rasterização de gráficos 3D.\n" "Isso faz com que a imagem renderizada fique menos quadriculada.\n" "Diminui de forma severa a velocidade da emulação e pode causar problemas.\n" "\n" "Se estiver em dúvida, deixe isto desativado." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Atualizar" @@ -4365,14 +4444,14 @@ msgstr "Atualizar" msgid "Refresh List" msgstr "Atualizar Lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Atualizar a lista de jogos" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Remover" @@ -4395,7 +4474,7 @@ msgstr "Renderizar na Janela Principal" msgid "Reset" msgstr "Reiniciar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultados" @@ -4403,9 +4482,9 @@ msgstr "Resultados" msgid "Return" msgstr "Retornar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "Revisão:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4416,20 +4495,19 @@ msgstr "Direita" msgid "Right Stick" msgstr "Analógico Direito" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibração" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Executa DSP HLE e LLE em um thread dedicado (não recomendado: pode causar " -"falhas no áudio com HLE e congelamentos com LLE)." +"Executar DSP LLE em um thread dedicado (não recomendado: pode causar " +"congelamentos)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russo" @@ -4442,7 +4520,7 @@ msgid "Safe" msgstr "Seguro" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Salvar" @@ -4452,23 +4530,20 @@ msgid "Save GCI as..." msgstr "Salvar GCI como..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Sal&var Instante Atual" +msgstr "Salvar Instante Antigo" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Sal&var Instante Atual" +msgstr "Salvar Instante Atual" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Salvar Instante Atual no Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Salvar Instante Atual no Slot 1" +msgstr "Salvar Instante Atual no Slot 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4499,54 +4574,53 @@ msgid "Save State Slot 8" msgstr "Salvar Instante Atual no Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Salvar Instante Atual no Slot 1" +msgstr "Salvar Instante Atual no Slot 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Salvar Instante Atual..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Salvar como..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Salvar GCM/ISO comprimido" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Salvar perspectiva atual" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Salvar GCM/ISO descomprimido" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." -msgstr "O Estado Salvo capturado %s está corrompido, parando captura..." +msgstr "O Instante Salvo capturado %s está corrompido, parando captura..." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:405 msgid "Scaled EFB Copy" msgstr "Cópia Escalada do EFB" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Escaneando %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Procurando por ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Escaneando..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "ScrShot" @@ -4558,11 +4632,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Busca" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Filtro de Busca" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Procurar em sub-pastas" @@ -4585,12 +4659,12 @@ msgstr "A seção %s não foi encontrada no SYSCONF" msgid "Select" msgstr "Selecionar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Selecione o arquivo de Gravação" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Selecione um arquivo WAD de Wii para instalar" @@ -4611,19 +4685,19 @@ msgstr "Selecione um arquivo de jogo salvo para importar" msgid "Select floating windows" msgstr "Selecionar Janelas flutuantes" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Selecione um arquivo para carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Selecione o arquivo de salva" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Selecione um instante para carregar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Selecione um instante para salvar" @@ -4645,7 +4719,7 @@ msgstr "" "\n" "Se estiver em dúvida, selecione Automático." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "O perfil de controle especificado não existe" @@ -4669,39 +4743,28 @@ msgstr "" "Se estiver em dúvida, use a resolução da sua Ãrea de Trabalho.\n" "Se ainda estiver em dúvida, use a maior disponível.." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Selecione qual API gráfica será usada internamente.\n" -"Direct3D 9 geralmente é a mais rápida. No entanto, a OpenGL é a mais " -"precisa. Direct3D 11 fica entre as outras duas.\n" -"Lembre-se que os Direct3D backends só estão disponíveis no Windows.\n" -"\n" -"Se estiver em dúvida, use Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Selecione qual API gráfica será usada internamente.\n" -"Direct3D 9 geralmente é a mais rápida. No entanto, a OpenGL é a mais " -"precisa. Direct3D 11 fica entre as outras duas.\n" -"Lembre-se que os Direct3D backends só estão disponíveis no Windows.\n" -"\n" -"Se estiver em dúvida, use Direct3D 11." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Enviar" @@ -4713,18 +4776,18 @@ msgstr "Posição da Sensor Bar:" msgid "Separator" msgstr "Separador" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Sérvio" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Porta Serial 1 - Esta é a porta usada por dispositivos como o adaptador de " "rede" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Definir como ISO &padrão" @@ -4733,7 +4796,7 @@ msgstr "Definir como ISO &padrão" msgid "Set as default Memcard %c" msgstr "Definir como Memory Card padrão%c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4747,19 +4810,19 @@ msgstr "" "Configura a latência (em ms). Valores mais altos podem reduzir problemas de " "corte no áudio. Disponível apenas no backend OpenAL." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Configurações..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Arquivo de configuração não encontrado" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Não foi possível criar o arquivo de configurações" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Sacudir" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Nome Curto:" @@ -4767,23 +4830,27 @@ msgstr "Nome Curto:" msgid "Shoulder Buttons" msgstr "Botões Superiores" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Mostrar &Console" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Mostrar Janela de &Log" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Mostrar barra de &Status" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" -msgstr "Show Barra de &Ferramentas" +msgstr "Mostrar Barra de &Ferramentas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Mostrar Padrões" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Mostrar Drives" @@ -4795,11 +4862,11 @@ msgstr "Mostrar Regiões de Cópia do EFB" msgid "Show FPS" msgstr "Mostrar FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Mostrar França" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Mostrar GameCube" @@ -4807,35 +4874,35 @@ msgstr "Mostrar GameCube" msgid "Show Input Display" msgstr "Mostrar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Mostrar Itália" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Mostrar JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Mostrar Coréia" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Mostrar Idioma:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Mostrar &Configuração de Logs" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Mostrar PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Mostrar Plataformas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Mostrar Regiões" @@ -4843,27 +4910,27 @@ msgstr "Mostrar Regiões" msgid "Show Statistics" msgstr "Mostrar Estatísticas" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Mostrar Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Mostrar EUA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Mostrar Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Mostrar Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Mostrar uma janela de confirmação antes de parar um jogo." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4881,7 +4948,7 @@ msgstr "Mostrar o primeiro bloco" msgid "Show lag counter" msgstr "Mostar o contador de lag" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4919,7 +4986,7 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Mostra desconhecido" @@ -4933,23 +5000,24 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Wiimote na Horizontal" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Chinês Simplificado" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Tamanho" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Pular a BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Pular limpeza DCBZ" @@ -4974,17 +5042,17 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4992,7 +5060,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Captura de tela" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Renderizador por Software" @@ -5008,27 +5076,27 @@ msgstr "" "Você realmente quer utilizar o Renderizador por Software? Se estiver em " "dúvida, pressione 'Não'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Configurações de Som" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "O Backend de Som %s não é válido." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Falha na criação do buffer de som: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Barra de Espaço" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Espanhol" @@ -5056,37 +5124,29 @@ msgstr "" "\n" "Se estiver em dúvida, selecione 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Aumentar a velocidade de transferência do disco" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Analógico Quadrado" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Controle Padrão" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Iniciar NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Iniciar Ca&ptura" @@ -5094,15 +5154,15 @@ msgstr "Iniciar Ca&ptura" msgid "Start Recording" msgstr "Iniciar Captura" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" -msgstr "Status" +msgstr "Instante Atual" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:161 msgid "State Saves" -msgstr "Estados Salvos" +msgstr "Instante Salvos" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Volante" @@ -5111,7 +5171,7 @@ msgid "Stick" msgstr "Analógico" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Parar" @@ -5142,28 +5202,28 @@ msgstr "Palheta" msgid "Subtract" msgstr "Subtrair" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Arquivo exportado com sucesso para %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Arquivos de salva importados com sucesso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Sueco" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Balançar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Sincronizar thread da GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5171,12 +5231,13 @@ msgstr "" "Sincroniza as threads da GPU e da CPU para ajudar a evitar travamentos " "aleatórios no modo Dual Core. (ATIVADO = Compatível, DESATIVADO = Rápido)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" -msgstr "Idioma do Systema:" +msgstr "Idioma do Sistema:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5201,13 +5262,13 @@ msgstr "Esquerda da Mesa" msgid "Table Right" msgstr "Direita da Mesa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Capturar Tela" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5227,11 +5288,11 @@ msgstr "Cache de Texturas" msgid "Texture Format Overlay" msgstr "Sobreposição Formato das Texturas" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "O WAD foi instalado com sucesso" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "O endereço é inválido" @@ -5239,13 +5300,13 @@ msgstr "O endereço é inválido" msgid "The checksum was successfully fixed" msgstr "O Checksum foi corrigido com sucesso" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "O diretório escolhido já está na lista" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5268,7 +5329,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "O Arquivo %s já foi aberto, o header do arquivo não será escrito." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "O arquivo que você especificou (%s) não existe" @@ -5302,7 +5363,7 @@ msgid "The save you are trying to copy has an invalid file size" msgstr "" "O Salva que você está tentando copiar tem um tamanho de arquivo inválido" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5310,44 +5371,44 @@ msgstr "" "O idioma selecionado não é suportado pelo seu sistema. Voltando ao padrão do " "sistema." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "As versões de NetPlay do Client e do Servidor são incompatíveis!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "O servidor está cheio!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "O servidor respondeu: O jogo está rodando no momento!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "O servidor enviou uma mensagem de erro desconhecida!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "O arquivo especificado \"%s\" não existe" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "O valor é inválido" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -"É necessário um ticket para 00000001/00000002. O seu Dump do NAND está " -"provavelmente incompleto." +"É necessário um ticket para 00000001/00000002. O NAND que você extraiu " +"provavelmente está incompleto." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5355,7 +5416,7 @@ msgstr "" "Estas configurações substituem as configurações do núcleo do Dolphin.\n" "Indeterminado significa que o jogo usa as configurações do Dolphin." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5363,7 +5424,7 @@ msgstr "" "Este simulador de Action Replay não suporta códigos que modifiquem o Action " "Replay em si." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "Isto pode causar diminuição da performance no Wii Menu e em alguns jogos." @@ -5388,20 +5449,19 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"Se você colocar o Limitador de FPS em um valor maior que a velocidade máxima " -"do jogo (NTSC:60, PAL:50). Use Ãudio para acelerar através do DSP (deve " -"consertar cortes no áudio mas pode causar ruído constante dependendo do " -"jogo)." +"Isso limita a velocidade do jogo para o número especificado de quadros por " +"segundo (60 para NTSC e 50 para PAL). Em alternativa, use o áudio para " +"acelerar usando DSP (deve consertar cortes no áudio mas pode causar ruído " +"constante dependendo do jogo)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5413,7 +5473,7 @@ msgstr "" "Dá um grande aumento de velocidade para PCs com mais de um núcleo, mas " "também pode causar travamentos/erros ocasionais." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Isto vai deixar você editar manualmente o arquivo de configuração .INI" @@ -5422,12 +5482,12 @@ msgstr "Isto vai deixar você editar manualmente o arquivo de configuração .IN msgid "Threshold" msgstr "Threshold" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Inclinar" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Título" @@ -5441,39 +5501,37 @@ msgid "Toggle All Log Types" msgstr "Ligar/Desligar Todos os Logs" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Proporção:" +msgstr "Ligar/Desligar Proporção" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "Cópias de EFB" +msgstr "Ligar/Desligar Cópias de EFB" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Ligar/Desligar Todos os Logs" +msgstr "Ligar/Desligar Neblina" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Ir para Tela Cheia" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "Ligar/Desligar IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Topo" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Chinês Tradicional" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Houve a tentativa de carregar um tipo de arquivo desconhecido." @@ -5493,7 +5551,7 @@ msgstr "" "Tentando ler de um SYSCONF inválido\n" "Os Bt IDs do Wiimote não estão disponíveis" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turco" @@ -5509,12 +5567,12 @@ msgstr "Tipo" msgid "UDP Port:" msgstr "Porta UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "Wiimote UDP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "DESCONHECIDO" @@ -5523,7 +5581,7 @@ msgstr "DESCONHECIDO" msgid "UNKNOWN_%02X" msgstr "DESCONHECIDO_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "EUA" @@ -5536,9 +5594,9 @@ msgstr "" "Nada modificado." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5547,29 +5605,28 @@ msgstr "" "corretamente.\n" "Você gostaria de ignorar esta linha e continuar a análise?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "%i indefinido" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:229 msgid "Undo Load State" -msgstr "Desfazer carregamento de estado" +msgstr "Desfazer Instante Carregado" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Desfazer carregamento de estado" +msgstr "Desfazer Instante Salvo" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Chamada 0x80 inesperada? Abortando..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Desconhecido" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Comando de DVD desconhecido %08x - Erro Fatal" @@ -5584,12 +5641,12 @@ msgstr "Comando desconhecido 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Tipo de entrada desconhecido %i no SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Menssagem desconhecida recebida com identificação: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5600,16 +5657,16 @@ msgstr "" msgid "Up" msgstr "Para cima" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Atualizar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Wiimote na Vertical" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Usar modo EuRGB60 (PAL60)" @@ -5617,7 +5674,7 @@ msgstr "Usar modo EuRGB60 (PAL60)" msgid "Use Fullscreen" msgstr "Usar Tela Cheia" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Usar Hex" @@ -5632,6 +5689,11 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Usa um algoritmo de menor precisão para calcular os dados de profundidade.\n" +"Causa problemas em alguns jogos, mas pode garantir um aumento considerável " +"na velocidade.\n" +"\n" +"Se estiver em dúvida, deixe desmarcado." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5646,6 +5708,20 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Usa operações inseguras para acelerar o fluxo de vértice em OpenGL. Não há " +"problemas conhecidos quanto ao suporte das GPUs, mas pode causar diversos " +"problemas gráficos e de instabilidade.\n" +"\n" +"Se estiver em dúvida, deixe isto desmarcado." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5669,12 +5745,11 @@ msgstr "Utilitário" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "Hack de velocidade MMU" +msgstr "Hack de Velocidade VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Valor" @@ -5682,7 +5757,7 @@ msgstr "Valor" msgid "Value:" msgstr "Valor:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Valor:" @@ -5692,9 +5767,9 @@ msgstr "Verbosidade" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hack de Fluxo de Vértice" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Vídeo" @@ -5702,17 +5777,17 @@ msgstr "Vídeo" msgid "Virtual" msgstr "Virtual" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volume" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Falha na instalação da WAD: Erro na criação de %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Falha na instalação da WAD: Erro na criação do ticket" @@ -5734,19 +5809,19 @@ msgstr "" msgid "Warning" msgstr "Aviso" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Aviso - Inicializando DOL no modo de console errado!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Aviso - Inicializando ELF no modo de console errado!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Aviso - Inicializando ISO no modo de console errado!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5771,7 +5846,7 @@ msgstr "" "que tenham o mesmo nome de um arquivo do Memory Card\n" "Continuar?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5782,7 +5857,7 @@ msgstr "" "(byte %u > %u) (frame %u > %u). Você deveria carregar outro instante salvo, " "ou carregar este instante com o modo somente-leitura desligado." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5794,7 +5869,7 @@ msgstr "" "este instante com o modo somente-leitura desligado. Caso contrário você " "provavelmente terá uma desincronização." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5849,19 +5924,15 @@ msgstr "Largura" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Console do Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Raiz do Wii NAND" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importar Save de Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Arquivos de Save do Wii (*.bin)|*.bin" @@ -5870,16 +5941,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Não foi possível ler o arquivo" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote Conectado" @@ -5887,7 +5964,7 @@ msgstr "Wiimote Conectado" msgid "Wiimote Motor" msgstr "Motor do Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Configurações do Wiimote" @@ -5911,16 +5988,16 @@ msgstr "Janelas da Direita" msgid "Word Wrap" msgstr "Word Wrap" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Funcionando..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "Gravar memcards (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5938,21 +6015,36 @@ msgstr "Escrever para o Arquivo" msgid "Write to Window" msgstr "Escrever na Janela" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice falhou: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 Falha na inicialização: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 Criação de Master Voice falhou: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice falhou: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 Falha na inicialização: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 Criação de Master Voice falhou: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5987,11 +6079,11 @@ msgstr "Você não pode fechar painéis que têm páginas neles." msgid "You must choose a game!!" msgstr "Você deve escolher um jogo!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Você deve digitar um nome!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Você deve digitar um valor válido decimal, hexadecimal ou octal." @@ -5999,7 +6091,7 @@ msgstr "Você deve digitar um valor válido decimal, hexadecimal ou octal." msgid "You must enter a valid profile name." msgstr "Você deve digitar um nome válido para o perfil." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Você deve reiniciar o Dolphin para que as modificações tenham efeito." @@ -6013,7 +6105,7 @@ msgstr "" "Gostaria de parar agora para resolver o problema?\n" "Se você escolher \"Não\", o áudio pode falhar." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6032,15 +6124,15 @@ msgstr "" "Ele deveria ter 0x%04x (mas tem 0x%04llx)\n" "Você gostaria de gerar um novo?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" -msgstr "Hack do ZTB" +msgstr "Hack do ZTP" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Código Zero 3 não é suportado" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Código Zero desconhecido pelo Dolphin: %08x" @@ -6100,20 +6192,24 @@ msgstr "" "\n" "Se estiver em dúvida, deixe isto desativado." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Lendo Opcode de %x. Favor reportar." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "flavor desconhecido %d (esperado %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "mensagem desconhecida recebida" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute retornou -1 ao rodar o aplicativo!" @@ -6129,56 +6225,49 @@ msgstr "Correção do zNear:" msgid "| OR" msgstr "| OR" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Emulação correta do VBeam" +#~ msgid "Could not create %s" +#~ msgstr "Não pôde criar %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Editar substituições locais" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "" +#~ "Abre as substituições especificadas pelo usuário em um editor de texto " +#~ "externo." #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Permite mudar algumas opções através das teclas 3 (Resolução Interna), 4 " -#~ "(Proporção), 5 (Cópias de EFB) e 6 (Neblina) dentro da janela de " -#~ "emulação.\n" +#~ "Selecione qual API gráfica será usada internamente.\n" +#~ "Direct3D 9 geralmente é a mais rápida. No entanto, a OpenGL é a mais " +#~ "precisa. Direct3D 11 fica entre as outras duas.\n" +#~ "Lembre-se que os Direct3D backends só estão disponíveis no Windows.\n" #~ "\n" -#~ "Se estiver em dúvida, deixe isto desativado." - -#~ msgid "Enable Hotkeys" -#~ msgstr "Ativar Hotkeys" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Não foi possível Ouvir!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Falha ao carregar bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Falha ao carregar hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Configuração do GCMic" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY foi chamado, favor reportar!" +#~ "Se estiver em dúvida, use Direct3D 11." #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use OpenGL." #~ msgstr "" -#~ "Se a taxa de FPS estiver instável, esta opção pode ajudar. (ON = " -#~ "Compatível, OFF = Rápido)" +#~ "Selecione qual API gráfica será usada internamente.\n" +#~ "Direct3D 9 geralmente é a mais rápida. No entanto, a OpenGL é a mais " +#~ "precisa. Direct3D 11 fica entre as outras duas.\n" +#~ "Lembre-se que os Direct3D backends só estão disponíveis no Windows.\n" +#~ "\n" +#~ "Se estiver em dúvida, use Direct3D 11." -#~ msgid "Last Overwritten State" -#~ msgstr "Último State sobrescrito" - -#~ msgid "Last Saved State" -#~ msgstr "Último State Salvo" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Reconectar Wiimote ao carregar Estado Salvo" - -#~ msgid "Set" -#~ msgstr "Definir" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Não fazer o Dest. Alpha Pass" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Lendo Opcode de %x. Favor reportar." diff --git a/Languages/po/ru.po b/Languages/po/ru.po index eac42ed2a6..0e0632c987 100644 --- a/Languages/po/ru.po +++ b/Languages/po/ru.po @@ -3,15 +3,15 @@ # This file is distributed under the same license as the dolphin-emu package. # # Translators: -# N69 <69@no-spam.ws>, 2013 +# N69 , 2013 # Kein , 2011 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" -"Last-Translator: N69 <69@no-spam.ws>\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" +"Last-Translator: delroth \n" "Language-Team: Russian (http://www.transifex.com/projects/p/dolphin-emu/" "language/ru/)\n" "Language: ru\n" @@ -21,13 +21,13 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(Ñлишком много)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " Игра : " @@ -35,7 +35,7 @@ msgstr " Игра : " msgid "! NOT" msgstr "! ÐЕТ" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -44,7 +44,7 @@ msgstr "" "\"%s\" не ÑущеÑтвует.\n" " Создать новую карту памÑти на 16Мб?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -60,28 +60,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sКопировать%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" -msgstr "" +msgstr "%d примеры" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" -msgstr "" +msgstr "%d примеры (уровень качеÑтва %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s уже ÑущеÑтвует, перепиÑать?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s не может быть Ñжат. Возможно образ поврежден." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -90,7 +90,7 @@ msgstr "" "%s невозможно загрузить карту памÑти\n" "Размер файла карты поврежден (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -99,7 +99,7 @@ msgstr "" "%s невозможно загрузить карту памÑти\n" "Размер карты поврежден (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -108,22 +108,27 @@ msgstr "" "%s невозможно загрузить карту памÑти\n" "Размер файла неверен (0x%x bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s не может быть открыт" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s - пуÑтой файл" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s уже Ñжат! Больше Ñжать нельзÑ." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s Ñлишком длинное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° 45 знаков" @@ -152,7 +157,7 @@ msgstr "%u Свободных блоков; %u Свободных папок" msgid "&& AND" msgstr "&& И" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&О программе" @@ -160,7 +165,7 @@ msgstr "&О программе" msgid "&Boot from DVD Drive..." msgstr "&ЗапуÑтить игру Ñ DVD-диÑка..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Закладки" @@ -168,19 +173,19 @@ msgstr "&Закладки" msgid "&Browse for ISOs..." msgstr "&Выбрать папку Ñ ISO-файлами..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Менеджер &читов" #: Source/Core/DolphinWX/Src/FrameTools.cpp:179 msgid "&DSP Settings" -msgstr "&Опции аудио" +msgstr "ÐаÑтройка &DSP" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Удалить ISO-файл..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Удалить выбранные ISO-файлы..." @@ -192,19 +197,19 @@ msgstr "&ЭмулÑциÑ" msgid "&File" msgstr "&Файл" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "&Frame Advance" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&ПолноÑкранный режим" #: Source/Core/DolphinWX/Src/FrameTools.cpp:178 msgid "&Graphics Settings" -msgstr "&Опции видео" +msgstr "ÐаÑтройка &видео" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Помощь" @@ -212,7 +217,7 @@ msgstr "&Помощь" msgid "&Hotkey Settings" msgstr "&ÐаÑтройка \"ГорÑчих\" клавиш" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -224,11 +229,11 @@ msgstr "БыÑÑ‚Ñ€Ð°Ñ &загрузка" msgid "&Memcard Manager (GC)" msgstr "&Менеджер карт памÑти (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "Па&мÑÑ‚ÑŒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "Выбор &файла Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка..." @@ -236,59 +241,59 @@ msgstr "Выбор &файла Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка..." msgid "&Options" msgstr "&Опции" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Пауза" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&ЗапуÑтить" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&СвойÑтва" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "&Режим \"Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\"" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Обновить ÑпиÑок игр" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&РегиÑтры" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&СброÑить" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "З&вук" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&ОÑтановить" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&ИнÑтрументы" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Видео" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Вид" #: Source/Core/DolphinWX/Src/FrameTools.cpp:181 msgid "&Wiimote Settings" -msgstr "Опц&ии Wiimote" +msgstr "ÐаÑтройка &Wiimote" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&ЭнциклопедиÑ" @@ -313,9 +318,8 @@ msgid "(off)" msgstr "(отключен)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ ДОБÐВИТЬ" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -323,25 +327,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "" +msgstr "1.5x Native (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 бит" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "" +msgstr "1x Native (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "" +msgstr "2.5x Native (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "" +msgstr "2x Native (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 бита" @@ -351,13 +355,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "" +msgstr "3x Native (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "" +msgstr "4x Native (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 бит" @@ -369,7 +373,7 @@ msgstr "<Введите название>" msgid "" msgstr "<Разрешений Ñкрана не найдено>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<Ðичего>" @@ -377,7 +381,7 @@ msgstr "<Ðичего>" msgid "" msgstr "<Ðажмите кнопку>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<СиÑтемный>" @@ -386,12 +390,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Окно Ñетевой игры уже открыто!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Игра не запущена." @@ -400,9 +404,10 @@ msgid "" "A supported bluetooth device could not be found.\n" "You must manually connect your wiimotes." msgstr "" +"Поддерживаемых уÑтройÑтв bluetooth не найдено.⎠Вы должны вручную подключить " +"wiimote'Ñ‹." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -411,40 +416,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"Ð’ÐИМÐÐИЕ:\n" -"\n" -"Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñетевой игры будет корректно работать только при Ñледующих " -"наÑтройках:\n" -" - Режим DualCore [ВЫКЛ]\n" -" - Audio Throttle [ВЫКЛ]\n" -" - DSP-HLE Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð¾Ð¼ через \"Null Audio\" или Ñ DSP-LLE\n" -" - Ð ÑƒÑ‡Ð½Ð°Ñ ÑƒÑтановка кол-ва контроллеров, которые будут иÑпользованы в игре, " -"на значение [Standard Controller]\n" -"\n" -"Ð’Ñе игроки должны иÑпользовать одинаковую верÑию ÑмулÑтора и одинаковые " -"наÑтройки.\n" -"РекомендуетÑÑ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ поддержку карт памÑти или же заранее разоÑлать вÑем " -"одинаковые.\n" -"Поддержка Wiimote пока отÑутÑтвует.\n" -"\n" -"Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹ вам необходимо открыть указанный порт на вашем роутере!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR-коды" @@ -488,7 +475,7 @@ msgstr "" "Ошибочный код:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -496,7 +483,7 @@ msgstr "" "Ошибка ActionReplay: неверный размер (%08x : Ð°Ð´Ñ€ÐµÑ = %08x) в добавлÑемом " "коде (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -505,56 +492,62 @@ msgstr "" "Ошибка Action Replay: Ðеверный размер (%08x : address = %08x) в Fill и " "Slide (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" +"Ошибка Action Replay: Ðеверный размер (%08x : address = %08x) в заполнении " +"ОЗУ (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" +"Ошибка Action Replay: Ðеверный размер (%08x : address = %08x) в ОЗУ к точке " +"(%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" -msgstr "" +msgstr "Ошибка Action Replay: Ðеверное значение (%08x) в копии памÑти (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" +"Ошибка Action Replay: оÑновной код и запиÑÑŒ в CCXXXXXX не реализована (%s) ⎠" +"оÑновные коды не нужны. Ðе иÑпользуйте оÑновные кодоы." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" -msgstr "" +msgstr "Ошибка Action Replay: Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ AR кода: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" -msgstr "" +msgstr "Action Replay: Ðеврный размер уÑловного кода %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" -msgstr "" +msgstr "Action Replay: Ðеверный тип нормального кода %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" -msgstr "" +msgstr "Action Replay: Ðормальный код %i: неверный подтип %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" -msgstr "" +msgstr "Action Replay: Ðормальный код 0: неверный подтип %08x (%s)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:248 msgid "Adapter:" @@ -565,11 +558,11 @@ msgstr "Ðдаптер:" msgid "Add" msgstr "Добавить" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Добавление ActionReplay-кода" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Добавление патча" @@ -577,9 +570,9 @@ msgstr "Добавление патча" msgid "Add new pane" msgstr "Добавить панель" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Добавить..." @@ -611,7 +604,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:808 msgid "Adjust the analog control pressure required to activate buttons." -msgstr "" +msgstr "ÐаÑтройка Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð°, необходима Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ кнопок." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:520 msgid "Advanced" @@ -621,32 +614,32 @@ msgstr "РаÑширенные" msgid "Advanced Settings" msgstr "РаÑширенные наÑтройки" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Ð’Ñе GC/Wii файлы (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Ð’Ñе GC/Wii образы (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Ð’Ñе GCM-файлы Gamecube (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Файлы быÑтрых Ñохранений (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Файлы образов Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Сжатые образа диÑков GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Ð’Ñе файлы (*.*)|*.*" @@ -666,19 +659,19 @@ msgstr "ÐÐ½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" msgid "Anti-Aliasing:" msgstr "Сглаживание:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Загрузчик неверноего размера... Ñто точно загрузчик?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" -msgstr "" +msgstr "Загрузчик недоÑтупен при загрузке из файла" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Загрузчик:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Применить" @@ -688,8 +681,10 @@ msgid "" "\n" "If unsure, select (off)." msgstr "" +"Включить Ñффекты поÑÑ‚-процеÑÑа поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ð´Ñ€Ð°. ⎠⎠ЕÑли не уверены, " +"выберете (выкл)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabic" @@ -698,7 +693,7 @@ msgstr "Arabic" msgid "Are you sure you want to delete \"%s\"?" msgstr "Ð’Ñ‹ уверены, что хотите удалить \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -706,15 +701,20 @@ msgstr "" "Ð’Ñ‹ уверены, что хотите удалить Ñти файлы?\n" "Они иÑчезнут навÑегда!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Ð’Ñ‹ уверены, что хотите удалить Ñтот файл? Он иÑчезнет навÑегда!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" -msgstr "" +msgstr "Arm JIT (ÑкÑпериментальный)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (ÑкÑпериментальный)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "Соотношение Ñторон:" @@ -723,12 +723,12 @@ msgstr "Соотношение Ñторон:" msgid "At least one pane must remain open." msgstr "Ð¥Ð¾Ñ‚Ñ Ð±Ñ‹ одна панель должна быть открыта." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ðудио" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Вывод аудио:" @@ -736,7 +736,7 @@ msgstr "Вывод аудио:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтройÑтва вывода звука.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Ðвто" @@ -759,6 +759,8 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"ÐвтоматичеÑÐºÐ°Ñ Ð½Ð°Ñтройка размера окна под ваше внутренние разрешение.⎠⎠" +"ЕÑли вы не уверены, то галочку не Ñтавьте." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:705 msgid "B" @@ -772,16 +774,16 @@ msgstr "BP региÑтры" msgid "Back" msgstr "Ðазад" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "ÐаÑтройка вывода" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Вывод:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Фоновой ввод" @@ -790,7 +792,7 @@ msgstr "Фоновой ввод" msgid "Backward" msgstr "Взмах" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Ðеверный заголовок файла" @@ -799,15 +801,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Логотип" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Данные логотипа" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Логотип:" @@ -827,9 +829,9 @@ msgstr "ОÑновные наÑтройки" msgid "Bass" msgstr "БаÑÑ‹" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" -msgstr "" +msgstr "Блок таблицы Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ Ñуммы неудачна" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:625 msgid "Blocks" @@ -848,36 +850,36 @@ msgid "Blue Right" msgstr "СинÑÑ Ñправа" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Ñнизу" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:229 #, c-format msgid "Bound Controls: %lu" -msgstr "" +msgstr "Элементы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€Ð¸Ð²Ñзкой: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Ðе работает" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Обзор" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Выберите папку Ñ Ð¾Ð±Ñ€Ð°Ð·Ð°Ð¼Ð¸ игр" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Выбор папки Ñ ISO-файлами..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Укажите папку Ð´Ð»Ñ ÑохранениÑ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Буфер:" @@ -887,7 +889,7 @@ msgstr "Буфер:" msgid "Buttons" msgstr "Кнопки" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -926,33 +928,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Отмена" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Ðе удалоÑÑŒ открыть %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -960,7 +962,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -972,7 +974,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Catalan" @@ -980,11 +982,11 @@ msgstr "Catalan" msgid "Center" msgstr "Центр" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Сменить" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Сменить &диÑк..." @@ -992,11 +994,11 @@ msgstr "Сменить &диÑк..." msgid "Change Disc" msgstr "Изменить диÑк" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Сменить игру" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1012,12 +1014,12 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ опции вÑтупÑÑ‚ в Ñилу только поÑле перезапуÑка ÑмулÑтора." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Чат" @@ -1025,47 +1027,47 @@ msgstr "Чат" msgid "Cheat Code" msgstr "Чит-код" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "ПоиÑк кодов" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Менеджер чит-кодов" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Проверка целоÑтноÑти раздела" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Проверка целоÑтноÑти ..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinese (Simplified)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Выберите оÑновной DVD-диÑк:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Выберете папку Ñ NAND:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Выберите файл образа:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Выберите папку Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Выберите файл карты памÑти" @@ -1073,14 +1075,14 @@ msgstr "Выберите файл карты памÑти" msgid "Choose a memory card:" msgstr "Выберите карту памÑти:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²" @@ -1099,7 +1101,7 @@ msgstr "Circle Stick" msgid "Clear" msgstr "ОчиÑтить" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1109,7 +1111,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Закрыть" @@ -1118,11 +1120,11 @@ msgstr "Закрыть" msgid "Co&nfigure..." msgstr "&ÐаÑтройка ÑмулÑтора..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ коде" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Код:" @@ -1134,24 +1136,24 @@ msgstr "Команда" msgid "Comment" msgstr "Комментарий" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Комментарий:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Сжать ISO-файл..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Сжать выбранные ISO-файлы..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Сжатие образа" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "ÐаÑтройки" @@ -1165,18 +1167,18 @@ msgstr "ÐаÑтройка" msgid "Configure Control" msgstr "ÐаÑтройка управлениÑ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "ÐаÑтроить контроллеры" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "ÐаÑтройка ÑмулÑтора..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Подтвердить перезапиÑÑŒ файла" @@ -1189,17 +1191,16 @@ msgstr "Спрашивать при оÑтановке" msgid "Connect" msgstr "ПодключитьÑÑ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Подключить USB-клавиатуру" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Подключить USB-клавиатуру" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Подключить Wiimote %i" @@ -1220,7 +1221,7 @@ msgstr "Подключить Wiimote 3" msgid "Connect Wiimote 4" msgstr "Подключить Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Подключение..." @@ -1230,7 +1231,7 @@ msgstr "КонÑоль" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:88 msgid "Continuous Scanning" -msgstr "" +msgstr "Ðепрерывное Ñканирование" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:33 msgid "Control" @@ -1240,7 +1241,7 @@ msgstr "Ctrl" msgid "Convert to GCI" msgstr "Конвертировать в GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Копирование неудачно" @@ -1249,21 +1250,16 @@ msgstr "Копирование неудачно" msgid "Copy to Memcard %c" msgstr "Копировать на карту памÑти %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Ядро" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Ðе удалоÑÑŒ Ñоздать %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Ðе удалоÑÑŒ инициализировать вывод %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1274,22 +1270,16 @@ msgstr "" "игры GC/Wii. ПожалйÑта, учитывайте, что большинÑтво приводов Ð´Ð»Ñ ÐŸÐš не " "ÑпоÑобны прочитать оригинальные диÑки Ð´Ð»Ñ Gamecube и Wii." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Ðе удалоÑÑŒ определить ISO образ %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Ðе удалоÑÑŒ Ñохранить %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1303,27 +1293,27 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." -msgstr "" +msgstr "Ðевозможно инициализировать Ñдро.⎠Проверьте вашу конфигурацию." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Счетчик:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Страна:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Создать новый AR-код" @@ -1355,12 +1345,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Custom Projection Hack" @@ -1368,11 +1358,11 @@ msgstr "Custom Projection Hack" msgid "Custom Projection Hack Settings" msgstr "ÐаÑтройки Custom Projection Hack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Czech" @@ -1384,36 +1374,36 @@ msgstr "D" msgid "D-Pad" msgstr "D-Pad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "Ðудио" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "ЭмулÑтор движка DSP" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "ЭмулÑÑ†Ð¸Ñ DSP HLE (быÑтраÑ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "Интерпретатор DSP LLE (медленный)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE рекомпилÑтор" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "ÐаÑтройка аудио (DSP)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD-диÑк:" @@ -1425,15 +1415,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Размер данных" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Дата:" @@ -1462,29 +1452,28 @@ msgstr "Отладчик" msgid "Decimal" msgstr "ДеÑÑтичный" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "РаÑпаковка ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "СнÑÑ‚ÑŒ Ñжатие Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… ISO-файлов..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "РаÑпаковка ISO..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Обновление ÑпиÑка игр" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "СброÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Образ по умолчанию:" @@ -1526,8 +1515,8 @@ msgstr "" msgid "Device" msgstr "УÑтройÑтво" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "ÐаÑтройки уÑтройÑтв" @@ -1535,15 +1524,12 @@ msgstr "ÐаÑтройки уÑтройÑтв" msgid "Dial" msgstr "Вызов" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1556,7 +1542,7 @@ msgstr "Отключен" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "Отключить направление альфы" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1589,7 +1575,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "ДиÑк" @@ -1613,24 +1599,59 @@ msgstr "" msgid "Divide" msgstr "/" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Ð’Ñ‹ хотите оÑтановить ÑмулÑцию?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Декодер Dolby Pro Logic II" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "ÐаÑтройки графики %s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "&Веб-Ñайт ÑмулÑтора" @@ -1646,12 +1667,12 @@ msgstr "ÐаÑтройки Ñмулируемого Wiimote" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "ÐаÑтройки Dolphin GCPad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS ролики (*.dtm)" @@ -1659,11 +1680,11 @@ msgstr "Dolphin TAS ролики (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "ÐаÑтройка Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "&Репозиторий на Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1671,7 +1692,7 @@ msgstr "" "Dolphin не нашел образов игр GC/Wii. Щелкните дважды по Ñтой надпиÑи, чтобы " "указать путь..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1679,19 +1700,16 @@ msgstr "" "Dolphin наÑтроен на Ñкрытие вÑех игр. Кликните здеÑÑŒ два раза, чтобы " "показать игры..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Ðктивирует режим быÑтрого доÑтуп к диÑку, необходим Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… игр " -"(отключите Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÑовмеÑтимоÑти)." #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1711,11 +1729,11 @@ msgstr "Скачано %lu кодов. (добавлено %lu)" msgid "Drums" msgstr "Барабаны" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Макет" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Дампить аудио" @@ -1752,9 +1770,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Dutch" @@ -1778,7 +1796,7 @@ msgstr "" "-- ЕÑли вы недавно обновили Dolphin , то Ñкорее вÑего необходимо перегрузить " "компьютер, чтобы Windows обнаружил новый драйвер." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "ЕВРОПÐ" @@ -1786,7 +1804,7 @@ msgstr "ЕВРОПÐ" msgid "Early Memory Updates" msgstr "Ранние обновление памÑти" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Изменить" @@ -1794,7 +1812,7 @@ msgstr "Изменить" msgid "Edit ActionReplay Code" msgstr "Изменить код ActionReplay" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Править вручную" @@ -1802,12 +1820,12 @@ msgstr "Править вручную" msgid "Edit Patch" msgstr "Изменить патч" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Изменить точку" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Изменить..." @@ -1819,7 +1837,7 @@ msgstr "Эффект" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "" @@ -1846,7 +1864,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Эмулируемый Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "КачеÑтво ÑмулÑции:" @@ -1864,15 +1882,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Включить логирование AR-Ñобытий" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Включить Ñовмещение блоков" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1884,7 +1902,7 @@ msgstr "Включить кÑш" msgid "Enable Cheats" msgstr "Включить чит-коды" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Включить DualCore-режим" @@ -1892,7 +1910,7 @@ msgstr "Включить DualCore-режим" msgid "Enable Dual Core (speedup)" msgstr "Включить DualCore-режим (уÑкорение)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Включить IdleSkipping-режим" @@ -1900,7 +1918,7 @@ msgstr "Включить IdleSkipping-режим" msgid "Enable Idle Skipping (speedup)" msgstr "Включить IdleSkipping-режим (уÑкорение)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Включить MMU" @@ -1908,15 +1926,15 @@ msgstr "Включить MMU" msgid "Enable Progressive Scan" msgstr "Включить прогреÑÑивную развертку" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Включить режим \"Ð¡Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñкрана\"" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "" +msgstr "Включить динамик" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Включить широкий Ñкран" @@ -1937,7 +1955,7 @@ msgstr "" "Ð’ некоторых играх возможны проблемы.\n" " ЕÑли не уверены , выберите 1Ñ…." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1965,7 +1983,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -1973,11 +1991,11 @@ msgstr "" "УÑкорÑет игру The Legend of Zelda: Twilight Princess. Ð”Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ ДРУГОЙ игры " "данный хак должен быть ОТКЛЮЧЕÐ." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Включить Custom Projection Hack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -1985,19 +2003,13 @@ msgstr "" "Включить Dolby Pro Logic II ÑмулÑцию, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ 5.1 канальный звук. Ðет " "поддержки в OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Включить Dolby Pro Logic II ÑмулÑцию, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ 5.1 канальный звук. " "Ðеобходим OpenAL вывод звука." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2006,7 +2018,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2025,9 +2037,9 @@ msgstr "" msgid "End" msgstr "Конец" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "English" @@ -2050,21 +2062,20 @@ msgstr "ЗапиÑÑŒ %d/%d" msgid "Entry 1/%d" msgstr "ЗапиÑÑŒ 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Равно" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Ошибки" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "Ошибка загрузки выбранного Ñзыка. ВозвращаемÑÑ Ðº Ñтандартному." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2089,7 +2100,6 @@ msgid "Euphoria" msgstr "ЭйфориÑ" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2098,16 +2108,20 @@ msgstr "" msgid "Execute" msgstr "Выполнить" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "ЭкÑпорт неудачен" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "ЭкÑпортирование файла" @@ -2115,7 +2129,7 @@ msgstr "ЭкÑпортирование файла" msgid "Export Recording" msgstr "ЭкÑпорт запиÑи" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "&ЭкÑпортировать запиÑÑŒ процеÑÑа" @@ -2123,7 +2137,7 @@ msgstr "&ЭкÑпортировать запиÑÑŒ процеÑÑа" msgid "Export Save" msgstr "ЭкÑпортировать Ñохранение" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "ЭкÑпортировать Ñохранение Wii (ÑкÑперемент)" @@ -2131,15 +2145,15 @@ msgstr "ЭкÑпортировать Ñохранение Wii (ÑкÑперем msgid "Export all saves" msgstr "ЭкÑпортировать вÑе ÑохранениÑ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "ЭкÑпорт неудачен, повторить?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "&ЭкÑпортировать Ñохранение как..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "РаÑширение" @@ -2155,44 +2169,44 @@ msgstr "ЭкÑтра параметр" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Извлечь вÑе файлы..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Извлечь apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Извлечь DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "ИзвлеÑÑŒ папку..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Извлечь файл..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Извлечь раздел..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Извлечение %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Извлечение вÑех файлов" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Извлечение папки" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Подождите..." @@ -2204,15 +2218,15 @@ msgstr "Байт FIFO" msgid "FIFO Player" msgstr "FIFO Player" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "ФРÐÐЦИЯ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "Размер ТФС:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Ошибка подключаниÑ!" @@ -2220,11 +2234,15 @@ msgstr "Ошибка подключаниÑ!" msgid "Failed to download codes." msgstr "Ошибка ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¾Ð²." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Ошибка Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð² %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2252,20 +2270,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Ðевозможно прочитать %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" -msgstr "" +msgstr "Ðевозможно прочитать bk-заголовок" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2273,35 +2291,35 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… из файла %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" -msgstr "" +msgstr "Ðевозможно прочитать данные из файла: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2309,39 +2327,44 @@ msgstr "" "Ðевозможно прочитать директорию корректно \n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "Ðевозможно прочитать заголовок" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ID из образа диÑка" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Ошибка запиÑи BT.DINF в SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Ошибка запиÑи bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Ошибка запиÑи заголовка Ð´Ð»Ñ %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Ошибка запиÑи заголовка Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsi" @@ -2353,17 +2376,17 @@ msgstr "быÑтрое" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Более быÑÑ‚Ñ€Ð°Ñ Ð²ÐµÑ€Ñи MMU (работает не Ñо вÑеми играми)." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "FIFO Player" @@ -2387,7 +2410,7 @@ msgstr "" "Файл не может быть открыт\n" "или имеет неверное раÑширение" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2400,20 +2423,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Файл не раÑпознаетÑÑ ÐºÐ°Ðº карта памÑти" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Файл не Ñжат" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: неизвеÑтный режим Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Тип файла 'ini' неизвеÑтен! Его Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ!" @@ -2465,14 +2488,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2493,6 +2516,11 @@ msgstr "" msgid "Found %d results for '" msgstr "Ðайдено %d результатов Ð´Ð»Ñ '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2534,9 +2562,9 @@ msgstr "Кадров Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" msgid "Free Look" msgstr "Свободный обзор" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "French" @@ -2549,7 +2577,7 @@ msgstr "Лады" msgid "From" msgstr "Из" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "ПолнЭкран" @@ -2561,7 +2589,7 @@ msgstr "ПолноÑкранное разрешение:" msgid "GCI File(*.gci)" msgstr "Файл GCI(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "ДжойÑтик" @@ -2569,27 +2597,27 @@ msgstr "ДжойÑтик" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "ID игры:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Игра уже запущена!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Игра не запущена!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" -msgstr "" +msgstr "Игры не найдены!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "ПерÑональные наÑтройки игр" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "ÐаÑтройки игры" @@ -2606,20 +2634,20 @@ msgid "Gamecube &Pad Settings" msgstr "ÐаÑтройки джойÑтика Gamecube" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Файлы карт памÑти Gamecube (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "ÐаÑтройка контроллера GameCube" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko-коды" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2638,26 +2666,26 @@ msgstr "Общие" msgid "General Settings" msgstr "ОÑновные наÑтройки" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "German" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Видео" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "ÐаÑтройка видео" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Больше чем" @@ -2672,7 +2700,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Greek" @@ -2696,11 +2724,11 @@ msgstr "Гитара" msgid "Hacks" msgstr "Хаки" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Ошибка контрольной Ñуммы заголовка" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebrew" @@ -2712,7 +2740,7 @@ msgstr "Ð’Ñ‹Ñота" msgid "Help" msgstr "Помощь" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2724,7 +2752,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2774,7 +2802,7 @@ msgstr "ÐаÑтройка \"горÑчих\" клавиш" msgid "Hotkeys" msgstr "Клавиши" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Hungarian" @@ -2782,29 +2810,29 @@ msgstr "Hungarian" msgid "Hybrid Wiimote" msgstr "Гибридный Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - bad destination" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "ÐаÑтройки конÑоли (IPL)" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "ИК" @@ -2816,15 +2844,15 @@ msgstr "ИК указатель" msgid "IR Sensitivity:" msgstr "ЧувÑтвительноÑÑ‚ÑŒ IR-Ñигнала:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Данные образа" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Папки Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ образов" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ИТÐЛИЯ" @@ -2832,7 +2860,7 @@ msgstr "ИТÐЛИЯ" msgid "Icon" msgstr "Иконка" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2864,9 +2892,13 @@ msgstr "" msgid "Import Save" msgstr "Импортировать Ñохранение" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Ошибка импорта, попробовать еще раз?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -2888,21 +2920,16 @@ msgstr "" "Импортированный файл имеет раÑширение sav\n" "но Ñодержит неверный заголовок" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Почти играбельна" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Ð’ игре" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Лимит кадров:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "ИнформациÑ" @@ -2922,7 +2949,7 @@ msgstr "Insert" msgid "Insert Encrypted or Decrypted code here..." msgstr "Ð’Ñтавьте Ñюда Ñам код (шифрованный или нешифрованный)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Ð’Ñтавить SD-карту" @@ -2930,37 +2957,38 @@ msgstr "Ð’Ñтавить SD-карту" msgid "Insert name here.." msgstr "Введите Ð¸Ð¼Ñ ÐºÐ¾Ð´Ð°..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "УÑтановить WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "УÑтановить в меню Wii" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "Вызван InstallExceptionHandler, но ваша платформа его еще не поддерживает." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "УÑтановка WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Ошибка проверки целоÑтноÑти" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Проверка целоÑтноÑти завершена" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Проверка целоÑтноÑти завершена. Ошибок не было найдено." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2971,7 +2999,7 @@ msgstr "" msgid "Interface" msgstr "ИнтерфейÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "ÐаÑтройки интерфейÑа" @@ -2996,20 +3024,20 @@ msgstr "ВнутренÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° LZO - ошибка в lzo_init()" msgid "Internal Resolution:" msgstr "Внутреннее разрешение:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" -msgstr "" +msgstr "Интерпретатор (ОЧЕÐЬ медленно)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "ЗаÑтавка" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Invalid Size(%x) or Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Ðеверное значение!" @@ -3017,16 +3045,16 @@ msgstr "Ðеверное значение!" msgid "Invalid bat.map or dir entry" msgstr "Ðеверный bat.map или каталог" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Ðеверный тип ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ðеверный файл" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3037,7 +3065,7 @@ msgstr "" "%s\n" " Лучше Ñделать новую копию игры." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ðеверный файл запиÑи" @@ -3053,34 +3081,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Ðеверное Ñохранение" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italian" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "ЯПОÐИЯ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" -msgstr "" +msgstr "JIT-рекомпилÑтор (рекомендуетÑÑ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" -msgstr "" +msgstr "JITIL-ÑкÑпериментальный рекомпилÑтор" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Italian" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "КОРЕЯ" @@ -3099,8 +3129,9 @@ msgstr "Держать окно главным" msgid "Key" msgstr "КомбинациÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Korean" @@ -3122,12 +3153,12 @@ msgstr "L-Analog" msgid "Language:" msgstr "Язык" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Задержка:" @@ -3161,7 +3192,7 @@ msgstr "" "Левый/Правый клик Ð´Ð»Ñ Ð´Ð¾Ð¿. опций\n" "Средний-клик - очиÑтить." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Меньше чем" @@ -3178,101 +3209,90 @@ msgid "Load Custom Textures" msgstr "ИÑпользовать Ñвои текÑтуры" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "БыÑÑ‚Ñ€Ð°Ñ &загрузка" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Загрузить \"быÑтрое Ñохранение\" 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Загрузить \"быÑтрое Ñохранение\" 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Загрузить \"быÑтрое Ñохранение\" 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Загрузить \"быÑтрое Ñохранение\" 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Загрузить \"быÑтрое Ñохранение\" 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Загрузить \"быÑтрое Ñохранение\" 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Загрузить \"быÑтрое Ñохранение\" 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Загрузить \"быÑтрое Ñохранение\" 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "Загрузить \"быÑтрое Ñохранение\" 1" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Загрузить \"быÑтрое Ñохранение\" 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "Загрузить \"быÑтрое Ñохранение\" 2" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "Загрузить \"быÑтрое Ñохранение\" 3" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "Загрузить \"быÑтрое Ñохранение\" 4" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "Загрузить \"быÑтрое Ñохранение\" 5" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "Загрузить \"быÑтрое Ñохранение\" 6" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "Загрузить \"быÑтрое Ñохранение\" 7" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "Загрузить \"быÑтрое Ñохранение\" 8" +msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Загрузить \"быÑтрое Ñохранение\" 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Загрузить игру..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Загрузить ÑиÑтемное меню Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Загрузить ÑиÑтемное меню Wii %d%c" @@ -3291,10 +3311,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Локальный" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Лог" @@ -3323,12 +3339,12 @@ msgstr "" msgid "Logger Outputs" msgstr "Logger Outputs" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Окно лога" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Соединение Ñ Ñервером потерÑно!" @@ -3336,7 +3352,7 @@ msgstr "Соединение Ñ Ñервером потерÑно!" msgid "M Button" msgstr "Кнопка M" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3345,7 +3361,7 @@ msgstr "" "MD5 не Ñовпадает\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "УÑкорить MMU (Ñпидхак)" @@ -3359,11 +3375,11 @@ msgstr "Файлы Gameshark MadCatz (*.gcs)" msgid "Main Stick" msgstr "ОÑновной Ñтик" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "ID ÑоздателÑ:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Создатель:" @@ -3394,7 +3410,7 @@ msgid "Memory Byte" msgstr "Байт памÑти" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Карта памÑти" @@ -3404,7 +3420,7 @@ msgid "" "could mangle stuff!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3415,7 +3431,7 @@ msgid "" "Would you like to copy the old file to this new location?\n" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3423,7 +3439,7 @@ msgstr "" msgid "Menu" msgstr "Меню" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Мик." @@ -3436,7 +3452,7 @@ msgstr "Мин." msgid "Misc" msgstr "Разное" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Разное" @@ -3457,11 +3473,11 @@ msgstr "" msgid "Monospaced font" msgstr "Моноширный шрифт" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Мотор" @@ -3573,15 +3589,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Вверх" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "ИмÑ:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "ИмÑ:" @@ -3591,7 +3607,7 @@ msgstr "ИмÑ:" msgid "Native GCI files(*.gci)" msgstr "Стандартные CGI-файлы (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Ðовый поиÑк" @@ -3600,7 +3616,7 @@ msgstr "Ðовый поиÑк" msgid "Next Page" msgstr "След. Ñтраница" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "ИÑкать далее" @@ -3608,19 +3624,19 @@ msgstr "ИÑкать далее" msgid "Nickname :" msgstr "Ðик :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Страна не указана (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "ISO/WAD-файлов не обнаружено" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "Ðет вывода звука" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Ðе найден баннер Ð´Ð»Ñ %s" @@ -3646,42 +3662,43 @@ msgstr "" msgid "No recorded file" msgstr "Ðет файла Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Ðе найдена папка Ñ ÑохранениÑми Ð´Ð»Ñ %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "ОтÑутÑтвует" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norwegian Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Ðе равно" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "ÐеизвеÑтно" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Ðе подключено" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "ПримечаниÑ" @@ -3702,7 +3719,7 @@ msgstr "УведомлениÑ" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Кол-во кодов:" @@ -3723,7 +3740,7 @@ msgstr "Объект" msgid "Object Range" msgstr "Объект диапазона" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Выкл" @@ -3735,25 +3752,29 @@ msgstr "Смещение:" msgid "On-Screen Display Messages" msgstr "Выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Ñкран" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "ДоÑтупно только %d блоков" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Открыть" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Открыть &папку Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð¼" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Открыть папку Ñ &ÑохранениÑми Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Выбор файла Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка..." @@ -3779,7 +3800,13 @@ msgstr "Декодер текÑтур OpenCL" msgid "OpenMP Texture Decoder" msgstr "Декодер текÑтур OpenMP" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Опции" @@ -3800,7 +3827,7 @@ msgstr "" msgid "Other" msgstr "Другой" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3810,15 +3837,15 @@ msgstr "" msgid "Output" msgstr "Вывод" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Про&играть запиÑÑŒ процеÑÑа" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "ДжойÑтик" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "ДжойÑтик" @@ -3842,17 +3869,17 @@ msgstr "Параграф" msgid "Parameters" msgstr "Параметры " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Раздел %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Патчи" @@ -3860,8 +3887,8 @@ msgstr "Патчи" msgid "Paths" msgstr "Папки" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Пауза" @@ -3874,7 +3901,7 @@ msgstr "Пауза в конце ролика" msgid "Per-Pixel Lighting" msgstr "По-пиÑкельное оÑвещение" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Отлично" @@ -3884,9 +3911,9 @@ msgid "Perspective %d" msgstr "Точка %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "ЗапуÑк" @@ -3898,7 +3925,7 @@ msgstr "Проиграть запиÑанное" msgid "Play/Pause" msgstr "Старт/Пауза" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Играбельна" @@ -3906,11 +3933,11 @@ msgstr "Играбельна" msgid "Playback Options" msgstr "Параметры проÑмотра" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Игроки" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "ПожалуйÑта, подтвердите..." @@ -3922,23 +3949,23 @@ msgstr "ПожалуйÑта, Ñоздайте точку обозрениÑ, п msgid "Plus-Minus" msgstr "ПлюÑ-МинуÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polish" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Порт 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Порт 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Порт 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Порт 4" @@ -3947,11 +3974,11 @@ msgstr "Порт 4" msgid "Port :" msgstr "Порт :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portuguese" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portuguese (Brazilian)" @@ -3959,17 +3986,17 @@ msgstr "Portuguese (Brazilian)" msgid "Post-Processing Effect:" msgstr "Эффекты поÑÑ‚-обработки:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3986,7 +4013,7 @@ msgstr "Пред. Ñтраница" msgid "Previous Page" msgstr "Пред. Ñтраница" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Предыдущее значение" @@ -4002,7 +4029,7 @@ msgstr "Профиль" msgid "Properties" msgstr "СвойÑтва" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "ОчиÑтить кÑш" @@ -4011,7 +4038,7 @@ msgid "Question" msgstr "ВопроÑ" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Выход" @@ -4033,7 +4060,7 @@ msgstr "R-Analog" msgid "RAM" msgstr "ПамÑÑ‚ÑŒ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "РОССИЯ" @@ -4072,6 +4099,10 @@ msgstr "ÐаÑтоÑщий Wiimotes" msgid "Record" msgstr "ЗапиÑÑŒ" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ запиÑи" @@ -4102,7 +4133,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Обновить" @@ -4111,14 +4142,14 @@ msgstr "Обновить" msgid "Refresh List" msgstr "Обновить ÑпиÑок" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Обновление ÑпиÑка игр" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Удалить" @@ -4138,7 +4169,7 @@ msgstr "Выводить изображение в главное окно" msgid "Reset" msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Результаты" @@ -4146,9 +4177,9 @@ msgstr "Результаты" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "РевизиÑ:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 @@ -4159,18 +4190,17 @@ msgstr "Вправо" msgid "Right Stick" msgstr "Правый Ñтик" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "ВидбрациÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "РуÑÑкий" @@ -4183,7 +4213,7 @@ msgid "Safe" msgstr "безопаÑное" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Сохр." @@ -4193,79 +4223,75 @@ msgid "Save GCI as..." msgstr "Сохранить CGI-файл как..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "БыÑтрое &Ñохранение" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "БыÑтрое &Ñохранение" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 1" +msgstr "БыÑтрое Ñохранение 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 2" +msgstr "БыÑтрое Ñохранение 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:210 msgid "Save State Slot 3" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 2" +msgstr "БыÑтрое Ñохранение 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:211 msgid "Save State Slot 4" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 4" +msgstr "БыÑтрое Ñохранение 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:212 msgid "Save State Slot 5" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 5" +msgstr "БыÑтрое Ñохранение 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:213 msgid "Save State Slot 6" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 6" +msgstr "БыÑтрое Ñохранение 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:214 msgid "Save State Slot 7" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 7" +msgstr "БыÑтрое Ñохранение 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:215 msgid "Save State Slot 8" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 8" +msgstr "БыÑтрое Ñохранение 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Слот \"быÑтрого ÑохранениÑ\" 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Сохранить игру как..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Сохранить как..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Выберите меÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñжатого GCM/ISO-образа" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Сохранить точку" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Выберите меÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÑжатого GCM/ISO-образа" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4274,20 +4300,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "МаÑштабируемые EFB копии" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Сканирование %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "ПоиÑк образов диÑков" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "ПоиÑк..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Скриншот" @@ -4299,11 +4325,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "ПоиÑк" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Фильтр поиÑка" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "ИÑкать в подпапках" @@ -4326,12 +4352,12 @@ msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ %s не найдена в SYSCONF" msgid "Select" msgstr "Выбрать" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи игрового процеÑÑа" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Выберете Wii WAD файл Ð´Ð»Ñ ÑƒÑтановки" @@ -4350,19 +4376,19 @@ msgstr "Выберите файл ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°" msgid "Select floating windows" msgstr "Выберите плавающие окна" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Выберите файл Ñохранений Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Выберите файл ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Выберите или укажите файл Ð´Ð»Ñ Ð±Ñ‹Ñтрого ÑохранениÑ" @@ -4377,7 +4403,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4395,27 +4421,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Отправить" @@ -4427,18 +4454,18 @@ msgstr "МеÑтораÑположение ÑенÑора:" msgid "Separator" msgstr "Разделитель" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbian" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "ПоÑледовательный порт â„–1 - тип порта, который иÑпользуют такие уÑтройÑтва " "как Ñетевой адаптер." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Сделать &игрой по умолчанию" @@ -4447,7 +4474,7 @@ msgstr "Сделать &игрой по умолчанию" msgid "Set as default Memcard %c" msgstr "УÑтановить картой памÑти по умолчанию %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4458,19 +4485,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "ÐаÑтройки..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Файл наÑтроек не найден" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Ð’ÑÑ‚Ñ€ÑÑка" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Короткое имÑ:" @@ -4478,23 +4505,27 @@ msgstr "Короткое имÑ:" msgid "Shoulder Buttons" msgstr "Shoulder Buttons" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Отображать &конÑоль" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Показать &лог" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Отображать панель &ÑтатуÑа" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Отображать панель &инÑтрументов" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Отображать игры на DVD" @@ -4506,11 +4537,11 @@ msgstr "Показывать регионы копии EFB" msgid "Show FPS" msgstr "Показывать FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Франции" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "GameCube" @@ -4518,35 +4549,35 @@ msgstr "GameCube" msgid "Show Input Display" msgstr "Показать вывод Ñкрана" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Италии" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Кореи" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Отображать Ñзык:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Показать &наÑтройки логированиÑ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Отображать игры платформ..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Отображать игры регионов..." @@ -4554,27 +4585,27 @@ msgstr "Отображать игры регионов..." msgid "Show Statistics" msgstr "Показывать ÑтатиÑтику" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "ТайванÑ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "WAD-файлы" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Ðктивирует Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð± оÑтановке процеÑÑа ÑмулÑции игры." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4594,7 +4625,7 @@ msgstr "Показать первый блок" msgid "Show lag counter" msgstr "Показать лаги Ñчетчика" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4625,7 +4656,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "ÐеизвеÑтные" @@ -4636,23 +4667,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Повернутый Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Simplified Chinese" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Размер" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "ПропуÑкать загрузку BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "ПропуÑтить очиÑтку DCBZ" @@ -4670,17 +4702,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Слот %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Слот A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Слот B" @@ -4688,7 +4720,7 @@ msgstr "Слот B" msgid "Snapshot" msgstr "Снапшот" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Программный рендинг" @@ -4700,27 +4732,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "ÐаÑтройки ÑмулÑции звука" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Вывод звука %s не верен." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾-буфера %s." #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Пробел" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spanish" @@ -4740,37 +4772,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "УÑкорить чтение Ñ Ð´Ð¸Ñка" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Квадратный Ñтик" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Стандартный контроллер" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Старт" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "&Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð³Ñ€Ð°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Ðачать &запиÑÑŒ процеÑÑа" @@ -4778,7 +4802,7 @@ msgstr "Ðачать &запиÑÑŒ процеÑÑа" msgid "Start Recording" msgstr "Ðачать запиÑÑŒ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "СтатуÑ" @@ -4786,7 +4810,7 @@ msgstr "СтатуÑ" msgid "State Saves" msgstr "БыÑтрые ÑохранениÑ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "Рулевое колеÑо" @@ -4795,7 +4819,7 @@ msgid "Stick" msgstr "Стик" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Стоп" @@ -4821,39 +4845,42 @@ msgstr "Бренчать" msgid "Subtract" msgstr "Вычитать" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Файл уÑпешно ÑкÑпортирован в %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Сохранение уÑпешно импортировано" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Покачивание" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" -msgstr "" +msgstr "Синхронизировать поток GPU" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" +"Синхронизировать GPU и CPU потоки, Ð´Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлучайных завиÑаний в " +"ДвухÑдерном режиме. (ВКЛ = СовмеÑтимоÑÑ‚ÑŒ, ВЫКЛ = СкороÑÑ‚ÑŒ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Язык ÑиÑтемы:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "ТÐЙВÐÐЬ" @@ -4878,13 +4905,13 @@ msgstr "Ð›ÐµÐ²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" msgid "Table Right" msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Сделать Ñкриншот" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -4904,11 +4931,11 @@ msgstr "КÑширование текÑтур" msgid "Texture Format Overlay" msgstr "Ðаложение форматов текÑтур" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD-файл уÑпешно уÑтановлен" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Ðеверный адреÑ" @@ -4916,13 +4943,13 @@ msgstr "Ðеверный адреÑ" msgid "The checksum was successfully fixed" msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма уÑпешно иÑправлена" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Ð’Ñ‹Ð±Ð¿Ð²Ð½Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже в ÑпиÑке" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4943,7 +4970,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Файл %s уже открыт, Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿Ð¸Ñать заголовок." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Указанный файл (%s) не ÑущеÑтвует" @@ -4972,43 +4999,43 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Сохранение, которое вы пытаетеÑÑŒ Ñкопировать имеет неверный размер" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" "Выбранный Ñзык не поддерживаетÑÑ Ð²Ð°ÑˆÐµÐ¹ ÑиÑтемой. ВозвращаемÑÑ Ðº Ñтандартному." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "ВерÑии \"Ñетевой игры\" Ñервера и клиента неÑовмеÑтимы!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Сервер заполнен!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Ответ Ñ Ñервера: игра уже запущена!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Сервер приÑлал неизвеÑтное Ñообщение об ошибке!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Указанный файл \"%s\" не ÑущеÑтвует" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "Ðеверное значение" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Тема:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5016,7 +5043,7 @@ msgstr "" "Ðе найден билет Ð´Ð»Ñ 00000001/00000002. Ваша ÐºÐ¾Ð¿Ð¸Ñ NAND Ñкорее вÑего не " "полнаÑ." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5028,7 +5055,7 @@ msgstr "" "включена, выключена и неопределена (применÑетÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ðµ значение данной " "опции)." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5036,7 +5063,7 @@ msgstr "" "СимулÑтор action replay не поддерживает коды, которые менÑÑŽÑ‚ Ñам Action " "Replay. " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" "ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ опции может привеÑти к замедлению ÑмулÑции в Wii-меню и " @@ -5054,7 +5081,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -5062,7 +5089,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5070,7 +5097,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Это позволит вам вручную править INI файл Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸ÐµÐ¹" @@ -5079,12 +5106,12 @@ msgstr "Это позволит вам вручную править INI фай msgid "Threshold" msgstr "Порог" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Ðаклон" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Ðазвание" @@ -5098,20 +5125,18 @@ msgid "Toggle All Log Types" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "Соотношение Ñторон:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Копии" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 msgid "Toggle Fog" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Включение полноÑкранного режима" @@ -5121,15 +5146,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Ñверху" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Traditional Chinese" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Попытка загрузить неизвеÑтный тип файла." @@ -5147,7 +5173,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turkish" @@ -5163,12 +5189,12 @@ msgstr "Тип:" msgid "UDP Port:" msgstr "Порт UDP:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "ÐЕИЗВЕСТÐО" @@ -5177,7 +5203,7 @@ msgstr "ÐЕИЗВЕСТÐО" msgid "UNKNOWN_%02X" msgstr "UNKNOWN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "СШÐ" @@ -5190,12 +5216,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Ðе определено %i" @@ -5205,19 +5231,18 @@ msgid "Undo Load State" msgstr "Отменить загрузку" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Отменить загрузку" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." -msgstr "" +msgstr "Ðеожиданный вызов 0x80? Отмена..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "ÐеизвеÑтно" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¼Ð°Ð½Ð´Ð° DVD %08x - критичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" @@ -5225,19 +5250,19 @@ msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¼Ð°Ð½Ð´Ð° DVD %08x - критичеÑка #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:444 #, c-format msgid "Unknown command 0x%08x" -msgstr "" +msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "ÐеизвеÑтный тип запиÑи %i в SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Получено неизвеÑтное Ñообщение Ñ id : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "Получено неизвеÑтное Ñообщение Ñ id : %d от игрока:%d Игрок выкинут!" @@ -5247,16 +5272,16 @@ msgstr "Получено неизвеÑтное Ñообщение Ñ id : %d о msgid "Up" msgstr "Вверх" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Обновить" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Перевернутый Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "ИÑпользовать EuRGB60-режим (PAL60)" @@ -5264,7 +5289,7 @@ msgstr "ИÑпользовать EuRGB60-режим (PAL60)" msgid "Use Fullscreen" msgstr "ИÑпользовать полноÑкранный режим" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "ИÑпользовать HEX" @@ -5288,6 +5313,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5305,12 +5339,11 @@ msgstr "Утилиты" msgid "V-Sync" msgstr "V-Sync" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "УÑкорить MMU (Ñпидхак)" +msgstr "УÑкорение VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Значение" @@ -5318,7 +5351,7 @@ msgstr "Значение" msgid "Value:" msgstr "Значение:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Значение:" @@ -5330,7 +5363,7 @@ msgstr "Глубина анализа" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Видео" @@ -5338,17 +5371,17 @@ msgstr "Видео" msgid "Virtual" msgstr "Виртуальный" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "ГромкоÑÑ‚ÑŒ" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "Ошибка уÑтановки WAD: ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "Ðевозможно уÑтановить WAD: ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¸Ð»ÐµÑ‚Ð°" @@ -5366,19 +5399,19 @@ msgstr "" msgid "Warning" msgstr "Предупреждение" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Предупреждение: запуÑк DOL в неправильном режиме!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Предупреждение: запуÑк ELF в неправильном режиме!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Предупреждение: запуÑк ISO в неправильном режиме!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5401,7 +5434,7 @@ msgstr "" "Ñ Ñовпадающими именами будут перепиÑаны\n" "Продолжить?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5409,7 +5442,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5417,7 +5450,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5457,19 +5490,15 @@ msgstr "Ширина" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND Root:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Импорт Ñохранений Wii" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Файлы Ñохранений Wii (*.bin)|*.bin" @@ -5478,16 +5507,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ñ‡ÐµÑÑ‚ÑŒ файл" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote подключен" @@ -5495,7 +5530,7 @@ msgstr "Wiimote подключен" msgid "Wiimote Motor" msgstr "Включить поддержку мотора" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "ÐаÑтройка Wiimote" @@ -5519,16 +5554,16 @@ msgstr "Windows Right" msgid "Word Wrap" msgstr "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñтрок" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Подождите..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "ЗапиÑывать карты памÑти (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5546,21 +5581,36 @@ msgstr "СохранÑÑ‚ÑŒ в файл" msgid "Write to Window" msgstr "ЗапиÑать в окно" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice ошибка: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 ошибка инициализации: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ master voice: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice ошибка: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 ошибка инициализации: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ master voice: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF reg" @@ -5590,11 +5640,11 @@ msgstr "Ð’Ñ‹ не можете закрыть панель, в которой е msgid "You must choose a game!!" msgstr "Выберите игру!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Введите название!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Ðужно ввеÑти деÑÑтичное или шеÑтнадцатиричное чиÑло." @@ -5602,7 +5652,7 @@ msgstr "Ðужно ввеÑти деÑÑтичное или шеÑтнадцат msgid "You must enter a valid profile name." msgstr "Введите правильное Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "Ðеобходимо перезапуÑтить Dolphin, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." @@ -5613,7 +5663,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5631,15 +5681,15 @@ msgstr "" "Ваш файл SYSCONF неверного размера (0x%2$04llx), а должен быть 0x%1$04x\n" "Ð’Ñ‹ хотите Ñоздать новый?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "Включить ZTP-хак" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 code не поддерживаетÑÑ" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero code неизвеÑтен dolphin: %08x" @@ -5681,20 +5731,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "загрузчик (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Чтение кода операции из %x. ПожалуйÑта Ñообщите." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute вернул -1 при запуÑке приложениÑ!" @@ -5710,44 +5764,11 @@ msgstr "zNear КоррекциÑ: " msgid "| OR" msgstr "| ИЛИ" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "ÐÐºÐºÑƒÑ€Ð°Ñ‚Ð½Ð°Ñ VBeam ÑмулÑциÑ" +#~ msgid "Could not create %s" +#~ msgstr "Ðе удалоÑÑŒ Ñоздать %s" -#~ msgid "Enable Hotkeys" -#~ msgstr "Включить горÑчие клавиши" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Failed to Listen!!" -#~ msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ñлушать!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Ðевозможно загрузить bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "ÐаÑтройка GCMic" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "Вызван HCI_CMD_INQUIRY, пожалуйÑта Ñообщите!" - -#~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "" -#~ "ЕÑли FPS прыгает, Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ помочь. (ВКЛ = СовмеÑтимоÑÑ‚ÑŒ, ВЫКЛ = " -#~ "УÑкорение)" - -#~ msgid "Last Overwritten State" -#~ msgstr "ПоÑледнее перезапиÑанное Ñохранение" - -#~ msgid "Last Saved State" -#~ msgstr "ПоÑледнее Ñохранение" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Переподключить Wiimote 1, при загрузке \"быÑтрых Ñохранений\"" - -#~ msgid "Set" -#~ msgstr "Выбрать" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "ПропуÑтить Dest. Alpha доÑтуп" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Чтение кода операции из %x. ПожалуйÑта Ñообщите." diff --git a/Languages/po/sr.po b/Languages/po/sr.po index 6279a6a22d..dec349f532 100644 --- a/Languages/po/sr.po +++ b/Languages/po/sr.po @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" "Last-Translator: delroth \n" -"Language-Team: LANGUAGE \n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/dolphin-emu/" +"language/sr/)\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,13 +20,13 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "&" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Igra" @@ -33,7 +34,7 @@ msgstr "Igra" msgid "! NOT" msgstr "! NE" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -42,7 +43,7 @@ msgstr "" "\"%s\" ne postoji.\n" " Kreiraj novu memorisku karticu (16mb)?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\"je GCM/ISO fajl, ili nije GC/Wii ISO." @@ -57,64 +58,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "%1$sKopiraj%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s vec postoji, zameniti?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s ije uspelo da bude scrubbed. Najverovatnije je \"image\" ostecen." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s nije uspelo da otvori" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s je 0 byte fajl" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s je vec kompresovan! Nemoze se kompresovati vise." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s je previse dugo za \"filename\", maximalno slova 45" @@ -143,7 +149,7 @@ msgstr "" msgid "&& AND" msgstr "&& I" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&O" @@ -151,7 +157,7 @@ msgstr "&O" msgid "&Boot from DVD Drive..." msgstr "&Bootuj sa DVD drajvera" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "" @@ -159,7 +165,7 @@ msgstr "" msgid "&Browse for ISOs..." msgstr "&Trazi \"ISO\"" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Chit Meneger " @@ -167,11 +173,11 @@ msgstr "&Chit Meneger " msgid "&DSP Settings" msgstr "&DSP Opcije" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Obrisi ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Obrisi oznacene ISO fajlove..." @@ -183,11 +189,11 @@ msgstr "&Emulacija" msgid "&File" msgstr "&Fajl" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Pun Ekran" @@ -195,7 +201,7 @@ msgstr "&Pun Ekran" msgid "&Graphics Settings" msgstr "&Graficke Opcije" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Pomoc" @@ -203,7 +209,7 @@ msgstr "&Pomoc" msgid "&Hotkey Settings" msgstr "&Hotkey Opcije" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -215,11 +221,11 @@ msgstr "Loaduj Savestate" msgid "&Memcard Manager (GC)" msgstr "&Memorijska kartica (Meneger za GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Memorija" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Otvori..." @@ -227,51 +233,51 @@ msgstr "&Otvori..." msgid "&Options" msgstr "&Opcije" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pauza" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Pokreni" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Pribor/Opcije" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Refresuj listu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Registri" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Reset" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Zvuk" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "&Stop" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Alat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Pogledaj" @@ -279,7 +285,7 @@ msgstr "&Pogledaj" msgid "&Wiimote Settings" msgstr "&Wiimote Opcije" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "" @@ -304,9 +310,8 @@ msgid "(off)" msgstr "(iskljucen/o)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ DODAJ" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -316,7 +321,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" @@ -332,7 +337,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -348,7 +353,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -360,7 +365,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -368,7 +373,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -377,12 +382,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Netplay prozor je vec otvoren!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Nijedna igra trenutno nije pokrenuta." @@ -401,23 +406,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR Kodovi" @@ -456,66 +460,66 @@ msgid "" "%s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "" @@ -529,11 +533,11 @@ msgstr "Adapter" msgid "Add" msgstr "Dodaj" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Dodaj ActionReplay kod" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Dodaj Patch " @@ -541,9 +545,9 @@ msgstr "Dodaj Patch " msgid "Add new pane" msgstr "Dodaj nova okna" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Dodaj..." @@ -585,32 +589,32 @@ msgstr "" msgid "Advanced Settings" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "" @@ -630,19 +634,19 @@ msgstr "" msgid "Anti-Aliasing:" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Primeni " @@ -653,7 +657,7 @@ msgid "" "If unsure, select (off)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "" @@ -662,7 +666,7 @@ msgstr "" msgid "Are you sure you want to delete \"%s\"?" msgstr "Jeste li sigurni da zelite da obrisete \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -670,15 +674,19 @@ msgstr "" "Jeste li sigurni da zelite da obrisete ove fajlove?\n" "Nestace zauvek!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "Jesi li siguran da zelis da obrises ovaj fajl? Nestace zauvek!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "" @@ -687,12 +695,12 @@ msgstr "" msgid "At least one pane must remain open." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Zvuk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "" @@ -700,7 +708,7 @@ msgstr "" msgid "AudioCommon: Error opening AO device.\n" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -736,16 +744,16 @@ msgstr "" msgid "Back" msgstr "Nazad " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "" @@ -754,7 +762,7 @@ msgstr "" msgid "Backward" msgstr "U nazad" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "" @@ -763,15 +771,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Baner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Detalji o Baneru" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Baner:" @@ -791,7 +799,7 @@ msgstr "Osnovne opcije" msgid "Bass" msgstr "Bas" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "" @@ -812,7 +820,7 @@ msgid "Blue Right" msgstr "Blue right " #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Donji deo/dno" @@ -821,27 +829,27 @@ msgstr "Donji deo/dno" msgid "Bound Controls: %lu" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Ostecen/a/nje..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Trazi" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Trazi ISO direktoriju" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "" @@ -851,7 +859,7 @@ msgstr "" msgid "Buttons" msgstr "Tasteri" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -890,33 +898,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Odustani" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Nemoze otvoriti %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -924,7 +932,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -934,7 +942,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "" @@ -942,11 +950,11 @@ msgstr "" msgid "Center" msgstr "Centar " -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Promeni" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "Promeni &Disk..." @@ -954,11 +962,11 @@ msgstr "Promeni &Disk..." msgid "Change Disc" msgstr "Promeni Disk" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Promeni Igru" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -974,11 +982,11 @@ msgstr "" msgid "Changes sign to zNear Parameter (after correction)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chat/Caskanje" @@ -986,47 +994,47 @@ msgstr "Chat/Caskanje" msgid "Cheat Code" msgstr "Chit kod" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Trazi Chit" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Chit Meneger" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Kineski (pojednostavljen)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Kineski (tradicionalan)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Biraj fajl da otvoris " @@ -1034,14 +1042,14 @@ msgstr "Biraj fajl da otvoris " msgid "Choose a memory card:" msgstr "Biraj memorisku karticu:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "Biraj folder u kome zelis da ekstraktujes " @@ -1060,7 +1068,7 @@ msgstr "Klasik/a" msgid "Clear" msgstr "Ocisti" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1070,7 +1078,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Zatvori" @@ -1079,11 +1087,11 @@ msgstr "Zatvori" msgid "Co&nfigure..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Informacija o kodu " -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kod:" @@ -1095,24 +1103,24 @@ msgstr "Komanda" msgid "Comment" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Koment:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Kompresuj ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Kompresuj oznaceni ISO fajlovi..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Kompresivanje ISO fajla u toku" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Podesi" @@ -1126,18 +1134,18 @@ msgstr "" msgid "Configure Control" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "" @@ -1150,16 +1158,16 @@ msgstr "" msgid "Connect" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 msgid "Connect Balance Board" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "" @@ -1180,7 +1188,7 @@ msgstr "" msgid "Connect Wiimote 4" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Povezivanje..." @@ -1200,7 +1208,7 @@ msgstr "Kontrola" msgid "Convert to GCI" msgstr "Konvertuj u GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopiranje neuspesno " @@ -1209,21 +1217,16 @@ msgstr "Kopiranje neuspesno " msgid "Copy to Memcard %c" msgstr "Kopiraj na memorisku karticu %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1231,22 +1234,16 @@ msgid "" "most PC DVD drives." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1260,27 +1257,27 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Zemlja:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Kreiraj AR Kod" @@ -1312,12 +1309,12 @@ msgstr "" msgid "Crossfade" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "" @@ -1325,11 +1322,11 @@ msgstr "" msgid "Custom Projection Hack Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "" @@ -1341,36 +1338,36 @@ msgstr "" msgid "D-Pad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "" @@ -1382,15 +1379,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "" @@ -1419,16 +1416,16 @@ msgstr "" msgid "Decimal" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "" @@ -1440,7 +1437,7 @@ msgstr "" msgid "Default" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "" @@ -1482,8 +1479,8 @@ msgstr "" msgid "Device" msgstr "Uredjaj " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Opcije Uredjaja " @@ -1491,15 +1488,12 @@ msgstr "Opcije Uredjaja " msgid "Dial" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1545,7 +1539,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disk" @@ -1569,24 +1563,59 @@ msgstr "" msgid "Divide" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s Graficka Podesavanja " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin &Web Sajt" @@ -1602,12 +1631,12 @@ msgstr "" msgid "Dolphin FIFO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "" @@ -1615,28 +1644,28 @@ msgstr "" msgid "Dolphin Wiimote Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" @@ -1660,11 +1689,11 @@ msgstr "" msgid "Drums" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "" @@ -1701,9 +1730,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "" @@ -1724,7 +1753,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "" @@ -1732,7 +1761,7 @@ msgstr "" msgid "Early Memory Updates" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "" @@ -1740,7 +1769,7 @@ msgstr "" msgid "Edit ActionReplay Code" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "" @@ -1748,12 +1777,12 @@ msgstr "" msgid "Edit Patch" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "" @@ -1765,7 +1794,7 @@ msgstr "" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "" @@ -1792,7 +1821,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "" @@ -1810,15 +1839,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1830,7 +1859,7 @@ msgstr "" msgid "Enable Cheats" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "" @@ -1838,7 +1867,7 @@ msgstr "" msgid "Enable Dual Core (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "" @@ -1846,7 +1875,7 @@ msgstr "" msgid "Enable Idle Skipping (speedup)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "" @@ -1854,7 +1883,7 @@ msgstr "" msgid "Enable Progressive Scan" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "" @@ -1862,7 +1891,7 @@ msgstr "" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "" @@ -1879,7 +1908,7 @@ msgid "" "If unsure, select 1x." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1905,31 +1934,25 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -1940,7 +1963,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -1957,9 +1980,9 @@ msgstr "" msgid "End" msgstr "Kraj" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "" @@ -1982,21 +2005,20 @@ msgstr "" msgid "Entry 1/%d" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Error" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2019,7 +2041,6 @@ msgid "Euphoria" msgstr "" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "" @@ -2028,16 +2049,20 @@ msgstr "" msgid "Execute" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "" @@ -2045,7 +2070,7 @@ msgstr "" msgid "Export Recording" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "" @@ -2053,7 +2078,7 @@ msgstr "" msgid "Export Save" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "" @@ -2061,15 +2086,15 @@ msgstr "" msgid "Export all saves" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "" @@ -2085,44 +2110,44 @@ msgstr "" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "" @@ -2134,15 +2159,15 @@ msgstr "" msgid "FIFO Player" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "" @@ -2150,11 +2175,15 @@ msgstr "" msgid "Failed to download codes." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2182,20 +2211,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2203,73 +2232,78 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "" @@ -2281,17 +2315,17 @@ msgstr "Brzo " msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "" @@ -2313,7 +2347,7 @@ msgid "" "or does not have a valid extension" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2324,20 +2358,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "" @@ -2389,14 +2423,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2415,6 +2449,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2456,9 +2495,9 @@ msgstr "" msgid "Free Look" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "" @@ -2471,7 +2510,7 @@ msgstr "" msgid "From" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "" @@ -2483,7 +2522,7 @@ msgstr "" msgid "GCI File(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "" @@ -2491,27 +2530,27 @@ msgstr "" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Igra je vec pokrenuta!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Igra nije pokrenuta!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "" @@ -2528,20 +2567,20 @@ msgid "Gamecube &Pad Settings" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2560,26 +2599,26 @@ msgstr "" msgid "General Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Nemacki " -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafike" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Graficke opcije/podesavanja/konfiguracije..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "" @@ -2594,7 +2633,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "" @@ -2618,11 +2657,11 @@ msgstr "Gitara " msgid "Hacks" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "" @@ -2634,7 +2673,7 @@ msgstr "" msgid "Help" msgstr "Pomoc" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2646,7 +2685,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2689,7 +2728,7 @@ msgstr "" msgid "Hotkeys" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "" @@ -2697,29 +2736,29 @@ msgstr "" msgid "Hybrid Wiimote" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "" @@ -2731,15 +2770,15 @@ msgstr "" msgid "IR Sensitivity:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO Detalji " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "" @@ -2747,7 +2786,7 @@ msgstr "" msgid "Icon" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2779,8 +2818,12 @@ msgstr "" msgid "Import Save" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 @@ -2799,20 +2842,16 @@ msgid "" "but does not have a correct header" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 msgid "Increase Frame limit" msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info " @@ -2832,7 +2871,7 @@ msgstr "" msgid "Insert Encrypted or Decrypted code here..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "" @@ -2840,36 +2879,37 @@ msgstr "" msgid "Insert name here.." msgstr "Ubaci ime ovde..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2880,7 +2920,7 @@ msgstr "" msgid "Interface" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "" @@ -2903,20 +2943,20 @@ msgstr "" msgid "Internal Resolution:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Uvod" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "" @@ -2924,16 +2964,16 @@ msgstr "" msgid "Invalid bat.map or dir entry" msgstr "" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -2941,7 +2981,7 @@ msgid "" " You may need to redump this game." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "" @@ -2957,34 +2997,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italianski " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japanski " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA " @@ -3003,8 +3045,9 @@ msgstr "" msgid "Key" msgstr "Taster " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Korejski " @@ -3026,12 +3069,12 @@ msgstr "" msgid "Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3063,7 +3106,7 @@ msgid "" "Middle-click to clear." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "" @@ -3080,58 +3123,48 @@ msgid "Load Custom Textures" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "Loaduj Savestate" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Ucitaj State Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Ucitaj State Slot 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Ucitaj State Slot 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Ucitaj State Slot 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Ucitaj State Slot 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Uci State Slot 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Ucitaj State Slot 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Ucitaj State Slot 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Ucitaj State Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Ucitaj State Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3162,19 +3195,18 @@ msgid "Load State Slot 8" msgstr "Ucitaj State Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Ucitaj State Slot 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Ucitaj State" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "" @@ -3190,10 +3222,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "" @@ -3222,12 +3250,12 @@ msgstr "" msgid "Logger Outputs" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "" @@ -3235,14 +3263,14 @@ msgstr "" msgid "M Button" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" " %016llx%016llx != %016llx%016llx" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "" @@ -3256,11 +3284,11 @@ msgstr "" msgid "Main Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "" @@ -3291,7 +3319,7 @@ msgid "Memory Byte" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "" @@ -3301,7 +3329,7 @@ msgid "" "could mangle stuff!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3312,7 +3340,7 @@ msgid "" "Would you like to copy the old file to this new location?\n" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3320,7 +3348,7 @@ msgstr "" msgid "Menu" msgstr "Meni" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "" @@ -3333,7 +3361,7 @@ msgstr "" msgid "Misc" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "" @@ -3354,11 +3382,11 @@ msgstr "" msgid "Monospaced font" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "" @@ -3470,15 +3498,15 @@ msgstr "" msgid "NP Up" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "" @@ -3488,7 +3516,7 @@ msgstr "" msgid "Native GCI files(*.gci)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "" @@ -3497,7 +3525,7 @@ msgstr "" msgid "Next Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "" @@ -3505,11 +3533,11 @@ msgstr "" msgid "Nickname :" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "" @@ -3517,7 +3545,7 @@ msgstr "" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "" @@ -3543,42 +3571,43 @@ msgstr "" msgid "No recorded file" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "" @@ -3599,7 +3628,7 @@ msgstr "" msgid "Num Lock" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "" @@ -3620,7 +3649,7 @@ msgstr "" msgid "Object Range" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Izskljucen/o" @@ -3632,25 +3661,29 @@ msgstr "" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Otvori " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Otvori fajl..." @@ -3676,7 +3709,13 @@ msgstr "" msgid "OpenMP Texture Decoder" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Opcije " @@ -3697,7 +3736,7 @@ msgstr "" msgid "Other" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3707,15 +3746,15 @@ msgstr "" msgid "Output" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "" @@ -3739,17 +3778,17 @@ msgstr "" msgid "Parameters" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "" @@ -3757,8 +3796,8 @@ msgstr "" msgid "Paths" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pauza " @@ -3771,7 +3810,7 @@ msgstr "" msgid "Per-Pixel Lighting" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfektno " @@ -3781,9 +3820,9 @@ msgid "Perspective %d" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Pokreni " @@ -3795,7 +3834,7 @@ msgstr "Pokreni snimanje " msgid "Play/Pause" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "" @@ -3803,11 +3842,11 @@ msgstr "" msgid "Playback Options" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "" @@ -3819,23 +3858,23 @@ msgstr "" msgid "Plus-Minus" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polski " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -3844,11 +3883,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugalski " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "" @@ -3856,17 +3895,17 @@ msgstr "" msgid "Post-Processing Effect:" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3883,7 +3922,7 @@ msgstr "" msgid "Previous Page" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "" @@ -3899,7 +3938,7 @@ msgstr "Profil" msgid "Properties" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "" @@ -3908,7 +3947,7 @@ msgid "Question" msgstr "Pitanje " #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Izadji " @@ -3930,7 +3969,7 @@ msgstr "" msgid "RAM" msgstr "RAM " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "Rusija" @@ -3969,6 +4008,10 @@ msgstr "" msgid "Record" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "" @@ -3999,7 +4042,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "" @@ -4008,14 +4051,14 @@ msgstr "" msgid "Refresh List" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "" @@ -4035,7 +4078,7 @@ msgstr "" msgid "Reset" msgstr "Reset/Restart " -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Rezultati " @@ -4043,7 +4086,7 @@ msgstr "Rezultati " msgid "Return" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4056,18 +4099,17 @@ msgstr "" msgid "Right Stick" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "" @@ -4080,7 +4122,7 @@ msgid "Safe" msgstr "Siguran " #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Snimaj" @@ -4090,23 +4132,20 @@ msgid "Save GCI as..." msgstr "Snimaj GCI kao..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Snimaj state..." +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Snimaj state..." +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Snimaj State Slot 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Snimaj State Slot 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4137,32 +4176,31 @@ msgid "Save State Slot 8" msgstr "Snimaj State Slot 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Snimaj State Slot 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Snimaj state..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Snimaj kao..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Snimaj kompresovani GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "" @@ -4171,20 +4209,20 @@ msgstr "" msgid "Scaled EFB Copy" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Skeniranje za ISO fajlove " -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Skeniranje..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "" @@ -4196,11 +4234,11 @@ msgstr "" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Trazi Filter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Trazi Subfoldere " @@ -4223,12 +4261,12 @@ msgstr "" msgid "Select" msgstr "Izaberi " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Izaberi Snimani fajl" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "" @@ -4247,19 +4285,19 @@ msgstr "Izaberi \"Snimani fajl/Save file\" za importovanje " msgid "Select floating windows" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Izaberi fajl za ucitavanje " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Izaberi \"snimani fajl/the save state\"" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Izaberi state za ucitavanje " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Izaberi state za snimanje/save" @@ -4274,7 +4312,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4292,27 +4330,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Isprati" @@ -4324,16 +4363,16 @@ msgstr "" msgid "Separator" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "" @@ -4342,7 +4381,7 @@ msgstr "" msgid "Set as default Memcard %c" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4353,19 +4392,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "" -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "" @@ -4373,23 +4412,27 @@ msgstr "" msgid "Shoulder Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "" @@ -4401,11 +4444,11 @@ msgstr "" msgid "Show FPS" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "" @@ -4413,35 +4456,35 @@ msgstr "" msgid "Show Input Display" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "" @@ -4449,27 +4492,27 @@ msgstr "" msgid "Show Statistics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4484,7 +4527,7 @@ msgstr "" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4515,7 +4558,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "" @@ -4526,23 +4569,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Velicina" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4560,17 +4604,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "" @@ -4578,7 +4622,7 @@ msgstr "" msgid "Snapshot" msgstr "" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "" @@ -4590,27 +4634,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 #, c-format -msgid "Sound buffer creation failed: %s" +msgid "Sound buffer creation failed: %08x" msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "" @@ -4630,37 +4674,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Pokreni " -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Pokreni &NetPlay" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Pokreni Sni&manje" @@ -4668,7 +4704,7 @@ msgstr "Pokreni Sni&manje" msgid "Start Recording" msgstr "Pokreni Snimanje" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "" @@ -4676,7 +4712,7 @@ msgstr "" msgid "State Saves" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -4685,7 +4721,7 @@ msgid "Stick" msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr " Zaustavi" @@ -4711,39 +4747,40 @@ msgstr "" msgid "Subtract" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "" @@ -4768,13 +4805,13 @@ msgstr "" msgid "Table Right" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -4794,11 +4831,11 @@ msgstr "" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "" @@ -4806,13 +4843,13 @@ msgstr "" msgid "The checksum was successfully fixed" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4831,7 +4868,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "" @@ -4860,60 +4897,60 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "" @@ -4929,7 +4966,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -4937,7 +4974,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -4945,7 +4982,7 @@ msgid "" "cause occasional crashes/glitches." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "" @@ -4954,12 +4991,12 @@ msgstr "" msgid "Threshold" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "" @@ -4984,7 +5021,7 @@ msgstr "" msgid "Toggle Fog" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "" @@ -4994,15 +5031,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "" @@ -5020,7 +5058,7 @@ msgid "" "Wiimote bt ids are not available" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "" @@ -5036,12 +5074,12 @@ msgstr "" msgid "UDP Port:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "" @@ -5050,7 +5088,7 @@ msgstr "" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "" @@ -5063,12 +5101,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "" @@ -5078,19 +5116,18 @@ msgid "Undo Load State" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Snimaj state..." +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Nepoznat/o" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "" @@ -5105,12 +5142,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5120,16 +5157,16 @@ msgstr "" msgid "Up" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Updejt " -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "" @@ -5137,7 +5174,7 @@ msgstr "" msgid "Use Fullscreen" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "" @@ -5161,6 +5198,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5178,11 +5224,11 @@ msgstr "" msgid "V-Sync" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "" @@ -5190,7 +5236,7 @@ msgstr "" msgid "Value:" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "" @@ -5202,7 +5248,7 @@ msgstr "" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video " @@ -5210,17 +5256,17 @@ msgstr "Video " msgid "Virtual" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Jacina zvuka " -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5238,19 +5284,19 @@ msgstr "" msgid "Warning" msgstr "Upozorenje " -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Upozorenje - pokrece se DOL u pogresan konzol mod!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Upozorenje - pokrece se ELF u pogresan konzol mod!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Upozorenje - pogretanje ISO fajla u pogresan konzol mod!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5272,7 +5318,7 @@ msgstr "" "koji imaju isto ime kao i fajlovi na vasoj memoriskoj kartici\n" " Nastavi?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5280,7 +5326,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5288,7 +5334,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5328,19 +5374,15 @@ msgstr "" msgid "Wii" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "" @@ -5349,16 +5391,22 @@ msgid "WiiWAD: Could not read from file" msgstr "" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "&Wiimote Opcije" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "" @@ -5366,7 +5414,7 @@ msgstr "" msgid "Wiimote Motor" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "" @@ -5390,14 +5438,14 @@ msgstr "" msgid "Word Wrap" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Radi..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5417,21 +5465,36 @@ msgstr "" msgid "Write to Window" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5461,11 +5524,11 @@ msgstr "" msgid "You must choose a game!!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "" @@ -5473,7 +5536,7 @@ msgstr "" msgid "You must enter a valid profile name." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "" @@ -5484,7 +5547,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5498,15 +5561,15 @@ msgid "" "Do you want to generate a new one?" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "" @@ -5548,20 +5611,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "" - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "" @@ -5577,5 +5644,5 @@ msgstr "" msgid "| OR" msgstr "| ILI" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "Tacna VBeam emulacija" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" diff --git a/Languages/po/sv.po b/Languages/po/sv.po index 3d8f9a99e6..9809784169 100644 --- a/Languages/po/sv.po +++ b/Languages/po/sv.po @@ -4,12 +4,13 @@ # # Translators: # DolphinPhoenix , 2013 +# DolphinPhoenix , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-23 06:37-0500\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-11 20:36+0000\n" "Last-Translator: DolphinPhoenix \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/dolphin-emu/" "language/sv/)\n" @@ -19,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(för mÃ¥nga att visa)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Spel: " @@ -33,7 +34,7 @@ msgstr "Spel: " msgid "! NOT" msgstr "! INTE" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -42,7 +43,7 @@ msgstr "" "\"%s\" finns inte.\n" " Vill du skapa ett nytt 16MB minneskort?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" är en ogiltig GCM/ISO-fil, eller inte en GC/Wii-ISO." @@ -57,28 +58,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopiera%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "%d prov" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "%d prov (kvalitetsnivÃ¥ %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s finns redan, vill du skriva över?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s misslyckades att rensas. Förmodligen är bilden korrupt." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -87,7 +88,7 @@ msgstr "" "%s misslyckades att läsas in som ett minneskort \n" " Kortets filstorlek är ogiltig (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -96,32 +97,37 @@ msgstr "" "%s misslyckades att läsas in som ett minneskort \n" " Kortets storlek är ogiltig (0x%x bytes)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" "%s misslyckades att läsas in som ett minneskort.\n" -"Filen är inte tillräckligt stor för att vara en riktig minneskortsfil (0x%x " +"Filen är inte tillräckligt stor för att vara en giltig minneskortsfil (0x%x " "bytes)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s misslyckades att öppnas" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s misslyckades: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s är en fil pÃ¥ 0 byte" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s är redan komprimerad! Kan inte komprimera den ytterligare." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s är för lÃ¥ngt för filnamnet, maximalt antal tecken är 45" @@ -150,7 +156,7 @@ msgstr "%uFria block; %u fria mappingÃ¥ngar" msgid "&& AND" msgstr "&& OCH" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "&Om..." @@ -158,7 +164,7 @@ msgstr "&Om..." msgid "&Boot from DVD Drive..." msgstr "&Starta upp frÃ¥n DVD-enhet..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "&Brytpunkter" @@ -166,7 +172,7 @@ msgstr "&Brytpunkter" msgid "&Browse for ISOs..." msgstr "&Bläddra efter ISOs..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "&Fuskhanterare" @@ -174,11 +180,11 @@ msgstr "&Fuskhanterare" msgid "&DSP Settings" msgstr "&DSP-inställningar" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "&Radera ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "&Radera valda ISOs..." @@ -190,43 +196,43 @@ msgstr "&Emulering" msgid "&File" msgstr "&Arkiv" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "Avancerad &bildruta" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "&Helskärm" #: Source/Core/DolphinWX/Src/FrameTools.cpp:178 msgid "&Graphics Settings" -msgstr "&Grafikinställningar" +msgstr "G&rafikinställningar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "&Hjälp" #: Source/Core/DolphinWX/Src/FrameTools.cpp:182 msgid "&Hotkey Settings" -msgstr "&Kortkommandoinställningar" +msgstr "&Kortkommandosinställningar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" #: Source/Core/DolphinWX/Src/FrameTools.cpp:149 msgid "&Load State" -msgstr "&Läs in snabbsparning" +msgstr "L&äs in snabbsparning" #: Source/Core/DolphinWX/Src/FrameTools.cpp:192 msgid "&Memcard Manager (GC)" msgstr "&Minneskorthanterare (GC)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "&Minne" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "&Öppna..." @@ -234,51 +240,51 @@ msgstr "&Öppna..." msgid "&Options" msgstr "A<ernativ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "&Pausa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "&Spela" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "&Egenskaper" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" -msgstr "&Skrivskyddat läge" +msgstr "S&krivskyddat läge" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "&Uppdatera lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "&Listor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "&Ã…terställ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Ljud" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" -msgstr "&Stoppa" +msgstr "S&toppa" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "&Verktyg" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "&Video" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "&Visa" @@ -286,7 +292,7 @@ msgstr "&Visa" msgid "&Wiimote Settings" msgstr "Inställningar för &Wiimotes" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -311,9 +317,8 @@ msgid "(off)" msgstr "(av)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ LÄGG TILL" +msgstr "+ ADDERA" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -323,7 +328,7 @@ msgstr "0x44" msgid "1.5x Native (960x792)" msgstr "1.5x ursprunglig (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bitar" @@ -339,7 +344,7 @@ msgstr "2.5x ursprunglig (1600x1320)" msgid "2x Native (1280x1056)" msgstr "2x ursprunglig (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bitar" @@ -355,7 +360,7 @@ msgstr "3x ursprunglig (1920x1584)" msgid "4x Native (2560x2112)" msgstr "4x ursprunglig (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bitar" @@ -367,7 +372,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -375,7 +380,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -384,12 +389,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Ett nätspelsfönster är redan öppet!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Ett spel körs inte för tillfället." @@ -402,6 +407,7 @@ msgstr "" "Du mÃ¥ste ansluta dina wiimotes manuellt." #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 +#, fuzzy msgid "" "ALERT:\n" "\n" @@ -410,24 +416,21 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"!!FUZZY!!VARNING:\n" +"VARNING:\n" "\n" "Nätspel kommer bara fungera med följande inställningar:\n" " - Aktivera dubbla kärnor [AV]\n" " - DSP-emulatormotorn mÃ¥ste vara likadana pÃ¥ alla datorer!\n" " - DSP pÃ¥ tillägnad trÃ¥d [AV]\n" " - Bildrutegränsen ska inte vara inställd pÃ¥ [Ljud]\n" -" - Manuellt angivit det exakta antalet kontroller som ska användas som " -"[Standardkontroll]\n" "\n" "Alla spelare bör ha samma inställningar och version av Dolphin.\n" "Alla minneskort mÃ¥ste antingen vara identiska mellan spelare eller " @@ -436,13 +439,13 @@ msgstr "" "\n" "Värden mÃ¥ste ha angivit TCP-porten som öppen/vidarebefordrad!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-fotlist" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR-koder" @@ -491,7 +494,7 @@ msgstr "" "Brottkod:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" @@ -499,7 +502,7 @@ msgstr "" "Action Replay-fel: Ogiltig storlek (%08x : address = %08x) i 'Lägg till " "kod' (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -508,7 +511,7 @@ msgstr "" "Action Replay-fel: Ogiltig storlek (%08x : adress = %08x) i 'Fill and " "Slide' (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -517,7 +520,7 @@ msgstr "" "Action Replay-fel: Ogiltig storlek (%08x : adress = %08x) i 'Ram Write And " "Fill' (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -526,12 +529,12 @@ msgstr "" "Action Replay-fel: Ogiltig storlek (%08x : adress = %08x) i 'Write To " "Pointer' (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay-fel: Ogiltigt värde (%08x) i minneskopia (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -541,27 +544,27 @@ msgstr "" "(%s)\n" "Masterkoder behövs inte. Använd inte masterkoder." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay-fel: ogiltig AR-kodrad: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: TillstÃ¥ndskod: Ogiltig storlek %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Ogiltig typ av normalkod %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normalkod %i: Ogiltig undertyp %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normalkod 0: Ogiltig undertyp %08x (%s)" @@ -575,11 +578,11 @@ msgstr "Adapter:" msgid "Add" msgstr "Lägg till" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Lägg till ActionReplay-kod" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Lägg till patch" @@ -587,9 +590,9 @@ msgstr "Lägg till patch" msgid "Add new pane" msgstr "Lägg till ny panel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Lägg till..." @@ -645,32 +648,32 @@ msgstr "Avancerat" msgid "Advanced Settings" msgstr "Avancerade inställningar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Alla GC/Wii-filer (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Alla GC/Wii-bilder (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Alla GCM-filer för Gamecube (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Alla snabbsparningar (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Alla ISO-filer för Wii (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Alla komprimerade ISO-filer för GC/Wii (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Alla filer (*.*)|*.*" @@ -690,19 +693,19 @@ msgstr "Anisotropisk filtrering:" msgid "Anti-Aliasing:" msgstr "Kantutjämning:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader är i fel storlek...är det verkligen en apploader?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Det gick inte att läsa in apploader frÃ¥n fil" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Verkställ" @@ -716,16 +719,16 @@ msgstr "" "\n" "Om du är osäker kan du välja (av)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arabiska" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:667 #, c-format msgid "Are you sure you want to delete \"%s\"?" -msgstr "Vill du verkligen raders \"%s\"?" +msgstr "Vill du verkligen radera \"%s\"?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -733,16 +736,21 @@ msgstr "" "Vill du verkligen ta bort dessa filer?\n" "De kommer att försvinna för alltid!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Vill du verkligen radera denna fil? Den kommer att försvinna för alltid!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "Arm JIT (experimentell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (experimentell)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "BildförhÃ¥llande:" @@ -751,12 +759,12 @@ msgstr "BildförhÃ¥llande:" msgid "At least one pane must remain open." msgstr "Ã…tminstone en panel mÃ¥ste vara öppen." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ljud" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Ljudbackend:" @@ -764,7 +772,7 @@ msgstr "Ljudbackend:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: Fel uppstod när AO-enhet skulle öppnas.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Auto" @@ -803,16 +811,16 @@ msgstr "BP-register" msgid "Back" msgstr "Backsteg" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Backendinställningar" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Backend:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Bakgrundsindata" @@ -821,24 +829,24 @@ msgstr "Bakgrundsindata" msgid "Backward" msgstr "Tillbaka" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "DÃ¥lig headerfil" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balansbräda" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "Banner" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "Bannerdetaljer" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "Banner:" @@ -858,7 +866,7 @@ msgstr "Grundläggande inställningar" msgid "Bass" msgstr "Bas" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Kontrollsummering för blockallokeringstabellen misslyckades" @@ -879,7 +887,7 @@ msgid "Blue Right" msgstr "BlÃ¥ höger" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Under" @@ -888,27 +896,27 @@ msgstr "Under" msgid "Bound Controls: %lu" msgstr "Bundna kontroller: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Trasig" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Bläddra" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Bläddra efter en filmapp som ska läggas till" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Bläddra efter en ISO-sökväg..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Bläddra mapp för utdata" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Buffer:" @@ -918,7 +926,7 @@ msgstr "Buffer:" msgid "Buttons" msgstr "Knappar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -966,33 +974,33 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "Kan inte hitta Wiimote med anslutningshandtaget %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "Kan inte läsa frÃ¥n DVD_Plugin - DVD-gränssnitt: Allvarligt fel" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Avbryt" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "Kan inte öppna %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Kan inte avregistrera händelser när händelser väntar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1003,7 +1011,7 @@ msgstr "" "%s\n" "är inte en giltig minneskortsfil för GameCube" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1015,7 +1023,7 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Katalanska" @@ -1023,23 +1031,23 @@ msgstr "Katalanska" msgid "Center" msgstr "Centrum" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "Byt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." -msgstr "Byt &skiva" +msgstr "Byt s&kiva" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:167 msgid "Change Disc" msgstr "Byt skiva" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Byt spel" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1055,11 +1063,11 @@ msgstr "Ändrar tecken till parametern zFar (efter korrektion)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "Ändrar tecken till parametern zNear (efter korrigering)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "Detta kommer inte ha nÃ¥gon effekt om det ändras medan emulatorn körs!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Chatt" @@ -1067,55 +1075,55 @@ msgstr "Chatt" msgid "Cheat Code" msgstr "Fuskkod" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Sök efter fusk" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Fuskhanterare" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Kontrollera partitionintegritet" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Kontrollerar integritet..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Kinesiska (förenklad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Kinesiska (traditionell)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "Välj en DVD-filkatalog:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "Välj en mapp till NAND-rot:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Välj en standard-ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" -msgstr "Välj en filkatalog att läggas till" +msgstr "Välj en filkatalog att lägga till" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" -msgstr "Välj en fil som ska öppnas" +msgstr "Välj en fil att öppna" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:204 msgid "Choose a memory card:" msgstr "Välj ett minneskort:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1123,10 +1131,10 @@ msgstr "" "Välj fil som ska användas som apploader: (gäller endast skivor som är " "tillverkade frÃ¥n mappar)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" -msgstr "Välj extraheringsmappen" +msgstr "Välj mappen att extrahera till" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:285 msgid "Circle Stick" @@ -1143,17 +1151,17 @@ msgstr "Klassisk" msgid "Clear" msgstr "Rensa" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." msgstr "" -"Klienten avröt anslutningen medan spelet körs!! Nätspel är inaktiverat. Du " -"mÃ¥ste stoppa spelet manuellt." +"Klienten avbryter anslutningen medan spelet körs!! Nätspel är inaktiverat. " +"Du mÃ¥ste stoppa spelet manuellt." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Stäng" @@ -1162,11 +1170,11 @@ msgstr "Stäng" msgid "Co&nfigure..." msgstr "Ko&nfigurera..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Kodinfo" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kod:" @@ -1178,24 +1186,24 @@ msgstr "Kommando" msgid "Comment" msgstr "Kommentar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Kommentar:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Komprimera ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Komprimera valda ISOs..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Komprimerar ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Konfig." @@ -1209,18 +1217,18 @@ msgstr "Konfigurera" msgid "Configure Control" msgstr "Konfigurera kontroll" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Konfigurera styrplattor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Konfigurera..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Bekräfta överskrivning av fil" @@ -1233,17 +1241,16 @@ msgstr "Bekräfta vid stopp" msgid "Connect" msgstr "Anslut" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "Anslut USB-tangentbord" +msgstr "Anslut balansbräda" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "Anslut USB-tangentbord" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Anslut Wiimote %i" @@ -1264,7 +1271,7 @@ msgstr "Anslut Wiimote 3" msgid "Connect Wiimote 4" msgstr "Anslut Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "Ansluter..." @@ -1284,7 +1291,7 @@ msgstr "Kontroll" msgid "Convert to GCI" msgstr "Konvertera till GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopiering misslyckades" @@ -1293,21 +1300,16 @@ msgstr "Kopiering misslyckades" msgid "Copy to Memcard %c" msgstr "Kopiera till minneskortet %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Kärna" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "Kunde inte skapa %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Kunde inte initiera backend %s." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1318,25 +1320,16 @@ msgstr "" "ingen GC/Wii-backup. Var god notera att originalskivor för GameCube och Wii " "inte kan läsas av de flesta PC DVD-läsare." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Kunde inte känna igen ISO-fil %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "Kunde inte spara %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Kunde inte konfigurera kontroller. Spelaren lämnade spelet eller sÃ¥ körs " -"spelet för tillfället!\n" -"(Att konfigurera kontroller när spelet körs stöds inte ännu)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1358,11 +1351,11 @@ msgstr "" "I sÃ¥ fall kan du behöva ställa in dina minneskortsplatser i inställningarna " "igen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Kunde inte öppna kommandot för tillägget 'ini'!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1370,17 +1363,17 @@ msgstr "" "Kunde inte initiera kärnan.\n" "Kontrollera dina konfigurationer." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Räkna:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Land:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "Skapa AR-kod" @@ -1415,12 +1408,12 @@ msgstr "" msgid "Crossfade" msgstr "Överbländning" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "Den aktuella filmappen ändrades frÃ¥n %s till %s efter wxFileSelector!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Anpassad projektionshackning" @@ -1428,11 +1421,11 @@ msgstr "Anpassad projektionshackning" msgid "Custom Projection Hack Settings" msgstr "Anpassade inställnignar för projektionhackning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Anpassa nÃ¥gra ortografiska projektionsparametrar." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Tjeckiska" @@ -1444,36 +1437,36 @@ msgstr "D" msgid "D-Pad" msgstr "Styrplatta" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP-emulatormotor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE-emulation (snabb)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE-interpreterare (lÃ¥ngsam)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE-omkompilator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "DSP pÃ¥ tillägnad trÃ¥d" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "DSP-inställningar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "DSPLLE pÃ¥ separat trÃ¥d" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD-rotkatalog:" @@ -1486,15 +1479,15 @@ msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" "DVDLowUnencryptedRead - Allvarligt fel: Misslyckades att läsa frÃ¥n volym" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "Dansmatta" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Datastorlek" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Datum:" @@ -1523,29 +1516,28 @@ msgstr "Debuggning" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Avkomprimera ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Avkomprimera valda ISOs..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Avkomprimerar ISO" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Uppdatera spellista" +msgstr "Sänk bildrutegräns" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Standard" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Standard-ISO:" @@ -1565,7 +1557,7 @@ msgstr "Radera sparning" #: Source/Core/VideoCommon/Src/AVIDump.cpp:64 #, c-format msgid "Delete the existing file '%s'?" -msgstr "Radera existerande filen '%s'?" +msgstr "Radera den existerande filen '%s'?" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:680 msgid "Description" @@ -1589,8 +1581,8 @@ msgstr "" msgid "Device" msgstr "Enhet" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Enhetsinställningar" @@ -1598,15 +1590,12 @@ msgstr "Enhetsinställningar" msgid "Dial" msgstr "Ring" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1625,7 +1614,7 @@ msgstr "Inaktivera Destination Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" -msgstr "Inaktivera moln" +msgstr "Inaktivera dimma" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:109 msgid "" @@ -1669,7 +1658,7 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Skiva" @@ -1680,7 +1669,7 @@ msgstr "Diskläsningsfel" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:321 msgid "Display" -msgstr "Visa" +msgstr "Skärm" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:105 msgid "" @@ -1696,24 +1685,90 @@ msgstr "" msgid "Divide" msgstr "Dividera" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Vill du stoppa den aktuella emulationen?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "Dolby Pro Logic II-dekoder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin-teamet\n" +"\n" +"Förgrening: %s\n" +"Version: %s\n" +"Kompilerad: %s, kl %s\n" +"\n" +"Dolphin är en emulator för Gamecube/Wii, som\n" +"skrevs ursprungligen av F|RES och ector.\n" +"Idag är Dolphin ett projekt med öppen källkod med\n" +"mÃ¥nga bidragsgivare, för mÃ¥nga för att kunna lista upp.\n" +"Om du är intresserad kan du gÃ¥ till projektsidan pÃ¥\n" +"http://code.google.com/p/dolphin-emu/.\n" +"\n" +"Jättestort tack till Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 och Hotquik för deras\n" +"omvända ingenjörskonst och dokumentation/demos.\n" +"\n" +"Stort tack till Gilles Mouchard, vars Microlib PPC-\n" +"emulator som gav vÃ¥r utveckling en rivstart.\n" +"\n" +"Tack till Frank Wille för hans PowerPC-dissambler, som\n" +"or9 och vi modifierade för att inkludera detaljer om Gekko.\n" +"\n" +"Tack till hcs/destop för deras GC ADPCM-dekoder.\n" +"\n" +"Vi har ingen koppling till Nintendo pÃ¥ nÃ¥got sätt.\n" +"Gamecube och Wii är varumärken som tillhör Nintendo.\n" +"Emulatorn är endast för utbildningsändamÃ¥l och bör\n" +"inte användas för att spela spel som du inte äger \n" +"pÃ¥ ett lagligt sätt." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" -msgstr "Dolphin %s grafikkonfiguration" +msgstr "Dolphin %s-grafikkonfiguration" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphins &webbsida" @@ -1723,30 +1778,30 @@ msgstr "Dolphin-konfiguration" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:197 msgid "Dolphin Emulated Wiimote Configuration" -msgstr "Dolphin emulerad Wiimote-konfiguration" +msgstr "Dolphin konfiguration för emulerad Wiimote" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:382 msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GC-kontrollskonfiguration" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS-filmer (*.dtm)" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:8 msgid "Dolphin Wiimote Configuration" -msgstr "Dolphin Wiimote-konfiguration" +msgstr "Dolphin konfiguration för Wiimote" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin pÃ¥ &Google Code" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1754,7 +1809,7 @@ msgstr "" "Dolphin kunde inte hitta nÃ¥gra GC/Wii-ISOs. Dubbelklicka här för att bläddra " "efter filer..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1762,12 +1817,12 @@ msgstr "" "Dolphin är inställd pÃ¥ att gömma alla spel. Dubbelklicka här för att visa " "alla spel..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin kunde inte slutföra den begärda handlingen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" @@ -1793,11 +1848,11 @@ msgstr "Laddade ned %lu koder. (Lade till %lu)" msgid "Drums" msgstr "Trummor" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Dummy" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Dumpa ljud" @@ -1843,9 +1898,9 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Nederländska" @@ -1870,7 +1925,7 @@ msgstr "" "förmodligen en omstart för tillfället för att fÃ¥ Windows att hitta den nya " "drivrutinen." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPA" @@ -1878,7 +1933,7 @@ msgstr "EUROPA" msgid "Early Memory Updates" msgstr "Tidiga minnesuppdateringar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Redigera" @@ -1886,7 +1941,7 @@ msgstr "Redigera" msgid "Edit ActionReplay Code" msgstr "Redigera Action Replay-kod" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Redigera konfig." @@ -1894,12 +1949,12 @@ msgstr "Redigera konfig." msgid "Edit Patch" msgstr "Redigera patch" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Redigera aktuellt perspektiv" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Redigera..." @@ -1911,7 +1966,7 @@ msgstr "Effekt" msgid "Embedded Frame Buffer" msgstr "Inbäddad bildrutebuffer" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "EmuleringstrÃ¥d körs redan" @@ -1949,7 +2004,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Emulerad Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Emulationsnabbsparning:" @@ -1973,15 +2028,15 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "Aktivera AR-loggning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Aktivera blocksammanfogning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Aktivera beräkning av Bounding Box" @@ -1993,15 +2048,15 @@ msgstr "Aktivera cache" msgid "Enable Cheats" msgstr "Aktivera fusk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" -msgstr "Aktivera dubbel kärna" +msgstr "Aktivera dubbla kärnor" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:547 msgid "Enable Dual Core (speedup)" msgstr "Aktivera dubbla kärnor (höjer prestandan)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "Aktivera överhoppning av tomgÃ¥ngsloopar" @@ -2009,7 +2064,7 @@ msgstr "Aktivera överhoppning av tomgÃ¥ngsloopar" msgid "Enable Idle Skipping (speedup)" msgstr "Aktivera överhoppning av tomgÃ¥ngsloopar (höjer prestandan)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "Aktivera MMU" @@ -2017,7 +2072,7 @@ msgstr "Aktivera MMU" msgid "Enable Progressive Scan" msgstr "Aktivera Progressive scan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Aktivera skärmsläckare" @@ -2025,7 +2080,7 @@ msgstr "Aktivera skärmsläckare" msgid "Enable Speaker Data" msgstr "Aktivera högtalardata" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "Aktivera bredbild" @@ -2048,7 +2103,7 @@ msgstr "" "\n" "Om du är osäker kan du välja 1x." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2085,7 +2140,7 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2093,11 +2148,11 @@ msgstr "" "Aktivera detta för att snabba upp The Legend of Zelda: Twilight Princess. " "Inaktivera för NÃ…GOT ANNAT spel." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Aktiverar anpassat projektionshack" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." @@ -2105,22 +2160,13 @@ msgstr "" "Aktiverar emulation av Dolby Pro Logic II med hjälp av 5.1 surround. Inte " "tillgänglig för OSX." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" "Aktiverar emulation av Dolby Pro Logic II med hjälp av 5.1 surround. Endast " "OpenAL-backend." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"Aktiverar emulation av Dolby Pro Logic II med hjälp av 5.1 surround. Endast " -"OpenAL-backend. Kanske behöver byta namn pÃ¥ soft_oal.dll till OpenAL32.dll " -"för att det ska fungera." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2133,7 +2179,7 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2155,16 +2201,16 @@ msgstr "" msgid "End" msgstr "End" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Engelska" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:338 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:418 msgid "Enhancements" -msgstr "Förbättring" +msgstr "Förbättringar" #: Source/Core/DolphinWX/Src/FrameAui.cpp:640 msgid "Enter a name for the new perspective:" @@ -2180,22 +2226,22 @@ msgstr "IngÃ¥ng %d/%d" msgid "Entry 1/%d" msgstr "IngÃ¥ng 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "Samma" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Fel" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "" -"Fel uppstod när valt sprÃ¥k lästes in. Byter tillbaka till systemstandard." +"Fel uppstod när valt sprÃ¥k skulle läsas in. Byter tillbaka till " +"systemstandard." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2222,7 +2268,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Undantagshanterare - Ã¥tkomst under minnesutrymme. %08llx%08llx" @@ -2231,16 +2276,20 @@ msgstr "Undantagshanterare - Ã¥tkomst under minnesutrymme. %08llx%08llx" msgid "Execute" msgstr "Utför" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Avsluta" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Exportera alla Wii-sparningar" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Exportering misslyckades" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Exportera fil" @@ -2248,7 +2297,7 @@ msgstr "Exportera fil" msgid "Export Recording" msgstr "Exportera inspelning" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Exportera inspelning..." @@ -2256,7 +2305,7 @@ msgstr "Exportera inspelning..." msgid "Export Save" msgstr "Exportera sparning" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Exportera Wii-sparningar (experimentell)" @@ -2264,15 +2313,15 @@ msgstr "Exportera Wii-sparningar (experimentell)" msgid "Export all saves" msgstr "Exportera alla sparningar" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Exportering misslyckades, vill du försöka igen?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Exportering misslyckades" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Exportera sparning som..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Tillägg" @@ -2288,44 +2337,44 @@ msgstr "Extra parameter" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Extra parameter som endast är användbar i ''Metroid: Other M''." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Extraherar alla filer..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Extrahera apploader..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "Extrahera DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Extrahera filkatalog..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Extrahera fil..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Extrahera partition..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "Extraherar %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Extraherar alla filer" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Extraherar filmapp" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "Extraherar..." @@ -2337,15 +2386,15 @@ msgstr "FIFO-byte" msgid "FIFO Player" msgstr "FIFO-spelare" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANKRIKE" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST-storlek:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "Misslyckades att ansluta!" @@ -2353,11 +2402,15 @@ msgstr "Misslyckades att ansluta!" msgid "Failed to download codes." msgstr "Misslyckades att ladda ned koder." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "Misslyckades att extrahera till %s!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2386,6 +2439,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Misslyckades att läsa in bthprops.cpl! Det gÃ¥r inte att ansluta riktiga " +"Wiimotes och Dolphin kan krascha utan förvarning!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2393,21 +2448,23 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"Misslyckades att läsa in hid.dll! Det gÃ¥r inte att ansluta riktiga Wiimotes " +"och Dolphin kan krascha utan förvarning!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "Misslyckades att läsa %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "Misslyckades att läsa banner.bin" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "Misslyckades att läsa bk-header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2418,7 +2475,7 @@ msgstr "" "Minneskortet kan vara trunkerad\n" "Filposition: %llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2427,7 +2484,7 @@ msgstr "" "korrekt\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2435,17 +2492,17 @@ msgstr "" "Misslyckades att läsa blockallokeringstabellen korrekt\n" "(0x8000-0x9FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "Misslyckades att läsa data frÃ¥n fil %d" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "Misslyckades att läsa data frÃ¥n fil: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2453,7 +2510,7 @@ msgstr "" "Misslyckades att läsa systemÃ¥terställningsmappen korrekt\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2461,11 +2518,11 @@ msgstr "" "Misslyckades att läsa mappen korrekt\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "Misslyckades att läsa header" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2473,29 +2530,34 @@ msgstr "" "Misslyckades att läsa header korrekt\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "Misslyckades att läsa header för filen %d" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Misslyckades att läsa unikt ID frÃ¥n disk-bilden" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "Misslyckades att skriva BT.DINF till SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "Misslyckades att skriva bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "Misslyckades att skriva data till fil: %s" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "Misslyckades att skriva header för %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "Misslyckades att skriva header för filen %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Persiska" @@ -2505,13 +2567,13 @@ msgstr "Snabb" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "Snabb kalkylering av djup" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "Snabb version av MMU. Fungerar inte för alla spel." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2519,7 +2581,7 @@ msgstr "" "Allvarlig desynkronisering. Avbryter Aborting uppspelning. (Fel i " "PlayWiimote: %u != %u, byte %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo-spelare" @@ -2543,7 +2605,7 @@ msgstr "" "Filen kunde inte öppnas\n" "eller har inte en giltig filändelse" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2556,20 +2618,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Filen känns inte igen som ett minneskort" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Filen är inte komprimerad" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Okänt öppet läge: 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Filsystem" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Filtypen 'ini' är okänd! Kommer inte att öppnas!" @@ -2624,12 +2686,12 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Tvingar spelets grafikutdata att visas i bredskärmsupplösning.\n" +"Tvingar spelets grafikutdata att visas i bredbildsupplösning.\n" "Orsakar grafikbuggar i nÃ¥gra spel.\n" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2640,7 +2702,7 @@ msgstr "" "Lämna omarkerat, eftersom Dolphin anger NTSC-U som standardval och aktiverar " "automatiskt denna inställning när japanska spel spelas." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2654,12 +2716,17 @@ msgstr "FramÃ¥t" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "FramÃ¥tport (UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" -msgstr "HIttade %d resultar för '" +msgstr "Hittade %d resultat för '" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "Hittade %x sparningsfiler" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 @@ -2702,9 +2769,9 @@ msgstr "Bildrutor som ska spelas in" msgid "Free Look" msgstr "Fri vy" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Franska" @@ -2717,7 +2784,7 @@ msgstr "Greppband" msgid "From" msgstr "FrÃ¥n" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Helskärm" @@ -2729,7 +2796,7 @@ msgstr "Helskärmsupplösning:" msgid "GCI File(*.gci)" msgstr "GCI-fil (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC-kontroll" @@ -2737,27 +2804,27 @@ msgstr "GC-kontroll" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Spelets ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Spelet körs redan!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Spelet körs inte!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "Spelet hittades inte!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Spelspecifika inställningar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Spelkonfig." @@ -2771,23 +2838,23 @@ msgstr "GameCube" #: Source/Core/DolphinWX/Src/FrameTools.cpp:180 msgid "Gamecube &Pad Settings" -msgstr "Inställningar för GameCube-&kontroller" +msgstr "Inställningar för &GameCube-kontroller" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "GameCube-minneskort (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Inställningar för GameCube-kontroller" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko-koder" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2810,26 +2877,26 @@ msgstr "Allmänt" msgid "General Settings" msgstr "Allmänna inställningar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Tyska" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Index är större än AR-kodlistans storlek %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Grafik" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Grafikinställningar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Större än" @@ -2843,16 +2910,15 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"Höjer kraftigt kvaliteten pÃ¥ texturer som generaras med hjälp av " +"Höjer kraftigt kvaliteten pÃ¥ texturer som genereras med hjälp av " "textureffekter.\n" "Att höja den interna upplösningen kommer att förbättra effekten av denna " "inställning.\n" -"Slightly decreases performance and possibly causes issues (although " -"unlikely).\n" +"Sänker prestandan en aning och kan orsaka fel (vilket är osannolikt).\n" "\n" "Om du är osäker kan du lämna detta markerat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Grekiska" @@ -2876,11 +2942,11 @@ msgstr "Gitarr" msgid "Hacks" msgstr "Hackningar" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "Kontrollsumma för header misslyckades" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebreiska" @@ -2892,7 +2958,7 @@ msgstr "Höjd" msgid "Help" msgstr "Hjälp" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2913,7 +2979,7 @@ msgstr "" "\n" "Adjö!\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2958,14 +3024,14 @@ msgstr "Värd" #: Source/Core/DolphinWX/Src/HotkeyDlg.h:31 msgid "Hotkey Configuration" -msgstr "Kortkommandokonfiguration" +msgstr "Kortkommandoskonfiguration" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:288 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:581 msgid "Hotkeys" msgstr "Kortkommandon" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Ungerska" @@ -2973,17 +3039,17 @@ msgstr "Ungerska" msgid "Hybrid Wiimote" msgstr "Hybrid-Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "" "IOCTL_ES_GETVIEWS: Försökte att hämta data frÃ¥n en okänd biljett: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" @@ -2992,15 +3058,15 @@ msgstr "" "Titel-ID %016llx.\n" " Dolphin kommer troligtvis frysa sig nu" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - dÃ¥lig destination" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL-inställningar" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -3012,15 +3078,15 @@ msgstr "IR-pekare" msgid "IR Sensitivity:" msgstr "IR-känslighet:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO-detaljer" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" -msgstr "ISO-filkatalog" +msgstr "ISO-filmapp" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALIEN" @@ -3028,7 +3094,7 @@ msgstr "ITALIEN" msgid "Icon" msgstr "Ikon" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3071,11 +3137,15 @@ msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:791 msgid "Import Save" -msgstr "Importera sparningar" +msgstr "Importera sparning" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Importering misslyckades, försöka igen?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "Importera Wii-sparning" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Importering misslyckades" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3097,21 +3167,16 @@ msgstr "" "Den importerade filen har filändelsen sav\n" "men har inte en giltig header" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "I spelet" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "I spelet" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Bildrutegräns:" +msgstr "Höj bildrutegräns" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Info" @@ -3129,9 +3194,9 @@ msgstr "Sätt in" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:166 msgid "Insert Encrypted or Decrypted code here..." -msgstr "Sätt in krypterad eller dekrypterad kod här..." +msgstr "Skriv in krypterad eller dekrypterad kod här..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "Sätt in SD-kort" @@ -3139,37 +3204,38 @@ msgstr "Sätt in SD-kort" msgid "Insert name here.." msgstr "Ange namn här..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "Installera WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Installera till Wii-meny" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "InstallExceptionHandler anropade, man denna plattform stödjer inte det ännu." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "Installerar WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Integritetskontrollfel" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Integritetskontroll slutförd" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Integritetskontroll slutförd. Inga fel har hittats." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3182,7 +3248,7 @@ msgstr "" msgid "Interface" msgstr "Gränssnitt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Gränssnittsinställningar" @@ -3207,20 +3273,20 @@ msgstr "Internt LZO-fel - lzo_init() misslyckades" msgid "Internal Resolution:" msgstr "Intern upplösning:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "Interpreterare (RIKTIG lÃ¥ngsam)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Intro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" -msgstr "Ogiltig stolek (%x) eller magiskt ord (%x)" +msgstr "Ogiltig storlek (%x) eller magiskt ord (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Ogiltigt värde!" @@ -3228,16 +3294,16 @@ msgstr "Ogiltigt värde!" msgid "Invalid bat.map or dir entry" msgstr "Ogiltig bat.map eller mappingÃ¥ng" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Ogiltig händelsetyp %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Ogiltig fil" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3248,7 +3314,7 @@ msgstr "" "%s\n" " Du behöver nog göra en redump för detta spel." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Ogiltig inspelningsfil" @@ -3264,34 +3330,36 @@ msgstr "Ogiltig söksträng (kunde inte konvertera till nummer)" msgid "Invalid search string (only even string lengths supported)" msgstr "Ogiltig söksträng (endast jämna stränglängder stöds)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Ogiltig snabbsparning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italienska" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "JIT-kompilator (rekommenderas)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "Experimentell JITIL-kompilator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japanska" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3313,8 +3381,9 @@ msgstr "LÃ¥t fönster vara överst" msgid "Key" msgstr "Tangent" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Koreanska" @@ -3336,12 +3405,12 @@ msgstr "L-analog" msgid "Language:" msgstr "SprÃ¥k:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Senaste %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "Latens:" @@ -3380,7 +3449,7 @@ msgstr "" "Vänster-/högerklicka för kler alternativ.\n" "Mittenklicka för att rensa." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Mindre än" @@ -3397,58 +3466,48 @@ msgid "Load Custom Textures" msgstr "Läs in anpassade texturer" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "&Läs in snabbsparning" +msgstr "Läs in snabbsparning" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Läs in snabbsparningsspÃ¥r 1" +msgstr "Läs in senaste snabbsparning 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Läs in snabbsparningsspÃ¥r 2" +msgstr "Läs in senaste snabbsparning 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Läs in snabbsparningsspÃ¥r 3" +msgstr "Läs in senaste snabbsparning 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Läs in snabbsparningsspÃ¥r 4" +msgstr "Läs in senaste snabbsparning 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Läs in snabbsparningsspÃ¥r 5" +msgstr "Läs in senaste snabbsparning 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Läs in snabbsparningsspÃ¥r 6" +msgstr "Läs in senaste snabbsparning 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Läs in snabbsparningsspÃ¥r 7" +msgstr "Läs in senaste snabbsparning 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Läs in snabbsparningsspÃ¥r 8" +msgstr "Läs in senaste snabbsparning 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "Läs in snabbsparningsspÃ¥r 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Läs in snabbsparningsspÃ¥r 1" +msgstr "Läs in snabbsparningsspÃ¥r 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3479,19 +3538,18 @@ msgid "Load State Slot 8" msgstr "Läs in snabbsparningsspÃ¥r 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Läs in snabbsparningsspÃ¥r 1" +msgstr "Läs in snabbsparningsspÃ¥r 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Läs in snabbsparning" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Läs in Wii-systemmeny" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Läs in Wii-systemmeny %d%c" @@ -3510,10 +3568,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Läs in föregÃ¥ende värden frÃ¥n hackmönster som är tillgängliga." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Lokal" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "Logg" @@ -3538,7 +3592,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "Logga antalet renderade bildrutor per sekund till User/Logs/fps.txt. Använd " -"denna funktion när du vill mäta pÃ¥ Dolphins prestanda.\n" +"denna funktion när du vill mäta Dolphins prestanda.\n" "\n" "Om du är osäker kan du lämna detta omarkerat." @@ -3546,12 +3600,12 @@ msgstr "" msgid "Logger Outputs" msgstr "LoggningsutgÃ¥ngar" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "Loggning" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Förlorade anslutning till server!" @@ -3559,7 +3613,7 @@ msgstr "Förlorade anslutning till server!" msgid "M Button" msgstr "M-knapp" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3568,7 +3622,7 @@ msgstr "" "MD5 misspassar\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "Hastighetshack för MMU" @@ -3582,11 +3636,11 @@ msgstr "MadCatz Gameshark-filer (*.gcs)" msgid "Main Stick" msgstr "Huvudspak" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Skapar-ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Skapare:" @@ -3623,7 +3677,7 @@ msgid "Memory Byte" msgstr "Minnesbyte" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Minneskort" @@ -3635,7 +3689,7 @@ msgstr "" "Minneskorthanterare - VARNING: Gör en säkerhetskopiering innan du använder " "detta, bör fungera men kan fördärva saker!" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3652,7 +3706,7 @@ msgstr "" "%s\n" "Vill du kopiera den gamla filen till denna nya plats?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "Minneskortets filstorlek stämmer inte överens med headerstorleken" @@ -3660,9 +3714,9 @@ msgstr "Minneskortets filstorlek stämmer inte överens med headerstorleken" msgid "Menu" msgstr "Meny" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" -msgstr "Mikr" +msgstr "Mikrofon" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:112 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:115 @@ -3673,7 +3727,7 @@ msgstr "Min" msgid "Misc" msgstr "Övrigt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "Övriga inställningar" @@ -3698,11 +3752,11 @@ msgstr "" msgid "Monospaced font" msgstr "Teckensnitt med fast teckenbredd" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3822,15 +3876,15 @@ msgstr "NP Tabb" msgid "NP Up" msgstr "NP Upp" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Namn:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Namn:" @@ -3840,7 +3894,7 @@ msgstr "Namn:" msgid "Native GCI files(*.gci)" msgstr "Ursprungliga GCI-filer (*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Ny sökning" @@ -3849,7 +3903,7 @@ msgstr "Ny sökning" msgid "Next Page" msgstr "Nästa sida" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Nästa sökning" @@ -3857,11 +3911,11 @@ msgstr "Nästa sökning" msgid "Nickname :" msgstr "Smeknamn:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Inget land (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Inga ISOs eller WADS hittades" @@ -3869,7 +3923,7 @@ msgstr "Inga ISOs eller WADS hittades" msgid "No audio output" msgstr "Inget utdata för ljud" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "Ingen bannerfil hittades för titeln \"%s\"" @@ -3885,7 +3939,7 @@ msgstr "Ingen dockning" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:871 msgid "No file loaded" -msgstr "Ingen fil inläst" +msgstr "Ingen fil lästes in" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:426 msgid "No free dir index entries" @@ -3895,42 +3949,43 @@ msgstr "Inga fria ingÃ¥ngar till mappindex" msgid "No recorded file" msgstr "Ingen inspelad fil" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "Ingen sparningsmapp hittades för titeln %s" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Ingen" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norsk bokmÃ¥l" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "Inte samma" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Inte angiven" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "Varken en Wii-sparning eller ett läsningsfel för headerfilstorleken %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "Inte ansluten" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Anteckningar" @@ -3951,7 +4006,7 @@ msgstr "Meddelande" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Antal koder:" @@ -3972,7 +4027,7 @@ msgstr "Objekt" msgid "Object Range" msgstr "Räckvidd för objekt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Av" @@ -3984,25 +4039,29 @@ msgstr "Offset:" msgid "On-Screen Display Messages" msgstr "Visningsmeddelanden pÃ¥ skärmen" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "&Dokumentation online " + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Endast %d block tillgängliga" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Öppna" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Öppna &sökvägsmappen" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Öppnar sparningsmappen för Wii" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Öppna fil..." @@ -4028,7 +4087,15 @@ msgstr "OpenCL-texturdekodare" msgid "OpenMP Texture Decoder" msgstr "OpenMP-texturdekodare" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" +"Öppnar standardkonfigurationen (skrivskyddat) för detta spel i en extern " +"textredigerare." + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Inställningar" @@ -4052,7 +4119,7 @@ msgstr "" msgid "Other" msgstr "Övrigt" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4064,15 +4131,15 @@ msgstr "" msgid "Output" msgstr "Utdata" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Spe&la upp inspelning..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Kontroll" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Kontroll" @@ -4096,17 +4163,17 @@ msgstr "Paragraf" msgid "Parameters" msgstr "Parametrar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Partition %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "Partition finns inte: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Patcher" @@ -4114,21 +4181,21 @@ msgstr "Patcher" msgid "Paths" msgstr "Sökvägar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Pausa" #: Source/Core/DolphinWX/Src/FrameTools.cpp:129 msgid "Pause at end of movie" -msgstr "Pausa vid slutet av filmen" +msgstr "Pausa vid slutet av film" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:406 msgid "Per-Pixel Lighting" msgstr "Ljus per bildpunkt" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Perfekt" @@ -4138,9 +4205,9 @@ msgid "Perspective %d" msgstr "Perspektiv %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Spela" @@ -4152,7 +4219,7 @@ msgstr "Spela upp inspelning" msgid "Play/Pause" msgstr "Spela/Pausa" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Spelbar" @@ -4160,11 +4227,11 @@ msgstr "Spelbar" msgid "Playback Options" msgstr "Uppspelningsalternativ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Spelare" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Var god bekräfta..." @@ -4176,23 +4243,23 @@ msgstr "Var god skapa ett perspektiv innan du sparar" msgid "Plus-Minus" msgstr "Plus-minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polska" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "Port 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "Port 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "Port 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "Port 4" @@ -4201,11 +4268,11 @@ msgstr "Port 4" msgid "Port :" msgstr "Port:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portugisiska" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portugisiska (brasiliansk)" @@ -4213,17 +4280,17 @@ msgstr "Portugisiska (brasiliansk)" msgid "Post-Processing Effect:" msgstr "Efterprocesseringseffekt:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "För tidigt filmslut i PlayController. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "För tidigt filmslut i PlayWiimote. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "För tidigt filmslut i PlayWiimote. %u > %u" @@ -4240,7 +4307,7 @@ msgstr "Föreg. sida" msgid "Previous Page" msgstr "FöregÃ¥ende sida" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "FöregÃ¥ende värde" @@ -4256,7 +4323,7 @@ msgstr "Profil" msgid "Properties" msgstr "Egenskaper" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "Töm cache" @@ -4265,7 +4332,7 @@ msgid "Question" msgstr "FrÃ¥ga" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Avsluta" @@ -4287,13 +4354,13 @@ msgstr "R-analog" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RYSSLAND" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "Radie" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4309,7 +4376,7 @@ msgstr "Riktig" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "Riktig balansbräda" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" @@ -4326,6 +4393,10 @@ msgstr "Verkliga Wiimotes" msgid "Record" msgstr "Spela in" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "Inspelningsinmatning" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Inspelningsinformation" @@ -4361,7 +4432,7 @@ msgstr "" "Om du är osäker kan du välja Ingen." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Uppdatera" @@ -4370,14 +4441,14 @@ msgstr "Uppdatera" msgid "Refresh List" msgstr "Uppdatera lista" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Uppdatera spellista" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Ta bort" @@ -4400,7 +4471,7 @@ msgstr "Rendera till huvudfönstret" msgid "Reset" msgstr "Ã…terställ" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Resultat" @@ -4408,7 +4479,7 @@ msgstr "Resultat" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "Revision:" @@ -4421,20 +4492,18 @@ msgstr "Höger" msgid "Right Stick" msgstr "Höger spak" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Vibration" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -"Kör DSP HLE och LLE pÃ¥ en tillägnad trÃ¥d (rekommenderas inte; kan orsaka " -"ljudbuggar med HLE och fryser sig med LLE)." +"Kör DSP LLE pÃ¥ en tillägnad trÃ¥d (rekommenderas inte; kan orsaka frysningar)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Ryska" @@ -4447,7 +4516,7 @@ msgid "Safe" msgstr "Säker" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Spara" @@ -4457,23 +4526,20 @@ msgid "Save GCI as..." msgstr "Spara GCI som..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Spa&ra snabbsparning" +msgstr "Spara äldsta snabbsparning" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Spa&ra snabbsparning" +msgstr "Spara snabbsparning" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Spara snabbsparningsspÃ¥r 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Spara snabbsparningsspÃ¥r 1" +msgstr "Spara snabbsparningsspÃ¥r 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4504,32 +4570,31 @@ msgid "Save State Slot 8" msgstr "Spara snabbsparningsspÃ¥r 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Spara snabbsparningsspÃ¥r 1" +msgstr "Spara snabbsparningsspÃ¥r 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Spara snabbsparning..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Spara som..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Spara komprimerad GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Spara aktuellt perspektiv" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "Spara avkomprimerad GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Snabbsparningens film %s är korrupt. Filminspelningen stoppas..." @@ -4538,20 +4603,20 @@ msgstr "Snabbsparningens film %s är korrupt. Filminspelningen stoppas..." msgid "Scaled EFB Copy" msgstr "Skalad EFB-kopia" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Skannar %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" -msgstr "Söker efter ISOs" +msgstr "Skannar efter ISOs" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Skannar..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Skärmdump" @@ -4563,11 +4628,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "Sök" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Sökfilter" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Sök undermappar" @@ -4590,12 +4655,12 @@ msgstr "Sektion %s hittades inte i SYSCONF" msgid "Select" msgstr "Välj" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Spara inspelningsfilen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Välj en Wii WAD-fil som ska installeras" @@ -4611,25 +4676,25 @@ msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:510 msgid "Select a save file to import" -msgstr "Välj en sparningsfil som ska importeras" +msgstr "Välj en sparningsfil att importera" #: Source/Core/DolphinWX/Src/FrameAui.cpp:366 msgid "Select floating windows" msgstr "Välj flytande fönster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Öppna fil" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" -msgstr "Välj snabbsparning" +msgstr "Välj sparningsfilen" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Välj snabbsparning att läsa in" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Välj snabbsparning att spara" @@ -4645,13 +4710,13 @@ msgid "" msgstr "" "Välj vilket bildformat som ska användas vid rendering:\n" "Auto: Använd det ursprungliga bildförhÃ¥llandet.\n" -"Tvinga 16:9: Skräcker bilden till ett bildformat pÃ¥ 16:9.\n" -"Tvinga 4:3: Skräcker bilden till ett bildformat pÃ¥ 4:3.\n" -"Skräck till fönster: Sträcker bilden till fönsterstorleken.\n" +"Tvinga 16:9: Sträcker bilden till ett bildformat pÃ¥ 16:9.\n" +"Tvinga 4:3: Sträcker bilden till ett bildformat pÃ¥ 4:3.\n" +"Skräck ut till fönster: Sträcker bilden till fönsterstorleken.\n" "\n" "Om du är osäker kan du välja Auto." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "Den valda kontrollprofilen finns inte" @@ -4676,60 +4741,49 @@ msgstr "" "Om du fortfarande är osäker kan du använda den högsta upplösningen som " "fungerar för dig." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"Väljer vilket grafik-API som ska användas internt.\n" -"Direct3D 9 är vanligtvis den snabbaste. OpenGL är mer noggrann. Direct3D 11 " -"ligger nÃ¥gonstans mellan de bÃ¥da.\n" -"Observera att Direct3D-backend finns bara tillgängligt pÃ¥ Windows.\n" -"\n" -"Om du är osäker kan du använda Direct3D 11." - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"Väljer vilket grafik-API som ska användas internt.\n" -"Direct3D 9 är vanligtvis det snabbaste. OpenGL är dock mer noggrann. " -"Direct3D 11 är nÃ¥gonstans mellan de bÃ¥da.\n" -"Notera att Direct3D-backends är endast tillgängliga för Windows.\n" -"\n" -"Om du är osäker kan du använda OpenGL." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Skicka" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:110 msgid "Sensor Bar Position:" -msgstr "Position av Sensor Bar:" +msgstr "Position för Sensor Bar:" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:64 msgid "Separator" msgstr "Avskiljare" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" -msgstr "Serbiriska" +msgstr "Serbiska" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "Serieport 1 - Detta är porten som enheter, t.ex. nätadaptern, använder" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Ange som &standard-ISO" @@ -4738,7 +4792,7 @@ msgstr "Ange som &standard-ISO" msgid "Set as default Memcard %c" msgstr "Ange som standardminneskort %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "" @@ -4751,21 +4805,21 @@ msgid "" "backend only." msgstr "" "Anger latensen (i millisekunder). Högre värden kan reducera ljudknaster. " -"Endast OpenAL backend." +"Endast för OpenAL-backend." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Inställningar..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Kan inte hitta filinställningar" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "SetupWiiMem: Kan inte skapa inställningsfil" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Skakning" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Kort namn:" @@ -4773,23 +4827,27 @@ msgstr "Kort namn:" msgid "Shoulder Buttons" msgstr "Avtyckarknappar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" -msgstr "Visa &kommandotolk" +msgstr "Visa kommando&tolk" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "Visa &logg" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Visa &statusfält" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Visa &verktygsfält" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Visa standardvärden" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Visa drivrutiner" @@ -4801,11 +4859,11 @@ msgstr "Visa regioner för EFB-kopior" msgid "Show FPS" msgstr "Visa bildrutefrekvens" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Visa Frankrike" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "Visa GameCube" @@ -4813,35 +4871,35 @@ msgstr "Visa GameCube" msgid "Show Input Display" msgstr "Visa indata" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Visa Italien" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Visa JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Visa Korea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Visa sprÃ¥k:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "Visa logg&konfiguration" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "Visa PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Visa plattformar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Visa regioner" @@ -4849,27 +4907,27 @@ msgstr "Visa regioner" msgid "Show Statistics" msgstr "Visa statistik" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Visa Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Visa USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "Visa WAD" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Visa Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Visa en bekräftelsedialog innan ett spel stoppas." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4888,7 +4946,7 @@ msgstr "Visa första blocket" msgid "Show lag counter" msgstr "Visa laggräknare" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4926,7 +4984,7 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Visa okänd" @@ -4936,27 +4994,28 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"Visa blandade statistiker.\n" +"Visa blandad statistik.\n" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Vertikal Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Förenklad kinesiska" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Storlek" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "Hoppa över BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "Hoppa över rensning av DCBZ " @@ -4981,17 +5040,17 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "SpÃ¥r %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "SpÃ¥r A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "SpÃ¥r B" @@ -4999,7 +5058,7 @@ msgstr "SpÃ¥r B" msgid "Snapshot" msgstr "Ögonblicksbild" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Programrenderare" @@ -5016,27 +5075,27 @@ msgstr "" "Vill du verkligen aktivera programvarurendering? Om du är osäker kan du " "välja 'Nej'." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Ljudinställningar" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Ljudbackend %s är inte giltig." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Skapandet av ljudbuffer misslyckades: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Mellanrum" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spanska" @@ -5064,45 +5123,37 @@ msgstr "" "\n" "Om du är osäker kan du välja 640x528." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Snabba upp disköverförningshastigheten" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Fyrkantsspak" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Standardkontroll" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "Starta &nätspel" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" -msgstr "&Börja spela in" +msgstr "Starta &inspelning" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:175 msgid "Start Recording" -msgstr "Börja spela in" +msgstr "Starta inspelning" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Snabbsparning" @@ -5110,16 +5161,16 @@ msgstr "Snabbsparning" msgid "State Saves" msgstr "Snabbsparningar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" -msgstr "Styrhjul" +msgstr "Ratt" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:57 msgid "Stick" msgstr "Spak" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Stoppa" @@ -5150,28 +5201,28 @@ msgstr "Slagskena" msgid "Subtract" msgstr "Subtrahera" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Lyckades exportera fil till %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Lyckades importera sparningsfiler" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "Svenska" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" -msgstr "Svinga" +msgstr "Svängning " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "Synkronisera grafikprocessortrÃ¥d" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" @@ -5180,12 +5231,13 @@ msgstr "" "slumpartade frysningar när läget \"Dubbla kärnor\" används. (PÃ… = " "kompatibel, AV = snabb)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "SystemsprÃ¥k:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -5210,13 +5262,13 @@ msgstr "Tabell vänster" msgid "Table Right" msgstr "Tabell höger" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Ta en skärmdump" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5230,17 +5282,17 @@ msgstr "Textur" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:462 msgid "Texture Cache" -msgstr "Textur-cache" +msgstr "Texturcache" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:530 msgid "Texture Format Overlay" -msgstr "Lägg över texturformat" +msgstr "Överlägg för texturformat" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD har installerats utan problem." -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Adressen är ogiltig" @@ -5248,13 +5300,13 @@ msgstr "Adressen är ogiltig" msgid "The checksum was successfully fixed" msgstr "Kontrollsumman fixades utan problem" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Valda filkatalogen finns redan i listan" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5277,7 +5329,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Filen %s var redan öppen, headerfilen kommer inte att skrivas." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Filen du valde (%s) finns inte" @@ -5310,7 +5362,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Sparningen du försöker kopiera har en ogiltig filstorlek" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5318,36 +5370,36 @@ msgstr "" "Det valda sprÃ¥ket stöds inte av ditt system. Ändrar tillbaka till " "systemstandard." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Serverns och klientens nätspelsversioner är inkompatibla!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Servern är full" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Servern svarade: Spelet körs för tillfället!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Servern skickade ett okänt felmeddelande!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Den valda filen \"%s\" finns inte" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" -msgstr "Värdet är felaktigt" +msgstr "Värdet är ogiltigt" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5355,7 +5407,7 @@ msgstr "" "Det mÃ¥ste finnas en biljett för 00000001/00000002. Din nanddump är " "förmodlingen ofullständig." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5363,7 +5415,7 @@ msgstr "" "Dessa inställningar upphäver Dolphins kärninställningar.\n" "'Undetermined' betyder att spelet använder Dolphins inställningar." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." @@ -5371,7 +5423,7 @@ msgstr "" "Denna Action Replay-simulator stödjer inte koder som ändrar Action Replay " "själv." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Detta kan orsaka fartminskningar i Wii-menyn och vissa spel." @@ -5395,7 +5447,7 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -5407,7 +5459,7 @@ msgstr "" "Ljud för att strypa användningen av DSP (kan fixa ljudklickningar men kan " "även orsaka konstant brus beroende pÃ¥ spelet)." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5419,7 +5471,7 @@ msgstr "" "Detta orsakar stora förbättringar pÃ¥ datorer med mer än en kärna, men kan " "även orsaka en del kraschar/buggar." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "Detta lÃ¥ter redigera INI-kofigueringsfilen manuellt" @@ -5428,12 +5480,12 @@ msgstr "Detta lÃ¥ter redigera INI-kofigueringsfilen manuellt" msgid "Threshold" msgstr "Tröskel" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "Lutning" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "Titel" @@ -5447,39 +5499,37 @@ msgid "Toggle All Log Types" msgstr "Markera/avmarkera alla loggtyper" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "BildförhÃ¥llande:" +msgstr "SlÃ¥ pÃ¥/av bildförhÃ¥llande" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB-kopior" +msgstr "SlÃ¥ pÃ¥/av EFB-kopior" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Markera/avmarkera alla loggtyper" +msgstr "SlÃ¥ pÃ¥/av dimma" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Skifta mellan helskärm- och fönsterläge" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "SlÃ¥ pÃ¥/av IR" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Ovan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Traditionell kinesiska" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Försökte installera en okänd filtyp." @@ -5499,7 +5549,7 @@ msgstr "" "Försöker att läsa frÃ¥n ogiltig SYSCONF\n" "Wiimote bt ids är inte tillgänglig" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turkiska" @@ -5515,12 +5565,12 @@ msgstr "Typ" msgid "UDP Port:" msgstr "UDP-port:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "OKÄND" @@ -5529,7 +5579,7 @@ msgstr "OKÄND" msgid "UNKNOWN_%02X" msgstr "OKÄND_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5542,9 +5592,9 @@ msgstr "" "IngÃ¥ngen ändrades inte." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5552,7 +5602,7 @@ msgstr "" "dekrypterad kod. Se till att den är riktigt skriven.\n" "Vill du ignorera denna rad och fortsätta tolka resten?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Odefinerad %i" @@ -5562,19 +5612,18 @@ msgid "Undo Load State" msgstr "Ã…ngra inläsning av snabbsparning" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Ã…ngra inläsning av snabbsparning" +msgstr "Ã…ngra snabbsparning" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Oväntat 0x80-anrop? Avbryter..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Okänd" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Okänt DVD-kommando %08x - katastrofalt fel" @@ -5589,12 +5638,12 @@ msgstr "Okänd kommando 0x%08x" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "Okänd tillträdestyp %i i SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Tog emot ett okänt meddelande med id: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "" @@ -5605,16 +5654,16 @@ msgstr "" msgid "Up" msgstr "Upp" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Uppdatera" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Upprätt Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "Använd EuRGB60-läge (PAL60)" @@ -5622,7 +5671,7 @@ msgstr "Använd EuRGB60-läge (PAL60)" msgid "Use Fullscreen" msgstr "Använd helskärm" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "Använd hex" @@ -5637,6 +5686,10 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"Använd en mindre exakt algoritm för att beräkna djupvärden.\n" +"Orsakar fel i nÃ¥gra spel med kan ge en hyfsad prestandaacceleration.\n" +"\n" +"Om du är osäker kan du lämna detta markerat." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5651,6 +5704,18 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"Använder osäkra Ã¥tgärder för att snabba upp hörnströmning i OpenGL. Det " +"finns inga kända problem pÃ¥ stödjande grafikprocessorer, men det kan annars " +"orsaka allvarlig stabilitet och grafikproblem." + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5673,11 +5738,11 @@ msgstr "Hjälpprogram" msgid "V-Sync" msgstr "V-synk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" msgstr "Hastighetshack för VBeam" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "Värde" @@ -5685,7 +5750,7 @@ msgstr "Värde" msgid "Value:" msgstr "Värde:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "Värde: " @@ -5695,9 +5760,9 @@ msgstr "AvlusningsnivÃ¥" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "Hörnströmningshack" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Video" @@ -5705,17 +5770,17 @@ msgstr "Video" msgid "Virtual" msgstr "Virtuell" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Volym" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD-installation misslyckades: Ett fel uppstod när %s skulle skapas" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" "WAD-installation misslyckades: Ett fel uppstod när biljett skulle skapas" @@ -5738,19 +5803,19 @@ msgstr "" msgid "Warning" msgstr "Varning" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Varning - startar DOL i fel konsolläge!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Varning - startar ELF i fel konsolläge!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Varning - startar ISO i fel konsolläge!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5775,7 +5840,7 @@ msgstr "" "och har samma namn som en fil pÃ¥ ditt minneskort\n" "Vill du fortsätta?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5787,7 +5852,7 @@ msgstr "" "fortsätter, eller läsa in denna snabbsparning med skrivskyddat läge " "inaktiverat." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5799,7 +5864,7 @@ msgstr "" "snabbsparning med skrivskyddat läge inaktiverat. Annars kan du fÃ¥ en " "desynkronisering." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5854,19 +5919,15 @@ msgstr "Bredd" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii-konsol" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii nandrot:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Importera Wii-sparningar" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii-sparningsfiler (*.bin)|*.bin" @@ -5875,16 +5936,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Kunde inte läsa frÃ¥n fil" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote ansluten" @@ -5892,7 +5959,7 @@ msgstr "Wiimote ansluten" msgid "Wiimote Motor" msgstr "Wiimote-motor" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Inställningar för Wiimote" @@ -5916,14 +5983,14 @@ msgstr "Fönster höger" msgid "Word Wrap" msgstr "Radbytning" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Arbetar..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "Skriv minneskort (GC)" @@ -5943,21 +6010,36 @@ msgstr "Skriv till fil" msgid "Write to Window" msgstr "Skriv till fönster" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice misslyckades: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "Initiering av XAudio2 misslyckades: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "Misslyckades att skapa mästarröst för XAudio2: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice misslyckades: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "Initiering av XAudio2 misslyckades: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "Misslyckades att skapa mästarröst för XAudio2: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF-register" @@ -5992,11 +6074,11 @@ msgstr "Du kan inte stänga paneler som har sidor inuti sig." msgid "You must choose a game!!" msgstr "Du mÃ¥ste välja ett spel!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Du mÃ¥ste ange ett namn!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "Du mÃ¥ste ange en giltig decimal, hexadecimal eller oktalt värde." @@ -6004,10 +6086,9 @@ msgstr "Du mÃ¥ste ange en giltig decimal, hexadecimal eller oktalt värde." msgid "You must enter a valid profile name." msgstr "Du mÃ¥ste ange ett giltigt profilnamn." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." -msgstr "" -"Du mÃ¥ste starta om Dolphin för att ändringarna ska kunna träda i kraft." +msgstr "Du mÃ¥ste starta om Dolphin för att ändringarna ska träda i kraft." #: Source/Core/Core/Src/DSP/DSPCore.cpp:109 msgid "" @@ -6019,7 +6100,7 @@ msgstr "" "Vill du stoppa nu för att fixa problemet?\n" "Om du väljer \"nej\" kan ljudet bli förvrängt." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -6038,15 +6119,15 @@ msgstr "" "Den borde vara 0x%04x (but is 0x%04llx)\n" "Vill du generera en ny?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP-hack" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3-kod stöds inte" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero-kod okänd för Dolphin: %08x" @@ -6105,20 +6186,24 @@ msgstr "" "\n" "Om du är osäker kan du lämna detta omarkerat." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Läser opkod frÃ¥n %x. Var god rapportera detta." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "okänd funktion %d (förväntade %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "fick ett okänt meddelande" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute returnerade -1 i applikationkörningen!" @@ -6134,63 +6219,48 @@ msgstr "zNear-korrektion: " msgid "| OR" msgstr "| ELLER" -#~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" -#~ "\n" -#~ "If unsure, leave this unchecked." +#~ msgid "Could not create %s" +#~ msgstr "Kunde inte skapa %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "Redigera lokala upphävanden" + +#~ msgid "Opens the user specified overrides in an external text editor." #~ msgstr "" -#~ "TillÃ¥ter att växla mellan vissa inställningar med snabbtangenterna 3 " -#~ "(Intern upplösning), 4 (BildförhÃ¥llande), 5 (Kopiera EFB) och 6 (Dimma) " -#~ "inom emulatorfönstret.\n" -#~ "\n" -#~ "Om du är osäker kan du lämna detta omarkerat." - -#~ msgid "Can't find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x" -#~ msgstr "Kan inte hitta Wiimote med bd: %02x:%02x:%02x:%02x:%02x:%02x" - -#~ msgid "Enable Hotkeys" -#~ msgstr "Aktivera " - -#~ msgid "Failed to Listen!!" -#~ msgstr "Misslyckades att lyssna!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "Misslyckades att läsa bthprops.cpl" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "Misslyckades att läsa in hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "Konfiguration av GC-Mikrofon" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY anropade, var god rapportera!" - -#~ msgid "Hacked Buffer Upload" -#~ msgstr "Hackad bufferuppladdning" - -#~ msgid "Last Overwritten State" -#~ msgstr "Senast överskrivna snabbsparning" - -#~ msgid "Last Saved State" -#~ msgstr "Senast sparade snabbsparning" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Ã…teranslut Wiimote när en snabbsparning läser in" - -#~ msgid "Set" -#~ msgstr "Ange" +#~ "Öppnar användarens specifika upphävanden i en extern textredigerare." #~ msgid "" -#~ "Use a hacked upload strategy to stream vertices.\n" -#~ "This usually speed up, but is forbidden by OpenGL specification and may " -#~ "causes heavy glitches.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Använd en hackad uppladdningsstrategi för att strömma hörn.\n" -#~ "Detta höjer vanligtvis hastigheten, men är förbjuden enligt OpenGL:s " -#~ "specifikationer och kan orsaka en del större buggar.\n" +#~ "Väljer vilket grafik-API som ska användas internt.\n" +#~ "Direct3D 9 är vanligtvis den snabbaste. OpenGL är mer noggrann. Direct3D " +#~ "11 ligger nÃ¥gonstans mellan de bÃ¥da.\n" +#~ "Observera att Direct3D-backend finns bara tillgängligt pÃ¥ Windows.\n" #~ "\n" -#~ "Om du är osäker kan du lämna detta omarkerat." +#~ "Om du är osäker kan du använda Direct3D 11." + +#~ msgid "" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use OpenGL." +#~ msgstr "" +#~ "Väljer vilket grafik-API som ska användas internt.\n" +#~ "Direct3D 9 är vanligtvis det snabbaste. OpenGL är dock mer noggrann. " +#~ "Direct3D 11 är nÃ¥gonstans mellan de bÃ¥da.\n" +#~ "Notera att Direct3D-backends är endast tillgängliga för Windows.\n" +#~ "\n" +#~ "Om du är osäker kan du använda OpenGL." + +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Läser opkod frÃ¥n %x. Var god rapportera detta." diff --git a/Languages/po/tr.po b/Languages/po/tr.po index 3652aa34c2..21692fc0d6 100644 --- a/Languages/po/tr.po +++ b/Languages/po/tr.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-12 05:20+0000\n" "Last-Translator: mustafacan \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/dolphin-emu/" "language/tr/)\n" @@ -20,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr "(Göstermek için çok fazla)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr "Oyun :" @@ -34,7 +34,7 @@ msgstr "Oyun :" msgid "! NOT" msgstr "! YOK" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -43,7 +43,7 @@ msgstr "" "\"%s\" bulunamadı.\n" "16MB'lık yeni bir hafıza kartı oluÅŸturulsun mu?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "" @@ -60,28 +60,28 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$sKopyala%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s zaten var, üzerine yazılsın mı?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "%s küçültülemedi. Kalıp dosyası bozuk olabilir." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -90,7 +90,7 @@ msgstr "" "%s hafıza kart dosyası olarak yüklenemedi \n" "Kart dosyası boyutu hatalı (0x%x bayt)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -99,7 +99,7 @@ msgstr "" "%s hafıza kartı olarak yüklenemedi \n" "Kart boyutu hatalı (0x%x bayt)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" @@ -108,22 +108,27 @@ msgstr "" "%s hafıza kartı olarak yüklenemedi. \n" "Dosya geçerli bir hafıza kartı dosyası olabilmek için çok küçük (0x%x bayt)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "%s açılamadı" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s baÅŸarısız: kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s dosyasının boyutu 0 bayt'tır." -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s zaten sıkıştırılmış! Tekrar sıkıştırmayı denemeyin!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s adı çok uzun, izin verilen en fazla 45 karakterdir." @@ -152,7 +157,7 @@ msgstr "%u BoÅŸ Blok; %u BoÅŸ Dizin GiriÅŸi" msgid "&& AND" msgstr "&& VE" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "Hakkında... (&A)" @@ -160,7 +165,7 @@ msgstr "Hakkında... (&A)" msgid "&Boot from DVD Drive..." msgstr "DVD Sürücüden Önyükle... (&B)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "Kesme noktaları (&B)" @@ -168,7 +173,7 @@ msgstr "Kesme noktaları (&B)" msgid "&Browse for ISOs..." msgstr "Kalıplara Gözat... (&B)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "Hile Yöneti&cisi" @@ -176,11 +181,11 @@ msgstr "Hile Yöneti&cisi" msgid "&DSP Settings" msgstr "Ses Ayarları (&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "Kalıbı Sil... (&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "Seçilen Kalıpları Sil... (&D)" @@ -192,11 +197,11 @@ msgstr "&Emülasyon" msgid "&File" msgstr "Dosya (&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "GeliÅŸmiÅŸ Kareleme (&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "Tam Ekran (&F)" @@ -204,7 +209,7 @@ msgstr "Tam Ekran (&F)" msgid "&Graphics Settings" msgstr "&Görüntü Ayarları" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "Yardım (&H)" @@ -212,7 +217,7 @@ msgstr "Yardım (&H)" msgid "&Hotkey Settings" msgstr "TuÅŸ ayarları (&H)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -224,11 +229,11 @@ msgstr "Durumu Yük&le" msgid "&Memcard Manager (GC)" msgstr "GC Hafıza Kartı Yönetici (&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "Hafıza (&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "Aç...(&O)" @@ -236,51 +241,51 @@ msgstr "Aç...(&O)" msgid "&Options" msgstr "Seçenekler (&O)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "Duraklat (&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "Oynat (&P)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "Özellikler (&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "Salt okunu&r mod" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "Listeyi Yenile (&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "Kayıtla&r" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "Sıfı&rla" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "&Ses" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "Durdur (&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "Araçlar (&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "Görüntü (&V)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "Görünüm (&V)" @@ -288,7 +293,7 @@ msgstr "Görünüm (&V)" msgid "&Wiimote Settings" msgstr "&Wiimote Ayarları" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -313,9 +318,8 @@ msgid "(off)" msgstr "(kapalı)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ EKLE" +msgstr "+ EKLE" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -323,25 +327,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "" +msgstr "Orjinalin 1.5 katı (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 bit" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "" +msgstr "Orjinalin 1 katı (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "" +msgstr "Orjinalin 2.5 katı (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "" +msgstr "Orjinalin 2 katı (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 bit" @@ -351,13 +355,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "" +msgstr "Orjinalin 3 katı (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "" +msgstr "Orjinalin 4 katı (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 bit" @@ -369,7 +373,7 @@ msgstr "" msgid "" msgstr "<Çözünürlük bulunamadı>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "" @@ -377,7 +381,7 @@ msgstr "" msgid "" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "" @@ -386,12 +390,12 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "Bir NetPlay penceresi zaten açık!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "Bir oyun ÅŸu anda düzgün çalışmıyor." @@ -402,7 +406,6 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -411,38 +414,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"UYARI:\n" -"\n" -"NetPlay sadece aÅŸağıdaki ayarlarda çalışabilir:\n" -" - Çift Çekirdek [KAPALI]\n" -" - Ses Hızlanması [KAPALI]\n" -" - \"Geçersiz Ses\"ile DSP-HLE veya DSP-LLE\n" -" - Kullanılacak denetim aygıtı sayısını elle belirleyin.[Standart Denetim " -"Aygıtı]\n" -"\n" -"Tüm oyuncular aynı Dolphin sürümü ve ayarlarını kullanmalıdır.\n" -"BaÅŸlamadan önce hafıza kartınız varsa diÄŸer oyunculara gönderin veya iptal " -"edin.\n" -"Wiimote desteÄŸi uygulanmamıştır.\n" -"\n" -"TCP baÄŸlantı noktanızı barındırıcıya yönlendirmelisiniz!!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR Kodları" @@ -490,14 +477,14 @@ msgstr "" "Suçlu Kod:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "" "Action Replay Hatası: Kod eklemede (%08x : adres = %08x) hatalı boyut (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " @@ -506,7 +493,7 @@ msgstr "" "Action Replay Hatası: Doldurma ve kaydırmada (%08x : adres = %08x) hatalı " "boyut (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -515,7 +502,7 @@ msgstr "" "Action Replay Hatası: Anabellek yazma ve doldurmasında (%08x : adres = %08x) " "hatalı boyut (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -524,12 +511,12 @@ msgstr "" "Action Replay Hatası: Ä°ÅŸaretleyiciye yazarken (%08x : address = %08x) hatalı " "boyut (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay Hatası: Hafıza kopyalamada (%08x) hatalı deÄŸer (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" @@ -538,27 +525,27 @@ msgstr "" "Action Replay Hatası: Ana Kod ve CCXXXXXX kodu uygulanamadı (%s)\n" "Ana kodlar gerekli deÄŸil. Ana kodları kullanmayın." -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay Hatası: Hatalı AR kod satırı: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay: Åžartlı Kod: Hatalı Boyut %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay: Hatalı Normal Kod Türü %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay: Normal Kod %i: Hatalı alt tür %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay: Normal Kod 0: Hatalı alt tür %08x (%s)" @@ -572,11 +559,11 @@ msgstr "Dönüştürücü:" msgid "Add" msgstr "Ekle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "Action Replay Kodu Ekle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "Yama Ekle" @@ -584,9 +571,9 @@ msgstr "Yama Ekle" msgid "Add new pane" msgstr "Bölme ekle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "Ekle..." @@ -644,32 +631,32 @@ msgstr "GeliÅŸmiÅŸ" msgid "Advanced Settings" msgstr "GeliÅŸmiÅŸ Ayarlar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "Tüm GC/Wii dosyaları (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "Tüm GC/Wii kalıpları (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "Tüm GameCube GCM Dosyaları (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "Tüm Kayıtlı Oyunlar (sav,s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "Tüm Wii kalıpları (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "Tüm sıkıştırılan GC/Wii kalıpları (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "Tüm dosyalar (*.*)|*.*" @@ -679,7 +666,7 @@ msgstr "Analiz et" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:286 msgid "Angle" -msgstr "" +msgstr "Açı" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:376 msgid "Anisotropic Filtering:" @@ -689,19 +676,19 @@ msgstr "Filtreleme:" msgid "Anti-Aliasing:" msgstr "KeskinleÅŸtirme:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "Apploader boyutu yanlış. Bu gerçekten bir apploader mı?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "Apploader dosyadan yüklenemiyor." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "Apploader:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "Uygula" @@ -715,7 +702,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, kapalı seçin." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "Arapça" @@ -724,7 +711,7 @@ msgstr "Arapça" msgid "Are you sure you want to delete \"%s\"?" msgstr "\"%s\" dosyasını silmek istiyor musunuz?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -732,17 +719,22 @@ msgstr "" "Bu dosyaları gerçekten silmek istiyor musunuz?\n" "Silindikten sonra bu dosyaları geri döndüremezsiniz!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "" "Bu dosyayı gerçekten silmek istiyor musunuz? Silindikten sonra bu dosyaları " "geri döndüremezsiniz!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" -msgstr "" +msgstr "Arm JIT (deneysel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (deneysel)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "En-boy Oranı:" @@ -751,12 +743,12 @@ msgstr "En-boy Oranı:" msgid "At least one pane must remain open." msgstr "En az bir bölme açık kalmalıdır." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "Ses" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "Ses Çözücüsü:" @@ -764,7 +756,7 @@ msgstr "Ses Çözücüsü:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: AO sürücüyü açarken hata.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "Otomatik" @@ -803,16 +795,16 @@ msgstr "BP kaydı" msgid "Back" msgstr "Geri" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "Çözücü Ayarları" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "Çözücü:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "Arkaplanda GiriÅŸ" @@ -821,24 +813,24 @@ msgstr "Arkaplanda GiriÅŸ" msgid "Backward" msgstr "Geri" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "Kötü Dosya Başı" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "Balance Board" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "AfiÅŸ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "AfiÅŸ Ayrıntıları" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "AfiÅŸ:" @@ -858,7 +850,7 @@ msgstr "Temel Ayarlar" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "Blok Ayırma Tablosu saÄŸlaması baÅŸarısız." @@ -879,7 +871,7 @@ msgid "Blue Right" msgstr "Mavi SaÄŸ" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "Alt" @@ -888,27 +880,27 @@ msgstr "Alt" msgid "Bound Controls: %lu" msgstr "BaÄŸlı Denetimler: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "Bozuk" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "Gözat..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "Eklemek için bir klasöre gözat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "Bir kalıp konumu için gözat..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "Çıkış klasörü için gözat" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "Tampon:" @@ -918,7 +910,7 @@ msgstr "Tampon:" msgid "Buttons" msgstr "Düğmeler" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -963,33 +955,33 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "" +msgstr "Sap baÄŸlantısı ile Wiimote bulunamadı: %02x" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" -msgstr "" +msgstr "DVD Eklentisinden okunamıyor - DVD-Arabirimi : Önemli Hata" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "Ä°ptal" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "%s açılamadı." -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "Bekleyen olaylardan dolayı olaylar kayıttan kaldırılamıyor." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -1000,7 +992,7 @@ msgstr "" "%s\n" "Geçerli bir Gamecube hafıza kartı dosyası deÄŸil." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -1012,7 +1004,7 @@ msgstr "" msgid "Caps Lock" msgstr "Büyük Harf Kilidi" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "Katalanca" @@ -1020,11 +1012,11 @@ msgstr "Katalanca" msgid "Center" msgstr "Merkez" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "DeÄŸiÅŸtir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "&Diski DeÄŸiÅŸtir" @@ -1032,11 +1024,11 @@ msgstr "&Diski DeÄŸiÅŸtir" msgid "Change Disc" msgstr "Diski DeÄŸiÅŸtir" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "Oyunu DeÄŸiÅŸtir" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1052,12 +1044,12 @@ msgstr "zFar Parametresinin iÅŸaretini deÄŸiÅŸtirir (düzeltme sonrası)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "zNear Parametresinin iÅŸaretini deÄŸiÅŸtirir (düzeltme sonrası)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "" "Emülatör çalışırken deÄŸiÅŸtirirseniz herhangi bir etkisini göremezsiniz!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "Sohbet" @@ -1065,47 +1057,47 @@ msgstr "Sohbet" msgid "Cheat Code" msgstr "Hile Kodu" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "Hile Arama" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "Hile Yöneticisi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "Bölüm Düzgünlüğünü Denetle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "Düzgünlük denetleniyor..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Çince (Basit)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Çince (Geleneksel)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "DVD kök dizinini seçin:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "NAND kök dizinini seçin:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "Varsayılan kalıbı seçin:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "Eklemek için bir konum seçin" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "Açmak için bir dosya seçin" @@ -1113,7 +1105,7 @@ msgstr "Açmak için bir dosya seçin" msgid "Choose a memory card:" msgstr "Bir hafıza kartı seçin:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" @@ -1121,8 +1113,8 @@ msgstr "" "Apploader olarak bir dosya seçin: (Sadece konumlardan yapılan disklere " "uygulanır)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "GeniÅŸletmek için bir klasör seçin" @@ -1141,7 +1133,7 @@ msgstr "Klasik" msgid "Clear" msgstr "Temizle" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1151,7 +1143,7 @@ msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "Kapat" @@ -1160,11 +1152,11 @@ msgstr "Kapat" msgid "Co&nfigure..." msgstr "Yapıla&ndır" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "Kod Bilgisi" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "Kod:" @@ -1176,24 +1168,24 @@ msgstr "Komut" msgid "Comment" msgstr "Yorum" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "Yorum:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "Kalıbı sıkıştır..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "Seçili kalıpları sıkıştır..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "Kalıp sıkıştırılıyor..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "Yapılandırma" @@ -1207,18 +1199,18 @@ msgstr "Yapılandır" msgid "Configure Control" msgstr "Denetimleri Yapılandır" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "Kolları Yapılandır" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "Yapılandır..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "Dosyanın Ãœzerine Yazmaya Ä°zin Ver" @@ -1231,17 +1223,16 @@ msgstr "Durdurma Onayı Ä°ste" msgid "Connect" msgstr "BaÄŸlan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "USB Klavye BaÄŸla" +msgstr "Balance Board BaÄŸla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "USB Klavye BaÄŸla" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "Wiimote'u BaÄŸla : %i" @@ -1262,7 +1253,7 @@ msgstr "Wiimote 3'ü BaÄŸla" msgid "Connect Wiimote 4" msgstr "Wiimote 4'ü BaÄŸla" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "BaÄŸlanıyor..." @@ -1282,7 +1273,7 @@ msgstr "Denetim" msgid "Convert to GCI" msgstr "GCI'ya dönüştür" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "Kopyalama baÅŸarısız." @@ -1291,21 +1282,16 @@ msgstr "Kopyalama baÅŸarısız." msgid "Copy to Memcard %c" msgstr "Hafıza kartı %c 'ye kopyala" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "Çekirdek" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "%s oluÅŸturulamadı." - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "Çözücü %s baÅŸlatılamadı." -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1316,24 +1302,16 @@ msgstr "" "Lütfen bilgisayarların çoÄŸunun gerçek GameCube veya Wii disklerini " "okuyamadıklarını unutmayın." -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "Kalıp dosyası %s tanınamadı." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "%s kaydedilemedi." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Kollar ayarlanamadı. Oyuncu ayrıldı veya oyun ÅŸu anda çalışıyor! \n" -"(Oyunlar çalışırken kolların ayarlanması henüz desteklenmemektedir)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1346,12 +1324,19 @@ msgid "" "If so, then you may need to re-specify your memory card location in the " "options." msgstr "" +"Hafıza kartı dosyası %s yazılamadı. \n" +"\n" +"Dolphin'i bir CD/DVD'den çalıştırıyorsunuz veya kayıt dosyası yazma " +"korumalı.\n" +"\n" +"Bunu emulatör klasörünü taşıdıktan sonra mı görüyorsunuz?\n" +"EÄŸer öyleyse, ayarlardan memory card konumlarını düzeltin." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "Uzantı 'ini' için açma komutu bulunamadı." -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1359,17 +1344,17 @@ msgstr "" "Çekirdek baÅŸlatılamadı. \n" "Yapılandırmanızı denetleyin." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "Sayı:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "Ãœlke:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "AR Kodu OluÅŸtur" @@ -1404,12 +1389,13 @@ msgstr "" msgid "Crossfade" msgstr "GeçiÅŸli" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" +"wx Dosya Seçiciden sonra ÅŸu anki konum %s 'den %s 'ye deÄŸiÅŸtirilmiÅŸtir." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "Özel Görüntüleme Hilesi" @@ -1417,11 +1403,11 @@ msgstr "Özel Görüntüleme Hilesi" msgid "Custom Projection Hack Settings" msgstr "Özel Görüntüleme Hilesi Ayarları" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "Bazı ortografik projeksiyon parametrelerini özelleÅŸtir." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Çekçe" @@ -1433,36 +1419,36 @@ msgstr "D" msgid "D-Pad" msgstr "Yön TuÅŸları" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "Ses" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "Ses Emülatörü Motoru" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE Emülasyonu (Hızlı)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE Yorumlayıcı (Çok YavaÅŸ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE Yeniden Derleyici" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "Ses ayarları" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "Ayrı Ä°ÅŸlem Birimi Ãœzerinde DSP LLE" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD Kök Dizini:" @@ -1474,15 +1460,15 @@ msgstr "DVDLowRead - Kritik Hata: Birimden okuma baÅŸarısız." msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "DVDLowUnencryptedRead - Kritik Hata: Birimden okuma baÅŸarısız." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "Veri Boyutu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "Tarih:" @@ -1511,29 +1497,28 @@ msgstr "Hata ayıklama" msgid "Decimal" msgstr "Onluk taban" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "Kalıbı geniÅŸlet..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "Seçili kalıpları geniÅŸlet..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "Kalıp geniÅŸletiliyor..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "Oyun Listesini Yenile" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "Varsayılan" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "Varsayılan kalıp:" @@ -1576,8 +1561,8 @@ msgstr "" msgid "Device" msgstr "Sürücü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "Sürücü Ayarları" @@ -1585,15 +1570,12 @@ msgstr "Sürücü Ayarları" msgid "Dial" msgstr "Kadran" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "DirectX 10/11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "DirectX 9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1645,7 +1627,6 @@ msgstr "" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" @@ -1656,7 +1637,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "Disk" @@ -1683,24 +1664,59 @@ msgstr "" msgid "Divide" msgstr "Böl" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "Emülasyonu durdurmak istiyor musunuz?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" -msgstr "" +msgstr "Dolby Pro Logic II dekoder" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s Görüntü Yapılandırması" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin &Web Sitesi" @@ -1716,12 +1732,12 @@ msgstr "Dolphin Taklit Wiimote Yapılandırması" msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GC Kolu Yapılandırması" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS Filmleri (*.dtm)" @@ -1729,11 +1745,11 @@ msgstr "Dolphin TAS Filmleri (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote Yapılandırması" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "&Google Code'da Dolphin" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." @@ -1741,7 +1757,7 @@ msgstr "" "Dolphin herhangi bir GC veya Wii kalıbı bulamadı. Buraya çift tıklatarak " "dosyalara göz atabilirsiniz..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." @@ -1749,19 +1765,16 @@ msgstr "" "Dolphin ÅŸu anda oyunları gizlemeye ayarlıdır. Buraya çift tıklatarak tüm " "oyunları görebilirsiniz." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin istenen iÅŸlemi gerçekleÅŸtiremedi." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" msgstr "" -"Disk eriÅŸimini hızlandırır. Bazı oyunlarda gereklidir. (Açık = Hızlı, Kapalı " -"= Uyumlu)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1781,11 +1794,11 @@ msgstr "%lu kod indirildi. (%lu eklendi.)" msgid "Drums" msgstr "Davullar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "Kukla" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "Sesi Dök" @@ -1832,9 +1845,9 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Flemenkçe" @@ -1858,7 +1871,7 @@ msgstr "" "azından %d.%d sürümü olmalıdır. --- EÄŸer Dolphin'i sürekli güncelliyorsanız, " "Windows'un sürücüyü görmesi için yeniden baÅŸlatma gerekebilir." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "AVRUPA" @@ -1866,7 +1879,7 @@ msgstr "AVRUPA" msgid "Early Memory Updates" msgstr "Erken Hafıza Güncellemeleri" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "Düzen" @@ -1874,7 +1887,7 @@ msgstr "Düzen" msgid "Edit ActionReplay Code" msgstr "Action Replay Kodunu Düzenle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "Yapılandırmayı Düzenle" @@ -1882,12 +1895,12 @@ msgstr "Yapılandırmayı Düzenle" msgid "Edit Patch" msgstr "Yamayı Düzenle" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "Åžu anki perspektifi düzenle" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "Düzenle..." @@ -1899,7 +1912,7 @@ msgstr "Etki" msgid "Embedded Frame Buffer" msgstr "Gömülü Çerçeve Tamponu" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "Emülasyon Ä°ÅŸlem Birimi zaten çalışıyor." @@ -1937,7 +1950,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "Taklit Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "Emülasyon Durumu:" @@ -1961,15 +1974,15 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "AR GeçmiÅŸine Ä°zin Ver" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "Blok BirleÅŸimine Ä°zin Ver" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "Sınırlayıcı Kutu Hesaplama'yı EtkinleÅŸtir" @@ -1981,7 +1994,7 @@ msgstr "Ön BelleÄŸe Ä°zin Ver" msgid "Enable Cheats" msgstr "Hilelere Ä°zin Ver" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "Çift ÇekirdeÄŸe Ä°zin Ver" @@ -1989,7 +2002,7 @@ msgstr "Çift ÇekirdeÄŸe Ä°zin Ver" msgid "Enable Dual Core (speedup)" msgstr "Çift ÇekirdeÄŸe Ä°zin Ver (hızı artırır)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "BoÅŸta Atlamaya Ä°zin Ver" @@ -1997,7 +2010,7 @@ msgstr "BoÅŸta Atlamaya Ä°zin Ver" msgid "Enable Idle Skipping (speedup)" msgstr "BoÅŸta Atlamaya Ä°zin Ver (hızı artırır)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "MMU'ya Ä°zin Ver" @@ -2005,15 +2018,15 @@ msgstr "MMU'ya Ä°zin Ver" msgid "Enable Progressive Scan" msgstr "Progresif Taramaya Ä°zin Ver" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "Ekran Koruyucusuna Ä°zin Ver" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "" +msgstr "Hoparlör verisine izin ver" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "GeniÅŸ Ekrana Ä°zin Ver" @@ -2035,7 +2048,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, 1x seçin." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -2073,7 +2086,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." @@ -2081,26 +2094,24 @@ msgstr "" "The Legend of Zelda: Twilight Princess oyununu hızlandırır. DiÄŸer tüm " "oyunlarda iptal edin." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "Özel Gösterim Hilesini EtkinleÅŸtirir" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" +"5.1 surround sistemini kullanarak Dolby Pro Logic II'nin emulasyonunu " +"etkinleÅŸtir. OSX'de kullanılamaz." #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" +"5.1 surround sistemini kullanarak Dolby Pro Logic II'nin emulasyonunu " +"etkinleÅŸtir. Sadece OpenAL backend." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" @@ -2114,7 +2125,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2136,9 +2147,9 @@ msgstr "" msgid "End" msgstr "Son" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "Ä°ngilizce" @@ -2161,21 +2172,20 @@ msgstr "GiriÅŸ %d/%d" msgid "Entry 1/%d" msgstr "GiriÅŸ 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "EÅŸit" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "Hata" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "Seçili dili yüklerken hata. Sistem varsayılanlarına geri dönülüyor." -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2202,7 +2212,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "Özel durum iÅŸleyicisi - bellek alanı altında eriÅŸim. %08llx%08llx" @@ -2211,16 +2220,20 @@ msgstr "Özel durum iÅŸleyicisi - bellek alanı altında eriÅŸim. %08llx%08llx" msgid "Execute" msgstr "Yürüt" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "Çıkış" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "Tüm Wii Kayıtlarını Ver" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "Verme baÅŸarısız." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "Dosya Ver" @@ -2228,7 +2241,7 @@ msgstr "Dosya Ver" msgid "Export Recording" msgstr "Çekimi Ver" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "Çekimi Ver..." @@ -2236,7 +2249,7 @@ msgstr "Çekimi Ver..." msgid "Export Save" msgstr "Kaydı Ver" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "Wii Kayıtlı Oyununu Ver (Deneme Amaçlı)" @@ -2244,15 +2257,15 @@ msgstr "Wii Kayıtlı Oyununu Ver (Deneme Amaçlı)" msgid "Export all saves" msgstr "Tüm Kayıtları Ver" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "Verme baÅŸarısız, tekrar dene?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "Verme baÅŸarısız." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "Kaydı farklı ver..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "Uzantı" @@ -2268,44 +2281,44 @@ msgstr "Ä°lave Parametre" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "Ä°lave Parametre sadece \"Metroid: Other M\" oyununda kullanışlıdır." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "Tüm Dosyaları GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "Apploader'i GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "DOL'ü GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "Konumu GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "Dosyayı GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "Bölüntüyü GeniÅŸlet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s GeniÅŸletiliyor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "Tüm Dosyalar GeniÅŸletiliyor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "Konum GeniÅŸletiliyor" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "GeniÅŸletiliyor..." @@ -2317,15 +2330,15 @@ msgstr "FIFO Bayt'ı" msgid "FIFO Player" msgstr "FIFO Oynatıcısı" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANSA" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST Boyutu:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "BaÄŸlantı baÅŸarısız!" @@ -2333,11 +2346,15 @@ msgstr "BaÄŸlantı baÅŸarısız!" msgid "Failed to download codes." msgstr "Kod indirme baÅŸarısız." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "%s 'ye geniÅŸletme baÅŸarısız!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2373,20 +2390,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "%s okunamadı" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "banner.bin okunamadı." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" -msgstr "" +msgstr "bk baÅŸlığı okunamadı" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2397,7 +2414,7 @@ msgstr "" "Hafıza kartında sorun olabilir\n" "Dosya Konumu: %llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2405,7 +2422,7 @@ msgstr "" "Blok Ayırma Tablosu yedeÄŸi doÄŸru okunamadı.\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2413,17 +2430,17 @@ msgstr "" "Blok Ayırma Tablosu doÄŸru okunamadı.\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "%d dosyasından veri okunamadı." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" -msgstr "" +msgstr "%s dosyasından veri okunamadı" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2431,7 +2448,7 @@ msgstr "" "Konum yedeÄŸi doÄŸru okunamadı.\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2439,11 +2456,11 @@ msgstr "" "Konum doÄŸru okunamadı\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "BaÅŸlık okunamadı" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2451,29 +2468,34 @@ msgstr "" "BaÅŸlık doÄŸru okunamadı\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "Disk kalıbının Unique ID'si okunamadı." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "BT.DINF 'den SYSCONF 'a yazma baÅŸarısız." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "bkhdr yazılamadı." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "%s için baÅŸlık yazılamadı." -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "%d dosyası için baÅŸlık yazılamadı." - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "Farsça" @@ -2485,11 +2507,11 @@ msgstr "Hızlı" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "MMU'nun hızlı sürümü. Her oyunda çalışmaz." -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" @@ -2497,7 +2519,7 @@ msgstr "" "Kritik karışıklık. Oynatma durduruluyor. (PlayWiimote'da hata: %u != %u, " "bayt %u.)%s" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "Fifo Oynatıcısı" @@ -2521,7 +2543,7 @@ msgstr "" "Dosya açılamadı\n" "veya geçersiz bir uzantıya sahip." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2534,20 +2556,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "Dosya bir hafıza kartı olarak tanınamadı." -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "Dosya sıkıştırılmadı." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: Bilinmeyen açma modu : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "Dosya sistemi" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "Dosya türü 'ini' bilinmiyor! Açılmayacaktır!" @@ -2607,7 +2629,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " @@ -2617,7 +2639,7 @@ msgstr "" "Ä°ÅŸaretsiz bırakırsanız, Dolphin varsayılan olarak NTSC-U'yu seçecektir ve " "Japon oyunlarını oynarken bu ayarı etkinleÅŸtirecektir." -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2638,6 +2660,11 @@ msgstr "" msgid "Found %d results for '" msgstr "Bunun için %d sonuçlarını bul: '" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "%x kayıt dosyası bulundu" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2679,9 +2706,9 @@ msgstr "Çekilecek Çerçeveler" msgid "Free Look" msgstr "Serbest Bakış" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "Fransızca" @@ -2694,7 +2721,7 @@ msgstr "Perdeler" msgid "From" msgstr "Buradan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "Tam Ekran" @@ -2706,7 +2733,7 @@ msgstr "Tam Ekran Çözünürlüğü:" msgid "GCI File(*.gci)" msgstr "GCI Dosyası (*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC Kolu" @@ -2714,33 +2741,33 @@ msgstr "GC Kolu" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "Oyun ID'si:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "Oyun zaten çalışıyor!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "Oyun çalışmıyor!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" -msgstr "" +msgstr "Oyun bulunamadı!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "Oyuna Özel Ayarlar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "Oyun Yapılandırması" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:515 msgid "GameCube Savegame files(*.gci;*.gcs;*.sav)" -msgstr "" +msgstr "GameCube kayıtlı oyun dosyası(*.gci;*.gcs;*.sav)" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:541 msgid "Gamecube" @@ -2751,20 +2778,20 @@ msgid "Gamecube &Pad Settings" msgstr "Gamecube Kolu Ayarları (&P)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "GameCube Hafıza Kartları (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "GameCube Kolu Ayarları" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko Kodları" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2787,26 +2814,26 @@ msgstr "Genel" msgid "General Settings" msgstr "Genel Ayarlar" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "Almanca" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode: Ana sayfa kod liste boyutundan (%lu) daha büyük." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "Görüntü" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "Görüntü Ayarları" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "Daha Büyük" @@ -2826,7 +2853,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretli bırakın." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Yunanca" @@ -2850,11 +2877,11 @@ msgstr "Gitar" msgid "Hacks" msgstr "Hack'ler" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "BaÅŸlık saÄŸlama hatası" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Ä°branice" @@ -2866,7 +2893,7 @@ msgstr "Yükseklik" msgid "Help" msgstr "Yardım" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2878,7 +2905,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2930,7 +2957,7 @@ msgstr "Kısayol TuÅŸu Yapılandırması" msgid "Hotkeys" msgstr "TuÅŸlar" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Macarca" @@ -2938,29 +2965,33 @@ msgstr "Macarca" msgid "Hybrid Wiimote" msgstr "Karışık Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS: Bilinmeyen biletten veri alma denemesi: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" +"IOCTL_ES_LAUNCH: Oyun IOS'u veya baÅŸlığı yeniden yüklemeyi denedi ve bu " +"sizin NAND dökümünüze uyumlu deÄŸil.\n" +"BaÅŸlık ID %016llx.\n" +" Dolphin çakılacak gibi gözüküyor." -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - kötü durak" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL Ayarları" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "Kızılötesi" @@ -2972,15 +3003,15 @@ msgstr "Kızılötesi Ä°ÅŸaretleyici" msgid "IR Sensitivity:" msgstr "Kızılötesi Hassasiyeti:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "Kalıp Ayrıntıları" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "Kalıp Konumları" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "Ä°TALYA" @@ -2988,7 +3019,7 @@ msgstr "Ä°TALYA" msgid "Icon" msgstr "Simge" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -3032,9 +3063,13 @@ msgstr "" msgid "Import Save" msgstr "Kayıt Al" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "Alma baÅŸarısız,tekrar dene?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "Kayıt alma baÅŸarısız" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3056,21 +3091,16 @@ msgstr "" "Alınan dosya sav uzantısına sahip\n" "ama baÅŸlığı düzgün deÄŸil." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "Oyun İçi" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "Oyun-İçi" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "Çerçeve Sınırı:" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "Bilgi" @@ -3090,7 +3120,7 @@ msgstr "Ekle" msgid "Insert Encrypted or Decrypted code here..." msgstr "Åžifreli veya ÅŸifresiz kodu buraya ekleyin..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "SD Kart Ekle" @@ -3098,38 +3128,39 @@ msgstr "SD Kart Ekle" msgid "Insert name here.." msgstr "Adı buraya yazın..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "WAD Kur" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "Wii Menüsüne kur" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "" "Kurulum Özel Durum Ä°ÅŸleyici çaÄŸrıldı, ama bu platform henüz bunu " "desteklemiyor." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "WAD kuruluyor..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "Düzgünlük Denetleme Hatası" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "Düzgünlük denetlemesi tamamlandı" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "Düzgünlük denetlemesi tamamlandı. Hata bulunmadı." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -3142,7 +3173,7 @@ msgstr "" msgid "Interface" msgstr "Arabirim" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "Arabirim Ayarları" @@ -3167,20 +3198,20 @@ msgstr "İç LZO Hatası - lzo_init() baÅŸarısız." msgid "Internal Resolution:" msgstr "İç Çözünürlük:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" -msgstr "" +msgstr "Interpreter (ÇOK yavaÅŸ)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "Ä°ntro" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "Yanlış boyut (%x) veya Sihirli kelime (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "Hatalı DeÄŸer!" @@ -3188,16 +3219,16 @@ msgstr "Hatalı DeÄŸer!" msgid "Invalid bat.map or dir entry" msgstr "Hatalı bat.map veya konum giriÅŸi" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "Hatalı olay türü: %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "Hatalı dosya" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3208,7 +3239,7 @@ msgstr "" "%s\n" "Oyunu yeniden dökmeniz gerekebilir." -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "Hatalı çekim dosyası" @@ -3224,34 +3255,36 @@ msgstr "Geçersiz arama dizesi (sayıya dönüştürülemedi)" msgid "Invalid search string (only even string lengths supported)" msgstr "Geçersiz arama dizesi (sadece düz dize uzunluÄŸu destekleniyor)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "Hatalı durum" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Ä°talyanca" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPONYA" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" -msgstr "" +msgstr "JIT derleyici (önerilir)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" -msgstr "" +msgstr "JITIL deneysel derleyici" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japonca" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KORE" @@ -3273,8 +3306,9 @@ msgstr "Pencereyi üstte tut" msgid "Key" msgstr "TuÅŸ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Korece" @@ -3296,14 +3330,14 @@ msgstr "L Analog" msgid "Language:" msgstr "Dil:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "Son %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" -msgstr "" +msgstr "Gecikme:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:264 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:42 @@ -3340,7 +3374,7 @@ msgstr "" "Daha çok seçenek için sol veya saÄŸ, \n" "temizlemek için orta tıklatın." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "Daha Az" @@ -3357,101 +3391,90 @@ msgid "Load Custom Textures" msgstr "Özel Dokuları Yükle" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "Durumu Yük&le" +msgstr "Durumu Yükle" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "Durumu Yükle : 1" +msgstr "Son Durumu Yükle: 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "Durumu Yükle : 2" +msgstr "Son Durumu Yükle: 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "Durumu Yükle : 3" +msgstr "Son Durumu Yükle: 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "Durumu Yükle : 4" +msgstr "Son Durumu Yükle: 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "Durumu Yükle : 5" +msgstr "Son Durumu Yükle: 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "Durumu Yükle : 6" +msgstr "Son Durumu Yükle: 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "Durumu Yükle : 7" +msgstr "Son Durumu Yükle: 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "Durumu Yükle : 8" +msgstr "Son Durumu Yükle: 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "Durumu Yükle : 1" +msgstr "Durumu Yükle: 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "Durumu Yükle : 1" +msgstr "Durumu Yükle: 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "Durumu Yükle : 2" +msgstr "Durumu Yükle: 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "Durumu Yükle : 3" +msgstr "Durumu Yükle: 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "Durumu Yükle : 4" +msgstr "Durumu Yükle: 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "Durumu Yükle : 5" +msgstr "Durumu Yükle: 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "Durumu Yükle : 6" +msgstr "Durumu Yükle: 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "Durumu Yükle : 7" +msgstr "Durumu Yükle: 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "Durumu Yükle : 8" +msgstr "Durumu Yükle: 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "Durumu Yükle : 1" +msgstr "Durumu Yükle: 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "Durumu Yükle..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "Wii Sistem Menüsünü Yükle" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "Wii Sistem Menüsünü Yükle %d%c" @@ -3470,10 +3493,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "Bu oyun için kullanılabilir önayar varsa buradan seçiniz." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "Yerel" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "GeçmiÅŸ" @@ -3484,7 +3503,7 @@ msgstr "GeçmiÅŸ Yapılandırması" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:305 msgid "Log FPS to file" -msgstr "" +msgstr "FPS'yi dosyaya kaydet" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:83 msgid "Log Types" @@ -3497,17 +3516,22 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"Emülasyon hızını ölçmek için 1 saniye içerisinde yorumlanan çerçeve sayısını " +"User/Logs/fps.txt dosyasına yazar. Dolphin'in performans'ını test etmek " +"istiyorsanız bu özelliÄŸi kullanabilirsiniz.\n" +"\n" +"Emin deÄŸilseniz, iÅŸaretsiz bırakın." #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:68 msgid "Logger Outputs" msgstr "GeçmiÅŸ Çıkışı" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "GeçmiÅŸ" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "Sunucu baÄŸlantısı kayboldu!" @@ -3515,7 +3539,7 @@ msgstr "Sunucu baÄŸlantısı kayboldu!" msgid "M Button" msgstr "M Düğmesi" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3524,7 +3548,7 @@ msgstr "" "MD5 eÅŸleÅŸmiyor\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU Hız Hilesi" @@ -3538,11 +3562,11 @@ msgstr "MadCatz Gameshark dosyaları(*.gcs)" msgid "Main Stick" msgstr "Ana Çubuk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "Yapımcı ID'si:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "Yapımcı:" @@ -3573,7 +3597,7 @@ msgid "Memory Byte" msgstr "Hafıza Baytı" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "Hafıza Kartı" @@ -3585,7 +3609,7 @@ msgstr "" "Hafıza Kartı Yöneticisi Uyarısı-Kullanmadan önce yedekleme yapın, " "düzeltilmiÅŸ olması gerekiyor ama bozuk ÅŸeyler olabilir." -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3602,7 +3626,7 @@ msgstr "" "%s\n" "Eski dosyaları bu yeni yere kopyalamak ister misiniz?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "Hafıza kartı dosya boyutu baÅŸlık boyutuyla eÅŸleÅŸmiyor" @@ -3610,7 +3634,7 @@ msgstr "Hafıza kartı dosya boyutu baÅŸlık boyutuyla eÅŸleÅŸmiyor" msgid "Menu" msgstr "Menü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "Mikrofon" @@ -3623,7 +3647,7 @@ msgstr "En az" msgid "Misc" msgstr "ÇeÅŸitli" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "ÇeÅŸitli Ayarlar" @@ -3648,11 +3672,11 @@ msgstr "" msgid "Monospaced font" msgstr "BoÅŸluklu yazı" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "Motor" @@ -3771,15 +3795,15 @@ msgstr "NP Sekme" msgid "NP Up" msgstr "NP Yukarı" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "Ä°sim:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "Ä°sim:" @@ -3789,7 +3813,7 @@ msgstr "Ä°sim:" msgid "Native GCI files(*.gci)" msgstr "DoÄŸal GCI Dosyaları(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "Yeni Tarama" @@ -3798,7 +3822,7 @@ msgstr "Yeni Tarama" msgid "Next Page" msgstr "Sonraki Sayfa" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "Sonraki Tarama" @@ -3806,19 +3830,19 @@ msgstr "Sonraki Tarama" msgid "Nickname :" msgstr "Takma Ad :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "Ãœlke Yok (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "Kalıp bulunamadı" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "Ses çıkışı yok" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "BaÅŸlık %s için afiÅŸ dosyası bulunamadı" @@ -3844,42 +3868,43 @@ msgstr "BoÅŸ dizin indeks giriÅŸi yok" msgid "No recorded file" msgstr "ÇekilmiÅŸ Dosya Yok" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "BaÅŸlık %s için kayıt klasörü bulunamadı" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "Hiçbiri" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norveççe (Bokmaal Lehçesi)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "EÅŸit DeÄŸil" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "Ayarlanmamış" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" -msgstr "" +msgstr "Bir Wii kaydı deÄŸil veya bu baÅŸlık boyutu için okuma hatası: %x" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "BaÄŸlı deÄŸil" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "Notlar" @@ -3900,7 +3925,7 @@ msgstr "Duyuru" msgid "Num Lock" msgstr "Sayı Kilidi" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "Kod Sayısı:" @@ -3921,7 +3946,7 @@ msgstr "Nesne" msgid "Object Range" msgstr "Nesne Aralığı" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "Kapalı" @@ -3933,25 +3958,29 @@ msgstr "Uzantı:" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "Online & Belgeler" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "Sadece %d blok kullanılabilir" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "Aç" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "Dosya konumunu aç (&C)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "Wii kayıt kla&sörünü aç" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "Dosya aç..." @@ -3977,7 +4006,13 @@ msgstr "OpenCL Doku Çözücü" msgid "OpenMP Texture Decoder" msgstr "OpenMP Doku Çözücü" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "Seçenekler" @@ -3987,7 +4022,6 @@ msgid "Orange" msgstr "Turuncu" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -4002,7 +4036,7 @@ msgstr "" msgid "Other" msgstr "DiÄŸer" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -4014,15 +4048,15 @@ msgstr "" msgid "Output" msgstr "Çıkış" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "Çekimi Oynat... (&L)" -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "Kol" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "Kol" @@ -4046,17 +4080,17 @@ msgstr "Paragraf" msgid "Parameters" msgstr "Parametreler" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "Bölüntü %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "Yamalar" @@ -4064,21 +4098,21 @@ msgstr "Yamalar" msgid "Paths" msgstr "Yollar" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "Duraklat" #: Source/Core/DolphinWX/Src/FrameTools.cpp:129 msgid "Pause at end of movie" -msgstr "" +msgstr "Videonun sonunda duraklat" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:406 msgid "Per-Pixel Lighting" msgstr "Piksel Aydınlatması" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "Mükemmel" @@ -4088,9 +4122,9 @@ msgid "Perspective %d" msgstr "Perspektif %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "Oynat" @@ -4102,7 +4136,7 @@ msgstr "Çekimi Oynat" msgid "Play/Pause" msgstr "Oynat/Duraklat" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "Oynanabilir" @@ -4110,11 +4144,11 @@ msgstr "Oynanabilir" msgid "Playback Options" msgstr "Oynatma Seçenekleri" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "Oyuncular" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "Lütfen onaylayın..." @@ -4126,23 +4160,23 @@ msgstr "Kaydetmeden önce lütfen bir perspektif oluÅŸturun" msgid "Plus-Minus" msgstr "Artı-Eksi" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Lehçe" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "BaÄŸ. Nok. 1:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "BaÄŸ. Nok. 2:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "BaÄŸ. Nok. 3:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "BaÄŸ. Nok. 4:" @@ -4151,11 +4185,11 @@ msgstr "BaÄŸ. Nok. 4:" msgid "Port :" msgstr "BaÄŸ. Nok. :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portekizce" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portekizce (Brezilya)" @@ -4163,17 +4197,17 @@ msgstr "Portekizce (Brezilya)" msgid "Post-Processing Effect:" msgstr "Geç Ä°ÅŸleme Etkisi:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "PlayController'da erken kayıt bitiÅŸi. %u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "PlayWiimote'da erken kayıt bitiÅŸi. %u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "PlayWiimote'da erken kayıt bitiÅŸi. %u > %u" @@ -4190,7 +4224,7 @@ msgstr "Önceki Sayfa" msgid "Previous Page" msgstr "Önceki Sayfa" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "Önceki DeÄŸer" @@ -4206,7 +4240,7 @@ msgstr "Profil" msgid "Properties" msgstr "Özellikler" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "ÖnbelleÄŸi Temizle" @@ -4215,7 +4249,7 @@ msgid "Question" msgstr "Soru" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "Çık" @@ -4237,7 +4271,7 @@ msgstr "R Analog" msgid "RAM" msgstr "Anabellek" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSYA" @@ -4276,6 +4310,10 @@ msgstr "Gerçek Wiimote'lar" msgid "Record" msgstr "Çek" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "GiriÅŸi kaydet" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "Çekim Bilgisi" @@ -4311,7 +4349,7 @@ msgstr "" "Emin deÄŸilseniz, hiçbiri seçin." #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "Yenile" @@ -4320,14 +4358,14 @@ msgstr "Yenile" msgid "Refresh List" msgstr "Listeyi Yenile" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "Oyun Listesini Yenile" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "Kaldır" @@ -4350,7 +4388,7 @@ msgstr "Ana pencerede yorumla" msgid "Reset" msgstr "Sıfırla" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "Sonuçlar" @@ -4358,7 +4396,7 @@ msgstr "Sonuçlar" msgid "Return" msgstr "Enter" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4371,18 +4409,17 @@ msgstr "SaÄŸ" msgid "Right Stick" msgstr "SaÄŸ Çubuk" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "Gümbürtü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Rusça" @@ -4395,7 +4432,7 @@ msgid "Safe" msgstr "Güvenli" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "Kaydet" @@ -4405,23 +4442,20 @@ msgid "Save GCI as..." msgstr "GCI'yı farklı kaydet..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "Durumu Kaydet (&V)" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "Durumu Kaydet (&V)" +msgstr "Durumu Kaydet" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "Durumu Kaydet : 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "Durumu Kaydet : 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4452,32 +4486,31 @@ msgid "Save State Slot 8" msgstr "Durumu Kaydet : 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "Durumu Kaydet : 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "Durumu Kaydet..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "Farklı kaydet..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "Sıkıştırılan GCM/ISO'yu kaydet" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "Åžu anki perspektifi kaydet" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "GeniÅŸletilen GCM/ISO'yu kaydet" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "Kayıtlı durum filmi %s bozuk, film çekimi duruyor..." @@ -4486,20 +4519,20 @@ msgstr "Kayıtlı durum filmi %s bozuk, film çekimi duruyor..." msgid "Scaled EFB Copy" msgstr "Boyutlandırılmış EFB Kopyası" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "Taranıyor %s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "Kalıplar taranıyor" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "Taranıyor..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "Ekran Görüntüsü" @@ -4511,11 +4544,11 @@ msgstr "Kaydırma Kilidi" msgid "Search" msgstr "Ara" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "Arama Filtresi" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "Alt Klasörleri Ara" @@ -4538,12 +4571,12 @@ msgstr "SYSCONF içinde %s bölümü bulunamadı" msgid "Select" msgstr "Seç" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "Çekim Dosyasını Seç" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "Kurmak için bir Wii WAD dosyası seçin" @@ -4565,19 +4598,19 @@ msgstr "Almak için bir kayıt dosyası seçin" msgid "Select floating windows" msgstr "Sabit olmayan pencereyi seçin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "Yüklemek için dosyayı seçin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "Kayıt dosyasını seçin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "Yüklemek için durum seçin" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "Kaydetmek için durum seçin" @@ -4599,9 +4632,9 @@ msgstr "" "\n" "Emin deÄŸilseniz, otomatik seçin." -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" -msgstr "" +msgstr "SeçilmiÅŸ kumanda profili yok." #: Source/Core/DolphinWX/Src/LogWindow.cpp:109 msgid "Selected font" @@ -4623,27 +4656,28 @@ msgstr "" "Emin deÄŸilseniz, masaüstü çözünürlüğünüzü seçin.\n" "Hala emin deÄŸilseniz, kullanabildiÄŸiniz en yüksek çözünürlüğü seçin." -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "Gönder" @@ -4655,17 +4689,17 @@ msgstr "Sensör Çubuk Konumu:" msgid "Separator" msgstr "Bölücü" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Sırpça" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "" "Seri BaÄŸ.Nok. 1 - Bu baÄŸlantı noktasına aÄŸ adaptörü gibi sürücüler baÄŸlanır" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "Varsayılan Kalıp Olarak Ayarla (&D)" @@ -4674,7 +4708,7 @@ msgstr "Varsayılan Kalıp Olarak Ayarla (&D)" msgid "Set as default Memcard %c" msgstr "Varsayılan Hafıza Kartı %c olarak ayarla" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive: Anasayfa, kod listesi boyutu %lu dan daha büyük." @@ -4684,20 +4718,22 @@ msgid "" "Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL " "backend only." msgstr "" +"Gecikmeyi ayarlayın (ms olarak). Yüksek deÄŸerler ses hışırtısını " +"azaltabilir. Sadece OpenAL ile kullanılabilir." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "Ayarlar..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem: Ayar dosyası bulunamadı" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "Sallama" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "Kısa Ä°sim:" @@ -4705,23 +4741,27 @@ msgstr "Kısa Ä°sim:" msgid "Shoulder Buttons" msgstr "Shoulder Düğmeleri" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "Konsolu Göster (&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "GeçmiÅŸi Göster (&L)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "Durum ÇubuÄŸunu Gö&ster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "Araç ÇubuÄŸunu Gös&ter" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "Varsayılanları Göster" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "Aygıtları Göster" @@ -4733,11 +4773,11 @@ msgstr "EFB Bölge Kopyalamasını Göster" msgid "Show FPS" msgstr "Kare Sayısını Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "Fransızları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "GameCube'leri Göster" @@ -4745,35 +4785,35 @@ msgstr "GameCube'leri Göster" msgid "Show Input Display" msgstr "Görüntü GiriÅŸini Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "Ä°talyanları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "Japonları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "Korelileri Göster" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "Gösterme Dili:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "GeçmiÅŸ Yapılandırmasını Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "PAL'ları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "Platformları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "Bölgeleri Göster" @@ -4781,27 +4821,27 @@ msgstr "Bölgeleri Göster" msgid "Show Statistics" msgstr "Ä°statistikleri Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "Tayvanlıları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "Amerikanları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "WAD'ları Göster" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "Wii'leri Göster" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "Oyunu durdurmadan önce onay kutusu görüntüle." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4817,14 +4857,17 @@ msgstr "Ä°lk bloÄŸu göster" #: Source/Core/DolphinWX/Src/FrameTools.cpp:131 msgid "Show lag counter" -msgstr "" +msgstr "Lag sayacını göster" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " "information, and JIT cache clearing." msgstr "" +"Mesajlarıi emulasyon ekranı bölümünde göster.\n" +"Bu mesajlar memory card eriÅŸimi, video altyapısı, CPU bilgisi, ve JIT " +"önbelleÄŸini temizleme olabilir." #: Source/Core/DolphinWX/Src/MemcardManager.cpp:815 msgid "Show save blocks" @@ -4854,7 +4897,7 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "Bilinmeyenleri göster" @@ -4868,23 +4911,24 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "Yatay Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "BasitleÅŸtirilmiÅŸ Çince" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "Boyut" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "BIOS'u Geç" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4907,17 +4951,17 @@ msgstr "" "doÄŸruluÄŸunu artırmayı deneyin.\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "Slot %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "Slot A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "Slot B" @@ -4925,7 +4969,7 @@ msgstr "Slot B" msgid "Snapshot" msgstr "Enstantene" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "Yazılımsal Yorumlayıcı" @@ -4941,27 +4985,27 @@ msgstr "" "Yazılım yorumlamasını açmayı gerçekten istiyor musunuz? Emin deÄŸilseniz, " "'Hayır' seçin." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "Ses Ayarları" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "Ses arkaucu %s geçerli deÄŸil." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "Ses tamponu oluÅŸturulamadı: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "BoÅŸluk" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Ä°spanyolca" @@ -4989,37 +5033,29 @@ msgstr "" "\n" "Emin deÄŸilseniz, 640x528'i seçin." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "Disk Aktarım Oranını Hızlandır" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Kare Çubuk" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "Varsayılan Denetim Aygıtı" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "BaÅŸlat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "&NetPlay'i BaÅŸlat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "Çekimi BaÅŸlat (&C)" @@ -5027,7 +5063,7 @@ msgstr "Çekimi BaÅŸlat (&C)" msgid "Start Recording" msgstr "Çekimi BaÅŸlat" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "Durum" @@ -5035,16 +5071,16 @@ msgstr "Durum" msgid "State Saves" msgstr "Durum Kayıtları" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" -msgstr "" +msgstr "Direksiyon" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:57 msgid "Stick" msgstr "Çubuk" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "Durdur" @@ -5075,39 +5111,40 @@ msgstr "Tıngırtı" msgid "Subtract" msgstr "Çıkarma" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "Dosya %s 'ye baÅŸarıyla verildi" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "Kayıt dosyaları baÅŸarıyla alındı" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "Hareket" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "Sistem Dili:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAYVAN" @@ -5132,13 +5169,13 @@ msgstr "Tablo Sol" msgid "Table Right" msgstr "Tablo SaÄŸ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "Ekran Görüntüsü Al" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "TaruKonga (Bongos)" @@ -5158,11 +5195,11 @@ msgstr "Doku Ön BelleÄŸi" msgid "Texture Format Overlay" msgstr "Doku Biçimi Kaplaması" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD BaÅŸarıyla yüklendi." -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "Adres geçersiz" @@ -5170,13 +5207,13 @@ msgstr "Adres geçersiz" msgid "The checksum was successfully fixed" msgstr "SaÄŸlama baÅŸarıyla düzeltildi" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "Seçilen konum zaten listede" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -5199,7 +5236,7 @@ msgstr "" msgid "The file %s was already open, the file header will not be written." msgstr "Dosya %s zaten açık, dosya baÅŸlığı yazılmayacaktır." -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "Belirtilen dosya (%s) bulunamadı" @@ -5232,7 +5269,7 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "Kopyalamayı denediÄŸiniz kaydın boyutu hatalı" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." @@ -5240,36 +5277,36 @@ msgstr "" "Seçilen dili sisteminiz desteklememektedir. Sistem varsayılanına geri " "dönülüyor." -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "Sunucu ve istemcinin NetPlay sürümleri uyumlu deÄŸil!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "Sunucu dolu!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "Sunucu yanıtı: oyun ÅŸu anda çalışıyor!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "Sunucu bilinmeyen bir hata mesajı gönderdi!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "Belirtilen dosya \"%s\" bulunamadı" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "DeÄŸer hatalı" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "Tema:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." @@ -5277,7 +5314,7 @@ msgstr "" "Burada 00000001/00000002 için bir bilet olmalıdır. NAND dökümünüz " "tamamlanmamış olabilir." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5285,14 +5322,14 @@ msgstr "" "Bu ayarlar Dolphin'in kendi ayarları yerine kullanılır. \n" "Dolu kareler oyunun Dolphin'in ayarlarını kullandığını gösterir." -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "" "Bu Action Replay simülatörü, kodların kendisini düzenlemesini desteklemiyor." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "Bu Wii Menüsünde ve bazı oyunlarda yavaÅŸlamaya neden olabilir." @@ -5315,19 +5352,15 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"EÄŸer çerçeve sınırını oyun hızından yüksek seçerseniz (NTSC:60, PAL:50), DSP " -"ile Ses hızlandırıcısı kullanın. (Ses takılmalarını düzeltebilir, ancak " -"(oyuna baÄŸlı olarak) sürekli gürültüye de neden olabilir.)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5339,7 +5372,7 @@ msgstr "" "Bilgisayarınızda çift çekirdek varsa hızınızı büyük oranda artırır,ama bazı " "çökme ve hatalara neden olabilir." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "INI Yapılandırma dosyasını elle düzenlemeye izin verir." @@ -5348,12 +5381,12 @@ msgstr "INI Yapılandırma dosyasını elle düzenlemeye izin verir." msgid "Threshold" msgstr "EÅŸik" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "EÄŸim" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "BaÅŸlık" @@ -5367,39 +5400,37 @@ msgid "Toggle All Log Types" msgstr "Tüm GeçmiÅŸ Türlerini Seç" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "En-boy Oranı:" +msgstr "En-boy Oranını aç/kapat" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB Kopyaları" +msgstr "EFB Kopyalarını aç/kapat" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "Tüm GeçmiÅŸ Türlerini Seç" +msgstr "Fog aç/kapat" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "Tam Ekran Moduna Geç" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "IR aç/kapat" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "Ãœst" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Geleneksel Çince" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "Bilinmeyen bir dosya türünü yüklemeyi denedi." @@ -5419,7 +5450,7 @@ msgstr "" "Geçersiz SYSCONF'tan okumayı deniyor\n" "Wiimote BT ID'leri mevcut deÄŸil" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Türkçe" @@ -5435,12 +5466,12 @@ msgstr "Tür" msgid "UDP Port:" msgstr "UDP BaÄŸ.Nok.:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "BÄ°LÄ°NMEYEN" @@ -5449,7 +5480,7 @@ msgstr "BÄ°LÄ°NMEYEN" msgid "UNKNOWN_%02X" msgstr "BÄ°LÄ°NMEYEN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "AMERÄ°KA" @@ -5462,9 +5493,9 @@ msgstr "" "Girilen veri deÄŸiÅŸtirilmemiÅŸ." #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" @@ -5472,7 +5503,7 @@ msgstr "" "kod olarak ayrıştırılamadı. Kodu doÄŸru yazdığınızdan emin olun.\n" "Bu satırı yoksayıp ayrıştırmaya devam etmek istiyor musunuz?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "Belirsiz %i" @@ -5482,19 +5513,18 @@ msgid "Undo Load State" msgstr "Durum Yüklemeyi Geri Al" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "Durum Yüklemeyi Geri Al" +msgstr "Durum Kaydetmeyi Geri Al" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "Beklenmedik 0x80 çaÄŸrısı? Çıkılıyor..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "Bilinmeyen" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "Bilinmeyen DVD komutu %08x - önemli hata" @@ -5502,19 +5532,19 @@ msgstr "Bilinmeyen DVD komutu %08x - önemli hata" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:444 #, c-format msgid "Unknown command 0x%08x" -msgstr "" +msgstr "Bilinmeyen komut 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "SYSCONF içinde bilinmeyen giriÅŸ türü %i (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "Åžu ID ile bilinmeyen mesaj alındı : %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "ID %d ile %d oyuncusundan bilinmeyen mesaj alındı. Oyuncu atılıyor!" @@ -5524,16 +5554,16 @@ msgstr "ID %d ile %d oyuncusundan bilinmeyen mesaj alındı. Oyuncu atılıyor!" msgid "Up" msgstr "Yukarı" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "Güncelle" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "Dik Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "EuRGB60 Modunu Kullan (PAL60)" @@ -5541,7 +5571,7 @@ msgstr "EuRGB60 Modunu Kullan (PAL60)" msgid "Use Fullscreen" msgstr "Tam Ekran Kullan" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "HEX Kullan" @@ -5569,6 +5599,15 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5591,12 +5630,11 @@ msgstr "Gereçler" msgid "V-Sync" msgstr "Dikey EÅŸitleme" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU Hız Hilesi" +msgstr "VBeam Hız Hilesi" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "DeÄŸer" @@ -5604,7 +5642,7 @@ msgstr "DeÄŸer" msgid "Value:" msgstr "DeÄŸer:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "DeÄŸer:" @@ -5616,7 +5654,7 @@ msgstr "Duyuru/Hata/Uyarı" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "Görüntü" @@ -5624,17 +5662,17 @@ msgstr "Görüntü" msgid "Virtual" msgstr "Sanal" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "Ses" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD kurulumu baÅŸarısız: %s oluÅŸturmada hata" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "WAD kurulumu baÅŸarısız: Ticket oluÅŸturma hatası." @@ -5656,19 +5694,19 @@ msgstr "" msgid "Warning" msgstr "Uyarı" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "Uyarı - DOL yanlış konsol modunda baÅŸlatılıyor!" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "Uyarı - ELF yanlış konsol modunda baÅŸlatılıyor!" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "Uyarı - Kalıp yanlış konsol modunda baÅŸlatılıyor!" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5693,7 +5731,7 @@ msgstr "" "ve hafıza kartınızdaki dosyayla aynı adda olacak.\n" "Devam?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5705,7 +5743,7 @@ msgstr "" "veya bu kaydı Salt Okunur mod kapalıyken yüklemeniz daha iyi olacaktır. Aksi " "taktirde, büyük bir ihtimalle, senkronizasyon sorunu yaÅŸayacaksınız." -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5717,7 +5755,7 @@ msgstr "" "yüklemeniz daha iyi olacaktır. Aksi taktirde, büyük bir ihtimalle, " "senkronizasyon sorunu yaÅŸayacaksınız." -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5772,19 +5810,15 @@ msgstr "GeniÅŸlik" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii Konsolu" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "Wii NAND Kök Dizini:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "Wii Kaydı Al" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii kayıt dosyaları (*.bin)|*.bin" @@ -5793,16 +5827,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: Dosyadan okuma baÅŸarısız" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "Wiimote %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote BaÄŸlandı" @@ -5810,7 +5850,7 @@ msgstr "Wiimote BaÄŸlandı" msgid "Wiimote Motor" msgstr "Wiimote Motoru" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote ayarları" @@ -5834,14 +5874,14 @@ msgstr "Pencereleri SaÄŸa Döşe" msgid "Word Wrap" msgstr "Heceleme" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "Çalışıyor..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5861,21 +5901,36 @@ msgstr "Dosyaya Yaz" msgid "Write to Window" msgstr "Pencereye Yaz" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice baÅŸarsız: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 baÅŸlatılamadı: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 ana ses oluÅŸturulamadı: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice baÅŸarsız: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 baÅŸlatılamadı: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 ana ses oluÅŸturulamadı: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "XF kaydı" @@ -5896,6 +5951,9 @@ msgid "" "You are using an old free DSP ROM made by the Dolphin Team.\n" "Only games using the Zelda UCode will work correctly.\n" msgstr "" +"Dolphin Takımı tarafından yapılan eski bedava DSP ROM'ları " +"kullanıyorsunuz. \n" +"Sadece Zelda UCode oyunları bunlarla düzgün çalışabilir. \n" #: Source/Core/DolphinWX/Src/FrameAui.cpp:63 msgid "You can't close panes that have pages in them." @@ -5905,11 +5963,11 @@ msgstr "Sayfalı bölmeleri kapatamazsınız." msgid "You must choose a game!!" msgstr "Bir oyun seçmelisiniz!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "Bir isim girmelisiniz!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "DoÄŸru bir sekizlik,onluk veya onaltılık deÄŸer girmelisiniz." @@ -5917,7 +5975,7 @@ msgstr "DoÄŸru bir sekizlik,onluk veya onaltılık deÄŸer girmelisiniz." msgid "You must enter a valid profile name." msgstr "Geçerli bir profil ismi girmelisiniz." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "DeÄŸiÅŸikliÄŸin etkili olması için Dolphin'i yeniden baÅŸlatmalısınız." @@ -5927,8 +5985,11 @@ msgid "" "Would you like to stop now to fix the problem?\n" "If you select \"No\", audio might be garbled." msgstr "" +"DSP ROM'larınız yanlış hash deÄŸerlerine sahip.\n" +"Sorunu düzeltmek için durdurmak istiyor musunuz?\n" +"EÄŸer Hayır'ı, seçerseniz, seste sorun oluÅŸabilir." -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5947,15 +6008,15 @@ msgstr "" "0x%04x olmalıdır (sizinki: 0x%04llx) \n" "Yenisini oluÅŸturmak ister misiniz?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP Hilesi" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Sıfır-Üç kodu desteklenmemektedir." -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Dolphin Sıfır kodu bilinmiyor: %08x" @@ -6013,20 +6074,24 @@ msgstr "" "\n" "Emin deÄŸilseniz, iÅŸaretsiz bırakın." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "apploader (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: %x 'den iÅŸlem kodu okunuyor. Lütfen bildirin." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute uygulama çalışırken -1'e düştü!" @@ -6042,44 +6107,41 @@ msgstr "zNear Düzeltmesi:" msgid "| OR" msgstr "| VEYA" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "DoÄŸru VBeam Emülasyonu" +#~ msgid "Could not create %s" +#~ msgstr "%s oluÅŸturulamadı." -#~ msgid "Enable Hotkeys" -#~ msgstr "Kısayol TuÅŸlarına Ä°zin Ver" - -#~ msgid "Failed to Listen!!" -#~ msgstr "Dinleme baÅŸarısız!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "bthprops.cpl yüklenemedi." - -#~ msgid "Failed to load hid.dll" -#~ msgstr "hid.dll yükleme baÅŸarısız." - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMic Yapılandırması" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY çaÄŸrıldı, lütfen bildirin!" +#~ msgid "Direct3D11" +#~ msgstr "DirectX 10/11" #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "Saniyedeki çerçeve sayısı düzensizse, bu seçenek size yardım edebilir. " -#~ "(Açık = Uyumlu, Kapalı = Hızlı)" +#~ "Hangi görüntü API'sinin kullanılacağını seçer.\n" +#~ "Direct3D 9 genelde en hızlı olanlarıdır. OpenGL gerçekçiliÄŸe önem verir. " +#~ "Direct3D 11 ikisinin arasıdır.\n" +#~ "Åžunu unutmayın, Direct3D sadece Windows'da kullanılabilir.\n" +#~ "\n" +#~ "Emin deÄŸilseniz, Direct3D 11'i seçin." -#~ msgid "Last Overwritten State" -#~ msgstr "Son Ãœzerine Yazılan Durum" +#~ msgid "" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use OpenGL." +#~ msgstr "" +#~ "Hangi görüntü API'sinin kullanılacağını seçer.\n" +#~ "Direct3D 9 genelde en hızlı olanlarıdır. OpenGL gerçekçiliÄŸe önem verir. " +#~ "Direct3D 11 ikisinin arasıdır.\n" +#~ "Åžunu unutmayın, Direct3D sadece Windows'da kullanılabilir.\n" +#~ "\n" +#~ "Emin deÄŸilseniz, OpenGL'yi seçin." -#~ msgid "Last Saved State" -#~ msgstr "Son Kayıtlı Durum" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "Durum yüklemesinde Wiimote'u yeniden baÄŸla" - -#~ msgid "Set" -#~ msgstr "Ayarla" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "Hedef Alpha GeçiÅŸini Atla" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: %x 'den iÅŸlem kodu okunuyor. Lütfen bildirin." diff --git a/Languages/po/zh_CN.po b/Languages/po/zh_CN.po index a4d14ff611..73fcd1e541 100644 --- a/Languages/po/zh_CN.po +++ b/Languages/po/zh_CN.po @@ -5,14 +5,15 @@ # Translators: # Sentret_C , 2013 # thegfw , 2011 +# lxf2000 , 2013 # Sentret_C , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-14 02:35+0000\n" -"Last-Translator: Sentret_C \n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-21 05:18+0000\n" +"Last-Translator: lxf2000 \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/dolphin-" "emu/language/zh_CN/)\n" "Language: zh_CN\n" @@ -21,13 +22,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" -msgstr " (è¦æ˜¾ç¤ºçš„项目太多)" +msgstr " (项目太多,无法完全显示)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " æ¸¸æˆ : " @@ -35,19 +36,19 @@ msgstr " æ¸¸æˆ : " msgid "! NOT" msgstr "! éž" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" " Create a new 16MB Memcard?" msgstr "" -"\"%s\" ä¸å­˜åœ¨.\n" -" 创建一个新的 16MB 记忆å¡?" +"\"%s\" ä¸å­˜åœ¨ã€‚\n" +" 创建一个新的 16MB 存储å¡?" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." -msgstr "\"%s\" ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ GCM/ISO 文件, 或者ä¸æ˜¯ä¸€ä¸ª GC/Wii é•œåƒ." +msgstr "\"%s\" ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ GCM/ISO 文件,或者ä¸æ˜¯ä¸€ä¸ª GC/Wii é•œåƒã€‚" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:730 #, c-format @@ -59,73 +60,78 @@ msgstr "%08X: " msgid "%1$sCopy%1$s" msgstr "%1$så¤åˆ¶%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" -msgstr "%d个样本" +msgstr "%d 采样" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" -msgstr "" +msgstr "%d 采样 (è´¨é‡ç­‰çº§ %d)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" -msgstr "%s å·²ç»å­˜åœ¨,覆盖å—?" +msgstr "%s å·²ç»å­˜åœ¨ï¼Œæ˜¯å¦è¦†ç›–?" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." -msgstr "æå– %s 失败.å¯èƒ½é•œåƒæ˜¯åçš„." +msgstr "ç¼©å‡ %s 失败。镜åƒå¯èƒ½æœ‰é”™è¯¯ã€‚" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -"未能作为存储å¡æ‰“å¼€%s \n" +"无法将 %s è½½å…¥ä¸ºå­˜å‚¨å¡ \n" " å¡æ–‡ä»¶å¤§å°æ— æ•ˆ (0x%x 字节)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -"未能作为存储å¡æ‰“å¼€%s \n" +"无法将 %s è½½å…¥ä¸ºå­˜å‚¨å¡ \n" " å¡å¤§å°æ— æ•ˆ (0x%x 字节)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -"未能作为存储å¡æ‰“å¼€%s \n" -"相对于有效的记忆å¡æ–‡ä»¶ï¼Œè¯¥æ–‡ä»¶å¤ªå° (0x%x 字节)" +"无法将 %s è½½å…¥ä¸ºå­˜å‚¨å¡ \n" +"相对于有效的存储å¡æ–‡ä»¶ï¼Œè¯¥æ–‡ä»¶å¤ªå° (0x%x 字节)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" -msgstr "打开 %s 失败" +msgstr "无法打开 %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "%s 失败:kr=%x" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" -msgstr " %s 是一个零字节文件" +msgstr "%s 是一个零字节文件" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." -msgstr "%s å·²ç»è¢«åŽ‹ç¼©è¿‡! ä¸èƒ½å¯¹å®ƒå†è¿›è¡ŒåŽ‹ç¼©äº†." +msgstr "%s å·²ç»è¢«åŽ‹ç¼©è¿‡! 无法对它进一步压缩。" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" -msgstr "%s 作为文件å太长,最大字符数为45" +msgstr "%s 作为文件å太长,最大字符数为45" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:189 #, c-format @@ -151,7 +157,7 @@ msgstr "%u 空闲区å—; %u 空闲目录项目" msgid "&& AND" msgstr "&& 与" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "关于(&A)..." @@ -159,7 +165,7 @@ msgstr "关于(&A)..." msgid "&Boot from DVD Drive..." msgstr "从光驱å¯åŠ¨(&B)..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "断点(&B)" @@ -167,19 +173,19 @@ msgstr "断点(&B)" msgid "&Browse for ISOs..." msgstr "æµè§ˆé•œåƒ(&B)..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" -msgstr "作弊ç ç®¡ç†å™¨(&C)" +msgstr "金手指管ç†å™¨(&C)" #: Source/Core/DolphinWX/Src/FrameTools.cpp:179 msgid "&DSP Settings" msgstr "DSP设置(&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "删除镜åƒ(&D)..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "删除所选镜åƒ(&D)..." @@ -191,11 +197,11 @@ msgstr "模拟(&E)" msgid "&File" msgstr "文件(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "帧数步进(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "切æ¢å…¨å±(&F)" @@ -203,7 +209,7 @@ msgstr "切æ¢å…¨å±(&F)" msgid "&Graphics Settings" msgstr "图形设置(&G)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "帮助(&H)" @@ -211,7 +217,7 @@ msgstr "帮助(&H)" msgid "&Hotkey Settings" msgstr "热键设置(&H)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "å³æ—¶ç¼–译器(&J)" @@ -223,11 +229,11 @@ msgstr "载入状æ€(&L)" msgid "&Memcard Manager (GC)" msgstr "GC存储å¡ç®¡ç†å™¨(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "内存(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "打开(&O)..." @@ -235,59 +241,59 @@ msgstr "打开(&O)..." msgid "&Options" msgstr "选项(&O)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "æš‚åœæ¸¸æˆ(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "开始游æˆ(&P)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "属性(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "åªè¯»æ¨¡å¼(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "刷新列表(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "寄存器(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "é‡ç½®æ¸¸æˆ(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "声音(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "åœæ­¢æ¸¸æˆ(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "工具(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "视频(&V)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "视图(&V)" #: Source/Core/DolphinWX/Src/FrameTools.cpp:181 msgid "&Wiimote Settings" -msgstr "Wiié¥æŽ§å™¨è®¾ç½®(&W)" +msgstr "Wii 控制器设置(&W)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "百科(&W)" @@ -297,11 +303,11 @@ msgstr "'" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:46 msgid "(-)+zFar" -msgstr "(-)+zFar" +msgstr "(-)+远剪è£" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:41 msgid "(-)+zNear" -msgstr "(-)+zNear" +msgstr "(-)+近剪è£" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:86 msgid "(UNKNOWN)" @@ -312,9 +318,8 @@ msgid "(off)" msgstr "(å…³)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ 加" +msgstr "+ 加" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -322,25 +327,25 @@ msgstr "0x44" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1.5x Native (960x792)" -msgstr "1.5x 原生(960x792)" +msgstr "1.5x 原生 (960x792)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 ä½" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "1x Native (640x528)" -msgstr "1x 原生(640x528)" +msgstr "1x 原生 (640x528)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "2.5x Native (1600x1320)" -msgstr "2.5x 原生(1600x1320)" +msgstr "2.5x 原生 (1600x1320)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:347 msgid "2x Native (1280x1056)" -msgstr "2x 原生(1280x1056)" +msgstr "2x 原生 (1280x1056)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 ä½" @@ -350,13 +355,13 @@ msgstr "3D Vision" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "3x Native (1920x1584)" -msgstr "3x 原生(1920x1584)" +msgstr "3x 原生 (1920x1584)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:348 msgid "4x Native (2560x2112)" -msgstr "4x 原生(2560x2112)" +msgstr "4x 原生 (2560x2112)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 ä½" @@ -368,15 +373,15 @@ msgstr "<在这里æ’å…¥å称>" msgid "" msgstr "<未找到分辨率>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<æ— >" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:150 msgid "" -msgstr "<按任æ„é”®>" +msgstr "<请按键>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<系统>" @@ -385,14 +390,14 @@ msgid "A" msgstr "A" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" -msgstr "网上对战窗å£å·²ç»æ‰“å¼€!!" +msgstr "å·²ç»æœ‰ä¸€ä¸ªNetPlay窗å£æ‰“å¼€!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." -msgstr "ç›®å‰æ²¡æœ‰æ¸¸æˆè¿è¡Œ." +msgstr "ç›®å‰æ²¡æœ‰æ¸¸æˆåœ¨è¿è¡Œã€‚" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:85 msgid "" @@ -400,7 +405,7 @@ msgid "" "You must manually connect your wiimotes." msgstr "" "未å‘现支æŒçš„è“牙设备。\n" -"您需è¦æ‰‹åŠ¨è¿žæŽ¥æ‚¨çš„Wiié¥æŽ§å™¨ã€‚" +"您需è¦æ‰‹åŠ¨è¿žæŽ¥æ‚¨çš„ Wii 控制器。" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 #, fuzzy @@ -412,38 +417,37 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"警告:\n" +"注æ„:\n" "\n" -"NetPlayç›®å‰ä»…能在如下设置下正常工作:\n" -" - åŒæ ¸å¿ƒ [å…³]\n" -" - 音频é™æµ [å…³]\n" -" - å¼€å¯â€œæ— éŸ³é¢‘â€çš„DSP-HLE或DSP-LLE\n" -" - 手动在[标准控制器]中准确设置将使用的控制器数目\n" +"Netplay 仅在如下设置时å¯ç”¨:\n" +" - å¯ç”¨å¤šæ ¸å¤„ç† [å…³]\n" +" - 所有计算机上的 DSP 模拟引擎必须一致!\n" +" - 在专门的线程中模拟 DSP [å…³]\n" +" - 帧数é™åˆ¶ä¸ä¸º [音频]\n" "\n" -"所有玩家应尽é‡ä½¿ç”¨ç›¸åŒç‰ˆæœ¬çš„Dolphin以åŠç›¸åŒçš„设置。\n" -"ç¦ç”¨æ‰€æœ‰å­˜å‚¨å¡æˆ–在开始å‰å°†å­˜å‚¨å¡å‘é€ç»™æ‰€æœ‰çŽ©å®¶ã€‚\n" -"尚未实现Wiié¥æŽ§å™¨æ”¯æŒã€‚\n" +"所有玩家都应使用相åŒçš„ Dolphin 版本与设置。\n" +"所有玩家的存储å¡å¿…须相åŒæˆ–ç¦ç”¨ã€‚\n" +"尚未实现对 Wii 控制器的支æŒ!\n" "\n" -"您必须设置TCP端å£è½¬å‘以æˆä¸ºä¸»æœºï¼ï¼" +"主机必须开放/映射选定的 TCP 端å£!\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-基æ¿" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" -msgstr "动作回放代ç " +msgstr "AR 代ç " #: Source/Core/DolphinWX/Src/AboutDolphin.h:21 msgid "About Dolphin" @@ -451,7 +455,7 @@ msgstr "关于 Dolphin" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:24 msgid "Acceleration" -msgstr "加速器" +msgstr "加速度" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:474 msgid "Accuracy:" @@ -465,8 +469,8 @@ msgid "" "\n" "If unsure, check EFB to Texture instead." msgstr "" -"精确地模拟EFB副本。\n" -"一些游æˆéœ€è¦æ­¤é¡¹ä»¥ä¿è¯æŸäº›å›¾åƒæ•ˆæžœæˆ–游æˆæœºèƒ½ã€‚\n" +"精确地模拟 EFB 副本。\n" +"一些游æˆçš„特定图åƒæ•ˆæžœæˆ–游æˆæœºèƒ½éœ€è¦æ­¤é¡¹ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·é€‰æ‹©ç¼“冲到æ质。" @@ -489,69 +493,72 @@ msgstr "" "错误代ç :\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" -msgstr "动作回放错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 æ·»åŠ ä»£ç  (%s)" +msgstr "Action Replay 错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 æ·»åŠ ä»£ç  (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" -msgstr "动作回放错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 填充和滑动 (%s)" +msgstr "Action Replay 错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 填充和滑动 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " "Fill (%s)" -msgstr "动作回放错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 内存写入和填充 (%s)" +msgstr "" +"Action Replay 错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 内存写入和填充 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " "Pointer (%s)" -msgstr "动作回放错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 写入到指针 (%s)" +msgstr "Action Replay 错误: æ— æ•ˆå¤§å° (%08x : åœ°å€ = %08x) 于 写入到指针 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" -msgstr "动作回放错误: 无效数值 (%08x) 于 内存å¤åˆ¶ (%s)" +msgstr "Action Replay 错误: 无效数值 (%08x) 于 内存å¤åˆ¶ (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" +"Action Replay 错误: 主代ç ä¸Žå†™å…¥åˆ° CCXXXXXX 尚未实现(%s)\n" +"ä¸éœ€è¦ä¸»ä»£ç ã€‚请ä¸è¦ä½¿ç”¨ä¸»ä»£ç ã€‚" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" -msgstr "动作回放错误: 无效动作回放代ç è¡Œ: %s" +msgstr "Action Replay 错误: 无效 AR 代ç è¡Œ: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" -msgstr "动作回放: æ¡ä»¶ä»£ç : æ— æ•ˆå¤§å° %08x (%s)" +msgstr "Action Replay: æ¡ä»¶ä»£ç : æ— æ•ˆå¤§å° %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" -msgstr "动作回放: 无效正常代ç ç±»åž‹ %08x (%s)" +msgstr "Action Replay: 无效正常代ç ç±»åž‹ %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" -msgstr "动作回放: æ­£å¸¸ä»£ç  %i: 无效å­ç±»åž‹ %08x (%s)" +msgstr "Action Replay: æ­£å¸¸ä»£ç  %i: 无效å­ç±»åž‹ %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" -msgstr "动作回放: æ­£å¸¸ä»£ç  0: 无效å­ç±»åž‹ %08x (%s)" +msgstr "Action Replay: æ­£å¸¸ä»£ç  0: 无效å­ç±»åž‹ %08x (%s)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:248 msgid "Adapter:" @@ -560,13 +567,13 @@ msgstr "适é…器:" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:63 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:63 msgid "Add" -msgstr "添加" +msgstr "加å·" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" -msgstr "添加动作回放代ç " +msgstr "添加 ActionReplay 代ç " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "添加补ä¸" @@ -574,9 +581,9 @@ msgstr "添加补ä¸" msgid "Add new pane" msgstr "添加新é¢æ¿" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "添加..." @@ -594,13 +601,13 @@ msgid "" "\n" "NOTE: Check LogWindow/Console for the acquired values." msgstr "" -"将指定值加到 zFar å‚数上。\n" +"将“远剪è£å¹³é¢â€ç§»åŠ¨æŒ‡å®šå€¼ã€‚\n" "有两ç§æ–¹æ³•è¡¨è¾¾æµ®ç‚¹æ•°å€¼ã€‚\n" "例如: 输入“200â€æˆ–直接输入“0.0002â€å°†äº§ç”ŸåŒæ ·çš„效果,系统都将æ•æ‰åˆ°" "值“0.0002â€ã€‚\n" -"值:(0->+/-整数)或(0->+/-浮点[6 ä½ç²¾åº¦])\n" +"值: (0->+/-æ•´æ•°) 或 (0->+/-浮点[6 ä½ç²¾åº¦])\n" "\n" -"注æ„:å¯åœ¨â€œæ—¥å¿—窗å£/控制å°â€ä¸­æŸ¥çœ‹ç³»ç»Ÿæ•æ‰å€¼ã€‚" +"注æ„: å¯åœ¨â€œæ—¥å¿—窗å£/控制å°â€ä¸­æŸ¥çœ‹ç³»ç»Ÿæ•æ‰å€¼ã€‚" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:40 msgid "" @@ -612,13 +619,13 @@ msgid "" "\n" "NOTE: Check LogWindow/Console for the acquired values." msgstr "" -"将指定值加到 zNear å‚数上。\n" +"将“近剪è£å¹³é¢â€ç§»åŠ¨æŒ‡å®šå€¼ã€‚\n" "有两ç§æ–¹æ³•è¡¨è¾¾æµ®ç‚¹æ•°å€¼ã€‚\n" "例如: 输入“200â€æˆ–直接输入“0.0002â€å°†äº§ç”ŸåŒæ ·çš„效果,系统都将æ•æ‰åˆ°" "值“0.0002â€ã€‚\n" -"值:(0->+/-整数)或(0->+/-浮点[6 ä½ç²¾åº¦])\n" +"值: (0->+/-æ•´æ•°) 或 (0->+/-浮点[6 ä½ç²¾åº¦])\n" "\n" -"注æ„:å¯åœ¨â€œæ—¥å¿—窗å£/控制å°â€ä¸­æŸ¥çœ‹ç³»ç»Ÿæ•æ‰å€¼ã€‚" +"注æ„: å¯åœ¨â€œæ—¥å¿—窗å£/控制å°â€ä¸­æŸ¥çœ‹ç³»ç»Ÿæ•æ‰å€¼ã€‚" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:808 msgid "Adjust the analog control pressure required to activate buttons." @@ -632,32 +639,32 @@ msgstr "高级" msgid "Advanced Settings" msgstr "高级设置" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -msgstr "所有 GC/Wii 文件 (elf, dol, gcm, iso, ciso, gcz, wad)" +msgstr "所有 GC/Wii 文件 (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" -msgstr "所有 GC/Wii é•œåƒ (gcm, iso, ciso, gcz)" +msgstr "所有 GC/Wii é•œåƒ (gcm, iso, wbfs, ciso, gcz)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "所有 Gamecube GCM 文件 (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "æ‰€æœ‰å­˜æ¡£çŠ¶æ€ (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "所有 Wii é•œåƒæ–‡ä»¶ (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "所有压缩的 GC/Wii é•œåƒæ–‡ä»¶ (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "所有文件 (*.*)|*.*" @@ -677,19 +684,19 @@ msgstr "å„å‘异性过滤:" msgid "Anti-Aliasing:" msgstr "抗锯齿:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "应用程åºè½½å…¥å™¨å¤§å°é”™è¯¯...这真是一个应用程åºè½½å…¥å™¨(apploader)?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "应用程åºè½½å…¥å™¨ä¸èƒ½ä»Žæ–‡ä»¶è½½å…¥" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "应用载入器:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "应用" @@ -699,8 +706,11 @@ msgid "" "\n" "If unsure, select (off)." msgstr "" +"完æˆå¸§åŽåº”用åŽå¤„ç†æ•ˆæžœã€‚\n" +"\n" +"如果没有把æ¡ï¼Œè¯·é€‰æ‹© (å…³)。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" msgstr "阿拉伯语" @@ -709,23 +719,28 @@ msgstr "阿拉伯语" msgid "Are you sure you want to delete \"%s\"?" msgstr "您确定è¦åˆ é™¤ \"%s\" ?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" msgstr "" -"请确认真的è¦åˆ é™¤è¿™äº›æ–‡ä»¶?\n" -"这将是永久性的删除!" +"您确定想è¦åˆ é™¤è¿™äº›æ–‡ä»¶?\n" +"它们将无法æ¢å¤!" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" -msgstr "您确定想è¦åˆ é™¤è¿™ä¸ªæ–‡ä»¶ï¼Ÿè¿™å°†æ˜¯æ°¸ä¹…性的删除ï¼" +msgstr "您确定想è¦åˆ é™¤æ­¤æ–‡ä»¶? 它将无法æ¢å¤!" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" -msgstr "Arm JIT(实验性)" +msgstr "Arm JIT (实验性)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#, fuzzy +msgid "Arm JITIL (experimental)" +msgstr "Arm JIT (实验性)" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "宽高比:" @@ -734,12 +749,12 @@ msgstr "宽高比:" msgid "At least one pane must remain open." msgstr "必须有一个窗å£ä¿æŒæ‰“å¼€" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "音频" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "音频åŽç«¯:" @@ -747,22 +762,22 @@ msgstr "音频åŽç«¯:" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon: 打开 AO 设备错误.\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "自动" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:346 msgid "Auto (Multiple of 640x528)" -msgstr "自动(640x528çš„å€æ•°ï¼‰" +msgstr "自动 (640x528 çš„å€æ•°)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:346 msgid "Auto (Window Size)" -msgstr "自动(窗å£å¤§å°ï¼‰" +msgstr "自动 (窗å£å¤§å°)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:306 msgid "Auto adjust Window Size" -msgstr "自动调节窗å£å¤§å°" +msgstr "自动调整窗å£å¤§å°" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:77 msgid "" @@ -770,7 +785,7 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"自动将窗å£å¤§å°è°ƒèŠ‚为内部分辨率。\n" +"自动将窗å£å¤§å°è°ƒæ•´ä¸ºå†…部分辨率。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -780,54 +795,54 @@ msgstr "B" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:765 msgid "BP register " -msgstr "" +msgstr "BP 寄存器" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:14 msgid "Back" -msgstr "Back" +msgstr "åŽ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "åŽç«¯è®¾ç½®" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" -msgstr "åŽç«¯ï¼š" +msgstr "åŽç«¯:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "åŽå°è¾“å…¥" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:267 msgid "Backward" -msgstr "Backward" +msgstr "åŽ" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "无效文件头" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:60 msgid "Balance Board" -msgstr "" +msgstr "平衡æ¿" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "标志" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "标志详细信æ¯" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "标志:" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:61 msgid "Bar" -msgstr "Bar" +msgstr "摇把" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:317 msgid "Basic" @@ -839,11 +854,11 @@ msgstr "基本设置" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp:26 msgid "Bass" -msgstr "Bass" +msgstr "低音" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" -msgstr "Block Allocation Table checksum failed" +msgstr "区å—分é…表校验失败" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:625 msgid "Blocks" @@ -862,7 +877,7 @@ msgid "Blue Right" msgstr "è“ å³" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "底部" @@ -871,27 +886,27 @@ msgstr "底部" msgid "Bound Controls: %lu" msgstr "绑定控制器: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "æŸå" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "æµè§ˆ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "æµè§ˆè¦æ·»åŠ çš„目录" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." -msgstr "æµè§ˆé•œåƒç›®å½•" +msgstr "æµè§ˆé•œåƒç›®å½•..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "æµè§ˆè¾“出目录" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "缓冲区:" @@ -901,11 +916,11 @@ msgstr "缓冲区:" msgid "Buttons" msgstr "按键" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." -msgstr "" +msgstr "绕过DCBZ指令对数æ®ç¼“存的清除。通常ä¸ä¼šå¯ç”¨æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:706 msgid "C" @@ -921,7 +936,7 @@ msgstr "C-摇æ†" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:774 msgid "CP reg" -msgstr "" +msgstr "CP 注册" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:554 msgid "CPU Emulator Engine" @@ -939,62 +954,62 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"é€ä¸ªåƒç´ è€Œéžé€ä¸ªé¡¶ç‚¹åœ°è®¡ç®—3D图åƒçš„照明。\n" -"在一定程度上é™ä½Žæ¨¡æ‹Ÿé€Ÿåº¦ï¼ˆå–决于您的GPU)。\n" +"é€ä¸ªåƒç´ è€Œéžé€ä¸ªé¡¶ç‚¹åœ°è®¡ç®— 3D 图åƒçš„照明。\n" +"在一定程度上é™ä½Žæ¨¡æ‹Ÿé€Ÿåº¦ (å–决于您的 GPU) 。\n" "该增强通常是安全的,但å¶å°”也会造æˆé—®é¢˜ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" -msgstr "" +msgstr "ä¸èƒ½æŒ‰ç…§è¿žæŽ¥å¥æŸ„ %02x 找到 Wii 控制器" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" -msgstr "" +msgstr "ä¸èƒ½ä»Ž DVDæ’件 - DVD接å£è¯»å–æ•°æ®: 严é‡é”™è¯¯" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "å–消" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" -msgstr "ä¸èƒ½æ‰“å¼€ %s" +msgstr "无法打开 %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "事件未决时ä¸èƒ½å注册事件" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" "%s\n" "is not a valid gamecube memory card file" msgstr "" -"ä¸èƒ½ä½œä¸ºå­˜å‚¨å¡ä½¿ç”¨è¯¥æ–‡ä»¶ã€‚\n" +"无法将该文件用作存储å¡ã€‚\n" "%s\n" "ä¸æ˜¯æœ‰æ•ˆçš„Gamecube存储å¡æ–‡ä»¶" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" msgstr "" -"Cannot use that file as a memory card.\n" -"Are you trying to use the same file in both slots?" +"无法将该文件用作存储å¡ã€‚\n" +"您是å¦è¯•å›¾åœ¨ä¸¤ä¸ªæ’槽中使用相åŒçš„文件?" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:39 msgid "Caps Lock" -msgstr "大写é”定" +msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" msgstr "加泰罗尼亚语" @@ -1002,11 +1017,11 @@ msgstr "加泰罗尼亚语" msgid "Center" msgstr "中心" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "切æ¢" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "切æ¢å…‰ç›˜(&D)..." @@ -1014,106 +1029,104 @@ msgstr "切æ¢å…‰ç›˜(&D)..." msgid "Change Disc" msgstr "切æ¢å…‰ç›˜" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "切æ¢æ¸¸æˆ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." msgstr "" -"修改用户界é¢è¯­è¨€.\n" -"需è¦é‡å¯." +"改å˜ç”¨æˆ·ç•Œé¢çš„语言。\n" +"需è¦é‡å¯ã€‚" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:47 msgid "Changes sign to zFar Parameter (after correction)" -msgstr "" +msgstr "改å˜â€œè¿œè£åˆ‡å¹³é¢â€å‚æ•°çš„ç¬¦å· (修正åŽ)" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:42 msgid "Changes sign to zNear Parameter (after correction)" -msgstr "" +msgstr "改å˜â€œè¿‘è£åˆ‡å¹³é¢â€å‚æ•°çš„ç¬¦å· (修正åŽ)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" -msgstr "模拟器正在è¿è¡Œæ—¶æ”¹åŠ¨å°†ä¸ä¼šç”Ÿæ•ˆï¼" +msgstr "模拟器正在è¿è¡Œæ—¶æ”¹åŠ¨å°†ä¸ä¼šç”Ÿæ•ˆ!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "èŠå¤©" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:34 msgid "Cheat Code" -msgstr "作弊ç " +msgstr "金手指" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" -msgstr "作弊ç æœç´¢" +msgstr "金手指æœç´¢" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "金手指管ç†" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "检查分区完整性" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." -msgstr "完整性检查中..." +msgstr "正在检查完整性..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "简体中文" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "ç¹ä½“中文" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 -msgid "Choose a DVD root directory:" -msgstr "选择一个DVD根目录" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +msgid "Choose a DVD root directory:" +msgstr "选择一个DVD根目录:" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" -msgstr "选择一个NAND根目录:" +msgstr "选择一个NAND根目录:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" -msgstr "选择一个默认镜åƒï¼š" +msgstr "选择一个默认镜åƒ:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "选择一个è¦æ·»åŠ çš„目录" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "选择è¦æ‰“开的文件" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:204 msgid "Choose a memory card:" -msgstr "选择一个存储å¡ï¼š" +msgstr "选择一个存储å¡:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" -msgstr "" -"Choose file to use as apploader: (applies to discs constructed from " -"directories only)" +msgstr "选择è¦ä½œä¸ºåº”用加载器的文件: (仅适用于由文件夹构æˆçš„光盘)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" -msgstr "选择解压缩到的文件夹" +msgstr "选择æå–目标文件夹" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:285 msgid "Circle Stick" -msgstr "Circle Stick" +msgstr "圆形æ†" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:56 msgid "Classic" -msgstr "ç»å…¸" +msgstr "传统控制器" #: Source/Core/DolphinWX/Src/LogWindow.cpp:137 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:30 @@ -1122,15 +1135,15 @@ msgstr "ç»å…¸" msgid "Clear" msgstr "清除" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." -msgstr "游æˆè¿è¡Œæ—¶ä¸Žå®¢æˆ·ç«¯è¿žæŽ¥æ–­å¼€ï¼ï¼NetPlayå·²ç¦ç”¨ã€‚您必须手动åœæ­¢æ¸¸æˆã€‚" +msgstr "游æˆè¿è¡ŒæœŸé—´å®¢æˆ·ç«¯æ–­å¼€è¿žæŽ¥!! NetPlay å·²ç¦ç”¨ã€‚您必须手动åœæ­¢æ¸¸æˆã€‚" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "关闭" @@ -1139,11 +1152,11 @@ msgstr "关闭" msgid "Co&nfigure..." msgstr "程åºè®¾ç½®(&N)..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "代ç ä¿¡æ¯" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "代ç :" @@ -1155,24 +1168,24 @@ msgstr "命令" msgid "Comment" msgstr "注释" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "注释:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "压缩镜åƒ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "压缩所选镜åƒ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" -msgstr "压缩镜åƒä¸­" +msgstr "正在压缩镜åƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "设置" @@ -1186,64 +1199,63 @@ msgstr "设置" msgid "Configure Control" msgstr "设置é¢æ¿" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "设置手柄" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "设置..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "确认文件覆盖" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:584 msgid "Confirm on Stop" -msgstr "åœæ­¢æ—¶ç¡®è®¤" +msgstr "åœæ­¢æ¸¸æˆæ—¶ç¡®è®¤" #: Source/Core/DolphinWX/Src/NetWindow.cpp:78 #: Source/Core/DolphinWX/Src/NetWindow.cpp:100 msgid "Connect" msgstr "连接" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "连接 USB 键盘" +msgstr "连接平衡æ¿" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "连接 USB 键盘" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" -msgstr "连接 Wiimote %i" +msgstr "连接 Wii 控制器 %i" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:184 msgid "Connect Wiimote 1" -msgstr "连接 Wiimote 1" +msgstr "连接 Wii 控制器 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:185 msgid "Connect Wiimote 2" -msgstr "连接 Wiimote 2" +msgstr "连接 Wii 控制器 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:186 msgid "Connect Wiimote 3" -msgstr "连接 Wiimote 3" +msgstr "连接 Wii 控制器 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:187 msgid "Connect Wiimote 4" -msgstr "连接 Wiimote 4" +msgstr "连接 Wii 控制器 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." -msgstr "连接中..." +msgstr "正在连接..." #: Source/Core/DolphinWX/Src/FrameAui.cpp:156 msgid "Console" @@ -1251,7 +1263,7 @@ msgstr "控制å°" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:88 msgid "Continuous Scanning" -msgstr "" +msgstr "æŒç»­æ‰«æ" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:33 msgid "Control" @@ -1261,7 +1273,7 @@ msgstr "控制" msgid "Convert to GCI" msgstr "转æ¢åˆ° GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "å¤åˆ¶å¤±è´¥" @@ -1270,47 +1282,34 @@ msgstr "å¤åˆ¶å¤±è´¥" msgid "Copy to Memcard %c" msgstr "å¤åˆ¶åˆ°å†…å­˜å¡ %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "核心" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "ä¸èƒ½åˆ›å»º %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." -msgstr "ä¸èƒ½åˆå§‹åŒ–åŽç«¯ %s" +msgstr "无法åˆå§‹åŒ–åŽç«¯ %s。" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " "backup. Please note that original Gamecube and Wii discs cannot be read by " "most PC DVD drives." msgstr "" -"ä¸èƒ½è¯»å–\"%s\"。驱动器里没有光盘或ä¸æ˜¯GC/Wii备份。请注æ„大多数PC DVD驱动器ä¸" -"能读å–原始的Gamecube与Wii光盘。" +"无法读å–\"%s\"。驱动器里没有光盘或ä¸æ˜¯ GC/Wii 备份。请注æ„多数 PC DVD 驱动器" +"ä¸èƒ½è¯»å–原始的 Gamecube 与 Wii 光盘。" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" -msgstr "ä¸èƒ½è¯†åˆ« ISO 文件 %s" +msgstr "无法识别镜åƒæ–‡ä»¶ %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" -msgstr "ä¸èƒ½ä¿å­˜ %s" - -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" +msgstr "无法ä¿å­˜ %s" #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format @@ -1324,38 +1323,38 @@ msgid "" "If so, then you may need to re-specify your memory card location in the " "options." msgstr "" -"无法写入存储å¡æ–‡ä»¶%s。\n" +"无法写入存储å¡æ–‡ä»¶ %s。\n" "\n" -"您是å¦æ­£åœ¨ä»ŽCD/DVD上è¿è¡ŒDolphin,或者存档文件是å¦å†™ä¿æŠ¤ï¼Ÿ\n" +"您是å¦æ­£åœ¨ä»Ž CD/DVD 上è¿è¡Œ Dolphin,或者存档文件是å¦å†™ä¿æŠ¤?\n" "\n" -"您是å¦æ˜¯åœ¨ç§»åŠ¨æ¨¡æ‹Ÿå™¨ç›®å½•åŽæ”¶åˆ°è¿™ä¸ªæ¶ˆæ¯ï¼Ÿ\n" -"如果这样,您å¯èƒ½éœ€è¦åœ¨é€‰é¡¹ä¸­é‡æ–°æŒ‡å®šæ‚¨çš„存储å¡ä½ç½®ã€‚" +"您是å¦æ˜¯åœ¨ç§»åŠ¨æ¨¡æ‹Ÿå™¨ç›®å½•åŽæ”¶åˆ°è¿™ä¸ªæ¶ˆæ¯?\n" +"如果是这样,您å¯èƒ½éœ€è¦åœ¨é€‰é¡¹ä¸­é‡æ–°æŒ‡å®šæ‚¨çš„存储å¡ä½ç½®ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" -msgstr "找ä¸åˆ°æ‰©å±•å'ini'的打开命令ï¼" +msgstr "找ä¸åˆ°æ‰©å±•å 'ini' 的打开命令!" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." msgstr "" -"ä¸èƒ½åˆå§‹åŒ–核心.\n" -"检查你的é…ç½®." +"无法åˆå§‹åŒ–核心。\n" +"请检查您的é…置。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "æ•°é‡:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "国家:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" -msgstr "创建动作回放代ç " +msgstr "创建 AR 代ç " #: Source/Core/DolphinWX/Src/FrameAui.cpp:569 #: Source/Core/DolphinWX/Src/FrameAui.cpp:641 @@ -1368,7 +1367,7 @@ msgstr "创建者:" #: Source/Core/Common/Src/MsgHandler.cpp:54 msgid "Critical" -msgstr "" +msgstr "错误" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:560 msgid "Crop" @@ -1380,19 +1379,19 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"将图åƒç”±4:3è£åˆ‡ä¸º5:4或由16:9è£åˆ‡ä¸º16:10。\n" +"将图åƒç”± 4:3 è£åˆ‡ä¸º 5:4 或由 16:9 è£åˆ‡ä¸º 16:10。\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:52 msgid "Crossfade" msgstr "淡入淡出" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" -msgstr "" +msgstr "ç»è¿‡ wxFileSelector 之åŽå½“å‰ç›®å½•ä»Ž %s 改å˜ä¸º %s!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "自定义投影修正" @@ -1400,11 +1399,11 @@ msgstr "自定义投影修正" msgid "Custom Projection Hack Settings" msgstr "自定义投影修正设置" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." -msgstr "自定义一些正交投影å‚æ•°" +msgstr "自定义一些正交投影å‚数。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "æ·å…‹è¯­" @@ -1416,63 +1415,63 @@ msgstr "D" msgid "D-Pad" msgstr "æ–¹å‘é”®" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "DSP音频" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "音频模拟引擎" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "音频 HLE 模拟(很快)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "音频 LLE 解释(很慢)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "音频 LLE é‡ç¼–译器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "在专门的线程上模拟DSP" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "音频设置" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "独立音频 LLE 线程" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD 根目录:" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:226 msgid "DVDLowRead - Fatal Error: failed to read from volume" -msgstr "DVDLowRead - 致命错误:读å–å·å¤±è´¥" +msgstr "DVDLowRead - 致命错误: 读å–å·å¤±è´¥" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:320 msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" -msgstr "DVDLowUnencryptedRead - 致命错误:读å–å·å¤±è´¥" +msgstr "DVDLowUnencryptedRead - 致命错误: 读å–å·å¤±è´¥" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" -msgstr "" +msgstr "跳舞毯" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "æ•°æ®å¤§å°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "日期:" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:518 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:557 msgid "Datel MaxDrive/Pro files(*.sav)" -msgstr "Datel MaxDrive/Pro files(*.sav)" +msgstr "Datel MaxDrive/Pro 文件(*.sav)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:230 #: Source/Core/InputCommon/Src/ControllerEmu.cpp:247 @@ -1492,31 +1491,30 @@ msgstr "调试" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:66 msgid "Decimal" -msgstr "å进制" +msgstr "å°æ•°ç‚¹" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "解压缩镜åƒ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "解压缩所选镜åƒ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" -msgstr "解压缩镜åƒä¸­" +msgstr "正在解压缩镜åƒ" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "刷新游æˆåˆ—表" +msgstr "å‡å°‘帧数é™åˆ¶" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "默认" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "默认镜åƒ:" @@ -1551,33 +1549,28 @@ msgstr "检测" msgid "" "Detected attempt to read more data from the DVD than fit inside the out " "buffer. Clamp." -msgstr "" -"Detected attempt to read more data from the DVD than fit inside the out " -"buffer. Clamp." +msgstr "检测到å°è¯•ä»ŽDVD读å–比åˆé€‚的输出缓冲区内更多的数æ®ã€‚堆存。" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:118 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:953 msgid "Device" msgstr "设备" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "设备设置" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:49 msgid "Dial" -msgstr "Dial" +msgstr "拨å·" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1592,7 +1585,7 @@ msgstr "ç¦ç”¨" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:501 msgid "Disable Destination Alpha" -msgstr "" +msgstr "ç¦ç”¨ç›®æ ‡ Alpha" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:410 msgid "Disable Fog" @@ -1606,9 +1599,9 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"ç¦ç”¨ä»»ä½•XFB模拟。\n" -"显著æ高模拟速度,但在模拟许多需è¦XFB的游æˆï¼ˆå°¤å…¶æ˜¯è‡ªåˆ¶åº”用)时会造æˆä¸¥é‡æ•…" -"障。\n" +"ç¦ç”¨ä»»ä½• XFB 模拟。\n" +"显著æé«˜æ¨¡æ‹Ÿé€Ÿåº¦ï¼Œä½†åœ¨æ¨¡æ‹Ÿè®¸å¤šéœ€è¦ XFB 的游æˆ\n" +"(尤其是自制应用) 时会造æˆä¸¥é‡æ•…障。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -1621,25 +1614,26 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"ç¦ç”¨å¯¹EFB副本的模拟。\n" -"åŽæœŸå¤„ç†æˆ–渲染到纹ç†æ•ˆæžœç»å¸¸ä¼šä½¿ç”¨åˆ°è¿™äº›å‰¯æœ¬ï¼Œå› æ­¤å‹¾é€‰æ­¤é¡¹è™½ç„¶ä¼šå¸¦æ¥å¾ˆå¤§çš„æ" -"速但几乎总是会造æˆé—®é¢˜ã€‚\n" +"ç¦ç”¨å¯¹ EFB 副本的模拟。\n" +"åŽæœŸå¤„ç†æˆ–渲染到纹ç†æ•ˆæžœç»å¸¸ä¼šä½¿ç”¨åˆ°è¿™äº›å‰¯æœ¬ï¼Œ\n" +"因此勾选此项虽然会带æ¥å¾ˆå¤§çš„æ速但几乎总是会\n" +"造æˆé—®é¢˜ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:102 -#, fuzzy msgid "" "Disables emulation of a hardware feature called destination alpha, which is " "used in many games for various graphical effects.\n" "\n" "If unsure, leave this unchecked." msgstr "" -"忽略目标的Alpha通é“,许多游æˆä½¿ç”¨è¯¥é€šé“产生多ç§å›¾åƒæ•ˆæžœã€‚\n" +"ç¦ç”¨å¯¹å为目标 Alpha 的硬件功能的模拟,许多游æˆ\n" +"使用该功能产生多ç§å›¾åƒæ•ˆæžœã€‚\n" "\n" -"如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" +"如果ä¸èƒ½ç¡®å®šï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "光盘" @@ -1664,26 +1658,90 @@ msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:67 msgid "Divide" -msgstr "Divide" +msgstr "除å·" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "您确定是å¦åœæ­¢å½“å‰æ¨¡æ‹Ÿ?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "æœæ¯”定å‘逻辑II解ç å™¨" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, fuzzy, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin 团队\n" +"\n" +"分支: %s\n" +"修订å·: %s\n" +"编译于: %s @ %s\n" +"\n" +"Dolphin 是一款 Gamecube/Wii 模拟器,其原作者为\n" +"F|RES å’Œ ector。\n" +"现在 Dolphin 是一个开æºé¡¹ç›®ï¼Œè´¡çŒ®è€…之多ä¸èƒœæžšä¸¾ã€‚\n" +"如果对本项目感兴趣,欢迎到我们的项目页é¢äº†è§£è¯¦æƒ…\n" +"http://code.google.com/p/dolphin-emu/。\n" +"\n" +"特别感谢 Bushing, Costis, CrowTRobo, Marcan,\n" +"Segher, Titanik, or9 与 Hotquik 所åšçš„åå‘工程与\n" +"文档/演示。\n" +"\n" +"éžå¸¸æ„Ÿè°¢ Gilles Mouchard,其 Microlib PPC 模拟器\n" +"为我们的开å‘æ供了最åˆæŽ¨åŠ¨åŠ›ã€‚\n" +"\n" +"æ„Ÿè°¢ Frank Wille çš„ PowerPC å汇编程åºï¼Œor9 与我们\n" +"将其修改加入了 Gekko 特性。\n" +"\n" +"æ„Ÿè°¢ hcs/destop çš„ GC ADPCM 解ç å™¨ã€‚\n" +"\n" +"我们与任天堂没有任何形å¼çš„关系。Gamecube å’Œ Wii\n" +"是任天堂的商标。\n" +"本模拟器仅作为教育用途,ä¸å¾—用于è¿è¡Œæ‚¨éžæ³•æ‹¥æœ‰çš„游\n" +"æˆã€‚" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s 图形设置" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin 网站(&W)" @@ -1693,57 +1751,56 @@ msgstr "Dolphin é…ç½®" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:197 msgid "Dolphin Emulated Wiimote Configuration" -msgstr "Dolphin模拟Wiié¥æŽ§å™¨é…ç½®" +msgstr "Dolphin 模拟 Wii 控制器é…ç½®" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:382 msgid "Dolphin FIFO" msgstr "Dolphin FIFO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" -msgstr "Dolphin GC手柄设置" +msgstr "Dolphin GC 手柄设置" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS 电影 (*.dtm)" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:8 msgid "Dolphin Wiimote Configuration" -msgstr "Dolphin Wiié¥æŽ§å™¨é…ç½®" +msgstr "Dolphin Wii 控制器é…ç½®" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" -msgstr "Google Code上的Dolphin(&G)" +msgstr "&Google Code 上的 Dolphin" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." -msgstr "Dolphin ä¸èƒ½æ‰¾åˆ°ä»»ä½• GC/Wii é•œåƒ. åŒå‡»è¿™é‡Œæµè§ˆæ–‡ä»¶..." +msgstr "Dolphin ä¸èƒ½æ‰¾åˆ°ä»»ä½• GC/Wii é•œåƒã€‚åŒå‡»è¿™é‡Œæµè§ˆæ–‡ä»¶..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." -msgstr "Dolphin 当å‰è®¾ç½®äº†éšè—所有游æˆ. åŒå‡»è¿™é‡Œæ˜¾ç¤ºæ‰€æœ‰æ¸¸æˆ..." +msgstr "Dolphin 当å‰è®¾ç½®ä¸ºéšè—所有游æˆã€‚åŒå‡»è¿™é‡Œæ˜¾ç¤ºæ‰€æœ‰æ¸¸æˆ..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "Dolphin未能完æˆè¯·æ±‚çš„æ“作。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" -msgstr "å¯ç”¨å¿«é€Ÿå…‰ç›˜è®¿é—®. 部分游æˆéœ€è¦. (ON = 快速, OFF = 兼容)" +msgstr "加å€æ¨¡æ‹ŸGPU的时钟频率。将会æ高一些游æˆçš„速度 (å¼€ = 快速,关 = 兼容)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 msgid "Down" -msgstr "下" +msgstr "å‘下键" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:45 msgid "Download Codes (WiiRD Database)" @@ -1756,13 +1813,13 @@ msgstr "已下载 %lu 代ç (已添加 %lu)" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp:35 msgid "Drums" -msgstr "鼓" +msgstr "鼓 (太鼓达人)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "虚拟" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "转储音频" @@ -1772,7 +1829,7 @@ msgstr "转储 EFB 目标" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:544 msgid "Dump Frames" -msgstr "转储框架" +msgstr "转储帧" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:541 msgid "Dump Textures" @@ -1784,7 +1841,8 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"将所有渲染的帧转储为User/Dump/Frames/目录中的一个AVI文件。\n" +"将所有渲染的帧转储至 User/Dump/Frames/ 目录中\n" +"的一个AVI 文件。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -1794,7 +1852,8 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"将解ç çš„游æˆæ质转储到User/Dump/Textures/<æ¸¸æˆ ID>/目录中。\n" +"将解ç çš„游æˆæ质转储到\n" +"User/Dump/Textures/<æ¸¸æˆ ID>/ 目录中。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -1804,13 +1863,14 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"å°†EFB副本的内容转储到User/Dump/Textures/目录中。\n" +"å°† EFB 副本的内容转储到 User/Dump/Textures/\n" +"目录中。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "è·å…°è¯­" @@ -1820,7 +1880,7 @@ msgstr "退出模拟(&X)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:442 msgid "EFB Copies" -msgstr "EFB副本" +msgstr "EFB 副本" #: Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp:210 #, c-format @@ -1830,26 +1890,26 @@ msgid "" "reboot is probably required at this point to get Windows to see the new " "driver." msgstr "" -"错误:此版本的Dolphin需è¦%d.%d或更高版本的TAP-Win32驱动——如果您刚刚å‡çº§æ‚¨çš„" +"错误: 此版本的Dolphin需è¦%d.%d或更高版本的TAP-Win32驱动——如果您刚刚å‡çº§æ‚¨çš„" "Dolphin,或许您现在需è¦é‡æ–°å¯åŠ¨æ‚¨çš„计算机以使Windows加载新驱动。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "欧版" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:143 msgid "Early Memory Updates" -msgstr "" +msgstr "内存æå‰æ›´æ–°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "编辑" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.h:17 msgid "Edit ActionReplay Code" -msgstr "编辑动作回放代ç " +msgstr "编辑 ActionReplay 代ç " -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "编辑设置" @@ -1857,12 +1917,12 @@ msgstr "编辑设置" msgid "Edit Patch" msgstr "编辑补ä¸" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" -msgstr "编辑当å‰å¤–观" +msgstr "编辑当å‰å¸ƒå±€" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "编辑..." @@ -1874,7 +1934,7 @@ msgstr "效果" msgid "Embedded Frame Buffer" msgstr "嵌入å¼å¸§ç¼“冲 (EFB)" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "模拟线程已ç»åœ¨è¿è¡Œ" @@ -1886,11 +1946,11 @@ msgid "" "\n" "If unsure, check virtual XFB emulation instead." msgstr "" -"精确地模拟XFB。\n" -"这会严é‡é™ä½Žæ¨¡æ‹Ÿé€Ÿåº¦å¹¶ä¼šç¦ç”¨é«˜åˆ†è¾¨çŽ‡æ¸²æŸ“,但对于正确模拟一些游æˆæ¥è¯´æ˜¯å¿…è¦" -"的。\n" +"精确地模拟 XFB。\n" +"这会严é‡é™ä½Žæ¨¡æ‹Ÿé€Ÿåº¦å¹¶ä¼šç¦ç”¨é«˜åˆ†è¾¨çŽ‡æ¸²æŸ“,但\n" +"对于正确模拟一些游æˆæ¥è¯´æ˜¯å¿…è¦çš„。\n" "\n" -"如果没有把æ¡ï¼Œè¯·å‹¾é€‰è™šæ‹ŸXFB模拟。" +"如果没有把æ¡ï¼Œè¯·å‹¾é€‰è™šæ‹Ÿ XFB 模拟。" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:110 msgid "" @@ -1901,17 +1961,18 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"使用GPUæ质对象模拟XFB。\n" -"修正许多ä¸ä½¿ç”¨XFB模拟将会出现错误的游æˆï¼ŒåŒæ—¶ä¸åƒçœŸå®žXFB模拟那样慢。但在模拟" -"其余很多游æˆ(尤其是自制应用)æ—¶ä»ç„¶ä¼šäº§ç”Ÿé”™è¯¯ã€‚\n" +"使用 GPU æ质对象模拟 XFB。\n" +"修正许多ä¸ä½¿ç”¨ XFB 模拟将会出现错误的游æˆï¼ŒåŒæ—¶\n" +"ä¸åƒçœŸå®ž XFB 模拟那样慢。但在模拟其余很多游æˆ\n" +"(尤其是自制应用) æ—¶ä»ç„¶ä¼šäº§ç”Ÿé”™è¯¯ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Emulated Wiimote" -msgstr "模拟Wiié¥æŽ§å™¨" +msgstr "模拟 Wii 控制器" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "模拟器状æ€: " @@ -1928,23 +1989,24 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"借助英伟达3D Vision技术(如果您的GPU支æŒ)实现3D效果。\n" +"借助英伟达 3D Vision 技术 (如果您的 GPU 支æŒ)\n" +"实现3D效果。\n" "有å¯èƒ½é€ æˆé”™è¯¯ã€‚\n" "需è¦å¯ç”¨å…¨å±ä»¥ç”Ÿæ•ˆã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" -msgstr "å¯ç”¨åŠ¨ä½œå›žæ”¾è®°å½•" +msgstr "å¯ç”¨AR记录" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "å¯ç”¨åŒºå—åˆå¹¶" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" -msgstr "" +msgstr "å¯ç”¨è¾¹ç•Œæ¡†è®¡ç®—" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:447 msgid "Enable Cache" @@ -1952,25 +2014,25 @@ msgstr "å¯ç”¨ç¼“å­˜" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:549 msgid "Enable Cheats" -msgstr "å¯ç”¨ä½œå¼Š" +msgstr "å¯ç”¨é‡‘手指" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" -msgstr "å¯ç”¨å¤šæ ¸å¤„ç†" +msgstr "å¯ç”¨åŒæ ¸å¿ƒ" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:547 msgid "Enable Dual Core (speedup)" -msgstr "å¯ç”¨å¤šæ ¸å¤„ç†(加速)" +msgstr "å¯ç”¨åŒæ ¸å¿ƒ (加速)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "å¯ç”¨ç©ºé—²æ­¥è¿›" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:548 msgid "Enable Idle Skipping (speedup)" -msgstr "å¯ç”¨ç©ºé—²æ­¥è¿›(加速)" +msgstr "å¯ç”¨ç©ºé—²æ­¥è¿› (加速)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "å¯ç”¨ MMU" @@ -1978,15 +2040,15 @@ msgstr "å¯ç”¨ MMU" msgid "Enable Progressive Scan" msgstr "å¯ç”¨é€è¡Œæ‰«æ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" -msgstr "" +msgstr "å…许å±å¹•ä¿æŠ¤ç¨‹åº" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:92 msgid "Enable Speaker Data" -msgstr "" +msgstr "å¯ç”¨æ‰¬å£°å™¨" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "å¯ç”¨å®½å±" @@ -2008,15 +2070,15 @@ msgstr "" "\n" "如果没有把æ¡ï¼Œè¯·é€‰æ‹©1x。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" -msgstr "å¯ç”¨å¿«é€Ÿå…‰ç›˜è®¿é—®. 部分游æˆéœ€è¦. (ON = 快速, OFF = 兼容)" +msgstr "å¯ç”¨å¿«é€Ÿå…‰ç›˜è®¿é—®ã€‚部分游æˆéœ€è¦ã€‚(å¼€ = 快速,关 = 兼容)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:803 msgid "Enable pages" -msgstr "Enable pages" +msgstr "å¯ç”¨é¡µé¢" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:76 msgid "" @@ -2037,39 +2099,32 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"å¯ç”¨æ­¤é¡¹ä»¥ä½¿ç”¨Dolphin主窗å£è€Œéžå•ç‹¬çš„渲染窗å£è¿›è¡Œæ¸²æŸ“。\n" +"å¯ç”¨æ­¤é¡¹ä»¥ä½¿ç”¨ Dolphin 主窗å£è€Œéžå•ç‹¬çš„渲染窗å£\n" +"进行渲染。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "å¯ç”¨æ­¤é¡¹ä»¥æ速《塞尔达传说:黄æ˜å…¬ä¸»ã€‹ã€‚è¿è¡Œä»»ä½•å…¶å®ƒæ¸¸æˆæ—¶è¯·ç¦ç”¨æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "å¯ç”¨è‡ªå®šä¹‰æŠ•å½±ä¿®æ­£" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "å¯ç”¨æœæ¯”定å‘逻辑II模拟5.1环绕声。ä¸é€‚用于OSX。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "å¯ç”¨æœæ¯”定å‘逻辑II模拟5.1环绕声。仅适用于OpenALåŽç«¯ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." -msgstr "" -"å¯ç”¨æœæ¯”定å‘逻辑II模拟5.1环绕声。仅适用于OpenALåŽç«¯ã€‚å¯èƒ½éœ€è¦å°†soft_oal.dllé‡" -"命å为OpenAL32.dll以生效。" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 msgid "" "Enables progressive scan if supported by the emulated software.\n" @@ -2077,16 +2132,16 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"å¯ç”¨é€è¡Œæ‰«æ(如果被模拟的软件支æŒ)。\n" +"å¯ç”¨é€è¡Œæ‰«æ (如果被模拟的软件支æŒ)。\n" "å¯ç”¨ä¸Žå¦å¯¹å¤šæ•°æ¸¸æˆæ²¡æœ‰å½±å“。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" -msgstr "å¯ç”¨å†…存管ç†å•å…ƒ,一些游æˆéœ€è¦(ON = 兼容,OFF = 快速)" +msgstr "å¯ç”¨å†…存管ç†å•å…ƒã€‚一些游æˆéœ€è¦ (å¼€ = 兼容,关 = 快速)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:117 msgid "" @@ -2102,9 +2157,9 @@ msgstr "" msgid "End" msgstr "End" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "英语" @@ -2115,7 +2170,7 @@ msgstr "增强" #: Source/Core/DolphinWX/Src/FrameAui.cpp:640 msgid "Enter a name for the new perspective:" -msgstr "为新视角输入一个åå­—:" +msgstr "为新布局输入一个åå­—:" #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:178 #, c-format @@ -2127,21 +2182,20 @@ msgstr "æ¡ç›® %d/%d" msgid "Entry 1/%d" msgstr "æ¡ç›® 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "等于" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "错误" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "加载选定语言错误。正在退回系统默认。" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2164,28 +2218,31 @@ msgstr "Escape" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:30 msgid "Euphoria" -msgstr "Euphoria" +msgstr "欢快" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" -msgstr "Exception handler - access below memory space. %08llx%08llx" +msgstr "异常处ç†ç¨‹åº - 访问下é¢çš„存储空间。 %08llx%08llx" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:48 msgid "Execute" msgstr "执行" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" -msgstr "" +msgstr "退出" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "导出所有 Wii 存档" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "导出失败" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "导出文件" @@ -2193,7 +2250,7 @@ msgstr "导出文件" msgid "Export Recording" msgstr "导出录制" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "导出录制..." @@ -2201,7 +2258,7 @@ msgstr "导出录制..." msgid "Export Save" msgstr "导出存档" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "导出 Wii 存档 (实验性)" @@ -2209,15 +2266,15 @@ msgstr "导出 Wii 存档 (实验性)" msgid "Export all saves" msgstr "导出所有存档" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "导出失败,需è¦é‡è¯•å—?" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "导出失败" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "导出存档为..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "扩展" @@ -2233,76 +2290,80 @@ msgstr "外部å‚æ•°" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "仅用于《银河战士:å¦ä¸€ä¸ªM》的é¢å¤–å‚数。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "æå–所有文件..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." -msgstr "æå– Apploader..." +msgstr "æå–应用加载器..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "æå– DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "æå–目录..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "æå–文件..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "æå–分区..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "正在æå– %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" -msgstr "æå–所有文件中" +msgstr "正在æå–所有文件" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" -msgstr "æå–目录中" +msgstr "正在æå–目录" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." -msgstr "æå–中..." +msgstr "正在æå–..." #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:904 msgid "FIFO Byte" -msgstr "" +msgstr "FIFO 字节" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:32 msgid "FIFO Player" -msgstr "" +msgstr "FIFO 回放器" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "法国" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST 大å°:" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "连接失败!" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:305 msgid "Failed to download codes." -msgstr "下载代ç å¤±è´¥." +msgstr "下载代ç å¤±è´¥ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "æå–到 %s 失败!" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2315,13 +2376,14 @@ msgid "" "You may use the DSP HLE engine which does not require ROM dumps.\n" "(Choose it from the \"Audio\" tab of the configuration dialog.)" msgstr "" -"加载DSP ROM:»%s失败\n" -"DSP LLE需è¦æ­¤æ–‡ä»¶ã€‚\n" -"此文件å«æœ‰å—版æƒä¿æŠ¤çš„æ•°æ®ï¼Œå› æ­¤ä¸åŒ…å«åœ¨Dolphin中。\n" -"å¯ä½¿ç”¨DSPSpy从您的游æˆä¸»æœºä¸­è½¬å‚¨æ­¤æ–‡ä»¶ã€‚\n" +"无法载入 DSP ROM:\t%s\n" "\n" -"您å¯ä»¥ä½¿ç”¨ä¸éœ€è¦ROM转储的DSP HLE引擎。\n" -"(该选项ä½äºŽé…置对è¯æ¡†çš„“音频â€é€‰é¡¹å¡)" +"使用 DSP LLE 需è¦æ­¤æ–‡ä»¶ã€‚\n" +"该文件由于包å«å—版æƒä¿æŠ¤çš„æ•°æ®å› è€ŒæœªåŒ…å«åœ¨ Dolphin 中。\n" +"请使用 DSPSpy 从您的真实主机中转储此文件。\n" +"\n" +"您å¯ä»¥ä½¿ç”¨ä¸éœ€è¦ ROM 转储的 DSP HLE 引擎。\n" +"(在设置对è¯æ¡†çš„“音频â€é€‰é¡¹å¡ä¸­è¿›è¡Œé€‰æ‹©ã€‚)" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:108 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:131 @@ -2329,6 +2391,8 @@ msgid "" "Failed to load bthprops.cpl! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"载入 bthprops.cpl 失败! 将无法连接真实 Wii 控制器并且 Dolphin å¯èƒ½å‡ºä¹Žæ„料地" +"崩溃!" #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:90 #: Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp:101 @@ -2336,108 +2400,114 @@ msgid "" "Failed to load hid.dll! Connecting real Wiimotes won't work and Dolphin " "might crash unexpectedly!" msgstr "" +"载入 hid.dll 失败! 将无法连接真实 Wii 控制器并且 Dolphin å¯èƒ½å‡ºä¹Žæ„料地崩溃!" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "è¯»å– %s 失败" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "è¯»å– banner.bin 失败" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" -msgstr "" +msgstr "读å–bk头失败" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" "Memcard may be truncated\n" "FilePosition:%llx" msgstr "" -"读å–存档中的区å—%d失败\n" -"记忆å¡å¯èƒ½è¢«æˆªæ–­\n" +"无法读å–å­˜æ¡£ä¸­çš„åŒºå— %d\n" +"存储å¡å¯èƒ½è¢«æˆªæ–­\n" "文件ä½ç½®:%llx" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" msgstr "" -"未能正确读å–区å—分é…表备份\n" +"无法正确读å–区å—分é…表备份\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" msgstr "" -"未能正确读å–区å—分é…表\n" +"无法正确读å–区å—分é…表\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "从文件 %d 读å–æ•°æ®å¤±è´¥" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" -msgstr "" +msgstr "从文件读å–æ•°æ®å¤±è´¥: %s" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" msgstr "" -"Failed to read directory backup correctly\n" +"无法正确读å–目录备份\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" msgstr "" -"正确的读å–目录失败\n" +"无法正确地读å–目录\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" -msgstr "" +msgstr "读å–头部失败" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" msgstr "" -"正确的读å–头失败\n" -"(0x000-0x1FFF)" +"无法正确地读å–标头\n" +"(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "æ— æ³•è¯»å– %d 的文件头" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" -msgstr "Failed to read unique ID from disc image" +msgstr "无法从光盘镜åƒè¯»å–独立 ID" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" -msgstr "Failed to write BT.DINF to SYSCONF" +msgstr "无法将 BT.DINF 写入 SYSCONF" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" -msgstr "Failed to write bkhdr" +msgstr "无法写入 bkhdr" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "无法å‘文件 %s 写入数æ®" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "写入文件头到 %s 失败" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "写入文件头失败 %d" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" msgstr "波斯语" @@ -2447,21 +2517,22 @@ msgstr "快速" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:504 msgid "Fast Depth Calculation" -msgstr "" +msgstr "快速深度计算" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." -msgstr "MMU快速版本。 ä¸æ˜¯å¯¹æ‰€æœ‰æ¸¸æˆéƒ½æœ‰æ•ˆã€‚" +msgstr "MMU快速版本。ä¸æ˜¯å¯¹æ‰€æœ‰æ¸¸æˆéƒ½æœ‰æ•ˆã€‚" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" -msgstr "致命的ä¸åŒæ­¥ã€‚回放中止。(Error in PlayWiimote: %u != %u, byte %u.)%s" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 -msgid "Fifo Player" msgstr "" +"致命的ä¸åŒæ­¥ã€‚回放中止。(在PlayWiimote中å‘生错误: %u != %u, byte %u.)%s" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 +msgid "Fifo Player" +msgstr "Fifo 回放器" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:86 msgid "File Info" @@ -2469,7 +2540,7 @@ msgstr "文件信æ¯" #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:300 msgid "File contained no codes." -msgstr "文件未包å«ä»£ç ." +msgstr "文件未包å«ä»£ç ã€‚" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:400 msgid "File converted to .gci" @@ -2483,7 +2554,7 @@ msgstr "" "文件无法打开\n" "或没有有效的扩展å" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2496,20 +2567,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "文件ä¸èƒ½è¢«è¯†åˆ«æˆå†…å­˜å¡" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" -msgstr "文件ä¸æ˜¯å·²åŽ‹ç¼©æ–‡ä»¶" +msgstr "文件未压缩" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO: æœªçŸ¥æ‰“å¼€æ¨¡å¼ : 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "文件系统" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "文件类型 'ini' 未知! ä¸èƒ½æ‰“å¼€!" @@ -2527,7 +2598,7 @@ msgstr "第一个区å—" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:799 msgid "Fix Checksums" -msgstr "修正校检和" +msgstr "修正校验和" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Force 16:9" @@ -2539,7 +2610,7 @@ msgstr "强制 4:3" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:555 msgid "Force Console as NTSC-J" -msgstr "" +msgstr "强制使用NTSC-J" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:407 msgid "Force Texture Filtering" @@ -2552,7 +2623,7 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"强制使用纹ç†è¿‡æ»¤(å³ä½¿è¢«æ¨¡æ‹Ÿæ¸¸æˆæ˜Žç¡®ç¦ç”¨å®ƒ)。\n" +"强制使用纹ç†è¿‡æ»¤ (å³ä½¿è¢«æ¨¡æ‹Ÿæ¸¸æˆæ˜Žç¡®ç¦ç”¨å®ƒ)。\n" "略微æ高纹ç†è´¨é‡ä½†åœ¨ä¸€äº›æ¸¸æˆä¸­ä¼šé€ æˆæ•…障。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -2569,46 +2640,54 @@ msgstr "" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" +"å¯ç”¨NTSC-J模å¼åŽä»»ä½•è¯­è¨€çš„游æˆéƒ½å°†ä¼šä½¿ç”¨æ—¥ç‰ˆä¸­çš„字体。\n" +"建议ä¸è¦å‹¾é€‰æ­¤é¡¹ï¼ŒDolphin默认使用NTSC-U模å¼ï¼Œå½“è¿è¡Œæ—¥ç‰ˆæ¸¸æˆæ—¶è¿™ä¸ªè®¾ç½®ä¼šè‡ªåŠ¨å¼€" +"å¯ã€‚" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" msgstr "" -"Format as ascii (NTSC\\PAL)?\n" -"Choose no for sjis (NTSC-J)" +"使用ASCIIæ ¼å¼ (NTSC\\PAL)?\n" +"选择“å¦â€å°†ä½¿ç”¨Shift- (NTSC-J)" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:266 msgid "Forward" -msgstr "Forward" +msgstr "å‰" #: Source/Core/DolphinWX/Src/NetWindow.cpp:157 msgid "Forward port (UPnP)" -msgstr "" +msgstr "转å‘端å£(UPnP)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:501 #, c-format msgid "Found %d results for '" msgstr "找到了 'çš„%d个结果" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "找到 %x 存档文件" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" -msgstr "" +msgstr "帧" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:879 msgid "Frame " -msgstr "" +msgstr "帧" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:173 msgid "Frame Advance" -msgstr "Frame Advance" +msgstr "帧数步进" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:547 msgid "Frame Dumps use FFV1" @@ -2638,22 +2717,22 @@ msgstr "录制帧数" msgid "Free Look" msgstr "自由视点" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "法语" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:42 msgid "Frets" -msgstr "Frets" +msgstr "å“ä¸" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:105 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:124 msgid "From" msgstr "从" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "å…¨å±" @@ -2665,7 +2744,7 @@ msgstr "å…¨å±åˆ†è¾¨çŽ‡:" msgid "GCI File(*.gci)" msgstr "GCI 文件(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC手柄" @@ -2673,27 +2752,27 @@ msgstr "GC手柄" msgid "GX_CMD_INVL_VC" msgstr "GX_CMD_INVL_VC" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "æ¸¸æˆ ID:" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "游æˆå·²ç»è¿è¡Œ!" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "游æˆæ²¡æœ‰è¿è¡Œ!" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" -msgstr "游æˆæ²¡æœ‰æ‰¾åˆ°ï¼" +msgstr "游æˆæ²¡æœ‰æ‰¾åˆ°!" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" -msgstr "游æˆç‰¹æ®Šè®¾ç½®" +msgstr "特定游æˆè®¾ç½®" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "游æˆé…ç½®" @@ -2710,20 +2789,20 @@ msgid "Gamecube &Pad Settings" msgstr "Gamecube 手柄设置(&P)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Gamecube å†…å­˜å¡ (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Gamecube 手柄设置" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko 代ç " -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2731,6 +2810,9 @@ msgid "" "native code handler by placing the codehandler.bin file into the Sys " "directory and restarting Dolphin.)" msgstr "" +"Geckoç æ— æ³•è¿è¡Œ (CT%i CST%i) (%s)\n" +"(代ç æ— æ•ˆæˆ–ä¸æ”¯æŒè¯¥ç±»åž‹ã€‚请将codehandler.bin文件放到Sys目录下并é‡å¯æ¨¡æ‹Ÿå™¨ï¼Œå°" +"试使用原生代ç ã€‚)" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:160 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:538 @@ -2742,26 +2824,26 @@ msgstr "常规" msgid "General Settings" msgstr "常规设置" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "德语" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" -msgstr "GetARCode: Index is greater than ar code list size %lu" +msgstr "GetARCode: 索引大于 AR ç åˆ—è¡¨å¤§å° %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "图形" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "图形设置" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "大于" @@ -2777,11 +2859,11 @@ msgid "" msgstr "" "显著æ高渲染到纹ç†æ•ˆæžœæ‰€ç”Ÿæˆçº¹ç†çš„è´¨é‡ã€‚\n" "æ高内部分辨率将增强此选项的效果。\n" -"轻微é™ä½Žæ€§èƒ½å¹¶æœ‰å¯èƒ½äº§ç”Ÿé—®é¢˜(虽然å¯èƒ½æ€§ä¸å¤§)。\n" +"轻微é™ä½Žæ€§èƒ½å¹¶æœ‰å¯èƒ½äº§ç”Ÿé—®é¢˜ (虽然å¯èƒ½æ€§ä¸å¤§)。\n" "\n" "如果没有把æ¡ï¼Œè¯·å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "希腊语" @@ -2799,17 +2881,17 @@ msgstr "绿 å³" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:39 msgid "Guitar" -msgstr "å‰å®ƒ" +msgstr "å‰ä»– (å‰ä»–英雄)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:432 msgid "Hacks" -msgstr "" +msgstr "修正" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "头部校检失败" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "希伯æ¥è¯­" @@ -2821,7 +2903,7 @@ msgstr "高度" msgid "Help" msgstr "帮助" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2832,8 +2914,16 @@ msgid "" "\n" "Sayonara!\n" msgstr "" +"对ä¸èµ·ï¼Œ\n" +"\n" +"Dolphin éœ€è¦ Mac OS X 10.7 或更高版本。\n" +"但是你è¿è¡Œçš„是较早版本的系统。\n" +"æ”¯æŒ OS X 10.6 çš„ Dolphin 最新版本为 3.5\n" +"请å‡çº§è‡³ 10.7 或更高æ¥ä½¿ç”¨æœ€æ–°ç‰ˆ Dolphin。\n" +"\n" +"感谢您的使用ï¼\n" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2842,12 +2932,12 @@ msgid "" "\n" "Sayonara!\n" msgstr "" -"Hi,\n" +"对ä¸èµ·ï¼Œ\n" "\n" -"Dolphin 需è¦æ‚¨çš„ CPU æ”¯æŒ SSE2 指令集.\n" -"但是好åƒæ‚¨çš„ CPU 并ä¸æ”¯æŒ, å› æ­¤ Dolphin å°†ä¸èƒ½è¿è¡Œ.\n" +"Dolphin 需è¦æ‚¨çš„ CPU æ”¯æŒ SSE2 指令集。\n" +"但是好åƒæ‚¨çš„ CPU 并ä¸æ”¯æŒï¼Œå› æ­¤ Dolphin å°†ä¸èƒ½è¿è¡Œã€‚\n" "\n" -"æ€å‘¦å•¦å•¦(å†è§)!\n" +"感谢您的使用ï¼\n" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:297 msgid "Hide" @@ -2885,57 +2975,60 @@ msgstr "热键设置" msgid "Hotkeys" msgstr "热键" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "匈牙利语" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Hybrid Wiimote" -msgstr "æ··åˆWiié¥æŽ§å™¨" +msgstr "æ··åˆ Wii 控制器" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" -msgstr "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" +msgstr "IOCTL_ES_GETVIEWS: 试图从一个未知的ticket(标签)获å–æ•°æ®: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 -#, c-format +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 +#, fuzzy, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" +"IOCTL_ES_LAUNCH: 游æˆè¯•å›¾é‡æ–°åŠ è½½ä¸€ä¸ªåœ¨ NAND 转储中无效的 IOS 或标题。\n" +"标题ID %016llx。\n" +"Dolphin 现在å¯èƒ½ä¼šä¸­æ­¢ã€‚" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" -msgstr "IOCTL_ES_READCONTENT - bad destination" +msgstr "IOCTL_ES_READCONTENT - æŸå的目标" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL 设置" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "红外线" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:25 msgid "IR Pointer" -msgstr "IR 指针" +msgstr "红外线指针" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:111 msgid "IR Sensitivity:" msgstr "红外çµæ•åº¦:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "é•œåƒè¯¦ç»†ä¿¡æ¯" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "é•œåƒç›®å½•" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "æ„大利" @@ -2943,11 +3036,11 @@ msgstr "æ„大利" msgid "Icon" msgstr "图标" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." -msgstr "" +msgstr "如果选择此项,边框寄存器将会更新。该设置用于纸片马里奥。" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:439 msgid "Ignore Format Changes" @@ -2961,9 +3054,9 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"忽略EFBæ ¼å¼çš„任何å˜åŒ–。\n" -"在许多游æˆä¸­ä¼šæ高性能且无负é¢ä½œç”¨ã€‚但在其余一å°éƒ¨åˆ†æ¸¸æˆä¸­ä¹Ÿä¼šå¯¼è‡´å›¾åƒç‘•" -"疵。\n" +"忽略 EFB æ ¼å¼çš„任何å˜åŒ–。\n" +"在许多游æˆä¸­ä¼šæ高性能且无负é¢ä½œç”¨ã€‚但在其余\n" +"一å°éƒ¨åˆ†æ¸¸æˆä¸­ä¹Ÿä¼šå¯¼è‡´å›¾åƒç‘•ç–µã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·å‹¾é€‰æ­¤é¡¹ã€‚" @@ -2975,8 +3068,9 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"忽略CPU对EFB的任何读写请求。\n" -"在一些游æˆä¸­å¯æ高性能,但å¯èƒ½ç¦ç”¨ä¸€äº›æ¸¸æˆç›¸å…³ç‰¹æ€§æˆ–图åƒæ•ˆæžœã€‚\n" +"忽略 CPU 对 EFB 的任何读写请求。\n" +"在一些游æˆä¸­å¯æ高性能,但å¯èƒ½ç¦ç”¨ä¸€äº›æ¸¸æˆç›¸å…³\n" +"特性或图åƒæ•ˆæžœã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -2984,9 +3078,13 @@ msgstr "" msgid "Import Save" msgstr "导入存档" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "导入失败,è¦é‡è¯•å—?" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "导入 Wii 存档" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "导入失败" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -3008,21 +3106,16 @@ msgstr "" "导入的文件有一个 sav 扩展å\n" "但是它没有正确的文件头" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "进游æˆ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "进游æˆ" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "帧数é™åˆ¶:" +msgstr "增加帧数é™åˆ¶" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "ä¿¡æ¯" @@ -3036,62 +3129,62 @@ msgstr "输入" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:50 msgid "Insert" -msgstr "æ’å…¥" +msgstr "Insert" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:166 msgid "Insert Encrypted or Decrypted code here..." msgstr "在这里æ’入加密的或者解密的代ç ..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" -msgstr "æ’å…¥SDå¡" +msgstr "æ’å…¥ SD å¡" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:21 msgid "Insert name here.." msgstr "在这里æ’å…¥å称..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "安装 WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" -msgstr "安装到Wiièœå•" +msgstr "安装到 Wii èœå•" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." -msgstr "" -"InstallExceptionHandler called, but this platform does not yet support it." +msgstr "安装异常处ç†ç¨‹åºå·²ç»å‘¼å«ï¼Œä½†æ˜¯è¿™ä¸ªå¹³å°ä¸Šè¿˜ä¸æ”¯æŒã€‚" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "正在安装 WAD..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "完整性校验失败" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "完整性校验完æˆ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "完整性校验完æˆã€‚没有å‘现错误。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " "or has been patched incorrectly." -msgstr "分区%d完整性校验失败。您的dump很å¯èƒ½å·²æŸå或补ä¸é”™è¯¯ã€‚" +msgstr "分区 %d 完整性校验失败。您所转储的文件很å¯èƒ½å·²æŸå或打了错误的补ä¸ã€‚" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:539 msgid "Interface" msgstr "ç•Œé¢" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "ç•Œé¢è®¾ç½®" @@ -3105,8 +3198,8 @@ msgid "" "Internal LZO Error - decompression failed (%d) (%li, %li) \n" "Try loading the state again" msgstr "" -"Internal LZO Error - decompression failed (%d) (%li, %li) \n" -"Try loading the state again" +"内部 LZO 错误 - 解压失败 (%d) (%li, %li) \n" +"请å°è¯•é‡æ–°åŠ è½½çŠ¶æ€" #: Source/Core/Core/Src/State.cpp:530 msgid "Internal LZO Error - lzo_init() failed" @@ -3116,20 +3209,20 @@ msgstr "内部 LZO 错误 - lzo_init() 失败" msgid "Internal Resolution:" msgstr "内部分辨率:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" -msgstr "解释器(éžå¸¸æ…¢ï¼‰" +msgstr "解释器 (éžå¸¸æ…¢)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "片头" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "无效大å°(%x) 或 魔字(%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "无效值!" @@ -3137,70 +3230,72 @@ msgstr "无效值!" msgid "Invalid bat.map or dir entry" msgstr "无效 bat.map 或 目录项目" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "无效事件类型 %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "无效文件" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" "%s\n" " You may need to redump this game." msgstr "" -"在以下gcm中å‘现了无效opening.bnr:\n" +"在此 gcm 中å‘现了无效 opening.bnr:\n" "%s\n" "您å¯èƒ½éœ€è¦é‡æ–°è½¬å‚¨æ­¤æ¸¸æˆã€‚" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "无效录制文件" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:471 msgid "Invalid search parameters (no object selected)" -msgstr "无效的æœç´¢å‚æ•°(没有选择对象)" +msgstr "无效的æœç´¢å‚æ•° (没有选择对象)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:454 msgid "Invalid search string (couldn't convert to number)" -msgstr "无效的æœç´¢å­—串(无法转æ¢æˆæ•°å­—)" +msgstr "无效的æœç´¢å­—串 (无法转æ¢æˆæ•°å­—)" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:442 msgid "Invalid search string (only even string lengths supported)" -msgstr "" +msgstr "无效的æœç´¢å­—符串(仅支æŒç›¸ç­‰é•¿åº¦çš„字符串)" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" -msgstr "Invalid state" +msgstr "无效状æ€" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "æ„大利语" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "日本" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" -msgstr "JIT é‡ç¼–译器(推è)" +msgstr "JIT é‡ç¼–译器 (推è)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "JITIL 实验性é‡ç¼–译器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "日语" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "韩国" @@ -3222,8 +3317,9 @@ msgstr "å‰ç«¯æ˜¾ç¤º" msgid "Key" msgstr "按键" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "韩语" @@ -3234,30 +3330,30 @@ msgstr "L" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:26 msgid "L Button" -msgstr "L é”®" +msgstr "左键" #. i18n: Left-Analog #: Source/Core/Core/Src/HW/GCPadEmu.cpp:48 msgid "L-Analog" -msgstr "L-摇æ†" +msgstr "L-模拟" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:592 msgid "Language:" msgstr "语言:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" -msgstr "" +msgstr "最近 %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" -msgstr "延迟:" +msgstr "延迟:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:264 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:42 msgid "Left" -msgstr "å·¦" +msgstr "左方å‘é”®" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:64 msgid "Left Stick" @@ -3268,8 +3364,8 @@ msgid "" "Left click to detect hotkeys.\n" "Enter space to clear." msgstr "" -"左键å•å‡»æ£€æµ‹çƒ­é”®.\n" -"按空格清除." +"左键å•å‡»æ£€æµ‹çƒ­é”®ã€‚\n" +"按空格清除。" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:742 msgid "" @@ -3277,25 +3373,25 @@ msgid "" "Middle-click to clear.\n" "Right-click for more options." msgstr "" -"左键å•å‡»æ£€æµ‹è¾“å…¥.\n" -"中键å•å‡»æ¸…除.\n" -"å³é”®å•å‡»å¾—到更多选项." +"左键å•å‡»æ£€æµ‹è¾“入。\n" +"中键å•å‡»æ¸…除。\n" +"å³é”®å•å‡»å¾—到更多选项。" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:747 msgid "" "Left/Right-click for more options.\n" "Middle-click to clear." msgstr "" -"å·¦/å³å•å‡»å¾—到更多选项.\n" -"中键å•å‡»æ¸…除" +"å·¦/å³å•å‡»å¾—到更多选项。\n" +"中键å•å‡»æ¸…除。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "å°äºŽ" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:552 msgid "Limit by FPS" -msgstr "" +msgstr "ä¾æ®FPSé™é€Ÿ" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:979 msgid "Load" @@ -3306,101 +3402,90 @@ msgid "Load Custom Textures" msgstr "加载自定义纹ç†" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "载入状æ€(&L)" +msgstr "载入状æ€" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "载入存档æ’槽 1" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "载入存档æ’槽 2" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "载入存档æ’槽 3" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "载入存档æ’槽 4" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "载入存档æ’槽 5" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "载入存档æ’槽 6" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "载入存档æ’槽 7" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "载入存档æ’槽 8" +msgstr "è½½å…¥æœ€è¿‘çŠ¶æ€ 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" -msgstr "载入存档æ’槽 1" +msgstr "è½½å…¥çŠ¶æ€ 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "载入存档æ’槽 1" +msgstr "è½½å…¥çŠ¶æ€ 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" -msgstr "载入存档æ’槽 2" +msgstr "è½½å…¥çŠ¶æ€ 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:199 msgid "Load State Slot 3" -msgstr "载入存档æ’槽 3" +msgstr "è½½å…¥çŠ¶æ€ 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:200 msgid "Load State Slot 4" -msgstr "载入存档æ’槽 4" +msgstr "è½½å…¥çŠ¶æ€ 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:201 msgid "Load State Slot 5" -msgstr "载入存档æ’槽 5" +msgstr "è½½å…¥çŠ¶æ€ 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:202 msgid "Load State Slot 6" -msgstr "载入存档æ’槽 6" +msgstr "è½½å…¥çŠ¶æ€ 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:203 msgid "Load State Slot 7" -msgstr "载入存档æ’槽 7" +msgstr "è½½å…¥çŠ¶æ€ 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:204 msgid "Load State Slot 8" -msgstr "载入存档æ’槽 8" +msgstr "è½½å…¥çŠ¶æ€ 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "载入存档æ’槽 1" +msgstr "è½½å…¥çŠ¶æ€ 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "载入状æ€..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "加载Wii系统èœå•" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "加载Wii系统èœå• %d%c" @@ -3411,17 +3496,14 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"加载User/Load/Textures/<æ¸¸æˆ ID>/目录中的自定义æ质。\n" +"加载 User/Load/Textures/<æ¸¸æˆ ID>/ 目录中的\n" +"自定义æ质。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:37 msgid "Load preset values from hack patterns available." -msgstr "" - -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "本地" +msgstr "从å¯ç”¨çš„修正模å¼åŠ è½½é¢„设值。" #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" @@ -3446,8 +3528,8 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"å°†æ¯ç§’渲染的帧数记录于User/Logs/fps.txt。当您想è¦â€‹è¡¡é‡â€‹Dolphin的性能时å¯å¯ç”¨æ­¤" -"功能。\n" +"å°†æ¯ç§’渲染的帧数记录于 User/Logs/fps.txt。当您想è¦â€‹\n" +"è¡¡é‡ Dolphin 的性能时å¯å¯ç”¨æ­¤åŠŸèƒ½ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -3455,20 +3537,20 @@ msgstr "" msgid "Logger Outputs" msgstr "记录输出" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "记录中" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "丢失æœåŠ¡å™¨è¿žæŽ¥!" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:29 msgid "M Button" -msgstr "M é”®" +msgstr "中键" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3477,9 +3559,9 @@ msgstr "" "MD5 ä¸åŒ¹é…\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" -msgstr "MMU 速度破解" +msgstr "MMU 破解加速" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:517 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:556 @@ -3491,11 +3573,11 @@ msgstr "MadCatz Gameshark 文件(*.gcs)" msgid "Main Stick" msgstr "主摇æ†" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "制作者ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "制作者:" @@ -3507,8 +3589,10 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" -"通过移除雾æå‡è¿œå¤„对象的å¯è§æ€§ï¼Œè¿›è€Œå¢žåŠ æ•´ä½“细节。\n" -"有些游æˆä¾é æ­£ç¡®çš„雾模拟,ç¦ç”¨é›¾å°†ç ´åå…¶å¯çŽ©æ€§ã€‚\n" +"通过移除雾æå‡è¿œå¤„对象的å¯è§æ€§ï¼Œè¿›è€Œå¢žåŠ æ•´ä½“\n" +"细节。\n" +"有些游æˆä¾é æ­£ç¡®çš„雾模拟,ç¦ç”¨é›¾å°†ç ´å其游æˆ\n" +"性。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -3519,7 +3603,7 @@ msgstr "最大" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:435 msgid "Memcard already has a save for this title" -msgstr "Memcard already has a save for this title" +msgstr "内存å¡ä¸­å·²ç»æœ‰äº†è¯¥æ¸¸æˆçš„存档" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:278 msgid "Memcard already opened" @@ -3527,10 +3611,10 @@ msgstr "内存å¡å·²ç»æ‰“å¼€" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:924 msgid "Memory Byte" -msgstr "" +msgstr "内存字节" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "内存å¡" @@ -3538,9 +3622,9 @@ msgstr "内存å¡" msgid "" "Memory Card Manager WARNING-Make backups before using, should be fixed but " "could mangle stuff!" -msgstr "" +msgstr "内存å¡ç®¡ç†å™¨ ▲注æ„â–²-使用å‰å…ˆå¤‡ä»½ï¼Œè¿›è¡Œè¿‡ä¿®å¤ä½†ä»æœ‰å¯èƒ½æŸåæ•°æ®ï¼" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3550,14 +3634,14 @@ msgid "" "%s\n" "Would you like to copy the old file to this new location?\n" msgstr "" -"Memory Card filename in Slot %c is incorrect\n" -"Region not specified\n" +"在æ’槽 %c 中的内存å¡æ–‡ä»¶åä¸æ­£ç¡®\n" +"没有指定区域\n" "\n" -"Slot %c path was changed to\n" +"æ’槽 %c 路径被修改æˆ\n" "%s\n" -"Would you like to copy the old file to this new location?\n" +"你想å¤åˆ¶æ—§æ–‡ä»¶åˆ°è¿™ä¸ªæ–°ä½ç½®å—?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "存储å¡æ–‡ä»¶å¤§å°ä¸Žæ–‡ä»¶å¤´å¤§å°ä¸åŒ¹é…" @@ -3565,9 +3649,9 @@ msgstr "存储å¡æ–‡ä»¶å¤§å°ä¸Žæ–‡ä»¶å¤´å¤§å°ä¸åŒ¹é…" msgid "Menu" msgstr "èœå•" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" -msgstr "Mic" +msgstr "麦克" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:112 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:115 @@ -3578,7 +3662,7 @@ msgstr "最å°" msgid "Misc" msgstr "其它" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "其它设置" @@ -3593,17 +3677,20 @@ msgid "" "reset in most cases.\n" "\n" "If unsure, leave this unchecked." -msgstr "修改纹ç†ä»¥æ˜¾ç¤ºä»¥å“ªç§æ ¼å¼ç¼–ç " +msgstr "" +"修改纹ç†ä»¥æ˜¾ç¤ºä»¥å…¶ç¼–ç æ ¼å¼ã€‚通常需è¦é‡ç½®æ¨¡æ‹Ÿã€‚\n" +"\n" +"如果ä¸ç¡®å®šï¼Œä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/LogWindow.cpp:108 msgid "Monospaced font" msgstr "等宽字体" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" -msgstr "Motion Plus" +msgstr "动感强化器" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "马达" @@ -3628,109 +3715,109 @@ msgstr "" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:62 msgid "Multiply" -msgstr "多人游æˆ" +msgstr "乘å·" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:659 msgid "NOP" -msgstr "" +msgstr "NOP" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:637 msgid "NOTE: Stream size doesn't match actual data length\n" -msgstr "注æ„:æµå¤§å°ä¸ŽçœŸå®žæ•°æ®é•¿åº¦ä¸åŒ¹é…\n" +msgstr "注æ„: æµå¤§å°ä¸ŽçœŸå®žæ•°æ®é•¿åº¦ä¸åŒ¹é…\n" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:116 msgid "NP Add" -msgstr "NP Add" +msgstr "å°é”®ç›˜åŠ " #: Source/Core/DolphinWX/Src/WXInputBase.cpp:111 msgid "NP Begin" -msgstr "NP Begin" +msgstr "å°é”®ç›˜ Begin" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:119 msgid "NP Decimal" -msgstr "NP Decimal" +msgstr "å°é”®ç›˜ç‚¹" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:113 msgid "NP Delete" -msgstr "NP Delete" +msgstr "å°é”®ç›˜ Delete" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:120 msgid "NP Divide" -msgstr "NP Divide" +msgstr "å°é”®ç›˜é™¤" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:107 msgid "NP Down" -msgstr "NP Down" +msgstr "å°é”®ç›˜ä¸‹" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:110 msgid "NP End" -msgstr "NP End" +msgstr "å°é”®ç›˜ End" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:98 msgid "NP Enter" -msgstr "NP Enter" +msgstr "å°é”®ç›˜ Enter" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:114 msgid "NP Equal" -msgstr "NP Equal" +msgstr "å°é”®ç›˜ç­‰å·" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:103 msgid "NP Home" -msgstr "NP Home" +msgstr "å°é”®ç›˜ Home" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:112 msgid "NP Insert" -msgstr "NP Insert" +msgstr "å°é”®ç›˜ Insert" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:104 msgid "NP Left" -msgstr "NP Left" +msgstr "å°é”®ç›˜å·¦" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:115 msgid "NP Multiply" -msgstr "NP Multiply" +msgstr "å°é”®ç›˜ä¹˜" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:109 msgid "NP Page Down" -msgstr "NP Page Down" +msgstr "å°é”®ç›˜ Page Down" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:108 msgid "NP Page Up" -msgstr "NP Page Up" +msgstr "å°é”®ç›˜ Page Up" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:106 msgid "NP Right" -msgstr "NP Right" +msgstr "å°é”®ç›˜å³" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:117 msgid "NP Separator" -msgstr "NP Separator" +msgstr "å°é”®ç›˜ Separator" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:96 msgid "NP Space" -msgstr "NP Space" +msgstr "å°é”®ç›˜ç©ºæ ¼" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:118 msgid "NP Subtract" -msgstr "NP Subtract" +msgstr "å°é”®ç›˜å‡" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:97 msgid "NP Tab" -msgstr "NP Tab" +msgstr "å°é”®ç›˜ Tab" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:105 msgid "NP Up" -msgstr "NP Up" +msgstr "å°é”®ç›˜ä¸Š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "å称:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "å称:" @@ -3740,7 +3827,7 @@ msgstr "å称:" msgid "Native GCI files(*.gci)" msgstr "内部 GCI 文件(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "新建扫æ" @@ -3749,7 +3836,7 @@ msgstr "新建扫æ" msgid "Next Page" msgstr "下一页" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "下一扫æ" @@ -3757,19 +3844,19 @@ msgstr "下一扫æ" msgid "Nickname :" msgstr "昵称 :" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "无国家 (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "未找到镜åƒæˆ–者WAD" #: Source/Core/Core/Src/ConfigManager.h:17 msgid "No audio output" -msgstr "" +msgstr "无音频输出" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "没有找到标题为 %s 的标志文件" @@ -3781,7 +3868,7 @@ msgstr "没有å¯ç”¨çš„说明" #: Source/Core/DolphinWX/Src/FrameAui.cpp:535 msgid "No docking" -msgstr "No docking" +msgstr "ç¦ç”¨åœé " #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:871 msgid "No file loaded" @@ -3795,42 +3882,43 @@ msgstr "没有空闲目录索引项目" msgid "No recorded file" msgstr "没有已录制文件" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" -msgstr "No save folder found for title %s" +msgstr "没有找到å称为 %s 的存档文件夹" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "æ— " -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "书é¢æŒªå¨è¯­" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "ä¸ç­‰äºŽ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "未设置" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" -msgstr "" +msgstr "ä¸æ˜¯ Wii å­˜æ¡£æˆ–å› ä¸ºæ–‡ä»¶æ ‡å¤´å¤§å° %x 无法读å–" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "未连接" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "说明" @@ -3851,7 +3939,7 @@ msgstr "æ示" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "代ç æ•°é‡: " @@ -3862,17 +3950,17 @@ msgstr "åŒèŠ‚æ£æŽ§åˆ¶å™¨" #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:27 msgid "Nunchuk Acceleration" -msgstr "Nunchuk 加速" +msgstr "åŒèŠ‚æ£åŠ é€Ÿåº¦" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:889 msgid "Object" -msgstr "" +msgstr "对象" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:122 msgid "Object Range" -msgstr "" +msgstr "对象范围" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "关闭" @@ -3882,27 +3970,31 @@ msgstr "å移é‡:" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:589 msgid "On-Screen Display Messages" -msgstr "å±å¹•æ˜¾ç¤ºæ¶ˆæ¯ï¼ˆOSD)" +msgstr "å±å¹•æ˜¾ç¤ºæ¶ˆæ¯" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "在线文档(&D)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "åªæœ‰ %d 区å—有效" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "打开" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "打开包å«æ–‡ä»¶å¤¹(&C)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "打开 Wii 存档目录(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "打开文件..." @@ -3922,13 +4014,19 @@ msgstr "OpenAL: ä¸èƒ½æ‰“开设备 %s" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:502 msgid "OpenCL Texture Decoder" -msgstr "OpenCL纹ç†è§£ç å™¨" +msgstr "OpenCL 纹ç†è§£ç å™¨" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:503 msgid "OpenMP Texture Decoder" msgstr "OpenMP纹ç†è§£ç å™¨" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "在外部文本编辑器中打开本游æˆçš„默认 (åªè¯») 设置。" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "选项" @@ -3938,7 +4036,6 @@ msgid "Orange" msgstr "æ©™" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" @@ -3953,27 +4050,25 @@ msgstr "" msgid "Other" msgstr "其他" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." -msgstr "" -"Other client disconnected while game is running!! NetPlay is disabled. You " -"manually stop the game." +msgstr "游æˆè¿è¡ŒæœŸé—´å…¶ä»–客户端断开连接!! NetPlay å·²ç¦ç”¨ã€‚您需è¦æ‰‹åŠ¨åœæ­¢æ¸¸æˆã€‚" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:528 msgid "Output" msgstr "输出" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "播放录制(&L)..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "手柄" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "手柄" @@ -3997,17 +4092,17 @@ msgstr "段è½" msgid "Parameters" msgstr "å‚æ•°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "分区 %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 -#, c-format -msgid "Partition doesn't exist: %lu" -msgstr "" +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 +#, fuzzy, c-format +msgid "Partition doesn't exist: %u" +msgstr "分区ä¸å­˜åœ¨: %lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "è¡¥ä¸" @@ -4015,8 +4110,8 @@ msgstr "è¡¥ä¸" msgid "Paths" msgstr "路径" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "æš‚åœ" @@ -4029,19 +4124,19 @@ msgstr "在影片末尾暂åœ" msgid "Per-Pixel Lighting" msgstr "é€åƒç´ ç…§æ˜Ž" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "完美" #: Source/Core/DolphinWX/Src/FrameAui.cpp:642 #, c-format msgid "Perspective %d" -msgstr "视角%d" +msgstr "布局 %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "开始" @@ -4053,47 +4148,47 @@ msgstr "播放录制" msgid "Play/Pause" msgstr "开始/æš‚åœ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" -msgstr "å¯ä»¥çŽ©" +msgstr "å°šå¯" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:141 msgid "Playback Options" msgstr "回放选项" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "玩家" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "请确认..." #: Source/Core/DolphinWX/Src/FrameAui.cpp:612 msgid "Please create a perspective before saving" -msgstr "Please create a perspective before saving" +msgstr "存储å‰è¯·å…ˆåˆ›å»ºä¸€ä¸ªå¸ƒå±€" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:23 msgid "Plus-Minus" -msgstr "Plus-Minus" +msgstr "加-å‡" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "波兰语" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "ç«¯å£ 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "ç«¯å£ 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "ç«¯å£ 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "ç«¯å£ 4" @@ -4102,11 +4197,11 @@ msgstr "ç«¯å£ 4" msgid "Port :" msgstr "ç«¯å£ :" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "è‘¡è„牙语" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "è‘¡è„牙语(巴西)" @@ -4114,20 +4209,20 @@ msgstr "è‘¡è„牙语(巴西)" msgid "Post-Processing Effect:" msgstr "åŽå¤„ç†æ•ˆæžœ:" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" -msgstr "" +msgstr "在PlayController中æå‰ç»“æŸå½±ç‰‡ã€‚%u + 8 > %u" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" -msgstr "" +msgstr "在 PlayWiimote 中æå‰ç»“æŸå½±ç‰‡ã€‚%u + %d > %u" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" -msgstr "" +msgstr "在PlayWiimote 中æå‰ç»“æŸå½±ç‰‡ã€‚%u > %u" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:35 msgid "Presets: " @@ -4141,7 +4236,7 @@ msgstr "上一页" msgid "Previous Page" msgstr "上一页" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "上一个值" @@ -4151,13 +4246,13 @@ msgstr "打å°" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:949 msgid "Profile" -msgstr "é…ç½®" +msgstr "预设" #: Source/Core/DolphinWX/Src/ISOProperties.h:42 msgid "Properties" msgstr "属性" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "清除缓存" @@ -4166,7 +4261,7 @@ msgid "Question" msgstr "询问" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "退出" @@ -4177,24 +4272,24 @@ msgstr "R" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:27 msgid "R Button" -msgstr "R é”®" +msgstr "å³é”®" #. i18n: Right-Analog #: Source/Core/Core/Src/HW/GCPadEmu.cpp:50 msgid "R-Analog" -msgstr "R-摇æ†" +msgstr "R-模拟" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:446 msgid "RAM" msgstr "内存" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" -msgstr "俄语" +msgstr "ä¿„ç½—æ–¯" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:229 msgid "Radius" -msgstr "" +msgstr "åŠå¾„" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:577 msgid "Range" @@ -4210,15 +4305,15 @@ msgstr "真实" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 msgid "Real Balance Board" -msgstr "" +msgstr "真实平衡æ¿" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:24 msgid "Real Wiimote" -msgstr "真实Wiié¥æŽ§å™¨" +msgstr "真实 Wii 控制器" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:80 msgid "Real Wiimotes" -msgstr "真实Wiié¥æŽ§å™¨" +msgstr "真实 Wii 控制器" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:180 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:205 @@ -4227,6 +4322,10 @@ msgstr "真实Wiié¥æŽ§å™¨" msgid "Record" msgstr "录制" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "录制输入" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "录制信æ¯" @@ -4255,14 +4354,14 @@ msgid "" "\n" "If unsure, select None." msgstr "" -"å‡è½»æ …格化3D图åƒäº§ç”Ÿçš„æ··å ã€‚\n" +"å‡è½»æ …格化 3D 图åƒäº§ç”Ÿçš„æ··å ã€‚\n" "这将使渲染出的图åƒçœ‹èµ·æ¥ä¸é‚£ä¹ˆæ–‘驳。\n" "严é‡é™ä½Žæ¨¡æ‹Ÿé€Ÿåº¦ä¸”有时产生问题。\n" "\n" "如果没有把æ¡ï¼Œé€‰æ‹©â€œæ— â€ã€‚" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "刷新" @@ -4271,14 +4370,14 @@ msgstr "刷新" msgid "Refresh List" msgstr "刷新列表" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "刷新游æˆåˆ—表" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "移除" @@ -4294,14 +4393,14 @@ msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:309 msgid "Render to Main Window" -msgstr "附加到主窗å£" +msgstr "渲染到主窗å£" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:172 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:970 msgid "Reset" msgstr "é‡ç½®" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "结果" @@ -4309,33 +4408,30 @@ msgstr "结果" msgid "Return" msgstr "回车" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" -msgstr "" +msgstr "修订版:" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:265 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:44 msgid "Right" -msgstr "å³" +msgstr "å‘å³é”®" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Classic.cpp:65 msgid "Right Stick" msgstr "å³æ‘‡æ†" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "震动" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." -msgstr "" -"在一个专门的线程上è¿è¡ŒDSP HLEå’ŒLLE(ä¸æŽ¨è:用于HLEæ—¶å¯èƒ½äº§ç”Ÿå£°éŸ³å·®é”™ï¼Œç”¨äºŽ" -"LLEæ—¶å¯èƒ½å¯¼è‡´å¡æœºï¼‰ã€‚" +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." +msgstr "在专用的线程中è¿è¡ŒDSP LLE (ä¸æŽ¨è: å¯èƒ½å¯¼è‡´å¡æ­»)。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "俄语" @@ -4348,7 +4444,7 @@ msgid "Safe" msgstr "安全" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "ä¿å­˜" @@ -4358,101 +4454,97 @@ msgid "Save GCI as..." msgstr "ä¿å­˜GCI为..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "ä¿å­˜çŠ¶æ€(&V)" +msgstr "ä¿å­˜æœ€æ—©çŠ¶æ€" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "ä¿å­˜çŠ¶æ€(&V)" +msgstr "ä¿å­˜çŠ¶æ€" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" -msgstr "存档æ’槽 1" +msgstr "ä¿å­˜çŠ¶æ€ 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "存档æ’槽 1" +msgstr "ä¿å­˜çŠ¶æ€ 10" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" -msgstr "存档æ’槽 2" +msgstr "ä¿å­˜çŠ¶æ€ 2" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:210 msgid "Save State Slot 3" -msgstr "存档æ’槽 3" +msgstr "ä¿å­˜çŠ¶æ€ 3" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:211 msgid "Save State Slot 4" -msgstr "存档æ’槽 4" +msgstr "ä¿å­˜çŠ¶æ€ 4" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:212 msgid "Save State Slot 5" -msgstr "存档æ’槽 5" +msgstr "ä¿å­˜çŠ¶æ€ 5" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:213 msgid "Save State Slot 6" -msgstr "存档æ’槽 6" +msgstr "ä¿å­˜çŠ¶æ€ 6" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:214 msgid "Save State Slot 7" -msgstr "存档æ’槽 7" +msgstr "ä¿å­˜çŠ¶æ€ 7" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:215 msgid "Save State Slot 8" -msgstr "存档æ’槽 8" +msgstr "ä¿å­˜çŠ¶æ€ 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "存档æ’槽 1" +msgstr "ä¿å­˜çŠ¶æ€ 9" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "ä¿å­˜çŠ¶æ€..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "å¦å­˜ä¸º..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "ä¿å­˜åŽ‹ç¼©çš„GCM/é•œåƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" -msgstr "ä¿å­˜å½“å‰è§†è§’" +msgstr "ä¿å­˜å½“å‰å¸ƒå±€" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "ä¿å­˜è§£åŽ‹ç¼©çš„GCM/é•œåƒ" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." -msgstr "Savestate movie %s is corrupted, movie recording stopping..." +msgstr "å³æ—¶å­˜æ¡£å½±ç‰‡ %s 被破å, 影片录制åœæ­¢..." #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:405 msgid "Scaled EFB Copy" -msgstr "缩放EFB副本" +msgstr "缩放 EFB 副本" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "正在扫æ%s" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" -msgstr "扫æé•œåƒä¸­" +msgstr "正在扫æé•œåƒ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." -msgstr "扫æ中..." +msgstr "正在扫æ..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "截图" @@ -4464,11 +4556,11 @@ msgstr "Scroll Lock" msgid "Search" msgstr "æœç´¢" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "æœç´¢è¿‡æ»¤" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "æœç´¢å­ç›®å½•" @@ -4491,12 +4583,12 @@ msgstr "未在SYSCONF中找到部分%s" msgid "Select" msgstr "选择" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "选择录制文件" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "选择è¦å®‰è£…çš„ Wii WAD 文件" @@ -4517,19 +4609,19 @@ msgstr "选择è¦å¯¼å…¥çš„存档" msgid "Select floating windows" msgstr "选择浮动窗å£" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "选择è¦è½½å…¥çš„文件" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "选择一个存档文件" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "选择è¦è½½å…¥çš„状æ€" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "选择è¦ä¿å­˜çš„状æ€" @@ -4545,15 +4637,15 @@ msgid "" msgstr "" "选择渲染时使用哪ç§å®½é«˜æ¯”:\n" "自动:使用原生宽高比。\n" -"强制16:9:将图åƒæ‹‰ä¼¸è‡³16:9宽高比。\n" -"强制4:3:将图åƒæ‹‰ä¼¸è‡³4:3宽高比。\n" -"拉伸到窗å£:将图åƒæ‹‰ä¼¸è‡³çª—å£å¤§å°ã€‚\n" +"强制 16:9: 将图åƒæ‹‰ä¼¸è‡³ 16:9 宽高比。\n" +"强制 4:3: 将图åƒæ‹‰ä¼¸è‡³ 4:3 宽高比。\n" +"拉伸到窗å£: 将图åƒæ‹‰ä¼¸è‡³çª—å£å¤§å°ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·é€‰æ‹©â€œè‡ªåŠ¨â€ã€‚" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" -msgstr "所选控制器é…ç½®ä¸å­˜åœ¨" +msgstr "所选控制器预设ä¸å­˜åœ¨" #: Source/Core/DolphinWX/Src/LogWindow.cpp:109 msgid "Selected font" @@ -4569,63 +4661,55 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" "选择全å±æ¨¡å¼æ‰€ä½¿ç”¨çš„显示分辨率。\n" -"该数值应始终大于或等于内部分辨率。对性能的影å“å¯ä»¥å¿½ç•¥ã€‚\n" +"该数值应始终大于或等于内部分辨率。对性能的影å“\n" +"å¯ä»¥å¿½ç•¥ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä½¿ç”¨æ‚¨çš„æ¡Œé¢åˆ†è¾¨çŽ‡ã€‚\n" "如果ä»ç„¶ä¸èƒ½ç¡®å®šï¼Œä½¿ç”¨æœ€é«˜çš„有效分辨率。" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" -"选择供内部使用的图åƒåº”用程åºæŽ¥å£ï¼ˆAPI)。\n" -"Direct3D 9通常最快,而OpenGL会更加精确,Direct3D 11介乎两者之间。\n" -"请注æ„Direct3DåŽç«¯åªåœ¨Windows下å¯ç”¨ã€‚\n" -"\n" -"如果没有把æ¡ï¼Œè¯·é€‰æ‹©Direct3D 11。" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -"选择内部使用哪ç§å›¾åƒåº”用程åºæŽ¥å£ï¼ˆAPI)。\n" -"Direct3D 9通常最快,而OpenGL更加精确,Direct3D 11介乎两者之间。\n" -"请注æ„Direct3DåŽç«¯åªåœ¨Windows下å¯ç”¨ã€‚\n" -"\n" -"如果没有把æ¡ï¼Œè¯·é€‰æ‹©OpenGL。" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "å‘é€" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:110 msgid "Sensor Bar Position:" -msgstr "传感器æ ä½ç½®" +msgstr "传感器æ ä½ç½®:" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:64 msgid "Separator" -msgstr "分割" +msgstr "Separator" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "塞尔维亚语" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "ä¸²è¡Œç«¯å£ 1 - 这是网络适é…器等设备使用的端å£" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "设置为默认镜åƒ(&D)" @@ -4634,106 +4718,110 @@ msgstr "设置为默认镜åƒ(&D)" msgid "Set as default Memcard %c" msgstr "è®¾ç½®ä¸ºé»˜è®¤å†…å­˜å¡ %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" -msgstr "SetARCode_IsActive: Index is greater than ar code list size %lu" +msgstr "SetARCode_IsActive: 索引大于 AR ç åˆ—è¡¨å¤§å° %lu" #: Source/Core/DolphinWX/Src/ConfigMain.cpp:522 msgid "" "Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL " "backend only." -msgstr "设置延迟(以毫秒计)。较高的值或将å‡å°‘音频噼啪声。仅适用于OpenALåŽç«¯ã€‚" +msgstr "设置延迟 (以毫秒计) 。较高的值或将å‡å°‘音频噼啪声。仅适用于OpenALåŽç«¯ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "设置..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "安装Wii内存: ä¸èƒ½æ‰¾åˆ°è®¾ç½®æ–‡ä»¶" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "安装Wii内存:无法创建设置文件" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "震动" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "短å称:" #: Source/Core/DolphinWX/Src/TASInputDlg.cpp:92 msgid "Shoulder Buttons" -msgstr "" +msgstr "肩部按钮" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "显示控制å°(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "显示日志(&L)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "显示状æ€æ (&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "显示工具æ (&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "显示默认值" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "显示驱动器" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:528 msgid "Show EFB Copy Regions" -msgstr "显示EFBå¤åˆ¶èŒƒå›´" +msgstr "显示 EFB å¤åˆ¶èŒƒå›´" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:304 msgid "Show FPS" msgstr "显示 FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "显示法国" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "显示 GameCube" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:559 msgid "Show Input Display" -msgstr "显示输入显示" +msgstr "显示输入回显" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "显示æ„大利" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "显示日本" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "显示韩国" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "显示语言:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "显示日志设置(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "显示PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "显示平å°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "显示国家" @@ -4741,27 +4829,27 @@ msgstr "显示国家" msgid "Show Statistics" msgstr "显示统计数æ®" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "显示å°æ¹¾" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "显示美国" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "显示 Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "显示 Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "åœæ­¢æ¸¸æˆæ—¶æ˜¾ç¤ºç¡®è®¤å¯¹è¯æ¡†" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4777,9 +4865,9 @@ msgstr "显示第一区å—" #: Source/Core/DolphinWX/Src/FrameTools.cpp:131 msgid "Show lag counter" -msgstr "" +msgstr "显示丢帧计数器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4815,7 +4903,7 @@ msgstr "" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "显示未知" @@ -4829,29 +4917,30 @@ msgstr "" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" -msgstr "Sideways Wiimote" +msgstr "横置 Wii 控制器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "简体中文" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "大å°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" -msgstr "跳过BIOS" +msgstr "跳过 BIOS" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" -msgstr "" +msgstr "跳过DCBZ清除" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:455 msgid "Skip EFB Access from CPU" -msgstr "跳过EFB访问" +msgstr "跳过 EFB 访问" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:125 msgid "" @@ -4862,18 +4951,25 @@ msgid "" "\n" "If unsure, leave this unchecked." msgstr "" +"以牺牲模拟准确性为代价略微æ高缓存 EFB 到\n" +"内存的速度。\n" +"有时也会æ高视觉质é‡ã€‚\n" +"如果é‡åˆ°ä»»ä½•é—®é¢˜ï¼Œè¯·å°è¯•æ高纹ç†ç¼“存精确度或\n" +"ç¦ç”¨æ­¤é¡¹ã€‚\n" +"\n" +"如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "æ’槽 %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "æ’槽 A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "æ’槽 B" @@ -4881,7 +4977,7 @@ msgstr "æ’槽 B" msgid "Snapshot" msgstr "截图" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "软件渲染器" @@ -4893,30 +4989,30 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" "软件渲染比其他åŽç«¯æ…¢ä¸€ä¸ªæ•°é‡çº§ã€‚\n" -"该项仅当用于调试目的时有所帮助。\n" -"您真的想è¦å¯ç”¨è½¯ä»¶æ¸²æŸ“å—?如果没有把æ¡ï¼Œè¯·é€‰æ‹©â€œå¦â€ã€‚" +"该渲染器仅适用于调试目的。\n" +"您真的想è¦å¯ç”¨è½¯ä»¶æ¸²æŸ“å—? 如果ä¸ç¡®å®šï¼Œè¯·é€‰æ‹©â€œå¦â€ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "声音设置" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "声音åŽç«¯ %s 无效." -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "声音缓冲区创建失败: %s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "空格" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "西ç­ç‰™è¯­" @@ -4935,43 +5031,37 @@ msgid "" "\n" "If unsure, select 640x528." msgstr "" -"指定渲染使用的分辨率。选择较高的分辨率将显著æ高图åƒè´¨é‡ï¼Œä½†ä¹Ÿå°†ä¸¥é‡å½±å“性能" -"且å¯èƒ½åœ¨ä¸€äº›æ¸¸æˆä¸­å¼•èµ·æ•…障。\n" -"“640x528çš„å€æ•°â€æ¯”“窗å£å¤§å°â€ç•¥æ…¢ï¼Œä½†äº§ç”Ÿæ›´å°‘问题。一般而言,内部分辨率越低,性" -"能将越高。\n" -"如果没有把æ¡ï¼Œè¯·é€‰æ‹©640x528。" +"指定渲染使用的分辨率。选择较高的分辨率将显著\n" +"æ高图åƒè´¨é‡ï¼Œä½†ä¹Ÿå°†ä¸¥é‡å½±å“性能且å¯èƒ½åœ¨ä¸€äº›\n" +"游æˆä¸­å¼•èµ·æ•…障。\n" +"“640x528 çš„å€æ•°â€æ¯”“窗å£å¤§å°â€ç•¥æ…¢ï¼Œä½†äº§ç”Ÿæ›´å°‘\n" +"问题。一般而言,内部分辨率越低,性能将越高。\n" +"\n" +"如果没有把æ¡ï¼Œè¯·é€‰æ‹© 640x528。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "æå‡å…‰ç›˜ä¼ è¾“率" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "æ–¹å—é”®" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "标准控制器" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "开始" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" -msgstr "开始网络对战(&N)" +msgstr "开始 NetPlay(&N)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "开始录制(&C)" @@ -4979,7 +5069,7 @@ msgstr "开始录制(&C)" msgid "Start Recording" msgstr "开始录制" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "状æ€" @@ -4987,7 +5077,7 @@ msgstr "状æ€" msgid "State Saves" msgstr "状æ€å­˜æ¡£" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "æ–¹å‘盘" @@ -4996,7 +5086,7 @@ msgid "Stick" msgstr "摇æ†" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "åœæ­¢" @@ -5009,8 +5099,9 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" -"在GPUæ质对象中存储EFB副本。\n" -"这并ä¸å分精确,但对多数游æˆæ¥è¯´æ•ˆæžœè¶³å¤Ÿå¥½ä¸”与缓冲EFB到RAM相比有显著æ速。\n" +"在 GPU æ质对象中存储 EFB 副本。\n" +"这并ä¸å分精确,但对多数游æˆæ¥è¯´æ•ˆæžœè¶³å¤Ÿå¥½ä¸”与\n" +"缓冲 EFB 到 RAM 相比有显著æ速。\n" "\n" "如果没有把æ¡ï¼Œè¯·å‹¾é€‰æ­¤é¡¹ã€‚" @@ -5020,45 +5111,47 @@ msgstr "拉伸到窗å£å¤§å°" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:47 msgid "Strum" -msgstr "Strum" +msgstr "弹拨" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:65 msgid "Subtract" -msgstr "Subtract" +msgstr "å‡å·" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "æˆåŠŸå¯¼å‡ºæ–‡ä»¶åˆ° %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "æˆåŠŸå¯¼å…¥å­˜æ¡£æ–‡ä»¶" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" -msgstr "" +msgstr "瑞典语" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" -msgstr "摇摆" +msgstr "挥舞" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" -msgstr "åŒæ­¥GPU线程" +msgstr "åŒæ­¥ GPU 线程" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" -msgstr "åŒæ­¥GPU与CPU线程以帮助防止åŒæ ¸æ¨¡å¼ä¸‹çš„å¶å‘å¡æ­»ã€‚(开=兼容,关=快速)" +msgstr "" +"åŒæ­¥ GPU 与 CPU 线程以帮助防止åŒæ ¸æ¨¡å¼ä¸‹çš„å¶å‘å¡æ­»ã€‚ (å¼€=兼容,关=快速)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "系统语言:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "å°æ¹¾" @@ -5073,25 +5166,25 @@ msgstr "Tab" #: Source/Core/DolphinWX/Src/FrameAui.cpp:531 msgid "Tab split" -msgstr "Tab split" +msgstr "Tab split(标签分割)" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:41 msgid "Table Left" -msgstr "Table Left" +msgstr "左唱盘" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:42 msgid "Table Right" -msgstr "Table Right" +msgstr "å³å”±ç›˜" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "å±å¹•æˆªå›¾" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" -msgstr "TaruKonga (Bongos)" +msgstr "TaruKonga (森喜刚鼓)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:535 msgid "Test" @@ -5109,11 +5202,11 @@ msgstr "纹ç†ç¼“å­˜" msgid "Texture Format Overlay" msgstr "纹ç†æ ¼å¼è¦†ç›–" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD 安装æˆåŠŸ" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "地å€æ— æ•ˆ" @@ -5121,20 +5214,20 @@ msgstr "地å€æ— æ•ˆ" msgid "The checksum was successfully fixed" msgstr "校检和æˆåŠŸä¿®å¤" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "选择的目录已ç»å­˜åœ¨äºŽåˆ—表" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" "Do you wish to replace it?" msgstr "" -"文件 %s å·²ç»å­˜åœ¨.\n" -"您è¦æ›¿æ¢å®ƒä¹ˆ?" +"文件 %s å·²ç»å­˜åœ¨ã€‚\n" +"是å¦æ›¿æ¢?" #: Source/Core/AudioCommon/Src/WaveFile.cpp:39 #, c-format @@ -5146,9 +5239,9 @@ msgstr "文件%s无法以写入形å¼æ‰“开。请检查该文件是å¦å·²ç»è¢« #: Source/Core/AudioCommon/Src/WaveFile.cpp:32 #, c-format msgid "The file %s was already open, the file header will not be written." -msgstr "The file %s was already open, the file header will not be written." +msgstr "文件 %s å·²ç»æ‰“开,文件头ä¸ä¼šè¢«å†™å…¥ã€‚" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "您指定的文件 %s ä¸å­˜åœ¨" @@ -5163,7 +5256,7 @@ msgstr "å称ä¸èƒ½åŒ…å«å­—符 ','" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:129 msgid "The resulting decrypted AR code doesn't contain any lines." -msgstr "产生的已解密动作回放代ç ä¸åŒ…å«ä»»ä½•è¡Œã€‚" +msgstr "产生的已解密 AR 代ç ä¸åŒ…å«ä»»ä½•è¡Œã€‚" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:99 msgid "" @@ -5172,7 +5265,8 @@ msgid "" "\n" "If unsure, use the rightmost value." msgstr "" -"越往“安全â€æ–¹å‘调节,模拟器丢失内存中纹ç†æ›´æ–°çš„机é‡è¶Šå°ã€‚\n" +"越往“安全â€æ–¹å‘调节,模拟器丢失内存中纹ç†æ›´æ–°çš„\n" +"机率越å°ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·å°†æ»‘å—拖动至最å³ã€‚" @@ -5180,50 +5274,48 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "您正在试图å¤åˆ¶çš„存档文件大å°æ— æ•ˆ" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "您的系统ä¸æ”¯æŒé€‰å®šçš„语言。正在退回系统默认。" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" -msgstr "æœåŠ¡å™¨ä¸Žå®¢æˆ·ç«¯çš„NetPlay版本ä¸å…¼å®¹ï¼" +msgstr "æœåŠ¡å™¨ä¸Žå®¢æˆ·ç«¯çš„ NetPlay 版本ä¸å…¼å®¹!" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "æœåŠ¡å™¨å·²æ»¡!" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" -msgstr "æœåŠ¡å™¨å›žåº”:游æˆæ­£åœ¨è¿è¡Œï¼" +msgstr "æœåŠ¡å™¨å›žåº”: 游æˆæ­£åœ¨è¿è¡Œ!" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "æœåŠ¡å™¨å‘é€äº†ä¸€ä¸ªæœªçŸ¥é”™è¯¯æ¶ˆæ¯!" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "指定的文件 \"%s\" ä¸å­˜åœ¨" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "这个值无效" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "主题:" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." -msgstr "" -"There must be a ticket for 00000001/00000002. Your NAND dump is probably " -"incomplete." +msgstr "必须有一个标签给 00000001/00000002。你的NAND转储å¯èƒ½ä¸å®Œæ•´ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5231,15 +5323,15 @@ msgstr "" "这些设置将覆盖核心Dolphin设置。\n" "未决设置将使用Dolphin的设置。" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." -msgstr "此动作回放模拟器ä¸æ”¯æŒä¿®æ”¹åŠ¨ä½œå›žæ”¾æœ¬èº«çš„代ç ã€‚" +msgstr "æ­¤Action Replay模拟器ä¸æ”¯æŒä¿®æ”¹Action Replay本身的代ç ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." -msgstr "这会导致Wii Menu和一些游æˆå‡é€Ÿã€‚" +msgstr "这会导致 Wii èœå•å’Œä¸€äº›æ¸¸æˆå‡é€Ÿã€‚" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:119 msgid "" @@ -5253,48 +5345,49 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "此功能使您能够改å˜æ¸¸æˆçš„摄影机。\n" -"按ä½é¼ æ ‡å³é”®ç§»åŠ¨é¼ æ ‡ä»¥æ‘‡åŠ¨é•œå¤´ï¼ŒæŒ‰ä½é¼ æ ‡ä¸­é”®ç§»åŠ¨é¼ æ ‡ä»¥ç§»åŠ¨ã€‚\n" -"按ä½SHIFT并按下WASD中的一个将以固定步长移动摄影机(SHIFT+0加速,SHIFT+9å‡é€Ÿ)。" +"按ä½é¼ æ ‡å³é”®ç§»åŠ¨é¼ æ ‡ä»¥æ‘‡åŠ¨é•œå¤´ï¼ŒæŒ‰ä½é¼ æ ‡ä¸­é”®\n" +"移动鼠标以移动。\n" +"æŒ‰ä½ SHIFT 并按下 WASD 中的一个将以固定步长\n" +"移动摄影机 (SHIFT+0加速,SHIFT+9å‡é€Ÿ)。\n" "按SHIFT+R以é‡ç½®æ‘„影机。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 -#, fuzzy +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " "throttle using the DSP (might fix audio clicks but can also cause constant " "noise depending on the game)." msgstr "" -"如果设置的帧数é™åˆ¶é«˜äºŽæ¸¸æˆçš„全速(NTSC:60, PAL:50)。选择“音频â€ä»¥ä½¿ç”¨DSPé™åˆ¶é€Ÿ" -"度(å¯èƒ½ä¿®æ­£å’”嗒声但也å¯èƒ½å¯¼è‡´æŒç»­çš„噪音,因游æˆè€Œå¼‚)。" +"该选项将游æˆé€Ÿåº¦é™åˆ¶ä¸ºåˆ¶å®šçš„帧率 (NTSC全速为60,PAL全速为50) 。也å¯ä»¥é€‰æ‹©éŸ³é¢‘" +"以使用DSPé™åˆ¶é€Ÿåº¦ (å¯èƒ½ä¿®æ­£å’”嗒声但也å¯èƒ½å¯¼è‡´æŒç»­çš„噪音,因游æˆè€Œå¼‚) 。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" "Causes major speed improvements on PCs with more than one core, but can also " "cause occasional crashes/glitches." msgstr "" -"这将分离视频与CPU线程,以便于在ä¸åŒçš„核心中è¿è¡Œã€‚\n" -"在有多于一个核心的PC中将带æ¥å¤§å¹…æ速,但å¯èƒ½å¯¼è‡´å¶å‘性的崩溃或故障。" +"这将分离视频与 CPU 线程,以便于在ä¸åŒçš„核心中è¿è¡Œã€‚\n" +"在有多于一个核心的 PC 中将带æ¥å¤§å¹…æ速,但å¯èƒ½å¯¼è‡´å¶å‘性的崩溃或故障。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" -msgstr "这将å…许你手动编辑INIé…置文件" +msgstr "这将å…许你手动编辑 INI é…置文件" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:237 #: Source/Core/InputCommon/Src/ControllerEmu.cpp:242 msgid "Threshold" msgstr "阈值" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "倾斜" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "标题" @@ -5308,39 +5401,37 @@ msgid "Toggle All Log Types" msgstr "切æ¢æ‰€æœ‰æ—¥å¿—类型" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "宽高比:" +msgstr "切æ¢å®½é«˜æ¯”" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "EFB副本" +msgstr "åˆ‡æ¢ EFB 副本" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "切æ¢æ‰€æœ‰æ—¥å¿—类型" +msgstr "切æ¢é›¾" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "切æ¢å…¨å±" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:190 msgid "Toggle IR" -msgstr "" +msgstr "切æ¢å†…部分辨率" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "顶部" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "ç¹ä½“中文" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "å·²ç»å°è¯•è½½å…¥æœªçŸ¥æ–‡ä»¶ç±»åž‹." @@ -5350,23 +5441,23 @@ msgstr "扳机" #: Source/Core/Common/Src/SysConf.h:78 Source/Core/Common/Src/SysConf.h:101 msgid "Trying to read from invalid SYSCONF" -msgstr "正在å°è¯•ä»Žæ— æ•ˆçš„SYSCONF中读å–" +msgstr "正在å°è¯•ä»Žæ— æ•ˆçš„ SYSCONF 中读å–" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:31 msgid "" "Trying to read from invalid SYSCONF\n" "Wiimote bt ids are not available" msgstr "" -"正在å°è¯•ä»Žæ— æ•ˆçš„SYSCONF中读å–\n" -"Wiimote bt idså°†ä¸å¯ç”¨" +"正在å°è¯•ä»Žæ— æ•ˆçš„ SYSCONF 中读å–\n" +"Wiimote bt ids ä¸å¯ç”¨" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "土耳其语" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp:33 msgid "Turntable" -msgstr "唱机转盘" +msgstr "转盘 (DJ 英雄)" #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:58 msgid "Type" @@ -5376,12 +5467,12 @@ msgstr "类型" msgid "UDP Port:" msgstr "UDP 端å£:" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" -msgstr "UDP Wiimote" +msgstr "UDP Wii 控制器" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "未知" @@ -5390,7 +5481,7 @@ msgstr "未知" msgid "UNKNOWN_%02X" msgstr "UNKNOWN_%02X" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "美国" @@ -5399,19 +5490,21 @@ msgid "" "Unable to create patch from given values.\n" "Entry not modified." msgstr "" +"无法从给出的值中创建补ä¸ã€‚\n" +"项目未修正。" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 -#, c-format +#, fuzzy, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -"ä¸èƒ½å°†è¾“入的动作回放代ç çš„第 %lu 行作为加密或解密的代ç åˆ†æžã€‚ 请检查是å¦è¾“å…¥" -"正确。\n" -"是å¦å¿½ç•¥æ­¤è¡Œç»§ç»­åˆ†æžï¼Ÿ" +"无法将所输入 AR 代ç çš„第 %lu 行作为有效的加密或解密代ç è¿›è¡Œåˆ†æžã€‚ 请确ä¿ä»£ç " +"输入正确。\n" +"是å¦è¦å¿½ç•¥æ­¤è¡Œç»§ç»­åˆ†æž?" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "未定义的 %i" @@ -5421,19 +5514,18 @@ msgid "Undo Load State" msgstr "撤销载入状æ€" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "撤销载入状æ€" +msgstr "撤销ä¿å­˜çŠ¶æ€" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." -msgstr "" +msgstr "æ„外的 0x80 呼å«? 正在中止..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "未知" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "未知 DVD 命令 %08x - 致命错误" @@ -5441,46 +5533,46 @@ msgstr "未知 DVD 命令 %08x - 致命错误" #: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp:444 #, c-format msgid "Unknown command 0x%08x" -msgstr "" +msgstr "未知指令 0x%08x" #: Source/Core/Common/Src/SysConf.cpp:132 #, c-format msgid "Unknown entry type %i in SYSCONF (%s@%x)!" -msgstr "Unknown entry type %i in SYSCONF (%s@%x)!" +msgstr "未知的项目类型 %i 在 SYSCONF (%s@%x)!" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" -msgstr "Unknown message received with id : %d" +msgstr "收到未知的消æ¯ï¼ŒID: %d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" -msgstr "Unknown message with id:%d received from player:%d Kicking player!" +msgstr "收到未知的消æ¯ï¼ŒID:%d æ¥è‡ªçŽ©å®¶:%d 剔除玩家!" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:262 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:43 msgid "Up" -msgstr "上" +msgstr "å‘上键" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "æ›´æ–°" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" -msgstr "ç›´æ¡ Wiimote" +msgstr "ç›´æ¡ Wii 控制器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" -msgstr "使用 EuRGB60 æ¨¡å¼ (PAL60)" +msgstr "使用欧洲 RGB60 æ¨¡å¼ (PAL60)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:295 msgid "Use Fullscreen" msgstr "å…¨å±æ˜¾ç¤º" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "使用å六进制" @@ -5495,6 +5587,10 @@ msgid "" "\n" "If unsure, leave this checked." msgstr "" +"使用精确度较低的算法计算深度值。\n" +"在一些游æˆä¸­å°†å¯¼è‡´é—®é¢˜ä½†å¯èƒ½å¸¦æ¥å¯è§‚çš„æ速。\n" +"\n" +"如果ä¸èƒ½ç¡®å®šï¼Œè¯·å‹¾é€‰æ­¤é¡¹ã€‚" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:123 msgid "" @@ -5504,10 +5600,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "使用多个线程解ç çº¹ç†ã€‚\n" -"å¯èƒ½å¸¦æ¥æ速(尤其在å«æœ‰å¤šäºŽä¸¤ä¸ªæ ¸å¿ƒçš„CPU上)。\n" +"å¯èƒ½å¸¦æ¥æ速 (尤其在å«æœ‰å¤šäºŽä¸¤ä¸ªæ ¸å¿ƒçš„ CPU 上)。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" +"使用ä¸ç¨³å®šçš„方法æ¥åŠ é€Ÿ OpenGL 的顶点æµã€‚在已支æŒ\n" +"çš„ GPU 中尚未å‘现问题,å之则å¯èƒ½ä¼šé€ æˆä¸¥é‡çš„稳定\n" +"性åŠå›¾åƒçš„问题。\n" +"\n" +"如果ä¸ç¡®å®šï¼Œä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5529,12 +5639,11 @@ msgstr "实用扩展" msgid "V-Sync" msgstr "åž‚ç›´åŒæ­¥" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU 速度破解" +msgstr "VBeam 破解加速" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "值" @@ -5542,7 +5651,7 @@ msgstr "值" msgid "Value:" msgstr "值:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "值: " @@ -5552,9 +5661,9 @@ msgstr "详细" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:505 msgid "Vertex Streaming Hack" -msgstr "" +msgstr "顶点æµç ´è§£" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "视频" @@ -5562,19 +5671,19 @@ msgstr "视频" msgid "Virtual" msgstr "虚拟" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "音é‡" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD 安装失败: 创建 %s 错误" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" -msgstr "" +msgstr "WAD 安装失败:创建标签错误" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:84 msgid "" @@ -5584,7 +5693,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "等待场消éšæœŸä»¥å‡å°‘撕裂。\n" -"模拟速度低于100%时会é™ä½Žæ€§èƒ½ã€‚\n" +"模拟速度低于 100% 时会é™ä½Žæ€§èƒ½ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -5594,19 +5703,19 @@ msgstr "" msgid "Warning" msgstr "警告" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" -msgstr "Warning - starting DOL in wrong console mode!" +msgstr "警告 - 正在错误的终端模å¼ä¸‹å¼€å§‹ DOLï¼" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" -msgstr "Warning - starting ELF in wrong console mode!" +msgstr "警告 - 正在错误的终端模å¼ä¸‹å¼€å§‹ ELFï¼" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" -msgstr "Warning - starting ISO in wrong console mode!" +msgstr "警告 - 正在错误的终端模å¼ä¸‹å¼€å§‹ ISOï¼" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5625,27 +5734,31 @@ msgid "" "and have the same name as a file on your memcard\n" "Continue?" msgstr "" -"警告: 这会覆盖以下文件夹中与您的记忆å¡é‡Œçš„文件åŒå的任何已存在存档:\n" +"警告: 这会覆盖以下文件夹中与您的存储å¡é‡Œæ–‡ä»¶åŒå的任何已有存档:\n" "%s\n" "è¦ç»§ç»­å—?" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " "%u > %u) (frame %u > %u). You should load another save before continuing, or " "load this state with read-only mode off." msgstr "" +"警告: 您读å–的存档在当å‰å½±ç‰‡ç»“æŸä¹‹åŽã€‚ (字节%u > %u) (帧%u > %u) 。您需è¦è¯»å–" +"å¦ä¸€ä¸ªå­˜æ¡£æ–¹å¯ç»§ç»­ï¼Œæˆ–关闭åªè¯»æ¨¡å¼å†è¯»å–此状æ€å­˜æ¡£ã€‚" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " "should load another save before continuing, or load this state with read-" "only mode off. Otherwise you'll probably get a desync." msgstr "" +"警告: 您读å–的存档在 %d (0x%X) 字节处与影片ä¸åŒ¹é…。您需è¦è¯»å–å¦ä¸€ä¸ªå­˜æ¡£æ–¹å¯ç»§" +"续,或关闭åªè¯»æ¨¡å¼å†è¯»å–此状æ€å­˜æ¡£ã€‚å¦åˆ™å°†å¯èƒ½å‘生ä¸åŒæ­¥ã€‚" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5663,6 +5776,18 @@ msgid "" "Start=%d, A=%d, B=%d, X=%d, Y=%d, Z=%d, DUp=%d, DDown=%d, DLeft=%d, DRight=" "%d, L=%d, R=%d, LT=%d, RT=%d, AnalogX=%d, AnalogY=%d, CX=%d, CY=%d" msgstr "" +"警告: 您所读å–存档的第%d帧与影片ä¸åŒ¹é…。您需è¦è¯»å–å¦ä¸€ä¸ªå­˜æ¡£æ–¹å¯ç»§ç»­ï¼Œæˆ–关闭" +"åªè¯»æ¨¡å¼å†è¯»å–此状æ€å­˜æ¡£ã€‚å¦åˆ™å°†å¯èƒ½å‘生ä¸åŒæ­¥ã€‚\n" +"\n" +"更多信æ¯: 当å‰å½±ç‰‡é•¿åº¦ä¸º%d帧而状æ€å­˜æ¡£çš„影片长度为%d帧。\n" +"\n" +"在第%d帧,当å‰å½±ç‰‡æŒ‰ä¸‹äº†:\n" +"Start=%d, A=%d, B=%d, X=%d, Y=%d, Z=%d, DUp=%d, DDown=%d, DLeft=%d, DRight=" +"%d, L=%d, R=%d, LT=%d, RT=%d, AnalogX=%d, AnalogY=%d, CX=%d, CY=%d\n" +"\n" +"在第%d帧,状æ€å­˜æ¡£çš„影片按下了:\n" +"Start=%d, A=%d, B=%d, X=%d, Y=%d, Z=%d, DUp=%d, DDown=%d, DLeft=%d, DRight=" +"%d, L=%d, R=%d, LT=%d, RT=%d, AnalogX=%d, AnalogY=%d, CX=%d, CY=%d" #: Source/Core/AudioCommon/Src/WaveFile.cpp:96 #: Source/Core/AudioCommon/Src/WaveFile.cpp:119 @@ -5671,11 +5796,11 @@ msgstr "波形文件写入器 - 文件未打开." #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp:60 msgid "Whammy" -msgstr "Whammy" +msgstr "颤音" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:409 msgid "Widescreen Hack" -msgstr "宽å±ç ´è§£" +msgstr "强制宽å±" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:300 msgid "Width" @@ -5685,19 +5810,15 @@ msgstr "宽度" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" -msgstr "Wii控制å°" +msgstr "Wii 控制å°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" -msgstr "Wii NAND 根目录:" +msgstr "Wii NAND 根目录:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "导入 Wii 存档" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii 存档文件 (*.bin)|*.bin" @@ -5706,57 +5827,63 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD: ä¸èƒ½ä»Žæ–‡ä»¶è¯»å–" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" -msgstr "Wiié¥æŽ§å™¨" +msgstr "Wii 控制器" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wii 控制器" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" -msgstr "Wiié¥æŽ§å™¨ %i" +msgstr "Wii 控制器 %i" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" -msgstr "Wiié¥æŽ§å™¨å·²è¿žæŽ¥" +msgstr "Wii 控制器已连接" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:108 msgid "Wiimote Motor" -msgstr "Wiimote 马达" +msgstr "Wii 控制器马达" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" -msgstr "Wiié¥æŽ§å™¨è®¾ç½®" +msgstr "Wii 控制器设置" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:48 msgid "Wiimotes" -msgstr "Wiié¥æŽ§å™¨" +msgstr "Wii 控制器" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:121 msgid "Windows Left" -msgstr "窗å£å·¦ä¾§" +msgstr "å·¦ Windows" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:123 msgid "Windows Menu" -msgstr "窗å£èœå•" +msgstr "èœå•é”®" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:122 msgid "Windows Right" -msgstr "窗å£å³ä¾§" +msgstr "å³ Windows" #: Source/Core/DolphinWX/Src/LogWindow.cpp:124 msgid "Word Wrap" msgstr "自动æ¢è¡Œ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "工作中..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" -msgstr "" +msgstr "å†™å…¥å­˜å‚¨å¡ (GC)" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:46 msgid "Write to Console" @@ -5774,24 +5901,39 @@ msgstr "写入到文件" msgid "Write to Window" msgstr "写入到窗å£" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 CreateSourceVoice failed: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" -msgstr "XAudio2 init failed: %#X" +msgstr "XAudio2 加载失败: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" -msgstr "XAudio2 master voice creation failed: %#X" +msgstr "XAudio2 主声音创建失败: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 CreateSourceVoice failed: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 加载失败: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 主声音创建失败: %#X" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" -msgstr "" +msgstr "XF 注册" #: Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp:25 msgid "Yellow" @@ -5803,39 +5945,39 @@ msgid "" "All Wii games will work correctly, and most GC games should also work fine, " "but the GBA/IPL/CARD UCodes will not work.\n" msgstr "" -"您正在使用Dolphin团队制作的自由DSP ROM。\n" -"所有Wii游æˆéƒ½èƒ½æ­£ç¡®è¿è¡Œï¼Œå¤šæ•°GC游æˆä¹Ÿå°†è¿è¡Œè‰¯å¥½ï¼Œä½†GBA/IPL/CARD UCode将无法è¿" -"行。\n" +"您正在使用 Dolphin 团队制作的自由 DSP ROM。\n" +"所有 Wii 游æˆéƒ½èƒ½æ­£ç¡®è¿è¡Œï¼Œå¤šæ•°GC游æˆä¹Ÿå°†è¿è¡Œè‰¯å¥½ï¼Œä½†GBA/IPL/CARD UCode将无法" +"è¿è¡Œã€‚\n" #: Source/Core/Core/Src/DSP/DSPCore.cpp:116 msgid "" "You are using an old free DSP ROM made by the Dolphin Team.\n" "Only games using the Zelda UCode will work correctly.\n" msgstr "" -"您正在使用Dolphin团队制作的旧版自由DSP ROM。\n" -"åªæœ‰å¡žå°”è¾¾UCode的游æˆèƒ½å¤Ÿæ­£ç¡®è¿è¡Œã€‚\n" +"您正在使用 Dolphin 团队制作的旧版自由 DSP ROM。\n" +"åªæœ‰ä½¿ç”¨å¡žå°”è¾¾ UCode 的游æˆèƒ½å¤Ÿæ­£ç¡®è¿è¡Œã€‚\n" #: Source/Core/DolphinWX/Src/FrameAui.cpp:63 msgid "You can't close panes that have pages in them." -msgstr "You can't close panes that have pages in them." +msgstr "ä½ ä¸èƒ½å…³é—­å«æœ‰é¡µé¢çš„é¢æ¿ã€‚" #: Source/Core/DolphinWX/Src/NetWindow.cpp:240 msgid "You must choose a game!!" msgstr "您必须选择一个游æˆ!!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "您必须输入一个å称!" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." -msgstr "您必须输入一个å进制或者å六进制值." +msgstr "您必须输入一个有效的å进制ã€å六进制或八进制值。" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:655 msgid "You must enter a valid profile name." -msgstr "您必须输入一个有效的é…置文件å称." +msgstr "您必须输入一个有效的预设å称。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." msgstr "您必须é‡æ–°å¯åŠ¨Dolphin以使改动生效。 " @@ -5846,16 +5988,16 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" "您的DSP ROM校检ä¸æ­£ç¡®ã€‚\n" -"是å¦è¦çŽ°åœ¨åœæ­¢ä»¥å¤„ç†è¿™ä¸ªé—®é¢˜ï¼Ÿ\n" +"是å¦è¦çŽ°åœ¨åœæ­¢ä»¥å¤„ç†è¿™ä¸ªé—®é¢˜?\n" "如果选择“å¦â€ï¼Œå£°éŸ³å¯èƒ½ä¼šå‡ºçŽ°æ··ä¹±ã€‚" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" msgstr "" "您的 GCM/ISO 文件似乎是无效的 (无效的国家)。\n" -"是å¦è¦ä½¿ç”¨ PAL 地区继续?" +"是å¦è¦ä½¿ç”¨ PAL 地区继续?" #: Source/Core/Common/Src/SysConf.cpp:45 #, c-format @@ -5866,20 +6008,20 @@ msgid "" msgstr "" "您的 SYSCONF 文件大å°ä¸æ­£ç¡®ã€‚\n" "正确的大å°ä¸º 0x%04x (但您的是 0x%04llx)\n" -"是å¦è¦ç”Ÿæˆä¸€ä¸ªæ–°çš„?" +"是å¦è¦ç”Ÿæˆä¸€ä¸ªæ–°çš„?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" -msgstr "ZTP 破解" +msgstr "塞尔达传说:黄æ˜å…¬ä¸» 修正" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "Zero 3 代ç ä¸æ”¯æŒ" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" -msgstr "Zero code unknown to dolphin: %08x" +msgstr "Dophin 未知的 Zero 代ç : %08x" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:480 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:504 @@ -5894,7 +6036,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "[故障中]\n" -"高亮显示EFB所å¤åˆ¶çš„区域。\n" +"高亮显示 EFB 所å¤åˆ¶çš„区域。\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -5913,9 +6055,10 @@ msgid "" "If unsure, leave this unchecked." msgstr "" "[实验性]\n" -"使用OpenCL框架将纹ç†è§£ç å·¥ä½œè½¬è½½è‡³GPU旨在æ高模拟速度。\n" -"然而目å‰å·²çŸ¥åœ¨å¤šæ¬¾æ¸¸æˆä¸­ä¼šå¯¼è‡´çº¹ç†ç¼ºé™·ã€‚并且多数情况下比常规的CPU纹ç†è§£ç è¦" -"慢。\n" +"使用 OpenCL 框架将纹ç†è§£ç å·¥ä½œè½¬è½½è‡³ GPU 旨在\n" +"æ高模拟速度。\n" +"然而目å‰å·²çŸ¥åœ¨å¤šæ¬¾æ¸¸æˆä¸­ä¼šå¯¼è‡´çº¹ç†ç¼ºé™·ã€‚并且\n" +"多数情况下比常规的 CPU 纹ç†è§£ç è¦æ…¢ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" @@ -5929,86 +6072,84 @@ msgid "" msgstr "" "[实验性]\n" "通过缓存显示列表略微æ高模拟速度。\n" -"å¦ä¸€æ–¹é¢ä¹Ÿå¯èƒ½äº§ç”Ÿé—®é¢˜ã€‚\n" +"然而也å¯èƒ½äº§ç”Ÿé—®é¢˜ã€‚\n" "\n" "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "应用程åºè½½å…¥å™¨ (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT: Reading Opcode from %x. Please report." - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" -msgstr "" +msgstr "s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "未知的类型 %d (预期为 %d)" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "接收到未知消æ¯" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute returned -1 on application run!" #: Source/Core/DolphinWX/Src/PHackSettings.cpp:43 msgid "zFar Correction: " -msgstr "zFar 修正: " +msgstr "远剪è£å¹³é¢ä¿®æ­£: " #: Source/Core/DolphinWX/Src/PHackSettings.cpp:38 msgid "zNear Correction: " -msgstr "zNear 修正: " +msgstr "近剪è£å¹³é¢ä¿®æ­£: " #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:545 msgid "| OR" msgstr "| 或" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "精确VBeam模拟" +#~ msgid "Could not create %s" +#~ msgstr "无法创建 %s" + +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" + +#~ msgid "Edit Local Overrides" +#~ msgstr "编辑本地覆盖设置" + +#~ msgid "Opens the user specified overrides in an external text editor." +#~ msgstr "在外部文本编辑器中打开用户指定的覆盖设置。" #~ msgid "" -#~ "Allows toggling certain options via the hotkeys 3 (Internal Resolution), " -#~ "4 (Aspect Ratio), 5 (Copy EFB) and 6 (Fog) within the emulation window.\n" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" #~ "\n" -#~ "If unsure, leave this unchecked." +#~ "If unsure, use Direct3D 11." #~ msgstr "" -#~ "å…许在模拟窗å£ä¸­é€šè¿‡ä»¥ä¸‹å¿«æ·é”®åˆ‡æ¢ç‰¹å®šé€‰é¡¹ï¼š3(内部分辨率)ã€4(宽高比)ã€" -#~ "5(å¤åˆ¶EFB)和6(雾)。\n" +#~ "选择供内部使用的图åƒåº”用程åºæŽ¥å£ã€‚\n" +#~ "Direct3D 9 通常最快,而 OpenGL 会更加精确,\n" +#~ "Direct3D 11 介乎两者之间。\n" +#~ "è¯·æ³¨æ„ Direct3D åŽç«¯åªåœ¨ Windows 下å¯ç”¨ã€‚\n" #~ "\n" -#~ "如果没有把æ¡ï¼Œè¯·ä¸è¦å‹¾é€‰æ­¤é¡¹ã€‚" - -#~ msgid "Enable Hotkeys" -#~ msgstr "å¯ç”¨çƒ­é”®" - -#~ msgid "Failed to Listen!!" -#~ msgstr "监å¬å¤±è´¥!!" - -#~ msgid "Failed to load bthprops.cpl" -#~ msgstr "加载bthprops.cpl失败" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "ä¸èƒ½è½½å…¥ hid.dll" - -#~ msgid "GCMic Configuration" -#~ msgstr "GCMicé…ç½®" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY 被调用, 请报告bug!" +#~ "如果没有把æ¡ï¼Œè¯·é€‰æ‹© Direct3D 11。" #~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "如果帧率ä¸ç¨³å®šï¼Œæ­¤é€‰é¡¹å¯èƒ½æœ‰æ‰€å¸®åŠ© (ON = 兼容, OFF = 快速)" +#~ "Selects what graphics API to use internally.\n" +#~ "Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " +#~ "Direct3D 11 is somewhere between the two.\n" +#~ "Note that the Direct3D backends are only available on Windows.\n" +#~ "\n" +#~ "If unsure, use OpenGL." +#~ msgstr "" +#~ "选择内部使用哪ç§å›¾åƒåº”用程åºæŽ¥å£ã€‚\n" +#~ "Direct3D 9 通常最快,而 OpenGL 更加精确,\n" +#~ "Direct3D 11 介乎两者之间。\n" +#~ "è¯·æ³¨æ„ Direct3D åŽç«¯åªåœ¨ Windows 下å¯ç”¨ã€‚\n" +#~ "\n" +#~ "如果没有把æ¡ï¼Œè¯·é€‰æ‹© OpenGL。" -#~ msgid "Last Overwritten State" -#~ msgstr "最åŽè¦†ç›–状æ€" - -#~ msgid "Last Saved State" -#~ msgstr "最åŽä¿å­˜çŠ¶æ€" - -#~ msgid "Reconnect Wiimote on State Loading" -#~ msgstr "读å–状æ€æ—¶é‡è¿žWiié¥æŽ§å™¨" - -#~ msgid "Set" -#~ msgstr "设置" - -#~ msgid "Skip Dest. Alpha Pass" -#~ msgstr "忽略目标Alpha通é“" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT: Reading Opcode from %x. Please report." diff --git a/Languages/po/zh_TW.po b/Languages/po/zh_TW.po index 3f601cf917..112c576df3 100644 --- a/Languages/po/zh_TW.po +++ b/Languages/po/zh_TW.po @@ -4,12 +4,13 @@ # # Translators: # khiav , 2011 +# Sentret_C , 2013 msgid "" msgstr "" "Project-Id-Version: Dolphin Emulator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-17 09:30-0500\n" -"PO-Revision-Date: 2013-04-04 08:13+0000\n" +"POT-Creation-Date: 2013-11-03 08:51-0600\n" +"PO-Revision-Date: 2013-09-10 08:16+0000\n" "Last-Translator: delroth \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/dolphin-" "emu/language/zh_TW/)\n" @@ -19,13 +20,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:516 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:518 msgid " (too many to display)" msgstr " (è¦é¡¯ç¤ºçš„項目太多)" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:292 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:519 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:556 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:295 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:527 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:564 msgid " Game : " msgstr " éŠæˆ²ï¼š" @@ -33,7 +34,7 @@ msgstr " éŠæˆ²ï¼š" msgid "! NOT" msgstr "! éž" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:58 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:23 #, c-format msgid "" "\"%s\" does not exist.\n" @@ -42,7 +43,7 @@ msgstr "" "\"%s\" ä¸å­˜åœ¨ã€‚\n" " 是å¦å»ºç«‹æ–°çš„ 16MB 記憶å¡ï¼Ÿ" -#: Source/Core/Core/Src/CoreParameter.cpp:136 +#: Source/Core/Core/Src/CoreParameter.cpp:144 #, c-format msgid "\"%s\" is an invalid GCM/ISO file, or is not a GC/Wii ISO." msgstr "\"%s\" 為無效的 GCM/ISO æª”æ¡ˆï¼Œæˆ–éž GC/Wii ISO。" @@ -57,64 +58,69 @@ msgstr "" msgid "%1$sCopy%1$s" msgstr "%1$s複製%1$s" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:120 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:121 #, c-format msgid "%d samples" msgstr "" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:119 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:120 #, c-format msgid "%d samples (quality level %d)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:121 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:289 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:165 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 #, c-format msgid "%s already exists, overwrite?" msgstr "%s 已經存在,是å¦è¦†å¯«ï¼Ÿ" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:154 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:153 #, c-format msgid "%s failed to be scrubbed. Probably the image is corrupt." msgstr "抹除 %s 失敗。也許檔案是ä¸æ­£ç¢ºçš„。" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:48 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card file size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:98 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:63 #, c-format msgid "" "%s failed to load as a memorycard \n" " Card size is invalid (0x%x bytes)" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:78 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:43 #, c-format msgid "" "%s failed to load as a memorycard \n" "file is not large enough to be a valid memory card file (0x%x bytes)" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:359 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:410 #, c-format msgid "%s failed to open" msgstr "é–‹å•Ÿ %s 失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:352 +#: Source/Core/Core/Src/x64MemTools.cpp:154 +#, c-format +msgid "%s failed: kr=%x" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:403 #, c-format msgid "%s is a 0 byte file" msgstr "%s 為 0 ä½å…ƒçš„檔案" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:146 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:145 #, c-format msgid "%s is already compressed! Cannot compress it further." msgstr "%s 已經被壓縮éŽäº†ï¼ç„¡æ³•å†æ¬¡é€²è¡Œå£“縮。" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:337 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:388 #, c-format msgid "%s is too long for the filename, max chars is 45" msgstr "%s åšç‚ºæª”å太長了,最多å…許 45 個ä½å…ƒ" @@ -143,7 +149,7 @@ msgstr "剩餘 %u 個å€å¡Šï¼›å‰©é¤˜ %u 個目錄項目" msgid "&& AND" msgstr "å’Œ(&&)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:303 msgid "&About..." msgstr "關於(&A)..." @@ -151,7 +157,7 @@ msgstr "關於(&A)..." msgid "&Boot from DVD Drive..." msgstr "從 DVD 光碟機啟動(&B)..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 msgid "&Breakpoints" msgstr "中斷點(&B)" @@ -159,7 +165,7 @@ msgstr "中斷點(&B)" msgid "&Browse for ISOs..." msgstr "ç€è¦½ ISO 檔(&B)..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:195 msgid "&Cheats Manager" msgstr "作弊檔管ç†å™¨(&C)" @@ -167,11 +173,11 @@ msgstr "作弊檔管ç†å™¨(&C)" msgid "&DSP Settings" msgstr "DSP 設定(&D)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:879 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 msgid "&Delete ISO..." msgstr "刪除 ISO 檔(&D)..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:900 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 msgid "&Delete selected ISOs..." msgstr "刪除已é¸å–çš„ ISO 檔(&D)..." @@ -183,11 +189,11 @@ msgstr "模擬器(&E)" msgid "&File" msgstr "檔案(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:341 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:343 msgid "&Frame Advance" msgstr "畫格步進(&F)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:358 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:360 msgid "&Fullscreen" msgstr "全螢幕(&F)" @@ -195,7 +201,7 @@ msgstr "全螢幕(&F)" msgid "&Graphics Settings" msgstr "å½±åƒè¨­å®š(&G)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:302 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:304 msgid "&Help" msgstr "說明(&H)" @@ -203,7 +209,7 @@ msgstr "說明(&H)" msgid "&Hotkey Settings" msgstr "å¿«æ·éµè¨­å®š(&D)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 msgid "&JIT" msgstr "&JIT" @@ -215,11 +221,11 @@ msgstr "讀å–進度(&L)" msgid "&Memcard Manager (GC)" msgstr "GC 記憶å¡ç®¡ç†å™¨(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:235 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:236 msgid "&Memory" msgstr "記憶å¡(&M)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:319 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:321 msgid "&Open..." msgstr "é–‹å•Ÿ(&O)..." @@ -227,51 +233,51 @@ msgstr "é–‹å•Ÿ(&O)..." msgid "&Options" msgstr "é¸é …(&O)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:330 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 msgid "&Pause" msgstr "æš«åœ(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:332 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:334 msgid "&Play" msgstr "執行(&P)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:852 msgid "&Properties" msgstr "屬性(&P)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:354 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:356 msgid "&Read-only mode" msgstr "唯讀模å¼(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:325 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:327 msgid "&Refresh List" msgstr "更新列表(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:233 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:234 msgid "&Registers" msgstr "寄存器(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:338 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:340 msgid "&Reset" msgstr "é‡æ–°å•Ÿå‹•(&R)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:237 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 msgid "&Sound" msgstr "è²éŸ³(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:335 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:337 msgid "&Stop" msgstr "åœæ­¢(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:210 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:211 msgid "&Tools" msgstr "工具(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:238 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:239 msgid "&Video" msgstr "å½±åƒ(&V)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:288 msgid "&View" msgstr "檢視(&V)" @@ -279,7 +285,7 @@ msgstr "檢視(&V)" msgid "&Wiimote Settings" msgstr "Wiimote 設定(&W)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:853 msgid "&Wiki" msgstr "&Wiki" @@ -304,9 +310,8 @@ msgid "(off)" msgstr "(關閉)" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:559 -#, fuzzy msgid "+ ADD" -msgstr "^ 新增" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:663 msgid "0x44" @@ -316,7 +321,7 @@ msgstr "" msgid "1.5x Native (960x792)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 msgid "16 bit" msgstr "16 ä½å…ƒ" @@ -332,7 +337,7 @@ msgstr "" msgid "2x Native (1280x1056)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:149 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:148 msgid "32 bit" msgstr "32 ä½å…ƒ" @@ -348,7 +353,7 @@ msgstr "" msgid "4x Native (2560x2112)" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:147 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:146 msgid "8 bit" msgstr "8 ä½å…ƒ" @@ -360,7 +365,7 @@ msgstr "<æ’å…¥å稱>" msgid "" msgstr "<無解æžåº¦è¨­å®š>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:85 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:87 msgid "" msgstr "<ç„¡>" @@ -368,7 +373,7 @@ msgstr "<ç„¡>" msgid "" msgstr "<按任æ„éµ>" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:288 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 msgid "" msgstr "<系統>" @@ -377,12 +382,12 @@ msgid "A" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:234 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:267 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:270 msgid "A NetPlay window is already open!!" msgstr "已經開啟一個網路å°æˆ°è¦–窗ï¼ï¼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:370 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:404 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:372 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:406 msgid "A game is not currently running." msgstr "ç›®å‰æ²’有執行éŠæˆ²ã€‚" @@ -393,7 +398,6 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/NetWindow.cpp:104 -#, fuzzy msgid "" "ALERT:\n" "\n" @@ -402,36 +406,22 @@ msgid "" " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" -" - Manually set the exact number of controllers to be used to [Standard " -"Controller]\n" +" - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" -"Wiimote support has not been implemented!\n" +"Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n" msgstr "" -"警告:\n" -"\n" -"網路å°æˆ°ç›®å‰åªèƒ½åœ¨ä¸‹åˆ—ç‹€æ³ä¸‹æ­£å¸¸ä½¿ç”¨ 設定:\n" -" - 雙核心 [關閉]\n" -" - è²éŸ³éŽ–定 [關閉]\n" -" - DSP-HLE 使用 \"ç„¡è²éŸ³\" 或 DSP-LLE\n" -" - 手動設定的é¡å¤–控制器設定為使用 [標準控制器]\n" -"\n" -"所有玩家應該使用相åŒç‰ˆæœ¬çš„ Dolphin 和設定。\n" -"åœç”¨æ‰€æœ‰è¨˜æ†¶å¡æˆ–者在開始之å‰ä½¿ç”¨å‚³é€ã€‚\n" -"Wiimote 支æ´å°šæœªå®Œæˆã€‚\n" -"\n" -"您必須至主機的 TCP 埠å£é€²è¡Œè¨­å®šï¼ï¼" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:100 msgid "AM-Baseboard" msgstr "AM-Baseboard" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:105 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:300 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:104 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 msgid "AR Codes" msgstr "AR 代碼" @@ -475,20 +465,20 @@ msgstr "" "兇手代碼:\n" "%s" -#: Source/Core/Core/Src/ActionReplay.cpp:657 +#: Source/Core/Core/Src/ActionReplay.cpp:663 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Add Code (%s)" msgstr "Action Replay éŒ¯èª¤ï¼šç„¡æ•ˆçš„å¤§å° (%08x : ä½å€ = %08x) 於添加的代碼 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:745 +#: Source/Core/Core/Src/ActionReplay.cpp:751 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Fill and Slide " "(%s)" msgstr "Action Replay éŒ¯èª¤ï¼šç„¡æ•ˆçš„å¤§å° (%08x : ä½å€ = %08x) 於輸入 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:537 +#: Source/Core/Core/Src/ActionReplay.cpp:543 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Ram Write And " @@ -496,7 +486,7 @@ msgid "" msgstr "" "Action Replay éŒ¯èª¤ï¼šç„¡æ•ˆçš„å¤§å° (%08x : ä½å€ = %08x) æ–¼ Ram å¯«å…¥åŠ è¼¸å…¥ (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:597 +#: Source/Core/Core/Src/ActionReplay.cpp:603 #, c-format msgid "" "Action Replay Error: Invalid size (%08x : address = %08x) in Write To " @@ -504,39 +494,39 @@ msgid "" msgstr "" "Action Replay éŒ¯èª¤ï¼šç„¡æ•ˆçš„å¤§å° (%08x : ä½å€ = %08x) 於寫入至 指示器 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:792 +#: Source/Core/Core/Src/ActionReplay.cpp:798 #, c-format msgid "Action Replay Error: Invalid value (%08x) in Memory Copy (%s)" msgstr "Action Replay 錯誤:無效的數值 (%08x) 於記憶體複製 (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:672 +#: Source/Core/Core/Src/ActionReplay.cpp:678 #, c-format msgid "" "Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)\n" "Master codes are not needed. Do not use master codes." msgstr "" -#: Source/Core/Core/Src/ActionReplay.cpp:184 +#: Source/Core/Core/Src/ActionReplay.cpp:188 #, c-format msgid "Action Replay Error: invalid AR code line: %s" msgstr "Action Replay 錯誤:無效的 AR 代碼行: %s" -#: Source/Core/Core/Src/ActionReplay.cpp:862 +#: Source/Core/Core/Src/ActionReplay.cpp:868 #, c-format msgid "Action Replay: Conditional Code: Invalid Size %08x (%s)" msgstr "Action Replay:有æ¢ä»¶çš„ä»£ç¢¼ï¼šç„¡æ•ˆçš„å¤§å° %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:935 +#: Source/Core/Core/Src/ActionReplay.cpp:941 #, c-format msgid "Action Replay: Invalid Normal Code Type %08x (%s)" msgstr "Action Replay:無效的一般代碼類型 %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:886 +#: Source/Core/Core/Src/ActionReplay.cpp:892 #, c-format msgid "Action Replay: Normal Code %i: Invalid subtype %08x (%s)" msgstr "Action Replay:一般代碼 %i: 無效的副類型 %08x (%s)" -#: Source/Core/Core/Src/ActionReplay.cpp:828 +#: Source/Core/Core/Src/ActionReplay.cpp:834 #, c-format msgid "Action Replay: Normal Code 0: Invalid Subtype %08x (%s)" msgstr "Action Replay:一般代碼 0: 無效的副類型 %08x (%s)" @@ -550,11 +540,11 @@ msgstr "é…接器:" msgid "Add" msgstr "新增" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1369 msgid "Add ActionReplay Code" msgstr "新增 ActionReplay 代碼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1249 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1288 msgid "Add Patch" msgstr "新增修正" @@ -562,9 +552,9 @@ msgstr "新增修正" msgid "Add new pane" msgstr "新增é¢ç‰ˆ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:408 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:430 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:799 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:440 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:462 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 msgid "Add..." msgstr "新增..." @@ -619,32 +609,32 @@ msgstr "進階" msgid "Advanced Settings" msgstr "進階設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:618 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:619 msgid "All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 msgid "All GC/Wii images (gcm, iso, wbfs, ciso, gcz)" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1193 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1183 msgid "All Gamecube GCM files (gcm)" msgstr "所有 Gamecube GCM 檔案 (gcm)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1464 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1480 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1494 msgid "All Save States (sav, s##)" msgstr "所有å³æ™‚存檔 (sav, s##)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1191 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1181 msgid "All Wii ISO files (iso)" msgstr "所有 Wii ISO 檔案 (iso)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1201 msgid "All compressed GC/Wii ISO files (gcz)" msgstr "所有已壓縮的 GC/Wii ISO 檔案 (gcz)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:106 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:108 msgid "All files (*.*)|*.*" msgstr "所有檔案 (*.*)|*.*" @@ -664,19 +654,19 @@ msgstr "å„å‘異性éŽæ¿¾ï¼š" msgid "Anti-Aliasing:" msgstr "邊緣抗鋸齒:" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:299 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:298 msgid "Apploader is the wrong size...is it really an apploader?" msgstr "程å¼è®€å–器為錯誤的大å°...它是程å¼è®€å–器嗎?" -#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:293 +#: Source/Core/DiscIO/Src/VolumeDirectory.cpp:292 msgid "Apploader unable to load from file" msgstr "程å¼è®€å–器無法從檔案中讀å–" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:829 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:833 msgid "Apploader:" msgstr "程å¼è®€å–器:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:112 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:111 msgid "Apply" msgstr "套用" @@ -687,16 +677,16 @@ msgid "" "If unsure, select (off)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:289 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 msgid "Arabic" -msgstr "" +msgstr "阿拉伯語" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:667 #, c-format msgid "Are you sure you want to delete \"%s\"?" msgstr "是å¦ç¢ºèªåˆªé™¤ \"%s\" ?" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1016 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1006 msgid "" "Are you sure you want to delete these files?\n" "They will be gone forever!" @@ -704,15 +694,19 @@ msgstr "" "是å¦çœŸçš„è¦åˆªé™¤é€™äº›æª”案?\n" "刪了之後就回ä¸ä¾†äº†å“¦ï¼" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1007 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:997 msgid "Are you sure you want to delete this file? It will be gone forever!" msgstr "是å¦çœŸçš„è¦åˆªé™¤é€™äº›æª”案?刪了之後就回ä¸ä¾†äº†å“¦ï¼" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:44 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:45 msgid "Arm JIT (experimental)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:777 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +msgid "Arm JITIL (experimental)" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:781 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:286 msgid "Aspect Ratio:" msgstr "ç•«é¢æ¯”例:" @@ -721,12 +715,12 @@ msgstr "ç•«é¢æ¯”例:" msgid "At least one pane must remain open." msgstr "必須剩餘至少一個é¢æ¿ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:249 #: Source/Core/DolphinWX/Src/ConfigMain.cpp:540 msgid "Audio" msgstr "è²éŸ³" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:680 msgid "Audio Backend:" msgstr "è²éŸ³è£ç½®ï¼š" @@ -734,22 +728,22 @@ msgstr "è²éŸ³è£ç½®ï¼š" msgid "AudioCommon: Error opening AO device.\n" msgstr "AudioCommon:開啟 AO è£ç½®å‡ºéŒ¯ã€‚\n" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:246 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:248 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:284 msgid "Auto" msgstr "自動" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:346 msgid "Auto (Multiple of 640x528)" -msgstr "" +msgstr "自動 (640x528 çš„å€æ•¸)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:346 msgid "Auto (Window Size)" -msgstr "" +msgstr "自動 (視窗尺寸)" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:306 msgid "Auto adjust Window Size" -msgstr "" +msgstr "自動調整視窗尺寸" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:77 msgid "" @@ -770,16 +764,16 @@ msgstr "" msgid "Back" msgstr "返回" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:686 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 msgid "Backend Settings" msgstr "è£ç½®è¨­å®š" -#: Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp:47 +#: Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp:47 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:212 msgid "Backend:" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:82 msgid "Background Input" msgstr "背景輸入" @@ -788,7 +782,7 @@ msgstr "背景輸入" msgid "Backward" msgstr "å‘後" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:257 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:305 msgid "Bad File Header" msgstr "æ壞的檔頭" @@ -797,15 +791,15 @@ msgid "Balance Board" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:621 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:293 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 msgid "Banner" msgstr "æ©«å¹…" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:529 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:572 msgid "Banner Details" msgstr "圖示明細" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:491 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:534 msgid "Banner:" msgstr "橫幅:" @@ -825,7 +819,7 @@ msgstr "基本設定" msgid "Bass" msgstr "Bass" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:174 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:139 msgid "Block Allocation Table checksum failed" msgstr "å€å¡Šåˆ†é…表校驗失敗" @@ -846,7 +840,7 @@ msgid "Blue Right" msgstr "è— å³" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:272 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:274 msgid "Bottom" msgstr "下方" @@ -855,27 +849,27 @@ msgstr "下方" msgid "Bound Controls: %lu" msgstr "ç¶å®šæŽ§åˆ¶å™¨ï¼š%lu" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:380 msgid "Broken" msgstr "ç ´æ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse" msgstr "ç€è¦½" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:246 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:247 msgid "Browse for a directory to add" msgstr "ç€è¦½è¦æ–°å¢žçš„資料夾" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 msgid "Browse for an ISO directory..." msgstr "ç€è¦½ ISO 資料夾..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1073 msgid "Browse for output directory" msgstr "ç€è¦½è¼¸å‡ºçš„資料夾" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:348 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:351 msgid "Buffer:" msgstr "ç·©è¡ï¼š" @@ -885,7 +879,7 @@ msgstr "ç·©è¡ï¼š" msgid "Buttons" msgstr "按鈕" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 msgid "" "Bypass the clearing of the data cache by the DCBZ instruction. Usually leave " "this option disabled." @@ -924,33 +918,33 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1877 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:1847 #, c-format msgid "Can't find WiiMote by connection handle %02x" msgstr "" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:672 -#: Source/Core/Core/Src/HW/DVDInterface.cpp:682 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:676 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:686 msgid "Can't read from DVD_Plugin - DVD-Interface: Fatal Error" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:114 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:113 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:28 msgid "Cancel" msgstr "å–消" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:84 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:171 -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:233 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:124 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:219 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:281 #, c-format msgid "Cannot open %s" msgstr "無法開啟 %s" -#: Source/Core/Core/Src/CoreTiming.cpp:128 +#: Source/Core/Core/Src/CoreTiming.cpp:106 msgid "Cannot unregister events with events pending" msgstr "事件未決定時無法註銷事件" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1068 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1072 #, c-format msgid "" "Cannot use that file as a memory card.\n" @@ -958,7 +952,7 @@ msgid "" "is not a valid gamecube memory card file" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1098 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1108 msgid "" "Cannot use that file as a memory card.\n" "Are you trying to use the same file in both slots?" @@ -970,19 +964,19 @@ msgstr "" msgid "Caps Lock" msgstr "Caps Lock" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:290 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 msgid "Catalan" -msgstr "" +msgstr "加泰隆尼亞語" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:299 msgid "Center" msgstr "中心" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:590 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:596 msgid "Change" msgstr "更改" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:322 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:324 msgid "Change &Disc..." msgstr "æ›´æ›å…‰ç¢Ÿ(&D)..." @@ -990,11 +984,11 @@ msgstr "æ›´æ›å…‰ç¢Ÿ(&D)..." msgid "Change Disc" msgstr "æ›´æ›å…‰ç¢Ÿ" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:582 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:588 msgid "Change Game" msgstr "æ›´æ›éŠæˆ²" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:504 msgid "" "Change the language of the user interface.\n" "Requires restart." @@ -1010,11 +1004,11 @@ msgstr "更改 zFar åƒæ•¸ç¬¦è™Ÿ (在修正後)" msgid "Changes sign to zNear Parameter (after correction)" msgstr "更改 zNear åƒæ•¸çš„符號 (在修正後)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:506 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:508 msgid "Changing this will have no effect while the emulator is running!" msgstr "更改此é¸é …在模擬器執行時沒有效果ï¼" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:317 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:320 msgid "Chat" msgstr "èŠå¤©" @@ -1022,47 +1016,47 @@ msgstr "èŠå¤©" msgid "Cheat Code" msgstr "作弊代碼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 msgid "Cheat Search" msgstr "尋找作弊代碼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:17 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:254 msgid "Cheats Manager" msgstr "作弊代碼管ç†å™¨" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:635 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:683 msgid "Check Partition Integrity" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 msgid "Checking integrity..." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:291 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 msgid "Chinese (Simplified)" msgstr "Chinese (Simplified)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:292 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:806 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 msgid "Choose a DVD root directory:" msgstr "é¸æ“‡ä¸€å€‹ DVD 根目錄:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:810 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:814 msgid "Choose a NAND root directory:" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:803 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 msgid "Choose a default ISO:" msgstr "é¸æ“‡ä¸€å€‹é è¨­ ISO:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1228 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1238 msgid "Choose a directory to add" msgstr "é¸æ“‡ä¸€å€‹è¦æ·»åŠ çš„資料夾" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1055 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 msgid "Choose a file to open" msgstr "é¸æ“‡ä¸€å€‹è¦é–‹å•Ÿçš„檔案" @@ -1070,14 +1064,14 @@ msgstr "é¸æ“‡ä¸€å€‹è¦é–‹å•Ÿçš„檔案" msgid "Choose a memory card:" msgstr "é¸æ“‡ä¸€å€‹è¨˜æ†¶å¡ï¼š" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:807 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:811 msgid "" "Choose file to use as apploader: (applies to discs constructed from " "directories only)" msgstr "é¸æ“‡ä½œç‚ºç¨‹å¼è®€å–器的檔案:(åƒ…ç”¨æ–¼ä¾†è®€å– å…‰ç¢Ÿçš„ç›®éŒ„çµæ§‹)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:783 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:824 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:831 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:872 msgid "Choose the folder to extract to" msgstr "é¸æ“‡æå–的資料夾存放ä½ç½®" @@ -1096,7 +1090,7 @@ msgstr "Classic" msgid "Clear" msgstr "清除" -#: Source/Core/Core/Src/NetPlayServer.cpp:265 +#: Source/Core/Core/Src/NetPlayServer.cpp:239 msgid "" "Client disconnect while game is running!! NetPlay is disabled. You must " "manually stop the game." @@ -1104,7 +1098,7 @@ msgstr "在éŠæˆ²åŸ·è¡Œæ™‚客戶端斷開連接ï¼ï¼ç¶²è·¯å°æˆ°å·²ç¶“被關閉 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:284 #: Source/Core/DolphinWX/Src/MemcardManager.cpp:234 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:562 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:606 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:587 msgid "Close" msgstr "關閉" @@ -1113,11 +1107,11 @@ msgstr "關閉" msgid "Co&nfigure..." msgstr "設定(&N)..." -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:63 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 msgid "Code Info" msgstr "代碼訊æ¯" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:573 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:575 msgid "Code: " msgstr "代碼:" @@ -1129,24 +1123,24 @@ msgstr "命令" msgid "Comment" msgstr "註釋" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:489 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:532 msgid "Comment:" msgstr "註釋:" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:887 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:878 msgid "Compress ISO..." msgstr "壓縮 ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:902 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:893 msgid "Compress selected ISOs..." msgstr "壓縮é¸æ“‡çš„ ISO 檔..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Compressing ISO" msgstr "正在壓縮 ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Config" msgstr "設定" @@ -1160,18 +1154,18 @@ msgstr "設定" msgid "Configure Control" msgstr "設定控制器" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:328 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:609 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:331 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:615 msgid "Configure Pads" msgstr "設定控制器" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 msgid "Configure..." msgstr "模擬器設定..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1123 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1151 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1221 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1113 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1141 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1211 msgid "Confirm File Overwrite" msgstr "確èªæª”案覆蓋" @@ -1184,17 +1178,16 @@ msgstr "" msgid "Connect" msgstr "連接" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:375 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:377 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:188 -#, fuzzy msgid "Connect Balance Board" -msgstr "連接 USB éµç›¤" +msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:771 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:775 msgid "Connect USB Keyboard" msgstr "連接 USB éµç›¤" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:373 #, c-format msgid "Connect Wiimote %i" msgstr "連接 Wiimote %i" @@ -1215,7 +1208,7 @@ msgstr "連接 Wiimote 3" msgid "Connect Wiimote 4" msgstr "連接 Wiimote 4" -#: Source/Core/DolphinWX/Src/Main.cpp:658 +#: Source/Core/DolphinWX/Src/Main.cpp:672 msgid "Connecting..." msgstr "正在連接..." @@ -1235,7 +1228,7 @@ msgstr "控制器" msgid "Convert to GCI" msgstr "轉æ›ç‚º GCI" -#: Source/Core/Core/Src/CoreParameter.cpp:376 +#: Source/Core/Core/Src/CoreParameter.cpp:381 msgid "Copy failed" msgstr "複製失敗" @@ -1244,21 +1237,16 @@ msgstr "複製失敗" msgid "Copy to Memcard %c" msgstr "è¤‡è£½è‡³è¨˜æ†¶å¡ %c" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:359 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:391 msgid "Core" msgstr "核心" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:148 -#, c-format -msgid "Could not create %s" -msgstr "無法建立 %s" - -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:62 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:76 #, c-format msgid "Could not initialize backend %s." msgstr "無法åˆå§‹åŒ– backend %s。" -#: Source/Core/Core/Src/CoreParameter.cpp:131 +#: Source/Core/Core/Src/CoreParameter.cpp:139 #, c-format msgid "" "Could not read \"%s\". There is no disc in the drive, or it is not a GC/Wii " @@ -1269,24 +1257,16 @@ msgstr "" "請注æ„,原始的 Gamecube åŠ Wii 光碟在大多數的 PC DVD 光碟機中是無法被正常讀å–" "的。" -#: Source/Core/Core/Src/CoreParameter.cpp:286 +#: Source/Core/Core/Src/CoreParameter.cpp:295 #, c-format msgid "Could not recognize ISO file %s" msgstr "無法識別 ISO 檔案 %s" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:579 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:627 #, c-format msgid "Could not save %s" msgstr "無法儲存 %s" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:577 -msgid "" -"Could not set pads. The player left or the game is currently running!\n" -"(setting pads while the game is running is not yet supported)" -msgstr "" -"無法設置控制器。有玩家存留或者éŠæˆ²æ­£åœ¨åŸ·è¡Œï¼\n" -"(é‚„ä¸æ”¯æ´åœ¨éŠæˆ²åŸ·è¡Œæ™‚設定控制器)" - #: Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp:119 #, c-format msgid "" @@ -1300,11 +1280,11 @@ msgid "" "options." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1152 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1154 msgid "Couldn't find open command for extension 'ini'!" msgstr "找ä¸åˆ°å‰¯æª”å 'ini' 的開啟命令ï¼" -#: Source/Core/Core/Src/BootManager.cpp:152 +#: Source/Core/Core/Src/BootManager.cpp:177 msgid "" "Couldn't init the core.\n" "Check your configuration." @@ -1312,17 +1292,17 @@ msgstr "" "無法åˆå§‹åŒ–核心。\n" "請檢查您的設定。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:160 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:512 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:159 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:514 msgid "Count:" msgstr "數é‡ï¼š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:456 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:488 msgid "Country:" msgstr "國別:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:163 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:567 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:162 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:569 msgid "Create AR Code" msgstr "建立 AR 代碼" @@ -1354,12 +1334,12 @@ msgstr "" msgid "Crossfade" msgstr "Crossfade" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:631 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:632 #, c-format msgid "Current directory changed from %s to %s after wxFileSelector!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:371 msgid "Custom Projection Hack" msgstr "自訂投影修正" @@ -1367,11 +1347,11 @@ msgstr "自訂投影修正" msgid "Custom Projection Hack Settings" msgstr "自訂投影修正設定" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:374 msgid "Customize some Orthographic Projection parameters." msgstr "自訂一些直線投影åƒæ•¸ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:293 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 msgid "Czech" msgstr "Czech" @@ -1383,36 +1363,36 @@ msgstr "" msgid "D-Pad" msgstr "åå­—æ–¹å‘éµ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP" msgstr "è²éŸ³" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:644 msgid "DSP Emulator Engine" msgstr "DSP 模擬引擎" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:256 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:357 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 msgid "DSP HLE emulation (fast)" msgstr "DSP HLE 模擬器 (å¿«)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:258 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:260 msgid "DSP LLE interpreter (slow)" msgstr "DSP LLE 解釋器 (æ…¢)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:257 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:259 msgid "DSP LLE recompiler" msgstr "DSP LLE é‡ç·¨è­¯å™¨ (æ…¢)" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:648 -msgid "DSP on Dedicated Thread" -msgstr "" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:468 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 msgid "DSP settings" msgstr "è²éŸ³è¨­å®š" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:826 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:646 +msgid "DSPLLE on Separate Thread" +msgstr "" + +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:830 msgid "DVD Root:" msgstr "DVD 根:" @@ -1424,15 +1404,15 @@ msgstr "" msgid "DVDLowUnencryptedRead - Fatal Error: failed to read from volume" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:92 msgid "Dance Mat" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:153 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:152 msgid "Data Size" msgstr "資料大å°" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:468 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:500 msgid "Date:" msgstr "日期:" @@ -1461,29 +1441,28 @@ msgstr "" msgid "Decimal" msgstr "Decimal" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:884 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:875 msgid "Decompress ISO..." msgstr "解壓 ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:903 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:894 msgid "Decompress selected ISOs..." msgstr "解壓é¸æ“‡çš„ ISO..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1092 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1228 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1082 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1218 msgid "Decompressing ISO" msgstr "ISO 解壓中" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:195 -#, fuzzy msgid "Decrease Frame limit" -msgstr "æ›´æ–°éŠæˆ²åˆ—表" +msgstr "" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:967 msgid "Default" msgstr "é è¨­å€¼" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:823 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:827 msgid "Default ISO:" msgstr "é è¨­çš„ ISO:" @@ -1507,7 +1486,7 @@ msgstr "刪除已存在的檔案 '%s' ?" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:680 msgid "Description" -msgstr "" +msgstr "æè¿°" #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:535 msgid "Detect" @@ -1527,8 +1506,8 @@ msgstr "" msgid "Device" msgstr "è£ç½®" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:738 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:786 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:790 msgid "Device Settings" msgstr "è£ç½®è¨­å®š" @@ -1536,15 +1515,12 @@ msgstr "è£ç½®è¨­å®š" msgid "Dial" msgstr "Dial" -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:145 -msgid "Direct3D11" -msgstr "Direct3D11" - -#: Source/Plugins/Plugin_VideoDX9/Src/main.cpp:126 -msgid "Direct3D9" +#: Source/Core/VideoBackends/D3D/Src/main.cpp:146 +#, fuzzy +msgid "Direct3D" msgstr "Direct3D9" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:155 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:120 msgid "" "Directory checksum failed\n" " and Directory backup checksum failed" @@ -1592,7 +1568,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:553 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:596 msgid "Disc" msgstr "光碟" @@ -1616,24 +1592,59 @@ msgstr "" msgid "Divide" msgstr "Divide" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1035 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1044 msgid "Do you want to stop the current emulation?" msgstr "您è¦åœæ­¢ç›®å‰çš„模擬嗎?" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:651 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 msgid "Dolby Pro Logic II decoder" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:899 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:906 msgid "Dolphin" msgstr "Dolphin" +#: Source/Core/DolphinWX/Src/AboutDolphin.cpp:20 +#, c-format +msgid "" +"Dolphin %s\n" +"Copyright (c) 2003-2013+ Dolphin Team\n" +"\n" +"Branch: %s\n" +"Revision: %s\n" +"Compiled: %s @ %s\n" +"\n" +"Dolphin is a Gamecube/Wii emulator, which was\n" +"originally written by F|RES and ector.\n" +"Today Dolphin is an open source project with many\n" +"contributors, too many to list.\n" +"If interested, just go check out the project page at\n" +"http://code.google.com/p/dolphin-emu/ .\n" +"\n" +"Special thanks to Bushing, Costis, CrowTRobo,\n" +"Marcan, Segher, Titanik, or9 and Hotquik for their\n" +"reverse engineering and docs/demos.\n" +"\n" +"Big thanks to Gilles Mouchard whose Microlib PPC\n" +"emulator gave our development a kickstart.\n" +"\n" +"Thanks to Frank Wille for his PowerPC disassembler,\n" +"which or9 and we modified to include Gekko specifics.\n" +"\n" +"Thanks to hcs/destop for their GC ADPCM decoder.\n" +"\n" +"We are not affiliated with Nintendo in any way.\n" +"Gamecube and Wii are trademarks of Nintendo.\n" +"The emulator should not be used to play games\n" +"you do not legally own." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:189 #, c-format msgid "Dolphin %s Graphics Configuration" msgstr "Dolphin %s å½±åƒè¨­å®š" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:298 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 msgid "Dolphin &Web Site" msgstr "Dolphin 官網(&W)" @@ -1649,12 +1660,12 @@ msgstr "Dolphin 模擬 Wiimote 設定" msgid "Dolphin FIFO" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1200 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1210 msgid "Dolphin GCPad Configuration" msgstr "Dolphin GC 控制器設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:725 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1135 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:726 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1145 msgid "Dolphin TAS Movies (*.dtm)" msgstr "Dolphin TAS 影片 (*.dtm)" @@ -1662,33 +1673,32 @@ msgstr "Dolphin TAS 影片 (*.dtm)" msgid "Dolphin Wiimote Configuration" msgstr "Dolphin Wiimote 設定" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:299 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:301 msgid "Dolphin at &Google Code" msgstr "Dolphin SVN (&G)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:354 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:355 msgid "" "Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for " "files..." msgstr "Dolphin 找ä¸åˆ°ä»»ä½• GC/Wii ISO。按兩下這裡ç€è¦½æª”案..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:358 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:359 msgid "" "Dolphin is currently set to hide all games. Doubleclick here to show all " "games..." msgstr "Dolphin ç›®å‰è¢«è¨­å®šç‚ºéš±è—所有éŠæˆ²ã€‚按兩下這裡顯示所有éŠæˆ²..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1163 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1249 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1153 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1239 msgid "Dolphin was unable to complete the requested action." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:319 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 msgid "" "Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF " "= Compatible)" -msgstr "開啟快速光碟存å–。部份éŠæˆ²éœ€è¦ã€‚(ON = 兼容ã€OFF = 快速)" +msgstr "" #: Source/Core/InputCommon/Src/ControllerEmu.cpp:263 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:45 @@ -1708,11 +1718,11 @@ msgstr "已下載 %lu æ¢ä»£ç¢¼ã€‚ (已添加 %lu æ¢)" msgid "Drums" msgstr "Drums" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:86 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 msgid "Dummy" msgstr "空" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:649 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:647 msgid "Dump Audio" msgstr "轉儲è²éŸ³" @@ -1749,9 +1759,9 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:482 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:514 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:269 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 msgid "Dutch" msgstr "Dutch" @@ -1772,7 +1782,7 @@ msgid "" "driver." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:151 msgid "EUROPE" msgstr "EUROPE" @@ -1780,7 +1790,7 @@ msgstr "EUROPE" msgid "Early Memory Updates" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit" msgstr "編輯" @@ -1788,7 +1798,7 @@ msgstr "編輯" msgid "Edit ActionReplay Code" msgstr "編輯 ActionReplay 代碼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:286 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 msgid "Edit Config" msgstr "編輯 ini 設定檔" @@ -1796,12 +1806,12 @@ msgstr "編輯 ini 設定檔" msgid "Edit Patch" msgstr "編輯修正" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:484 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:486 msgid "Edit current perspective" msgstr "編輯目å‰ç‰ˆå¼" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:407 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:429 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:439 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:461 msgid "Edit..." msgstr "編輯..." @@ -1813,7 +1823,7 @@ msgstr "效果" msgid "Embedded Frame Buffer" msgstr "" -#: Source/Core/Core/Src/Core.cpp:188 +#: Source/Core/Core/Src/Core.cpp:190 msgid "Emu Thread already running" msgstr "模擬器線程已經執行中" @@ -1840,7 +1850,7 @@ msgstr "" msgid "Emulated Wiimote" msgstr "模擬 Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:378 msgid "Emulation State: " msgstr "模擬狀態:" @@ -1858,15 +1868,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:88 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:87 msgid "Enable AR Logging" msgstr "é–‹å•Ÿ AR 日誌" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:324 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:356 msgid "Enable Block Merging" msgstr "é–‹å•Ÿå¡Šåˆä½µ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:331 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:363 msgid "Enable Bounding Box Calculation" msgstr "" @@ -1878,7 +1888,7 @@ msgstr "" msgid "Enable Cheats" msgstr "開啟作弊" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:310 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:342 msgid "Enable Dual Core" msgstr "開啟雙核心" @@ -1886,7 +1896,7 @@ msgstr "開啟雙核心" msgid "Enable Dual Core (speedup)" msgstr "開啟雙核心 (加速)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:343 msgid "Enable Idle Skipping" msgstr "é–‹å•Ÿç•¥éŽç©ºé–’" @@ -1894,7 +1904,7 @@ msgstr "é–‹å•Ÿç•¥éŽç©ºé–’" msgid "Enable Idle Skipping (speedup)" msgstr "é–‹å•Ÿç•¥éŽç©ºé–’ (加速)" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:312 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:344 msgid "Enable MMU" msgstr "é–‹å•Ÿ MMU" @@ -1902,7 +1912,7 @@ msgstr "é–‹å•Ÿ MMU" msgid "Enable Progressive Scan" msgstr "é–‹å•Ÿé€è¡ŒæŽƒçž„" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:764 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:768 msgid "Enable Screen Saver" msgstr "" @@ -1910,7 +1920,7 @@ msgstr "" msgid "Enable Speaker Data" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:360 msgid "Enable WideScreen" msgstr "開啟寬螢幕" @@ -1927,7 +1937,7 @@ msgid "" "If unsure, select 1x." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:323 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:355 msgid "" "Enable fast disc access. Needed for a few games. (ON = Fast, OFF = " "Compatible)" @@ -1953,31 +1963,25 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:335 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:367 msgid "" "Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for " "ANY other game." msgstr "é–‹å•Ÿæ­¤é¸é …將加速塞爾é”傳說:曙光公主,請勿在其它éŠæˆ²ä¸­ä½¿ç”¨ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:340 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 msgid "Enables Custom Projection Hack" msgstr "開啟自訂投影修正" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:515 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 msgid "" "Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on " "OSX." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:517 -msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." -msgstr "" - #: Source/Core/DolphinWX/Src/ConfigMain.cpp:519 msgid "" -"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend " -"only. May need to rename soft_oal.dll to OpenAL32.dll to make it work." +"Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only." msgstr "" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:81 @@ -1988,7 +1992,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:313 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:345 msgid "" "Enables the Memory Management Unit, needed for some games. (ON = Compatible, " "OFF = Fast)" @@ -2005,9 +2009,9 @@ msgstr "" msgid "End" msgstr "End" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:477 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:262 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:295 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 msgid "English" msgstr "English" @@ -2030,21 +2034,20 @@ msgstr "é …ç›® %d/%d" msgid "Entry 1/%d" msgstr "é …ç›® 1/%d" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 msgid "Equal" msgstr "等於" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:32 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:150 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "Error" msgstr "錯誤" -#: Source/Core/DolphinWX/Src/Main.cpp:412 +#: Source/Core/DolphinWX/Src/Main.cpp:417 msgid "Error loading selected language. Falling back to system default." msgstr "讀å–é¸æ“‡çš„語系出錯。返回使用系統é è¨­å€¼ã€‚" -#: Source/Core/Common/Src/ChunkFile.h:221 +#: Source/Core/Common/Src/ChunkFile.h:271 #, c-format msgid "" "Error: After \"%s\", found %d (0x%X) instead of save marker %d (0x%X). " @@ -2068,7 +2071,6 @@ msgid "Euphoria" msgstr "Euphoria" #: Source/Core/Core/Src/ArmMemTools.cpp:78 -#: Source/Core/Core/Src/x64MemTools.cpp:209 #, c-format msgid "Exception handler - access below memory space. %08llx%08llx" msgstr "處ç†ç•°å¸¸ - å­˜å–下列記憶體空間。 %08llx%08llx" @@ -2077,16 +2079,20 @@ msgstr "處ç†ç•°å¸¸ - å­˜å–下列記憶體空間。 %08llx%08llx" msgid "Execute" msgstr "執行" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:364 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:366 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:182 msgid "Exit" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:194 +msgid "Export All Wii Saves" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:446 msgid "Export Failed" msgstr "匯出失敗" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:651 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:699 msgid "Export File" msgstr "匯出檔案" @@ -2094,7 +2100,7 @@ msgstr "匯出檔案" msgid "Export Recording" msgstr "匯出錄åƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:351 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:353 msgid "Export Recording..." msgstr "匯出錄åƒ..." @@ -2102,7 +2108,7 @@ msgstr "匯出錄åƒ..." msgid "Export Save" msgstr "匯出存檔" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:868 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:859 msgid "Export Wii save (Experimental)" msgstr "匯出 Wii 存檔 (實驗性)" @@ -2110,15 +2116,15 @@ msgstr "匯出 Wii 存檔 (實驗性)" msgid "Export all saves" msgstr "匯出所有存檔" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:72 -msgid "Export failed, try again?" -msgstr "匯出失敗,è¦é‡è©¦å—Žï¼Ÿ" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:113 +msgid "Export failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:552 msgid "Export save as..." msgstr "匯出存檔為..." -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:288 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:289 msgid "Extension" msgstr "æ“´å……" @@ -2134,44 +2140,44 @@ msgstr "é¡å¤–åƒæ•¸" msgid "Extra Parameter useful in ''Metroid: Other M'' only." msgstr "僅在 ''銀河戰士:å¦ä¸€å€‹ M'' 中有效的é¡å¤–åƒæ•¸ã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:626 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:674 msgid "Extract All Files..." msgstr "æå–所有檔案..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:632 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:680 msgid "Extract Apploader..." msgstr "æå–程å¼è®€å–器..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:633 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:681 msgid "Extract DOL..." msgstr "æå– DOL..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:622 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:670 msgid "Extract Directory..." msgstr "æå–資料夾..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:624 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:672 msgid "Extract File..." msgstr "æå–檔案..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:619 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:667 msgid "Extract Partition..." msgstr "æå–分割å€..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:740 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:788 #, c-format msgid "Extracting %s" msgstr "%s æå–中" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting All Files" msgstr "所有檔案æå–中" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:723 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:771 msgid "Extracting Directory" msgstr "資料夾æå–中" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:726 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:774 msgid "Extracting..." msgstr "æå–中..." @@ -2183,15 +2189,15 @@ msgstr "" msgid "FIFO Player" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:154 msgid "FRANCE" msgstr "FRANCE" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:472 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:504 msgid "FST Size:" msgstr "FST 大å°" -#: Source/Core/Core/Src/NetPlayClient.cpp:141 +#: Source/Core/Core/Src/NetPlayClient.cpp:129 msgid "Failed to Connect!" msgstr "連接失敗ï¼" @@ -2199,11 +2205,15 @@ msgstr "連接失敗ï¼" msgid "Failed to download codes." msgstr "下載代碼失敗。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:862 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:910 #, c-format msgid "Failed to extract to %s!" msgstr "æå–至 %s 失敗ï¼" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:261 +msgid "Failed to listen. Is another instance of the NetPlay server running?" +msgstr "" + #: Source/Core/Core/Src/DSP/DSPCore.cpp:66 #, c-format msgid "" @@ -2231,20 +2241,20 @@ msgid "" "might crash unexpectedly!" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:771 +#: Source/Core/Core/Src/Movie.cpp:785 #, c-format msgid "Failed to read %s" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:144 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:189 msgid "Failed to read banner.bin" msgstr "è®€å– banner.bin 失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:178 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:226 msgid "Failed to read bk header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:211 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:176 #, c-format msgid "" "Failed to read block %d of the save data\n" @@ -2252,7 +2262,7 @@ msgid "" "FilePosition:%llx" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:136 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:101 msgid "" "Failed to read block allocation table backup correctly\n" "(0x8000-0x9FFF)" @@ -2260,7 +2270,7 @@ msgstr "" "讀å–正確的塊分é…表備份失敗\n" "(0x8000-0x9FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:130 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:95 msgid "" "Failed to read block allocation table correctly\n" "(0x6000-0x7FFF)" @@ -2268,17 +2278,17 @@ msgstr "" "讀å–正確的塊分é…表失敗\n" "(0x6000-0x7FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:279 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:328 #, c-format msgid "Failed to read data from file %d" msgstr "從檔案 %d 讀å–數據失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:367 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:420 #, c-format msgid "Failed to read data from file: %s" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:124 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:89 msgid "" "Failed to read directory backup correctly\n" "(0x4000-0x5FFF)" @@ -2286,7 +2296,7 @@ msgstr "" "讀å–目錄備份失敗\n" "(0x4000-0x5FFF)" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:118 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:83 msgid "" "Failed to read directory correctly\n" "(0x2000-0x3FFF)" @@ -2294,11 +2304,11 @@ msgstr "" "讀å–正確的目錄失敗\n" "(0x2000-0x3FFF)" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:90 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:130 msgid "Failed to read header" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:107 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 msgid "" "Failed to read header correctly\n" "(0x0000-0x1FFF)" @@ -2306,31 +2316,36 @@ msgstr "" "讀å–正確的頭部失敗\n" "(0x0000-0x1FFF)" -#: Source/Core/DiscIO/Src/VolumeGC.cpp:48 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:299 +#, c-format +msgid "Failed to read header for file %d" +msgstr "" + +#: Source/Core/DiscIO/Src/VolumeGC.cpp:46 msgid "Failed to read unique ID from disc image" msgstr "從光碟中讀å–唯一的 ID 失敗" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:103 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp:74 msgid "Failed to write BT.DINF to SYSCONF" msgstr "寫入 BT.DINF 至 SYSCONF 失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:221 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:269 msgid "Failed to write bkhdr" msgstr "寫入 bkhdr 失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:157 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:428 +#, c-format +msgid "Failed to write data to file: %s" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:205 #, c-format msgid "Failed to write header for %s" msgstr "檔案 %s 寫入檔頭失敗" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:251 -#, c-format -msgid "Failed to write header for file %d" -msgstr "檔案 %d 寫入檔頭失敗" - -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:296 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 msgid "Farsi" -msgstr "" +msgstr "波斯語" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:478 msgid "Fast" @@ -2340,17 +2355,17 @@ msgstr "快速" msgid "Fast Depth Calculation" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:315 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 msgid "Fast version of the MMU. Does not work for every game." msgstr "快速版本的 MMU。å¯èƒ½ç„¡æ³•åœ¨æ‰€æœ‰éŠæˆ²ä¸ŠåŸ·è¡Œã€‚" -#: Source/Core/Core/Src/Movie.cpp:1028 +#: Source/Core/Core/Src/Movie.cpp:1042 #, c-format msgid "" "Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:201 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:202 msgid "Fifo Player" msgstr "" @@ -2374,7 +2389,7 @@ msgstr "" "無法開啟檔案\n" "或沒有一個有效的副檔å" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:72 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:37 #, c-format msgid "" "File has the extension \"%s\"\n" @@ -2387,20 +2402,20 @@ msgstr "" msgid "File is not recognized as a memcard" msgstr "檔案未被識別為一張記憶å¡" -#: Source/Core/DiscIO/Src/CompressedBlob.cpp:281 +#: Source/Core/DiscIO/Src/CompressedBlob.cpp:280 msgid "File not compressed" msgstr "檔案未壓縮" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:109 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp:142 #, c-format msgid "FileIO: Unknown open mode : 0x%02x" msgstr "FileIO:未知開啟模å¼ï¼š 0x%02x" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:541 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:584 msgid "Filesystem" msgstr "檔案系統" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1145 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1147 msgid "Filetype 'ini' is unknown! Will not open!" msgstr "檔案類型 'ini' æœªçŸ¥ï¼ ç„¡æ³•é–‹å•Ÿï¼" @@ -2452,14 +2467,14 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:495 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:497 msgid "" "Forces NTSC-J mode for using the Japanese ROM font.\n" "Left unchecked, dolphin defaults to NTSC-U and automatically enables this " "setting when playing Japanese games." msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:62 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:27 msgid "" "Format as ascii (NTSC\\PAL)?\n" "Choose no for sjis (NTSC-J)" @@ -2480,6 +2495,11 @@ msgstr "" msgid "Found %d results for '" msgstr "" +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:65 +#, c-format +msgid "Found %x save files" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:869 #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:937 msgid "Frame" @@ -2521,9 +2541,9 @@ msgstr "" msgid "Free Look" msgstr "自由視點" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:479 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:264 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:511 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 msgid "French" msgstr "French" @@ -2536,19 +2556,19 @@ msgstr "Frets" msgid "From" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 msgid "FullScr" msgstr "全螢幕" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:264 msgid "Fullscreen resolution:" -msgstr "" +msgstr "全螢幕解æžåº¦:" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:524 msgid "GCI File(*.gci)" msgstr "GCI 檔案(*.gci)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "GCPad" msgstr "GC 控制器" @@ -2556,27 +2576,27 @@ msgstr "GC 控制器" msgid "GX_CMD_INVL_VC" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:452 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:484 msgid "Game ID:" msgstr "éŠæˆ² ID :" -#: Source/Core/Core/Src/NetPlayClient.cpp:411 +#: Source/Core/Core/Src/NetPlayClient.cpp:473 msgid "Game is already running!" msgstr "éŠæˆ²æ­£åœ¨åŸ·è¡Œï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:570 +#: Source/Core/Core/Src/NetPlayClient.cpp:744 msgid "Game isn't running!" msgstr "éŠæˆ²æœªåŸ·è¡Œï¼" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:420 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:426 msgid "Game not found!" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:389 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:421 msgid "Game-Specific Settings" msgstr "éŠæˆ²è¦æ ¼è¨­å®š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:294 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:325 msgid "GameConfig" msgstr "éŠæˆ²è¨­å®š" @@ -2593,20 +2613,20 @@ msgid "Gamecube &Pad Settings" msgstr "Gamecube 控制器設定(&P)" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:205 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1059 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1063 msgid "Gamecube Memory Cards (*.raw,*.gcp)" msgstr "Gamecube è¨˜æ†¶å¡ (*.raw,*.gcp)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:471 msgid "Gamecube Pad settings" msgstr "Gamecube 控制器設定" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:107 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:302 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:106 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:333 msgid "Gecko Codes" msgstr "Gecko 代碼" -#: Source/Core/Core/Src/GeckoCode.cpp:246 +#: Source/Core/Core/Src/GeckoCode.cpp:247 #, c-format msgid "" "GeckoCode failed to run (CT%i CST%i) (%s)\n" @@ -2625,26 +2645,26 @@ msgstr "一般" msgid "General Settings" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:478 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:263 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:298 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:510 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 msgid "German" msgstr "German" -#: Source/Core/Core/Src/ActionReplay.cpp:439 +#: Source/Core/Core/Src/ActionReplay.cpp:445 #, c-format msgid "GetARCode: Index is greater than ar code list size %lu" msgstr "GetARCode:索引大於 ar ä»£ç¢¼åˆ—è¡¨å¤§å° %lu" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics" msgstr "å½±åƒ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:467 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:469 msgid "Graphics settings" msgstr "å½±åƒè¨­å®š" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:194 msgid "Greater Than" msgstr "大於" @@ -2659,7 +2679,7 @@ msgid "" "If unsure, leave this checked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:299 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 msgid "Greek" msgstr "Greek" @@ -2683,11 +2703,11 @@ msgstr "Guitar" msgid "Hacks" msgstr "" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:146 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:111 msgid "Header checksum failed" msgstr "檔頭校驗失敗" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:300 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 msgid "Hebrew" msgstr "Hebrew" @@ -2699,7 +2719,7 @@ msgstr "高度" msgid "Help" msgstr "說明" -#: Source/Core/DolphinWX/Src/Main.cpp:229 +#: Source/Core/DolphinWX/Src/Main.cpp:243 msgid "" "Hi,\n" "\n" @@ -2711,7 +2731,7 @@ msgid "" "Sayonara!\n" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:220 +#: Source/Core/DolphinWX/Src/Main.cpp:234 msgid "" "Hi,\n" "\n" @@ -2760,7 +2780,7 @@ msgstr "å¿«æ·éµè¨­å®š" msgid "Hotkeys" msgstr "å¿«æ·éµ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:301 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 msgid "Hungarian" msgstr "Hungarian" @@ -2768,29 +2788,29 @@ msgstr "Hungarian" msgid "Hybrid Wiimote" msgstr "æ··åˆ Wiimote" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:519 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:675 #, c-format msgid "IOCTL_ES_GETVIEWS: Tried to get data from an unknown ticket: %08x/%08x" msgstr "IOCTL_ES_GETVIEWS:試圖å–得資料從未知的標簽: %08x/%08x" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:773 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:942 #, c-format msgid "" -"IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not " -"available in your NAND dump\n" +"IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your " +"NAND dump\n" "TitleID %016llx.\n" " Dolphin will likely hang now." msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:300 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:426 msgid "IOCTL_ES_READCONTENT - bad destination" msgstr "IOCTL_ES_READCONTENT - æ毀的目標" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:736 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:734 msgid "IPL Settings" msgstr "IPL 設定" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:273 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:274 msgid "IR" msgstr "IR" @@ -2802,15 +2822,15 @@ msgstr "IR 指示器" msgid "IR Sensitivity:" msgstr "IR éˆæ•åº¦ï¼š" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:555 msgid "ISO Details" msgstr "ISO 明細" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:818 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:822 msgid "ISO Directories" msgstr "ISO 資料夾" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:166 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:157 msgid "ITALY" msgstr "ITALY" @@ -2818,7 +2838,7 @@ msgstr "ITALY" msgid "Icon" msgstr "圖示" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:332 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:364 msgid "" "If checked, the bounding box registers will be updated. Used by the Paper " "Mario games." @@ -2850,9 +2870,13 @@ msgstr "" msgid "Import Save" msgstr "匯入存檔" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:48 -msgid "Import failed, try again?" -msgstr "匯入失敗,是å¦é‡è©¦ï¼Ÿ" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 +msgid "Import Wii Save" +msgstr "" + +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:93 +msgid "Import failed" +msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:441 msgid "" @@ -2874,21 +2898,16 @@ msgstr "" "匯入的檔案有 sav 副檔å\n" "但是沒有正確的檔頭" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:382 msgid "In Game" msgstr "éŠæˆ²ä¸­" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:620 -msgid "In-Game" -msgstr "éŠæˆ²ä¸­" - #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:194 -#, fuzzy msgid "Increase Frame limit" -msgstr "畫格速é™åˆ¶ï¼š" +msgstr "" #: Source/Core/DolphinWX/Src/LogConfigWindow.cpp:34 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:305 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:336 msgid "Info" msgstr "訊æ¯" @@ -2908,7 +2927,7 @@ msgstr "Insert" msgid "Insert Encrypted or Decrypted code here..." msgstr "在這裡æ’入被加密或已解密的代碼..." -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:770 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:774 msgid "Insert SD Card" msgstr "æ’å…¥ SD å¡" @@ -2916,36 +2935,37 @@ msgstr "æ’å…¥ SD å¡" msgid "Insert name here.." msgstr "在這裡æ’å…¥å稱.." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:198 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:199 msgid "Install WAD" msgstr "å®‰è£ WAD" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:891 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:882 msgid "Install to Wii Menu" msgstr "安è£è‡³ Wii é¸å–®" -#: Source/Core/Core/Src/x64MemTools.cpp:246 +#: Source/Core/Core/Src/x64MemTools.cpp:254 +#: Source/Core/Core/Src/x64MemTools.cpp:305 msgid "" "InstallExceptionHandler called, but this platform does not yet support it." msgstr "調用 InstallExceptionHandler,但是這個平å°å°šæœªæ”¯æ´æ­¤åŠŸèƒ½ã€‚" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1371 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1387 msgid "Installing WAD..." msgstr "æ­£åœ¨å®‰è£ WAD 至 Wii é¸å–®..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:920 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:968 msgid "Integrity Check Error" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:926 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:974 msgid "Integrity check completed" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:925 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:973 msgid "Integrity check completed. No errors have been found." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:917 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:965 #, c-format msgid "" "Integrity check for partition %d failed. Your dump is most likely corrupted " @@ -2956,7 +2976,7 @@ msgstr "" msgid "Interface" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:634 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:632 msgid "Interface Settings" msgstr "ç•Œé¢è¨­å®š" @@ -2979,22 +2999,22 @@ msgstr "內部 LZO 錯誤 - lzo_init() 失敗" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:353 msgid "Internal Resolution:" -msgstr "" +msgstr "内部解æžåº¦:" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:42 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:43 msgid "Interpreter (VERY slow)" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:349 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 msgid "Intro" msgstr "標題" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:187 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:235 #, c-format msgid "Invalid Size(%x) or Magic word (%x)" msgstr "無效大å°(%x) 或 Magic word (%x)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:617 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:619 msgid "Invalid Value!" msgstr "無效的數值ï¼" @@ -3002,16 +3022,16 @@ msgstr "無效的數值ï¼" msgid "Invalid bat.map or dir entry" msgstr "無效的 bat.map 或目錄項目" -#: Source/Core/Core/Src/CoreTiming.cpp:556 +#: Source/Core/Core/Src/CoreTiming.cpp:465 #, c-format msgid "Invalid event type %i" msgstr "無效的事件類型 %i" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:309 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:312 msgid "Invalid file" msgstr "無效的檔案" -#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:28 +#: Source/Core/DiscIO/Src/BannerLoaderGC.cpp:26 #, c-format msgid "" "Invalid opening.bnr found in gcm:\n" @@ -3022,7 +3042,7 @@ msgstr "" "%s\n" " å¯èƒ½éœ€è¦é‡æ–°è½‰å„²é€™å€‹éŠæˆ²ã€‚" -#: Source/Core/Core/Src/Movie.cpp:714 +#: Source/Core/Core/Src/Movie.cpp:728 msgid "Invalid recording file" msgstr "無效的錄åƒæª”" @@ -3038,34 +3058,36 @@ msgstr "" msgid "Invalid search string (only even string lengths supported)" msgstr "" -#: Source/Core/Core/Src/Core.cpp:511 +#: Source/Core/Core/Src/Core.cpp:528 msgid "Invalid state" msgstr "無效的狀態" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:481 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:266 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:302 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:513 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:268 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 msgid "Italian" msgstr "Italian" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:177 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 msgid "JAPAN" msgstr "JAPAN" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:46 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:48 msgid "JIT Recompiler (recommended)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:47 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:49 msgid "JITIL experimental recompiler" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:281 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:303 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:175 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:518 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 msgid "Japanese" msgstr "Japanese" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:182 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:181 msgid "KOREA" msgstr "KOREA" @@ -3084,8 +3106,9 @@ msgstr "" msgid "Key" msgstr "éµ" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:304 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:521 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:286 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 msgid "Korean" msgstr "Korean" @@ -3107,12 +3130,12 @@ msgstr "L-類比" msgid "Language:" msgstr "語系:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:416 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:418 #, c-format msgid "Last %i" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:684 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:682 msgid "Latency:" msgstr "" @@ -3151,7 +3174,7 @@ msgstr "" "å·¦/å³éµå–得更多é¸é …。\n" "中éµæ¸…除。" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:196 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:195 msgid "Less Than" msgstr "å°æ–¼" @@ -3168,58 +3191,48 @@ msgid "Load Custom Textures" msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:232 -#, fuzzy msgid "Load State" -msgstr "讀å–進度(&L)" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:219 -#, fuzzy msgid "Load State Last 1" -msgstr "讀å–儲存格 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:220 -#, fuzzy msgid "Load State Last 2" -msgstr "讀å–儲存格 2" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:221 -#, fuzzy msgid "Load State Last 3" -msgstr "讀å–儲存格 3" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:222 -#, fuzzy msgid "Load State Last 4" -msgstr "讀å–儲存格 4" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:223 -#, fuzzy msgid "Load State Last 5" -msgstr "讀å–儲存格 5" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:224 -#, fuzzy msgid "Load State Last 6" -msgstr "讀å–儲存格 6" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:225 -#, fuzzy msgid "Load State Last 7" -msgstr "讀å–儲存格 7" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:226 -#, fuzzy msgid "Load State Last 8" -msgstr "讀å–儲存格 8" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:197 msgid "Load State Slot 1" msgstr "讀å–儲存格 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:206 -#, fuzzy msgid "Load State Slot 10" -msgstr "讀å–儲存格 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:198 msgid "Load State Slot 2" @@ -3250,19 +3263,18 @@ msgid "Load State Slot 8" msgstr "讀å–儲存格 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:205 -#, fuzzy msgid "Load State Slot 9" -msgstr "讀å–儲存格 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:420 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:422 msgid "Load State..." msgstr "讀å–進度檔..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1406 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1422 msgid "Load Wii System Menu" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1417 #, c-format msgid "Load Wii System Menu %d%c" msgstr "è®€å– Wii 系統é¸å–® (%d%c)" @@ -3278,10 +3290,6 @@ msgstr "" msgid "Load preset values from hack patterns available." msgstr "讀å–å¯ç”¨çš„修正設定é è¨­æª”" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:618 -msgid "Local" -msgstr "本地" - #: Source/Core/DolphinWX/Src/LogWindow.h:38 msgid "Log" msgstr "記錄" @@ -3310,12 +3318,12 @@ msgstr "" msgid "Logger Outputs" msgstr "記錄輸出" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:109 -#: Source/Core/DolphinWX/Src/Frame.cpp:318 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:108 +#: Source/Core/DolphinWX/Src/Frame.cpp:333 msgid "Logging" msgstr "日誌" -#: Source/Core/Core/Src/NetPlayClient.cpp:339 +#: Source/Core/Core/Src/NetPlayClient.cpp:355 msgid "Lost connection to server!" msgstr "éºå¤±èˆ‡ä¼ºæœå™¨çš„連接" @@ -3323,7 +3331,7 @@ msgstr "éºå¤±èˆ‡ä¼ºæœå™¨çš„連接" msgid "M Button" msgstr "M 鈕" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:112 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:155 #, c-format msgid "" "MD5 mismatch\n" @@ -3332,7 +3340,7 @@ msgstr "" "MD5 ä¸ç¬¦åˆ\n" " %016llx%016llx != %016llx%016llx" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:346 msgid "MMU Speed Hack" msgstr "MMU 速度修正" @@ -3346,11 +3354,11 @@ msgstr "MadCatz Gameshark 檔案(*.gcs)" msgid "Main Stick" msgstr "主æ–æ¡¿" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:460 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:492 msgid "Maker ID:" msgstr "廠商 ID:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:487 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:530 msgid "Maker:" msgstr "廠商:" @@ -3381,7 +3389,7 @@ msgid "Memory Byte" msgstr "" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:212 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:95 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:97 msgid "Memory Card" msgstr "記憶å¡" @@ -3391,7 +3399,7 @@ msgid "" "could mangle stuff!" msgstr "記憶å¡ç®¡ç†å™¨è­¦å‘Š-在使用å‰è«‹å…ˆå‚™ä»½ï¼Œä»¥é˜²æ­¢å‡ºç¾æ毀時無法復原ï¼" -#: Source/Core/Core/Src/CoreParameter.cpp:368 +#: Source/Core/Core/Src/CoreParameter.cpp:373 #, c-format msgid "" "Memory Card filename in Slot %c is incorrect\n" @@ -3408,7 +3416,7 @@ msgstr "" "%s\n" "是å¦è¦è¤‡è£½èˆŠæª”案至新路徑?\n" -#: Source/Core/Core/Src/HW/GCMemcard.cpp:112 +#: Source/Core/Core/Src/HW/GCMemcard.cpp:77 msgid "Memorycard filesize does not match the header size" msgstr "" @@ -3416,7 +3424,7 @@ msgstr "" msgid "Menu" msgstr "é¸å–®" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:96 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:98 msgid "Mic" msgstr "麥克風" @@ -3429,7 +3437,7 @@ msgstr "" msgid "Misc" msgstr "雜項" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:783 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:787 msgid "Misc Settings" msgstr "其它設定" @@ -3450,11 +3458,11 @@ msgstr "" msgid "Monospaced font" msgstr "等寬字型" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:296 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:297 msgid "Motion Plus" msgstr "Motion Plus" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:301 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:73 msgid "Motor" msgstr "馬é”" @@ -3469,6 +3477,13 @@ msgid "" "\n" "\n" msgstr "" +"移動滑鼠指é‡è‡³æŸä¸€é¸é …上方以顯示詳細æ述。\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:62 msgid "Multiply" @@ -3566,15 +3581,15 @@ msgstr "NP Tab" msgid "NP Up" msgstr "NP Up" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:448 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:46 #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:37 msgid "Name:" msgstr "å稱:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:62 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:299 -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:570 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:61 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:301 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:572 #: Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp:16 msgid "Name: " msgstr "å稱:" @@ -3584,7 +3599,7 @@ msgstr "å稱:" msgid "Native GCI files(*.gci)" msgstr "原始 GCI 檔案(*.gci)" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:138 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:137 msgid "New Scan" msgstr "æ–°çš„æœå°‹" @@ -3593,7 +3608,7 @@ msgstr "æ–°çš„æœå°‹" msgid "Next Page" msgstr "下一é " -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:142 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:141 msgid "Next Scan" msgstr "尋找下一個" @@ -3601,11 +3616,11 @@ msgstr "尋找下一個" msgid "Nickname :" msgstr "暱稱:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:190 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 msgid "No Country (SDK)" msgstr "無國家 (SDK)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:360 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:361 msgid "No ISOs or WADS found" msgstr "找ä¸åˆ° ISO 或 WAD" @@ -3613,7 +3628,7 @@ msgstr "找ä¸åˆ° ISO 或 WAD" msgid "No audio output" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:501 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:552 #, c-format msgid "No banner file found for title %s" msgstr "找ä¸åˆ°æ¨™é¡Œ %s 的圖示檔案" @@ -3639,42 +3654,43 @@ msgstr "沒有剩餘的目錄索引項目" msgid "No recorded file" msgstr "" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:494 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:545 #, c-format msgid "No save folder found for title %s" msgstr "找ä¸åˆ°æ¨™é¡Œ %s 的存檔資料夾" -#: Source/Plugins/Plugin_VideoOGL/Src/main.cpp:138 -#: Source/Plugins/Plugin_VideoDX11/Src/main.cpp:118 +#: Source/Core/VideoBackends/OGL/Src/main.cpp:152 +#: Source/Core/VideoBackends/D3D/Src/main.cpp:119 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:23 #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:64 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:626 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:624 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:629 msgid "None" msgstr "ç„¡" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:305 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 msgid "Norwegian Bokmaal" msgstr "Norwegian Bokmaal" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:193 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 msgid "Not Equal" msgstr "ä¸ç›¸ç­‰" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:347 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:797 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:379 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:788 msgid "Not Set" msgstr "未設定" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:101 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:141 #, c-format msgid "Not a Wii save or read failure for file header size %x" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:657 +#: Source/Core/DolphinWX/Src/Main.cpp:671 msgid "Not connected" msgstr "未連接" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:299 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:300 msgid "Notes" msgstr "註釋" @@ -3695,7 +3711,7 @@ msgstr "注æ„" msgid "Num Lock" msgstr "Num Lock" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:65 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:64 msgid "Number Of Codes: " msgstr "代碼數é‡ï¼š" @@ -3716,7 +3732,7 @@ msgstr "" msgid "Object Range" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:245 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:247 msgid "Off" msgstr "關閉" @@ -3728,25 +3744,29 @@ msgstr "å移:" msgid "On-Screen Display Messages" msgstr "" +#: Source/Core/DolphinWX/Src/FrameTools.cpp:300 +msgid "Online &Documentation" +msgstr "" + #: Source/Core/DolphinWX/Src/MemcardManager.cpp:423 #, c-format msgid "Only %d blocks available" msgstr "僅 %d 個å€å¡Šå¯ç”¨" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:166 msgid "Open" msgstr "é–‹å•Ÿ" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:870 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:861 msgid "Open &containing folder" msgstr "開啟內容資料夾(&C)" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:867 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:858 msgid "Open Wii &save folder" msgstr "é–‹å•Ÿ Wii 存檔資料夾(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:457 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:459 msgid "Open file..." msgstr "開啟檔案..." @@ -3772,7 +3792,13 @@ msgstr "" msgid "OpenMP Texture Decoder" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 +msgid "" +"Opens the default (read-only) configuration for this game in an external " +"text editor." +msgstr "" + +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:309 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:81 msgid "Options" msgstr "é¸é …" @@ -3782,22 +3808,18 @@ msgid "Orange" msgstr "橘" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:455 -#, fuzzy msgid "" "Order of files in the File Directory do not match the block order\n" "Right click and export all of the saves,\n" "and import the saves to a new memcard\n" msgstr "" -"在檔案目錄中的檔案順åºèˆ‡å€å¡Šé †åºä¸ç¬¦åˆ\n" -"按å³éµåŒ¯å‡ºæ‰€æœ‰å­˜æª”,\n" -"並匯入存檔至一張新的記憶å¡ä¸­\n" #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:325 #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:507 msgid "Other" msgstr "" -#: Source/Core/Core/Src/NetPlayClient.cpp:275 +#: Source/Core/Core/Src/NetPlayClient.cpp:291 msgid "" "Other client disconnected while game is running!! NetPlay is disabled. You " "manually stop the game." @@ -3807,15 +3829,15 @@ msgstr "其它客戶端在éŠæˆ²åŸ·è¡Œæ™‚連接埠å£ï¼ï¼å·²é—œé–‰ç¶²è·¯å°æˆ° msgid "Output" msgstr "輸出" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:348 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:350 msgid "P&lay Recording..." msgstr "播放錄åƒ(&L)..." -#: Source/Core/Core/Src/HW/GCPad.cpp:18 +#: Source/Core/Core/Src/HW/GCPad.cpp:17 msgid "Pad" msgstr "控制器" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:628 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:636 msgid "Pad " msgstr "控制器" @@ -3839,17 +3861,17 @@ msgstr "段è½" msgid "Parameters" msgstr "åƒæ•¸" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:217 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:235 #, c-format msgid "Partition %i" msgstr "åˆ†å‰²å€ %i" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:842 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:890 #, c-format -msgid "Partition doesn't exist: %lu" +msgid "Partition doesn't exist: %u" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:297 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:328 msgid "Patches" msgstr "修正" @@ -3857,8 +3879,8 @@ msgstr "修正" msgid "Paths" msgstr "路徑" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1632 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1633 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1648 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1649 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:38 msgid "Pause" msgstr "æš«åœ" @@ -3871,7 +3893,7 @@ msgstr "" msgid "Per-Pixel Lighting" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:384 msgid "Perfect" msgstr "完美" @@ -3881,9 +3903,9 @@ msgid "Perspective %d" msgstr "ç‰ˆå¼ %d" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:152 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:461 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1641 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1642 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1657 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1658 msgid "Play" msgstr "執行" @@ -3895,7 +3917,7 @@ msgstr "播放錄åƒ" msgid "Play/Pause" msgstr "執行/æš«åœ" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:351 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:383 msgid "Playable" msgstr "å¯çŽ©" @@ -3903,11 +3925,11 @@ msgstr "å¯çŽ©" msgid "Playback Options" msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:323 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:326 msgid "Players" msgstr "玩家" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1036 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1045 msgid "Please confirm..." msgstr "請確èª..." @@ -3919,23 +3941,23 @@ msgstr "請在儲存å‰å»ºç«‹ä¸€å€‹æ–°çš„é€æª¢è¦–" msgid "Plus-Minus" msgstr "Plus-Minus" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:306 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 msgid "Polish" msgstr "Polish" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:718 msgid "Port 1" msgstr "åŸ å£ 1" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:719 msgid "Port 2" msgstr "åŸ å£ 2" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:722 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:720 msgid "Port 3" msgstr "åŸ å£ 3" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:723 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:721 msgid "Port 4" msgstr "åŸ å£ 4" @@ -3944,11 +3966,11 @@ msgstr "åŸ å£ 4" msgid "Port :" msgstr "埠å£ï¼š" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:307 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 msgid "Portuguese" msgstr "Portuguese" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:308 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 msgid "Portuguese (Brazilian)" msgstr "Portuguese (Brazilian)" @@ -3956,17 +3978,17 @@ msgstr "Portuguese (Brazilian)" msgid "Post-Processing Effect:" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:918 +#: Source/Core/Core/Src/Movie.cpp:932 #, c-format msgid "Premature movie end in PlayController. %u + 8 > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1037 +#: Source/Core/Core/Src/Movie.cpp:1052 #, c-format msgid "Premature movie end in PlayWiimote. %u + %d > %u" msgstr "" -#: Source/Core/Core/Src/Movie.cpp:1014 +#: Source/Core/Core/Src/Movie.cpp:1028 #, c-format msgid "Premature movie end in PlayWiimote. %u > %u" msgstr "" @@ -3983,7 +4005,7 @@ msgstr "上一é " msgid "Previous Page" msgstr "上一é " -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:173 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:172 msgid "Previous Value" msgstr "上一個數值" @@ -3999,7 +4021,7 @@ msgstr "設定檔" msgid "Properties" msgstr "屬性" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:286 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:287 msgid "Purge Cache" msgstr "清ç†å¿«å–" @@ -4008,7 +4030,7 @@ msgid "Question" msgstr "å•é¡Œ" #: Source/Core/DolphinWX/Src/NetWindow.cpp:170 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:338 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:341 msgid "Quit" msgstr "離開" @@ -4030,7 +4052,7 @@ msgstr "R-類比" msgid "RAM" msgstr "RAM" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:169 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:160 msgid "RUSSIA" msgstr "RUSSIA" @@ -4069,6 +4091,10 @@ msgstr "" msgid "Record" msgstr "" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:361 +msgid "Record input" +msgstr "" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:161 msgid "Recording Info" msgstr "" @@ -4099,7 +4125,7 @@ msgid "" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:77 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:958 msgid "Refresh" msgstr "æ›´æ–°" @@ -4108,14 +4134,14 @@ msgstr "æ›´æ–°" msgid "Refresh List" msgstr "更新列表" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:458 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:460 msgid "Refresh game list" msgstr "æ›´æ–°éŠæˆ²åˆ—表" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:409 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:431 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:441 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:463 #: Source/Core/DolphinWX/Src/PatchAddEdit.cpp:64 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:800 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:804 msgid "Remove" msgstr "移除" @@ -4135,7 +4161,7 @@ msgstr "渲染至主視窗" msgid "Reset" msgstr "é‡ç½®" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:167 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:166 msgid "Results" msgstr "çµæžœ" @@ -4143,7 +4169,7 @@ msgstr "çµæžœ" msgid "Return" msgstr "Return" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:464 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:496 msgid "Revision:" msgstr "" @@ -4156,18 +4182,17 @@ msgstr "å³" msgid "Right Stick" msgstr "å³ æ–æ¡¿" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:299 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:300 #: Source/Core/Core/Src/HW/GCPadEmu.cpp:72 msgid "Rumble" msgstr "震動" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:505 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:507 msgid "" -"Run DSP HLE and LLE on a dedicated thread (not recommended: might cause " -"audio glitches with HLE and freezes with LLE)." +"Run DSP LLE on a dedicated thread (not recommended: might cause freezes)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:309 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 msgid "Russian" msgstr "Russian" @@ -4180,7 +4205,7 @@ msgid "Safe" msgstr "安全" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:183 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 #: Source/Core/DolphinWX/Src/InputConfigDiag.cpp:980 msgid "Save" msgstr "儲存" @@ -4190,23 +4215,20 @@ msgid "Save GCI as..." msgstr "å¦å­˜ GCI ..." #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:228 -#, fuzzy msgid "Save Oldest State" -msgstr "儲存進度(&V)" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:231 -#, fuzzy msgid "Save State" -msgstr "儲存進度(&V)" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:208 msgid "Save State Slot 1" msgstr "儲存至儲存格 1" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:217 -#, fuzzy msgid "Save State Slot 10" -msgstr "儲存至儲存格 1" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:209 msgid "Save State Slot 2" @@ -4237,32 +4259,31 @@ msgid "Save State Slot 8" msgstr "儲存至儲存格 8" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:216 -#, fuzzy msgid "Save State Slot 9" -msgstr "儲存至儲存格 1" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:405 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:407 msgid "Save State..." msgstr "å¦å­˜é€²åº¦..." -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:592 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:602 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:640 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:650 msgid "Save as..." msgstr "å¦å­˜ç‚º..." -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1207 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1197 msgid "Save compressed GCM/ISO" msgstr "儲存已壓縮的 GCM/ISO" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:483 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:485 msgid "Save current perspective" msgstr "儲存目å‰ç‰ˆå¼" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1196 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1186 msgid "Save decompressed GCM/ISO" msgstr "儲存已解壓縮的 GCM/ISO" -#: Source/Core/Core/Src/Movie.cpp:780 +#: Source/Core/Core/Src/Movie.cpp:794 #, c-format msgid "Savestate movie %s is corrupted, movie recording stopping..." msgstr "儲存的影片 %s 是æ毀的,影片錄製åœæ­¢..." @@ -4271,20 +4292,20 @@ msgstr "儲存的影片 %s 是æ毀的,影片錄製åœæ­¢..." msgid "Scaled EFB Copy" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:546 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:537 #, c-format msgid "Scanning %s" msgstr "" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:529 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:520 msgid "Scanning for ISOs" msgstr "正在掃瞄 ISO" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:530 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:521 msgid "Scanning..." msgstr "正在掃瞄..." -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 msgid "ScrShot" msgstr "截圖" @@ -4296,11 +4317,11 @@ msgstr "滾動鎖定" msgid "Search" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:204 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:203 msgid "Search Filter" msgstr "æœç´¢ç¯©é¸" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:798 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:802 msgid "Search Subfolders" msgstr "æœå°‹å­è³‡æ–™å¤¾" @@ -4323,12 +4344,12 @@ msgstr "é …ç›® %s 在 SYSCONF 中找ä¸åˆ°" msgid "Select" msgstr "é¸æ“‡" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:723 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1133 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:724 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1143 msgid "Select The Recording File" msgstr "é¸æ“‡å·²éŒ„製的檔案" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1359 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1375 msgid "Select a Wii WAD file to install" msgstr "é¸æ“‡è¦å®‰è£çš„ Wii WAD" @@ -4347,19 +4368,19 @@ msgstr "é¸æ“‡è¦åŒ¯å…¥çš„存檔" msgid "Select floating windows" msgstr "é¸æ“‡æµ®å‹•è¦–窗" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:616 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:617 msgid "Select the file to load" msgstr "é¸æ“‡è¦è®€å–的檔案" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1315 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1333 msgid "Select the save file" msgstr "é¸æ“‡å­˜æª”" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1478 msgid "Select the state to load" msgstr "é¸æ“‡è¦è®€å–的進度" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1476 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1492 msgid "Select the state to save" msgstr "é¸æ“‡è¦å„²å­˜çš„進度" @@ -4374,7 +4395,7 @@ msgid "" "If unsure, select Auto." msgstr "" -#: Source/Core/InputCommon/Src/InputConfig.cpp:49 +#: Source/Core/InputCommon/Src/InputConfig.cpp:53 msgid "Selected controller profile does not exist" msgstr "" @@ -4392,27 +4413,28 @@ msgid "" "If still unsure, use the highest resolution which works for you." msgstr "" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 -msgid "" -"Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" -"\n" -"If unsure, use Direct3D 11." -msgstr "" - #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:72 msgid "" "Selects what graphics API to use internally.\n" -"Direct3D 9 usually is the fastest one. OpenGL is more accurate though. " -"Direct3D 11 is somewhere between the two.\n" -"Note that the Direct3D backends are only available on Windows.\n" +"The software renderer is only used for debugging, so unless you have a " +"reason to use it you'll want to select OpenGL here.\n" "\n" "If unsure, use OpenGL." msgstr "" -#: Source/Core/DolphinWX/Src/NetWindow.cpp:310 +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:70 +msgid "" +"Selects what graphics API to use internally.\n" +"The software renderer is only used for debugging, so you'll want to use " +"either Direct3D or OpenGL. Different games will behave differently on each " +"backend, so for best emulation experience it's recommended to try both and " +"chose the one that fits your requirements best.\n" +"Note that the Direct3D backend is not available on old Windows versions.\n" +"\n" +"If unsure, use Direct3D." +msgstr "" + +#: Source/Core/DolphinWX/Src/NetWindow.cpp:313 msgid "Send" msgstr "傳é€" @@ -4424,16 +4446,16 @@ msgstr "傳感器ä½ç½®ï¼š" msgid "Separator" msgstr "分離器" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:310 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 msgid "Serbian" msgstr "Serbian" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:509 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:511 msgid "" "Serial Port 1 - This is the port which devices such as the net adapter use" msgstr "åŸ å£ 1 - 這是類似於網å¡ç­‰è£ç½®ä½¿ç”¨çš„埠å£ã€‚" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:871 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:862 msgid "Set as &default ISO" msgstr "設為é è¨­ ISO (&D)" @@ -4442,7 +4464,7 @@ msgstr "設為é è¨­ ISO (&D)" msgid "Set as default Memcard %c" msgstr "設定為é è¨­è¨˜æ†¶å¡ %c" -#: Source/Core/Core/Src/ActionReplay.cpp:450 +#: Source/Core/Core/Src/ActionReplay.cpp:456 #, c-format msgid "SetARCode_IsActive: Index is greater than ar code list size %lu" msgstr "SetARCode_IsActive:索引大於 ar ä»£ç¢¼åˆ—è¡¨å¤§å° %lu" @@ -4453,19 +4475,19 @@ msgid "" "backend only." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:341 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:373 msgid "Settings..." msgstr "設定..." -#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:209 -msgid "SetupWiiMem: Cant find setting file" -msgstr "SetupWiiMem:無法找到設定檔" +#: Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp:250 +msgid "SetupWiiMem: Cant create setting file" +msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:282 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:283 msgid "Shake" msgstr "æ–晃" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:485 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:528 msgid "Short Name:" msgstr "短å:" @@ -4473,23 +4495,27 @@ msgstr "短å:" msgid "Shoulder Buttons" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:221 msgid "Show &Console" msgstr "顯示控制å°(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:218 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 msgid "Show &Log" msgstr "顯示日誌視窗(&L)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:215 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:216 msgid "Show &Statusbar" msgstr "顯示狀態欄(&S)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:213 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:214 msgid "Show &Toolbar" msgstr "顯示工具列(&T)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:284 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:317 +msgid "Show Defaults" +msgstr "" + +#: Source/Core/DolphinWX/Src/FrameTools.cpp:285 msgid "Show Drives" msgstr "顯示è£ç½®" @@ -4501,11 +4527,11 @@ msgstr "" msgid "Show FPS" msgstr "顯示 FPS" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:274 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:275 msgid "Show France" msgstr "顯示 France" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:260 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:261 msgid "Show GameCube" msgstr "顯示 GameCube" @@ -4513,35 +4539,35 @@ msgstr "顯示 GameCube" msgid "Show Input Display" msgstr "輸入顯示" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:276 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:277 msgid "Show Italy" msgstr "顯示 Italy" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:268 msgid "Show JAP" msgstr "顯示 JAP" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:278 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:279 msgid "Show Korea" msgstr "顯示 Korea" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:476 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:508 msgid "Show Language:" msgstr "顯示語系:" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:219 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:220 msgid "Show Log &Configuration" msgstr "日誌記錄設定(&C)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:269 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:270 msgid "Show PAL" msgstr "顯示 PAL" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:257 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 msgid "Show Platforms" msgstr "顯示平å°" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:266 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:267 msgid "Show Regions" msgstr "顯示å€åŸŸ" @@ -4549,27 +4575,27 @@ msgstr "顯示å€åŸŸ" msgid "Show Statistics" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:280 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:281 msgid "Show Taiwan" msgstr "顯示 Taiwan" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:271 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:272 msgid "Show USA" msgstr "顯示 USA" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:262 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:263 msgid "Show Wad" msgstr "顯示 Wad" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:258 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:259 msgid "Show Wii" msgstr "顯示 Wii" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:498 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 msgid "Show a confirmation box before stopping a game." msgstr "在åœæ­¢éŠæˆ²å¾Œé¡¯ç¤ºä¸€å€‹ç¢ºèªæ¡†ã€‚" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:499 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:501 msgid "" "Show a message box when a potentially serious error has occurred.\n" "Disabling this may avoid annoying and non-fatal messages, but it may also " @@ -4587,7 +4613,7 @@ msgstr "顯示第一個å€å¡Š" msgid "Show lag counter" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:500 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:502 msgid "" "Show messages on the emulation screen area.\n" "These messages include memory card writes, video backend and CPU " @@ -4618,7 +4644,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:282 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:283 msgid "Show unknown" msgstr "顯示 未知" @@ -4629,23 +4655,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:310 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 msgid "Sideways Wiimote" msgstr "æ©«æ¡ Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:282 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:519 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:284 msgid "Simplified Chinese" msgstr "Simplified Chinese" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:301 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 msgid "Size" msgstr "大å°" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:703 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:701 msgid "Skip BIOS" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:316 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:348 msgid "Skip DCBZ clearing" msgstr "" @@ -4663,17 +4690,17 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:387 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:401 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:389 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:403 #, c-format msgid "Slot %i" msgstr "儲存格 %i" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:707 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:705 msgid "Slot A" msgstr "æ’槽 A" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:708 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:706 msgid "Slot B" msgstr "æ’槽 B" @@ -4681,7 +4708,7 @@ msgstr "æ’槽 B" msgid "Snapshot" msgstr "截圖" -#: Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp:46 +#: Source/Core/VideoBackends/Software/Src/SWmain.cpp:45 msgid "Software Renderer" msgstr "" @@ -4693,27 +4720,27 @@ msgid "" "Do you really want to enable software rendering? If unsure, select 'No'." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:671 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:669 msgid "Sound Settings" msgstr "è²éŸ³è¨­å®š" -#: Source/Core/AudioCommon/Src/AudioCommon.cpp:64 +#: Source/Core/AudioCommon/Src/AudioCommon.cpp:79 #, c-format msgid "Sound backend %s is not valid." msgstr "è²éŸ³ backend %s 是無效的。" -#: Source/Core/AudioCommon/Src/DSoundStream.cpp:46 -#, c-format -msgid "Sound buffer creation failed: %s" +#: Source/Core/AudioCommon/Src/DSoundStream.cpp:45 +#, fuzzy, c-format +msgid "Sound buffer creation failed: %08x" msgstr "è²éŸ³ç·©è¡å»ºç«‹å¤±æ•—:%s" #: Source/Core/DolphinWX/Src/WXInputBase.cpp:18 msgid "Space" msgstr "Space" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:480 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:265 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:311 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:267 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 msgid "Spanish" msgstr "Spanish" @@ -4733,37 +4760,29 @@ msgid "" "If unsure, select 640x528." msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:322 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:354 msgid "Speed up Disc Transfer Rate" msgstr "加速光碟傳輸率" -#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 -msgid "" -"Speed up vertex streaming by using unsafe OpenGL code. Enabling this option " -"might cause heavy glitches or even crash the emulator.\n" -"\n" -"If unsure, leave this unchecked." -msgstr "" - #: Source/Core/InputCommon/Src/ControllerEmu.cpp:231 msgid "Square Stick" msgstr "Square Stick" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:88 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:90 msgid "Standard Controller" msgstr "標準控制器" #: Source/Core/Core/Src/HW/GCPadEmu.cpp:37 #: Source/Core/DolphinWX/Src/WXInputBase.cpp:25 -#: Source/Core/DolphinWX/Src/NetWindow.cpp:344 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:347 msgid "Start" msgstr "Start" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:196 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:197 msgid "Start &NetPlay" msgstr "開始網路å°æˆ°(&N)" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:345 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:347 msgid "Start Re&cording" msgstr "開始錄製(&C)" @@ -4771,7 +4790,7 @@ msgstr "開始錄製(&C)" msgid "Start Recording" msgstr "開始錄製" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:302 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:303 msgid "State" msgstr "狀態" @@ -4779,7 +4798,7 @@ msgstr "狀態" msgid "State Saves" msgstr "å³æ™‚存檔" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:89 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 msgid "Steering Wheel" msgstr "" @@ -4788,7 +4807,7 @@ msgid "Stick" msgstr "æ–æ¡¿" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:418 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:462 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:171 msgid "Stop" msgstr "åœæ­¢" @@ -4814,39 +4833,40 @@ msgstr "Strum" msgid "Subtract" msgstr "減少" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:67 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:109 #, c-format msgid "Successfully exported file to %s" msgstr "æˆåŠŸåŒ¯å‡ºæª”案至 %s" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:43 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:89 msgid "Successfully imported save files" msgstr "æˆåŠŸåŒ¯å…¥å­˜æª”" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:312 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:314 msgid "Swedish" msgstr "" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:276 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:277 msgid "Swing" msgstr "æ®èˆž" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:320 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:352 msgid "Synchronize GPU thread" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:321 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:353 msgid "" "Synchronizes the GPU and CPU threads to help prevent random freezes in Dual " "Core mode. (ON = Compatible, OFF = Fast)" msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:732 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:780 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:730 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:784 msgid "System Language:" msgstr "系統語系:" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:185 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:184 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:187 msgid "TAIWAN" msgstr "TAIWAN" @@ -4871,13 +4891,13 @@ msgstr "Table å·¦" msgid "Table Right" msgstr "Table å³" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:361 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:464 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:363 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:466 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:181 msgid "Take Screenshot" msgstr "截å–ç•«é¢" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:91 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:93 msgid "TaruKonga (Bongos)" msgstr "" @@ -4897,11 +4917,11 @@ msgstr "" msgid "Texture Format Overlay" msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:220 +#: Source/Core/Core/Src/CoreParameter.cpp:229 msgid "The WAD has been installed successfully" msgstr "WAD 已經安è£æˆåŠŸ" -#: Source/Core/Core/Src/ActionReplay.cpp:185 +#: Source/Core/Core/Src/ActionReplay.cpp:189 msgid "The address is invalid" msgstr "ä½å€ç„¡æ•ˆ" @@ -4909,13 +4929,13 @@ msgstr "ä½å€ç„¡æ•ˆ" msgid "The checksum was successfully fixed" msgstr "校驗已經被æˆåŠŸä¿®å¾©" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1235 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:1245 msgid "The chosen directory is already in the list" msgstr "é¸å–的資料夾已經在列表中" -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1121 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1149 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1220 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1111 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1139 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1210 #, c-format msgid "" "The file %s already exists.\n" @@ -4936,7 +4956,7 @@ msgstr "檔案 %s 無法開啟進行寫入。請確èªæ˜¯å¦æœ‰åˆ¥çš„程å¼æ­£ msgid "The file %s was already open, the file header will not be written." msgstr "檔案 %s 已經開啟,檔頭無法被寫入。" -#: Source/Core/Core/Src/Boot/Boot.cpp:320 +#: Source/Core/Core/Src/Boot/Boot.cpp:319 #, c-format msgid "The file you specified (%s) does not exist" msgstr "指定的檔案 (%s) ä¸å­˜åœ¨" @@ -4965,48 +4985,48 @@ msgstr "" msgid "The save you are trying to copy has an invalid file size" msgstr "您嘗試複製的檔案有一個無效的檔案大å°" -#: Source/Core/DolphinWX/Src/Main.cpp:419 +#: Source/Core/DolphinWX/Src/Main.cpp:424 msgid "" "The selected language is not supported by your system. Falling back to " "system default." msgstr "é¸æ“‡çš„語系ä¸æ”¯æ´æ‚¨çš„系統。將使用系統é è¨­å€¼ã€‚" -#: Source/Core/Core/Src/NetPlayClient.cpp:107 +#: Source/Core/Core/Src/NetPlayClient.cpp:95 msgid "The server and client's NetPlay versions are incompatible!" msgstr "伺æœå™¨èˆ‡å®¢æˆ¶ç«¯çš„網路å°æˆ°ç‰ˆæœ¬ä¸å…¼å®¹ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:104 +#: Source/Core/Core/Src/NetPlayClient.cpp:92 msgid "The server is full!" msgstr "伺æœå™¨å·²æ»¿ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:110 +#: Source/Core/Core/Src/NetPlayClient.cpp:98 msgid "The server responded: the game is currently running!" msgstr "伺æœå™¨å›žæ‡‰ï¼šéŠæˆ²ç›®å‰æ­£åœ¨åŸ·è¡Œï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:113 +#: Source/Core/Core/Src/NetPlayClient.cpp:101 msgid "The server sent an unknown error message!" msgstr "伺æœå™¨ç™¼ç”Ÿäº†ä¸€å€‹æœªçŸ¥éŒ¯èª¤è¨Šæ¯ï¼" -#: Source/Core/Core/Src/CoreParameter.cpp:113 +#: Source/Core/Core/Src/CoreParameter.cpp:121 #, c-format msgid "The specified file \"%s\" does not exist" msgstr "指定的檔案 \"%s\" ä¸å­˜åœ¨" -#: Source/Core/Core/Src/ActionReplay.cpp:186 +#: Source/Core/Core/Src/ActionReplay.cpp:190 msgid "The value is invalid" msgstr "這個數值無效" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:630 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:628 msgid "Theme:" msgstr "" -#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:463 +#: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp:607 msgid "" "There must be a ticket for 00000001/00000002. Your NAND dump is probably " "incomplete." msgstr "必須有 00000001/00000002 的標簽。這個 NAND dump å¯èƒ½æ˜¯ä¸å®Œæ•´çš„。" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:308 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:339 msgid "" "These settings override core Dolphin settings.\n" "Undetermined means the game uses Dolphin's setting." @@ -5014,13 +5034,13 @@ msgstr "" "這些設定將替代核心 Dolphin 設定。\n" "未確定表示éŠæˆ²ä½¿ç”¨ Dolphin 的設定。" -#: Source/Core/Core/Src/ActionReplay.cpp:345 +#: Source/Core/Core/Src/ActionReplay.cpp:351 msgid "" "This action replay simulator does not support codes that modify Action " "Replay itself." msgstr "Action replay 模擬器ä¸æ”¯æ´è¢« Action Replay 自身修改的代碼。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:512 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:514 msgid "This could cause slow down in Wii Menu and some games." msgstr "這å¯èƒ½æœƒä½¿ Wii Menu 和部分éŠæˆ²é™é€Ÿã€‚" @@ -5036,7 +5056,7 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:492 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:494 msgid "" "This limits the game speed to the specified number of frames per second " "(full speed is 60 for NTSC and 50 for PAL). Alternatively, use Audio to " @@ -5044,7 +5064,7 @@ msgid "" "noise depending on the game)." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:491 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:493 msgid "" "This splits the Video and CPU threads, so they can be run on separate " "cores.\n" @@ -5054,7 +5074,7 @@ msgstr "" "這將分離影åƒå’Œ CPU 線程,所以它們å¯ä»¥åŸ·è¡Œæ–¼ç¨ç«‹çš„內核中。\n" "å¯ä»¥åœ¨å¤šæ ¸å¿ƒçš„ PC 上å–å¾—éžå¸¸å¤§çš„加速,但是也å¯èƒ½å°Žè‡´å¶çˆ¾å´©æ½°æˆ–圖片å•é¡Œã€‚" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:287 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:314 msgid "This will let you Manually Edit the INI config file" msgstr "這將å…許您手工編輯 INI 設定檔案" @@ -5063,12 +5083,12 @@ msgstr "這將å…許您手工編輯 INI 設定檔案" msgid "Threshold" msgstr "閾值" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:279 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:280 msgid "Tilt" msgstr "傾斜" #: Source/Core/DolphinWX/Src/MemcardManager.cpp:622 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:294 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:295 msgid "Title" msgstr "標題" @@ -5082,21 +5102,18 @@ msgid "Toggle All Log Types" msgstr "å…¨é¸/全部å–消" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:191 -#, fuzzy msgid "Toggle Aspect Ratio" -msgstr "ç•«é¢æ¯”例:" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:192 -#, fuzzy msgid "Toggle EFB Copies" -msgstr "å…¨é¸/全部å–消" +msgstr "" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:193 -#, fuzzy msgid "Toggle Fog" -msgstr "å…¨é¸/全部å–消" +msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:463 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:465 #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:180 msgid "Toggle Fullscreen" msgstr "切æ›å…¨èž¢å¹•" @@ -5106,15 +5123,16 @@ msgid "Toggle IR" msgstr "" #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:104 -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:273 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:275 msgid "Top" msgstr "上方" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:283 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:520 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:285 msgid "Traditional Chinese" msgstr "Traditional Chinese" -#: Source/Core/Core/Src/Boot/Boot.cpp:414 +#: Source/Core/Core/Src/Boot/Boot.cpp:413 msgid "Tried to load an unknown file type." msgstr "已嘗試讀å–從未知的檔案類型。" @@ -5134,7 +5152,7 @@ msgstr "" "嘗試讀å–從無效的 SYSCONF\n" "Wiimote bt ids 是無效的" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:313 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:315 msgid "Turkish" msgstr "Turkish" @@ -5150,12 +5168,12 @@ msgstr "é¡žåž‹" msgid "UDP Port:" msgstr "UDP 埠å£ï¼š" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:270 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:271 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:12 msgid "UDP Wiimote" msgstr "UDP Wiimote" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:193 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:196 msgid "UNKNOWN" msgstr "未知" @@ -5164,7 +5182,7 @@ msgstr "未知" msgid "UNKNOWN_%02X" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:172 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:163 msgid "USA" msgstr "USA" @@ -5177,12 +5195,12 @@ msgstr "" #: Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp:111 #, c-format msgid "" -"Unable to parse line %lu of the entered AR code as a valid encrypted or " +"Unable to parse line %u of the entered AR code as a valid encrypted or " "decrypted code. Make sure you typed it correctly.\n" "Would you like to ignore this line and continue parsing?" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:428 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:430 #, c-format msgid "Undefined %i" msgstr "未指定 %i" @@ -5192,19 +5210,18 @@ msgid "Undo Load State" msgstr "å–消讀å–進度" #: Source/Core/DolphinWX/Src/HotkeyDlg.cpp:230 -#, fuzzy msgid "Undo Save State" -msgstr "å–消讀å–進度" +msgstr "" #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:726 msgid "Unexpected 0x80 call? Aborting..." msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:192 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:191 msgid "Unknown" msgstr "未知" -#: Source/Core/Core/Src/HW/DVDInterface.cpp:968 +#: Source/Core/Core/Src/HW/DVDInterface.cpp:972 #, c-format msgid "Unknown DVD command %08x - fatal error" msgstr "未知的 DVD 命令 %08x - 致命錯誤" @@ -5219,12 +5236,12 @@ msgstr "" msgid "Unknown entry type %i in SYSCONF (%s@%x)!" msgstr "未知的登錄類型 %i æ–¼ SYSCONF (%s@%x)ï¼" -#: Source/Core/Core/Src/NetPlayClient.cpp:312 +#: Source/Core/Core/Src/NetPlayClient.cpp:328 #, c-format msgid "Unknown message received with id : %d" msgstr "接收到帶有未知 id 的錯誤訊æ¯ï¼š%d" -#: Source/Core/Core/Src/NetPlayServer.cpp:478 +#: Source/Core/Core/Src/NetPlayServer.cpp:476 #, c-format msgid "Unknown message with id:%d received from player:%d Kicking player!" msgstr "知訊æ¯å¸¶æœ‰ id:%d 接收於玩家:%d 正在æ出玩家ï¼" @@ -5234,16 +5251,16 @@ msgstr "知訊æ¯å¸¶æœ‰ id:%d 接收於玩家:%d 正在æ出玩家ï¼" msgid "Up" msgstr "上" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:85 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:84 #: Source/Core/DolphinWX/Src/UDPConfigDiag.cpp:17 msgid "Update" msgstr "æ›´æ–°" -#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:311 +#: Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp:312 msgid "Upright Wiimote" msgstr "ç›´æ¡ Wiimote" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:765 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:769 msgid "Use EuRGB60 Mode (PAL60)" msgstr "使用 EuRGB60 æ¨¡å¼ (PAL60)" @@ -5251,7 +5268,7 @@ msgstr "使用 EuRGB60 æ¨¡å¼ (PAL60)" msgid "Use Fullscreen" msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:580 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:582 msgid "Use Hex" msgstr "使用 Hex" @@ -5275,6 +5292,15 @@ msgid "" "If unsure, leave this unchecked." msgstr "" +#: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:89 +msgid "" +"Uses unsafe operations to speed up vertex streaming in OpenGL. There are no " +"known problems on supported GPUs, but it will cause severe stability and " +"graphical issues otherwise.\n" +"\n" +"If unsure, leave this unchecked." +msgstr "" + #: Source/Core/DolphinWX/Src/VideoConfigDiag.cpp:126 msgid "" "Usually if shader compilation fails, an error message is displayed.\n" @@ -5292,12 +5318,11 @@ msgstr "工具" msgid "V-Sync" msgstr "åž‚ç›´åŒæ­¥" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:318 -#, fuzzy +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:350 msgid "VBeam Speed Hack" -msgstr "MMU 速度修正" +msgstr "" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:186 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:185 msgid "Value" msgstr "數值" @@ -5305,7 +5330,7 @@ msgstr "數值" msgid "Value:" msgstr "數值:" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:577 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:579 msgid "Value: " msgstr "數值:" @@ -5317,7 +5342,7 @@ msgstr "事件" msgid "Vertex Streaming Hack" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:381 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:413 msgid "Video" msgstr "å½±åƒ" @@ -5325,17 +5350,17 @@ msgstr "å½±åƒ" msgid "Virtual" msgstr "虛擬" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:677 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:675 msgid "Volume" msgstr "音é‡" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:488 -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:517 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:475 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:504 #, c-format msgid "WAD installation failed: error creating %s" msgstr "WAD installation 失敗:錯誤於建立 %s" -#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:537 +#: Source/Core/DiscIO/Src/NANDContentLoader.cpp:524 msgid "WAD installation failed: error creating ticket" msgstr "" @@ -5353,19 +5378,19 @@ msgstr "" msgid "Warning" msgstr "警告" -#: Source/Core/Core/Src/Boot/Boot.cpp:279 +#: Source/Core/Core/Src/Boot/Boot.cpp:278 msgid "Warning - starting DOL in wrong console mode!" msgstr "警告 - DOL 啟動於錯誤的主機模å¼ï¼" -#: Source/Core/Core/Src/Boot/Boot.cpp:329 +#: Source/Core/Core/Src/Boot/Boot.cpp:328 msgid "Warning - starting ELF in wrong console mode!" msgstr "警告 - ELF 啟動於錯誤的主機模å¼ï¼" -#: Source/Core/Core/Src/Boot/Boot.cpp:209 +#: Source/Core/Core/Src/Boot/Boot.cpp:212 msgid "Warning - starting ISO in wrong console mode!" msgstr "警告 - ISO 啟動於錯誤的主機模å¼ï¼" -#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:512 +#: Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp:563 #, c-format msgid "" "Warning! it is advised to backup all files in the folder:\n" @@ -5389,7 +5414,7 @@ msgstr "" "以åŠåœ¨æ‚¨è¨˜æ†¶å¡ä¸­ 相åŒæª”案å的檔案\n" "è¦ç¹¼çºŒå—Žï¼Ÿ" -#: Source/Core/Core/Src/Movie.cpp:823 +#: Source/Core/Core/Src/Movie.cpp:837 #, c-format msgid "" "Warning: You loaded a save that's after the end of the current movie. (byte " @@ -5397,7 +5422,7 @@ msgid "" "load this state with read-only mode off." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:840 +#: Source/Core/Core/Src/Movie.cpp:854 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You " @@ -5405,7 +5430,7 @@ msgid "" "only mode off. Otherwise you'll probably get a desync." msgstr "" -#: Source/Core/Core/Src/Movie.cpp:850 +#: Source/Core/Core/Src/Movie.cpp:864 #, c-format msgid "" "Warning: You loaded a save whose movie mismatches on frame %d. You should " @@ -5445,19 +5470,15 @@ msgstr "寬度" msgid "Wii" msgstr "Wii" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:372 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:404 msgid "Wii Console" msgstr "Wii 主機" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:832 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:836 msgid "Wii NAND Root:" msgstr "" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:193 -msgid "Wii Save Import" -msgstr "匯入 Wii 存檔" - -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1317 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1335 msgid "Wii save files (*.bin)|*.bin" msgstr "Wii 存檔 (*.bin)|*.bin" @@ -5466,16 +5487,22 @@ msgid "WiiWAD: Could not read from file" msgstr "WiiWAD:無法從檔案中讀å–" #: Source/Core/Core/Src/HW/Wiimote.cpp:20 -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote" msgstr "Wiimote" +#: Source/Core/DolphinWX/Src/NetWindow.cpp:631 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:657 +#, fuzzy +msgid "Wiimote " +msgstr "Wiimote" + #: Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp:21 #, c-format msgid "Wiimote %i" msgstr "" -#: Source/Core/DolphinWX/Src/Main.cpp:659 +#: Source/Core/DolphinWX/Src/Main.cpp:673 msgid "Wiimote Connected" msgstr "Wiimote 已連接" @@ -5483,7 +5510,7 @@ msgstr "Wiimote 已連接" msgid "Wiimote Motor" msgstr "Wiimote 馬é”" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:470 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:472 msgid "Wiimote settings" msgstr "Wiimote 設定" @@ -5507,14 +5534,14 @@ msgstr "視窗 å³" msgid "Word Wrap" msgstr "自動æ›è¡Œ" -#: Source/Core/DolphinWX/Src/FrameTools.cpp:1372 -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:899 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1093 -#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1229 +#: Source/Core/DolphinWX/Src/FrameTools.cpp:1388 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:947 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1083 +#: Source/Core/DolphinWX/Src/GameListCtrl.cpp:1219 msgid "Working..." msgstr "執行中..." -#: Source/Core/DolphinWX/Src/NetWindow.cpp:354 +#: Source/Core/DolphinWX/Src/NetWindow.cpp:357 msgid "Write memcards (GC)" msgstr "" @@ -5534,21 +5561,36 @@ msgstr "寫入至檔案" msgid "Write to Window" msgstr "寫入至視窗" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:47 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:80 #, c-format msgid "XAudio2 CreateSourceVoice failed: %#X" msgstr "XAudio2 建立原始è²éŸ³å¤±æ•—: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:101 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:180 #, c-format msgid "XAudio2 init failed: %#X" msgstr "XAudio2 åˆå§‹åŒ–失敗: %#X" -#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:111 +#: Source/Core/AudioCommon/Src/XAudio2Stream.cpp:190 #, c-format msgid "XAudio2 master voice creation failed: %#X" msgstr "XAudio2 主è²éŸ³å»ºç«‹å¤±æ•—: %#X" +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:93 +#, fuzzy, c-format +msgid "XAudio2_7 CreateSourceVoice failed: %#X" +msgstr "XAudio2 建立原始è²éŸ³å¤±æ•—: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:181 +#, fuzzy, c-format +msgid "XAudio2_7 init failed: %#X" +msgstr "XAudio2 åˆå§‹åŒ–失敗: %#X" + +#: Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp:191 +#, fuzzy, c-format +msgid "XAudio2_7 master voice creation failed: %#X" +msgstr "XAudio2 主è²éŸ³å»ºç«‹å¤±æ•—: %#X" + #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:776 msgid "XF reg" msgstr "" @@ -5578,11 +5620,11 @@ msgstr "您ä¸èƒ½é—œé–‰æœ‰é é¢çš„é¢æ¿ã€‚" msgid "You must choose a game!!" msgstr "您必須é¸æ“‡ä¸€å€‹éŠæˆ²ï¼ï¼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:610 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:612 msgid "You must enter a name!" msgstr "您必須輸入一個å稱ï¼" -#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:455 +#: Source/Core/DolphinWX/Src/CheatsWindow.cpp:457 msgid "You must enter a valid decimal, hexadecimal or octal value." msgstr "您必須輸入一個有效的å進制,å六進制或八進制的數值。" @@ -5590,9 +5632,9 @@ msgstr "您必須輸入一個有效的å進制,å六進制或八進制的數 msgid "You must enter a valid profile name." msgstr "您必須輸入一個有效的設定檔å稱。" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:924 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:928 msgid "You must restart Dolphin in order for the change to take effect." -msgstr "您必須é‡æ–°å•Ÿå‹• Dolphin 使更改生效。" +msgstr "You must restart Dolphin in order for the change to take effect." #: Source/Core/Core/Src/DSP/DSPCore.cpp:109 msgid "" @@ -5601,7 +5643,7 @@ msgid "" "If you select \"No\", audio might be garbled." msgstr "" -#: Source/Core/Core/Src/CoreParameter.cpp:169 +#: Source/Core/Core/Src/CoreParameter.cpp:178 msgid "" "Your GCM/ISO file seems to be invalid (invalid country).\n" "Continue with PAL region?" @@ -5620,15 +5662,15 @@ msgstr "" "應該是 0x%04x (è€Œéž 0x%04llx)\n" "是å¦è¦å»ºç«‹æ–°çš„檔案?" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:334 +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:366 msgid "ZTP hack" msgstr "ZTP 修正" -#: Source/Core/Core/Src/ActionReplay.cpp:377 +#: Source/Core/Core/Src/ActionReplay.cpp:383 msgid "Zero 3 code not supported" msgstr "ä¸æ”¯æ´ Zero 3 代碼" -#: Source/Core/Core/Src/ActionReplay.cpp:398 +#: Source/Core/Core/Src/ActionReplay.cpp:404 #, c-format msgid "Zero code unknown to dolphin: %08x" msgstr "Zero code 未知於 dolphin: %08x" @@ -5670,20 +5712,24 @@ msgid "" "If unsure, leave this unchecked." msgstr "" -#: Source/Core/DolphinWX/Src/ConfigMain.cpp:808 +#: Source/Core/DolphinWX/Src/ConfigMain.cpp:812 msgid "apploader (.img)" msgstr "程å¼è®€å–器 (.img)" -#: Source/Core/Core/Src/PowerPC/JitInterface.cpp:272 -#, c-format -msgid "iCacheJIT: Reading Opcode from %x. Please report." -msgstr "iCacheJIT:從 %x ä¸­è®€å– Opcode 。請回報。" - #: Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp:947 msgid "s" msgstr "" -#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1155 +#: Source/Core/Core/Src/x64MemTools.cpp:214 +#, c-format +msgid "unknown flavor %d (expected %d)" +msgstr "" + +#: Source/Core/Core/Src/x64MemTools.cpp:208 +msgid "unknown message received" +msgstr "" + +#: Source/Core/DolphinWX/Src/ISOProperties.cpp:1157 msgid "wxExecute returned -1 on application run!" msgstr "wxExecute 返回 -1 在應用程å¼åŸ·è¡Œæ™‚ï¼" @@ -5699,30 +5745,11 @@ msgstr "zNear 修正:" msgid "| OR" msgstr "| 或" -#~ msgid "Accurate VBeam emulation" -#~ msgstr "精確的 VBeam 模擬" +#~ msgid "Could not create %s" +#~ msgstr "無法建立 %s" -#~ msgid "Enable Hotkeys" -#~ msgstr "é–‹å•Ÿå¿«æ·éµ" +#~ msgid "Direct3D11" +#~ msgstr "Direct3D11" -#~ msgid "Failed to Listen!!" -#~ msgstr "監è½å¤±æ•—ï¼ï¼" - -#~ msgid "Failed to load hid.dll" -#~ msgstr "è®€å– hid.dll 失敗" - -#~ msgid "HCI_CMD_INQUIRY is called, please report!" -#~ msgstr "HCI_CMD_INQUIRY 被調用,請回報ï¼" - -#~ msgid "" -#~ "If the FPS is erratic, this option may help. (ON = Compatible, OFF = Fast)" -#~ msgstr "開啟記憶體管ç†å–®å…ƒï¼ŒæŸäº›éŠæˆ²éœ€è¦ã€‚(ON = 兼容ã€OFF = 快速)" - -#~ msgid "Last Overwritten State" -#~ msgstr "最後覆蓋的進度" - -#~ msgid "Last Saved State" -#~ msgstr "最後使用的進度" - -#~ msgid "Set" -#~ msgstr "設定" +#~ msgid "iCacheJIT: Reading Opcode from %x. Please report." +#~ msgstr "iCacheJIT:從 %x ä¸­è®€å– Opcode 。請回報。" diff --git a/Source/Android/.settings/org.eclipse.jdt.core.prefs b/Source/Android/.settings/org.eclipse.jdt.core.prefs index f77b31c2d2..b080d2ddc8 100644 --- a/Source/Android/.settings/org.eclipse.jdt.core.prefs +++ b/Source/Android/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/Source/Android/AndroidManifest.xml b/Source/Android/AndroidManifest.xml index a6918f867b..2e3964c65f 100644 --- a/Source/Android/AndroidManifest.xml +++ b/Source/Android/AndroidManifest.xml @@ -1,49 +1,47 @@ + android:versionCode="12" + android:versionName="0.12" + android:installLocation="auto"> - - - - - - - - + + + + + + + + + + + android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > + + + + + + - - - - - - - - - + android:name="org.dolphinemu.dolphinemu.settings.PrefsActivity" + android:label="@string/settings" /> + diff --git a/Source/Android/android.toolchain.cmake b/Source/Android/android.toolchain.cmake index 0f7e340678..4ca8f94266 100644 --- a/Source/Android/android.toolchain.cmake +++ b/Source/Android/android.toolchain.cmake @@ -119,7 +119,7 @@ # libraries. Automatically turned for NDK r5x and r6x due to GLESv2 # problems. # -# LIBRARY_OUTPUT_PATH_ROOT=${CMAKE_SOURCE_DIR} - where to output binary +# LIBRARY_OUTPUT_PATH_ROOT=${CMAKE_CURRENT_BINARY_DIR} - where to output binary # files. See additional details below. # # ANDROID_SET_OBSOLETE_VARIABLES=ON - if set, then toolchain defines some @@ -187,7 +187,7 @@ # # LIBRARY_OUTPUT_PATH_ROOT should be set in cache to determine where Android # libraries will be installed. -# Default is ${CMAKE_SOURCE_DIR}, and the android libs will always be +# Default is ${CMAKE_CURRENT_BINARY_DIR}, and the android libs will always be # under the ${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME} # (depending on the target ABI). This is convenient for Android packaging. # @@ -1431,7 +1431,7 @@ include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLU link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) # setup output directories -set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" ) +set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" ) set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) if(NOT _CMAKE_IN_TRY_COMPILE) diff --git a/Source/Android/assets/Dolphin.ini b/Source/Android/assets/Dolphin.ini index 1ccac4d26e..944bbf75bb 100644 --- a/Source/Android/assets/Dolphin.ini +++ b/Source/Android/assets/Dolphin.ini @@ -10,7 +10,7 @@ CPUCore = 3 CPUThread = False GFXBackend = Software Renderer HLE_BS2 = False -Fastmem = True +Fastmem = False DSPThread = False DSPHLE = True SkipIdle = True @@ -56,7 +56,7 @@ ShowStatusbar = True ShowLogWindow = False ShowLogConfigWindow = False ShowConsole = False -ThemeName = Boomy +ThemeName40 = Clean [Hotkeys] Open = 79 OpenModifier = 2 diff --git a/Source/Android/custom_rules.xml b/Source/Android/custom_rules.xml index e06de68e57..c19d48e25f 100644 --- a/Source/Android/custom_rules.xml +++ b/Source/Android/custom_rules.xml @@ -8,7 +8,7 @@ + includes="libmain.so" /> diff --git a/Source/Android/res/drawable-hdpi/ic_drawer.png b/Source/Android/res/drawable-hdpi/ic_drawer.png new file mode 100644 index 0000000000..6614ea4f4d Binary files /dev/null and b/Source/Android/res/drawable-hdpi/ic_drawer.png differ diff --git a/Source/Android/res/drawable-hdpi/ic_launcher.png b/Source/Android/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000..3b9af56e5d Binary files /dev/null and b/Source/Android/res/drawable-hdpi/ic_launcher.png differ diff --git a/Source/Android/res/drawable-hdpi/launcher.png b/Source/Android/res/drawable-hdpi/launcher.png deleted file mode 100644 index da35bbad81..0000000000 Binary files a/Source/Android/res/drawable-hdpi/launcher.png and /dev/null differ diff --git a/Source/Android/res/drawable-mdpi/ic_drawer.png b/Source/Android/res/drawable-mdpi/ic_drawer.png new file mode 100644 index 0000000000..b05c026c18 Binary files /dev/null and b/Source/Android/res/drawable-mdpi/ic_drawer.png differ diff --git a/Source/Android/res/drawable-mdpi/ic_launcher.png b/Source/Android/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000..065f08541d Binary files /dev/null and b/Source/Android/res/drawable-mdpi/ic_launcher.png differ diff --git a/Source/Android/res/drawable-mdpi/launcher.png b/Source/Android/res/drawable-mdpi/launcher.png deleted file mode 100644 index 03e5eea949..0000000000 Binary files a/Source/Android/res/drawable-mdpi/launcher.png and /dev/null differ diff --git a/Source/Android/res/drawable-xhdpi/ic_drawer.png b/Source/Android/res/drawable-xhdpi/ic_drawer.png new file mode 100644 index 0000000000..bcf49dd73c Binary files /dev/null and b/Source/Android/res/drawable-xhdpi/ic_drawer.png differ diff --git a/Source/Android/res/drawable-xhdpi/ic_launcher.png b/Source/Android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..06fdfa1d92 Binary files /dev/null and b/Source/Android/res/drawable-xhdpi/ic_launcher.png differ diff --git a/Source/Android/res/drawable-xhdpi/launcher.png b/Source/Android/res/drawable-xhdpi/launcher.png deleted file mode 100644 index 28770da81f..0000000000 Binary files a/Source/Android/res/drawable-xhdpi/launcher.png and /dev/null differ diff --git a/Source/Android/res/drawable-xxhdpi/ic_drawer.png b/Source/Android/res/drawable-xxhdpi/ic_drawer.png new file mode 100644 index 0000000000..f7e3b3079d Binary files /dev/null and b/Source/Android/res/drawable-xxhdpi/ic_drawer.png differ diff --git a/Source/Android/res/drawable-xxhdpi/ic_launcher.png b/Source/Android/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000..1f7e577295 Binary files /dev/null and b/Source/Android/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/Source/Android/res/drawable-xxhdpi/ic_menu_file.png b/Source/Android/res/drawable-xxhdpi/ic_menu_file.png new file mode 100644 index 0000000000..5b09550c00 Binary files /dev/null and b/Source/Android/res/drawable-xxhdpi/ic_menu_file.png differ diff --git a/Source/Android/res/drawable-xxhdpi/ic_menu_folder.png b/Source/Android/res/drawable-xxhdpi/ic_menu_folder.png new file mode 100644 index 0000000000..68792f0587 Binary files /dev/null and b/Source/Android/res/drawable-xxhdpi/ic_menu_folder.png differ diff --git a/Source/Android/res/drawable-xxhdpi/launcher.png b/Source/Android/res/drawable-xxhdpi/launcher.png deleted file mode 100644 index 7cb72b57bb..0000000000 Binary files a/Source/Android/res/drawable-xxhdpi/launcher.png and /dev/null differ diff --git a/Source/Android/res/drawable/ic_drawer.png b/Source/Android/res/drawable/ic_drawer.png deleted file mode 100644 index f62119bb3b..0000000000 Binary files a/Source/Android/res/drawable/ic_drawer.png and /dev/null differ diff --git a/Source/Android/res/layout/about_layout.xml b/Source/Android/res/layout/about_layout.xml index 7189fd7ce5..9c5b84e9ed 100644 --- a/Source/Android/res/layout/about_layout.xml +++ b/Source/Android/res/layout/about_layout.xml @@ -1,29 +1,24 @@ - + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:minHeight="?android:attr/listPreferredItemHeight" + android:orientation="vertical"> - + - + - \ No newline at end of file diff --git a/Source/Android/res/layout/emulation_view.xml b/Source/Android/res/layout/emulation_view.xml new file mode 100644 index 0000000000..62cbbe703e --- /dev/null +++ b/Source/Android/res/layout/emulation_view.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/Source/Android/res/layout/folderbrowser.xml b/Source/Android/res/layout/folderbrowser.xml deleted file mode 100644 index d3ee4538fa..0000000000 --- a/Source/Android/res/layout/folderbrowser.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - diff --git a/Source/Android/res/layout/gamelist_layout.xml b/Source/Android/res/layout/gamelist_folderbrowser_list_item.xml similarity index 57% rename from Source/Android/res/layout/gamelist_layout.xml rename to Source/Android/res/layout/gamelist_folderbrowser_list_item.xml index f27b5968a6..e386000c79 100644 --- a/Source/Android/res/layout/gamelist_layout.xml +++ b/Source/Android/res/layout/gamelist_folderbrowser_list_item.xml @@ -2,53 +2,41 @@ + android:padding="3dp"> + android:layout_marginRight="6dip"/> - - + - - - diff --git a/Source/Android/res/layout/gamelist_listview.xml b/Source/Android/res/layout/gamelist_listview.xml index 265a8f0b36..bbd1a43c07 100644 --- a/Source/Android/res/layout/gamelist_listview.xml +++ b/Source/Android/res/layout/gamelist_listview.xml @@ -3,5 +3,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" - android:divider="@android:color/transparent" - android:dividerHeight="0dp"/> \ No newline at end of file + android:dividerHeight="1dp"/> \ No newline at end of file diff --git a/Source/Android/res/layout/prefs.xml b/Source/Android/res/layout/prefs.xml deleted file mode 100644 index 53dd443300..0000000000 --- a/Source/Android/res/layout/prefs.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Android/res/layout/prefs_viewpager.xml b/Source/Android/res/layout/prefs_viewpager.xml new file mode 100644 index 0000000000..04b517dd7f --- /dev/null +++ b/Source/Android/res/layout/prefs_viewpager.xml @@ -0,0 +1,5 @@ + diff --git a/Source/Android/res/layout/sidemenu.xml b/Source/Android/res/layout/sidemenu.xml index 6f4b8d3e5d..2066f4b10b 100644 --- a/Source/Android/res/layout/sidemenu.xml +++ b/Source/Android/res/layout/sidemenu.xml @@ -1,26 +1,19 @@ - - - - - + diff --git a/Source/Android/res/menu/emuwindow_overlay.xml b/Source/Android/res/menu/emuwindow_overlay.xml new file mode 100644 index 0000000000..dc875203e8 --- /dev/null +++ b/Source/Android/res/menu/emuwindow_overlay.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Android/res/menu/gamelist_menu.xml b/Source/Android/res/menu/gamelist_menu.xml new file mode 100644 index 0000000000..dbec1a65f3 --- /dev/null +++ b/Source/Android/res/menu/gamelist_menu.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/Source/Android/res/values-ja/strings.xml b/Source/Android/res/values-ja/strings.xml index 3ab83ed25a..77db4fee79 100644 --- a/Source/Android/res/values-ja/strings.xml +++ b/Source/Android/res/values-ja/strings.xml @@ -3,34 +3,52 @@ Dolphin Emulator - + ナビゲーションウィンドウを開ã ナビゲーションウィンドウを閉ã˜ã‚‹ - + - ビルドã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š - サãƒãƒ¼ãƒˆã®OpenGL ES 3: - + ビルドã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ + サãƒãƒ¼ãƒˆã®OpenGL ES 3 + サãƒãƒ¼ãƒˆã®NEON + - ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªï¼š + ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªï¼š %1$s 親ディレクトリ - フォルダ - ファイルサイズ: - 圧縮ファイル形å¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“ - + ファイルサイズ: %1$s + + クリア + ゲームリストã‹ã‚‰ã™ã¹ã¦ã®é …目を削除ã—ã¾ã™ã‹ï¼Ÿ ゲームリスト フォルダã®å‚ç…§ 設定 - ゲームパッド設定 ã«ã¤ã„㦠+ + デãƒã‚¤ã‚¹ã®äº’æ›æ€§ã®è­¦å‘Š + ã“ã®é›»è©±ã¯ã€NEON拡張をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 ãŠãらãDolphinを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\nã‚ãªãŸã¯ã¨ã«ã‹ããれを実行ã—ã¦ã¿ã¾ã™ã‹ï¼Ÿ + - クリックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ï¼š - + クリックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ï¼š %1$s + + + スクリーンショットを撮る + ステートセーブ + ステートロード + 終了 + ã“ã®ã‚²ãƒ¼ãƒ ã‚’終了ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + スロット 1 + スロット 2 + スロット 3 + スロット 4 + スロット 5 + - ç”»é¢ä¸Šã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’æç”» + 入力 + 入力ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚° + %1$sã«ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹ãŸã‚ã®å…¥åŠ›ã‚’移動ã¾ãŸã¯æŠ¼ã—ã¦ãã ã•ã„。 Aボタン Bボタン スタートボタン @@ -51,30 +69,80 @@ C-スティック: → å·¦ã®ãƒˆãƒªã‚¬ãƒ¼ å³ã®ãƒˆãƒªã‚¬ãƒ¼ - - コントロールã¯ç”»é¢ä¸Šã«æç”»ã•ã‚Œã¦ã„ãªã„ - コントロールã¯ç”»é¢ä¸Šã«æç”»ã•ã‚Œã¦ã„ã¾ã™ - %1$sを設定ã™ã‚‹ã«ã¯ãƒœã‚¿ãƒ³ã‚’押ã—㦠- - + + Interpreter JIT64 Recompiler JITIL Recompiler JIT ARM Recompiler + JITIL ARM Recompiler + CPU CPUコア - CPU設定 - 使用ã™ã‚‹ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚³ã‚¢ + %s デュアルコア - 有効/無効 - - ビデオ設定 + 処ç†ã®ãŸã‚ã®2ã¤ã®CPUコアを使用ã—ã¦ã€‚速度ãŒå‘上ã—ã¾ã™ã€‚ + Fastmem + メモリアクセスã®ãŸã‚ã«æ½œåœ¨çš„ã«å±é™ºãªæœ€é©åŒ–を使用ã—ã¦ã€‚ + + + ビデオ Software Renderer - OpenGL ES 3 + OpenGL ES ビデオレンダラ - 使用ã™ã‚‹ãƒ“デオレンダラー - + %s + FPSを表示 + エミュレーション速度ã®æŒ‡æ¨™ã¨ã—ã¦ã€ç”»é¢å·¦ä¸Šã«æ¯Žç§’レンダリングã•ã‚ŒãŸ フレーム数を表示ã—ã¾ã™ã€‚ + ç”»é¢ä¸Šã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’æç”» + + 画質å‘上ã®è¨­å®š + 内部解åƒåº¦ã®å¤‰æ›´ + 内部解åƒåº¦ã®è¨ˆç®—æ–¹å¼ã‚’設定ã—ã¾ã™ã€‚高解åƒåº¦ã«è¨­å®šã™ã‚‹ã“ã¨ã§å¤§ãã 画質ãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€ã‚²ãƒ¼ãƒ ã«ã‚ˆã£ã¦ã¯éžå¸¸ã«é‡ããªã£ãŸã‚Šæç”»ãƒã‚°ã®åŽŸå› ã¨ãªã‚Šã¾ã™ã€‚ ã€ã‚²ãƒ¼ãƒ è§£åƒåº¦ã®å€æ•°ã€‘ã¯ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚µã‚¤ã‚ºã«æ‹¡å¤§ã€‘より少ã—é‡ããªã‚Š ã¾ã™ãŒã€æç”»ãƒã‚°ã¯ç™ºç”Ÿã—ã«ãããªã‚Šã¾ã™ã€‚ ã¾ãŸä¸€èˆ¬çš„ã«å†…部解åƒåº¦ãŒä½Žã„ã»ã©ã€å‹•ä½œé€Ÿåº¦ã¯å‘上ã—ã¾ã™ã€‚ + フルシーンアンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚° + 3Dグラフィックスをラスタライズã«ã‚ˆã£ã¦ç”Ÿã˜ã‚‹ã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°ã®é‡ãŒæ¸›å°‘。 レンダリングã•ã‚ŒãŸç”»åƒã¯ã‚ã¾ã‚Šã‚®ã‚¶ã‚®ã‚¶ã«ãªã‚Šã¾ã™ã€‚ 抽é¸ã§ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³é€Ÿåº¦ã‚’下ã’ã¾ã™ã€‚å•é¡Œã‚’引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + 異方性フィルタリング + 異方性フィルタリングをé©ç”¨ã—ã¾ã™ã€‚ 奥行ãã®ã‚るテクスãƒãƒ£ã‚’より精細ã«æç”»ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ 特定ã®ã‚²ãƒ¼ãƒ ã§ã¯æç”»ãƒã‚°ã®åŽŸå› ã«ãªã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ + Scaled EFB Copy + テクスãƒãƒ£ã‚¨ãƒ•ã‚§ã‚¯ãƒˆã‚’表示ã™ã‚‹ãŸã‚ã«ä½œæˆã•ã‚ŒãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã®å“質を著ã—ãå‘上ã•ã›ã¾ã™ã€‚ 特ã«é«˜è§£åƒåº¦å‡ºåŠ›æ™‚ã«åŠ¹æžœãŒå¤§ãã出ã¾ã™ã€‚ 動作速度ã¯å°‘々低下ã—ã€ã¾ã‚Œã«æç”»ãƒã‚°ã®åŽŸå› ã«ã‚‚ãªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚ + Per-Pixel Lighting + ピクセルå˜ä½ã§ã®å…‰æºå‡¦ç†ã‚’è¡Œã„ã¾ã™ã€‚ GPUã®æ€§èƒ½ã«ã‚‚よりã¾ã™ãŒã€æ•°ãƒ‘ーセント程度ã€å‹•ä½œé€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションã¯é€šå¸¸å®‰å…¨ã§ã™ãŒã€æ™‚ã«æç”»ãƒã‚°ã‚’引ãèµ·ã“ã™ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ + Force Texture Filtering + ゲームå´ã§ãƒ•ã‚£ãƒ«ã‚¿ç„¡åŠ¹ã‚’明示ã—ã¦ã„ã‚‹å ´é¢ã§ã‚‚ã€å¼·åˆ¶çš„ã«ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã€‚ 特ã«é«˜è§£åƒåº¦å‡ºåŠ›æ™‚ã«ãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒç¶ºéº—ã«ãªã‚Šã¾ã™ãŒã€ã„ãã¤ã‹ã®ã‚²ãƒ¼ãƒ ã§æç”»ãƒã‚°ã‚’引ãèµ·ã“ã—ã¾ã™ã€‚ + 霧を無効 + フォグ処ç†ã‚’無効化ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šé æ™¯ã®é«˜ç²¾ç´°åŒ–ãŒæœŸå¾…ã§ãã¾ã™ã€‚ã„ãã¤ã‹ã®ã‚¿ã‚¤ãƒˆãƒ«ã§ã¯ãƒ•ã‚©ã‚°å‡¦ç†ã«é ¼ã£ãŸç”»é¢åŠ¹æžœãŒæ­£ã—ã表示 ã•ã‚Œãªããªã‚Šã¾ã™ã€‚ + + 高速化(Hacks) + 内蔵フレームãƒãƒƒãƒ•ã‚¡ + CPUã‹ã‚‰EFBアクセスをスキップ + EFBã¸ã®èª­ã¿å–ã‚Š/書ãè¾¼ã¿ã«CPUã‹ã‚‰ä½œã‚‰ã‚ŒãŸã™ã¹ã¦ã®è¦æ±‚を無視。 + フォーマットã®å¤‰æ›´ã‚’無視 + EFBå½¢å¼ã¸ã®å¤‰æ›´ã‚’無視。 + EFBコピー方法 + EFBコピーをエミュレート方法を決定。 + テクスãƒãƒ£ + RAM (キャッシュãªã„) + RAM (キャッシュ) + テクスãƒãƒ£ã‚­ãƒ£ãƒƒã‚·ãƒ¥ + テクスãƒãƒ£ã‚­ãƒ£ãƒƒã‚·ãƒ¥ç¢ºåº¦ + ã“ã®é¸æŠžã‚’Safe設定ã—ã¦ãŠãã¨ã€RAMã‹ã‚‰ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£æ›´æ–°ã« 失敗ã—ã«ããªã‚Šã¾ã™ã€‚ + 低 + å¹³ + 高 + 外部フレームãƒãƒƒãƒ•ã‚¡ + XFBをエミュレート方法を決定。 + ãƒãƒ¼ãƒãƒ£ãƒ« + 実機 + Cache Display Lists + ディスプレイリストをキャッシュã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³é€Ÿåº¦ã‚’å‘上。 + Disable Destination Alpha + 多ãã®ã‚¿ã‚¤ãƒˆãƒ«ã§ç”»é¢åŠ¹æžœã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ã€ã‚¢ãƒ«ãƒ•ã‚¡é€éŽå‡¦ç†ã‚’スキップ 。 + 高速奥行ã計算 + 深度値を計算ã™ã‚‹ãŸã‚ã«ç²¾åº¦ã®ä½Žã„アルゴリズムを使用ã—ã¾ã™ã€‚ + ã¯ã„ ã„ã„㈠+ キャンセル + 無効 + ãã®ä»– diff --git a/Source/Android/res/values/arrays.xml b/Source/Android/res/values/arrays.xml index 05d4668b99..4aaedd6370 100644 --- a/Source/Android/res/values/arrays.xml +++ b/Source/Android/res/values/arrays.xml @@ -19,10 +19,12 @@ @string/interpreter @string/jit_arm_recompiler + @string/jitil_arm_recompiler 0 3 + 4 @@ -45,11 +47,96 @@ - + @string/software_renderer - + Software Renderer - \ No newline at end of file + + + + @string/disabled + @string/efb_copy_texture + @string/efb_copy_ram_uncached + @string/efb_copy_ram_cached + + + Off + Texture + RAM (cached) + RAM (uncached) + + + + + @string/texture_cache_accuracy_low + @string/texture_cache_accuracy_medium + @string/texture_cache_accuracy_high + + + 128 + 512 + 0 + + + + + @string/disabled + @string/external_frame_buffer_virtual + @string/external_frame_buffer_real + + + Disabled + Virtual + Real + + + + + 1x Native (640x528) + 1.5x Native (960x792) + 2x Native (1280x1056) + 2.5x Native (1600x1320) + 3x Native (1920x1584) + 4x Native (2560x2112) + + + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1x + 2x + 4x + + + 0 + 1 + 2 + + + + + 1x + 2x + 4x + 8x + 16x + + + 0 + 1 + 2 + 3 + 4 + + + diff --git a/Source/Android/res/values/strings.xml b/Source/Android/res/values/strings.xml index 51a49ace74..ca7157fd44 100644 --- a/Source/Android/res/values/strings.xml +++ b/Source/Android/res/values/strings.xml @@ -3,34 +3,52 @@ Dolphin Emulator - + Open navigation drawer Close navigation drawer - + - Build Revision: - Supports OpenGL ES 3: - + Build Revision + Supports OpenGL ES 3 + Supports NEON + - Current Dir: + Current Dir: %1$s Parent Directory - Folder - File Size: - Can not use compressed file types - + File Size: %1$s + + Clear game list + Do you want to clear the game list? Game List Browse Folder Settings - Gamepad Config About + + Device Compatibility Warning + Your phone doesn\'t support NEON which makes it incapable of running Dolphin Mobile?\nDo you want to try anyway? + - File clicked: - + File clicked: %1$s + + + Take Screenshot + Save State + Load State + Exit + Are you sure you wish to exit this game? + Slot 1 + Slot 2 + Slot 3 + Slot 4 + Slot 5 + - Draw on-screen controls + Input + Input Binding + Press or move an input to bind it to %1$s. Button A Button B Button Start @@ -51,30 +69,81 @@ C Stick Right Trigger L Trigger R - - Not drawing on-screen controls - Drawing on-screen controls - Press button to configure %1$s - - + + Interpreter JIT64 Recompiler JITIL Recompiler JIT ARM Recompiler + JITIL ARM Recompiler + CPU CPU Core - CPU Settings - Emulation core to use + %s Dual Core - On/Off - - Video Settings + Split workload to two CPU cores instead of one. Increases speed. + Fastmem + Uses potentially unsafe optimizations for memory access. + + + Video Software Renderer - OpenGL ES 3 + OpenGL ES Video Backend - Video backend to use + %s + Show FPS + Show the number of frames rendered per second as a measure of emulation speed. + Draw on-screen controls + + Enhancements + Internal Resolution + Specifies the resolution used to render at. A high resolution will improve visual quality a lot but is also quite heavy on performance and might cause glitches in certain games. + Full-scene Anti-aliasing + Reduces the amount of aliasing caused by rasterizing 3D graphics. This makes the rendered picture look less blocky. Heavily decreases emulation speed and sometimes causes issues. + Anisotropic Filtering + Enhances visual quality of textures that are at oblique viewing angles. Might cause issues in a small number of games. + Scaled EFB Copy + Greatly increases quality of textures generated using render to texture effects. Raising the internal resolution will improve the effect of this setting. Slightly decreases performance and possibly causes issues (although unlikely). + Per-Pixel Lighting + Calculate lighting of 3D graphics per-pixel rather than per vertex. Decreases emulation speed by some percent (depending on your GPU). This usually is a safe enhancement, but might cause issues sometimes. + Force Texture Filtering + Force texture filtering even if the emulated game explicitly disabled it. Improves texture quality slightly but causes glitches in some games. + Disable Fog + Makes distant objects more visible by removing fog, thus increasing the overall detail. Disabling fog will break some games which rely on proper fog emulation. + + Hacks + Embedded Frame Buffer + Skip EFB Access from CPU + Ignore any requests from the CPU to read/write to the EFB. + Ignore Format Changes + Ignore any changes to the EFB format. + EFB Copy Method + Determines how EFB copies will be emulated. + Texture + RAM (uncached) + RAM (cached) + Texture Cache + Texture Cache Accuracy + The safer the selection, the less likely the emulator will be missing any texture updates from RAM. + Low + Medium + High + External Frame Buffer + Determines how the XFB will be emulated. + Virtual + Real + Cache Display Lists + Speeds up emulation a bit by caching display lists. + Disable Destination Alpha + Disables emulation of a hardware feature called destination alpha, which is used in many games for various effects. + Fast Depth Calculation + Uses a less accurate algorithm to calculate depth values. Yes No + Cancel + Disabled + Other + diff --git a/Source/Android/res/xml/cpu_prefs.xml b/Source/Android/res/xml/cpu_prefs.xml new file mode 100644 index 0000000000..59ef76ed46 --- /dev/null +++ b/Source/Android/res/xml/cpu_prefs.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/res/xml/input_prefs.xml b/Source/Android/res/xml/input_prefs.xml new file mode 100644 index 0000000000..daddf93e3d --- /dev/null +++ b/Source/Android/res/xml/input_prefs.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/res/xml/video_prefs.xml b/Source/Android/res/xml/video_prefs.xml new file mode 100644 index 0000000000..5228c117ff --- /dev/null +++ b/Source/Android/res/xml/video_prefs.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java index 07e36fa459..defefcc0d4 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java @@ -1,70 +1,119 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.app.Fragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; - -import java.util.ArrayList; -import java.util.List; - /** * Copyright 2013 Dolphin Emulator Project * Licensed under GPLv2 * Refer to the license.txt file included. */ -public final class AboutFragment extends Fragment + +package org.dolphinemu.dolphinemu; + +import android.app.ListFragment; +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import org.dolphinemu.dolphinemu.settings.VideoSettingsFragment; + +/** + * Represents the about screen. + */ +public final class AboutFragment extends ListFragment { - private static Activity m_activity; - - private ListView mMainList; - - private FolderBrowserAdapter adapter; - boolean Configuring = false; - boolean firstEvent = true; - - public AboutFragment() - { - // Empty constructor required for fragment subclasses - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.gamelist_listview, container, false); - mMainList = (ListView) rootView.findViewById(R.id.gamelist); - - String yes = getString(R.string.yes); - String no = getString(R.string.no); + ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); - List Input = new ArrayList(); - Input.add(new FolderBrowserItem(getString(R.string.build_revision), NativeLibrary.GetVersionString(), "", true)); - Input.add(new FolderBrowserItem(getString(R.string.supports_gles3), PrefsFragment.SupportsGLES3() ? yes : no, "", true)); + final String yes = getString(R.string.yes); + final String no = getString(R.string.no); - adapter = new FolderBrowserAdapter(m_activity, R.layout.about_layout, Input); - mMainList.setAdapter(adapter); + List Input = new ArrayList(); + Input.add(new AboutFragmentItem(getString(R.string.build_revision), NativeLibrary.GetVersionString())); + Input.add(new AboutFragmentItem(getString(R.string.supports_gles3), VideoSettingsFragment.SupportsGLES3() ? yes : no)); + Input.add(new AboutFragmentItem(getString(R.string.supports_neon), NativeLibrary.SupportsNEON() ? yes : no)); - return mMainList; + AboutFragmentAdapter adapter = new AboutFragmentAdapter(getActivity(), R.layout.about_layout, Input); + rootView.setAdapter(adapter); + rootView.setEnabled(false); // Makes the list view non-clickable. + + return rootView; } - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try + // Represents an item in the AboutFragment. + private static final class AboutFragmentItem + { + private final String title; + private final String subtitle; + + public AboutFragmentItem(String title, String subtitle) { - m_activity = activity; + this.title = title; + this.subtitle = subtitle; } - catch (ClassCastException e) + + public String getTitle() { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); + return title; + } + + public String getSubTitle() + { + return subtitle; + } + } + + // The adapter that manages the displaying of items in this AboutFragment. + private static final class AboutFragmentAdapter extends ArrayAdapter + { + private final Context ctx; + private final int id; + private final List items; + + public AboutFragmentAdapter(Context ctx, int id, List items) + { + super(ctx, id, items); + + this.ctx = ctx; + this.id = id; + this.items = items; + } + + @Override + public AboutFragmentItem getItem(int index) + { + return items.get(index); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + if (convertView == null) + { + LayoutInflater vi = LayoutInflater.from(ctx); + convertView = vi.inflate(id, parent, false); + } + + final AboutFragmentItem item = items.get(position); + if (item != null) + { + TextView title = (TextView) convertView.findViewById(R.id.AboutItemTitle); + TextView subtitle = (TextView) convertView.findViewById(R.id.AboutItemSubTitle); + + if (title != null) + title.setText(item.getTitle()); + + if (subtitle != null) + subtitle.setText(item.getSubTitle()); + } + + return convertView; } } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java index e593a996ad..bdbe53dfcb 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java @@ -1,115 +1,74 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + package org.dolphinemu.dolphinemu; import android.app.Activity; -import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.os.Environment; -import android.preference.PreferenceManager; -import android.util.DisplayMetrics; import android.util.Log; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.WindowManager; +import org.dolphinemu.dolphinemu.gamelist.GameListActivity; +import org.dolphinemu.dolphinemu.settings.UserPreferences; import java.io.*; -import java.util.List; - -public final class DolphinEmulator extends Activity -{ - static private NativeGLSurfaceView GLview = null; - static private boolean Running = false; - - private float screenWidth; - private float screenHeight; +/** + * The main activity of this emulator front-end. + */ +public final class DolphinEmulator extends Activity +{ private void CopyAsset(String asset, String output) { - InputStream in = null; - OutputStream out = null; - - try - { - in = getAssets().open(asset); - out = new FileOutputStream(output); - copyFile(in, out); - in.close(); - out.close(); - } - catch(IOException e) - { - Log.e("DolphinEmulator", "Failed to copy asset file: " + asset, e); - } + InputStream in = null; + OutputStream out = null; + + try + { + in = getAssets().open(asset); + out = new FileOutputStream(output); + copyFile(in, out); + in.close(); + out.close(); + } + catch (IOException e) + { + Log.e("DolphinEmulator", "Failed to copy asset file: " + asset, e); + } } private void copyFile(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int read; - - while((read = in.read(buffer)) != -1) - { - out.write(buffer, 0, read); - } - } - - @Override - public void onStop() - { - super.onStop(); - if (Running) - NativeLibrary.StopEmulation(); - } - - @Override - public void onPause() - { - super.onPause(); - if (Running) - NativeLibrary.PauseEmulation(); - } - - @Override - public void onResume() - { - super.onResume(); - if (Running) - NativeLibrary.UnPauseEmulation(); + byte[] buffer = new byte[1024]; + int read; + + while ((read = in.read(buffer)) != -1) + { + out.write(buffer, 0, read); + } } - /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { - Intent ListIntent = new Intent(this, GameListActivity.class); - startActivityForResult(ListIntent, 1); - - // Make the assets directory + Intent GameListIntent = new Intent(this, GameListActivity.class); + startActivity(GameListIntent); + String BaseDir = Environment.getExternalStorageDirectory()+File.separator+"dolphin-emu"; - File directory = new File(BaseDir); - directory.mkdirs(); - String ConfigDir = BaseDir + File.separator + "Config"; - directory = new File(ConfigDir); - directory.mkdirs(); - String GCDir = BaseDir + File.separator + "GC"; - directory = new File(GCDir); - directory.mkdirs(); - - String WiiDir = BaseDir + File.separator + "Wii"; - directory = new File(WiiDir); - directory.mkdirs(); // Copy assets if needed - File file = new File(WiiDir + File.separator + "setting-usa.txt"); + File file = new File(GCDir + File.separator + "font_sjis.bin"); if(!file.exists()) { + NativeLibrary.CreateUserFolders(); CopyAsset("ButtonA.png", BaseDir + File.separator + "ButtonA.png"); CopyAsset("ButtonB.png", BaseDir + File.separator + "ButtonB.png"); CopyAsset("ButtonStart.png", BaseDir + File.separator + "ButtonStart.png"); @@ -120,120 +79,16 @@ public final class DolphinEmulator extends Activity CopyAsset("dsp_rom.bin", GCDir + File.separator + "dsp_rom.bin"); CopyAsset("font_ansi.bin", GCDir + File.separator + "font_ansi.bin"); CopyAsset("font_sjis.bin", GCDir + File.separator + "font_sjis.bin"); - CopyAsset("setting-eur.txt", WiiDir + File.separator + "setting-eur.txt"); - CopyAsset("setting-jpn.txt", WiiDir + File.separator + "setting-jpn.txt"); - CopyAsset("setting-kor.txt", WiiDir + File.separator + "setting-kor.txt"); - CopyAsset("setting-usa.txt", WiiDir + File.separator + "setting-usa.txt"); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = prefs.edit(); - editor.putString("cpuCorePref", NativeLibrary.GetConfig("Dolphin.ini", "Core", "CPUCore", "3")); - editor.putBoolean("dualCorePref", NativeLibrary.GetConfig("Dolphin.ini", "Core", "CPUThread", "False").equals("True") ? true : false); - editor.putString("gpuPref", NativeLibrary.GetConfig("Dolphin.ini", "Core", "GFXBackend ", "Software Renderer")); - editor.commit(); } + + // Load the configuration keys set in the Dolphin ini and gfx ini files + // into the application's shared preferences. + UserPreferences.LoadIniToPrefs(this); } } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) + protected void onRestart() { - super.onActivityResult(requestCode, resultCode, data); - - if (resultCode == Activity.RESULT_OK) - { - DisplayMetrics displayMetrics = new DisplayMetrics(); - WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // the results will be higher than using the activity context object or the getWindowManager() shortcut - wm.getDefaultDisplay().getMetrics(displayMetrics); - screenWidth = displayMetrics.widthPixels; - screenHeight = displayMetrics.heightPixels; - - String FileName = data.getStringExtra("Select"); - GLview = new NativeGLSurfaceView(this); - this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - String backend = NativeLibrary.GetConfig("Dolphin.ini", "Core", "GFXBackend", "Software Renderer"); - NativeLibrary.SetDimensions((int)screenWidth, (int)screenHeight); - NativeLibrary.SetFilename(FileName); - setContentView(GLview); - Running = true; - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) - { - float X = event.getX(); - float Y = event.getY(); - int Action = event.getActionMasked(); - - // Converts button locations 0 - 1 to OGL screen coords -1.0 - 1.0 - float ScreenX = ((X / screenWidth) * 2.0f) - 1.0f; - float ScreenY = ((Y / screenHeight) * -2.0f) + 1.0f; - - NativeLibrary.onTouchEvent(Action, ScreenX, ScreenY); - - return false; - } - - // Gets button presses - @Override - public boolean dispatchKeyEvent(KeyEvent event) - { - int action = 0; - - // Special catch for the back key - // Currently disabled because stopping and starting emulation is broken. - /* - if ( event.getSource() == InputDevice.SOURCE_KEYBOARD - && event.getKeyCode() == KeyEvent.KEYCODE_BACK - && event.getAction() == KeyEvent.ACTION_UP - ) - { - if (Running) - NativeLibrary.StopEmulation(); - Running = false; - Intent ListIntent = new Intent(this, GameListActivity.class); - startActivityForResult(ListIntent, 1); - return true; - } - */ - - if (Running) - { - switch (event.getAction()) - { - case KeyEvent.ACTION_DOWN: - action = 0; - break; - case KeyEvent.ACTION_UP: - action = 1; - break; - default: - return false; - } - InputDevice input = event.getDevice(); - NativeLibrary.onGamePadEvent(InputConfigFragment.getInputDesc(input), event.getKeyCode(), action); - return true; - } - return false; - } - - @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) - { - if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) || !Running) - { - return super.dispatchGenericMotionEvent(event); - } - - InputDevice input = event.getDevice(); - List motions = input.getMotionRanges(); - - for (InputDevice.MotionRange range : motions) - { - NativeLibrary.onGamePadMoveEvent(InputConfigFragment.getInputDesc(input), range.getAxis(), event.getAxisValue(range.getAxis())); - } - - return true; + super.onRestart(); + finish(); // If we are ever returning to this activity then we are exiting. } } \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java deleted file mode 100644 index bd41c75093..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.app.Fragment; -import android.os.Bundle; -import android.os.Environment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.Toast; - -import java.io.File; -import java.util.*; - -public final class FolderBrowser extends Fragment -{ - private Activity m_activity; - private FolderBrowserAdapter adapter; - private ListView mDrawerList; - private View rootView; - private static File currentDir = null; - - // Populates the FolderView with the given currDir's contents. - private void Fill(File currDir) - { - m_activity.setTitle(getString(R.string.current_dir) + currDir.getName()); - File[] dirs = currDir.listFiles(); - Listdir = new ArrayList(); - Listfls = new ArrayList(); - - // Supported extensions to filter by - Set validExts = new HashSet(Arrays.asList(".gcm", ".iso", ".wbfs", ".gcz", ".dol", ".elf", ".dff")); - Set invalidExts = new HashSet(Arrays.asList(".zip", ".rar", ".7z")); - - // Search for any directories or supported files within the current dir. - try - { - for(File entry : dirs) - { - String entryName = entry.getName(); - - if (entryName.charAt(0) != '.') - { - if(entry.isDirectory()) - { - dir.add(new FolderBrowserItem(entryName, entry.getAbsolutePath(), true)); - } - else - { - if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) - { - fls.add(new FolderBrowserItem(entryName, getString(R.string.file_size)+entry.length(), entry.getAbsolutePath(), true)); - } - else if (invalidExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) - { - fls.add(new FolderBrowserItem(entryName, getString(R.string.file_size)+entry.length(), entry.getAbsolutePath(), false)); - } - } - } - } - } - catch(Exception ignored) - { - } - - Collections.sort(dir); - Collections.sort(fls); - dir.addAll(fls); - - // Check for a parent directory to the one we're currently in. - if (!currDir.getPath().equalsIgnoreCase("/")) - dir.add(0, new FolderBrowserItem("..", getString(R.string.parent_directory), currDir.getParent(), true)); - - adapter = new FolderBrowserAdapter(m_activity, R.layout.folderbrowser, dir); - mDrawerList = (ListView) rootView.findViewById(R.id.gamelist); - mDrawerList.setAdapter(adapter); - mDrawerList.setOnItemClickListener(mMenuItemClickListener); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - if(currentDir == null) - currentDir = new File(Environment.getExternalStorageDirectory().getPath()); - - rootView = inflater.inflate(R.layout.gamelist_listview, container, false); - - Fill(currentDir); - return mDrawerList; - } - - private AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() - { - public void onItemClick(AdapterView parent, View view, int position, long id) - { - FolderBrowserItem item = adapter.getItem(position); - if(item.isDirectory()) - { - currentDir = new File(item.getPath()); - Fill(currentDir); - } - else - { - if (item.isValid()) - FolderSelected(); - else - Toast.makeText(m_activity, getString(R.string.cant_use_compressed_filetypes), Toast.LENGTH_LONG).show(); - } - } - }; - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try - { - m_activity = activity; - } - catch (ClassCastException e) - { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); - } - } - private void FolderSelected() - { - String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); - int intDirectories = Integer.parseInt(Directories); - Directories = Integer.toString(intDirectories + 1); - NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPathes", Directories); - NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(intDirectories), currentDir.getPath()); - - ((GameListActivity)m_activity).SwitchPage(0); - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java deleted file mode 100644 index f7596600b7..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.List; - -public final class FolderBrowserAdapter extends ArrayAdapter -{ - private final Context c; - private final int id; - private final List items; - - public FolderBrowserAdapter(Context context, int textViewResourceId, List objects) - { - super(context, textViewResourceId, objects); - c = context; - id = textViewResourceId; - items = objects; - } - - public FolderBrowserItem getItem(int i) - { - return items.get(i); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - View v = convertView; - if (v == null) - { - LayoutInflater vi = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(id, parent, false); - } - - final FolderBrowserItem item = items.get(position); - if (item != null) - { - ImageView iconView = (ImageView) v.findViewById(R.id.ImageIcon); - TextView mainText = (TextView) v.findViewById(R.id.FolderTitle); - TextView subtitleText = (TextView) v.findViewById(R.id.FolderSubTitle); - - if(mainText != null) - { - mainText.setText(item.getName()); - - if (!item.isValid()) - { - mainText.setTextColor(0xFFFF0000); - } - } - - if(subtitleText != null) - { - // Remove the subtitle for all folders, except for the parent directory folder. - if (item.isDirectory() && !item.getSubtitle().equals(c.getResources().getString(R.string.parent_directory))) - { - subtitleText.setVisibility(View.GONE); - } - else - { - subtitleText.setText(item.getSubtitle()); - } - } - - if (iconView != null) - { - if (item.isDirectory()) - { - iconView.setImageResource(R.drawable.ic_menu_folder); - } - else - { - iconView.setImageResource(R.drawable.ic_menu_file); - } - } - - } - return v; - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java deleted file mode 100644 index 5fd9bd5ad1..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import java.io.File; - -/** - * Represents an item in the folder browser list. - */ -public final class FolderBrowserItem implements Comparable -{ - private final String name; - private final String subtitle; - private final String path; - private final boolean isValid; - private final File underlyingFile; - - /** - * Constructor - * - * @param name The name of the file/folder represented by this item. - * @param subtitle The subtitle of this FolderBrowserItem to display. - * @param path The path of the file/folder represented by this item. - * @param isValid Whether or not this item represents a file type that can be handled. - */ - public FolderBrowserItem(String name, String subtitle, String path, boolean isValid) - { - this.name = name; - this.subtitle = subtitle; - this.path = path; - this.isValid = isValid; - this.underlyingFile = new File(path); - } - - /** - * Constructor. Initializes a FolderBrowserItem with an empty subtitle. - * - * @param ctx Context this FolderBrowserItem is being used in. - * @param name The name of the file/folder represented by this item. - * @param path The path of the file/folder represented by this item. - * @param isValid Whether or not this item represents a file type that can be handled. - */ - public FolderBrowserItem(String name, String path, boolean isValid) - { - this.name = name; - this.subtitle = ""; - this.path = path; - this.isValid = isValid; - this.underlyingFile = new File(path); - } - - /** - * Gets the name of the file/folder represented by this FolderBrowserItem. - * - * @return the name of the file/folder represented by this FolderBrowserItem. - */ - public String getName() - { - return name; - } - - /** - * Gets the subtitle text of this FolderBrowserItem. - * - * @return the subtitle text of this FolderBrowserItem. - */ - public String getSubtitle() - { - return subtitle; - } - - /** - * Gets the path of the file/folder represented by this FolderBrowserItem. - * - * @return the path of the file/folder represented by this FolderBrowserItem. - */ - public String getPath() - { - return path; - } - - /** - * Gets whether or not the file represented - * by this FolderBrowserItem is supported - * and can be handled correctly. - * - * @return whether or not the file represented - * by this FolderBrowserItem is supported - * and can be handled correctly. - */ - public boolean isValid() - { - return isValid; - } - - /** - * Gets the {@link File} representation of the underlying file/folder - * represented by this FolderBrowserItem. - * - * @return the {@link File} representation of the underlying file/folder - * represented by this FolderBrowserItem. - */ - public File getUnderlyingFile() - { - return underlyingFile; - } - - /** - * Gets whether or not this FolderBrowserItem represents a directory. - * - * @return true if this FolderBrowserItem represents a directory, false otherwise. - */ - public boolean isDirectory() - { - return underlyingFile.isDirectory(); - } - - public int compareTo(FolderBrowserItem other) - { - if(this.name != null) - return this.name.toLowerCase().compareTo(other.getName().toLowerCase()); - else - throw new IllegalArgumentException(); - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java deleted file mode 100644 index 08736b7360..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java +++ /dev/null @@ -1,265 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.res.Configuration; -import android.os.Bundle; -import android.support.v4.app.ActionBarDrawerToggle; -import android.support.v4.widget.DrawerLayout; -import android.view.*; -import android.widget.AdapterView; -import android.widget.ListView; -import java.util.ArrayList; -import java.util.List; - -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ -public final class GameListActivity extends Activity - implements GameListFragment.OnGameListZeroListener -{ - private int mCurFragmentNum = 0; - private Fragment mCurFragment; - - private ActionBarDrawerToggle mDrawerToggle; - private DrawerLayout mDrawerLayout; - private SideMenuAdapter mDrawerAdapter; - private ListView mDrawerList; - - // Called from the game list fragment - public void onZeroFiles() - { - mDrawerLayout.openDrawer(mDrawerList); - } - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.gamelist_activity); - - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mDrawerList = (ListView) findViewById(R.id.left_drawer); - - List dir = new ArrayList(); - dir.add(new SideMenuItem(getString(R.string.game_list), 0)); - dir.add(new SideMenuItem(getString(R.string.browse_folder), 1)); - dir.add(new SideMenuItem(getString(R.string.settings), 2)); - dir.add(new SideMenuItem(getString(R.string.gamepad_config), 3)); - dir.add(new SideMenuItem(getString(R.string.about), 4)); - - mDrawerAdapter = new SideMenuAdapter(this, R.layout.sidemenu, dir); - mDrawerList.setAdapter(mDrawerAdapter); - mDrawerList.setOnItemClickListener(mMenuItemClickListener); - - // enable ActionBar app icon to behave as action to toggle nav drawer - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); - - // ActionBarDrawerToggle ties together the the proper interactions - // between the sliding drawer and the action bar app icon - mDrawerToggle = new ActionBarDrawerToggle( - this, /* host Activity */ - mDrawerLayout, /* DrawerLayout object */ - R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ - R.string.drawer_open, /* "open drawer" description for accessibility */ - R.string.drawer_close /* "close drawer" description for accessibility */ - ) { - public void onDrawerClosed(View view) { - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() - } - - public void onDrawerOpened(View drawerView) { - invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() - } - }; - mDrawerLayout.setDrawerListener(mDrawerToggle); - - recreateFragment(); - } - - private void recreateFragment() - { - mCurFragment = new GameListFragment(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - - public void SwitchPage(int toPage) - { - if (mCurFragmentNum == toPage) - return; - - switch (mCurFragmentNum) - { - // Folder browser - case 1: - recreateFragment(); - break; - - case 3: // Gamepad settings - { - InputConfigAdapter adapter = ((InputConfigFragment)mCurFragment).getAdapter(); - for (int a = 0; a < adapter.getCount(); ++a) - { - InputConfigItem o = adapter.getItem(a); - String config = o.getConfig(); - String bind = o.getBind(); - String ConfigValues[] = config.split("-"); - String Key = ConfigValues[0]; - String Value = ConfigValues[1]; - NativeLibrary.SetConfig("Dolphin.ini", Key, Value, bind); - } - } - break; - - case 0: // Game List - case 2: // Settings - case 4: // About - /* Do Nothing */ - break; - } - - switch(toPage) - { - case 0: - { - mCurFragmentNum = 0; - mCurFragment = new GameListFragment(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - break; - - case 1: - { - mCurFragmentNum = 1; - mCurFragment = new FolderBrowser(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - break; - - case 2: - { - mCurFragmentNum = 2; - mCurFragment = new PrefsFragment(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - break; - - case 3: - { - mCurFragmentNum = 3; - mCurFragment = new InputConfigFragment(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - break; - - case 4: - { - mCurFragmentNum = 4; - mCurFragment = new AboutFragment(); - FragmentManager fragmentManager = getFragmentManager(); - fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); - } - break; - - default: - break; - } - } - - private AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() - { - public void onItemClick(AdapterView parent, View view, int position, long id) - { - SideMenuItem o = mDrawerAdapter.getItem(position); - mDrawerLayout.closeDrawer(mDrawerList); - SwitchPage(o.getID()); - } - }; - /** - * When using the ActionBarDrawerToggle, you must call it during - * onPostCreate() and onConfigurationChanged()... - */ - - @Override - protected void onPostCreate(Bundle savedInstanceState) - { - super.onPostCreate(savedInstanceState); - // Sync the toggle state after onRestoreInstanceState has occurred. - mDrawerToggle.syncState(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) - { - super.onConfigurationChanged(newConfig); - // Pass any configuration change to the drawer toggle - mDrawerToggle.onConfigurationChanged(newConfig); - } - - /* Called whenever we call invalidateOptionsMenu() */ - @Override - public boolean onPrepareOptionsMenu(Menu menu) - { - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) - { - // The action bar home/up action should open or close the drawer. - // ActionBarDrawerToggle will take care of this. - if (mDrawerToggle.onOptionsItemSelected(item)) - { - return true; - } - - return super.onOptionsItemSelected(item); - } - - public void onBackPressed() - { - SwitchPage(0); - } - - public interface OnGameConfigListener - { - public boolean onMotionEvent(MotionEvent event); - public boolean onKeyEvent(KeyEvent event); - } - - // Gets move(triggers, joystick) events - @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) - { - if (mCurFragmentNum == 3) - { - if (((OnGameConfigListener)mCurFragment).onMotionEvent(event)) - return true; - } - - return super.dispatchGenericMotionEvent(event); - } - - // Gets button presses - @Override - public boolean dispatchKeyEvent(KeyEvent event) - { - if (mCurFragmentNum == 3) - { - if (((OnGameConfigListener)mCurFragment).onKeyEvent(event)) - return true; - } - - return super.dispatchKeyEvent(event); - } - -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java deleted file mode 100644 index d683741c79..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.List; - -public final class GameListAdapter extends ArrayAdapter -{ - private final Context c; - private final int id; - private final Listitems; - - public GameListAdapter(Context context, int textViewResourceId, List objects) - { - super(context, textViewResourceId, objects); - c = context; - id = textViewResourceId; - items = objects; - } - - public GameListItem getItem(int i) - { - return items.get(i); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - View v = convertView; - if (v == null) - { - LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(id, parent, false); - } - - final GameListItem item = items.get(position); - if (item != null) - { - TextView title = (TextView) v.findViewById(R.id.GameItemTitle); - TextView subtitle = (TextView) v.findViewById(R.id.GameItemSubText); - ImageView icon = (ImageView) v.findViewById(R.id.GameItemIcon); - - if(title != null) - title.setText(item.getName()); - - if(subtitle != null) - subtitle.setText(item.getData()); - - if(icon != null) - { - icon.setImageBitmap(item.getImage()); - icon.getLayoutParams().width = (int) ((860 / c.getResources().getDisplayMetrics().density) + 0.5); - icon.getLayoutParams().height = (int)((340 / c.getResources().getDisplayMetrics().density) + 0.5); - } - } - - return v; - } -} - diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java deleted file mode 100644 index 8464eaea9c..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.app.Fragment; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.Toast; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ -public final class GameListFragment extends Fragment -{ - private ListView mMainList; - private GameListAdapter mGameAdapter; - private static GameListActivity mMe; - OnGameListZeroListener mCallback; - - public interface OnGameListZeroListener - { - public void onZeroFiles(); - } - - public GameListFragment() - { - // Empty constructor required for fragment subclasses - } - - private void Fill() - { - List fls = new ArrayList(); - String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); - int intDirectories = Integer.parseInt(Directories); - - // Extensions to filter by. - Set exts = new HashSet(Arrays.asList(".gcm", ".iso", ".wbfs", ".gcz", ".dol", ".elf", ".dff")); - - for (int a = 0; a < intDirectories; ++a) - { - String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + a, ""); - File currentDir = new File(BrowseDir); - File[] dirs = currentDir.listFiles(); - try - { - for(File entry : dirs) - { - String entryName = entry.getName(); - - if (entryName.charAt(0) != '.') - { - if(!entry.isDirectory()) - { - if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) - fls.add(new GameListItem(mMe.getApplicationContext(), entryName, getString(R.string.file_size)+entry.length(),entry.getAbsolutePath(), true)); - } - } - } - } - catch(Exception ignored) - { - } - } - Collections.sort(fls); - - // Remove any duplicate items from the list. - // We don't need to index these in the game list more than once. - // - // This works by comparing the paths of items in the file list for equality, - // so there should be no worries about accidentally removing a valid game. - for (int i = 0; i < fls.size(); i++) - { - int indexNext = i+1; - - if (indexNext < fls.size() && fls.get(indexNext).getPath().contains(fls.get(i).getPath())) - { - fls.remove(indexNext); - } - } - - mGameAdapter = new GameListAdapter(mMe, R.layout.gamelist_layout, fls); - mMainList.setAdapter(mGameAdapter); - if (fls.size() == 0) - mCallback.onZeroFiles(); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View rootView = inflater.inflate(R.layout.gamelist_listview, container, false); - mMainList = (ListView) rootView.findViewById(R.id.gamelist); - mMainList.setOnItemClickListener(mGameItemClickListener); - - Fill(); - - return mMainList; - } - - private AdapterView.OnItemClickListener mGameItemClickListener = new AdapterView.OnItemClickListener() - { - public void onItemClick(AdapterView parent, View view, int position, long id) - { - GameListItem o = mGameAdapter.getItem(position); - if(!(o.getData().equalsIgnoreCase(getString(R.string.folder))||o.getData().equalsIgnoreCase(getString(R.string.parent_directory)))) - { - onFileClick(o.getPath()); - } - } - }; - - private void onFileClick(String o) - { - Toast.makeText(mMe, getString(R.string.file_clicked) + o, Toast.LENGTH_SHORT).show(); - - Intent intent = new Intent(); - intent.putExtra("Select", o); - mMe.setResult(Activity.RESULT_OK, intent); - mMe.finish(); - } - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try - { - mCallback = (OnGameListZeroListener) activity; - mMe = (GameListActivity) activity; - } - catch (ClassCastException e) - { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); - } - } -} \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java deleted file mode 100644 index 10f44f69e4..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -public final class GameListItem implements Comparable -{ - private String name; - private final String data; - private final String path; - private final boolean isValid; - private Bitmap image; - - public GameListItem(Context ctx, String name, String data, String path, boolean isValid) - { - this.name = name; - this.data = data; - this.path = path; - this.isValid = isValid; - - File file = new File(path); - if (!file.isDirectory() && !path.equals("")) - { - int[] Banner = NativeLibrary.GetBanner(path); - if (Banner[0] == 0) - { - try - { - // Open the no banner icon. - InputStream noBannerPath = ctx.getAssets().open("NoBanner.png"); - - // Decode the bitmap. - image = BitmapFactory.decodeStream(noBannerPath); - - // Scale the bitmap to match other banners. - image = Bitmap.createScaledBitmap(image, 96, 32, false); - } - catch (IOException e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - else - { - image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); - } - - this.name = NativeLibrary.GetTitle(path); - } - } - - public String getName() - { - return name; - } - - public String getData() - { - return data; - } - - public String getPath() - { - return path; - } - - public Bitmap getImage() - { - return image; - } - - public boolean isValid() - { - return isValid; - } - - public int compareTo(GameListItem o) - { - if(this.name != null) - return this.name.toLowerCase().compareTo(o.getName().toLowerCase()); - else - throw new IllegalArgumentException(); - } -} - diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java deleted file mode 100644 index 12541b8b37..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; - -import java.util.List; - -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ -public final class InputConfigAdapter extends ArrayAdapter -{ - private final Context c; - private final int id; - private final List items; - - public InputConfigAdapter(Context context, int textViewResourceId, List objects) - { - super(context, textViewResourceId, objects); - c = context; - id = textViewResourceId; - items = objects; - } - - public InputConfigItem getItem(int i) - { - return items.get(i); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - View v = convertView; - if (v == null) - { - LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(id, parent, false); - } - - final InputConfigItem item = items.get(position); - if (item != null) - { - TextView title = (TextView) v.findViewById(R.id.FolderTitle); - TextView subtitle = (TextView) v.findViewById(R.id.FolderSubTitle); - - if(title != null) - title.setText(item.getName()); - - if(subtitle != null) - subtitle.setText(item.getBind()); - } - - return v; - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java deleted file mode 100644 index 530f8b1d3b..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java +++ /dev/null @@ -1,218 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.app.Fragment; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.view.*; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.Toast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ -public final class InputConfigFragment extends Fragment - implements GameListActivity.OnGameConfigListener -{ - private Activity m_activity; - private ListView mDrawerList; - private InputConfigAdapter adapter; - private int configPosition = 0; - boolean Configuring = false; - boolean firstEvent = true; - - static public String getInputDesc(InputDevice input) - { - if (input == null) - return "null"; // Happens when the inputdevice is from an unknown source - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) - { - return input.getDescriptor(); - } - else - { - List motions = input.getMotionRanges(); - String fakeid = ""; - - for (InputDevice.MotionRange range : motions) - fakeid += range.getAxis(); - - return fakeid; - } - } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - List Input = new ArrayList(); - Input.add(new InputConfigItem(getString(R.string.draw_onscreen_controls), "Android-ScreenControls", "True")); - Input.add(new InputConfigItem(getString(R.string.button_a), "Android-InputA")); - Input.add(new InputConfigItem(getString(R.string.button_b), "Android-InputB")); - Input.add(new InputConfigItem(getString(R.string.button_start), "Android-InputStart")); - Input.add(new InputConfigItem(getString(R.string.button_x), "Android-InputX")); - Input.add(new InputConfigItem(getString(R.string.button_y), "Android-InputY")); - Input.add(new InputConfigItem(getString(R.string.button_z), "Android-InputZ")); - Input.add(new InputConfigItem(getString(R.string.dpad_up), "Android-DPadUp")); - Input.add(new InputConfigItem(getString(R.string.dpad_down), "Android-DPadDown")); - Input.add(new InputConfigItem(getString(R.string.dpad_left), "Android-DPadLeft")); - Input.add(new InputConfigItem(getString(R.string.dpad_right), "Android-DPadRight")); - Input.add(new InputConfigItem(getString(R.string.main_stick_up), "Android-MainUp")); - Input.add(new InputConfigItem(getString(R.string.main_stick_down), "Android-MainDown")); - Input.add(new InputConfigItem(getString(R.string.main_stick_left), "Android-MainLeft")); - Input.add(new InputConfigItem(getString(R.string.main_stick_right), "Android-MainRight")); - Input.add(new InputConfigItem(getString(R.string.c_stick_up), "Android-CStickUp")); - Input.add(new InputConfigItem(getString(R.string.c_stick_down), "Android-CStickDown")); - Input.add(new InputConfigItem(getString(R.string.c_stick_left), "Android-CStickLeft")); - Input.add(new InputConfigItem(getString(R.string.c_stick_right), "Android-CStickRight")); - Input.add(new InputConfigItem(getString(R.string.trigger_left), "Android-InputL")); - Input.add(new InputConfigItem(getString(R.string.trigger_right), "Android-InputR")); - - adapter = new InputConfigAdapter(m_activity, R.layout.folderbrowser, Input); - View rootView = inflater.inflate(R.layout.gamelist_listview, container, false); - mDrawerList = (ListView) rootView.findViewById(R.id.gamelist); - - mDrawerList.setAdapter(adapter); - mDrawerList.setOnItemClickListener(mMenuItemClickListener); - return mDrawerList; - } - - private AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() - { - public void onItemClick(AdapterView parent, View view, int position, long id) - { - InputConfigItem o = adapter.getItem(position); - switch(position) - { - case 0: // On screen controls - String newBind; - if (o.getBind().equals("True")) - { - Toast.makeText(m_activity, getString(R.string.not_drawing_onscreen_controls), Toast.LENGTH_SHORT).show(); - newBind = "False"; - } - else - { - Toast.makeText(m_activity, getString(R.string.drawing_onscreen_controls), Toast.LENGTH_SHORT).show(); - newBind = "True"; - } - adapter.remove(o); - o.setBind(newBind); - adapter.insert(o, position); - break; - - default: // gamepad controls - - Toast.makeText(m_activity, getString(R.string.press_button_to_config, o.getName()), Toast.LENGTH_SHORT).show(); - configPosition = position; - Configuring = true; - firstEvent = true; - break; - } - } - }; - - private static ArrayList m_values = new ArrayList(); - - private void AssignBind(String bind) - { - InputConfigItem o = adapter.getItem(configPosition); - adapter.remove(o); - o.setBind(bind); - adapter.insert(o, configPosition); - } - - public InputConfigAdapter getAdapter() - { - return adapter; - } - - // Called from GameListActivity - public boolean onMotionEvent(MotionEvent event) - { - if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) - return false; - - InputDevice input = event.getDevice(); - List motions = input.getMotionRanges(); - if (Configuring) - { - if (firstEvent) - { - m_values.clear(); - - for (InputDevice.MotionRange range : motions) - { - m_values.add(event.getAxisValue(range.getAxis())); - } - - firstEvent = false; - } - else - { - for (int a = 0; a < motions.size(); ++a) - { - InputDevice.MotionRange range = motions.get(a); - - if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) - { - AssignBind("Device '" + InputConfigFragment.getInputDesc(input) + "'-Axis " + range.getAxis() + "-"); - Configuring = false; - } - else if (m_values.get(a) < (event.getAxisValue(range.getAxis()) - 0.5f)) - { - AssignBind("Device '" + InputConfigFragment.getInputDesc(input) + "'-Axis " + range.getAxis() + "+"); - Configuring = false; - } - } - } - } - return true; - } - - public boolean onKeyEvent(KeyEvent event) - { - Log.w("InputConfigFragment", "Got Event " + event.getAction()); - switch (event.getAction()) - { - case KeyEvent.ACTION_DOWN: - case KeyEvent.ACTION_UP: - if (Configuring) - { - InputDevice input = event.getDevice(); - AssignBind("Device '" + InputConfigFragment.getInputDesc(input) + "'-Button " + event.getKeyCode()); - Configuring = false; - return true; - } - - default: - break; - } - - return false; - } - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try - { - m_activity = activity; - } - catch (ClassCastException e) - { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); - } - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java deleted file mode 100644 index 70e68261ec..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu; - -/** - * Represents a controller input item (button, stick, etc). - */ -public final class InputConfigItem implements Comparable -{ - private String m_name; - private String m_Config; - private String m_bind; - - private void Init(String name, String config, String defaultBind) - { - m_name = name; - m_Config = config; - String ConfigValues[] = m_Config.split("-"); - String Key = ConfigValues[0]; - String Value = ConfigValues[1]; - m_bind = NativeLibrary.GetConfig("Dolphin.ini", Key, Value, defaultBind); - } - - /** - * Constructor - * - * @param name Name of the input config item. - * @param config Name of the key in the configuration file that this control modifies. - * @param defaultBind Default binding to fall back upon if binding fails. - */ - public InputConfigItem(String name, String config, String defaultBind) - { - Init(name, config, defaultBind); - } - - /** - * Constructor that creates an InputConfigItem - * that has a default binding of "None" - * - * @param name Name of the input config item. - * @param config Name of the key in the configuration file that this control modifies. - */ - public InputConfigItem(String name, String config) - { - Init(name, config, "None"); - } - - /** - * Gets the name of this InputConfigItem. - * - * @return the name of this InputConfigItem - */ - public String getName() - { - return m_name; - } - - /** - * Gets the config key this InputConfigItem modifies. - * - * @return the config key this InputConfigItem modifies. - */ - public String getConfig() - { - return m_Config; - } - - /** - * Gets the currently set binding of this InputConfigItem - * - * @return the currently set binding of this InputConfigItem - */ - public String getBind() - { - return m_bind; - } - - /** - * Sets a new binding for this InputConfigItem. - * - * @param bind The new binding. - */ - public void setBind(String bind) - { - m_bind = bind; - } - - public int compareTo(InputConfigItem o) - { - if(this.m_name != null) - return this.m_name.toLowerCase().compareTo(o.getName().toLowerCase()); - else - throw new IllegalArgumentException(); - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java deleted file mode 100644 index ffe89714be..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.view.SurfaceHolder; -import android.view.SurfaceView; - -public final class NativeGLSurfaceView extends SurfaceView -{ - static private Thread myRun; - static private boolean Running = false; - static private boolean Created = false; - - public NativeGLSurfaceView(Context context) - { - super(context); - if (!Created) - { - myRun = new Thread() - { - @Override - public void run() { - NativeLibrary.Run(getHolder().getSurface()); - } - }; - - getHolder().addCallback(new SurfaceHolder.Callback() { - public void surfaceCreated(SurfaceHolder holder) - { - // TODO Auto-generated method stub - if (!Running) - { - myRun.start(); - Running = true; - } - } - - public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) - { - // TODO Auto-generated method stub - } - - public void surfaceDestroyed(SurfaceHolder arg0) - { - // TODO Auto-generated method stub - } - }); - - Created = true; - } - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java index 8622026b97..4662ca4372 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -15,20 +15,141 @@ import android.view.Surface; */ public final class NativeLibrary { + /** + * Handles touch events. + * + * @param Action Mask for the action being performed. + * @param X Location on the screen's X-axis that the touch event occurred. + * @param Y Location on the screen's Y-axis that the touch event occurred. + */ public static native void onTouchEvent(int Action, float X, float Y); + + /** + * Handles button press events for a gamepad. + * + * @param Device The input descriptor of the gamepad. + * @param Button Key code identifying which button was pressed. + * @param Action Mask identifying which action is happing (button pressed down, or button released). + */ public static native void onGamePadEvent(String Device, int Button, int Action); + + /** + * Handles gamepad movement events. + * + * @param Device The device ID of the gamepad. + * @param Axis The axis ID + * @param Value The value of the axis represented by the given ID. + */ public static native void onGamePadMoveEvent(String Device, int Axis, float Value); - public static native String GetConfig(String configFile, String Key, String Value, String Default); - public static native void SetConfig(String configFile, String Key, String Value, String Default); + + /** + * Gets a value from a key in the given ini-based config file. + * + * @param configFile The ini-based config file to get the value from. + * @param Section The section key that the actual key is in. + * @param Key The key to get the value from. + * @param Default The value to return in the event the given key doesn't exist. + * + * @return the value stored at the key, or a default value if it doesn't exist. + */ + public static native String GetConfig(String configFile, String Section, String Key, String Default); + + /** + * Sets a value to a key in the given ini config file. + * + * @param configFile The ini-based config file to add the value to. + * @param Section The section key for the ini key + * @param Key The actual ini key to set. + * @param Value The string to set the ini key to. + */ + public static native void SetConfig(String configFile, String Section, String Key, String Value); + + /** + * Sets the filename to be run during emulation. + * + * @param filename The filename to be run during emulation. + */ public static native void SetFilename(String filename); + + /** + * Sets the dimensions of the rendering window. + * + * @param width The new width of the rendering window (in pixels). + * @param height The new height of the rendering window (in pixels). + */ public static native void SetDimensions(int width, int height); + + /** + * Gets the embedded banner within the given ISO/ROM. + * + * @param filename the file path to the ISO/ROM. + * + * @return an integer array containing the color data for the banner. + */ public static native int[] GetBanner(String filename); + + /** + * Gets the embedded title of the given ISO/ROM. + * + * @param filename The file path to the ISO/ROM. + * + * @return the embedded title of the ISO/ROM. + */ public static native String GetTitle(String filename); + + /** + * Gets the Dolphin version string. + * + * @return the Dolphin version string. + */ public static native String GetVersionString(); + /** + * Returns if the phone supports NEON or not + * + * @return true if it supports NEON, false otherwise. + */ + public static native boolean SupportsNEON(); + + /** + * Saves a screen capture of the game + * + */ + public static native void SaveScreenShot(); + + /** + * Saves a game state to the slot number. + * + * @param slot The slot location to save state to. + */ + public static native void SaveState(int slot); + + /** + * Loads a game state from the slot number. + * + * @param slot The slot location to load state from. + */ + public static native void LoadState(int slot); + + /** + * Creates the initial folder structure in /sdcard/dolphin-emu/ + */ + public static native void CreateUserFolders(); + + /** + * Begins emulation. + * + * @param surf The surface to render to. + */ public static native void Run(Surface surf); + + /** Unpauses emulation from a paused state. */ public static native void UnPauseEmulation(); + + /** Pauses emulation. */ public static native void PauseEmulation(); + + /** Stops emulation. */ public static native void StopEmulation(); static @@ -39,7 +160,7 @@ public final class NativeLibrary } catch (UnsatisfiedLinkError ex) { - Log.w("NativeLibrary", ex.toString()); + Log.e("NativeLibrary", ex.toString()); } } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java deleted file mode 100644 index 0919e09964..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.app.Activity; -import android.os.Build; -import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.PreferenceFragment; -import javax.microedition.khronos.egl.*; -import javax.microedition.khronos.opengles.GL10; - -/** - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ -public final class PrefsFragment extends PreferenceFragment -{ - private Activity m_activity; - - static public class VersionCheck - { - EGL10 mEGL; - EGLDisplay mEGLDisplay; - EGLConfig[] mEGLConfigs; - EGLConfig mEGLConfig; - EGLContext mEGLContext; - EGLSurface mEGLSurface; - GL10 mGL; - - String mThreadOwner; - - public VersionCheck() - { - int[] version = new int[2]; - int[] attribList = new int[] { - EGL10.EGL_WIDTH, 1, - EGL10.EGL_HEIGHT, 1, - EGL10.EGL_RENDERABLE_TYPE, 4, - EGL10.EGL_NONE - }; - int EGL_CONTEXT_CLIENT_VERSION = 0x3098; - int[] ctx_attribs = new int[] { - EGL_CONTEXT_CLIENT_VERSION, 2, - EGL10.EGL_NONE - }; - - // No error checking performed, minimum required code to elucidate logic - mEGL = (EGL10) EGLContext.getEGL(); - mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - mEGL.eglInitialize(mEGLDisplay, version); - mEGLConfig = chooseConfig(); // Choosing a config is a little more complicated - mEGLContext = mEGL.eglCreateContext(mEGLDisplay, mEGLConfig, EGL10.EGL_NO_CONTEXT, ctx_attribs); - mEGLSurface = mEGL.eglCreatePbufferSurface(mEGLDisplay, mEGLConfig, attribList); - mEGL.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext); - mGL = (GL10) mEGLContext.getGL(); - - // Record thread owner of OpenGL context - mThreadOwner = Thread.currentThread().getName(); - } - - public String getVersion() - { - return mGL.glGetString(GL10.GL_VERSION); - } - - public String getVendor() - { - return mGL.glGetString(GL10.GL_VENDOR); - } - - public String getRenderer() - { - return mGL.glGetString(GL10.GL_RENDERER); - } - - private EGLConfig chooseConfig() - { - int[] attribList = new int[] { - EGL10.EGL_DEPTH_SIZE, 0, - EGL10.EGL_STENCIL_SIZE, 0, - EGL10.EGL_RED_SIZE, 8, - EGL10.EGL_GREEN_SIZE, 8, - EGL10.EGL_BLUE_SIZE, 8, - EGL10.EGL_ALPHA_SIZE, 8, - EGL10.EGL_NONE - }; - - // No error checking performed, minimum required code to elucidate logic - // Expand on this logic to be more selective in choosing a configuration - int[] numConfig = new int[1]; - mEGL.eglChooseConfig(mEGLDisplay, attribList, null, 0, numConfig); - int configSize = numConfig[0]; - mEGLConfigs = new EGLConfig[configSize]; - mEGL.eglChooseConfig(mEGLDisplay, attribList, mEGLConfigs, configSize, numConfig); - - return mEGLConfigs[0]; // Best match is probably the first configuration - } - } - - static public boolean SupportsGLES3() - { - VersionCheck mbuffer = new VersionCheck(); - String m_GLVersion = mbuffer.getVersion(); - String m_GLVendor = mbuffer.getVendor(); - String m_GLRenderer = mbuffer.getRenderer(); - - boolean mSupportsGLES3 = false; - - // Check for OpenGL ES 3 support (General case). - if (m_GLVersion != null && (m_GLVersion.contains("OpenGL ES 3.0") || m_GLVersion.equals("OpenGL ES 3.0"))) - mSupportsGLES3 = true; - - // Checking for OpenGL ES 3 support for certain Qualcomm devices. - if (!mSupportsGLES3 && m_GLVendor != null && m_GLVendor.equals("Qualcomm")) - { - if (m_GLRenderer.contains("Adreno (TM) 3")) - { - int mVStart = m_GLVersion.indexOf("V@") + 2; - int mVEnd = 0; - float mVersion; - - for (int a = mVStart; a < m_GLVersion.length(); ++a) - { - if (m_GLVersion.charAt(a) == ' ') - { - mVEnd = a; - break; - } - } - - mVersion = Float.parseFloat(m_GLVersion.substring(mVStart, mVEnd)); - - if (mVersion >= 14.0f) - mSupportsGLES3 = true; - } - } - return mSupportsGLES3; - } - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Load the preferences from an XML resource - addPreferencesFromResource(R.layout.prefs); - - final ListPreference cpuCores = (ListPreference) findPreference("cpuCorePref"); - - // - // Set valid emulation cores depending on the CPU architecture - // that the Android device is running on. - // - if (Build.CPU_ABI.contains("x86")) - { - cpuCores.setEntries(R.array.emuCoreEntriesX86); - cpuCores.setEntryValues(R.array.emuCoreValuesX86); - } - else if (Build.CPU_ABI.contains("arm")) - { - cpuCores.setEntries(R.array.emuCoreEntriesARM); - cpuCores.setEntryValues(R.array.emuCoreValuesARM); - } - else - { - cpuCores.setEntries(R.array.emuCoreEntriesOther); - cpuCores.setEntryValues(R.array.emuCoreValuesOther); - } - - // - // Setting valid video backends. - // - final ListPreference videoBackends = (ListPreference) findPreference("gpuPref"); - final boolean deviceSupportsGLES3 = SupportsGLES3(); - - if (deviceSupportsGLES3) - { - videoBackends.setEntries(R.array.videoBackendEntriesGLES3); - videoBackends.setEntryValues(R.array.videoBackendValuesGLES3); - } - else - { - videoBackends.setEntries(R.array.videoBackendEntriesNoGLES3); - videoBackends.setEntryValues(R.array.videoBackendValuesNoGLES3); - } - } - - @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); - - // This makes sure that the container activity has implemented - // the callback interface. If not, it throws an exception - try - { - m_activity = activity; - } - catch (ClassCastException e) - { - throw new ClassCastException(activity.toString() - + " must implement OnGameListZeroListener"); - } - } - - @Override - public void onDestroy() - { - super.onDestroy(); - - // When the fragment is done being used, save the settings to the Dolphin ini file. - UserPreferences.SaveConfigToDolphinIni(m_activity); - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java deleted file mode 100644 index 11c071b026..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; - -import java.util.List; - -public final class SideMenuAdapter extends ArrayAdapter -{ - private final Context c; - private final int id; - private final Listitems; - - public SideMenuAdapter(Context context, int textViewResourceId, List objects) - { - super(context, textViewResourceId, objects); - c = context; - id = textViewResourceId; - items = objects; - } - - public SideMenuItem getItem(int i) - { - return items.get(i); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) - { - View v = convertView; - if (v == null) - { - LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(id, null); - } - - final SideMenuItem item = items.get(position); - if (item != null) - { - TextView title = (TextView) v.findViewById(R.id.SideMenuTitle); - - if(title != null) - title.setText(item.getName()); - } - - return v; - } -} - diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java deleted file mode 100644 index 51ebc93c19..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2013 Dolphin Emulator Project - * Licensed under GPLv2 - * Refer to the license.txt file included. - */ - -package org.dolphinemu.dolphinemu; - - -/** - * Represents an item that goes in the sidemenu of the app. - */ -public final class SideMenuItem implements Comparable -{ - private final String m_name; - private final int m_id; - - /** - * Constructor - * - * @param name The name of the SideMenuItem. - * @param id ID number of this specific SideMenuItem. - */ - public SideMenuItem(String name, int id) - { - m_name = name; - m_id = id; - } - - /** - * Gets the name of this SideMenuItem. - * - * @return the name of this SideMenuItem. - */ - public String getName() - { - return m_name; - } - - /** - * Gets the ID of this SideMenuItem. - * - * @return the ID of this SideMenuItem. - */ - public int getID() - { - return m_id; - } - - public int compareTo(SideMenuItem o) - { - if(this.m_name != null) - return this.m_name.toLowerCase().compareTo(o.getName().toLowerCase()); - else - throw new IllegalArgumentException(); - } -} - diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/UserPreferences.java b/Source/Android/src/org/dolphinemu/dolphinemu/UserPreferences.java deleted file mode 100644 index ef33905b6b..0000000000 --- a/Source/Android/src/org/dolphinemu/dolphinemu/UserPreferences.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dolphinemu.dolphinemu; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -/** - * A class that retrieves all of the set user preferences in Android, in a safe way. - *

- * If any preferences are added to this emulator, an accessor for that preference - * should be added here. This way lengthy calls to getters from SharedPreferences - * aren't made necessary. - */ -public final class UserPreferences -{ - /** - * Writes the config to the Dolphin ini file. - * - * @param ctx The context used to retrieve the user settings. - * */ - public static void SaveConfigToDolphinIni(Context ctx) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); - - // Whether or not the user is using dual core. - boolean isUsingDualCore = prefs.getBoolean("dualCorePref", true); - - // Current CPU core being used. Falls back to interpreter upon error. - String currentEmuCore = prefs.getString("cpuCorePref", "0"); - - // Current video backend being used. Falls back to software rendering upon error - String currentVideoBackend = prefs.getString("gpuPref", "Software Rendering"); - - - NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUCore", currentEmuCore); - NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUThread", isUsingDualCore ? "True" : "False"); - NativeLibrary.SetConfig("Dolphin.ini", "Core", "GFXBackend", currentVideoBackend); - } -} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java new file mode 100644 index 0000000000..926b971398 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java @@ -0,0 +1,304 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.emulation; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.DisplayMetrics; +import android.view.*; +import android.view.WindowManager.LayoutParams; + +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.settings.InputConfigFragment; +import org.dolphinemu.dolphinemu.settings.VideoSettingsFragment; + +import java.util.List; + +/** + * This is the activity where all of the emulation handling happens. + * This activity is responsible for displaying the SurfaceView that we render to. + */ +public final class EmulationActivity extends Activity +{ + private boolean Running; + private boolean IsActionBarHidden = false; + private float screenWidth; + private float screenHeight; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Retrieve screen dimensions. + DisplayMetrics displayMetrics = new DisplayMetrics(); + WindowManager wm = getWindowManager(); + wm.getDefaultDisplay().getMetrics(displayMetrics); + this.screenHeight = displayMetrics.heightPixels; + this.screenWidth = displayMetrics.widthPixels; + + // Request window features for the emulation view. + getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); + getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN); + getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); + + // Set the transparency for the action bar. + ColorDrawable actionBarBackground = new ColorDrawable(Color.parseColor("#303030")); + actionBarBackground.setAlpha(175); + getActionBar().setBackgroundDrawable(actionBarBackground); + + // Set the native rendering screen width/height. + // Also get the intent passed from the GameList when the game + // was selected. This is so the path of the game can be retrieved + // and set on the native side of the code so the emulator can actually + // load the game. + Intent gameToEmulate = getIntent(); + + // Due to a bug in Adreno, it renders the screen rotated 90 degrees when using OpenGL + // Flip the width and height when on Adreno to work around this. + // This bug is fixed in Qualcomm driver v53 + // Mali isn't affected by this bug. + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + if (prefs.getString("gpuPref", "Software Rendering").equals("OGL") + && VideoSettingsFragment.SupportsGLES3() + && VideoSettingsFragment.m_GLVendor != null + && VideoSettingsFragment.m_GLVendor.equals("Qualcomm") + && VideoSettingsFragment.m_QualcommVersion < 53.0f) + NativeLibrary.SetDimensions((int)screenHeight, (int)screenWidth); + else + NativeLibrary.SetDimensions((int)screenWidth, (int)screenHeight); + NativeLibrary.SetFilename(gameToEmulate.getStringExtra("SelectedGame")); + Running = true; + + // Set the emulation window. + setContentView(R.layout.emulation_view); + + // Hide the action bar by default so it doesn't get in the way. + getActionBar().hide(); + IsActionBarHidden = true; + } + + @Override + public void onStop() + { + super.onStop(); + + if (Running) + NativeLibrary.StopEmulation(); + } + + @Override + public void onPause() + { + super.onPause(); + + if (Running) + NativeLibrary.PauseEmulation(); + } + + @Override + public void onResume() + { + super.onResume(); + + if (Running) + NativeLibrary.UnPauseEmulation(); + } + + @Override + public void onDestroy() + { + super.onDestroy(); + + if (Running) + { + NativeLibrary.StopEmulation(); + Running = false; + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) + { + float X = event.getX(); + float Y = event.getY(); + int Action = event.getActionMasked(); + + // Converts button locations 0 - 1 to OGL screen coords -1.0 - 1.0 + float ScreenX = ((X / screenWidth) * 2.0f) - 1.0f; + float ScreenY = ((Y / screenHeight) * -2.0f) + 1.0f; + + NativeLibrary.onTouchEvent(Action, ScreenX, ScreenY); + + return false; + } + + @Override + public void onBackPressed() + { + // The back button in the emulation + // window is the toggle for the action bar. + if (IsActionBarHidden) + { + IsActionBarHidden = false; + getActionBar().show(); + } + else + { + IsActionBarHidden = true; + getActionBar().hide(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.emuwindow_overlay, menu); + return true; + } + + @Override + public boolean onMenuItemSelected(int itemId, MenuItem item) + { + switch(item.getItemId()) + { + // Screenshot capturing + case R.id.takeScreenshot: + NativeLibrary.SaveScreenShot(); + return true; + + // Save state slots + case R.id.saveSlot1: + NativeLibrary.SaveState(0); + return true; + + case R.id.saveSlot2: + NativeLibrary.SaveState(1); + return true; + + case R.id.saveSlot3: + NativeLibrary.SaveState(2); + return true; + + case R.id.saveSlot4: + NativeLibrary.SaveState(3); + return true; + + case R.id.saveSlot5: + NativeLibrary.SaveState(4); + return true; + + // Load state slot + case R.id.loadSlot1: + NativeLibrary.LoadState(0); + return true; + + case R.id.loadSlot2: + NativeLibrary.LoadState(1); + return true; + + case R.id.loadSlot3: + NativeLibrary.LoadState(2); + return true; + + case R.id.loadSlot4: + NativeLibrary.LoadState(3); + return true; + + case R.id.loadSlot5: + NativeLibrary.LoadState(4); + return true; + + case R.id.exitEmulation: + { + // Create a confirmation method for quitting the current emulation instance. + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.overlay_exit_emulation)); + builder.setMessage(R.string.overlay_exit_emulation_confirm); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + finish(); + } + }); + builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + // Do nothing. Just makes the No button appear. + } + }); + builder.show(); + return true; + } + + default: + return super.onMenuItemSelected(itemId, item); + } + } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + int action = 0; + + if (Running) + { + switch (event.getAction()) + { + case KeyEvent.ACTION_DOWN: + // Handling the case where the back button is pressed. + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) + { + onBackPressed(); + return true; + } + + // Normal key events. + action = 0; + break; + case KeyEvent.ACTION_UP: + action = 1; + break; + default: + return false; + } + InputDevice input = event.getDevice(); + NativeLibrary.onGamePadEvent(InputConfigFragment.getInputDesc(input), event.getKeyCode(), action); + return true; + } + return false; + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) + { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) || !Running) + { + return super.dispatchGenericMotionEvent(event); + } + + InputDevice input = event.getDevice(); + List motions = input.getMotionRanges(); + + for (InputDevice.MotionRange range : motions) + { + NativeLibrary.onGamePadMoveEvent(InputConfigFragment.getInputDesc(input), range.getAxis(), event.getAxisValue(range.getAxis())); + } + + return true; + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java new file mode 100644 index 0000000000..90acf05e8e --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/NativeGLSurfaceView.java @@ -0,0 +1,74 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.emulation; + +import org.dolphinemu.dolphinemu.NativeLibrary; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +/** + * The {@link SurfaceView} that rendering is performed on. + */ +public final class NativeGLSurfaceView extends SurfaceView +{ + private static Thread myRun; + private static boolean Running = false; + private static boolean Created = false; + + /** + * Constructor. + * + * @param context The current {@link Context}. + * @param attribs An AttributeSet for retrieving data from XML files. + */ + public NativeGLSurfaceView(Context context, AttributeSet attribs) + { + super(context, attribs); + + if (!Created) + { + myRun = new Thread() + { + @Override + public void run() { + + NativeLibrary.Run(getHolder().getSurface()); + Created = false; + Running = false; + } + }; + + getHolder().addCallback(new SurfaceHolder.Callback() + { + public void surfaceCreated(SurfaceHolder holder) + { + // TODO Auto-generated method stub + if (!Running) + { + myRun.start(); + Running = true; + } + } + + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) + { + // TODO Auto-generated method stub + } + + public void surfaceDestroyed(SurfaceHolder holder) + { + // TODO Auto-generated method stub + } + }); + + Created = true; + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java new file mode 100644 index 0000000000..8aa561376a --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowser.java @@ -0,0 +1,166 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.folderbrowser; + +import android.app.ListFragment; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import java.io.File; +import java.util.*; + +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.gamelist.GameListActivity; + +/** + * A basic folder browser {@link ListFragment} that allows + * the user to select ISOs/ROMs for playing within the + * emulator. + *

+ * Any valid ISO/ROM selected in this will be added to + * the game list for easy browsing the next time the + * application is used. + *

+ * Note that this file browser does not display files + * or directories that are hidden + */ +public final class FolderBrowser extends ListFragment +{ + private FolderBrowserAdapter adapter; + private static File currentDir = null; + + // Populates the FolderView with the given currDir's contents. + private void Fill(File currDir) + { + // Clear the adapter of previous items. + adapter.clear(); + + // Set the activity title to the current directory the FolderBrowser is in. + getActivity().setTitle(String.format(getString(R.string.current_dir), currDir.getName())); + + File[] dirs = currDir.listFiles(); + List dir = new ArrayList(); + List fls = new ArrayList(); + + // Supported extensions to filter by + Set validExts = new HashSet(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); + + // If dirs is null, then we don't have access permissions to the selected folder. + if (dirs != null) + { + // Search for any directories or files within the current dir. + for(File entry : dirs) + { + try + { + String entryName = entry.getName(); + boolean hasExtension = (entryName.lastIndexOf(".") != -1); + + // Skip hidden folders/files. + if (!entry.isHidden()) + { + if(entry.isDirectory()) + { + dir.add(new FolderBrowserItem(entryName, entry.getAbsolutePath())); + } + else if (entry.isFile() && hasExtension) + { + if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) + { + fls.add(new FolderBrowserItem(entryName, String.format(getString(R.string.file_size), entry.length()), entry.getAbsolutePath())); + } + } + } + } + catch (Exception ex) + { + Log.e("FolderBrowser", ex.toString()); + } + } + } + + Collections.sort(dir); + Collections.sort(fls); + dir.addAll(fls); + + // Check for a parent directory to the one we're currently in. + if (!currDir.getPath().equalsIgnoreCase("/")) + dir.add(0, new FolderBrowserItem("..", getString(R.string.parent_directory), currDir.getParent())); + + // Add the items to the adapter and notify the adapter users of its new contents. + adapter.addAll(dir); + adapter.notifyDataSetChanged(); + } + + @Override + public void onListItemClick(ListView lv, View v, int position, long id) + { + FolderBrowserItem item = adapter.getItem(position); + if(item.isDirectory()) + { + currentDir = new File(item.getPath()); + Fill(currentDir); + } + else + { + FolderSelected(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { + if(currentDir == null) + currentDir = new File(Environment.getExternalStorageDirectory().getPath()); + + ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); + adapter = new FolderBrowserAdapter(getActivity(), R.layout.gamelist_folderbrowser_list_item); + rootView.setAdapter(adapter); + + Fill(currentDir); + return rootView; + } + + private void FolderSelected() + { + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); + int intDirectories = Integer.parseInt(Directories); + + // Check to see if a path set in the Dolphin config + // matches the one the user is trying to add. If it's + // already set, then don't add it to the list again. + boolean pathNotPresent = true; + for (int i = 0; i < intDirectories; i++) + { + String gcmPath = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + i, ""); + + if (gcmPath.equals(currentDir.getPath())) + { + pathNotPresent = false; + } + else + { + pathNotPresent = true; + } + } + + // User doesn't have this path in the config, so add it. + if (pathNotPresent) + { + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPathes", Integer.toString(intDirectories+1)); + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + Integer.toString(intDirectories), currentDir.getPath()); + } + + ((GameListActivity)getActivity()).SwitchPage(0); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java new file mode 100644 index 0000000000..f97799e6e4 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserAdapter.java @@ -0,0 +1,112 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.folderbrowser; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import org.dolphinemu.dolphinemu.R; + +/** + * The {@link ArrayAdapter} that backs the file browser. + *

+ * This is responsible for correctly handling the display + * of the items for the {@link FolderBrowser} UI. + */ +public final class FolderBrowserAdapter extends ArrayAdapter +{ + // ViewHolder which is used to hold onto + // items within a listview. This is done + // so that findViewById is not needed to + // be excessively called over and over. + private static final class ViewHolder + { + TextView title; + TextView subtitle; + ImageView icon; + } + + private final Context context; + private final int id; + private ViewHolder viewHolder; + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. + */ + public FolderBrowserAdapter(Context context, int resourceId) + { + super(context, resourceId); + + this.context = context; + this.id = resourceId; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + if (convertView == null) + { + LayoutInflater vi = LayoutInflater.from(context); + convertView = vi.inflate(id, parent, false); + + // Initialize the ViewHolder and store it. + viewHolder = new ViewHolder(); + viewHolder.title = (TextView) convertView.findViewById(R.id.ListItemTitle); + viewHolder.subtitle = (TextView) convertView.findViewById(R.id.ListItemSubTitle); + viewHolder.icon = (ImageView) convertView.findViewById(R.id.ListItemIcon); + convertView.setTag(viewHolder); + } + else // Can recover the holder. + { + viewHolder = (ViewHolder) convertView.getTag(); + } + + final FolderBrowserItem item = getItem(position); + if (item != null) + { + if (viewHolder.title != null) + { + viewHolder.title.setText(item.getName()); + } + + if (viewHolder.subtitle != null) + { + // Remove the subtitle for all folders, except for the parent directory folder. + if (item.isDirectory() && !item.getSubtitle().equals(context.getString(R.string.parent_directory))) + { + viewHolder.subtitle.setVisibility(View.GONE); + } + else + { + viewHolder.subtitle.setVisibility(View.VISIBLE); + viewHolder.subtitle.setText(item.getSubtitle()); + } + } + + if (viewHolder.icon != null) + { + if (item.isDirectory()) + { + viewHolder.icon.setImageResource(R.drawable.ic_menu_folder); + } + else + { + viewHolder.icon.setImageResource(R.drawable.ic_menu_file); + } + } + } + return convertView; + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java new file mode 100644 index 0000000000..e419162ed3 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/folderbrowser/FolderBrowserItem.java @@ -0,0 +1,110 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.folderbrowser; + +import java.io.File; + +/** + * Represents an item in the {@link FolderBrowser} list. + */ +public final class FolderBrowserItem implements Comparable +{ + private final String name; + private final String subtitle; + private final String path; + private final File underlyingFile; + + /** + * Constructor + * + * @param name The name of the file/folder represented by this item. + * @param subtitle The subtitle of this FolderBrowserItem. + * @param path The path of the file/folder represented by this item. + */ + public FolderBrowserItem(String name, String subtitle, String path) + { + this.name = name; + this.subtitle = subtitle; + this.path = path; + this.underlyingFile = new File(path); + } + + /** + * Constructor. Initializes a FolderBrowserItem with an empty subtitle. + * + * @param name The name of the file/folder represented by this item. + * @param path The path of the file/folder represented by this item. + */ + public FolderBrowserItem(String name, String path) + { + this.name = name; + this.subtitle = ""; + this.path = path; + this.underlyingFile = new File(path); + } + + /** + * Gets the name of the file/folder represented by this FolderBrowserItem. + * + * @return the name of the file/folder represented by this FolderBrowserItem. + */ + public String getName() + { + return name; + } + + /** + * Gets the subtitle text of this FolderBrowserItem. + * + * @return the subtitle text of this FolderBrowserItem. + */ + public String getSubtitle() + { + return subtitle; + } + + /** + * Gets the path of the file/folder represented by this FolderBrowserItem. + * + * @return the path of the file/folder represented by this FolderBrowserItem. + */ + public String getPath() + { + return path; + } + + /** + * Gets the {@link File} representation of the underlying file/folder + * represented by this FolderBrowserItem. + * + * @return the {@link File} representation of the underlying file/folder + * represented by this FolderBrowserItem. + */ + public File getUnderlyingFile() + { + return underlyingFile; + } + + /** + * Gets whether or not this FolderBrowserItem represents a directory. + * + * @return true if this FolderBrowserItem represents a directory, false otherwise. + */ + public boolean isDirectory() + { + return underlyingFile.isDirectory(); + } + + @Override + public int compareTo(FolderBrowserItem other) + { + if(name != null) + return name.toLowerCase().compareTo(other.getName().toLowerCase()); + else + throw new NullPointerException("The name of this FolderBrowserItem is null"); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java new file mode 100644 index 0000000000..940632a8ea --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListActivity.java @@ -0,0 +1,317 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.gamelist; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Fragment; +import android.app.FragmentTransaction; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.widget.DrawerLayout; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; + +import org.dolphinemu.dolphinemu.AboutFragment; +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.folderbrowser.FolderBrowser; +import org.dolphinemu.dolphinemu.settings.PrefsActivity; +import org.dolphinemu.dolphinemu.sidemenu.SideMenuAdapter; +import org.dolphinemu.dolphinemu.sidemenu.SideMenuItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * The activity that implements all of the functions + * for the game list. + */ +public final class GameListActivity extends Activity + implements GameListFragment.OnGameListZeroListener +{ + private int mCurFragmentNum = 0; + + private ActionBarDrawerToggle mDrawerToggle; + private DrawerLayout mDrawerLayout; + private SideMenuAdapter mDrawerAdapter; + private ListView mDrawerList; + + /** + * Called from the {@link GameListFragment}. + *

+ * This is called when there are no games + * currently present within the game list. + */ + public void onZeroFiles() + { + mDrawerLayout.openDrawer(mDrawerList); + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.gamelist_activity); + + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.left_drawer); + + // Construct list of items to add to the side menu. + List dir = new ArrayList(); + dir.add(new SideMenuItem(getString(R.string.game_list), 0)); + dir.add(new SideMenuItem(getString(R.string.browse_folder), 1)); + dir.add(new SideMenuItem(getString(R.string.settings), 2)); + dir.add(new SideMenuItem(getString(R.string.about), 3)); + + mDrawerAdapter = new SideMenuAdapter(this, R.layout.sidemenu, dir); + mDrawerList.setAdapter(mDrawerAdapter); + mDrawerList.setOnItemClickListener(mMenuItemClickListener); + + // Enable ActionBar app icon to behave as action to toggle nav drawer + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + + // ActionBarDrawerToggle ties together the the proper interactions + // between the sliding drawer and the action bar app icon + mDrawerToggle = new ActionBarDrawerToggle( + this, /* Host Activity */ + mDrawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, /* Navigation drawer image to replace 'Up' caret */ + R.string.drawer_open, /* "open drawer" description for accessibility */ + R.string.drawer_close /* "close drawer" description for accessibility */ + ) { + public void onDrawerClosed(View view) { + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + + public void onDrawerOpened(View drawerView) { + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + }; + mDrawerLayout.setDrawerListener(mDrawerToggle); + + // Display the game list fragment on activity creation, + // but only if no previous states have been saved. + if (savedInstanceState == null) + { + final GameListFragment gameList = new GameListFragment(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(R.id.content_frame, gameList); + ft.commit(); + } + + + // Create an alert telling them that their phone sucks + if (Build.CPU_ABI.contains("arm") && !NativeLibrary.SupportsNEON()) + { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.device_compat_warning); + builder.setMessage(R.string.device_compat_warning_msg); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // Do Nothing. Just create the Yes button + } + }); + builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + finish(); + } + }); + builder.show(); + } + } + + /** + * Switches to the {@link Fragment} represented + * by the given ID number. + * + * @param toPage the number representing the {@link Fragment} to switch to. + */ + public void SwitchPage(int toPage) + { + if (mCurFragmentNum == toPage) + return; + + switch(toPage) + { + case 0: // Game list + { + // We use the title section as the browser directory tracker in the folder browser. + // Make sure we flip the title back if we're coming from that fragment. + if (mCurFragmentNum == 1) + setTitle(R.string.app_name); + + mCurFragmentNum = 0; + final GameListFragment gameList = new GameListFragment(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(R.id.content_frame, gameList); + ft.commit(); + invalidateOptionsMenu(); + } + break; + + case 1: // Folder Browser + { + mCurFragmentNum = 1; + final FolderBrowser folderBrowser = new FolderBrowser(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(R.id.content_frame, folderBrowser); + ft.addToBackStack(null); + ft.commit(); + invalidateOptionsMenu(); + } + break; + + case 2: // Settings + { + Intent intent = new Intent(this, PrefsActivity.class); + startActivity(intent); + } + break; + + case 3: // About + { + mCurFragmentNum = 3; + final AboutFragment aboutFragment = new AboutFragment(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(R.id.content_frame, aboutFragment); + ft.addToBackStack(null); + ft.commit(); + invalidateOptionsMenu(); + } + break; + + default: + break; + } + } + + private final AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() + { + public void onItemClick(AdapterView parent, View view, int position, long id) + { + SideMenuItem o = mDrawerAdapter.getItem(position); + mDrawerLayout.closeDrawer(mDrawerList); + SwitchPage(o.getID()); + } + }; + + /** + * When using the ActionBarDrawerToggle, you must call it during + * onPostCreate() and onConfigurationChanged()... + */ + @Override + protected void onPostCreate(Bundle savedInstanceState) + { + super.onPostCreate(savedInstanceState); + + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + + // Pass any configuration change to the drawer toggle + mDrawerToggle.onConfigurationChanged(newConfig); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + // Only show this in the game list. + if (mCurFragmentNum == 0) + { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.gamelist_menu, menu); + return true; + } + + return false; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + // The action bar home/up action should open or close the drawer. + // ActionBarDrawerToggle will take care of this. + if (mDrawerToggle.onOptionsItemSelected(item)) + { + return true; + } + + // If clear game list is pressed. + if (item.getItemId() == R.id.clearGameList) + { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.clear_game_list); + builder.setMessage(getString(R.string.clear_game_list_confirm)); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener(){ + public void onClick(DialogInterface dialog, int which) + { + String directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); + int intDirs = Integer.parseInt(directories); + + for (int i = 0; i < intDirs; i++) + { + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + i, ""); + } + + // Since we flushed all paths, we signify this in the ini. + NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPathes", "0"); + + // Now finally, clear the game list. + ((GameListFragment) getFragmentManager().findFragmentById(R.id.content_frame)).clearGameList(); + } + }); + builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + // Do nothing. This just make "No" appear. + } + }); + + builder.show(); + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); + + outState.putInt("currentFragmentNum", mCurFragmentNum); + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) + { + super.onRestoreInstanceState(savedInstanceState); + + mCurFragmentNum = savedInstanceState.getInt("currentFragmentNum"); + } + + @Override + public void onBackPressed() + { + SwitchPage(0); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java new file mode 100644 index 0000000000..d4dedd29aa --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListAdapter.java @@ -0,0 +1,76 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.gamelist; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import org.dolphinemu.dolphinemu.R; + +/** + * The adapter backing the game list. + *

+ * Responsible for handling each game list item individually. + */ +public final class GameListAdapter extends ArrayAdapter +{ + private final Context context; + private final int id; + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. + */ + public GameListAdapter(Context context, int resourceId) + { + super(context, resourceId); + + this.context = context; + this.id = resourceId; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + if (convertView == null) + { + LayoutInflater vi = LayoutInflater.from(context); + convertView = vi.inflate(id, parent, false); + } + + final GameListItem item = getItem(position); + if (item != null) + { + TextView title = (TextView) convertView.findViewById(R.id.ListItemTitle); + TextView subtitle = (TextView) convertView.findViewById(R.id.ListItemSubTitle); + ImageView icon = (ImageView) convertView.findViewById(R.id.ListItemIcon); + + if (title != null) + title.setText(item.getName()); + + if (subtitle != null) + subtitle.setText(item.getData()); + + if (icon != null) + { + icon.setImageBitmap(item.getImage()); + icon.getLayoutParams().width = (int) ((860 / context.getResources().getDisplayMetrics().density) + 0.5); + icon.getLayoutParams().height = (int)((340 / context.getResources().getDisplayMetrics().density) + 0.5); + } + } + + return convertView; + } +} + diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java new file mode 100644 index 0000000000..9dedf914dc --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListFragment.java @@ -0,0 +1,149 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.gamelist; + +import android.app.Activity; +import android.app.ListFragment; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; +import android.widget.Toast; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.emulation.EmulationActivity; + + +/** + * The {@link ListFragment} responsible for displaying the game list. + */ +public final class GameListFragment extends ListFragment +{ + private GameListAdapter mGameAdapter; + private OnGameListZeroListener mCallback; + + /** + * Interface that defines how to handle the case + * when there are zero games in the game list. + */ + public interface OnGameListZeroListener + { + /** + * This is called when there are no games + * currently present within the game list. + */ + void onZeroFiles(); + } + + /** + * Clears all entries from the {@link GameListAdapter} + * backing this GameListFragment. + */ + public void clearGameList() + { + mGameAdapter.clear(); + mGameAdapter.notifyDataSetChanged(); + } + + private void Fill() + { + List fls = new ArrayList(); + String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0"); + int intDirectories = Integer.parseInt(Directories); + + // Extensions to filter by. + Set exts = new HashSet(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); + + for (int a = 0; a < intDirectories; ++a) + { + String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + a, ""); + File currentDir = new File(BrowseDir); + File[] dirs = currentDir.listFiles(); + try + { + for (File entry : dirs) + { + String entryName = entry.getName(); + + if (!entry.isHidden() && !entry.isDirectory()) + { + if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.')))) + fls.add(new GameListItem(getActivity(), entryName, String.format(getString(R.string.file_size), entry.length()), entry.getAbsolutePath())); + } + } + } + catch (Exception ignored) + { + } + } + Collections.sort(fls); + + // Add all the items to the adapter + mGameAdapter.addAll(fls); + mGameAdapter.notifyDataSetChanged(); + + if (fls.isEmpty()) + { + mCallback.onZeroFiles(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { + ListView rootView = (ListView) inflater.inflate(R.layout.gamelist_listview, container, false); + mGameAdapter = new GameListAdapter(getActivity(), R.layout.gamelist_folderbrowser_list_item); + rootView.setAdapter(mGameAdapter); + + Fill(); + + return rootView; + } + + @Override + public void onListItemClick(ListView listView, View view, int position, long id) + { + GameListItem item = mGameAdapter.getItem(position); + + // Show a toast indicating which game was clicked. + Toast.makeText(getActivity(), String.format(getString(R.string.file_clicked), item.getPath()), Toast.LENGTH_SHORT).show(); + + // Start the emulation activity and send the path of the clicked ROM to it. + Intent intent = new Intent(getActivity(), EmulationActivity.class); + intent.putExtra("SelectedGame", item.getPath()); + startActivity(intent); + } + + @Override + public void onAttach(Activity activity) + { + super.onAttach(activity); + + // This makes sure that the container activity has implemented + // the callback interface. If not, it throws an exception + try + { + mCallback = (OnGameListZeroListener) activity; + } + catch (ClassCastException e) + { + throw new ClassCastException(activity.toString() + + " must implement OnGameListZeroListener"); + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListItem.java new file mode 100644 index 0000000000..1b72da7b9b --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/gamelist/GameListItem.java @@ -0,0 +1,124 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.gamelist; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Log; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import org.dolphinemu.dolphinemu.NativeLibrary; + +/** + * Represents an item in the game list. + */ +public final class GameListItem implements Comparable +{ + private String name; + private final String data; + private final String path; + private Bitmap image; + + /** + * Constructor. + * + * @param ctx The current {@link Context} + * @param name The name of this GameListItem. + * @param data The subtitle for this GameListItem + * @param path The file path for the game represented by this GameListItem. + */ + public GameListItem(Context ctx, String name, String data, String path) + { + this.name = name; + this.data = data; + this.path = path; + + File file = new File(path); + if (!file.isDirectory() && !path.isEmpty()) + { + int[] Banner = NativeLibrary.GetBanner(path); + if (Banner[0] == 0) + { + try + { + // Open the no banner icon. + InputStream noBannerPath = ctx.getAssets().open("NoBanner.png"); + + // Decode the bitmap. + image = BitmapFactory.decodeStream(noBannerPath); + + // Scale the bitmap to match other banners. + image = Bitmap.createScaledBitmap(image, 96, 32, false); + } + catch (IOException e) + { + Log.e("GameListItem", e.toString()); + } + } + else + { + image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); + } + + this.name = NativeLibrary.GetTitle(path); + } + } + + /** + * Gets the name of this GameListItem. + * + * @return the name of this GameListItem. + */ + public String getName() + { + return name; + } + + /** + * Gets the subtitle of this GameListItem. + * + * @return the subtitle of this GameListItem. + */ + public String getData() + { + return data; + } + + /** + * Gets the file path of the game represented by this GameListItem. + * + * @return the file path of the game represented by this GameListItem. + */ + public String getPath() + { + return path; + } + + /** + * Gets the image data for this game as a {@link Bitmap}. + * + * @return the image data for this game as a {@link Bitmap}. + */ + public Bitmap getImage() + { + return image; + } + + @Override + public int compareTo(GameListItem o) + { + if (name != null) + return name.toLowerCase().compareTo(o.getName().toLowerCase()); + else + throw new NullPointerException("The name of this GameListItem is null"); + } +} + diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java new file mode 100644 index 0000000000..47f0cb7d35 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java @@ -0,0 +1,51 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings; + +import org.dolphinemu.dolphinemu.R; + +import android.os.Build; +import android.os.Bundle; +import android.preference.ListPreference; +import android.preference.PreferenceFragment; + +/** + * Responsible for the loading of the CPU preferences. + */ +public final class CPUSettingsFragment extends PreferenceFragment +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.cpu_prefs); + + final ListPreference cpuCores = (ListPreference) findPreference("cpuCorePref"); + + // + // Set valid emulation cores depending on the CPU architecture + // that the Android device is running on. + // + if (Build.CPU_ABI.contains("x86")) + { + cpuCores.setEntries(R.array.emuCoreEntriesX86); + cpuCores.setEntryValues(R.array.emuCoreValuesX86); + } + else if (Build.CPU_ABI.contains("arm")) + { + cpuCores.setEntries(R.array.emuCoreEntriesARM); + cpuCores.setEntryValues(R.array.emuCoreValuesARM); + } + else + { + cpuCores.setEntries(R.array.emuCoreEntriesOther); + cpuCores.setEntryValues(R.array.emuCoreValuesOther); + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java new file mode 100644 index 0000000000..26e89f412d --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java @@ -0,0 +1,270 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Build; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceScreen; +import android.util.Log; +import android.view.*; + +import java.util.ArrayList; +import java.util.List; + +import org.dolphinemu.dolphinemu.NativeLibrary; +import org.dolphinemu.dolphinemu.R; + +/** + * The {@link Fragment} responsible for implementing the functionality + * within the input control mapping config. + */ +public final class InputConfigFragment extends PreferenceFragment +{ + private Activity m_activity; + private boolean firstEvent = true; + private static final ArrayList m_values = new ArrayList(); + + /** + * Gets the descriptor for the given {@link InputDevice}. + * + * @param input The {@link InputDevice} to get the descriptor of. + * + * @return the descriptor for the given {@link InputDevice}. + */ + public static String getInputDesc(InputDevice input) + { + if (input == null) + return "null"; // Happens when the InputDevice is from an unknown source + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + { + return input.getDescriptor(); + } + else + { + List motions = input.getMotionRanges(); + String fakeid = ""; + + for (InputDevice.MotionRange range : motions) + fakeid += range.getAxis(); + + return fakeid; + } + } + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Expand the preferences from the XML. + addPreferencesFromResource(R.xml.input_prefs); + + // Set the summary messages of the preferences to whatever binding + // is currently set within the Dolphin config. + final String[] keys = + { + "InputA", "InputB", "InputX", "InputY", "InputZ", "InputStart", + "DPadUp", "DPadDown", "DPadLeft", "DPadRight", + "MainUp", "MainDown", "MainLeft", "MainRight", + "CStickUp", "CStickDown", "CStickLeft", "CStickRight", + "InputL", "InputR", + }; + + Preference pref; + for (String key : keys) + { + String binding = NativeLibrary.GetConfig("Dolphin.ini", "Android", key, "None"); + pref = findPreference(key); + pref.setSummary(binding); + } + } + + @Override + public boolean onPreferenceTreeClick(final PreferenceScreen screen, final Preference pref) + { + // Begin the creation of the input alert. + final MotionAlertDialog dialog = new MotionAlertDialog(m_activity); + + // Set the key listener + dialog.setOnKeyListener(new AlertDialog.OnKeyListener() + { + public boolean onKey(DialogInterface dlg, int keyCode, KeyEvent event) + { + Log.d("InputConfigFragment", "Received key event: " + event.getAction()); + switch (event.getAction()) + { + case KeyEvent.ACTION_DOWN: + case KeyEvent.ACTION_UP: + InputDevice input = event.getDevice(); + String bindStr = "Device '" + getInputDesc(input) + "'-Button " + event.getKeyCode(); + NativeLibrary.SetConfig("Dolphin.ini", "Android", pref.getKey(), bindStr); + pref.setSummary(bindStr); + dialog.dismiss(); + return true; + + default: + break; + } + + return false; + } + }); + + // Set the motion event listener. + dialog.setOnMotionEventListener(new MotionAlertDialog.OnMotionEventListener() + { + public boolean onMotion(MotionEvent event) + { + if (event == null || (event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) + return false; + + Log.d("InputConfigFragment", "Received motion event: " + event.getAction()); + + InputDevice input = event.getDevice(); + List motions = input.getMotionRanges(); + if (firstEvent) + { + m_values.clear(); + + for (InputDevice.MotionRange range : motions) + { + m_values.add(event.getAxisValue(range.getAxis())); + } + + firstEvent = false; + } + else + { + for (int a = 0; a < motions.size(); ++a) + { + InputDevice.MotionRange range = motions.get(a); + + if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) + { + String bindStr = "Device '" + InputConfigFragment.getInputDesc(input) + "'-Axis " + range.getAxis() + "-"; + NativeLibrary.SetConfig("Dolphin.ini", "Android", pref.getKey(), bindStr); + pref.setSummary(bindStr); + dialog.dismiss(); + } + else if (m_values.get(a) < (event.getAxisValue(range.getAxis()) - 0.5f)) + { + String bindStr = "Device '" + InputConfigFragment.getInputDesc(input) + "'-Axis " + range.getAxis() + "+"; + NativeLibrary.SetConfig("Dolphin.ini", "Android", pref.getKey(), bindStr); + pref.setSummary(bindStr); + dialog.dismiss(); + } + } + } + + return true; + } + }); + + // Set the cancel button. + dialog.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.cancel), new AlertDialog.OnClickListener() + { + public void onClick(DialogInterface dialog, int which) + { + // Do nothing. This just makes the cancel button appear. + } + }); + + // Set the title and description message. + dialog.setTitle(R.string.input_binding); + dialog.setMessage(String.format(getString(R.string.input_binding_descrip), pref.getTitle())); + + // Don't allow the dialog to close when a user taps + // outside of it. They must press cancel or provide an input. + dialog.setCanceledOnTouchOutside(false); + + // Everything is set, show the dialog. + dialog.show(); + return true; + } + + @Override + public void onAttach(Activity activity) + { + super.onAttach(activity); + + // Cache the activity instance. + m_activity = activity; + } + + /** + * {@link AlertDialog} class derivative that allows the motion listener + * to be set anonymously, so the creation of an explicit class for + * providing functionality is not necessary. + */ + private static final class MotionAlertDialog extends AlertDialog + { + private OnMotionEventListener motionListener; + + /** + * Constructor + * + * @param ctx context to use this dialog in. + */ + public MotionAlertDialog(Context ctx) + { + super(ctx); + } + + /** + * Interface which defines a callback method for general + * motion events. This allows motion event code to be set + * in the event anonymous classes of this dialog are used. + */ + public interface OnMotionEventListener + { + /** + * Denotes the behavior that should happen when a motion event occurs. + * + * @param event Reference to the {@link MotionEvent} that occurred. + * + * @return true if the {@link MotionEvent} is consumed in this call; false otherwise. + */ + boolean onMotion(MotionEvent event); + } + + /** + * Sets the motion listener. + * + * @param listener The motion listener to set. + */ + public void setOnMotionEventListener(OnMotionEventListener listener) + { + this.motionListener = listener; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (onKeyDown(event.getKeyCode(), event)) + return true; + + return super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) + { + if (motionListener.onMotion(event)) + return true; + + return super.dispatchGenericMotionEvent(event); + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java new file mode 100644 index 0000000000..51153866e1 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java @@ -0,0 +1,151 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings; + +import org.dolphinemu.dolphinemu.R; + +import android.app.ActionBar; +import android.app.ActionBar.Tab; +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v13.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; + +/** + * Main activity that manages all of the preference fragments used to display + * the settings to the user. + */ +public final class PrefsActivity extends Activity implements ActionBar.TabListener, OnSharedPreferenceChangeListener +{ + /** + * The {@link ViewPager} that will host the section contents. + */ + private ViewPager mViewPager; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Set the ViewPager. + setContentView(R.layout.prefs_viewpager); + mViewPager = (ViewPager) findViewById(R.id.pager); + + // Set the ViewPager adapter. + final ViewPagerAdapter mSectionsPagerAdapter = new ViewPagerAdapter(getFragmentManager()); + mViewPager.setAdapter(mSectionsPagerAdapter); + + // Register the preference change listener. + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); + sPrefs.registerOnSharedPreferenceChangeListener(this); + + // Set up the action bar. + final ActionBar actionBar = getActionBar(); + actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); + actionBar.addTab(actionBar.newTab().setText(R.string.cpu_settings).setTabListener(this)); + actionBar.addTab(actionBar.newTab().setText(R.string.input_settings).setTabListener(this)); + actionBar.addTab(actionBar.newTab().setText(R.string.video_settings).setTabListener(this)); + + // When swiping between different sections, select the corresponding + // tab. We can also use ActionBar.Tab#select() to do this if we have + // a reference to the Tab. + mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() + { + @Override + public void onPageSelected(int position) + { + actionBar.setSelectedNavigationItem(position); + } + } ); + } + + public void onTabSelected(Tab tab, FragmentTransaction ft) + { + // When the given tab is selected, switch to the corresponding page in the ViewPager. + mViewPager.setCurrentItem(tab.getPosition()); + } + + public void onTabReselected(Tab tab, FragmentTransaction ft) + { + // Do nothing. + } + + public void onTabUnselected(Tab tab, FragmentTransaction ft) + { + // Do nothing. + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) + { + // If any change is made to the preferences in the front-end, immediately save them. + UserPreferences.SavePrefsToIni(this); + } + + /** + * A {@link FragmentPagerAdapter} that returns a fragment + * corresponding to one of the sections/tabs/pages. + */ + private final class ViewPagerAdapter extends FragmentPagerAdapter + { + public ViewPagerAdapter(FragmentManager fm) + { + super(fm); + } + + @Override + public Fragment getItem(int position) + { + switch(position) + { + case 0: + return new CPUSettingsFragment(); + + case 1: + return new InputConfigFragment(); + + case 2: + return new VideoSettingsFragment(); + + default: // Should never happen. + return null; + } + } + + @Override + public int getCount() + { + // Show total pages. + return 3; + } + + @Override + public CharSequence getPageTitle(int position) + { + switch(position) + { + case 0: + return getString(R.string.cpu_settings); + + case 1: + return getString(R.string.input_settings); + + case 2: + return getString(R.string.video_settings); + + default: // Should never happen. + return null; + } + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java new file mode 100644 index 0000000000..3811f96a0c --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java @@ -0,0 +1,250 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings; + +import org.dolphinemu.dolphinemu.NativeLibrary; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +/** + * A class that retrieves all of the set user preferences in Android, in a safe way. + *

+ * If any preferences are added to this emulator, an accessor for that preference + * should be added here. This way lengthy calls to getters from SharedPreferences + * aren't made necessary. + */ +public final class UserPreferences +{ + /** + * Loads the settings stored in the Dolphin ini config files to the shared preferences of this front-end. + * + * @param ctx The context used to retrieve the SharedPreferences instance. + */ + public static void LoadIniToPrefs(Context ctx) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); + + // Get an editor. + SharedPreferences.Editor editor = prefs.edit(); + + // Add the settings. + editor.putString("cpuCorePref", getConfig("Dolphin.ini", "Core", "CPUCore", "3")); + editor.putBoolean("dualCorePref", getConfig("Dolphin.ini", "Core", "CPUThread", "False").equals("True")); + editor.putBoolean("fastmemPref", getConfig("Dolphin.ini", "Core", "Fastmem", "False").equals("True")); + + editor.putString("gpuPref", getConfig("Dolphin.ini", "Core", "GFXBackend", "Software Renderer")); + editor.putBoolean("showFPS", getConfig("gfx_opengl.ini", "Settings", "ShowFPS", "False").equals("True")); + editor.putBoolean("drawOnscreenControls", getConfig("Dolphin.ini", "Android", "ScreenControls", "True").equals("True")); + + editor.putString("internalResolution", getConfig("gfx_opengl.ini", "Settings", "EFBScale", "2") ); + editor.putString("FSAA", getConfig("gfx_opengl.ini", "Settings", "MSAA", "0")); + editor.putString("anisotropicFiltering", getConfig("gfx_opengl.ini", "Enhancements", "MaxAnisotropy", "0")); + editor.putBoolean("scaledEFBCopy", getConfig("gfx_opengl.ini", "Hacks", "EFBScaleCopy", "True").equals("True")); + editor.putBoolean("perPixelLighting", getConfig("gfx_opengl.ini", "Settings", "EnablePixelLighting", "False").equals("True")); + editor.putBoolean("forceTextureFiltering", getConfig("gfx_opengl.ini", "Enhancements", "ForceFiltering", "False").equals("True")); + editor.putBoolean("disableFog", getConfig("gfx_opengl.ini", "Settings", "DisableFog", "False").equals("True")); + editor.putBoolean("skipEFBAccess", getConfig("gfx_opengl.ini", "Hacks", "EFBAccessEnable", "False").equals("True")); + editor.putBoolean("ignoreFormatChanges", getConfig("gfx_opengl.ini", "Hacks", "EFBEmulateFormatChanges", "False").equals("False")); + + String efbCopyOn = getConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "False"); + String efbToTexture = getConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "False"); + String efbCopyCache = getConfig("gfx_opengl.ini", "Hacks", "EFBCopyCacheEnable", "False"); + + if (efbCopyOn.equals("False")) + { + editor.putString("efbCopyMethod", "Off"); + } + else if (efbCopyOn.equals("True") && efbToTexture.equals("True")) + { + editor.putString("efbCopyMethod", "Texture"); + } + else if(efbCopyOn.equals("True") && efbToTexture.equals("False") && efbCopyCache.equals("False")) + { + editor.putString("efbCopyMethod", "RAM (uncached)"); + } + else if(efbCopyOn.equals("True") && efbToTexture.equals("False") && efbCopyCache.equals("True")) + { + editor.putString("efbCopyMethod", "RAM (cached)"); + } + + editor.putString("textureCacheAccuracy", getConfig("gfx_opengl.ini", "Settings", "SafeTextureCacheColorSamples", "128")); + + String usingXFB = getConfig("gfx_opengl.ini", "Settings", "UseXFB", "False"); + String usingRealXFB = getConfig("gfx_opengl.ini", "Settings", "UseRealXFB", "False"); + + if (usingXFB.equals("False")) + { + editor.putString("externalFrameBuffer", "Disabled"); + } + else if (usingXFB.equals("True") && usingRealXFB.equals("False")) + { + editor.putString("externalFrameBuffer", "Virtual"); + } + else if (usingXFB.equals("True") && usingRealXFB.equals("True")) + { + editor.putString("externalFrameBuffer", "Real"); + } + + editor.putBoolean("cacheDisplayLists", getConfig("gfx_opengl.ini", "Hacks", "DlistCachingEnable", "False").equals("True")); + editor.putBoolean("disableDestinationAlpha", getConfig("gfx_opengl.ini", "Settings", "DstAlphaPass", "False").equals("True")); + editor.putBoolean("fastDepthCalculation", getConfig("gfx_opengl.ini", "Settings", "FastDepthCalc", "True").equals("True")); + + // Apply the changes. + editor.commit(); + } + + // Small utility method that shortens calls to NativeLibrary.GetConfig. + private static String getConfig(String ini, String section, String key, String defaultValue) + { + return NativeLibrary.GetConfig(ini, section, key, defaultValue); + } + + /** + * Writes the preferences set in the front-end to the Dolphin ini files. + * + * @param ctx The context used to retrieve the user settings. + * */ + public static void SavePrefsToIni(Context ctx) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); + + // Whether or not the user is using dual core. + boolean isUsingDualCore = prefs.getBoolean("dualCorePref", true); + + // Current CPU core being used. Falls back to interpreter upon error. + String currentEmuCore = prefs.getString("cpuCorePref", "0"); + + // Fastmem JIT core usage + boolean isUsingFastmem = prefs.getBoolean("fastmemPref", false); + + // Current video backend being used. Falls back to software rendering upon error. + String currentVideoBackend = prefs.getString("gpuPref", "Software Rendering"); + + // Whether or not FPS will be displayed on-screen. + boolean showingFPS = prefs.getBoolean("showFPS", false); + + // Whether or not to draw on-screen controls. + boolean drawingOnscreenControls = prefs.getBoolean("drawOnscreenControls", true); + + // Whether or not to ignore all EFB access requests from the CPU. + boolean skipEFBAccess = prefs.getBoolean("skipEFBAccess", false); + + // Whether or not to ignore changes to the EFB format. + boolean ignoreFormatChanges = prefs.getBoolean("ignoreFormatChanges", false); + + // EFB copy method to use. + String efbCopyMethod = prefs.getString("efbCopyMethod", "Off"); + + // Texture cache accuracy. Falls back to "Fast" up error. + String textureCacheAccuracy = prefs.getString("textureCacheAccuracy", "128"); + + // External frame buffer emulation. Falls back to disabled upon error. + String externalFrameBuffer = prefs.getString("externalFrameBuffer", "Disabled"); + + // Whether or not display list caching is enabled. + boolean dlistCachingEnabled = prefs.getBoolean("cacheDisplayLists", false); + + // Whether or not to disable destination alpha. + boolean disableDstAlphaPass = prefs.getBoolean("disableDestinationAlpha", false); + + // Whether or not to use fast depth calculation. + boolean useFastDepthCalc = prefs.getBoolean("fastDepthCalculation", true); + + // Internal resolution. Falls back to 1x Native upon error. + String internalResolution = prefs.getString("internalResolution", "2"); + + // FSAA Level. Falls back to 1x upon error. + String FSAALevel = prefs.getString("FSAA", "0"); + + // Anisotropic Filtering Level. Falls back to 1x upon error. + String anisotropicFiltLevel = prefs.getString("anisotropicFiltering", "0"); + + // Whether or not Scaled EFB copies are used. + boolean usingScaledEFBCopy = prefs.getBoolean("scaledEFBCopy", true); + + // Whether or not per-pixel lighting is used. + boolean usingPerPixelLighting = prefs.getBoolean("perPixelLighting", false); + + // Whether or not texture filtering is being forced. + boolean isForcingTextureFiltering = prefs.getBoolean("forceTextureFiltering", false); + + // Whether or not fog is disabled. + boolean fogIsDisabled = prefs.getBoolean("disableFog", false); + + + // CPU related Settings + NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUCore", currentEmuCore); + NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUThread", isUsingDualCore ? "True" : "False"); + NativeLibrary.SetConfig("Dolphin.ini", "Core", "Fastmem", isUsingFastmem ? "True" : "False"); + + // General Video Settings + NativeLibrary.SetConfig("Dolphin.ini", "Core", "GFXBackend", currentVideoBackend); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "ShowFPS", showingFPS ? "True" : "False"); + NativeLibrary.SetConfig("Dolphin.ini", "Android", "ScreenControls", drawingOnscreenControls ? "True" : "False"); + + // Video Hack Settings + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBAccessEnable", skipEFBAccess ? "False" : "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBEmulateFormatChanges", ignoreFormatChanges ? "True" : "False"); + + // Set EFB Copy Method + if (efbCopyMethod.equals("Off")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "False"); + } + else if (efbCopyMethod.equals("Texture")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "True"); + } + else if (efbCopyMethod.equals("RAM (uncached)")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyCacheEnable", "False"); + } + else if (efbCopyMethod.equals("RAM (cached)")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBCopyCacheEnable", "True"); + } + + // Set texture cache accuracy + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "SafeTextureCacheColorSamples", textureCacheAccuracy); + + // Set external frame buffer. + if (externalFrameBuffer.equals("Disabled")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "UseXFB", "False"); + } + else if (externalFrameBuffer.equals("Virtual")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "UseXFB", "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "UseRealXFB", "False"); + } + else if (externalFrameBuffer.equals("Real")) + { + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "UseXFB", "True"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "UseRealXFB", "True"); + } + + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "DlistCachingEnable", dlistCachingEnabled ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "DstAlphaPass", disableDstAlphaPass ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "FastDepthCalc", useFastDepthCalc ? "True" : "False"); + + //-- Enhancement Settings --// + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "EFBScale", internalResolution); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "MSAA", FSAALevel); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "MaxAnisotropy", anisotropicFiltLevel); + NativeLibrary.SetConfig("gfx_opengl.ini", "Hacks", "EFBScaledCopy", usingScaledEFBCopy ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "EnablePixelLighting", usingPerPixelLighting ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "ForceFiltering", isForcingTextureFiltering ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "DisableFog", fogIsDisabled ? "True" : "False"); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java new file mode 100644 index 0000000000..b88ea07afe --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java @@ -0,0 +1,282 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.os.Bundle; +import android.preference.ListPreference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; +import org.dolphinemu.dolphinemu.R; + +import javax.microedition.khronos.egl.*; +import javax.microedition.khronos.opengles.GL10; + +/** + * Responsible for handling the loading of the video preferences. + */ +public final class VideoSettingsFragment extends PreferenceFragment +{ + public static String m_GLVersion; + public static String m_GLVendor; + public static String m_GLRenderer; + public static String m_GLExtensions; + public static float m_QualcommVersion; + private Activity m_activity; + + /** + * Class which provides a means to retrieve various + * info about the OpenGL ES support/features within a device. + */ + public static final class VersionCheck + { + private EGL10 mEGL; + private EGLDisplay mEGLDisplay; + private EGLConfig[] mEGLConfigs; + private EGLConfig mEGLConfig; + private EGLContext mEGLContext; + private EGLSurface mEGLSurface; + private GL10 mGL; + + String mThreadOwner; + + public VersionCheck() + { + int[] version = new int[2]; + int[] attribList = new int[] { + EGL10.EGL_WIDTH, 1, + EGL10.EGL_HEIGHT, 1, + EGL10.EGL_RENDERABLE_TYPE, 4, + EGL10.EGL_NONE + }; + int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + int[] ctx_attribs = new int[] { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL10.EGL_NONE + }; + + // No error checking performed, minimum required code to elucidate logic + mEGL = (EGL10) EGLContext.getEGL(); + mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + mEGL.eglInitialize(mEGLDisplay, version); + mEGLConfig = chooseConfig(); // Choosing a config is a little more complicated + mEGLContext = mEGL.eglCreateContext(mEGLDisplay, mEGLConfig, EGL10.EGL_NO_CONTEXT, ctx_attribs); + mEGLSurface = mEGL.eglCreatePbufferSurface(mEGLDisplay, mEGLConfig, attribList); + mEGL.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext); + mGL = (GL10) mEGLContext.getGL(); + + // Record thread owner of OpenGL context + mThreadOwner = Thread.currentThread().getName(); + } + + /** + * Gets the OpenGL ES version string. + * + * @return the OpenGL ES version string. + */ + public String getVersion() + { + return mGL.glGetString(GL10.GL_VERSION); + } + + /** + * Gets the OpenGL ES vendor string. + * + * @return the OpenGL ES vendor string. + */ + public String getVendor() + { + return mGL.glGetString(GL10.GL_VENDOR); + } + + /** + * Gets the name of the OpenGL ES renderer. + * + * @return the name of the OpenGL ES renderer. + */ + public String getRenderer() + { + return mGL.glGetString(GL10.GL_RENDERER); + } + + /** + * Gets the extension that the device supports + * + * @return String containing the extensions + */ + public String getExtensions() + { + return mGL.glGetString(GL10.GL_EXTENSIONS); + } + + private EGLConfig chooseConfig() + { + int[] attribList = new int[] { + EGL10.EGL_DEPTH_SIZE, 0, + EGL10.EGL_STENCIL_SIZE, 0, + EGL10.EGL_RED_SIZE, 8, + EGL10.EGL_GREEN_SIZE, 8, + EGL10.EGL_BLUE_SIZE, 8, + EGL10.EGL_ALPHA_SIZE, 8, + EGL10.EGL_NONE + }; + + // No error checking performed, minimum required code to elucidate logic + // Expand on this logic to be more selective in choosing a configuration + int[] numConfig = new int[1]; + mEGL.eglChooseConfig(mEGLDisplay, attribList, null, 0, numConfig); + int configSize = numConfig[0]; + mEGLConfigs = new EGLConfig[configSize]; + mEGL.eglChooseConfig(mEGLDisplay, attribList, mEGLConfigs, configSize, numConfig); + + return mEGLConfigs[0]; // Best match is probably the first configuration + } + } + + /** + * Checks if this device supports OpenGL ES 3. + * + * @return true if this device supports OpenGL ES 3; false otherwise. + */ + public static boolean SupportsGLES3() + { + VersionCheck mbuffer = new VersionCheck(); + m_GLVersion = mbuffer.getVersion(); + m_GLVendor = mbuffer.getVendor(); + m_GLRenderer = mbuffer.getRenderer(); + m_GLExtensions = mbuffer.getExtensions(); + + boolean mSupportsGLES3 = false; + + // Check for OpenGL ES 3 support (General case). + if (m_GLVersion != null && m_GLVersion.contains("OpenGL ES 3.0")) + mSupportsGLES3 = true; + + // Checking for OpenGL ES 3 support for certain Qualcomm devices. + if (!mSupportsGLES3 && m_GLVendor != null && m_GLVendor.equals("Qualcomm")) + { + if (m_GLRenderer.contains("Adreno (TM) 3")) + { + int mVStart = m_GLVersion.indexOf("V@") + 2; + int mVEnd = 0; + + for (int a = mVStart; a < m_GLVersion.length(); ++a) + { + if (m_GLVersion.charAt(a) == ' ') + { + mVEnd = a; + break; + } + } + + m_QualcommVersion = Float.parseFloat(m_GLVersion.substring(mVStart, mVEnd)); + + if (m_QualcommVersion >= 14.0f) + mSupportsGLES3 = true; + } + } + if (!mSupportsGLES3 && + m_GLVendor != null && m_GLVendor.equals("NVIDIA Corporation") && + m_GLRenderer != null && m_GLRenderer.equals("NVIDIA Tegra") && + m_GLExtensions != null && m_GLExtensions.contains("GL_OES_depth24")) + { + // Is a Tegra 4 since it supports 24bit depth + mSupportsGLES3 = true; + } + return mSupportsGLES3; + } + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.video_prefs); + + // + // Setting valid video backends. + // + final ListPreference videoBackends = (ListPreference) findPreference("gpuPref"); + final boolean deviceSupportsGLES3 = SupportsGLES3(); + + if (deviceSupportsGLES3) + { + videoBackends.setEntries(R.array.videoBackendEntriesGLES3); + videoBackends.setEntryValues(R.array.videoBackendValuesGLES3); + } + else + { + videoBackends.setEntries(R.array.videoBackendEntriesNoGLES3); + videoBackends.setEntryValues(R.array.videoBackendValuesNoGLES3); + } + + // + // Disable all options if Software Rendering is used. + // + // Note that the numeric value in 'getPreference()' + // denotes the placement on the UI. So if more elements are + // added to the video settings, these may need to change. + // + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(m_activity); + final PreferenceScreen mainScreen = getPreferenceScreen(); + + if (videoBackends.getValue().equals("Software Renderer")) + { + mainScreen.getPreference(0).setEnabled(false); + mainScreen.getPreference(1).setEnabled(false); + mainScreen.getPreference(3).setEnabled(false); + //mainScreen.getPreference(4).setEnabled(true); + } + else if (videoBackends.getValue().equals("OGL")) + { + mainScreen.getPreference(0).setEnabled(true); + mainScreen.getPreference(1).setEnabled(true); + mainScreen.getPreference(3).setEnabled(true); + //mainScreen.getPreference(4).setEnabled(false); + } + + // Also set a listener, so that if someone changes the video backend, it will disable + // the video settings, upon the user choosing "Software Rendering". + sPrefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() + { + @Override + public void onSharedPreferenceChanged(SharedPreferences preference, String key) + { + if (key.equals("gpuPref")) + { + if (preference.getString(key, "Software Renderer").equals("Software Renderer")) + { + mainScreen.getPreference(0).setEnabled(false); + mainScreen.getPreference(1).setEnabled(false); + mainScreen.getPreference(3).setEnabled(false); + //mainScreen.getPreference(4).setEnabled(true); + } + else if (preference.getString(key, "Software Renderer").equals("OGL")) + { + mainScreen.getPreference(0).setEnabled(true); + mainScreen.getPreference(1).setEnabled(true); + mainScreen.getPreference(3).setEnabled(true); + //mainScreen.getPreference(4).setEnabled(false); + } + } + } + }); + } + + @Override + public void onAttach(Activity activity) + { + super.onAttach(activity); + + // Cache the activity instance. + m_activity = activity; + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java new file mode 100644 index 0000000000..7b6fa734ca --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/custom/UpdatingListPreference.java @@ -0,0 +1,33 @@ +package org.dolphinemu.dolphinemu.settings.custom; + +import android.content.Context; +import android.preference.ListPreference; +import android.util.AttributeSet; + +/** + * A {@link ListPreference} that updates its summary upon it's selection being changed. + */ +public final class UpdatingListPreference extends ListPreference +{ + /** + * Constructor + * + * @param context the current {@link Context}. + */ + public UpdatingListPreference(Context context, AttributeSet attribs) + { + super(context, attribs); + } + + @Override + public void onDialogClosed(boolean positiveResult) + { + super.onDialogClosed(positiveResult); + + // If an entry was selected + if (positiveResult) + { + setSummary(getEntry()); + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuAdapter.java new file mode 100644 index 0000000000..60fd8b56f3 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuAdapter.java @@ -0,0 +1,75 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.sidemenu; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.List; + +import org.dolphinemu.dolphinemu.R; + +/** + * Adapter that backs the sidebar menu. + *

+ * Responsible for handling the elements of each sidebar item. + */ +public final class SideMenuAdapter extends ArrayAdapter +{ + private final Context context; + private final int id; + private final Listitems; + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param resourceId The resource ID for a layout file containing a layout to use when instantiating views. + * @param objects The objects to represent in the {@link ListView}. + */ + public SideMenuAdapter(Context context, int resourceId, List objects) + { + super(context, resourceId, objects); + + this.context = context; + this.id = resourceId; + this.items = objects; + } + + @Override + public SideMenuItem getItem(int i) + { + return items.get(i); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + if (convertView == null) + { + LayoutInflater vi = LayoutInflater.from(context); + convertView = vi.inflate(id, null); + } + + final SideMenuItem item = items.get(position); + if (item != null) + { + TextView title = (TextView) convertView.findViewById(R.id.SideMenuTitle); + + if (title != null) + title.setText(item.getName()); + } + + return convertView; + } +} + diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java new file mode 100644 index 0000000000..402fad094c --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/sidemenu/SideMenuItem.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.sidemenu; + + +/** + * Represents an item that goes in the sidemenu of the app. + */ +public final class SideMenuItem +{ + private final String name; + private final int id; + + /** + * Constructor + * + * @param name The name of the SideMenuItem. + * @param id ID number of this specific SideMenuItem. + */ + public SideMenuItem(String name, int id) + { + this.name = name; + this.id = id; + } + + /** + * Gets the name of this SideMenuItem. + * + * @return the name of this SideMenuItem. + */ + public String getName() + { + return name; + } + + /** + * Gets the ID of this SideMenuItem. + * + * @return the ID of this SideMenuItem. + */ + public int getID() + { + return id; + } +} + diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 97f8642fe1..fcfc1be7b6 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -1,5 +1,52 @@ +set(CMAKE_FAKELANG_CREATE_STATIC_LIBRARY "touch ") +if(ENABLE_PCH) + # This is actually a .h file, but trick cmake into compiling it as a source file + set(pch_out_filename "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/pch.dir/pch.h") + if (ANDROID) + set(pch_lib_filename "${LIBRARY_OUTPUT_PATH}/libpch.a") + else() + set(pch_lib_filename "${CMAKE_CURRENT_BINARY_DIR}/libpch.a") + endif() + set(pch_src_filename "${CMAKE_CURRENT_SOURCE_DIR}/pch.h") + + if(APPLE) + set(type objective-c++-header) + else() + set(type c++-header) + endif() + + set_source_files_properties( + pch.h PROPERTIES + COMPILE_FLAGS "-x ${type}" + HEADER_FILE_ONLY 0 + LANGUAGE CXX) + + add_library(pch STATIC pch.h) + + add_custom_command( + TARGET pch + PRE_LINK + COMMAND ln -fs "${pch_out_filename}.o" "${pch_out_filename}.gch" + COMMAND ln -fs "${pch_out_filename}.o" "${pch_out_filename}.pch" + COMMAND cp "${pch_src_filename}" "${pch_out_filename}") + + set_target_properties( + pch PROPERTIES + LINKER_LANGUAGE FAKELANG) +endif(ENABLE_PCH) +macro(add_dolphin_library lib srcs libs) + add_library(${lib} STATIC ${srcs}) + target_link_libraries(${lib} ${libs}) + if(ENABLE_PCH) + add_dependencies(${lib} pch) + set_source_files_properties( + ${srcs} PROPERTIES + COMPILE_FLAGS "-include ${pch_out_filename}" + OBJECT_DEPENDS "${pch_lib_filename}") + endif(ENABLE_PCH) +endmacro(add_dolphin_library) + add_subdirectory(Core) -add_subdirectory(Plugins) if (DSPTOOL) add_subdirectory(DSPTool) @@ -9,4 +56,7 @@ if (UNITTESTS) add_subdirectory(UnitTests) endif() + + + # TODO: Add DSPSpy and TestSuite. Preferrably make them option()s and cpack components diff --git a/Source/Core/AudioCommon/AudioCommon.vcxproj b/Source/Core/AudioCommon/AudioCommon.vcxproj index abb5dbf505..6f6d8a5aa7 100644 --- a/Source/Core/AudioCommon/AudioCommon.vcxproj +++ b/Source/Core/AudioCommon/AudioCommon.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,210 +19,74 @@ - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05} - AudioCommon + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44} - + + StaticLibrary + v120 + Unicode + + true - StaticLibrary - Unicode - - true - StaticLibrary - Unicode - - + false - StaticLibrary - Unicode - - - StaticLibrary - false - Unicode - - - false - StaticLibrary - Unicode - - - StaticLibrary - false - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - - - SoundTouchD.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win32;..\..\..\Externals\SoundTouch\Win32;%(AdditionalLibraryDirectories) - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - - - SoundTouchD.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win64;..\..\..\Externals\SoundTouch\Win64;%(AdditionalLibraryDirectories) - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - - - SoundTouch.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win32;..\..\..\Externals\SoundTouch\Win32;%(AdditionalLibraryDirectories) - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - - - SoundTouch.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win32;..\..\..\Externals\SoundTouch\Win32;%(AdditionalLibraryDirectories) - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - - - SoundTouch.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win64;..\..\..\Externals\SoundTouch\Win64;%(AdditionalLibraryDirectories) - - - - - ..\Core\Src;..\Common\Src;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - - - SoundTouch.lib;OpenAL32.lib;dsound.lib;dxerr.lib - ..\..\..\Externals\OpenAL\Win64;..\..\..\Externals\SoundTouch\Win64;%(AdditionalLibraryDirectories) - - - + + Create + + + $(DXSDK_DIR)Include;%(AdditionalIncludeDirectories) + + + + + + + - + - - {68a5dd20-7057-448b-8fe0-b6ac8d205509} - true - true - false - true - false + + {ec082900-b4d8-42e9-9663-77f02f6936ae} - {c87a4178-44f6-49b2-b7aa-c79af1b8c534} - true - true - false - true - false + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} diff --git a/Source/Core/AudioCommon/AudioCommon.vcxproj.filters b/Source/Core/AudioCommon/AudioCommon.vcxproj.filters index 30ff35a073..5d0ae6c354 100644 --- a/Source/Core/AudioCommon/AudioCommon.vcxproj.filters +++ b/Source/Core/AudioCommon/AudioCommon.vcxproj.filters @@ -1,14 +1,20 @@  + + + {25ec8f16-fc60-4a63-bc3e-ad0272fd5942} + + + - + SoundStreams - + SoundStreams @@ -17,14 +23,15 @@ SoundStreams - + + SoundStreams - + @@ -43,14 +50,24 @@ SoundStreams - + + + SoundStreams + + + SoundStreams + + + SoundStreams + + + SoundStreams + + + SoundStreams + - - - - - {efb9f5b5-ab0c-455d-b78b-26df725386af} - + \ No newline at end of file diff --git a/Source/Core/AudioCommon/CMakeLists.txt b/Source/Core/AudioCommon/CMakeLists.txt index 939956460d..314be71322 100644 --- a/Source/Core/AudioCommon/CMakeLists.txt +++ b/Source/Core/AudioCommon/CMakeLists.txt @@ -40,5 +40,4 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(SRCS ${SRCS} Src/CoreAudioSoundStream.cpp) endif() -add_library(audiocommon STATIC ${SRCS}) -target_link_libraries(audiocommon ${LIBS}) +add_dolphin_library(audiocommon "${SRCS}" "${LIBS}") diff --git a/Source/Core/AudioCommon/Src/AOSoundStream.h b/Source/Core/AudioCommon/Src/AOSoundStream.h index 0b3cef9f0e..1eb762492c 100644 --- a/Source/Core/AudioCommon/Src/AOSoundStream.h +++ b/Source/Core/AudioCommon/Src/AOSoundStream.h @@ -6,13 +6,12 @@ #define _AOSOUNDSTREAM_H_ #include "SoundStream.h" +#include "Thread.h" #if defined(HAVE_AO) && HAVE_AO #include #endif -#include "Thread.h" - class AOSound : public SoundStream { #if defined(HAVE_AO) && HAVE_AO @@ -43,8 +42,8 @@ public: return true; } - virtual bool usesMixer() const { - return true; + virtual bool usesMixer() const { + return true; } virtual void Update(); diff --git a/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp b/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp index 2ccf4d22ae..4c84ae69e1 100644 --- a/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp @@ -57,7 +57,7 @@ void AlsaSound::SoundLoop() // Underrun snd_pcm_prepare(handle); } - else if (rc < 0) + else if (rc < 0) { ERROR_LOG(AUDIO, "writei fail: %s", snd_strerror(rc)); } @@ -77,7 +77,7 @@ bool AlsaSound::AlsaInit() unsigned int periods; err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Audio open error: %s\n", snd_strerror(err)); return false; @@ -86,21 +86,21 @@ bool AlsaSound::AlsaInit() snd_pcm_hw_params_alloca(&hwparams); err = snd_pcm_hw_params_any(handle, hwparams); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Broken configuration for this PCM: %s\n", snd_strerror(err)); return false; } - + err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Access type not available: %s\n", snd_strerror(err)); return false; } err = snd_pcm_hw_params_set_format(handle, hwparams, SND_PCM_FORMAT_S16_LE); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Sample format not available: %s\n", snd_strerror(err)); return false; @@ -108,14 +108,14 @@ bool AlsaSound::AlsaInit() dir = 0; err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &sample_rate, &dir); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Rate not available: %s\n", snd_strerror(err)); return false; } err = snd_pcm_hw_params_set_channels(handle, hwparams, 2); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Channels count not available: %s\n", snd_strerror(err)); return false; @@ -123,7 +123,7 @@ bool AlsaSound::AlsaInit() periods = BUFFER_SIZE_MAX / FRAME_COUNT_MIN; err = snd_pcm_hw_params_set_periods_max(handle, hwparams, &periods, &dir); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Cannot set Minimum periods: %s\n", snd_strerror(err)); return false; @@ -131,34 +131,34 @@ bool AlsaSound::AlsaInit() buffer_size_max = BUFFER_SIZE_MAX; err = snd_pcm_hw_params_set_buffer_size_max(handle, hwparams, &buffer_size_max); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Cannot set minimum buffer size: %s\n", snd_strerror(err)); return false; } err = snd_pcm_hw_params(handle, hwparams); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Unable to install hw params: %s\n", snd_strerror(err)); return false; } err = snd_pcm_hw_params_get_buffer_size(hwparams, &buffer_size); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Cannot get buffer size: %s\n", snd_strerror(err)); return false; } err = snd_pcm_hw_params_get_periods_max(hwparams, &periods, &dir); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Cannot get periods: %s\n", snd_strerror(err)); return false; } - //periods is the number of fragments alsa can wait for during one + //periods is the number of fragments alsa can wait for during one //buffer_size frames_to_deliver = buffer_size / periods; //limit the minimum size. pulseaudio advertises a minimum of 32 samples. @@ -172,28 +172,28 @@ bool AlsaSound::AlsaInit() snd_pcm_sw_params_alloca(&swparams); err = snd_pcm_sw_params_current(handle, swparams); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "cannot init sw params: %s\n", snd_strerror(err)); return false; } err = snd_pcm_sw_params_set_start_threshold(handle, swparams, 0U); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "cannot set start thresh: %s\n", snd_strerror(err)); return false; } err = snd_pcm_sw_params(handle, swparams); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "cannot set sw params: %s\n", snd_strerror(err)); return false; } err = snd_pcm_prepare(handle); - if (err < 0) + if (err < 0) { ERROR_LOG(AUDIO, "Unable to prepare: %s\n", snd_strerror(err)); return false; diff --git a/Source/Core/AudioCommon/Src/AlsaSoundStream.h b/Source/Core/AudioCommon/Src/AlsaSoundStream.h index 47c9e7ae82..56ab4176b9 100644 --- a/Source/Core/AudioCommon/Src/AlsaSoundStream.h +++ b/Source/Core/AudioCommon/Src/AlsaSoundStream.h @@ -28,8 +28,8 @@ public: static bool isValid() { return true; } - virtual bool usesMixer() const { - return true; + virtual bool usesMixer() const { + return true; } virtual void Update(); diff --git a/Source/Core/AudioCommon/Src/AudioCommon.cpp b/Source/Core/AudioCommon/Src/AudioCommon.cpp index 8b343aa493..c8c37ea891 100644 --- a/Source/Core/AudioCommon/Src/AudioCommon.cpp +++ b/Source/Core/AudioCommon/Src/AudioCommon.cpp @@ -7,6 +7,7 @@ #include "Mixer.h" #include "NullSoundStream.h" #include "DSoundStream.h" +#include "XAudio2_7Stream.h" #include "XAudio2Stream.h" #include "AOSoundStream.h" #include "AlsaSoundStream.h" @@ -18,34 +19,47 @@ #include "../../Core/Src/ConfigManager.h" // This shouldn't be a global, at least not here. -SoundStream *soundStream; +SoundStream *soundStream = nullptr; namespace AudioCommon -{ - SoundStream *InitSoundStream(CMixer *mixer, void *hWnd) +{ + SoundStream *InitSoundStream(CMixer *mixer, void *hWnd) { // TODO: possible memleak with mixer std::string backend = SConfig::GetInstance().sBackend; - if (backend == BACKEND_OPENAL && OpenALStream::isValid()) + if (backend == BACKEND_OPENAL && OpenALStream::isValid()) soundStream = new OpenALStream(mixer); - else if (backend == BACKEND_NULLSOUND && NullSound::isValid()) - soundStream = new NullSound(mixer, hWnd); - else if (backend == BACKEND_DIRECTSOUND && DSound::isValid()) + else if (backend == BACKEND_NULLSOUND && NullSound::isValid()) + soundStream = new NullSound(mixer); + else if (backend == BACKEND_DIRECTSOUND && DSound::isValid()) soundStream = new DSound(mixer, hWnd); - else if (backend == BACKEND_XAUDIO2 && XAudio2::isValid()) - soundStream = new XAudio2(mixer); - else if (backend == BACKEND_AOSOUND && AOSound::isValid()) + else if (backend == BACKEND_XAUDIO2) + { + if (XAudio2::isValid()) + soundStream = new XAudio2(mixer); + else if (XAudio2_7::isValid()) + soundStream = new XAudio2_7(mixer); + } + else if (backend == BACKEND_AOSOUND && AOSound::isValid()) soundStream = new AOSound(mixer); else if (backend == BACKEND_ALSA && AlsaSound::isValid()) soundStream = new AlsaSound(mixer); - else if (backend == BACKEND_COREAUDIO && CoreAudioSound::isValid()) + else if (backend == BACKEND_COREAUDIO && CoreAudioSound::isValid()) soundStream = new CoreAudioSound(mixer); else if (backend == BACKEND_PULSEAUDIO && PulseAudio::isValid()) soundStream = new PulseAudio(mixer); else if (backend == BACKEND_OPENSLES && OpenSLESStream::isValid()) soundStream = new OpenSLESStream(mixer); - if (soundStream != NULL) + + if (!soundStream && NullSound::isValid()) + { + WARN_LOG(DSPHLE, "Could not initialize backend %s, using %s instead.", + backend.c_str(), BACKEND_NULLSOUND); + soundStream = new NullSound(mixer); + } + + if (soundStream) { UpdateSoundStream(); if (soundStream->Start()) @@ -61,31 +75,32 @@ namespace AudioCommon } PanicAlertT("Could not initialize backend %s.", backend.c_str()); } + PanicAlertT("Sound backend %s is not valid.", backend.c_str()); delete soundStream; - soundStream = NULL; - return NULL; + soundStream = nullptr; + return nullptr; } - void ShutdownSoundStream() + void ShutdownSoundStream() { INFO_LOG(DSPHLE, "Shutting down sound stream"); - if (soundStream) + if (soundStream) { soundStream->Stop(); if (SConfig::GetInstance().m_DumpAudio) soundStream->GetMixer()->StopLogAudio(); //soundStream->StopLogAudio(); delete soundStream; - soundStream = NULL; + soundStream = nullptr; } - INFO_LOG(DSPHLE, "Done shutting down sound stream"); + INFO_LOG(DSPHLE, "Done shutting down sound stream"); } - std::vector GetSoundBackends() + std::vector GetSoundBackends() { std::vector backends; @@ -93,7 +108,7 @@ namespace AudioCommon backends.push_back(BACKEND_NULLSOUND); if (DSound::isValid()) backends.push_back(BACKEND_DIRECTSOUND); - if (XAudio2::isValid()) + if (XAudio2_7::isValid() || XAudio2::isValid()) backends.push_back(BACKEND_XAUDIO2); if (AOSound::isValid()) backends.push_back(BACKEND_AOSOUND); @@ -110,7 +125,7 @@ namespace AudioCommon return backends; } - bool UseJIT() + bool UseJIT() { if (!Movie::IsDSPHLE() && Movie::IsPlayingInput() && Movie::IsConfigSaved()) { diff --git a/Source/Core/AudioCommon/Src/AudioCommon.h b/Source/Core/AudioCommon/Src/AudioCommon.h index cd1896396e..9c49293a48 100644 --- a/Source/Core/AudioCommon/Src/AudioCommon.h +++ b/Source/Core/AudioCommon/Src/AudioCommon.h @@ -38,7 +38,7 @@ union UDSPControl UDSPControl(u16 _Hex = 0) : Hex(_Hex) {} }; -namespace AudioCommon +namespace AudioCommon { SoundStream *InitSoundStream(CMixer *mixer, void *hWnd); void ShutdownSoundStream(); diff --git a/Source/Core/AudioCommon/Src/DPL2Decoder.cpp b/Source/Core/AudioCommon/Src/DPL2Decoder.cpp index 5b41c605ce..97bdb5413d 100644 --- a/Source/Core/AudioCommon/Src/DPL2Decoder.cpp +++ b/Source/Core/AudioCommon/Src/DPL2Decoder.cpp @@ -14,8 +14,12 @@ #include #include "DPL2Decoder.h" +#ifndef M_PI #define M_PI 3.14159265358979323846 +#endif +#ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440 +#endif int olddelay = -1; unsigned int oldfreq = 0; diff --git a/Source/Core/AudioCommon/Src/DSoundStream.cpp b/Source/Core/AudioCommon/Src/DSoundStream.cpp index 41a1dd9951..c5d2e3afb8 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/DSoundStream.cpp @@ -6,7 +6,6 @@ #include #include -#include #include "AudioCommon.h" #include "DSoundStream.h" @@ -43,7 +42,7 @@ bool DSound::CreateBuffer() else { // Failed. - PanicAlertT("Sound buffer creation failed: %s", DXGetErrorString(res)); + PanicAlertT("Sound buffer creation failed: %08x", res); dsBuffer = NULL; return false; } diff --git a/Source/Core/AudioCommon/Src/DSoundStream.h b/Source/Core/AudioCommon/Src/DSoundStream.h index 6145ea62e9..a872e79181 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.h +++ b/Source/Core/AudioCommon/Src/DSoundStream.h @@ -9,6 +9,7 @@ #include "Thread.h" #ifdef _WIN32 +#include #include #include @@ -47,7 +48,7 @@ class DSound : public SoundStream bool WriteDataToBuffer(DWORD dwOffset, char* soundData, DWORD dwSoundBytes); public: - DSound(CMixer *mixer, void *_hWnd = NULL) + DSound(CMixer *mixer, void *_hWnd) : SoundStream(mixer) , bufferSize(0) , currentPos(0) @@ -58,7 +59,7 @@ public: {} virtual ~DSound() {} - + virtual bool Start(); virtual void SoundLoop(); virtual void SetVolume(int volume); @@ -70,7 +71,7 @@ public: #else public: - DSound(CMixer *mixer, void *hWnd = NULL) + DSound(CMixer *mixer, void *_hWnd) : SoundStream(mixer) {} #endif diff --git a/Source/Core/AudioCommon/Src/Mixer.cpp b/Source/Core/AudioCommon/Src/Mixer.cpp index 2c526cf3bd..61b4604dc1 100644 --- a/Source/Core/AudioCommon/Src/Mixer.cpp +++ b/Source/Core/AudioCommon/Src/Mixer.cpp @@ -52,7 +52,7 @@ unsigned int CMixer::Mix(short* samples, unsigned int numSamples) // interpolation loop. u32 indexR = Common::AtomicLoad(m_indexR); u32 indexW = Common::AtomicLoad(m_indexW); - + if (m_AIplaying) { numLeft = (numLeft > numSamples) ? numSamples : numLeft; @@ -125,8 +125,8 @@ unsigned int CMixer::Mix(short* samples, unsigned int numSamples) *(u32*)(samples+i) = *(u32*)(s); // memset(&samples[numLeft * 2], 0, (numSamples - numLeft) * 4); } - - // Flush cached variable + + // Flush cached variable Common::AtomicStore(m_indexR, indexR); //when logging, also throttle HLE audio @@ -158,13 +158,13 @@ void CMixer::PushSamples(const short *samples, unsigned int num_samples) // indexR isn't allowed to cache in the audio throttling loop as it // needs to get updates to not deadlock. u32 indexW = Common::AtomicLoad(m_indexW); - + if (m_throttle) { // The auto throttle function. This loop will put a ceiling on the CPU MHz. while (num_samples * 2 + ((indexW - Common::AtomicLoad(m_indexR)) & INDEX_MASK) >= MAX_SAMPLES * 2) { - if (*PowerPC::GetStatePtr() != PowerPC::CPU_RUNNING || soundStream->IsMuted()) + if (*PowerPC::GetStatePtr() != PowerPC::CPU_RUNNING || soundStream->IsMuted()) break; // Shortcut key for Throttle Skipping if (Host_GetKeyState('\t')) @@ -192,9 +192,9 @@ void CMixer::PushSamples(const short *samples, unsigned int num_samples) { memcpy(&m_buffer[indexW & INDEX_MASK], samples, num_samples * 4); } - + Common::AtomicAdd(m_indexW, num_samples * 2); - + return; } @@ -206,11 +206,11 @@ unsigned int CMixer::GetNumSamples() // We also can't say the current interpolation state (specially // the frac), so to be sure, subtract one again to be sure not // to underflow the fifo. - + u32 numSamples = ((Common::AtomicLoad(m_indexW) - Common::AtomicLoad(m_indexR)) & INDEX_MASK) / 2; if (AudioInterface::GetAIDSampleRate() == m_sampleRate) - numSamples = numSamples; // 1:1 + ; //numSamples = numSamples; // 1:1 else if (m_sampleRate == 48000 && AudioInterface::GetAIDSampleRate() == 32000) numSamples = numSamples * 3 / 2 - 2; // most common case else diff --git a/Source/Core/AudioCommon/Src/Mixer.h b/Source/Core/AudioCommon/Src/Mixer.h index 6d797d5c3e..144d22a183 100644 --- a/Source/Core/AudioCommon/Src/Mixer.h +++ b/Source/Core/AudioCommon/Src/Mixer.h @@ -14,7 +14,7 @@ #define RESERVED_SAMPLES (256) class CMixer { - + public: CMixer(unsigned int AISampleRate = 48000, unsigned int DACSampleRate = 48000, unsigned int BackendSampleRate = 32000) : m_aiSampleRate(AISampleRate) @@ -89,7 +89,7 @@ protected: int m_channels; WaveFileWriter g_wave_writer; - + bool m_HLEready; bool m_logAudio; diff --git a/Source/Core/AudioCommon/Src/NullSoundStream.cpp b/Source/Core/AudioCommon/Src/NullSoundStream.cpp index 95a9da4349..fa69012b32 100644 --- a/Source/Core/AudioCommon/Src/NullSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/NullSoundStream.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "AudioCommon.h" #include "NullSoundStream.h" #include "../../Core/Src/HW/SystemTimers.h" #include "../../Core/Src/HW/AudioInterface.h" diff --git a/Source/Core/AudioCommon/Src/NullSoundStream.h b/Source/Core/AudioCommon/Src/NullSoundStream.h index a20c1e0d12..aade06b9ac 100644 --- a/Source/Core/AudioCommon/Src/NullSoundStream.h +++ b/Source/Core/AudioCommon/Src/NullSoundStream.h @@ -5,8 +5,8 @@ #ifndef _NULLSOUNDSTREAM_H_ #define _NULLSOUNDSTREAM_H_ +#include #include "SoundStream.h" -#include "Thread.h" #define BUF_SIZE (48000 * 4 / 32) @@ -16,7 +16,7 @@ class NullSound : public SoundStream short realtimeBuffer[BUF_SIZE / sizeof(short)]; public: - NullSound(CMixer *mixer, void *hWnd = NULL) + NullSound(CMixer *mixer) : SoundStream(mixer) {} diff --git a/Source/Core/AudioCommon/Src/OpenALStream.h b/Source/Core/AudioCommon/Src/OpenALStream.h index 24217169bd..bccf3bd824 100644 --- a/Source/Core/AudioCommon/Src/OpenALStream.h +++ b/Source/Core/AudioCommon/Src/OpenALStream.h @@ -5,7 +5,6 @@ #ifndef _OPENALSTREAM_H_ #define _OPENALSTREAM_H_ -#include "Common.h" #include "SoundStream.h" #include "Thread.h" @@ -49,9 +48,9 @@ public: OpenALStream(CMixer *mixer, void *hWnd = NULL) : SoundStream(mixer) , uiSource(0) - {}; + {} - virtual ~OpenALStream() {}; + virtual ~OpenALStream() {} virtual bool Start(); virtual void SoundLoop(); @@ -75,7 +74,9 @@ private: u8 numBuffers; #else public: - OpenALStream(CMixer *mixer, void *hWnd = NULL): SoundStream(mixer) {} + OpenALStream(CMixer *mixer) + : SoundStream(mixer) + {} #endif // HAVE_OPENAL }; diff --git a/Source/Core/AudioCommon/Src/OpenSLESStream.cpp b/Source/Core/AudioCommon/Src/OpenSLESStream.cpp index 26391d5d72..67e77a4d86 100644 --- a/Source/Core/AudioCommon/Src/OpenSLESStream.cpp +++ b/Source/Core/AudioCommon/Src/OpenSLESStream.cpp @@ -21,7 +21,7 @@ static SLPlayItf bqPlayerPlay; static SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue; static SLMuteSoloItf bqPlayerMuteSolo; static SLVolumeItf bqPlayerVolume; -static CMixer *g_mixer; +static CMixer *g_mixer; #define BUFFER_SIZE 512 #define BUFFER_SIZE_IN_SAMPLES (BUFFER_SIZE / 2) diff --git a/Source/Core/AudioCommon/Src/PulseAudioStream.h b/Source/Core/AudioCommon/Src/PulseAudioStream.h index 62b7e86f82..8be8eae11d 100644 --- a/Source/Core/AudioCommon/Src/PulseAudioStream.h +++ b/Source/Core/AudioCommon/Src/PulseAudioStream.h @@ -24,7 +24,7 @@ public: PulseAudio(CMixer *mixer); virtual bool Start(); - virtual void Stop(); + virtual void Stop(); static bool isValid() {return true;} diff --git a/Source/Core/AudioCommon/Src/SoundStream.h b/Source/Core/AudioCommon/Src/SoundStream.h index 855a0cc4f0..b7b0b20a58 100644 --- a/Source/Core/AudioCommon/Src/SoundStream.h +++ b/Source/Core/AudioCommon/Src/SoundStream.h @@ -21,11 +21,11 @@ protected: WaveFileWriter g_wave_writer; bool m_muted; -public: - SoundStream(CMixer *mixer) : m_mixer(mixer), threadData(0), m_logAudio(false), m_muted(false) {} - virtual ~SoundStream() { delete m_mixer;} +public: + SoundStream(CMixer *mixer) : m_mixer(mixer), threadData(0), m_logAudio(false), m_muted(false) {} + virtual ~SoundStream() { delete m_mixer; } - static bool isValid() { return false; } + static bool isValid() { return false; } virtual CMixer *GetMixer() const { return m_mixer; } virtual bool Start() { return false; } virtual void SetVolume(int) {} diff --git a/Source/Core/AudioCommon/Src/WaveFile.cpp b/Source/Core/AudioCommon/Src/WaveFile.cpp index 7eabbb3b48..6443d1c112 100644 --- a/Source/Core/AudioCommon/Src/WaveFile.cpp +++ b/Source/Core/AudioCommon/Src/WaveFile.cpp @@ -121,7 +121,7 @@ void WaveFileWriter::AddStereoSamplesBE(const short *sample_data, u32 count) if (count > BUF_SIZE * 2) PanicAlert("WaveFileWriter - buffer too small (count = %u).", count); - if (skip_silence) + if (skip_silence) { bool all_zero = true; diff --git a/Source/Core/AudioCommon/Src/XAudio2Stream.cpp b/Source/Core/AudioCommon/Src/XAudio2Stream.cpp index 59a826365c..8c8a2253d0 100644 --- a/Source/Core/AudioCommon/Src/XAudio2Stream.cpp +++ b/Source/Core/AudioCommon/Src/XAudio2Stream.cpp @@ -2,9 +2,42 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include #include "AudioCommon.h" #include "XAudio2Stream.h" +#ifndef XAUDIO2_DLL +#error You are building this module against the wrong version of DirectX. You probably need to remove DXSDK_DIR from your include path. +#endif + +struct StreamingVoiceContext : public IXAudio2VoiceCallback +{ +private: + CMixer* const m_mixer; + Common::Event& m_sound_sync_event; + IXAudio2SourceVoice* m_source_voice; + std::unique_ptr xaudio_buffer; + + void SubmitBuffer(PBYTE buf_data); + +public: + StreamingVoiceContext(IXAudio2 *pXAudio2, CMixer *pMixer, Common::Event& pSyncEvent); + + ~StreamingVoiceContext(); + + void StreamingVoiceContext::Stop(); + void StreamingVoiceContext::Play(); + + STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) {} + STDMETHOD_(void, OnVoiceProcessingPassStart) (UINT32) {} + STDMETHOD_(void, OnVoiceProcessingPassEnd) () {} + STDMETHOD_(void, OnBufferStart) (void*) {} + STDMETHOD_(void, OnLoopEnd) (void*) {} + STDMETHOD_(void, OnStreamEnd) () {} + + STDMETHOD_(void, OnBufferEnd) (void* context); +}; + const int NUM_BUFFERS = 3; const int SAMPLES_PER_BUFFER = 96; @@ -90,13 +123,59 @@ void StreamingVoiceContext::OnBufferEnd(void* context) SubmitBuffer(static_cast(context)); } +HMODULE XAudio2::m_xaudio2_dll = nullptr; +typedef decltype(&XAudio2Create) XAudio2Create_t; +void *XAudio2::PXAudio2Create = nullptr; + +bool XAudio2::InitLibrary() +{ + if (m_xaudio2_dll) + { + return true; + } + + m_xaudio2_dll = ::LoadLibrary(XAUDIO2_DLL); + if (!m_xaudio2_dll) + { + return false; + } + + if (!PXAudio2Create) + { + PXAudio2Create = (XAudio2Create_t)::GetProcAddress(m_xaudio2_dll, "XAudio2Create"); + if (!PXAudio2Create) + { + ::FreeLibrary(m_xaudio2_dll); + m_xaudio2_dll = nullptr; + return false; + } + } + + return true; +} + +XAudio2::XAudio2(CMixer *mixer) + : SoundStream(mixer) + , m_mastering_voice(nullptr) + , m_volume(1.0f) + , m_cleanup_com(SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) +{ +} + +XAudio2::~XAudio2() +{ + Stop(); + if (m_cleanup_com) + CoUninitialize(); +} + bool XAudio2::Start() { HRESULT hr; // callback doesn't seem to run on a specific cpu anyways IXAudio2* xaudptr; - if (FAILED(hr = XAudio2Create(&xaudptr, 0, XAUDIO2_DEFAULT_PROCESSOR))) + if (FAILED(hr = ((XAudio2Create_t)PXAudio2Create)(&xaudptr, 0, XAUDIO2_DEFAULT_PROCESSOR))) { PanicAlertT("XAudio2 init failed: %#X", hr); Stop(); @@ -172,4 +251,11 @@ void XAudio2::Stop() } m_xaudio2.reset(); // release interface + + if (m_xaudio2_dll) + { + ::FreeLibrary(m_xaudio2_dll); + m_xaudio2_dll = nullptr; + PXAudio2Create = nullptr; + } } diff --git a/Source/Core/AudioCommon/Src/XAudio2Stream.h b/Source/Core/AudioCommon/Src/XAudio2Stream.h index 4310a46435..d85aafc4f7 100644 --- a/Source/Core/AudioCommon/Src/XAudio2Stream.h +++ b/Source/Core/AudioCommon/Src/XAudio2Stream.h @@ -2,43 +2,21 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#ifndef _XAUDIO2STREAM_H_ -#define _XAUDIO2STREAM_H_ +// This audio backend uses XAudio2 via XAUDIO2_DLL +// It works on Windows 8+, where it is included as an OS component. +// This backend is always compiled, but only available if running on Win8+ +#pragma once + +#include +#include "Thread.h" #include "SoundStream.h" #ifdef _WIN32 -#include "Thread.h" -#include -#include -struct StreamingVoiceContext : public IXAudio2VoiceCallback -{ -private: - CMixer* const m_mixer; - Common::Event& m_sound_sync_event; - IXAudio2SourceVoice* m_source_voice; - std::unique_ptr xaudio_buffer; - - void SubmitBuffer(PBYTE buf_data); - -public: - StreamingVoiceContext(IXAudio2 *pXAudio2, CMixer *pMixer, Common::Event& pSyncEvent); - - ~StreamingVoiceContext(); - - void StreamingVoiceContext::Stop(); - void StreamingVoiceContext::Play(); - - STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) {} - STDMETHOD_(void, OnVoiceProcessingPassStart) (UINT32) {} - STDMETHOD_(void, OnVoiceProcessingPassEnd) () {} - STDMETHOD_(void, OnBufferStart) (void*) {} - STDMETHOD_(void, OnLoopEnd) (void*) {} - STDMETHOD_(void, OnStreamEnd) () {} - - STDMETHOD_(void, OnBufferEnd) (void* context); -}; +struct StreamingVoiceContext; +struct IXAudio2; +struct IXAudio2MasteringVoice; #endif @@ -46,6 +24,7 @@ class XAudio2 : public SoundStream { #ifdef _WIN32 +private: class Releaser { public: @@ -56,7 +35,6 @@ class XAudio2 : public SoundStream } }; -private: std::unique_ptr m_xaudio2; std::unique_ptr m_voice_context; IXAudio2MasteringVoice *m_mastering_voice; @@ -66,21 +44,15 @@ private: const bool m_cleanup_com; -public: - XAudio2(CMixer *mixer) - : SoundStream(mixer) - , m_mastering_voice(nullptr) - , m_volume(1.0f) - , m_cleanup_com(SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) - {} + static HMODULE m_xaudio2_dll; + static void *PXAudio2Create; + + static bool InitLibrary(); + +public: + XAudio2(CMixer *mixer); + virtual ~XAudio2(); - virtual ~XAudio2() - { - Stop(); - if (m_cleanup_com) - CoUninitialize(); - } - virtual bool Start(); virtual void Stop(); @@ -89,15 +61,14 @@ public: virtual void SetVolume(int volume); virtual bool usesMixer() const { return true; } - static bool isValid() { return true; } + static bool isValid() { return InitLibrary(); } #else public: - XAudio2(CMixer *mixer, void *hWnd = NULL) + XAudio2(CMixer *mixer) : SoundStream(mixer) {} + #endif }; - -#endif //_XAUDIO2STREAM_H_ diff --git a/Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp b/Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp new file mode 100644 index 0000000000..782a29a301 --- /dev/null +++ b/Source/Core/AudioCommon/Src/XAudio2_7Stream.cpp @@ -0,0 +1,289 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// Note that this file *and this file only* must also have %DXSDK_DIR%/Include prepended +// to its include path in order fetch dxsdkver.h and XAudio2.h from the DXSDK +// instead of other possible places. This may be accomplished by adding the path to +// the AdditionalIncludeDirectories for this file via msbuild. + +#include "AudioCommon.h" +#include "XAudio2_7Stream.h" + +#ifdef HAVE_DXSDK +#include +#if (_DXSDK_PRODUCT_MAJOR == 9) && (_DXSDK_PRODUCT_MINOR == 29) && (_DXSDK_BUILD_MAJOR == 1962) && (_DXSDK_BUILD_MINOR == 0) +#define HAVE_DXSDK_JUNE_2010 +#else +#pragma message("You have DirectX SDK installed, but it is not the expected version (June 2010). Update it to build this module.") +#endif +#endif + +#ifdef HAVE_DXSDK_JUNE_2010 + +#include + +struct StreamingVoiceContext2_7 : public IXAudio2VoiceCallback +{ +private: + CMixer* const m_mixer; + Common::Event& m_sound_sync_event; + IXAudio2SourceVoice* m_source_voice; + std::unique_ptr xaudio_buffer; + + void SubmitBuffer(PBYTE buf_data); + +public: + StreamingVoiceContext2_7(IXAudio2 *pXAudio2, CMixer *pMixer, Common::Event& pSyncEvent); + + ~StreamingVoiceContext2_7(); + + void StreamingVoiceContext2_7::Stop(); + void StreamingVoiceContext2_7::Play(); + + STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) {} + STDMETHOD_(void, OnVoiceProcessingPassStart) (UINT32) {} + STDMETHOD_(void, OnVoiceProcessingPassEnd) () {} + STDMETHOD_(void, OnBufferStart) (void*) {} + STDMETHOD_(void, OnLoopEnd) (void*) {} + STDMETHOD_(void, OnStreamEnd) () {} + + STDMETHOD_(void, OnBufferEnd) (void* context); +}; + +const int NUM_BUFFERS = 3; +const int SAMPLES_PER_BUFFER = 96; + +const int NUM_CHANNELS = 2; +const int BUFFER_SIZE = SAMPLES_PER_BUFFER * NUM_CHANNELS; +const int BUFFER_SIZE_BYTES = BUFFER_SIZE * sizeof(s16); + +void StreamingVoiceContext2_7::SubmitBuffer(PBYTE buf_data) +{ + XAUDIO2_BUFFER buf = {}; + buf.AudioBytes = BUFFER_SIZE_BYTES; + buf.pContext = buf_data; + buf.pAudioData = buf_data; + + m_source_voice->SubmitSourceBuffer(&buf); +} + +StreamingVoiceContext2_7::StreamingVoiceContext2_7(IXAudio2 *pXAudio2, CMixer *pMixer, Common::Event& pSyncEvent) + : m_mixer(pMixer) + , m_sound_sync_event(pSyncEvent) + , xaudio_buffer(new BYTE[NUM_BUFFERS * BUFFER_SIZE_BYTES]()) +{ + WAVEFORMATEXTENSIBLE wfx = {}; + + wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfx.Format.nSamplesPerSec = m_mixer->GetSampleRate(); + wfx.Format.nChannels = 2; + wfx.Format.wBitsPerSample = 16; + wfx.Format.nBlockAlign = wfx.Format.nChannels*wfx.Format.wBitsPerSample / 8; + wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; + wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + wfx.Samples.wValidBitsPerSample = 16; + wfx.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + + // create source voice + HRESULT hr; + if (FAILED(hr = pXAudio2->CreateSourceVoice(&m_source_voice, &wfx.Format, XAUDIO2_VOICE_NOSRC, 1.0f, this))) + { + PanicAlertT("XAudio2_7 CreateSourceVoice failed: %#X", hr); + return; + } + + m_source_voice->Start(); + + // start buffers with silence + for (int i = 0; i != NUM_BUFFERS; ++i) + SubmitBuffer(xaudio_buffer.get() + (i * BUFFER_SIZE_BYTES)); +} + +StreamingVoiceContext2_7::~StreamingVoiceContext2_7() +{ + if (m_source_voice) + { + m_source_voice->Stop(); + m_source_voice->DestroyVoice(); + } +} + +void StreamingVoiceContext2_7::Stop() +{ + if (m_source_voice) + m_source_voice->Stop(); +} + +void StreamingVoiceContext2_7::Play() +{ + if (m_source_voice) + m_source_voice->Start(); +} + +void StreamingVoiceContext2_7::OnBufferEnd(void* context) +{ + // buffer end callback; gets SAMPLES_PER_BUFFER samples for a new buffer + + if (!m_source_voice || !context) + return; + + //m_sound_sync_event->Wait(); // sync + //m_sound_sync_event->Spin(); // or tight sync + + m_mixer->Mix(static_cast(context), SAMPLES_PER_BUFFER); + SubmitBuffer(static_cast(context)); +} + +HMODULE XAudio2_7::m_xaudio2_dll = nullptr; + +void XAudio2_7::ReleaseIXAudio2(IXAudio2* ptr) +{ + ptr->Release(); +} + +bool XAudio2_7::InitLibrary() +{ + if (m_xaudio2_dll) + { + return true; + } + + m_xaudio2_dll = ::LoadLibrary(TEXT("xaudio2_7.dll")); + + return m_xaudio2_dll != nullptr; +} + +XAudio2_7::XAudio2_7(CMixer *mixer) + : SoundStream(mixer) + , m_mastering_voice(nullptr) + , m_volume(1.0f) + , m_cleanup_com(SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) +{ +} + +XAudio2_7::~XAudio2_7() +{ + Stop(); + if (m_cleanup_com) + CoUninitialize(); +} + +bool XAudio2_7::Start() +{ + HRESULT hr; + + // callback doesn't seem to run on a specific cpu anyways + IXAudio2* xaudptr; + if (FAILED(hr = XAudio2Create(&xaudptr, 0, XAUDIO2_DEFAULT_PROCESSOR))) + { + PanicAlertT("XAudio2_7 init failed: %#X", hr); + Stop(); + return false; + } + m_xaudio2 = std::unique_ptr(xaudptr); + + // XAudio2 master voice + // XAUDIO2_DEFAULT_CHANNELS instead of 2 for expansion? + if (FAILED(hr = m_xaudio2->CreateMasteringVoice(&m_mastering_voice, 2, m_mixer->GetSampleRate()))) + { + PanicAlertT("XAudio2_7 master voice creation failed: %#X", hr); + Stop(); + return false; + } + + // Volume + m_mastering_voice->SetVolume(m_volume); + + m_voice_context = std::unique_ptr + (new StreamingVoiceContext2_7(m_xaudio2.get(), m_mixer, m_sound_sync_event)); + + return true; +} + +void XAudio2_7::SetVolume(int volume) +{ + //linear 1- .01 + m_volume = (float)volume / 100.f; + + if (m_mastering_voice) + m_mastering_voice->SetVolume(m_volume); +} + +void XAudio2_7::Update() +{ + //m_sound_sync_event.Set(); + + //static int xi = 0; + //if (100000 == ++xi) + //{ + // xi = 0; + // XAUDIO2_PERFORMANCE_DATA perfData; + // pXAudio2->GetPerformanceData(&perfData); + // NOTICE_LOG(DSPHLE, "XAudio2_7 latency (samples): %i", perfData.CurrentLatencyInSamples); + // NOTICE_LOG(DSPHLE, "XAudio2_7 total glitches: %i", perfData.GlitchesSinceEngineStarted); + //} +} + +void XAudio2_7::Clear(bool mute) +{ + m_muted = mute; + + if (m_voice_context) + { + if (m_muted) + m_voice_context->Stop(); + else + m_voice_context->Play(); + } +} + +void XAudio2_7::Stop() +{ + //m_sound_sync_event.Set(); + + m_voice_context.reset(); + + if (m_mastering_voice) + { + m_mastering_voice->DestroyVoice(); + m_mastering_voice = nullptr; + } + + m_xaudio2.reset(); // release interface + + if (m_xaudio2_dll) + { + ::FreeLibrary(m_xaudio2_dll); + m_xaudio2_dll = nullptr; + } +} + +bool XAudio2_7::usesMixer() const { return true; } + +#else + +struct StreamingVoiceContext2_7 {}; +struct IXAudio2 {}; +struct IXAudio2MasteringVoice {}; +void XAudio2_7::ReleaseIXAudio2(IXAudio2* ptr) {} + +XAudio2_7::XAudio2_7(CMixer *mixer) + : SoundStream(mixer) + , m_mastering_voice(nullptr) + , m_volume(1.0f) + , m_cleanup_com(false) +{} + +XAudio2_7::~XAudio2_7() {} + +bool XAudio2_7::Start() { return SoundStream::Start(); } +void XAudio2_7::Stop() {} +void XAudio2_7::Update() {} +void XAudio2_7::Clear(bool mute) {} +void XAudio2_7::SetVolume(int volume) {} +bool XAudio2_7::usesMixer() const { return false; } +bool XAudio2_7::InitLibrary() { return false; } + +#endif diff --git a/Source/Core/AudioCommon/Src/XAudio2_7Stream.h b/Source/Core/AudioCommon/Src/XAudio2_7Stream.h new file mode 100644 index 0000000000..bbea6dd2db --- /dev/null +++ b/Source/Core/AudioCommon/Src/XAudio2_7Stream.h @@ -0,0 +1,81 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// This audio backend uses XAudio2 via XAudio2_7.dll +// This version of the library is included in the June 2010 DirectX SDK and +// works on all versions of Windows, however the SDK and/or redist must be +// seperately installed. +// Therefore this backend is available iff: +// * SDK is available at compile-time +// * runtime dll is available at runtime + +#pragma once + +#include +#include "Thread.h" +#include "SoundStream.h" + +#ifdef _WIN32 + +#include + +struct StreamingVoiceContext2_7; +struct IXAudio2; +struct IXAudio2MasteringVoice; + +#endif + +class XAudio2_7 : public SoundStream +{ +#ifdef _WIN32 + +private: + static void ReleaseIXAudio2(IXAudio2 *ptr); + + class Releaser + { + public: + template + void operator()(R *ptr) + { + ReleaseIXAudio2(ptr); + } + }; + + std::unique_ptr m_xaudio2; + std::unique_ptr m_voice_context; + IXAudio2MasteringVoice *m_mastering_voice; + + Common::Event m_sound_sync_event; + float m_volume; + + const bool m_cleanup_com; + + static HMODULE m_xaudio2_dll; + + static bool InitLibrary(); + +public: + XAudio2_7(CMixer *mixer); + virtual ~XAudio2_7(); + + virtual bool Start(); + virtual void Stop(); + + virtual void Update(); + virtual void Clear(bool mute); + virtual void SetVolume(int volume); + virtual bool usesMixer() const; + + static bool isValid() { return InitLibrary(); } + +#else + +public: + XAudio2_7(CMixer *mixer) + : SoundStream(mixer) + {} + +#endif +}; diff --git a/Source/Core/AudioCommon/Src/aldlist.cpp b/Source/Core/AudioCommon/Src/aldlist.cpp index fa11fe3282..577ed733fe 100644 --- a/Source/Core/AudioCommon/Src/aldlist.cpp +++ b/Source/Core/AudioCommon/Src/aldlist.cpp @@ -1,17 +1,17 @@ /* * Copyright (c) 2006, Creative Labs Inc. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are permitted provided * that the following conditions are met: - * + * * * Redistributions of source code must retain the above copyright notice, this list of conditions and * the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions * and the following disclaimer in the documentation and/or other materials provided with the distribution. * * Neither the name of Creative Labs Inc. nor the names of its contributors may be used to endorse or * promote products derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR @@ -36,7 +36,7 @@ #endif -/* +/* * Init call */ ALDeviceList::ALDeviceList() @@ -61,30 +61,30 @@ ALDeviceList::ALDeviceList() defaultDeviceName = (char *)alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); index = 0; // go through device list (each device terminated with a single NULL, list terminated with double NULL) - while (devices != NULL && strlen(devices) > 0) + while (devices != NULL && strlen(devices) > 0) { - if (strcmp(defaultDeviceName, devices) == 0) + if (strcmp(defaultDeviceName, devices) == 0) { defaultDeviceIndex = index; } ALCdevice *device = alcOpenDevice(devices); - if (device) + if (device) { ALCcontext *context = alcCreateContext(device, NULL); - if (context) + if (context) { alcMakeContextCurrent(context); // if new actual device name isn't already in the list, then add it... actualDeviceName = alcGetString(device, ALC_DEVICE_SPECIFIER); bool bNewName = true; - for (s32 i = 0; i < GetNumDevices(); i++) + for (s32 i = 0; i < GetNumDevices(); i++) { - if (strcmp(GetDeviceName(i), actualDeviceName) == 0) + if (strcmp(GetDeviceName(i), actualDeviceName) == 0) { bNewName = false; } } - if ((bNewName) && (actualDeviceName != NULL) && (strlen(actualDeviceName) > 0)) + if ((bNewName) && (actualDeviceName != NULL) && (strlen(actualDeviceName) > 0)) { ALDeviceInfo.bSelected = true; ALDeviceInfo.strDeviceName = actualDeviceName; @@ -107,7 +107,7 @@ ALDeviceList::ALDeviceList() ALDeviceInfo.pvstrExtensions->push_back("AL_EXT_LINEAR_DISTANCE"); if (alIsExtensionPresent("AL_EXT_EXPONENT_DISTANCE") == AL_TRUE) ALDeviceInfo.pvstrExtensions->push_back("AL_EXT_EXPONENT_DISTANCE"); - + if (alIsExtensionPresent("EAX2.0") == AL_TRUE) ALDeviceInfo.pvstrExtensions->push_back("EAX2.0"); if (alIsExtensionPresent("EAX3.0") == AL_TRUE) @@ -139,15 +139,15 @@ ALDeviceList::ALDeviceList() ResetFilters(); } -/* +/* * Exit call */ ALDeviceList::~ALDeviceList() { - for (u32 i = 0; i < vDeviceInfo.size(); i++) { - if (vDeviceInfo[i].pvstrExtensions) { - vDeviceInfo[i].pvstrExtensions->clear(); - delete vDeviceInfo[i].pvstrExtensions; + for (auto& di : vDeviceInfo) { + if (di.pvstrExtensions) { + di.pvstrExtensions->clear(); + delete di.pvstrExtensions; } } @@ -159,10 +159,10 @@ ALDeviceList::~ALDeviceList() */ s32 ALDeviceList::GetNumDevices() { - return (s32)vDeviceInfo.size(); + return (s32)vDeviceInfo.size(); } -/* +/* * Returns the device name at an index in the complete device list */ char * ALDeviceList::GetDeviceName(s32 index) @@ -206,11 +206,11 @@ bool ALDeviceList::IsExtensionSupported(s32 index, char *szExtName) bool bReturn = false; if (index < GetNumDevices()) { - for (u32 i = 0; i < vDeviceInfo[index].pvstrExtensions->size(); i++) { - if (!strcasecmp(vDeviceInfo[index].pvstrExtensions->at(i).c_str(), szExtName)) { + for (auto& ext : *vDeviceInfo[index].pvstrExtensions) { + if (!strcasecmp(ext.c_str(), szExtName)) { bReturn = true; break; - } + } } } @@ -225,7 +225,7 @@ s32 ALDeviceList::GetDefaultDevice() return defaultDeviceIndex; } -/* +/* * Deselects devices which don't have the specified minimum version */ void ALDeviceList::FilterDevicesMinVer(s32 major, s32 minor) @@ -239,7 +239,7 @@ void ALDeviceList::FilterDevicesMinVer(s32 major, s32 minor) } } -/* +/* * Deselects devices which don't have the specified maximum version */ void ALDeviceList::FilterDevicesMaxVer(s32 major, s32 minor) @@ -260,16 +260,16 @@ void ALDeviceList::FilterDevicesExtension(char *szExtName) { bool bFound; - for (u32 i = 0; i < vDeviceInfo.size(); i++) { + for (auto& di : vDeviceInfo) { bFound = false; - for (u32 j = 0; j < vDeviceInfo[i].pvstrExtensions->size(); j++) { - if (!strcasecmp(vDeviceInfo[i].pvstrExtensions->at(j).c_str(), szExtName)) { + for (auto& ext : *di.pvstrExtensions) { + if (!strcasecmp(ext.c_str(), szExtName)) { bFound = true; break; } } if (!bFound) - vDeviceInfo[i].bSelected = false; + di.bSelected = false; } } @@ -339,9 +339,9 @@ u32 ALDeviceList::GetMaxNumSources() alDeleteSources(iSourceCount, uiSources); if (alGetError() != AL_NO_ERROR) { - for (u32 i = 0; i < 256; i++) + for (auto& uiSource : uiSources) { - alDeleteSources(1, &uiSources[i]); + alDeleteSources(1, &uiSource); } } diff --git a/Source/Plugins/Plugin_VideoDX9/Src/stdafx.cpp b/Source/Core/AudioCommon/Src/stdafx.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX9/Src/stdafx.cpp rename to Source/Core/AudioCommon/Src/stdafx.cpp diff --git a/Source/Core/AudioCommon/Src/stdafx.h b/Source/Core/AudioCommon/Src/stdafx.h new file mode 100644 index 0000000000..9cd419573c --- /dev/null +++ b/Source/Core/AudioCommon/Src/stdafx.h @@ -0,0 +1,17 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#pragma once +/* +#ifdef HAVE_DXSDK_JUNE_2010 +#define _WIN32_WINNT 0x501 +#else +#pragma message("Resulting binary will be compatible with DirectX >= Windows 8. Install the June 2010 DirectX SDK if you want to build for older environments.") +#define _WIN32_WINNT 0x602 +#endif +*/ +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include +#include diff --git a/Source/Core/CMakeLists.txt b/Source/Core/CMakeLists.txt index eec0afa3e5..7b4042b604 100644 --- a/Source/Core/CMakeLists.txt +++ b/Source/Core/CMakeLists.txt @@ -5,3 +5,4 @@ add_subdirectory(DiscIO) add_subdirectory(DolphinWX) add_subdirectory(InputCommon) add_subdirectory(VideoCommon) +add_subdirectory(VideoBackends) diff --git a/Source/Core/Common/CMakeLists.txt b/Source/Core/Common/CMakeLists.txt index 0a1a26e530..e6701061d9 100644 --- a/Source/Core/Common/CMakeLists.txt +++ b/Source/Core/Common/CMakeLists.txt @@ -13,6 +13,7 @@ set(SRCS Src/BreakPoints.cpp Src/Misc.cpp Src/MsgHandler.cpp Src/NandPaths.cpp + Src/SettingsHandler.cpp Src/SDCardUtil.cpp Src/StringUtil.cpp Src/SymbolDB.cpp @@ -23,12 +24,8 @@ set(SRCS Src/BreakPoints.cpp Src/x64ABI.cpp Src/x64Analyzer.cpp Src/x64Emitter.cpp - Src/Crypto/aes_cbc.cpp - Src/Crypto/aes_core.cpp Src/Crypto/bn.cpp - Src/Crypto/ec.cpp - Src/Crypto/md5.cpp - Src/Crypto/sha1.cpp) + Src/Crypto/ec.cpp) if(_M_ARM) #ARM set(SRCS ${SRCS} @@ -38,7 +35,6 @@ else() if(NOT _M_GENERIC) #X86 set(SRCS ${SRCS} Src/x64FPURoundMode.cpp - Src/x64Thunk.cpp ) endif() set(SRCS ${SRCS} Src/x64CPUDetect.cpp) @@ -53,5 +49,4 @@ endif(WIN32) enable_precompiled_headers(Src/stdafx.h Src/stdafx.cpp SRCS) -add_library(common STATIC ${SRCS}) -target_link_libraries(common ${CMAKE_THREAD_LIBS_INIT}) +add_dolphin_library(common "${SRCS}" "${CMAKE_THREAD_LIBS_INIT}") diff --git a/Source/Core/Common/Common.vcxproj b/Source/Core/Common/Common.vcxproj index 2982a5c720..aeedafb20c 100644 --- a/Source/Core/Common/Common.vcxproj +++ b/Source/Core/Common/Common.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,181 +19,29 @@ - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - Common + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4} - - true - StaticLibrary - MultiByte - - - true - StaticLibrary - MultiByte - - - false + StaticLibrary + v120 Unicode - - StaticLibrary - false - MultiByte + + true - + false - StaticLibrary - Unicode - - - StaticLibrary - false - MultiByte - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - true - - - - - - - true - true - true - - - - - - - true - true - true - - - - - - - true - true - true - - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - @@ -216,10 +56,6 @@ - - - - @@ -227,6 +63,7 @@ + @@ -238,7 +75,7 @@ - + @@ -247,14 +84,57 @@ - - + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + {bdb6578b-0691-4e80-a46c-df21639fd3b8} + + + {41279555-f94f-4ebc-99de-af863c10c5c4} + diff --git a/Source/Core/Common/Common.vcxproj.filters b/Source/Core/Common/Common.vcxproj.filters index ae434219fd..8b257398f6 100644 --- a/Source/Core/Common/Common.vcxproj.filters +++ b/Source/Core/Common/Common.vcxproj.filters @@ -1,58 +1,12 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - Logging - - - Logging - - - Crypto - - - Crypto - - - Crypto - - - Crypto - - - Crypto - - - Crypto - - - - - + + {0336df21-7c3f-48a9-b767-9cf11d8958a6} + + + {c54973ce-5723-491c-ac23-41cea3565b05} + @@ -73,6 +27,7 @@ + @@ -82,54 +37,75 @@ - - + + + - + + + Crypto + + + Logging + Logging Logging - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Crypto + + + Crypto + + Logging - - - Crypto - - - Crypto - - - Crypto - - - Crypto - - - Crypto - - - - + + + Logging + + - - - - - {21b7df68-af69-45f4-9741-590a6a7f1ed1} - - - {f078f36e-a0ff-4cd0-95f8-476100d68e68} - + diff --git a/Source/Core/Common/SVNRevGen.vcxproj b/Source/Core/Common/SCMRevGen.vcxproj similarity index 59% rename from Source/Core/Common/SVNRevGen.vcxproj rename to Source/Core/Common/SCMRevGen.vcxproj index 803e059d19..8b8b1867f3 100644 --- a/Source/Core/Common/SVNRevGen.vcxproj +++ b/Source/Core/Common/SCMRevGen.vcxproj @@ -1,44 +1,47 @@  - + - + Release - x64 + Win32 - - - - - - - - - {69F00340-5C3D-449F-9A80-958435C6CF06} - SVNRevGen - SCMRevGen + {41279555-F94F-4EBC-99DE-AF863C10C5C4} - + Utility false - Unicode + v120 - + + - - - + + + $(BuildRootDir) + + cscript /nologo /E:JScript "make_scmrev.h.js" + + + + + + + diff --git a/Source/Core/Common/Src/ArmCPUDetect.cpp b/Source/Core/Common/Src/ArmCPUDetect.cpp index ef49d6efb1..f04d7d9b49 100644 --- a/Source/Core/Common/Src/ArmCPUDetect.cpp +++ b/Source/Core/Common/Src/ArmCPUDetect.cpp @@ -34,7 +34,7 @@ char *GetCPUString() auto const fp = file.GetHandle(); if (!fp) return 0; - + while (fgets(buf, sizeof(buf), fp)) { if (strncmp(buf, marker, sizeof(marker) - 1)) @@ -43,7 +43,7 @@ char *GetCPUString() cpu_string = strndup(cpu_string, strlen(cpu_string) - 1); // Strip the newline break; } - + return cpu_string; } @@ -110,7 +110,7 @@ bool CheckCPUFeature(const char *feature) auto const fp = file.GetHandle(); if (!fp) return 0; - + while (fgets(buf, sizeof(buf), fp)) { if (strncmp(buf, marker, sizeof(marker) - 1)) @@ -120,11 +120,11 @@ bool CheckCPUFeature(const char *feature) while (token != NULL) { if (strstr(token, feature)) - return true; + return true; token = strtok(NULL, " "); } } - + return false; } #endif @@ -144,14 +144,14 @@ int GetCoreCount() auto const fp = file.GetHandle(); if (!fp) return 0; - + while (fgets(buf, sizeof(buf), fp)) { if (strncmp(buf, marker, sizeof(marker) - 1)) continue; ++cores; } - + return cores; #endif } @@ -170,10 +170,10 @@ void CPUInfo::Detect() HTT = false; OS64bit = false; CPU64bit = false; - Mode64bit = false; + Mode64bit = false; vendor = VENDOR_ARM; - - // Get the information about the CPU + + // Get the information about the CPU num_cores = GetCoreCount(); #if defined(__SYMBIAN32__) || defined(BLACKBERRY) || defined(IOS) bool isVFP3 = false; diff --git a/Source/Core/Common/Src/ArmEmitter.cpp b/Source/Core/Common/Src/ArmEmitter.cpp index 2788760c6d..6178d2c58c 100644 --- a/Source/Core/Common/Src/ArmEmitter.cpp +++ b/Source/Core/Common/Src/ArmEmitter.cpp @@ -86,6 +86,7 @@ bool TryMakeOperand2_AllowNegation(s32 imm, Operand2 &op2, bool *negated) Operand2 AssumeMakeOperand2(u32 imm) { Operand2 op2; bool result = TryMakeOperand2(imm, op2); + (void) result; _dbg_assert_msg_(DYNA_REC, result, "Could not make assumed Operand2."); return op2; } @@ -103,7 +104,7 @@ bool ARMXEmitter::TrySetValue_TwoOp(ARMReg reg, u32 val) } if (ops > 2) return false; - + bool first = true; for (int i = 0; i < 16; i++, val >>=2) { if (val & 0x3) { @@ -417,7 +418,7 @@ void ARMXEmitter::SetJumpTarget(FixupBranch const &branch) branch.ptr); if(branch.type == 0) // B *(u32*)branch.ptr = (u32)(branch.condition | (10 << 24) | ((distance >> 2) & - 0x00FFFFFF)); + 0x00FFFFFF)); else // BL *(u32*)branch.ptr = (u32)(branch.condition | 0x0B000000 | ((distance >> 2) & 0x00FFFFFF)); @@ -490,14 +491,13 @@ void ARMXEmitter::POP(const int num, ...) void ARMXEmitter::WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, Operand2 op2) { - Write32(condition | (13 << 21) | (SetFlags << 20) | (dest << 12) | op2.Imm5() | (op << 4) | src); -} -void ARMXEmitter::WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, ARMReg op2) -{ - Write32(condition | (13 << 21) | (SetFlags << 20) | (dest << 12) | (op2 << 8) | (op << 4) | src); + if (op2.GetType() == TYPE_REG) + Write32(condition | (13 << 21) | (SetFlags << 20) | (dest << 12) | (op2.GetData() << 8) | ((op + 1) << 4) | src); + else + Write32(condition | (13 << 21) | (SetFlags << 20) | (dest << 12) | op2.Imm5() | (op << 4) | src); } -// IMM, REG, IMMSREG, RSR +// IMM, REG, IMMSREG, RSR // -1 for invalid if the instruction doesn't support that const s32 InstOps[][4] = {{16, 0, 0, 0}, // AND(s) {17, 1, 1, 1}, // EOR(s) @@ -517,7 +517,7 @@ const s32 InstOps[][4] = {{16, 0, 0, 0}, // AND(s) {31, 15, 15, 15}, // MVN(s) {24, -1, -1, -1}, // MOVW {26, -1, -1, -1}, // MOVT - }; + }; const char *InstNames[] = { "AND", "EOR", @@ -586,7 +586,7 @@ void ARMXEmitter::WriteInstruction (u32 Op, ARMReg Rd, ARMReg Rn, Operand2 Rm, b } } if (op == -1) - _dbg_assert_msg_(DYNA_REC, false, "%s not yet support %d", InstNames[Op], Rm.GetType()); + _dbg_assert_msg_(DYNA_REC, false, "%s not yet support %d", InstNames[Op], Rm.GetType()); Write32(condition | (op << 21) | (SetFlags ? (1 << 20) : 0) | Rn << 16 | Rd << 12 | Data); } @@ -609,11 +609,11 @@ void ARMXEmitter::SDIV(ARMReg dest, ARMReg dividend, ARMReg divisor) } void ARMXEmitter::LSL (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(0, false, dest, src, op2);} void ARMXEmitter::LSLS(ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(0, true, dest, src, op2);} -void ARMXEmitter::LSL (ARMReg dest, ARMReg src, ARMReg op2) { WriteShiftedDataOp(1, false, dest, src, op2);} -void ARMXEmitter::LSLS(ARMReg dest, ARMReg src, ARMReg op2) { WriteShiftedDataOp(1, true, dest, src, op2);} -void ARMXEmitter::LSR (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(3, false, dest, src, op2);} +void ARMXEmitter::LSR (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(2, false, dest, src, op2);} +void ARMXEmitter::LSRS(ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(2, true, dest, src, op2);} void ARMXEmitter::ASR (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(4, false, dest, src, op2);} void ARMXEmitter::ASRS(ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(4, true, dest, src, op2);} + void ARMXEmitter::MUL (ARMReg dest, ARMReg src, ARMReg op2) { Write32(condition | (dest << 16) | (src << 8) | (9 << 4) | op2); @@ -678,7 +678,7 @@ void ARMXEmitter::SXTH (ARMReg dest, ARMReg op2, u8 rotation) { SXTAH(dest, (ARMReg)15, op2, rotation); } -void ARMXEmitter::SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation) +void ARMXEmitter::SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation) { // bits ten and 11 are the rotation amount, see 8.8.232 for more // information @@ -688,7 +688,7 @@ void ARMXEmitter::RBIT(ARMReg dest, ARMReg src) { Write32(condition | (0x6F << 20) | (0xF << 16) | (dest << 12) | (0xF3 << 4) | src); } -void ARMXEmitter::REV (ARMReg dest, ARMReg src) +void ARMXEmitter::REV (ARMReg dest, ARMReg src) { Write32(condition | (0x6BF << 16) | (dest << 12) | (0xF3 << 4) | src); } @@ -768,7 +768,7 @@ void ARMXEmitter::WriteStoreOp(u32 Op, ARMReg Rt, ARMReg Rn, Operand2 Rm, bool R bool SignedLoad = false; if (op == -1) - _dbg_assert_msg_(DYNA_REC, false, "%s does not support %d", LoadStoreNames[Op], Rm.GetType()); + _dbg_assert_msg_(DYNA_REC, false, "%s does not support %d", LoadStoreNames[Op], Rm.GetType()); switch (Op) { @@ -801,7 +801,7 @@ void ARMXEmitter::WriteStoreOp(u32 Op, ARMReg Rt, ARMReg Rn, Operand2 Rm, bool R Data = abs(Temp); // The offset is encoded differently on this one. if (SpecialOp) - Data = (Data & 0xF0 << 4) | (Data & 0xF); + Data = ((Data & 0xF0) << 4) | (Data & 0xF); if (Temp >= 0) Add = true; } break; @@ -876,7 +876,7 @@ void ARMXEmitter::LDMFD(ARMReg dest, bool WriteBack, const int Regnum, ...) WriteRegStoreOp(0x89, dest, WriteBack, RegList); } -ARMReg ARMXEmitter::SubBase(ARMReg Reg) +ARMReg SubBase(ARMReg Reg) { if (Reg >= S0) { @@ -891,63 +891,60 @@ ARMReg ARMXEmitter::SubBase(ARMReg Reg) return Reg; } -// NEON Specific -void ARMXEmitter::VABD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +u32 EncodeVd(ARMReg Vd) { - _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to VABD(float)"); - _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use VABD(float) when CPU doesn't support it"); - bool register_quad = Vd >= Q0; + bool quad_reg = Vd >= Q0; + bool double_reg = Vd >= D0; - // Gets encoded as a double register - Vd = SubBase(Vd); - Vn = SubBase(Vn); - Vm = SubBase(Vm); + ARMReg Reg = SubBase(Vd); - Write32((0xF3 << 24) | ((Vd & 0x10) << 18) | (Size << 20) | ((Vn & 0xF) << 16) \ - | ((Vd & 0xF) << 12) | (0xD << 8) | ((Vn & 0x10) << 3) | (register_quad << 6) \ - | ((Vm & 0x10) << 2) | (Vm & 0xF)); + if (quad_reg) + return ((Reg & 0x10) << 18) | ((Reg & 0xF) << 12); + else + if (double_reg) + return ((Reg & 0x10) << 18) | ((Reg & 0xF) << 12); + else + return ((Reg & 0x1) << 22) | ((Reg & 0x1E) << 11); } -void ARMXEmitter::VADD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +u32 EncodeVn(ARMReg Vn) { - _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to VADD(integer)"); - _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use VADD(integer) when CPU doesn't support it"); - - bool register_quad = Vd >= Q0; - - // Gets encoded as a double register - Vd = SubBase(Vd); - Vn = SubBase(Vn); - Vm = SubBase(Vm); - - Write32((0xF2 << 24) | ((Vd & 0x10) << 18) | (Size << 20) | ((Vn & 0xF) << 16) \ - | ((Vd & 0xF) << 12) | (0x8 << 8) | ((Vn & 0x10) << 3) | (register_quad << 6) \ - | ((Vm & 0x10) << 1) | (Vm & 0xF)); + bool quad_reg = Vn >= Q0; + bool double_reg = Vn >= D0; + ARMReg Reg = SubBase(Vn); + if (quad_reg) + return ((Reg & 0xF) << 16) | ((Reg & 0x10) << 3); + else + if (double_reg) + return ((Reg & 0xF) << 16) | ((Reg & 0x10) << 3); + else + return ((Reg & 0x1E) << 15) | ((Reg & 0x1) << 7); } -void ARMXEmitter::VSUB(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +u32 EncodeVm(ARMReg Vm) { - _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to VSUB(integer)"); - _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use VSUB(integer) when CPU doesn't support it"); + bool quad_reg = Vm >= Q0; + bool double_reg = Vm >= D0; - // Gets encoded as a double register - Vd = SubBase(Vd); - Vn = SubBase(Vn); - Vm = SubBase(Vm); + ARMReg Reg = SubBase(Vm); - Write32((0xF3 << 24) | ((Vd & 0x10) << 18) | (Size << 20) | ((Vn & 0xF) << 16) \ - | ((Vd & 0xF) << 12) | (0x8 << 8) | ((Vn & 0x10) << 3) | (1 << 6) \ - | ((Vm & 0x10) << 2) | (Vm & 0xF)); + if (quad_reg) + return ((Reg & 0x10) << 1) | (Reg & 0xF); + else + if (double_reg) + return ((Reg & 0x10) << 1) | (Reg & 0xF); + else + return ((Reg & 0x1) << 5) | (Reg >> 1); } // Double/single, Neon extern const VFPEnc VFPOps[16][2] = { - {{0xE0, 0xA0}, {0x20, 0xD1}}, // 0: VMLA + {{0xE0, 0xA0}, { -1, -1}}, // 0: VMLA {{0xE1, 0xA4}, { -1, -1}}, // 1: VNMLA - {{0xE0, 0xA4}, {0x22, 0xD1}}, // 2: VMLS + {{0xE0, 0xA4}, { -1, -1}}, // 2: VMLS {{0xE1, 0xA0}, { -1, -1}}, // 3: VNMLS - {{0xE3, 0xA0}, {0x20, 0xD0}}, // 4: VADD - {{0xE3, 0xA4}, {0x22, 0xD0}}, // 5: VSUB - {{0xE2, 0xA0}, {0x30, 0xD1}}, // 6: VMUL + {{0xE3, 0xA0}, { -1, -1}}, // 4: VADD + {{0xE3, 0xA4}, { -1, -1}}, // 5: VSUB + {{0xE2, 0xA0}, { -1, -1}}, // 6: VMUL {{0xE2, 0xA4}, { -1, -1}}, // 7: VNMUL {{0xEB, 0xAC}, { -1 /* 0x3B */, -1 /* 0x70 */}}, // 8: VABS(Vn(0x0) used for encoding) {{0xE8, 0xA0}, { -1, -1}}, // 9: VDIV @@ -958,7 +955,7 @@ extern const VFPEnc VFPOps[16][2] = { {{ -1, -1}, {0x3B, 0x30}}, // 14: VABSi }; -extern const char *VFPOpNames[16] = { +const char *VFPOpNames[16] = { "VMLA", "VNMLA", "VMLS", @@ -976,51 +973,6 @@ extern const char *VFPOpNames[16] = { "VABSi", }; -u32 ARMXEmitter::EncodeVd(ARMReg Vd) -{ - bool quad_reg = Vd >= Q0; - bool double_reg = Vd >= D0; - - ARMReg Reg = SubBase(Vd); - - if (quad_reg) - return ((Reg & 0x10) << 18) | ((Reg & 0xF) << 12); - else - if (double_reg) - return ((Reg & 0x10) << 18) | ((Reg & 0xF) << 12); - else - return ((Reg & 0x1) << 22) | ((Reg & 0x1E) << 11); -} -u32 ARMXEmitter::EncodeVn(ARMReg Vn) -{ - bool quad_reg = Vn >= Q0; - bool double_reg = Vn >= D0; - - ARMReg Reg = SubBase(Vn); - if (quad_reg) - return ((Reg & 0xF) << 16) | ((Reg & 0x10) << 3); - else - if (double_reg) - return ((Reg & 0xF) << 16) | ((Reg & 0x10) << 3); - else - return ((Reg & 0x1E) << 15) | ((Reg & 0x1) << 7); -} -u32 ARMXEmitter::EncodeVm(ARMReg Vm) -{ - bool quad_reg = Vm >= Q0; - bool double_reg = Vm >= D0; - - ARMReg Reg = SubBase(Vm); - - if (quad_reg) - return ((Reg & 0x10) << 2) | (Reg & 0xF); - else - if (double_reg) - return ((Reg & 0x10) << 2) | (Reg & 0xF); - else - return ((Reg & 0x1) << 5) | (Reg >> 1); -} - void ARMXEmitter::WriteVFPDataOp(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm) { bool quad_reg = Vd >= Q0; @@ -1028,7 +980,7 @@ void ARMXEmitter::WriteVFPDataOp(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm) VFPEnc enc = VFPOps[Op][quad_reg]; if (enc.opc1 == -1 && enc.opc2 == -1) - _dbg_assert_msg_(DYNA_REC, false, "%s does not support %s", VFPOpNames[Op], quad_reg ? "NEON" : "VFP"); + _dbg_assert_msg_(DYNA_REC, false, "%s does not support %s", VFPOpNames[Op], quad_reg ? "NEON" : "VFP"); u32 VdEnc = EncodeVd(Vd); u32 VnEnc = EncodeVn(Vn); u32 VmEnc = EncodeVm(Vm); @@ -1036,6 +988,22 @@ void ARMXEmitter::WriteVFPDataOp(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm) Write32(cond | (enc.opc1 << 20) | VnEnc | VdEnc | (enc.opc2 << 4) | (quad_reg << 6) | (double_reg << 8) | VmEnc); } +void ARMXEmitter::WriteVFPDataOp6bit(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm, u32 bit6) +{ + bool quad_reg = Vd >= Q0; + bool double_reg = Vd >= D0 && Vd < Q0; + + VFPEnc enc = VFPOps[Op][quad_reg]; + if (enc.opc1 == -1 && enc.opc2 == -1) + _dbg_assert_msg_(DYNA_REC, false, "%s does not support %s", VFPOpNames[Op], quad_reg ? "NEON" : "VFP"); + u32 VdEnc = EncodeVd(Vd); + u32 VnEnc = EncodeVn(Vn); + u32 VmEnc = EncodeVm(Vm); + u32 cond = quad_reg ? (0xF << 28) : condition; + + Write32(cond | (enc.opc1 << 20) | VnEnc | VdEnc | (enc.opc2 << 4) | (bit6 << 6) | (double_reg << 8) | VmEnc); +} + void ARMXEmitter::VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm){ WriteVFPDataOp(0, Vd, Vn, Vm); } void ARMXEmitter::VNMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm){ WriteVFPDataOp(1, Vd, Vn, Vm); } void ARMXEmitter::VMLS(ARMReg Vd, ARMReg Vn, ARMReg Vm){ WriteVFPDataOp(2, Vd, Vn, Vm); } @@ -1047,11 +1015,11 @@ void ARMXEmitter::VNMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm){ WriteVFPDataOp(7, Vd, void ARMXEmitter::VABS(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp(8, Vd, D0, Vm); } void ARMXEmitter::VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm){ WriteVFPDataOp(9, Vd, Vn, Vm); } void ARMXEmitter::VNEG(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp(10, Vd, D1, Vm); } -void ARMXEmitter::VSQRT(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp(11, Vd, D1, Vm); } -void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp(12, Vd, D4, Vm); } -void ARMXEmitter::VCMPE(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp(13, Vd, D4, Vm); } -void ARMXEmitter::VCMP(ARMReg Vd){ WriteVFPDataOp(12, Vd, D5, D0); } -void ARMXEmitter::VCMPE(ARMReg Vd){ WriteVFPDataOp(13, Vd, D5, D0); } +void ARMXEmitter::VSQRT(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp6bit(11, Vd, D1, Vm, 3); } +void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp6bit(12, Vd, D4, Vm, 1); } +void ARMXEmitter::VCMPE(ARMReg Vd, ARMReg Vm){ WriteVFPDataOp6bit(13, Vd, D4, Vm, 1); } +void ARMXEmitter::VCMP(ARMReg Vd){ WriteVFPDataOp6bit(12, Vd, D5, D0, 1); } +void ARMXEmitter::VCMPE(ARMReg Vd){ WriteVFPDataOp6bit(13, Vd, D5, D0, 1); } void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, s16 offset) { @@ -1110,9 +1078,6 @@ void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, s16 offset) } } -void ARMXEmitter::VMRS_APSR() { - Write32(condition | 0xEF10A10 | (15 << 12)); -} void ARMXEmitter::VMRS(ARMReg Rt) { Write32(condition | (0xEF << 20) | (1 << 16) | (Rt << 12) | 0xA10); } @@ -1124,7 +1089,8 @@ void ARMXEmitter::VMSR(ARMReg Rt) { void ARMXEmitter::VMOV(ARMReg Dest, Operand2 op2) { _dbg_assert_msg_(DYNA_REC, cpu_info.bVFPv3, "VMOV #imm requires VFPv3"); - Write32(condition | (0xEB << 20) | EncodeVd(Dest) | (0xA << 8) | op2.Imm8VFP()); + bool double_reg = Dest >= D0; + Write32(condition | (0xEB << 20) | EncodeVd(Dest) | (0x5 << 9) | (double_reg << 8) | op2.Imm8VFP()); } void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src, bool high) { @@ -1146,7 +1112,7 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) if (Dest < D0) { // Moving to a Neon register FROM ARM Reg - Dest = (ARMReg)(Dest - S0); + Dest = (ARMReg)(Dest - S0); Write32(condition | (0xE0 << 20) | ((Dest & 0x1E) << 15) | (Src << 12) \ | (0xA << 8) | ((Dest & 0x1) << 7) | (1 << 4)); return; @@ -1154,7 +1120,10 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) else { // Move 64bit from Arm reg - _dbg_assert_msg_(DYNA_REC, false, "This VMOV doesn't support moving 64bit ARM to NEON"); + ARMReg Src2 = (ARMReg)(Src + 1); + Dest = SubBase(Dest); + Write32(condition | (0xC4 << 20) | (Src2 << 16) | (Src << 12) \ + | (0xB << 8) | ((Dest & 0x10) << 1) | (1 << 4) | (Dest & 0xF)); return; } } @@ -1174,7 +1143,10 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) else { // Move 64bit To Arm reg - _dbg_assert_msg_(DYNA_REC, false, "This VMOV doesn't support moving 64bit ARM From NEON"); + ARMReg Dest2 = (ARMReg)(Dest + 1); + Src = SubBase(Src); + Write32(condition | (0xC5 << 20) | (Dest2 << 16) | (Dest << 12) \ + | (0xB << 8) | ((Dest & 0x10) << 1) | (1 << 4) | (Src & 0xF)); return; } } @@ -1186,6 +1158,7 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } // Moving NEON registers int SrcSize = Src < D0 ? 1 : Src < Q0 ? 2 : 4; + (void) SrcSize; int DestSize = Dest < D0 ? 1 : Dest < Q0 ? 2 : 4; bool Single = DestSize == 1; bool Quad = DestSize == 4; @@ -1205,7 +1178,7 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) // Double and quad if (Quad) { - _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Trying to use quad registers when you don't support ASIMD."); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Trying to use quad registers when you don't support ASIMD."); // Gets encoded as a Double register Write32((0xF2 << 24) | ((Dest & 0x10) << 18) | (2 << 20) | ((Src & 0xF) << 16) \ | ((Dest & 0xF) << 12) | (1 << 8) | ((Src & 0x10) << 3) | (1 << 6) \ @@ -1264,4 +1237,931 @@ void ARMXEmitter::VCVT(ARMReg Dest, ARMReg Source, int flags) } } +void NEONXEmitter::VABA(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | EncodeVn(Vn) \ + | (encodedSize(Size) << 20) | EncodeVd(Vd) | (0x71 << 4) | (register_quad << 6) | EncodeVm(Vm)); } + +void NEONXEmitter::VABAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= D0 && Vn < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (1 << 23) | EncodeVn(Vn) \ + | (encodedSize(Size) << 20) | EncodeVd(Vd) | (0x50 << 4) | EncodeVm(Vm)); +} + +void NEONXEmitter::VABD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF3 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD << 8) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | EncodeVn(Vn) \ + | (encodedSize(Size) << 20) | EncodeVd(Vd) | (0x70 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} + +void NEONXEmitter::VABDL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= D0 && Vn < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (1 << 23) | EncodeVn(Vn) \ + | (encodedSize(Size) << 20) | EncodeVd(Vd) | (0x70 << 4) | EncodeVm(Vm)); +} + +void NEONXEmitter::VABS(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB1 << 16) | (encodedSize(Size) << 18) | EncodeVd(Vd) \ + | ((Size & F_32 ? 1 : 0) << 10) | (0x30 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} + +void NEONXEmitter::VACGE(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + // Only Float + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0xD1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} + +void NEONXEmitter::VACGT(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + // Only Float + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0xD1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} + +void NEONXEmitter::VACLE(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + VACGE(Vd, Vm, Vn); +} + +void NEONXEmitter::VACLT(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + VACGT(Vd, Vn, Vm); +} + +void NEONXEmitter::VADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0x8 << 8) | (register_quad << 6) | EncodeVm(Vm)); +} + +void NEONXEmitter::VADDHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) \ + | EncodeVd(Vd) | (0x80 << 4) | EncodeVm(Vm)); +} + +void NEONXEmitter::VADDL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= D0 && Vn < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) \ + | EncodeVd(Vd) | EncodeVm(Vm)); +} +void NEONXEmitter::VADDW(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) \ + | EncodeVd(Vd) | (1 << 8) | EncodeVm(Vm)); +} +void NEONXEmitter::VAND(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VBIC(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (1 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VBIF(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (3 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VBIT(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (2 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VBSL(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (1 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCEQ(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + if (Size & F_32) + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xE0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF3 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0x81 << 4) | (register_quad << 6) | EncodeVm(Vm)); + +} +void NEONXEmitter::VCEQ(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 16) \ + | EncodeVd(Vd) | ((Size & F_32 ? 1 : 0) << 10) | (0x10 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCGE(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + if (Size & F_32) + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xE0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0x31 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCGE(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 16) \ + | EncodeVd(Vd) | ((Size & F_32 ? 1 : 0) << 10) | (0x8 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCGT(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + if (Size & F_32) + Write32((0xF3 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xE0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) \ + | (0x30 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCGT(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) | (1 << 16) \ + | EncodeVd(Vd) | ((Size & F_32 ? 1 : 0) << 10) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCLE(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + VCGE(Size, Vd, Vm, Vn); +} +void NEONXEmitter::VCLE(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) | (1 << 16) \ + | EncodeVd(Vd) | ((Size & F_32 ? 1 : 0) << 10) | (3 << 7) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCLS(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) \ + | EncodeVd(Vd) | (1 << 10) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCLT(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + VCGT(Size, Vd, Vm, Vn); +} +void NEONXEmitter::VCLT(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) | (1 << 16) \ + | EncodeVd(Vd) | ((Size & F_32 ? 1 : 0) << 10) | (0x20 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCLZ(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) \ + | EncodeVd(Vd) | (0x48 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VCNT(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, Size & I_8, "Can only use I_8 with " __FUNCTION__); + + bool register_quad = Vd >= Q0; + Write32((0xF3 << 24) | (0xD << 20) | (encodedSize(Size) << 18) \ + | EncodeVd(Vd) | (0x90 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VDUP(u32 Size, ARMReg Vd, ARMReg Vm, u8 index) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + u32 sizeEncoded = 0, indexEncoded = 0; + if (Size & I_8) + sizeEncoded = 1; + else if (Size & I_16) + sizeEncoded = 2; + else if (Size & I_32) + sizeEncoded = 4; + if (Size & I_8) + indexEncoded <<= 1; + else if (Size & I_16) + indexEncoded <<= 2; + else if (Size & I_32) + indexEncoded <<= 3; + Write32((0xF3 << 24) | (0xD << 20) | (sizeEncoded << 16) | (indexEncoded << 16) \ + | EncodeVd(Vd) | (0xC0 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VDUP(u32 Size, ARMReg Vd, ARMReg Rt) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Rt < D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Vd = SubBase(Vd); + u8 sizeEncoded = 0; + if (Size & I_8) + sizeEncoded = 2; + else if (Size & I_16) + sizeEncoded = 1; + else if (Size & I_32) + sizeEncoded = 0; + + Write32((0xEE << 24) | (0x8 << 20) | ((sizeEncoded & 2) << 21) | (register_quad << 21) \ + | ((Vd & 0xF) << 16) | (Rt << 12) | (0xD1 << 4) | ((Vd & 0x10) << 3) | (1 << 4)); +} +void NEONXEmitter::VEOR(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VEXT(ARMReg Vd, ARMReg Vn, ARMReg Vm, u8 index) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (0xB << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (index & 0xF) \ + | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VFMA(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, cpu_info.bVFPv4, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xC1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VFMS(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, cpu_info.bVFPv4, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xC1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VHADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 23) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VHSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 23) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (1 << 9) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMAX(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xF0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 23) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (0x60 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMIN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xF0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 23) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (0x61 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMLA(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD1 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x90 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMLS(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD1 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (1 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x90 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMLAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (0x80 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VMLSL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vn >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, Vm >= D0 && Vm < Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float."); + + Write32((0xF2 << 24) | ((Size & I_UNSIGNED ? 1 : 0) << 24) | (encodedSize(Size) << 20) \ + | EncodeVn(Vn) | EncodeVd(Vd) | (0xA0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VMUL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD1 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | ((Size & I_POLYNOMIAL) ? (1 << 24) : 0) | (encodedSize(Size) << 20) | \ + EncodeVn(Vn) | EncodeVd(Vd) | (0x91 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VMULL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF2 << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xC0 << 4) | ((Size & I_POLYNOMIAL) ? 1 << 9 : 0) | EncodeVm(Vm)); +} +void NEONXEmitter::VNEG(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 16) | \ + EncodeVd(Vd) | ((Size & F_32) ? 1 << 10 : 0) | (0xE << 6) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VORN(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (3 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VORR(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (2 << 20) | EncodeVn(Vn) | EncodeVd(Vd) | (0x11 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VPADAL(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | EncodeVd(Vd) | \ + (0x60 << 4) | ((Size & I_UNSIGNED) ? 1 << 7 : 0) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VPADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + if (Size & F_32) + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xD0 << 4) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xB1 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VPADDL(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | EncodeVd(Vd) | \ + (0x20 << 4) | (Size & I_UNSIGNED ? 1 << 7 : 0) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VPMAX(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + if (Size & F_32) + Write32((0xF3 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xF0 << 4) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xA0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VPMIN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + if (Size & F_32) + Write32((0xF3 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | (0xF0 << 4) | EncodeVm(Vm)); + else + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xA1 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQABS(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | EncodeVd(Vd) | \ + (0x70 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VQADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VQDMLAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF2 << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x90 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQDMLSL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF2 << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xB0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQDMULH(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xB0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQDMULL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF2 << 24) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xD0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQNEG(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | EncodeVd(Vd) | \ + (0x78 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VQRDMULH(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF3 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xB0 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VQRSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x51 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VQSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x41 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VQSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x21 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRADDHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF3 << 24) | (1 << 23) | ((encodedSize(Size) - 1) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x40 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VRECPE(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (0xB << 16) | EncodeVd(Vd) | \ + (0x40 << 4) | (Size & F_32 ? 1 << 8 : 0) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRECPS(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | EncodeVn(Vn) | EncodeVd(Vd) | (0xF1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRHADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x10 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x50 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRSQRTE(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + Vd = SubBase(Vd); + Vm = SubBase(Vm); + + Write32((0xF3 << 24) | (0xB << 20) | ((Vd & 0x10) << 18) | (0xB << 16) + | ((Vd & 0xF) << 12) | (9 << 7) | (Size & F_32 ? (1 << 8) : 0) | (register_quad << 6) + | ((Vm & 0x10) << 1) | (Vm & 0xF)); +} +void NEONXEmitter::VRSQRTS(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xF1 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VRSUBHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + Write32((0xF3 << 24) | (1 << 23) | ((encodedSize(Size) - 1) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x60 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + _dbg_assert_msg_(DYNA_REC, !(Size & F_32), __FUNCTION__ " doesn't support float"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x40 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + if (Size & F_32) + Write32((0xF2 << 24) | (1 << 21) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0xD0 << 4) | (register_quad << 6) | EncodeVm(Vm)); + else + Write32((0xF3 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x80 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VSUBHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + Write32((0xF2 << 24) | (1 << 23) | ((encodedSize(Size) - 1) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x60 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VSUBL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x20 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VSUBW(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + Write32((0xF2 << 24) | (Size & I_UNSIGNED ? 1 << 24 : 0) | (1 << 23) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x30 << 4) | EncodeVm(Vm)); +} +void NEONXEmitter::VSWP(ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (1 << 17) | EncodeVd(Vd) | \ + (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VTRN(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 17) | EncodeVd(Vd) | \ + (1 << 7) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VTST(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF2 << 24) | (encodedSize(Size) << 20) | EncodeVn(Vn) | EncodeVd(Vd) | \ + (0x81 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VUZP(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 17) | EncodeVd(Vd) | \ + (0x10 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VZIP(u32 Size, ARMReg Vd, ARMReg Vm) +{ + _dbg_assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to " __FUNCTION__); + _dbg_assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use " __FUNCTION__ " when CPU doesn't support it"); + + bool register_quad = Vd >= Q0; + + Write32((0xF3 << 24) | (0xB << 20) | (encodedSize(Size) << 18) | (1 << 17) | EncodeVd(Vd) | \ + (0x18 << 4) | (register_quad << 6) | EncodeVm(Vm)); +} +void NEONXEmitter::VLD1(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align, ARMReg Rm) +{ + u32 spacing = 0x7; // Only support loading to 1 reg + // Gets encoded as a double register + Vd = SubBase(Vd); + + Write32((0xF4 << 24) | ((Vd & 0x10) << 18) | (1 << 21) | (Rn << 16) + | ((Vd & 0xF) << 12) | (spacing << 8) | (encodedSize(Size) << 6) + | (align << 4) | Rm); +} +void NEONXEmitter::VLD2(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align, ARMReg Rm) +{ + u32 spacing = 0x8; // Single spaced registers + // Gets encoded as a double register + Vd = SubBase(Vd); + + Write32((0xF4 << 24) | ((Vd & 0x10) << 18) | (1 << 21) | (Rn << 16) + | ((Vd & 0xF) << 12) | (spacing << 8) | (encodedSize(Size) << 6) + | (align << 4) | Rm); +} +void NEONXEmitter::VST1(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align, ARMReg Rm) +{ + u32 spacing = 0x7; // Single spaced registers + // Gets encoded as a double register + Vd = SubBase(Vd); + + Write32((0xF4 << 24) | ((Vd & 0x10) << 18) | (Rn << 16) + | ((Vd & 0xF) << 12) | (spacing << 8) | (encodedSize(Size) << 6) + | (align << 4) | Rm); +} + +void NEONXEmitter::VREVX(u32 size, u32 Size, ARMReg Vd, ARMReg Vm) +{ + bool register_quad = Vd >= Q0; + Vd = SubBase(Vd); + Vm = SubBase(Vm); + + Write32((0xF3 << 24) | (1 << 23) | ((Vd & 0x10) << 18) | (0x3 << 20) + | (encodedSize(Size) << 18) | ((Vd & 0xF) << 12) | (size << 7) + | (register_quad << 6) | ((Vm & 0x10) << 1) | (Vm & 0xF)); +} + +void NEONXEmitter::VREV64(u32 Size, ARMReg Vd, ARMReg Vm) +{ + VREVX(0, Size, Vd, Vm); +} + +void NEONXEmitter::VREV32(u32 Size, ARMReg Vd, ARMReg Vm) +{ + VREVX(1, Size, Vd, Vm); +} + +void NEONXEmitter::VREV16(u32 Size, ARMReg Vd, ARMReg Vm) +{ + VREVX(2, Size, Vd, Vm); +} +} + diff --git a/Source/Core/Common/Src/ArmEmitter.h b/Source/Core/Common/Src/ArmEmitter.h index 1592da7d4f..99024f3b6f 100644 --- a/Source/Core/Common/Src/ArmEmitter.h +++ b/Source/Core/Common/Src/ArmEmitter.h @@ -66,7 +66,7 @@ enum ARMReg D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, - + // ASIMD Quad-Word registers Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, @@ -104,13 +104,6 @@ enum ShiftType ST_ROR = 3, ST_RRX = 4 }; -enum IntegerSize -{ - I_I8 = 0, - I_I16, - I_I32, - I_I64 -}; enum { @@ -149,11 +142,11 @@ public: { return Type; } - Operand2() {} + Operand2() {} Operand2(u32 imm, OpType type = TYPE_IMM) - { - Type = type; - Value = imm; + { + Type = type; + Value = imm; Rotation = 0; } @@ -345,10 +338,26 @@ struct LiteralPool }; typedef const u8* JumpTarget; +// XXX: Stop polluting the global namespace +const u32 I_8 = (1 << 0); +const u32 I_16 = (1 << 1); +const u32 I_32 = (1 << 2); +const u32 I_64 = (1 << 3); +const u32 I_SIGNED = (1 << 4); +const u32 I_UNSIGNED = (1 << 5); +const u32 F_32 = (1 << 6); +const u32 I_POLYNOMIAL = (1 << 7); // Only used in VMUL/VMULL + +u32 EncodeVd(ARMReg Vd); +u32 EncodeVn(ARMReg Vn); +u32 EncodeVm(ARMReg Vm); +// Subtracts the base from the register to give us the real one +ARMReg SubBase(ARMReg Reg); class ARMXEmitter { friend struct OpArg; // for Write8 etc + friend class NEONXEmitter; private: u8 *code, *startcode; u8 *lastCacheFlushEnd; @@ -357,14 +366,11 @@ private: void WriteStoreOp(u32 Op, ARMReg Rt, ARMReg Rn, Operand2 op2, bool RegAdd); void WriteRegStoreOp(u32 op, ARMReg dest, bool WriteBack, u16 RegList); - void WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, ARMReg op2); void WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, Operand2 op2); void WriteSignedMultiply(u32 Op, u32 Op2, u32 Op3, ARMReg dest, ARMReg r1, ARMReg r2); - u32 EncodeVd(ARMReg Vd); - u32 EncodeVn(ARMReg Vn); - u32 EncodeVm(ARMReg Vm); void WriteVFPDataOp(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void WriteVFPDataOp6bit(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm, u32 bit6); void Write4OpMultiply(u32 op, ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm); @@ -450,10 +456,9 @@ public: void ADC (ARMReg dest, ARMReg src, Operand2 op2); void ADCS(ARMReg dest, ARMReg src, Operand2 op2); void LSL (ARMReg dest, ARMReg src, Operand2 op2); - void LSL (ARMReg dest, ARMReg src, ARMReg op2); void LSLS(ARMReg dest, ARMReg src, Operand2 op2); - void LSLS(ARMReg dest, ARMReg src, ARMReg op2); void LSR (ARMReg dest, ARMReg src, Operand2 op2); + void LSRS(ARMReg dest, ARMReg src, Operand2 op2); void ASR (ARMReg dest, ARMReg src, Operand2 op2); void ASRS(ARMReg dest, ARMReg src, Operand2 op2); void SBC (ARMReg dest, ARMReg src, Operand2 op2); @@ -478,7 +483,7 @@ public: void MOVW(ARMReg dest, Operand2 op2); void MOVT(ARMReg dest, Operand2 op2, bool TopBits = false); - // UDIV and SDIV are only available on CPUs that have + // UDIV and SDIV are only available on CPUs that have // the idiva hardare capacity void UDIV(ARMReg dest, ARMReg dividend, ARMReg divisor); void SDIV(ARMReg dest, ARMReg dividend, ARMReg divisor); @@ -531,13 +536,6 @@ public: // is deprecating conditional execution of ASIMD instructions. // ASIMD instructions don't even have a conditional encoding. - // Subtracts the base from the register to give us the real one - ARMReg SubBase(ARMReg Reg); - // NEON Only - void VABD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); - void VADD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); - void VSUB(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); - // VFP Only void VLDR(ARMReg Dest, ARMReg Base, s16 offset); void VSTR(ARMReg Src, ARMReg Base, s16 offset); @@ -566,7 +564,6 @@ public: void VMOV(ARMReg Dest, ARMReg Src); void VCVT(ARMReg Dest, ARMReg Src, int flags); - void VMRS_APSR(); void VMRS(ARMReg Rt); void VMSR(ARMReg Rt); @@ -584,6 +581,136 @@ public: }; // class ARMXEmitter +enum NEONAlignment +{ + ALIGN_NONE = 0, + ALIGN_64 = 1, + ALIGN_128 = 2, + ALIGN_256 = 3 +}; + + +class NEONXEmitter +{ +private: + ARMXEmitter *_emit; + inline void Write32(u32 value) { _emit->Write32(value); } + + inline u32 encodedSize(u32 value) + { + if (value & I_8) + return 0; + else if (value & I_16) + return 1; + else if ((value & I_32) || (value & F_32)) + return 2; + else if (value & I_64) + return 3; + else + _dbg_assert_msg_(DYNA_REC, false, "Passed invalid size to integer NEON instruction"); + return 0; + } + + void VREVX(u32 size, u32 Size, ARMReg Vd, ARMReg Vm); + +public: + NEONXEmitter(ARMXEmitter *emit) + : _emit(emit) + {} + + void VABA(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VABAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VABD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VABDL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VABS(u32 Size, ARMReg Vd, ARMReg Vm); + void VACGE(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VACGT(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VACLE(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VACLT(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VADDHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VADDL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VADDW(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VAND(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VBIC(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VBIF(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VBIT(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VBSL(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCEQ(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCEQ(u32 Size, ARMReg Vd, ARMReg Vm); + void VCGE(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCGE(u32 Size, ARMReg Vd, ARMReg Vm); + void VCGT(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCGT(u32 Size, ARMReg Vd, ARMReg Vm); + void VCLE(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCLE(u32 Size, ARMReg Vd, ARMReg Vm); + void VCLS(u32 Size, ARMReg Vd, ARMReg Vm); + void VCLT(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VCLT(u32 Size, ARMReg Vd, ARMReg Vm); + void VCLZ(u32 Size, ARMReg Vd, ARMReg Vm); + void VCNT(u32 Size, ARMReg Vd, ARMReg Vm); + void VDUP(u32 Size, ARMReg Vd, ARMReg Vm, u8 index); + void VDUP(u32 Size, ARMReg Vd, ARMReg Rt); + void VEOR(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VEXT(ARMReg Vd, ARMReg Vn, ARMReg Vm, u8 index); + void VFMA(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VFMS(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VHADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VHSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMAX(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMIN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMLA(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMLS(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMLAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMLSL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMUL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMULL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VNEG(u32 Size, ARMReg Vd, ARMReg Vm); + void VORN(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VORR(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VPADAL(u32 Size, ARMReg Vd, ARMReg Vm); + void VPADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VPADDL(u32 Size, ARMReg Vd, ARMReg Vm); + void VPMAX(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VPMIN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQABS(u32 Size, ARMReg Vd, ARMReg Vm); + void VQADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQDMLAL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQDMLSL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQDMULH(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQDMULL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQNEG(u32 Size, ARMReg Vd, ARMReg Vm); + void VQRDMULH(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQRSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VQSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRADDHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRECPE(u32 Size, ARMReg Vd, ARMReg Vm); + void VRECPS(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRHADD(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRSQRTE(u32 Size, ARMReg Vd, ARMReg Vm); + void VRSQRTS(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VRSUBHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSHL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSUB(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSUBHN(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSUBL(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSUBW(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VSWP(ARMReg Vd, ARMReg Vm); + void VTRN(u32 Size, ARMReg Vd, ARMReg Vm); + void VTST(u32 Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VUZP(u32 Size, ARMReg Vd, ARMReg Vm); + void VZIP(u32 Size, ARMReg Vd, ARMReg Vm); + void VREV64(u32 Size, ARMReg Vd, ARMReg Vm); + void VREV32(u32 Size, ARMReg Vd, ARMReg Vm); + void VREV16(u32 Size, ARMReg Vd, ARMReg Vm); + + void VLD1(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align = ALIGN_NONE, ARMReg Rm = _PC); + void VLD2(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align = ALIGN_NONE, ARMReg Rm = _PC); + + void VST1(u32 Size, ARMReg Vd, ARMReg Rn, NEONAlignment align = ALIGN_NONE, ARMReg Rm = _PC); +}; // Everything that needs to generate X86 code should inherit from this. // You get memory management for free, plus, you can use all the MOV etc functions without @@ -608,7 +735,7 @@ public: // Always clear code space with breakpoints, so that if someone accidentally executes // uninitialized, it just breaks into the debugger. - void ClearCodeSpace() + void ClearCodeSpace() { // x86/64: 0xCC = breakpoint memset(region, 0xCC, region_size); diff --git a/Source/Core/Common/Src/Atomic_GCC.h b/Source/Core/Common/Src/Atomic_GCC.h index f923ba8b5e..22dffbe66d 100644 --- a/Source/Core/Common/Src/Atomic_GCC.h +++ b/Source/Core/Common/Src/Atomic_GCC.h @@ -40,74 +40,51 @@ inline void AtomicIncrement(volatile u32& target) { __sync_add_and_fetch(&target, 1); } -inline u32 AtomicLoad(volatile u32& src) { - return src; // 32-bit reads are always atomic. -} -inline u32 AtomicLoadAcquire(volatile u32& src) { - //keep the compiler from caching any memory references - u32 result = src; // 32-bit reads are always atomic. - //__sync_synchronize(); // TODO: May not be necessary. - // Compiler instruction only. x86 loads always have acquire semantics. - __asm__ __volatile__ ( "":::"memory" ); - return result; -} - inline void AtomicOr(volatile u32& target, u32 value) { __sync_or_and_fetch(&target, value); } -inline void AtomicStore(volatile u32& dest, u32 value) { - dest = value; // 32-bit writes are always atomic. -} -inline void AtomicStoreRelease(volatile u32& dest, u32 value) { - __sync_lock_test_and_set(&dest, value); // TODO: Wrong! This function is has acquire semantics. -} - -} - -// Old code kept here for reference in case we need the parts with __asm__ __volatile__. -#if 0 -LONG SyncInterlockedIncrement(LONG *Dest) +#ifdef __clang__ +template +_Atomic(T)* ToC11Atomic(volatile T* loc) { -#if defined(__GNUC__) && defined (__GNUC_MINOR__) && ((4 < __GNUC__) || (4 == __GNUC__ && 1 <= __GNUC_MINOR__)) - return __sync_add_and_fetch(Dest, 1); -#else - register int result; - __asm__ __volatile__("lock; xadd %0,%1" - : "=r" (result), "=m" (*Dest) - : "0" (1), "m" (*Dest) - : "memory"); - return result; -#endif + return (_Atomic(T)*) loc; } -LONG SyncInterlockedExchangeAdd(LONG *Dest, LONG Val) -{ -#if defined(__GNUC__) && defined (__GNUC_MINOR__) && ((4 < __GNUC__) || (4 == __GNUC__ && 1 <= __GNUC_MINOR__)) - return __sync_add_and_fetch(Dest, Val); -#else - register int result; - __asm__ __volatile__("lock; xadd %0,%1" - : "=r" (result), "=m" (*Dest) - : "0" (Val), "m" (*Dest) - : "memory"); - return result; -#endif -} - -LONG SyncInterlockedExchange(LONG *Dest, LONG Val) -{ -#if defined(__GNUC__) && defined (__GNUC_MINOR__) && ((4 < __GNUC__) || (4 == __GNUC__ && 1 <= __GNUC_MINOR__)) - return __sync_lock_test_and_set(Dest, Val); -#else - register int result; - __asm__ __volatile__("lock; xchg %0,%1" - : "=r" (result), "=m" (*Dest) - : "0" (Val), "m" (*Dest) - : "memory"); - return result; -#endif -} +#define __atomic_load_n(p, m) __c11_atomic_load(ToC11Atomic(p), m) +#define __atomic_store_n(p, v, m) __c11_atomic_store(ToC11Atomic(p), v, m) +#define __atomic_exchange_n(p, v, m) __c11_atomic_exchange(ToC11Atomic(p), v, m) #endif +#ifndef __ATOMIC_RELAXED +#error __ATOMIC_RELAXED not defined; your compiler version is too old. +#endif + +template +inline T AtomicLoad(volatile T& src) { + return __atomic_load_n(&src, __ATOMIC_RELAXED); +} + +template +inline T AtomicLoadAcquire(volatile T& src) { + return __atomic_load_n(&src, __ATOMIC_ACQUIRE); +} + +template +inline void AtomicStore(volatile T& dest, U value) { + __atomic_store_n(&dest, value, __ATOMIC_RELAXED); +} + +template +inline void AtomicStoreRelease(volatile T& dest, U value) { + __atomic_store_n(&dest, value, __ATOMIC_RELEASE); +} + +template +inline T* AtomicExchangeAcquire(T* volatile& loc, U newval) { + return __atomic_exchange_n(&loc, newval, __ATOMIC_ACQ_REL); +} + +} + #endif diff --git a/Source/Core/Common/Src/Atomic_Win32.h b/Source/Core/Common/Src/Atomic_Win32.h index 1b05f8e777..7ce1381938 100644 --- a/Source/Core/Common/Src/Atomic_Win32.h +++ b/Source/Core/Common/Src/Atomic_Win32.h @@ -31,7 +31,7 @@ namespace Common { inline void AtomicAdd(volatile u32& target, u32 value) { - InterlockedExchangeAdd((volatile LONG*)&target, (LONG)value); + _InterlockedExchangeAdd((volatile LONG*)&target, (LONG)value); } inline void AtomicAnd(volatile u32& target, u32 value) { @@ -39,32 +39,43 @@ inline void AtomicAnd(volatile u32& target, u32 value) { } inline void AtomicIncrement(volatile u32& target) { - InterlockedIncrement((volatile LONG*)&target); + _InterlockedIncrement((volatile LONG*)&target); } inline void AtomicDecrement(volatile u32& target) { - InterlockedDecrement((volatile LONG*)&target); -} - -inline u32 AtomicLoad(volatile u32& src) { - return src; // 32-bit reads are always atomic. -} -inline u32 AtomicLoadAcquire(volatile u32& src) { - u32 result = src; // 32-bit reads are always atomic. - _ReadBarrier(); // Compiler instruction only. x86 loads always have acquire semantics. - return result; + _InterlockedDecrement((volatile LONG*)&target); } inline void AtomicOr(volatile u32& target, u32 value) { _InterlockedOr((volatile LONG*)&target, (LONG)value); } -inline void AtomicStore(volatile u32& dest, u32 value) { - dest = value; // 32-bit writes are always atomic. +template +inline T AtomicLoad(volatile T& src) { + return src; // 32-bit reads are always atomic. } -inline void AtomicStoreRelease(volatile u32& dest, u32 value) { + +template +inline T AtomicLoadAcquire(volatile T& src) { + T result = src; // 32-bit reads are always atomic. + _ReadBarrier(); // Compiler instruction only. x86 loads always have acquire semantics. + return result; +} + +template +inline void AtomicStore(volatile T& dest, U value) { + dest = (T) value; // 32-bit writes are always atomic. +} + +template +inline void AtomicStoreRelease(volatile T& dest, U value) { _WriteBarrier(); // Compiler instruction only. x86 stores always have release semantics. - dest = value; // 32-bit writes are always atomic. + dest = (T) value; // 32-bit writes are always atomic. +} + +template +inline T* AtomicExchangeAcquire(T* volatile& loc, U newval) { + return (T*) _InterlockedExchangePointer_acq((void* volatile*) &loc, (void*) newval); } } diff --git a/Source/Core/Common/Src/BreakPoints.cpp b/Source/Core/Common/Src/BreakPoints.cpp index 57d1b06538..1dee12ffd1 100644 --- a/Source/Core/Common/Src/BreakPoints.cpp +++ b/Source/Core/Common/Src/BreakPoints.cpp @@ -12,16 +12,16 @@ bool BreakPoints::IsAddressBreakPoint(u32 _iAddress) { - for (TBreakPoints::iterator i = m_BreakPoints.begin(); i != m_BreakPoints.end(); ++i) - if (i->iAddress == _iAddress) + for (auto& bp : m_BreakPoints) + if (bp.iAddress == _iAddress) return true; return false; } bool BreakPoints::IsTempBreakPoint(u32 _iAddress) { - for (TBreakPoints::iterator i = m_BreakPoints.begin(); i != m_BreakPoints.end(); ++i) - if (i->iAddress == _iAddress && i->bTemporary) + for (auto& bp : m_BreakPoints) + if (bp.iAddress == _iAddress && bp.bTemporary) return true; return false; } @@ -29,29 +29,28 @@ bool BreakPoints::IsTempBreakPoint(u32 _iAddress) BreakPoints::TBreakPointsStr BreakPoints::GetStrings() const { TBreakPointsStr bps; - for (TBreakPoints::const_iterator i = m_BreakPoints.begin(); - i != m_BreakPoints.end(); ++i) + for (const auto& bp : m_BreakPoints) { - if (!i->bTemporary) + if (!bp.bTemporary) { - std::stringstream bp; - bp << std::hex << i->iAddress << " " << (i->bOn ? "n" : ""); - bps.push_back(bp.str()); + std::stringstream ss; + ss << std::hex << bp.iAddress << " " << (bp.bOn ? "n" : ""); + bps.push_back(ss.str()); } } return bps; } -void BreakPoints::AddFromStrings(const TBreakPointsStr& bps) +void BreakPoints::AddFromStrings(const TBreakPointsStr& bpstrs) { - for (TBreakPointsStr::const_iterator i = bps.begin(); i != bps.end(); ++i) + for (const auto& bpstr : bpstrs) { TBreakPoint bp; - std::stringstream bpstr; - bpstr << std::hex << *i; - bpstr >> bp.iAddress; - bp.bOn = i->find("n") != i->npos; + std::stringstream ss; + ss << std::hex << bpstr; + ss >> bp.iAddress; + bp.bOn = bpstr.find("n") != bpstr.npos; bp.bTemporary = false; Add(bp); } @@ -108,42 +107,41 @@ void BreakPoints::Clear() } ); } - + m_BreakPoints.clear(); } MemChecks::TMemChecksStr MemChecks::GetStrings() const { TMemChecksStr mcs; - for (TMemChecks::const_iterator i = m_MemChecks.begin(); - i != m_MemChecks.end(); ++i) + for (const auto& bp : m_MemChecks) { std::stringstream mc; - mc << std::hex << i->StartAddress; - mc << " " << (i->bRange ? i->EndAddress : i->StartAddress) << " " << - (i->bRange ? "n" : "") << (i->OnRead ? "r" : "") << - (i->OnWrite ? "w" : "") << (i->Log ? "l" : "") << (i->Break ? "p" : ""); + mc << std::hex << bp.StartAddress; + mc << " " << (bp.bRange ? bp.EndAddress : bp.StartAddress) << " " << + (bp.bRange ? "n" : "") << (bp.OnRead ? "r" : "") << + (bp.OnWrite ? "w" : "") << (bp.Log ? "l" : "") << (bp.Break ? "p" : ""); mcs.push_back(mc.str()); } return mcs; } -void MemChecks::AddFromStrings(const TMemChecksStr& mcs) +void MemChecks::AddFromStrings(const TMemChecksStr& mcstrs) { - for (TMemChecksStr::const_iterator i = mcs.begin(); i != mcs.end(); ++i) + for (const auto& mcstr : mcstrs) { TMemCheck mc; - std::stringstream mcstr; - mcstr << std::hex << *i; - mcstr >> mc.StartAddress; - mc.bRange = i->find("n") != i->npos; - mc.OnRead = i->find("r") != i->npos; - mc.OnWrite = i->find("w") != i->npos; - mc.Log = i->find("l") != i->npos; - mc.Break = i->find("p") != i->npos; + std::stringstream ss; + ss << std::hex << mcstr; + ss >> mc.StartAddress; + mc.bRange = mcstr.find("n") != mcstr.npos; + mc.OnRead = mcstr.find("r") != mcstr.npos; + mc.OnWrite = mcstr.find("w") != mcstr.npos; + mc.Log = mcstr.find("l") != mcstr.npos; + mc.Break = mcstr.find("p") != mcstr.npos; if (mc.bRange) - mcstr >> mc.EndAddress; + ss >> mc.EndAddress; else mc.EndAddress = mc.StartAddress; Add(mc); @@ -170,15 +168,15 @@ void MemChecks::Remove(u32 _Address) TMemCheck *MemChecks::GetMemCheck(u32 address) { - for (TMemChecks::iterator i = m_MemChecks.begin(); i != m_MemChecks.end(); ++i) + for (auto& bp : m_MemChecks) { - if (i->bRange) + if (bp.bRange) { - if (address >= i->StartAddress && address <= i->EndAddress) - return &(*i); + if (address >= bp.StartAddress && address <= bp.EndAddress) + return &(bp); } - else if (i->StartAddress == address) - return &(*i); + else if (bp.StartAddress == address) + return &(bp); } // none found diff --git a/Source/Core/Common/Src/BreakPoints.h b/Source/Core/Common/Src/BreakPoints.h index cc4f1fcbfb..a17cce5341 100644 --- a/Source/Core/Common/Src/BreakPoints.h +++ b/Source/Core/Common/Src/BreakPoints.h @@ -8,7 +8,7 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" class DebugInterface; @@ -67,7 +67,7 @@ public: void Remove(u32 _iAddress); void Clear(); - void DeleteByAddress(u32 _Address); + void DeleteByAddress(u32 _Address); private: TBreakPoints m_BreakPoints; @@ -93,7 +93,7 @@ public: // memory breakpoint TMemCheck *GetMemCheck(u32 address); - void Remove(u32 _Address); + void Remove(u32 _Address); void Clear() { m_MemChecks.clear(); }; }; diff --git a/Source/Core/Common/Src/CDUtils.cpp b/Source/Core/Common/Src/CDUtils.cpp index 9a302b9189..569ceb3c3b 100644 --- a/Source/Core/Common/Src/CDUtils.cpp +++ b/Source/Core/Common/Src/CDUtils.cpp @@ -211,34 +211,27 @@ std::vector cdio_get_devices () // Returns true if device is a cdrom/dvd drive bool cdio_is_cdrom(std::string device) { -#ifdef __linux__ +#ifndef _WIN32 // Resolve symbolic links. This allows symbolic links to valid // drives to be passed from the command line with the -e flag. - char *devname = realpath(device.c_str(), NULL); + char resolved_path[MAX_PATH]; + char *devname = realpath(device.c_str(), resolved_path); if (!devname) return false; + device = devname; #endif std::vector devices = cdio_get_devices(); bool res = false; - for (unsigned int i = 0; i < devices.size(); i++) + for (auto& odevice : devices) { -#ifdef __linux__ - if (strncmp(devices[i].c_str(), devname, MAX_PATH) == 0) -#else - if (strncmp(devices[i].c_str(), device.c_str(), MAX_PATH) == 0) -#endif + if (strncmp(odevice.c_str(), device.c_str(), MAX_PATH) == 0) { res = true; break; } } -#ifdef __linux__ - if (devname) - free(devname); -#endif - devices.clear(); return res; } diff --git a/Source/Core/Common/Src/CDUtils.h b/Source/Core/Common/Src/CDUtils.h index 34b41a0d4f..a458477fef 100644 --- a/Source/Core/Common/Src/CDUtils.h +++ b/Source/Core/Common/Src/CDUtils.h @@ -1,10 +1,8 @@ #ifndef _CDUTILS_H_ #define _CDUTILS_H_ -#include #include #include -#include // Returns a pointer to an array of strings with the device names std::vector cdio_get_devices(); diff --git a/Source/Core/Common/Src/CPUDetect.h b/Source/Core/Common/Src/CPUDetect.h index be6ce34985..967be0949b 100644 --- a/Source/Core/Common/Src/CPUDetect.h +++ b/Source/Core/Common/Src/CPUDetect.h @@ -41,7 +41,14 @@ struct CPUInfo bool bLZCNT; bool bSSE4A; bool bAVX; + bool bFMA; bool bAES; + // FXSAVE/FXRSTOR + bool bFXSR; + // This flag indicates that the hardware supports some mode + // in which denormal inputs _and_ outputs are automatically set to (signed) zero. + // TODO: ARM + bool bFlushToZero; bool bLAHFSAHF64; bool bLongMode; diff --git a/Source/Core/Common/Src/ChunkFile.h b/Source/Core/Common/Src/ChunkFile.h index 6fed73a7ed..d7aeba0558 100644 --- a/Source/Core/Common/Src/ChunkFile.h +++ b/Source/Core/Common/Src/ChunkFile.h @@ -16,6 +16,7 @@ // - Serialization code for anything complex has to be manually written. #include +#include #include #include #include @@ -25,6 +26,21 @@ #include "Common.h" #include "FileUtil.h" +// ewww +#if _LIBCPP_VERSION +#define IsTriviallyCopyable(T) std::is_trivially_copyable::value +#elif __GNUC__ +#define IsTriviallyCopyable(T) std::has_trivial_copy_constructor::value +#elif _MSC_VER >= 1800 +// work around bug +#define IsTriviallyCopyable(T) (std::is_trivially_copyable::value || std::is_pod::value) +#elif defined(_MSC_VER) +#define IsTriviallyCopyable(T) std::has_trivial_copy::value +#else +#error No version of is_trivially_copyable +#endif + + template struct LinkedListItem : public T { @@ -71,13 +87,41 @@ public: } break; + case MODE_WRITE: + case MODE_MEASURE: + case MODE_VERIFY: + for (auto& elem : x) + { + Do(elem.first); + Do(elem.second); + } + break; + } + } + + template + void Do(std::set& x) + { + u32 count = (u32)x.size(); + Do(count); + + switch (mode) + { + case MODE_READ: + for (x.clear(); count != 0; --count) + { + V value; + Do(value); + x.insert(value); + } + break; + case MODE_WRITE: case MODE_MEASURE: case MODE_VERIFY: for (auto itr = x.begin(); itr != x.end(); ++itr) { - Do(itr->first); - Do(itr->second); + Do(*itr); } break; } @@ -90,8 +134,8 @@ public: Do(size); x.resize(size); - for (auto itr = x.begin(); itr != x.end(); ++itr) - Do(*itr); + for (auto& elem : x) + Do(elem); } template @@ -118,6 +162,13 @@ public: DoContainer(x); } + template + void Do(std::pair& x) + { + Do(x.first); + Do(x.second); + } + template void DoArray(T* x, u32 count) { @@ -128,12 +179,10 @@ public: template void Do(T& x) { - // Ideally this would be std::is_trivially_copyable, but not enough support yet - static_assert(std::is_pod::value, "Only sane for POD types"); - + static_assert(IsTriviallyCopyable(T), "Only sane for trivially copyable types"); DoVoid((void*)&x, sizeof(x)); } - + template void DoPOD(T& x) { @@ -144,10 +193,12 @@ public: void DoPointer(T*& x, T* const base) { // pointers can be more than 2^31 apart, but you're using this function wrong if you need that much range - s32 offset = x - base; + ptrdiff_t offset = x - base; Do(offset); if (mode == MODE_READ) + { x = base + offset; + } } // Let's pretend std::list doesn't exist! @@ -271,7 +322,7 @@ public: if (!File::Exists(_rFilename)) return false; - + // Check file size const u64 fileSize = File::GetSize(_rFilename); static const u64 headerSize = sizeof(SChunkHeader); @@ -324,7 +375,7 @@ public: u8* ptr = &buffer[0]; PointerWrap p(&ptr, PointerWrap::MODE_READ); _class.DoState(p); - + INFO_LOG(COMMON, "ChunkReader: Done loading %s" , _rFilename.c_str()); return true; } diff --git a/Source/Core/Common/Src/ColorUtil.cpp b/Source/Core/Common/Src/ColorUtil.cpp index f338fb3f47..b23da3a05b 100644 --- a/Source/Core/Common/Src/ColorUtil.cpp +++ b/Source/Core/Common/Src/ColorUtil.cpp @@ -40,4 +40,41 @@ u32 Decode5A3(u16 val) return (a << 24) | (r << 16) | (g << 8) | b; } +void decode5A3image(u32* dst, u16* src, int width, int height) +{ + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + for (int iy = 0; iy < 4; iy++, src += 4) + { + for (int ix = 0; ix < 4; ix++) + { + u32 RGBA = Decode5A3(Common::swap16(src[ix])); + dst[(y + iy) * width + (x + ix)] = RGBA; + } + } + } + } +} + +void decodeCI8image(u32* dst, u8* src, u16* pal, int width, int height) +{ + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 8) + { + for (int iy = 0; iy < 4; iy++, src += 8) + { + u32 *tdst = dst+(y+iy)*width+x; + for (int ix = 0; ix < 8; ix++) + { + // huh, this seems wrong. CI8, not 5A3, no? + tdst[ix] = ColorUtil::Decode5A3(Common::swap16(pal[src[ix]])); + } + } + } + } +} + } // namespace diff --git a/Source/Core/Common/Src/ColorUtil.h b/Source/Core/Common/Src/ColorUtil.h index 8b666f1f5c..010d8b1a5c 100644 --- a/Source/Core/Common/Src/ColorUtil.h +++ b/Source/Core/Common/Src/ColorUtil.h @@ -8,7 +8,8 @@ namespace ColorUtil { -u32 Decode5A3(u16 val); +void decode5A3image(u32* dst, u16* src, int width, int height); +void decodeCI8image(u32* dst, u8* src, u16* pal, int width, int height); } // namespace diff --git a/Source/Core/Common/Src/Common.h b/Source/Core/Common/Src/Common.h index 9a1ebab8e9..6556f1fd17 100644 --- a/Source/Core/Common/Src/Common.h +++ b/Source/Core/Common/Src/Common.h @@ -13,7 +13,10 @@ #include // SVN version number +extern const char *scm_desc_str; +extern const char *scm_branch_str; extern const char *scm_rev_str; +extern const char *scm_rev_git_str; extern const char *netplay_dolphin_ver; // Force enable logging in the right modes. For some reason, something had changed @@ -25,20 +28,27 @@ extern const char *netplay_dolphin_ver; #define STACKALIGN +#if __cplusplus >= 201103 || defined(_MSC_VER) || defined(__GXX_EXPERIMENTAL_CXX0X__) +#define HAVE_CXX11_SYNTAX 1 +#endif + +#if HAVE_CXX11_SYNTAX // An inheritable class to disallow the copy constructor and operator= functions class NonCopyable { protected: NonCopyable() {} + NonCopyable(const NonCopyable&&) {} + void operator=(const NonCopyable&&) {} private: - NonCopyable(const NonCopyable&); - void operator=(const NonCopyable&); + NonCopyable(NonCopyable&); + NonCopyable& operator=(NonCopyable& other); }; +#endif #include "Log.h" #include "CommonTypes.h" #include "MsgHandler.h" -#include "CommonFuncs.h" #ifdef __APPLE__ // The Darwin ABI requires that stack frames be aligned to 16-byte boundaries. @@ -89,14 +99,24 @@ private: #endif // Windows compatibility +#define _M_64BIT defined(_LP64) || defined(_WIN64) #ifndef _WIN32 #include #define MAX_PATH PATH_MAX -#ifdef _LP64 +#ifdef __x86_64__ #define _M_X64 1 -#else +#endif +#ifdef __i386__ #define _M_IX86 1 #endif +#ifdef __arm__ +#define _M_ARM 1 +#define _M_GENERIC 1 +#endif +#ifdef __mips__ +#define _M_MIPS 1 +#define _M_GENERIC 1 +#endif #define __forceinline inline __attribute__((always_inline)) #define GC_ALIGNED16(x) __attribute__((aligned(16))) x #define GC_ALIGNED32(x) __attribute__((aligned(32))) x @@ -153,4 +173,6 @@ enum EMUSTATE_CHANGE EMUSTATE_CHANGE_STOP }; +#include "CommonFuncs.h" + #endif // _COMMON_H_ diff --git a/Source/Core/Common/Src/CommonFuncs.h b/Source/Core/Common/Src/CommonFuncs.h index 73320a3ac2..63bdc04dfb 100644 --- a/Source/Core/Common/Src/CommonFuncs.h +++ b/Source/Core/Common/Src/CommonFuncs.h @@ -12,17 +12,31 @@ #define SLEEP(x) usleep(x*1000) #endif -template struct CompileTimeAssert; -template<> struct CompileTimeAssert {}; +#include +#include +#include "Common.h" + +// Will fail to compile on a non-array: +// TODO: make this a function when constexpr is available +template +struct ArraySizeImpl : public std::extent +{ static_assert(std::is_array::value, "is array"); }; + +#define ArraySize(x) ArraySizeImpl::value #define b2(x) ( (x) | ( (x) >> 1) ) #define b4(x) ( b2(x) | ( b2(x) >> 2) ) #define b8(x) ( b4(x) | ( b4(x) >> 4) ) -#define b16(x) ( b8(x) | ( b8(x) >> 8) ) +#define b16(x) ( b8(x) | ( b8(x) >> 8) ) #define b32(x) (b16(x) | (b16(x) >>16) ) #define ROUND_UP_POW2(x) (b32(x - 1) + 1) -#if defined __GNUC__ && !defined __SSSE3__ && !defined _M_GENERIC +#ifndef __GNUC_PREREQ + #define __GNUC_PREREQ(a, b) 0 +#endif + +#if (defined __GNUC__ && !__GNUC_PREREQ(4,9)) \ + && !defined __SSSE3__ && !defined _M_GENERIC #include static __inline __m128i __attribute__((__always_inline__)) _mm_shuffle_epi8(__m128i a, __m128i mask) @@ -52,7 +66,7 @@ _mm_shuffle_epi8(__m128i a, __m128i mask) #else #define Crash() {asm ("int $3");} #endif - #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) + // GCC 4.8 defines all the rotate functions now // Small issue with GCC's lrotl/lrotr intrinsics is they are still 32bit while we require 64bit #ifndef _rotl @@ -86,12 +100,12 @@ inline u64 _rotr64(u64 x, unsigned int shift){ #define unlink _unlink #define snprintf _snprintf #define vscprintf _vscprintf - + // Locale Cross-Compatibility #define locale_t _locale_t #define freelocale _free_locale #define newlocale(mask, locale, base) _create_locale(mask, locale) - + #define LC_GLOBAL_LOCALE ((locale_t)-1) #define LC_ALL_MASK LC_ALL #define LC_COLLATE_MASK LC_COLLATE @@ -99,7 +113,7 @@ inline u64 _rotr64(u64 x, unsigned int shift){ #define LC_MONETARY_MASK LC_MONETARY #define LC_NUMERIC_MASK LC_NUMERIC #define LC_TIME_MASK LC_TIME - + inline locale_t uselocale(locale_t new_locale) { // Retrieve the current per thread locale setting @@ -175,8 +189,8 @@ inline u16 swap16(u16 _data) {return _byteswap_ushort(_data);} inline u32 swap32(u32 _data) {return _byteswap_ulong (_data);} inline u64 swap64(u64 _data) {return _byteswap_uint64(_data);} #elif _M_ARM -inline u16 swap16 (u16 _data) { u32 data = _data; __asm__ ("rev16 %0, %1\n" : "=l" (data) : "l" (data)); return (u16)data;} -inline u32 swap32 (u32 _data) {__asm__ ("rev %0, %1\n" : "=l" (_data) : "l" (_data)); return _data;} +inline u16 swap16 (u16 _data) { u32 data = _data; __asm__ ("rev16 %0, %1\n" : "=l" (data) : "l" (data)); return (u16)data;} +inline u32 swap32 (u32 _data) {__asm__ ("rev %0, %1\n" : "=l" (_data) : "l" (_data)); return _data;} inline u64 swap64(u64 _data) {return ((u64)swap32(_data) << 32) | swap32(_data >> 32);} #elif __linux__ inline u16 swap16(u16 _data) {return bswap_16(_data);} @@ -233,7 +247,7 @@ template inline T FromBigEndian(T data) { //static_assert(std::is_arithmetic::value, "function only makes sense with arithmetic types"); - + swap(reinterpret_cast(&data)); return data; } diff --git a/Source/Core/Common/Src/CommonPaths.h b/Source/Core/Common/Src/CommonPaths.h index 1f3787daf4..d171bcb0a7 100644 --- a/Source/Core/Common/Src/CommonPaths.h +++ b/Source/Core/Common/Src/CommonPaths.h @@ -40,18 +40,13 @@ #define SYSDATA_DIR "Sys" #elif defined __APPLE__ #define SYSDATA_DIR "Contents/Resources/Sys" - #define SHARED_USER_DIR File::GetBundleDirectory() + \ - DIR_SEP USERDATA_DIR DIR_SEP #elif defined ANDROID #define SYSDATA_DIR "/sdcard/dolphin-emu" - #define SHARED_USER_DIR SYSDATA_DIR #else #ifdef DATA_DIR #define SYSDATA_DIR DATA_DIR "sys" - #define SHARED_USER_DIR DATA_DIR USERDATA_DIR DIR_SEP #else #define SYSDATA_DIR "sys" - #define SHARED_USER_DIR ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP #endif #endif @@ -61,28 +56,29 @@ #define JAP_DIR "JAP" // Subdirs in the User dir returned by GetUserPath(D_USER_IDX) -#define GC_USER_DIR "GC" +#define GC_USER_DIR "GC" #define WII_USER_DIR "Wii" -#define CONFIG_DIR "Config" -#define GAMECONFIG_DIR "GameConfig" -#define MAPS_DIR "Maps" -#define CACHE_DIR "Cache" +#define CONFIG_DIR "Config" +#define GAMESETTINGS_DIR "GameSettings" +#define MAPS_DIR "Maps" +#define CACHE_DIR "Cache" #define SHADERCACHE_DIR "ShaderCache" #define STATESAVES_DIR "StateSaves" #define SCREENSHOTS_DIR "ScreenShots" -#define OPENCL_DIR "OpenCL" -#define LOAD_DIR "Load" +#define OPENCL_DIR "OpenCL" +#define LOAD_DIR "Load" #define HIRES_TEXTURES_DIR LOAD_DIR DIR_SEP "Textures" -#define DUMP_DIR "Dump" -#define DUMP_TEXTURES_DIR DUMP_DIR DIR_SEP "Textures" -#define DUMP_FRAMES_DIR DUMP_DIR DIR_SEP "Frames" -#define DUMP_AUDIO_DIR DUMP_DIR DIR_SEP "Audio" -#define DUMP_DSP_DIR DUMP_DIR DIR_SEP "DSP" -#define LOGS_DIR "Logs" -#define MAIL_LOGS_DIR LOGS_DIR DIR_SEP "Mail" +#define DUMP_DIR "Dump" +#define DUMP_TEXTURES_DIR "Textures" +#define DUMP_FRAMES_DIR "Frames" +#define DUMP_AUDIO_DIR "Audio" +#define DUMP_DSP_DIR "DSP" +#define LOGS_DIR "Logs" +#define MAIL_LOGS_DIR "Mail" #define SHADERS_DIR "Shaders" #define WII_SYSCONF_DIR "shared2" DIR_SEP "sys" -#define THEMES_DIR "Themes" +#define WII_WC24CONF_DIR "shared2" DIR_SEP "wc24" +#define THEMES_DIR "Themes" // Filenames // Files in the directory returned by GetUserPath(D_CONFIG_IDX) @@ -118,10 +114,6 @@ #define WII_STATE "state.dat" #define WII_SETTING "setting.txt" -#define WII_EUR_SETTING "setting-eur.txt" -#define WII_USA_SETTING "setting-usa.txt" -#define WII_JAP_SETTING "setting-jpn.txt" -#define WII_KOR_SETTING "setting-kor.txt" #define GECKO_CODE_HANDLER "codehandler.bin" diff --git a/Source/Core/Common/Src/CommonTypes.h b/Source/Core/Common/Src/CommonTypes.h index 600d5b7b72..3eb131c1a1 100644 --- a/Source/Core/Common/Src/CommonTypes.h +++ b/Source/Core/Common/Src/CommonTypes.h @@ -10,33 +10,36 @@ #ifndef _COMMONTYPES_H_ #define _COMMONTYPES_H_ +#include +#include + #ifdef _WIN32 #include -typedef unsigned __int8 u8; -typedef unsigned __int16 u16; -typedef unsigned __int32 u32; -typedef unsigned __int64 u64; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; -typedef signed __int8 s8; -typedef signed __int16 s16; -typedef signed __int32 s32; -typedef signed __int64 s64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; #else #ifndef GEKKO -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; -typedef signed char s8; -typedef signed short s16; -typedef signed int s32; -typedef signed long long s64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; #endif // For using windows lock code diff --git a/Source/Core/Common/Src/ConsoleListener.cpp b/Source/Core/Common/Src/ConsoleListener.cpp index 9a924d4beb..fa8780d598 100644 --- a/Source/Core/Common/Src/ConsoleListener.cpp +++ b/Source/Core/Common/Src/ConsoleListener.cpp @@ -3,18 +3,15 @@ // Refer to the license.txt file included. #include // min +#include #include // System: To be able to add strings with "+" #include #include #ifdef _WIN32 #include #include -#else -#include #endif -#include "Common.h" -#include "LogManager.h" // Common #include "ConsoleListener.h" // Common ConsoleListener::ConsoleListener() @@ -90,7 +87,7 @@ bool ConsoleListener::IsOpen() /* LetterSpace: SetConsoleScreenBufferSize and SetConsoleWindowInfo are - dependent on each other, that's the reason for the additional checks. + dependent on each other, that's the reason for the additional checks. */ void ConsoleListener::BufferWidthHeight(int BufferWidth, int BufferHeight, int ScreenWidth, int ScreenHeight, bool BufferFirst) { @@ -229,7 +226,7 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool BytesWritten += cAttrWritten; coordScreen = GetCoordinates(BytesWritten, LBufWidth); - } + } const int OldCursor = ConInfo.dwCursorPosition.Y * ConInfo.dwSize.X + ConInfo.dwCursorPosition.X; COORD Coo = GetCoordinates(OldCursor, LBufWidth); @@ -314,23 +311,23 @@ void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text) } // Clear console screen void ConsoleListener::ClearScreen(bool Cursor) -{ +{ #if defined(_WIN32) - COORD coordScreen = { 0, 0 }; - DWORD cCharsWritten; - CONSOLE_SCREEN_BUFFER_INFO csbi; - DWORD dwConSize; + COORD coordScreen = { 0, 0 }; + DWORD cCharsWritten; + CONSOLE_SCREEN_BUFFER_INFO csbi; + DWORD dwConSize; - HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); - GetConsoleScreenBufferInfo(hConsole, &csbi); + GetConsoleScreenBufferInfo(hConsole, &csbi); dwConSize = csbi.dwSize.X * csbi.dwSize.Y; // Write space to the entire console - FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); - GetConsoleScreenBufferInfo(hConsole, &csbi); + FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); + GetConsoleScreenBufferInfo(hConsole, &csbi); FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); // Reset cursor - if (Cursor) SetConsoleCursorPosition(hConsole, coordScreen); + if (Cursor) SetConsoleCursorPosition(hConsole, coordScreen); #endif } diff --git a/Source/Core/Common/Src/Crypto/aes.h b/Source/Core/Common/Src/Crypto/aes.h deleted file mode 100644 index 8d5059e1be..0000000000 --- a/Source/Core/Common/Src/Crypto/aes.h +++ /dev/null @@ -1,143 +0,0 @@ -/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ -/* ==================================================================== - * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - */ - -#ifndef HEADER_AES_H -#define HEADER_AES_H - -// #include - -#ifdef OPENSSL_NO_AES -#error AES is disabled. -#endif - -#define AES_ENCRYPT 1 -#define AES_DECRYPT 0 - -/* Because array size can't be a const in C, the following two are macros. - Both sizes are in bytes. */ -#define AES_MAXNR 14 -#define AES_BLOCK_SIZE 16 - -#ifdef __cplusplus -extern "C" { -#endif - -/* This should be a hidden type, but EVP requires that the size be known */ -struct aes_key_st -{ -#ifdef AES_LONG - unsigned long rd_key[4 * (AES_MAXNR + 1)]; -#else - unsigned int rd_key[4 * (AES_MAXNR + 1)]; -#endif - int rounds; -}; -typedef struct aes_key_st AES_KEY; - -const char* AES_options(void); - -int AES_set_encrypt_key(const unsigned char* userKey, const int bits, - AES_KEY* key); -int AES_set_decrypt_key(const unsigned char* userKey, const int bits, - AES_KEY* key); - -void AES_encrypt(const unsigned char* in, unsigned char* out, - const AES_KEY* key); -void AES_decrypt(const unsigned char* in, unsigned char* out, - const AES_KEY* key); - -void AES_ecb_encrypt(const unsigned char* in, unsigned char* out, - const AES_KEY* key, const int enc); -void AES_cbc_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, const int enc); -void AES_cfb128_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, int* num, const int enc); -void AES_cfb1_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, int* num, const int enc); -void AES_cfb8_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, int* num, const int enc); -void AES_cfbr_encrypt_block(const unsigned char* in, unsigned char* out, - const int nbits, const AES_KEY* key, - unsigned char* ivec, const int enc); -void AES_ofb128_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, int* num); - - -void AES_ctr128_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY * key, - unsigned char ivec[AES_BLOCK_SIZE], - unsigned char ecount_buf[AES_BLOCK_SIZE], - unsigned int* num); - -/* For IGE, see also http://www.links.org/files/openssl-ige.pdf - NB: the IV is _two_ blocks long */ -void AES_ige_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - unsigned char* ivec, const int enc); - - -/* NB: the IV is _four_ blocks long */ -void AES_bi_ige_encrypt(const unsigned char* in, unsigned char* out, - const unsigned long length, const AES_KEY* key, - const AES_KEY* key2, const unsigned char* ivec, - const int enc); - - -#ifdef __cplusplus -} -#endif - -#endif /* !HEADER_AES_H */ diff --git a/Source/Core/Common/Src/Crypto/aes_cbc.cpp b/Source/Core/Common/Src/Crypto/aes_cbc.cpp deleted file mode 100644 index 780c35a88d..0000000000 --- a/Source/Core/Common/Src/Crypto/aes_cbc.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* crypto/aes/aes_cbc.c -*- mode:C; c-file-style: "eay" -*- */ -/* ==================================================================== - * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - */ - -#ifndef AES_DEBUG -# ifndef NDEBUG -# define NDEBUG -# endif -#endif -#include - -#include "aes.h" -#include "aes_locl.h" - -void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, - const unsigned long length, const AES_KEY *key, - unsigned char *ivec, const int enc) { - - unsigned long n; - unsigned long len = length; - unsigned char tmp[AES_BLOCK_SIZE]; - const unsigned char *iv = ivec; - - assert(in && out && key && ivec); - assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); - - if (AES_ENCRYPT == enc) { - while (len >= AES_BLOCK_SIZE) { - for(n=0; n < AES_BLOCK_SIZE; ++n) - out[n] = in[n] ^ iv[n]; - AES_encrypt(out, out, key); - iv = out; - len -= AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - if (len) { - for(n=0; n < len; ++n) - out[n] = in[n] ^ iv[n]; - for(n=len; n < AES_BLOCK_SIZE; ++n) - out[n] = iv[n]; - AES_encrypt(out, out, key); - iv = out; - } - memcpy(ivec,iv,AES_BLOCK_SIZE); - } else if (in != out) { - while (len >= AES_BLOCK_SIZE) { - AES_decrypt(in, out, key); - for(n=0; n < AES_BLOCK_SIZE; ++n) - out[n] ^= iv[n]; - iv = in; - len -= AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - if (len) { - AES_decrypt(in,tmp,key); - for(n=0; n < len; ++n) - out[n] = tmp[n] ^ iv[n]; - iv = in; - } - memcpy(ivec,iv,AES_BLOCK_SIZE); - } else { - while (len >= AES_BLOCK_SIZE) { - memcpy(tmp, in, AES_BLOCK_SIZE); - AES_decrypt(in, out, key); - for(n=0; n < AES_BLOCK_SIZE; ++n) - out[n] ^= ivec[n]; - memcpy(ivec, tmp, AES_BLOCK_SIZE); - len -= AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - if (len) { - memcpy(tmp, in, AES_BLOCK_SIZE); - AES_decrypt(tmp, out, key); - for(n=0; n < len; ++n) - out[n] ^= ivec[n]; - for(n=len; n < AES_BLOCK_SIZE; ++n) - out[n] = tmp[n]; - memcpy(ivec, tmp, AES_BLOCK_SIZE); - } - } -} diff --git a/Source/Core/Common/Src/Crypto/aes_core.cpp b/Source/Core/Common/Src/Crypto/aes_core.cpp deleted file mode 100644 index ad54bc6006..0000000000 --- a/Source/Core/Common/Src/Crypto/aes_core.cpp +++ /dev/null @@ -1,1159 +0,0 @@ -/* crypto/aes/aes_core.c -*- mode:C; c-file-style: "eay" -*- */ -/** - * rijndael-alg-fst.c - * - * @version 3.0 (December 2000) - * - * Optimised ANSI C code for the Rijndael cipher (now AES) - * - * @author Vincent Rijmen - * @author Antoon Bosselaers - * @author Paulo Barreto - * - * This code is hereby placed in the public domain. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* Note: rewritten a little bit to provide error control and an OpenSSL- - compatible API */ - -#ifndef AES_DEBUG -# ifndef NDEBUG -# define NDEBUG -# endif -#endif -#include - -#include -#include "aes.h" -#include "aes_locl.h" - -/* -Te0[x] = S [x].[02, 01, 01, 03]; -Te1[x] = S [x].[03, 02, 01, 01]; -Te2[x] = S [x].[01, 03, 02, 01]; -Te3[x] = S [x].[01, 01, 03, 02]; - -Td0[x] = Si[x].[0e, 09, 0d, 0b]; -Td1[x] = Si[x].[0b, 0e, 09, 0d]; -Td2[x] = Si[x].[0d, 0b, 0e, 09]; -Td3[x] = Si[x].[09, 0d, 0b, 0e]; -Td4[x] = Si[x].[01]; -*/ - -static const u32 Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, -}; -static const u32 Te1[256] = { - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, - 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, - 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, - 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, - 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, - 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, - 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, - 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, - 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, - 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, - 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, - 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, - 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, - 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, - 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, - 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, - 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, - 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, - 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, - 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, - 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, - 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, - 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, - 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, - 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, - 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, - 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, - 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, - 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, - 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, - 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, - 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, - 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, - 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, - 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, - 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, - 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, - 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, - 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, - 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, - 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, - 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, - 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, - 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, - 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, - 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, - 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, - 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, - 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, - 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, - 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, - 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, -}; -static const u32 Te2[256] = { - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, - 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, - 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, - 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, - 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, - 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, - 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, - 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, - 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, - 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, - 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, - 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, - 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, - 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, - 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, - 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, - 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, - 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, - 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, - 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, - 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, - 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, - 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, - 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, - 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, - 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, - 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, - 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, - 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, - 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, - 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, - 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, - 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, - 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, - 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, - 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, - 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, - 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, - 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, - 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, - 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, - 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, - 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, - 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, - 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, - 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, - 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, - 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, - 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, - 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, - 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, - 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, -}; -static const u32 Te3[256] = { - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, - 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, - 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, - 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, - 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, - 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, - 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, - 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, - 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, - 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, - 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, - 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, - 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, - 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, - 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, - 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, - 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, - 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, - 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, - 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, - 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, - 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, - 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, - 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, - 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, - 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, - 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, - 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, - 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, - 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, - 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, - 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, - 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, - 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, - 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, - 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, - 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, - 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, - 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, - 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, - 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, - 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, - 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, - 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, - 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, - 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, - 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, - 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, - 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, - 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, - 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, - 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, -}; - -static const u32 Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, -}; -static const u32 Td1[256] = { - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, - 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, - 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, - 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, - 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, - 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, - 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, - 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, - 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, - 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, - 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, - 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, - 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, - 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, - 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, - 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, - 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, - 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, - 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, - 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, - 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, - 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, - 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, - 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, - 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, - 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, - 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, - 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, - 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, - 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, - 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, - 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, - 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, - 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, - 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, - 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, - 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, - 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, - 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, - 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, - 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, - 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, - 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, - 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, - 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, - 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, - 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, - 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, - 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, - 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, - 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, - 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, -}; -static const u32 Td2[256] = { - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, - 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, - 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, - 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, - 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, - 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, - 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, - 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, - 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, - 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, - 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, - 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, - 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, - 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, - 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, - 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, - 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, - 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, - 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, - 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, - 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, - 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, - 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, - 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, - 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, - 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, - 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, - 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, - 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, - 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, - 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, - 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, - 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, - 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, - 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, - 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, - 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, - 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, - 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, - 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, - 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, - 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, - 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, - 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, - 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, - 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, - 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, - 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, - 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, - 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, - 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, - 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, -}; -static const u32 Td3[256] = { - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, - 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, - 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, - 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, - 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, - 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, - 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, - 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, - 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, - 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, - 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, - 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, - 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, - 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, - 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, - 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, - 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, - 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, - 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, - 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, - 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, - 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, - 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, - 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, - 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, - 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, - 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, - 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, - 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, - 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, - 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, - 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, - 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, - 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, - 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, - 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, - 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, - 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, - 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, - 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, - 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, - 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, - 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, - 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, - 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, - 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, - 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, - 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, - 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, - 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, - 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, - 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, -}; -static const u8 Td4[256] = { - 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, - 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, - 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, - 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, - 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, - 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, - 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, - 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, - 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, - 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, - 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, - 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, - 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, - 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, - 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, - 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, - 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, - 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, - 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, - 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, - 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, - 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, - 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, - 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, - 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, - 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, - 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, - 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, - 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, - 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, - 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, - 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, -}; -static const u32 rcon[] = { - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ -}; - -/** - * Expand the cipher key into the encryption key schedule. - */ -int AES_set_encrypt_key(const unsigned char *userKey, const int bits, - AES_KEY *key) { - - u32 *rk; - int i = 0; - u32 temp; - - if (!userKey || !key) - return -1; - if (bits != 128 && bits != 192 && bits != 256) - return -2; - - rk = key->rd_key; - - if (bits==128) - key->rounds = 10; - else if (bits==192) - key->rounds = 12; - else - key->rounds = 14; - - rk[0] = GETU32(userKey ); - rk[1] = GETU32(userKey + 4); - rk[2] = GETU32(userKey + 8); - rk[3] = GETU32(userKey + 12); - if (bits == 128) { - for (;;) { - temp = rk[3]; - rk[4] = rk[0] ^ - (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te0[(temp ) & 0xff] & 0x0000ff00) ^ - (Te1[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - if (++i == 10) { - return 0; - } - rk += 4; - } - } - rk[4] = GETU32(userKey + 16); - rk[5] = GETU32(userKey + 20); - if (bits == 192) { - for (;;) { - temp = rk[ 5]; - rk[ 6] = rk[ 0] ^ - (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te0[(temp ) & 0xff] & 0x0000ff00) ^ - (Te1[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[ 7] = rk[ 1] ^ rk[ 6]; - rk[ 8] = rk[ 2] ^ rk[ 7]; - rk[ 9] = rk[ 3] ^ rk[ 8]; - if (++i == 8) { - return 0; - } - rk[10] = rk[ 4] ^ rk[ 9]; - rk[11] = rk[ 5] ^ rk[10]; - rk += 6; - } - } - rk[6] = GETU32(userKey + 24); - rk[7] = GETU32(userKey + 28); - if (bits == 256) { - for (;;) { - temp = rk[ 7]; - rk[ 8] = rk[ 0] ^ - (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te0[(temp ) & 0xff] & 0x0000ff00) ^ - (Te1[(temp >> 24) ] & 0x000000ff) ^ - rcon[i]; - rk[ 9] = rk[ 1] ^ rk[ 8]; - rk[10] = rk[ 2] ^ rk[ 9]; - rk[11] = rk[ 3] ^ rk[10]; - if (++i == 7) { - return 0; - } - temp = rk[11]; - rk[12] = rk[ 4] ^ - (Te2[(temp >> 24) ] & 0xff000000) ^ - (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^ - (Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^ - (Te1[(temp ) & 0xff] & 0x000000ff); - rk[13] = rk[ 5] ^ rk[12]; - rk[14] = rk[ 6] ^ rk[13]; - rk[15] = rk[ 7] ^ rk[14]; - - rk += 8; - } - } - return 0; -} - -/** - * Expand the cipher key into the decryption key schedule. - */ -int AES_set_decrypt_key(const unsigned char *userKey, const int bits, - AES_KEY *key) { - - u32 *rk; - int i, j, status; - u32 temp; - - /* first, start with an encryption schedule */ - status = AES_set_encrypt_key(userKey, bits, key); - if (status < 0) - return status; - - rk = key->rd_key; - - /* invert the order of the round keys: */ - for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) { - temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; - temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; - temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; - temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; - } - /* apply the inverse MixColumn transform to all round keys but the first and the last: */ - for (i = 1; i < (key->rounds); i++) { - rk += 4; - rk[0] = - Td0[Te1[(rk[0] >> 24) ] & 0xff] ^ - Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^ - Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ - Td3[Te1[(rk[0] ) & 0xff] & 0xff]; - rk[1] = - Td0[Te1[(rk[1] >> 24) ] & 0xff] ^ - Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^ - Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ - Td3[Te1[(rk[1] ) & 0xff] & 0xff]; - rk[2] = - Td0[Te1[(rk[2] >> 24) ] & 0xff] ^ - Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^ - Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ - Td3[Te1[(rk[2] ) & 0xff] & 0xff]; - rk[3] = - Td0[Te1[(rk[3] >> 24) ] & 0xff] ^ - Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^ - Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ - Td3[Te1[(rk[3] ) & 0xff] & 0xff]; - } - return 0; -} - -#ifndef AES_ASM -/* - * Encrypt a single block - * in and out can overlap - */ -void AES_encrypt(const unsigned char *in, unsigned char *out, - const AES_KEY *key) { - - const u32 *rk; - u32 s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - assert(in && out && key); - rk = key->rd_key; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(in ) ^ rk[0]; - s1 = GETU32(in + 4) ^ rk[1]; - s2 = GETU32(in + 8) ^ rk[2]; - s3 = GETU32(in + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; - if (key->rounds > 10) { - /* round 10: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; - if (key->rounds > 12) { - /* round 12: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; - } - } - rk += key->rounds << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = key->rounds >> 1; - for (;;) { - t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ - rk[4]; - t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ - rk[5]; - t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ - rk[6]; - t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ - rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = - Te0[(t0 >> 24) ] ^ - Te1[(t1 >> 16) & 0xff] ^ - Te2[(t2 >> 8) & 0xff] ^ - Te3[(t3 ) & 0xff] ^ - rk[0]; - s1 = - Te0[(t1 >> 24) ] ^ - Te1[(t2 >> 16) & 0xff] ^ - Te2[(t3 >> 8) & 0xff] ^ - Te3[(t0 ) & 0xff] ^ - rk[1]; - s2 = - Te0[(t2 >> 24) ] ^ - Te1[(t3 >> 16) & 0xff] ^ - Te2[(t0 >> 8) & 0xff] ^ - Te3[(t1 ) & 0xff] ^ - rk[2]; - s3 = - Te0[(t3 >> 24) ] ^ - Te1[(t0 >> 16) & 0xff] ^ - Te2[(t1 >> 8) & 0xff] ^ - Te3[(t2 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Te2[(t0 >> 24) ] & 0xff000000) ^ - (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ - (Te1[(t3 ) & 0xff] & 0x000000ff) ^ - rk[0]; - PUTU32(out , s0); - s1 = - (Te2[(t1 >> 24) ] & 0xff000000) ^ - (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ - (Te1[(t0 ) & 0xff] & 0x000000ff) ^ - rk[1]; - PUTU32(out + 4, s1); - s2 = - (Te2[(t2 >> 24) ] & 0xff000000) ^ - (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ - (Te1[(t1 ) & 0xff] & 0x000000ff) ^ - rk[2]; - PUTU32(out + 8, s2); - s3 = - (Te2[(t3 >> 24) ] & 0xff000000) ^ - (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ - (Te1[(t2 ) & 0xff] & 0x000000ff) ^ - rk[3]; - PUTU32(out + 12, s3); -} - -/* - * Decrypt a single block - * in and out can overlap - */ -void AES_decrypt(const unsigned char *in, unsigned char *out, - const AES_KEY *key) { - - const u32 *rk; - u32 s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - assert(in && out && key); - rk = key->rd_key; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(in ) ^ rk[0]; - s1 = GETU32(in + 4) ^ rk[1]; - s2 = GETU32(in + 8) ^ rk[2]; - s3 = GETU32(in + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; - if (key->rounds > 10) { - /* round 10: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; - if (key->rounds > 12) { - /* round 12: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; - } - } - rk += key->rounds << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = key->rounds >> 1; - for (;;) { - t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ - rk[4]; - t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ - rk[5]; - t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ - rk[6]; - t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ - rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = - Td0[(t0 >> 24) ] ^ - Td1[(t3 >> 16) & 0xff] ^ - Td2[(t2 >> 8) & 0xff] ^ - Td3[(t1 ) & 0xff] ^ - rk[0]; - s1 = - Td0[(t1 >> 24) ] ^ - Td1[(t0 >> 16) & 0xff] ^ - Td2[(t3 >> 8) & 0xff] ^ - Td3[(t2 ) & 0xff] ^ - rk[1]; - s2 = - Td0[(t2 >> 24) ] ^ - Td1[(t1 >> 16) & 0xff] ^ - Td2[(t0 >> 8) & 0xff] ^ - Td3[(t3 ) & 0xff] ^ - rk[2]; - s3 = - Td0[(t3 >> 24) ] ^ - Td1[(t2 >> 16) & 0xff] ^ - Td2[(t1 >> 8) & 0xff] ^ - Td3[(t0 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Td4[(t0 >> 24) ] << 24) ^ - (Td4[(t3 >> 16) & 0xff] << 16) ^ - (Td4[(t2 >> 8) & 0xff] << 8) ^ - (Td4[(t1 ) & 0xff]) ^ - rk[0]; - PUTU32(out , s0); - s1 = - (Td4[(t1 >> 24) ] << 24) ^ - (Td4[(t0 >> 16) & 0xff] << 16) ^ - (Td4[(t3 >> 8) & 0xff] << 8) ^ - (Td4[(t2 ) & 0xff]) ^ - rk[1]; - PUTU32(out + 4, s1); - s2 = - (Td4[(t2 >> 24) ] << 24) ^ - (Td4[(t1 >> 16) & 0xff] << 16) ^ - (Td4[(t0 >> 8) & 0xff] << 8) ^ - (Td4[(t3 ) & 0xff]) ^ - rk[2]; - PUTU32(out + 8, s2); - s3 = - (Td4[(t3 >> 24) ] << 24) ^ - (Td4[(t2 >> 16) & 0xff] << 16) ^ - (Td4[(t1 >> 8) & 0xff] << 8) ^ - (Td4[(t0 ) & 0xff]) ^ - rk[3]; - PUTU32(out + 12, s3); -} - -#endif /* AES_ASM */ diff --git a/Source/Core/Common/Src/Crypto/aes_locl.h b/Source/Core/Common/Src/Crypto/aes_locl.h deleted file mode 100644 index c222ed744b..0000000000 --- a/Source/Core/Common/Src/Crypto/aes_locl.h +++ /dev/null @@ -1,88 +0,0 @@ -/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ -/* ==================================================================== - * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - */ - -#ifndef HEADER_AES_LOCL_H -#define HEADER_AES_LOCL_H - - -#ifdef OPENSSL_NO_AES -#error AES is disabled. -#endif - -#include -#include -#include - -#if defined (_MSC_VER) && (defined (_M_IX86) || defined (_M_AMD64) || defined (_M_X64)) -# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) -# define GETU32(p) SWAP(*((u32*)(p))) -# define PUTU32(ct, st) {*((u32*)(ct)) = SWAP((st));} -#else -# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) -# define PUTU32(ct, st) {(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st);} -#endif - -#ifdef AES_LONG -typedef unsigned long u32; -#else -typedef unsigned int u32; -#endif -typedef unsigned short u16; -typedef unsigned char u8; - -#define MAXKC (256 / 32) -#define MAXKB (256 / 8) -#define MAXNR 14 - -/* This controls loop-unrolling in aes_core.c */ -#undef FULL_UNROLL - -#endif /* !HEADER_AES_LOCL_H */ diff --git a/Source/Core/Common/Src/Crypto/ec.cpp b/Source/Core/Common/Src/Crypto/ec.cpp index 3f8e460ee1..d360a5b659 100644 --- a/Source/Core/Common/Src/Crypto/ec.cpp +++ b/Source/Core/Common/Src/Crypto/ec.cpp @@ -1,3 +1,7 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + // Copyright 2007,2008 Segher Boessenkool // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt @@ -40,7 +44,7 @@ static u8 ec_G[60] = printf("\n"); }*/ -static void elt_copy(u8 *d, u8 *a) +static void elt_copy(u8 *d, const u8 *a) { memcpy(d, a, 30); } @@ -303,7 +307,7 @@ static void point_add(u8 *r, u8 *p, u8 *q) elt_add(ry, s, rx); } -static void point_mul(u8 *d, u8 *a, u8 *b) // a is bignum +void point_mul(u8 *d, const u8 *a, u8 *b) // a is bignum { u32 i; u8 mask; @@ -319,7 +323,7 @@ static void point_mul(u8 *d, u8 *a, u8 *b) // a is bignum } } -void silly_random(u8 * rndArea, u8 count) +void silly_random(u8 * rndArea, u8 count) { u16 i; srand((unsigned) (time(NULL))); @@ -327,10 +331,10 @@ void silly_random(u8 * rndArea, u8 count) for(i=0;i // bignum int bn_compare(u8 *a, u8 *b, u32 n); @@ -13,9 +13,10 @@ void bn_add(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); void bn_mul(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); void bn_inv(u8 *d, u8 *a, u8 *N, u32 n); // only for prime N void bn_exp(u8 *d, u8 *a, u8 *N, u32 n, u8 *e, u32 en); +void point_mul(u8 *d, const u8 *a, u8 *b); -void generate_ecdsa(u8 *R, u8 *S, u8 *k, u8 *hash); +void generate_ecdsa(u8 *R, u8 *S, const u8 *k, u8 *hash); -void ec_priv_to_pub(u8 *k, u8 *Q); +void ec_priv_to_pub(const u8 *k, u8 *Q); #endif diff --git a/Source/Core/Common/Src/DebugInterface.h b/Source/Core/Common/Src/DebugInterface.h index 317cd0bb43..81b2d0852b 100644 --- a/Source/Core/Common/Src/DebugInterface.h +++ b/Source/Core/Common/Src/DebugInterface.h @@ -2,7 +2,6 @@ #define _DEBUGINTERFACE_H #include -#include class DebugInterface { diff --git a/Source/Core/Common/Src/ExtendedTrace.cpp b/Source/Core/Common/Src/ExtendedTrace.cpp index 08740c3c95..379b2c4f03 100644 --- a/Source/Core/Common/Src/ExtendedTrace.cpp +++ b/Source/Core/Common/Src/ExtendedTrace.cpp @@ -30,7 +30,7 @@ using namespace std; void PCSTR2LPTSTR( PCSTR lpszIn, LPTSTR lpszOut ) { #if defined(UNICODE)||defined(_UNICODE) - ULONG index = 0; + ULONG index = 0; PCSTR lpAct = lpszIn; for( ; ; lpAct++ ) @@ -38,7 +38,7 @@ void PCSTR2LPTSTR( PCSTR lpszIn, LPTSTR lpszOut ) lpszOut[index++] = (TCHAR)(*lpAct); if ( *lpAct == 0 ) break; - } + } #else // This is trivial :) strcpy( lpszOut, lpszIn ); @@ -102,7 +102,7 @@ BOOL InitSymInfo( PCSTR lpszInitialSymbolPath ) CHAR lpszSymbolPath[BUFFERSIZE]; DWORD symOptions = SymGetOptions(); - symOptions |= SYMOPT_LOAD_LINES; + symOptions |= SYMOPT_LOAD_LINES; symOptions &= ~SYMOPT_UNDNAME; SymSetOptions( symOptions ); InitSymbolPath( lpszSymbolPath, lpszInitialSymbolPath ); @@ -154,15 +154,15 @@ static BOOL GetFunctionInfoFromAddresses( ULONG fnAddress, ULONG stackAddress, L #ifndef _M_X64 DWORD dwDisp = 0; if ( SymGetSymFromAddr( GetCurrentProcess(), (ULONG)fnAddress, &dwDisp, pSym ) ) -#else +#else //makes it compile but hell im not sure if this works... DWORD64 dwDisp = 0; if ( SymGetSymFromAddr( GetCurrentProcess(), (ULONG)fnAddress, (PDWORD64)&dwDisp, pSym ) ) #endif { // Make the symbol readable for humans - UnDecorateSymbolName( pSym->Name, lpszNonUnicodeUnDSymbol, BUFFERSIZE, - UNDNAME_COMPLETE | + UnDecorateSymbolName( pSym->Name, lpszNonUnicodeUnDSymbol, BUFFERSIZE, + UNDNAME_COMPLETE | UNDNAME_NO_THISTYPE | UNDNAME_NO_SPECIAL_SYMS | UNDNAME_NO_MEMBER_TYPE | @@ -224,7 +224,7 @@ static BOOL GetFunctionInfoFromAddresses( ULONG fnAddress, ULONG stackAddress, L _tcscat( lpszSymbol, lpszParsed ); ret = TRUE; - } + } GlobalFree( pSym ); return ret; @@ -330,14 +330,14 @@ void StackTrace( HANDLE hThread, const char* lpszMessage, FILE *file ) PrintFunctionAndSourceInfo(file, callStack); - for( ULONG index = 0; ; index++ ) + for( ULONG index = 0; ; index++ ) { bResult = StackWalk( IMAGE_FILE_MACHINE_I386, hProcess, hThread, &callStack, - NULL, + NULL, NULL, SymFunctionTableAccess, SymGetModuleBase, @@ -346,7 +346,7 @@ void StackTrace( HANDLE hThread, const char* lpszMessage, FILE *file ) if ( index == 0 ) continue; - if( !bResult || callStack.AddrFrame.Offset == 0 ) + if( !bResult || callStack.AddrFrame.Offset == 0 ) break; PrintFunctionAndSourceInfo(file, callStack); @@ -387,14 +387,14 @@ void StackTrace(HANDLE hThread, const char* lpszMessage, FILE *file, DWORD eip, PrintFunctionAndSourceInfo(file, callStack); - for( ULONG index = 0; ; index++ ) + for( ULONG index = 0; ; index++ ) { bResult = StackWalk( IMAGE_FILE_MACHINE_I386, hProcess, hThread, &callStack, - NULL, + NULL, NULL, SymFunctionTableAccess, SymGetModuleBase, @@ -403,7 +403,7 @@ void StackTrace(HANDLE hThread, const char* lpszMessage, FILE *file, DWORD eip, if ( index == 0 ) continue; - if( !bResult || callStack.AddrFrame.Offset == 0 ) + if( !bResult || callStack.AddrFrame.Offset == 0 ) break; PrintFunctionAndSourceInfo(file, callStack); diff --git a/Source/Core/Common/Src/ExtendedTrace.h b/Source/Core/Common/Src/ExtendedTrace.h index 6d33eb632d..d4da486fd3 100644 --- a/Source/Core/Common/Src/ExtendedTrace.h +++ b/Source/Core/Common/Src/ExtendedTrace.h @@ -18,7 +18,6 @@ #if defined(WIN32) #include -#include #include diff --git a/Source/Core/Common/Src/FPURoundMode.h b/Source/Core/Common/Src/FPURoundMode.h index 2e26047689..c552ad7ff0 100644 --- a/Source/Core/Common/Src/FPURoundMode.h +++ b/Source/Core/Common/Src/FPURoundMode.h @@ -16,7 +16,7 @@ // http://code.google.com/p/dolphin-emu/ #ifndef FPU_ROUND_MODE_H_ #define FPU_ROUND_MODE_H_ -#include "Common.h" +#include "CommonTypes.h" namespace FPURoundMode { @@ -35,12 +35,12 @@ namespace FPURoundMode void SetRoundMode(u32 mode); void SetPrecisionMode(u32 mode); - - void SetSIMDMode(u32 mode); + + void SetSIMDMode(u32 roundingMode, u32 nonIEEEMode); /* * There are two different flavors of float to int conversion: - * _mm_cvtps_epi32() and _mm_cvttps_epi32(). + * _mm_cvtps_epi32() and _mm_cvttps_epi32(). * * The first rounds according to the MXCSR rounding bits. * The second one always uses round towards zero. diff --git a/Source/Core/Common/Src/FifoQueue.h b/Source/Core/Common/Src/FifoQueue.h index 01f0e4dd3c..c3d15ff7d8 100644 --- a/Source/Core/Common/Src/FifoQueue.h +++ b/Source/Core/Common/Src/FifoQueue.h @@ -10,7 +10,7 @@ namespace Common { -template +template class FifoQueue { public: @@ -27,37 +27,42 @@ public: u32 Size() const { + static_assert(NeedSize, "using Size() on FifoQueue without NeedSize"); return m_size; } bool Empty() const { - //return (m_read_ptr == m_write_ptr); - return (0 == m_size); + return !AtomicLoad(m_read_ptr->next); } T& Front() const { - return *m_read_ptr->current; + AtomicLoadAcquire(m_read_ptr->next); + return m_read_ptr->current; } template void Push(Arg&& t) { // create the element, add it to the queue - m_write_ptr->current = new T(std::forward(t)); + m_write_ptr->current = std::forward(t); // set the next pointer to a new element ptr - // then advance the write pointer - m_write_ptr = m_write_ptr->next = new ElementPtr(); - Common::AtomicIncrement(m_size); + // then advance the write pointer + ElementPtr* new_ptr = new ElementPtr(); + AtomicStoreRelease(m_write_ptr->next, new_ptr); + m_write_ptr = new_ptr; + if (NeedSize) + Common::AtomicIncrement(m_size); } void Pop() { - Common::AtomicDecrement(m_size); - ElementPtr *const tmpptr = m_read_ptr; + if (NeedSize) + Common::AtomicDecrement(m_size); + ElementPtr *tmpptr = m_read_ptr; // advance the read pointer - m_read_ptr = m_read_ptr->next; + m_read_ptr = AtomicLoad(tmpptr->next); // set the next element to NULL to stop the recursive deletion tmpptr->next = NULL; delete tmpptr; // this also deletes the element @@ -68,9 +73,14 @@ public: if (Empty()) return false; - t = std::move(Front()); - Pop(); + if (NeedSize) + Common::AtomicDecrement(m_size); + ElementPtr *tmpptr = m_read_ptr; + m_read_ptr = AtomicLoadAcquire(tmpptr->next); + t = std::move(tmpptr->current); + tmpptr->next = NULL; + delete tmpptr; return true; } @@ -88,25 +98,20 @@ private: class ElementPtr { public: - ElementPtr() : current(NULL), next(NULL) {} + ElementPtr() : next(NULL) {} ~ElementPtr() { - if (current) - { - delete current; - // recusion ftw - if (next) - delete next; - } + if (next) + delete next; } - T *volatile current; + T current; ElementPtr *volatile next; }; - ElementPtr *volatile m_write_ptr; - ElementPtr *volatile m_read_ptr; + ElementPtr *m_write_ptr; + ElementPtr *m_read_ptr; volatile u32 m_size; }; diff --git a/Source/Core/Common/Src/FileSearch.cpp b/Source/Core/Common/Src/FileSearch.cpp index f790b68c4d..7597b91496 100644 --- a/Source/Core/Common/Src/FileSearch.cpp +++ b/Source/Core/Common/Src/FileSearch.cpp @@ -12,22 +12,20 @@ #include #endif -#include #include #include "FileSearch.h" - #include "StringUtil.h" CFileSearch::CFileSearch(const CFileSearch::XStringVector& _rSearchStrings, const CFileSearch::XStringVector& _rDirectories) { // Reverse the loop order for speed? - for (size_t j = 0; j < _rSearchStrings.size(); j++) + for (auto& _rSearchString : _rSearchStrings) { - for (size_t i = 0; i < _rDirectories.size(); i++) + for (auto& _rDirectory : _rDirectories) { - FindFiles(_rSearchStrings[j], _rDirectories[i]); + FindFiles(_rSearchString, _rDirectory); } } } @@ -46,7 +44,7 @@ void CFileSearch::FindFiles(const std::string& _searchString, const std::string& bool bkeepLooping = true; while (bkeepLooping) - { + { if (findData.cFileName[0] != '.') { std::string strFilename; diff --git a/Source/Core/Common/Src/FileUtil.cpp b/Source/Core/Common/Src/FileUtil.cpp index ebd73efe49..7eed3f08f4 100644 --- a/Source/Core/Common/Src/FileUtil.cpp +++ b/Source/Core/Common/Src/FileUtil.cpp @@ -3,25 +3,25 @@ // Refer to the license.txt file included. -#include "Common.h" #include "CommonPaths.h" #include "FileUtil.h" -#include "StringUtil.h" #ifdef _WIN32 #include -#include // for SHGetFolderPath +#include // for SHGetFolderPath #include -#include // for GetSaveFileName +#include // for GetSaveFileName #include -#include // getcwd +#include // getcwd #else #include #include #include #include #include +#include #endif +#include #if defined(__APPLE__) #include @@ -32,8 +32,6 @@ #include #include -#include "StringUtil.h" - #ifndef S_ISDIR #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) #endif @@ -94,7 +92,7 @@ bool IsDirectory(const std::string &filename) #endif if (result < 0) { - WARN_LOG(COMMON, "IsDirectory: stat failed on %s: %s", + WARN_LOG(COMMON, "IsDirectory: stat failed on %s: %s", filename.c_str(), GetLastErrorMsg()); return false; } @@ -108,7 +106,7 @@ bool Delete(const std::string &filename) { INFO_LOG(COMMON, "Delete: file %s", filename.c_str()); - // Return true because we care about the file no + // Return true because we care about the file no // being there, not the actual delete. if (!Exists(filename)) { @@ -126,13 +124,13 @@ bool Delete(const std::string &filename) #ifdef _WIN32 if (!DeleteFile(UTF8ToTStr(filename).c_str())) { - WARN_LOG(COMMON, "Delete: DeleteFile failed on %s: %s", + WARN_LOG(COMMON, "Delete: DeleteFile failed on %s: %s", filename.c_str(), GetLastErrorMsg()); return false; } #else if (unlink(filename.c_str()) == -1) { - WARN_LOG(COMMON, "Delete: unlink failed on %s: %s", + WARN_LOG(COMMON, "Delete: unlink failed on %s: %s", filename.c_str(), GetLastErrorMsg()); return false; } @@ -236,28 +234,78 @@ bool DeleteDir(const std::string &filename) return false; } -// renames file srcFilename to destFilename, returns true on success +// renames file srcFilename to destFilename, returns true on success bool Rename(const std::string &srcFilename, const std::string &destFilename) { - INFO_LOG(COMMON, "Rename: %s --> %s", + INFO_LOG(COMMON, "Rename: %s --> %s", srcFilename.c_str(), destFilename.c_str()); +#ifdef _WIN32 + auto sf = UTF8ToTStr(srcFilename); + auto df = UTF8ToTStr(destFilename); + // The Internet seems torn about whether ReplaceFile is atomic or not. + // Hopefully it's atomic enough... + if (ReplaceFile(df.c_str(), sf.c_str(), NULL, REPLACEFILE_IGNORE_MERGE_ERRORS, NULL, NULL)) + return true; + // Might have failed because the destination doesn't exist. + if (GetLastError() == ERROR_FILE_NOT_FOUND) + { + if (MoveFile(sf.c_str(), df.c_str())) + return true; + } +#else if (rename(srcFilename.c_str(), destFilename.c_str()) == 0) return true; - ERROR_LOG(COMMON, "Rename: failed %s --> %s: %s", +#endif + ERROR_LOG(COMMON, "Rename: failed %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); return false; } -// copies file srcFilename to destFilename, returns true on success +#ifndef _WIN32 +static void FSyncPath(const char *path) +{ + int fd = open(path, O_RDONLY); + if (fd != -1) + { + fsync(fd); + close(fd); + } +} +#endif + +bool RenameSync(const std::string &srcFilename, const std::string &destFilename) +{ + if (!Rename(srcFilename, destFilename)) + return false; +#ifdef _WIN32 + int fd = _topen(UTF8ToTStr(srcFilename).c_str(), _O_RDONLY); + if (fd != -1) + { + _commit(fd); + close(fd); + } +#else + char *path = strdup(srcFilename.c_str()); + FSyncPath(path); + FSyncPath(dirname(path)); + free(path); + path = strdup(destFilename.c_str()); + FSyncPath(dirname(path)); + free(path); +#endif + return true; +} + +// copies file srcFilename to destFilename, returns true on success bool Copy(const std::string &srcFilename, const std::string &destFilename) { - INFO_LOG(COMMON, "Copy: %s --> %s", + INFO_LOG(COMMON, "Copy: %s --> %s", srcFilename.c_str(), destFilename.c_str()); #ifdef _WIN32 if (CopyFile(UTF8ToTStr(srcFilename).c_str(), UTF8ToTStr(destFilename).c_str(), FALSE)) return true; - ERROR_LOG(COMMON, "Copy: failed %s --> %s: %s", + ERROR_LOG(COMMON, "Copy: failed %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); return false; #else @@ -271,7 +319,7 @@ bool Copy(const std::string &srcFilename, const std::string &destFilename) FILE *input = fopen(srcFilename.c_str(), "rb"); if (!input) { - ERROR_LOG(COMMON, "Copy: input failed %s --> %s: %s", + ERROR_LOG(COMMON, "Copy: input failed %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); return false; } @@ -281,7 +329,7 @@ bool Copy(const std::string &srcFilename, const std::string &destFilename) if (!output) { fclose(input); - ERROR_LOG(COMMON, "Copy: output failed %s --> %s: %s", + ERROR_LOG(COMMON, "Copy: output failed %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); return false; } @@ -295,8 +343,8 @@ bool Copy(const std::string &srcFilename, const std::string &destFilename) { if (ferror(input) != 0) { - ERROR_LOG(COMMON, - "Copy: failed reading from source, %s --> %s: %s", + ERROR_LOG(COMMON, + "Copy: failed reading from source, %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); goto bail; } @@ -306,8 +354,8 @@ bool Copy(const std::string &srcFilename, const std::string &destFilename) int wnum = fwrite(buffer, sizeof(char), rnum, output); if (wnum != rnum) { - ERROR_LOG(COMMON, - "Copy: failed writing to output, %s --> %s: %s", + ERROR_LOG(COMMON, + "Copy: failed writing to output, %s --> %s: %s", srcFilename.c_str(), destFilename.c_str(), GetLastErrorMsg()); goto bail; } @@ -339,7 +387,7 @@ u64 GetSize(const std::string &filename) WARN_LOG(COMMON, "GetSize: failed %s: is a directory", filename.c_str()); return 0; } - + struct stat64 buf; #ifdef _WIN32 if (_tstat64(UTF8ToTStr(filename).c_str(), &buf) == 0) @@ -388,10 +436,10 @@ u64 GetSize(FILE *f) return size; } -// creates an empty file filename, returns true on success +// creates an empty file filename, returns true on success bool CreateEmptyFile(const std::string &filename) { - INFO_LOG(COMMON, "CreateEmptyFile: %s", filename.c_str()); + INFO_LOG(COMMON, "CreateEmptyFile: %s", filename.c_str()); if (!File::IOFile(filename, "wb")) { @@ -441,7 +489,7 @@ u32 ScanDirectoryTree(const std::string &directory, FSTEntry& parentEntry) #endif // check for "." and ".." if (((virtualName[0] == '.') && (virtualName[1] == '\0')) || - ((virtualName[0] == '.') && (virtualName[1] == '.') && + ((virtualName[0] == '.') && (virtualName[1] == '.') && (virtualName[2] == '\0'))) continue; entry.virtualName = virtualName; @@ -456,14 +504,14 @@ u32 ScanDirectoryTree(const std::string &directory, FSTEntry& parentEntry) foundEntries += (u32)entry.size; } else - { // is a file + { // is a file entry.isDirectory = false; entry.size = GetSize(entry.physicalName.c_str()); } ++foundEntries; // Push into the tree - parentEntry.children.push_back(entry); -#ifdef _WIN32 + parentEntry.children.push_back(entry); +#ifdef _WIN32 } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); #else @@ -508,7 +556,7 @@ bool DeleteDirRecursively(const std::string &directory) // check for "." and ".." if (((virtualName[0] == '.') && (virtualName[1] == '\0')) || - ((virtualName[0] == '.') && (virtualName[1] == '.') && + ((virtualName[0] == '.') && (virtualName[1] == '.') && (virtualName[2] == '\0'))) continue; @@ -544,18 +592,31 @@ bool DeleteDirRecursively(const std::string &directory) closedir(dirp); #endif File::DeleteDir(directory); - + return true; } // Create directory and copy contents (does not overwrite existing files) void CopyDir(const std::string &source_path, const std::string &dest_path) { -#ifndef _WIN32 if (source_path == dest_path) return; if (!File::Exists(source_path)) return; if (!File::Exists(dest_path)) File::CreateFullPath(dest_path); +#ifdef _WIN32 + WIN32_FIND_DATA ffd; + HANDLE hFind = FindFirstFile(UTF8ToTStr(source_path + "\\*").c_str(), &ffd); + + if (hFind == INVALID_HANDLE_VALUE) + { + FindClose(hFind); + return; + } + + do + { + const std::string virtualName(TStrToUTF8(ffd.cFileName)); +#else struct dirent dirent, *result = NULL; DIR *dirp = opendir(source_path.c_str()); if (!dirp) return; @@ -563,10 +624,9 @@ void CopyDir(const std::string &source_path, const std::string &dest_path) while (!readdir_r(dirp, &dirent, &result) && result) { const std::string virtualName(result->d_name); +#endif // check for "." and ".." - if (((virtualName[0] == '.') && (virtualName[1] == '\0')) || - ((virtualName[0] == '.') && (virtualName[1] == '.') && - (virtualName[2] == '\0'))) + if (virtualName == "." || virtualName == "..") continue; std::string source, dest; @@ -580,6 +640,10 @@ void CopyDir(const std::string &source_path, const std::string &dest_path) CopyDir(source, dest); } else if (!File::Exists(dest)) File::Copy(source, dest); +#ifdef _WIN32 + } while (FindNextFile(hFind, &ffd) != 0); + FindClose(hFind); +#else } closedir(dirp); #endif @@ -589,7 +653,7 @@ void CopyDir(const std::string &source_path, const std::string &dest_path) std::string GetCurrentDir() { char *dir; - // Get the current working directory (getcwd uses malloc) + // Get the current working directory (getcwd uses malloc) if (!(dir = __getcwd(NULL, 0))) { ERROR_LOG(COMMON, "GetCurrentDirectory failed: %s", @@ -607,8 +671,23 @@ bool SetCurrentDir(const std::string &directory) return __chdir(directory.c_str()) == 0; } +std::string GetTempFilenameForAtomicWrite(const std::string &path) +{ + std::string abs = path; +#ifdef _WIN32 + TCHAR absbuf[MAX_PATH]; + if (_tfullpath(absbuf, UTF8ToTStr(path).c_str(), MAX_PATH) != NULL) + abs = TStrToUTF8(absbuf); +#else + char absbuf[PATH_MAX]; + if (realpath(path.c_str(), absbuf) != NULL) + abs = absbuf; +#endif + return abs + ".xxx"; +} + #if defined(__APPLE__) -std::string GetBundleDirectory() +std::string GetBundleDirectory() { CFURLRef BundleRef; char AppBundlePath[MAXPATHLEN]; @@ -643,9 +722,9 @@ std::string GetSysDirectory() std::string sysDir; #if defined (__APPLE__) - sysDir = GetBundleDirectory(); - sysDir += DIR_SEP; - sysDir += SYSDATA_DIR; + sysDir = GetBundleDirectory() + DIR_SEP + SYSDATA_DIR; +#elif defined (_WIN32) + sysDir = GetExeDirectory() + DIR_SEP + SYSDATA_DIR; #else sysDir = SYSDATA_DIR; #endif @@ -665,13 +744,62 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string &new if (paths[D_USER_IDX].empty()) { #ifdef _WIN32 - paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; + // Detect where the User directory is. There are five different cases (on top of the + // command line flag, which overrides all this): + // 1. GetExeDirectory()\portable.txt exists + // -> Use GetExeDirectory()\User + // 2. HKCU\Software\Dolphin Emulator\LocalUserConfig exists and is true + // -> Use GetExeDirectory()\User + // 3. HKCU\Software\Dolphin Emulator\UserConfigPath exists + // -> Use this as the user directory path + // 4. My Documents exists + // -> Use My Documents\Dolphin Emulator as the User directory path + // 5. Default + // -> Use GetExeDirectory()\User + + // Check our registry keys + HKEY hkey; + DWORD local = 0; + TCHAR configPath[MAX_PATH] = {0}; + if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Dolphin Emulator"), NULL, KEY_QUERY_VALUE, &hkey) == ERROR_SUCCESS) + { + DWORD size = 4; + if (RegQueryValueEx(hkey, TEXT("LocalUserConfig"), NULL, NULL, reinterpret_cast(&local), &size) != ERROR_SUCCESS) + local = 0; + + size = MAX_PATH; + if (RegQueryValueEx(hkey, TEXT("UserConfigPath"), NULL, NULL, (LPBYTE)configPath, &size) != ERROR_SUCCESS) + configPath[0] = 0; + RegCloseKey(hkey); + } + + local = local || File::Exists(GetExeDirectory() + DIR_SEP "portable.txt"); + + // Get Program Files path in case we need it. + TCHAR my_documents[MAX_PATH]; + bool my_documents_found = SUCCEEDED(SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents)); + + if (local) // Case 1-2 + paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; + else if (configPath[0]) // Case 3 + paths[D_USER_IDX] = TStrToUTF8(configPath); + else if (my_documents_found) // Case 4 + paths[D_USER_IDX] = TStrToUTF8(my_documents) + DIR_SEP "Dolphin Emulator" DIR_SEP; + else // Case 5 + paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; + + // Prettify the path: it will be displayed in some places, we don't want a mix of \ and /. + paths[D_USER_IDX] = ReplaceAll(paths[D_USER_IDX], "\\", DIR_SEP); + + // Make sure it ends in DIR_SEP. + if (*paths[D_USER_IDX].rbegin() != DIR_SEP_CHR) + paths[D_USER_IDX] += DIR_SEP; #else if (File::Exists(ROOT_DIR DIR_SEP USERDATA_DIR)) paths[D_USER_IDX] = ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP; else - paths[D_USER_IDX] = std::string(getenv("HOME") ? - getenv("HOME") : getenv("PWD") ? + paths[D_USER_IDX] = std::string(getenv("HOME") ? + getenv("HOME") : getenv("PWD") ? getenv("PWD") : "") + DIR_SEP DOLPHIN_DATA_DIR DIR_SEP; #endif @@ -679,7 +807,7 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string &new paths[D_WIIROOT_IDX] = paths[D_USER_IDX] + WII_USER_DIR; paths[D_WIIUSER_IDX] = paths[D_WIIROOT_IDX] + DIR_SEP; paths[D_CONFIG_IDX] = paths[D_USER_IDX] + CONFIG_DIR DIR_SEP; - paths[D_GAMECONFIG_IDX] = paths[D_USER_IDX] + GAMECONFIG_DIR DIR_SEP; + paths[D_GAMESETTINGS_IDX] = paths[D_USER_IDX] + GAMESETTINGS_DIR DIR_SEP; paths[D_MAPS_IDX] = paths[D_USER_IDX] + MAPS_DIR DIR_SEP; paths[D_CACHE_IDX] = paths[D_USER_IDX] + CACHE_DIR DIR_SEP; paths[D_SHADERCACHE_IDX] = paths[D_USER_IDX] + SHADERCACHE_DIR DIR_SEP; @@ -689,14 +817,15 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string &new paths[D_OPENCL_IDX] = paths[D_USER_IDX] + OPENCL_DIR DIR_SEP; paths[D_HIRESTEXTURES_IDX] = paths[D_USER_IDX] + HIRES_TEXTURES_DIR DIR_SEP; paths[D_DUMP_IDX] = paths[D_USER_IDX] + DUMP_DIR DIR_SEP; - paths[D_DUMPFRAMES_IDX] = paths[D_USER_IDX] + DUMP_FRAMES_DIR DIR_SEP; - paths[D_DUMPAUDIO_IDX] = paths[D_USER_IDX] + DUMP_AUDIO_DIR DIR_SEP; - paths[D_DUMPTEXTURES_IDX] = paths[D_USER_IDX] + DUMP_TEXTURES_DIR DIR_SEP; - paths[D_DUMPDSP_IDX] = paths[D_USER_IDX] + DUMP_DSP_DIR DIR_SEP; + paths[D_DUMPFRAMES_IDX] = paths[D_DUMP_IDX] + DUMP_FRAMES_DIR DIR_SEP; + paths[D_DUMPAUDIO_IDX] = paths[D_DUMP_IDX] + DUMP_AUDIO_DIR DIR_SEP; + paths[D_DUMPTEXTURES_IDX] = paths[D_DUMP_IDX] + DUMP_TEXTURES_DIR DIR_SEP; + paths[D_DUMPDSP_IDX] = paths[D_DUMP_IDX] + DUMP_DSP_DIR DIR_SEP; paths[D_LOGS_IDX] = paths[D_USER_IDX] + LOGS_DIR DIR_SEP; - paths[D_MAILLOGS_IDX] = paths[D_USER_IDX] + MAIL_LOGS_DIR DIR_SEP; - paths[D_THEMES_IDX] = paths[D_USER_IDX] + THEMES_DIR DIR_SEP; + paths[D_MAILLOGS_IDX] = paths[D_LOGS_IDX] + MAIL_LOGS_DIR DIR_SEP; paths[D_WIISYSCONF_IDX] = paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR DIR_SEP; + paths[D_WIIWC24_IDX] = paths[D_WIIUSER_IDX] + WII_WC24CONF_DIR DIR_SEP; + paths[D_THEMES_IDX] = paths[D_USER_IDX] + THEMES_DIR DIR_SEP; paths[F_DOLPHINCONFIG_IDX] = paths[D_CONFIG_IDX] + DOLPHIN_CONFIG; paths[F_DEBUGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + DEBUGGER_CONFIG; paths[F_LOGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + LOGGER_CONFIG; @@ -710,23 +839,88 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string &new if (!newPath.empty()) { - if(DirIDX != D_WIIROOT_IDX) - PanicAlert("Trying to change user path other than Wii root"); - if (!File::IsDirectory(newPath)) { - WARN_LOG(COMMON, "Invalid path specified %s, Wii user path will be set to default", newPath.c_str()); - paths[D_WIIROOT_IDX] = paths[D_USER_IDX] + WII_USER_DIR; + WARN_LOG(COMMON, "Invalid path specified %s", newPath.c_str()); + return paths[DirIDX]; } else { - paths[D_WIIROOT_IDX] = newPath; + paths[DirIDX] = newPath; + } + + switch (DirIDX) + { + case D_WIIROOT_IDX: + paths[D_WIIUSER_IDX] = paths[D_WIIROOT_IDX] + DIR_SEP; + paths[D_WIISYSCONF_IDX] = paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR + DIR_SEP; + paths[F_WIISYSCONF_IDX] = paths[D_WIISYSCONF_IDX] + WII_SYSCONF; + break; + + case D_USER_IDX: + paths[D_GCUSER_IDX] = paths[D_USER_IDX] + GC_USER_DIR DIR_SEP; + paths[D_WIIROOT_IDX] = paths[D_USER_IDX] + WII_USER_DIR; + paths[D_WIIUSER_IDX] = paths[D_WIIROOT_IDX] + DIR_SEP; + paths[D_CONFIG_IDX] = paths[D_USER_IDX] + CONFIG_DIR DIR_SEP; + paths[D_GAMESETTINGS_IDX] = paths[D_USER_IDX] + GAMESETTINGS_DIR DIR_SEP; + paths[D_MAPS_IDX] = paths[D_USER_IDX] + MAPS_DIR DIR_SEP; + paths[D_CACHE_IDX] = paths[D_USER_IDX] + CACHE_DIR DIR_SEP; + paths[D_SHADERCACHE_IDX] = paths[D_USER_IDX] + SHADERCACHE_DIR DIR_SEP; + paths[D_SHADERS_IDX] = paths[D_USER_IDX] + SHADERS_DIR DIR_SEP; + paths[D_STATESAVES_IDX] = paths[D_USER_IDX] + STATESAVES_DIR DIR_SEP; + paths[D_SCREENSHOTS_IDX] = paths[D_USER_IDX] + SCREENSHOTS_DIR DIR_SEP; + paths[D_OPENCL_IDX] = paths[D_USER_IDX] + OPENCL_DIR DIR_SEP; + paths[D_HIRESTEXTURES_IDX] = paths[D_USER_IDX] + HIRES_TEXTURES_DIR DIR_SEP; + paths[D_DUMP_IDX] = paths[D_USER_IDX] + DUMP_DIR DIR_SEP; + paths[D_DUMPFRAMES_IDX] = paths[D_DUMP_IDX] + DUMP_FRAMES_DIR DIR_SEP; + paths[D_DUMPAUDIO_IDX] = paths[D_DUMP_IDX] + DUMP_AUDIO_DIR DIR_SEP; + paths[D_DUMPTEXTURES_IDX] = paths[D_DUMP_IDX] + DUMP_TEXTURES_DIR DIR_SEP; + paths[D_DUMPDSP_IDX] = paths[D_DUMP_IDX] + DUMP_DSP_DIR DIR_SEP; + paths[D_LOGS_IDX] = paths[D_USER_IDX] + LOGS_DIR DIR_SEP; + paths[D_MAILLOGS_IDX] = paths[D_LOGS_IDX] + MAIL_LOGS_DIR DIR_SEP; + paths[D_WIISYSCONF_IDX] = paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR DIR_SEP; + paths[D_THEMES_IDX] = paths[D_USER_IDX] + THEMES_DIR DIR_SEP; + paths[F_DOLPHINCONFIG_IDX] = paths[D_CONFIG_IDX] + DOLPHIN_CONFIG; + paths[F_DEBUGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + DEBUGGER_CONFIG; + paths[F_LOGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + LOGGER_CONFIG; + paths[F_MAINLOG_IDX] = paths[D_LOGS_IDX] + MAIN_LOG; + paths[F_WIISYSCONF_IDX] = paths[D_WIISYSCONF_IDX] + WII_SYSCONF; + paths[F_RAMDUMP_IDX] = paths[D_DUMP_IDX] + RAM_DUMP; + paths[F_ARAMDUMP_IDX] = paths[D_DUMP_IDX] + ARAM_DUMP; + paths[F_FAKEVMEMDUMP_IDX] = paths[D_DUMP_IDX] + FAKEVMEM_DUMP; + paths[F_GCSRAM_IDX] = paths[D_GCUSER_IDX] + GC_SRAM; + break; + + case D_CONFIG_IDX: + paths[F_DOLPHINCONFIG_IDX] = paths[D_CONFIG_IDX] + DOLPHIN_CONFIG; + paths[F_DEBUGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + DEBUGGER_CONFIG; + paths[F_LOGGERCONFIG_IDX] = paths[D_CONFIG_IDX] + LOGGER_CONFIG; + break; + + case D_GCUSER_IDX: + paths[F_GCSRAM_IDX] = paths[D_GCUSER_IDX] + GC_SRAM; + break; + + case D_DUMP_IDX: + paths[D_DUMPFRAMES_IDX] = paths[D_DUMP_IDX] + DUMP_FRAMES_DIR DIR_SEP; + paths[D_DUMPAUDIO_IDX] = paths[D_DUMP_IDX] + DUMP_AUDIO_DIR DIR_SEP; + paths[D_DUMPTEXTURES_IDX] = paths[D_DUMP_IDX] + DUMP_TEXTURES_DIR DIR_SEP; + paths[D_DUMPDSP_IDX] = paths[D_DUMP_IDX] + DUMP_DSP_DIR DIR_SEP; + paths[F_RAMDUMP_IDX] = paths[D_DUMP_IDX] + RAM_DUMP; + paths[F_ARAMDUMP_IDX] = paths[D_DUMP_IDX] + ARAM_DUMP; + paths[F_FAKEVMEMDUMP_IDX] = paths[D_DUMP_IDX] + FAKEVMEM_DUMP; + break; + case D_LOGS_IDX: + paths[D_MAILLOGS_IDX] = paths[D_LOGS_IDX] + MAIL_LOGS_DIR DIR_SEP; + paths[F_MAINLOG_IDX] = paths[D_LOGS_IDX] + MAIN_LOG; } paths[D_WIIUSER_IDX] = paths[D_WIIROOT_IDX] + DIR_SEP; - paths[D_WIISYSCONF_IDX] = paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR + DIR_SEP; + paths[D_WIIWC24_IDX] = paths[D_WIIUSER_IDX] + WII_WC24CONF_DIR DIR_SEP; + paths[D_WIISYSCONF_IDX] = paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR + DIR_SEP; paths[F_WIISYSCONF_IDX] = paths[D_WIISYSCONF_IDX] + WII_SYSCONF; } + return paths[DirIDX]; } @@ -734,30 +928,31 @@ std::string GetThemeDir(const std::string& theme_name) { std::string dir = File::GetUserPath(D_THEMES_IDX) + theme_name + "/"; -#if !defined(_WIN32) // If theme does not exist in user's dir load from shared directory if (!File::Exists(dir)) - dir = SHARED_USER_DIR THEMES_DIR "/" + theme_name + "/"; -#endif - + dir = GetSysDirectory() + THEMES_DIR "/" + theme_name + "/"; + return dir; } -bool WriteStringToFile(bool text_file, const std::string &str, const char *filename) +bool WriteStringToFile(const std::string &str, const char *filename) { - return File::IOFile(filename, text_file ? "w" : "wb").WriteBytes(str.data(), str.size()); + return File::IOFile(filename, "wb").WriteBytes(str.data(), str.size()); } -bool ReadFileToString(bool text_file, const char *filename, std::string &str) +bool ReadFileToString(const char *filename, std::string &str) { - File::IOFile file(filename, text_file ? "r" : "rb"); + File::IOFile file(filename, "rb"); auto const f = file.GetHandle(); if (!f) return false; + size_t read_size; str.resize(GetSize(f)); - return file.ReadArray(&str[0], str.size()); + bool retval = file.ReadArray(&str[0], str.size(), &read_size); + + return retval; } IOFile::IOFile() @@ -787,7 +982,7 @@ IOFile::IOFile(IOFile&& other) IOFile& IOFile::operator=(IOFile&& other) { - IOFile((IOFile&&)other).Swap(*this); + Swap(other); return *this; } diff --git a/Source/Core/Common/Src/FileUtil.h b/Source/Core/Common/Src/FileUtil.h index fdadb10b4d..b39135fa41 100644 --- a/Source/Core/Common/Src/FileUtil.h +++ b/Source/Core/Common/Src/FileUtil.h @@ -21,8 +21,8 @@ enum { D_GCUSER_IDX, D_WIIROOT_IDX, D_WIIUSER_IDX, - D_CONFIG_IDX, - D_GAMECONFIG_IDX, + D_CONFIG_IDX, // global settings + D_GAMESETTINGS_IDX, // user-specified settings which override both the global and the default settings (per game) D_MAPS_IDX, D_CACHE_IDX, D_SHADERCACHE_IDX, @@ -39,6 +39,7 @@ enum { D_LOGS_IDX, D_MAILLOGS_IDX, D_WIISYSCONF_IDX, + D_WIIWC24_IDX, D_THEMES_IDX, F_DOLPHINCONFIG_IDX, F_DEBUGGERCONFIG_IDX, @@ -55,7 +56,7 @@ enum { namespace File { -// FileSystem tree node/ +// FileSystem tree node/ struct FSTEntry { bool isDirectory; @@ -93,13 +94,16 @@ bool Delete(const std::string &filename); // Deletes a directory filename, returns true on success bool DeleteDir(const std::string &filename); -// renames file srcFilename to destFilename, returns true on success +// renames file srcFilename to destFilename, returns true on success bool Rename(const std::string &srcFilename, const std::string &destFilename); -// copies file srcFilename to destFilename, returns true on success +// ditto, but syncs the source file and, on Unix, syncs the directories after rename +bool RenameSync(const std::string &srcFilename, const std::string &destFilename); + +// copies file srcFilename to destFilename, returns true on success bool Copy(const std::string &srcFilename, const std::string &destFilename); -// creates an empty file filename, returns true on success +// creates an empty file filename, returns true on success bool CreateEmptyFile(const std::string &filename); // Scans the directory tree gets, starting from _Directory and adds the @@ -118,6 +122,9 @@ void CopyDir(const std::string &source_path, const std::string &dest_path); // Set the current directory to given directory bool SetCurrentDir(const std::string &directory); +// Get a filename that can hopefully be atomically renamed to the given path. +std::string GetTempFilenameForAtomicWrite(const std::string &path); + // Returns a pointer to a string with a Dolphin data dir in the user's home // directory. To be used in "multi-user" mode (that is, installed). const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath=""); @@ -136,13 +143,13 @@ std::string GetBundleDirectory(); std::string &GetExeDirectory(); #endif -bool WriteStringToFile(bool text_file, const std::string &str, const char *filename); -bool ReadFileToString(bool text_file, const char *filename, std::string &str); +bool WriteStringToFile(const std::string &str, const char *filename); +bool ReadFileToString(const char *filename, std::string &str); // simple wrapper for cstdlib file functions to // hopefully will make error checking easier // and make forgetting an fclose() harder -class IOFile +class IOFile : public NonCopyable { public: IOFile(); @@ -150,21 +157,25 @@ public: IOFile(const std::string& filename, const char openmode[]); ~IOFile(); - + IOFile(IOFile&& other); IOFile& operator=(IOFile&& other); - + void Swap(IOFile& other); bool Open(const std::string& filename, const char openmode[]); bool Close(); template - bool ReadArray(T* data, size_t length) + bool ReadArray(T* data, size_t length, size_t* pReadBytes = NULL) { - if (!IsOpen() || length != std::fread(data, sizeof(T), length, m_file)) + size_t read_bytes = 0; + if (!IsOpen() || length != (read_bytes = std::fread(data, sizeof(T), length, m_file))) m_good = false; + if (pReadBytes) + *pReadBytes = read_bytes; + return m_good; } @@ -208,12 +219,11 @@ public: // clear error state void Clear() { m_good = true; std::clearerr(m_file); } -private: - IOFile(const IOFile&) /*= delete*/; - IOFile& operator=(const IOFile&) /*= delete*/; - std::FILE* m_file; bool m_good; +private: + IOFile(IOFile&); + IOFile& operator=(IOFile& other); }; } // namespace diff --git a/Source/Core/Common/Src/GenericFPURoundMode.cpp b/Source/Core/Common/Src/GenericFPURoundMode.cpp index cc878291a1..c8e70a4990 100644 --- a/Source/Core/Common/Src/GenericFPURoundMode.cpp +++ b/Source/Core/Common/Src/GenericFPURoundMode.cpp @@ -26,7 +26,7 @@ namespace FPURoundMode void SetPrecisionMode(u32 mode) { } - void SetSIMDMode(u32 mode) + void SetSIMDMode(u32 mode, u32 nonIEEEMode) { } void SaveSIMDState() diff --git a/Source/Core/Common/Src/Hash.cpp b/Source/Core/Common/Src/Hash.cpp index 2e221ee396..ab017347e8 100644 --- a/Source/Core/Common/Src/Hash.cpp +++ b/Source/Core/Common/Src/Hash.cpp @@ -115,15 +115,15 @@ inline u64 getblock(const u64 * p, int i) inline void bmix64(u64 & h1, u64 & h2, u64 & k1, u64 & k2, u64 & c1, u64 & c2) { - k1 *= c1; - k1 = _rotl64(k1,23); + k1 *= c1; + k1 = _rotl64(k1,23); k1 *= c2; h1 ^= k1; h1 += h2; h2 = _rotl64(h2,41); - k2 *= c2; + k2 *= c2; k2 = _rotl64(k2,23); k2 *= c1; h2 ^= k2; @@ -250,7 +250,7 @@ u64 GetCRC32(const u8 *src, int len, u32 samples) } -/* +/* * NOTE: This hash function is used for custom texture loading/dumping, so * it should not be changed, which would require all custom textures to be * recalculated for their new hash values. If the hashing function is @@ -273,7 +273,7 @@ u64 GetHashHiresTexture(const u8 *src, int len, u32 samples) u64 k = data[0]; data+=Step; k *= m; - k ^= k >> r; + k ^= k >> r; k *= m; h ^= k; h *= m; @@ -292,13 +292,13 @@ u64 GetHashHiresTexture(const u8 *src, int len, u32 samples) case 1: h ^= u64(data2[0]); h *= m; }; - + h ^= h >> r; h *= m; h ^= h >> r; return h; -} +} #else // CRC32 hash using the SSE4.2 instruction u64 GetCRC32(const u8 *src, int len, u32 samples) @@ -351,15 +351,15 @@ inline u32 fmix32(u32 h) inline void bmix32(u32 & h1, u32 & h2, u32 & k1, u32 & k2, u32 & c1, u32 & c2) { - k1 *= c1; - k1 = _rotl(k1,11); + k1 *= c1; + k1 = _rotl(k1,11); k1 *= c2; h1 ^= k1; h1 += h2; h2 = _rotl(h2,17); - k2 *= c2; + k2 *= c2; k2 = _rotl(k2,11); k2 *= c1; h2 ^= k2; @@ -405,7 +405,7 @@ u64 GetMurmurHash3(const u8* src, int len, u32 samples) //---------- // tail - + const u8 * tail = (const u8*)(data + nblocks*8); u32 k1 = 0; @@ -439,7 +439,7 @@ u64 GetMurmurHash3(const u8* src, int len, u32 samples) out[0] = h1; out[1] = h2; - + return *((u64 *)&out); } @@ -463,11 +463,11 @@ u64 GetHashHiresTexture(const u8 *src, int len, u32 samples) { u64 k = data[0]; data+=Step; - k *= m; - k ^= k >> r; + k *= m; + k ^= k >> r; k *= m; h ^= k; - h *= m; + h *= m; } const u8 * data2 = (const u8*)end; @@ -483,7 +483,7 @@ u64 GetHashHiresTexture(const u8 *src, int len, u32 samples) case 1: h ^= u64(data2[0]); h *= m; }; - + h ^= h >> r; h *= m; h ^= h >> r; diff --git a/Source/Core/Common/Src/Hash.h b/Source/Core/Common/Src/Hash.h index 8bf76cbe88..7bc37a5632 100644 --- a/Source/Core/Common/Src/Hash.h +++ b/Source/Core/Common/Src/Hash.h @@ -12,7 +12,7 @@ u32 HashFletcher(const u8* data_u8, size_t length); // FAST. Length & 1 == 0. u32 HashAdler32(const u8* data, size_t len); // Fairly accurate, slightly slower u32 HashFNV(const u8* ptr, int length); // Another fast and decent hash u32 HashEctor(const u8* ptr, int length); // JUNK. DO NOT USE FOR NEW THINGS -u64 GetCRC32(const u8 *src, int len, u32 samples); // SSE4.2 version of CRC32 +u64 GetCRC32(const u8 *src, int len, u32 samples); // SSE4.2 version of CRC32 u64 GetHashHiresTexture(const u8 *src, int len, u32 samples); u64 GetMurmurHash3(const u8 *src, int len, u32 samples); u64 GetHash64(const u8 *src, int len, u32 samples); diff --git a/Source/Core/Common/Src/IniFile.cpp b/Source/Core/Common/Src/IniFile.cpp index 2eca8df929..a1a10ab372 100644 --- a/Source/Core/Common/Src/IniFile.cpp +++ b/Source/Core/Common/Src/IniFile.cpp @@ -20,7 +20,7 @@ namespace { -static void ParseLine(const std::string& line, std::string* keyOut, std::string* valueOut) +void ParseLine(const std::string& line, std::string* keyOut, std::string* valueOut) { if (line[0] == '#') return; @@ -37,32 +37,15 @@ static void ParseLine(const std::string& line, std::string* keyOut, std::string* } -std::string* IniFile::Section::GetLine(const char* key, std::string* valueOut) -{ - for (std::vector::iterator iter = lines.begin(); iter != lines.end(); ++iter) - { - std::string& line = *iter; - std::string lineKey; - ParseLine(line, &lineKey, valueOut); - if (!strcasecmp(lineKey.c_str(), key)) - return &line; - } - return 0; -} - void IniFile::Section::Set(const char* key, const char* newValue) { - std::string value; - std::string* line = GetLine(key, &value); - if (line) - { - // Change the value - keep the key and comment - *line = StripSpaces(key) + " = " + newValue; - } + auto it = values.find(key); + if (it != values.end()) + it->second = newValue; else { - // The key did not already exist in this section - let's add it. - lines.push_back(std::string(key) + " = " + newValue); + values[key] = newValue; + keys_order.push_back(key); } } @@ -74,20 +57,6 @@ void IniFile::Section::Set(const char* key, const std::string& newValue, const s Delete(key); } -bool IniFile::Section::Get(const char* key, std::string* value, const char* defaultValue) -{ - std::string* line = GetLine(key, value); - if (!line) - { - if (defaultValue) - { - *value = defaultValue; - } - return false; - } - return true; -} - void IniFile::Section::Set(const char* key, const float newValue, const float defaultValue) { if (newValue != defaultValue) @@ -112,10 +81,10 @@ void IniFile::Section::Set(const char* key, bool newValue, bool defaultValue) Delete(key); } -void IniFile::Section::Set(const char* key, const std::vector& newValues) +void IniFile::Section::Set(const char* key, const std::vector& newValues) { std::string temp; - // Join the strings with , + // Join the strings with , std::vector::const_iterator it; for (it = newValues.begin(); it != newValues.end(); ++it) { @@ -126,7 +95,24 @@ void IniFile::Section::Set(const char* key, const std::vector& newV Set(key, temp.c_str()); } -bool IniFile::Section::Get(const char* key, std::vector& values) +bool IniFile::Section::Get(const char* key, std::string* value, const char* defaultValue) +{ + auto it = values.find(key); + if (it != values.end()) + { + *value = it->second; + return true; + } + else if (defaultValue) + { + *value = defaultValue; + return true; + } + else + return false; +} + +bool IniFile::Section::Get(const char* key, std::vector& out) { std::string temp; bool retval = Get(key, &temp, 0); @@ -138,19 +124,17 @@ bool IniFile::Section::Get(const char* key, std::vector& values) size_t subStart = temp.find_first_not_of(","); size_t subEnd; - // split by , - while (subStart != std::string::npos) { - - // Find next , + // split by , + while (subStart != std::string::npos) + { + // Find next , subEnd = temp.find_first_of(",", subStart); - if (subStart != subEnd) - // take from first char until next , - values.push_back(StripSpaces(temp.substr(subStart, subEnd - subStart))); - + if (subStart != subEnd) + // take from first char until next , + out.push_back(StripSpaces(temp.substr(subStart, subEnd - subStart))); // Find the next non , char subStart = temp.find_first_not_of(",", subEnd); - } - + } return true; } @@ -206,45 +190,35 @@ bool IniFile::Section::Get(const char* key, double* value, double defaultValue) bool IniFile::Section::Exists(const char *key) const { - for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) - { - std::string lineKey; - ParseLine(*iter, &lineKey, NULL); - if (!strcasecmp(lineKey.c_str(), key)) - return true; - } - return false; + return values.find(key) != values.end(); } bool IniFile::Section::Delete(const char *key) { - std::string* line = GetLine(key, 0); - for (std::vector::iterator liter = lines.begin(); liter != lines.end(); ++liter) - { - if (line == &*liter) - { - lines.erase(liter); - return true; - } - } - return false; + auto it = values.find(key); + if (it == values.end()) + return false; + + values.erase(it); + keys_order.erase(std::find(keys_order.begin(), keys_order.end(), key)); + return true; } // IniFile const IniFile::Section* IniFile::GetSection(const char* sectionName) const { - for (std::vector

::const_iterator iter = sections.begin(); iter != sections.end(); ++iter) - if (!strcasecmp(iter->name.c_str(), sectionName)) - return (&(*iter)); + for (const auto& sect : sections) + if (!strcasecmp(sect.name.c_str(), sectionName)) + return (&(sect)); return 0; } IniFile::Section* IniFile::GetSection(const char* sectionName) { - for (std::vector
::iterator iter = sections.begin(); iter != sections.end(); ++iter) - if (!strcasecmp(iter->name.c_str(), sectionName)) - return (&(*iter)); + for (auto& sect : sections) + if (!strcasecmp(sect.name.c_str(), sectionName)) + return (&(sect)); return 0; } @@ -286,11 +260,7 @@ bool IniFile::Exists(const char* sectionName, const char* key) const void IniFile::SetLines(const char* sectionName, const std::vector &lines) { Section* section = GetOrCreateSection(sectionName); - section->lines.clear(); - for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) - { - section->lines.push_back(*iter); - } + section->lines = lines; } bool IniFile::DeleteKey(const char* sectionName, const char* key) @@ -298,16 +268,7 @@ bool IniFile::DeleteKey(const char* sectionName, const char* key) Section* section = GetSection(sectionName); if (!section) return false; - std::string* line = section->GetLine(key, 0); - for (std::vector::iterator liter = section->lines.begin(); liter != section->lines.end(); ++liter) - { - if (line == &(*liter)) - { - section->lines.erase(liter); - return true; - } - } - return false; //shouldn't happen + return section->Delete(key); } // Return a list of all keys in a section @@ -316,13 +277,7 @@ bool IniFile::GetKeys(const char* sectionName, std::vector& keys) c const Section* section = GetSection(sectionName); if (!section) return false; - keys.clear(); - for (std::vector::const_iterator liter = section->lines.begin(); liter != section->lines.end(); ++liter) - { - std::string key; - ParseLine(*liter, &key, 0); - keys.push_back(key); - } + keys = section->keys_order; return true; } @@ -334,9 +289,9 @@ bool IniFile::GetLines(const char* sectionName, std::vector& lines, return false; lines.clear(); - for (std::vector::const_iterator iter = section->lines.begin(); iter != section->lines.end(); ++iter) + for (std::string line : section->lines) { - std::string line = StripSpaces(*iter); + line = StripSpaces(line); if (remove_comments) { @@ -364,13 +319,13 @@ void IniFile::SortSections() std::sort(sections.begin(), sections.end()); } -bool IniFile::Load(const char* filename) +bool IniFile::Load(const char* filename, bool keep_current_data) { // Maximum number of letters in a line static const int MAX_BYTES = 1024*32; - sections.clear(); - sections.push_back(Section("")); + if (!keep_current_data) + sections.clear(); // first section consists of the comments before the first real section // Open file @@ -379,12 +334,13 @@ bool IniFile::Load(const char* filename) if (in.fail()) return false; + Section* current_section = NULL; while (!in.eof()) { char templine[MAX_BYTES]; in.getline(templine, MAX_BYTES); std::string line = templine; - + #ifndef _WIN32 // Check for CRLF eol and convert it to LF if (!line.empty() && line.at(line.size()-1) == '\r') @@ -393,8 +349,6 @@ bool IniFile::Load(const char* filename) } #endif - if (in.eof()) break; - if (line.size() > 0) { if (line[0] == '[') @@ -405,12 +359,25 @@ bool IniFile::Load(const char* filename) { // New section! std::string sub = line.substr(1, endpos - 1); - sections.push_back(Section(sub)); + current_section = GetOrCreateSection(sub.c_str()); } } else { - sections[sections.size() - 1].lines.push_back(line); + if (current_section) + { + std::string key, value; + ParseLine(line, &key, &value); + + // Lines starting with '$', '*' or '+' are kept verbatim. + // Kind of a hack, but the support for raw lines inside an + // INI is a hack anyway. + if ((key == "" && value == "") + || (line.size() >= 1 && (line[0] == '$' || line[0] == '+' || line[0] == '*'))) + current_section->lines.push_back(line.c_str()); + else + current_section->Set(key, value.c_str()); + } } } } @@ -422,35 +389,37 @@ bool IniFile::Load(const char* filename) bool IniFile::Save(const char* filename) { std::ofstream out; - OpenFStream(out, filename, std::ios::out); + std::string temp = File::GetTempFilenameForAtomicWrite(filename); + OpenFStream(out, temp, std::ios::out); if (out.fail()) { return false; } - // Currently testing if dolphin community can handle the requirements of C++11 compilation - // If you get a compiler error on this line, your compiler is probably old. - // Update to g++ 4.4 or a recent version of clang (XCode 4.2 on OS X). - // If you don't want to update, complain in a google code issue, the dolphin forums or #dolphin-emu. - for (auto iter = sections.begin(); iter != sections.end(); ++iter) + for (auto& section : sections) { - const Section& section = *iter; - - if (section.name != "") - { + if (section.keys_order.size() != 0 || section.lines.size() != 0) out << "[" << section.name << "]" << std::endl; - } - for (std::vector::const_iterator liter = section.lines.begin(); liter != section.lines.end(); ++liter) + if (section.keys_order.size() == 0) { - std::string s = *liter; - out << s << std::endl; + for (auto s : section.lines) + out << s << std::endl; + } + else + { + for (auto kvit = section.keys_order.begin(); kvit != section.keys_order.end(); ++kvit) + { + auto pair = section.values.find(*kvit); + out << pair->first << " = " << pair->second << std::endl; + } } } out.close(); - return true; + + return File::RenameSync(temp, filename); } @@ -466,7 +435,7 @@ bool IniFile::Get(const char* sectionName, const char* key, std::string* value, return section->Get(key, value, defaultValue); } -bool IniFile::Get(const char *sectionName, const char* key, std::vector& values) +bool IniFile::Get(const char *sectionName, const char* key, std::vector& values) { Section *section = GetSection(sectionName); if (!section) diff --git a/Source/Core/Common/Src/IniFile.h b/Source/Core/Common/Src/IniFile.h index bad26ca090..abfb58b0a6 100644 --- a/Source/Core/Common/Src/IniFile.h +++ b/Source/Core/Common/Src/IniFile.h @@ -6,11 +6,21 @@ #ifndef _INIFILE_H_ #define _INIFILE_H_ +#include #include +#include #include #include "StringUtil.h" +struct CaseInsensitiveStringCompare +{ + bool operator() (const std::string& a, const std::string& b) const + { + return strcasecmp(a.c_str(), b.c_str()) < 0; + } +}; + class IniFile { public: @@ -25,7 +35,6 @@ public: bool Exists(const char *key) const; bool Delete(const char *key); - std::string* GetLine(const char* key, std::string* valueOut); void Set(const char* key, const char* newValue); void Set(const char* key, const std::string& newValue, const std::string& defaultValue); @@ -44,12 +53,12 @@ public: void Set(const char* key, double newValue) { Set(key, StringFromFormat("%f", newValue).c_str()); } - + void Set(const char* key, int newValue, int defaultValue); void Set(const char* key, int newValue) { Set(key, StringFromInt(newValue).c_str()); } - + void Set(const char* key, bool newValue, bool defaultValue); void Set(const char* key, bool newValue) { Set(key, StringFromBool(newValue).c_str()); @@ -68,12 +77,24 @@ public: } protected: - std::vector lines; std::string name; + + std::vector keys_order; + std::map values; + + std::vector lines; }; - bool Load(const char* filename); - bool Load(const std::string &filename) { return Load(filename.c_str()); } + /** + * Loads sections and keys. + * @param filename filename of the ini file which should be loaded + * @param keep_current_data If true, "extends" the currently loaded list of sections and keys with the loaded data (and replaces existing entries). If false, existing data will be erased. + * @warning Using any other operations than "Get*" and "Exists" is untested and will behave unexpectedly + * @todo This really is just a hack to support having two levels of gameinis (defaults and user-specified) and should eventually be replaced with a less stupid system. + */ + bool Load(const char* filename, bool keep_current_data = false); + bool Load(const std::string &filename, bool keep_current_data = false) { return Load(filename.c_str(), keep_current_data); } + bool Save(const char* filename); bool Save(const std::string &filename) { return Save(filename.c_str()); } diff --git a/Source/Core/Common/Src/LinearDiskCache.h b/Source/Core/Common/Src/LinearDiskCache.h index 71ad169530..e139b064f3 100644 --- a/Source/Core/Common/Src/LinearDiskCache.h +++ b/Source/Core/Common/Src/LinearDiskCache.h @@ -9,9 +9,6 @@ #include "Common.h" #include -// defined in Version.cpp -extern const char *scm_rev_git_str; - // On disk format: //header{ // u32 'DCAC'; @@ -66,7 +63,7 @@ public: m_file.seekg(0, std::ios::beg); std::fstream::pos_type start_pos = m_file.tellg(); std::streamoff file_size = end_pos - start_pos; - + if (m_file.is_open() && ValidateHeader()) { // good header, read some key/value pairs @@ -89,7 +86,7 @@ public: // read key/value and pass to reader if (Read(&key) && - Read(value, value_size) && + Read(value, value_size) && Read(&entry_number) && entry_number == m_num_entries+1) { @@ -117,7 +114,7 @@ public: WriteHeader(); return 0; } - + void Sync() { m_file.flush(); diff --git a/Source/Core/Common/Src/Log.h b/Source/Core/Common/Src/Log.h index 602d398b63..b0f3519579 100644 --- a/Source/Core/Common/Src/Log.h +++ b/Source/Core/Common/Src/Log.h @@ -5,16 +5,17 @@ #ifndef _LOG_H_ #define _LOG_H_ -#define NOTICE_LEVEL 1 // VERY important information that is NOT errors. Like startup and OSReports. -#define ERROR_LEVEL 2 // Critical errors -#define WARNING_LEVEL 3 // Something is suspicious. -#define INFO_LEVEL 4 // General information. -#define DEBUG_LEVEL 5 // Detailed debugging - might make things slow. +#define NOTICE_LEVEL 1 // VERY important information that is NOT errors. Like startup and OSReports. +#define ERROR_LEVEL 2 // Critical errors +#define WARNING_LEVEL 3 // Something is suspicious. +#define INFO_LEVEL 4 // General information. +#define DEBUG_LEVEL 5 // Detailed debugging - might make things slow. namespace LogTypes { -enum LOG_TYPE { +enum LOG_TYPE +{ ACTIONREPLAY, AUDIO, AUDIO_INTERFACE, @@ -31,6 +32,7 @@ enum LOG_TYPE { DVDINTERFACE, DYNA_REC, EXPANSIONINTERFACE, + GDB_STUB, POWERPC, GPFIFO, OSHLE, @@ -38,7 +40,7 @@ enum LOG_TYPE { MEMMAP, MEMCARD_MANAGER, OSREPORT, - PAD, + PAD, PROCESSORINTERFACE, PIXELENGINE, SERIALINTERFACE, @@ -51,8 +53,11 @@ enum LOG_TYPE { WII_IPC_DVD, WII_IPC_ES, WII_IPC_FILEIO, + WII_IPC_HID, WII_IPC_HLE, WII_IPC_NET, + WII_IPC_WC24, + WII_IPC_SSL, WII_IPC_SD, WII_IPC_STM, WII_IPC_WIIMOTE, @@ -63,12 +68,13 @@ enum LOG_TYPE { }; // FIXME: should this be removed? -enum LOG_LEVELS { - LNOTICE = NOTICE_LEVEL, - LERROR = ERROR_LEVEL, +enum LOG_LEVELS +{ + LNOTICE = NOTICE_LEVEL, + LERROR = ERROR_LEVEL, LWARNING = WARNING_LEVEL, - LINFO = INFO_LEVEL, - LDEBUG = DEBUG_LEVEL, + LINFO = INFO_LEVEL, + LDEBUG = DEBUG_LEVEL, }; #define LOGTYPES_LEVELS LogTypes::LOG_LEVELS diff --git a/Source/Core/Common/Src/LogManager.cpp b/Source/Core/Common/Src/LogManager.cpp index 49ce8ed9fd..50c6ab400a 100644 --- a/Source/Core/Common/Src/LogManager.cpp +++ b/Source/Core/Common/Src/LogManager.cpp @@ -13,7 +13,7 @@ #include "Thread.h" #include "FileUtil.h" -void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, +void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char* fmt, ...) { va_list args; @@ -47,6 +47,7 @@ LogManager::LogManager() m_Log[LogTypes::DVDINTERFACE] = new LogContainer("DVD", "DVDInterface"); m_Log[LogTypes::GPFIFO] = new LogContainer("GP", "GPFifo"); m_Log[LogTypes::EXPANSIONINTERFACE] = new LogContainer("EXI", "ExpansionInt"); + m_Log[LogTypes::GDB_STUB] = new LogContainer("GDB_STUB", "GDB Stub"); m_Log[LogTypes::AUDIO_INTERFACE] = new LogContainer("AI", "AudioInt"); m_Log[LogTypes::POWERPC] = new LogContainer("PowerPC", "IBM CPU"); m_Log[LogTypes::OSHLE] = new LogContainer("HLE", "HLE"); @@ -61,6 +62,7 @@ LogManager::LogManager() m_Log[LogTypes::WIIMOTE] = new LogContainer("Wiimote", "Wiimote"); m_Log[LogTypes::WII_IOB] = new LogContainer("WII_IOB", "WII IO Bridge"); m_Log[LogTypes::WII_IPC] = new LogContainer("WII_IPC", "WII IPC"); + m_Log[LogTypes::WII_IPC_HID] = new LogContainer("WII_IPC_HID", "WII IPC HID"); m_Log[LogTypes::WII_IPC_HLE] = new LogContainer("WII_IPC_HLE", "WII IPC HLE"); m_Log[LogTypes::WII_IPC_DVD] = new LogContainer("WII_IPC_DVD", "WII IPC DVD"); m_Log[LogTypes::WII_IPC_ES] = new LogContainer("WII_IPC_ES", "WII IPC ES"); @@ -68,6 +70,8 @@ LogManager::LogManager() m_Log[LogTypes::WII_IPC_SD] = new LogContainer("WII_IPC_SD", "WII IPC SD"); m_Log[LogTypes::WII_IPC_STM] = new LogContainer("WII_IPC_STM", "WII IPC STM"); m_Log[LogTypes::WII_IPC_NET] = new LogContainer("WII_IPC_NET", "WII IPC NET"); + m_Log[LogTypes::WII_IPC_WC24] = new LogContainer("WII_IPC_WC24", "WII IPC WC24"); + m_Log[LogTypes::WII_IPC_SSL] = new LogContainer("WII_IPC_SSL", "WII IPC SSL"); m_Log[LogTypes::WII_IPC_WIIMOTE] = new LogContainer("WII_IPC_WIIMOTE","WII IPC WIIMOTE"); m_Log[LogTypes::ACTIONREPLAY] = new LogContainer("ActionReplay", "ActionReplay"); m_Log[LogTypes::MEMCARD_MANAGER] = new LogContainer("MemCard Manager", "MemCard Manager"); @@ -77,14 +81,14 @@ LogManager::LogManager() m_consoleLog = new ConsoleListener(); m_debuggerLog = new DebuggerLogListener(); - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) + for (auto& container : m_Log) { - m_Log[i]->SetEnable(true); - m_Log[i]->AddListener(m_fileLog); - m_Log[i]->AddListener(m_consoleLog); + container->SetEnable(true); + container->AddListener(m_fileLog); + container->AddListener(m_consoleLog); #ifdef _MSC_VER if (IsDebuggerPresent()) - m_Log[i]->AddListener(m_debuggerLog); + container->AddListener(m_debuggerLog); #endif } } @@ -98,15 +102,15 @@ LogManager::~LogManager() m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_debuggerLog); } - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) - delete m_Log[i]; + for (auto& container : m_Log) + delete container; delete m_fileLog; delete m_consoleLog; delete m_debuggerLog; } -void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, +void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char *format, va_list args) { char temp[MAX_MSGLEN]; @@ -124,7 +128,7 @@ void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, file, line, level_to_char[(int)level], log->GetShortName(), temp); #ifdef ANDROID - Host_SysMessage(msg); + Host_SysMessage(msg); #endif log->Trigger(level, msg); } diff --git a/Source/Core/Common/Src/LogManager.h b/Source/Core/Common/Src/LogManager.h index f704a5d44b..101be5fc13 100644 --- a/Source/Core/Common/Src/LogManager.h +++ b/Source/Core/Common/Src/LogManager.h @@ -33,7 +33,7 @@ public: void Log(LogTypes::LOG_LEVELS, const char *msg); - bool IsValid() { return (bool)m_logfile; } + bool IsValid() { return !m_logfile.fail(); } bool IsEnabled() const { return m_enable; } void SetEnable(bool enable) { m_enable = enable; } @@ -55,7 +55,7 @@ class LogContainer { public: LogContainer(const char* shortName, const char* fullName, bool enable = false); - + const char* GetShortName() const { return m_shortName; } const char* GetFullName() const { return m_fullName; } @@ -99,7 +99,7 @@ public: static u32 GetMaxLevel() { return MAX_LOGLEVEL; } - void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, + void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char *fmt, va_list args); void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level) diff --git a/Source/Core/Common/Src/MathUtil.cpp b/Source/Core/Common/Src/MathUtil.cpp index 0e90328ee0..c92e659890 100644 --- a/Source/Core/Common/Src/MathUtil.cpp +++ b/Source/Core/Common/Src/MathUtil.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. - -#include "Common.h" #include "MathUtil.h" #include @@ -19,7 +17,7 @@ u32 ClassifyDouble(double dvalue) value.d = dvalue; u64 sign = value.i & DOUBLE_SIGN; u64 exp = value.i & DOUBLE_EXP; - if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP) + if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP) { // Nice normalized number. return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN; @@ -59,7 +57,7 @@ u32 ClassifyFloat(float fvalue) value.f = fvalue; u32 sign = value.i & FLOAT_SIGN; u32 exp = value.i & FLOAT_EXP; - if (exp > FLOAT_ZERO && exp < FLOAT_EXP) + if (exp > FLOAT_ZERO && exp < FLOAT_EXP) { // Nice normalized number. return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN; @@ -78,13 +76,13 @@ u32 ClassifyFloat(float fvalue) // Denormalized number. return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD; } - } - else if (exp) + } + else if (exp) { // Infinite return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF; - } - else + } + else { //Zero return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ; @@ -144,7 +142,7 @@ void Matrix33::RotateY(Matrix33 &mtx, float rad) mtx.data[0] = c; mtx.data[2] = s; mtx.data[4] = 1; - mtx.data[6] = -s; + mtx.data[6] = -s; mtx.data[8] = c; } @@ -155,9 +153,12 @@ void Matrix33::Multiply(const Matrix33 &a, const Matrix33 &b, Matrix33 &result) void Matrix33::Multiply(const Matrix33 &a, const float vec[3], float result[3]) { - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 3; ++i) + { result[i] = 0; - for (int k = 0; k < 3; ++k) { + + for (int k = 0; k < 3; ++k) + { result[i] += a.data[i * 3 + k] * vec[k]; } } @@ -192,7 +193,8 @@ void Matrix44::LoadMatrix33(Matrix44 &mtx, const Matrix33 &m33) void Matrix44::Set(Matrix44 &mtx, const float mtxArray[16]) { - for(int i = 0; i < 16; ++i) { + for(int i = 0; i < 16; ++i) + { mtx.data[i] = mtxArray[i]; } } diff --git a/Source/Core/Common/Src/MathUtil.h b/Source/Core/Common/Src/MathUtil.h index c0221836e3..f085c6ed2b 100644 --- a/Source/Core/Common/Src/MathUtil.h +++ b/Source/Core/Common/Src/MathUtil.h @@ -64,10 +64,10 @@ inline float FlushToZero(float f) return x.f; } -inline double FlushToZeroAsFloat(double d) +inline double FlushToZero(double d) { IntDouble x; x.d = d; - if ((x.i & DOUBLE_EXP) < 0x3800000000000000ULL) + if ((x.i & DOUBLE_EXP) == 0) x.i &= DOUBLE_SIGN; // turn into signed zero return x.d; } @@ -105,7 +105,7 @@ struct Rectangle Rectangle(T theLeft, T theTop, T theRight, T theBottom) : left(theLeft), top(theTop), right(theRight), bottom(theBottom) { } - + bool operator==(const Rectangle& r) { return left==r.left && top==r.top && right==r.right && bottom==r.bottom; } T GetWidth() const { return abs(right - left); } @@ -123,7 +123,7 @@ struct Rectangle // If the rectangle is in a coordinate system with an upper-left origin, // use this Clamp. - void ClampUL(T x1, T y1, T x2, T y2) + void ClampUL(T x1, T y1, T x2, T y2) { if (left < x1) left = x1; if (right > x2) right = x2; diff --git a/Source/Core/Common/Src/MemArena.cpp b/Source/Core/Common/Src/MemArena.cpp index ce0ccb2d3b..6b69b63860 100644 --- a/Source/Core/Common/Src/MemArena.cpp +++ b/Source/Core/Common/Src/MemArena.cpp @@ -2,8 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include -#include "Common.h" #include "MemoryUtil.h" #include "MemArena.h" @@ -20,7 +20,6 @@ #include #endif #endif -#include #if defined(__APPLE__) static const char* ram_temp_file = "/tmp/gc_mem.tmp"; @@ -37,7 +36,7 @@ int AshmemCreateFileMapping(const char *name, size_t size) if (fd < 0) return fd; - // We don't really care if we can't set the name, it is optional + // We don't really care if we can't set the name, it is optional ret = ioctl(fd, ASHMEM_SET_NAME, name); ret = ioctl(fd, ASHMEM_SET_SIZE, size); @@ -143,11 +142,15 @@ u8* MemArena::Find4GBBase() return base; #else #ifdef ANDROID - const u32 MemSize = 0x04000000; + // Android 4.3 changed how mmap works. + // if we map it private and then munmap it, we can't use the base returned. + // This may be due to changes in them support a full SELinux implementation. + const int flags = MAP_ANON | MAP_SHARED; #else - const u32 MemSize = 0x31000000; + const int flags = MAP_ANON | MAP_PRIVATE; #endif - void* base = mmap(0, MemSize, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); + const u32 MemSize = 0x31000000; + void* base = mmap(0, MemSize, PROT_NONE, flags, -1, 0); if (base == MAP_FAILED) { PanicAlert("Failed to map 1 GB of memory space: %s", strerror(errno)); return 0; @@ -254,13 +257,12 @@ u8 *MemoryMap_Setup(const MemoryView *views, int num_views, u32 flags, MemArena { base_attempts++; base = (u8 *)base_addr; - if (Memory_TryBase(base, views, num_views, flags, arena)) + if (Memory_TryBase(base, views, num_views, flags, arena)) { INFO_LOG(MEMMAP, "Found valid memory base at %p after %i tries.", base, base_attempts); base_attempts = 0; break; } - } #else // Linux32 is fine with the x64 method, although limited to 32-bit with no automirrors. @@ -286,9 +288,8 @@ void MemoryMap_Shutdown(const MemoryView *views, int num_views, u32 flags, MemAr { const MemoryView* view = &views[i]; u8** outptrs[2] = {view->out_ptr_low, view->out_ptr}; - for (int j = 0; j < 2; j++) + for (auto outptr : outptrs) { - u8** outptr = outptrs[j]; if (outptr && *outptr && !freeset.count(*outptr)) { arena->ReleaseView(*outptr, view->size); diff --git a/Source/Core/Common/Src/MemoryUtil.h b/Source/Core/Common/Src/MemoryUtil.h index 49b2589da3..79b35e41c4 100644 --- a/Source/Core/Common/Src/MemoryUtil.h +++ b/Source/Core/Common/Src/MemoryUtil.h @@ -6,10 +6,11 @@ #ifndef _MEMORYUTIL_H #define _MEMORYUTIL_H +#include + #ifndef _WIN32 #include #endif -#include void* AllocateExecutableMemory(size_t size, bool low = true); void* AllocateMemoryPages(size_t size); diff --git a/Source/Core/Common/Src/MsgHandler.h b/Source/Core/Common/Src/MsgHandler.h index 7de10c7b0a..f6e2f0f1dc 100644 --- a/Source/Core/Common/Src/MsgHandler.h +++ b/Source/Core/Common/Src/MsgHandler.h @@ -16,7 +16,7 @@ enum MSG_TYPE CRITICAL }; -typedef bool (*MsgAlertHandler)(const char* caption, const char* text, +typedef bool (*MsgAlertHandler)(const char* caption, const char* text, bool yes_no, int Style); typedef std::string (*StringTranslator)(const char* text); @@ -32,29 +32,29 @@ void SetEnableAlert(bool enable); #ifndef GEKKO #ifdef _WIN32 - #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__) - #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__) - #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__) - #define AskYesNo(format, ...) MsgAlert(true, QUESTION, format, __VA_ARGS__) - #define CriticalAlert(format, ...) MsgAlert(false, CRITICAL, format, __VA_ARGS__) + #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__) + #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__) + #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__) + #define AskYesNo(format, ...) MsgAlert(true, QUESTION, format, __VA_ARGS__) + #define CriticalAlert(format, ...) MsgAlert(false, CRITICAL, format, __VA_ARGS__) // Use these macros (that do the same thing) if the message should be translated. - #define SuccessAlertT(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__) - #define PanicAlertT(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__) - #define PanicYesNoT(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__) - #define AskYesNoT(format, ...) MsgAlert(true, QUESTION, format, __VA_ARGS__) - #define CriticalAlertT(format, ...) MsgAlert(false, CRITICAL, format, __VA_ARGS__) + #define SuccessAlertT(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__) + #define PanicAlertT(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__) + #define PanicYesNoT(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__) + #define AskYesNoT(format, ...) MsgAlert(true, QUESTION, format, __VA_ARGS__) + #define CriticalAlertT(format, ...) MsgAlert(false, CRITICAL, format, __VA_ARGS__) #else - #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, ##__VA_ARGS__) - #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, ##__VA_ARGS__) - #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, ##__VA_ARGS__) - #define AskYesNo(format, ...) MsgAlert(true, QUESTION, format, ##__VA_ARGS__) - #define CriticalAlert(format, ...) MsgAlert(false, CRITICAL, format, ##__VA_ARGS__) + #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, ##__VA_ARGS__) + #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, ##__VA_ARGS__) + #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, ##__VA_ARGS__) + #define AskYesNo(format, ...) MsgAlert(true, QUESTION, format, ##__VA_ARGS__) + #define CriticalAlert(format, ...) MsgAlert(false, CRITICAL, format, ##__VA_ARGS__) // Use these macros (that do the same thing) if the message should be translated. - #define SuccessAlertT(format, ...) MsgAlert(false, INFORMATION, format, ##__VA_ARGS__) - #define PanicAlertT(format, ...) MsgAlert(false, WARNING, format, ##__VA_ARGS__) - #define PanicYesNoT(format, ...) MsgAlert(true, WARNING, format, ##__VA_ARGS__) - #define AskYesNoT(format, ...) MsgAlert(true, QUESTION, format, ##__VA_ARGS__) - #define CriticalAlertT(format, ...) MsgAlert(false, CRITICAL, format, ##__VA_ARGS__) + #define SuccessAlertT(format, ...) MsgAlert(false, INFORMATION, format, ##__VA_ARGS__) + #define PanicAlertT(format, ...) MsgAlert(false, WARNING, format, ##__VA_ARGS__) + #define PanicYesNoT(format, ...) MsgAlert(true, WARNING, format, ##__VA_ARGS__) + #define AskYesNoT(format, ...) MsgAlert(true, QUESTION, format, ##__VA_ARGS__) + #define CriticalAlertT(format, ...) MsgAlert(false, CRITICAL, format, ##__VA_ARGS__) #endif #else // GEKKO diff --git a/Source/Core/Common/Src/NandPaths.cpp b/Source/Core/Common/Src/NandPaths.cpp index 601d2a51ee..3ca5550d40 100644 --- a/Source/Core/Common/Src/NandPaths.cpp +++ b/Source/Core/Common/Src/NandPaths.cpp @@ -58,7 +58,7 @@ bool CheckTitleTMD(u64 _titleID) bool CheckTitleTIK(u64 _titleID) { - const std::string ticketFileName = Common::GetTicketFileName(_titleID); + const std::string ticketFileName = Common::GetTicketFileName(_titleID); if (File::Exists(ticketFileName)) { File::IOFile pTIKFile(ticketFileName, "rb"); diff --git a/Source/Core/Common/Src/SDCardUtil.cpp b/Source/Core/Common/Src/SDCardUtil.cpp index cf37ffff3e..5475cf131d 100644 --- a/Source/Core/Common/Src/SDCardUtil.cpp +++ b/Source/Core/Common/Src/SDCardUtil.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #ifndef _WIN32 #include // for unlink() @@ -196,7 +197,7 @@ bool SDCardCreate(u64 disk_size /*in MB*/, const char* filename) disk_size *= 1024 * 1024; if (disk_size < 0x800000 || disk_size > 0x800000000ULL) { - ERROR_LOG(COMMON, "Trying to create SD Card image of size %lliMB is out of range (8MB-32GB)", disk_size/(1024*1024)); + ERROR_LOG(COMMON, "Trying to create SD Card image of size %" PRIu64 "MB is out of range (8MB-32GB)", disk_size/(1024*1024)); return false; } diff --git a/Source/Core/Common/Src/SDCardUtil.h b/Source/Core/Common/Src/SDCardUtil.h index 4c88c0b30b..3497b4a91d 100644 --- a/Source/Core/Common/Src/SDCardUtil.h +++ b/Source/Core/Common/Src/SDCardUtil.h @@ -15,6 +15,6 @@ // Official Git repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "Common.h" +#include "CommonTypes.h" bool SDCardCreate(u64 disk_size /*in MB*/, const char* filename); diff --git a/Source/Core/Common/Src/SettingsHandler.cpp b/Source/Core/Common/Src/SettingsHandler.cpp new file mode 100644 index 0000000000..555cf0eae9 --- /dev/null +++ b/Source/Core/Common/Src/SettingsHandler.cpp @@ -0,0 +1,126 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// Thanks to Treeki for writing the original class - 29/01/2012 + +#include "CommonPaths.h" +#include "Timer.h" +#include "SettingsHandler.h" + +#include + +#ifdef _WIN32 +#include +#include +#include +#else +#include +#endif + +SettingsHandler::SettingsHandler() +{ + Reset(); +} + +const u8* SettingsHandler::GetData() const +{ + return m_buffer; +} + +const std::string SettingsHandler::GetValue(const std::string key) +{ + std::string delim = std::string("\r\n"); + std::string toFind = delim + key + "="; + size_t found = decoded.find(toFind); + + if (found != decoded.npos) + { + size_t delimFound = decoded.find(delim, found + toFind.length()); + if (delimFound == decoded.npos) + delimFound = decoded.length() - 1; + return decoded.substr(found + toFind.length(), delimFound - (found + toFind.length())); + } + else + { + toFind = key + "="; + found = decoded.find(toFind); + if (found == 0) + { + size_t delimFound = decoded.find(delim, found + toFind.length()); + if (delimFound == decoded.npos) + delimFound = decoded.length() - 1; + return decoded.substr(found + toFind.length(), delimFound - (found + toFind.length())); + } + } + + return ""; +} + +void SettingsHandler::Decrypt() +{ + const u8 *str = m_buffer; + while (*str != 0) + { + if (m_position >= SETTINGS_SIZE) + return; + decoded.push_back((u8)(m_buffer[m_position] ^ m_key)); + m_position++; + str++; + m_key = (m_key >> 31) | (m_key << 1); + } +} + +void SettingsHandler::Reset() +{ + decoded = ""; + m_position = 0; + m_key = INITIAL_SEED; + memset(m_buffer, 0, SETTINGS_SIZE); +} + +void SettingsHandler::AddSetting(const char *key, const char *value) +{ + while (*key != 0) + { + WriteByte(*key); + key++; + } + + WriteByte('='); + + while (*value != 0) + { + WriteByte(*value); + value++; + } + + WriteByte(13); + WriteByte(10); +} + +void SettingsHandler::WriteByte(u8 b) +{ + if (m_position >= SETTINGS_SIZE) + return; + + m_buffer[m_position] = b ^ m_key; + m_position++; + m_key = (m_key >> 31) | (m_key << 1); +} + +const std::string SettingsHandler::generateSerialNumber() +{ + time_t rawtime; + tm *timeinfo; + char buffer[12]; + char serialNumber[12]; + + time(&rawtime); + timeinfo = localtime(&rawtime); + strftime(buffer, 11, "%j%H%M%S", timeinfo); + + snprintf(serialNumber, 11, "%s%i", buffer, (Common::Timer::GetTimeMs() >> 1) & 0xF); + serialNumber[10] = 0; + return std::string(serialNumber); +} diff --git a/Source/Core/Common/Src/SettingsHandler.h b/Source/Core/Common/Src/SettingsHandler.h new file mode 100644 index 0000000000..232555dea2 --- /dev/null +++ b/Source/Core/Common/Src/SettingsHandler.h @@ -0,0 +1,40 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// Thanks to Treeki for writing the original class - 29/01/2012 + +#pragma once + +#include + +#include "CommonTypes.h" + +class SettingsHandler +{ +public: + SettingsHandler(); + + enum + { + SETTINGS_SIZE = 0x100, + // Key used to encrypt/decrypt setting.txt contents + INITIAL_SEED = 0x73B5DBFA + }; + + void AddSetting(const char *key, const char *value); + + const u8 *GetData() const; + const std::string GetValue(const std::string key); + + void Decrypt(); + void Reset(); + const std::string generateSerialNumber(); + +private: + void WriteByte(u8 b); + + u8 m_buffer[SETTINGS_SIZE]; + u32 m_position, m_key; + std::string decoded; +}; diff --git a/Source/Core/Common/Src/StdConditionVariable.h b/Source/Core/Common/Src/StdConditionVariable.h index 63f4551950..1a05ce45e3 100644 --- a/Source/Core/Common/Src/StdConditionVariable.h +++ b/Source/Core/Common/Src/StdConditionVariable.h @@ -9,7 +9,7 @@ #define __has_include(s) 0 #endif -#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ && !ANDROID +#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ // GCC 4.4 provides #include @@ -25,6 +25,11 @@ #include #define _(s) wxGetTranslation((s)) +#elif _MSC_VER >= 1700 + +// The standard implementation is included since VS2012 +#include + #else // partial std::condition_variable implementation for win32/pthread diff --git a/Source/Core/Common/Src/StdMutex.h b/Source/Core/Common/Src/StdMutex.h index f66a5d1b2e..4d3348d458 100644 --- a/Source/Core/Common/Src/StdMutex.h +++ b/Source/Core/Common/Src/StdMutex.h @@ -9,12 +9,18 @@ #define __has_include(s) 0 #endif -#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ && !ANDROID +#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ // GCC 4.4 provides #include #elif __has_include() && !ANDROID // Clang + libc++ #include + +#elif _MSC_VER >= 1700 + +// The standard implementation is included since VS2012 +#include + #else // partial implementation for win32/pthread @@ -102,7 +108,7 @@ public: return (0 != TryEnterCriticalSection(&m_handle)); #else return !pthread_mutex_trylock(&m_handle); -#endif +#endif } native_handle_type native_handle() @@ -277,10 +283,10 @@ public: swap(other); return *this; } - + #ifdef USE_RVALUE_REFERENCES unique_lock(const unique_lock&) /*= delete*/; - + unique_lock(unique_lock&& other) : pm(NULL), owns(false) { @@ -289,7 +295,7 @@ public: : pm(NULL), owns(false) { // ugly const_cast to get around lack of rvalue references - unique_lock& other = const_cast(u); + unique_lock& other = const_cast(u); #endif swap(other); } @@ -310,7 +316,7 @@ public: //bool try_lock_for(const chrono::duration& rel_time); //template //bool try_lock_until(const chrono::time_point& abs_time); - + void unlock() { mutex()->unlock(); diff --git a/Source/Core/Common/Src/StdThread.h b/Source/Core/Common/Src/StdThread.h index 134bbb2fc0..9e589061b1 100644 --- a/Source/Core/Common/Src/StdThread.h +++ b/Source/Core/Common/Src/StdThread.h @@ -9,7 +9,7 @@ #define __has_include(s) 0 #endif -#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ && !ANDROID +#if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ // GCC 4.4 provides #ifndef _GLIBCXX_USE_SCHED_YIELD #define _GLIBCXX_USE_SCHED_YIELD @@ -18,6 +18,12 @@ #elif __has_include() && !ANDROID // Clang + libc++ #include + +#elif _MSC_VER >= 1700 + +// The standard implementation is included since VS2012 +#include + #else // partial std::thread implementation for win32/pthread @@ -207,7 +213,7 @@ public: std::swap(m_handle, other.m_handle); #endif } - + static unsigned hardware_concurrency() { #ifdef _WIN32 @@ -221,7 +227,7 @@ public: private: id m_id; - + #ifdef _WIN32 native_handle_type m_handle; #endif @@ -241,7 +247,7 @@ private: m_id = id(); #endif } - + template class Func { diff --git a/Source/Core/Common/Src/StringUtil.cpp b/Source/Core/Common/Src/StringUtil.cpp index 25885552ef..7ad4ac6ca5 100644 --- a/Source/Core/Common/Src/StringUtil.cpp +++ b/Source/Core/Common/Src/StringUtil.cpp @@ -6,14 +6,11 @@ #include #include -#include "Common.h" #include "CommonPaths.h" #include "StringUtil.h" #ifdef _WIN32 #include -#elif defined(ANDROID) - #else #include #include @@ -112,11 +109,11 @@ std::string ArrayToString(const u8 *data, u32 size, int line_len, bool spaces) { std::ostringstream oss; oss << std::setfill('0') << std::hex; - + for (int line = 0; size; ++data, --size) { oss << std::setw(2) << (int)*data; - + if (line_len == ++line) { oss << '\n'; @@ -159,19 +156,18 @@ bool TryParse(const std::string &str, u32 *const output) errno = 0; unsigned long value = strtoul(str.c_str(), &endptr, 0); - + if (!endptr || *endptr) return false; if (errno == ERANGE) return false; - if (ULONG_MAX > UINT_MAX) { - // Note: The typecasts avoid GCC warnings when long is 32 bits wide. - if (value >= static_cast(0x100000000ull) - && value <= static_cast(0xFFFFFFFF00000000ull)) - return false; - } +#if ULONG_MAX > UINT_MAX + if (value >= 0x100000000ull + && value <= 0xFFFFFFFF00000000ull) + return false; +#endif *output = static_cast(value); return true; @@ -272,8 +268,8 @@ std::string ReplaceAll(std::string result, const std::string& src, const std::st { while(1) { - const int pos = result.find(src); - if (pos == -1) break; + size_t pos = result.find(src); + if (pos == std::string::npos) break; result.replace(pos, src.size(), dest); } return result; @@ -288,7 +284,7 @@ std::string ReplaceAll(std::string result, const std::string& src, const std::st //#include //#include -const char HEX2DEC[256] = +const char HEX2DEC[256] = { /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0 */ 16,16,16,16, 16,16,16,16, 16,16,16,16, 16,16,16,16, @@ -319,9 +315,9 @@ std::string UriDecode(const std::string & sSrc) // for future extension" const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); - const int SRC_LEN = sSrc.length(); + const size_t SRC_LEN = sSrc.length(); const unsigned char * const SRC_END = pSrc + SRC_LEN; - const unsigned char * const SRC_LAST_DEC = SRC_END - 2; // last decodable '%' + const unsigned char * const SRC_LAST_DEC = SRC_END - 2; // last decodable '%' char * const pStart = new char[SRC_LEN]; char * pEnd = pStart; @@ -381,14 +377,14 @@ std::string UriEncode(const std::string & sSrc) { const char DEC2HEX[16 + 1] = "0123456789ABCDEF"; const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); - const int SRC_LEN = sSrc.length(); + const size_t SRC_LEN = sSrc.length(); unsigned char * const pStart = new unsigned char[SRC_LEN * 3]; unsigned char * pEnd = pStart; const unsigned char * const SRC_END = pSrc + SRC_LEN; for (; pSrc < SRC_END; ++pSrc) { - if (SAFE[*pSrc]) + if (SAFE[*pSrc]) *pEnd++ = *pSrc; else { @@ -408,26 +404,30 @@ std::string UriEncode(const std::string & sSrc) std::string UTF16ToUTF8(const std::wstring& input) { - auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), input.size(), nullptr, 0, nullptr, nullptr); + auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), (int)input.size(), nullptr, 0, nullptr, nullptr); std::string output; output.resize(size); - if (size == 0 || size != WideCharToMultiByte(CP_UTF8, 0, input.data(), input.size(), &output[0], output.size(), nullptr, nullptr)) + if (size == 0 || size != WideCharToMultiByte(CP_UTF8, 0, input.data(), (int)input.size(), &output[0], (int)output.size(), nullptr, nullptr)) + { output.clear(); + } return output; } std::wstring CPToUTF16(u32 code_page, const std::string& input) { - auto const size = MultiByteToWideChar(code_page, 0, input.data(), input.size(), nullptr, 0); + auto const size = MultiByteToWideChar(code_page, 0, input.data(), (int)input.size(), nullptr, 0); std::wstring output; output.resize(size); - if (size == 0 || size != MultiByteToWideChar(code_page, 0, input.data(), input.size(), &output[0], output.size())) + if (size == 0 || size != MultiByteToWideChar(code_page, 0, input.data(), (int)input.size(), &output[0], (int)output.size())) + { output.clear(); + } return output; } @@ -454,9 +454,6 @@ std::string CodeToUTF8(const char* fromcode, const std::basic_string& input) { std::string result; -#if defined(ANDROID) - result = (char*)input.c_str(); -#else iconv_t const conv_desc = iconv_open("UTF-8", fromcode); if ((iconv_t)-1 == conv_desc) { @@ -501,11 +498,10 @@ std::string CodeToUTF8(const char* fromcode, const std::basic_string& input) out_buffer.resize(out_buffer_size - dst_bytes); out_buffer.swap(result); - + iconv_close(conv_desc); } - -#endif + return result; } diff --git a/Source/Core/Common/Src/StringUtil.h b/Source/Core/Common/Src/StringUtil.h index 56c223641b..46ed382724 100644 --- a/Source/Core/Common/Src/StringUtil.h +++ b/Source/Core/Common/Src/StringUtil.h @@ -58,7 +58,7 @@ template static bool TryParse(const std::string &str, N *const output) { std::istringstream iss(str); - + N tmp = 0; if (iss >> tmp) { diff --git a/Source/Core/Common/Src/SymbolDB.cpp b/Source/Core/Common/Src/SymbolDB.cpp index 2dd4ee7473..e7a716de0f 100644 --- a/Source/Core/Common/Src/SymbolDB.cpp +++ b/Source/Core/Common/Src/SymbolDB.cpp @@ -28,18 +28,18 @@ void SymbolDB::Clear(const char *prefix) void SymbolDB::Index() { int i = 0; - for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) + for (auto& func : functions) { - iter->second.index = i++; + func.second.index = i++; } } Symbol *SymbolDB::GetSymbolFromName(const char *name) { - for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) + for (auto& func : functions) { - if (!strcmp(iter->second.name.c_str(), name)) - return &iter->second; + if (!strcmp(func.second.name.c_str(), name)) + return &func.second; } return 0; } diff --git a/Source/Core/Common/Src/SysConf.cpp b/Source/Core/Common/Src/SysConf.cpp index 9f2581845e..acfb11b0ed 100644 --- a/Source/Core/Common/Src/SysConf.cpp +++ b/Source/Core/Common/Src/SysConf.cpp @@ -5,6 +5,8 @@ #include "FileUtil.h" #include "SysConf.h" +#include + SysConf::SysConf() : m_IsValid(false) { @@ -38,11 +40,11 @@ bool SysConf::LoadFromFile(const char *filename) GenerateSysConf(); return true; } - + u64 size = File::GetSize(filename); if (size != SYSCONF_SIZE) { - if (AskYesNoT("Your SYSCONF file is the wrong size.\nIt should be 0x%04x (but is 0x%04llx)\nDo you want to generate a new one?", + if (AskYesNoT("Your SYSCONF file is the wrong size.\nIt should be 0x%04x (but is 0x%04" PRIx64 ")\nDo you want to generate a new one?", SYSCONF_SIZE, size)) { GenerateSysConf(); @@ -151,7 +153,7 @@ unsigned int create_item(SSysConfEntry &item, SysconfType type, const std::strin { item.offset = offset; item.type = type; - item.nameLength = name.length(); + item.nameLength = (u8)(name.length()); strncpy(item.name, name.c_str(), 32); item.dataLength = data_length; item.data = new u8[data_length]; @@ -298,8 +300,8 @@ void SysConf::GenerateSysConf() items[26].data[0] = 0x01; - for (int i = 0; i < 27; i++) - m_Entries.push_back(items[i]); + for (auto& item : items) + m_Entries.push_back(item); File::CreateFullPath(m_FilenameDefault); File::IOFile g(m_FilenameDefault, "wb"); @@ -314,7 +316,7 @@ void SysConf::GenerateSysConf() } const u16 end_data_offset = Common::swap16(current_offset); g.WriteBytes(&end_data_offset, 2); - + // Write the items const u8 null_byte = 0; for (int i = 0; i != 27; ++i) @@ -398,7 +400,7 @@ void SysConf::UpdateLocation() if (m_IsValid) Save(); - // Clear the old filename and set the default filename to the new user path + // Clear the old filename and set the default filename to the new user path // So that it can be generated if the file does not exist in the new location m_Filename.clear(); m_FilenameDefault = File::GetUserPath(F_WIISYSCONF_IDX); diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index 14eb832240..740750a8ea 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -28,7 +28,7 @@ int CurrentThreadId() return 0; #endif } - + #ifdef _WIN32 void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask) @@ -46,7 +46,7 @@ void SleepCurrentThread(int ms) { Sleep(ms); } - + void SwitchCurrentThread() { SwitchToThread(); @@ -55,7 +55,7 @@ void SwitchCurrentThread() // Sets the debugger-visible name of the current thread. // Uses undocumented (actually, it is now documented) trick. // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxtsksettingthreadname.asp - + // This is implemented much nicer in upcoming msvc++, see: // http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.100).aspx void SetCurrentThreadName(const char* szThreadName) @@ -84,7 +84,7 @@ void SetCurrentThreadName(const char* szThreadName) __except(EXCEPTION_CONTINUE_EXECUTION) {} } - + #else // !WIN32, so must be POSIX threads void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask) @@ -109,42 +109,25 @@ void SetCurrentThreadAffinity(u32 mask) SetThreadAffinity(pthread_self(), mask); } -static pthread_key_t threadname_key; -static pthread_once_t threadname_key_once = PTHREAD_ONCE_INIT; - void SleepCurrentThread(int ms) { usleep(1000 * ms); } - + void SwitchCurrentThread() { usleep(1000 * 1); } -static void FreeThreadName(void* threadname) -{ - free(threadname); -} - -static void ThreadnameKeyAlloc() -{ - pthread_key_create(&threadname_key, FreeThreadName); -} - void SetCurrentThreadName(const char* szThreadName) { - pthread_once(&threadname_key_once, ThreadnameKeyAlloc); - - void* threadname; - if ((threadname = pthread_getspecific(threadname_key)) != NULL) - free(threadname); - - pthread_setspecific(threadname_key, strdup(szThreadName)); - - INFO_LOG(COMMON, "%s(%s)\n", __FUNCTION__, szThreadName); +#ifdef __APPLE__ + pthread_setname_np(szThreadName); +#else + pthread_setname_np(pthread_self(), szThreadName); +#endif } #endif - + } // namespace Common diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index b0328f7a1f..b2e9572ce5 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -32,13 +32,13 @@ int CurrentThreadId(); void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask); void SetCurrentThreadAffinity(u32 mask); - + class Event { public: Event() : is_set(false) - {}; + {} void Set() { @@ -53,34 +53,20 @@ public: void Wait() { std::unique_lock lk(m_mutex); - m_condvar.wait(lk, IsSet(this)); + m_condvar.wait(lk, [&]{ return is_set; }); is_set = false; } void Reset() { std::unique_lock lk(m_mutex); - // no other action required, since wait loops on the predicate and any lingering signal will get cleared on the first iteration + // no other action required, since wait loops on + // the predicate and any lingering signal will get + // cleared on the first iteration is_set = false; } private: - class IsSet - { - public: - IsSet(const Event* ev) - : m_event(ev) - {} - - bool operator()() - { - return m_event->is_set; - } - - private: - const Event* const m_event; - }; - volatile bool is_set; std::condition_variable m_condvar; std::mutex m_mutex; @@ -110,34 +96,18 @@ public: } else { - m_condvar.wait(lk, IsDoneWating(this)); + m_condvar.wait(lk, [&]{ return (0 == m_waiting); }); return false; } } private: - class IsDoneWating - { - public: - IsDoneWating(const Barrier* bar) - : m_bar(bar) - {} - - bool operator()() - { - return (0 == m_bar->m_waiting); - } - - private: - const Barrier* const m_bar; - }; - std::condition_variable m_condvar; std::mutex m_mutex; const size_t m_count; volatile size_t m_waiting; }; - + void SleepCurrentThread(int ms); void SwitchCurrentThread(); // On Linux, this is equal to sleep 1ms @@ -148,9 +118,9 @@ inline void YieldCPU() { std::this_thread::yield(); } - + void SetCurrentThreadName(const char *name); - + } // namespace Common #endif // _THREAD_H_ diff --git a/Source/Core/Common/Src/Thunk.h b/Source/Core/Common/Src/Thunk.h deleted file mode 100644 index b1487badf8..0000000000 --- a/Source/Core/Common/Src/Thunk.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef _THUNK_H_ -#define _THUNK_H_ - -#include - -#include "Common.h" -#include "x64Emitter.h" - -// This simple class creates a wrapper around a C/C++ function that saves all fp state -// before entering it, and restores it upon exit. This is required to be able to selectively -// call functions from generated code, without inflicting the performance hit and increase -// of complexity that it means to protect the generated code from this problem. - -// This process is called thunking. - -// There will only ever be one level of thunking on the stack, plus, -// we don't want to pollute the stack, so we store away regs somewhere global. -// NOT THREAD SAFE. This may only be used from the CPU thread. -// Any other thread using this stuff will be FATAL. - -class ThunkManager : public Gen::XCodeBlock -{ - std::map thunks; - - const u8 *save_regs; - const u8 *load_regs; - -public: - ThunkManager() { - Init(); - } - ~ThunkManager() { - Shutdown(); - } - void *ProtectFunction(void *function, int num_params); -private: - void Init(); - void Shutdown(); - void Reset(); -}; - -#endif // _THUNK_H_ diff --git a/Source/Core/Common/Src/Timer.cpp b/Source/Core/Common/Src/Timer.cpp index 926de59917..b7ae848970 100644 --- a/Source/Core/Common/Src/Timer.cpp +++ b/Source/Core/Common/Src/Timer.cpp @@ -12,7 +12,6 @@ #include #endif -#include "Common.h" #include "Timer.h" #include "StringUtil.h" @@ -39,10 +38,6 @@ Timer::Timer() : m_LastTime(0), m_StartTime(0), m_Running(false) { Update(); - -#ifdef _WIN32 - QueryPerformanceFrequency((LARGE_INTEGER*)&m_frequency); -#endif } // Write the starting time diff --git a/Source/Core/Common/Src/Timer.h b/Source/Core/Common/Src/Timer.h index d230c73608..3055246f8e 100644 --- a/Source/Core/Common/Src/Timer.h +++ b/Source/Core/Common/Src/Timer.h @@ -5,7 +5,7 @@ #ifndef _TIMER_H_ #define _TIMER_H_ -#include "Common.h" +#include "CommonTypes.h" #include namespace Common @@ -38,7 +38,6 @@ public: private: u64 m_LastTime; u64 m_StartTime; - u64 m_frequency; bool m_Running; }; diff --git a/Source/Core/Common/Src/Version.cpp b/Source/Core/Common/Src/Version.cpp index db89a25a82..09bfa9b1af 100644 --- a/Source/Core/Common/Src/Version.cpp +++ b/Source/Core/Common/Src/Version.cpp @@ -29,7 +29,7 @@ const char *scm_rev_str = "Dolphin " #else #ifdef _M_ARM #define NP_ARCH "ARM" -#else +#else #define NP_ARCH "x86" #endif #endif @@ -43,3 +43,6 @@ const char *netplay_dolphin_ver = SCM_DESC_STR " L" NP_ARCH; #endif const char *scm_rev_git_str = SCM_REV_STR; + +const char *scm_desc_str = SCM_DESC_STR; +const char *scm_branch_str = SCM_BRANCH_STR; diff --git a/Source/Core/Common/Src/stdafx.h b/Source/Core/Common/Src/stdafx.h index 1a2e716e34..de740c3c89 100644 --- a/Source/Core/Common/Src/stdafx.h +++ b/Source/Core/Common/Src/stdafx.h @@ -4,18 +4,20 @@ #pragma once +/* #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x501 #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0500 // Default value is 0x0400 #endif +*/ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - +/* #define _CRT_SECURE_NO_DEPRECATE 1 #define _CRT_NONSTDC_NO_DEPRECATE 1 - +*/ #include #include #include diff --git a/Source/Core/Common/Src/x64ABI.cpp b/Source/Core/Common/Src/x64ABI.cpp index c47ea02fb4..6cced10084 100644 --- a/Source/Core/Common/Src/x64ABI.cpp +++ b/Source/Core/Common/Src/x64ABI.cpp @@ -2,46 +2,138 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" -#include "x64Emitter.h" #include "x64ABI.h" +#include "x64Emitter.h" using namespace Gen; // Shared code between Win64 and Unix64 -// Sets up a __cdecl function. -void XEmitter::ABI_EmitPrologue(int maxCallParams) -{ -#ifdef _M_IX86 - // Don't really need to do anything -#elif defined(_M_X64) -#if _WIN32 - int stacksize = ((maxCallParams + 1) & ~1) * 8 + 8; - // Set up a stack frame so that we can call functions - // TODO: use maxCallParams - SUB(64, R(RSP), Imm8(stacksize)); -#endif +unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize, bool noProlog) { + // On platforms other than Windows 32-bit: At the beginning of a function, + // the stack pointer is 4/8 bytes less than a multiple of 16; however, the + // function prolog immediately subtracts an appropriate amount to align + // it, so no alignment is required around a call. + // In the functions generated by ThunkManager::ProtectFunction and some + // others, we add the necessary subtraction (and 0x20 bytes shadow space + // for Win64) into this rather than having a separate prolog. + // On Windows 32-bit, the required alignment is only 4 bytes, so we just + // ensure that the frame size isn't misaligned. +#ifdef _M_X64 + // expect frameSize == 0 + frameSize = noProlog ? 0x28 : 0; +#elif defined(_WIN32) + frameSize = (frameSize + 3) & -4; #else -#error Arch not supported + unsigned int existingAlignment = noProlog ? 0xc : 0; + frameSize -= existingAlignment; + frameSize = (frameSize + 15) & -16; + frameSize += existingAlignment; #endif + return frameSize; } -void XEmitter::ABI_EmitEpilogue(int maxCallParams) -{ -#ifdef _M_IX86 - RET(); -#elif defined(_M_X64) -#ifdef _WIN32 - int stacksize = ((maxCallParams+1)&~1)*8 + 8; - ADD(64, R(RSP), Imm8(stacksize)); -#endif - RET(); +void XEmitter::ABI_AlignStack(unsigned int frameSize, bool noProlog) { + unsigned int fillSize = + ABI_GetAlignedFrameSize(frameSize, noProlog) - frameSize; + if (fillSize != 0) { +#ifdef _M_X64 + SUB(64, R(RSP), Imm8(fillSize)); #else -#error Arch not supported - - + SUB(32, R(ESP), Imm8(fillSize)); #endif + } +} + +void XEmitter::ABI_RestoreStack(unsigned int frameSize, bool noProlog) { + unsigned int alignedSize = ABI_GetAlignedFrameSize(frameSize, noProlog); + if (alignedSize != 0) { +#ifdef _M_X64 + ADD(64, R(RSP), Imm8(alignedSize)); +#else + ADD(32, R(ESP), Imm8(alignedSize)); +#endif + } +} + +void XEmitter::ABI_PushRegistersAndAdjustStack(u32 mask, bool noProlog) +{ + int regSize = +#ifdef _M_X64 + 8; +#else + 4; +#endif + int shadow = 0; +#if defined(_WIN32) && defined(_M_X64) + shadow = 0x20; +#endif + int count = 0; + for (int r = 0; r < 16; r++) + { + if (mask & (1 << r)) + { + PUSH((X64Reg) r); + count++; + } + } + int size = ((noProlog ? -regSize : 0) - (count * regSize)) & 0xf; + for (int x = 0; x < 16; x++) + { + if (mask & (1 << (16 + x))) + size += 16; + } + size += shadow; + if (size) + SUB(regSize * 8, R(RSP), size >= 0x80 ? Imm32(size) : Imm8(size)); + int offset = shadow; + for (int x = 0; x < 16; x++) + { + if (mask & (1 << (16 + x))) + { + MOVAPD(MDisp(RSP, offset), (X64Reg) x); + offset += 16; + } + } +} + +void XEmitter::ABI_PopRegistersAndAdjustStack(u32 mask, bool noProlog) +{ + int regSize = +#ifdef _M_X64 + 8; +#else + 4; +#endif + int size = 0; +#if defined(_WIN32) && defined(_M_X64) + size += 0x20; +#endif + for (int x = 0; x < 16; x++) + { + if (mask & (1 << (16 + x))) + { + MOVAPD((X64Reg) x, MDisp(RSP, size)); + size += 16; + } + } + int count = 0; + for (int r = 0; r < 16; r++) + { + if (mask & (1 << r)) + count++; + } + size += ((noProlog ? -regSize : 0) - (count * regSize)) & 0xf; + + if (size) + ADD(regSize * 8, R(RSP), size >= 0x80 ? Imm32(size) : Imm8(size)); + for (int r = 15; r >= 0; r--) + { + if (mask & (1 << r)) + { + POP((X64Reg) r); + } + } } #ifdef _M_IX86 // All32 @@ -129,13 +221,13 @@ void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) { } // Pass two registers as parameters. -void XEmitter::ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2) +void XEmitter::ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2, bool noProlog) { - ABI_AlignStack(2 * 4); + ABI_AlignStack(2 * 4, noProlog); PUSH(32, R(reg2)); PUSH(32, R(reg1)); CALL(func); - ABI_RestoreStack(2 * 4); + ABI_RestoreStack(2 * 4, noProlog); } void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2) @@ -156,60 +248,27 @@ void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) } void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() { - // Note: 4 * 4 = 16 bytes, so alignment is preserved. PUSH(EBP); + MOV(32, R(EBP), R(ESP)); PUSH(EBX); PUSH(ESI); PUSH(EDI); + SUB(32, R(ESP), Imm8(0xc)); } void XEmitter::ABI_PopAllCalleeSavedRegsAndAdjustStack() { + ADD(32, R(ESP), Imm8(0xc)); POP(EDI); POP(ESI); POP(EBX); POP(EBP); } -unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize) { - frameSize += 4; // reserve space for return address - unsigned int alignedSize = -#ifdef __GNUC__ - (frameSize + 15) & -16; -#else - (frameSize + 3) & -4; -#endif - return alignedSize; -} - - -void XEmitter::ABI_AlignStack(unsigned int frameSize) { -// Mac OS X requires the stack to be 16-byte aligned before every call. -// Linux requires the stack to be 16-byte aligned before calls that put SSE -// vectors on the stack, but since we do not keep track of which calls do that, -// it is effectively every call as well. -// Windows binaries compiled with MSVC do not have such a restriction*, but I -// expect that GCC on Windows acts the same as GCC on Linux in this respect. -// It would be nice if someone could verify this. -// *However, the MSVC optimizing compiler assumes a 4-byte-aligned stack at times. - unsigned int fillSize = - ABI_GetAlignedFrameSize(frameSize) - (frameSize + 4); - if (fillSize != 0) { - SUB(32, R(ESP), Imm8(fillSize)); - } -} - -void XEmitter::ABI_RestoreStack(unsigned int frameSize) { - unsigned int alignedSize = ABI_GetAlignedFrameSize(frameSize); - alignedSize -= 4; // return address is POPped at end of call - if (alignedSize != 0) { - ADD(32, R(ESP), Imm8(alignedSize)); - } -} - #else //64bit // Common functions void XEmitter::ABI_CallFunction(void *func) { + ABI_AlignStack(0); u64 distance = u64(func) - (u64(code) + 5); if (distance >= 0x0000000080000000ULL && distance < 0xFFFFFFFF80000000ULL) { @@ -219,9 +278,11 @@ void XEmitter::ABI_CallFunction(void *func) { } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionC16(void *func, u16 param1) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32((u32)param1)); u64 distance = u64(func) - (u64(code) + 5); if (distance >= 0x0000000080000000ULL @@ -232,9 +293,11 @@ void XEmitter::ABI_CallFunctionC16(void *func, u16 param1) { } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionCC16(void *func, u32 param1, u16 param2) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); MOV(32, R(ABI_PARAM2), Imm32((u32)param2)); u64 distance = u64(func) - (u64(code) + 5); @@ -246,9 +309,11 @@ void XEmitter::ABI_CallFunctionCC16(void *func, u32 param1, u16 param2) { } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionC(void *func, u32 param1) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); u64 distance = u64(func) - (u64(code) + 5); if (distance >= 0x0000000080000000ULL @@ -259,9 +324,11 @@ void XEmitter::ABI_CallFunctionC(void *func, u32 param1) { } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionCC(void *func, u32 param1, u32 param2) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); MOV(32, R(ABI_PARAM2), Imm32(param2)); u64 distance = u64(func) - (u64(code) + 5); @@ -273,9 +340,11 @@ void XEmitter::ABI_CallFunctionCC(void *func, u32 param1, u32 param2) { } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionCCC(void *func, u32 param1, u32 param2, u32 param3) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); MOV(32, R(ABI_PARAM2), Imm32(param2)); MOV(32, R(ABI_PARAM3), Imm32(param3)); @@ -288,9 +357,11 @@ void XEmitter::ABI_CallFunctionCCC(void *func, u32 param1, u32 param2, u32 param } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionCCP(void *func, u32 param1, u32 param2, void *param3) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); MOV(32, R(ABI_PARAM2), Imm32(param2)); MOV(64, R(ABI_PARAM3), Imm64((u64)param3)); @@ -303,9 +374,11 @@ void XEmitter::ABI_CallFunctionCCP(void *func, u32 param1, u32 param2, void *par } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionCCCP(void *func, u32 param1, u32 param2, u32 param3, void *param4) { + ABI_AlignStack(0); MOV(32, R(ABI_PARAM1), Imm32(param1)); MOV(32, R(ABI_PARAM2), Imm32(param2)); MOV(32, R(ABI_PARAM3), Imm32(param3)); @@ -319,9 +392,11 @@ void XEmitter::ABI_CallFunctionCCCP(void *func, u32 param1, u32 param2, u32 para } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionPPC(void *func, void *param1, void *param2, u32 param3) { + ABI_AlignStack(0); MOV(64, R(ABI_PARAM1), Imm64((u64)param1)); MOV(64, R(ABI_PARAM2), Imm64((u64)param2)); MOV(32, R(ABI_PARAM3), Imm32(param3)); @@ -334,10 +409,12 @@ void XEmitter::ABI_CallFunctionPPC(void *func, void *param1, void *param2, u32 p } else { CALL(func); } + ABI_RestoreStack(0); } // Pass a register as a parameter. void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) { + ABI_AlignStack(0); if (reg1 != ABI_PARAM1) MOV(32, R(ABI_PARAM1), R(reg1)); u64 distance = u64(func) - (u64(code) + 5); @@ -349,10 +426,12 @@ void XEmitter::ABI_CallFunctionR(void *func, X64Reg reg1) { } else { CALL(func); } + ABI_RestoreStack(0); } // Pass two registers as parameters. -void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2) { +void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2, bool noProlog) { + ABI_AlignStack(0, noProlog); if (reg2 != ABI_PARAM1) { if (reg1 != ABI_PARAM1) MOV(64, R(ABI_PARAM1), R(reg1)); @@ -373,10 +452,12 @@ void XEmitter::ABI_CallFunctionRR(void *func, X64Reg reg1, X64Reg reg2) { } else { CALL(func); } + ABI_RestoreStack(0, noProlog); } void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2) { + ABI_AlignStack(0); if (!arg1.IsSimpleReg(ABI_PARAM1)) MOV(32, R(ABI_PARAM1), arg1); MOV(32, R(ABI_PARAM2), Imm32(param2)); @@ -389,10 +470,12 @@ void XEmitter::ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2 } else { CALL(func); } + ABI_RestoreStack(0); } void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) { + ABI_AlignStack(0); if (!arg1.IsSimpleReg(ABI_PARAM1)) MOV(32, R(ABI_PARAM1), arg1); u64 distance = u64(func) - (u64(code) + 5); @@ -404,127 +487,61 @@ void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) } else { CALL(func); } -} - -unsigned int XEmitter::ABI_GetAlignedFrameSize(unsigned int frameSize) { - return frameSize; + ABI_RestoreStack(0); } #ifdef _WIN32 - // Win64 Specific Code + void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() { //we only want to do this once - PUSH(RBX); - PUSH(RSI); - PUSH(RDI); PUSH(RBP); - PUSH(R12); - PUSH(R13); - PUSH(R14); + MOV(64, R(RBP), R(RSP)); + PUSH(RBX); + PUSH(RSI); + PUSH(RDI); + PUSH(R12); + PUSH(R13); + PUSH(R14); PUSH(R15); + SUB(64, R(RSP), Imm8(0x28)); //TODO: Also preserve XMM0-3? - ABI_AlignStack(0); } void XEmitter::ABI_PopAllCalleeSavedRegsAndAdjustStack() { - ABI_RestoreStack(0); - POP(R15); - POP(R14); - POP(R13); - POP(R12); - POP(RBP); - POP(RDI); - POP(RSI); - POP(RBX); -} - -// Win64 Specific Code -void XEmitter::ABI_PushAllCallerSavedRegsAndAdjustStack() { - PUSH(RCX); - PUSH(RDX); - PUSH(RSI); - PUSH(RDI); - PUSH(R8); - PUSH(R9); - PUSH(R10); - PUSH(R11); - //TODO: Also preserve XMM0-15? - ABI_AlignStack(0); -} - -void XEmitter::ABI_PopAllCallerSavedRegsAndAdjustStack() { - ABI_RestoreStack(0); - POP(R11); - POP(R10); - POP(R9); - POP(R8); - POP(RDI); - POP(RSI); - POP(RDX); - POP(RCX); -} - -void XEmitter::ABI_AlignStack(unsigned int /*frameSize*/) { - SUB(64, R(RSP), Imm8(0x28)); -} - -void XEmitter::ABI_RestoreStack(unsigned int /*frameSize*/) { ADD(64, R(RSP), Imm8(0x28)); + POP(R15); + POP(R14); + POP(R13); + POP(R12); + POP(RDI); + POP(RSI); + POP(RBX); + POP(RBP); } #else // Unix64 Specific Code + void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() { - PUSH(RBX); PUSH(RBP); - PUSH(R12); - PUSH(R13); - PUSH(R14); + MOV(64, R(RBP), R(RSP)); + PUSH(RBX); + PUSH(R12); + PUSH(R13); + PUSH(R14); PUSH(R15); - PUSH(R15); //just to align stack. duped push/pop doesn't hurt. + SUB(64, R(RSP), Imm8(8)); } void XEmitter::ABI_PopAllCalleeSavedRegsAndAdjustStack() { + ADD(64, R(RSP), Imm8(8)); POP(R15); - POP(R15); - POP(R14); - POP(R13); + POP(R14); + POP(R13); POP(R12); + POP(RBX); POP(RBP); - POP(RBX); -} - -void XEmitter::ABI_PushAllCallerSavedRegsAndAdjustStack() { - PUSH(RCX); - PUSH(RDX); - PUSH(RSI); - PUSH(RDI); - PUSH(R8); - PUSH(R9); - PUSH(R10); - PUSH(R11); - PUSH(R11); -} - -void XEmitter::ABI_PopAllCallerSavedRegsAndAdjustStack() { - POP(R11); - POP(R11); - POP(R10); - POP(R9); - POP(R8); - POP(RDI); - POP(RSI); - POP(RDX); - POP(RCX); -} - -void XEmitter::ABI_AlignStack(unsigned int /*frameSize*/) { - SUB(64, R(RSP), Imm8(0x08)); -} - -void XEmitter::ABI_RestoreStack(unsigned int /*frameSize*/) { - ADD(64, R(RSP), Imm8(0x08)); } #endif // WIN32 diff --git a/Source/Core/Common/Src/x64ABI.h b/Source/Core/Common/Src/x64ABI.h index 837e4ec3d8..c315c9cdd0 100644 --- a/Source/Core/Common/Src/x64ABI.h +++ b/Source/Core/Common/Src/x64ABI.h @@ -43,16 +43,24 @@ // 32-bit bog standard cdecl, shared between linux and windows // MacOSX 32-bit is same as System V with a few exceptions that we probably don't care much about. +#define ABI_ALL_CALLEE_SAVED ((1 << EAX) | (1 << ECX) | (1 << EDX) | \ + 0xff00 /* xmm0..7 */) + #else // 64 bit calling convention -#ifdef _WIN32 // 64-bit Windows - the really exotic calling convention +#ifdef _WIN32 // 64-bit Windows - the really exotic calling convention #define ABI_PARAM1 RCX #define ABI_PARAM2 RDX #define ABI_PARAM3 R8 #define ABI_PARAM4 R9 -#else //64-bit Unix (hopefully MacOSX too) +#define ABI_ALL_CALLEE_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << R8) | \ + (1 << R9) | (1 << R10) | (1 << R11) | \ + (1 << XMM0) | (1 << XMM1) | (1 << XMM2) | (1 << XMM3) | \ + (1 << XMM4) | (1 << XMM5)) + +#else //64-bit Unix / OS X #define ABI_PARAM1 RDI #define ABI_PARAM2 RSI @@ -61,6 +69,10 @@ #define ABI_PARAM5 R8 #define ABI_PARAM6 R9 +#define ABI_ALL_CALLEE_SAVED ((1 << RAX) | (1 << RCX) | (1 << RDX) | (1 << RDI) | \ + (1 << RSI) | (1 << R8) | (1 << R9) | (1 << R10) | (1 << R11) | \ + 0xffff0000 /* xmm0..15 */) + #endif // WIN32 #endif // X86 diff --git a/Source/Core/Common/Src/x64Analyzer.cpp b/Source/Core/Common/Src/x64Analyzer.cpp index 456830e467..eac178ff21 100644 --- a/Source/Core/Common/Src/x64Analyzer.cpp +++ b/Source/Core/Common/Src/x64Analyzer.cpp @@ -4,19 +4,19 @@ #include "x64Analyzer.h" -bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int accessType) +bool DisassembleMov(const unsigned char *codePtr, InstructionInfo *info) { unsigned const char *startCodePtr = codePtr; u8 rex = 0; u8 codeByte = 0; u8 codeByte2 = 0; - + //Check for regular prefix - info.operandSize = 4; - info.zeroExtend = false; - info.signExtend = false; - info.hasImmediate = false; - info.isMemoryWrite = false; + info->operandSize = 4; + info->zeroExtend = false; + info->signExtend = false; + info->hasImmediate = false; + info->isMemoryWrite = false; u8 modRMbyte = 0; u8 sibByte = 0; @@ -26,9 +26,9 @@ bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int acc if (*codePtr == 0x66) { - info.operandSize = 2; + info->operandSize = 2; codePtr++; - } + } else if (*codePtr == 0x67) { codePtr++; @@ -40,24 +40,24 @@ bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int acc rex = *codePtr; if (rex & 8) //REX.W { - info.operandSize = 8; + info->operandSize = 8; } codePtr++; } codeByte = *codePtr++; - // Skip two-byte opcode byte - bool twoByte = false; - if(codeByte == 0x0F) + // Skip two-byte opcode byte + bool twoByte = false; + if(codeByte == 0x0F) { - twoByte = true; + twoByte = true; codeByte2 = *codePtr++; } if (!twoByte) { - if ((codeByte & 0xF0) == 0x80 || + if ((codeByte & 0xF0) == 0x80 || ((codeByte & 0xF8) == 0xC0 && (codeByte & 0x0E) != 0x02)) { modRMbyte = *codePtr++; @@ -66,40 +66,40 @@ bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int acc } else { - if (((codeByte2 & 0xF0) == 0x00 && (codeByte2 & 0x0F) >= 0x04 && (codeByte2 & 0x0D) != 0x0D) || - (codeByte2 & 0xF0) == 0x30 || - codeByte2 == 0x77 || - (codeByte2 & 0xF0) == 0x80 || - ((codeByte2 & 0xF0) == 0xA0 && (codeByte2 & 0x07) <= 0x02) || - (codeByte2 & 0xF8) == 0xC8) - { - // No mod R/M byte - } - else - { + if (((codeByte2 & 0xF0) == 0x00 && (codeByte2 & 0x0F) >= 0x04 && (codeByte2 & 0x0D) != 0x0D) || + (codeByte2 & 0xF0) == 0x30 || + codeByte2 == 0x77 || + (codeByte2 & 0xF0) == 0x80 || + ((codeByte2 & 0xF0) == 0xA0 && (codeByte2 & 0x07) <= 0x02) || + (codeByte2 & 0xF8) == 0xC8) + { + // No mod R/M byte + } + else + { modRMbyte = *codePtr++; hasModRM = true; - } + } } if (hasModRM) { ModRM mrm(modRMbyte, rex); - info.regOperandReg = mrm.reg; + info->regOperandReg = mrm.reg; if (mrm.mod < 3) { if (mrm.rm == 4) { //SIB byte sibByte = *codePtr++; - info.scaledReg = (sibByte >> 3) & 7; - info.otherReg = (sibByte & 7); - if (rex & 2) info.scaledReg += 8; - if (rex & 1) info.otherReg += 8; + info->scaledReg = (sibByte >> 3) & 7; + info->otherReg = (sibByte & 7); + if (rex & 2) info->scaledReg += 8; + if (rex & 1) info->otherReg += 8; } else { - //info.scaledReg = + //info->scaledReg = } } if (mrm.mod == 1 || mrm.mod == 2) @@ -112,100 +112,116 @@ bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int acc } if (displacementSize == 1) - info.displacement = (s32)(s8)*codePtr; + info->displacement = (s32)(s8)*codePtr; else - info.displacement = *((s32 *)codePtr); + info->displacement = *((s32 *)codePtr); codePtr += displacementSize; - if (accessType == 1) + switch (codeByte) { - info.isMemoryWrite = true; - //Write access - switch (codeByte) + // writes + case 0xC6: // mem <- imm8 { - case MOVE_8BIT: //move 8-bit immediate - { - info.hasImmediate = true; - info.immediate = *codePtr; - codePtr++; //move past immediate - } - break; - - case MOVE_16_32BIT: //move 16 or 32-bit immediate, easiest case for writes - { - if (info.operandSize == 2) - { - info.hasImmediate = true; - info.immediate = *(u16*)codePtr; - codePtr += 2; - } - else if (info.operandSize == 4) - { - info.hasImmediate = true; - info.immediate = *(u32*)codePtr; - codePtr += 4; - } - else if (info.operandSize == 8) - { - info.zeroExtend = true; - info.immediate = *(u32*)codePtr; - codePtr += 4; - } - } - break; - case MOVE_REG_TO_MEM: //move reg to memory - break; - - default: - PanicAlert("Unhandled disasm case in write handler!\n\nPlease implement or avoid."); - return false; + info->isMemoryWrite = true; + info->hasImmediate = true; + info->immediate = *codePtr; + codePtr++; //move past immediate } - } - else - { - // Memory read + break; - //mov eax, dword ptr [rax] == 8b 00 - switch (codeByte) + case 0xC7: // mem <- imm16/32 { - case 0x0F: + info->isMemoryWrite = true; + if (info->operandSize == 2) + { + info->hasImmediate = true; + info->immediate = *(u16*)codePtr; + codePtr += 2; + } + else if (info->operandSize == 4) + { + info->hasImmediate = true; + info->immediate = *(u32*)codePtr; + codePtr += 4; + } + else if (info->operandSize == 8) + { + info->zeroExtend = true; + info->immediate = *(u32*)codePtr; + codePtr += 4; + } + } + + case 0x88: // mem <- r8 + { + info->isMemoryWrite = true; + if (info->operandSize == 4) + { + info->operandSize = 1; + break; + } + else + return false; + break; + } + + case 0x89: // mem <- r16/32/64 + { + info->isMemoryWrite = true; + break; + } + + case 0x0F: // two-byte escape + { + info->isMemoryWrite = false; switch (codeByte2) { - case MOVZX_BYTE: //movzx on byte - info.zeroExtend = true; - info.operandSize = 1; + case 0xB6: // movzx on byte + info->zeroExtend = true; + info->operandSize = 1; break; - case MOVZX_SHORT: //movzx on short - info.zeroExtend = true; - info.operandSize = 2; + case 0xB7: // movzx on short + info->zeroExtend = true; + info->operandSize = 2; break; - case MOVSX_BYTE: //movsx on byte - info.signExtend = true; - info.operandSize = 1; + case 0xBE: // movsx on byte + info->signExtend = true; + info->operandSize = 1; break; - case MOVSX_SHORT: //movsx on short - info.signExtend = true; - info.operandSize = 2; + case 0xBF: // movsx on short + info->signExtend = true; + info->operandSize = 2; break; default: return false; } break; - case 0x8a: - if (info.operandSize == 4) + } + + case 0x8A: // r8 <- mem + { + info->isMemoryWrite = false; + if (info->operandSize == 4) { - info.operandSize = 1; + info->operandSize = 1; break; } - else + else return false; - case 0x8b: - break; //it's OK don't need to do anything - default: - return false; } + + case 0x8B: // r16/32/64 <- mem + { + info->isMemoryWrite = false; + break; + } + + break; + + default: + return false; } - info.instructionSize = (int)(codePtr - startCodePtr); + info->instructionSize = (int)(codePtr - startCodePtr); return true; } diff --git a/Source/Core/Common/Src/x64Analyzer.h b/Source/Core/Common/Src/x64Analyzer.h index 705bcd0e9c..778c34738c 100644 --- a/Source/Core/Common/Src/x64Analyzer.h +++ b/Source/Core/Common/Src/x64Analyzer.h @@ -5,7 +5,7 @@ #ifndef _X64ANALYZER_H_ #define _X64ANALYZER_H_ -#include "Common.h" +#include "CommonTypes.h" struct InstructionInfo { @@ -33,21 +33,12 @@ struct ModRM } }; -enum{ - MOVZX_BYTE = 0xB6, //movzx on byte - MOVZX_SHORT = 0xB7, //movzx on short - MOVSX_BYTE = 0xBE, //movsx on byte - MOVSX_SHORT = 0xBF, //movsx on short - MOVE_8BIT = 0xC6, //move 8-bit immediate - MOVE_16_32BIT = 0xC7, //move 16 or 32-bit immediate - MOVE_REG_TO_MEM = 0x89, //move reg to memory -}; - -enum AccessType{ +enum AccessType +{ OP_ACCESS_READ = 0, OP_ACCESS_WRITE = 1 }; -bool DisassembleMov(const unsigned char *codePtr, InstructionInfo &info, int accessType); +bool DisassembleMov(const unsigned char *codePtr, InstructionInfo *info); #endif // _X64ANALYZER_H_ diff --git a/Source/Core/Common/Src/x64CPUDetect.cpp b/Source/Core/Common/Src/x64CPUDetect.cpp index b72a146167..2fa25e8074 100644 --- a/Source/Core/Common/Src/x64CPUDetect.cpp +++ b/Source/Core/Common/Src/x64CPUDetect.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include "Common.h" #ifdef _WIN32 #define _interlockedbittestandset workaround_ms_header_bug_platform_sdk6_set @@ -75,9 +76,11 @@ static void __cpuid(int info[4], int x) #define _XCR_XFEATURE_ENABLED_MASK 0 static unsigned long long _xgetbv(unsigned int index) { +#ifndef _M_GENERIC unsigned int eax, edx; __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index)); return ((unsigned long long)edx << 32) | eax; +#endif } #endif @@ -111,19 +114,19 @@ void CPUInfo::Detect() OS64bit = (f64 == TRUE) ? true : false; #endif #endif - + // Set obvious defaults, for extra safety if (Mode64bit) { bSSE = true; bSSE2 = true; bLongMode = true; } - + // Assume CPU supports the CPUID instruction. Those that don't can barely // boot modern OS:es anyway. int cpu_id[4]; memset(cpu_string, 0, sizeof(cpu_string)); - + // Detect CPU's CPUID capabilities, and grab cpu string __cpuid(cpu_id, 0x00000000); u32 max_std_fn = cpu_id[0]; // EAX @@ -138,10 +141,10 @@ void CPUInfo::Detect() vendor = VENDOR_AMD; else vendor = VENDOR_OTHER; - + // Set reasonable default brand string even if brand string not available. strcpy(brand_string, cpu_string); - + // Detect family and other misc stuff. bool ht = false; HTT = ht; @@ -159,14 +162,46 @@ void CPUInfo::Detect() if ((cpu_id[2] >> 20) & 1) bSSE4_2 = true; if ((cpu_id[2] >> 25) & 1) bAES = true; + // To check DAZ support, we first need to check FXSAVE support. + if ((cpu_id[3] >> 24) & 1) + { + // We can use FXSAVE. + bFXSR = true; + + GC_ALIGNED16(u8 fx_state[512]); + memset(fx_state, 0, sizeof(fx_state)); +#ifdef _WIN32 +#ifdef _M_IX86 + _fxsave(fx_state); +#elif defined (_M_X64) + _fxsave64(fx_state); +#endif +#else + __asm__("fxsave %0" : "=m" (fx_state)); +#endif + + // lowest byte of MXCSR_MASK + if ((fx_state[0x1C] >> 6) & 1) + { + // On x86, the FTZ field (supported since SSE1) only flushes denormal _outputs_ to zero, + // now that we checked DAZ support (flushing denormal _inputs_ to zero), + // we can set our generic flag. + bFlushToZero = true; + } + } + // AVX support requires 3 separate checks: // - Is the AVX bit set in CPUID? // - Is the XSAVE bit set in CPUID? // - XGETBV result has the XCR bit set. if (((cpu_id[2] >> 28) & 1) && ((cpu_id[2] >> 27) & 1)) { - if (_xgetbv(_XCR_XFEATURE_ENABLED_MASK) & 0x6) + if ((_xgetbv(_XCR_XFEATURE_ENABLED_MASK) & 0x6) == 0x6) + { bAVX = true; + if ((cpu_id[2] >> 12) & 1) + bFMA = true; + } } } if (max_ex_fn >= 0x80000004) { @@ -186,7 +221,7 @@ void CPUInfo::Detect() } num_cores = (logical_cpu_count == 0) ? 1 : logical_cpu_count; - + if (max_ex_fn >= 0x80000008) { // Get number of cores. This is a bit complicated. Following AMD manual here. __cpuid(cpu_id, 0x80000008); @@ -207,7 +242,7 @@ void CPUInfo::Detect() // Use AMD's new method. num_cores = (cpu_id[2] & 0xFF) + 1; } - } + } } // Turn the cpu info into a string we can show @@ -215,13 +250,19 @@ std::string CPUInfo::Summarize() { std::string sum(cpu_string); if (bSSE) sum += ", SSE"; - if (bSSE2) sum += ", SSE2"; + if (bSSE2) + { + sum += ", SSE2"; + if (!bFlushToZero) + sum += " (but not DAZ!)"; + } if (bSSE3) sum += ", SSE3"; if (bSSSE3) sum += ", SSSE3"; if (bSSE4_1) sum += ", SSE4.1"; if (bSSE4_2) sum += ", SSE4.2"; if (HTT) sum += ", HTT"; if (bAVX) sum += ", AVX"; + if (bFMA) sum += ", FMA"; if (bAES) sum += ", AES"; if (bLongMode) sum += ", 64-bit support"; return sum; diff --git a/Source/Core/Common/Src/x64Emitter.cpp b/Source/Core/Common/Src/x64Emitter.cpp index 7725b63fd8..05540ba4a8 100644 --- a/Source/Core/Common/Src/x64Emitter.cpp +++ b/Source/Core/Common/Src/x64Emitter.cpp @@ -7,6 +7,8 @@ #include "x64ABI.h" #include "CPUDetect.h" +#include + namespace Gen { @@ -16,7 +18,7 @@ struct NormalOpDef u8 toRm8, toRm32, fromRm8, fromRm32, imm8, imm32, simm8, ext; }; -static const NormalOpDef nops[11] = +static const NormalOpDef nops[11] = { {0x00, 0x01, 0x02, 0x03, 0x80, 0x81, 0x83, 0}, //ADD {0x10, 0x11, 0x12, 0x13, 0x80, 0x81, 0x83, 2}, //ADC @@ -38,28 +40,28 @@ static const NormalOpDef nops[11] = enum NormalSSEOps { - sseCMP = 0xC2, - sseADD = 0x58, //ADD - sseSUB = 0x5C, //SUB - sseAND = 0x54, //AND - sseANDN = 0x55, //ANDN - sseOR = 0x56, - sseXOR = 0x57, - sseMUL = 0x59, //MUL, - sseDIV = 0x5E, //DIV - sseMIN = 0x5D, //MIN - sseMAX = 0x5F, //MAX - sseCOMIS = 0x2F, //COMIS - sseUCOMIS = 0x2E, //UCOMIS - sseSQRT = 0x51, //SQRT - sseRSQRT = 0x52, //RSQRT (NO DOUBLE PRECISION!!!) + sseCMP = 0xC2, + sseADD = 0x58, //ADD + sseSUB = 0x5C, //SUB + sseAND = 0x54, //AND + sseANDN = 0x55, //ANDN + sseOR = 0x56, + sseXOR = 0x57, + sseMUL = 0x59, //MUL + sseDIV = 0x5E, //DIV + sseMIN = 0x5D, //MIN + sseMAX = 0x5F, //MAX + sseCOMIS = 0x2F, //COMIS + sseUCOMIS = 0x2E, //UCOMIS + sseSQRT = 0x51, //SQRT + sseRSQRT = 0x52, //RSQRT (NO DOUBLE PRECISION!!!) sseMOVAPfromRM = 0x28, //MOVAP from RM - sseMOVAPtoRM = 0x29, //MOVAP to RM + sseMOVAPtoRM = 0x29, //MOVAP to RM sseMOVUPfromRM = 0x10, //MOVUP from RM - sseMOVUPtoRM = 0x11, //MOVUP to RM - sseMASKMOVDQU = 0xF7, - sseLDDQU = 0xF0, - sseSHUF = 0xC6, + sseMOVUPtoRM = 0x11, //MOVUP to RM + sseMASKMOVDQU = 0xF7, + sseLDDQU = 0xF0, + sseSHUF = 0xC6, sseMOVNTDQ = 0xE7, sseMOVNTP = 0x2B, }; @@ -154,8 +156,42 @@ void OpArg::WriteRex(XEmitter *emit, int opBits, int bits, int customOp) const #endif } +void OpArg::WriteVex(XEmitter* emit, int size, int packed, Gen::X64Reg regOp1, Gen::X64Reg regOp2) const +{ + int R = !(regOp1 & 8); + int X = !(indexReg & 8); + int B = !(offsetOrBaseReg & 8); + + // not so sure about this one... + int W = 0; + + // aka map_select in AMD manuals + // only support VEX opcode map 1 for now (analog to secondary opcode map) + int mmmmm = 1; + + int vvvv = (regOp2 == X64Reg::INVALID_REG) ? 0xf : (regOp2 ^ 0xf); + int L = size == 256; + int pp = (packed << 1) | (size == 64); + + // do we need any VEX fields that only appear in the three-byte form? + if (X == 1 && B == 1 && W == 0 && mmmmm == 1) + { + u8 RvvvvLpp = (R << 7) | (vvvv << 3) | (L << 1) | pp; + emit->Write8(0xC5); + emit->Write8(RvvvvLpp); + } + else + { + u8 RXBmmmmm = (R << 7) | (X << 6) | (B << 5) | mmmmm; + u8 WvvvvLpp = (W << 7) | (vvvv << 3) | (L << 1) | pp; + emit->Write8(0xC4); + emit->Write8(RXBmmmmm); + emit->Write8(WvvvvLpp); + } +} + void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, - bool warn_64bit_offset) const + bool warn_64bit_offset) const { if (_operandReg == 0xff) _operandReg = (X64Reg)this->operandReg; @@ -176,7 +212,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, _assert_msg_(DYNA_REC, (distance < 0x80000000LL && distance >= -0x80000000LL) || !warn_64bit_offset, - "WriteRest: op out of range (0x%llx uses 0x%llx)", + "WriteRest: op out of range (0x%" PRIx64 " uses 0x%" PRIx64 ")", ripAddr, offset); s32 offs = (s32)distance; emit->Write32((u32)offs); @@ -230,7 +266,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, SIB = true; } - if (scale == SCALE_ATREG && ((_offsetOrBaseReg & 7) == 4)) + if (scale == SCALE_ATREG && ((_offsetOrBaseReg & 7) == 4)) { SIB = true; ireg = _offsetOrBaseReg; @@ -255,7 +291,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, int oreg = _offsetOrBaseReg; if (SIB) oreg = 4; - + // TODO(ector): WTF is this if about? I don't remember writing it :-) //if (RIP) // oreg = 5; @@ -268,7 +304,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, int ss; switch (scale) { - case SCALE_NONE: _offsetOrBaseReg = 4; ss = 0; break; //RSP + case SCALE_NONE: _offsetOrBaseReg = 4; ss = 0; break; //RSP case SCALE_1: ss = 0; break; case SCALE_2: ss = 1; break; case SCALE_4: ss = 2; break; @@ -299,7 +335,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg, // B = base register# upper bit void XEmitter::Rex(int w, int r, int x, int b) { - w = w ? 1 : 0; + w = w ? 1 : 0; r = r ? 1 : 0; x = x ? 1 : 0; b = b ? 1 : 0; @@ -495,7 +531,7 @@ void XEmitter::NOP(int count) } break; } -} +} void XEmitter::PAUSE() {Write8(0xF3); NOP();} //use in tight spinloops for energy saving on some cpu void XEmitter::CLC() {Write8(0xF8);} //clear carry @@ -557,8 +593,8 @@ void XEmitter::CBW(int bits) void XEmitter::PUSH(X64Reg reg) {WriteSimple1Byte(32, 0x50, reg);} void XEmitter::POP(X64Reg reg) {WriteSimple1Byte(32, 0x58, reg);} -void XEmitter::PUSH(int bits, const OpArg ®) -{ +void XEmitter::PUSH(int bits, const OpArg ®) +{ if (reg.IsSimpleReg()) PUSH(reg.GetSimpleReg()); else if (reg.IsImm()) @@ -594,7 +630,7 @@ void XEmitter::PUSH(int bits, const OpArg ®) } void XEmitter::POP(int /*bits*/, const OpArg ®) -{ +{ if (reg.IsSimpleReg()) POP(reg.GetSimpleReg()); else @@ -787,7 +823,7 @@ void XEmitter::WriteShift(int bits, OpArg dest, OpArg &shift, int ext) } if ((shift.IsSimpleReg() && shift.GetSimpleReg() != ECX) || (shift.IsImm() && shift.GetImmBits() != 8)) { - _assert_msg_(DYNA_REC, 0, "WriteShift - illegal argument"); + _assert_msg_(DYNA_REC, 0, "WriteShift - illegal argument"); } dest.operandReg = ext; if (bits == 16) Write8(0x66); @@ -834,7 +870,7 @@ void XEmitter::WriteBitTest(int bits, OpArg &dest, OpArg &index, int ext) } if ((index.IsImm() && index.GetImmBits() != 8)) { - _assert_msg_(DYNA_REC, 0, "WriteBitTest - illegal argument"); + _assert_msg_(DYNA_REC, 0, "WriteBitTest - illegal argument"); } if (bits == 16) Write8(0x66); if (index.IsImm()) @@ -871,7 +907,7 @@ void XEmitter::SHRD(int bits, OpArg dest, OpArg src, OpArg shift) } if ((shift.IsSimpleReg() && shift.GetSimpleReg() != ECX) || (shift.IsImm() && shift.GetImmBits() != 8)) { - _assert_msg_(DYNA_REC, 0, "SHRD - illegal shift"); + _assert_msg_(DYNA_REC, 0, "SHRD - illegal shift"); } if (bits == 16) Write8(0x66); X64Reg operand = src.GetSimpleReg(); @@ -901,7 +937,7 @@ void XEmitter::SHLD(int bits, OpArg dest, OpArg src, OpArg shift) } if ((shift.IsSimpleReg() && shift.GetSimpleReg() != ECX) || (shift.IsImm() && shift.GetImmBits() != 8)) { - _assert_msg_(DYNA_REC, 0, "SHLD - illegal shift"); + _assert_msg_(DYNA_REC, 0, "SHLD - illegal shift"); } if (bits == 16) Write8(0x66); X64Reg operand = src.GetSimpleReg(); @@ -954,13 +990,13 @@ void OpArg::WriteNormalOp(XEmitter *emit, bool toRM, NormalOp op, const OpArg &o _assert_msg_(DYNA_REC, 0, "WriteNormalOp - Writing to Imm (!toRM)"); } - if (operand.scale == SCALE_IMM8 && bits == 8) + if (operand.scale == SCALE_IMM8 && bits == 8) { emit->Write8(nops[op].imm8); immToWrite = 8; } else if ((operand.scale == SCALE_IMM16 && bits == 16) || - (operand.scale == SCALE_IMM32 && bits == 32) || + (operand.scale == SCALE_IMM32 && bits == 32) || (operand.scale == SCALE_IMM32 && bits == 64)) { emit->Write8(nops[op].imm32); @@ -1056,11 +1092,11 @@ void XEmitter::SBB (int bits, const OpArg &a1, const OpArg &a2) {WriteNormalOp(t void XEmitter::AND (int bits, const OpArg &a1, const OpArg &a2) {WriteNormalOp(this, bits, nrmAND, a1, a2);} void XEmitter::OR (int bits, const OpArg &a1, const OpArg &a2) {WriteNormalOp(this, bits, nrmOR , a1, a2);} void XEmitter::XOR (int bits, const OpArg &a1, const OpArg &a2) {WriteNormalOp(this, bits, nrmXOR, a1, a2);} -void XEmitter::MOV (int bits, const OpArg &a1, const OpArg &a2) +void XEmitter::MOV (int bits, const OpArg &a1, const OpArg &a2) { #ifdef _DEBUG - _assert_msg_(DYNA_REC, !a1.IsSimpleReg() || !a2.IsSimpleReg() || a1.GetSimpleReg() != a2.GetSimpleReg(), "Redundant MOV @ %p - bug in JIT?", - code); + _assert_msg_(DYNA_REC, !a1.IsSimpleReg() || !a2.IsSimpleReg() || a1.GetSimpleReg() != a2.GetSimpleReg(), "Redundant MOV @ %p - bug in JIT?", + code); #endif WriteNormalOp(this, bits, nrmMOV, a1, a2); } @@ -1141,6 +1177,18 @@ void XEmitter::WriteSSEOp(int size, u8 sseOp, bool packed, X64Reg regOp, OpArg a arg.WriteRest(this, extrabytes); } +void XEmitter::WriteAVXOp(int size, u8 sseOp, bool packed, X64Reg regOp, OpArg arg, int extrabytes) +{ + WriteAVXOp(size, sseOp, packed, regOp, X64Reg::INVALID_REG, arg, extrabytes); +} + +void XEmitter::WriteAVXOp(int size, u8 sseOp, bool packed, X64Reg regOp1, X64Reg regOp2, OpArg arg, int extrabytes) +{ + arg.WriteVex(this, size, packed, regOp1, regOp2); + Write8(sseOp); + arg.WriteRest(this, extrabytes, regOp1); +} + void XEmitter::MOVD_xmm(X64Reg dest, const OpArg &arg) {WriteSSEOp(64, 0x6E, true, dest, arg, 0);} void XEmitter::MOVD_xmm(const OpArg &arg, X64Reg src) {WriteSSEOp(64, 0x7E, true, src, arg, 0);} @@ -1188,7 +1236,7 @@ void XEmitter::MOVQ_xmm(OpArg arg, X64Reg src) { void XEmitter::WriteMXCSR(OpArg arg, int ext) { - if (arg.IsImm() || arg.IsSimpleReg()) + if (arg.IsImm() || arg.IsSimpleReg()) _assert_msg_(DYNA_REC, 0, "MXCSR - invalid operand"); arg.operandReg = ext; @@ -1248,8 +1296,8 @@ void XEmitter::MAXPD(X64Reg regOp, OpArg arg) {WriteSSEOp(64, sseMAX, true, re void XEmitter::SQRTPS(X64Reg regOp, OpArg arg) {WriteSSEOp(32, sseSQRT, true, regOp, arg);} void XEmitter::SQRTPD(X64Reg regOp, OpArg arg) {WriteSSEOp(64, sseSQRT, true, regOp, arg);} void XEmitter::RSQRTPS(X64Reg regOp, OpArg arg) {WriteSSEOp(32, sseRSQRT, true, regOp, arg);} -void XEmitter::SHUFPS(X64Reg regOp, OpArg arg, u8 shuffle) {WriteSSEOp(32, sseSHUF, true, regOp, arg,1); Write8(shuffle);} -void XEmitter::SHUFPD(X64Reg regOp, OpArg arg, u8 shuffle) {WriteSSEOp(64, sseSHUF, true, regOp, arg,1); Write8(shuffle);} +void XEmitter::SHUFPS(X64Reg regOp, OpArg arg, u8 shuffle) {WriteSSEOp(32, sseSHUF, true, regOp, arg,1); Write8(shuffle);} +void XEmitter::SHUFPD(X64Reg regOp, OpArg arg, u8 shuffle) {WriteSSEOp(64, sseSHUF, true, regOp, arg,1); Write8(shuffle);} void XEmitter::COMISS(X64Reg regOp, OpArg arg) {WriteSSEOp(32, sseCOMIS, true, regOp, arg);} //weird that these should be packed void XEmitter::COMISD(X64Reg regOp, OpArg arg) {WriteSSEOp(64, sseCOMIS, true, regOp, arg);} //ordered @@ -1276,7 +1324,7 @@ void XEmitter::CVTPD2PS(X64Reg regOp, OpArg arg) {WriteSSEOp(64, 0x5A, true, reg void XEmitter::CVTSD2SS(X64Reg regOp, OpArg arg) {WriteSSEOp(64, 0x5A, false, regOp, arg);} void XEmitter::CVTSS2SD(X64Reg regOp, OpArg arg) {WriteSSEOp(32, 0x5A, false, regOp, arg);} -void XEmitter::CVTSD2SI(X64Reg regOp, OpArg arg) {WriteSSEOp(32, 0xF2, false, regOp, arg);} +void XEmitter::CVTSD2SI(X64Reg regOp, OpArg arg) {WriteSSEOp(64, 0x2D, false, regOp, arg);} void XEmitter::CVTDQ2PD(X64Reg regOp, OpArg arg) {WriteSSEOp(32, 0xE6, false, regOp, arg);} void XEmitter::CVTDQ2PS(X64Reg regOp, OpArg arg) {WriteSSEOp(32, 0x5B, true, regOp, arg);} @@ -1300,7 +1348,7 @@ void XEmitter::UNPCKHPS(X64Reg dest, OpArg arg) {WriteSSEOp(32, 0x15, true, dest void XEmitter::UNPCKLPD(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0x14, true, dest, arg);} void XEmitter::UNPCKHPD(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0x15, true, dest, arg);} -void XEmitter::MOVDDUP(X64Reg regOp, OpArg arg) +void XEmitter::MOVDDUP(X64Reg regOp, OpArg arg) { if (cpu_info.bSSE3) { @@ -1429,8 +1477,8 @@ void XEmitter::PCMPGTB(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0x64, true, dest void XEmitter::PCMPGTW(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0x65, true, dest, arg);} void XEmitter::PCMPGTD(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0x66, true, dest, arg);} -void XEmitter::PEXTRW(X64Reg dest, OpArg arg, u8 subreg) {WriteSSEOp(64, 0x64, true, dest, arg); Write8(subreg);} -void XEmitter::PINSRW(X64Reg dest, OpArg arg, u8 subreg) {WriteSSEOp(64, 0x64, true, dest, arg); Write8(subreg);} +void XEmitter::PEXTRW(X64Reg dest, OpArg arg, u8 subreg) {WriteSSEOp(64, 0xC5, true, dest, arg); Write8(subreg);} +void XEmitter::PINSRW(X64Reg dest, OpArg arg, u8 subreg) {WriteSSEOp(64, 0xC4, true, dest, arg); Write8(subreg);} void XEmitter::PMADDWD(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0xF5, true, dest, arg); } void XEmitter::PSADBW(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0xF6, true, dest, arg);} @@ -1444,6 +1492,13 @@ void XEmitter::PMOVMSKB(X64Reg dest, OpArg arg) {WriteSSEOp(64, 0xD7, true, d void XEmitter::PSHUFLW(X64Reg regOp, OpArg arg, u8 shuffle) {WriteSSEOp(64, 0x70, false, regOp, arg, 1); Write8(shuffle);} +// VEX +void XEmitter::VADDSD(X64Reg regOp1, X64Reg regOp2, OpArg arg) {WriteAVXOp(64, sseADD, false, regOp1, regOp2, arg);} +void XEmitter::VSUBSD(X64Reg regOp1, X64Reg regOp2, OpArg arg) {WriteAVXOp(64, sseSUB, false, regOp1, regOp2, arg);} +void XEmitter::VMULSD(X64Reg regOp1, X64Reg regOp2, OpArg arg) {WriteAVXOp(64, sseMUL, false, regOp1, regOp2, arg);} +void XEmitter::VDIVSD(X64Reg regOp1, X64Reg regOp2, OpArg arg) {WriteAVXOp(64, sseDIV, false, regOp1, regOp2, arg);} +void XEmitter::VSQRTSD(X64Reg regOp1, X64Reg regOp2, OpArg arg) {WriteAVXOp(64, sseSQRT, false, regOp1, regOp2, arg);} + // Prefixes void XEmitter::LOCK() { Write8(0xF0); } @@ -1456,7 +1511,7 @@ void XEmitter::FWAIT() } void XEmitter::RTDSC() { Write8(0x0F); Write8(0x31); } - + // helper routines for setting pointers void XEmitter::CallCdeclFunction3(void* fnptr, u32 arg0, u32 arg1, u32 arg2) { diff --git a/Source/Core/Common/Src/x64Emitter.h b/Source/Core/Common/Src/x64Emitter.h index b068579a3a..87e76ef21a 100644 --- a/Source/Core/Common/Src/x64Emitter.h +++ b/Source/Core/Common/Src/x64Emitter.h @@ -17,7 +17,7 @@ enum X64Reg { EAX = 0, EBX = 3, ECX = 1, EDX = 2, ESI = 6, EDI = 7, EBP = 5, ESP = 4, - + RAX = 0, RBX = 3, RCX = 1, RDX = 2, RSI = 6, RDI = 7, RBP = 5, RSP = 4, R8 = 8, R9 = 9, R10 = 10,R11 = 11, @@ -30,9 +30,12 @@ enum X64Reg AX = 0, BX = 3, CX = 1, DX = 2, SI = 6, DI = 7, BP = 5, SP = 4, - XMM0=0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, + XMM0=0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, + YMM0=0, YMM1, YMM2, YMM3, YMM4, YMM5, YMM6, YMM7, + YMM8, YMM9, YMM10, YMM11, YMM12, YMM13, YMM14, YMM15, + INVALID_REG = 0xFFFFFFFF }; @@ -43,7 +46,7 @@ enum CCFlags CC_B = 2, CC_C = 2, CC_NAE = 2, CC_NB = 3, CC_NC = 3, CC_AE = 3, CC_Z = 4, CC_E = 4, - CC_NZ = 5, CC_NE = 5, + CC_NZ = 5, CC_NE = 5, CC_BE = 6, CC_NA = 6, CC_NBE = 7, CC_A = 7, CC_S = 8, @@ -111,6 +114,7 @@ struct OpArg offset = _offset; } void WriteRex(XEmitter *emit, int opBits, int bits, int customOp = -1) const; + void WriteVex(XEmitter* emit, int size, int packed, Gen::X64Reg regOp1, X64Reg regOp2) const; void WriteRest(XEmitter *emit, int extraBytes=0, X64Reg operandReg=(X64Reg)0xFF, bool warn_64bit_offset = true) const; void WriteSingleByteOp(XEmitter *emit, u8 op, X64Reg operandReg, int bits); // This one is public - must be written to @@ -239,6 +243,8 @@ private: void WriteBitTest(int bits, OpArg &dest, OpArg &index, int ext); void WriteMXCSR(OpArg arg, int ext); void WriteSSEOp(int size, u8 sseOp, bool packed, X64Reg regOp, OpArg arg, int extrabytes = 0); + void WriteAVXOp(int size, u8 sseOp, bool packed, X64Reg regOp, OpArg arg, int extrabytes = 0); + void WriteAVXOp(int size, u8 sseOp, bool packed, X64Reg regOp1, X64Reg regOp2, OpArg arg, int extrabytes = 0); void WriteNormalOp(XEmitter *emit, int bits, NormalOp op, const OpArg &a1, const OpArg &a2); protected: @@ -264,7 +270,7 @@ public: u8 *GetWritableCodePtr(); // Looking for one of these? It's BANNED!! Some instructions are slow on modern CPU - // INC, DEC, LOOP, LOOPNE, LOOPE, ENTER, LEAVE, XCHG, XLAT, REP MOVSB/MOVSD, REP SCASD + other string instr., + // INC, DEC, LOOP, LOOPNE, LOOPE, ENTER, LEAVE, XCHG, XLAT, REP MOVSB/MOVSD, REP SCASD + other string instr., // INC and DEC are slow on Intel Core, but not on AMD. They create a // false flag dependency because they only update a subset of the flags. // XCHG is SLOW and should be avoided. @@ -353,7 +359,7 @@ public: void DIV(int bits, OpArg src); void IDIV(int bits, OpArg src); - // Shift + // Shift void ROL(int bits, OpArg dest, OpArg shift); void ROR(int bits, OpArg dest, OpArg shift); void RCL(int bits, OpArg dest, OpArg shift); @@ -408,7 +414,7 @@ public: // Sign/zero extension void MOVSX(int dbits, int sbits, X64Reg dest, OpArg src); //automatically uses MOVSXD if necessary - void MOVZX(int dbits, int sbits, X64Reg dest, OpArg src); + void MOVZX(int dbits, int sbits, X64Reg dest, OpArg src); // WARNING - These two take 11-13 cycles and are VectorPath! (AMD64) void STMXCSR(OpArg memloc); @@ -422,40 +428,40 @@ public: void FWAIT(); // SSE/SSE2: Floating point arithmetic - void ADDSS(X64Reg regOp, OpArg arg); - void ADDSD(X64Reg regOp, OpArg arg); - void SUBSS(X64Reg regOp, OpArg arg); - void SUBSD(X64Reg regOp, OpArg arg); - void MULSS(X64Reg regOp, OpArg arg); - void MULSD(X64Reg regOp, OpArg arg); - void DIVSS(X64Reg regOp, OpArg arg); - void DIVSD(X64Reg regOp, OpArg arg); - void MINSS(X64Reg regOp, OpArg arg); - void MINSD(X64Reg regOp, OpArg arg); - void MAXSS(X64Reg regOp, OpArg arg); - void MAXSD(X64Reg regOp, OpArg arg); - void SQRTSS(X64Reg regOp, OpArg arg); - void SQRTSD(X64Reg regOp, OpArg arg); + void ADDSS(X64Reg regOp, OpArg arg); + void ADDSD(X64Reg regOp, OpArg arg); + void SUBSS(X64Reg regOp, OpArg arg); + void SUBSD(X64Reg regOp, OpArg arg); + void MULSS(X64Reg regOp, OpArg arg); + void MULSD(X64Reg regOp, OpArg arg); + void DIVSS(X64Reg regOp, OpArg arg); + void DIVSD(X64Reg regOp, OpArg arg); + void MINSS(X64Reg regOp, OpArg arg); + void MINSD(X64Reg regOp, OpArg arg); + void MAXSS(X64Reg regOp, OpArg arg); + void MAXSD(X64Reg regOp, OpArg arg); + void SQRTSS(X64Reg regOp, OpArg arg); + void SQRTSD(X64Reg regOp, OpArg arg); void RSQRTSS(X64Reg regOp, OpArg arg); // SSE/SSE2: Floating point bitwise (yes) - void CMPSS(X64Reg regOp, OpArg arg, u8 compare); - void CMPSD(X64Reg regOp, OpArg arg, u8 compare); - void ANDSS(X64Reg regOp, OpArg arg); - void ANDSD(X64Reg regOp, OpArg arg); - void ANDNSS(X64Reg regOp, OpArg arg); - void ANDNSD(X64Reg regOp, OpArg arg); - void ORSS(X64Reg regOp, OpArg arg); - void ORSD(X64Reg regOp, OpArg arg); - void XORSS(X64Reg regOp, OpArg arg); - void XORSD(X64Reg regOp, OpArg arg); + void CMPSS(X64Reg regOp, OpArg arg, u8 compare); + void CMPSD(X64Reg regOp, OpArg arg, u8 compare); + void ANDSS(X64Reg regOp, OpArg arg); + void ANDSD(X64Reg regOp, OpArg arg); + void ANDNSS(X64Reg regOp, OpArg arg); + void ANDNSD(X64Reg regOp, OpArg arg); + void ORSS(X64Reg regOp, OpArg arg); + void ORSD(X64Reg regOp, OpArg arg); + void XORSS(X64Reg regOp, OpArg arg); + void XORSD(X64Reg regOp, OpArg arg); // SSE/SSE2: Floating point packed arithmetic (x4 for float, x2 for double) - void ADDPS(X64Reg regOp, OpArg arg); - void ADDPD(X64Reg regOp, OpArg arg); - void SUBPS(X64Reg regOp, OpArg arg); - void SUBPD(X64Reg regOp, OpArg arg); - void CMPPS(X64Reg regOp, OpArg arg, u8 compare); + void ADDPS(X64Reg regOp, OpArg arg); + void ADDPD(X64Reg regOp, OpArg arg); + void SUBPS(X64Reg regOp, OpArg arg); + void SUBPD(X64Reg regOp, OpArg arg); + void CMPPS(X64Reg regOp, OpArg arg, u8 compare); void CMPPD(X64Reg regOp, OpArg arg, u8 compare); void MULPS(X64Reg regOp, OpArg arg); void MULPD(X64Reg regOp, OpArg arg); @@ -470,8 +476,8 @@ public: void RSQRTPS(X64Reg regOp, OpArg arg); // SSE/SSE2: Floating point packed bitwise (x4 for float, x2 for double) - void ANDPS(X64Reg regOp, OpArg arg); - void ANDPD(X64Reg regOp, OpArg arg); + void ANDPS(X64Reg regOp, OpArg arg); + void ANDPD(X64Reg regOp, OpArg arg); void ANDNPS(X64Reg regOp, OpArg arg); void ANDNPD(X64Reg regOp, OpArg arg); void ORPS(X64Reg regOp, OpArg arg); @@ -480,9 +486,9 @@ public: void XORPD(X64Reg regOp, OpArg arg); // SSE/SSE2: Shuffle components. These are tricky - see Intel documentation. - void SHUFPS(X64Reg regOp, OpArg arg, u8 shuffle); - void SHUFPD(X64Reg regOp, OpArg arg, u8 shuffle); - + void SHUFPS(X64Reg regOp, OpArg arg, u8 shuffle); + void SHUFPD(X64Reg regOp, OpArg arg, u8 shuffle); + // SSE/SSE2: Useful alternative to shuffle in some cases. void MOVDDUP(X64Reg regOp, OpArg arg); @@ -554,51 +560,51 @@ public: void PUNPCKLDQ(X64Reg dest, const OpArg &arg); void PAND(X64Reg dest, OpArg arg); - void PANDN(X64Reg dest, OpArg arg); - void PXOR(X64Reg dest, OpArg arg); - void POR(X64Reg dest, OpArg arg); + void PANDN(X64Reg dest, OpArg arg); + void PXOR(X64Reg dest, OpArg arg); + void POR(X64Reg dest, OpArg arg); void PADDB(X64Reg dest, OpArg arg); - void PADDW(X64Reg dest, OpArg arg); - void PADDD(X64Reg dest, OpArg arg); - void PADDQ(X64Reg dest, OpArg arg); + void PADDW(X64Reg dest, OpArg arg); + void PADDD(X64Reg dest, OpArg arg); + void PADDQ(X64Reg dest, OpArg arg); - void PADDSB(X64Reg dest, OpArg arg); - void PADDSW(X64Reg dest, OpArg arg); - void PADDUSB(X64Reg dest, OpArg arg); - void PADDUSW(X64Reg dest, OpArg arg); + void PADDSB(X64Reg dest, OpArg arg); + void PADDSW(X64Reg dest, OpArg arg); + void PADDUSB(X64Reg dest, OpArg arg); + void PADDUSW(X64Reg dest, OpArg arg); - void PSUBB(X64Reg dest, OpArg arg); - void PSUBW(X64Reg dest, OpArg arg); - void PSUBD(X64Reg dest, OpArg arg); - void PSUBQ(X64Reg dest, OpArg arg); + void PSUBB(X64Reg dest, OpArg arg); + void PSUBW(X64Reg dest, OpArg arg); + void PSUBD(X64Reg dest, OpArg arg); + void PSUBQ(X64Reg dest, OpArg arg); - void PSUBSB(X64Reg dest, OpArg arg); - void PSUBSW(X64Reg dest, OpArg arg); - void PSUBUSB(X64Reg dest, OpArg arg); - void PSUBUSW(X64Reg dest, OpArg arg); + void PSUBSB(X64Reg dest, OpArg arg); + void PSUBSW(X64Reg dest, OpArg arg); + void PSUBUSB(X64Reg dest, OpArg arg); + void PSUBUSW(X64Reg dest, OpArg arg); - void PAVGB(X64Reg dest, OpArg arg); - void PAVGW(X64Reg dest, OpArg arg); + void PAVGB(X64Reg dest, OpArg arg); + void PAVGW(X64Reg dest, OpArg arg); - void PCMPEQB(X64Reg dest, OpArg arg); - void PCMPEQW(X64Reg dest, OpArg arg); - void PCMPEQD(X64Reg dest, OpArg arg); + void PCMPEQB(X64Reg dest, OpArg arg); + void PCMPEQW(X64Reg dest, OpArg arg); + void PCMPEQD(X64Reg dest, OpArg arg); - void PCMPGTB(X64Reg dest, OpArg arg); - void PCMPGTW(X64Reg dest, OpArg arg); - void PCMPGTD(X64Reg dest, OpArg arg); + void PCMPGTB(X64Reg dest, OpArg arg); + void PCMPGTW(X64Reg dest, OpArg arg); + void PCMPGTD(X64Reg dest, OpArg arg); void PEXTRW(X64Reg dest, OpArg arg, u8 subreg); void PINSRW(X64Reg dest, OpArg arg, u8 subreg); - void PMADDWD(X64Reg dest, OpArg arg); - void PSADBW(X64Reg dest, OpArg arg); + void PMADDWD(X64Reg dest, OpArg arg); + void PSADBW(X64Reg dest, OpArg arg); - void PMAXSW(X64Reg dest, OpArg arg); - void PMAXUB(X64Reg dest, OpArg arg); - void PMINSW(X64Reg dest, OpArg arg); - void PMINUB(X64Reg dest, OpArg arg); + void PMAXSW(X64Reg dest, OpArg arg); + void PMAXUB(X64Reg dest, OpArg arg); + void PMINSW(X64Reg dest, OpArg arg); + void PMINUB(X64Reg dest, OpArg arg); void PMOVMSKB(X64Reg dest, OpArg arg); void PSHUFB(X64Reg dest, OpArg arg); @@ -616,6 +622,13 @@ public: void PSRAW(X64Reg reg, int shift); void PSRAD(X64Reg reg, int shift); + // AVX + void VADDSD(X64Reg regOp1, X64Reg regOp2, OpArg arg); + void VSUBSD(X64Reg regOp1, X64Reg regOp2, OpArg arg); + void VMULSD(X64Reg regOp1, X64Reg regOp2, OpArg arg); + void VDIVSD(X64Reg regOp1, X64Reg regOp2, OpArg arg); + void VSQRTSD(X64Reg regOp1, X64Reg regOp2, OpArg arg); + void RTDSC(); // Utility functions @@ -625,7 +638,7 @@ public: void ABI_CallFunctionC16(void *func, u16 param1); void ABI_CallFunctionCC16(void *func, u32 param1, u16 param2); - + // These only support u32 parameters, but that's enough for a lot of uses. // These will destroy the 1 or 2 first "parameter regs". void ABI_CallFunctionC(void *func, u32 param1); @@ -639,27 +652,20 @@ public: // Pass a register as a parameter. void ABI_CallFunctionR(void *func, Gen::X64Reg reg1); - void ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2); + void ABI_CallFunctionRR(void *func, Gen::X64Reg reg1, Gen::X64Reg reg2, bool noProlog = false); // A function that doesn't have any control over what it will do to regs, // such as the dispatcher, should be surrounded by these. void ABI_PushAllCalleeSavedRegsAndAdjustStack(); void ABI_PopAllCalleeSavedRegsAndAdjustStack(); - // A function that doesn't know anything about it's surroundings, should - // be surrounded by these to establish a safe environment, where it can roam free. - // An example is a backpatch injected function. - void ABI_PushAllCallerSavedRegsAndAdjustStack(); - void ABI_PopAllCallerSavedRegsAndAdjustStack(); + // A more flexible version of the above. + void ABI_PushRegistersAndAdjustStack(u32 mask, bool noProlog); + void ABI_PopRegistersAndAdjustStack(u32 mask, bool noProlog); - unsigned int ABI_GetAlignedFrameSize(unsigned int frameSize); - void ABI_AlignStack(unsigned int frameSize); - void ABI_RestoreStack(unsigned int frameSize); - - // Sets up a __cdecl function. - // Only x64 really needs the parameter count. - void ABI_EmitPrologue(int maxCallParams); - void ABI_EmitEpilogue(int maxCallParams); + unsigned int ABI_GetAlignedFrameSize(unsigned int frameSize, bool noProlog = false); + void ABI_AlignStack(unsigned int frameSize, bool noProlog = false); + void ABI_RestoreStack(unsigned int frameSize, bool noProlog = false); #ifdef _M_IX86 inline int ABI_GetNumXMMRegs() { return 8; } @@ -673,12 +679,12 @@ public: void CallCdeclFunction5(void* fnptr, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4); void CallCdeclFunction6(void* fnptr, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 arg5); -#if defined(_M_IX86) +#if defined(_M_IX86) #define CallCdeclFunction3_I(a,b,c,d) CallCdeclFunction3((void *)(a), (b), (c), (d)) - #define CallCdeclFunction4_I(a,b,c,d,e) CallCdeclFunction4((void *)(a), (b), (c), (d), (e)) - #define CallCdeclFunction5_I(a,b,c,d,e,f) CallCdeclFunction5((void *)(a), (b), (c), (d), (e), (f)) - #define CallCdeclFunction6_I(a,b,c,d,e,f,g) CallCdeclFunction6((void *)(a), (b), (c), (d), (e), (f), (g)) + #define CallCdeclFunction4_I(a,b,c,d,e) CallCdeclFunction4((void *)(a), (b), (c), (d), (e)) + #define CallCdeclFunction5_I(a,b,c,d,e,f) CallCdeclFunction5((void *)(a), (b), (c), (d), (e), (f)) + #define CallCdeclFunction6_I(a,b,c,d,e,f,g) CallCdeclFunction6((void *)(a), (b), (c), (d), (e), (f), (g)) #define DECLARE_IMPORT(x) @@ -729,7 +735,7 @@ public: // Always clear code space with breakpoints, so that if someone accidentally executes // uninitialized, it just breaks into the debugger. - void ClearCodeSpace() + void ClearCodeSpace() { // x86/64: 0xCC = breakpoint memset(region, 0xCC, region_size); diff --git a/Source/Core/Common/Src/x64FPURoundMode.cpp b/Source/Core/Common/Src/x64FPURoundMode.cpp index 903d58e499..f46c6000eb 100644 --- a/Source/Core/Common/Src/x64FPURoundMode.cpp +++ b/Source/Core/Common/Src/x64FPURoundMode.cpp @@ -4,6 +4,7 @@ #include "Common.h" #include "FPURoundMode.h" +#include "CPUDetect.h" #ifndef _WIN32 static const unsigned short FPU_ROUND_NEAR = 0 << 10; @@ -14,8 +15,11 @@ static const unsigned short FPU_ROUND_MASK = 3 << 10; #include #endif -const u32 MASKS = 0x1F80; // mask away the interrupts. +// OR-mask for disabling FPU exceptions (bits 7-12 in the MXCSR register) +const u32 EXCEPTION_MASK = 0x1F80; +// Denormals-Are-Zero (non-IEEE mode: denormal inputs are set to +/- 0) const u32 DAZ = 0x40; +// Flush-To-Zero (non-IEEE mode: denormal outputs are set to +/- 0) const u32 FTZ = 0x8000; namespace FPURoundMode @@ -30,7 +34,7 @@ namespace FPURoundMode #ifdef _M_IX86 // This shouldn't really be needed anymore since we use SSE #ifdef _WIN32 - const int table[4] = + const int table[4] = { _RC_NEAR, _RC_CHOP, @@ -39,7 +43,7 @@ namespace FPURoundMode }; _set_controlfp(_MCW_RC, table[mode]); #else - const unsigned short table[4] = + const unsigned short table[4] = { FPU_ROUND_NEAR, FPU_ROUND_CHOP, @@ -70,7 +74,7 @@ namespace FPURoundMode 3 << 8, // FPU_PREC_MASK }; unsigned short _mode; - asm ("fstcw %0" : : "m" (_mode)); + asm ("fstcw %0" : "=m" (_mode)); _mode = (_mode & ~table[3]) | table[mode]; asm ("fldcw %0" : : "m" (_mode)); #endif @@ -79,16 +83,28 @@ namespace FPURoundMode //but still - set any useful sse options here #endif } - void SetSIMDMode(u32 mode) + + void SetSIMDMode(u32 roundingMode, u32 nonIEEEMode) { - static const u32 ssetable[4] = + // lookup table for FPSCR.RN-to-MXCSR.RC translation + static const u32 roundingModeLUT[4] = { - (0 << 13) | MASKS, - (3 << 13) | MASKS, - (2 << 13) | MASKS, - (1 << 13) | MASKS, + (0 << 13) | EXCEPTION_MASK, // nearest + (3 << 13) | EXCEPTION_MASK, // -inf + (2 << 13) | EXCEPTION_MASK, // +inf + (1 << 13) | EXCEPTION_MASK, // zero }; - u32 csr = ssetable[mode]; + u32 csr = roundingModeLUT[roundingMode]; + + static const u32 denormalLUT[2] = + { + FTZ, // flush-to-zero only + FTZ | DAZ, // flush-to-zero and denormals-are-zero (may not be supported) + }; + if (nonIEEEMode) + { + csr |= denormalLUT[cpu_info.bFlushToZero]; + } _mm_setcsr(csr); } diff --git a/Source/Core/Common/Src/x64Thunk.cpp b/Source/Core/Common/Src/x64Thunk.cpp deleted file mode 100644 index efb876ce81..0000000000 --- a/Source/Core/Common/Src/x64Thunk.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include - -#include "Common.h" -#include "MemoryUtil.h" -#include "x64ABI.h" -#include "Thunk.h" - -#define THUNK_ARENA_SIZE 1024*1024*1 - -namespace -{ - -static u8 GC_ALIGNED32(saved_fp_state[16 * 4 * 4]); -static u8 GC_ALIGNED32(saved_gpr_state[16 * 8]); -static u16 saved_mxcsr; - -} // namespace - -using namespace Gen; - -void ThunkManager::Init() -{ - AllocCodeSpace(THUNK_ARENA_SIZE); - save_regs = GetCodePtr(); - for (int i = 2; i < ABI_GetNumXMMRegs(); i++) - MOVAPS(M(saved_fp_state + i * 16), (X64Reg)(XMM0 + i)); - STMXCSR(M(&saved_mxcsr)); -#ifdef _M_X64 - MOV(64, M(saved_gpr_state + 0 ), R(RCX)); - MOV(64, M(saved_gpr_state + 8 ), R(RDX)); - MOV(64, M(saved_gpr_state + 16), R(R8) ); - MOV(64, M(saved_gpr_state + 24), R(R9) ); - MOV(64, M(saved_gpr_state + 32), R(R10)); - MOV(64, M(saved_gpr_state + 40), R(R11)); -#ifndef _WIN32 - MOV(64, M(saved_gpr_state + 48), R(RSI)); - MOV(64, M(saved_gpr_state + 56), R(RDI)); -#endif - MOV(64, M(saved_gpr_state + 64), R(RBX)); -#else - MOV(32, M(saved_gpr_state + 0 ), R(RCX)); - MOV(32, M(saved_gpr_state + 4 ), R(RDX)); -#endif - RET(); - load_regs = GetCodePtr(); - LDMXCSR(M(&saved_mxcsr)); - for (int i = 2; i < ABI_GetNumXMMRegs(); i++) - MOVAPS((X64Reg)(XMM0 + i), M(saved_fp_state + i * 16)); -#ifdef _M_X64 - MOV(64, R(RCX), M(saved_gpr_state + 0 )); - MOV(64, R(RDX), M(saved_gpr_state + 8 )); - MOV(64, R(R8) , M(saved_gpr_state + 16)); - MOV(64, R(R9) , M(saved_gpr_state + 24)); - MOV(64, R(R10), M(saved_gpr_state + 32)); - MOV(64, R(R11), M(saved_gpr_state + 40)); -#ifndef _WIN32 - MOV(64, R(RSI), M(saved_gpr_state + 48)); - MOV(64, R(RDI), M(saved_gpr_state + 56)); -#endif - MOV(64, R(RBX), M(saved_gpr_state + 64)); -#else - MOV(32, R(RCX), M(saved_gpr_state + 0 )); - MOV(32, R(RDX), M(saved_gpr_state + 4 )); -#endif - RET(); -} - -void ThunkManager::Reset() -{ - thunks.clear(); - ResetCodePtr(); -} - -void ThunkManager::Shutdown() -{ - Reset(); - FreeCodeSpace(); -} - -void *ThunkManager::ProtectFunction(void *function, int num_params) -{ - std::map::iterator iter; - iter = thunks.find(function); - if (iter != thunks.end()) - return (void *)iter->second; - if (!region) - PanicAlert("Trying to protect functions before the emu is started. Bad bad bad."); - - const u8 *call_point = GetCodePtr(); - // Make sure to align stack. -#ifdef _M_X64 -#ifdef _WIN32 - SUB(64, R(ESP), Imm8(0x28)); -#else - SUB(64, R(ESP), Imm8(0x8)); -#endif - CALL((void*)save_regs); - CALL((void*)function); - CALL((void*)load_regs); -#ifdef _WIN32 - ADD(64, R(ESP), Imm8(0x28)); -#else - ADD(64, R(ESP), Imm8(0x8)); -#endif - RET(); -#else - CALL((void*)save_regs); - // Since parameters are in the previous stack frame, not in registers, this takes some - // trickery : we simply re-push the parameters. might not be optimal, but that doesn't really - // matter. - ABI_AlignStack(num_params * 4); - unsigned int alignedSize = ABI_GetAlignedFrameSize(num_params * 4); - for (int i = 0; i < num_params; i++) { - // ESP is changing, so we do not need i - PUSH(32, MDisp(ESP, alignedSize - 4)); - } - CALL(function); - ABI_RestoreStack(num_params * 4); - CALL((void*)load_regs); - RET(); -#endif - - thunks[function] = call_point; - return (void *)call_point; -} diff --git a/Source/Core/Common/make_scmrev.h.js b/Source/Core/Common/make_scmrev.h.js index f2978987dc..75a3d8cf08 100644 --- a/Source/Core/Common/make_scmrev.h.js +++ b/Source/Core/Common/make_scmrev.h.js @@ -8,7 +8,7 @@ var cmd_branch = " rev-parse --abbrev-ref HEAD"; function GetGitExe() { - for (var gitexe in {"git.cmd":1, "git":1}) + for (var gitexe in {"git.cmd":1, "git":1, "git.bat":1}) { try { diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 2e8744338d..07a6fc2aca 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -7,6 +7,7 @@ set(SRCS Src/ActionReplay.cpp Src/CoreParameter.cpp Src/CoreTiming.cpp Src/DSPEmulator.cpp + Src/ec_wii.cpp Src/GeckoCodeConfig.cpp Src/GeckoCode.cpp Src/Movie.cpp @@ -132,12 +133,15 @@ set(SRCS Src/ActionReplay.cpp Src/HW/WiimoteEmu/Encryption.cpp Src/HW/WiimoteEmu/Speaker.cpp Src/HW/WiimoteReal/WiimoteReal.cpp + Src/IPC_HLE/ICMPLin.cpp Src/IPC_HLE/WII_IPC_HLE.cpp Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp + Src/IPC_HLE/WII_Socket.cpp Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp + Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.cpp Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp @@ -162,23 +166,24 @@ set(SRCS Src/ActionReplay.cpp Src/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp Src/PowerPC/Interpreter/Interpreter_Tables.cpp Src/PowerPC/JitCommon/JitBase.cpp - Src/PowerPC/JitCommon/JitCache.cpp) + Src/PowerPC/JitCommon/JitCache.cpp + Src/PowerPC/JitILCommon/IR.cpp + Src/PowerPC/JitILCommon/JitILBase_Branch.cpp + Src/PowerPC/JitILCommon/JitILBase_LoadStore.cpp + Src/PowerPC/JitILCommon/JitILBase_SystemRegisters.cpp + Src/PowerPC/JitILCommon/JitILBase_LoadStoreFloating.cpp + Src/PowerPC/JitILCommon/JitILBase_LoadStorePaired.cpp + Src/PowerPC/JitILCommon/JitILBase_Paired.cpp + Src/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp + Src/PowerPC/JitILCommon/JitILBase_Integer.cpp + ) if(NOT _M_GENERIC) set(SRCS ${SRCS} Src/x64MemTools.cpp - Src/PowerPC/Jit64IL/IR.cpp Src/PowerPC/Jit64IL/IR_X86.cpp Src/PowerPC/Jit64IL/JitILAsm.cpp - Src/PowerPC/Jit64IL/JitIL_Branch.cpp Src/PowerPC/Jit64IL/JitIL.cpp - Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp - Src/PowerPC/Jit64IL/JitIL_Integer.cpp - Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp - Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp - Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp - Src/PowerPC/Jit64IL/JitIL_Paired.cpp - Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp Src/PowerPC/Jit64IL/JitIL_Tables.cpp Src/PowerPC/Jit64/Jit64_Tables.cpp Src/PowerPC/Jit64/JitAsm.cpp @@ -211,8 +216,16 @@ if(_M_ARM) Src/PowerPC/JitArm32/JitArm_LoadStore.cpp Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp Src/PowerPC/JitArm32/JitArm_Paired.cpp + Src/PowerPC/JitArm32/JitArm_LoadStorePaired.cpp Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp - Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp) + Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp + #JitArmIL + Src/PowerPC/JitArmIL/JitIL.cpp + Src/PowerPC/JitArmIL/JitILAsm.cpp + Src/PowerPC/JitArmIL/JitIL_Tables.cpp + Src/PowerPC/JitArmIL/JitIL_Branch.cpp + Src/PowerPC/JitArmIL/IR_Arm.cpp + ) endif() set(LIBS bdisasm inputcommon videosoftware sfml-network) @@ -221,6 +234,14 @@ if(NOT USE_GLES OR USE_GLES3) set(LIBS ${LIBS} videoogl) endif() +if(LIBUSB_FOUND) + # Using shared LibUSB + set(LIBS ${LIBS} ${LIBUSB_LIBRARIES}) + set(SRCS ${SRCS} Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp) +endif(LIBUSB_FOUND) + +set(LIBS ${LIBS} ${POLARSSL_LIBRARY}) + if(WIN32) set(SRCS ${SRCS} Src/HW/BBA-TAP/TAP_Win32.cpp Src/stdafx.cpp Src/HW/WiimoteReal/IOWin.cpp) @@ -244,5 +265,8 @@ if(OPROFILE_FOUND) set(LIBS ${LIBS} opagent bfd) endif(OPROFILE_FOUND) -add_library(core STATIC ${SRCS}) -target_link_libraries(core ${LIBS}) +if(GDBSTUB) + set(SRCS ${SRCS} Src/PowerPC/GDBStub.cpp) +endif(GDBSTUB) + +add_dolphin_library(core "${SRCS}" "${LIBS}") diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index e5d8e685d6..0bc3738219 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -1,603 +1,476 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {8C60E805-0DA5-4E25-8F84-038DB504BB0D} - Core - - - - true - StaticLibrary - Unicode - - - true - StaticLibrary - Unicode - - - false - StaticLibrary - Unicode - - - StaticLibrary - false - Unicode - - - false - StaticLibrary - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - - - - .\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {cd3d4c3c-1027-4d33-b047-aec7b56d0bf6} - - - {37d007bd-d66c-4eaf-b56c-bd1aac340a05} - - - {c87a4178-44f6-49b2-b7aa-c79af1b8c534} - - - {b6398059-ebb6-4c34-b547-95f365b71ff4} - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - \ No newline at end of file + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {E54CF649-140E-4255-81A5-30A673C1FB36} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {8ada04d7-6db1-4da4-ab55-64fb12a0997b} + + + {349ee8f9-7d25-4909-aaf5-ff3fade72187} + + + {ab993f38-c31d-4897-b139-a620c42bc565} + + + {bdb6578b-0691-4e80-a46c-df21639fd3b8} + + + {0a18a071-125e-442f-aff7-a3f68abecf99} + + + {93d73454-2512-424e-9cda-4bb357fe13dd} + + + {54aa7840-5beb-4a0c-9452-74ba4cc7fd44} + + + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} + + + {41279555-f94f-4ebc-99de-af863c10c5c4} + + + {160bdc25-5626-4b0d-bdd8-2953d9777fb5} + + + {6bbd47cf-91fd-4077-b676-8b76980178a9} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + + + + diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 66d41f0c4d..97364678a4 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -1,18 +1,158 @@  + + {e0d231ab-7a66-45ce-a8e4-c0225308f763} + + + {2472fb36-5473-4d49-ad2d-3699b78ab6e2} + + + {ed683a12-55f0-49cb-918b-c7edbcf57268} + + + {35594696-15a6-44cb-b811-04e3195eecf5} + + + {659f0a99-77cf-46a0-a7a3-95afdd99be72} + + + {c1c76a12-b4f3-4a46-84e6-e11980b2e997} + + + {256586c3-3a1b-4d7b-9f4a-2f7ffac9d23e} + + + {d060b137-c211-44eb-9cad-fc12dedbea73} + + + {becbad5b-2531-410c-b032-2da2f078b178} + + + {ebd24590-dfdc-433e-a411-21723e4b7cb5} + + + {523f8d77-4aa6-4762-8f27-96f02b5070b4} + + + {c67be826-2935-4d25-a213-e132fa2e63ef} + + + {c88ec388-371f-4401-851c-a32dcdc0b88b} + + + {f26d3866-92d1-4623-9445-caf9a065ed74} + + + {6204f663-bbd0-4eb5-bc15-e3778d8b6091} + + + {7042fb6f-9284-4469-bc7c-9302e0d984aa} + + + {d657188a-426d-46c8-af0a-caa148c6ed1b} + + + {2832269e-5c7d-47f8-b212-afcd9145e427} + + + {9a10faaa-40c3-446c-81b6-5fc7a79d5329} + + + {7a29a81c-1fee-4e5b-bfe1-5f941837bdc9} + + + {0eecffe7-f680-4d21-a05f-2f12c8244833} + + + {9fcd7c03-c4be-477b-9c15-5f096ab9d0f6} + + + {69d8dcb1-f22b-47af-b1e4-f700b1a42e77} + + + {079f3720-45c8-4c54-8589-b7d00a8bc1ac} + + + {bc3e845a-3d01-4713-aa32-f27110838d0c} + + + {cdbd65da-541f-47d2-8fdc-e99e73e98e69} + + + {d19f1218-0e28-4f24-a4b3-33fac750a899} + + + {d7b3050d-3dd9-4284-969c-c5ad3b3662d9} + + + {15452851-6ca5-4520-bbf1-d4b810317be2} + + + {2ef543bc-8125-4b96-9627-6d8c15a5b36a} + + + {dea96a0c-0274-4c9f-915e-97472e7f4578} + + + {9fbdb5b5-9179-4488-b0bf-75c1ccdb3a61} + + + {11385524-b10b-419b-8390-710791c53550} + + + {fa27e799-34c8-440a-9de3-6720df6022e7} + + + {a6444fcf-11b7-42d3-859f-cfe23fe83e9d} + + + {2b41ab45-ba8c-45dc-92cc-9107c1fa3e36} + + + {9370a21f-a7bf-4973-8258-290253617653} + + + {3f85582a-e612-4582-b0fa-ecc27ba3658c} + + + {1f5662c1-885f-4ed4-9f10-cc8e98eaa35d} + + + {1fb00563-01ba-42c4-82de-2c66371e614a} + + + {4620ba8f-5638-4d56-941e-69fc4a4dfc07} + + + {83c278e5-6b06-4cd0-96fb-2e3c88eb32d7} + + + {4a090016-76d5-43dd-95a4-abedfc11ef31} + + + {8352be4d-d37d-4f55-adec-b940a9712802} + + + {827afa93-1a80-4835-93ae-b5516d95867f} + + + + - + + + + - - + ActionReplay @@ -46,71 +186,77 @@ Debugger - - DSPCore\JIT + + DSPCore\Interpreter - - DSPCore\JIT + + DSPCore\Interpreter - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore + + DSPCore\Interpreter - DSPCore + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + DSPCore\Jit + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer GeckoCode @@ -127,68 +273,47 @@ HLE - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - HW %28Flipper/Hollywood%29\GCPad + + PowerPC\Interpreter - - HW %28Flipper/Hollywood%29\GCPad + + PowerPC\Interpreter - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + PowerPC\Jit64 - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + PowerPC\Jit64 - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + HW %28Flipper/Hollywood%29\AI - Audio Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + HW %28Flipper/Hollywood%29\AI - Audio Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + HW %28Flipper/Hollywood%29\DI - Drive Interface HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes @@ -232,9 +357,6 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE - - HW %28Flipper/Hollywood%29\DSP Interface + HLE - HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE @@ -253,6 +375,54 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE + + HW %28Flipper/Hollywood%29\DSP Interface + HLE + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\GCMemcard + + + HW %28Flipper/Hollywood%29\GCPad + + + HW %28Flipper/Hollywood%29\GCPad + HW %28Flipper/Hollywood%29\GP - Gather Pipe Fifo @@ -262,15 +432,6 @@ HW %28Flipper/Hollywood%29\PI - Processor Interface - - HW %28Flipper/Hollywood%29\AI - Audio Interface - - - HW %28Flipper/Hollywood%29\AI - Audio Interface - - - HW %28Flipper/Hollywood%29\DI - Drive Interface - HW %28Flipper/Hollywood%29\SI - Serial Interface @@ -280,6 +441,9 @@ HW %28Flipper/Hollywood%29\SI - Serial Interface + + HW %28Flipper/Hollywood%29\SI - Serial Interface + HW %28Flipper/Hollywood%29\SI - Serial Interface @@ -289,207 +453,9 @@ HW %28Flipper/Hollywood%29\SI - Serial Interface - - HW %28Flipper/Hollywood%29\SI - Serial Interface - HW %28Flipper/Hollywood%29\VI - Video Interface - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - IPC HLE %28IOS/Starlet%29 - - - IPC HLE %28IOS/Starlet%29\DI - Drive Interface - - - IPC HLE %28IOS/Starlet%29\ES - - - IPC HLE %28IOS/Starlet%29\FS - - - IPC HLE %28IOS/Starlet%29\FS - - - IPC HLE %28IOS/Starlet%29\Keyboard - - - IPC HLE %28IOS/Starlet%29\Net - - - IPC HLE %28IOS/Starlet%29\SDIO - SD Card - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - HW %28Flipper/Hollywood%29\Wii IPC - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - HW %28Flipper/Hollywood%29\Wii IO Bridge - HW %28Flipper/Hollywood%29\Wiimote\Emu\Attachment @@ -520,62 +486,252 @@ HW %28Flipper/Hollywood%29\Wiimote\Emu + + HW %28Flipper/Hollywood%29\Wiimote\Real + HW %28Flipper/Hollywood%29\Wiimote\Real - - HW %28Flipper/Hollywood%29\Wiimote\Real + + HW %28Flipper/Hollywood%29\Wii IO Bridge + + + HW %28Flipper/Hollywood%29\Wii IPC + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + IPC HLE %28IOS/Starlet%29 + + + IPC HLE %28IOS/Starlet%29\DI + + + IPC HLE %28IOS/Starlet%29\ES + + + IPC HLE %28IOS/Starlet%29\FS + + + IPC HLE %28IOS/Starlet%29\FS + + + IPC HLE %28IOS/Starlet%29\Keyboard + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\SDIO - SD Card + + + IPC HLE %28IOS/Starlet%29\USB + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote HW %28Flipper/Hollywood%29\Wiimote - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - - HW %28Flipper/Hollywood%29\GCMemcard - PowerPC - - + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitIL + + + PowerPC\JitIL + + + PowerPC\JitIL + + + PowerPC\JitIL + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + + + + + + + - - - + ActionReplay - + ActionReplay @@ -587,12 +743,15 @@ Boot - + Boot Boot + + Boot + Debugger @@ -605,65 +764,53 @@ Debugger - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore\JIT - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore - - - DSPCore + + DSPCore\Interpreter - DSPCore + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter - - DSPCore + + DSPCore\Interpreter - - DSPCore + + DSPCore\Jit - - DSPCore + + DSPCore\Jit - - GeckoCode + + DSPCore\Jit + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer + + + FifoPlayer GeckoCode - - HLE + + GeckoCode HLE @@ -671,59 +818,32 @@ HLE - - DSPCore\Interpreter + + HLE - - DSPCore\Interpreter + + PowerPC\Interpreter - - DSPCore\Interpreter + + PowerPC\Interpreter - - HW %28Flipper/Hollywood%29\GCPad + + PowerPC\Interpreter - - HW %28Flipper/Hollywood%29\GCPad + + PowerPC\Jit64 - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + PowerPC\Jit64 - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + HW %28Flipper/Hollywood%29\AI - Audio Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + HW %28Flipper/Hollywood%29\AI - Audio Interface - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\EXI - Expansion Interface - - - HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes + + HW %28Flipper/Hollywood%29\DI - Drive Interface HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes @@ -752,6 +872,9 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes + + HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes + HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE @@ -761,13 +884,10 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE - - HW %28Flipper/Hollywood%29\DSP Interface + HLE - - + HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE - + HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE @@ -782,6 +902,54 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE + + HW %28Flipper/Hollywood%29\DSP Interface + HLE + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\EXI - Expansion Interface + + + HW %28Flipper/Hollywood%29\GCMemcard + + + HW %28Flipper/Hollywood%29\GCPad + + + HW %28Flipper/Hollywood%29\GCPad + HW %28Flipper/Hollywood%29\GP - Gather Pipe Fifo @@ -791,24 +959,6 @@ HW %28Flipper/Hollywood%29\PI - Processor Interface - - HW %28Flipper/Hollywood%29\AI - Audio Interface - - - HW %28Flipper/Hollywood%29\AI - Audio Interface - - - HW %28Flipper/Hollywood%29\DI - Drive Interface - - - HW %28Flipper/Hollywood%29\SI - Serial Interface - - - HW %28Flipper/Hollywood%29\SI - Serial Interface - - - HW %28Flipper/Hollywood%29\SI - Serial Interface - HW %28Flipper/Hollywood%29\SI - Serial Interface @@ -818,154 +968,25 @@ HW %28Flipper/Hollywood%29\SI - Serial Interface + + HW %28Flipper/Hollywood%29\SI - Serial Interface + HW %28Flipper/Hollywood%29\SI - Serial Interface + + HW %28Flipper/Hollywood%29\SI - Serial Interface + + + HW %28Flipper/Hollywood%29\SI - Serial Interface + HW %28Flipper/Hollywood%29\VI - Video Interface - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\Interpreter - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\JitCommon - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\Jit64 - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - PowerPC\JitIL - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - HW %28Flipper/Hollywood%29 - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - PowerPC - - - IPC HLE %28IOS/Starlet%29 - - - IPC HLE %28IOS/Starlet%29 - - - IPC HLE %28IOS/Starlet%29 - - - IPC HLE %28IOS/Starlet%29\DI - Drive Interface - - - IPC HLE %28IOS/Starlet%29\ES - - - IPC HLE %28IOS/Starlet%29\FS - - - IPC HLE %28IOS/Starlet%29\FS - - - IPC HLE %28IOS/Starlet%29\Keyboard - - - IPC HLE %28IOS/Starlet%29\Net - - - IPC HLE %28IOS/Starlet%29\SDIO - SD Card - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - HW %28Flipper/Hollywood%29\Wii IPC - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote - - - HW %28Flipper/Hollywood%29\Wii IO Bridge - - + HW %28Flipper/Hollywood%29\Wiimote\Emu\Attachment - + HW %28Flipper/Hollywood%29\Wiimote\Emu\Attachment @@ -995,11 +1016,131 @@ HW %28Flipper/Hollywood%29\Wiimote\Emu + + HW %28Flipper/Hollywood%29\Wiimote\Real + HW %28Flipper/Hollywood%29\Wiimote\Real - - HW %28Flipper/Hollywood%29\Wiimote\Real + + HW %28Flipper/Hollywood%29\Wii IO Bridge + + + HW %28Flipper/Hollywood%29\Wii IPC + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + HW %28Flipper/Hollywood%29 + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + DSPCore + + + IPC HLE %28IOS/Starlet%29 + + + IPC HLE %28IOS/Starlet%29 + + + IPC HLE %28IOS/Starlet%29 + + + IPC HLE %28IOS/Starlet%29\DI + + + IPC HLE %28IOS/Starlet%29\ES + + + IPC HLE %28IOS/Starlet%29\FS + + + IPC HLE %28IOS/Starlet%29\FS + + + IPC HLE %28IOS/Starlet%29\Keyboard + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\Net + + + IPC HLE %28IOS/Starlet%29\SDIO - SD Card + + + IPC HLE %28IOS/Starlet%29\USB + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote + + + IPC HLE %28IOS/Starlet%29\USB/BT/Wiimote HW %28Flipper/Hollywood%29\Wiimote @@ -1007,174 +1148,75 @@ PowerPC - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - FifoPlayer - - - - HW %28Flipper/Hollywood%29\GCMemcard + + PowerPC PowerPC - - - + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitCommon + + + PowerPC\JitIL + + + PowerPC\JitIL + + + PowerPC\JitIL + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + + PowerPC\JitILCommon + + + PowerPC\JitILCommon + - - - HW %28Flipper/Hollywood%29\DSP Interface + HLE\HLE\uCodes - - - - - {c871a264-a881-44f2-88b1-406b282cd9fe} - - - {0fe14029-e862-44b4-9358-d1cd44e42454} - - - {fba97574-484f-4330-9674-69c0aeffd22f} - - - {684ba5fe-ccca-4d1b-94fa-3a2119353257} - - - {67aea903-7a27-4b1e-a4af-60f58818ba58} - - - {81d2e0cb-4bea-47ed-9bc3-fdc461ea4148} - - - {6aa99e27-bf15-43dc-8f14-c80383037a99} - - - {45a9bf0a-e022-4ace-a99f-df675a0b251d} - - - {1905e5c1-a593-454d-b0a0-68bf6cdbec12} - - - {57e4ab87-a563-40c5-9a3d-6b5443750a96} - - - {1f8821ba-2dde-4b1a-9125-5f74006b1053} - - - {02777c32-ac14-4a06-9006-8ffc370bc231} - - - {0201c158-1162-48d8-b6d4-239d8202d200} - - - {21df1345-8145-4179-8cf5-a26b6887de5d} - - - {b34c5e25-c21d-401b-9b21-990f1a7908e1} - - - {b948ee86-1471-42b2-ab6f-ca0ce1c9e4d6} - - - {a25bdd3e-b989-4c5b-b56c-2f37ab4972c7} - - - {1966cfa5-57f3-4fdb-8d32-d34f033903af} - - - {43f6de5c-946b-426d-9735-b774c3365ae4} - - - {9f00a3b5-c0f3-4a3f-a756-25435ea996e1} - - - {decdd68e-4e41-4589-bc13-5318705e2f94} - - - {e88d682e-a0c2-438d-9283-ab1ec250d3ae} - - - {36465b2e-d5c4-402c-abff-ed04c84a1566} - - - {b7771463-73bf-457b-891f-9dcaa04076ea} - - - {e34c8a58-7799-4afe-b0f9-1c5ff759639b} - - - {2ee04eb4-0d32-4e15-bd0e-811d408de20c} - - - {808c3dc1-5fec-4565-8c2e-fa7e1232a31c} - - - {ef5b78c3-47ec-4bd6-9809-f9e7da6e0861} - - - {49635c9b-0874-4e71-9165-edaae632ab1c} - - - {e2711d6f-b5f5-4c74-97c2-66f9620a2d86} - - - {1be114bb-c572-4cdb-9650-4d24d282d4bb} - - - {ff0e9f64-a636-4998-8cae-fe122c8da934} - - - {30eda257-4d78-4db7-873e-c408db52d772} - - - {ed6f41bf-4f52-402b-ab1d-d5bf9e71c538} - - - {362606ce-fa05-4829-831f-bf9e0acf9909} - - - {ebe09d6a-7cd0-4909-83e9-abafd3e8571f} - - - {e7c723c0-693a-4cf8-973a-b349537adcc7} - - - {0ab9fa49-fd0b-4eba-aa9f-2b774baa8e63} - - - {c53079fe-d19c-4492-b37e-bf8bd4f55fa8} - - - {565ae8e7-ae6e-42f9-ae13-90c1aa017856} - - - {1c21a3e1-b791-4a23-b0d5-ed2b2c34007f} - - - {ca7d56f7-4e84-4d15-9aea-7ae6fa7d6586} - - - {3e9e6e83-c1bf-45f9-aeff-231f98f60d29} - + \ No newline at end of file diff --git a/Source/Core/Core/Src/ARDecrypt.h b/Source/Core/Core/Src/ARDecrypt.h index 45004edfa3..c42cf8dc3e 100644 --- a/Source/Core/Core/Src/ARDecrypt.h +++ b/Source/Core/Core/Src/ARDecrypt.h @@ -5,9 +5,6 @@ #ifndef _ARDECRYPT_H_ #define _ARDECRYPT_H_ -#include -#include -#include #include #include "Common.h" #include "ActionReplay.h" diff --git a/Source/Core/Core/Src/ActionReplay.cpp b/Source/Core/Core/Src/ActionReplay.cpp index 7c1742a1cb..e07f297e09 100644 --- a/Source/Core/Core/Src/ActionReplay.cpp +++ b/Source/Core/Core/Src/ActionReplay.cpp @@ -38,13 +38,13 @@ enum { // Zero Code Types ZCODE_END = 0x00, - ZCODE_NORM = 0x02, - ZCODE_ROW = 0x03, + ZCODE_NORM = 0x02, + ZCODE_ROW = 0x03, ZCODE_04 = 0x04, // Conditional Codes CONDTIONAL_EQUAL = 0x01, - CONDTIONAL_NOT_EQUAL = 0x02, + CONDTIONAL_NOT_EQUAL = 0x02, CONDTIONAL_LESS_THAN_SIGNED = 0x03, CONDTIONAL_GREATER_THAN_SIGNED = 0x04, CONDTIONAL_LESS_THAN_UNSIGNED = 0x05, @@ -59,14 +59,14 @@ enum // Data Types DATATYPE_8BIT = 0x00, - DATATYPE_16BIT = 0x01, - DATATYPE_32BIT = 0x02, + DATATYPE_16BIT = 0x01, + DATATYPE_32BIT = 0x02, DATATYPE_32BIT_FLOAT = 0x03, // Normal Code 0 Subtypes SUB_RAM_WRITE = 0x00, - SUB_WRITE_POINTER = 0x01, - SUB_ADD_CODE = 0x02, + SUB_WRITE_POINTER = 0x01, + SUB_ADD_CODE = 0x02, SUB_MASTER_CODE = 0x03, }; @@ -111,122 +111,127 @@ bool CompareValues(const u32 val1, const u32 val2, const int type); // ---------------------- // AR Remote Functions -void LoadCodes(IniFile &ini, bool forceLoad) +void LoadCodes(IniFile &globalIni, IniFile &localIni, bool forceLoad) { // Parses the Action Replay section of a game ini file. - if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats - && !forceLoad) + if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats + && !forceLoad) return; - std::vector lines; - std::vector encryptedLines; - ARCode currentCode; arCodes.clear(); - if (!ini.GetLines("ActionReplay", lines)) - return; // no codes found. - - std::vector::const_iterator - it = lines.begin(), - lines_end = lines.end(); - for (; it != lines_end; ++it) + std::vector enabledLines; + std::set enabledNames; + localIni.GetLines("ActionReplay_Enabled", enabledLines); + for (auto& line : enabledLines) { - const std::string line = *it; - - if (line.empty()) - continue; - - std::vector pieces; - - // Check if the line is a name of the code - if (line[0] == '+' || line[0] == '$') + if (line.size() != 0 && line[0] == '$') { - if (currentCode.ops.size()) - { - arCodes.push_back(currentCode); - currentCode.ops.clear(); - } - if (encryptedLines.size()) - { - DecryptARCode(encryptedLines, currentCode.ops); - arCodes.push_back(currentCode); - currentCode.ops.clear(); - encryptedLines.clear(); - } - - if (line.size() > 1) - { - if (line[0] == '+') - { - currentCode.active = true; - currentCode.name = line.substr(2, line.size() - 2);; - if (!forceLoad) - Core::DisplayMessage("AR code active: " + currentCode.name, 5000); - } - else - { - currentCode.active = false; - currentCode.name = line.substr(1, line.size() - 1); - } - } - continue; + std::string name = line.substr(1, line.size() - 1); + enabledNames.insert(name); } + } - SplitString(line, ' ', pieces); + IniFile* inis[] = {&globalIni, &localIni}; + for (size_t i = 0; i < ArraySize(inis); ++i) + { + std::vector lines; + std::vector encryptedLines; + ARCode currentCode; - // Check if the AR code is decrypted - if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8) + inis[i]->GetLines("ActionReplay", lines); + + std::vector::const_iterator + it = lines.begin(), + lines_end = lines.end(); + for (; it != lines_end; ++it) { - AREntry op; - bool success_addr = TryParse(std::string("0x") + pieces[0], &op.cmd_addr); - bool success_val = TryParse(std::string("0x") + pieces[1], &op.value); - if (!(success_addr | success_val)) { - PanicAlertT("Action Replay Error: invalid AR code line: %s", line.c_str()); - if (!success_addr) PanicAlertT("The address is invalid"); - if (!success_val) PanicAlertT("The value is invalid"); + const std::string line = *it; + + if (line.empty()) + continue; + + std::vector pieces; + + // Check if the line is a name of the code + if (line[0] == '$') + { + if (currentCode.ops.size()) + { + arCodes.push_back(currentCode); + currentCode.ops.clear(); + } + if (encryptedLines.size()) + { + DecryptARCode(encryptedLines, currentCode.ops); + arCodes.push_back(currentCode); + currentCode.ops.clear(); + encryptedLines.clear(); + } + + currentCode.name = line.substr(1, line.size() - 1); + currentCode.active = enabledNames.find(currentCode.name) != enabledNames.end(); + currentCode.user_defined = (i == 1); } else { - currentCode.ops.push_back(op); - } - } - else - { - SplitString(line, '-', pieces); - if (pieces.size() == 3 && pieces[0].size() == 4 && pieces[1].size() == 4 && pieces[2].size() == 5) - { - // Encrypted AR code - // Decryption is done in "blocks", so we must push blocks into a vector, - // then send to decrypt when a new block is encountered, or if it's the last block. - encryptedLines.push_back(pieces[0]+pieces[1]+pieces[2]); - } - } - } + SplitString(line, ' ', pieces); - // Handle the last code correctly. - if (currentCode.ops.size()) - { - arCodes.push_back(currentCode); - } - if (encryptedLines.size()) - { - DecryptARCode(encryptedLines, currentCode.ops); - arCodes.push_back(currentCode); + // Check if the AR code is decrypted + if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8) + { + AREntry op; + bool success_addr = TryParse(std::string("0x") + pieces[0], &op.cmd_addr); + bool success_val = TryParse(std::string("0x") + pieces[1], &op.value); + if (!(success_addr | success_val)) { + PanicAlertT("Action Replay Error: invalid AR code line: %s", line.c_str()); + if (!success_addr) PanicAlertT("The address is invalid"); + if (!success_val) PanicAlertT("The value is invalid"); + } + else + { + currentCode.ops.push_back(op); + } + } + else + { + SplitString(line, '-', pieces); + if (pieces.size() == 3 && pieces[0].size() == 4 && pieces[1].size() == 4 && pieces[2].size() == 5) + { + // Encrypted AR code + // Decryption is done in "blocks", so we must push blocks into a vector, + // then send to decrypt when a new block is encountered, or if it's the last block. + encryptedLines.push_back(pieces[0]+pieces[1]+pieces[2]); + } + } + } + } + + // Handle the last code correctly. + if (currentCode.ops.size()) + { + arCodes.push_back(currentCode); + } + if (encryptedLines.size()) + { + DecryptARCode(encryptedLines, currentCode.ops); + arCodes.push_back(currentCode); + } } UpdateActiveList(); } -void LoadCodes(std::vector &_arCodes, IniFile &ini) +void LoadCodes(std::vector &_arCodes, IniFile &globalIni, IniFile& localIni) { - LoadCodes(ini, true); + LoadCodes(globalIni, localIni, true); _arCodes = arCodes; } void LogInfo(const char *format, ...) { - if (!b_RanOnce) + if (!b_RanOnce) { if (LogManager::GetMaxLevel() >= LogTypes::LINFO || logSelf) { @@ -252,11 +257,11 @@ void RunAllActive() { if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) { - for (std::vector::iterator i = activeCodes.begin(); i != activeCodes.end(); ++i) + for (auto& activeCode : activeCodes) { - if (i->active) + if (activeCode.active) { - i->active = RunCode(*i); + activeCode.active = RunCode(activeCode); LogInfo("\n"); } } @@ -314,7 +319,7 @@ bool RunCode(const ARCode &arcode) continue; } - + LogInfo("--- Running Code: %08x %08x ---", addr.address, data); //LogInfo("Command: %08x", cmd); @@ -385,7 +390,7 @@ bool RunCode(const ARCode &arcode) doMemoryCopy = true; val_last = data; } - else + else { LogInfo("ZCode: Fill And Slide"); doFillNSlide = true; @@ -393,9 +398,9 @@ bool RunCode(const ARCode &arcode) } break; - default: + default: LogInfo("ZCode: Unknown"); - PanicAlertT("Zero code unknown to dolphin: %08x", zcode); + PanicAlertT("Zero code unknown to dolphin: %08x", zcode); return false; break; } @@ -414,7 +419,7 @@ bool RunCode(const ARCode &arcode) if (false == NormalCode(addr, data)) return false; break; - + default: LogInfo("This Normal Code is a Conditional Code"); if (false == ConditionalCode(addr, data, &skip_count)) @@ -461,10 +466,10 @@ void UpdateActiveList() SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats = false; b_RanOnce = false; activeCodes.clear(); - for (size_t i = 0; i < arCodes.size(); i++) + for (auto& arCode : arCodes) { - if (arCodes[i].active) - activeCodes.push_back(arCodes[i]); + if (arCode.active) + activeCodes.push_back(arCode); } SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats = old_value; } @@ -682,7 +687,7 @@ bool ZeroCode_FillAndSlide(const u32 val_last, const ARAddr addr, const u32 data const s16 addr_incr = (s16)(data & 0xFFFF); const s8 val_incr = (s8)(data >> 24); const u8 write_num = (data & 0xFF0000) >> 16; - + u32 val = addr; u32 curr_addr = new_addr; @@ -697,7 +702,7 @@ bool ZeroCode_FillAndSlide(const u32 val_last, const ARAddr addr, const u32 data case DATATYPE_8BIT: LogInfo("8-bit Write"); LogInfo("--------"); - for (int i = 0; i < write_num; ++i) + for (int i = 0; i < write_num; ++i) { Memory::Write_U8(val & 0xFF, curr_addr); curr_addr += addr_incr; @@ -761,7 +766,7 @@ bool ZeroCode_MemoryCopy(const u32 val_last, const ARAddr addr, const u32 data) LogInfo("Size: %08x", num_bytes); if ((data & ~0x7FFF) == 0x0000) - { + { if ((data >> 24) != 0x0) { // Memory Copy With Pointers Support LogInfo("Memory Copy With Pointers Support"); @@ -878,7 +883,7 @@ bool ConditionalCode(const ARAddr addr, const u32 data, int* const pSkipCount) // Skip lines until a "00000000 40000000" line is reached case CONDTIONAL_ALL_LINES: case CONDTIONAL_ALL_LINES_UNTIL: - *pSkipCount = -addr.subtype; + *pSkipCount = -(int) addr.subtype; break; default: diff --git a/Source/Core/Core/Src/ActionReplay.h b/Source/Core/Core/Src/ActionReplay.h index 42c40f08c4..e1d4619065 100644 --- a/Source/Core/Core/Src/ActionReplay.h +++ b/Source/Core/Core/Src/ActionReplay.h @@ -23,12 +23,13 @@ struct ARCode std::string name; std::vector ops; bool active; + bool user_defined; }; void RunAllActive(); bool RunCode(const ARCode &arcode); -void LoadCodes(IniFile &ini, bool forceLoad); -void LoadCodes(std::vector &_arCodes, IniFile &ini); +void LoadCodes(IniFile &globalini, IniFile &localIni, bool forceLoad); +void LoadCodes(std::vector &_arCodes, IniFile &globalini, IniFile &localIni); size_t GetCodeListSize(); ARCode GetARCode(size_t index); void SetARCode_IsActive(bool active, size_t index); diff --git a/Source/Core/Core/Src/ArmMemTools.cpp b/Source/Core/Core/Src/ArmMemTools.cpp index 34a0c34b7d..262c59fc53 100644 --- a/Source/Core/Core/Src/ArmMemTools.cpp +++ b/Source/Core/Core/Src/ArmMemTools.cpp @@ -66,7 +66,7 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) void *fault_memory_ptr = (void*)ctx->arm_r10; u8 *fault_instruction_ptr = (u8 *)ctx->arm_pc; - + if (!JitInterface::IsInCodeSpace(fault_instruction_ptr)) { // Let's not prevent debugging. return; @@ -81,13 +81,9 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) u32 em_address = (u32)(bad_address - memspace_bottom); - int access_type = 0; - - CONTEXT fake_ctx; - fake_ctx.reg_pc = ctx->arm_pc; - const u8 *new_rip = jit->BackPatch(fault_instruction_ptr, access_type, em_address, &fake_ctx); + const u8 *new_rip = jit->BackPatch(fault_instruction_ptr, em_address, ctx); if (new_rip) { - ctx->arm_pc = fake_ctx.reg_pc; + ctx->arm_pc = (u32) new_rip; } } diff --git a/Source/Core/Core/Src/Boot/Boot.cpp b/Source/Core/Core/Src/Boot/Boot.cpp index 6f8f67bf11..7691421623 100644 --- a/Source/Core/Core/Src/Boot/Boot.cpp +++ b/Source/Core/Core/Src/Boot/Boot.cpp @@ -12,13 +12,11 @@ #include "../PowerPC/PowerPC.h" #include "../PowerPC/PPCAnalyst.h" #include "../Core.h" -#include "../HW/HW.h" #include "../HW/EXI_DeviceIPL.h" #include "../HW/Memmap.h" #include "../HW/ProcessorInterface.h" #include "../HW/DVDInterface.h" #include "../HW/VideoInterface.h" -#include "../HW/CPU.h" #include "../IPC_HLE/WII_IPC_HLE.h" #include "../Debugger/Debugger_SymbolMap.h" // Debugger @@ -30,7 +28,6 @@ #include "../PatchEngine.h" #include "../PowerPC/SignatureDB.h" #include "../PowerPC/PPCSymbolDB.h" -#include "../MemTools.h" #include "../ConfigManager.h" #include "VolumeCreator.h" // DiscIO @@ -44,11 +41,11 @@ void CBoot::Load_FST(bool _bIsWii) return; // copy first 20 bytes of disc to start of Mem 1 - VolumeHandler::ReadToPtr(Memory::GetPointer(0x80000000), 0, 0x20); + VolumeHandler::ReadToPtr(Memory::GetPointer(0x80000000), 0, 0x20); // copy of game id Memory::Write_U32(Memory::Read_U32(0x80000000), 0x80003180); - + u32 shift = 0; if (_bIsWii) shift = 2; @@ -71,62 +68,76 @@ void CBoot::UpdateDebugger_MapLoaded(const char *_gameID) Host_NotifyMapLoaded(); } -std::string CBoot::GenerateMapFilename() +bool CBoot::FindMapFile(std::string* existing_map_file, + std::string* writable_map_file) { + std::string title_id_str; + SCoreStartupParameter& _StartupPara = SConfig::GetInstance().m_LocalCoreStartupParameter; switch (_StartupPara.m_BootType) { case SCoreStartupParameter::BOOT_WII_NAND: { - const DiscIO::INANDContentLoader& Loader = DiscIO::CNANDContentManager::Access().GetNANDLoader(_StartupPara.m_strFilename); + const DiscIO::INANDContentLoader& Loader = + DiscIO::CNANDContentManager::Access().GetNANDLoader(_StartupPara.m_strFilename); if (Loader.IsValid()) { u64 TitleID = Loader.GetTitleID(); - char tmpBuffer[32]; - sprintf(tmpBuffer, "%08x_%08x", (u32)(TitleID >> 32) & 0xFFFFFFFF , (u32)TitleID & 0xFFFFFFFF ); - return File::GetUserPath(D_MAPS_IDX) + std::string(tmpBuffer) + ".map"; + title_id_str = StringFromFormat("%08X_%08X", + (u32)(TitleID >> 32) & 0xFFFFFFFF, + (u32)TitleID & 0xFFFFFFFF); } break; } case SCoreStartupParameter::BOOT_ELF: case SCoreStartupParameter::BOOT_DOL: - return _StartupPara.m_strFilename.substr(0, _StartupPara.m_strFilename.size()-4) + ".map"; + // Strip the .elf/.dol file extension + title_id_str = _StartupPara.m_strFilename.substr( + 0, _StartupPara.m_strFilename.size() - 4); + break; + default: - return File::GetUserPath(D_MAPS_IDX) + _StartupPara.GetUniqueID() + ".map"; + title_id_str = _StartupPara.GetUniqueID(); + break; } - return std::string("unknown map"); -} + if (writable_map_file) + *writable_map_file = File::GetUserPath(D_MAPS_IDX) + title_id_str + ".map"; -bool CBoot::LoadMapFromFilename(const std::string &_rFilename, const char *_gameID) -{ - if (_rFilename.size() == 0) - return false; - - std::string strMapFilename = GenerateMapFilename(); - - bool success = false; - if (!g_symbolDB.LoadMap(strMapFilename.c_str())) + bool found = false; + static const std::string maps_directories[] = { + File::GetUserPath(D_MAPS_IDX), + File::GetSysDirectory() + MAPS_DIR DIR_SEP + }; + for (size_t i = 0; !found && i < ArraySize(maps_directories); ++i) { - if (_gameID != NULL) + std::string path = maps_directories[i] + title_id_str + ".map"; + if (File::Exists(path)) { - BuildCompleteFilename(strMapFilename, "maps", std::string(_gameID) + ".map"); - success = g_symbolDB.LoadMap(strMapFilename.c_str()); + found = true; + if (existing_map_file) + *existing_map_file = path; } } - else - { - success = true; - } - if (success) - UpdateDebugger_MapLoaded(); - - return success; + return found; } -// If ipl.bin is not found, this function does *some* of what BS1 does: +bool CBoot::LoadMapFromFilename() +{ + std::string strMapFilename; + bool found = FindMapFile(&strMapFilename, NULL); + if (found && g_symbolDB.LoadMap(strMapFilename.c_str())) + { + UpdateDebugger_MapLoaded(); + return true; + } + + return false; +} + +// If ipl.bin is not found, this function does *some* of what BS1 does: // loading IPL(BS2) and jumping to it. // It does not initialize the hardware or anything else like BS1 does. bool CBoot::Load_BS2(const std::string& _rBootROMFilename) @@ -140,7 +151,7 @@ bool CBoot::Load_BS2(const std::string& _rBootROMFilename) // Load the whole ROM dump std::string data; - if (!File::ReadFileToString(false, _rBootROMFilename.c_str(), data)) + if (!File::ReadFileToString(_rBootROMFilename.c_str(), data)) return false; u32 ipl_hash = HashAdler32((const u8*)data.data(), data.size()); @@ -179,19 +190,11 @@ bool CBoot::Load_BS2(const std::string& _rBootROMFilename) // Third boot step after BootManager and Core. See Call schedule in BootManager.cpp bool CBoot::BootUp() { - SCoreStartupParameter& _StartupPara = + SCoreStartupParameter& _StartupPara = SConfig::GetInstance().m_LocalCoreStartupParameter; NOTICE_LOG(BOOT, "Booting %s", _StartupPara.m_strFilename.c_str()); - // HLE jump to loader (homebrew). Disabled when Gecko is active as it interferes with the code handler - if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) - { - HLE::Patch(0x80001800, "HBReload"); - const u8 stubstr[] = { 'S', 'T', 'U', 'B', 'H', 'A', 'X', 'X' }; - Memory::WriteBigEData(stubstr, 0x80001804, 8); - } - g_symbolDB.Clear(); VideoInterface::Preset(_StartupPara.bNTSC); switch (_StartupPara.m_BootType) @@ -209,10 +212,6 @@ bool CBoot::BootUp() PanicAlertT("Warning - starting ISO in wrong console mode!"); } - char gameID[7]; - memcpy(gameID, pVolume->GetUniqueID().c_str(), 6); - gameID[6] = 0; - // setup the map from ISOFile ID VolumeHandler::SetVolumeName(_StartupPara.m_strFilename); @@ -260,7 +259,7 @@ bool CBoot::BootUp() /* Try to load the symbol map if there is one, and then scan it for and eventually replace code */ - if (LoadMapFromFilename(_StartupPara.m_strFilename, gameID)) + if (LoadMapFromFilename()) HLE::PatchFunctions(); // We don't need the volume any more @@ -296,7 +295,7 @@ bool CBoot::BootUp() NOTICE_LOG(BOOT, "Setting DVDRoot %s", _StartupPara.m_strDVDRoot.c_str()); VolumeHandler::SetVolumeDirectory(_StartupPara.m_strDVDRoot, dolWii, _StartupPara.m_strApploader, _StartupPara.m_strFilename); BS2Success = EmulatedBS2(dolWii); - } + } DVDInterface::SetDiscInside(VolumeHandler::IsValid()); @@ -306,7 +305,7 @@ bool CBoot::BootUp() PC = dolLoader.GetEntryPoint(); } - if (LoadMapFromFilename(_StartupPara.m_strFilename)) + if (LoadMapFromFilename()) HLE::PatchFunctions(); break; @@ -327,7 +326,7 @@ bool CBoot::BootUp() if (elfWii != _StartupPara.bWii) { PanicAlertT("Warning - starting ELF in wrong console mode!"); - } + } bool BS2Success = false; @@ -348,7 +347,7 @@ bool CBoot::BootUp() // TODO: auto-convert elf to dol, so we can load them :) VolumeHandler::SetVolumeDirectory(_StartupPara.m_strDVDRoot, elfWii); BS2Success = EmulatedBS2(elfWii); - } + } else if (!_StartupPara.m_strDefaultGCM.empty()) { NOTICE_LOG(BOOT, "Loading default ISO %s", _StartupPara.m_strDefaultGCM.c_str()); @@ -365,7 +364,7 @@ bool CBoot::BootUp() else // Poor man's bootup { Load_FST(elfWii); - Boot_ELF(_StartupPara.m_strFilename.c_str()); + Boot_ELF(_StartupPara.m_strFilename.c_str()); } UpdateDebugger_MapLoaded(); Dolphin_Debugger::AddAutoBreakpoints(); @@ -376,7 +375,7 @@ bool CBoot::BootUp() case SCoreStartupParameter::BOOT_WII_NAND: Boot_WiiWAD(_StartupPara.m_strFilename.c_str()); - if (LoadMapFromFilename(_StartupPara.m_strFilename)) + if (LoadMapFromFilename()) HLE::PatchFunctions(); // load default image or create virtual drive from directory @@ -395,7 +394,7 @@ bool CBoot::BootUp() DVDInterface::SetDiscInside(VolumeHandler::IsValid()); if (Load_BS2(_StartupPara.m_strBootROM)) { - if (LoadMapFromFilename(_StartupPara.m_strFilename)) + if (LoadMapFromFilename()) HLE::PatchFunctions(); } else @@ -415,6 +414,19 @@ bool CBoot::BootUp() return false; } } + + // HLE jump to loader (homebrew). Disabled when Gecko is active as it interferes with the code handler + if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) + { + HLE::Patch(0x80001800, "HBReload"); + const u8 stubstr[] = { 'S', 'T', 'U', 'B', 'H', 'A', 'X', 'X' }; + Memory::WriteBigEData(stubstr, 0x80001804, 8); + } + + // Not part of the binary itself, but either we or Gecko OS might insert + // this, and it doesn't clear the icache properly. + HLE::Patch(0x800018a8, "GeckoCodehandler"); + Host_UpdateLogDisplay(); return true; } diff --git a/Source/Core/Core/Src/Boot/Boot.h b/Source/Core/Core/Src/Boot/Boot.h index 69053b0f71..da24177865 100644 --- a/Source/Core/Core/Src/Boot/Boot.h +++ b/Source/Core/Core/Src/Boot/Boot.h @@ -5,9 +5,9 @@ #ifndef _BOOT_H #define _BOOT_H +#include #include -#include "Common.h" #include "../CoreParameter.h" class CBoot @@ -16,14 +16,26 @@ public: static bool BootUp(); static bool IsElfWii(const char *filename); - static std::string GenerateMapFilename(); + + // Tries to find a map file for the current game by looking first in the + // local user directory, then in the shared user directory. + // + // If existing_map_file is not NULL and a map file exists, it is set to the + // path to the existing map file. + // + // If writable_map_file is not NULL, it is set to the path to where a map + // file should be saved. + // + // Returns true if a map file exists, false if none could be found. + static bool FindMapFile(std::string* existing_map_file, + std::string* writable_map_file); private: static void RunFunction(u32 _iAddr); static void UpdateDebugger_MapLoaded(const char* _gameID = NULL); - static bool LoadMapFromFilename(const std::string& _rFilename, const char* _gameID = NULL); + static bool LoadMapFromFilename(); static bool Boot_ELF(const char *filename); static bool Boot_WiiWAD(const char *filename); diff --git a/Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp b/Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp index 004c40b576..c7b8483b25 100644 --- a/Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp +++ b/Source/Core/Core/Src/Boot/Boot_BS2Emu.cpp @@ -14,7 +14,6 @@ #include "../HW/DVDInterface.h" #include "../HW/CPU.h" -#include "../Host.h" #include "../VolumeHandler.h" #include "../PatchEngine.h" #include "../MemTools.h" @@ -23,6 +22,7 @@ #include "VolumeCreator.h" #include "Boot.h" #include "HLE/HLE.h" +#include "SettingsHandler.h" void CBoot::RunFunction(u32 _iAddr) { @@ -34,7 +34,7 @@ void CBoot::RunFunction(u32 _iAddr) } // __________________________________________________________________________________________________ -// GameCube Bootstrap 2 HLE: +// GameCube Bootstrap 2 HLE: // copy the apploader to 0x81200000 // execute the apploader, function by function, using the above utility. bool CBoot::EmulatedBS2_GC() @@ -118,7 +118,7 @@ bool CBoot::EmulatedBS2_GC() DEBUG_LOG(MASTER_LOG, "Call iAppLoaderInit"); PowerPC::ppcState.gpr[3] = 0x81300000; RunFunction(iAppLoaderInit); - + // iAppLoaderMain - Here we load the apploader, the DOL (the exe) and the FST (filesystem). // To give you an idea about where the stuff is located on the disc take a look at yagcd // ch 13. @@ -134,7 +134,7 @@ bool CBoot::EmulatedBS2_GC() u32 iRamAddress = Memory::ReadUnchecked_U32(0x81300004); u32 iLength = Memory::ReadUnchecked_U32(0x81300008); u32 iDVDOffset = Memory::ReadUnchecked_U32(0x8130000c); - + INFO_LOG(MASTER_LOG, "DVDRead: offset: %08x memOffset: %08x length: %i", iDVDOffset, iRamAddress, iLength); DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); @@ -148,9 +148,8 @@ bool CBoot::EmulatedBS2_GC() PC = PowerPC::ppcState.gpr[3]; // Load patches - std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); - PatchEngine::LoadPatches(gameID.c_str()); - + PatchEngine::LoadPatches(); + PowerPC::ppcState.DebugCount = 0; // If we have any patches that need to be applied very early, here's a good place @@ -163,54 +162,95 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode) { INFO_LOG(BOOT, "Setup Wii Memory..."); - // Write the 256 byte setting.txt to memory. This may not be needed as - // most or all games read the setting.txt file from - // \title\00000001\00000002\data\setting.txt directly after the read the - // SYSCONF file. The games also read it to 0x3800, what is a little strange - // however is that it only reads the first 100 bytes of it. - std::string region_filename, - settings_Filename(Common::GetTitleDataPath(TITLEID_SYSMENU) + WII_SETTING); + // Write the 256 byte setting.txt to memory. + std::string settings_Filename(Common::GetTitleDataPath(TITLEID_SYSMENU) + WII_SETTING); + std::string area, model, code, video, game; + switch((DiscIO::IVolume::ECountry)_CountryCode) { case DiscIO::IVolume::COUNTRY_KOREA: - region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_KOR_SETTING; + area = "KOR"; + video = "NTSC"; + game = "KR"; + code = "LKH"; break; - case DiscIO::IVolume::COUNTRY_TAIWAN: - // TODO: Determine if Taiwan has their own specific settings. + case DiscIO::IVolume::COUNTRY_TAIWAN: + // TODO: Determine if Taiwan have their own specific settings. case DiscIO::IVolume::COUNTRY_JAPAN: - region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_JAP_SETTING; + area = "JPN"; + video = "NTSC"; + game = "JP"; + code = "LJ"; break; - case DiscIO::IVolume::COUNTRY_USA: - region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_USA_SETTING; + area = "USA"; + video = "NTSC"; + game = "US"; + code = "LU"; break; - case DiscIO::IVolume::COUNTRY_EUROPE: - region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING; + area = "EUR"; + video = "PAL"; + game = "EU"; + code = "LE"; break; - default: // PanicAlertT("SetupWiiMem: Unknown country. Wii boot process will be switched to European settings."); - region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING; + area = "EUR"; + video = "PAL"; + game = "EU"; + code = "LE"; break; } - { + model = "RVL-001(" + area + ")"; + + SettingsHandler gen; + std::string serno = ""; if (File::Exists(settings_Filename)) { + File::IOFile settingsFileHandle(settings_Filename, "rb"); + if (settingsFileHandle.ReadBytes((void*)gen.GetData(), SettingsHandler::SETTINGS_SIZE)) + { + gen.Decrypt(); + serno = gen.GetValue("SERNO"); + gen.Reset(); + } File::Delete(settings_Filename); } - File::CreateFullPath(settings_Filename); - File::Copy(region_filename, settings_Filename); - File::IOFile settingsFile(settings_Filename, "rb"); - if (!settingsFile) + + if (serno.empty() || serno == "000000000") { - PanicAlertT("SetupWiiMem: Cant find setting file"); - return false; + serno = gen.generateSerialNumber(); + INFO_LOG(BOOT, "No previous serial number found, generated one instead: %s", serno.c_str()); + } + else + { + INFO_LOG(BOOT, "Using serial number: %s", serno.c_str()); } - settingsFile.ReadBytes(Memory::GetPointer(0x3800), 256); + gen.AddSetting("AREA", area.c_str()); + gen.AddSetting("MODEL", model.c_str()); + gen.AddSetting("DVD", "0"); + gen.AddSetting("MPCH", "0x7FFE"); + gen.AddSetting("CODE", code.c_str()); + gen.AddSetting("SERNO", serno.c_str()); + gen.AddSetting("VIDEO", video.c_str()); + gen.AddSetting("GAME", game.c_str()); + + + File::CreateFullPath(settings_Filename); + + { + File::IOFile settingsFileHandle(settings_Filename, "wb"); + + if (!settingsFileHandle.WriteBytes(gen.GetData(), SettingsHandler::SETTINGS_SIZE)) + { + PanicAlertT("SetupWiiMem: Cant create setting file"); + return false; + } + Memory::WriteBigEData(gen.GetData(), 0x3800, SettingsHandler::SETTINGS_SIZE); } /* @@ -268,7 +308,7 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode) Memory::Write_U16(0x0000, 0x000030e0); // PADInit Memory::Write_U32(0x80000000, 0x00003184); // GameID Address - // Fake the VI Init of the IPL + // Fake the VI Init of the IPL Memory::Write_U32(SConfig::GetInstance().m_LocalCoreStartupParameter.bNTSC ? 0 : 1, 0x000000CC); // Clear exception handler. Why? Don't we begin with only zeros? @@ -280,7 +320,7 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode) } // __________________________________________________________________________________________________ -// Wii Bootstrap 2 HLE: +// Wii Bootstrap 2 HLE: // copy the apploader to 0x81200000 // execute the apploader bool CBoot::EmulatedBS2_Wii() @@ -297,12 +337,12 @@ bool CBoot::EmulatedBS2_Wii() // This is some kind of consistency check that is compared to the 0x00 // values as the game boots. This location keep the 4 byte ID for as long // as the game is running. The 6 byte ID at 0x00 is overwritten sometime - // after this check during booting. + // after this check during booting. VolumeHandler::ReadToPtr(Memory::GetPointer(0x3180), 0, 4); // Execute the apploader bool apploaderRan = false; - if (VolumeHandler::IsValid() && VolumeHandler::IsWii()) + if (VolumeHandler::IsValid() && VolumeHandler::IsWii()) { UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); m_MSR.FP = 1; @@ -320,7 +360,7 @@ bool CBoot::EmulatedBS2_Wii() // Load Apploader to Memory u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10); u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14); - if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) + if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) { ERROR_LOG(BOOT, "Invalid apploader. Probably your image is corrupted."); return false; @@ -333,7 +373,7 @@ bool CBoot::EmulatedBS2_Wii() u32 iAppLoaderFuncAddr = 0x80004000; PowerPC::ppcState.gpr[3] = iAppLoaderFuncAddr + 0; PowerPC::ppcState.gpr[4] = iAppLoaderFuncAddr + 4; - PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; + PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; RunFunction(iAppLoaderEntry); u32 iAppLoaderInit = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+0); u32 iAppLoaderMain = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+4); @@ -341,14 +381,14 @@ bool CBoot::EmulatedBS2_Wii() // iAppLoaderInit DEBUG_LOG(BOOT, "Run iAppLoaderInit"); - PowerPC::ppcState.gpr[3] = 0x81300000; + PowerPC::ppcState.gpr[3] = 0x81300000; RunFunction(iAppLoaderInit); // Let the apploader load the exe to memory. At this point I get an unknown IPC command // (command zero) when I load Wii Sports or other games a second time. I don't notice // any side effects however. It's a little disconcerting however that Start after Stop // behaves differently than the first Start after starting Dolphin. It means something - // was not reset correctly. + // was not reset correctly. DEBUG_LOG(BOOT, "Run iAppLoaderMain"); do { @@ -380,7 +420,7 @@ bool CBoot::EmulatedBS2_Wii() // Load patches and run startup patches std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); - PatchEngine::LoadPatches(gameID.c_str()); + PatchEngine::LoadPatches(); // return PC = PowerPC::ppcState.gpr[3]; diff --git a/Source/Core/Core/Src/Boot/Boot_DOL.cpp b/Source/Core/Core/Src/Boot/Boot_DOL.cpp index b1476f82d0..58316576a5 100644 --- a/Source/Core/Core/Src/Boot/Boot_DOL.cpp +++ b/Source/Core/Core/Src/Boot/Boot_DOL.cpp @@ -20,7 +20,7 @@ CDolLoader::CDolLoader(const char* _szFilename) u8* const tmpBuffer = new u8[(size_t)size]; { - File::IOFile pStream(_szFilename, "rb"); + File::IOFile pStream(_szFilename, "rb"); pStream.ReadBytes(tmpBuffer, (size_t)size); } @@ -30,33 +30,33 @@ CDolLoader::CDolLoader(const char* _szFilename) CDolLoader::~CDolLoader() { - for (int i = 0; i < DOL_NUM_TEXT; i++) + for (auto& sect : text_section) { - delete [] text_section[i]; - text_section[i] = NULL; + delete [] sect; + sect = NULL; } - for (int i = 0; i < DOL_NUM_DATA; i++) + for (auto& sect : data_section) { - delete [] data_section[i]; - data_section[i] = NULL; + delete [] sect; + sect = NULL; } } void CDolLoader::Initialize(u8* _pBuffer, u32 _Size) -{ +{ memcpy(&m_dolheader, _pBuffer, sizeof(SDolHeader)); // swap memory u32* p = (u32*)&m_dolheader; - for (size_t i = 0; i < (sizeof(SDolHeader)/sizeof(u32)); i++) + for (size_t i = 0; i < (sizeof(SDolHeader)/sizeof(u32)); i++) p[i] = Common::swap32(p[i]); - for (int i = 0; i < DOL_NUM_TEXT; i++) - text_section[i] = NULL; - for (int i = 0; i < DOL_NUM_DATA; i++) - data_section[i] = NULL; - + for (auto& sect : text_section) + sect = NULL; + for (auto& sect : data_section) + sect = NULL; + u32 HID4_pattern = 0x7c13fba6; u32 HID4_mask = 0xfc1fffff; diff --git a/Source/Core/Core/Src/Boot/Boot_DOL.h b/Source/Core/Core/Src/Boot/Boot_DOL.h index 690a58eefd..1ac886e0f3 100644 --- a/Source/Core/Core/Src/Boot/Boot_DOL.h +++ b/Source/Core/Core/Src/Boot/Boot_DOL.h @@ -5,7 +5,7 @@ #ifndef _BOOT_DOL_H #define _BOOT_DOL_H -#include "Common.h" +#include "CommonTypes.h" class CDolLoader { diff --git a/Source/Core/Core/Src/Boot/Boot_ELF.cpp b/Source/Core/Core/Src/Boot/Boot_ELF.cpp index 06e4a33bd8..725332685b 100644 --- a/Source/Core/Core/Src/Boot/Boot_ELF.cpp +++ b/Source/Core/Core/Src/Boot/Boot_ELF.cpp @@ -21,10 +21,10 @@ bool CBoot::IsElfWii(const char *filename) File::IOFile f(filename, "rb"); f.ReadBytes(mem, (size_t)filesize); } - + // Use the same method as the DOL loader uses: search for mfspr from HID4, // which should only be used in Wii ELFs. - // + // // Likely to have some false positives/negatives, patches implementing a // better heuristic are welcome. @@ -63,19 +63,19 @@ bool CBoot::Boot_ELF(const char *filename) File::IOFile f(filename, "rb"); f.ReadBytes(mem, (size_t)filesize); } - + ElfReader reader(mem); reader.LoadInto(0x80000000); if (!reader.LoadSymbols()) { - if (LoadMapFromFilename(filename)) + if (LoadMapFromFilename()) HLE::PatchFunctions(); } else { HLE::PatchFunctions(); } - + PC = reader.GetEntryPoint(); delete[] mem; diff --git a/Source/Core/Core/Src/Boot/Boot_WiiWAD.cpp b/Source/Core/Core/Src/Boot/Boot_WiiWAD.cpp index dd4d8e2f2f..ac950d5038 100644 --- a/Source/Core/Core/Src/Boot/Boot_WiiWAD.cpp +++ b/Source/Core/Core/Src/Boot/Boot_WiiWAD.cpp @@ -19,6 +19,8 @@ #include "VolumeCreator.h" #include "CommonPaths.h" +#include + static u32 state_checksum(u32 *buf, int len) { u32 checksum = 0; @@ -43,7 +45,7 @@ typedef struct { bool CBoot::Boot_WiiWAD(const char* _pFilename) { - + std::string state_filename(Common::GetTitleDataPath(TITLEID_SYSMENU) + WII_STATE); if (File::Exists(state_filename)) @@ -51,7 +53,7 @@ bool CBoot::Boot_WiiWAD(const char* _pFilename) File::IOFile state_file(state_filename, "r+b"); StateFlags state; state_file.ReadBytes(&state, sizeof(StateFlags)); - + state.type = 0x03; // TYPE_RETURN state.checksum = state_checksum((u32*)&state.flags, sizeof(StateFlags)-4); @@ -78,6 +80,8 @@ bool CBoot::Boot_WiiWAD(const char* _pFilename) // create data directory File::CreateFullPath(Common::GetTitleDataPath(titleID)); + if (titleID == TITLEID_SYSMENU) + HLE_IPC_CreateVirtualFATFilesystem(); // setup wii mem if (!SetupWiiMemory(ContentLoader.GetCountry())) return false; @@ -89,9 +93,17 @@ bool CBoot::Boot_WiiWAD(const char* _pFilename) WII_IPC_HLE_Interface::SetDefaultContentFile(_pFilename); - CDolLoader DolLoader(pContent->m_pData, pContent->m_Size); - DolLoader.Load(); - PC = DolLoader.GetEntryPoint() | 0x80000000; + std::unique_ptr pDolLoader; + if (pContent->m_pData) + { + pDolLoader.reset(new CDolLoader(pContent->m_pData, pContent->m_Size)); + } + else + { + pDolLoader.reset(new CDolLoader(pContent->m_Filename.c_str())); + } + pDolLoader->Load(); + PC = pDolLoader->GetEntryPoint() | 0x80000000; // Pass the "#002 check" // Apploader should write the IOS version and revision to 0x3140, and compare it @@ -106,7 +118,7 @@ bool CBoot::Boot_WiiWAD(const char* _pFilename) // Load patches and run startup patches const DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(_pFilename); if (pVolume != NULL) - PatchEngine::LoadPatches(pVolume->GetUniqueID().c_str()); + PatchEngine::LoadPatches(); return true; } diff --git a/Source/Core/Core/Src/Boot/ElfReader.cpp b/Source/Core/Core/Src/Boot/ElfReader.cpp index 5aa0e2b78d..bfbeb91a3b 100644 --- a/Source/Core/Core/Src/Boot/ElfReader.cpp +++ b/Source/Core/Core/Src/Boot/ElfReader.cpp @@ -64,7 +64,7 @@ ElfReader::ElfReader(void *ptr) byteswapHeader(*header); segments = (Elf32_Phdr *)(base + header->e_phoff); - sections = (Elf32_Shdr *)(base + header->e_shoff); + sections = (Elf32_Shdr *)(base + header->e_shoff); for (int i = 0; i < GetNumSegments(); i++) { @@ -98,7 +98,7 @@ bool ElfReader::LoadInto(u32 vaddr) // sectionOffsets = new u32[GetNumSections()]; // sectionAddrs = new u32[GetNumSections()]; - + // Should we relocate? bRelocate = (header->e_type != ET_EXEC); @@ -123,7 +123,7 @@ bool ElfReader::LoadInto(u32 vaddr) Elf32_Phdr *p = segments + i; INFO_LOG(MASTER_LOG, "Type: %i Vaddr: %08x Filesz: %i Memsz: %i ", p->p_type, p->p_vaddr, p->p_filesz, p->p_memsz); - + if (p->p_type == PT_LOAD) { segmentVAddr[i] = baseAddress + p->p_vaddr; @@ -154,7 +154,7 @@ bool ElfReader::LoadInto(u32 vaddr) { Elf32_Shdr *s = §ions[i]; const char *name = GetSectionName(i); - + u32 writeAddr = s->sh_addr + baseAddress; sectionOffsets[i] = writeAddr - vaddr; sectionAddrs[i] = writeAddr; @@ -162,7 +162,7 @@ bool ElfReader::LoadInto(u32 vaddr) if (s->sh_flags & SHF_ALLOC) { LOG(MASTER_LOG,"Data Section found: %s Sitting at %08x, size %08x", name, writeAddr, s->sh_size); - + } else { diff --git a/Source/Core/Core/Src/Boot/ElfReader.h b/Source/Core/Core/Src/Boot/ElfReader.h index de071572a6..c5befc7226 100644 --- a/Source/Core/Core/Src/Boot/ElfReader.h +++ b/Source/Core/Core/Src/Boot/ElfReader.h @@ -26,16 +26,15 @@ private: Elf32_Ehdr *header; Elf32_Phdr *segments; Elf32_Shdr *sections; - - u32 *sectionOffsets; + u32 *sectionAddrs; bool bRelocate; u32 entryPoint; -public: +public: ElfReader(void *ptr); ~ElfReader() { } - + u32 Read32(int off) const { return base32[off>>2]; } // Quick accessors diff --git a/Source/Core/Core/Src/Boot/ElfTypes.h b/Source/Core/Core/Src/Boot/ElfTypes.h index c696b24a07..543c0de10c 100644 --- a/Source/Core/Core/Src/Boot/ElfTypes.h +++ b/Source/Core/Core/Src/Boot/ElfTypes.h @@ -107,12 +107,12 @@ enum ElfSectionFlags SHF_MASKPROC =0xF0000000, }; -// Symbol binding -#define STB_LOCAL 0 -#define STB_GLOBAL 1 -#define STB_WEAK 2 -#define STB_LOPROC 13 -#define STB_HIPROC 15 +// Symbol binding +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_LOPROC 13 +#define STB_HIPROC 15 // Symbol types #define STT_NOTYPE 0 @@ -191,7 +191,7 @@ typedef unsigned int Elf32_Word; // ELF file header -struct Elf32_Ehdr +struct Elf32_Ehdr { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; @@ -210,7 +210,7 @@ struct Elf32_Ehdr }; // Section header -struct Elf32_Shdr +struct Elf32_Shdr { Elf32_Word sh_name; Elf32_Word sh_type; @@ -225,7 +225,7 @@ struct Elf32_Shdr }; // Segment header -struct Elf32_Phdr +struct Elf32_Phdr { Elf32_Word p_type; Elf32_Off p_offset; @@ -238,7 +238,7 @@ struct Elf32_Phdr }; // Symbol table entry -struct Elf32_Sym +struct Elf32_Sym { Elf32_Word st_name; Elf32_Addr st_value; @@ -253,13 +253,13 @@ struct Elf32_Sym #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) // Relocation entries -struct Elf32_Rel +struct Elf32_Rel { Elf32_Addr r_offset; Elf32_Word r_info; }; -struct Elf32_Rela +struct Elf32_Rela { Elf32_Addr r_offset; Elf32_Word r_info; @@ -271,13 +271,13 @@ struct Elf32_Rela #define ELF32_R_INFO(s,t) (((s)<<8 )+(unsigned char)(t)) -struct Elf32_Dyn +struct Elf32_Dyn { Elf32_Sword d_tag; - union + union { Elf32_Word d_val; - Elf32_Addr d_ptr; + Elf32_Addr d_ptr; } d_un; }; diff --git a/Source/Core/Core/Src/BootManager.cpp b/Source/Core/Core/Src/BootManager.cpp index 6454df49d5..6b9a42fa9c 100644 --- a/Source/Core/Core/Src/BootManager.cpp +++ b/Source/Core/Core/Src/BootManager.cpp @@ -9,7 +9,7 @@ // Call sequence: This file has one of the first function called when a game is booted, // the boot sequence in the code is: - + // DolphinWX: FrameTools.cpp StartGame // Core BootManager.cpp BootCore // Core.cpp Init Thread creation @@ -23,7 +23,8 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" +#include "CommonPaths.h" #include "IniFile.h" #include "BootManager.h" #include "Volume.h" @@ -34,7 +35,7 @@ #include "Host.h" #include "VideoBackendBase.h" #include "Movie.h" -#include "NetPlayClient.h" +#include "NetPlayProto.h" namespace BootManager { @@ -44,9 +45,11 @@ namespace BootManager struct ConfigCache { bool valid, bCPUThread, bSkipIdle, bEnableFPRF, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread, - bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2; - int iTLBHack, iCPUCore; - std::string strBackend; + bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2, bTLBHack, bUseFPS; + int iCPUCore, Volume; + unsigned int framelimit; + TEXIDevices m_EXIDevice[2]; + std::string strBackend, sBackend; }; static ConfigCache config_cache; @@ -72,11 +75,19 @@ bool BootCore(const std::string& _rFilename) return false; // Load game specific settings - IniFile game_ini; std::string unique_id = StartUp.GetUniqueID(); - StartUp.m_strGameIni = File::GetUserPath(D_GAMECONFIG_IDX) + unique_id + ".ini"; - if (unique_id.size() == 6 && game_ini.Load(StartUp.m_strGameIni.c_str())) + std::string revision_specific = StartUp.m_strRevisionSpecificUniqueID; + StartUp.m_strGameIniDefault = File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + unique_id + ".ini"; + if (revision_specific != "") + StartUp.m_strGameIniDefaultRevisionSpecific = File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + revision_specific + ".ini"; + else + StartUp.m_strGameIniDefaultRevisionSpecific = ""; + StartUp.m_strGameIniLocal = File::GetUserPath(D_GAMESETTINGS_IDX) + unique_id + ".ini"; + + if (unique_id.size() == 6) { + IniFile game_ini = StartUp.LoadGameIni(); + config_cache.valid = true; config_cache.bCPUThread = StartUp.bCPUThread; config_cache.bSkipIdle = StartUp.bSkipIdle; @@ -84,7 +95,7 @@ bool BootCore(const std::string& _rFilename) config_cache.bEnableFPRF = StartUp.bEnableFPRF; config_cache.bMMU = StartUp.bMMU; config_cache.bDCBZOFF = StartUp.bDCBZOFF; - config_cache.iTLBHack = StartUp.iTLBHack; + config_cache.bTLBHack = StartUp.bTLBHack; config_cache.bVBeamSpeedHack = StartUp.bVBeamSpeedHack; config_cache.bSyncGPU = StartUp.bSyncGPU; config_cache.bFastDiscSpeed = StartUp.bFastDiscSpeed; @@ -94,13 +105,19 @@ bool BootCore(const std::string& _rFilename) config_cache.bHLE_BS2 = StartUp.bHLE_BS2; config_cache.m_EnableJIT = SConfig::GetInstance().m_EnableJIT; config_cache.bDSPThread = StartUp.bDSPThread; + config_cache.m_EXIDevice[0] = SConfig::GetInstance().m_EXIDevice[0]; + config_cache.m_EXIDevice[1] = SConfig::GetInstance().m_EXIDevice[1]; + config_cache.Volume = SConfig::GetInstance().m_Volume; + config_cache.sBackend = SConfig::GetInstance().sBackend; + config_cache.framelimit = SConfig::GetInstance().m_Framelimit; + config_cache.bUseFPS = SConfig::GetInstance().b_UseFPS; // General settings game_ini.Get("Core", "CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread); game_ini.Get("Core", "SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle); game_ini.Get("Core", "EnableFPRF", &StartUp.bEnableFPRF, StartUp.bEnableFPRF); game_ini.Get("Core", "MMU", &StartUp.bMMU, StartUp.bMMU); - game_ini.Get("Core", "TLBHack", &StartUp.iTLBHack, StartUp.iTLBHack); + game_ini.Get("Core", "TLBHack", &StartUp.bTLBHack, StartUp.bTLBHack); game_ini.Get("Core", "DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF); game_ini.Get("Core", "VBeam", &StartUp.bVBeamSpeedHack, StartUp.bVBeamSpeedHack); game_ini.Get("Core", "SyncGPU", &StartUp.bSyncGPU, StartUp.bSyncGPU); @@ -111,6 +128,11 @@ bool BootCore(const std::string& _rFilename) game_ini.Get("Core", "GFXBackend", &StartUp.m_strVideoBackend, StartUp.m_strVideoBackend.c_str()); game_ini.Get("Core", "CPUCore", &StartUp.iCPUCore, StartUp.iCPUCore); game_ini.Get("Core", "HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2); + game_ini.Get("Core", "FrameLimit", &SConfig::GetInstance().m_Framelimit, SConfig::GetInstance().m_Framelimit); + game_ini.Get("Core", "UseFPS", &SConfig::GetInstance().b_UseFPS,SConfig::GetInstance().b_UseFPS); + game_ini.Get("DSP", "Volume", &SConfig::GetInstance().m_Volume, SConfig::GetInstance().m_Volume); + game_ini.Get("DSP", "EnableJIT", &SConfig::GetInstance().m_EnableJIT, SConfig::GetInstance().m_EnableJIT); + game_ini.Get("DSP", "Backend", &SConfig::GetInstance().sBackend, SConfig::GetInstance().sBackend.c_str()); VideoBackend::ActivateBackend(StartUp.m_strVideoBackend); // Wii settings @@ -119,7 +141,7 @@ bool BootCore(const std::string& _rFilename) // Flush possible changes to SYSCONF to file SConfig::GetInstance().m_SYSCONF->Save(); } - } + } // movie settings if (Movie::IsPlayingInput() && Movie::IsConfigSaved()) @@ -144,6 +166,8 @@ bool BootCore(const std::string& _rFilename) StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE; StartUp.bEnableMemcardSaving = g_NetPlaySettings.m_WriteToMemcard; SConfig::GetInstance().m_EnableJIT = g_NetPlaySettings.m_DSPEnableJIT; + SConfig::GetInstance().m_EXIDevice[0] = g_NetPlaySettings.m_EXIDevice[0]; + SConfig::GetInstance().m_EXIDevice[1] = g_NetPlaySettings.m_EXIDevice[1]; } // Run the game @@ -173,7 +197,7 @@ void Stop() StartUp.bEnableFPRF = config_cache.bEnableFPRF; StartUp.bMMU = config_cache.bMMU; StartUp.bDCBZOFF = config_cache.bDCBZOFF; - StartUp.iTLBHack = config_cache.iTLBHack; + StartUp.bTLBHack = config_cache.bTLBHack; StartUp.bVBeamSpeedHack = config_cache.bVBeamSpeedHack; StartUp.bSyncGPU = config_cache.bSyncGPU; StartUp.bFastDiscSpeed = config_cache.bFastDiscSpeed; @@ -183,7 +207,13 @@ void Stop() StartUp.m_strVideoBackend = config_cache.strBackend; VideoBackend::ActivateBackend(StartUp.m_strVideoBackend); StartUp.bHLE_BS2 = config_cache.bHLE_BS2; + SConfig::GetInstance().m_Framelimit = config_cache.framelimit; + SConfig::GetInstance().b_UseFPS = config_cache.bUseFPS; SConfig::GetInstance().m_EnableJIT = config_cache.m_EnableJIT; + SConfig::GetInstance().m_EXIDevice[0] = config_cache.m_EXIDevice[0]; + SConfig::GetInstance().m_EXIDevice[1] = config_cache.m_EXIDevice[1]; + SConfig::GetInstance().m_Volume = config_cache.Volume; + SConfig::GetInstance().sBackend = config_cache.sBackend; } } diff --git a/Source/Core/Core/Src/ConfigManager.cpp b/Source/Core/Core/Src/ConfigManager.cpp index bff6665bc1..f28dfa5d21 100644 --- a/Source/Core/Core/Src/ConfigManager.cpp +++ b/Source/Core/Core/Src/ConfigManager.cpp @@ -2,21 +2,20 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include - #include "Common.h" #include "CommonPaths.h" -#include "IniFile.h" #include "ConfigManager.h" +#include "IniFile.h" #include "FileUtil.h" #include "NANDContentLoader.h" SConfig* SConfig::m_Instance; -static const struct { - const char* IniText; - const int DefaultKey; - const int DefaultModifier; +static const struct +{ + const char* IniText; + const int DefaultKey; + const int DefaultModifier; } g_HKData[] = { #ifdef __APPLE__ { "Open", 79 /* 'O' */, 2 /* wxMOD_CMD */ }, @@ -167,8 +166,11 @@ void SConfig::SaveSettings() } ini.Set("General", "RecursiveGCMPaths", m_RecursiveISOFolder); - ini.Set("General", "NANDRoot", m_NANDPath); + ini.Set("General", "NANDRootPath", m_NANDPath); ini.Set("General", "WirelessMac", m_WirelessMac); + #ifdef USE_GDBSTUB + ini.Set("General", "GDBPort", m_LocalCoreStartupParameter.iGDBPort); + #endif // Interface ini.Set("Interface", "ConfirmStop", m_LocalCoreStartupParameter.bConfirmStop); @@ -186,7 +188,7 @@ void SConfig::SaveSettings() ini.Set("Interface", "ShowLogWindow", m_InterfaceLogWindow); ini.Set("Interface", "ShowLogConfigWindow", m_InterfaceLogConfigWindow); ini.Set("Interface", "ShowConsole", m_InterfaceConsole); - ini.Set("Interface", "ThemeName", m_LocalCoreStartupParameter.theme_name); + ini.Set("Interface", "ThemeName40", m_LocalCoreStartupParameter.theme_name); // Hotkeys for (int i = 0; i < NUM_HOTKEYS; i++) @@ -241,8 +243,8 @@ void SConfig::SaveSettings() ini.Set("Core", "SelectedLanguage", m_LocalCoreStartupParameter.SelectedLanguage); ini.Set("Core", "DPL2Decoder", m_LocalCoreStartupParameter.bDPL2Decoder); ini.Set("Core", "Latency", m_LocalCoreStartupParameter.iLatency); - ini.Set("Core", "MemcardA", m_strMemoryCardA); - ini.Set("Core", "MemcardB", m_strMemoryCardB); + ini.Set("Core", "MemcardAPath", m_strMemoryCardA); + ini.Set("Core", "MemcardBPath", m_strMemoryCardB); ini.Set("Core", "SlotA", m_EXIDevice[0]); ini.Set("Core", "SlotB", m_EXIDevice[1]); ini.Set("Core", "SerialPort1", m_EXIDevice[2]); @@ -294,6 +296,9 @@ void SConfig::LoadSettings() { ini.Get("General", "LastFilename", &m_LastFilename); ini.Get("General", "ShowLag", &m_ShowLag, false); + #ifdef USE_GDBSTUB + ini.Get("General", "GDBPort", &(m_LocalCoreStartupParameter.iGDBPort), -1); + #endif m_ISOFolder.clear(); int numGCMPaths; @@ -312,11 +317,11 @@ void SConfig::LoadSettings() ini.Get("General", "RecursiveGCMPaths", &m_RecursiveISOFolder, false); - ini.Get("General", "NANDRoot", &m_NANDPath); + ini.Get("General", "NANDRootPath", &m_NANDPath); m_NANDPath = File::GetUserPath(D_WIIROOT_IDX, m_NANDPath); DiscIO::cUIDsys::AccessInstance().UpdateLocation(); DiscIO::CSharedContent::AccessInstance().UpdateLocation(); - ini.Get("General", "WirelessMac", &m_WirelessMac); + ini.Get("General", "WirelessMac", &m_WirelessMac); } { @@ -336,7 +341,7 @@ void SConfig::LoadSettings() ini.Get("Interface", "ShowLogWindow", &m_InterfaceLogWindow, false); ini.Get("Interface", "ShowLogConfigWindow", &m_InterfaceLogConfigWindow, false); ini.Get("Interface", "ShowConsole", &m_InterfaceConsole, false); - ini.Get("Interface", "ThemeName", &m_LocalCoreStartupParameter.theme_name, "Boomy"); + ini.Get("Interface", "ThemeName40", &m_LocalCoreStartupParameter.theme_name, "Clean"); // Hotkeys for (int i = 0; i < NUM_HOTKEYS; i++) @@ -396,14 +401,13 @@ void SConfig::LoadSettings() ini.Get("Core", "EnableCheats", &m_LocalCoreStartupParameter.bEnableCheats, false); ini.Get("Core", "SelectedLanguage", &m_LocalCoreStartupParameter.SelectedLanguage, 0); ini.Get("Core", "DPL2Decoder", &m_LocalCoreStartupParameter.bDPL2Decoder, false); - ini.Get("Core", "Latency", &m_LocalCoreStartupParameter.iLatency, 14); - ini.Get("Core", "MemcardA", &m_strMemoryCardA); - ini.Get("Core", "MemcardB", &m_strMemoryCardB); + ini.Get("Core", "Latency", &m_LocalCoreStartupParameter.iLatency, 2); + ini.Get("Core", "MemcardAPath", &m_strMemoryCardA); + ini.Get("Core", "MemcardBPath", &m_strMemoryCardB); ini.Get("Core", "SlotA", (int*)&m_EXIDevice[0], EXIDEVICE_MEMORYCARD); ini.Get("Core", "SlotB", (int*)&m_EXIDevice[1], EXIDEVICE_NONE); ini.Get("Core", "SerialPort1", (int*)&m_EXIDevice[2], EXIDEVICE_NONE); ini.Get("Core", "BBA_MAC", &m_bba_mac); - ini.Get("Core", "ProfiledReJIT",&m_LocalCoreStartupParameter.bJITProfiledReJIT, false); ini.Get("Core", "TimeProfiling",&m_LocalCoreStartupParameter.bJITILTimeProfiling, false); ini.Get("Core", "OutputIR", &m_LocalCoreStartupParameter.bJITILOutputIR, false); char sidevicenum[16]; @@ -420,7 +424,7 @@ void SConfig::LoadSettings() ini.Get("Core", "RunCompareServer", &m_LocalCoreStartupParameter.bRunCompareServer, false); ini.Get("Core", "RunCompareClient", &m_LocalCoreStartupParameter.bRunCompareClient, false); ini.Get("Core", "MMU", &m_LocalCoreStartupParameter.bMMU, false); - ini.Get("Core", "TLBHack", &m_LocalCoreStartupParameter.iTLBHack, 0); + ini.Get("Core", "TLBHack", &m_LocalCoreStartupParameter.bTLBHack, false); ini.Get("Core", "BBDumpPort", &m_LocalCoreStartupParameter.iBBDumpPort, -1); ini.Get("Core", "VBeam", &m_LocalCoreStartupParameter.bVBeamSpeedHack, false); ini.Get("Core", "SyncGPU", &m_LocalCoreStartupParameter.bSyncGPU, false); @@ -444,7 +448,7 @@ void SConfig::LoadSettings() #elif defined __APPLE__ ini.Get("DSP", "Backend", &sBackend, BACKEND_COREAUDIO); #elif defined _WIN32 - ini.Get("DSP", "Backend", &sBackend, BACKEND_DIRECTSOUND); + ini.Get("DSP", "Backend", &sBackend, BACKEND_XAUDIO2); #elif defined ANDROID ini.Get("DSP", "Backend", &sBackend, BACKEND_OPENSLES); #else diff --git a/Source/Core/Core/Src/Console.cpp b/Source/Core/Core/Src/Console.cpp index 15a19b4b74..2d48d0b5c6 100644 --- a/Source/Core/Core/Src/Console.cpp +++ b/Source/Core/Core/Src/Console.cpp @@ -17,8 +17,8 @@ #include "PowerPCDisasm.h" #include "Console.h" -#define CASE1(x) if (memcmp(cmd, x, 2*sizeof(TCHAR))==0) -#define CASE(x) else if (memcmp(cmd, x, 4*sizeof(TCHAR))==0) +#define CASE1(x) if (!strcmp(cmd, (x))) +#define CASE(x) else if (!strcmp(cmd, (x))) void Console_Submit(const char *cmd) { @@ -27,7 +27,7 @@ void Console_Submit(const char *cmd) Core::StartTrace(false); INFO_LOG(CONSOLE, "Read tracing started."); } - CASE1("w") + CASE("w") { Core::StartTrace(true); INFO_LOG(CONSOLE, "Write tracing started."); @@ -141,3 +141,6 @@ void Console_Submit(const char *cmd) ERROR_LOG(CONSOLE, "Invalid command"); } } + +#undef CASE1 +#undef CASE diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index 4aadcbd3a4..ea54163c30 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -16,7 +16,6 @@ #include "MathUtil.h" #include "MemoryUtil.h" -#include "Console.h" #include "Core.h" #include "CPUDetect.h" #include "CoreTiming.h" @@ -40,6 +39,9 @@ #include "IPC_HLE/WII_IPC_HLE_Device_usb.h" #include "PowerPC/PowerPC.h" +#ifdef USE_GDBSTUB +#include "PowerPC/GDBStub.h" +#endif #include "DSPEmulator.h" #include "ConfigManager.h" @@ -102,7 +104,7 @@ std::string StopMessage(bool bMainThread, std::string Message) bMainThread ? "Main Thread" : "Video Thread", Common::CurrentThreadId(), MemUsage().c_str(), Message.c_str()); } -// +// bool PanicAlertToVideo(const char* text, bool yes_no) { DisplayMessage(text, 3000); @@ -120,7 +122,7 @@ void DisplayMessage(const char *message, int time_in_ms) return; g_video_backend->Video_AddMessage(message, time_in_ms); - + if (_CoreParameter.bRenderToMain && SConfig::GetInstance().m_InterfaceStatusbar) { @@ -199,10 +201,9 @@ bool Init() Host_UpdateMainFrame(); // Disable any menus or buttons at boot g_aspect_wide = _CoreParameter.bWii; - if (g_aspect_wide) + if (g_aspect_wide) { - IniFile gameIni; - gameIni.Load(_CoreParameter.m_strGameIni.c_str()); + IniFile gameIni = _CoreParameter.LoadGameIni(); gameIni.Get("Wii", "Widescreen", &g_aspect_wide, !!SConfig::GetInstance().m_SYSCONF-> GetData("IPL.AR")); @@ -213,7 +214,7 @@ bool Init() // within g_video_backend->Initialize() g_pWindowHandle = Host_GetRenderHandle(); - // Start the emu thread + // Start the emu thread g_EmuThread = std::thread(EmuThread); return true; @@ -251,12 +252,12 @@ void Stop() // - Hammertime! // will continue concurrently with the rest of the commands // in this function. We no longer rely on Postmessage. INFO_LOG(CONSOLE, "%s", StopMessage(true, "Wait for Video Loop to exit ...").c_str()); - + g_video_backend->Video_ExitLoop(); } INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping Emu thread ...").c_str()); - + g_EmuThread.join(); // Wait for emuthread to close. INFO_LOG(CONSOLE, "%s", StopMessage(true, "Main Emu thread stopped").c_str()); @@ -270,7 +271,7 @@ void Stop() // - Hammertime! // Close the trace file Core::StopTrace(); - + // Reload sysconf file in order to see changes committed during emulation if (_CoreParameter.bWii) SConfig::GetInstance().m_SYSCONF->Reload(); @@ -308,11 +309,21 @@ void CpuThread() g_bStarted = true; + + #ifdef USE_GDBSTUB + if(_CoreParameter.iGDBPort > 0) + { + gdb_init(_CoreParameter.iGDBPort); + // break at next instruction (the first instruction) + gdb_break(); + } + #endif + // Enter CPU run loop. When we leave it - we are done. CCPU::Run(); g_bStarted = false; - + if (!_CoreParameter.bCPUThread) g_video_backend->Video_Cleanup(); @@ -343,7 +354,7 @@ void FifoPlayerThread() } g_bStarted = false; - + if(!_CoreParameter.bCPUThread) g_video_backend->Video_Cleanup(); @@ -366,7 +377,7 @@ void EmuThread() Movie::Init(); - HW::Init(); + HW::Init(); if (!g_video_backend->Initialize(g_pWindowHandle)) { @@ -375,10 +386,10 @@ void EmuThread() return; } - OSD::AddMessage(("Dolphin " + g_video_backend->GetName() + " Video Backend.").c_str(), 5000); + OSD::AddMessage("Dolphin " + g_video_backend->GetName() + " Video Backend.", 5000); if (!DSP::GetDSPEmulator()->Initialize(g_pWindowHandle, - _CoreParameter.bWii, _CoreParameter.bDSPThread)) + _CoreParameter.bWii, _CoreParameter.bDSPThread)) { HW::Shutdown(); g_video_backend->Shutdown(); @@ -388,7 +399,7 @@ void EmuThread() } Pad::Initialize(g_pWindowHandle); - // Load and Init Wiimotes - only if we are booting in wii mode + // Load and Init Wiimotes - only if we are booting in wii mode if (g_CoreStartupParameter.bWii) { Wiimote::Initialize(g_pWindowHandle, !g_stateFileName.empty()); @@ -397,7 +408,7 @@ void EmuThread() for (unsigned int i = 0; i != MAX_BBMOTES; ++i) if (g_wiimote_sources[i]) GetUsbPointer()->AccessWiiMote(i | 0x100)->Activate(true); - + } // The hardware is initialized. @@ -469,10 +480,16 @@ void EmuThread() // Wait for g_cpu_thread to exit INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping CPU-GPU thread ...").c_str()); + #ifdef USE_GDBSTUB + INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping GDB ...").c_str()); + gdb_deinit(); + INFO_LOG(CONSOLE, "%s", StopMessage(true, "GDB stopped.").c_str()); + #endif + g_cpu_thread.join(); INFO_LOG(CONSOLE, "%s", StopMessage(true, "CPU thread stopped.").c_str()); - + if(_CoreParameter.bCPUThread) g_video_backend->Video_Cleanup(); @@ -482,7 +499,7 @@ void EmuThread() // Stop audio thread - Actually this does nothing when using HLE // emulation, but stops the DSP Interpreter when using LLE emulation. DSP::GetDSPEmulator()->DSP_StopSoundStream(); - + // We must set up this flag before executing HW::Shutdown() g_bHwInit = false; INFO_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down HW").c_str()); @@ -557,7 +574,7 @@ void SaveScreenShot() SetState(CORE_PAUSE); g_video_backend->Video_Screenshot(GenerateScreenshotName().c_str()); - + if (!bPaused) SetState(CORE_RUN); } @@ -679,7 +696,7 @@ void UpdateTitle() u32 Speed = DrawnVideo * (100 * 1000) / (VideoInterface::TargetRefreshRate * ElapseTime); // Settings are shown the same for both extended and summary info - std::string SSettings = StringFromFormat("%s %s | %s | %s", cpu_core_base->GetName(), _CoreParameter.bCPUThread ? "DC" : "SC", + std::string SSettings = StringFromFormat("%s %s | %s | %s", cpu_core_base->GetName(), _CoreParameter.bCPUThread ? "DC" : "SC", g_video_backend->GetName().c_str(), _CoreParameter.bDSPHLE ? "HLE" : "LLE"); // Use extended or summary information. The summary information does not print the ticks data, diff --git a/Source/Core/Core/Src/Core.h b/Source/Core/Core/Src/Core.h index 0fe904ffc1..2b966ea1db 100644 --- a/Source/Core/Core/Src/Core.h +++ b/Source/Core/Core/Src/Core.h @@ -15,7 +15,7 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" #include "CoreParameter.h" namespace Core @@ -66,7 +66,7 @@ inline void DisplayMessage(const std::string &message, int time_in_ms) { DisplayMessage(message.c_str(), time_in_ms); } - + std::string GetStateFileName(); void SetStateFileName(std::string val); diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index 579158c7c8..e7843fe997 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -18,6 +18,8 @@ #include "Core.h" // for bWii #include "FifoPlayer/FifoDataFile.h" +#include + SCoreStartupParameter::SCoreStartupParameter() : hInstance(0), bEnableDebugging(false), bAutomaticStart(false), bBootToPause(false), @@ -28,16 +30,16 @@ SCoreStartupParameter::SCoreStartupParameter() bJITLoadStoreFloatingOff(false), bJITLoadStorePairedOff(false), bJITFloatingPointOff(false), bJITIntegerOff(false), bJITPairedOff(false), bJITSystemRegistersOff(false), - bJITBranchOff(false), bJITProfiledReJIT(false), + bJITBranchOff(false), bJITILTimeProfiling(false), bJITILOutputIR(false), - bEnableFPRF(false), + bEnableFPRF(false), bCPUThread(true), bDSPThread(false), bDSPHLE(true), bSkipIdle(true), bNTSC(false), bForceNTSCJ(false), bHLE_BS2(true), bEnableCheats(false), bMergeBlocks(false), bEnableMemcardSaving(true), bDPL2Decoder(false), iLatency(14), bRunCompareServer(false), bRunCompareClient(false), - bMMU(false), bDCBZOFF(false), iTLBHack(0), iBBDumpPort(0), bVBeamSpeedHack(false), + bMMU(false), bDCBZOFF(false), bTLBHack(false), iBBDumpPort(0), bVBeamSpeedHack(false), bSyncGPU(false), bFastDiscSpeed(false), SelectedLanguage(0), bWii(false), bConfirmStop(false), bHideCursor(false), @@ -58,6 +60,11 @@ void SCoreStartupParameter::LoadDefaults() bEnableDebugging = false; bAutomaticStart = false; bBootToPause = false; + + #ifdef USE_GDBSTUB + iGDBPort = -1; + #endif + iCPUCore = 1; bCPUThread = false; bSkipIdle = false; @@ -68,7 +75,7 @@ void SCoreStartupParameter::LoadDefaults() bEnableFPRF = false; bMMU = false; bDCBZOFF = false; - iTLBHack = 0; + bTLBHack = false; iBBDumpPort = -1; bVBeamSpeedHack = false; bSyncGPU = false; @@ -100,26 +107,26 @@ void SCoreStartupParameter::LoadDefaults() m_strUniqueID = "00000000"; } -bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) +bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) { std::string Region(EUR_DIR); - + switch (_BootBS2) { case BOOT_DEFAULT: { bool bootDrive = cdio_is_cdrom(m_strFilename); // Check if the file exist, we may have gotten it from a --elf command line - // that gave an incorrect file name + // that gave an incorrect file name if (!bootDrive && !File::Exists(m_strFilename)) { PanicAlertT("The specified file \"%s\" does not exist", m_strFilename.c_str()); return false; } - + std::string Extension; SplitPath(m_strFilename, NULL, NULL, &Extension); - if (!strcasecmp(Extension.c_str(), ".gcm") || + if (!strcasecmp(Extension.c_str(), ".gcm") || !strcasecmp(Extension.c_str(), ".iso") || !strcasecmp(Extension.c_str(), ".wbfs") || !strcasecmp(Extension.c_str(), ".ciso") || @@ -142,48 +149,49 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) } m_strName = pVolume->GetName(); m_strUniqueID = pVolume->GetUniqueID(); - + m_strRevisionSpecificUniqueID = pVolume->GetRevisionSpecificUniqueID(); + // Check if we have a Wii disc bWii = DiscIO::IsVolumeWiiDisc(pVolume); switch (pVolume->GetCountry()) { case DiscIO::IVolume::COUNTRY_USA: bNTSC = true; - Region = USA_DIR; + Region = USA_DIR; break; - + case DiscIO::IVolume::COUNTRY_TAIWAN: case DiscIO::IVolume::COUNTRY_KOREA: // TODO: Should these have their own Region Dir? case DiscIO::IVolume::COUNTRY_JAPAN: bNTSC = true; - Region = JAP_DIR; + Region = JAP_DIR; break; - + case DiscIO::IVolume::COUNTRY_EUROPE: case DiscIO::IVolume::COUNTRY_FRANCE: case DiscIO::IVolume::COUNTRY_ITALY: case DiscIO::IVolume::COUNTRY_RUSSIA: bNTSC = false; - Region = EUR_DIR; + Region = EUR_DIR; break; - + default: if (PanicYesNoT("Your GCM/ISO file seems to be invalid (invalid country)." "\nContinue with PAL region?")) { bNTSC = false; - Region = EUR_DIR; + Region = EUR_DIR; break; }else return false; } - + delete pVolume; } else if (!strcasecmp(Extension.c_str(), ".elf")) { bWii = CBoot::IsElfWii(m_strFilename.c_str()); - Region = USA_DIR; + Region = USA_DIR; m_BootType = BOOT_ELF; bNTSC = true; } @@ -191,7 +199,7 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) { CDolLoader dolfile(m_strFilename.c_str()); bWii = dolfile.IsWii(); - Region = USA_DIR; + Region = USA_DIR; m_BootType = BOOT_DOL; bNTSC = true; } @@ -214,7 +222,7 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) { const DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(m_strFilename.c_str()); const DiscIO::INANDContentLoader& ContentLoader = DiscIO::CNANDContentManager::Access().GetNANDLoader(m_strFilename); - + if (ContentLoader.GetContentByIndex(ContentLoader.GetBootIndex()) == NULL) { //WAD is valid yet cannot be booted. Install instead. @@ -228,9 +236,9 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) { case DiscIO::IVolume::COUNTRY_USA: bNTSC = true; - Region = USA_DIR; + Region = USA_DIR; break; - + case DiscIO::IVolume::COUNTRY_TAIWAN: case DiscIO::IVolume::COUNTRY_KOREA: // TODO: Should these have their own Region Dir? @@ -238,15 +246,15 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) bNTSC = true; Region = JAP_DIR; break; - + case DiscIO::IVolume::COUNTRY_EUROPE: case DiscIO::IVolume::COUNTRY_FRANCE: case DiscIO::IVolume::COUNTRY_ITALY: case DiscIO::IVolume::COUNTRY_RUSSIA: bNTSC = false; - Region = EUR_DIR; + Region = EUR_DIR; break; - + default: bNTSC = false; Region = EUR_DIR; @@ -272,8 +280,8 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) // Use the TitleIDhex for name and/or unique ID if launching from nand folder // or if it is not ascii characters (specifically sysmenu could potentially apply to other things) char titleidstr[17]; - snprintf(titleidstr, 17, "%016llx", ContentLoader.GetTitleID()); - + snprintf(titleidstr, 17, "%016" PRIx64, ContentLoader.GetTitleID()); + if (!m_strName.length()) { m_strName = titleidstr; @@ -304,7 +312,7 @@ bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2) bNTSC = true; break; - case BOOT_BS2_EUR: + case BOOT_BS2_EUR: Region = EUR_DIR; m_strFilename.clear(); bNTSC = false; @@ -346,11 +354,7 @@ void SCoreStartupParameter::CheckMemcardPath(std::string& memcardPath, std::stri { // Use default memcard path if there is no user defined name std::string defaultFilename = isSlotA ? GC_MEMCARDA : GC_MEMCARDB; - #ifdef _WIN32 - memcardPath = "." + File::GetUserPath(D_GCUSER_IDX).substr(File::GetExeDirectory().size()) + defaultFilename + ext; - #else - memcardPath = File::GetUserPath(D_GCUSER_IDX) + defaultFilename + ext; - #endif + memcardPath = File::GetUserPath(D_GCUSER_IDX) + defaultFilename + ext; } else { @@ -389,3 +393,29 @@ void SCoreStartupParameter::CheckMemcardPath(std::string& memcardPath, std::stri } } } + +IniFile SCoreStartupParameter::LoadGameIni() const +{ + IniFile game_ini; + game_ini.Load(m_strGameIniDefault); + if (m_strGameIniDefaultRevisionSpecific != "") + game_ini.Load(m_strGameIniDefaultRevisionSpecific, true); + game_ini.Load(m_strGameIniLocal, true); + return game_ini; +} + +IniFile SCoreStartupParameter::LoadDefaultGameIni() const +{ + IniFile game_ini; + game_ini.Load(m_strGameIniDefault); + if (m_strGameIniDefaultRevisionSpecific != "") + game_ini.Load(m_strGameIniDefaultRevisionSpecific, true); + return game_ini; +} + +IniFile SCoreStartupParameter::LoadLocalGameIni() const +{ + IniFile game_ini; + game_ini.Load(m_strGameIniLocal); + return game_ini; +} diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index b33d090ed2..caef1d4bbb 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -88,6 +88,9 @@ struct SCoreStartupParameter // Settings bool bEnableDebugging; + #ifdef USE_GDBSTUB + int iGDBPort; + #endif bool bAutomaticStart; bool bBootToPause; @@ -108,7 +111,6 @@ struct SCoreStartupParameter bool bJITPairedOff; bool bJITSystemRegistersOff; bool bJITBranchOff; - bool bJITProfiledReJIT; bool bJITILTimeProfiling; bool bJITILOutputIR; @@ -134,7 +136,7 @@ struct SCoreStartupParameter bool bMMU; bool bDCBZOFF; - int iTLBHack; + bool bTLBHack; int iBBDumpPort; bool bVBeamSpeedHack; bool bSyncGPU; @@ -194,8 +196,11 @@ struct SCoreStartupParameter std::string m_strDVDRoot; std::string m_strApploader; std::string m_strUniqueID; + std::string m_strRevisionSpecificUniqueID; std::string m_strName; - std::string m_strGameIni; + std::string m_strGameIniDefault; + std::string m_strGameIniDefaultRevisionSpecific; + std::string m_strGameIniLocal; // Constructor just calls LoadDefaults SCoreStartupParameter(); @@ -204,6 +209,9 @@ struct SCoreStartupParameter bool AutoSetup(EBootBS2 _BootBS2); const std::string &GetUniqueID() const { return m_strUniqueID; } void CheckMemcardPath(std::string& memcardPath, std::string Region, bool isSlotA); + IniFile LoadDefaultGameIni() const; + IniFile LoadLocalGameIni() const; + IniFile LoadGameIni() const; }; #endif diff --git a/Source/Core/Core/Src/CoreTiming.cpp b/Source/Core/Core/Src/CoreTiming.cpp index 06770aa375..6dac07e567 100644 --- a/Source/Core/Core/Src/CoreTiming.cpp +++ b/Source/Core/Core/Src/CoreTiming.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include "Thread.h" #include "PowerPC/PowerPC.h" @@ -10,6 +11,7 @@ #include "Core.h" #include "StringUtil.h" #include "VideoBackendBase.h" +#include "FifoQueue.h" #define MAX_SLICE_LENGTH 20000 @@ -29,20 +31,17 @@ struct BaseEvent s64 time; u64 userdata; int type; -// Event *next; }; typedef LinkedListItem Event; // STATE_TO_SAVE -Event *first; -Event *tsFirst; -Event *tsLast; +static Event *first; +static std::mutex tsWriteLock; +Common::FifoQueue tsQueue; // event pools Event *eventPool = 0; -Event *eventTsPool = 0; -int allocatedTsEvents = 0; int downcount, slicelength; int maxSliceLength = MAX_SLICE_LENGTH; @@ -57,7 +56,6 @@ u64 fakeTBStartTicks; int ev_lost; -static std::recursive_mutex externalEventSection; void (*advanceCallback)(int cyclesExecuted) = NULL; @@ -71,31 +69,12 @@ Event* GetNewEvent() return ev; } -Event* GetNewTsEvent() -{ - allocatedTsEvents++; - - if(!eventTsPool) - return new Event; - - Event* ev = eventTsPool; - eventTsPool = ev->next; - return ev; -} - void FreeEvent(Event* ev) { ev->next = eventPool; eventPool = ev; } -void FreeTsEvent(Event* ev) -{ - ev->next = eventTsPool; - eventTsPool = ev; - allocatedTsEvents--; -} - static void EmptyTimedCallback(u64 userdata, int cyclesLate) {} int RegisterEvent(const char *name, TimedCallback callback) @@ -106,15 +85,15 @@ int RegisterEvent(const char *name, TimedCallback callback) // check for existing type with same name. // we want event type names to remain unique so that we can use them for serialization. - for (unsigned int i = 0; i < event_types.size(); ++i) + for (auto& event_type : event_types) { - if (!strcmp(name, event_types[i].name)) + if (!strcmp(name, event_type.name)) { WARN_LOG(POWERPC, "Discarded old event type \"%s\" because a new type with the same name was registered.", name); // we don't know if someone might be holding on to the type index, // so we gut the old event type instead of actually removing it. - event_types[i].name = "_discarded_event"; - event_types[i].callback = &EmptyTimedCallback; + event_type.name = "_discarded_event"; + event_type.callback = &EmptyTimedCallback; } } @@ -135,12 +114,13 @@ void Init() slicelength = maxSliceLength; globalTimer = 0; idledCycles = 0; - + ev_lost = RegisterEvent("_lost_event", &EmptyTimedCallback); } void Shutdown() { + std::lock_guard lk(tsWriteLock); MoveEvents(); ClearPendingEvents(); UnregisterAllEvents(); @@ -151,14 +131,6 @@ void Shutdown() eventPool = ev->next; delete ev; } - - std::lock_guard lk(externalEventSection); - while(eventTsPool) - { - Event *ev = eventTsPool; - eventTsPool = ev->next; - delete ev; - } } void EventDoState(PointerWrap &p, BaseEvent* ev) @@ -197,7 +169,7 @@ void EventDoState(PointerWrap &p, BaseEvent* ev) void DoState(PointerWrap &p) { - std::lock_guard lk(externalEventSection); + std::lock_guard lk(tsWriteLock); p.Do(downcount); p.Do(slicelength); p.Do(globalTimer); @@ -208,16 +180,15 @@ void DoState(PointerWrap &p) p.Do(fakeTBStartTicks); p.DoMarker("CoreTimingData"); + MoveEvents(); + p.DoLinkedList(first); p.DoMarker("CoreTimingEvents"); - - p.DoLinkedList(tsFirst, &tsLast); - p.DoMarker("CoreTimingTsEvents"); } u64 GetTicks() { - return (u64)globalTimer; + return (u64)globalTimer; } u64 GetIdleTicks() @@ -229,17 +200,12 @@ u64 GetIdleTicks() // schedule things to be executed on the main thread. void ScheduleEvent_Threadsafe(int cyclesIntoFuture, int event_type, u64 userdata) { - std::lock_guard lk(externalEventSection); - Event *ne = GetNewTsEvent(); - ne->time = globalTimer + cyclesIntoFuture; - ne->type = event_type; - ne->next = 0; - ne->userdata = userdata; - if(!tsFirst) - tsFirst = ne; - if(tsLast) - tsLast->next = ne; - tsLast = ne; + std::lock_guard lk(tsWriteLock); + Event ne; + ne.time = globalTimer + cyclesIntoFuture; + ne.type = event_type; + ne.userdata = userdata; + tsQueue.Push(ne); } // Same as ScheduleEvent_Threadsafe(0, ...) EXCEPT if we are already on the CPU thread @@ -248,7 +214,6 @@ void ScheduleEvent_Threadsafe_Immediate(int event_type, u64 userdata) { if(Core::IsCPUThread()) { - std::lock_guard lk(externalEventSection); event_types[event_type].callback(userdata, 0); } else @@ -287,7 +252,7 @@ void AddEventToQueue(Event* ne) // This must be run ONLY from within the cpu thread // cyclesIntoFuture may be VERY inaccurate if called from anything else -// than Advance +// than Advance void ScheduleEvent(int cyclesIntoFuture, int event_type, u64 userdata) { Event *ne = GetNewEvent(); @@ -302,7 +267,7 @@ void RegisterAdvanceCallback(void (*callback)(int cyclesExecuted)) advanceCallback = callback; } -bool IsScheduled(int event_type) +bool IsScheduled(int event_type) { if (!first) return false; @@ -333,7 +298,7 @@ void RemoveEvent(int event_type) break; } } - + if (!first) return; @@ -355,54 +320,9 @@ void RemoveEvent(int event_type) } } -void RemoveThreadsafeEvent(int event_type) -{ - std::lock_guard lk(externalEventSection); - if (!tsFirst) - { - return; - } - - while(tsFirst) - { - if (tsFirst->type == event_type) - { - Event *next = tsFirst->next; - FreeTsEvent(tsFirst); - tsFirst = next; - } - else - { - break; - } - } - - if (!tsFirst) - { - return; - } - - Event *prev = tsFirst; - Event *ptr = prev->next; - while (ptr) - { - if (ptr->type == event_type) - { - prev->next = ptr->next; - FreeTsEvent(ptr); - ptr = prev->next; - } - else - { - prev = ptr; - ptr = ptr->next; - } - } -} - void RemoveAllEvents(int event_type) -{ - RemoveThreadsafeEvent(event_type); +{ + MoveEvents(); RemoveEvent(event_type); } @@ -447,34 +367,24 @@ void ProcessFifoWaitEvents() { break; } - } + } } void MoveEvents() { - std::lock_guard lk(externalEventSection); - // Move events from async queue into main queue - while (tsFirst) + BaseEvent sevt; + while (tsQueue.Pop(sevt)) { - Event *next = tsFirst->next; - AddEventToQueue(tsFirst); - tsFirst = next; - } - tsLast = NULL; - - // Move free events to threadsafe pool - while(allocatedTsEvents > 0 && eventPool) - { - Event *ev = eventPool; - eventPool = ev->next; - ev->next = eventTsPool; - eventTsPool = ev; - allocatedTsEvents--; + Event *evt = GetNewEvent(); + evt->time = sevt.time; + evt->userdata = sevt.userdata; + evt->type = sevt.type; + AddEventToQueue(evt); } } void Advance() -{ +{ MoveEvents(); int cyclesExecuted = slicelength - downcount; @@ -485,7 +395,7 @@ void Advance() { if (first->time <= globalTimer) { -// LOG(POWERPC, "[Scheduler] %s (%lld, %lld) ", +// LOG(POWERPC, "[Scheduler] %s (%lld, %lld) ", // event_types[first->type].name ? event_types[first->type].name : "?", (u64)globalTimer, (u64)first->time); Event* evt = first; first = first->next; @@ -498,7 +408,7 @@ void Advance() } } - if (!first) + if (!first) { WARN_LOG(POWERPC, "WARNING - no events in queue. Setting downcount to 10000"); downcount += 10000; @@ -520,7 +430,7 @@ void LogPendingEvents() Event *ptr = first; while (ptr) { - INFO_LOG(POWERPC, "PENDING: Now: %lld Pending: %lld Type: %d", globalTimer, ptr->time, ptr->type); + INFO_LOG(POWERPC, "PENDING: Now: %" PRId64 " Pending: %" PRId64 " Type: %d", globalTimer, ptr->time, ptr->type); ptr = ptr->next; } } @@ -528,9 +438,9 @@ void LogPendingEvents() void Idle() { //DEBUG_LOG(POWERPC, "Idle"); - + //When the FIFO is processing data we must not advance because in this way - //the VI will be desynchronized. So, We are waiting until the FIFO finish and + //the VI will be desynchronized. So, We are waiting until the FIFO finish and //while we process only the events required by the FIFO. while (g_video_backend->Video_IsPossibleWaitingSetDrawDone()) { @@ -540,7 +450,7 @@ void Idle() idledCycles += downcount; downcount = 0; - + Advance(); } @@ -554,11 +464,11 @@ std::string GetScheduledEventsSummary() unsigned int t = ptr->type; if (t >= event_types.size()) PanicAlertT("Invalid event type %i", t); - + const char *name = event_types[ptr->type].name; if (!name) name = "[unknown]"; - + text += StringFromFormat("%s : %i %08x%08x\n", event_types[ptr->type].name, ptr->time, ptr->userdata >> 32, ptr->userdata); ptr = ptr->next; } @@ -606,3 +516,4 @@ void SetFakeTBStartTicks(u64 val) } } // namespace + diff --git a/Source/Core/Core/Src/CoreTiming.h b/Source/Core/Core/Src/CoreTiming.h index bbb35f33b2..cd8321c10c 100644 --- a/Source/Core/Core/Src/CoreTiming.h +++ b/Source/Core/Core/Src/CoreTiming.h @@ -49,7 +49,6 @@ void ScheduleEvent_Threadsafe_Immediate(int event_type, u64 userdata=0); // We only permit one event of each type in the queue at a time. void RemoveEvent(int event_type); -void RemoveThreadsafeEvent(int event_type); void RemoveAllEvents(int event_type); bool IsScheduled(int event_type); void Advance(); diff --git a/Source/Core/Core/Src/DSP/DSPAccelerator.cpp b/Source/Core/Core/Src/DSP/DSPAccelerator.cpp index 71b3f91294..8b493e0599 100644 --- a/Source/Core/Core/Src/DSP/DSPAccelerator.cpp +++ b/Source/Core/Core/Src/DSP/DSPAccelerator.cpp @@ -73,7 +73,7 @@ u16 dsp_read_aram_d3() break; } - if (Address >= EndAddress) + if (Address >= EndAddress) { // Set address back to start address. (never seen this here!) Address = (g_dsp.ifx_regs[DSP_ACSAH] << 16) | g_dsp.ifx_regs[DSP_ACSAL]; @@ -131,7 +131,7 @@ u16 dsp_read_accelerator() Address++; break; case 0x19: // 8-bit PCM audio - val = DSPHost_ReadHostMemory(Address) << 8; + val = DSPHost_ReadHostMemory(Address) << 8; g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1]; g_dsp.ifx_regs[DSP_YN1] = val; Address++; diff --git a/Source/Core/Core/Src/DSP/DSPAnalyzer.cpp b/Source/Core/Core/Src/DSP/DSPAnalyzer.cpp index 1e5f727fa1..c682cdf415 100644 --- a/Source/Core/Core/Src/DSP/DSPAnalyzer.cpp +++ b/Source/Core/Core/Src/DSP/DSPAnalyzer.cpp @@ -43,20 +43,20 @@ const u16 idle_skip_sigs[NUM_IDLE_SIGS][MAX_IDLE_SIG_SIZE + 1] = { 0x26fc, // lrs $AC0.M, @DMBH 0x02a0, 0x8000, // andf $AC0.M, #0x8000 0x029c, 0xFFFF, // jlnz 0x???? - 0, 0 }, + 0, 0 }, { 0x27fc, // lrs $AC1.M, @DMBH 0x03a0, 0x8000, // andf $AC1.M, #0x8000 0x029c, 0xFFFF, // jlnz 0x???? - 0, 0 }, + 0, 0 }, // From Zelda: { 0x00de, 0xFFFE, // LR $AC0.M, @CMBH - 0x02c0, 0x8000, // ANDCF $AC0.M, #0x8000 + 0x02c0, 0x8000, // ANDCF $AC0.M, #0x8000 0x029c, 0xFFFF, // JLNZ 0x05cf 0 }, // From Zelda - experimental { 0x00da, 0x0352, // lr $AX0.H, @0x0352 0x8600, // tstaxh $AX0.H - 0x0295, 0xFFFF, // jz 0x???? + 0x0295, 0xFFFF, // jz 0x???? 0, 0 } }; @@ -112,11 +112,11 @@ void AnalyzeRange(int start_addr, int end_addr) // If an instruction potentially raises exceptions, mark the following // instruction as needing to check for exceptions - if (opcode->opcode == 0x00c0 || - opcode->opcode == 0x1800 || - opcode->opcode == 0x1880 || - opcode->opcode == 0x1900 || - opcode->opcode == 0x1980 || + if (opcode->opcode == 0x00c0 || + opcode->opcode == 0x1800 || + opcode->opcode == 0x1880 || + opcode->opcode == 0x1900 || + opcode->opcode == 0x1980 || opcode->opcode == 0x2000 || opcode->extended ) diff --git a/Source/Core/Core/Src/DSP/DSPBreakpoints.h b/Source/Core/Core/Src/DSP/DSPBreakpoints.h index 96c116f5a1..6c3eb8be45 100644 --- a/Source/Core/Core/Src/DSP/DSPBreakpoints.h +++ b/Source/Core/Core/Src/DSP/DSPBreakpoints.h @@ -16,7 +16,7 @@ public: { Clear(); } - + // is address breakpoint bool IsAddressBreakPoint(u32 addr) { @@ -27,7 +27,7 @@ public: bool Add(u32 addr, bool temp=false) { bool was_one = b[addr] != 0; - + if (!was_one) { b[addr] = temp ? 2 : 1; @@ -49,8 +49,7 @@ public: void Clear() { - for (int i = 0; i < 65536; i++) - b[i] = 0; + memset(b, 0, sizeof(b)); } void DeleteByAddress(u32 addr) diff --git a/Source/Core/Core/Src/DSP/DSPCodeUtil.cpp b/Source/Core/Core/Src/DSP/DSPCodeUtil.cpp index 73e2c1f8b4..afaaa7d22e 100644 --- a/Source/Core/Core/Src/DSP/DSPCodeUtil.cpp +++ b/Source/Core/Core/Src/DSP/DSPCodeUtil.cpp @@ -54,7 +54,7 @@ bool Disassemble(const std::vector &code, bool line_numbers, std::string &t } bool Compare(const std::vector &code1, const std::vector &code2) -{ +{ if (code1.size() != code2.size()) printf("Size difference! 1=%i 2=%i\n", (int)code1.size(), (int)code2.size()); u32 count_equal = 0; @@ -94,7 +94,7 @@ bool Compare(const std::vector &code1, const std::vector &code2) return code1.size() == code2.size() && code1.size() == count_equal; } -void GenRandomCode(u32 size, std::vector &code) +void GenRandomCode(u32 size, std::vector &code) { code.resize(size); for (u32 i = 0; i < size; i++) @@ -149,7 +149,7 @@ void CodesToHeader(const std::vector *codes, const std::vector reserveSize += (u32)codes_padded.at(i).size(); } - + header.clear(); header.reserve(reserveSize * 4); sprintf(buffer, "#define NUM_UCODES %u\n\n", numCodes); @@ -172,7 +172,7 @@ void CodesToHeader(const std::vector *codes, const std::vector continue; header.append("\t{\n\t\t"); - for (u32 j = 0; j < codes_padded.at(i).size(); j++) + for (u32 j = 0; j < codes_padded.at(i).size(); j++) { if (j && ((j & 15) == 0)) header.append("\n\t\t"); @@ -206,7 +206,7 @@ void BinaryStringBEToCode(const std::string &str, std::vector &code) bool LoadBinary(const char *filename, std::vector &code) { std::string buffer; - if (!File::ReadFileToString(false, filename, buffer)) + if (!File::ReadFileToString(filename, buffer)) return false; BinaryStringBEToCode(buffer, code); @@ -217,7 +217,7 @@ bool SaveBinary(const std::vector &code, const char *filename) { std::string buffer; CodeToBinaryStringBE(code, buffer); - if (!File::WriteStringToFile(false, buffer, filename)) + if (!File::WriteStringToFile(buffer, filename)) return false; return true; } diff --git a/Source/Core/Core/Src/DSP/DSPCore.cpp b/Source/Core/Core/Src/DSP/DSPCore.cpp index 64206b3ee0..ff05dcb3fa 100644 --- a/Source/Core/Core/Src/DSP/DSPCore.cpp +++ b/Source/Core/Core/Src/DSP/DSPCore.cpp @@ -52,7 +52,7 @@ static bool LoadRom(const char *fname, int size_in_words, u16 *rom) { pFile.ReadArray(rom, size_in_words); pFile.Close(); - + // Byteswap the rom. for (int i = 0; i < size_in_words; i++) rom[i] = Common::swap16(rom[i]); @@ -113,13 +113,17 @@ static bool VerifyRoms(const char *irom_filename, const char *coef_filename) } if (rom_idx == 1) - PanicAlertT("You are using an old free DSP ROM made by the Dolphin Team.\n" - "Only games using the Zelda UCode will work correctly.\n"); + { + DSPHost_OSD_AddMessage("You are using an old free DSP ROM made by the Dolphin Team.", 6000); + DSPHost_OSD_AddMessage("Only games using the Zelda UCode will work correctly.", 6000); + } if (rom_idx == 2) - PanicAlertT("You are using a free DSP ROM made by the Dolphin Team.\n" - "All Wii games will work correctly, and most GC games should " - "also work fine, but the GBA/IPL/CARD UCodes will not work.\n"); + { + DSPHost_OSD_AddMessage("You are using a free DSP ROM made by the Dolphin Team.", 8000); + DSPHost_OSD_AddMessage("All Wii games will work correctly, and most GC games should ", 8000); + DSPHost_OSD_AddMessage("also work fine, but the GBA/IPL/CARD UCodes will not work.\n", 8000); + } return true; } @@ -139,7 +143,7 @@ bool DSPCore_Init(const char *irom_filename, const char *coef_filename, cyclesLeft = 0; init_hax = false; dspjit = NULL; - + g_dsp.irom = (u16*)AllocateMemoryPages(DSP_IROM_BYTE_SIZE); g_dsp.iram = (u16*)AllocateMemoryPages(DSP_IRAM_BYTE_SIZE); g_dsp.dram = (u16*)AllocateMemoryPages(DSP_DRAM_BYTE_SIZE); @@ -198,7 +202,7 @@ bool DSPCore_Init(const char *irom_filename, const char *coef_filename, WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); // Initialize JIT, if necessary - if(bUsingJIT) + if(bUsingJIT) dspjit = new DSPEmitter(); core_state = DSPCORE_RUNNING; @@ -250,7 +254,7 @@ void DSPCore_CheckExternalInterrupt() // Signal the SPU about new mail DSPCore_SetException(EXP_INT); - + g_dsp.cr &= ~CR_EXTERNAL_INT; } diff --git a/Source/Core/Core/Src/DSP/DSPCore.h b/Source/Core/Core/Src/DSP/DSPCore.h index de5b309e13..7b6805bd52 100644 --- a/Source/Core/Core/Src/DSP/DSPCore.h +++ b/Source/Core/Core/Src/DSP/DSPCore.h @@ -222,7 +222,7 @@ struct SDSP #if PROFILE u16 err_pc; #endif - + // This is NOT the same cr as r.cr. // This register is shared with the main emulation, see DSP.cpp // The engine has control over 0x0C07 of this reg. diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.cpp b/Source/Core/Core/Src/DSP/DSPEmitter.cpp index 704a170bfc..d0d842b7aa 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.cpp +++ b/Source/Core/Core/Src/DSP/DSPEmitter.cpp @@ -10,9 +10,6 @@ #include "DSPHost.h" #include "DSPInterpreter.h" #include "DSPAnalyzer.h" -#include "Jit/DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" #define MAX_BLOCK_SIZE 250 #define DSP_IDLE_SKIP_CYCLES 0x1000 @@ -28,7 +25,7 @@ DSPEmitter::DSPEmitter() : gpr(*this), storeIndex(-1), storeIndex2(-1) blocks = new DSPCompiledCode[MAX_BLOCKS]; blockLinks = new Block[MAX_BLOCKS]; blockSize = new u16[MAX_BLOCKS]; - + compileSR = 0; compileSR |= SR_INT_ENABLE; compileSR |= SR_EXT_INT_ENABLE; @@ -45,7 +42,7 @@ DSPEmitter::DSPEmitter() : gpr(*this), storeIndex(-1), storeIndex2(-1) } } -DSPEmitter::~DSPEmitter() +DSPEmitter::~DSPEmitter() { delete[] blocks; delete[] blockLinks; @@ -65,7 +62,7 @@ void DSPEmitter::ClearIRAM() g_dsp.reset_dspjit_codespace = true; } -void DSPEmitter::ClearIRAMandDSPJITCodespaceReset() +void DSPEmitter::ClearIRAMandDSPJITCodespaceReset() { ClearCodeSpace(); CompileDispatcher(); @@ -104,9 +101,9 @@ void DSPEmitter::checkExceptions(u32 retval) bool DSPEmitter::FlagsNeeded() { - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || - (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) - return true; + if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || + (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + return true; else return false; } @@ -171,7 +168,7 @@ void DSPEmitter::EmitInstruction(UDSPInstruction inst) } } } - + // Main instruction if (!opTable[inst]->jitFunc) { @@ -342,7 +339,7 @@ void DSPEmitter::Compile(u16 start_addr) if (!unresolvedJumps[i].empty()) { // Check if there were any blocks waiting for this block to be linkable - unsigned int size = unresolvedJumps[i].size(); + size_t size = unresolvedJumps[i].size(); unresolvedJumps[i].remove(start_addr); if (unresolvedJumps[i].size() < size) { @@ -355,7 +352,7 @@ void DSPEmitter::Compile(u16 start_addr) } } - if (blockSize[start_addr] == 0) + if (blockSize[start_addr] == 0) { // just a safeguard, should never happen anymore. // if it does we might get stuck over in RunForCycles. diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.h b/Source/Core/Core/Src/DSP/DSPEmitter.h index acf0ab0fd2..f44dcc6774 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.h +++ b/Source/Core/Core/Src/DSP/DSPEmitter.h @@ -8,6 +8,7 @@ #include #include "DSPCommon.h" +#include "x64ABI.h" #include "x64Emitter.h" #include "Jit/DSPJitRegCache.h" @@ -263,7 +264,7 @@ private: // The index of the last stored ext value (compile time). int storeIndex; int storeIndex2; - + // Counts down. // int cycles; diff --git a/Source/Core/Core/Src/DSP/DSPHWInterface.cpp b/Source/Core/Core/Src/DSP/DSPHWInterface.cpp index 56e998d3c0..92d9c5d67a 100644 --- a/Source/Core/Core/Src/DSP/DSPHWInterface.cpp +++ b/Source/Core/Core/Src/DSP/DSPHWInterface.cpp @@ -120,7 +120,7 @@ void gdsp_ifx_write(u32 addr, u32 val) case DSP_DIRQ: if (val & 0x1) DSPHost_InterruptRequest(); - else + else INFO_LOG(DSPLLE, "Unknown Interrupt Request pc=%04x (%04x)", g_dsp.pc, val); break; @@ -156,7 +156,7 @@ void gdsp_ifx_write(u32 addr, u32 val) case DSP_GAIN: if (val) { - INFO_LOG(DSPLLE,"Gain Written: 0x%04x", val); + INFO_LOG(DSPLLE,"Gain Written: 0x%04x", val); } case DSP_DSPA: case DSP_DSMAH: @@ -241,7 +241,7 @@ static void gdsp_idma_in(u16 dsp_addr, u32 addr, u32 size) u8* dst = ((u8*)g_dsp.iram); for (u32 i = 0; i < size; i += 2) - { + { *(u16*)&dst[dsp_addr + i] = Common::swap16(*(const u16*)&g_dsp.cpu_ram[(addr + i) & 0x0fffffff]); } WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); diff --git a/Source/Core/Core/Src/DSP/DSPHost.h b/Source/Core/Core/Src/DSP/DSPHost.h index cef329a7ec..18ba5ec447 100644 --- a/Source/Core/Core/Src/DSP/DSPHost.h +++ b/Source/Core/Core/Src/DSP/DSPHost.h @@ -12,6 +12,7 @@ u8 DSPHost_ReadHostMemory(u32 addr); void DSPHost_WriteHostMemory(u8 value, u32 addr); +void DSPHost_OSD_AddMessage(const std::string& str, u32 ms); bool DSPHost_OnThread(); bool DSPHost_Wii(); void DSPHost_InterruptRequest(); diff --git a/Source/Core/Core/Src/DSP/DSPIntCCUtil.cpp b/Source/Core/Core/Src/DSP/DSPIntCCUtil.cpp index af75aedcc3..d2631d2685 100644 --- a/Source/Core/Core/Src/DSP/DSPIntCCUtil.cpp +++ b/Source/Core/Core/Src/DSP/DSPIntCCUtil.cpp @@ -27,7 +27,7 @@ void Update_SR_Register64(s64 _Value, bool carry, bool overflow) if (overflow) { g_dsp.r.sr |= SR_OVERFLOW; - g_dsp.r.sr |= SR_OVERFLOW_STICKY; + g_dsp.r.sr |= SR_OVERFLOW_STICKY; } // 0x04 @@ -79,14 +79,14 @@ void Update_SR_Register16(s16 _Value, bool carry, bool overflow, bool overS32) g_dsp.r.sr |= SR_ARITH_ZERO; } - // 0x08 + // 0x08 if (_Value < 0) { g_dsp.r.sr |= SR_SIGN; } // 0x10 - if (overS32) + if (overS32) { g_dsp.r.sr |= SR_OVER_S32; } @@ -100,7 +100,7 @@ void Update_SR_Register16(s16 _Value, bool carry, bool overflow, bool overS32) void Update_SR_LZ(bool value) { - if (value == true) + if (value == true) g_dsp.r.sr |= SR_LOGIC_ZERO; else g_dsp.r.sr &= ~SR_LOGIC_ZERO; @@ -156,11 +156,11 @@ bool CheckCondition(u8 _Condition) return isLess() || isZero(); case 0x4: // NZ - Not Zero return !isZero(); - case 0x5: // Z - Zero + case 0x5: // Z - Zero return isZero(); case 0x6: // NC - Not carry return !isCarry(); - case 0x7: // C - Carry + case 0x7: // C - Carry return isCarry(); case 0x8: // ? - Not over s32 return !isOverS32(); diff --git a/Source/Core/Core/Src/DSP/DSPIntCCUtil.h b/Source/Core/Core/Src/DSP/DSPIntCCUtil.h index e98c0d905d..0f747cf2f0 100644 --- a/Source/Core/Core/Src/DSP/DSPIntCCUtil.h +++ b/Source/Core/Core/Src/DSP/DSPIntCCUtil.h @@ -26,7 +26,7 @@ inline bool isCarry(u64 val, u64 result) { } inline bool isCarry2(u64 val, u64 result) { - return (val>=result); + return (val>=result); } inline bool isOverflow(s64 val1, s64 val2, s64 res) { diff --git a/Source/Core/Core/Src/DSP/DSPIntExtOps.cpp b/Source/Core/Core/Src/DSP/DSPIntExtOps.cpp index bc448233ba..a628b9b4d1 100644 --- a/Source/Core/Core/Src/DSP/DSPIntExtOps.cpp +++ b/Source/Core/Core/Src/DSP/DSPIntExtOps.cpp @@ -7,7 +7,7 @@ #include "DSPIntExtOps.h" //not needed for game ucodes (it slows down interpreter/dspjit32 + easier to compare int VS dspjit64 without it) -//#define PRECISE_BACKLOG +//#define PRECISE_BACKLOG // Extended opcodes do not exist on their own. These opcodes can only be // attached to opcodes that allow extending (8 (or 7) lower bits of opcode not used by @@ -29,7 +29,7 @@ inline static void writeToBackLog(int i, int idx, u16 value) namespace DSPInterpreter { -namespace Ext +namespace Ext { inline bool IsSameMemArea(u16 a, u16 b) @@ -63,7 +63,7 @@ void ir(const UDSPInstruction opc) void nr(const UDSPInstruction opc) { u8 reg = opc & 0x3; - + writeToBackLog(0, reg, dsp_increase_addr_reg(reg, (s16)g_dsp.r.ix[reg])); } @@ -87,7 +87,7 @@ void mv(const UDSPInstruction opc) break; } } - + // S @$arD, $acS.S // xxxx xxxx 001s s0dd // Store value of $acS.S in the memory pointed by register $arD. @@ -136,14 +136,14 @@ void sn(const UDSPInstruction opc) // L $axD.D, @$arS // xxxx xxxx 01dd d0ss -// Load $axD.D/$acD.D with value from memory pointed by register $arS. +// Load $axD.D/$acD.D with value from memory pointed by register $arS. // Post increment register $arS. void l(const UDSPInstruction opc) { u8 sreg = opc & 0x3; u8 dreg = ((opc >> 3) & 0x7) + DSP_REG_AXL0; - - if ((dreg >= DSP_REG_ACM0) && (g_dsp.r.sr & SR_40_MODE_BIT)) + + if ((dreg >= DSP_REG_ACM0) && (g_dsp.r.sr & SR_40_MODE_BIT)) { u16 val = dsp_dmem_read(g_dsp.r.ar[sreg]); writeToBackLog(0, dreg - DSP_REG_ACM0 + DSP_REG_ACH0, (val & 0x8000) ? 0xFFFF : 0x0000); @@ -160,14 +160,14 @@ void l(const UDSPInstruction opc) // LN $axD.D, @$arS // xxxx xxxx 01dd d0ss -// Load $axD.D/$acD.D with value from memory pointed by register $arS. +// Load $axD.D/$acD.D with value from memory pointed by register $arS. // Add indexing register $ixS to register $arS. void ln(const UDSPInstruction opc) { u8 sreg = opc & 0x3; u8 dreg = ((opc >> 3) & 0x7) + DSP_REG_AXL0; - if ((dreg >= DSP_REG_ACM0) && (g_dsp.r.sr & SR_40_MODE_BIT)) + if ((dreg >= DSP_REG_ACM0) && (g_dsp.r.sr & SR_40_MODE_BIT)) { u16 val = dsp_dmem_read(g_dsp.r.ar[sreg]); writeToBackLog(0, dreg - DSP_REG_ACM0 + DSP_REG_ACH0, (val & 0x8000) ? 0xFFFF : 0x0000); @@ -196,7 +196,7 @@ void ls(const UDSPInstruction opc) writeToBackLog(0, dreg, dsp_dmem_read(g_dsp.r.ar[0])); writeToBackLog(1, DSP_REG_AR3, dsp_increment_addr_reg(DSP_REG_AR3)); - writeToBackLog(2, DSP_REG_AR0, dsp_increment_addr_reg(DSP_REG_AR0)); + writeToBackLog(2, DSP_REG_AR0, dsp_increment_addr_reg(DSP_REG_AR0)); } @@ -269,7 +269,7 @@ void sl(const UDSPInstruction opc) writeToBackLog(0, dreg, dsp_dmem_read(g_dsp.r.ar[3])); writeToBackLog(1, DSP_REG_AR3, dsp_increment_addr_reg(DSP_REG_AR3)); - writeToBackLog(2, DSP_REG_AR0, dsp_increment_addr_reg(DSP_REG_AR0)); + writeToBackLog(2, DSP_REG_AR0, dsp_increment_addr_reg(DSP_REG_AR0)); } // SLN $acS.m, $axD.D @@ -329,7 +329,7 @@ void slnm(const UDSPInstruction opc) // LD $ax0.d, $ax1.r, @$arS // xxxx xxxx 11dr 00ss // example for "nx'ld $AX0.L, $AX1.L, @$AR3" -// Loads the word pointed by AR0 to AX0.H, then loads the word pointed by AR3 to AX0.L. +// Loads the word pointed by AR0 to AX0.H, then loads the word pointed by AR3 to AX0.L. // Increments AR0 and AR3. // If AR0 and AR3 point into the same memory page (upper 6 bits of addr are the same -> games are not doing that!) // then the value pointed by AR0 is loaded to BOTH AX0.H and AX0.L. @@ -545,18 +545,18 @@ void zeroWriteBackLog() #endif } -void zeroWriteBackLogPreserveAcc(u8 acc) +void zeroWriteBackLogPreserveAcc(u8 acc) { #ifdef PRECISE_BACKLOG for (int i = 0; writeBackLogIdx[i] != -1; i++) { // acc0 - if ((acc == 0) && + if ((acc == 0) && ((writeBackLogIdx[i] == DSP_REG_ACL0) || (writeBackLogIdx[i] == DSP_REG_ACM0) || (writeBackLogIdx[i] == DSP_REG_ACH0))) continue; - + // acc1 - if ((acc == 1) && + if ((acc == 1) && ((writeBackLogIdx[i] == DSP_REG_ACL1) || (writeBackLogIdx[i] == DSP_REG_ACM1) || (writeBackLogIdx[i] == DSP_REG_ACH1))) continue; diff --git a/Source/Core/Core/Src/DSP/DSPIntExtOps.h b/Source/Core/Core/Src/DSP/DSPIntExtOps.h index fa6d22edba..d4f3a8dd01 100644 --- a/Source/Core/Core/Src/DSP/DSPIntExtOps.h +++ b/Source/Core/Core/Src/DSP/DSPIntExtOps.h @@ -30,12 +30,12 @@ // Extended opcode support. // Many opcode have the lower 0xFF (some only 0x7f) free - there, an opcode extension -// can be stored. +// can be stored. namespace DSPInterpreter { namespace Ext -{ +{ void l(const UDSPInstruction opc); void ln(const UDSPInstruction opc); void ls(const UDSPInstruction opc); @@ -61,7 +61,7 @@ void dr(const UDSPInstruction opc); void ir(const UDSPInstruction opc); void nr(const UDSPInstruction opc); void nop(const UDSPInstruction opc); - + } // end namespace Ext } // end namespace DSPinterpeter diff --git a/Source/Core/Core/Src/DSP/DSPIntUtil.h b/Source/Core/Core/Src/DSP/DSPIntUtil.h index 7299d7e8c9..0e48ee77e4 100644 --- a/Source/Core/Core/Src/DSP/DSPIntUtil.h +++ b/Source/Core/Core/Src/DSP/DSPIntUtil.h @@ -57,7 +57,7 @@ static inline u16 dsp_increase_addr_reg(u16 reg, s16 _ix) u32 ar = g_dsp.r.ar[reg]; u32 wr = g_dsp.r.wr[reg]; s32 ix = _ix; - + u32 mx = (wr | 1) << 1; u32 nar = ar + ix; u32 dar = (nar ^ ar ^ ix) & mx; @@ -75,7 +75,7 @@ static inline u16 dsp_increase_addr_reg(u16 reg, s16 _ix) return nar; } -static inline u16 dsp_decrease_addr_reg(u16 reg, s16 _ix) +static inline u16 dsp_decrease_addr_reg(u16 reg, s16 _ix) { u32 ar = g_dsp.r.ar[reg]; u32 wr = g_dsp.r.wr[reg]; @@ -98,23 +98,23 @@ static inline u16 dsp_decrease_addr_reg(u16 reg, s16 _ix) return nar; } -static inline u16 dsp_increment_addr_reg(u16 reg) +static inline u16 dsp_increment_addr_reg(u16 reg) { u32 ar = g_dsp.r.ar[reg]; u32 wr = g_dsp.r.wr[reg]; u32 nar = ar + 1; - + if ((nar ^ ar) > ((wr | 1) << 1)) nar -= wr + 1; return nar; } -static inline u16 dsp_decrement_addr_reg(u16 reg) +static inline u16 dsp_decrement_addr_reg(u16 reg) { u32 ar = g_dsp.r.ar[reg]; u32 wr = g_dsp.r.wr[reg]; - + u32 nar = ar + wr; if (((nar ^ ar) & ((wr | 1) << 1)) > wr) @@ -244,9 +244,9 @@ static inline void dsp_op_write_reg(int _reg, u16 val) } } -static inline void dsp_conditional_extend_accum(int reg) +static inline void dsp_conditional_extend_accum(int reg) { - switch (reg) + switch (reg) { case DSP_REG_ACM0: case DSP_REG_ACM1: @@ -344,12 +344,12 @@ inline u16 dsp_op_read_reg_and_saturate(u8 _reg) if (g_dsp.r.sr & SR_40_MODE_BIT) { s64 acc = dsp_get_long_acc(_reg); - - if (acc != (s32)acc) + + if (acc != (s32)acc) { if (acc > 0) return 0x7fff; - else + else return 0x8000; } else diff --git a/Source/Core/Core/Src/DSP/DSPInterpreter.cpp b/Source/Core/Core/Src/DSP/DSPInterpreter.cpp index 4a841b41e5..19edffd785 100644 --- a/Source/Core/Core/Src/DSP/DSPInterpreter.cpp +++ b/Source/Core/Core/Src/DSP/DSPInterpreter.cpp @@ -24,7 +24,6 @@ ====================================================================*/ #include "DSPTables.h" -#include "DSPHost.h" #include "DSPCore.h" #include "DSPAnalyzer.h" @@ -37,7 +36,7 @@ volatile u32 gdsp_running; // NOTE: These have nothing to do with g_dsp.r.cr ! -void WriteCR(u16 val) +void WriteCR(u16 val) { // reset if (val & 1) @@ -97,7 +96,7 @@ void Step() u16 opc = dsp_fetch_code(); ExecuteInstruction(UDSPInstruction(opc)); - + if (DSPAnalyzer::code_flags[g_dsp.pc - 1] & DSPAnalyzer::CODE_LOOP_END) HandleLoop(); } @@ -108,7 +107,7 @@ int RunCyclesThread(int cycles) while (true) { if (g_dsp.cr & CR_HALT) - return 0; + return 0; if (g_dsp.external_interrupt_waiting) { @@ -130,7 +129,7 @@ int RunCyclesDebug(int cycles) for (int i = 0; i < 8; i++) { if (g_dsp.cr & CR_HALT) - return 0; + return 0; if (dsp_breakpoints.IsAddressBreakPoint(g_dsp.pc)) { DSPCore_SetState(DSPCORE_STEPPING); @@ -164,7 +163,7 @@ int RunCyclesDebug(int cycles) return 0; } - // Now, lets run some more without idle skipping. + // Now, lets run some more without idle skipping. for (int i = 0; i < 200; i++) { if (dsp_breakpoints.IsAddressBreakPoint(g_dsp.pc)) @@ -190,7 +189,7 @@ int RunCycles(int cycles) for (int i = 0; i < 8; i++) { if (g_dsp.cr & CR_HALT) - return 0; + return 0; Step(); cycles--; if (cycles < 0) @@ -214,8 +213,8 @@ int RunCycles(int cycles) return 0; } - // Now, lets run some more without idle skipping. - for (int i = 0; i < 200; i++) + // Now, lets run some more without idle skipping. + for (int i = 0; i < 200; i++) { Step(); cycles--; diff --git a/Source/Core/Core/Src/DSP/DSPInterpreter.h b/Source/Core/Core/Src/DSP/DSPInterpreter.h index c2e144a682..7252cd4760 100644 --- a/Source/Core/Core/Src/DSP/DSPInterpreter.h +++ b/Source/Core/Core/Src/DSP/DSPInterpreter.h @@ -106,7 +106,7 @@ void asr16(const UDSPInstruction opc); void lsl(const UDSPInstruction opc); void lsr(const UDSPInstruction opc); void asl(const UDSPInstruction opc); -void asr(const UDSPInstruction opc); +void asr(const UDSPInstruction opc); void lsrn(const UDSPInstruction opc); void asrn(const UDSPInstruction opc); void dar(const UDSPInstruction opc); diff --git a/Source/Core/Core/Src/DSP/DSPMemoryMap.cpp b/Source/Core/Core/Src/DSP/DSPMemoryMap.cpp index 7a56c2618f..542823257a 100644 --- a/Source/Core/Core/Src/DSP/DSPMemoryMap.cpp +++ b/Source/Core/Core/Src/DSP/DSPMemoryMap.cpp @@ -50,14 +50,14 @@ u16 dsp_dmem_read(u16 addr) { case 0x0: // 0xxx DRAM return g_dsp.dram[addr & DSP_DRAM_MASK]; - + case 0x1: // 1xxx COEF DEBUG_LOG(DSPLLE, "%04x : Coefficient Read @ %04x", g_dsp.pc, addr); return g_dsp.coef[addr & DSP_COEF_MASK]; case 0xf: // Fxxx HW regs return gdsp_ifx_read(addr); - + default: // Unmapped/non-existing memory ERROR_LOG(DSPLLE, "%04x DSP ERROR: Read from UNKNOWN (%04x) memory", g_dsp.pc, addr); return 0; diff --git a/Source/Core/Core/Src/DSP/DSPTables.cpp b/Source/Core/Core/Src/DSP/DSPTables.cpp index bc2cbf1488..20d27d468e 100644 --- a/Source/Core/Core/Src/DSP/DSPTables.cpp +++ b/Source/Core/Core/Src/DSP/DSPTables.cpp @@ -19,7 +19,7 @@ void nop(const UDSPInstruction opc) ERROR_LOG(DSPLLE, "LLE: Unrecognized opcode 0x%04x", opc); } } - + const DSPOPCTemplate opcodes[] = { {"NOP", 0x0000, 0xfffc, nop, &DSPEmitter::nop, 1, 0, {}, false, false, false, false, false}, @@ -47,7 +47,7 @@ const DSPOPCTemplate opcodes[] = {"RETLZ", 0x02dd, 0xffff, DSPInterpreter::ret, &DSPEmitter::ret, 1, 0, {}, false, true, false, true, false}, {"RETO", 0x02de, 0xffff, DSPInterpreter::ret, &DSPEmitter::ret, 1, 0, {}, false, true, false, true, false}, {"RET", 0x02df, 0xffff, DSPInterpreter::ret, &DSPEmitter::ret, 1, 0, {}, false, true, true, false, false}, - + {"RTI", 0x02ff, 0xffff, DSPInterpreter::rti, &DSPEmitter::rti, 1, 0, {}, false, true, true, false, false}, {"CALLGE", 0x02b0, 0xffff, DSPInterpreter::call, &DSPEmitter::call, 2, 1, {{P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true, false}, @@ -142,7 +142,7 @@ const DSPOPCTemplate opcodes[] = {"LSR", 0x1440, 0xfec0, DSPInterpreter::lsr, &DSPEmitter::lsr, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false, false, false, false, true}, {"ASL", 0x1480, 0xfec0, DSPInterpreter::asl, &DSPEmitter::asl, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false, false, false, false, true}, {"ASR", 0x14c0, 0xfec0, DSPInterpreter::asr, &DSPEmitter::asr, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false, false, false, false, true}, - + {"LSRN", 0x02ca, 0xffff, DSPInterpreter::lsrn, &DSPEmitter::lsrn, 1, 0, {}, false, false, false, false, true}, // discovered by ector! {"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, &DSPEmitter::asrn, 1, 0, {}, false, false, false, false, true}, // discovered by ector! @@ -288,7 +288,7 @@ const DSPOPCTemplate opcodes[] = {"MOVPZ", 0xfe00, 0xfe00, DSPInterpreter::movpz, &DSPEmitter::movpz, 1, 1, {{P_ACC, 1, 0, 8, 0x0100}}, true, false, false, false, true}, }; -const DSPOPCTemplate cw = +const DSPOPCTemplate cw = {"CW", 0x0000, 0x0000, nop, NULL, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}}, false, false, false, false, false}; // extended opcodes @@ -489,10 +489,10 @@ const char* pdname(u16 val) { static char tmpstr[12]; // nasty - for (int i = 0; i < (int)(sizeof(pdlabels) / sizeof(pdlabel_t)); i++) + for (auto& pdlabel : pdlabels) { - if (pdlabels[i].addr == val) - return pdlabels[i].name; + if (pdlabel.addr == val) + return pdlabel.name; } sprintf(tmpstr, "0x%04x", val); @@ -521,23 +521,22 @@ void InitInstructionTable() { // ext op table for (int i = 0; i < EXT_OPTABLE_SIZE; i++) + { extOpTable[i] = &cw; - for (int i = 0; i < EXT_OPTABLE_SIZE; i++) - { - for (int j = 0; j < opcodes_ext_size; j++) + for (auto& ext : opcodes_ext) { - u16 mask = opcodes_ext[j].opcode_mask; - if ((mask & i) == opcodes_ext[j].opcode) + u16 mask = ext.opcode_mask; + if ((mask & i) == ext.opcode) { if (extOpTable[i] == &cw) - extOpTable[i] = &opcodes_ext[j]; + extOpTable[i] = &ext; else { //if the entry already in the table //is a strict subset, allow it - if ((extOpTable[i]->opcode_mask | opcodes_ext[j].opcode_mask) != extOpTable[i]->opcode_mask) - ERROR_LOG(DSPLLE, "opcode ext table place %d already in use by %s when inserting %s", i, extOpTable[i]->name, opcodes_ext[j].name); + if ((extOpTable[i]->opcode_mask | ext.opcode_mask) != extOpTable[i]->opcode_mask) + ERROR_LOG(DSPLLE, "opcode ext table place %d already in use by %s when inserting %s", i, extOpTable[i]->name, ext.name); } } } @@ -546,18 +545,18 @@ void InitInstructionTable() // op table for (int i = 0; i < OPTABLE_SIZE; i++) opTable[i] = &cw; - + for (int i = 0; i < OPTABLE_SIZE; i++) { - for (int j = 0; j < opcodes_size; j++) + for (auto& opcode : opcodes) { - u16 mask = opcodes[j].opcode_mask; - if ((mask & i) == opcodes[j].opcode) + u16 mask = opcode.opcode_mask; + if ((mask & i) == opcode.opcode) { if (opTable[i] == &cw) - opTable[i] = &opcodes[j]; + opTable[i] = &opcode; else - ERROR_LOG(DSPLLE, "opcode table place %d already in use for %s", i, opcodes[j].name); + ERROR_LOG(DSPLLE, "opcode table place %d already in use for %s", i, opcode.name); } } } diff --git a/Source/Core/Core/Src/DSP/DSPTables.h b/Source/Core/Core/Src/DSP/DSPTables.h index fdad92bc2b..140b4b427b 100644 --- a/Source/Core/Core/Src/DSP/DSPTables.h +++ b/Source/Core/Core/Src/DSP/DSPTables.h @@ -29,7 +29,7 @@ enum partype_t P_ADDR_D = 0x0006, P_REG = 0x8000, P_REG04 = P_REG | 0x0400, // IX - P_REG08 = P_REG | 0x0800, + P_REG08 = P_REG | 0x0800, P_REG18 = P_REG | 0x1800, P_REGM18 = P_REG | 0x1810, // used in multiply instructions P_REG19 = P_REG | 0x1900, diff --git a/Source/Core/Core/Src/DSP/DspIntArithmetic.cpp b/Source/Core/Core/Src/DSP/DspIntArithmetic.cpp index 4d2b5be3ac..7de0327491 100644 --- a/Source/Core/Core/Src/DSP/DspIntArithmetic.cpp +++ b/Source/Core/Core/Src/DSP/DspIntArithmetic.cpp @@ -119,7 +119,7 @@ void cmp(const UDSPInstruction opc) s64 acc0 = dsp_get_long_acc(0); s64 acc1 = dsp_get_long_acc(1); s64 res = dsp_convert_long_acc(acc0 - acc1); - + Update_SR_Register64(res, isCarry2(acc0, res), isOverflow(acc0, -acc1, res)); // CF -> influence on ABS/0xa100 zeroWriteBackLog(); } @@ -139,7 +139,7 @@ void cmpar(const UDSPInstruction opc) s64 rr = (s16)g_dsp.r.ax[rreg-DSP_REG_AXH0].h; rr <<= 16; s64 res = dsp_convert_long_acc(sr - rr); - + Update_SR_Register64(res, isCarry2(sr, res), isOverflow(sr, -rr, res)); zeroWriteBackLog(); } @@ -147,7 +147,7 @@ void cmpar(const UDSPInstruction opc) // CMPI $amD, #I // 0000 001r 1000 0000 // iiii iiii iiii iiii -// Compares mid accumulator $acD.hm ($amD) with sign extended immediate value I. +// Compares mid accumulator $acD.hm ($amD) with sign extended immediate value I. // Although flags are being set regarding whole accumulator register. // // flags out: x-xx xxxx @@ -175,7 +175,7 @@ void cmpis(const UDSPInstruction opc) s64 acc = dsp_get_long_acc(areg); s64 val = (s8)opc; - val <<= 16; + val <<= 16; s64 res = dsp_convert_long_acc(acc - val); Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -val, res)); @@ -477,7 +477,7 @@ void addaxl(const UDSPInstruction opc) Update_SR_Register64((s64)res, isCarry(acc, res), isOverflow((s64)acc, (s64)acx, (s64)res)); } -// ADDI $amR, #I +// ADDI $amR, #I // 0000 001r 0000 0000 // iiii iiii iiii iiii // Adds immediate (16-bit sign extended) to mid accumulator $acD.hm. @@ -530,7 +530,7 @@ void incm(const UDSPInstruction opc) s64 res = acc + sub; zeroWriteBackLog(); - + dsp_set_long_acc(dreg, res); res = dsp_get_long_acc(dreg); Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, sub, res)); @@ -546,7 +546,7 @@ void inc(const UDSPInstruction opc) u8 dreg = (opc >> 8) & 0x1; s64 acc = dsp_get_long_acc(dreg); - s64 res = acc + 1; + s64 res = acc + 1; zeroWriteBackLog(); @@ -615,7 +615,7 @@ void subax(const UDSPInstruction opc) // SUB $acD, $ac(1-D) // 0101 110d xxxx xxxx -// Subtracts accumulator $ac(1-D) from accumulator register $acD. +// Subtracts accumulator $ac(1-D) from accumulator register $acD. // // flags out: x-xx xxxx void sub(const UDSPInstruction opc) @@ -667,9 +667,9 @@ void decm(const UDSPInstruction opc) s64 res = acc - sub; zeroWriteBackLog(); - + dsp_set_long_acc(dreg, res); - res = dsp_get_long_acc(dreg); + res = dsp_get_long_acc(dreg); Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -sub, res)); } @@ -702,7 +702,7 @@ void dec(const UDSPInstruction opc) void neg(const UDSPInstruction opc) { u8 dreg = (opc >> 8) & 0x1; - + s64 acc = dsp_get_long_acc(dreg); acc = 0 - acc; @@ -713,7 +713,7 @@ void neg(const UDSPInstruction opc) } // ABS $acD -// 1010 d001 xxxx xxxx +// 1010 d001 xxxx xxxx // absolute value of $acD // // flags out: --xx xx00 @@ -725,7 +725,7 @@ void abs(const UDSPInstruction opc) if (acc < 0) acc = 0 - acc; - + zeroWriteBackLog(); dsp_set_long_acc(dreg, acc); @@ -770,7 +770,7 @@ void movr(const UDSPInstruction opc) // MOVAX $acD, $axS // 0110 10sd xxxx xxxx -// Moves secondary accumulator $axS to accumulator $axD. +// Moves secondary accumulator $axS to accumulator $axD. // // flags out: --xx xx00 void movax(const UDSPInstruction opc) @@ -833,7 +833,7 @@ void lsr16(const UDSPInstruction opc) u64 acc = dsp_get_long_acc(areg); acc &= 0x000000FFFFFFFFFFULL; // Lop off the extraneous sign extension our 64-bit fake accum causes - acc >>= 16; + acc >>= 16; zeroWriteBackLog(); @@ -864,10 +864,10 @@ void asr16(const UDSPInstruction opc) // Logically shifts left accumulator $acR by number specified by value I. // // flags out: --xx xx00 -void lsl(const UDSPInstruction opc) +void lsl(const UDSPInstruction opc) { u8 rreg = (opc >> 8) & 0x01; - u16 shift = opc & 0x3f; + u16 shift = opc & 0x3f; u64 acc = dsp_get_long_acc(rreg); acc <<= shift; @@ -895,7 +895,7 @@ void lsr(const UDSPInstruction opc) shift = 0x40 - (opc & 0x3f); acc >>= shift; - + dsp_set_long_acc(rreg, (s64)acc); Update_SR_Register64(dsp_get_long_acc(rreg)); } @@ -912,7 +912,7 @@ void asl(const UDSPInstruction opc) u64 acc = dsp_get_long_acc(rreg); acc <<= shift; - + dsp_set_long_acc(rreg, acc); Update_SR_Register64(dsp_get_long_acc(rreg)); } @@ -949,7 +949,7 @@ void asr(const UDSPInstruction opc) // flags out: --xx xx00 void lsrn(const UDSPInstruction opc) { - s16 shift; + s16 shift; u16 accm = (u16)dsp_get_acc_m(1); u64 acc = dsp_get_long_acc(0); acc &= 0x000000FFFFFFFFFFULL; diff --git a/Source/Core/Core/Src/DSP/DspIntBranch.cpp b/Source/Core/Core/Src/DSP/DspIntBranch.cpp index a4c861c814..ecd1314e10 100644 --- a/Source/Core/Core/Src/DSP/DspIntBranch.cpp +++ b/Source/Core/Core/Src/DSP/DspIntBranch.cpp @@ -35,8 +35,8 @@ void call(const UDSPInstruction opc) // Generic callr implementation // CALLRcc $R // 0001 0111 rrr1 cccc -// Call function if condition cc has been met. Push program counter of -// instruction following "call" to call stack $st0. Set program counter to +// Call function if condition cc has been met. Push program counter of +// instruction following "call" to call stack $st0. Set program counter to // register $R. void callr(const UDSPInstruction opc) { @@ -87,7 +87,7 @@ void jmprcc(const UDSPInstruction opc) { u8 reg = (opc >> 5) & 0x7; g_dsp.pc = dsp_op_read_reg(reg); - } + } } // Generic ret implementation @@ -116,7 +116,7 @@ void rti(const UDSPInstruction opc) } // HALT -// 0000 0000 0020 0001 +// 0000 0000 0020 0001 // Stops execution of DSP code. Sets bit DSP_CR_HALT in register DREG_CR. void halt(const UDSPInstruction opc) { @@ -133,7 +133,7 @@ void halt(const UDSPInstruction opc) // continues at next opcode. void HandleLoop() { - // Handle looping hardware. + // Handle looping hardware. const u16 rCallAddress = g_dsp.r.st[0]; const u16 rLoopAddress = g_dsp.r.st[2]; u16& rLoopCounter = g_dsp.r.st[3]; @@ -254,7 +254,7 @@ void bloopi(const UDSPInstruction opc) u16 cnt = opc & 0xff; u16 loop_pc = dsp_fetch_code(); - if (cnt) + if (cnt) { dsp_reg_store_stack(0, g_dsp.pc); dsp_reg_store_stack(2, loop_pc); diff --git a/Source/Core/Core/Src/DSP/DspIntLoadStore.cpp b/Source/Core/Core/Src/DSP/DspIntLoadStore.cpp index b1a8f1b868..0b72b21290 100644 --- a/Source/Core/Core/Src/DSP/DspIntLoadStore.cpp +++ b/Source/Core/Core/Src/DSP/DspIntLoadStore.cpp @@ -13,15 +13,15 @@ namespace DSPInterpreter { // SRS @M, $(0x18+S) // 0010 1sss mmmm mmmm -// Move value from register $(0x18+D) to data memory pointed by address -// CR[0-7] | M. That is, the upper 8 bits of the address are the -// bottom 8 bits from CR, and the lower 8 bits are from the 8-bit immediate. +// Move value from register $(0x18+D) to data memory pointed by address +// CR[0-7] | M. That is, the upper 8 bits of the address are the +// bottom 8 bits from CR, and the lower 8 bits are from the 8-bit immediate. // Note: pc+=2 in duddie's doc seems wrong void srs(const UDSPInstruction opc) { u8 reg = ((opc >> 8) & 0x7) + 0x18; u16 addr = (g_dsp.r.cr << 8) | (opc & 0xFF); - + if (reg >= DSP_REG_ACM0) dsp_dmem_write(addr, dsp_op_read_reg_and_saturate(reg-DSP_REG_ACM0)); else @@ -97,7 +97,7 @@ void lrr(const UDSPInstruction opc) // LRRD $D, @$S // 0001 1000 1ssd dddd // Move value from data memory pointed by addressing register $S toregister $D. -// Decrement register $S. +// Decrement register $S. void lrrd(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -112,7 +112,7 @@ void lrrd(const UDSPInstruction opc) // LRRI $D, @$S // 0001 1001 0ssd dddd // Move value from data memory pointed by addressing register $S to register $D. -// Increment register $S. +// Increment register $S. void lrri(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -127,7 +127,7 @@ void lrri(const UDSPInstruction opc) // LRRN $D, @$S // 0001 1001 1ssd dddd // Move value from data memory pointed by addressing register $S to register $D. -// Add indexing register $(0x4+S) to register $S. +// Add indexing register $(0x4+S) to register $S. void lrrn(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -141,8 +141,8 @@ void lrrn(const UDSPInstruction opc) // SRR @$D, $S // 0001 1010 0dds ssss -// Store value from source register $S to a memory location pointed by -// addressing register $D. +// Store value from source register $S to a memory location pointed by +// addressing register $D. void srr(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; @@ -157,7 +157,7 @@ void srr(const UDSPInstruction opc) // SRRD @$D, $S // 0001 1010 1dds ssss // Store value from source register $S to a memory location pointed by -// addressing register $D. Decrement register $D. +// addressing register $D. Decrement register $D. void srrd(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; @@ -174,7 +174,7 @@ void srrd(const UDSPInstruction opc) // SRRI @$D, $S // 0001 1011 0dds ssss // Store value from source register $S to a memory location pointed by -// addressing register $D. Increment register $D. +// addressing register $D. Increment register $D. void srri(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; diff --git a/Source/Core/Core/Src/DSP/DspIntMisc.cpp b/Source/Core/Core/Src/DSP/DspIntMisc.cpp index 93d04d15b0..aec554d7fb 100644 --- a/Source/Core/Core/Src/DSP/DspIntMisc.cpp +++ b/Source/Core/Core/Src/DSP/DspIntMisc.cpp @@ -24,14 +24,14 @@ void mrr(const UDSPInstruction opc) dsp_op_write_reg(dreg, dsp_op_read_reg_and_saturate(sreg-DSP_REG_ACM0)); else dsp_op_write_reg(dreg, dsp_op_read_reg(sreg)); - + dsp_conditional_extend_accum(dreg); } // LRI $D, #I // 0000 0000 100d dddd // iiii iiii iiii iiii -// Load immediate value I to register $D. +// Load immediate value I to register $D. // // DSPSpy discovery: This, and possibly other instructions that load a // register, has a different behaviour in S40 mode if loaded to AC0.M: The @@ -47,7 +47,7 @@ void lri(const UDSPInstruction opc) // LRIS $(0x18+D), #I // 0000 1ddd iiii iiii -// Load immediate value I (8-bit sign extended) to accumulator register. +// Load immediate value I (8-bit sign extended) to accumulator register. void lris(const UDSPInstruction opc) { u8 reg = ((opc >> 8) & 0x7) + DSP_REG_AXL0; @@ -86,7 +86,7 @@ void iar(const UDSPInstruction opc) g_dsp.r.ar[opc & 0x3] = dsp_increment_addr_reg(opc & 0x3); } -// SUBARN $arD +// SUBARN $arD // 0000 0000 0000 11dd // Subtract indexing register $ixD from an addressing register $arD. // used only in IPL-NTSC ucode @@ -129,7 +129,7 @@ void sbset(const UDSPInstruction opc) g_dsp.r.sr |= (1 << bit); } -// This is a bunch of flag setters, flipping bits in SR. +// This is a bunch of flag setters, flipping bits in SR. void srbith(const UDSPInstruction opc) { zeroWriteBackLog(); diff --git a/Source/Core/Core/Src/DSP/DspIntMultiplier.cpp b/Source/Core/Core/Src/DSP/DspIntMultiplier.cpp index 5a1b98e4b7..a1380879e8 100644 --- a/Source/Core/Core/Src/DSP/DspIntMultiplier.cpp +++ b/Source/Core/Core/Src/DSP/DspIntMultiplier.cpp @@ -32,7 +32,7 @@ inline s64 dsp_get_multiply_prod(u16 a, u16 b, u8 sign) return prod; } - + inline s64 dsp_multiply(u16 a, u16 b, u8 sign = 0) { s64 prod = dsp_get_multiply_prod(a, b, sign); @@ -120,7 +120,7 @@ void movp(const UDSPInstruction opc) } // MOVNP $acD -// 0111 111d xxxx xxxx +// 0111 111d xxxx xxxx // Moves negative of multiply product from $prod register to accumulator // $acD register. // @@ -160,7 +160,7 @@ void movpz(const UDSPInstruction opc) // Adds secondary accumulator $axS to product register and stores result // in accumulator register. Low 16-bits of $acD ($acD.l) are set (round) to 0. // -// TODO: ugly code and still small error here (+/- 1 in .m - randomly) +// TODO: ugly code and still small error here (+/- 1 in .m - randomly) // flags out: --xx xx0x void addpaxz(const UDSPInstruction opc) { @@ -176,20 +176,20 @@ void addpaxz(const UDSPInstruction opc) dsp_set_long_acc(dreg, res); res = dsp_get_long_acc(dreg); - Update_SR_Register64(res, isCarry(oldprod, res), false); + Update_SR_Register64(res, isCarry(oldprod, res), false); } //---- // MULAXH // 1000 0011 xxxx xxxx -// Multiply $ax0.h by $ax0.h +// Multiply $ax0.h by $ax0.h void mulaxh(const UDSPInstruction opc) { s64 prod = dsp_multiply(dsp_get_ax_h(0), dsp_get_ax_h(0)); zeroWriteBackLog(); - + dsp_set_long_prod(prod); } @@ -206,7 +206,7 @@ void mul(const UDSPInstruction opc) u16 axl = dsp_get_ax_l(sreg); u16 axh = dsp_get_ax_h(sreg); s64 prod = dsp_multiply(axh, axl); - + zeroWriteBackLog(); dsp_set_long_prod(prod); @@ -277,7 +277,7 @@ void mulmvz(const UDSPInstruction opc) u16 axl = dsp_get_ax_l(sreg); u16 axh = dsp_get_ax_h(sreg); s64 prod = dsp_multiply(axl, axh); - + zeroWriteBackLog(); dsp_set_long_prod(prod); @@ -418,7 +418,7 @@ void mulcac(const UDSPInstruction opc) u16 accm = dsp_get_acc_m(sreg); u16 axh = dsp_get_ax_h(treg); s64 prod = dsp_multiply(accm, axh); - + zeroWriteBackLog(); dsp_set_long_prod(prod); @@ -444,7 +444,7 @@ void mulcmv(const UDSPInstruction opc) u16 accm = dsp_get_acc_m(sreg); u16 axh = dsp_get_ax_h(treg); s64 prod = dsp_multiply(accm, axh); - + zeroWriteBackLog(); dsp_set_long_prod(prod); @@ -457,7 +457,7 @@ void mulcmv(const UDSPInstruction opc) // (fixed possible bug in duddie's description, s->t) // Multiply mid part of accumulator register $acS.m by high part $axT.h of // secondary accumulator $axT (treat them both as signed). Move product -// register before multiplication to accumulator $acR, set (round) low part of +// register before multiplication to accumulator $acR, set (round) low part of // accumulator $acR.l to zero. // // flags out: --xx xx0x @@ -494,7 +494,7 @@ void maddx(const UDSPInstruction opc) u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); s64 prod = dsp_multiply_add(val1, val2); - + zeroWriteBackLog(); dsp_set_long_prod(prod); @@ -547,7 +547,7 @@ void msubc(const UDSPInstruction opc) { u8 treg = (opc >> 8) & 0x1; u8 sreg = (opc >> 9) & 0x1; - + u16 accm = dsp_get_acc_m(sreg); u16 axh = dsp_get_ax_h(treg); s64 prod = dsp_multiply_sub(accm, axh); @@ -565,7 +565,7 @@ void msubc(const UDSPInstruction opc) void madd(const UDSPInstruction opc) { u8 sreg = (opc >> 8) & 0x1; - + u16 axl = dsp_get_ax_l(sreg); u16 axh = dsp_get_ax_h(sreg); s64 prod = dsp_multiply_add(axl, axh); @@ -583,7 +583,7 @@ void madd(const UDSPInstruction opc) void msub(const UDSPInstruction opc) { u8 sreg = (opc >> 8) & 0x1; - + u16 axl = dsp_get_ax_l(sreg); u16 axh = dsp_get_ax_h(sreg); s64 prod = dsp_multiply_sub(axl, axh); diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp index dbb185844e..5e2dfe7c14 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp @@ -4,15 +4,11 @@ // Additional copyrights go to Duddie and Tratax (c) 2004 +#include "../DSPAnalyzer.h" +#include "../DSPEmitter.h" #include "../DSPIntCCUtil.h" #include "../DSPIntUtil.h" -#include "../DSPEmitter.h" -#include "../DSPAnalyzer.h" -#ifdef _M_X64 -#include "DSPJitUtil.h" -#endif -#include "x64Emitter.h" -#include "x64ABI.h" + using namespace Gen; // CLR $acR @@ -81,7 +77,7 @@ void DSPEmitter::andcf(const UDSPInstruction opc) // u16 val = dsp_get_acc_m(reg); get_acc_m(reg); // Update_SR_LZ(((val & imm) == imm) ? true : false); -// if ((val & imm) == imm) +// if ((val & imm) == imm) // g_dsp.r.sr |= SR_LOGIC_ZERO; // else // g_dsp.r.sr &= ~SR_LOGIC_ZERO; @@ -121,7 +117,7 @@ void DSPEmitter::andf(const UDSPInstruction opc) // u16 val = dsp_get_acc_m(reg); get_acc_m(reg); // Update_SR_LZ(((val & imm) == 0) ? true : false); -// if ((val & imm) == 0) +// if ((val & imm) == 0) // g_dsp.r.sr |= SR_LOGIC_ZERO; // else // g_dsp.r.sr &= ~SR_LOGIC_ZERO; @@ -254,7 +250,7 @@ void DSPEmitter::cmpar(const UDSPInstruction opc) // CMPI $amD, #I // 0000 001r 1000 0000 // iiii iiii iiii iiii -// Compares mid accumulator $acD.hm ($amD) with sign extended immediate value I. +// Compares mid accumulator $acD.hm ($amD) with sign extended immediate value I. // Although flags are being set regarding whole accumulator register. // // flags out: x-xx xxxx @@ -795,7 +791,7 @@ void DSPEmitter::addaxl(const UDSPInstruction opc) #endif } -// ADDI $amR, #I +// ADDI $amR, #I // 0000 001r 0000 0000 // iiii iiii iiii iiii // Adds immediate (16-bit sign extended) to mid accumulator $acD.hm. @@ -1037,7 +1033,7 @@ void DSPEmitter::subax(const UDSPInstruction opc) // SUB $acD, $ac(1-D) // 0101 110d xxxx xxxx -// Subtracts accumulator $ac(1-D) from accumulator register $acD. +// Subtracts accumulator $ac(1-D) from accumulator register $acD. // // flags out: x-xx xxxx void DSPEmitter::sub(const UDSPInstruction opc) @@ -1129,7 +1125,7 @@ void DSPEmitter::decm(const UDSPInstruction opc) // s64 res = acc - sub; SUB(64, R(RAX), Imm32((u32)subtract)); // dsp_set_long_acc(dreg, res); -// res = dsp_get_long_acc(dreg); +// res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -subtract, res)); if (FlagsNeeded()) { @@ -1159,7 +1155,7 @@ void DSPEmitter::dec(const UDSPInstruction opc) u8 dreg = (opc >> 8) & 0x01; X64Reg tmp1; gpr.getFreeXReg(tmp1); -// s64 acc = dsp_get_long_acc(dreg); +// s64 acc = dsp_get_long_acc(dreg); get_long_acc(dreg, tmp1); MOV(64, R(RAX), R(tmp1)); // s64 res = acc - 1; @@ -1212,7 +1208,7 @@ void DSPEmitter::neg(const UDSPInstruction opc) } // ABS $acD -// 1010 d001 xxxx xxxx +// 1010 d001 xxxx xxxx // absolute value of $acD // // flags out: --xx xx00 @@ -1221,7 +1217,7 @@ void DSPEmitter::abs(const UDSPInstruction opc) #ifdef _M_X64 u8 dreg = (opc >> 11) & 0x1; -// s64 acc = dsp_get_long_acc(dreg); +// s64 acc = dsp_get_long_acc(dreg); get_long_acc(dreg); // if (acc < 0) acc = 0 - acc; CMP(64, R(RAX), Imm8(0)); @@ -1271,7 +1267,7 @@ void DSPEmitter::movr(const UDSPInstruction opc) // MOVAX $acD, $axS // 0110 10sd xxxx xxxx -// Moves secondary accumulator $axS to accumulator $axD. +// Moves secondary accumulator $axS to accumulator $axD. // // flags out: --xx xx00 void DSPEmitter::movax(const UDSPInstruction opc) @@ -1357,7 +1353,7 @@ void DSPEmitter::lsr16(const UDSPInstruction opc) // u64 acc = dsp_get_long_acc(areg); get_long_acc(areg); // acc &= 0x000000FFFFFFFFFFULL; // Lop off the extraneous sign extension our 64-bit fake accum causes -// acc >>= 16; +// acc >>= 16; SHR(64, R(RAX), Imm8(16)); AND(64, R(RAX), Imm32(0xffffff)); // dsp_set_long_acc(areg, (s64)acc); @@ -1403,11 +1399,11 @@ void DSPEmitter::asr16(const UDSPInstruction opc) // Logically shifts left accumulator $acR by number specified by value I. // // flags out: --xx xx00 -void DSPEmitter::lsl(const UDSPInstruction opc) +void DSPEmitter::lsl(const UDSPInstruction opc) { #ifdef _M_X64 u8 rreg = (opc >> 8) & 0x01; - u16 shift = opc & 0x3f; + u16 shift = opc & 0x3f; // u64 acc = dsp_get_long_acc(rreg); get_long_acc(rreg); @@ -1452,7 +1448,7 @@ void DSPEmitter::lsr(const UDSPInstruction opc) // acc >>= shift; SHR(64, R(RAX), Imm8(shift + 24)); } - + // dsp_set_long_acc(rreg, (s64)acc); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); @@ -1535,7 +1531,7 @@ void DSPEmitter::asr(const UDSPInstruction opc) void DSPEmitter::lsrn(const UDSPInstruction opc) { #ifdef _M_X64 -// s16 shift; +// s16 shift; // u16 accm = (u16)dsp_get_acc_m(1); get_acc_m(1); // u64 acc = dsp_get_long_acc(0); diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitBranch.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitBranch.cpp index 70bb3618e6..49c94114b2 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitBranch.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitBranch.cpp @@ -2,13 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../DSPMemoryMap.h" -#include "../DSPEmitter.h" -#include "../DSPStacks.h" #include "../DSPAnalyzer.h" -#include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPEmitter.h" +#include "../DSPMemoryMap.h" +#include "../DSPStacks.h" using namespace Gen; @@ -41,11 +38,11 @@ static void ReJitConditional(const UDSPInstruction opc, DSPEmitter& emitter) emitter.TEST(16, R(EAX), Imm16(0x10)); break; case 0x4: // NZ - Not Zero - case 0x5: // Z - Zero + case 0x5: // Z - Zero emitter.TEST(16, R(EAX), Imm16(SR_ARITH_ZERO)); break; case 0x6: // NC - Not carry - case 0x7: // C - Carry + case 0x7: // C - Carry emitter.TEST(16, R(EAX), Imm16(SR_CARRY)); break; case 0x8: // ? - Not over s32 @@ -203,8 +200,8 @@ void r_callr(const UDSPInstruction opc, DSPEmitter& emitter) // Generic callr implementation // CALLRcc $R // 0001 0111 rrr1 cccc -// Call function if condition cc has been met. Push program counter of -// instruction following "call" to call stack $st0. Set program counter to +// Call function if condition cc has been met. Push program counter of +// instruction following "call" to call stack $st0. Set program counter to // register $R. // NOTE: Cannot use Default(opc) here because of the need to write branch exit void DSPEmitter::callr(const UDSPInstruction opc) @@ -264,7 +261,7 @@ void DSPEmitter::rti(const UDSPInstruction opc) } // HALT -// 0000 0000 0020 0001 +// 0000 0000 0020 0001 // Stops execution of DSP code. Sets bit DSP_CR_HALT in register DREG_CR. void DSPEmitter::halt(const UDSPInstruction opc) { @@ -432,7 +429,7 @@ void DSPEmitter::bloopi(const UDSPInstruction opc) // u16 loop_pc = dsp_fetch_code(); u16 loop_pc = dsp_imem_read(compilePC + 1); - if (cnt) + if (cnt) { MOV(16, R(RDX), Imm16(compilePC + 2)); dsp_reg_store_stack(0); diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitCCUtil.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitCCUtil.cpp index ff3180e92c..62540ffe4f 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitCCUtil.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitCCUtil.cpp @@ -4,14 +4,9 @@ // Additional copyrights go to Duddie and Tratax (c) 2004 - -// HELPER FUNCTIONS - -#include "../DSPIntUtil.h" #include "../DSPEmitter.h" -#include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPIntUtil.h" // Helper functions + using namespace Gen; // In: RAX: s64 _Value @@ -225,8 +220,8 @@ void DSPEmitter::Update_SR_Register16_OverS32(Gen::X64Reg val) //void DSPEmitter::Update_SR_LZ(bool value) { -// if (value == true) -// g_dsp.r[DSP_REG_SR] |= SR_LOGIC_ZERO; +// if (value == true) +// g_dsp.r[DSP_REG_SR] |= SR_LOGIC_ZERO; // else // g_dsp.r[DSP_REG_SR] &= ~SR_LOGIC_ZERO; //} @@ -281,11 +276,11 @@ void DSPEmitter::Update_SR_Register16_OverS32(Gen::X64Reg val) // return isLess() || isZero(); // case 0x4: // NZ - Not Zero // return !isZero(); -// case 0x5: // Z - Zero +// case 0x5: // Z - Zero // return isZero(); // case 0x6: // NC - Not carry // return !isCarry(); -// case 0x7: // C - Carry +// case 0x7: // C - Carry // return isCarry(); // case 0x8: // ? - Not over s32 // return !isOverS32(); diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitExtOps.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitExtOps.cpp index 149387db6d..f18bc3de84 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitExtOps.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitExtOps.cpp @@ -2,11 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../DSPMemoryMap.h" #include "../DSPEmitter.h" -#include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPMemoryMap.h" using namespace Gen; @@ -47,8 +44,8 @@ void DSPEmitter::ir(const UDSPInstruction opc) // Add corresponding indexing register $ixR to addressing register $arR. void DSPEmitter::nr(const UDSPInstruction opc) { - u8 reg = opc & 0x3; - + u8 reg = opc & 0x3; + increase_addr_reg(reg, reg); } @@ -109,7 +106,7 @@ void DSPEmitter::sn(const UDSPInstruction opc) // L $axD.D, @$arS // xxxx xxxx 01dd d0ss -// Load $axD.D/$acD.D with value from memory pointed by register $arS. +// Load $axD.D/$acD.D with value from memory pointed by register $arS. // Post increment register $arS. void DSPEmitter::l(const UDSPInstruction opc) { @@ -133,7 +130,7 @@ void DSPEmitter::l(const UDSPInstruction opc) // LN $axD.D, @$arS // xxxx xxxx 01dd d0ss -// Load $axD.D/$acD.D with value from memory pointed by register $arS. +// Load $axD.D/$acD.D with value from memory pointed by register $arS. // Add indexing register $ixS to register $arS. void DSPEmitter::ln(const UDSPInstruction opc) { @@ -177,7 +174,7 @@ void DSPEmitter::ls(const UDSPInstruction opc) pushExtValueFromMem(dreg, DSP_REG_AR0); increment_addr_reg(DSP_REG_AR3); - increment_addr_reg(DSP_REG_AR0); + increment_addr_reg(DSP_REG_AR0); } @@ -202,7 +199,7 @@ void DSPEmitter::lsn(const UDSPInstruction opc) gpr.putXReg(tmp1); pushExtValueFromMem(dreg, DSP_REG_AR0); - + increment_addr_reg(DSP_REG_AR3); increase_addr_reg(DSP_REG_AR0, DSP_REG_AR0); } diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitLoadStore.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitLoadStore.cpp index 9197659aaf..765ecb39e4 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitLoadStore.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitLoadStore.cpp @@ -4,19 +4,17 @@ // Additional copyrights go to Duddie and Tratax (c) 2004 +#include "../DSPEmitter.h" #include "../DSPIntCCUtil.h" #include "../DSPIntUtil.h" -#include "../DSPEmitter.h" -#include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" + using namespace Gen; // SRS @M, $(0x18+S) // 0010 1sss mmmm mmmm -// Move value from register $(0x18+D) to data memory pointed by address -// CR[0-7] | M. That is, the upper 8 bits of the address are the -// bottom 8 bits from CR, and the lower 8 bits are from the 8-bit immediate. +// Move value from register $(0x18+D) to data memory pointed by address +// CR[0-7] | M. That is, the upper 8 bits of the address are the +// bottom 8 bits from CR, and the lower 8 bits are from the 8-bit immediate. // Note: pc+=2 in duddie's doc seems wrong void DSPEmitter::srs(const UDSPInstruction opc) { @@ -132,7 +130,7 @@ void DSPEmitter::lrr(const UDSPInstruction opc) // LRRD $D, @$S // 0001 1000 1ssd dddd // Move value from data memory pointed by addressing register $S toregister $D. -// Decrement register $S. +// Decrement register $S. void DSPEmitter::lrrd(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -154,7 +152,7 @@ void DSPEmitter::lrrd(const UDSPInstruction opc) // LRRI $D, @$S // 0001 1001 0ssd dddd // Move value from data memory pointed by addressing register $S to register $D. -// Increment register $S. +// Increment register $S. void DSPEmitter::lrri(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -176,7 +174,7 @@ void DSPEmitter::lrri(const UDSPInstruction opc) // LRRN $D, @$S // 0001 1001 1ssd dddd // Move value from data memory pointed by addressing register $S to register $D. -// Add indexing register $(0x4+S) to register $S. +// Add indexing register $(0x4+S) to register $S. void DSPEmitter::lrrn(const UDSPInstruction opc) { u8 sreg = (opc >> 5) & 0x3; @@ -197,8 +195,8 @@ void DSPEmitter::lrrn(const UDSPInstruction opc) // SRR @$D, $S // 0001 1010 0dds ssss -// Store value from source register $S to a memory location pointed by -// addressing register $D. +// Store value from source register $S to a memory location pointed by +// addressing register $D. void DSPEmitter::srr(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; @@ -217,7 +215,7 @@ void DSPEmitter::srr(const UDSPInstruction opc) // SRRD @$D, $S // 0001 1010 1dds ssss // Store value from source register $S to a memory location pointed by -// addressing register $D. Decrement register $D. +// addressing register $D. Decrement register $D. void DSPEmitter::srrd(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; @@ -238,7 +236,7 @@ void DSPEmitter::srrd(const UDSPInstruction opc) // SRRI @$D, $S // 0001 1011 0dds ssss // Store value from source register $S to a memory location pointed by -// addressing register $D. Increment register $D. +// addressing register $D. Increment register $D. void DSPEmitter::srri(const UDSPInstruction opc) { u8 dreg = (opc >> 5) & 0x3; diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitMisc.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitMisc.cpp index 09b87be54a..6da5b646f4 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitMisc.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitMisc.cpp @@ -2,11 +2,9 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../DSPIntUtil.h" #include "../DSPEmitter.h" -#include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPIntUtil.h" + using namespace Gen; // MRR $D, $S @@ -82,7 +80,7 @@ void DSPEmitter::iar(const UDSPInstruction opc) increment_addr_reg(opc & 0x3); } -// SUBARN $arD +// SUBARN $arD // 0000 0000 0000 11dd // Subtract indexing register $ixD from an addressing register $arD. // used only in IPL-NTSC ucode @@ -112,7 +110,7 @@ void DSPEmitter::addarn(const UDSPInstruction opc) void DSPEmitter::setCompileSR(u16 bit) { - + // g_dsp.r[DSP_REG_SR] |= bit OpArg sr_reg; gpr.getReg(DSP_REG_SR,sr_reg); @@ -124,7 +122,7 @@ void DSPEmitter::setCompileSR(u16 bit) void DSPEmitter::clrCompileSR(u16 bit) { - + // g_dsp.r[DSP_REG_SR] &= bit OpArg sr_reg; gpr.getReg(DSP_REG_SR,sr_reg); diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp index bfdba2ed7e..00cec82e76 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp @@ -7,14 +7,10 @@ // Multiplier and product register control -#include "../DSPIntUtil.h" -#include "../DSPEmitter.h" #include "../DSPAnalyzer.h" -#ifdef _M_X64 -#include "DSPJitUtil.h" -#endif -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPEmitter.h" +#include "../DSPIntUtil.h" + using namespace Gen; // Returns s64 in RAX @@ -213,7 +209,7 @@ void DSPEmitter::movp(const UDSPInstruction opc) } // MOVNP $acD -// 0111 111d xxxx xxxx +// 0111 111d xxxx xxxx // Moves negative of multiply product from $prod register to accumulator // $acD register. @@ -290,7 +286,7 @@ void DSPEmitter::addpaxz(const UDSPInstruction opc) // s64 oldprod = dsp_get_long_prod(); // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); -// Update_SR_Register64(res, isCarry(oldprod, res), false); +// Update_SR_Register64(res, isCarry(oldprod, res), false); if (FlagsNeeded()) { get_long_prod(RDX); @@ -312,7 +308,7 @@ void DSPEmitter::addpaxz(const UDSPInstruction opc) // MULAXH // 1000 0011 xxxx xxxx -// Multiply $ax0.h by $ax0.h +// Multiply $ax0.h by $ax0.h void DSPEmitter::mulaxh(const UDSPInstruction opc) { #ifdef _M_X64 @@ -706,7 +702,7 @@ void DSPEmitter::mulcmv(const UDSPInstruction opc) // (fixed possible bug in duddie's description, s->t) // Multiply mid part of accumulator register $acS.m by high part $axT.h of // secondary accumulator $axT (treat them both as signed). Move product -// register before multiplication to accumulator $acR, set (round) low part of +// register before multiplication to accumulator $acR, set (round) low part of // accumulator $acR.l to zero. // flags out: --xx xx0x diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.cpp index 1a693ede34..6950daa6d1 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.cpp @@ -75,10 +75,10 @@ static void *reg_ptr(int reg) DSPJitRegCache::DSPJitRegCache(DSPEmitter &_emitter) : emitter(_emitter), temporary(false), merged(false) { - for(unsigned int i = 0; i < NUMXREGS; i++) + for(auto& xreg : xregs) { - xregs[i].guest_reg = DSP_REG_STATIC; - xregs[i].pushed = false; + xreg.guest_reg = DSP_REG_STATIC; + xreg.pushed = false; } xregs[RAX].guest_reg = DSP_REG_STATIC;// reserved for MUL/DIV @@ -449,9 +449,9 @@ void DSPJitRegCache::pushRegs() } int push_count = 0; - for(unsigned int i = 0; i < NUMXREGS; i++) + for(auto& xreg : xregs) { - if (xregs[i].guest_reg == DSP_REG_USED) + if (xreg.guest_reg == DSP_REG_USED) push_count++; } @@ -503,9 +503,9 @@ void DSPJitRegCache::popRegs() { emitter.MOV(32, M(&ebp_store), R(EBP)); #endif int push_count = 0; - for(unsigned int i = 0; i < NUMXREGS; i++) + for(auto& xreg : xregs) { - if (xregs[i].pushed) + if (xreg.pushed) push_count++; } @@ -613,7 +613,7 @@ void DSPJitRegCache::movToHostReg(int reg, bool load) tmp = regs[reg].host_reg; else tmp = findSpillFreeXReg(); - + if (tmp == INVALID_REG) return; @@ -932,12 +932,12 @@ void DSPJitRegCache::writeReg(int dreg, OpArg arg) { switch(regs[dreg].size) { - case 2: emitter.MOV(16, reg, Imm16(arg.offset)); break; - case 4: emitter.MOV(32, reg, Imm32(arg.offset)); break; + case 2: emitter.MOV(16, reg, Imm16((u16) arg.offset)); break; + case 4: emitter.MOV(32, reg, Imm32((u32) arg.offset)); break; #ifdef _M_X64 case 8: - if ((s32)arg.offset == (s64)arg.offset) - emitter.MOV(64, reg, Imm32(arg.offset)); + if ((u32) arg.offset == arg.offset) + emitter.MOV(64, reg, Imm32((u32) arg.offset)); else emitter.MOV(64, reg, Imm64(arg.offset)); break; @@ -1037,11 +1037,11 @@ void DSPJitRegCache::spillXReg(X64Reg reg) X64Reg DSPJitRegCache::findFreeXReg() { - for(unsigned int i = 0; i < sizeof(alloc_order)/sizeof(alloc_order[0]); i++) + for(auto& x : alloc_order) { - if (xregs[alloc_order[i]].guest_reg == DSP_REG_NONE) + if (xregs[x].guest_reg == DSP_REG_NONE) { - return alloc_order[i]; + return x; } } return INVALID_REG; diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.h b/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.h index 77cc7ace1e..075be9d99d 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.h +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitRegCache.h @@ -36,7 +36,7 @@ enum DSPJitSignExtend #ifdef _M_X64 #define NUMXREGS 16 -#elif _M_IX86 +#else #define NUMXREGS 8 #endif @@ -48,7 +48,7 @@ private: int guest_reg; //including DSPJitRegSpecial bool pushed; }; - + struct DynamicReg { Gen::OpArg loc; diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitUtil.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitUtil.cpp index e313920361..dd7e042169 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitUtil.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitUtil.cpp @@ -2,12 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../DSPMemoryMap.h" -#include "../DSPHWInterface.h" -#include "../DSPEmitter.h" #include "DSPJitUtil.h" -#include "x64Emitter.h" -#include "x64ABI.h" +#include "../DSPEmitter.h" +#include "../DSPHWInterface.h" +#include "../DSPMemoryMap.h" using namespace Gen; @@ -27,10 +25,10 @@ void DSPEmitter::dsp_reg_stack_push(int stack_reg) gpr.getFreeXReg(tmp1); //g_dsp.reg_stack[stack_reg][g_dsp.reg_stack_ptr[stack_reg]] = g_dsp.r[DSP_REG_ST0 + stack_reg]; MOV(16, R(tmp1), M(&g_dsp.r.st[stack_reg])); -#ifdef _M_IX86 // All32 - MOVZX(32, 8, EAX, R(AL)); -#else +#ifdef _M_X64 MOVZX(64, 8, RAX, R(AL)); +#else + MOVZX(32, 8, EAX, R(AL)); #endif MOV(16, MComplex(EAX, EAX, 1, PtrOffset(&g_dsp.reg_stack[stack_reg][0],0)), R(tmp1)); @@ -46,10 +44,10 @@ void DSPEmitter::dsp_reg_stack_pop(int stack_reg) MOV(8, R(AL), M(&g_dsp.reg_stack_ptr[stack_reg])); X64Reg tmp1; gpr.getFreeXReg(tmp1); -#ifdef _M_IX86 // All32 - MOVZX(32, 8, EAX, R(AL)); -#else +#ifdef _M_X64 MOVZX(64, 8, RAX, R(AL)); +#else + MOVZX(32, 8, EAX, R(AL)); #endif MOV(16, R(tmp1), MComplex(EAX, EAX, 1, PtrOffset(&g_dsp.reg_stack[stack_reg][0],0))); @@ -209,17 +207,17 @@ void DSPEmitter::dsp_op_read_reg_dont_saturate(int reg, Gen::X64Reg host_dreg, D switch(extend) { case SIGN: -#ifdef _M_IX86 // All32 - MOVSX(32, 16, host_dreg, R(host_dreg)); -#else +#ifdef _M_X64 MOVSX(64, 16, host_dreg, R(host_dreg)); +#else + MOVSX(32, 16, host_dreg, R(host_dreg)); #endif break; case ZERO: -#ifdef _M_IX86 // All32 - MOVZX(32, 16, host_dreg, R(host_dreg)); -#else +#ifdef _M_X64 MOVZX(64, 16, host_dreg, R(host_dreg)); +#else + MOVZX(32, 16, host_dreg, R(host_dreg)); #endif break; case NONE: @@ -245,17 +243,17 @@ void DSPEmitter::dsp_op_read_reg(int reg, Gen::X64Reg host_dreg, DSPJitSignExten switch(extend) { case SIGN: -#ifdef _M_IX86 // All32 - MOVSX(32, 16, host_dreg, R(host_dreg)); -#else +#ifdef _M_X64 MOVSX(64, 16, host_dreg, R(host_dreg)); +#else + MOVSX(32, 16, host_dreg, R(host_dreg)); #endif break; case ZERO: -#ifdef _M_IX86 // All32 - MOVZX(32, 16, host_dreg, R(host_dreg)); -#else +#ifdef _M_X64 MOVZX(64, 16, host_dreg, R(host_dreg)); +#else + MOVZX(32, 16, host_dreg, R(host_dreg)); #endif break; case NONE: @@ -267,11 +265,11 @@ void DSPEmitter::dsp_op_read_reg(int reg, Gen::X64Reg host_dreg, DSPJitSignExten case DSP_REG_ACM1: { //we already know this is ACCM0 or ACCM1 -#ifdef _M_IX86 // All32 - gpr.readReg(reg, host_dreg, extend); -#else +#ifdef _M_X64 OpArg acc_reg; gpr.getReg(reg-DSP_REG_ACM0+DSP_REG_ACC0_64, acc_reg); +#else + gpr.readReg(reg, host_dreg, extend); #endif OpArg sr_reg; gpr.getReg(DSP_REG_SR,sr_reg); @@ -280,7 +278,38 @@ void DSPEmitter::dsp_op_read_reg(int reg, Gen::X64Reg host_dreg, DSPJitSignExten TEST(16, sr_reg, Imm16(SR_40_MODE_BIT)); FixupBranch not_40bit = J_CC(CC_Z, true); -#ifdef _M_IX86 // All32 + +#ifdef _M_X64 + MOVSX(64,32,host_dreg,acc_reg); + CMP(64,R(host_dreg),acc_reg); + FixupBranch no_saturate = J_CC(CC_Z); + + CMP(64,acc_reg,Imm32(0)); + FixupBranch negative = J_CC(CC_LE); + + MOV(64,R(host_dreg),Imm32(0x7fff));//this works for all extend modes + FixupBranch done_positive = J(); + + SetJumpTarget(negative); + if (extend == NONE || extend == ZERO) + MOV(64,R(host_dreg),Imm32(0x00008000)); + else + MOV(64,R(host_dreg),Imm32(0xffff8000)); + FixupBranch done_negative = J(); + + SetJumpTarget(no_saturate); + SetJumpTarget(not_40bit); + + MOV(64, R(host_dreg), acc_reg); + if (extend == NONE || extend == ZERO) + SHR(64, R(host_dreg), Imm8(16)); + else + SAR(64, R(host_dreg), Imm8(16)); + SetJumpTarget(done_positive); + SetJumpTarget(done_negative); + gpr.flushRegs(c); + gpr.putReg(reg-DSP_REG_ACM0+DSP_REG_ACC0_64, false); +#else DSPJitRegCache c2(gpr); gpr.putReg(DSP_REG_SR, false); X64Reg tmp1; @@ -315,37 +344,6 @@ void DSPEmitter::dsp_op_read_reg(int reg, Gen::X64Reg host_dreg, DSPJitSignExten gpr.flushRegs(c2); SetJumpTarget(not_40bit); gpr.flushRegs(c); -#else - - MOVSX(64,32,host_dreg,acc_reg); - CMP(64,R(host_dreg),acc_reg); - FixupBranch no_saturate = J_CC(CC_Z); - - CMP(64,acc_reg,Imm32(0)); - FixupBranch negative = J_CC(CC_LE); - - MOV(64,R(host_dreg),Imm32(0x7fff));//this works for all extend modes - FixupBranch done_positive = J(); - - SetJumpTarget(negative); - if (extend == NONE || extend == ZERO) - MOV(64,R(host_dreg),Imm32(0x00008000)); - else - MOV(64,R(host_dreg),Imm32(0xffff8000)); - FixupBranch done_negative = J(); - - SetJumpTarget(no_saturate); - SetJumpTarget(not_40bit); - - MOV(64, R(host_dreg), acc_reg); - if (extend == NONE || extend == ZERO) - SHR(64, R(host_dreg), Imm8(16)); - else - SAR(64, R(host_dreg), Imm8(16)); - SetJumpTarget(done_positive); - SetJumpTarget(done_negative); - gpr.flushRegs(c); - gpr.putReg(reg-DSP_REG_ACM0+DSP_REG_ACC0_64, false); #endif gpr.putReg(DSP_REG_SR, false); @@ -612,11 +610,11 @@ void DSPEmitter::dmem_write_imm(u16 address, X64Reg value) switch (address >> 12) { case 0x0: // 0xxx DRAM -#ifdef _M_IX86 // All32 - MOV(16, M(&g_dsp.dram[address & DSP_DRAM_MASK]), R(value)); -#else +#ifdef _M_X64 MOV(64, R(RDX), ImmPtr(g_dsp.dram)); MOV(16, MDisp(RDX, (address & DSP_DRAM_MASK)*2), R(value)); +#else + MOV(16, M(&g_dsp.dram[address & DSP_DRAM_MASK]), R(value)); #endif break; @@ -720,20 +718,20 @@ void DSPEmitter::dmem_read_imm(u16 address) switch (address >> 12) { case 0x0: // 0xxx DRAM -#ifdef _M_IX86 // All32 - MOV(16, R(EAX), M(&g_dsp.dram[address & DSP_DRAM_MASK])); -#else +#ifdef _M_X64 MOV(64, R(RDX), ImmPtr(g_dsp.dram)); MOV(16, R(EAX), MDisp(RDX, (address & DSP_DRAM_MASK)*2)); +#else + MOV(16, R(EAX), M(&g_dsp.dram[address & DSP_DRAM_MASK])); #endif break; case 0x1: // 1xxx COEF -#ifdef _M_IX86 // All32 - MOV(16, R(EAX), Imm16(g_dsp.coef[address & DSP_COEF_MASK])); -#else +#ifdef _M_X64 MOV(64, R(RDX), ImmPtr(g_dsp.coef)); MOV(16, R(EAX), MDisp(RDX, (address & DSP_COEF_MASK)*2)); +#else + MOV(16, R(EAX), Imm16(g_dsp.coef[address & DSP_COEF_MASK])); #endif break; diff --git a/Source/Core/Core/Src/DSP/LabelMap.cpp b/Source/Core/Core/Src/DSP/LabelMap.cpp index a5e6e1b6dd..1c836e7a69 100644 --- a/Source/Core/Core/Src/DSP/LabelMap.cpp +++ b/Source/Core/Core/Src/DSP/LabelMap.cpp @@ -27,7 +27,7 @@ void LabelMap::RegisterDefaults() void LabelMap::RegisterLabel(const std::string &label, u16 lval, LabelType type) { u16 old_value; - if (GetLabelValue(label, &old_value) && old_value != lval) + if (GetLabelValue(label, &old_value) && old_value != lval) { printf("WARNING: Redefined label %s to %04x - old value %04x\n", label.c_str(), lval, old_value); @@ -49,20 +49,20 @@ void LabelMap::DeleteLabel(const std::string &label) } } -bool LabelMap::GetLabelValue(const std::string &label, u16 *value, LabelType type) const +bool LabelMap::GetLabelValue(const std::string &name, u16 *value, LabelType type) const { - for (u32 i = 0; i < labels.size(); i++) + for (auto& label : labels) { - if (!label.compare(labels[i].name)) + if (!name.compare(label.name)) { - if (type & labels[i].type) + if (type & label.type) { - *value = labels[i].addr; + *value = label.addr; return true; } else { - printf("WARNING: Wrong label type requested. %s\n", label.c_str()); + printf("WARNING: Wrong label type requested. %s\n", name.c_str()); } } } diff --git a/Source/Core/Core/Src/DSP/assemble.cpp b/Source/Core/Core/Src/DSP/assemble.cpp index 8deef98ed9..7ae9346f29 100644 --- a/Source/Core/Core/Src/DSP/assemble.cpp +++ b/Source/Core/Core/Src/DSP/assemble.cpp @@ -78,7 +78,7 @@ static const char *err_string[] = "Number out of range" }; -DSPAssembler::DSPAssembler(const AssemblerSettings &settings) : +DSPAssembler::DSPAssembler(const AssemblerSettings &settings) : gdg_buffer(NULL), m_cur_addr(0), m_cur_pass(0), @@ -99,7 +99,7 @@ bool DSPAssembler::Assemble(const char *text, std::vector &code, std::vecto if (line_numbers) line_numbers->clear(); const char *fname = "tmp.asm"; - if (!File::WriteStringToFile(true, text, fname)) + if (!File::WriteStringToFile(text, fname)) return false; InitPass(1); if (!AssembleFile(fname, 1)) @@ -150,7 +150,7 @@ void DSPAssembler::ShowError(err_t err_code, const char *extra_info) if (m_current_param == 0) buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d : %s\n", err_string[err_code], code_line, extra_info); - else + else buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d Param: %d : %s\n", err_string[err_code], code_line, m_current_param, extra_info); last_error_str = error_buffer; @@ -525,7 +525,7 @@ bool DSPAssembler::VerifyParams(const opc_t *opc, param_t *par, int count, bool // modified by Hermes: test the register range switch ((unsigned)opc->params[i].type) - { + { case P_REG18: case P_REG19: case P_REG1A: @@ -775,27 +775,27 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass) fsrc.getline(line, LINEBUF_SIZE); if(fsrc.fail()) break; - + cur_line = line; //printf("A: %s\n", line); code_line++; param_t params[10] = {{0, P_NONE, NULL}}; param_t params_ext[10] = {{0, P_NONE, NULL}}; - + bool upper = true; for (int i = 0; i < LINEBUF_SIZE; i++) { char c = line[i]; // This stuff handles /**/ and // comments. - // modified by Hermes : added // and /* */ for long commentaries + // modified by Hermes : added // and /* */ for long commentaries if (c == '/') { if (i < 1023) { if (line[i+1] == '/') c = 0x00; - else if (line[i+1] == '*') + else if (line[i+1] == '*') { // toggle comment mode. disable_text = !disable_text; @@ -916,7 +916,7 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass) { char *tmpstr; u32 thisCodeline = code_line; - + if (include_dir.size()) { tmpstr = (char *)malloc(include_dir.size() + strlen(params[0].str) + 2); @@ -927,7 +927,7 @@ bool DSPAssembler::AssembleFile(const char *fname, int pass) tmpstr = (char *)malloc(strlen(params[0].str) + 1); strcpy(tmpstr, params[0].str); } - + AssembleFile(tmpstr, pass); code_line = thisCodeline; diff --git a/Source/Core/Core/Src/DSP/assemble.h b/Source/Core/Core/Src/DSP/assemble.h index f140d0e69e..5a15ed2ded 100644 --- a/Source/Core/Core/Src/DSP/assemble.h +++ b/Source/Core/Core/Src/DSP/assemble.h @@ -119,7 +119,7 @@ private: u32 m_cur_addr; int m_totalSize; u8 m_cur_pass; - + LabelMap labels; u32 code_line; diff --git a/Source/Core/Core/Src/DSPEmulator.cpp b/Source/Core/Core/Src/DSPEmulator.cpp index 96e1a1107e..52cae0d492 100644 --- a/Source/Core/Core/Src/DSPEmulator.cpp +++ b/Source/Core/Core/Src/DSPEmulator.cpp @@ -7,7 +7,7 @@ #include "HW/DSPLLE/DSPLLE.h" #include "HW/DSPHLE/DSPHLE.h" -DSPEmulator *CreateDSPEmulator(bool HLE) +DSPEmulator *CreateDSPEmulator(bool HLE) { if (HLE) { diff --git a/Source/Core/Core/Src/DSPEmulator.h b/Source/Core/Core/Src/DSPEmulator.h index 6df274d757..45b2b30c8c 100644 --- a/Source/Core/Core/Src/DSPEmulator.h +++ b/Source/Core/Core/Src/DSPEmulator.h @@ -35,6 +35,7 @@ public: protected: SoundStream *soundStream; + void *m_hWnd; }; DSPEmulator *CreateDSPEmulator(bool HLE); diff --git a/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.cpp b/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.cpp index 2b84297832..d4f1a4044f 100644 --- a/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.cpp +++ b/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.cpp @@ -10,7 +10,6 @@ #include "../PowerPC/PowerPC.h" #include "../PowerPC/PPCAnalyst.h" #include "../PowerPC/PPCSymbolDB.h" -#include "PowerPCDisasm.h" namespace Dolphin_Debugger { @@ -36,7 +35,7 @@ void AddAutoBreakpoints() // Returns callstack "formatted for debugging" - meaning that it // includes LR as the last item, and all items are the last step, // instead of "pointing ahead" -bool GetCallstack(std::vector &output) +bool GetCallstack(std::vector &output) { if (Core::GetState() == Core::CORE_UNINITIALIZED) return false; @@ -91,9 +90,9 @@ void PrintCallstack() u32 addr = Memory::ReadUnchecked_U32(PowerPC::ppcState.gpr[1]); // SP printf("== STACK TRACE - SP = %08x ==", PowerPC::ppcState.gpr[1]); - + if (LR == 0) { - printf(" LR = 0 - this is bad"); + printf(" LR = 0 - this is bad"); } int count = 1; if (g_symbolDB.GetDescription(PowerPC::ppcState.pc) != g_symbolDB.GetDescription(LR)) @@ -118,16 +117,16 @@ void PrintCallstack(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level) { u32 addr = Memory::ReadUnchecked_U32(PowerPC::ppcState.gpr[1]); // SP - GENERIC_LOG(type, level, "== STACK TRACE - SP = %08x ==", + GENERIC_LOG(type, level, "== STACK TRACE - SP = %08x ==", PowerPC::ppcState.gpr[1]); if (LR == 0) { - GENERIC_LOG(type, level, " LR = 0 - this is bad"); + GENERIC_LOG(type, level, " LR = 0 - this is bad"); } int count = 1; if (g_symbolDB.GetDescription(PowerPC::ppcState.pc) != g_symbolDB.GetDescription(LR)) { - GENERIC_LOG(type, level, " * %s [ LR = %08x ]", + GENERIC_LOG(type, level, " * %s [ LR = %08x ]", g_symbolDB.GetDescription(LR), LR); count++; } @@ -146,7 +145,7 @@ void PrintCallstack(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level) void PrintDataBuffer(LogTypes::LOG_TYPE type, u8* _pData, size_t _Size, const char* _title) { - GENERIC_LOG(type, LogTypes::LDEBUG, "%s", _title); + GENERIC_LOG(type, LogTypes::LDEBUG, "%s", _title); for (u32 j = 0; j < _Size;) { std::string Temp; diff --git a/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.h b/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.h index fac79b2959..2d470e2059 100644 --- a/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.h +++ b/Source/Core/Core/Src/Debugger/Debugger_SymbolMap.h @@ -13,7 +13,7 @@ namespace Dolphin_Debugger { -struct CallstackEntry +struct CallstackEntry { std::string Name; u32 vAddress; diff --git a/Source/Core/Core/Src/Debugger/Dump.cpp b/Source/Core/Core/Src/Debugger/Dump.cpp index 8d784cf8b0..8c4a23ca1a 100644 --- a/Source/Core/Core/Src/Debugger/Dump.cpp +++ b/Source/Core/Core/Src/Debugger/Dump.cpp @@ -9,8 +9,7 @@ #include "FileUtil.h" CDump::CDump(const char* _szFilename) : - m_pData(NULL), - m_bInit(false) + m_pData(NULL) { File::IOFile pStream(_szFilename, "rb"); if (pStream) @@ -38,7 +37,7 @@ CDump::GetNumberOfSteps(void) return (int)(m_size / STRUCTUR_SIZE); } -u32 +u32 CDump::GetGPR(int _step, int _gpr) { u32 offset = _step * STRUCTUR_SIZE; @@ -49,7 +48,7 @@ CDump::GetGPR(int _step, int _gpr) return Read32(offset + OFFSET_GPR + (_gpr * 4)); } -u32 +u32 CDump::GetPC(int _step) { u32 offset = _step * STRUCTUR_SIZE; @@ -60,7 +59,7 @@ CDump::GetPC(int _step) return Read32(offset + OFFSET_PC); } -u32 +u32 CDump::Read32(u32 _pos) { u32 result = (m_pData[_pos+0] << 24) | diff --git a/Source/Core/Core/Src/Debugger/Dump.h b/Source/Core/Core/Src/Debugger/Dump.h index ae94b6571e..57244c2572 100644 --- a/Source/Core/Core/Src/Debugger/Dump.h +++ b/Source/Core/Core/Src/Debugger/Dump.h @@ -17,7 +17,7 @@ public: CDump(const char* _szFilename); ~CDump(); - + int GetNumberOfSteps(); u32 GetGPR(int _step, int _gpr); u32 GetPC(int _step); @@ -32,7 +32,6 @@ private: u8 *m_pData; - bool m_bInit; size_t m_size; u32 Read32(u32 _pos); diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp index f2e36ee1ee..4b224d5677 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp @@ -15,7 +15,7 @@ #include "../PowerPC/JitCommon/JitBase.h" #include "../PowerPC/PPCSymbolDB.h" -void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size) +void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size) { // Memory::ReadUnchecked_U32 seemed to crash on shutdown if (PowerPC::GetState() == PowerPC::CPU_POWERDOWN) return; @@ -93,7 +93,7 @@ bool PPCDebugInterface::isAlive() return Core::GetState() != Core::CORE_UNINITIALIZED; } -bool PPCDebugInterface::isBreakpoint(unsigned int address) +bool PPCDebugInterface::isBreakpoint(unsigned int address) { return PowerPC::breakpoints.IsAddressBreakPoint(address); } @@ -146,7 +146,7 @@ void PPCDebugInterface::toggleMemCheck(unsigned int address) PowerPC::memchecks.Remove(address); } -void PPCDebugInterface::insertBLR(unsigned int address, unsigned int value) +void PPCDebugInterface::insertBLR(unsigned int address, unsigned int value) { Memory::Write_U32(value, address); } @@ -165,7 +165,7 @@ int PPCDebugInterface::getColor(unsigned int address) if (!Memory::IsRAMAddress(address, true, true)) return 0xeeeeee; static const int colors[6] = - { + { 0xd0FFFF, // light cyan 0xFFd0d0, // light red 0xd8d8FF, // light blue @@ -183,22 +183,22 @@ int PPCDebugInterface::getColor(unsigned int address) // ============= -std::string PPCDebugInterface::getDescription(unsigned int address) +std::string PPCDebugInterface::getDescription(unsigned int address) { return g_symbolDB.GetDescription(address); } -unsigned int PPCDebugInterface::getPC() +unsigned int PPCDebugInterface::getPC() { return PowerPC::ppcState.pc; } -void PPCDebugInterface::setPC(unsigned int address) +void PPCDebugInterface::setPC(unsigned int address) { PowerPC::ppcState.pc = address; } -void PPCDebugInterface::showJitResults(unsigned int address) +void PPCDebugInterface::showJitResults(unsigned int address) { Host_ShowJitResults(address); } diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h index e7d08ddd3a..71ab0d79c6 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h @@ -14,34 +14,34 @@ class PPCDebugInterface : public DebugInterface { public: - PPCDebugInterface(){} - virtual void disasm(unsigned int address, char *dest, int max_size); - virtual void getRawMemoryString(int memory, unsigned int address, char *dest, int max_size); - virtual int getInstructionSize(int /*instruction*/) {return 4;} - virtual bool isAlive(); - virtual bool isBreakpoint(unsigned int address); - virtual void setBreakpoint(unsigned int address); - virtual void clearBreakpoint(unsigned int address); - virtual void clearAllBreakpoints(); - virtual void toggleBreakpoint(unsigned int address); - virtual bool isMemCheck(unsigned int address); - virtual void toggleMemCheck(unsigned int address); - virtual unsigned int readMemory(unsigned int address); + PPCDebugInterface(){} + virtual void disasm(unsigned int address, char *dest, int max_size) override; + virtual void getRawMemoryString(int memory, unsigned int address, char *dest, int max_size) override; + virtual int getInstructionSize(int /*instruction*/) override {return 4;} + virtual bool isAlive() override; + virtual bool isBreakpoint(unsigned int address) override; + virtual void setBreakpoint(unsigned int address) override; + virtual void clearBreakpoint(unsigned int address) override; + virtual void clearAllBreakpoints() override; + virtual void toggleBreakpoint(unsigned int address) override; + virtual bool isMemCheck(unsigned int address) override; + virtual void toggleMemCheck(unsigned int address) override; + virtual unsigned int readMemory(unsigned int address) override; enum { EXTRAMEM_ARAM = 1, }; - virtual unsigned int readExtraMemory(int memory, unsigned int address); - virtual unsigned int readInstruction(unsigned int address); - virtual unsigned int getPC(); - virtual void setPC(unsigned int address); - virtual void step() {} - virtual void breakNow(); - virtual void runToBreakpoint(); - virtual void insertBLR(unsigned int address, unsigned int value); - virtual int getColor(unsigned int address); - virtual std::string getDescription(unsigned int address); - virtual void showJitResults(u32 address); + virtual unsigned int readExtraMemory(int memory, unsigned int address) override; + virtual unsigned int readInstruction(unsigned int address) override; + virtual unsigned int getPC() override; + virtual void setPC(unsigned int address) override; + virtual void step() override {} + virtual void breakNow() override; + virtual void runToBreakpoint() override; + virtual void insertBLR(unsigned int address, unsigned int value) override; + virtual int getColor(unsigned int address) override; + virtual std::string getDescription(unsigned int address) override; + virtual void showJitResults(u32 address) override; }; #endif diff --git a/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp b/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp index 233dbbbb4a..2bdbd88074 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp @@ -124,12 +124,12 @@ void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem) u32 CalculateVertexSize(int vatIndex, const CPMemory &cpMem) { u32 vertexSize = 0; - + int sizes[21]; CalculateVertexElementSizes(sizes, vatIndex, cpMem); - for (int i = 0; i < 21; ++i) - vertexSize += sizes[i]; + for (auto& size : sizes) + vertexSize += size; return vertexSize; } @@ -145,14 +145,14 @@ void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory &cpMe const u32 tcElements[8] = { - vtxAttr.g0.Tex0CoordElements, vtxAttr.g1.Tex1CoordElements, vtxAttr.g1.Tex2CoordElements, + vtxAttr.g0.Tex0CoordElements, vtxAttr.g1.Tex1CoordElements, vtxAttr.g1.Tex2CoordElements, vtxAttr.g1.Tex3CoordElements, vtxAttr.g1.Tex4CoordElements, vtxAttr.g2.Tex5CoordElements, vtxAttr.g2.Tex6CoordElements, vtxAttr.g2.Tex7CoordElements }; const u32 tcFormat[8] = { - vtxAttr.g0.Tex0CoordFormat, vtxAttr.g1.Tex1CoordFormat, vtxAttr.g1.Tex2CoordFormat, + vtxAttr.g0.Tex0CoordFormat, vtxAttr.g1.Tex1CoordFormat, vtxAttr.g1.Tex2CoordFormat, vtxAttr.g1.Tex3CoordFormat, vtxAttr.g1.Tex4CoordFormat, vtxAttr.g2.Tex5CoordFormat, vtxAttr.g2.Tex6CoordFormat, vtxAttr.g2.Tex7CoordFormat }; @@ -171,7 +171,7 @@ void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory &cpMe // Normals if (vtxDesc.Normal != NOT_PRESENT) { - sizes[10] = VertexLoader_Normal::GetSize(vtxDesc.Normal, vtxAttr.g0.NormalFormat, vtxAttr.g0.NormalElements, vtxAttr.g0.NormalIndex3); + sizes[10] = VertexLoader_Normal::GetSize(vtxDesc.Normal, vtxAttr.g0.NormalFormat, vtxAttr.g0.NormalElements, vtxAttr.g0.NormalIndex3); } else { diff --git a/Source/Core/Core/Src/FifoPlayer/FifoDataFile.cpp b/Source/Core/Core/Src/FifoPlayer/FifoDataFile.cpp index ebf19a07f8..5e7e864ad0 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoDataFile.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoDataFile.cpp @@ -17,12 +17,10 @@ FifoDataFile::FifoDataFile() : FifoDataFile::~FifoDataFile() { - for (unsigned int frameIdx = 0; frameIdx < m_Frames.size(); ++frameIdx) + for (auto& frame : m_Frames) { - FifoFrameInfo &frame = m_Frames[frameIdx]; - - for (unsigned int i = 0; i < frame.memoryUpdates.size(); ++i) - delete []frame.memoryUpdates[i].data; + for (auto& update : frame.memoryUpdates) + delete []update.data; delete []frame.fifoData; } @@ -54,7 +52,7 @@ bool FifoDataFile::Save(const char *filename) // Add space for frame list u64 frameListOffset = file.Tell(); - for (unsigned int i = 0; i < m_Frames.size(); ++i) + for (size_t i = 0; i < m_Frames.size(); i++) PadFile(sizeof(FileFrameInfo), file); u64 bpMemOffset = file.Tell(); @@ -88,7 +86,7 @@ bool FifoDataFile::Save(const char *filename) header.xfRegsSize = XF_REGS_SIZE; header.frameListOffset = frameListOffset; - header.frameCount = m_Frames.size(); + header.frameCount = (u32)m_Frames.size(); header.flags = m_Flags; @@ -101,7 +99,7 @@ bool FifoDataFile::Save(const char *filename) const FifoFrameInfo &srcFrame = m_Frames[i]; // Write FIFO data - file.Seek(0, SEEK_END); + file.Seek(0, SEEK_END); u64 dataOffset = file.Tell(); file.WriteBytes(srcFrame.fifoData, srcFrame.fifoDataSize); @@ -113,12 +111,12 @@ bool FifoDataFile::Save(const char *filename) dstFrame.fifoStart = srcFrame.fifoStart; dstFrame.fifoEnd = srcFrame.fifoEnd; dstFrame.memoryUpdatesOffset = memoryUpdatesOffset; - dstFrame.numMemoryUpdates = srcFrame.memoryUpdates.size(); + dstFrame.numMemoryUpdates = (u32)srcFrame.memoryUpdates.size(); // Write frame info u64 frameOffset = frameListOffset + (i * sizeof(FileFrameInfo)); file.Seek(frameOffset, SEEK_SET); - file.WriteBytes(&dstFrame, sizeof(FileFrameInfo)); + file.WriteBytes(&dstFrame, sizeof(FileFrameInfo)); } if (!file.Close()) @@ -152,7 +150,7 @@ FifoDataFile *FifoDataFile::Load(const std::string &filename, bool flagsOnly) file.Close(); return dataFile; } - + u32 size = std::min((u32)BP_MEM_SIZE, header.bpMemSize); file.Seek(header.bpMemOffset, SEEK_SET); file.ReadArray(dataFile->m_BPMem, size); @@ -221,7 +219,7 @@ u64 FifoDataFile::WriteMemoryUpdates(const std::vector &memUpdates { // Add space for memory update list u64 updateListOffset = file.Tell(); - for (unsigned int i = 0; i < memUpdates.size(); ++i) + for (size_t i = 0; i < memUpdates.size(); i++) PadFile(sizeof(FileMemoryUpdate), file); for (unsigned int i = 0; i < memUpdates.size(); ++i) @@ -232,7 +230,7 @@ u64 FifoDataFile::WriteMemoryUpdates(const std::vector &memUpdates file.Seek(0, SEEK_END); u64 dataOffset = file.Tell(); file.WriteBytes(srcUpdate.data, srcUpdate.size); - + FileMemoryUpdate dstUpdate; dstUpdate.address = srcUpdate.address; dstUpdate.dataOffset = dataOffset; diff --git a/Source/Core/Core/Src/FifoPlayer/FifoDataFile.h b/Source/Core/Core/Src/FifoPlayer/FifoDataFile.h index d13568a21b..c5dc6aee8e 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoDataFile.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoDataFile.h @@ -54,7 +54,7 @@ public: }; FifoDataFile(); - ~FifoDataFile(); + ~FifoDataFile(); void SetIsWii(bool isWii); bool GetIsWii() const; @@ -77,7 +77,7 @@ private: { FLAG_IS_WII = 1 }; - + void PadFile(u32 numBytes, File::IOFile &file); void SetFlag(u32 flag, bool set); diff --git a/Source/Core/Core/Src/FifoPlayer/FifoFileStruct.h b/Source/Core/Core/Src/FifoPlayer/FifoFileStruct.h index 0e606cc465..1eeada1160 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoFileStruct.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoFileStruct.h @@ -21,7 +21,7 @@ enum union FileHeader { - struct + struct { u32 fileId; u32 file_version; diff --git a/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.cpp b/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.cpp index 1ea80c8699..e6adc14130 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.cpp @@ -45,7 +45,7 @@ void FifoPlaybackAnalyzer::AnalyzeFrames(FifoDataFile *file, std::vectorGetFrameCount()); @@ -115,10 +115,8 @@ void FifoPlaybackAnalyzer::AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrame u32 end = memUpdate.address + memUpdate.size; // Remove portions of memUpdate that overlap with memory ranges that have been written by the GP - for (unsigned int i = 0; i < m_WrittenMemory.size(); ++i) + for (const auto& range : m_WrittenMemory) { - const MemoryRange &range = m_WrittenMemory[i]; - if (range.begin < end && range.end > begin) { @@ -210,7 +208,7 @@ u32 FifoPlaybackAnalyzer::DecodeCommand(u8 *data) BPCmd bp = FifoAnalyzer::DecodeBPCmd(cmd2, m_BpMem); FifoAnalyzer::LoadBPReg(bp, m_BpMem); - + if (bp.address == BPMEM_TRIGGER_EFB_COPY) StoreEfbCopyRegion(); } @@ -236,7 +234,7 @@ u32 FifoPlaybackAnalyzer::DecodeCommand(u8 *data) break; } - return data - dataStart; + return (u32)(data - dataStart); } void FifoPlaybackAnalyzer::StoreEfbCopyRegion() @@ -286,7 +284,7 @@ void FifoPlaybackAnalyzer::StoreWrittenRegion(u32 address, u32 size) { u32 end = address + size; vector::iterator newRangeIter = m_WrittenMemory.end(); - + // Search for overlapping memory regions and expand them to include the new region for (vector::iterator iter = m_WrittenMemory.begin(); iter != m_WrittenMemory.end();) { @@ -295,7 +293,7 @@ void FifoPlaybackAnalyzer::StoreWrittenRegion(u32 address, u32 size) if (range.begin < end && range.end > address) { // range at iterator and new range overlap - + if (newRangeIter == m_WrittenMemory.end()) { // Expand range to include the written region diff --git a/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.h b/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.h index f6df506947..e58acbd62a 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoPlaybackAnalyzer.h @@ -33,7 +33,7 @@ private: }; void AddMemoryUpdate(MemoryUpdate memUpdate, AnalyzedFrameInfo &frameInfo); - + u32 DecodeCommand(u8 *data); void LoadBP(u32 value0); diff --git a/Source/Core/Core/Src/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/Src/FifoPlayer/FifoPlayer.cpp index f660b41f9e..8aaf962999 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoPlayer.cpp @@ -92,7 +92,7 @@ bool FifoPlayer::Play() if (m_EarlyMemoryUpdates && m_CurrentFrame == m_FrameRangeStart) WriteAllMemoryUpdates(); - WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); + WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); ++m_CurrentFrame; } @@ -105,7 +105,9 @@ bool FifoPlayer::Play() u32 FifoPlayer::GetFrameObjectCount() { if (m_CurrentFrame < m_FrameInfo.size()) - return m_FrameInfo[m_CurrentFrame].objectStarts.size(); + { + return (u32)(m_FrameInfo[m_CurrentFrame].objectStarts.size()); + } return 0; } @@ -172,7 +174,7 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo &frame, const AnalyzedFrameInfo m_FrameFifoSize = frame.fifoDataSize; // Determine start and end objects - u32 numObjects = info.objectStarts.size(); + u32 numObjects = (u32)(info.objectStarts.size()); u32 drawStart = std::min(numObjects, m_ObjectRangeStart); u32 drawEnd = std::min(numObjects - 1, m_ObjectRangeEnd); @@ -181,7 +183,9 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo &frame, const AnalyzedFrameInfo // Skip memory updates during frame if true if (m_EarlyMemoryUpdates) - memoryUpdate = frame.memoryUpdates.size(); + { + memoryUpdate = (u32)(frame.memoryUpdates.size()); + } if (numObjects > 0) { @@ -259,9 +263,9 @@ void FifoPlayer::WriteAllMemoryUpdates() for (int frameNum = 0; frameNum < m_File->GetFrameCount(); ++frameNum) { const FifoFrameInfo &frame = m_File->GetFrame(frameNum); - for (unsigned int i = 0; i < frame.memoryUpdates.size(); ++i) + for (auto& update : frame.memoryUpdates) { - WriteMemory(frame.memoryUpdates[i]); + WriteMemory(update); } } } @@ -310,7 +314,7 @@ void FifoPlayer::SetupFifo() const FifoFrameInfo& frame = m_File->GetFrame(m_CurrentFrame); - // Set fifo bounds + // Set fifo bounds WriteCP(0x20, frame.fifoStart); WriteCP(0x22, frame.fifoStart >> 16); WriteCP(0x24, frame.fifoEnd); @@ -368,7 +372,7 @@ void FifoPlayer::LoadMemory() LoadCPReg(0x80 + i, regs[0x80 + i]); LoadCPReg(0x90 + i, regs[0x90 + i]); } - + for (int i = 0; i < 16; ++i) { LoadCPReg(0xa0 + i, regs[0xa0 + i]); diff --git a/Source/Core/Core/Src/FifoPlayer/FifoPlayer.h b/Source/Core/Core/Src/FifoPlayer/FifoPlayer.h index bad936cca9..b99093f164 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoPlayer.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoPlayer.h @@ -106,7 +106,7 @@ private: FifoDataFile *m_File; - std::vector m_FrameInfo; + std::vector m_FrameInfo; }; #endif diff --git a/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.cpp b/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.cpp index 293e062b2c..d628e9bfbf 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.cpp @@ -60,7 +60,7 @@ void FifoRecordAnalyzer::DecodeOpcode(u8 *data) u32 value = ReadFifo32(data); FifoAnalyzer::LoadCPReg(cmd2, value, m_CpMem); } - + break; case GX_LOAD_XF_REG: @@ -98,7 +98,7 @@ void FifoRecordAnalyzer::DecodeOpcode(u8 *data) u32 cmd2 = ReadFifo32(data); BPCmd bp = FifoAnalyzer::DecodeBPCmd(cmd2, *m_BpMem); - + if (bp.address == BPMEM_LOADTLUT1) ProcessLoadTlut1(); if (bp.address == BPMEM_PRELOAD_MODE) diff --git a/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.h b/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.h index 94e53b17ed..af7d1c997d 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoRecordAnalyzer.h @@ -38,7 +38,7 @@ private: bool m_DrawingObject; BPMemory *m_BpMem; - FifoAnalyzer::CPMemory m_CpMem; + FifoAnalyzer::CPMemory m_CpMem; }; #endif diff --git a/Source/Core/Core/Src/FifoPlayer/FifoRecorder.cpp b/Source/Core/Core/Src/FifoPlayer/FifoRecorder.cpp index 5f3861fd66..e58b34658a 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoRecorder.cpp +++ b/Source/Core/Core/Src/FifoPlayer/FifoRecorder.cpp @@ -22,7 +22,7 @@ FifoRecorder::FifoRecorder() : m_File(NULL), m_SkipNextData(true), m_SkipFutureData(true), - m_FrameEnded(false), + m_FrameEnded(false), m_Ram(NULL), m_ExRam(NULL) { @@ -53,7 +53,7 @@ void FifoRecorder::StartRecording(s32 numFrames, CallbackFunc finishedCb) if (!m_IsRecording) { m_WasRecording = false; - m_IsRecording = true; + m_IsRecording = true; m_RecordFramesRemaining = numFrames; } @@ -75,20 +75,20 @@ void FifoRecorder::WriteGPCommand(u8 *data, u32 size) m_RecordAnalyzer.AnalyzeGPCommand(data); // Copy data to buffer - u32 currentSize = m_FifoData.size(); + size_t currentSize = m_FifoData.size(); m_FifoData.resize(currentSize + size); memcpy(&m_FifoData[currentSize], data, size); } if (m_FrameEnded && m_FifoData.size() > 0) { - u32 dataSize = m_FifoData.size(); - m_CurrentFrame.fifoDataSize = dataSize; + size_t dataSize = m_FifoData.size(); + m_CurrentFrame.fifoDataSize = (u32)dataSize; m_CurrentFrame.fifoData = new u8[dataSize]; - memcpy(m_CurrentFrame.fifoData, &m_FifoData[0], dataSize); + memcpy(m_CurrentFrame.fifoData, m_FifoData.data(), dataSize); sMutex.lock(); - + // Copy frame to file // The file will be responsible for freeing the memory allocated for each frame's fifoData m_File->AddFrame(m_CurrentFrame); @@ -129,14 +129,14 @@ void FifoRecorder::WriteMemory(u32 address, u32 size, MemoryUpdate::Type type) // Record memory update MemoryUpdate memUpdate; memUpdate.address = address; - memUpdate.fifoPosition = m_FifoData.size(); + memUpdate.fifoPosition = (u32)(m_FifoData.size()); memUpdate.size = size; memUpdate.type = type; - memUpdate.data = new u8[size]; + memUpdate.data = new u8[size]; memcpy(memUpdate.data, newData, size); m_CurrentFrame.memoryUpdates.push_back(memUpdate); - } + } } void FifoRecorder::EndFrame(u32 fifoStart, u32 fifoEnd) @@ -149,7 +149,7 @@ void FifoRecorder::EndFrame(u32 fifoStart, u32 fifoEnd) m_CurrentFrame.fifoStart = fifoStart; m_CurrentFrame.fifoEnd = fifoEnd; - + if (m_WasRecording) { // If recording a fixed number of frames then check if the end of the recording was reached diff --git a/Source/Core/Core/Src/FifoPlayer/FifoRecorder.h b/Source/Core/Core/Src/FifoPlayer/FifoRecorder.h index 7641a9d7f1..25cad32579 100644 --- a/Source/Core/Core/Src/FifoPlayer/FifoRecorder.h +++ b/Source/Core/Core/Src/FifoPlayer/FifoRecorder.h @@ -27,7 +27,7 @@ public: void WriteGPCommand(u8 *data, u32 size); void WriteMemory(u32 address, u32 size, MemoryUpdate::Type type); - + void EndFrame(u32 fifoStart, u32 fifoEnd); // This function must be called before writing GP commands diff --git a/Source/Core/Core/Src/GeckoCode.cpp b/Source/Core/Core/Src/GeckoCode.cpp index 252e758746..5e4102474f 100644 --- a/Source/Core/Core/Src/GeckoCode.cpp +++ b/Source/Core/Core/Src/GeckoCode.cpp @@ -145,7 +145,7 @@ bool InstallCodeHandler() u32 codelist_location = 0x800028B8; // Debugger on location (0x800022A8 = Debugger off, using codehandleronly.bin) std::string data; std::string _rCodeHandlerFilename = File::GetSysDirectory() + GECKO_CODE_HANDLER; - if (!File::ReadFileToString(false, _rCodeHandlerFilename.c_str(), data)) + if (!File::ReadFileToString(_rCodeHandlerFilename.c_str(), data)) return false; // Install code handler @@ -154,8 +154,9 @@ bool InstallCodeHandler() // Turn off Pause on start Memory::Write_U32(0, 0x80002774); - // Write the Game ID into the location expected by WiiRD - Memory::WriteBigEData(Memory::GetPointer(0x80000000), 0x80001800, 6); + // Write a magic value to 'gameid' (codehandleronly does not actually read this). + // For the purpose of this, see HLEGeckoCodehandler. + Memory::Write_U32(0xd01f1bad, 0x80001800); // Create GCT in memory Memory::Write_U32(0x00d0c0de, codelist_location); @@ -279,10 +280,7 @@ void RunCodeHandler() { if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats && active_codes.size() > 0) { - u8 *gameId = Memory::GetPointer(0x80000000); - u8 *wiirdId = Memory::GetPointer(0x80001800); - - if (!code_handler_installed || memcmp(gameId, wiirdId, 6)) + if (!code_handler_installed || Memory::Read_U32(0x80001800) - 0xd01f1bad > 5) code_handler_installed = InstallCodeHandler(); if (code_handler_installed) @@ -766,7 +764,7 @@ bool RegisterOps() dst_addr += new_data; else src_addr += new_data; - + while (count--) Memory::Write_U8(Memory::Read_U8(src_addr++), dst_addr++); } @@ -924,7 +922,7 @@ bool SpecialIf() result = (left_val < right_val); break; } - } + } else if (code.subtype & 0x4) { // counters get reset if code execution is off diff --git a/Source/Core/Core/Src/GeckoCode.h b/Source/Core/Core/Src/GeckoCode.h index 59da6fd091..c04005494d 100644 --- a/Source/Core/Core/Src/GeckoCode.h +++ b/Source/Core/Core/Src/GeckoCode.h @@ -52,7 +52,7 @@ namespace Gecko u32 data; //struct //{ - // + // //}; }; @@ -65,7 +65,8 @@ namespace Gecko std::string name, creator; std::vector notes; - bool enabled; + bool enabled; + bool user_defined; bool Compare(GeckoCode compare) const; bool Exist(u32 address, u32 data); diff --git a/Source/Core/Core/Src/GeckoCodeConfig.cpp b/Source/Core/Core/Src/GeckoCodeConfig.cpp index 6d5b1f782f..b6059ef090 100644 --- a/Source/Core/Core/Src/GeckoCodeConfig.cpp +++ b/Source/Core/Core/Src/GeckoCodeConfig.cpp @@ -10,78 +10,95 @@ #include #include -#define GECKO_CODE_INI_SECTION "Gecko" - namespace Gecko { -void LoadCodes(const IniFile& inifile, std::vector& gcodes) +void LoadCodes(const IniFile& globalIni, const IniFile& localIni, std::vector& gcodes) { - std::vector lines; - inifile.GetLines(GECKO_CODE_INI_SECTION, lines, false); - - GeckoCode gcode; - - std::vector::const_iterator - lines_iter = lines.begin(), - lines_end = lines.end(); - for (; lines_iter!=lines_end; ++lines_iter) + const IniFile* inis[] = {&globalIni, &localIni}; + for (size_t i = 0; i < ArraySize(inis); ++i) { - if (lines_iter->empty()) - continue; + std::vector lines; + inis[i]->GetLines("Gecko", lines, false); - std::istringstream ss(*lines_iter); + GeckoCode gcode; - switch ((*lines_iter)[0]) + for (auto& line : lines) { + if (line.empty()) + continue; - // enabled or disabled code - case '+' : - ss.seekg(1); - case '$' : - if (gcode.name.size()) - gcodes.push_back(gcode); - gcode = GeckoCode(); - gcode.enabled = (1 == ss.tellg()); // silly - ss.seekg(1, std::ios_base::cur); - // read the code name - std::getline(ss, gcode.name, '['); // stop at [ character (beginning of contributor name) - gcode.name = StripSpaces(gcode.name); - // read the code creator name - std::getline(ss, gcode.creator, ']'); - break; + std::istringstream ss(line); - // notes - case '*': - gcode.notes.push_back(std::string(++lines_iter->begin(), lines_iter->end())); - break; + switch ((line)[0]) + { + + // enabled or disabled code + case '+' : + ss.seekg(1); + case '$' : + if (gcode.name.size()) + gcodes.push_back(gcode); + gcode = GeckoCode(); + gcode.enabled = (1 == ss.tellg()); // silly + gcode.user_defined = i == 1; + ss.seekg(1, std::ios_base::cur); + // read the code name + std::getline(ss, gcode.name, '['); // stop at [ character (beginning of contributor name) + gcode.name = StripSpaces(gcode.name); + // read the code creator name + std::getline(ss, gcode.creator, ']'); + break; + + // notes + case '*': + gcode.notes.push_back(std::string(++line.begin(), line.end())); + break; + + // either part of the code, or an option choice + default : + { + GeckoCode::Code new_code; + // TODO: support options + new_code.original_line = line; + ss >> std::hex >> new_code.address >> new_code.data; + gcode.codes.push_back(new_code); + } + break; + } - // either part of the code, or an option choice - default : - { - GeckoCode::Code new_code; - // TODO: support options - new_code.original_line = *lines_iter; - ss >> std::hex >> new_code.address >> new_code.data; - gcode.codes.push_back(new_code); - } - break; } + // add the last code + if (gcode.name.size()) + gcodes.push_back(gcode); + + inis[i]->GetLines("Gecko_Enabled", lines, false); + + for (auto line : lines) + { + if (line.size() == 0 || line[0] != '$') + continue; + std::string name = line.substr(1); + for (auto& ogcode : gcodes) + { + if (ogcode.name == name) + ogcode.enabled = true; + } + } } - - // add the last code - if (gcode.name.size()) - gcodes.push_back(gcode); } // used by the SaveGeckoCodes function -void SaveGeckoCode(std::vector& lines, const GeckoCode& gcode) +void SaveGeckoCode(std::vector& lines, std::vector& enabledLines, const GeckoCode& gcode) { - std::string name; - if (gcode.enabled) - name += '+'; + enabledLines.push_back("$" + gcode.name); + + if (!gcode.user_defined) + return; + + std::string name; // save the name name += '$'; @@ -96,7 +113,7 @@ void SaveGeckoCode(std::vector& lines, const GeckoCode& gcode) } lines.push_back(name); - + // save all the code lines std::vector::const_iterator codes_iter = gcode.codes.begin(), @@ -120,16 +137,18 @@ void SaveGeckoCode(std::vector& lines, const GeckoCode& gcode) void SaveCodes(IniFile& inifile, const std::vector& gcodes) { std::vector lines; + std::vector enabledLines; std::vector::const_iterator gcodes_iter = gcodes.begin(), gcodes_end = gcodes.end(); for (; gcodes_iter!=gcodes_end; ++gcodes_iter) { - SaveGeckoCode(lines, *gcodes_iter); + SaveGeckoCode(lines, enabledLines, *gcodes_iter); } - inifile.SetLines(GECKO_CODE_INI_SECTION, lines); + inifile.SetLines("Gecko", lines); + inifile.SetLines("Gecko_Enabled", enabledLines); } }; diff --git a/Source/Core/Core/Src/GeckoCodeConfig.h b/Source/Core/Core/Src/GeckoCodeConfig.h index 1b3d5e5bf9..b4902f4574 100644 --- a/Source/Core/Core/Src/GeckoCodeConfig.h +++ b/Source/Core/Core/Src/GeckoCodeConfig.h @@ -12,7 +12,7 @@ namespace Gecko { -void LoadCodes(const IniFile& inifile, std::vector& gcodes); +void LoadCodes(const IniFile& globalIni, const IniFile& localIni, std::vector& gcodes); void SaveCodes(IniFile& inifile, const std::vector& gcodes); }; diff --git a/Source/Core/Core/Src/HLE/HLE.cpp b/Source/Core/Core/Src/HLE/HLE.cpp index 852cb756bf..24180fc6b5 100644 --- a/Source/Core/Core/Src/HLE/HLE.cpp +++ b/Source/Core/Core/Src/HLE/HLE.cpp @@ -38,60 +38,11 @@ struct SPatch int flags; }; -static const SPatch OSPatches[] = -{ +static const SPatch OSPatches[] = +{ { "FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - // speedup - //{ "OSProtectRange", HLE_Misc::UnimplementedFunctionFalse, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ "THPPlayerGetState", HLE_Misc:THPPlayerGetState, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ "memcpy", HLE_Misc::gc_memcpy, HLE_HOOK_REPLACE, HLE_TYPE_MEMORY }, - //{ "memcmp", HLE_Misc::gc_memcmp, HLE_HOOK_REPLACE, HLE_TYPE_MEMORY }, - //{ "memset", HLE_Misc::gc_memset, HLE_HOOK_REPLACE, HLE_TYPE_MEMORY }, - //{ "memmove", HLE_Misc::gc_memmove, HLE_HOOK_REPLACE, HLE_TYPE_MEMORY }, - - //{ "__div2i", HLE_Misc::div2i, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, // Slower? - //{ "__div2u", HLE_Misc::div2u, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, // Slower? - - //{ "DCFlushRange", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ "DCInvalidateRange", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ "DCZeroRange", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - - // debug out is very nice ;) - { "OSReport", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "WUD_DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "OSPanic", HLE_OS::HLE_OSPanic, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "vprintf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "printf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "puts", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // gcc-optimized printf? - { "___blank(char *,...)", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // used for early init things (normally) - { "___blank", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - { "__write_console", HLE_OS::HLE_write_console, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // used by sysmenu (+more?) - - // wii only - //{ "__OSInitAudioSystem", HLE_Misc::UnimplementedFunction, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - - // Super Monkey Ball - no longer needed. - //{ ".evil_vec_cosine", HLE_Misc::SMB_EvilVecCosine, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".evil_normalize", HLE_Misc::SMB_EvilNormalize, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".evil_vec_setlength", HLE_Misc::SMB_evil_vec_setlength, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".evil_vec_something", HLE_Misc::FZero_evil_vec_normalize, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, { "PanicAlert", HLE_Misc::HLEPanicAlert, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, - //{ ".sqrt_internal_needs_cr1", HLE_Misc::SMB_sqrt_internal, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".rsqrt_internal_needs_cr1", HLE_Misc::SMB_rsqrt_internal, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".atan2", HLE_Misc::SMB_atan2HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".sqrt_fz", HLE_Misc::FZ_sqrtHLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - - // F-zero still isn't working correctly, but these aren't really helping. - - //{ ".sqrt_internal_fz", HLE_Misc::FZ_sqrt_internal, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - //{ ".rsqrt_internal_fz", HLE_Misc::FZ_rsqrt_internal, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - - //{ ".kill_infinites", HLE_Misc::FZero_kill_infinites, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - // special - // { "GXPeekZ", HLE_Misc::GXPeekZHLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, - // { "GXPeekARGB", HLE_Misc::GXPeekARGBHLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, // Name doesn't matter, installed in CBoot::BootUp() { "HBReload", HLE_Misc::HBReload, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, @@ -100,11 +51,24 @@ static const SPatch OSPatches[] = { "__OSBootDol", HLE_Misc::OSBootDol, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, { "OSGetResetCode", HLE_Misc::OSGetResetCode, HLE_HOOK_REPLACE, HLE_TYPE_GENERIC }, + // Debug/OS Support + { "OSPanic", HLE_OS::HLE_OSPanic, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + + { "OSReport", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "WUD_DEBUGPrint", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "vprintf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "printf", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "puts", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // gcc-optimized printf? + { "___blank(char *,...)", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // used for early init things (normally) + { "___blank", HLE_OS::HLE_GeneralDebugPrint, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, + { "__write_console", HLE_OS::HLE_write_console, HLE_HOOK_REPLACE, HLE_TYPE_DEBUG }, // used by sysmenu (+more?) + { "GeckoCodehandler", HLE_Misc::HLEGeckoCodehandler, HLE_HOOK_START, HLE_TYPE_GENERIC }, }; static const SPatch OSBreakPoints[] = { - { "FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction }, + { "FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction }, }; void Patch(u32 addr, const char *hle_func_name) diff --git a/Source/Core/Core/Src/HLE/HLE.h b/Source/Core/Core/Src/HLE/HLE.h index 32b79268b7..6c4c46ff4b 100644 --- a/Source/Core/Core/Src/HLE/HLE.h +++ b/Source/Core/Core/Src/HLE/HLE.h @@ -6,7 +6,7 @@ #define _HLE_H #include -#include "Common.h" +#include "CommonTypes.h" namespace HLE { diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.cpp b/Source/Core/Core/Src/HLE/HLE_Misc.cpp index c8323ca6c4..9b8754daf7 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.cpp +++ b/Source/Core/Core/Src/HLE/HLE_Misc.cpp @@ -17,6 +17,7 @@ #include "IPC_HLE/WII_IPC_HLE_Device_usb.h" #include "HLE.h" #include "PowerPC/PPCAnalyst.h" +#include "PowerPC/PPCCache.h" #include "PowerPC/SignatureDB.h" #include "PowerPC/PPCSymbolDB.h" #include "CommonPaths.h" @@ -27,21 +28,6 @@ namespace HLE_Misc std::string args; u32 argsPtr; -u32 bootType; - -// Helper to quickly read the floating point value at a memory location. -inline float F(u32 addr) -{ - u32 mem = Memory::ReadFast32(addr); - return *((float*)&mem); -} - -// Helper to quickly write a floating point value to a memory location. -inline void FW(u32 addr, float x) -{ - u32 data = *((u32*)&x); - Memory::WriteUnchecked_U32(data, addr); -} // If you just want to kill a function, one of the three following are usually appropriate. // According to the PPC ABI, the return value is always in r3. @@ -50,32 +36,6 @@ void UnimplementedFunction() NPC = LR; } -void UnimplementedFunctionTrue() -{ - GPR(3) = 1; - NPC = LR; -} - -void UnimplementedFunctionFalse() -{ - GPR(3) = 0; - NPC = LR; -} - -void GXPeekZ() -{ - // Just some fake Z value. - Memory::Write_U32(0xFFFFFF, GPR(5)); - NPC = LR; -} - -void GXPeekARGB() -{ - // Just some fake color value. - Memory::Write_U32(0xFFFFFFFF, GPR(5)); - NPC = LR; -} - // If you want a function to panic, you can rename it PanicAlert :p // Don't know if this is worth keeping. void HLEPanicAlert() @@ -84,200 +44,6 @@ void HLEPanicAlert() NPC = LR; } -// Computes the cosine of the angle between the two fvec3s pointed at by r3 and r4. -void SMB_EvilVecCosine() -{ - u32 r3 = GPR(3); - u32 r4 = GPR(4); - - float x1 = F(r3); - float y1 = F(r3 + 4); - float z1 = F(r3 + 8); - - float x2 = F(r4); - float y2 = F(r4 + 4); - float z2 = F(r4 + 8); - - float s1 = x1*x1 + y1*y1 + z1*z1; - float s2 = x2*x2 + y2*y2 + z2*z2; - - float dot = x1*x2 + y1*y2 + z1*z2; - - rPS0(1) = dot / sqrtf(s1 * s2); - NPC = LR; -} - -// Normalizes the vector pointed at by r3. -void SMB_EvilNormalize() -{ - u32 r3 = GPR(3); - float x = F(r3); - float y = F(r3 + 4); - float z = F(r3 + 8); - float len = x*x + y*y + z*z; - float inv_len; - if (len <= 0) - inv_len = 0; - else - inv_len = 1.0f / sqrtf(len); - x *= inv_len; - y *= inv_len; - z *= inv_len; - FW(r3, x); - FW(r3 + 4, y); - FW(r3 + 8, z); - NPC = LR; -} - -// Scales the vector pointed at by r3 to the length specified by f0. -// Writes results to vector pointed at by r4. -void SMB_evil_vec_setlength() -{ - u32 r3 = GPR(3); - u32 r4 = GPR(4); - float x = F(r3); - float y = F(r3 + 4); - float z = F(r3 + 8); - float inv_len = (float)(rPS0(0) / sqrt(x*x + y*y + z*z)); - x *= inv_len; - y *= inv_len; - z *= inv_len; - FW(r4, x); - FW(r4 + 4, y); - FW(r4 + 8, z); - NPC = LR; -} - -// Internal square root function in the crazy math lib. Acts a bit odd, just read it. It's not a bug :p -void SMB_sqrt_internal() -{ - double f = sqrt(rPS0(1)); - rPS0(0) = rPS0(1); - rPS1(0) = rPS0(1); - rPS0(1) = f; - rPS1(1) = f; - NPC = LR; -} - -// Internal inverse square root function in the crazy math lib. -void SMB_rsqrt_internal() -{ - double f = 1.0 / sqrt(rPS0(1)); - rPS0(1) = f; - rPS1(1) = f; - NPC = LR; -} - -void SMB_atan2() -{ - // in: f1 = x, f2 = y - // out: r3 = angle - double angle = atan2(rPS0(1), rPS0(2)); - int angle_fixpt = (int)(angle / 3.14159 * 32767); - if (angle_fixpt < -32767) angle_fixpt = -32767; - if (angle_fixpt > 32767) angle_fixpt = 32767; - GPR(3) = angle_fixpt; - NPC = LR; -} - - -// F-zero math lib range: 8006d044 - 8006f770 - -void FZero_kill_infinites() -{ - // TODO: Kill infinites in FPR(1) - - NPC = LR; -} - -void FZ_sqrt() { - u32 r3 = GPR(3); - double x = rPS0(0); - x = sqrt(x); - FW(r3, (float)x); - rPS0(0) = x; - NPC = LR; -} - -// Internal square root function in the crazy math lib. Acts a bit odd, just read it. It's not a bug :p -void FZ_sqrt_internal() -{ - double f = sqrt(rPS0(1)); - rPS0(0) = rPS0(1); - rPS1(0) = rPS0(1); - rPS0(1) = f; - rPS1(1) = f; - NPC = LR; -} - -// Internal inverse square root function in the crazy math lib. -void FZ_rsqrt_internal() -{ - double f = 1.0 / sqrt(rPS0(1)); - rPS0(1) = f; - rPS1(1) = f; - NPC = LR; -} - -void FZero_evil_vec_normalize() -{ - u32 r3 = GPR(3); - float x = F(r3); - float y = F(r3 + 4); - float z = F(r3 + 8); - float sq_len = x*x + y*y + z*z; - float inv_len = 1.0f / sqrtf(sq_len); - x *= inv_len; - y *= inv_len; - z *= inv_len; - FW(r3, x); - FW(r3 + 4, y); - FW(r3 + 8, z); - rPS0(1) = inv_len * sq_len; // len - rPS1(1) = inv_len * sq_len; // len - NPC = LR; - - /* -.evil_vec_something - -(f6, f7, f8) <- [r3] -f1 = f6 * f6 -f1 += f7 * f7 -f1 += f8 * f8 -f2 = mystery -f4 = f2 * f1 -f3 = f2 + f2 -f1 = 1/f0 - -f6 *= f1 -f7 *= f1 -f8 *= f1 - -8006d668: lis r5, 0xE000 -8006d684: lfs f2, 0x01A0 (r5) -8006d69c: fmr f0,f2 -8006d6a0: fmuls f4,f2,f1 -8006d6a4: fadds f3,f2,f2 -8006d6a8: frsqrte f1,f0,f1 -8006d6ac: fadds f3,f3,f2 -8006d6b0: fmuls f5,f1,f1 -8006d6b4: fnmsubs f5,f5,f4,f3 -8006d6b8: fmuls f1,f1,f5 -8006d6bc: fmuls f5,f1,f1 -8006d6c0: fnmsubs f5,f5,f4,f3 -8006d6c4: fmuls f1,f1,f5 -8006d6c8: fmuls f6,f6,f1 -8006d6cc: stfs f6, 0 (r3) -8006d6d0: fmuls f7,f7,f1 -8006d6d4: stfs f7, 0x0004 (r3) -8006d6d8: fmuls f8,f8,f1 -8006d6dc: stfs f8, 0x0008 (r3) -8006d6e0: fmuls f1,f1,f0 -8006d6e4: blr -*/ - NPC = LR; -} - void HBReload() { // There isn't much we can do. Just stop cleanly. @@ -403,89 +169,39 @@ u32 GetDolFileSize(std::string dol) return (u32)pFileSystem->GetFileSize(dolFile.c_str()); } -void gc_memmove() -{ - u32 dest = GPR(3); - u32 src = GPR(4); - u32 count = GPR(5); - memmove((u8*)(Memory::base + dest), (u8*)(Memory::base + src), count); - NPC = LR; -} - -void gc_memcpy() -{ - u32 dest = GPR(3); - u32 src = GPR(4); - u32 count = GPR(5); - memcpy((u8*)(Memory::base + dest), (u8*)(Memory::base + src), count); - NPC = LR; -} - -void gc_memset() -{ - u32 dest = GPR(3); - u32 ch = GPR(4); - u32 count = GPR(5); - memset((u8*)(Memory::base + dest), ch, count); - NPC = LR; -} - -void gc_memcmp() -{ - u32 dest = GPR(3); - u32 src = GPR(4); - u32 count = GPR(5); - GPR(3) = memcmp((u8*)(Memory::base + dest), (u8*)(Memory::base + src), count); - NPC = LR; -} - -void div2i() -{ - s64 num = (s64)(GPR(3)) << 32 | GPR(4); - s64 den = (s64)(GPR(5)) << 32 | GPR(6); - s64 quo = num / den; - GPR(3) = quo >> 32; - GPR(4) = quo & 0xffffffff; - NPC = LR; -} - -void div2u() -{ - u64 num = (u64)(GPR(3)) << 32 | GPR(4); - u64 den = (u64)(GPR(5)) << 32 | GPR(6); - u64 quo = num / den; - GPR(3) = quo >> 32; - GPR(4) = quo & 0xffffffff; - NPC = LR; -} - -void OSGetResetCode() -{ - u32 resetCode = Memory::Read_U32(0xCC003024); - - if ((resetCode & 0x1fffffff) != 0) - { - GPR(3) = resetCode | 0x80000000; - } - else - { - GPR(3) = 0; - } - - NPC = LR; -} - u16 GetIOSVersion() { return Memory::Read_U16(0x00003140); } +void OSGetResetCode() +{ + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) + { + u32 resetCode = Memory::Read_U32(0xCC003024); + + if ((resetCode & 0x1fffffff) != 0) + { + GPR(3) = resetCode | 0x80000000; + } + else + { + GPR(3) = 0; + } + + NPC = LR; + } + else + { + HLE::UnPatch("OSGetResetCode"); + NPC = PC; + } +} + void OSBootDol() { - if (GetIOSVersion() >= 30) + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && GetIOSVersion() >= 30) { - bootType = GPR(4); - if ((GPR(4) >> 28) == 0x8) { u32 resetCode = GPR(30); @@ -535,4 +251,26 @@ void OSBootDol() NPC = PC; } +void HLEGeckoCodehandler() +{ + // Work around the codehandler not properly invalidating the icache, but + // only the first few frames. + // (Project M uses a conditional to only apply patches after something has + // been read into memory, or such, so we do the first 5 frames. More + // robust alternative would be to actually detect memory writes, but that + // would be even uglier.) + u32 magic = 0xd01f1bad; + u32 existing = Memory::Read_U32(0x80001800); + if (existing - magic == 5) + { + return; + } + else if(existing - magic > 5) + { + existing = magic; + } + Memory::Write_U32(existing + 1, 0x80001800); + PowerPC::ppcState.iCache.Reset(); +} + } diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.h b/Source/Core/Core/Src/HLE/HLE_Misc.h index e83805d23a..bc3acd143f 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.h +++ b/Source/Core/Core/Src/HLE/HLE_Misc.h @@ -7,34 +7,12 @@ namespace HLE_Misc { - void Pass(); void HLEPanicAlert(); void UnimplementedFunction(); - void UnimplementedFunctionTrue(); - void UnimplementedFunctionFalse(); - void GXPeekZ(); - void GXPeekARGB(); - void SMB_EvilVecCosine(); - void SMB_EvilNormalize(); - void SMB_sqrt_internal(); - void SMB_rsqrt_internal(); - void SMB_atan2(); - void SMB_evil_vec_setlength(); - void FZero_kill_infinites(); - void FZero_evil_vec_normalize(); - void FZ_sqrt(); - void FZ_sqrt_internal(); - void FZ_rsqrt_internal(); void HBReload(); void OSBootDol(); void OSGetResetCode(); - void memcpy(); - void memset(); - void memmove(); - void memcmp(); - void div2i(); - void div2u(); - void ExecuteDOL(u8* dolFile, u32 fileSize); + void HLEGeckoCodehandler(); } #endif diff --git a/Source/Core/Core/Src/HLE/HLE_OS.cpp b/Source/Core/Core/Src/HLE/HLE_OS.cpp index 3b2e7a1533..ed80a68154 100644 --- a/Source/Core/Core/Src/HLE/HLE_OS.cpp +++ b/Source/Core/Core/Src/HLE/HLE_OS.cpp @@ -32,11 +32,44 @@ void HLE_OSPanic() void HLE_GeneralDebugPrint() { std::string ReportMessage; - GetStringVA(ReportMessage); + if(*(u32*)Memory::GetPointer(GPR(3)) > 0x80000000){ + GetStringVA(ReportMessage, 4); + }else{ + GetStringVA(ReportMessage); + } NPC = LR; //PanicAlert("(%08x->%08x) %s", LR, PC, ReportMessage.c_str()); - NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); + NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); +} + +void HLE_VPrintf() +{ + std::string ReportMessage; + u32 r4 = GPR(4); + u32 offset = Memory::Read_U32(r4+8); + u32 check = Memory::Read_U32(r4); + //NOTICE_LOG(OSREPORT, "Offset: %08X, Check %08X", offset, check); + for(int i = 4; i<= 10; i++){ + GPR(i) = Memory::Read_U32(offset+(i-(check == 0x01000000? 3 : 2))*4); + //NOTICE_LOG(OSREPORT, "r%d: %08X",i, GPR(i)); + } + + GetStringVA(ReportMessage); + + NPC = LR; + + NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); +} +// Generalized func for just printing string pointed to by r3. +void HLE_GeneralDebugPrintWithInt() +{ + std::string ReportMessage; + GetStringVA(ReportMessage, 5); + NPC = LR; + + //PanicAlert("(%08x->%08x) %s", LR, PC, ReportMessage.c_str()); + NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); } // __write_console is slightly abnormal @@ -47,14 +80,14 @@ void HLE_write_console() NPC = LR; //PanicAlert("(%08x->%08x) %s", LR, PC, ReportMessage.c_str()); - NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); + NOTICE_LOG(OSREPORT, "%08x->%08x| %s", LR, PC, ReportMessage.c_str()); } void GetStringVA(std::string& _rOutBuffer, u32 strReg) { _rOutBuffer = ""; char ArgumentBuffer[256]; - u32 ParameterCounter = 4; + u32 ParameterCounter = strReg+1; u32 FloatingParameterCounter = 1; char *pString = (char*)Memory::GetPointer(GPR(strReg)); if (!pString) @@ -110,10 +143,10 @@ void GetStringVA(std::string& _rOutBuffer, u32 strReg) _rOutBuffer += StringFromFormat(ArgumentBuffer, Parameter); break; } - + case 'f': { - _rOutBuffer += StringFromFormat(ArgumentBuffer, + _rOutBuffer += StringFromFormat(ArgumentBuffer, rPS0(FloatingParameterCounter)); FloatingParameterCounter++; ParameterCounter--; @@ -133,7 +166,7 @@ void GetStringVA(std::string& _rOutBuffer, u32 strReg) } else { - _rOutBuffer += StringFromFormat("%c", *pString); + _rOutBuffer += StringFromFormat("%c", *pString); pString++; } } diff --git a/Source/Core/Core/Src/HW/AudioInterface.cpp b/Source/Core/Core/Src/HW/AudioInterface.cpp index e9ef2eed03..b86482d58f 100644 --- a/Source/Core/Core/Src/HW/AudioInterface.cpp +++ b/Source/Core/Core/Src/HW/AudioInterface.cpp @@ -88,13 +88,13 @@ union AICR { AICR() { hex = 0;} AICR(u32 _hex) { hex = _hex;} - struct + struct { u32 PSTAT : 1; // sample counter/playback enable u32 AISFR : 1; // AIS Frequency (0=32khz 1=48khz) u32 AIINTMSK : 1; // 0=interrupt masked 1=interrupt enabled u32 AIINT : 1; // audio interrupt status - u32 AIINTVLD : 1; // This bit controls whether AIINT is affected by the Interrupt Timing register + u32 AIINTVLD : 1; // This bit controls whether AIINT is affected by the Interrupt Timing register // matching the sample counter. Once set, AIINT will hold its last value u32 SCRESET : 1; // write to reset counter u32 AIDFR : 1; // AID Frequency (0=48khz 1=32khz) @@ -206,7 +206,7 @@ void Write32(const u32 _Value, const u32 _Address) case AI_CONTROL_REGISTER: { AICR tmpAICtrl(_Value); - + m_Control.AIINTMSK = tmpAICtrl.AIINTMSK; m_Control.AIINTVLD = tmpAICtrl.AIINTVLD; @@ -250,7 +250,7 @@ void Write32(const u32 _Value, const u32 _Address) } // Sample Count Reset - if (tmpAICtrl.SCRESET) + if (tmpAICtrl.SCRESET) { DEBUG_LOG(AUDIO_INTERFACE, "Reset AIS sample counter"); m_SampleCounter = 0; @@ -360,7 +360,7 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples static s16 l1 = 0; static s16 l2 = 0; - + if ( frac >= 0x10000 || frac == 0) { frac &= 0xffff; @@ -388,7 +388,7 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples } else //1:1 no resampling - { + { pcm_l = (((int)pcm[pos*2] * lvolume) >> 8) + (int)(*_pDestBuffer); if (pcm_l > 32767) pcm_l = 32767; else if (pcm_l < -32767) pcm_l = -32767; @@ -398,11 +398,11 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples if (pcm_r > 32767) pcm_r = 32767; else if (pcm_r < -32767) pcm_r = -32767; *_pDestBuffer++ = pcm_r; - + pos++; } - if (pos == NGCADPCM::SAMPLES_PER_BLOCK) + if (pos == NGCADPCM::SAMPLES_PER_BLOCK) pos = 0; } } diff --git a/Source/Core/Core/Src/HW/BBA-TAP/TAP_Unix.cpp b/Source/Core/Core/Src/HW/BBA-TAP/TAP_Unix.cpp index 97c73eeb40..1140ef72e0 100644 --- a/Source/Core/Core/Src/HW/BBA-TAP/TAP_Unix.cpp +++ b/Source/Core/Core/Src/HW/BBA-TAP/TAP_Unix.cpp @@ -88,7 +88,7 @@ void CEXIETHERNET::Deactivate() } bool CEXIETHERNET::IsActivated() -{ +{ #ifdef __linux__ return fd != -1 ? true : false; #else @@ -96,7 +96,7 @@ bool CEXIETHERNET::IsActivated() #endif } -bool CEXIETHERNET::SendFrame(u8* frame, u32 size) +bool CEXIETHERNET::SendFrame(u8* frame, u32 size) { #ifdef __linux__ INFO_LOG(SP1, "SendFrame %x\n%s", size, ArrayToString(frame, size, 0x10).c_str()); diff --git a/Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp b/Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp index e5d2b7be64..dd7ad20d5b 100644 --- a/Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp +++ b/Source/Core/Core/Src/HW/BBA-TAP/TAP_Win32.cpp @@ -95,7 +95,7 @@ bool GetGUIDs(std::vector>& guids) if (status != ERROR_SUCCESS) return false; - + while (!found_all) { TCHAR enum_name[256]; @@ -193,7 +193,7 @@ bool CEXIETHERNET::Activate() } if (mHAdapter == INVALID_HANDLE_VALUE) { - ERROR_LOG(SP1, "Failed to open any TAP"); + PanicAlert("Failed to open any TAP"); return false; } @@ -240,7 +240,7 @@ void CEXIETHERNET::Deactivate() } bool CEXIETHERNET::IsActivated() -{ +{ return mHAdapter != INVALID_HANDLE_VALUE; } @@ -266,14 +266,14 @@ bool CEXIETHERNET::SendFrame(u8 *frame, u32 size) // Always report the packet as being sent successfully, even though it might be a lie SendComplete(); - + return true; } VOID CALLBACK CEXIETHERNET::ReadWaitCallback(PVOID lpParameter, BOOLEAN TimerFired) { CEXIETHERNET* self = (CEXIETHERNET*)lpParameter; - + GetOverlappedResult(self->mHAdapter, &self->mReadOverlapped, (LPDWORD)&self->mRecvBufferLength, false); @@ -332,7 +332,7 @@ void CEXIETHERNET::RecvStop() return; UnregisterWaitEx(mHReadWait, INVALID_HANDLE_VALUE); - + CloseHandle(mHRecvEvent); mHRecvEvent = INVALID_HANDLE_VALUE; } diff --git a/Source/Core/Core/Src/HW/CPU.cpp b/Source/Core/Core/Src/HW/CPU.cpp index 15d1cf12f2..dc81955f13 100644 --- a/Source/Core/Core/Src/HW/CPU.cpp +++ b/Source/Core/Core/Src/HW/CPU.cpp @@ -18,20 +18,20 @@ namespace { static Common::Event m_StepEvent; - static Common::Event *m_SyncEvent; + static Common::Event *m_SyncEvent = NULL; static std::mutex m_csCpuOccupied; } void CCPU::Init(int cpu_core) { PowerPC::Init(cpu_core); - m_SyncEvent = 0; + m_SyncEvent = NULL; } void CCPU::Shutdown() { PowerPC::Shutdown(); - m_SyncEvent = 0; + m_SyncEvent = NULL; } void CCPU::Run() @@ -68,14 +68,14 @@ reswitch: if (m_SyncEvent) { m_SyncEvent->Set(); - m_SyncEvent = 0; + m_SyncEvent = NULL; } Host_UpdateDisasmDialog(); break; case PowerPC::CPU_POWERDOWN: //1: Exit loop!! - return; + return; } } } @@ -96,7 +96,7 @@ void CCPU::Reset() } -void CCPU::StepOpcode(Common::Event *event) +void CCPU::StepOpcode(Common::Event *event) { m_StepEvent.Set(); if (PowerPC::GetState() == PowerPC::CPU_STEPPING) @@ -106,7 +106,7 @@ void CCPU::StepOpcode(Common::Event *event) } void CCPU::EnableStepping(const bool _bStepping) -{ +{ if (_bStepping) { PowerPC::Pause(); @@ -123,7 +123,7 @@ void CCPU::EnableStepping(const bool _bStepping) } } -void CCPU::Break() +void CCPU::Break() { EnableStepping(true); } diff --git a/Source/Core/Core/Src/HW/CPU.h b/Source/Core/Core/Src/HW/CPU.h index 0b5508a94a..219df48370 100644 --- a/Source/Core/Core/Src/HW/CPU.h +++ b/Source/Core/Core/Src/HW/CPU.h @@ -14,7 +14,7 @@ namespace Common { class CCPU { public: - // init + // init static void Init(int cpu_core); // shutdown @@ -24,7 +24,7 @@ public: static void Run(); // causes shutdown - static void Stop(); + static void Stop(); // Reset static void Reset(); @@ -35,7 +35,7 @@ public: static void SingleStep(); // Enable or Disable Stepping - static void EnableStepping(const bool _bStepping); + static void EnableStepping(const bool _bStepping); // break, same as EnableStepping(true). static void Break(); diff --git a/Source/Core/Core/Src/HW/DSP.cpp b/Source/Core/Core/Src/HW/DSP.cpp index 3ef62e5aaa..51ca22d388 100644 --- a/Source/Core/Core/Src/HW/DSP.cpp +++ b/Source/Core/Core/Src/HW/DSP.cpp @@ -554,7 +554,7 @@ void Read32(u32& _uReturnValue, const u32 _iAddress) case AR_DMA_CNT_H: _uReturnValue = g_arDMA.Cnt.Hex; break; - + case AR_DMA_MMADDR_H: _uReturnValue = g_arDMA.MMAddr; break; @@ -592,7 +592,7 @@ void Write32(const u32 _iValue, const u32 _iAddress) g_arDMA.ARAddr = _iValue & ~31; break; - case AR_DMA_CNT_H: + case AR_DMA_CNT_H: g_arDMA.Cnt.Hex = _iValue & ~31; Do_ARAM_DMA(); break; @@ -665,7 +665,7 @@ void UpdateAudioDMA() // external audio fifo in the emulator, to be mixed with the disc // streaming output. If that audio queue fills up, we delay the // emulator. - + g_audioDMA.BlocksLeft--; g_audioDMA.ReadAddress += 32; @@ -811,10 +811,10 @@ u8 ReadARAM(u32 _iAddress) { //NOTICE_LOG(DSPINTERFACE, "ReadARAM 0x%08x", _iAddress); if (g_ARAM.wii_mode) - { + { if (_iAddress & 0x10000000) return g_ARAM.ptr[_iAddress & g_ARAM.mask]; - else + else return Memory::Read_U8(_iAddress & Memory::RAM_MASK); } else diff --git a/Source/Core/Core/Src/HW/DSP.h b/Source/Core/Core/Src/HW/DSP.h index 68d83edabb..8feabf4876 100644 --- a/Source/Core/Core/Src/HW/DSP.h +++ b/Source/Core/Core/Src/HW/DSP.h @@ -38,7 +38,7 @@ void GenerateDSPInterruptFromDSPEmu(DSPInterruptType _DSPInterruptType, bool _bS // Read32 void Read16(u16& _uReturnValue, const u32 _uAddress); -void Read32(u32& _uReturnValue, const u32 _uAddress); +void Read32(u32& _uReturnValue, const u32 _uAddress); // Write void Write16(const u16 _uValue, const u32 _uAddress); diff --git a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp index 71c43a0302..501bc2a0dd 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp @@ -253,7 +253,7 @@ void DSPHLE::DSP_WriteMailBoxLow(bool _CPUMailbox, unsigned short _Value) m_dspState.CPUMailbox = (m_dspState.CPUMailbox & 0xFFFF0000) | _Value; SendMailToDSP(m_dspState.CPUMailbox); // Mail sent so clear MSB to show that it is progressed - m_dspState.CPUMailbox &= 0x7FFFFFFF; + m_dspState.CPUMailbox &= 0x7FFFFFFF; } else { @@ -334,5 +334,5 @@ void DSPHLE::DSP_ClearAudioBuffer(bool mute) void DSPHLE::PauseAndLock(bool doLock, bool unpauseOnUnlock) { if (doLock || unpauseOnUnlock) - DSP_ClearAudioBuffer(doLock); + DSP_ClearAudioBuffer(doLock); } diff --git a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h index f53d4f7d1b..6627b9dc2a 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h +++ b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h @@ -16,24 +16,24 @@ class DSPHLE : public DSPEmulator { public: DSPHLE(); - virtual bool Initialize(void *hWnd, bool bWii, bool bDSPThread); - virtual void Shutdown(); - virtual bool IsLLE() { return false; } + virtual bool Initialize(void *hWnd, bool bWii, bool bDSPThread) override; + virtual void Shutdown() override; + virtual bool IsLLE() override { return false ; } - virtual void DoState(PointerWrap &p); - virtual void PauseAndLock(bool doLock, bool unpauseOnUnlock=true); + virtual void DoState(PointerWrap &p) override; + virtual void PauseAndLock(bool doLock, bool unpauseOnUnlock=true) override; - virtual void DSP_WriteMailBoxHigh(bool _CPUMailbox, unsigned short); - virtual void DSP_WriteMailBoxLow(bool _CPUMailbox, unsigned short); - virtual unsigned short DSP_ReadMailBoxHigh(bool _CPUMailbox); - virtual unsigned short DSP_ReadMailBoxLow(bool _CPUMailbox); - virtual unsigned short DSP_ReadControlRegister(); - virtual unsigned short DSP_WriteControlRegister(unsigned short); - virtual void DSP_SendAIBuffer(unsigned int address, unsigned int num_samples); - virtual void DSP_Update(int cycles); - virtual void DSP_StopSoundStream(); - virtual void DSP_ClearAudioBuffer(bool mute); - virtual u32 DSP_UpdateRate(); + virtual void DSP_WriteMailBoxHigh(bool _CPUMailbox, unsigned short) override; + virtual void DSP_WriteMailBoxLow(bool _CPUMailbox, unsigned short) override; + virtual unsigned short DSP_ReadMailBoxHigh(bool _CPUMailbox) override; + virtual unsigned short DSP_ReadMailBoxLow(bool _CPUMailbox) override; + virtual unsigned short DSP_ReadControlRegister() override; + virtual unsigned short DSP_WriteControlRegister(unsigned short) override; + virtual void DSP_SendAIBuffer(unsigned int address, unsigned int num_samples) override; + virtual void DSP_Update(int cycles) override; + virtual void DSP_StopSoundStream() override; + virtual void DSP_ClearAudioBuffer(bool mute) override; + virtual u32 DSP_UpdateRate() override; CMailHandler& AccessMailHandler() { return m_MailHandler; } @@ -47,9 +47,8 @@ private: void InitMixer(); // Declarations and definitions - void *m_hWnd; bool m_bWii; - + bool m_InitMixer; // Fake mailbox utility diff --git a/Source/Core/Core/Src/HW/DSPHLE/HLEMixer.h b/Source/Core/Core/Src/HW/DSPHLE/HLEMixer.h index 3d0369d452..d19291d567 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/HLEMixer.h +++ b/Source/Core/Core/Src/HW/DSPHLE/HLEMixer.h @@ -9,13 +9,13 @@ class DSPHLE; -class HLEMixer : public CMixer +class HLEMixer : public CMixer { public: HLEMixer(DSPHLE *dsp_hle, unsigned int AISampleRate = 48000, unsigned int DACSampleRate = 48000, unsigned int BackendSampleRate = 32000) : CMixer(AISampleRate, DACSampleRate, BackendSampleRate), m_DSPHLE(dsp_hle) {}; - - virtual void Premix(short *samples, unsigned int numSamples); + + virtual void Premix(short *samples, unsigned int numSamples) override; private: DSPHLE *m_DSPHLE; }; diff --git a/Source/Core/Core/Src/HW/DSPHLE/MailHandler.h b/Source/Core/Core/Src/HW/DSPHLE/MailHandler.h index efc512012f..b203c8c587 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/MailHandler.h +++ b/Source/Core/Core/Src/HW/DSPHLE/MailHandler.h @@ -26,7 +26,7 @@ public: u16 ReadDSPMailboxLow(); u32 GetNextMail() - { + { if (m_Mails.size()) { return m_Mails.front(); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp index 411624a714..2be8ce4b87 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp @@ -14,7 +14,7 @@ CUCode_AX::CUCode_AX(DSPHLE* dsp_hle, u32 crc) : IUCode(dsp_hle, crc) , m_work_available(false) , m_cmdlist_size(0) - , m_run_on_thread(SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread) + , m_run_on_thread(false) { WARN_LOG(DSPHLE, "Instantiating CUCode_AX: crc=%08x", crc); m_rMailHandler.PushMail(DSP_INIT); @@ -22,6 +22,9 @@ CUCode_AX::CUCode_AX(DSPHLE* dsp_hle, u32 crc) LoadResamplingCoefficients(); + // DSP HLE on thread is always disabled because it causes audio + // issues/glitching (different timing characteristics). m_run_on_thread is + // always false. if (m_run_on_thread) m_axthread = std::thread(SpawnAXThread, this); } @@ -69,8 +72,8 @@ void CUCode_AX::LoadResamplingCoefficients() File::IOFile fp(filename, "rb"); fp.ReadBytes(m_coeffs, 0x1000); - for (u32 i = 0; i < 0x800; ++i) - m_coeffs[i] = Common::swap16(m_coeffs[i]); + for (auto& coef : m_coeffs) + coef = Common::swap16(coef); m_coeffs_available = true; } @@ -383,7 +386,7 @@ void CUCode_AX::SetupProcessing(u32 init_addr) }; u32 init_idx = 0; - for (u32 i = 0; i < sizeof (buffers) / sizeof (buffers[0]); ++i) + for (auto& buffer : buffers) { s32 init_val = (s32)((init_data[init_idx] << 16) | init_data[init_idx + 1]); s16 delta = (s16)init_data[init_idx + 2]; @@ -392,13 +395,13 @@ void CUCode_AX::SetupProcessing(u32 init_addr) if (!init_val) { - memset(buffers[i], 0, 5 * 32 * sizeof (int)); + memset(buffer, 0, 5 * 32 * sizeof (int)); } else { for (u32 j = 0; j < 32 * 5; ++j) { - buffers[i][j] = init_val; + buffer[j] = init_val; init_val += delta; } } @@ -498,20 +501,20 @@ void CUCode_AX::MixAUXSamples(int aux_id, u32 write_addr, u32 read_addr) if (write_addr) { int* ptr = (int*)HLEMemory_Get_Pointer(write_addr); - for (u32 i = 0; i < 3; ++i) + for (auto& buffer : buffers) for (u32 j = 0; j < 5 * 32; ++j) - *ptr++ = Common::swap32(buffers[i][j]); + *ptr++ = Common::swap32(buffer[j]); } // Then, we read the new temp from the CPU and add to our current // temp. int* ptr = (int*)HLEMemory_Get_Pointer(read_addr); - for (u32 i = 0; i < 5 * 32; ++i) - m_samples_left[i] += (int)Common::swap32(*ptr++); - for (u32 i = 0; i < 5 * 32; ++i) - m_samples_right[i] += (int)Common::swap32(*ptr++); - for (u32 i = 0; i < 5 * 32; ++i) - m_samples_surround[i] += (int)Common::swap32(*ptr++); + for (auto& sample : m_samples_left) + sample += (int)Common::swap32(*ptr++); + for (auto& sample : m_samples_right) + sample += (int)Common::swap32(*ptr++); + for (auto& sample : m_samples_surround) + sample += (int)Common::swap32(*ptr++); } void CUCode_AX::UploadLRS(u32 dst_addr) @@ -572,10 +575,10 @@ void CUCode_AX::MixAUXBLR(u32 ul_addr, u32 dl_addr) { // Upload AUXB L/R int* ptr = (int*)HLEMemory_Get_Pointer(ul_addr); - for (u32 i = 0; i < 5 * 32; ++i) - *ptr++ = Common::swap32(m_samples_auxB_left[i]); - for (u32 i = 0; i < 5 * 32; ++i) - *ptr++ = Common::swap32(m_samples_auxB_right[i]); + for (auto& sample : m_samples_auxB_left) + *ptr++ = Common::swap32(sample); + for (auto& sample : m_samples_auxB_right) + *ptr++ = Common::swap32(sample); // Mix AUXB L/R to MAIN L/R, and replace AUXB L/R ptr = (int*)HLEMemory_Get_Pointer(dl_addr); @@ -617,14 +620,14 @@ void CUCode_AX::SendAUXAndMix(u32 main_auxa_up, u32 auxb_s_up, u32 main_l_dl, // Upload AUXA LRS int* ptr = (int*)HLEMemory_Get_Pointer(main_auxa_up); - for (u32 i = 0; i < sizeof (up_buffers) / sizeof (up_buffers[0]); ++i) + for (auto& up_buffer : up_buffers) for (u32 j = 0; j < 32 * 5; ++j) - *ptr++ = Common::swap32(up_buffers[i][j]); + *ptr++ = Common::swap32(up_buffer[j]); // Upload AUXB S ptr = (int*)HLEMemory_Get_Pointer(auxb_s_up); - for (u32 i = 0; i < 32 * 5; ++i) - *ptr++ = Common::swap32(m_samples_auxB_surround[i]); + for (auto& sample : m_samples_auxB_surround) + *ptr++ = Common::swap32(sample); // Download buffers and addresses int* dl_buffers[] = { diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h index 5af2daed12..5539a00820 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h @@ -56,11 +56,11 @@ public: CUCode_AX(DSPHLE* dsp_hle, u32 crc); virtual ~CUCode_AX(); - virtual void HandleMail(u32 mail); - virtual void MixAdd(short* out_buffer, int nsamples); - virtual void Update(int cycles); - virtual void DoState(PointerWrap& p); - u32 GetUpdateMs(); + virtual void HandleMail(u32 mail) override; + virtual void MixAdd(short* out_buffer, int nsamples) override; + virtual void Update(int cycles) override; + virtual void DoState(PointerWrap& p) override; + u32 GetUpdateMs() override; // Needed because StdThread.h std::thread implem does not support member // pointers. TODO(delroth): obsolete. diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXStructs.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXStructs.h index 54a7dce6e9..58039fc2f9 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXStructs.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXStructs.h @@ -237,7 +237,7 @@ struct AXPB u16 is_stream; // 1 = stream, 0 = one shot PBMixer mixer; - PBInitialTimeDelay initial_time_delay; + PBInitialTimeDelay initial_time_delay; PBUpdates updates; PBDpop dpop; PBVolumeEnvelope vol_env; diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp index 63f29c5a33..72e5c4a3fa 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp @@ -21,6 +21,7 @@ CUCode_AXWii::CUCode_AXWii(DSPHLE *dsp_hle, u32 l_CRC) { for (int i = 0; i < 3; ++i) m_last_aux_volumes[i] = 0x8000; + WARN_LOG(DSPHLE, "Instantiating CUCode_AXWii"); m_old_axwii = (l_CRC == 0xfa450138); @@ -279,7 +280,7 @@ void CUCode_AXWii::SetupProcessing(u32 init_addr) }; u32 init_idx = 0; - for (u32 i = 0; i < sizeof (buffers) / sizeof (buffers[0]); ++i) + for (auto& buffer : buffers) { s32 init_val = (s32)((init_data[init_idx] << 16) | init_data[init_idx + 1]); s16 delta = (s16)init_data[init_idx + 2]; @@ -288,13 +289,13 @@ void CUCode_AXWii::SetupProcessing(u32 init_addr) if (!init_val) { - memset(buffers[i].ptr, 0, 3 * buffers[i].samples * sizeof (int)); + memset(buffer.ptr, 0, 3 * buffer.samples * sizeof (int)); } else { - for (u32 j = 0; j < 3 * buffers[i].samples; ++j) + for (u32 j = 0; j < 3 * buffer.samples; ++j) { - buffers[i].ptr[j] = init_val; + buffer.ptr[j] = init_val; init_val += delta; } } @@ -364,7 +365,7 @@ void CUCode_AXWii::GenerateVolumeRamp(u16* output, u16 vol1, u16 vol2, size_t nv for (size_t i = 0; i < nvals; ++i) { curr += (vol2 - vol1) / (float)nvals; - output[i] = curr; + output[i] = (u16) curr; } } @@ -523,19 +524,19 @@ void CUCode_AXWii::MixAUXSamples(int aux_id, u32 write_addr, u32 read_addr, u16 if (write_addr) { int* ptr = (int*)HLEMemory_Get_Pointer(write_addr); - for (u32 i = 0; i < 3; ++i) + for (auto& buffer : buffers) for (u32 j = 0; j < 3 * 32; ++j) - *ptr++ = Common::swap32(buffers[i][j]); + *ptr++ = Common::swap32(buffer[j]); } // Then read the buffers from the CPU and add to our main buffers. int* ptr = (int*)HLEMemory_Get_Pointer(read_addr); - for (u32 i = 0; i < 3; ++i) + for (auto& main_buffer : main_buffers) for (u32 j = 0; j < 3 * 32; ++j) { s64 sample = (s64)(s32)Common::swap32(*ptr++); sample *= volume_ramp[j]; - main_buffers[i][j] += (s32)(sample >> 15); + main_buffer[j] += (s32)(sample >> 15); } } diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h index 5e8080b97a..a9e6950684 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h @@ -12,9 +12,9 @@ class CUCode_AXWii : public CUCode_AX public: CUCode_AXWii(DSPHLE *dsp_hle, u32 _CRC); virtual ~CUCode_AXWii(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - virtual void DoState(PointerWrap &p); + virtual void DoState(PointerWrap &p) override; protected: // Additional AUX buffers @@ -56,7 +56,7 @@ protected: // but this gives better precision and nicer code. void GenerateVolumeRamp(u16* output, u16 vol1, u16 vol2, size_t nvals); - virtual void HandleCommandList(); + virtual void HandleCommandList() override; void SetupProcessing(u32 init_addr); void AddToLR(u32 val_addr, bool neg); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h index ed65a89fe5..fce6cdf6a2 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX_Voice.h @@ -103,6 +103,7 @@ bool WritePB(u32 addr, const PB_TYPE& pb) return true; } +#if 0 // Dump the value of a PB for debugging #define DUMP_U16(field) WARN_LOG(DSPHLE, " %04x (%s)", pb.field, #field) #define DUMP_U32(field) WARN_LOG(DSPHLE, " %08x (%s)", HILO_TO_32(pb.field), #field) @@ -122,6 +123,7 @@ void DumpPB(const PB_TYPE& pb) // TODO: complete as needed } +#endif // Simulated accelerator state. static u32 acc_loop_addr, acc_end_addr; @@ -467,36 +469,42 @@ void ProcessVoice(PB_TYPE& pb, const AXBuffers& buffers, u16 count, AXMixControl // Mix LRS, AUXA and AUXB depending on mixer_control // TODO: Handle DPL2 on AUXB. - if (mctrl & MIX_L) - MixAdd(buffers.left, samples, count, &pb.mixer.left, &pb.dpop.left, mctrl & MIX_L_RAMP); - if (mctrl & MIX_R) - MixAdd(buffers.right, samples, count, &pb.mixer.right, &pb.dpop.right, mctrl & MIX_R_RAMP); - if (mctrl & MIX_S) - MixAdd(buffers.surround, samples, count, &pb.mixer.surround, &pb.dpop.surround, mctrl & MIX_S_RAMP); +#define MIX_ON(C) (0 != (mctrl & MIX_##C)) +#define RAMP_ON(C) (0 != (mctrl & MIX_##C##_RAMP)) - if (mctrl & MIX_AUXA_L) - MixAdd(buffers.auxA_left, samples, count, &pb.mixer.auxA_left, &pb.dpop.auxA_left, mctrl & MIX_AUXA_L_RAMP); - if (mctrl & MIX_AUXA_R) - MixAdd(buffers.auxA_right, samples, count, &pb.mixer.auxA_right, &pb.dpop.auxA_right, mctrl & MIX_AUXA_R_RAMP); - if (mctrl & MIX_AUXA_S) - MixAdd(buffers.auxA_surround, samples, count, &pb.mixer.auxA_surround, &pb.dpop.auxA_surround, mctrl & MIX_AUXA_S_RAMP); + if (MIX_ON(L)) + MixAdd(buffers.left, samples, count, &pb.mixer.left, &pb.dpop.left, RAMP_ON(L)); + if (MIX_ON(R)) + MixAdd(buffers.right, samples, count, &pb.mixer.right, &pb.dpop.right, RAMP_ON(R)); + if (MIX_ON(S)) + MixAdd(buffers.surround, samples, count, &pb.mixer.surround, &pb.dpop.surround, RAMP_ON(S)); - if (mctrl & MIX_AUXB_L) - MixAdd(buffers.auxB_left, samples, count, &pb.mixer.auxB_left, &pb.dpop.auxB_left, mctrl & MIX_AUXB_L_RAMP); - if (mctrl & MIX_AUXB_R) - MixAdd(buffers.auxB_right, samples, count, &pb.mixer.auxB_right, &pb.dpop.auxB_right, mctrl & MIX_AUXB_R_RAMP); - if (mctrl & MIX_AUXB_S) - MixAdd(buffers.auxB_surround, samples, count, &pb.mixer.auxB_surround, &pb.dpop.auxB_surround, mctrl & MIX_AUXB_S_RAMP); + if (MIX_ON(AUXA_L)) + MixAdd(buffers.auxA_left, samples, count, &pb.mixer.auxA_left, &pb.dpop.auxA_left, RAMP_ON(AUXA_L)); + if (MIX_ON(AUXA_R)) + MixAdd(buffers.auxA_right, samples, count, &pb.mixer.auxA_right, &pb.dpop.auxA_right, RAMP_ON(AUXA_R)); + if (MIX_ON(AUXA_S)) + MixAdd(buffers.auxA_surround, samples, count, &pb.mixer.auxA_surround, &pb.dpop.auxA_surround, RAMP_ON(AUXA_S)); + + if (MIX_ON(AUXB_L)) + MixAdd(buffers.auxB_left, samples, count, &pb.mixer.auxB_left, &pb.dpop.auxB_left, RAMP_ON(AUXB_L)); + if (MIX_ON(AUXB_R)) + MixAdd(buffers.auxB_right, samples, count, &pb.mixer.auxB_right, &pb.dpop.auxB_right, RAMP_ON(AUXB_R)); + if (MIX_ON(AUXB_S)) + MixAdd(buffers.auxB_surround, samples, count, &pb.mixer.auxB_surround, &pb.dpop.auxB_surround, RAMP_ON(AUXB_S)); #ifdef AX_WII - if (mctrl & MIX_AUXC_L) - MixAdd(buffers.auxC_left, samples, count, &pb.mixer.auxC_left, &pb.dpop.auxC_left, mctrl & MIX_AUXC_L_RAMP); - if (mctrl & MIX_AUXC_R) - MixAdd(buffers.auxC_right, samples, count, &pb.mixer.auxC_right, &pb.dpop.auxC_right, mctrl & MIX_AUXC_R_RAMP); - if (mctrl & MIX_AUXC_S) - MixAdd(buffers.auxC_surround, samples, count, &pb.mixer.auxC_surround, &pb.dpop.auxC_surround, mctrl & MIX_AUXC_S_RAMP); + if (MIX_ON(AUXC_L)) + MixAdd(buffers.auxC_left, samples, count, &pb.mixer.auxC_left, &pb.dpop.auxC_left, RAMP_ON(AUXC_L)); + if (MIX_ON(AUXC_R)) + MixAdd(buffers.auxC_right, samples, count, &pb.mixer.auxC_right, &pb.dpop.auxC_right, RAMP_ON(AUXC_R)); + if (MIX_ON(AUXC_S)) + MixAdd(buffers.auxC_surround, samples, count, &pb.mixer.auxC_surround, &pb.dpop.auxC_surround, RAMP_ON(AUXC_S)); #endif +#undef MIX_ON +#undef RAMP_ON + // Optionally, phase shift left or right channel to simulate 3D sound. if (pb.initial_time_delay.on) { @@ -522,8 +530,8 @@ void ProcessVoice(PB_TYPE& pb, const AXBuffers& buffers, u16 count, AXMixControl pb.remote_src.cur_addr_frac = curr_pos & 0xFFFF; // Mix to main[0-3] and aux[0-3] -#define WMCHAN_MIX_ON(n) ((pb.remote_mixer_control >> (2 * n)) & 3) -#define WMCHAN_MIX_RAMP(n) ((pb.remote_mixer_control >> (2 * n)) & 2) +#define WMCHAN_MIX_ON(n) (0 != ((pb.remote_mixer_control >> (2 * n)) & 3)) +#define WMCHAN_MIX_RAMP(n) (0 != ((pb.remote_mixer_control >> (2 * n)) & 2)) if (WMCHAN_MIX_ON(0)) MixAdd(buffers.wm_main0, wm_samples, wm_count, &pb.remote_mixer.main0, &pb.remote_dpop.main0, WMCHAN_MIX_RAMP(0)); @@ -542,6 +550,8 @@ void ProcessVoice(PB_TYPE& pb, const AXBuffers& buffers, u16 count, AXMixControl if (WMCHAN_MIX_ON(7)) MixAdd(buffers.wm_aux3, wm_samples, wm_count, &pb.remote_mixer.aux3, &pb.remote_dpop.aux3, WMCHAN_MIX_RAMP(7)); } +#undef WMCHAN_MIX_RAMP +#undef WMCHAN_MIX_ON #endif } diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h index 831bf63c8e..a1e1bd901a 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h @@ -12,10 +12,10 @@ class CUCode_CARD : public IUCode public: CUCode_CARD(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_CARD(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - void HandleMail(u32 _uMail); - void Update(int cycles); + void HandleMail(u32 _uMail) override; + void Update(int cycles) override; }; #endif diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h index e2e5ddd8bb..61e68a916b 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h @@ -10,8 +10,8 @@ struct CUCode_GBA : public IUCode { CUCode_GBA(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_GBA(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - void HandleMail(u32 _uMail); - void Update(int cycles); + void HandleMail(u32 _uMail) override; + void Update(int cycles) override; }; diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h index 17b74d4b59..79d59ac1bc 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h @@ -12,10 +12,10 @@ class CUCode_InitAudioSystem : public IUCode public: CUCode_InitAudioSystem(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_InitAudioSystem(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - void HandleMail(u32 _uMail); - void Update(int cycles); + void HandleMail(u32 _uMail) override; + void Update(int cycles) override; void Init(); }; diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp index 1c89a1f8f7..2b63bcf29c 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp @@ -2,6 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#ifdef _WIN32 +#include +#endif + #include "UCodes.h" #include "UCode_ROM.h" #include "Hash.h" diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h index e6dbe80f1e..791ba588d5 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h @@ -12,12 +12,12 @@ class CUCode_Rom : public IUCode public: CUCode_Rom(DSPHLE *dsp_hle, u32 _crc); virtual ~CUCode_Rom(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - void HandleMail(u32 _uMail); - void Update(int cycles); + void HandleMail(u32 _uMail) override; + void Update(int cycles) override; - void DoState(PointerWrap &p); + void DoState(PointerWrap &p) override; private: struct SUCode diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp index b1627a0cd7..899a7d902f 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp @@ -18,7 +18,7 @@ CUCode_Zelda::CUCode_Zelda(DSPHLE *dsp_hle, u32 _CRC) - : + : IUCode(dsp_hle, _CRC), m_bSyncInProgress(false), @@ -60,7 +60,7 @@ CUCode_Zelda::CUCode_Zelda(DSPHLE *dsp_hle, u32 _CRC) if (IsLightVersion()) { NOTICE_LOG(DSPHLE, "Luigi Stylee!"); - m_rMailHandler.PushMail(0x88881111); + m_rMailHandler.PushMail(0x88881111); } else { @@ -125,7 +125,7 @@ void CUCode_Zelda::HandleMail(u32 _uMail) void CUCode_Zelda::HandleMail_LightVersion(u32 _uMail) { - //ERROR_LOG(DSPHLE, "Light version mail %08X, list in progress: %s, step: %i/%i", + //ERROR_LOG(DSPHLE, "Light version mail %08X, list in progress: %s, step: %i/%i", // _uMail, m_bListInProgress ? "yes":"no", m_step, m_numSteps); if (m_bSyncCmdPending) @@ -322,7 +322,7 @@ void CUCode_Zelda::HandleMail_NormalVersion(u32 _uMail) m_rMailHandler.PushMail(DSP_SYNC); DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP); m_rMailHandler.PushMail(0xF355FF00 | m_CurBuffer); - + m_CurVoice = 0; if (m_CurBuffer == m_NumBuffers) @@ -371,10 +371,10 @@ void CUCode_Zelda::HandleMail_NormalVersion(u32 _uMail) // - 00000000, 000X0000 - Sync mails // - CDD1XXXX - comes after DsyncFrame completed, seems to be debugging stuff - if (_uMail == 0) + if (_uMail == 0) { m_bSyncInProgress = true; - } + } else if ((_uMail >> 16) == 0) { m_bListInProgress = true; @@ -542,7 +542,7 @@ void CUCode_Zelda::ExecuteList() { if (m_bSyncCmdPending) m_rMailHandler.PushMail(0x80000000 | m_NumBuffers); // after CMD_2 - else + else m_rMailHandler.PushMail(0x80000000 | Sync); // after CMD_0, CMD_1 } else diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h index 29a9678ed2..76f2663317 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h @@ -15,11 +15,11 @@ union ZeldaVoicePB { - struct + struct { // Read-Write part u16 Status; // 0x00 | 1 = play, 0 = stop - u16 KeyOff; // 0x01 | writing 1 stops voice? + u16 KeyOff; // 0x01 | writing 1 stops voice? u16 RatioInt; // 0x02 | Position delta (playback speed) u16 Unk03; // 0x03 | unknown u16 NeedsReset; // 0x04 | indicates if some values in PB need to be reset @@ -48,10 +48,10 @@ union ZeldaVoicePB u16 Unk17; // 0x17 | unknown u16 Unk18[0x10]; // 0x18 | unknown - u16 Unk28; // 0x28 | unknown + u16 Unk28; // 0x28 | unknown u16 Unk29; // 0x29 | unknown // multiplied by 0x2a @ 0d21/ZWW u16 Unk2a; // 0x2A | unknown // loaded at 0d2e/ZWW - u16 Unk2b; // 0x2B | unknown + u16 Unk2b; // 0x2B | unknown u16 VolumeMode; // 0x2C | unknown // See 0337/ZWW u16 Unk2D; // 0x2D | unknown u16 Unk2E; // 0x2E | unknown @@ -75,7 +75,7 @@ union ZeldaVoicePB u16 FilterState1; // 0x78 | unknown // ZWW: 0c84_FilterBufferInPlace loads and stores. Simply, the filter state. u16 FilterState2; // 0x79 | unknown // ZWW: same as above. these two are active if 0x04a8 != 0. u16 Unk7A; // 0x7A | unknown - u16 Unk7B; // 0x7B | unknown + u16 Unk7B; // 0x7B | unknown u16 Unk7C; // 0x7C | unknown u16 Unk7D; // 0x7D | unknown u16 Unk7E; // 0x7E | unknown @@ -120,20 +120,20 @@ class CUCode_Zelda : public IUCode public: CUCode_Zelda(DSPHLE *dsp_hle, u32 _CRC); virtual ~CUCode_Zelda(); - u32 GetUpdateMs(); + u32 GetUpdateMs() override; - void HandleMail(u32 _uMail); + void HandleMail(u32 _uMail) override; void HandleMail_LightVersion(u32 _uMail); void HandleMail_SMSVersion(u32 _uMail); void HandleMail_NormalVersion(u32 _uMail); - void Update(int cycles); - void MixAdd(short* buffer, int size); + void Update(int cycles) override; + void MixAdd(short* buffer, int size) override; void CopyPBsFromRAM(); void CopyPBsToRAM(); - void DoState(PointerWrap &p); + void DoState(PointerWrap &p) override; int *templbuffer; int *temprbuffer; diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp index 1fbfaebaba..3ff7a55546 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp @@ -21,10 +21,10 @@ void CUCode_Zelda::AFCdecodebuffer(const s16 *coef, const char *src, signed shor nibbles[i + 1] = *src & 15; src++; } - for (int i = 0; i < 16; i++) { - if (nibbles[i] >= 8) - nibbles[i] = nibbles[i] - 16; - nibbles[i] <<= 11; + for (auto& nibble : nibbles) { + if (nibble >= 8) + nibble = nibble - 16; + nibble <<= 11; } } else @@ -41,11 +41,11 @@ void CUCode_Zelda::AFCdecodebuffer(const s16 *coef, const char *src, signed shor src++; } - for (int i = 0; i < 16; i++) + for (auto& nibble : nibbles) { - if (nibbles[i] >= 2) - nibbles[i] = nibbles[i] - 4; - nibbles[i] <<= 13; + if (nibble >= 2) + nibble = nibble - 4; + nibble <<= 13; } } @@ -65,4 +65,4 @@ void CUCode_Zelda::AFCdecodebuffer(const s16 *coef, const char *src, signed shor } *histp = hist; *hist2p = hist2; -} +} diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Synth.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Synth.cpp index cc7fd68ea0..261ff64d8e 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Synth.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Synth.cpp @@ -18,9 +18,9 @@ void CUCode_Zelda::RenderSynth_RectWave(ZeldaVoicePB &PB, s32* _Buffer, int _Siz s64 TrueSamplePosition = PB.CurSampleFrac; // PB.Format == 0x3 -> Rectangular Wave, 0x0 -> Square Wave - unsigned int mask = PB.Format ? 3 : 1; + unsigned int mask = PB.Format ? 3 : 1; // int shift = PB.Format ? 2 : 1; // Unused? - + u32 pos[2] = {0, 0}; int i = 0; @@ -55,7 +55,7 @@ _lRestart: } } - while(i < _Size) + while(i < _Size) { s16 sample = ((pos[1] & mask) == mask) ? 0xc000 : 0x4000; @@ -84,12 +84,12 @@ _lRestart: PB.CurSampleFrac = TrueSamplePosition & 0xFFFF; } -void CUCode_Zelda::RenderSynth_SawWave(ZeldaVoicePB &PB, s32* _Buffer, int _Size) +void CUCode_Zelda::RenderSynth_SawWave(ZeldaVoicePB &PB, s32* _Buffer, int _Size) { s32 ratio = (s32)ceil((float)PB.RatioInt / 3); s64 pos = PB.CurSampleFrac; - for (int i = 0; i < _Size; i++) + for (int i = 0; i < _Size; i++) { pos += ratio; _Buffer[i] = pos & 0xFFFF; @@ -161,10 +161,10 @@ void CUCode_Zelda::RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Si address = AddValueToReg(address, ((ACC0 >> 16) & 0xffff)); ACC0 &= 0xffff0000ffffULL; - for(int i = 0; i < 0x50; i++) + for(int i = 0; i < 0x50; i++) { _Buffer[i] = m_MiscTable[address]; - + ACC0 += PB.RatioInt << 5; address = AddValueToReg(address, ((ACC0 >> 16) & 0xffff)); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp index a684bb0c02..ab3a4bef2c 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp @@ -77,7 +77,7 @@ void CUCode_Zelda::Resample(ZeldaVoicePB &PB, int size, s16 *in, s32 *out, bool int ratio = ConvertRatio(PB.RatioInt); int in_size = SizeForResampling(PB, size, ratio); - + int position = PB.CurSampleFrac; for (int i = 0; i < size; i++) { @@ -110,7 +110,7 @@ void CUCode_Zelda::RenderVoice_PCM16(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) if (PB.NeedsReset) { UpdateSampleCounters10(PB); - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) PB.ResamplerOldData[i] = 0; // Doesn't belong here, but dunno where to do it. } if (PB.ReachedEnd) @@ -168,7 +168,7 @@ void CUCode_Zelda::RenderVoice_PCM8(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) if (PB.NeedsReset) { UpdateSampleCounters8(PB); - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) PB.ResamplerOldData[i] = 0; // Doesn't belong here, but dunno where to do it. } if (PB.ReachedEnd) @@ -211,16 +211,15 @@ clear_buffer: PB.CurAddr += rem_samples; } -template -void PrintObject(const T &Obj) +template +void PrintObject(const T &Obj) { std::stringstream ss; u8 *o = (u8 *)&Obj; // If this miscompiles, adjust the size of // ZeldaVoicePB to 0x180 bytes (0xc0 shorts). - CompileTimeAssert ensure_zpb_size_correct; - (void)ensure_zpb_size_correct; + static_assert(sizeof(ZeldaVoicePB) == 0x180, "ZeldaVoicePB incorrectly defined."); ss << std::hex; for (size_t i = 0; i < sizeof(T); i++) @@ -249,11 +248,11 @@ void CUCode_Zelda::RenderVoice_AFC(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) { // This is 0717_ReadOutPBStuff // increment 4fb - // zelda: + // zelda: // perhaps init or "has played before" PB.CurBlock = 0x00; - PB.YN2 = 0x00; // history1 - PB.YN1 = 0x00; // history2 + PB.YN2 = 0x00; // history1 + PB.YN1 = 0x00; // history2 // Length in samples. PB.RemLength = PB.Length; @@ -262,7 +261,7 @@ void CUCode_Zelda::RenderVoice_AFC(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) PB.ReachedEnd = 0; PB.CurSampleFrac = 0; - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) PB.ResamplerOldData[i] = 0; } @@ -301,7 +300,7 @@ restart: PB.KeyOff = 1; PB.RemLength = 0; PB.CurAddr = PB.StartAddr + PB.RestartPos + PB.Length; - + while (sampleCount < _RealSize) _Buffer[sampleCount++] = 0; return; @@ -414,7 +413,7 @@ void CUCode_Zelda::RenderVoice_Raw(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) u64 ACC1 = (u32)(PB.raw[0x34 ^ 1] << 16); // 0x34 // ERROR_LOG(DSPHLE, "%08x %08x", (u32)ACC0, (u32)ACC1); - + ACC0 -= ACC1; PB.Unk36[0] = (u16)(ACC0 >> 16); @@ -462,7 +461,7 @@ void Decoder21_ReadAudio(ZeldaVoicePB &PB, int size, s16 *_Buffer) #endif // ACC0 is the address // ACC1 is the read size - + const u32 ram_mask = 0x1FFFFFF; const u8 *source = Memory::GetPointer(0x80000000); const u16 *src = (u16 *)(source + (ACC0 & ram_mask)); @@ -526,12 +525,12 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ break; case 0x0021: - // Raw sound from RAM. Important for Zelda WW. Cutscenes use the music + // Raw sound from RAM. Important for Zelda WW. Cutscenes use the music // to let the game know they ended RenderVoice_Raw(PB, m_ResampleBuffer + 4, _Size); Resample(PB, _Size, m_ResampleBuffer + 4, m_VoiceBuffer, true); break; - + default: // Second jump table // TODO: Cases to find examples of: @@ -547,7 +546,7 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ RenderSynth_RectWave(PB, m_VoiceBuffer, _Size); break; - case 0x0001: // Example: "Denied" sound when trying to pull out a sword + case 0x0001: // Example: "Denied" sound when trying to pull out a sword // indoors in ZWW RenderSynth_SawWave(PB, m_VoiceBuffer, _Size); break; @@ -578,7 +577,7 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ } ContinueWithBlock: - + if (PB.FilterEnable) { // 0x04a8 for (int i = 0; i < _Size; i++) @@ -591,7 +590,7 @@ ContinueWithBlock: { // TODO? } - + // Apply volume. There are two different modes. if (PB.VolumeMode != 0) { @@ -630,7 +629,7 @@ ContinueWithBlock: } // ZWW 0d34 - + int diff = (s16)PB.raw[0x2b] - (s16)PB.raw[0x2a]; PB.raw[0x2a] = PB.raw[0x2b]; @@ -650,7 +649,7 @@ ContinueWithBlock: // We just mix to the first two and call it stereo :p int value = b00[0x4 + count]; //int delta = b00[0xC + count] << 11; // Unused? - + int ramp = value << 16; for (int i = 0; i < _Size; i++) { @@ -731,7 +730,7 @@ ContinueWithBlock: } // Update the PB with the volume actually reached. PB.raw[addr++] = ramp >> 16; - + addr++; } } diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.cpp index 47981192f3..c8b847c17c 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.cpp @@ -2,6 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#ifdef _WIN32 +#include +#endif + #include "UCodes.h" #include "UCode_AX.h" diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h index cd8e8f9552..7737a8a59b 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h @@ -90,7 +90,7 @@ protected: // Some ucodes (notably zelda) require a resume mail to be // sent if they are be started via PrepareBootUCode. - // The HLE can use this to + // The HLE can use this to bool NeedsResumeMail(); void DoStateShared(PointerWrap &p); diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.cpp index 1aa64aa190..9343fa7089 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.cpp @@ -10,7 +10,7 @@ #include "DSPSymbols.h" #include "DSP/DSPMemoryMap.h" -void DSPDebugInterface::disasm(unsigned int address, char *dest, int max_size) +void DSPDebugInterface::disasm(unsigned int address, char *dest, int max_size) { // we'll treat addresses as line numbers. strncpy(dest, DSPSymbols::GetLineText(address), max_size); @@ -72,7 +72,7 @@ bool DSPDebugInterface::isAlive() return true; //Core::GetState() != Core::CORE_UNINITIALIZED; } -bool DSPDebugInterface::isBreakpoint(unsigned int address) +bool DSPDebugInterface::isBreakpoint(unsigned int address) { int real_addr = DSPSymbols::Line2Addr(address); if (real_addr >= 0) @@ -97,7 +97,7 @@ void DSPDebugInterface::setBreakpoint(unsigned int address) void DSPDebugInterface::clearBreakpoint(unsigned int address) { int real_addr = DSPSymbols::Line2Addr(address); - + if (real_addr >= 0) { if (dsp_breakpoints.Remove(real_addr)) @@ -134,7 +134,7 @@ void DSPDebugInterface::toggleMemCheck(unsigned int address) PanicAlert("MemCheck functionality not supported in DSP module."); } -void DSPDebugInterface::insertBLR(unsigned int address, unsigned int value) +void DSPDebugInterface::insertBLR(unsigned int address, unsigned int value) { PanicAlert("insertBLR functionality not supported in DSP module."); } @@ -145,7 +145,7 @@ void DSPDebugInterface::insertBLR(unsigned int address, unsigned int value) int DSPDebugInterface::getColor(unsigned int address) { static const int colors[6] = - { + { 0xd0FFFF, // light cyan 0xFFd0d0, // light red 0xd8d8FF, // light blue @@ -175,24 +175,24 @@ int DSPDebugInterface::getColor(unsigned int address) // ============= -std::string DSPDebugInterface::getDescription(unsigned int address) +std::string DSPDebugInterface::getDescription(unsigned int address) { return ""; // g_symbolDB.GetDescription(address); } -unsigned int DSPDebugInterface::getPC() +unsigned int DSPDebugInterface::getPC() { return DSPSymbols::Addr2Line(g_dsp.pc); } -void DSPDebugInterface::setPC(unsigned int address) +void DSPDebugInterface::setPC(unsigned int address) { int new_pc = DSPSymbols::Line2Addr(address); if (new_pc > 0) g_dsp.pc = new_pc; } -void DSPDebugInterface::runToBreakpoint() +void DSPDebugInterface::runToBreakpoint() { } diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.h b/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.h index d1d204c9bb..ac34991149 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.h +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPDebugInterface.h @@ -6,6 +6,7 @@ #define _DSPDEBUGINTERFACE_H #include +#include #include "DebugInterface.h" #include "Common.h" @@ -13,7 +14,7 @@ class DSPDebugInterface : public DebugInterface { public: - DSPDebugInterface(){} + DSPDebugInterface(){} virtual void disasm(unsigned int address, char *dest, int max_size); virtual void getRawMemoryString(int memory, unsigned int address, char *dest, int max_size); virtual int getInstructionSize(int instruction) {return 1;} diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPHost.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPHost.cpp index 26e7110d6e..5b2dc1f56e 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPHost.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPHost.cpp @@ -13,6 +13,7 @@ #include "../../ConfigManager.h" #include "../../PowerPC/PowerPC.h" #include "Host.h" +#include "OnScreenDisplay.h" // The user of the DSPCore library must supply a few functions so that the // emulation core can access the environment it runs in. If the emulation @@ -29,6 +30,11 @@ void DSPHost_WriteHostMemory(u8 value, u32 addr) DSP::WriteARAM(value, addr); } +void DSPHost_OSD_AddMessage(const std::string& str, u32 ms) +{ + OSD::AddMessage(str, ms); +} + bool DSPHost_OnThread() { const SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter; @@ -58,7 +64,7 @@ void DSPHost_CodeLoaded(const u8 *ptr, int size) DSPSymbols::Clear(); // Auto load text file - if none just disassemble. - + NOTICE_LOG(DSPLLE, "g_dsp.iram_crc: %08x", g_dsp.iram_crc); DSPSymbols::Clear(); diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp index d16af5f601..af747815d1 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp @@ -185,7 +185,7 @@ void DSPLLE::InitMixer() unsigned int AISampleRate, DACSampleRate; AudioInterface::Callback_GetSampleRate(AISampleRate, DACSampleRate); delete soundStream; - soundStream = AudioCommon::InitSoundStream(new CMixer(AISampleRate, DACSampleRate, 48000), m_hWnd); + soundStream = AudioCommon::InitSoundStream(new CMixer(AISampleRate, DACSampleRate, 48000), m_hWnd); if(!soundStream) PanicAlert("Error starting up sound stream"); // Mixer is initialized m_InitMixer = true; @@ -294,7 +294,7 @@ void DSPLLE::DSP_Update(int cycles) cycles_between_ss_update = 121500000 / 200; else cycles_between_ss_update = 81000000 / 200; - + m_cycle_count += cycles; if (m_cycle_count > cycles_between_ss_update) { @@ -350,7 +350,7 @@ void DSPLLE::DSP_ClearAudioBuffer(bool mute) void DSPLLE::PauseAndLock(bool doLock, bool unpauseOnUnlock) { if (doLock || unpauseOnUnlock) - DSP_ClearAudioBuffer(doLock); + DSP_ClearAudioBuffer(doLock); if (doLock) m_csDSPThreadActive.lock(); diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h index 05321aee06..71addf77b0 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h @@ -40,7 +40,6 @@ private: std::thread m_hDSPThread; std::mutex m_csDSPThreadActive; bool m_InitMixer; - void *m_hWnd; bool m_bWii; bool m_bDSPThread; bool m_bIsRunning; diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.cpp index a132d10654..c879f5604b 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.cpp @@ -6,6 +6,7 @@ #include "FileUtil.h" #include "DSP/DSPCore.h" #include "DSPLLEGlobals.h" +#include #if PROFILE @@ -37,15 +38,19 @@ void ProfilerDump(u64 count) File::IOFile pFile("DSP_Prof.txt", "wt"); if (pFile) { - fprintf(pFile.GetHandle(), "Number of DSP steps: %llu\n\n", count); + fprintf(pFile.GetHandle(), "Number of DSP steps: %" PRIu64 "\n\n", count); for (int i=0; i 0) { - fprintf(pFile.GetHandle(), "0x%04X: %llu\n", i, g_profileMap[i]); + fprintf(pFile.GetHandle(), "0x%04X: %" PRIu64 "\n", i, g_profileMap[i]); } } } } +#elif defined(_MSC_VER) + +namespace { char SilenceLNK4221; }; + #endif diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.h b/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.h index eca1e8a245..4b3902c635 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.h +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLEGlobals.h @@ -7,13 +7,12 @@ #include "Common.h" #include "AudioCommon.h" -#include // TODO: Get rid of this file. #define PROFILE 0 -#if PROFILE +#if PROFILE void ProfilerDump(u64 _count); void ProfilerInit(); void ProfilerAddDelta(int _addr, int _delta); diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLETools.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPLLETools.cpp index 3bc919a17b..d0f50834a2 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLETools.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLETools.cpp @@ -2,6 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#ifdef _WIN32 +#include +#endif + #include #include @@ -51,7 +55,7 @@ bool DumpDSPCode(const u8 *code_be, int size_in_bytes, u32 crc) if (!disasm.Disassemble(0, code, 0x0000, text)) return false; - return File::WriteStringToFile(true, text, txtFile); + return File::WriteStringToFile(text, txtFile); } // TODO make this useful :p diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.cpp index a813d3c019..90beaed796 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include - #include #include #include @@ -66,10 +64,10 @@ Symbol *DSPSymbolDB::GetSymbolFromAddr(u32 addr) } else { - for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) + for (auto& func : functions) { - if (addr >= iter->second.address && addr < iter->second.address + iter->second.size) - return &iter->second; + if (addr >= func.second.address && addr < func.second.address + func.second.size) + return &func.second; } } return 0; @@ -110,7 +108,7 @@ bool IsAlpha(char c) void DisasssembleRange(u16 start, u16 end) { - + } bool ReadAnnotatedAssembly(const char *filename) @@ -122,9 +120,9 @@ bool ReadAnnotatedAssembly(const char *filename) return false; } char line[512]; - + int last_addr = 0; - + lines.reserve(3000); // Symbol generation @@ -231,7 +229,7 @@ bool ReadAnnotatedAssembly(const char *filename) return false; } } - else + else { // if (line_counter >= 200 && line_counter <= 220) // NOTICE_LOG(DSPLLE, "Got Hex Digit %04x from %s, line %i", hex, line, line_counter); diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.h b/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.h index 003475b956..c9b8214157 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.h +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPSymbols.h @@ -8,17 +8,15 @@ #include "Common.h" #include "SymbolDB.h" -#include - namespace DSPSymbols { -class DSPSymbolDB : public SymbolDB +class DSPSymbolDB : public SymbolDB { public: DSPSymbolDB() {} ~DSPSymbolDB() {} - - Symbol *GetSymbolFromAddr(u32 addr); + + Symbol *GetSymbolFromAddr(u32 addr) override; }; diff --git a/Source/Core/Core/Src/HW/DVDInterface.cpp b/Source/Core/Core/Src/HW/DVDInterface.cpp index 0e77b2a443..d77fa4877f 100644 --- a/Source/Core/Core/Src/HW/DVDInterface.cpp +++ b/Source/Core/Core/Src/HW/DVDInterface.cpp @@ -19,7 +19,10 @@ #include "../Movie.h" // Disc transfer rate measured in bytes per second -static const u32 DISC_TRANSFER_RATE_GC = 4 * 1024 * 1024; +static const u32 DISC_TRANSFER_RATE_GC = 5 * 1024 * 1024; + +// Disc access time measured in milliseconds +static const u32 DISC_ACCESS_TIME_MS = 1; namespace DVDInterface { @@ -33,7 +36,7 @@ enum DI_COMMAND_1 = 0x0C, DI_COMMAND_2 = 0x10, DI_DMA_ADDRESS_REGISTER = 0x14, - DI_DMA_LENGTH_REGISTER = 0x18, + DI_DMA_LENGTH_REGISTER = 0x18, DI_DMA_CONTROL_REGISTER = 0x1C, DI_IMMEDIATE_DATA_BUFFER = 0x20, DI_CONFIG_REGISTER = 0x24 @@ -59,7 +62,7 @@ enum }; // DI Status Register -union UDISR +union UDISR { u32 Hex; struct @@ -281,7 +284,7 @@ void SetDiscInside(bool _DiscInside) } bool IsDiscInside() -{ +{ return g_bDiscInside; } @@ -322,7 +325,7 @@ void ChangeDisc(const char* _newFileName) { Movie::g_bDiscChange = true; std::string fileName = _newFileName; - int sizeofpath = fileName.find_last_of("/\\") + 1; + auto sizeofpath = fileName.find_last_of("/\\") + 1; if (fileName.substr(sizeofpath).length() > 40) { PanicAlert("Saving iso filename to .dtm failed; max file name length is 40 characters."); @@ -339,7 +342,7 @@ void SetLidOpen(bool _bOpen) } bool IsLidOpen() -{ +{ return (m_DICVR.CVR == 1); } @@ -452,7 +455,7 @@ void Write32(const u32 _iValue, const u32 _iAddress) { _dbg_assert_(DVDINTERFACE, 0); } - + UpdateInterrupts(); } break; @@ -484,15 +487,16 @@ void Write32(const u32 _iValue, const u32 _iAddress) m_DILENGTH.Hex = _iValue & ~0x1f; } break; - case DI_DMA_CONTROL_REGISTER: + case DI_DMA_CONTROL_REGISTER: { m_DICR.Hex = _iValue & 7; if (m_DICR.TSTART) { if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bFastDiscSpeed) { - u64 ticksUntilTC = m_DILENGTH.Length * - (SystemTimers::GetTicksPerSecond() / (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 1 : DISC_TRANSFER_RATE_GC)); + u64 ticksUntilTC = m_DILENGTH.Length * + (SystemTimers::GetTicksPerSecond() / (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 1 : DISC_TRANSFER_RATE_GC)) + + (SystemTimers::GetTicksPerSecond() * DISC_ACCESS_TIME_MS / 1000); CoreTiming::ScheduleEvent((int)ticksUntilTC, tc); } else @@ -537,7 +541,7 @@ void UpdateInterrupts() void GenerateDIInterrupt(DI_InterruptType _DVDInterrupt) { - switch(_DVDInterrupt) + switch(_DVDInterrupt) { case INT_DEINT: m_DISR.DEINT = 1; break; case INT_TCINT: m_DISR.TCINT = 1; break; @@ -705,7 +709,7 @@ void ExecuteCommand(UDICR& _DICR) { ERROR_LOG(DVDINTERFACE, "GC-AM: 0xAA, DMABuffer=%08x, DMALength=%08x", m_DIMAR.Address, m_DILENGTH.Length); u32 iDVDOffset = m_DICMDBUF[1].Hex << 2; - unsigned int len = m_DILENGTH.Length; + unsigned int len = m_DILENGTH.Length; int offset = iDVDOffset - 0x1F900000; /* if (iDVDOffset == 0x84800000) @@ -790,7 +794,7 @@ void ExecuteCommand(UDICR& _DICR) 3 - "Testing a game program. %d%%" 4 - "Loading a game program. %d%%" 5 - go - 6 - error xx + 6 - error xx */ media_buffer[8] = percentage; media_buffer[4] = 0x05; @@ -799,7 +803,7 @@ void ExecuteCommand(UDICR& _DICR) } case 0x101: media_buffer[4] = 3; // version - media_buffer[5] = 3; + media_buffer[5] = 3; media_buffer[6] = 1; // xxx media_buffer[8] = 1; media_buffer[16] = 0xFF; @@ -842,7 +846,7 @@ void ExecuteCommand(UDICR& _DICR) // Audio Stream (Immediate) // m_DICMDBUF[0].CMDBYTE1 = subcommand - // m_DICMDBUF[1].Hex << 2 = offset on disc + // m_DICMDBUF[1].Hex << 2 = offset on disc // m_DICMDBUF[2].Hex = Length of the stream case 0xE1: { diff --git a/Source/Core/Core/Src/HW/DVDInterface.h b/Source/Core/Core/Src/HW/DVDInterface.h index 2eb3b7e377..8d9648510b 100644 --- a/Source/Core/Core/Src/HW/DVDInterface.h +++ b/Source/Core/Core/Src/HW/DVDInterface.h @@ -5,7 +5,7 @@ #ifndef _DVDINTERFACE_H #define _DVDINTERFACE_H -#include "Common.h" +#include "CommonTypes.h" class PointerWrap; namespace DVDInterface diff --git a/Source/Core/Core/Src/HW/EXI.cpp b/Source/Core/Core/Src/HW/EXI.cpp index aa3e42c160..30b7728fe9 100644 --- a/Source/Core/Core/Src/HW/EXI.cpp +++ b/Source/Core/Core/Src/HW/EXI.cpp @@ -48,23 +48,23 @@ void Init() void Shutdown() { - for (u32 i = 0; i < NUM_CHANNELS; i++) + for (auto& channel : g_Channels) { - delete g_Channels[i]; - g_Channels[i] = NULL; + delete channel; + channel = NULL; } } void DoState(PointerWrap &p) { - for (int c = 0; c < NUM_CHANNELS; ++c) - g_Channels[c]->DoState(p); + for (auto& channel : g_Channels) + channel->DoState(p); } void PauseAndLock(bool doLock, bool unpauseOnUnlock) { - for (int c = 0; c < NUM_CHANNELS; ++c) - g_Channels[c]->PauseAndLock(doLock, unpauseOnUnlock); + for (auto& channel : g_Channels) + channel->PauseAndLock(doLock, unpauseOnUnlock); } @@ -87,9 +87,9 @@ void ChangeDevice(const u8 channel, const TEXIDevices device_type, const u8 devi IEXIDevice* FindDevice(TEXIDevices device_type, int customIndex) { - for (int i = 0; i < NUM_CHANNELS; ++i) + for (auto& channel : g_Channels) { - IEXIDevice* device = g_Channels[i]->FindDevice(device_type, customIndex); + IEXIDevice* device = channel->FindDevice(device_type, customIndex); if (device) return device; } @@ -145,8 +145,8 @@ void UpdateInterrupts() g_Channels[2]->SetEXIINT(g_Channels[0]->GetDevice(4)->IsInterruptSet()); bool causeInt = false; - for (int i = 0; i < NUM_CHANNELS; i++) - causeInt |= g_Channels[i]->IsCausingInterrupt(); + for (auto& channel : g_Channels) + causeInt |= channel->IsCausingInterrupt(); ProcessorInterface::SetInterrupt(ProcessorInterface::INT_CAUSE_EXI, causeInt); } diff --git a/Source/Core/Core/Src/HW/EXI.h b/Source/Core/Core/Src/HW/EXI.h index 013a049010..5043526d24 100644 --- a/Source/Core/Core/Src/HW/EXI.h +++ b/Source/Core/Core/Src/HW/EXI.h @@ -5,7 +5,7 @@ #ifndef _EXIINTERFACE_H #define _EXIINTERFACE_H -#include "Common.h" +#include "CommonTypes.h" #include "EXI_Channel.h" #include "Thread.h" class PointerWrap; diff --git a/Source/Core/Core/Src/HW/EXI_Channel.cpp b/Source/Core/Core/Src/HW/EXI_Channel.cpp index 13784b4011..a57b06914c 100644 --- a/Source/Core/Core/Src/HW/EXI_Channel.cpp +++ b/Source/Core/Core/Src/HW/EXI_Channel.cpp @@ -30,8 +30,8 @@ CEXIChannel::CEXIChannel(u32 ChannelId) : if (m_ChannelId == 1) m_Status.CHIP_SELECT = 1; - for (int i = 0; i < NUM_DEVICES; i++) - m_pDevices[i] = EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId); + for (auto& device : m_pDevices) + device.reset(EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId)); updateInterrupts = CoreTiming::RegisterEvent("EXIInterrupt", UpdateInterrupts); } @@ -43,11 +43,8 @@ CEXIChannel::~CEXIChannel() void CEXIChannel::RemoveDevices() { - for (int i = 0; i < NUM_DEVICES; i++) - { - delete m_pDevices[i]; - m_pDevices[i] = NULL; - } + for (auto& device : m_pDevices) + device.reset(); } void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num) @@ -60,15 +57,8 @@ void CEXIChannel::AddDevice(IEXIDevice* pDevice, const int device_num, bool noti { _dbg_assert_(EXPANSIONINTERFACE, device_num < NUM_DEVICES); - // delete the old device - if (m_pDevices[device_num] != NULL) - { - delete m_pDevices[device_num]; - m_pDevices[device_num] = NULL; - } - // replace it with the new one - m_pDevices[device_num] = pDevice; + m_pDevices[device_num].reset(pDevice); if(notifyPresenceChanged) { @@ -111,9 +101,9 @@ IEXIDevice* CEXIChannel::GetDevice(const u8 chip_select) { switch (chip_select) { - case 1: return m_pDevices[0]; - case 2: return m_pDevices[1]; - case 4: return m_pDevices[2]; + case 1: return m_pDevices[0].get(); + case 2: return m_pDevices[1].get(); + case 4: return m_pDevices[2].get(); } return NULL; } @@ -121,10 +111,8 @@ IEXIDevice* CEXIChannel::GetDevice(const u8 chip_select) void CEXIChannel::Update() { // start the transfer - for (int i = 0; i < NUM_DEVICES; i++) - { - m_pDevices[i]->Update(); - } + for (auto& device : m_pDevices) + device->Update(); } void CEXIChannel::Read32(u32& _uReturnValue, const u32 _iRegister) @@ -283,7 +271,7 @@ void CEXIChannel::DoState(PointerWrap &p) for (int d = 0; d < NUM_DEVICES; ++d) { - IEXIDevice* pDevice = m_pDevices[d]; + IEXIDevice* pDevice = m_pDevices[d].get(); TEXIDevices type = pDevice->m_deviceType; p.Do(type); IEXIDevice* pSaveDevice = (type == pDevice->m_deviceType) ? pDevice : EXIDevice_Create(type, m_ChannelId); @@ -308,15 +296,15 @@ void CEXIChannel::DoState(PointerWrap &p) void CEXIChannel::PauseAndLock(bool doLock, bool unpauseOnUnlock) { - for (int d = 0; d < NUM_DEVICES; ++d) - m_pDevices[d]->PauseAndLock(doLock, unpauseOnUnlock); + for (auto& device : m_pDevices) + device->PauseAndLock(doLock, unpauseOnUnlock); } IEXIDevice* CEXIChannel::FindDevice(TEXIDevices device_type, int customIndex) { - for (int d = 0; d < NUM_DEVICES; ++d) + for (auto& sup : m_pDevices) { - IEXIDevice* device = m_pDevices[d]->FindDevice(device_type, customIndex); + IEXIDevice* device = sup->FindDevice(device_type, customIndex); if (device) return device; } diff --git a/Source/Core/Core/Src/HW/EXI_Channel.h b/Source/Core/Core/Src/HW/EXI_Channel.h index ca6cb1e176..9ede316f0e 100644 --- a/Source/Core/Core/Src/HW/EXI_Channel.h +++ b/Source/Core/Core/Src/HW/EXI_Channel.h @@ -5,9 +5,10 @@ #ifndef _EXICHANNEL_H #define _EXICHANNEL_H -#include "Common.h" +#include "CommonTypes.h" #include "EXI_Device.h" +#include #ifdef _WIN32 #pragma warning(disable:4201) @@ -92,7 +93,7 @@ private: NUM_DEVICES = 3 }; - IEXIDevice* m_pDevices[NUM_DEVICES]; + std::unique_ptr m_pDevices[NUM_DEVICES]; // Since channels operate a bit differently from each other u32 m_ChannelId; diff --git a/Source/Core/Core/Src/HW/EXI_Device.cpp b/Source/Core/Core/Src/HW/EXI_Device.cpp index b956859c76..a1c6e5ed80 100644 --- a/Source/Core/Core/Src/HW/EXI_Device.cpp +++ b/Source/Core/Core/Src/HW/EXI_Device.cpp @@ -71,7 +71,7 @@ class CEXIDummy : public IEXIDevice { std::string m_strName; - void TransferByte(u8& _byte) {} + void TransferByte(u8& _byte) override {} public: CEXIDummy(const std::string& _strName) : @@ -81,14 +81,14 @@ public: virtual ~CEXIDummy(){} - void ImmWrite(u32 data, u32 size) {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmWrite: %08x", m_strName.c_str(), data);} - u32 ImmRead (u32 size) {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmRead", m_strName.c_str()); return 0;} - void DMAWrite(u32 addr, u32 size) {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMAWrite: %08x bytes, from %08x to device", m_strName.c_str(), size, addr);} - void DMARead (u32 addr, u32 size) {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMARead: %08x bytes, from device to %08x", m_strName.c_str(), size, addr);} + void ImmWrite(u32 data, u32 size) override {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmWrite: %08x", m_strName.c_str(), data);} + u32 ImmRead (u32 size) override {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmRead", m_strName.c_str()); return 0;} + void DMAWrite(u32 addr, u32 size) override {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMAWrite: %08x bytes, from %08x to device", m_strName.c_str(), size, addr);} + void DMARead (u32 addr, u32 size) override {INFO_LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMARead: %08x bytes, from device to %08x", m_strName.c_str(), size, addr);} }; -// F A C T O R Y +// F A C T O R Y IEXIDevice* EXIDevice_Create(TEXIDevices device_type, const int channel_num) { IEXIDevice* result = NULL; diff --git a/Source/Core/Core/Src/HW/EXI_Device.h b/Source/Core/Core/Src/HW/EXI_Device.h index e2a39154f5..0b48405033 100644 --- a/Source/Core/Core/Src/HW/EXI_Device.h +++ b/Source/Core/Core/Src/HW/EXI_Device.h @@ -5,7 +5,7 @@ #ifndef _EXIDEVICE_H #define _EXIDEVICE_H -#include "Common.h" +#include "CommonTypes.h" #include "ChunkFile.h" enum TEXIDevices diff --git a/Source/Core/Core/Src/HW/EXI_DeviceAD16.cpp b/Source/Core/Core/Src/HW/EXI_DeviceAD16.cpp index f0e0f96724..e4806b87da 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceAD16.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceAD16.cpp @@ -9,7 +9,7 @@ CEXIAD16::CEXIAD16() : m_uPosition(0), - m_uCommand(0) + m_uCommand(0) { m_uAD16Register.U32 = 0x00; } @@ -40,7 +40,7 @@ void CEXIAD16::TransferByte(u8& _byte) m_uAD16Register.U32 = 0x04120000; switch(m_uPosition) { - case 1: _dbg_assert_(EXPANSIONINTERFACE, (_byte == 0x00)); break; // just skip + case 1: _dbg_assert_(EXPANSIONINTERFACE, (_byte == 0x00)); break; // just skip case 2: _byte = m_uAD16Register.U8[0]; break; case 3: _byte = m_uAD16Register.U8[1]; break; case 4: _byte = m_uAD16Register.U8[2]; break; diff --git a/Source/Core/Core/Src/HW/EXI_DeviceAD16.h b/Source/Core/Core/Src/HW/EXI_DeviceAD16.h index de97d0d590..b80db4882b 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceAD16.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceAD16.h @@ -9,12 +9,12 @@ class CEXIAD16 : public IEXIDevice { public: CEXIAD16(); - virtual void SetCS(int _iCS); - virtual bool IsPresent(); - virtual void DoState(PointerWrap &p); + virtual void SetCS(int _iCS) override; + virtual bool IsPresent() override; + virtual void DoState(PointerWrap &p) override; private: - enum + enum { init = 0x00, write = 0xa0, @@ -32,7 +32,7 @@ private: u32 m_uCommand; UAD16Reg m_uAD16Register; - virtual void TransferByte(u8& _uByte); + virtual void TransferByte(u8& _uByte) override; }; #endif diff --git a/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.cpp b/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.cpp index 756fa85f62..03de8304f2 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.cpp @@ -45,7 +45,7 @@ void CEXIAMBaseboard::TransferByte(u8& _byte) xx xx xx xx 04 exi_isr_read: - 82 .. .. .. xx xx xx + 82 .. .. .. xx xx xx xx xx xx xx 04 rr rr 3 byte command, 1 byte checksum */ diff --git a/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.h b/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.h index 7a51a81baa..7ac6e9b624 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceAMBaseboard.h @@ -10,13 +10,13 @@ class CEXIAMBaseboard : public IEXIDevice public: CEXIAMBaseboard(); - virtual void SetCS(int _iCS); - virtual bool IsPresent(); - virtual bool IsInterruptSet(); - virtual void DoState(PointerWrap &p); + virtual void SetCS(int _iCS) override; + virtual bool IsPresent() override; + virtual bool IsInterruptSet() override; + virtual void DoState(PointerWrap &p) override; private: - virtual void TransferByte(u8& _uByte); + virtual void TransferByte(u8& _uByte) override; int m_position; bool m_have_irq; unsigned char m_command[4]; diff --git a/Source/Core/Core/Src/HW/EXI_DeviceEthernet.cpp b/Source/Core/Core/Src/HW/EXI_DeviceEthernet.cpp index cfb8f37188..5e4b7be015 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceEthernet.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceEthernet.cpp @@ -63,7 +63,7 @@ CEXIETHERNET::CEXIETHERNET() // Parse MAC address from config, and generate a new one if it doesn't // exist or can't be parsed. - auto &mac_addr_setting = SConfig::GetInstance().m_bba_mac; + auto &mac_addr_setting = SConfig::GetInstance().m_bba_mac; bool mac_addr_valid = false; u8 mac_addr[6] = { 0 }; @@ -87,7 +87,7 @@ CEXIETHERNET::CEXIETHERNET() mac_addr[x / 2] |= (c - 'a' + 10) << ((x & 1) ? 0 : 4); x++; } } - + if (x / 2 == 6) { memcpy(&mBbaMem[BBA_NAFR_PAR0], mac_addr, 6); @@ -259,7 +259,7 @@ void CEXIETHERNET::DMAWrite(u32 addr, u32 size) void CEXIETHERNET::DMARead(u32 addr, u32 size) { DEBUG_LOG(SP1, "DMA read: %08x %x", addr, size); - + memcpy(Memory::GetPointer(addr), &mBbaMem[transfer.address], size); transfer.address += size; @@ -550,7 +550,7 @@ bool CEXIETHERNET::RecvHandlePacket() if (!RecvMACFilter()) goto wait_for_next; - + #ifdef BBA_TRACK_PAGE_PTRS WARN_LOG(SP1, "RecvHandlePacket %x\n%s", mRecvBufferLength, ArrayToString(mRecvBuffer, mRecvBufferLength, 0x100).c_str()); diff --git a/Source/Core/Core/Src/HW/EXI_DeviceEthernet.h b/Source/Core/Core/Src/HW/EXI_DeviceEthernet.h index 7fb9a5775e..ba66e816f8 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceEthernet.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceEthernet.h @@ -5,6 +5,10 @@ #ifndef _EXIDEVICE_ETHERNET_H #define _EXIDEVICE_ETHERNET_H +#ifdef _WIN32 +#include +#endif + #include "Thread.h" // Network Control Register A @@ -48,7 +52,7 @@ enum NWAYC NWAYC_FD = 0x01, // Full Duplex Mode NWAYC_PS100_10 = 0x02, // Port Select 100/10 NWAYC_ANE = 0x04, // Autonegotiate enable - + // Autonegotiation status bits... NWAYC_NTTEST = 0x40, // Reserved @@ -95,13 +99,13 @@ enum { BBA_NCRA = 0x00, BBA_NCRB = 0x01, - + BBA_LTPS = 0x04, BBA_LRPS = 0x05, - + BBA_IMR = 0x08, BBA_IR = 0x09, - + BBA_BP = 0x0a, BBA_TLBP = 0x0c, BBA_TWP = 0x0e, @@ -185,14 +189,14 @@ class CEXIETHERNET : public IEXIDevice public: CEXIETHERNET(); virtual ~CEXIETHERNET(); - void SetCS(int cs); - bool IsPresent(); - bool IsInterruptSet(); - void ImmWrite(u32 data, u32 size); - u32 ImmRead(u32 size); - void DMAWrite(u32 addr, u32 size); - void DMARead(u32 addr, u32 size); - void DoState(PointerWrap &p); + void SetCS(int cs) override; + bool IsPresent() override; + bool IsInterruptSet() override; + void ImmWrite(u32 data, u32 size) override; + u32 ImmRead(u32 size) override; + void DMAWrite(u32 addr, u32 size) override; + void DMARead(u32 addr, u32 size) override; + void DoState(PointerWrap &p) override; //private: struct diff --git a/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp b/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp index 2f2d380366..0bb84c4fdb 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp @@ -108,31 +108,31 @@ void GeckoSockServer::ClientThread() while (client_running) { bool did_nothing = true; - + { std::lock_guard lk(transfer_lock); // what's an ideal buffer size? char data[128]; std::size_t got = 0; - - if (client.Receive(&data[0], ARRAYSIZE(data), got) == sf::Socket::Disconnected) + + if (client.Receive(&data[0], ArraySize(data), got) == sf::Socket::Disconnected) client_running = false; - + if (got != 0) { did_nothing = false; - + recv_fifo.insert(recv_fifo.end(), &data[0], &data[got]); } if (!send_fifo.empty()) { did_nothing = false; - + std::vector packet(send_fifo.begin(), send_fifo.end()); send_fifo.clear(); - + if (client.Send(&packet[0], packet.size()) == sf::Socket::Disconnected) client_running = false; } @@ -165,7 +165,7 @@ void CEXIGecko::ImmReadWrite(u32 &_uData, u32 _uSize) "USBGecko: A piercing blue light is now shining in your general direction"), 3000); break; - + case CMD_INIT: _uData = ident; break; diff --git a/Source/Core/Core/Src/HW/EXI_DeviceGecko.h b/Source/Core/Core/Src/HW/EXI_DeviceGecko.h index f720a83a5d..97bb1b6829 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceGecko.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceGecko.h @@ -48,8 +48,8 @@ class CEXIGecko { public: CEXIGecko() {} - bool IsPresent() { return true; } - void ImmReadWrite(u32 &_uData, u32 _uSize); + bool IsPresent() override { return true; } + void ImmReadWrite(u32 &_uData, u32 _uSize) override; private: enum diff --git a/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp b/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp index 9402b7bbab..716b04969b 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp @@ -92,7 +92,7 @@ CEXIIPL::CEXIIPL() : // Create the IPL m_pIPL = (u8*)AllocateMemoryPages(ROM_SIZE); - + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2) { // Copy header @@ -119,7 +119,7 @@ CEXIIPL::CEXIIPL() : g_SRAM.lang = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; WriteProtectMemory(m_pIPL, ROM_SIZE); - m_uAddress = 0; + m_uAddress = 0; } CEXIIPL::~CEXIIPL() @@ -252,7 +252,7 @@ void CEXIIPL::TransferByte(u8& _uByte) DEBUG_LOG(EXPANSIONINTERFACE, "%s %s %08x", device_name.c_str(), IsWriteCommand() ? "write" : "read", m_uAddress); } - } + } else { // Actually read or write a byte @@ -279,7 +279,7 @@ void CEXIIPL::TransferByte(u8& _uByte) if (_uByte != '\0') m_szBuffer[m_count++] = _uByte; if ((m_count >= 256) || (_uByte == 0xD)) - { + { m_szBuffer[m_count] = 0x00; NOTICE_LOG(OSREPORT, "%s", m_szBuffer); memset(m_szBuffer, 0, sizeof(m_szBuffer)); diff --git a/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp b/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp index 692db55ecc..2d1fb56c2a 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.cpp @@ -16,7 +16,7 @@ #include "Sram.h" #include "GCMemcard.h" -#define MC_STATUS_BUSY 0x80 +#define MC_STATUS_BUSY 0x80 #define MC_STATUS_UNLOCKED 0x40 #define MC_STATUS_SLEEP 0x20 #define MC_STATUS_ERASEERROR 0x10 @@ -53,7 +53,7 @@ CEXIMemoryCard::CEXIMemoryCard(const int index) // we're potentially leaking events here, since there's no UnregisterEvent until emu shutdown, but I guess it's inconsequential et_this_card = CoreTiming::RegisterEvent((card_index == 0) ? "memcardFlushA" : "memcardFlushB", FlushCallback); et_cmd_done = CoreTiming::RegisterEvent((card_index == 0) ? "memcardDoneA" : "memcardDoneB", CmdDoneCallback); - + interruptSwitch = 0; m_bInterruptSet = 0; command = 0; @@ -61,7 +61,7 @@ CEXIMemoryCard::CEXIMemoryCard(const int index) m_uPosition = 0; memset(programming_buffer, 0, sizeof(programming_buffer)); formatDelay = 0; - + //Nintendo Memory Card EXI IDs //0x00000004 Memory Card 59 4Mbit //0x00000008 Memory Card 123 8Mb @@ -69,12 +69,12 @@ CEXIMemoryCard::CEXIMemoryCard(const int index) //0x00000020 Memory Card 507 32Mb //0x00000040 Memory Card 1019 64Mb //0x00000080 Memory Card 2043 128Mb - + //0x00000510 16Mb "bigben" card //card_id = 0xc243; - + card_id = 0xc221; // It's a Nintendo brand memcard - + File::IOFile pFile(m_strFilename, "rb"); if (pFile) { @@ -83,7 +83,7 @@ CEXIMemoryCard::CEXIMemoryCard(const int index) nintendo_card_id = memory_card_size / SIZE_TO_Mb; memory_card_content = new u8[memory_card_size]; memset(memory_card_content, 0xFF, memory_card_size); - + INFO_LOG(EXPANSIONINTERFACE, "Reading memory card %s", m_strFilename.c_str()); pFile.ReadBytes(memory_card_content, memory_card_size); @@ -96,7 +96,7 @@ CEXIMemoryCard::CEXIMemoryCard(const int index) memory_card_content = new u8[memory_card_size]; GCMemcard::Format(memory_card_content, m_strFilename.find(".JAP.raw") != std::string::npos, nintendo_card_id); - memset(memory_card_content+MC_HDR_SIZE, 0xFF, memory_card_size-MC_HDR_SIZE); + memset(memory_card_content+MC_HDR_SIZE, 0xFF, memory_card_size-MC_HDR_SIZE); WARN_LOG(EXPANSIONINTERFACE, "No memory card found. Will create a new one."); } SetCardFlashID(memory_card_content, card_index); @@ -167,14 +167,14 @@ CEXIMemoryCard::~CEXIMemoryCard() Flush(true); delete[] memory_card_content; memory_card_content = NULL; - + if (flushThread.joinable()) { flushThread.join(); } } -bool CEXIMemoryCard::IsPresent() +bool CEXIMemoryCard::IsPresent() { return true; } @@ -191,7 +191,7 @@ void CEXIMemoryCard::CmdDone() void CEXIMemoryCard::CmdDoneLater(u64 cycles) { CoreTiming::RemoveEvent(et_cmd_done); - CoreTiming::ScheduleEvent(cycles, et_cmd_done, (u64)card_index); + CoreTiming::ScheduleEvent((int)cycles, et_cmd_done, (u64)card_index); } void CEXIMemoryCard::SetCS(int cs) @@ -207,7 +207,7 @@ void CEXIMemoryCard::SetCS(int cs) m_uPosition = 0; } else - { + { switch (command) { case cmdSectorErase: @@ -248,7 +248,7 @@ void CEXIMemoryCard::SetCS(int cs) CmdDoneLater(5000); } - + // Page written to memory card, not just to buffer - let's schedule a flush 0.5b cycles into the future (1 sec) // But first we unschedule already scheduled flushes - no point in flushing once per page for a large write. CoreTiming::RemoveEvent(et_this_card); @@ -324,7 +324,7 @@ void CEXIMemoryCard::TransferByte(u8 &byte) byte = 0xFF; m_uPosition = 0; } - } + } else { switch (command) @@ -332,7 +332,7 @@ void CEXIMemoryCard::TransferByte(u8 &byte) case cmdNintendoID: // // Nintendo card: - // 00 | 80 00 00 00 10 00 00 00 + // 00 | 80 00 00 00 10 00 00 00 // "bigben" card: // 00 | ff 00 00 05 10 00 00 00 00 00 00 00 00 00 00 // we do it the Nintendo way. @@ -431,7 +431,7 @@ void CEXIMemoryCard::TransferByte(u8 &byte) default: WARN_LOG(EXPANSIONINTERFACE, "EXI MEMCARD: unknown command byte %02x\n", byte); - byte = 0xFF; + byte = 0xFF; } } m_uPosition++; @@ -474,7 +474,7 @@ void CEXIMemoryCard::DoState(PointerWrap &p) p.Do(nintendo_card_id); p.Do(card_id); p.Do(memory_card_size); - p.DoArray(memory_card_content, memory_card_size); + p.DoArray(memory_card_content, memory_card_size); p.Do(card_index); } } diff --git a/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.h b/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.h index 2ccef0aeab..2651ca08f0 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceMemoryCard.h @@ -21,13 +21,13 @@ class CEXIMemoryCard : public IEXIDevice public: CEXIMemoryCard(const int index); virtual ~CEXIMemoryCard(); - void SetCS(int cs); - void Update(); - bool IsInterruptSet(); - bool IsPresent(); - void DoState(PointerWrap &p); - void PauseAndLock(bool doLock, bool unpauseOnUnlock=true); - IEXIDevice* FindDevice(TEXIDevices device_type, int customIndex=-1); + void SetCS(int cs) override; + void Update() override; + bool IsInterruptSet() override; + bool IsPresent() override; + void DoState(PointerWrap &p) override; + void PauseAndLock(bool doLock, bool unpauseOnUnlock=true) override; + IEXIDevice* FindDevice(TEXIDevices device_type, int customIndex=-1) override; private: // This is scheduled whenever a page write is issued. The this pointer is passed @@ -46,7 +46,7 @@ private: // Variant of CmdDone which schedules an event later in the future to complete the command. void CmdDoneLater(u64 cycles); - enum + enum { cmdNintendoID = 0x00, cmdReadArray = 0x52, @@ -79,17 +79,17 @@ private: u8 programming_buffer[128]; u32 formatDelay; bool m_bDirty; - //! memory card parameters + //! memory card parameters unsigned int nintendo_card_id, card_id; - unsigned int address; + unsigned int address; int memory_card_size; //! in bytes, must be power of 2. - u8 *memory_card_content; + u8 *memory_card_content; FlushData flushData; std::thread flushThread; - + protected: - virtual void TransferByte(u8 &byte); + virtual void TransferByte(u8 &byte) override; }; #endif diff --git a/Source/Core/Core/Src/HW/EXI_DeviceMic.cpp b/Source/Core/Core/Src/HW/EXI_DeviceMic.cpp index 4a5b3cc0ae..6ad84cc860 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceMic.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceMic.cpp @@ -117,7 +117,7 @@ void CEXIMic::StreamStop() void CEXIMic::StreamReadOne() { std::lock_guard lk(ring_lock); - + if (samples_avail >= buff_size_samples) { s16 *last_buffer = &stream_buffer[stream_rpos]; @@ -149,10 +149,10 @@ CEXIMic::CEXIMic(int index) sample_rate = rate_base; buff_size = ring_base; buff_size_samples = buff_size / sample_size; - + ring_pos = 0; memset(ring_buffer, 0, sizeof(ring_buffer)); - + next_int_ticks = 0; StreamInit(); @@ -222,7 +222,7 @@ void CEXIMic::TransferByte(u8 &byte) status.button = Pad::GetMicButton(slot); byte = status.U8[pos ^ 1]; - + if (pos == 1) status.buff_ovrflw = 0; break; @@ -240,7 +240,7 @@ void CEXIMic::TransferByte(u8 &byte) buff_size_samples = buff_size / sample_size; UpdateNextInterruptTicks(); - + StreamStart(); } else if (wasactive && !status.is_active) @@ -254,7 +254,7 @@ void CEXIMic::TransferByte(u8 &byte) { if (ring_pos == 0) StreamReadOne(); - + byte = ring_buffer[ring_pos ^ 1]; ring_pos = (ring_pos + 1) % buff_size; } diff --git a/Source/Core/Core/Src/HW/EXI_DeviceMic.h b/Source/Core/Core/Src/HW/EXI_DeviceMic.h index 093424df25..ff4fe522e6 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceMic.h +++ b/Source/Core/Core/Src/HW/EXI_DeviceMic.h @@ -92,7 +92,7 @@ public: int stream_wpos; int stream_rpos; int samples_avail; - + protected: virtual void TransferByte(u8 &byte); }; diff --git a/Source/Core/Core/Src/HW/GCMemcard.cpp b/Source/Core/Core/Src/HW/GCMemcard.cpp index c51d3221e3..d320f0177a 100644 --- a/Source/Core/Core/Src/HW/GCMemcard.cpp +++ b/Source/Core/Core/Src/HW/GCMemcard.cpp @@ -4,6 +4,9 @@ #include "GCMemcard.h" #include "ColorUtil.h" + +#include + static void ByteSwap(u8 *valueA, u8 *valueB) { u8 tmp = *valueA; @@ -11,48 +14,13 @@ static void ByteSwap(u8 *valueA, u8 *valueB) *valueB = tmp; } -void decode5A3image(u32* dst, u16* src, int width, int height) -{ - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int iy = 0; iy < 4; iy++, src += 4) - { - for (int ix = 0; ix < 4; ix++) - { - u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix])); - dst[(y + iy) * width + (x + ix)] = RGBA; - } - } - } - } -} - -void decodeCI8image(u32* dst, u8* src, u16* pal, int width, int height) -{ - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 8) - { - for (int iy = 0; iy < 4; iy++, src += 8) - { - u32 *tdst = dst+(y+iy)*width+x; - for (int ix = 0; ix < 8; ix++) - { - // huh, this seems wrong. CI8, not 5A3, no? - tdst[ix] = ColorUtil::Decode5A3(Common::swap16(pal[src[ix]])); - } - } - } - } -} - GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) : m_valid(false) , m_fileName(filename) { - File::IOFile mcdFile(m_fileName, "r+b"); + // Currently there is a string freeze. instead of adding a new message about needing r/w + // open file read only, if write is denied the error will be reported at that point + File::IOFile mcdFile(m_fileName, "rb"); if (!mcdFile.IsOpen()) { if (!forceCreation && !AskYesNoT("\"%s\" does not exist.\n Create a new 16MB Memcard?", filename)) @@ -72,19 +40,19 @@ GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) PanicAlertT("File has the extension \"%s\"\nvalid extensions are (.raw/.gcp)", fileType.c_str()); return; } - u32 size = mcdFile.GetSize(); + auto size = mcdFile.GetSize(); if (size < MC_FST_BLOCKS*BLOCK_SIZE) { - PanicAlertT("%s failed to load as a memorycard \nfile is not large enough to be a valid memory card file (0x%x bytes)", filename, size); + PanicAlertT("%s failed to load as a memorycard \nfile is not large enough to be a valid memory card file (0x%x bytes)", filename, (unsigned) size); return; } if (size % BLOCK_SIZE) { - PanicAlertT("%s failed to load as a memorycard \n Card file size is invalid (0x%x bytes)", filename, size); + PanicAlertT("%s failed to load as a memorycard \n Card file size is invalid (0x%x bytes)", filename, (unsigned) size); return; } - m_sizeMb = (size/BLOCK_SIZE) / MBIT_TO_BLOCKS; + m_sizeMb = (u16)((size/BLOCK_SIZE) / MBIT_TO_BLOCKS); switch (m_sizeMb) { case MemCard59Mb: @@ -95,12 +63,12 @@ GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) case MemCard2043Mb: break; default: - PanicAlertT("%s failed to load as a memorycard \n Card size is invalid (0x%x bytes)", filename, size); + PanicAlertT("%s failed to load as a memorycard \n Card size is invalid (0x%x bytes)", filename, (unsigned) size); return; } } - - + + mcdFile.Seek(0, SEEK_SET); if (!mcdFile.ReadBytes(&hdr, BLOCK_SIZE)) { @@ -138,7 +106,7 @@ GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) } u32 csums = TestChecksums(); - + if (csums & 0x1) { // header checksum error! @@ -194,7 +162,7 @@ GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) } mcdFile.Seek(0xa000, SEEK_SET); - + maxBlock = (u32)m_sizeMb * MBIT_TO_BLOCKS; mc_data_blocks.reserve(maxBlock - MC_FST_BLOCKS); @@ -208,18 +176,18 @@ GCMemcard::GCMemcard(const char *filename, bool forceCreation, bool sjis) } else { - PanicAlertT("Failed to read block %d of the save data\nMemcard may be truncated\nFilePosition:%llx", i, mcdFile.Tell()); + PanicAlertT("Failed to read block %d of the save data\nMemcard may be truncated\nFilePosition:%" PRIx64, i, mcdFile.Tell()); m_valid = false; break; } } mcdFile.Close(); - + initDirBatPointers(); } -void GCMemcard::initDirBatPointers() +void GCMemcard::initDirBatPointers() { if (BE16(dir.UpdateCounter) > (BE16(dir_backup.UpdateCounter))) { @@ -322,7 +290,7 @@ bool GCMemcard::FixChecksums() { if (!m_valid) return false; - + calc_checksumsBE((u16*)&hdr, 0xFE, &hdr.Checksum, &hdr.Checksum_Inv); calc_checksumsBE((u16*)&dir, 0xFFE, &dir.Checksum, &dir.Checksum_Inv); calc_checksumsBE((u16*)&dir_backup, 0xFFE, &dir_backup.Checksum, &dir_backup.Checksum_Inv); @@ -673,7 +641,7 @@ u32 GCMemcard::ImportFile(DEntry& direntry, std::vector &saveBlocks) if (firstBlock == 0xFFFF) return OUTOFBLOCKS; Directory UpdatedDir = *CurrentDir; - + // find first free dir entry for (int i=0; i < DIRLEN; i++) { @@ -707,19 +675,19 @@ u32 GCMemcard::ImportFile(DEntry& direntry, std::vector &saveBlocks) u16 nextBlock; // keep assuming no freespace fragmentation, and copy over all the data for (int i = 0; i < fileBlocks; ++i) - { + { if (firstBlock == 0xFFFF) PanicAlert("Fatal Error"); mc_data_blocks[firstBlock - MC_FST_BLOCKS] = saveBlocks[i]; if (i == fileBlocks-1) nextBlock = 0xFFFF; else - nextBlock = UpdatedBat.NextFreeBlock(firstBlock+1); + nextBlock = UpdatedBat.NextFreeBlock(firstBlock+1); UpdatedBat.Map[firstBlock - MC_FST_BLOCKS] = BE16(nextBlock); UpdatedBat.LastAllocated = BE16(firstBlock); firstBlock = nextBlock; } - + UpdatedBat.FreeBlocks = BE16(BE16(UpdatedBat.FreeBlocks) - fileBlocks); UpdatedBat.UpdateCounter = BE16(BE16(UpdatedBat.UpdateCounter) + 1); *PreviousBat = UpdatedBat; @@ -810,7 +778,7 @@ u32 GCMemcard::CopyFrom(const GCMemcard& source, u8 index) DEntry tempDEntry; if (!source.GetDEntry(index, tempDEntry)) return NOMEMCARD; - + u32 size = source.DEntry_BlockCount(index); if (size == 0xFFFF) return INVALIDFILESIZE; @@ -886,7 +854,7 @@ u32 GCMemcard::ImportGciInternal(FILE* gcih, const char *inputFile, const std::s return LENGTHFAIL; if (gci.Tell() != offset + DENTRY_SIZE) // Verify correct file position return OPENFAIL; - + u32 size = BE16((tempDEntry.BlockCount)); std::vector saveData; saveData.reserve(size); @@ -908,7 +876,7 @@ u32 GCMemcard::ImportGciInternal(FILE* gcih, const char *inputFile, const std::s } gci2.Seek(0, SEEK_SET); - if (!gci2.WriteBytes(&tempDEntry, DENTRY_SIZE)) + if (!gci2.WriteBytes(&tempDEntry, DENTRY_SIZE)) completeWrite = false; int fileBlocks = BE16(tempDEntry.BlockCount); gci2.Seek(DENTRY_SIZE, SEEK_SET); @@ -924,7 +892,7 @@ u32 GCMemcard::ImportGciInternal(FILE* gcih, const char *inputFile, const std::s else ret = WRITEFAIL; } - else + else ret = ImportFile(tempDEntry, saveData); return ret; @@ -960,7 +928,7 @@ u32 GCMemcard::ExportGci(u8 index, const char *fileName, const std::string &dire return OPENFAIL; gci.Seek(0, SEEK_SET); - + switch(offset) { case GCS: @@ -1081,13 +1049,13 @@ bool GCMemcard::ReadBannerRGBA8(u8 index, u32* buffer) const u8 *pxdata = (u8* )(mc_data_blocks[DataBlock].block + DataOffset); u16 *paldata = (u16*)(mc_data_blocks[DataBlock].block + DataOffset + pixels); - decodeCI8image(buffer, pxdata, paldata, 96, 32); + ColorUtil::decodeCI8image(buffer, pxdata, paldata, 96, 32); } else { u16 *pxdata = (u16*)(mc_data_blocks[DataBlock].block + DataOffset); - decode5A3image(buffer, pxdata, 96, 32); + ColorUtil::decode5A3image(buffer, pxdata, 96, 32); } return true; } @@ -1099,7 +1067,7 @@ u32 GCMemcard::ReadAnimRGBA8(u8 index, u32* buffer, u8 *delays) const // To ensure only one type of icon is used // Sonic Heroes it the only game I have seen that tries to use a CI8 and RGB5A3 icon - //int fmtCheck = 0; + //int fmtCheck = 0; int formats = BE16(CurrentDir->Dir[index].IconFmt); int fdelays = BE16(CurrentDir->Dir[index].AnimSpeed); @@ -1183,16 +1151,16 @@ u32 GCMemcard::ReadAnimRGBA8(u8 index, u32* buffer, u8 *delays) const switch (fmts[i]) { case CI8SHARED: // CI8 with shared palette - decodeCI8image(buffer,data[i],sharedPal,32,32); + ColorUtil::decodeCI8image(buffer,data[i],sharedPal,32,32); buffer += 32*32; break; case RGB5A3: // RGB5A3 - decode5A3image(buffer, (u16*)(data[i]), 32, 32); + ColorUtil::decode5A3image(buffer, (u16*)(data[i]), 32, 32); buffer += 32*32; break; case CI8: // CI8 with own palette u16 *paldata = (u16*)(data[i] + 32*32); - decodeCI8image(buffer, data[i], paldata, 32, 32); + ColorUtil::decodeCI8image(buffer, data[i], paldata, 32, 32); buffer += 32*32; break; } @@ -1209,15 +1177,15 @@ u32 GCMemcard::ReadAnimRGBA8(u8 index, u32* buffer, u8 *delays) const switch (fmts[j]) { case CI8SHARED: // CI8 with shared palette - decodeCI8image(buffer,data[j],sharedPal,32,32); + ColorUtil::decodeCI8image(buffer,data[j],sharedPal,32,32); break; case RGB5A3: // RGB5A3 - decode5A3image(buffer, (u16*)(data[j]), 32, 32); + ColorUtil::decode5A3image(buffer, (u16*)(data[j]), 32, 32); buffer += 32*32; break; case CI8: // CI8 with own palette u16 *paldata = (u16*)(data[j] + 32*32); - decodeCI8image(buffer, data[j], paldata, 32, 32); + ColorUtil::decodeCI8image(buffer, data[j], paldata, 32, 32); buffer += 32*32; break; } @@ -1265,7 +1233,7 @@ bool GCMemcard::Format(bool sjis, u16 SizeMb) gcp.dir_backup = &dir_backup; gcp.bat = &bat; gcp.bat_backup = &bat_backup; - + *(u16*)hdr.SizeMb = BE16(SizeMb); hdr.Encoding = BE16(sjis ? 1 : 0); FormatInternal(gcp); @@ -1278,7 +1246,7 @@ bool GCMemcard::Format(bool sjis, u16 SizeMb) GCMBlock b; mc_data_blocks.push_back(b); } - + initDirBatPointers(); m_valid = true; @@ -1295,7 +1263,7 @@ void GCMemcard::FormatInternal(GCMC_Header &GCP) { rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); p_hdr->serial[i] = (u8)(g_SRAM.flash_id[0][i] + (u32)rand); - rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); + rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); rand &= (u64)0x0000000000007fffULL; } p_hdr->SramBias = g_SRAM.counter_bias; @@ -1311,7 +1279,7 @@ void GCMemcard::FormatInternal(GCMC_Header &GCP) p_dir_backup->UpdateCounter = BE16(1); calc_checksumsBE((u16*)p_dir, 0xFFE, &p_dir->Checksum, &p_dir->Checksum_Inv); calc_checksumsBE((u16*)p_dir_backup, 0xFFE, &p_dir_backup->Checksum, &p_dir_backup->Checksum_Inv); - + BlockAlloc *p_bat = GCP.bat, *p_bat_backup = GCP.bat_backup; p_bat_backup->UpdateCounter = BE16(1); @@ -1324,8 +1292,8 @@ void GCMemcard::FormatInternal(GCMC_Header &GCP) void GCMemcard::CARD_GetSerialNo(u32 *serial1,u32 *serial2) { u32 serial[8]; - int i; - for (i = 0; i < 8; i++) + + for (int i = 0; i < 8; i++) { memcpy(&serial[i], (u8 *) &hdr+(i*4), 4); } @@ -1367,7 +1335,7 @@ s32 GCMemcard::FZEROGX_MakeSaveGameValid(DEntry& direntry, std::vector // calc 16-bit checksum for (i=0x02;i<0x8000;i++) - { + { chksum ^= (FileBuffer[block].block[i-(block*0x2000)]&0xFF); for (j=8; j > 0; j--) { @@ -1429,15 +1397,15 @@ s32 GCMemcard::PSO_MakeSaveGameValid(DEntry& direntry, std::vector &Fi for (i=0; i < 256; i++) { chksum = i; - for (j=8; j > 0; j--) - { - if (chksum & 1) - chksum = (chksum>>1)^0xEDB88320; - else - chksum >>= 1; - } + for (j=8; j > 0; j--) + { + if (chksum & 1) + chksum = (chksum>>1)^0xEDB88320; + else + chksum >>= 1; + } - crc32LUT[i] = chksum; + crc32LUT[i] = chksum; } // PSO initial crc32 value diff --git a/Source/Core/Core/Src/HW/GCMemcard.h b/Source/Core/Core/Src/HW/GCMemcard.h index 215402dd10..fdd553194a 100644 --- a/Source/Core/Core/Src/HW/GCMemcard.h +++ b/Source/Core/Core/Src/HW/GCMemcard.h @@ -32,7 +32,7 @@ enum SAV = 0x80, SAVFAIL, GCS = 0x110, - GCSFAIL, + GCSFAIL, FAIL, WRITEFAIL, DELETE_FAIL, @@ -180,11 +180,11 @@ public: bool Save(); bool Format(bool sjis = false, u16 SizeMb = MemCard2043Mb); static bool Format(u8 * card_data, bool sjis = false, u16 SizeMb = MemCard2043Mb); - + static void calc_checksumsBE(u16 *buf, u32 length, u16 *csum, u16 *inv_csum); u32 TestChecksums() const; bool FixChecksums(); - + // get number of file entries in the directory u8 GetNumFiles() const; u8 GetFileIndex(u8 fileNumber) const; diff --git a/Source/Core/Core/Src/HW/GCPad.cpp b/Source/Core/Core/Src/HW/GCPad.cpp index 9862c1b347..7c20c6df7c 100644 --- a/Source/Core/Core/Src/HW/GCPad.cpp +++ b/Source/Core/Core/Src/HW/GCPad.cpp @@ -10,7 +10,6 @@ #include "../ConfigManager.h" #include "../../InputCommon/Src/InputConfig.h" -#include "Host.h" namespace Pad { @@ -71,7 +70,7 @@ void GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) g_controller_interface.UpdateInput(); } _last_numPAD = _numPAD; - + // get input ((GCPad*)g_plugin.controllers[_numPAD])->GetInput(_pPADStatus); } @@ -106,7 +105,7 @@ void Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength) // __________________________________________________________________________________________________ // Function: Motor // Purpose: For devices with constant Force feedback -// input: _numPAD - The pad to operate on +// input: _numPAD - The pad to operate on // _uType - 06 = Motor On, 04 = Motor Off // _uStrength - 00 = Left Strong, 127 = Left Weak, 128 = Right Weak, 255 = Right Strong // output: none @@ -128,7 +127,7 @@ void Motor(u8 _numPAD, unsigned int _uType, unsigned int _uStrength) bool GetMicButton(u8 pad) { - + std::unique_lock lk(g_plugin.controls_lock, std::try_to_lock); if (!lk.owns_lock()) diff --git a/Source/Core/Core/Src/HW/GCPadEmu.cpp b/Source/Core/Core/Src/HW/GCPadEmu.cpp index af4130b1bc..fa219c369a 100644 --- a/Source/Core/Core/Src/HW/GCPadEmu.cpp +++ b/Source/Core/Core/Src/HW/GCPadEmu.cpp @@ -24,7 +24,7 @@ const u16 trigger_bitmasks[] = const u16 dpad_bitmasks[] = { - PAD_BUTTON_UP, PAD_BUTTON_DOWN, PAD_BUTTON_LEFT, PAD_BUTTON_RIGHT + PAD_BUTTON_UP, PAD_BUTTON_DOWN, PAD_BUTTON_LEFT, PAD_BUTTON_RIGHT }; const char* const named_buttons[] = @@ -65,8 +65,8 @@ GCPad::GCPad(const unsigned int index) : m_index(index) // triggers groups.push_back(m_triggers = new MixedTriggers(_trans("Triggers"))); - for (unsigned int i=0; i < sizeof(named_triggers)/sizeof(*named_triggers); ++i) - m_triggers->controls.push_back(new ControlGroup::Input(named_triggers[i])); + for (auto& named_trigger : named_triggers) + m_triggers->controls.push_back(new ControlGroup::Input(named_trigger)); // rumble groups.push_back(m_rumble = new ControlGroup(_trans("Rumble"))); @@ -74,8 +74,8 @@ GCPad::GCPad(const unsigned int index) : m_index(index) // dpad groups.push_back(m_dpad = new Buttons(_trans("D-Pad"))); - for (unsigned int i=0; i < 4; ++i) - m_dpad->controls.push_back(new ControlGroup::Input(named_directions[i])); + for (auto& named_direction : named_directions) + m_dpad->controls.push_back(new ControlGroup::Input(named_direction)); // options groups.push_back(m_options = new ControlGroup(_trans("Options"))); @@ -119,7 +119,7 @@ void GCPad::GetInput(SPADStatus* const pad) void GCPad::SetMotor(const u8 on) { float state = (float)on / 255; - float force = abs(state - 0.5) * 2; + float force = abs(state - 0.5f) * 2; if (state < 0.5) force = -force; @@ -209,5 +209,5 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) bool GCPad::GetMicButton() const { - return m_buttons->controls.back()->control_ref->State(); + return (0.0f != m_buttons->controls.back()->control_ref->State()); } diff --git a/Source/Core/Core/Src/HW/GCPadEmu.h b/Source/Core/Core/Src/HW/GCPadEmu.h index aa5b33d252..94d07b539f 100644 --- a/Source/Core/Core/Src/HW/GCPadEmu.h +++ b/Source/Core/Core/Src/HW/GCPadEmu.h @@ -19,10 +19,10 @@ public: void SetMotor(const u8 on); bool GetMicButton() const; - - std::string GetName() const; - void LoadDefaults(const ControllerInterface& ciface); + std::string GetName() const override; + + void LoadDefaults(const ControllerInterface& ciface) override; private: diff --git a/Source/Core/Core/Src/HW/GPFifo.cpp b/Source/Core/Core/Src/HW/GPFifo.cpp index c889466938..88371a68d9 100644 --- a/Source/Core/Core/Src/HW/GPFifo.cpp +++ b/Source/Core/Core/Src/HW/GPFifo.cpp @@ -16,7 +16,7 @@ namespace GPFifo { // 32 Byte gather pipe with extra space -// Overfilling is no problem (up to the real limit), CheckGatherPipe will blast the +// Overfilling is no problem (up to the real limit), CheckGatherPipe will blast the // contents in nicely sized chunks // Other optimizations to think about: @@ -24,7 +24,7 @@ namespace GPFifo // If the gp is NOT linked to the fifo, just blast to memory byte by word // If the gp IS linked to the fifo, use a fast wrapping buffer and skip writing to memory -// Both of these should actually work! Only problem is that we have to decide at run time, +// Both of these should actually work! Only problem is that we have to decide at run time, // the same function could use both methods. Compile 2 different versions of each such block? u8 GC_ALIGNED32(m_gatherPipe[GATHER_PIPE_SIZE*16]); //more room, for the fastmodes @@ -80,10 +80,10 @@ void STACKALIGN CheckGatherPipe() g_video_backend->Video_GatherPipeBursted(); } - + // move back the spill bytes memmove(m_gatherPipe, m_gatherPipe + cnt, m_gatherPipeCount); - + // Profile where the FIFO writes are occurring. if (jit && PC != 0 && (jit->js.fifoWriteAddresses.find(PC)) == (jit->js.fifoWriteAddresses.end())) { diff --git a/Source/Core/Core/Src/HW/HW.cpp b/Source/Core/Core/Src/HW/HW.cpp index cef3666d59..586344ecc6 100644 --- a/Source/Core/Core/Src/HW/HW.cpp +++ b/Source/Core/Core/Src/HW/HW.cpp @@ -3,7 +3,6 @@ // Refer to the license.txt file included. #include "Common.h" -#include "Thunk.h" #include "../Core.h" #include "HW.h" #include "../PowerPC/PowerPC.h" diff --git a/Source/Core/Core/Src/HW/Memmap.cpp b/Source/Core/Core/Src/HW/Memmap.cpp index 96f2945391..82f3141040 100644 --- a/Source/Core/Core/Src/HW/Memmap.cpp +++ b/Source/Core/Core/Src/HW/Memmap.cpp @@ -128,7 +128,7 @@ template void HW_Write_Memory(T _Data, const u32 _Address) } // Create shortcuts to the hardware devices' read and write functions. -// This can be seen as an alternative to a switch() or if() table. +// This can be seen as an alternative to a switch() or if() table. #define BLOCKSIZE 4 #define CP_START 0x00 //0x0000 >> 10 #define WII_IPC_START 0x00 //0x0000 >> 10 @@ -340,7 +340,7 @@ static const int num_views = sizeof(views) / sizeof(MemoryView); void Init() { bool wii = SConfig::GetInstance().m_LocalCoreStartupParameter.bWii; - bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1; + bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true; bMMU = SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU; u32 flags = 0; @@ -406,11 +406,11 @@ bool AreMemoryBreakpointsActivated() u32 Read_Instruction(const u32 em_address) { - UGeckoInstruction inst = ReadUnchecked_U32(em_address); + UGeckoInstruction inst = ReadUnchecked_U32(em_address); return inst.hex; } -void WriteBigEData(const u8 *_pData, const u32 _Address, const u32 _iSize) +void WriteBigEData(const u8 *_pData, const u32 _Address, const size_t _iSize) { memcpy(GetPointer(_Address), _pData, _iSize); } diff --git a/Source/Core/Core/Src/HW/Memmap.h b/Source/Core/Core/Src/HW/Memmap.h index a4cef35cf6..819829c354 100644 --- a/Source/Core/Core/Src/HW/Memmap.h +++ b/Source/Core/Core/Src/HW/Memmap.h @@ -49,7 +49,7 @@ namespace Memory // In 64-bit, this might point to "high memory" (above the 32-bit limit), // so be sure to load it into a 64-bit register. -extern u8 *base; +extern u8 *base; // These are guaranteed to point to "low memory" addresses (sub-32-bit). extern u8 *m_pRAM; @@ -79,7 +79,7 @@ enum ADDR_MASK_HW_ACCESS = 0x0c000000, ADDR_MASK_MEM1 = 0x20000000, -#ifdef _M_IX86 +#ifndef _M_X64 MEMVIEW32_MASK = 0x3FFFFFFF, #endif }; @@ -110,16 +110,16 @@ inline u8* GetCachePtr() {return m_pL1Cache;} inline u8* GetMainRAMPtr() {return m_pRAM;} inline u32 ReadFast32(const u32 _Address) { -#ifdef _M_IX86 - return Common::swap32(*(u32 *)(base + (_Address & MEMVIEW32_MASK))); // ReadUnchecked_U32(_Address); -#elif defined(_M_X64) +#if defined(_M_X64) return Common::swap32(*(u32 *)(base + _Address)); +#else + return Common::swap32(*(u32 *)(base + (_Address & MEMVIEW32_MASK))); // ReadUnchecked_U32(_Address); #endif } // used by interpreter to read instructions, uses iCache u32 Read_Opcode(const u32 _Address); -// this is used by Debugger a lot. +// this is used by Debugger a lot. // For now, just reads from memory! u32 Read_Instruction(const u32 _Address); @@ -140,7 +140,6 @@ u64 Read_U64(const u32 _Address); float Read_F32(const u32 _Address); double Read_F64(const u32 _Address); - // used by JIT. Return zero-extended 32bit values u32 Read_U8_ZX(const u32 _Address); u32 Read_U16_ZX(const u32 _Address); @@ -157,10 +156,13 @@ void Write_U16_Swap(const u16 _Data, const u32 _Address); void Write_U32_Swap(const u32 _Data, const u32 _Address); void Write_U64_Swap(const u64 _Data, const u32 _Address); +// Useful helper functions, used by ARM JIT +void Write_F64(const double _Data, const u32 _Address); + void WriteHW_U32(const u32 _Data, const u32 _Address); void GetString(std::string& _string, const u32 _Address); -void WriteBigEData(const u8 *_pData, const u32 _Address, const u32 size); +void WriteBigEData(const u8 *_pData, const u32 _Address, const size_t size); void ReadBigEData(u8 *_pDest, const u32 _Address, const u32 size); u8* GetPointer(const u32 _Address); void DMA_LCToMemory(const u32 _iMemAddr, const u32 _iCacheAddr, const u32 _iNumBlocks); diff --git a/Source/Core/Core/Src/HW/MemmapFunctions.cpp b/Source/Core/Core/Src/HW/MemmapFunctions.cpp index b60fd8d50d..40bc5f4a3a 100644 --- a/Source/Core/Core/Src/HW/MemmapFunctions.cpp +++ b/Source/Core/Core/Src/HW/MemmapFunctions.cpp @@ -25,22 +25,26 @@ #include "../PowerPC/PowerPC.h" #include "VideoBackendBase.h" +#ifdef USE_GDBSTUB +#include "../PowerPC/GDBStub.h" +#endif + namespace Memory { // EFB RE /* GXPeekZ -80322de8: rlwinm r0, r3, 2, 14, 29 (0003fffc) a = x << 2 & 0x3fffc +80322de8: rlwinm r0, r3, 2, 14, 29 (0003fffc) a = x << 2 & 0x3fffc 80322dec: oris r0, r0, 0xC800 a |= 0xc8000000 80322df0: rlwinm r3, r0, 0, 20, 9 (ffc00fff) x = a & 0xffc00fff -80322df4: rlwinm r0, r4, 12, 4, 19 (0ffff000) a = (y << 12) & 0x0ffff000; +80322df4: rlwinm r0, r4, 12, 4, 19 (0ffff000) a = (y << 12) & 0x0ffff000; 80322df8: or r0, r3, r0 a |= x; 80322dfc: rlwinm r0, r0, 0, 10, 7 (ff3fffff) a &= 0xff3fffff 80322e00: oris r3, r0, 0x0040 x = a | 0x00400000 80322e04: lwz r0, 0 (r3) r0 = *r3 -80322e08: stw r0, 0 (r5) z = -80322e0c: blr +80322e08: stw r0, 0 (r5) z = +80322e0c: blr */ @@ -124,7 +128,7 @@ inline void hwWriteIOBridge(u32 var, u32 addr) {WII_IOBridge::Write32(var, addr) inline void hwWriteIOBridge(u64 var, u32 addr) {PanicAlert("hwWriteIOBridge: There's no 64-bit HW write. %08x", addr);} // Nasty but necessary. Super Mario Galaxy pointer relies on this stuff. -u32 EFB_Read(const u32 addr) +u32 EFB_Read(const u32 addr) { u32 var = 0; // Convert address to coordinates. It's possible that this should be done @@ -323,8 +327,8 @@ u32 Read_Opcode(u32 _Address) return 0x00000000; } - if (Core::g_CoreStartupParameter.bMMU && - !Core::g_CoreStartupParameter.iTLBHack && + if (Core::g_CoreStartupParameter.bMMU && + !Core::g_CoreStartupParameter.bTLBHack && (_Address & ADDR_MASK_MEM1)) { // TODO: Check for MSR instruction address translation flag before translating @@ -410,7 +414,7 @@ double Read_F64(const u32 _Address) u64 i; double d; } cvt; - + cvt.i = Read_U64(_Address); return cvt.d; } @@ -437,7 +441,7 @@ u32 Read_U16_ZX(const u32 _Address) return (u32)Read_U16(_Address); } -void Write_U8(const u8 _Data, const u32 _Address) +void Write_U8(const u8 _Data, const u32 _Address) { #ifdef ENABLE_MEM_CHECK TMemCheck *mc = PowerPC::memchecks.GetMemCheck(_Address); @@ -470,7 +474,7 @@ void Write_U16_Swap(const u16 _Data, const u32 _Address) { void Write_U32(const u32 _Data, const u32 _Address) -{ +{ #ifdef ENABLE_MEM_CHECK TMemCheck *mc = PowerPC::memchecks.GetMemCheck(_Address); if (mc) @@ -503,8 +507,18 @@ void Write_U64_Swap(const u64 _Data, const u32 _Address) { Write_U64(Common::swap64(_Data), _Address); } +void Write_F64(const double _Data, const u32 _Address) +{ + union + { + u64 i; + double d; + } cvt; + cvt.d = _Data; + Write_U64(cvt.i, _Address); +} u8 ReadUnchecked_U8(const u32 _Address) -{ +{ u8 _var = 0; ReadFromHardware(_var, _Address, _Address, FLAG_NO_EXCEPTION); return _var; @@ -532,7 +546,7 @@ void WriteUnchecked_U32(const u32 _iValue, const u32 _Address) // ********************************************************************************* // Warning: Test Area // -// This code is for TESTING and it works in interpreter mode ONLY. Some games (like +// This code is for TESTING and it works in interpreter mode ONLY. Some games (like // COD iirc) work thanks to this basic TLB emulation. // It is just a small hack and we have never spend enough time to finalize it. // Cheers PearPC! @@ -562,26 +576,26 @@ void WriteUnchecked_U32(const u32 _iValue, const u32 _Address) #define PPC_EXC_DSISR_PAGE (1<<30) #define PPC_EXC_DSISR_PROT (1<<27) -#define PPC_EXC_DSISR_STORE (1<<25) +#define PPC_EXC_DSISR_STORE (1<<25) #define SDR1_HTABORG(v) (((v)>>16)&0xffff) #define SDR1_HTABMASK(v) ((v)&0x1ff) -#define SDR1_PAGETABLE_BASE(v) ((v)&0xffff) +#define SDR1_PAGETABLE_BASE(v) ((v)&0xffff) #define SR_T (1<<31) #define SR_Ks (1<<30) #define SR_Kp (1<<29) #define SR_N (1<<28) #define SR_VSID(v) ((v)&0xffffff) #define SR_BUID(v) (((v)>>20)&0x1ff) -#define SR_CNTRL_SPEC(v) ((v)&0xfffff) +#define SR_CNTRL_SPEC(v) ((v)&0xfffff) -#define EA_SR(v) (((v)>>28)&0xf) -#define EA_PageIndex(v) (((v)>>12)&0xffff) +#define EA_SR(v) (((v)>>28)&0xf) +#define EA_PageIndex(v) (((v)>>12)&0xffff) #define EA_Offset(v) ((v)&0xfff) -#define EA_API(v) (((v)>>22)&0x3f) +#define EA_API(v) (((v)>>22)&0x3f) #define PA_RPN(v) (((v)>>12)&0xfffff) -#define PA_Offset(v) ((v)&0xfff) +#define PA_Offset(v) ((v)&0xfff) #define PTE1_V (1<<31) #define PTE1_VSID(v) (((v)>>7)&0xffffff) @@ -597,7 +611,7 @@ void WriteUnchecked_U32(const u32 _iValue, const u32 _Address) // Hey! these duplicate a structure in Gekko.h union UPTE1 { - struct + struct { u32 API : 6; u32 H : 1; @@ -609,7 +623,7 @@ union UPTE1 union UPTE2 { - struct + struct { u32 PP : 2; u32 : 1; @@ -650,24 +664,24 @@ void SDRUpdated() u32 x = 1; u32 xx = 0; int n = 0; - while ((htabmask & x) && (n < 9)) + while ((htabmask & x) && (n < 9)) { n++; xx|=x; x<<=1; } - if (htabmask & ~xx) + if (htabmask & ~xx) { return; } u32 htaborg = SDR1_HTABORG(PowerPC::ppcState.spr[SPR_SDR]); - if (htaborg & xx) + if (htaborg & xx) { return; } PowerPC::ppcState.pagetable_base = htaborg<<16; PowerPC::ppcState.pagetable_hashmask = ((xx<<10)|0x3ff); -} +} // TLB cache @@ -771,7 +785,7 @@ void UpdateTLBEntry(const XCheckTLBFlag _Flag, UPTE2 PTE2, const u32 vpa) PowerPC::ppcState.itlb_last++; PowerPC::ppcState.itlb_last &= 127; PowerPC::ppcState.itlb_pa[PowerPC::ppcState.itlb_last] = PTE2.RPN << HW_PAGE_INDEX_SHIFT; - PowerPC::ppcState.itlb_va[PowerPC::ppcState.itlb_last] = vpa & ~0xfff; + PowerPC::ppcState.itlb_va[PowerPC::ppcState.itlb_last] = vpa & ~0xfff; } else { @@ -779,7 +793,7 @@ void UpdateTLBEntry(const XCheckTLBFlag _Flag, UPTE2 PTE2, const u32 vpa) PowerPC::ppcState.dtlb_last++; PowerPC::ppcState.dtlb_last &= 127; PowerPC::ppcState.dtlb_pa[PowerPC::ppcState.dtlb_last] = PTE2.RPN << HW_PAGE_INDEX_SHIFT; - PowerPC::ppcState.dtlb_va[PowerPC::ppcState.dtlb_last] = vpa & ~0xfff; + PowerPC::ppcState.dtlb_va[PowerPC::ppcState.dtlb_last] = vpa & ~0xfff; } #endif } @@ -831,12 +845,12 @@ u32 TranslatePageAddress(const u32 _Address, const XCheckTLBFlag _Flag) if (LookupTLBPageAddress(_Flag, _Address, &translatedAddress)) return translatedAddress; - u32 sr = PowerPC::ppcState.sr[EA_SR(_Address)]; + u32 sr = PowerPC::ppcState.sr[EA_SR(_Address)]; - u32 offset = EA_Offset(_Address); // 12 bit + u32 offset = EA_Offset(_Address); // 12 bit u32 page_index = EA_PageIndex(_Address); // 16 bit - u32 VSID = SR_VSID(sr); // 24 bit - u32 api = EA_API(_Address); // 6 bit (part of page_index) + u32 VSID = SR_VSID(sr); // 24 bit + u32 api = EA_API(_Address); // 6 bit (part of page_index) u8* pRAM = GetPointer(0); @@ -850,9 +864,9 @@ u32 TranslatePageAddress(const u32 _Address, const XCheckTLBFlag _Flag) UPTE1 PTE1; PTE1.Hex = bswap(*(u32*)&pRAM[pteg_addr]); - if (PTE1.V && !PTE1.H) + if (PTE1.V && !PTE1.H) { - if (VSID == PTE1.VSID && (api == PTE1.API)) + if (VSID == PTE1.VSID && (api == PTE1.API)) { UPTE2 PTE2; PTE2.Hex = bswap((*(u32*)&pRAM[(pteg_addr + 4)])); @@ -872,13 +886,13 @@ u32 TranslatePageAddress(const u32 _Address, const XCheckTLBFlag _Flag) return ((PTE2.RPN << 12) | offset); } } - pteg_addr+=8; + pteg_addr+=8; } // hash function no 2 "not" .360 hash1 = ~hash1; pteg_addr = ((hash1 & PowerPC::ppcState.pagetable_hashmask) << 6) | PowerPC::ppcState.pagetable_base; - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { u32 pte = bswap(*(u32*)&pRAM[pteg_addr]); if ((pte & PTE1_V) && (pte & PTE1_H)) @@ -896,13 +910,13 @@ u32 TranslatePageAddress(const u32 _Address, const XCheckTLBFlag _Flag) case FLAG_WRITE: PTE2.C = 1; break; case FLAG_NO_EXCEPTION: break; case FLAG_OPCODE: break; - } + } *(u32*)&pRAM[(pteg_addr + 4)] = bswap(PTE2.Hex); return ((PTE2.RPN << 12) | offset); } } - pteg_addr+=8; + pteg_addr+=8; } return 0; } diff --git a/Source/Core/Core/Src/HW/MemoryInterface.cpp b/Source/Core/Core/Src/HW/MemoryInterface.cpp index 9eb833cbc0..80f451687b 100644 --- a/Source/Core/Core/Src/HW/MemoryInterface.cpp +++ b/Source/Core/Core/Src/HW/MemoryInterface.cpp @@ -61,7 +61,7 @@ void Write32(const u32 _iValue, const u32 _iAddress) } //TODO : check -void Write16(const u16 _iValue, const u32 _iAddress) +void Write16(const u16 _iValue, const u32 _iAddress) { INFO_LOG(MEMMAP, "(w16) 0x%04x @ 0x%08x", _iValue, _iAddress); switch(_iAddress & 0xFFF) diff --git a/Source/Core/Core/Src/HW/MemoryInterface.h b/Source/Core/Core/Src/HW/MemoryInterface.h index ffa255b4b2..2a4fa2a8e1 100644 --- a/Source/Core/Core/Src/HW/MemoryInterface.h +++ b/Source/Core/Core/Src/HW/MemoryInterface.h @@ -13,7 +13,7 @@ namespace MemoryInterface void DoState(PointerWrap &p); void Read16(u16& _uReturnValue, const u32 _iAddress); -void Read32(u32& _uReturnValue, const u32 _iAddress); +void Read32(u32& _uReturnValue, const u32 _iAddress); void Write32(const u32 _iValue, const u32 _iAddress); void Write16(const u16 _iValue, const u32 _iAddress); } // end of namespace MemoryInterface diff --git a/Source/Core/Core/Src/HW/ProcessorInterface.cpp b/Source/Core/Core/Src/HW/ProcessorInterface.cpp index 273ee32231..68b0ce960b 100644 --- a/Source/Core/Core/Src/HW/ProcessorInterface.cpp +++ b/Source/Core/Core/Src/HW/ProcessorInterface.cpp @@ -101,12 +101,12 @@ void Read32(u32& _uReturnValue, const u32 _iAddress) { //INFO_LOG(PROCESSORINTERFACE, "(r32) 0x%08x", _iAddress); - switch(_iAddress & 0xFFF) + switch(_iAddress & 0xFFF) { case PI_INTERRUPT_CAUSE: _uReturnValue = m_InterruptCause; return; - + case PI_INTERRUPT_MASK: _uReturnValue = m_InterruptMask; return; @@ -136,31 +136,31 @@ void Read32(u32& _uReturnValue, const u32 _iAddress) INFO_LOG(PROCESSORINTERFACE, "Read flipper rev, 0x%08x", m_FlipperRev); _uReturnValue = m_FlipperRev; return; - + default: ERROR_LOG(PROCESSORINTERFACE, "!!!!Unknown write!!!! 0x%08x", _iAddress); break; } - + _uReturnValue = 0xAFFE0000; } void Write32(const u32 _uValue, const u32 _iAddress) { //INFO_LOG(PROCESSORINTERFACE, "(w32) 0x%08x @ 0x%08x", _uValue, _iAddress); - switch(_iAddress & 0xFFF) + switch(_iAddress & 0xFFF) { case PI_INTERRUPT_CAUSE: Common::AtomicAnd(m_InterruptCause, ~_uValue); // writes turn them off UpdateException(); return; - case PI_INTERRUPT_MASK: + case PI_INTERRUPT_MASK: m_InterruptMask = _uValue; DEBUG_LOG(PROCESSORINTERFACE,"New Interrupt mask: %08x", m_InterruptMask); UpdateException(); return; - + case PI_FIFO_BASE: Fifo_CPUBase = _uValue & 0xFFFFFFE0; DEBUG_LOG(PROCESSORINTERFACE,"Fifo base = %08x", _uValue); @@ -172,7 +172,7 @@ void Write32(const u32 _uValue, const u32 _iAddress) break; case PI_FIFO_WPTR: - Fifo_CPUWritePointer = _uValue & 0xFFFFFFE0; + Fifo_CPUWritePointer = _uValue & 0xFFFFFFE0; DEBUG_LOG(PROCESSORINTERFACE,"Fifo writeptr = %08x", _uValue); break; @@ -245,12 +245,12 @@ void SetInterrupt(u32 _causemask, bool _bSet) { DEBUG_LOG(PROCESSORINTERFACE, "Setting Interrupt %s (clear)", Debug_GetInterruptName(_causemask)); } - + if (_bSet) Common::AtomicOr(m_InterruptCause, _causemask); else Common::AtomicAnd(m_InterruptCause, ~_causemask);// is there any reason to have this possibility? - // F|RES: i think the hw devices reset the interrupt in the PI to 0 + // F|RES: i think the hw devices reset the interrupt in the PI to 0 // if the interrupt cause is eliminated. that isnt done by software (afaik) UpdateException(); } diff --git a/Source/Core/Core/Src/HW/ProcessorInterface.h b/Source/Core/Core/Src/HW/ProcessorInterface.h index 2ca2d74219..7feefa2e14 100644 --- a/Source/Core/Core/Src/HW/ProcessorInterface.h +++ b/Source/Core/Core/Src/HW/ProcessorInterface.h @@ -5,7 +5,7 @@ #ifndef _PROCESSORINTERFACE_H #define _PROCESSORINTERFACE_H -#include "Common.h" +#include "CommonTypes.h" class PointerWrap; // Holds statuses of things like the write gatherer used for fifos, and interrupts from various sources @@ -16,9 +16,9 @@ namespace ProcessorInterface enum InterruptCause { INT_CAUSE_PI = 0x1, // YAGCD says: GP runtime error - INT_CAUSE_RSW = 0x2, // Reset Switch - INT_CAUSE_DI = 0x4, // DVD interrupt - INT_CAUSE_SI = 0x8, // Serial interface + INT_CAUSE_RSW = 0x2, // Reset Switch + INT_CAUSE_DI = 0x4, // DVD interrupt + INT_CAUSE_SI = 0x8, // Serial interface INT_CAUSE_EXI = 0x10, // Expansion interface INT_CAUSE_AI = 0x20, // Audio Interface Streaming INT_CAUSE_DSP = 0x40, // DSP interface diff --git a/Source/Core/Core/Src/HW/SI.cpp b/Source/Core/Core/Src/HW/SI.cpp index 9142919346..7f46b9a101 100644 --- a/Source/Core/Core/Src/HW/SI.cpp +++ b/Source/Core/Core/Src/HW/SI.cpp @@ -7,7 +7,7 @@ #include "../ConfigManager.h" #include "../CoreTiming.h" #include "../Movie.h" -#include "../NetPlayClient.h" +#include "../NetPlayProto.h" #include "SystemTimers.h" #include "ProcessorInterface.h" @@ -222,7 +222,7 @@ void DoState(PointerWrap &p) p.Do(g_Channel[i].m_InHi.Hex); p.Do(g_Channel[i].m_InLo.Hex); p.Do(g_Channel[i].m_Out.Hex); - + ISIDevice* pDevice = g_Channel[i].m_pDevice; SIDevices type = pDevice->GetDeviceType(); p.Do(type); @@ -249,22 +249,20 @@ void DoState(PointerWrap &p) p.DoPOD(g_StatusReg); p.Do(g_EXIClockCount); p.Do(g_SIBuffer); -} +} void Init() { for (int i = 0; i < NUMBER_OF_CHANNELS; i++) - { + { g_Channel[i].m_Out.Hex = 0; g_Channel[i].m_InHi.Hex = 0; g_Channel[i].m_InLo.Hex = 0; if (Movie::IsRecordingInput() || Movie::IsPlayingInput()) AddDevice(Movie::IsUsingPad(i) ? (Movie::IsUsingBongo(i) ? SIDEVICE_GC_TARUKONGA : SIDEVICE_GC_CONTROLLER) : SIDEVICE_NONE, i); - else if (NetPlay::IsNetPlayRunning()) - AddDevice((SIDevices) g_NetPlaySettings.m_Controllers[i], i); - else + else if (!NetPlay::IsNetPlayRunning()) AddDevice(SConfig::GetInstance().m_SIDevice[i], i); } @@ -567,7 +565,7 @@ void AddDevice(ISIDevice* pDevice) void AddDevice(const SIDevices _device, int _iDeviceNumber) { - ISIDevice* pDevice = SIDevice_Create(_device, _iDeviceNumber); + ISIDevice *pDevice = SIDevice_Create(_device, _iDeviceNumber); AddDevice(pDevice); } @@ -646,7 +644,10 @@ int GetTicksToNextSIPoll() // Poll for input at regular intervals (once per frame) when playing or recording a movie if (Movie::IsPlayingInput() || Movie::IsRecordingInput()) { - return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate; + if (Movie::IsNetPlayRecording()) + return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate / 2; + else + return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate; } if (NetPlay::IsNetPlayRunning()) return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate / 2; diff --git a/Source/Core/Core/Src/HW/SI_Device.cpp b/Source/Core/Core/Src/HW/SI_Device.cpp index e9674bcab6..ee0e649b5e 100644 --- a/Source/Core/Core/Src/HW/SI_Device.cpp +++ b/Source/Core/Core/Src/HW/SI_Device.cpp @@ -44,19 +44,19 @@ public: CSIDevice_Null(SIDevices device, int _iDeviceNumber) : ISIDevice(device, _iDeviceNumber) {} virtual ~CSIDevice_Null() {} - int RunBuffer(u8* _pBuffer, int _iLength) { + int RunBuffer(u8* _pBuffer, int _iLength) override { reinterpret_cast(_pBuffer)[0] = SI_ERROR_NO_RESPONSE; return 4; } - bool GetData(u32& _Hi, u32& _Low) { + bool GetData(u32& _Hi, u32& _Low) override { _Hi = 0x80000000; return true; } - void SendCommand(u32 _Cmd, u8 _Poll) {} + void SendCommand(u32 _Cmd, u8 _Poll) override {} }; -// F A C T O R Y +// F A C T O R Y ISIDevice* SIDevice_Create(const SIDevices device, const int port_number) { switch (device) diff --git a/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.cpp b/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.cpp index 83af23b7a7..96d3fba56c 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.cpp @@ -92,7 +92,7 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) int iPosition = 0; while(iPosition < _iLength) - { + { // read the command EBufferCommands command = static_cast(_pBuffer[iPosition ^ 3]); iPosition++; @@ -106,7 +106,7 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) iPosition = _iLength; // break the while loop } break; - case CMD_GCAM: + case CMD_GCAM: { int i; @@ -188,7 +188,7 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) case 0x1f: { ERROR_LOG(AMBASEBOARDDEBUG, "GC-AM: Command 1f, %02x %02x %02x %02x %02x (REGION)", ptr(1), ptr(2), ptr(3), ptr(4), ptr(5)); - unsigned char string[] = + unsigned char string[] = "\x00\x00\x30\x00" //"\x01\xfe\x00\x00" // JAPAN "\x02\xfd\x00\x00" // USA @@ -232,7 +232,7 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) case 0x4e: case 0x4f: { - DEBUG_LOG(AMBASEBOARDDEBUG, "GC-AM: Command %02x, %02x %02x %02x %02x %02x %02x %02x (JVS IO)", + DEBUG_LOG(AMBASEBOARDDEBUG, "GC-AM: Command %02x, %02x %02x %02x %02x %02x %02x %02x (JVS IO)", ptr(0), ptr(1), ptr(2), ptr(3), ptr(4), ptr(5), ptr(6), ptr(7)); int pptr = 2; JVSIOMessage msg; @@ -283,8 +283,8 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* _pBuffer, int _iLength) msg.addData(1); msg.addData((void *)"\x01\x02\x0a\x00", 4); // 2 player, 10 bit msg.addData((void *)"\x02\x02\x00\x00", 4); // 2 coin slots - //msg.addData((void *)"\x03\x02\x08\x00", 4); - msg.addData((void *)"\x00\x00\x00\x00", 4); + //msg.addData((void *)"\x03\x02\x08\x00", 4); + msg.addData((void *)"\x00\x00\x00\x00", 4); break; case 0x15: while (*jvs_io++) {}; diff --git a/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.h b/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.h index 8c135ca980..d7b31a5ede 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.h +++ b/Source/Core/Core/Src/HW/SI_DeviceAMBaseboard.h @@ -20,13 +20,13 @@ public: CSIDevice_AMBaseboard(SIDevices device, int _iDeviceNumber); // run the SI Buffer - virtual int RunBuffer(u8* _pBuffer, int _iLength); + virtual int RunBuffer(u8* _pBuffer, int _iLength) override; // return true on new data - virtual bool GetData(u32& _Hi, u32& _Low); + virtual bool GetData(u32& _Hi, u32& _Low) override; // send a command directly - virtual void SendCommand(u32 _Cmd, u8 _Poll); + virtual void SendCommand(u32 _Cmd, u8 _Poll) override; }; #endif // _SIDEVICE_AMBASEBOARD_H diff --git a/Source/Core/Core/Src/HW/SI_DeviceDanceMat.cpp b/Source/Core/Core/Src/HW/SI_DeviceDanceMat.cpp index 30237286e6..72420abf9b 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceDanceMat.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceDanceMat.cpp @@ -2,9 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include -#include - #include "SI.h" #include "SI_Device.h" #include "SI_DeviceDanceMat.h" @@ -88,7 +85,7 @@ int CSIDevice_DanceMat::RunBuffer(u8* _pBuffer, int _iLength) for (int i = 0; i < (int)sizeof(SOrigin); i++) { _pBuffer[i ^ 3] = *pCalibration++; - } + } } break; @@ -97,7 +94,7 @@ int CSIDevice_DanceMat::RunBuffer(u8* _pBuffer, int _iLength) { ERROR_LOG(SERIALINTERFACE, "Unknown SI command (0x%x)", command); PanicAlert("SI: Unknown command (0x%x)", command); - } + } break; } @@ -115,7 +112,7 @@ bool CSIDevice_DanceMat::GetData(u32& _Hi, u32& _Low) { SPADStatus PadStatus; memset(&PadStatus, 0, sizeof(PadStatus)); - + Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus); Movie::CallInputManip(&PadStatus, ISIDevice::m_iDeviceNumber); @@ -231,7 +228,7 @@ void CSIDevice_DanceMat::SendCommand(u32 _Cmd, u8 _Poll) unsigned int uStrength = command.Parameter2; // get the correct pad number that should rumble locally when using netplay - const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber); + const u8 numPAD = NetPlay_InGamePadToLocalPad(ISIDevice::m_iDeviceNumber); if (numPAD < 4) Pad::Rumble(numPAD, uType, uStrength); diff --git a/Source/Core/Core/Src/HW/SI_DeviceDanceMat.h b/Source/Core/Core/Src/HW/SI_DeviceDanceMat.h index b30c107847..f2dbb2f311 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceDanceMat.h +++ b/Source/Core/Core/Src/HW/SI_DeviceDanceMat.h @@ -13,7 +13,7 @@ class CSIDevice_DanceMat : public ISIDevice { private: - + // Commands enum EBufferCommands { @@ -47,7 +47,7 @@ private: union UCommand { u32 Hex; - struct + struct { u32 Parameter1 : 8; u32 Parameter2 : 8; @@ -86,20 +86,20 @@ public: CSIDevice_DanceMat(SIDevices device, int _iDeviceNumber); // Run the SI Buffer - virtual int RunBuffer(u8* _pBuffer, int _iLength); + virtual int RunBuffer(u8* _pBuffer, int _iLength) override; // Send and Receive pad input from network static bool NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus); - static u8 NetPlay_GetPadNum(u8 numPAD); + static u8 NetPlay_InGamePadToLocalPad(u8 numPAD); // Return true on new data - virtual bool GetData(u32& _Hi, u32& _Low); + virtual bool GetData(u32& _Hi, u32& _Low) override; // Send a command directly - virtual void SendCommand(u32 _Cmd, u8 _Poll); + virtual void SendCommand(u32 _Cmd, u8 _Poll) override; // Savestate support - virtual void DoState(PointerWrap& p); + virtual void DoState(PointerWrap& p) override; }; #endif diff --git a/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp b/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp index 937bf45036..6a59ecd3af 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp @@ -26,9 +26,9 @@ void GBAConnectionWaiter() // "dolphin gba" if (!server.Listen(0xd6ba)) return; - + server.SetBlocking(false); - + sf::SocketTCP new_client; while (server_running) { diff --git a/Source/Core/Core/Src/HW/SI_DeviceGBA.h b/Source/Core/Core/Src/HW/SI_DeviceGBA.h index 7783d06285..d2fa333096 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGBA.h +++ b/Source/Core/Core/Src/HW/SI_DeviceGBA.h @@ -39,10 +39,10 @@ public: ~CSIDevice_GBA() {} // Run the SI Buffer - virtual int RunBuffer(u8* _pBuffer, int _iLength); + virtual int RunBuffer(u8* _pBuffer, int _iLength) override; - virtual bool GetData(u32& _Hi, u32& _Low) { return true; } - virtual void SendCommand(u32 _Cmd, u8 _Poll) {} + virtual bool GetData(u32& _Hi, u32& _Low) override { return true; } + virtual void SendCommand(u32 _Cmd, u8 _Poll) override {} }; #endif diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index f6e0846b51..2db017d5c6 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -2,9 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include -#include - #include "SI.h" #include "SI_Device.h" #include "SI_DeviceGCController.h" @@ -88,7 +85,7 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength) for (int i = 0; i < (int)sizeof(SOrigin); i++) { _pBuffer[i ^ 3] = *pCalibration++; - } + } } break; @@ -97,7 +94,7 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength) { ERROR_LOG(SERIALINTERFACE, "Unknown SI command (0x%x)", command); PanicAlert("SI: Unknown command (0x%x)", command); - } + } break; } @@ -115,7 +112,7 @@ bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) { SPADStatus PadStatus; memset(&PadStatus, 0, sizeof(PadStatus)); - + Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus); Movie::CallInputManip(&PadStatus, ISIDevice::m_iDeviceNumber); @@ -249,7 +246,7 @@ void CSIDevice_GCController::SendCommand(u32 _Cmd, u8 _Poll) unsigned int uStrength = command.Parameter2; // get the correct pad number that should rumble locally when using netplay - const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber); + const u8 numPAD = NetPlay_InGamePadToLocalPad(ISIDevice::m_iDeviceNumber); if (numPAD < 4) Pad::Rumble(numPAD, uType, uStrength); diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.h b/Source/Core/Core/Src/HW/SI_DeviceGCController.h index a43e5027ce..c0278eebfd 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.h +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.h @@ -13,7 +13,7 @@ class CSIDevice_GCController : public ISIDevice { private: - + // Commands enum EBufferCommands { @@ -47,7 +47,7 @@ private: union UCommand { u32 Hex; - struct + struct { u32 Parameter1 : 8; u32 Parameter2 : 8; @@ -90,7 +90,7 @@ public: // Send and Receive pad input from network static bool NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus); - static u8 NetPlay_GetPadNum(u8 numPAD); + static u8 NetPlay_InGamePadToLocalPad(u8 numPAD); // Return true on new data virtual bool GetData(u32& _Hi, u32& _Low); diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp index 562a450422..322b0bcfc2 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.cpp @@ -2,9 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include -#include - #include "SI.h" #include "SI_Device.h" #include "SI_DeviceGCSteeringWheel.h" @@ -105,7 +102,7 @@ bool CSIDevice_GCSteeringWheel::GetData(u32& _Hi, u32& _Low) { SPADStatus PadStatus; memset(&PadStatus, 0, sizeof(PadStatus)); - + Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus); Movie::CallInputManip(&PadStatus, ISIDevice::m_iDeviceNumber); @@ -254,7 +251,7 @@ void CSIDevice_GCSteeringWheel::SendCommand(u32 _Cmd, u8 _Poll) unsigned int uType = command.Parameter2; // 06 = motor on, 04 = motor off // get the correct pad number that should rumble locally when using netplay - const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber); + const u8 numPAD = NetPlay_InGamePadToLocalPad(ISIDevice::m_iDeviceNumber); if (numPAD < 4) Pad::Motor(numPAD, uType, uStrength); @@ -273,7 +270,7 @@ void CSIDevice_GCSteeringWheel::SendCommand(u32 _Cmd, u8 _Poll) unsigned int uStrength = command.Parameter2; // get the correct pad number that should rumble locally when using netplay - const u8 numPAD = NetPlay_GetPadNum(ISIDevice::m_iDeviceNumber); + const u8 numPAD = NetPlay_InGamePadToLocalPad(ISIDevice::m_iDeviceNumber); if (numPAD < 4) Pad::Rumble(numPAD, uType, uStrength); diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h index 2c539e56d4..050a1220ce 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h +++ b/Source/Core/Core/Src/HW/SI_DeviceGCSteeringWheel.h @@ -13,7 +13,7 @@ class CSIDevice_GCSteeringWheel : public ISIDevice { private: - + // Commands enum EBufferCommands { @@ -48,7 +48,7 @@ private: union UCommand { u32 Hex; - struct + struct { u32 Parameter1 : 8; u32 Parameter2 : 8; @@ -91,7 +91,7 @@ public: // Send and Receive pad input from network static bool NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus); - static u8 NetPlay_GetPadNum(u8 numPAD); + static u8 NetPlay_InGamePadToLocalPad(u8 numPAD); // Return true on new data virtual bool GetData(u32& _Hi, u32& _Low); diff --git a/Source/Core/Core/Src/HW/Sram.cpp b/Source/Core/Core/Src/HW/Sram.cpp index ba2fa12957..8c135798b3 100644 --- a/Source/Core/Core/Src/HW/Sram.cpp +++ b/Source/Core/Core/Src/HW/Sram.cpp @@ -31,7 +31,7 @@ SRAM sram_dump = {{ #if 0 // german -SRAM sram_dump_german = {{ +SRAM sram_dump_german = {{ 0x1F, 0x66, 0xE0, 0x96, 0x00, 0x00, 0x00, 0x00, @@ -81,7 +81,7 @@ void SetCardFlashID(u8* buffer, u8 card_index) { rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); csum += g_SRAM.flash_id[card_index][i] = buffer[i] - ((u8)rand&0xff); - rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); + rand = (((rand * (u64)0x0000000041c64e6dULL) + (u64)0x0000000000003039ULL) >> 16); rand &= (u64)0x0000000000007fffULL; } g_SRAM.flashID_chksum[card_index] = csum^0xFF; diff --git a/Source/Core/Core/Src/HW/Sram.h b/Source/Core/Core/Src/HW/Sram.h index 91e8b2a8b9..30d535a5b8 100644 --- a/Source/Core/Core/Src/HW/Sram.h +++ b/Source/Core/Core/Src/HW/Sram.h @@ -36,7 +36,7 @@ distribution. #ifndef __SRAM_h__ #define __SRAM_h__ -#include "Common.h" +#include "CommonTypes.h" #pragma pack(push,1) union SRAM diff --git a/Source/Core/Core/Src/HW/StreamADPCM.cpp b/Source/Core/Core/Src/HW/StreamADPCM.cpp index 91e4763ed2..4534f468a9 100644 --- a/Source/Core/Core/Src/HW/StreamADPCM.cpp +++ b/Source/Core/Core/Src/HW/StreamADPCM.cpp @@ -35,7 +35,7 @@ s16 ADPDecodeSample(s32 bits, s32 q, s32& hist1, s32& hist2) if (hist < -0x200000) hist = -0x200000; s32 cur = (((s16)(bits << 12) >> (q & 0xf)) << 6) + hist; - + hist2 = hist1; hist1 = cur; diff --git a/Source/Core/Core/Src/HW/SystemTimers.cpp b/Source/Core/Core/Src/HW/SystemTimers.cpp index bf77060c83..140ef652bf 100644 --- a/Source/Core/Core/Src/HW/SystemTimers.cpp +++ b/Source/Core/Core/Src/HW/SystemTimers.cpp @@ -119,7 +119,7 @@ int et_PatchEngine; // PatchEngine updates every 1/60th of a second by default // These are badly educated guesses // Feel free to experiment. Set these in Init below. int - // This is a fixed value, don't change it + // This is a fixed value, don't change it AUDIO_DMA_PERIOD, // Regulates the speed of the Command Processor @@ -200,7 +200,7 @@ void DecrementerSet() { CoreTiming::SetFakeDecStartTicks(CoreTiming::GetTicks()); CoreTiming::SetFakeDecStartValue(decValue); - + CoreTiming::ScheduleEvent(decValue * TIMER_RATIO, et_Dec); } } diff --git a/Source/Core/Core/Src/HW/SystemTimers.h b/Source/Core/Core/Src/HW/SystemTimers.h index 331dbf8c85..ef69f6e65a 100644 --- a/Source/Core/Core/Src/HW/SystemTimers.h +++ b/Source/Core/Core/Src/HW/SystemTimers.h @@ -18,7 +18,7 @@ #ifndef _SYSTEMTIMERS_H #define _SYSTEMTIMERS_H -#include "Common.h" +#include "CommonTypes.h" namespace SystemTimers { diff --git a/Source/Core/Core/Src/HW/VideoInterface.cpp b/Source/Core/Core/Src/HW/VideoInterface.cpp index e5d32a9a8f..3c68493eed 100644 --- a/Source/Core/Core/Src/HW/VideoInterface.cpp +++ b/Source/Core/Core/Src/HW/VideoInterface.cpp @@ -461,7 +461,7 @@ void Write16(const u16 _iValue, const u32 _iAddress) } UpdateParameters(); - } + } break; case VI_HORIZONTAL_TIMING_0_HI: @@ -803,20 +803,38 @@ static void BeginField(FieldType field) { u32 fbWidth = m_HorizontalStepping.FieldSteps * 16; u32 fbHeight = (m_HorizontalStepping.FbSteps / m_HorizontalStepping.FieldSteps) * m_VerticalTimingRegister.ACV; + u32 xfbAddr; // NTSC and PAL have opposite field orders. - FieldType order = (m_DisplayControlRegister.FMT == 0) ? FIELD_LOWER : FIELD_UPPER; - u32 xfbAddr = (field == order) ? GetXFBAddressBottom() : GetXFBAddressTop(); + if (m_DisplayControlRegister.FMT == 1) // PAL + { + // But the PAL ports of some games are poorly programmed and don't use correct ordering. + // Zelda: Wind Waker and Simpsons Hit & Run are exampes of this, there are probally more. + // PAL Wind Waker also runs at 30fps instead of 25. + if(field == FieldType::FIELD_PROGRESSIVE || GetXFBAddressBottom() != (GetXFBAddressTop() - 1280)) + { + WARN_LOG(VIDEOINTERFACE, "PAL game is trying to use incorrect (NTSC) field ordering"); + // Lets kindly fix this for them. + xfbAddr = GetXFBAddressTop(); + + // TODO: PAL Simpsons Hit & Run now has a green line at the bottom when Real XFB is used. + // Might be a bug later on in our code, or a bug in the actual game. + } else { + xfbAddr = GetXFBAddressBottom(); + } + } else { + xfbAddr = GetXFBAddressTop(); + } static const char* const fieldTypeNames[] = { "Progressive", "Upper", "Lower" }; - DEBUG_LOG(VIDEOINTERFACE, "(VI->BeginField): Address: %.08X | FieldSteps %u | FbSteps %u | ACV %u | Field %s", - xfbAddr, m_HorizontalStepping.FieldSteps, m_HorizontalStepping.FbSteps, m_VerticalTimingRegister.ACV, - fieldTypeNames[field] - ); + DEBUG_LOG(VIDEOINTERFACE, + "(VI->BeginField): Address: %.08X | FieldSteps %u | FbSteps %u | ACV %u | Field %s", + xfbAddr, m_HorizontalStepping.FieldSteps,m_HorizontalStepping.FbSteps, + m_VerticalTimingRegister.ACV, fieldTypeNames[field]); if (xfbAddr) - g_video_backend->Video_BeginField(xfbAddr, field, fbWidth, fbHeight); + g_video_backend->Video_BeginField(xfbAddr, fbWidth, fbHeight); } static void EndField() diff --git a/Source/Core/Core/Src/HW/VideoInterface.h b/Source/Core/Core/Src/HW/VideoInterface.h index 59f21a6b82..aaaedf5209 100644 --- a/Source/Core/Core/Src/HW/VideoInterface.h +++ b/Source/Core/Core/Src/HW/VideoInterface.h @@ -5,7 +5,7 @@ #ifndef _VIDEOINTERFACE_H #define _VIDEOINTERFACE_H -#include "Common.h" +#include "CommonTypes.h" class PointerWrap; namespace VideoInterface @@ -132,8 +132,8 @@ union UVIHorizontalTiming0 { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 HLW : 9; // Halfline Width (W*16 = Width (720)) u32 : 7; u32 HCE : 7; // Horizontal Sync Start to Color Burst End @@ -147,8 +147,8 @@ union UVIHorizontalTiming1 { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 HSY : 7; // Horizontal Sync Width u32 HBE640 : 9; // Horizontal Sync Start to horizontal blank end u32 : 1; @@ -162,8 +162,8 @@ union UVIVBlankTimingRegister { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 PRB : 10; // Pre-blanking in half lines u32 : 6; u32 PSB : 10; // Post blanking in half lines @@ -176,8 +176,8 @@ union UVIBurstBlankingRegister { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 BS0 : 5; // Field x start to burst blanking start in halflines u32 BE0 : 11; // Field x start to burst blanking end in halflines u32 BS2 : 5; // Field x+2 start to burst blanking start in halflines @@ -189,7 +189,7 @@ union UVIFBInfoRegister { u32 Hex; struct { u16 Lo, Hi; }; - struct + struct { // TODO: mask out lower 9bits/align to 9bits??? u32 FBB : 24; // Base address of the framebuffer in external mem @@ -205,8 +205,8 @@ union UVIInterruptRegister { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 HCT : 11; // Horizontal Position u32 : 5; u32 VCT : 11; // Vertical Position @@ -221,8 +221,8 @@ union UVILatchRegister { u32 Hex; struct { u16 Lo, Hi; }; - struct - { + struct + { u32 HCT : 11; // Horizontal Count u32 : 5; u32 VCT : 11; // Vertical Count @@ -307,7 +307,7 @@ union UVIBorderBlankRegister union UVIDTVStatus { u16 Hex; - struct + struct { u16 component_plugged : 1; u16 ntsc_j : 1; diff --git a/Source/Core/Core/Src/HW/WII_IOB.cpp b/Source/Core/Core/Src/HW/WII_IOB.cpp index 59d610afec..bfcf1024e4 100644 --- a/Source/Core/Core/Src/HW/WII_IOB.cpp +++ b/Source/Core/Core/Src/HW/WII_IOB.cpp @@ -29,7 +29,7 @@ void Read32(u32& _rReturnValue, const u32 _Address) break; // WiiMenu... no idea case 0x24: - ERROR_LOG(WII_IOB, "IOP: Read32 from 0x18 = 0x%08x (WiiMenu)", _Address); + ERROR_LOG(WII_IOB, "IOP: Read32 from 0x24 = 0x%08x (WiiMenu)", _Address); break; diff --git a/Source/Core/Core/Src/HW/WII_IPC.cpp b/Source/Core/Core/Src/HW/WII_IPC.cpp index b09d83f44b..d4535d1578 100644 --- a/Source/Core/Core/Src/HW/WII_IPC.cpp +++ b/Source/Core/Core/Src/HW/WII_IPC.cpp @@ -212,7 +212,7 @@ void Write32(const u32 _Value, const u32 _Address) _dbg_assert_msg_(WII_IPC, 0, "w32 %08x @ %08x", _Value, _Address); break; } - + WII_IPC_HLE_Interface::Update(); CoreTiming::ScheduleEvent_Threadsafe(0, updateInterrupts, 0); } diff --git a/Source/Core/Core/Src/HW/Wiimote.cpp b/Source/Core/Core/Src/HW/Wiimote.cpp index 2061e80f2e..da807735bc 100644 --- a/Source/Core/Core/Src/HW/Wiimote.cpp +++ b/Source/Core/Core/Src/HW/Wiimote.cpp @@ -43,15 +43,15 @@ void Initialize(void* const hwnd, bool wait) // add 4 wiimotes for (unsigned int i = WIIMOTE_CHAN_0; icontrols.push_back(new ControlGroup::Input(classic_button_names[i])); + for (auto& classic_button_name : classic_button_names) + m_buttons->controls.push_back(new ControlGroup::Input(classic_button_name)); // sticks groups.push_back(m_left_stick = new AnalogStick(_trans("Left Stick"))); @@ -66,13 +66,13 @@ Classic::Classic(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Classic"), // triggers groups.push_back(m_triggers = new MixedTriggers("Triggers")); - for (unsigned int i=0; i < sizeof(classic_trigger_names)/sizeof(*classic_trigger_names); ++i) - m_triggers->controls.push_back(new ControlGroup::Input(classic_trigger_names[i])); + for (auto& classic_trigger_name : classic_trigger_names) + m_triggers->controls.push_back(new ControlGroup::Input(classic_trigger_name)); // dpad groups.push_back(m_dpad = new Buttons("D-Pad")); - for (unsigned int i=0; i < 4; ++i) - m_dpad->controls.push_back(new ControlGroup::Input(named_directions[i])); + for (auto& named_direction : named_directions) + m_dpad->controls.push_back(new ControlGroup::Input(named_direction)); // set up register // calibration diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp index 1ae774ba7d..1d79de87bf 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Drums.cpp @@ -36,8 +36,8 @@ Drums::Drums(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Drums"), _reg) { // pads groups.push_back(m_pads = new Buttons(_trans("Pads"))); - for (unsigned int i = 0; i < sizeof(drum_pad_names)/sizeof(*drum_pad_names); ++i) - m_pads->controls.push_back(new ControlGroup::Input(drum_pad_names[i])); + for (auto& drum_pad_name : drum_pad_names) + m_pads->controls.push_back(new ControlGroup::Input(drum_pad_name)); // stick groups.push_back(m_stick = new AnalogStick("Stick")); diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp index 23a2f93054..92b09b1e1a 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.cpp @@ -40,8 +40,8 @@ Guitar::Guitar(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Guitar"), _r { // frets groups.push_back(m_frets = new Buttons(_trans("Frets"))); - for (unsigned int i = 0; i < sizeof(guitar_fret_names)/sizeof(*guitar_fret_names); ++i) - m_frets->controls.push_back(new ControlGroup::Input(guitar_fret_names[i])); + for (auto& guitar_fret_name : guitar_fret_names) + m_frets->controls.push_back(new ControlGroup::Input(guitar_fret_name)); // strum groups.push_back(m_strum = new Buttons(_trans("Strum"))); diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.h b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.h index 245ebabb90..1e33830a14 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.h +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Guitar.h @@ -11,7 +11,7 @@ class Guitar : public Attachment { public: Guitar(WiimoteEmu::ExtensionReg& _reg); - void GetState( u8* const data, const bool focus ); + void GetState( u8* const data, const bool focus ) override; enum { diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.cpp index 63dd485ed7..7f330ecc78 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.cpp @@ -17,7 +17,7 @@ static const u8 nunchuck_id[] = { 0x00, 0x00, 0xa4, 0x20, 0x00, 0x00 }; static const u8 nunchuck_calibration[] = { 0x80, 0x80, 0x80, 0x00, // accelerometer x, y, z neutral - 0xb3, 0xb3, 0xb3, 0x00, // x, y, z g-force values + 0xb3, 0xb3, 0xb3, 0x00, // x, y, z g-force values // 0x80 = analog stick x and y axis center 0xff, 0x00, 0x80, @@ -121,10 +121,10 @@ void Nunchuk::GetState(u8* const data, const bool focus) // buttons m_buttons->GetState(&ncdata->bt, nunchuk_button_bitmasks); } - + // flip the button bits :/ ncdata->bt ^= 0x03; - + if (m_udpWrap->inst) { if (m_udpWrap->updNun) @@ -151,7 +151,7 @@ void Nunchuk::GetState(u8* const data, const bool focus) accel.x = x; accel.y = y; accel.z = z; - } + } } wm_accel* dt = (wm_accel*)&ncdata->ax; diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.h b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.h index 3b720f73a7..975e1fbfee 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.h +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Nunchuk.h @@ -17,7 +17,7 @@ class Nunchuk : public Attachment public: Nunchuk(UDPWrapper * wrp, WiimoteEmu::ExtensionReg& _reg); - virtual void GetState( u8* const data, const bool focus ); + virtual void GetState( u8* const data, const bool focus ) override; enum { @@ -25,7 +25,7 @@ public: BUTTON_Z = 0x01, }; - void LoadDefaults(const ControllerInterface& ciface); + void LoadDefaults(const ControllerInterface& ciface) override; private: Tilt* m_tilt; @@ -37,7 +37,7 @@ private: AnalogStick* m_stick; u8 m_shake_step[3]; - + UDPWrapper* const m_udpWrap; }; diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp index 901ad27c9f..83047114bc 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.cpp @@ -34,8 +34,8 @@ Turntable::Turntable(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Turnta { // buttons groups.push_back(m_buttons = new Buttons("Buttons")); - for (unsigned int i = 0; i < sizeof(turntable_button_names)/sizeof(*turntable_button_names); ++i) - m_buttons->controls.push_back(new ControlGroup::Input(turntable_button_names[i])); + for (auto& turntable_button_name : turntable_button_names) + m_buttons->controls.push_back(new ControlGroup::Input(turntable_button_name)); // turntables groups.push_back(m_left_table = new Slider(_trans("Table Left"))); diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.h b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.h index 0960c272a8..c416d69cfc 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.h +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Attachment/Turntable.h @@ -11,7 +11,7 @@ class Turntable : public Attachment { public: Turntable(WiimoteEmu::ExtensionReg& _reg); - void GetState(u8* const data, const bool focus); + void GetState(u8* const data, const bool focus) override; enum { @@ -31,7 +31,6 @@ public: private: Buttons* m_buttons; - MixedTriggers* m_triggers; AnalogStick* m_stick; Triggers *m_effect_dial; Slider *m_left_table, *m_right_table, *m_crossfade; diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp index 235d5cb7f1..2014f0b1f4 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp @@ -32,7 +32,7 @@ namespace WiimoteEmu { -void Spy(Wiimote* wm_, const void* data_, int size_) +void Spy(Wiimote* wm_, const void* data_, size_t size_) { #if 0 // enable log @@ -1275,7 +1275,7 @@ void Wiimote::DoState(PointerWrap& p) else { std::queue tmp_queue(m_read_requests); - size = m_read_requests.size(); + size = (u32)(m_read_requests.size()); p.Do(size); while (!tmp_queue.empty()) { diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/Encryption.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/Encryption.cpp index 70efdf2803..3c0c111a90 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/Encryption.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/Encryption.cpp @@ -196,10 +196,10 @@ void genkey(const u8* const rand, const u8 idx, u8* const key) { const u8* const ans = ans_tbl[idx]; u8 t0[10]; - + for(int i=0; i<10; ++i) t0[i] = tsbox[rand[i]]; - + key[0] = ((ror8((ans[0]^t0[5]),(t0[2]%8)) - t0[9]) ^ t0[4]); key[1] = ((ror8((ans[1]^t0[1]),(t0[0]%8)) - t0[5]) ^ t0[7]); key[2] = ((ror8((ans[2]^t0[6]),(t0[8]%8)) - t0[2]) ^ t0[0]); @@ -219,7 +219,7 @@ void gentabs(const u8* const rand, const u8* const key, const u8 idx, u8* const ft[5] = sboxes[idx][key[3]] ^ sboxes[(idx+1)%8][rand[9]]; ft[6] = sboxes[idx][rand[0]] ^ sboxes[(idx+1)%8][rand[6]]; ft[7] = sboxes[idx][rand[1]] ^ sboxes[(idx+1)%8][rand[8]]; - + sb[0] = sboxes[idx][key[0]] ^ sboxes[(idx+1)%8][rand[1]]; sb[1] = sboxes[idx][key[5]] ^ sboxes[(idx+1)%8][rand[4]]; sb[2] = sboxes[idx][key[3]] ^ sboxes[(idx+1)%8][rand[0]]; @@ -245,10 +245,10 @@ void wiimote_gen_key(wiimote_key* const key, const u8* const keydata) rand[9-i] = keydata[i]; for (int i=0; i<6; ++i) skey[5-i] = keydata[i+10]; - + //DEBUG_LOG(WIIMOTE, "rand: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", rand[0], rand[1], rand[2], rand[3], rand[4], rand[5], rand[6], rand[7], rand[8], rand[9]); //DEBUG_LOG(WIIMOTE, "key: %02x %02x %02x %02x %02x %02x", skey[0], skey[1], skey[2], skey[3], skey[4], skey[5]); - + for(idx = 0; idx < 7; ++idx) { genkey(rand, idx, testkey); @@ -257,12 +257,12 @@ void wiimote_gen_key(wiimote_key* const key, const u8* const keydata) } // default case is idx = 7 which is valid (homebrew uses it for the 0x17 case) //DEBUG_LOG(WIIMOTE, "idx: %d", idx); - + gentabs(rand, skey, idx, key->ft, key->sb); - + //DEBUG_LOG(WIIMOTE, "ft: %02x %02x %02x %02x %02x %02x %02x %02x", key->ft[0], key->ft[1], key->ft[2], key->ft[3], key->ft[4], key->ft[5], key->ft[6], key->ft[7]); //DEBUG_LOG(WIIMOTE, "sb: %02x %02x %02x %02x %02x %02x %02x %02x", key->sb[0], key->sb[1], key->sb[2], key->sb[3], key->sb[4], key->sb[5], key->sb[6], key->sb[7]); - + // for homebrew, ft and sb are all 0x97 which is equivalent to 0x17 } @@ -270,7 +270,7 @@ void wiimote_gen_key(wiimote_key* const key, const u8* const keydata) /* Encrypt data */ void wiimote_encrypt(const wiimote_key* const key, u8* const data, int addr, const u8 len) { - for (int i = 0; i < len; ++i, ++addr) + for (int i = 0; i < len; ++i, ++addr) data[i] = (data[i] - key->ft[addr % 8]) ^ key->sb[addr % 8]; } diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/MatrixMath.h b/Source/Core/Core/Src/HW/WiimoteEmu/MatrixMath.h index b8abafbb3a..867b944b48 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/MatrixMath.h +++ b/Source/Core/Core/Src/HW/WiimoteEmu/MatrixMath.h @@ -27,9 +27,9 @@ inline void MatrixIdentity(Matrix & m) inline void MatrixFrustum(Matrix &m, double l, double r, double b, double t, double n, double f) { - m[0][0]=2*n/(r-l); m[0][1]=0; m[0][2]=0; m[0][3]=0; - m[1][0]=0; m[1][1]=2*n/(t-b); m[1][2]=0; m[1][3]=0; - m[2][0]=(r+l)/(r-l); m[2][1]=(t+b)/(t-b); m[2][2]=(f+n)/(f-n); m[2][3]=-1; + m[0][0]=2*n/(r-l); m[0][1]=0; m[0][2]=0; m[0][3]=0; + m[1][0]=0; m[1][1]=2*n/(t-b); m[1][2]=0; m[1][3]=0; + m[2][0]=(r+l)/(r-l); m[2][1]=(t+b)/(t-b); m[2][2]=(f+n)/(f-n); m[2][3]=-1; m[3][0]=0; m[3][1]=0; m[3][2]=2*f*n/(f-n); m[3][3]=0; } diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp index eb5ebc2be5..4c80b1adda 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.cpp @@ -27,6 +27,7 @@ inline double round(double x) { return (x-floor(x))>0.5 ? ceil(x) : floor(x); } #include "MatrixMath.h" #include "../../Movie.h" +#include "NetPlayClient.h" namespace { @@ -59,7 +60,7 @@ static const u8 eeprom_data_16D0[] = { 0x77, 0x88, 0x00, 0x00, 0x2B, 0x01, 0xE8, 0x13 }; -const ReportFeatures reporting_mode_features[] = +const ReportFeatures reporting_mode_features[] = { //0x30: Core Buttons { 2, 0, 0, 0, 4 }, @@ -96,7 +97,7 @@ void EmulateShake(AccelData* const accel // peak G-force double shake_intensity; - + // shake is a bitfield of X,Y,Z shake button states static const unsigned int btns[] = { 0x01, 0x02, 0x04 }; unsigned int shake = 0; @@ -263,8 +264,8 @@ Wiimote::Wiimote( const unsigned int index ) // buttons groups.push_back(m_buttons = new Buttons("Buttons")); - for (unsigned int i=0; i < sizeof(named_buttons)/sizeof(*named_buttons); ++i) - m_buttons->controls.push_back(new ControlGroup::Input( named_buttons[i])); + for (auto& named_button : named_buttons) + m_buttons->controls.push_back(new ControlGroup::Input( named_button)); // udp groups.push_back(m_udp = new UDPWrapper(m_index, _trans("UDP Wiimote"))); @@ -301,8 +302,8 @@ Wiimote::Wiimote( const unsigned int index ) // dpad groups.push_back(m_dpad = new Buttons("D-Pad")); - for (unsigned int i=0; i < 4; ++i) - m_dpad->controls.push_back(new ControlGroup::Input(named_directions[i])); + for (auto& named_direction : named_directions) + m_dpad->controls.push_back(new ControlGroup::Input(named_direction)); // options groups.push_back( m_options = new ControlGroup(_trans("Options"))); @@ -339,7 +340,7 @@ bool Wiimote::Step() m_rumble->controls[0]->control_ref->State(m_rumble_on); // when a movie is active, this button status update is disabled (moved), because movies only record data reports. - if(!(Movie::IsPlayingInput() || Movie::IsRecordingInput())) + if(!(Movie::IsPlayingInput() || Movie::IsRecordingInput()) || NetPlay::IsNetPlayRunning()) { UpdateButtonsStatus(has_focus); } @@ -397,7 +398,7 @@ void Wiimote::UpdateButtonsStatus(bool has_focus) void Wiimote::GetCoreData(u8* const data) { // when a movie is active, the button update happens here instead of Wiimote::Step, to avoid potential desync issues. - if(Movie::IsPlayingInput() || Movie::IsRecordingInput()) + if(Movie::IsPlayingInput() || Movie::IsRecordingInput() || NetPlay::IsNetPlayRunning()) { UpdateButtonsStatus(HAS_FOCUS); } @@ -456,7 +457,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel) { float xx = 10000, yy = 0, zz = 0; double nsin,ncos; - + if (use_accel) { double ax,az,len; @@ -465,7 +466,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel) len=sqrt(ax*ax+az*az); if (len) { - ax/=len; + ax/=len; az/=len; //normalizing the vector nsin=ax; ncos=az; @@ -492,22 +493,22 @@ void Wiimote::GetIRData(u8* const data, bool use_accel) UDPTLayer::GetIR(m_udp, &xx, &yy, &zz); Vertex v[4]; - + static const int camWidth=1024; static const int camHeight=768; - static const double bndup=-0.315447; - static const double bnddown=0.85; - static const double bndleft=0.443364; - static const double bndright=-0.443364; + static const double bndup=-0.315447; + static const double bnddown=0.85; + static const double bndleft=0.443364; + static const double bndright=-0.443364; static const double dist1=100.f/camWidth; //this seems the optimal distance for zelda static const double dist2=1.2f*dist1; - for (int i=0; i<4; i++) + for (auto& vtx : v) { - v[i].x=xx*(bndright-bndleft)/2+(bndleft+bndright)/2; - if (m_sensor_bar_on_top) v[i].y=yy*(bndup-bnddown)/2+(bndup+bnddown)/2; - else v[i].y=yy*(bndup-bnddown)/2-(bndup+bnddown)/2; - v[i].z=0; + vtx.x=xx*(bndright-bndleft)/2+(bndleft+bndright)/2; + if (m_sensor_bar_on_top) vtx.y=yy*(bndup-bnddown)/2+(bndup+bnddown)/2; + else vtx.y=yy*(bndup-bnddown)/2-(bndup+bnddown)/2; + vtx.z=0; } v[0].x-=(zz*0.5+1)*dist1; @@ -552,7 +553,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel) wm_ir_basic* const irdata = (wm_ir_basic*)data; for (unsigned int i=0; i<2; ++i) { - if (x[i*2] < 1024 && y[i*2] < 768) + if (x[i*2] < 1024 && y[i*2] < 768) { irdata[i].x1 = u8(x[i*2]); irdata[i].x1hi = x[i*2] >> 8; @@ -615,7 +616,7 @@ void Wiimote::GetExtData(u8* const data) // Bit 0 of byte 4 is moved to bit 7 of byte 5 // Bit 3 of byte 5 is moved to bit 4 of byte 5, overwriting it // Bit 1 of byte 5 is moved to bit 3 of byte 5 - // Bit 0 of byte 5 is moved to bit 2 of byte 5, overwriting it + // Bit 0 of byte 5 is moved to bit 2 of byte 5, overwriting it case 0x5: //data[5] & (1 << 7) //data[4] & (1 << 0) @@ -658,7 +659,7 @@ void Wiimote::Update() u8 data[MAX_PAYLOAD]; memset(data, 0, sizeof(data)); - + // figure out what data we need s8 rptf_size = MAX_PAYLOAD; @@ -675,28 +676,28 @@ void Wiimote::Update() { data[0] = 0xA1; data[1] = m_reporting_mode; - + // core buttons if (rptf.core) GetCoreData(data + rptf.core); - + // acceleration if (rptf.accel) GetAccelData(data + rptf.accel, rptf.core?(data+rptf.core):NULL); - + // IR if (rptf.ir) - GetIRData(data + rptf.ir, (rptf.accel != 0)); - + GetIRData(data + rptf.ir, (rptf.accel != 0)); + // extension if (rptf.ext) GetExtData(data + rptf.ext); - + // hybrid wiimote stuff (for now, it's not supported while recording) if (WIIMOTE_SRC_HYBRID == g_wiimote_sources[m_index] && !Movie::IsRecordingInput()) { using namespace WiimoteReal; - + std::lock_guard lk(g_refresh_lock); if (g_wiimotes[m_index]) { @@ -711,11 +712,11 @@ void Wiimote::Update() if (real_data[1] >= WM_REPORT_CORE) { const ReportFeatures& real_rptf = reporting_mode_features[real_data[1] - WM_REPORT_CORE]; - + // force same report type from real-wiimote if (&real_rptf != &rptf) rptf_size = 0; - + // core // mix real-buttons with emu-buttons in the status struct, and in the report if (real_rptf.core && rptf.core) @@ -723,15 +724,15 @@ void Wiimote::Update() m_status.buttons |= *(wm_core*)(real_data + real_rptf.core); *(wm_core*)(data + rptf.core) = m_status.buttons; } - + // accel // use real-accel data always i guess if (real_rptf.accel && rptf.accel) memcpy(data + rptf.accel, real_data + real_rptf.accel, sizeof(wm_accel)); - + // ir // TODO - + // ext // use real-ext data if an emu-extention isn't chosen if (real_rptf.ext && rptf.ext && (0 == m_extension->switch_extension)) @@ -743,7 +744,7 @@ void Wiimote::Update() // use real-acks if an emu-extension isn't chosen rptf_size = -1; break; - + // use all status reports, after modification of the extension bit case WM_STATUS_REPORT : //if (m_extension->switch_extension) @@ -752,24 +753,30 @@ void Wiimote::Update() ((wm_status_report*)(real_data + 2))->extension = 1; rptf_size = -1; break; - + // use all read-data replies case WM_READ_DATA_REPLY: rptf_size = -1; break; - + } - + // copy over report from real-wiimote if (-1 == rptf_size) { std::copy(rpt.begin(), rpt.end(), data); - rptf_size = rpt.size(); + rptf_size = (s8)(rpt.size()); } } } } } + if (NetPlay::IsNetPlayRunning()) + { + NetPlay_GetWiimoteData(m_index, data, rptf.size); + if (rptf.core) + m_status.buttons = *(wm_core*)(data + rptf.core); + } if (!Movie::IsPlayingInput()) { Movie::CheckWiimoteStatus(m_index, data, rptf, m_reg_ir.mode); @@ -787,7 +794,7 @@ void Wiimote::Update() } } -void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size) +void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size) { // Check for custom communication if (99 == _channelID) @@ -816,7 +823,7 @@ void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size case HID_TYPE_SET_REPORT : if (HID_PARAM_INPUT == hidp->param) { - PanicAlert("HID_TYPE_SET_REPORT - INPUT"); + PanicAlert("HID_TYPE_SET_REPORT - INPUT"); } else { diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.h b/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.h index 2fd471978e..f2afda4aa3 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.h +++ b/Source/Core/Core/Src/HW/WiimoteEmu/WiimoteEmu.h @@ -96,7 +96,7 @@ inline double trim(double a) class Wiimote : public ControllerEmu { friend class WiimoteReal::Wiimote; -friend void Spy(Wiimote* wm_, const void* data_, int size_); +friend void Spy(Wiimote* wm_, const void* data_, size_t size_); public: enum @@ -158,6 +158,7 @@ private: void WriteData(const wm_write_data* const wd); void SendReadDataReply(ReadRequest& _request); void SpeakerData(wm_speaker_data* sd); + bool NetPlay_GetWiimoteData(int wiimote, u8* data, u8 size); // control groups Buttons *m_buttons, *m_dpad, *m_shake; @@ -244,7 +245,7 @@ private: } m_reg_speaker; }; -void Spy(Wiimote* wm_, const void* data_, int size_); +void Spy(Wiimote* wm_, const void* data_, size_t size_); } diff --git a/Source/Core/Core/Src/HW/WiimoteReal/IODummy.cpp b/Source/Core/Core/Src/HW/WiimoteReal/IODummy.cpp index 59025f9040..57034ff09a 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/IODummy.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/IODummy.cpp @@ -43,12 +43,18 @@ bool WiimoteScanner::IsReady() const return false; } -bool Wiimote::Connect() +void Wiimote::InitInternal() +{} + +void Wiimote::TeardownInternal() +{} + +bool Wiimote::ConnectInternal() { return 0; } -void Wiimote::Disconnect() +void Wiimote::DisconnectInternal() { return; } @@ -58,12 +64,15 @@ bool Wiimote::IsConnected() const return false; } +void Wiimote::IOWakeup() +{} + int Wiimote::IORead(u8* buf) { return 0; } -int Wiimote::IOWrite(const u8* buf, int len) +int Wiimote::IOWrite(const u8* buf, size_t len) { return 0; } diff --git a/Source/Core/Core/Src/HW/WiimoteReal/IONix.cpp b/Source/Core/Core/Src/HW/WiimoteReal/IONix.cpp index edd79f2bf6..0f4fe5e730 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/IONix.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/IONix.cpp @@ -27,8 +27,7 @@ namespace WiimoteReal { WiimoteScanner::WiimoteScanner() - : m_run_thread() - , m_want_wiimotes() + : m_want_wiimotes() , device_id(-1) , device_sock(-1) { @@ -72,7 +71,7 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot inquiry_info scan_infos[max_infos] = {}; auto* scan_infos_ptr = scan_infos; found_board = NULL; - + // Scan for bluetooth devices int const found_devices = hci_inquiry(device_id, wait_len, max_infos, NULL, &scan_infos_ptr, IREQ_CACHE_FLUSH); if (found_devices < 0) @@ -87,7 +86,7 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot for (int i = 0; i < found_devices; ++i) { ERROR_LOG(WIIMOTE, "found a device..."); - + // BT names are a maximum of 248 bytes apparently char name[255] = {}; if (hci_read_remote_name(device_sock, &scan_infos[i].bdaddr, sizeof(name), name, 1000) < 0) @@ -134,8 +133,30 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot } +void Wiimote::InitInternal() +{ + cmd_sock = -1; + int_sock = -1; + + int fds[2]; + if (pipe(fds)) + { + ERROR_LOG(WIIMOTE, "pipe failed"); + abort(); + } + wakeup_pipe_w = fds[1]; + wakeup_pipe_r = fds[0]; + bdaddr = (bdaddr_t){{0, 0, 0, 0, 0, 0}}; +} + +void Wiimote::TeardownInternal() +{ + close(wakeup_pipe_w); + close(wakeup_pipe_r); +} + // Connect to a wiimote with a known address. -bool Wiimote::Connect() +bool Wiimote::ConnectInternal() { sockaddr_l2 addr; addr.l2_family = AF_BLUETOOTH; @@ -168,7 +189,7 @@ bool Wiimote::Connect() return true; } -void Wiimote::Disconnect() +void Wiimote::DisconnectInternal() { close(cmd_sock); close(int_sock); @@ -182,26 +203,43 @@ bool Wiimote::IsConnected() const return cmd_sock != -1;// && int_sock != -1; } +void Wiimote::IOWakeup() +{ + char c = 0; + if (write(wakeup_pipe_w, &c, 1) != 1) + { + ERROR_LOG(WIIMOTE, "Unable to write to wakeup pipe."); + } +} + // positive = read packet // negative = didn't read packet // zero = error int Wiimote::IORead(u8* buf) { // Block select for 1/2000th of a second - timeval tv; - tv.tv_sec = 0; - tv.tv_usec = WIIMOTE_DEFAULT_TIMEOUT * 1000; fd_set fds; FD_ZERO(&fds); FD_SET(int_sock, &fds); + FD_SET(wakeup_pipe_r, &fds); - if (select(int_sock + 1, &fds, NULL, NULL, &tv) == -1) + if (select(int_sock + 1, &fds, NULL, NULL, NULL) == -1) { ERROR_LOG(WIIMOTE, "Unable to select wiimote %i input socket.", index + 1); return -1; } + if (FD_ISSET(wakeup_pipe_r, &fds)) + { + char c; + if (read(wakeup_pipe_r, &c, 1) != 1) + { + ERROR_LOG(WIIMOTE, "Unable to read from wakeup pipe."); + } + return -1; + } + if (!FD_ISSET(int_sock, &fds)) return -1; @@ -225,9 +263,9 @@ int Wiimote::IORead(u8* buf) return r; } -int Wiimote::IOWrite(u8 const* buf, int len) +int Wiimote::IOWrite(u8 const* buf, size_t len) { - return write(int_sock, buf, len); + return write(int_sock, buf, (int)len); } }; // WiimoteReal diff --git a/Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp b/Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp index 5d4d26108f..13728a9d72 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/IOWin.cpp @@ -138,10 +138,11 @@ inline void init_lib() namespace WiimoteReal { - - -int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stack_t &stack, const u8* buf, int len); + + +int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stack_t &stack, const u8* buf, size_t len); int _IORead(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read, u8* buf, int index); +void _IOWakeup(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read); template void ProcessWiimotes(bool new_scan, T& callback); @@ -216,7 +217,7 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot // Query the data for this device if (SetupDiGetDeviceInterfaceDetail(device_info, &device_data, detail_data, len, NULL, NULL)) - { + { auto const wm = new Wiimote; wm->devicepath = detail_data->DevicePath; bool real_wiimote = false, is_bb = false; @@ -246,14 +247,14 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot // SLEEP(2000); } -int CheckDeviceType_Write(HANDLE &dev_handle, const u8* buf, int size, int attempts) +int CheckDeviceType_Write(HANDLE &dev_handle, const u8* buf, size_t size, int attempts) { OVERLAPPED hid_overlap_write = OVERLAPPED(); hid_overlap_write.hEvent = CreateEvent(NULL, true, false, NULL); enum win_bt_stack_t stack = MSBT_STACK_UNKNOWN; DWORD written = 0; - + for (; attempts>0; --attempts) { if (_IOWrite(dev_handle, hid_overlap_write, stack, buf, size)) @@ -277,7 +278,7 @@ int CheckDeviceType_Write(HANDLE &dev_handle, const u8* buf, int size, int attem } } } - + CloseHandle(hid_overlap_write.hEvent); return written; @@ -294,7 +295,7 @@ int CheckDeviceType_Read(HANDLE &dev_handle, u8* buf, int attempts) if (read > 0) break; } - + CloseHandle(hid_overlap_read.hEvent); return read; @@ -307,17 +308,17 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool { real_wiimote = false; is_bb = false; - + #ifdef SHARE_WRITE_WIIMOTES std::lock_guard lk(g_connected_wiimotes_lock); if (g_connected_wiimotes.count(devicepath) != 0) return; #endif - + HANDLE dev_handle = CreateFile(devicepath.c_str(), - GENERIC_READ | GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, + NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (dev_handle == INVALID_HANDLE_VALUE) return; @@ -325,7 +326,7 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool bool check_vidpid = false; HIDD_ATTRIBUTES attrib; attrib.Size = sizeof(attrib); - if (!check_vidpid || + if (!check_vidpid || (HidD_GetAttributes(dev_handle, &attrib) && (attrib.VendorID == 0x057e) && (attrib.ProductID == 0x0306))) @@ -342,18 +343,18 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool u8 const disable_enc_pt1_report[MAX_PAYLOAD] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_WRITE_DATA, 0x04, 0xa4, 0x00, 0xf0, 0x01, 0x55}; u8 const disable_enc_pt2_report[MAX_PAYLOAD] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_WRITE_DATA, 0x04, 0xa4, 0x00, 0xfb, 0x01, 0x00}; - rc = CheckDeviceType_Write(dev_handle, - disable_enc_pt1_report, - sizeof(disable_enc_pt1_report), + rc = CheckDeviceType_Write(dev_handle, + disable_enc_pt1_report, + sizeof(disable_enc_pt1_report), 1); - rc = CheckDeviceType_Write(dev_handle, - disable_enc_pt2_report, - sizeof(disable_enc_pt2_report), + rc = CheckDeviceType_Write(dev_handle, + disable_enc_pt2_report, + sizeof(disable_enc_pt2_report), 1); - - rc = CheckDeviceType_Write(dev_handle, - req_status_report, - sizeof(req_status_report), + + rc = CheckDeviceType_Write(dev_handle, + req_status_report, + sizeof(req_status_report), 1); while (rc > 0 && --max_cycles > 0) @@ -363,13 +364,13 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool // DEBUG_LOG(WIIMOTE, "CheckDeviceType: Read failed..."); break; } - + switch (buf[1]) { case WM_STATUS_REPORT: { real_wiimote = true; - + // DEBUG_LOG(WIIMOTE, "CheckDeviceType: Got Status Report"); wm_status_report * wsr = (wm_status_report*)&buf[2]; if (wsr->extension) @@ -401,7 +402,7 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool case WM_READ_DATA_REPLY: { // DEBUG_LOG(WIIMOTE, "CheckDeviceType: Got Data Reply"); - wm_read_data_reply * wrdr + wm_read_data_reply * wrdr = (wm_read_data_reply*)&buf[2]; // Check if it has returned what we asked. if (Common::swap16(wrdr->address) == 0x00fa) @@ -409,15 +410,15 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool real_wiimote = true; // 0x020420A40000ULL means balance board. u64 ext_type = (*(u64*)&wrdr->data[0]); - // DEBUG_LOG(WIIMOTE, - // "CheckDeviceType: GOT EXT TYPE %llX", + // DEBUG_LOG(WIIMOTE, + // "CheckDeviceType: GOT EXT TYPE %llX", // ext_type); is_bb = (ext_type == 0x020420A40000ULL); } else { - ERROR_LOG(WIIMOTE, - "CheckDeviceType: GOT UNREQUESTED ADDRESS %X", + ERROR_LOG(WIIMOTE, + "CheckDeviceType: GOT UNREQUESTED ADDRESS %X", Common::swap16(wrdr->address)); } // force end @@ -440,7 +441,7 @@ void WiimoteScanner::CheckDeviceType(std::basic_string &devicepath, bool bool WiimoteScanner::IsReady() const { // TODO: don't search for a radio each time - + BLUETOOTH_FIND_RADIO_PARAMS radioParam; radioParam.dwSize = sizeof(radioParam); @@ -459,7 +460,7 @@ bool WiimoteScanner::IsReady() const } // Connect to a wiimote with a known device path. -bool Wiimote::Connect() +bool Wiimote::ConnectInternal() { if (IsConnected()) return false; @@ -513,12 +514,6 @@ bool Wiimote::Connect() } #endif - hid_overlap_read = OVERLAPPED(); - hid_overlap_read.hEvent = CreateEvent(NULL, true, false, NULL); - - hid_overlap_write = OVERLAPPED(); - hid_overlap_write.hEvent = CreateEvent(NULL, true, false, NULL); - // TODO: thread isn't started here now, do this elsewhere // This isn't as drastic as it sounds, since the process in which the threads // reside is normal priority. Needed for keeping audio reports at a decent rate @@ -535,7 +530,7 @@ bool Wiimote::Connect() return true; } -void Wiimote::Disconnect() +void Wiimote::DisconnectInternal() { if (!IsConnected()) return; @@ -543,20 +538,40 @@ void Wiimote::Disconnect() CloseHandle(dev_handle); dev_handle = 0; - CloseHandle(hid_overlap_read.hEvent); - CloseHandle(hid_overlap_write.hEvent); - #ifdef SHARE_WRITE_WIIMOTES std::lock_guard lk(g_connected_wiimotes_lock); g_connected_wiimotes.erase(devicepath); #endif } +void Wiimote::InitInternal() +{ + dev_handle = 0; + stack = MSBT_STACK_UNKNOWN; + + hid_overlap_read = OVERLAPPED(); + hid_overlap_read.hEvent = CreateEvent(NULL, true, false, NULL); + + hid_overlap_write = OVERLAPPED(); + hid_overlap_write.hEvent = CreateEvent(NULL, true, false, NULL); +} + +void Wiimote::TeardownInternal() +{ + CloseHandle(hid_overlap_read.hEvent); + CloseHandle(hid_overlap_write.hEvent); +} + bool Wiimote::IsConnected() const { return dev_handle != 0; } +void _IOWakeup(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read) +{ + SetEvent(hid_overlap_read.hEvent); +} + // positive = read packet // negative = didn't read packet // zero = error @@ -566,7 +581,7 @@ int _IORead(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read, u8* buf, int index buf[0] = 0xa1; // Used below for a warning buf[1] = 0; - + DWORD bytes = 0; ResetEvent(hid_overlap_read.hEvent); if (!ReadFile(dev_handle, buf + 1, MAX_PAYLOAD - 1, &bytes, &hid_overlap_read)) @@ -575,27 +590,23 @@ int _IORead(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read, u8* buf, int index if (ERROR_IO_PENDING == read_err) { - auto const wait_result = WaitForSingleObject(hid_overlap_read.hEvent, WIIMOTE_DEFAULT_TIMEOUT); - if (WAIT_TIMEOUT == wait_result) - { - CancelIo(dev_handle); - } - else if (WAIT_FAILED == wait_result) + auto const wait_result = WaitForSingleObject(hid_overlap_read.hEvent, INFINITE); + + // In case the event was signalled by _IOWakeup before the read completed, cancel it. + CancelIo(dev_handle); + + if (WAIT_FAILED == wait_result) { WARN_LOG(WIIMOTE, "A wait error occurred on reading from Wiimote %i.", index + 1); - CancelIo(dev_handle); } - if (!GetOverlappedResult(dev_handle, &hid_overlap_read, &bytes, TRUE)) + if (!GetOverlappedResult(dev_handle, &hid_overlap_read, &bytes, FALSE)) { auto const overlapped_err = GetLastError(); if (ERROR_OPERATION_ABORTED == overlapped_err) { - if (buf[1] != 0) - WARN_LOG(WIIMOTE, "Packet ignored. This may indicate a problem (timeout is %i ms).", - WIIMOTE_DEFAULT_TIMEOUT); - + // It was. return -1; } @@ -615,6 +626,12 @@ int _IORead(HANDLE &dev_handle, OVERLAPPED &hid_overlap_read, u8* buf, int index return bytes + 1; } +void Wiimote::IOWakeup() +{ + _IOWakeup(dev_handle, hid_overlap_read); +} + + // positive = read packet // negative = didn't read packet // zero = error @@ -624,7 +641,7 @@ int Wiimote::IORead(u8* buf) } -int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stack_t &stack, const u8* buf, int len) +int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stack_t &stack, const u8* buf, size_t len) { WiimoteEmu::Spy(NULL, buf, len); @@ -636,19 +653,19 @@ int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stac stack = MSBT_STACK_BLUESOLEIL; if (_IOWrite(dev_handle, hid_overlap_write, stack, buf, len)) return 1; - + stack = MSBT_STACK_MS; if (_IOWrite(dev_handle, hid_overlap_write, stack, buf, len)) return 1; - + stack = MSBT_STACK_UNKNOWN; break; } case MSBT_STACK_MS: { - auto result = HidD_SetOutputReport(dev_handle, const_cast(buf) + 1, len - 1); + auto result = HidD_SetOutputReport(dev_handle, const_cast(buf) + 1, (ULONG)(len - 1)); //FlushFileBuffers(dev_handle); - + if (!result) { auto err = GetLastError(); @@ -662,7 +679,7 @@ int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stac WARN_LOG(WIIMOTE, "IOWrite[MSBT_STACK_MS]: ERROR: %08x", err); } } - + return result; break; } @@ -675,7 +692,7 @@ int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stac std::fill(big_buf + len, big_buf + MAX_PAYLOAD, 0); buf = big_buf; } - + ResetEvent(hid_overlap_write.hEvent); DWORD bytes = 0; if (WriteFile(dev_handle, buf + 1, MAX_PAYLOAD - 1, &bytes, &hid_overlap_write)) @@ -694,11 +711,11 @@ int _IOWrite(HANDLE &dev_handle, OVERLAPPED &hid_overlap_write, enum win_bt_stac break; } } - + return 0; } -int Wiimote::IOWrite(const u8* buf, int len) +int Wiimote::IOWrite(const u8* buf, size_t len) { return _IOWrite(dev_handle, hid_overlap_write, stack, buf, len); } @@ -721,9 +738,9 @@ void ProcessWiimotes(bool new_scan, T& callback) BLUETOOTH_FIND_RADIO_PARAMS radioParam; radioParam.dwSize = sizeof(radioParam); - + HANDLE hRadio; - + // TODO: save radio(s) in the WiimoteScanner constructor? // Enumerate BT radios diff --git a/Source/Core/Core/Src/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/Src/HW/WiimoteReal/IOdarwin.mm index 6f85f62a82..c094c97c13 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/Src/HW/WiimoteReal/IOdarwin.mm @@ -1,5 +1,4 @@ #define BLUETOOTH_VERSION_USE_CURRENT -#import #include "Common.h" #include "WiimoteReal.h" @@ -7,6 +6,7 @@ @interface SearchBT: NSObject { @public unsigned int maxDevices; + bool done; } @end @@ -15,6 +15,7 @@ error: (IOReturn) error aborted: (BOOL) aborted { + done = true; CFRunLoopStop(CFRunLoopGetCurrent()); } @@ -22,8 +23,8 @@ device: (IOBluetoothDevice *) device { NOTICE_LOG(WIIMOTE, "Discovered bluetooth device at %s: %s", - [[device getAddressString] UTF8String], - [[device getName] UTF8String]); + [[device addressString] UTF8String], + [[device name] UTF8String]); if ([[sender foundDevices] count] == maxDevices) [sender stop]; @@ -38,7 +39,7 @@ data: (unsigned char *) data length: (NSUInteger) length { - IOBluetoothDevice *device = [l2capChannel getDevice]; + IOBluetoothDevice *device = [l2capChannel device]; WiimoteReal::Wiimote *wm = NULL; std::lock_guard lk(WiimoteReal::g_refresh_lock); @@ -62,7 +63,7 @@ return; } - if (wm->inputlen != 0) { + if (wm->inputlen != -1) { WARN_LOG(WIIMOTE, "Dropping packet for wiimote %i, queue full", wm->index + 1); return; @@ -71,14 +72,13 @@ memcpy(wm->input, data, length); wm->inputlen = length; - (void)wm->Read(); - (void)UpdateSystemActivity(UsrActivity); + CFRunLoopStop(CFRunLoopGetCurrent()); } - (void) l2capChannelClosed: (IOBluetoothL2CAPChannel *) l2capChannel { - IOBluetoothDevice *device = [l2capChannel getDevice]; + IOBluetoothDevice *device = [l2capChannel device]; WiimoteReal::Wiimote *wm = NULL; std::lock_guard lk(WiimoteReal::g_refresh_lock); @@ -98,7 +98,7 @@ WARN_LOG(WIIMOTE, "Lost channel to wiimote %i", wm->index + 1); - wm->Disconnect(); + wm->DisconnectInternal(); } @end @@ -139,14 +139,18 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot [bti setDelegate: sbt]; [bti setInquiryLength: 2]; - if ([bti start] == kIOReturnSuccess) - [bti retain]; - else + if ([bti start] != kIOReturnSuccess) + { ERROR_LOG(WIIMOTE, "Unable to do bluetooth discovery"); + return; + } - CFRunLoopRun(); + do + { + CFRunLoopRun(); + } + while(!sbt->done); - [bti stop]; int found_devices = [[bti foundDevices] count]; if (found_devices) @@ -160,7 +164,7 @@ void WiimoteScanner::FindWiimotes(std::vector & found_wiimotes, Wiimot continue; Wiimote *wm = new Wiimote(); - wm->btd = dev; + wm->btd = [dev retain]; if(IsBalanceBoardName([[dev name] UTF8String])) { @@ -183,57 +187,97 @@ bool WiimoteScanner::IsReady() const return true; } +void Wiimote::InitInternal() +{ + inputlen = 0; + m_connected = false; + m_wiimote_thread_run_loop = NULL; + btd = nil; +} + +void Wiimote::TeardownInternal() +{ + if (m_wiimote_thread_run_loop) + { + CFRelease(m_wiimote_thread_run_loop); + m_wiimote_thread_run_loop = NULL; + } + [btd release]; + btd = nil; +} + // Connect to a wiimote with a known address. -bool Wiimote::Connect() +bool Wiimote::ConnectInternal() { if (IsConnected()) return false; ConnectBT *cbt = [[ConnectBT alloc] init]; - [btd openL2CAPChannelSync: &cchan - withPSM: kBluetoothL2CAPPSMHIDControl delegate: cbt]; - [btd openL2CAPChannelSync: &ichan - withPSM: kBluetoothL2CAPPSMHIDInterrupt delegate: cbt]; - if (ichan == NULL || cchan == NULL) + cchan = ichan = nil; + + IOReturn ret = [btd openConnection]; + if (ret) { - ERROR_LOG(WIIMOTE, "Unable to open L2CAP channels " - "for wiimote %i", index + 1); - Disconnect(); - - [cbt release]; + ERROR_LOG(WIIMOTE, "Unable to open Bluetooth connection to wiimote %i: %x", + index + 1, ret); return false; } - - // As of 10.8 these need explicit retaining or writing to the wiimote has a very high - // chance of crashing and burning. - [ichan retain]; - [cchan retain]; + + ret = [btd openL2CAPChannelSync: &cchan + withPSM: kBluetoothL2CAPPSMHIDControl delegate: cbt]; + if (ret) + { + ERROR_LOG(WIIMOTE, "Unable to open control channel for wiimote %i: %x", + index + 1, ret); + goto bad; + } + // Apple docs claim: + // "The L2CAP channel object is already retained when this function returns + // success; the channel must be released when the caller is done with it." + // But without this, the channels get over-autoreleased, even though the + // refcounting behavior here is clearly correct. + [cchan retain]; + + ret = [btd openL2CAPChannelSync: &ichan + withPSM: kBluetoothL2CAPPSMHIDInterrupt delegate: cbt]; + if (ret) + { + WARN_LOG(WIIMOTE, "Unable to open interrupt channel for wiimote %i: %x", + index + 1, ret); + goto bad; + } + [ichan retain]; NOTICE_LOG(WIIMOTE, "Connected to wiimote %i at %s", - index + 1, [[btd getAddressString] UTF8String]); + index + 1, [[btd addressString] UTF8String]); m_connected = true; [cbt release]; + + m_wiimote_thread_run_loop = (CFRunLoopRef) CFRetain(CFRunLoopGetCurrent()); + return true; + +bad: + DisconnectInternal(); + [cbt release]; + return false; } // Disconnect a wiimote. -void Wiimote::Disconnect() +void Wiimote::DisconnectInternal() { - if (btd != NULL) - [btd closeConnection]; + [ichan closeChannel]; + [ichan release]; + ichan = nil; - if (ichan != NULL) - [ichan release]; + [cchan closeChannel]; + [cchan release]; + cchan = nil; - if (cchan != NULL) - [cchan release]; - - btd = NULL; - cchan = NULL; - ichan = NULL; + [btd closeConnection]; if (!IsConnected()) return; @@ -248,28 +292,32 @@ bool Wiimote::IsConnected() const return m_connected; } -int Wiimote::IORead(unsigned char *buf) +void Wiimote::IOWakeup() { - int bytes; - - if (!IsConnected()) - return 0; - - bytes = inputlen; - memcpy(buf, input, bytes); - inputlen = 0; - - return bytes; + if (m_wiimote_thread_run_loop) + { + CFRunLoopStop(m_wiimote_thread_run_loop); + } } -int Wiimote::IOWrite(const unsigned char *buf, int len) +int Wiimote::IORead(unsigned char *buf) +{ + input = buf; + inputlen = -1; + + CFRunLoopRun(); + + return inputlen; +} + +int Wiimote::IOWrite(const unsigned char *buf, size_t len) { IOReturn ret; if (!IsConnected()) return 0; - ret = [ichan writeAsync: const_cast((void *)buf) length: len refcon: nil]; + ret = [ichan writeAsync: const_cast((void *)buf) length: (int)len refcon: nil]; if (ret == kIOReturnSuccess) return len; diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp index d2e7e2f57a..dea6f7fce6 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.cpp @@ -13,7 +13,7 @@ #include "Host.h" #include "ConfigManager.h" #include "SFML/Network.hpp" - + #include "WiimoteReal.h" @@ -39,32 +39,20 @@ WiimoteScanner g_wiimote_scanner; Wiimote::Wiimote() : index() -#ifdef __APPLE__ - , btd(), ichan(), cchan(), inputlen(), m_connected() -#elif defined(__linux__) && HAVE_BLUEZ - , cmd_sock(-1), int_sock(-1) -#elif defined(_WIN32) - , dev_handle(0), stack(MSBT_STACK_UNKNOWN) -#endif , m_last_input_report() , m_channel(0) , m_rumble_state() - , m_run_thread(false) + , m_need_prepare() { -#if defined(__linux__) && HAVE_BLUEZ - bdaddr = (bdaddr_t){{0, 0, 0, 0, 0, 0}}; -#endif + InitInternal(); } Wiimote::~Wiimote() { StopThread(); - - if (IsConnected()) - Disconnect(); - ClearReadQueue(); m_write_reports.Clear(); + TeardownInternal(); } // to be called from CPU thread @@ -73,25 +61,26 @@ void Wiimote::WriteReport(Report rpt) if (rpt.size() >= 3) { bool const new_rumble_state = (rpt[2] & 0x1) != 0; - + if (WM_RUMBLE == rpt[1] && new_rumble_state == m_rumble_state) { // If this is a rumble report and the rumble state didn't change, ignore //ERROR_LOG(WIIMOTE, "Ignoring rumble report."); return; } - + m_rumble_state = new_rumble_state; } m_write_reports.Push(std::move(rpt)); + IOWakeup(); } // to be called from CPU thread void Wiimote::QueueReport(u8 rpt_id, const void* _data, unsigned int size) { auto const data = static_cast(_data); - + Report rpt(size + 2); rpt[0] = WM_SET_REPORT | WM_BT_OUTPUT; rpt[1] = rpt_id; @@ -102,7 +91,7 @@ void Wiimote::QueueReport(u8 rpt_id, const void* _data, unsigned int size) void Wiimote::DisableDataReporting() { m_last_input_report.clear(); - + // This probably accomplishes nothing. wm_report_mode rpt = {}; rpt.mode = WM_REPORT_CORE; @@ -131,7 +120,7 @@ void Wiimote::SetChannel(u16 channel) void Wiimote::ClearReadQueue() { Report rpt; - + // The "Clear" function isn't thread-safe :/ while (m_read_reports.Pop(rpt)) {} @@ -162,12 +151,12 @@ void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const if (channel != m_channel) { m_channel = channel; - + ClearReadQueue(); EmuStart(); } - + auto const data = static_cast(_data); Report rpt(data, data + size); WiimoteEmu::Wiimote *const wm = (WiimoteEmu::Wiimote*)::Wiimote::GetPlugin()->controllers[index]; @@ -179,7 +168,7 @@ void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const { rpt[0] = WM_SET_REPORT | WM_BT_OUTPUT; } - + // Disallow games from turning off all of the LEDs. // It makes Wiimote connection status confusing. if (rpt[1] == WM_LEDS) @@ -225,8 +214,8 @@ bool Wiimote::Read() } else if (0 == result) { - WARN_LOG(WIIMOTE, "Wiimote::IORead failed. Disconnecting Wiimote %d.", index + 1); - Disconnect(); + ERROR_LOG(WIIMOTE, "Wiimote::IORead failed. Disconnecting Wiimote %d.", index + 1); + DisconnectInternal(); } return false; @@ -237,9 +226,9 @@ bool Wiimote::Write() if (!m_write_reports.Empty()) { Report const& rpt = m_write_reports.Front(); - + bool const is_speaker_data = rpt[1] == WM_WRITE_SPEAKER_DATA; - + if (!is_speaker_data || m_last_audio_report.GetTimeDifference() > 5) { if (Core::g_CoreStartupParameter.iBBDumpPort > 0 && index == WIIMOTE_BALANCE_BOARD) @@ -248,15 +237,17 @@ bool Wiimote::Write() Socket.Send((char*)rpt.data(), rpt.size(), sf::IPAddress::LocalHost, Core::g_CoreStartupParameter.iBBDumpPort); } IOWrite(rpt.data(), rpt.size()); - + if (is_speaker_data) + { m_last_audio_report.Update(); - + } + m_write_reports.Pop(); return true; } } - + return false; } @@ -275,7 +266,7 @@ const Report& Wiimote::ProcessReadQueue() { // A non-data report, use it. return m_last_input_report; - + // Forget the last data report as it may be of the wrong type // or contain outdated button data // or it's not supposed to be sent at this time @@ -286,7 +277,7 @@ const Report& Wiimote::ProcessReadQueue() // If the last report wasn't a data report it's irrelevant. if (!IsDataReport(m_last_input_report)) m_last_input_report.clear(); - + // If it was a data report, we repeat that until something else comes in. return m_last_input_report; } @@ -304,31 +295,37 @@ void Wiimote::Update() // Send the report if (!rpt.empty() && m_channel > 0) - Core::Callback_WiimoteInterruptChannel(index, m_channel, - rpt.data(), rpt.size()); + { + Core::Callback_WiimoteInterruptChannel(index, m_channel, + rpt.data(), (u32)rpt.size()); + } } -bool Wiimote::Prepare(int _index) +void Wiimote::Prepare(int _index) { index = _index; + m_need_prepare = true; +} +bool Wiimote::PrepareOnThread() +{ // core buttons, no continuous reporting - u8 const mode_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REPORT_MODE, 0, WM_REPORT_CORE}; - + u8 static const mode_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REPORT_MODE, 0, WM_REPORT_CORE}; + // Set the active LEDs and turn on rumble. - u8 const led_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_LEDS, u8(WIIMOTE_LED_1 << (index%WIIMOTE_BALANCE_BOARD) | 0x1)}; + u8 static const led_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_LEDS, u8(WIIMOTE_LED_1 << (index%WIIMOTE_BALANCE_BOARD) | 0x1)}; // Turn off rumble - u8 rumble_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_RUMBLE, 0}; - + u8 static const rumble_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_RUMBLE, 0}; + // Request status report - u8 const req_status_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0}; + u8 static const req_status_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0}; // TODO: check for sane response? return (IOWrite(mode_report, sizeof(mode_report)) - && IOWrite(led_report, sizeof(led_report)) - && (SLEEP(200), IOWrite(rumble_report, sizeof(rumble_report))) - && IOWrite(req_status_report, sizeof(req_status_report))); + && IOWrite(led_report, sizeof(led_report)) + && (SLEEP(200), IOWrite(rumble_report, sizeof(rumble_report))) + && IOWrite(req_status_report, sizeof(req_status_report))); } void Wiimote::EmuStart() @@ -476,10 +473,18 @@ void WiimoteScanner::ThreadFunc() //std::this_thread::yield(); Common::SleepCurrentThread(500); } - + NOTICE_LOG(WIIMOTE, "Wiimote scanning has stopped."); } +bool Wiimote::Connect() +{ + m_thread_ready = false; + StartThread(); + WaitReady(); + return IsConnected(); +} + void Wiimote::StartThread() { m_run_thread = true; @@ -489,26 +494,64 @@ void Wiimote::StartThread() void Wiimote::StopThread() { m_run_thread = false; + IOWakeup(); if (m_wiimote_thread.joinable()) m_wiimote_thread.join(); +#if defined(__APPLE__) +#endif +} + +void Wiimote::SetReady() +{ + if (!m_thread_ready) + { + { + std::lock_guard Guard(m_thread_ready_mutex); + m_thread_ready = true; + } + m_thread_ready_cond.notify_all(); + } +} + +void Wiimote::WaitReady() +{ + std::unique_lock lock(m_thread_ready_mutex); + while (!m_thread_ready) + { + m_thread_ready_cond.wait(lock); + } } void Wiimote::ThreadFunc() { Common::SetCurrentThreadName("Wiimote Device Thread"); - // main loop - while (m_run_thread && IsConnected()) + bool ok = ConnectInternal(); + + SetReady(); + + if (!ok) { -#ifdef __APPLE__ - // Reading happens elsewhere on OSX - bool const did_something = Write(); -#else - bool const did_something = Write() || Read(); -#endif - if (!did_something) - Common::SleepCurrentThread(1); + return; } + + // main loop + while (IsConnected() && m_run_thread) + { + if (m_need_prepare) + { + m_need_prepare = false; + if (!PrepareOnThread()) + { + ERROR_LOG(WIIMOTE, "Wiimote::PrepareOnThread failed. Disconnecting Wiimote %d.", index + 1); + break; + } + } + Write(); + Read(); + } + + DisconnectInternal(); } void LoadSettings() @@ -526,7 +569,7 @@ void LoadSettings() sec.Get("Source", &g_wiimote_sources[i], i ? WIIMOTE_SRC_NONE : WIIMOTE_SRC_EMU); } - + std::string secname("BalanceBoard"); IniFile::Section& sec = *inifile.GetOrCreateSection(secname.c_str()); sec.Get("Source", &g_wiimote_sources[WIIMOTE_BALANCE_BOARD], WIIMOTE_SRC_NONE); @@ -573,9 +616,9 @@ void Initialize(bool wait) // called on emulation shutdown void Stop(void) { - for (unsigned int i = 0; i < MAX_BBMOTES; ++i) - if (g_wiimotes[i] && g_wiimotes[i]->IsConnected()) - g_wiimotes[i]->EmuStop(); + for (auto& wiimote : g_wiimotes) + if (wiimote && wiimote->IsConnected()) + wiimote->EmuStop(); } // called when the dolphin app exits @@ -598,16 +641,16 @@ void Shutdown(void) void Resume() { - for (unsigned int i = 0; i < MAX_BBMOTES; ++i) - if (g_wiimotes[i] && g_wiimotes[i]->IsConnected()) - g_wiimotes[i]->EmuResume(); + for (auto& wiimote : g_wiimotes) + if (wiimote && wiimote->IsConnected()) + wiimote->EmuResume(); } void Pause() { - for (unsigned int i = 0; i < MAX_BBMOTES; ++i) - if (g_wiimotes[i] && g_wiimotes[i]->IsConnected()) - g_wiimotes[i]->EmuPause(); + for (auto& wiimote : g_wiimotes) + if (wiimote && wiimote->IsConnected()) + wiimote->EmuPause(); } void ChangeWiimoteSource(unsigned int index, int source) @@ -617,8 +660,6 @@ void ChangeWiimoteSource(unsigned int index, int source) g_wiimote_sources[index] = source; g_wiimote_scanner.WantWiimotes(0 != CalculateWantedWiimotes()); g_wiimote_scanner.WantBB(0 != CalculateWantedBB()); - - // kill real connection (or swap to different slot) DoneWithWiimote(index); } @@ -629,57 +670,56 @@ void ChangeWiimoteSource(unsigned int index, int source) Host_ConnectWiimote(index, true); } +static bool TryToConnectWiimoteN(Wiimote* wm, unsigned int i) +{ + if (WIIMOTE_SRC_REAL & g_wiimote_sources[i] + && !g_wiimotes[i]) + { + if (wm->Connect()) + { + wm->Prepare(i); + NOTICE_LOG(WIIMOTE, "Connected to Wiimote %i.", i + 1); + g_wiimotes[i] = wm; + Host_ConnectWiimote(i, true); + } + return true; + } + return false; +} + void TryToConnectWiimote(Wiimote* wm) { std::unique_lock lk(g_refresh_lock); for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) { - if (WIIMOTE_SRC_REAL & g_wiimote_sources[i] - && !g_wiimotes[i]) + if (TryToConnectWiimoteN(wm, i)) { - if (wm->Connect() && wm->Prepare(i)) - { - NOTICE_LOG(WIIMOTE, "Connected to Wiimote %i.", i + 1); - - std::swap(g_wiimotes[i], wm); - g_wiimotes[i]->StartThread(); - - Host_ConnectWiimote(i, true); - } + wm = NULL; break; } } g_wiimote_scanner.WantWiimotes(0 != CalculateWantedWiimotes()); - + lk.unlock(); - + delete wm; } void TryToConnectBalanceBoard(Wiimote* wm) { std::unique_lock lk(g_refresh_lock); - - if (WIIMOTE_SRC_REAL & g_wiimote_sources[WIIMOTE_BALANCE_BOARD] - && !g_wiimotes[WIIMOTE_BALANCE_BOARD]) + + if (TryToConnectWiimoteN(wm, WIIMOTE_BALANCE_BOARD)) { - if (wm->Connect() && wm->Prepare(WIIMOTE_BALANCE_BOARD)) - { - NOTICE_LOG(WIIMOTE, "Connected to Balance Board %i.", WIIMOTE_BALANCE_BOARD + 1); - - std::swap(g_wiimotes[WIIMOTE_BALANCE_BOARD], wm); - g_wiimotes[WIIMOTE_BALANCE_BOARD]->StartThread(); - - Host_ConnectWiimote(WIIMOTE_BALANCE_BOARD, true); - } + wm = NULL; } - + g_wiimote_scanner.WantBB(0 != CalculateWantedBB()); - + lk.unlock(); - + delete wm; } @@ -687,28 +727,15 @@ void DoneWithWiimote(int index) { std::lock_guard lk(g_refresh_lock); - if (g_wiimotes[index]) + Wiimote* wm = g_wiimotes[index]; + + if (wm) { - g_wiimotes[index]->StopThread(); - + g_wiimotes[index] = NULL; // First see if we can use this real Wiimote in another slot. - for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) - { - if (WIIMOTE_SRC_REAL & g_wiimote_sources[i] - && !g_wiimotes[i]) - { - if (g_wiimotes[index]->Prepare(i)) - { - std::swap(g_wiimotes[i], g_wiimotes[index]); - g_wiimotes[i]->StartThread(); - - Host_ConnectWiimote(i, true); - } - break; - } - } + TryToConnectWiimote(wm); } - + // else, just disconnect the Wiimote HandleWiimoteDisconnect(index); } @@ -716,7 +743,7 @@ void DoneWithWiimote(int index) void HandleWiimoteDisconnect(int index) { Wiimote* wm = NULL; - + { std::lock_guard lk(g_refresh_lock); @@ -741,12 +768,12 @@ void HandleFoundWiimotes(const std::vector& wiimotes) void Refresh() { g_wiimote_scanner.StopScanning(); - + { std::unique_lock lk(g_refresh_lock); std::vector found_wiimotes; Wiimote* found_board = NULL; - + if (0 != CalculateWantedWiimotes() || 0 != CalculateWantedBB()) { // Don't hang Dolphin when searching @@ -763,9 +790,7 @@ void Refresh() { if (g_wiimotes[i]) { - g_wiimotes[i]->StopThread(); g_wiimotes[i]->Prepare(i); - g_wiimotes[i]->StartThread(); } } @@ -773,7 +798,7 @@ void Refresh() if(found_board) TryToConnectBalanceBoard(found_board); } - + Initialize(); } diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.h b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.h index 2ab4e435e2..bc953102a9 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.h +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteReal.h @@ -52,18 +52,25 @@ public: // connecting and disconnecting from physical devices // (using address inserted by FindWiimotes) + // these are called from the wiimote's thread. + bool ConnectInternal(); + void DisconnectInternal(); + + void InitInternal(); + void TeardownInternal(); + bool Connect(); - void Disconnect(); // TODO: change to something like IsRelevant bool IsConnected() const; - bool Prepare(int index); + void Prepare(int index); + bool PrepareOnThread(); void DisableDataReporting(); void EnableDataReporting(u8 mode); void SetChannel(u16 channel); - + void QueueReport(u8 rpt_id, const void* data, unsigned int size); int index; @@ -72,13 +79,15 @@ public: IOBluetoothDevice *btd; IOBluetoothL2CAPChannel *ichan; IOBluetoothL2CAPChannel *cchan; - char input[MAX_PAYLOAD]; + unsigned char* input; int inputlen; bool m_connected; + CFRunLoopRef m_wiimote_thread_run_loop; #elif defined(__linux__) && HAVE_BLUEZ bdaddr_t bdaddr; // Bluetooth address int cmd_sock; // Command socket int int_sock; // Interrupt socket + int wakeup_pipe_w, wakeup_pipe_r; #elif defined(_WIN32) std::basic_string devicepath; // Unique wiimote reference @@ -95,20 +104,30 @@ protected: private: void ClearReadQueue(); void WriteReport(Report rpt); - + int IORead(u8* buf); - int IOWrite(u8 const* buf, int len); + int IOWrite(u8 const* buf, size_t len); + void IOWakeup(); void ThreadFunc(); + void SetReady(); + void WaitReady(); bool m_rumble_state; - - bool m_run_thread; - std::thread m_wiimote_thread; - + + std::thread m_wiimote_thread; + // Whether to keep running the thread. + volatile bool m_run_thread; + // Whether to call PrepareOnThread. + volatile bool m_need_prepare; + // Whether the thread has finished ConnectInternal. + volatile bool m_thread_ready; + std::mutex m_thread_ready_mutex; + std::condition_variable m_thread_ready_cond; + Common::FifoQueue m_read_reports; Common::FifoQueue m_write_reports; - + Common::Timer m_last_audio_report; }; @@ -119,7 +138,7 @@ public: ~WiimoteScanner(); bool IsReady() const; - + void WantWiimotes(bool do_want); void WantBB(bool do_want); diff --git a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteRealBase.h b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteRealBase.h index 0ad78610fe..82c18f6ec2 100644 --- a/Source/Core/Core/Src/HW/WiimoteReal/WiimoteRealBase.h +++ b/Source/Core/Core/Src/HW/WiimoteReal/WiimoteRealBase.h @@ -8,6 +8,13 @@ #ifdef _WIN32 #include #elif defined(__APPLE__) + // Work around an Apple bug: for some reason, IOBluetooth.h errors on + // inclusion in Mavericks, but only in Objective-C++ C++11 mode. I filed + // this as ; in the meantime... + #import + #undef NS_ENUM_AVAILABLE + #define NS_ENUM_AVAILABLE(...) + // end hack #import #elif defined(__linux__) && HAVE_BLUEZ #include diff --git a/Source/Core/Core/Src/Host.h b/Source/Core/Core/Src/Host.h index bb2c9af8aa..67c74faba8 100644 --- a/Source/Core/Core/Src/Host.h +++ b/Source/Core/Core/Src/Host.h @@ -13,7 +13,7 @@ // Common and Host. // Common simply provides OS-neutral implementations of things like threads, mutexes, -// INI file manipulation, memory mapping, etc. +// INI file manipulation, memory mapping, etc. // Host is an abstract interface for communicating things back to the host. The emulator // core is treated as a library, not as a main program, because it is far easier to diff --git a/Source/Core/Core/Src/IPC_HLE/ICMP.h b/Source/Core/Core/Src/IPC_HLE/ICMP.h new file mode 100644 index 0000000000..b446c63336 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/ICMP.h @@ -0,0 +1,15 @@ +#ifndef _ICMP_H_ +#define _ICMP_H_ + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "Common.h" + +int icmp_echo_req(const u32 s, const sockaddr_in *addr, const u8 *data, const u32 data_length); +int icmp_echo_rep(const u32 s, sockaddr_in *addr, const u32 timeout, const u32 data_length); + +#endif diff --git a/Source/Core/Core/Src/IPC_HLE/ICMPLin.cpp b/Source/Core/Core/Src/IPC_HLE/ICMPLin.cpp new file mode 100644 index 0000000000..5e5430deaa --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/ICMPLin.cpp @@ -0,0 +1,16 @@ +#include "ICMP.h" + +// Currently stubbed. AFAIK (delroth) there is no way to send ICMP echo +// requests without being root on current Linux versions. + +int icmp_echo_req(const u32 s, const sockaddr_in *addr, const u8 *data, const u32 data_length) +{ + // TODO + return -1; +} + +int icmp_echo_rep(const u32 s, sockaddr_in *addr, const u32 timeout, const u32 data_length) +{ + // TODO + return -1; +} diff --git a/Source/Core/Core/Src/IPC_HLE/ICMPWin.cpp b/Source/Core/Core/Src/IPC_HLE/ICMPWin.cpp new file mode 100644 index 0000000000..55ccb9e5c8 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/ICMPWin.cpp @@ -0,0 +1,98 @@ +#include "ICMP.h" + +enum +{ + ICMP_ECHOREPLY = 0, + ICMP_ECHOREQ = 8 +}; + +enum +{ + ICMP_HDR_LEN = 4, + IP_HDR_LEN = 20 +}; + +#pragma pack(push, 1) +struct icmp_hdr +{ + u8 type; + u8 code; + u16 checksum; + u16 id; + u16 seq; + char data[1]; +}; +#pragma pack(pop) + +static u8 workspace[56]; + +/* +* Description: +* Calculate Internet checksum for data buffer and length (one's +* complement sum of 16-bit words). Used in IP, ICMP, UDP, IGMP. +* +* NOTE: to handle odd number of bytes, last (even) byte in +* buffer have a value of 0 (we assume that it does) +*/ +u16 cksum(const u16 *buffer, int length) +{ + u32 sum = 0; + + while (length > 0) + { + sum += *(buffer++); + length -= 2; + } + + sum = (sum & 0xffff) + (sum >> 16); + sum += sum >> 16; + + return (u16)~sum; +} + +int icmp_echo_req(const u32 s, const sockaddr_in *addr, const u8 *data, const u32 data_length) +{ + memset(workspace, 0, sizeof(workspace)); + icmp_hdr *header = (icmp_hdr *)workspace; + header->type = ICMP_ECHOREQ; + header->code = 0; + header->checksum = 0; + memcpy(&header->id, data, data_length); + + header->checksum = cksum((u16 *)header, ICMP_HDR_LEN + data_length); + + int num_bytes = sendto((SOCKET)s, (LPSTR)header, ICMP_HDR_LEN + data_length, 0, + (sockaddr *)addr, sizeof(sockaddr)); + + if (num_bytes >= ICMP_HDR_LEN) + num_bytes -= ICMP_HDR_LEN; + + return num_bytes; +} + +int icmp_echo_rep(const u32 s, sockaddr_in *addr, const u32 timeout, const u32 data_length) +{ + memset(workspace, 0, sizeof(workspace)); + int addr_length = sizeof(sockaddr_in); + int num_bytes = 0; + + fd_set read_fds; + FD_ZERO(&read_fds); + FD_SET(s, &read_fds); + + timeval t; + t.tv_sec = timeout / 1000; + if (select(0, &read_fds, NULL, NULL, &t) > 0) + { + num_bytes = recvfrom((SOCKET)s, (LPSTR)workspace, + IP_HDR_LEN + ICMP_HDR_LEN + data_length, + 0, (sockaddr *)addr, &addr_length); + + // TODO do we need to memcmp the data? + + if (num_bytes >= IP_HDR_LEN + ICMP_HDR_LEN) + num_bytes -= IP_HDR_LEN + ICMP_HDR_LEN; + } + + return num_bytes; +} diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp index 439d37c5d9..3bd37ba373 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp @@ -26,6 +26,7 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC #include "Common.h" #include "CommonPaths.h" +#include "Thread.h" #include "WII_IPC_HLE.h" #include "WII_IPC_HLE_Device.h" #include "WII_IPC_HLE_Device_DI.h" @@ -33,11 +34,16 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC #include "WII_IPC_HLE_Device_stm.h" #include "WII_IPC_HLE_Device_fs.h" #include "WII_IPC_HLE_Device_net.h" +#include "WII_IPC_HLE_Device_net_ssl.h" #include "WII_IPC_HLE_Device_es.h" #include "WII_IPC_HLE_Device_usb.h" #include "WII_IPC_HLE_Device_usb_kbd.h" #include "WII_IPC_HLE_Device_sdio_slot0.h" +#if defined(__LIBUSB__) || defined (_WIN32) + #include "WII_IPC_HLE_Device_hid.h" +#endif + #include "FileUtil.h" // For Copy #include "../ConfigManager.h" #include "../HW/CPU.h" @@ -68,6 +74,7 @@ IWII_IPC_HLE_Device* es_handles[ES_MAX_COUNT]; typedef std::deque ipc_msg_queue; static ipc_msg_queue request_queue; // ppc -> arm static ipc_msg_queue reply_queue; // arm -> ppc +static std::mutex s_reply_queue; static int enque_reply; @@ -75,12 +82,13 @@ static u64 last_reply_time; void EnqueReplyCallback(u64 userdata, int) { - reply_queue.push_back(userdata); + std::lock_guard lk(s_reply_queue); + reply_queue.push_back((u32)userdata); } void Init() { - + _dbg_assert_msg_(WII_IPC_HLE, g_DeviceMap.empty(), "DeviceMap isn't empty on init"); CWII_IPC_HLE_Device_es::m_ContentFile = ""; u32 i; @@ -108,22 +116,27 @@ void Init() g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_kd_request(i, std::string("/dev/net/kd/request")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_kd_time(i, std::string("/dev/net/kd/time")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_ncd_manage(i, std::string("/dev/net/ncd/manage")); i++; + g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_wd_command(i, std::string("/dev/net/wd/command")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_ip_top(i, std::string("/dev/net/ip/top")); i++; + g_DeviceMap[i] = new CWII_IPC_HLE_Device_net_ssl(i, std::string("/dev/net/ssl")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_kbd(i, std::string("/dev/usb/kbd")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_sdio_slot0(i, std::string("/dev/sdio/slot0")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/sdio/slot1")); i++; - g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/hid")); i++; + #if defined(__LIBUSB__) || defined(_WIN32) + g_DeviceMap[i] = new CWII_IPC_HLE_Device_hid(i, std::string("/dev/usb/hid")); i++; + #else + g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/hid")); i++; + #endif g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/oh1")); i++; g_DeviceMap[i] = new IWII_IPC_HLE_Device(i, std::string("_Unimplemented_Device_")); i++; - + enque_reply = CoreTiming::RegisterEvent("IPCReply", EnqueReplyCallback); } void Reset(bool _bHard) { - CoreTiming::RemoveAllEvents(enque_reply); - + u32 i; for (i=0; i lk(s_reply_queue); + reply_queue.clear(); + } last_reply_time = 0; } @@ -237,6 +261,8 @@ IWII_IPC_HLE_Device* CreateFileIO(u32 _DeviceID, const std::string& _rDeviceName void DoState(PointerWrap &p) { + std::lock_guard lk(s_reply_queue); + p.Do(request_queue); p.Do(reply_queue); p.Do(last_reply_time); @@ -338,11 +364,11 @@ void ExecuteCommand(u32 _Address) { u32 Mode = Memory::Read_U32(_Address + 0x10); DeviceID = getFreeDeviceId(); - + std::string DeviceName; Memory::GetString(DeviceName, Memory::Read_U32(_Address + 0xC)); - + WARN_LOG(WII_IPC_HLE, "Trying to open %s as %d", DeviceName.c_str(), DeviceID); if (DeviceID >= 0) { @@ -504,39 +530,31 @@ void ExecuteCommand(u32 _Address) } } - // It seems that the original hardware overwrites the command after it has been - // executed. We write 8 which is not any valid command, and what IOS does - Memory::Write_U32(8, _Address); - // IOS seems to write back the command that was responded to - Memory::Write_U32(Command, _Address + 8); if (CmdSuccess) { + // It seems that the original hardware overwrites the command after it has been + // executed. We write 8 which is not any valid command, and what IOS does + Memory::Write_U32(8, _Address); + // IOS seems to write back the command that was responded to + Memory::Write_U32(Command, _Address + 8); + // Ensure replies happen in order, fairly ugly // Without this, tons of games fail now that DI commands have different reply delays int reply_delay = pDevice ? pDevice->GetCmdDelay(_Address) : 0; - + const s64 ticks_til_last_reply = last_reply_time - CoreTiming::GetTicks(); - + if (ticks_til_last_reply > 0) - reply_delay = ticks_til_last_reply; - + { + reply_delay = (int)ticks_til_last_reply; + } + last_reply_time = CoreTiming::GetTicks() + reply_delay; - + // Generate a reply to the IPC command EnqReply(_Address, reply_delay); } - else - { - if (pDevice) - { - INFO_LOG(WII_IPC_HLE, "<<-- Reply Failed to %s IPC Request %i @ 0x%08x ", pDevice->GetDeviceName().c_str(), Command, _Address); - } - else - { - INFO_LOG(WII_IPC_HLE, "<<-- Reply Failed to Unknown (%08x) IPC Request %i @ 0x%08x ", DeviceID, Command, _Address); - } - } } // Happens AS SOON AS IPC gets a new pointer! @@ -573,11 +591,15 @@ void Update() #endif } - if (reply_queue.size()) + // lock due to using reply_queue { - WII_IPCInterface::GenerateReply(reply_queue.front()); - INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); - reply_queue.pop_front(); + std::lock_guard lk(s_reply_queue); + if (reply_queue.size()) + { + WII_IPCInterface::GenerateReply(reply_queue.front()); + INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); + reply_queue.pop_front(); + } } } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h index 051baf978c..5f492015f5 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h @@ -13,13 +13,15 @@ namespace WII_IPC_HLE_Interface { #define IPC_FIRST_ID 0x00 // first IPC device ID -#define IPC_MAX_FILES 0x10 // first IPC file ID - +#define IPC_MAX_FILES 0x10 // first IPC file ID + +void EnqueReplyCallback(u64 userdata, int =0); + // Init void Init(); // Shutdown -void Shutdown(); +void Shutdown(); // Reset void Reset(bool _bHard = false); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h index 3fd1a8dd0b..49249a2053 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h @@ -12,30 +12,85 @@ #include "ChunkFile.h" #define FS_SUCCESS (u32)0 // Success -#define FS_EACCES (u32)-1 // Permission denied -#define FS_EEXIST (u32)-2 // File exists +#define FS_EACCES (u32)-1 // Permission denied +#define FS_EEXIST (u32)-2 // File exists #define FS_EINVAL (u32)-4 // Invalid argument Invalid FD -#define FS_ENOENT (u32)-6 // File not found -#define FS_EBUSY (u32)-8 // Resource busy -#define FS_EIO (u32)-12 // Returned on ECC error -#define FS_ENOMEM (u32)-22 // Alloc failed during request -#define FS_EFATAL (u32)-101 // Fatal error -#define FS_EACCESS (u32)-102 // Permission denied -#define FS_ECORRUPT (u32)-103 // returned for "corrupted" NAND -#define FS_EEXIST2 (u32)-105 // File exists -#define FS_ENOENT2 (u32)-106 // File not found -#define FS_ENFILE (u32)-107 // Too many fds open -#define FS_EFBIG (u32)-108 // Max block count reached? -#define FS_EFDEXHAUSTED (u32)-109 // Too many fds open -#define FS_ENAMELEN (u32)-110 // Pathname is too long -#define FS_EFDOPEN (u32)-111 // FD is already open -#define FS_EIO2 (u32)-114 // Returned on ECC error -#define FS_ENOTEMPTY (u32)-115 // Directory not empty -#define FS_EDIRDEPTH (u32)-116 // Max directory depth exceeded -#define FS_EBUSY2 (u32)-118 // Resource busy +#define FS_ENOENT (u32)-6 // File not found +#define FS_EBUSY (u32)-8 // Resource busy +#define FS_EIO (u32)-12 // Returned on ECC error +#define FS_ENOMEM (u32)-22 // Alloc failed during request +#define FS_EFATAL (u32)-101 // Fatal error +#define FS_EACCESS (u32)-102 // Permission denied +#define FS_ECORRUPT (u32)-103 // returned for "corrupted" NAND +#define FS_EEXIST2 (u32)-105 // File exists +#define FS_ENOENT2 (u32)-106 // File not found +#define FS_ENFILE (u32)-107 // Too many fds open +#define FS_EFBIG (u32)-108 // Max block count reached? +#define FS_EFDEXHAUSTED (u32)-109 // Too many fds open +#define FS_ENAMELEN (u32)-110 // Pathname is too long +#define FS_EFDOPEN (u32)-111 // FD is already open +#define FS_EIO2 (u32)-114 // Returned on ECC error +#define FS_ENOTEMPTY (u32)-115 // Directory not empty +#define FS_EDIRDEPTH (u32)-116 // Max directory depth exceeded +#define FS_EBUSY2 (u32)-118 // Resource busy //#define FS_EFATAL (u32)-119 // Fatal error not used by IOS as fatal ERROR #define FS_EESEXHAUSTED (u32)-1016 // Max of 2 ES handles at a time +// A struct for IOS ioctlv calls +struct SIOCtlVBuffer +{ + SIOCtlVBuffer(u32 _Address) : m_Address(_Address) + { + // These are the Ioctlv parameters in the IOS communication. The BufferVector + // is a memory address offset at where the in and out buffer addresses are + // stored. + Parameter = Memory::Read_U32(m_Address + 0x0C); // command 3, arg0 + NumberInBuffer = Memory::Read_U32(m_Address + 0x10); // 4, arg1 + NumberPayloadBuffer = Memory::Read_U32(m_Address + 0x14); // 5, arg2 + BufferVector = Memory::Read_U32(m_Address + 0x18); // 6, arg3 + + // The start of the out buffer + u32 BufferVectorOffset = BufferVector; + + // Write the address and size for all in messages + for (u32 i = 0; i < NumberInBuffer; i++) + { + SBuffer Buffer; + Buffer.m_Address = Memory::Read_U32(BufferVectorOffset); + BufferVectorOffset += 4; + Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); + BufferVectorOffset += 4; + InBuffer.push_back(Buffer); + DEBUG_LOG(WII_IPC_HLE, "SIOCtlVBuffer in%i: 0x%08x, 0x%x", + i, Buffer.m_Address, Buffer.m_Size); + } + + // Write the address and size for all out or in-out messages + for (u32 i = 0; i < NumberPayloadBuffer; i++) + { + SBuffer Buffer; + Buffer.m_Address = Memory::Read_U32(BufferVectorOffset); + BufferVectorOffset += 4; + Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); + BufferVectorOffset += 4; + PayloadBuffer.push_back(Buffer); + DEBUG_LOG(WII_IPC_HLE, "SIOCtlVBuffer io%i: 0x%08x, 0x%x", + i, Buffer.m_Address, Buffer.m_Size); + } + } + + const u32 m_Address; + + u32 Parameter; + u32 NumberInBuffer; + u32 NumberPayloadBuffer; + u32 BufferVector; + + struct SBuffer { u32 m_Address, m_Size; }; + std::vector InBuffer; + std::vector PayloadBuffer; +}; + class IWII_IPC_HLE_Device { public: @@ -52,12 +107,12 @@ public: { } - virtual void DoState(PointerWrap& p) + virtual void DoState(PointerWrap& p) { DoStateShared(p); p.Do(m_Active); } - + void DoStateShared(PointerWrap& p); const std::string& GetDeviceName() const { return m_Name; } @@ -95,85 +150,30 @@ public: virtual bool IsHardware() { return m_Hardware; } virtual bool IsOpened() { return m_Active; } - +public: + std::string m_Name; protected: // STATE_TO_SAVE - std::string m_Name; u32 m_DeviceID; bool m_Hardware; bool m_Active; - // A struct for IOS ioctlv calls - struct SIOCtlVBuffer - { - SIOCtlVBuffer(u32 _Address) : m_Address(_Address) - { - // These are the Ioctlv parameters in the IOS communication. The BufferVector - // is a memory address offset at where the in and out buffer addresses are - // stored. - Parameter = Memory::Read_U32(m_Address + 0x0C); // command 3, arg0 - NumberInBuffer = Memory::Read_U32(m_Address + 0x10); // 4, arg1 - NumberPayloadBuffer = Memory::Read_U32(m_Address + 0x14); // 5, arg2 - BufferVector = Memory::Read_U32(m_Address + 0x18); // 6, arg3 - - // The start of the out buffer - u32 BufferVectorOffset = BufferVector; - - // Write the address and size for all in messages - for (u32 i = 0; i < NumberInBuffer; i++) - { - SBuffer Buffer; - Buffer.m_Address = Memory::Read_U32(BufferVectorOffset); - BufferVectorOffset += 4; - Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); - BufferVectorOffset += 4; - InBuffer.push_back(Buffer); - DEBUG_LOG(WII_IPC_HLE, "SIOCtlVBuffer in%i: 0x%08x, 0x%x", - i, Buffer.m_Address, Buffer.m_Size); - } - - // Write the address and size for all out or in-out messages - for (u32 i = 0; i < NumberPayloadBuffer; i++) - { - SBuffer Buffer; - Buffer.m_Address = Memory::Read_U32(BufferVectorOffset); - BufferVectorOffset += 4; - Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); - BufferVectorOffset += 4; - PayloadBuffer.push_back(Buffer); - DEBUG_LOG(WII_IPC_HLE, "SIOCtlVBuffer io%i: 0x%08x, 0x%x", - i, Buffer.m_Address, Buffer.m_Size); - } - } - - const u32 m_Address; - - u32 Parameter; - u32 NumberInBuffer; - u32 NumberPayloadBuffer; - u32 BufferVector; - - struct SBuffer { u32 m_Address, m_Size; }; - std::vector InBuffer; - std::vector PayloadBuffer; - }; - // Write out the IPC struct from _CommandAddress to _NumberOfCommands numbers // of 4 byte commands. void DumpCommands(u32 _CommandAddress, size_t _NumberOfCommands = 8, LogTypes::LOG_TYPE LogType = LogTypes::WII_IPC_HLE, LogTypes::LOG_LEVELS Verbosity = LogTypes::LDEBUG) { - GENERIC_LOG(LogType, Verbosity, "CommandDump of %s", + GENERIC_LOG(LogType, Verbosity, "CommandDump of %s", GetDeviceName().c_str()); for (u32 i = 0; i < _NumberOfCommands; i++) { GENERIC_LOG(LogType, Verbosity, " Command%02i: 0x%08x", i, - Memory::Read_U32(_CommandAddress + i*4)); + Memory::Read_U32(_CommandAddress + i*4)); } } - + void DumpAsync(u32 BufferVector, u32 NumberInBuffer, u32 NumberOutBuffer, LogTypes::LOG_TYPE LogType = LogTypes::WII_IPC_HLE, LogTypes::LOG_LEVELS Verbosity = LogTypes::LDEBUG) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp index 659807dcc4..e0106bf273 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.cpp @@ -19,6 +19,8 @@ #include "../../DiscIO/Src/FileMonitor.h" +#include + using namespace DVDInterface; @@ -68,7 +70,7 @@ bool CWII_IPC_HLE_Device_di::Close(u32 _CommandAddress, bool _bForce) return true; } -bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress) { u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); @@ -85,7 +87,7 @@ bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress) return true; } -bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress) { SIOCtlVBuffer CommandBuffer(_CommandAddress); @@ -108,7 +110,7 @@ bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress) // Get TMD offset for requested partition... u64 const TMDOffset = ((u64)Memory::Read_U32(CommandBuffer.InBuffer[0].m_Address + 4) << 2 ) + 0x2c0; - INFO_LOG(WII_IPC_DVD, "DVDLowOpenPartition: TMDOffset 0x%016llx", TMDOffset); + INFO_LOG(WII_IPC_DVD, "DVDLowOpenPartition: TMDOffset 0x%016" PRIx64, TMDOffset); static u32 const TMDsz = 0x208; //CommandBuffer.PayloadBuffer[0].m_Size; u8 pTMD[TMDsz]; @@ -204,13 +206,13 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32 pFilename = m_pFileSystem->GetFileName(DVDAddress); if (pFilename != NULL) { - INFO_LOG(WII_IPC_DVD, "DVDLowRead: %s (0x%llx) - (DVDAddr: 0x%llx, Size: 0x%x)", + INFO_LOG(WII_IPC_DVD, "DVDLowRead: %s (0x%" PRIx64 ") - (DVDAddr: 0x%" PRIx64 ", Size: 0x%x)", pFilename, m_pFileSystem->GetFileSize(pFilename), DVDAddress, Size); FileMon::CheckFile(std::string(pFilename), (int)m_pFileSystem->GetFileSize(pFilename)); } else { - INFO_LOG(WII_IPC_DVD, "DVDLowRead: file unknown - (DVDAddr: 0x%llx, Size: 0x%x)", + INFO_LOG(WII_IPC_DVD, "DVDLowRead: file unknown - (DVDAddr: 0x%" PRIx64 ", Size: 0x%x)", DVDAddress, Size); } } @@ -308,7 +310,7 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32 u64 DVDAddress = (u64)DVDAddress32 << 2; - INFO_LOG(WII_IPC_DVD, "DVDLowUnencryptedRead: DVDAddr: 0x%08llx, Size: 0x%x", DVDAddress, Size); + INFO_LOG(WII_IPC_DVD, "DVDLowUnencryptedRead: DVDAddr: 0x%08" PRIx64 ", Size: 0x%x", DVDAddress, Size); if (Size > _BufferOutSize) { @@ -342,12 +344,12 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32 pFilename = m_pFileSystem->GetFileName(DVDAddress); if (pFilename != NULL) { - INFO_LOG(WII_IPC_DVD, "DVDLowSeek: %s (0x%llx) - (DVDAddr: 0x%llx)", + INFO_LOG(WII_IPC_DVD, "DVDLowSeek: %s (0x%" PRIx64 ") - (DVDAddr: 0x%" PRIx64 ")", pFilename, m_pFileSystem->GetFileSize(pFilename), DVDAddress); } else { - INFO_LOG(WII_IPC_DVD, "DVDLowSeek: file unknown - (DVDAddr: 0x%llx)", + INFO_LOG(WII_IPC_DVD, "DVDLowSeek: file unknown - (DVDAddr: 0x%" PRIx64 ")", DVDAddress); } } @@ -418,7 +420,7 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32 case DVDLowAudioBufferConfig: /* For more information: http://www.crazynation.org/GC/GC_DD_TECH/GCTech.htm - + Upon Power up or reset , 2 commands must be issued for proper use of audio streaming: DVDReadDiskID A8000040,00000000,00000020 DVDLowAudioBufferConfig E4xx00yy,00000000,00000020 @@ -453,9 +455,9 @@ int CWII_IPC_HLE_Device_di::GetCmdDelay(u32 _CommandAddress) { u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); u32 Command = Memory::Read_U32(BufferIn) >> 24; - + // Hacks below - + switch (Command) { case DVDLowRead: @@ -468,13 +470,13 @@ int CWII_IPC_HLE_Device_di::GetCmdDelay(u32 _CommandAddress) return SystemTimers::GetTicksPerSecond() / 975000 * Size; break; } - + case DVDLowClearCoverInterrupt: // Less than ~1/155th of a second hangs Oregon Trail at "loading wheel". // More than ~1/140th of a second hangs Resident Evil Archives: Resident Evil Zero. return SystemTimers::GetTicksPerSecond() / 146; break; - + // case DVDLowAudioBufferConfig: // case DVDLowInquiry: // case DVDLowReadDiskID: diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.h index 64be42f978..e5b19e4ab7 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_DI.h @@ -24,9 +24,9 @@ public: bool Open(u32 _CommandAddress, u32 _Mode); bool Close(u32 _CommandAddress, bool _bForce); - bool IOCtl(u32 _CommandAddress); + bool IOCtl(u32 _CommandAddress); bool IOCtlV(u32 _CommandAddress); - + int GetCmdDelay(u32); private: diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp index 4f45d6abed..1a8febe6fd 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp @@ -21,10 +21,10 @@ std::string HLE_IPC_BuildFilename(std::string path_wii, int _size) std::string path_full = File::GetUserPath(D_WIIROOT_IDX); // Replaces chars that FAT32 can't support with strings defined in /sys/replace - for (auto i = replacements.begin(); i != replacements.end(); ++i) + for (auto& replacement : replacements) { - for (size_t j = 0; (j = path_wii.find(i->first, j)) != path_wii.npos; ++j) - path_wii.replace(j, 1, i->second); + for (size_t j = 0; (j = path_wii.find(replacement.first, j)) != path_wii.npos; ++j) + path_wii.replace(j, 1, replacement.second); } path_full += path_wii; @@ -32,6 +32,39 @@ std::string HLE_IPC_BuildFilename(std::string path_wii, int _size) return path_full; } +void HLE_IPC_CreateVirtualFATFilesystem() +{ + const int cdbSize = 0x01400000; + const std::string cdbPath = Common::GetTitleDataPath(TITLEID_SYSMENU) + "cdb.vff"; + if ((int)File::GetSize(cdbPath) < cdbSize) + { + // cdb.vff is a virtual Fat filesystem created on first launch of sysmenu + // we create it here as it is faster ~3 minutes for me when sysmenu does it ~1 second created here + const u8 cdbHDR[0x20] = {'V', 'F', 'F', 0x20, 0xfe, 0xff, 1, 0, 1, 0x40, 0, 0, 0, 0x20}; + const u8 cdbFAT[4] = {0xf0, 0xff, 0xff, 0xff}; + + File::IOFile cdbFile(cdbPath, "wb"); + if (cdbFile) + { + cdbFile.WriteBytes(cdbHDR, 0x20); + cdbFile.WriteBytes(cdbFAT, 0x4); + cdbFile.Seek(0x14020, SEEK_SET); + cdbFile.WriteBytes(cdbFAT, 0x4); + // 20 MiB file + cdbFile.Seek(cdbSize - 1, SEEK_SET); + // write the final 0 to 0 file from the second FAT to 20 MiB + cdbFile.WriteBytes(cdbHDR + 14, 1); + if (!cdbFile.IsGood()) + { + cdbFile.Close(); + File::Delete(cdbPath); + } + cdbFile.Flush(); + cdbFile.Close(); + } + } +} + CWII_IPC_HLE_Device_FileIO::CWII_IPC_HLE_Device_FileIO(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName, false) // not a real hardware , m_Mode(0) @@ -46,7 +79,7 @@ CWII_IPC_HLE_Device_FileIO::~CWII_IPC_HLE_Device_FileIO() bool CWII_IPC_HLE_Device_FileIO::Close(u32 _CommandAddress, bool _bForce) { - INFO_LOG(WII_IPC_FILEIO, "FileIO: Close %s (DeviceID=%08x)", m_Name.c_str(), m_DeviceID); + INFO_LOG(WII_IPC_FILEIO, "FileIO: Close %s (DeviceID=%08x)", m_Name.c_str(), m_DeviceID); m_Mode = 0; // Close always return 0 for success @@ -56,11 +89,11 @@ bool CWII_IPC_HLE_Device_FileIO::Close(u32 _CommandAddress, bool _bForce) return true; } -bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode) +bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode) { m_Mode = _Mode; u32 ReturnValue = 0; - + static const char* const Modes[] = { "Unk Mode", @@ -68,9 +101,9 @@ bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode) "Write only", "Read and Write" }; - + m_filepath = HLE_IPC_BuildFilename(m_Name, 64); - + // The file must exist before we can open it // It should be created by ISFS_CreateFile, not here if (File::Exists(m_filepath)) @@ -93,68 +126,80 @@ bool CWII_IPC_HLE_Device_FileIO::Open(u32 _CommandAddress, u32 _Mode) File::IOFile CWII_IPC_HLE_Device_FileIO::OpenFile() { const char* open_mode = ""; - + switch (m_Mode) { case ISFS_OPEN_READ: open_mode = "rb"; break; - + case ISFS_OPEN_WRITE: case ISFS_OPEN_RW: open_mode = "r+b"; break; - + default: PanicAlertT("FileIO: Unknown open mode : 0x%02x", m_Mode); break; } - + return File::IOFile(m_filepath, open_mode); } bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) { u32 ReturnValue = FS_RESULT_FATAL; - const u32 SeekOffset = Memory::Read_U32(_CommandAddress + 0xC); - const u32 Mode = Memory::Read_U32(_CommandAddress + 0x10); + const s32 SeekPosition = Memory::Read_U32(_CommandAddress + 0xC); + const s32 Mode = Memory::Read_U32(_CommandAddress + 0x10); if (auto file = OpenFile()) { ReturnValue = FS_RESULT_FATAL; - const u64 fileSize = file.GetSize(); - INFO_LOG(WII_IPC_FILEIO, "FileIO: Seek Pos: 0x%08x, Mode: %i (%s, Length=0x%08llx)", SeekOffset, Mode, m_Name.c_str(), fileSize); - u64 wantedPos = 0; + const s32 fileSize = (s32) file.GetSize(); + INFO_LOG(WII_IPC_FILEIO, "FileIO: Seek Pos: 0x%08x, Mode: %i (%s, Length=0x%08x)", SeekPosition, Mode, m_Name.c_str(), fileSize); + switch (Mode) { - case 0: - wantedPos = SeekOffset; - break; - - case 1: - wantedPos = m_SeekPos + SeekOffset; - break; - - case 2: - wantedPos = fileSize + (s32)SeekOffset; - break; - - default: - PanicAlert("CWII_IPC_HLE_Device_FileIO Unsupported seek mode %i", Mode); - ReturnValue = FS_RESULT_FATAL; - break; - } - - if (wantedPos <= fileSize) - { - m_SeekPos = wantedPos; - ReturnValue = m_SeekPos; + case 0: + { + if ((SeekPosition >=0) && (SeekPosition <= fileSize)) + { + m_SeekPos = SeekPosition; + ReturnValue = m_SeekPos; + } + break; + } + case 1: + { + s32 wantedPos = SeekPosition+m_SeekPos; + if (wantedPos >=0 && wantedPos <= fileSize) + { + m_SeekPos = wantedPos; + ReturnValue = m_SeekPos; + } + break; + } + case 2: + { + s32 wantedPos = fileSize+m_SeekPos; + if (wantedPos >=0 && wantedPos <= fileSize) + { + m_SeekPos = wantedPos; + ReturnValue = m_SeekPos; + } + break; + } + default: + { + PanicAlert("CWII_IPC_HLE_Device_FileIO Unsupported seek mode %i", Mode); + ReturnValue = FS_RESULT_FATAL; + break; + } } } else { - // TODO: This can't be right. ReturnValue = FS_FILE_NOT_EXIST; } Memory::Write_U32(ReturnValue, _CommandAddress + 0x4); @@ -162,8 +207,8 @@ bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) return true; } -bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) -{ +bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) +{ u32 ReturnValue = FS_EACCESS; const u32 Address = Memory::Read_U32(_CommandAddress + 0xC); // Read to this memory address const u32 Size = Memory::Read_U32(_CommandAddress + 0x10); @@ -188,12 +233,12 @@ bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) { m_SeekPos += Size; } - + } } else { - ERROR_LOG(WII_IPC_FILEIO, "FileIO: Failed to read from %s (Addr=0x%08x Size=0x%x) - file could not be opened or does not exist", m_Name.c_str(), Address, Size); + ERROR_LOG(WII_IPC_FILEIO, "FileIO: Failed to read from %s (Addr=0x%08x Size=0x%x) - file could not be opened or does not exist", m_Name.c_str(), Address, Size); ReturnValue = FS_FILE_NOT_EXIST; } @@ -201,8 +246,8 @@ bool CWII_IPC_HLE_Device_FileIO::Read(u32 _CommandAddress) return true; } -bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) -{ +bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) +{ u32 ReturnValue = FS_EACCESS; const u32 Address = Memory::Read_U32(_CommandAddress + 0xC); // Write data from this memory address const u32 Size = Memory::Read_U32(_CommandAddress + 0x10); @@ -227,7 +272,7 @@ bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) } else { - ERROR_LOG(WII_IPC_FILEIO, "FileIO: Failed to read from %s (Addr=0x%08x Size=0x%x) - file could not be opened or does not exist", m_Name.c_str(), Address, Size); + ERROR_LOG(WII_IPC_FILEIO, "FileIO: Failed to read from %s (Addr=0x%08x Size=0x%x) - file could not be opened or does not exist", m_Name.c_str(), Address, Size); ReturnValue = FS_FILE_NOT_EXIST; } @@ -235,13 +280,13 @@ bool CWII_IPC_HLE_Device_FileIO::Write(u32 _CommandAddress) return true; } -bool CWII_IPC_HLE_Device_FileIO::IOCtl(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_FileIO::IOCtl(u32 _CommandAddress) { INFO_LOG(WII_IPC_FILEIO, "FileIO: IOCtl (Device=%s)", m_Name.c_str()); #if defined(_DEBUG) || defined(DEBUGFAST) DumpCommands(_CommandAddress); #endif - const u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC); + const u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC); u32 ReturnValue = 0; switch (Parameter) @@ -253,7 +298,6 @@ bool CWII_IPC_HLE_Device_FileIO::IOCtl(u32 _CommandAddress) u32 m_FileLength = (u32)file.GetSize(); const u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); - INFO_LOG(WII_IPC_FILEIO, "FileIO: ISFS_IOCTL_GETFILESTATS"); INFO_LOG(WII_IPC_FILEIO, " File: %s, Length: %i, Pos: %i", m_Name.c_str(), m_FileLength, m_SeekPos); Memory::Write_U32(m_FileLength, BufferOut); @@ -285,6 +329,6 @@ void CWII_IPC_HLE_Device_FileIO::DoState(PointerWrap &p) p.Do(m_Mode); p.Do(m_SeekPos); - + m_filepath = HLE_IPC_BuildFilename(m_Name, 64); } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h index 0cbfb70022..65dd0ce50c 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.h @@ -9,6 +9,7 @@ #include "FileUtil.h" std::string HLE_IPC_BuildFilename(std::string _pFilename, int _size); +void HLE_IPC_CreateVirtualFATFilesystem(); class CWII_IPC_HLE_Device_FileIO : public IWII_IPC_HLE_Device { @@ -63,7 +64,7 @@ private: u32 m_Mode; u32 m_SeekPos; - + std::string m_filepath; }; diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp index 3514f45ebd..ea4230f485 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp @@ -13,7 +13,7 @@ 0x20 GetTitleID (ES_GetTitleID) (Input: none, Output: 8 bytes) 0x1d GetDataDir (ES_GetDataDir) (Input: 8 bytes, Output: 30 bytes) - 0x1b DiGetTicketView (Input: none, Output: 216 bytes) + 0x1b DiGetTicketView (Input: none, Output: 216 bytes) 0x16 GetConsumption (Input: 8 bytes, Output: 0 bytes, 4 bytes) // there are two output buffers 0x12 GetNumTicketViews (ES_GetNumTicketViews) (Input: 8 bytes, Output: 4 bytes) @@ -23,22 +23,27 @@ but only the first two are correctly supported. For the other four we ignore any potential input and only write zero to the out buffer. However, most games only use first two, but some Nintendo developed games use the other ones to: - + 0x1b: Mario Galaxy, Mario Kart, SSBB 0x16: Mario Galaxy, Mario Kart, SSBB 0x12: Mario Kart 0x14: Mario Kart: But only if we don't return a zeroed out buffer for the 0x12 question, and instead answer for example 1 will this question appear. - + */ // ============= #include "WII_IPC_HLE_Device_es.h" +// need to include this before polarssl/aes.h, +// otherwise we may not get __STDC_FORMAT_MACROS +#include + #include "../PowerPC/PowerPC.h" #include "../VolumeHandler.h" #include "FileUtil.h" -#include "Crypto/aes.h" +#include +#include "ConfigManager.h" #include "../Boot/Boot_DOL.h" #include "NandPaths.h" @@ -47,28 +52,50 @@ #include "../Movie.h" #include "StringUtil.h" +#include "ec_wii.h" + #ifdef _WIN32 #include #endif std::string CWII_IPC_HLE_Device_es::m_ContentFile; -CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& _rDeviceName) +CWII_IPC_HLE_Device_es::CWII_IPC_HLE_Device_es(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) , m_pContentLoader(NULL) , m_TitleID(-1) - , AccessIdentID(0x6000000) -{} + , m_AccessIdentID(0x6000000) +{ +} + +static u8 key_sd [0x10] = {0xab, 0x01, 0xb9, 0xd8, 0xe1, 0x62, 0x2b, 0x08, 0xaf, 0xba, 0xd8, 0x4d, 0xbf, 0xc2, 0xa5, 0x5d}; +static u8 key_ecc [0x1e] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; +static u8 key_empty[0x10] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +// default key table +u8* CWII_IPC_HLE_Device_es::keyTable[11] = { + key_ecc, // ECC Private Key + key_empty, // Console ID + key_empty, // NAND AES Key + key_empty, // NAND HMAC + key_empty, // Common Key + key_empty, // PRNG seed + key_sd, // SD Key + key_empty, // Unknown + key_empty, // Unknown + key_empty, // Unknown + key_empty, // Unknown +}; CWII_IPC_HLE_Device_es::~CWII_IPC_HLE_Device_es() {} -void CWII_IPC_HLE_Device_es::LoadWAD(const std::string& _rContentFile) +void CWII_IPC_HLE_Device_es::LoadWAD(const std::string& _rContentFile) { m_ContentFile = _rContentFile; } -bool CWII_IPC_HLE_Device_es::Open(u32 _CommandAddress, u32 _Mode) +void CWII_IPC_HLE_Device_es::OpenInternal() { m_pContentLoader = &DiscIO::CNANDContentManager::Access().GetNANDLoader(m_ContentFile); @@ -96,6 +123,57 @@ bool CWII_IPC_HLE_Device_es::Open(u32 _CommandAddress, u32 _Mode) } INFO_LOG(WII_IPC_ES, "Set default title to %08x/%08x", (u32)(m_TitleID>>32), (u32)m_TitleID); +} + +void CWII_IPC_HLE_Device_es::DoState(PointerWrap& p) +{ + IWII_IPC_HLE_Device::DoState(p); + p.Do(m_ContentFile); + OpenInternal(); + p.Do(m_AccessIdentID); + p.Do(m_TitleIDs); + + u32 Count = (u32)(m_ContentAccessMap.size()); + p.Do(Count); + + u32 CFD, Position; + u64 TitleID; + u16 Index; + if (p.GetMode() == PointerWrap::MODE_READ) + { + for (u32 i = 0; i < Count; i++) + { + p.Do(CFD); + p.Do(Position); + p.Do(TitleID); + p.Do(Index); + CFD = OpenTitleContent(CFD, TitleID, Index); + if (CFD != 0xffffffff) + { + m_ContentAccessMap[CFD].m_Position = Position; + } + } + } + else + { + for (auto& pair : m_ContentAccessMap) + { + CFD = pair.first; + SContentAccess& Access = pair.second; + Position = Access.m_Position; + TitleID = Access.m_TitleID; + Index = Access.m_pContent->m_Index; + p.Do(CFD); + p.Do(Position); + p.Do(TitleID); + p.Do(Index); + } + } +} + +bool CWII_IPC_HLE_Device_es::Open(u32 _CommandAddress, u32 _Mode) +{ + OpenInternal(); Memory::Write_U32(GetDeviceID(), _CommandAddress+4); if (m_Active) @@ -108,11 +186,15 @@ bool CWII_IPC_HLE_Device_es::Close(u32 _CommandAddress, bool _bForce) { // Leave deletion of the INANDContentLoader objects to CNANDContentManager, don't do it here! m_NANDContent.clear(); + for (auto& pair : m_ContentAccessMap) + { + delete pair.second.m_pFile; + } m_ContentAccessMap.clear(); m_pContentLoader = NULL; m_TitleIDs.clear(); m_TitleID = -1; - AccessIdentID = 0x6000000; + m_AccessIdentID = 0x6000000; INFO_LOG(WII_IPC_ES, "ES: Close"); if (!_bForce) @@ -121,7 +203,47 @@ bool CWII_IPC_HLE_Device_es::Close(u32 _CommandAddress, bool _bForce) return true; } -bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) +u32 CWII_IPC_HLE_Device_es::OpenTitleContent(u32 CFD, u64 TitleID, u16 Index) +{ + const DiscIO::INANDContentLoader& Loader = AccessContentDevice(TitleID); + + if (!Loader.IsValid()) + { + WARN_LOG(WII_IPC_ES, "ES: loader not valid for %" PRIx64, TitleID); + return 0xffffffff; + } + + const DiscIO::SNANDContent* pContent = Loader.GetContentByIndex(Index); + + if (pContent == NULL) + { + return 0xffffffff; //TODO: what is the correct error value here? + } + + SContentAccess Access; + Access.m_Position = 0; + Access.m_pContent = pContent; + Access.m_TitleID = TitleID; + Access.m_pFile = NULL; + + if (!pContent->m_pData) + { + std::string Filename = pContent->m_Filename; + INFO_LOG(WII_IPC_ES, "ES: load %s", Filename.c_str()); + + Access.m_pFile = new File::IOFile(Filename, "rb"); + if (!Access.m_pFile->IsGood()) + { + WARN_LOG(WII_IPC_ES, "ES: couldn't load %s", Filename.c_str()); + return 0xffffffff; + } + } + + m_ContentAccessMap[CFD] = Access; + return CFD; +} + +bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) { SIOCtlVBuffer Buffer(_CommandAddress); @@ -129,36 +251,34 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) // Prepare the out buffer(s) with zeroes as a safety precaution // to avoid returning bad values + // XXX: is this still necessary? for (u32 i = 0; i < Buffer.NumberPayloadBuffer; i++) { - Memory::Memset(Buffer.PayloadBuffer[i].m_Address, 0, - Buffer.PayloadBuffer[i].m_Size); + u32 j; + for (j = 0; j < Buffer.NumberInBuffer; j++) + { + if (Buffer.InBuffer[j].m_Address == Buffer.PayloadBuffer[i].m_Address) + { + // The out buffer is the same as one of the in buffers. Don't zero it. + break; + } + } + if (j == Buffer.NumberInBuffer) + { + Memory::Memset(Buffer.PayloadBuffer[i].m_Address, 0, + Buffer.PayloadBuffer[i].m_Size); + } } - // Uhh just put this here for now - u8 keyTable[11][16] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // ECC Private Key - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Console ID - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // NAND AES Key - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // NAND HMAC - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Common Key - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // PRNG seed - {0xab, 0x01, 0xb9, 0xd8, 0xe1, 0x62, 0x2b, 0x08, 0xaf, 0xba, 0xd8, 0x4d, 0xbf, 0xc2, 0xa5, 0x5d,}, // SD Key - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Unknown - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Unknown - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Unknown - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}, // Unknown - }; - switch (Buffer.Parameter) { case IOCTL_ES_GETDEVICEID: { _dbg_assert_msg_(WII_IPC_ES, Buffer.NumberPayloadBuffer == 1, "IOCTL_ES_GETDEVICEID no out buffer"); - INFO_LOG(WII_IPC_ES, "IOCTL_ES_GETDEVICEID"); - // Return arbitrary device ID - TODO allow user to set value? - Memory::Write_U32(0x31337f11, Buffer.PayloadBuffer[0].m_Address); + EcWii &ec = EcWii::GetInstance(); + INFO_LOG(WII_IPC_ES, "IOCTL_ES_GETDEVICEID %08X", ec.getNgId()); + Memory::Write_U32(ec.getNgId(), Buffer.PayloadBuffer[0].m_Address); Memory::Write_U32(0, _CommandAddress + 0x4); return true; } @@ -187,7 +307,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) else Memory::Write_U32((u32)rNANDContent.GetContentSize(), _CommandAddress + 0x4); - INFO_LOG(WII_IPC_ES, "IOCTL_ES_GETTITLECONTENTSCNT: TitleID: %08x/%08x content count %i", + INFO_LOG(WII_IPC_ES, "IOCTL_ES_GETTITLECONTENTSCNT: TitleID: %08x/%08x content count %i", (u32)(TitleID>>32), (u32)TitleID, rNANDContent.IsValid() ? NumberOfPrivateContent : (u32)rNANDContent.GetContentSize()); return true; @@ -234,16 +354,11 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u64 TitleID = Memory::Read_U64(Buffer.InBuffer[0].m_Address); u32 Index = Memory::Read_U32(Buffer.InBuffer[2].m_Address); - u32 CFD = AccessIdentID++; - m_ContentAccessMap[CFD].m_Position = 0; - m_ContentAccessMap[CFD].m_pContent = AccessContentDevice(TitleID).GetContentByIndex(Index); - _dbg_assert_msg_(WII_IPC_ES, m_ContentAccessMap[CFD].m_pContent != NULL, "No Content for TitleID: %08x/%08x at Index %x", (u32)(TitleID>>32), (u32)TitleID, Index); - // Fix for DLC by itsnotmailmail - if (m_ContentAccessMap[CFD].m_pContent == NULL) - CFD = 0xffffffff; //TODO: what is the correct error value here? + u32 CFD = OpenTitleContent(m_AccessIdentID++, TitleID, Index); Memory::Write_U32(CFD, _CommandAddress + 0x4); INFO_LOG(WII_IPC_ES, "IOCTL_ES_OPENTITLECONTENT: TitleID: %08x/%08x Index %i -> got CFD %x", (u32)(TitleID>>32), (u32)TitleID, Index, CFD); + return true; } break; @@ -252,19 +367,12 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) { _dbg_assert_(WII_IPC_ES, Buffer.NumberInBuffer == 1); _dbg_assert_(WII_IPC_ES, Buffer.NumberPayloadBuffer == 0); - - u32 CFD = AccessIdentID++; u32 Index = Memory::Read_U32(Buffer.InBuffer[0].m_Address); - m_ContentAccessMap[CFD].m_Position = 0; - m_ContentAccessMap[CFD].m_pContent = AccessContentDevice(m_TitleID).GetContentByIndex(Index); - - if (m_ContentAccessMap[CFD].m_pContent == NULL) - CFD = 0xffffffff; //TODO: what is the correct error value here? - + u32 CFD = OpenTitleContent(m_AccessIdentID++, m_TitleID, Index); Memory::Write_U32(CFD, _CommandAddress + 0x4); - INFO_LOG(WII_IPC_ES, "IOCTL_ES_OPENCONTENT: Index %i -> got CFD %x", Index, CFD); + return true; } break; @@ -278,23 +386,45 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 Size = Buffer.PayloadBuffer[0].m_Size; u32 Addr = Buffer.PayloadBuffer[0].m_Address; - _dbg_assert_(WII_IPC_ES, m_ContentAccessMap.find(CFD) != m_ContentAccessMap.end()); - SContentAccess& rContent = m_ContentAccessMap[CFD]; + auto itr = m_ContentAccessMap.find(CFD); + if (itr == m_ContentAccessMap.end()) + { + Memory::Write_U32(-1, _CommandAddress + 0x4); + return true; + } + SContentAccess& rContent = itr->second; _dbg_assert_(WII_IPC_ES, rContent.m_pContent->m_pData != NULL); - u8* pSrc = &rContent.m_pContent->m_pData[rContent.m_Position]; u8* pDest = Memory::GetPointer(Addr); - if (rContent.m_Position + Size > rContent.m_pContent->m_Size) + if (rContent.m_Position + Size > rContent.m_pContent->m_Size) { Size = rContent.m_pContent->m_Size-rContent.m_Position; } if (Size > 0) { - if (pDest) { - memcpy(pDest, pSrc, Size); + if (pDest) + { + if (rContent.m_pContent->m_pData) + { + u8* pSrc = &rContent.m_pContent->m_pData[rContent.m_Position]; + memcpy(pDest, pSrc, Size); + } + else + { + auto& pFile = rContent.m_pFile; + if (!pFile->Seek(rContent.m_Position, SEEK_SET)) + { + ERROR_LOG(WII_IPC_ES, "ES: couldn't seek!"); + } + WARN_LOG(WII_IPC_ES, "2 %p", pFile->GetHandle()); + if (!pFile->ReadBytes(pDest, Size)) + { + ERROR_LOG(WII_IPC_ES, "ES: short read; returning uninitialized data!"); + } + } rContent.m_Position += Size; } else { PanicAlertT("IOCTL_ES_READCONTENT - bad destination"); @@ -315,11 +445,18 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 CFD = Memory::Read_U32(Buffer.InBuffer[0].m_Address); - CContentAccessMap::iterator itr = m_ContentAccessMap.find(CFD); - m_ContentAccessMap.erase(itr); - INFO_LOG(WII_IPC_ES, "IOCTL_ES_CLOSECONTENT: CFD %x", CFD); + auto itr = m_ContentAccessMap.find(CFD); + if (itr == m_ContentAccessMap.end()) + { + Memory::Write_U32(-1, _CommandAddress + 0x4); + return true; + } + + delete itr->second.m_pFile; + m_ContentAccessMap.erase(itr); + Memory::Write_U32(0, _CommandAddress + 0x4); return true; } @@ -334,8 +471,13 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 Addr = Memory::Read_U32(Buffer.InBuffer[1].m_Address); u32 Mode = Memory::Read_U32(Buffer.InBuffer[2].m_Address); - _dbg_assert_(WII_IPC_ES, m_ContentAccessMap.find(CFD) != m_ContentAccessMap.end()); - SContentAccess& rContent = m_ContentAccessMap[CFD]; + auto itr = m_ContentAccessMap.find(CFD); + if (itr == m_ContentAccessMap.end()) + { + Memory::Write_U32(-1, _CommandAddress + 0x4); + return true; + } + SContentAccess& rContent = itr->second; switch (Mode) { @@ -386,7 +528,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) case IOCTL_ES_SETUID: { _dbg_assert_msg_(WII_IPC_ES, Buffer.NumberInBuffer == 1, "IOCTL_ES_SETUID no in buffer"); - _dbg_assert_(WII_IPC_ES, Buffer.NumberPayloadBuffer == 0); + _dbg_assert_msg_(WII_IPC_ES, Buffer.NumberPayloadBuffer == 0, "IOCTL_ES_SETUID has a payload, it shouldn't"); // TODO: fs permissions based on this u64 TitleID = Memory::Read_U64(Buffer.InBuffer[0].m_Address); INFO_LOG(WII_IPC_ES, "IOCTL_ES_SETUID titleID: %08x/%08x", (u32)(TitleID>>32), (u32)TitleID); @@ -452,17 +594,22 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) { u32 FileSize = (u32)File::GetSize(TicketFilename); _dbg_assert_msg_(WII_IPC_ES, (FileSize % DiscIO::INANDContentLoader::TICKET_SIZE) == 0, "IOCTL_ES_GETVIEWCNT ticket file size seems to be wrong"); - + ViewCount = FileSize / DiscIO::INANDContentLoader::TICKET_SIZE; _dbg_assert_msg_(WII_IPC_ES, (ViewCount>0) && (ViewCount<=4), "IOCTL_ES_GETVIEWCNT ticket count seems to be wrong"); } + else if (TitleID >> 32 == 0x00000001) + { + // Fake a ticket view to make IOS reload work. + ViewCount = 1; + } else { + ViewCount = 0; if (TitleID == TITLEID_SYSMENU) { PanicAlertT("There must be a ticket for 00000001/00000002. Your NAND dump is probably incomplete."); } - ViewCount = 0; //retVal = ES_NO_TICKET_INSTALLED; } } @@ -485,7 +632,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 retVal = 0; const DiscIO::INANDContentLoader& Loader = AccessContentDevice(TitleID); - + const u8 *Ticket = Loader.GetTIK(); if (Ticket) { @@ -513,6 +660,19 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) } } } + else if (TitleID >> 32 == 0x00000001) + { + // For IOS titles, the ticket view isn't normally parsed by either the + // SDK or libogc, just passed to LaunchTitle, so this + // shouldn't matter at all. Just fill out some fields just + // to be on the safe side. + u32 Address = Buffer.PayloadBuffer[0].m_Address; + memset(Memory::GetPointer(Address), 0, 0xD8); + Memory::Write_U64(TitleID, Address + 4 + (0x1dc - 0x1d0)); // title ID + Memory::Write_U16(0xffff, Address + 4 + (0x1e4 - 0x1d0)); // unnnown + Memory::Write_U32(0xff00, Address + 4 + (0x1ec - 0x1d0)); // access mask + memset(Memory::GetPointer(Address + 4 + (0x222 - 0x1d0)), 0xff, 0x20); // content permissions + } else { //retVal = ES_NO_TICKET_INSTALLED; @@ -538,7 +698,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 TMDViewCnt = 0; if (Loader.IsValid()) { - TMDViewCnt += DiscIO::INANDContentLoader::TMD_VIEW_SIZE; + TMDViewCnt += DiscIO::INANDContentLoader::TMD_VIEW_SIZE; TMDViewCnt += 2; // title version TMDViewCnt += 2; // num entries TMDViewCnt += (u32)Loader.GetContentSize() * (4+2+2+8); // content id, index, type, size @@ -626,8 +786,9 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) // Presumably return -1017 when title not installed TODO verify Memory::Write_U32(ES_PARAMTER_SIZE_OR_ALIGNMENT, _CommandAddress + 0x4); } - - } + + } + break; case IOCTL_ES_GETSTOREDTMDSIZE: { _dbg_assert_msg_(WII_IPC_ES, Buffer.NumberInBuffer == 1, "IOCTL_ES_GETSTOREDTMDSIZE no in buffer"); @@ -641,7 +802,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) if (Loader.IsValid()) { TMDCnt += DiscIO::INANDContentLoader::TMD_HEADER_SIZE; - TMDCnt += (u32)Loader.GetContentSize() * DiscIO::INANDContentLoader::CONTENT_HEADER_SIZE; + TMDCnt += (u32)Loader.GetContentSize() * DiscIO::INANDContentLoader::CONTENT_HEADER_SIZE; } if(Buffer.NumberPayloadBuffer) Memory::Write_U32(TMDCnt, Buffer.PayloadBuffer[0].m_Address); @@ -663,7 +824,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) u32 MaxCount = 0; if (Buffer.NumberInBuffer > 1) { - // TODO: actually use this param in when writing to the outbuffer :/ + // TODO: actually use this param in when writing to the outbuffer :/ MaxCount = Memory::Read_U32(Buffer.InBuffer[1].m_Address); } const DiscIO::INANDContentLoader& Loader = AccessContentDevice(TitleID); @@ -681,7 +842,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) const std::vector& rContent = Loader.GetContent(); for (size_t i=0; im_pData, pContent->m_Size); - DolLoader.Load(); // TODO: Check why sysmenu does not load the DOL correctly - PC = DolLoader.GetEntryPoint() | 0x80000000; + std::unique_ptr pDolLoader; + if (pContent->m_pData) + { + pDolLoader.reset(new CDolLoader(pContent->m_pData, pContent->m_Size)); + } + else + { + pDolLoader.reset(new CDolLoader(pContent->m_Filename.c_str())); + } + pDolLoader->Load(); // TODO: Check why sysmenu does not load the DOL correctly + PC = pDolLoader->GetEntryPoint() | 0x80000000; IOSv = ContentLoader.GetIosVersion(); bSuccess = true; - } } } @@ -767,11 +939,12 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) // Lie to mem about loading a different IOS // someone with an affected game should test IOSv = TitleID & 0xffff; + bSuccess = true; } - if (!bSuccess && IOSv >= 30 && IOSv != 0xffff) + if (!bSuccess) { - PanicAlertT("IOCTL_ES_LAUNCH: Game tried to reload an IOS or a title that is not available in your NAND dump\n" - "TitleID %016llx.\n Dolphin will likely hang now.", TitleID); + PanicAlertT("IOCTL_ES_LAUNCH: Game tried to reload a title that is not available in your NAND dump\n" + "TitleID %016" PRIx64".\n Dolphin will likely hang now.", TitleID); } else { @@ -780,9 +953,9 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) bool* wiiMoteConnected = new bool[size]; for (unsigned int i = 0; i < size; i++) wiiMoteConnected[i] = s_Usb->m_WiiMotes[i].IsConnected(); - + std::string tContentFile(m_ContentFile.c_str()); - + WII_IPC_HLE_Interface::Reset(true); WII_IPC_HLE_Interface::Init(); s_Usb = GetUsbPointer(); @@ -798,7 +971,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) s_Usb->m_WiiMotes[i].Activate(false); } } - + delete[] wiiMoteConnected; WII_IPC_HLE_Interface::SetDefaultContentFile(tContentFile); } @@ -810,25 +983,24 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) Memory::Write_U16(IOSv, 0x00003140); Memory::Write_U16(0xFFFF, 0x00003142); Memory::Write_U32(Memory::Read_U32(0x00003140), 0x00003188); - + //TODO: provide correct return code when bSuccess= false Memory::Write_U32(0, _CommandAddress + 0x4); - ERROR_LOG(WII_IPC_ES, "IOCTL_ES_LAUNCH %016llx %08x %016llx %08x %016llx %04x", TitleID,view,ticketid,devicetype,titleid,access); + ERROR_LOG(WII_IPC_ES, "IOCTL_ES_LAUNCH %016" PRIx64 " %08x %016" PRIx64 " %08x %016" PRIx64 " %04x", TitleID,view,ticketid,devicetype,titleid,access); // IOCTL_ES_LAUNCH 0001000248414341 00000001 0001c0fef3df2cfa 00000000 0001000248414341 ffff - //We have to handle the reply ourselves as this handle is not valid anymore - - + // This is necessary because Reset(true) above deleted this object. Ew. + // It seems that the original hardware overwrites the command after it has been - // executed. We write 8 which is not any valid command, and what IOS does + // executed. We write 8 which is not any valid command, and what IOS does Memory::Write_U32(8, _CommandAddress); // IOS seems to write back the command that was responded to - Memory::Write_U32(6, _CommandAddress + 8); - + Memory::Write_U32(7, _CommandAddress + 8); + // Generate a reply to the IPC command WII_IPC_HLE_Interface::EnqReply(_CommandAddress, 0); - + return false; } break; @@ -840,20 +1012,52 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) Memory::Write_U32(ES_PARAMTER_SIZE_OR_ALIGNMENT , _CommandAddress + 0x4); return true; + case IOCTL_ES_GETDEVICECERT: // (Input: none, Output: 384 bytes) + { + WARN_LOG(WII_IPC_ES, "IOCTL_ES_GETDEVICECERT"); + _dbg_assert_(WII_IPC_ES, Buffer.NumberPayloadBuffer == 1); + u8* destination = Memory::GetPointer(Buffer.PayloadBuffer[0].m_Address); + + EcWii &ec = EcWii::GetInstance(); + get_ng_cert(destination, ec.getNgId(), ec.getNgKeyId(), ec.getNgPriv(), ec.getNgSig()); + } + break; + + case IOCTL_ES_SIGN: + { + WARN_LOG(WII_IPC_ES, "IOCTL_ES_SIGN"); + u8 *ap_cert_out = Memory::GetPointer(Buffer.PayloadBuffer[1].m_Address); + u8 *data = Memory::GetPointer(Buffer.InBuffer[0].m_Address); + u32 data_size = Buffer.InBuffer[0].m_Size; + u8 *sig_out = Memory::GetPointer(Buffer.PayloadBuffer[0].m_Address); + + EcWii &ec = EcWii::GetInstance(); + get_ap_sig_and_cert(sig_out, ap_cert_out, m_TitleID, data, data_size, ec.getNgPriv(), ec.getNgId()); + } + break; + + case IOCTL_ES_GETBOOT2VERSION: + { + WARN_LOG(WII_IPC_ES, "IOCTL_ES_GETBOOT2VERSION"); + + Memory::Write_U32(4, Buffer.PayloadBuffer[0].m_Address); // as of 26/02/2012, this was latest bootmii version + } + break; + // =============================================================================================== - // unsupported functions + // unsupported functions // =============================================================================================== - case IOCTL_ES_DIGETTICKETVIEW: // (Input: none, Output: 216 bytes) bug crediar :D + case IOCTL_ES_DIGETTICKETVIEW: // (Input: none, Output: 216 bytes) bug crediar :D WARN_LOG(WII_IPC_ES, "IOCTL_ES_DIGETTICKETVIEW: this looks really wrong..."); break; - case IOCTL_ES_GETDEVICECERT: // (Input: none, Output: 384 bytes) - WARN_LOG(WII_IPC_ES, "IOCTL_ES_GETDEVICECERT: this looks really wrong..."); + case IOCTL_ES_GETOWNEDTITLECNT: + WARN_LOG(WII_IPC_ES, "IOCTL_ES_GETOWNEDTITLECNT"); + Memory::Write_U32(0, Buffer.PayloadBuffer[0].m_Address); break; default: WARN_LOG(WII_IPC_ES, "CWII_IPC_HLE_Device_es: 0x%x", Buffer.Parameter); - DumpCommands(_CommandAddress, 8, LogTypes::WII_IPC_ES); INFO_LOG(WII_IPC_ES, "command.Parameter: 0x%08x", Buffer.Parameter); break; @@ -868,7 +1072,7 @@ bool CWII_IPC_HLE_Device_es::IOCtlV(u32 _CommandAddress) const DiscIO::INANDContentLoader& CWII_IPC_HLE_Device_es::AccessContentDevice(u64 _TitleID) { if (m_pContentLoader->IsValid() && m_pContentLoader->GetTitleID() == _TitleID) - return* m_pContentLoader; + return *m_pContentLoader; CTitleToContentMap::iterator itr = m_NANDContent.find(_TitleID); if (itr != m_NANDContent.end()) @@ -916,12 +1120,12 @@ u32 CWII_IPC_HLE_Device_es::ES_DIVerify(u8* _pTMD, u32 _sz) // TODO: Force the game to save to another location, instead of moving the user's save. if (Movie::IsPlayingInput() && Movie::IsConfigSaved() && Movie::IsStartingFromClearSave()) - { + { if (File::Exists((savePath + "banner.bin").c_str())) { if (File::Exists((savePath + "../backup/").c_str())) { - // The last run of this game must have been to play back a movie, so their save is already backed up. + // The last run of this game must have been to play back a movie, so their save is already backed up. File::DeleteDirRecursively(savePath.c_str()); } else diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.h index d6603f0b9d..5dd4bd1ceb 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.h @@ -8,6 +8,7 @@ #include #include "WII_IPC_HLE_Device.h" #include "NANDContentLoader.h" +#include class CWII_IPC_HLE_Device_es : public IWII_IPC_HLE_Device { @@ -19,6 +20,10 @@ public: void LoadWAD(const std::string& _rContentFile); + void OpenInternal(); + + virtual void DoState(PointerWrap& p); + virtual bool Open(u32 _CommandAddress, u32 _Mode); virtual bool Close(u32 _CommandAddress, bool _bForce); @@ -28,89 +33,93 @@ public: // This should only be cleared on power reset static std::string m_ContentFile; -private: +private: enum { - IOCTL_ES_ADDTICKET = 0x01, - IOCTL_ES_ADDTITLESTART = 0x02, - IOCTL_ES_ADDCONTENTSTART = 0x03, - IOCTL_ES_ADDCONTENTDATA = 0x04, - IOCTL_ES_ADDCONTENTFINISH = 0x05, - IOCTL_ES_ADDTITLEFINISH = 0x06, - IOCTL_ES_GETDEVICEID = 0x07, - IOCTL_ES_LAUNCH = 0x08, - IOCTL_ES_OPENCONTENT = 0x09, - IOCTL_ES_READCONTENT = 0x0A, - IOCTL_ES_CLOSECONTENT = 0x0B, - IOCTL_ES_GETOWNEDTITLECNT = 0x0C, - IOCTL_ES_GETOWNEDTITLES = 0x0D, - IOCTL_ES_GETTITLECNT = 0x0E, - IOCTL_ES_GETTITLES = 0x0F, - IOCTL_ES_GETTITLECONTENTSCNT = 0x10, - IOCTL_ES_GETTITLECONTENTS = 0x11, - IOCTL_ES_GETVIEWCNT = 0x12, - IOCTL_ES_GETVIEWS = 0x13, - IOCTL_ES_GETTMDVIEWCNT = 0x14, - IOCTL_ES_GETTMDVIEWS = 0x15, - IOCTL_ES_GETCONSUMPTION = 0x16, - IOCTL_ES_DELETETITLE = 0x17, - IOCTL_ES_DELETETICKET = 0x18, - // IOCTL_ES_DIGETTMDVIEWSIZE = 0x19, - // IOCTL_ES_DIGETTMDVIEW = 0x1A, - IOCTL_ES_DIGETTICKETVIEW = 0x1B, - IOCTL_ES_DIVERIFY = 0x1C, - IOCTL_ES_GETTITLEDIR = 0x1D, - IOCTL_ES_GETDEVICECERT = 0x1E, - IOCTL_ES_IMPORTBOOT = 0x1F, - IOCTL_ES_GETTITLEID = 0x20, - IOCTL_ES_SETUID = 0x21, - IOCTL_ES_DELETETITLECONTENT = 0x22, - IOCTL_ES_SEEKCONTENT = 0x23, - IOCTL_ES_OPENTITLECONTENT = 0x24, - // IOCTL_ES_LAUNCHBC = 0x25, - // IOCTL_ES_EXPORTTITLEINIT = 0x26, - // IOCTL_ES_EXPORTCONTENTBEGIN = 0x27, - // IOCTL_ES_EXPORTCONTENTDATA = 0x28, - // IOCTL_ES_EXPORTCONTENTEND = 0x29, - // IOCTL_ES_EXPORTTITLEDONE = 0x2A, - IOCTL_ES_ADDTMD = 0x2B, - IOCTL_ES_ENCRYPT = 0x2C, - IOCTL_ES_DECRYPT = 0x2D, - IOCTL_ES_GETBOOT2VERSION = 0x2E, - IOCTL_ES_ADDTITLECANCEL = 0x2F, - IOCTL_ES_SIGN = 0x30, - // IOCTL_ES_VERIFYSIGN = 0x31, - IOCTL_ES_GETSTOREDCONTENTCNT = 0x32, - IOCTL_ES_GETSTOREDCONTENTS = 0x33, - IOCTL_ES_GETSTOREDTMDSIZE = 0x34, - IOCTL_ES_GETSTOREDTMD = 0x35, - IOCTL_ES_GETSHAREDCONTENTCNT = 0x36, - IOCTL_ES_GETSHAREDCONTENTS = 0x37, - IOCTL_ES_DELETESHAREDCONTENT = 0x38, - IOCTL_ES_CHECKKOREAREGION = 0x45, + IOCTL_ES_ADDTICKET = 0x01, + IOCTL_ES_ADDTITLESTART = 0x02, + IOCTL_ES_ADDCONTENTSTART = 0x03, + IOCTL_ES_ADDCONTENTDATA = 0x04, + IOCTL_ES_ADDCONTENTFINISH = 0x05, + IOCTL_ES_ADDTITLEFINISH = 0x06, + IOCTL_ES_GETDEVICEID = 0x07, + IOCTL_ES_LAUNCH = 0x08, + IOCTL_ES_OPENCONTENT = 0x09, + IOCTL_ES_READCONTENT = 0x0A, + IOCTL_ES_CLOSECONTENT = 0x0B, + IOCTL_ES_GETOWNEDTITLECNT = 0x0C, + IOCTL_ES_GETOWNEDTITLES = 0x0D, + IOCTL_ES_GETTITLECNT = 0x0E, + IOCTL_ES_GETTITLES = 0x0F, + IOCTL_ES_GETTITLECONTENTSCNT = 0x10, + IOCTL_ES_GETTITLECONTENTS = 0x11, + IOCTL_ES_GETVIEWCNT = 0x12, + IOCTL_ES_GETVIEWS = 0x13, + IOCTL_ES_GETTMDVIEWCNT = 0x14, + IOCTL_ES_GETTMDVIEWS = 0x15, + IOCTL_ES_GETCONSUMPTION = 0x16, + IOCTL_ES_DELETETITLE = 0x17, + IOCTL_ES_DELETETICKET = 0x18, + // IOCTL_ES_DIGETTMDVIEWSIZE = 0x19, + // IOCTL_ES_DIGETTMDVIEW = 0x1A, + IOCTL_ES_DIGETTICKETVIEW = 0x1B, + IOCTL_ES_DIVERIFY = 0x1C, + IOCTL_ES_GETTITLEDIR = 0x1D, + IOCTL_ES_GETDEVICECERT = 0x1E, + IOCTL_ES_IMPORTBOOT = 0x1F, + IOCTL_ES_GETTITLEID = 0x20, + IOCTL_ES_SETUID = 0x21, + IOCTL_ES_DELETETITLECONTENT = 0x22, + IOCTL_ES_SEEKCONTENT = 0x23, + IOCTL_ES_OPENTITLECONTENT = 0x24, + // IOCTL_ES_LAUNCHBC = 0x25, + // IOCTL_ES_EXPORTTITLEINIT = 0x26, + // IOCTL_ES_EXPORTCONTENTBEGIN = 0x27, + // IOCTL_ES_EXPORTCONTENTDATA = 0x28, + // IOCTL_ES_EXPORTCONTENTEND = 0x29, + // IOCTL_ES_EXPORTTITLEDONE = 0x2A, + IOCTL_ES_ADDTMD = 0x2B, + IOCTL_ES_ENCRYPT = 0x2C, + IOCTL_ES_DECRYPT = 0x2D, + IOCTL_ES_GETBOOT2VERSION = 0x2E, + IOCTL_ES_ADDTITLECANCEL = 0x2F, + IOCTL_ES_SIGN = 0x30, + // IOCTL_ES_VERIFYSIGN = 0x31, + IOCTL_ES_GETSTOREDCONTENTCNT = 0x32, + IOCTL_ES_GETSTOREDCONTENTS = 0x33, + IOCTL_ES_GETSTOREDTMDSIZE = 0x34, + IOCTL_ES_GETSTOREDTMD = 0x35, + IOCTL_ES_GETSHAREDCONTENTCNT = 0x36, + IOCTL_ES_GETSHAREDCONTENTS = 0x37, + IOCTL_ES_DELETESHAREDCONTENT = 0x38, + // + IOCTL_ES_CHECKKOREAREGION = 0x45, }; enum EErrorCodes { - ES_INVALID_TMD = -106, // or access denied - ES_READ_LESS_DATA_THAN_EXPECTED = -1009, - ES_UNK_1 = -1010, - ES_PARAMTER_SIZE_OR_ALIGNMENT = -1017, - ES_HASH_DOESNT_MATCH = -1022, - ES_MEM_ALLOC_FAILED = -1024, - ES_INCORRECT_ACCESS_RIGHT = -1026, - ES_NO_TICKET_INSTALLED = -1028, - ES_INSTALLED_TICKET_INVALID = -1029, - ES_INVALID_PARAMETR = -2008, - ES_SIGNATURE_CHECK_FAILED = -2011, - ES_HASH_SIZE_WRONG = -2014, // HASH !=20 + ES_INVALID_TMD = -106, // or access denied + ES_READ_LESS_DATA_THAN_EXPECTED = -1009, + ES_WRITE_FAILURE = -1010, + ES_PARAMTER_SIZE_OR_ALIGNMENT = -1017, + ES_HASH_DOESNT_MATCH = -1022, + ES_MEM_ALLOC_FAILED = -1024, + ES_INCORRECT_ACCESS_RIGHT = -1026, + ES_NO_TICKET_INSTALLED = -1028, + ES_INSTALLED_TICKET_INVALID = -1029, + ES_INVALID_PARAMETR = -2008, + ES_SIGNATURE_CHECK_FAILED = -2011, + ES_HASH_SIZE_WRONG = -2014, // HASH !=20 }; - struct SContentAccess + struct SContentAccess { u32 m_Position; + u64 m_TitleID; const DiscIO::SNANDContent* m_pContent; + // This is a (raw) pointer to work around a MSVC bug. + File::IOFile* m_pFile; }; typedef std::map CContentAccessMap; @@ -123,13 +132,29 @@ private: std::vector m_TitleIDs; u64 m_TitleID; - u32 AccessIdentID; + u32 m_AccessIdentID; + + static u8 *keyTable[11]; u64 GetCurrentTitleID() const; const DiscIO::INANDContentLoader& AccessContentDevice(u64 _TitleID); + u32 OpenTitleContent(u32 CFD, u64 TitleID, u16 Index); bool IsValid(u64 _TitleID) const; + + typedef struct ecc_cert_t + { + u32 sig_type ; + u8 sig [0x3c]; + u8 pad [0x40]; + u8 issuer [0x40]; + u32 key_type ; + u8 key_name [0x40]; + u32 ng_key_id ; + u8 ecc_pubkey [0x3c]; + u8 padding [0x3c]; + } ecc_cert_t; }; #endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp index 2e90d77740..4de7af8e06 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.cpp @@ -22,7 +22,7 @@ static Common::replace_v replacements; -CWII_IPC_HLE_Device_fs::CWII_IPC_HLE_Device_fs(u32 _DeviceID, const std::string& _rDeviceName) +CWII_IPC_HLE_Device_fs::CWII_IPC_HLE_Device_fs(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) { Common::ReadReplacements(replacements); @@ -60,9 +60,8 @@ static u64 ComputeTotalFileSize(const File::FSTEntry& parentEntry) { u64 sizeOfFiles = 0; const std::vector& children = parentEntry.children; - for (std::vector::const_iterator it = children.begin(); it != children.end(); ++it) + for (const auto& entry : children) { - const File::FSTEntry& entry = *it; if (entry.isDirectory) sizeOfFiles += ComputeTotalFileSize(entry); else @@ -71,11 +70,11 @@ static u64 ComputeTotalFileSize(const File::FSTEntry& parentEntry) return sizeOfFiles; } -bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) { u32 ReturnValue = FS_RESULT_OK; SIOCtlVBuffer CommandBuffer(_CommandAddress); - + // Prepare the out buffer(s) with zeros as a safety precaution // to avoid returning bad values for(u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; i++) @@ -174,7 +173,7 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) _dbg_assert_(WII_IPC_FILEIO, CommandBuffer.PayloadBuffer[0].m_Size == 4); _dbg_assert_(WII_IPC_FILEIO, CommandBuffer.PayloadBuffer[1].m_Size == 4); - // this command sucks because it asks of the number of used + // this command sucks because it asks of the number of used // fsBlocks and inodes // It should be correct, but don't count on it... const char *relativepath = (const char*)Memory::GetPointer(CommandBuffer.InBuffer[0].m_Address); @@ -230,11 +229,11 @@ bool CWII_IPC_HLE_Device_fs::IOCtlV(u32 _CommandAddress) Memory::Write_U32(ReturnValue, _CommandAddress+4); - return true; + return true; } -bool CWII_IPC_HLE_Device_fs::IOCtl(u32 _CommandAddress) -{ +bool CWII_IPC_HLE_Device_fs::IOCtl(u32 _CommandAddress) +{ //u32 DeviceID = Memory::Read_U32(_CommandAddress + 8); //LOG(WII_IPC_FILEIO, "FS: IOCtl (Device=%s, DeviceID=%08x)", GetDeviceName().c_str(), DeviceID); @@ -249,10 +248,10 @@ bool CWII_IPC_HLE_Device_fs::IOCtl(u32 _CommandAddress) //LOG(WII_IPC_FILEIO, "Cleared %u bytes of the out buffer", _BufferOutSize); Memory::Memset(BufferOut, 0, BufferOutSize); - u32 ReturnValue = ExecuteCommand(Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); + u32 ReturnValue = ExecuteCommand(Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); Memory::Write_U32(ReturnValue, _CommandAddress + 4); - return true; + return true; } s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize) @@ -307,7 +306,7 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B case IOCTL_SET_ATTR: { u32 Addr = _BufferIn; - + u32 OwnerID = Memory::Read_U32(Addr); Addr += 4; u16 GroupID = Memory::Read_U16(Addr); Addr += 2; std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn), 64); Addr += 64; @@ -329,17 +328,17 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B break; case IOCTL_GET_ATTR: - { + { _dbg_assert_msg_(WII_IPC_FILEIO, _BufferOutSize == 76, " GET_ATTR needs an 76 bytes large output buffer but it is %i bytes large", _BufferOutSize); u32 OwnerID = 0; - u16 GroupID = 0; + u16 GroupID = 0x3031; // this is also known as makercd, 01 (0x3031) for nintendo and 08 (0x3038) for MH3 etc std::string Filename = HLE_IPC_BuildFilename((const char*)Memory::GetPointer(_BufferIn), 64); u8 OwnerPerm = 0x3; // read/write u8 GroupPerm = 0x3; // read/write - u8 OtherPerm = 0x3; // read/write + u8 OtherPerm = 0x3; // read/write u8 Attributes = 0x00; // no attributes if (File::IsDirectory(Filename)) { @@ -477,7 +476,12 @@ s32 CWII_IPC_HLE_Device_fs::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _B return FS_RESULT_OK; } break; - + case IOCTL_SHUTDOWN: + { + INFO_LOG(WII_IPC_FILEIO, "Wii called Shutdown()"); + // TODO: stop emulation + } + break; default: ERROR_LOG(WII_IPC_FILEIO, "CWII_IPC_HLE_Device_fs::IOCtl: ni 0x%x", _Parameter); PanicAlert("CWII_IPC_HLE_Device_fs::IOCtl: ni 0x%x", _Parameter); @@ -567,7 +571,7 @@ void CWII_IPC_HLE_Device_fs::DoState(PointerWrap& p) } else { - u32 size = entry.size; + u32 size = (u32)entry.size; p.Do(size); File::IOFile handle(entry.physicalName, "rb"); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.h index 6a93c9f2f2..e02b187fee 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_fs.h @@ -43,7 +43,7 @@ public: virtual bool IOCtl(u32 _CommandAddress); virtual bool IOCtlV(u32 _CommandAddress); - + virtual int GetCmdDelay(u32); private: @@ -58,7 +58,8 @@ private: IOCTL_DELETE_FILE = 0x07, IOCTL_RENAME_FILE = 0x08, IOCTL_CREATE_FILE = 0x09, - IOCTLV_GETUSAGE = 0x0C + IOCTLV_GETUSAGE = 0x0C, + IOCTL_SHUTDOWN = 0x0D }; s32 ExecuteCommand(u32 Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp new file mode 100644 index 0000000000..c1b82e4d55 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp @@ -0,0 +1,635 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "../Core.h" +#include "../Debugger/Debugger_SymbolMap.h" +#include "../HW/WII_IPC.h" +#include "WII_IPC_HLE.h" +#include "WII_IPC_HLE_Device_hid.h" +#include "errno.h" + +#define MAX_DEVICE_DEVNUM 256 +static u64 hidDeviceAliases[MAX_DEVICE_DEVNUM]; + +// Regular thread +void CWII_IPC_HLE_Device_hid::checkUsbUpdates(CWII_IPC_HLE_Device_hid* hid) +{ + timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 500; + while (hid->usb_thread_running) + { + + static u16 timeToFill = 0; + if (timeToFill == 0) + { + std::lock_guard lk(hid->s_device_list_reply); + if (hid->deviceCommandAddress != 0){ + hid->FillOutDevices(Memory::Read_U32(hid->deviceCommandAddress + 0x18), Memory::Read_U32(hid->deviceCommandAddress + 0x1C)); + + Memory::Write_U32(8, hid->deviceCommandAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(/*COMMAND_IOCTL*/ 6, hid->deviceCommandAddress + 8); + + // Return value + Memory::Write_U32(0, hid->deviceCommandAddress + 4); + + WII_IPC_HLE_Interface::EnqueReplyCallback(hid->deviceCommandAddress); + hid->deviceCommandAddress = 0; + } + } + timeToFill+=8; + libusb_handle_events_timeout(NULL, &tv); + } + + return; +} + +void CWII_IPC_HLE_Device_hid::handleUsbUpdates(struct libusb_transfer *transfer) +{ + int ret = HIDERR_NO_DEVICE_FOUND; + u32 replyAddress = (u32)(size_t)transfer->user_data; + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) + { + ret = transfer->length; + } + + Memory::Write_U32(8, replyAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(/*COMMAND_IOCTL*/ 6, replyAddress + 8); + + // Return value + Memory::Write_U32(ret, replyAddress + 4); + + WII_IPC_HLE_Interface::EnqueReplyCallback(replyAddress); + //DEBUG_LOG(WII_IPC_HID, "OMG OMG OMG I GOT A CALLBACK, IMMA BE FAMOUS %d %d %d", transfer->actual_length, transfer->length, transfer->status); +} + + +CWII_IPC_HLE_Device_hid::CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName) + : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) +{ + deviceCommandAddress = 0; + memset(hidDeviceAliases, 0, sizeof(hidDeviceAliases)); + int ret = libusb_init(NULL); + if (ret) + { + ERROR_LOG(WII_IPC_HID, "libusb_init failed with error: %d", ret); + } + else + { + usb_thread_running = true; + usb_thread = std::thread(checkUsbUpdates, this); + } +} + +CWII_IPC_HLE_Device_hid::~CWII_IPC_HLE_Device_hid() +{ + bool deinit_libusb = false; + if (usb_thread_running) + { + usb_thread_running = false; + usb_thread.join(); + deinit_libusb = true; + } + + for ( std::map::const_iterator iter = open_devices.begin(); iter != open_devices.end(); ++iter ) + { + libusb_close(iter->second); + } + open_devices.clear(); + + if (deinit_libusb) + libusb_exit(NULL); +} + +bool CWII_IPC_HLE_Device_hid::Open(u32 _CommandAddress, u32 _Mode) +{ + DEBUG_LOG(WII_IPC_HID, "HID::Open"); + m_Active = true; + Memory::Write_U32(GetDeviceID(), _CommandAddress + 4); + return true; +} + +bool CWII_IPC_HLE_Device_hid::Close(u32 _CommandAddress, bool _bForce) +{ + DEBUG_LOG(WII_IPC_HID, "HID::Close"); + m_Active = false; + if (!_bForce) + Memory::Write_U32(0, _CommandAddress + 4); + return true; +} + +u32 CWII_IPC_HLE_Device_hid::Update() +{ + + u32 work_done = 0; + return work_done; +} + +bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) +{ + u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC); + u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); + u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); + u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); + u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); + + u32 ReturnValue = 0; + switch (Parameter) + { + case IOCTL_HID_GET_ATTACHED: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Get Attached) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + deviceCommandAddress = _CommandAddress; + return false; + break; + } + case IOCTL_HID_OPEN: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Open) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + + //hid version, apparently + ReturnValue = 0x40001; + break; + } + case IOCTL_HID_SET_SUSPEND: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Set Suspend) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + // not actually implemented in IOS + ReturnValue = 0; + break; + } + case IOCTL_HID_CANCEL_INTERRUPT: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Cancel Interrupt) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + ReturnValue = 0; + break; + } + case IOCTL_HID_CONTROL: + { + /* + ERROR CODES: + -4 Cant find device specified + */ + + u32 dev_num = Memory::Read_U32(BufferIn+0x10); + u8 bmRequestType = Memory::Read_U8(BufferIn+0x14); + u8 bRequest = Memory::Read_U8(BufferIn+0x15); + u16 wValue = Memory::Read_U16(BufferIn+0x16); + u16 wIndex = Memory::Read_U16(BufferIn+0x18); + u16 wLength = Memory::Read_U16(BufferIn+0x1A); + u32 data = Memory::Read_U32(BufferIn+0x1C); + + ReturnValue = HIDERR_NO_DEVICE_FOUND; + + libusb_device_handle * dev_handle = GetDeviceByDevNum(dev_num); + + if (dev_handle == NULL) + { + DEBUG_LOG(WII_IPC_HID, "Could not find handle: %X", dev_num); + break; + } + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; + + u8 * buffer = (u8*)malloc(wLength + LIBUSB_CONTROL_SETUP_SIZE); + libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, wLength); + memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, Memory::GetPointer(data), wLength); + libusb_fill_control_transfer(transfer, dev_handle, buffer, handleUsbUpdates, (void*)(size_t)_CommandAddress, /* no timeout */ 0); + libusb_submit_transfer(transfer); + + //DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + // bmRequestType, bRequest, BufferIn, BufferInSize, BufferOut, BufferOutSize); + + // It's the async way! + return false; + break; + } + case IOCTL_HID_INTERRUPT_OUT: + case IOCTL_HID_INTERRUPT_IN: + { + u32 dev_num = Memory::Read_U32(BufferIn+0x10); + u32 endpoint = Memory::Read_U32(BufferIn+0x14); + u32 length = Memory::Read_U32(BufferIn+0x18); + + u32 data = Memory::Read_U32(BufferIn+0x1C); + + ReturnValue = HIDERR_NO_DEVICE_FOUND; + + libusb_device_handle * dev_handle = GetDeviceByDevNum(dev_num); + + if (dev_handle == NULL) + { + DEBUG_LOG(WII_IPC_HID, "Could not find handle: %X", dev_num); + break; + } + + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER; + libusb_fill_interrupt_transfer(transfer, dev_handle, endpoint, Memory::GetPointer(data), length, + handleUsbUpdates, (void*)(size_t)_CommandAddress, 0); + libusb_submit_transfer(transfer); + + //DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt %s)(%d,%d,%X) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + // Parameter == IOCTL_HID_INTERRUPT_IN ? "In" : "Out", endpoint, length, data, BufferIn, BufferInSize, BufferOut, BufferOutSize); + + // It's the async way! + return false; + break; + } + case IOCTL_HID_SHUTDOWN: + { + std::lock_guard lk(s_device_list_reply); + if (deviceCommandAddress != 0){ + Memory::Write_U32(0xFFFFFFFF, Memory::Read_U32(deviceCommandAddress + 0x18)); + + Memory::Write_U32(8, deviceCommandAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(/*COMMAND_IOCTL*/ 6, deviceCommandAddress + 8); + + // Return value + Memory::Write_U32(-1, deviceCommandAddress + 4); + WII_IPC_HLE_Interface::EnqueReplyCallback(deviceCommandAddress); + deviceCommandAddress = 0; + } + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Shutdown) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + default: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(0x%x) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + } + + Memory::Write_U32(ReturnValue, _CommandAddress + 4); + + return true; +} + + +bool CWII_IPC_HLE_Device_hid::ClaimDevice(libusb_device_handle * dev) +{ + int ret = 0; + if ((ret = libusb_kernel_driver_active(dev, 0)) == 1) + { + if ((ret = libusb_detach_kernel_driver(dev, 0)) && ret != LIBUSB_ERROR_NOT_SUPPORTED) + { + DEBUG_LOG(WII_IPC_HID, "libusb_detach_kernel_driver failed with error: %d", ret); + return false; + } + } + else if (ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED) + { + DEBUG_LOG(WII_IPC_HID, "libusb_kernel_driver_active error ret = %d", ret); + return false; + } + + if ((ret = libusb_claim_interface(dev, 0))) + { + DEBUG_LOG(WII_IPC_HID, "libusb_claim_interface failed with error: %d", ret); + return false; + } + + return true; +} + +bool CWII_IPC_HLE_Device_hid::IOCtlV(u32 _CommandAddress) +{ + + Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_HID, LogTypes::LWARNING); + u32 ReturnValue = 0; + SIOCtlVBuffer CommandBuffer(_CommandAddress); + + DEBUG_LOG(WII_IPC_HID, "%s - IOCtlV:", GetDeviceName().c_str()); + DEBUG_LOG(WII_IPC_HID, " Parameter: 0x%x", CommandBuffer.Parameter); + DEBUG_LOG(WII_IPC_HID, " NumberIn: 0x%08x", CommandBuffer.NumberInBuffer); + DEBUG_LOG(WII_IPC_HID, " NumberOut: 0x%08x", CommandBuffer.NumberPayloadBuffer); + DEBUG_LOG(WII_IPC_HID, " BufferVector: 0x%08x", CommandBuffer.BufferVector); + DEBUG_LOG(WII_IPC_HID, " PayloadAddr: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Address); + DEBUG_LOG(WII_IPC_HID, " PayloadSize: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Size); + #if defined(_DEBUG) || defined(DEBUGFAST) + DumpAsync(CommandBuffer.BufferVector, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer); + #endif + + Memory::Write_U32(ReturnValue, _CommandAddress + 4); + return true; +} + + + +void CWII_IPC_HLE_Device_hid::ConvertDeviceToWii(WiiHIDDeviceDescriptor *dest, const struct libusb_device_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDDeviceDescriptor)); + dest->bcdUSB = Common::swap16(dest->bcdUSB); + dest->idVendor = Common::swap16(dest->idVendor); + dest->idProduct = Common::swap16(dest->idProduct); + dest->bcdDevice = Common::swap16(dest->bcdDevice); +} + +void CWII_IPC_HLE_Device_hid::ConvertConfigToWii(WiiHIDConfigDescriptor *dest, const struct libusb_config_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDConfigDescriptor)); + dest->wTotalLength = Common::swap16(dest->wTotalLength); +} + +void CWII_IPC_HLE_Device_hid::ConvertInterfaceToWii(WiiHIDInterfaceDescriptor *dest, const struct libusb_interface_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDInterfaceDescriptor)); +} + +void CWII_IPC_HLE_Device_hid::ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, const struct libusb_endpoint_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDEndpointDescriptor)); + dest->wMaxPacketSize = Common::swap16(dest->wMaxPacketSize); +} + +void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize) +{ + static u16 check = 1; + int OffsetBuffer = BufferOut; + int OffsetStart = 0; + //int OffsetDevice = 0; + int d,c,ic,i,e; /* config, interface container, interface, endpoint */ + + libusb_device **list; + //libusb_device *found = NULL; + ssize_t cnt = libusb_get_device_list(NULL, &list); + DEBUG_LOG(WII_IPC_HID, "Found %ld viable USB devices.", cnt); + for (d = 0; d < cnt; d++) + { + libusb_device *device = list[d]; + struct libusb_device_descriptor desc; + int dRet = libusb_get_device_descriptor (device, &desc); + if (dRet) + { + // could not aquire the descriptor, no point in trying to use it. + DEBUG_LOG(WII_IPC_HID, "libusb_get_device_descriptor failed with error: %d", dRet); + continue; + } + OffsetStart = OffsetBuffer; + OffsetBuffer += 4; // skip length for now, fill at end + + OffsetBuffer += 4; // skip devNum for now + + WiiHIDDeviceDescriptor wii_device; + ConvertDeviceToWii(&wii_device, &desc); + Memory::WriteBigEData((const u8*)&wii_device, OffsetBuffer, Align(wii_device.bLength, 4)); + OffsetBuffer += Align(wii_device.bLength, 4); + bool deviceValid = true; + bool isHID = false; + + for (c = 0; deviceValid && c < desc.bNumConfigurations; c++) + { + struct libusb_config_descriptor *config = NULL; + int cRet = libusb_get_config_descriptor(device, c, &config); + // do not try to use usb devices with more than one interface, games can crash + if(cRet == 0 && config->bNumInterfaces <= MAX_HID_INTERFACES) + { + WiiHIDConfigDescriptor wii_config; + ConvertConfigToWii(&wii_config, config); + Memory::WriteBigEData((const u8*)&wii_config, OffsetBuffer, Align(wii_config.bLength, 4)); + OffsetBuffer += Align(wii_config.bLength, 4); + + for (ic = 0; ic < config->bNumInterfaces; ic++) + { + const struct libusb_interface *interfaceContainer = &config->interface[ic]; + + for (i = 0; i < interfaceContainer->num_altsetting; i++) + { + const struct libusb_interface_descriptor *interface = &interfaceContainer->altsetting[i]; + + if (interface->bInterfaceClass == LIBUSB_CLASS_HID) + isHID = true; + + WiiHIDInterfaceDescriptor wii_interface; + ConvertInterfaceToWii(&wii_interface, interface); + Memory::WriteBigEData((const u8*)&wii_interface, OffsetBuffer, Align(wii_interface.bLength, 4)); + OffsetBuffer += Align(wii_interface.bLength, 4); + + for (e = 0; e < interface->bNumEndpoints; e++) + { + const struct libusb_endpoint_descriptor *endpoint = &interface->endpoint[e]; + + WiiHIDEndpointDescriptor wii_endpoint; + ConvertEndpointToWii(&wii_endpoint, endpoint); + Memory::WriteBigEData((const u8*)&wii_endpoint, OffsetBuffer, Align(wii_endpoint.bLength, 4)); + OffsetBuffer += Align(wii_endpoint.bLength, 4); + + } //endpoints + } // interfaces + } // interface containters + libusb_free_config_descriptor(config); + config = NULL; + } + else + { + if(cRet) + DEBUG_LOG(WII_IPC_HID, "libusb_get_config_descriptor failed with: %d", cRet); + deviceValid = false; + OffsetBuffer = OffsetStart; + } + } // configs + + if (!isHID) + { + deviceValid = false; + OffsetBuffer = OffsetStart; + } + + if (deviceValid) + { + Memory::Write_U32(OffsetBuffer-OffsetStart, OffsetStart); // fill in length + + int devNum = GetAvaiableDevNum(desc.idVendor, + desc.idProduct, + libusb_get_bus_number (device), + libusb_get_device_address (device), + check); + if (devNum < 0 ) + { + // too many devices to handle. + ERROR_LOG(WII_IPC_HID, "Exhausted device list, you have way too many usb devices plugged in." + "Or it might be our fault. Let us know at https://code.google.com/p/dolphin-emu/issues/entry?template=Defect%%20report"); + OffsetBuffer = OffsetStart; + continue; + } + + DEBUG_LOG(WII_IPC_HID, "Found device with Vendor: %X Product: %X Devnum: %d", desc.idVendor, desc.idProduct, devNum); + + Memory::Write_U32(devNum , OffsetStart+4); //write device num + } + } + + // Find devices that no longer exists and free them + for (i=0; i> 48); + if(hidDeviceAliases[i] != 0 && check_cur != check) + { + DEBUG_LOG(WII_IPC_HID, "Removing: device %d %hX %hX", i, check, check_cur); + std::lock_guard lk(s_open_devices); + if (open_devices.find(i) != open_devices.end()) + { + libusb_device_handle *handle = open_devices[i]; + libusb_close(handle); + open_devices.erase(i); + } + hidDeviceAliases[i] = 0; + } + } + check++; + + + libusb_free_device_list(list, 1); + + Memory::Write_U32(0xFFFFFFFF, OffsetBuffer); // no more devices + +} + +int CWII_IPC_HLE_Device_hid::Align(int num, int alignment) +{ + return (num + (alignment-1)) & ~(alignment-1); +} + + +libusb_device_handle * CWII_IPC_HLE_Device_hid::GetDeviceByDevNum(u32 devNum) +{ + libusb_device **list; + libusb_device_handle *handle = NULL; + ssize_t cnt; + + if(devNum >= MAX_DEVICE_DEVNUM) + return NULL; + + + std::lock_guard lk(s_open_devices); + + if (open_devices.find(devNum) != open_devices.end()) + { + handle = open_devices[devNum]; + if(libusb_kernel_driver_active(handle, 0) != LIBUSB_ERROR_NO_DEVICE) + { + return handle; + } + else + { + libusb_close(handle); + open_devices.erase(devNum); + } + } + + cnt = libusb_get_device_list(NULL, &list); + + if (cnt < 0) + return NULL; + +#ifdef _WIN32 + static bool has_warned_about_drivers = false; +#endif + + for (ssize_t i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + struct libusb_device_descriptor desc; + int dRet = libusb_get_device_descriptor (device, &desc); + u8 bus = libusb_get_bus_number (device); + u8 port = libusb_get_device_address (device); + u64 unique_id = ((u64)desc.idVendor << 32) | ((u64)desc.idProduct << 16) | ((u64)bus << 8) | (u64)port; + if ((hidDeviceAliases[devNum] & HID_ID_MASK) == unique_id) + { + int ret = libusb_open(device, &handle); + if (ret) + { + if (ret == LIBUSB_ERROR_ACCESS) + { + if( dRet ) + { + ERROR_LOG(WII_IPC_HID, "Dolphin does not have access to this device: Bus %03d Device %03d: ID ????:???? (couldn't get id).", + bus, + port + ); + } + else{ + ERROR_LOG(WII_IPC_HID, "Dolphin does not have access to this device: Bus %03d Device %03d: ID %04X:%04X.", + bus, + port, + desc.idVendor, + desc.idProduct + ); + } + } +#ifdef _WIN32 + else if (ret == LIBUSB_ERROR_NOT_SUPPORTED) + { + if(!has_warned_about_drivers) + { + // Max of one warning. + has_warned_about_drivers = true; + WARN_LOG(WII_IPC_HID, "Please install the libusb drivers for the device %04X:%04X", desc.idVendor, desc.idProduct); + } + } +#endif + else + { + ERROR_LOG(WII_IPC_HID, "libusb_open failed to open device with error = %d", ret); + } + continue; + } + + + if (!ClaimDevice(handle)) + { + ERROR_LOG(WII_IPC_HID, "Could not claim the device for handle: %X", devNum); + libusb_close(handle); + continue; + } + + open_devices[devNum] = handle; + break; + } + else + { + handle = NULL; + } + } + + libusb_free_device_list(list, 1); + + + return handle; +} + + +int CWII_IPC_HLE_Device_hid::GetAvaiableDevNum(u16 idVendor, u16 idProduct, u8 bus, u8 port, u16 check) +{ + int i; + int pos = -1; + u64 unique_id = ((u64)idVendor << 32) | ((u64)idProduct << 16) | ((u64)bus << 8) | (u64)port; + for (i=0; i +#include "Thread.h" +#include + +#define HID_ID_MASK 0x0000FFFFFFFFFFFF +#define MAX_HID_INTERFACES 1 + +#define HIDERR_NO_DEVICE_FOUND -4 + +/* Connection timed out */ + +class CWII_IPC_HLE_Device_hid : public IWII_IPC_HLE_Device +{ +public: + CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName); + + virtual ~CWII_IPC_HLE_Device_hid(); + + virtual bool Open(u32 _CommandAddress, u32 _Mode); + virtual bool Close(u32 _CommandAddress, bool _bForce); + virtual u32 Update(); + + virtual bool IOCtlV(u32 _CommandAddress); + virtual bool IOCtl(u32 _CommandAddress); + +private: + enum + { + IOCTL_HID_GET_ATTACHED = 0x00, + IOCTL_HID_SET_SUSPEND = 0x01, + IOCTL_HID_CONTROL = 0x02, + IOCTL_HID_INTERRUPT_IN = 0x03, + IOCTL_HID_INTERRUPT_OUT = 0x04, + IOCTL_HID_GET_US_STRING = 0x05, + IOCTL_HID_OPEN = 0x06, + IOCTL_HID_SHUTDOWN = 0x07, + IOCTL_HID_CANCEL_INTERRUPT = 0x08, + }; + + /* Device descriptor */ + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; + u8 pad[2]; + } WiiHIDDeviceDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u16 wTotalLength; + u8 bNumInterfaces; + u8 bConfigurationValue; + u8 iConfiguration; + u8 bmAttributes; + u8 MaxPower; + u8 pad[3]; + } WiiHIDConfigDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u8 bInterfaceNumber; + u8 bAlternateSetting; + u8 bNumEndpoints; + u8 bInterfaceClass; + u8 bInterfaceSubClass; + u8 bInterfaceProtocol; + u8 iInterface; + u8 pad[3]; + } WiiHIDInterfaceDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u8 bEndpointAddress; + u8 bmAttributes; + u16 wMaxPacketSize; + u8 bInterval; + u8 bRefresh; + u8 bSynchAddress; + u8 pad[1]; + } WiiHIDEndpointDescriptor; + + u32 deviceCommandAddress; + void FillOutDevices(u32 BufferOut, u32 BufferOutSize); + int GetAvaiableDevNum(u16 idVendor, u16 idProduct, u8 bus, u8 port, u16 check); + bool ClaimDevice(libusb_device_handle * dev); + + void ConvertDeviceToWii(WiiHIDDeviceDescriptor *dest, const struct libusb_device_descriptor *src); + void ConvertConfigToWii(WiiHIDConfigDescriptor *dest, const struct libusb_config_descriptor *src); + void ConvertInterfaceToWii(WiiHIDInterfaceDescriptor *dest, const struct libusb_interface_descriptor *src); + void ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, const struct libusb_endpoint_descriptor *src); + + int Align(int num, int alignment); + static void checkUsbUpdates(CWII_IPC_HLE_Device_hid* hid); + static void LIBUSB_CALL handleUsbUpdates(struct libusb_transfer *transfer); + + struct libusb_device_handle * GetDeviceByDevNum(u32 devNum); + std::map open_devices; + std::mutex s_open_devices; + std::mutex s_device_list_reply; + std::map device_identifiers; + + std::thread usb_thread; + bool usb_thread_running; + + typedef struct + { + u32 enq_address; + u32 type; + void * context; + } _hidevent; + + std::list<_hidevent> event_list; +}; + +#endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp index 47bb9e7e52..1cfcf26343 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp @@ -2,74 +2,65 @@ // Licensed under GPLv2 // Refer to the license.txt file included. - -/* -The /dev/net/kd/request requests are part of what is called WiiConnect24, -it's used by for example SSBB, Mario Kart, Metroid Prime 3 - -0x01 SuspendScheduler (Input: none, Output: 32 bytes) -0x02 ExecTrySuspendScheduler (Input: 32 bytes, Output: 32 bytes) // Sounds like it will - check if it should suspend the updates scheduler or not. If I returned - (OutBuffer: 0, Ret: -1) to Metroid Prime 3 it got stuck in an endless loops of - requests, probably harmless but I changed it to (OutBuffer: 1, Ret: 0) to stop - the calls. However then it also calls 0x3 and then changes its error message - to a Wii Memory error message from just a general Error message. - -0x03 ? (Input: none, Output: 32 bytes) // This is only called if 0x02 - does not return -1 -0x0f NWC24iRequestGenerateUserId (Input: none, Output: 32 bytes) - -Requests are made in this order by these games - Mario Kart: 2, 1, f, 3 - SSBB: 2, 3 - -For Mario Kart I had to return -1 from at least 2, f and 3 to convince it that the network -was unavailable and prevent if from looking for shared2/wc24 files (and do a PPCHalt when -it failed) -*/ - -#ifdef _MSC_VER -#pragma warning(disable : 4065) // switch statement contains 'default' but no 'case' labels -#endif - +#include "WII_IPC_HLE_Device_es.h" #include "WII_IPC_HLE_Device_net.h" #include "../ConfigManager.h" #include "FileUtil.h" #include #include +#include "ICMP.h" +#include "CommonPaths.h" +#include "SettingsHandler.h" +#include "ec_wii.h" +#include "WII_Socket.h" + #ifdef _WIN32 #include #include -#elif defined(__linux__) +#include + +#include "fakepoll.h" +#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) +#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) + +#elif defined(__linux__) or defined(__APPLE__) +#include +#include #include #include #include #include #include +#include +#include +#include + +typedef struct pollfd pollfd_t; #else #include #include #include +#include #endif extern std::queue > g_ReplyQueueLater; +const u8 default_address[] = { 0x00, 0x17, 0xAB, 0x99, 0x99, 0x99 }; // ********************************************************************************** // Handle /dev/net/kd/request requests -CWII_IPC_HLE_Device_net_kd_request::CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName) +CWII_IPC_HLE_Device_net_kd_request::CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) - , m_UserID("Dolphin-EMU") - // TODO: Dump the true ID from real Wii { } CWII_IPC_HLE_Device_net_kd_request::~CWII_IPC_HLE_Device_net_kd_request() { + WiiSockMan::getInstance().clean(); } bool CWII_IPC_HLE_Device_net_kd_request::Open(u32 _CommandAddress, u32 _Mode) { - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: Open"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: Open"); Memory::Write_U32(GetDeviceID(), _CommandAddress + 4); m_Active = true; return true; @@ -77,114 +68,251 @@ bool CWII_IPC_HLE_Device_net_kd_request::Open(u32 _CommandAddress, u32 _Mode) bool CWII_IPC_HLE_Device_net_kd_request::Close(u32 _CommandAddress, bool _bForce) { - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: Close"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: Close"); if (!_bForce) Memory::Write_U32(0, _CommandAddress + 4); m_Active = false; return true; } -bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress) { u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC); u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); - u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); + u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); u32 ReturnValue = 0; switch (Parameter) { case IOCTL_NWC24_SUSPEND_SCHEDULAR: - // NWC24iResumeForCloseLib from NWC24SuspendScheduler (Input: none, Output: 32 bytes) - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_SUSPEND_SCHEDULAR - NI"); + // NWC24iResumeForCloseLib from NWC24SuspendScheduler (Input: none, Output: 32 bytes) + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_SUSPEND_SCHEDULAR - NI"); + Memory::Write_U32(0, BufferOut); // no error break; case IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR: // NWC24iResumeForCloseLib - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR - NI"); break; - case IOCTL_NWC24_UNK_3: // NWC24iResumeForCloseLib - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_UNK_3 - NI"); + case IOCTL_NWC24_EXEC_RESUME_SCHEDULAR : // NWC24iResumeForCloseLib + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_EXEC_RESUME_SCHEDULAR - NI"); + Memory::Write_U32(0, BufferOut); // no error break; case IOCTL_NWC24_STARTUP_SOCKET: // NWC24iStartupSocket - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_STARTUP_SOCKET - NI"); + Memory::Write_U32(0, BufferOut); + Memory::Write_U32(0, BufferOut+4); + ReturnValue = 0; + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_STARTUP_SOCKET - NI"); + break; + case IOCTL_NWC24_CLEANUP_SOCKET: + Memory::Memset(BufferOut, 0, BufferOutSize); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_CLEANUP_SOCKET - NI"); break; - case IOCTL_NWC24_LOCK_SOCKET: // WiiMenu - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_LOCK_SOCKET - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_LOCK_SOCKET - NI"); break; case IOCTL_NWC24_UNLOCK_SOCKET: - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_UNLOCK_SOCKET - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_UNLOCK_SOCKET - NI"); + break; + + case IOCTL_NWC24_REQUEST_REGISTER_USER_ID: + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_REGISTER_USER_ID"); + Memory::Write_U32(0, BufferOut); + Memory::Write_U32(0, BufferOut+4); break; case IOCTL_NWC24_REQUEST_GENERATED_USER_ID: // (Input: none, Output: 32 bytes) - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_REQUEST_GENERATED_USER_ID"); - memcpy(Memory::GetPointer(BufferOut), m_UserID.c_str(), m_UserID.length() + 1); - break; + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_GENERATED_USER_ID"); + if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_INITIAL) + { + std::string settings_Filename(Common::GetTitleDataPath(TITLEID_SYSMENU) + WII_SETTING); + SettingsHandler gen; + std::string area, model; + bool _GotSettings = false; + if (File::Exists(settings_Filename)) + { + File::IOFile settingsFileHandle(settings_Filename, "rb"); + if (settingsFileHandle.ReadBytes((void*)gen.GetData(), SettingsHandler::SETTINGS_SIZE)) + { + gen.Decrypt(); + area = gen.GetValue("AREA"); + model = gen.GetValue("MODEL"); + _GotSettings = true; + } + + } + if (_GotSettings) + { + u8 area_code = GetAreaCode(area.c_str()); + u8 id_ctr = config.IdGen(); + u8 hardware_model = GetHardwareModel(model.c_str()); + + EcWii &ec = EcWii::GetInstance(); + u32 HollywoodID = ec.getNgId(); + u64 UserID = 0; + + s32 ret = NWC24MakeUserID(&UserID, HollywoodID, id_ctr, hardware_model, area_code); + config.SetId(UserID); + config.IncrementIdGen(); + config.SetCreationStage(nwc24_config_t::NWC24_IDCS_GENERATED); + config.WriteConfig(); + + Memory::Write_U32(ret, BufferOut); + } + else + { + Memory::Write_U32(WC24_ERR_FATAL, BufferOut); + } + + } + else if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_GENERATED) + { + Memory::Write_U32(WC24_ERR_ID_GENERATED, BufferOut); + } + else if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_REGISTERED) + { + Memory::Write_U32(WC24_ERR_ID_REGISTERED, BufferOut); + } + Memory::Write_U64(config.Id(), BufferOut + 4); + Memory::Write_U32(config.CreationStage(), BufferOut + 0xC); + break; case IOCTL_NWC24_GET_SCHEDULAR_STAT: - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_GET_SCHEDULAR_STAT - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_GET_SCHEDULAR_STAT - NI"); break; case IOCTL_NWC24_SAVE_MAIL_NOW: - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_SAVE_MAIL_NOW - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_SAVE_MAIL_NOW - NI"); break; case IOCTL_NWC24_REQUEST_SHUTDOWN: // if ya set the IOS version to a very high value this happens ... - INFO_LOG(WII_IPC_NET, "NET_KD_REQ: IOCTL_NWC24_REQUEST_SHUTDOWN - NI"); + INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_SHUTDOWN - NI"); break; default: - INFO_LOG(WII_IPC_NET, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + INFO_LOG(WII_IPC_WC24, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); break; } - // g_ReplyQueueLater.push(std::pair(_CommandAddress, GetDeviceName())); Memory::Write_U32(ReturnValue, _CommandAddress + 4); - - return true; + return true; } +u8 CWII_IPC_HLE_Device_net_kd_request::GetAreaCode( const char * area ) +{ + u32 i; + u8 regions_[] = {0,1,2,2,1,3,3,4,5,5,1,2,6,7}; + const char* regions[] = {"JPN", "USA", "EUR", "AUS", "BRA", "TWN", "ROC", "KOR", "HKG", "ASI", "LTN", "SAF", "CHN", ""}; + for (i=0; i> (shift*8)); +} + +static inline u64 u64_insert_byte(u64 value, u8 shift, u8 byte) +{ + u64 mask = 0x00000000000000FFULL << (shift*8); + u64 inst = (u64)byte << (shift*8); + return (value & ~mask) | inst; +} + +s32 CWII_IPC_HLE_Device_net_kd_request::NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, u8 hardware_model, u8 area_code) +{ + const u8 table2[8] = {0x1, 0x5, 0x0, 0x4, 0x2, 0x3, 0x6, 0x7}; + const u8 table1[16] = {0x4, 0xB, 0x7, 0x9, 0xF, 0x1, 0xD, 0x3, 0xC, 0x2, 0x6, 0xE, 0x8, 0x0, 0xA, 0x5}; + + u64 mix_id = ((u64)area_code<<50) | ((u64)hardware_model<<47) | ((u64)hollywood_id<<15) | ((u64)id_ctr<<10); + u64 mix_id_copy1 = mix_id; + + int ctr = 0; + for (ctr = 0; ctr <= 42; ctr++) + { + u64 value = mix_id >> (52-ctr); + if (value & 1) + { + value = 0x0000000000000635ULL << (42-ctr); + mix_id ^= value; + } + } + + mix_id = (mix_id_copy1 | (mix_id & 0xFFFFFFFFUL)) ^ 0x0000B3B3B3B3B3B3ULL; + mix_id = (mix_id >> 10) | ((mix_id & 0x3FF) << (11+32)); + + for (ctr = 0; ctr <= 5; ctr++) + { + u8 ret = u64_get_byte(mix_id, ctr); + u8 foobar = ((table1[(ret>>4)&0xF])<<4) | (table1[ret&0xF]); + mix_id = u64_insert_byte(mix_id, ctr, foobar & 0xff); + } + u64 mix_id_copy2 = mix_id; + + for (ctr = 0; ctr <= 5; ctr++) + { + u8 ret = u64_get_byte(mix_id_copy2, ctr); + mix_id = u64_insert_byte(mix_id, table2[ctr], ret); + } + + mix_id &= 0x001FFFFFFFFFFFFFULL; + mix_id = (mix_id << 1) | ((mix_id >> 52) & 1); + + mix_id ^= 0x00005E5E5E5E5E5EULL; + mix_id &= 0x001FFFFFFFFFFFFFULL; + + *nwc24_id = mix_id; + + if (mix_id > 9999999999999999ULL) + return WC24_ERR_FATAL; + + return WC24_OK; +} + // ********************************************************************************** // Handle /dev/net/ncd/manage requests -CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName) +CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) { - // store network configuration - const std::string filename(File::GetUserPath(D_WIIUSER_IDX) + "shared2/sys/net/02/config.dat"); - - File::IOFile file(filename, "rb"); - if (!file.ReadBytes(&m_Ifconfig, 1)) - { - INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: Failed to load /shared2/sys/net/02/config.dat, using dummy configuration"); - - // wired connection on IP 192.168.1.1 using gateway 192.168.1.2 - memset(&m_Ifconfig, 0, sizeof(m_Ifconfig)); - m_Ifconfig.header4 = 1; // got one "valid" connection - m_Ifconfig.header6 = 7; // this is always 7? - m_Ifconfig.connection[0].flags = 167; - m_Ifconfig.connection[0].ip[0] = 192; - m_Ifconfig.connection[0].ip[1] = 168; - m_Ifconfig.connection[0].ip[2] = 1; - m_Ifconfig.connection[0].ip[3] = 1; - m_Ifconfig.connection[0].netmask[0] = 255; - m_Ifconfig.connection[0].netmask[1] = 255; - m_Ifconfig.connection[0].netmask[2] = 255; - m_Ifconfig.connection[0].netmask[3] = 255; - m_Ifconfig.connection[0].gateway[0] = 192; - m_Ifconfig.connection[0].gateway[1] = 168; - m_Ifconfig.connection[0].gateway[2] = 1; - m_Ifconfig.connection[0].gateway[3] = 2; - } } -CWII_IPC_HLE_Device_net_ncd_manage::~CWII_IPC_HLE_Device_net_ncd_manage() +CWII_IPC_HLE_Device_net_ncd_manage::~CWII_IPC_HLE_Device_net_ncd_manage() { } @@ -207,65 +335,52 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::Close(u32 _CommandAddress, bool _bForce bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress) { - u32 ReturnValue = 0; + u32 return_value = 0; + u32 common_result = 0; + u32 common_vector = 0; SIOCtlVBuffer CommandBuffer(_CommandAddress); switch (CommandBuffer.Parameter) { - case IOCTLV_NCD_READCONFIG: // 7004 out, 32 out - // first out buffer gets filled with contents of /shared2/sys/net/02/config.dat - // TODO: What's the second output buffer for? - { - INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETIFCONFIG"); - - // fill output buffer, taking care of endianness - u32 addr = CommandBuffer.PayloadBuffer.at(0).m_Address; - Memory::WriteBigEData((const u8*)&m_Ifconfig, addr, 8); - addr += 8; - for (unsigned int i = 0; i < 3; i++) - { - netcfg_connection_t *conn = &m_Ifconfig.connection[i]; - - Memory::WriteBigEData((const u8*)conn, addr, 26); - Memory::Write_U16(Common::swap16(conn->mtu), addr+26); - Memory::WriteBigEData((const u8*)conn->padding_3, addr+28, 8); - - Memory::WriteBigEData((const u8*)&conn->proxy_settings, addr+36, 260); - Memory::Write_U16(Common::swap16(conn->proxy_settings.proxy_port), addr+296); - Memory::WriteBigEData((const u8*)&conn->proxy_settings.proxy_username, addr+298, 65); - Memory::Write_U8(conn->padding_4, addr+363); - - Memory::WriteBigEData((const u8*)&conn->proxy_settings_copy, addr+364, 260); - Memory::Write_U16(Common::swap16(conn->proxy_settings_copy.proxy_port), addr+624); - Memory::WriteBigEData((const u8*)&conn->proxy_settings_copy.proxy_username, addr+626, 65); - Memory::WriteBigEData((const u8*)conn->padding_5, addr+691, 1641); - addr += sizeof(netcfg_connection_t); - } - ReturnValue = 0; + case IOCTLV_NCD_LOCKWIRELESSDRIVER: break; - } - - case IOCTLV_NCD_UNK4: // 7004 In, 32 Out. 4th - INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_UNK4"); + case IOCTLV_NCD_UNLOCKWIRELESSDRIVER: + //Memory::Read_U32(CommandBuffer.InBuffer.at(0).m_Address); break; - case 0x05: // 7004 Out, 32 Out. 2nd, 3rd - INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCtlV 0x5"); + case IOCTLV_NCD_GETCONFIG: + INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETCONFIG"); + config.WriteToMem(CommandBuffer.PayloadBuffer.at(0).m_Address); + common_vector = 1; break; - case IOCTLV_NCD_GETLINKSTATUS: // 32 Out. 5th + case IOCTLV_NCD_SETCONFIG: + INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_SETCONFIG"); + config.ReadFromMem(CommandBuffer.InBuffer.at(0).m_Address); + break; + + case IOCTLV_NCD_READCONFIG: + INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_READCONFIG"); + config.ReadConfig(); + config.WriteToMem(CommandBuffer.PayloadBuffer.at(0).m_Address); + common_vector = 1; + break; + + case IOCTLV_NCD_WRITECONFIG: + INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_WRITECONFIG"); + config.ReadFromMem(CommandBuffer.InBuffer.at(0).m_Address); + config.WriteConfig(); + break; + + case IOCTLV_NCD_GETLINKSTATUS: INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETLINKSTATUS"); + // Always connected + Memory::Write_U32(netcfg_connection_t::LINK_WIRED, + CommandBuffer.PayloadBuffer.at(0).m_Address + 4); break; - case IOCTLV_NCD_GETWIRELESSMACADDRESS: // 32 Out, 6 Out. 1st - // TODO: What's the first output buffer for? - // second out buffer gets filled with first four bytes of the wireless MAC address. - // No idea why the fifth and sixth bytes are left untouched. - { - // hardcoded address as a fallback - const u8 default_address[] = { 0x00, 0x19, 0x1e, 0xfd, 0x71, 0x84 }; - + case IOCTLV_NCD_GETWIRELESSMACADDRESS: INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS"); if (!SConfig::GetInstance().m_WirelessMac.empty()) @@ -294,74 +409,161 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress) break; } -#if defined(__linux__) - const char *check_devices[3] = { "wlan0", "ath0", "eth0" }; - int fd, ret; - struct ifreq ifr; - - fd = socket(AF_INET, SOCK_DGRAM, 0); - ifr.ifr_addr.sa_family = AF_INET; - - for (unsigned int dev = 0; dev < 3; dev++ ) - { - strncpy(ifr.ifr_name, check_devices[dev], IFNAMSIZ-1); - ret = ioctl(fd, SIOCGIFHWADDR, &ifr); - if (ret == 0) - { - INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS returning local MAC address of %s", check_devices[dev]); - Memory::WriteBigEData((const u8*)ifr.ifr_hwaddr.sa_data, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - break; - } - } - if (ret != 0) - { - // fall back to the hardcoded address - Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - } - close(fd); - -#elif defined(_WIN32) - IP_ADAPTER_INFO *adapter_info = NULL; - DWORD len = 0; - - DWORD ret = GetAdaptersInfo(adapter_info, &len); - if (ret != ERROR_BUFFER_OVERFLOW || !len) - { - Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - break; - } - - // LPFaint99: len is sizeof(IP_ADAPTER_INFO) * nics - 0x20 - adapter_info = new IP_ADAPTER_INFO[(len / sizeof(IP_ADAPTER_INFO)) + 1]; - ret = GetAdaptersInfo(adapter_info, &len); - - if (SUCCEEDED(ret)) Memory::WriteBigEData(adapter_info->Address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - else Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); - delete[] adapter_info; -#else - Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4); -#endif + Memory::WriteBigEData(default_address, + CommandBuffer.PayloadBuffer.at(1).m_Address, sizeof(default_address)); break; - } default: INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %#x", CommandBuffer.Parameter); break; } - Memory::Write_U32(ReturnValue, _CommandAddress+4); + Memory::Write_U32(common_result, + CommandBuffer.PayloadBuffer.at(common_vector).m_Address); + if (common_vector == 1) + { + Memory::Write_U32(common_result, + CommandBuffer.PayloadBuffer.at(common_vector).m_Address + 4); + } + Memory::Write_U32(return_value, _CommandAddress + 4); + return true; +} + +// ********************************************************************************** +// Handle /dev/net/wd/command requests +CWII_IPC_HLE_Device_net_wd_command::CWII_IPC_HLE_Device_net_wd_command(u32 DeviceID, const std::string& DeviceName) + : IWII_IPC_HLE_Device(DeviceID, DeviceName) +{ +} + +CWII_IPC_HLE_Device_net_wd_command::~CWII_IPC_HLE_Device_net_wd_command() +{ +} + +bool CWII_IPC_HLE_Device_net_wd_command::Open(u32 CommandAddress, u32 Mode) +{ + INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND: Open"); + Memory::Write_U32(GetDeviceID(), CommandAddress + 4); + m_Active = true; + return true; +} + +bool CWII_IPC_HLE_Device_net_wd_command::Close(u32 CommandAddress, bool Force) +{ + INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND: Close"); + if (!Force) + Memory::Write_U32(0, CommandAddress + 4); + m_Active = false; + return true; +} + +// This is just for debugging / playing around. +// There really is no reason to implement wd unless we can bend it such that +// we can talk to the DS. +#include "StringUtil.h" +bool CWII_IPC_HLE_Device_net_wd_command::IOCtlV(u32 CommandAddress) +{ + u32 return_value = 0; + + SIOCtlVBuffer CommandBuffer(CommandAddress); + + switch (CommandBuffer.Parameter) + { + case IOCTLV_WD_SCAN: + { + // Gives parameters detailing type of scan and what to match + // XXX - unused + // ScanInfo *scan = (ScanInfo *)Memory::GetPointer(CommandBuffer.InBuffer.at(0).m_Address); + + u16 *results = (u16 *)Memory::GetPointer(CommandBuffer.PayloadBuffer.at(0).m_Address); + // first u16 indicates number of BSSInfo following + results[0] = Common::swap16(1); + + BSSInfo *bss = (BSSInfo *)&results[1]; + memset(bss, 0, sizeof(BSSInfo)); + + bss->length = Common::swap16(sizeof(BSSInfo)); + bss->rssi = Common::swap16(0xffff); + + for (int i = 0; i < BSSID_SIZE; ++i) + bss->bssid[i] = i; + + const char *ssid = "dolphin-emu"; + strcpy((char *)bss->ssid, ssid); + bss->ssid_length = Common::swap16((u16)strlen(ssid)); + + bss->channel = Common::swap16(2); + } + break; + + case IOCTLV_WD_GET_INFO: + { + Info *info = (Info *)Memory::GetPointer(CommandBuffer.PayloadBuffer.at(0).m_Address); + memset(info, 0, sizeof(Info)); + // Probably used to disallow certain channels? + memcpy(info->country, "US", 2); + info->ntr_allowed_channels = Common::swap16(0xfffe); + memcpy(info->mac, default_address, 6); + } + break; + + case IOCTLV_WD_GET_MODE: + case IOCTLV_WD_SET_LINKSTATE: + case IOCTLV_WD_GET_LINKSTATE: + case IOCTLV_WD_SET_CONFIG: + case IOCTLV_WD_GET_CONFIG: + case IOCTLV_WD_CHANGE_BEACON: + case IOCTLV_WD_DISASSOC: + case IOCTLV_WD_MP_SEND_FRAME: + case IOCTLV_WD_SEND_FRAME: + case IOCTLV_WD_CALL_WL: + case IOCTLV_WD_MEASURE_CHANNEL: + case IOCTLV_WD_GET_LASTERROR: + case IOCTLV_WD_CHANGE_GAMEINFO: + case IOCTLV_WD_CHANGE_VTSF: + case IOCTLV_WD_RECV_FRAME: + case IOCTLV_WD_RECV_NOTIFICATION: + default: + INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND IOCtlV %#x in %i out %i", + CommandBuffer.Parameter, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer); + for (u32 i = 0; i < CommandBuffer.NumberInBuffer; ++i) + { + INFO_LOG(WII_IPC_NET, "in %i addr %x size %i", i, + CommandBuffer.InBuffer.at(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); + INFO_LOG(WII_IPC_NET, "%s", + ArrayToString( + Memory::GetPointer(CommandBuffer.InBuffer.at(i).m_Address), + CommandBuffer.InBuffer.at(i).m_Size).c_str() + ); + } + for (u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; ++i) + { + INFO_LOG(WII_IPC_NET, "out %i addr %x size %i", i, + CommandBuffer.PayloadBuffer.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); + } + break; + } + + Memory::Write_U32(return_value, CommandAddress + 4); return true; } // ********************************************************************************** // Handle /dev/net/ip/top requests -CWII_IPC_HLE_Device_net_ip_top::CWII_IPC_HLE_Device_net_ip_top(u32 _DeviceID, const std::string& _rDeviceName) +CWII_IPC_HLE_Device_net_ip_top::CWII_IPC_HLE_Device_net_ip_top(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) { +#ifdef _WIN32 + int ret = WSAStartup(MAKEWORD(2,2), &InitData); + INFO_LOG(WII_IPC_NET, "WSAStartup: %d", ret); +#endif } -CWII_IPC_HLE_Device_net_ip_top::~CWII_IPC_HLE_Device_net_ip_top() +CWII_IPC_HLE_Device_net_ip_top::~CWII_IPC_HLE_Device_net_ip_top() { +#ifdef _WIN32 + WSACleanup(); +#endif } bool CWII_IPC_HLE_Device_net_ip_top::Open(u32 _CommandAddress, u32 _Mode) @@ -381,145 +583,834 @@ bool CWII_IPC_HLE_Device_net_ip_top::Close(u32 _CommandAddress, bool _bForce) return true; } -bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress) -{ +static int inet_pton(const char *src, unsigned char *dst) +{ + int saw_digit, octets; + char ch; + unsigned char tmp[4], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + if (ch >= '0' && ch <= '9') { + unsigned int newt = (*tp * 10) + (ch - '0'); + + if (newt > 255) + return (0); + *tp = newt; + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + memcpy(dst, tmp, 4); + return (1); +} + +// Maps SOCKOPT level from native to Wii +static unsigned int opt_level_mapping[][2] = { + { SOL_SOCKET, 0xFFFF } +}; + +// Maps SOCKOPT optname from native to Wii +static unsigned int opt_name_mapping[][2] = { + { SO_REUSEADDR, 0x4 }, + { SO_SNDBUF, 0x1001 }, + { SO_RCVBUF, 0x1002 }, + { SO_ERROR, 0x1009 } +}; + +bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress) +{ + u32 Command = Memory::Read_U32(_CommandAddress + 0x0C); u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); - u32 Command = Memory::Read_U32(_CommandAddress + 0x0C); -// INFO_LOG(WII_IPC_NET,"%s - Command(0x%08x) BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)\n", GetDeviceName().c_str(), Command, BufferIn, BufferInSize, BufferOut, BufferOutSize); + u32 ReturnValue = 0; + switch (Command) + { + case IOCTL_SO_STARTUP: + { + INFO_LOG(WII_IPC_NET, "IOCTL_SO_STARTUP " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + case IOCTL_SO_SOCKET: + { + u32 af = Memory::Read_U32(BufferIn); + u32 type = Memory::Read_U32(BufferIn + 0x04); + u32 prot = Memory::Read_U32(BufferIn + 0x08); + + WiiSockMan &sm = WiiSockMan::getInstance(); + ReturnValue = sm.newSocket(af, type, prot); + INFO_LOG(WII_IPC_NET, "IOCTL_SO_SOCKET " + "Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + ReturnValue, af, type, prot, BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + case IOCTL_SO_ICMPSOCKET: + { + u32 pf = Memory::Read_U32(BufferIn); + + WiiSockMan &sm = WiiSockMan::getInstance(); + ReturnValue = sm.newSocket(pf, SOCK_RAW, IPPROTO_ICMP); + INFO_LOG(WII_IPC_NET, "IOCTL_SO_ICMPSOCKET(%x) %d", pf, ReturnValue); + break; + } + case IOCTL_SO_CLOSE: + case IOCTL_SO_ICMPCLOSE: + { + u32 fd = Memory::Read_U32(BufferIn); + WiiSockMan &sm = WiiSockMan::getInstance(); + ReturnValue = sm.delSocket(fd); + DEBUG_LOG(WII_IPC_NET, "%s(%x) %x", + Command == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE" : "IOCTL_SO_CLOSE", + fd, ReturnValue); + break; + } + case IOCTL_SO_ACCEPT: + case IOCTL_SO_BIND: + case IOCTL_SO_CONNECT: + case IOCTL_SO_FCNTL: + { + u32 fd = Memory::Read_U32(BufferIn); + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(fd, _CommandAddress, (NET_IOCTL)Command); + return false; + break; + } + ///////////////////////////////////////////////////////////// + // TODO: Tidy all below // + ///////////////////////////////////////////////////////////// + case IOCTL_SO_SHUTDOWN: + { + INFO_LOG(WII_IPC_NET, "IOCTL_SO_SHUTDOWN " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + + u32 fd = Memory::Read_U32(BufferIn); + u32 how = Memory::Read_U32(BufferIn+4); + int ret = shutdown(fd, how); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SHUTDOWN", false); + break; + } + case IOCTL_SO_LISTEN: + { + + u32 fd = Memory::Read_U32(BufferIn); + u32 BACKLOG = Memory::Read_U32(BufferIn + 0x04); + u32 ret = listen(fd, BACKLOG); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_LISTEN", false); + INFO_LOG(WII_IPC_NET, "IOCTL_SO_LISTEN = %d " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + case IOCTL_SO_GETSOCKOPT: + { + u32 fd = Memory::Read_U32(BufferOut); + u32 level = Memory::Read_U32(BufferOut + 4); + u32 optname = Memory::Read_U32(BufferOut + 8); + + INFO_LOG(WII_IPC_NET,"IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)" + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + fd, level, optname, + BufferIn, BufferInSize, BufferOut, BufferOutSize); + + // Do the level/optname translation + int nat_level = -1, nat_optname = -1; + + for (auto& map : opt_level_mapping) + if (level == map[1]) + nat_level = map[0]; + + for (auto& map : opt_name_mapping) + if (optname == map[1]) + nat_optname = map[0]; + + u8 optval[20]; + u32 optlen = 4; + + int ret = getsockopt (fd, nat_level, nat_optname, (char *) &optval, (socklen_t*)&optlen); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_GETSOCKOPT", false); + + + Memory::Write_U32(optlen, BufferOut + 0xC); + Memory::WriteBigEData((u8 *) optval, BufferOut + 0x10, optlen); + + if (optname == SO_ERROR) + { + s32 last_error = WiiSockMan::getInstance().getLastNetError(); + + Memory::Write_U32(sizeof(s32), BufferOut + 0xC); + Memory::Write_U32(last_error, BufferOut + 0x10); + } + break; + } + + case IOCTL_SO_SETSOCKOPT: + { + u32 fd = Memory::Read_U32(BufferIn); + u32 level = Memory::Read_U32(BufferIn + 4); + u32 optname = Memory::Read_U32(BufferIn + 8); + u32 optlen = Memory::Read_U32(BufferIn + 0xc); + u8 optval[20]; + Memory::ReadBigEData(optval, BufferIn + 0x10, optlen); + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_SETSOCKOPT(%08x, %08x, %08x, %08x) " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)" + "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx", + fd, level, optname, optlen, BufferIn, BufferInSize, BufferOut, BufferOutSize, optval[0], optval[1], optval[2], optval[3], optval[4], optval[5], optval[6], optval[7], optval[8], optval[9], optval[10], optval[11], optval[12], optval[13], optval[14], optval[15], optval[16], optval[17], optval[18], optval[19]); + + //TODO: bug booto about this, 0x2005 most likely timeout related, default value on wii is , 0x2001 is most likely tcpnodelay + if (level == 6 && (optname == 0x2005 || optname == 0x2001)){ + ReturnValue = 0; + break; + } + + // Do the level/optname translation + int nat_level = -1, nat_optname = -1; + + for (auto& map : opt_level_mapping) + if (level == map[1]) + nat_level = map[0]; + + for (auto& map : opt_name_mapping) + if (optname == map[1]) + nat_optname = map[0]; + + if (nat_level == -1 || nat_optname == -1) + { + INFO_LOG(WII_IPC_NET, "SO_SETSOCKOPT: unknown level %d or optname %d", level, optname); + + // Default to the given level/optname. They match on Windows... + nat_level = level; + nat_optname = optname; + } + + int ret = setsockopt(fd, nat_level, nat_optname, (char*)optval, optlen); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SETSOCKOPT", false); + break; + } + case IOCTL_SO_GETSOCKNAME: + { + u32 fd = Memory::Read_U32(BufferIn); + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETSOCKNAME " + "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); + + sockaddr sa; + socklen_t sa_len; + sa_len = sizeof(sa); + int ret = getsockname(fd, &sa, &sa_len); + + Memory::Write_U8(BufferOutSize, BufferOut); + Memory::Write_U8(sa.sa_family & 0xFF, BufferOut + 1); + Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2); + ReturnValue = ret; + break; + } + case IOCTL_SO_GETPEERNAME: + { + u32 fd = Memory::Read_U32(BufferIn); + + sockaddr sa; + socklen_t sa_len; + sa_len = sizeof(sa); + + int ret = getpeername(fd, &sa, &sa_len); + + Memory::Write_U8(BufferOutSize, BufferOut); + Memory::Write_U8(AF_INET, BufferOut + 1); + Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2); + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETPEERNAME(%x)", fd); + + ReturnValue = ret; + break; + } + + case IOCTL_SO_GETHOSTID: + { + INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTID " + "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150; + break; + } + + case IOCTL_SO_INETATON: + { + struct hostent *remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn)); + + Memory::Write_U32(Common::swap32(*(u32 *)remoteHost->h_addr_list[0]), BufferOut); + INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETATON = %d " + "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X",remoteHost->h_addr_list[0] == 0 ? -1 : 0, + (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize, Common::swap32(*(u32 *)remoteHost->h_addr_list[0])); + ReturnValue = remoteHost->h_addr_list[0] == 0 ? 0 : 1; + break; + } + + case IOCTL_SO_INETPTON: + { + INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETPTON " + "(Translating: %s)", Memory::GetPointer(BufferIn)); + ReturnValue = inet_pton((char*)Memory::GetPointer(BufferIn), Memory::GetPointer(BufferOut+4)); + break; + } + + case IOCTL_SO_INETNTOP: + { + //u32 af = Memory::Read_U32(BufferIn); + //u32 validAddress = Memory::Read_U32(BufferIn + 4); + //u32 src = Memory::Read_U32(BufferIn + 8); + char ip_s[16]; + sprintf(ip_s, "%i.%i.%i.%i", + Memory::Read_U8(BufferIn + 8), + Memory::Read_U8(BufferIn + 8 + 1), + Memory::Read_U8(BufferIn + 8 + 2), + Memory::Read_U8(BufferIn + 8 + 3) + ); + INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETNTOP %s", ip_s); + memset(Memory::GetPointer(BufferOut), 0, BufferOutSize); + memcpy(Memory::GetPointer(BufferOut), ip_s, strlen(ip_s)); + break; + } + + case IOCTL_SO_POLL: + { + // Map Wii/native poll events types + unsigned int mapping[][2] = { + { POLLIN, 0x0001 }, + { POLLOUT, 0x0008 }, + { POLLHUP, 0x0040 }, + }; + + u32 unknown = Memory::Read_U32(BufferIn); + u32 timeout = Memory::Read_U32(BufferIn + 4); + + int nfds = BufferOutSize / 0xc; + if (nfds == 0) + ERROR_LOG(WII_IPC_NET, "Hidden POLL"); + + pollfd_t* ufds = (pollfd_t *)malloc(sizeof(pollfd_t) * nfds); + if (ufds == NULL) + { + ReturnValue = -1; + break; + } + + for (int i = 0; i < nfds; i++) + { + ufds[i].fd = Memory::Read_U32(BufferOut + 0xc*i); //fd + int events = Memory::Read_U32(BufferOut + 0xc*i + 4); //events + ufds[i].revents = Memory::Read_U32(BufferOut + 0xc*i + 8); //revents + + // Translate Wii to native events + int unhandled_events = events; + ufds[i].events = 0; + for (auto& map : mapping) + { + if (events & map[1]) + ufds[i].events |= map[0]; + unhandled_events &= ~map[1]; + } + + DEBUG_LOG(WII_IPC_NET, "IOCTL_SO_POLL(%d) " + "Sock: %08x, Unknown: %08x, Events: %08x, " + "NativeEvents: %08x", + i, ufds[i].fd, unknown, events, ufds[i].events + ); + + if (unhandled_events) + ERROR_LOG(WII_IPC_NET, "SO_POLL: unhandled Wii event types: %04x", unhandled_events); + } + + int ret = poll(ufds, nfds, timeout); + ret = WiiSockMan::getNetErrorCode(ret, "SO_POLL", false); + + for (int i = 0; ih_aliases[i]; ++i) + { + INFO_LOG(WII_IPC_NET, "alias%i:%s", i, remoteHost->h_aliases[i]); + } + + for (int i = 0; remoteHost->h_addr_list[i]; ++i) + { + u32 ip = Common::swap32(*(u32*)(remoteHost->h_addr_list[i])); + char ip_s[16]; + sprintf(ip_s, "%i.%i.%i.%i", + ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff); + DEBUG_LOG(WII_IPC_NET, "addr%i:%s", i, ip_s); + } + + Memory::Memset(BufferOut, 0, BufferOutSize); + u32 wii_addr = BufferOut + 4 * 3 + 2 * 2; + + u32 name_length = (u32)strlen(remoteHost->h_name) + 1; + Memory::WriteBigEData((const u8 *)remoteHost->h_name, wii_addr, name_length); + Memory::Write_U32(wii_addr, BufferOut); + wii_addr += (name_length + 4) & ~3; + + // aliases - empty + Memory::Write_U32(wii_addr, BufferOut + 4); + Memory::Write_U32(wii_addr + sizeof(u32), wii_addr); + wii_addr += sizeof(u32); + Memory::Write_U32((u32)NULL, wii_addr); + wii_addr += sizeof(u32); + + // hardcode to ipv4 + _dbg_assert_msg_(WII_IPC_NET, + remoteHost->h_addrtype == AF_INET && remoteHost->h_length == sizeof(u32), + "returned host info is not IPv4"); + Memory::Write_U16(AF_INET, BufferOut + 8); + Memory::Write_U16(sizeof(u32), BufferOut + 10); + + // addrlist - probably only really need to return 1 anyways... + Memory::Write_U32(wii_addr, BufferOut + 12); + u32 num_addr = 0; + while (remoteHost->h_addr_list[num_addr]) + num_addr++; + for (u32 i = 0; i < num_addr; ++i) + { + Memory::Write_U32(wii_addr + sizeof(u32) * (num_addr + 1), wii_addr); + wii_addr += sizeof(u32); + } + // NULL terminated list + Memory::Write_U32((u32)NULL, wii_addr); + wii_addr += sizeof(u32); + // The actual IPs + for (int i = 0; remoteHost->h_addr_list[i]; i++) + { + Memory::Write_U32_Swap(*(u32*)(remoteHost->h_addr_list[i]), wii_addr); + wii_addr += sizeof(u32); + } + + //ERROR_LOG(WII_IPC_NET, "\n%s", + // ArrayToString(Memory::GetPointer(BufferOut), BufferOutSize, 16).c_str()); + ReturnValue = 0; + } + else + { + ReturnValue = -1; + } + + break; + } + + case IOCTL_SO_ICMPCANCEL: + ERROR_LOG(WII_IPC_NET, "IOCTL_SO_ICMPCANCEL"); + goto default_; + default: + INFO_LOG(WII_IPC_NET,"0x%x " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + Command, BufferIn, BufferInSize, BufferOut, BufferOutSize); + default_: + if (BufferInSize) + { + ERROR_LOG(WII_IPC_NET, "in addr %x size %x", BufferIn, BufferInSize); + ERROR_LOG(WII_IPC_NET, "\n%s", + ArrayToString(Memory::GetPointer(BufferIn), BufferInSize, 4).c_str() + ); + } + + if (BufferOutSize) + { + ERROR_LOG(WII_IPC_NET, "out addr %x size %x", BufferOut, BufferOutSize); + } + break; + } - u32 ReturnValue = ExecuteCommand(Command, BufferIn, BufferInSize, BufferOut, BufferOutSize); Memory::Write_U32(ReturnValue, _CommandAddress + 0x4); return true; } -struct bind_params -{ - u32 socket; - u32 has_name; - u8 name[28]; -}; -struct GC_sockaddr -{ - u8 sa_len; - u8 sa_family; - s8 sa_data[14]; -}; -struct GC_in_addr +bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress) { - u32 s_addr_; // this cannot be named s_addr under windows - collides with some crazy define. -}; + SIOCtlVBuffer CommandBuffer(CommandAddress); -struct GC_sockaddr_in -{ - u8 sin_len; - u8 sin_family; - u16 sin_port; - struct GC_in_addr sin_addr; - s8 sin_zero[8]; -}; + s32 ReturnValue = 0; -u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command, u32 _BufferIn, u32 BufferInSize, u32 BufferOut, u32 BufferOutSize) -{ - // Clean the location of the output buffer to zeros as a safety precaution */ - Memory::Memset(BufferOut, 0, BufferOutSize); - switch (_Command) + u32 _BufferIn = 0, _BufferIn2 = 0, _BufferIn3 = 0; + u32 BufferInSize = 0, BufferInSize2 = 0, BufferInSize3 = 0; + + u32 _BufferOut = 0, _BufferOut2 = 0; + u32 BufferOutSize = 0; + + if (CommandBuffer.InBuffer.size() > 0) { - case IOCTL_SO_STARTUP: - break; - - case IOCTL_SO_SOCKET: + _BufferIn = CommandBuffer.InBuffer.at(0).m_Address; + BufferInSize = CommandBuffer.InBuffer.at(0).m_Size; + } + if (CommandBuffer.InBuffer.size() > 1) { - u32 AF = Memory::Read_U32(_BufferIn); - u32 TYPE = Memory::Read_U32(_BufferIn + 0x04); - u32 PROT = Memory::Read_U32(_BufferIn + 0x04 * 2); -// u32 Unk1 = Memory::Read_U32(_BufferIn + 0x04 * 3); - u32 Socket = (u32)socket(AF, TYPE, PROT); - return Common::swap32(Socket); // So it doesn't get mangled later on - break; + _BufferIn2 = CommandBuffer.InBuffer.at(1).m_Address; + BufferInSize2 = CommandBuffer.InBuffer.at(1).m_Size; + } + if (CommandBuffer.InBuffer.size() > 2) + { + _BufferIn3 = CommandBuffer.InBuffer.at(2).m_Address; + BufferInSize3 = CommandBuffer.InBuffer.at(2).m_Size; } - case IOCTL_SO_BIND: + if (CommandBuffer.PayloadBuffer.size() > 0) { - bind_params *addr = (bind_params*)Memory::GetPointer(_BufferIn); - GC_sockaddr_in addrPC; - memcpy(&addrPC, addr->name, sizeof(GC_sockaddr_in)); - sockaddr_in address; - address.sin_family = addrPC.sin_family; - address.sin_addr.s_addr = addrPC.sin_addr.s_addr_; - address.sin_port = htons(addrPC.sin_port); - int Return = bind(addr->socket, (sockaddr*)&address, sizeof(address)); - return Return; - //int bind(int s, struct sockaddr *addr, int addrlen); - break; + _BufferOut = CommandBuffer.PayloadBuffer.at(0).m_Address; + BufferOutSize = CommandBuffer.PayloadBuffer.at(0).m_Size; } - - case IOCTL_SO_LISTEN: + if (CommandBuffer.PayloadBuffer.size() > 1) { - u32 S = Memory::Read_U32(_BufferIn); - u32 BACKLOG = Memory::Read_U32(_BufferIn + 0x04); - u32 Return = listen(S, BACKLOG); - return Return; - break; + _BufferOut2 = CommandBuffer.PayloadBuffer.at(1).m_Address; } - case IOCTL_SO_ACCEPT: - { - //TODO: (Sonic)Check if this is correct - u32 S = Memory::Read_U32(_BufferIn); - socklen_t addrlen; - struct sockaddr_in address; - u32 Return = (u32)accept(S, (struct sockaddr *)&address, &addrlen); - GC_sockaddr_in *addr = (GC_sockaddr_in*)Memory::GetPointer(BufferOut); - addr->sin_family = (u8)address.sin_family; - addr->sin_addr.s_addr_ = address.sin_addr.s_addr; - addr->sin_port = address.sin_port; - socklen_t *Len = (socklen_t *)Memory::GetPointer(BufferOut + 0x04); - *Len = addrlen; - return Return; - //int accept(int s, struct sockaddr *addr, int *addrlen); - ///dev/net/ip/top::IOCtl request 0x1 (BufferIn: (000318c0, 4), BufferOut: (00058a4c, 8) - } + u32 param = 0, param2 = 0, param3, param4, param5 = 0; - case IOCTL_SO_GETHOSTID: - return 127 << 24 | 1; - break; - - default: - INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", - _Command, _BufferIn, BufferInSize, BufferOut, BufferOutSize); - break; - } - - // We return a success for any potential unknown requests - return 0; -} - -bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 _CommandAddress) -{ - u32 ReturnValue = 0; - - SIOCtlVBuffer CommandBuffer(_CommandAddress); switch (CommandBuffer.Parameter) { - case IOCTL_SO_BIND: - case IOCTLV_SO_RECVFROM: - case IOCTL_SO_SOCKET: - case IOCTL_SO_GETHOSTID: - case IOCTL_SO_STARTUP: - //break; + case IOCTLV_SO_GETINTERFACEOPT: + { + param = Memory::Read_U32(_BufferIn); + param2 = Memory::Read_U32(_BufferIn+4); + param3 = Memory::Read_U32(_BufferOut); + param4 = Memory::Read_U32(_BufferOut2); + if (BufferOutSize >= 8) + { + param5 = Memory::Read_U32(_BufferOut+4); + } - default: - INFO_LOG(WII_IPC_NET, "NET_IP_TOP IOCtlV: 0x%08X\n", CommandBuffer.Parameter); + INFO_LOG(WII_IPC_NET,"IOCTLV_SO_GETINTERFACEOPT(%08X, %08X, %X, %X, %X) " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i) ", + param, param2, param3, param4, param5, + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2); + + switch (param2) + { + case 0xb003: // dns server table + { + u32 address = 0; +#ifdef _WIN32 + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + ULONG OutBufferLength = 0; + ULONG RetVal = 0, i; + for (i = 0; i < 5; i++) + { + RetVal = GetAdaptersAddresses( + AF_INET, + 0, + NULL, + AdapterAddresses, + &OutBufferLength); + + if (RetVal != ERROR_BUFFER_OVERFLOW) { + break; + } + + if (AdapterAddresses != NULL) { + FREE(AdapterAddresses); + } + + AdapterAddresses = (PIP_ADAPTER_ADDRESSES)MALLOC(OutBufferLength); + if (AdapterAddresses == NULL) { + RetVal = GetLastError(); + break; + } + } + if (RetVal == NO_ERROR) + { + unsigned long dwBestIfIndex = 0; + IPAddr dwDestAddr = (IPAddr)0x08080808; + // If successful, output some information from the data we received + PIP_ADAPTER_ADDRESSES AdapterList = AdapterAddresses; + if (GetBestInterface(dwDestAddr,&dwBestIfIndex) == NO_ERROR) + { + while (AdapterList) + { + if (AdapterList->IfIndex == dwBestIfIndex && + AdapterList->FirstDnsServerAddress && + AdapterList->OperStatus == IfOperStatusUp) + { + INFO_LOG(WII_IPC_NET, "Name of valid interface: %S", AdapterList->FriendlyName); + INFO_LOG(WII_IPC_NET, "DNS: %u.%u.%u.%u", + (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2], + (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[3], + (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[4], + (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[5]); + address = Common::swap32(*(u32*)(&AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2])); + break; + } + AdapterList = AdapterList->Next; + } + } + } + if (AdapterAddresses != NULL) { + FREE(AdapterAddresses); + } +#endif + if (address == 0) + address = 0x08080808; + + Memory::Write_U32(address, _BufferOut); + Memory::Write_U32(0x08080404, _BufferOut+4); break; + } + case 0x1003: // error + Memory::Write_U32(0, _BufferOut); + break; + case 0x1004: // mac address + Memory::WriteBigEData(default_address, _BufferOut, 6); + break; + case 0x1005: // link state + Memory::Write_U32(1, _BufferOut); + break; + case 0x4002: // ip addr number + Memory::Write_U32(1, _BufferOut); + break; + case 0x4003: // ip addr table + Memory::Write_U32(0xC, _BufferOut2); + Memory::Write_U32(10 << 24 | 1 << 8 | 30, _BufferOut); + Memory::Write_U32(255 << 24 | 255 << 16 | 255 << 8 | 0, _BufferOut+4); + Memory::Write_U32(10 << 24 | 0 << 16 | 255 << 8 | 255, _BufferOut+8); + break; + default: + ERROR_LOG(WII_IPC_NET, "Unknown param2: %08X", param2); + break; + } + break; + } + case IOCTLV_SO_SENDTO: + { + u32 fd = Memory::Read_U32(_BufferIn2); + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(fd, CommandAddress, IOCTLV_SO_SENDTO); + return false; + break; + } + case IOCTLV_SO_RECVFROM: + { + u32 fd = Memory::Read_U32(_BufferIn); + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(fd, CommandAddress, IOCTLV_SO_RECVFROM); + return false; + break; + } + case IOCTLV_SO_GETADDRINFO: + { + struct addrinfo hints; + struct addrinfo *result = NULL; + + if (BufferInSize3) + { + hints.ai_flags = Memory::Read_U32(_BufferIn3); + hints.ai_family = Memory::Read_U32(_BufferIn3 + 0x4); + hints.ai_socktype = Memory::Read_U32(_BufferIn3 + 0x8); + hints.ai_protocol = Memory::Read_U32(_BufferIn3 + 0xC); + hints.ai_addrlen = Memory::Read_U32(_BufferIn3 + 0x10); + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + } + + char* pNodeName = NULL; + if (BufferInSize > 0) + pNodeName = (char*)Memory::GetPointer(_BufferIn); + + char* pServiceName = NULL; + if (BufferInSize2 > 0) + pServiceName = (char*)Memory::GetPointer(_BufferIn2); + + int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : NULL, &result); + u32 addr = _BufferOut; + u32 sockoffset = addr + 0x460; + if (ret == 0) + { + while (result != NULL) + { + Memory::Write_U32(result->ai_flags, addr); + Memory::Write_U32(result->ai_family, addr + 0x04); + Memory::Write_U32(result->ai_socktype, addr + 0x08); + Memory::Write_U32(result->ai_protocol, addr + 0x0C); + Memory::Write_U32((u32)result->ai_addrlen, addr + 0x10); + // what to do? where to put? the buffer of 0x834 doesn't allow space for this + Memory::Write_U32(/*result->ai_cannonname*/ 0, addr + 0x14); + + if (result->ai_addr) + { + Memory::Write_U32(sockoffset, addr + 0x18); + Memory::Write_U16(((result->ai_addr->sa_family & 0xFF) << 8) | (result->ai_addrlen & 0xFF), sockoffset); + Memory::WriteBigEData((u8*)result->ai_addr->sa_data, sockoffset + 0x2, sizeof(result->ai_addr->sa_data)); + sockoffset += 0x1C; + } + else + { + Memory::Write_U32(0, addr + 0x18); + } + + if (result->ai_next) + { + Memory::Write_U32(addr + sizeof(addrinfo), addr + 0x1C); + } + else + { + Memory::Write_U32(0, addr + 0x1C); + } + + addr += sizeof(addrinfo); + result = result->ai_next; + } + } + else + { + // Host not found + ret = -305; + } + + INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO " + "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + _BufferIn, BufferInSize, _BufferOut, BufferOutSize); + INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetPointer(_BufferIn)); + ReturnValue = ret; + break; + } + case IOCTLV_SO_ICMPPING: + { + struct + { + u8 length; + u8 addr_family; + u16 icmp_id; + u32 ip; + } ip_info; + + u32 fd = Memory::Read_U32(_BufferIn); + u32 num_ip = Memory::Read_U32(_BufferIn + 4); + u64 timeout = Memory::Read_U64(_BufferIn + 8); + + if (num_ip != 1) + { + INFO_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING %i IPs", num_ip); + } + + ip_info.length = Memory::Read_U8(_BufferIn + 16); + ip_info.addr_family = Memory::Read_U8(_BufferIn + 17); + ip_info.icmp_id = Memory::Read_U16(_BufferIn + 18); + ip_info.ip = Memory::Read_U32(_BufferIn + 20); + + if (ip_info.length != 8 || ip_info.addr_family != AF_INET) + { + INFO_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING strange IPInfo:\n" + "length %x addr_family %x", + ip_info.length, ip_info.addr_family); + } + + DEBUG_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING %x", ip_info.ip); + + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = Common::swap32(ip_info.ip); + memset(addr.sin_zero, 0, 8); + + u8 data[0x20]; + memset(data, 0, sizeof(data)); + s32 icmp_length = sizeof(data); + + if (BufferInSize2 == sizeof(data)) + memcpy(data, Memory::GetPointer(_BufferIn2), BufferInSize2); + else + { + // TODO sequence number is incremented either statically, by + // port, or by socket. Doesn't seem to matter, so we just leave + // it 0 + ((u16 *)data)[0] = Common::swap16(ip_info.icmp_id); + icmp_length = 22; + } + + int ret = icmp_echo_req(fd, &addr, data, icmp_length); + if (ret == icmp_length) + { + ret = icmp_echo_rep(fd, &addr, (u32)timeout, icmp_length); + } + + // TODO proper error codes + ReturnValue = 0; + break; + } + default: + INFO_LOG(WII_IPC_NET,"0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)", + CommandBuffer.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2); + for (u32 i = 0; i < CommandBuffer.NumberInBuffer; ++i) + { + ERROR_LOG(WII_IPC_NET, "in %i addr %x size %x", i, + CommandBuffer.InBuffer.at(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); + ERROR_LOG(WII_IPC_NET, "\n%s", + ArrayToString( + Memory::GetPointer(CommandBuffer.InBuffer.at(i).m_Address), + CommandBuffer.InBuffer.at(i).m_Size, 4).c_str() + ); + } + for (u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; ++i) + { + ERROR_LOG(WII_IPC_NET, "out %i addr %x size %x", i, + CommandBuffer.PayloadBuffer.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); + } + break; } - Memory::Write_U32(ReturnValue, _CommandAddress+4); - return true; + Memory::Write_U32(ReturnValue, CommandAddress + 4); + return true; +} +u32 CWII_IPC_HLE_Device_net_ip_top::Update() +{ + WiiSockMan::getInstance().Update(); + return 0; } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.h index 1769e6e16f..95f75cffd7 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.h @@ -7,99 +7,390 @@ #include "WII_IPC_HLE_Device.h" +#ifdef _WIN32 +#include +#endif +#include "Timer.h" +#include "FileUtil.h" + // data layout of the network configuration file (/shared2/sys/net/02/config.dat) // needed for /dev/net/ncd/manage -#pragma pack(1) -typedef struct +#pragma pack(push, 1) +struct netcfg_proxy_t { - u8 use_proxy; // 0x00 -> no proxy; 0x01 -> proxy - u8 use_proxy_userandpass; // 0x00 -> don't use username and password; 0x01 -> use username and password + u8 use_proxy; + u8 use_proxy_userandpass; u8 padding_1[2]; u8 proxy_name[255]; u8 padding_2; - u16 proxy_port; // 0-34463 + u16 proxy_port; // 0-34463 u8 proxy_username[32]; u8 padding_3; u8 proxy_password[32]; -} netcfg_proxy_t; +}; -typedef struct +struct netcfg_connection_t { + enum + { + WIRED_IF = 1, // 0: wifi 1: wired + DNS_DHCP = 2, // 0: manual 1: DHCP + IP_DHCP = 4, // 0: manual 1: DHCP + USE_PROXY = 16, + CONNECTION_TEST_OK = 32, + CONNECTION_SELECTED = 128 + }; + + enum + { + OPEN = 0, + WEP64 = 1, + WEP128 = 2, + WPA_TKIP = 4, + WPA2_AES = 5, + WPA_AES = 6 + }; + + enum status + { + LINK_BUSY = 1, + LINK_NONE, + LINK_WIRED, + LINK_WIFI_DOWN, + LINK_WIFI_UP + }; + + enum + { + PERM_NONE = 0, + PERM_SEND_MAIL = 1, + PERM_RECV_MAIL = 2, + PERM_DOWNLOAD = 4, + PERM_ALL = PERM_SEND_MAIL | PERM_RECV_MAIL | PERM_DOWNLOAD + }; + // settings common to both wired and wireless connections - u8 flags; // Connection selected - // | ? - // | | Internet test passed - // | | | Use Proxy (1 -> on; 0 -> off) - // | | | | - // 1 0 1 0 0 1 1 0 - // | | | | - // | | | Interface (0 -> Internal wireless; 1 -> Wired LAN adapter) - // | | DNS source (0 -> Manual; 1 -> DHCP) - // | IP source (0 -> Manual; 1 -> DHCP) - // ? - + u8 flags; u8 padding_1[3]; - u8 ip[4]; u8 netmask[4]; u8 gateway[4]; u8 dns1[4]; u8 dns2[4]; u8 padding_2[2]; - - u16 mtu; // 0 or 576-1500 + u16 mtu; u8 padding_3[8]; - netcfg_proxy_t proxy_settings; u8 padding_4; - - netcfg_proxy_t proxy_settings_copy; // seems to be a duplicate of proxy_settings + netcfg_proxy_t proxy_settings_copy; u8 padding_5[1297]; // wireless specific settings - u8 ssid[32]; // access Point name. - + u8 ssid[32]; u8 padding_6; u8 ssid_length; // length of ssid in bytes. - u8 padding_7[2]; - - u8 padding_8; - u8 encryption; // (probably) encryption. OPN: 0x00, WEP64: 0x01, WEP128: 0x02 WPA-PSK (TKIP): 0x04, WPA2-PSK (AES): 0x05, WPA-PSK (AES): 0x06 - u8 padding_9[2]; - - u8 padding_10; - u8 key_length; // length of key in bytes. 0x00 for WEP64 and WEP128. - u8 unknown; // 0x00 or 0x01 toogled with a WPA-PSK (TKIP) and with a WEP entered with hex instead of ascii. - u8 padding_11; - + u8 padding_7[3]; + u8 encryption; + u8 padding_8[3]; + u8 key_length; // length of key in bytes. 0x00 for WEP64 and WEP128. + u8 unknown; // 0x00 or 0x01 toggled with a WPA-PSK (TKIP) and with a WEP entered with hex instead of ascii. + u8 padding_9; u8 key[64]; // encryption key; for WEP, key is stored 4 times (20 bytes for WEP64 and 52 bytes for WEP128) then padded with 0x00 - u8 padding_12[236]; -} netcfg_connection_t; + u8 padding_10[236]; +}; -typedef struct +struct network_config_t { - u8 header0; // 0x00 - u8 header1; // 0x00 - u8 header2; // 0x00 - u8 header3; // 0x00 - u8 header4; // 0x01 if there's at least one valid connection to the Internet. - u8 header5; // 0x00 - u8 header6; // always 0x07? - u8 header7; // 0x00 + enum + { + IF_NONE, + IF_WIFI, + IF_WIRED + }; + + u32 version; + u8 connType; + u8 linkTimeout; + u8 nwc24Permission; + u8 padding; netcfg_connection_t connection[3]; -} network_config_t; -#pragma pack() +}; + +enum nwc24_err_t +{ + WC24_OK = 0, + WC24_ERR_FATAL = -1, + WC24_ERR_ID_NONEXISTANCE = -34, + WC24_ERR_ID_GENERATED = -35, + WC24_ERR_ID_REGISTERED = -36, + WC24_ERR_ID_NOT_REGISTERED = -44, +}; + +struct nwc24_config_t +{ + enum + { + NWC24_IDCS_INITIAL = 0, + NWC24_IDCS_GENERATED = 1, + NWC24_IDCS_REGISTERED = 2 + }; + + enum + { + URL_COUNT = 0x05, + MAX_URL_LENGTH = 0x80, + MAX_EMAIL_LENGTH = 0x40, + MAX_PASSWORD_LENGTH = 0x20, + }; + + u32 magic; /* 'WcCf' 0x57634366 */ + u32 _unk_04; /* must be 8 */ + u64 nwc24_id; + u32 id_generation; + u32 creation_stage; /* 0==not_generated;1==generated;2==registered; */ + char email[MAX_EMAIL_LENGTH]; + char paswd[MAX_PASSWORD_LENGTH]; + char mlchkid[0x24]; + char http_urls[URL_COUNT][MAX_URL_LENGTH]; + u8 reserved[0xDC]; + u32 enable_booting; + u32 checksum; +}; + +#pragma pack(pop) -// ********************************************************************************** -// KD is the IOS module responsible for implementing WiiConnect24 functionality. It -// can perform HTTPS downloads, send and receive mail via SMTP, and execute a + +class NWC24Config +{ +private: + std::string path; + nwc24_config_t config; + +public: + NWC24Config() + { + path = File::GetUserPath(D_WIIWC24_IDX) + "nwc24msg.cfg"; + ReadConfig(); + } + + void ResetConfig() + { + int i; + + if (File::Exists(path)) + File::Delete(path); + + const char* urls[5] = { + "https://amw.wc24.wii.com/cgi-bin/account.cgi", + "http://rcw.wc24.wii.com/cgi-bin/check.cgi", + "http://mtw.wc24.wii.com/cgi-bin/receive.cgi", + "http://mtw.wc24.wii.com/cgi-bin/delete.cgi", + "http://mtw.wc24.wii.com/cgi-bin/send.cgi", + }; + + memset(&config, 0, sizeof(config)); + + SetMagic(0x57634366); + SetUnk(8); + SetCreationStage(nwc24_config_t::NWC24_IDCS_INITIAL); + SetEnableBooting(0); + SetEmail("@wii.com"); + + for(i=0; i 0x1F) + { + ERROR_LOG(WII_IPC_WC24, "Id gen error"); + return -14; + } + if (Unk() != 8) + return -27; + + return 0; + } + + u32 Magic(){return Common::swap32(config.magic);} + void SetMagic(u32 magic){config.magic = Common::swap32(magic);} + + u32 Unk(){return Common::swap32(config._unk_04);} + void SetUnk(u32 _unk_04){config._unk_04 = Common::swap32(_unk_04);} + + u32 IdGen(){return Common::swap32(config.id_generation);} + void SetIdGen(u32 id_generation){config.id_generation = Common::swap32(id_generation);} + void IncrementIdGen(){ + u32 id_ctr = IdGen(); + id_ctr++; + id_ctr &= 0x1F; + SetIdGen(id_ctr); + } + + u32 Checksum(){return Common::swap32(config.checksum);} + void SetChecksum(u32 checksum){config.checksum = Common::swap32(checksum);} + + u32 CreationStage(){return Common::swap32(config.creation_stage);} + void SetCreationStage(u32 creation_stage){config.creation_stage = Common::swap32(creation_stage);} + + u32 EnableBooting(){return Common::swap32(config.enable_booting);} + void SetEnableBooting(u32 enable_booting){config.enable_booting = Common::swap32(enable_booting);} + + u64 Id(){return Common::swap64(config.nwc24_id);} + void SetId(u64 nwc24_id){config.nwc24_id = Common::swap64(nwc24_id);} + + const char * Email(){return config.email;} + void SetEmail(const char * email) + { + strncpy(config.email, email, nwc24_config_t::MAX_EMAIL_LENGTH); + config.email[nwc24_config_t::MAX_EMAIL_LENGTH-1] = '\0'; + } + +}; + +class WiiNetConfig +{ + std::string path; + network_config_t config; + +public: + WiiNetConfig() + { + path = File::GetUserPath(D_WIISYSCONF_IDX) + "net/02/config.dat"; + + ReadConfig(); + } + + void ResetConfig() + { + if (File::Exists(path)) + File::Delete(path); + + memset(&config, 0, sizeof(config)); + config.connType = network_config_t::IF_WIRED; + config.connection[0].flags = + netcfg_connection_t::WIRED_IF | + netcfg_connection_t::DNS_DHCP | + netcfg_connection_t::IP_DHCP | + netcfg_connection_t::CONNECTION_TEST_OK | + netcfg_connection_t::CONNECTION_SELECTED; + + WriteConfig(); + } + + void WriteConfig() + { + if (!File::Exists(path)) + { + if (!File::CreateFullPath( + std::string(File::GetUserPath(D_WIISYSCONF_IDX) + "net/02/"))) + { + ERROR_LOG(WII_IPC_NET, "Failed to create directory for network config file"); + } + } + + File::IOFile(path, "wb").WriteBytes((void*)&config, sizeof(config)); + } + + void WriteToMem(const u32 address) + { + Memory::WriteBigEData((const u8 *)&config, address, sizeof(config)); + } + + void ReadFromMem(const u32 address) + { + Memory::ReadBigEData((u8 *)&config, address, sizeof(config)); + } + + void ReadConfig() + { + if (File::Exists(path)) + { + if (!File::IOFile(path, "rb").ReadBytes((void *)&config, sizeof(config))) + ResetConfig(); + } + else + { + ResetConfig(); + } + } +}; + + +////////////////////////////////////////////////////////////////////////// +// KD is the IOS module responsible for implementing WiiConnect24 functionality. +// It can perform HTTPS downloads, send and receive mail via SMTP, and execute a // JavaScript-like language while the Wii is in standby mode. class CWII_IPC_HLE_Device_net_kd_request : public IWII_IPC_HLE_Device { public: - CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName); + CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName); virtual ~CWII_IPC_HLE_Device_net_kd_request(); @@ -112,39 +403,55 @@ private: { IOCTL_NWC24_SUSPEND_SCHEDULAR = 0x01, IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR = 0x02, - IOCTL_NWC24_UNK_3 = 0x03, - IOCTL_NWC24_UNK_4 = 0x04, - IOCTL_NWC24_UNK_5 = 0x05, + IOCTL_NWC24_EXEC_RESUME_SCHEDULAR = 0x03, + IOCTL_NWC24_KD_GET_TIME_TRIGGERS = 0x04, + IOCTL_NWC24_SET_SCHEDULE_SPAN = 0x05, IOCTL_NWC24_STARTUP_SOCKET = 0x06, IOCTL_NWC24_CLEANUP_SOCKET = 0x07, IOCTL_NWC24_LOCK_SOCKET = 0x08, IOCTL_NWC24_UNLOCK_SOCKET = 0x09, - IOCTL_NWC24_UNK_A = 0x0A, - IOCTL_NWC24_UNK_B = 0x0B, - IOCTL_NWC24_UNK_C = 0x0C, + IOCTL_NWC24_CHECK_MAIL_NOW = 0x0A, + IOCTL_NWC24_SEND_MAIL_NOW = 0x0B, + IOCTL_NWC24_RECEIVE_MAIL_NOW = 0x0C, IOCTL_NWC24_SAVE_MAIL_NOW = 0x0D, IOCTL_NWC24_DOWNLOAD_NOW_EX = 0x0E, IOCTL_NWC24_REQUEST_GENERATED_USER_ID = 0x0F, IOCTL_NWC24_REQUEST_REGISTER_USER_ID = 0x10, IOCTL_NWC24_GET_SCHEDULAR_STAT = 0x1E, - IOCTL_NWC24_UNK_1F = 0x1F, - IOCTL_NWC24_UNK_20 = 0x20, - IOCTL_NWC24_UNK_21 = 0x21, + IOCTL_NWC24_SET_FILTER_MODE = 0x1F, + IOCTL_NWC24_SET_DEBUG_MODE = 0x20, + IOCTL_NWC24_KD_SET_NEXT_WAKEUP = 0x21, IOCTL_NWC24_SET_SCRIPT_MODE = 0x22, IOCTL_NWC24_REQUEST_SHUTDOWN = 0x28, }; - // Max size 32 Bytes - std::string m_UserID; + enum { + MODEL_RVT = 0, + MODEL_RVV = 0, + MODEL_RVL = 1, + MODEL_RVD = 2, + MODEL_ELSE = 7 + }; + + u8 GetAreaCode(const char * area); + u8 GetHardwareModel(const char * model); + + s32 NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, u8 hardware_model, u8 area_code); + + NWC24Config config; }; -// ********************************************************************************** + +////////////////////////////////////////////////////////////////////////// class CWII_IPC_HLE_Device_net_kd_time : public IWII_IPC_HLE_Device { public: - CWII_IPC_HLE_Device_net_kd_time(u32 _DeviceID, const std::string& _rDeviceName) : - IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) - {} + CWII_IPC_HLE_Device_net_kd_time(u32 _DeviceID, const std::string& _rDeviceName) + : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) + , rtc() + , utcdiff() + { + } virtual ~CWII_IPC_HLE_Device_net_kd_time() {} @@ -164,64 +471,124 @@ public: return true; } - virtual bool IOCtl(u32 _CommandAddress) + virtual bool IOCtl(u32 _CommandAddress) { u32 Parameter = Memory::Read_U32(_CommandAddress + 0x0C); u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); - u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); - u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); + + u32 result = 0; + u32 common_result = 0; + // TODO Writes stuff to /shared2/nwc24/misc.bin + //u32 update_misc = 0; switch (Parameter) { - case IOCTL_NW24_SET_RTC_COUNTER: // NWC24iSetRtcCounter (but prolly just the first 4 bytes are intresting...) - _dbg_assert_msg_(WII_IPC_NET, BufferInSize==0x20, "NET_KD_TIME: Set RTC Counter BufferIn to small"); - _dbg_assert_msg_(WII_IPC_NET, BufferOutSize==0x20, "NET_KD_TIME: Set RTC Counter BufferOut to small"); + case IOCTL_NW24_GET_UNIVERSAL_TIME: + Memory::Write_U64(GetAdjustedUTC(), BufferOut + 4); + break; - for (int i=0; i<0x20; i++) - { - m_RtcCounter[i] = Memory::Read_U8(BufferIn+i); - } + case IOCTL_NW24_SET_UNIVERSAL_TIME: + SetAdjustedUTC(Memory::Read_U64(BufferIn)); + //update_misc = Memory::Read_U32(BufferIn + 8); + break; - // send back for sync?? at least there is a out buffer... - for (int i=0; i<0x20; i++) - { - Memory::Write_U8(m_RtcCounter[i], BufferOut+i); - } + case IOCTL_NW24_SET_RTC_COUNTER: + rtc = Memory::Read_U32(BufferIn); + //update_misc = Memory::Read_U32(BufferIn + 4); + break; - INFO_LOG(WII_IPC_NET, "NET_KD_TIME: Set RTC Counter"); + case IOCTL_NW24_GET_TIME_DIFF: + Memory::Write_U64(GetAdjustedUTC() - rtc, BufferOut + 4); + break; - Memory::Write_U32(0, _CommandAddress + 0x4); - return true; + case IOCTL_NW24_UNIMPLEMENTED: + result = -9; + break; - case IOCTL_NW24_GET_TIME_DIFF: // Input: none, Output: 32 default: - ERROR_LOG(WII_IPC_NET, "%s - IOCtl:\n" - " Parameter: 0x%x (0x17 NWC24iSetRtcCounter) \n" - " BufferIn: 0x%08x\n" - " BufferInSize: 0x%08x\n" - " BufferOut: 0x%08x\n" - " BufferOutSize: 0x%08x\n", - GetDeviceName().c_str(), Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); + ERROR_LOG(WII_IPC_NET, "%s - unknown IOCtl: %x\n", + GetDeviceName().c_str(), Parameter); break; } - // write return value - Memory::Write_U32(0, _CommandAddress + 0x4); + // write return values + Memory::Write_U32(common_result, BufferOut); + Memory::Write_U32(result, _CommandAddress + 4); return true; } private: enum { - IOCTL_NW24_SET_RTC_COUNTER = 0x17, - IOCTL_NW24_GET_TIME_DIFF = 0x18, + IOCTL_NW24_GET_UNIVERSAL_TIME = 0x14, + IOCTL_NW24_SET_UNIVERSAL_TIME = 0x15, + IOCTL_NW24_UNIMPLEMENTED = 0x16, + IOCTL_NW24_SET_RTC_COUNTER = 0x17, + IOCTL_NW24_GET_TIME_DIFF = 0x18, }; - u8 m_RtcCounter[0x20]; + u64 rtc; + s64 utcdiff; + + // Seconds between 1.1.1970 and 4.1.2008 16:00:38 + static const u64 wii_bias = 0x477E5826; + + // Returns seconds since wii epoch + // +/- any bias set from IOCTL_NW24_SET_UNIVERSAL_TIME + u64 GetAdjustedUTC() const + { + return Common::Timer::GetTimeSinceJan1970() - wii_bias + utcdiff; + } + + // Store the difference between what the wii thinks is UTC and + // what the host OS thinks + void SetAdjustedUTC(u64 wii_utc) + { + utcdiff = Common::Timer::GetTimeSinceJan1970() - wii_bias - wii_utc; + } }; -// ********************************************************************************** +enum NET_IOCTL +{ + IOCTL_SO_ACCEPT = 1, + IOCTL_SO_BIND, + IOCTL_SO_CLOSE, + IOCTL_SO_CONNECT, + IOCTL_SO_FCNTL, + IOCTL_SO_GETPEERNAME, + IOCTL_SO_GETSOCKNAME, + IOCTL_SO_GETSOCKOPT, + IOCTL_SO_SETSOCKOPT, + IOCTL_SO_LISTEN, + IOCTL_SO_POLL, + IOCTLV_SO_RECVFROM, + IOCTLV_SO_SENDTO, + IOCTL_SO_SHUTDOWN, + IOCTL_SO_SOCKET, + IOCTL_SO_GETHOSTID, + IOCTL_SO_GETHOSTBYNAME, + IOCTL_SO_GETHOSTBYADDR, + IOCTLV_SO_GETNAMEINFO, + IOCTL_SO_UNK14, + IOCTL_SO_INETATON, + IOCTL_SO_INETPTON, + IOCTL_SO_INETNTOP, + IOCTLV_SO_GETADDRINFO, + IOCTL_SO_SOCKATMARK, + IOCTLV_SO_UNK1A, + IOCTLV_SO_UNK1B, + IOCTLV_SO_GETINTERFACEOPT, + IOCTLV_SO_SETINTERFACEOPT, + IOCTL_SO_SETINTERFACE, + IOCTL_SO_STARTUP, + IOCTL_SO_ICMPSOCKET = 0x30, + IOCTLV_SO_ICMPPING, + IOCTL_SO_ICMPCANCEL, + IOCTL_SO_ICMPCLOSE +}; + +////////////////////////////////////////////////////////////////////////// class CWII_IPC_HLE_Device_net_ip_top : public IWII_IPC_HLE_Device { public: @@ -233,48 +600,15 @@ public: virtual bool Close(u32 _CommandAddress, bool _bForce); virtual bool IOCtl(u32 _CommandAddress); virtual bool IOCtlV(u32 _CommandAddress); - -private: - enum - { - IOCTL_SO_ACCEPT = 1, - IOCTL_SO_BIND, - IOCTL_SO_CLOSE, - IOCTL_SO_CONNECT, - IOCTL_SO_FCNTL, - IOCTL_SO_GETPEERNAME, - IOCTL_SO_GETSOCKNAME, - IOCTL_SO_GETSOCKOPT, - IOCTL_SO_SETSOCKOPT, - IOCTL_SO_LISTEN, - IOCTL_SO_POLL, - IOCTLV_SO_RECVFROM, - IOCTLV_SO_SENDTO, - IOCTL_SO_SHUTDOWN, - IOCTL_SO_SOCKET, - IOCTL_SO_GETHOSTID, - IOCTL_SO_GETHOSTBYNAME, - IOCTL_SO_GETHOSTBYADDR, - IOCTLV_SO_GETNAMEINFO, - IOCTL_SO_UNK14, - IOCTL_SO_INETATON, - IOCTL_SO_INETPTON, - IOCTL_SO_INETNTOP, - IOCTLV_SO_GETADDRINFO, - IOCTL_SO_SOCKATMARK, - IOCTLV_SO_UNK1A, - IOCTLV_SO_UNK1B, - IOCTLV_SO_GETINTERFACEOPT, - IOCTLV_SO_SETINTERFACEOPT, - IOCTL_SO_SETINTERFACE, - IOCTL_SO_STARTUP, - IOCTL_SO_ICMPSOCKET = 0x30, - IOCTLV_SO_ICMPPING, - IOCTL_SO_ICMPCANCEL, - IOCTL_SO_ICMPCLOSE - }; + virtual u32 Update(); + +private: +#ifdef _WIN32 + WSADATA InitData; +#endif u32 ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize); + u32 ExecuteCommandV(SIOCtlVBuffer& CommandBuffer); }; // ********************************************************************************** @@ -291,16 +625,113 @@ public: virtual bool IOCtlV(u32 _CommandAddress); private: - enum { - IOCTLV_NCD_UNK1 = 0x1, // NCDLockWirelessDriver - IOCTLV_NCD_UNK2 = 0x2, // NCDUnlockWirelessDriver - IOCTLV_NCD_READCONFIG = 0x3, // NCDReadConfig? - IOCTLV_NCD_UNK4 = 0x4, - IOCTLV_NCD_GETLINKSTATUS = 0x7, // NCDGetLinkStatus - IOCTLV_NCD_GETWIRELESSMACADDRESS = 0x8, // NCDGetWirelessMacAddress + enum + { + IOCTLV_NCD_LOCKWIRELESSDRIVER = 0x1, // NCDLockWirelessDriver + IOCTLV_NCD_UNLOCKWIRELESSDRIVER = 0x2, // NCDUnlockWirelessDriver + IOCTLV_NCD_GETCONFIG = 0x3, // NCDiGetConfig + IOCTLV_NCD_SETCONFIG = 0x4, // NCDiSetConfig + IOCTLV_NCD_READCONFIG = 0x5, + IOCTLV_NCD_WRITECONFIG = 0x6, + IOCTLV_NCD_GETLINKSTATUS = 0x7, // NCDGetLinkStatus + IOCTLV_NCD_GETWIRELESSMACADDRESS = 0x8, // NCDGetWirelessMacAddress }; - network_config_t m_Ifconfig; + WiiNetConfig config; +}; + +////////////////////////////////////////////////////////////////////////// +class CWII_IPC_HLE_Device_net_wd_command : public IWII_IPC_HLE_Device +{ +public: + CWII_IPC_HLE_Device_net_wd_command(u32 DeviceID, const std::string& DeviceName); + + virtual ~CWII_IPC_HLE_Device_net_wd_command(); + + virtual bool Open(u32 CommandAddress, u32 Mode); + virtual bool Close(u32 CommandAddress, bool Force); + virtual bool IOCtlV(u32 CommandAddress); + +private: + enum + { + IOCTLV_WD_GET_MODE = 0x1001, // WD_GetMode + IOCTLV_WD_SET_LINKSTATE = 0x1002, // WD_SetLinkState + IOCTLV_WD_GET_LINKSTATE = 0x1003, // WD_GetLinkState + IOCTLV_WD_SET_CONFIG = 0x1004, // WD_SetConfig + IOCTLV_WD_GET_CONFIG = 0x1005, // WD_GetConfig + IOCTLV_WD_CHANGE_BEACON = 0x1006, // WD_ChangeBeacon + IOCTLV_WD_DISASSOC = 0x1007, // WD_DisAssoc + IOCTLV_WD_MP_SEND_FRAME = 0x1008, // WD_MpSendFrame + IOCTLV_WD_SEND_FRAME = 0x1009, // WD_SendFrame + IOCTLV_WD_SCAN = 0x100a, // WD_Scan + IOCTLV_WD_CALL_WL = 0x100c, // WD_CallWL + IOCTLV_WD_MEASURE_CHANNEL = 0x100b, // WD_MeasureChannel + IOCTLV_WD_GET_LASTERROR = 0x100d, // WD_GetLastError + IOCTLV_WD_GET_INFO = 0x100e, // WD_GetInfo + IOCTLV_WD_CHANGE_GAMEINFO = 0x100f, // WD_ChangeGameInfo + IOCTLV_WD_CHANGE_VTSF = 0x1010, // WD_ChangeVTSF + IOCTLV_WD_RECV_FRAME = 0x8000, // WD_ReceiveFrame + IOCTLV_WD_RECV_NOTIFICATION = 0x8001 // WD_ReceiveNotification + }; + + enum + { + BSSID_SIZE = 6, + SSID_SIZE = 32 + }; + + enum + { + SCAN_ACTIVE, + SCAN_PASSIVE + }; + +#pragma pack(push, 1) + struct ScanInfo + { + u16 channel_bitmap; + u16 max_channel_time; + u8 bssid[BSSID_SIZE]; + u16 scan_type; + u16 ssid_length; + u8 ssid[SSID_SIZE]; + u8 ssid_match_mask[SSID_SIZE]; + }; + + struct BSSInfo + { + u16 length; + u16 rssi; + u8 bssid[BSSID_SIZE]; + u16 ssid_length; + u8 ssid[SSID_SIZE]; + u16 capabilities; + struct rate + { + u16 basic; + u16 support; + }; + u16 beacon_period; + u16 DTIM_period; + u16 channel; + u16 CF_period; + u16 CF_max_duration; + u16 element_info_length; + u16 element_info[1]; + }; + + struct Info + { + u8 mac[6]; + u16 ntr_allowed_channels; + u16 unk8; + char country[2]; + u32 unkc; + char wlversion[0x50]; + u8 unk[0x30]; + }; +#pragma pack(pop) }; #endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp new file mode 100644 index 0000000000..36d4b2de19 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp @@ -0,0 +1,502 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "FileUtil.h" +#include "WII_IPC_HLE_Device_net_ssl.h" +#include "WII_Socket.h" + +WII_SSL CWII_IPC_HLE_Device_net_ssl::_SSL[NET_SSL_MAXINSTANCES]; + +CWII_IPC_HLE_Device_net_ssl::CWII_IPC_HLE_Device_net_ssl(u32 _DeviceID, const std::string& _rDeviceName) + : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) +{ + for (int i = 0; i < NET_SSL_MAXINSTANCES; ++i) + { + memset(&_SSL[i], 0, sizeof(WII_SSL)); + } +} + +CWII_IPC_HLE_Device_net_ssl::~CWII_IPC_HLE_Device_net_ssl() +{ + // Cleanup sessions + for (int i = 0; i < NET_SSL_MAXINSTANCES; i++) + { + if (_SSL[i].active) + { + ssl_close_notify(&_SSL[i].ctx); + ssl_session_free(&_SSL[i].session); + ssl_free(&_SSL[i].ctx); + + x509_free(&_SSL[i].cacert); + x509_free(&_SSL[i].clicert); + + memset(&_SSL[i].ctx, 0, sizeof(ssl_context)); + memset(&_SSL[i].session, 0, sizeof(ssl_session)); + memset(&_SSL[i].hs, 0, sizeof(havege_state)); + memset(_SSL[i].hostname, 0, NET_SSL_MAX_HOSTNAME_LEN); + + _SSL[i].active = false; + } + } +} + +int CWII_IPC_HLE_Device_net_ssl::getSSLFreeID() +{ + for (int i = 0; i < NET_SSL_MAXINSTANCES; i++) + { + if (!_SSL[i].active) + { + return i + 1; + } + } + return 0; +} + +bool CWII_IPC_HLE_Device_net_ssl::Open(u32 _CommandAddress, u32 _Mode) +{ + Memory::Write_U32(GetDeviceID(), _CommandAddress+4); + m_Active = true; + return true; +} + +bool CWII_IPC_HLE_Device_net_ssl::Close(u32 _CommandAddress, bool _bForce) +{ + if (!_bForce) + { + Memory::Write_U32(0, _CommandAddress + 4); + } + m_Active = false; + return true; +} + +bool CWII_IPC_HLE_Device_net_ssl::IOCtl(u32 _CommandAddress) +{ + u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); + u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); + u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); + u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); + u32 Command = Memory::Read_U32(_CommandAddress + 0x0C); + + INFO_LOG(WII_IPC_SSL, "%s unknown %i " + "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + GetDeviceName().c_str(), Command, + BufferIn, BufferInSize, BufferOut, BufferOutSize); + Memory::Write_U32(0, _CommandAddress + 0x4); + return true; +} + +bool CWII_IPC_HLE_Device_net_ssl::IOCtlV(u32 _CommandAddress) +{ + SIOCtlVBuffer CommandBuffer(_CommandAddress); + + u32 _BufferIn = 0, _BufferIn2 = 0, _BufferIn3 = 0; + u32 BufferInSize = 0, BufferInSize2 = 0, BufferInSize3 = 0; + + u32 BufferOut = 0, BufferOut2 = 0, BufferOut3 = 0; + u32 BufferOutSize = 0, BufferOutSize2 = 0, BufferOutSize3 = 0; + + if (CommandBuffer.InBuffer.size() > 0) + { + _BufferIn = CommandBuffer.InBuffer.at(0).m_Address; + BufferInSize = CommandBuffer.InBuffer.at(0).m_Size; + } + if (CommandBuffer.InBuffer.size() > 1) + { + _BufferIn2 = CommandBuffer.InBuffer.at(1).m_Address; + BufferInSize2 = CommandBuffer.InBuffer.at(1).m_Size; + } + if (CommandBuffer.InBuffer.size() > 2) + { + _BufferIn3 = CommandBuffer.InBuffer.at(2).m_Address; + BufferInSize3 = CommandBuffer.InBuffer.at(2).m_Size; + } + + if (CommandBuffer.PayloadBuffer.size() > 0) + { + BufferOut = CommandBuffer.PayloadBuffer.at(0).m_Address; + BufferOutSize = CommandBuffer.PayloadBuffer.at(0).m_Size; + } + if (CommandBuffer.PayloadBuffer.size() > 1) + { + BufferOut2 = CommandBuffer.PayloadBuffer.at(1).m_Address; + BufferOutSize2 = CommandBuffer.PayloadBuffer.at(1).m_Size; + } + if (CommandBuffer.PayloadBuffer.size() > 2) + { + BufferOut3 = CommandBuffer.PayloadBuffer.at(2).m_Address; + BufferOutSize3 = CommandBuffer.PayloadBuffer.at(2).m_Size; + } + + switch (CommandBuffer.Parameter) + { + case IOCTLV_NET_SSL_NEW: + { + int verifyOption = Memory::Read_U32(BufferOut); + const char * hostname = (const char*) Memory::GetPointer(BufferOut2); + + int freeSSL = this->getSSLFreeID(); + if (freeSSL) + { + int sslID = freeSSL - 1; + int ret = ssl_init(&_SSL[sslID].ctx); + if (ret) + { + // Cleanup possibly dirty ctx + memset(&_SSL[sslID].ctx, 0, sizeof(ssl_context)); + goto _SSL_NEW_ERROR; + } + + havege_init(&_SSL[sslID].hs); + ssl_set_rng(&_SSL[sslID].ctx, havege_random, &_SSL[sslID].hs); + + // For some reason we can't use TLSv1.2, v1.1 and below are fine! + ssl_set_max_version(&_SSL[sslID].ctx, SSL_MAJOR_VERSION_3, SSL_MINOR_VERSION_2); + + ssl_set_ciphersuites(&_SSL[sslID].ctx, ssl_default_ciphersuites); + ssl_set_session(&_SSL[sslID].ctx, &_SSL[sslID].session); + + ssl_set_endpoint(&_SSL[sslID].ctx, SSL_IS_CLIENT); + ssl_set_authmode(&_SSL[sslID].ctx, SSL_VERIFY_NONE); + ssl_set_renegotiation(&_SSL[sslID].ctx, SSL_RENEGOTIATION_ENABLED); + + memcpy(_SSL[sslID].hostname, hostname, min((int)BufferOutSize2, NET_SSL_MAX_HOSTNAME_LEN)); + _SSL[sslID].hostname[NET_SSL_MAX_HOSTNAME_LEN-1] = '\0'; + ssl_set_hostname(&_SSL[sslID].ctx, _SSL[sslID].hostname); + + _SSL[sslID].active = true; + Memory::Write_U32(freeSSL, _BufferIn); + } + else + { +_SSL_NEW_ERROR: + Memory::Write_U32(SSL_ERR_FAILED, _BufferIn); + } + + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_NEW (%d, %s) " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + verifyOption, hostname, + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_SHUTDOWN: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + ssl_close_notify(&_SSL[sslID].ctx); + ssl_session_free(&_SSL[sslID].session); + ssl_free(&_SSL[sslID].ctx); + + x509_free(&_SSL[sslID].cacert); + x509_free(&_SSL[sslID].clicert); + + memset(&_SSL[sslID].ctx, 0, sizeof(ssl_context)); + memset(&_SSL[sslID].session, 0, sizeof(ssl_session)); + memset(&_SSL[sslID].hs, 0, sizeof(havege_state)); + memset(_SSL[sslID].hostname, 0, NET_SSL_MAX_HOSTNAME_LEN); + + _SSL[sslID].active = false; + + Memory::Write_U32(SSL_OK, _BufferIn); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SHUTDOWN " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_SETROOTCA: + { + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETROOTCA " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + + + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + int ret = x509parse_crt_der( + &_SSL[sslID].cacert, + Memory::GetPointer(BufferOut2), + BufferOutSize2); + + if (ret) + { + Memory::Write_U32(SSL_ERR_FAILED, _BufferIn); + } + else + { + ssl_set_ca_chain(&_SSL[sslID].ctx, &_SSL[sslID].cacert, NULL, _SSL[sslID].hostname); + Memory::Write_U32(SSL_OK, _BufferIn); + } + + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETROOTCA = %d", ret); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + break; + } + case IOCTLV_NET_SSL_SETBUILTINCLIENTCERT: + { + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINCLIENTCERT " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + std::string cert_base_path(File::GetUserPath(D_WIIUSER_IDX)); + int ret = x509parse_crtfile(&_SSL[sslID].clicert, (cert_base_path + "clientca.pem").c_str()); + int rsa_ret = x509parse_keyfile(&_SSL[sslID].rsa, (cert_base_path + "clientcakey.pem").c_str(), NULL); + if (ret || rsa_ret) + { + x509_free(&_SSL[sslID].clicert); + rsa_free(&_SSL[sslID].rsa); + memset(&_SSL[sslID].clicert, 0, sizeof(x509_cert)); + memset(&_SSL[sslID].rsa, 0, sizeof(rsa_context)); + Memory::Write_U32(SSL_ERR_FAILED, _BufferIn); + } + else + { + ssl_set_own_cert(&_SSL[sslID].ctx, &_SSL[sslID].clicert, &_SSL[sslID].rsa); + Memory::Write_U32(SSL_OK, _BufferIn); + } + + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINCLIENTCERT = (%d, %d)", ret, rsa_ret); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINCLIENTCERT invalid sslID = %d", sslID); + } + break; + } + case IOCTLV_NET_SSL_REMOVECLIENTCERT: + { + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_REMOVECLIENTCERT " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + x509_free(&_SSL[sslID].clicert); + rsa_free(&_SSL[sslID].rsa); + memset(&_SSL[sslID].clicert, 0, sizeof(x509_cert)); + memset(&_SSL[sslID].rsa, 0, sizeof(rsa_context)); + + ssl_set_own_cert(&_SSL[sslID].ctx, NULL, NULL); + Memory::Write_U32(SSL_OK, _BufferIn); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINCLIENTCERT invalid sslID = %d", sslID); + } + break; + } + case IOCTLV_NET_SSL_SETBUILTINROOTCA: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + std::string cert_base_path(File::GetUserPath(D_WIIUSER_IDX)); + + int ret = x509parse_crtfile(&_SSL[sslID].cacert, (cert_base_path + "rootca.pem").c_str()); + if (ret) + { + x509_free(&_SSL[sslID].clicert); + Memory::Write_U32(SSL_ERR_FAILED, _BufferIn); + } + else + { + ssl_set_ca_chain(&_SSL[sslID].ctx, &_SSL[sslID].cacert, NULL, _SSL[sslID].hostname); + Memory::Write_U32(SSL_OK, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINROOTCA = %d", ret); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETBUILTINROOTCA " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_CONNECT: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + _SSL[sslID].sockfd = Memory::Read_U32(BufferOut2); + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_CONNECT socket = %d", _SSL[sslID].sockfd); + ssl_set_bio(&_SSL[sslID].ctx, net_recv, &_SSL[sslID].sockfd, net_send, &_SSL[sslID].sockfd); + Memory::Write_U32(SSL_OK, _BufferIn); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_CONNECT " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_DOHANDSHAKE: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(_SSL[sslID].sockfd, _CommandAddress, IOCTLV_NET_SSL_DOHANDSHAKE); + return false; + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + break; + } + case IOCTLV_NET_SSL_WRITE: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(_SSL[sslID].sockfd, _CommandAddress, IOCTLV_NET_SSL_WRITE); + return false; + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_WRITE " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + INFO_LOG(WII_IPC_SSL, "%s", Memory::GetPointer(BufferOut2)); + break; + } + case IOCTLV_NET_SSL_READ: + { + + int ret = 0; + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + WiiSockMan &sm = WiiSockMan::getInstance(); + sm.doSock(_SSL[sslID].sockfd, _CommandAddress, IOCTLV_NET_SSL_READ); + return false; + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_READ(%d)" + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + ret, + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_SETROOTCADEFAULT: + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + Memory::Write_U32(SSL_OK, _BufferIn); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETROOTCADEFAULT " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + case IOCTLV_NET_SSL_SETCLIENTCERTDEFAULT: + { + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_SETCLIENTCERTDEFAULT " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + Memory::Write_U32(SSL_OK, _BufferIn); + } + else + { + Memory::Write_U32(SSL_ERR_ID, _BufferIn); + } + break; + } + default: + ERROR_LOG(WII_IPC_SSL, "%i " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), " + "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)", + CommandBuffer.Parameter, + _BufferIn, BufferInSize, _BufferIn2, BufferInSize2, + _BufferIn3, BufferInSize3, BufferOut, BufferOutSize, + BufferOut2, BufferOutSize2, BufferOut3, BufferOutSize3); + break; + } + + // SSL return codes are written to BufferIn + Memory::Write_U32(0, _CommandAddress+4); + + return true; +} + diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h new file mode 100644 index 0000000000..b8494d43d0 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h @@ -0,0 +1,89 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _WII_IPC_HLE_DEVICE_NET_SSL_H_ +#define _WII_IPC_HLE_DEVICE_NET_SSL_H_ + +#include "WII_IPC_HLE_Device.h" + +#include +#include +#include + +#define NET_SSL_MAX_HOSTNAME_LEN 256 +#define NET_SSL_MAXINSTANCES 4 + +#define SSLID_VALID(x) (x >= 0 && x < NET_SSL_MAXINSTANCES && CWII_IPC_HLE_Device_net_ssl::_SSL[x].active) + +enum ssl_err_t +{ + SSL_OK = 0, + SSL_ERR_FAILED = -1, + SSL_ERR_RAGAIN = -2, + SSL_ERR_WAGAIN = -3, + SSL_ERR_SYSCALL = -5, + SSL_ERR_ZERO = -6, // read or write returned 0 + SSL_ERR_CAGAIN = -7, // BIO not connected + SSL_ERR_ID = -8, // invalid SSL id + SSL_ERR_VCOMMONNAME = -9, // verify failed: common name + SSL_ERR_VROOTCA = -10, // verify failed: root ca + SSL_ERR_VCHAIN = -11, // verify failed: certificate chain + SSL_ERR_VDATE = -12, // verify failed: date invalid + SSL_ERR_SERVER_CERT = -13, // certificate cert invalid +}; + +enum SSL_IOCTL +{ + IOCTLV_NET_SSL_NEW = 0x01, + IOCTLV_NET_SSL_CONNECT = 0x02, + IOCTLV_NET_SSL_DOHANDSHAKE = 0x03, + IOCTLV_NET_SSL_READ = 0x04, + IOCTLV_NET_SSL_WRITE = 0x05, + IOCTLV_NET_SSL_SHUTDOWN = 0x06, + IOCTLV_NET_SSL_SETCLIENTCERT = 0x07, + IOCTLV_NET_SSL_SETCLIENTCERTDEFAULT = 0x08, + IOCTLV_NET_SSL_REMOVECLIENTCERT = 0x09, + IOCTLV_NET_SSL_SETROOTCA = 0x0A, + IOCTLV_NET_SSL_SETROOTCADEFAULT = 0x0B, + IOCTLV_NET_SSL_DOHANDSHAKEEX = 0x0C, + IOCTLV_NET_SSL_SETBUILTINROOTCA = 0x0D, + IOCTLV_NET_SSL_SETBUILTINCLIENTCERT = 0x0E, + IOCTLV_NET_SSL_DISABLEVERIFYOPTIONFORDEBUG = 0x0F, + IOCTLV_NET_SSL_DEBUGGETVERSION = 0x14, + IOCTLV_NET_SSL_DEBUGGETTIME = 0x15, +}; + +typedef struct { + ssl_context ctx; + ssl_session session; + havege_state hs; + x509_cert cacert; + x509_cert clicert; + rsa_context rsa; + int sockfd; + char hostname[NET_SSL_MAX_HOSTNAME_LEN]; + bool active; +} WII_SSL; + +class CWII_IPC_HLE_Device_net_ssl : public IWII_IPC_HLE_Device +{ +public: + + CWII_IPC_HLE_Device_net_ssl(u32 _DeviceID, const std::string& _rDeviceName); + + virtual ~CWII_IPC_HLE_Device_net_ssl(); + + virtual bool Open(u32 _CommandAddress, u32 _Mode); + + virtual bool Close(u32 _CommandAddress, bool _bForce); + + virtual bool IOCtl(u32 _CommandAddress); + virtual bool IOCtlV(u32 _CommandAddress); + int getSSLFreeID(); + + static WII_SSL _SSL[NET_SSL_MAXINSTANCES]; + +}; + +#endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.cpp index 68b38633ac..0b8e8bb53e 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.cpp @@ -22,6 +22,19 @@ CWII_IPC_HLE_Device_sdio_slot0::CWII_IPC_HLE_Device_sdio_slot0(u32 _DeviceID, co , m_Card(NULL) {} +void CWII_IPC_HLE_Device_sdio_slot0::DoState(PointerWrap& p) +{ + DoStateShared(p); + if (p.GetMode() == PointerWrap::MODE_READ) + { + OpenInternal(); + } + p.Do(m_Status); + p.Do(m_BlockLength); + p.Do(m_BusWidth); + p.Do(m_Registers); +} + void CWII_IPC_HLE_Device_sdio_slot0::EventNotify() { if ((SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_INSERT) || @@ -34,10 +47,8 @@ void CWII_IPC_HLE_Device_sdio_slot0::EventNotify() } } -bool CWII_IPC_HLE_Device_sdio_slot0::Open(u32 _CommandAddress, u32 _Mode) +void CWII_IPC_HLE_Device_sdio_slot0::OpenInternal() { - INFO_LOG(WII_IPC_SD, "Open"); - const std::string filename = File::GetUserPath(D_WIIUSER_IDX) + "sd.raw"; m_Card.Open(filename, "r+b"); if (!m_Card) @@ -53,8 +64,16 @@ bool CWII_IPC_HLE_Device_sdio_slot0::Open(u32 _CommandAddress, u32 _Mode) ERROR_LOG(WII_IPC_SD, "Could not open SD Card image or create a new one, are you running from a read-only directory?"); } } +} + +bool CWII_IPC_HLE_Device_sdio_slot0::Open(u32 _CommandAddress, u32 _Mode) +{ + INFO_LOG(WII_IPC_SD, "Open"); + + OpenInternal(); Memory::Write_U32(GetDeviceID(), _CommandAddress + 0x4); + memset(m_Registers, 0, sizeof(m_Registers)); m_Active = true; return true; } @@ -74,7 +93,7 @@ bool CWII_IPC_HLE_Device_sdio_slot0::Close(u32 _CommandAddress, bool _bForce) } // The front SD slot -bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress) +bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress) { u32 Cmd = Memory::Read_U32(_CommandAddress + 0xC); @@ -82,11 +101,11 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress) u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); - + // As a safety precaution we fill the out buffer with zeros to avoid // returning nonsense values Memory::Memset(BufferOut, 0, BufferOutSize); - + u32 ReturnValue = 0; switch (Cmd) { case IOCTL_WRITEHCR: @@ -96,20 +115,26 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress) DEBUG_LOG(WII_IPC_SD, "IOCTL_WRITEHCR 0x%08x - 0x%08x", reg, val); + if (reg >= 0x200) + { + DEBUG_LOG(WII_IPC_SD, "IOCTL_WRITEHCR out of range"); + break; + } + if ((reg == HCR_CLOCKCONTROL) && (val & 1)) { // Clock is set to oscillate, enable bit 1 to say it's stable - Memory::Write_U32(val | 2, SDIO_BASE + reg); + m_Registers[reg] = val | 2; } else if ((reg == HCR_SOFTWARERESET) && val) { // When a reset is specified, the register gets cleared - Memory::Write_U32(0, SDIO_BASE + reg); + m_Registers[reg] = 0; } else { // Default to just storing the new value - Memory::Write_U32(val, SDIO_BASE + reg); + m_Registers[reg] = val; } } break; @@ -117,9 +142,16 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress) case IOCTL_READHCR: { u32 reg = Memory::Read_U32(BufferIn); - u32 val = Memory::Read_U32(SDIO_BASE + reg); + if (reg >= 0x200) + { + DEBUG_LOG(WII_IPC_SD, "IOCTL_READHCR out of range"); + break; + } + + u32 val = m_Registers[reg]; DEBUG_LOG(WII_IPC_SD, "IOCTL_READHCR 0x%08x - 0x%08x", reg, val); + // Just reading the register Memory::Write_U32(val, BufferOut); } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.h index 74ffe13410..d59f7e0a0a 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_sdio_slot0.h @@ -15,20 +15,17 @@ public: CWII_IPC_HLE_Device_sdio_slot0(u32 _DeviceID, const std::string& _rDeviceName); + virtual void DoState(PointerWrap& p); + bool Open(u32 _CommandAddress, u32 _Mode); bool Close(u32 _CommandAddress, bool _bForce); - bool IOCtl(u32 _CommandAddress); + bool IOCtl(u32 _CommandAddress); bool IOCtlV(u32 _CommandAddress); void EventNotify(); private: - enum - { - SDIO_BASE = 0x8d070000, - }; - // SD Host Controller Registers enum { @@ -37,7 +34,7 @@ private: }; // IOCtl - enum + enum { IOCTL_WRITEHCR = 0x01, IOCTL_READHCR = 0x02, @@ -119,11 +116,14 @@ private: u32 m_BlockLength; u32 m_BusWidth; + u32 m_Registers[0x200/4]; + File::IOFile m_Card; u32 ExecuteCommand(u32 BufferIn, u32 BufferInSize, u32 BufferIn2, u32 BufferInSize2, u32 _BufferOut, u32 BufferOutSize); + void OpenInternal(); }; #endif diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_stm.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_stm.h index d4b26bcac2..8c796a458c 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_stm.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_stm.h @@ -54,7 +54,7 @@ public: return true; } - virtual bool IOCtl(u32 _CommandAddress) + virtual bool IOCtl(u32 _CommandAddress) { u32 Parameter = Memory::Read_U32(_CommandAddress + 0x0C); u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); @@ -117,7 +117,7 @@ class CWII_IPC_HLE_Device_stm_eventhook : public IWII_IPC_HLE_Device { public: - CWII_IPC_HLE_Device_stm_eventhook(u32 _DeviceID, const std::string& _rDeviceName) + CWII_IPC_HLE_Device_stm_eventhook(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) , m_EventHookAddress(0) {} @@ -144,7 +144,7 @@ public: return true; } - virtual bool IOCtl(u32 _CommandAddress) + virtual bool IOCtl(u32 _CommandAddress) { u32 Parameter = Memory::Read_U32(_CommandAddress + 0x0C); u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp index 39a6b46893..aa7d84d661 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp @@ -32,71 +32,42 @@ CWII_IPC_HLE_Device_usb_oh1_57e_305::CWII_IPC_HLE_Device_usb_oh1_57e_305(u32 _De } else { - u8 maxWM = min(BT_DINF.num_registered, MAX_BBMOTES); bdaddr_t tmpBD = BDADDR_ANY; u8 i = 0; - while (i < maxWM) + while (i < MAX_BBMOTES) { - tmpBD.b[5] = BT_DINF.active[i].bdaddr[0] = BT_DINF.registered[i].bdaddr[0]; - tmpBD.b[4] = BT_DINF.active[i].bdaddr[1] = BT_DINF.registered[i].bdaddr[1]; - tmpBD.b[3] = BT_DINF.active[i].bdaddr[2] = BT_DINF.registered[i].bdaddr[2]; - tmpBD.b[2] = BT_DINF.active[i].bdaddr[3] = BT_DINF.registered[i].bdaddr[3]; - tmpBD.b[1] = BT_DINF.active[i].bdaddr[4] = BT_DINF.registered[i].bdaddr[4]; - tmpBD.b[0] = BT_DINF.active[i].bdaddr[5] = BT_DINF.registered[i].bdaddr[5]; - if(i == WIIMOTE_BALANCE_BOARD) + if (i < BT_DINF.num_registered) { - const char * wmName = "Nintendo RVL-WBC-01"; - memcpy(BT_DINF.registered[i].name, wmName, 20); - memcpy(BT_DINF.balance_board.name, wmName, 20); + tmpBD.b[5] = BT_DINF.active[i].bdaddr[0] = BT_DINF.registered[i].bdaddr[0]; + tmpBD.b[4] = BT_DINF.active[i].bdaddr[1] = BT_DINF.registered[i].bdaddr[1]; + tmpBD.b[3] = BT_DINF.active[i].bdaddr[2] = BT_DINF.registered[i].bdaddr[2]; + tmpBD.b[2] = BT_DINF.active[i].bdaddr[3] = BT_DINF.registered[i].bdaddr[3]; + tmpBD.b[1] = BT_DINF.active[i].bdaddr[4] = BT_DINF.registered[i].bdaddr[4]; + tmpBD.b[0] = BT_DINF.active[i].bdaddr[5] = BT_DINF.registered[i].bdaddr[5]; } else { - const char * wmName = "Nintendo RVL-CNT-01"; - memcpy(BT_DINF.registered[i].name, wmName, 20); - memcpy(BT_DINF.active[i].name, wmName, 20); + tmpBD.b[5] = BT_DINF.active[i].bdaddr[0] = BT_DINF.registered[i].bdaddr[0] = i; + tmpBD.b[4] = BT_DINF.active[i].bdaddr[1] = BT_DINF.registered[i].bdaddr[1] = 0; + tmpBD.b[3] = BT_DINF.active[i].bdaddr[2] = BT_DINF.registered[i].bdaddr[2] = 0x79; + tmpBD.b[2] = BT_DINF.active[i].bdaddr[3] = BT_DINF.registered[i].bdaddr[3] = 0x19; + tmpBD.b[1] = BT_DINF.active[i].bdaddr[4] = BT_DINF.registered[i].bdaddr[4] = 2; + tmpBD.b[0] = BT_DINF.active[i].bdaddr[5] = BT_DINF.registered[i].bdaddr[5] = 0x11; } + const char* wmName; + if (i == WIIMOTE_BALANCE_BOARD) + wmName = "Nintendo RVL-WBC-01"; + else + wmName = "Nintendo RVL-CNT-01"; + memcpy(BT_DINF.registered[i].name, wmName, 20); + memcpy(BT_DINF.active[i].name, wmName, 20); + INFO_LOG(WII_IPC_WIIMOTE, "Wiimote %d BT ID %x,%x,%x,%x,%x,%x", i, tmpBD.b[0], tmpBD.b[1], tmpBD.b[2], tmpBD.b[3], tmpBD.b[4], tmpBD.b[5]); m_WiiMotes.push_back(CWII_IPC_HLE_WiiMote(this, i, tmpBD, false)); i++; } - while (i < MAX_BBMOTES) - { - if(i == WIIMOTE_BALANCE_BOARD) - { - const char * wmName = "Nintendo RVL-WBC-01"; - ++BT_DINF.num_registered; - BT_DINF.balance_board.bdaddr[0] = BT_DINF.registered[i].bdaddr[0] = tmpBD.b[5] = i; - BT_DINF.balance_board.bdaddr[1] = BT_DINF.registered[i].bdaddr[1] = tmpBD.b[4] = 0; - BT_DINF.balance_board.bdaddr[2] = BT_DINF.registered[i].bdaddr[2] = tmpBD.b[3] = 0x79; - BT_DINF.balance_board.bdaddr[3] = BT_DINF.registered[i].bdaddr[3] = tmpBD.b[2] = 0x19; - BT_DINF.balance_board.bdaddr[4] = BT_DINF.registered[i].bdaddr[4] = tmpBD.b[1] = 2; - BT_DINF.balance_board.bdaddr[5] = BT_DINF.registered[i].bdaddr[5] = tmpBD.b[0] = 0x11; - memcpy(BT_DINF.registered[i].name, wmName, 20); - memcpy(BT_DINF.balance_board.name, wmName, 20); - - INFO_LOG(WII_IPC_WIIMOTE, "Balance Board %d BT ID %x,%x,%x,%x,%x,%x", i, tmpBD.b[0], tmpBD.b[1], tmpBD.b[2], tmpBD.b[3], tmpBD.b[4], tmpBD.b[5]); - m_WiiMotes.push_back(CWII_IPC_HLE_WiiMote(this, i, tmpBD, false)); - } - else - { - const char * wmName = "Nintendo RVL-CNT-01"; - ++BT_DINF.num_registered; - BT_DINF.active[i].bdaddr[0] = BT_DINF.registered[i].bdaddr[0] = tmpBD.b[5] = i; - BT_DINF.active[i].bdaddr[1] = BT_DINF.registered[i].bdaddr[1] = tmpBD.b[4] = 0; - BT_DINF.active[i].bdaddr[2] = BT_DINF.registered[i].bdaddr[2] = tmpBD.b[3] = 0x79; - BT_DINF.active[i].bdaddr[3] = BT_DINF.registered[i].bdaddr[3] = tmpBD.b[2] = 0x19; - BT_DINF.active[i].bdaddr[4] = BT_DINF.registered[i].bdaddr[4] = tmpBD.b[1] = 2; - BT_DINF.active[i].bdaddr[5] = BT_DINF.registered[i].bdaddr[5] = tmpBD.b[0] = 0x11; - memcpy(BT_DINF.registered[i].name, wmName, 20); - INFO_LOG(WII_IPC_WIIMOTE, "Adding to SYSConf Wiimote %d BT ID %x,%x,%x,%x,%x,%x", i, tmpBD.b[0], tmpBD.b[1], tmpBD.b[2], tmpBD.b[3], tmpBD.b[4], tmpBD.b[5]); - m_WiiMotes.push_back(CWII_IPC_HLE_WiiMote(this, i, tmpBD, false)); - - } - i++; - } - // save now so that when games load sysconf file it includes the new wiimotes // and the correct order for connected wiimotes if (!SConfig::GetInstance().m_SYSCONF->SetArrayData("BT.DINF", (u8*)&BT_DINF, sizeof(_conf_pads)) || !SConfig::GetInstance().m_SYSCONF->Save()) @@ -465,12 +436,12 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() // Create ACL connection if (m_HCIEndpoint.IsValid() && (m_ScanEnable & HCI_PAGE_SCAN_ENABLE)) { - for (unsigned int i = 0; i < m_WiiMotes.size(); i++) + for (auto& wiimote : m_WiiMotes) { - if (m_WiiMotes[i].EventPagingChanged(m_ScanEnable)) + if (wiimote.EventPagingChanged(m_ScanEnable)) { Host_SetWiiMoteConnectionState(1); - SendEventRequestConnection(m_WiiMotes[i]); + SendEventRequestConnection(wiimote); } } } @@ -478,9 +449,9 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() // Link channels when connected if (m_ACLEndpoint.IsValid()) { - for (unsigned int i = 0; i < m_WiiMotes.size(); i++) + for (auto& wiimote : m_WiiMotes) { - if (m_WiiMotes[i].LinkChannel()) + if (wiimote.LinkChannel()) break; } } @@ -494,7 +465,6 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() for (unsigned int i = 0; i < m_WiiMotes.size(); i++) if (m_WiiMotes[i].IsConnected()) { - NetPlay_WiimoteUpdate(i); Wiimote::Update(i); } m_last_ticks = now; @@ -513,13 +483,13 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::ACLPool::Store(const u8* data, const u ERROR_LOG(WII_IPC_WIIMOTE, "ACL queue size reached 100 - current packet will be dropped!"); return; } - + _dbg_assert_msg_(WII_IPC_WIIMOTE, size < m_acl_pkt_size, "ACL packet too large for pool"); - + m_queue.push_back(Packet()); auto& packet = m_queue.back(); - + std::copy(data, data + size, packet.data); packet.size = size; packet.conn_handle = conn_handle; @@ -528,7 +498,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::ACLPool::Store(const u8* data, const u void CWII_IPC_HLE_Device_usb_oh1_57e_305::ACLPool::WriteToEndpoint(CtrlBuffer& endpoint) { auto& packet = m_queue.front(); - + const u8* const data = packet.data; const u16 size = packet.size; const u16 conn_handle = packet.conn_handle; @@ -576,7 +546,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventInquiryResponse() SQueuedEvent Event(static_cast(sizeof(SHCIEventInquiryResult) + m_WiiMotes.size()*sizeof(hci_inquiry_response)), 0); - SHCIEventInquiryResult* pInquiryResult = (SHCIEventInquiryResult*)Event.m_buffer; + SHCIEventInquiryResult* pInquiryResult = (SHCIEventInquiryResult*)Event.m_buffer; pInquiryResult->EventType = HCI_EVENT_INQUIRY_RESULT; pInquiryResult->PayloadLength = (u8)(sizeof(SHCIEventInquiryResult) - 2 + (m_WiiMotes.size() * sizeof(hci_inquiry_response))); @@ -588,7 +558,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventInquiryResponse() continue; u8* pBuffer = Event.m_buffer + sizeof(SHCIEventInquiryResult) + i*sizeof(hci_inquiry_response); - hci_inquiry_response* pResponse = (hci_inquiry_response*)pBuffer; + hci_inquiry_response* pResponse = (hci_inquiry_response*)pBuffer; pResponse->bdaddr = m_WiiMotes[i].GetBD(); pResponse->uclass[0]= m_WiiMotes[i].GetClass()[0]; @@ -787,7 +757,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventReadRemoteFeatures(u16 _conne INFO_LOG(WII_IPC_WIIMOTE, "Event: SendEventReadRemoteFeatures"); DEBUG_LOG(WII_IPC_WIIMOTE, " Connection_Handle: 0x%04x", pReadRemoteFeatures->ConnectionHandle); - DEBUG_LOG(WII_IPC_WIIMOTE, " features: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + DEBUG_LOG(WII_IPC_WIIMOTE, " features: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", pReadRemoteFeatures->features[0], pReadRemoteFeatures->features[1], pReadRemoteFeatures->features[2], pReadRemoteFeatures->features[3], pReadRemoteFeatures->features[4], pReadRemoteFeatures->features[5], pReadRemoteFeatures->features[6], pReadRemoteFeatures->features[7]); @@ -860,7 +830,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventCommandStatus(u16 _Opcode) pHCIEvent->PacketIndicator = 0x01; pHCIEvent->Opcode = _Opcode; - INFO_LOG(WII_IPC_WIIMOTE, "Event: Command Status (Opcode: 0x%04x)", pHCIEvent->Opcode); + INFO_LOG(WII_IPC_WIIMOTE, "Event: Command Status (Opcode: 0x%04x)", pHCIEvent->Opcode); AddEventToQueue(Event); @@ -896,7 +866,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRoleChange(bdaddr_t _bd, bool bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventNumberOfCompletedPackets() { - SQueuedEvent Event(sizeof(hci_event_hdr_t) + sizeof(hci_num_compl_pkts_ep) + sizeof(hci_num_compl_pkts_info) * m_WiiMotes.size(), 0); + SQueuedEvent Event((u32)(sizeof(hci_event_hdr_t) + sizeof(hci_num_compl_pkts_ep) + (sizeof(hci_num_compl_pkts_info) * m_WiiMotes.size())), 0); INFO_LOG(WII_IPC_WIIMOTE, "Event: SendEventNumberOfCompletedPackets"); @@ -916,7 +886,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventNumberOfCompletedPackets() event->num_con_handles++; info->compl_pkts = m_PacketCount[i]; info->con_handle = m_WiiMotes[i].GetConnectionHandle(); - + DEBUG_LOG(WII_IPC_WIIMOTE, " Connection_Handle: 0x%04x", info->con_handle); DEBUG_LOG(WII_IPC_WIIMOTE, " Number_Of_Completed_Packets: %i", info->compl_pkts); @@ -1763,7 +1733,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadLocalFeatures(u8* _Input) INFO_LOG(WII_IPC_WIIMOTE, "Command: HCI_CMD_READ_LOCAL_FEATURES:"); DEBUG_LOG(WII_IPC_WIIMOTE, "return:"); - DEBUG_LOG(WII_IPC_WIIMOTE, " features: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + DEBUG_LOG(WII_IPC_WIIMOTE, " features: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", Reply.features[0], Reply.features[1], Reply.features[2], Reply.features[3], Reply.features[4], Reply.features[5], Reply.features[6], Reply.features[7]); @@ -1848,16 +1818,16 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandVendorSpecific_FC4C(u8* _Input, // CWII_IPC_HLE_WiiMote* CWII_IPC_HLE_Device_usb_oh1_57e_305::AccessWiiMote(const bdaddr_t& _rAddr) { - for (size_t i=0; i -struct is_pod : std::true_type {}; -} - // Important to remember that this class is for /dev/usb/oh1/57e/305 ONLY // /dev/usb/oh1 -> internal usb bus // 57e/305 -> VendorID/ProductID of device on usb bus @@ -155,7 +148,7 @@ private: SHCICommandMessage m_CtrlSetup; CtrlBuffer m_HCIEndpoint; std::deque m_EventQueue; - + u32 m_ACLSetup; CtrlBuffer m_ACLEndpoint; @@ -170,7 +163,7 @@ private: u16 size; u16 conn_handle; }; - + std::deque m_queue; public: @@ -216,7 +209,7 @@ private: bool SendEventReadRemoteFeatures(u16 _connectionHandle); bool SendEventRoleChange(bdaddr_t _bd, bool _master); bool SendEventNumberOfCompletedPackets(); - bool SendEventAuthenticationCompleted(u16 _connectionHandle); + bool SendEventAuthenticationCompleted(u16 _connectionHandle); bool SendEventModeChange(u16 _connectionHandle, u8 _mode, u16 _value); bool SendEventDisconnect(u16 _connectionHandle, u8 _Reason); bool SendEventRequestLinkKey(const bdaddr_t& _bd); @@ -260,7 +253,7 @@ private: void CommandWriteInquiryScanType(u8* _Input); void CommandWriteLinkSupervisionTimeout(u8* _Input); - // OGF 0x04 Informational commands and return parameters + // OGF 0x04 Informational commands and return parameters void CommandReadBufferSize(u8* _Input); void CommandReadLocalVer(u8* _Input); void CommandReadLocalFeatures(u8* _Input); @@ -268,14 +261,14 @@ private: // OGF 0x3F Vendor specific void CommandVendorSpecific_FC4C(u8* _Input, u32 _Size); - void CommandVendorSpecific_FC4F(u8* _Input, u32 _Size); + void CommandVendorSpecific_FC4F(u8* _Input, u32 _Size); // Debugging void LOG_LinkKey(const u8* _pLinkKey); #pragma pack(push,1) #define CONF_PAD_MAX_REGISTERED 10 - + struct _conf_pad_device { u8 bdaddr[6]; @@ -286,8 +279,7 @@ private: { u8 num_registered; _conf_pad_device registered[CONF_PAD_MAX_REGISTERED]; - _conf_pad_device active[MAX_WIIMOTES]; - _conf_pad_device balance_board; + _conf_pad_device active[MAX_BBMOTES]; u8 unknown[0x45]; }; #pragma pack(pop) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp index bfe0df8743..4300ecc4da 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb_kbd.cpp @@ -28,6 +28,7 @@ bool CWII_IPC_HLE_Device_usb_kbd::Open(u32 _CommandAddress, u32 _Mode) for(int i = 0; i < 256; i++) m_OldKeyBuffer[i] = false; + m_OldModifiers = 0x00; //m_MessageQueue.push(SMessageData(MSG_KBD_CONNECT, 0, NULL)); @@ -170,7 +171,7 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesQWERTY[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, // Backspace 0x2B, // Tab - 0x00, 0x00, + 0x00, 0x00, 0x00, // Clear 0x28, // Return 0x00, 0x00, @@ -191,18 +192,18 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesQWERTY[256] = { 0x52, // Up 0x4F, // Right 0x51, // Down - 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x46, // Print screen 0x49, // Insert 0x4C, // Delete 0x00, // 0 -> 9 - 0x27, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // A -> Z - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, @@ -219,7 +220,7 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesQWERTY[256] = { 0x54, // Divide // F1 -> F12 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, - 0x42, 0x43, 0x44, 0x45, + 0x42, 0x43, 0x44, 0x45, // F13 -> F24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -258,7 +259,7 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesAZERTY[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, // Backspace 0x2B, // Tab - 0x00, 0x00, + 0x00, 0x00, 0x00, // Clear 0x28, // Return 0x00, 0x00, @@ -279,18 +280,18 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesAZERTY[256] = { 0x52, // Up 0x4F, // Right 0x51, // Down - 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x46, // Print screen 0x49, // Insert 0x4C, // Delete 0x00, // 0 -> 9 - 0x27, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x27, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // A -> Z - 0x14, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x14, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x33, 0x11, 0x12, 0x13, 0x04, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1D, 0x1B, 0x1C, 0x1A, @@ -307,7 +308,7 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesAZERTY[256] = { 0x54, // Divide // F1 -> F12 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, - 0x42, 0x43, 0x44, 0x45, + 0x42, 0x43, 0x44, 0x45, // F13 -> F24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp index 9386682106..d873914b2b 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp @@ -265,7 +265,7 @@ void CWII_IPC_HLE_WiiMote::ExecuteL2capCmd(u8* _pData, u32 _Size) _dbg_assert_msg_(WII_IPC_WIIMOTE, DoesChannelExist(pHeader->dcid), "L2CAP: SendACLPacket to unknown channel %i", pHeader->dcid); CChannelMap::iterator itr= m_Channel.find(pHeader->dcid); - const int number = NetPlay_GetWiimoteNum(m_ConnectionHandle & 0xFF); + const int number = m_ConnectionHandle & 0xFF; if (itr != m_Channel.end()) { @@ -385,7 +385,7 @@ void CWII_IPC_HLE_WiiMote::ReceiveConnectionReq(u8 _Ident, u8* _pData, u32 _Size INFO_LOG(WII_IPC_WIIMOTE, "[L2CAP] SendConnectionResponse"); SendCommandToACL(_Ident, L2CAP_CONNECT_RSP, sizeof(l2cap_con_rsp_cp), (u8*)&Rsp); - + // update state machine /* if (rChannel.PSM == L2CAP_PSM_HID_CNTL) @@ -613,7 +613,7 @@ void CWII_IPC_HLE_WiiMote::SendConfigurationRequest(u16 scid, u16 MTU, u16 Flush *(u16*)&Buffer[Offset] = MTU; Offset += L2CAP_OPT_MTU_SIZE; DEBUG_LOG(WII_IPC_WIIMOTE, " MTU: 0x%04x", MTU); } - + if (FlushTimeOut || rChannel.FlushTimeOut) { if (FlushTimeOut == 0) @@ -650,7 +650,7 @@ void CWII_IPC_HLE_WiiMote::SDPSendServiceSearchResponse(u16 cid, u16 Transaction { // verify block... we handle search pattern for HID service only { - CBigEndianBuffer buffer(pServiceSearchPattern); + CBigEndianBuffer buffer(pServiceSearchPattern); _dbg_assert_(WII_IPC_WIIMOTE, buffer.Read8(0) == SDP_SEQ8); // data sequence _dbg_assert_(WII_IPC_WIIMOTE, buffer.Read8(1) == 0x03); // sequence size @@ -757,7 +757,7 @@ void CWII_IPC_HLE_WiiMote::SDPSendServiceAttributeResponse(u16 cid, u16 Transact int Offset = 0; l2cap_hdr_t* pHeader = (l2cap_hdr_t*)&DataFrame[Offset]; Offset += sizeof(l2cap_hdr_t); pHeader->dcid = cid; - + buffer.Write8 (Offset, 0x05); Offset++; buffer.Write16(Offset, TransactionID); Offset += 2; // transaction ID @@ -862,8 +862,6 @@ void CWII_IPC_HLE_WiiMote::SendCommandToACL(u8 _Ident, u8 _Code, u8 _CommandLeng void CWII_IPC_HLE_WiiMote::ReceiveL2capData(u16 scid, const void* _pData, u32 _Size) { - if (NetPlay_WiimoteInput(m_ConnectionHandle & 0xFF, scid, _pData, _Size)) - return; // Allocate DataFrame u8 DataFrame[1024]; diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.h index 691fc84011..7c9444f1f0 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.h @@ -56,7 +56,6 @@ public: void ReceiveL2capData(u16 scid, const void* _pData, u32 _Size); // From wiimote int NetPlay_GetWiimoteNum(int _number); - bool NetPlay_WiimoteInput(int _number, u16 _channelID, const void* _pData, u32& _Size); void EventConnectionAccepted(); void EventDisconnect(); @@ -102,7 +101,7 @@ private: std::string m_Name; CWII_IPC_HLE_Device_usb_oh1_57e_305* m_pHost; - struct SChannel + struct SChannel { u16 SCID; u16 DCID; @@ -133,14 +132,14 @@ private: void ReceiveDisconnectionReq(u8 _Ident, u8* _pData, u32 _Size); void ReceiveConfigurationReq(u8 _Ident, u8* _pData, u32 _Size); void ReceiveConfigurationResponse(u8 _Ident, u8* _pData, u32 _Size); - + // some new ugly stuff - // should be inside the plugin + // should be inside the plugin void HandleSDP(u16 _SCID, u8* _pData, u32 _Size); void SDPSendServiceSearchResponse(u16 _SCID, u16 _TransactionID, u8* _pServiceSearchPattern, u16 _MaximumServiceRecordCount); - void SDPSendServiceAttributeResponse(u16 _SCID, u16 TransactionID, u32 _ServiceHandle, - u16 _StartAttrID, u16 _EndAttrID, + void SDPSendServiceAttributeResponse(u16 _SCID, u16 TransactionID, u32 _ServiceHandle, + u16 _StartAttrID, u16 _EndAttrID, u16 _MaximumAttributeByteCount, u8* _pContinuationState); u16 AddAttribToList(int _AttribID, u8* _pBuffer); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_Socket.cpp b/Source/Core/Core/Src/IPC_HLE/WII_Socket.cpp new file mode 100644 index 0000000000..32e6cbe81c --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_Socket.cpp @@ -0,0 +1,656 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "WII_Socket.h" +#include "WII_IPC_HLE.h" +#include "WII_IPC_HLE_Device.h" +// No Wii socket support while using NetPlay or TAS +#include "NetPlayProto.h" +#include "Movie.h" + +using WII_IPC_HLE_Interface::ECommandType; +using WII_IPC_HLE_Interface::COMMAND_IOCTL; +using WII_IPC_HLE_Interface::COMMAND_IOCTLV; + +#ifdef _WIN32 +#define ERRORCODE(name) WSA ## name +#define EITHER(win32, posix) win32 +#else +#define ERRORCODE(name) name +#define EITHER(win32, posix) posix +#endif + +char* WiiSockMan::DecodeError(s32 ErrorCode) +{ +#ifdef _WIN32 + static char Message[1024]; + // If this program was multi-threaded, we'd want to use FORMAT_MESSAGE_ALLOCATE_BUFFER + // instead of a static buffer here. + // (And of course, free the buffer when we were done with it) + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, ErrorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)Message, 1024, NULL); + return Message; +#else + return strerror(ErrorCode); +#endif +} + +s32 translateErrorCode(s32 native_error, bool isRW) +{ + switch (native_error) + { + case ERRORCODE(EMSGSIZE): + ERROR_LOG(WII_IPC_NET, "Find out why this happened, looks like PEEK failure?"); + return -1; // Should be -SO_EMSGSIZE + case EITHER(WSAENOTSOCK, EBADF): + return -SO_EBADF; + case ERRORCODE(EADDRINUSE): + return -SO_EADDRINUSE; + case ERRORCODE(ECONNRESET): + return -SO_ECONNRESET; + case ERRORCODE(EISCONN): + return -SO_EISCONN; + case ERRORCODE(ENOTCONN): + return -SO_EAGAIN; // After proper blocking SO_EAGAIN shouldn't be needed... + case ERRORCODE(EINPROGRESS): + return -SO_EINPROGRESS; + case ERRORCODE(EALREADY): + return -SO_EALREADY; + case ERRORCODE(EACCES): + return -SO_EACCES; + case ERRORCODE(ECONNREFUSED): + return -SO_ECONNREFUSED; + case ERRORCODE(ENETUNREACH): + return -SO_ENETUNREACH; + case ERRORCODE(EHOSTUNREACH): + return -SO_EHOSTUNREACH; + case EITHER(WSAEWOULDBLOCK, EAGAIN): + if (isRW){ + return -SO_EAGAIN; // EAGAIN + }else{ + return -SO_EINPROGRESS; // EINPROGRESS + } + default: + return -1; + } +} + +s32 WiiSockMan::getNetErrorCode(s32 ret, std::string caller, bool isRW) +{ +#ifdef _WIN32 + s32 errorCode = WSAGetLastError(); +#else + s32 errorCode = errno; +#endif + + if (ret >= 0) + { + WiiSockMan::getInstance().setLastNetError(ret); + return ret; + } + + INFO_LOG(WII_IPC_NET, "%s failed with error %d: %s, ret= %d", + caller.c_str(), errorCode, DecodeError(errorCode), ret); + + s32 ReturnValue = translateErrorCode(errorCode, isRW); + WiiSockMan::getInstance().setLastNetError(ReturnValue); + + return ReturnValue; +} + +WiiSocket::~WiiSocket() +{ + if (fd >= 0) + { + (void)closeFd(); + } +} + +void WiiSocket::setFd(s32 s) +{ + if (fd >= 0) + (void)closeFd(); + + nonBlock = false; + fd = s; + + // Set socket to NON-BLOCK +#ifdef _WIN32 + u_long iMode = 1; + ioctlsocket(fd, FIONBIO, &iMode); +#else + int flags; + if (-1 == (flags = fcntl(fd, F_GETFL, 0))) + flags = 0; + fcntl(fd, F_SETFL, flags | O_NONBLOCK); +#endif +} + +s32 WiiSocket::closeFd() +{ + s32 ReturnValue = 0; + if (fd >= 0) + { +#ifdef _WIN32 + s32 ret = closesocket(fd); +#else + s32 ret = close(fd); +#endif + ReturnValue = WiiSockMan::getNetErrorCode(ret, "delSocket", false); + } + else + { + ReturnValue = WiiSockMan::getNetErrorCode(EITHER(WSAENOTSOCK, EBADF), "delSocket", false); + } + fd = -1; + return ReturnValue; +} + +s32 WiiSocket::_fcntl(u32 cmd, u32 arg) +{ +#define F_GETFL 3 +#define F_SETFL 4 +#define F_NONBLOCK 4 + s32 ret = 0; + if (cmd == F_GETFL) + { + ret = nonBlock ? F_NONBLOCK : 0; + } + else if (cmd == F_SETFL) + { + nonBlock = (arg & F_NONBLOCK) == F_NONBLOCK; + } + else + { + ERROR_LOG(WII_IPC_NET, "SO_FCNTL unknown command"); + } + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_FCNTL(%08x, %08X, %08X)", + fd, cmd, arg); + + return ret; +} + +void WiiSocket::update(bool read, bool write, bool except) +{ + auto it = pending_sockops.begin(); + while (it != pending_sockops.end()) + { + s32 ReturnValue = 0; + bool forceNonBlock = false; + ECommandType ct = static_cast(Memory::Read_U32(it->_CommandAddress)); + if (!it->is_ssl && ct == COMMAND_IOCTL) + { + u32 BufferIn = Memory::Read_U32(it->_CommandAddress + 0x10); + u32 BufferInSize = Memory::Read_U32(it->_CommandAddress + 0x14); + u32 BufferOut = Memory::Read_U32(it->_CommandAddress + 0x18); + u32 BufferOutSize = Memory::Read_U32(it->_CommandAddress + 0x1C); + + switch(it->net_type) + { + case IOCTL_SO_FCNTL: + { + u32 cmd = Memory::Read_U32(BufferIn + 4); + u32 arg = Memory::Read_U32(BufferIn + 8); + ReturnValue = _fcntl(cmd, arg); + break; + } + case IOCTL_SO_BIND: + { + //u32 has_addr = Memory::Read_U32(BufferIn + 0x04); + sockaddr_in local_name; + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferIn + 0x08); + WiiSockMan::Convert(*wii_name, local_name); + + int ret = bind(fd, (sockaddr*)&local_name, sizeof(local_name)); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_BIND", false); + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_BIND (%08X %s:%d) = %d ", fd, + inet_ntoa(local_name.sin_addr), Common::swap16(local_name.sin_port), ret); + break; + } + case IOCTL_SO_CONNECT: + { + //u32 has_addr = Memory::Read_U32(BufferIn + 0x04); + sockaddr_in local_name; + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferIn + 0x08); + WiiSockMan::Convert(*wii_name, local_name); + + int ret = connect(fd, (sockaddr*)&local_name, sizeof(local_name)); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_CONNECT", false); + + INFO_LOG(WII_IPC_NET,"IOCTL_SO_CONNECT (%08x, %s:%d)", + fd, inet_ntoa(local_name.sin_addr), Common::swap16(local_name.sin_port)); + break; + } + case IOCTL_SO_ACCEPT: + { + + if (BufferOutSize > 0) + { + sockaddr_in local_name; + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferOut); + WiiSockMan::Convert(*wii_name, local_name); + + socklen_t addrlen = sizeof(sockaddr_in); + int ret = (s32)accept(fd, (sockaddr*)&local_name, &addrlen); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", true); + + WiiSockMan::Convert(local_name, *wii_name, addrlen); + } + else + { + int ret = (s32)accept(fd, NULL, 0); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_ACCEPT", true); + } + + WiiSockMan::getInstance().addSocket(ReturnValue); + + INFO_LOG(WII_IPC_NET, "IOCTL_SO_ACCEPT " + "BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + + break; + } + default: + break; + } + + // Fix blocking error codes + if (!nonBlock) + { + if (it->net_type == IOCTL_SO_CONNECT + && ReturnValue == -SO_EISCONN) + { + ReturnValue = SO_SUCCESS; + } + } + } + else if (ct == COMMAND_IOCTLV) + { + SIOCtlVBuffer CommandBuffer(it->_CommandAddress); + u32 BufferIn = 0, BufferIn2 = 0; + u32 BufferInSize = 0, BufferInSize2 = 0; + u32 BufferOut = 0, BufferOut2 = 0; + u32 BufferOutSize = 0, BufferOutSize2 = 0; + + if (CommandBuffer.InBuffer.size() > 0) + { + BufferIn = CommandBuffer.InBuffer.at(0).m_Address; + BufferInSize = CommandBuffer.InBuffer.at(0).m_Size; + } + + if (CommandBuffer.PayloadBuffer.size() > 0) + { + BufferOut = CommandBuffer.PayloadBuffer.at(0).m_Address; + BufferOutSize = CommandBuffer.PayloadBuffer.at(0).m_Size; + } + + if (CommandBuffer.PayloadBuffer.size() > 1) + { + BufferOut2 = CommandBuffer.PayloadBuffer.at(1).m_Address; + BufferOutSize2 = CommandBuffer.PayloadBuffer.at(1).m_Size; + } + + if (CommandBuffer.InBuffer.size() > 1) + { + BufferIn2 = CommandBuffer.InBuffer.at(1).m_Address; + BufferInSize2 = CommandBuffer.InBuffer.at(1).m_Size; + } + + if (it->is_ssl) + { + int sslID = Memory::Read_U32(BufferOut) - 1; + if (SSLID_VALID(sslID)) + { + switch(it->ssl_type) + { + case IOCTLV_NET_SSL_DOHANDSHAKE: + { + + int ret = ssl_handshake(&CWII_IPC_HLE_Device_net_ssl::_SSL[sslID].ctx); + switch (ret) + { + case 0: + Memory::Write_U32(SSL_OK, BufferIn); + break; + case POLARSSL_ERR_NET_WANT_READ: + Memory::Write_U32(SSL_ERR_RAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_RAGAIN; + break; + case POLARSSL_ERR_NET_WANT_WRITE: + Memory::Write_U32(SSL_ERR_WAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_WAGAIN; + break; + default: + Memory::Write_U32(SSL_ERR_FAILED, BufferIn); + break; + } + + INFO_LOG(WII_IPC_SSL, "IOCTLV_NET_SSL_DOHANDSHAKE = (%d) " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferOut: (%08x, %i), BufferOut2: (%08x, %i)", + ret, + BufferIn, BufferInSize, BufferIn2, BufferInSize2, + BufferOut, BufferOutSize, BufferOut2, BufferOutSize2); + break; + } + case IOCTLV_NET_SSL_WRITE: + { + int ret = ssl_write(&CWII_IPC_HLE_Device_net_ssl::_SSL[sslID].ctx, Memory::GetPointer(BufferOut2), BufferOutSize2); + +#ifdef DEBUG_SSL + File::IOFile("ssl_write.bin", "ab").WriteBytes(Memory::GetPointer(BufferOut2), BufferOutSize2); +#endif + if (ret >= 0) + { + // Return bytes written or SSL_ERR_ZERO if none + Memory::Write_U32((ret == 0) ? SSL_ERR_ZERO : ret, BufferIn); + } + else + { + switch (ret) + { + case POLARSSL_ERR_NET_WANT_READ: + Memory::Write_U32(SSL_ERR_RAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_RAGAIN; + break; + case POLARSSL_ERR_NET_WANT_WRITE: + Memory::Write_U32(SSL_ERR_WAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_WAGAIN; + break; + default: + Memory::Write_U32(SSL_ERR_FAILED, BufferIn); + break; + } + } + break; + } + case IOCTLV_NET_SSL_READ: + { + int ret = ssl_read(&CWII_IPC_HLE_Device_net_ssl::_SSL[sslID].ctx, Memory::GetPointer(BufferIn2), BufferInSize2); +#ifdef DEBUG_SSL + if (ret > 0) + { + File::IOFile("ssl_read.bin", "ab").WriteBytes(Memory::GetPointer(BufferIn2), ret); + } +#endif + if (ret >= 0) + { + // Return bytes read or SSL_ERR_ZERO if none + Memory::Write_U32((ret == 0) ? SSL_ERR_ZERO : ret, BufferIn); + } + else + { + switch (ret) + { + case POLARSSL_ERR_NET_WANT_READ: + Memory::Write_U32(SSL_ERR_RAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_RAGAIN; + break; + case POLARSSL_ERR_NET_WANT_WRITE: + Memory::Write_U32(SSL_ERR_WAGAIN, BufferIn); + if (!nonBlock) + ReturnValue = SSL_ERR_WAGAIN; + break; + default: + Memory::Write_U32(SSL_ERR_FAILED, BufferIn); + break; + } + } + break; + } + default: + break; + } + } + else + { + Memory::Write_U32(SSL_ERR_ID, BufferIn); + } + } + else + { + switch (it->net_type) + { + case IOCTLV_SO_SENDTO: + { + + u32 flags = Memory::Read_U32(BufferIn2 + 0x04); + u32 has_destaddr = Memory::Read_U32(BufferIn2 + 0x08); + char * data = (char*)Memory::GetPointer(BufferIn); + + // Act as non blocking when SO_MSG_NONBLOCK is specified + forceNonBlock = ((flags & SO_MSG_NONBLOCK) == SO_MSG_NONBLOCK); + // send/sendto only handles MSG_OOB + flags &= SO_MSG_OOB; + + sockaddr_in local_name = {0}; + if (has_destaddr) + { + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferIn2 + 0x0C); + WiiSockMan::Convert(*wii_name, local_name); + } + + int ret = sendto(fd, data, BufferInSize, flags, + has_destaddr ? (struct sockaddr*)&local_name : NULL, + has_destaddr ? sizeof(sockaddr) : 0); + ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SENDTO", true); + + INFO_LOG(WII_IPC_NET, + "%s = %d Socket: %08x, BufferIn: (%08x, %i), BufferIn2: (%08x, %i), %u.%u.%u.%u", + has_destaddr ? "IOCTLV_SO_SENDTO " : "IOCTLV_SO_SEND ", + ReturnValue, fd, BufferIn, BufferInSize, + BufferIn2, BufferInSize2, + local_name.sin_addr.s_addr & 0xFF, + (local_name.sin_addr.s_addr >> 8) & 0xFF, + (local_name.sin_addr.s_addr >> 16) & 0xFF, + (local_name.sin_addr.s_addr >> 24) & 0xFF + ); + break; + } + case IOCTLV_SO_RECVFROM: + { + u32 flags = Memory::Read_U32(BufferIn + 0x04); + char * data = (char *)Memory::GetPointer(BufferOut); + int data_len = BufferOutSize; + + sockaddr_in local_name; + memset(&local_name, 0, sizeof(sockaddr_in)); + + if (BufferOutSize2 != 0) + { + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferOut2); + WiiSockMan::Convert(*wii_name, local_name); + } + + // Act as non blocking when SO_MSG_NONBLOCK is specified + forceNonBlock = ((flags & SO_MSG_NONBLOCK) == SO_MSG_NONBLOCK); + + // recv/recvfrom only handles PEEK/OOB + flags &= SO_MSG_PEEK | SO_MSG_OOB; +#ifdef _WIN32 + if (flags & SO_MSG_PEEK){ + unsigned long totallen = 0; + ioctlsocket(fd, FIONREAD, &totallen); + ReturnValue = totallen; + break; + } +#endif + socklen_t addrlen = sizeof(sockaddr_in); + int ret = recvfrom(fd, data, data_len, flags, + BufferOutSize2 ? (struct sockaddr*) &local_name : NULL, + BufferOutSize2 ? &addrlen : 0); + ReturnValue = WiiSockMan::getNetErrorCode(ret, BufferOutSize2 ? "SO_RECVFROM" : "SO_RECV", true); + + + INFO_LOG(WII_IPC_NET, "%s(%d, %p) Socket: %08X, Flags: %08X, " + "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), " + "BufferOut: (%08x, %i), BufferOut2: (%08x, %i)", + BufferOutSize2 ? "IOCTLV_SO_RECVFROM " : "IOCTLV_SO_RECV ", + ReturnValue, data, fd, flags, + BufferIn, BufferInSize, BufferIn2, BufferInSize2, + BufferOut, BufferOutSize, BufferOut2, BufferOutSize2); + + if (BufferOutSize2 != 0) + { + WiiSockAddrIn* wii_name = (WiiSockAddrIn*)Memory::GetPointer(BufferOut2); + WiiSockMan::Convert(local_name, *wii_name, addrlen); + } + break; + } + default: + break; + } + } + + } + + if ( nonBlock || forceNonBlock + || (!it->is_ssl && ReturnValue != -SO_EAGAIN && ReturnValue != -SO_EINPROGRESS && ReturnValue != -SO_EALREADY) + || (it->is_ssl && ReturnValue != SSL_ERR_WAGAIN && ReturnValue != SSL_ERR_RAGAIN)) + { + DEBUG_LOG(WII_IPC_NET, "IOCTL(V) Sock: %08x ioctl/v: %d returned: %d nonBlock: %d forceNonBlock: %d", + fd, it->is_ssl ? (int) it->ssl_type : (int) it->net_type, ReturnValue, nonBlock, forceNonBlock); + WiiSockMan::EnqueueReply(it->_CommandAddress, ReturnValue); + it = pending_sockops.erase(it); + } + else + { + ++it; + } + } +} + +void WiiSocket::doSock(u32 _CommandAddress, NET_IOCTL type) +{ + sockop so = {_CommandAddress, false}; + so.net_type = type; + pending_sockops.push_back(so); +} + +void WiiSocket::doSock(u32 _CommandAddress, SSL_IOCTL type) +{ + sockop so = {_CommandAddress, true}; + so.ssl_type = type; + pending_sockops.push_back(so); +} + +void WiiSockMan::addSocket(s32 fd) +{ + if (fd >= 0) + { + WiiSocket& sock = WiiSockets[fd]; + sock.setFd(fd); + } +} + +s32 WiiSockMan::newSocket(s32 af, s32 type, s32 protocol) +{ + if (NetPlay::IsNetPlayRunning() + || Movie::IsRecordingInput() + || Movie::IsPlayingInput()) + { + return SO_ENOMEM; + } + + s32 fd = (s32)socket(af, type, protocol); + s32 ret = getNetErrorCode(fd, "newSocket", false); + addSocket(ret); + return ret; +} + +s32 WiiSockMan::delSocket(s32 s) +{ + s32 ReturnValue = WiiSockets[s].closeFd(); + WiiSockets.erase(s); + return ReturnValue; +} + +void WiiSockMan::Update() +{ + s32 nfds = 0; + fd_set read_fds, write_fds, except_fds; + struct timeval t = {0,0}; + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + FD_ZERO(&except_fds); + for (auto it = WiiSockets.begin(); it != WiiSockets.end(); ++it) + { + WiiSocket& sock = it->second; + if (sock.valid()) + { + FD_SET(sock.fd, &read_fds); + FD_SET(sock.fd, &write_fds); + FD_SET(sock.fd, &except_fds); + nfds = max(nfds, sock.fd+1); + } + else + { + // Good time to clean up invalid sockets. + WiiSockets.erase(sock.fd); + } + } + s32 ret = select(nfds, &read_fds, &write_fds, &except_fds, &t); + + if (ret >= 0) + { + for (auto& pair : WiiSockets) + { + WiiSocket& sock = pair.second; + sock.update( + FD_ISSET(sock.fd, &read_fds) != 0, + FD_ISSET(sock.fd, &write_fds) != 0, + FD_ISSET(sock.fd, &except_fds) != 0 + ); + } + } + else + { + for (auto& elem : WiiSockets) + { + elem.second.update(false, false, false); + } + } +} + +void WiiSockMan::EnqueueReply(u32 CommandAddress, s32 ReturnValue) +{ + Memory::Write_U32(8, CommandAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(Memory::Read_U32(CommandAddress), CommandAddress + 8); + + // Return value + Memory::Write_U32(ReturnValue, CommandAddress + 4); + + WII_IPC_HLE_Interface::EnqReply(CommandAddress); +} + + +void WiiSockMan::Convert(WiiSockAddrIn const & from, sockaddr_in& to) +{ + to.sin_addr.s_addr = from.addr.addr; + to.sin_family = from.family; + to.sin_port = from.port; +} + +void WiiSockMan::Convert(sockaddr_in const & from, WiiSockAddrIn& to, s32 addrlen) +{ + to.addr.addr = from.sin_addr.s_addr; + to.family = from.sin_family & 0xFF; + to.port = from.sin_port; + if (addrlen < 0 || addrlen > (s32) sizeof(WiiSockAddrIn)) + to.len = sizeof(WiiSockAddrIn); + else + to.len = addrlen; +} + +#undef ERRORCODE +#undef EITHER diff --git a/Source/Core/Core/Src/IPC_HLE/WII_Socket.h b/Source/Core/Core/Src/IPC_HLE/WII_Socket.h new file mode 100644 index 0000000000..cc2eb7fef8 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_Socket.h @@ -0,0 +1,248 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _WII_SOCKET_H_ +#define _WII_SOCKET_H_ + + +#ifdef _WIN32 +#include +#include +#include + +#include "fakepoll.h" +#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) +#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) + +#elif defined(__linux__) or defined(__APPLE__) +#include +#include +#include +#include +#include +#if defined(ANDROID) +#include +#else +#include +#endif +#include +#include +#include +#include +#include + +typedef struct pollfd pollfd_t; +#else +#include +#include +#include +#include +#include +#endif + +#include // std::for_each +#include +#include +#include +#include + +#include "FileUtil.h" +#include "WII_IPC_HLE.h" +#include "WII_IPC_HLE_Device_net.h" +#include "WII_IPC_HLE_Device_net_ssl.h" + +enum { + SO_MSG_OOB = 0x01, + SO_MSG_PEEK = 0x02, + SO_MSG_NONBLOCK = 0x04, +}; +enum { + SO_SUCCESS, + SO_E2BIG = 1, + SO_EACCES, + SO_EADDRINUSE, + SO_EADDRNOTAVAIL, + SO_EAFNOSUPPORT, + SO_EAGAIN, + SO_EALREADY, + SO_EBADF, + SO_EBADMSG, + SO_EBUSY, + SO_ECANCELED, + SO_ECHILD, + SO_ECONNABORTED, + SO_ECONNREFUSED, + SO_ECONNRESET, + SO_EDEADLK, + SO_EDESTADDRREQ, + SO_EDOM, + SO_EDQUOT, + SO_EEXIST, + SO_EFAULT, + SO_EFBIG, + SO_EHOSTUNREACH, + SO_EIDRM, + SO_EILSEQ, + SO_EINPROGRESS, + SO_EINTR, + SO_EINVAL, + SO_EIO, + SO_EISCONN, + SO_EISDIR, + SO_ELOOP, + SO_EMFILE, + SO_EMLINK, + SO_EMSGSIZE, + SO_EMULTIHOP, + SO_ENAMETOOLONG, + SO_ENETDOWN, + SO_ENETRESET, + SO_ENETUNREACH, + SO_ENFILE, + SO_ENOBUFS, + SO_ENODATA, + SO_ENODEV, + SO_ENOENT, + SO_ENOEXEC, + SO_ENOLCK, + SO_ENOLINK, + SO_ENOMEM, + SO_ENOMSG, + SO_ENOPROTOOPT, + SO_ENOSPC, + SO_ENOSR, + SO_ENOSTR, + SO_ENOSYS, + SO_ENOTCONN, + SO_ENOTDIR, + SO_ENOTEMPTY, + SO_ENOTSOCK, + SO_ENOTSUP, + SO_ENOTTY, + SO_ENXIO, + SO_EOPNOTSUPP, + SO_EOVERFLOW, + SO_EPERM, + SO_EPIPE, + SO_EPROTO, + SO_EPROTONOSUPPORT, + SO_EPROTOTYPE, + SO_ERANGE, + SO_EROFS, + SO_ESPIPE, + SO_ESRCH, + SO_ESTALE, + SO_ETIME, + SO_ETIMEDOUT, + SO_ETXTBSY, + SO_EXDEV +}; + +#pragma pack(push, 1) +struct WiiInAddr +{ + u32 addr; +}; + +struct WiiSockAddr +{ + u8 len; + u8 family; + u8 data[6]; +}; + +struct WiiSockAddrIn +{ + u8 len; + u8 family; + u16 port; + WiiInAddr addr; +}; +#pragma pack(pop) + +class WiiSocket +{ + struct sockop{ + u32 _CommandAddress; + bool is_ssl; + union + { + NET_IOCTL net_type; + SSL_IOCTL ssl_type; + }; + }; +private: + s32 fd; + bool nonBlock; + std::list pending_sockops; + + friend class WiiSockMan; + void setFd(s32 s); + s32 closeFd(); + s32 _fcntl(u32 cmd, u32 arg); + + void doSock(u32 _CommandAddress, NET_IOCTL type); + void doSock(u32 _CommandAddress, SSL_IOCTL type); + void update(bool read, bool write, bool except); + bool valid() {return fd >= 0;} +public: + WiiSocket() : fd(-1), nonBlock(false) {} + ~WiiSocket(); + void operator=(WiiSocket const&); // Don't implement + +}; + +class WiiSockMan +{ +public: + static s32 getNetErrorCode(s32 ret, std::string caller, bool isRW); + static char* DecodeError(s32 ErrorCode); + + static WiiSockMan& getInstance() + { + static WiiSockMan instance; // Guaranteed to be destroyed. + return instance; // Instantiated on first use. + } + void Update(); + static void EnqueueReply(u32 CommandAddress, s32 ReturnValue); + static void Convert(WiiSockAddrIn const & from, sockaddr_in& to); + static void Convert(sockaddr_in const & from, WiiSockAddrIn& to, s32 addrlen=-1); + // NON-BLOCKING FUNCTIONS + s32 newSocket(s32 af, s32 type, s32 protocol); + void addSocket(s32 fd); + s32 delSocket(s32 s); + s32 getLastNetError() {return errono_last;} + void setLastNetError(s32 error) {errono_last = error;} + + void clean() + { + WiiSockets.clear(); + } + + template + void doSock(s32 sock, u32 CommandAddress, T type) + { + if (WiiSockets.find(sock) == WiiSockets.end()) + { + ERROR_LOG(WII_IPC_NET, + "doSock: Error, fd not found (%08x, %08X, %08X)", + sock, CommandAddress, type); + EnqueueReply(CommandAddress, -SO_EBADF); + } + else + { + WiiSockets[sock].doSock(CommandAddress, type); + } + } + +private: + WiiSockMan() {}; // Constructor? (the {} brackets) are needed here. + WiiSockMan(WiiSockMan const&); // Don't Implement + void operator=(WiiSockMan const&); // Don't implement + std::unordered_map WiiSockets; + + s32 errono_last; +}; + +#endif diff --git a/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.cpp b/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.cpp index e96bb5d7da..f919b4dec4 100644 --- a/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.cpp @@ -10,17 +10,17 @@ // 0x00 (checked) u8 ServiceRecordHandle[] = { 0x0a, 0x00, 0x01, 0x00, 0x00 }; // 0x01 (checked) -u8 SrvClassIDList[] = { 0x35, 0x03, +u8 SrvClassIDList[] = { 0x35, 0x03, 0x19, 0x11, 0x24 }; // 0x04 (checked) -u8 ProtocolDescriptorList[] = { 0x35, 0x0D, - 0x35, 0x06, - 0x19, 0x01, 0x00, // Element 0 - 0x09, 0x00, 0x11, // Element 1 +u8 ProtocolDescriptorList[] = { 0x35, 0x0D, + 0x35, 0x06, + 0x19, 0x01, 0x00, // Element 0 + 0x09, 0x00, 0x11, // Element 1 0x35, 0x03, - 0x19, 0x00, 0x11}; // Element 0 + 0x19, 0x00, 0x11}; // Element 0 // 0x5 (checked) -u8 BrowseGroupList[] = { 0x35, 0x03, +u8 BrowseGroupList[] = { 0x35, 0x03, 0x19, 0x10, 0x02 }; // 0x6 (checked) u8 LanguageBaseAttributeIDList[] = { 0x35, 0x09, @@ -34,11 +34,11 @@ u8 BluetoothProfileDescriptorList[] = { 0x35, 0x08, 0x09, 0x01, 0x00 }; // 0x0D (checked) u8 AdditionalProtocolDescriptorLists[] = { 0x35, 0x0F, - 0x35, 0x0D, + 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x13, - 0x35, 0x03, + 0x35, 0x03, 0x19, 0x00, 0x11 }; // 0x100 u8 ServiceName[] = { 0x25, 0x13, 'N','i','n','t','e','n','d','o',' ','R','V','L','-','C','N','T','-','0','1' }; @@ -62,39 +62,39 @@ u8 HIDReconnectInitiate[] = { 0x09, 0x00, 0x01 }; // 0x206 u8 HIDDescriptorList[] = { 0x35, 0xDF, - 0x35, 0xDD, - 0x08, 0x22, // Element 0 + 0x35, 0xDD, + 0x08, 0x22, // Element 0 0x25, 0xD9, // hmm... <- 0x25 is a string but there is Data // 0xD9 Bytes - Element 1 - 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x10, - 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, - 0x01, 0x06, 0x00, 0xff, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x11, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x12, 0x95, 0x02, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x13, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x14, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x15, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x16, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x17, 0x95, 0x06, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x18, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x19, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x1a, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, - 0x85, 0x20, 0x95, 0x06, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x21, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x22, 0x95, 0x04, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x30, 0x95, 0x02, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x31, 0x95, 0x05, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x32, 0x95, 0x0a, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x33, 0x95, 0x11, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x34, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x35, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x36, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x37, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x3d, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x3e, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0x85, 0x3f, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, - 0xc0 }; // end tag + 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x10, + 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, + 0x01, 0x06, 0x00, 0xff, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x11, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x12, 0x95, 0x02, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x13, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x14, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x15, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x16, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x17, 0x95, 0x06, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x18, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x19, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x1a, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, + 0x85, 0x20, 0x95, 0x06, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x21, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x22, 0x95, 0x04, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x30, 0x95, 0x02, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x31, 0x95, 0x05, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x32, 0x95, 0x0a, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x33, 0x95, 0x11, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x34, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x35, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x36, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x37, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x3d, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x3e, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0x85, 0x3f, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, + 0xc0 }; // end tag // 0x207 @@ -121,60 +121,60 @@ u8 HIDBootDevice[] = { 0x28, 0x00 }; static u8 packet1[] = { - 0x00, 0x7b, 0x00, 0x76, 0x36, 0x01, 0xcc, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x01, - 0x00, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x24, 0x09, 0x00, 0x04, 0x35, 0x0d, 0x35, - 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x11, 0x35, 0x03, 0x19, 0x00, 0x11, 0x09, 0x00, 0x05, 0x35, - 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, - 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x24, 0x09, 0x01, 0x00, 0x09, - 0x00, 0x0d, 0x35, 0x0f, 0x35, 0x0d, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x13, 0x35, 0x03, - 0x19, 0x00, 0x11, 0x09, 0x01, 0x00, 0x25, 0x13, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x6f, - 0x20, 0x52, 0x56, 0x4c, 0x2d, 0x43, 0x4e, 0x54, 0x2d, 0x30, 0x31, 0x09, 0x01, 0x02, 0x00, 0x76, + 0x00, 0x7b, 0x00, 0x76, 0x36, 0x01, 0xcc, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x01, + 0x00, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x24, 0x09, 0x00, 0x04, 0x35, 0x0d, 0x35, + 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x11, 0x35, 0x03, 0x19, 0x00, 0x11, 0x09, 0x00, 0x05, 0x35, + 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, + 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x24, 0x09, 0x01, 0x00, 0x09, + 0x00, 0x0d, 0x35, 0x0f, 0x35, 0x0d, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x13, 0x35, 0x03, + 0x19, 0x00, 0x11, 0x09, 0x01, 0x00, 0x25, 0x13, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x6f, + 0x20, 0x52, 0x56, 0x4c, 0x2d, 0x43, 0x4e, 0x54, 0x2d, 0x30, 0x31, 0x09, 0x01, 0x02, 0x00, 0x76, }; static u8 packet2[] = { - 0x00, 0x7b, 0x00, 0x76, 0x01, 0x25, 0x13, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, - 0x64, 0x6f, 0x20, 0x52, 0x56, 0x4c, 0x2d, 0x43, 0x4e, 0x54, 0x2d, 0x30, 0x31, 0x09, 0x01, 0x02, - 0x25, 0x08, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x6f, 0x09, 0x02, 0x00, 0x09, 0x01, 0x00, - 0x09, 0x02, 0x01, 0x09, 0x01, 0x11, 0x09, 0x02, 0x02, 0x08, 0x04, 0x09, 0x02, 0x03, 0x08, 0x33, - 0x09, 0x02, 0x04, 0x28, 0x00, 0x09, 0x02, 0x05, 0x28, 0x01, 0x09, 0x02, 0x06, 0x35, 0xdf, 0x35, - 0xdd, 0x08, 0x22, 0x25, 0xd9, 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x10, 0x15, 0x00, 0x26, - 0xff, 0x00, 0x75, 0x08, 0x95, 0x01, 0x06, 0x00, 0xff, 0x09, 0x01, 0x91, 0x00, 0x85, 0x11, 0x95, - 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x12, 0x95, 0x02, 0x09, 0x01, 0x91, 0x00, 0x02, 0x00, 0xec, + 0x00, 0x7b, 0x00, 0x76, 0x01, 0x25, 0x13, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x64, 0x6f, 0x20, 0x52, 0x56, 0x4c, 0x2d, 0x43, 0x4e, 0x54, 0x2d, 0x30, 0x31, 0x09, 0x01, 0x02, + 0x25, 0x08, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x6f, 0x09, 0x02, 0x00, 0x09, 0x01, 0x00, + 0x09, 0x02, 0x01, 0x09, 0x01, 0x11, 0x09, 0x02, 0x02, 0x08, 0x04, 0x09, 0x02, 0x03, 0x08, 0x33, + 0x09, 0x02, 0x04, 0x28, 0x00, 0x09, 0x02, 0x05, 0x28, 0x01, 0x09, 0x02, 0x06, 0x35, 0xdf, 0x35, + 0xdd, 0x08, 0x22, 0x25, 0xd9, 0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x10, 0x15, 0x00, 0x26, + 0xff, 0x00, 0x75, 0x08, 0x95, 0x01, 0x06, 0x00, 0xff, 0x09, 0x01, 0x91, 0x00, 0x85, 0x11, 0x95, + 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x12, 0x95, 0x02, 0x09, 0x01, 0x91, 0x00, 0x02, 0x00, 0xec, }; static u8 packet3[] = { - 0x00, 0x7b, 0x00, 0x76, 0x85, 0x13, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, - 0x14, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x15, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, - 0x16, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, 0x85, 0x17, 0x95, 0x06, 0x09, 0x01, 0x91, 0x00, 0x85, - 0x18, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, 0x85, 0x19, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, - 0x1a, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x20, 0x95, 0x06, 0x09, 0x01, 0x81, 0x00, 0x85, - 0x21, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x22, 0x95, 0x04, 0x09, 0x01, 0x81, 0x00, 0x85, - 0x30, 0x95, 0x02, 0x09, 0x01, 0x81, 0x00, 0x85, 0x31, 0x95, 0x05, 0x09, 0x01, 0x81, 0x00, 0x85, - 0x32, 0x95, 0x0a, 0x09, 0x01, 0x81, 0x00, 0x85, 0x33, 0x95, 0x11, 0x09, 0x01, 0x02, 0x01, 0x62, + 0x00, 0x7b, 0x00, 0x76, 0x85, 0x13, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, + 0x14, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x15, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, + 0x16, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, 0x85, 0x17, 0x95, 0x06, 0x09, 0x01, 0x91, 0x00, 0x85, + 0x18, 0x95, 0x15, 0x09, 0x01, 0x91, 0x00, 0x85, 0x19, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, + 0x1a, 0x95, 0x01, 0x09, 0x01, 0x91, 0x00, 0x85, 0x20, 0x95, 0x06, 0x09, 0x01, 0x81, 0x00, 0x85, + 0x21, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x22, 0x95, 0x04, 0x09, 0x01, 0x81, 0x00, 0x85, + 0x30, 0x95, 0x02, 0x09, 0x01, 0x81, 0x00, 0x85, 0x31, 0x95, 0x05, 0x09, 0x01, 0x81, 0x00, 0x85, + 0x32, 0x95, 0x0a, 0x09, 0x01, 0x81, 0x00, 0x85, 0x33, 0x95, 0x11, 0x09, 0x01, 0x02, 0x01, 0x62, }; static u8 packet4[] = { - 0x00, 0x70, 0x00, 0x6d, 0x81, 0x00, 0x85, 0x34, 0x95, 0x15, 0x09, 0x01, 0x81, - 0x00, 0x85, 0x35, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x36, 0x95, 0x15, 0x09, 0x01, 0x81, - 0x00, 0x85, 0x37, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x3d, 0x95, 0x15, 0x09, 0x01, 0x81, - 0x00, 0x85, 0x3e, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x3f, 0x95, 0x15, 0x09, 0x01, 0x81, - 0x00, 0xc0, 0x09, 0x02, 0x07, 0x35, 0x08, 0x35, 0x06, 0x09, 0x04, 0x09, 0x09, 0x01, 0x00, 0x09, - 0x02, 0x08, 0x28, 0x00, 0x09, 0x02, 0x09, 0x28, 0x01, 0x09, 0x02, 0x0a, 0x28, 0x01, 0x09, 0x02, - 0x0b, 0x09, 0x01, 0x00, 0x09, 0x02, 0x0c, 0x09, 0x0c, 0x80, 0x09, 0x02, 0x0d, 0x28, 0x00, 0x09, - 0x02, 0x0e, 0x28, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x6d, 0x81, 0x00, 0x85, 0x34, 0x95, 0x15, 0x09, 0x01, 0x81, + 0x00, 0x85, 0x35, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x36, 0x95, 0x15, 0x09, 0x01, 0x81, + 0x00, 0x85, 0x37, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x3d, 0x95, 0x15, 0x09, 0x01, 0x81, + 0x00, 0x85, 0x3e, 0x95, 0x15, 0x09, 0x01, 0x81, 0x00, 0x85, 0x3f, 0x95, 0x15, 0x09, 0x01, 0x81, + 0x00, 0xc0, 0x09, 0x02, 0x07, 0x35, 0x08, 0x35, 0x06, 0x09, 0x04, 0x09, 0x09, 0x01, 0x00, 0x09, + 0x02, 0x08, 0x28, 0x00, 0x09, 0x02, 0x09, 0x28, 0x01, 0x09, 0x02, 0x0a, 0x28, 0x01, 0x09, 0x02, + 0x0b, 0x09, 0x01, 0x00, 0x09, 0x02, 0x0c, 0x09, 0x0c, 0x80, 0x09, 0x02, 0x0d, 0x28, 0x00, 0x09, + 0x02, 0x0e, 0x28, 0x00, 0x00, }; static u8 packet4_0x10001[] = { - 0x00, 0x60, 0x00, 0x5d, 0x36, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x01, - 0x00, 0x01, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x12, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0d, 0x35, - 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x05, 0x35, - 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x12, 0x00, 0x09, 0x01, - 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x00, 0x09, 0x02, 0x01, 0x09, 0x05, 0x7e, 0x09, 0x02, 0x02, - 0x09, 0x03, 0x06, 0x09, 0x02, 0x03, 0x09, 0x06, 0x00, 0x09, 0x02, 0x04, 0x28, 0x01, 0x09, 0x02, - 0x05, 0x09, 0x00, 0x02, 0x00, + 0x00, 0x60, 0x00, 0x5d, 0x36, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x01, + 0x00, 0x01, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x12, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0d, 0x35, + 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x05, 0x35, + 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x12, 0x00, 0x09, 0x01, + 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x00, 0x09, 0x02, 0x01, 0x09, 0x05, 0x7e, 0x09, 0x02, 0x02, + 0x09, 0x03, 0x06, 0x09, 0x02, 0x03, 0x09, 0x06, 0x00, 0x09, 0x02, 0x04, 0x28, 0x01, 0x09, 0x02, + 0x05, 0x09, 0x00, 0x02, 0x00, }; diff --git a/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.h b/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.h index a9350ec532..ac21d4cd48 100644 --- a/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.h +++ b/Source/Core/Core/Src/IPC_HLE/WiiMote_HID_Attr.h @@ -12,7 +12,7 @@ struct SAttrib u8* pData; u16 size; - SAttrib(u16 _ID, u8* _Data, u16 _size) + SAttrib(u16 _ID, u8* _Data, u16 _size) : ID(_ID) , pData(_Data) , size(_size) diff --git a/Source/Core/Core/Src/IPC_HLE/fakepoll.h b/Source/Core/Core/Src/IPC_HLE/fakepoll.h new file mode 100644 index 0000000000..384f0b5567 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/fakepoll.h @@ -0,0 +1,168 @@ +// fakepoll.h +// poll using select +//Matthew Parlane sourced this from http://www.sealiesoftware.com/ +//Was listed as "Public domain." as of 31/07/2010 + +// Warning: a call to this poll() takes about 4K of stack space. + +// Greg Parker gparker-web@sealiesoftware.com December 2000 +// This code is in the public domain and may be copied or modified without +// permission. + +// Updated May 2002: +// * fix crash when an fd is less than 0 +// * set errno=EINVAL if an fd is greater or equal to FD_SETSIZE +// * don't set POLLIN or POLLOUT in revents if it wasn't requested +// in events (only happens when an fd is in the poll set twice) + +#if (_WIN32_WINNT < _WIN32_WINNT_VISTA) + +#ifndef _FAKE_POLL_H +#define _FAKE_POLL_H + +#include +#include +#include + +typedef struct pollfd { + int fd; /* file desc to poll */ + int events; /* events of interest on fd */ + int revents; /* events that occurred on fd */ +} pollfd_t; + +#define EINVAL 22 +// poll flags +#define POLLIN 0x0001 +#define POLLOUT 0x0008 +#define POLLERR 0x0020 + +// synonyms +#define POLLNORM POLLIN +#define POLLPRI POLLIN +#define POLLRDNORM POLLIN +#define POLLRDBAND POLLIN +#define POLLWRNORM POLLOUT +#define POLLWRBAND POLLOUT + +// ignored +#define POLLHUP 0x0040 +#define POLLNVAL 0x0080 + +inline int poll(struct pollfd *pollSet, int pollCount, int pollTimeout) +{ + struct timeval tv; + struct timeval *tvp; + fd_set readFDs, writeFDs, exceptFDs; + fd_set *readp, *writep, *exceptp; + struct pollfd *pollEnd, *p; + int selected; + int result; + int maxFD; + + if (!pollSet) { + pollEnd = NULL; + readp = NULL; + writep = NULL; + exceptp = NULL; + maxFD = 0; + } + else { + pollEnd = pollSet + pollCount; + readp = &readFDs; + writep = &writeFDs; + exceptp = &exceptFDs; + + FD_ZERO(readp); + FD_ZERO(writep); + FD_ZERO(exceptp); + + // Find the biggest fd in the poll set + maxFD = 0; + for (p = pollSet; p < pollEnd; p++) { + if (p->fd > maxFD) maxFD = p->fd; + } + + // Transcribe flags from the poll set to the fd sets + for (p = pollSet; p < pollEnd; p++) { + if (p->fd < 0) { + // Negative fd checks nothing and always reports zero + } else { + if (p->events & POLLIN) FD_SET(p->fd, readp); + if (p->events & POLLOUT) FD_SET(p->fd, writep); + if (p->events != 0) FD_SET(p->fd, exceptp); + // POLLERR is never set coming in; poll() always reports errors + // But don't report if we're not listening to anything at all. + } + } + } + + // poll timeout is in milliseconds. Convert to struct timeval. + // poll timeout == -1 : wait forever : select timeout of NULL + // poll timeout == 0 : return immediately : select timeout of zero + if (pollTimeout >= 0) { + tv.tv_sec = pollTimeout / 1000; + tv.tv_usec = (pollTimeout % 1000) * 1000; + tvp = &tv; + } else { + tvp = NULL; + } + + + selected = select(maxFD+1, readp, writep, exceptp, tvp); + + + if (selected < 0) { + // Error during select + result = -1; + } + else if (selected > 0) { + // Select found something + // Transcribe result from fd sets to poll set. + // Also count the number of selected fds. poll returns the + // number of ready fds; select returns the number of bits set. + int polled = 0; + for (p = pollSet; p < pollEnd; p++) { + p->revents = 0; + if (p->fd < 0) { + // Negative fd always reports zero + } else { + int isToRead = FD_ISSET(p->fd, readp); + if ((p->events & POLLIN) && isToRead) { + p->revents |= POLLIN; + } + + int isToWrite = FD_ISSET(p->fd, writep); + if ((p->events & POLLOUT) && isToWrite) { + p->revents |= POLLOUT; + } + + int isToError = FD_ISSET(p->fd, exceptp); + if ((p->events != 0) && isToError) { + p->revents |= POLLERR; + } + + if (p->revents) polled++; + } + } + result = polled; + } + else { + // selected == 0, select timed out before anything happened + // Clear all result bits and return zero. + for (p = pollSet; p < pollEnd; p++) { + p->revents = 0; + + } + result = 0; + } + return result; +} + +#endif + +#else // (_WIN32_WINNT < _WIN32_WINNT_VISTA) + +typedef pollfd pollfd_t; +#define poll WSAPoll + +#endif diff --git a/Source/Core/Core/Src/IPC_HLE/hci.h b/Source/Core/Core/Src/IPC_HLE/hci.h index 1c59d4036b..41f145a8ed 100644 --- a/Source/Core/Core/Src/IPC_HLE/hci.h +++ b/Source/Core/Core/Src/IPC_HLE/hci.h @@ -84,25 +84,18 @@ // All structs in this file are packed #pragma pack(push, 1) -/* - * Bluetooth Address Family Protocol Numbers - */ -#define BTPROTO_HCI 1 -#define BTPROTO_L2CAP 2 -#define BTPROTO_RFCOMM 3 -#define BTPROTO_SCO 4 - /* All sizes are in bytes */ #define BLUETOOTH_BDADDR_SIZE 6 /* * Bluetooth device address */ +#ifndef __BLUETOOTH_H typedef struct { uint8_t b[BLUETOOTH_BDADDR_SIZE]; } bdaddr_t; - #define BDADDR_ANY { { 0, 0, 0, 0, 0, 0 } } +#endif /************************************************************************** ************************************************************************** @@ -2414,7 +2407,7 @@ struct SHCIEventStatus u8 EventType; u8 PayloadLength; u8 EventStatus; - u8 PacketIndicator; + u8 PacketIndicator; u16 Opcode; }; diff --git a/Source/Core/Core/Src/MemTools.h b/Source/Core/Core/Src/MemTools.h index a791684c41..2bdd088377 100644 --- a/Source/Core/Core/Src/MemTools.h +++ b/Source/Core/Core/Src/MemTools.h @@ -5,7 +5,7 @@ #ifndef _MEMTOOLS_H #define _MEMTOOLS_H -#include "Common.h" +#include "CommonTypes.h" namespace EMM diff --git a/Source/Core/Core/Src/Movie.cpp b/Source/Core/Core/Src/Movie.cpp index e4711c2e14..cc5b099ee0 100644 --- a/Source/Core/Core/Src/Movie.cpp +++ b/Source/Core/Core/Src/Movie.cpp @@ -22,8 +22,8 @@ #include "HW/EXI_Channel.h" #include "HW/DVDInterface.h" #include "../../Common/Src/NandPaths.h" -#include "Crypto/md5.h" -#include "scmrev.h" +#include "polarssl/md5.h" +#include "NetPlayProto.h" // The chunk to allocate movie data in multiples of. #define DTM_BASE_LENGTH (1024) @@ -50,8 +50,8 @@ u64 g_currentFrame = 0, g_totalFrames = 0; // VI u64 g_currentLagCount = 0, g_totalLagCount = 0; // just stats u64 g_currentInputCount = 0, g_totalInputCount = 0; // just stats u64 g_recordingStartTime; // seconds since 1970 that recording started -bool bSaveConfig, bSkipIdle, bDualCore, bProgressive, bDSPHLE, bFastDiscSpeed = false; -bool bMemcard, g_bClearSave, bSyncGPU = false; +bool bSaveConfig = false, bSkipIdle = false, bDualCore = false, bProgressive = false, bDSPHLE = false, bFastDiscSpeed = false; +bool bMemcard = false, g_bClearSave = false, bSyncGPU = false, bNetPlay = false; std::string videoBackend = "unknown"; int iCPUCore = 1; bool g_bDiscChange = false; @@ -66,7 +66,7 @@ bool g_bRecordingFromSaveState = false; bool g_bPolled = false; int g_currentSaveVersion = 0; -std::string tmpStateFilename = "dtm.sav"; +std::string tmpStateFilename = File::GetUserPath(D_STATESAVES_IDX) + "dtm.sav"; std::string g_InputDisplay[8]; @@ -81,7 +81,7 @@ void EnsureTmpInputSize(size_t bound) size_t newAlloc = DTM_BASE_LENGTH; while (newAlloc < bound) newAlloc *= 2; - + u8* newTmpInput = new u8[newAlloc]; tmpInputAllocated = newAlloc; if (tmpInput != NULL) @@ -111,14 +111,14 @@ std::string GetInputDisplay() for (int i = 0; i < 8; ++i) if ((g_numPads & (1 << i)) != 0) inputDisplay.append(g_InputDisplay[i]); - - return inputDisplay; + + return inputDisplay; } void FrameUpdate() { g_currentFrame++; - if(!g_bPolled) + if(!g_bPolled) g_currentLagCount++; if (IsRecordingInput()) @@ -131,7 +131,7 @@ void FrameUpdate() Core::SetState(Core::CORE_PAUSE); g_bFrameStep = false; } - + // ("framestop") the only purpose of this is to cause interpreter/jit Run() to return temporarily. // after that we set it back to CPU_RUNNING and continue as normal. if (g_bFrameStop) @@ -139,7 +139,7 @@ void FrameUpdate() if(g_framesToSkip) FrameSkipping(); - + g_bPolled = false; } @@ -176,8 +176,8 @@ void Init() if (!tmpHeader.bFromSaveState || !IsPlayingInput()) Core::SetStateFileName(""); - for (int i = 0; i < 8; ++i) - g_InputDisplay[i].clear(); + for (auto& disp : g_InputDisplay) + disp.clear(); if (!IsPlayingInput() && !IsRecordingInput()) { @@ -203,10 +203,10 @@ void InputUpdate() void SetFrameSkipping(unsigned int framesToSkip) { std::lock_guard lk(cs_frameSkip); - + g_framesToSkip = framesToSkip; g_frameSkipCounter = 0; - + // Don't forget to re-enable rendering in case it wasn't... // as this won't be changed anymore when frameskip is turned off if (framesToSkip == 0) @@ -360,6 +360,11 @@ bool IsSyncGPU() return bSyncGPU; } +bool IsNetPlayRecording() +{ + return bNetPlay; +} + void ChangePads(bool instantly) { if (Core::GetState() == Core::CORE_UNINITIALIZED) @@ -409,7 +414,14 @@ bool BeginRecordingInput(int controllers) g_currentFrame = g_totalFrames = 0; g_currentLagCount = g_totalLagCount = 0; g_currentInputCount = g_totalInputCount = 0; - g_recordingStartTime = Common::Timer::GetLocalTimeSinceJan1970(); + if (NetPlay::IsNetPlayRunning()) + { + bNetPlay = true; + g_recordingStartTime = NETPLAY_INITIAL_GCTIME; + } + else + g_recordingStartTime = Common::Timer::GetLocalTimeSinceJan1970(); + g_rerecords = 0; for (int i = 0; i < 4; i++) @@ -434,6 +446,7 @@ bool BeginRecordingInput(int controllers) Movie::g_bClearSave = true; } std::thread md5thread(GetMD5); + md5thread.detach(); GetSettings(); } g_playMode = MODE_RECORDING; @@ -682,7 +695,8 @@ void ReadHeader() bMemcard = tmpHeader.bMemcard; bongos = tmpHeader.bongos; bSyncGPU = tmpHeader.bSyncGPU; - memcpy(revision, tmpHeader.revision, ARRAYSIZE(revision)); + bNetPlay = tmpHeader.bNetPlay; + memcpy(revision, tmpHeader.revision, ArraySize(revision)); } else { @@ -709,7 +723,7 @@ bool PlayInput(const char *filename) return false; g_recordfd.ReadArray(&tmpHeader, 1); - + if(tmpHeader.filetype[0] != 'D' || tmpHeader.filetype[1] != 'T' || tmpHeader.filetype[2] != 'M' || tmpHeader.filetype[3] != 0x1A) { PanicAlertT("Invalid recording file"); goto cleanup; @@ -724,7 +738,7 @@ bool PlayInput(const char *filename) g_currentInputCount = 0; g_playMode = MODE_PLAYING; - + g_totalBytes = g_recordfd.GetSize() - 256; EnsureTmpInputSize((size_t)g_totalBytes); g_recordfd.ReadArray(tmpInput, (size_t)g_totalBytes); @@ -835,7 +849,7 @@ void LoadInput(const char *filename) // this is a "you did something wrong" alert for the user's benefit. // we'll try to say what's going on in excruciating detail, otherwise the user might not believe us. if(IsUsingWiimote(0)) - { + { // TODO: more detail PanicAlertT("Warning: You loaded a save whose movie mismatches on byte %d (0x%X). You should load another save before continuing, or load this state with read-only mode off. Otherwise you'll probably get a desync.", i+256, i+256); memcpy(tmpInput, movInput, g_currentByte); @@ -928,7 +942,7 @@ void PlayController(SPADStatus *PadStatus, int controllerID) memcpy(&g_padState, &(tmpInput[g_currentByte]), 8); g_currentByte += 8; - + PadStatus->triggerLeft = g_padState.TriggerL; PadStatus->triggerRight = g_padState.TriggerR; @@ -939,7 +953,7 @@ void PlayController(SPADStatus *PadStatus, int controllerID) PadStatus->substickY = g_padState.CStickY; PadStatus->button |= PAD_USE_ORIGIN; - + if(g_padState.A) { PadStatus->button |= PAD_BUTTON_A; @@ -958,7 +972,7 @@ void PlayController(SPADStatus *PadStatus, int controllerID) PadStatus->button |= PAD_TRIGGER_Z; if(g_padState.Start) PadStatus->button |= PAD_BUTTON_START; - + if(g_padState.DPadUp) PadStatus->button |= PAD_BUTTON_UP; if(g_padState.DPadDown) @@ -967,7 +981,7 @@ void PlayController(SPADStatus *PadStatus, int controllerID) PadStatus->button |= PAD_BUTTON_LEFT; if(g_padState.DPadRight) PadStatus->button |= PAD_BUTTON_RIGHT; - + if(g_padState.L) PadStatus->button |= PAD_TRIGGER_L; if(g_padState.R) @@ -1025,7 +1039,8 @@ bool PlayWiimote(int wiimote, u8 *data, const WiimoteEmu::ReportFeatures& rptf, if (size != sizeInMovie) { - PanicAlertT("Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s", (u32)sizeInMovie, (u32)size, (u32)g_currentByte, (g_numPads & 0xF)?" Try re-creating the recording with all GameCube controllers disabled (in Configure > Gamecube > Device Settings), or restarting Dolphin (Dolphin currently must be restarted every time before playing back a wiimote movie).":""); + PanicAlertT("Fatal desync. Aborting playback. (Error in PlayWiimote: %u != %u, byte %u.)%s", (u32)sizeInMovie, (u32)size, (u32)g_currentByte, + (g_numPads & 0xF)?" Try re-creating the recording with all GameCube controllers disabled (in Configure > Gamecube > Device Settings)." : ""); EndPlayInput(!g_bReadOnly); return false; } @@ -1038,19 +1053,19 @@ bool PlayWiimote(int wiimote, u8 *data, const WiimoteEmu::ReportFeatures& rptf, EndPlayInput(!g_bReadOnly); return false; } - + memcpy(data, &(tmpInput[g_currentByte]), size); g_currentByte += size; - + SetWiiInputDisplayString(wiimote, coreData, accelData, irData); g_currentInputCount++; - + CheckInputEnd(); return true; } -void EndPlayInput(bool cont) +void EndPlayInput(bool cont) { if (cont) { @@ -1077,12 +1092,12 @@ void SaveRecording(const char *filename) // Create the real header now and write it DTMHeader header; memset(&header, 0, sizeof(DTMHeader)); - + header.filetype[0] = 'D'; header.filetype[1] = 'T'; header.filetype[2] = 'M'; header.filetype[3] = 0x1A; strncpy((char *)header.gameID, Core::g_CoreStartupParameter.GetUniqueID().c_str(), 6); header.bWii = Core::g_CoreStartupParameter.bWii; header.numControllers = g_numPads & (Core::g_CoreStartupParameter.bWii ? 0xFF : 0x0F); - + header.bFromSaveState = g_bRecordingFromSaveState; header.frameCount = g_totalFrames; header.lagCount = g_totalLagCount; @@ -1096,7 +1111,7 @@ void SaveRecording(const char *filename) header.bProgressive = bProgressive; header.bDSPHLE = bDSPHLE; header.bFastDiscSpeed = bFastDiscSpeed; - strncpy((char *)header.videoBackend, videoBackend.c_str(),ARRAYSIZE(header.videoBackend)); + strncpy((char *)header.videoBackend, videoBackend.c_str(),ArraySize(header.videoBackend)); header.CPUCore = iCPUCore; header.bEFBAccessEnable = g_ActiveConfig.bEFBAccessEnable; header.bEFBCopyEnable = g_ActiveConfig.bEFBCopyEnable; @@ -1108,14 +1123,15 @@ void SaveRecording(const char *filename) header.bMemcard = bMemcard; header.bClearSave = g_bClearSave; header.bSyncGPU = bSyncGPU; - strncpy((char *)header.discChange, g_discChange.c_str(),ARRAYSIZE(header.discChange)); - strncpy((char *)header.author, author.c_str(),ARRAYSIZE(header.author)); + header.bNetPlay = bNetPlay; + strncpy((char *)header.discChange, g_discChange.c_str(),ArraySize(header.discChange)); + strncpy((char *)header.author, author.c_str(),ArraySize(header.author)); memcpy(header.md5,MD5,16); header.bongos = bongos; - memcpy(header.revision, revision, ARRAYSIZE(header.revision)); + memcpy(header.revision, revision, ArraySize(header.revision)); // TODO - header.uniqueID = 0; + header.uniqueID = 0; // header.audioEmulator; save_record.WriteArray(&header, 1); @@ -1128,7 +1144,7 @@ void SaveRecording(const char *filename) stateFilename.append(".sav"); success = File::Copy(tmpStateFilename, stateFilename); } - + if (success) Core::DisplayMessage(StringFromFormat("DTM %s saved", filename).c_str(), 2000); else @@ -1168,13 +1184,14 @@ void GetSettings() videoBackend = g_video_backend->GetName(); bSyncGPU = SConfig::GetInstance().m_LocalCoreStartupParameter.bSyncGPU; iCPUCore = SConfig::GetInstance().m_LocalCoreStartupParameter.iCPUCore; + bNetPlay = NetPlay::IsNetPlayRunning(); if (!Core::g_CoreStartupParameter.bWii) g_bClearSave = !File::Exists(SConfig::GetInstance().m_strMemoryCardA); bMemcard = SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD; u8 tmp[21]; for (int i = 0; i < 20; ++i) { - sscanf(SCM_REV_STR + 2 * i, "%02hhx", &tmp[i]); + sscanf(&scm_rev_git_str[2 * i], "%02hhx", &tmp[i]); revision[i] = tmp[i]; } } diff --git a/Source/Core/Core/Src/Movie.h b/Source/Core/Core/Src/Movie.h index 27ac18e1b6..fcfa935cf4 100644 --- a/Source/Core/Core/Src/Movie.h +++ b/Source/Core/Core/Src/Movie.h @@ -41,7 +41,7 @@ struct ControllerState { u8 TriggerL, TriggerR; // Triggers, 16 bits u8 AnalogStickX, AnalogStickY; // Main Stick, 16 bits u8 CStickX, CStickY; // Sub-Stick, 16 bits - + }; // Total: 60 + 4 = 64 bits per frame static_assert(sizeof(ControllerState) == 8, "ControllerState should be 8 bytes"); #pragma pack(pop) @@ -107,7 +107,8 @@ struct DTMHeader { bool bClearSave; // Create a new memory card when playing back a movie if true u8 bongos; bool bSyncGPU; - u8 reserved[14]; // Padding for any new config options + bool bNetPlay; + u8 reserved[13]; // Padding for any new config options u8 discChange[40]; // Name of iso file to switch to, for two disc games. u8 revision[20]; // Git hash u8 reserved2[27]; // Make heading 256 bytes, just because we can @@ -142,6 +143,7 @@ bool IsUsingMemcard(); bool IsSyncGPU(); void SetGraphicsConfig(); void GetSettings(); +bool IsNetPlayRecording(); bool IsUsingPad(int controller); bool IsUsingWiimote(int wiimote); diff --git a/Source/Core/Core/Src/NetPlayClient.cpp b/Source/Core/Core/Src/NetPlayClient.cpp index 33f31a1815..6ca13b4836 100644 --- a/Source/Core/Core/Src/NetPlayClient.cpp +++ b/Source/Core/Core/Src/NetPlayClient.cpp @@ -5,9 +5,11 @@ #include "NetPlayClient.h" // for wiimote +#include "HW/WiimoteReal/WiimoteReal.h" #include "IPC_HLE/WII_IPC_HLE_Device_usb.h" #include "IPC_HLE/WII_IPC_HLE_WiiMote.h" // for gcpad +#include "HW/SI.h" #include "HW/SI_DeviceGCController.h" #include "HW/SI_DeviceGCSteeringWheel.h" #include "HW/SI_DeviceDanceMat.h" @@ -16,6 +18,8 @@ // for wiimote/ OSD messages #include "Core.h" #include "ConfigManager.h" +#include "Movie.h" +#include "HW/WiimoteEmu/WiimoteEmu.h" std::mutex crit_netplay_client; static NetPlayClient * netplay_client = NULL; @@ -23,22 +27,6 @@ NetSettings g_NetPlaySettings; #define RPT_SIZE_HACK (1 << 16) -NetPlayClient::Player::Player() -{ - memset(pad_map, -1, sizeof(pad_map)); -} - -// called from ---GUI--- thread -std::string NetPlayClient::Player::ToString() const -{ - std::ostringstream ss; - ss << name << '[' << (char)(pid+'0') << "] : " << revision << " |"; - for (unsigned int i=0; i<4; ++i) - ss << (pad_map[i]>=0 ? (char)(pad_map[i]+'1') : '-'); - ss << " | " << ping << "ms"; - return ss.str(); -} - NetPad::NetPad() { nHi = 0x00808080; @@ -200,16 +188,19 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) case NP_MSG_PAD_MAPPING : { - PlayerId pid; - packet >> pid; + for (PadMapping i = 0; i < 4; i++) + packet >> m_pad_map[i]; - { - std::lock_guard lkp(m_crit.players); - Player& player = m_players[pid]; + UpdateDevices(); - for (unsigned int i=0; i<4; ++i) - packet >> player.pad_map[i]; - } + m_dialog->Update(); + } + break; + + case NP_MSG_WIIMOTE_MAPPING : + { + for (PadMapping i = 0; i < 4; i++) + packet >> m_wiimote_map[i]; m_dialog->Update(); } @@ -223,10 +214,31 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) // trusting server for good map value (>=0 && <4) // add to pad buffer - m_pad_buffer[(unsigned)map].Push(np); + m_pad_buffer[map].Push(np); } break; + case NP_MSG_WIIMOTE_DATA : + { + PadMapping map = 0; + NetWiimote nw; + u8 size; + packet >> map >> size; + + nw.resize(size); + u8* data = new u8[size]; + for (unsigned int i = 0; i < size; ++i) + packet >> data[i]; + nw.assign(data,data+size); + delete[] data; + + // trusting server for good map value (>=0 && <4) + // add to wiimote buffer + m_wiimote_buffer[(unsigned)map].Push(nw); + } + break; + + case NP_MSG_PAD_BUFFER : { u32 size = 0; @@ -257,8 +269,11 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet) packet >> g_NetPlaySettings.m_DSPEnableJIT; packet >> g_NetPlaySettings.m_DSPHLE; packet >> g_NetPlaySettings.m_WriteToMemcard; - for (unsigned int i = 0; i < 4; ++i) - packet >> g_NetPlaySettings.m_Controllers[i]; + int tmp; + packet >> tmp; + g_NetPlaySettings.m_EXIDevice[0] = (TEXIDevices) tmp; + packet >> tmp; + g_NetPlaySettings.m_EXIDevice[1] = (TEXIDevices) tmp; } m_dialog->OnMsgStartGame(); @@ -361,13 +376,43 @@ void NetPlayClient::GetPlayerList(std::string& list, std::vector& pid_list) e = m_players.end(); for ( ; i!=e; ++i) { - ss << i->second.ToString() << '\n'; - pid_list.push_back(i->second.pid); + const Player *player = &(i->second); + ss << player->name << "[" << (int)player->pid << "] : " << player->revision << " | "; + for (unsigned int j = 0; j < 4; j++) + { + if (m_pad_map[j] == player->pid) + ss << j + 1; + else + ss << '-'; + } + for (unsigned int j = 0; j < 4; j++) + { + if (m_wiimote_map[j] == player->pid) + ss << j + 1; + else + ss << '-'; + } + ss << " | " << player->ping << "ms\n"; + pid_list.push_back(player->pid); } list = ss.str(); } +// called from ---GUI--- thread +void NetPlayClient::GetPlayers(std::vector &player_list) +{ + std::lock_guard lkp(m_crit.players); + std::map::const_iterator + i = m_players.begin(), + e = m_players.end(); + for ( ; i!=e; ++i) + { + const Player *player = &(i->second); + player_list.push_back(player); + } +} + // called from ---GUI--- thread void NetPlayClient::SendChatMessage(const std::string& msg) @@ -381,18 +426,35 @@ void NetPlayClient::SendChatMessage(const std::string& msg) } // called from ---CPU--- thread -void NetPlayClient::SendPadState(const PadMapping local_nb, const NetPad& np) +void NetPlayClient::SendPadState(const PadMapping in_game_pad, const NetPad& np) { // send to server sf::Packet spac; spac << (MessageId)NP_MSG_PAD_DATA; - spac << local_nb; // local pad num + spac << in_game_pad; spac << np.nHi << np.nLo; std::lock_guard lks(m_crit.send); m_socket.Send(spac); } +// called from ---CPU--- thread +void NetPlayClient::SendWiimoteState(const PadMapping in_game_pad, const NetWiimote& nw) +{ + // send to server + sf::Packet spac; + spac << (MessageId)NP_MSG_WIIMOTE_DATA; + spac << in_game_pad; + spac << (u8)nw.size(); + for (auto it : nw) + { + spac << it; + } + + std::lock_guard lks(m_crit.send); + m_socket.Send(spac); +} + // called from ---GUI--- thread bool NetPlayClient::StartGame(const std::string &path) { @@ -420,14 +482,46 @@ bool NetPlayClient::StartGame(const std::string &path) ClearBuffers(); + if (m_dialog->IsRecording()) + { + + if (Movie::IsReadOnly()) + Movie::SetReadOnly(false); + + u8 controllers_mask = 0; + for (unsigned int i = 0; i < 4; ++i) + { + if (m_pad_map[i] > 0) + controllers_mask |= (1 << i); + if (m_wiimote_map[i] > 0) + controllers_mask |= (1 << (i + 4)); + } + Movie::BeginRecordingInput(controllers_mask); + } + // boot game + m_dialog->BootGame(path); - // temporary - NetWiimote nw; - for (unsigned int i = 0; i<4; ++i) - for (unsigned int f = 0; f<2; ++f) - m_wiimote_buffer[i].Push(nw); + UpdateDevices(); + + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) + { + for (unsigned int i = 0; i < 4; ++i) + WiimoteReal::ChangeWiimoteSource(i, m_wiimote_map[i] > 0 ? WIIMOTE_SRC_EMU : WIIMOTE_SRC_NONE); + + // Needed to prevent locking up at boot if (when) the wiimotes connect out of order. + NetWiimote nw; + nw.resize(4, 0); + + for (unsigned int w = 0; w < 4; ++w) + { + if (m_wiimote_map[w] != -1) + // probably overkill, but whatever + for (unsigned int i = 0; i < 7; ++i) + m_wiimote_buffer[w].Push(nw); + } + } return true; } @@ -438,6 +532,16 @@ bool NetPlayClient::ChangeGame(const std::string&) return true; } +// called from ---NETPLAY--- thread +void NetPlayClient::UpdateDevices() +{ + for (PadMapping i = 0; i < 4; i++) + { + // XXX: add support for other device types? does it matter? + SerialInterface::AddDevice(m_pad_map[i] > 0 ? SIDEVICE_GC_CONTROLLER : SIDEVICE_NONE, i); + } +} + // called from ---NETPLAY--- thread void NetPlayClient::ClearBuffers() { @@ -449,21 +553,41 @@ void NetPlayClient::ClearBuffers() while (m_wiimote_buffer[i].Size()) m_wiimote_buffer[i].Pop(); - - m_wiimote_input[i].clear(); } } // called from ---CPU--- thread bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, NetPad* const netvalues) { - { - std::lock_guard lkp(m_crit.players); + // The interface for this is extremely silly. + // + // Imagine a physical device that links three Gamecubes together + // and emulates NetPlay that way. Which Gamecube controls which + // in-game controllers can be configured on the device (m_pad_map) + // but which sockets on each individual Gamecube should be used + // to control which players? The solution that Dolphin uses is + // that we hardcode the knowledge that they go in order, so if + // you have a 3P game with three gamecubes, then every single + // controller should be plugged into slot 1. + // + // If you have a 4P game, then one of the Gamecubes will have + // a controller plugged into slot 1, and another in slot 2. + // + // The slot number is the "local" pad number, and what player + // it actually means is the "in-game" pad number. + // + // The interface here gives us the status of local pads, and + // expects to get back "in-game" pad numbers back in response. + // e.g. it asks "here's the input that slot 1 has, and by the + // way, what's the state of P1?" + // + // We should add this split between "in-game" pads and "local" + // pads higher up. - // in game mapping for this local pad - unsigned int in_game_num = m_local_player->pad_map[pad_nb]; + int in_game_num = LocalPadToInGamePad(pad_nb); - // does this local pad map in game? + // If this in-game pad is one of ours, then update from the + // information given. if (in_game_num < 4) { NetPad np(pad_status); @@ -476,89 +600,139 @@ bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_stat m_pad_buffer[in_game_num].Push(np); // send - SendPadState(pad_nb, np); + SendPadState(in_game_num, np); } } - } // unlock players - - //Common::Timer bufftimer; - //bufftimer.Start(); - - // get padstate from buffer and send to game + // Now, we need to swap out the local value with the values + // retrieved from NetPlay. This could be the value we pushed + // above if we're configured as P1 and the code is trying + // to retrieve data for slot 1. while (!m_pad_buffer[pad_nb].Pop(*netvalues)) { - // wait for receiving thread to push some data - Common::SleepCurrentThread(1); - - if (false == m_is_running) + if (!m_is_running) return false; - // TODO: check the time of bufftimer here, - // if it gets pretty high, ask the user if they want to disconnect - + // TODO: use a condition instead of sleeping + Common::SleepCurrentThread(1); } - //u64 hangtime = bufftimer.GetTimeElapsed(); - //if (hangtime > 10) - //{ - // std::ostringstream ss; - // ss << "Pad " << (int)pad_nb << ": Had to wait " << hangtime << "ms for pad data. (increase pad Buffer maybe)"; - // Core::DisplayMessage(ss.str(), 1000); - //} + SPADStatus tmp; + tmp.stickY = ((u8*)&netvalues->nHi)[0]; + tmp.stickX = ((u8*)&netvalues->nHi)[1]; + tmp.button = ((u16*)&netvalues->nHi)[1]; + + tmp.substickX = ((u8*)&netvalues->nLo)[3]; + tmp.substickY = ((u8*)&netvalues->nLo)[2]; + tmp.triggerLeft = ((u8*)&netvalues->nLo)[1]; + tmp.triggerRight = ((u8*)&netvalues->nLo)[0]; + if (Movie::IsRecordingInput()) + { + Movie::RecordInput(&tmp, pad_nb); + Movie::InputUpdate(); + } + else + { + Movie::CheckPadStatus(&tmp, pad_nb); + } return true; } -// called from ---CPU--- thread -void NetPlayClient::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size) -{ - //// in game mapping for this local wiimote - unsigned int in_game_num = m_local_player->pad_map[_number]; // just using gc pad_map for now - - // does this local pad map in game? - if (in_game_num < 4) - { - m_wiimote_input[_number].resize(m_wiimote_input[_number].size() + 1); - m_wiimote_input[_number].back().assign((char*)_pData, (char*)_pData + _Size); - m_wiimote_input[_number].back().channel = _channelID; - } -} // called from ---CPU--- thread -void NetPlayClient::WiimoteUpdate(int _number) +bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) { + NetWiimote nw; + static u8 previousSize[4] = {4,4,4,4}; { std::lock_guard lkp(m_crit.players); // in game mapping for this local wiimote - unsigned int in_game_num = m_local_player->pad_map[_number]; // just using gc pad_map for now - - // does this local pad map in game? + unsigned int in_game_num = LocalWiimoteToInGameWiimote(_number); + // does this local wiimote map in game? if (in_game_num < 4) { - m_wiimote_buffer[in_game_num].Push(m_wiimote_input[_number]); + if (previousSize[in_game_num] == size) + { + nw.assign(data, data + size); + do + { + // add to buffer + m_wiimote_buffer[in_game_num].Push(nw); - // TODO: send it + SendWiimoteState(in_game_num, nw); + } while (m_wiimote_buffer[in_game_num].Size() <= m_target_buffer_size * 200 / 120); // TODO: add a seperate setting for wiimote buffer? + } + else + { + while (m_wiimote_buffer[in_game_num].Size() > 0) + { + // Reporting mode changed, so previous buffer is no good. + m_wiimote_buffer[in_game_num].Pop(); + } + nw.resize(size, 0); - m_wiimote_input[_number].clear(); + m_wiimote_buffer[in_game_num].Push(nw); + m_wiimote_buffer[in_game_num].Push(nw); + m_wiimote_buffer[in_game_num].Push(nw); + m_wiimote_buffer[in_game_num].Push(nw); + m_wiimote_buffer[in_game_num].Push(nw); + m_wiimote_buffer[in_game_num].Push(nw); + previousSize[in_game_num] = size; + } } } // unlock players - if (0 == m_wiimote_buffer[_number].Size()) + while (previousSize[_number] == size && !m_wiimote_buffer[_number].Pop(nw)) { - //PanicAlert("PANIC"); - return; + // wait for receiving thread to push some data + Common::SleepCurrentThread(1); + if (false == m_is_running) + return false; } - NetWiimote nw; - m_wiimote_buffer[_number].Pop(nw); + // Use a blank input, since we may not have any valid input. + if (previousSize[_number] != size) + { + nw.resize(size, 0); + m_wiimote_buffer[_number].Push(nw); + m_wiimote_buffer[_number].Push(nw); + m_wiimote_buffer[_number].Push(nw); + m_wiimote_buffer[_number].Push(nw); + m_wiimote_buffer[_number].Push(nw); + } - NetWiimote::const_iterator - i = nw.begin(), e = nw.end(); - for ( ; i!=e; ++i) - Core::Callback_WiimoteInterruptChannel(_number, i->channel, &(*i)[0], (u32)i->size() + RPT_SIZE_HACK); + // We should have used a blank input last time, so now we just need to pop through the old buffer, until we reach a good input + if (nw.size() != size) + { + u8 tries = 0; + // Clear the buffer and wait for new input, since we probably just changed reporting mode. + while (nw.size() != size) + { + while (!m_wiimote_buffer[_number].Pop(nw)) + { + Common::SleepCurrentThread(1); + if (false == m_is_running) + return false; + } + ++tries; + if (tries > m_target_buffer_size * 200 / 120) + break; + } + + // If it still mismatches, it surely desynced + if (size != nw.size()) + { + PanicAlert("Netplay has desynced. There is no way to recover from this."); + return false; + } + } + + previousSize[_number] = size; + memcpy(data, nw.data(), size); + return true; } // called from ---GUI--- thread and ---NETPLAY--- thread (client side) @@ -583,16 +757,84 @@ bool NetPlayClient::StopGame() return true; } -// called from ---CPU--- thread -u8 NetPlayClient::GetPadNum(u8 numPAD) +void NetPlayClient::Stop() { - // TODO: i don't like that this loop is running everytime there is rumble - unsigned int i = 0; - for (; i<4; ++i) - if (numPAD == m_local_player->pad_map[i]) - break; + if (m_is_running == false) + return; + bool isPadMapped = false; + for (unsigned int i = 0; i < 4; ++i) + { + if (m_pad_map[i] == m_local_player->pid) + isPadMapped = true; + } + for (unsigned int i = 0; i < 4; ++i) + { + if (m_wiimote_map[i] == m_local_player->pid) + isPadMapped = true; + } + // tell the server to stop if we have a pad mapped in game. + if (isPadMapped) + { + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + m_socket.Send(spac); + } +} - return i; +u8 NetPlayClient::InGamePadToLocalPad(u8 ingame_pad) +{ + // not our pad + if (m_pad_map[ingame_pad] != m_local_player->pid) + return 4; + + int local_pad = 0; + int pad = 0; + + for (; pad < ingame_pad; pad++) + { + if (m_pad_map[pad] == m_local_player->pid) + local_pad++; + } + + return local_pad; +} + +u8 NetPlayClient::LocalPadToInGamePad(u8 local_pad) +{ + // Figure out which in-game pad maps to which local pad. + // The logic we have here is that the local slots always + // go in order. + int local_pad_count = -1; + int ingame_pad = 0; + for (; ingame_pad < 4; ingame_pad++) + { + if (m_pad_map[ingame_pad] == m_local_player->pid) + local_pad_count++; + + if (local_pad_count == local_pad) + break; + } + + return ingame_pad; +} + +u8 NetPlayClient::LocalWiimoteToInGameWiimote(u8 local_pad) +{ + // Figure out which in-game pad maps to which local pad. + // The logic we have here is that the local slots always + // go in order. + int local_pad_count = -1; + int ingame_pad = 0; + for (; ingame_pad < 4; ingame_pad++) + { + if (m_wiimote_map[ingame_pad] == m_local_player->pid) + local_pad_count++; + + if (local_pad_count == local_pad) + break; + } + + return ingame_pad; } // stuff hacked into dolphin @@ -609,6 +851,16 @@ bool CSIDevice_GCController::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u return false; } +bool WiimoteEmu::Wiimote::NetPlay_GetWiimoteData(int wiimote, u8* data, u8 size) +{ + std::lock_guard lk(crit_netplay_client); + + if (netplay_client) + return netplay_client->WiimoteUpdate(wiimote, data, size); + else + return false; +} + bool CSIDevice_GCSteeringWheel::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 *PADStatus) { return CSIDevice_GCController::NetPlay_GetInput(numPAD, PadStatus, PADStatus); @@ -626,79 +878,31 @@ u32 CEXIIPL::NetPlay_GetGCTime() std::lock_guard lk(crit_netplay_client); if (netplay_client) - return 1272737767; // watev + return NETPLAY_INITIAL_GCTIME; // watev else return 0; } // called from ---CPU--- thread // return the local pad num that should rumble given a ingame pad num -u8 CSIDevice_GCController::NetPlay_GetPadNum(u8 numPAD) +u8 CSIDevice_GCController::NetPlay_InGamePadToLocalPad(u8 numPAD) { std::lock_guard lk(crit_netplay_client); if (netplay_client) - return netplay_client->GetPadNum(numPAD); + return netplay_client->InGamePadToLocalPad(numPAD); else return numPAD; } -u8 CSIDevice_GCSteeringWheel::NetPlay_GetPadNum(u8 numPAD) +u8 CSIDevice_GCSteeringWheel::NetPlay_InGamePadToLocalPad(u8 numPAD) { - return CSIDevice_GCController::NetPlay_GetPadNum(numPAD); + return CSIDevice_GCController::NetPlay_InGamePadToLocalPad(numPAD); } -u8 CSIDevice_DanceMat::NetPlay_GetPadNum(u8 numPAD) +u8 CSIDevice_DanceMat::NetPlay_InGamePadToLocalPad(u8 numPAD) { - return CSIDevice_GCController::NetPlay_GetPadNum(numPAD); -} - -// called from ---CPU--- thread -// wiimote update / used for frame counting -//void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int _number) -void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int) -{ - //CritLocker crit(crit_netplay_client); - - //if (netplay_client) - // netplay_client->WiimoteUpdate(_number); -} - -// called from ---CPU--- thread -// -int CWII_IPC_HLE_WiiMote::NetPlay_GetWiimoteNum(int _number) -{ - //CritLocker crit(crit_netplay_client); - - //if (netplay_client) - // return netplay_client->GetPadNum(_number); // just using gcpad mapping for now - //else - return _number; -} - -// called from ---CPU--- thread -// intercept wiimote input callback -//bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int _number, u16 _channelID, const void* _pData, u32& _Size) -bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int, u16, const void*, u32&) -{ - std::lock_guard lk(crit_netplay_client); - - if (netplay_client) - //{ - // if (_Size >= RPT_SIZE_HACK) - // { - // _Size -= RPT_SIZE_HACK; - // return false; - // } - // else - // { - // netplay_client->WiimoteInput(_number, _channelID, _pData, _Size); - // // don't use this packet - return true; - // } - //} - else - return false; + return CSIDevice_GCController::NetPlay_InGamePadToLocalPad(numPAD); } bool NetPlay::IsNetPlayRunning() diff --git a/Source/Core/Core/Src/NetPlayClient.h b/Source/Core/Core/Src/NetPlayClient.h index d44a4c84b8..18509cf8c0 100644 --- a/Source/Core/Core/Src/NetPlayClient.h +++ b/Source/Core/Core/Src/NetPlayClient.h @@ -46,9 +46,17 @@ public: virtual void OnMsgChangeGame(const std::string& filename) = 0; virtual void OnMsgStartGame() = 0; virtual void OnMsgStopGame() = 0; + virtual bool IsRecording() = 0; }; -extern NetSettings g_NetPlaySettings; +class Player +{ + public: + PlayerId pid; + std::string name; + std::string revision; + u32 ping; +}; class NetPlayClient { @@ -59,20 +67,24 @@ public: ~NetPlayClient(); void GetPlayerList(std::string& list, std::vector& pid_list); + void GetPlayers(std::vector& player_list); bool is_connected; bool StartGame(const std::string &path); bool StopGame(); + void Stop(); bool ChangeGame(const std::string& game); void SendChatMessage(const std::string& msg); // Send and receive pads values - void WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size); - void WiimoteUpdate(int _number); + bool WiimoteUpdate(int _number, u8* data, const u8 size); bool GetNetPads(const u8 pad_nb, const SPADStatus* const, NetPad* const netvalues); - u8 GetPadNum(u8 numPAD); + u8 LocalPadToInGamePad(u8 localPad); + u8 InGamePadToLocalPad(u8 localPad); + + u8 LocalWiimoteToInGameWiimote(u8 local_pad); protected: void ClearBuffers(); @@ -84,24 +96,9 @@ protected: std::recursive_mutex players, send; } m_crit; - class Player - { - public: - Player(); - std::string ToString() const; - - PlayerId pid; - std::string name; - PadMapping pad_map[4]; - std::string revision; - u32 ping; - }; - Common::FifoQueue m_pad_buffer[4]; Common::FifoQueue m_wiimote_buffer[4]; - NetWiimote m_wiimote_input[4]; - NetPlayUI* m_dialog; sf::SocketTCP m_socket; std::thread m_thread; @@ -117,18 +114,21 @@ protected: u32 m_current_game; + PadMapping m_pad_map[4]; + PadMapping m_wiimote_map[4]; + + bool m_is_recording; + private: - void SendPadState(const PadMapping local_nb, const NetPad& np); + void UpdateDevices(); + void SendPadState(const PadMapping in_game_pad, const NetPad& np); + void SendWiimoteState(const PadMapping in_game_pad, const NetWiimote& nw); unsigned int OnData(sf::Packet& packet); PlayerId m_pid; std::map m_players; }; -namespace NetPlay { - bool IsNetPlayRunning(); -}; - void NetPlay_Enable(NetPlayClient* const np); void NetPlay_Disable(); diff --git a/Source/Core/Core/Src/NetPlayProto.h b/Source/Core/Core/Src/NetPlayProto.h index d4abf60cb8..6fe6899b87 100644 --- a/Source/Core/Core/Src/NetPlayProto.h +++ b/Source/Core/Core/Src/NetPlayProto.h @@ -7,6 +7,7 @@ #include "Common.h" #include "CommonTypes.h" +#include "HW/EXI_Device.h" struct NetSettings { @@ -14,17 +15,22 @@ struct NetSettings bool m_DSPHLE; bool m_DSPEnableJIT; bool m_WriteToMemcard; - u8 m_Controllers[4]; + TEXIDevices m_EXIDevice[2]; }; +extern NetSettings g_NetPlaySettings; + struct Rpt : public std::vector { u16 channel; }; -typedef std::vector NetWiimote; +typedef std::vector NetWiimote; + +#define NETPLAY_VERSION "Dolphin NetPlay 2013-09-22" + +const int NETPLAY_INITIAL_GCTIME = 1272737767; -#define NETPLAY_VERSION "Dolphin NetPlay 2013-08-18" // messages enum @@ -39,7 +45,7 @@ enum NP_MSG_PAD_BUFFER = 0x62, NP_MSG_WIIMOTE_DATA = 0x70, - NP_MSG_WIIMOTE_MAPPING = 0x71, // just using pad mapping for now + NP_MSG_WIIMOTE_MAPPING = 0x71, NP_MSG_START_GAME = 0xA0, NP_MSG_CHANGE_GAME = 0xA1, @@ -66,4 +72,8 @@ enum CON_ERR_VERSION_MISMATCH }; +namespace NetPlay { + bool IsNetPlayRunning(); +}; + #endif diff --git a/Source/Core/Core/Src/NetPlayServer.cpp b/Source/Core/Core/Src/NetPlayServer.cpp index 134045c5bf..296fcd29a4 100644 --- a/Source/Core/Core/Src/NetPlayServer.cpp +++ b/Source/Core/Core/Src/NetPlayServer.cpp @@ -4,11 +4,6 @@ #include "NetPlayServer.h" -NetPlayServer::Client::Client() -{ - memset(pad_map, -1, sizeof(pad_map)); -} - NetPlayServer::~NetPlayServer() { if (is_connected) @@ -29,12 +24,15 @@ NetPlayServer::~NetPlayServer() // called from ---GUI--- thread NetPlayServer::NetPlayServer(const u16 port) : is_connected(false), m_is_running(false) { + memset(m_pad_map, -1, sizeof(m_pad_map)); + memset(m_wiimote_map, -1, sizeof(m_wiimote_map)); if (m_socket.Listen(port)) { is_connected = true; m_do_loop = true; m_selector.Add(m_socket); m_thread = std::thread(std::mem_fun(&NetPlayServer::ThreadFunc), this); + m_target_buffer_size = 20; } } @@ -53,7 +51,7 @@ void NetPlayServer::ThreadFunc() sf::Packet spac; spac << (MessageId)NP_MSG_PING; spac << m_ping_key; - + std::lock_guard lks(m_crit.send); m_ping_timer.Start(); SendToClients(spac); @@ -155,45 +153,16 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket) rpac >> player.name; // give new client first available id - player.pid = 0; - std::map::const_iterator - i, - e = m_players.end(); - for (PlayerId p = 1; 0 == player.pid; ++p) - { - for (i = m_players.begin(); ; ++i) - { - if (e == i) - { - player.pid = p; - break; - } - if (p == i->second.pid) - break; - } - } + player.pid = (PlayerId)(m_players.size() + 1); - // TODO: this is crappy // try to automatically assign new user a pad + for (unsigned int m = 0; m < 4; ++m) { - bool is_mapped[4] = {false,false,false,false}; - - for ( unsigned int m = 0; m<4; ++m) - { - for (i = m_players.begin(); i!=e; ++i) + if (m_pad_map[m] == -1) { - if (i->second.pad_map[m] >= 0) - is_mapped[(unsigned)i->second.pad_map[m]] = true; - } - } - - for ( unsigned int m = 0; m<4; ++m) - if (false == is_mapped[m]) - { - player.pad_map[0] = m; + m_pad_map[m] = player.pid; break; } - } { @@ -220,7 +189,16 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket) socket.Send(spac); } + // send the pad buffer value + spac.Clear(); + spac << (MessageId)NP_MSG_PAD_BUFFER; + spac << (u32)m_target_buffer_size; + socket.Send(spac); + // sync values with new client + std::map::const_iterator + i, + e = m_players.end(); for (i = m_players.begin(); i!=e; ++i) { spac.Clear(); @@ -237,8 +215,9 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket) m_players[socket] = player; std::lock_guard lks(m_crit.send); UpdatePadMapping(); // sync pad mappings with everyone + UpdateWiimoteMapping(); } - + // add client to selector/ used for receiving m_selector.Add(socket); @@ -249,25 +228,34 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket) // called from ---NETPLAY--- thread unsigned int NetPlayServer::OnDisconnect(sf::SocketTCP& socket) { + PlayerId pid = m_players[socket].pid; + if (m_is_running) { - PanicAlertT("Client disconnect while game is running!! NetPlay is disabled. You must manually stop the game."); - std::lock_guard lkg(m_crit.game); - m_is_running = false; + for (int i = 0; i < 4; i++) + { + if (m_pad_map[i] == pid) + { + PanicAlertT("Client disconnect while game is running!! NetPlay is disabled. You must manually stop the game."); + std::lock_guard lkg(m_crit.game); + m_is_running = false; - sf::Packet spac; - spac << (MessageId)NP_MSG_DISABLE_GAME; - // this thread doesn't need players lock - std::lock_guard lks(m_crit.send); - SendToClients(spac); + sf::Packet spac; + spac << (MessageId)NP_MSG_DISABLE_GAME; + // this thread doesn't need players lock + std::lock_guard lks(m_crit.send); + SendToClients(spac); + break; + } + } } sf::Packet spac; spac << (MessageId)NP_MSG_PLAYER_LEAVE; - spac << m_players[socket].pid; + spac << pid; m_selector.Remove(socket); - + std::lock_guard lkp(m_crit.players); m_players.erase(m_players.find(socket)); @@ -275,87 +263,66 @@ unsigned int NetPlayServer::OnDisconnect(sf::SocketTCP& socket) std::lock_guard lks(m_crit.send); SendToClients(spac); + for (int i = 0; i < 4; i++) + if (m_pad_map[i] == pid) + m_pad_map[i] = -1; + UpdatePadMapping(); + + for (int i = 0; i < 4; i++) + if (m_wiimote_map[i] == pid) + m_wiimote_map[i] = -1; + UpdateWiimoteMapping(); + return 0; } // called from ---GUI--- thread -bool NetPlayServer::GetPadMapping(const int pid, int map[]) +void NetPlayServer::GetPadMapping(PadMapping map[4]) { - std::lock_guard lkp(m_crit.players); - std::map::const_iterator - i = m_players.begin(), - e = m_players.end(); - for (; i!=e; ++i) - if (pid == i->second.pid) - break; + for (int i = 0; i < 4; i++) + map[i] = m_pad_map[i]; +} - // player not found - if (i == e) - return false; - - // get pad mapping - for (unsigned int m = 0; m<4; ++m) - map[m] = i->second.pad_map[m]; - - return true; +void NetPlayServer::GetWiimoteMapping(PadMapping map[4]) +{ + for (int i = 0; i < 4; i++) + map[i] = m_wiimote_map[i]; } // called from ---GUI--- thread -bool NetPlayServer::SetPadMapping(const int pid, const int map[]) +void NetPlayServer::SetPadMapping(const PadMapping map[4]) { - std::lock_guard lkg(m_crit.game); - if (m_is_running) - return false; + for (int i = 0; i < 4; i++) + m_pad_map[i] = map[i]; + UpdatePadMapping(); +} - std::lock_guard lkp(m_crit.players); - std::map::iterator - i = m_players.begin(), - e = m_players.end(); - for (; i!=e; ++i) - if (pid == i->second.pid) - break; +// called from ---GUI--- thread +void NetPlayServer::SetWiimoteMapping(const PadMapping map[4]) +{ + for (int i = 0; i < 4; i++) + m_wiimote_map[i] = map[i]; + UpdateWiimoteMapping(); +} - // player not found - if (i == e) - return false; - - Client& player = i->second; - - // set pad mapping - for (unsigned int m = 0; m<4; ++m) - { - player.pad_map[m] = (PadMapping)map[m]; - - // remove duplicate mappings - for (i = m_players.begin(); i!=e; ++i) - for (unsigned int p = 0; p<4; ++p) - if (p != m || i->second.pid != pid) - if (player.pad_map[m] == i->second.pad_map[p]) - i->second.pad_map[p] = -1; - } - - std::lock_guard lks(m_crit.send); - UpdatePadMapping(); // sync pad mappings with everyone - - return true; +// called from ---GUI--- thread and ---NETPLAY--- thread +void NetPlayServer::UpdatePadMapping() +{ + sf::Packet spac; + spac << (MessageId)NP_MSG_PAD_MAPPING; + for (int i = 0; i < 4; i++) + spac << m_pad_map[i]; + SendToClients(spac); } // called from ---NETPLAY--- thread -void NetPlayServer::UpdatePadMapping() +void NetPlayServer::UpdateWiimoteMapping() { - std::map::const_iterator - i = m_players.begin(), - e = m_players.end(); - for (; i!=e; ++i) - { - sf::Packet spac; - spac << (MessageId)NP_MSG_PAD_MAPPING; - spac << i->second.pid; - for (unsigned int pm = 0; pm<4; ++pm) - spac << i->second.pad_map[pm]; - SendToClients(spac); - } - + sf::Packet spac; + spac << (MessageId)NP_MSG_WIIMOTE_MAPPING; + for (int i = 0; i < 4; i++) + spac << m_wiimote_map[i]; + SendToClients(spac); } // called from ---GUI--- thread and ---NETPLAY--- thread @@ -415,23 +382,51 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket) int hi, lo; packet >> map >> hi >> lo; - // check if client's pad indeed maps in game - if (map >= 0 && map < 4) - map = player.pad_map[(unsigned)map]; - else - map = -1; - - // if not, they are hacking, so disconnect them - // this could happen right after a pad map change, but that isn't implemented yet - if (map < 0) + // If the data is not from the correct player, + // then disconnect them. + if (m_pad_map[map] != player.pid) return 1; - + + // Relay to clients + sf::Packet spac; + spac << (MessageId)NP_MSG_PAD_DATA; + spac << map << hi << lo; + + std::lock_guard lks(m_crit.send); + SendToClients(spac, player.pid); + } + break; + + case NP_MSG_WIIMOTE_DATA : + { + // if this is wiimote data from the last game still being received, ignore it + if (player.current_game != m_current_game) + break; + + PadMapping map = 0; + u8 size; + packet >> map >> size; + u8* data = new u8[size]; + for (unsigned int i = 0; i < size; ++i) + packet >> data[i]; + + // If the data is not from the correct player, + // then disconnect them. + if (m_wiimote_map[map] != player.pid) + { + delete[] data; + return 1; + } // relay to clients sf::Packet spac; - spac << (MessageId)NP_MSG_PAD_DATA; - spac << map; // in game mapping - spac << hi << lo; + spac << (MessageId)NP_MSG_WIIMOTE_DATA; + spac << map; + spac << size; + for (unsigned int i = 0; i < size; ++i) + spac << data[i]; + + delete[] data; std::lock_guard lks(m_crit.send); SendToClients(spac, player.pid); @@ -440,12 +435,14 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket) case NP_MSG_PONG : { - const u32 ping = m_ping_timer.GetTimeElapsed(); + const u32 ping = (u32)m_ping_timer.GetTimeElapsed(); u32 ping_key = 0; packet >> ping_key; if (m_ping_key == ping_key) + { player.ping = ping; + } sf::Packet spac; spac << (MessageId)NP_MSG_PLAYER_PING_DATA; @@ -463,6 +460,20 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket) } break; + case NP_MSG_STOP_GAME: + { + // tell clients to stop game + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + + std::lock_guard lkp(m_crit.players); + std::lock_guard lks(m_crit.send); + SendToClients(spac); + + m_is_running = false; + } + break; + default : PanicAlertT("Unknown message with id:%d received from player:%d Kicking player!", mid, player.pid); // unknown message, kick the client @@ -528,8 +539,8 @@ bool NetPlayServer::StartGame(const std::string &path) spac << m_settings.m_DSPEnableJIT; spac << m_settings.m_DSPHLE; spac << m_settings.m_WriteToMemcard; - for (unsigned int i = 0; i < 4; ++i) - spac << m_settings.m_Controllers[i]; + spac << m_settings.m_EXIDevice[0]; + spac << m_settings.m_EXIDevice[1]; std::lock_guard lkp(m_crit.players); std::lock_guard lks(m_crit.send); @@ -540,23 +551,6 @@ bool NetPlayServer::StartGame(const std::string &path) return true; } - -// called from ---GUI--- thread -bool NetPlayServer::StopGame() -{ - // tell clients to stop game - sf::Packet spac; - spac << (MessageId)NP_MSG_STOP_GAME; - - std::lock_guard lkp(m_crit.players); - std::lock_guard lks(m_crit.send); - SendToClients(spac); - - m_is_running = false; - - return true; -} - // called from multiple threads void NetPlayServer::SendToClients(sf::Packet& packet, const PlayerId skip_pid) { diff --git a/Source/Core/Core/Src/NetPlayServer.h b/Source/Core/Core/Src/NetPlayServer.h index 4ef601bf06..13acbcfb2b 100644 --- a/Source/Core/Core/Src/NetPlayServer.h +++ b/Source/Core/Core/Src/NetPlayServer.h @@ -33,10 +33,12 @@ public: void SetNetSettings(const NetSettings &settings); bool StartGame(const std::string &path); - bool StopGame(); - bool GetPadMapping(const int pid, int map[]); - bool SetPadMapping(const int pid, const int map[]); + void GetPadMapping(PadMapping map[]); + void SetPadMapping(const PadMapping map[]); + + void GetWiimoteMapping(PadMapping map[]); + void SetWiimoteMapping(const PadMapping map[]); void AdjustPadBufferSize(unsigned int size); @@ -50,11 +52,8 @@ private: class Client { public: - Client(); - PlayerId pid; std::string name; - PadMapping pad_map[4]; std::string revision; sf::SocketTCP socket; @@ -67,6 +66,7 @@ private: unsigned int OnDisconnect(sf::SocketTCP& socket); unsigned int OnData(sf::Packet& packet, sf::SocketTCP& socket); void UpdatePadMapping(); + void UpdateWiimoteMapping(); NetSettings m_settings; @@ -77,6 +77,8 @@ private: bool m_update_pings; u32 m_current_game; unsigned int m_target_buffer_size; + PadMapping m_pad_map[4]; + PadMapping m_wiimote_map[4]; std::map m_players; diff --git a/Source/Core/Core/Src/PatchEngine.cpp b/Source/Core/Core/Src/PatchEngine.cpp index 2221fe456f..f4386ade6d 100644 --- a/Source/Core/Core/Src/PatchEngine.cpp +++ b/Source/Core/Core/Src/PatchEngine.cpp @@ -20,6 +20,7 @@ #include #include +#include "CommonPaths.h" #include "StringUtil.h" #include "PatchEngine.h" #include "HW/Memmap.h" @@ -27,13 +28,14 @@ #include "GeckoCode.h" #include "GeckoCodeConfig.h" #include "FileUtil.h" +#include "ConfigManager.h" using namespace Common; namespace PatchEngine { -const char *PatchTypeStrings[] = +const char *PatchTypeStrings[] = { "byte", "word", @@ -44,22 +46,37 @@ std::vector onFrame; std::map speedHacks; std::vector discList; -void LoadPatchSection(const char *section, std::vector &patches, IniFile &ini) +void LoadPatchSection(const char *section, std::vector &patches, + IniFile &globalIni, IniFile &localIni) { - std::vector lines; - - if (!ini.GetLines(section, lines)) - return; - - Patch currentPatch; - - for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) + // Load the name of all enabled patches + std::string enabledSectionName = std::string(section) + "_Enabled"; + std::vector enabledLines; + std::set enabledNames; + localIni.GetLines(enabledSectionName.c_str(), enabledLines); + for (auto& line : enabledLines) { - std::string line = *iter; - - if (line.size()) + if (line.size() != 0 && line[0] == '$') { - if (line[0] == '+' || line[0] == '$') + std::string name = line.substr(1, line.size() - 1); + enabledNames.insert(name); + } + } + + IniFile* inis[] = {&globalIni, &localIni}; + + for (size_t i = 0; i < ArraySize(inis); ++i) + { + std::vector lines; + Patch currentPatch; + inis[i]->GetLines(section, lines); + + for (auto line : lines) + { + if (line.size() == 0) + continue; + + if (line[0] == '$') { // Take care of the previous code if (currentPatch.name.size()) @@ -67,39 +84,38 @@ void LoadPatchSection(const char *section, std::vector &patches, IniFile currentPatch.entries.clear(); // Set active and name - currentPatch.active = (line[0] == '+') ? true : false; - if (currentPatch.active) - currentPatch.name = line.substr(2, line.size() - 2); - else - currentPatch.name = line.substr(1, line.size() - 1); - continue; + currentPatch.name = line.substr(1, line.size() - 1); + currentPatch.active = enabledNames.find(currentPatch.name) != enabledNames.end(); + currentPatch.user_defined = (i == 1); } - - std::string::size_type loc = line.find_first_of('=', 0); - - if (loc != std::string::npos) - line[loc] = ':'; - - std::vector items; - SplitString(line, ':', items); - - if (items.size() >= 3) + else { - PatchEntry pE; - bool success = true; - success &= TryParse(items[0], &pE.address); - success &= TryParse(items[2], &pE.value); + std::string::size_type loc = line.find_first_of('=', 0); - pE.type = PatchType(std::find(PatchTypeStrings, PatchTypeStrings + 3, items[1]) - PatchTypeStrings); - success &= (pE.type != (PatchType)3); - if (success) - currentPatch.entries.push_back(pE); + if (loc != std::string::npos) + line[loc] = ':'; + + std::vector items; + SplitString(line, ':', items); + + if (items.size() >= 3) + { + PatchEntry pE; + bool success = true; + success &= TryParse(items[0], &pE.address); + success &= TryParse(items[2], &pE.value); + + pE.type = PatchType(std::find(PatchTypeStrings, PatchTypeStrings + 3, items[1]) - PatchTypeStrings); + success &= (pE.type != (PatchType)3); + if (success) + currentPatch.entries.push_back(pE); + } } } - } - if (currentPatch.name.size() && currentPatch.entries.size()) - patches.push_back(currentPatch); + if (currentPatch.name.size() && currentPatch.entries.size()) + patches.push_back(currentPatch); + } } static void LoadDiscList(const char *section, std::vector &_discList, IniFile &ini) @@ -148,33 +164,31 @@ int GetSpeedhackCycles(const u32 addr) return iter->second; } -void LoadPatches(const char *gameID) +void LoadPatches() { - IniFile ini; - std::string filename = File::GetUserPath(D_GAMECONFIG_IDX) + gameID + ".ini"; + IniFile merged = SConfig::GetInstance().m_LocalCoreStartupParameter.LoadGameIni(); + IniFile globalIni = SConfig::GetInstance().m_LocalCoreStartupParameter.LoadDefaultGameIni(); + IniFile localIni = SConfig::GetInstance().m_LocalCoreStartupParameter.LoadLocalGameIni(); - if (ini.Load(filename.c_str())) - { - LoadPatchSection("OnFrame", onFrame, ini); - ActionReplay::LoadCodes(ini, false); - - // lil silly - std::vector gcodes; - Gecko::LoadCodes(ini, gcodes); - Gecko::SetActiveCodes(gcodes); + LoadPatchSection("OnFrame", onFrame, globalIni, localIni); + ActionReplay::LoadCodes(globalIni, localIni, false); - LoadSpeedhacks("Speedhacks", speedHacks, ini); - LoadDiscList("DiscList", discList, ini); - } + // lil silly + std::vector gcodes; + Gecko::LoadCodes(globalIni, localIni, gcodes); + Gecko::SetActiveCodes(gcodes); + + LoadSpeedhacks("Speedhacks", speedHacks, merged); + LoadDiscList("DiscList", discList, merged); } void ApplyPatches(const std::vector &patches) { - for (std::vector::const_iterator iter = patches.begin(); iter != patches.end(); ++iter) + for (const auto& patch : patches) { - if (iter->active) + if (patch.active) { - for (std::vector::const_iterator iter2 = iter->entries.begin(); iter2 != iter->entries.end(); ++iter2) + for (std::vector::const_iterator iter2 = patch.entries.begin(); iter2 != patch.entries.end(); ++iter2) { u32 addr = iter2->address; u32 value = iter2->value; @@ -198,7 +212,7 @@ void ApplyPatches(const std::vector &patches) } } -void ApplyFramePatches() +void ApplyFramePatches() { ApplyPatches(onFrame); diff --git a/Source/Core/Core/Src/PatchEngine.h b/Source/Core/Core/Src/PatchEngine.h index 87b3e8c901..ba3d155bf4 100644 --- a/Source/Core/Core/Src/PatchEngine.h +++ b/Source/Core/Core/Src/PatchEngine.h @@ -33,11 +33,13 @@ struct Patch std::string name; std::vector entries; bool active; + bool user_defined; // False if this code is shipped with Dolphin. }; int GetSpeedhackCycles(const u32 addr); -void LoadPatchSection(const char *section, std::vector &patches, IniFile &ini); -void LoadPatches(const char *gameID); +void LoadPatchSection(const char *section, std::vector &patches, + IniFile &globalIni, IniFile &localIni); +void LoadPatches(); void ApplyFramePatches(); void ApplyARPatches(); void Shutdown(); diff --git a/Source/Core/Core/Src/PowerPC/GDBStub.cpp b/Source/Core/Core/Src/PowerPC/GDBStub.cpp new file mode 100644 index 0000000000..763aa24b8a --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/GDBStub.cpp @@ -0,0 +1,930 @@ +// Copyright (C) 2010 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// Originally written by Sven Peter for anergistic. + +#include "GDBStub.h" + +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#include +#else +#include +#include +#include +#endif +#include + +#include "Host.h" + +#define GDB_BFR_MAX 10000 +#define GDB_MAX_BP 10 + +#define GDB_STUB_START '$' +#define GDB_STUB_END '#' +#define GDB_STUB_ACK '+' +#define GDB_STUB_NAK '-' + + +static int tmpsock = -1; +static int sock = -1; +static struct sockaddr_in saddr_server, saddr_client; + +static u8 cmd_bfr[GDB_BFR_MAX]; +static u32 cmd_len; + +static u32 sig = 0; +static u32 send_signal = 0; +static u32 step_break = 0; + +typedef struct { + u32 active; + u32 addr; + u32 len; +} gdb_bp_t; + +static gdb_bp_t bp_x[GDB_MAX_BP]; +static gdb_bp_t bp_r[GDB_MAX_BP]; +static gdb_bp_t bp_w[GDB_MAX_BP]; +static gdb_bp_t bp_a[GDB_MAX_BP]; + +// private helpers +static u8 hex2char(u8 hex) +{ + if (hex >= '0' && hex <= '9') + return hex - '0'; + else if (hex >= 'a' && hex <= 'f') + return hex - 'a' + 0xa; + else if (hex >= 'A' && hex <= 'F') + return hex - 'A' + 0xa; + + ERROR_LOG(GDB_STUB, "Invalid nibble: %c (%02x)\n", hex, hex); + return 0; +} + +static u8 nibble2hex(u8 n) +{ + n &= 0xf; + if (n < 0xa) + return '0' + n; + else + return 'A' + n - 0xa; +} + +static void mem2hex(u8 *dst, u8 *src, u32 len) +{ + u8 tmp; + + while (len-- > 0) { + tmp = *src++; + *dst++ = nibble2hex(tmp>>4); + *dst++ = nibble2hex(tmp); + } +} + +static void hex2mem(u8 *dst, u8 *src, u32 len) +{ + while (len-- > 0) { + *dst++ = (hex2char(*src) << 4) | hex2char(*(src+1)); + src += 2; + } +} + +static u8 gdb_read_byte() +{ + ssize_t res; + u8 c = '+'; + + res = recv(sock, &c, 1, MSG_WAITALL); + if (res != 1) + { + ERROR_LOG(GDB_STUB, "recv failed : %ld", res); + gdb_deinit(); + } + + return c; +} + +static u8 gdb_calc_chksum() +{ + u32 len = cmd_len; + u8 *ptr = cmd_bfr; + u8 c = 0; + + while(len-- > 0) + c += *ptr++; + + return c; +} + +static gdb_bp_t *gdb_bp_ptr(u32 type) +{ + switch (type) { + case GDB_BP_TYPE_X: + return bp_x; + case GDB_BP_TYPE_R: + return bp_x; + case GDB_BP_TYPE_W: + return bp_x; + case GDB_BP_TYPE_A: + return bp_x; + default: + return NULL; + } +} + +static gdb_bp_t *gdb_bp_empty_slot(u32 type) +{ + gdb_bp_t *p; + u32 i; + + p = gdb_bp_ptr(type); + if (p == NULL) + return NULL; + + for (i = 0; i < GDB_MAX_BP; i++) { + if (p[i].active == 0) + return &p[i]; + } + + return NULL; +} + +static gdb_bp_t *gdb_bp_find(u32 type, u32 addr, u32 len) +{ + gdb_bp_t *p; + u32 i; + + p = gdb_bp_ptr(type); + if (p == NULL) + return NULL; + + for (i = 0; i < GDB_MAX_BP; i++) { + if (p[i].active == 1 && + p[i].addr == addr && + p[i].len == len) + return &p[i]; + } + + return NULL; +} + +static void gdb_bp_remove(u32 type, u32 addr, u32 len) +{ + gdb_bp_t *p; + + do { + p = gdb_bp_find(type, addr, len); + if (p != NULL) { + DEBUG_LOG(GDB_STUB, "gdb: removed a breakpoint: %08x bytes at %08x\n", len, addr); + p->active = 0; + memset(p, 0, sizeof(gdb_bp_t)); + } + } while (p != NULL); +} + +static int gdb_bp_check(u32 addr, u32 type) +{ + gdb_bp_t *p; + u32 i; + + p = gdb_bp_ptr(type); + if (p == NULL) + return 0; + + for (i = 0; i < GDB_MAX_BP; i++) { + if (p[i].active == 1 && + (addr >= p[i].addr && addr < p[i].addr + p[i].len)) + return 1; + } + + return 0; +} + +static void gdb_nak() +{ + const char nak = GDB_STUB_NAK; + ssize_t res; + + res = send(sock, &nak, 1, 0); + if (res != 1) + ERROR_LOG(GDB_STUB, "send failed"); +} + +static void gdb_ack() +{ + const char ack = GDB_STUB_ACK; + ssize_t res; + + res = send(sock, &ack, 1, 0); + if (res != 1) + ERROR_LOG(GDB_STUB, "send failed"); +} + +static void gdb_read_command() +{ + u8 c; + u8 chk_read, chk_calc; + + cmd_len = 0; + memset(cmd_bfr, 0, sizeof cmd_bfr); + + c = gdb_read_byte(); + if (c == '+') + { + //ignore ack + return; + } + else if (c == 0x03) + { + CCPU::Break(); + gdb_signal(SIGTRAP); + return; + } + else if (c != GDB_STUB_START) { + DEBUG_LOG(GDB_STUB, "gdb: read invalid byte %02x\n", c); + return; + } + + while ((c = gdb_read_byte()) != GDB_STUB_END) { + cmd_bfr[cmd_len++] = c; + if (cmd_len == sizeof cmd_bfr) + { + ERROR_LOG(GDB_STUB, "gdb: cmd_bfr overflow\n"); + gdb_nak(); + return; + } + } + + chk_read = hex2char(gdb_read_byte()) << 4; + chk_read |= hex2char(gdb_read_byte()); + + chk_calc = gdb_calc_chksum(); + + if (chk_calc != chk_read) { + ERROR_LOG(GDB_STUB, "gdb: invalid checksum: calculated %02x and read %02x for $%s# (length: %d)\n", chk_calc, chk_read, cmd_bfr, cmd_len); + cmd_len = 0; + + gdb_nak(); + return; + } + + DEBUG_LOG(GDB_STUB, "gdb: read command %c with a length of %d: %s\n", cmd_bfr[0], cmd_len, cmd_bfr); + gdb_ack(); +} + +static int gdb_data_available() { + struct timeval t; + fd_set _fds, *fds = &_fds; + + FD_ZERO(fds); + FD_SET(sock, fds); + + t.tv_sec = 0; + t.tv_usec = 20; + + if (select(sock + 1, fds, NULL, NULL, &t) < 0) + { + ERROR_LOG(GDB_STUB, "select failed"); + return 0; + } + + if (FD_ISSET(sock, fds)) + return 1; + return 0; +} + +static void gdb_reply(const char *reply) +{ + u8 chk; + u32 left; + u8 *ptr; + int n; + + if(!gdb_active()) + return; + + memset(cmd_bfr, 0, sizeof cmd_bfr); + + cmd_len = strlen(reply); + if (cmd_len + 4 > sizeof cmd_bfr) + ERROR_LOG(GDB_STUB, "cmd_bfr overflow in gdb_reply"); + + memcpy(cmd_bfr + 1, reply, cmd_len); + + cmd_len++; + chk = gdb_calc_chksum(); + cmd_len--; + cmd_bfr[0] = GDB_STUB_START; + cmd_bfr[cmd_len + 1] = GDB_STUB_END; + cmd_bfr[cmd_len + 2] = nibble2hex(chk >> 4); + cmd_bfr[cmd_len + 3] = nibble2hex(chk); + + DEBUG_LOG(GDB_STUB, "gdb: reply (len: %d): %s\n", cmd_len, cmd_bfr); + + ptr = cmd_bfr; + left = cmd_len + 4; + while (left > 0) { + n = send(sock, ptr, left, 0); + if (n < 0) + { + ERROR_LOG(GDB_STUB, "gdb: send failed"); + return gdb_deinit(); + } + left -= n; + ptr += n; + } +} + +static void gdb_handle_query() +{ + DEBUG_LOG(GDB_STUB, "gdb: query '%s'\n", cmd_bfr+1); + + if (!strcmp((const char *)(cmd_bfr+1), "TStatus")) + { + return gdb_reply("T0"); + } + + gdb_reply(""); +} + +static void gdb_handle_set_thread() +{ + if (memcmp(cmd_bfr, "Hg0", 3) == 0 || + memcmp(cmd_bfr, "Hc-1", 4) == 0 || + memcmp(cmd_bfr, "Hc0", 4) == 0 || + memcmp(cmd_bfr, "Hc1", 4) == 0) + return gdb_reply("OK"); + gdb_reply("E01"); +} + +static void gdb_handle_signal() +{ + char bfr[128]; + memset(bfr, 0, sizeof bfr); + sprintf(bfr, "T%02x%02x:%08x;%02x:%08x;", sig, 64, PC, 1, GPR(1)); + gdb_reply(bfr); +} + +static void wbe32hex(u8 *p, u32 v) +{ + u32 i; + for (i = 0; i < 8; i++) + p[i] = nibble2hex(v >> (28 - 4*i)); +} + +static void wbe64hex(u8 *p, u64 v) +{ + u32 i; + for (i = 0; i < 16; i++) + p[i] = nibble2hex(v >> (60 - 4*i)); +} + +static u32 re32hex(u8 *p) +{ + u32 i; + u32 res = 0; + + for (i = 0; i < 8; i++) + res = (res << 4) | hex2char(p[i]); + + return res; +} + +static u64 re64hex(u8 *p) +{ + u32 i; + u64 res = 0; + + for (i = 0; i < 16; i++) + res = (res << 4) | hex2char(p[i]); + + return res; +} + +static void gdb_read_register() +{ + static u8 reply[64]; + u32 id; + + memset(reply, 0, sizeof reply); + id = hex2char(cmd_bfr[1]); + if (cmd_bfr[2] != '\0') + { + id <<= 4; + id |= hex2char(cmd_bfr[2]); + } + + + switch (id) { + case 0 ... 31: + wbe32hex(reply, GPR(id)); + break; + case 32 ... 63: + wbe64hex(reply, riPS0(id-32)); + break; + case 64: + wbe32hex(reply, PC); + break; + case 65: + wbe32hex(reply, MSR); + break; + case 66: + wbe32hex(reply, GetCR()); + break; + case 67: + wbe32hex(reply, LR); + break; + case 68: + wbe32hex(reply, CTR); + break; + case 69: + wbe32hex(reply, PowerPC::ppcState.spr[SPR_XER]); + break; + case 70: + wbe32hex(reply, 0x0BADC0DE); + break; + case 71: + wbe32hex(reply, FPSCR.Hex); + break; + default: + return gdb_reply("E01"); + break; + } + + gdb_reply((char *)reply); +} + +static void gdb_read_registers() +{ + static u8 bfr[GDB_BFR_MAX - 4]; + u8 * bufptr = bfr; + u32 i; + + memset(bfr, 0, sizeof bfr); + + for (i = 0; i < 32; i++) { + wbe32hex(bufptr + i*8, GPR(i)); + } + bufptr += 32 * 8; + + /* + for (i = 0; i < 32; i++) { + wbe32hex(bufptr + i*8, riPS0(i)); + } + bufptr += 32 * 8; + wbe32hex(bufptr, PC); bufptr += 4; + wbe32hex(bufptr, MSR); bufptr += 4; + wbe32hex(bufptr, GetCR()); bufptr += 4; + wbe32hex(bufptr, LR); bufptr += 4; + + + wbe32hex(bufptr, CTR); bufptr += 4; + wbe32hex(bufptr, PowerPC::ppcState.spr[SPR_XER]); bufptr += 4; + // MQ register not used. + wbe32hex(bufptr, 0x0BADC0DE); bufptr += 4; + */ + + + gdb_reply((char *)bfr); +} + +static void gdb_write_registers() +{ + u32 i; + u8 * bufptr = cmd_bfr; + + for (i = 0; i < 32; i++) { + GPR(i) = re32hex(bufptr + i*8); + } + bufptr += 32 * 8; + + gdb_reply("OK"); +} + +static void gdb_write_register() +{ + u32 id; + + u8 * bufptr = cmd_bfr + 3; + + id = hex2char(cmd_bfr[1]); + if (cmd_bfr[2] != '=') + { + ++bufptr; + id <<= 4; + id |= hex2char(cmd_bfr[2]); + } + + switch (id) { + case 0 ... 31: + GPR(id) = re32hex(bufptr); + break; + case 32 ... 63: + riPS0(id-32) = re64hex(bufptr); + break; + case 64: + PC = re32hex(bufptr); + break; + case 65: + MSR = re32hex(bufptr); + break; + case 66: + SetCR(re32hex(bufptr)); + break; + case 67: + LR = re32hex(bufptr); + break; + case 68: + CTR = re32hex(bufptr); + break; + case 69: + PowerPC::ppcState.spr[SPR_XER] = re32hex(bufptr); + break; + case 70: + // do nothing, we dont have MQ + break; + case 71: + FPSCR.Hex = re32hex(bufptr); + break; + default: + return gdb_reply("E01"); + break; + } + + gdb_reply("OK"); +} + +static void gdb_read_mem() +{ + static u8 reply[GDB_BFR_MAX - 4]; + u32 addr, len; + u32 i; + + i = 1; + addr = 0; + while (cmd_bfr[i] != ',') + addr = (addr << 4) | hex2char(cmd_bfr[i++]); + i++; + + len = 0; + while (i < cmd_len) + len = (len << 4) | hex2char(cmd_bfr[i++]); + DEBUG_LOG(GDB_STUB, "gdb: read memory: %08x bytes from %08x\n", len, addr); + + if (len*2 > sizeof reply) + gdb_reply("E01"); + u8 * data = Memory::GetPointer(addr); + if (!data) + return gdb_reply("E0"); + mem2hex(reply, data, len); + reply[len*2] = '\0'; + gdb_reply((char *)reply); +} + +static void gdb_write_mem() +{ + u32 addr, len; + u32 i; + + i = 1; + addr = 0; + while (cmd_bfr[i] != ',') + addr = (addr << 4) | hex2char(cmd_bfr[i++]); + i++; + + len = 0; + while (cmd_bfr[i] != ':') + len = (len << 4) | hex2char(cmd_bfr[i++]); + DEBUG_LOG(GDB_STUB, "gdb: write memory: %08x bytes to %08x\n", len, addr); + + u8 * dst = Memory::GetPointer(addr); + if (!dst) + return gdb_reply("E00"); + hex2mem(dst, cmd_bfr + i + 1, len); + gdb_reply("OK"); +} + +// forces a break on next instruction check +void gdb_break() +{ + step_break = 1; + send_signal = 1; +} + +static void gdb_step() +{ + gdb_break(); +} + +static void gdb_continue() +{ + send_signal = 1; +} + +bool gdb_add_bp(u32 type, u32 addr, u32 len) +{ + gdb_bp_t *bp; + bp = gdb_bp_empty_slot(type); + if (bp == NULL) + return false; + + bp->active = 1; + bp->addr = addr; + bp->len = len; + + DEBUG_LOG(GDB_STUB, "gdb: added %d breakpoint: %08x bytes at %08x\n", type, bp->len, bp->addr); + return true; +} + +static void _gdb_add_bp() +{ + u32 type; + u32 i, addr = 0, len = 0; + + type = hex2char(cmd_bfr[1]); + switch (type) { + case 0: + case 1: + type = GDB_BP_TYPE_X; + break; + case 2: + type = GDB_BP_TYPE_W; + break; + case 3: + type = GDB_BP_TYPE_R; + break; + case 4: + type = GDB_BP_TYPE_A; + break; + default: + return gdb_reply("E01"); + } + + i = 3; + while (cmd_bfr[i] != ',') + addr = addr << 4 | hex2char(cmd_bfr[i++]); + i++; + + while (i < cmd_len) + len = len << 4 | hex2char(cmd_bfr[i++]); + + if (!gdb_add_bp(type, addr, len)) + return gdb_reply("E02"); + gdb_reply("OK"); +} + +static void gdb_remove_bp() +{ + u32 type, addr, len, i; + + type = hex2char(cmd_bfr[1]); + switch (type) { + case 0: + case 1: + type = GDB_BP_TYPE_X; + break; + case 2: + type = GDB_BP_TYPE_W; + break; + case 3: + type = GDB_BP_TYPE_R; + break; + case 4: + type = GDB_BP_TYPE_A; + break; + default: + return gdb_reply("E01"); + } + + addr = 0; + len = 0; + + i = 3; + while (cmd_bfr[i] != ',') + addr = (addr << 4) | hex2char(cmd_bfr[i++]); + i++; + + while (i < cmd_len) + len = (len << 4) | hex2char(cmd_bfr[i++]); + + gdb_bp_remove(type, addr, len); + gdb_reply("OK"); +} + +void gdb_handle_exception() +{ + while (gdb_active()) { + if(!gdb_data_available()) + continue; + gdb_read_command(); + if (cmd_len == 0) + continue; + + switch(cmd_bfr[0]) { + case 'q': + gdb_handle_query(); + break; + case 'H': + gdb_handle_set_thread(); + break; + case '?': + gdb_handle_signal(); + break; + case 'k': + gdb_deinit(); + INFO_LOG(GDB_STUB, "killed by gdb"); + return; + case 'g': + gdb_read_registers(); + break; + case 'G': + gdb_write_registers(); + break; + case 'p': + gdb_read_register(); + break; + case 'P': + gdb_write_register(); + break; + case 'm': + gdb_read_mem(); + break; + case 'M': + gdb_write_mem(); + PowerPC::ppcState.iCache.Reset(); + Host_UpdateDisasmDialog(); + break; + case 's': + gdb_step(); + return; + case 'C': + case 'c': + gdb_continue(); + return; + case 'z': + gdb_remove_bp(); + break; + case 'Z': + _gdb_add_bp(); + break; + default: + gdb_reply(""); + break; + } + } +} + +#ifdef _WIN32 +WSADATA InitData; +#endif + +// exported functions + +void gdb_init(u32 port) +{ + socklen_t len; + int on; + #ifdef _WIN32 + WSAStartup(MAKEWORD(2,2), &InitData); + #endif + + memset(bp_x, 0, sizeof bp_x); + memset(bp_r, 0, sizeof bp_r); + memset(bp_w, 0, sizeof bp_w); + memset(bp_a, 0, sizeof bp_a); + + tmpsock = socket(AF_INET, SOCK_STREAM, 0); + if (tmpsock == -1) + ERROR_LOG(GDB_STUB, "Failed to create gdb socket"); + + on = 1; + if (setsockopt(tmpsock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on) < 0) + ERROR_LOG(GDB_STUB, "Failed to setsockopt"); + + memset(&saddr_server, 0, sizeof saddr_server); + saddr_server.sin_family = AF_INET; + saddr_server.sin_port = htons(port); + saddr_server.sin_addr.s_addr = INADDR_ANY; + + if (bind(tmpsock, (struct sockaddr *)&saddr_server, sizeof saddr_server) < 0) + ERROR_LOG(GDB_STUB, "Failed to bind gdb socket"); + + if (listen(tmpsock, 1) < 0) + ERROR_LOG(GDB_STUB, "Failed to listen to gdb socket"); + + INFO_LOG(GDB_STUB, "Waiting for gdb to connect...\n"); + + sock = accept(tmpsock, (struct sockaddr *)&saddr_client, &len); + if (sock < 0) + ERROR_LOG(GDB_STUB, "Failed to accept gdb client"); + INFO_LOG(GDB_STUB, "Client connected.\n"); + + saddr_client.sin_addr.s_addr = ntohl(saddr_client.sin_addr.s_addr); + /*if (((saddr_client.sin_addr.s_addr >> 24) & 0xff) != 127 || + * ((saddr_client.sin_addr.s_addr >> 16) & 0xff) != 0 || + * ((saddr_client.sin_addr.s_addr >> 8) & 0xff) != 0 || + * ((saddr_client.sin_addr.s_addr >> 0) & 0xff) != 1) + * ERROR_LOG(GDB_STUB, "gdb: incoming connection not from localhost"); + */ + close(tmpsock); + tmpsock = -1; +} + + +void gdb_deinit() +{ + if (tmpsock != -1) + { + shutdown(tmpsock, SHUT_RDWR); + tmpsock = -1; + } + if (sock != -1) + { + shutdown(sock, SHUT_RDWR); + sock = -1; + } + + #ifdef _WIN32 + WSACleanup(); + #endif +} + +bool gdb_active() +{ + return tmpsock != -1 || sock != -1; +} + +int gdb_signal(u32 s) +{ + if (sock == -1) + return 1; + + sig = s; + + if (send_signal) { + gdb_handle_signal(); + send_signal = 0; + } + + return 0; +} + +int gdb_bp_x(u32 addr) +{ + if (sock == -1) + return 0; + + if (step_break) + { + step_break = 0; + + DEBUG_LOG(GDB_STUB, "Step was successful."); + return 1; + } + + return gdb_bp_check(addr, GDB_BP_TYPE_X); +} + +int gdb_bp_r(u32 addr) +{ + if (sock == -1) + return 0; + + return gdb_bp_check(addr, GDB_BP_TYPE_R); +} + +int gdb_bp_w(u32 addr) +{ + if (sock == -1) + return 0; + + return gdb_bp_check(addr, GDB_BP_TYPE_W); +} + +int gdb_bp_a(u32 addr) +{ + if (sock == -1) + return 0; + + return gdb_bp_check(addr, GDB_BP_TYPE_A); +} diff --git a/Source/Core/Core/Src/PowerPC/GDBStub.h b/Source/Core/Core/Src/PowerPC/GDBStub.h new file mode 100644 index 0000000000..300f74bf91 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/GDBStub.h @@ -0,0 +1,59 @@ +// Copyright (C) 2010 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// Originally written by Sven Peter for anergistic. + +#ifndef GDB_H__ +#define GDB_H__ + +#include +#include "Common.h" +#include "Thread.h" +#include "PowerPC.h" +#include "../HW/CPU.h" +#include "../HW/Memmap.h" + +#ifdef _WIN32 +#define SIGTRAP 5 +#define SIGTERM 15 +#define MSG_WAITALL 8 +#endif + +typedef enum { + GDB_BP_TYPE_NONE = 0, + GDB_BP_TYPE_X, + GDB_BP_TYPE_R, + GDB_BP_TYPE_W, + GDB_BP_TYPE_A +} gdb_bp_type; + +void gdb_init(u32 port); +void gdb_deinit(); +bool gdb_active(); +void gdb_break(); + +void gdb_handle_exception(); +int gdb_signal(u32 signal); + +int gdb_bp_x(u32 addr); +int gdb_bp_r(u32 addr); +int gdb_bp_w(u32 addr); +int gdb_bp_a(u32 addr); + +bool gdb_add_bp(u32 type, u32 addr, u32 len); + +#endif diff --git a/Source/Core/Core/Src/PowerPC/Gekko.h b/Source/Core/Core/Src/PowerPC/Gekko.h index 3dd2def297..d4e6f8e4cb 100644 --- a/Source/Core/Core/Src/PowerPC/Gekko.h +++ b/Source/Core/Core/Src/PowerPC/Gekko.h @@ -23,17 +23,25 @@ union UGeckoInstruction struct { + // Record bit + // 1, if the condition register should be updated by this instruction u32 Rc : 1; u32 SUBOP10 : 10; + // Source GPR u32 RB : 5; + // Source or destination GPR u32 RA : 5; + // Destination GPR u32 RD : 5; + // Primary opcode u32 OPCD : 6; - }; // changed + }; struct { + // Immediate, signed 16-bit signed SIMM_16 : 16; u32 : 5; + // Conditions on which to trap u32 TO : 5; u32 OPCD_2 : 6; }; @@ -43,11 +51,13 @@ union UGeckoInstruction u32 : 10; u32 : 5; u32 : 5; + // Source GPR u32 RS : 5; u32 OPCD_3 : 6; }; struct { + // Immediate, unsigned 16-bit u32 UIMM : 16; u32 : 5; u32 : 5; @@ -55,17 +65,25 @@ union UGeckoInstruction }; struct { + // Link bit + // 1, if branch instructions should put the address of the next instruction into the link register u32 LK : 1; + // Absolute address bit + // 1, if the immediate field represents an absolute address u32 AA : 1; + // Immediate, signed 24-bit u32 LI : 24; u32 OPCD_5 : 6; }; struct - { + { u32 LK_2 : 1; u32 AA_2 : 1; + // Branch displacement, signed 14-bit (right-extended by 0b00) u32 BD : 14; + // Branch condition u32 BI : 5; + // Conditional branch control u32 BO : 5; u32 OPCD_6 : 6; }; @@ -83,8 +101,10 @@ union UGeckoInstruction u32 : 11; u32 RB_2 : 5; u32 RA_2 : 5; + // ? u32 L : 1; u32 : 1; + // Destination field in CR or FPSCR u32 CRFD : 3; u32 OPCD_8 : 6; }; @@ -98,11 +118,11 @@ union UGeckoInstruction u32 OPCD_9 : 6; }; struct - { + { u32 UIMM_2 : 16; u32 RA_4 : 5; u32 L_3 : 1; - u32 dummy2 : 1; + u32 : 1; u32 CRFD_3 : 3; u32 OPCD_A : 6; }; @@ -113,13 +133,14 @@ union UGeckoInstruction u32 RB_5 : 5; u32 RA_5 : 5; u32 L_4 : 1; - u32 dummy3 : 1; + u32 : 1; u32 CRFD_4 : 3; u32 OPCD_B : 6; }; struct { u32 : 16; + // Segment register u32 SR : 4; u32 : 1; u32 RS_2 : 5; @@ -131,6 +152,7 @@ union UGeckoInstruction { u32 Rc_4 : 1; u32 SUBOP5 : 5; + // ? u32 RC : 5; u32 : 5; u32 RA_6 : 5; @@ -140,7 +162,9 @@ union UGeckoInstruction struct { u32 : 10; + // Overflow enable u32 OE : 1; + // Special-purpose register u32 SPR : 10; u32 : 11; }; @@ -148,7 +172,9 @@ union UGeckoInstruction { u32 : 10; u32 OE_3 : 1; + // Upper special-purpose register u32 SPRU : 5; + // Lower special-purpose register u32 SPRL : 5; u32 : 11; }; @@ -157,98 +183,114 @@ union UGeckoInstruction struct { u32 Rc_3 : 1; + // Mask end u32 ME : 5; + // Mask begin u32 MB : 5; + // Shift amount u32 SH : 5; u32 : 16; }; // crxor - struct + struct { u32 : 11; + // Source bit in the CR u32 CRBB : 5; + // Source bit in the CR u32 CRBA : 5; + // Destination bit in the CR u32 CRBD : 5; u32 : 6; }; // mftb - struct + struct { u32 : 11; + // Time base register u32 TBR : 10; u32 : 11; }; - struct + struct { u32 : 11; + // Upper time base register u32 TBRU : 5; + // Lower time base register u32 TBRL : 5; u32 : 11; }; - struct + struct { u32 : 18; + // Source field in the CR or FPSCR u32 CRFS : 3; u32 : 2; u32 CRFD_5 : 3; u32 : 6; }; - // float - struct + struct { u32 : 12; + // Field mask, identifies the CR fields to be updated by mtcrf u32 CRM : 8; u32 : 1; + // Destination FPR u32 FD : 5; u32 : 6; }; - struct + struct { u32 : 6; + // Source FPR u32 FC : 5; + // Source FPR u32 FB : 5; + // Source FPR u32 FA : 5; + // Source FPR u32 FS : 5; u32 : 6; }; - struct - { - u32 OFS : 16; - u32 : 16; - }; struct { u32 : 17; + // Field mask, identifies the FPSCR fields to be updated by mtfsf u32 FM : 8; u32 : 7; }; - // paired - struct + // paired single quantized load/store + struct { u32 : 7; + // Graphics quantization register to use u32 Ix : 3; + // 0: paired single, 1: scalar u32 Wx : 1; u32 : 1; + // Graphics quantization register to use u32 I : 3; + // 0: paired single, 1: scalar u32 W : 1; u32 : 16; }; - struct + struct { signed SIMM_12 : 12; u32 : 20; }; - struct + struct { - u32 dummyX : 11; + u32 : 11; + // Number of bytes to use in lswi/stswi (0 means 32 bytes) u32 NB : 5; }; }; @@ -263,7 +305,7 @@ union UGeckoInstruction union UGQR { u32 Hex; - struct + struct { u32 ST_TYPE : 3; u32 : 5; @@ -296,7 +338,7 @@ union UFPR // XER union UReg_XER { - struct + struct { u32 BYTE_COUNT : 7; u32 : 22; @@ -347,32 +389,59 @@ union UReg_FPSCR { struct { + // Rounding mode (towards: nearest, zero, +inf, -inf) u32 RN : 2; + // Non-IEEE mode enable (aka flush-to-zero) u32 NI : 1; + // Inexact exception enable u32 XE : 1; + // IEEE division by zero exception enable u32 ZE : 1; + // IEEE underflow exception enable u32 UE : 1; + // IEEE overflow exception enable u32 OE : 1; + // Invalid operation exception enable u32 VE : 1; + // Invalid operation exception for integer conversion (sticky) u32 VXCVI : 1; + // Invalid operation exception for square root (sticky) u32 VXSQRT : 1; + // Invalid operation exception for software request (sticky) u32 VXSOFT : 1; + // reserved u32 : 1; + // Floating point result flags (not sticky) u32 FPRF : 5; + // Fraction inexact (not sticky) u32 FI : 1; + // Fraction rounded (not sticky) u32 FR : 1; + // Invalid operation exception for invalid comparison (sticky) u32 VXVC : 1; + // Invalid operation exception for inf * 0 (sticky) u32 VXIMZ : 1; + // Invalid operation exception for 0 / 0 (sticky) u32 VXZDZ : 1; + // Invalid operation exception for int / inf (sticky) u32 VXIDI : 1; + // Invalid operation exception for inf - inf (sticky) u32 VXISI : 1; + // Invalid operation exception for SNaN (sticky) u32 VXSNAN : 1; + // Inexact exception (sticky) u32 XX : 1; + // Division by zero exception (sticky) u32 ZX : 1; + // Underflow exception (sticky) u32 UX : 1; + // Overflow exception (sticky) u32 OX : 1; + // Invalid operation exception summary (not sticky) u32 VX : 1; + // Enabled exception summary (not sticky) u32 FEX : 1; + // Exception summary (sticky) u32 FX : 1; }; u32 Hex; @@ -473,7 +542,7 @@ union UReg_HID4 union UReg_SPR1 { u32 Hex; - struct + struct { u32 htaborg : 16; u32 : 7; @@ -565,7 +634,7 @@ union UReg_DMAL union UReg_BAT_Up { - struct + struct { u32 VP : 1; u32 VS : 1; @@ -581,7 +650,7 @@ union UReg_BAT_Up union UReg_BAT_Lo { - struct + struct { u32 PP : 2; u32 : 1; @@ -597,7 +666,7 @@ union UReg_BAT_Lo union UReg_PTE { - struct + struct { u64 API : 6; u64 H : 1; @@ -634,7 +703,7 @@ enum EQuantizeType }; // branches -enum +enum { BO_BRANCH_IF_CTR_0 = 2, // 3 BO_DONT_DECREMENT_FLAG = 4, // 2 diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.cpp index fe4c65b3e2..dd71abcaeb 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.cpp @@ -2,19 +2,19 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../../HW/Memmap.h" -#include "../../HW/CPU.h" -#include "../../Host.h" -#include "../PPCTables.h" -#include "Interpreter.h" -#include "../../Debugger/Debugger_SymbolMap.h" -#include "../../CoreTiming.h" -#include "../../ConfigManager.h" -#include "PowerPCDisasm.h" -#include "../../IPC_HLE/WII_IPC_HLE.h" -#include "Atomic.h" -#include "HLE/HLE.h" +#include "Interpreter.h" +#include "PowerPCDisasm.h" +#include "../PPCTables.h" +#include "../../Debugger/Debugger_SymbolMap.h" +#include "../../Host.h" +#include "../../IPC_HLE/WII_IPC_HLE.h" + +#ifdef USE_GDBSTUB +#include "../GDBStub.h" +#endif + +#include namespace { u32 last_pc; @@ -79,7 +79,7 @@ void Trace( UGeckoInstruction &instCode ) std::string fregs = ""; for (int i=0; i<32; i++) { - sprintf(freg, "f%02d: %08llx %08llx ", i, PowerPC::ppcState.ps[i][0], PowerPC::ppcState.ps[i][1]); + sprintf(freg, "f%02d: %08" PRIx64 " %08" PRIx64 " ", i, PowerPC::ppcState.ps[i][0], PowerPC::ppcState.ps[i][1]); fregs.append(freg); } @@ -92,7 +92,6 @@ void Trace( UGeckoInstruction &instCode ) int Interpreter::SingleStepInner(void) { static UGeckoInstruction instCode; - u32 function = m_EndBlock ? HLE::GetFunctionIndex(PC) : 0; // Check for HLE functions after branches if (function != 0) { @@ -103,11 +102,31 @@ int Interpreter::SingleStepInner(void) if (HLE::IsEnabled(flags)) { HLEFunction(function); + if (type == HLE::HLE_HOOK_START) + { + // Run the original. + function = 0; + } + } + else + { + function = 0; } } } - else + + if (function == 0) { + #ifdef USE_GDBSTUB + if (gdb_active() && gdb_bp_x(PC)) { + + Host_UpdateDisasmDialog(); + + gdb_signal(SIGTRAP); + gdb_handle_exception(); + } + #endif + NPC = PC + sizeof(UGeckoInstruction); instCode.hex = Memory::Read_Opcode(PC); @@ -163,7 +182,7 @@ int Interpreter::SingleStepInner(void) } last_pc = PC; PC = NPC; - + #if defined(_DEBUG) || defined(DEBUGFAST) if (PowerPC::ppcState.gpr[1] == 0) { @@ -178,9 +197,9 @@ int Interpreter::SingleStepInner(void) } void Interpreter::SingleStep() -{ +{ SingleStepInner(); - + CoreTiming::slicelength = 1; CoreTiming::downcount = 0; CoreTiming::Advance(); @@ -228,6 +247,7 @@ void Interpreter::Run() PCVec.erase(PCVec.begin()); #endif + //2: check for breakpoint if (PowerPC::breakpoints.IsAddressBreakPoint(PC)) { @@ -267,9 +287,9 @@ void Interpreter::Run() while (CoreTiming::downcount > 0) { m_EndBlock = false; - int i; + int cycles = 0; - for (i = 0; !m_EndBlock; i++) + while (!m_EndBlock) { cycles += SingleStepInner(); } diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h index c61fa6a573..dfbe4eb003 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h @@ -5,22 +5,29 @@ #ifndef _INTERPRETER_H #define _INTERPRETER_H +#include "Atomic.h" #include "../Gekko.h" #include "../PowerPC.h" #include "../CPUCoreBase.h" +#include "../../Core.h" +#include "../../CoreTiming.h" +#include "../../ConfigManager.h" +#include "../../HLE/HLE.h" +#include "../../HW/Memmap.h" +#include "../../HW/CPU.h" class Interpreter : public CPUCoreBase { public: - void Init(); - void Shutdown(); + void Init() override; + void Shutdown() override; void Reset(); - void SingleStep(); + void SingleStep() override; int SingleStepInner(); - void Run(); - void ClearCache(); - const char *GetName(); + void Run() override; + void ClearCache() override; + const char *GetName() override; typedef void (*_interpreterInstruction)(UGeckoInstruction instCode); @@ -274,7 +281,7 @@ public: static void crxor(UGeckoInstruction _inst); static void mcrf(UGeckoInstruction _inst); static void rfi(UGeckoInstruction _inst); - static void rfid(UGeckoInstruction _inst); + static void rfid(UGeckoInstruction _inst); // static void sync(UGeckoInstruction _inst); static void isync(UGeckoInstruction _inst); diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Branch.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Branch.cpp index 0b0aa1ba98..5a3dc9e467 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Branch.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Branch.cpp @@ -3,10 +3,7 @@ // Refer to the license.txt file included. #include "Interpreter.h" -#include "../../HW/CPU.h" -#include "../../HLE/HLE.h" #include "../PPCAnalyst.h" -#include "Atomic.h" void Interpreter::bx(UGeckoInstruction _inst) { @@ -112,7 +109,7 @@ void Interpreter::rfi(UGeckoInstruction _inst) m_EndBlock = true; } -void Interpreter::rfid(UGeckoInstruction _inst) +void Interpreter::rfid(UGeckoInstruction _inst) { _dbg_assert_msg_(POWERPC, 0, "rfid instruction unimplemented (does this instruction even exist?)"); m_EndBlock = true; diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FPUtils.h b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FPUtils.h index 16e5dbc635..9190a18ed7 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FPUtils.h +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FPUtils.h @@ -5,7 +5,7 @@ #ifndef _INTERPRETER_FPUTILS_H #define _INTERPRETER_FPUTILS_H -#include "../../Core.h" +#include "CPUDetect.h" #include "Interpreter.h" #include "MathUtil.h" @@ -70,28 +70,22 @@ inline void UpdateFPSCR() inline double ForceSingle(double _x) { - //if (FPSCR.RN != 0) - // PanicAlert("RN = %d at %x", (int)FPSCR.RN, PC); - if (FPSCR.NI) - _x = FlushToZeroAsFloat(_x); - - double x = static_cast(_x); - + // convert to float... + float x = _x; + if (!cpu_info.bFlushToZero && FPSCR.NI) + { + x = FlushToZero(x); + } + // ...and back to double: return x; } inline double ForceDouble(double d) { - //if (FPSCR.RN != 0) - // PanicAlert("RN = %d at %x", (int)FPSCR.RN, PC); - - //if (FPSCR.NI) - //{ - // IntDouble x; x.d = d; - //if ((x.i & DOUBLE_EXP) == 0) - // x.i &= DOUBLE_SIGN; // turn into signed zero - // return x.d; - //} + if (!cpu_info.bFlushToZero && FPSCR.NI) + { + d = FlushToZero(d); + } return d; } @@ -116,7 +110,7 @@ inline double NI_mul(const double a, const double b) } inline double NI_add(const double a, const double b) -{ +{ #ifdef VERY_ACCURATE_FP if (a != a) return a; if (b != b) return b; @@ -133,7 +127,7 @@ inline double NI_add(const double a, const double b) } inline double NI_sub(const double a, const double b) -{ +{ #ifdef VERY_ACCURATE_FP if (a != a) return a; if (b != b) return b; @@ -225,7 +219,7 @@ inline u32 ConvertToSingle(u64 x) } } -// used by psq_stXX operations. +// used by psq_stXX operations. inline u32 ConvertToSingleFTZ(u64 x) { u32 exp = (x >> 52) & 0x7ff; diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp index 2f4dc4d493..daa02c20a1 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp @@ -17,10 +17,9 @@ #undef _interlockedbittestandreset64 #endif -#include "../../Core.h" #include "Interpreter.h" -#include "MathUtil.h" #include "Interpreter_FPUtils.h" +#include "MathUtil.h" #include "../LUT_frsqrtex.h" using namespace MathUtil; @@ -31,8 +30,7 @@ void UpdateSSEState(); // Star Wars : Rogue Leader spams that at some point :| void Interpreter::Helper_UpdateCR1(double _fValue) { - // Should just update exception flags, not do any compares. - PanicAlert("CR1"); + SetCRField(1, (FPSCR.FX << 4) | (FPSCR.FEX << 3) | (FPSCR.VX << 2) | FPSCR.OX); } void Interpreter::fcmpo(UGeckoInstruction _inst) @@ -42,8 +40,8 @@ void Interpreter::fcmpo(UGeckoInstruction _inst) int compareResult; - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; else if (fa == fb) compareResult = 2; else { @@ -73,12 +71,12 @@ void Interpreter::fcmpu(UGeckoInstruction _inst) int compareResult; - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; else if (fa == fb) compareResult = 2; else - { - compareResult = 1; + { + compareResult = 1; if (IsSNAN(fa) || IsSNAN(fb)) { SetFPException(FPSCR_VXSNAN); @@ -100,7 +98,7 @@ void Interpreter::fctiwx(UGeckoInstruction _inst) FPSCR.FI = 0; FPSCR.FR = 0; } - else if (b < -(double)0x80000000) + else if (b < -(double)0x80000000) { value = 0x80000000; SetFPException(FPSCR_VXCVI); @@ -143,7 +141,7 @@ void Interpreter::fctiwx(UGeckoInstruction _inst) SetFI(1); FPSCR.FR = fabs(di) > fabs(b); } - } + } // based on HW tests // FPRF is not affected riPS0(_inst.FD) = 0xfff8000000000000ull | value; @@ -192,7 +190,7 @@ void Interpreter::fctiwzx(UGeckoInstruction _inst) // FPRF is not affected riPS0(_inst.FD) = 0xfff8000000000000ull | value; if (value == 0 && ( (*(u64*)&b) & DOUBLE_SIGN )) - riPS0(_inst.FD) |= 0x100000000ull; + riPS0(_inst.FD) |= 0x100000000ull; if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } @@ -201,7 +199,7 @@ void Interpreter::fmrx(UGeckoInstruction _inst) { riPS0(_inst.FD) = riPS0(_inst.FB); // This is a binary instruction. Does not alter FPSCR - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fabsx(UGeckoInstruction _inst) @@ -215,7 +213,7 @@ void Interpreter::fnabsx(UGeckoInstruction _inst) { riPS0(_inst.FD) = riPS0(_inst.FB) | (1ULL << 63); // This is a binary instruction. Does not alter FPSCR - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fnegx(UGeckoInstruction _inst) @@ -253,7 +251,7 @@ void Interpreter::fmulx(UGeckoInstruction _inst) FPSCR.FI = 0; // are these flags important? FPSCR.FR = 0; UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fmulsx(UGeckoInstruction _inst) { @@ -295,7 +293,7 @@ void Interpreter::faddsx(UGeckoInstruction _inst) { rPS0(_inst.FD) = rPS1(_inst.FD) = ForceSingle(NI_add(rPS0(_inst.FA), rPS0(_inst.FB))); UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fdivx(UGeckoInstruction _inst) @@ -307,7 +305,7 @@ void Interpreter::fdivx(UGeckoInstruction _inst) else { rPS0(_inst.FD) = ForceDouble(a / b); - if (b == 0.0) + if (b == 0.0) { if (a == 0.0) { @@ -368,7 +366,7 @@ void Interpreter::fresx(UGeckoInstruction _inst) double b = rPS0(_inst.FB); double one_over = ForceSingle(1.0 / b); // this is based on the real hardware tests - if (b != 0.0 && IsINF(one_over)) + if (b != 0.0 && IsINF(one_over)) { if (one_over > 0) riPS0(_inst.FD) = riPS1(_inst.FD) = MAX_SINGLE; @@ -390,7 +388,7 @@ void Interpreter::fresx(UGeckoInstruction _inst) void Interpreter::frsqrtex(UGeckoInstruction _inst) { double b = rPS0(_inst.FB); - if (b < 0.0) + if (b < 0.0) { SetFPException(FPSCR_VXSQRT); rPS0(_inst.FD) = PPC_NAN; @@ -434,7 +432,7 @@ void Interpreter::fmsubx(UGeckoInstruction _inst) { rPS0(_inst.FD) = ForceDouble(NI_msub( rPS0(_inst.FA), rPS0(_inst.FC), rPS0(_inst.FB) )); UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fmsubsx(UGeckoInstruction _inst) @@ -442,7 +440,7 @@ void Interpreter::fmsubsx(UGeckoInstruction _inst) rPS0(_inst.FD) = rPS1(_inst.FD) = ForceSingle( NI_msub(rPS0(_inst.FA), rPS0(_inst.FC), rPS0(_inst.FB) )); UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fnmaddx(UGeckoInstruction _inst) @@ -453,10 +451,10 @@ void Interpreter::fnmaddx(UGeckoInstruction _inst) } void Interpreter::fnmaddsx(UGeckoInstruction _inst) { - rPS0(_inst.FD) = rPS1(_inst.FD) = + rPS0(_inst.FD) = rPS1(_inst.FD) = ForceSingle(-NI_madd(rPS0(_inst.FA), rPS0(_inst.FC), rPS0(_inst.FB))); UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fnmsubx(UGeckoInstruction _inst) @@ -472,7 +470,7 @@ void Interpreter::fnmsubsx(UGeckoInstruction _inst) rPS0(_inst.FD) = rPS1(_inst.FD) = ForceSingle(-NI_msub(rPS0(_inst.FA), rPS0(_inst.FC), rPS0(_inst.FB))); UpdateFPRF(rPS0(_inst.FD)); - if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); + if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::fsubx(UGeckoInstruction _inst) diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Integer.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Integer.cpp index 71ea36eedd..d09d9bf724 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Integer.cpp @@ -3,8 +3,6 @@ // Refer to the license.txt file included. #include "Interpreter.h" -#include "../../Core.h" -#include "Atomic.h" void Interpreter::Helper_UpdateCR0(u32 _uValue) { @@ -48,7 +46,7 @@ u32 Interpreter::Helper_Mask(int mb, int me) //do the bitflip u32 mask = begin ^ end; //and invert if backwards - if (me < mb) + if (me < mb) return ~mask; else return mask; @@ -66,7 +64,7 @@ void Interpreter::addic(UGeckoInstruction _inst) { u32 a = m_GPR[_inst.RA]; u32 imm = (u32)(s32)_inst.SIMM_16; - // TODO(ector): verify this thing + // TODO(ector): verify this thing m_GPR[_inst.RD] = a + imm; SetCarry(Helper_Carry(a, imm)); } @@ -137,7 +135,7 @@ void Interpreter::subfic(UGeckoInstruction _inst) // #define CALC_XER_CA(X,Y) (((X) + (Y) < X) ? SET_XER_CA : CLEAR_XER_CA) if ((rra + immediate) < rra) SetCarry(1); - else + else SetCarry(0); m_GPR[_inst.RD] = rra - immediate; @@ -148,7 +146,7 @@ void Interpreter::subfic(UGeckoInstruction _inst) SetCarry((m_GPR[_inst.RA] == 0) || (Helper_Carry(0-m_GPR[_inst.RA], immediate))); } -void Interpreter::twi(UGeckoInstruction _inst) +void Interpreter::twi(UGeckoInstruction _inst) { s32 a = m_GPR[_inst.RA]; s32 b = _inst.SIMM_16; @@ -218,8 +216,8 @@ void Interpreter::cmp(UGeckoInstruction _inst) { s32 a = (s32)m_GPR[_inst.RA]; s32 b = (s32)m_GPR[_inst.RB]; - int fTemp = 0x8; // a < b - // if (a < b) fTemp = 0x8; else + int fTemp = 0x8; // a < b + // if (a < b) fTemp = 0x8; else if (a > b) fTemp = 0x4; else if (a == b) fTemp = 0x2; if (GetXER_SO()) PanicAlert("cmp getting overflow flag"); // fTemp |= 0x1 @@ -232,7 +230,7 @@ void Interpreter::cmpl(UGeckoInstruction _inst) u32 b = m_GPR[_inst.RB]; u32 fTemp = 0x8; // a < b - // if (a < b) fTemp = 0x8;else + // if (a < b) fTemp = 0x8;else if (a > b) fTemp = 0x4; else if (a == b) fTemp = 0x2; if (GetXER_SO()) PanicAlert("cmpl getting overflow flag"); // fTemp |= 0x1; @@ -245,7 +243,7 @@ void Interpreter::cntlzwx(UGeckoInstruction _inst) u32 mask = 0x80000000; int i = 0; for (; i < 32; i++, mask >>= 1) - if (val & mask) + if (val & mask) break; m_GPR[_inst.RA] = i; if (_inst.Rc) Helper_UpdateCR0(m_GPR[_inst.RA]); @@ -376,7 +374,7 @@ void Interpreter::srwx(UGeckoInstruction _inst) if (_inst.Rc) Helper_UpdateCR0(m_GPR[_inst.RA]); } -void Interpreter::tw(UGeckoInstruction _inst) +void Interpreter::tw(UGeckoInstruction _inst) { s32 a = m_GPR[_inst.RA]; s32 b = m_GPR[_inst.RB]; diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp index 54e1246095..3fb441f5b9 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStore.cpp @@ -3,17 +3,13 @@ // Refer to the license.txt file included. #include "Common.h" -#include "Atomic.h" #include "MathUtil.h" -#include "../../HW/Memmap.h" - #include "Interpreter.h" -#include "../../Core.h" +#include "Interpreter_FPUtils.h" #include "../JitInterface.h" -#include "Interpreter_FPUtils.h" bool Interpreter::g_bReserve; u32 Interpreter::g_reserveAddr; @@ -218,7 +214,7 @@ void Interpreter::stmw(UGeckoInstruction _inst) } void Interpreter::lwz(UGeckoInstruction _inst) -{ +{ u32 uAddress = Helper_Get_EA(_inst); u32 temp = Memory::Read_U32(uAddress); if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI)) @@ -293,8 +289,8 @@ void Interpreter::stfs(UGeckoInstruction _inst) } void Interpreter::stfsu(UGeckoInstruction _inst) -{ - u32 uAddress = Helper_Get_EA_U(_inst); +{ + u32 uAddress = Helper_Get_EA_U(_inst); Memory::Write_U32(ConvertToSingle(riPS0(_inst.FS)), uAddress); if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI)) { @@ -344,7 +340,7 @@ void Interpreter::dcbf(UGeckoInstruction _inst) /* u32 tmp1 = Memory::Read_U32(PC+4); u32 tmp2 = Memory::Read_U32(PC+8); - if ((tmp1 == 0x38630020) && + if ((tmp1 == 0x38630020) && (tmp2 == 0x4200fff8)) { NPC = PC + 12; @@ -428,7 +424,7 @@ void Interpreter::ecowx(UGeckoInstruction _inst) } if (EA & 3) Common::AtomicOr(PowerPC::ppcState.Exceptions, EXCEPTION_ALIGNMENT); - + // _assert_msg_(POWERPC,0,"ecowx - send stw request (%08x@%08x) to device %02x", // m_GPR[_inst.RS], EA, PowerPC::ppcState.spr[SPR_EAR] & 0x1f); @@ -445,7 +441,7 @@ void Interpreter::eieio(UGeckoInstruction _inst) void Interpreter::icbi(UGeckoInstruction _inst) { - u32 address = Helper_Get_EA_X(_inst); + u32 address = Helper_Get_EA_X(_inst); PowerPC::ppcState.iCache.Invalidate(address); } @@ -495,7 +491,7 @@ void Interpreter::lhbrx(UGeckoInstruction _inst) if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI)) { m_GPR[_inst.RD] = temp; - } + } } void Interpreter::lhzux(UGeckoInstruction _inst) @@ -627,8 +623,8 @@ void Interpreter::stfiwx(UGeckoInstruction _inst) void Interpreter::stfsux(UGeckoInstruction _inst) -{ - u32 uAddress = Helper_Get_EA_UX(_inst); +{ + u32 uAddress = Helper_Get_EA_UX(_inst); Memory::Write_U32(ConvertToSingle(riPS0(_inst.FS)), uAddress); if (!(PowerPC::ppcState.Exceptions & EXCEPTION_DSI)) { @@ -637,7 +633,7 @@ void Interpreter::stfsux(UGeckoInstruction _inst) } void Interpreter::stfsx(UGeckoInstruction _inst) -{ +{ Memory::Write_U32(ConvertToSingle(riPS0(_inst.FS)), Helper_Get_EA_X(_inst)); } @@ -837,7 +833,7 @@ void Interpreter::tlbia(UGeckoInstruction _inst) { // Gekko does not support this instructions. PanicAlert("The GC CPU does not support tlbia"); - // invalid the whole TLB + // invalid the whole TLB //MessageBox(0,"TLBIA","TLBIA",0); } diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp index caaff00373..c90598772c 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_LoadStorePaired.cpp @@ -2,10 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include #include "Interpreter.h" -#include "../../HW/Memmap.h" - #include "Interpreter_FPUtils.h" // dequantize table @@ -27,7 +24,7 @@ const float m_dequantizeTable[] = (1 << 12), (1 << 11), (1 << 10), (1 << 9), (1 << 8), (1 << 7), (1 << 6), (1 << 5), (1 << 4), (1 << 3), (1 << 2), (1 << 1), -}; +}; // quantize table const float m_quantizeTable[] = @@ -48,7 +45,7 @@ const float m_quantizeTable[] = 1.0 / (1 << 12), 1.0 / (1 << 11), 1.0 / (1 << 10), 1.0 / (1 << 9), 1.0 / (1 << 8), 1.0 / (1 << 7), 1.0 / (1 << 6), 1.0 / (1 << 5), 1.0 / (1 << 4), 1.0 / (1 << 3), 1.0 / (1 << 2), 1.0 / (1 << 1), -}; +}; template inline T CLAMP(T a, T bottom, T top) { @@ -57,12 +54,12 @@ inline T CLAMP(T a, T bottom, T top) { return a; } -void Interpreter::Helper_Quantize(const u32 _Addr, const double _fValue, +void Interpreter::Helper_Quantize(const u32 _Addr, const double _fValue, const EQuantizeType _quantizeType, const unsigned int _uScale) { - switch (_quantizeType) + switch (_quantizeType) { - case QUANTIZE_FLOAT: + case QUANTIZE_FLOAT: Memory::Write_U32( ConvertToSingleFTZ( *(u64*)&_fValue ), _Addr ); break; @@ -70,28 +67,28 @@ void Interpreter::Helper_Quantize(const u32 _Addr, const double _fValue, case QUANTIZE_U8: { float fResult = CLAMP((float)_fValue * m_quantizeTable[_uScale], 0.0f, 255.0f); - Memory::Write_U8((u8)fResult, _Addr); + Memory::Write_U8((u8)fResult, _Addr); } break; case QUANTIZE_U16: { float fResult = CLAMP((float)_fValue * m_quantizeTable[_uScale], 0.0f, 65535.0f); - Memory::Write_U16((u16)fResult, _Addr); + Memory::Write_U16((u16)fResult, _Addr); } break; case QUANTIZE_S8: { float fResult = CLAMP((float)_fValue * m_quantizeTable[_uScale], -128.0f, 127.0f); - Memory::Write_U8((u8)(s8)fResult, _Addr); + Memory::Write_U8((u8)(s8)fResult, _Addr); } break; case QUANTIZE_S16: { float fResult = CLAMP((float)_fValue * m_quantizeTable[_uScale], -32768.0f, 32767.0f); - Memory::Write_U16((u16)(s16)fResult, _Addr); + Memory::Write_U16((u16)(s16)fResult, _Addr); } break; @@ -101,7 +98,7 @@ void Interpreter::Helper_Quantize(const u32 _Addr, const double _fValue, } } -float Interpreter::Helper_Dequantize(const u32 _Addr, const EQuantizeType _quantizeType, +float Interpreter::Helper_Dequantize(const u32 _Addr, const EQuantizeType _quantizeType, const unsigned int _uScale) { // dequantize the value @@ -116,15 +113,15 @@ float Interpreter::Helper_Dequantize(const u32 _Addr, const EQuantizeType _quant break; case QUANTIZE_U8: - fResult = static_cast(Memory::Read_U8(_Addr)) * m_dequantizeTable[_uScale]; + fResult = static_cast(Memory::Read_U8(_Addr)) * m_dequantizeTable[_uScale]; break; case QUANTIZE_U16: - fResult = static_cast(Memory::Read_U16(_Addr)) * m_dequantizeTable[_uScale]; + fResult = static_cast(Memory::Read_U16(_Addr)) * m_dequantizeTable[_uScale]; break; case QUANTIZE_S8: - fResult = static_cast((s8)Memory::Read_U8(_Addr)) * m_dequantizeTable[_uScale]; + fResult = static_cast((s8)Memory::Read_U8(_Addr)) * m_dequantizeTable[_uScale]; break; // used for THP player @@ -140,7 +137,7 @@ float Interpreter::Helper_Dequantize(const u32 _Addr, const EQuantizeType _quant return fResult; } -void Interpreter::psq_l(UGeckoInstruction _inst) +void Interpreter::psq_l(UGeckoInstruction _inst) { const UGQR gqr(rSPR(SPR_GQR0 + _inst.I)); const EQuantizeType ldType = static_cast(gqr.LD_TYPE); diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp index 54baf2e0c2..991ae89b6e 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp @@ -6,8 +6,6 @@ #include "Common.h" #include "MathUtil.h" #include "Interpreter.h" -#include "../../HW/Memmap.h" - #include "Interpreter_FPUtils.h" using namespace MathUtil; @@ -36,15 +34,15 @@ void Interpreter::ps_mr(UGeckoInstruction _inst) void Interpreter::ps_nabs(UGeckoInstruction _inst) { - riPS0(_inst.FD) = riPS0(_inst.FB) | (1ULL << 63); - riPS1(_inst.FD) = riPS1(_inst.FB) | (1ULL << 63); + riPS0(_inst.FD) = riPS0(_inst.FB) | (1ULL << 63); + riPS1(_inst.FD) = riPS1(_inst.FB) | (1ULL << 63); if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void Interpreter::ps_abs(UGeckoInstruction _inst) { - riPS0(_inst.FD) = riPS0(_inst.FB) &~ (1ULL << 63); - riPS1(_inst.FD) = riPS1(_inst.FB) &~ (1ULL << 63); + riPS0(_inst.FD) = riPS0(_inst.FB) &~ (1ULL << 63); + riPS1(_inst.FD) = riPS1(_inst.FB) &~ (1ULL << 63); if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } @@ -87,7 +85,7 @@ void Interpreter::ps_merge11(UGeckoInstruction _inst) // From here on, the real deal. void Interpreter::ps_div(UGeckoInstruction _inst) -{ +{ u32 ex_mask = 0; // PS0 @@ -166,7 +164,7 @@ void Interpreter::ps_div(UGeckoInstruction _inst) } } - SetFPException(ex_mask); + SetFPException(ex_mask); UpdateFPRF(rPS0(_inst.FD)); if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } @@ -360,29 +358,8 @@ void Interpreter::ps_cmpu0(UGeckoInstruction _inst) double fb = rPS0(_inst.FB); int compareResult; - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; - else if (fa == fb) compareResult = 2; - else - { - compareResult = 1; - if (IsSNAN(fa) || IsSNAN(fb)) - { - SetFPException(FPSCR_VXSNAN); - } - } - FPSCR.FPRF = compareResult; - SetCRField(_inst.CRFD, compareResult); -} - -void Interpreter::ps_cmpo0(UGeckoInstruction _inst) -{ - double fa = rPS0(_inst.FA); - double fb = rPS0(_inst.FB); - int compareResult; - - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; else if (fa == fb) compareResult = 2; else { @@ -390,17 +367,38 @@ void Interpreter::ps_cmpo0(UGeckoInstruction _inst) if (IsSNAN(fa) || IsSNAN(fb)) { SetFPException(FPSCR_VXSNAN); - if (!FPSCR.VE) + } + } + FPSCR.FPRF = compareResult; + SetCRField(_inst.CRFD, compareResult); +} + +void Interpreter::ps_cmpo0(UGeckoInstruction _inst) +{ + double fa = rPS0(_inst.FA); + double fb = rPS0(_inst.FB); + int compareResult; + + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; + else if (fa == fb) compareResult = 2; + else + { + compareResult = 1; + if (IsSNAN(fa) || IsSNAN(fb)) + { + SetFPException(FPSCR_VXSNAN); + if (!FPSCR.VE) SetFPException(FPSCR_VXVC); } - else + else { //if (IsQNAN(fa) || IsQNAN(fb)) // this is always true SetFPException(FPSCR_VXVC); } } FPSCR.FPRF = compareResult; - SetCRField(_inst.CRFD, compareResult); + SetCRField(_inst.CRFD, compareResult); } void Interpreter::ps_cmpu1(UGeckoInstruction _inst) @@ -409,29 +407,8 @@ void Interpreter::ps_cmpu1(UGeckoInstruction _inst) double fb = rPS1(_inst.FB); int compareResult; - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; - else if (fa == fb) compareResult = 2; - else - { - compareResult = 1; - if (IsSNAN(fa) || IsSNAN(fb)) - { - SetFPException(FPSCR_VXSNAN); - } - } - FPSCR.FPRF = compareResult; - SetCRField(_inst.CRFD, compareResult); -} - -void Interpreter::ps_cmpo1(UGeckoInstruction _inst) -{ - double fa = rPS1(_inst.FA); - double fb = rPS1(_inst.FB); - int compareResult; - - if (fa < fb) compareResult = 8; - else if (fa > fb) compareResult = 4; + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; else if (fa == fb) compareResult = 2; else { @@ -439,17 +416,38 @@ void Interpreter::ps_cmpo1(UGeckoInstruction _inst) if (IsSNAN(fa) || IsSNAN(fb)) { SetFPException(FPSCR_VXSNAN); - if (!FPSCR.VE) + } + } + FPSCR.FPRF = compareResult; + SetCRField(_inst.CRFD, compareResult); +} + +void Interpreter::ps_cmpo1(UGeckoInstruction _inst) +{ + double fa = rPS1(_inst.FA); + double fb = rPS1(_inst.FB); + int compareResult; + + if (fa < fb) compareResult = 8; + else if (fa > fb) compareResult = 4; + else if (fa == fb) compareResult = 2; + else + { + compareResult = 1; + if (IsSNAN(fa) || IsSNAN(fb)) + { + SetFPException(FPSCR_VXSNAN); + if (!FPSCR.VE) SetFPException(FPSCR_VXVC); } - else + else { //if (IsQNAN(fa) || IsQNAN(fb)) // this is always true SetFPException(FPSCR_VXVC); } } FPSCR.FPRF = compareResult; - SetCRField(_inst.CRFD, compareResult); + SetCRField(_inst.CRFD, compareResult); } // __________________________________________________________________________________________________ diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp index b55cbd6b45..475f7591ce 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include #ifdef _WIN32 #define _interlockedbittestandset workaround_ms_header_bug_platform_sdk6_set #define _interlockedbittestandreset workaround_ms_header_bug_platform_sdk6_reset @@ -16,16 +15,11 @@ #endif #include "CPUDetect.h" -#include "Atomic.h" -#include "../../CoreTiming.h" -#include "../../HW/Memmap.h" +#include "Interpreter.h" +#include "Interpreter_FPUtils.h" +#include "FPURoundMode.h" #include "../../HW/GPFifo.h" #include "../../HW/SystemTimers.h" -#include "../../Core.h" -#include "Interpreter.h" -#include "FPURoundMode.h" - -#include "Interpreter_FPUtils.h" /* @@ -46,7 +40,7 @@ static void FPSCRtoFPUSettings(UReg_FPSCR fp) { FPURoundMode::SetRoundMode(fp.RN); - + if (fp.VE || fp.OE || fp.UE || fp.ZE || fp.XE) { //PanicAlert("FPSCR - exceptions enabled. Please report. VE=%i OE=%i UE=%i ZE=%i XE=%i", @@ -54,15 +48,8 @@ static void FPSCRtoFPUSettings(UReg_FPSCR fp) // Pokemon Colosseum does this. Gah. } - // Also corresponding SSE rounding mode setting - if (FPSCR.NI) - { - // Either one of these two breaks Beyond Good & Evil. - // if (cpu_info.bSSSE3) - // csr |= DAZ; - // csr |= FTZ; - } - FPURoundMode::SetSIMDMode(FPSCR.RN); + // Set SSE rounding mode and denormal handling + FPURoundMode::SetSIMDMode(FPSCR.RN, FPSCR.NI); } void Interpreter::mtfsb0x(UGeckoInstruction _inst) @@ -86,7 +73,7 @@ void Interpreter::mtfsb1x(UGeckoInstruction _inst) SetFPException(b); else FPSCR.Hex |= b; - FPSCRtoFPUSettings(FPSCR); + FPSCRtoFPUSettings(FPSCR); if (_inst.Rc) PanicAlert("mtfsb1x: inst_.Rc"); } @@ -130,7 +117,7 @@ void Interpreter::mtfsfx(UGeckoInstruction _inst) void Interpreter::mcrxr(UGeckoInstruction _inst) { // USES_XER - SetCRField(_inst.CRFD, PowerPC::ppcState.spr[SPR_XER] >> 28); + SetCRField(_inst.CRFD, PowerPC::ppcState.spr[SPR_XER] >> 28); PowerPC::ppcState.spr[SPR_XER] &= ~0xF0000000; // clear 0-3 } @@ -224,7 +211,7 @@ void Interpreter::mfspr(UGeckoInstruction _inst) //XER LR CTR are the only ones available in user mode, time base can be read too. //Gamecube games always run in superuser mode, but hey.... - switch (iIndex) + switch (iIndex) { case SPR_DEC: if ((rSPR(iIndex) & 0x80000000) == 0) // We are still decrementing @@ -247,7 +234,7 @@ void Interpreter::mfspr(UGeckoInstruction _inst) rSPR(iIndex) |= 1; // BNE = buffer not empty else rSPR(iIndex) &= ~1; - } + } break; } m_GPR[_inst.RD] = rSPR(iIndex); @@ -349,13 +336,13 @@ void Interpreter::mtspr(UGeckoInstruction _inst) case SPR_DMAL: // Locked cache<->Memory DMA // Total fake, we ignore that DMAs take time. - if (DMAL.DMA_T) + if (DMAL.DMA_T) { u32 dwMemAddress = DMAU.MEM_ADDR << 5; u32 dwCacheAddress = DMAL.LC_ADDR << 5; u32 iLength = ((DMAU.DMA_LEN_U << 2) | DMAL.DMA_LEN_L); // INFO_LOG(POWERPC, "DMA: mem = %x, cache = %x, len = %u, LD = %d, PC=%x", dwMemAddress, dwCacheAddress, iLength, (int)DMAL.DMA_LD, PC); - if (iLength == 0) + if (iLength == 0) iLength = 128; if (DMAL.DMA_LD) Memory::DMA_MemoryToLC(dwCacheAddress, dwMemAddress, iLength); @@ -471,7 +458,7 @@ void Interpreter::mcrfs(UGeckoInstruction _inst) FPSCR.VXCVI = 0; break; } - SetCRField(_inst.CRFD, fpflags); + SetCRField(_inst.CRFD, fpflags); } void Interpreter::mffsx(UGeckoInstruction _inst) diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Tables.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Tables.cpp index f1403bed87..882b9d01da 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Tables.cpp @@ -13,7 +13,7 @@ struct GekkoOPTemplate GekkoOPInfo opinfo; }; -static GekkoOPTemplate primarytable[] = +static GekkoOPTemplate primarytable[] = { {4, Interpreter::RunTable4, {"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0, 0, 0, 0, 0}}, {19, Interpreter::RunTable19, {"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0, 0, 0, 0, 0}}, @@ -95,7 +95,7 @@ static GekkoOPTemplate primarytable[] = {58, Interpreter::unknown_instruction, {"unknown_instruction", OPTYPE_UNKNOWN, 0, 0, 0, 0, 0}}, }; -static GekkoOPTemplate table4[] = +static GekkoOPTemplate table4[] = { //SUBOP10 {0, Interpreter::ps_cmpu0, {"ps_cmpu0", OPTYPE_PS, FL_SET_CRn | FL_USE_FPU, 0, 0, 0, 0}}, {32, Interpreter::ps_cmpo0, {"ps_cmpo0", OPTYPE_PS, FL_SET_CRn | FL_USE_FPU, 0, 0, 0, 0}}, @@ -111,9 +111,9 @@ static GekkoOPTemplate table4[] = {624, Interpreter::ps_merge11, {"ps_merge11", OPTYPE_PS, FL_RC_BIT | FL_USE_FPU, 0, 0, 0, 0}}, {1014, Interpreter::dcbz_l, {"dcbz_l", OPTYPE_SYSTEM, 0, 0, 0, 0, 0}}, -}; +}; -static GekkoOPTemplate table4_2[] = +static GekkoOPTemplate table4_2[] = { {10, Interpreter::ps_sum0, {"ps_sum0", OPTYPE_PS, FL_USE_FPU, 0, 0, 0, 0}}, {11, Interpreter::ps_sum1, {"ps_sum1", OPTYPE_PS, FL_USE_FPU, 0, 0, 0, 0}}, @@ -135,15 +135,15 @@ static GekkoOPTemplate table4_2[] = }; -static GekkoOPTemplate table4_3[] = +static GekkoOPTemplate table4_3[] = { {6, Interpreter::psq_lx, {"psq_lx", OPTYPE_PS, FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, {7, Interpreter::psq_stx, {"psq_stx", OPTYPE_PS, FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, {38, Interpreter::psq_lux, {"psq_lux", OPTYPE_PS, FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, - {39, Interpreter::psq_stux, {"psq_stux", OPTYPE_PS, FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, + {39, Interpreter::psq_stux, {"psq_stux", OPTYPE_PS, FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, }; -static GekkoOPTemplate table19[] = +static GekkoOPTemplate table19[] = { {528, Interpreter::bcctrx, {"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK, 0, 0, 0, 0}}, {16, Interpreter::bclrx, {"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK, 0, 0, 0, 0}}, @@ -155,16 +155,16 @@ static GekkoOPTemplate table19[] = {449, Interpreter::cror, {"cror", OPTYPE_CR, FL_EVIL, 0, 0, 0, 0}}, {417, Interpreter::crorc, {"crorc", OPTYPE_CR, FL_EVIL, 0, 0, 0, 0}}, {193, Interpreter::crxor, {"crxor", OPTYPE_CR, FL_EVIL, 0, 0, 0, 0}}, - + {150, Interpreter::isync, {"isync", OPTYPE_ICACHE, FL_EVIL, 0, 0, 0, 0}}, {0, Interpreter::mcrf, {"mcrf", OPTYPE_SYSTEM, FL_EVIL, 0, 0, 0, 0}}, - + {50, Interpreter::rfi, {"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1, 0, 0, 0}}, {18, Interpreter::rfid, {"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 0, 0, 0, 0}} }; -static GekkoOPTemplate table31[] = +static GekkoOPTemplate table31[] = { {28, Interpreter::andx, {"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT, 0, 0, 0, 0}}, {60, Interpreter::andcx, {"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT, 0, 0, 0, 0}}, @@ -191,7 +191,7 @@ static GekkoOPTemplate table31[] = {470, Interpreter::dcbi, {"dcbi", OPTYPE_DCACHE, 0, 4, 0, 0, 0}}, {758, Interpreter::dcba, {"dcba", OPTYPE_DCACHE, 0, 4, 0, 0, 0}}, {1014, Interpreter::dcbz, {"dcbz", OPTYPE_DCACHE, FL_LOADSTORE, 4, 0, 0, 0}}, - + //load word {23, Interpreter::lwzx, {"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, {55, Interpreter::lwzux, {"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, @@ -207,7 +207,7 @@ static GekkoOPTemplate table31[] = //load byte {87, Interpreter::lbzx, {"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, {119, Interpreter::lbzux, {"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, - + //load byte reverse {534, Interpreter::lwbrx, {"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, {790, Interpreter::lhbrx, {"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B | FL_LOADSTORE, 0, 0, 0, 0}}, @@ -239,7 +239,7 @@ static GekkoOPTemplate table31[] = {661, Interpreter::stswx, {"stswx", OPTYPE_STORE, FL_EVIL | FL_LOADSTORE, 0, 0, 0, 0}}, {725, Interpreter::stswi, {"stswi", OPTYPE_STORE, FL_EVIL | FL_LOADSTORE, 0, 0, 0, 0}}, - // fp load/store + // fp load/store {535, Interpreter::lfsx, {"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B | FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, {567, Interpreter::lfsux, {"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B | FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, {599, Interpreter::lfdx, {"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B | FL_USE_FPU | FL_LOADSTORE, 0, 0, 0, 0}}, @@ -277,8 +277,8 @@ static GekkoOPTemplate table31[] = {566, Interpreter::tlbsync, {"tlbsync", OPTYPE_SYSTEM, 0, 0, 0, 0, 0}}, }; -static GekkoOPTemplate table31_2[] = -{ +static GekkoOPTemplate table31_2[] = +{ {266, Interpreter::addx, {"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 0, 0, 0, 0}}, {778, Interpreter::addx, {"addox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 0, 0, 0, 0}}, {10, Interpreter::addcx, {"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT, 0, 0, 0, 0}}, @@ -305,19 +305,19 @@ static GekkoOPTemplate table31_2[] = {200, Interpreter::subfzex, {"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT, 0, 0, 0, 0}}, }; -static GekkoOPTemplate table59[] = +static GekkoOPTemplate table59[] = { {18, Interpreter::fdivsx, {"fdivsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 16, 0, 0, 0}}, // TODO - {20, Interpreter::fsubsx, {"fsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {21, Interpreter::faddsx, {"faddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {20, Interpreter::fsubsx, {"fsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {21, Interpreter::faddsx, {"faddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, // {22, Interpreter::fsqrtsx, {"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, // Not implemented on gekko - {24, Interpreter::fresx, {"fresx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {25, Interpreter::fmulsx, {"fmulsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {28, Interpreter::fmsubsx, {"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {29, Interpreter::fmaddsx, {"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {30, Interpreter::fnmsubsx, {"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, - {31, Interpreter::fnmaddsx, {"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, -}; + {24, Interpreter::fresx, {"fresx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {25, Interpreter::fmulsx, {"fmulsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {28, Interpreter::fmsubsx, {"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {29, Interpreter::fmaddsx, {"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {30, Interpreter::fnmsubsx, {"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, + {31, Interpreter::fnmaddsx, {"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, +}; static GekkoOPTemplate table63[] = { @@ -339,7 +339,7 @@ static GekkoOPTemplate table63[] = {711, Interpreter::mtfsfx, {"mtfsfx", OPTYPE_SYSTEMFP, FL_USE_FPU, 2, 0, 0, 0}}, }; -static GekkoOPTemplate table63_2[] = +static GekkoOPTemplate table63_2[] = { {18, Interpreter::fdivx, {"fdivx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 30, 0, 0, 0}}, {20, Interpreter::fsubx, {"fsubx", OPTYPE_FPU, FL_RC_BIT_F | FL_USE_FPU, 0, 0, 0, 0}}, @@ -364,7 +364,7 @@ void InitTables() return; //clear - for (int i = 0; i < 32; i++) + for (int i = 0; i < 32; i++) { Interpreter::m_opTable59[i] = Interpreter::unknown_instruction; m_infoTable59[i] = 0; @@ -376,118 +376,118 @@ void InitTables() Interpreter::m_opTable19[i] = Interpreter::unknown_instruction; Interpreter::m_opTable31[i] = Interpreter::unknown_instruction; Interpreter::m_opTable63[i] = Interpreter::unknown_instruction; - m_infoTable4[i] = 0; - m_infoTable19[i] = 0; - m_infoTable31[i] = 0; - m_infoTable63[i] = 0; + m_infoTable4[i] = 0; + m_infoTable19[i] = 0; + m_infoTable31[i] = 0; + m_infoTable63[i] = 0; } - for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : primarytable) { - Interpreter::m_opTable[primarytable[i].opcode] = primarytable[i].Inst; - m_infoTable[primarytable[i].opcode] = &primarytable[i].opinfo; + Interpreter::m_opTable[tpl.opcode] = tpl.Inst; + m_infoTable[tpl.opcode] = &tpl.opinfo; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_2) { - int op = fill+table4_2[j].opcode; - Interpreter::m_opTable4[op] = table4_2[j].Inst; - m_infoTable4[op] = &table4_2[j].opinfo; + int op = fill+tpl.opcode; + Interpreter::m_opTable4[op] = tpl.Inst; + m_infoTable4[op] = &tpl.opinfo; } } for (int i = 0; i < 16; i++) { int fill = i << 6; - for (int j = 0; j < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_3) { - int op = fill+table4_3[j].opcode; - Interpreter::m_opTable4[op] = table4_3[j].Inst; - m_infoTable4[op] = &table4_3[j].opinfo; + int op = fill+tpl.opcode; + Interpreter::m_opTable4[op] = tpl.Inst; + m_infoTable4[op] = &tpl.opinfo; } } - for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table4) { - int op = table4[i].opcode; - Interpreter::m_opTable4[op] = table4[i].Inst; - m_infoTable4[op] = &table4[i].opinfo; + int op = tpl.opcode; + Interpreter::m_opTable4[op] = tpl.Inst; + m_infoTable4[op] = &tpl.opinfo; } - for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table31) { - int op = table31[i].opcode; - Interpreter::m_opTable31[op] = table31[i].Inst; - m_infoTable31[op] = &table31[i].opinfo; + int op = tpl.opcode; + Interpreter::m_opTable31[op] = tpl.Inst; + m_infoTable31[op] = &tpl.opinfo; } for (int i = 0; i < 1; i++) { int fill = i << 9; - for (int j = 0; j < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table31_2) { - int op = fill + table31_2[j].opcode; - Interpreter::m_opTable31[op] = table31_2[j].Inst; - m_infoTable31[op] = &table31_2[j].opinfo; + int op = fill + tpl.opcode; + Interpreter::m_opTable31[op] = tpl.Inst; + m_infoTable31[op] = &tpl.opinfo; } } - for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table19) { - int op = table19[i].opcode; - Interpreter::m_opTable19[op] = table19[i].Inst; - m_infoTable19[op] = &table19[i].opinfo; + int op = tpl.opcode; + Interpreter::m_opTable19[op] = tpl.Inst; + m_infoTable19[op] = &tpl.opinfo; } - for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table59) { - int op = table59[i].opcode; - Interpreter::m_opTable59[op] = table59[i].Inst; - m_infoTable59[op] = &table59[i].opinfo; + int op = tpl.opcode; + Interpreter::m_opTable59[op] = tpl.Inst; + m_infoTable59[op] = &tpl.opinfo; } - for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table63) { - int op = table63[i].opcode; - Interpreter::m_opTable63[op] = table63[i].Inst; - m_infoTable63[op] = &table63[i].opinfo; + int op = tpl.opcode; + Interpreter::m_opTable63[op] = tpl.Inst; + m_infoTable63[op] = &tpl.opinfo; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table63_2) { - int op = fill + table63_2[j].opcode; - Interpreter::m_opTable63[op] = table63_2[j].Inst; - m_infoTable63[op] = &table63_2[j].opinfo; + int op = fill + tpl.opcode; + Interpreter::m_opTable63[op] = tpl.Inst; + m_infoTable63[op] = &tpl.opinfo; } } m_numInstructions = 0; - for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &primarytable[i].opinfo; - for (int i = 0; i < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table4_2[i].opinfo; - for (int i = 0; i < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table4_3[i].opinfo; - for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table4[i].opinfo; - for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table31[i].opinfo; - for (int i = 0; i < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table31_2[i].opinfo; - for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table19[i].opinfo; - for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table59[i].opinfo; - for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table63[i].opinfo; - for (int i = 0; i < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); i++) - m_allInstructions[m_numInstructions++] = &table63_2[i].opinfo; + for (auto& tpl : primarytable) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table4_2) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table4_3) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table4) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table31) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table31_2) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table19) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table59) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table63) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; + for (auto& tpl : table63_2) + m_allInstructions[m_numInstructions++] = &tpl.opinfo; if (m_numInstructions >= 512) { PanicAlert("m_allInstructions underdimensioned"); } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp index 488b2fdec6..87fb248c1f 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.cpp @@ -10,20 +10,9 @@ #endif #include "Common.h" -#include "x64Emitter.h" -#include "x64ABI.h" -#include "Thunk.h" #include "../../HLE/HLE.h" -#include "../../Core.h" #include "../../PatchEngine.h" -#include "../../CoreTiming.h" -#include "../../ConfigManager.h" -#include "../PowerPC.h" #include "../Profiler.h" -#include "../PPCTables.h" -#include "../PPCAnalyst.h" -#include "../../HW/Memmap.h" -#include "../../HW/GPFifo.h" #include "Jit.h" #include "JitAsm.h" #include "JitRegCache.h" @@ -71,7 +60,7 @@ using namespace PowerPC; // will be as small to be negligible, so I haven't dirtied up the code with that. AMD recommends it in their // optimization manuals, though. // -// We support block linking. Reserve space at the exits of every block for a full 5-byte jmp. Save 16-bit offsets +// We support block linking. Reserve space at the exits of every block for a full 5-byte jmp. Save 16-bit offsets // from the starts of each block, marking the exits so that they can be nicely patched at any time. // // Blocks do NOT use call/ret, they only jmp to each other and to the dispatcher when necessary. @@ -105,7 +94,7 @@ using namespace PowerPC; CR2-CR4 are non-volatile, rest of CR is volatile -> dropped on blr. R5-R12 are volatile -> dropped on blr. * classic inlining across calls. - + Low hanging fruit: stfd -- guaranteed in memory cmpl @@ -194,7 +183,7 @@ void Jit64::Init() asm_routines.Init(); } -void Jit64::ClearCache() +void Jit64::ClearCache() { blocks.Clear(); trampolines.ClearCodeSpace(); @@ -287,7 +276,7 @@ void Jit64::Cleanup() ABI_CallFunctionCCC((void *)&PowerPC::UpdatePerformanceMonitor, js.downcountAmount, jit->js.numLoadStoreInst, jit->js.numFloatingPointInst); } -void Jit64::WriteExit(u32 destination, int exit_num) +void Jit64::WriteExit(u32 destination) { Cleanup(); @@ -295,39 +284,43 @@ void Jit64::WriteExit(u32 destination, int exit_num) //If nobody has taken care of this yet (this can be removed when all branches are done) JitBlock *b = js.curBlock; - b->exitAddress[exit_num] = destination; - b->exitPtrs[exit_num] = GetWritableCodePtr(); - + JitBlock::LinkData linkData; + linkData.exitAddress = destination; + linkData.exitPtrs = GetWritableCodePtr(); + // Link opportunity! - int block = blocks.GetBlockNumberFromStartAddress(destination); - if (block >= 0 && jo.enableBlocklink) + if (jo.enableBlocklink) { - // It exists! Joy of joy! - JMP(blocks.GetBlock(block)->checkedEntry, true); - b->linkStatus[exit_num] = true; - } - else - { - MOV(32, M(&PC), Imm32(destination)); - JMP(asm_routines.dispatcher, true); + int block = blocks.GetBlockNumberFromStartAddress(destination); + if (block >= 0) + { + // It exists! Joy of joy! + JMP(blocks.GetBlock(block)->checkedEntry, true); + linkData.linkStatus = true; + return; + } } + MOV(32, M(&PC), Imm32(destination)); + JMP(asm_routines.dispatcher, true); + + b->linkData.push_back(linkData); } -void Jit64::WriteExitDestInEAX() +void Jit64::WriteExitDestInEAX() { MOV(32, M(&PC), R(EAX)); Cleanup(); - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } -void Jit64::WriteRfiExitDestInEAX() +void Jit64::WriteRfiExitDestInEAX() { MOV(32, M(&PC), R(EAX)); MOV(32, M(&NPC), R(EAX)); Cleanup(); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExceptions)); - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } @@ -347,7 +340,7 @@ void Jit64::WriteExternalExceptionExit() MOV(32, R(EAX), M(&PC)); MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExternalExceptions)); - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } @@ -384,11 +377,11 @@ void Jit64::Trace() sprintf(reg, "f%02d: %016x ", i, riPS0(i)); strncat(fregs, reg, 750); } -#endif +#endif - DEBUG_LOG(DYNA_REC, "JIT64 PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", - PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], - PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, + DEBUG_LOG(DYNA_REC, "JIT64 PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", + PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], + PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, PowerPC::ppcState.msr, PowerPC::ppcState.spr[8], regs, fregs); } @@ -552,7 +545,10 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc { js.fifoBytesThisBlock -= 32; MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write - ABI_CallFunction(thunks.ProtectFunction((void *)&GPFifo::CheckGatherPipe, 0)); + u32 registersInUse = RegistersInUse(); + ABI_PushRegistersAndAdjustStack(registersInUse, false); + ABI_CallFunction((void *)&GPFifo::CheckGatherPipe); + ABI_PopRegistersAndAdjustStack(registersInUse, false); } u32 function = HLE::GetFunctionIndex(ops[i].address); @@ -632,7 +628,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); FixupBranch noBreakpoint = J_CC(CC_Z); - WriteExit(ops[i].address, 0); + WriteExit(ops[i].address); SetJumpTarget(noBreakpoint); } @@ -673,7 +669,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc js.skipnext = false; i++; // Skip next instruction } - + if (js.cancel) break; } @@ -701,19 +697,9 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc // Remove the invalid instruction from the icache, forcing a recompile #ifdef _M_IX86 - if (js.compilerPC & JIT_ICACHE_VMEM_BIT) - MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); - else if (js.compilerPC & JIT_ICACHE_EXRAM_BIT) - MOV(32, M((jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); - else - MOV(32, M((jit->GetBlockCache()->GetICache() + (js.compilerPC & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); + MOV(32, M(jit->GetBlockCache()->GetICachePtr(js.compilerPC)), Imm32(JIT_ICACHE_INVALID_WORD)); #else - if (js.compilerPC & JIT_ICACHE_VMEM_BIT) - MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheVMEM() + (js.compilerPC & JIT_ICACHE_MASK))); - else if (js.compilerPC & JIT_ICACHE_EXRAM_BIT) - MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheEx() + (js.compilerPC & JIT_ICACHEEX_MASK))); - else - MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICache() + (js.compilerPC & JIT_ICACHE_MASK))); + MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICachePtr(js.compilerPC))); MOV(32,MatR(RAX),Imm32(JIT_ICACHE_INVALID_WORD)); #endif @@ -724,7 +710,7 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc { gpr.Flush(FLUSH_ALL); fpr.Flush(FLUSH_ALL); - WriteExit(nextPC, 0); + WriteExit(nextPC); } b->flags = js.block_flags; @@ -737,3 +723,21 @@ const u8* Jit64::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc return normalEntry; } + +u32 Jit64::RegistersInUse() +{ +#ifdef _M_X64 + u32 result = 0; + for (int i = 0; i < NUMXREGS; i++) + { + if (!gpr.IsFreeX(i)) + result |= (1 << i); + if (!fpr.IsFreeX(i)) + result |= (1 << (16 + i)); + } + return result; +#else + // not needed + return 0; +#endif +} diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h index 885f7f3c4a..1adbdfaac4 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit.h @@ -19,36 +19,34 @@ #ifndef _JIT64_H #define _JIT64_H -#include "../PPCAnalyst.h" -#include "../JitCommon/JitCache.h" -#include "../JitCommon/Jit_Util.h" -#include "JitRegCache.h" -#include "x64Emitter.h" -#include "x64Analyzer.h" #include "../JitCommon/JitBackpatch.h" #include "../JitCommon/JitBase.h" +#include "../JitCommon/JitCache.h" +#include "../JitCommon/Jit_Util.h" +#include "../PowerPC.h" +#include "../PPCAnalyst.h" +#include "../PPCTables.h" +#include "../../Core.h" +#include "../../CoreTiming.h" +#include "../../ConfigManager.h" +#include "../../HW/Memmap.h" +#include "../../HW/GPFifo.h" #include "JitAsm.h" +#include "JitRegCache.h" +#include "x64ABI.h" +#include "x64Analyzer.h" +#include "x64Emitter.h" // Use these to control the instruction selection // #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START PPCTables::CountInstruction(inst); #define INSTRUCTION_START -#define JITDISABLE(type) \ +#define JITDISABLE(setting) \ if (Core::g_CoreStartupParameter.bJITOff || \ - Core::g_CoreStartupParameter.bJIT##type##Off) \ + Core::g_CoreStartupParameter.setting) \ {Default(inst); return;} -#define MEMCHECK_START \ - FixupBranch memException; \ - if (js.memcheck) \ - { TEST(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_DSI)); \ - memException = J_CC(CC_NZ); } - -#define MEMCHECK_END \ - if (js.memcheck) \ - SetJumpTarget(memException); - class Jit64 : public Jitx86Base { private: @@ -64,28 +62,30 @@ public: Jit64() : code_buffer(32000) {} ~Jit64() {} - void Init(); - void Shutdown(); + void Init() override; + void Shutdown() override; // Jit! - void Jit(u32 em_address); + void Jit(u32 em_address) override; const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b); - JitBlockCache *GetBlockCache() { return &blocks; } + u32 RegistersInUse(); + + JitBlockCache *GetBlockCache() override { return &blocks; } void Trace(); - void ClearCache(); + void ClearCache() override; const u8 *GetDispatcher() { return asm_routines.dispatcher; } - const CommonAsmRoutines *GetAsmRoutines() { + const CommonAsmRoutines *GetAsmRoutines() override { return &asm_routines; } - const char *GetName() { + const char *GetName() override { #ifdef _M_X64 return "JIT64"; #else @@ -94,12 +94,12 @@ public: } // Run! - void Run(); - void SingleStep(); + void Run() override; + void SingleStep() override; // Utilities for use by opcodes - void WriteExit(u32 destination, int exit_num); + void WriteExit(u32 destination); void WriteExitDestInEAX(); void WriteExceptionExit(); void WriteExternalExceptionExit(); @@ -119,7 +119,7 @@ public: void tri_op(int d, int a, int b, bool reversible, void (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); typedef u32 (*Operation)(u32 a, u32 b); void regimmop(int d, int a, bool binary, u32 value, Operation doop, void (XEmitter::*op)(int, const Gen::OpArg&, const Gen::OpArg&), bool Rc = false, bool carry = false); - void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); + void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (XEmitter::*op_2)(Gen::X64Reg, Gen::OpArg), void (XEmitter::*op_3)(Gen::X64Reg, Gen::X64Reg, Gen::OpArg)); // OPCODES void unknown_instruction(UGeckoInstruction _inst); @@ -178,11 +178,11 @@ public: void ps_arith(UGeckoInstruction inst); //aggregate void ps_mergeXX(UGeckoInstruction inst); void ps_maddXX(UGeckoInstruction inst); - void ps_rsqrte(UGeckoInstruction inst); + void ps_recip(UGeckoInstruction inst); void ps_sum(UGeckoInstruction inst); void ps_muls(UGeckoInstruction inst); - void fp_arith_s(UGeckoInstruction inst); + void fp_arith(UGeckoInstruction inst); void frsqrtex(UGeckoInstruction inst); void fcmpx(UGeckoInstruction inst); @@ -223,7 +223,7 @@ public: void twx(UGeckoInstruction inst); void lXXx(UGeckoInstruction inst); - + void stXx(UGeckoInstruction inst); void lmw(UGeckoInstruction inst); @@ -232,6 +232,4 @@ public: void icbi(UGeckoInstruction inst); }; -void ProfiledReJit(); - #endif // _JIT64_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp index 268e2562d6..dc81015573 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit64_Tables.cpp @@ -27,7 +27,7 @@ struct GekkoOPTemplate //GekkoOPInfo opinfo; // Doesn't need opinfo, Interpreter fills it out }; -static GekkoOPTemplate primarytable[] = +static GekkoOPTemplate primarytable[] = { {4, &Jit64::DynaRunTable4}, //"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0}}, {19, &Jit64::DynaRunTable19}, //"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0}}, @@ -108,7 +108,7 @@ static GekkoOPTemplate primarytable[] = {58, &Jit64::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, }; -static GekkoOPTemplate table4[] = +static GekkoOPTemplate table4[] = { //SUBOP10 {0, &Jit64::Default}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, {32, &Jit64::Default}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, @@ -124,9 +124,9 @@ static GekkoOPTemplate table4[] = {624, &Jit64::ps_mergeXX}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, {1014, &Jit64::Default}, //"dcbz_l", OPTYPE_SYSTEM, 0}}, -}; +}; -static GekkoOPTemplate table4_2[] = +static GekkoOPTemplate table4_2[] = { {10, &Jit64::ps_sum}, //"ps_sum0", OPTYPE_PS, 0}}, {11, &Jit64::ps_sum}, //"ps_sum1", OPTYPE_PS, 0}}, @@ -138,9 +138,9 @@ static GekkoOPTemplate table4_2[] = {20, &Jit64::ps_arith}, //"ps_sub", OPTYPE_PS, 0}}, {21, &Jit64::ps_arith}, //"ps_add", OPTYPE_PS, 0}}, {23, &Jit64::ps_sel}, //"ps_sel", OPTYPE_PS, 0}}, - {24, &Jit64::Default}, //"ps_res", OPTYPE_PS, 0}}, + {24, &Jit64::ps_recip}, //"ps_res", OPTYPE_PS, 0}}, {25, &Jit64::ps_arith}, //"ps_mul", OPTYPE_PS, 0}}, - {26, &Jit64::ps_rsqrte}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, + {26, &Jit64::ps_recip}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, {28, &Jit64::ps_maddXX}, //"ps_msub", OPTYPE_PS, 0}}, {29, &Jit64::ps_maddXX}, //"ps_madd", OPTYPE_PS, 0}}, {30, &Jit64::ps_maddXX}, //"ps_nmsub", OPTYPE_PS, 0}}, @@ -148,15 +148,15 @@ static GekkoOPTemplate table4_2[] = }; -static GekkoOPTemplate table4_3[] = +static GekkoOPTemplate table4_3[] = { {6, &Jit64::Default}, //"psq_lx", OPTYPE_PS, 0}}, {7, &Jit64::Default}, //"psq_stx", OPTYPE_PS, 0}}, {38, &Jit64::Default}, //"psq_lux", OPTYPE_PS, 0}}, - {39, &Jit64::Default}, //"psq_stux", OPTYPE_PS, 0}}, + {39, &Jit64::Default}, //"psq_stux", OPTYPE_PS, 0}}, }; -static GekkoOPTemplate table19[] = +static GekkoOPTemplate table19[] = { {528, &Jit64::bcctrx}, //"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, {16, &Jit64::bclrx}, //"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, @@ -168,16 +168,16 @@ static GekkoOPTemplate table19[] = {449, &Jit64::crXXX}, //"cror", OPTYPE_CR, FL_EVIL}}, {417, &Jit64::crXXX}, //"crorc", OPTYPE_CR, FL_EVIL}}, {193, &Jit64::crXXX}, //"crxor", OPTYPE_CR, FL_EVIL}}, - + {150, &Jit64::DoNothing}, //"isync", OPTYPE_ICACHE, FL_EVIL}}, {0, &Jit64::mcrf}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, - + {50, &Jit64::rfi}, //"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1}}, {18, &Jit64::Default}, //"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS}} }; -static GekkoOPTemplate table31[] = +static GekkoOPTemplate table31[] = { {28, &Jit64::boolX}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, {60, &Jit64::boolX}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, @@ -252,7 +252,7 @@ static GekkoOPTemplate table31[] = {661, &Jit64::Default}, //"stswx", OPTYPE_STORE, FL_EVIL}}, {725, &Jit64::Default}, //"stswi", OPTYPE_STORE, FL_EVIL}}, - // fp load/store + // fp load/store {535, &Jit64::lfsx}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, {567, &Jit64::Default}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, {599, &Jit64::Default}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, @@ -290,8 +290,8 @@ static GekkoOPTemplate table31[] = {566, &Jit64::Default}, //"tlbsync", OPTYPE_SYSTEM, 0}}, }; -static GekkoOPTemplate table31_2[] = -{ +static GekkoOPTemplate table31_2[] = +{ {266, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, {778, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, {10, &Jit64::addcx}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, @@ -318,21 +318,21 @@ static GekkoOPTemplate table31_2[] = {200, &Jit64::subfzex}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, }; -static GekkoOPTemplate table59[] = +static GekkoOPTemplate table59[] = { - {18, &Jit64::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, - {20, &Jit64::fp_arith_s}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {21, &Jit64::fp_arith_s}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {18, &Jit64::fp_arith}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, + {20, &Jit64::fp_arith}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &Jit64::fp_arith}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, // {22, &Jit64::Default}, //"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F}}, // Not implemented on gekko - {24, &Jit64::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, - {25, &Jit64::fp_arith_s}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {28, &Jit64::fmaddXX}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {29, &Jit64::fmaddXX}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {30, &Jit64::fmaddXX}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {31, &Jit64::fmaddXX}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, -}; + {24, &Jit64::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &Jit64::fp_arith}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &Jit64::fmaddXX}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &Jit64::fmaddXX}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &Jit64::fmaddXX}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &Jit64::fmaddXX}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; -static GekkoOPTemplate table63[] = +static GekkoOPTemplate table63[] = { {264, &Jit64::fsign}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, {32, &Jit64::fcmpx}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, @@ -352,15 +352,15 @@ static GekkoOPTemplate table63[] = {711, &Jit64::Default}, //"mtfsfx", OPTYPE_SYSTEMFP, 0, 2}}, }; -static GekkoOPTemplate table63_2[] = +static GekkoOPTemplate table63_2[] = { - {18, &Jit64::Default}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, - {20, &Jit64::Default}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, - {21, &Jit64::Default}, //"faddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {18, &Jit64::fp_arith}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, + {20, &Jit64::fp_arith}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &Jit64::fp_arith}, //"faddx", OPTYPE_FPU, FL_RC_BIT_F}}, {22, &Jit64::Default}, //"fsqrtx", OPTYPE_FPU, FL_RC_BIT_F}}, {23, &Jit64::Default}, //"fselx", OPTYPE_FPU, FL_RC_BIT_F}}, - {25, &Jit64::fp_arith_s}, //"fmulx", OPTYPE_FPU, FL_RC_BIT_F}}, - {26, &Jit64::fp_arith_s}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &Jit64::fp_arith}, //"fmulx", OPTYPE_FPU, FL_RC_BIT_F}}, + {26, &Jit64::frsqrtex}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, {28, &Jit64::fmaddXX}, //"fmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, {29, &Jit64::fmaddXX}, //"fmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, {30, &Jit64::fmaddXX}, //"fnmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, @@ -394,9 +394,9 @@ void InitTables() return; //clear - for (int i = 0; i < 32; i++) + for (auto& tpl : dynaOpTable59) { - dynaOpTable59[i] = &Jit64::unknown_instruction; + tpl = &Jit64::unknown_instruction; } for (int i = 0; i < 1024; i++) @@ -404,81 +404,81 @@ void InitTables() dynaOpTable4 [i] = &Jit64::unknown_instruction; dynaOpTable19[i] = &Jit64::unknown_instruction; dynaOpTable31[i] = &Jit64::unknown_instruction; - dynaOpTable63[i] = &Jit64::unknown_instruction; + dynaOpTable63[i] = &Jit64::unknown_instruction; } - for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : primarytable) { - dynaOpTable[primarytable[i].opcode] = primarytable[i].Inst; + dynaOpTable[tpl.opcode] = tpl.Inst; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_2) { - int op = fill+table4_2[j].opcode; - dynaOpTable4[op] = table4_2[j].Inst; + int op = fill+tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } } for (int i = 0; i < 16; i++) { int fill = i << 6; - for (int j = 0; j < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_3) { - int op = fill+table4_3[j].opcode; - dynaOpTable4[op] = table4_3[j].Inst; + int op = fill+tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } } - for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table4) { - int op = table4[i].opcode; - dynaOpTable4[op] = table4[i].Inst; + int op = tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table31) { - int op = table31[i].opcode; - dynaOpTable31[op] = table31[i].Inst; + int op = tpl.opcode; + dynaOpTable31[op] = tpl.Inst; } for (int i = 0; i < 1; i++) { int fill = i << 9; - for (int j = 0; j < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table31_2) { - int op = fill + table31_2[j].opcode; - dynaOpTable31[op] = table31_2[j].Inst; + int op = fill + tpl.opcode; + dynaOpTable31[op] = tpl.Inst; } } - for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table19) { - int op = table19[i].opcode; - dynaOpTable19[op] = table19[i].Inst; + int op = tpl.opcode; + dynaOpTable19[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table59) { - int op = table59[i].opcode; - dynaOpTable59[op] = table59[i].Inst; + int op = tpl.opcode; + dynaOpTable59[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table63) { - int op = table63[i].opcode; - dynaOpTable63[op] = table63[i].Inst; + int op = tpl.opcode; + dynaOpTable63[op] = tpl.Inst; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table63_2) { - int op = fill + table63_2[j].opcode; - dynaOpTable63[op] = table63_2[j].Inst; + int op = fill + tpl.opcode; + dynaOpTable63[op] = tpl.Inst; } } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp index 7403ead883..56975ef6ea 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp @@ -2,21 +2,9 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "x64ABI.h" -#include "x64Emitter.h" - -#include "../../HW/Memmap.h" - -#include "../PowerPC.h" -#include "../../CoreTiming.h" #include "MemoryUtil.h" -#include "x64ABI.h" #include "Jit.h" -#include "../JitCommon/JitCache.h" - -#include "../../HW/GPFifo.h" -#include "../../Core.h" #include "JitAsm.h" using namespace Gen; @@ -25,9 +13,9 @@ using namespace Gen; //TODO - make an option //#if _DEBUG -static bool enableDebug = false; +static bool enableDebug = false; //#else -// bool enableDebug = false; +// bool enableDebug = false; //#endif //static bool enableStatistics = false; //unused? @@ -38,7 +26,7 @@ static bool enableDebug = false; //GLOBAL STATIC ALLOCATIONS x64 //EAX - ubiquitous scratch register - EVERYBODY scratches this //RBX - Base pointer of memory -//R15 - Pointer to array of block pointers +//R15 - Pointer to array of block pointers Jit64AsmRoutineManager asm_routines; @@ -60,7 +48,7 @@ void Jit64AsmRoutineManager::Generate() outerLoop = GetCodePtr(); ABI_CallFunction(reinterpret_cast(&CoreTiming::Advance)); FixupBranch skipToRealDispatch = J(); //skip the sync and compare first time - + dispatcher = GetCodePtr(); // The result of slice decrementation should be in flags if somebody jumped here // IMPORTANT - We jump on negative, not carry!!! @@ -85,41 +73,40 @@ void Jit64AsmRoutineManager::Generate() MOV(32, R(EAX), M(&PowerPC::ppcState.pc)); dispatcherPcInEAX = GetCodePtr(); -#ifdef JIT_UNLIMITED_ICACHE u32 mask = 0; FixupBranch no_mem; FixupBranch exit_mem; FixupBranch exit_vmem; if (Core::g_CoreStartupParameter.bWii) mask = JIT_ICACHE_EXRAM_BIT; - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) mask |= JIT_ICACHE_VMEM_BIT; - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { TEST(32, R(EAX), Imm32(mask)); no_mem = J_CC(CC_NZ); } AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCache)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCache)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { exit_mem = J(); SetJumpTarget(no_mem); } - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { TEST(32, R(EAX), Imm32(JIT_ICACHE_VMEM_BIT)); FixupBranch no_vmem = J_CC(CC_Z); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCacheVMEM)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheVMEM())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCacheVMEM)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif if (Core::g_CoreStartupParameter.bWii) exit_vmem = J(); @@ -131,30 +118,20 @@ void Jit64AsmRoutineManager::Generate() FixupBranch no_exram = J_CC(CC_Z); AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCacheEx)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheEx())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCacheEx)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif SetJumpTarget(no_exram); } - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) SetJumpTarget(exit_mem); - if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)) + if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)) SetJumpTarget(exit_vmem); -#else -#ifdef _M_IX86 - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(32, R(EBX), Imm32((u32)Memory::base)); - MOV(32, R(EAX), MComplex(EBX, EAX, SCALE_1, 0)); -#else - MOV(32, R(EAX), MComplex(RBX, RAX, SCALE_1, 0)); -#endif -#endif - TEST(32, R(EAX), Imm32(0xFC)); - FixupBranch notfound = J_CC(CC_NZ); - BSWAP(32, EAX); + TEST(32, R(EAX), R(EAX)); + FixupBranch notfound = J_CC(CC_L); //IDEA - we have 26 bits, why not just use offsets from base of code? if (enableDebug) { @@ -191,7 +168,7 @@ void Jit64AsmRoutineManager::Generate() MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExternalExceptions)); SetJumpTarget(noExtException); - + TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); J_CC(CC_Z, outerLoop, true); @@ -217,14 +194,14 @@ void Jit64AsmRoutineManager::GenerateCommon() GenFifoWrite(32); fifoDirectWriteFloat = AlignCode4(); GenFifoFloatWrite(); - fifoDirectWriteXmm64 = AlignCode4(); + fifoDirectWriteXmm64 = AlignCode4(); GenFifoXmm64Write(); GenQuantizedLoads(); GenQuantizedStores(); GenQuantizedSingleStores(); - //CMPSD(R(XMM0), M(&zero), + //CMPSD(R(XMM0), M(&zero), // TODO // Fast write routines - special case the most common hardware write diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h index 8835a07bcc..7dc55b475d 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.h @@ -17,7 +17,7 @@ // 3) Can optimize code at runtime for the specific CPU model. // There aren't really any disadvantages other than having to maintain a x86 emitter, // which we have to do anyway :) -// +// // To add a new asm routine, just add another const here, and add the code to Generate. // Also, possibly increase the size of the code buffer. diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp index 39c05f88e9..1be04a0d5d 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp @@ -2,9 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "../PPCAnalyst.h" #include "Jit.h" #include "JitAsm.h" #include "JitRegCache.h" @@ -37,7 +34,7 @@ void RegCache::Start(PPCAnalyst::BlockRegStats &stats) regs[i].location = GetDefaultLocation(i); regs[i].away = false; } - + // todo: sort to find the most popular regs /* int maxPreload = 2; @@ -76,21 +73,16 @@ void RegCache::LockX(int x1, int x2, int x3, int x4) if (x4 != 0xFF) xlocks[x4] = true; } -bool RegCache::IsFreeX(int xreg) const -{ - return xregs[xreg].free && !xlocks[xreg]; -} - void RegCache::UnlockAll() { - for (int i = 0; i < 32; i++) - locks[i] = false; + for (auto& lock : locks) + lock = false; } void RegCache::UnlockAllX() { - for (int i = 0; i < NUMXREGS; i++) - xlocks[i] = false; + for (auto& xlock : xlocks) + xlock = false; } X64Reg RegCache::GetFreeXReg() @@ -111,7 +103,7 @@ X64Reg RegCache::GetFreeXReg() for (int i = 0; i < aCount; i++) { X64Reg xr = (X64Reg)aOrder[i]; - if (xlocks[xr]) + if (xlocks[xr]) continue; int preg = xregs[xr].ppcReg; if (!locks[preg]) @@ -174,7 +166,7 @@ int RegCache::SanityCheck() const void RegCache::DiscardRegContentsIfCached(int preg) { - if (regs[preg].away && regs[preg].location.IsSimpleReg()) + if (IsBound(preg)) { X64Reg xr = regs[preg].location.GetSimpleReg(); xregs[xr].free = true; @@ -205,7 +197,7 @@ void FPURegCache::Start(PPCAnalyst::BlockRegStats &stats) const int *GPRRegCache::GetAllocationOrder(int &count) { - static const int allocationOrder[] = + static const int allocationOrder[] = { // R12, when used as base register, for example in a LEA, can generate bad code! Need to look into this. #ifdef _M_X64 @@ -224,7 +216,7 @@ const int *GPRRegCache::GetAllocationOrder(int &count) const int *FPURegCache::GetAllocationOrder(int &count) { - static const int allocationOrder[] = + static const int allocationOrder[] = { #ifdef _M_X64 XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5 @@ -359,11 +351,12 @@ void FPURegCache::StoreFromRegister(int i) { X64Reg xr = regs[i].location.GetSimpleReg(); _assert_msg_(DYNA_REC, xr < NUMXREGS, "WTF - store - invalid reg"); + OpArg newLoc = GetDefaultLocation(i); + if (xregs[xr].dirty) + emit->MOVAPD(newLoc, xr); xregs[xr].free = true; xregs[xr].dirty = false; xregs[xr].ppcReg = -1; - OpArg newLoc = GetDefaultLocation(i); - emit->MOVAPD(newLoc, xr); regs[i].location = newLoc; regs[i].away = false; } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h index 73df8c8672..f27dcae91c 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h +++ b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.h @@ -16,7 +16,7 @@ enum FlushMode enum GrabMode { M_READ = 1, - M_WRITE = 2, + M_WRITE = 2, M_READWRITE = 3, }; @@ -58,7 +58,7 @@ protected: X64CachedReg saved_xregs[NUMXREGS]; virtual const int *GetAllocationOrder(int &count) = 0; - + XEmitter *emit; public: @@ -70,7 +70,7 @@ public: void DiscardRegContentsIfCached(int preg); void SetEmitter(XEmitter *emitter) {emit = emitter;} - void FlushR(X64Reg reg); + void FlushR(X64Reg reg); void FlushR(X64Reg reg, X64Reg reg2) {FlushR(reg); FlushR(reg2);} void FlushLockX(X64Reg reg) { FlushR(reg); @@ -93,9 +93,9 @@ public: const OpArg &R(int preg) const {return regs[preg].location;} X64Reg RX(int preg) const { - if (regs[preg].away && regs[preg].location.IsSimpleReg()) - return regs[preg].location.GetSimpleReg(); - PanicAlert("Not so simple - %i", preg); + if (IsBound(preg)) + return regs[preg].location.GetSimpleReg(); + PanicAlert("Not so simple - %i", preg); return (X64Reg)-1; } virtual OpArg GetDefaultLocation(int reg) const = 0; @@ -106,7 +106,16 @@ public: void UnlockAll(); void UnlockAllX(); - bool IsFreeX(int xreg) const; + bool IsFreeX(int xreg) const + { + return xregs[xreg].free && !xlocks[xreg]; + } + + bool IsBound(int preg) const + { + return regs[preg].away && regs[preg].location.IsSimpleReg(); + } + X64Reg GetFreeXReg(); @@ -117,11 +126,11 @@ public: class GPRRegCache : public RegCache { public: - void Start(PPCAnalyst::BlockRegStats &stats); - void BindToRegister(int preg, bool doLoad = true, bool makeDirty = true); - void StoreFromRegister(int preg); - OpArg GetDefaultLocation(int reg) const; - const int *GetAllocationOrder(int &count); + void Start(PPCAnalyst::BlockRegStats &stats) override; + void BindToRegister(int preg, bool doLoad = true, bool makeDirty = true) override; + void StoreFromRegister(int preg) override; + OpArg GetDefaultLocation(int reg) const override; + const int *GetAllocationOrder(int &count) override; void SetImmediate32(int preg, u32 immValue); }; @@ -129,11 +138,11 @@ public: class FPURegCache : public RegCache { public: - void Start(PPCAnalyst::BlockRegStats &stats); - void BindToRegister(int preg, bool doLoad = true, bool makeDirty = true); - void StoreFromRegister(int preg); - const int *GetAllocationOrder(int &count); - OpArg GetDefaultLocation(int reg) const; + void Start(PPCAnalyst::BlockRegStats &stats) override; + void BindToRegister(int preg, bool doLoad = true, bool makeDirty = true) override; + void StoreFromRegister(int preg) override; + const int *GetAllocationOrder(int &count) override; + OpArg GetDefaultLocation(int reg) const override; }; #endif // _JIT64REGCACHE_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp index 762b6fe5d4..a1e28ac6ea 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Branch.cpp @@ -3,13 +3,6 @@ // Refer to the license.txt file included. #include "Common.h" -#include "Thunk.h" - -#include "../../Core.h" -#include "../PowerPC.h" -#include "../../CoreTiming.h" -#include "../PPCTables.h" -#include "x64Emitter.h" #include "Jit.h" #include "JitRegCache.h" @@ -19,19 +12,19 @@ // No need for a disable-mechanism. // If defined, clears CR0 at blr and bl-s. If the assumption that -// flags never carry over between functions holds, then the task for +// flags never carry over between functions holds, then the task for // an optimizer becomes much easier. // #define ACID_TEST -// Zelda and many more games seem to pass the Acid Test. +// Zelda and many more games seem to pass the Acid Test. using namespace Gen; void Jit64::sc(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(FLUSH_ALL); fpr.Flush(FLUSH_ALL); @@ -44,7 +37,7 @@ void Jit64::sc(UGeckoInstruction inst) void Jit64::rfi(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(FLUSH_ALL); fpr.Flush(FLUSH_ALL); @@ -64,7 +57,7 @@ void Jit64::rfi(UGeckoInstruction inst) void Jit64::bx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) // We must always process the following sentence // even if the blocks are merged by PPCAnalyst::Flatten(). @@ -98,7 +91,7 @@ void Jit64::bx(UGeckoInstruction inst) // make idle loops go faster js.downcountAmount += 8; } - WriteExit(destination, 0); + WriteExit(destination); } // TODO - optimize to hell and beyond @@ -107,7 +100,7 @@ void Jit64::bx(UGeckoInstruction inst) void Jit64::bcx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) // USES_CR _assert_msg_(DYNA_REC, js.isLastInstruction, "bcx not last instruction of block"); @@ -129,12 +122,12 @@ void Jit64::bcx(UGeckoInstruction inst) if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0) // Test a CR bit { TEST(8, M(&PowerPC::ppcState.cr_fast[inst.BI >> 2]), Imm8(8 >> (inst.BI & 3))); - if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch + if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch pConditionDontBranch = J_CC(CC_Z); else pConditionDontBranch = J_CC(CC_NZ); } - + if (inst.LK) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); @@ -143,19 +136,19 @@ void Jit64::bcx(UGeckoInstruction inst) destination = SignExt16(inst.BD << 2); else destination = js.compilerPC + SignExt16(inst.BD << 2); - WriteExit(destination, 0); + WriteExit(destination); if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0) SetJumpTarget( pConditionDontBranch ); if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0) SetJumpTarget( pCTRDontBranch ); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } void Jit64::bcctrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(FLUSH_ALL); fpr.Flush(FLUSH_ALL); @@ -187,7 +180,7 @@ void Jit64::bcctrx(UGeckoInstruction inst) if (inst.BO_2 & BO_BRANCH_IF_TRUE) branch = CC_Z; else - branch = CC_NZ; + branch = CC_NZ; FixupBranch b = J_CC(branch, false); MOV(32, R(EAX), M(&CTR)); AND(32, R(EAX), Imm32(0xFFFFFFFC)); @@ -197,14 +190,14 @@ void Jit64::bcctrx(UGeckoInstruction inst) WriteExitDestInEAX(); // Would really like to continue the block here, but it ends. TODO. SetJumpTarget(b); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } } void Jit64::bclrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) if (!js.isLastInstruction && (inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) { @@ -230,7 +223,7 @@ void Jit64::bclrx(UGeckoInstruction inst) if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0) // Test a CR bit { TEST(8, M(&PowerPC::ppcState.cr_fast[inst.BI >> 2]), Imm8(8 >> (inst.BI & 3))); - if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch + if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch pConditionDontBranch = J_CC(CC_Z); else pConditionDontBranch = J_CC(CC_NZ); @@ -242,7 +235,7 @@ void Jit64::bclrx(UGeckoInstruction inst) AND(32, M(&PowerPC::ppcState.cr), Imm32(~(0xFF000000))); #endif - MOV(32, R(EAX), M(&LR)); + MOV(32, R(EAX), M(&LR)); AND(32, R(EAX), Imm32(0xFFFFFFFC)); if (inst.LK) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); @@ -252,5 +245,5 @@ void Jit64::bclrx(UGeckoInstruction inst) SetJumpTarget( pConditionDontBranch ); if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0) SetJumpTarget( pCTRDontBranch ); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_FloatingPoint.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_FloatingPoint.cpp index 87fe51382d..7f77112ae9 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_FloatingPoint.cpp @@ -4,55 +4,71 @@ #include "Common.h" -#include "../../Core.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" - #include "Jit.h" #include "JitRegCache.h" #include "CPUDetect.h" -const u64 GC_ALIGNED16(psSignBits2[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; -const u64 GC_ALIGNED16(psAbsMask2[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; -const double GC_ALIGNED16(psOneOne2[2]) = {1.0, 1.0}; +static const u64 GC_ALIGNED16(psSignBits2[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; +static const u64 GC_ALIGNED16(psAbsMask2[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; +static const double GC_ALIGNED16(psOneOne2[2]) = {1.0, 1.0}; +static const double one_const = 1.0f; -void Jit64::fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (XEmitter::*op)(Gen::X64Reg, Gen::OpArg)) +void Jit64::fp_tri_op(int d, int a, int b, bool reversible, bool single, + void (XEmitter::*op_2)(Gen::X64Reg, Gen::OpArg), + void (XEmitter::*op_3)(Gen::X64Reg, Gen::X64Reg, Gen::OpArg)) { + if (!cpu_info.bAVX) + { + op_3 = nullptr; + } + fpr.Lock(d, a, b); if (d == a) { - fpr.BindToRegister(d, true); - (this->*op)(fpr.RX(d), fpr.R(b)); + fpr.BindToRegister(d); + (this->*op_2)(fpr.RX(d), fpr.R(b)); } - else if (d == b && reversible) + else if (d == b) { - fpr.BindToRegister(d, true); - (this->*op)(fpr.RX(d), fpr.R(a)); + if (reversible) + { + fpr.BindToRegister(d); + (this->*op_2)(fpr.RX(d), fpr.R(a)); + } + else + { + if (op_3) + { + fpr.BindToRegister(d); + fpr.BindToRegister(a, true, false); + (this->*op_3)(fpr.RX(d), fpr.RX(a), fpr.R(b)); + } + else + { + MOVSD(XMM0, fpr.R(b)); + fpr.BindToRegister(d, false); + MOVSD(fpr.RX(d), fpr.R(a)); + (this->*op_2)(fpr.RX(d), Gen::R(XMM0)); + } + } } - else if (a != d && b != d) + else { - // Sources different from d, can use rather quick solution - fpr.BindToRegister(d, !dupe); - MOVSD(fpr.RX(d), fpr.R(a)); - (this->*op)(fpr.RX(d), fpr.R(b)); + if (op_3) + { + fpr.BindToRegister(d, false); + fpr.BindToRegister(a); + (this->*op_3)(fpr.RX(d), fpr.RX(a), fpr.R(b)); + } + else + { + fpr.BindToRegister(d, false); + MOVSD(fpr.RX(d), fpr.R(a)); + (this->*op_2)(fpr.RX(d), fpr.R(b)); + } } - else if (b != d) - { - fpr.BindToRegister(d, !dupe); - MOVSD(XMM0, fpr.R(b)); - MOVSD(fpr.RX(d), fpr.R(a)); - (this->*op)(fpr.RX(d), Gen::R(XMM0)); - } - else // Other combo, must use two temps :( - { - MOVSD(XMM0, fpr.R(a)); - MOVSD(XMM1, fpr.R(b)); - fpr.BindToRegister(d, !dupe); - (this->*op)(XMM0, Gen::R(XMM1)); - MOVSD(fpr.RX(d), Gen::R(XMM0)); - } - if (dupe) + + if (single) { ForceSinglePrecisionS(fpr.RX(d)); if (cpu_info.bSSE3) @@ -69,62 +85,57 @@ void Jit64::fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (XEm fpr.UnlockAll(); } - -static const double one_const = 1.0f; - -void Jit64::fp_arith_s(UGeckoInstruction inst) +void Jit64::fp_arith(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc) { Default(inst); return; } - // Causing problems for GC - Starfox Assault (invisible boss at the end of level 1) - if (inst.SUBOP5 == 21) { - Default(inst); return; - } - - if (inst.SUBOP5 == 26) { - // frsqrtex - int d = inst.FD; - int b = inst.FB; - fpr.Lock(b, d); - fpr.BindToRegister(d, true, true); - MOVSD(XMM0, M((void *)&one_const)); - SQRTSD(XMM1, fpr.R(b)); - DIVSD(XMM0, R(XMM1)); - MOVSD(fpr.R(d), XMM0); - fpr.UnlockAll(); - return; - } - - if (inst.SUBOP5 != 18 && inst.SUBOP5 != 20 && inst.SUBOP5 != 21 && - inst.SUBOP5 != 25) { - Default(inst); return; - } - // Only the interpreter has "proper" support for (some) FP flags if (inst.SUBOP5 == 25 && Core::g_CoreStartupParameter.bEnableFPRF) { Default(inst); return; } - bool dupe = inst.OPCD == 59; + bool single = inst.OPCD == 59; switch (inst.SUBOP5) { - case 18: fp_tri_op(inst.FD, inst.FA, inst.FB, false, dupe, &XEmitter::DIVSD); break; //div - case 20: fp_tri_op(inst.FD, inst.FA, inst.FB, false, dupe, &XEmitter::SUBSD); break; //sub - case 21: fp_tri_op(inst.FD, inst.FA, inst.FB, true, dupe, &XEmitter::ADDSD); break; //add - case 25: fp_tri_op(inst.FD, inst.FA, inst.FC, true, dupe, &XEmitter::MULSD); break; //mul + case 18: fp_tri_op(inst.FD, inst.FA, inst.FB, false, single, &XEmitter::DIVSD, &XEmitter::VDIVSD); break; //div + case 20: fp_tri_op(inst.FD, inst.FA, inst.FB, false, single, &XEmitter::SUBSD, &XEmitter::VSUBSD); break; //sub + case 21: fp_tri_op(inst.FD, inst.FA, inst.FB, true, single, &XEmitter::ADDSD, &XEmitter::VADDSD); break; //add + case 25: fp_tri_op(inst.FD, inst.FA, inst.FC, true, single, &XEmitter::MULSD, &XEmitter::VMULSD); break; //mul default: - _assert_msg_(DYNA_REC, 0, "fp_arith_s WTF!!!"); + _assert_msg_(DYNA_REC, 0, "fp_arith WTF!!!"); } } +void Jit64::frsqrtex(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + int d = inst.FD; + int b = inst.FB; + fpr.Lock(b, d); + fpr.BindToRegister(d, d == b, true); + MOVSD(XMM0, M((void *)&one_const)); + SQRTSD(XMM1, fpr.R(b)); + if (cpu_info.bAVX) + { + VDIVSD(fpr.RX(d), XMM0, R(XMM1)); + } + else + { + DIVSD(XMM0, R(XMM1)); + MOVSD(fpr.R(d), XMM0); + } + fpr.UnlockAll(); +} + void Jit64::fmaddXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc) { Default(inst); return; } @@ -181,7 +192,7 @@ void Jit64::fmaddXX(UGeckoInstruction inst) void Jit64::fsign(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc) { Default(inst); return; } @@ -212,23 +223,35 @@ void Jit64::fsign(UGeckoInstruction inst) void Jit64::fmrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) - if (inst.Rc) { + JITDISABLE(bJITFloatingPointOff) + if (inst.Rc) + { Default(inst); return; } int d = inst.FD; int b = inst.FB; - fpr.Lock(b, d); - fpr.BindToRegister(d, true, true); - MOVSD(XMM0, fpr.R(b)); - MOVSD(fpr.R(d), XMM0); - fpr.UnlockAll(); + if (d != b) + { + fpr.Lock(b, d); + + // we don't need to load d, but if it already is, it must be marked as dirty + if (fpr.IsBound(d)) + { + fpr.BindToRegister(d); + } + fpr.BindToRegister(b, true, false); + + // caveat: the order of ModRM:r/m, ModRM:reg is deliberate! + // "MOVSD reg, mem" zeros out the upper half of the destination register + MOVSD(fpr.R(d), fpr.RX(b)); + fpr.UnlockAll(); + } } - + void Jit64::fcmpx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (jo.fpAccurateFcmp) { Default(inst); return; // turn off from debugger } @@ -279,12 +302,12 @@ void Jit64::fcmpx(UGeckoInstruction inst) SetJumpTarget(pGreater); MOV(8, M(&PowerPC::ppcState.cr_fast[crf]), Imm8(0x4)); continue3 = J(); - + // Less Than SetJumpTarget(pLesser); MOV(8, M(&PowerPC::ppcState.cr_fast[crf]), Imm8(0x8)); } - + SetJumpTarget(continue1); if (a != b) { diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp index 54fa742148..8299f2b044 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp @@ -2,11 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../../Core.h" // include "Common.h", "CoreParameter.h", SCoreStartupParameter -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" - #include "Jit.h" #include "JitRegCache.h" #include "JitAsm.h" @@ -236,7 +231,7 @@ void Jit64::regimmop(int d, int a, bool binary, u32 value, Operation doop, void void Jit64::reg_imm(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 d = inst.RD, a = inst.RA, s = inst.RS; switch (inst.OPCD) { @@ -287,10 +282,10 @@ void Jit64::reg_imm(UGeckoInstruction inst) regimmop(d, a, false, (u32)inst.SIMM_16 << 16, Add, &XEmitter::ADD); } break; - case 24: + case 24: if (a == 0 && s == 0 && inst.UIMM == 0 && !inst.Rc) //check for nop {NOP(); return;} //make the nop visible in the generated code. not much use but interesting if we see one. - regimmop(a, s, true, inst.UIMM, Or, &XEmitter::OR); + regimmop(a, s, true, inst.UIMM, Or, &XEmitter::OR); break; //ori case 25: regimmop(a, s, true, inst.UIMM << 16, Or, &XEmitter::OR, false); break;//oris case 28: regimmop(a, s, true, inst.UIMM, And, &XEmitter::AND, true); break; @@ -306,10 +301,10 @@ void Jit64::reg_imm(UGeckoInstruction inst) } void Jit64::cmpXX(UGeckoInstruction inst) -{ +{ // USES_CR INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int b = inst.RB; int crf = inst.CRFD; @@ -405,7 +400,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) destination = SignExt16(js.next_inst.BD << 2); else destination = js.next_compilerPC + SignExt16(js.next_inst.BD << 2); - WriteExit(destination, 0); + WriteExit(destination); } else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 528)) // bcctrx { @@ -413,14 +408,14 @@ void Jit64::cmpXX(UGeckoInstruction inst) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); MOV(32, R(EAX), M(&CTR)); AND(32, R(EAX), Imm32(0xFFFFFFFC)); - WriteExitDestInEAX(); + WriteExitDestInEAX(); } else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 16)) // bclrx { MOV(32, R(EAX), M(&LR)); if (js.next_inst.LK) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); - WriteExitDestInEAX(); + WriteExitDestInEAX(); } else { @@ -429,7 +424,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) } else { - WriteExit(js.next_compilerPC + 4, 0); + WriteExit(js.next_compilerPC + 4); } js.cancel = true; @@ -460,7 +455,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) if (!merge_branch) { // Keep the normal code separate for clarity. - + FixupBranch pLesser = J_CC(less_than); FixupBranch pGreater = J_CC(greater_than); MOV(8, M(&PowerPC::ppcState.cr_fast[crf]), Imm8(0x2)); // _x86Reg == 0 @@ -472,7 +467,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) MOV(8, M(&PowerPC::ppcState.cr_fast[crf]), Imm8(0x8)); // _x86Reg < 0 SetJumpTarget(continue1); SetJumpTarget(continue2); - // TODO: If we ever care about SO, borrow a trick from + // TODO: If we ever care about SO, borrow a trick from // http://maws.mameworld.info/maws/mamesrc/src/emu/cpu/powerpc/drc_ops.c : bt, adc } else @@ -480,7 +475,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) js.downcountAmount++; int test_bit = 8 >> (js.next_inst.BI & 3); bool condition = (js.next_inst.BO & BO_BRANCH_IF_TRUE) ? false : true; - + // Test swapping (in the future, will be used to inline across branches the right way) // if (rand() & 1) // std::swap(destination1, destination2), condition = !condition; @@ -512,7 +507,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) destination = SignExt16(js.next_inst.BD << 2); else destination = js.next_compilerPC + SignExt16(js.next_inst.BD << 2); - WriteExit(destination, 0); + WriteExit(destination); } else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 528)) // bcctrx { @@ -520,7 +515,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); MOV(32, R(EAX), M(&CTR)); AND(32, R(EAX), Imm32(0xFFFFFFFC)); - WriteExitDestInEAX(); + WriteExitDestInEAX(); } else if ((js.next_inst.OPCD == 19) && (js.next_inst.SUBOP10 == 16)) // bclrx { @@ -528,7 +523,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) AND(32, R(EAX), Imm32(0xFFFFFFFC)); if (js.next_inst.LK) MOV(32, M(&LR), Imm32(js.compilerPC + 4)); - WriteExitDestInEAX(); + WriteExitDestInEAX(); } else { @@ -539,7 +534,7 @@ void Jit64::cmpXX(UGeckoInstruction inst) if (!!(4 & test_bit) == condition) SetJumpTarget(continue2); if (!!(2 & test_bit) == condition) SetJumpTarget(continue1); - WriteExit(js.next_compilerPC + 4, 1); + WriteExit(js.next_compilerPC + 4); js.cancel = true; } @@ -551,10 +546,10 @@ void Jit64::cmpXX(UGeckoInstruction inst) void Jit64::boolX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, s = inst.RS, b = inst.RB; _dbg_assert_msg_(DYNA_REC, inst.OPCD == 31, "Invalid boolX"); - + if (gpr.R(s).IsImm() && gpr.R(b).IsImm()) { if (inst.SUBOP10 == 28) /* andx */ @@ -627,7 +622,7 @@ void Jit64::boolX(UGeckoInstruction inst) gpr.Lock(a,((a == s) ? b : s)); OpArg operand = ((a == s) ? gpr.R(b) : gpr.R(s)); gpr.BindToRegister(a, true, true); - + if (inst.SUBOP10 == 28) /* andx */ { AND(32, gpr.R(a), operand); @@ -725,7 +720,7 @@ void Jit64::boolX(UGeckoInstruction inst) { gpr.Lock(a,s,b); gpr.BindToRegister(a, false, true); - + if (inst.SUBOP10 == 28) /* andx */ { MOV(32, gpr.R(a), gpr.R(s)); @@ -814,7 +809,7 @@ void Jit64::boolX(UGeckoInstruction inst) void Jit64::extsbx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, s = inst.RS; if (gpr.R(s).IsImm()) @@ -842,7 +837,7 @@ void Jit64::extsbx(UGeckoInstruction inst) void Jit64::extshx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, s = inst.RS; if (gpr.R(s).IsImm()) @@ -870,7 +865,7 @@ void Jit64::extshx(UGeckoInstruction inst) void Jit64::subfic(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; gpr.Lock(a, d); gpr.BindToRegister(d, a == d, true); @@ -918,10 +913,10 @@ void Jit64::subfic(UGeckoInstruction inst) // This instruction has no RC flag } -void Jit64::subfcx(UGeckoInstruction inst) +void Jit64::subfcx(UGeckoInstruction inst) { INSTRUCTION_START; - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; gpr.Lock(a, b, d); gpr.BindToRegister(d, (d == a || d == b), true); @@ -950,16 +945,16 @@ void Jit64::subfcx(UGeckoInstruction inst) gpr.UnlockAll(); } -void Jit64::subfex(UGeckoInstruction inst) +void Jit64::subfex(UGeckoInstruction inst) { INSTRUCTION_START; - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; gpr.Lock(a, b, d); gpr.BindToRegister(d, (d == a || d == b), true); GetCarryEAXAndClear(); - + bool invertedCarry = false; if (d == b) { @@ -991,7 +986,7 @@ void Jit64::subfmex(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; gpr.Lock(a, d); gpr.BindToRegister(d, d == a); @@ -1015,12 +1010,12 @@ void Jit64::subfzex(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; - + gpr.Lock(a, d); gpr.BindToRegister(d, d == a); - + GetCarryEAXAndClear(); if (d != a) { @@ -1040,7 +1035,7 @@ void Jit64::subfzex(UGeckoInstruction inst) void Jit64::subfx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) @@ -1090,7 +1085,7 @@ void Jit64::subfx(UGeckoInstruction inst) void Jit64::mulli(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; u32 imm = inst.SIMM_16; @@ -1137,7 +1132,7 @@ void Jit64::mulli(UGeckoInstruction inst) void Jit64::mullwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) @@ -1213,7 +1208,7 @@ void Jit64::mullwx(UGeckoInstruction inst) void Jit64::mulhwux(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) @@ -1244,7 +1239,7 @@ void Jit64::mulhwux(UGeckoInstruction inst) void Jit64::divwux(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) @@ -1297,7 +1292,7 @@ void Jit64::divwux(UGeckoInstruction inst) u64 magic_dividend = 0x100000000ULL << shift; u32 magic = (u32)(magic_dividend / divisor); u32 max_quotient = magic >> shift; - + // Test for failure in round-up method if (((u64)(magic+1) * (max_quotient*divisor-1)) >> (shift + 32) != max_quotient-1) { @@ -1401,7 +1396,7 @@ void Jit64::divwux(UGeckoInstruction inst) void Jit64::divwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) @@ -1475,9 +1470,9 @@ void Jit64::divwx(UGeckoInstruction inst) void Jit64::addx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; - + if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) { s32 i = (s32)gpr.R(a).offset, j = (s32)gpr.R(b).offset; @@ -1518,7 +1513,7 @@ void Jit64::addx(UGeckoInstruction inst) { gpr.Lock(a, b, d); gpr.BindToRegister(d, false); - MOV(32, gpr.R(d), gpr.R(a)); + MOV(32, gpr.R(d), gpr.R(a)); ADD(32, gpr.R(d), gpr.R(b)); if (inst.Rc) { @@ -1536,14 +1531,14 @@ void Jit64::addex(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; - + if ((d == a) || (d == b)) { gpr.Lock(a, b, d); gpr.BindToRegister(d, true); - + GetCarryEAXAndClear(); ADC(32, gpr.R(d), gpr.R((d == a) ? b : a)); if (inst.Rc) @@ -1557,7 +1552,7 @@ void Jit64::addex(UGeckoInstruction inst) { gpr.Lock(a, b, d); gpr.BindToRegister(d, false); - + GetCarryEAXAndClear(); MOV(32, gpr.R(d), gpr.R(a)); ADC(32, gpr.R(d), gpr.R(b)); @@ -1573,9 +1568,9 @@ void Jit64::addex(UGeckoInstruction inst) void Jit64::addcx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, d = inst.RD; - + if ((d == a) || (d == b)) { int operand = ((d == a) ? b : a); @@ -1595,7 +1590,7 @@ void Jit64::addcx(UGeckoInstruction inst) gpr.Lock(a, b, d); gpr.BindToRegister(d, false); JitClearCAOV(inst.OE); - MOV(32, gpr.R(d), gpr.R(a)); + MOV(32, gpr.R(d), gpr.R(a)); ADD(32, gpr.R(d), gpr.R(b)); if (inst.Rc) { @@ -1610,14 +1605,14 @@ void Jit64::addmex(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; - + if (d == a) { gpr.Lock(d); gpr.BindToRegister(d, true); - + GetCarryEAXAndClear(); ADC(32, gpr.R(d), Imm32(0xFFFFFFFF)); if (inst.Rc) @@ -1631,7 +1626,7 @@ void Jit64::addmex(UGeckoInstruction inst) { gpr.Lock(a, d); gpr.BindToRegister(d, false); - + GetCarryEAXAndClear(); MOV(32, gpr.R(d), gpr.R(a)); ADC(32, gpr.R(d), Imm32(0xFFFFFFFF)); @@ -1648,14 +1643,14 @@ void Jit64::addzex(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, d = inst.RD; - + if (d == a) { gpr.Lock(d); gpr.BindToRegister(d, true); - + GetCarryEAXAndClear(); ADC(32, gpr.R(d), Imm8(0)); if (inst.Rc) @@ -1669,7 +1664,7 @@ void Jit64::addzex(UGeckoInstruction inst) { gpr.Lock(a, d); gpr.BindToRegister(d, false); - + GetCarryEAXAndClear(); MOV(32, gpr.R(d), gpr.R(a)); ADC(32, gpr.R(d), Imm8(0)); @@ -1685,7 +1680,7 @@ void Jit64::addzex(UGeckoInstruction inst) void Jit64::rlwinmx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int s = inst.RS; if (gpr.R(s).IsImm()) @@ -1731,7 +1726,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst) { ROL(32, gpr.R(a), Imm8(inst.SH)); } - if (!(inst.MB==0 && inst.ME==31)) + if (!(inst.MB==0 && inst.ME==31)) { AND(32, gpr.R(a), Imm32(Helper_Mask(inst.MB, inst.ME))); if (inst.Rc) @@ -1752,7 +1747,7 @@ void Jit64::rlwinmx(UGeckoInstruction inst) void Jit64::rlwimix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int s = inst.RS; @@ -1838,7 +1833,7 @@ void Jit64::rlwimix(UGeckoInstruction inst) void Jit64::rlwnmx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA, b = inst.RB, s = inst.RS; u32 mask = Helper_Mask(inst.MB, inst.ME); @@ -1874,7 +1869,7 @@ void Jit64::rlwnmx(UGeckoInstruction inst) void Jit64::negx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int d = inst.RD; @@ -1912,7 +1907,7 @@ void Jit64::negx(UGeckoInstruction inst) void Jit64::srwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int b = inst.RB; int s = inst.RS; @@ -1964,7 +1959,7 @@ void Jit64::srwx(UGeckoInstruction inst) void Jit64::slwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int b = inst.RB; int s = inst.RS; @@ -1973,7 +1968,7 @@ void Jit64::slwx(UGeckoInstruction inst) { u32 amount = (u32)gpr.R(b).offset; gpr.SetImmediate32(a, (amount & 0x20) ? 0 : (u32)gpr.R(s).offset << amount); - if (inst.Rc) + if (inst.Rc) { ComputeRC(gpr.R(a)); } @@ -1990,7 +1985,7 @@ void Jit64::slwx(UGeckoInstruction inst) MOV(32, gpr.R(a), gpr.R(s)); } SHL(64, gpr.R(a), R(ECX)); - if (inst.Rc) + if (inst.Rc) { AND(32, gpr.R(a), gpr.R(a)); GenerateRC(); @@ -2018,7 +2013,7 @@ void Jit64::slwx(UGeckoInstruction inst) gpr.UnlockAll(); gpr.UnlockAllX(); // Shift of 0 doesn't update flags, so compare manually just in case - if (inst.Rc) + if (inst.Rc) { ComputeRC(gpr.R(a)); } @@ -2030,7 +2025,7 @@ void Jit64::srawx(UGeckoInstruction inst) { // USES_XER INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int b = inst.RB; int s = inst.RS; @@ -2087,7 +2082,7 @@ void Jit64::srawx(UGeckoInstruction inst) void Jit64::srawix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int s = inst.RS; int amount = inst.SH; @@ -2134,16 +2129,16 @@ void Jit64::srawix(UGeckoInstruction inst) void Jit64::cntlzwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int s = inst.RS; - + if (gpr.R(s).IsImm()) { u32 mask = 0x80000000; u32 i = 0; for (; i < 32; i++, mask >>= 1) - if ((u32)gpr.R(s).offset & mask) + if ((u32)gpr.R(s).offset & mask) break; gpr.SetImmediate32(a, i); } @@ -2170,7 +2165,7 @@ void Jit64::cntlzwx(UGeckoInstruction inst) void Jit64::twx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) s32 a = inst.RA; @@ -2220,11 +2215,11 @@ void Jit64::twx(UGeckoInstruction inst) LOCK(); OR(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_PROGRAM)); WriteExceptionExit(); - + SetJumpTarget(exit1); SetJumpTarget(exit2); SetJumpTarget(exit3); SetJumpTarget(exit4); SetJumpTarget(exit5); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp index 53ab412070..1b41c2f1e9 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp @@ -6,16 +6,6 @@ // Should give a very noticable speed boost to paired single heavy code. #include "Common.h" -#include "Thunk.h" - -#include "../PowerPC.h" -#include "../../Core.h" -#include "../../ConfigManager.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "x64ABI.h" #include "Jit.h" #include "JitAsm.h" @@ -24,7 +14,7 @@ void Jit64::lXXx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) int a = inst.RA, b = inst.RB, d = inst.RD; @@ -46,25 +36,25 @@ void Jit64::lXXx(UGeckoInstruction inst) accessSize = 32; signExtend = false; break; - + case 34: /* lbz */ case 35: /* lbzu */ accessSize = 8; signExtend = false; break; - + case 40: /* lhz */ case 41: /* lhzu */ accessSize = 16; signExtend = false; break; - + case 42: /* lha */ case 43: /* lhau */ accessSize = 16; signExtend = true; break; - + case 31: switch (inst.SUBOP10) { @@ -73,7 +63,7 @@ void Jit64::lXXx(UGeckoInstruction inst) accessSize = 32; signExtend = false; break; - + case 87: /* lbzx */ case 119: /* lbzux */ accessSize = 8; @@ -84,57 +74,56 @@ void Jit64::lXXx(UGeckoInstruction inst) accessSize = 16; signExtend = false; break; - + case 343: /* lhax */ case 375: /* lhaux */ accessSize = 16; signExtend = true; break; - + default: PanicAlert("Invalid instruction"); } break; - + default: PanicAlert("Invalid instruction"); } // TODO(ector): Make it dynamically enable/disable idle skipping where appropriate // Will give nice boost to dual core mode - // (mb2): I agree, + // (mb2): I agree, // IMHO those Idles should always be skipped and replaced by a more controllable "native" Idle methode // ... maybe the throttle one already do that :p // if (CommandProcessor::AllowIdleSkipping() && PixelEngine::AllowIdleSkipping()) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle && - inst.OPCD == 32 && + inst.OPCD == 32 && (inst.hex & 0xFFFF0000) == 0x800D0000 && (Memory::ReadUnchecked_U32(js.compilerPC + 4) == 0x28000000 || (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC + 4) == 0x2C000000)) && Memory::ReadUnchecked_U32(js.compilerPC + 8) == 0x4182fff8) { - // TODO(LinesPrower): + // TODO(LinesPrower): // - Rewrite this! // It seems to be ugly and inefficient, but I don't know JIT stuff enough to make it right // It only demonstrates the idea // do our job at first s32 offset = (s32)(s16)inst.SIMM_16; - gpr.Lock(d); - SafeLoadToEAX(gpr.R(a), accessSize, offset, signExtend); - gpr.KillImmediate(d, false, true); - MOV(32, gpr.R(d), R(EAX)); - gpr.UnlockAll(); - - gpr.Flush(FLUSH_ALL); - fpr.Flush(FLUSH_ALL); + gpr.BindToRegister(d, false, true); + SafeLoadToReg(gpr.RX(d), gpr.R(a), accessSize, offset, RegistersInUse(), signExtend); // if it's still 0, we can wait until the next event - TEST(32, R(EAX), R(EAX)); + TEST(32, gpr.R(d), gpr.R(d)); FixupBranch noIdle = J_CC(CC_NZ); - + + u32 registersInUse = RegistersInUse(); + ABI_PushRegistersAndAdjustStack(registersInUse, false); + ABI_CallFunctionC((void *)&PowerPC::OnIdle, PowerPC::ppcState.gpr[a] + (s32)(s16)inst.SIMM_16); + ABI_PopRegistersAndAdjustStack(registersInUse, false); + // ! we must continue executing of the loop after exception handling, maybe there is still 0 in r0 //MOV(32, M(&PowerPC::ppcState.pc), Imm32(js.compilerPC)); WriteExceptionExit(); @@ -144,14 +133,16 @@ void Jit64::lXXx(UGeckoInstruction inst) //js.compilerPC += 8; return; } - + // Determine whether this instruction updates inst.RA bool update; if (inst.OPCD == 31) update = ((inst.SUBOP10 & 0x20) != 0); else update = ((inst.OPCD & 1) != 0); - + + bool zeroOffset = inst.OPCD != 31 && inst.SIMM_16 == 0; + // Prepare address operand Gen::OpArg opAddress; if (!update && !a) @@ -172,51 +163,53 @@ void Jit64::lXXx(UGeckoInstruction inst) } else { - if ((inst.OPCD != 31) && gpr.R(a).IsImm()) + if ((inst.OPCD != 31) && gpr.R(a).IsImm() && !js.memcheck) { - opAddress = Imm32((u32)gpr.R(a).offset + (s32)inst.SIMM_16); + u32 val = (u32)gpr.R(a).offset + (s32)inst.SIMM_16; + opAddress = Imm32(val); + if (update && !js.memcheck) + gpr.SetImmediate32(a, val); } - else if ((inst.OPCD == 31) && gpr.R(a).IsImm() && gpr.R(b).IsImm()) + else if ((inst.OPCD == 31) && gpr.R(a).IsImm() && gpr.R(b).IsImm() && !js.memcheck) { - opAddress = Imm32((u32)gpr.R(a).offset + (u32)gpr.R(b).offset); + u32 val = (u32)gpr.R(a).offset + (u32)gpr.R(b).offset; + opAddress = Imm32(val); + if (update && !js.memcheck) + gpr.SetImmediate32(a, val); } else { - gpr.FlushLockX(ABI_PARAM1); - opAddress = R(ABI_PARAM1); - MOV(32, opAddress, gpr.R(a)); - + if ((update && !js.memcheck) || zeroOffset) + { + gpr.BindToRegister(a, true, update); + opAddress = gpr.R(a); + } + else + { + gpr.FlushLockX(ABI_PARAM1); + opAddress = R(ABI_PARAM1); + MOV(32, opAddress, gpr.R(a)); + } + if (inst.OPCD == 31) ADD(32, opAddress, gpr.R(b)); - else + else if (inst.SIMM_16 != 0) ADD(32, opAddress, Imm32((u32)(s32)inst.SIMM_16)); } } - SafeLoadToEAX(opAddress, accessSize, 0, signExtend); + gpr.Lock(a, b, d); + gpr.BindToRegister(d, js.memcheck, true); + SafeLoadToReg(gpr.RX(d), opAddress, accessSize, 0, RegistersInUse(), signExtend); - // We must flush immediate values from the following registers because - // they may change at runtime if no MMU exception has been raised - gpr.KillImmediate(d, true, true); - if (update) + if (update && js.memcheck && !zeroOffset) { - gpr.Lock(a); gpr.BindToRegister(a, true, true); + MEMCHECK_START + MOV(32, gpr.R(a), opAddress); + MEMCHECK_END } - - MEMCHECK_START - if (update) - { - if (inst.OPCD == 31) - ADD(32, gpr.R(a), gpr.R(b)); - else - ADD(32, gpr.R(a), Imm32((u32)(s32)inst.SIMM_16)); - } - MOV(32, gpr.R(d), R(EAX)); - - MEMCHECK_END - gpr.UnlockAll(); gpr.UnlockAllX(); } @@ -224,7 +217,7 @@ void Jit64::lXXx(UGeckoInstruction inst) void Jit64::dcbst(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) // If the dcbst instruction is preceded by dcbt, it is flushing a prefetched // memory location. Do not invalidate the JIT cache in this case as the memory @@ -240,7 +233,7 @@ void Jit64::dcbst(UGeckoInstruction inst) void Jit64::dcbz(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) Default(inst); return; @@ -262,7 +255,7 @@ void Jit64::dcbz(UGeckoInstruction inst) void Jit64::stX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) int s = inst.RS; int a = inst.RA; @@ -270,7 +263,7 @@ void Jit64::stX(UGeckoInstruction inst) bool update = inst.OPCD & 1; s32 offset = (s32)(s16)inst.SIMM_16; - if (a || !update) + if (a || !update) { int accessSize; switch (inst.OPCD & ~1) @@ -295,7 +288,7 @@ void Jit64::stX(UGeckoInstruction inst) if (update) gpr.SetImmediate32(a, addr); switch (accessSize) - { + { // No need to protect these, they don't touch any state // question - should we inline them instead? Pro: Lose a CALL Con: Code bloat case 8: CALL((void *)asm_routines.fifoDirectWrite8); break; @@ -318,18 +311,21 @@ void Jit64::stX(UGeckoInstruction inst) else { MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write + u32 registersInUse = RegistersInUse(); + ABI_PushRegistersAndAdjustStack(registersInUse, false); switch (accessSize) { - case 32: ABI_CallFunctionAC(thunks.ProtectFunction(true ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), gpr.R(s), addr); break; - case 16: ABI_CallFunctionAC(thunks.ProtectFunction(true ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), 2), gpr.R(s), addr); break; - case 8: ABI_CallFunctionAC(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), gpr.R(s), addr); break; + case 32: ABI_CallFunctionAC(true ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), gpr.R(s), addr); break; + case 16: ABI_CallFunctionAC(true ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), gpr.R(s), addr); break; + case 8: ABI_CallFunctionAC((void *)&Memory::Write_U8, gpr.R(s), addr); break; } + ABI_PopRegistersAndAdjustStack(registersInUse, false); if (update) gpr.SetImmediate32(a, addr); return; } } - + // Optimized stack access? if (accessSize == 32 && !gpr.R(a).IsImm() && a == 1 && js.st.isFirstBlockOfFunction && jo.optimizeStack) { @@ -337,7 +333,7 @@ void Jit64::stX(UGeckoInstruction inst) MOV(32, R(ABI_PARAM1), gpr.R(a)); MOV(32, R(EAX), gpr.R(s)); BSWAP(32, EAX); -#ifdef _M_X64 +#ifdef _M_X64 MOV(accessSize, MComplex(RBX, ABI_PARAM1, SCALE_1, (u32)offset), R(EAX)); #else AND(32, R(ABI_PARAM1), Imm32(Memory::MEMVIEW32_MASK)); @@ -373,13 +369,13 @@ void Jit64::stX(UGeckoInstruction inst) gpr.Lock(s, a); MOV(32, R(EDX), gpr.R(a)); MOV(32, R(ECX), gpr.R(s)); - SafeWriteRegToReg(ECX, EDX, accessSize, offset); + SafeWriteRegToReg(ECX, EDX, accessSize, offset, RegistersInUse()); if (update && offset) { gpr.KillImmediate(a, true, true); MEMCHECK_START - + ADD(32, gpr.R(a), Imm32((u32)offset)); MEMCHECK_END @@ -397,7 +393,7 @@ void Jit64::stX(UGeckoInstruction inst) void Jit64::stXx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) int a = inst.RA, b = inst.RB, s = inst.RS; if (!a || a == s || a == b) @@ -424,12 +420,12 @@ void Jit64::stXx(UGeckoInstruction inst) case 151: accessSize = 32; break; case 407: accessSize = 16; break; case 215: accessSize = 8; break; - default: PanicAlert("stXx: invalid access size"); + default: PanicAlert("stXx: invalid access size"); accessSize = 0; break; } MOV(32, R(ECX), gpr.R(s)); - SafeWriteRegToReg(ECX, EDX, accessSize, 0); + SafeWriteRegToReg(ECX, EDX, accessSize, 0, RegistersInUse()); gpr.UnlockAll(); gpr.UnlockAllX(); @@ -439,7 +435,7 @@ void Jit64::stXx(UGeckoInstruction inst) void Jit64::lmw(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) #ifdef _M_X64 gpr.FlushLockX(ECX); @@ -462,7 +458,7 @@ void Jit64::lmw(UGeckoInstruction inst) void Jit64::stmw(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) #ifdef _M_X64 gpr.FlushLockX(ECX); @@ -484,5 +480,5 @@ void Jit64::stmw(UGeckoInstruction inst) void Jit64::icbi(UGeckoInstruction inst) { Default(inst); - WriteExit(js.compilerPC + 4, 0); + WriteExit(js.compilerPC + 4); } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp index 04085cb34a..bc056e6bd1 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp @@ -6,15 +6,7 @@ // Should give a very noticeable speed boost to paired single heavy code. #include "Common.h" - -#include "../PowerPC.h" -#include "../../Core.h" // include "Common.h", "CoreParameter.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" #include "CPUDetect.h" -#include "x64Emitter.h" -#include "x64ABI.h" #include "Jit.h" #include "JitAsm.h" @@ -39,24 +31,21 @@ u32 GC_ALIGNED16(temp32); void Jit64::lfs(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) int d = inst.RD; int a = inst.RA; - if (!a) + if (!a) { Default(inst); return; } s32 offset = (s32)(s16)inst.SIMM_16; -#if defined(_WIN32) && defined(_M_X64) - UnsafeLoadToEAX(gpr.R(a), 32, offset, false); -#else - SafeLoadToEAX(gpr.R(a), 32, offset, false); -#endif + + SafeLoadToReg(EAX, gpr.R(a), 32, offset, RegistersInUse(), false); MEMCHECK_START - + MOV(32, M(&temp32), R(EAX)); fpr.Lock(d); fpr.BindToRegister(d, false); @@ -72,13 +61,13 @@ void Jit64::lfs(UGeckoInstruction inst) void Jit64::lfd(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } int d = inst.RD; int a = inst.RA; - if (!a) + if (!a) { Default(inst); return; @@ -119,7 +108,7 @@ void Jit64::lfd(UGeckoInstruction inst) MOV(32, M((void*)((u8 *)&temp64+4)), R(EAX)); MEMCHECK_START - + MOV(32, R(EAX), MDisp(ABI_PARAM1, (u32)Memory::base + offset + 4)); BSWAP(32, EAX); MOV(32, M(&temp64), R(EAX)); @@ -150,7 +139,7 @@ void Jit64::lfd(UGeckoInstruction inst) void Jit64::stfd(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } @@ -164,7 +153,7 @@ void Jit64::stfd(UGeckoInstruction inst) u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS; if (Core::g_CoreStartupParameter.bMMU || - Core::g_CoreStartupParameter.iTLBHack) { + Core::g_CoreStartupParameter.bTLBHack) { mem_mask |= Memory::ADDR_MASK_MEM1; } #ifdef ENABLE_MEM_CHECK @@ -210,12 +199,12 @@ void Jit64::stfd(UGeckoInstruction inst) MOVAPD(XMM0, fpr.R(s)); PSRLQ(XMM0, 32); MOVD_xmm(R(EAX), XMM0); - SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0); + SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0, RegistersInUse() | (1 << (16 + XMM0))); MOVAPD(XMM0, fpr.R(s)); MOVD_xmm(R(EAX), XMM0); LEA(32, ABI_PARAM1, MDisp(gpr.R(a).GetSimpleReg(), offset)); - SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 4); + SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 4, RegistersInUse()); SetJumpTarget(exit); @@ -224,7 +213,7 @@ void Jit64::stfd(UGeckoInstruction inst) fpr.UnlockAll(); } -// In Release on 32bit build, +// In Release on 32bit build, // this seemed to cause a problem with PokePark2 // at start after talking to first pokemon, // you run and smash a box, then he goes on about @@ -235,7 +224,7 @@ void Jit64::stfd(UGeckoInstruction inst) void Jit64::stfs(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) bool update = inst.OPCD & 1; int s = inst.RS; @@ -287,7 +276,7 @@ void Jit64::stfs(UGeckoInstruction inst) MEMCHECK_END } CVTSD2SS(XMM0, fpr.R(s)); - SafeWriteFloatToReg(XMM0, ABI_PARAM2); + SafeWriteFloatToReg(XMM0, ABI_PARAM2, RegistersInUse()); gpr.UnlockAll(); gpr.UnlockAllX(); fpr.UnlockAll(); @@ -297,7 +286,7 @@ void Jit64::stfs(UGeckoInstruction inst) void Jit64::stfsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) // We can take a shortcut here - it's not likely that a hardware access would use this instruction. gpr.FlushLockX(ABI_PARAM1); @@ -307,7 +296,7 @@ void Jit64::stfsx(UGeckoInstruction inst) ADD(32, R(ABI_PARAM1), gpr.R(inst.RA)); CVTSD2SS(XMM0, fpr.R(inst.RS)); MOVD_xmm(R(EAX), XMM0); - SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0); + SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0, RegistersInUse()); gpr.UnlockAllX(); fpr.UnlockAll(); @@ -317,7 +306,7 @@ void Jit64::stfsx(UGeckoInstruction inst) void Jit64::lfsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) MOV(32, R(EAX), gpr.R(inst.RB)); if (inst.RA) @@ -335,14 +324,14 @@ void Jit64::lfsx(UGeckoInstruction inst) MOVD_xmm(r, MComplex(RBX, EAX, SCALE_1, 0)); #endif MEMCHECK_START - + PSHUFB(r, M((void *)bswapShuffle1x4)); CVTSS2SD(r, R(r)); MOVDDUP(r, R(r)); MEMCHECK_END } else { - SafeLoadToEAX(R(EAX), 32, 0, false); + SafeLoadToReg(EAX, R(EAX), 32, 0, RegistersInUse(), false); MEMCHECK_START diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp index e89f414150..a2cb0784d1 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStorePaired.cpp @@ -6,16 +6,7 @@ // Should give a very noticeable speed boost to paired single heavy code. #include "Common.h" - -#include "Thunk.h" -#include "../PowerPC.h" -#include "../../Core.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" #include "CPUDetect.h" -#include "x64Emitter.h" -#include "x64ABI.h" #include "Jit.h" #include "JitAsm.h" @@ -24,7 +15,7 @@ const u8 GC_ALIGNED16(pbswapShuffle2x4[16]) = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11, 12, 13, 14, 15}; //static u64 GC_ALIGNED16(temp64); // unused? - + // TODO(ector): Improve 64-bit version #if 0 static void WriteDual32(u64 value, u32 address) @@ -40,7 +31,7 @@ static void WriteDual32(u64 value, u32 address) void Jit64::psq_st(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStorePaired) + JITDISABLE(bJITLoadStorePairedOff) if (js.memcheck) { Default(inst); return; } @@ -106,15 +97,11 @@ void Jit64::psq_st(UGeckoInstruction inst) // One value XORPS(XMM0, R(XMM0)); // TODO: See if we can get rid of this cheaply by tweaking the code in the singleStore* functions. CVTSD2SS(XMM0, fpr.R(s)); - ABI_AlignStack(0); CALLptr(MScaled(EDX, addr_scale, (u32)(u64)asm_routines.singleStoreQuantized)); - ABI_RestoreStack(0); } else { // Pair of values CVTPD2PS(XMM0, fpr.R(s)); - ABI_AlignStack(0); CALLptr(MScaled(EDX, addr_scale, (u32)(u64)asm_routines.pairedStoreQuantized)); - ABI_RestoreStack(0); } gpr.UnlockAll(); gpr.UnlockAllX(); @@ -123,7 +110,7 @@ void Jit64::psq_st(UGeckoInstruction inst) void Jit64::psq_l(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStorePaired) + JITDISABLE(bJITLoadStorePairedOff) if (js.memcheck) { Default(inst); return; } @@ -135,12 +122,6 @@ void Jit64::psq_l(UGeckoInstruction inst) const UGQR gqr(rSPR(SPR_GQR0 + inst.I)); - if (inst.W) { - // PanicAlert("Single ps load: %i %i", gqr.ST_TYPE, gqr.ST_SCALE); - Default(inst); - return; - } - bool update = inst.OPCD == 57; int offset = inst.SIMM_12; @@ -156,6 +137,8 @@ void Jit64::psq_l(UGeckoInstruction inst) MOV(32, gpr.R(inst.RA), R(ECX)); MOVZX(32, 16, EAX, M(((char *)&GQR(inst.I)) + 2)); MOVZX(32, 8, EDX, R(AL)); + if (inst.W) + OR(32, R(EDX), Imm8(8)); #ifdef _M_IX86 int addr_scale = SCALE_4; #else diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Paired.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Paired.cpp index b028c77298..781b75a538 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Paired.cpp @@ -4,12 +4,6 @@ #include "Common.h" -#include "../../Core.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "../../HW/GPFifo.h" - #include "Jit.h" #include "JitRegCache.h" @@ -17,19 +11,17 @@ // ps_madds0 // ps_muls0 // ps_madds1 -// ps_sel // cmppd, andpd, andnpd, or // lfsx, ps_merge01 etc -const u64 GC_ALIGNED16(psSignBits[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; -const u64 GC_ALIGNED16(psAbsMask[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; -const double GC_ALIGNED16(psOneOne[2]) = {1.0, 1.0}; -const double GC_ALIGNED16(psZeroZero[2]) = {0.0, 0.0}; +static const u64 GC_ALIGNED16(psSignBits[2]) = {0x8000000000000000ULL, 0x8000000000000000ULL}; +static const u64 GC_ALIGNED16(psAbsMask[2]) = {0x7FFFFFFFFFFFFFFFULL, 0x7FFFFFFFFFFFFFFFULL}; +static const double GC_ALIGNED16(psOneOne[2]) = {1.0, 1.0}; void Jit64::ps_mr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -43,40 +35,38 @@ void Jit64::ps_mr(UGeckoInstruction inst) void Jit64::ps_sel(UGeckoInstruction inst) { - INSTRUCTION_START - JITDISABLE(Paired) + // we can't use (V)BLENDVPD here because it just looks at the sign bit + // but we need -0 = +0 - Default(inst); return; + INSTRUCTION_START + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } - // GRR can't get this to work 100%. Getting artifacts in D.O.N. intro. int d = inst.FD; int a = inst.FA; int b = inst.FB; int c = inst.FC; - fpr.FlushLockX(XMM7); - fpr.FlushLockX(XMM6); + fpr.Lock(a, b, c, d); - fpr.BindToRegister(a, true, false); - fpr.BindToRegister(d, false, true); - // BLENDPD would have been nice... - MOVAPD(XMM7, fpr.R(a)); - CMPPD(XMM7, M((void*)psZeroZero), 1); //less-than = 111111 - MOVAPD(XMM6, R(XMM7)); - ANDPD(XMM7, fpr.R(d)); - ANDNPD(XMM6, fpr.R(c)); - MOVAPD(fpr.RX(d), R(XMM7)); - ORPD(fpr.RX(d), R(XMM6)); + MOVAPD(XMM0, fpr.R(a)); + XORPD(XMM1, R(XMM1)); + // XMM0 = XMM0 < 0 ? all 1s : all 0s + CMPPD(XMM0, R(XMM1), LT); + MOVAPD(XMM1, R(XMM0)); + ANDPD(XMM0, fpr.R(b)); + ANDNPD(XMM1, fpr.R(c)); + ORPD(XMM0, R(XMM1)); + fpr.BindToRegister(d, false); + MOVAPD(fpr.RX(d), R(XMM0)); fpr.UnlockAll(); - fpr.UnlockAllX(); } void Jit64::ps_sign(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -96,7 +86,7 @@ void Jit64::ps_sign(UGeckoInstruction inst) switch (inst.SUBOP10) { - case 40: //neg + case 40: //neg XORPD(fpr.RX(d), M((void*)&psSignBits)); break; case 136: //nabs @@ -110,20 +100,33 @@ void Jit64::ps_sign(UGeckoInstruction inst) fpr.UnlockAll(); } -void Jit64::ps_rsqrte(UGeckoInstruction inst) +// ps_res and ps_rsqrte +void Jit64::ps_recip(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } + OpArg divisor; int d = inst.FD; int b = inst.FB; fpr.Lock(d, b); - fpr.BindToRegister(d, (d == b), true); - SQRTPD(XMM0, fpr.R(b)); + fpr.BindToRegister(d, (d == b)); + switch (inst.SUBOP5) + { + case 24: + // ps_res + divisor = fpr.R(b); + break; + case 26: + // ps_rsqrte + SQRTPD(XMM0, fpr.R(b)); + divisor = R(XMM0); + break; + } MOVAPD(XMM1, M((void*)&psOneOne)); - DIVPD(XMM1, R(XMM0)); + DIVPD(XMM1, divisor); MOVAPD(fpr.R(d), XMM1); fpr.UnlockAll(); } @@ -152,51 +155,44 @@ void Jit64::tri_op(int d, int a, int b, bool reversible, void (XEmitter::*op)(X6 fpr.BindToRegister(d, true); (this->*op)(fpr.RX(d), fpr.R(b)); } - else if (d == b && reversible) + else if (d == b) { - fpr.BindToRegister(d, true); - (this->*op)(fpr.RX(d), fpr.R(a)); + if (reversible) + { + fpr.BindToRegister(d, true); + (this->*op)(fpr.RX(d), fpr.R(a)); + } + else + { + MOVAPD(XMM0, fpr.R(b)); + fpr.BindToRegister(d, false); + MOVAPD(fpr.RX(d), fpr.R(a)); + (this->*op)(fpr.RX(d), Gen::R(XMM0)); + } } - else if (a != d && b != d) + else { //sources different from d, can use rather quick solution fpr.BindToRegister(d, false); MOVAPD(fpr.RX(d), fpr.R(a)); (this->*op)(fpr.RX(d), fpr.R(b)); } - else if (b != d) - { - fpr.BindToRegister(d, false); - MOVAPD(XMM0, fpr.R(b)); - MOVAPD(fpr.RX(d), fpr.R(a)); - (this->*op)(fpr.RX(d), Gen::R(XMM0)); - } - else //Other combo, must use two temps :( - { - MOVAPD(XMM0, fpr.R(a)); - MOVAPD(XMM1, fpr.R(b)); - fpr.BindToRegister(d, false); - (this->*op)(XMM0, Gen::R(XMM1)); - MOVAPD(fpr.RX(d), Gen::R(XMM0)); - } ForceSinglePrecisionP(fpr.RX(d)); fpr.UnlockAll(); } void Jit64::ps_arith(UGeckoInstruction inst) -{ +{ INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } switch (inst.SUBOP5) { case 18: tri_op(inst.FD, inst.FA, inst.FB, false, &XEmitter::DIVPD); break; //div - case 20: tri_op(inst.FD, inst.FA, inst.FB, false, &XEmitter::SUBPD); break; //sub + case 20: tri_op(inst.FD, inst.FA, inst.FB, false, &XEmitter::SUBPD); break; //sub case 21: tri_op(inst.FD, inst.FA, inst.FB, true, &XEmitter::ADDPD); break; //add - case 23: Default(inst); break; //sel - case 24: Default(inst); break; //res case 25: tri_op(inst.FD, inst.FA, inst.FC, true, &XEmitter::MULPD); break; //mul default: _assert_msg_(DYNA_REC, 0, "ps_arith WTF!!!"); @@ -204,10 +200,10 @@ void Jit64::ps_arith(UGeckoInstruction inst) } void Jit64::ps_sum(UGeckoInstruction inst) -{ +{ INSTRUCTION_START - JITDISABLE(Paired) - // TODO: (inst.SUBOP5 == 10) breaks Sonic Colours (black screen) + JITDISABLE(bJITPairedOff) + // TODO: (inst.SUBOP5 == 10) breaks Sonic Colours (black screen) if (inst.Rc || (inst.SUBOP5 == 10)) { Default(inst); return; } @@ -233,7 +229,7 @@ void Jit64::ps_sum(UGeckoInstruction inst) MOVAPD(XMM1, fpr.R(b)); SHUFPD(XMM1, R(XMM1), 5); // copy higher to lower ADDPD(XMM0, R(XMM1)); // sum lowers - MOVAPD(XMM1, fpr.R(c)); + MOVAPD(XMM1, fpr.R(c)); UNPCKLPD(XMM1, R(XMM0)); // merge MOVAPD(fpr.R(d), XMM1); break; @@ -248,7 +244,7 @@ void Jit64::ps_sum(UGeckoInstruction inst) void Jit64::ps_muls(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -287,7 +283,7 @@ void Jit64::ps_muls(UGeckoInstruction inst) void Jit64::ps_mergeXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -299,7 +295,7 @@ void Jit64::ps_mergeXX(UGeckoInstruction inst) MOVAPD(XMM0, fpr.R(a)); switch (inst.SUBOP10) { - case 528: + case 528: UNPCKLPD(XMM0, fpr.R(b)); //unpck is faster than shuf break; //00 case 560: @@ -324,7 +320,7 @@ void Jit64::ps_mergeXX(UGeckoInstruction inst) void Jit64::ps_maddXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp index 9475be947b..8282758a74 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_SystemRegisters.cpp @@ -4,28 +4,34 @@ #include "Common.h" -#include "../../Core.h" -#include "../../CoreTiming.h" #include "../../HW/SystemTimers.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "x64ABI.h" -#include "Thunk.h" +#include "HW/ProcessorInterface.h" #include "Jit.h" #include "JitRegCache.h" -#include "HW/ProcessorInterface.h" void Jit64::mtspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); int d = inst.RD; switch (iIndex) { + + case SPR_DMAU: + + case SPR_SPRG0: + case SPR_SPRG1: + case SPR_SPRG2: + case SPR_SPRG3: + + case SPR_SRR0: + case SPR_SRR1: + // These are safe to do the easy way, see the bottom of this function. + break; + case SPR_LR: case SPR_CTR: case SPR_XER: @@ -72,7 +78,7 @@ void Jit64::mtspr(UGeckoInstruction inst) void Jit64::mfspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); int d = inst.RD; switch (iIndex) @@ -100,7 +106,7 @@ void Jit64::mtmsr(UGeckoInstruction inst) { INSTRUCTION_START // Don't interpret this, if we do we get thrown out - //JITDISABLE(SystemRegisters) + //JITDISABLE(bJITSystemRegistersOff) if (!gpr.R(inst.RS).IsImm()) { gpr.Lock(inst.RS); @@ -131,7 +137,7 @@ void Jit64::mtmsr(UGeckoInstruction inst) SetJumpTarget(noExceptionsPending); SetJumpTarget(eeDisabled); - WriteExit(js.compilerPC + 4, 0); + WriteExit(js.compilerPC + 4); js.firstFPInstructionFound = false; } @@ -139,7 +145,7 @@ void Jit64::mtmsr(UGeckoInstruction inst) void Jit64::mfmsr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) //Privileged? gpr.Lock(inst.RD); gpr.BindToRegister(inst.RD, false, true); @@ -150,14 +156,14 @@ void Jit64::mfmsr(UGeckoInstruction inst) void Jit64::mftb(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) mfspr(inst); } void Jit64::mfcr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) // USES_CR int d = inst.RD; gpr.Lock(d); @@ -177,7 +183,7 @@ void Jit64::mfcr(UGeckoInstruction inst) void Jit64::mtcrf(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) // USES_CR u32 crm = inst.CRM; @@ -216,7 +222,7 @@ void Jit64::mtcrf(UGeckoInstruction inst) void Jit64::mcrf(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) // USES_CR if (inst.CRFS != inst.CRFD) @@ -229,7 +235,7 @@ void Jit64::mcrf(UGeckoInstruction inst) void Jit64::mcrxr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) // USES_CR @@ -245,10 +251,10 @@ void Jit64::mcrxr(UGeckoInstruction inst) void Jit64::crXXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) _dbg_assert_msg_(DYNA_REC, inst.OPCD == 19, "Invalid crXXX"); - // USES_CR + // USES_CR // Get bit CRBA in EAX aligned with bit CRBD int shiftA = (inst.CRBD & 3) - (inst.CRBA & 3); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp index 78bf1db57c..ef1db98de1 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/IR_X86.cpp @@ -24,23 +24,11 @@ The register allocation is linear scan allocation. #pragma warning(disable:4146) // unary minus operator applied to unsigned type, result still unsigned #endif -#include "IR.h" -#include "../PPCTables.h" -#include "../../CoreTiming.h" -#include "Thunk.h" -#include "../../HW/Memmap.h" -#include "JitILAsm.h" #include "JitIL.h" -#include "../../HW/GPFifo.h" -#include "../../ConfigManager.h" -#include "x64Emitter.h" #include "../../../../Common/Src/CPUDetect.h" #include "MathUtil.h" -#include "../../Core.h" #include "HW/ProcessorInterface.h" -static ThunkManager thunks; - using namespace IREmitter; using namespace Gen; @@ -56,9 +44,6 @@ struct RegInfo { InstLoc fregs[MAX_NUMBER_OF_REGS]; unsigned numSpills; unsigned numFSpills; - bool MakeProfile; - bool UseProfile; - unsigned numProfiledLoads; unsigned exitNumber; RegInfo(JitIL* j, InstLoc f, unsigned insts) : Jit(j), FirstI(f), IInfo(insts), lastUsed(insts) { @@ -68,15 +53,30 @@ struct RegInfo { } numSpills = 0; numFSpills = 0; - numProfiledLoads = 0; exitNumber = 0; - MakeProfile = UseProfile = false; } private: RegInfo(RegInfo&); // DO NOT IMPLEMENT }; +static u32 regsInUse(RegInfo& R) { +#ifdef _M_X64 + u32 result = 0; + for (unsigned i = 0; i < MAX_NUMBER_OF_REGS; i++) + { + if (R.regs[i] != 0) + result |= (1 << i); + if (R.fregs[i] != 0) + result |= (1 << (16 + i)); + } + return result; +#else + // not needed + return 0; +#endif +} + static void regMarkUse(RegInfo& R, InstLoc I, InstLoc Op, unsigned OpNum) { unsigned& info = R.IInfo[Op - R.FirstI]; if (info == 0) R.IInfo[I - R.FirstI] |= 1 << (OpNum + 1); @@ -89,7 +89,6 @@ static unsigned regReadUse(RegInfo& R, InstLoc I) { } static unsigned SlotSet[1000]; -static unsigned ProfiledLoads[1000]; static u8 GC_ALIGNED16(FSlotSet[16*1000]); static OpArg regLocForSlot(RegInfo& RI, unsigned slot) { @@ -164,9 +163,9 @@ static const int FRegAllocSize = sizeof(FRegAllocOrder) / sizeof(X64Reg); #endif static X64Reg regFindFreeReg(RegInfo& RI) { - for (int i = 0; i < RegAllocSize; i++) - if (RI.regs[RegAllocOrder[i]] == 0) - return RegAllocOrder[i]; + for (auto& reg : RegAllocOrder) + if (RI.regs[reg] == 0) + return reg; int bestIndex = -1; InstLoc bestEnd = 0; @@ -185,9 +184,9 @@ static X64Reg regFindFreeReg(RegInfo& RI) { } static X64Reg fregFindFreeReg(RegInfo& RI) { - for (int i = 0; i < FRegAllocSize; i++) - if (RI.fregs[FRegAllocOrder[i]] == 0) - return FRegAllocOrder[i]; + for (auto& reg : FRegAllocOrder) + if (RI.fregs[reg] == 0) + return reg; int bestIndex = -1; InstLoc bestEnd = 0; @@ -206,9 +205,9 @@ static X64Reg fregFindFreeReg(RegInfo& RI) { } static OpArg regLocForInst(RegInfo& RI, InstLoc I) { - for (int i = 0; i < RegAllocSize; i++) - if (RI.regs[RegAllocOrder[i]] == I) - return R(RegAllocOrder[i]); + for (auto& reg : RegAllocOrder) + if (RI.regs[reg] == I) + return R(reg); if (regGetSpill(RI, I) == 0) PanicAlert("Retrieving unknown spill slot?!"); @@ -216,9 +215,9 @@ static OpArg regLocForInst(RegInfo& RI, InstLoc I) { } static OpArg fregLocForInst(RegInfo& RI, InstLoc I) { - for (int i = 0; i < FRegAllocSize; i++) - if (RI.fregs[FRegAllocOrder[i]] == I) - return R(FRegAllocOrder[i]); + for (auto& reg : FRegAllocOrder) + if (RI.fregs[reg] == I) + return R(reg); if (fregGetSpill(RI, I) == 0) PanicAlert("Retrieving unknown spill slot?!"); @@ -226,15 +225,15 @@ static OpArg fregLocForInst(RegInfo& RI, InstLoc I) { } static void regClearInst(RegInfo& RI, InstLoc I) { - for (int i = 0; i < RegAllocSize; i++) - if (RI.regs[RegAllocOrder[i]] == I) - RI.regs[RegAllocOrder[i]] = 0; + for (auto& reg : RegAllocOrder) + if (RI.regs[reg] == I) + RI.regs[reg] = 0; } static void fregClearInst(RegInfo& RI, InstLoc I) { - for (int i = 0; i < FRegAllocSize; i++) - if (RI.fregs[FRegAllocOrder[i]] == I) - RI.fregs[FRegAllocOrder[i]] = 0; + for (auto& reg : FRegAllocOrder) + if (RI.fregs[reg] == I) + RI.fregs[reg] = 0; } static X64Reg regEnsureInReg(RegInfo& RI, InstLoc I) { @@ -267,7 +266,7 @@ static void regSpillCallerSaved(RegInfo& RI) { // 64-bit regSpill(RI, RCX); regSpill(RI, RDX); - regSpill(RI, RSI); + regSpill(RI, RSI); regSpill(RI, RDI); regSpill(RI, R8); regSpill(RI, R9); @@ -412,7 +411,7 @@ static void fregEmitBinInst(RegInfo& RI, InstLoc I, // Could be extended to unprofiled addresses. static void regMarkMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, unsigned OpNum) { if (isImm(*AI)) { - unsigned addr = RI.Build->GetImmValue(AI); + unsigned addr = RI.Build->GetImmValue(AI); if (Memory::IsRAMAddress(addr)) return; } @@ -423,47 +422,15 @@ static void regMarkMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, unsigned OpNum regMarkUse(RI, I, AI, OpNum); } -static void regClearDeadMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, unsigned OpNum) { - if (!(RI.IInfo[I - RI.FirstI] & (2 << OpNum))) - return; - if (isImm(*AI)) { - unsigned addr = RI.Build->GetImmValue(AI); - if (Memory::IsRAMAddress(addr)) { - return; - } - } - InstLoc AddrBase; - if (getOpcode(*AI) == Add && isImm(*getOp2(AI))) { - AddrBase = getOp1(AI); - } else { - AddrBase = AI; - } - regClearInst(RI, AddrBase); -} - // in 64-bit build, this returns a completely bizarre address sometimes! -static OpArg regBuildMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, - unsigned OpNum, unsigned Size, X64Reg* dest, - bool Profiled, - unsigned ProfileOffset = 0) { +static std::pair regBuildMemAddress(RegInfo& RI, InstLoc I, + InstLoc AI, unsigned OpNum, unsigned Size, X64Reg* dest) { if (isImm(*AI)) { - unsigned addr = RI.Build->GetImmValue(AI); + unsigned addr = RI.Build->GetImmValue(AI); if (Memory::IsRAMAddress(addr)) { if (dest) *dest = regFindFreeReg(RI); -#ifdef _M_IX86 - // 32-bit - if (Profiled) - return M((void*)((u8*)Memory::base + (addr & Memory::MEMVIEW32_MASK))); - return M((void*)addr); -#else - // 64-bit - if (Profiled) { - RI.Jit->LEA(32, EAX, M((void*)(u64)addr)); - return MComplex(RBX, EAX, SCALE_1, 0); - } - return M((void*)(u64)addr); -#endif + return std::make_pair(Imm32(addr), 0); } } unsigned offset; @@ -496,86 +463,18 @@ static OpArg regBuildMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, baseReg = regEnsureInReg(RI, AddrBase); } - if (Profiled) { - // (Profiled mode isn't the default, at least for the moment) -#ifdef _M_IX86 - return MDisp(baseReg, (u32)Memory::base + offset + ProfileOffset); -#else - RI.Jit->LEA(32, EAX, MDisp(baseReg, offset)); - return MComplex(RBX, EAX, SCALE_1, 0); -#endif - } - return MDisp(baseReg, offset); + return std::make_pair(R(baseReg), offset); } static void regEmitMemLoad(RegInfo& RI, InstLoc I, unsigned Size) { - if (RI.UseProfile) { - unsigned curLoad = ProfiledLoads[RI.numProfiledLoads++]; - if (!(curLoad & 0x0C000000)) { - X64Reg reg; - OpArg addr = regBuildMemAddress(RI, I, getOp1(I), 1, - Size, ®, true, - -(curLoad & 0xC0000000)); - RI.Jit->MOVZX(32, Size, reg, addr); - RI.Jit->BSWAP(Size, reg); - if (regReadUse(RI, I)) - RI.regs[reg] = I; - return; - } - } X64Reg reg; - OpArg addr = regBuildMemAddress(RI, I, getOp1(I), 1, Size, ®, false); - RI.Jit->LEA(32, ECX, addr); - if (RI.MakeProfile) { - RI.Jit->MOV(32, M(&ProfiledLoads[RI.numProfiledLoads++]), R(ECX)); - } - u32 mem_mask = 0; + auto info = regBuildMemAddress(RI, I, getOp1(I), 1, Size, ®); - if (SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU || SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack) - mem_mask = 0x20000000; - - RI.Jit->TEST(32, R(ECX), Imm32(0x0C000000 | mem_mask)); - FixupBranch argh = RI.Jit->J_CC(CC_Z); - - // Slow safe read using Memory::Read_Ux routines -#ifdef _M_IX86 // we don't allocate EAX on x64 so no reason to save it. - if (reg != EAX) { - RI.Jit->PUSH(32, R(EAX)); - } -#endif - switch (Size) - { - case 32: RI.Jit->ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U32, 1), ECX); break; - case 16: RI.Jit->ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U16_ZX, 1), ECX); break; - case 8: RI.Jit->ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U8_ZX, 1), ECX); break; - } - if (reg != EAX) { - RI.Jit->MOV(32, R(reg), R(EAX)); -#ifdef _M_IX86 - RI.Jit->POP(32, R(EAX)); -#endif - } - FixupBranch arg2 = RI.Jit->J(); - RI.Jit->SetJumpTarget(argh); - RI.Jit->UnsafeLoadRegToReg(ECX, reg, Size, 0, false); - RI.Jit->SetJumpTarget(arg2); + RI.Jit->SafeLoadToReg(reg, info.first, Size, info.second, regsInUse(RI), false, EmuCodeBlock::SAFE_LOADSTORE_NO_FASTMEM); if (regReadUse(RI, I)) RI.regs[reg] = I; } -static OpArg regSwappedImmForConst(RegInfo& RI, InstLoc I, unsigned Size) { - unsigned imm = RI.Build->GetImmValue(I); - if (Size == 32) { - imm = Common::swap32(imm); - return Imm32(imm); - } else if (Size == 16) { - imm = Common::swap16(imm); - return Imm16(imm); - } else { - return Imm8(imm); - } -} - static OpArg regImmForConst(RegInfo& RI, InstLoc I, unsigned Size) { unsigned imm = RI.Build->GetImmValue(I); if (Size == 32) { @@ -588,53 +487,18 @@ static OpArg regImmForConst(RegInfo& RI, InstLoc I, unsigned Size) { } static void regEmitMemStore(RegInfo& RI, InstLoc I, unsigned Size) { - if (RI.UseProfile) { - unsigned curStore = ProfiledLoads[RI.numProfiledLoads++]; - if (!(curStore & 0x0C000000)) { - OpArg addr = regBuildMemAddress(RI, I, getOp2(I), 2, - Size, 0, true, - -(curStore & 0xC0000000)); - if (isImm(*getOp1(I))) { - RI.Jit->MOV(Size, addr, regSwappedImmForConst(RI, getOp1(I), Size)); - } else { - RI.Jit->MOV(32, R(ECX), regLocForInst(RI, getOp1(I))); - RI.Jit->BSWAP(Size, ECX); - RI.Jit->MOV(Size, addr, R(ECX)); - } - if (RI.IInfo[I - RI.FirstI] & 4) - regClearInst(RI, getOp1(I)); - return; - } else if ((curStore & 0xFFFFF000) == 0xCC008000) { - regSpill(RI, EAX); - if (isImm(*getOp1(I))) { - RI.Jit->MOV(Size, R(ECX), regSwappedImmForConst(RI, getOp1(I), Size)); - } else { - RI.Jit->MOV(32, R(ECX), regLocForInst(RI, getOp1(I))); - RI.Jit->BSWAP(Size, ECX); - } - RI.Jit->MOV(32, R(EAX), M(&GPFifo::m_gatherPipeCount)); - RI.Jit->MOV(Size, MDisp(EAX, (u32)(u64)GPFifo::m_gatherPipe), R(ECX)); - RI.Jit->ADD(32, R(EAX), Imm8(Size >> 3)); - RI.Jit->MOV(32, M(&GPFifo::m_gatherPipeCount), R(EAX)); - RI.Jit->js.fifoBytesThisBlock += Size >> 3; - if (RI.IInfo[I - RI.FirstI] & 4) - regClearInst(RI, getOp1(I)); - regClearDeadMemAddress(RI, I, getOp2(I), 2); - return; - } - } - OpArg addr = regBuildMemAddress(RI, I, getOp2(I), 2, Size, 0, false); - RI.Jit->LEA(32, ECX, addr); + auto info = regBuildMemAddress(RI, I, getOp2(I), 2, Size, 0); + if (info.first.IsImm()) + RI.Jit->MOV(32, R(ECX), info.first); + else + RI.Jit->LEA(32, ECX, MDisp(info.first.GetSimpleReg(), info.second)); regSpill(RI, EAX); if (isImm(*getOp1(I))) { RI.Jit->MOV(Size, R(EAX), regImmForConst(RI, getOp1(I), Size)); } else { RI.Jit->MOV(32, R(EAX), regLocForInst(RI, getOp1(I))); } - if (RI.MakeProfile) { - RI.Jit->MOV(32, M(&ProfiledLoads[RI.numProfiledLoads++]), R(ECX)); - } - RI.Jit->SafeWriteRegToReg(EAX, ECX, Size, 0); + RI.Jit->SafeWriteRegToReg(EAX, ECX, Size, 0, regsInUse(RI), EmuCodeBlock::SAFE_LOADSTORE_NO_FASTMEM); if (RI.IInfo[I - RI.FirstI] & 4) regClearInst(RI, getOp1(I)); } @@ -687,20 +551,9 @@ static void regEmitICmpInst(RegInfo& RI, InstLoc I, CCFlags flag) { } static void regWriteExit(RegInfo& RI, InstLoc dest) { - if (RI.MakeProfile) { - if (isImm(*dest)) { - RI.Jit->MOV(32, M(&PC), Imm32(RI.Build->GetImmValue(dest))); - } else { - RI.Jit->MOV(32, R(EAX), regLocForInst(RI, dest)); - RI.Jit->MOV(32, M(&PC), R(EAX)); - } - RI.Jit->Cleanup(); - RI.Jit->SUB(32, M(&CoreTiming::downcount), Imm32(RI.Jit->js.downcountAmount)); - RI.Jit->JMP(((JitIL *)jit)->asm_routines.doReJit, true); - return; - } if (isImm(*dest)) { - RI.Jit->WriteExit(RI.Build->GetImmValue(dest), RI.exitNumber++); + RI.exitNumber++; + RI.Jit->WriteExit(RI.Build->GetImmValue(dest)); } else { RI.Jit->WriteExitDestInOpArg(regLocForInst(RI, dest)); } @@ -712,12 +565,10 @@ static bool checkIsSNAN() { return MathUtil::IsSNAN(isSNANTemp[0][0]) || MathUtil::IsSNAN(isSNANTemp[1][0]); } -static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool MakeProfile) { +static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, u32 exitAddress) { //printf("Writing block: %x\n", js.blockStart); RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts()); RI.Build = ibuild; - RI.UseProfile = UseProfile; - RI.MakeProfile = MakeProfile; // Pass to compute liveness ibuild->StartBackPass(); for (unsigned int index = (unsigned int)RI.IInfo.size() - 1; index != -1U; --index) { @@ -744,7 +595,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak case InterpreterFallback: case SystemCall: case RFIExit: - case InterpreterBranch: + case InterpreterBranch: case ShortIdleLoop: case FPExceptionCheck: case DSIExceptionCheck: @@ -863,7 +714,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak break; case IdleBranch: regMarkUse(RI, I, getOp1(getOp1(I)), 1); - break; + break; case BranchCond: { if (isICmp(*getOp1(I)) && isImm(*getOp2(getOp1(I)))) { @@ -1278,7 +1129,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak if (!thisUsed) break; X64Reg reg = fregFindFreeReg(RI); if (cpu_info.bSSSE3) { - static const u32 GC_ALIGNED16(maskSwapa64_1[4]) = + static const u32 GC_ALIGNED16(maskSwapa64_1[4]) = {0x04050607L, 0x00010203L, 0xFFFFFFFFL, 0xFFFFFFFFL}; #ifdef _M_X64 // TODO: Remove regEnsureInReg() and use ECX @@ -1322,9 +1173,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak int addr_scale = SCALE_8; #endif Jit->MOV(32, R(ECX), regLocForInst(RI, getOp1(I))); - Jit->ABI_AlignStack(0); Jit->CALLptr(MScaled(EDX, addr_scale, (u32)(u64)(((JitIL *)jit)->asm_routines.pairedLoadQuantized))); - Jit->ABI_RestoreStack(0); Jit->MOVAPD(reg, R(XMM0)); RI.fregs[reg] = I; regNormalRegClear(RI, I); @@ -1339,7 +1188,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->MOV(32, R(EAX), loc1); } Jit->MOV(32, R(ECX), regLocForInst(RI, getOp2(I))); - RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 0); + RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 0, regsInUse(RI), EmuCodeBlock::SAFE_LOADSTORE_NO_FASTMEM); if (RI.IInfo[I - RI.FirstI] & 4) fregClearInst(RI, getOp1(I)); if (RI.IInfo[I - RI.FirstI] & 8) @@ -1352,7 +1201,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak // if SafeWriteRegToReg() is modified. u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS; if (Core::g_CoreStartupParameter.bMMU || - Core::g_CoreStartupParameter.iTLBHack) { + Core::g_CoreStartupParameter.bTLBHack) { mem_mask |= Memory::ADDR_MASK_MEM1; } #ifdef ENABLE_MEM_CHECK @@ -1365,7 +1214,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak FixupBranch safe = Jit->J_CC(CC_NZ); // Fast routine if (cpu_info.bSSSE3) { - static const u32 GC_ALIGNED16(maskSwapa64_1[4]) = + static const u32 GC_ALIGNED16(maskSwapa64_1[4]) = {0x04050607L, 0x00010203L, 0xFFFFFFFFL, 0xFFFFFFFFL}; X64Reg value = fregBinLHSRegWithMov(RI, I); @@ -1402,12 +1251,12 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->PSRLQ(XMM0, 32); Jit->MOVD_xmm(R(EAX), XMM0); Jit->MOV(32, R(ECX), address); - RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 0); + RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 0, regsInUse(RI), EmuCodeBlock::SAFE_LOADSTORE_NO_FASTMEM); Jit->MOVAPD(XMM0, value); Jit->MOVD_xmm(R(EAX), XMM0); Jit->MOV(32, R(ECX), address); - RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 4); + RI.Jit->SafeWriteRegToReg(EAX, ECX, 32, 4, regsInUse(RI), EmuCodeBlock::SAFE_LOADSTORE_NO_FASTMEM); Jit->SetJumpTarget(exit); if (RI.IInfo[I - RI.FirstI] & 4) @@ -1429,9 +1278,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak #endif Jit->MOV(32, R(ECX), regLocForInst(RI, getOp2(I))); Jit->MOVAPD(XMM0, fregLocForInst(RI, getOp1(I))); - Jit->ABI_AlignStack(0); Jit->CALLptr(MScaled(EDX, addr_scale, (u32)(u64)(((JitIL *)jit)->asm_routines.pairedStoreQuantized))); - Jit->ABI_RestoreStack(0); if (RI.IInfo[I - RI.FirstI] & 4) fregClearInst(RI, getOp1(I)); if (RI.IInfo[I - RI.FirstI] & 8) @@ -1488,7 +1335,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak case FSNeg: { if (!thisUsed) break; X64Reg reg = fregURegWithMov(RI, I); - static const u32 GC_ALIGNED16(ssSignBits[4]) = + static const u32 GC_ALIGNED16(ssSignBits[4]) = {0x80000000}; Jit->PXOR(reg, M((void*)&ssSignBits)); RI.fregs[reg] = I; @@ -1498,7 +1345,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak case FDNeg: { if (!thisUsed) break; X64Reg reg = fregURegWithMov(RI, I); - static const u64 GC_ALIGNED16(ssSignBits[2]) = + static const u64 GC_ALIGNED16(ssSignBits[2]) = {0x8000000000000000ULL}; Jit->PXOR(reg, M((void*)&ssSignBits)); RI.fregs[reg] = I; @@ -1508,7 +1355,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak case FPNeg: { if (!thisUsed) break; X64Reg reg = fregURegWithMov(RI, I); - static const u32 GC_ALIGNED16(psSignBits[4]) = + static const u32 GC_ALIGNED16(psSignBits[4]) = {0x80000000, 0x80000000}; Jit->PXOR(reg, M((void*)&psSignBits)); RI.fregs[reg] = I; @@ -1538,7 +1385,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->MOVAPD(reg, M(&PowerPC::ppcState.ps[ppcreg])); RI.fregs[reg] = I; break; - } + } case LoadFRegDENToZero: { if (!thisUsed) break; X64Reg reg = fregFindFreeReg(RI); @@ -1777,14 +1624,14 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak case BlockEnd: break; - case IdleBranch: { + case IdleBranch: { Jit->CMP(32, regLocForInst(RI, getOp1(getOp1(I))), - Imm32(RI.Build->GetImmValue(getOp2(getOp1(I))))); + Imm32(RI.Build->GetImmValue(getOp2(getOp1(I))))); FixupBranch cont = Jit->J_CC(CC_NE); - RI.Jit->Cleanup(); // is it needed? + RI.Jit->Cleanup(); // is it needed? Jit->ABI_CallFunction((void *)&PowerPC::OnIdleIL); - + Jit->MOV(32, M(&PC), Imm32(ibuild->GetImmValue( getOp2(I) ))); Jit->JMP(((JitIL *)jit)->asm_routines.testExceptions, true); @@ -1836,7 +1683,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak regWriteExit(RI, getOp1(I)); regNormalRegClear(RI, I); break; - } + } case ShortIdleLoop: { unsigned InstLoc = ibuild->GetImmValue(getOp1(I)); Jit->ABI_CallFunction((void *)&CoreTiming::Idle); @@ -1865,11 +1712,11 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->MOV(32, R(ECX), M(&SRR1)); Jit->AND(32, R(EAX), Imm32(~mask)); Jit->AND(32, R(ECX), Imm32(mask)); - Jit->OR(32, R(EAX), R(ECX)); + Jit->OR(32, R(EAX), R(ECX)); // MSR &= 0xFFFBFFFF; // Mask used to clear the bit MSR[13] Jit->AND(32, R(EAX), Imm32(0xFFFBFFFF)); Jit->MOV(32, M(&MSR), R(EAX)); - // NPC = SRR0; + // NPC = SRR0; Jit->MOV(32, R(EAX), M(&SRR0)); Jit->WriteRfiExitDestInOpArg(R(EAX)); break; @@ -1883,7 +1730,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak // If a FPU exception occurs, the exception handler will read // from PC. Update PC with the latest value in case that happens. Jit->MOV(32, M(&PC), Imm32(InstLoc)); - Jit->SUB(32, M(&CoreTiming::downcount), Jit->js.downcountAmount > 127 ? Imm32(Jit->js.downcountAmount) : Imm8(Jit->js.downcountAmount)); + Jit->SUB(32, M(&CoreTiming::downcount), Jit->js.downcountAmount > 127 ? Imm32(Jit->js.downcountAmount) : Imm8(Jit->js.downcountAmount)); Jit->JMP(Jit->asm_routines.fpException, true); Jit->SetJumpTarget(b1); break; @@ -1909,20 +1756,9 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak // Remove the invalid instruction from the icache, forcing a recompile #ifdef _M_IX86 - if (InstLoc & JIT_ICACHE_VMEM_BIT) - Jit->MOV(32, M((jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); - else if (InstLoc & JIT_ICACHE_EXRAM_BIT) - Jit->MOV(32, M((jit->GetBlockCache()->GetICacheEx() + (InstLoc & JIT_ICACHEEX_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); - else - Jit->MOV(32, M((jit->GetBlockCache()->GetICache() + (InstLoc & JIT_ICACHE_MASK))), Imm32(JIT_ICACHE_INVALID_WORD)); - + Jit->MOV(32, M(jit->GetBlockCache()->GetICachePtr(InstLoc)), Imm32(JIT_ICACHE_INVALID_WORD)); #else - if (InstLoc & JIT_ICACHE_VMEM_BIT) - Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheVMEM() + (InstLoc & JIT_ICACHE_MASK))); - else if (InstLoc & JIT_ICACHE_EXRAM_BIT) - Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICacheEx() + (InstLoc & JIT_ICACHEEX_MASK))); - else - Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICache() + (InstLoc & JIT_ICACHE_MASK))); + Jit->MOV(64, R(RAX), ImmPtr(jit->GetBlockCache()->GetICachePtr(InstLoc))); Jit->MOV(32, MatR(RAX), Imm32(JIT_ICACHE_INVALID_WORD)); #endif Jit->WriteExceptionExit(); @@ -1956,7 +1792,7 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak Jit->ABI_CallFunction(reinterpret_cast(&PowerPC::CheckBreakPoints)); Jit->TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); FixupBranch noBreakpoint = Jit->J_CC(CC_Z); - Jit->WriteExit(InstLoc, 0); + Jit->WriteExit(InstLoc); Jit->SetJumpTarget(noBreakpoint); break; } @@ -1984,22 +1820,10 @@ static void DoWriteCode(IRBuilder* ibuild, JitIL* Jit, bool UseProfile, bool Mak } } - //if (!RI.MakeProfile && RI.numSpills) - // printf("Block: %x, numspills %d\n", Jit->js.blockStart, RI.numSpills); - - Jit->WriteExit(jit->js.curBlock->exitAddress[0], 0); + Jit->WriteExit(exitAddress); Jit->UD2(); } -void JitIL::WriteCode() { - DoWriteCode(&ibuild, this, false, SConfig::GetInstance().m_LocalCoreStartupParameter.bJITProfiledReJIT); -} - -void ProfiledReJit() { - JitIL *jitil = (JitIL *)jit; - jitil->SetCodePtr(jitil->js.rewriteStart); - DoWriteCode(&jitil->ibuild, jitil, true, false); - jitil->js.curBlock->codeSize = (int)(jitil->GetCodePtr() - jitil->js.rewriteStart); - jitil->GetBlockCache()->FinalizeBlock(jitil->js.curBlock->blockNum, jitil->jo.enableBlocklink, - jitil->js.curBlock->normalEntry); +void JitIL::WriteCode(u32 exitAddress) { + DoWriteCode(&ibuild, this, exitAddress); } diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp index 4b04415add..1518bc57bb 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.cpp @@ -3,23 +3,13 @@ // Refer to the license.txt file included. #include +#include +#include #include "Common.h" -#include "x64Emitter.h" -#include "x64ABI.h" -#include "Thunk.h" #include "../../HLE/HLE.h" -#include "../../Core.h" #include "../../PatchEngine.h" -#include "../../CoreTiming.h" -#include "../../ConfigManager.h" -#include "../PowerPC.h" #include "../Profiler.h" -#include "../PPCTables.h" -#include "../PPCAnalyst.h" -#include "../../HW/Memmap.h" -#include "../../HW/GPFifo.h" -#include "../JitCommon/JitCache.h" #include "JitIL.h" #include "JitILAsm.h" #include "JitIL_Tables.h" @@ -62,7 +52,7 @@ using namespace PowerPC; // will be as small to be negligible, so I haven't dirtied up the code with that. AMD recommends it in their // optimization manuals, though. // -// We support block linking. Reserve space at the exits of every block for a full 5-byte jmp. Save 16-bit offsets +// We support block linking. Reserve space at the exits of every block for a full 5-byte jmp. Save 16-bit offsets // from the starts of each block, marking the exits so that they can be nicely patched at any time. // // Blocks do NOT use call/ret, they only jmp to each other and to the dispatcher when necessary. @@ -96,7 +86,7 @@ using namespace PowerPC; CR2-CR4 are non-volatile, rest of CR is volatile -> dropped on blr. R5-R12 are volatile -> dropped on blr. * classic inlining across calls. - + Low hanging fruit: stfd -- guaranteed in memory cmpl @@ -150,6 +140,10 @@ ps_adds1 #else #include #include +#include + +#if defined(__clang__) +#if !__has_builtin(__builtin_ia32_rdtsc) static inline uint64_t __rdtsc() { uint32_t lo, hi; @@ -170,6 +164,8 @@ static inline uint64_t __rdtsc() return (uint64_t)hi << 32 | lo; } #endif +#endif +#endif namespace JitILProfiler { @@ -217,20 +213,20 @@ namespace JitILProfiler File::IOFile file(buffer, "w"); setvbuf(file.GetHandle(), NULL, _IOFBF, 1024 * 1024); fprintf(file.GetHandle(), "code hash,total elapsed,number of calls,elapsed per call\n"); - for (std::vector::iterator it = blocks.begin(), itEnd = blocks.end(); it != itEnd; ++it) + for (auto& block : blocks) { - const u64 codeHash = it->codeHash; - const u64 totalElapsed = it->totalElapsed; - const u64 numberOfCalls = it->numberOfCalls; + const u64 codeHash = block.codeHash; + const u64 totalElapsed = block.totalElapsed; + const u64 numberOfCalls = block.numberOfCalls; const double elapsedPerCall = totalElapsed / (double)numberOfCalls; - fprintf(file.GetHandle(), "%016llx,%lld,%lld,%f\n", codeHash, totalElapsed, numberOfCalls, elapsedPerCall); + fprintf(file.GetHandle(), "%016" PRIx64 ",%" PRId64 ",%" PRId64 ",%f\n", codeHash, totalElapsed, numberOfCalls, elapsedPerCall); } } }; - std::auto_ptr finalizer; + std::unique_ptr finalizer; static void Init() { - finalizer = std::auto_ptr(new JitILProfilerFinalizer); + finalizer = std::unique_ptr(new JitILProfilerFinalizer); } static void Shutdown() { @@ -385,32 +381,34 @@ void JitIL::Cleanup() ABI_CallFunctionCCC((void *)&PowerPC::UpdatePerformanceMonitor, js.downcountAmount, jit->js.numLoadStoreInst, jit->js.numFloatingPointInst); } -void JitIL::WriteExit(u32 destination, int exit_num) +void JitIL::WriteExit(u32 destination) { Cleanup(); if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { ABI_CallFunction((void *)JitILProfiler::End); } - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); //If nobody has taken care of this yet (this can be removed when all branches are done) JitBlock *b = js.curBlock; - b->exitAddress[exit_num] = destination; - b->exitPtrs[exit_num] = GetWritableCodePtr(); - + JitBlock::LinkData linkData; + linkData.exitAddress = destination; + linkData.exitPtrs = GetWritableCodePtr(); + // Link opportunity! int block = blocks.GetBlockNumberFromStartAddress(destination); - if (block >= 0 && jo.enableBlocklink) + if (block >= 0 && jo.enableBlocklink) { // It exists! Joy of joy! JMP(blocks.GetBlock(block)->checkedEntry, true); - b->linkStatus[exit_num] = true; + linkData.linkStatus = true; } - else + else { MOV(32, M(&PC), Imm32(destination)); JMP(asm_routines.dispatcher, true); } + b->linkData.push_back(linkData); } void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg) @@ -420,7 +418,7 @@ void JitIL::WriteExitDestInOpArg(const Gen::OpArg& arg) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { ABI_CallFunction((void *)JitILProfiler::End); } - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.dispatcher, true); } @@ -431,7 +429,7 @@ void JitIL::WriteRfiExitDestInOpArg(const Gen::OpArg& arg) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { ABI_CallFunction((void *)JitILProfiler::End); } - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.testExceptions, true); } @@ -441,7 +439,7 @@ void JitIL::WriteExceptionExit() if (SConfig::GetInstance().m_LocalCoreStartupParameter.bJITILTimeProfiling) { ABI_CallFunction((void *)JitILProfiler::End); } - SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); + SUB(32, M(&CoreTiming::downcount), js.downcountAmount > 127 ? Imm32(js.downcountAmount) : Imm8(js.downcountAmount)); JMP(asm_routines.testExceptions, true); } @@ -479,11 +477,11 @@ void JitIL::Trace() sprintf(reg, "f%02d: %016x ", i, riPS0(i)); strncat(fregs, reg, 750); } -#endif +#endif - DEBUG_LOG(DYNA_REC, "JITIL PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", - PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], - PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, + DEBUG_LOG(DYNA_REC, "JITIL PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", + PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], + PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, PowerPC::ppcState.msr, PowerPC::ppcState.spr[8], regs, fregs); } @@ -545,14 +543,16 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc // Analyze the block, collect all instructions it is made of (including inlining, // if that is enabled), reorder instructions for optimal performance, and join joinable instructions. - b->exitAddress[0] = em_address; + u32 exitAddress = em_address; + u32 merged_addresses[32]; const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]); int size_of_merged_addresses = 0; if (!memory_exception) { // If there is a memory exception inside a block (broken_block==true), compile up to that instruction. - b->exitAddress[0] = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses); + // TODO + exitAddress = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses); } PPCAnalyst::CodeOp *ops = code_buf->codebuffer; @@ -568,7 +568,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc const u8 *normalEntry = GetCodePtr(); b->normalEntry = normalEntry; - + if (ImHereDebug) ABI_CallFunction((void *)&ImHere); // Used to get a trace of the last few blocks before a crash, sometimes VERY useful @@ -711,7 +711,7 @@ const u8* JitIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBloc } // Perform actual code generation - WriteCode(); + WriteCode(exitAddress); b->codeSize = (u32)(GetCodePtr() - normalEntry); b->originalSize = size; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h index 34290d4567..305a96015f 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL.h @@ -17,24 +17,32 @@ #ifndef _JITIL_H #define _JITIL_H +#include "JitILAsm.h" +#include "x64Emitter.h" +#include "x64ABI.h" +#include "x64Analyzer.h" +#include "../PowerPC.h" +#include "../PPCTables.h" #include "../PPCAnalyst.h" #include "../JitCommon/JitBase.h" #include "../JitCommon/JitCache.h" #include "../JitCommon/JitBackpatch.h" #include "../JitCommon/Jit_Util.h" -#include "x64Emitter.h" -#include "x64Analyzer.h" -#include "IR.h" -#include "../JitCommon/JitBase.h" -#include "JitILAsm.h" +#include "../JitILCommon/JitILBase.h" +#include "../JitILCommon/IR.h" +#include "../../ConfigManager.h" +#include "../../Core.h" +#include "../../CoreTiming.h" +#include "../../HW/Memmap.h" +#include "../../HW/GPFifo.h" // #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START PPCTables::CountInstruction(inst); #define INSTRUCTION_START -#define JITDISABLE(type) \ +#define JITDISABLE(setting) \ if (Core::g_CoreStartupParameter.bJITOff || \ - Core::g_CoreStartupParameter.bJIT##type##Off) \ + Core::g_CoreStartupParameter.setting) \ {Default(inst); return;} #ifdef _M_X64 @@ -44,44 +52,45 @@ #define DISABLE64 #endif -class JitIL : public Jitx86Base +class JitIL : public JitILBase, public EmuCodeBlock { private: - - - // The default code buffer. We keep it around to not have to alloc/dealloc a - // large chunk of memory for each recompiled block. - PPCAnalyst::CodeBuffer code_buffer; + JitBlockCache blocks; + TrampolineCache trampolines; public: JitILAsmRoutineManager asm_routines; - JitIL() : code_buffer(32000) {} + JitIL() {} ~JitIL() {} - IREmitter::IRBuilder ibuild; - // Initialization, etc - void Init(); - void Shutdown(); + void Init() override; + void Shutdown() override; // Jit! - void Jit(u32 em_address); + void Jit(u32 em_address) override; const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b); void Trace(); - void ClearCache(); + JitBlockCache *GetBlockCache() override { return &blocks; } + + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) override { return NULL; }; + + bool IsInCodeSpace(u8 *ptr) override { return IsInSpace(ptr); } + + void ClearCache() override; const u8 *GetDispatcher() { return asm_routines.dispatcher; // asm_routines.dispatcher } - const CommonAsmRoutines *GetAsmRoutines() { + const CommonAsmRoutines *GetAsmRoutines() override { return &asm_routines; } - const char *GetName() { + const char *GetName() override { #ifdef _M_X64 return "JIT64IL"; #else @@ -91,18 +100,18 @@ public: // Run! - void Run(); - void SingleStep(); + void Run() override; + void SingleStep() override; // Utilities for use by opcodes - void WriteExit(u32 destination, int exit_num); + void WriteExit(u32 destination); void WriteExitDestInOpArg(const Gen::OpArg& arg); void WriteExceptionExit(); void WriteRfiExitDestInOpArg(const Gen::OpArg& arg); void WriteCallInterpreter(UGeckoInstruction _inst); void Cleanup(); - + void WriteToConstRamAddress(int accessSize, const Gen::OpArg& arg, u32 address); void WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 address); void GenerateCarry(Gen::X64Reg temp_reg); @@ -112,115 +121,19 @@ public: void regimmop(int d, int a, bool binary, u32 value, Operation doop, void (Gen::XEmitter::*op)(int, const Gen::OpArg&, const Gen::OpArg&), bool Rc = false, bool carry = false); void fp_tri_op(int d, int a, int b, bool reversible, bool dupe, void (Gen::XEmitter::*op)(Gen::X64Reg, Gen::OpArg)); - void WriteCode(); + void WriteCode(u32 exitAddress); // OPCODES - void unknown_instruction(UGeckoInstruction _inst); - void Default(UGeckoInstruction _inst); - void DoNothing(UGeckoInstruction _inst); - void HLEFunction(UGeckoInstruction _inst); + void unknown_instruction(UGeckoInstruction _inst) override; + void Default(UGeckoInstruction _inst) override; + void DoNothing(UGeckoInstruction _inst) override; + void HLEFunction(UGeckoInstruction _inst) override; - void DynaRunTable4(UGeckoInstruction _inst); - void DynaRunTable19(UGeckoInstruction _inst); - void DynaRunTable31(UGeckoInstruction _inst); - void DynaRunTable59(UGeckoInstruction _inst); - void DynaRunTable63(UGeckoInstruction _inst); - - void addx(UGeckoInstruction inst); - void boolX(UGeckoInstruction inst); - void mulli(UGeckoInstruction inst); - void mulhwux(UGeckoInstruction inst); - void mullwx(UGeckoInstruction inst); - void divwux(UGeckoInstruction inst); - void srawix(UGeckoInstruction inst); - void srawx(UGeckoInstruction inst); - void addex(UGeckoInstruction inst); - void addzex(UGeckoInstruction inst); - - void extsbx(UGeckoInstruction inst); - void extshx(UGeckoInstruction inst); - - void sc(UGeckoInstruction _inst); - void rfi(UGeckoInstruction _inst); - - void bx(UGeckoInstruction inst); - void bclrx(UGeckoInstruction _inst); - void bcctrx(UGeckoInstruction _inst); - void bcx(UGeckoInstruction inst); - - void mtspr(UGeckoInstruction inst); - void mfspr(UGeckoInstruction inst); - void mtmsr(UGeckoInstruction inst); - void mfmsr(UGeckoInstruction inst); - void mftb(UGeckoInstruction inst); - void mtcrf(UGeckoInstruction inst); - void mfcr(UGeckoInstruction inst); - void mcrf(UGeckoInstruction inst); - void crXX(UGeckoInstruction inst); - - void reg_imm(UGeckoInstruction inst); - - void ps_sel(UGeckoInstruction inst); - void ps_mr(UGeckoInstruction inst); - void ps_sign(UGeckoInstruction inst); //aggregate - void ps_arith(UGeckoInstruction inst); //aggregate - void ps_mergeXX(UGeckoInstruction inst); - void ps_maddXX(UGeckoInstruction inst); - void ps_rsqrte(UGeckoInstruction inst); - void ps_sum(UGeckoInstruction inst); - void ps_muls(UGeckoInstruction inst); - - void fp_arith_s(UGeckoInstruction inst); - - void fcmpx(UGeckoInstruction inst); - void fmrx(UGeckoInstruction inst); - - void cmpXX(UGeckoInstruction inst); - - void cntlzwx(UGeckoInstruction inst); - - void lfs(UGeckoInstruction inst); - void lfd(UGeckoInstruction inst); - void stfd(UGeckoInstruction inst); - void stfs(UGeckoInstruction inst); - void stfsx(UGeckoInstruction inst); - void psq_l(UGeckoInstruction inst); - void psq_st(UGeckoInstruction inst); - - void fmaddXX(UGeckoInstruction inst); - void fsign(UGeckoInstruction inst); - void stX(UGeckoInstruction inst); //stw sth stb - void lXz(UGeckoInstruction inst); - void lbzu(UGeckoInstruction inst); - void lha(UGeckoInstruction inst); - void rlwinmx(UGeckoInstruction inst); - void rlwimix(UGeckoInstruction inst); - void rlwnmx(UGeckoInstruction inst); - void negx(UGeckoInstruction inst); - void slwx(UGeckoInstruction inst); - void srwx(UGeckoInstruction inst); - void dcbst(UGeckoInstruction inst); - void dcbz(UGeckoInstruction inst); - void lfsx(UGeckoInstruction inst); - - void subfic(UGeckoInstruction inst); - void subfcx(UGeckoInstruction inst); - void subfx(UGeckoInstruction inst); - void subfex(UGeckoInstruction inst); - - void lXzx(UGeckoInstruction inst); - void lhax(UGeckoInstruction inst); - - void stXx(UGeckoInstruction inst); - - void lmw(UGeckoInstruction inst); - void stmw(UGeckoInstruction inst); - - void icbi(UGeckoInstruction inst); + void DynaRunTable4(UGeckoInstruction _inst) override; + void DynaRunTable19(UGeckoInstruction _inst) override; + void DynaRunTable31(UGeckoInstruction _inst) override; + void DynaRunTable59(UGeckoInstruction _inst) override; + void DynaRunTable63(UGeckoInstruction _inst) override; }; -void Jit(u32 em_address); - -void ProfiledReJit(); - #endif // _JITIL_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp index 15786980fa..a909d32725 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.cpp @@ -2,33 +2,21 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "x64ABI.h" -#include "x64Emitter.h" - -#include "../../HW/Memmap.h" - -#include "../PowerPC.h" -#include "../../CoreTiming.h" -#include "MemoryUtil.h" -#include "CPUDetect.h" - -#include "x64ABI.h" -#include "Thunk.h" - -#include "../../HW/GPFifo.h" -#include "../../Core.h" #include "JitIL.h" #include "JitILAsm.h" +#include "MemoryUtil.h" +#include "CPUDetect.h" + using namespace Gen; //static int temp32; // unused? //TODO - make an option //#if _DEBUG -static bool enableDebug = false; +static bool enableDebug = false; //#else -// bool enableDebug = false; +// bool enableDebug = false; //#endif //static bool enableStatistics = false; // unused? @@ -39,7 +27,7 @@ static bool enableDebug = false; //GLOBAL STATIC ALLOCATIONS x64 //EAX - ubiquitous scratch register - EVERYBODY scratches this //RBX - Base pointer of memory -//R15 - Pointer to array of block pointers +//R15 - Pointer to array of block pointers JitILAsmRoutineManager jitil_asm_routines; @@ -61,7 +49,7 @@ void JitILAsmRoutineManager::Generate() const u8 *outer_loop = GetCodePtr(); ABI_CallFunction(reinterpret_cast(&CoreTiming::Advance)); FixupBranch skipToRealDispatch = J(); //skip the sync and compare first time - + dispatcher = GetCodePtr(); //This is the place for CPUCompare! @@ -87,41 +75,40 @@ void JitILAsmRoutineManager::Generate() MOV(32, R(EAX), M(&PowerPC::ppcState.pc)); dispatcherPcInEAX = GetCodePtr(); -#ifdef JIT_UNLIMITED_ICACHE u32 mask = 0; FixupBranch no_mem; FixupBranch exit_mem; FixupBranch exit_vmem; if (Core::g_CoreStartupParameter.bWii) mask = JIT_ICACHE_EXRAM_BIT; - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) mask |= JIT_ICACHE_VMEM_BIT; - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { TEST(32, R(EAX), Imm32(mask)); no_mem = J_CC(CC_NZ); } AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICache())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCache)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICache())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCache)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { exit_mem = J(); SetJumpTarget(no_mem); } - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { TEST(32, R(EAX), Imm32(JIT_ICACHE_VMEM_BIT)); FixupBranch no_vmem = J_CC(CC_Z); AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheVMEM())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCacheVMEM)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheVMEM())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCacheVMEM)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif if (Core::g_CoreStartupParameter.bWii) exit_vmem = J(); @@ -133,30 +120,20 @@ void JitILAsmRoutineManager::Generate() FixupBranch no_exram = J_CC(CC_Z); AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); #ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->GetICacheEx())); + MOV(32, R(EAX), MDisp(EAX, (u32)jit->GetBlockCache()->iCacheEx)); #else - MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->GetICacheEx())); + MOV(64, R(RSI), Imm64((u64)jit->GetBlockCache()->iCacheEx)); MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); #endif SetJumpTarget(no_exram); } - if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bWii || Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) SetJumpTarget(exit_mem); - if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack)) + if (Core::g_CoreStartupParameter.bWii && (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack)) SetJumpTarget(exit_vmem); -#else -#ifdef _M_IX86 - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(32, R(EBX), Imm32((u32)Memory::base)); - MOV(32, R(EAX), MComplex(EBX, EAX, SCALE_1, 0)); -#else - MOV(32, R(EAX), MComplex(RBX, RAX, SCALE_1, 0)); -#endif -#endif - TEST(32, R(EAX), Imm32(0xFC)); - FixupBranch notfound = J_CC(CC_NZ); - BSWAP(32, EAX); + TEST(32, R(EAX), R(EAX)); + FixupBranch notfound = J_CC(CC_L); //IDEA - we have 26 bits, why not just use offsets from base of code? if (enableDebug) { @@ -184,7 +161,7 @@ void JitILAsmRoutineManager::Generate() JMP(dispatcherNoCheck); // no point in special casing this //FP blocks test for FPU available, jump here if false - fpException = AlignCode4(); + fpException = AlignCode4(); MOV(32, R(EAX), M(&PC)); MOV(32, M(&NPC), R(EAX)); LOCK(); @@ -198,14 +175,14 @@ void JitILAsmRoutineManager::Generate() doTiming = GetCodePtr(); ABI_CallFunction(reinterpret_cast(&CoreTiming::Advance)); - + testExceptions = GetCodePtr(); MOV(32, R(EAX), M(&PC)); MOV(32, M(&NPC), R(EAX)); ABI_CallFunction(reinterpret_cast(&PowerPC::CheckExceptions)); MOV(32, R(EAX), M(&NPC)); MOV(32, M(&PC), R(EAX)); - + TEST(32, M((void*)PowerPC::GetStatePtr()), Imm32(0xFFFFFFFF)); J_CC(CC_Z, outer_loop, true); //Landing pad for drec space @@ -233,18 +210,11 @@ void JitILAsmRoutineManager::GenerateCommon() fifoDirectWriteXmm64 = AlignCode4(); GenFifoXmm64Write(); - doReJit = AlignCode4(); - ABI_AlignStack(0); - CALL(reinterpret_cast(&ProfiledReJit)); - ABI_RestoreStack(0); - SUB(32, M(&CoreTiming::downcount), Imm8(0)); - JMP(dispatcher, true); - GenQuantizedLoads(); GenQuantizedStores(); GenQuantizedSingleStores(); - //CMPSD(R(XMM0), M(&zero), + //CMPSD(R(XMM0), M(&zero), // TODO // Fast write routines - special case the most common hardware write diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h index 8222e897c3..f2c30a78e8 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitILAsm.h @@ -18,7 +18,7 @@ // 3) Can optimize code at runtime for the specific CPU model. // There aren't really any disadvantages other than having to maintain a x86 emitter, // which we have to do anyway :) -// +// // To add a new asm routine, just add another const here, and add the code to Generate. // Also, possibly increase the size of the code buffer. @@ -38,8 +38,6 @@ public: void Shutdown() { FreeCodeSpace(); } - - const u8 *doReJit; }; extern JitILAsmRoutineManager jitil_asm_routines; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp index 7ca1ad5a53..a9ed852452 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Tables.cpp @@ -29,7 +29,7 @@ struct GekkoOPTemplate //GekkoOPInfo opinfo; // Doesn't need opinfo, Interpreter fills it out }; -static GekkoOPTemplate primarytable[] = +static GekkoOPTemplate primarytable[] = { {4, &JitIL::DynaRunTable4}, //"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0}}, {19, &JitIL::DynaRunTable19}, //"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0}}, @@ -110,7 +110,7 @@ static GekkoOPTemplate primarytable[] = {58, &JitIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, }; -static GekkoOPTemplate table4[] = +static GekkoOPTemplate table4[] = { //SUBOP10 {0, &JitIL::Default}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, {32, &JitIL::Default}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, @@ -126,9 +126,9 @@ static GekkoOPTemplate table4[] = {624, &JitIL::ps_mergeXX}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, {1014, &JitIL::Default}, //"dcbz_l", OPTYPE_SYSTEM, 0}}, -}; +}; -static GekkoOPTemplate table4_2[] = +static GekkoOPTemplate table4_2[] = { {10, &JitIL::ps_sum}, //"ps_sum0", OPTYPE_PS, 0}}, {11, &JitIL::ps_sum}, //"ps_sum1", OPTYPE_PS, 0}}, @@ -150,15 +150,15 @@ static GekkoOPTemplate table4_2[] = }; -static GekkoOPTemplate table4_3[] = +static GekkoOPTemplate table4_3[] = { {6, &JitIL::Default}, //"psq_lx", OPTYPE_PS, 0}}, {7, &JitIL::Default}, //"psq_stx", OPTYPE_PS, 0}}, {38, &JitIL::Default}, //"psq_lux", OPTYPE_PS, 0}}, - {39, &JitIL::Default}, //"psq_stux", OPTYPE_PS, 0}}, + {39, &JitIL::Default}, //"psq_stux", OPTYPE_PS, 0}}, }; -static GekkoOPTemplate table19[] = +static GekkoOPTemplate table19[] = { {528, &JitIL::bcctrx}, //"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, {16, &JitIL::bclrx}, //"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, @@ -170,16 +170,16 @@ static GekkoOPTemplate table19[] = {449, &JitIL::crXX}, //"cror", OPTYPE_CR, FL_EVIL}}, {417, &JitIL::crXX}, //"crorc", OPTYPE_CR, FL_EVIL}}, {193, &JitIL::crXX}, //"crxor", OPTYPE_CR, FL_EVIL}}, - + {150, &JitIL::DoNothing}, //"isync", OPTYPE_ICACHE, FL_EVIL}}, {0, &JitIL::mcrf}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, - + {50, &JitIL::rfi}, //"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1}}, {18, &JitIL::Default}, //"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS}} }; -static GekkoOPTemplate table31[] = +static GekkoOPTemplate table31[] = { {28, &JitIL::boolX}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, {60, &JitIL::boolX}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, @@ -253,7 +253,7 @@ static GekkoOPTemplate table31[] = {661, &JitIL::Default}, //"stswx", OPTYPE_STORE, FL_EVIL}}, {725, &JitIL::Default}, //"stswi", OPTYPE_STORE, FL_EVIL}}, - // fp load/store + // fp load/store {535, &JitIL::lfsx}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, {567, &JitIL::Default}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, {599, &JitIL::Default}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, @@ -291,8 +291,8 @@ static GekkoOPTemplate table31[] = {566, &JitIL::Default}, //"tlbsync", OPTYPE_SYSTEM, 0}}, }; -static GekkoOPTemplate table31_2[] = -{ +static GekkoOPTemplate table31_2[] = +{ {266, &JitIL::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, {778, &JitIL::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, {10, &JitIL::Default}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, @@ -319,21 +319,21 @@ static GekkoOPTemplate table31_2[] = {200, &JitIL::Default}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, }; -static GekkoOPTemplate table59[] = +static GekkoOPTemplate table59[] = { - {18, &JitIL::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, - {20, &JitIL::fp_arith_s}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {21, &JitIL::fp_arith_s}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {18, &JitIL::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, + {20, &JitIL::fp_arith_s}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitIL::fp_arith_s}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, // {22, &JitIL::Default}, //"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F}}, // Not implemented on gekko - {24, &JitIL::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, - {25, &JitIL::fp_arith_s}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {28, &JitIL::fmaddXX}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {29, &JitIL::fmaddXX}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {30, &JitIL::fmaddXX}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {31, &JitIL::fmaddXX}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, -}; + {24, &JitIL::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitIL::fp_arith_s}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitIL::fmaddXX}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitIL::fmaddXX}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitIL::fmaddXX}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitIL::fmaddXX}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; -static GekkoOPTemplate table63[] = +static GekkoOPTemplate table63[] = { {264, &JitIL::fsign}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, {32, &JitIL::fcmpx}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, @@ -353,7 +353,7 @@ static GekkoOPTemplate table63[] = {711, &JitIL::Default}, //"mtfsfx", OPTYPE_SYSTEMFP, 0, 2}}, }; -static GekkoOPTemplate table63_2[] = +static GekkoOPTemplate table63_2[] = { {18, &JitIL::Default}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, {20, &JitIL::Default}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, @@ -397,9 +397,9 @@ void InitTables() return; //clear - for (int i = 0; i < 32; i++) + for (auto& tpl : dynaOpTable59) { - dynaOpTable59[i] = &JitIL::unknown_instruction; + tpl = &JitIL::unknown_instruction; } for (int i = 0; i < 1024; i++) @@ -407,81 +407,81 @@ void InitTables() dynaOpTable4 [i] = &JitIL::unknown_instruction; dynaOpTable19[i] = &JitIL::unknown_instruction; dynaOpTable31[i] = &JitIL::unknown_instruction; - dynaOpTable63[i] = &JitIL::unknown_instruction; + dynaOpTable63[i] = &JitIL::unknown_instruction; } - for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : primarytable) { - dynaOpTable[primarytable[i].opcode] = primarytable[i].Inst; + dynaOpTable[tpl.opcode] = tpl.Inst; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_2) { - int op = fill+table4_2[j].opcode; - dynaOpTable4[op] = table4_2[j].Inst; + int op = fill+tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } } for (int i = 0; i < 16; i++) { int fill = i << 6; - for (int j = 0; j < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table4_3) { - int op = fill+table4_3[j].opcode; - dynaOpTable4[op] = table4_3[j].Inst; + int op = fill+tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } } - for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table4) { - int op = table4[i].opcode; - dynaOpTable4[op] = table4[i].Inst; + int op = tpl.opcode; + dynaOpTable4[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table31) { - int op = table31[i].opcode; - dynaOpTable31[op] = table31[i].Inst; + int op = tpl.opcode; + dynaOpTable31[op] = tpl.Inst; } for (int i = 0; i < 1; i++) { int fill = i << 9; - for (int j = 0; j < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table31_2) { - int op = fill + table31_2[j].opcode; - dynaOpTable31[op] = table31_2[j].Inst; + int op = fill + tpl.opcode; + dynaOpTable31[op] = tpl.Inst; } } - for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table19) { - int op = table19[i].opcode; - dynaOpTable19[op] = table19[i].Inst; + int op = tpl.opcode; + dynaOpTable19[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table59) { - int op = table59[i].opcode; - dynaOpTable59[op] = table59[i].Inst; + int op = tpl.opcode; + dynaOpTable59[op] = tpl.Inst; } - for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) + for (auto& tpl : table63) { - int op = table63[i].opcode; - dynaOpTable63[op] = table63[i].Inst; + int op = tpl.opcode; + dynaOpTable63[op] = tpl.Inst; } for (int i = 0; i < 32; i++) { int fill = i << 5; - for (int j = 0; j < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); j++) + for (auto& tpl : table63_2) { - int op = fill + table63_2[j].opcode; - dynaOpTable63[op] = table63_2[j].Inst; + int op = fill + tpl.opcode; + dynaOpTable63[op] = tpl.Inst; } } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp index cd5f90d129..eab7f3711a 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.cpp @@ -54,7 +54,7 @@ void JitArm::Init() jo.optimizeGatherPipe = true; } -void JitArm::ClearCache() +void JitArm::ClearCache() { ClearCodeSpace(); blocks.Clear(); @@ -93,7 +93,7 @@ void JitArm::HLEFunction(UGeckoInstruction _inst) fpr.Flush(); MOVI2R(R0, js.compilerPC); MOVI2R(R1, _inst.hex); - QuickCallFunction(R14, (void*)&HLE::Execute); + QuickCallFunction(R14, (void*)&HLE::Execute); ARMReg rA = gpr.GetReg(); LDR(rA, R9, PPCSTATE_OFF(npc)); WriteExitDestInR(rA); @@ -158,7 +158,7 @@ void JitArm::DoDownCount() } gpr.Unlock(rA, rB); } -void JitArm::WriteExitDestInR(ARMReg Reg) +void JitArm::WriteExitDestInR(ARMReg Reg) { STR(Reg, R9, PPCSTATE_OFF(pc)); Cleanup(); @@ -167,7 +167,7 @@ void JitArm::WriteExitDestInR(ARMReg Reg) B(Reg); gpr.Unlock(Reg); } -void JitArm::WriteRfiExitDestInR(ARMReg Reg) +void JitArm::WriteRfiExitDestInR(ARMReg Reg) { STR(Reg, R9, PPCSTATE_OFF(pc)); Cleanup(); @@ -186,32 +186,35 @@ void JitArm::WriteExceptionExit() MOVI2R(A, (u32)asm_routines.testExceptions); B(A); } -void JitArm::WriteExit(u32 destination, int exit_num) +void JitArm::WriteExit(u32 destination) { Cleanup(); - DoDownCount(); + DoDownCount(); //If nobody has taken care of this yet (this can be removed when all branches are done) JitBlock *b = js.curBlock; - b->exitAddress[exit_num] = destination; - b->exitPtrs[exit_num] = GetWritableCodePtr(); - + JitBlock::LinkData linkData; + linkData.exitAddress = destination; + linkData.exitPtrs = GetWritableCodePtr(); + // Link opportunity! int block = blocks.GetBlockNumberFromStartAddress(destination); - if (block >= 0 && jo.enableBlocklink) + if (block >= 0 && jo.enableBlocklink) { // It exists! Joy of joy! B(blocks.GetBlock(block)->checkedEntry); - b->linkStatus[exit_num] = true; + linkData.linkStatus = true; } - else + else { ARMReg A = gpr.GetReg(false); MOVI2R(A, destination); STR(A, R9, PPCSTATE_OFF(pc)); MOVI2R(A, (u32)asm_routines.dispatcher); - B(A); + B(A); } + + b->linkData.push_back(linkData); } void STACKALIGN JitArm::Run() @@ -247,11 +250,11 @@ void JitArm::Trace() sprintf(reg, "f%02d: %016x ", i, riPS0(i)); strncat(fregs, reg, 750); } -#endif +#endif - DEBUG_LOG(DYNA_REC, "JITARM PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", - PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], - PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, + DEBUG_LOG(DYNA_REC, "JITARM PC: %08x SRR0: %08x SRR1: %08x CRfast: %02x%02x%02x%02x%02x%02x%02x%02x FPSCR: %08x MSR: %08x LR: %08x %s %s", + PC, SRR0, SRR1, PowerPC::ppcState.cr_fast[0], PowerPC::ppcState.cr_fast[1], PowerPC::ppcState.cr_fast[2], PowerPC::ppcState.cr_fast[3], + PowerPC::ppcState.cr_fast[4], PowerPC::ppcState.cr_fast[5], PowerPC::ppcState.cr_fast[6], PowerPC::ppcState.cr_fast[7], PowerPC::ppcState.fpscr, PowerPC::ppcState.msr, PowerPC::ppcState.spr[8], regs, fregs); } @@ -296,6 +299,7 @@ void STACKALIGN JitArm::Jit(u32 em_address) } void JitArm::Break(UGeckoInstruction inst) { + ERROR_LOG(DYNA_REC, "%s called a Break instruction!", PPCTables::GetInstructionName(inst)); BKPT(0x4444); } @@ -353,7 +357,7 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo } PPCAnalyst::CodeOp *ops = code_buf->codebuffer; - const u8 *start = GetCodePtr(); + const u8 *start = GetCodePtr(); b->checkedEntry = start; b->runCount = 0; @@ -388,7 +392,7 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo MOVI2R(A, (u32)asm_routines.fpException); B(A); SetCC(); - gpr.Unlock(A, C); + gpr.Unlock(A, C); } // Conditionally add profiling code. if (Profiler::g_ProfileBlocks) { @@ -397,7 +401,7 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo MOVI2R(rA, (u32)&b->runCount); // Load in to register LDR(rB, rA); // Load the actual value in to R11. ADD(rB, rB, 1); // Add one to the value - STR(rB, rA); // Now store it back in the memory location + STR(rB, rA); // Now store it back in the memory location // get start tic PROFILER_QUERY_PERFORMANCE_COUNTER(&b->ticStart); gpr.Unlock(rA, rB); @@ -466,7 +470,8 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo MOVI2R(RB, (u32)&One); VLDR(VA, RA, 0); VLDR(VB, RB, 0); - VADD(I_I64, VA, VA, VB); + NEONXEmitter nemit(this); + nemit.VADD(I_64, VA, VA, VB); VSTR(VA, RA, 0); gpr.Unlock(RA, RB); fpr.Unlock(VA); @@ -481,6 +486,7 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo BKPT(0x7777); } JitArmTables::CompileInstruction(ops[i]); + fpr.Flush(); if (js.memcheck && (opinfo->flags & FL_LOADSTORE)) { // Don't do this yet @@ -493,9 +499,9 @@ const u8* JitArm::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlo if (broken_block) { printf("Broken Block going to 0x%08x\n", nextPC); - WriteExit(nextPC, 0); + WriteExit(nextPC); } - + b->flags = js.block_flags; b->codeSize = (u32)(GetCodePtr() - normalEntry); b->originalSize = size; diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h index be203868e5..4d1d2d8a4e 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h +++ b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h @@ -43,12 +43,12 @@ // #define INSTRUCTION_START Default(inst); return; // #define INSTRUCTION_START PPCTables::CountInstruction(inst); #define INSTRUCTION_START -#define JITDISABLE(type) \ +#define JITDISABLE(setting) \ if (Core::g_CoreStartupParameter.bJITOff || \ - Core::g_CoreStartupParameter.bJIT##type##Off) \ + Core::g_CoreStartupParameter.setting) \ {Default(inst); return;} -#define PPCSTATE_OFF(elem) ((s32)STRUCT_OFF(PowerPC::ppcState, elem) - (s32)STRUCT_OFF(PowerPC::ppcState, spr[0])) -class JitArm : public JitBase, public ArmGen::ARMXCodeBlock +#define PPCSTATE_OFF(elem) ((s32)STRUCT_OFF(PowerPC::ppcState, elem) - (s32)STRUCT_OFF(PowerPC::ppcState, spr[0])) +class JitArm : public JitBase, public ArmGen::ARMXCodeBlock { private: JitArmBlockCache blocks; @@ -67,7 +67,9 @@ private: void PrintDebug(UGeckoInstruction inst, u32 level); - void Helper_UpdateCR1(ARMReg value); + void Helper_UpdateCR1(ARMReg fpscr, ARMReg temp); + + void SetFPException(ARMReg Reg, u32 Exception); public: JitArm() : code_buffer(32000) {} ~JitArm() {} @@ -79,10 +81,10 @@ public: void Jit(u32 em_address); const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlock *b); - + JitBaseBlockCache *GetBlockCache() { return &blocks; } - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx); + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx); bool IsInCodeSpace(u8 *ptr) { return IsInSpace(ptr); } @@ -91,10 +93,10 @@ public: void ClearCache(); const u8 *GetDispatcher() { - return asm_routines.dispatcher; + return asm_routines.dispatcher; } CommonAsmRoutinesBase *GetAsmRoutines() { - return &asm_routines; + return &asm_routines; } const char *GetName() { @@ -107,7 +109,7 @@ public: // Utilities for use by opcodes - void WriteExit(u32 destination, int exit_num); + void WriteExit(u32 destination); void WriteExitDestInR(ARMReg Reg); void WriteRfiExitDestInR(ARMReg Reg); void WriteExceptionExit(); @@ -119,9 +121,18 @@ public: void ComputeRC(s32 value, int cr); void ComputeCarry(); + void ComputeCarry(bool Carry); void GetCarryAndClear(ARMReg reg); void FinalizeCarry(ARMReg reg); + // TODO: This shouldn't be here + void UnsafeStoreFromReg(ARMReg dest, ARMReg value, int accessSize, s32 offset); + void SafeStoreFromReg(bool fastmem, s32 dest, u32 value, s32 offsetReg, int accessSize, s32 offset); + + void UnsafeLoadToReg(ARMReg dest, ARMReg addr, int accessSize, s32 offset); + void SafeLoadToReg(bool fastmem, u32 dest, s32 addr, s32 offsetReg, int accessSize, s32 offset, bool signExtend, bool reverse); + + // OPCODES void unknown_instruction(UGeckoInstruction _inst); void Default(UGeckoInstruction _inst); @@ -143,31 +154,22 @@ public: void sc(UGeckoInstruction _inst); void rfi(UGeckoInstruction _inst); void bcctrx(UGeckoInstruction _inst); - + // Integer - void addi(UGeckoInstruction _inst); - void addis(UGeckoInstruction _inst); - void addx(UGeckoInstruction _inst); - void addcx(UGeckoInstruction _inst); + void arith(UGeckoInstruction _inst); + void addex(UGeckoInstruction _inst); + void subfic(UGeckoInstruction _inst); + void cntlzwx(UGeckoInstruction _inst); void cmp (UGeckoInstruction _inst); void cmpi(UGeckoInstruction _inst); void cmpl(UGeckoInstruction _inst); void cmpli(UGeckoInstruction _inst); void negx(UGeckoInstruction _inst); - void mulli(UGeckoInstruction _inst); - void mullwx(UGeckoInstruction _inst); void mulhwux(UGeckoInstruction _inst); - void ori(UGeckoInstruction _inst); - void oris(UGeckoInstruction _inst); - void orx(UGeckoInstruction _inst); - void xorx(UGeckoInstruction _inst); - void andx(UGeckoInstruction _inst); - void andi_rc(UGeckoInstruction _inst); - void andis_rc(UGeckoInstruction _inst); void rlwimix(UGeckoInstruction _inst); void rlwinmx(UGeckoInstruction _inst); - void subfx(UGeckoInstruction _inst); + void rlwnmx(UGeckoInstruction _inst); void srawix(UGeckoInstruction _inst); void extshx(UGeckoInstruction inst); void extsbx(UGeckoInstruction inst); @@ -178,24 +180,27 @@ public: void mtspr(UGeckoInstruction _inst); void mfspr(UGeckoInstruction _inst); void mftb(UGeckoInstruction _inst); + void crXXX(UGeckoInstruction _inst); + void mcrf(UGeckoInstruction _inst); + void mfcr(UGeckoInstruction _inst); + void mtcrf(UGeckoInstruction _inst); + void mtsr(UGeckoInstruction _inst); + void mfsr(UGeckoInstruction _inst); + void mcrxr(UGeckoInstruction _inst); // LoadStore + void stX(UGeckoInstruction _inst); + void lXX(UGeckoInstruction _inst); + void lmw(UGeckoInstruction _inst); + void stmw(UGeckoInstruction _inst); + void icbi(UGeckoInstruction _inst); void dcbst(UGeckoInstruction _inst); - void lbz(UGeckoInstruction _inst); - void lhz(UGeckoInstruction _inst); - void lha(UGeckoInstruction _inst); - void lwz(UGeckoInstruction _inst); - void lwzx(UGeckoInstruction _inst); - void stb(UGeckoInstruction _inst); - void stbu(UGeckoInstruction _inst); - void sth(UGeckoInstruction _inst); - void sthu(UGeckoInstruction _inst); - void stw(UGeckoInstruction _inst); - void stwu(UGeckoInstruction _inst); // Floating point void fabsx(UGeckoInstruction _inst); + void fnabsx(UGeckoInstruction _inst); + void fnegx(UGeckoInstruction _inst); void faddsx(UGeckoInstruction _inst); void faddx(UGeckoInstruction _inst); void fsubsx(UGeckoInstruction _inst); @@ -203,17 +208,59 @@ public: void fmulsx(UGeckoInstruction _inst); void fmulx(UGeckoInstruction _inst); void fmrx(UGeckoInstruction _inst); + void fmaddsx(UGeckoInstruction _inst); + void fmaddx(UGeckoInstruction _inst); + void fctiwx(UGeckoInstruction _inst); + void fctiwzx(UGeckoInstruction _inst); + void fcmpo(UGeckoInstruction _inst); + void fcmpu(UGeckoInstruction _inst); + void fnmaddx(UGeckoInstruction _inst); + void fnmaddsx(UGeckoInstruction _inst); + void fresx(UGeckoInstruction _inst); + void fselx(UGeckoInstruction _inst); + void frsqrtex(UGeckoInstruction _inst); // Floating point loadStore - void lfs(UGeckoInstruction _inst); - void lfd(UGeckoInstruction _inst); + void lfXX(UGeckoInstruction _inst); + void stfXX(UGeckoInstruction _inst); + void stfs(UGeckoInstruction _inst); // Paired Singles void ps_add(UGeckoInstruction _inst); + void ps_div(UGeckoInstruction _inst); + void ps_res(UGeckoInstruction _inst); void ps_sum0(UGeckoInstruction _inst); + void ps_sum1(UGeckoInstruction _inst); void ps_madd(UGeckoInstruction _inst); + void ps_nmadd(UGeckoInstruction _inst); + void ps_msub(UGeckoInstruction _inst); + void ps_nmsub(UGeckoInstruction _inst); + void ps_madds0(UGeckoInstruction _inst); + void ps_madds1(UGeckoInstruction _inst); void ps_sub(UGeckoInstruction _inst); void ps_mul(UGeckoInstruction _inst); + void ps_muls0(UGeckoInstruction _inst); + void ps_muls1(UGeckoInstruction _inst); + void ps_merge00(UGeckoInstruction _inst); + void ps_merge01(UGeckoInstruction _inst); + void ps_merge10(UGeckoInstruction _inst); + void ps_merge11(UGeckoInstruction _inst); + void ps_mr(UGeckoInstruction _inst); + void ps_neg(UGeckoInstruction _inst); + void ps_abs(UGeckoInstruction _inst); + void ps_nabs(UGeckoInstruction _inst); + void ps_rsqrte(UGeckoInstruction _inst); + void ps_sel(UGeckoInstruction _inst); + void ps_cmpu0(UGeckoInstruction _inst); + void ps_cmpu1(UGeckoInstruction _inst); + void ps_cmpo0(UGeckoInstruction _inst); + void ps_cmpo1(UGeckoInstruction _inst); + + // LoadStore paired + void psq_l(UGeckoInstruction _inst); + void psq_lx(UGeckoInstruction _inst); + void psq_st(UGeckoInstruction _inst); + void psq_stx(UGeckoInstruction _inst); }; #endif // _JIT64_H diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_BackPatch.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_BackPatch.cpp index 9d01332f57..bb085e96a8 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_BackPatch.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_BackPatch.cpp @@ -24,28 +24,9 @@ #include "../JitCommon/JitBackpatch.h" #include "StringUtil.h" -#ifdef _M_X64 -static void BackPatchError(const std::string &text, u8 *codePtr, u32 emAddress) { - u64 code_addr = (u64)codePtr; - disassembler disasm; - char disbuf[256]; - memset(disbuf, 0, 256); -#ifdef _M_IX86 - disasm.disasm32(0, code_addr, codePtr, disbuf); -#else - disasm.disasm64(0, code_addr, codePtr, disbuf); -#endif - PanicAlert("%s\n\n" - "Error encountered accessing emulated address %08x.\n" - "Culprit instruction: \n%s\nat %#llx", - text.c_str(), emAddress, disbuf, code_addr); - return; -} -#endif - // This generates some fairly heavy trampolines, but: // 1) It's really necessary. We don't know anything about the context. -// 2) It doesn't really hurt. Only instructions that access I/O will get these, and there won't be +// 2) It doesn't really hurt. Only instructions that access I/O will get these, and there won't be // that many of them in a typical program/game. bool DisamLoadStore(const u32 inst, ARMReg &rD, u8 &accessSize, bool &Store) { @@ -96,11 +77,11 @@ bool DisamLoadStore(const u32 inst, ARMReg &rD, u8 &accessSize, bool &Store) } return true; } -const u8 *JitArm::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ctx_void) +const u8 *JitArm::BackPatch(u8 *codePtr, u32, void *ctx_void) { // TODO: This ctx needs to be filled with our information - CONTEXT *ctx = (CONTEXT *)ctx_void; - + SContext *ctx = (SContext *)ctx_void; + // We need to get the destination register before we start u32 Value = *(u32*)codePtr; ARMReg rD; @@ -109,13 +90,13 @@ const u8 *JitArm::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ct if (!DisamLoadStore(Value, rD, accessSize, Store)) { - printf("Invalid backpatch at location 0x%08x(0x%08x)\n", ctx->reg_pc, Value); + printf("Invalid backpatch at location 0x%08x(0x%08x)\n", ctx->CTX_PC, Value); exit(0); } if (Store) { - const u32 ARMREGOFFSET = 4 * 7; + const u32 ARMREGOFFSET = 4 * 5; ARMXEmitter emitter(codePtr - ARMREGOFFSET); switch (accessSize) { @@ -133,29 +114,28 @@ const u8 *JitArm::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ct } emitter.PUSH(4, R0, R1, R2, R3); // 3 emitter.MOV(R0, rD); // Value - 4 - emitter.MOV(R1, R10); // Addr- 5 + emitter.MOV(R1, R10); // Addr- 5 emitter.BL(R14); // 6 emitter.POP(4, R0, R1, R2, R3); // 7 - emitter.NOP(1); // 8 - u32 newPC = ctx->reg_pc - (ARMREGOFFSET + 4 * 4); - ctx->reg_pc = newPC; + u32 newPC = ctx->CTX_PC - (ARMREGOFFSET + 4 * 4); + ctx->CTX_PC = newPC; emitter.FlushIcache(); - return codePtr; + return (u8*)ctx->CTX_PC; } else { - const u32 ARMREGOFFSET = 4 * 6; + const u32 ARMREGOFFSET = 4 * 4; ARMXEmitter emitter(codePtr - ARMREGOFFSET); switch (accessSize) { case 8: // 8bit - emitter.MOVI2R(R14, (u32)&Memory::Read_U8, false); // 2 + emitter.MOVI2R(R14, (u32)&Memory::Read_U8, false); // 2 break; case 16: // 16bit - emitter.MOVI2R(R14, (u32)&Memory::Read_U16, false); // 2 + emitter.MOVI2R(R14, (u32)&Memory::Read_U16, false); // 2 break; case 32: // 32bit - emitter.MOVI2R(R14, (u32)&Memory::Read_U32, false); // 2 + emitter.MOVI2R(R14, (u32)&Memory::Read_U32, false); // 2 break; } emitter.PUSH(4, R0, R1, R2, R3); // 3 @@ -164,9 +144,9 @@ const u8 *JitArm::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ct emitter.MOV(R14, R0); // 6 emitter.POP(4, R0, R1, R2, R3); // 7 emitter.MOV(rD, R14); // 8 - ctx->reg_pc -= ARMREGOFFSET + (4 * 4); + ctx->CTX_PC -= ARMREGOFFSET + (4 * 4); emitter.FlushIcache(); - return codePtr; + return (u8*)ctx->CTX_PC; } return 0; } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp index 5a1a4659a6..c70a2b2f3d 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Branch.cpp @@ -15,7 +15,6 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -31,19 +30,19 @@ // No need for a disable-mechanism. // If defined, clears CR0 at blr and bl-s. If the assumption that -// flags never carry over between functions holds, then the task for +// flags never carry over between functions holds, then the task for // an optimizer becomes much easier. // #define ACID_TEST -// Zelda and many more games seem to pass the Acid Test. +// Zelda and many more games seem to pass the Acid Test. using namespace ArmGen; void JitArm::sc(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(); fpr.Flush(); @@ -62,11 +61,11 @@ void JitArm::sc(UGeckoInstruction inst) void JitArm::rfi(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(); fpr.Flush(); - + // See Interpreter rfi for details const u32 mask = 0x87C0FFFF; const u32 clearMSR13 = 0xFFFBFFFF; // Mask used to clear the bit MSR[13] @@ -85,7 +84,6 @@ void JitArm::rfi(UGeckoInstruction inst) LDR(rD, R9, PPCSTATE_OFF(msr)); AND(rD, rD, rB); // rD = Masked MSR - STR(rD, R9, PPCSTATE_OFF(msr)); LDR(rB, R9, PPCSTATE_OFF(spr[SPR_SRR1])); // rB contains SRR1 here @@ -95,7 +93,7 @@ void JitArm::rfi(UGeckoInstruction inst) STR(rB, R9, PPCSTATE_OFF(msr)); // STR rB in to rA LDR(rA, R9, PPCSTATE_OFF(spr[SPR_SRR0])); - + gpr.Unlock(rB, rC, rD); WriteRfiExitDestInR(rA); // rA gets unlocked here //AND(32, M(&MSR), Imm32((~mask) & clearMSR13)); @@ -110,7 +108,7 @@ void JitArm::rfi(UGeckoInstruction inst) void JitArm::bx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) // We must always process the following sentence // even if the blocks are merged by PPCAnalyst::Flatten(). if (inst.LK) @@ -147,15 +145,20 @@ void JitArm::bx(UGeckoInstruction inst) // CALL(ProtectFunction(&CoreTiming::Idle, 0)); // JMP(Asm::testExceptions, true); // make idle loops go faster - js.downcountAmount += 8; + MOVI2R(R14, (u32)&CoreTiming::Idle); + BL(R14); + MOVI2R(R14, js.compilerPC); + STR(R14, R9, PPCSTATE_OFF(pc)); + MOVI2R(R14, (u32)asm_routines.testExceptions); + B(R14); } - WriteExit(destination, 0); + WriteExit(destination); } void JitArm::bcx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) // USES_CR _assert_msg_(DYNA_REC, js.isLastInstruction, "bcx not last instruction of block"); @@ -170,7 +173,7 @@ void JitArm::bcx(UGeckoInstruction inst) LDR(rB, R9, PPCSTATE_OFF(spr[SPR_CTR])); SUBS(rB, rB, 1); STR(rB, R9, PPCSTATE_OFF(spr[SPR_CTR])); - + //SUB(32, M(&CTR), Imm8(1)); if (inst.BO & BO_BRANCH_IF_CTR_0) pCTRDontBranch = B_CC(CC_NEQ); @@ -185,7 +188,7 @@ void JitArm::bcx(UGeckoInstruction inst) TST(rA, 8 >> (inst.BI & 3)); //TEST(8, M(&PowerPC::ppcState.cr_fast[inst.BI >> 2]), Imm8(8 >> (inst.BI & 3))); - if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch + if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch pConditionDontBranch = B_CC(CC_EQ); // Zero else pConditionDontBranch = B_CC(CC_NEQ); // Not Zero @@ -204,19 +207,19 @@ void JitArm::bcx(UGeckoInstruction inst) destination = SignExt16(inst.BD << 2); else destination = js.compilerPC + SignExt16(inst.BD << 2); - WriteExit(destination, 0); + WriteExit(destination); if ((inst.BO & BO_DONT_CHECK_CONDITION) == 0) SetJumpTarget( pConditionDontBranch ); if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0) SetJumpTarget( pCTRDontBranch ); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } void JitArm::bcctrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) gpr.Flush(); fpr.Flush(); @@ -230,7 +233,6 @@ void JitArm::bcctrx(UGeckoInstruction inst) //NPC = CTR & 0xfffffffc; ARMReg rA = gpr.GetReg(); - ARMReg rB = gpr.GetReg(); if(inst.LK_3) { @@ -239,10 +241,8 @@ void JitArm::bcctrx(UGeckoInstruction inst) STR(rA, R9, PPCSTATE_OFF(spr[SPR_LR])); // ARMABI_MOVI2M((u32)&LR, js.compilerPC + 4); } - MVN(rB, 0x3); // 0xFFFFFFFC LDR(rA, R9, PPCSTATE_OFF(spr[SPR_CTR])); - AND(rA, rA, rB); - gpr.Unlock(rB); + BIC(rA, rA, 0x3); WriteExitDestInR(rA); } else @@ -253,7 +253,7 @@ void JitArm::bcctrx(UGeckoInstruction inst) // BO_2 == 011zy -> b if true ARMReg rA = gpr.GetReg(); ARMReg rB = gpr.GetReg(); - + LDRB(rA, R9, PPCSTATE_OFF(cr_fast) + (inst.BI >> 2)); TST(rA, 8 >> (inst.BI & 3)); CCFlags branch; @@ -264,8 +264,7 @@ void JitArm::bcctrx(UGeckoInstruction inst) FixupBranch b = B_CC(branch); LDR(rA, R9, PPCSTATE_OFF(spr[SPR_CTR])); - MVN(rB, 0x3); // 0xFFFFFFFC - AND(rA, rA, rB); + BIC(rA, rA, 0x3); if (inst.LK_3){ u32 Jumpto = js.compilerPC + 4; @@ -277,13 +276,13 @@ void JitArm::bcctrx(UGeckoInstruction inst) WriteExitDestInR(rA); SetJumpTarget(b); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } } void JitArm::bclrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Branch) + JITDISABLE(bJITBranchOff) if (!js.isLastInstruction && (inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) { if (inst.LK) @@ -307,7 +306,7 @@ void JitArm::bclrx(UGeckoInstruction inst) LDR(rB, R9, PPCSTATE_OFF(spr[SPR_CTR])); SUBS(rB, rB, 1); STR(rB, R9, PPCSTATE_OFF(spr[SPR_CTR])); - + //SUB(32, M(&CTR), Imm8(1)); if (inst.BO & BO_BRANCH_IF_CTR_0) pCTRDontBranch = B_CC(CC_NEQ); @@ -321,7 +320,7 @@ void JitArm::bclrx(UGeckoInstruction inst) LDRB(rA, R9, PPCSTATE_OFF(cr_fast) + (inst.BI >> 2)); TST(rA, 8 >> (inst.BI & 3)); //TEST(8, M(&PowerPC::ppcState.cr_fast[inst.BI >> 2]), Imm8(8 >> (inst.BI & 3))); - if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch + if (inst.BO & BO_BRANCH_IF_TRUE) // Conditional branch pConditionDontBranch = B_CC(CC_EQ); // Zero else pConditionDontBranch = B_CC(CC_NEQ); // Not Zero @@ -334,11 +333,10 @@ void JitArm::bclrx(UGeckoInstruction inst) // AND(32, M(&PowerPC::ppcState.cr), Imm32(~(0xFF000000))); #endif - //MOV(32, R(EAX), M(&LR)); + //MOV(32, R(EAX), M(&LR)); //AND(32, R(EAX), Imm32(0xFFFFFFFC)); - MVN(rB, 0x3); // 0xFFFFFFFC LDR(rA, R9, PPCSTATE_OFF(spr[SPR_LR])); - AND(rA, rA, rB); + BIC(rA, rA, 0x3); if (inst.LK){ u32 Jumpto = js.compilerPC + 4; MOVI2R(rB, Jumpto); @@ -352,5 +350,5 @@ void JitArm::bclrx(UGeckoInstruction inst) SetJumpTarget( pConditionDontBranch ); if ((inst.BO & BO_DONT_DECREMENT_FLAG) == 0) SetJumpTarget( pCTRDontBranch ); - WriteExit(js.compilerPC + 4, 1); + WriteExit(js.compilerPC + 4); } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FPUtils.h b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FPUtils.h new file mode 100644 index 0000000000..52815f571b --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FPUtils.h @@ -0,0 +1,66 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. +#include "../Interpreter/Interpreter_FPUtils.h" + +#include "Jit.h" +#include "JitRegCache.h" +#include "JitFPRCache.h" +#include "JitAsm.h" + +static const double minmaxFloat[2] = {-(double)0x80000000, (double)0x7FFFFFFF}; +static const double doublenum = 0xfff8000000000000ull; + +// Exception masks +static Operand2 FRFIMask(5, 0x8); // 0x60000 +static Operand2 FIMask(2, 8); // 0x20000 +static Operand2 FRMask(4, 8); // 0x40000 +static Operand2 FXMask(2, 1); // 0x80000000 +static Operand2 VEMask(0x40, 0); // 0x40 + +static Operand2 XXException(2, 4); // 0x2000000 +static Operand2 CVIException(1, 0xC); // 0x100 +static Operand2 NANException(1, 4); // 0x1000000 +static Operand2 VXVCException(8, 8); // 0x80000 +static Operand2 ZXException(1, 3); // 0x4000000 +static Operand2 VXSQRTException(2, 5); // 0x200 + +inline void JitArm::SetFPException(ARMReg Reg, u32 Exception) +{ + Operand2 *ExceptionMask; + switch(Exception) + { + case FPSCR_VXCVI: + ExceptionMask = &CVIException; + break; + case FPSCR_XX: + ExceptionMask = &XXException; + break; + case FPSCR_VXSNAN: + ExceptionMask = &NANException; + break; + case FPSCR_VXVC: + ExceptionMask = &VXVCException; + break; + case FPSCR_ZX: + ExceptionMask = &ZXException; + break; + case FPSCR_VXSQRT: + ExceptionMask = &VXSQRTException; + break; + default: + _assert_msg_(DYNA_REC, false, "Passed unsupported FPexception: 0x%08x", Exception); + return; + break; + } + ARMReg rB = gpr.GetReg(); + MOV(rB, Reg); + ORR(Reg, Reg, *ExceptionMask); + CMP(rB, Reg); + SetCC(CC_NEQ); + ORR(Reg, Reg, FXMask); // If exception is set, set exception bit + SetCC(); + BIC(Reg, Reg, FRFIMask); + gpr.Unlock(rB); +} + diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp index 85ab5f3cae..28e9723333 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp @@ -16,7 +16,6 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -25,127 +24,713 @@ #include "../PPCTables.h" #include "ArmEmitter.h" #include "../../HW/Memmap.h" - +#include "JitArm_FPUtils.h" #include "Jit.h" #include "JitRegCache.h" #include "JitFPRCache.h" #include "JitAsm.h" -void JitArm::Helper_UpdateCR1(ARMReg value) +void JitArm::Helper_UpdateCR1(ARMReg fpscr, ARMReg temp) { - // Should just update exception flags, not do any compares. - PanicAlert("CR1"); + UBFX(temp, fpscr, 28, 4); + STRB(temp, R9, PPCSTATE_OFF(cr_fast[1])); +} + +void JitArm::fctiwx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 b = inst.FB; + u32 d = inst.FD; + + ARMReg vB = fpr.R0(b); + ARMReg vD = fpr.R0(d); + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + ARMReg V2 = fpr.GetReg(); + + ARMReg rA = gpr.GetReg(); + ARMReg fpscrReg = gpr.GetReg(); + + FixupBranch DoneMax, DoneMin; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + MOVI2R(rA, (u32)minmaxFloat); + + // Check if greater than max float + { + VLDR(V0, rA, 8); // Load Max + VCMPE(vB, V0); + VMRS(_PC); // Loads in to APSR + FixupBranch noException = B_CC(CC_LE); + VMOV(vD, V0); // Set to max + SetFPException(fpscrReg, FPSCR_VXCVI); + DoneMax = B(); + SetJumpTarget(noException); + } + // Check if less than min float + { + VLDR(V0, rA, 0); + VCMPE(vB, V0); + VMRS(_PC); + FixupBranch noException = B_CC(CC_GE); + VMOV(vD, V0); + SetFPException(fpscrReg, FPSCR_VXCVI); + DoneMin = B(); + SetJumpTarget(noException); + } + // Within ranges, convert to integer + // Set rounding mode first + // PPC <-> ARM rounding modes + // 0, 1, 2, 3 <-> 0, 3, 1, 2 + ARMReg rB = gpr.GetReg(); + VMRS(rA); + // Bits 22-23 + BIC(rA, rA, Operand2(3, 5)); + + LDR(rB, R9, PPCSTATE_OFF(fpscr)); + AND(rB, rB, 0x3); // Get the FPSCR rounding bits + CMP(rB, 1); + SetCC(CC_EQ); // zero + ORR(rA, rA, Operand2(3, 5)); + SetCC(CC_NEQ); + CMP(rB, 2); // +inf + SetCC(CC_EQ); + ORR(rA, rA, Operand2(1, 5)); + SetCC(CC_NEQ); + CMP(rB, 3); // -inf + SetCC(CC_EQ); + ORR(rA, rA, Operand2(2, 5)); + SetCC(); + VMSR(rA); + ORR(rA, rA, Operand2(3, 5)); + VCVT(vD, vB, TO_INT | IS_SIGNED); + VMSR(rA); + gpr.Unlock(rB); + VCMPE(vD, vB); + VMRS(_PC); + + SetCC(CC_EQ); + BIC(fpscrReg, fpscrReg, FRFIMask); + FixupBranch DoneEqual = B(); + SetCC(); + SetFPException(fpscrReg, FPSCR_XX); + ORR(fpscrReg, fpscrReg, FIMask); + VABS(V1, vB); + VABS(V2, vD); + VCMPE(V2, V1); + VMRS(_PC); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, FRMask); + SetCC(); + SetJumpTarget(DoneEqual); + + SetJumpTarget(DoneMax); + SetJumpTarget(DoneMin); + + MOVI2R(rA, (u32)&doublenum); + VLDR(V0, rA, 0); + NEONXEmitter nemit(this); + nemit.VORR(vD, vD, V0); + + if (inst.Rc) Helper_UpdateCR1(fpscrReg, rA); + + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(rA); + gpr.Unlock(fpscrReg); + fpr.Unlock(V0); + fpr.Unlock(V1); + fpr.Unlock(V2); +} + + +void JitArm::fctiwzx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 b = inst.FB; + u32 d = inst.FD; + + ARMReg vB = fpr.R0(b); + ARMReg vD = fpr.R0(d); + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + ARMReg V2 = fpr.GetReg(); + + ARMReg rA = gpr.GetReg(); + ARMReg fpscrReg = gpr.GetReg(); + + FixupBranch DoneMax, DoneMin; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + MOVI2R(rA, (u32)minmaxFloat); + + // Check if greater than max float + { + VLDR(V0, rA, 8); // Load Max + VCMPE(vB, V0); + VMRS(_PC); // Loads in to APSR + FixupBranch noException = B_CC(CC_LE); + VMOV(vD, V0); // Set to max + SetFPException(fpscrReg, FPSCR_VXCVI); + DoneMax = B(); + SetJumpTarget(noException); + } + // Check if less than min float + { + VLDR(V0, rA, 0); + VCMPE(vB, V0); + VMRS(_PC); + FixupBranch noException = B_CC(CC_GE); + VMOV(vD, V0); + SetFPException(fpscrReg, FPSCR_VXCVI); + DoneMin = B(); + SetJumpTarget(noException); + } + // Within ranges, convert to integer + VCVT(vD, vB, TO_INT | IS_SIGNED | ROUND_TO_ZERO); + VCMPE(vD, vB); + VMRS(_PC); + + SetCC(CC_EQ); + BIC(fpscrReg, fpscrReg, FRFIMask); + FixupBranch DoneEqual = B(); + SetCC(); + SetFPException(fpscrReg, FPSCR_XX); + ORR(fpscrReg, fpscrReg, FIMask); + VABS(V1, vB); + VABS(V2, vD); + VCMPE(V2, V1); + VMRS(_PC); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, FRMask); + SetCC(); + SetJumpTarget(DoneEqual); + + SetJumpTarget(DoneMax); + SetJumpTarget(DoneMin); + + MOVI2R(rA, (u32)&doublenum); + VLDR(V0, rA, 0); + NEONXEmitter nemit(this); + nemit.VORR(vD, vD, V0); + + if (inst.Rc) Helper_UpdateCR1(fpscrReg, rA); + + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(rA); + gpr.Unlock(fpscrReg); + fpr.Unlock(V0); + fpr.Unlock(V1); + fpr.Unlock(V2); +} + +void JitArm::fcmpo(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R0(a); + ARMReg vB = fpr.R0(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + + SetFPException(fpscrReg, FPSCR_VXVC); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + TST(fpscrReg, VEMask); + + FixupBranch noVXVC = B_CC(CC_NEQ); + SetFPException(fpscrReg, FPSCR_VXVC); + + SetJumpTarget(noVXVC); + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); +} + +void JitArm::fcmpu(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R0(a); + ARMReg vB = fpr.R0(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); } void JitArm::fabsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } - ARMReg vD = fpr.R0(inst.FD); ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); VABS(vD, vB); +} - if (inst.Rc) Helper_UpdateCR1(vD); +void JitArm::fnabsx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + + ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); + + VABS(vD, vB); + VNEG(vD, vD); +} + +void JitArm::fnegx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + + ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); + + VNEG(vD, vB); } void JitArm::faddsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } ARMReg vA = fpr.R0(inst.FA); ARMReg vB = fpr.R0(inst.FB); - ARMReg vD0 = fpr.R0(inst.FD); - ARMReg vD1 = fpr.R1(inst.FD); + ARMReg vD0 = fpr.R0(inst.FD, false); + ARMReg vD1 = fpr.R1(inst.FD, false); VADD(vD0, vA, vB); VMOV(vD1, vD0); - if (inst.Rc) Helper_UpdateCR1(vD0); } void JitArm::faddx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } - ARMReg vD = fpr.R0(inst.FD); ARMReg vA = fpr.R0(inst.FA); ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); VADD(vD, vA, vB); - if (inst.Rc) Helper_UpdateCR1(vD); } void JitArm::fsubsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) - + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + ARMReg vA = fpr.R0(inst.FA); ARMReg vB = fpr.R0(inst.FB); - ARMReg vD0 = fpr.R0(inst.FD); - ARMReg vD1 = fpr.R1(inst.FD); + ARMReg vD0 = fpr.R0(inst.FD, false); + ARMReg vD1 = fpr.R1(inst.FD, false); VSUB(vD0, vA, vB); VMOV(vD1, vD0); - if (inst.Rc) Helper_UpdateCR1(vD0); } void JitArm::fsubx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } - ARMReg vD = fpr.R0(inst.FD); ARMReg vA = fpr.R0(inst.FA); ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); VSUB(vD, vA, vB); - if (inst.Rc) Helper_UpdateCR1(vD); } -// Breaks Animal Crossing void JitArm::fmulsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) - - Default(inst); return; - + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + ARMReg vA = fpr.R0(inst.FA); ARMReg vC = fpr.R0(inst.FC); - ARMReg vD0 = fpr.R0(inst.FD); - ARMReg vD1 = fpr.R1(inst.FD); + ARMReg vD0 = fpr.R0(inst.FD, false); + ARMReg vD1 = fpr.R1(inst.FD, false); VMUL(vD0, vA, vC); VMOV(vD1, vD0); - if (inst.Rc) Helper_UpdateCR1(vD0); } void JitArm::fmulx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } - ARMReg vD0 = fpr.R0(inst.FD); ARMReg vA = fpr.R0(inst.FA); ARMReg vC = fpr.R0(inst.FC); + ARMReg vD0 = fpr.R0(inst.FD, false); VMUL(vD0, vA, vC); - if (inst.Rc) Helper_UpdateCR1(vD0); } void JitArm::fmrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } - ARMReg vD = fpr.R0(inst.FD); ARMReg vB = fpr.R0(inst.FB); + ARMReg vD = fpr.R0(inst.FD, false); VMOV(vD, vB); - - if (inst.Rc) Helper_UpdateCR1(vD); +} + +void JitArm::fmaddsx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + + VMOV(V0, vB0); + + VMLA(V0, vA0, vC0); + + VMOV(vD0, V0); + VMOV(vD1, V0); + + fpr.Unlock(V0); +} + +void JitArm::fmaddx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + if (inst.Rc) { + Default(inst); + return; + } + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + + ARMReg V0 = fpr.GetReg(); + + VMOV(V0, vB0); + + VMLA(V0, vA0, vC0); + + VMOV(vD0, V0); + + fpr.Unlock(V0); +} + +void JitArm::fnmaddx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); + return; + } + + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + + ARMReg V0 = fpr.GetReg(); + + VMOV(V0, vB0); + + VMLA(V0, vA0, vC0); + + VNEG(vD0, V0); + + fpr.Unlock(V0); +} +void JitArm::fnmaddsx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); + return; + } + + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + + VMOV(V0, vB0); + + VMLA(V0, vA0, vC0); + + VNEG(vD0, V0); + VNEG(vD1, V0); + + fpr.Unlock(V0); +} + +// XXX: Messes up Super Mario Sunshine title screen +void JitArm::fresx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + + u32 b = inst.FB, d = inst.FD; + + if (inst.Rc) { + Default(inst); + return; + } + + Default(inst); return; + + ARMReg vB0 = fpr.R0(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + MOVI2R(V0, 1.0, INVALID_REG); // temp reg isn't needed for 1.0 + + VDIV(vD1, V0, vB0); + VDIV(vD0, V0, vB0); + fpr.Unlock(V0); +} + +void JitArm::fselx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + + VCMP(vA0); + VMRS(_PC); + + FixupBranch GT0 = B_CC(CC_GE); + VMOV(vD0, vB0); + FixupBranch EQ0 = B(); + SetJumpTarget(GT0); + VMOV(vD0, vC0); + SetJumpTarget(EQ0); +} + +void JitArm::frsqrtex(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vB0 = fpr.R0(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg V0 = D1; + ARMReg rA = gpr.GetReg(); + + MOVI2R(fpscrReg, (u32)&PPC_NAN); + VLDR(V0, fpscrReg, 0); + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + + VCMP(vB0); + VMRS(_PC); + FixupBranch Less0 = B_CC(CC_LT); + VMOV(vD0, V0); + SetFPException(fpscrReg, FPSCR_VXSQRT); + FixupBranch SkipOrr0 = B(); + SetJumpTarget(Less0); + FixupBranch noException = B_CC(CC_EQ); + SetFPException(fpscrReg, FPSCR_ZX); + SetJumpTarget(noException); + SetJumpTarget(SkipOrr0); + + VCVT(S0, vB0, 0); + + NEONXEmitter nemit(this); + nemit.VRSQRTE(F_32, D0, D0); + VCVT(vD0, S0, 0); + + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, rA); } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp index e840d4dd49..4d79dc037e 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp @@ -15,7 +15,6 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -27,7 +26,6 @@ #include "JitRegCache.h" #include "JitAsm.h" extern u32 Helper_Mask(u8 mb, u8 me); -// ADDI and RLWINMX broken for now // Assumes that Sign and Zero flags were set by the last operation. Preserves all flags and registers. // Jit64 ComputerRC is signed @@ -81,6 +79,19 @@ void JitArm::ComputeCarry() STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); gpr.Unlock(tmp); } +void JitArm::ComputeCarry(bool Carry) +{ + ARMReg tmp = gpr.GetReg(); + Operand2 mask = Operand2(2, 2); // XER_CA_MASK + LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + if (Carry) + ORR(tmp, tmp, mask); + else + BIC(tmp, tmp, mask); + STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(tmp); + +} void JitArm::GetCarryAndClear(ARMReg reg) { @@ -105,87 +116,516 @@ void JitArm::FinalizeCarry(ARMReg reg) STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); gpr.Unlock(tmp); } - -void JitArm::addi(UGeckoInstruction inst) +// Wrong - prevents WW from loading in to a game and also inverted intro logos +void JitArm::subfic(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) + Default(inst); return; + int a = inst.RA, d = inst.RD; - u32 d = inst.RD, a = inst.RA; - if (a) + int imm = inst.SIMM_16; + if (d == a) { - if (gpr.IsImm(a)) + if (imm == 0) { - gpr.SetImmediate(d, gpr.GetImm(a) + inst.SIMM_16); - return; + ARMReg tmp = gpr.GetReg(); + Operand2 mask = Operand2(2, 2); // XER_CA_MASK + LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + BIC(tmp, tmp, mask); + // Flags act exactly like subtracting from 0 + RSBS(gpr.R(d), gpr.R(d), 0); + // Output carry is inverted + SetCC(CC_CC); + ORR(tmp, tmp, mask); + SetCC(); + STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(tmp); + } + else if (imm == -1) + { + // CA is always set in this case + ARMReg tmp = gpr.GetReg(); + Operand2 mask = Operand2(2, 2); // XER_CA_MASK + LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + ORR(tmp, tmp, mask); + STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(tmp); + + MVN(gpr.R(d), gpr.R(d)); + } + else + { + ARMReg tmp = gpr.GetReg(); + ARMReg rA = gpr.GetReg(); + Operand2 mask = Operand2(2, 2); // XER_CA_MASK + MOVI2R(rA, imm + 1); + LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + BIC(tmp, tmp, mask); + // Flags act exactly like subtracting from 0 + MVN(gpr.R(d), gpr.R(d)); + ADDS(gpr.R(d), gpr.R(d), rA); + // Output carry is inverted + SetCC(CC_CS); + ORR(tmp, tmp, mask); + SetCC(); + STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(tmp, rA); } - ARMReg rA = gpr.GetReg(false); - ARMReg RA = gpr.R(a); - ARMReg RD = gpr.R(d); - MOVI2R(rA, (u32)inst.SIMM_16); - ADD(RD, RA, rA); } else - gpr.SetImmediate(d, inst.SIMM_16); -} -void JitArm::addis(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - - u32 d = inst.RD, a = inst.RA; - if (a) { - if (gpr.IsImm(a)) - { - gpr.SetImmediate(d, gpr.GetImm(a) + (inst.SIMM_16 << 16)); - return; - } - ARMReg rA = gpr.GetReg(false); - ARMReg RA = gpr.R(a); - ARMReg RD = gpr.R(d); - MOVI2R(rA, inst.SIMM_16 << 16); - ADD(RD, RA, rA); + ARMReg tmp = gpr.GetReg(); + Operand2 mask = Operand2(2, 2); // XER_CA_MASK + MOVI2R(gpr.R(d), imm); + LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + BIC(tmp, tmp, mask); + // Flags act exactly like subtracting from 0 + SUBS(gpr.R(d), gpr.R(d), gpr.R(a)); + // Output carry is inverted + SetCC(CC_CC); + ORR(tmp, tmp, mask); + SetCC(); + STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(tmp); } - else - gpr.SetImmediate(d, inst.SIMM_16 << 16); + // This instruction has no RC flag } -void JitArm::addx(UGeckoInstruction inst) + +u32 Add(u32 a, u32 b) {return a + b;} +u32 Sub(u32 a, u32 b) {return a - b;} +u32 Mul(u32 a, u32 b) {return a * b;} +u32 Or (u32 a, u32 b) {return a | b;} +u32 And(u32 a, u32 b) {return a & b;} +u32 Xor(u32 a, u32 b) {return a ^ b;} + +void JitArm::arith(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, b = inst.RB, d = inst.RD; - - if (gpr.IsImm(a) && gpr.IsImm(b)) + JITDISABLE(bJITIntegerOff) + + u32 a = inst.RA, b = inst.RB, d = inst.RD, s = inst.RS; + ARMReg RA, RB, RD, RS; + bool isImm[2] = {false, false}; // Arg1 & Arg2 + u32 Imm[2] = {0, 0}; + bool Rc = false; + bool carry = false; + bool isUnsigned = false; + bool shiftedImm = false; + + switch (inst.OPCD) { - gpr.SetImmediate(d, gpr.GetImm(a) + gpr.GetImm(b)); - if (inst.Rc) ComputeRC(gpr.GetImm(d), 0); + case 7: // mulli + if (gpr.IsImm(a)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(a); + } + isImm[1] = true; + Imm[1] = inst.SIMM_16; + break; + case 13: // addic_rc + Rc = true; + case 12: // addic + if (gpr.IsImm(a)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(a); + } + isImm[1] = true; + Imm[1] = inst.SIMM_16; + carry = true; + break; + case 15: // addis + shiftedImm = true; + case 14: // addi + if (a) + { + if (gpr.IsImm(a)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(a); + } + } + else + { + isImm[0] = true; + Imm[0] = 0; + } + isImm[1] = true; + Imm[1] = inst.SIMM_16 << (shiftedImm ? 16 : 0); + break; + case 25: // oris + shiftedImm = true; + case 24: // ori + if (gpr.IsImm(s)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(s); + } + isImm[1] = true; + Imm[1] = inst.UIMM << (shiftedImm ? 16 : 0); + break; + case 27: // xoris + shiftedImm = true; + case 26: // xori + if (gpr.IsImm(s)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(s); + } + isImm[1] = true; + Imm[1] = inst.UIMM << (shiftedImm ? 16 : 0); + break; + case 29: // andis_rc + shiftedImm = true; + case 28: // andi_rc + if (gpr.IsImm(s)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(s); + } + isImm[1] = true; + Imm[1] = inst.UIMM << (shiftedImm ? 16 : 0); + Rc = true; + break; + + case 31: // addcx, addx, subfx + switch(inst.SUBOP10) + { + case 24: // slwx + case 28: // andx + case 60: // andcx + case 124: // norx + case 284: // eqvx + case 316: // xorx + case 412: // orcx + case 444: // orx + case 476: // nandx + case 536: // srwx + case 792: // srawx + if (gpr.IsImm(s)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(s); + } + if (gpr.IsImm(b)) + { + isImm[1] = true; + Imm[1] = gpr.GetImm(b); + } + Rc = inst.Rc; + break; + + case 10: // addcx + carry = true; + case 40: // subfx + isUnsigned = true; + case 235: // mullwx + case 266: + case 747: // mullwox + case 778: // both addx + if (gpr.IsImm(a)) + { + isImm[0] = true; + Imm[0] = gpr.GetImm(a); + } + if (gpr.IsImm(b)) + { + isImm[1] = true; + Imm[1] = gpr.GetImm(b); + } + Rc = inst.Rc; + break; + } + break; + default: + WARN_LOG(DYNA_REC, "Unkown OPCD %d with arith function", inst.OPCD); + Default(inst); return; + break; + } + if (isImm[0] && isImm[1]) // Immediate propagation + { + bool hasCarry = false; + u32 dest = d; + switch(inst.OPCD) + { + case 7: + gpr.SetImmediate(d, Mul(Imm[0], Imm[1])); + break; + case 12: + case 13: + gpr.SetImmediate(d, Add(Imm[0], Imm[1])); + hasCarry = Interpreter::Helper_Carry(Imm[0], Imm[1]); + break; + case 14: + case 15: + gpr.SetImmediate(d, Add(Imm[0], Imm[1])); + hasCarry = Interpreter::Helper_Carry(Imm[0], Imm[1]); + break; + case 24: + case 25: + gpr.SetImmediate(a, Or(Imm[0], Imm[1])); + dest = a; + break; + case 26: + case 27: + gpr.SetImmediate(a, Xor(Imm[0], Imm[1])); + dest = a; + break; + case 28: + case 29: + gpr.SetImmediate(a, And(Imm[0], Imm[1])); + dest = a; + break; + case 31: // addcx, addx, subfx + switch(inst.SUBOP10) + { + case 24: + gpr.SetImmediate(a, Imm[0] << Imm[1]); + dest = a; + break; + case 28: + gpr.SetImmediate(a, And(Imm[0], Imm[1])); + dest = a; + break; + case 40: // subfx + gpr.SetImmediate(d, Sub(Imm[1], Imm[0])); + break; + case 60: + gpr.SetImmediate(a, And(Imm[1], ~Imm[0])); + dest = a; + break; + case 124: + gpr.SetImmediate(a, ~Or(Imm[0], Imm[1])); + dest = a; + break; + case 747: + case 235: + gpr.SetImmediate(d, Mul(Imm[0], Imm[1])); + break; + case 284: + gpr.SetImmediate(a, ~Xor(Imm[0], Imm[1])); + dest = a; + break; + case 316: + gpr.SetImmediate(a, Xor(Imm[0], Imm[1])); + dest = a; + break; + case 412: + gpr.SetImmediate(a, Or(Imm[0], ~Imm[1])); + dest = a; + break; + case 444: + gpr.SetImmediate(a, Or(Imm[0], Imm[1])); + dest = a; + break; + case 476: + gpr.SetImmediate(a, ~And(Imm[1], Imm[0])); + dest = a; + break; + case 536: + gpr.SetImmediate(a, Imm[0] >> Imm[1]); + dest = a; + break; + case 792: + gpr.SetImmediate(a, ((s32)Imm[0]) >> Imm[1]); + dest = a; + break; + case 10: // addcx + case 266: + case 778: // both addx + gpr.SetImmediate(d, Add(Imm[0], Imm[1])); + hasCarry = Interpreter::Helper_Carry(Imm[0], Imm[1]); + break; + } + break; + } + if (carry) ComputeCarry(hasCarry); + if (Rc) ComputeRC(gpr.GetImm(dest), 0); return; } - ARMReg RA = gpr.R(a); - ARMReg RB = gpr.R(b); - ARMReg RD = gpr.R(d); - ADDS(RD, RA, RB); - if (inst.Rc) ComputeRC(); + // One or the other isn't a IMM + switch(inst.OPCD) + { + case 7: + { + ARMReg rA = gpr.GetReg(); + RD = gpr.R(d); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + MUL(RD, RA, rA); + gpr.Unlock(rA); + } + break; + case 12: + case 13: + { + ARMReg rA = gpr.GetReg(); + RD = gpr.R(d); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + ADDS(RD, RA, rA); + gpr.Unlock(rA); + } + break; + case 14: + case 15: // Arg2 is always Imm + if (!isImm[0]) + { + ARMReg rA = gpr.GetReg(); + RD = gpr.R(d); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + ADD(RD, RA, rA); + gpr.Unlock(rA); + } + else + gpr.SetImmediate(d, Imm[1]); + break; + case 24: + case 25: + { + ARMReg rA = gpr.GetReg(); + RS = gpr.R(s); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + ORR(RA, RS, rA); + gpr.Unlock(rA); + } + break; + case 26: + case 27: + { + ARMReg rA = gpr.GetReg(); + RS = gpr.R(s); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + EOR(RA, RS, rA); + gpr.Unlock(rA); + } + + break; + case 28: + case 29: + { + ARMReg rA = gpr.GetReg(); + RS = gpr.R(s); + RA = gpr.R(a); + MOVI2R(rA, Imm[1]); + ANDS(RA, RS, rA); + gpr.Unlock(rA); + } + break; + case 31: + switch(inst.SUBOP10) + { + case 24: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + LSLS(RA, RS, RB); + break; + case 28: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + ANDS(RA, RS, RB); + break; + case 40: // subfx + RD = gpr.R(d); + RA = gpr.R(a); + RB = gpr.R(b); + SUBS(RD, RB, RA); + break; + case 60: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + BICS(RA, RS, RB); + break; + case 124: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + ORR(RA, RS, RB); + MVNS(RA, RA); + break; + case 747: + case 235: + RD = gpr.R(d); + RA = gpr.R(a); + RB = gpr.R(b); + MULS(RD, RA, RB); + break; + case 284: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + EOR(RA, RS, RB); + MVNS(RA, RA); + break; + case 316: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + EORS(RA, RS, RB); + break; + case 412: + { + ARMReg rA = gpr.GetReg(); + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + MVN(rA, RB); + ORRS(RA, RS, rA); + gpr.Unlock(rA); + } + break; + case 444: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + ORRS(RA, RS, RB); + break; + case 476: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + AND(RA, RS, RB); + MVNS(RA, RA); + break; + case 536: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + LSRS(RA, RS, RB); + break; + case 792: + RA = gpr.R(a); + RS = gpr.R(s); + RB = gpr.R(b); + ASRS(RA, RS, RB); + break; + case 10: // addcx + case 266: + case 778: // both addx + RD = gpr.R(d); + RA = gpr.R(a); + RB = gpr.R(b); + ADDS(RD, RA, RB); + break; + } + break; + } + if (carry) ComputeCarry(); + if (Rc) isUnsigned ? GenerateRC() : ComputeRC(); } -void JitArm::addcx(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, b = inst.RB, d = inst.RD; - - ARMReg RA = gpr.R(a); - ARMReg RB = gpr.R(b); - ARMReg RD = gpr.R(d); - ADDS(RD, RA, RB); - ComputeCarry(); - if (inst.Rc) ComputeRC(); -} void JitArm::addex(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 a = inst.RA, b = inst.RB, d = inst.RD; Default(inst); return; ARMReg RA = gpr.R(a); @@ -199,65 +639,26 @@ void JitArm::addex(UGeckoInstruction inst) gpr.Unlock(rA); } -void JitArm::subfx(UGeckoInstruction inst) +void JitArm::cntlzwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) + u32 a = inst.RA, s = inst.RS; - u32 a = inst.RA, b = inst.RB, d = inst.RD; - - if (inst.OE) PanicAlert("OE: subfx"); - - if (gpr.IsImm(a) && gpr.IsImm(b)) + ARMReg RA = gpr.R(a); + ARMReg RS = gpr.R(s); + CLZ(RA, RS); + if (inst.Rc) { - gpr.SetImmediate(d, gpr.GetImm(b) - gpr.GetImm(a)); - if (inst.Rc) ComputeRC(gpr.GetImm(d), 0); - return; + CMP(RA, 0); + ComputeRC(); } - ARMReg RA = gpr.R(a); - ARMReg RB = gpr.R(b); - ARMReg RD = gpr.R(d); - SUBS(RD, RB, RA); - if (inst.Rc) GenerateRC(); -} -void JitArm::mulli(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, d = inst.RD; - - if (gpr.IsImm(a)) - { - gpr.SetImmediate(d, gpr.GetImm(a) * inst.SIMM_16); - return; - } - ARMReg RA = gpr.R(a); - ARMReg RD = gpr.R(d); - ARMReg rA = gpr.GetReg(); - MOVI2R(rA, inst.SIMM_16); - MUL(RD, RA, rA); - gpr.Unlock(rA); -} - -void JitArm::mullwx(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - - u32 a = inst.RA, b = inst.RB, d = inst.RD; - - ARMReg RA = gpr.R(a); - ARMReg RB = gpr.R(b); - ARMReg RD = gpr.R(d); - MULS(RD, RA, RB); - if (inst.OE) PanicAlert("OE: mullwx"); - if (inst.Rc) ComputeRC(); } void JitArm::mulhwux(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 a = inst.RA, b = inst.RB, d = inst.RD; @@ -269,155 +670,16 @@ void JitArm::mulhwux(UGeckoInstruction inst) if (inst.Rc) ComputeRC(); } -void JitArm::ori(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, s = inst.RS; - - if (gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) | inst.UIMM); - return; - } - ARMReg RA = gpr.R(a); - ARMReg RS = gpr.R(s); - ARMReg rA = gpr.GetReg(); - MOVI2R(rA, inst.UIMM); - ORR(RA, RS, rA); - gpr.Unlock(rA); -} -void JitArm::oris(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, s = inst.RS; - - if (gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) | (inst.UIMM << 16)); - return; - } - ARMReg RA = gpr.R(a); - ARMReg RS = gpr.R(s); - ARMReg rA = gpr.GetReg(); - MOVI2R(rA, inst.UIMM << 16); - ORR(RA, RS, rA); - gpr.Unlock(rA); -} - -void JitArm::orx(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - u32 a = inst.RA, b = inst.RB, s = inst.RS; - - if (gpr.IsImm(b) && gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) | gpr.GetImm(b)); - if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); - return; - } - ARMReg rA = gpr.R(a); - ARMReg rB = gpr.R(b); - ARMReg rS = gpr.R(s); - ORRS(rA, rS, rB); - if (inst.Rc) - ComputeRC(); -} - -void JitArm::xorx(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Integer) - - u32 a = inst.RA, b = inst.RB, s = inst.RS; - - if (gpr.IsImm(b) && gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) ^ gpr.GetImm(b)); - if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); - return; - } - ARMReg rA = gpr.R(a); - ARMReg rB = gpr.R(b); - ARMReg rS = gpr.R(s); - EORS(rA, rS, rB); - if (inst.Rc) - ComputeRC(); -} - -void JitArm::andx(UGeckoInstruction inst) -{ - u32 a = inst.RA, b = inst.RB, s = inst.RS; - - if (gpr.IsImm(s) && gpr.IsImm(b)) - { - gpr.SetImmediate(a, gpr.GetImm(s) & gpr.GetImm(b)); - if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); - return; - } - ARMReg rA = gpr.R(a); - ARMReg rB = gpr.R(b); - ARMReg rS = gpr.R(s); - - ANDS(rA, rS, rB); - - if (inst.Rc) ComputeRC(); -} - -void JitArm::andi_rc(UGeckoInstruction inst) -{ - u32 a = inst.RA, s = inst.RS; - - if (gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) & inst.UIMM); - ComputeRC(gpr.GetImm(a), 0); - return; - } - ARMReg rA = gpr.R(a); - ARMReg rS = gpr.R(s); - ARMReg RA = gpr.GetReg(); - - MOVI2R(RA, inst.UIMM); - ANDS(rA, rS, RA); - - ComputeRC(); - gpr.Unlock(RA); -} - -void JitArm::andis_rc(UGeckoInstruction inst) -{ - u32 a = inst.RA, s = inst.RS; - - if (gpr.IsImm(s)) - { - gpr.SetImmediate(a, gpr.GetImm(s) & ((u32)inst.UIMM << 16)); - ComputeRC(gpr.GetImm(a), 0); - return; - } - ARMReg rA = gpr.R(a); - ARMReg rS = gpr.R(s); - ARMReg RA = gpr.GetReg(); - - MOVI2R(RA, (u32)inst.UIMM << 16); - ANDS(rA, rS, RA); - - ComputeRC(); - gpr.Unlock(RA); -} - void JitArm::extshx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 a = inst.RA, s = inst.RS; if (gpr.IsImm(s)) { gpr.SetImmediate(a, (u32)(s32)(s16)gpr.GetImm(s)); - if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); + if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); return; } ARMReg rA = gpr.R(a); @@ -431,13 +693,13 @@ void JitArm::extshx(UGeckoInstruction inst) void JitArm::extsbx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 a = inst.RA, s = inst.RS; if (gpr.IsImm(s)) { gpr.SetImmediate(a, (u32)(s32)(s8)gpr.GetImm(s)); - if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); + if (inst.Rc) ComputeRC(gpr.GetImm(a), 0); return; } ARMReg rA = gpr.R(a); @@ -451,14 +713,14 @@ void JitArm::extsbx(UGeckoInstruction inst) void JitArm::cmp (UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int crf = inst.CRFD; u32 a = inst.RA, b = inst.RB; if (gpr.IsImm(a) && gpr.IsImm(b)) { - ComputeRC((s32)gpr.GetImm(a) - (s32)gpr.GetImm(b), crf); + ComputeRC((s32)gpr.GetImm(a) - (s32)gpr.GetImm(b), crf); return; } @@ -471,7 +733,7 @@ void JitArm::cmp (UGeckoInstruction inst) void JitArm::cmpi(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 a = inst.RA; int crf = inst.CRFD; if (gpr.IsImm(a)) @@ -494,7 +756,7 @@ void JitArm::cmpi(UGeckoInstruction inst) void JitArm::cmpl(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) ARMReg RA = gpr.R(inst.RA); ARMReg RB = gpr.R(inst.RB); @@ -503,7 +765,7 @@ void JitArm::cmpl(UGeckoInstruction inst) CMP(RA, RB); // Unsigned GenerateRC() - + MOV(rA, 0x2); // Result == 0 SetCC(CC_LO); MOV(rA, 0x8); // Result < 0 SetCC(CC_HI); MOV(rA, 0x4); // Result > 0 @@ -516,7 +778,7 @@ void JitArm::cmpl(UGeckoInstruction inst) void JitArm::cmpli(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) ARMReg RA = gpr.R(inst.RA); ARMReg rA = gpr.GetReg(); @@ -532,7 +794,7 @@ void JitArm::cmpli(UGeckoInstruction inst) CMP(RA, rA); } // Unsigned GenerateRC() - + MOV(rA, 0x2); // Result == 0 SetCC(CC_LO); MOV(rA, 0x8); // Result < 0 SetCC(CC_HI); MOV(rA, 0x4); // Result > 0 @@ -546,7 +808,7 @@ void JitArm::cmpli(UGeckoInstruction inst) void JitArm::negx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) ARMReg RA = gpr.R(inst.RA); ARMReg RD = gpr.R(inst.RD); @@ -565,7 +827,7 @@ void JitArm::negx(UGeckoInstruction inst) void JitArm::rlwimix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 mask = Helper_Mask(inst.MB,inst.ME); ARMReg RA = gpr.R(inst.RA); @@ -580,7 +842,7 @@ void JitArm::rlwimix(UGeckoInstruction inst) BIC (rB, RA, rA); // RA & ~mask AND (rA, rA, Shift); ORRS(RA, rB, rA); - GenerateRC(); + GenerateRC(); } else { @@ -590,10 +852,11 @@ void JitArm::rlwimix(UGeckoInstruction inst) } gpr.Unlock(rA, rB); } + void JitArm::rlwinmx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) u32 mask = Helper_Mask(inst.MB,inst.ME); ARMReg RA = gpr.R(inst.RA); @@ -605,7 +868,7 @@ void JitArm::rlwinmx(UGeckoInstruction inst) if (inst.Rc) { ANDS(RA, rA, Shift); - GenerateRC(); + GenerateRC(); } else AND (RA, rA, Shift); @@ -613,21 +876,49 @@ void JitArm::rlwinmx(UGeckoInstruction inst) //m_GPR[inst.RA] = _rotl(m_GPR[inst.RS],inst.SH) & mask; } +void JitArm::rlwnmx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITIntegerOff) + + u32 mask = Helper_Mask(inst.MB,inst.ME); + ARMReg RA = gpr.R(inst.RA); + ARMReg RS = gpr.R(inst.RS); + ARMReg RB = gpr.R(inst.RB); + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + MOVI2R(rA, mask); + + // PPC rotates left, ARM rotates right. Swap it + MOV(rB, 32); + SUB(rB, rB, RB); + + Operand2 Shift(RS, ST_ROR, rB); // Register shifted register + if (inst.Rc) + { + ANDS(RA, rA, Shift); + GenerateRC(); + } + else + AND (RA, rA, Shift); + gpr.Unlock(rA, rB); +} + void JitArm::srawix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int a = inst.RA; int s = inst.RS; int amount = inst.SH; + if (amount != 0) { - Default(inst); return; ARMReg RA = gpr.R(a); ARMReg RS = gpr.R(s); ARMReg tmp = gpr.GetReg(); Operand2 mask = Operand2(2, 2); // XER_CA_MASK - + MOV(tmp, RS); ASRS(RA, RS, amount); if (inst.Rc) @@ -637,7 +928,7 @@ void JitArm::srawix(UGeckoInstruction inst) LDR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); BIC(tmp, tmp, mask); - SetCC(CC_EQ); + SetCC(CC_NEQ); ORR(tmp, tmp, mask); SetCC(); STR(tmp, R9, PPCSTATE_OFF(spr[SPR_XER])); diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp index 2efb6d5c7c..3983772aa6 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStore.cpp @@ -16,7 +16,6 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -31,332 +30,419 @@ #include "JitRegCache.h" #include "JitAsm.h" -void JitArm::stb(UGeckoInstruction inst) +void JitArm::UnsafeStoreFromReg(ARMReg dest, ARMReg value, int accessSize, s32 offset) { - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg RS = gpr.R(inst.RS); - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); - - MOV(ValueReg, RS); - if (inst.RA) + // All this gets replaced on backpatch + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(dest, dest, mask); // 1 + MOVI2R(R14, (u32)Memory::base, false); // 2-3 + ADD(dest, dest, R14); // 4 + switch (accessSize) { - MOVI2R(Addr, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(Addr, Addr, RA); + case 32: + REV(value, value); // 5 + break; + case 16: + REV16(value, value); + break; + case 8: + NOP(1); + break; } - else - MOVI2R(Addr, (u32)inst.SIMM_16); - - MOVI2R(Function, (u32)&Memory::Write_U8); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - gpr.Unlock(ValueReg, Addr, Function); -} - -void JitArm::stbu(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - ARMReg RA = gpr.R(inst.RA); - ARMReg RS = gpr.R(inst.RS); - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); - - MOVI2R(Addr, inst.SIMM_16); - ADD(Addr, Addr, RA); - - // Check for DSI exception prior to writing back address - LDR(Function, R9, PPCSTATE_OFF(Exceptions)); - CMP(Function, EXCEPTION_DSI); - FixupBranch DoNotWrite = B_CC(CC_EQ); - MOV(RA, Addr); - SetJumpTarget(DoNotWrite); - - MOV(ValueReg, RS); - - MOVI2R(Function, (u32)&Memory::Write_U8); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - - gpr.Unlock(ValueReg, Addr, Function); -} -void JitArm::sth(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg RS = gpr.R(inst.RS); - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); - - MOV(ValueReg, RS); - if (inst.RA) + switch (accessSize) { - MOVI2R(Addr, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(Addr, Addr, RA); + case 32: + STR(value, dest); // 6 + break; + case 16: + STRH(value, dest); + break; + case 8: + STRB(value, dest); + break; } - else - MOVI2R(Addr, (u32)inst.SIMM_16); - - MOVI2R(Function, (u32)&Memory::Write_U16); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - gpr.Unlock(ValueReg, Addr, Function); -} -void JitArm::sthu(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg RA = gpr.R(inst.RA); - ARMReg RS = gpr.R(inst.RS); - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); - - MOVI2R(Addr, inst.SIMM_16); - ADD(Addr, Addr, RA); - - // Check for DSI exception prior to writing back address - LDR(Function, R9, PPCSTATE_OFF(Exceptions)); - CMP(Function, EXCEPTION_DSI); - FixupBranch DoNotWrite = B_CC(CC_EQ); - MOV(RA, Addr); - SetJumpTarget(DoNotWrite); - - MOV(ValueReg, RS); - - MOVI2R(Function, (u32)&Memory::Write_U16); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - - gpr.Unlock(ValueReg, Addr, Function); + NOP(1); // 7 } -void JitArm::stw(UGeckoInstruction inst) +void JitArm::SafeStoreFromReg(bool fastmem, s32 dest, u32 value, s32 regOffset, int accessSize, s32 offset) { - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg RS = gpr.R(inst.RS); + if (Core::g_CoreStartupParameter.bFastmem && fastmem) { - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); + ARMReg RA; + ARMReg RB; + ARMReg RS = gpr.R(value); - MOV(ValueReg, RS); - if (inst.RA) + if (dest != -1) + RA = gpr.R(dest); + + if (regOffset != -1) { - MOVI2R(Addr, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(Addr, Addr, RA); + RB = gpr.R(regOffset); + MOV(R10, RB); + NOP(1); } else - MOVI2R(Addr, (u32)inst.SIMM_16); - - MOVI2R(Function, (u32)&Memory::Write_U32); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - gpr.Unlock(ValueReg, Addr, Function); + MOVI2R(R10, (u32)offset, false); + + if (dest != -1) + ADD(R10, R10, RA); + else + NOP(1); + + MOV(R12, RS); + UnsafeStoreFromReg(R10, R12, accessSize, 0); + return; } -} -void JitArm::stwu(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg RA = gpr.R(inst.RA); - ARMReg RS = gpr.R(inst.RS); - ARMReg ValueReg = gpr.GetReg(); - ARMReg Addr = gpr.GetReg(); - ARMReg Function = gpr.GetReg(); - - MOVI2R(Addr, inst.SIMM_16); - ADD(Addr, Addr, RA); - - // Check for DSI exception prior to writing back address - LDR(Function, R9, PPCSTATE_OFF(Exceptions)); - CMP(Function, EXCEPTION_DSI); - FixupBranch DoNotWrite = B_CC(CC_EQ); - MOV(RA, Addr); - SetJumpTarget(DoNotWrite); - - MOV(ValueReg, RS); - - MOVI2R(Function, (u32)&Memory::Write_U32); - PUSH(4, R0, R1, R2, R3); - MOV(R0, ValueReg); - MOV(R1, Addr); - BL(Function); - POP(4, R0, R1, R2, R3); - - gpr.Unlock(ValueReg, Addr, Function); -} -void JitArm::lbz(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - ARMReg rA = gpr.GetReg(); ARMReg rB = gpr.GetReg(); - ARMReg RD = gpr.R(inst.RD); - LDR(rA, R9, PPCSTATE_OFF(Exceptions)); - CMP(rA, EXCEPTION_DSI); - FixupBranch DoNotLoad = B_CC(CC_EQ); + ARMReg rC = gpr.GetReg(); + ARMReg RA; + ARMReg RB; + if (dest != -1) + RA = gpr.R(dest); + if (regOffset != -1) + RB = gpr.R(regOffset); + ARMReg RS = gpr.R(value); + switch(accessSize) { - if (inst.RA) - { - MOVI2R(rB, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(rB, rB, RA); - } - else - MOVI2R(rB, (u32)inst.SIMM_16); - - MOVI2R(rA, (u32)&Memory::Read_U8); - PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); - BL(rA); - MOV(rA, R0); - POP(4, R0, R1, R2, R3); - MOV(RD, rA); - gpr.Unlock(rA, rB); + case 32: + MOVI2R(rA, (u32)&Memory::Write_U32); + break; + case 16: + MOVI2R(rA, (u32)&Memory::Write_U16); + break; + case 8: + MOVI2R(rA, (u32)&Memory::Write_U8); + break; } - SetJumpTarget(DoNotLoad); -} + MOV(rB, RS); + if (regOffset == -1) + MOVI2R(rC, offset); + else + MOV(rC, RB); + if (dest != -1) + ADD(rC, rC, RA); -void JitArm::lhz(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg rA = gpr.GetReg(); - ARMReg rB = gpr.GetReg(); - ARMReg RD = gpr.R(inst.RD); - LDR(rA, R9, PPCSTATE_OFF(Exceptions)); - CMP(rA, EXCEPTION_DSI); - FixupBranch DoNotLoad = B_CC(CC_EQ); - if (inst.RA) - { - MOVI2R(rB, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(rB, rB, RA); - } - else - MOVI2R(rB, (u32)inst.SIMM_16); - - MOVI2R(rA, (u32)&Memory::Read_U16); PUSH(4, R0, R1, R2, R3); MOV(R0, rB); + MOV(R1, rC); BL(rA); + POP(4, R0, R1, R2, R3); + gpr.Unlock(rA, rB, rC); +} + +void JitArm::stX(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStoreOff) + + u32 a = inst.RA, b = inst.RB, s = inst.RS; + s32 offset = inst.SIMM_16; + u32 accessSize = 0; + s32 regOffset = -1; + bool zeroA = true; + bool update = false; + bool fastmem = false; + switch(inst.OPCD) + { + case 45: // sthu + update = true; + case 44: // sth + accessSize = 16; + break; + case 31: + switch (inst.SUBOP10) + { + case 183: // stwux + zeroA = false; + update = true; + case 151: // stwx + fastmem = true; + accessSize = 32; + regOffset = b; + break; + case 247: // stbux + zeroA = false; + update = true; + case 215: // stbx + accessSize = 8; + regOffset = b; + break; + case 439: // sthux + zeroA = false; + update = true; + case 407: // sthx + accessSize = 16; + regOffset = b; + break; + } + break; + case 37: // stwu + update = true; + case 36: // stw + fastmem = true; + accessSize = 32; + break; + case 39: // stbu + update = true; + case 38: // stb + accessSize = 8; + break; + } + SafeStoreFromReg(fastmem, zeroA ? a ? a : -1 : a, s, regOffset, accessSize, offset); + if (update) + { + ARMReg rA = gpr.GetReg(); + ARMReg RB; + ARMReg RA = gpr.R(a); + if (regOffset != -1) + RB = gpr.R(regOffset); + // Check for DSI exception prior to writing back address + LDR(rA, R9, PPCSTATE_OFF(Exceptions)); + CMP(rA, EXCEPTION_DSI); + FixupBranch DoNotWrite = B_CC(CC_EQ); + if (a) + { + if (regOffset == -1) + MOVI2R(rA, offset); + else + MOV(rA, RB); + ADD(RA, RA, rA); + } + else + if (regOffset == -1) + MOVI2R(RA, (u32)offset); + else + MOV(RA, RB); + SetJumpTarget(DoNotWrite); + gpr.Unlock(rA); + } +} + +void JitArm::UnsafeLoadToReg(ARMReg dest, ARMReg addr, int accessSize, s32 offset) +{ + ARMReg rA = gpr.GetReg(); + MOVI2R(rA, offset, false); // -3 + ADD(addr, addr, rA); // - 1 + + // All this gets replaced on backpatch + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(addr, addr, mask); // 1 + MOVI2R(rA, (u32)Memory::base, false); // 2-3 + ADD(addr, addr, rA); // 4 + switch (accessSize) + { + case 32: + LDR(dest, addr); // 5 + break; + case 16: + LDRH(dest, addr); + break; + case 8: + LDRB(dest, addr); + break; + } + switch (accessSize) + { + case 32: + REV(dest, dest); // 6 + break; + case 16: + REV16(dest, dest); + break; + case 8: + NOP(1); + break; + + } + NOP(2); // 7-8 + gpr.Unlock(rA); +} + +void JitArm::SafeLoadToReg(bool fastmem, u32 dest, s32 addr, s32 offsetReg, int accessSize, s32 offset, bool signExtend, bool reverse) +{ + ARMReg RD = gpr.R(dest); + if (Core::g_CoreStartupParameter.bFastmem && fastmem) + { + if (addr != -1) + MOV(R10, gpr.R(addr)); + else + MOV(R10, 0); + + UnsafeLoadToReg(RD, R10, accessSize, offset); + return; + } + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + + if (offsetReg == -1) + MOVI2R(rA, offset); + else + MOV(rA, gpr.R(offsetReg)); + + if (addr != -1) + ADD(rA, rA, gpr.R(addr)); + + switch (accessSize) + { + case 8: + MOVI2R(rB, (u32)&Memory::Read_U8); + break; + case 16: + MOVI2R(rB, (u32)&Memory::Read_U16); + break; + case 32: + MOVI2R(rB, (u32)&Memory::Read_U32); + break; + } + PUSH(4, R0, R1, R2, R3); + MOV(R0, rA); + BL(rB); MOV(rA, R0); POP(4, R0, R1, R2, R3); MOV(RD, rA); - gpr.Unlock(rA, rB); - SetJumpTarget(DoNotLoad); -} -void JitArm::lha(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStore) - - ARMReg rA = gpr.GetReg(); - ARMReg rB = gpr.GetReg(); - ARMReg RD = gpr.R(inst.RD); - LDR(rA, R9, PPCSTATE_OFF(Exceptions)); - CMP(rA, EXCEPTION_DSI); - FixupBranch DoNotLoad = B_CC(CC_EQ); - - if (inst.RA) + if (signExtend) // Only on 16 loads + SXTH(RD, RD); + if (reverse) { - MOVI2R(rB, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(rB, rB, RA); + if (accessSize == 32) + REV(RD, RD); + else if (accessSize == 16) + REV16(RD, RD); } - else - MOVI2R(rB, (u32)inst.SIMM_16); - - MOVI2R(rA, (u32)&Memory::Read_U16); - PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); - BL(rA); - MOV(rA, R0); - SXTH(rA, rA); - POP(4, R0, R1, R2, R3); - MOV(RD, rA); gpr.Unlock(rA, rB); - SetJumpTarget(DoNotLoad); } -void JitArm::lwz(UGeckoInstruction inst) +void JitArm::lXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) + + u32 a = inst.RA, b = inst.RB, d = inst.RD; + s32 offset = inst.SIMM_16; + u32 accessSize = 0; + s32 offsetReg = -1; + bool zeroA = true; + bool update = false; + bool signExtend = false; + bool reverse = false; + bool fastmem = false; + + switch(inst.OPCD) + { + case 31: + switch(inst.SUBOP10) + { + case 55: // lwzux + zeroA = false; + update = true; + case 23: // lwzx + accessSize = 32; + offsetReg = b; + break; + case 119: //lbzux + zeroA = false; + update = true; + case 87: // lbzx + accessSize = 8; + offsetReg = b; + break; + case 311: // lhzux + zeroA = false; + update = true; + case 279: // lhzx + accessSize = 16; + offsetReg = b; + break; + case 375: // lhaux + zeroA = false; + update = true; + case 343: // lhax + accessSize = 16; + signExtend = true; + offsetReg = b; + break; + case 534: // lwbrx + accessSize = 32; + reverse = true; + break; + case 790: // lhbrx + accessSize = 16; + reverse = true; + break; + } + break; + case 33: // lwzu + zeroA = false; + update = true; + case 32: // lwz + fastmem = true; + accessSize = 32; + break; + case 35: // lbzu + zeroA = false; + update = true; + case 34: // lbz + fastmem = true; + accessSize = 8; + break; + case 41: // lhzu + zeroA = false; + update = true; + case 40: // lhz + fastmem = true; + accessSize = 16; + break; + case 43: // lhau + zeroA = false; + update = true; + case 42: // lha + signExtend = true; + accessSize = 16; + break; + } + + // Check for exception before loading + ARMReg rA = gpr.GetReg(false); - ARMReg rA = gpr.GetReg(); - ARMReg rB = gpr.GetReg(); - ARMReg RD = gpr.R(inst.RD); LDR(rA, R9, PPCSTATE_OFF(Exceptions)); CMP(rA, EXCEPTION_DSI); FixupBranch DoNotLoad = B_CC(CC_EQ); + + SafeLoadToReg(fastmem, d, zeroA ? a ? a : -1 : a, offsetReg, accessSize, offset, signExtend, reverse); + + if (update) { - if (inst.RA) - { - MOVI2R(rB, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(rB, rB, RA); - } + rA = gpr.GetReg(false); + ARMReg RA = gpr.R(a); + if (offsetReg == -1) + MOVI2R(rA, offset); else - MOVI2R(rB, (u32)inst.SIMM_16); - - MOVI2R(rA, (u32)&Memory::Read_U32); - PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); - BL(rA); - MOV(rA, R0); - POP(4, R0, R1, R2, R3); - MOV(RD, rA); - gpr.Unlock(rA, rB); + MOV(RA, gpr.R(offsetReg)); + ADD(RA, RA, rA); } + SetJumpTarget(DoNotLoad); + + // LWZ idle skipping if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle && + inst.OPCD == 32 && (inst.hex & 0xFFFF0000) == 0x800D0000 && (Memory::ReadUnchecked_U32(js.compilerPC + 4) == 0x28000000 || (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC + 4) == 0x2C000000)) && Memory::ReadUnchecked_U32(js.compilerPC + 8) == 0x4182fff8) { + ARMReg RD = gpr.R(d); gpr.Flush(); fpr.Flush(); - + // if it's still 0, we can wait until the next event TST(RD, RD); FixupBranch noIdle = B_CC(CC_NEQ); - rA = gpr.GetReg(); - + rA = gpr.GetReg(); + MOVI2R(rA, (u32)&PowerPC::OnIdle); - MOVI2R(R0, PowerPC::ppcState.gpr[inst.RA] + (s32)(s16)inst.SIMM_16); + MOVI2R(R0, PowerPC::ppcState.gpr[a] + (s32)(s16)inst.SIMM_16); BL(rA); gpr.Unlock(rA); @@ -367,46 +453,71 @@ void JitArm::lwz(UGeckoInstruction inst) //js.compilerPC += 8; return; } + } -void JitArm::lwzx(UGeckoInstruction inst) + +// Some games use this heavily in video codecs +// We make the assumption that this pulls from main RAM at /all/ times +void JitArm::lmw(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) + if (!Core::g_CoreStartupParameter.bFastmem){ + Default(inst); return; + } + u32 a = inst.RA; ARMReg rA = gpr.GetReg(); ARMReg rB = gpr.GetReg(); + MOVI2R(rA, inst.SIMM_16); + if (a) + ADD(rA, rA, gpr.R(a)); + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(rA, rA, mask); // 3 + MOVI2R(rB, (u32)Memory::base, false); // 4-5 + ADD(rA, rA, rB); // 6 - ARMReg RB = gpr.R(inst.RB); - ARMReg RD = gpr.R(inst.RD); - LDR(rA, R9, PPCSTATE_OFF(Exceptions)); - CMP(rA, EXCEPTION_DSI); - FixupBranch DoNotLoad = B_CC(CC_EQ); + for (int i = inst.RD; i < 32; i++) { - if (inst.RA) - { - ARMReg RA = gpr.R(inst.RA); - ADD(rB, RA, RB); - } - else - MOV(rB, RB); - - MOVI2R(rA, (u32)&Memory::Read_U32); - PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); - BL(rA); - MOV(rA, R0); - POP(4, R0, R1, R2, R3); - MOV(RD, rA); - gpr.Unlock(rA, rB); + ARMReg RX = gpr.R(i); + LDR(RX, rA, (i - inst.RD) * 4); + REV(RX, RX); } - SetJumpTarget(DoNotLoad); - //// u32 temp = Memory::Read_U32(_inst.RA ? (m_GPR[_inst.RA] + m_GPR[_inst.RB]) : m_GPR[_inst.RB]); + gpr.Unlock(rA, rB); } +void JitArm::stmw(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStoreOff) + if (!Core::g_CoreStartupParameter.bFastmem){ + Default(inst); return; + } + + u32 a = inst.RA; + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + ARMReg rC = gpr.GetReg(); + MOVI2R(rA, inst.SIMM_16); + if (a) + ADD(rA, rA, gpr.R(a)); + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(rA, rA, mask); // 3 + MOVI2R(rB, (u32)Memory::base, false); // 4-5 + ADD(rA, rA, rB); // 6 + + for (int i = inst.RD; i < 32; i++) + { + ARMReg RX = gpr.R(i); + REV(rC, RX); + STR(rC, rA, (i - inst.RD) * 4); + } + gpr.Unlock(rA, rB, rC); +} void JitArm::dcbst(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) // If the dcbst instruction is preceded by dcbt, it is flushing a prefetched // memory location. Do not invalidate the JIT cache in this case as the memory @@ -420,6 +531,6 @@ void JitArm::dcbst(UGeckoInstruction inst) void JitArm::icbi(UGeckoInstruction inst) { Default(inst); - WriteExit(js.compilerPC + 4, 0); + WriteExit(js.compilerPC + 4); } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp index f764717a15..70998ced47 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp @@ -16,7 +16,6 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -32,18 +31,342 @@ #include "JitFPRCache.h" #include "JitAsm.h" -void JitArm::lfs(UGeckoInstruction inst) +void JitArm::lfXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) - Default(inst); return; ARMReg rA = gpr.GetReg(); ARMReg rB = gpr.GetReg(); + ARMReg RA; + + u32 a = inst.RA, b = inst.RB; + + s32 offset = inst.SIMM_16; + bool single = false; + bool update = false; + bool zeroA = false; + s32 offsetReg = -1; + + switch (inst.OPCD) + { + case 31: + switch(inst.SUBOP10) + { + case 567: // lfsux + single = true; + update = true; + offsetReg = b; + break; + case 535: // lfsx + single = true; + zeroA = true; + offsetReg = b; + break; + case 631: // lfdux + update = true; + offsetReg = b; + break; + case 599: // lfdx + zeroA = true; + offsetReg = b; + break; + } + break; + case 49: // lfsu + update = true; + single = true; + break; + case 48: // lfs + single = true; + zeroA = true; + break; + case 51: // lfdu + update = true; + break; + case 50: // lfd + zeroA = true; + break; + } + + ARMReg v0 = fpr.R0(inst.FD), v1; + if (single) + v1 = fpr.R1(inst.FD); + + if (update) + { + RA = gpr.R(a); + // Update path /always/ uses RA + if (offsetReg == -1) // uses SIMM_16 + { + MOVI2R(rB, offset); + ADD(rB, rB, RA); + } + else + ADD(rB, gpr.R(offsetReg), RA); + } + else + { + + if (zeroA) + { + if (offsetReg == -1) + { + if (a) + { + RA = gpr.R(a); + MOVI2R(rB, offset); + ADD(rB, rB, RA); + } + else + MOVI2R(rB, (u32)offset); + } + else + { + ARMReg RB = gpr.R(offsetReg); + if (a) + { + RA = gpr.R(a); + ADD(rB, RB, RA); + } + else + MOV(rB, RB); + } + } + } LDR(rA, R9, PPCSTATE_OFF(Exceptions)); CMP(rA, EXCEPTION_DSI); FixupBranch DoNotLoad = B_CC(CC_EQ); + if (update) + MOV(RA, rB); + + if (Core::g_CoreStartupParameter.bFastmem) + { + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(rB, rB, mask); // 1 + MOVI2R(rA, (u32)Memory::base, false); // 2-3 + ADD(rB, rB, rA); // 4 + + NEONXEmitter nemit(this); + if (single) + { + VLDR(S0, rB, 0); + nemit.VREV32(I_8, D0, D0); // Byte swap to result + VCVT(v0, S0, 0); + VCVT(v1, S0, 0); + } + else + { + VLDR(v0, rB, 0); + nemit.VREV64(I_8, v0, v0); // Byte swap to result + } + } + else + { + PUSH(4, R0, R1, R2, R3); + MOV(R0, rB); + if (single) + { + MOVI2R(rA, (u32)&Memory::Read_U32); + BL(rA); + + VMOV(S0, R0); + + VCVT(v0, S0, 0); + VCVT(v1, S0, 0); + } + else + { + MOVI2R(rA, (u32)&Memory::Read_F64); + BL(rA); + +#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1 + VMOV(v0, R0); +#else + VMOV(v0, D0); +#endif + } + POP(4, R0, R1, R2, R3); + } + gpr.Unlock(rA, rB); + SetJumpTarget(DoNotLoad); +} + +void JitArm::stfXX(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStoreFloatingOff) + + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + ARMReg RA; + + u32 a = inst.RA, b = inst.RB; + + s32 offset = inst.SIMM_16; + bool single = false; + bool update = false; + bool zeroA = false; + s32 offsetReg = -1; + + switch (inst.OPCD) + { + case 31: + switch(inst.SUBOP10) + { + case 663: // stfsx + single = true; + zeroA = true; + offsetReg = b; + break; + case 695: // stfsux + single = true; + offsetReg = b; + break; + case 727: // stfdx + zeroA = true; + offsetReg = b; + break; + case 759: // stfdux + update = true; + offsetReg = b; + break; + } + break; + case 53: // stfsu + update = true; + single = true; + break; + case 52: // stfs + single = true; + zeroA = true; + break; + case 55: // stfdu + update = true; + break; + case 54: // stfd + zeroA = true; + break; + } + + ARMReg v0 = fpr.R0(inst.FS); + + if (update) + { + RA = gpr.R(a); + // Update path /always/ uses RA + if (offsetReg == -1) // uses SIMM_16 + { + MOVI2R(rB, offset); + ADD(rB, rB, RA); + } + else + ADD(rB, gpr.R(offsetReg), RA); + } + else + { + + if (zeroA) + { + if (offsetReg == -1) + { + if (a) + { + RA = gpr.R(a); + MOVI2R(rB, offset); + ADD(rB, rB, RA); + } + else + MOVI2R(rB, (u32)offset); + } + else + { + ARMReg RB = gpr.R(offsetReg); + if (a) + { + RA = gpr.R(a); + ADD(rB, RB, RA); + } + else + MOV(rB, RB); + } + } + } + + if (update) + { + LDR(rA, R9, PPCSTATE_OFF(Exceptions)); + CMP(rA, EXCEPTION_DSI); + + SetCC(CC_NEQ); + MOV(RA, rB); + SetCC(); + } + if (Core::g_CoreStartupParameter.bFastmem) + { + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + BIC(rB, rB, mask); // 1 + MOVI2R(rA, (u32)Memory::base, false); // 2-3 + ADD(rB, rB, rA); // 4 + + NEONXEmitter nemit(this); + if (single) + { + VCVT(S0, v0, 0); + nemit.VREV32(I_8, D0, D0); + VSTR(S0, rB, 0); + } + else + { + nemit.VREV64(I_8, D0, v0); + VSTR(D0, rB, 0); + } + } + else + { + PUSH(4, R0, R1, R2, R3); + if (single) + { + MOVI2R(rA, (u32)&Memory::Write_U32); + VMOV(R0, S0); + MOV(R1, rB); + + BL(rA); + + } + else + { + MOVI2R(rA, (u32)&Memory::Write_F64); +#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1 + VMOV(R0, v0); + MOV(R2, rB); +#else + VMOV(D0, v0); + MOV(R0, rB); +#endif + + BL(rA); + } + POP(4, R0, R1, R2, R3); + } + gpr.Unlock(rA, rB); +} + +// Some games use stfs as a way to quickly write to the gatherpipe and other hardware areas. +// Keep it as a safe store until this can get optimized. +// Look at the JIT64 implementation to see how it is done + +void JitArm::stfs(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStoreFloatingOff) + + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + ARMReg v0 = fpr.R0(inst.FS); + VCVT(S0, v0, 0); + if (inst.RA) { MOVI2R(rB, inst.SIMM_16); @@ -53,51 +376,16 @@ void JitArm::lfs(UGeckoInstruction inst) else MOVI2R(rB, (u32)inst.SIMM_16); - ARMReg v0 = fpr.R0(inst.FD); - ARMReg v1 = fpr.R1(inst.FD); - MOVI2R(rA, (u32)&Memory::Read_F32); + MOVI2R(rA, (u32)&Memory::Write_U32); PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); + VMOV(R0, S0); + MOV(R1, rB); + BL(rA); - VCVT(v0, S0, 0); - VCVT(v1, S0, 0); - POP(4, R0, R1, R2, R3); - - gpr.Unlock(rA, rB); - SetJumpTarget(DoNotLoad); -} -void JitArm::lfd(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(LoadStoreFloating) - Default(inst); return; - - ARMReg rA = gpr.GetReg(); - ARMReg rB = gpr.GetReg(); - LDR(rA, R9, PPCSTATE_OFF(Exceptions)); - CMP(rA, EXCEPTION_DSI); - FixupBranch DoNotLoad = B_CC(CC_EQ); - - if (inst.RA) - { - MOVI2R(rB, inst.SIMM_16); - ARMReg RA = gpr.R(inst.RA); - ADD(rB, rB, RA); - } - else - MOVI2R(rB, (u32)inst.SIMM_16); - - ARMReg v0 = fpr.R0(inst.FD); - - MOVI2R(rA, (u32)&Memory::Read_F64); - PUSH(4, R0, R1, R2, R3); - MOV(R0, rB); - BL(rA); - VMOV(v0, D0); POP(4, R0, R1, R2, R3); gpr.Unlock(rA, rB); - SetJumpTarget(DoNotLoad); } + diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStorePaired.cpp new file mode 100644 index 0000000000..244ae1db22 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStorePaired.cpp @@ -0,0 +1,191 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. +#include "Common.h" + +#include "../../Core.h" +#include "../PowerPC.h" +#include "../../CoreTiming.h" +#include "../PPCTables.h" +#include "ArmEmitter.h" + +#include "Jit.h" +#include "JitRegCache.h" +#include "JitAsm.h" + +void JitArm::psq_l(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStorePairedOff) + + bool update = inst.OPCD == 57; + s32 offset = inst.SIMM_12; + + // R12 contains scale + // R11 contains type + // R10 is the ADDR + if (js.memcheck || !Core::g_CoreStartupParameter.bFastmem) { Default(inst); return; } + + LDR(R11, R9, PPCSTATE_OFF(spr[SPR_GQR0 + inst.I])); + UBFX(R12, R11, 16, 3); // Type + LSL(R12, R12, 2); + UBFX(R11, R11, 24, 6); // Scale + LSL(R11, R11, 2); + + MOVI2R(R10, (u32)offset); + if (inst.RA || update) // Always uses the register on update + ADD(R10, R10, gpr.R(inst.RA)); + if (update) + MOV(gpr.R(inst.RA), R10); + MOVI2R(R14, (u32)asm_routines.pairedLoadQuantized); + ADD(R14, R14, R12); + LDR(R14, R14, inst.W ? 8 * 4 : 0); + + // Values returned in S0, S1 + BL(R14); // Jump to the quantizer Load + + ARMReg vD0 = fpr.R0(inst.RS, false); + ARMReg vD1 = fpr.R1(inst.RS, false); + VCVT(vD0, S0, 0); + if (!inst.W) + VCVT(vD1, S1, 0); + else + MOVI2F(vD1, 1.0f, INVALID_REG); // No need for temp reg with 1.0f +} + +void JitArm::psq_lx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStorePairedOff) + + bool update = inst.SUBOP10 == 38; + // R12 contains scale + // R11 contains type + // R10 is the ADDR + if (js.memcheck || !Core::g_CoreStartupParameter.bFastmem) { Default(inst); return; } + + LDR(R11, R9, PPCSTATE_OFF(spr[SPR_GQR0 + inst.Ix])); + UBFX(R12, R11, 16, 3); // Type + LSL(R12, R12, 2); + UBFX(R11, R11, 24, 6); // Scale + LSL(R11, R11, 2); + + if (inst.RA || update) // Always uses the register on update + { + ADD(R10, gpr.R(inst.RB), gpr.R(inst.RA)); + } + else + MOV(R10, gpr.R(inst.RB)); + + if (update) + MOV(gpr.R(inst.RA), R10); + + MOVI2R(R14, (u32)asm_routines.pairedLoadQuantized); + ADD(R14, R14, R12); + LDR(R14, R14, inst.Wx ? 8 * 4 : 0); + + // Values returned in S0, S1 + BL(R14); // Jump to the quantizer Load + + ARMReg vD0 = fpr.R0(inst.RS, false); + ARMReg vD1 = fpr.R1(inst.RS, false); + LDR(R14, R9, PPCSTATE_OFF(Exceptions)); + CMP(R14, EXCEPTION_DSI); + SetCC(CC_NEQ); + + VCVT(vD0, S0, 0); + if (!inst.Wx) + VCVT(vD1, S1, 0); + else + MOVI2F(vD1, 1.0f, INVALID_REG); // No need for temp reg with 1.0f + SetCC(); +} + +void JitArm::psq_st(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStorePairedOff) + + bool update = inst.OPCD == 61; + s32 offset = inst.SIMM_12; + + // R12 contains scale + // R11 contains type + // R10 is the ADDR + if (js.memcheck || !Core::g_CoreStartupParameter.bFastmem) { Default(inst); return; } + + LDR(R11, R9, PPCSTATE_OFF(spr[SPR_GQR0 + inst.I])); + UBFX(R12, R11, 0, 3); // Type + LSL(R12, R12, 2); + UBFX(R11, R11, 8, 6); // Scale + LSL(R11, R11, 2); + + if (inst.RA || update) // Always uses the register on update + { + MOVI2R(R14, offset); + ADD(R10, gpr.R(inst.RA), R14); + } + else + MOVI2R(R10, (u32)offset); + + if (update) + MOV(gpr.R(inst.RA), R10); + MOVI2R(R14, (u32)asm_routines.pairedStoreQuantized); + ADD(R14, R14, R12); + LDR(R14, R14, inst.W ? 8 * 4 : 0); + + ARMReg vD0 = fpr.R0(inst.RS); + VCVT(S0, vD0, 0); + + if (!inst.W) + { + ARMReg vD1 = fpr.R1(inst.RS); + VCVT(S1, vD1, 0); + } + // floats passed through D0 + BL(R14); // Jump to the quantizer Store +} + +void JitArm::psq_stx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITLoadStorePairedOff) + + bool update = inst.SUBOP10 == 39; + + // R12 contains scale + // R11 contains type + // R10 is the ADDR + if (js.memcheck || !Core::g_CoreStartupParameter.bFastmem) { Default(inst); return; } + + LDR(R11, R9, PPCSTATE_OFF(spr[SPR_GQR0 + inst.I])); + UBFX(R12, R11, 0, 3); // Type + LSL(R12, R12, 2); + UBFX(R11, R11, 8, 6); // Scale + LSL(R11, R11, 2); + + if (inst.RA || update) // Always uses the register on update + { + ADD(R10, gpr.R(inst.RA), gpr.R(inst.RB)); + } + else + MOV(R10, gpr.R(inst.RB)); + + if (update) + MOV(gpr.R(inst.RA), R10); + + MOVI2R(R14, (u32)asm_routines.pairedStoreQuantized); + ADD(R14, R14, R12); + LDR(R14, R14, inst.W ? 8 * 4 : 0); + + ARMReg vD0 = fpr.R0(inst.RS); + VCVT(S0, vD0, 0); + + if (!inst.W) + { + ARMReg vD1 = fpr.R1(inst.RS); + VCVT(S1, vD1, 0); + } + // floats passed through D0 + BL(R14); // Jump to the quantizer Store +} diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Paired.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Paired.cpp index 279ed10a48..53d5e7bd8d 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Paired.cpp @@ -15,48 +15,84 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" #include "../../CoreTiming.h" #include "../PPCTables.h" #include "ArmEmitter.h" +#include "JitArm_FPUtils.h" #include "Jit.h" #include "JitRegCache.h" #include "JitAsm.h" -// Wrong, THP videos like SMS and Ikaruga show artifacts -void JitArm::ps_add(UGeckoInstruction inst) +void JitArm::ps_rsqrte(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) - Default(inst); return; - - u32 a = inst.FA, b = inst.FB, d = inst.FD; + u32 b = inst.FB, d = inst.FD; if (inst.Rc){ Default(inst); return; } - ARMReg vA0 = fpr.R0(a); - ARMReg vA1 = fpr.R1(a); ARMReg vB0 = fpr.R0(b); ARMReg vB1 = fpr.R1(b); - ARMReg vD0 = fpr.R0(d); - ARMReg vD1 = fpr.R1(d); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg V0 = D1; + ARMReg rA = gpr.GetReg(); - VADD(vD0, vA0, vB0); - VADD(vD1, vA1, vB1); + MOVI2R(fpscrReg, (u32)&PPC_NAN); + VLDR(V0, fpscrReg, 0); + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + + VCMP(vB0); + VMRS(_PC); + FixupBranch Less0 = B_CC(CC_LT); + VMOV(vD0, V0); + SetFPException(fpscrReg, FPSCR_VXSQRT); + FixupBranch SkipOrr0 = B(); + SetJumpTarget(Less0); + SetCC(CC_EQ); + ORR(rA, rA, 1); + SetCC(); + SetJumpTarget(SkipOrr0); + + VCMP(vB1); + VMRS(_PC); + FixupBranch Less1 = B_CC(CC_LT); + VMOV(vD1, V0); + SetFPException(fpscrReg, FPSCR_VXSQRT); + FixupBranch SkipOrr1 = B(); + SetJumpTarget(Less1); + SetCC(CC_EQ); + ORR(rA, rA, 2); + SetCC(); + SetJumpTarget(SkipOrr1); + + CMP(rA, 0); + FixupBranch noException = B_CC(CC_EQ); + SetFPException(fpscrReg, FPSCR_ZX); + SetJumpTarget(noException); + + VCVT(S0, vB0, 0); + VCVT(S1, vB1, 0); + + NEONXEmitter nemit(this); + nemit.VRSQRTE(F_32, D0, D0); + VCVT(vD0, S0, 0); + VCVT(vD1, S1, 0); + + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, rA); } -// Wrong, THP videos like SMS and Ikaruga show artifacts -void JitArm::ps_madd(UGeckoInstruction inst) +void JitArm::ps_sel(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) - - Default(inst); return; + JITDISABLE(bJITPairedOff) u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; @@ -69,49 +105,33 @@ void JitArm::ps_madd(UGeckoInstruction inst) ARMReg vB1 = fpr.R1(b); ARMReg vC0 = fpr.R0(c); ARMReg vC1 = fpr.R1(c); - ARMReg vD0 = fpr.R0(d); - ARMReg vD1 = fpr.R1(d); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); - ARMReg V0 = fpr.GetReg(); - ARMReg V1 = fpr.GetReg(); + VCMP(vA0); + VMRS(_PC); - VMOV(V0, vC0); - VMOV(V1, vC1); - - VMLA(V0, vA0, vB0); - VMLA(V1, vA1, vB1); + FixupBranch GT0 = B_CC(CC_GE); + VMOV(vD0, vB0); + FixupBranch EQ0 = B(); + SetJumpTarget(GT0); + VMOV(vD0, vC0); + SetJumpTarget(EQ0); - VMOV(vD0, V0); - VMOV(vD1, V1); - - fpr.Unlock(V0); - fpr.Unlock(V1); -} - -void JitArm::ps_sum0(UGeckoInstruction inst) -{ - INSTRUCTION_START - JITDISABLE(Paired) - - u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; - - if (inst.Rc) { - Default(inst); return; - } - ARMReg vA0 = fpr.R0(a); - ARMReg vB1 = fpr.R1(b); - ARMReg vC1 = fpr.R1(c); - ARMReg vD0 = fpr.R0(d); - ARMReg vD1 = fpr.R1(d); - - VADD(vD0, vA0, vB1); + VCMP(vA1); + VMRS(_PC); + FixupBranch GT1 = B_CC(CC_GE); + VMOV(vD1, vB1); + FixupBranch EQ1 = B(); + SetJumpTarget(GT1); VMOV(vD1, vC1); + SetJumpTarget(EQ1); } -void JitArm::ps_sub(UGeckoInstruction inst) +void JitArm::ps_add(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) u32 a = inst.FA, b = inst.FB, d = inst.FD; if (inst.Rc){ @@ -121,8 +141,299 @@ void JitArm::ps_sub(UGeckoInstruction inst) ARMReg vA1 = fpr.R1(a); ARMReg vB0 = fpr.R0(b); ARMReg vB1 = fpr.R1(b); - ARMReg vD0 = fpr.R0(d); - ARMReg vD1 = fpr.R1(d); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VADD(vD0, vA0, vB0); + VADD(vD1, vA1, vB1); +} + +void JitArm::ps_div(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VDIV(vD0, vA0, vB0); + VDIV(vD1, vA1, vB1); +} + +void JitArm::ps_res(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + ARMReg V0 = fpr.GetReg(); + MOVI2R(V0, 1.0, INVALID_REG); // temp reg not needed for 1.0 + + VDIV(vD0, V0, vB0); + VDIV(vD1, V0, vB1); + fpr.Unlock(V0); +} + +void JitArm::ps_nmadd(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC1); + VADD(vD0, V0, vB0); + VADD(vD1, V1, vB1); + VNEG(vD0, vD0); + VNEG(vD1, vD1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_madd(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC1); + VADD(vD0, V0, vB0); + VADD(vD1, V1, vB1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_nmsub(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC1); + VSUB(vD0, V0, vB0); + VSUB(vD1, V1, vB1); + VNEG(vD0, vD0); + VNEG(vD1, vD1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_msub(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC1); + VSUB(vD0, V0, vB0); + VSUB(vD1, V1, vB1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_madds0(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC0); + + VADD(vD0, V0, vB0); + VADD(vD1, V1, vB1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_madds1(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + VMUL(V0, vA0, vC1); + VMUL(V1, vA1, vC1); + VADD(vD0, V0, vB0); + VADD(vD1, V1, vB1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} +void JitArm::ps_sum0(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vB1 = fpr.R1(b); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VADD(vD0, vA0, vB1); + VMOV(vD1, vC1); + +} + +void JitArm::ps_sum1(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, c = inst.FC, d = inst.FD; + + if (inst.Rc) { + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vB1 = fpr.R1(b); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VMOV(vD0, vC0); + VADD(vD1, vA0, vB1); +} + + +void JitArm::ps_sub(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); VSUB(vD0, vA0, vB0); VSUB(vD1, vA1, vB1); @@ -131,7 +442,8 @@ void JitArm::ps_sub(UGeckoInstruction inst) void JitArm::ps_mul(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) + u32 a = inst.FA, c = inst.FC, d = inst.FD; if (inst.Rc){ Default(inst); return; @@ -140,10 +452,468 @@ void JitArm::ps_mul(UGeckoInstruction inst) ARMReg vA1 = fpr.R1(a); ARMReg vC0 = fpr.R0(c); ARMReg vC1 = fpr.R1(c); - ARMReg vD0 = fpr.R0(d); - ARMReg vD1 = fpr.R1(d); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); VMUL(vD0, vA0, vC0); VMUL(vD1, vA1, vC1); } +void JitArm::ps_muls0(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, c = inst.FC, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vC0 = fpr.R0(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + + VMUL(V0, vA0, vC0); + VMUL(V1, vA1, vC0); + VMOV(vD0, V0); + VMOV(vD1, V1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_muls1(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + + u32 a = inst.FA, c = inst.FC, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + ARMReg vA0 = fpr.R0(a); + ARMReg vA1 = fpr.R1(a); + ARMReg vC1 = fpr.R1(c); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + ARMReg V0 = fpr.GetReg(); + ARMReg V1 = fpr.GetReg(); + + + VMUL(V0, vA0, vC1); + VMUL(V1, vA1, vC1); + VMOV(vD0, V0); + VMOV(vD1, V1); + + fpr.Unlock(V0); + fpr.Unlock(V1); +} + +void JitArm::ps_merge00(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vA0 = fpr.R0(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VMOV(vD1, vB0); + VMOV(vD0, vA0); +} + +void JitArm::ps_merge01(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vA0 = fpr.R0(a); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + VMOV(vD0, vA0); + VMOV(vD1, vB1); +} + +void JitArm::ps_merge10(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vA1 = fpr.R1(a); + ARMReg vB0 = fpr.R0(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + ARMReg V0 = fpr.GetReg(); + + VMOV(V0, vB0); + VMOV(vD0, vA1); + VMOV(vD1, V0); + + fpr.Unlock(V0); +} + +void JitArm::ps_merge11(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 a = inst.FA, b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vA1 = fpr.R1(a); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + VMOV(vD0, vA1); + VMOV(vD1, vB1); +} + +void JitArm::ps_mr(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + VMOV(vD0, vB0); + VMOV(vD1, vB1); +} + +void JitArm::ps_neg(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + VNEG(vD0, vB0); + VNEG(vD1, vB1); +} + +void JitArm::ps_abs(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + VABS(vD0, vB0); + VABS(vD1, vB1); +} + +void JitArm::ps_nabs(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITPairedOff) + u32 b = inst.FB, d = inst.FD; + if (inst.Rc){ + Default(inst); return; + } + + ARMReg vB0 = fpr.R0(b); + ARMReg vB1 = fpr.R1(b); + ARMReg vD0 = fpr.R0(d, false); + ARMReg vD1 = fpr.R1(d, false); + + VABS(vD0, vB0); + VNEG(vD0, vD0); + VABS(vD1, vB1); + VNEG(vD1, vD1); +} +void JitArm::ps_cmpu0(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R0(a); + ARMReg vB = fpr.R0(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); +} + +void JitArm::ps_cmpu1(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R1(a); + ARMReg vB = fpr.R1(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); +} + +void JitArm::ps_cmpo0(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R0(a); + ARMReg vB = fpr.R0(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + + SetFPException(fpscrReg, FPSCR_VXVC); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + TST(fpscrReg, VEMask); + + FixupBranch noVXVC = B_CC(CC_NEQ); + SetFPException(fpscrReg, FPSCR_VXVC); + + SetJumpTarget(noVXVC); + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); +} + +void JitArm::ps_cmpo1(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff) + u32 a = inst.FA, b = inst.FB; + int cr = inst.CRFD; + + ARMReg vA = fpr.R1(a); + ARMReg vB = fpr.R1(b); + ARMReg fpscrReg = gpr.GetReg(); + ARMReg crReg = gpr.GetReg(); + Operand2 FPRFMask(0x1F, 0xA); // 0x1F000 + Operand2 LessThan(0x8, 0xA); // 0x8000 + Operand2 GreaterThan(0x4, 0xA); // 0x4000 + Operand2 EqualTo(0x2, 0xA); // 0x2000 + Operand2 NANRes(0x1, 0xA); // 0x1000 + FixupBranch Done1, Done2, Done3; + LDR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + BIC(fpscrReg, fpscrReg, FPRFMask); + + VCMPE(vA, vB); + VMRS(_PC); + SetCC(CC_LT); + ORR(fpscrReg, fpscrReg, LessThan); + MOV(crReg, 8); + Done1 = B(); + SetCC(CC_GT); + ORR(fpscrReg, fpscrReg, GreaterThan); + MOV(crReg, 4); + Done2 = B(); + SetCC(CC_EQ); + ORR(fpscrReg, fpscrReg, EqualTo); + MOV(crReg, 2); + Done3 = B(); + SetCC(); + + ORR(fpscrReg, fpscrReg, NANRes); + MOV(crReg, 1); + + VCMPE(vA, vA); + VMRS(_PC); + FixupBranch NanA = B_CC(CC_NEQ); + VCMPE(vB, vB); + VMRS(_PC); + FixupBranch NanB = B_CC(CC_NEQ); + + SetFPException(fpscrReg, FPSCR_VXVC); + FixupBranch Done4 = B(); + + SetJumpTarget(NanA); + SetJumpTarget(NanB); + + SetFPException(fpscrReg, FPSCR_VXSNAN); + + TST(fpscrReg, VEMask); + + FixupBranch noVXVC = B_CC(CC_NEQ); + SetFPException(fpscrReg, FPSCR_VXVC); + + SetJumpTarget(noVXVC); + SetJumpTarget(Done1); + SetJumpTarget(Done2); + SetJumpTarget(Done3); + SetJumpTarget(Done4); + STRB(crReg, R9, PPCSTATE_OFF(cr_fast) + cr); + STR(fpscrReg, R9, PPCSTATE_OFF(fpscr)); + gpr.Unlock(fpscrReg, crReg); +} + diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp index 0c58b43ff3..62b15e1d5e 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_SystemRegisters.cpp @@ -15,7 +15,6 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" -#include "Thunk.h" #include "../../Core.h" #include "../PowerPC.h" @@ -30,18 +29,28 @@ void JitArm::mtspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); switch (iIndex) { - case SPR_LR: - case SPR_CTR: - case SPR_XER: + + case SPR_DMAU: + + case SPR_SPRG0: + case SPR_SPRG1: + case SPR_SPRG2: + case SPR_SPRG3: + + case SPR_SRR0: + case SPR_SRR1: // These are safe to do the easy way, see the bottom of this function. break; + case SPR_LR: + case SPR_CTR: + case SPR_XER: case SPR_GQR0: case SPR_GQR0 + 1: case SPR_GQR0 + 2: @@ -50,19 +59,9 @@ void JitArm::mtspr(UGeckoInstruction inst) case SPR_GQR0 + 5: case SPR_GQR0 + 6: case SPR_GQR0 + 7: - // Prevent recompiler from compiling in old quantizer values. - // If the value changed, destroy all blocks using this quantizer - // This will create a little bit of block churn, but hopefully not too bad. - { - /* - MOV(32, R(EAX), M(&PowerPC::ppcState.spr[iIndex])); // Load old value - CMP(32, R(EAX), gpr.R(inst.RD)); - FixupBranch skip_destroy = J_CC(CC_E, false); - int gqr = iIndex - SPR_GQR0; - ABI_CallFunctionC(ProtectFunction(&Jit64::DestroyBlocksWithFlag, 1), (u32)BLOCK_USE_GQR0 << gqr); - SetJumpTarget(skip_destroy);*/ - } - // TODO - break block if quantizers are written to. + // These are safe to do the easy way, see the bottom of this function. + break; + default: Default(inst); return; @@ -75,16 +74,15 @@ void JitArm::mtspr(UGeckoInstruction inst) void JitArm::mftb(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) mfspr(inst); } void JitArm::mfspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); - ARMReg RD = gpr.R(inst.RD); switch (iIndex) { case SPR_WPAR: @@ -94,28 +92,212 @@ void JitArm::mfspr(UGeckoInstruction inst) Default(inst); return; default: + ARMReg RD = gpr.R(inst.RD); LDR(RD, R9, PPCSTATE_OFF(spr) + iIndex * 4); break; } } + +void JitArm::mfcr(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + // USES_CR + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + int d = inst.RD; + LDRB(rA, R9, PPCSTATE_OFF(cr_fast[0])); + + for (int i = 1; i < 8; i++) + { + LDRB(rB, R9, PPCSTATE_OFF(cr_fast[i])); + LSL(rA, rA, 4); + ORR(rA, rA, rB); + } + MOV(gpr.R(d), rA); + gpr.Unlock(rA, rB); +} + +void JitArm::mtcrf(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + + ARMReg rA = gpr.GetReg(); + + // USES_CR + u32 crm = inst.CRM; + if (crm != 0) + { + if (gpr.IsImm(inst.RS)) + { + for (int i = 0; i < 8; i++) + { + if ((crm & (0x80 >> i)) != 0) + { + u8 newcr = (gpr.GetImm(inst.RS) >> (28 - (i * 4))) & 0xF; + MOV(rA, newcr); + STRB(rA, R9, PPCSTATE_OFF(cr_fast[i])); + } + } + } + else + { + ARMReg rB = gpr.GetReg(); + MOV(rA, gpr.R(inst.RS)); + for (int i = 0; i < 8; i++) + { + if ((crm & (0x80 >> i)) != 0) + { + UBFX(rB, rA, 28 - (i * 4), 4); + STRB(rB, R9, PPCSTATE_OFF(cr_fast[i])); + } + } + gpr.Unlock(rB); + } + } + gpr.Unlock(rA); +} + +void JitArm::mtsr(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + + STR(gpr.R(inst.RS), R9, PPCSTATE_OFF(sr[inst.SR])); +} + +void JitArm::mfsr(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + + LDR(gpr.R(inst.RD), R9, PPCSTATE_OFF(sr[inst.SR])); +} +void JitArm::mcrxr(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + // Copy XER[0-3] into CR[inst.CRFD] + LDR(rA, R9, PPCSTATE_OFF(spr[SPR_XER])); + MOV(rB, rA); + LSR(rA, rA, 28); + STRB(rA, R9, PPCSTATE_OFF(cr_fast[inst.CRFD])); + + // Clear XER[0-3] + Operand2 Top4(0xF, 2); + BIC(rB, rB, Top4); + STR(rB, R9, PPCSTATE_OFF(spr[SPR_XER])); + gpr.Unlock(rA, rB); +} + void JitArm::mtmsr(UGeckoInstruction inst) { INSTRUCTION_START // Don't interpret this, if we do we get thrown out - //JITDISABLE(SystemRegisters) - + //JITDISABLE(bJITSystemRegistersOff) + STR(gpr.R(inst.RS), R9, PPCSTATE_OFF(msr)); - + gpr.Flush(); fpr.Flush(); - WriteExit(js.compilerPC + 4, 0); + WriteExit(js.compilerPC + 4); } + void JitArm::mfmsr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) - + JITDISABLE(bJITSystemRegistersOff) + LDR(gpr.R(inst.RD), R9, PPCSTATE_OFF(msr)); } +void JitArm::mcrf(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + ARMReg rA = gpr.GetReg(); + + if (inst.CRFS != inst.CRFD) + { + LDRB(rA, R9, PPCSTATE_OFF(cr_fast[inst.CRFS])); + STRB(rA, R9, PPCSTATE_OFF(cr_fast[inst.CRFD])); + } + gpr.Unlock(rA); +} + +void JitArm::crXXX(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITSystemRegistersOff) + + ARMReg rA = gpr.GetReg(); + ARMReg rB = gpr.GetReg(); + // Get bit CRBA aligned with bit CRBD + LDRB(rA, R9, PPCSTATE_OFF(cr_fast[inst.CRBA >> 2])); + int shiftA = (inst.CRBD & 3) - (inst.CRBA & 3); + if (shiftA < 0) + LSL(rA, rA, -shiftA); + else if (shiftA > 0) + LSR(rA, rA, shiftA); + + // Get bit CRBB aligned with bit CRBD + int shiftB = (inst.CRBD & 3) - (inst.CRBB & 3); + LDRB(rB, R9, PPCSTATE_OFF(cr_fast[inst.CRBB >> 2])); + if (shiftB < 0) + LSL(rB, rB, -shiftB); + else if (shiftB > 0) + LSR(rB, rB, shiftB); + + // Compute combined bit + switch(inst.SUBOP10) + { + case 33: // crnor + ORR(rA, rA, rB); + MVN(rA, rA); + break; + + case 129: // crandc + MVN(rB, rB); + AND(rA, rA, rB); + break; + + case 193: // crxor + EOR(rA, rA, rB); + break; + + case 225: // crnand + AND(rA, rA, rB); + MVN(rA, rA); + break; + + case 257: // crand + AND(rA, rA, rB); + break; + + case 289: // creqv + EOR(rA, rA, rB); + MVN(rA, rA); + break; + + case 417: // crorc + MVN(rA, rA); + ORR(rA, rA, rB); + break; + + case 449: // cror + ORR(rA, rA, rB); + break; + } + // Store result bit in CRBD + AND(rA, rA, 0x8 >> (inst.CRBD & 3)); + LDRB(rB, R9, PPCSTATE_OFF(cr_fast[inst.CRBD >> 2])); + BIC(rB, rB, 0x8 >> (inst.CRBD & 3)); + ORR(rB, rB, rA); + STRB(rB, R9, PPCSTATE_OFF(cr_fast[inst.CRBD >> 2])); + gpr.Unlock(rA, rB); +} diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp index fe822179ed..20c2dffc9c 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp @@ -42,7 +42,7 @@ struct GekkoOPTemplate //GekkoOPInfo opinfo; // Doesn't need opinfo, Interpreter fills it out }; -static GekkoOPTemplate primarytable[] = +static GekkoOPTemplate primarytable[] = { {4, &JitArm::DynaRunTable4}, //"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0}}, {19, &JitArm::DynaRunTable19}, //"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0}}, @@ -58,59 +58,59 @@ static GekkoOPTemplate primarytable[] = {3, &JitArm::Break}, //"twi", OPTYPE_SYSTEM, FL_ENDBLOCK}}, {17, &JitArm::sc}, //"sc", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, - {7, &JitArm::mulli}, //"mulli", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_RC_BIT, 2}}, - {8, &JitArm::Default}, //"subfic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {7, &JitArm::arith}, //"mulli", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_RC_BIT, 2}}, + {8, &JitArm::subfic}, //"subfic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, {10, &JitArm::cmpli}, //"cmpli", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, {11, &JitArm::cmpi}, //"cmpi", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, - {12, &JitArm::Default}, //"addic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, - {13, &JitArm::Default}, //"addic_rc", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CR0}}, - {14, &JitArm::addi}, //"addi", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, - {15, &JitArm::addis}, //"addis", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + {12, &JitArm::arith}, //"addic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {13, &JitArm::arith}, //"addic_rc", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CR0}}, + {14, &JitArm::arith}, //"addi", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + {15, &JitArm::arith}, //"addis", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, {20, &JitArm::rlwimix}, //"rlwimix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_A | FL_IN_S | FL_RC_BIT}}, {21, &JitArm::rlwinmx}, //"rlwinmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, - {23, &JitArm::Default}, //"rlwnmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_IN_B | FL_RC_BIT}}, + {23, &JitArm::rlwnmx}, //"rlwnmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_IN_B | FL_RC_BIT}}, - {24, &JitArm::ori}, //"ori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, - {25, &JitArm::oris}, //"oris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, - {26, &JitArm::Default}, //"xori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, - {27, &JitArm::Default}, //"xoris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, - {28, &JitArm::andi_rc}, //"andi_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, - {29, &JitArm::andis_rc}, //"andis_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + {24, &JitArm::arith}, //"ori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {25, &JitArm::arith}, //"oris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {26, &JitArm::arith}, //"xori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {27, &JitArm::arith}, //"xoris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {28, &JitArm::arith}, //"andi_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + {29, &JitArm::arith}, //"andis_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, - {32, &JitArm::lwz}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {33, &JitArm::Default}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {34, &JitArm::lbz}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {35, &JitArm::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {40, &JitArm::lhz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {41, &JitArm::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {42, &JitArm::lha}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, - {43, &JitArm::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {32, &JitArm::lXX}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {33, &JitArm::lXX}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {34, &JitArm::lXX}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {35, &JitArm::lXX}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {40, &JitArm::lXX}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {41, &JitArm::lXX}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {42, &JitArm::lXX}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {43, &JitArm::lXX}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, - {44, &JitArm::sth}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, - {45, &JitArm::sthu}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, - {36, &JitArm::stw}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, - {37, &JitArm::stwu}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, - {38, &JitArm::stb}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, - {39, &JitArm::stbu}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {44, &JitArm::stX}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {45, &JitArm::stX}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {36, &JitArm::stX}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {37, &JitArm::stX}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {38, &JitArm::stX}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {39, &JitArm::stX}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, - {46, &JitArm::Default}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, - {47, &JitArm::Default}, //"stmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + {46, &JitArm::lmw}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + {47, &JitArm::stmw}, //"stmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, - {48, &JitArm::lfs}, //"lfs", OPTYPE_LOADFP, FL_IN_A}}, - {49, &JitArm::Default}, //"lfsu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, - {50, &JitArm::lfd}, //"lfd", OPTYPE_LOADFP, FL_IN_A}}, - {51, &JitArm::Default}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + {48, &JitArm::lfXX}, //"lfs", OPTYPE_LOADFP, FL_IN_A}}, + {49, &JitArm::lfXX}, //"lfsu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + {50, &JitArm::lfXX}, //"lfd", OPTYPE_LOADFP, FL_IN_A}}, + {51, &JitArm::lfXX}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, - {52, &JitArm::Default}, //"stfs", OPTYPE_STOREFP, FL_IN_A}}, - {53, &JitArm::Default}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, - {54, &JitArm::Default}, //"stfd", OPTYPE_STOREFP, FL_IN_A}}, - {55, &JitArm::Default}, //"stfdu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + {52, &JitArm::stfs}, //"stfs", OPTYPE_STOREFP, FL_IN_A}}, + {53, &JitArm::stfXX}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + {54, &JitArm::stfXX}, //"stfd", OPTYPE_STOREFP, FL_IN_A}}, + {55, &JitArm::stfXX}, //"stfdu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, - {56, &JitArm::Default}, //"psq_l", OPTYPE_PS, FL_IN_A}}, - {57, &JitArm::Default}, //"psq_lu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, - {60, &JitArm::Default}, //"psq_st", OPTYPE_PS, FL_IN_A}}, - {61, &JitArm::Default}, //"psq_stu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + {56, &JitArm::psq_l}, //"psq_l", OPTYPE_PS, FL_IN_A}}, + {57, &JitArm::psq_l}, //"psq_lu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + {60, &JitArm::psq_st}, //"psq_st", OPTYPE_PS, FL_IN_A}}, + {61, &JitArm::psq_st}, //"psq_stu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, //missing: 0, 5, 6, 9, 22, 30, 62, 58 {0, &JitArm::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, @@ -123,122 +123,122 @@ static GekkoOPTemplate primarytable[] = {58, &JitArm::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, }; -static GekkoOPTemplate table4[] = +static GekkoOPTemplate table4[] = { //SUBOP10 - {0, &JitArm::Default}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, - {32, &JitArm::Default}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, - {40, &JitArm::Default}, //"ps_neg", OPTYPE_PS, FL_RC_BIT}}, - {136, &JitArm::Default}, //"ps_nabs", OPTYPE_PS, FL_RC_BIT}}, - {264, &JitArm::Default}, //"ps_abs", OPTYPE_PS, FL_RC_BIT}}, - {64, &JitArm::Default}, //"ps_cmpu1", OPTYPE_PS, FL_RC_BIT}}, - {72, &JitArm::Default}, //"ps_mr", OPTYPE_PS, FL_RC_BIT}}, - {96, &JitArm::Default}, //"ps_cmpo1", OPTYPE_PS, FL_RC_BIT}}, - {528, &JitArm::Default}, //"ps_merge00", OPTYPE_PS, FL_RC_BIT}}, - {560, &JitArm::Default}, //"ps_merge01", OPTYPE_PS, FL_RC_BIT}}, - {592, &JitArm::Default}, //"ps_merge10", OPTYPE_PS, FL_RC_BIT}}, - {624, &JitArm::Default}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, + {0, &JitArm::ps_cmpu0}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, + {32, &JitArm::ps_cmpo0}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, + {40, &JitArm::ps_neg}, //"ps_neg", OPTYPE_PS, FL_RC_BIT}}, + {136, &JitArm::ps_nabs}, //"ps_nabs", OPTYPE_PS, FL_RC_BIT}}, + {264, &JitArm::ps_abs}, //"ps_abs", OPTYPE_PS, FL_RC_BIT}}, + {64, &JitArm::ps_cmpu1}, //"ps_cmpu1", OPTYPE_PS, FL_RC_BIT}}, + {72, &JitArm::ps_mr}, //"ps_mr", OPTYPE_PS, FL_RC_BIT}}, + {96, &JitArm::ps_cmpo1}, //"ps_cmpo1", OPTYPE_PS, FL_RC_BIT}}, + {528, &JitArm::ps_merge00}, //"ps_merge00", OPTYPE_PS, FL_RC_BIT}}, + {560, &JitArm::ps_merge01}, //"ps_merge01", OPTYPE_PS, FL_RC_BIT}}, + {592, &JitArm::ps_merge10}, //"ps_merge10", OPTYPE_PS, FL_RC_BIT}}, + {624, &JitArm::ps_merge11}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, {1014, &JitArm::Default}, //"dcbz_l", OPTYPE_SYSTEM, 0}}, -}; +}; -static GekkoOPTemplate table4_2[] = +static GekkoOPTemplate table4_2[] = { {10, &JitArm::ps_sum0}, //"ps_sum0", OPTYPE_PS, 0}}, - {11, &JitArm::Default}, //"ps_sum1", OPTYPE_PS, 0}}, - {12, &JitArm::Default}, //"ps_muls0", OPTYPE_PS, 0}}, - {13, &JitArm::Default}, //"ps_muls1", OPTYPE_PS, 0}}, - {14, &JitArm::Default}, //"ps_madds0", OPTYPE_PS, 0}}, - {15, &JitArm::Default}, //"ps_madds1", OPTYPE_PS, 0}}, - {18, &JitArm::Default}, //"ps_div", OPTYPE_PS, 0, 16}}, + {11, &JitArm::ps_sum1}, //"ps_sum1", OPTYPE_PS, 0}}, + {12, &JitArm::ps_muls0}, //"ps_muls0", OPTYPE_PS, 0}}, + {13, &JitArm::ps_muls1}, //"ps_muls1", OPTYPE_PS, 0}}, + {14, &JitArm::ps_madds0}, //"ps_madds0", OPTYPE_PS, 0}}, + {15, &JitArm::ps_madds1}, //"ps_madds1", OPTYPE_PS, 0}}, + {18, &JitArm::ps_div}, //"ps_div", OPTYPE_PS, 0, 16}}, {20, &JitArm::ps_sub}, //"ps_sub", OPTYPE_PS, 0}}, {21, &JitArm::ps_add}, //"ps_add", OPTYPE_PS, 0}}, - {23, &JitArm::Default}, //"ps_sel", OPTYPE_PS, 0}}, - {24, &JitArm::Default}, //"ps_res", OPTYPE_PS, 0}}, + {23, &JitArm::ps_sel}, //"ps_sel", OPTYPE_PS, 0}}, + {24, &JitArm::ps_res}, //"ps_res", OPTYPE_PS, 0}}, {25, &JitArm::ps_mul}, //"ps_mul", OPTYPE_PS, 0}}, - {26, &JitArm::Default}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, - {28, &JitArm::Default}, //"ps_msub", OPTYPE_PS, 0}}, + {26, &JitArm::ps_rsqrte}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, + {28, &JitArm::ps_msub}, //"ps_msub", OPTYPE_PS, 0}}, {29, &JitArm::ps_madd}, //"ps_madd", OPTYPE_PS, 0}}, - {30, &JitArm::Default}, //"ps_nmsub", OPTYPE_PS, 0}}, - {31, &JitArm::Default}, //"ps_nmadd", OPTYPE_PS, 0}}, + {30, &JitArm::ps_nmsub}, //"ps_nmsub", OPTYPE_PS, 0}}, + {31, &JitArm::ps_nmadd}, //"ps_nmadd", OPTYPE_PS, 0}}, }; -static GekkoOPTemplate table4_3[] = +static GekkoOPTemplate table4_3[] = { - {6, &JitArm::Default}, //"psq_lx", OPTYPE_PS, 0}}, - {7, &JitArm::Default}, //"psq_stx", OPTYPE_PS, 0}}, - {38, &JitArm::Default}, //"psq_lux", OPTYPE_PS, 0}}, - {39, &JitArm::Default}, //"psq_stux", OPTYPE_PS, 0}}, + {6, &JitArm::psq_lx}, //"psq_lx", OPTYPE_PS, 0}}, + {7, &JitArm::psq_stx}, //"psq_stx", OPTYPE_PS, 0}}, + {38, &JitArm::psq_lx}, //"psq_lux", OPTYPE_PS, 0}}, + {39, &JitArm::psq_stx}, //"psq_stux", OPTYPE_PS, 0}}, }; -static GekkoOPTemplate table19[] = +static GekkoOPTemplate table19[] = { {528, &JitArm::bcctrx}, //"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, {16, &JitArm::bclrx}, //"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, - {257, &JitArm::Default}, //"crand", OPTYPE_CR, FL_EVIL}}, - {129, &JitArm::Default}, //"crandc", OPTYPE_CR, FL_EVIL}}, - {289, &JitArm::Default}, //"creqv", OPTYPE_CR, FL_EVIL}}, - {225, &JitArm::Default}, //"crnand", OPTYPE_CR, FL_EVIL}}, - {33, &JitArm::Default}, //"crnor", OPTYPE_CR, FL_EVIL}}, - {449, &JitArm::Default}, //"cror", OPTYPE_CR, FL_EVIL}}, - {417, &JitArm::Default}, //"crorc", OPTYPE_CR, FL_EVIL}}, - {193, &JitArm::Default}, //"crxor", OPTYPE_CR, FL_EVIL}}, - + {257, &JitArm::crXXX}, //"crand", OPTYPE_CR, FL_EVIL}}, + {129, &JitArm::crXXX}, //"crandc", OPTYPE_CR, FL_EVIL}}, + {289, &JitArm::crXXX}, //"creqv", OPTYPE_CR, FL_EVIL}}, + {225, &JitArm::crXXX}, //"crnand", OPTYPE_CR, FL_EVIL}}, + {33, &JitArm::crXXX}, //"crnor", OPTYPE_CR, FL_EVIL}}, + {449, &JitArm::crXXX}, //"cror", OPTYPE_CR, FL_EVIL}}, + {417, &JitArm::crXXX}, //"crorc", OPTYPE_CR, FL_EVIL}}, + {193, &JitArm::crXXX}, //"crxor", OPTYPE_CR, FL_EVIL}}, + {150, &JitArm::DoNothing}, //"isync", OPTYPE_ICACHE, FL_EVIL}}, - {0, &JitArm::Default}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, - + {0, &JitArm::mcrf}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, + {50, &JitArm::rfi}, //"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1}}, {18, &JitArm::Break}, //"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS}} }; -static GekkoOPTemplate table31[] = +static GekkoOPTemplate table31[] = { - {28, &JitArm::andx}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {60, &JitArm::Default}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {444, &JitArm::orx}, //"orx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {124, &JitArm::Default}, //"norx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {316, &JitArm::xorx}, //"xorx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {412, &JitArm::Default}, //"orcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {476, &JitArm::Default}, //"nandx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, - {284, &JitArm::Default}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {28, &JitArm::arith}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {60, &JitArm::arith}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {444, &JitArm::arith}, //"orx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {124, &JitArm::arith}, //"norx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {316, &JitArm::arith}, //"xorx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {412, &JitArm::arith}, //"orcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {476, &JitArm::arith}, //"nandx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {284, &JitArm::arith}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, {0, &JitArm::cmp}, //"cmp", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, {32, &JitArm::cmpl}, //"cmpl", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, - {26, &JitArm::Default}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {26, &JitArm::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, {922, &JitArm::extshx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, {954, &JitArm::extsbx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, - {536, &JitArm::Default}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, - {792, &JitArm::Default}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {536, &JitArm::arith}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {792, &JitArm::arith}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, {824, &JitArm::srawix}, //"srawix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, - {24, &JitArm::Default}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {24, &JitArm::arith}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, {54, &JitArm::dcbst}, //"dcbst", OPTYPE_DCACHE, 0, 4}}, {86, &JitArm::Default}, //"dcbf", OPTYPE_DCACHE, 0, 4}}, - {246, &JitArm::Default}, //"dcbtst", OPTYPE_DCACHE, 0, 1}}, - {278, &JitArm::Default}, //"dcbt", OPTYPE_DCACHE, 0, 1}}, + {246, &JitArm::DoNothing}, //"dcbtst", OPTYPE_DCACHE, 0, 1}}, + {278, &JitArm::DoNothing}, //"dcbt", OPTYPE_DCACHE, 0, 1}}, {470, &JitArm::Default}, //"dcbi", OPTYPE_DCACHE, 0, 4}}, - {758, &JitArm::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}}, + {758, &JitArm::DoNothing}, //"dcba", OPTYPE_DCACHE, 0, 4}}, {1014, &JitArm::Default}, //"dcbz", OPTYPE_DCACHE, 0, 4}}, //load word - {23, &JitArm::lwzx}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {55, &JitArm::Default}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + {23, &JitArm::lXX}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {55, &JitArm::lXX}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, //load halfword - {279, &JitArm::Default}, //"lhzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {311, &JitArm::Default}, //"lhzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + {279, &JitArm::lXX}, //"lhzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {311, &JitArm::lXX}, //"lhzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, //load halfword signextend - {343, &JitArm::Default}, //"lhax", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {375, &JitArm::Default}, //"lhaux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + {343, &JitArm::lXX}, //"lhax", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {375, &JitArm::lXX}, //"lhaux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, //load byte - {87, &JitArm::Default}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {119, &JitArm::Default}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + {87, &JitArm::lXX}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {119, &JitArm::lXX}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, //load byte reverse - {534, &JitArm::Default}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, - {790, &JitArm::Default}, //"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {534, &JitArm::lXX}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {790, &JitArm::lXX}, //"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, // Conditional load/store (Wii SMP) {150, &JitArm::Default}, //"stwcxd", OPTYPE_STORE, FL_EVIL | FL_SET_CR0}}, @@ -249,16 +249,16 @@ static GekkoOPTemplate table31[] = {597, &JitArm::Default}, //"lswi", OPTYPE_LOAD, FL_EVIL | FL_IN_AB | FL_OUT_D}}, //store word - {151, &JitArm::Default}, //"stwx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, - {183, &JitArm::Default}, //"stwux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + {151, &JitArm::stX}, //"stwx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {183, &JitArm::stX}, //"stwux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, //store halfword - {407, &JitArm::Default}, //"sthx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, - {439, &JitArm::Default}, //"sthux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + {407, &JitArm::stX}, //"sthx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {439, &JitArm::stX}, //"sthux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, //store byte - {215, &JitArm::Default}, //"stbx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, - {247, &JitArm::Default}, //"stbux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + {215, &JitArm::stX}, //"stbx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {247, &JitArm::stX}, //"stbux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, //store bytereverse {662, &JitArm::Default}, //"stwbrx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, @@ -267,33 +267,33 @@ static GekkoOPTemplate table31[] = {661, &JitArm::Default}, //"stswx", OPTYPE_STORE, FL_EVIL}}, {725, &JitArm::Default}, //"stswi", OPTYPE_STORE, FL_EVIL}}, - // fp load/store - {535, &JitArm::Default}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, - {567, &JitArm::Default}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, - {599, &JitArm::Default}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, - {631, &JitArm::Default}, //"lfdux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + // fp load/store + {535, &JitArm::lfXX}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {567, &JitArm::lfXX}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + {599, &JitArm::lfXX}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {631, &JitArm::lfXX}, //"lfdux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, - {663, &JitArm::Default}, //"stfsx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, - {695, &JitArm::Default}, //"stfsux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, - {727, &JitArm::Default}, //"stfdx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, - {759, &JitArm::Default}, //"stfdux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {663, &JitArm::stfXX}, //"stfsx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {695, &JitArm::stfXX}, //"stfsux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {727, &JitArm::stfXX}, //"stfdx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {759, &JitArm::stfXX}, //"stfdux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, {983, &JitArm::Default}, //"stfiwx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, - {19, &JitArm::Default}, //"mfcr", OPTYPE_SYSTEM, FL_OUT_D}}, + {19, &JitArm::mfcr}, //"mfcr", OPTYPE_SYSTEM, FL_OUT_D}}, {83, &JitArm::mfmsr}, //"mfmsr", OPTYPE_SYSTEM, FL_OUT_D}}, - {144, &JitArm::Default}, //"mtcrf", OPTYPE_SYSTEM, 0}}, + {144, &JitArm::mtcrf}, //"mtcrf", OPTYPE_SYSTEM, 0}}, {146, &JitArm::mtmsr}, //"mtmsr", OPTYPE_SYSTEM, FL_ENDBLOCK}}, - {210, &JitArm::Default}, //"mtsr", OPTYPE_SYSTEM, 0}}, + {210, &JitArm::mtsr}, //"mtsr", OPTYPE_SYSTEM, 0}}, {242, &JitArm::Default}, //"mtsrin", OPTYPE_SYSTEM, 0}}, {339, &JitArm::mfspr}, //"mfspr", OPTYPE_SPR, FL_OUT_D}}, {467, &JitArm::mtspr}, //"mtspr", OPTYPE_SPR, 0, 2}}, {371, &JitArm::mftb}, //"mftb", OPTYPE_SYSTEM, FL_OUT_D | FL_TIMER}}, - {512, &JitArm::Default}, //"mcrxr", OPTYPE_SYSTEM, 0}}, - {595, &JitArm::Default}, //"mfsr", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + {512, &JitArm::mcrxr}, //"mcrxr", OPTYPE_SYSTEM, 0}}, + {595, &JitArm::mfsr}, //"mfsr", OPTYPE_SYSTEM, FL_OUT_D, 2}}, {659, &JitArm::Default}, //"mfsrin", OPTYPE_SYSTEM, FL_OUT_D, 2}}, {4, &JitArm::Break}, //"tw", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, - {598, &JitArm::Default}, //"sync", OPTYPE_SYSTEM, 0, 2}}, + {598, &JitArm::DoNothing}, //"sync", OPTYPE_SYSTEM, 0, 2}}, {982, &JitArm::icbi}, //"icbi", OPTYPE_SYSTEM, FL_ENDBLOCK, 3}}, // Unused instructions on GC @@ -305,11 +305,11 @@ static GekkoOPTemplate table31[] = {566, &JitArm::Default}, //"tlbsync", OPTYPE_SYSTEM, 0}}, }; -static GekkoOPTemplate table31_2[] = -{ - {266, &JitArm::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, - {778, &JitArm::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, - {10, &JitArm::addcx}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, +static GekkoOPTemplate table31_2[] = +{ + {266, &JitArm::arith}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {778, &JitArm::arith}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {10, &JitArm::arith}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, {138, &JitArm::addex}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, {234, &JitArm::Default}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, {202, &JitArm::Default}, //"addzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, @@ -319,41 +319,41 @@ static GekkoOPTemplate table31_2[] = {971, &JitArm::Default}, //"divwuox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, {75, &JitArm::Default}, //"mulhwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, {11, &JitArm::mulhwux}, //"mulhwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, - {235, &JitArm::mullwx}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, - {747, &JitArm::Default}, //"mullwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {235, &JitArm::arith}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {747, &JitArm::arith}, //"mullwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, {104, &JitArm::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, - {40, &JitArm::subfx}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, - {552, &JitArm::Default}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {40, &JitArm::arith}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {552, &JitArm::arith}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, {8, &JitArm::Default}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, {136, &JitArm::Default}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, {232, &JitArm::Default}, //"subfmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, {200, &JitArm::Default}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, }; -static GekkoOPTemplate table59[] = +static GekkoOPTemplate table59[] = { - {18, &JitArm::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, - {20, &JitArm::fsubsx}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {21, &JitArm::faddsx}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {18, &JitArm::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, + {20, &JitArm::fsubsx}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitArm::faddsx}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, // {22, &JitArm::Default}, //"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F}}, // Not implemented on gekko - {24, &JitArm::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, - {25, &JitArm::fmulsx}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {28, &JitArm::Default}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {29, &JitArm::Default}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {30, &JitArm::Default}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {31, &JitArm::Default}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, -}; + {24, &JitArm::fresx}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitArm::fmulsx}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitArm::Default}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitArm::fmaddsx}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitArm::Default}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitArm::fnmaddsx}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; -static GekkoOPTemplate table63[] = +static GekkoOPTemplate table63[] = { {264, &JitArm::fabsx}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {32, &JitArm::Default}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, - {0, &JitArm::Default}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, - {14, &JitArm::Default}, //"fctiwx", OPTYPE_FPU, FL_RC_BIT_F}}, - {15, &JitArm::Default}, //"fctiwzx", OPTYPE_FPU, FL_RC_BIT_F}}, + {32, &JitArm::fcmpo}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, + {0, &JitArm::fcmpu}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, + {14, &JitArm::fctiwx}, //"fctiwx", OPTYPE_FPU, FL_RC_BIT_F}}, + {15, &JitArm::fctiwzx}, //"fctiwzx", OPTYPE_FPU, FL_RC_BIT_F}}, {72, &JitArm::fmrx}, //"fmrx", OPTYPE_FPU, FL_RC_BIT_F}}, - {136, &JitArm::Default}, //"fnabsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {40, &JitArm::Default}, //"fnegx", OPTYPE_FPU, FL_RC_BIT_F}}, + {136, &JitArm::fnabsx}, //"fnabsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {40, &JitArm::fnegx}, //"fnegx", OPTYPE_FPU, FL_RC_BIT_F}}, {12, &JitArm::Default}, //"frspx", OPTYPE_FPU, FL_RC_BIT_F}}, {64, &JitArm::Default}, //"mcrfs", OPTYPE_SYSTEMFP, 0}}, @@ -364,19 +364,19 @@ static GekkoOPTemplate table63[] = {711, &JitArm::Default}, //"mtfsfx", OPTYPE_SYSTEMFP, 0, 2}}, }; -static GekkoOPTemplate table63_2[] = +static GekkoOPTemplate table63_2[] = { {18, &JitArm::Default}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, {20, &JitArm::fsubx}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, {21, &JitArm::faddx}, //"faddx", OPTYPE_FPU, FL_RC_BIT_F}}, {22, &JitArm::Default}, //"fsqrtx", OPTYPE_FPU, FL_RC_BIT_F}}, - {23, &JitArm::Default}, //"fselx", OPTYPE_FPU, FL_RC_BIT_F}}, + {23, &JitArm::fselx}, //"fselx", OPTYPE_FPU, FL_RC_BIT_F}}, {25, &JitArm::fmulx}, //"fmulx", OPTYPE_FPU, FL_RC_BIT_F}}, - {26, &JitArm::Default}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, + {26, &JitArm::frsqrtex}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, {28, &JitArm::Default}, //"fmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, - {29, &JitArm::Default}, //"fmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitArm::fmaddx}, //"fmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, {30, &JitArm::Default}, //"fnmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, - {31, &JitArm::Default}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitArm::fnmaddx}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, }; @@ -407,7 +407,7 @@ void InitTables() return; //clear - for (int i = 0; i < 32; i++) + for (int i = 0; i < 32; i++) { dynaOpTable59[i] = &JitArm::unknown_instruction; } @@ -417,7 +417,7 @@ void InitTables() dynaOpTable4 [i] = &JitArm::unknown_instruction; dynaOpTable19[i] = &JitArm::unknown_instruction; dynaOpTable31[i] = &JitArm::unknown_instruction; - dynaOpTable63[i] = &JitArm::unknown_instruction; + dynaOpTable63[i] = &JitArm::unknown_instruction; } for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.cpp index 851d8b7706..2d619ceea3 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.cpp @@ -34,31 +34,94 @@ using namespace ArmGen; //TODO - make an option //#if _DEBUG -// bool enableDebug = false; +// bool enableDebug = false; //#else -// bool enableDebug = false; +// bool enableDebug = false; //#endif JitArmAsmRoutineManager asm_routines; +static const float GC_ALIGNED16(m_quantizeTableS[]) = +{ + (1 << 0), (1 << 1), (1 << 2), (1 << 3), + (1 << 4), (1 << 5), (1 << 6), (1 << 7), + (1 << 8), (1 << 9), (1 << 10), (1 << 11), + (1 << 12), (1 << 13), (1 << 14), (1 << 15), + (1 << 16), (1 << 17), (1 << 18), (1 << 19), + (1 << 20), (1 << 21), (1 << 22), (1 << 23), + (1 << 24), (1 << 25), (1 << 26), (1 << 27), + (1 << 28), (1 << 29), (1 << 30), (1 << 31), + 1.0 / (1ULL << 32), 1.0 / (1 << 31), 1.0 / (1 << 30), 1.0 / (1 << 29), + 1.0 / (1 << 28), 1.0 / (1 << 27), 1.0 / (1 << 26), 1.0 / (1 << 25), + 1.0 / (1 << 24), 1.0 / (1 << 23), 1.0 / (1 << 22), 1.0 / (1 << 21), + 1.0 / (1 << 20), 1.0 / (1 << 19), 1.0 / (1 << 18), 1.0 / (1 << 17), + 1.0 / (1 << 16), 1.0 / (1 << 15), 1.0 / (1 << 14), 1.0 / (1 << 13), + 1.0 / (1 << 12), 1.0 / (1 << 11), 1.0 / (1 << 10), 1.0 / (1 << 9), + 1.0 / (1 << 8), 1.0 / (1 << 7), 1.0 / (1 << 6), 1.0 / (1 << 5), + 1.0 / (1 << 4), 1.0 / (1 << 3), 1.0 / (1 << 2), 1.0 / (1 << 1), +}; + +static const float GC_ALIGNED16(m_dequantizeTableS[]) = +{ + 1.0 / (1 << 0), 1.0 / (1 << 1), 1.0 / (1 << 2), 1.0 / (1 << 3), + 1.0 / (1 << 4), 1.0 / (1 << 5), 1.0 / (1 << 6), 1.0 / (1 << 7), + 1.0 / (1 << 8), 1.0 / (1 << 9), 1.0 / (1 << 10), 1.0 / (1 << 11), + 1.0 / (1 << 12), 1.0 / (1 << 13), 1.0 / (1 << 14), 1.0 / (1 << 15), + 1.0 / (1 << 16), 1.0 / (1 << 17), 1.0 / (1 << 18), 1.0 / (1 << 19), + 1.0 / (1 << 20), 1.0 / (1 << 21), 1.0 / (1 << 22), 1.0 / (1 << 23), + 1.0 / (1 << 24), 1.0 / (1 << 25), 1.0 / (1 << 26), 1.0 / (1 << 27), + 1.0 / (1 << 28), 1.0 / (1 << 29), 1.0 / (1 << 30), 1.0 / (1 << 31), + (1ULL << 32), (1 << 31), (1 << 30), (1 << 29), + (1 << 28), (1 << 27), (1 << 26), (1 << 25), + (1 << 24), (1 << 23), (1 << 22), (1 << 21), + (1 << 20), (1 << 19), (1 << 18), (1 << 17), + (1 << 16), (1 << 15), (1 << 14), (1 << 13), + (1 << 12), (1 << 11), (1 << 10), (1 << 9), + (1 << 8), (1 << 7), (1 << 6), (1 << 5), + (1 << 4), (1 << 3), (1 << 2), (1 << 1), +}; + +static void WriteDual32(u32 value1, u32 value2, u32 address) +{ + Memory::Write_U32(value1, address); + Memory::Write_U32(value2, address + 4); +} + +static void WriteDual16(u32 value1, u32 value2, u32 address) +{ + Memory::Write_U16(value1, address); + Memory::Write_U16(value2, address + 2); +} + +static void WriteDual8(u32 value1, u32 value2, u32 address) +{ + Memory::Write_U8(value1, address); + Memory::Write_U8(value2, address + 1); +} + void JitArmAsmRoutineManager::Generate() { enterCode = GetCodePtr(); - PUSH(2, R11, _LR); // R11 is frame pointer in Debug. + PUSH(9, R4, R5, R6, R7, R8, R9, R10, R11, _LR); + // Take care to 8-byte align stack for function calls. + // We are misaligned here because of an odd number of args for PUSH. + // It's not like x86 where you need to account for an extra 4 bytes + // consumed by CALL. + SUB(_SP, _SP, 4); MOVI2R(R0, (u32)&CoreTiming::downcount); MOVI2R(R9, (u32)&PowerPC::ppcState.spr[0]); FixupBranch skipToRealDispatcher = B(); - dispatcher = GetCodePtr(); + dispatcher = GetCodePtr(); printf("Dispatcher is %p\n", dispatcher); - // Downcount Check + // Downcount Check // The result of slice decrementation should be in flags if somebody jumped here // IMPORTANT - We jump on negative, not carry!!! FixupBranch bail = B_CC(CC_MI); - SetJumpTarget(skipToRealDispatcher); + SetJumpTarget(skipToRealDispatcher); dispatcherNoCheck = GetCodePtr(); // This block of code gets the address of the compiled block of code @@ -68,19 +131,18 @@ void JitArmAsmRoutineManager::Generate() Operand2 iCacheMask = Operand2(0xE, 2); // JIT_ICACHE_MASK BIC(R12, R12, iCacheMask); // R12 contains PC & JIT_ICACHE_MASK here. - MOVI2R(R14, (u32)jit->GetBlockCache()->GetICache()); + MOVI2R(R14, (u32)jit->GetBlockCache()->iCache); LDR(R12, R14, R12); // R12 contains iCache[PC & JIT_ICACHE_MASK] here // R12 Confirmed this is the correct iCache Location loaded. - TST(R12, 0xFC); // Test to see if it is a JIT block. + TST(R12, 0x80); // Test to see if it is a JIT block. SetCC(CC_EQ); // Success, it is our Jitblock. MOVI2R(R14, (u32)jit->GetBlockCache()->GetCodePointers()); // LDR R14 right here to get CodePointers()[0] pointer. - REV(R12, R12); // Reversing this gives us our JITblock. - LSL(R12, R12, 2); // Multiply by four because address locations are u32 in size - LDR(R14, R14, R12); // Load the block address in to R14 + LSL(R12, R12, 2); // Multiply by four because address locations are u32 in size + LDR(R14, R14, R12); // Load the block address in to R14 B(R14); // No need to jump anywhere after here, the block will go back to dispatcher start @@ -88,9 +150,9 @@ void JitArmAsmRoutineManager::Generate() // If we get to this point, that means that we don't have the block cached to execute // So call ArmJit to compile the block and then execute it. - MOVI2R(R14, (u32)&Jit); + MOVI2R(R14, (u32)&Jit); BL(R14); - + B(dispatcherNoCheck); // fpException() @@ -105,12 +167,12 @@ void JitArmAsmRoutineManager::Generate() B(dispatcher); SetJumpTarget(bail); - doTiming = GetCodePtr(); + doTiming = GetCodePtr(); // XXX: In JIT64, Advance() gets called /after/ the exception checking - // once it jumps back to the start of outerLoop + // once it jumps back to the start of outerLoop QuickCallFunction(R14, (void*)&CoreTiming::Advance); - // Does exception checking + // Does exception checking testExceptions = GetCodePtr(); LDR(R0, R9, PPCSTATE_OFF(pc)); STR(R0, R9, PPCSTATE_OFF(npc)); @@ -126,44 +188,438 @@ void JitArmAsmRoutineManager::Generate() FixupBranch Exit = B_CC(CC_NEQ); B(dispatcher); - + SetJumpTarget(Exit); - POP(2, R11, _PC); + ADD(_SP, _SP, 4); + + POP(9, R4, R5, R6, R7, R8, R9, R10, R11, _PC); // Returns + + GenerateCommon(); + FlushIcache(); } void JitArmAsmRoutineManager::GenerateCommon() { -/* fifoDirectWrite8 = AlignCode4(); - GenFifoWrite(8); - fifoDirectWrite16 = AlignCode4(); - GenFifoWrite(16); - fifoDirectWrite32 = AlignCode4(); - GenFifoWrite(32); - fifoDirectWriteFloat = AlignCode4(); - GenFifoFloatWrite(); - fifoDirectWriteXmm64 = AlignCode4(); - GenFifoXmm64Write(); + // R14 is LR + // R12 is scratch + // R11 is scale + // R10 is the address + Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK) + Operand2 arghmask(3, 3); // 0x0C000000 + NEONXEmitter nemit(this); - GenQuantizedLoads(); - GenQuantizedStores(); - GenQuantizedSingleStores(); -*/ - //CMPSD(R(XMM0), M(&zero), - // TODO + const u8* loadPairedIllegal = GetCodePtr(); + BKPT(0x10); + + const u8* loadPairedFloatTwo = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + nemit.VLD1(I_32, D0, R10); + nemit.VREV32(I_8, D0, D0); + + MOV(_PC, _LR); + } + const u8* loadPairedFloatOne = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + nemit.VLD1(I_32, D0, R10); + nemit.VREV32(I_8, D0, D0); + + MOV(_PC, _LR); + } + const u8* loadPairedU8Two = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + SXTB(R12, R12); + VMOV(S0, R12); + + LDRH(R12, R10, 2); + SXTB(R12, R12); + VMOV(S1, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT); + VCVT(S1, S1, TO_FLOAT); + + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedU8One = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRB(R12, R10); + SXTB(R12, R12); + VMOV(S0, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT); + + VMUL(S0, S0, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedS8Two = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + SXTB(R12, R12); + VMOV(S0, R12); + + LDRH(R12, R10, 2); + SXTB(R12, R12); + VMOV(S1, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT | IS_SIGNED); + VCVT(S1, S1, TO_FLOAT | IS_SIGNED); + + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedS8One = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRB(R12, R10); + SXTB(R12, R12); + VMOV(S0, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT | IS_SIGNED); + + VMUL(S0, S0, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedU16Two = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + REV16(R12, R12); + SXTH(R12, R12); + VMOV(S0, R12); + + LDRH(R12, R10, 2); + REV16(R12, R12); + SXTH(R12, R12); + VMOV(S1, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT); + VCVT(S1, S1, TO_FLOAT); + + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedU16One = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + REV16(R12, R12); + VMOV(S0, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT); + + VMUL(S0, S0, S2); + MOV(_PC, _LR); + } + const u8* loadPairedS16Two = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + REV16(R12, R12); + SXTH(R12, R12); + VMOV(S0, R12); + + LDRH(R12, R10, 2); + REV16(R12, R12); + SXTH(R12, R12); + VMOV(S1, R12); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + VCVT(S0, S0, TO_FLOAT | IS_SIGNED); + VCVT(S1, S1, TO_FLOAT | IS_SIGNED); + + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + MOV(_PC, _LR); + } + const u8* loadPairedS16One = GetCodePtr(); + { + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + LDRH(R12, R10); + + MOVI2R(R10, (u32)&m_dequantizeTableS); + ADD(R10, R10, R11); + VLDR(S2, R10, 0); + + REV16(R12, R12); + SXTH(R12, R12); + VMOV(S0, R12); + VCVT(S0, S0, TO_FLOAT | IS_SIGNED); + + VMUL(S0, S0, S2); + MOV(_PC, _LR); + } + + pairedLoadQuantized = reinterpret_cast(const_cast(AlignCode16())); + ReserveCodeSpace(16 * sizeof(u8*)); + + pairedLoadQuantized[0] = loadPairedFloatTwo; + pairedLoadQuantized[1] = loadPairedIllegal; + pairedLoadQuantized[2] = loadPairedIllegal; + pairedLoadQuantized[3] = loadPairedIllegal; + pairedLoadQuantized[4] = loadPairedU8Two; + pairedLoadQuantized[5] = loadPairedU16Two; + pairedLoadQuantized[6] = loadPairedS8Two; + pairedLoadQuantized[7] = loadPairedS16Two; + + pairedLoadQuantized[8] = loadPairedFloatOne; + pairedLoadQuantized[9] = loadPairedIllegal; + pairedLoadQuantized[10] = loadPairedIllegal; + pairedLoadQuantized[11] = loadPairedIllegal; + pairedLoadQuantized[12] = loadPairedU8One; + pairedLoadQuantized[13] = loadPairedU16One; + pairedLoadQuantized[14] = loadPairedS8One; + pairedLoadQuantized[15] = loadPairedS16One; + + // Stores + const u8* storePairedIllegal = GetCodePtr(); + BKPT(0x21); + const u8* storePairedFloat = GetCodePtr(); + { + TST(R10, arghmask); + FixupBranch argh = B_CC(CC_NEQ); + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + nemit.VREV32(I_8, D0, D0); + nemit.VST1(I_32, D0, R10); + MOV(_PC, _LR); + + SetJumpTarget(argh); + + PUSH(5, R0, R1, R2, R3, _LR); + VMOV(R0, S0); + VMOV(R1, S1); + MOV(R2, R10); + MOVI2R(R12, (u32)&WriteDual32); + BL(R12); + POP(5, R0, R1, R2, R3, _PC); + } + const u8* storePairedU8 = GetCodePtr(); + const u8* storePairedS8 = GetCodePtr(); + { + // R10 is the addr + // R11 is the scale + // R12 is scratch + // S0, S1 is the values + PUSH(5, R0, R1, R2, R3, _LR); + + MOVI2R(R12, (u32)&m_quantizeTableS); + ADD(R12, R12, R11); + VLDR(S2, R12, 0); + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + VCVT(S0, S0, TO_INT | ROUND_TO_ZERO); + VCVT(S1, S1, TO_INT | ROUND_TO_ZERO); + + VMOV(R0, S0); + VMOV(R1, S1); + MOV(R2, R10); + MOVI2R(R12, (u32)&WriteDual8); + BL(R12); + + POP(5, R0, R1, R2, R3, _PC); + } + const u8* storePairedU16 = GetCodePtr(); + const u8* storePairedS16 = GetCodePtr(); + { + PUSH(5, R0, R1, R2, R3, _LR); + + MOVI2R(R12, (u32)&m_quantizeTableS); + ADD(R12, R12, R11); + VLDR(S2, R12, 0); + VMUL(S0, S0, S2); + VMUL(S1, S1, S2); + + VCVT(S0, S0, TO_INT | ROUND_TO_ZERO); + VCVT(S1, S1, TO_INT | ROUND_TO_ZERO); + + VMOV(R0, S0); + VMOV(R1, S1); + MOV(R2, R10); + MOVI2R(R12, (u32)&WriteDual16); + BL(R12); + + POP(5, R0, R1, R2, R3, _PC); + } + const u8* storeSingleIllegal = GetCodePtr(); + BKPT(0x27); + const u8* storeSingleFloat = GetCodePtr(); + { + TST(R10, arghmask); + FixupBranch argh = B_CC(CC_NEQ); + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + VMOV(R12, S0); + REV(R12, R12); + STR(R12, R10); + MOV(_PC, _LR); + + SetJumpTarget(argh); + + PUSH(5, R0, R1, R2, R3, _LR); + VMOV(R0, S0); + MOV(R1, R10); + MOVI2R(R10, (u32)&Memory::Write_U32); + BL(R10); + + POP(5, R0, R1, R2, R3, _PC); + } + const u8* storeSingleU8 = GetCodePtr(); // Used by MKWii + const u8* storeSingleS8 = GetCodePtr(); + { + MOVI2R(R12, (u32)&m_quantizeTableS); + ADD(R12, R12, R11); + VLDR(S2, R12, 0); + VMUL(S0, S0, S2); + + TST(R10, arghmask); + FixupBranch argh = B_CC(CC_NEQ); + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + VCVT(S0, S0, TO_INT | ROUND_TO_ZERO); + VMOV(R12, S0); + STRB(R12, R10); + MOV(_PC, _LR); + + SetJumpTarget(argh); + + PUSH(5, R0, R1, R2, R3, _LR); + VMOV(R0, S0); + MOV(R1, R10); + MOVI2R(R10, (u32)&Memory::Write_U8); + BL(R10); + POP(5, R0, R1, R2, R3, _PC); + } + const u8* storeSingleU16 = GetCodePtr(); // Used by MKWii + const u8* storeSingleS16 = GetCodePtr(); + { + MOVI2R(R12, (u32)&m_quantizeTableS); + ADD(R12, R12, R11); + VLDR(S2, R12, 0); + VMUL(S0, S0, S2); + + TST(R10, arghmask); + FixupBranch argh = B_CC(CC_NEQ); + BIC(R10, R10, mask); + MOVI2R(R12, (u32)Memory::base); + ADD(R10, R10, R12); + + VCVT(S0, S0, TO_INT | ROUND_TO_ZERO); + VMOV(R12, S0); + REV16(R12, R12); + STRH(R12, R10); + MOV(_PC, _LR); + + SetJumpTarget(argh); + + PUSH(5, R0, R1, R2, R3, _LR); + VMOV(R0, S0); + MOV(R1, R10); + MOVI2R(R10, (u32)&Memory::Write_U16); + BL(R10); + + POP(5, R0, R1, R2, R3, _PC); + } + + pairedStoreQuantized = reinterpret_cast(const_cast(AlignCode16())); + ReserveCodeSpace(16 * sizeof(u8*)); + + pairedStoreQuantized[0] = storePairedFloat; + pairedStoreQuantized[1] = storePairedIllegal; + pairedStoreQuantized[2] = storePairedIllegal; + pairedStoreQuantized[3] = storePairedIllegal; + pairedStoreQuantized[4] = storePairedU8; + pairedStoreQuantized[5] = storePairedU16; + pairedStoreQuantized[6] = storePairedS8; + pairedStoreQuantized[7] = storePairedS16; + + pairedStoreQuantized[8] = storeSingleFloat; + pairedStoreQuantized[9] = storeSingleIllegal; + pairedStoreQuantized[10] = storeSingleIllegal; + pairedStoreQuantized[11] = storeSingleIllegal; + pairedStoreQuantized[12] = storeSingleU8; + pairedStoreQuantized[13] = storeSingleU16; + pairedStoreQuantized[14] = storeSingleS8; + pairedStoreQuantized[15] = storeSingleS16; - // Fast write routines - special case the most common hardware write - // TODO: use this. - // Even in x86, the param values will be in the right registers. - /* - const u8 *fastMemWrite8 = AlignCode16(); - CMP(32, R(ABI_PARAM2), Imm32(0xCC008000)); - FixupBranch skip_fast_write = J_CC(CC_NE, false); - MOV(32, EAX, M(&m_gatherPipeCount)); - MOV(8, MDisp(EAX, (u32)&m_gatherPipe), ABI_PARAM1); - ADD(32, 1, M(&m_gatherPipeCount)); - RET(); - SetJumpTarget(skip_fast_write); - CALL((void *)&Memory::Write_U8);*/ } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.h b/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.h index 9a61e9e653..9fcf49d4ec 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.h +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitAsm.h @@ -20,7 +20,7 @@ #include "ArmEmitter.h" #include "../JitCommon/JitAsmCommon.h" using namespace ArmGen; -class JitArmAsmRoutineManager : public CommonAsmRoutinesBase, public ARMXCodeBlock +class JitArmAsmRoutineManager : public CommonAsmRoutinesBase, public ARMXCodeBlock { private: void Generate(); diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.cpp index 359c497b3c..7247ddbd1e 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.cpp @@ -35,7 +35,6 @@ void ArmFPRCache::Init(ARMXEmitter *emitter) ArmCRegs[a].Reg = PPCRegs[a]; ArmCRegs[a].LastLoad = 0; ArmCRegs[a].PS1 = false; - ArmCRegs[a].Away = true; } for(u8 a = 0; a < NUMARMREG; ++a) { @@ -43,22 +42,19 @@ void ArmFPRCache::Init(ARMXEmitter *emitter) ArmRegs[a].free = true; } } + void ArmFPRCache::Start(PPCAnalyst::BlockRegStats &stats) { - for(u8 a = 0; a < NUMPPCREG; ++a) - { - ArmCRegs[a].PPCReg = 33; - ArmCRegs[a].LastLoad = 0; - } } + ARMReg *ArmFPRCache::GetPPCAllocationOrder(int &count) { // This will return us the allocation order of the registers we can use on // the ppc side. - static ARMReg allocationOrder[] = + static ARMReg allocationOrder[] = { - D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, - D14, D15, D16, D17, D18, D19, D20, D21, D22, + D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, + D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31 }; count = sizeof(allocationOrder) / sizeof(const int); @@ -68,7 +64,7 @@ ARMReg *ArmFPRCache::GetAllocationOrder(int &count) { // This will return us the allocation order of the registers we can use on // the host side. - static ARMReg allocationOrder[] = + static ARMReg allocationOrder[] = { D0, D1, D2, D3 }; @@ -101,59 +97,72 @@ void ArmFPRCache::Unlock(ARMReg V0) } } } -ARMReg ArmFPRCache::GetPPCReg(u32 preg, bool PS1, bool preLoad) +u32 ArmFPRCache::GetLeastUsedRegister(bool increment) { u32 HighestUsed = 0; - u8 Num = 0; + u8 lastRegIndex = 0; for(u8 a = 0; a < NUMPPCREG; ++a){ - ++ArmCRegs[a].LastLoad; + if (increment) + ++ArmCRegs[a].LastLoad; if (ArmCRegs[a].LastLoad > HighestUsed) { HighestUsed = ArmCRegs[a].LastLoad; - Num = a; + lastRegIndex = a; } } - // Check if already Loaded - for(u8 a = 0; a < NUMPPCREG; ++a) - if (ArmCRegs[a].PPCReg == preg && ArmCRegs[a].PS1 == PS1) - { - ArmCRegs[a].LastLoad = 0; - // Check if the value is actually in the reg - if (ArmCRegs[a].Away && preLoad) - { - // Load it now since we want it - s16 offset = PPCSTATE_OFF(ps) + (preg * 16) + (PS1 ? 8 : 0); - emit->VLDR(ArmCRegs[a].Reg, R9, offset); - ArmCRegs[a].Away = false; - } - return ArmCRegs[a].Reg; - } - // Check if we have a free register + return lastRegIndex; +} +bool ArmFPRCache::FindFreeRegister(u32 ®index) +{ for (u8 a = 0; a < NUMPPCREG; ++a) if (ArmCRegs[a].PPCReg == 33) { - s16 offset = PPCSTATE_OFF(ps) + (preg * 16) + (PS1 ? 8 : 0); - if (preLoad) - emit->VLDR(ArmCRegs[a].Reg, R9, offset); - ArmCRegs[a].PPCReg = preg; - ArmCRegs[a].LastLoad = 0; - ArmCRegs[a].PS1 = PS1; - ArmCRegs[a].Away = !preLoad; - return ArmCRegs[a].Reg; + regindex = a; + return true; } - // Alright, we couldn't get a free space, dump that least used register - s16 offsetOld = PPCSTATE_OFF(ps) + (ArmCRegs[Num].PPCReg * 16) + (ArmCRegs[Num].PS1 ? 8 : 0); - emit->VSTR(ArmCRegs[Num].Reg, R9, offsetOld); - - s16 offsetNew = PPCSTATE_OFF(ps) + (preg * 16) + (PS1 ? 8 : 0); - if (preLoad) - emit->VLDR(ArmCRegs[Num].Reg, R9, offsetNew); - ArmCRegs[Num].PPCReg = preg; - ArmCRegs[Num].LastLoad = 0; - ArmCRegs[Num].PS1 = PS1; - ArmCRegs[Num].Away = !preLoad; - return ArmCRegs[Num].Reg; + return false; +} +ARMReg ArmFPRCache::GetPPCReg(u32 preg, bool PS1, bool preLoad) +{ + u32 lastRegIndex = GetLeastUsedRegister(true); + + if (_regs[preg][PS1].GetType() != REG_NOTLOADED) + { + u8 a = _regs[preg][PS1].GetRegIndex(); + ArmCRegs[a].LastLoad = 0; + return ArmCRegs[a].Reg; + } + + u32 regindex; + if (FindFreeRegister(regindex)) + { + s16 offset = PPCSTATE_OFF(ps) + (preg * 16) + (PS1 ? 8 : 0); + + ArmCRegs[regindex].PPCReg = preg; + ArmCRegs[regindex].LastLoad = 0; + ArmCRegs[regindex].PS1 = PS1; + + _regs[preg][PS1].LoadToReg(regindex); + emit->VLDR(ArmCRegs[regindex].Reg, R9, offset); + return ArmCRegs[regindex].Reg; + } + + // Alright, we couldn't get a free space, dump that least used register + s16 offsetOld = PPCSTATE_OFF(ps) + (ArmCRegs[lastRegIndex].PPCReg * 16) + (ArmCRegs[lastRegIndex].PS1 ? 8 : 0); + s16 offsetNew = PPCSTATE_OFF(ps) + (preg * 16) + (PS1 ? 8 : 0); + + emit->VSTR(ArmCRegs[lastRegIndex].Reg, R9, offsetOld); + + _regs[ArmCRegs[lastRegIndex].PPCReg][ArmCRegs[lastRegIndex].PS1].Flush(); + + ArmCRegs[lastRegIndex].PPCReg = preg; + ArmCRegs[lastRegIndex].LastLoad = 0; + ArmCRegs[lastRegIndex].PS1 = PS1; + + _regs[preg][PS1].LoadToReg(lastRegIndex); + emit->VLDR(ArmCRegs[lastRegIndex].Reg, R9, offsetNew); + return ArmCRegs[lastRegIndex].Reg; } ARMReg ArmFPRCache::R0(u32 preg, bool preLoad) @@ -168,14 +177,28 @@ ARMReg ArmFPRCache::R1(u32 preg, bool preLoad) void ArmFPRCache::Flush() { - for(u8 a = 0; a < NUMPPCREG; ++a) - if (ArmCRegs[a].PPCReg != 33) + for (u8 a = 0; a < 32; ++a) + { + if (_regs[a][0].GetType() != REG_NOTLOADED) { - s16 offset = PPCSTATE_OFF(ps) + (ArmCRegs[a].PPCReg * 16) + (ArmCRegs[a].PS1 ? 8 : 0); - emit->VSTR(ArmCRegs[a].Reg, R9, offset); - ArmCRegs[a].PPCReg = 33; - ArmCRegs[a].LastLoad = 0; - ArmCRegs[a].Away = true; + s16 offset = PPCSTATE_OFF(ps) + (a * 16); + u32 regindex = _regs[a][0].GetRegIndex(); + emit->VSTR(ArmCRegs[regindex].Reg, R9, offset); + + ArmCRegs[regindex].PPCReg = 33; + ArmCRegs[regindex].LastLoad = 0; + _regs[a][0].Flush(); } + if (_regs[a][1].GetType() != REG_NOTLOADED) + { + s16 offset = PPCSTATE_OFF(ps) + (a * 16) + 8; + u32 regindex = _regs[a][1].GetRegIndex(); + emit->VSTR(ArmCRegs[regindex].Reg, R9, offset); + + ArmCRegs[regindex].PPCReg = 33; + ArmCRegs[regindex].LastLoad = 0; + _regs[a][1].Flush(); + } + } } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.h b/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.h index b8c17f470f..233b201b7c 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.h +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitFPRCache.h @@ -29,9 +29,10 @@ using namespace ArmGen; class ArmFPRCache { private: + OpArg _regs[32][2]; // One for each FPR reg JRCPPC ArmCRegs[ARMFPUREGS]; - JRCReg ArmRegs[ARMFPUREGS]; - + JRCReg ArmRegs[ARMFPUREGS]; + int NUMPPCREG; int NUMARMREG; @@ -40,9 +41,11 @@ private: ARMReg GetPPCReg(u32 preg, bool PS1, bool preLoad); + u32 GetLeastUsedRegister(bool increment); + bool FindFreeRegister(u32 ®index); protected: ARMXEmitter *emit; - + public: ArmFPRCache(); ~ArmFPRCache() {} @@ -51,7 +54,7 @@ public: void Start(PPCAnalyst::BlockRegStats &stats); void SetEmitter(ARMXEmitter *emitter) {emit = emitter;} - + ARMReg GetReg(bool AutoLock = true); // Return a ARM register we can use. void Unlock(ARMReg V0); void Flush(); diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.cpp index be79bd4b71..f1e678e971 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.cpp @@ -49,7 +49,7 @@ ARMReg *ArmRegCache::GetPPCAllocationOrder(int &count) { // This will return us the allocation order of the registers we can use on // the ppc side. - static ARMReg allocationOrder[] = + static ARMReg allocationOrder[] = { R0, R1, R2, R3, R4, R5, R6, R7, R8 }; @@ -60,7 +60,7 @@ ARMReg *ArmRegCache::GetAllocationOrder(int &count) { // This will return us the allocation order of the registers we can use on // the host side. - static ARMReg allocationOrder[] = + static ARMReg allocationOrder[] = { R14, R12, R11, R10 }; @@ -124,12 +124,10 @@ bool ArmRegCache::FindFreeRegister(u32 ®index) } ARMReg ArmRegCache::R(u32 preg) -{ +{ if (regs[preg].GetType() == REG_IMM) - { return BindToRegister(preg); - //asm ("bkpt #1;"); - } + u32 lastRegIndex = GetLeastUsedRegister(true); // Check if already Loaded @@ -139,7 +137,7 @@ ARMReg ArmRegCache::R(u32 preg) ArmCRegs[a].LastLoad = 0; return ArmCRegs[a].Reg; } - + // Check if we have a free register u32 regindex; if (FindFreeRegister(regindex)) @@ -160,10 +158,10 @@ ARMReg ArmRegCache::R(u32 preg) ArmCRegs[lastRegIndex].PPCReg = preg; ArmCRegs[lastRegIndex].LastLoad = 0; - + regs[preg].LoadToReg(lastRegIndex); - return ArmCRegs[lastRegIndex].Reg; + return ArmCRegs[lastRegIndex].Reg; } ARMReg ArmRegCache::BindToRegister(u32 preg) @@ -211,7 +209,7 @@ void ArmRegCache::Flush() for (u8 a = 0; a < 32; ++a) { if (regs[a].GetType() == REG_IMM) - BindToRegister(a); + BindToRegister(a); if (regs[a].GetType() == REG_REG) { u32 regindex = regs[a].GetRegIndex(); @@ -219,7 +217,7 @@ void ArmRegCache::Flush() ArmCRegs[regindex].PPCReg = 33; ArmCRegs[regindex].LastLoad = 0; } - + regs[a].Flush(); } } diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.h b/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.h index 9eac9eeee8..e1ac5fe0b7 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.h +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitRegCache.h @@ -38,55 +38,57 @@ using namespace ArmGen; enum RegType { REG_NOTLOADED = 0, - REG_REG, - REG_IMM, + REG_REG, // Reg type is register + REG_IMM, // Reg is really a IMM + REG_AWAY, // Bound to a register, but not preloaded }; -class OpArg +class OpArg { private: - class Reg{ - public: - RegType m_type; - u8 m_reg; // index to register - u32 m_value; - Reg() - { - m_type = REG_NOTLOADED; - m_reg = 33; - m_value = 0; - } - } Reg; + RegType m_type; // store type + u8 m_reg; // index to register + u32 m_value; // IMM value public: - OpArg(){} - + OpArg() + { + m_type = REG_NOTLOADED; + m_reg = 33; + m_value = 0; + } + RegType GetType() { - return Reg.m_type; + return m_type; } u8 GetRegIndex() { - return Reg.m_reg; + return m_reg; } u32 GetImm() { - return Reg.m_value; + return m_value; + } + void LoadToAway(u8 reg) + { + m_type = REG_AWAY; + m_reg = reg; } void LoadToReg(u8 reg) { - Reg.m_type = REG_REG; - Reg.m_reg = reg; + m_type = REG_REG; + m_reg = reg; } void LoadToImm(u32 imm) { - Reg.m_type = REG_IMM; - Reg.m_value = imm; + m_type = REG_IMM; + m_value = imm; } void Flush() { - Reg.m_type = REG_NOTLOADED; + m_type = REG_NOTLOADED; } }; @@ -96,7 +98,6 @@ struct JRCPPC bool PS1; ARMReg Reg; // Tied to which ARM Register u32 LastLoad; - bool Away; // Only used in FPR cache }; struct JRCReg { @@ -115,19 +116,19 @@ private: ARMReg *GetAllocationOrder(int &count); ARMReg *GetPPCAllocationOrder(int &count); - + u32 GetLeastUsedRegister(bool increment); bool FindFreeRegister(u32 ®index); protected: ARMXEmitter *emit; - + public: ArmRegCache(); ~ArmRegCache() {} void Init(ARMXEmitter *emitter); void Start(PPCAnalyst::BlockRegStats &stats); - + ARMReg GetReg(bool AutoLock = true); // Return a ARM register we can use. void Unlock(ARMReg R0, ARMReg R1 = INVALID_REG, ARMReg R2 = INVALID_REG, ARMReg R3 = INVALID_REG); @@ -135,7 +136,7 @@ public: ARMReg R(u32 preg); // Returns a cached register bool IsImm(u32 preg) { return regs[preg].GetType() == REG_IMM; } u32 GetImm(u32 preg) { return regs[preg].GetImm(); } - void SetImmediate(u32 preg, u32 imm); + void SetImmediate(u32 preg, u32 imm); ARMReg BindToRegister(u32 preg); }; diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp new file mode 100644 index 0000000000..c1bee507fc --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.cpp @@ -0,0 +1,743 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. +#include "../JitILCommon/IR.h" +#include "../PPCTables.h" +#include "../../CoreTiming.h" +#include "../../HW/Memmap.h" +#include "JitILAsm.h" +#include "JitIL.h" +#include "ArmEmitter.h" +#include "../../Core.h" + +using namespace IREmitter; +using namespace ArmGen; +static const unsigned int MAX_NUMBER_OF_REGS = 32; + +struct RegInfo { + JitArmIL *Jit; + IRBuilder* Build; + InstLoc FirstI; + std::vector IInfo; + std::vector lastUsed; + InstLoc regs[MAX_NUMBER_OF_REGS]; + InstLoc fregs[MAX_NUMBER_OF_REGS]; + unsigned numSpills; + unsigned numFSpills; + unsigned exitNumber; + + RegInfo(JitArmIL* j, InstLoc f, unsigned insts) : Jit(j), FirstI(f), IInfo(insts), lastUsed(insts) { + for (unsigned i = 0; i < MAX_NUMBER_OF_REGS; i++) { + regs[i] = 0; + fregs[i] = 0; + } + numSpills = 0; + numFSpills = 0; + exitNumber = 0; + } + + private: + RegInfo(RegInfo&); // DO NOT IMPLEMENT +}; + +static const ARMReg RegAllocOrder[] = {R0, R1, R2, R3, R4, R5, R6, R7, R8}; +static const int RegAllocSize = sizeof(RegAllocOrder) / sizeof(ARMReg); + +static unsigned SlotSet[1000]; + +static void regMarkUse(RegInfo& R, InstLoc I, InstLoc Op, unsigned OpNum) { + unsigned& info = R.IInfo[Op - R.FirstI]; + if (info == 0) R.IInfo[I - R.FirstI] |= 1 << (OpNum + 1); + if (info < 2) info++; + R.lastUsed[Op - R.FirstI] = max(R.lastUsed[Op - R.FirstI], I); +} +static void regClearInst(RegInfo& RI, InstLoc I) { + for (int i = 0; i < RegAllocSize; i++) + if (RI.regs[RegAllocOrder[i]] == I) + RI.regs[RegAllocOrder[i]] = 0; +} +static void regNormalRegClear(RegInfo& RI, InstLoc I) { + if (RI.IInfo[I - RI.FirstI] & 4) + regClearInst(RI, getOp1(I)); + if (RI.IInfo[I - RI.FirstI] & 8) + regClearInst(RI, getOp2(I)); +} + +static unsigned regReadUse(RegInfo& R, InstLoc I) { + return R.IInfo[I - R.FirstI] & 3; +} + +static u32 regLocForSlot(RegInfo& RI, unsigned slot) { + return (u32)&SlotSet[slot - 1]; +} + +static unsigned regCreateSpill(RegInfo& RI, InstLoc I) { + unsigned newSpill = ++RI.numSpills; + RI.IInfo[I - RI.FirstI] |= newSpill << 16; + return newSpill; +} + +static unsigned regGetSpill(RegInfo& RI, InstLoc I) { + return RI.IInfo[I - RI.FirstI] >> 16; +} + +static void regSpill(RegInfo& RI, ARMReg reg) { + if (!RI.regs[reg]) return; + unsigned slot = regGetSpill(RI, RI.regs[reg]); + if (!slot) { + slot = regCreateSpill(RI, RI.regs[reg]); + RI.Jit->MOVI2R(R14, regLocForSlot(RI, slot)); + RI.Jit->STR(reg, R14, 0); + } + RI.regs[reg] = 0; +} + +static ARMReg regFindFreeReg(RegInfo& RI) { + for (int i = 0; i < RegAllocSize; i++) + if (RI.regs[RegAllocOrder[i]] == 0) + return RegAllocOrder[i]; + + int bestIndex = -1; + InstLoc bestEnd = 0; + for (int i = 0; i < RegAllocSize; ++i) { + const InstLoc start = RI.regs[RegAllocOrder[i]]; + const InstLoc end = RI.lastUsed[start - RI.FirstI]; + if (bestEnd < end) { + bestEnd = end; + bestIndex = i; + } + } + + ARMReg reg = RegAllocOrder[bestIndex]; + regSpill(RI, reg); + return reg; +} +static ARMReg regLocForInst(RegInfo& RI, InstLoc I) { + for (int i = 0; i < RegAllocSize; i++) + if (RI.regs[RegAllocOrder[i]] == I) + return RegAllocOrder[i]; + + if (regGetSpill(RI, I) == 0) + PanicAlert("Retrieving unknown spill slot?!"); + RI.Jit->MOVI2R(R14, regLocForSlot(RI, regGetSpill(RI, I))); + ARMReg reg = regFindFreeReg(RI); + RI.Jit->LDR(reg, R14, 0); + return reg; +} +static ARMReg regBinLHSReg(RegInfo& RI, InstLoc I) { + ARMReg reg = regFindFreeReg(RI); + RI.Jit->MOV(reg, regLocForInst(RI, getOp1(I))); + return reg; +} + +// If the lifetime of the register used by an operand ends at I, +// return the register. Otherwise return a free register. +static ARMReg regBinReg(RegInfo& RI, InstLoc I) { + // FIXME: When regLocForInst() is extracted as a local variable, + // "Retrieving unknown spill slot?!" is shown. + if (RI.IInfo[I - RI.FirstI] & 4) + return regLocForInst(RI, getOp1(I)); + else if (RI.IInfo[I - RI.FirstI] & 8) + return regLocForInst(RI, getOp2(I)); + + return regFindFreeReg(RI); +} + +static void regSpillCallerSaved(RegInfo& RI) { + regSpill(RI, R0); + regSpill(RI, R1); + regSpill(RI, R2); + regSpill(RI, R3); +} + +static ARMReg regEnsureInReg(RegInfo& RI, InstLoc I) { + return regLocForInst(RI, I); +} + +static void regWriteExit(RegInfo& RI, InstLoc dest) { + if (isImm(*dest)) { + RI.exitNumber++; + RI.Jit->WriteExit(RI.Build->GetImmValue(dest)); + } else { + RI.Jit->WriteExitDestInReg(regLocForInst(RI, dest)); + } +} +static void regStoreInstToPPCState(RegInfo& RI, unsigned width, InstLoc I, s32 offset) { + void (JitArmIL::*op)(ARMReg, ARMReg, Operand2, bool); + switch(width) + { + case 32: + op = &JitArmIL::STR; + break; + case 8: + op = &JitArmIL::STRB; + break; + default: + PanicAlert("Not implemented!"); + return; + break; + } + + if (isImm(*I)) { + RI.Jit->MOVI2R(R12, RI.Build->GetImmValue(I)); + (RI.Jit->*op)(R12, R9, offset, true); + return; + } + ARMReg reg = regEnsureInReg(RI, I); + (RI.Jit->*op)(reg, R9, offset, true); +} + +// +// Mark and calculation routines for profiled load/store addresses +// Could be extended to unprofiled addresses. +static void regMarkMemAddress(RegInfo& RI, InstLoc I, InstLoc AI, unsigned OpNum) { + if (isImm(*AI)) { + unsigned addr = RI.Build->GetImmValue(AI); + if (Memory::IsRAMAddress(addr)) + return; + } + if (getOpcode(*AI) == Add && isImm(*getOp2(AI))) { + regMarkUse(RI, I, getOp1(AI), OpNum); + return; + } + regMarkUse(RI, I, AI, OpNum); +} +// Binary ops +void JitArmIL::BIN_XOR(ARMReg reg, Operand2 op2) +{ + EOR(reg, reg, op2); +} +void JitArmIL::BIN_OR(ARMReg reg, Operand2 op2) +{ + ORR(reg, reg, op2); +} +void JitArmIL::BIN_AND(ARMReg reg, Operand2 op2) +{ + AND(reg, reg, op2); +} +void JitArmIL::BIN_ADD(ARMReg reg, Operand2 op2) +{ + ADD(reg, reg, op2); +} +static void regEmitShiftInst(RegInfo& RI, InstLoc I, void (JitArmIL::*op)(ARMReg, ARMReg, Operand2)) +{ + ARMReg reg = regBinLHSReg(RI, I); + if (isImm(*getOp2(I))) { + unsigned RHS = RI.Build->GetImmValue(getOp2(I)); + (RI.Jit->*op)(reg, reg, RHS); + RI.regs[reg] = I; + return; + } + (RI.Jit->*op)(reg, reg, regLocForInst(RI, getOp2(I))); + RI.regs[reg] = I; + regNormalRegClear(RI, I); +} + +static void regEmitBinInst(RegInfo& RI, InstLoc I, + void (JitArmIL::*op)(ARMReg, Operand2), + bool commutable = false) { + ARMReg reg; + bool commuted = false; + if (RI.IInfo[I - RI.FirstI] & 4) { + reg = regEnsureInReg(RI, getOp1(I)); + } else if (commutable && (RI.IInfo[I - RI.FirstI] & 8)) { + reg = regEnsureInReg(RI, getOp2(I)); + commuted = true; + } else { + reg = regFindFreeReg(RI); + RI.Jit->MOV(reg, regLocForInst(RI, getOp1(I))); + } + if (isImm(*getOp2(I))) { + unsigned RHS = RI.Build->GetImmValue(getOp2(I)); + Operand2 RHSop; + if (TryMakeOperand2(RHS, RHSop)) + (RI.Jit->*op)(reg, RHSop); + else + { + RI.Jit->MOVI2R(R12, RHS); + (RI.Jit->*op)(reg, R12); + } + } else if (commuted) { + (RI.Jit->*op)(reg, regLocForInst(RI, getOp1(I))); + } else { + (RI.Jit->*op)(reg, regLocForInst(RI, getOp2(I))); + } + RI.regs[reg] = I; + regNormalRegClear(RI, I); +} +static void regEmitCmp(RegInfo& RI, InstLoc I) { + if (isImm(*getOp2(I))) { + unsigned RHS = RI.Build->GetImmValue(getOp2(I)); + Operand2 op; + if (TryMakeOperand2(RHS, op)) + RI.Jit->CMP(regLocForInst(RI, getOp1(I)), op); + else + { + RI.Jit->MOVI2R(R12, RHS); + RI.Jit->CMP(regLocForInst(RI, getOp1(I)), R12); + } + } else { + ARMReg reg = regEnsureInReg(RI, getOp1(I)); + RI.Jit->CMP(reg, regLocForInst(RI, getOp2(I))); + } +} + +static void DoWriteCode(IRBuilder* ibuild, JitArmIL* Jit, u32 exitAddress) { + RegInfo RI(Jit, ibuild->getFirstInst(), ibuild->getNumInsts()); + RI.Build = ibuild; + + // Pass to compute liveness + ibuild->StartBackPass(); + for (unsigned int index = (unsigned int)RI.IInfo.size() - 1; index != -1U; --index) { + InstLoc I = ibuild->ReadBackward(); + unsigned int op = getOpcode(*I); + bool thisUsed = regReadUse(RI, I) ? true : false; + switch (op) { + default: + PanicAlert("Unexpected inst!"); + case Nop: + case CInt16: + case CInt32: + case LoadGReg: + case LoadLink: + case LoadCR: + case LoadCarry: + case LoadCTR: + case LoadMSR: + case LoadFReg: + case LoadFRegDENToZero: + case LoadGQR: + case BlockEnd: + case BlockStart: + case InterpreterFallback: + case SystemCall: + case RFIExit: + case InterpreterBranch: + case ShortIdleLoop: + case FPExceptionCheck: + case DSIExceptionCheck: + case ISIException: + case ExtExceptionCheck: + case BreakPointCheck: + case Int3: + case Tramp: + // No liveness effects + break; + case SExt8: + case SExt16: + case BSwap32: + case BSwap16: + case Cntlzw: + case Not: + case DupSingleToMReg: + case DoubleToSingle: + case ExpandPackedToMReg: + case CompactMRegToPacked: + case FPNeg: + case FPDup0: + case FPDup1: + case FSNeg: + case FDNeg: + if (thisUsed) + regMarkUse(RI, I, getOp1(I), 1); + break; + case Load8: + case Load16: + case Load32: + regMarkMemAddress(RI, I, getOp1(I), 1); + break; + case LoadDouble: + case LoadSingle: + case LoadPaired: + if (thisUsed) + regMarkUse(RI, I, getOp1(I), 1); + break; + case StoreCR: + case StoreCarry: + case StoreFPRF: + regMarkUse(RI, I, getOp1(I), 1); + break; + case StoreGReg: + case StoreLink: + case StoreCTR: + case StoreMSR: + case StoreGQR: + case StoreSRR: + case StoreFReg: + if (!isImm(*getOp1(I))) + regMarkUse(RI, I, getOp1(I), 1); + break; + case Add: + case Sub: + case And: + case Or: + case Xor: + case Mul: + case MulHighUnsigned: + case Rol: + case Shl: + case Shrl: + case Sarl: + case ICmpCRUnsigned: + case ICmpCRSigned: + case ICmpEq: + case ICmpNe: + case ICmpUgt: + case ICmpUlt: + case ICmpUge: + case ICmpUle: + case ICmpSgt: + case ICmpSlt: + case ICmpSge: + case ICmpSle: + case FSMul: + case FSAdd: + case FSSub: + case FSRSqrt: + case FDMul: + case FDAdd: + case FDSub: + case FPAdd: + case FPMul: + case FPSub: + case FPMerge00: + case FPMerge01: + case FPMerge10: + case FPMerge11: + case FDCmpCR: + case InsertDoubleInMReg: + if (thisUsed) { + regMarkUse(RI, I, getOp1(I), 1); + if (!isImm(*getOp2(I))) + regMarkUse(RI, I, getOp2(I), 2); + } + break; + case Store8: + case Store16: + case Store32: + if (!isImm(*getOp1(I))) + regMarkUse(RI, I, getOp1(I), 1); + regMarkMemAddress(RI, I, getOp2(I), 2); + break; + case StoreSingle: + case StoreDouble: + case StorePaired: + regMarkUse(RI, I, getOp1(I), 1); + regMarkUse(RI, I, getOp2(I), 2); + break; + case BranchUncond: + if (!isImm(*getOp1(I))) + regMarkUse(RI, I, getOp1(I), 1); + break; + case IdleBranch: + regMarkUse(RI, I, getOp1(getOp1(I)), 1); + break; + case BranchCond: { + if (isICmp(*getOp1(I)) && + isImm(*getOp2(getOp1(I)))) { + regMarkUse(RI, I, getOp1(getOp1(I)), 1); + } else { + regMarkUse(RI, I, getOp1(I), 1); + } + if (!isImm(*getOp2(I))) + regMarkUse(RI, I, getOp2(I), 2); + break; + } + } + } + + ibuild->StartForwardPass(); + for (unsigned i = 0; i != RI.IInfo.size(); i++) { + InstLoc I = ibuild->ReadForward(); + + bool thisUsed = regReadUse(RI, I) ? true : false; + if (thisUsed) { + // Needed for IR Writer + ibuild->SetMarkUsed(I); + } + + switch (getOpcode(*I)) { + case CInt32: + case CInt16: { + if (!thisUsed) break; + ARMReg reg = regFindFreeReg(RI); + Jit->MOVI2R(reg, ibuild->GetImmValue(I)); + RI.regs[reg] = I; + break; + } + case BranchUncond: { + regWriteExit(RI, getOp1(I)); + regNormalRegClear(RI, I); + break; + } + case BranchCond: { + if (isICmp(*getOp1(I)) && + isImm(*getOp2(getOp1(I)))) { + unsigned imm = RI.Build->GetImmValue(getOp2(getOp1(I))); + if (imm > 255) + { + Jit->MOVI2R(R14, imm); + Jit->CMP(regLocForInst(RI, getOp1(getOp1(I))), R14); + } + else + Jit->CMP(regLocForInst(RI, getOp1(getOp1(I))), imm); + CCFlags flag; + switch (getOpcode(*getOp1(I))) { + case ICmpEq: flag = CC_NEQ; break; + case ICmpNe: flag = CC_EQ; break; + case ICmpUgt: flag = CC_LS; break; + case ICmpUlt: flag = CC_HI; break; + case ICmpUge: flag = CC_HS; break; + case ICmpUle: flag = CC_LO; break; + case ICmpSgt: flag = CC_LT; break; + case ICmpSlt: flag = CC_GT; break; + case ICmpSge: flag = CC_LE; break; + case ICmpSle: flag = CC_GE; break; + default: PanicAlert("cmpXX"); flag = CC_AL; break; + } + FixupBranch cont = Jit->B_CC(flag); + regWriteExit(RI, getOp2(I)); + Jit->SetJumpTarget(cont); + if (RI.IInfo[I - RI.FirstI] & 4) + regClearInst(RI, getOp1(getOp1(I))); + } else { + Jit->CMP(regLocForInst(RI, getOp1(I)), 0); + FixupBranch cont = Jit->B_CC(CC_EQ); + regWriteExit(RI, getOp2(I)); + Jit->SetJumpTarget(cont); + if (RI.IInfo[I - RI.FirstI] & 4) + regClearInst(RI, getOp1(I)); + } + if (RI.IInfo[I - RI.FirstI] & 8) + regClearInst(RI, getOp2(I)); + break; + } + + case StoreGReg: { + unsigned ppcreg = *I >> 16; + regStoreInstToPPCState(RI, 32, getOp1(I), PPCSTATE_OFF(gpr[ppcreg])); + regNormalRegClear(RI, I); + break; + } + case StoreCR: { + unsigned ppcreg = *I >> 16; + regStoreInstToPPCState(RI, 8, getOp1(I), PPCSTATE_OFF(cr_fast[ppcreg])); + regNormalRegClear(RI, I); + break; + } + case StoreLink: { + regStoreInstToPPCState(RI, 32, getOp1(I), PPCSTATE_OFF(spr[SPR_LR])); + regNormalRegClear(RI, I); + break; + } + case StoreCTR: { + regStoreInstToPPCState(RI, 32, getOp1(I), PPCSTATE_OFF(spr[SPR_CTR])); + regNormalRegClear(RI, I); + break; + } + case StoreMSR: { + regStoreInstToPPCState(RI, 32, getOp1(I), PPCSTATE_OFF(msr)); + regNormalRegClear(RI, I); + break; + } + case LoadGReg: { + if (!thisUsed) break; + ARMReg reg = regFindFreeReg(RI); + unsigned ppcreg = *I >> 8; + Jit->LDR(reg, R9, PPCSTATE_OFF(gpr[ppcreg])); + RI.regs[reg] = I; + break; + } + case LoadCR: { + if (!thisUsed) break; + ARMReg reg = regFindFreeReg(RI); + unsigned ppcreg = *I >> 8; + Jit->LDRB(reg, R9, PPCSTATE_OFF(cr_fast[ppcreg])); + RI.regs[reg] = I; + break; + } + case LoadCTR: { + if (!thisUsed) break; + ARMReg reg = regFindFreeReg(RI); + Jit->LDR(reg, R9, PPCSTATE_OFF(spr[SPR_CTR])); + RI.regs[reg] = I; + break; + } + case LoadLink: { + if (!thisUsed) break; + ARMReg reg = regFindFreeReg(RI); + Jit->LDR(reg, R9, PPCSTATE_OFF(spr[SPR_LR])); + RI.regs[reg] = I; + break; + } + case InterpreterFallback: { + unsigned InstCode = ibuild->GetImmValue(getOp1(I)); + unsigned InstLoc = ibuild->GetImmValue(getOp2(I)); + // There really shouldn't be anything live across an + // interpreter call at the moment, but optimizing interpreter + // calls isn't completely out of the question... + regSpillCallerSaved(RI); + Jit->MOVI2R(R14, InstLoc); + Jit->STR(R14, R9, PPCSTATE_OFF(pc)); + Jit->MOVI2R(R14, InstLoc + 4); + Jit->STR(R14, R9, PPCSTATE_OFF(npc)); + + Jit->MOVI2R(R0, InstCode); + Jit->MOVI2R(R14, (u32)GetInterpreterOp(InstCode)); + Jit->BL(R14); + break; + } + case SystemCall: { + unsigned InstLoc = ibuild->GetImmValue(getOp1(I)); + Jit->MOVI2R(R14, InstLoc + 4); + Jit->STR(R14, R9, PPCSTATE_OFF(pc)); + Jit->LDR(R14, R9, PPCSTATE_OFF(Exceptions)); + Jit->ORR(R14, R14, EXCEPTION_SYSCALL); + Jit->STR(R14, R9, PPCSTATE_OFF(Exceptions)); + Jit->WriteExceptionExit(); + break; + } + case ShortIdleLoop: { + unsigned InstLoc = ibuild->GetImmValue(getOp1(I)); + Jit->MOVI2R(R14, (u32)&CoreTiming::Idle); + Jit->BL(R14); + Jit->MOVI2R(R14, InstLoc); + Jit->STR(R14, R9, PPCSTATE_OFF(pc)); + Jit->MOVI2R(R14, (u32)Jit->GetAsmRoutines()->testExceptions); + Jit->B(R14); + break; + } + case InterpreterBranch: { + Jit->LDR(R14, R9, PPCSTATE_OFF(npc)); + Jit->WriteExitDestInReg(R14); + break; + } + case RFIExit: { + const u32 mask = 0x87C0FFFF; + const u32 clearMSR13 = 0xFFFBFFFF; // Mask used to clear the bit MSR[13] + // MSR = ((MSR & ~mask) | (SRR1 & mask)) & clearMSR13; + // R0 = MSR location + // R1 = MSR contents + // R2 = Mask + // R3 = Mask + ARMReg rA = R14; + ARMReg rB = R12; + ARMReg rC = R11; + ARMReg rD = R10; + Jit->MOVI2R(rB, (~mask) & clearMSR13); + Jit->MOVI2R(rC, mask & clearMSR13); + + Jit->LDR(rD, R9, PPCSTATE_OFF(msr)); + + Jit->AND(rD, rD, rB); // rD = Masked MSR + + Jit->LDR(rB, R9, PPCSTATE_OFF(spr[SPR_SRR1])); // rB contains SRR1 here + + Jit->AND(rB, rB, rC); // rB contains masked SRR1 here + Jit->ORR(rB, rD, rB); // rB = Masked MSR OR masked SRR1 + + Jit->STR(rB, R9, PPCSTATE_OFF(msr)); // STR rB in to rA + + Jit->LDR(rA, R9, PPCSTATE_OFF(spr[SPR_SRR0])); + + Jit->WriteRfiExitDestInR(rA); // rA gets unlocked here + break; + } + case Shl: { + if (!thisUsed) break; + regEmitShiftInst(RI, I, &JitArmIL::LSL); + break; + } + case Shrl: { + if (!thisUsed) break; + regEmitShiftInst(RI, I, &JitArmIL::LSR); + break; + } + case Sarl: { + if (!thisUsed) break; + regEmitShiftInst(RI, I, &JitArmIL::ASR); + break; + } + case And: { + if (!thisUsed) break; + regEmitBinInst(RI, I, &JitArmIL::BIN_AND, true); + break; + } + case Not: { + if (!thisUsed) break; + ARMReg reg = regBinLHSReg(RI, I); + Jit->MVN(reg, reg); + RI.regs[reg] = I; + regNormalRegClear(RI, I); + break; + } + case Or: { + if (!thisUsed) break; + regEmitBinInst(RI, I, &JitArmIL::BIN_OR, true); + break; + } + case Xor: { + if (!thisUsed) break; + regEmitBinInst(RI, I, &JitArmIL::BIN_XOR, true); + break; + } + case Add: { + if (!thisUsed) break; + regEmitBinInst(RI, I, &JitArmIL::BIN_ADD, true); + break; + } + case ICmpCRUnsigned: { + if (!thisUsed) break; + regEmitCmp(RI, I); + ARMReg reg = regBinReg(RI, I); + Jit->MOV(reg, 0x2); // Result == 0 + Jit->SetCC(CC_LO); Jit->MOV(reg, 0x8); // Result < 0 + Jit->SetCC(CC_HI); Jit->MOV(reg, 0x4); // Result > 0 + Jit->SetCC(); + RI.regs[reg] = I; + regNormalRegClear(RI, I); + break; + } + + case ICmpCRSigned: { + if (!thisUsed) break; + regEmitCmp(RI, I); + ARMReg reg = regBinReg(RI, I); + Jit->MOV(reg, 0x2); // Result == 0 + Jit->SetCC(CC_LT); Jit->MOV(reg, 0x8); // Result < 0 + Jit->SetCC(CC_GT); Jit->MOV(reg, 0x4); // Result > 0 + Jit->SetCC(); + RI.regs[reg] = I; + regNormalRegClear(RI, I); + break; + } + case Int3: + Jit->BKPT(0x321); + break; + case Tramp: break; + case Nop: break; + default: + PanicAlert("Unknown JIT instruction; aborting!"); + ibuild->WriteToFile(0); + exit(1); + } + } + for (unsigned i = 0; i < MAX_NUMBER_OF_REGS; i++) { + if (RI.regs[i]) { + // Start a game in Burnout 2 to get this. Or animal crossing. + PanicAlert("Incomplete cleanup! (regs)"); + exit(1); + } + if (RI.fregs[i]) { + PanicAlert("Incomplete cleanup! (fregs)"); + exit(1); + } + } + + Jit->WriteExit(exitAddress); + Jit->BKPT(0x111); + +} +void JitArmIL::WriteCode(u32 exitAddress) { + DoWriteCode(&ibuild, this, exitAddress); +} diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.h b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.h new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/IR_Arm.h @@ -0,0 +1 @@ + diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp new file mode 100644 index 0000000000..44ebc8b6eb --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.cpp @@ -0,0 +1,368 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include + +#include "Common.h" +#include "../../HLE/HLE.h" +#include "../../Core.h" +#include "../../PatchEngine.h" +#include "../../CoreTiming.h" +#include "../../ConfigManager.h" +#include "../PowerPC.h" +#include "../Profiler.h" +#include "../PPCTables.h" +#include "../PPCAnalyst.h" +#include "../../HW/Memmap.h" +#include "../../HW/GPFifo.h" +#include "JitIL.h" +#include "JitIL_Tables.h" +#include "ArmEmitter.h" +#include "../JitInterface.h" + +using namespace ArmGen; +using namespace PowerPC; + +static int CODE_SIZE = 1024*1024*32; +namespace CPUCompare +{ + extern u32 m_BlockStart; +} +void JitArmIL::Init() +{ + AllocCodeSpace(CODE_SIZE); + blocks.Init(); + asm_routines.Init(); +} + +void JitArmIL::ClearCache() +{ + ClearCodeSpace(); + blocks.Clear(); +} + +void JitArmIL::Shutdown() +{ + FreeCodeSpace(); + blocks.Shutdown(); + asm_routines.Shutdown(); +} +void JitArmIL::unknown_instruction(UGeckoInstruction inst) +{ + // CCPU::Break(); + PanicAlert("unknown_instruction %08x - Fix me ;)", inst.hex); +} + +void JitArmIL::Default(UGeckoInstruction _inst) +{ + ibuild.EmitInterpreterFallback( + ibuild.EmitIntConst(_inst.hex), + ibuild.EmitIntConst(js.compilerPC)); +} + +void JitArmIL::HLEFunction(UGeckoInstruction _inst) +{ + // XXX +} + +void JitArmIL::DoNothing(UGeckoInstruction _inst) +{ + // Yup, just don't do anything. +} +void JitArmIL::Break(UGeckoInstruction _inst) +{ + ibuild.EmitINT3(); +} + +void JitArmIL::DoDownCount() +{ + ARMReg rA = R14; + ARMReg rB = R12; + MOVI2R(rA, (u32)&CoreTiming::downcount); + LDR(rB, rA); + if(js.downcountAmount < 255) // We can enlarge this if we used rotations + { + SUBS(rB, rB, js.downcountAmount); + STR(rB, rA); + } + else + { + ARMReg rC = R11; + MOVI2R(rC, js.downcountAmount); + SUBS(rB, rB, rC); + STR(rB, rA); + } +} + +void JitArmIL::WriteExitDestInReg(ARMReg Reg) +{ + STR(Reg, R9, PPCSTATE_OFF(pc)); + DoDownCount(); + MOVI2R(Reg, (u32)asm_routines.dispatcher); + B(Reg); +} + +void JitArmIL::WriteRfiExitDestInR(ARMReg Reg) +{ + STR(Reg, R9, PPCSTATE_OFF(pc)); + DoDownCount(); + MOVI2R(Reg, (u32)asm_routines.testExceptions); + B(Reg); +} +void JitArmIL::WriteExceptionExit() +{ + DoDownCount(); + + MOVI2R(R14, (u32)asm_routines.testExceptions); + B(R14); +} +void JitArmIL::WriteExit(u32 destination) +{ + DoDownCount(); + //If nobody has taken care of this yet (this can be removed when all branches are done) + JitBlock *b = js.curBlock; + JitBlock::LinkData linkData; + linkData.exitAddress = destination; + linkData.exitPtrs = GetWritableCodePtr(); + + // Link opportunity! + int block = blocks.GetBlockNumberFromStartAddress(destination); + if (block >= 0 && jo.enableBlocklink) + { + // It exists! Joy of joy! + B(blocks.GetBlock(block)->checkedEntry); + linkData.linkStatus = true; + } + else + { + MOVI2R(R14, destination); + STR(R14, R9, PPCSTATE_OFF(pc)); + MOVI2R(R14, (u32)asm_routines.dispatcher); + B(R14); + } + + b->linkData.push_back(linkData); +} +void JitArmIL::PrintDebug(UGeckoInstruction inst, u32 level) +{ + if (level > 0) + printf("Start: %08x OP '%s' Info\n", (u32)GetCodePtr(), PPCTables::GetInstructionName(inst)); + if (level > 1) + { + GekkoOPInfo* Info = GetOpInfo(inst.hex); + printf("\tOuts\n"); + if (Info->flags & FL_OUT_A) + printf("\t-OUT_A: %x\n", inst.RA); + if(Info->flags & FL_OUT_D) + printf("\t-OUT_D: %x\n", inst.RD); + printf("\tIns\n"); + // A, AO, B, C, S + if(Info->flags & FL_IN_A) + printf("\t-IN_A: %x\n", inst.RA); + if(Info->flags & FL_IN_A0) + printf("\t-IN_A0: %x\n", inst.RA); + if(Info->flags & FL_IN_B) + printf("\t-IN_B: %x\n", inst.RB); + if(Info->flags & FL_IN_C) + printf("\t-IN_C: %x\n", inst.RC); + if(Info->flags & FL_IN_S) + printf("\t-IN_S: %x\n", inst.RS); + } +} + +void STACKALIGN JitArmIL::Run() +{ + CompiledCode pExecAddr = (CompiledCode)asm_routines.enterCode; + pExecAddr(); +} + +void JitArmIL::SingleStep() +{ + CompiledCode pExecAddr = (CompiledCode)asm_routines.enterCode; + pExecAddr(); +} +void STACKALIGN JitArmIL::Jit(u32 em_address) +{ + if (GetSpaceLeft() < 0x10000 || blocks.IsFull() || Core::g_CoreStartupParameter.bJITNoBlockCache) + { + ClearCache(); + } + + int block_num = blocks.AllocateBlock(PowerPC::ppcState.pc); + JitBlock *b = blocks.GetBlock(block_num); + const u8* BlockPtr = DoJit(PowerPC::ppcState.pc, &code_buffer, b); + blocks.FinalizeBlock(block_num, jo.enableBlocklink, BlockPtr); +} + +const u8* JitArmIL::DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buf, JitBlock *b) +{ + int blockSize = code_buf->GetSize(); + // Memory exception on instruction fetch + bool memory_exception = false; + + // A broken block is a block that does not end in a branch + bool broken_block = false; + + if (Core::g_CoreStartupParameter.bEnableDebugging) + { + // Comment out the following to disable breakpoints (speed-up) + blockSize = 1; + broken_block = true; + } + + if (em_address == 0) + { + Core::SetState(Core::CORE_PAUSE); + PanicAlert("ERROR: Compiling at 0. LR=%08x CTR=%08x", LR, CTR); + } + + if (Core::g_CoreStartupParameter.bMMU && (em_address & JIT_ICACHE_VMEM_BIT)) + { + if (!Memory::TranslateAddress(em_address, Memory::FLAG_OPCODE)) + { + // Memory exception occurred during instruction fetch + memory_exception = true; + } + } + + + int size = 0; + js.isLastInstruction = false; + js.blockStart = em_address; + js.fifoBytesThisBlock = 0; + js.curBlock = b; + js.block_flags = 0; + js.cancel = false; + + // Analyze the block, collect all instructions it is made of (including inlining, + // if that is enabled), reorder instructions for optimal performance, and join joinable instructions. + u32 nextPC = em_address; + u32 merged_addresses[32]; + const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]); + int size_of_merged_addresses = 0; + if (!memory_exception) + { + // If there is a memory exception inside a block (broken_block==true), compile up to that instruction. + nextPC = PPCAnalyst::Flatten(em_address, &size, &js.st, &js.gpa, &js.fpa, broken_block, code_buf, blockSize, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses); + } + PPCAnalyst::CodeOp *ops = code_buf->codebuffer; + + const u8 *start = GetCodePtr(); + b->checkedEntry = start; + b->runCount = 0; + + // Downcount flag check, Only valid for linked blocks + { + // XXX + } + + const u8 *normalEntry = GetCodePtr(); + b->normalEntry = normalEntry; + + if (js.fpa.any) + { + // XXX + // This block uses FPU - needs to add FP exception bailout + } + js.rewriteStart = (u8*)GetCodePtr(); + + u64 codeHash = -1; + { + // For profiling and IR Writer + for (int i = 0; i < (int)size; i++) + { + const u64 inst = ops[i].inst.hex; + // Ported from boost::hash + codeHash ^= inst + (codeHash << 6) + (codeHash >> 2); + } + } + + // Conditionally add profiling code. + if (Profiler::g_ProfileBlocks) { + // XXX + } + // Start up IR builder (structure that collects the + // instruction processed by the JIT routines) + ibuild.Reset(); + + js.downcountAmount = 0; + if (!Core::g_CoreStartupParameter.bEnableDebugging) + { + for (int i = 0; i < size_of_merged_addresses; ++i) + { + const u32 address = merged_addresses[i]; + js.downcountAmount += PatchEngine::GetSpeedhackCycles(address); + } + } + + js.skipnext = false; + js.blockSize = size; + js.compilerPC = nextPC; + // Translate instructions + for (int i = 0; i < (int)size; i++) + { + js.compilerPC = ops[i].address; + js.op = &ops[i]; + js.instructionNumber = i; + const GekkoOPInfo *opinfo = ops[i].opinfo; + js.downcountAmount += (opinfo->numCyclesMinusOne + 1); + + if (i == (int)size - 1) + { + // WARNING - cmp->branch merging will screw this up. + js.isLastInstruction = true; + js.next_inst = 0; + if (Profiler::g_ProfileBlocks) { + // CAUTION!!! push on stack regs you use, do your stuff, then pop + PROFILER_VPUSH; + // get end tic + PROFILER_QUERY_PERFORMANCE_COUNTER(&b->ticStop); + // tic counter += (end tic - start tic) + PROFILER_ADD_DIFF_LARGE_INTEGER(&b->ticCounter, &b->ticStop, &b->ticStart); + PROFILER_VPOP; + } + } + else + { + // help peephole optimizations + js.next_inst = ops[i + 1].inst; + js.next_compilerPC = ops[i + 1].address; + } + if (!ops[i].skip) + { + PrintDebug(ops[i].inst, 0); + if (js.memcheck && (opinfo->flags & FL_USE_FPU)) + { + // Don't do this yet + BKPT(0x7777); + } + JitArmILTables::CompileInstruction(ops[i]); + if (js.memcheck && (opinfo->flags & FL_LOADSTORE)) + { + // Don't do this yet + BKPT(0x666); + } + } + } + if (memory_exception) + BKPT(0x500); + if (broken_block) + { + printf("Broken Block going to 0x%08x\n", nextPC); + WriteExit(nextPC); + } + + // Perform actual code generation + + WriteCode(nextPC); + b->flags = js.block_flags; + b->codeSize = (u32)(GetCodePtr() - normalEntry); + b->originalSize = size; + + { + } + FlushIcache(); + return start; + +} diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h new file mode 100644 index 0000000000..71b09a3251 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL.h @@ -0,0 +1,99 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _JITARMIL_H +#define _JITARMIL_H + +#include "../PPCAnalyst.h" +#include "ArmEmitter.h" +#include "../JitArm32/JitArmCache.h" +#include "../JitILCommon/JitILBase.h" +#include "../JitILCommon/IR.h" +#include "../JitCommon/JitBase.h" +#include "JitILAsm.h" + +#define JITDISABLE(setting) \ + if (Core::g_CoreStartupParameter.bJITOff || \ + Core::g_CoreStartupParameter.setting) \ + {Default(inst); return;} + +#define PPCSTATE_OFF(elem) ((s32)STRUCT_OFF(PowerPC::ppcState, elem) - (s32)STRUCT_OFF(PowerPC::ppcState, spr[0])) +class JitArmIL : public JitILBase, public ArmGen::ARMXCodeBlock +{ +private: + JitArmBlockCache blocks; + JitArmILAsmRoutineManager asm_routines; + + void PrintDebug(UGeckoInstruction inst, u32 level); + void DoDownCount(); + +public: + // Initialization, etc + JitArmIL() {} + ~JitArmIL() {} + + void Init(); + void Shutdown(); + + // Jit! + + void Jit(u32 em_address); + const u8* DoJit(u32 em_address, PPCAnalyst::CodeBuffer *code_buffer, JitBlock *b); + + JitBaseBlockCache *GetBlockCache() { return &blocks; } + + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) { return NULL; } + + bool IsInCodeSpace(u8 *ptr) { return IsInSpace(ptr); } + + void ClearCache(); + const u8 *GetDispatcher() { + return asm_routines.dispatcher; // asm_routines.dispatcher + } + const CommonAsmRoutinesBase *GetAsmRoutines() { + return &asm_routines; + } + + const char *GetName() { + return "JITARMIL"; + } + + // Run! + + void Run(); + void SingleStep(); + // + void WriteCode(u32 exitAddress); + void WriteExit(u32 destination); + void WriteExitDestInReg(ARMReg Reg); + void WriteRfiExitDestInR(ARMReg Reg); + void WriteExceptionExit(); + + // OPCODES + void unknown_instruction(UGeckoInstruction inst); + void Default(UGeckoInstruction inst); + void DoNothing(UGeckoInstruction inst); + void HLEFunction(UGeckoInstruction inst); + void Break(UGeckoInstruction inst); + + void DynaRunTable4(UGeckoInstruction inst); + void DynaRunTable19(UGeckoInstruction inst); + void DynaRunTable31(UGeckoInstruction inst); + void DynaRunTable59(UGeckoInstruction inst); + void DynaRunTable63(UGeckoInstruction inst); + + // Binary ops + void BIN_AND(ARMReg reg, Operand2 op2); + void BIN_XOR(ARMReg reg, Operand2 op2); + void BIN_OR(ARMReg reg, Operand2 op2); + void BIN_ADD(ARMReg reg, Operand2 op2); + + // Branches + void bx(UGeckoInstruction inst); + void bcx(UGeckoInstruction inst); + void bclrx(UGeckoInstruction inst); + void bcctrx(UGeckoInstruction inst); +}; + +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.cpp new file mode 100644 index 0000000000..2cb9e298f2 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.cpp @@ -0,0 +1,120 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. +#include "../../HW/Memmap.h" + +#include "../PowerPC.h" +#include "../../CoreTiming.h" +#include "MemoryUtil.h" + +#include "JitIL.h" +#include "../JitCommon/JitCache.h" + +#include "../../HW/GPFifo.h" +#include "../../Core.h" + +#include "JitILAsm.h" +#include "ArmEmitter.h" + +JitArmILAsmRoutineManager armil_asm_routines; +void JitArmILAsmRoutineManager::Generate() +{ + enterCode = GetCodePtr(); + PUSH(9, R4, R5, R6, R7, R8, R9, R10, R11, _LR); + // Take care to 8-byte align stack for function calls. + // We are misaligned here because of an odd number of args for PUSH. + // It's not like x86 where you need to account for an extra 4 bytes + // consumed by CALL. + SUB(_SP, _SP, 4); + + MOVI2R(R0, (u32)&CoreTiming::downcount); + MOVI2R(R9, (u32)&PowerPC::ppcState.spr[0]); + + FixupBranch skipToRealDispatcher = B(); + dispatcher = GetCodePtr(); + printf("ILDispatcher is %p\n", dispatcher); + + // Downcount Check + // The result of slice decrementation should be in flags if somebody jumped here + // IMPORTANT - We jump on negative, not carry!!! + FixupBranch bail = B_CC(CC_MI); + + SetJumpTarget(skipToRealDispatcher); + dispatcherNoCheck = GetCodePtr(); + + // This block of code gets the address of the compiled block of code + // It runs though to the compiling portion if it isn't found + LDR(R12, R9, PPCSTATE_OFF(pc));// Load the current PC into R12 + + Operand2 iCacheMask = Operand2(0xE, 2); // JIT_ICACHE_MASK + BIC(R12, R12, iCacheMask); // R12 contains PC & JIT_ICACHE_MASK here. + + MOVI2R(R14, (u32)jit->GetBlockCache()->iCache); + + LDR(R12, R14, R12); // R12 contains iCache[PC & JIT_ICACHE_MASK] here + // R12 Confirmed this is the correct iCache Location loaded. + TST(R12, 0x80); // Test to see if it is a JIT block. + + SetCC(CC_EQ); + // Success, it is our Jitblock. + MOVI2R(R14, (u32)jit->GetBlockCache()->GetCodePointers()); + // LDR R14 right here to get CodePointers()[0] pointer. + LSL(R12, R12, 2); // Multiply by four because address locations are u32 in size + LDR(R14, R14, R12); // Load the block address in to R14 + + B(R14); + // No need to jump anywhere after here, the block will go back to dispatcher start + SetCC(); + + // If we get to this point, that means that we don't have the block cached to execute + // So call ArmJit to compile the block and then execute it. + MOVI2R(R14, (u32)&Jit); + BL(R14); + + B(dispatcherNoCheck); + + // fpException() + // Floating Point Exception Check, Jumped to if false + fpException = GetCodePtr(); + LDR(R0, R9, PPCSTATE_OFF(Exceptions)); + ORR(R0, R0, EXCEPTION_FPU_UNAVAILABLE); + STR(R0, R9, PPCSTATE_OFF(Exceptions)); + QuickCallFunction(R14, (void*)&PowerPC::CheckExceptions); + LDR(R0, R9, PPCSTATE_OFF(npc)); + STR(R0, R9, PPCSTATE_OFF(pc)); + B(dispatcher); + + SetJumpTarget(bail); + doTiming = GetCodePtr(); + // XXX: In JIT64, Advance() gets called /after/ the exception checking + // once it jumps back to the start of outerLoop + QuickCallFunction(R14, (void*)&CoreTiming::Advance); + + // Does exception checking + testExceptions = GetCodePtr(); + LDR(R0, R9, PPCSTATE_OFF(pc)); + STR(R0, R9, PPCSTATE_OFF(npc)); + QuickCallFunction(R14, (void*)&PowerPC::CheckExceptions); + LDR(R0, R9, PPCSTATE_OFF(npc)); + STR(R0, R9, PPCSTATE_OFF(pc)); + // Check the state pointer to see if we are exiting + // Gets checked on every exception check + MOVI2R(R0, (u32)PowerPC::GetStatePtr()); + MVN(R1, 0); + LDR(R0, R0); + TST(R0, R1); + FixupBranch Exit = B_CC(CC_NEQ); + + B(dispatcher); + + SetJumpTarget(Exit); + + ADD(_SP, _SP, 4); + + POP(9, R4, R5, R6, R7, R8, R9, R10, R11, _PC); // Returns + + GenerateCommon(); + + FlushIcache(); +} + diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.h b/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.h new file mode 100644 index 0000000000..e8e401445a --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitILAsm.h @@ -0,0 +1,32 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _JITARMILASM_H +#define _JITARMILASM_H +#include "ArmEmitter.h" +#include "../JitCommon/JitAsmCommon.h" +using namespace ArmGen; +class JitArmILAsmRoutineManager : public CommonAsmRoutinesBase, public ARMXCodeBlock +{ +private: + void Generate(); + void GenerateCommon() {} + +public: + void Init() { + AllocCodeSpace(8192); + Generate(); + WriteProtect(); + } + + void Shutdown() { + FreeCodeSpace(); + } +}; + +extern JitArmILAsmRoutineManager armil_asm_routines; + +#endif + + diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Branch.cpp similarity index 80% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp rename to Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Branch.cpp index d0ea86225d..bad63dd5c6 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Branch.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Branch.cpp @@ -3,48 +3,21 @@ // Refer to the license.txt file included. #include "Common.h" -#include "Thunk.h" #include "../../ConfigManager.h" #include "../PowerPC.h" -#include "../../CoreTiming.h" #include "../PPCTables.h" -#include "x64Emitter.h" #include "JitIL.h" -#include "JitILAsm.h" #include "../../HW/Memmap.h" -// The branches are known good, or at least reasonably good. -// No need for a disable-mechanism. +#define NORMALBRANCH_START Default(inst); ibuild.EmitInterpreterBranch(); return; +//#define NORMALBRANCH_START -// If defined, clears CR0 at blr and bl-s. If the assumption that -// flags never carry over between functions holds, then the task for -// an optimizer becomes much easier. - -// #define ACID_TEST - -// Zelda and many more games seem to pass the Acid Test. - -//#define NORMALBRANCH_START Default(inst); ibuild.EmitInterpreterBranch(); return; -#define NORMALBRANCH_START - -using namespace Gen; - -void JitIL::sc(UGeckoInstruction inst) +void JitArmIL::bx(UGeckoInstruction inst) { - ibuild.EmitSystemCall(ibuild.EmitIntConst(js.compilerPC)); -} - -void JitIL::rfi(UGeckoInstruction inst) -{ - ibuild.EmitRFIExit(); -} - -void JitIL::bx(UGeckoInstruction inst) -{ - NORMALBRANCH_START + //NORMALBRANCH_START INSTRUCTION_START; // We must always process the following sentence @@ -72,7 +45,6 @@ void JitIL::bx(UGeckoInstruction inst) ibuild.EmitBranchUncond(ibuild.EmitIntConst(destination)); } - static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruction inst) { IREmitter::InstLoc CRTest = 0, CTRTest = 0; if ((inst.BO & 16) == 0) // Test a CR bit @@ -110,7 +82,32 @@ static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruc return Test; } -void JitIL::bcx(UGeckoInstruction inst) +void JitArmIL::bclrx(UGeckoInstruction inst) +{ + NORMALBRANCH_START + + if (!js.isLastInstruction && + (inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) { + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + return; + } + + if (inst.hex == 0x4e800020) { + ibuild.EmitBranchUncond(ibuild.EmitLoadLink()); + return; + } + IREmitter::InstLoc test = TestBranch(ibuild, inst); + test = ibuild.EmitICmpEq(test, ibuild.EmitIntConst(0)); + ibuild.EmitBranchCond(test, ibuild.EmitIntConst(js.compilerPC + 4)); + + IREmitter::InstLoc destination = ibuild.EmitLoadLink(); + destination = ibuild.EmitAnd(destination, ibuild.EmitIntConst(-4)); + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + ibuild.EmitBranchUncond(destination); +} +void JitArmIL::bcx(UGeckoInstruction inst) { NORMALBRANCH_START if (inst.LK) @@ -126,12 +123,12 @@ void JitIL::bcx(UGeckoInstruction inst) destination = js.compilerPC + SignExt16(inst.BD << 2); if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle && - inst.hex == 0x4182fff8 && + inst.hex == 0x4182fff8 && (Memory::ReadUnchecked_U32(js.compilerPC - 8) & 0xFFFF0000) == 0x800D0000 && (Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x28000000 || - (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x2C000000)) + (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x2C000000)) ) - { + { ibuild.EmitIdleBranch(Test, ibuild.EmitIntConst(destination)); } else @@ -141,7 +138,7 @@ void JitIL::bcx(UGeckoInstruction inst) ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); } -void JitIL::bcctrx(UGeckoInstruction inst) +void JitArmIL::bcctrx(UGeckoInstruction inst) { NORMALBRANCH_START if ((inst.BO & 4) == 0) { @@ -170,28 +167,3 @@ void JitIL::bcctrx(UGeckoInstruction inst) ibuild.EmitBranchUncond(destination); } -void JitIL::bclrx(UGeckoInstruction inst) -{ - NORMALBRANCH_START - - if (!js.isLastInstruction && - (inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) { - if (inst.LK) - ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); - return; - } - - if (inst.hex == 0x4e800020) { - ibuild.EmitBranchUncond(ibuild.EmitLoadLink()); - return; - } - IREmitter::InstLoc test = TestBranch(ibuild, inst); - test = ibuild.EmitICmpEq(test, ibuild.EmitIntConst(0)); - ibuild.EmitBranchCond(test, ibuild.EmitIntConst(js.compilerPC + 4)); - - IREmitter::InstLoc destination = ibuild.EmitLoadLink(); - destination = ibuild.EmitAnd(destination, ibuild.EmitIntConst(-4)); - if (inst.LK) - ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); - ibuild.EmitBranchUncond(destination); -} diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.cpp b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.cpp new file mode 100644 index 0000000000..eaa5951684 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.cpp @@ -0,0 +1,489 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "JitIL.h" +#include "../JitInterface.h" +#include "JitIL_Tables.h" + +// Should be moved in to the Jit class +typedef void (JitArmIL::*_Instruction) (UGeckoInstruction instCode); + +static _Instruction dynaOpTable[64]; +static _Instruction dynaOpTable4[1024]; +static _Instruction dynaOpTable19[1024]; +static _Instruction dynaOpTable31[1024]; +static _Instruction dynaOpTable59[32]; +static _Instruction dynaOpTable63[1024]; + +void JitArmIL::DynaRunTable4(UGeckoInstruction _inst) {(this->*dynaOpTable4 [_inst.SUBOP10])(_inst);} +void JitArmIL::DynaRunTable19(UGeckoInstruction _inst) {(this->*dynaOpTable19[_inst.SUBOP10])(_inst);} +void JitArmIL::DynaRunTable31(UGeckoInstruction _inst) {(this->*dynaOpTable31[_inst.SUBOP10])(_inst);} +void JitArmIL::DynaRunTable59(UGeckoInstruction _inst) {(this->*dynaOpTable59[_inst.SUBOP5 ])(_inst);} +void JitArmIL::DynaRunTable63(UGeckoInstruction _inst) {(this->*dynaOpTable63[_inst.SUBOP10])(_inst);} + +struct GekkoOPTemplate +{ + int opcode; + _Instruction Inst; + //GekkoOPInfo opinfo; // Doesn't need opinfo, Interpreter fills it out +}; + +static GekkoOPTemplate primarytable[] = +{ + {4, &JitArmIL::DynaRunTable4}, //"RunTable4", OPTYPE_SUBTABLE | (4<<24), 0}}, + {19, &JitArmIL::DynaRunTable19}, //"RunTable19", OPTYPE_SUBTABLE | (19<<24), 0}}, + {31, &JitArmIL::DynaRunTable31}, //"RunTable31", OPTYPE_SUBTABLE | (31<<24), 0}}, + {59, &JitArmIL::DynaRunTable59}, //"RunTable59", OPTYPE_SUBTABLE | (59<<24), 0}}, + {63, &JitArmIL::DynaRunTable63}, //"RunTable63", OPTYPE_SUBTABLE | (63<<24), 0}}, + + {16, &JitArmIL::bcx}, //"bcx", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {18, &JitArmIL::bx}, //"bx", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + + {1, &JitArmIL::HLEFunction}, //"HLEFunction", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {2, &JitArmIL::Default}, //"DynaBlock", OPTYPE_SYSTEM, 0}}, + {3, &JitArmIL::Break}, //"twi", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {17, &JitArmIL::sc}, //"sc", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, + + {7, &JitArmIL::Default}, //"mulli", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_RC_BIT, 2}}, + {8, &JitArmIL::Default}, //"subfic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {10, &JitArmIL::cmpXX}, //"cmpli", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, + {11, &JitArmIL::cmpXX}, //"cmpi", OPTYPE_INTEGER, FL_IN_A | FL_SET_CRn}}, + {12, &JitArmIL::Default}, //"addic", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CA}}, + {13, &JitArmIL::Default}, //"addic_rc", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A | FL_SET_CR0}}, + {14, &JitArmIL::reg_imm}, //"addi", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + {15, &JitArmIL::reg_imm}, //"addis", OPTYPE_INTEGER, FL_OUT_D | FL_IN_A0}}, + + {20, &JitArmIL::Default}, //"rlwimix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_A | FL_IN_S | FL_RC_BIT}}, + {21, &JitArmIL::Default}, //"rlwinmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {23, &JitArmIL::Default}, //"rlwnmx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_IN_B | FL_RC_BIT}}, + + {24, &JitArmIL::reg_imm}, //"ori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {25, &JitArmIL::reg_imm}, //"oris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {26, &JitArmIL::reg_imm}, //"xori", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {27, &JitArmIL::reg_imm}, //"xoris", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S}}, + {28, &JitArmIL::reg_imm}, //"andi_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + {29, &JitArmIL::reg_imm}, //"andis_rc", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_SET_CR0}}, + + {32, &JitArmIL::Default}, //"lwz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {33, &JitArmIL::Default}, //"lwzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {34, &JitArmIL::Default}, //"lbz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {35, &JitArmIL::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {40, &JitArmIL::Default}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {41, &JitArmIL::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + {42, &JitArmIL::Default}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}}, + {43, &JitArmIL::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}}, + + {44, &JitArmIL::Default}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {45, &JitArmIL::Default}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {36, &JitArmIL::Default}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {37, &JitArmIL::Default}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + {38, &JitArmIL::Default}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}}, + {39, &JitArmIL::Default}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}}, + + {46, &JitArmIL::Default}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + {47, &JitArmIL::Default}, //"stmw", OPTYPE_SYSTEM, FL_EVIL, 10}}, + + {48, &JitArmIL::Default}, //"lfs", OPTYPE_LOADFP, FL_IN_A}}, + {49, &JitArmIL::Default}, //"lfsu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + {50, &JitArmIL::Default}, //"lfd", OPTYPE_LOADFP, FL_IN_A}}, + {51, &JitArmIL::Default}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}}, + + {52, &JitArmIL::Default}, //"stfs", OPTYPE_STOREFP, FL_IN_A}}, + {53, &JitArmIL::Default}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + {54, &JitArmIL::Default}, //"stfd", OPTYPE_STOREFP, FL_IN_A}}, + {55, &JitArmIL::Default}, //"stfdu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}}, + + {56, &JitArmIL::Default}, //"psq_l", OPTYPE_PS, FL_IN_A}}, + {57, &JitArmIL::Default}, //"psq_lu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + {60, &JitArmIL::Default}, //"psq_st", OPTYPE_PS, FL_IN_A}}, + {61, &JitArmIL::Default}, //"psq_stu", OPTYPE_PS, FL_OUT_A | FL_IN_A}}, + + //missing: 0, 5, 6, 9, 22, 30, 62, 58 + {0, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {5, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {6, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {9, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {22, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {30, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {62, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, + {58, &JitArmIL::Default}, //"unknown_instruction", OPTYPE_UNKNOWN, 0}}, +}; + +static GekkoOPTemplate table4[] = +{ //SUBOP10 + {0, &JitArmIL::Default}, //"ps_cmpu0", OPTYPE_PS, FL_SET_CRn}}, + {32, &JitArmIL::Default}, //"ps_cmpo0", OPTYPE_PS, FL_SET_CRn}}, + {40, &JitArmIL::Default}, //"ps_neg", OPTYPE_PS, FL_RC_BIT}}, + {136, &JitArmIL::Default}, //"ps_nabs", OPTYPE_PS, FL_RC_BIT}}, + {264, &JitArmIL::Default}, //"ps_abs", OPTYPE_PS, FL_RC_BIT}}, + {64, &JitArmIL::Default}, //"ps_cmpu1", OPTYPE_PS, FL_RC_BIT}}, + {72, &JitArmIL::Default}, //"ps_mr", OPTYPE_PS, FL_RC_BIT}}, + {96, &JitArmIL::Default}, //"ps_cmpo1", OPTYPE_PS, FL_RC_BIT}}, + {528, &JitArmIL::Default}, //"ps_merge00", OPTYPE_PS, FL_RC_BIT}}, + {560, &JitArmIL::Default}, //"ps_merge01", OPTYPE_PS, FL_RC_BIT}}, + {592, &JitArmIL::Default}, //"ps_merge10", OPTYPE_PS, FL_RC_BIT}}, + {624, &JitArmIL::Default}, //"ps_merge11", OPTYPE_PS, FL_RC_BIT}}, + + {1014, &JitArmIL::Default}, //"dcbz_l", OPTYPE_SYSTEM, 0}}, +}; + +static GekkoOPTemplate table4_2[] = +{ + {10, &JitArmIL::Default}, //"ps_sum0", OPTYPE_PS, 0}}, + {11, &JitArmIL::Default}, //"ps_sum1", OPTYPE_PS, 0}}, + {12, &JitArmIL::Default}, //"ps_muls0", OPTYPE_PS, 0}}, + {13, &JitArmIL::Default}, //"ps_muls1", OPTYPE_PS, 0}}, + {14, &JitArmIL::Default}, //"ps_madds0", OPTYPE_PS, 0}}, + {15, &JitArmIL::Default}, //"ps_madds1", OPTYPE_PS, 0}}, + {18, &JitArmIL::Default}, //"ps_div", OPTYPE_PS, 0, 16}}, + {20, &JitArmIL::Default}, //"ps_sub", OPTYPE_PS, 0}}, + {21, &JitArmIL::Default}, //"ps_add", OPTYPE_PS, 0}}, + {23, &JitArmIL::Default}, //"ps_sel", OPTYPE_PS, 0}}, + {24, &JitArmIL::Default}, //"ps_res", OPTYPE_PS, 0}}, + {25, &JitArmIL::Default}, //"ps_mul", OPTYPE_PS, 0}}, + {26, &JitArmIL::Default}, //"ps_rsqrte", OPTYPE_PS, 0, 1}}, + {28, &JitArmIL::Default}, //"ps_msub", OPTYPE_PS, 0}}, + {29, &JitArmIL::Default}, //"ps_madd", OPTYPE_PS, 0}}, + {30, &JitArmIL::Default}, //"ps_nmsub", OPTYPE_PS, 0}}, + {31, &JitArmIL::Default}, //"ps_nmadd", OPTYPE_PS, 0}}, +}; + + +static GekkoOPTemplate table4_3[] = +{ + {6, &JitArmIL::Default}, //"psq_lx", OPTYPE_PS, 0}}, + {7, &JitArmIL::Default}, //"psq_stx", OPTYPE_PS, 0}}, + {38, &JitArmIL::Default}, //"psq_lux", OPTYPE_PS, 0}}, + {39, &JitArmIL::Default}, //"psq_stux", OPTYPE_PS, 0}}, +}; + +static GekkoOPTemplate table19[] = +{ + {528, &JitArmIL::bcctrx}, //"bcctrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, + {16, &JitArmIL::bclrx}, //"bclrx", OPTYPE_BRANCH, FL_ENDBLOCK}}, + {257, &JitArmIL::crXX}, //"crand", OPTYPE_CR, FL_EVIL}}, + {129, &JitArmIL::crXX}, //"crandc", OPTYPE_CR, FL_EVIL}}, + {289, &JitArmIL::crXX}, //"creqv", OPTYPE_CR, FL_EVIL}}, + {225, &JitArmIL::crXX}, //"crnand", OPTYPE_CR, FL_EVIL}}, + {33, &JitArmIL::crXX}, //"crnor", OPTYPE_CR, FL_EVIL}}, + {449, &JitArmIL::crXX}, //"cror", OPTYPE_CR, FL_EVIL}}, + {417, &JitArmIL::crXX}, //"crorc", OPTYPE_CR, FL_EVIL}}, + {193, &JitArmIL::crXX}, //"crxor", OPTYPE_CR, FL_EVIL}}, + + {150, &JitArmIL::Default}, //"isync", OPTYPE_ICACHE, FL_EVIL}}, + {0, &JitArmIL::Default}, //"mcrf", OPTYPE_SYSTEM, FL_EVIL}}, + + {50, &JitArmIL::rfi}, //"rfi", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS, 1}}, + {18, &JitArmIL::Break}, //"rfid", OPTYPE_SYSTEM, FL_ENDBLOCK | FL_CHECKEXCEPTIONS}} +}; + + +static GekkoOPTemplate table31[] = +{ + {28, &JitArmIL::boolX}, //"andx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {60, &JitArmIL::boolX}, //"andcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {444, &JitArmIL::boolX}, //"orx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {124, &JitArmIL::boolX}, //"norx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {316, &JitArmIL::boolX}, //"xorx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {412, &JitArmIL::boolX}, //"orcx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {476, &JitArmIL::boolX}, //"nandx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {284, &JitArmIL::boolX}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, + {0, &JitArmIL::cmpXX}, //"cmp", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, + {32, &JitArmIL::cmpXX}, //"cmpl", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, + {26, &JitArmIL::Default}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {922, &JitArmIL::Default}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {954, &JitArmIL::Default}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {536, &JitArmIL::Default}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {792, &JitArmIL::Default}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {824, &JitArmIL::Default}, //"srawix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + {24, &JitArmIL::Default}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}}, + + {54, &JitArmIL::Default}, //"dcbst", OPTYPE_DCACHE, 0, 4}}, + {86, &JitArmIL::Default}, //"dcbf", OPTYPE_DCACHE, 0, 4}}, + {246, &JitArmIL::Default}, //"dcbtst", OPTYPE_DCACHE, 0, 1}}, + {278, &JitArmIL::Default}, //"dcbt", OPTYPE_DCACHE, 0, 1}}, + {470, &JitArmIL::Default}, //"dcbi", OPTYPE_DCACHE, 0, 4}}, + {758, &JitArmIL::Default}, //"dcba", OPTYPE_DCACHE, 0, 4}}, + {1014, &JitArmIL::Default}, //"dcbz", OPTYPE_DCACHE, 0, 4}}, + + //load word + {23, &JitArmIL::Default}, //"lwzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {55, &JitArmIL::Default}, //"lwzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load halfword + {279, &JitArmIL::Default}, //"lhzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {311, &JitArmIL::Default}, //"lhzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load halfword signextend + {343, &JitArmIL::Default}, //"lhax", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {375, &JitArmIL::Default}, //"lhaux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load byte + {87, &JitArmIL::Default}, //"lbzx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {119, &JitArmIL::Default}, //"lbzux", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //load byte reverse + {534, &JitArmIL::Default}, //"lwbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + {790, &JitArmIL::Default}, //"lhbrx", OPTYPE_LOAD, FL_OUT_D | FL_IN_A0 | FL_IN_B}}, + + // Conditional load/store (Wii SMP) + {150, &JitArmIL::Default}, //"stwcxd", OPTYPE_STORE, FL_EVIL | FL_SET_CR0}}, + {20, &JitArmIL::Default}, //"lwarx", OPTYPE_LOAD, FL_EVIL | FL_OUT_D | FL_IN_A0B | FL_SET_CR0}}, + + //load string (interpret these) + {533, &JitArmIL::Default}, //"lswx", OPTYPE_LOAD, FL_EVIL | FL_IN_A | FL_OUT_D}}, + {597, &JitArmIL::Default}, //"lswi", OPTYPE_LOAD, FL_EVIL | FL_IN_AB | FL_OUT_D}}, + + //store word + {151, &JitArmIL::Default}, //"stwx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {183, &JitArmIL::Default}, //"stwux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store halfword + {407, &JitArmIL::Default}, //"sthx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {439, &JitArmIL::Default}, //"sthux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store byte + {215, &JitArmIL::Default}, //"stbx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {247, &JitArmIL::Default}, //"stbux", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_B}}, + + //store bytereverse + {662, &JitArmIL::Default}, //"stwbrx", OPTYPE_STORE, FL_IN_A0 | FL_IN_B}}, + {918, &JitArmIL::Default}, //"sthbrx", OPTYPE_STORE, FL_IN_A | FL_IN_B}}, + + {661, &JitArmIL::Default}, //"stswx", OPTYPE_STORE, FL_EVIL}}, + {725, &JitArmIL::Default}, //"stswi", OPTYPE_STORE, FL_EVIL}}, + + // fp load/store + {535, &JitArmIL::Default}, //"lfsx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {567, &JitArmIL::Default}, //"lfsux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + {599, &JitArmIL::Default}, //"lfdx", OPTYPE_LOADFP, FL_IN_A0 | FL_IN_B}}, + {631, &JitArmIL::Default}, //"lfdux", OPTYPE_LOADFP, FL_IN_A | FL_IN_B}}, + + {663, &JitArmIL::Default}, //"stfsx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {695, &JitArmIL::Default}, //"stfsux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {727, &JitArmIL::Default}, //"stfdx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + {759, &JitArmIL::Default}, //"stfdux", OPTYPE_STOREFP, FL_IN_A | FL_IN_B}}, + {983, &JitArmIL::Default}, //"stfiwx", OPTYPE_STOREFP, FL_IN_A0 | FL_IN_B}}, + + {19, &JitArmIL::Default}, //"mfcr", OPTYPE_SYSTEM, FL_OUT_D}}, + {83, &JitArmIL::Default}, //"mfmsr", OPTYPE_SYSTEM, FL_OUT_D}}, + {144, &JitArmIL::Default}, //"mtcrf", OPTYPE_SYSTEM, 0}}, + {146, &JitArmIL::mtmsr}, //"mtmsr", OPTYPE_SYSTEM, FL_ENDBLOCK}}, + {210, &JitArmIL::Default}, //"mtsr", OPTYPE_SYSTEM, 0}}, + {242, &JitArmIL::Default}, //"mtsrin", OPTYPE_SYSTEM, 0}}, + {339, &JitArmIL::Default}, //"mfspr", OPTYPE_SPR, FL_OUT_D}}, + {467, &JitArmIL::Default}, //"mtspr", OPTYPE_SPR, 0, 2}}, + {371, &JitArmIL::Default}, //"mftb", OPTYPE_SYSTEM, FL_OUT_D | FL_TIMER}}, + {512, &JitArmIL::Default}, //"mcrxr", OPTYPE_SYSTEM, 0}}, + {595, &JitArmIL::Default}, //"mfsr", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + {659, &JitArmIL::Default}, //"mfsrin", OPTYPE_SYSTEM, FL_OUT_D, 2}}, + + {4, &JitArmIL::Break}, //"tw", OPTYPE_SYSTEM, FL_ENDBLOCK, 1}}, + {598, &JitArmIL::Default}, //"sync", OPTYPE_SYSTEM, 0, 2}}, + {982, &JitArmIL::icbi}, //"icbi", OPTYPE_SYSTEM, FL_ENDBLOCK, 3}}, + + // Unused instructions on GC + {310, &JitArmIL::Default}, //"eciwx", OPTYPE_INTEGER, FL_RC_BIT}}, + {438, &JitArmIL::Default}, //"ecowx", OPTYPE_INTEGER, FL_RC_BIT}}, + {854, &JitArmIL::Default}, //"eieio", OPTYPE_INTEGER, FL_RC_BIT}}, + {306, &JitArmIL::Default}, //"tlbie", OPTYPE_SYSTEM, 0}}, + {370, &JitArmIL::Default}, //"tlbia", OPTYPE_SYSTEM, 0}}, + {566, &JitArmIL::Default}, //"tlbsync", OPTYPE_SYSTEM, 0}}, +}; + +static GekkoOPTemplate table31_2[] = +{ + {266, &JitArmIL::Default}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {778, &JitArmIL::Default}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {10, &JitArmIL::Default}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, + {138, &JitArmIL::Default}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {234, &JitArmIL::Default}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {202, &JitArmIL::Default}, //"addzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {491, &JitArmIL::Default}, //"divwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {1003, &JitArmIL::Default}, //"divwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {459, &JitArmIL::Default}, //"divwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {971, &JitArmIL::Default}, //"divwuox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 39}}, + {75, &JitArmIL::Default}, //"mulhwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {11, &JitArmIL::Default}, //"mulhwux", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {235, &JitArmIL::Default}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {747, &JitArmIL::Default}, //"mullwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}}, + {104, &JitArmIL::Default}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {40, &JitArmIL::Default}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {552, &JitArmIL::Default}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}}, + {8, &JitArmIL::Default}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}}, + {136, &JitArmIL::Default}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {232, &JitArmIL::Default}, //"subfmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, + {200, &JitArmIL::Default}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}}, +}; + +static GekkoOPTemplate table59[] = +{ + {18, &JitArmIL::Default}, //{"fdivsx", OPTYPE_FPU, FL_RC_BIT_F, 16}}, + {20, &JitArmIL::Default}, //"fsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitArmIL::Default}, //"faddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +// {22, &JitArmIL::Default}, //"fsqrtsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {24, &JitArmIL::Default}, //"fresx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitArmIL::Default}, //"fmulsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitArmIL::Default}, //"fmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitArmIL::Default}, //"fmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitArmIL::Default}, //"fnmsubsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitArmIL::Default}, //"fnmaddsx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; + +static GekkoOPTemplate table63[] = +{ + {264, &JitArmIL::Default}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {32, &JitArmIL::Default}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, + {0, &JitArmIL::Default}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, + {14, &JitArmIL::Default}, //"fctiwx", OPTYPE_FPU, FL_RC_BIT_F}}, + {15, &JitArmIL::Default}, //"fctiwzx", OPTYPE_FPU, FL_RC_BIT_F}}, + {72, &JitArmIL::Default}, //"fmrx", OPTYPE_FPU, FL_RC_BIT_F}}, + {136, &JitArmIL::Default}, //"fnabsx", OPTYPE_FPU, FL_RC_BIT_F}}, + {40, &JitArmIL::Default}, //"fnegx", OPTYPE_FPU, FL_RC_BIT_F}}, + {12, &JitArmIL::Default}, //"frspx", OPTYPE_FPU, FL_RC_BIT_F}}, + + {64, &JitArmIL::Default}, //"mcrfs", OPTYPE_SYSTEMFP, 0}}, + {583, &JitArmIL::Default}, //"mffsx", OPTYPE_SYSTEMFP, 0}}, + {70, &JitArmIL::Default}, //"mtfsb0x", OPTYPE_SYSTEMFP, 0, 2}}, + {38, &JitArmIL::Default}, //"mtfsb1x", OPTYPE_SYSTEMFP, 0, 2}}, + {134, &JitArmIL::Default}, //"mtfsfix", OPTYPE_SYSTEMFP, 0, 2}}, + {711, &JitArmIL::Default}, //"mtfsfx", OPTYPE_SYSTEMFP, 0, 2}}, +}; + +static GekkoOPTemplate table63_2[] = +{ + {18, &JitArmIL::Default}, //"fdivx", OPTYPE_FPU, FL_RC_BIT_F, 30}}, + {20, &JitArmIL::Default}, //"fsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {21, &JitArmIL::Default}, //"faddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {22, &JitArmIL::Default}, //"fsqrtx", OPTYPE_FPU, FL_RC_BIT_F}}, + {23, &JitArmIL::Default}, //"fselx", OPTYPE_FPU, FL_RC_BIT_F}}, + {25, &JitArmIL::Default}, //"fmulx", OPTYPE_FPU, FL_RC_BIT_F}}, + {26, &JitArmIL::Default}, //"frsqrtex", OPTYPE_FPU, FL_RC_BIT_F}}, + {28, &JitArmIL::Default}, //"fmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {29, &JitArmIL::Default}, //"fmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, + {30, &JitArmIL::Default}, //"fnmsubx", OPTYPE_FPU, FL_RC_BIT_F}}, + {31, &JitArmIL::Default}, //"fnmaddx", OPTYPE_FPU, FL_RC_BIT_F}}, +}; + + +namespace JitArmILTables +{ + +void CompileInstruction(PPCAnalyst::CodeOp & op) +{ + JitArmIL *jitarm = (JitArmIL *)jit; + (jitarm->*dynaOpTable[op.inst.OPCD])(op.inst); + GekkoOPInfo *info = op.opinfo; + if (info) { +#ifdef OPLOG + if (!strcmp(info->opname, OP_TO_LOG)){ ///"mcrfs" + rsplocations.push_back(jit.js.compilerPC); + } +#endif + info->compileCount++; + info->lastUse = jit->js.compilerPC; + } +} + +void InitTables() +{ + // once initialized, tables are read-only + static bool initialized = false; + if (initialized) + return; + + //clear + for (int i = 0; i < 32; i++) + { + dynaOpTable59[i] = &JitArmIL::unknown_instruction; + } + + for (int i = 0; i < 1024; i++) + { + dynaOpTable4 [i] = &JitArmIL::unknown_instruction; + dynaOpTable19[i] = &JitArmIL::unknown_instruction; + dynaOpTable31[i] = &JitArmIL::unknown_instruction; + dynaOpTable63[i] = &JitArmIL::unknown_instruction; + } + + for (int i = 0; i < (int)(sizeof(primarytable) / sizeof(GekkoOPTemplate)); i++) + { + dynaOpTable[primarytable[i].opcode] = primarytable[i].Inst; + } + + for (int i = 0; i < 32; i++) + { + int fill = i << 5; + for (int j = 0; j < (int)(sizeof(table4_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill+table4_2[j].opcode; + dynaOpTable4[op] = table4_2[j].Inst; + } + } + + for (int i = 0; i < 16; i++) + { + int fill = i << 6; + for (int j = 0; j < (int)(sizeof(table4_3) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill+table4_3[j].opcode; + dynaOpTable4[op] = table4_3[j].Inst; + } + } + + for (int i = 0; i < (int)(sizeof(table4) / sizeof(GekkoOPTemplate)); i++) + { + int op = table4[i].opcode; + dynaOpTable4[op] = table4[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table31) / sizeof(GekkoOPTemplate)); i++) + { + int op = table31[i].opcode; + dynaOpTable31[op] = table31[i].Inst; + } + + for (int i = 0; i < 1; i++) + { + int fill = i << 9; + for (int j = 0; j < (int)(sizeof(table31_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill + table31_2[j].opcode; + dynaOpTable31[op] = table31_2[j].Inst; + } + } + + for (int i = 0; i < (int)(sizeof(table19) / sizeof(GekkoOPTemplate)); i++) + { + int op = table19[i].opcode; + dynaOpTable19[op] = table19[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table59) / sizeof(GekkoOPTemplate)); i++) + { + int op = table59[i].opcode; + dynaOpTable59[op] = table59[i].Inst; + } + + for (int i = 0; i < (int)(sizeof(table63) / sizeof(GekkoOPTemplate)); i++) + { + int op = table63[i].opcode; + dynaOpTable63[op] = table63[i].Inst; + } + + for (int i = 0; i < 32; i++) + { + int fill = i << 5; + for (int j = 0; j < (int)(sizeof(table63_2) / sizeof(GekkoOPTemplate)); j++) + { + int op = fill + table63_2[j].opcode; + dynaOpTable63[op] = table63_2[j].Inst; + } + } + + initialized = true; + +} + +} // namespace diff --git a/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.h b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.h new file mode 100644 index 0000000000..9402b9d444 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitArmIL/JitIL_Tables.h @@ -0,0 +1,16 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef JITARMIL_TABLES_H +#define JITARMIL_TABLES_H + +#include "../Gekko.h" +#include "../PPCTables.h" + +namespace JitArmILTables +{ + void CompileInstruction(PPCAnalyst::CodeOp & op); + void InitTables(); +} +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.cpp index 5187ef1478..bc8272f48c 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.cpp @@ -2,30 +2,21 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "x64ABI.h" -#include "Thunk.h" -#include "CPUDetect.h" -#include "x64Emitter.h" - -#include "../../HW/Memmap.h" - -#include "../PowerPC.h" -#include "../../CoreTiming.h" -#include "MemoryUtil.h" - -#include "x64ABI.h" -#include "../JitCommon/JitCache.h" - -#include "../../HW/GPFifo.h" -#include "../../Core.h" #include "JitAsmCommon.h" #include "JitBase.h" +#include "CPUDetect.h" +#include "MemoryUtil.h" + + +#define QUANTIZED_REGS_TO_SAVE (ABI_ALL_CALLEE_SAVED & ~((1 << RAX) | (1 << RCX) | (1 << RDX) | \ + (1 << XMM0) | (1 << XMM1))) + using namespace Gen; static int temp32; -void CommonAsmRoutines::GenFifoWrite(int size) +void CommonAsmRoutines::GenFifoWrite(int size) { // Assume value in ABI_PARAM1 PUSH(ESI); @@ -48,7 +39,7 @@ void CommonAsmRoutines::GenFifoWrite(int size) RET(); } -void CommonAsmRoutines::GenFifoFloatWrite() +void CommonAsmRoutines::GenFifoFloatWrite() { // Assume value in XMM0 PUSH(ESI); @@ -66,7 +57,7 @@ void CommonAsmRoutines::GenFifoFloatWrite() RET(); } -void CommonAsmRoutines::GenFifoXmm64Write() +void CommonAsmRoutines::GenFifoXmm64Write() { // Assume value in XMM0. Assume pre-byteswapped (unlike the others here!) PUSH(ESI); @@ -102,7 +93,7 @@ static const float GC_ALIGNED16(m_quantizeTableS[]) = 1.0 / (1 << 12), 1.0 / (1 << 11), 1.0 / (1 << 10), 1.0 / (1 << 9), 1.0 / (1 << 8), 1.0 / (1 << 7), 1.0 / (1 << 6), 1.0 / (1 << 5), 1.0 / (1 << 4), 1.0 / (1 << 3), 1.0 / (1 << 2), 1.0 / (1 << 1), -}; +}; static const float GC_ALIGNED16(m_dequantizeTableS[]) = { @@ -122,7 +113,7 @@ static const float GC_ALIGNED16(m_dequantizeTableS[]) = (1 << 12), (1 << 11), (1 << 10), (1 << 9), (1 << 8), (1 << 7), (1 << 6), (1 << 5), (1 << 4), (1 << 3), (1 << 2), (1 << 1), -}; +}; static float GC_ALIGNED16(psTemp[4]); @@ -142,17 +133,14 @@ static const float GC_ALIGNED16(m_one[]) = {1.0f, 0.0f, 0.0f, 0.0f}; // I don't know whether the overflow actually happens in any games // but it potentially can cause problems, so we need some clamping -#ifdef _M_X64 -// TODO(ector): Improve 64-bit version -static void WriteDual32(u64 value, u32 address) +static void WriteDual32(u32 address) { - Memory::Write_U32((u32)(value >> 32), address); - Memory::Write_U32((u32)value, address + 4); + Memory::Write_U64(*(u64 *) psTemp, address); } -#endif // See comment in header for in/outs. -void CommonAsmRoutines::GenQuantizedStores() { +void CommonAsmRoutines::GenQuantizedStores() +{ const u8* storePairedIllegal = AlignCode4(); UD2(); const u8* storePairedFloat = AlignCode4(); @@ -160,20 +148,22 @@ void CommonAsmRoutines::GenQuantizedStores() { #ifdef _M_X64 SHUFPS(XMM0, R(XMM0), 1); MOVQ_xmm(M(&psTemp[0]), XMM0); - MOV(64, R(RAX), M(&psTemp[0])); TEST(32, R(ECX), Imm32(0x0C000000)); - FixupBranch too_complex = J_CC(CC_NZ); + FixupBranch too_complex = J_CC(CC_NZ, true); + MOV(64, R(RAX), M(&psTemp[0])); BSWAP(64, RAX); MOV(64, MComplex(RBX, RCX, SCALE_1, 0), R(RAX)); - FixupBranch skip_complex = J(); + FixupBranch skip_complex = J(true); SetJumpTarget(too_complex); - ABI_CallFunctionRR(thunks.ProtectFunction((void *)&WriteDual32, 2), RAX, RCX); + ABI_PushRegistersAndAdjustStack(QUANTIZED_REGS_TO_SAVE, true); + ABI_CallFunctionR((void *)&WriteDual32, RCX); + ABI_PopRegistersAndAdjustStack(QUANTIZED_REGS_TO_SAVE, true); SetJumpTarget(skip_complex); RET(); #else - MOVQ_xmm(M(&psTemp[0]), XMM0); TEST(32, R(ECX), Imm32(0x0C000000)); - FixupBranch argh = J_CC(CC_NZ); + FixupBranch argh = J_CC(CC_NZ, true); + MOVQ_xmm(M(&psTemp[0]), XMM0); MOV(32, R(EAX), M(&psTemp)); BSWAP(32, EAX); AND(32, R(ECX), Imm32(Memory::MEMVIEW32_MASK)); @@ -181,13 +171,13 @@ void CommonAsmRoutines::GenQuantizedStores() { MOV(32, R(EAX), M(((char*)&psTemp) + 4)); BSWAP(32, EAX); MOV(32, MDisp(ECX, 4+(u32)Memory::base), R(EAX)); - FixupBranch arg2 = J(); + FixupBranch arg2 = J(true); SetJumpTarget(argh); - MOV(32, R(EAX), M(((char*)&psTemp))); - ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX); - MOV(32, R(EAX), M(((char*)&psTemp)+4)); - ADD(32, R(ECX), Imm32(4)); - ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), EAX, ECX); + SHUFPS(XMM0, R(XMM0), 1); + MOVQ_xmm(M(&psTemp[0]), XMM0); + ABI_PushRegistersAndAdjustStack(QUANTIZED_REGS_TO_SAVE, true); + ABI_CallFunctionR((void *)&WriteDual32, ECX); + ABI_PopRegistersAndAdjustStack(QUANTIZED_REGS_TO_SAVE, true); SetJumpTarget(arg2); RET(); #endif @@ -206,8 +196,8 @@ void CommonAsmRoutines::GenQuantizedStores() { PACKSSDW(XMM0, R(XMM0)); PACKUSWB(XMM0, R(XMM0)); MOVD_xmm(R(EAX), XMM0); - SafeWriteRegToReg(AX, ECX, 16, 0, false); - + SafeWriteRegToReg(AX, ECX, 16, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); + RET(); const u8* storePairedS8 = AlignCode4(); @@ -215,7 +205,7 @@ void CommonAsmRoutines::GenQuantizedStores() { MOVSS(XMM1, MDisp(EAX, (u32)(u64)m_quantizeTableS)); PUNPCKLDQ(XMM1, R(XMM1)); MULPS(XMM0, R(XMM1)); -#ifdef QUANTIZE_OVERFLOW_SAFE +#ifdef QUANTIZE_OVERFLOW_SAFE MOVSS(XMM1, M((void *)&m_65535)); PUNPCKLDQ(XMM1, R(XMM1)); MINPS(XMM0, R(XMM1)); @@ -225,8 +215,8 @@ void CommonAsmRoutines::GenQuantizedStores() { PACKSSWB(XMM0, R(XMM0)); MOVD_xmm(R(EAX), XMM0); - SafeWriteRegToReg(AX, ECX, 16, 0, false); - + SafeWriteRegToReg(AX, ECX, 16, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); + RET(); const u8* storePairedU16 = AlignCode4(); @@ -235,7 +225,7 @@ void CommonAsmRoutines::GenQuantizedStores() { PUNPCKLDQ(XMM1, R(XMM1)); MULPS(XMM0, R(XMM1)); - // PACKUSDW is available only in SSE4 + // PACKUSDW is available only in SSE4 PXOR(XMM1, R(XMM1)); MAXPS(XMM0, R(XMM1)); MOVSS(XMM1, M((void *)&m_65535)); @@ -251,8 +241,8 @@ void CommonAsmRoutines::GenQuantizedStores() { MOV(16, R(AX), M((char*)psTemp + 4)); BSWAP(32, EAX); - SafeWriteRegToReg(EAX, ECX, 32, 0, false); - + SafeWriteRegToReg(EAX, ECX, 32, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); + RET(); const u8* storePairedS16 = AlignCode4(); @@ -261,7 +251,7 @@ void CommonAsmRoutines::GenQuantizedStores() { // SHUFPS or UNPCKLPS might be a better choice here. The last one might just be an alias though. PUNPCKLDQ(XMM1, R(XMM1)); MULPS(XMM0, R(XMM1)); -#ifdef QUANTIZE_OVERFLOW_SAFE +#ifdef QUANTIZE_OVERFLOW_SAFE MOVSS(XMM1, M((void *)&m_65535)); PUNPCKLDQ(XMM1, R(XMM1)); MINPS(XMM0, R(XMM1)); @@ -271,8 +261,8 @@ void CommonAsmRoutines::GenQuantizedStores() { MOVD_xmm(R(EAX), XMM0); BSWAP(32, EAX); ROL(32, R(EAX), Imm8(16)); - SafeWriteRegToReg(EAX, ECX, 32, 0, false); - + SafeWriteRegToReg(EAX, ECX, 32, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); + RET(); pairedStoreQuantized = reinterpret_cast(const_cast(AlignCode16())); @@ -289,13 +279,14 @@ void CommonAsmRoutines::GenQuantizedStores() { } // See comment in header for in/outs. -void CommonAsmRoutines::GenQuantizedSingleStores() { +void CommonAsmRoutines::GenQuantizedSingleStores() +{ const u8* storeSingleIllegal = AlignCode4(); UD2(); // Easy! const u8* storeSingleFloat = AlignCode4(); - SafeWriteFloatToReg(XMM0, ECX); + SafeWriteFloatToReg(XMM0, ECX, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); RET(); /* if (cpu_info.bSSSE3) { @@ -303,11 +294,11 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { // TODO: SafeWriteFloat MOVSS(M(&psTemp[0]), XMM0); MOV(32, R(EAX), M(&psTemp[0])); - SafeWriteRegToReg(EAX, ECX, 32, 0, false); + SafeWriteRegToReg(EAX, ECX, 32, 0, SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); } else { MOVSS(M(&psTemp[0]), XMM0); MOV(32, R(EAX), M(&psTemp[0])); - SafeWriteRegToReg(EAX, ECX, 32, 0, true); + SafeWriteRegToReg(EAX, ECX, 32, 0, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); }*/ const u8* storeSingleU8 = AlignCode4(); // Used by MKWii @@ -318,7 +309,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { MAXSS(XMM0, R(XMM1)); MINSS(XMM0, M((void *)&m_255)); CVTTSS2SI(EAX, R(XMM0)); - SafeWriteRegToReg(AL, ECX, 8, 0, true); + SafeWriteRegToReg(AL, ECX, 8, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); RET(); const u8* storeSingleS8 = AlignCode4(); @@ -328,7 +319,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { MAXSS(XMM0, M((void *)&m_m128)); MINSS(XMM0, M((void *)&m_127)); CVTTSS2SI(EAX, R(XMM0)); - SafeWriteRegToReg(AL, ECX, 8, 0, true); + SafeWriteRegToReg(AL, ECX, 8, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); RET(); const u8* storeSingleU16 = AlignCode4(); // Used by MKWii @@ -339,7 +330,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { MAXSS(XMM0, R(XMM1)); MINSS(XMM0, M((void *)&m_65535)); CVTTSS2SI(EAX, R(XMM0)); - SafeWriteRegToReg(EAX, ECX, 16, 0, true); + SafeWriteRegToReg(EAX, ECX, 16, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); RET(); const u8* storeSingleS16 = AlignCode4(); @@ -349,7 +340,7 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { MAXSS(XMM0, M((void *)&m_m32768)); MINSS(XMM0, M((void *)&m_32767)); CVTTSS2SI(EAX, R(XMM0)); - SafeWriteRegToReg(EAX, ECX, 16, 0, true); + SafeWriteRegToReg(EAX, ECX, 16, 0, QUANTIZED_REGS_TO_SAVE, SAFE_LOADSTORE_NO_PROLOG | SAFE_LOADSTORE_NO_FASTMEM); RET(); singleStoreQuantized = reinterpret_cast(const_cast(AlignCode16())); @@ -365,7 +356,8 @@ void CommonAsmRoutines::GenQuantizedSingleStores() { singleStoreQuantized[7] = storeSingleS16; } -void CommonAsmRoutines::GenQuantizedLoads() { +void CommonAsmRoutines::GenQuantizedLoads() +{ const u8* loadPairedIllegal = AlignCode4(); UD2(); diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h index 58d7c5fe6e..c593909c76 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitAsmCommon.h @@ -5,8 +5,7 @@ #ifndef _JITASMCOMMON_H #define _JITASMCOMMON_H -#include "../JitCommon/Jit_Util.h" -#include "Thunk.h" +#include "Jit_Util.h" class CommonAsmRoutinesBase { public: @@ -65,9 +64,6 @@ public: void GenFifoXmm64Write(); void GenFifoFloatWrite(); -private: - ThunkManager thunks; - }; #endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp index c92d05d9d3..b7cc031c99 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.cpp @@ -3,18 +3,12 @@ // Refer to the license.txt file included. #include +#include #include "Common.h" #include "disasm.h" -#include "../JitCommon/JitBase.h" -#include "../JitCommon/JitBackpatch.h" - -#include "../../HW/Memmap.h" - -#include "x64Emitter.h" -#include "x64ABI.h" -#include "Thunk.h" -#include "x64Analyzer.h" +#include "JitBase.h" +#include "JitBackpatch.h" #include "StringUtil.h" #ifdef _WIN32 @@ -39,7 +33,7 @@ static void BackPatchError(const std::string &text, u8 *codePtr, u32 emAddress) #endif PanicAlert("%s\n\n" "Error encountered accessing emulated address %08x.\n" - "Culprit instruction: \n%s\nat %#llx", + "Culprit instruction: \n%s\nat %#" PRIx64, text.c_str(), emAddress, disbuf, code_addr); return; } @@ -47,7 +41,7 @@ static void BackPatchError(const std::string &text, u8 *codePtr, u32 emAddress) void TrampolineCache::Init() { - AllocCodeSpace(1024 * 1024); + AllocCodeSpace(4 * 1024 * 1024); } void TrampolineCache::Shutdown() @@ -56,7 +50,7 @@ void TrampolineCache::Shutdown() } // Extremely simplistic - just generate the requested trampoline. May reuse them in the future. -const u8 *TrampolineCache::GetReadTrampoline(const InstructionInfo &info) +const u8 *TrampolineCache::GetReadTrampoline(const InstructionInfo &info, u32 registersInUse) { if (GetSpaceLeft() < 1024) PanicAlert("Trampoline cache full"); @@ -67,40 +61,43 @@ const u8 *TrampolineCache::GetReadTrampoline(const InstructionInfo &info) X64Reg dataReg = (X64Reg)info.regOperandReg; // It's a read. Easy. - ABI_PushAllCallerSavedRegsAndAdjustStack(); + // It ought to be necessary to align the stack here. Since it seems to not + // affect anybody, I'm not going to add it just to be completely safe about + // performance. + if (addrReg != ABI_PARAM1) MOV(32, R(ABI_PARAM1), R((X64Reg)addrReg)); if (info.displacement) { ADD(32, R(ABI_PARAM1), Imm32(info.displacement)); } + ABI_PushRegistersAndAdjustStack(registersInUse, true); switch (info.operandSize) { case 4: - CALL(thunks.ProtectFunction((void *)&Memory::Read_U32, 1)); + CALL((void *)&Memory::Read_U32); break; case 2: - CALL(thunks.ProtectFunction((void *)&Memory::Read_U16, 1)); + CALL((void *)&Memory::Read_U16); SHL(32, R(EAX), Imm8(16)); break; case 1: - CALL(thunks.ProtectFunction((void *)&Memory::Read_U8, 1)); + CALL((void *)&Memory::Read_U8); break; } - ABI_PopAllCallerSavedRegsAndAdjustStack(); - if (dataReg != EAX) { MOV(32, R(dataReg), R(EAX)); } + ABI_PopRegistersAndAdjustStack(registersInUse, true); RET(); #endif return trampoline; } // Extremely simplistic - just generate the requested trampoline. May reuse them in the future. -const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) +const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info, u32 registersInUse) { if (GetSpaceLeft() < 1024) PanicAlert("Trampoline cache full"); @@ -109,32 +106,24 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) #ifdef _M_X64 X64Reg dataReg = (X64Reg)info.regOperandReg; - if (dataReg != EAX) - PanicAlert("Backpatch write - not through EAX"); - X64Reg addrReg = (X64Reg)info.scaledReg; - // It's a write. Yay. Remember that we don't have to be super efficient since it's "just" a + // It's a write. Yay. Remember that we don't have to be super efficient since it's "just" a // hardware access - we can take shortcuts. - //if (emAddress == 0xCC008000) - // PanicAlert("Caught a FIFO write"); - CMP(32, R(addrReg), Imm32(0xCC008000)); - FixupBranch skip_fast = J_CC(CC_NE, false); - MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg)); - CALL((void*)jit->GetAsmRoutines()->fifoDirectWrite32); - RET(); - SetJumpTarget(skip_fast); - ABI_PushAllCallerSavedRegsAndAdjustStack(); + // Don't treat FIFO writes specially for now because they require a burst + // check anyway. + if (dataReg == ABI_PARAM2) + PanicAlert("Incorrect use of SafeWriteRegToReg"); if (addrReg != ABI_PARAM1) { - MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg)); - MOV(32, R(ABI_PARAM2), R((X64Reg)addrReg)); + MOV(64, R(ABI_PARAM1), R((X64Reg)dataReg)); + MOV(64, R(ABI_PARAM2), R((X64Reg)addrReg)); } else { - MOV(32, R(ABI_PARAM2), R((X64Reg)addrReg)); - MOV(32, R(ABI_PARAM1), R((X64Reg)dataReg)); + MOV(64, R(ABI_PARAM2), R((X64Reg)addrReg)); + MOV(64, R(ABI_PARAM1), R((X64Reg)dataReg)); } if (info.displacement) @@ -142,13 +131,24 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) ADD(32, R(ABI_PARAM2), Imm32(info.displacement)); } + ABI_PushRegistersAndAdjustStack(registersInUse, true); switch (info.operandSize) { + case 8: + CALL((void *)&Memory::Write_U64); + break; case 4: - CALL(thunks.ProtectFunction((void *)&Memory::Write_U32, 2)); + CALL((void *)&Memory::Write_U32); + break; + case 2: + CALL((void *)&Memory::Write_U16); + break; + case 1: + CALL((void *)&Memory::Write_U8); break; } - ABI_PopAllCallerSavedRegsAndAdjustStack(); + + ABI_PopRegistersAndAdjustStack(registersInUse, true); RET(); #endif @@ -158,40 +158,39 @@ const u8 *TrampolineCache::GetWriteTrampoline(const InstructionInfo &info) // This generates some fairly heavy trampolines, but: // 1) It's really necessary. We don't know anything about the context. -// 2) It doesn't really hurt. Only instructions that access I/O will get these, and there won't be +// 2) It doesn't really hurt. Only instructions that access I/O will get these, and there won't be // that many of them in a typical program/game. -const u8 *Jitx86Base::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void *ctx_void) +const u8 *Jitx86Base::BackPatch(u8 *codePtr, u32 emAddress, void *ctx_void) { #ifdef _M_X64 - CONTEXT *ctx = (CONTEXT *)ctx_void; + SContext *ctx = (SContext *)ctx_void; if (!jit->IsInCodeSpace(codePtr)) return 0; // this will become a regular crash real soon after this - + InstructionInfo info; - if (!DisassembleMov(codePtr, info, accessType)) { + if (!DisassembleMov(codePtr, &info)) { BackPatchError("BackPatch - failed to disassemble MOV instruction", codePtr, emAddress); + return 0; } - /* - if (info.isMemoryWrite) { - if (!Memory::IsRAMAddress(emAddress, true)) { - PanicAlert("Exception: Caught write to invalid address %08x", emAddress); - return; - } - BackPatchError("BackPatch - determined that MOV is write, not yet supported and should have been caught before", - codePtr, emAddress); - }*/ - if (info.otherReg != RBX) + { PanicAlert("BackPatch : Base reg not RBX." "\n\nAttempted to access %08x.", emAddress); - - if (accessType == OP_ACCESS_WRITE) - PanicAlert("BackPatch : Currently only supporting reads." - "\n\nAttempted to write to %08x.", emAddress); + return 0; + } - if (accessType == 0) + auto it = registersInUseAtLoc.find(codePtr); + if (it == registersInUseAtLoc.end()) + { + PanicAlert("BackPatch: no register use entry for address %p", codePtr); + return 0; + } + + u32 registersInUse = it->second; + + if (!info.isMemoryWrite) { XEmitter emitter(codePtr); int bswapNopCount; @@ -200,27 +199,44 @@ const u8 *Jitx86Base::BackPatch(u8 *codePtr, int accessType, u32 emAddress, void bswapNopCount = 3; else bswapNopCount = 2; - const u8 *trampoline = trampolines.GetReadTrampoline(info); + + const u8 *trampoline = trampolines.GetReadTrampoline(info, registersInUse); emitter.CALL((void *)trampoline); emitter.NOP((int)info.instructionSize + bswapNopCount - 5); return codePtr; } - else if (accessType == 1) + else { // TODO: special case FIFO writes. Also, support 32-bit mode. - // Also, debug this so that it actually works correctly :P - XEmitter emitter(codePtr - 2); - // We know it's EAX so the BSWAP before will be two byte. Overwrite it. - const u8 *trampoline = trampolines.GetWriteTrampoline(info); + // We entered here with a BSWAP-ed register. We'll have to swap it back. + u64 *ptr = ContextRN(ctx, info.regOperandReg); + int bswapSize = 0; + switch (info.operandSize) + { + case 1: + bswapSize = 0; + break; + case 2: + bswapSize = 4 + (info.regOperandReg >= 8 ? 1 : 0); + *ptr = Common::swap16((u16) *ptr); + break; + case 4: + bswapSize = 2 + (info.regOperandReg >= 8 ? 1 : 0); + *ptr = Common::swap32((u32) *ptr); + break; + case 8: + bswapSize = 3; + *ptr = Common::swap64(*ptr); + break; + } + + u8 *start = codePtr - bswapSize; + XEmitter emitter(start); + const u8 *trampoline = trampolines.GetWriteTrampoline(info, registersInUse); emitter.CALL((void *)trampoline); - emitter.NOP((int)info.instructionSize - 3); - if (info.instructionSize < 3) - PanicAlert("Instruction too small"); - // We entered here with a BSWAP-ed EAX. We'll have to swap it back. - ctx->Rax = Common::swap32((u32)ctx->Rax); - return codePtr - 2; + emitter.NOP((int)(codePtr + info.instructionSize - emitter.GetCodePtr())); + return start; } - return 0; #else return 0; #endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h index e3e60a8d94..a937ffd0eb 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBackpatch.h @@ -8,34 +8,236 @@ #include "Common.h" #include "x64Emitter.h" #include "x64Analyzer.h" -#include "Thunk.h" -// Declarations and definitions -// ---------- - -// void Jit(u32 em_address); - -#ifndef _WIN32 - - // A bit of a hack to get things building under linux. We manually fill in this structure as needed - // from the real context. - struct CONTEXT - { - #ifdef _M_ARM - u32 reg_pc; +// meh. +#if defined(_WIN32) + #include + typedef CONTEXT SContext; + #if defined(_M_X64) + #define CTX_RAX Rax + #define CTX_RBX Rbx + #define CTX_RCX Rcx + #define CTX_RDX Rdx + #define CTX_RDI Rdi + #define CTX_RSI Rsi + #define CTX_RBP Rbp + #define CTX_RSP Rsp + #define CTX_R8 R8 + #define CTX_R9 R9 + #define CTX_R10 R10 + #define CTX_R11 R11 + #define CTX_R12 R12 + #define CTX_R13 R13 + #define CTX_R14 R14 + #define CTX_R15 R15 + #define CTX_RIP Rip + #elif defined(_M_IX86) + #define CTX_EAX Eax + #define CTX_EBX Ebx + #define CTX_ECX Ecx + #define CTX_EDX Edx + #define CTX_EDI Edi + #define CTX_ESI Esi + #define CTX_EBP Ebp + #define CTX_ESP Esp + #define CTX_EIP Eip #else - #ifdef _M_X64 - u64 Rip; - u64 Rax; - #else - u32 Eip; - u32 Eax; - #endif + #error No context definition for OS + #endif +#elif defined(__APPLE__) + #include + #include + #if defined(_M_X64) + typedef x86_thread_state64_t SContext; + #define CTX_RAX __rax + #define CTX_RBX __rbx + #define CTX_RCX __rcx + #define CTX_RDX __rdx + #define CTX_RDI __rdi + #define CTX_RSI __rsi + #define CTX_RBP __rbp + #define CTX_RSP __rsp + #define CTX_R8 __r8 + #define CTX_R9 __r9 + #define CTX_R10 __r10 + #define CTX_R11 __r11 + #define CTX_R12 __r12 + #define CTX_R13 __r13 + #define CTX_R14 __r14 + #define CTX_R15 __r15 + #define CTX_RIP __rip + #elif defined(_M_IX86) + typedef x86_thread_state32_t SContext; + #define CTX_EAX __eax + #define CTX_EBX __ebx + #define CTX_ECX __ecx + #define CTX_EDX __edx + #define CTX_EDI __edi + #define CTX_ESI __esi + #define CTX_EBP __ebp + #define CTX_ESP __esp + #define CTX_EIP __eip + #elif defined(_M_ARM) + typedef arm_thread_state_t SContext; + // Add others if required. + #define CTX_PC __pc + #else + #error No context definition for OS + #endif +#elif defined(__linux__) + #include + #if defined(_M_X64) + #include + typedef mcontext_t SContext; + #define CTX_RAX gregs[REG_RAX] + #define CTX_RBX gregs[REG_RBX] + #define CTX_RCX gregs[REG_RCX] + #define CTX_RDX gregs[REG_RDX] + #define CTX_RDI gregs[REG_RDI] + #define CTX_RSI gregs[REG_RSI] + #define CTX_RBP gregs[REG_RBP] + #define CTX_RSP gregs[REG_RSP] + #define CTX_R8 gregs[REG_R8] + #define CTX_R9 gregs[REG_R9] + #define CTX_R10 gregs[REG_R10] + #define CTX_R11 gregs[REG_R11] + #define CTX_R12 gregs[REG_R12] + #define CTX_R13 gregs[REG_R13] + #define CTX_R14 gregs[REG_R14] + #define CTX_R15 gregs[REG_R15] + #define CTX_RIP gregs[REG_RIP] + #elif defined(_M_IX86) + #ifdef ANDROID + #include + typedef sigcontext SContext; + #define CTX_EAX eax + #define CTX_EBX ebx + #define CTX_ECX ecx + #define CTX_EDX edx + #define CTX_EDI edi + #define CTX_ESI esi + #define CTX_EBP ebp + #define CTX_ESP esp + #define CTX_EIP eip + #else + #include + typedef mcontext_t SContext; + #define CTX_EAX gregs[REG_EAX] + #define CTX_EBX gregs[REG_EBX] + #define CTX_ECX gregs[REG_ECX] + #define CTX_EDX gregs[REG_EDX] + #define CTX_EDI gregs[REG_EDI] + #define CTX_ESI gregs[REG_ESI] + #define CTX_EBP gregs[REG_EBP] + #define CTX_ESP gregs[REG_ESP] + #define CTX_EIP gregs[REG_EIP] + #endif + #elif defined(_M_ARM) + // Add others if required. + typedef struct sigcontext SContext; + #define CTX_PC arm_pc + #else + #warning No context definition for OS + #endif +#elif defined(__NetBSD__) + #include + typedef mcontext_t SContext; + #if defined(_M_X64) + #define CTX_RAX __gregs[_REG_RAX] + #define CTX_RBX __gregs[_REG_RBX] + #define CTX_RCX __gregs[_REG_RCX] + #define CTX_RDX __gregs[_REG_RDX] + #define CTX_RDI __gregs[_REG_RDI] + #define CTX_RSI __gregs[_REG_RSI] + #define CTX_RBP __gregs[_REG_RBP] + #define CTX_RSP __gregs[_REG_RSP] + #define CTX_R8 __gregs[_REG_R8] + #define CTX_R9 __gregs[_REG_R9] + #define CTX_R10 __gregs[_REG_R10] + #define CTX_R11 __gregs[_REG_R11] + #define CTX_R12 __gregs[_REG_R12] + #define CTX_R13 __gregs[_REG_R13] + #define CTX_R14 __gregs[_REG_R14] + #define CTX_R15 __gregs[_REG_R15] + #define CTX_RIP __gregs[_REG_RIP] + #elif defined(_M_IX86) + #define CTX_EAX __gregs[__REG_EAX] + #define CTX_EBX __gregs[__REG_EBX] + #define CTX_ECX __gregs[__REG_ECX] + #define CTX_EDX __gregs[__REG_EDX] + #define CTX_EDI __gregs[__REG_EDI] + #define CTX_ESI __gregs[__REG_ESI] + #define CTX_EBP __gregs[__REG_EBP] + #define CTX_ESP __gregs[__REG_ESP] + #define CTX_EIP __gregs[__REG_EIP] + #else + #error No context definition for OS + #endif +#elif defined(__FreeBSD__) + #include + typedef mcontext_t SContext; + #if defined(_M_X64) + #define CTX_RAX mc_rax + #define CTX_RBX mc_rbx + #define CTX_RCX mc_rcx + #define CTX_RDX mc_rdx + #define CTX_RDI mc_rdi + #define CTX_RSI mc_rsi + #define CTX_RBP mc_rbp + #define CTX_RSP mc_rsp + #define CTX_R8 mc_r8 + #define CTX_R9 mc_r9 + #define CTX_R10 mc_r10 + #define CTX_R11 mc_r11 + #define CTX_R12 mc_r12 + #define CTX_R13 mc_r13 + #define CTX_R14 mc_r14 + #define CTX_R15 mc_r15 + #define CTX_RIP mc_rip + #elif defined(_M_IX86) + #define CTX_EAX mc_eax + #define CTX_EBX mc_ebx + #define CTX_ECX mc_ecx + #define CTX_EDX mc_edx + #define CTX_EDI mc_edi + #define CTX_ESI mc_esi + #define CTX_EBP mc_ebp + #define CTX_ESP mc_esp + #define CTX_EIP mc_eip + #else + #error No context definition for OS #endif - }; - #endif +#if defined(_M_X64) +#define CTX_PC CTX_RIP +#include +static inline u64 *ContextRN(SContext* ctx, int n) +{ + static const u8 offsets[] = + { + offsetof(SContext, CTX_RAX), + offsetof(SContext, CTX_RCX), + offsetof(SContext, CTX_RDX), + offsetof(SContext, CTX_RBX), + offsetof(SContext, CTX_RSP), + offsetof(SContext, CTX_RBP), + offsetof(SContext, CTX_RSI), + offsetof(SContext, CTX_RDI), + offsetof(SContext, CTX_R8), + offsetof(SContext, CTX_R9), + offsetof(SContext, CTX_R10), + offsetof(SContext, CTX_R11), + offsetof(SContext, CTX_R12), + offsetof(SContext, CTX_R13), + offsetof(SContext, CTX_R14), + offsetof(SContext, CTX_R15) + }; + return (u64 *) ((char *) ctx + offsets[n]); +} +#elif defined(_M_IX86) +#define CTX_PC CTX_EIP +#endif class TrampolineCache : public Gen::XCodeBlock { @@ -43,10 +245,8 @@ public: void Init(); void Shutdown(); - const u8 *GetReadTrampoline(const InstructionInfo &info); - const u8 *GetWriteTrampoline(const InstructionInfo &info); -private: - ThunkManager thunks; + const u8 *GetReadTrampoline(const InstructionInfo &info, u32 registersInUse); + const u8 *GetWriteTrampoline(const InstructionInfo &info, u32 registersInUse); }; #endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.cpp index 46644f2fc9..d135e9864c 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.cpp @@ -35,7 +35,7 @@ void LogGeneratedX86(int size, PPCAnalyst::CodeBuffer *code_buffer, const u8 *no DisassembleGekko(op.inst.hex, op.address, temp, 256); sprintf(pDis, "%08x %s", op.address, temp); DEBUG_LOG(DYNA_REC,"IR_X86 PPC: %s\n", pDis); - } + } disassembler x64disasm; x64disasm.set_syntax_intel(); diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h index 826369e604..b133da0fdd 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitBase.h @@ -9,15 +9,23 @@ //#define JIT_LOG_GPR // Enables logging of the PPC general purpose regs //#define JIT_LOG_FPR // Enables logging of the PPC floating point regs -#include "../CPUCoreBase.h" -#include "JitCache.h" -#include "Jit_Util.h" // for EmuCodeBlock -#include "JitBackpatch.h" // for EmuCodeBlock #include "JitAsmCommon.h" +#include "JitCache.h" +#include "Jit_Util.h" // for EmuCodeBlock +#include "JitBackpatch.h" // for EmuCodeBlock +#include "x64ABI.h" +#include "x64Analyzer.h" +#include "x64Emitter.h" +#include "../CPUCoreBase.h" +#include "../PowerPC.h" +#include "../PPCAnalyst.h" +#include "../PPCTables.h" +#include "../../Core.h" +#include "../../CoreTiming.h" +#include "../../HW/GPFifo.h" +#include "../../HW/Memmap.h" -#include - -#define JIT_OPCODE 0 +#include class JitBase : public CPUCoreBase { @@ -62,19 +70,19 @@ protected: JitBlock *curBlock; - std::set fifoWriteAddresses; + std::unordered_set fifoWriteAddresses; }; public: // This should probably be removed from public: JitOptions jo; JitState js; - + virtual JitBaseBlockCache *GetBlockCache() = 0; virtual void Jit(u32 em_address) = 0; - virtual const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx) = 0; + virtual const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) = 0; virtual const CommonAsmRoutinesBase *GetAsmRoutines() = 0; @@ -85,13 +93,13 @@ class Jitx86Base : public JitBase, public EmuCodeBlock { protected: JitBlockCache blocks; - TrampolineCache trampolines; + TrampolineCache trampolines; public: - JitBlockCache *GetBlockCache() { return &blocks; } - - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx); + JitBlockCache *GetBlockCache() override { return &blocks; } - bool IsInCodeSpace(u8 *ptr) { return IsInSpace(ptr); } + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) override; + + bool IsInCodeSpace(u8 *ptr) override { return IsInSpace(ptr); } }; extern JitBase *jit; diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp index 7923fbf274..b81dadd394 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.cpp @@ -15,22 +15,12 @@ #include #endif -#include "../../Core.h" -#include "MemoryUtil.h" - -#include "../../HW/Memmap.h" -#include "../JitInterface.h" -#include "../../CoreTiming.h" - -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "../PPCAnalyst.h" - -#include "JitCache.h" #include "JitBase.h" - +#include "MemoryUtil.h" #include "disasm.h" +#include "../JitInterface.h" + #if defined USE_OPROFILE && USE_OPROFILE #include @@ -45,29 +35,18 @@ op_agent_t agent; using namespace Gen; -#define INVALID_EXIT 0xFFFFFFFF - -bool JitBlock::ContainsAddress(u32 em_address) -{ - // WARNING - THIS DOES NOT WORK WITH INLINING ENABLED. - return (em_address >= originalAddress && em_address < originalAddress + 4 * originalSize); -} - - bool JitBaseBlockCache::IsFull() const + bool JitBaseBlockCache::IsFull() const { return GetNumBlocks() >= MAX_NUM_BLOCKS - 1; } void JitBaseBlockCache::Init() { - MAX_NUM_BLOCKS = 65536*2; - #if defined USE_OPROFILE && USE_OPROFILE agent = op_open_agent(); #endif blocks = new JitBlock[MAX_NUM_BLOCKS]; blockCodePointers = new const u8*[MAX_NUM_BLOCKS]; -#ifdef JIT_UNLIMITED_ICACHE if (iCache == 0 && iCacheEx == 0 && iCacheVMEM == 0) { iCache = new u8[JIT_ICACHE_SIZE]; @@ -85,7 +64,6 @@ bool JitBlock::ContainsAddress(u32 em_address) memset(iCache, JIT_ICACHE_INVALID_BYTE, JIT_ICACHE_SIZE); memset(iCacheEx, JIT_ICACHE_INVALID_BYTE, JIT_ICACHEEX_SIZE); memset(iCacheVMEM, JIT_ICACHE_INVALID_BYTE, JIT_ICACHE_SIZE); -#endif Clear(); } @@ -93,7 +71,6 @@ bool JitBlock::ContainsAddress(u32 em_address) { delete[] blocks; delete[] blockCodePointers; -#ifdef JIT_UNLIMITED_ICACHE if (iCache != 0) delete[] iCache; iCache = 0; @@ -103,7 +80,6 @@ bool JitBlock::ContainsAddress(u32 em_address) if (iCacheVMEM != 0) delete[] iCacheVMEM; iCacheVMEM = 0; -#endif blocks = 0; blockCodePointers = 0; num_blocks = 0; @@ -115,7 +91,7 @@ bool JitBlock::ContainsAddress(u32 em_address) iJIT_NotifyEvent(iJVM_EVENT_TYPE_SHUTDOWN, NULL); #endif } - + // This clears the JIT cache. It's called from JitCache.cpp when the JIT cache // is full and when saving and loading states. void JitBaseBlockCache::Clear() @@ -140,11 +116,9 @@ bool JitBlock::ContainsAddress(u32 em_address) void JitBaseBlockCache::ClearSafe() { -#ifdef JIT_UNLIMITED_ICACHE memset(iCache, JIT_ICACHE_INVALID_BYTE, JIT_ICACHE_SIZE); memset(iCacheEx, JIT_ICACHE_INVALID_BYTE, JIT_ICACHEEX_SIZE); memset(iCacheVMEM, JIT_ICACHE_INVALID_BYTE, JIT_ICACHE_SIZE); -#endif } /*void JitBaseBlockCache::DestroyBlocksWithFlag(BlockFlag death_flag) @@ -180,7 +154,7 @@ bool JitBlock::ContainsAddress(u32 em_address) if ((s1 >= s2 && s1 <= e2) || (e1 >= s2 && e1 <= e2) || (s2 >= s1 && s2 <= e1) || - (e2 >= s1 && e2 <= e1)) + (e2 >= s1 && e2 <= e1)) return true; else return false; @@ -191,13 +165,6 @@ bool JitBlock::ContainsAddress(u32 em_address) JitBlock &b = blocks[num_blocks]; b.invalid = false; b.originalAddress = em_address; - b.exitAddress[0] = INVALID_EXIT; - b.exitAddress[1] = INVALID_EXIT; - b.exitPtrs[0] = 0; - b.exitPtrs[1] = 0; - b.linkStatus[0] = false; - b.linkStatus[1] = false; - b.blockNum = num_blocks; num_blocks++; //commit the current block return num_blocks - 1; } @@ -206,8 +173,8 @@ bool JitBlock::ContainsAddress(u32 em_address) { blockCodePointers[block_num] = code_ptr; JitBlock &b = blocks[block_num]; - b.originalFirstOpcode = JitInterface::Read_Opcode_JIT(b.originalAddress); - JitInterface::Write_Opcode_JIT(b.originalAddress, (JIT_OPCODE << 26) | block_num); + u32* icp = GetICachePtr(b.originalAddress); + *icp = block_num; // Convert the logical address to a physical address for the block map u32 pAddr = b.originalAddress & 0x1FFFFFFF; @@ -218,12 +185,11 @@ bool JitBlock::ContainsAddress(u32 em_address) block_map[std::make_pair(pAddr + 4 * b.originalSize - 1, pAddr)] = block_num; if (block_link) { - for (int i = 0; i < 2; i++) + for (const auto& e : b.linkData) { - if (b.exitAddress[i] != INVALID_EXIT) - links_to.insert(std::pair(b.exitAddress[i], block_num)); + links_to.insert(std::pair(e.exitAddress, block_num)); } - + LinkBlock(block_num); LinkBlockExits(block_num); } @@ -256,73 +222,33 @@ bool JitBlock::ContainsAddress(u32 em_address) return blockCodePointers; } -#ifdef JIT_UNLIMITED_ICACHE - u8* JitBaseBlockCache::GetICache() + u32* JitBaseBlockCache::GetICachePtr(u32 addr) { - return iCache; + if (addr & JIT_ICACHE_VMEM_BIT) + return (u32*)(jit->GetBlockCache()->iCacheVMEM + (addr & JIT_ICACHE_MASK)); + else if (addr & JIT_ICACHE_EXRAM_BIT) + return (u32*)(jit->GetBlockCache()->iCacheEx + (addr & JIT_ICACHEEX_MASK)); + else + return (u32*)(jit->GetBlockCache()->iCache + (addr & JIT_ICACHE_MASK)); } - u8* JitBaseBlockCache::GetICacheEx() - { - return iCacheEx; - } - - u8* JitBaseBlockCache::GetICacheVMEM() - { - return iCacheVMEM; - } -#endif - int JitBaseBlockCache::GetBlockNumberFromStartAddress(u32 addr) { if (!blocks) - return -1; -#ifdef JIT_UNLIMITED_ICACHE + return -1; u32 inst; - if (addr & JIT_ICACHE_VMEM_BIT) - { - inst = *(u32*)(iCacheVMEM + (addr & JIT_ICACHE_MASK)); - } - else if (addr & JIT_ICACHE_EXRAM_BIT) - { - inst = *(u32*)(iCacheEx + (addr & JIT_ICACHEEX_MASK)); - } - else - { - inst = *(u32*)(iCache + (addr & JIT_ICACHE_MASK)); - } - inst = Common::swap32(inst); -#else - u32 inst = Memory::ReadFast32(addr); -#endif + inst = *GetICachePtr(addr); if (inst & 0xfc000000) // definitely not a JIT block return -1; if ((int)inst >= num_blocks) return -1; if (blocks[inst].originalAddress != addr) - return -1; + return -1; return inst; } - void JitBaseBlockCache::GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers) - { - for (int i = 0; i < num_blocks; i++) - if (blocks[i].ContainsAddress(em_address)) - block_numbers->push_back(i); - } - - u32 JitBaseBlockCache::GetOriginalFirstOp(int block_num) - { - if (block_num >= num_blocks) - { - //PanicAlert("JitBaseBlockCache::GetOriginalFirstOp - block_num = %u is out of range", block_num); - return block_num; - } - return blocks[block_num].originalFirstOpcode; - } - CompiledCode JitBaseBlockCache::GetCompiledCodeFromBlock(int block_num) - { + { return (CompiledCode)blockCodePointers[block_num]; } @@ -340,15 +266,15 @@ bool JitBlock::ContainsAddress(u32 em_address) // This block is dead. Don't relink it. return; } - for (int e = 0; e < 2; e++) + for (auto& e : b.linkData) { - if (b.exitAddress[e] != INVALID_EXIT && !b.linkStatus[e]) + if (!e.linkStatus) { - int destinationBlock = GetBlockNumberFromStartAddress(b.exitAddress[e]); + int destinationBlock = GetBlockNumberFromStartAddress(e.exitAddress); if (destinationBlock != -1) { - WriteLinkBlock(b.exitPtrs[e], blocks[destinationBlock].checkedEntry); - b.linkStatus[e] = true; + WriteLinkBlock(e.exitPtrs, blocks[destinationBlock].checkedEntry); + e.linkStatus = true; } } } @@ -381,10 +307,10 @@ bool JitBlock::ContainsAddress(u32 em_address) return; for (multimap::iterator iter = ppp.first; iter != ppp.second; ++iter) { JitBlock &sourceBlock = blocks[iter->second]; - for (int e = 0; e < 2; e++) + for (auto& e : sourceBlock.linkData) { - if (sourceBlock.exitAddress[e] == b.originalAddress) - sourceBlock.linkStatus[e] = false; + if (e.exitAddress == b.originalAddress) + e.linkStatus = false; } } } @@ -404,12 +330,7 @@ bool JitBlock::ContainsAddress(u32 em_address) return; } b.invalid = true; -#ifdef JIT_UNLIMITED_ICACHE - JitInterface::Write_Opcode_JIT(b.originalAddress, b.originalFirstOpcode?b.originalFirstOpcode:JIT_ICACHE_INVALID_WORD); -#else - if (Memory::ReadFast32(b.originalAddress) == block_num) - Memory::WriteUnchecked_U32(b.originalFirstOpcode, b.originalAddress); -#endif + *GetICachePtr(b.originalAddress) = JIT_ICACHE_INVALID_WORD; UnlinkBlock(block_num); @@ -441,24 +362,8 @@ bool JitBlock::ContainsAddress(u32 em_address) std::map, u32>::iterator it1 = block_map.lower_bound(std::make_pair(pAddr, 0)), it2 = it1; while (it2 != block_map.end() && it2->first.second < pAddr + length) { -#ifdef JIT_UNLIMITED_ICACHE JitBlock &b = blocks[it2->second]; - if (b.originalAddress & JIT_ICACHE_VMEM_BIT) - { - u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK; - memset(iCacheVMEM + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4); - } - else if (b.originalAddress & JIT_ICACHE_EXRAM_BIT) - { - u32 cacheaddr = b.originalAddress & JIT_ICACHEEX_MASK; - memset(iCacheEx + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4); - } - else - { - u32 cacheaddr = b.originalAddress & JIT_ICACHE_MASK; - memset(iCache + cacheaddr, JIT_ICACHE_INVALID_BYTE, 4); - } -#endif + *GetICachePtr(b.originalAddress) = JIT_ICACHE_INVALID_WORD; DestroyBlock(it2->second, true); it2++; } @@ -468,7 +373,6 @@ bool JitBlock::ContainsAddress(u32 em_address) } } -#ifdef JIT_UNLIMITED_ICACHE // invalidate iCache. // icbi can be called with any address, so we should check if ((address & ~JIT_ICACHE_MASK) != 0x80000000 && (address & ~JIT_ICACHE_MASK) != 0x00000000 && @@ -492,7 +396,6 @@ bool JitBlock::ContainsAddress(u32 em_address) u32 cacheaddr = address & JIT_ICACHE_MASK; memset(iCache + cacheaddr, JIT_ICACHE_INVALID_BYTE, length); } -#endif } void JitBlockCache::WriteLinkBlock(u8* location, const u8* address) { diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h index a09eb3ebba..ffbffaadb5 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/JitCache.h @@ -27,28 +27,28 @@ #define JIT_ICACHE_EXRAM_BIT 0x10000000 #define JIT_ICACHE_VMEM_BIT 0x20000000 // this corresponds to opcode 5 which is invalid in PowerPC -#define JIT_ICACHE_INVALID_BYTE 0x14 -#define JIT_ICACHE_INVALID_WORD 0x14141414 +#define JIT_ICACHE_INVALID_BYTE 0x80 +#define JIT_ICACHE_INVALID_WORD 0x80808080 struct JitBlock { const u8 *checkedEntry; const u8 *normalEntry; - u8 *exitPtrs[2]; // to be able to rewrite the exit jum - u32 exitAddress[2]; // 0xFFFFFFFF == unknown - u32 originalAddress; - u32 originalFirstOpcode; //to be able to restore - u32 codeSize; + u32 codeSize; u32 originalSize; int runCount; // for profiling. - int blockNum; int flags; bool invalid; - bool linkStatus[2]; - bool ContainsAddress(u32 em_address); + + struct LinkData { + u8 *exitPtrs; // to be able to rewrite the exit jum + u32 exitAddress; + bool linkStatus; // is it already linked? + }; + std::vector linkData; #ifdef _WIN32 // we don't really need to save start and stop @@ -74,18 +74,16 @@ class JitBaseBlockCache std::multimap links_to; std::map, u32> block_map; // (end_addr, start_addr) -> number std::bitset<0x20000000 / 32> valid_block; -#ifdef JIT_UNLIMITED_ICACHE - u8 *iCache; - u8 *iCacheEx; - u8 *iCacheVMEM; -#endif - int MAX_NUM_BLOCKS; + enum + { + MAX_NUM_BLOCKS = 65536*2 + }; bool RangeIntersect(int s1, int e1, int s2, int e2) const; void LinkBlockExits(int i); void LinkBlock(int i); void UnlinkBlock(int i); - + // Virtual for overloaded virtual void WriteLinkBlock(u8* location, const u8* address) = 0; virtual void WriteDestroyBlock(const u8* location, u32 address) = 0; @@ -93,10 +91,7 @@ class JitBaseBlockCache public: JitBaseBlockCache() : blockCodePointers(0), blocks(0), num_blocks(0), -#ifdef JIT_UNLIMITED_ICACHE - iCache(0), iCacheEx(0), iCacheVMEM(0), -#endif - MAX_NUM_BLOCKS(0) { } + iCache(0), iCacheEx(0), iCacheVMEM(0) {} int AllocateBlock(u32 em_address); void FinalizeBlock(int block_num, bool block_link, const u8 *code_ptr); @@ -112,21 +107,15 @@ public: JitBlock *GetBlock(int block_num); int GetNumBlocks() const; const u8 **GetCodePointers(); -#ifdef JIT_UNLIMITED_ICACHE - u8 *GetICache(); - u8 *GetICacheEx(); - u8 *GetICacheVMEM(); -#endif + u8 *iCache; + u8 *iCacheEx; + u8 *iCacheVMEM; + + u32* GetICachePtr(u32 addr); // Fast way to get a block. Only works on the first ppc instruction of a block. int GetBlockNumberFromStartAddress(u32 em_address); - // slower, but can get numbers from within blocks, not just the first instruction. - // WARNING! WILL NOT WORK WITH INLINING ENABLED (not yet a feature but will be soon) - // Returns a list of block numbers - only one block can start at a particular address, but they CAN overlap. - // This one is slow so should only be used for one-shots from the debugger UI, not for anything during runtime. - void GetBlockNumbersFromAddress(u32 em_address, std::vector *block_numbers); - u32 GetOriginalFirstOp(int block_num); CompiledCode GetCompiledCodeFromBlock(int block_num); @@ -142,7 +131,7 @@ public: class JitBlockCache : public JitBaseBlockCache { private: - void WriteLinkBlock(u8* location, const u8* address); - void WriteDestroyBlock(const u8* location, u32 address); + void WriteLinkBlock(u8* location, const u8* address) override; + void WriteDestroyBlock(const u8* location, u32 address) override; }; #endif diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp index 18c8044385..5c4a712024 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp @@ -3,16 +3,8 @@ // Refer to the license.txt file included. #include "Common.h" -#include "Thunk.h" #include "CPUDetect.h" -#include "../PowerPC.h" -#include "../../Core.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "x64ABI.h" #include "JitBase.h" #include "Jit_Util.h" @@ -58,29 +50,46 @@ void EmuCodeBlock::UnsafeLoadRegToRegNoSwap(X64Reg reg_addr, X64Reg reg_value, i #endif } -void EmuCodeBlock::UnsafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend) +u8 *EmuCodeBlock::UnsafeLoadToReg(X64Reg reg_value, Gen::OpArg opAddress, int accessSize, s32 offset, bool signExtend) { + u8 *result; #ifdef _M_X64 if (opAddress.IsSimpleReg()) { - MOVZX(32, accessSize, EAX, MComplex(RBX, opAddress.GetSimpleReg(), SCALE_1, offset)); + // Deal with potential wraparound. (This is just a heuristic, and it would + // be more correct to actually mirror the first page at the end, but the + // only case where it probably actually matters is JitIL turning adds into + // offsets with the wrong sign, so whatever. Since the original code + // *could* try to wrap an address around, however, this is the correct + // place to address the issue.) + if ((u32) offset >= 0x1000) { + LEA(32, reg_value, MDisp(opAddress.GetSimpleReg(), offset)); + opAddress = R(reg_value); + offset = 0; + } + + result = GetWritableCodePtr(); + MOVZX(32, accessSize, reg_value, MComplex(RBX, opAddress.GetSimpleReg(), SCALE_1, offset)); } else { - MOV(32, R(EAX), opAddress); - MOVZX(32, accessSize, EAX, MComplex(RBX, EAX, SCALE_1, offset)); + MOV(32, R(reg_value), opAddress); + result = GetWritableCodePtr(); + MOVZX(32, accessSize, reg_value, MComplex(RBX, reg_value, SCALE_1, offset)); } #else if (opAddress.IsImm()) { - MOVZX(32, accessSize, EAX, M(Memory::base + (((u32)opAddress.offset + offset) & Memory::MEMVIEW32_MASK))); + result = GetWritableCodePtr(); + MOVZX(32, accessSize, reg_value, M(Memory::base + (((u32)opAddress.offset + offset) & Memory::MEMVIEW32_MASK))); } else { - if (!opAddress.IsSimpleReg(EAX)) - MOV(32, R(EAX), opAddress); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVZX(32, accessSize, EAX, MDisp(EAX, (u32)Memory::base + offset)); + if (!opAddress.IsSimpleReg(reg_value)) + MOV(32, R(reg_value), opAddress); + AND(32, R(reg_value), Imm32(Memory::MEMVIEW32_MASK)); + result = GetWritableCodePtr(); + MOVZX(32, accessSize, reg_value, MDisp(reg_value, (u32)Memory::base + offset)); } #endif @@ -90,39 +99,48 @@ void EmuCodeBlock::UnsafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, if (accessSize == 32) { - BSWAP(32, EAX); + BSWAP(32, reg_value); } else if (accessSize == 16) { - BSWAP(32, EAX); + BSWAP(32, reg_value); if (signExtend) - SAR(32, R(EAX), Imm8(16)); + SAR(32, R(reg_value), Imm8(16)); else - SHR(32, R(EAX), Imm8(16)); + SHR(32, R(reg_value), Imm8(16)); } else if (signExtend) { // TODO: bake 8-bit into the original load. - MOVSX(32, accessSize, EAX, R(EAX)); + MOVSX(32, accessSize, reg_value, R(reg_value)); } + return result; } -void EmuCodeBlock::SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend) +void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, int accessSize, s32 offset, u32 registersInUse, bool signExtend, int flags) { -#if defined(_M_X64) -#ifdef ENABLE_MEM_CHECK - if (!Core::g_CoreStartupParameter.bMMU && !Core::g_CoreStartupParameter.bEnableDebugging && Core::g_CoreStartupParameter.bFastmem) -#else - if (!Core::g_CoreStartupParameter.bMMU && Core::g_CoreStartupParameter.bFastmem) -#endif + if (!jit->js.memcheck) { - UnsafeLoadToEAX(opAddress, accessSize, offset, signExtend); + registersInUse &= ~(1 << RAX | 1 << reg_value); + } +#if defined(_M_X64) + if (!Core::g_CoreStartupParameter.bMMU && + Core::g_CoreStartupParameter.bFastmem && + !(flags & (SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_FASTMEM)) +#ifdef ENABLE_MEM_CHECK + && !Core::g_CoreStartupParameter.bEnableDebugging +#endif + ) + { + u8 *mov = UnsafeLoadToReg(reg_value, opAddress, accessSize, offset, signExtend); + + registersInUseAtLoc[mov] = registersInUse; } else #endif { u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS; - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { mem_mask |= Memory::ADDR_MASK_MEM1; } @@ -139,21 +157,32 @@ void EmuCodeBlock::SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s u32 address = (u32)opAddress.offset + offset; if ((address & mem_mask) == 0) { - UnsafeLoadToEAX(opAddress, accessSize, offset, signExtend); + UnsafeLoadToReg(reg_value, opAddress, accessSize, offset, signExtend); } else { + ABI_PushRegistersAndAdjustStack(registersInUse, false); switch (accessSize) { - case 32: ABI_CallFunctionC(thunks.ProtectFunction((void *)&Memory::Read_U32, 1), address); break; - case 16: ABI_CallFunctionC(thunks.ProtectFunction((void *)&Memory::Read_U16_ZX, 1), address); break; - case 8: ABI_CallFunctionC(thunks.ProtectFunction((void *)&Memory::Read_U8_ZX, 1), address); break; + case 32: ABI_CallFunctionC((void *)&Memory::Read_U32, address); break; + case 16: ABI_CallFunctionC((void *)&Memory::Read_U16_ZX, address); break; + case 8: ABI_CallFunctionC((void *)&Memory::Read_U8_ZX, address); break; } + ABI_PopRegistersAndAdjustStack(registersInUse, false); + + MEMCHECK_START + if (signExtend && accessSize < 32) { // Need to sign extend values coming from the Read_U* functions. - MOVSX(32, accessSize, EAX, R(EAX)); + MOVSX(32, accessSize, reg_value, R(EAX)); } + else if (reg_value != EAX) + { + MOVZX(32, accessSize, reg_value, R(EAX)); + } + + MEMCHECK_END } } else @@ -163,74 +192,123 @@ void EmuCodeBlock::SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s MOV(32, R(EAX), opAddress); ADD(32, R(EAX), Imm32(offset)); TEST(32, R(EAX), Imm32(mem_mask)); - FixupBranch fast = J_CC(CC_Z); + FixupBranch fast = J_CC(CC_Z, true); + ABI_PushRegistersAndAdjustStack(registersInUse, false); switch (accessSize) { - case 32: ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U32, 1), EAX); break; - case 16: ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U16_ZX, 1), EAX); break; - case 8: ABI_CallFunctionR(thunks.ProtectFunction((void *)&Memory::Read_U8_ZX, 1), EAX); break; + case 32: ABI_CallFunctionR((void *)&Memory::Read_U32, EAX); break; + case 16: ABI_CallFunctionR((void *)&Memory::Read_U16_ZX, EAX); break; + case 8: ABI_CallFunctionR((void *)&Memory::Read_U8_ZX, EAX); break; } + ABI_PopRegistersAndAdjustStack(registersInUse, false); + + MEMCHECK_START + if (signExtend && accessSize < 32) { // Need to sign extend values coming from the Read_U* functions. - MOVSX(32, accessSize, EAX, R(EAX)); + MOVSX(32, accessSize, reg_value, R(EAX)); } + else if (reg_value != EAX) + { + MOVZX(32, accessSize, reg_value, R(EAX)); + } + + MEMCHECK_END FixupBranch exit = J(); SetJumpTarget(fast); - UnsafeLoadToEAX(R(EAX), accessSize, 0, signExtend); + UnsafeLoadToReg(reg_value, R(EAX), accessSize, 0, signExtend); SetJumpTarget(exit); } else { TEST(32, opAddress, Imm32(mem_mask)); - FixupBranch fast = J_CC(CC_Z); + FixupBranch fast = J_CC(CC_Z, true); + ABI_PushRegistersAndAdjustStack(registersInUse, false); switch (accessSize) { - case 32: ABI_CallFunctionA(thunks.ProtectFunction((void *)&Memory::Read_U32, 1), opAddress); break; - case 16: ABI_CallFunctionA(thunks.ProtectFunction((void *)&Memory::Read_U16_ZX, 1), opAddress); break; - case 8: ABI_CallFunctionA(thunks.ProtectFunction((void *)&Memory::Read_U8_ZX, 1), opAddress); break; + case 32: ABI_CallFunctionA((void *)&Memory::Read_U32, opAddress); break; + case 16: ABI_CallFunctionA((void *)&Memory::Read_U16_ZX, opAddress); break; + case 8: ABI_CallFunctionA((void *)&Memory::Read_U8_ZX, opAddress); break; } + ABI_PopRegistersAndAdjustStack(registersInUse, false); + + MEMCHECK_START + if (signExtend && accessSize < 32) { // Need to sign extend values coming from the Read_U* functions. - MOVSX(32, accessSize, EAX, R(EAX)); + MOVSX(32, accessSize, reg_value, R(EAX)); } + else if (reg_value != EAX) + { + MOVZX(32, accessSize, reg_value, R(EAX)); + } + + MEMCHECK_END FixupBranch exit = J(); SetJumpTarget(fast); - UnsafeLoadToEAX(opAddress, accessSize, offset, signExtend); + UnsafeLoadToReg(reg_value, opAddress, accessSize, offset, signExtend); SetJumpTarget(exit); } } } } -void EmuCodeBlock::UnsafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, bool swap) +u8 *EmuCodeBlock::UnsafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, bool swap) { + u8 *result; if (accessSize == 8 && reg_value >= 4) { PanicAlert("WARNING: likely incorrect use of UnsafeWriteRegToReg!"); } if (swap) BSWAP(accessSize, reg_value); #ifdef _M_X64 + result = GetWritableCodePtr(); MOV(accessSize, MComplex(RBX, reg_addr, SCALE_1, offset), R(reg_value)); #else AND(32, R(reg_addr), Imm32(Memory::MEMVIEW32_MASK)); + result = GetWritableCodePtr(); MOV(accessSize, MDisp(reg_addr, (u32)Memory::base + offset), R(reg_value)); #endif + return result; } // Destroys both arg registers -void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, bool swap) +void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int accessSize, s32 offset, u32 registersInUse, int flags) { + registersInUse &= ~(1 << RAX); +#if defined(_M_X64) + if (!Core::g_CoreStartupParameter.bMMU && + Core::g_CoreStartupParameter.bFastmem && + !(flags & (SAFE_LOADSTORE_NO_SWAP | SAFE_LOADSTORE_NO_FASTMEM)) +#ifdef ENABLE_MEM_CHECK + && !Core::g_CoreStartupParameter.bEnableDebugging +#endif + ) + { + MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write + u8 *mov = UnsafeWriteRegToReg(reg_value, reg_addr, accessSize, offset, !(flags & SAFE_LOADSTORE_NO_SWAP)); + if (accessSize == 8) + { + NOP(1); + NOP(1); + } + + registersInUseAtLoc[mov] = registersInUse; + return; + } +#endif + if (offset) ADD(32, R(reg_addr), Imm32((u32)offset)); u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS; - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) { mem_mask |= Memory::ADDR_MASK_MEM1; } @@ -242,28 +320,32 @@ void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int acce } #endif - TEST(32, R(reg_addr), Imm32(mem_mask)); - FixupBranch fast = J_CC(CC_Z); MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write + TEST(32, R(reg_addr), Imm32(mem_mask)); + FixupBranch fast = J_CC(CC_Z, true); + bool noProlog = (0 != (flags & SAFE_LOADSTORE_NO_PROLOG)); + bool swap = !(flags & SAFE_LOADSTORE_NO_SWAP); + ABI_PushRegistersAndAdjustStack(registersInUse, noProlog); switch (accessSize) { - case 32: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), 2), reg_value, reg_addr); break; - case 16: ABI_CallFunctionRR(thunks.ProtectFunction(swap ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), 2), reg_value, reg_addr); break; - case 8: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), reg_value, reg_addr); break; + case 32: ABI_CallFunctionRR(swap ? ((void *)&Memory::Write_U32) : ((void *)&Memory::Write_U32_Swap), reg_value, reg_addr, false); break; + case 16: ABI_CallFunctionRR(swap ? ((void *)&Memory::Write_U16) : ((void *)&Memory::Write_U16_Swap), reg_value, reg_addr, false); break; + case 8: ABI_CallFunctionRR((void *)&Memory::Write_U8, reg_value, reg_addr, false); break; } + ABI_PopRegistersAndAdjustStack(registersInUse, noProlog); FixupBranch exit = J(); SetJumpTarget(fast); UnsafeWriteRegToReg(reg_value, reg_addr, accessSize, 0, swap); SetJumpTarget(exit); } -void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr) +void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr, u32 registersInUse, int flags) { if (false && cpu_info.bSSSE3) { // This path should be faster but for some reason it causes errors so I've disabled it. u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS; - if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.iTLBHack) + if (Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bTLBHack) mem_mask |= Memory::ADDR_MASK_MEM1; #ifdef ENABLE_MEM_CHECK @@ -276,7 +358,9 @@ void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr) MOV(32, R(EAX), M(&float_buffer)); BSWAP(32, EAX); MOV(32, M(&PC), Imm32(jit->js.compilerPC)); // Helps external systems know which instruction triggered the write - ABI_CallFunctionRR(thunks.ProtectFunction(((void *)&Memory::Write_U32), 2), EAX, reg_addr); + ABI_PushRegistersAndAdjustStack(registersInUse, false); + ABI_CallFunctionRR((void *)&Memory::Write_U32, EAX, reg_addr); + ABI_PopRegistersAndAdjustStack(registersInUse, false); FixupBranch arg2 = J(); SetJumpTarget(argh); PSHUFB(xmm_value, M((void *)pbswapShuffle1x4)); @@ -290,7 +374,7 @@ void EmuCodeBlock::SafeWriteFloatToReg(X64Reg xmm_value, X64Reg reg_addr) } else { MOVSS(M(&float_buffer), xmm_value); MOV(32, R(EAX), M(&float_buffer)); - SafeWriteRegToReg(EAX, reg_addr, 32, 0, true); + SafeWriteRegToReg(EAX, reg_addr, 32, 0, registersInUse, flags); } } diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.h b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.h index 7708ab8598..a321ddd117 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.h +++ b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.h @@ -6,20 +6,39 @@ #define _JITUTIL_H #include "x64Emitter.h" -#include "Thunk.h" +#include + +#define MEMCHECK_START \ + FixupBranch memException; \ + if (jit->js.memcheck) \ + { TEST(32, M((void *)&PowerPC::ppcState.Exceptions), Imm32(EXCEPTION_DSI)); \ + memException = J_CC(CC_NZ, true); } + +#define MEMCHECK_END \ + if (jit->js.memcheck) \ + SetJumpTarget(memException); + // Like XCodeBlock but has some utilities for memory access. -class EmuCodeBlock : public Gen::XCodeBlock { +class EmuCodeBlock : public Gen::XCodeBlock +{ public: void UnsafeLoadRegToReg(Gen::X64Reg reg_addr, Gen::X64Reg reg_value, int accessSize, s32 offset = 0, bool signExtend = false); void UnsafeLoadRegToRegNoSwap(Gen::X64Reg reg_addr, Gen::X64Reg reg_value, int accessSize, s32 offset); - void UnsafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset = 0, bool swap = true); - void UnsafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend); - void SafeLoadToEAX(const Gen::OpArg & opAddress, int accessSize, s32 offset, bool signExtend); - void SafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset, bool swap = true); + // these return the address of the MOV, for backpatching + u8 *UnsafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset = 0, bool swap = true); + u8 *UnsafeLoadToReg(Gen::X64Reg reg_value, Gen::OpArg opAddress, int accessSize, s32 offset, bool signExtend); + enum SafeLoadStoreFlags + { + SAFE_LOADSTORE_NO_SWAP = 1, + SAFE_LOADSTORE_NO_PROLOG = 2, + SAFE_LOADSTORE_NO_FASTMEM = 4 + }; + void SafeLoadToReg(Gen::X64Reg reg_value, const Gen::OpArg & opAddress, int accessSize, s32 offset, u32 registersInUse, bool signExtend, int flags = 0); + void SafeWriteRegToReg(Gen::X64Reg reg_value, Gen::X64Reg reg_addr, int accessSize, s32 offset, u32 registersInUse, int flags = 0); // Trashes both inputs and EAX. - void SafeWriteFloatToReg(Gen::X64Reg xmm_value, Gen::X64Reg reg_addr); + void SafeWriteFloatToReg(Gen::X64Reg xmm_value, Gen::X64Reg reg_addr, u32 registersInUse, int flags = 0); void WriteToConstRamAddress(int accessSize, const Gen::OpArg& arg, u32 address); void WriteFloatToConstRamAddress(const Gen::X64Reg& xmm_reg, u32 address); @@ -30,7 +49,7 @@ public: void ForceSinglePrecisionS(Gen::X64Reg xmm); void ForceSinglePrecisionP(Gen::X64Reg xmm); protected: - ThunkManager thunks; + std::unordered_map registersInUseAtLoc; }; #endif // _JITUTIL_H diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/IR.cpp similarity index 96% rename from Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/IR.cpp index 82beace052..3a4866f2f8 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/IR.cpp @@ -49,7 +49,7 @@ I've implemented one additional trick: fast memory for 32-bit machines. This works off of the observation that loads and stores can be classified at runtime: any particular load instruction will always load similar addresses, and any store will store to similar addresses. Using this observation, every -block is JIT-ed twice: the first time, the block includes extra code to +block is JIT-ed twice: the first time, the block includes extra code to instrument the loads. Then, at the end of the block, it jumps back into the JIT to recompile itself. The second recompilation looks at the address of each load and store, and bakes the information into the generated code. This allows removing @@ -66,7 +66,7 @@ use any floating-point), it's roughly 25% faster than the current JIT, with the edge over the current JIT mostly due to the fast memory optimization. Update on perf: -I've been doing a bit more tweaking for a small perf improvement (in the +I've been doing a bit more tweaking for a small perf improvement (in the range of 5-10%). That said, it's getting to the point where I'm simply not seeing potential for improvements to codegen, at least for long, straightforward blocks. For one long block that's at the top of my samples, @@ -118,15 +118,13 @@ Fix profiled loads/stores to work safely. On 32-bit, one solution is to #include #include +#include #include #include #include "IR.h" #include "../PPCTables.h" #include "../../CoreTiming.h" -#include "Thunk.h" #include "../../HW/Memmap.h" -#include "JitILAsm.h" -#include "JitIL.h" #include "../../HW/GPFifo.h" #include "../../Core.h" using namespace Gen; @@ -134,14 +132,14 @@ using namespace Gen; namespace IREmitter { InstLoc IRBuilder::EmitZeroOp(unsigned Opcode, unsigned extra = 0) { - InstLoc curIndex = &InstList[InstList.size()]; + InstLoc curIndex = InstList.data() + InstList.size(); InstList.push_back(Opcode | (extra << 8)); MarkUsed.push_back(false); return curIndex; } InstLoc IRBuilder::EmitUOp(unsigned Opcode, InstLoc Op1, unsigned extra) { - InstLoc curIndex = &InstList[InstList.size()]; + InstLoc curIndex = InstList.data() + InstList.size(); unsigned backOp1 = (s32)(curIndex - 1 - Op1); if (backOp1 >= 256) { InstList.push_back(Tramp | backOp1 << 8); @@ -155,7 +153,7 @@ InstLoc IRBuilder::EmitUOp(unsigned Opcode, InstLoc Op1, unsigned extra) { } InstLoc IRBuilder::EmitBiOp(unsigned Opcode, InstLoc Op1, InstLoc Op2, unsigned extra) { - InstLoc curIndex = &InstList[InstList.size()]; + InstLoc curIndex = InstList.data() + InstList.size(); unsigned backOp1 = (s32)(curIndex - 1 - Op1); if (backOp1 >= 255) { InstList.push_back(Tramp | backOp1 << 8); @@ -178,7 +176,7 @@ InstLoc IRBuilder::EmitBiOp(unsigned Opcode, InstLoc Op1, InstLoc Op2, unsigned #if 0 InstLoc IRBuilder::EmitTriOp(unsigned Opcode, InstLoc Op1, InstLoc Op2, InstLoc Op3) { - InstLoc curIndex = &InstList[InstList.size()]; + InstLoc curIndex = InstList.data() + InstList.size(); unsigned backOp1 = curIndex - 1 - Op1; if (backOp1 >= 254) { InstList.push_back(Tramp | backOp1 << 8); @@ -573,7 +571,7 @@ InstLoc IRBuilder::FoldMul(InstLoc Op1, InstLoc Op2) { if (imm == -1U) { return FoldSub(EmitIntConst(0), Op1); } - + for (unsigned i0 = 0; i0 < 30; ++i0) { // x * (1 << i0) => x << i0 // One "shl" is faster than one "imul". @@ -865,7 +863,7 @@ InstLoc IRBuilder::FoldBranchCond(InstLoc Op1, InstLoc Op2) { if (getOpcode(*XOp1) == And && isImm(*getOp2(XOp1)) && getOpcode(*getOp1(XOp1)) == ICmpCRSigned) { - unsigned innerBranchValue = + unsigned innerBranchValue = GetImmValue(getOp2(XOp1)); if (branchValue == innerBranchValue) { if (branchValue == 2) @@ -1009,7 +1007,7 @@ InstLoc IRBuilder::FoldInterpreterFallback(InstLoc Op1, InstLoc Op2) { CRCacheStore[i] = 0; } CTRCache = 0; - CTRCacheStore = 0; + CTRCacheStore = 0; return EmitBiOp(InterpreterFallback, Op1, Op2); } @@ -1052,7 +1050,7 @@ InstLoc IRBuilder::FoldBiOp(unsigned Opcode, InstLoc Op1, InstLoc Op2, unsigned } InstLoc IRBuilder::EmitIntConst(unsigned value) { - InstLoc curIndex = &InstList[InstList.size()]; + InstLoc curIndex = InstList.data() + InstList.size(); InstList.push_back(CInt32 | ((unsigned int)ConstList.size() << 8)); MarkUsed.push_back(false); ConstList.push_back(value); @@ -1064,12 +1062,12 @@ unsigned IRBuilder::GetImmValue(InstLoc I) const { } void IRBuilder::SetMarkUsed(InstLoc I) { - const unsigned i = (unsigned)(I - &InstList[0]); + const unsigned i = (unsigned)(I - InstList.data()); MarkUsed[i] = true; } bool IRBuilder::IsMarkUsed(InstLoc I) const { - const unsigned i = (unsigned)(I - &InstList[0]); + const unsigned i = (unsigned)(I - InstList.data()); return MarkUsed[i]; } @@ -1127,14 +1125,14 @@ unsigned IRBuilder::getNumberOfOperands(InstLoc I) const { static unsigned ZeroOp[] = {LoadCR, LoadLink, LoadMSR, LoadGReg, LoadCTR, InterpreterBranch, LoadCarry, RFIExit, LoadFReg, LoadFRegDENToZero, LoadGQR, Int3, }; static unsigned UOp[] = {StoreLink, BranchUncond, StoreCR, StoreMSR, StoreFPRF, StoreGReg, StoreCTR, Load8, Load16, Load32, SExt16, SExt8, Cntlzw, Not, StoreCarry, SystemCall, ShortIdleLoop, LoadSingle, LoadDouble, LoadPaired, StoreFReg, DupSingleToMReg, DupSingleToPacked, ExpandPackedToMReg, CompactMRegToPacked, FSNeg, FSRSqrt, FDNeg, FPDup0, FPDup1, FPNeg, DoubleToSingle, StoreGQR, StoreSRR, }; static unsigned BiOp[] = {BranchCond, IdleBranch, And, Xor, Sub, Or, Add, Mul, Rol, Shl, Shrl, Sarl, ICmpEq, ICmpNe, ICmpUgt, ICmpUlt, ICmpSgt, ICmpSlt, ICmpSge, ICmpSle, Store8, Store16, Store32, ICmpCRSigned, ICmpCRUnsigned, InterpreterFallback, StoreSingle, StoreDouble, StorePaired, InsertDoubleInMReg, FSMul, FSAdd, FSSub, FDMul, FDAdd, FDSub, FPAdd, FPMul, FPSub, FPMerge00, FPMerge01, FPMerge10, FPMerge11, FDCmpCR, }; - for (size_t i = 0; i < sizeof(ZeroOp) / sizeof(ZeroOp[0]); ++i) { - numberOfOperands[ZeroOp[i]] = 0; + for (auto& op : ZeroOp) { + numberOfOperands[op] = 0; } - for (size_t i = 0; i < sizeof(UOp) / sizeof(UOp[0]); ++i) { - numberOfOperands[UOp[i]] = 1; + for (auto& op : UOp) { + numberOfOperands[op] = 1; } - for (size_t i = 0; i < sizeof(BiOp) / sizeof(BiOp[0]); ++i) { - numberOfOperands[BiOp[i]] = 2; + for (auto& op : BiOp) { + numberOfOperands[op] = 2; } } @@ -1226,27 +1224,27 @@ struct Writer virtual ~Writer() {} }; -static std::auto_ptr writer; +static std::unique_ptr writer; static const std::string opcodeNames[] = { - "Nop", "LoadGReg", "LoadLink", "LoadCR", "LoadCarry", "LoadCTR", - "LoadMSR", "LoadGQR", "SExt8", "SExt16", "BSwap32", "BSwap16", "Cntlzw", - "Not", "Load8", "Load16", "Load32", "BranchUncond", "StoreGReg", - "StoreCR", "StoreLink", "StoreCarry", "StoreCTR", "StoreMSR", "StoreFPRF", - "StoreGQR", "StoreSRR", "InterpreterFallback", "Add", "Mul", "And", "Or", - "Xor", "MulHighUnsigned", "Sub", "Shl", "Shrl", "Sarl", "Rol", - "ICmpCRSigned", "ICmpCRUnsigned", "ICmpEq", "ICmpNe", "ICmpUgt", - "ICmpUlt", "ICmpUge", "ICmpUle", "ICmpSgt", "ICmpSlt", "ICmpSge", - "ICmpSle", "Store8", "Store16", "Store32", "BranchCond", "FResult_Start", - "LoadSingle", "LoadDouble", "LoadPaired", "DoubleToSingle", - "DupSingleToMReg", "DupSingleToPacked", "InsertDoubleInMReg", - "ExpandPackedToMReg", "CompactMRegToPacked", "LoadFReg", - "LoadFRegDENToZero", "FSMul", "FSAdd", "FSSub", "FSNeg", "FSRSqrt", - "FPAdd", "FPMul", "FPSub", "FPNeg", "FDMul", "FDAdd", "FDSub", "FDNeg", - "FPMerge00", "FPMerge01", "FPMerge10", "FPMerge11", "FPDup0", "FPDup1", - "FResult_End", "StorePaired", "StoreSingle", "StoreDouble", "StoreFReg", - "FDCmpCR", "CInt16", "CInt32", "SystemCall", "RFIExit", - "InterpreterBranch", "IdleBranch", "ShortIdleLoop", + "Nop", "LoadGReg", "LoadLink", "LoadCR", "LoadCarry", "LoadCTR", + "LoadMSR", "LoadGQR", "SExt8", "SExt16", "BSwap32", "BSwap16", "Cntlzw", + "Not", "Load8", "Load16", "Load32", "BranchUncond", "StoreGReg", + "StoreCR", "StoreLink", "StoreCarry", "StoreCTR", "StoreMSR", "StoreFPRF", + "StoreGQR", "StoreSRR", "InterpreterFallback", "Add", "Mul", "And", "Or", + "Xor", "MulHighUnsigned", "Sub", "Shl", "Shrl", "Sarl", "Rol", + "ICmpCRSigned", "ICmpCRUnsigned", "ICmpEq", "ICmpNe", "ICmpUgt", + "ICmpUlt", "ICmpUge", "ICmpUle", "ICmpSgt", "ICmpSlt", "ICmpSge", + "ICmpSle", "Store8", "Store16", "Store32", "BranchCond", "FResult_Start", + "LoadSingle", "LoadDouble", "LoadPaired", "DoubleToSingle", + "DupSingleToMReg", "DupSingleToPacked", "InsertDoubleInMReg", + "ExpandPackedToMReg", "CompactMRegToPacked", "LoadFReg", + "LoadFRegDENToZero", "FSMul", "FSAdd", "FSSub", "FSNeg", "FSRSqrt", + "FPAdd", "FPMul", "FPSub", "FPNeg", "FDMul", "FDAdd", "FDSub", "FDNeg", + "FPMerge00", "FPMerge01", "FPMerge10", "FPMerge11", "FPDup0", "FPDup1", + "FResult_End", "StorePaired", "StoreSingle", "StoreDouble", "StoreFReg", + "FDCmpCR", "CInt16", "CInt32", "SystemCall", "RFIExit", + "InterpreterBranch", "IdleBranch", "ShortIdleLoop", "FPExceptionCheckStart", "FPExceptionCheckEnd", "ISIException", "ExtExceptionCheck", "Tramp", "BlockStart", "BlockEnd", "Int3", }; @@ -1278,11 +1276,11 @@ void IRBuilder::WriteToFile(u64 codeHash) { _assert_(sizeof(opcodeNames) / sizeof(opcodeNames[0]) == Int3 + 1); if (!writer.get()) { - writer = std::auto_ptr(new Writer); + writer = std::unique_ptr(new Writer); } FILE* const file = writer->file.GetHandle(); - fprintf(file, "\ncode hash:%016llx\n", codeHash); + fprintf(file, "\ncode hash:%016" PRIx64 "\n", codeHash); const InstLoc lastCurReadPtr = curReadPtr; StartForwardPass(); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.h b/Source/Core/Core/Src/PowerPC/JitILCommon/IR.h similarity index 98% rename from Source/Core/Core/Src/PowerPC/Jit64IL/IR.h rename to Source/Core/Core/Src/PowerPC/JitILCommon/IR.h index cce9c3ae3c..f3246e77b0 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/IR.h +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/IR.h @@ -182,7 +182,7 @@ unsigned inline isICmp(Inst i) { } unsigned inline isFResult(Inst i) { - return getOpcode(i) > FResult_Start && + return getOpcode(i) > FResult_Start && getOpcode(i) < FResult_End; } @@ -406,7 +406,7 @@ public: } InstLoc EmitRFIExit() { return FoldZeroOp(RFIExit, 0); - } + } InstLoc EmitShortIdleLoop(InstLoc pc) { return FoldUOp(ShortIdleLoop, pc); } @@ -529,11 +529,11 @@ public: return FoldZeroOp(Int3, 0); } - void StartBackPass() { curReadPtr = &InstList[InstList.size()]; } - void StartForwardPass() { curReadPtr = &InstList[0]; } + void StartBackPass() { curReadPtr = InstList.data() + InstList.size(); } + void StartForwardPass() { curReadPtr = InstList.data(); } InstLoc ReadForward() { return curReadPtr++; } InstLoc ReadBackward() { return --curReadPtr; } - InstLoc getFirstInst() { return &InstList[0]; } + InstLoc getFirstInst() { return InstList.data(); } unsigned int getNumInsts() { return (unsigned int)InstList.size(); } unsigned int ReadInst(InstLoc I) { return *I; } unsigned int GetImmValue(InstLoc I) const; diff --git a/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase.h b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase.h new file mode 100644 index 0000000000..ee5d08a4fd --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase.h @@ -0,0 +1,153 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _JITILBASE_H +#define _JITILBASE_H + +#include "IR.h" +#include "../PowerPC.h" +#include "../PPCAnalyst.h" +#include "../PPCTables.h" +#include "../JitCommon/JitBase.h" +#include "../../ConfigManager.h" +#include "../../Core.h" +#include "../../CoreTiming.h" +#include "../../HW/GPFifo.h" +#include "../../HW/Memmap.h" + +#define INSTRUCTION_START + +#define JITDISABLE(setting) \ + if (Core::g_CoreStartupParameter.bJITOff || \ + Core::g_CoreStartupParameter.setting) \ + {Default(inst); return;} + +class JitILBase : public JitBase +{ +protected: + // The default code buffer. We keep it around to not have to alloc/dealloc a + // large chunk of memory for each recompiled block. + PPCAnalyst::CodeBuffer code_buffer; +public: + JitILBase() : code_buffer(32000) {} + ~JitILBase() {} + + IREmitter::IRBuilder ibuild; + + virtual JitBaseBlockCache *GetBlockCache() = 0; + + virtual void Jit(u32 em_address) = 0; + + virtual const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) = 0; + + virtual const CommonAsmRoutinesBase *GetAsmRoutines() = 0; + + virtual bool IsInCodeSpace(u8 *ptr) = 0; + + // OPCODES + virtual void unknown_instruction(UGeckoInstruction inst) = 0; + virtual void Default(UGeckoInstruction inst) = 0; + virtual void DoNothing(UGeckoInstruction inst) = 0; + virtual void HLEFunction(UGeckoInstruction inst) = 0; + + virtual void DynaRunTable4(UGeckoInstruction _inst) = 0; + virtual void DynaRunTable19(UGeckoInstruction _inst) = 0; + virtual void DynaRunTable31(UGeckoInstruction _inst) = 0; + virtual void DynaRunTable59(UGeckoInstruction _inst) = 0; + virtual void DynaRunTable63(UGeckoInstruction _inst) = 0; + + // Branches + void sc(UGeckoInstruction inst); + void rfi(UGeckoInstruction inst); + void bx(UGeckoInstruction inst); + void bcx(UGeckoInstruction inst); + void bcctrx(UGeckoInstruction inst); + void bclrx(UGeckoInstruction inst); + + // LoadStore + void lXzx(UGeckoInstruction inst); + void lhax(UGeckoInstruction inst); + void stXx(UGeckoInstruction inst); + void lmw(UGeckoInstruction inst); + void stmw(UGeckoInstruction inst); + void stX(UGeckoInstruction inst); //stw sth stb + void lXz(UGeckoInstruction inst); + void lbzu(UGeckoInstruction inst); + void lha(UGeckoInstruction inst); + + // System Registers + void mtspr(UGeckoInstruction inst); + void mfspr(UGeckoInstruction inst); + void mtmsr(UGeckoInstruction inst); + void mfmsr(UGeckoInstruction inst); + void mftb(UGeckoInstruction inst); + void mtcrf(UGeckoInstruction inst); + void mfcr(UGeckoInstruction inst); + void mcrf(UGeckoInstruction inst); + void crXX(UGeckoInstruction inst); + + void dcbst(UGeckoInstruction inst); + void dcbz(UGeckoInstruction inst); + void icbi(UGeckoInstruction inst); + + void addx(UGeckoInstruction inst); + void boolX(UGeckoInstruction inst); + void mulli(UGeckoInstruction inst); + void mulhwux(UGeckoInstruction inst); + void mullwx(UGeckoInstruction inst); + void divwux(UGeckoInstruction inst); + void srawix(UGeckoInstruction inst); + void srawx(UGeckoInstruction inst); + void addex(UGeckoInstruction inst); + void addzex(UGeckoInstruction inst); + + void extsbx(UGeckoInstruction inst); + void extshx(UGeckoInstruction inst); + + void reg_imm(UGeckoInstruction inst); + + void ps_sel(UGeckoInstruction inst); + void ps_mr(UGeckoInstruction inst); + void ps_sign(UGeckoInstruction inst); //aggregate + void ps_arith(UGeckoInstruction inst); //aggregate + void ps_mergeXX(UGeckoInstruction inst); + void ps_maddXX(UGeckoInstruction inst); + void ps_rsqrte(UGeckoInstruction inst); + void ps_sum(UGeckoInstruction inst); + void ps_muls(UGeckoInstruction inst); + + void fp_arith_s(UGeckoInstruction inst); + + void fcmpx(UGeckoInstruction inst); + void fmrx(UGeckoInstruction inst); + + void cmpXX(UGeckoInstruction inst); + + void cntlzwx(UGeckoInstruction inst); + + void lfs(UGeckoInstruction inst); + void lfd(UGeckoInstruction inst); + void stfd(UGeckoInstruction inst); + void stfs(UGeckoInstruction inst); + void stfsx(UGeckoInstruction inst); + void psq_l(UGeckoInstruction inst); + void psq_st(UGeckoInstruction inst); + + void fmaddXX(UGeckoInstruction inst); + void fsign(UGeckoInstruction inst); + void rlwinmx(UGeckoInstruction inst); + void rlwimix(UGeckoInstruction inst); + void rlwnmx(UGeckoInstruction inst); + void negx(UGeckoInstruction inst); + void slwx(UGeckoInstruction inst); + void srwx(UGeckoInstruction inst); + void lfsx(UGeckoInstruction inst); + + void subfic(UGeckoInstruction inst); + void subfcx(UGeckoInstruction inst); + void subfx(UGeckoInstruction inst); + void subfex(UGeckoInstruction inst); + +}; +#endif diff --git a/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Branch.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Branch.cpp new file mode 100644 index 0000000000..6d6c594126 --- /dev/null +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Branch.cpp @@ -0,0 +1,185 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "Common.h" +#include "JitILBase.h" + + +// The branches are known good, or at least reasonably good. +// No need for a disable-mechanism. + +// If defined, clears CR0 at blr and bl-s. If the assumption that +// flags never carry over between functions holds, then the task for +// an optimizer becomes much easier. + +// #define ACID_TEST + +// Zelda and many more games seem to pass the Acid Test. + +//#define NORMALBRANCH_START Default(inst); ibuild.EmitInterpreterBranch(); return; +#define NORMALBRANCH_START + +void JitILBase::sc(UGeckoInstruction inst) +{ + ibuild.EmitSystemCall(ibuild.EmitIntConst(js.compilerPC)); +} + +void JitILBase::rfi(UGeckoInstruction inst) +{ + ibuild.EmitRFIExit(); +} + +void JitILBase::bx(UGeckoInstruction inst) +{ + NORMALBRANCH_START + INSTRUCTION_START; + + // We must always process the following sentence + // even if the blocks are merged by PPCAnalyst::Flatten(). + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + + // If this is not the last instruction of a block, + // we will skip the rest process. + // Because PPCAnalyst::Flatten() merged the blocks. + if (!js.isLastInstruction) { + return; + } + + u32 destination; + if (inst.AA) + destination = SignExt26(inst.LI << 2); + else + destination = js.compilerPC + SignExt26(inst.LI << 2); + + if (destination == js.compilerPC) { + ibuild.EmitShortIdleLoop(ibuild.EmitIntConst(js.compilerPC)); + return; + } + + ibuild.EmitBranchUncond(ibuild.EmitIntConst(destination)); +} + +static IREmitter::InstLoc TestBranch(IREmitter::IRBuilder& ibuild, UGeckoInstruction inst) { + IREmitter::InstLoc CRTest = 0, CTRTest = 0; + if ((inst.BO & 16) == 0) // Test a CR bit + { + IREmitter::InstLoc CRReg = ibuild.EmitLoadCR(inst.BI >> 2); + IREmitter::InstLoc CRCmp = ibuild.EmitIntConst(8 >> (inst.BI & 3)); + CRTest = ibuild.EmitAnd(CRReg, CRCmp); + if (!(inst.BO & 8)) + CRTest = ibuild.EmitXor(CRCmp, CRTest); + } + + if ((inst.BO & 4) == 0) { + IREmitter::InstLoc c = ibuild.EmitLoadCTR(); + c = ibuild.EmitSub(c, ibuild.EmitIntConst(1)); + ibuild.EmitStoreCTR(c); + if (inst.BO & 2) { + CTRTest = ibuild.EmitICmpEq(c, + ibuild.EmitIntConst(0)); + } else { + CTRTest = c; + } + } + + IREmitter::InstLoc Test = CRTest; + if (CTRTest) { + if (Test) + Test = ibuild.EmitAnd(Test, CTRTest); + else + Test = CTRTest; + } + + if (!Test) { + Test = ibuild.EmitIntConst(1); + } + return Test; +} + +void JitILBase::bcx(UGeckoInstruction inst) +{ + NORMALBRANCH_START + if (inst.LK) + ibuild.EmitStoreLink( + ibuild.EmitIntConst(js.compilerPC + 4)); + + IREmitter::InstLoc Test = TestBranch(ibuild, inst); + + u32 destination; + if(inst.AA) + destination = SignExt16(inst.BD << 2); + else + destination = js.compilerPC + SignExt16(inst.BD << 2); + + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle && + inst.hex == 0x4182fff8 && + (Memory::ReadUnchecked_U32(js.compilerPC - 8) & 0xFFFF0000) == 0x800D0000 && + (Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x28000000 || + (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii && Memory::ReadUnchecked_U32(js.compilerPC - 4) == 0x2C000000)) + ) + { + ibuild.EmitIdleBranch(Test, ibuild.EmitIntConst(destination)); + } + else + { + ibuild.EmitBranchCond(Test, ibuild.EmitIntConst(destination)); + } + ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); +} + +void JitILBase::bcctrx(UGeckoInstruction inst) +{ + NORMALBRANCH_START + if ((inst.BO & 4) == 0) { + IREmitter::InstLoc c = ibuild.EmitLoadCTR(); + c = ibuild.EmitSub(c, ibuild.EmitIntConst(1)); + ibuild.EmitStoreCTR(c); + } + IREmitter::InstLoc test; + if ((inst.BO & 16) == 0) // Test a CR bit + { + IREmitter::InstLoc CRReg = ibuild.EmitLoadCR(inst.BI >> 2); + IREmitter::InstLoc CRCmp = ibuild.EmitIntConst(8 >> (inst.BI & 3)); + test = ibuild.EmitAnd(CRReg, CRCmp); + if (!(inst.BO & 8)) + test = ibuild.EmitXor(test, CRCmp); + } else { + test = ibuild.EmitIntConst(1); + } + test = ibuild.EmitICmpEq(test, ibuild.EmitIntConst(0)); + ibuild.EmitBranchCond(test, ibuild.EmitIntConst(js.compilerPC + 4)); + + IREmitter::InstLoc destination = ibuild.EmitLoadCTR(); + destination = ibuild.EmitAnd(destination, ibuild.EmitIntConst(-4)); + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + ibuild.EmitBranchUncond(destination); +} + +void JitILBase::bclrx(UGeckoInstruction inst) +{ + NORMALBRANCH_START + + if (!js.isLastInstruction && + (inst.BO & (1 << 4)) && (inst.BO & (1 << 2))) { + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + return; + } + + if (inst.hex == 0x4e800020) { + ibuild.EmitBranchUncond(ibuild.EmitLoadLink()); + return; + } + IREmitter::InstLoc test = TestBranch(ibuild, inst); + test = ibuild.EmitICmpEq(test, ibuild.EmitIntConst(0)); + ibuild.EmitBranchCond(test, ibuild.EmitIntConst(js.compilerPC + 4)); + + IREmitter::InstLoc destination = ibuild.EmitLoadLink(); + destination = ibuild.EmitAnd(destination, ibuild.EmitIntConst(-4)); + if (inst.LK) + ibuild.EmitStoreLink(ibuild.EmitIntConst(js.compilerPC + 4)); + ibuild.EmitBranchUncond(destination); +} diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp similarity index 83% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp index 9a0207f85c..893bafe0d0 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_FloatingPoint.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp @@ -3,21 +3,12 @@ // Refer to the license.txt file included. #include "Common.h" +#include "JitILBase.h" -#include "../../Core.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" - -#include "JitIL.h" - -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START - -void JitIL::fp_arith_s(UGeckoInstruction inst) +void JitILBase::fp_arith_s(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc || (inst.SUBOP5 != 25 && inst.SUBOP5 != 20 && inst.SUBOP5 != 21 && inst.SUBOP5 != 26)) { Default(inst); return; @@ -57,10 +48,10 @@ void JitIL::fp_arith_s(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void JitIL::fmaddXX(UGeckoInstruction inst) +void JitILBase::fmaddXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc) { Default(inst); return; } @@ -85,10 +76,10 @@ void JitIL::fmaddXX(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void JitIL::fmrx(UGeckoInstruction inst) +void JitILBase::fmrx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) if (inst.Rc) { Default(inst); return; } @@ -97,10 +88,10 @@ void JitIL::fmrx(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void JitIL::fcmpx(UGeckoInstruction inst) +void JitILBase::fcmpx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) IREmitter::InstLoc lhs, rhs, res; lhs = ibuild.EmitLoadFReg(inst.FA); rhs = ibuild.EmitLoadFReg(inst.FB); @@ -110,10 +101,10 @@ void JitIL::fcmpx(UGeckoInstruction inst) ibuild.EmitStoreCR(res, inst.CRFD); } -void JitIL::fsign(UGeckoInstruction inst) +void JitILBase::fsign(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(FloatingPoint) + JITDISABLE(bJITFloatingPointOff) Default(inst); return; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Integer.cpp similarity index 84% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Integer.cpp index 0734bea7e0..836cc9d45e 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Integer.cpp @@ -6,28 +6,19 @@ #pragma warning(disable:4146) // unary minus operator applied to unsigned type, result still unsigned #endif -#include "../../Core.h" // include "Common.h", "CoreParameter.h", SCoreStartupParameter -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" +#include "JitILBase.h" -#include "JitIL.h" -#include "JitILAsm.h" - -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START - -static void ComputeRC(IREmitter::IRBuilder& ibuild, - IREmitter::InstLoc val) { +static void ComputeRC(IREmitter::IRBuilder& ibuild, IREmitter::InstLoc val) +{ IREmitter::InstLoc res = ibuild.EmitICmpCRSigned(val, ibuild.EmitIntConst(0)); ibuild.EmitStoreCR(res, 0); } -void JitIL::reg_imm(UGeckoInstruction inst) +void JitILBase::reg_imm(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) int d = inst.RD, a = inst.RA, s = inst.RS; IREmitter::InstLoc val, test, c; switch (inst.OPCD) @@ -92,35 +83,45 @@ void JitIL::reg_imm(UGeckoInstruction inst) } } -void JitIL::cmpXX(UGeckoInstruction inst) +void JitILBase::cmpXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc lhs, rhs, res; lhs = ibuild.EmitLoadGReg(inst.RA); - if (inst.OPCD == 31) { + + if (inst.OPCD == 31) + { rhs = ibuild.EmitLoadGReg(inst.RB); - if (inst.SUBOP10 == 32) { + if (inst.SUBOP10 == 32) + { res = ibuild.EmitICmpCRUnsigned(lhs, rhs); - } else { + } + else + { res = ibuild.EmitICmpCRSigned(lhs, rhs); } - } else if (inst.OPCD == 10) { + } + else if (inst.OPCD == 10) + { rhs = ibuild.EmitIntConst(inst.UIMM); res = ibuild.EmitICmpCRUnsigned(lhs, rhs); - } else { // inst.OPCD == 11 + } + else // inst.OPCD == 11 + { rhs = ibuild.EmitIntConst(inst.SIMM_16); res = ibuild.EmitICmpCRSigned(lhs, rhs); } + js.downcountAmount++; //TODO: should this be somewhere else? - + ibuild.EmitStoreCR(res, inst.CRFD); } -void JitIL::boolX(UGeckoInstruction inst) +void JitILBase::boolX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc a = NULL; IREmitter::InstLoc s = ibuild.EmitLoadGReg(inst.RS); @@ -170,10 +171,10 @@ void JitIL::boolX(UGeckoInstruction inst) ComputeRC(ibuild, a); } -void JitIL::extsbx(UGeckoInstruction inst) +void JitILBase::extsbx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitSExt8(val); ibuild.EmitStoreGReg(val, inst.RA); @@ -181,10 +182,10 @@ void JitIL::extsbx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::extshx(UGeckoInstruction inst) +void JitILBase::extshx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitSExt16(val); ibuild.EmitStoreGReg(val, inst.RA); @@ -192,29 +193,34 @@ void JitIL::extshx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::subfic(UGeckoInstruction inst) +void JitILBase::subfic(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc nota, lhs, val, test; nota = ibuild.EmitXor(ibuild.EmitLoadGReg(inst.RA), ibuild.EmitIntConst(-1)); - if (inst.SIMM_16 == -1) { + + if (inst.SIMM_16 == -1) + { val = nota; test = ibuild.EmitIntConst(1); - } else { + } + else + { lhs = ibuild.EmitIntConst(inst.SIMM_16 + 1); val = ibuild.EmitAdd(nota, lhs); test = ibuild.EmitICmpUgt(lhs, val); } + ibuild.EmitStoreGReg(val, inst.RD); ibuild.EmitStoreCarry(test); } -void JitIL::subfcx(UGeckoInstruction inst) +void JitILBase::subfcx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) if (inst.OE) PanicAlert("OE: subfcx"); IREmitter::InstLoc val, test, lhs, rhs; lhs = ibuild.EmitLoadGReg(inst.RB); @@ -228,10 +234,10 @@ void JitIL::subfcx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::subfex(UGeckoInstruction inst) +void JitILBase::subfex(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) if (inst.OE) PanicAlert("OE: subfex"); IREmitter::InstLoc val, test, lhs, rhs, carry; rhs = ibuild.EmitLoadGReg(inst.RA); @@ -249,10 +255,10 @@ void JitIL::subfex(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::subfx(UGeckoInstruction inst) +void JitILBase::subfx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) if (inst.OE) PanicAlert("OE: subfx"); IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB); val = ibuild.EmitSub(val, ibuild.EmitLoadGReg(inst.RA)); @@ -261,19 +267,19 @@ void JitIL::subfx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::mulli(UGeckoInstruction inst) +void JitILBase::mulli(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RA); val = ibuild.EmitMul(val, ibuild.EmitIntConst(inst.SIMM_16)); ibuild.EmitStoreGReg(val, inst.RD); } -void JitIL::mullwx(UGeckoInstruction inst) +void JitILBase::mullwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB); val = ibuild.EmitMul(ibuild.EmitLoadGReg(inst.RA), val); ibuild.EmitStoreGReg(val, inst.RD); @@ -281,10 +287,10 @@ void JitIL::mullwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::mulhwux(UGeckoInstruction inst) +void JitILBase::mulhwux(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc a = ibuild.EmitLoadGReg(inst.RA); IREmitter::InstLoc b = ibuild.EmitLoadGReg(inst.RB); @@ -295,17 +301,23 @@ void JitIL::mulhwux(UGeckoInstruction inst) } // skipped some of the special handling in here - if we get crashes, let the interpreter handle this op -void JitIL::divwux(UGeckoInstruction inst) { +void JitILBase::divwux(UGeckoInstruction inst) +{ Default(inst); return; #if 0 int a = inst.RA, b = inst.RB, d = inst.RD; gpr.FlushLockX(EDX); gpr.Lock(a, b, d); - if (d != a && d != b) { + + if (d != a && d != b) + { gpr.LoadToX64(d, false, true); - } else { + } + else + { gpr.LoadToX64(d, true, true); } + MOV(32, R(EAX), gpr.R(a)); XOR(32, R(EDX), R(EDX)); gpr.KillImmediate(b); @@ -319,10 +331,10 @@ void JitIL::divwux(UGeckoInstruction inst) { #endif } -void JitIL::addx(UGeckoInstruction inst) +void JitILBase::addx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RB); val = ibuild.EmitAdd(ibuild.EmitLoadGReg(inst.RA), val); ibuild.EmitStoreGReg(val, inst.RD); @@ -330,10 +342,10 @@ void JitIL::addx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::addzex(UGeckoInstruction inst) +void JitILBase::addzex(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc lhs = ibuild.EmitLoadGReg(inst.RA), val, newcarry; val = ibuild.EmitAdd(lhs, ibuild.EmitLoadCarry()); @@ -344,10 +356,10 @@ void JitIL::addzex(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::addex(UGeckoInstruction inst) +void JitILBase::addex(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc a = ibuild.EmitLoadGReg(inst.RA); IREmitter::InstLoc b = ibuild.EmitLoadGReg(inst.RB); @@ -367,10 +379,10 @@ void JitIL::addex(UGeckoInstruction inst) ComputeRC(ibuild, abc); } -void JitIL::rlwinmx(UGeckoInstruction inst) +void JitILBase::rlwinmx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) unsigned mask = Helper_Mask(inst.MB, inst.ME); IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitRol(val, ibuild.EmitIntConst(inst.SH)); @@ -381,10 +393,10 @@ void JitIL::rlwinmx(UGeckoInstruction inst) } -void JitIL::rlwimix(UGeckoInstruction inst) +void JitILBase::rlwimix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) unsigned mask = Helper_Mask(inst.MB, inst.ME); IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitRol(val, ibuild.EmitIntConst(inst.SH)); @@ -397,10 +409,10 @@ void JitIL::rlwimix(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::rlwnmx(UGeckoInstruction inst) +void JitILBase::rlwnmx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) unsigned int mask = Helper_Mask(inst.MB, inst.ME); IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitRol(val, ibuild.EmitLoadGReg(inst.RB)); @@ -410,10 +422,10 @@ void JitIL::rlwnmx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::negx(UGeckoInstruction inst) +void JitILBase::negx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RA); val = ibuild.EmitSub(ibuild.EmitIntConst(0), val); ibuild.EmitStoreGReg(val, inst.RD); @@ -421,10 +433,10 @@ void JitIL::negx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::srwx(UGeckoInstruction inst) +void JitILBase::srwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS), samt = ibuild.EmitLoadGReg(inst.RB), corr; @@ -440,10 +452,10 @@ void JitIL::srwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::slwx(UGeckoInstruction inst) +void JitILBase::slwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS), samt = ibuild.EmitLoadGReg(inst.RB), corr; @@ -459,10 +471,10 @@ void JitIL::slwx(UGeckoInstruction inst) ComputeRC(ibuild, val); } -void JitIL::srawx(UGeckoInstruction inst) +void JitILBase::srawx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) // FIXME: We can do a lot better on 64-bit IREmitter::InstLoc val, samt, mask, mask2, test; val = ibuild.EmitLoadGReg(inst.RS); @@ -480,32 +492,32 @@ void JitIL::srawx(UGeckoInstruction inst) test = ibuild.EmitOr(val, mask2); test = ibuild.EmitICmpUgt(test, mask); ibuild.EmitStoreCarry(test); - + if (inst.Rc) ComputeRC(ibuild, val); } -void JitIL::srawix(UGeckoInstruction inst) +void JitILBase::srawix(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS), test; val = ibuild.EmitSarl(val, ibuild.EmitIntConst(inst.SH)); ibuild.EmitStoreGReg(val, inst.RA); unsigned int mask = -1u << inst.SH; test = ibuild.EmitOr(val, ibuild.EmitIntConst(mask & 0x7FFFFFFF)); test = ibuild.EmitICmpUgt(test, ibuild.EmitIntConst(mask)); - + ibuild.EmitStoreCarry(test); if (inst.Rc) ComputeRC(ibuild, val); } // count leading zeroes -void JitIL::cntlzwx(UGeckoInstruction inst) +void JitILBase::cntlzwx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Integer) + JITDISABLE(bJITIntegerOff) IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS); val = ibuild.EmitCntlzw(val); ibuild.EmitStoreGReg(val, inst.RA); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStore.cpp similarity index 79% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStore.cpp index 70ccb9d509..adbf31439a 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStore.cpp @@ -2,30 +2,13 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -// TODO(ector): Tons of pshufb optimization of the loads/stores, for SSSE3+, possibly SSE4, only. -// Should give a very noticable speed boost to paired single heavy code. - #include "Common.h" -#include "Thunk.h" +#include "JitILBase.h" -#include "../PowerPC.h" -#include "../../Core.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "x64ABI.h" - -#include "JitIL.h" -#include "JitILAsm.h" - -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START - -void JitIL::lhax(UGeckoInstruction inst) +void JitILBase::lhax(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitLoadGReg(inst.RB); if (inst.RA) @@ -35,10 +18,10 @@ void JitIL::lhax(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void JitIL::lXz(UGeckoInstruction inst) +void JitILBase::lXz(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16); if (inst.RA) @@ -48,7 +31,7 @@ void JitIL::lXz(UGeckoInstruction inst) IREmitter::InstLoc val; switch (inst.OPCD & ~0x1) { - case 32: val = ibuild.EmitLoad32(addr); break; //lwz + case 32: val = ibuild.EmitLoad32(addr); break; //lwz case 40: val = ibuild.EmitLoad16(addr); break; //lhz case 34: val = ibuild.EmitLoad8(addr); break; //lbz default: PanicAlert("lXz: invalid access size"); val = 0; break; @@ -56,19 +39,20 @@ void JitIL::lXz(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void JitIL::lbzu(UGeckoInstruction inst) { +void JitILBase::lbzu(UGeckoInstruction inst) +{ INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) const IREmitter::InstLoc uAddress = ibuild.EmitAdd(ibuild.EmitLoadGReg(inst.RA), ibuild.EmitIntConst((int)inst.SIMM_16)); const IREmitter::InstLoc temp = ibuild.EmitLoad8(uAddress); ibuild.EmitStoreGReg(temp, inst.RD); ibuild.EmitStoreGReg(uAddress, inst.RA); } -void JitIL::lha(UGeckoInstruction inst) +void JitILBase::lha(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst((s32)(s16)inst.SIMM_16); @@ -79,17 +63,20 @@ void JitIL::lha(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void JitIL::lXzx(UGeckoInstruction inst) +void JitILBase::lXzx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitLoadGReg(inst.RB); - if (inst.RA) { + + if (inst.RA) + { addr = ibuild.EmitAdd(addr, ibuild.EmitLoadGReg(inst.RA)); if (inst.SUBOP10 & 32) ibuild.EmitStoreGReg(addr, inst.RA); } + IREmitter::InstLoc val; switch (inst.SUBOP10 & ~32) { @@ -101,10 +88,10 @@ void JitIL::lXzx(UGeckoInstruction inst) ibuild.EmitStoreGReg(val, inst.RD); } -void JitIL::dcbst(UGeckoInstruction inst) +void JitILBase::dcbst(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) // If the dcbst instruction is preceded by dcbt, it is flushing a prefetched // memory location. Do not invalidate the JIT cache in this case as the memory @@ -117,14 +104,14 @@ void JitIL::dcbst(UGeckoInstruction inst) } // Zero cache line. -void JitIL::dcbz(UGeckoInstruction inst) +void JitILBase::dcbz(UGeckoInstruction inst) { Default(inst); return; // TODO! #if 0 if(Core::g_CoreStartupParameter.bJITOff || Core::g_CoreStartupParameter.bJITLoadStoreOff) - {Default(inst); return;} // turn off from debugger + {Default(inst); return;} // turn off from debugger INSTRUCTION_START; MOV(32, R(EAX), gpr.R(inst.RB)); if (inst.RA) @@ -142,10 +129,10 @@ void JitIL::dcbz(UGeckoInstruction inst) #endif } -void JitIL::stX(UGeckoInstruction inst) +void JitILBase::stX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16), value = ibuild.EmitLoadGReg(inst.RS); @@ -162,10 +149,10 @@ void JitIL::stX(UGeckoInstruction inst) } } -void JitIL::stXx(UGeckoInstruction inst) +void JitILBase::stXx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitLoadGReg(inst.RB), value = ibuild.EmitLoadGReg(inst.RS); @@ -182,10 +169,10 @@ void JitIL::stXx(UGeckoInstruction inst) } // A few games use these heavily in video codecs. (GFZP01 @ 0x80020E18) -void JitIL::lmw(UGeckoInstruction inst) +void JitILBase::lmw(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16); if (inst.RA) @@ -198,10 +185,10 @@ void JitIL::lmw(UGeckoInstruction inst) } } -void JitIL::stmw(UGeckoInstruction inst) +void JitILBase::stmw(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStore) + JITDISABLE(bJITLoadStoreOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16); if (inst.RA) @@ -214,7 +201,7 @@ void JitIL::stmw(UGeckoInstruction inst) } } -void JitIL::icbi(UGeckoInstruction inst) +void JitILBase::icbi(UGeckoInstruction inst) { Default(inst); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStoreFloating.cpp similarity index 71% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStoreFloating.cpp index 8f8297706c..986489cd3f 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStoreFloating.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStoreFloating.cpp @@ -2,34 +2,17 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -// TODO(ector): Tons of pshufb optimization of the loads/stores, for SSSE3+, possibly SSE4, only. -// Should give a very noticable speed boost to paired single heavy code. - #include "Common.h" - -#include "../PowerPC.h" -#include "../../Core.h" // include "Common.h", "CoreParameter.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" -#include "CPUDetect.h" -#include "x64Emitter.h" -#include "x64ABI.h" - -#include "JitIL.h" -#include "JitILAsm.h" - -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START +#include "JitILBase.h" // TODO: Add peephole optimizations for multiple consecutive lfd/lfs/stfd/stfs since they are so common, // and pshufb could help a lot. // Also add hacks for things like lfs/stfs the same reg consecutively, that is, simple memory moves. -void JitIL::lfs(UGeckoInstruction inst) +void JitILBase::lfs(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16), val; if (inst.RA) @@ -40,10 +23,10 @@ void JitIL::lfs(UGeckoInstruction inst) } -void JitIL::lfd(UGeckoInstruction inst) +void JitILBase::lfd(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16), val; if (inst.RA) @@ -55,10 +38,10 @@ void JitIL::lfd(UGeckoInstruction inst) } -void JitIL::stfd(UGeckoInstruction inst) +void JitILBase::stfd(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16), val = ibuild.EmitLoadFReg(inst.RS); @@ -71,10 +54,10 @@ void JitIL::stfd(UGeckoInstruction inst) } -void JitIL::stfs(UGeckoInstruction inst) +void JitILBase::stfs(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_16), val = ibuild.EmitLoadFReg(inst.RS); @@ -88,10 +71,10 @@ void JitIL::stfs(UGeckoInstruction inst) } -void JitIL::stfsx(UGeckoInstruction inst) +void JitILBase::stfsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitLoadGReg(inst.RB), val = ibuild.EmitLoadFReg(inst.RS); @@ -103,10 +86,10 @@ void JitIL::stfsx(UGeckoInstruction inst) } -void JitIL::lfsx(UGeckoInstruction inst) +void JitILBase::lfsx(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStoreFloating) + JITDISABLE(bJITLoadStoreFloatingOff) if (js.memcheck) { Default(inst); return; } IREmitter::InstLoc addr = ibuild.EmitLoadGReg(inst.RB), val; if (inst.RA) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStorePaired.cpp similarity index 69% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStorePaired.cpp index 1ff392d731..9c1e3eb45b 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_LoadStorePaired.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_LoadStorePaired.cpp @@ -3,27 +3,12 @@ // Refer to the license.txt file included. #include "Common.h" +#include "JitILBase.h" -#include "Thunk.h" -#include "../PowerPC.h" -#include "../../Core.h" -#include "../../HW/GPFifo.h" -#include "../../HW/Memmap.h" -#include "../PPCTables.h" -#include "CPUDetect.h" -#include "x64Emitter.h" -#include "x64ABI.h" - -#include "JitIL.h" -#include "JitILAsm.h" - -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START - -void JitIL::psq_st(UGeckoInstruction inst) +void JitILBase::psq_st(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStorePaired) + JITDISABLE(bJITLoadStorePairedOff) if (js.memcheck) { Default(inst); return; } if (inst.W) {Default(inst); return;} IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_12), val; @@ -36,10 +21,10 @@ void JitIL::psq_st(UGeckoInstruction inst) ibuild.EmitStorePaired(val, addr, inst.I); } -void JitIL::psq_l(UGeckoInstruction inst) +void JitILBase::psq_l(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(LoadStorePaired) + JITDISABLE(bJITLoadStorePairedOff) if (js.memcheck) { Default(inst); return; } if (inst.W) {Default(inst); return;} IREmitter::InstLoc addr = ibuild.EmitIntConst(inst.SIMM_12), val; diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Paired.cpp similarity index 86% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Paired.cpp index 671e022b31..7ed65497c7 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_Paired.cpp @@ -3,39 +3,32 @@ // Refer to the license.txt file included. #include "Common.h" +#include "JitILBase.h" -#include "../../Core.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "../../HW/GPFifo.h" - -#include "JitIL.h" - -void JitIL::ps_mr(UGeckoInstruction inst) +void JitILBase::ps_mr(UGeckoInstruction inst) { Default(inst); return; } -void JitIL::ps_sel(UGeckoInstruction inst) +void JitILBase::ps_sel(UGeckoInstruction inst) { Default(inst); return; } -void JitIL::ps_sign(UGeckoInstruction inst) +void JitILBase::ps_sign(UGeckoInstruction inst) { Default(inst); return; } -void JitIL::ps_rsqrte(UGeckoInstruction inst) +void JitILBase::ps_rsqrte(UGeckoInstruction inst) { Default(inst); return; } -void JitIL::ps_arith(UGeckoInstruction inst) +void JitILBase::ps_arith(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc || (inst.SUBOP5 != 21 && inst.SUBOP5 != 20 && inst.SUBOP5 != 25)) { Default(inst); return; } @@ -45,7 +38,7 @@ void JitIL::ps_arith(UGeckoInstruction inst) else rhs = ibuild.EmitCompactMRegToPacked(ibuild.EmitLoadFReg(inst.FB)); val = ibuild.EmitCompactMRegToPacked(val); - + switch (inst.SUBOP5) { case 20: @@ -61,14 +54,14 @@ void JitIL::ps_arith(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void JitIL::ps_sum(UGeckoInstruction inst) +void JitILBase::ps_sum(UGeckoInstruction inst) { // TODO: This operation strikes me as a bit strange... // perhaps we can optimize it depending on the users? - // TODO: ps_sum breaks Sonic Colours (black screen) + // TODO: ps_sum breaks Sonic Colours (black screen) Default(inst); return; INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc || inst.SUBOP5 != 10) { Default(inst); return; } @@ -84,10 +77,10 @@ void JitIL::ps_sum(UGeckoInstruction inst) } -void JitIL::ps_muls(UGeckoInstruction inst) +void JitILBase::ps_muls(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -109,10 +102,10 @@ void JitIL::ps_muls(UGeckoInstruction inst) //TODO: find easy cases and optimize them, do a breakout like ps_arith -void JitIL::ps_mergeXX(UGeckoInstruction inst) +void JitILBase::ps_mergeXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } @@ -122,7 +115,7 @@ void JitIL::ps_mergeXX(UGeckoInstruction inst) switch (inst.SUBOP10) { - case 528: + case 528: val = ibuild.EmitFPMerge00(val, rhs); break; //00 case 560: @@ -142,14 +135,14 @@ void JitIL::ps_mergeXX(UGeckoInstruction inst) } -void JitIL::ps_maddXX(UGeckoInstruction inst) +void JitILBase::ps_maddXX(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(Paired) + JITDISABLE(bJITPairedOff) if (inst.Rc) { Default(inst); return; } - + IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA), op2, op3; val = ibuild.EmitCompactMRegToPacked(val); switch (inst.SUBOP5) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_SystemRegisters.cpp similarity index 82% rename from Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp rename to Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_SystemRegisters.cpp index 0fb9d68f81..93c635839c 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitIL_SystemRegisters.cpp +++ b/Source/Core/Core/Src/PowerPC/JitILCommon/JitILBase_SystemRegisters.cpp @@ -3,25 +3,15 @@ // Refer to the license.txt file included. #include "Common.h" +#include "JitILBase.h" -#include "../../Core.h" -#include "../../CoreTiming.h" #include "../../HW/SystemTimers.h" -#include "../PowerPC.h" -#include "../PPCTables.h" -#include "x64Emitter.h" -#include "x64ABI.h" -#include "Thunk.h" -#include "JitIL.h" -//#define INSTRUCTION_START Default(inst); return; -#define INSTRUCTION_START - -void JitIL::mtspr(UGeckoInstruction inst) +void JitILBase::mtspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); switch(iIndex) { case SPR_TL: @@ -54,10 +44,10 @@ void JitIL::mtspr(UGeckoInstruction inst) } } -void JitIL::mfspr(UGeckoInstruction inst) +void JitILBase::mfspr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F); switch (iIndex) { @@ -91,7 +81,7 @@ void JitIL::mfspr(UGeckoInstruction inst) // ======================================================================================= // Don't interpret this, if we do we get thrown out // -------------- -void JitIL::mtmsr(UGeckoInstruction inst) +void JitILBase::mtmsr(UGeckoInstruction inst) { ibuild.EmitStoreMSR(ibuild.EmitLoadGReg(inst.RS), ibuild.EmitIntConst(js.compilerPC)); ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4)); @@ -99,24 +89,24 @@ void JitIL::mtmsr(UGeckoInstruction inst) // ============== -void JitIL::mfmsr(UGeckoInstruction inst) +void JitILBase::mfmsr(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) ibuild.EmitStoreGReg(ibuild.EmitLoadMSR(), inst.RD); } -void JitIL::mftb(UGeckoInstruction inst) +void JitILBase::mftb(UGeckoInstruction inst) { INSTRUCTION_START; - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) mfspr(inst); } -void JitIL::mfcr(UGeckoInstruction inst) +void JitILBase::mfcr(UGeckoInstruction inst) { INSTRUCTION_START; - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) IREmitter::InstLoc d = ibuild.EmitIntConst(0); for (int i = 0; i < 8; ++i) @@ -127,10 +117,10 @@ void JitIL::mfcr(UGeckoInstruction inst) ibuild.EmitStoreGReg(d, inst.RD); } -void JitIL::mtcrf(UGeckoInstruction inst) +void JitILBase::mtcrf(UGeckoInstruction inst) { INSTRUCTION_START; - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) IREmitter::InstLoc s = ibuild.EmitLoadGReg(inst.RS); for (int i = 0; i < 8; ++i) @@ -145,10 +135,10 @@ void JitIL::mtcrf(UGeckoInstruction inst) } } -void JitIL::mcrf(UGeckoInstruction inst) +void JitILBase::mcrf(UGeckoInstruction inst) { INSTRUCTION_START - JITDISABLE(SystemRegisters) + JITDISABLE(bJITSystemRegistersOff) if (inst.CRFS != inst.CRFD) { @@ -156,7 +146,7 @@ void JitIL::mcrf(UGeckoInstruction inst) } } -void JitIL::crXX(UGeckoInstruction inst) +void JitILBase::crXX(UGeckoInstruction inst) { // Ported from Jit_SystemRegister.cpp @@ -181,12 +171,12 @@ void JitIL::crXX(UGeckoInstruction inst) switch (subop) { case 257: // crand - eax = ibuild.EmitAnd(eax, ecx); + eax = ibuild.EmitAnd(eax, ecx); break; case 129: // crandc ecx = ibuild.EmitNot(ecx); - eax = ibuild.EmitAnd(eax, ecx); + eax = ibuild.EmitAnd(eax, ecx); break; case 289: // creqv diff --git a/Source/Core/Core/Src/PowerPC/JitInterface.cpp b/Source/Core/Core/Src/PowerPC/JitInterface.cpp index 1ca5626b1e..91d43a7792 100644 --- a/Source/Core/Core/Src/PowerPC/JitInterface.cpp +++ b/Source/Core/Core/Src/PowerPC/JitInterface.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #ifdef _WIN32 #include @@ -21,6 +22,8 @@ #ifdef _M_ARM #include "JitArm32/Jit.h" #include "JitArm32/JitArm_Tables.h" +#include "JitArmIL/JitIL.h" +#include "JitArmIL/JitIL_Tables.h" #endif #include "Profiler.h" @@ -40,9 +43,9 @@ namespace JitInterface } CPUCoreBase *InitJitCore(int core) { - bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1; + bFakeVMEM = SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true; bMMU = SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU; - + CPUCoreBase *ptr = NULL; switch(core) { @@ -64,6 +67,11 @@ namespace JitInterface ptr = new JitArm(); break; } + case 4: + { + ptr = new JitArmIL(); + break; + } #endif default: { @@ -99,6 +107,11 @@ namespace JitInterface JitArmTables::InitTables(); break; } + case 4: + { + JitArmILTables::InitTables(); + break; + } #endif default: { @@ -116,7 +129,7 @@ namespace JitInterface { // Can't really do this with no jit core available #ifndef _M_GENERIC - + std::vector stats; stats.reserve(jit->GetBlockCache()->GetNumBlocks()); u64 cost_sum = 0; @@ -150,22 +163,22 @@ namespace JitInterface return; } fprintf(f.GetHandle(), "origAddr\tblkName\tcost\ttimeCost\tpercent\ttimePercent\tOvAllinBlkTime(ms)\tblkCodeSize\n"); - for (unsigned int i = 0; i < stats.size(); i++) + for (auto& stat : stats) { - const JitBlock *block = jit->GetBlockCache()->GetBlock(stats[i].blockNum); + const JitBlock *block = jit->GetBlockCache()->GetBlock(stat.blockNum); if (block) { std::string name = g_symbolDB.GetDescription(block->originalAddress); - double percent = 100.0 * (double)stats[i].cost / (double)cost_sum; - #ifdef _WIN32 + double percent = 100.0 * (double)stat.cost / (double)cost_sum; + #ifdef _WIN32 double timePercent = 100.0 * (double)block->ticCounter / (double)timecost_sum; - fprintf(f.GetHandle(), "%08x\t%s\t%llu\t%llu\t%.2lf\t%llf\t%lf\t%i\n", - block->originalAddress, name.c_str(), stats[i].cost, + fprintf(f.GetHandle(), "%08x\t%s\t%" PRIu64 "\t%" PRIu64 "\t%.2lf\t%llf\t%lf\t%i\n", + block->originalAddress, name.c_str(), stat.cost, block->ticCounter, percent, timePercent, (double)block->ticCounter*1000.0/(double)countsPerSec, block->codeSize); #else - fprintf(f.GetHandle(), "%08x\t%s\t%llu\t???\t%.2lf\t???\t???\t%i\n", - block->originalAddress, name.c_str(), stats[i].cost, percent, block->codeSize); + fprintf(f.GetHandle(), "%08x\t%s\t%" PRIu64 "\t???\t%.2lf\t???\t???\t%i\n", + block->originalAddress, name.c_str(), stat.cost, percent, block->codeSize); #endif } } @@ -175,9 +188,9 @@ namespace JitInterface { return jit->IsInCodeSpace(ptr); } - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx) + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx) { - return jit->BackPatch(codePtr, accessType, em_address, ctx); + return jit->BackPatch(codePtr, em_address, ctx); } void ClearCache() @@ -197,49 +210,9 @@ namespace JitInterface jit->GetBlockCache()->InvalidateICache(address, size); } - - // Memory functions - u32 Read_Opcode_JIT_Uncached(const u32 _Address) - { - u8* iCache; - u32 addr; - if (_Address & JIT_ICACHE_VMEM_BIT) - { - iCache = jit->GetBlockCache()->GetICacheVMEM(); - addr = _Address & JIT_ICACHE_MASK; - } - else if (_Address & JIT_ICACHE_EXRAM_BIT) - { - iCache = jit->GetBlockCache()->GetICacheEx(); - addr = _Address & JIT_ICACHEEX_MASK; - } - else - { - iCache = jit->GetBlockCache()->GetICache(); - addr = _Address & JIT_ICACHE_MASK; - } - u32 inst = *(u32*)(iCache + addr); - if (inst == JIT_ICACHE_INVALID_WORD) - { - u32 cache_block_start = addr & ~0x1f; - u32 mem_block_start = _Address & ~0x1f; - u8 *pMem = Memory::GetPointer(mem_block_start); - memcpy(iCache + cache_block_start, pMem, 32); - inst = *(u32*)(iCache + addr); - } - inst = Common::swap32(inst); - - if ((inst & 0xfc000000) == 0) - { - inst = jit->GetBlockCache()->GetOriginalFirstOp(inst); - } - - return inst; - } - u32 Read_Opcode_JIT(u32 _Address) { - #ifdef FAST_ICACHE + #ifdef FAST_ICACHE if (bMMU && !bFakeVMEM && (_Address & Memory::ADDR_MASK_MEM1)) { _Address = Memory::TranslateAddress(_Address, Memory::FLAG_OPCODE); @@ -248,11 +221,12 @@ namespace JitInterface return 0; } } - u32 inst = 0; + u32 inst; // Bypass the icache for the external interrupt exception handler + // -- this is stupid, should respect HID0 if ( (_Address & 0x0FFFFF00) == 0x00000500 ) - inst = Read_Opcode_JIT_Uncached(_Address); + inst = Memory::ReadUnchecked_U32(_Address); else inst = PowerPC::ppcState.iCache.ReadInstruction(_Address); #else @@ -261,71 +235,6 @@ namespace JitInterface return inst; } - // The following function is deprecated in favour of FAST_ICACHE - u32 Read_Opcode_JIT_LC(const u32 _Address) - { - #ifdef JIT_UNLIMITED_ICACHE - if ((_Address & ~JIT_ICACHE_MASK) != 0x80000000 && (_Address & ~JIT_ICACHE_MASK) != 0x00000000 && - (_Address & ~JIT_ICACHE_MASK) != 0x7e000000 && // TLB area - (_Address & ~JIT_ICACHEEX_MASK) != 0x90000000 && (_Address & ~JIT_ICACHEEX_MASK) != 0x10000000) - { - PanicAlertT("iCacheJIT: Reading Opcode from %x. Please report.", _Address); - ERROR_LOG(MEMMAP, "iCacheJIT: Reading Opcode from %x. Please report.", _Address); - return 0; - } - u8* iCache; - u32 addr; - if (_Address & JIT_ICACHE_VMEM_BIT) - { - iCache = jit->GetBlockCache()->GetICacheVMEM(); - addr = _Address & JIT_ICACHE_MASK; - } - else if (_Address & JIT_ICACHE_EXRAM_BIT) - { - iCache = jit->GetBlockCache()->GetICacheEx(); - addr = _Address & JIT_ICACHEEX_MASK; - } - else - { - iCache = jit->GetBlockCache()->GetICache(); - addr = _Address & JIT_ICACHE_MASK; - } - u32 inst = *(u32*)(iCache + addr); - if (inst == JIT_ICACHE_INVALID_WORD) - inst = Memory::ReadUnchecked_U32(_Address); - else - inst = Common::swap32(inst); - #else - u32 inst = Memory::ReadUnchecked_U32(_Address); - #endif - if ((inst & 0xfc000000) == 0) - { - inst = jit->GetBlockCache()->GetOriginalFirstOp(inst); - } - return inst; - } - - // WARNING! No checks! - // We assume that _Address is cached - void Write_Opcode_JIT(const u32 _Address, const u32 _Value) - { - #ifdef JIT_UNLIMITED_ICACHE - if (_Address & JIT_ICACHE_VMEM_BIT) - { - *(u32*)(jit->GetBlockCache()->GetICacheVMEM() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); - } - else if (_Address & JIT_ICACHE_EXRAM_BIT) - { - *(u32*)(jit->GetBlockCache()->GetICacheEx() + (_Address & JIT_ICACHEEX_MASK)) = Common::swap32(_Value); - } - else - *(u32*)(jit->GetBlockCache()->GetICache() + (_Address & JIT_ICACHE_MASK)) = Common::swap32(_Value); - #else - Memory::WriteUnchecked_U32(_Value, _Address); - #endif - } - - void Shutdown() { if (jit) diff --git a/Source/Core/Core/Src/PowerPC/JitInterface.h b/Source/Core/Core/Src/PowerPC/JitInterface.h index bf5d750a1f..288330c707 100644 --- a/Source/Core/Core/Src/PowerPC/JitInterface.h +++ b/Source/Core/Core/Src/PowerPC/JitInterface.h @@ -8,7 +8,7 @@ namespace JitInterface { void DoState(PointerWrap &p); - + CPUCoreBase *InitJitCore(int core); void InitTables(int core); CPUCoreBase *GetCore(); @@ -18,21 +18,18 @@ namespace JitInterface // Memory Utilities bool IsInCodeSpace(u8 *ptr); - const u8 *BackPatch(u8 *codePtr, int accessType, u32 em_address, void *ctx); + const u8 *BackPatch(u8 *codePtr, u32 em_address, void *ctx); // used by JIT to read instructions u32 Read_Opcode_JIT(const u32 _Address); - // used by JIT. uses iCacheJIT. Reads in the "Locked cache" mode - u32 Read_Opcode_JIT_LC(const u32 _Address); - void Write_Opcode_JIT(const u32 _Address, const u32 _Value); // Clearing CodeCache void ClearCache(); - + void ClearSafe(); void InvalidateICache(u32 address, u32 size); - + void Shutdown(); } extern bool bFakeVMEM; diff --git a/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp b/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp index 8299bc0b82..eb398539d9 100644 --- a/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCAnalyst.cpp @@ -86,8 +86,8 @@ bool AnalyzeFunction(u32 startAddr, Symbol &func, int max_size) func.callers.clear(); func.size = 0; func.flags = FFLAG_LEAF; - u32 addr = startAddr; - + u32 addr = startAddr; + u32 farthestInternalBranchTarget = startAddr; int numInternalBranches = 0; while (true) @@ -95,7 +95,7 @@ bool AnalyzeFunction(u32 startAddr, Symbol &func, int max_size) func.size += 4; if (func.size >= CODEBUFFER_SIZE * 4) //weird return false; - + UGeckoInstruction instr = (UGeckoInstruction)Memory::ReadUnchecked_U32(addr); if (max_size && func.size > max_size) { @@ -153,12 +153,12 @@ bool AnalyzeFunction(u32 startAddr, Symbol &func, int max_size) func.flags &= ~FFLAG_LEAF; func.flags |= FFLAG_RFI; } - else + else { if (instr.OPCD == 16) { u32 target = SignExt16(instr.BD << 2); - + if (!instr.AA) target += addr; @@ -196,9 +196,8 @@ void AnalyzeFunction2(Symbol *func) u32 flags = func->flags; bool nonleafcall = false; - for (size_t i = 0; i < func->calls.size(); i++) + for (auto c : func->calls) { - SCall c = func->calls[i]; Symbol *called_func = g_symbolDB.GetSymbolFromAddr(c.function); if (called_func && (called_func->flags & FFLAG_LEAF) == 0) { @@ -250,7 +249,7 @@ bool CanSwapAdjacentOps(const CodeOp &a, const CodeOp &b) { int regInA = a.regsIn[j]; int regInB = b.regsIn[j]; - if (regInA >= 0 && + if (regInA >= 0 && (b.regsOut[0] == regInA || b.regsOut[1] == regInA)) { @@ -284,7 +283,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, size_of_merged_addresses = 1; memset(st, 0, sizeof(*st)); - + // Disabled the following optimization in preference of FAST_ICACHE //UGeckoInstruction previnst = Memory::Read_Opcode_JIT_LC(address - 4); //if (previnst.hex == 0x4e800020) @@ -292,7 +291,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, gpa->any = true; fpa->any = false; - + for (int i = 0; i < 32; i++) { gpa->firstRead[i] = -1; @@ -345,10 +344,9 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, if (it != inserted_asm_codes.end()) { const std::vector& codes = it->second; - for (std::vector::const_iterator itCur = codes.begin(), - itEnd = codes.end(); itCur != itEnd; ++itCur) + for (u32 c : codes) { - cst1_instructions.push(*itCur); + cst1_instructions.push(c); } inst = UGeckoInstruction(cst1_instructions.front()); cst1_instructions.pop(); @@ -359,7 +357,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, inst = JitInterface::Read_Opcode_JIT(address); } } - + if (inst.hex != 0) { num_inst++; @@ -449,7 +447,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, code[i].fregsIn[j] = -1; code[i].fregOut = -1; - switch (opinfo->type) + switch (opinfo->type) { case OPTYPE_INTEGER: case OPTYPE_LOAD: @@ -578,7 +576,7 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, // A broken block is a block that does not end in a branch broken_block = true; } - + // Scan for CR0 dependency // assume next block wants CR0 to be safe bool wantsCR0 = true; @@ -607,9 +605,9 @@ u32 Flatten(u32 address, int *realsize, BlockStats *st, BlockRegStats *gpa, // Most functions that are relevant to analyze should be -// called by another function. Therefore, let's scan the +// called by another function. Therefore, let's scan the // entire space for bl operations and find what functions -// get called. +// get called. void FindFunctionsFromBranches(u32 startAddr, u32 endAddr, SymbolDB *func_db) { for (u32 addr = startAddr; addr < endAddr; addr+=4) @@ -648,14 +646,13 @@ void FindFunctionsAfterBLR(PPCSymbolDB *func_db) for (PPCSymbolDB::XFuncMap::iterator iter = func_db->GetIterator(); iter != func_db->End(); ++iter) funcAddrs.push_back(iter->second.address + iter->second.size); - for (vector::iterator iter = funcAddrs.begin(); iter != funcAddrs.end(); ++iter) + for (auto location : funcAddrs) { - u32 location = *iter; while (true) { if (PPCTables::IsValidInstruction(Memory::Read_Instruction(location))) { - //check if this function is already mapped + //check if this function is already mapped Symbol *f = func_db->AddFunction(location); if (!f) break; @@ -674,7 +671,7 @@ void FindFunctions(u32 startAddr, u32 endAddr, PPCSymbolDB *func_db) FindFunctionsFromBranches(startAddr, endAddr, func_db); FindFunctionsAfterBLR(func_db); - //Step 2: + //Step 2: func_db->FillInCallers(); int numLeafs = 0, numNice = 0, numUnNice = 0; @@ -719,7 +716,7 @@ void FindFunctions(u32 startAddr, u32 endAddr, PPCSymbolDB *func_db) if ((f.flags & FFLAG_STRAIGHT) && (f.flags & FFLAG_LEAF)) numStraightLeaf++; } - if (numLeafs == 0) + if (numLeafs == 0) leafSize = 0; else leafSize /= numLeafs; diff --git a/Source/Core/Core/Src/PowerPC/PPCAnalyst.h b/Source/Core/Core/Src/PowerPC/PPCAnalyst.h index e184486f3e..db7a52c812 100644 --- a/Source/Core/Core/Src/PowerPC/PPCAnalyst.h +++ b/Source/Core/Core/Src/PowerPC/PPCAnalyst.h @@ -5,13 +5,14 @@ #ifndef _PPCANALYST_H #define _PPCANALYST_H +#include #include #include +#include #include #include "Common.h" -#include "Gekko.h" #include "PPCTables.h" class PPCSymbolDB; @@ -62,8 +63,8 @@ struct BlockRegStats int GetTotalNumAccesses(int reg) {return numReads[reg] + numWrites[reg];} int GetUseRange(int reg) { - return max(lastRead[reg], lastWrite[reg]) - - min(firstRead[reg], firstWrite[reg]);} + return std::max(lastRead[reg], lastWrite[reg]) - + std::min(firstRead[reg], firstWrite[reg]);} inline void SetInputRegister(int reg, short opindex) { if (firstRead[reg] == -1) diff --git a/Source/Core/Core/Src/PowerPC/PPCCache.cpp b/Source/Core/Core/Src/PowerPC/PPCCache.cpp index 4ead232b18..0785e37943 100644 --- a/Source/Core/Core/Src/PowerPC/PPCCache.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCCache.cpp @@ -73,7 +73,7 @@ namespace PowerPC memset(tags, 0, sizeof(tags)); memset(way_from_valid, 0, sizeof(way_from_valid)); memset(way_from_plru, 0, sizeof(way_from_plru)); - + Reset(); } @@ -100,7 +100,7 @@ namespace PowerPC } u32 InstructionCache::ReadInstruction(u32 addr) - { + { if (!HID0.ICE) // instruction cache is disabled return Memory::ReadUnchecked_U32(addr); u32 set = (addr >> 5) & 0x7f; diff --git a/Source/Core/Core/Src/PowerPC/PPCCache.h b/Source/Core/Core/Src/PowerPC/PPCCache.h index 21ff0f64d5..b2ff2471e3 100644 --- a/Source/Core/Core/Src/PowerPC/PPCCache.h +++ b/Source/Core/Core/Src/PowerPC/PPCCache.h @@ -5,7 +5,7 @@ #ifndef _PPCCACHE_H #define _PPCCACHE_H -#include "Common.h" +#include "CommonTypes.h" #define FAST_ICACHE diff --git a/Source/Core/Core/Src/PowerPC/PPCSymbolDB.cpp b/Source/Core/Core/Src/PowerPC/PPCSymbolDB.cpp index e9f821eeed..37621388fe 100644 --- a/Source/Core/Core/Src/PowerPC/PPCSymbolDB.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCSymbolDB.cpp @@ -94,10 +94,10 @@ Symbol *PPCSymbolDB::GetSymbolFromAddr(u32 addr) } else { - for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) + for (auto& p : functions) { - if (addr >= iter->second.address && addr < iter->second.address + iter->second.size) - return &iter->second; + if (addr >= p.second.address && addr < p.second.address + p.second.size) + return &p.second; } } return 0; @@ -114,18 +114,18 @@ const char *PPCSymbolDB::GetDescription(u32 addr) void PPCSymbolDB::FillInCallers() { - for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) + for (auto& p : functions) { - iter->second.callers.clear(); + p.second.callers.clear(); } for (XFuncMap::iterator iter = functions.begin(); iter != functions.end(); ++iter) { Symbol &f = iter->second; - for (size_t i = 0; i < f.calls.size(); i++) + for (auto& call : f.calls) { - SCall NewCall(iter->first, f.calls[i].callAddress); - u32 FunctionAddress = f.calls[i].function; + SCall NewCall(iter->first, call.callAddress); + u32 FunctionAddress = call.function; XFuncMap::iterator FuncIterator = functions.find(FunctionAddress); if (FuncIterator != functions.end()) @@ -306,7 +306,7 @@ bool PPCSymbolDB::SaveMap(const char *filename, bool WithCodes) const { // Get the current and next address LastAddress = rSymbol.address; - LastSymbolName = rSymbol.name; + LastSymbolName = rSymbol.name; ++itr; /* To make nice straight lines we fill out the name with spaces, we also cut off @@ -326,7 +326,7 @@ bool PPCSymbolDB::SaveMap(const char *filename, bool WithCodes) const space = itr->second.address - LastAddress; else space = 0; - + for (int i = 0; i < space; i += 4) { int Address = LastAddress + i; diff --git a/Source/Core/Core/Src/PowerPC/PPCSymbolDB.h b/Source/Core/Core/Src/PowerPC/PPCSymbolDB.h index 40d606ae97..27b80eb683 100644 --- a/Source/Core/Core/Src/PowerPC/PPCSymbolDB.h +++ b/Source/Core/Core/Src/PowerPC/PPCSymbolDB.h @@ -2,7 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" +#include "CommonTypes.h" #include #include @@ -19,14 +19,14 @@ private: public: typedef void (*functionGetterCallback)(Symbol *f); - + PPCSymbolDB(); ~PPCSymbolDB(); - Symbol *AddFunction(u32 startAddr); + Symbol *AddFunction(u32 startAddr) override; void AddKnownSymbol(u32 startAddr, u32 size, const char *name, int type = Symbol::SYMBOL_FUNCTION); - Symbol *GetSymbolFromAddr(u32 addr); + Symbol *GetSymbolFromAddr(u32 addr) override; const char *GetDescription(u32 addr); diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.cpp b/Source/Core/Core/Src/PowerPC/PPCTables.cpp index 6599a58d4f..5854f1f0da 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCTables.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Common.h" #include "PPCTables.h" @@ -13,24 +14,15 @@ #include "Interpreter/Interpreter_Tables.h" #include "JitInterface.h" -struct op_inf -{ - const char *name; - int count; - bool operator < (const op_inf &o) const - { - return count > o.count; - } -}; - GekkoOPInfo *m_infoTable[64]; - GekkoOPInfo *m_infoTable4[1024]; - GekkoOPInfo *m_infoTable19[1024]; - GekkoOPInfo *m_infoTable31[1024]; - GekkoOPInfo *m_infoTable59[32]; - GekkoOPInfo *m_infoTable63[1024]; +GekkoOPInfo *m_infoTable[64]; +GekkoOPInfo *m_infoTable4[1024]; +GekkoOPInfo *m_infoTable19[1024]; +GekkoOPInfo *m_infoTable31[1024]; +GekkoOPInfo *m_infoTable59[32]; +GekkoOPInfo *m_infoTable63[1024]; - GekkoOPInfo *m_allInstructions[512]; - int m_numInstructions; +GekkoOPInfo *m_allInstructions[512]; +int m_numInstructions; GekkoOPInfo *GetOpInfo(UGeckoInstruction _inst) { @@ -38,7 +30,7 @@ GekkoOPInfo *GetOpInfo(UGeckoInstruction _inst) if ((info->type & 0xFFFFFF) == OPTYPE_SUBTABLE) { int table = info->type>>24; - switch(table) + switch(table) { case 4: return m_infoTable4[_inst.SUBOP10]; case 19: return m_infoTable19[_inst.SUBOP10]; @@ -67,7 +59,7 @@ Interpreter::_interpreterInstruction GetInterpreterOp(UGeckoInstruction _inst) if ((info->type & 0xFFFFFF) == OPTYPE_SUBTABLE) { int table = info->type>>24; - switch(table) + switch(table) { case 4: return Interpreter::m_opTable4[_inst.SUBOP10]; case 19: return Interpreter::m_opTable19[_inst.SUBOP10]; @@ -181,26 +173,34 @@ void CountInstruction(UGeckoInstruction _inst) { GekkoOPInfo *info = GetOpInfo(_inst); if (info) + { info->runCount++; + } } void PrintInstructionRunCounts() { - std::vector temp; - for (int i = 0; i < m_numInstructions; i++) + typedef std::pair OpInfo; + std::vector temp; + temp.reserve(m_numInstructions); + for (int i = 0; i < m_numInstructions; ++i) { - op_inf x; - x.name = m_allInstructions[i]->opname; - x.count = m_allInstructions[i]->runCount; - temp.push_back(x); + GekkoOPInfo *pInst = m_allInstructions[i]; + temp.emplace_back(pInst->opname, pInst->runCount); } - std::sort(temp.begin(), temp.end()); - for (int i = 0; i < m_numInstructions; i++) + std::sort(temp.begin(), temp.end(), + [](const OpInfo &a, const OpInfo &b) + { + return a.second > b.second; + }); + + for (auto &inst : temp) { - if (temp[i].count == 0) + if (inst.second == 0) break; - DEBUG_LOG(POWERPC, "%s : %i", temp[i].name,temp[i].count); - //PanicAlert("%s : %i", temp[i].name,temp[i].count); + + DEBUG_LOG(POWERPC, "%s : %llu", inst.first, inst.second); + //PanicAlert("%s : %llu", inst.first, inst.second); } } @@ -211,28 +211,30 @@ void LogCompiledInstructions() File::IOFile f(StringFromFormat("%sinst_log%i.txt", File::GetUserPath(D_LOGS_IDX).c_str(), time), "w"); for (int i = 0; i < m_numInstructions; i++) { - if (m_allInstructions[i]->compileCount > 0) + GekkoOPInfo *pInst = m_allInstructions[i]; + if (pInst->compileCount > 0) { - fprintf(f.GetHandle(), "%s\t%i\t%lld\t%08x\n", m_allInstructions[i]->opname, - m_allInstructions[i]->compileCount, m_allInstructions[i]->runCount, m_allInstructions[i]->lastUse); + fprintf(f.GetHandle(), "%s\t%i\t%" PRId64 "\t%08x\n", pInst->opname, + pInst->compileCount, pInst->runCount, pInst->lastUse); } } f.Open(StringFromFormat("%sinst_not%i.txt", File::GetUserPath(D_LOGS_IDX).c_str(), time), "w"); for (int i = 0; i < m_numInstructions; i++) { - if (m_allInstructions[i]->compileCount == 0) + GekkoOPInfo *pInst = m_allInstructions[i]; + if (pInst->compileCount == 0) { - fprintf(f.GetHandle(), "%s\t%i\t%lld\n", m_allInstructions[i]->opname, - m_allInstructions[i]->compileCount, m_allInstructions[i]->runCount); + fprintf(f.GetHandle(), "%s\t%i\t%" PRId64 "\n", pInst->opname, + pInst->compileCount, pInst->runCount); } } #ifdef OPLOG f.Open(StringFromFormat("%s" OP_TO_LOG "_at.txt", File::GetUserPath(D_LOGS_IDX).c_str(), time), "w"); - for (size_t i = 0; i < rsplocations.size(); i++) + for (auto& rsplocation : rsplocations) { - fprintf(f.GetHandle(), OP_TO_LOG ": %08x\n", rsplocations[i]); + fprintf(f.GetHandle(), OP_TO_LOG ": %08x\n", rsplocation); } #endif diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.h b/Source/Core/Core/Src/PowerPC/PPCTables.h index 4a32f5515c..6da82a953e 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.h +++ b/Source/Core/Core/Src/PowerPC/PPCTables.h @@ -10,7 +10,7 @@ enum { - FL_SET_CR0 = (1<<0), // + FL_SET_CR0 = (1<<0), // FL_SET_CR1 = (1<<1), // FL_SET_CRn = (1<<2), // FL_SET_CRx = FL_SET_CR0 | FL_SET_CR1 | FL_SET_CRn, // diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.cpp b/Source/Core/Core/Src/PowerPC/PowerPC.cpp index b082960175..2401f0bb65 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.cpp +++ b/Source/Core/Core/Src/PowerPC/PowerPC.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include - #include "Common.h" #include "Atomic.h" #include "MathUtil.h" @@ -121,7 +119,6 @@ void Init(int cpu_core) memset(ppcState.sr, 0, sizeof(ppcState.sr)); ppcState.DebugCount = 0; ppcState.dtlb_last = 0; - ppcState.dtlb_last = 0; memset(ppcState.dtlb_va, 0, sizeof(ppcState.dtlb_va)); memset(ppcState.dtlb_pa, 0, sizeof(ppcState.dtlb_pa)); ppcState.itlb_last = 0; @@ -202,7 +199,7 @@ void SetMode(CoreMode new_mode) } } -void SingleStep() +void SingleStep() { cpu_core_base->SingleStep(); } @@ -345,7 +342,7 @@ void CheckExceptions() INFO_LOG(POWERPC, "EXCEPTION_PROGRAM"); Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_PROGRAM); - } + } else if (exceptions & EXCEPTION_SYSCALL) { SRR0 = NPC; @@ -358,7 +355,7 @@ void CheckExceptions() Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_SYSCALL); } else if (exceptions & EXCEPTION_FPU_UNAVAILABLE) - { + { //This happens a lot - Gamecube OS uses deferred FPU context switching SRR0 = PC; // re-execute the instruction SRR1 = MSR & 0x87C0FFFF; @@ -380,7 +377,7 @@ void CheckExceptions() INFO_LOG(POWERPC, "EXCEPTION_DSI"); Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_DSI); - } + } else if (exceptions & EXCEPTION_ALIGNMENT) { //This never happens ATM diff --git a/Source/Core/Core/Src/PowerPC/PowerPC.h b/Source/Core/Core/Src/PowerPC/PowerPC.h index 82c912d213..a5c2bac0d5 100644 --- a/Source/Core/Core/Src/PowerPC/PowerPC.h +++ b/Source/Core/Core/Src/PowerPC/PowerPC.h @@ -51,7 +51,7 @@ struct GC_ALIGNED64(PowerPCState) u32 sr[16]; // Segment registers. u32 DebugCount; - + // special purpose registers - controls quantizers, DMA, and lots of other misc extensions. // also for power management, but we don't care about that. u32 spr[1024]; @@ -90,7 +90,7 @@ void DoState(PointerWrap &p); CoreMode GetMode(); void SetMode(CoreMode _coreType); -void SingleStep(); +void SingleStep(); void CheckExceptions(); void CheckExternalExceptions(); void CheckBreakPoints(); @@ -130,7 +130,7 @@ void UpdatePerformanceMonitor(u32 cycles, u32 num_load_stores, u32 num_fp_inst); #define rDEC PowerPC::ppcState.spr[SPR_DEC] #define SRR0 PowerPC::ppcState.spr[SPR_SRR0] #define SRR1 PowerPC::ppcState.spr[SPR_SRR1] -#define SPRG0 PowerPC::ppcState.spr[SPR_SPRG0] +#define SPRG0 PowerPC::ppcState.spr[SPR_SPRG0] #define SPRG1 PowerPC::ppcState.spr[SPR_SPRG1] #define SPRG2 PowerPC::ppcState.spr[SPR_SPRG2] #define SPRG3 PowerPC::ppcState.spr[SPR_SPRG3] diff --git a/Source/Core/Core/Src/PowerPC/Profiler.h b/Source/Core/Core/Src/PowerPC/Profiler.h index b15d911a97..d70483b2de 100644 --- a/Source/Core/Core/Src/PowerPC/Profiler.h +++ b/Source/Core/Core/Src/PowerPC/Profiler.h @@ -13,7 +13,7 @@ LEA(32, EAX, M(pt)); PUSH(EAX); \ CALL(QueryPerformanceCounter) // TODO: r64 way -// asm write : (u64) dt += t1-t0 +// asm write : (u64) dt += t1-t0 #define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) \ MOV(32, R(EAX), M(pt1)); \ SUB(32, R(EAX), M(pt0)); \ @@ -30,16 +30,16 @@ #else -#define PROFILER_QUERY_PERFORMANCE_COUNTER(pt) -#define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) +#define PROFILER_QUERY_PERFORMANCE_COUNTER(pt) +#define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) #define PROFILER_VPUSH #define PROFILER_VPOP #endif #else // TODO -#define PROFILER_QUERY_PERFORMANCE_COUNTER(pt) -#define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) +#define PROFILER_QUERY_PERFORMANCE_COUNTER(pt) +#define PROFILER_ADD_DIFF_LARGE_INTEGER(pdt, pt1, pt0) #define PROFILER_VPUSH #define PROFILER_VPOP #endif diff --git a/Source/Core/Core/Src/PowerPC/SignatureDB.cpp b/Source/Core/Core/Src/PowerPC/SignatureDB.cpp index 1292f1e6c3..4e91499306 100644 --- a/Source/Core/Core/Src/PowerPC/SignatureDB.cpp +++ b/Source/Core/Core/Src/PowerPC/SignatureDB.cpp @@ -114,7 +114,7 @@ void SignatureDB::Apply(PPCSymbolDB *symbol_db) function->name = iter->second.name; INFO_LOG(OSHLE, "Found %s at %08x (size: %08x)!", iter->second.name.c_str(), function->address, function->size); } - else + else { function->name = iter->second.name; ERROR_LOG(OSHLE, "Wrong size! Found %s at %08x (size: %08x instead of %08x)!", iter->second.name.c_str(), function->address, function->size, iter->second.size); @@ -142,18 +142,18 @@ void SignatureDB::Initialize(PPCSymbolDB *symbol_db, const char *prefix) /*static*/ u32 SignatureDB::ComputeCodeChecksum(u32 offsetStart, u32 offsetEnd) { u32 sum = 0; - for (u32 offset = offsetStart; offset <= offsetEnd; offset += 4) + for (u32 offset = offsetStart; offset <= offsetEnd; offset += 4) { u32 opcode = Memory::Read_Instruction(offset); - u32 op = opcode & 0xFC000000; + u32 op = opcode & 0xFC000000; u32 op2 = 0; u32 op3 = 0; u32 auxop = op >> 26; - switch (auxop) + switch (auxop) { case 4: //PS instructions op2 = opcode & 0x0000003F; - switch ( op2 ) + switch ( op2 ) { case 0: case 8: @@ -174,7 +174,7 @@ void SignatureDB::Initialize(PPCSymbolDB *symbol_db, const char *prefix) case 15: op2 = opcode & 0x03FF0000; break; - + case 19: // MCRF?? case 31: //integer case 63: //fpu @@ -190,7 +190,7 @@ void SignatureDB::Initialize(PPCSymbolDB *symbol_db, const char *prefix) op2 = opcode & 0x03FF0000; break; } - // Checksum only uses opcode, not opcode data, because opcode data changes + // Checksum only uses opcode, not opcode data, because opcode data changes // in all compilations, but opcodes don't! sum = ( ( (sum << 17 ) & 0xFFFE0000 ) | ( (sum >> 15) & 0x0001FFFF ) ); sum = sum ^ (op | op2 | op3); diff --git a/Source/Core/Core/Src/PowerPC/SignatureDB.h b/Source/Core/Core/Src/PowerPC/SignatureDB.h index 181a76ce38..c2e83dca83 100644 --- a/Source/Core/Core/Src/PowerPC/SignatureDB.h +++ b/Source/Core/Core/Src/PowerPC/SignatureDB.h @@ -2,7 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" +#include "CommonTypes.h" #include #include @@ -36,7 +36,7 @@ public: void Clean(const char *prefix); void Clear(); void List(); - + void Initialize(PPCSymbolDB *func_db, const char *prefix = ""); void Apply(PPCSymbolDB *func_db); diff --git a/Source/Core/Core/Src/State.cpp b/Source/Core/Core/Src/State.cpp index 24647c143a..f33003fdb1 100644 --- a/Source/Core/Core/Src/State.cpp +++ b/Source/Core/Core/Src/State.cpp @@ -135,7 +135,7 @@ void SaveToBuffer(std::vector& buffer) DoState(p); const size_t buffer_size = reinterpret_cast(ptr); buffer.resize(buffer_size); - + ptr = &buffer[0]; p.SetMode(PointerWrap::MODE_WRITE); DoState(p); @@ -160,9 +160,9 @@ int GetEmptySlot(std::map m) for (int i = 1; i <= (int)NUM_STATES; i++) { bool found = false; - for (std::map::iterator it = m.begin(); it != m.end(); it++) + for (auto& p : m) { - if (it->second == i) + if (p.second == i) { found = true; break; @@ -227,7 +227,7 @@ void CompressAndDumpState(CompressAndDumpState_args save_args) if (!File::Rename(filename, File::GetUserPath(D_STATESAVES_IDX) + "lastState.sav")) Core::DisplayMessage("Failed to move previous state to state undo backup", 1000); - else + else File::Rename(filename + ".dtm", File::GetUserPath(D_STATESAVES_IDX) + "lastState.sav.dtm"); } @@ -247,7 +247,7 @@ void CompressAndDumpState(CompressAndDumpState_args save_args) // Setting up the header StateHeader header; memcpy(header.gameID, SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID().c_str(), 6); - header.size = g_use_compression ? buffer_size : 0; + header.size = g_use_compression ? (u32)buffer_size : 0; header.time = Common::Timer::GetDoubleTime(); f.WriteArray(&header, 1); @@ -261,9 +261,13 @@ void CompressAndDumpState(CompressAndDumpState_args save_args) lzo_uint out_len = 0; if ((i + IN_LEN) >= buffer_size) - cur_len = buffer_size - i; + { + cur_len = (lzo_uint32)(buffer_size - i); + } else + { cur_len = IN_LEN; + } if (lzo1x_1_compress(buffer_data + i, cur_len, out, &out_len, wrkmem) != LZO_E_OK) PanicAlertT("Internal LZO Error - compression failed"); @@ -360,8 +364,8 @@ void LoadFileStateData(const std::string& filename, std::vector& ret_data) StateHeader header; f.ReadArray(&header, 1); - - if (memcmp(SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID().c_str(), header.gameID, 6)) + + if (memcmp(SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID().c_str(), header.gameID, 6)) { Core::DisplayMessage(StringFromFormat("State belongs to a different game (ID %.*s)", 6, header.gameID), 2000); @@ -394,7 +398,7 @@ void LoadFileStateData(const std::string& filename, std::vector& ret_data) "Try loading the state again", res, i, new_len); return; } - + i += new_len; } } @@ -437,9 +441,9 @@ void LoadAs(const std::string& filename) std::lock_guard lk(g_cs_undo_load_buffer); SaveToBuffer(g_undo_load_buffer); if (Movie::IsRecordingInput() || Movie::IsPlayingInput()) - Movie::SaveRecording("undo.dtm"); - else if (File::Exists("undo.dtm")) - File::Delete("undo.dtm"); + Movie::SaveRecording((File::GetUserPath(D_STATESAVES_IDX) + "undo.dtm").c_str()); + else if (File::Exists(File::GetUserPath(D_STATESAVES_IDX) +"undo.dtm")) + File::Delete(File::GetUserPath(D_STATESAVES_IDX) + "undo.dtm"); } bool loaded = false; @@ -612,11 +616,11 @@ void UndoLoadState() std::lock_guard lk(g_cs_undo_load_buffer); if (!g_undo_load_buffer.empty()) { - if (File::Exists("undo.dtm") || (!Movie::IsRecordingInput() && !Movie::IsPlayingInput())) + if (File::Exists(File::GetUserPath(D_STATESAVES_IDX) + "undo.dtm") || (!Movie::IsRecordingInput() && !Movie::IsPlayingInput())) { LoadFromBuffer(g_undo_load_buffer); if (Movie::IsRecordingInput() || Movie::IsPlayingInput()) - Movie::LoadInput("undo.dtm"); + Movie::LoadInput((File::GetUserPath(D_STATESAVES_IDX) + "undo.dtm").c_str()); } else { diff --git a/Source/Core/Core/Src/VolumeHandler.cpp b/Source/Core/Core/Src/VolumeHandler.cpp index 19058cd354..5ceba836e5 100644 --- a/Source/Core/Core/Src/VolumeHandler.cpp +++ b/Source/Core/Core/Src/VolumeHandler.cpp @@ -15,7 +15,7 @@ DiscIO::IVolume *GetVolume() return g_pVolume; } -void EjectVolume() +void EjectVolume() { if (g_pVolume) { diff --git a/Source/Core/Core/Src/ec_wii.cpp b/Source/Core/Core/Src/ec_wii.cpp new file mode 100644 index 0000000000..1cd82657a8 --- /dev/null +++ b/Source/Core/Core/Src/ec_wii.cpp @@ -0,0 +1,191 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// Based off of twintig http://git.infradead.org/?p=users/segher/wii.git +// Copyright 2007,2008 Segher Boessenkool +// Licensed under the terms of the GNU GPL, version 2 +// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + +#include +#include +#include "Common.h" +#include "polarssl/sha1.h" +#include "Crypto/tools.h" +#include "FileUtil.h" +#include "ec_wii.h" + +static u32 default_NG_id = 0x0403AC68; +static u32 default_NG_key_id = 0x6AAB8C59; + +static u8 default_NG_priv[] = { + 0x00, 0xAB, 0xEE, 0xC1, 0xDD, 0xB4, 0xA6, 0x16, 0x6B, 0x70, 0xFD, 0x7E, 0x56, 0x67, 0x70, + 0x57, 0x55, 0x27, 0x38, 0xA3, 0x26, 0xC5, 0x46, 0x16, 0xF7, 0x62, 0xC9, 0xED, 0x73, 0xF2, +}; + +static u8 default_NG_sig[] = { + // R + 0x00, 0xD8, 0x81, 0x63, 0xB2, 0x00, 0x6B, 0x0B, 0x54, 0x82, 0x88, 0x63, 0x81, 0x1C, 0x00, + 0x71, 0x12, 0xED, 0xB7, 0xFD, 0x21, 0xAB, 0x0E, 0x50, 0x0E, 0x1F, 0xBF, 0x78, 0xAD, 0x37, + // S + 0x00, 0x71, 0x8D, 0x82, 0x41, 0xEE, 0x45, 0x11, 0xC7, 0x3B, 0xAC, 0x08, 0xB6, 0x83, 0xDC, + 0x05, 0xB8, 0xA8, 0x90, 0x1F, 0xA8, 0x2A, 0x0E, 0x4E, 0x76, 0xEF, 0x44, 0x72, 0x99, 0xF8, +}; + + +// get_ng_cert + +// ng_cert_out is a pointer to a 0x180 byte buffer that will contain the device-unique certificate +// NG_id is the device-unique id to use +// NG_key_id is the device-unique key_id to use +// NG_priv is the device-unique private key to use +// NG_sig is the device-unique signature blob (from issuer) to use +// if NG_priv iis NULL or NG_sig is NULL or NG_id is 0 or NG_key_id is 0, default values +// will be used for all of them +void get_ng_cert(u8* ng_cert_out, u32 NG_id, u32 NG_key_id, const u8* NG_priv, const u8* NG_sig) +{ + char name[64]; + if ((NG_id==0)||(NG_key_id==0)||(NG_priv==NULL)||(NG_sig==NULL)) + { + NG_id = default_NG_id; + NG_key_id = default_NG_key_id; + NG_priv = default_NG_priv; + NG_sig = default_NG_sig; + } + + sprintf(name, "NG%08x", NG_id); + make_blanksig_ec_cert(ng_cert_out, "Root-CA00000001-MS00000002", name, NG_priv, NG_key_id); + memcpy(ng_cert_out + 4, NG_sig, 60); +} + + +// get_ap_sig_and_cert + +// sig_out is a pointer to a 0x3c byte buffer which will be filled with the data payload's signature +// ap_cert_out is a pointer to a 0x180 byte buffer which will be filled with the temporal AP certificate +// title_id is the title responsible for the signing +// data is a pointer to the buffer of data to sign +// data_size is the length of the buffer +// NG_priv is the device-unique private key to use +// NG_id is the device-unique id to use +// if NG_priv is NULL or NG_id is 0, it will use builtin defaults +void get_ap_sig_and_cert(u8 *sig_out, u8 *ap_cert_out, u64 title_id, u8 *data, u32 data_size, const u8 *NG_priv, u32 NG_id) +{ + u8 hash[20]; + u8 ap_priv[30]; + char signer[64]; + char name[64]; + + if ((NG_id==0)||(NG_priv == NULL)) + { + NG_priv = default_NG_priv; + NG_id = default_NG_id; + } + + + memset(ap_priv, 0, 0x1e); + ap_priv[0x1d] = 1; + // setup random ap_priv here if desired + // get_rand_bytes(ap_priv, 0x1e); + // ap_priv[0] &= 1; + + memset(ap_cert_out+4, 0, 60); + + sprintf(signer, "Root-CA00000001-MS00000002-NG%08x", NG_id); + sprintf(name, "AP%08x%08x", (u32)(title_id>>32), (u32)(title_id&0xffffffff)); + make_blanksig_ec_cert(ap_cert_out, signer, name, ap_priv, 0); + + sha1(ap_cert_out + 0x80, 0x100, hash); + generate_ecdsa(ap_cert_out+4, ap_cert_out+34, NG_priv, hash); + + sha1(data, data_size, hash); + generate_ecdsa(sig_out, sig_out + 30, ap_priv, hash); +} + +void make_blanksig_ec_cert(u8 *cert_out, const char *signer, const char *name, const u8 *private_key, u32 key_id) +{ + memset(cert_out, 0, 0x180); + *(u32*)cert_out = Common::swap32(0x10002); + + strncpy((char*)cert_out + 0x80, signer, 0x40); + *(u32*)(cert_out + 0xc0) = Common::swap32(2); + strncpy((char*)cert_out + 0xc4, name, 0x40); + *(u32*)(cert_out + 0x104) = Common::swap32(key_id); + ec_priv_to_pub(private_key, cert_out + 0x108); +} + + +// get_shared_secret + +// shared_secret_out is a pointer to 0x3c long buffer +// remote_public_key is a pointer to the remote party's public key (0x3c bytes) +// NG_priv is the device-unique private key to use +// if NG_priv is NULL, default builtin will be used +void get_shared_secret(u8* shared_secret_out, u8* remote_public_key, u8* NG_priv) +{ + if (NG_priv==NULL) + { + NG_priv = default_NG_priv; + } + + // required point_mul in Source/Core/Common/Src/Crypto/ec.cpp + // to be made non-static + + point_mul(shared_secret_out, NG_priv, remote_public_key); + +} + +EcWii::EcWii() +{ + bool init = true; + std::string keys_path = File::GetUserPath(D_WIIUSER_IDX) + "keys.bin"; + if (File::Exists(keys_path)) + { + File::IOFile keys_f(keys_path, "rb"); + if (keys_f.IsOpen()) + { + if (keys_f.ReadBytes(&BootMiiKeysBin, sizeof(BootMiiKeysBin))) + { + init = false; + + INFO_LOG(WII_IPC_ES, "Successfully loaded keys.bin created by: %s", BootMiiKeysBin.creator); + } + else + { + ERROR_LOG(WII_IPC_ES, "Failed to read keys.bin, check it is the correct size of %08X bytes.", (unsigned int) sizeof(BootMiiKeysBin)); + } + } + else + { + ERROR_LOG(WII_IPC_ES, "Failed to open keys.bin, maybe a permissions error or it is in use?"); + } + } + else + { + ERROR_LOG(WII_IPC_ES, "%s could not be found. Using default values. We recommend you grab keys.bin from BootMii.", keys_path.c_str()); + } + + if (init) + InitDefaults(); +} + +EcWii::~EcWii() +{ +} + +void EcWii::InitDefaults() +{ + memset(&BootMiiKeysBin, 0, sizeof(BootMiiKeysBin)); + + BootMiiKeysBin.ng_id = Common::swap32(default_NG_id); + BootMiiKeysBin.ng_key_id = Common::swap32(default_NG_key_id); + + memcpy(BootMiiKeysBin.ng_priv, default_NG_priv, sizeof(BootMiiKeysBin.ng_priv)); + memcpy(BootMiiKeysBin.ng_sig, default_NG_sig, sizeof(BootMiiKeysBin.ng_sig)); +} + +EcWii& EcWii::GetInstance() +{ + static EcWii m_Instance; + return(m_Instance); +} diff --git a/Source/Core/Core/Src/ec_wii.h b/Source/Core/Core/Src/ec_wii.h new file mode 100644 index 0000000000..969b3b53df --- /dev/null +++ b/Source/Core/Core/Src/ec_wii.h @@ -0,0 +1,113 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +// Based off of twintig http://git.infradead.org/?p=users/segher/wii.git +// Copyright 2007,2008 Segher Boessenkool +// Licensed under the terms of the GNU GPL, version 2 +// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + +/* + * + * Structs for keys.bin taken from: + * + * mini - a Free Software replacement for the Nintendo/BroadOn IOS. + * crypto hardware support + * + * Copyright (C) 2008, 2009 Haxx Enterprises + * Copyright (C) 2008, 2009 Sven Peter + * Copyright (C) 2008, 2009 Hector Martin "marcan" + * + * # This code is licensed to you under the terms of the GNU GPL, version 2; + * # see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + */ + +#ifndef _ECWII_H +#define _ECWII_H + +#include "Common.h" + +void get_ng_cert(u8* ng_cert_out, u32 NG_id, u32 NG_key_id, const u8* NG_priv, const u8* NG_sig); +void get_ap_sig_and_cert(u8 *sig_out, u8 *ap_cert_out, u64 title_id, u8 *data, u32 data_size, const u8 *NG_priv, u32 NG_id); + +void make_blanksig_ec_cert(u8 *cert_out, const char *signer, const char *name, const u8 *private_key, u32 key_id); +void get_shared_secret(u8* shared_secret_out, u8* remote_public_key, const u8* NG_priv); + + + +class EcWii +{ +public: + EcWii(); + ~EcWii(); + static EcWii& GetInstance(); + u32 getNgId() {return Common::swap32(BootMiiKeysBin.ng_id);} + u32 getNgKeyId() {return Common::swap32(BootMiiKeysBin.ng_key_id);} + const u8* getNgPriv() {return BootMiiKeysBin.ng_priv;} + const u8* getNgSig() {return BootMiiKeysBin.ng_sig;}; +private: + void InitDefaults(); + + #pragma pack(push,1) + typedef struct + { + u8 boot2version; + u8 unknown1; + u8 unknown2; + u8 pad; + u32 update_tag; + u16 checksum; + } +#ifndef _WIN32 + __attribute__((packed)) +#endif + eep_ctr_t; + + struct + { + u8 creator [0x100]; // 0x000 + u8 boot1_hash [ 0x14]; // 0x100 + u8 common_key [ 0x10]; // 0x114 + u32 ng_id; // 0x124 + union { + struct { + u8 ng_priv [ 0x1e]; // 0x128 + u8 pad1 [ 0x12]; + }; + struct { + u8 pad2 [ 0x1c]; + u8 nand_hmac [ 0x14]; //0x144 + }; + }; + u8 nand_key [ 0x10]; //0x158 + u8 rng_key [ 0x10]; //0x168 + u32 unk1; //0x178 + u32 unk2; //0x17C + u8 eeprom_pad [ 0x80]; //0x180 + + u32 ms_id; //0x200 + u32 ca_id; //0x204 + u32 ng_key_id; //0x208 + u8 ng_sig [ 0x3c]; //0x20c + eep_ctr_t counters [ 0x02]; //0x248 + u8 fill [ 0x18]; //0x25c + u8 korean_key [ 0x10]; //0x274 + u8 pad3 [ 0x74]; //0x284 + u16 prng_seed [ 0x02]; //0x2F8 + u8 pad4 [ 0x04]; //0x2FC + + u8 crack_pad [0x100]; //0x300 + + } + + #ifndef _WIN32 + __attribute__((packed)) + #endif + + BootMiiKeysBin; + + #pragma pack(pop) + +}; + +#endif diff --git a/Source/Core/Core/Src/stdafx.h b/Source/Core/Core/Src/stdafx.h index ef9e560412..bc5046304d 100644 --- a/Source/Core/Core/Src/stdafx.h +++ b/Source/Core/Core/Src/stdafx.h @@ -10,3 +10,5 @@ #endif #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include diff --git a/Source/Core/Core/Src/x64MemTools.cpp b/Source/Core/Core/Src/x64MemTools.cpp index 2594598303..a5ed163df7 100644 --- a/Source/Core/Core/Src/x64MemTools.cpp +++ b/Source/Core/Core/Src/x64MemTools.cpp @@ -2,36 +2,9 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#ifdef _WIN32 -#include -#else #include -#include -#ifndef ANDROID -#include // Look in here for the context definition. -#endif -#endif - #ifdef __APPLE__ -#define CREG_RAX(ctx) (*(ctx))->__ss.__rax -#define CREG_RIP(ctx) (*(ctx))->__ss.__rip -#define CREG_EAX(ctx) (*(ctx))->__ss.__eax -#define CREG_EIP(ctx) (*(ctx))->__ss.__eip -#elif defined __FreeBSD__ -#define CREG_RAX(ctx) (ctx)->mc_rax -#define CREG_RIP(ctx) (ctx)->mc_rip -#define CREG_EAX(ctx) (ctx)->mc_eax -#define CREG_EIP(ctx) (ctx)->mc_eip -#elif defined __linux__ -#define CREG_RAX(ctx) (ctx)->gregs[REG_RAX] -#define CREG_RIP(ctx) (ctx)->gregs[REG_RIP] -#define CREG_EAX(ctx) (ctx)->gregs[REG_EAX] -#define CREG_EIP(ctx) (ctx)->gregs[REG_EIP] -#elif defined __NetBSD__ -#define CREG_RAX(ctx) (ctx)->__gregs[_REG_RAX] -#define CREG_RIP(ctx) (ctx)->__gregs[_REG_RIP] -#define CREG_EAX(ctx) (ctx)->__gregs[_REG_EAX] -#define CREG_EIP(ctx) (ctx)->__gregs[_REG_EIP] +#include "Thread.h" #endif #include @@ -49,6 +22,58 @@ namespace EMM { +#if (defined __APPLE__ || defined __linux__ || defined __FreeBSD__) && !defined(ANDROID) +#include +void print_trace(const char * msg) +{ + void *array[100]; + size_t size; + char **strings; + size_t i; + + size = backtrace(array, 100); + strings = backtrace_symbols(array, size); + printf("%s Obtained %u stack frames.\n", msg, (unsigned int)size); + for (i = 0; i < size; i++) + printf("--> %s\n", strings[i]); + free(strings); +} +#endif + +bool DoFault(u64 bad_address, SContext *ctx) +{ + if (!JitInterface::IsInCodeSpace((u8*) ctx->CTX_PC)) + { + // Let's not prevent debugging. + return false; + } + + u64 memspace_bottom = (u64)Memory::base; + u64 memspace_top = memspace_bottom + +#ifdef _M_X64 + 0x100000000ULL; +#else + 0x40000000; +#endif + + if (bad_address < memspace_bottom || bad_address >= memspace_top) { + return false; + } + u32 em_address = (u32)(bad_address - memspace_bottom); + const u8 *new_pc = jit->BackPatch((u8*) ctx->CTX_PC, em_address, ctx); + if (new_pc) + { + ctx->CTX_PC = (u64) new_pc; + } + else + { + // there was an error, give the debugger a chance + return false; + } + + return true; +} + #ifdef _WIN32 LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) @@ -62,54 +87,24 @@ LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) { return (DWORD)EXCEPTION_CONTINUE_SEARCH; } - + //Where in the x86 code are we? PVOID codeAddr = pPtrs->ExceptionRecord->ExceptionAddress; unsigned char *codePtr = (unsigned char*)codeAddr; - - if (!JitInterface::IsInCodeSpace(codePtr)) + u64 badAddress = (u64)pPtrs->ExceptionRecord->ExceptionInformation[1]; + CONTEXT *ctx = pPtrs->ContextRecord; + + if (DoFault(badAddress, ctx)) + { + return (DWORD)EXCEPTION_CONTINUE_EXECUTION; + } + else { // Let's not prevent debugging. return (DWORD)EXCEPTION_CONTINUE_SEARCH; } - //Figure out what address was hit - u64 badAddress = (u64)pPtrs->ExceptionRecord->ExceptionInformation[1]; - - //TODO: First examine the address, make sure it's within the emulated memory space - u64 memspaceBottom = (u64)Memory::base; -#ifdef _M_X64 - u64 memspaceTop = memspaceBottom + 0x100000000ULL; -#else - u64 memspaceTop = memspaceBottom + 0x40000000; -#endif - if (badAddress < memspaceBottom || badAddress >= memspaceTop) - { - return (DWORD)EXCEPTION_CONTINUE_SEARCH; - //PanicAlert("Exception handler - access outside memory space. %08x%08x", - // badAddress >> 32, badAddress); - } - - u32 emAddress = (u32)(badAddress - memspaceBottom); - - //Now we have the emulated address. - - CONTEXT *ctx = pPtrs->ContextRecord; - //opportunity to play with the context - we can change the debug regs! - - //We could emulate the memory accesses here, but then they would still be around to take up - //execution resources. Instead, we backpatch into a generic memory call and retry. - const u8 *new_rip = JitInterface::BackPatch(codePtr, accessType, emAddress, ctx); - - // Rip/Eip needs to be updated. - if (new_rip) -#ifdef _M_X64 - ctx->Rip = (DWORD_PTR)new_rip; -#else - ctx->Eip = (DWORD_PTR)new_rip; -#endif } - return (DWORD)EXCEPTION_CONTINUE_EXECUTION; case EXCEPTION_STACK_OVERFLOW: MessageBox(0, _T("Stack overflow!"), 0,0); @@ -118,7 +113,7 @@ LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) case EXCEPTION_ILLEGAL_INSTRUCTION: //No SSE support? Or simply bad codegen? return EXCEPTION_CONTINUE_SEARCH; - + case EXCEPTION_PRIV_INSTRUCTION: //okay, dynarec codegen is obviously broken. return EXCEPTION_CONTINUE_SEARCH; @@ -150,33 +145,136 @@ void InstallExceptionHandler() #endif } -#else // _WIN32 +#elif defined(__APPLE__) -#ifndef ANDROID -#if defined __APPLE__ || defined __linux__ || defined __FreeBSD__ || defined _WIN32 -#ifndef _WIN32 -#include -#endif -void print_trace(const char * msg) +void CheckKR(const char* name, kern_return_t kr) { - void *array[100]; - size_t size; - char **strings; - size_t i; + if (kr) + { + PanicAlertT("%s failed: kr=%x", name, kr); + } +} - size = backtrace(array, 100); - strings = backtrace_symbols(array, size); - printf("%s Obtained %u stack frames.\n", msg, (unsigned int)size); - for (i = 0; i < size; i++) - printf("--> %s\n", strings[i]); - free(strings); +#ifdef _M_X64 +void ExceptionThread(mach_port_t port) +{ + Common::SetCurrentThreadName("Mach exception thread"); + #pragma pack(4) + struct + { + mach_msg_header_t Head; + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + int64_t code[2]; + int flavor; + mach_msg_type_number_t old_stateCnt; + natural_t old_state[x86_THREAD_STATE64_COUNT]; + mach_msg_trailer_t trailer; + } msg_in; + + struct + { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + int flavor; + mach_msg_type_number_t new_stateCnt; + natural_t new_state[x86_THREAD_STATE64_COUNT]; + } msg_out; + #pragma pack() + memset(&msg_in, 0xee, sizeof(msg_in)); + memset(&msg_out, 0xee, sizeof(msg_out)); + mach_msg_header_t *send_msg = NULL; + mach_msg_size_t send_size = 0; + mach_msg_option_t option = MACH_RCV_MSG; + while (1) + { + // If this isn't the first run, send the reply message. Then, receive + // a message: either a mach_exception_raise_state RPC due to + // thread_set_exception_ports, or MACH_NOTIFY_NO_SENDERS due to + // mach_port_request_notification. + CheckKR("mach_msg_overwrite", mach_msg_overwrite(send_msg, option, send_size, sizeof(msg_in), port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL, &msg_in.Head, 0)); + + if (msg_in.Head.msgh_id == MACH_NOTIFY_NO_SENDERS) + { + // the other thread exited + mach_port_destroy(mach_task_self(), port); + return; + } + + if (msg_in.Head.msgh_id != 2406) + { + PanicAlertT("unknown message received"); + return; + } + + if (msg_in.flavor != x86_THREAD_STATE64) + { + PanicAlertT("unknown flavor %d (expected %d)", msg_in.flavor, x86_THREAD_STATE64); + return; + } + + x86_thread_state64_t *state = (x86_thread_state64_t *) msg_in.old_state; + + bool ok = DoFault(msg_in.code[1], state); + + // Set up the reply. + msg_out.Head.msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(msg_in.Head.msgh_bits), 0); + msg_out.Head.msgh_remote_port = msg_in.Head.msgh_remote_port; + msg_out.Head.msgh_local_port = MACH_PORT_NULL; + msg_out.Head.msgh_id = msg_in.Head.msgh_id + 100; + msg_out.NDR = msg_in.NDR; + if (ok) + { + msg_out.RetCode = KERN_SUCCESS; + msg_out.flavor = x86_THREAD_STATE64; + msg_out.new_stateCnt = x86_THREAD_STATE64_COUNT; + memcpy(msg_out.new_state, msg_in.old_state, x86_THREAD_STATE64_COUNT * sizeof(natural_t)); + } + else + { + // Pass the exception to the next handler (debugger or crash). + msg_out.RetCode = KERN_FAILURE; + msg_out.flavor = 0; + msg_out.new_stateCnt = 0; + } + msg_out.Head.msgh_size = offsetof(typeof(msg_out), new_state) + msg_out.new_stateCnt * sizeof(natural_t); + + send_msg = &msg_out.Head; + send_size = msg_out.Head.msgh_size; + option |= MACH_SEND_MSG; + } } #endif -void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) +void InstallExceptionHandler() +{ +#ifdef _M_IX86 + PanicAlertT("InstallExceptionHandler called, but this platform does not yet support it."); +#else + mach_port_t port; + CheckKR("mach_port_allocate", mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port)); + std::thread exc_thread(ExceptionThread, port); + exc_thread.detach(); + // Obtain a send right for thread_set_exception_ports to copy... + CheckKR("mach_port_insert_right", mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND)); + // Mach tries the following exception ports in order: thread, task, host. + // Debuggers set the task port, so we grab the thread port. + CheckKR("thread_set_exception_ports", thread_set_exception_ports(mach_thread_self(), EXC_MASK_BAD_ACCESS, port, EXCEPTION_STATE | MACH_EXCEPTION_CODES, x86_THREAD_STATE64)); + // ...and get rid of our copy so that MACH_NOTIFY_NO_SENDERS works. + CheckKR("mach_port_mod_refs", mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND, -1)); + mach_port_t previous; + CheckKR("mach_port_request_notification", mach_port_request_notification(mach_task_self(), port, MACH_NOTIFY_NO_SENDERS, 0, port, MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous)); +#endif +} + +#elif !defined(ANDROID) + +void sigsegv_handler(int sig, siginfo_t *info, void *raw_context) { #ifndef _M_GENERIC - if (signal != SIGSEGV) + if (sig != SIGSEGV) { // We are not interested in other signals - handle it as usual. return; @@ -188,63 +286,23 @@ void sigsegv_handler(int signal, siginfo_t *info, void *raw_context) // Huh? Return. return; } - void *fault_memory_ptr = (void *)info->si_addr; + u64 bad_address = (u64)info->si_addr; // Get all the information we can out of the context. mcontext_t *ctx = &context->uc_mcontext; -#ifdef _M_X64 - u8 *fault_instruction_ptr = (u8 *)CREG_RIP(ctx); -#else - u8 *fault_instruction_ptr = (u8 *)CREG_EIP(ctx); -#endif - if (!JitInterface::IsInCodeSpace(fault_instruction_ptr)) + // assume it's not a write + if (!DoFault(bad_address, ctx)) { - // Let's not prevent debugging. - return; - } - - u64 bad_address = (u64)fault_memory_ptr; - u64 memspace_bottom = (u64)Memory::base; - if (bad_address < memspace_bottom) { - PanicAlertT("Exception handler - access below memory space. %08llx%08llx", - bad_address >> 32, bad_address); - } - u32 em_address = (u32)(bad_address - memspace_bottom); - - // Backpatch time. - // Seems we'll need to disassemble to get access_type - that work is probably - // best done and debugged on the Windows side. - int access_type = 0; - - CONTEXT fake_ctx; - -#ifdef _M_X64 - fake_ctx.Rax = CREG_RAX(ctx); - fake_ctx.Rip = CREG_RIP(ctx); -#else - fake_ctx.Eax = CREG_EAX(ctx); - fake_ctx.Eip = CREG_EIP(ctx); -#endif - const u8 *new_rip = jit->BackPatch(fault_instruction_ptr, access_type, em_address, &fake_ctx); - if (new_rip) - { -#ifdef _M_X64 - CREG_RAX(ctx) = fake_ctx.Rax; - CREG_RIP(ctx) = fake_ctx.Rip; -#else - CREG_EAX(ctx) = fake_ctx.Eax; - CREG_EIP(ctx) = fake_ctx.Eip; -#endif + // retry and crash + signal(SIGSEGV, SIG_DFL); } #endif } -#endif void InstallExceptionHandler() { #ifdef _M_IX86 PanicAlertT("InstallExceptionHandler called, but this platform does not yet support it."); - return; #else struct sigaction sa; sa.sa_handler = 0; diff --git a/Source/Core/DiscIO/CMakeLists.txt b/Source/Core/DiscIO/CMakeLists.txt index 01e15a374f..f64f263e11 100644 --- a/Source/Core/DiscIO/CMakeLists.txt +++ b/Source/Core/DiscIO/CMakeLists.txt @@ -21,5 +21,4 @@ set(SRCS Src/BannerLoader.cpp Src/VolumeWiiCrypted.cpp Src/WiiWad.cpp) -add_library(discio STATIC ${SRCS}) -target_link_libraries(discio common) +add_dolphin_library(discio "${SRCS}" "") diff --git a/Source/Core/DiscIO/DiscIO.vcxproj b/Source/Core/DiscIO/DiscIO.vcxproj index 722aae2040..44d3cdf4e6 100644 --- a/Source/Core/DiscIO/DiscIO.vcxproj +++ b/Source/Core/DiscIO/DiscIO.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,155 +19,62 @@ - {B6398059-EBB6-4C34-B547-95F365B71FF4} - DiscIO + {160BDC25-5626-4B0D-BDD8-2953D9777FB5} - - true - StaticLibrary - MultiByte - - - true - StaticLibrary - MultiByte - - - false + StaticLibrary + v120 Unicode - - StaticLibrary - false - MultiByte + + true - + false - StaticLibrary - Unicode - - - StaticLibrary - false - MultiByte - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + Create - - true - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) - - - true - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - ..\Common\Src;..\..\..\Externals\zlib;%(AdditionalIncludeDirectories) - - - true - true - true - - + + + + + + + + + - @@ -192,42 +91,22 @@ + - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - + - + + {bdb6578b-0691-4e80-a46c-df21639fd3b8} + + + {ff213b23-2c26-4214-9f88-85271e557e87} + + + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} + diff --git a/Source/Core/DiscIO/DiscIO.vcxproj.filters b/Source/Core/DiscIO/DiscIO.vcxproj.filters index 105d3ffc47..de47864e76 100644 --- a/Source/Core/DiscIO/DiscIO.vcxproj.filters +++ b/Source/Core/DiscIO/DiscIO.vcxproj.filters @@ -1,16 +1,59 @@  - + + {3873659a-9a30-4a58-af9e-8dad7d7eb627} + + + {324d4b72-d25b-4c83-bd61-6c9e85e59895} + + + {bd7dbc22-b233-4f82-a369-034f04133b73} + + + {0a2c0bb1-2948-4dfb-9216-77410c39a42c} + + + {cbce645c-943c-4a94-8be0-8ad529b5c825} + + + {3d2fc224-a486-4975-a617-d19f4439702b} + + + + + DiscScrubber + + + FileHandler + + + FileHandler + + + FileHandler + + + FileHandler + + + FileSystem + + + FileSystem + + + NAND + + + NAND + Volume\Blob Volume\Blob - - Volume\Blob - Volume\Blob @@ -20,6 +63,9 @@ Volume\Blob + + Volume\Blob + Volume @@ -41,45 +87,42 @@ Volume - - NAND - - - NAND - - - FileSystem - - - FileSystem - - - FileHandler - - - FileHandler - - - FileHandler - - - FileHandler - - - DiscScrubber - + - - - Volume\Blob + + DiscScrubber - - Volume\Blob + + FileHandler + + + FileHandler + + + FileHandler + + + FileHandler + + + FileSystem + + + FileSystem + + + NAND + + + NAND Volume\Blob + + Volume\Blob + Volume\Blob @@ -89,15 +132,15 @@ Volume\Blob + + Volume\Blob + Volume Volume - - Volume - Volume @@ -110,55 +153,12 @@ Volume - - NAND - - - NAND - - - FileSystem - - - FileSystem - - - FileHandler - - - FileHandler - - - FileHandler - - - FileHandler - - - DiscScrubber + + Volume + - - - - - {46b8b594-1da4-4941-9d3e-3057ac8c251f} - - - {96aa6fd2-a1d1-40c4-9235-50f342f32bf1} - - - {62cd3276-4116-4e3c-93ea-a170676fd84f} - - - {60157ced-f762-4521-be00-79a26744a11a} - - - {45ea663e-bcf3-4ff8-9c97-0f7cfc6ab60e} - - - {7bbe1cf7-ab2c-4f01-9e60-a9c8767b4dce} - + \ No newline at end of file diff --git a/Source/Core/DiscIO/Src/BannerLoader.h b/Source/Core/DiscIO/Src/BannerLoader.h index 7fec9c57bd..da0075f7f3 100644 --- a/Source/Core/DiscIO/Src/BannerLoader.h +++ b/Source/Core/DiscIO/Src/BannerLoader.h @@ -26,7 +26,7 @@ class IBannerLoader virtual bool IsValid() = 0; - virtual bool GetBanner(u32* _pBannerImage) = 0; + virtual std::vector GetBanner(int* pWidth, int* pHeight) = 0; virtual std::vector GetNames() = 0; virtual std::string GetCompany() = 0; diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.cpp b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp index 3585835443..ce35258148 100644 --- a/Source/Core/DiscIO/Src/BannerLoaderGC.cpp +++ b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp @@ -2,9 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -// HyperIris: need clean code -#include "../../Core/Src/ConfigManager.h" - +#include "CommonTypes.h" #include "ColorUtil.h" #include "BannerLoaderGC.h" @@ -50,17 +48,15 @@ bool CBannerLoaderGC::IsValid() return m_IsValid; } -bool CBannerLoaderGC::GetBanner(u32* _pBannerImage) +std::vector CBannerLoaderGC::GetBanner(int* pWidth, int* pHeight) { - if (!IsValid()) - { - return false; - } - + std::vector Buffer; + Buffer.resize(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT); auto const pBanner = (DVDBanner*)m_pBannerFile; - decode5A3image(_pBannerImage, pBanner->image, DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT); - - return true; + ColorUtil::decode5A3image(&Buffer[0], pBanner->image, DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT); + *pWidth = DVD_BANNER_WIDTH; + *pHeight = DVD_BANNER_HEIGHT; + return Buffer; } @@ -107,7 +103,7 @@ std::vector CBannerLoaderGC::GetNames() names.push_back(GetDecodedString(data)); } } - + return names; } @@ -145,6 +141,7 @@ std::vector CBannerLoaderGC::GetDescriptions() desc_count = 1; break; + // English, German, French, Spanish, Italian, Dutch case CBannerLoaderGC::BANNER_BNR2: desc_count = 6; break; @@ -164,25 +161,6 @@ std::vector CBannerLoaderGC::GetDescriptions() return descriptions; } - -void CBannerLoaderGC::decode5A3image(u32* dst, u16* src, int width, int height) -{ - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int iy = 0; iy < 4; iy++, src += 4) - { - for (int ix = 0; ix < 4; ix++) - { - u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix])); - dst[(y + iy) * width + (x + ix)] = RGBA; - } - } - } - } -} - CBannerLoaderGC::BANNER_TYPE CBannerLoaderGC::getBannerType() { u32 bannerSignature = *(u32*)m_pBannerFile; diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.h b/Source/Core/DiscIO/Src/BannerLoaderGC.h index b9674feb58..7ad6d2122c 100644 --- a/Source/Core/DiscIO/Src/BannerLoaderGC.h +++ b/Source/Core/DiscIO/Src/BannerLoaderGC.h @@ -20,7 +20,7 @@ class CBannerLoaderGC virtual bool IsValid(); - virtual bool GetBanner(u32* _pBannerImage); + virtual std::vector GetBanner(int* pWidth, int* pHeight); virtual std::vector GetNames(); virtual std::string GetCompany(); @@ -66,7 +66,7 @@ class CBannerLoaderGC std::string GetDecodedString(const char (&data)[N]) { auto const string_decoder = CVolumeGC::GetStringDecoder(m_country); - + // strnlen to trim NULLs return string_decoder(std::string(data, strnlen(data, sizeof(data)))); } @@ -75,9 +75,8 @@ class CBannerLoaderGC bool m_IsValid; BANNER_TYPE m_BNRType; - void decode5A3image(u32* dst, u16* src, int width, int height); BANNER_TYPE getBannerType(); - + DiscIO::IVolume::ECountry const m_country; }; diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.cpp b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp index e682ca13c6..15c4325748 100644 --- a/Source/Core/DiscIO/Src/BannerLoaderWii.cpp +++ b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp @@ -5,7 +5,7 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" #include "ColorUtil.h" #include "BannerLoaderWii.h" #include "VolumeCreator.h" @@ -15,7 +15,7 @@ namespace DiscIO { -CBannerLoaderWii::CBannerLoaderWii(DiscIO::IVolume *pVolume) +CBannerLoaderWii::CBannerLoaderWii(DiscIO::IVolume *pVolume) : m_pBannerFile(NULL) , m_IsValid(false) { @@ -42,7 +42,7 @@ CBannerLoaderWii::CBannerLoaderWii(DiscIO::IVolume *pVolume) File::GetUserPath(D_WIIUSER_IDX).c_str(), (u32)(TitleID>>32), (u32)TitleID); if(!File::Exists(titleFolder)) File::CreateFullPath(titleFolder); - + // Extracting banner.bin from opening.bnr sprintf(bnrFilename, "%stitle/%08x/%08x/data/opening.bnr", File::GetUserPath(D_WIIUSER_IDX).c_str(), (u32)(TitleID>>32), (u32)TitleID); @@ -61,7 +61,7 @@ CBannerLoaderWii::CBannerLoaderWii(DiscIO::IVolume *pVolume) // Now we have an LZ77-compressed file with a short IMD5 header // TODO: Finish the job - + File::Delete(bnrFilename); #else m_IsValid = false; @@ -98,38 +98,15 @@ bool CBannerLoaderWii::IsValid() return m_IsValid; } -static inline u32 Average32(u32 a, u32 b) { - return ((a >> 1) & 0x7f7f7f7f) + ((b >> 1) & 0x7f7f7f7f); -} - -static inline u32 GetPixel(u32 *buffer, unsigned int x, unsigned int y) { - // thanks to unsignedness, these also check for <0 automatically. - if (x > 191) return 0; - if (y > 63) return 0; - return buffer[y * 192 + x]; -} - -bool CBannerLoaderWii::GetBanner(u32* _pBannerImage) +std::vector CBannerLoaderWii::GetBanner(int* pWidth, int* pHeight) { - if (IsValid()) - { - SWiiBanner* pBanner = (SWiiBanner*)m_pBannerFile; - u32* Buffer = new u32[192 * 64]; - decode5A3image(Buffer, (u16*)pBanner->m_BannerTexture, 192, 64); - for (int y = 0; y < 32; y++) - { - for (int x = 0; x < 96; x++) - { - // simplified plus-shaped "gaussian" - u32 surround = Average32( - Average32(GetPixel(Buffer, x*2 - 1, y*2), GetPixel(Buffer, x*2 + 1, y*2)), - Average32(GetPixel(Buffer, x*2, y*2 - 1), GetPixel(Buffer, x*2, y*2 + 1))); - _pBannerImage[y * 96 + x] = Average32(GetPixel(Buffer, x*2, y*2), surround); - } - } - delete[] Buffer; - } - return true; + SWiiBanner* pBanner = (SWiiBanner*)m_pBannerFile; + std::vector Buffer; + Buffer.resize(192 * 64); + ColorUtil::decode5A3image(&Buffer[0], (u16*)pBanner->m_BannerTexture, 192, 64); + *pWidth = 192; + *pHeight = 64; + return Buffer; } bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::string& result) @@ -138,15 +115,15 @@ bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::stri { auto const banner = reinterpret_cast(m_pBannerFile); auto const src_ptr = banner->m_Comment[index]; - + // Trim at first NULL auto const length = std::find(src_ptr, src_ptr + COMMENT_SIZE, 0x0) - src_ptr; - + std::wstring src; src.resize(length); std::transform(src_ptr, src_ptr + src.size(), src.begin(), (u16(&)(u16))Common::swap16); result = UTF16ToUTF8(src); - + return true; } @@ -156,7 +133,7 @@ bool CBannerLoaderWii::GetStringFromComments(const CommentIndex index, std::stri std::vector CBannerLoaderWii::GetNames() { std::vector ret(1); - + if (!GetStringFromComments(NAME_IDX, ret[0])) ret.clear(); @@ -176,22 +153,4 @@ std::vector CBannerLoaderWii::GetDescriptions() return result; } -void CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height) -{ - for (int y = 0; y < height; y += 4) - { - for (int x = 0; x < width; x += 4) - { - for (int iy = 0; iy < 4; iy++, src += 4) - { - for (int ix = 0; ix < 4; ix++) - { - u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix])); - dst[(y + iy) * width + (x + ix)] = RGBA; - } - } - } - } -} - } // namespace diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.h b/Source/Core/DiscIO/Src/BannerLoaderWii.h index 33a1dce6ae..2d7d0e6e90 100644 --- a/Source/Core/DiscIO/Src/BannerLoaderWii.h +++ b/Source/Core/DiscIO/Src/BannerLoaderWii.h @@ -20,14 +20,14 @@ class CBannerLoaderWii virtual bool IsValid(); - virtual bool GetBanner(u32* _pBannerImage); + virtual std::vector GetBanner(int* pWidth, int* pHeight); virtual std::vector GetNames(); virtual std::string GetCompany(); virtual std::vector GetDescriptions(); private: - + enum { TEXTURE_SIZE = 192 * 64 * 2, @@ -59,8 +59,6 @@ class CBannerLoaderWii bool m_IsValid; - void decode5A3image(u32* dst, u16* src, int width, int height); - bool GetStringFromComments(const CommentIndex index, std::string& s); }; } // namespace diff --git a/Source/Core/DiscIO/Src/Blob.cpp b/Source/Core/DiscIO/Src/Blob.cpp index ba02e98b3c..600b9e0a4b 100644 --- a/Source/Core/DiscIO/Src/Blob.cpp +++ b/Source/Core/DiscIO/Src/Blob.cpp @@ -2,14 +2,13 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" -#include "FileUtil.h" -#include "CDUtils.h" #include "Blob.h" -#include "CompressedBlob.h" -#include "FileBlob.h" +#include "CDUtils.h" #include "CISOBlob.h" +#include "CompressedBlob.h" #include "DriveBlob.h" +#include "FileBlob.h" +#include "FileUtil.h" #include "WbfsBlob.h" namespace DiscIO @@ -40,7 +39,7 @@ const u8 *SectorReader::GetBlockData(u64 block_num) { return cache[0]; } - else + else { GetBlock(block_num, cache[0]); cache_tags[0] = block_num; diff --git a/Source/Core/DiscIO/Src/Blob.h b/Source/Core/DiscIO/Src/Blob.h index c332257c8f..66c21a4ca5 100644 --- a/Source/Core/DiscIO/Src/Blob.h +++ b/Source/Core/DiscIO/Src/Blob.h @@ -15,7 +15,7 @@ // detect whether the file is a compressed blob, or just a big hunk of data, or a drive, and // automatically do the right thing. -#include "Common.h" +#include "CommonTypes.h" namespace DiscIO { diff --git a/Source/Core/DiscIO/Src/CISOBlob.cpp b/Source/Core/DiscIO/Src/CISOBlob.cpp index c4b3c60143..9f01e40c48 100644 --- a/Source/Core/DiscIO/Src/CISOBlob.cpp +++ b/Source/Core/DiscIO/Src/CISOBlob.cpp @@ -17,10 +17,10 @@ CISOFileReader::CISOFileReader(std::FILE* file) : m_file(file) { m_size = m_file.GetSize(); - + CISOHeader header; m_file.ReadArray(&header, 1); - + m_block_size = header.block_size; MapType count = 0; @@ -55,7 +55,7 @@ bool CISOFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) { auto const block = offset / m_block_size; auto const data_offset = offset % m_block_size; - + auto const bytes_to_read = std::min(m_block_size - data_offset, nbytes); if (block < CISO_MAP_SIZE && UNUSED_BLOCK_ID != m_ciso_map[block]) { @@ -77,7 +77,7 @@ bool CISOFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) nbytes -= bytes_to_read; } } - + return true; } diff --git a/Source/Core/DiscIO/Src/CISOBlob.h b/Source/Core/DiscIO/Src/CISOBlob.h index 8c580b0ce1..0039fe4f43 100644 --- a/Source/Core/DiscIO/Src/CISOBlob.h +++ b/Source/Core/DiscIO/Src/CISOBlob.h @@ -20,10 +20,10 @@ struct CISOHeader { // "CISO" char magic[4]; - + // little endian u32 block_size; - + // 0=unused, 1=used, others=invalid u8 map[CISO_MAP_SIZE]; }; @@ -39,10 +39,10 @@ public: private: CISOFileReader(std::FILE* file); - + typedef u16 MapType; static const MapType UNUSED_BLOCK_ID = -1; - + File::IOFile m_file; u64 m_size; u32 m_block_size; diff --git a/Source/Core/DiscIO/Src/CompressedBlob.cpp b/Source/Core/DiscIO/Src/CompressedBlob.cpp index b469dedc9c..c801ea3698 100644 --- a/Source/Core/DiscIO/Src/CompressedBlob.cpp +++ b/Source/Core/DiscIO/Src/CompressedBlob.cpp @@ -9,7 +9,8 @@ #include #endif -#include "Common.h" +#include + #include "CompressedBlob.h" #include "DiscScrubber.h" #include "FileUtil.h" @@ -90,7 +91,7 @@ void CompressedBlobReader::GetBlock(u64 block_num, u8 *out_ptr) // clear unused part of zlib buffer. maybe this can be deleted when it works fully. memset(zlib_buffer + comp_block_size, 0, zlib_buffer_size - comp_block_size); - + m_file.Seek(offset, SEEK_SET); m_file.ReadBytes(zlib_buffer, comp_block_size); @@ -100,7 +101,7 @@ void CompressedBlobReader::GetBlock(u64 block_num, u8 *out_ptr) // First, check hash. u32 block_hash = HashAdler32(source, comp_block_size); if (block_hash != hashes[block_num]) - PanicAlert("Hash of block %lli is %08x instead of %08x.\n" + PanicAlert("Hash of block %" PRIu64 " is %08x instead of %08x.\n" "Your ISO, %s, is corrupt.", block_num, block_hash, hashes[block_num], file_name.c_str()); @@ -128,7 +129,7 @@ void CompressedBlobReader::GetBlock(u64 block_num, u8 *out_ptr) { // this seem to fire wrongly from time to time // to be sure, don't use compressed isos :P - PanicAlert("Failure reading block %lli - out of data and not at end.", block_num); + PanicAlert("Failure reading block %" PRIu64 " - out of data and not at end.", block_num); } inflateEnd(&z); if (uncomp_size != header.block_size) diff --git a/Source/Core/DiscIO/Src/DiscScrubber.cpp b/Source/Core/DiscIO/Src/DiscScrubber.cpp index fc4c01be31..928383579e 100644 --- a/Source/Core/DiscIO/Src/DiscScrubber.cpp +++ b/Source/Core/DiscIO/Src/DiscScrubber.cpp @@ -7,13 +7,15 @@ #include "FileUtil.h" #include "DiscScrubber.h" +#include + namespace DiscIO { namespace DiscScrubber { -#define CLUSTER_SIZE 0x8000 +#define CLUSTER_SIZE 0x8000 u8* m_FreeTable = NULL; u64 m_FileSize; @@ -32,7 +34,7 @@ struct SPartitionHeader u64 TMDOffset; u32 CertChainSize; u64 CertChainOffset; - // H3Size is always 0x18000 + // H3Size is always 0x18000 u64 H3Offset; u64 DataOffset; u64 DataSize; @@ -121,13 +123,13 @@ void GetNextBlock(File::IOFile& in, u8* buffer) if (m_isScrubbing && m_FreeTable[i]) { - DEBUG_LOG(DISCIO, "Freeing 0x%016llx", CurrentOffset); + DEBUG_LOG(DISCIO, "Freeing 0x%016" PRIx64, CurrentOffset); std::fill(buffer, buffer + m_BlockSize, 0xFF); in.Seek(m_BlockSize, SEEK_CUR); } else { - DEBUG_LOG(DISCIO, "Used 0x%016llx", CurrentOffset); + DEBUG_LOG(DISCIO, "Used 0x%016" PRIx64, CurrentOffset); in.ReadBytes(buffer, m_BlockSize); } @@ -150,7 +152,7 @@ void MarkAsUsed(u64 _Offset, u64 _Size) u64 CurrentOffset = _Offset; u64 EndOffset = CurrentOffset + _Size; - DEBUG_LOG(DISCIO, "Marking 0x%016llx - 0x%016llx as used", _Offset, EndOffset); + DEBUG_LOG(DISCIO, "Marking 0x%016" PRIx64 " - 0x%016" PRIx64 " as used", _Offset, EndOffset); while ((CurrentOffset < EndOffset) && (CurrentOffset < m_FileSize)) { @@ -234,10 +236,9 @@ bool ParseDisc() PartitionGroup[x].PartitionsVec.push_back(Partition); } - for (size_t i = 0; i < PartitionGroup[x].PartitionsVec.size(); i++) + for (auto& rPartition : PartitionGroup[x].PartitionsVec) { - SPartition& rPartition = PartitionGroup[x].PartitionsVec.at(i); - const SPartitionHeader& rHeader = PartitionGroup[x].PartitionsVec.at(i).Header; + const SPartitionHeader& rHeader = rPartition.Header; MarkAsUsed(rPartition.Offset, 0x2c0); diff --git a/Source/Core/DiscIO/Src/DiscScrubber.h b/Source/Core/DiscIO/Src/DiscScrubber.h index 01ea1d8393..de4b9a683a 100644 --- a/Source/Core/DiscIO/Src/DiscScrubber.h +++ b/Source/Core/DiscIO/Src/DiscScrubber.h @@ -14,7 +14,7 @@ #ifndef DISC_SCRUBBER_H #define DISC_SCRUBBER_H -#include "Common.h" +#include "CommonTypes.h" #include "Blob.h" diff --git a/Source/Core/DiscIO/Src/DriveBlob.cpp b/Source/Core/DiscIO/Src/DriveBlob.cpp index dc2c58f066..017cd702bc 100644 --- a/Source/Core/DiscIO/Src/DriveBlob.cpp +++ b/Source/Core/DiscIO/Src/DriveBlob.cpp @@ -30,14 +30,14 @@ DriveReader::DriveReader(const char *drive) return; } delete [] buffer; - + #ifdef _LOCKDRIVE // Do we want to lock the drive? // Lock the compact disc in the CD-ROM drive to prevent accidental // removal while reading from it. pmrLockCDROM.PreventMediaRemoval = TRUE; DeviceIoControl(hDisc, IOCTL_CDROM_MEDIA_REMOVAL, - &pmrLockCDROM, sizeof(pmrLockCDROM), NULL, - 0, &dwNotUsed, NULL); + &pmrLockCDROM, sizeof(pmrLockCDROM), NULL, + 0, &dwNotUsed, NULL); #endif #else SectorReader::SetSectorSize(2048); @@ -67,7 +67,7 @@ DriveReader::~DriveReader() } #else file_.Close(); -#endif +#endif } DriveReader *DriveReader::Create(const char *drive) diff --git a/Source/Core/DiscIO/Src/DriveBlob.h b/Source/Core/DiscIO/Src/DriveBlob.h index cb1c7f8f08..d5c13a3b15 100644 --- a/Source/Core/DiscIO/Src/DriveBlob.h +++ b/Source/Core/DiscIO/Src/DriveBlob.h @@ -31,7 +31,6 @@ private: bool IsOK() {return file_ != 0;} #endif s64 size; - u64 *block_pointers; public: static DriveReader *Create(const char *drive); diff --git a/Source/Core/DiscIO/Src/FileHandlerARC.cpp b/Source/Core/DiscIO/Src/FileHandlerARC.cpp index d295986f9e..26ec6ec9ec 100644 --- a/Source/Core/DiscIO/Src/FileHandlerARC.cpp +++ b/Source/Core/DiscIO/Src/FileHandlerARC.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" - #include "FileHandlerARC.h" #include "StringUtil.h" #include "Blob.h" @@ -234,11 +232,11 @@ CARCFile::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, cons const SFileInfo* CARCFile::FindFileInfo(std::string _rFullPath) const { - for (size_t i = 0; i < m_FileInfoVector.size(); i++) + for (auto& fileInfo : m_FileInfoVector) { - if (!strcasecmp(m_FileInfoVector[i].m_FullPath, _rFullPath.c_str())) + if (!strcasecmp(fileInfo.m_FullPath, _rFullPath.c_str())) { - return(&m_FileInfoVector[i]); + return(&fileInfo); } } diff --git a/Source/Core/DiscIO/Src/FileHandlerARC.h b/Source/Core/DiscIO/Src/FileHandlerARC.h index 9b5797e902..d423c74ae0 100644 --- a/Source/Core/DiscIO/Src/FileHandlerARC.h +++ b/Source/Core/DiscIO/Src/FileHandlerARC.h @@ -8,7 +8,7 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" #include "Filesystem.h" namespace DiscIO diff --git a/Source/Core/DiscIO/Src/FileMonitor.cpp b/Source/Core/DiscIO/Src/FileMonitor.cpp index 26a24046b5..4b64f61914 100644 --- a/Source/Core/DiscIO/Src/FileMonitor.cpp +++ b/Source/Core/DiscIO/Src/FileMonitor.cpp @@ -134,7 +134,7 @@ void FindFilename(u64 offset) // There's something wrong with the paths if (!fname || (strlen(fname) == 512)) return; - + CheckFile(fname, pFileSystem->GetFileSize(fname)); } diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp index 69d250e523..cc09138f3e 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "FileSystemGCWii.h" #include "StringUtil.h" @@ -46,12 +47,12 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) if (!m_Initialized) InitFileSystem(); - for (size_t i = 0; i < m_FileInfoVector.size(); i++) + for (auto& fileInfo : m_FileInfoVector) { - if ((m_FileInfoVector[i].m_Offset <= _Address) && - ((m_FileInfoVector[i].m_Offset + m_FileInfoVector[i].m_FileSize) > _Address)) + if ((fileInfo.m_Offset <= _Address) && + ((fileInfo.m_Offset + fileInfo.m_FileSize) > _Address)) { - return m_FileInfoVector[i].m_FullPath; + return fileInfo.m_FullPath; } } @@ -70,7 +71,7 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max if (pFileInfo->m_FileSize > _MaxBufferSize) return 0; - DEBUG_LOG(DISCIO, "Filename: %s. Offset: %llx. Size: %llx",_rFullPath, + DEBUG_LOG(DISCIO, "Filename: %s. Offset: %" PRIx64 ". Size: %" PRIx64, _rFullPath, pFileInfo->m_Offset, pFileInfo->m_FileSize); m_rVolume->Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer); @@ -190,7 +191,7 @@ bool CFileSystemGCWii::ExportDOL(const char* _rExportFolder) const return true; } } - + return false; } @@ -207,14 +208,14 @@ std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const data.resize(255); m_rVolume->Read(_Offset, data.size(), (u8*)&data[0]); data.erase(std::find(data.begin(), data.end(), 0x00), data.end()); - + // TODO: Should we really always use SHIFT-JIS? // It makes some filenames in Pikmin (NTSC-U) sane, but is it correct? return SHIFTJISToUTF8(data); } size_t CFileSystemGCWii::GetFileList(std::vector &_rFilenames) -{ +{ if (!m_Initialized) InitFileSystem(); @@ -222,8 +223,8 @@ size_t CFileSystemGCWii::GetFileList(std::vector &_rFilenames PanicAlert("GetFileList : input list has contents?"); _rFilenames.clear(); _rFilenames.reserve(m_FileInfoVector.size()); - for (size_t i = 0; i < m_FileInfoVector.size(); i++) - _rFilenames.push_back(&m_FileInfoVector[i]); + for (auto& fileInfo : m_FileInfoVector) + _rFilenames.push_back(&fileInfo); return m_FileInfoVector.size(); } @@ -232,10 +233,10 @@ const SFileInfo* CFileSystemGCWii::FindFileInfo(const char* _rFullPath) if (!m_Initialized) InitFileSystem(); - for (size_t i = 0; i < m_FileInfoVector.size(); i++) + for (auto& fileInfo : m_FileInfoVector) { - if (!strcasecmp(m_FileInfoVector[i].m_FullPath, _rFullPath)) - return &m_FileInfoVector[i]; + if (!strcasecmp(fileInfo.m_FullPath, _rFullPath)) + return &fileInfo; } return NULL; diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.h b/Source/Core/DiscIO/Src/FileSystemGCWii.h index 8817e44153..5240c2d3fb 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.h +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.h @@ -32,7 +32,7 @@ private: bool m_Initialized; bool m_Valid; u32 m_OffsetShift; // WII offsets are all shifted - + std::vector m_FileInfoVector; u32 Read32(u64 _Offset) const; std::string GetStringFromOffset(u64 _Offset) const; diff --git a/Source/Core/DiscIO/Src/Filesystem.h b/Source/Core/DiscIO/Src/Filesystem.h index 6995eec5fa..0fcaa88453 100644 --- a/Source/Core/DiscIO/Src/Filesystem.h +++ b/Source/Core/DiscIO/Src/Filesystem.h @@ -24,7 +24,7 @@ struct SFileInfo memset(m_FullPath, 0, sizeof(m_FullPath)); } - SFileInfo(const SFileInfo &rhs) : m_NameOffset(rhs.m_NameOffset), + SFileInfo(const SFileInfo &rhs) : m_NameOffset(rhs.m_NameOffset), m_Offset(rhs.m_Offset), m_FileSize(rhs.m_FileSize) { memcpy(m_FullPath, rhs.m_FullPath, strlen(rhs.m_FullPath) + 1); } diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.cpp b/Source/Core/DiscIO/Src/NANDContentLoader.cpp index 0cc71bafb8..e5b36c54d5 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/Src/NANDContentLoader.cpp @@ -5,8 +5,8 @@ #include "NANDContentLoader.h" #include -#include -#include "Crypto/aes.h" +#include +#include #include "MathUtil.h" #include "FileUtil.h" #include "Log.h" @@ -42,23 +42,23 @@ void CSharedContent::UpdateLocation() CSharedContent::~CSharedContent() {} -std::string CSharedContent::GetFilenameFromSHA1(u8* _pHash) +std::string CSharedContent::GetFilenameFromSHA1(const u8* _pHash) { - for (size_t i=0; i& GetContent() const { return m_Content; } + const std::vector& GetContent() const override { return m_Content; } - u16 GetTitleVersion() const {return m_TitleVersion;} - u16 GetNumEntries() const {return m_numEntries;} - DiscIO::IVolume::ECountry GetCountry() const; - u8 GetCountryChar() const {return m_Country; } + u16 GetTitleVersion() const override {return m_TitleVersion;} + u16 GetNumEntries() const override {return m_numEntries;} + DiscIO::IVolume::ECountry GetCountry() const override; + u8 GetCountryChar() const override {return m_Country; } private: @@ -154,9 +154,9 @@ CNANDContentLoader::CNANDContentLoader(const std::string& _rName) CNANDContentLoader::~CNANDContentLoader() { - for (size_t i=0; i& _TitleIDs, bool _owned) { - for (size_t i = 0; i < m_Elements.size(); i++) + for (auto& Element : m_Elements) { - if ((_owned && Common::CheckTitleTIK(Common::swap64(m_Elements[i].titleID))) || - (!_owned && Common::CheckTitleTMD(Common::swap64(m_Elements[i].titleID)))) - _TitleIDs.push_back(Common::swap64(m_Elements[i].titleID)); + if ((_owned && Common::CheckTitleTIK(Common::swap64(Element.titleID))) || + (!_owned && Common::CheckTitleTMD(Common::swap64(Element.titleID)))) + _TitleIDs.push_back(Common::swap64(Element.titleID)); } } @@ -490,17 +476,17 @@ u64 CNANDContentManager::Install_WiiWAD(std::string &fileName) } pTMDFile.WriteBytes(ContentLoader.GetTMDHeader(), INANDContentLoader::TMD_HEADER_SIZE); - + for (u32 i = 0; i < ContentLoader.GetContentSize(); i++) { - SNANDContent Content = ContentLoader.GetContent()[i]; + const SNANDContent& Content = ContentLoader.GetContent()[i]; pTMDFile.WriteBytes(Content.m_Header, INANDContentLoader::CONTENT_HEADER_SIZE); char APPFileName[1024]; if (Content.m_Type & 0x8000) //shared { - sprintf(APPFileName, "%s", + sprintf(APPFileName, "%s", CSharedContent::AccessInstance().AddSharedContent(Content.m_SHA1Hash).c_str()); } else @@ -517,7 +503,7 @@ u64 CNANDContentManager::Install_WiiWAD(std::string &fileName) PanicAlertT("WAD installation failed: error creating %s", APPFileName); return 0; } - + pAPPFile.WriteBytes(Content.m_pData, Content.m_Size); } else @@ -527,7 +513,7 @@ u64 CNANDContentManager::Install_WiiWAD(std::string &fileName) } pTMDFile.Close(); - + diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.h b/Source/Core/DiscIO/Src/NANDContentLoader.h index 66d6a4880c..9172c85338 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.h +++ b/Source/Core/DiscIO/Src/NANDContentLoader.h @@ -13,6 +13,7 @@ #include "Blob.h" #include "Volume.h" #include "NandPaths.h" +#include "FileUtil.h" namespace DiscIO { @@ -26,6 +27,7 @@ struct SNANDContent u8 m_SHA1Hash[20]; u8 m_Header[36]; //all of the above + std::string m_Filename; u8* m_pData; }; @@ -95,8 +97,8 @@ public: static CSharedContent& AccessInstance() { return m_Instance; } - std::string GetFilenameFromSHA1(u8* _pHash); - std::string AddSharedContent(u8* _pHash); + std::string GetFilenameFromSHA1(const u8* _pHash); + std::string AddSharedContent(const u8* _pHash); void UpdateLocation(); private: diff --git a/Source/Core/DiscIO/Src/Volume.h b/Source/Core/DiscIO/Src/Volume.h index 454319c876..65a9167654 100644 --- a/Source/Core/DiscIO/Src/Volume.h +++ b/Source/Core/DiscIO/Src/Volume.h @@ -25,6 +25,7 @@ public: virtual bool GetTitleID(u8*) const { return false; } virtual void GetTMD(u8*, u32 *_sz) const { *_sz=0; } virtual std::string GetUniqueID() const = 0; + virtual std::string GetRevisionSpecificUniqueID() const { return ""; } virtual std::string GetMakerID() const = 0; virtual int GetRevision() const { return 0; } // TODO: eliminate? @@ -54,7 +55,7 @@ public: virtual ECountry GetCountry() const = 0; virtual u64 GetSize() const = 0; - + // Size on disc (compressed size) virtual u64 GetRawSize() const = 0; }; diff --git a/Source/Core/DiscIO/Src/VolumeCommon.cpp b/Source/Core/DiscIO/Src/VolumeCommon.cpp index 07a514a2ea..53eb9948dd 100644 --- a/Source/Core/DiscIO/Src/VolumeCommon.cpp +++ b/Source/Core/DiscIO/Src/VolumeCommon.cpp @@ -8,12 +8,12 @@ namespace DiscIO { IVolume::ECountry CountrySwitch(u8 CountryCode) { - switch (CountryCode) + switch (CountryCode) { // Region free - fall through to European defaults for now case 'A': - + // PAL case 'D': // German return IVolume::COUNTRY_GERMANY; @@ -26,18 +26,18 @@ IVolume::ECountry CountrySwitch(u8 CountryCode) case 'M': // Japanese import to PAL regions case 'S': // Spanish-speaking regions case 'P': - case 'U': // Australia + case 'U': // Australia return IVolume::COUNTRY_EUROPE; break; - + case 'F': return IVolume::COUNTRY_FRANCE; break; - + case 'I': return IVolume::COUNTRY_ITALY; break; - + case 'R': return IVolume::COUNTRY_RUSSIA; break; diff --git a/Source/Core/DiscIO/Src/VolumeCreator.cpp b/Source/Core/DiscIO/Src/VolumeCreator.cpp index 6cf5ea836e..4dd24f9b4b 100644 --- a/Source/Core/DiscIO/Src/VolumeCreator.cpp +++ b/Source/Core/DiscIO/Src/VolumeCreator.cpp @@ -4,7 +4,7 @@ #include -#include "Crypto/aes.h" +#include #include "VolumeCreator.h" @@ -108,7 +108,7 @@ IVolume* CreateVolumeFromDirectory(const std::string& _rDirectory, bool _bIsWii, { if (CVolumeDirectory::IsValidDirectory(_rDirectory)) return new CVolumeDirectory(_rDirectory, _bIsWii, _rApploader, _rDOL); - + return NULL; } @@ -154,7 +154,7 @@ static IVolume* CreateVolumeFromCryptedWiiImage(IBlobReader& _rReader, u32 _Part std::vector PartitionsVec; }; SPartitionGroup PartitionGroup[4]; - + // read all partitions for (u32 x = 0; x < 4; x++) { @@ -183,11 +183,21 @@ static IVolume* CreateVolumeFromCryptedWiiImage(IBlobReader& _rReader, u32 _Part memset(IV, 0, 16); _rReader.Read(rPartition.Offset + 0x44c, 8, IV); - AES_KEY AES_KEY; - AES_set_decrypt_key((Korean ? g_MasterKeyK : g_MasterKey), 128, &AES_KEY); + bool usingKoreanKey = false; + // Issue: 6813 + // Magic value is at 0x501f1 (1byte) + // If encrypted with the Korean key, the magic value would be 1 + // Otherwise it is zero + if (Korean && Reader.Read32(0x501ee) != 0) + { + usingKoreanKey = true; + } + + aes_context AES_ctx; + aes_setkey_dec(&AES_ctx, (usingKoreanKey ? g_MasterKeyK : g_MasterKey), 128); u8 VolumeKey[16]; - AES_cbc_encrypt(SubKey, VolumeKey, 16, &AES_KEY, IV, AES_DECRYPT); + aes_crypt_cbc(&AES_ctx, AES_DECRYPT, 16, IV, SubKey, VolumeKey); // -1 means the caller just wanted the partition with matching type if ((int)_VolumeNum == -1 || i == _VolumeNum) diff --git a/Source/Core/DiscIO/Src/VolumeDirectory.cpp b/Source/Core/DiscIO/Src/VolumeDirectory.cpp index f095201aff..f9f8f00ea8 100644 --- a/Source/Core/DiscIO/Src/VolumeDirectory.cpp +++ b/Source/Core/DiscIO/Src/VolumeDirectory.cpp @@ -2,11 +2,10 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "Common.h" -#include "MathUtil.h" #include "CommonPaths.h" -#include "VolumeDirectory.h" #include "FileBlob.h" +#include "MathUtil.h" +#include "VolumeDirectory.h" namespace DiscIO { @@ -24,12 +23,12 @@ CVolumeDirectory::CVolumeDirectory(const std::string& _rDirectory, bool _bIsWii, , FST_ADDRESS(0) , DOL_ADDRESS(0) { - m_rootDirectory = ExtractDirectoryName(_rDirectory); + m_rootDirectory = ExtractDirectoryName(_rDirectory); // create the default disk header m_diskHeader = new u8[DISKHEADERINFO_ADDRESS]; memset(m_diskHeader, 0, (size_t)DISKHEADERINFO_ADDRESS); - SetUniqueID("AGBJ01"); + SetUniqueID("AGBJ01"); SetName("Default name"); if(_bIsWii) @@ -106,7 +105,7 @@ bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const { WriteToBuffer(FST_ADDRESS, m_fstSize, m_FSTData, _Offset, _Length, _pBuffer); } - + if(m_virtualDisk.size() == 0) return true; @@ -119,16 +118,16 @@ bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const PadToAddress(fileIter->first, _Offset, _Length, _pBuffer); while(fileIter != m_virtualDisk.end() && _Length > 0) - { + { _dbg_assert_(DVDINTERFACE, fileIter->first <= _Offset); u64 fileOffset = _Offset - fileIter->first; - PlainFileReader* reader = PlainFileReader::Create(fileIter->second.c_str()); + PlainFileReader* reader = PlainFileReader::Create(fileIter->second.c_str()); if(reader == NULL) return false; u64 fileSize = reader->GetDataSize(); - + if(fileOffset < fileSize) { u64 fileBytes = fileSize - fileOffset; @@ -153,14 +152,14 @@ bool CVolumeDirectory::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const delete reader; } - + return true; } std::string CVolumeDirectory::GetUniqueID() const { _dbg_assert_(DVDINTERFACE, m_diskHeader); - + char buffer[7]; memcpy(buffer, m_diskHeader, 6); buffer[6] = 0; @@ -183,7 +182,7 @@ void CVolumeDirectory::SetUniqueID(std::string _ID) IVolume::ECountry CVolumeDirectory::GetCountry() const { _dbg_assert_(DVDINTERFACE, m_diskHeader); - + u8 CountryCode = m_diskHeader[3]; return CountrySwitch(CountryCode); @@ -264,7 +263,7 @@ void CVolumeDirectory::SetDiskTypeWii() m_diskHeader[0x18] = 0x5d; m_diskHeader[0x19] = 0x1c; m_diskHeader[0x1a] = 0x9e; - m_diskHeader[0x1b] = 0xa3; + m_diskHeader[0x1b] = 0xa3; memset(m_diskHeader + 0x1c, 0, 4); m_addressShift = 2; @@ -288,7 +287,7 @@ bool CVolumeDirectory::SetApploader(const std::string& _rApploader) if (!_rApploader.empty()) { std::string data; - if (!File::ReadFileToString(false, _rApploader.c_str(), data)) + if (!File::ReadFileToString(_rApploader.c_str(), data)) { PanicAlertT("Apploader unable to load from file"); return false; @@ -321,7 +320,7 @@ void CVolumeDirectory::SetDOL(const std::string& _rDOL) if (!_rDOL.empty()) { std::string data; - File::ReadFileToString(false, _rDOL.c_str(), data); + File::ReadFileToString(_rDOL.c_str(), data); m_DOLSize = data.size(); m_DOL = new u8[m_DOLSize]; copy(data.begin(), data.end(), m_DOL); @@ -364,9 +363,9 @@ void CVolumeDirectory::BuildFST() // write root entry WriteEntryData(fstOffset, DIRECTORY_ENTRY, 0, 0, totalEntries); - for(std::vector::iterator iter = rootEntry.children.begin(); iter != rootEntry.children.end(); ++iter) + for(auto& entry : rootEntry.children) { - WriteEntry(*iter, fstOffset, nameOffset, curDataAddress, rootOffset); + WriteEntry(entry, fstOffset, nameOffset, curDataAddress, rootOffset); } // overflow check @@ -400,7 +399,7 @@ void CVolumeDirectory::WriteToBuffer(u64 _SrcStartAddress, u64 _SrcLength, u8* _ _Length -= srcBytes; _pBuffer += srcBytes; _Address += srcBytes; - } + } } void CVolumeDirectory::PadToAddress(u64 _StartAddress, u64& _Address, u64& _Length, u8*& _pBuffer) const @@ -447,12 +446,12 @@ void CVolumeDirectory::WriteEntryData(u32& entryOffset, u8 type, u32 nameOffset, void CVolumeDirectory::WriteEntryName(u32& nameOffset, const std::string& name) { strncpy((char*)(m_FSTData + nameOffset + m_fstNameOffset), name.c_str(), name.length() + 1); - + nameOffset += (u32)(name.length() + 1); } void CVolumeDirectory::WriteEntry(const File::FSTEntry& entry, u32& fstOffset, u32& nameOffset, u64& dataOffset, u32 parentEntryNum) -{ +{ if(entry.isDirectory) { u32 myOffset = fstOffset; @@ -460,9 +459,9 @@ void CVolumeDirectory::WriteEntry(const File::FSTEntry& entry, u32& fstOffset, u WriteEntryData(fstOffset, DIRECTORY_ENTRY, nameOffset, parentEntryNum, (u32)(myEntryNum + entry.size + 1)); WriteEntryName(nameOffset, entry.virtualName); - for(std::vector::const_iterator iter = entry.children.begin(); iter != entry.children.end(); ++iter) + for(const auto& child : entry.children) { - WriteEntry(*iter, fstOffset, nameOffset, dataOffset, myEntryNum); + WriteEntry(child, fstOffset, nameOffset, dataOffset, myEntryNum); } } else @@ -484,8 +483,7 @@ static u32 ComputeNameSize(const File::FSTEntry& parentEntry) { u32 nameSize = 0; const std::vector& children = parentEntry.children; - for (std::vector::const_iterator it = children.begin(); - it != children.end(); ++it) + for (auto it = children.cbegin(); it != children.cend(); ++it) { const File::FSTEntry& entry = *it; if (entry.isDirectory) diff --git a/Source/Core/DiscIO/Src/VolumeDirectory.h b/Source/Core/DiscIO/Src/VolumeDirectory.h index e37eb9275c..fbab0f18b3 100644 --- a/Source/Core/DiscIO/Src/VolumeDirectory.h +++ b/Source/Core/DiscIO/Src/VolumeDirectory.h @@ -5,11 +5,11 @@ #ifndef _VOLUME_DIRECTORY #define _VOLUME_DIRECTORY -#include "Volume.h" -#include "Common.h" -#include "FileUtil.h" -#include #include +#include + +#include "FileUtil.h" +#include "Volume.h" // // --- this volume type is used for reading files directly from the hard drive --- @@ -96,7 +96,7 @@ private: u8* m_diskHeader; #pragma pack(push, 1) - struct SDiskHeaderInfo + struct SDiskHeaderInfo { u32 debug_mntr_size; u32 simulated_mem_size; diff --git a/Source/Core/DiscIO/Src/VolumeGC.cpp b/Source/Core/DiscIO/Src/VolumeGC.cpp index ba858467fc..325e200a34 100644 --- a/Source/Core/DiscIO/Src/VolumeGC.cpp +++ b/Source/Core/DiscIO/Src/VolumeGC.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "stdafx.h" - #include "VolumeGC.h" #include "StringUtil.h" #include "FileMonitor.h" @@ -54,6 +52,13 @@ std::string CVolumeGC::GetUniqueID() const return ID; } +std::string CVolumeGC::GetRevisionSpecificUniqueID() const +{ + char rev[16]; + sprintf(rev, "r%d", GetRevision()); + return GetUniqueID() + rev; +} + IVolume::ECountry CVolumeGC::GetCountry() const { if (!m_pReader) @@ -93,7 +98,7 @@ int CVolumeGC::GetRevision() const std::vector CVolumeGC::GetNames() const { std::vector names; - + auto const string_decoder = GetStringDecoder(GetCountry()); char name[0x60 + 1] = {}; diff --git a/Source/Core/DiscIO/Src/VolumeGC.h b/Source/Core/DiscIO/Src/VolumeGC.h index fcc7aec611..5fc7cf892d 100644 --- a/Source/Core/DiscIO/Src/VolumeGC.h +++ b/Source/Core/DiscIO/Src/VolumeGC.h @@ -20,6 +20,7 @@ public: bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const; bool RAWRead(u64 _Offset, u64 _Length, u8* _pBuffer) const; std::string GetUniqueID() const; + std::string GetRevisionSpecificUniqueID() const; std::string GetMakerID() const; int GetRevision() const; std::vector GetNames() const; @@ -29,9 +30,9 @@ public: u64 GetSize() const; u64 GetRawSize() const; bool IsDiscTwo() const; - + typedef std::string(*StringDecoder)(const std::string&); - + static StringDecoder GetStringDecoder(ECountry country); private: diff --git a/Source/Core/DiscIO/Src/VolumeWad.cpp b/Source/Core/DiscIO/Src/VolumeWad.cpp index e3356ad5b4..cc50ec8c66 100644 --- a/Source/Core/DiscIO/Src/VolumeWad.cpp +++ b/Source/Core/DiscIO/Src/VolumeWad.cpp @@ -104,15 +104,15 @@ std::vector CVolumeWAD::GetNames() const { return names; } - + footer_size = Common::swap32(footer_size); - + //Japanese, English, German, French, Spanish, Italian, Dutch, unknown, unknown, Korean for (int i = 0; i != 10; ++i) { static const u32 string_length = 42; static const u32 bytes_length = string_length * sizeof(u16); - + u16 temp[string_length]; if (footer_size < 0xF1 || !Read(0x9C + (i * bytes_length) + OpeningBnrOffset, bytes_length, (u8*)&temp)) @@ -125,7 +125,7 @@ std::vector CVolumeWAD::GetNames() const out_temp.resize(string_length); std::transform(temp, temp + out_temp.size(), out_temp.begin(), (u16(&)(u16))Common::swap16); out_temp.erase(std::find(out_temp.begin(), out_temp.end(), 0x00), out_temp.end()); - + names.push_back(UTF16ToUTF8(out_temp)); } } diff --git a/Source/Core/DiscIO/Src/VolumeWad.h b/Source/Core/DiscIO/Src/VolumeWad.h index d22e7a2c9e..62c4d23762 100644 --- a/Source/Core/DiscIO/Src/VolumeWad.h +++ b/Source/Core/DiscIO/Src/VolumeWad.h @@ -11,7 +11,7 @@ // --- this volume type is used for Wad files --- // Some of this code might look redundant with the CNANDContentLoader class, however, -// We do not do any decryption here, we do raw read, so things are -Faster- +// We do not do any decryption here, we do raw read, so things are -Faster- namespace DiscIO { @@ -27,14 +27,13 @@ public: std::string GetMakerID() const; std::vector GetNames() const; u32 GetFSTSize() const { return 0; } - std::string GetApploaderDate() const { return "0"; } + std::string GetApploaderDate() const { return "0"; } ECountry GetCountry() const; u64 GetSize() const; u64 GetRawSize() const; private: IBlobReader* m_pReader; - u64 m_titleID; u32 OpeningBnrOffset, hdr_size, cert_size, tick_size, tmd_size, data_size; u8 m_Country; }; diff --git a/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp b/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp index 84b5b24f6b..8d2e46a0f6 100644 --- a/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp +++ b/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp @@ -5,7 +5,7 @@ #include "VolumeWiiCrypted.h" #include "VolumeGC.h" #include "StringUtil.h" -#include "Crypto/sha1.h" +#include namespace DiscIO { @@ -18,7 +18,8 @@ CVolumeWiiCrypted::CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, dataOffset(0x20000), m_LastDecryptedBlockOffset(-1) { - AES_set_decrypt_key(_pVolumeKey, 128, &m_AES_KEY); + m_AES_ctx = new aes_context; + aes_setkey_dec(m_AES_ctx, _pVolumeKey, 128); m_pBuffer = new u8[0x8000]; } @@ -29,6 +30,8 @@ CVolumeWiiCrypted::~CVolumeWiiCrypted() m_pReader = NULL; delete[] m_pBuffer; m_pBuffer = NULL; + delete m_AES_ctx; + m_AES_ctx = NULL; } bool CVolumeWiiCrypted::RAWRead( u64 _Offset, u64 _Length, u8* _pBuffer ) const @@ -67,7 +70,7 @@ bool CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer) const if (m_LastDecryptedBlockOffset != Block) { memcpy(IV, m_pBuffer + 0x3d0, 16); - AES_cbc_encrypt(m_pBuffer + 0x400, m_LastDecryptedBlock, 0x7C00, &m_AES_KEY, IV, AES_DECRYPT); + aes_crypt_cbc(m_AES_ctx, AES_DECRYPT, 0x7C00, IV, m_pBuffer + 0x400, m_LastDecryptedBlock); m_LastDecryptedBlockOffset = Block; } @@ -105,7 +108,7 @@ void CVolumeWiiCrypted::GetTMD(u8* _pBuffer, u32 * _sz) const RAWRead(m_VolumeOffset + tmdAddr, tmdSz, _pBuffer); *_sz = tmdSz; } - + std::string CVolumeWiiCrypted::GetUniqueID() const { if (m_pReader == NULL) @@ -150,7 +153,7 @@ std::string CVolumeWiiCrypted::GetMakerID() const { return std::string(); } - + makerID[2] = '\0'; return makerID; @@ -159,7 +162,7 @@ std::string CVolumeWiiCrypted::GetMakerID() const std::vector CVolumeWiiCrypted::GetNames() const { std::vector names; - + auto const string_decoder = CVolumeGC::GetStringDecoder(GetCountry()); char name[0xFF] = {}; @@ -199,7 +202,7 @@ std::string CVolumeWiiCrypted::GetApploaderDate() const { return std::string(); } - + date[10] = '\0'; return date; @@ -250,7 +253,8 @@ bool CVolumeWiiCrypted::CheckIntegrity() const NOTICE_LOG(DISCIO, "Integrity Check: fail at cluster %d: could not read metadata", clusterID); return false; } - AES_cbc_encrypt(clusterMDCrypted, clusterMD, 0x400, &m_AES_KEY, IV, AES_DECRYPT); + aes_crypt_cbc(m_AES_ctx, AES_DECRYPT, 0x400, IV, clusterMDCrypted, clusterMD); + // Some clusters have invalid data and metadata because they aren't // meant to be read by the game (for example, holes between files). To diff --git a/Source/Core/DiscIO/Src/VolumeWiiCrypted.h b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h index 457774628e..4756a8842a 100644 --- a/Source/Core/DiscIO/Src/VolumeWiiCrypted.h +++ b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h @@ -7,7 +7,7 @@ #include "Volume.h" #include "Blob.h" -#include "Crypto/aes.h" +#include // --- this volume type is used for encrypted Wii images --- @@ -38,7 +38,7 @@ private: IBlobReader* m_pReader; u8* m_pBuffer; - AES_KEY m_AES_KEY; + aes_context* m_AES_ctx; u64 m_VolumeOffset; u64 dataOffset; diff --git a/Source/Core/DiscIO/Src/WbfsBlob.cpp b/Source/Core/DiscIO/Src/WbfsBlob.cpp index 3983bd5ff6..7a4d8d99d6 100644 --- a/Source/Core/DiscIO/Src/WbfsBlob.cpp +++ b/Source/Core/DiscIO/Src/WbfsBlob.cpp @@ -81,7 +81,7 @@ bool WbfsFileReader::ReadHeader() hd_sector_count = Common::swap32(hd_sector_count); m_files[0]->file.ReadBytes(&hd_sector_shift, 1); - hd_sector_size = 1 << hd_sector_shift; + hd_sector_size = 1ull << hd_sector_shift; if(m_size != hd_sector_count * hd_sector_size) { @@ -91,7 +91,7 @@ bool WbfsFileReader::ReadHeader() // Read wbfs cluster info m_files[0]->file.ReadBytes(&wbfs_sector_shift, 1); - wbfs_sector_size = 1 << wbfs_sector_shift; + wbfs_sector_size = 1ull << wbfs_sector_shift; wbfs_sector_count = m_size / wbfs_sector_size; if(wbfs_sector_size < wii_sector_size) @@ -138,13 +138,13 @@ File::IOFile& WbfsFileReader::SeekToCluster(u64 offset, u64* available) { u64 base_cluster = offset >> wbfs_sector_shift; if(base_cluster < m_blocks_per_disc) - { + { u64 cluster_address = wbfs_sector_size * Common::swap16(m_wlba_table[base_cluster]); u64 cluster_offset = offset & (wbfs_sector_size - 1); u64 final_address = cluster_address + cluster_offset; for(u32 i = 0; i != m_total_files; i ++) - { + { if(final_address < (m_files[i]->base_address + m_files[i]->size)) { m_files[i]->file.Seek(final_address - m_files[i]->base_address, SEEK_SET); @@ -187,7 +187,7 @@ bool IsWbfsBlob(const char* filename) u8 magic[4] = {0, 0, 0, 0}; f.ReadBytes(&magic, 4); - return (magic[0] == 'W') && + return (magic[0] == 'W') && (magic[1] == 'B') && (magic[2] == 'F') && (magic[3] == 'S'); diff --git a/Source/Core/DiscIO/Src/WbfsBlob.h b/Source/Core/DiscIO/Src/WbfsBlob.h index c59eb84173..b703d59931 100644 --- a/Source/Core/DiscIO/Src/WbfsBlob.h +++ b/Source/Core/DiscIO/Src/WbfsBlob.h @@ -18,7 +18,7 @@ class WbfsFileReader : public IBlobReader WbfsFileReader(const char* filename); ~WbfsFileReader(); - bool OpenFiles(const char* filename); + bool OpenFiles(const char* filename); bool ReadHeader(); File::IOFile& SeekToCluster(u64 offset, u64* available); diff --git a/Source/Core/DiscIO/Src/WiiWad.cpp b/Source/Core/DiscIO/Src/WiiWad.cpp index ed58977670..783ede511d 100644 --- a/Source/Core/DiscIO/Src/WiiWad.cpp +++ b/Source/Core/DiscIO/Src/WiiWad.cpp @@ -5,7 +5,7 @@ #include "NANDContentLoader.h" #include -#include +#include #include "MathUtil.h" #include "FileUtil.h" #include "Log.h" @@ -78,15 +78,15 @@ bool WiiWAD::ParseWAD(DiscIO::IBlobReader& _rReader) { CBlobBigEndianReader ReaderBig(_rReader); - // get header size + // get header size u32 HeaderSize = ReaderBig.Read32(0); - if (HeaderSize != 0x20) + if (HeaderSize != 0x20) { _dbg_assert_msg_(BOOT, (HeaderSize==0x20), "WiiWAD: Header size != 0x20"); return false; } - // get header + // get header u8 Header[0x20]; _rReader.Read(0, HeaderSize, Header); u32 HeaderType = ReaderBig.Read32(0x4); diff --git a/Source/Core/DiscIO/Src/WiiWad.h b/Source/Core/DiscIO/Src/WiiWad.h index 6f75585ecf..0711c82cb0 100644 --- a/Source/Core/DiscIO/Src/WiiWad.h +++ b/Source/Core/DiscIO/Src/WiiWad.h @@ -9,7 +9,7 @@ #include #include -#include "Common.h" +#include "CommonTypes.h" #include "Blob.h" #include "Volume.h" @@ -30,13 +30,13 @@ public: u32 GetTMDSize() const { return m_TMDSize; } u32 GetDataAppSize() const { return m_DataAppSize; } u32 GetFooterSize() const { return m_FooterSize; } - + u8* GetCertificateChain() const { return m_pCertificateChain; } u8* GetTicket() const { return m_pTicket; } u8* GetTMD() const { return m_pTMD; } u8* GetDataApp() const { return m_pDataApp; } u8* GetFooter() const { return m_pFooter; } - + static bool IsWiiWAD(const std::string& _rName); private: diff --git a/Source/Core/DiscIO/Src/stdafx.h b/Source/Core/DiscIO/Src/stdafx.h index 5d6c2c1c42..03a92c3b49 100644 --- a/Source/Core/DiscIO/Src/stdafx.h +++ b/Source/Core/DiscIO/Src/stdafx.h @@ -15,3 +15,5 @@ #endif // TODO: reference additional headers your program requires here + +#include diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index 62ce9808a2..23fb8d64f7 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -1,3 +1,7 @@ +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + option(SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF) +endif() + set(LIBS core ${LZO} discio @@ -8,6 +12,7 @@ set(LIBS core z sfml-network ${GTK2_LIBRARIES}) + if(NOT ANDROID) if(USE_X11) set(LIBS ${LIBS} ${X11_LIBRARIES} @@ -34,7 +39,7 @@ if(NOT ANDROID) endif() endif() else() - set(LIBS ${LIBS} png) + set(LIBS ${LIBS} png iconv) endif() if(LIBAV_FOUND) @@ -169,6 +174,13 @@ if(USE_UPNP) set(LIBS ${LIBS} miniupnpc) endif() +include(FindGettext) +if(GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE AND wxWidgets_FOUND) + file(GLOB LINGUAS ${CMAKE_SOURCE_DIR}/Languages/po/*.po) + add_custom_target(translations ALL) + GETTEXT_CREATE_TRANSLATIONS(${CMAKE_SOURCE_DIR}/Languages/po/dolphin-emu.pot ${LINGUAS}) +endif() + if(ANDROID) set(DOLPHIN_EXE main) add_library(${DOLPHIN_EXE} SHARED ${SRCS}) @@ -179,30 +191,15 @@ if(ANDROID) ${LIBS} "-Wl,--no-whole-archive" ) - if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") - set (SO_TARGET "mips") - endif() - if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7-a") - set (SO_TARGET "armeabi-v7a") - endif() - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv5te") - set (SO_TARGET "armeabi") - endif() - if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686") - set (SO_TARGET "x86") - endif() add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD - COMMAND mkdir ARGS -p ${CMAKE_SOURCE_DIR}/Source/Android/libs/${SO_TARGET} + COMMAND mkdir ARGS -p ${CMAKE_SOURCE_DIR}/Source/Android/libs/${ANDROID_NDK_ABI_NAME} ) add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD - COMMAND cp ARGS ${CMAKE_SOURCE_DIR}/libs/${SO_TARGET}/lib${DOLPHIN_EXE}.so ${CMAKE_SOURCE_DIR}/Source/Android/libs/${SO_TARGET}/ + COMMAND cp ARGS ${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}/lib${DOLPHIN_EXE}.so ${CMAKE_SOURCE_DIR}/Source/Android/libs/${ANDROID_NDK_ABI_NAME}/ ) add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD COMMAND cp ARGS ${CMAKE_SOURCE_DIR}/Data/Sys/GC/* ${CMAKE_SOURCE_DIR}/Source/Android/assets/ ) - add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD - COMMAND cp ARGS ${CMAKE_SOURCE_DIR}/Data/Sys/Wii/* ${CMAKE_SOURCE_DIR}/Source/Android/assets/ - ) else() add_executable(${DOLPHIN_EXE} ${SRCS}) target_link_libraries(${DOLPHIN_EXE} ${LIBS} ${WXLIBS}) @@ -216,47 +213,73 @@ else() MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ) - # Fix up the bundle after it is finished. - # There does not seem to be an easy way to run CMake commands post-build, - # so we invoke CMake again on a generated script. - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/postprocess_bundle.cmake " - include(BundleUtilities) - message(\"Fixing up application bundle: ${BUNDLE_PATH}\") - set(BU_CHMOD_BUNDLE_ITEMS ON) - fixup_bundle(\"${BUNDLE_PATH}\" \"\" \"\") - ") - add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD - COMMAND ${CMAKE_COMMAND} -P postprocess_bundle.cmake - ) + # get rid of any old copies + file (REMOVE_RECURSE ${BUNDLE_PATH}/Contents/Resources/Sys) + if(NOT SKIP_POSTPROCESS_BUNDLE) + # Fix up the bundle after it is finished. + # There does not seem to be an easy way to run CMake commands post-build, + # so we invoke CMake again on a generated script. + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/postprocess_bundle.cmake " + include(BundleUtilities) + message(\"Fixing up application bundle: ${BUNDLE_PATH}\") + message(\"(Note: This is only necessary to produce a redistributable binary.\") + message(\"To skip, pass -DSKIP_POSTPROCESS_BUNDLE=1 to cmake.)\") + set(BU_CHMOD_BUNDLE_ITEMS ON) + fixup_bundle(\"${BUNDLE_PATH}\" \"\" \"\") + file(INSTALL ${CMAKE_SOURCE_DIR}/Data/Sys + DESTINATION ${BUNDLE_PATH}/Contents/Resources + ) + ") + add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -P postprocess_bundle.cmake + ) + else() + add_custom_command(OUTPUT ${BUNDLE_PATH}/Contents/Resources/Sys + COMMAND ln -nfs ${CMAKE_SOURCE_DIR}/Data/Sys ${BUNDLE_PATH}/Contents/Resources/Sys + VERBATIM + ) + add_custom_target(CopyDataIntoBundle ALL + DEPENDS ${BUNDLE_PATH}/Contents/Resources/Sys + ) + endif() - # Copy data files into application bundle. - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/copy_data_into_bundle.cmake " - file(INSTALL ${CMAKE_SOURCE_DIR}/Data/Sys ${CMAKE_SOURCE_DIR}/Data/User - DESTINATION ${BUNDLE_PATH}/Contents/Resources + if(GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE AND wxWidgets_FOUND) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/copy_translations_into_bundle.cmake " + file(GLOB TRANSLATION_FILES RELATIVE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/*.gmo + ) + foreach(TRANSLATION_FILE \${TRANSLATION_FILES}) + string(REPLACE \".gmo\" \".lproj\" TRANSLATION_DIR + \${TRANSLATION_FILE} + ) + # It would be better to copy to the new name as a single action, + # but I can't figure out a way to let CMake do that. + file(COPY ${CMAKE_CURRENT_BINARY_DIR}/\${TRANSLATION_FILE} + DESTINATION ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR} + NO_SOURCE_PERMISSIONS + ) + file(RENAME + ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR}/\${TRANSLATION_FILE} + ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR}/dolphin-emu.mo + ) + endforeach(TRANSLATION_FILE) + ") + + file(GLOB PO_FILES RELATIVE ${CMAKE_SOURCE_DIR}/Languages/po + ${CMAKE_SOURCE_DIR}/Languages/po/*.po ) - file(GLOB TRANSLATION_FILES RELATIVE ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}/*.gmo + string(REPLACE .po .gmo GMO_FILES "${PO_FILES}") + + add_custom_command(OUTPUT ${BUNDLE_PATH}/Contents/Resources/en.lproj + COMMAND ${CMAKE_COMMAND} -P copy_translations_into_bundle.cmake + DEPENDS ${GMO_FILES} + ${CMAKE_SOURCE_DIR}/Data/Sys + VERBATIM ) - foreach(TRANSLATION_FILE \${TRANSLATION_FILES}) - string(REPLACE \".gmo\" \".lproj\" TRANSLATION_DIR - \${TRANSLATION_FILE} - ) - # It would be better to copy to the new name as a single action, - # but I can't figure out a way to let CMake do that. - file(COPY ${CMAKE_BINARY_DIR}/\${TRANSLATION_FILE} - DESTINATION ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR} - NO_SOURCE_PERMISSIONS - ) - file(RENAME - ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR}/\${TRANSLATION_FILE} - ${BUNDLE_PATH}/Contents/Resources/\${TRANSLATION_DIR}/dolphin-emu.mo - ) - endforeach(TRANSLATION_FILE) - ") - add_custom_target(CopyDataIntoBundle ALL - COMMAND ${CMAKE_COMMAND} -P copy_data_into_bundle.cmake - VERBATIM - ) + add_custom_target(CopyTranslationsIntoBundle ALL + DEPENDS ${BUNDLE_PATH}/Contents/Resources/en.lproj + ) + endif() # Install bundle into systemwide /Applications directory. install(DIRECTORY ${BUNDLE_PATH} DESTINATION /Applications diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj deleted file mode 100644 index b3004aaa98..0000000000 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ /dev/null @@ -1,397 +0,0 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {1B099EF8-6F87-47A2-A3E7-898A24584F49} - Dolphin - - - - Application - true - Unicode - - - Application - true - Unicode - - - Application - false - Unicode - false - - - Application - false - Unicode - - - Application - false - Unicode - - - Application - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ProjectName)D - - - $(ProjectName)D - - - - - - - - $(ProjectName)DF - - - - $(ProjectName)DF - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win32\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win64\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win32\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win32\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win64\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - - - ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories) - - - - xcopy "$(SolutionDir)..\Data" "$(TargetDir)" /e /s /y /d -echo Copying External .dlls -xcopy "$(SolutionDir)..\Externals\OpenAL\Win64\*.dll" "$(TargetDir)" /e /s /y /q /d -xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /s /y /q /d - - Copying Data\* to $(TargetDir) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {cd3d4c3c-1027-4d33-b047-aec7b56d0bf6} - - - {01573c36-ac6e-49f6-94ba-572517eb9740} - - - {d8890b98-26f7-4cff-bbfb-b95f371b5f20} - - - {a680190d-0764-485b-9cf3-a82c5edd5715} - - - {93d73454-2512-424e-9cda-4bb357fe13dd} - - - {1c8436c9-dbaf-42be-83bc-cf3ec9175abe} - - - {3e1339f5-9311-4122-9442-369702e8fcad} - - - {9a4c733c-bade-4ac6-b58a-6e274395e90e} - - - {dc7d7af4-ce47-49e8-8b63-265cb6233a49} - - - {1909cd2d-1707-456f-86ca-0df42a727c99} - - - {9e9da440-e9ad-413c-b648-91030e792211} - - - {37d007bd-d66c-4eaf-b56c-bd1aac340a05} - - - {c87a4178-44f6-49b2-b7aa-c79af1b8c534} - - - {8c60e805-0da5-4e25-8f84-038db504bb0d} - - - {b6398059-ebb6-4c34-b547-95f365b71ff4} - - - {b39ac394-5db5-4da9-9d98-09d46ca3701f} - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - - - - \ No newline at end of file diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj.user b/Source/Core/DolphinWX/Dolphin.vcxproj.user deleted file mode 100644 index ac67ec629b..0000000000 --- a/Source/Core/DolphinWX/Dolphin.vcxproj.user +++ /dev/null @@ -1,29 +0,0 @@ - - - - $(TargetDir) - WindowsLocalDebugger - -d - - - $(TargetDir) - WindowsLocalDebugger - - - $(TargetDir) - WindowsLocalDebugger - - - $(TargetDir) - WindowsLocalDebugger - -d - - - $(TargetDir) - WindowsLocalDebugger - - - $(TargetDir) - WindowsLocalDebugger - - \ No newline at end of file diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj b/Source/Core/DolphinWX/DolphinWX.vcxproj new file mode 100644 index 0000000000..14eacfd440 --- /dev/null +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj @@ -0,0 +1,244 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {47411FDB-1BF2-48D0-AB4E-C7C41160F898} + Dolphin + + + + Application + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + 0x00400000 + false + true + ..\..\..\Externals\SDL2-2.0.1\lib\$(PlatformName);..\..\..\Externals\OpenAL\$(PlatformName);%(AdditionalLibraryDirectories) + dsound.lib;iphlpapi.lib;winmm.lib;setupapi.lib;vfw32.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;OpenAL32.lib;%(AdditionalDependencies) + + + ..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {8ada04d7-6db1-4da4-ab55-64fb12a0997b} + + + {aa862e5e-a993-497a-b6a0-0e8e94b10050} + + + {4c9f135b-a85e-430c-bad4-4c67ef5fc12c} + + + {ab993f38-c31d-4897-b139-a620c42bc565} + + + {31643fdb-1bb8-4965-9de7-000fc88d35ae} + + + {93d73454-2512-424e-9cda-4bb357fe13dd} + + + {1c8436c9-dbaf-42be-83bc-cf3ec9175abe} + + + {ff213b23-2c26-4214-9f88-85271e557e87} + + + {54aa7840-5beb-4a0c-9452-74ba4cc7fd44} + + + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} + + + {41279555-f94f-4ebc-99de-af863c10c5c4} + + + {e54cf649-140e-4255-81a5-30a673c1fb36} + + + {160bdc25-5626-4b0d-bdd8-2953d9777fb5} + + + {6bbd47cf-91fd-4077-b676-8b76980178a9} + + + {96020103-4ba5-4fd2-b4aa-5b6d24492d4e} + + + {ec1a314c-5588-4506-9c1e-2e58e5817f75} + + + {a4c423aa-f57c-46c7-a172-d1a777017d29} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj.filters b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters similarity index 91% rename from Source/Core/DolphinWX/Dolphin.vcxproj.filters rename to Source/Core/DolphinWX/DolphinWX.vcxproj.filters index dfc0697230..94d3eab1ed 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj.filters +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters @@ -1,303 +1,305 @@ - - - - - - - - - - GUI\Saves - - - GUI\NetPlay - - - GUI\InputConfig - - - GUI\InputConfig - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - Misc - - - GUI - - - GUI\Debugger - - - GUI\Video - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Video - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI - - - GUI - - - GUI - - - - - - - - - - GUI\Saves - - - GUI\NetPlay - - - GUI\InputConfig - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - GUI - - - Misc - - - Resources - - - GUI - - - GUI\Debugger - - - GUI\Video - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Video - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI\Debugger - - - GUI - - - GUI - - - GUI - - - - - - - - - Resources - - - - - {2f20d058-1119-4738-bda8-90fe900e8d69} - - - {70eb2f12-fab7-4953-8ad1-a981837c3a7e} - - - {38fc863a-0392-4c5d-ab28-7fe1f70e8a70} - - - {3727fb17-2efd-43ce-b71f-d110f0f40474} - - - {0721c9ae-4d49-49d6-997b-3731f8ab64cc} - - - {9dd3ef96-b03a-4c14-9d35-6a4850acd430} - - - {8ab1ce40-f5e7-47b8-9706-59c924af4eaa} - - - {ff5180be-244f-4c0e-8a35-bd4bffb6a343} - - - - - Resources - - + + + + + {0c0288ac-1168-4534-b3d3-051b9981f842} + + + {ef70fd67-8f30-467a-8af0-ea0d48837f04} + + + {d0d9afb4-2b02-45c4-b6fc-91b9ae53a18c} + + + {fb02111e-3fe2-4ded-a594-7a56048f97b5} + + + {80626e3b-e13b-41c3-bd63-4ef1faf92924} + + + {7dc222d2-f1f0-44af-b4eb-76f6ca6cc29f} + + + {4352dc64-398e-4a96-ba4a-824dffa2004c} + + + {d6bc4dd6-06ed-46ad-b327-04afb26e10ec} + + + + + + + + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\InputConfig + + + GUI\InputConfig + + + GUI\NetPlay + + + GUI\Saves + + + GUI\Video + + + GUI\Video + + + Misc + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + + + + + + + + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\Debugger + + + GUI\InputConfig + + + GUI\NetPlay + + + GUI\Saves + + + GUI\Video + + + GUI\Video + + + Misc + + + Resources + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + GUI + + + + + + + + + Resources + + + + + Resources + + \ No newline at end of file diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj.user b/Source/Core/DolphinWX/DolphinWX.vcxproj.user new file mode 100644 index 0000000000..ff24062772 --- /dev/null +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj.user @@ -0,0 +1,9 @@ + + + + + $(BinaryOutputDir)$(TargetFileName) + $(BinaryOutputDir) + WindowsLocalDebugger + + \ No newline at end of file diff --git a/Source/Core/DolphinWX/Info.plist.in b/Source/Core/DolphinWX/Info.plist.in index f08863a5d9..c9e0eaaeb7 100644 --- a/Source/Core/DolphinWX/Info.plist.in +++ b/Source/Core/DolphinWX/Info.plist.in @@ -14,6 +14,7 @@ gcz iso wad + wbfs CFBundleTypeIconFile Dolphin.icns @@ -34,14 +35,30 @@ CFBundleLocalizations ar + ca + cs + de el en es + fa fr + he hu + it + ja + ko + nb + nl + pl pt pt_BR + ru + sr + sv tr + zh_CN + zh_TW CFBundlePackageType APPL diff --git a/Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp b/Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp index f0fd91abdb..d3dacf5fdf 100644 --- a/Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp +++ b/Source/Core/DolphinWX/Src/ARCodeAddEdit.cpp @@ -38,7 +38,7 @@ CARCodeAddEdit::CARCodeAddEdit(int _selection, wxWindow* parent, wxWindowID id, EditCheatName = new wxTextCtrl(this, ID_EDITCHEAT_NAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); EditCheatName->SetValue(currentName); EntrySelection = new wxSpinButton(this, ID_ENTRY_SELECT, wxDefaultPosition, wxDefaultSize, wxVERTICAL); - EntrySelection->SetRange(1, ((int)arCodes.size()) > 0 ? (int)arCodes.size() : 1); + EntrySelection->SetRange(1, ((int)arCodes.size()) > 0 ? (int)arCodes.size() : 1); EntrySelection->SetValue((int)(arCodes.size() - selection)); EditCheatCode = new wxTextCtrl(this, ID_EDITCHEAT_CODE, wxEmptyString, wxDefaultPosition, wxSize(300, 100), wxTE_MULTILINE); UpdateTextCtrl(tempEntries); @@ -108,9 +108,9 @@ void CARCodeAddEdit::SaveCheatData(wxCommandEvent& WXUNUSED (event)) } // If the above-mentioned conditions weren't met, then something went wrong. - if (!PanicYesNoT("Unable to parse line %lu of the entered AR code as a valid " + if (!PanicYesNoT("Unable to parse line %u of the entered AR code as a valid " "encrypted or decrypted code. Make sure you typed it correctly.\n" - "Would you like to ignore this line and continue parsing?", i + 1)) + "Would you like to ignore this line and continue parsing?", (unsigned) (i + 1))) { return; } @@ -158,8 +158,8 @@ void CARCodeAddEdit::UpdateTextCtrl(ActionReplay::ARCode arCode) if (arCode.name != "") { - for (u32 i = 0; i < arCode.ops.size(); i++) - EditCheatCode->AppendText(wxString::Format(wxT("%08X %08X\n"), arCode.ops.at(i).cmd_addr, arCode.ops.at(i).value)); + for (auto& op : arCode.ops) + EditCheatCode->AppendText(wxString::Format(wxT("%08X %08X\n"), op.cmd_addr, op.value)); } else { diff --git a/Source/Core/DolphinWX/Src/AboutDolphin.cpp b/Source/Core/DolphinWX/Src/AboutDolphin.cpp index 72d488e7af..610e343a51 100644 --- a/Source/Core/DolphinWX/Src/AboutDolphin.cpp +++ b/Source/Core/DolphinWX/Src/AboutDolphin.cpp @@ -6,7 +6,6 @@ #include "AboutDolphin.h" #include "WxUtils.h" #include "../resources/dolphin_logo.cpp" -#include "scmrev.h" AboutDolphin::AboutDolphin(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, @@ -18,39 +17,39 @@ AboutDolphin::AboutDolphin(wxWindow *parent, wxWindowID id, wxStaticBitmap* const sbDolphinLogo = new wxStaticBitmap(this, wxID_ANY, wxBitmap(iDolphinLogo)); - std::string Text = "Dolphin " SCM_DESC_STR "\n" - "Copyright (c) 2003-2013+ Dolphin Team\n" - "\n" - "Branch: " SCM_BRANCH_STR "\n" - "Revision: " SCM_REV_STR "\n" - "Compiled: " __DATE__ " @ " __TIME__ "\n" - "\n" - "Dolphin is a Gamecube/Wii emulator, which was\n" - "originally written by F|RES and ector.\n" - "Today Dolphin is an open source project with many\n" - "contributors, too many to list.\n" - "If interested, just go check out the project page at\n" - "http://code.google.com/p/dolphin-emu/ .\n" - "\n" - "Special thanks to Bushing, Costis, CrowTRobo,\n" - "Marcan, Segher, Titanik, or9 and Hotquik for their\n" - "reverse engineering and docs/demos.\n" - "\n" - "Big thanks to Gilles Mouchard whose Microlib PPC\n" - "emulator gave our development a kickstart.\n" - "\n" - "Thanks to Frank Wille for his PowerPC disassembler,\n" - "which or9 and we modified to include Gekko specifics.\n" - "\n" - "Thanks to hcs/destop for their GC ADPCM decoder.\n" - "\n" - "We are not affiliated with Nintendo in any way.\n" - "Gamecube and Wii are trademarks of Nintendo.\n" - "The emulator is for educational purposes only\n" - "and should not be used to play games you do\n" - "not legally own."; - wxStaticText* const Message = new wxStaticText(this, wxID_ANY, - StrToWxStr(Text)); + const wxString Text = wxString::Format(_("Dolphin %s\n" + "Copyright (c) 2003-2013+ Dolphin Team\n" + "\n" + "Branch: %s\n" + "Revision: %s\n" + "Compiled: %s @ %s\n" + "\n" + "Dolphin is a Gamecube/Wii emulator, which was\n" + "originally written by F|RES and ector.\n" + "Today Dolphin is an open source project with many\n" + "contributors, too many to list.\n" + "If interested, just go check out the project page at\n" + "http://code.google.com/p/dolphin-emu/ .\n" + "\n" + "Special thanks to Bushing, Costis, CrowTRobo,\n" + "Marcan, Segher, Titanik, or9 and Hotquik for their\n" + "reverse engineering and docs/demos.\n" + "\n" + "Big thanks to Gilles Mouchard whose Microlib PPC\n" + "emulator gave our development a kickstart.\n" + "\n" + "Thanks to Frank Wille for his PowerPC disassembler,\n" + "which or9 and we modified to include Gekko specifics.\n" + "\n" + "Thanks to hcs/destop for their GC ADPCM decoder.\n" + "\n" + "We are not affiliated with Nintendo in any way.\n" + "Gamecube and Wii are trademarks of Nintendo.\n" + "The emulator should not be used to play games\n" + "you do not legally own."), + scm_desc_str, scm_branch_str, scm_rev_git_str, __DATE__, __TIME__); + + wxStaticText* const Message = new wxStaticText(this, wxID_ANY, Text); Message->Wrap(GetSize().GetWidth()); wxBoxSizer* const sInfo = new wxBoxSizer(wxVERTICAL); diff --git a/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp b/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp index 15cc371126..c8a190cea1 100644 --- a/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp +++ b/Source/Core/DolphinWX/Src/Android/ButtonManager.cpp @@ -55,7 +55,7 @@ namespace ButtonManager "InputL", "InputR" }; const int configStringNum = 20; - + void AddBind(std::string dev, sBind *bind) { auto it = m_controllers.find(dev); @@ -93,9 +93,9 @@ namespace ButtonManager { hasbind = true; type = BIND_AXIS; - sscanf(value.c_str(), "Device '%[^\']'-Axis %d%c", dev, &bindnum, &modifier); + sscanf(value.c_str(), "Device '%[^\']'-Axis %d%c", dev, &bindnum, &modifier); } - else if (std::string::npos != value.find("Button")) + else if (std::string::npos != value.find("Button")) { hasbind = true; type = BIND_BUTTON; @@ -123,7 +123,7 @@ namespace ButtonManager auto it = m_controllers.begin(); if (it == m_controllers.end()) return 0.0f; - return it->second->AxisValue(axis); + return it->second->AxisValue(axis); } void TouchEvent(int action, float x, float y) { @@ -177,19 +177,15 @@ namespace ButtonManager delete *it; for (auto it = m_controllers.begin(); it != m_controllers.end(); ++it) delete it->second; + m_controllers.clear(); + m_buttons.clear(); } void DrawButtons() { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it) - DrawButton((*it)->GetTexture(), (*it)->GetCoords()); - - glDisable(GL_BLEND); + // XXX: Make platform specific drawing } - + // InputDevice void InputDevice::PressEvent(int button, int action) { @@ -216,8 +212,8 @@ namespace ButtonManager return 0.0f; if (it->second->m_bindtype == BIND_BUTTON) return ButtonValue(axis); - else + else return m_axises[it->second->m_bind] * it->second->m_neg; } - + } diff --git a/Source/Core/DolphinWX/Src/Android/ButtonManager.h b/Source/Core/DolphinWX/Src/Android/ButtonManager.h index c312b9786a..484332bc03 100644 --- a/Source/Core/DolphinWX/Src/Android/ButtonManager.h +++ b/Source/Core/DolphinWX/Src/Android/ButtonManager.h @@ -21,6 +21,7 @@ #include #include "CommonPaths.h" #include "Android/TextureLoader.h" +#include "VideoBackendBase.h" namespace ButtonManager { @@ -60,14 +61,18 @@ namespace ButtonManager class Button { private: - GLuint m_tex; + int m_tex; ButtonType m_button; ButtonState m_state; float m_coords[8]; public: Button(std::string filename, ButtonType button, float *coords) { - m_tex = LoadPNG((std::string(DOLPHIN_DATA_DIR "/") + filename).c_str()); + u32 width, height; + char *image; + // image = LoadPNG((std::string(DOLPHIN_DATA_DIR "/") + filename).c_str(), width, height); + // XXX: Make platform specific drawing + m_button = button; memcpy(m_coords, coords, sizeof(float) * 8); m_state = BUTTON_RELEASED; @@ -82,8 +87,8 @@ namespace ButtonManager ButtonType GetButtonType() { return m_button; } GLuint GetTexture() { return m_tex; } float *GetCoords() { return m_coords; } - - ~Button() { if(m_tex) glDeleteTextures(1, &m_tex); } + + ~Button() { } }; struct sBind @@ -92,11 +97,11 @@ namespace ButtonManager const BindType m_bindtype; const int m_bind; const float m_neg; - sBind(ButtonType buttontype, BindType bindtype, int bind, float neg) - : m_buttontype(buttontype), m_bindtype(bindtype), m_bind(bind), m_neg(neg) + sBind(ButtonType buttontype, BindType bindtype, int bind, float neg) + : m_buttontype(buttontype), m_bindtype(bindtype), m_bind(bind), m_neg(neg) {} }; - + class InputDevice { @@ -113,9 +118,9 @@ namespace ButtonManager ~InputDevice() { for (auto it = m_binds.begin(); it != m_binds.end(); ++it) - delete it->second; + delete it->second; } - void AddBind(sBind *bind) { m_binds[bind->m_buttontype] = bind; } + void AddBind(sBind *bind) { m_binds[bind->m_buttontype] = bind; } void PressEvent(int button, int action); void AxisEvent(int axis, float value); bool ButtonValue(ButtonType button); diff --git a/Source/Core/DolphinWX/Src/Android/TextureLoader.cpp b/Source/Core/DolphinWX/Src/Android/TextureLoader.cpp index 077cf32a1a..de4c3ee093 100644 --- a/Source/Core/DolphinWX/Src/Android/TextureLoader.cpp +++ b/Source/Core/DolphinWX/Src/Android/TextureLoader.cpp @@ -17,8 +17,7 @@ #include "GLInterface.h" #include - -GLuint LoadPNG(const char *filename) +char* LoadPNG(const char *filename, u32 &width, u32 &height) { FILE *infile; /* PNG file pointer */ png_structp png_ptr; /* internally used by libpng */ @@ -31,8 +30,8 @@ GLuint LoadPNG(const char *filename) int bit_depth; int color_type; - png_uint_32 width; /* PNG image width in pixels */ - png_uint_32 height; /* PNG image height in pixels */ + png_uint_32 _width; + png_uint_32 _height; unsigned int rowbytes; /* raw bytes at row n in image */ image_data = NULL; @@ -41,8 +40,8 @@ GLuint LoadPNG(const char *filename) /* Open the file. */ infile = fopen(filename, "rb"); - if (!infile) - return 0; + if (!infile) + return NULL; /* * 13.3 readpng_init() @@ -53,46 +52,46 @@ GLuint LoadPNG(const char *filename) if (!png_check_sig((unsigned char *) sig, 8)) { fclose(infile); - return 0; + return NULL; } - /* - * Set up the PNG structs + /* + * Set up the PNG structs */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fclose(infile); - return 4; /* out of memory */ + return NULL; /* out of memory */ } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp) NULL, (png_infopp) NULL); fclose(infile); - return 4; /* out of memory */ + return NULL; /* out of memory */ } /* - * block to handle libpng errors, + * block to handle libpng errors, * then check whether the PNG file had a bKGD chunk */ if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(infile); - return 0; + return NULL; } - /* - * takes our file stream pointer (infile) and + /* + * takes our file stream pointer (infile) and * stores it in the png_ptr struct for later use. */ /* png_ptr->io_ptr = (png_voidp)infile;*/ png_init_io(png_ptr, infile); /* - * lets libpng know that we already checked the 8 - * signature bytes, so it should not expect to find + * lets libpng know that we already checked the 8 + * signature bytes, so it should not expect to find * them at the current file pointer location */ png_set_sig_bytes(png_ptr, 8); @@ -100,25 +99,25 @@ GLuint LoadPNG(const char *filename) /* Read the image */ /* - * reads and processes not only the PNG file's IHDR chunk - * but also any other chunks up to the first IDAT + * reads and processes not only the PNG file's IHDR chunk + * but also any other chunks up to the first IDAT * (i.e., everything before the image data). */ /* read all the info up to the image data */ png_read_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, + png_get_IHDR(png_ptr, info_ptr, &_width, &_height, &bit_depth, &color_type, NULL, NULL, NULL); /* Set up some transforms. */ - if (bit_depth > 8) + if (bit_depth > 8) png_set_strip_16(png_ptr); - - if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + + if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); - if (color_type == PNG_COLOR_TYPE_PALETTE) + if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); /* Update the png info struct.*/ @@ -129,22 +128,22 @@ GLuint LoadPNG(const char *filename) /* Allocate the image_data buffer. */ - if ((image_data = (char *) malloc(rowbytes * height))==NULL) { + if ((image_data = (char *) malloc(rowbytes * _height))==NULL) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return 4; + return NULL; } - if ((row_pointers = (png_bytepp)malloc(height*sizeof(png_bytep))) == NULL) { + if ((row_pointers = (png_bytepp)malloc(_height*sizeof(png_bytep))) == NULL) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(image_data); image_data = NULL; - return 4; + return NULL; } /* set the individual row_pointers to point at the correct offsets */ - for (i = 0; i < height; ++i) + for (i = 0; i < _height; ++i) row_pointers[i] = (png_byte*)(image_data + i*rowbytes); @@ -161,19 +160,7 @@ GLuint LoadPNG(const char *filename) png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(infile); - GLuint Texture = 0; - glGenTextures(1, &Texture); - - /* create a new texture object - * and bind it to texname (unsigned integer > 0) - */ - glBindTexture(GL_TEXTURE_2D, Texture); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image_data); - return Texture; + width = (u32)_width; + height = (u32)_height; + return image_data; } diff --git a/Source/Core/DolphinWX/Src/Android/TextureLoader.h b/Source/Core/DolphinWX/Src/Android/TextureLoader.h index 69575807e6..db55078f1d 100644 --- a/Source/Core/DolphinWX/Src/Android/TextureLoader.h +++ b/Source/Core/DolphinWX/Src/Android/TextureLoader.h @@ -17,5 +17,5 @@ #include "GLInterface.h" -GLuint LoadPNG(const char *filename); +char* LoadPNG(const char *filename, u32 &width, u32 &height); diff --git a/Source/Core/DolphinWX/Src/CheatsWindow.cpp b/Source/Core/DolphinWX/Src/CheatsWindow.cpp index 7d92d7cb04..8bea682734 100644 --- a/Source/Core/DolphinWX/Src/CheatsWindow.cpp +++ b/Source/Core/DolphinWX/Src/CheatsWindow.cpp @@ -5,6 +5,7 @@ #include "Globals.h" #include "CheatsWindow.h" #include "ActionReplay.h" +#include "CommonPaths.h" #include "Core.h" #include "ConfigManager.h" #include "VolumeHandler.h" @@ -14,8 +15,6 @@ #include "WxUtils.h" #define MAX_CHEAT_SEARCH_RESULTS_DISPLAY 256 -const wxString title = _("Cheats Manager"); - extern std::vector arCodes; extern CFrame* main_frame; @@ -23,7 +22,7 @@ extern CFrame* main_frame; static wxCheatsWindow *g_cheat_window; wxCheatsWindow::wxCheatsWindow(wxWindow* const parent) - : wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxDIALOG_NO_PARENT) + : wxDialog(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxDIALOG_NO_PARENT) { ::g_cheat_window = this; @@ -74,7 +73,7 @@ void wxCheatsWindow::Init_ChildControls() sizer_tab_cheats->Add(m_CheckListBox_CheatsList, 1, wxEXPAND | wxTOP | wxBOTTOM | wxLEFT, 10); sizer_tab_cheats->Add(sGroupBoxInfo, 0, wxALIGN_LEFT | wxEXPAND | wxALL, 5); - m_Tab_Cheats->SetSizerAndFit(sizer_tab_cheats); + m_Tab_Cheats->SetSizerAndFit(sizer_tab_cheats); // $ Cheat Search Tab wxPanel* const tab_cheat_search = new CheatSearchTab(m_Notebook_Main); @@ -243,14 +242,17 @@ void wxCheatsWindow::OnEvent_Close(wxCloseEvent& ev) void wxCheatsWindow::UpdateGUI() { // load code - m_gameini_path = File::GetUserPath(D_GAMECONFIG_IDX) + Core::g_CoreStartupParameter.GetUniqueID() + ".ini"; - m_gameini.Load(m_gameini_path); + m_gameini_default = Core::g_CoreStartupParameter.LoadDefaultGameIni(); + m_gameini_local = Core::g_CoreStartupParameter.LoadLocalGameIni(); + m_gameini_local_path = Core::g_CoreStartupParameter.m_strGameIniLocal; Load_ARCodes(); Load_GeckoCodes(); // enable controls button_apply->Enable(Core::IsRunning()); + wxString title = _("Cheats Manager"); + // write the ISO name in the title if (Core::IsRunning()) SetTitle(title + ": " + Core::g_CoreStartupParameter.GetUniqueID() + " - " + Core::g_CoreStartupParameter.m_strName); @@ -283,7 +285,7 @@ void wxCheatsWindow::Load_ARCodes() void wxCheatsWindow::Load_GeckoCodes() { - m_geckocode_panel->LoadCodes(m_gameini, Core::g_CoreStartupParameter.GetUniqueID(), true); + m_geckocode_panel->LoadCodes(m_gameini_default, m_gameini_local, Core::g_CoreStartupParameter.GetUniqueID(), true); } void wxCheatsWindow::OnEvent_CheatsList_ItemSelected(wxCommandEvent& WXUNUSED (event)) @@ -338,10 +340,10 @@ void wxCheatsWindow::OnEvent_ApplyChanges_Press(wxCommandEvent& ev) Gecko::SetActiveCodes(m_geckocode_panel->GetCodes()); // Save gameini, with changed gecko codes - if (m_gameini_path.size()) + if (m_gameini_local_path.size()) { - Gecko::SaveCodes(m_gameini, m_geckocode_panel->GetCodes()); - m_gameini.Save(m_gameini_path); + Gecko::SaveCodes(m_gameini_local, m_geckocode_panel->GetCodes()); + m_gameini_local.Save(m_gameini_local_path); } ev.Skip(); @@ -592,7 +594,7 @@ CreateCodeDialog::CreateCodeDialog(wxWindow* const parent, const u32 address) sizer_main->Add(textctrl_code, 0, wxALL, 5); sizer_main->Add(sizer_value_label, 0, wxALL, 5); sizer_main->Add(textctrl_value, 0, wxALL, 5); - sizer_main->Add(CreateButtonSizer(wxOK | wxCANCEL | wxNO_DEFAULT), 0, wxALL, 5); + sizer_main->Add(CreateButtonSizer(wxOK | wxCANCEL | wxNO_DEFAULT), 0, wxALL, 5); Bind(wxEVT_COMMAND_BUTTON_CLICKED, &CreateCodeDialog::PressOK, this, wxID_OK); Bind(wxEVT_COMMAND_BUTTON_CLICKED, &CreateCodeDialog::PressCancel, this, wxID_CANCEL); diff --git a/Source/Core/DolphinWX/Src/CheatsWindow.h b/Source/Core/DolphinWX/Src/CheatsWindow.h index 244e4d5b48..c7cdb7f151 100644 --- a/Source/Core/DolphinWX/Src/CheatsWindow.h +++ b/Source/Core/DolphinWX/Src/CheatsWindow.h @@ -130,8 +130,9 @@ class wxCheatsWindow : public wxDialog std::vector indexList; Gecko::CodeConfigPanel *m_geckocode_panel; - IniFile m_gameini; - std::string m_gameini_path; + IniFile m_gameini_default; + IniFile m_gameini_local; + std::string m_gameini_local_path; void Init_ChildControls(); diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index 4ae51d78a1..0dfa714318 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -30,6 +30,7 @@ #include "HotkeyDlg.h" #include "Main.h" #include "VideoBackendBase.h" +#include "NetPlayProto.h" #define TEXT_BOX(page, text) new wxStaticText(page, wxID_ANY, text, wxDefaultPosition, wxDefaultSize) @@ -42,6 +43,7 @@ const CPUCore CPUCores[] = { {0, wxTRANSLATE("Interpreter (VERY slow)")}, #ifdef _M_ARM {3, wxTRANSLATE("Arm JIT (experimental)")}, + {4, wxTRANSLATE("Arm JITIL (experimental)")}, #else {1, wxTRANSLATE("JIT Recompiler (recommended)")}, {2, wxTRANSLATE("JITIL experimental recompiler")}, @@ -101,7 +103,7 @@ static const wxLanguage langIds[] = #define WXSTR_TRANS(a) wxString(wxGetTranslation(wxT(a))) #ifdef WIN32 //only used with xgettext to be picked up as translatable string. -//win32 does not have wx on its path, the provided wxALL_FILES +//win32 does not have wx on its path, the provided wxALL_FILES //translation does not work there. #define unusedALL_FILES wxTRANSLATE("All files (*.*)|*.*"); #endif @@ -183,9 +185,9 @@ CConfigMain::CConfigMain(wxWindow* parent, wxWindowID id, const wxString& title, CreateGUIControls(); // Update selected ISO paths - for(u32 i = 0; i < SConfig::GetInstance().m_ISOFolder.size(); i++) + for(auto& folder : SConfig::GetInstance().m_ISOFolder) { - ISOPaths->Append(StrToWxStr(SConfig::GetInstance().m_ISOFolder[i])); + ISOPaths->Append(StrToWxStr(folder)); } } @@ -214,7 +216,7 @@ void CConfigMain::UpdateGUI() CPUThread->Disable(); SkipIdle->Disable(); EnableCheats->Disable(); - + CPUEngine->Disable(); _NTSCJ->Disable(); @@ -249,14 +251,14 @@ void CConfigMain::InitializeGUILists() arrayStringFor_Framelimit.Add(wxString::Format(wxT("%i"), i)); // Emulator Engine - for (unsigned int a = 0; a < (sizeof(CPUCores) / sizeof(CPUCore)); ++a) - arrayStringFor_CPUEngine.Add(wxGetTranslation(CPUCores[a].name)); - - // DSP Engine + for (auto& CPUCores_a : CPUCores) + arrayStringFor_CPUEngine.Add(wxGetTranslation(CPUCores_a.name)); + + // DSP Engine arrayStringFor_DSPEngine.Add(_("DSP HLE emulation (fast)")); arrayStringFor_DSPEngine.Add(_("DSP LLE recompiler")); arrayStringFor_DSPEngine.Add(_("DSP LLE interpreter (slow)")); - + // Gamecube page // GC Language arrayStrings arrayStringFor_GCSystemLang.Add(_("English")); @@ -266,16 +268,16 @@ void CConfigMain::InitializeGUILists() arrayStringFor_GCSystemLang.Add(_("Italian")); arrayStringFor_GCSystemLang.Add(_("Dutch")); - + // Wii page // Sensorbar Position arrayStringFor_WiiSensBarPos.Add(_("Bottom")); arrayStringFor_WiiSensBarPos.Add(_("Top")); - + // Aspect ratio arrayStringFor_WiiAspectRatio.Add(wxT("4:3")); arrayStringFor_WiiAspectRatio.Add(wxT("16:9")); - + // Wii Language arrayStrings arrayStringFor_WiiSystemLang = arrayStringFor_GCSystemLang; arrayStringFor_WiiSystemLang.Insert(_("Japanese"), 0); @@ -316,7 +318,7 @@ void CConfigMain::InitializeGUILists() void CConfigMain::InitializeGUIValues() { const SCoreStartupParameter& startup_params = SConfig::GetInstance().m_LocalCoreStartupParameter; - + // General - Basic CPUThread->SetValue(startup_params.bCPUThread); SkipIdle->SetValue(startup_params.bSkipIdle); @@ -471,7 +473,7 @@ void CConfigMain::InitializeGUIValues() WiiEuRGB60->SetValue(!!SConfig::GetInstance().m_SYSCONF->GetData("IPL.E60")); WiiAspectRatio->SetSelection(SConfig::GetInstance().m_SYSCONF->GetData("IPL.AR")); WiiSystemLang->SetSelection(SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG")); - + // Wii - Devices WiiSDCard->SetValue(SConfig::GetInstance().m_WiiSDCard); WiiKeyboard->SetValue(SConfig::GetInstance().m_WiiKeyboard); @@ -502,7 +504,7 @@ void CConfigMain::InitializeGUITooltips() InterfaceLang->SetToolTip(_("Change the language of the user interface.\nRequires restart.")); // Audio tooltips - DSPThread->SetToolTip(_("Run DSP HLE and LLE on a dedicated thread (not recommended: might cause audio glitches with HLE and freezes with LLE).")); + DSPThread->SetToolTip(_("Run DSP LLE on a dedicated thread (not recommended: might cause freezes).")); BackendSelection->SetToolTip(_("Changing this will have no effect while the emulator is running!")); // Gamecube - Devices @@ -513,10 +515,8 @@ void CConfigMain::InitializeGUITooltips() #if defined(__APPLE__) DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on OSX.")); -#elif defined(__linux__) +#else DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only.")); -#elif defined(_WIN32) - DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only. May need to rename soft_oal.dll to OpenAL32.dll to make it work.")); #endif Latency->SetToolTip(_("Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL backend only.")); @@ -525,7 +525,7 @@ void CConfigMain::InitializeGUITooltips() void CConfigMain::CreateGUIControls() { InitializeGUILists(); - + // Create the notebook and pages Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize); wxPanel* const GeneralPage = new wxPanel(Notebook, ID_GENERALPAGE, wxDefaultPosition, wxDefaultSize); @@ -599,9 +599,7 @@ void CConfigMain::CreateGUIControls() CFileSearch::XStringVector theme_dirs; theme_dirs.push_back(File::GetUserPath(D_THEMES_IDX)); -#if !defined(_WIN32) - theme_dirs.push_back(SHARED_USER_DIR THEMES_DIR); -#endif + theme_dirs.push_back(File::GetSysDirectory() + THEMES_DIR); CFileSearch cfs(CFileSearch::XStringVector(1, "*"), theme_dirs); auto const& sv = cfs.GetFileNames(); @@ -615,7 +613,7 @@ void CConfigMain::CreateGUIControls() if (-1 == theme_selection->FindString(wxname)) theme_selection->Append(wxname); }); - + theme_selection->SetStringSelection(StrToWxStr(SConfig::GetInstance().m_LocalCoreStartupParameter.theme_name)); // std::function = avoid error on msvc @@ -641,11 +639,11 @@ void CConfigMain::CreateGUIControls() sDisplayPage->Add(sbInterface, 0, wxEXPAND | wxALL, 5); DisplayPage->SetSizer(sDisplayPage); - + // Audio page DSPEngine = new wxRadioBox(AudioPage, ID_DSPENGINE, _("DSP Emulator Engine"), wxDefaultPosition, wxDefaultSize, arrayStringFor_DSPEngine, 0, wxRA_SPECIFY_ROWS); - DSPThread = new wxCheckBox(AudioPage, ID_DSPTHREAD, _("DSP on Dedicated Thread")); + DSPThread = new wxCheckBox(AudioPage, ID_DSPTHREAD, _("DSPLLE on Separate Thread")); DumpAudio = new wxCheckBox(AudioPage, ID_DUMP_AUDIO, _("Dump Audio"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); DPL2Decoder = new wxCheckBox(AudioPage, ID_DPL2DECODER, _("Dolby Pro Logic II decoder")); @@ -742,6 +740,8 @@ void CConfigMain::CreateGUIControls() sbGamecubeEXIDevSettings->Add(GCEXIDeviceText[i], wxGBPosition(i, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sbGamecubeEXIDevSettings->Add(GCEXIDevice[i], wxGBPosition(i, 1), wxGBSpan(1, (i < 2)?1:2), wxALIGN_CENTER_VERTICAL); if (i < 2) sbGamecubeEXIDevSettings->Add(GCMemcardPath[i], wxGBPosition(i, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + if (NetPlay::IsNetPlayRunning()) + GCEXIDevice[i]->Disable(); } sbGamecubeDeviceSettings->Add(sbGamecubeEXIDevSettings, 0, wxALL, 5); @@ -750,6 +750,10 @@ void CConfigMain::CreateGUIControls() { sbGamecubeDevSettings->Add(GCSIDeviceText[i], 1, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 0); sbGamecubeDevSettings->Add(GCSIDevice[i], 1, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, 0); + if (NetPlay::IsNetPlayRunning() || Movie::IsRecordingInput() || Movie::IsPlayingInput()) + { + GCSIDevice[i]->Disable(); + } } sbGamecubeDeviceSettings->Add(sbGamecubeDevSettings, 0, wxALL, 5); @@ -792,7 +796,7 @@ void CConfigMain::CreateGUIControls() sWiiPage->Add(sbWiiDeviceSettings, 0, wxEXPAND|wxALL, 5); WiiPage->SetSizer(sWiiPage); - + // Paths page ISOPaths = new wxListBox(PathsPage, ID_ISOPATHS, wxDefaultPosition, wxDefaultSize, arrayStringFor_ISOPaths, wxLB_SINGLE, wxDefaultValidator); RecursiveISOPath = new wxCheckBox(PathsPage, ID_RECURSIVEISOPATH, _("Search Subfolders"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -984,7 +988,7 @@ void CConfigMain::AddAudioBackends() { std::vector backends = AudioCommon::GetSoundBackends(); // I'm sure Billiard will change this into an auto sometimes soon :P - for (std::vector::const_iterator iter = backends.begin(); + for (std::vector::const_iterator iter = backends.begin(); iter != backends.end(); ++iter) { BackendSelection->Append(wxGetTranslation(StrToWxStr(*iter))); @@ -1073,8 +1077,14 @@ void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA) #ifdef _WIN32 if (!strncmp(File::GetExeDirectory().c_str(), filename.c_str(), File::GetExeDirectory().size())) { - filename.erase(0, File::GetExeDirectory().size() +1); - filename = "./" + filename; + // If the Exe Directory Matches the prefix of the filename, we still need to verify + // that the next character is a directory separator character, otherwise we may create an invalid path + char next_char = filename.at(File::GetExeDirectory().size())+1; + if (next_char == '/' || next_char == '\\') + { + filename.erase(0, File::GetExeDirectory().size() +1); + filename = "./" + filename; + } } #endif diff --git a/Source/Core/DolphinWX/Src/ConfigMain.h b/Source/Core/DolphinWX/Src/ConfigMain.h index 094fb6df85..1624254003 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.h +++ b/Source/Core/DolphinWX/Src/ConfigMain.h @@ -124,7 +124,7 @@ private: wxCheckBox* EnableCheats; wxChoice* Framelimit; wxCheckBox* UseFPSForLimiting; - + // Advanced wxCheckBox* EnableOpenCL; wxRadioBox* CPUEngine; diff --git a/Source/Core/DolphinWX/Src/Debugger/BreakpointDlg.h b/Source/Core/DolphinWX/Src/Debugger/BreakpointDlg.h index b5d6248e6f..208f1038b9 100644 --- a/Source/Core/DolphinWX/Src/Debugger/BreakpointDlg.h +++ b/Source/Core/DolphinWX/Src/Debugger/BreakpointDlg.h @@ -14,7 +14,7 @@ class BreakPointDlg : public wxDialog { public: BreakPointDlg(CBreakPointWindow *_Parent); - + private: CBreakPointWindow *Parent; wxTextCtrl *m_pEditAddress; diff --git a/Source/Core/DolphinWX/Src/Debugger/BreakpointView.cpp b/Source/Core/DolphinWX/Src/Debugger/BreakpointView.cpp index c3d366c1dc..c23412e7ad 100644 --- a/Source/Core/DolphinWX/Src/Debugger/BreakpointView.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/BreakpointView.cpp @@ -32,9 +32,8 @@ void CBreakPointView::Update() char szBuffer[64]; const BreakPoints::TBreakPoints& rBreakPoints = PowerPC::breakpoints.GetBreakPoints(); - for (size_t i = 0; i < rBreakPoints.size(); i++) + for (const auto& rBP : rBreakPoints) { - const TBreakPoint& rBP = rBreakPoints[i]; if (!rBP.bTemporary) { wxString temp; @@ -42,14 +41,14 @@ void CBreakPointView::Update() int Item = InsertItem(0, temp); temp = StrToWxStr("BP"); SetItem(Item, 1, temp); - + Symbol *symbol = g_symbolDB.GetSymbolFromAddr(rBP.iAddress); if (symbol) { temp = StrToWxStr(g_symbolDB.GetDescription(rBP.iAddress)); SetItem(Item, 2, temp); } - + sprintf(szBuffer, "%08x", rBP.iAddress); temp = StrToWxStr(szBuffer); SetItem(Item, 3, temp); @@ -59,10 +58,8 @@ void CBreakPointView::Update() } const MemChecks::TMemChecks& rMemChecks = PowerPC::memchecks.GetMemChecks(); - for (size_t i = 0; i < rMemChecks.size(); i++) + for (const auto& rMemCheck : rMemChecks) { - const TMemCheck& rMemCheck = rMemChecks[i]; - wxString temp; temp = StrToWxStr((rMemCheck.Break || rMemCheck.Log) ? "on" : " "); int Item = InsertItem(0, temp); diff --git a/Source/Core/DolphinWX/Src/Debugger/BreakpointWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/BreakpointWindow.cpp index a39196697c..7a2f91ccf2 100644 --- a/Source/Core/DolphinWX/Src/Debugger/BreakpointWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/BreakpointWindow.cpp @@ -8,7 +8,6 @@ #include "HW/Memmap.h" #include "BreakpointDlg.h" #include "MemoryCheckDlg.h" -#include "Host.h" #include "PowerPC/PowerPC.h" #include "FileUtil.h" @@ -177,10 +176,10 @@ void CBreakPointWindow::LoadAll(wxCommandEvent& WXUNUSED(event)) IniFile ini; BreakPoints::TBreakPointsStr newbps; MemChecks::TMemChecksStr newmcs; - + if (!ini.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX))) return; - + if (ini.GetLines("BreakPoints", newbps, false)) PowerPC::breakpoints.AddFromStrings(newbps); if (ini.GetLines("MemoryChecks", newmcs, false)) diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeView.cpp b/Source/Core/DolphinWX/Src/Debugger/CodeView.cpp index 619d4a75e9..b4d6c4378d 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeView.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/CodeView.cpp @@ -57,10 +57,7 @@ CCodeView::CCodeView(DebugInterface* debuginterface, SymbolDB *symboldb, rowHeight(13), selection(0), oldSelection(0), - selectionChanged(false), selecting(false), - hasFocus(false), - showHex(false), lx(-1), ly(-1) { @@ -216,39 +213,39 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) case IDM_COPYCODE: { - char disasm[256]; - debugger->disasm(selection, disasm, 256); - wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(disasm))); + char disasm[256]; + debugger->disasm(selection, disasm, 256); + wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(disasm))); } break; case IDM_COPYHEX: { - char temp[24]; - sprintf(temp, "%08x", debugger->readInstruction(selection)); - wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(temp))); + char temp[24]; + sprintf(temp, "%08x", debugger->readInstruction(selection)); + wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(temp))); } break; case IDM_COPYFUNCTION: { - Symbol *symbol = symbol_db->GetSymbolFromAddr(selection); - if (symbol) - { - std::string text; - text = text + symbol->name + "\r\n"; - // we got a function - u32 start = symbol->address; - u32 end = start + symbol->size; - for (u32 addr = start; addr != end; addr += 4) + Symbol *symbol = symbol_db->GetSymbolFromAddr(selection); + if (symbol) { - char disasm[256]; - debugger->disasm(addr, disasm, 256); - text = text + StringFromFormat("%08x: ", addr) + disasm + "\r\n"; + std::string text; + text = text + symbol->name + "\r\n"; + // we got a function + u32 start = symbol->address; + u32 end = start + symbol->size; + for (u32 addr = start; addr != end; addr += 4) + { + char disasm[256]; + debugger->disasm(addr, disasm, 256); + text = text + StringFromFormat("%08x: ", addr) + disasm + "\r\n"; + } + wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(text))); } - wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(text))); - } } break; #endif @@ -272,16 +269,18 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) case IDM_JITRESULTS: debugger->showJitResults(selection); break; - + case IDM_FOLLOWBRANCH: { - u32 dest = AddrToBranch(selection); - if (dest) - Center(dest); - RaiseEvent(); + u32 dest = AddrToBranch(selection); + if (dest) + { + Center(dest); + RaiseEvent(); + } } break; - + case IDM_ADDFUNCTION: symbol_db->AddFunction(selection); Host_NotifyMapLoaded(); @@ -289,19 +288,19 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) case IDM_RENAMESYMBOL: { - Symbol *symbol = symbol_db->GetSymbolFromAddr(selection); - if (symbol) - { - wxTextEntryDialog input_symbol(this, StrToWxStr("Rename symbol:"), - wxGetTextFromUserPromptStr, - StrToWxStr(symbol->name)); - if (input_symbol.ShowModal() == wxID_OK) + Symbol *symbol = symbol_db->GetSymbolFromAddr(selection); + if (symbol) { - symbol->name = WxStrToStr(input_symbol.GetValue()); - Refresh(); // Redraw to show the renamed symbol + wxTextEntryDialog input_symbol(this, StrToWxStr("Rename symbol:"), + wxGetTextFromUserPromptStr, + StrToWxStr(symbol->name)); + if (input_symbol.ShowModal() == wxID_OK) + { + symbol->name = WxStrToStr(input_symbol.GetValue()); + Refresh(); // Redraw to show the renamed symbol + } + Host_NotifyMapLoaded(); } - Host_NotifyMapLoaded(); - } } break; @@ -379,7 +378,7 @@ void CCodeView::OnPaint(wxPaintEvent& event) // -------------------------------------------------------------------- // Colors and brushes - // ------------------------- + // ------------------------- dc.SetBackgroundMode(wxTRANSPARENT); // the text background const wxChar* bgColor = _T("#ffffff"); wxPen nullPen(bgColor); @@ -388,7 +387,7 @@ void CCodeView::OnPaint(wxPaintEvent& event) nullPen.SetStyle(wxTRANSPARENT); currentPen.SetStyle(wxSOLID); wxBrush currentBrush(_T("#FFEfE8")); // light gray - wxBrush pcBrush(_T("#70FF70")); // green + wxBrush pcBrush(_T("#70FF70")); // green wxBrush bpBrush(_T("#FF3311")); // red wxBrush bgBrush(bgColor); @@ -527,7 +526,7 @@ void CCodeView::OnPaint(wxPaintEvent& event) // Colors and brushes // ------------------------- dc.SetPen(currentPen); - + for (int i = 0; i < numBranches; i++) { int x = 17 + 49 * charWidth + (branches[i].srcAddr % 9) * 8; diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeView.h b/Source/Core/DolphinWX/Src/Debugger/CodeView.h index 5f4c41eaf7..fcd3164eec 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeView.h +++ b/Source/Core/DolphinWX/Src/Debugger/CodeView.h @@ -34,7 +34,7 @@ public: void InsertBlrNop(int); u32 GetSelection() {return(selection);} - void ToggleBreakpoint(u32 address); + void ToggleBreakpoint(u32 address); struct BlrStruct // for IDM_INSERTBLR { @@ -73,10 +73,7 @@ private: u32 selection; u32 oldSelection; - bool selectionChanged; bool selecting; - bool hasFocus; - bool showHex; int lx, ly; void _MoveTo(int x, int y) {lx = x; ly = y;} diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp index 4853e0396b..3a6c9d4f42 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp @@ -30,7 +30,6 @@ #include "Debugger/PPCDebugInterface.h" #include "Debugger/Debugger_SymbolMap.h" #include "PowerPC/PPCAnalyst.h" -#include "PowerPC/Profiler.h" #include "PowerPC/PPCSymbolDB.h" #include "PowerPC/SignatureDB.h" #include "PowerPC/PPCTables.h" @@ -297,9 +296,9 @@ void CCodeWindow::UpdateLists() if (!symbol) return; - for (int i = 0; i < (int)symbol->callers.size(); i++) + for (auto& call : symbol->callers) { - u32 caller_addr = symbol->callers[i].callAddress; + u32 caller_addr = call.callAddress; Symbol *caller_symbol = g_symbolDB.GetSymbolFromAddr(caller_addr); if (caller_symbol) { @@ -310,9 +309,9 @@ void CCodeWindow::UpdateLists() } calls->Clear(); - for (int i = 0; i < (int)symbol->calls.size(); i++) + for (auto& call : symbol->calls) { - u32 call_addr = symbol->calls[i].function; + u32 call_addr = call.function; Symbol *call_symbol = g_symbolDB.GetSymbolFromAddr(call_addr); if (call_symbol) { @@ -333,10 +332,10 @@ void CCodeWindow::UpdateCallstack() bool ret = Dolphin_Debugger::GetCallstack(stack); - for (size_t i = 0; i < stack.size(); i++) + for (auto& frame : stack) { - int idx = callstack->Append(StrToWxStr(stack[i].Name)); - callstack->SetClientData(idx, (void*)(u64)stack[i].vAddress); + int idx = callstack->Append(StrToWxStr(frame.Name)); + callstack->SetClientData(idx, (void*)(u64)frame.vAddress); } if (!ret) @@ -349,20 +348,20 @@ void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParam // CPU Mode wxMenu* pCoreMenu = new wxMenu; - wxMenuItem* interpreter = pCoreMenu->Append(IDM_INTERPRETER, _("&Interpreter core"), + wxMenuItem* interpreter = pCoreMenu->Append(IDM_INTERPRETER, _("&Interpreter core"), StrToWxStr("This is necessary to get break points" " and stepping to work as explained in the Developer Documentation. But it can be very" - " slow, perhaps slower than 1 fps."), + " slow, perhaps slower than 1 fps."), wxITEM_CHECK); interpreter->Check(_LocalCoreStartupParameter.iCPUCore == 0); pCoreMenu->AppendSeparator(); pCoreMenu->Append(IDM_JITBLOCKLINKING, _("&JIT Block Linking off"), - _("Provide safer execution by not linking the JIT blocks."), + _("Provide safer execution by not linking the JIT blocks."), wxITEM_CHECK); pCoreMenu->Append(IDM_JITNOBLOCKCACHE, _("&Disable JIT Cache"), - _("Avoid any involuntary JIT cache clearing, this may prevent Zelda TP from crashing.\n[This option must be selected before a game is started.]"), + _("Avoid any involuntary JIT cache clearing, this may prevent Zelda TP from crashing.\n[This option must be selected before a game is started.]"), wxITEM_CHECK); pCoreMenu->Append(IDM_CLEARCODECACHE, _("&Clear JIT cache")); @@ -413,17 +412,17 @@ void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParam void CCodeWindow::CreateMenuOptions(wxMenu* pMenu) { wxMenuItem* boottopause = pMenu->Append(IDM_BOOTTOPAUSE, _("Boot to pause"), - _("Start the game directly instead of booting to pause"), + _("Start the game directly instead of booting to pause"), wxITEM_CHECK); boottopause->Check(bBootToPause); - wxMenuItem* automaticstart = pMenu->Append(IDM_AUTOMATICSTART, _("&Automatic start"), + wxMenuItem* automaticstart = pMenu->Append(IDM_AUTOMATICSTART, _("&Automatic start"), StrToWxStr( "Automatically load the Default ISO when Dolphin starts, or the last game you loaded," " if you have not given it an elf file with the --elf command line. [This can be" " convenient if you are bug-testing with a certain game and want to rebuild" " and retry it several times, either with changes to Dolphin or if you are" - " developing a homebrew game.]"), + " developing a homebrew game.]"), wxITEM_CHECK); automaticstart->Check(bAutomaticStart); @@ -481,7 +480,7 @@ void CCodeWindow::OnCPUMode(wxCommandEvent& event) // Clear the JIT cache to enable these changes JitInterface::ClearCache(); - + // Update UpdateButtonStates(); } @@ -553,8 +552,8 @@ void CCodeWindow::InitBitmaps() m_Bitmaps[Toolbar_SetPC] = wxGetBitmapFromMemory(toolbar_add_memcheck_png); // scale to 24x24 for toolbar - for (size_t n = 0; n < ToolbarDebugBitmapMax; n++) - m_Bitmaps[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(24, 24)); + for (auto& bitmap : m_Bitmaps) + bitmap = wxBitmap(bitmap.ConvertToImage().Scale(24, 24)); } void CCodeWindow::PopulateToolbar(wxAuiToolBar* toolBar) diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp b/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp index c8f7b63eb4..3582866c48 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp @@ -108,7 +108,7 @@ void CCodeWindow::Save() "Registers", "Breakpoints", "Memory", - "JIT", + "JIT", "Sound", "Video", "Code" @@ -211,7 +211,9 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event) if (Core::GetState() == Core::CORE_UNINITIALIZED) return; - std::string mapfile = CBoot::GenerateMapFilename(); + std::string existing_map_file, writable_map_file; + bool map_exists = CBoot::FindMapFile(&existing_map_file, + &writable_map_file); switch (event.GetId()) { case IDM_CLEARSYMBOLS: @@ -238,28 +240,28 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event) break; } case IDM_LOADMAPFILE: - if (!File::Exists(mapfile)) + if (!map_exists) { g_symbolDB.Clear(); PPCAnalyst::FindFunctions(0x81300000, 0x81800000, &g_symbolDB); SignatureDB db; if (db.Load((File::GetSysDirectory() + TOTALDB).c_str())) db.Apply(&g_symbolDB); - Parent->StatusBarMessage("'%s' not found, scanning for common functions instead", mapfile.c_str()); + Parent->StatusBarMessage("'%s' not found, scanning for common functions instead", writable_map_file.c_str()); } else { - g_symbolDB.LoadMap(mapfile.c_str()); - Parent->StatusBarMessage("Loaded symbols from '%s'", mapfile.c_str()); + g_symbolDB.LoadMap(existing_map_file.c_str()); + Parent->StatusBarMessage("Loaded symbols from '%s'", existing_map_file.c_str()); } HLE::PatchFunctions(); NotifyMapLoaded(); break; case IDM_SAVEMAPFILE: - g_symbolDB.SaveMap(mapfile.c_str()); + g_symbolDB.SaveMap(writable_map_file.c_str()); break; case IDM_SAVEMAPFILEWITHCODES: - g_symbolDB.SaveMap(mapfile.c_str(), true); + g_symbolDB.SaveMap(writable_map_file.c_str(), true); break; case IDM_RENAME_SYMBOLS: diff --git a/Source/Core/DolphinWX/Src/Debugger/DSPDebugWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/DSPDebugWindow.cpp index d5e589c09b..3be7432eca 100644 --- a/Source/Core/DolphinWX/Src/Debugger/DSPDebugWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/DSPDebugWindow.cpp @@ -19,7 +19,7 @@ DSPDebuggerLLE* m_DebuggerFrame = NULL; -BEGIN_EVENT_TABLE(DSPDebuggerLLE, wxPanel) +BEGIN_EVENT_TABLE(DSPDebuggerLLE, wxPanel) EVT_CLOSE(DSPDebuggerLLE::OnClose) EVT_MENU_RANGE(ID_RUNTOOL, ID_SHOWPCTOOL, DSPDebuggerLLE::OnChangeState) EVT_TEXT_ENTER(ID_ADDRBOX, DSPDebuggerLLE::OnAddrBoxChange) diff --git a/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.cpp b/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.cpp index 5a2e93166b..eea0bf9426 100644 --- a/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.cpp @@ -68,7 +68,7 @@ void GFXDebuggerPanel::SaveSettings() const // TODO: get the screen resolution and make limits from that if (GetPosition().x < 1000 && GetPosition().y < 1000 - && GetSize().GetWidth() < 1000 + && GetSize().GetWidth() < 1000 && GetSize().GetHeight() < 1000) { file.Set("VideoWindow", "x", GetPosition().x); @@ -99,32 +99,35 @@ struct PauseEventMap const wxString ListStr; }; -static PauseEventMap pauseEventMap[] = { - {NEXT_FRAME, _("Frame")}, - {NEXT_FLUSH, _("Flush")}, - - {NEXT_PIXEL_SHADER_CHANGE, _("Pixel Shader")}, - {NEXT_VERTEX_SHADER_CHANGE, _("Vertex Shader")}, - {NEXT_TEXTURE_CHANGE, _("Texture")}, - {NEXT_NEW_TEXTURE, _("New Texture")}, - - {NEXT_XFB_CMD, _("XFB Cmd")}, - {NEXT_EFB_CMD, _("EFB Cmd")}, - - {NEXT_MATRIX_CMD, _("Matrix Cmd")}, - {NEXT_VERTEX_CMD, _("Vertex Cmd")}, - {NEXT_TEXTURE_CMD, _("Texture Cmd")}, - {NEXT_LIGHT_CMD, _("Light Cmd")}, - {NEXT_FOG_CMD, _("Fog Cmd")}, - - {NEXT_SET_TLUT, _("TLUT Cmd")}, - - {NEXT_ERROR, _("Error")} -}; -static const int numPauseEventMap = sizeof(pauseEventMap)/sizeof(PauseEventMap); +static PauseEventMap* pauseEventMap; void GFXDebuggerPanel::CreateGUIControls() { + static PauseEventMap map[] = { + {NEXT_FRAME, _("Frame")}, + {NEXT_FLUSH, _("Flush")}, + + {NEXT_PIXEL_SHADER_CHANGE, _("Pixel Shader")}, + {NEXT_VERTEX_SHADER_CHANGE, _("Vertex Shader")}, + {NEXT_TEXTURE_CHANGE, _("Texture")}, + {NEXT_NEW_TEXTURE, _("New Texture")}, + + {NEXT_XFB_CMD, _("XFB Cmd")}, + {NEXT_EFB_CMD, _("EFB Cmd")}, + + {NEXT_MATRIX_CMD, _("Matrix Cmd")}, + {NEXT_VERTEX_CMD, _("Vertex Cmd")}, + {NEXT_TEXTURE_CMD, _("Texture Cmd")}, + {NEXT_LIGHT_CMD, _("Light Cmd")}, + {NEXT_FOG_CMD, _("Fog Cmd")}, + + {NEXT_SET_TLUT, _("TLUT Cmd")}, + + {NEXT_ERROR, _("Error")} + }; + pauseEventMap = map; + const int numPauseEventMap = sizeof(map)/sizeof(PauseEventMap); + // Basic settings CenterOnParent(); diff --git a/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.h b/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.h index eac6734bc9..90d4773841 100644 --- a/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.h +++ b/Source/Core/DolphinWX/Src/Debugger/DebuggerPanel.h @@ -74,7 +74,7 @@ private: ID_COUNT }; - void OnClose(wxCloseEvent& event); + void OnClose(wxCloseEvent& event); void CreateGUIControls(); void GeneralSettings(wxCommandEvent& event); diff --git a/Source/Core/DolphinWX/Src/Debugger/JitWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/JitWindow.cpp index a1df440b0f..b323f794f2 100644 --- a/Source/Core/DolphinWX/Src/Debugger/JitWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/JitWindow.cpp @@ -15,7 +15,6 @@ #include "PowerPC/JitCommon/JitCache.h" #include "PowerPC/PPCAnalyst.h" #include "PowerPCDisasm.h" -#include "Host.h" #include "disasm.h" #include "Debugger/PPCDebugInterface.h" diff --git a/Source/Core/DolphinWX/Src/Debugger/MemoryCheckDlg.h b/Source/Core/DolphinWX/Src/Debugger/MemoryCheckDlg.h index 9783869ffe..cc212fb88b 100644 --- a/Source/Core/DolphinWX/Src/Debugger/MemoryCheckDlg.h +++ b/Source/Core/DolphinWX/Src/Debugger/MemoryCheckDlg.h @@ -13,7 +13,7 @@ class MemoryCheckDlg : public wxDialog { public: MemoryCheckDlg(CBreakPointWindow *parent); - + private: CBreakPointWindow *m_parent; wxCheckBox* m_pReadFlag; diff --git a/Source/Core/DolphinWX/Src/Debugger/MemoryView.cpp b/Source/Core/DolphinWX/Src/Debugger/MemoryView.cpp index 7c5225a05d..56a5c4c493 100644 --- a/Source/Core/DolphinWX/Src/Debugger/MemoryView.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/MemoryView.cpp @@ -294,9 +294,9 @@ void CMemoryView::OnPaint(wxPaintEvent& event) (mem_data&0xff0000)>>16, (mem_data&0xff00)>>8, mem_data&0xff}; - for (size_t i = 0; i < 4; i++) - if (a[i] == '\0') - a[i] = ' '; + for (auto& word : a) + if (word == '\0') + word = ' '; sprintf(dis, "%c%c%c%c", a[0], a[1], a[2], a[3]); } else if (viewAsType == VIEWAS_HEX) @@ -314,31 +314,31 @@ void CMemoryView::OnPaint(wxPaintEvent& event) debugger->readExtraMemory(memory, address+28) }; - for (int i = 0; i < 8; i++) + for (auto& word : mema) { char buf[32] = ""; switch (dataType) { case 0: sprintf(buf, " %02X %02X %02X %02X", - ((mema[i]&0xff000000)>>24)&0xFF, - ((mema[i]&0xff0000)>>16)&0xFF, - ((mema[i]&0xff00)>>8)&0xFF, - mema[i]&0xff); + ((word&0xff000000)>>24)&0xFF, + ((word&0xff0000)>>16)&0xFF, + ((word&0xff00)>>8)&0xFF, + word&0xff); break; case 1: sprintf(buf, " %02X%02X %02X%02X", - ((mema[i]&0xff000000)>>24)&0xFF, - ((mema[i]&0xff0000)>>16)&0xFF, - ((mema[i]&0xff00)>>8)&0xFF, - mema[i]&0xff); + ((word&0xff000000)>>24)&0xFF, + ((word&0xff0000)>>16)&0xFF, + ((word&0xff00)>>8)&0xFF, + word&0xff); break; case 2: sprintf(buf, " %02X%02X%02X%02X", - ((mema[i]&0xff000000)>>24)&0xFF, - ((mema[i]&0xff0000)>>16)&0xFF, - ((mema[i]&0xff00)>>8)&0xFF, - mema[i]&0xff); + ((word&0xff000000)>>24)&0xFF, + ((word&0xff0000)>>16)&0xFF, + ((word&0xff00)>>8)&0xFF, + word&0xff); break; } strcat(dis, buf); diff --git a/Source/Core/DolphinWX/Src/Debugger/MemoryWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/MemoryWindow.cpp index fa85ce808e..6e60451e07 100644 --- a/Source/Core/DolphinWX/Src/Debugger/MemoryWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/MemoryWindow.cpp @@ -12,7 +12,6 @@ #include "MemoryWindow.h" #include "HW/CPU.h" #include "PowerPC/PowerPC.h" -#include "Host.h" #include "FileUtil.h" #include "Debugger/PPCDebugInterface.h" @@ -87,7 +86,7 @@ CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, sizerRight->Add(new wxButton(this, IDM_DUMP_MEMORY, _("&Dump MRAM"))); sizerRight->Add(new wxButton(this, IDM_DUMP_MEM2, _("&Dump EXRAM"))); - if (SConfig::GetInstance().m_LocalCoreStartupParameter.iTLBHack == 1) + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bTLBHack == true) sizerRight->Add(new wxButton(this, IDM_DUMP_FAKEVMEM, _("&Dump FakeVMEM"))); wxStaticBoxSizer* sizerSearchType = new wxStaticBoxSizer(wxVERTICAL, this, _("Search")); @@ -239,7 +238,7 @@ void CMemoryWindow::OnDumpMemory( wxCommandEvent& event ) // Write exram (aram or mem2) to file void CMemoryWindow::OnDumpMem2( wxCommandEvent& event ) -{ +{ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) { DumpArray(File::GetUserPath(F_ARAMDUMP_IDX), Memory::m_pEXRAM, Memory::EXRAM_SIZE); diff --git a/Source/Core/DolphinWX/Src/Debugger/RegisterView.cpp b/Source/Core/DolphinWX/Src/Debugger/RegisterView.cpp index ac56b8e4cc..d059a908ae 100644 --- a/Source/Core/DolphinWX/Src/Debugger/RegisterView.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/RegisterView.cpp @@ -33,7 +33,7 @@ static u32 GetSpecialRegValue(int reg) case 8: return PowerPC::ppcState.Exceptions; case 9: return ProcessorInterface::GetMask(); case 10: return ProcessorInterface::GetCause(); - default: return 0; + default: return 0; } } @@ -154,7 +154,7 @@ wxGridCellAttr *CRegTable::GetAttr(int row, int col, wxGridCellAttr::wxAttrKind) switch (col) { case 1: red = row < 32 ? m_CachedRegHasChanged[row] : m_CachedSpecialRegHasChanged[row-32]; break; - case 3: + case 3: case 4: red = row < 32 ? m_CachedFRegHasChanged[row][col-3] : false; break; } diff --git a/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp b/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp index 63781008b3..0a957c7b06 100644 --- a/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp +++ b/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp @@ -74,75 +74,75 @@ void FifoPlayerDlg::CreateGUIControls() { wxBoxSizer* sMain; sMain = new wxBoxSizer(wxVERTICAL); - + m_Notebook = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); { m_PlayPage = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer* sPlayPage; sPlayPage = new wxBoxSizer(wxVERTICAL); - + wxStaticBoxSizer* sPlayInfo; sPlayInfo = new wxStaticBoxSizer(new wxStaticBox(m_PlayPage, wxID_ANY, _("File Info")), wxVERTICAL); - + m_NumFramesLabel = new wxStaticText(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_NumFramesLabel->Wrap(-1); sPlayInfo->Add(m_NumFramesLabel, 0, wxALL, 5); - + m_CurrentFrameLabel = new wxStaticText(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_CurrentFrameLabel->Wrap(-1); sPlayInfo->Add(m_CurrentFrameLabel, 0, wxALL, 5); - + m_NumObjectsLabel = new wxStaticText(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_NumObjectsLabel->Wrap(-1); sPlayInfo->Add(m_NumObjectsLabel, 0, wxALL, 5); - + sPlayPage->Add(sPlayInfo, 1, wxEXPAND, 5); - + wxStaticBoxSizer* sFrameRange; sFrameRange = new wxStaticBoxSizer(new wxStaticBox(m_PlayPage, wxID_ANY, _("Frame Range")), wxHORIZONTAL); - + m_FrameFromLabel = new wxStaticText(m_PlayPage, wxID_ANY, _("From"), wxDefaultPosition, wxDefaultSize, 0); m_FrameFromLabel->Wrap(-1); sFrameRange->Add(m_FrameFromLabel, 0, wxALL, 5); - + m_FrameFromCtrl = new wxSpinCtrl(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10, 0); sFrameRange->Add(m_FrameFromCtrl, 0, wxALL, 5); - + m_FrameToLabel = new wxStaticText(m_PlayPage, wxID_ANY, _("To"), wxDefaultPosition, wxDefaultSize, 0); m_FrameToLabel->Wrap(-1); sFrameRange->Add(m_FrameToLabel, 0, wxALL, 5); - + m_FrameToCtrl = new wxSpinCtrl(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), wxSP_ARROW_KEYS, 0, 10, 0); sFrameRange->Add(m_FrameToCtrl, 0, wxALL, 5); - + sPlayPage->Add(sFrameRange, 0, wxEXPAND, 5); - + wxStaticBoxSizer* sObjectRange; sObjectRange = new wxStaticBoxSizer(new wxStaticBox(m_PlayPage, wxID_ANY, _("Object Range")), wxHORIZONTAL); - + m_ObjectFromLabel = new wxStaticText(m_PlayPage, wxID_ANY, _("From"), wxDefaultPosition, wxDefaultSize, 0); m_ObjectFromLabel->Wrap(-1); sObjectRange->Add(m_ObjectFromLabel, 0, wxALL, 5); - + m_ObjectFromCtrl = new wxSpinCtrl(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); sObjectRange->Add(m_ObjectFromCtrl, 0, wxALL, 5); - + m_ObjectToLabel = new wxStaticText(m_PlayPage, wxID_ANY, _("To"), wxDefaultPosition, wxDefaultSize, 0); m_ObjectToLabel->Wrap(-1); sObjectRange->Add(m_ObjectToLabel, 0, wxALL, 5); - + m_ObjectToCtrl = new wxSpinCtrl(m_PlayPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); sObjectRange->Add(m_ObjectToCtrl, 0, wxALL, 5); - + sPlayPage->Add(sObjectRange, 0, wxEXPAND, 5); - + wxStaticBoxSizer* sPlayOptions; sPlayOptions = new wxStaticBoxSizer(new wxStaticBox(m_PlayPage, wxID_ANY, _("Playback Options")), wxVERTICAL); - + m_EarlyMemoryUpdates = new wxCheckBox(m_PlayPage, wxID_ANY, _("Early Memory Updates"), wxDefaultPosition, wxDefaultSize, 0); sPlayOptions->Add(m_EarlyMemoryUpdates, 0, wxALL, 5); - + sPlayPage->Add(sPlayOptions, 0, wxEXPAND, 5); sPlayPage->AddStretchSpacer(); @@ -156,46 +156,46 @@ void FifoPlayerDlg::CreateGUIControls() m_RecordPage = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer* sRecordPage; sRecordPage = new wxBoxSizer(wxVERTICAL); - + wxStaticBoxSizer* sRecordInfo; sRecordInfo = new wxStaticBoxSizer(new wxStaticBox(m_RecordPage, wxID_ANY, _("Recording Info")), wxVERTICAL); - + m_RecordingFifoSizeLabel = new wxStaticText(m_RecordPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_RecordingFifoSizeLabel->Wrap(-1); sRecordInfo->Add(m_RecordingFifoSizeLabel, 0, wxALL, 5); - + m_RecordingMemSizeLabel = new wxStaticText(m_RecordPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_RecordingMemSizeLabel->Wrap(-1); sRecordInfo->Add(m_RecordingMemSizeLabel, 0, wxALL, 5); - + m_RecordingFramesLabel = new wxStaticText(m_RecordPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); m_RecordingFramesLabel->Wrap(-1); sRecordInfo->Add(m_RecordingFramesLabel, 0, wxALL, 5); - + sRecordPage->Add(sRecordInfo, 0, wxEXPAND, 5); - + wxBoxSizer* sRecordButtons; sRecordButtons = new wxBoxSizer(wxHORIZONTAL); - + m_RecordStop = new wxButton(m_RecordPage, wxID_ANY, _("Record"), wxDefaultPosition, wxDefaultSize, 0); sRecordButtons->Add(m_RecordStop, 0, wxALL, 5); - + m_Save = new wxButton(m_RecordPage, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0); sRecordButtons->Add(m_Save, 0, wxALL, 5); - + sRecordPage->Add(sRecordButtons, 0, wxEXPAND, 5); - + wxStaticBoxSizer* sRecordingOptions; sRecordingOptions = new wxStaticBoxSizer(new wxStaticBox(m_RecordPage, wxID_ANY, _("Recording Options")), wxHORIZONTAL); - + m_FramesToRecordLabel = new wxStaticText(m_RecordPage, wxID_ANY, _("Frames To Record"), wxDefaultPosition, wxDefaultSize, 0); m_FramesToRecordLabel->Wrap(-1); sRecordingOptions->Add(m_FramesToRecordLabel, 0, wxALL, 5); - + wxString initialNum = wxString::Format(_T("%d"), m_FramesToRecord); m_FramesToRecordCtrl = new wxSpinCtrl(m_RecordPage, wxID_ANY, initialNum, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 1); sRecordingOptions->Add(m_FramesToRecordCtrl, 0, wxALL, 5); - + sRecordPage->Add(sRecordingOptions, 0, wxEXPAND, 5); sRecordPage->AddStretchSpacer(); @@ -353,7 +353,7 @@ void FifoPlayerDlg::OnFrameTo(wxSpinEvent& event) player.SetFrameRangeEnd(event.GetPosition()); m_FrameFromCtrl->SetValue(player.GetFrameRangeStart()); - m_FrameToCtrl->SetValue(player.GetFrameRangeEnd()); + m_FrameToCtrl->SetValue(player.GetFrameRangeEnd()); } void FifoPlayerDlg::OnObjectFrom(wxSpinEvent& event) @@ -388,7 +388,7 @@ void FifoPlayerDlg::OnSaveFile(wxCommandEvent& WXUNUSED(event)) wxBeginBusyCursor(); bool result = file->Save(WxStrToStr(path).c_str()); wxEndBusyCursor(); - + // Wasn't able to save the file, shit's whack, yo. if (!result) PanicAlert("Error saving file"); @@ -624,8 +624,8 @@ void FifoPlayerDlg::OnObjectListSelectionChanged(wxCommandEvent& event) { const AnalyzedFrameInfo& frame = player.GetAnalyzedFrameInfo(frame_idx); const FifoFrameInfo& fifo_frame = player.GetFile()->GetFrame(frame_idx); - const u8* objectdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx]]; - const u8* objectdata_end = &fifo_frame.fifoData[frame.objectEnds[object_idx]]; + const u8* objectdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx]]; + const u8* objectdata_end = &fifo_frame.fifoData[frame.objectEnds[object_idx]]; u8* objectdata = (u8*)objectdata_start; const int obj_offset = objectdata_start - &fifo_frame.fifoData[frame.objectStarts[0]]; @@ -647,7 +647,7 @@ void FifoPlayerDlg::OnObjectListSelectionChanged(wxCommandEvent& event) // Between objectdata_end and next_objdata_start, there are register setting commands if (object_idx + 1 < (int)frame.objectStarts.size()) { - const u8* next_objdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx+1]]; + const u8* next_objdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx+1]]; while (objectdata < next_objdata_start) { m_objectCmdOffsets.push_back(objectdata - objectdata_start); @@ -807,7 +807,7 @@ void FifoPlayerDlg::OnRecordingFinished(wxEvent&) void FifoPlayerDlg::OnFrameWritten(wxEvent&) { m_CurrentFrameLabel->SetLabel(CreateCurrentFrameLabel()); - m_NumObjectsLabel->SetLabel(CreateFileObjectCountLabel()); + m_NumObjectsLabel->SetLabel(CreateFileObjectCountLabel()); } void FifoPlayerDlg::UpdatePlayGui() @@ -836,7 +836,7 @@ void FifoPlayerDlg::UpdateRecorderGui() { m_RecordingFifoSizeLabel->SetLabel(CreateRecordingFifoSizeLabel()); m_RecordingMemSizeLabel->SetLabel(CreateRecordingMemSizeLabel()); - m_RecordingFramesLabel->SetLabel(CreateRecordingFrameCountLabel()); + m_RecordingFramesLabel->SetLabel(CreateRecordingFrameCountLabel()); m_Save->Enable(GetSaveButtonEnabled()); } @@ -867,7 +867,7 @@ wxString FifoPlayerDlg::CreateFileFrameCountLabel() const if (file) return CreateIntegerLabel(file->GetFrameCount(), _("Frame")); - + return _("No file loaded"); } @@ -877,7 +877,7 @@ wxString FifoPlayerDlg::CreateCurrentFrameLabel() const if (file) return _("Frame ") + wxString::Format(wxT("%i"), FifoPlayer::GetInstance().GetCurrentFrameNum()); - + return wxEmptyString; } @@ -887,7 +887,7 @@ wxString FifoPlayerDlg::CreateFileObjectCountLabel() const if (file) return CreateIntegerLabel(FifoPlayer::GetInstance().GetFrameObjectCount(), _("Object")); - + return wxEmptyString; } @@ -901,9 +901,9 @@ wxString FifoPlayerDlg::CreateRecordingFifoSizeLabel() const for (int i = 0; i < file->GetFrameCount(); ++i) fifoBytes += file->GetFrame(i).fifoDataSize; - return CreateIntegerLabel(fifoBytes, _("FIFO Byte")); + return CreateIntegerLabel(fifoBytes, _("FIFO Byte")); } - + return _("No recorded file"); } @@ -917,13 +917,13 @@ wxString FifoPlayerDlg::CreateRecordingMemSizeLabel() const for (int frameNum = 0; frameNum < file->GetFrameCount(); ++frameNum) { const vector& memUpdates = file->GetFrame(frameNum).memoryUpdates; - for (unsigned int i = 0; i < memUpdates.size(); ++i) - memBytes += memUpdates[i].size; + for (auto& memUpdate : memUpdates) + memBytes += memUpdate.size; } - return CreateIntegerLabel(memBytes, _("Memory Byte")); + return CreateIntegerLabel(memBytes, _("Memory Byte")); } - + return wxEmptyString; } @@ -936,7 +936,7 @@ wxString FifoPlayerDlg::CreateRecordingFrameCountLabel() const int numFrames = file->GetFrameCount(); return CreateIntegerLabel(numFrames, _("Frame")); } - + return wxEmptyString; } diff --git a/Source/Core/DolphinWX/Src/FifoPlayerDlg.h b/Source/Core/DolphinWX/Src/FifoPlayerDlg.h index 6f4a8074b9..1d6b8e3895 100644 --- a/Source/Core/DolphinWX/Src/FifoPlayerDlg.h +++ b/Source/Core/DolphinWX/Src/FifoPlayerDlg.h @@ -28,7 +28,7 @@ private: void OnObjectTo( wxSpinEvent& event ); void OnCheckEarlyMemoryUpdates( wxCommandEvent& event ); void OnRecordStop( wxCommandEvent& event ); - void OnSaveFile( wxCommandEvent& event ); + void OnSaveFile( wxCommandEvent& event ); void OnNumFramesToRecord( wxSpinEvent& event ); void OnCloseClick( wxCommandEvent& event ); diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 613cdc35ab..1ca16ff1ac 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -106,8 +106,21 @@ CRenderFrame::CRenderFrame(wxFrame* parent, wxWindowID id, const wxString& title { // Give it an icon wxIcon IconTemp; - IconTemp.CopyFromBitmap(wxGetBitmapFromMemory(dolphin_ico32x32)); + IconTemp.CopyFromBitmap(wxGetBitmapFromMemory(Dolphin_png)); SetIcon(IconTemp); + + DragAcceptFiles(true); + Connect(wxEVT_DROP_FILES, wxDropFilesEventHandler(CRenderFrame::OnDropFiles), NULL, this); +} + +void CRenderFrame::OnDropFiles(wxDropFilesEvent& event) +{ + if (event.GetNumberOfFiles() != 1) + return; + if (File::IsDirectory(event.GetFiles()[0].ToStdString())) + return; + + State::LoadAs(event.GetFiles()[0].ToStdString()); } #ifdef _WIN32 @@ -152,6 +165,7 @@ BEGIN_EVENT_TABLE(CFrame, CRenderFrame) EVT_MENU(wxID_OPEN, CFrame::OnOpen) EVT_MENU(wxID_EXIT, CFrame::OnQuit) EVT_MENU(IDM_HELPWEBSITE, CFrame::OnHelp) +EVT_MENU(IDM_HELPONLINEDOCS, CFrame::OnHelp) EVT_MENU(IDM_HELPGOOGLECODE, CFrame::OnHelp) EVT_MENU(wxID_ABOUT, CFrame::OnHelp) EVT_MENU(wxID_REFRESH, CFrame::OnRefresh) @@ -191,6 +205,7 @@ EVT_MENU(IDM_NETPLAY, CFrame::OnNetPlay) EVT_MENU(IDM_BROWSE, CFrame::OnBrowse) EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard) EVT_MENU(IDM_IMPORTSAVE, CFrame::OnImportSave) +EVT_MENU(IDM_EXPORTALLSAVE, CFrame::OnExportAllSaves) EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow) EVT_MENU(IDM_CHANGEDISC, CFrame::OnChangeDisc) EVT_MENU(IDM_MENU_INSTALLWAD, CFrame::OnInstallWAD) @@ -431,7 +446,7 @@ void CFrame::OnActive(wxActivateEvent& event) #else m_RenderParent->SetFocus(); #endif - + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor && Core::GetState() == Core::CORE_RUN) m_RenderParent->SetCursor(wxCURSOR_BLANK); @@ -537,9 +552,24 @@ void CFrame::OnResize(wxSizeEvent& event) WXLRESULT CFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { if (WM_SYSCOMMAND == nMsg && (SC_SCREENSAVE == wParam || SC_MONITORPOWER == wParam)) + { return 0; + } + else if (nMsg == WM_QUERYENDSESSION) + { + // Indicate that the application will be able to close + return 1; + } + else if (nMsg == WM_ENDSESSION) + { + // Actually trigger the close now + Close(true); + return 0; + } else + { return wxFrame::MSWWindowProc(nMsg, wParam, lParam); + } } #endif @@ -579,7 +609,7 @@ void CFrame::OnHostMessage(wxCommandEvent& event) { wxString caption = event.GetString().BeforeFirst(':'); wxString text = event.GetString().AfterFirst(':'); - bPanicResult = (wxYES == wxMessageBox(text, + bPanicResult = (wxYES == wxMessageBox(text, caption, event.GetInt() ? wxYES_NO : wxOK, wxGetActiveWindow())); panic_event.Set(); } @@ -612,7 +642,7 @@ void CFrame::GetRenderWindowSize(int& x, int& y, int& width, int& height) void CFrame::OnRenderWindowSizeRequest(int width, int height) { if (Core::GetState() == Core::CORE_UNINITIALIZED || - !SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize || + !SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize || RendererIsFullscreen() || m_RenderFrame->IsMaximized()) return; @@ -809,7 +839,7 @@ bool TASInputHasFocus() { for (int i = 0; i < 4; i++) { - if (main_frame->g_TASInputDlg[i]->HasFocus()) + if (main_frame->g_TASInputDlg[i]->TASHasFocus()) return true; } return false; @@ -903,7 +933,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) { int cmd = GetCmdForHotkey(i); if (cmd >= 0) - { + { wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, cmd); wxMenuItem *item = GetMenuBar()->FindItem(cmd); if (item && item->IsCheckable()) diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 2891d9931c..4abf453041 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -74,10 +74,12 @@ class CRenderFrame : public wxFrame long style = wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE); private: + void OnDropFiles(wxDropFilesEvent& event); #ifdef _WIN32 // Receive WndProc messages WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); #endif + }; class CFrame : public CRenderFrame @@ -162,7 +164,7 @@ public: std::vector Width, Height; }; std::vector Perspectives; - u32 ActivePerspective; + u32 ActivePerspective; private: CGameListCtrl* m_GameListCtrl; @@ -196,7 +198,6 @@ private: Toolbar_ConfigDSP, Toolbar_ConfigPAD, Toolbar_Wiimote, - Toolbar_Help, EToolbar_Max }; @@ -249,10 +250,10 @@ private: void OnPaneClose(wxAuiManagerEvent& evt); void ReloadPanes(); void DoLoadPerspective(); - void OnDropDownToolbarSelect(wxCommandEvent& event); + void OnDropDownToolbarSelect(wxCommandEvent& event); void OnDropDownSettingsToolbar(wxAuiToolBarEvent& event); void OnDropDownToolbarItem(wxAuiToolBarEvent& event); - void OnSelectPerspective(wxCommandEvent& event); + void OnSelectPerspective(wxCommandEvent& event); #ifdef _WIN32 // Override window proc for tricks like screensaver disabling @@ -283,7 +284,7 @@ private: void OnChangeDisc(wxCommandEvent& event); void OnScreenshot(wxCommandEvent& event); void OnActive(wxActivateEvent& event); - void OnClose(wxCloseEvent &event); + void OnClose(wxCloseEvent &event); void OnLoadState(wxCommandEvent& event); void OnSaveState(wxCommandEvent& event); void OnLoadStateFromFile(wxCommandEvent& event); @@ -324,6 +325,7 @@ private: void OnMemcard(wxCommandEvent& event); // Misc void OnImportSave(wxCommandEvent& event); + void OnExportAllSaves(wxCommandEvent& event); void OnNetPlay(wxCommandEvent& event); diff --git a/Source/Core/DolphinWX/Src/FrameAui.cpp b/Source/Core/DolphinWX/Src/FrameAui.cpp index 5ba5d54b43..2333541f2e 100644 --- a/Source/Core/DolphinWX/Src/FrameAui.cpp +++ b/Source/Core/DolphinWX/Src/FrameAui.cpp @@ -38,7 +38,7 @@ void CFrame::OnPaneClose(wxAuiManagerEvent& event) if (!g_pCodeWindow) { - if (nb->GetPage(0)->GetId() == IDM_LOGWINDOW || + if (nb->GetPage(0)->GetId() == IDM_LOGWINDOW || nb->GetPage(0)->GetId() == IDM_LOGCONFIGWINDOW || nb->GetPage(0)->GetId() == IDM_CONSOLEWINDOW) { @@ -494,7 +494,7 @@ void CFrame::DoRemovePage(wxWindow *Win, bool bHide) void CFrame::DoAddPage(wxWindow *Win, int i, bool Float) { if (!Win) return; - + // Ensure accessor remains within valid bounds. if (i < 0 || i > GetNotebookCount()-1) i = 0; @@ -577,7 +577,7 @@ void CFrame::OnDropDownToolbarItem(wxAuiToolBarEvent& event) wxMenuItem* mItem = new wxMenuItem(menuPopup, IDM_PERSPECTIVES_0 + i, StrToWxStr(Perspectives[i].Name), wxT(""), wxITEM_CHECK); - + menuPopup->Append(mItem); if (i == ActivePerspective) @@ -905,12 +905,12 @@ void CFrame::LoadIniPerspectives() ini.Get("Perspectives", "Active", &ActivePerspective, 0); SplitString(_Perspectives, ',', VPerspectives); - for (u32 i = 0; i < VPerspectives.size(); i++) + for (auto& VPerspective : VPerspectives) { SPerspectives Tmp; - std::string _Section, _Perspective, _Width, _Height; + std::string _Section, _Perspective, _Widths, _Heights; std::vector _SWidth, _SHeight; - Tmp.Name = VPerspectives[i]; + Tmp.Name = VPerspective; // Don't save a blank perspective if (Tmp.Name.empty()) @@ -922,22 +922,22 @@ void CFrame::LoadIniPerspectives() "name=Pane 0;caption=Pane 0;state=768;dir=5;prop=100000;|" "name=Pane 1;caption=Pane 1;state=31458108;dir=4;prop=100000;|" "dock_size(5,0,0)=22|dock_size(4,0,0)=333|"); - ini.Get(_Section.c_str(), "Width", &_Width, "70,25"); - ini.Get(_Section.c_str(), "Height", &_Height, "80,80"); + ini.Get(_Section.c_str(), "Width", &_Widths, "70,25"); + ini.Get(_Section.c_str(), "Height", &_Heights, "80,80"); Tmp.Perspective = StrToWxStr(_Perspective); - SplitString(_Width, ',', _SWidth); - SplitString(_Height, ',', _SHeight); - for (u32 j = 0; j < _SWidth.size(); j++) + SplitString(_Widths, ',', _SWidth); + SplitString(_Heights, ',', _SHeight); + for (auto& Width : _SWidth) { int _Tmp; - if (TryParse(_SWidth[j].c_str(), &_Tmp)) Tmp.Width.push_back(_Tmp); + if (TryParse(Width.c_str(), &_Tmp)) Tmp.Width.push_back(_Tmp); } - for (u32 j = 0; j < _SHeight.size(); j++) + for (auto& Height : _SHeight) { int _Tmp; - if (TryParse(_SHeight[j].c_str(), &_Tmp)) Tmp.Height.push_back(_Tmp); + if (TryParse(Height.c_str(), &_Tmp)) Tmp.Height.push_back(_Tmp); } Perspectives.push_back(Tmp); } @@ -983,25 +983,25 @@ void CFrame::SaveIniPerspectives() // Save perspective names std::string STmp = ""; - for (u32 i = 0; i < Perspectives.size(); i++) + for (auto& Perspective : Perspectives) { - STmp += Perspectives[i].Name + ","; + STmp += Perspective.Name + ","; } STmp = STmp.substr(0, STmp.length()-1); ini.Set("Perspectives", "Perspectives", STmp.c_str()); ini.Set("Perspectives", "Active", ActivePerspective); // Save the perspectives - for (u32 i = 0; i < Perspectives.size(); i++) + for (auto& Perspective : Perspectives) { - std::string _Section = "P - " + Perspectives[i].Name; - ini.Set(_Section.c_str(), "Perspective", WxStrToStr(Perspectives[i].Perspective)); + std::string _Section = "P - " + Perspective.Name; + ini.Set(_Section.c_str(), "Perspective", WxStrToStr(Perspective.Perspective)); std::string SWidth = "", SHeight = ""; - for (u32 j = 0; j < Perspectives[i].Width.size(); j++) + for (u32 j = 0; j < Perspective.Width.size(); j++) { - SWidth += StringFromFormat("%i,", Perspectives[i].Width[j]); - SHeight += StringFromFormat("%i,", Perspectives[i].Height[j]); + SWidth += StringFromFormat("%i,", Perspective.Width[j]); + SHeight += StringFromFormat("%i,", Perspective.Height[j]); } // Remove the ending "," SWidth = SWidth.substr(0, SWidth.length()-1); diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index dcca6ccf66..359b09f0aa 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -98,7 +98,7 @@ void CFrame::CreateMenu() wxMenu *externalDrive = new wxMenu; fileMenu->Append(IDM_DRIVES, _("&Boot from DVD Drive..."), externalDrive); - + drives = cdio_get_devices(); // Windows Limitation of 24 character drives for (unsigned int i = 0; i < drives.size() && i < 24; i++) { @@ -155,7 +155,7 @@ void CFrame::CreateMenu() saveMenu->AppendSeparator(); loadMenu->Append(IDM_LOADSTATEFILE, GetMenuLabel(HK_LOAD_STATE_FILE)); - + loadMenu->Append(IDM_UNDOLOADSTATE, GetMenuLabel(HK_UNDO_LOAD_STATE)); loadMenu->AppendSeparator(); @@ -190,7 +190,8 @@ void CFrame::CreateMenu() // Tools menu wxMenu* toolsMenu = new wxMenu; toolsMenu->Append(IDM_MEMCARD, _("&Memcard Manager (GC)")); - toolsMenu->Append(IDM_IMPORTSAVE, _("Wii Save Import")); + toolsMenu->Append(IDM_IMPORTSAVE, _("Import Wii Save")); + toolsMenu->Append(IDM_EXPORTALLSAVE, _("Export All Wii Saves")); toolsMenu->Append(IDM_CHEATS, _("&Cheats Manager")); toolsMenu->Append(IDM_NETPLAY, _("Start &NetPlay")); @@ -296,6 +297,7 @@ void CFrame::CreateMenu() // Re-enable when there's something useful to display */ // helpMenu->Append(wxID_HELP, _("&Help")); helpMenu->Append(IDM_HELPWEBSITE, _("Dolphin &Web Site")); + helpMenu->Append(IDM_HELPONLINEDOCS, _("Online &Documentation")); helpMenu->Append(IDM_HELPGOOGLECODE, _("Dolphin at &Google Code")); helpMenu->AppendSeparator(); helpMenu->Append(wxID_ABOUT, _("&About...")); @@ -384,7 +386,7 @@ wxString CFrame::GetMenuLabel(int Id) case HK_LOAD_STATE_SLOT_8: case HK_LOAD_STATE_SLOT_9: case HK_LOAD_STATE_SLOT_10: - Label = wxString::Format(_("Slot %i"), + Label = wxString::Format(_("Slot %i"), Id - HK_LOAD_STATE_SLOT_1 + 1); break; @@ -398,7 +400,7 @@ wxString CFrame::GetMenuLabel(int Id) case HK_SAVE_STATE_SLOT_8: case HK_SAVE_STATE_SLOT_9: case HK_SAVE_STATE_SLOT_10: - Label = wxString::Format(_("Slot %i"), + Label = wxString::Format(_("Slot %i"), Id - HK_SAVE_STATE_SLOT_1 + 1); break; case HK_SAVE_STATE_FILE: @@ -435,7 +437,7 @@ wxString CFrame::GetMenuLabel(int Id) hotkeymodifier |= wxMOD_CONTROL; #endif hotkeymodifier &= wxMOD_CONTROL | wxMOD_ALT | wxMOD_SHIFT; - + Modifier = InputCommon::WXKeymodToString(hotkeymodifier); Hotkey = InputCommon::WXKeyToString(hotkey); if (Modifier.Len() + Hotkey.Len() > 0) @@ -503,7 +505,7 @@ void CFrame::RecreateToolbar() m_ToolBar = new wxAuiToolBar(this, ID_TOOLBAR, wxDefaultPosition, wxDefaultSize, TOOLBAR_STYLE); PopulateToolbar(m_ToolBar); - + m_Mgr->AddPane(m_ToolBar, wxAuiPaneInfo(). Name(wxT("TBMain")).Caption(wxT("TBMain")). ToolbarPane().Top(). @@ -513,7 +515,7 @@ void CFrame::RecreateToolbar() { m_ToolBarDebug = new wxAuiToolBar(this, ID_TOOLBAR_DEBUG, wxDefaultPosition, wxDefaultSize, TOOLBAR_STYLE); g_pCodeWindow->PopulateToolbar(m_ToolBarDebug); - + m_Mgr->AddPane(m_ToolBarDebug, wxAuiPaneInfo(). Name(wxT("TBDebug")).Caption(wxT("TBDebug")). ToolbarPane().Top(). @@ -547,7 +549,6 @@ void CFrame::InitBitmaps() m_Bitmaps[Toolbar_Wiimote].LoadFile(dir + "wiimote.png", wxBITMAP_TYPE_PNG); m_Bitmaps[Toolbar_Screenshot].LoadFile(dir + "screenshot.png", wxBITMAP_TYPE_PNG); m_Bitmaps[Toolbar_FullScreen].LoadFile(dir + "fullscreen.png", wxBITMAP_TYPE_PNG); - m_Bitmaps[Toolbar_Help].LoadFile(dir + "help.png", wxBITMAP_TYPE_PNG); // Update in case the bitmap has been updated if (m_ToolBar != NULL) @@ -694,7 +695,7 @@ void CFrame::OnChangeDisc(wxCommandEvent& WXUNUSED (event)) void CFrame::OnRecord(wxCommandEvent& WXUNUSED (event)) { int controllers = 0; - + if (Movie::IsReadOnly()) { //PanicAlertT("Cannot record movies in read-only mode."); @@ -722,7 +723,7 @@ void CFrame::OnPlayRecording(wxCommandEvent& WXUNUSED (event)) wxString path = wxFileSelector( _("Select The Recording File"), wxEmptyString, wxEmptyString, wxEmptyString, - _("Dolphin TAS Movies (*.dtm)") + + _("Dolphin TAS Movies (*.dtm)") + wxString::Format(wxT("|*.dtm|%s"), wxGetTranslation(wxALL_FILES)), wxFD_OPEN | wxFD_PREVIEW | wxFD_FILE_MUST_EXIST, this); @@ -872,6 +873,12 @@ void CFrame::StartGame(const std::string& filename) m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() | wxSTAY_ON_TOP); else m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP); + + // No, I really don't want TAB_TRAVERSAL being set behind my back, + // thanks. (Note that calling DisableSelfFocus would prevent this flag + // from being set for new children, but wouldn't reset the existing + // flag.) + m_RenderParent->SetWindowStyle(m_RenderParent->GetWindowStyle() & ~wxTAB_TRAVERSAL); } else { @@ -944,7 +951,7 @@ void CFrame::StartGame(const std::string& filename) #else m_RenderParent->SetFocus(); #endif - + wxTheApp->Bind(wxEVT_KEY_DOWN, &CFrame::OnKeyDown, this); wxTheApp->Bind(wxEVT_KEY_UP, &CFrame::OnKeyUp, this); wxTheApp->Bind(wxEVT_RIGHT_DOWN, &CFrame::OnMouse, this); @@ -1015,6 +1022,9 @@ void CFrame::DoStop() if (confirmStop) return; + // don't let this function run again until it finishes, or is aborted. + confirmStop = true; + m_bGameLoading = false; if (Core::GetState() != Core::CORE_UNINITIALIZED || m_RenderParent != NULL) @@ -1028,7 +1038,6 @@ void CFrame::DoStop() if (SConfig::GetInstance().m_LocalCoreStartupParameter.bConfirmStop) { Core::EState state = Core::GetState(); - confirmStop = true; Core::SetState(Core::CORE_PAUSE); wxMessageDialog m_StopDlg( this, @@ -1038,10 +1047,10 @@ void CFrame::DoStop() wxDefaultPosition); int Ret = m_StopDlg.ShowModal(); - confirmStop = false; if (Ret != wxID_YES) { Core::SetState(state); + confirmStop = false; return; } } @@ -1056,6 +1065,7 @@ void CFrame::DoStop() wxBeginBusyCursor(); BootManager::Stop(); wxEndBusyCursor(); + confirmStop = false; #if defined(HAVE_X11) && HAVE_X11 if (SConfig::GetInstance().m_LocalCoreStartupParameter.bDisableScreenSaver) @@ -1125,23 +1135,23 @@ void CFrame::DoStop() void CFrame::DoRecordingSave() { bool paused = (Core::GetState() == Core::CORE_PAUSE); - + if (!paused) DoPause(); - + wxString path = wxFileSelector( _("Select The Recording File"), wxEmptyString, wxEmptyString, wxEmptyString, - _("Dolphin TAS Movies (*.dtm)") + + _("Dolphin TAS Movies (*.dtm)") + wxString::Format(wxT("|*.dtm|%s"), wxGetTranslation(wxALL_FILES)), wxFD_SAVE | wxFD_PREVIEW | wxFD_OVERWRITE_PROMPT, this); if(path.IsEmpty()) return; - + Movie::SaveRecording(WxStrToStr(path).c_str()); - + if (!paused) DoPause(); } @@ -1254,10 +1264,13 @@ void CFrame::OnHelp(wxCommandEvent& event) } break; case IDM_HELPWEBSITE: - WxUtils::Launch("http://dolphin-emu.org/"); + WxUtils::Launch("https://dolphin-emu.org/"); + break; + case IDM_HELPONLINEDOCS: + WxUtils::Launch("https://dolphin-emu.org/docs/guides/"); break; case IDM_HELPGOOGLECODE: - WxUtils::Launch("http://code.google.com/p/dolphin-emu/"); + WxUtils::Launch("https://code.google.com/p/dolphin-emu/"); break; } } @@ -1310,7 +1323,12 @@ void CFrame::OnMemcard(wxCommandEvent& WXUNUSED (event)) MemcardManager.ShowModal(); } -void CFrame::OnImportSave(wxCommandEvent& WXUNUSED (event)) +void CFrame::OnExportAllSaves(wxCommandEvent& WXUNUSED (event)) +{ + CWiiSaveCrypted::ExportAllSaves(); +} + +void CFrame::OnImportSave(wxCommandEvent& WXUNUSED (event)) { wxString path = wxFileSelector(_("Select the save file"), wxEmptyString, wxEmptyString, wxEmptyString, @@ -1320,9 +1338,7 @@ void CFrame::OnImportSave(wxCommandEvent& WXUNUSED (event)) if (!path.IsEmpty()) { - // TODO: Does this actually need to be dynamically allocated for some reason? - CWiiSaveCrypted* saveFile = new CWiiSaveCrypted(WxStrToStr(path).c_str()); - delete saveFile; + CWiiSaveCrypted::ImportWiiSave(WxStrToStr(path).c_str()); } } @@ -1461,7 +1477,7 @@ void CFrame::OnLoadStateFromFile(wxCommandEvent& WXUNUSED (event)) wxString path = wxFileSelector( _("Select the state to load"), wxEmptyString, wxEmptyString, wxEmptyString, - _("All Save States (sav, s##)") + + _("All Save States (sav, s##)") + wxString::Format(wxT("|*.sav;*.s??|%s"), wxGetTranslation(wxALL_FILES)), wxFD_OPEN | wxFD_PREVIEW | wxFD_FILE_MUST_EXIST, this); @@ -1475,7 +1491,7 @@ void CFrame::OnSaveStateToFile(wxCommandEvent& WXUNUSED (event)) wxString path = wxFileSelector( _("Select the state to save"), wxEmptyString, wxEmptyString, wxEmptyString, - _("All Save States (sav, s##)") + + _("All Save States (sav, s##)") + wxString::Format(wxT("|*.sav;*.s??|%s"), wxGetTranslation(wxALL_FILES)), wxFD_SAVE, this); @@ -1642,9 +1658,9 @@ void CFrame::UpdateGUI() m_ToolBar->SetToolLabel(IDM_PLAY, _("Play")); } } - + GetMenuBar()->FindItem(IDM_RECORDREADONLY)->Enable(Running || Paused); - + if (!Initialized && !m_bGameLoading) { if (m_GameListCtrl->IsEnabled()) @@ -1775,17 +1791,17 @@ void CFrame::GameListChanged(wxCommandEvent& event) Directories.push_back(File::GetUserPath(D_CACHE_IDX).c_str()); CFileSearch::XStringVector Extensions; Extensions.push_back("*.cache"); - + CFileSearch FileSearch(Extensions, Directories); const CFileSearch::XStringVector& rFilenames = FileSearch.GetFileNames(); - - for (u32 i = 0; i < rFilenames.size(); i++) + + for (auto& rFilename : rFilenames) { - File::Delete(rFilenames[i]); + File::Delete(rFilename); } break; } - + // Update gamelist if (m_GameListCtrl) { diff --git a/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp index 67f27a0ddb..1068e870a0 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp @@ -58,7 +58,7 @@ bool cInterfaceAGL::Create(void *&window_handle) initWithAttributes: attr]; if (fmt == nil) { ERROR_LOG(VIDEO, "failed to create pixel format"); - return NULL; + return false; } GLWin.cocoaCtx = [[NSOpenGLContext alloc] @@ -66,12 +66,12 @@ bool cInterfaceAGL::Create(void *&window_handle) [fmt release]; if (GLWin.cocoaCtx == nil) { ERROR_LOG(VIDEO, "failed to create context"); - return NULL; + return false; } if (GLWin.cocoaWin == nil) { ERROR_LOG(VIDEO, "failed to create window"); - return NULL; + return false; } [window makeFirstResponder:GLWin.cocoaWin]; @@ -114,10 +114,10 @@ void cInterfaceAGL::Update() if( s_backbuffer_width == size.width && s_backbuffer_height == size.height) return; - + s_backbuffer_width = size.width; s_backbuffer_height = size.height; - + [GLWin.cocoaCtx update]; } diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index b8276ae546..741492e0a4 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -45,16 +45,15 @@ bool cInterfaceEGL::Create(void *&window_handle) EGLint num_configs; // attributes for a visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer + // 8 bits per color int attribs[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, - EGL_DEPTH_SIZE, 24, #ifdef USE_GLES #ifdef USE_GLES3 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - + // OpenGL ES 3 bit is disabled for now, until we have a way to select it from runtime // Qualcomm drivers don't even care if it is ES2 or ES3 bit set. // Intel drivers /might/ not care, but that code path is untested diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index cd0969c4b7..ce32edd264 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -43,7 +43,7 @@ public: void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); - void Shutdown(); + void Shutdown(); }; #endif diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index 929d365081..22b472d662 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -55,20 +55,18 @@ bool cInterfaceGLX::Create(void *&window_handle) int glxMajorVersion, glxMinorVersion; // attributes for a single buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer + // 8 bits per color int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, None}; // attributes for a double buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer + // 8 bits per color int attrListDbl[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, None }; int attrListDefault[] = { @@ -77,7 +75,6 @@ bool cInterfaceGLX::Create(void *&window_handle) GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, None }; GLWin.dpy = XOpenDisplay(0); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index ba8e6a9b82..2e8bde121f 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -37,7 +37,7 @@ public: bool Create(void *&window_handle); bool MakeCurrent(); bool ClearCurrent(); - void Shutdown(); + void Shutdown(); }; #endif diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index 506adcbb6e..b69d9fea9c 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -16,13 +16,13 @@ public: virtual bool Create(void *&window_handle) { return true; } virtual bool MakeCurrent() { return true; } virtual bool ClearCurrent() { return true; } - virtual void Shutdown() {} + virtual void Shutdown() {} virtual void SwapInterval(int Interval) { } virtual u32 GetBackBufferWidth() { return s_backbuffer_width; } virtual u32 GetBackBufferHeight() { return s_backbuffer_height; } virtual void SetBackBufferDimensions(u32 W, u32 H) {s_backbuffer_width = W; s_backbuffer_height = H; } - virtual void Update() { } + virtual void Update() { } virtual bool PeekMessages() { return false; } }; #endif diff --git a/Source/Core/DolphinWX/Src/GLInterface/Platform.cpp b/Source/Core/DolphinWX/Src/GLInterface/Platform.cpp index 64e32591d8..8094eef810 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/Platform.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/Platform.cpp @@ -110,7 +110,7 @@ out: if (GLWin.wl_display) wl_display_disconnect(GLWin.wl_display); } - + #endif #if HAVE_X11 if (selected_platform != EGL_PLATFORM_X11) { @@ -179,7 +179,7 @@ EGLNativeWindowType cPlatform::CreateWindow(void) return (EGLNativeWindowType) XInterface.CreateWindow(); #endif #ifdef ANDROID - return (EGLNativeWindowType)Host_GetRenderHandle(); + return (EGLNativeWindowType)Host_GetRenderHandle(); #endif return 0; } diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp index 7ba315a5b4..62a4438c6d 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp @@ -84,8 +84,8 @@ bool cInterfaceWGL::Create(void *&window_handle) 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored - 24, // 24Bit Z-Buffer (Depth Buffer) - 8, // 8bit Stencil Buffer + 0, // 0Bit Z-Buffer (Depth Buffer) + 0, // 0bit Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.h b/Source/Core/DolphinWX/Src/GLInterface/WGL.h index 5c968d963e..02526984ff 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.h @@ -22,7 +22,7 @@ public: bool Create(void *&window_handle); bool MakeCurrent(); bool ClearCurrent(); - void Shutdown(); + void Shutdown(); void Update(); bool PeekMessages(); diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index c8e2e94072..54c59dd806 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include "FileSearch.h" @@ -62,24 +63,25 @@ static int CompareGameListItems(const GameListItem* iso1, const GameListItem* is int indexOne = 0; int indexOther = 0; - switch (iso1->GetCountry()) + + // index only matters for WADS and PAL GC games, but invalid indicies for the others + // will return the (only) language in the list + if (iso1->GetPlatform() == GameListItem::WII_WAD) { - case DiscIO::IVolume::COUNTRY_JAPAN: - case DiscIO::IVolume::COUNTRY_USA: - indexOne = 0; - break; - default: - indexOne = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; + indexOne = SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG"); + } + else + { // GC + indexOne = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; } - switch (iso2->GetCountry()) + if (iso2->GetPlatform() == GameListItem::WII_WAD) { - case DiscIO::IVolume::COUNTRY_JAPAN: - case DiscIO::IVolume::COUNTRY_USA: - indexOther = 0; - break; - default: - indexOther = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; + indexOther = SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG"); + } + else + { // GC + indexOther = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; } switch(sortData) @@ -306,7 +308,7 @@ void CGameListCtrl::Update() #else const int platform_padding = 8; #endif - + // set initial sizes for columns SetColumnWidth(COLUMN_DUMMY,0); SetColumnWidth(COLUMN_PLATFORM, 35 + platform_padding); @@ -374,15 +376,15 @@ void CGameListCtrl::Update() wxString NiceSizeFormat(u64 _size) { const char* const unit_symbols[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}; - + auto const unit = Log2(std::max(_size, 1)) / 10; auto const unit_size = (1 << (unit * 10)); - + // ugly rounding integer math auto const value = (_size + unit_size / 2) / unit_size; auto const frac = (_size % unit_size * 10 + unit_size / 2) / unit_size % 10; - return StrToWxStr(StringFromFormat("%llu.%llu %s", value, frac, unit_symbols[unit])); + return StrToWxStr(StringFromFormat("%" PRIu64 ".%" PRIu64 " %s", value, frac, unit_symbols[unit])); } void CGameListCtrl::InsertItemInReportView(long _Index) @@ -401,30 +403,20 @@ void CGameListCtrl::InsertItemInReportView(long _Index) // Insert the platform's image in the first (visible) column SetItemColumnImage(_Index, COLUMN_PLATFORM, m_PlatformImageIndex[rISOFile.GetPlatform()]); - if (rISOFile.GetImage().IsOk()) - ImageIndex = m_imageListSmall->Add(rISOFile.GetImage()); + if (rISOFile.GetBitmap().IsOk()) + ImageIndex = m_imageListSmall->Add(rISOFile.GetBitmap()); // Set the game's banner in the second column SetItemColumnImage(_Index, COLUMN_BANNER, ImageIndex); int SelectedLanguage = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; - + // Is this sane? - switch (rISOFile.GetCountry()) + if (rISOFile.GetPlatform() == GameListItem::WII_WAD) { - case DiscIO::IVolume::COUNTRY_TAIWAN: - case DiscIO::IVolume::COUNTRY_JAPAN: - SelectedLanguage = -1; - break; - - case DiscIO::IVolume::COUNTRY_USA: - SelectedLanguage = 0; - break; - - default: - break; + SelectedLanguage = SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG"); } - + std::string const name = rISOFile.GetName(SelectedLanguage); SetItem(_Index, COLUMN_TITLE, StrToWxStr(name), -1); @@ -484,15 +476,15 @@ void CGameListCtrl::ScanForISOs() { File::FSTEntry FST_Temp; File::ScanDirectoryTree(Directories[i], FST_Temp); - for (u32 j = 0; j < FST_Temp.children.size(); j++) + for (auto& Entry : FST_Temp.children) { - if (FST_Temp.children[j].isDirectory) + if (Entry.isDirectory) { bool duplicate = false; - for (u32 k = 0; k < Directories.size(); k++) + for (auto& Directory : Directories) { - if (strcmp(Directories[k].c_str(), - FST_Temp.children[j].physicalName.c_str()) == 0) + if (strcmp(Directory.c_str(), + Entry.physicalName.c_str()) == 0) { duplicate = true; break; @@ -500,7 +492,7 @@ void CGameListCtrl::ScanForISOs() } if (!duplicate) Directories.push_back( - FST_Temp.children[j].physicalName.c_str()); + Entry.physicalName.c_str()); } } } @@ -548,7 +540,7 @@ void CGameListCtrl::ScanForISOs() if (dialog.WasCancelled()) break; - std::auto_ptr iso_file(new GameListItem(rFilenames[i])); + std::unique_ptr iso_file(new GameListItem(rFilenames[i])); const GameListItem& ISOFile = *iso_file; if (ISOFile.IsValid()) @@ -612,13 +604,9 @@ void CGameListCtrl::ScanForISOs() { const std::vector drives = cdio_get_devices(); - for (std::vector::const_iterator iter = drives.begin(); iter != drives.end(); ++iter) + for (const auto& drive : drives) { - #ifdef __APPLE__ - std::auto_ptr gli(new GameListItem(*iter)); - #else - std::unique_ptr gli(new GameListItem(*iter)); - #endif + std::unique_ptr gli(new GameListItem(drive)); if (gli->IsValid()) m_ISOFiles.push_back(gli.release()); @@ -839,7 +827,7 @@ void CGameListCtrl::OnLeftClick(wxMouseEvent& event) } void CGameListCtrl::OnRightClick(wxMouseEvent& event) -{ +{ // Focus the clicked item. int flags; long item = HitTest(event.GetPosition(), flags); @@ -882,7 +870,7 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event) { if (selected_iso->IsCompressed()) popupMenu->Append(IDM_COMPRESSGCM, _("Decompress ISO...")); - else if (selected_iso->GetFileName().substr(selected_iso->GetFileName().find_last_of(".")) != ".ciso" + else if (selected_iso->GetFileName().substr(selected_iso->GetFileName().find_last_of(".")) != ".ciso" && selected_iso->GetFileName().substr(selected_iso->GetFileName().find_last_of(".")) != ".wbfs") popupMenu->Append(IDM_COMPRESSGCM, _("Compress ISO...")); } @@ -969,8 +957,7 @@ void CGameListCtrl::OnExportSave(wxCommandEvent& WXUNUSED (event)) if (Iso->GetTitleID((u8*)&title)) { title = Common::swap64(title); - CWiiSaveCrypted* exportSave = new CWiiSaveCrypted("", title); - delete exportSave; + CWiiSaveCrypted::ExportWiiSave(title); } delete Iso; } @@ -1119,7 +1106,7 @@ void CGameListCtrl::CompressSelection(bool _compress) if (wxFileExists(StrToWxStr(OutputFileName)) && wxMessageBox( wxString::Format(_("The file %s already exists.\nDo you wish to replace it?"), - StrToWxStr(OutputFileName)), + StrToWxStr(OutputFileName)), _("Confirm File Overwrite"), wxYES_NO) == wxNO) continue; @@ -1147,7 +1134,7 @@ void CGameListCtrl::CompressSelection(bool _compress) if (wxFileExists(StrToWxStr(OutputFileName)) && wxMessageBox( wxString::Format(_("The file %s already exists.\nDo you wish to replace it?"), - StrToWxStr(OutputFileName)), + StrToWxStr(OutputFileName)), _("Confirm File Overwrite"), wxYES_NO) == wxNO) continue; @@ -1208,7 +1195,7 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event)) StrToWxStr(FilePath), StrToWxStr(FileName) + _T(".gcz"), wxEmptyString, - _("All compressed GC/Wii ISO files (gcz)") + + _("All compressed GC/Wii ISO files (gcz)") + wxString::Format(wxT("|*.gcz|%s"), wxGetTranslation(wxALL_FILES)), wxFD_SAVE, this); @@ -1217,7 +1204,7 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event)) return; } while (wxFileExists(path) && wxMessageBox( - wxString::Format(_("The file %s already exists.\nDo you wish to replace it?"), path.c_str()), + wxString::Format(_("The file %s already exists.\nDo you wish to replace it?"), path.c_str()), _("Confirm File Overwrite"), wxYES_NO) == wxNO); diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.h b/Source/Core/DolphinWX/Src/GameListCtrl.h index ad46ec6d67..7ac02eae16 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.h +++ b/Source/Core/DolphinWX/Src/GameListCtrl.h @@ -75,7 +75,7 @@ private: void InsertItemInReportView(long _Index); void SetBackgroundColor(); void ScanForISOs(); - + DECLARE_EVENT_TABLE() // events diff --git a/Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp b/Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp index 39130bcf8e..fc1e62896e 100644 --- a/Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp +++ b/Source/Core/DolphinWX/Src/GeckoCodeDiag.cpp @@ -52,7 +52,7 @@ CodeConfigPanel::CodeConfigPanel(wxWindow* const parent) wxBoxSizer* const sizer_vert = new wxBoxSizer(wxVERTICAL); sizer_vert->Add(sizer_infobox, 1, wxEXPAND); sizer_vert->Add(sizer_buttons, 0, wxEXPAND | wxTOP, 5); - + wxBoxSizer* const sizer_main = new wxBoxSizer(wxVERTICAL); sizer_main->Add(m_listbox_gcodes, 1, wxALL | wxEXPAND, 5); sizer_main->Add(sizer_vert, 0, wxALL | wxEXPAND, 5); @@ -76,18 +76,18 @@ void CodeConfigPanel::UpdateCodeList(bool checkRunning) if (gcodes_iter->enabled) m_listbox_gcodes->Check(m_listbox_gcodes->GetCount()-1, true); } - + wxCommandEvent evt; UpdateInfoBox(evt); } -void CodeConfigPanel::LoadCodes(const IniFile& inifile, const std::string& gameid, bool checkRunning) +void CodeConfigPanel::LoadCodes(const IniFile& globalIni, const IniFile& localIni, const std::string& gameid, bool checkRunning) { m_gameid = gameid; m_gcodes.clear(); if (!checkRunning || Core::IsRunning()) - Gecko::LoadCodes(inifile, m_gcodes); + Gecko::LoadCodes(globalIni, localIni, m_gcodes); UpdateCodeList(checkRunning); } @@ -146,7 +146,7 @@ void CodeConfigPanel::DownloadCodes(wxCommandEvent&) std::string gameid = m_gameid; - + switch (m_gameid[0]) { case 'R': @@ -225,7 +225,7 @@ void CodeConfigPanel::DownloadCodes(wxCommandEvent&) // read code lines case 1 : { - std::istringstream ssline(line); + std::istringstream ssline(line); std::string addr, data; ssline >> addr >> data; ssline.seekg(0); diff --git a/Source/Core/DolphinWX/Src/GeckoCodeDiag.h b/Source/Core/DolphinWX/Src/GeckoCodeDiag.h index 0140966c5e..c961e221e3 100644 --- a/Source/Core/DolphinWX/Src/GeckoCodeDiag.h +++ b/Source/Core/DolphinWX/Src/GeckoCodeDiag.h @@ -20,7 +20,7 @@ public: CodeConfigPanel(wxWindow* const parent); - void LoadCodes(const IniFile& inifile, const std::string& gameid = "", bool checkRunning = false); + void LoadCodes(const IniFile& globalIni, const IniFile& localIni, const std::string& gameid = "", bool checkRunning = false); const std::vector& GetCodes() const { return m_gcodes; } protected: diff --git a/Source/Core/DolphinWX/Src/Globals.h b/Source/Core/DolphinWX/Src/Globals.h index 5930427620..2cb8a41519 100644 --- a/Source/Core/DolphinWX/Src/Globals.h +++ b/Source/Core/DolphinWX/Src/Globals.h @@ -118,6 +118,7 @@ enum IDM_PURGECACHE, IDM_HELPWEBSITE, // Help menu + IDM_HELPONLINEDOCS, IDM_HELPGOOGLECODE, IDM_CONFIG_GFX_BACKEND, @@ -127,7 +128,7 @@ enum IDM_CONFIG_HOTKEYS, IDM_CONFIG_LOGGER, - // Views + // Views IDM_LOGWINDOW, IDM_LOGCONFIGWINDOW, IDM_CONSOLEWINDOW, @@ -231,6 +232,7 @@ enum IDM_OPENSAVEFOLDER, IDM_EXPORTSAVE, IDM_IMPORTSAVE, + IDM_EXPORTALLSAVE, IDM_SETDEFAULTGCM, IDM_DELETEGCM, IDM_COMPRESSGCM, diff --git a/Source/Core/DolphinWX/Src/HotkeyDlg.cpp b/Source/Core/DolphinWX/Src/HotkeyDlg.cpp index 67d540b16e..03b40dd286 100644 --- a/Source/Core/DolphinWX/Src/HotkeyDlg.cpp +++ b/Source/Core/DolphinWX/Src/HotkeyDlg.cpp @@ -255,12 +255,12 @@ void HotkeyConfigDialog::CreateHotkeyGUIControls(void) wxStaticText *StaticTextHeader = new wxStaticText(Page, wxID_ANY, _("Action")); HeaderSizer->Add(StaticTextHeader, 1, wxALL, 2); StaticTextHeader = new wxStaticText(Page, wxID_ANY, _("Key"), wxDefaultPosition, size); - HeaderSizer->Add(StaticTextHeader, 0, wxALL, 2); + HeaderSizer->Add(StaticTextHeader, 0, wxALL, 2); sHotkeys->Add(HeaderSizer, wxGBPosition(0, i), wxDefaultSpan, wxEXPAND | wxLEFT, (i > 0) ? 30 : 1); } int column_break = (page_breaks[j+1] + page_breaks[j] + 1) / 2; - + for (int i = page_breaks[j]; i < page_breaks[j+1]; i++) { // Text for the action diff --git a/Source/Core/DolphinWX/Src/ISOFile.cpp b/Source/Core/DolphinWX/Src/ISOFile.cpp index a763fad3fc..5aa02f5df1 100644 --- a/Source/Core/DolphinWX/Src/ISOFile.cpp +++ b/Source/Core/DolphinWX/Src/ISOFile.cpp @@ -24,13 +24,11 @@ #include "ChunkFile.h" #include "ConfigManager.h" -static const u32 CACHE_REVISION = 0x114; +static const u32 CACHE_REVISION = 0x115; #define DVD_BANNER_WIDTH 96 #define DVD_BANNER_HEIGHT 32 -static u32 g_ImageTemp[DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT]; - GameListItem::GameListItem(const std::string& _rFileName) : m_FileName(_rFileName) , m_emu_state(0) @@ -38,6 +36,8 @@ GameListItem::GameListItem(const std::string& _rFileName) , m_Revision(0) , m_Valid(false) , m_BlobCompressed(false) + , m_ImageWidth(0) + , m_ImageHeight(0) { if (LoadFromCache()) { @@ -78,21 +78,21 @@ GameListItem::GameListItem(const std::string& _rFileName) { if (pBannerLoader->IsValid()) { - m_names = pBannerLoader->GetNames(); + if (m_Platform != WII_WAD) + m_names = pBannerLoader->GetNames(); m_company = pBannerLoader->GetCompany(); m_descriptions = pBannerLoader->GetDescriptions(); - - if (pBannerLoader->GetBanner(g_ImageTemp)) - { - // resize vector to image size - m_pImage.resize(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT * 3); - for (size_t i = 0; i < DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT; i++) - { - m_pImage[i * 3 + 0] = (g_ImageTemp[i] & 0xFF0000) >> 16; - m_pImage[i * 3 + 1] = (g_ImageTemp[i] & 0x00FF00) >> 8; - m_pImage[i * 3 + 2] = (g_ImageTemp[i] & 0x0000FF) >> 0; - } + std::vector Buffer = pBannerLoader->GetBanner(&m_ImageWidth, &m_ImageHeight); + u32* pData = &Buffer[0]; + // resize vector to image size + m_pImage.resize(m_ImageWidth * m_ImageHeight * 3); + + for (int i = 0; i < m_ImageWidth * m_ImageHeight; i++) + { + m_pImage[i * 3 + 0] = (pData[i] & 0xFF0000) >> 16; + m_pImage[i * 3 + 1] = (pData[i] & 0x00FF00) >> 8; + m_pImage[i * 3 + 2] = (pData[i] & 0x0000FF) >> 0; } } delete pBannerLoader; @@ -115,19 +115,29 @@ GameListItem::GameListItem(const std::string& _rFileName) if (IsValid()) { IniFile ini; - ini.Load(File::GetUserPath(D_GAMECONFIG_IDX) + m_UniqueID + ".ini"); + ini.Load(File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + m_UniqueID + ".ini"); + ini.Load(File::GetUserPath(D_GAMESETTINGS_IDX) + m_UniqueID + ".ini", true); ini.Get("EmuState", "EmulationStateId", &m_emu_state); ini.Get("EmuState", "EmulationIssues", &m_issues); } if (!m_pImage.empty()) { - m_Image.Create(DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT, &m_pImage[0], true); + wxImage Image(m_ImageWidth, m_ImageHeight, &m_pImage[0], true); + double Scale = WxUtils::GetCurrentBitmapLogicalScale(); + // Note: This uses nearest neighbor, which subjectively looks a lot + // better for GC banners than smooths caling. + Image.Rescale(DVD_BANNER_WIDTH * Scale, DVD_BANNER_HEIGHT * Scale); +#ifdef __APPLE__ + m_Bitmap = wxBitmap(Image, -1, Scale); +#else + m_Bitmap = wxBitmap(Image, -1); +#endif } else { // default banner - m_Image = wxImage(StrToWxStr(File::GetThemeDir(SConfig::GetInstance().m_LocalCoreStartupParameter.theme_name)) + "nobanner.png", wxBITMAP_TYPE_PNG); + m_Bitmap.LoadFile(StrToWxStr(File::GetThemeDir(SConfig::GetInstance().m_LocalCoreStartupParameter.theme_name)) + "nobanner.png", wxBITMAP_TYPE_PNG); } } @@ -162,6 +172,8 @@ void GameListItem::DoState(PointerWrap &p) p.Do(m_Country); p.Do(m_BlobCompressed); p.Do(m_pImage); + p.Do(m_ImageWidth); + p.Do(m_ImageHeight); p.Do(m_Platform); p.Do(m_IsDiscTwo); p.Do(m_Revision); @@ -176,7 +188,7 @@ std::string GameListItem::CreateCacheFilename() // Filename.extension_HashOfFolderPath_Size.cache // Append hash to prevent ISO name-clashing in different folders. - Filename.append(StringFromFormat("%s_%x_%llx.cache", + Filename.append(StringFromFormat("%s_%x_%zx.cache", extension.c_str(), HashFletcher((const u8 *)LegalPathname.c_str(), LegalPathname.size()), File::GetSize(m_FileName))); @@ -200,7 +212,7 @@ std::string GameListItem::GetDescription(int _index) const if (index < m_descriptions.size()) return m_descriptions[index]; - + if (!m_descriptions.empty()) return m_descriptions[0]; @@ -217,7 +229,7 @@ std::string GameListItem::GetVolumeName(int _index) const if (!m_volume_names.empty()) return m_volume_names[0]; - + return ""; } @@ -228,7 +240,7 @@ std::string GameListItem::GetBannerName(int _index) const if (index < m_names.size() && !m_names[index].empty()) return m_names[index]; - + if (!m_names.empty()) return m_names[0]; @@ -239,9 +251,9 @@ std::string GameListItem::GetBannerName(int _index) const std::string GameListItem::GetName(int _index) const { // Prefer name from banner, fallback to name from volume, fallback to filename - + std::string name = GetBannerName(_index); - + if (name.empty()) name = GetVolumeName(_index); diff --git a/Source/Core/DolphinWX/Src/ISOFile.h b/Source/Core/DolphinWX/Src/ISOFile.h index 9c4fe15299..ffab089a1d 100644 --- a/Source/Core/DolphinWX/Src/ISOFile.h +++ b/Source/Core/DolphinWX/Src/ISOFile.h @@ -41,7 +41,7 @@ public: u64 GetVolumeSize() const {return m_VolumeSize;} bool IsDiscTwo() const {return m_IsDiscTwo;} #if defined(HAVE_WX) && HAVE_WX - const wxImage& GetImage() const {return m_Image;} + const wxBitmap& GetBitmap() const {return m_Bitmap;} #endif void DoState(PointerWrap &p); @@ -78,12 +78,12 @@ private: int m_Revision; #if defined(HAVE_WX) && HAVE_WX - wxImage m_Image; + wxBitmap m_Bitmap; #endif bool m_Valid; bool m_BlobCompressed; std::vector m_pImage; - u32 m_ImageSize; + int m_ImageWidth, m_ImageHeight; bool m_IsDiscTwo; bool LoadFromCache(); diff --git a/Source/Core/DolphinWX/Src/ISOProperties.cpp b/Source/Core/DolphinWX/Src/ISOProperties.cpp index 81e0e1a732..89f07815b1 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.cpp +++ b/Source/Core/DolphinWX/Src/ISOProperties.cpp @@ -6,6 +6,9 @@ #import #endif +#include +#include + #include "Common.h" #include "CommonPaths.h" #include "Globals.h" @@ -45,6 +48,7 @@ BEGIN_EVENT_TABLE(CISOProperties, wxDialog) EVT_CLOSE(CISOProperties::OnClose) EVT_BUTTON(wxID_OK, CISOProperties::OnCloseClick) EVT_BUTTON(ID_EDITCONFIG, CISOProperties::OnEditConfig) + EVT_BUTTON(ID_SHOWDEFAULTCONFIG, CISOProperties::OnShowDefaultConfig) EVT_CHOICE(ID_EMUSTATE, CISOProperties::SetRefresh) EVT_CHOICE(ID_EMU_ISSUES, CISOProperties::SetRefresh) EVT_BUTTON(ID_PHSETTINGS, CISOProperties::PHackButtonClicked) @@ -70,8 +74,11 @@ END_EVENT_TABLE() CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { + // Load ISO data OpenISO = DiscIO::CreateVolumeFromFilename(fileName); - if (DiscIO::IsVolumeWiiDisc(OpenISO)) + bool IsWad = DiscIO::IsVolumeWadFile(OpenISO); + bool IsWiiDisc = DiscIO::IsVolumeWiiDisc(OpenISO); + if (IsWiiDisc) { for (u32 i = 0; i < 0xFFFFFFFF; i++) // yes, technically there can be OVER NINE THOUSAND partitions... { @@ -93,7 +100,7 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW else { // TODO : Should we add a way to browse the wad file ? - if (!DiscIO::IsVolumeWadFile(OpenISO)) + if (!IsWad) { GCFiles.clear(); pFileSystem = DiscIO::CreateFileSystem(OpenISO); @@ -102,13 +109,9 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW } } - OpenGameListItem = new GameListItem(fileName); - - bRefreshList = false; - - CreateGUIControls(DiscIO::IsVolumeWadFile(OpenISO)); - + // Load game ini std::string _iniFilename = OpenISO->GetUniqueID(); + std::string _iniFilenameRevisionSpecific = OpenISO->GetRevisionSpecificUniqueID(); if (!_iniFilename.length()) { @@ -116,39 +119,28 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW u8 _tTitleID[8]; if(OpenISO->GetTitleID(_tTitleID)) { - snprintf(tmp, 17, "%016llx", Common::swap64(_tTitleID)); + snprintf(tmp, 17, "%016" PRIx64, Common::swap64(_tTitleID)); _iniFilename = tmp; } } - GameIniFile = File::GetUserPath(D_GAMECONFIG_IDX) + _iniFilename + ".ini"; + GameIniFileDefault = File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + _iniFilename + ".ini"; + std::string GameIniFileDefaultRevisionSpecific = File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + _iniFilenameRevisionSpecific + ".ini"; + GameIniFileLocal = File::GetUserPath(D_GAMESETTINGS_IDX) + _iniFilename + ".ini"; - if (GameIni.Load(GameIniFile.c_str())) - { - LoadGameConfig(); - } - else - { - // Will fail out if GameConfig folder doesn't exist - std::ofstream f; - OpenFStream(f, GameIniFile, std::ios_base::out); - if (f) - { - f << "# " << OpenISO->GetUniqueID() << " - " << OpenISO->GetName() << '\n' - << "[Core] Values set here will override the main dolphin settings.\n" - << "[EmuState] The Emulation State. 1 is worst, 5 is best, 0 is not set.\n" - << "[OnFrame] Add memory patches to be applied every frame here.\n" - << "[ActionReplay] Add action replay cheats here.\n"; - f.close(); - } + GameIniDefault.Load(GameIniFileDefault); + if (_iniFilenameRevisionSpecific != "") + GameIniDefault.Load(GameIniFileDefaultRevisionSpecific); + GameIniLocal.Load(GameIniFileLocal); - if (GameIni.Load(GameIniFile.c_str())) - LoadGameConfig(); - else - wxMessageBox(wxString::Format(_("Could not create %s"), - StrToWxStr(GameIniFile).c_str()), - _("Error"), wxOK|wxICON_ERROR, this); - } + // Setup GUI + OpenGameListItem = new GameListItem(fileName); + + bRefreshList = false; + + CreateGUIControls(IsWad); + + LoadGameConfig(); // Disk header and apploader @@ -170,21 +162,33 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW break; case DiscIO::IVolume::COUNTRY_USA: m_Country->SetValue(_("USA")); - m_Lang->SetSelection(0); - m_Lang->Disable(); // For NTSC Games, there's no multi lang + if (!IsWad) // For (non wad) NTSC Games, there's no multi lang + { + m_Lang->SetSelection(0); + m_Lang->Disable(); + } + break; case DiscIO::IVolume::COUNTRY_JAPAN: m_Country->SetValue(_("JAPAN")); - m_Lang->SetSelection(-1); - m_Lang->Disable(); // For NTSC Games, there's no multi lang + if (!IsWad) // For (non wad) NTSC Games, there's no multi lang + { + m_Lang->Insert(_("Japanese"), 0); + m_Lang->SetSelection(0); + m_Lang->Disable(); + } break; case DiscIO::IVolume::COUNTRY_KOREA: m_Country->SetValue(_("KOREA")); break; case DiscIO::IVolume::COUNTRY_TAIWAN: m_Country->SetValue(_("TAIWAN")); - m_Lang->SetSelection(-1); - m_Lang->Disable(); // For NTSC Games, there's no multi lang + if (!IsWad) // For (non wad) NTSC Games, there's no multi lang + { + m_Lang->Insert(_("TAIWAN"), 0); + m_Lang->SetSelection(0); + m_Lang->Disable(); + } break; case DiscIO::IVolume::COUNTRY_SDK: m_Country->SetValue(_("No Country (SDK)")); @@ -193,6 +197,13 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW m_Country->SetValue(_("UNKNOWN")); break; } + + if (IsWiiDisc) // Only one language with wii banners + { + m_Lang->SetSelection(0); + m_Lang->Disable(); + } + wxString temp = _T("0x") + StrToWxStr(OpenISO->GetMakerID()); m_MakerID->SetValue(temp); m_Revision->SetValue(wxString::Format(wxT("%u"), OpenISO->GetRevision())); @@ -200,8 +211,16 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW m_FST->SetValue(wxString::Format(wxT("%u"), OpenISO->GetFSTSize())); // Here we set all the info to be shown (be it SJIS or Ascii) + we set the window title - ChangeBannerDetails((int)SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage); - m_Banner->SetBitmap(OpenGameListItem->GetImage()); + if (!IsWad) + { + ChangeBannerDetails((int)SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage); + } + else + { + ChangeBannerDetails(SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG")); + } + + m_Banner->SetBitmap(OpenGameListItem->GetBitmap()); m_Banner->Bind(wxEVT_RIGHT_DOWN, &CISOProperties::RightClickOnBanner, this); // Filesystem browser/dumper @@ -215,7 +234,7 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW WiiPartition partition = WiiDisc.at(i); wxTreeItemId PartitionRoot = m_Treectrl->AppendItem(RootId, wxString::Format(_("Partition %i"), i), 0, 0); - CreateDirectoryTree(PartitionRoot, partition.Files, 1, partition.Files.at(0)->m_FileSize); + CreateDirectoryTree(PartitionRoot, partition.Files, 1, partition.Files.at(0)->m_FileSize); if (i == 1) m_Treectrl->Expand(PartitionRoot); } @@ -242,7 +261,7 @@ CISOProperties::~CISOProperties() size_t CISOProperties::CreateDirectoryTree(wxTreeItemId& parent, std::vector fileInfos, - const size_t _FirstIndex, + const size_t _FirstIndex, const size_t _LastIndex) { size_t CurrentIndex = _FirstIndex; @@ -280,12 +299,25 @@ size_t CISOProperties::CreateDirectoryTree(wxTreeItemId& parent, return CurrentIndex; } +long CISOProperties::GetElementStyle(const char* section, const char* key) +{ + // Disable 3rd state if default gameini overrides the setting + if (GameIniDefault.Exists(section, key)) + return 0; + + return wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER; +} + void CISOProperties::CreateGUIControls(bool IsWad) { wxButton * const EditConfig = new wxButton(this, ID_EDITCONFIG, _("Edit Config"), wxDefaultPosition, wxDefaultSize); EditConfig->SetToolTip(_("This will let you Manually Edit the INI config file")); + wxButton * const EditConfigDefault = + new wxButton(this, ID_SHOWDEFAULTCONFIG, _("Show Defaults"), wxDefaultPosition, wxDefaultSize); + EditConfigDefault->SetToolTip(_("Opens the default (read-only) configuration for this game in an external text editor.")); + // Notebook wxNotebook * const m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize); @@ -306,34 +338,35 @@ void CISOProperties::CreateGUIControls(bool IsWad) // GameConfig editing - Overrides and emulation state wxStaticText * const OverrideText = new wxStaticText(m_GameConfig, wxID_ANY, _("These settings override core Dolphin settings.\nUndetermined means the game uses Dolphin's setting.")); + // Core - CPUThread = new wxCheckBox(m_GameConfig, ID_USEDUALCORE, _("Enable Dual Core"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); - SkipIdle = new wxCheckBox(m_GameConfig, ID_IDLESKIP, _("Enable Idle Skipping"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); - MMU = new wxCheckBox(m_GameConfig, ID_MMU, _("Enable MMU"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + CPUThread = new wxCheckBox(m_GameConfig, ID_USEDUALCORE, _("Enable Dual Core"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "CPUThread"), wxDefaultValidator); + SkipIdle = new wxCheckBox(m_GameConfig, ID_IDLESKIP, _("Enable Idle Skipping"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "SkipIdle"), wxDefaultValidator); + MMU = new wxCheckBox(m_GameConfig, ID_MMU, _("Enable MMU"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "MMU"), wxDefaultValidator); MMU->SetToolTip(_("Enables the Memory Management Unit, needed for some games. (ON = Compatible, OFF = Fast)")); - TLBHack = new wxCheckBox(m_GameConfig, ID_TLBHACK, _("MMU Speed Hack"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + TLBHack = new wxCheckBox(m_GameConfig, ID_TLBHACK, _("MMU Speed Hack"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "TLBHack"), wxDefaultValidator); TLBHack->SetToolTip(_("Fast version of the MMU. Does not work for every game.")); - DCBZOFF = new wxCheckBox(m_GameConfig, ID_DCBZOFF, _("Skip DCBZ clearing"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + DCBZOFF = new wxCheckBox(m_GameConfig, ID_DCBZOFF, _("Skip DCBZ clearing"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "DCBZ"), wxDefaultValidator); DCBZOFF->SetToolTip(_("Bypass the clearing of the data cache by the DCBZ instruction. Usually leave this option disabled.")); - VBeam = new wxCheckBox(m_GameConfig, ID_VBEAM, _("VBeam Speed Hack"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + VBeam = new wxCheckBox(m_GameConfig, ID_VBEAM, _("VBeam Speed Hack"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "VBeam"), wxDefaultValidator); VBeam->SetToolTip(_("Doubles the emulated GPU clock rate. May speed up some games (ON = Fast, OFF = Compatible)")); - SyncGPU = new wxCheckBox(m_GameConfig, ID_SYNCGPU, _("Synchronize GPU thread"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + SyncGPU = new wxCheckBox(m_GameConfig, ID_SYNCGPU, _("Synchronize GPU thread"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "SyncGPU"), wxDefaultValidator); SyncGPU->SetToolTip(_("Synchronizes the GPU and CPU threads to help prevent random freezes in Dual Core mode. (ON = Compatible, OFF = Fast)")); - FastDiscSpeed = new wxCheckBox(m_GameConfig, ID_DISCSPEED, _("Speed up Disc Transfer Rate"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + FastDiscSpeed = new wxCheckBox(m_GameConfig, ID_DISCSPEED, _("Speed up Disc Transfer Rate"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "FastDiscSpeed"), wxDefaultValidator); FastDiscSpeed->SetToolTip(_("Enable fast disc access. Needed for a few games. (ON = Fast, OFF = Compatible)")); - BlockMerging = new wxCheckBox(m_GameConfig, ID_MERGEBLOCKS, _("Enable Block Merging"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); - DSPHLE = new wxCheckBox(m_GameConfig, ID_AUDIO_DSP_HLE, _("DSP HLE emulation (fast)"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + BlockMerging = new wxCheckBox(m_GameConfig, ID_MERGEBLOCKS, _("Enable Block Merging"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "BlockMerging"), wxDefaultValidator); + DSPHLE = new wxCheckBox(m_GameConfig, ID_AUDIO_DSP_HLE, _("DSP HLE emulation (fast)"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Core", "DSPHLE"), wxDefaultValidator); // Wii Console - EnableWideScreen = new wxCheckBox(m_GameConfig, ID_ENABLEWIDESCREEN, _("Enable WideScreen"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER, wxDefaultValidator); + EnableWideScreen = new wxCheckBox(m_GameConfig, ID_ENABLEWIDESCREEN, _("Enable WideScreen"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Wii", "Widescreen"), wxDefaultValidator); // Video - UseBBox = new wxCheckBox(m_GameConfig, ID_USE_BBOX, _("Enable Bounding Box Calculation"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER); + UseBBox = new wxCheckBox(m_GameConfig, ID_USE_BBOX, _("Enable Bounding Box Calculation"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Video", "UseBBox")); UseBBox->SetToolTip(_("If checked, the bounding box registers will be updated. Used by the Paper Mario games.")); - UseZTPSpeedupHack = new wxCheckBox(m_GameConfig, ID_ZTP_SPEEDUP, _("ZTP hack"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE|wxCHK_ALLOW_3RD_STATE_FOR_USER); + UseZTPSpeedupHack = new wxCheckBox(m_GameConfig, ID_ZTP_SPEEDUP, _("ZTP hack"), wxDefaultPosition, wxDefaultSize, GetElementStyle("Video", "ZTPSpeedupHack")); UseZTPSpeedupHack->SetToolTip(_("Enable this to speed up The Legend of Zelda: Twilight Princess. Disable for ANY other game.")); - + // Hack wxFlexGridSizer * const szrPHackSettings = new wxFlexGridSizer(0); PHackEnable = new wxCheckBox(m_GameConfig, ID_PHACKENABLE, _("Custom Projection Hack"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE); @@ -364,7 +397,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) sbCoreOverrides->Add(DCBZOFF, 0, wxLEFT, 5); sbCoreOverrides->Add(VBeam, 0, wxLEFT, 5); sbCoreOverrides->Add(SyncGPU, 0, wxLEFT, 5); - sbCoreOverrides->Add(FastDiscSpeed, 0, wxLEFT, 5); + sbCoreOverrides->Add(FastDiscSpeed, 0, wxLEFT, 5); sbCoreOverrides->Add(BlockMerging, 0, wxLEFT, 5); sbCoreOverrides->Add(DSPHLE, 0, wxLEFT, 5); @@ -398,7 +431,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) sConfigPage->Add(sEmuState, 0, wxEXPAND|wxALL, 5); m_GameConfig->SetSizer(sConfigPage); - + // Patches wxBoxSizer * const sPatches = new wxBoxSizer(wxVERTICAL); Patches = new wxCheckListBox(m_PatchPage, ID_PATCHES_LIST, wxDefaultPosition, @@ -420,7 +453,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) sPatchPage->Add(sPatches, 1, wxEXPAND|wxALL, 5); m_PatchPage->SetSizer(sPatchPage); - + // Action Replay Cheats wxBoxSizer * const sCheats = new wxBoxSizer(wxVERTICAL); Cheats = new wxCheckListBox(m_CheatPage, ID_CHEATS_LIST, wxDefaultPosition, @@ -443,7 +476,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) sCheatPage->Add(sCheats, 1, wxEXPAND|wxALL, 5); m_CheatPage->SetSizer(sCheatPage); - + wxStaticText * const m_NameText = new wxStaticText(m_Information, wxID_ANY, _("Name:")); m_Name = new wxTextCtrl(m_Information, ID_NAME, wxEmptyString, @@ -469,7 +502,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) m_Date = new wxTextCtrl(m_Information, ID_DATE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); wxStaticText * const m_FSTText = - new wxStaticText(m_Information, wxID_ANY, _("FST Size:")); + new wxStaticText(m_Information, wxID_ANY, _("FST Size:")); m_FST = new wxTextCtrl(m_Information, ID_FST, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); @@ -480,8 +513,19 @@ void CISOProperties::CreateGUIControls(bool IsWad) arrayStringFor_Lang.Add(_("Spanish")); arrayStringFor_Lang.Add(_("Italian")); arrayStringFor_Lang.Add(_("Dutch")); + int language = (int)SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; + if (IsWad) + { + arrayStringFor_Lang.Insert(_("Japanese"), 0); + arrayStringFor_Lang.Add(_("Simplified Chinese")); + arrayStringFor_Lang.Add(_("Traditional Chinese")); + arrayStringFor_Lang.Add(_("Korean")); + + language = SConfig::GetInstance().m_SYSCONF->GetData("IPL.LNG"); + } m_Lang = new wxChoice(m_Information, ID_LANG, wxDefaultPosition, wxDefaultSize, arrayStringFor_Lang); - m_Lang->SetSelection((int)SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage); + m_Lang->SetSelection(language); + wxStaticText * const m_ShortText = new wxStaticText(m_Information, wxID_ANY, _("Short Name:")); m_ShortName = new wxTextCtrl(m_Information, ID_SHORTNAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); wxStaticText * const m_MakerText = new wxStaticText(m_Information, wxID_ANY, _("Maker:")); @@ -558,9 +602,14 @@ void CISOProperties::CreateGUIControls(bool IsWad) } wxSizer* sButtons = CreateButtonSizer(wxNO_DEFAULT); + sButtons->Prepend(EditConfigDefault); sButtons->Prepend(EditConfig); sButtons->Add(new wxButton(this, wxID_OK, _("Close"))); + // If there is no default gameini, disable the button. + if (!File::Exists(GameIniFileDefault)) + EditConfigDefault->Disable(); + // Add notebook and buttons to the dialog wxBoxSizer* sMain; sMain = new wxBoxSizer(wxVERTICAL); @@ -576,7 +625,7 @@ void CISOProperties::CreateGUIControls(bool IsWad) void CISOProperties::OnClose(wxCloseEvent& WXUNUSED (event)) { if (!SaveGameConfig()) - PanicAlertT("Could not save %s", GameIniFile.c_str()); + PanicAlertT("Could not save %s", GameIniFileLocal.c_str()); EndModal(bRefreshList ? wxID_OK : wxID_CANCEL); } @@ -622,9 +671,9 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event) popupMenu->Append(IDM_EXTRACTDIR, _("Extract Directory...")); else if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 2) popupMenu->Append(IDM_EXTRACTFILE, _("Extract File...")); - + popupMenu->Append(IDM_EXTRACTALL, _("Extract All Files...")); - + if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0 && m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection()) { @@ -634,7 +683,7 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event) popupMenu->AppendSeparator(); popupMenu->Append(IDM_CHECKINTEGRITY, _("Check Partition Integrity")); } - + PopupMenu(popupMenu); event.Skip(); @@ -646,7 +695,7 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event)) wxString File; File = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); - + Path = wxFileSelector( _("Export File"), wxEmptyString, File, wxEmptyString, @@ -736,7 +785,7 @@ void CISOProperties::ExportDir(const char* _rFullPath, const char* _rExportFolde { dialog.SetTitle(wxString::Format(wxT("%s : %d%%"), dialogTitle.c_str(), (u32)(((float)(i - index[0]) / (float)(index[1] - index[0])) * 100))); - + dialog.Update(i, wxString::Format(_("Extracting %s"), StrToWxStr(fst[i]->m_FullPath))); @@ -746,7 +795,7 @@ void CISOProperties::ExportDir(const char* _rFullPath, const char* _rExportFolde if (fst[i]->IsDirectory()) { snprintf(exportName, sizeof(exportName), "%s/%s/", _rExportFolder, fst[i]->m_FullPath); - DEBUG_LOG(DISCIO, "%s", exportName); + DEBUG_LOG(DISCIO, "%s", exportName); if (!File::Exists(exportName) && !File::CreateFullPath(exportName)) { @@ -831,7 +880,7 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event) wxString Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); std::size_t partitionNum = (std::size_t)wxAtoi(Directory.Mid(Directory.find_first_of("/"), 1)); Directory.Remove(0, Directory.find_first_of("/") +1); // Remove "Partition x/" - + if(WiiDisc.size() > partitionNum) { // Get the filesystem of the LAST partition @@ -839,7 +888,7 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event) } else { - PanicAlertT("Partition doesn't exist: %lu", partitionNum); + PanicAlertT("Partition doesn't exist: %u", (unsigned) partitionNum); return; } } @@ -847,7 +896,7 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event) { FS = pFileSystem; } - + bool ret = false; if (event.GetId() == IDM_EXTRACTAPPLOADER) { @@ -871,7 +920,7 @@ public: Create(); } - virtual ExitCode Entry() + virtual ExitCode Entry() override { return (ExitCode)m_Partition.Partition->CheckIntegrity(); } @@ -935,234 +984,203 @@ void CISOProperties::SetRefresh(wxCommandEvent& event) EmuIssues->Enable(event.GetSelection() != 0); } +void CISOProperties::SetCheckboxValueFromGameini(const char* section, const char* key, wxCheckBox* checkbox) +{ + // Prefer local gameini value over default gameini value. + bool value; + if (GameIniLocal.Get(section, key, &value)) + checkbox->Set3StateValue((wxCheckBoxState)value); + else if (GameIniDefault.Get(section, key, &value)) + checkbox->Set3StateValue((wxCheckBoxState)value); + else + checkbox->Set3StateValue(wxCHK_UNDETERMINED); +} + void CISOProperties::LoadGameConfig() { - bool bTemp; + SetCheckboxValueFromGameini("Core", "CPUThread", CPUThread); + SetCheckboxValueFromGameini("Core", "SkipIdle", SkipIdle); + SetCheckboxValueFromGameini("Core", "MMU", MMU); + SetCheckboxValueFromGameini("Core", "TLBHack", TLBHack); + SetCheckboxValueFromGameini("Core", "DCBZ", DCBZOFF); + SetCheckboxValueFromGameini("Core", "VBeam", VBeam); + SetCheckboxValueFromGameini("Core", "SyncGPU", SyncGPU); + SetCheckboxValueFromGameini("Core", "FastDiscSpeed", FastDiscSpeed); + SetCheckboxValueFromGameini("Core", "BlockMerging", BlockMerging); + SetCheckboxValueFromGameini("Core", "DSPHLE", DSPHLE); + SetCheckboxValueFromGameini("Wii", "Widescreen", EnableWideScreen); + SetCheckboxValueFromGameini("Video", "UseBBox", UseBBox); + SetCheckboxValueFromGameini("Video", "ZTPSpeedupHack", UseZTPSpeedupHack); + + // First set values from default gameini, then apply values from local gameini int iTemp; + GameIniDefault.Get("Video", "ProjectionHack", &iTemp); + PHackEnable->SetValue(iTemp); + if (GameIniLocal.Get("Video", "ProjectionHack", &iTemp)) + PHackEnable->SetValue(iTemp); + + GameIniDefault.Get("Video", "PH_SZNear", &PHack_Data.PHackSZNear); + if (GameIniLocal.GetIfExists("Video", "PH_SZNear", &iTemp)) + PHack_Data.PHackSZNear = iTemp; + GameIniDefault.Get("Video", "PH_SZFar", &PHack_Data.PHackSZFar); + if (GameIniLocal.GetIfExists("Video", "PH_SZFar", &iTemp)) + PHack_Data.PHackSZFar = iTemp; + GameIniDefault.Get("Video", "PH_ExtraParam", &PHack_Data.PHackExP); + if (GameIniLocal.GetIfExists("Video", "PH_ExtraParam", &iTemp)) + PHack_Data.PHackExP = iTemp; + std::string sTemp; + GameIniDefault.Get("Video", "PH_ZNear", &PHack_Data.PHZNear); + if (GameIniLocal.GetIfExists("Video", "PH_ZNear", &sTemp)) + PHack_Data.PHZNear = sTemp; + GameIniDefault.Get("Video", "PH_ZFar", &PHack_Data.PHZFar); + if (GameIniLocal.GetIfExists("Video", "PH_ZFar", &sTemp)) + PHack_Data.PHZFar = sTemp; - if (GameIni.Get("Core", "CPUThread", &bTemp)) - CPUThread->Set3StateValue((wxCheckBoxState)bTemp); - else - CPUThread->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "SkipIdle", &bTemp)) - SkipIdle->Set3StateValue((wxCheckBoxState)bTemp); - else - SkipIdle->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "MMU", &bTemp)) - MMU->Set3StateValue((wxCheckBoxState)bTemp); - else - MMU->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "TLBHack", &bTemp)) - TLBHack->Set3StateValue((wxCheckBoxState)bTemp); - else - TLBHack->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "DCBZ", &bTemp)) - DCBZOFF->Set3StateValue((wxCheckBoxState)bTemp); - else - DCBZOFF->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "VBeam", &bTemp)) - VBeam->Set3StateValue((wxCheckBoxState)bTemp); - else - VBeam->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "SyncGPU", &bTemp)) - SyncGPU->Set3StateValue((wxCheckBoxState)bTemp); - else - SyncGPU->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "FastDiscSpeed", &bTemp)) - FastDiscSpeed->Set3StateValue((wxCheckBoxState)bTemp); - else - FastDiscSpeed->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "BlockMerging", &bTemp)) - BlockMerging->Set3StateValue((wxCheckBoxState)bTemp); - else - BlockMerging->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Core", "DSPHLE", &bTemp)) - DSPHLE->Set3StateValue((wxCheckBoxState)bTemp); - else - DSPHLE->Set3StateValue(wxCHK_UNDETERMINED); - - // ?? - if (GameIni.Get("Wii", "Widescreen", &bTemp)) - EnableWideScreen->Set3StateValue((wxCheckBoxState)bTemp); - else - EnableWideScreen->Set3StateValue(wxCHK_UNDETERMINED); - - if (GameIni.Get("Video", "UseBBox", &bTemp)) - UseBBox->Set3StateValue((wxCheckBoxState)bTemp); - else - UseBBox->Set3StateValue(wxCHK_UNDETERMINED); - - - if (GameIni.Get("Video", "ZTPSpeedupHack", &bTemp)) - UseZTPSpeedupHack->Set3StateValue((wxCheckBoxState)bTemp); - else - UseZTPSpeedupHack->Set3StateValue(wxCHK_UNDETERMINED); - - GameIni.Get("Video", "ProjectionHack", &bTemp); - PHackEnable->Set3StateValue((wxCheckBoxState)bTemp); - - GameIni.Get("Video", "PH_SZNear", &PHack_Data.PHackSZNear); - GameIni.Get("Video", "PH_SZFar", &PHack_Data.PHackSZFar); - GameIni.Get("Video", "PH_ExtraParam", &PHack_Data.PHackExP); - - GameIni.Get("Video", "PH_ZNear", &PHack_Data.PHZNear); - GameIni.Get("Video", "PH_ZFar", &PHack_Data.PHZFar); - - GameIni.Get("EmuState", "EmulationStateId", &iTemp, 0/*Not Set*/); + GameIniDefault.Get("EmuState", "EmulationStateId", &iTemp, 0/*Not Set*/); EmuState->SetSelection(iTemp); + if (GameIniLocal.GetIfExists("EmuState", "EmulationStateId", &iTemp)) + EmuState->SetSelection(iTemp); - GameIni.Get("EmuState", "EmulationIssues", &sTemp); + GameIniDefault.Get("EmuState", "EmulationIssues", &sTemp); if (!sTemp.empty()) - { EmuIssues->SetValue(StrToWxStr(sTemp)); - } + if (GameIniLocal.GetIfExists("EmuState", "EmulationIssues", &sTemp)) + EmuIssues->SetValue(StrToWxStr(sTemp)); + EmuIssues->Enable(EmuState->GetSelection() != 0); PatchList_Load(); ActionReplayList_Load(); - m_geckocode_panel->LoadCodes(GameIni, OpenISO->GetUniqueID()); + m_geckocode_panel->LoadCodes(GameIniDefault, GameIniLocal, OpenISO->GetUniqueID()); +} + +void CISOProperties::SaveGameIniValueFrom3StateCheckbox(const char* section, const char* key, wxCheckBox* checkbox) +{ + // Delete any existing entries from the local gameini if checkbox is undetermined. + // Otherwise, write the current value to the local gameini if the value differs from the default gameini values. + // Delete any existing entry from the local gameini if the value does not differ from the default gameini value. + bool checkbox_val = (checkbox->Get3StateValue() == wxCHK_CHECKED); + + if (checkbox->Get3StateValue() == wxCHK_UNDETERMINED) + GameIniLocal.DeleteKey(section, key); + else if (!GameIniDefault.Exists(section, key)) + GameIniLocal.Set(section, key, checkbox_val); + else + { + bool default_value; + GameIniDefault.Get(section, key, &default_value); + if (default_value != checkbox_val) + GameIniLocal.Set(section, key, checkbox_val); + else + GameIniLocal.DeleteKey(section, key); + } } bool CISOProperties::SaveGameConfig() { - if (CPUThread->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "CPUThread"); - else - GameIni.Set("Core", "CPUThread", CPUThread->Get3StateValue()); + SaveGameIniValueFrom3StateCheckbox("Core", "CPUThread", CPUThread); + SaveGameIniValueFrom3StateCheckbox("Core", "SkipIdle", SkipIdle); + SaveGameIniValueFrom3StateCheckbox("Core", "MMU", MMU); + SaveGameIniValueFrom3StateCheckbox("Core", "TLBHack", TLBHack); + SaveGameIniValueFrom3StateCheckbox("Core", "DCBZ", DCBZOFF); + SaveGameIniValueFrom3StateCheckbox("Core", "VBeam", VBeam); + SaveGameIniValueFrom3StateCheckbox("Core", "SyncGPU", SyncGPU); + SaveGameIniValueFrom3StateCheckbox("Core", "FastDiscSpeed", FastDiscSpeed); + SaveGameIniValueFrom3StateCheckbox("Core", "BlockMerging", BlockMerging); + SaveGameIniValueFrom3StateCheckbox("Core", "DSPHLE", DSPHLE); + SaveGameIniValueFrom3StateCheckbox("Wii", "Widescreen", EnableWideScreen); + SaveGameIniValueFrom3StateCheckbox("Video", "UseBBox", UseBBox); + SaveGameIniValueFrom3StateCheckbox("Video", "ZTPSpeedupHack", UseZTPSpeedupHack); - if (SkipIdle->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "SkipIdle"); - else - GameIni.Set("Core", "SkipIdle", SkipIdle->Get3StateValue()); + #define SAVE_IF_NOT_DEFAULT(section, key, val, def) do { \ + if (GameIniDefault.Exists((section), (key))) { \ + std::remove_reference::type tmp__; \ + GameIniDefault.Get((section), (key), &tmp__); \ + if ((val) != tmp__) \ + GameIniLocal.Set((section), (key), (val)); \ + else \ + GameIniLocal.DeleteKey((section), (key)); \ + } else if ((val) != (def)) \ + GameIniLocal.Set((section), (key), (val)); \ + else \ + GameIniLocal.DeleteKey((section), (key)); \ + } while (0) - if (MMU->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "MMU"); - else - GameIni.Set("Core", "MMU", MMU->Get3StateValue()); + SAVE_IF_NOT_DEFAULT("Video", "ProjectionHack", (int)PHackEnable->GetValue(), 0); + SAVE_IF_NOT_DEFAULT("Video", "PH_SZNear", (PHack_Data.PHackSZNear ? 1 : 0), 0); + SAVE_IF_NOT_DEFAULT("Video", "PH_SZFar", (PHack_Data.PHackSZFar ? 1 : 0), 0); + SAVE_IF_NOT_DEFAULT("Video", "PH_ExtraParam", (PHack_Data.PHackExP ? 1 : 0), 0); + SAVE_IF_NOT_DEFAULT("Video", "PH_ZNear", PHack_Data.PHZNear, ""); + SAVE_IF_NOT_DEFAULT("Video", "PH_ZFar", PHack_Data.PHZFar, ""); + SAVE_IF_NOT_DEFAULT("EmuState", "EmulationStateId", EmuState->GetSelection(), 0); - if (TLBHack->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "TLBHack"); - else - GameIni.Set("Core", "TLBHack", TLBHack->Get3StateValue()); - - if (DCBZOFF->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "DCBZ"); - else - GameIni.Set("Core", "DCBZ", DCBZOFF->Get3StateValue()); - - if (VBeam->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "VBeam"); - else - GameIni.Set("Core", "VBeam", VBeam->Get3StateValue()); - - if (SyncGPU->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "SyncGPU"); - else - GameIni.Set("Core", "SyncGPU", SyncGPU->Get3StateValue()); - - if (FastDiscSpeed->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "FastDiscSpeed"); - else - GameIni.Set("Core", "FastDiscSpeed", FastDiscSpeed->Get3StateValue()); - - if (BlockMerging->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "BlockMerging"); - else - GameIni.Set("Core", "BlockMerging", BlockMerging->Get3StateValue()); - - if (DSPHLE->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Core", "DSPHLE"); - else - GameIni.Set("Core", "DSPHLE", DSPHLE->Get3StateValue()); - - if (EnableWideScreen->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Wii", "Widescreen"); - else - GameIni.Set("Wii", "Widescreen", EnableWideScreen->Get3StateValue()); - - if (UseBBox->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Video", "UseBBox"); - else - GameIni.Set("Video", "UseBBox", UseBBox->Get3StateValue()); - - if (UseZTPSpeedupHack->Get3StateValue() == wxCHK_UNDETERMINED) - GameIni.DeleteKey("Video", "ZTPSpeedupHack"); - else - GameIni.Set("Video", "ZTPSpeedupHack", UseZTPSpeedupHack->Get3StateValue()); - - GameIni.Set("Video", "ProjectionHack", PHackEnable->Get3StateValue()); - - GameIni.Set("Video", "PH_SZNear", PHack_Data.PHackSZNear ? 1 : 0); - GameIni.Set("Video", "PH_SZFar", PHack_Data.PHackSZFar ? 1 : 0); - GameIni.Set("Video", "PH_ExtraParam", PHack_Data.PHackExP ? 1 : 0); - - GameIni.Set("Video", "PH_ZNear", PHack_Data.PHZNear); - GameIni.Set("Video", "PH_ZFar", PHack_Data.PHZFar); - - GameIni.Set("EmuState", "EmulationStateId", EmuState->GetSelection()); - - std::string sTemp; - GameIni.Get("EmuState","EmulationIssues", &sTemp); - if (EmuIssues->GetValue() != sTemp) - bRefreshList = true; - GameIni.Set("EmuState", "EmulationIssues", WxStrToStr(EmuIssues->GetValue())); + std::string emu_issues = EmuIssues->GetValue().ToStdString(); + SAVE_IF_NOT_DEFAULT("EmuState", "EmulationIssues", emu_issues, ""); PatchList_Save(); ActionReplayList_Save(); - Gecko::SaveCodes(GameIni, m_geckocode_panel->GetCodes()); + Gecko::SaveCodes(GameIniLocal, m_geckocode_panel->GetCodes()); - return GameIni.Save(GameIniFile.c_str()); + bool success = GameIniLocal.Save(GameIniFileLocal.c_str()); + + // If the resulting file is empty, delete it. Kind of a hack, but meh. + if (success && File::GetSize(GameIniFileLocal) == 0) + File::Delete(GameIniFileLocal); + + return success; +} + +void CISOProperties::LaunchExternalEditor(const std::string& filename) +{ +#ifdef __APPLE__ + // wxTheMimeTypesManager is not yet implemented for wxCocoa + [[NSWorkspace sharedWorkspace] openFile: + [NSString stringWithUTF8String: filename.c_str()] + withApplication: @"TextEdit"]; +#else + wxFileType* filetype = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("ini")); + if(filetype == NULL) // From extension failed, trying with MIME type now + { + filetype = wxTheMimeTypesManager->GetFileTypeFromMimeType(_T("text/plain")); + if(filetype == NULL) // MIME type failed, aborting mission + { + PanicAlertT("Filetype 'ini' is unknown! Will not open!"); + return; + } + } + wxString OpenCommand; + OpenCommand = filetype->GetOpenCommand(StrToWxStr(filename)); + if(OpenCommand.IsEmpty()) + PanicAlertT("Couldn't find open command for extension 'ini'!"); + else + if(wxExecute(OpenCommand, wxEXEC_SYNC) == -1) + PanicAlertT("wxExecute returned -1 on application run!"); +#endif + + bRefreshList = true; // Just in case + + // Once we're done with the ini edit, give the focus back to Dolphin + SetFocus(); } void CISOProperties::OnEditConfig(wxCommandEvent& WXUNUSED (event)) { - if (File::Exists(GameIniFile)) + SaveGameConfig(); + // Create blank file to prevent editor from prompting to create it. + if (!File::Exists(GameIniFileLocal)) { - SaveGameConfig(); - -#ifdef __APPLE__ - // wxTheMimeTypesManager is not yet implemented for wxCocoa - [[NSWorkspace sharedWorkspace] openFile: - [NSString stringWithUTF8String: GameIniFile.c_str()] - withApplication: @"TextEdit"]; -#else - wxFileType* filetype = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("ini")); - if(filetype == NULL) // From extension failed, trying with MIME type now - { - filetype = wxTheMimeTypesManager->GetFileTypeFromMimeType(_T("text/plain")); - if(filetype == NULL) // MIME type failed, aborting mission - { - PanicAlertT("Filetype 'ini' is unknown! Will not open!"); - return; - } - } - wxString OpenCommand; - OpenCommand = filetype->GetOpenCommand(StrToWxStr(GameIniFile)); - if(OpenCommand.IsEmpty()) - PanicAlertT("Couldn't find open command for extension 'ini'!"); - else - if(wxExecute(OpenCommand, wxEXEC_SYNC) == -1) - PanicAlertT("wxExecute returned -1 on application run!"); -#endif - - GameIni.Load(GameIniFile.c_str()); - LoadGameConfig(); - - bRefreshList = true; // Just in case + std::fstream blankFile(GameIniFileLocal, std::ios::out); + blankFile.close(); } + LaunchExternalEditor(GameIniFileLocal); + GameIniLocal.Load(GameIniFileLocal); + LoadGameConfig(); +} - // Once we're done with the ini edit, give the focus back to Dolphin - SetFocus(); +void CISOProperties::OnShowDefaultConfig(wxCommandEvent& WXUNUSED (event)) +{ + LaunchExternalEditor(GameIniFileDefault); } void CISOProperties::ListSelectionChanged(wxCommandEvent& event) @@ -1170,14 +1188,26 @@ void CISOProperties::ListSelectionChanged(wxCommandEvent& event) switch (event.GetId()) { case ID_PATCHES_LIST: - if (Patches->GetSelection() != wxNOT_FOUND) + if (Patches->GetSelection() == wxNOT_FOUND + || DefaultPatches.find(Patches->GetString(Patches->GetSelection()).ToStdString()) != DefaultPatches.end()) + { + EditPatch->Disable(); + RemovePatch->Disable(); + } + else { EditPatch->Enable(); RemovePatch->Enable(); } break; case ID_CHEATS_LIST: - if (Cheats->GetSelection() != wxNOT_FOUND) + if (Cheats->GetSelection() == wxNOT_FOUND + || DefaultCheats.find(Cheats->GetString(Cheats->GetSelection()).ToStdString()) != DefaultCheats.end()) + { + EditCheat->Disable(); + RemoveCheat->Disable(); + } + else { EditCheat->Enable(); RemoveCheat->Enable(); @@ -1190,14 +1220,16 @@ void CISOProperties::PatchList_Load() { onFrame.clear(); Patches->Clear(); - PatchEngine::LoadPatchSection("OnFrame", onFrame, GameIni); + + PatchEngine::LoadPatchSection("OnFrame", onFrame, GameIniDefault, GameIniLocal); u32 index = 0; - for (std::vector::const_iterator it = onFrame.begin(); it != onFrame.end(); ++it) + for (PatchEngine::Patch& p : onFrame) { - PatchEngine::Patch p = *it; Patches->Append(StrToWxStr(p.name)); Patches->Check(index, p.active); + if (!p.user_defined) + DefaultPatches.insert(p.name); ++index; } } @@ -1205,20 +1237,27 @@ void CISOProperties::PatchList_Load() void CISOProperties::PatchList_Save() { std::vector lines; + std::vector enabledLines; u32 index = 0; - for (std::vector::const_iterator onFrame_it = onFrame.begin(); onFrame_it != onFrame.end(); ++onFrame_it) + for (PatchEngine::Patch& p : onFrame) { - lines.push_back(Patches->IsChecked(index) ? "+$" + onFrame_it->name : "$" + onFrame_it->name); + if (Patches->IsChecked(index)) + enabledLines.push_back("$" + p.name); - for (std::vector::const_iterator iter2 = onFrame_it->entries.begin(); iter2 != onFrame_it->entries.end(); ++iter2) + // Do not save default patches. + if (DefaultPatches.find(p.name) == DefaultPatches.end()) { - std::string temp = StringFromFormat("0x%08X:%s:0x%08X", iter2->address, PatchEngine::PatchTypeStrings[iter2->type], iter2->value); - lines.push_back(temp); + lines.push_back("$" + p.name); + for (auto iter2 = p.entries.begin(); iter2 != p.entries.end(); ++iter2) + { + std::string temp = StringFromFormat("0x%08X:%s:0x%08X", iter2->address, PatchEngine::PatchTypeStrings[iter2->type], iter2->value); + lines.push_back(temp); + } } ++index; } - GameIni.SetLines("OnFrame", lines); - lines.clear(); + GameIniLocal.SetLines("OnFrame_Enabled", enabledLines); + GameIniLocal.SetLines("OnFrame", lines); } void CISOProperties::PHackButtonClicked(wxCommandEvent& event) @@ -1235,7 +1274,7 @@ void CISOProperties::PHackButtonClicked(wxCommandEvent& event) void CISOProperties::PatchButtonClicked(wxCommandEvent& event) { int selection = Patches->GetSelection(); - + switch (event.GetId()) { case ID_EDITPATCH: @@ -1272,7 +1311,7 @@ void CISOProperties::ActionReplayList_Load() { arCodes.clear(); Cheats->Clear(); - ActionReplay::LoadCodes(arCodes, GameIni); + ActionReplay::LoadCodes(arCodes, GameIniDefault, GameIniLocal); u32 index = 0; for (std::vector::const_iterator it = arCodes.begin(); it != arCodes.end(); ++it) @@ -1280,6 +1319,8 @@ void CISOProperties::ActionReplayList_Load() ActionReplay::ARCode arCode = *it; Cheats->Append(StrToWxStr(arCode.name)); Cheats->Check(index, arCode.active); + if (!arCode.user_defined) + DefaultCheats.insert(arCode.name); ++index; } } @@ -1287,26 +1328,32 @@ void CISOProperties::ActionReplayList_Load() void CISOProperties::ActionReplayList_Save() { std::vector lines; + std::vector enabledLines; u32 index = 0; - for (std::vector::const_iterator iter = arCodes.begin(); iter != arCodes.end(); ++iter) + for (auto code : arCodes) { - ActionReplay::ARCode code = *iter; + if (Cheats->IsChecked(index)) + enabledLines.push_back("$" + code.name); - lines.push_back(Cheats->IsChecked(index) ? "+$" + code.name : "$" + code.name); - - for (std::vector::const_iterator iter2 = code.ops.begin(); iter2 != code.ops.end(); ++iter2) + // Do not save default cheats. + if (DefaultCheats.find(code.name) == DefaultCheats.end()) { - lines.push_back(WxStrToStr(wxString::Format(wxT("%08X %08X"), iter2->cmd_addr, iter2->value))); + lines.push_back("$" + code.name); + for (auto& op : code.ops) + { + lines.push_back(WxStrToStr(wxString::Format(wxT("%08X %08X"), op.cmd_addr, op.value))); + } } ++index; } - GameIni.SetLines("ActionReplay", lines); + GameIniLocal.SetLines("ActionReplay_Enabled", enabledLines); + GameIniLocal.SetLines("ActionReplay", lines); } void CISOProperties::ActionReplayButtonClicked(wxCommandEvent& event) { int selection = Cheats->GetSelection(); - + switch (event.GetId()) { case ID_EDITCHEAT: @@ -1346,23 +1393,7 @@ void CISOProperties::OnChangeBannerLang(wxCommandEvent& event) void CISOProperties::ChangeBannerDetails(int lang) { - // why? - switch (OpenGameListItem->GetCountry()) - { - case DiscIO::IVolume::COUNTRY_TAIWAN: - case DiscIO::IVolume::COUNTRY_JAPAN: - lang = -1; - break; - - case DiscIO::IVolume::COUNTRY_USA: - lang = 0; - break; - - default: - break; - } - - wxString const shortName = StrToWxStr(OpenGameListItem->GetBannerName(lang)); + wxString const shortName = StrToWxStr(OpenGameListItem->GetName(lang)); wxString const comment = StrToWxStr(OpenGameListItem->GetDescription(lang)); wxString const maker = StrToWxStr(OpenGameListItem->GetCompany()); diff --git a/Source/Core/DolphinWX/Src/ISOProperties.h b/Source/Core/DolphinWX/Src/ISOProperties.h index 019992a9f3..d19e2f9dc4 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.h +++ b/Source/Core/DolphinWX/Src/ISOProperties.h @@ -129,6 +129,7 @@ private: ID_ENABLEPROGRESSIVESCAN, ID_ENABLEWIDESCREEN, ID_EDITCONFIG, + ID_SHOWDEFAULTCONFIG, ID_EMUSTATE, ID_EMU_ISSUES, ID_PATCHES_LIST, @@ -163,10 +164,13 @@ private: IDM_BNRSAVEAS }; + void LaunchExternalEditor(const std::string& filename); + void CreateGUIControls(bool); void OnClose(wxCloseEvent& event); void OnCloseClick(wxCommandEvent& event); void OnEditConfig(wxCommandEvent& event); + void OnShowDefaultConfig(wxCommandEvent& event); void ListSelectionChanged(wxCommandEvent& event); void PatchButtonClicked(wxCommandEvent& event); void ActionReplayButtonClicked(wxCommandEvent& event); @@ -188,18 +192,27 @@ private: size_t CreateDirectoryTree(wxTreeItemId& parent, std::vector fileInfos, - const size_t _FirstIndex, + const size_t _FirstIndex, const size_t _LastIndex); void ExportDir(const char* _rFullPath, const char* _rExportFilename, const int partitionNum = 0); - IniFile GameIni; - std::string GameIniFile; + IniFile GameIniDefault; + IniFile GameIniLocal; + std::string GameIniFileDefault; + std::string GameIniFileLocal; + + std::set DefaultPatches; + std::set DefaultCheats; void LoadGameConfig(); void PatchList_Load(); void PatchList_Save(); void ActionReplayList_Save(); void ChangeBannerDetails(int lang); + + long GetElementStyle(const char* section, const char* key); + void SetCheckboxValueFromGameini(const char* section, const char* key, wxCheckBox* checkbox); + void SaveGameIniValueFrom3StateCheckbox(const char* section, const char* key, wxCheckBox* checkbox); }; #endif diff --git a/Source/Core/DolphinWX/Src/InputConfigDiag.cpp b/Source/Core/DolphinWX/Src/InputConfigDiag.cpp index 574834f940..a8b7b8aaec 100644 --- a/Source/Core/DolphinWX/Src/InputConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/InputConfigDiag.cpp @@ -307,7 +307,7 @@ bool ControlDialog::Validate() void GamepadPage::SetDevice(wxCommandEvent&) { controller->default_device.FromString(WxStrToStr(device_cbox->GetValue())); - + // show user what it was validated as device_cbox->SetValue(StrToWxStr(controller->default_device.ToString())); @@ -322,7 +322,7 @@ void GamepadPage::SetDevice(wxCommandEvent&) void ControlDialog::SetDevice(wxCommandEvent&) { m_devq.FromString(WxStrToStr(device_cbox->GetValue())); - + // show user what it was validated as device_cbox->SetValue(StrToWxStr(m_devq.ToString())); @@ -647,7 +647,7 @@ void GamepadPage::SaveProfile(wxCommandEvent&) IniFile inifile; controller->SaveConfig(inifile.GetOrCreateSection("Profile")); inifile.Save(fname); - + m_config_dialog->UpdateProfileComboBox(); } else @@ -731,7 +731,7 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin { wxStaticText* const label = new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr((*ci)->name))); - + ControlButton* const control_button = new ControlButton(parent, (*ci)->control_ref, 80); control_button->SetFont(m_SmallFont); @@ -827,7 +827,7 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin if (GROUP_TYPE_MIXED_TRIGGERS == group->type) width = 64+12+1; - + if (GROUP_TYPE_TRIGGERS != group->type) height /= 2; @@ -905,14 +905,14 @@ ControlGroupsSizer::ControlGroupsSizer(ControllerEmu* const controller, wxWindow size_t col_size = 0; wxBoxSizer* stacked_groups = NULL; - for (unsigned int i = 0; i < controller->groups.size(); ++i) + for (ControllerEmu::ControlGroup* group : controller->groups) { - ControlGroupBox* control_group_box = new ControlGroupBox(controller->groups[i], parent, eventsink); + ControlGroupBox* control_group_box = new ControlGroupBox(group, parent, eventsink); wxStaticBoxSizer *control_group = - new wxStaticBoxSizer(wxVERTICAL, parent, wxGetTranslation(StrToWxStr(controller->groups[i]->name))); + new wxStaticBoxSizer(wxVERTICAL, parent, wxGetTranslation(StrToWxStr(group->name))); control_group->Add(control_group_box); - const size_t grp_size = controller->groups[i]->controls.size() + controller->groups[i]->settings.size(); + const size_t grp_size = group->controls.size() + group->settings.size(); col_size += grp_size; if (col_size > 8 || NULL == stacked_groups) { diff --git a/Source/Core/DolphinWX/Src/InputConfigDiag.h b/Source/Core/DolphinWX/Src/InputConfigDiag.h index 7d337ed0de..cf88046aeb 100644 --- a/Source/Core/DolphinWX/Src/InputConfigDiag.h +++ b/Source/Core/DolphinWX/Src/InputConfigDiag.h @@ -86,7 +86,7 @@ class ControlDialog : public wxDialog { public: ControlDialog(GamepadPage* const parent, InputPlugin& plugin, ControllerInterface::ControlReference* const ref); - + wxStaticBoxSizer* CreateControlChooser(GamepadPage* const parent); virtual bool Validate(); @@ -207,7 +207,7 @@ public: std::vector control_groups; protected: - + ControllerEmu* const controller; private: diff --git a/Source/Core/DolphinWX/Src/InputConfigDiagBitmaps.cpp b/Source/Core/DolphinWX/Src/InputConfigDiagBitmaps.cpp index 03c140b992..fd132475ef 100644 --- a/Source/Core/DolphinWX/Src/InputConfigDiagBitmaps.cpp +++ b/Source/Core/DolphinWX/Src/InputConfigDiagBitmaps.cpp @@ -109,18 +109,18 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event)) if (strcmp((*g)->control_group->name, "Main Stick") == 0) { - max = (87.0 / 127.0) * 100; - diagonal = (55.0 / 127.0) * 100.0; + max = (87.0f / 127.0f) * 100; + diagonal = (55.0f / 127.0f) * 100.0; } else if (strcmp((*g)->control_group->name,"C-Stick") == 0) { - max = (74.0 / 127.0) * 100; - diagonal = (46.0 / 127.0) * 100; + max = (74.0f / 127.0f) * 100; + diagonal = (46.0f / 127.0f) * 100; } else { - max = (82.0 / 127.0) * 100; - diagonal = (58.0 / 127.0) * 100; + max = (82.0f / 127.0f) * 100; + diagonal = (58.0f / 127.0f) * 100; } // polygon corners @@ -263,7 +263,7 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event)) } delete[] bitmasks; - + } break; case GROUP_TYPE_TRIGGERS : diff --git a/Source/Core/DolphinWX/Src/LogConfigWindow.cpp b/Source/Core/DolphinWX/Src/LogConfigWindow.cpp index 1518acdf24..23faa656c8 100644 --- a/Source/Core/DolphinWX/Src/LogConfigWindow.cpp +++ b/Source/Core/DolphinWX/Src/LogConfigWindow.cpp @@ -101,13 +101,13 @@ void LogConfigWindow::LoadSettings() // Retrieve the verbosity value from the config ini file. int verbosity; ini.Get("Options", "Verbosity", &verbosity, 0); - + // Ensure the verbosity level is valid. if (verbosity < 1) verbosity = 1; if (verbosity > MAX_LOGLEVEL) verbosity = MAX_LOGLEVEL; - + // Actually set the logging verbosity. m_verbosity->SetSelection(verbosity - 1); @@ -136,10 +136,10 @@ void LogConfigWindow::LoadSettings() { bool log_enabled; ini.Get("Logs", m_LogManager->GetShortName((LogTypes::LOG_TYPE)i), &log_enabled, true); - + if (log_enabled) enableAll = false; - + m_checks->Check(i, log_enabled); } } @@ -175,7 +175,7 @@ void LogConfigWindow::OnVerbosityChange(wxCommandEvent& event) { // Get the new verbosity int v = m_verbosity->GetSelection() + 1; - + // Set all log types to that verbosity level for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) { diff --git a/Source/Core/DolphinWX/Src/LogWindow.cpp b/Source/Core/DolphinWX/Src/LogWindow.cpp index 421ca9ae6b..6579a8831e 100644 --- a/Source/Core/DolphinWX/Src/LogWindow.cpp +++ b/Source/Core/DolphinWX/Src/LogWindow.cpp @@ -51,7 +51,7 @@ void CLogWindow::CreateGUIControls() // Set up log listeners int verbosity; ini.Get("Options", "Verbosity", &verbosity, 0); - + // Ensure the verbosity level is valid if (verbosity < 1) verbosity = 1; @@ -305,23 +305,23 @@ void CLogWindow::UpdateLog() case ERROR_LEVEL: m_Log->SetDefaultStyle(wxTextAttr(*wxRED)); break; - + case WARNING_LEVEL: m_Log->SetDefaultStyle(wxTextAttr(wxColour(255, 255, 0))); // YELLOW break; - + case NOTICE_LEVEL: m_Log->SetDefaultStyle(wxTextAttr(*wxGREEN)); break; - + case INFO_LEVEL: m_Log->SetDefaultStyle(wxTextAttr(*wxCYAN)); break; - + case DEBUG_LEVEL: m_Log->SetDefaultStyle(wxTextAttr(*wxLIGHT_GREY)); break; - + default: m_Log->SetDefaultStyle(wxTextAttr(*wxWHITE)); break; diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index be1f1b7802..d1fc31bc1a 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -71,6 +71,8 @@ IMPLEMENT_APP(DolphinApp) BEGIN_EVENT_TABLE(DolphinApp, wxApp) EVT_TIMER(wxID_ANY, DolphinApp::AfterInit) + EVT_QUERY_END_SESSION(DolphinApp::OnEndSession) + EVT_END_SESSION(DolphinApp::OnEndSession) END_EVENT_TABLE() #include @@ -110,11 +112,11 @@ bool DolphinApp::Initialize(int& c, wxChar **v) { #if defined HAVE_X11 && HAVE_X11 XInitThreads(); -#endif +#endif return wxApp::Initialize(c, v); } -// The `main program' equivalent that creates the main window and return the main frame +// The `main program' equivalent that creates the main window and return the main frame bool DolphinApp::OnInit() { @@ -128,6 +130,7 @@ bool DolphinApp::OnInit() wxString videoBackendName; wxString audioEmulationName; + wxString userPath; #if wxUSE_CMDLINE_PARSER // Parse command lines wxCmdLineEntryDesc cmdLineDesc[] = @@ -172,6 +175,11 @@ bool DolphinApp::OnInit() "Play a movie file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, + { + wxCMD_LINE_OPTION, "U", "user", + "User folder path", + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL + }, { wxCMD_LINE_NONE, NULL, NULL, NULL, wxCMD_LINE_VAL_NONE, 0 } @@ -182,7 +190,7 @@ bool DolphinApp::OnInit() if (parser.Parse() != 0) { return false; - } + } UseDebugger = parser.Found(wxT("debugger")); UseLogger = parser.Found(wxT("logger")); @@ -193,6 +201,12 @@ bool DolphinApp::OnInit() selectAudioEmulation = parser.Found(wxT("audio_emulation"), &audioEmulationName); playMovie = parser.Found(wxT("movie"), &movieFile); + + if (parser.Found(wxT("user"), &userPath)) + { + File::CreateFullPath(WxStrToStr(userPath) + DIR_SEP); + File::GetUserPath(D_USER_IDX, userPath.ToStdString() + DIR_SEP); + } #endif // wxUSE_CMDLINE_PARSER #if defined _DEBUG && defined _WIN32 @@ -215,7 +229,7 @@ bool DolphinApp::OnInit() #ifndef _M_ARM // TODO: if First Boot - if (!cpu_info.bSSE2) + if (!cpu_info.bSSE2) { PanicAlertT("Hi,\n\nDolphin requires that your CPU has support for SSE2 extensions.\n" "Unfortunately your CPU does not support them, so Dolphin will not run.\n\n" @@ -235,37 +249,28 @@ bool DolphinApp::OnInit() } #endif -#ifdef _WIN32 - if (!wxSetWorkingDirectory(StrToWxStr(File::GetExeDirectory()))) - { - INFO_LOG(CONSOLE, "Set working directory failed"); - } -#else - //create all necessary directories in user directory - //TODO : detect the revision and upgrade where necessary - File::CopyDir(std::string(SHARED_USER_DIR GAMECONFIG_DIR DIR_SEP), - File::GetUserPath(D_GAMECONFIG_IDX)); - File::CopyDir(std::string(SHARED_USER_DIR MAPS_DIR DIR_SEP), - File::GetUserPath(D_MAPS_IDX)); - File::CopyDir(std::string(SHARED_USER_DIR SHADERS_DIR DIR_SEP), - File::GetUserPath(D_SHADERS_IDX)); - File::CopyDir(std::string(SHARED_USER_DIR WII_USER_DIR DIR_SEP), - File::GetUserPath(D_WIIUSER_IDX)); - File::CopyDir(std::string(SHARED_USER_DIR OPENCL_DIR DIR_SEP), - File::GetUserPath(D_OPENCL_IDX)); -#endif - File::CreateFullPath(File::GetUserPath(D_CONFIG_IDX)); - File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX)); + // Copy initial Wii NAND data from Sys to User. + File::CopyDir(File::GetSysDirectory() + WII_USER_DIR DIR_SEP, + File::GetUserPath(D_WIIUSER_IDX)); + + File::CreateFullPath(File::GetUserPath(D_USER_IDX)); File::CreateFullPath(File::GetUserPath(D_CACHE_IDX)); + File::CreateFullPath(File::GetUserPath(D_CONFIG_IDX)); File::CreateFullPath(File::GetUserPath(D_DUMPDSP_IDX)); File::CreateFullPath(File::GetUserPath(D_DUMPTEXTURES_IDX)); - File::CreateFullPath(File::GetUserPath(D_HIRESTEXTURES_IDX)); - File::CreateFullPath(File::GetUserPath(D_SCREENSHOTS_IDX)); - File::CreateFullPath(File::GetUserPath(D_STATESAVES_IDX)); - File::CreateFullPath(File::GetUserPath(D_MAILLOGS_IDX)); + File::CreateFullPath(File::GetUserPath(D_GAMESETTINGS_IDX)); + File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX)); File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + USA_DIR DIR_SEP); File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + EUR_DIR DIR_SEP); File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + JAP_DIR DIR_SEP); + File::CreateFullPath(File::GetUserPath(D_HIRESTEXTURES_IDX)); + File::CreateFullPath(File::GetUserPath(D_MAILLOGS_IDX)); + File::CreateFullPath(File::GetUserPath(D_MAPS_IDX)); + File::CreateFullPath(File::GetUserPath(D_OPENCL_IDX)); + File::CreateFullPath(File::GetUserPath(D_SCREENSHOTS_IDX)); + File::CreateFullPath(File::GetUserPath(D_SHADERS_IDX)); + File::CreateFullPath(File::GetUserPath(D_STATESAVES_IDX)); + File::CreateFullPath(File::GetUserPath(D_THEMES_IDX)); LogManager::Init(); SConfig::Init(); @@ -316,7 +321,7 @@ bool DolphinApp::OnInit() int leftPos = GetSystemMetrics(SM_XVIRTUALSCREEN); int topPos = GetSystemMetrics(SM_YVIRTUALSCREEN); int width = GetSystemMetrics(SM_CXVIRTUALSCREEN); - int height = GetSystemMetrics(SM_CYVIRTUALSCREEN); + int height = GetSystemMetrics(SM_CYVIRTUALSCREEN); if ((leftPos + width) < (x + w) || leftPos > x || (topPos + height) < (y + h) || topPos > y) x = y = wxDefaultCoord; #elif defined __APPLE__ @@ -402,7 +407,7 @@ void DolphinApp::InitLanguageSupport() m_locale = new wxLocale(language); #ifdef _WIN32 - m_locale->AddCatalogLookupPathPrefix(wxT("Languages")); + m_locale->AddCatalogLookupPathPrefix(StrToWxStr(File::GetExeDirectory() + DIR_SEP "Languages")); #endif m_locale->AddCatalog(wxT("dolphin-emu")); @@ -421,6 +426,15 @@ void DolphinApp::InitLanguageSupport() } } +void DolphinApp::OnEndSession(wxCloseEvent& event) +{ + // Close if we've recieved wxEVT_END_SESSION (ignore wxEVT_QUERY_END_SESSION) + if (!event.CanVeto()) + { + main_frame->Close(true); + } +} + int DolphinApp::OnExit() { WiimoteReal::Shutdown(); @@ -442,7 +456,7 @@ void DolphinApp::OnFatalException() // ------------ // Talk to GUI -void Host_SysMessage(const char *fmt, ...) +void Host_SysMessage(const char *fmt, ...) { va_list list; char msg[512]; diff --git a/Source/Core/DolphinWX/Src/Main.h b/Source/Core/DolphinWX/Src/Main.h index d3e1493e58..08d67e4dda 100644 --- a/Source/Core/DolphinWX/Src/Main.h +++ b/Source/Core/DolphinWX/Src/Main.h @@ -33,6 +33,7 @@ private: wxLocale *m_locale; void AfterInit(wxTimerEvent& WXUNUSED(event)); + void OnEndSession(wxCloseEvent& event); }; DECLARE_APP(DolphinApp); diff --git a/Source/Core/DolphinWX/Src/MainAndroid.cpp b/Source/Core/DolphinWX/Src/MainAndroid.cpp index 5fc616d5ac..1c1c481b24 100644 --- a/Source/Core/DolphinWX/Src/MainAndroid.cpp +++ b/Source/Core/DolphinWX/Src/MainAndroid.cpp @@ -26,6 +26,7 @@ #include "CPUDetect.h" #include "Thread.h" +#include "State.h" #include "PowerPC/PowerPC.h" #include "HW/Wiimote.h" @@ -93,8 +94,8 @@ void Host_GetRenderWindowSize(int& x, int& y, int& width, int& height) { x = SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowXPos; y = SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowYPos; - width = g_width; - height = g_height; + width = g_width; + height = g_height; } void Host_RequestRenderWindowSize(int width, int height) {} @@ -132,30 +133,22 @@ void Host_SysMessage(const char *fmt, ...) void Host_SetWiiMoteConnectionState(int _State) {} -void OSDCallbacks(u32 UserData) -{ - switch(UserData) - { - case 0: // Init - ButtonManager::Init(); - break; - case 1: // Draw - ButtonManager::DrawButtons(); - break; - case 2: // Shutdown - ButtonManager::Shutdown(); - break; - default: - WARN_LOG(COMMON, "Error, wrong OSD type"); - break; - } -} - #define DVD_BANNER_WIDTH 96 #define DVD_BANNER_HEIGHT 32 std::vector m_volume_names; std::vector m_names; +static inline u32 Average32(u32 a, u32 b) { + return ((a >> 1) & 0x7f7f7f7f) + ((b >> 1) & 0x7f7f7f7f); +} + +static inline u32 GetPixel(u32 *buffer, unsigned int x, unsigned int y) { + // thanks to unsignedness, these also check for <0 automatically. + if (x > 191) return 0; + if (y > 63) return 0; + return buffer[y * 192 + x]; +} + bool LoadBanner(std::string filename, u32 *Banner) { DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(filename); @@ -179,8 +172,32 @@ bool LoadBanner(std::string filename, u32 *Banner) if (pBannerLoader->IsValid()) { m_names = pBannerLoader->GetNames(); - if (pBannerLoader->GetBanner(Banner)) - return true; + int Width, Height; + std::vector BannerVec = pBannerLoader->GetBanner(&Width, &Height); + // This code (along with above inlines) is moved from + // elsewhere. Someone who knows anything about Android + // please get rid of it and use proper high-resolution + // images. + if (Height == 64) + { + u32* Buffer = &BannerVec[0]; + for (int y = 0; y < 32; y++) + { + for (int x = 0; x < 96; x++) + { + // simplified plus-shaped "gaussian" + u32 surround = Average32( + Average32(GetPixel(Buffer, x*2 - 1, y*2), GetPixel(Buffer, x*2 + 1, y*2)), + Average32(GetPixel(Buffer, x*2, y*2 - 1), GetPixel(Buffer, x*2, y*2 + 1))); + Banner[y * 96 + x] = Average32(GetPixel(Buffer, x*2, y*2), surround); + } + } + } + else + { + memcpy(Banner, &BannerVec[0], 96 * 32 * 4); + } + return true; } } } @@ -210,14 +227,15 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmula { PowerPC::Start(); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj) { PowerPC::Pause(); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj) { - PowerPC::Stop(); + Core::Stop(); + updateMainFrameEvent.Set(); // Kick the waiting event } JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onTouchEvent(JNIEnv *env, jobject obj, jint Action, jfloat X, jfloat Y) { @@ -260,10 +278,22 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle( env->ReleaseStringUTFChars(jFile, File); return env->NewStringUTF(Name.c_str()); } + JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj) { return env->NewStringUTF(scm_rev_str); } + +JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SupportsNEON(JNIEnv *env, jobject obj) +{ + return cpu_info.bNEON; +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv *env, jobject obj) +{ + Core::SaveScreenShot(); +} + JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jKey, jstring jValue, jstring jDefault) { IniFile ini; @@ -271,12 +301,12 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig const char *Key = env->GetStringUTFChars(jKey, NULL); const char *Value = env->GetStringUTFChars(jValue, NULL); const char *Default = env->GetStringUTFChars(jDefault, NULL); - + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File)); std::string value; - + ini.Get(Key, Value, &value, Default); - + env->ReleaseStringUTFChars(jFile, File); env->ReleaseStringUTFChars(jKey, Key); env->ReleaseStringUTFChars(jValue, Value); @@ -291,7 +321,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetConfig(JN const char *Key = env->GetStringUTFChars(jKey, NULL); const char *Value = env->GetStringUTFChars(jValue, NULL); const char *Default = env->GetStringUTFChars(jDefault, NULL); - + ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File)); ini.Set(Key, Value, Default); @@ -317,12 +347,39 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetDimension g_height = (int)_height; } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveState(JNIEnv *env, jobject obj, jint slot) +{ + State::Save(slot); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_LoadState(JNIEnv *env, jobject obj, jint slot) +{ + State::Load(slot); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CreateUserFolders(JNIEnv *env, jobject obj) +{ + File::CreateFullPath(File::GetUserPath(D_CONFIG_IDX)); + File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX)); + File::CreateFullPath(File::GetUserPath(D_WIIUSER_IDX)); + File::CreateFullPath(File::GetUserPath(D_CACHE_IDX)); + File::CreateFullPath(File::GetUserPath(D_DUMPDSP_IDX)); + File::CreateFullPath(File::GetUserPath(D_DUMPTEXTURES_IDX)); + File::CreateFullPath(File::GetUserPath(D_HIRESTEXTURES_IDX)); + File::CreateFullPath(File::GetUserPath(D_SCREENSHOTS_IDX)); + File::CreateFullPath(File::GetUserPath(D_STATESAVES_IDX)); + File::CreateFullPath(File::GetUserPath(D_MAILLOGS_IDX)); + File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + USA_DIR DIR_SEP); + File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + EUR_DIR DIR_SEP); + File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + JAP_DIR DIR_SEP); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf) { surf = ANativeWindow_fromSurface(env, _surf); // Install our callbacks - OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0); - OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2); + OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init); + OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown); LogManager::Init(); SConfig::Init(); @@ -337,7 +394,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv * ini.Get("Android", "ScreenControls", &onscreencontrols, true); if (onscreencontrols) - OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1); + OSD::AddCallback(OSD::OSD_ONFRAME, ButtonManager::DrawButtons); // No use running the loop when booting fails if ( BootManager::BootCore( g_filename.c_str() ) ) @@ -348,6 +405,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv * VideoBackend::ClearList(); SConfig::Shutdown(); LogManager::Shutdown(); + ANativeWindow_release(surf); } diff --git a/Source/Core/DolphinWX/Src/MainNoGUI.cpp b/Source/Core/DolphinWX/Src/MainNoGUI.cpp index ad1ac8120d..c9e61b46f7 100644 --- a/Source/Core/DolphinWX/Src/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/Src/MainNoGUI.cpp @@ -260,7 +260,7 @@ int main(int argc, char* argv[]) { #ifdef __APPLE__ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSEvent *event = [[NSEvent alloc] init]; + NSEvent *event = [[NSEvent alloc] init]; [NSApplication sharedApplication]; [NSApp activateIgnoringOtherApps: YES]; [NSApp finishLaunching]; @@ -313,7 +313,7 @@ int main(int argc, char* argv[]) event = [NSApp nextEventMatchingMask: NSAnyEventMask untilDate: [NSDate distantFuture] inMode: NSDefaultRunLoopMode dequeue: YES]; - + if ([event type] == NSKeyDown && [event modifierFlags] & NSCommandKeyMask && [[event characters] UTF8String][0] == 'q') @@ -321,10 +321,10 @@ int main(int argc, char* argv[]) Core::Stop(); break; } - + if ([event type] != NSKeyDown) [NSApp sendEvent: event]; - } + } [event release]; [pool release]; diff --git a/Source/Core/DolphinWX/Src/MemcardManager.cpp b/Source/Core/DolphinWX/Src/MemcardManager.cpp index 68f56c014c..9b345c3469 100644 --- a/Source/Core/DolphinWX/Src/MemcardManager.cpp +++ b/Source/Core/DolphinWX/Src/MemcardManager.cpp @@ -176,7 +176,7 @@ void CMemcardManager::CreateGUIControls() m_ConvertToGci = new wxButton(this, ID_CONVERTTOGCI, _("Convert to GCI")); wxStaticBoxSizer *sMemcard[2]; - + for (int slot = SLOT_A; slot <= SLOT_B; slot++) { m_CopyFrom[slot] = new wxButton(this, ID_COPYFROM_A + slot, @@ -203,10 +203,10 @@ void CMemcardManager::CreateGUIControls() m_MemcardPath[slot] = new wxFilePickerCtrl(this, ID_MEMCARDPATH_A + slot, StrToWxStr(File::GetUserPath(D_GCUSER_IDX)), _("Choose a memory card:"), _("Gamecube Memory Cards (*.raw,*.gcp)") + wxString(wxT("|*.raw;*.gcp")), wxDefaultPosition, wxDefaultSize, wxFLP_USE_TEXTCTRL|wxFLP_OPEN); - + m_MemcardList[slot] = new CMemcardListCtrl(this, ID_MEMCARDLIST_A + slot, wxDefaultPosition, wxSize(350,400), wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL, mcmSettings); - + m_MemcardList[slot]->AssignImageList(new wxImageList(96,32),wxIMAGE_LIST_SMALL); sMemcard[slot] = new wxStaticBoxSizer(wxVERTICAL, this, _("Memory Card") + wxString::Format(wxT(" %c"), 'A' + slot)); @@ -499,7 +499,7 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) { PanicAlert(E_SAVEFAILED); } - break; + break; case ID_CONVERTTOGCI: fileName2 = "convert"; case ID_SAVEIMPORT_A: @@ -703,7 +703,7 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) auto const string_decoder = memoryCard[card]->IsAsciiEncoding() ? CP1252ToUTF8 : SHIFTJISToUTF8; - + wxTitle = StrToWxStr(string_decoder(title)); wxComment = StrToWxStr(string_decoder(comment)); @@ -711,10 +711,10 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) m_MemcardList[card]->SetItem(index, COLUMN_COMMENT, wxComment); blocks = memoryCard[card]->DEntry_BlockCount(fileIndex); - + if (blocks == 0xFFFF) blocks = 0; - + wxBlock.Printf(wxT("%10d"), blocks); m_MemcardList[card]->SetItem(index,COLUMN_BLOCKS, wxBlock); firstblock = memoryCard[card]->DEntry_FirstBlock(fileIndex); @@ -777,7 +777,7 @@ void CMemcardManager::CMemcardListCtrl::OnRightClick(wxMouseEvent& event) long item = HitTest(event.GetPosition(), flags); wxMenu* popupMenu = new wxMenu; - if (item != wxNOT_FOUND) + if (item != wxNOT_FOUND) { if (GetItemState(item, wxLIST_STATE_SELECTED) != wxLIST_STATE_SELECTED) { @@ -791,7 +791,7 @@ void CMemcardManager::CMemcardListCtrl::OnRightClick(wxMouseEvent& event) popupMenu->Append(ID_SAVEIMPORT_A + slot, _("Import Save")); popupMenu->Append(ID_SAVEEXPORT_A + slot, _("Export Save")); popupMenu->Append(ID_EXPORTALL_A + slot, _("Export all saves")); - + popupMenu->FindItem(ID_COPYFROM_A + slot)->Enable(__mcmSettings.twoCardsLoaded); popupMenu->AppendSeparator(); @@ -805,7 +805,7 @@ void CMemcardManager::CMemcardListCtrl::OnRightClick(wxMouseEvent& event) popupMenu->FindItem(ID_PREVPAGE_A + slot)->Enable(prevPage && __mcmSettings.usePages); popupMenu->FindItem(ID_NEXTPAGE_A + slot)->Enable(nextPage && __mcmSettings.usePages); popupMenu->FindItem(ID_USEPAGES)->Check(__mcmSettings.usePages); - + popupMenu->AppendSeparator(); // popupMenu->AppendCheckItem(COLUMN_BANNER, _("Show save banner")); diff --git a/Source/Core/DolphinWX/Src/MemcardManager.h b/Source/Core/DolphinWX/Src/MemcardManager.h index 9f2f8f0d9b..4310fbcfcf 100644 --- a/Source/Core/DolphinWX/Src/MemcardManager.h +++ b/Source/Core/DolphinWX/Src/MemcardManager.h @@ -103,7 +103,7 @@ class CMemcardManager : public wxDialog COLUMN_COMMENTSADDRESS, NUMBER_OF_COLUMN }; - + GCMemcard *memoryCard[2]; void CreateGUIControls(); @@ -146,9 +146,9 @@ class CMemcardManager : public wxDialog bool prevPage, nextPage; private: - void OnRightClick(wxMouseEvent& event); + void OnRightClick(wxMouseEvent& event); }; - + CMemcardListCtrl *m_MemcardList[2]; }; diff --git a/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp b/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp index cfdccf26c2..2ccc236395 100644 --- a/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp +++ b/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.cpp @@ -7,11 +7,14 @@ // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt +#include +#include + #include "WiiSaveCrypted.h" #include "FileUtil.h" #include "MathUtil.h" #include "NandPaths.h" -#include +#include "FileUtil.h" static Common::replace_v replacements; @@ -21,18 +24,63 @@ const u8 MD5_BLANKER[0x10] = {0x0E, 0x65, 0x37, 0x81, 0x99, 0xBE, 0x45, 0x17, 0xAB, 0x06, 0xEC, 0x22, 0x45, 0x1A, 0x57, 0x93}; const u32 NG_id = 0x0403AC68; +bool CWiiSaveCrypted::ImportWiiSave(const char* FileName) +{ + CWiiSaveCrypted saveFile(FileName); + return saveFile.b_valid; +} + +bool CWiiSaveCrypted::ExportWiiSave(u64 TitleID) +{ + CWiiSaveCrypted exportSave("", TitleID); + return exportSave.b_valid; +} + +void CWiiSaveCrypted::ExportAllSaves() +{ + std::string titleFolder = File::GetUserPath(D_WIIUSER_IDX) + "title"; + std::vector titles; + u32 pathMask = 0x00010000; + for (int i = 0; i < 8; ++i) + { + File::FSTEntry FST_Temp; + std::string folder = StringFromFormat("%s/%08x/", titleFolder.c_str(), pathMask | i); + File::ScanDirectoryTree(folder, FST_Temp); + + for (auto& entry : FST_Temp.children) + { + if (entry.isDirectory) + { + u32 gameid; + if (AsciiToHex(entry.virtualName.c_str(), gameid)) + { + std::string bannerPath = StringFromFormat("%s%08x/data/banner.bin", folder.c_str(), gameid); + if (File::Exists(bannerPath)) + { + u64 titleID = (((u64)pathMask | i) << 32) | gameid; + titles.push_back(titleID); + } + } + } + } + } + SuccessAlertT("Found %x save files", (unsigned int) titles.size()); + for (auto& title : titles) + { + CWiiSaveCrypted* exportSave = new CWiiSaveCrypted("", title); + delete exportSave; + } +} CWiiSaveCrypted::CWiiSaveCrypted(const char* FileName, u64 TitleID) : m_TitleID(TitleID) { Common::ReadReplacements(replacements); - strcpy(pathData_bin, FileName); + encryptedSavePath = std::string(FileName); memcpy(SD_IV, "\x21\x67\x12\xE6\xAA\x1F\x68\x9F\x95\xC5\xA2\x23\x24\xDC\x6A\x98", 0x10); if (!TitleID) // Import { - AES_set_decrypt_key(SDKey, 128, &m_AES_KEY); - do - { + aes_setkey_dec(&m_AES_ctx, SDKey, 128); b_valid = true; ReadHDR(); ReadBKHDR(); @@ -41,47 +89,41 @@ CWiiSaveCrypted::CWiiSaveCrypted(const char* FileName, u64 TitleID) if (b_valid) { SuccessAlertT("Successfully imported save files"); - b_tryAgain = false; } else { - b_tryAgain = AskYesNoT("Import failed, try again?"); + PanicAlertT("Import failed"); } - } while(b_tryAgain); } else { - AES_set_encrypt_key(SDKey, 128, &m_AES_KEY); - + aes_setkey_enc(&m_AES_ctx, SDKey, 128); + if (getPaths(true)) { - do + b_valid = true; + WriteHDR(); + WriteBKHDR(); + ExportWiiSaveFiles(); + do_sig(); + if (b_valid) { - b_valid = true; - WriteHDR(); - WriteBKHDR(); - ExportWiiSaveFiles(); - do_sig(); - if (b_valid) - { - SuccessAlertT("Successfully exported file to %s", pathData_bin); - b_tryAgain = false; - } - else - { - b_tryAgain = AskYesNoT("Export failed, try again?"); - } - } while(b_tryAgain); + SuccessAlertT("Successfully exported file to %s", encryptedSavePath.c_str()); + } + else + { + PanicAlertT("Export failed"); + } } } } void CWiiSaveCrypted::ReadHDR() { - File::IOFile fpData_bin(pathData_bin, "rb"); + File::IOFile fpData_bin(encryptedSavePath, "rb"); if (!fpData_bin) { - PanicAlertT("Cannot open %s", pathData_bin); + PanicAlertT("Cannot open %s", encryptedSavePath.c_str()); b_valid = false; return; } @@ -93,36 +135,40 @@ void CWiiSaveCrypted::ReadHDR() } fpData_bin.Close(); - AES_cbc_encrypt((const u8*)&_encryptedHeader, (u8*)&_header, HEADER_SZ, &m_AES_KEY, SD_IV, AES_DECRYPT); - _bannerSize = Common::swap32(_header.hdr.BannerSize); - if ((_bannerSize < FULL_BNR_MIN) || (_bannerSize > FULL_BNR_MAX) || - (((_bannerSize - BNR_SZ) % ICON_SZ) != 0)) + aes_crypt_cbc(&m_AES_ctx, AES_DECRYPT, HEADER_SZ, SD_IV, (const u8*)&_encryptedHeader, (u8*)&_header); + u32 bannerSize = Common::swap32(_header.hdr.BannerSize); + if ((bannerSize < FULL_BNR_MIN) || (bannerSize > FULL_BNR_MAX) || + (((bannerSize - BNR_SZ) % ICON_SZ) != 0)) { - PanicAlertT("Not a Wii save or read failure for file header size %x", _bannerSize); + PanicAlertT("Not a Wii save or read failure for file header size %x", bannerSize); b_valid = false; return; } m_TitleID = Common::swap64(_header.hdr.SaveGameTitle); + + u8 md5_file[16], + md5_calc[16]; memcpy(md5_file, _header.hdr.Md5, 0x10); memcpy(_header.hdr.Md5, MD5_BLANKER, 0x10); md5((u8*)&_header, HEADER_SZ, md5_calc); if (memcmp(md5_file, md5_calc, 0x10)) { - PanicAlertT("MD5 mismatch\n %016llx%016llx != %016llx%016llx", Common::swap64(md5_file),Common::swap64(md5_file+8), Common::swap64(md5_calc), Common::swap64(md5_calc+8)); + PanicAlertT("MD5 mismatch\n %016" PRIx64 "%016" PRIx64 " != %016" PRIx64 "%016" PRIx64, Common::swap64(md5_file),Common::swap64(md5_file+8), Common::swap64(md5_calc), Common::swap64(md5_calc+8)); b_valid= false; } - + if (!getPaths()) { b_valid = false; - return; + return; } + std::string BannerFilePath = WiiTitlePath + "banner.bin"; if (!File::Exists(BannerFilePath) || AskYesNoT("%s already exists, overwrite?", BannerFilePath.c_str())) { INFO_LOG(CONSOLE, "Creating file %s", BannerFilePath.c_str()); File::IOFile fpBanner_bin(BannerFilePath, "wb"); - fpBanner_bin.WriteBytes(_header.BNR, _bannerSize); + fpBanner_bin.WriteBytes(_header.BNR, bannerSize); } } @@ -131,12 +177,13 @@ void CWiiSaveCrypted::WriteHDR() if (!b_valid) return; memset(&_header, 0, HEADER_SZ); + std::string BannerFilePath = WiiTitlePath + "banner.bin"; u32 bannerSize = File::GetSize(BannerFilePath); _header.hdr.BannerSize = Common::swap32(bannerSize); _header.hdr.SaveGameTitle = Common::swap64(m_TitleID); memcpy(_header.hdr.Md5, MD5_BLANKER, 0x10); - _header.hdr.Permissions = 0x35; + _header.hdr.Permissions = 0x3C; File::IOFile fpBanner_bin(BannerFilePath, "rb"); if (!fpBanner_bin.ReadBytes(_header.BNR, bannerSize)) @@ -145,16 +192,19 @@ void CWiiSaveCrypted::WriteHDR() b_valid = false; return; } - + // remove nocopy flag + _header.BNR[7] &= ~1; + + u8 md5_calc[16]; md5((u8*)&_header, HEADER_SZ, md5_calc); memcpy(_header.hdr.Md5, md5_calc, 0x10); - AES_cbc_encrypt((const unsigned char *)&_header, (u8*)&_encryptedHeader, HEADER_SZ, &m_AES_KEY, SD_IV, AES_ENCRYPT); - - File::IOFile fpData_bin(pathData_bin, "wb"); + aes_crypt_cbc(&m_AES_ctx, AES_ENCRYPT, HEADER_SZ, SD_IV, (const u8*)&_header, (u8*)&_encryptedHeader); + + File::IOFile fpData_bin(encryptedSavePath, "wb"); if (!fpData_bin.WriteBytes(&_encryptedHeader, HEADER_SZ)) { - PanicAlertT("Failed to write header for %s", pathData_bin); + PanicAlertT("Failed to write header for %s", encryptedSavePath.c_str()); b_valid = false; } } @@ -164,11 +214,11 @@ void CWiiSaveCrypted::WriteHDR() void CWiiSaveCrypted::ReadBKHDR() { if (!b_valid) return; - - File::IOFile fpData_bin(pathData_bin, "rb"); + + File::IOFile fpData_bin(encryptedSavePath, "rb"); if (!fpData_bin) { - PanicAlertT("Cannot open %s", pathData_bin); + PanicAlertT("Cannot open %s", encryptedSavePath.c_str()); b_valid = false; return; } @@ -180,7 +230,7 @@ void CWiiSaveCrypted::ReadBKHDR() return; } fpData_bin.Close(); - + if (bkhdr.size != Common::swap32(BK_LISTED_SZ) || bkhdr.magic != Common::swap32(BK_HDR_MAGIC)) { @@ -188,15 +238,15 @@ void CWiiSaveCrypted::ReadBKHDR() b_valid = false; return; } - + _numberOfFiles = Common::swap32(bkhdr.numberOfFiles); _sizeOfFiles = Common::swap32(bkhdr.sizeOfFiles); _totalSize = Common::swap32(bkhdr.totalSize); - + if (_sizeOfFiles + FULL_CERT_SZ != _totalSize) WARN_LOG(CONSOLE, "Size(%x) + cert(%x) does not equal totalsize(%x)", _sizeOfFiles, FULL_CERT_SZ, _totalSize); if (m_TitleID != Common::swap64(bkhdr.SaveGameTitle)) - WARN_LOG(CONSOLE, "Encrypted title (%llx) does not match unencrypted title (%llx)", m_TitleID, Common::swap64(bkhdr.SaveGameTitle)); + WARN_LOG(CONSOLE, "Encrypted title (%" PRIx64 ") does not match unencrypted title (%" PRIx64 ")", m_TitleID, Common::swap64(bkhdr.SaveGameTitle)); } void CWiiSaveCrypted::WriteBKHDR() @@ -204,7 +254,7 @@ void CWiiSaveCrypted::WriteBKHDR() if (!b_valid) return; _numberOfFiles = 0; _sizeOfFiles = 0; - + ScanForFiles(WiiTitlePath, FilesList, &_numberOfFiles, &_sizeOfFiles); memset(&bkhdr, 0, BK_SZ); bkhdr.size = Common::swap32(BK_LISTED_SZ); @@ -215,7 +265,7 @@ void CWiiSaveCrypted::WriteBKHDR() bkhdr.totalSize = Common::swap32(_sizeOfFiles + FULL_CERT_SZ); bkhdr.SaveGameTitle = Common::swap64(m_TitleID); - File::IOFile fpData_bin(pathData_bin, "ab"); + File::IOFile fpData_bin(encryptedSavePath, "ab"); if (!fpData_bin.WriteBytes(&bkhdr, BK_SZ)) { PanicAlertT("Failed to write bkhdr"); @@ -227,10 +277,10 @@ void CWiiSaveCrypted::ImportWiiSaveFiles() { if (!b_valid) return; - File::IOFile fpData_bin(pathData_bin, "rb"); + File::IOFile fpData_bin(encryptedSavePath, "rb"); if (!fpData_bin) { - PanicAlertT("Cannot open %s", pathData_bin); + PanicAlertT("Cannot open %s", encryptedSavePath.c_str()); b_valid = false; return; } @@ -244,14 +294,14 @@ void CWiiSaveCrypted::ImportWiiSaveFiles() { memset(&_tmpFileHDR, 0, FILE_HDR_SZ); memset(IV, 0, 0x10); - _fileSize = 0; - + u32 _fileSize = 0; + if (!fpData_bin.ReadBytes(&_tmpFileHDR, FILE_HDR_SZ)) { - PanicAlertT("Failed to write header for file %d", i); + PanicAlertT("Failed to read header for file %d", i); b_valid = false; } - + if (Common::swap32(_tmpFileHDR.magic) != FILE_HDR_MAGIC) { PanicAlertT("Bad File Header"); @@ -272,30 +322,29 @@ void CWiiSaveCrypted::ImportWiiSaveFiles() { _fileSize = Common::swap32(_tmpFileHDR.size); u32 RoundedFileSize = ROUND_UP(_fileSize, BLOCK_SZ); - _encryptedData = new u8[RoundedFileSize]; - _data = new u8[RoundedFileSize]; - if (!fpData_bin.ReadBytes(_encryptedData, RoundedFileSize)) + std::vector _data,_encryptedData; + _data.reserve(RoundedFileSize); + _encryptedData.reserve(RoundedFileSize); + if (!fpData_bin.ReadBytes(&_encryptedData[0], RoundedFileSize)) { PanicAlertT("Failed to read data from file %d", i); b_valid = false; break; } - - + + memcpy(IV, _tmpFileHDR.IV, 0x10); - AES_cbc_encrypt((const unsigned char *)_encryptedData, _data, RoundedFileSize, &m_AES_KEY, IV, AES_DECRYPT); - delete []_encryptedData; - + aes_crypt_cbc(&m_AES_ctx, AES_DECRYPT, RoundedFileSize, IV, (const u8*)&_encryptedData[0], &_data[0]); + if (!File::Exists(fullFilePath) || AskYesNoT("%s already exists, overwrite?", fullFilePath.c_str())) { INFO_LOG(CONSOLE, "Creating file %s", fullFilePath.c_str()); - + File::IOFile fpRawSaveFile(fullFilePath, "wb"); - fpRawSaveFile.WriteBytes(_data, _fileSize); + fpRawSaveFile.WriteBytes(&_data[0], _fileSize); } - delete []_data; } - } + } } } @@ -303,27 +352,31 @@ void CWiiSaveCrypted::ExportWiiSaveFiles() { if (!b_valid) return; - u8 *__ENCdata, - *__data; - for(u32 i = 0; i < _numberOfFiles; i++) { FileHDR tmpFileHDR; std::string __name, __ext; memset(&tmpFileHDR, 0, FILE_HDR_SZ); - _fileSize = File::GetSize(FilesList[i]); - _roundedfileSize = ROUND_UP(_fileSize, BLOCK_SZ); + u32 _fileSize = 0; + if (File::IsDirectory(FilesList[i])) + { + tmpFileHDR.type = 2; + } + else + { + _fileSize = File::GetSize(FilesList[i]); + tmpFileHDR.type = 1; + } + u32 _roundedfileSize = ROUND_UP(_fileSize, BLOCK_SZ); tmpFileHDR.magic = Common::swap32(FILE_HDR_MAGIC); tmpFileHDR.size = Common::swap32(_fileSize); - tmpFileHDR.Permissions = 0x35; - tmpFileHDR.type = File::IsDirectory(FilesList[i]) ? 2 : 1; + tmpFileHDR.Permissions = 0x3c; + + __name = FilesList[i].substr(WiiTitlePath.length()+1); - SplitPath(FilesList[i], NULL, &__name, &__ext); - __name += __ext; - for (Common::replace_v::const_iterator iter = replacements.begin(); iter != replacements.end(); ++iter) { for (size_t j = 0; (j = __name.find(iter->second, j)) != __name.npos; ++j) @@ -331,7 +384,7 @@ void CWiiSaveCrypted::ExportWiiSaveFiles() __name.replace(j, iter->second.length(), 1, iter->first); } } - + if (__name.length() > 0x44) { PanicAlertT("%s is too long for the filename, max chars is 45", __name.c_str()); @@ -339,9 +392,9 @@ void CWiiSaveCrypted::ExportWiiSaveFiles() return; } strncpy((char *)tmpFileHDR.name, __name.c_str(), __name.length()); - + { - File::IOFile fpData_bin(pathData_bin, "ab"); + File::IOFile fpData_bin(encryptedSavePath, "ab"); fpData_bin.WriteBytes(&tmpFileHDR, FILE_HDR_SZ); } @@ -359,22 +412,23 @@ void CWiiSaveCrypted::ExportWiiSaveFiles() PanicAlertT("%s failed to open", FilesList[i].c_str()); b_valid = false; } - __data = new u8[_roundedfileSize]; - __ENCdata = new u8[_roundedfileSize]; - memset(__data, 0, _roundedfileSize); - if (!fpRawSaveFile.ReadBytes(__data, _fileSize)) + + std::vector _data,_encryptedData; + _data.reserve(_roundedfileSize); + _encryptedData.reserve(_roundedfileSize); + memset(&_data[0], 0, _roundedfileSize); + if (!fpRawSaveFile.ReadBytes(&_data[0], _fileSize)) { PanicAlertT("Failed to read data from file: %s", FilesList[i].c_str()); b_valid = false; } - AES_cbc_encrypt((const u8*)__data, __ENCdata, _roundedfileSize, &m_AES_KEY, tmpFileHDR.IV, AES_ENCRYPT); - - File::IOFile fpData_bin(pathData_bin, "ab"); - fpData_bin.WriteBytes(__ENCdata, _roundedfileSize); + aes_crypt_cbc(&m_AES_ctx, AES_ENCRYPT, _roundedfileSize, tmpFileHDR.IV, (const u8*)&_data[0], &_encryptedData[0]); + + File::IOFile fpData_bin(encryptedSavePath, "ab"); + if (!fpData_bin.WriteBytes(&_encryptedData[0], _roundedfileSize)) + PanicAlertT("Failed to write data to file: %s", encryptedSavePath.c_str()); - delete [] __data; - delete [] __ENCdata; } } @@ -393,7 +447,7 @@ void CWiiSaveCrypted::do_sig() char name[64]; u8 *data; u32 data_size; - + u32 NG_key_id = 0x6AAB8C59; u8 NG_priv[30] = { 0, 0xAB, 0xEE, 0xC1, 0xDD, 0xB4, 0xA6, 0x16, 0x6B, 0x70, 0xFD, 0x7E, 0x56, 0x67, 0x70, @@ -424,7 +478,7 @@ void CWiiSaveCrypted::do_sig() data_size = Common::swap32(bkhdr.sizeOfFiles) + 0x80; - File::IOFile fpData_bin(pathData_bin, "rb"); + File::IOFile fpData_bin(encryptedSavePath, "rb"); if (!fpData_bin) { b_valid = false; @@ -443,7 +497,7 @@ void CWiiSaveCrypted::do_sig() sha1(hash, 20, hash); delete []data; - fpData_bin.Open(pathData_bin, "ab"); + fpData_bin.Open(encryptedSavePath, "ab"); if (!fpData_bin) { b_valid = false; @@ -451,7 +505,7 @@ void CWiiSaveCrypted::do_sig() } generate_ecdsa(sig, sig + 30, ap_priv, hash); *(u32*)(sig + 60) = Common::swap32(0x2f536969); - + fpData_bin.WriteArray(sig, sizeof(sig)); fpData_bin.WriteArray(ng_cert, sizeof(ng_cert)); fpData_bin.WriteArray(ap_cert, sizeof(ap_cert)); @@ -478,7 +532,6 @@ bool CWiiSaveCrypted::getPaths(bool forExport) if (m_TitleID) { WiiTitlePath = Common::GetTitleDataPath(m_TitleID); - BannerFilePath = WiiTitlePath + "banner.bin"; } if (forExport) @@ -494,21 +547,21 @@ bool CWiiSaveCrypted::getPaths(bool forExport) PanicAlertT("No save folder found for title %s", GameID); return false; } - - if(!File::Exists(BannerFilePath)) + + if(!File::Exists(WiiTitlePath + "banner.bin")) { b_valid = false; PanicAlertT("No banner file found for title %s", GameID); return false; } - if (strlen(pathData_bin) == 0) - strcpy(pathData_bin, "."); // If no path was passed, use current dir - sprintf(pathData_bin, "%s/private/wii/title/%s/data.bin", pathData_bin, GameID); - File::CreateFullPath(pathData_bin); + if (encryptedSavePath.length() == 0) + encryptedSavePath = "."; // If no path was passed, use current dir + encryptedSavePath += StringFromFormat("/private/wii/title/%s/data.bin", GameID); + File::CreateFullPath(encryptedSavePath); } else { - File::CreateFullPath(WiiTitlePath); + File::CreateFullPath(WiiTitlePath); if (!AskYesNoT("Warning! it is advised to backup all files in the folder:\n%s\nDo you wish to continue?", WiiTitlePath.c_str())) return false; } @@ -530,20 +583,25 @@ void CWiiSaveCrypted::ScanForFiles(std::string savDir, std::vector& File::FSTEntry FST_Temp; File::ScanDirectoryTree(Directories[i], FST_Temp); - for (u32 j = 0; j < FST_Temp.children.size(); j++) + for (auto& elem : FST_Temp.children) { - if (strncmp(FST_Temp.children.at(j).virtualName.c_str(), "banner.bin", 10) != 0) + if (strncmp(elem.virtualName.c_str(), "banner.bin", 10) != 0) { (*_numFiles)++; - *_sizeFiles += FILE_HDR_SZ + ROUND_UP(FST_Temp.children.at(j).size, BLOCK_SZ); - - if (FST_Temp.children.at(j).isDirectory) + *_sizeFiles += FILE_HDR_SZ; + if (elem.isDirectory) { - Directories.push_back(FST_Temp.children.at(j).physicalName); + if ((elem.virtualName == "nocopy") || elem.virtualName == "nomove") + { + PanicAlert("This save will likely require homebrew tools to copy to a real wii"); + } + + Directories.push_back(elem.physicalName); } else { - FileList.push_back(FST_Temp.children.at(j).physicalName); + FileList.push_back(elem.physicalName); + *_sizeFiles += ROUND_UP(elem.size, BLOCK_SZ); } } } diff --git a/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.h b/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.h index c27ee58a19..68afad43cf 100644 --- a/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.h +++ b/Source/Core/DolphinWX/Src/MemoryCards/WiiSaveCrypted.h @@ -6,9 +6,9 @@ #define _WII_SAVE_CRYPTED #include "StringUtil.h" -#include "Crypto/aes.h" #include "Crypto/tools.h" -#include "Crypto/md5.h" +#include +#include "polarssl/md5.h" // --- this is used for encrypted Wii save files @@ -16,6 +16,11 @@ class CWiiSaveCrypted { public: + bool static ImportWiiSave(const char* FileName); + bool static ExportWiiSave(u64 TitleID); + void static ExportAllSaves(); + +private: CWiiSaveCrypted(const char* FileName, u64 TitleID = 0); ~CWiiSaveCrypted(); void ReadHDR(); @@ -30,33 +35,24 @@ public: bool getPaths(bool forExport = false); void ScanForFiles(std::string savDir, std::vector&FilesList, u32 *_numFiles, u32 *_sizeFiles); -private: - AES_KEY m_AES_KEY; + aes_context m_AES_ctx; u8 SD_IV[0x10]; std::vector FilesList; - char pathData_bin[2048]; + std::string encryptedSavePath; - std::string BannerFilePath, - WiiTitlePath; + std::string WiiTitlePath; - u8 IV[0x10], - *_encryptedData, - *_data, - md5_file[16], - md5_calc[16]; + u8 IV[0x10]; - u32 _bannerSize, + u32 //_bannerSize, _numberOfFiles, _sizeOfFiles, - _totalSize, - _fileSize, - _roundedfileSize; + _totalSize; u64 m_TitleID; - bool b_valid, - b_tryAgain; + bool b_valid; enum { diff --git a/Source/Core/DolphinWX/Src/NetWindow.cpp b/Source/Core/DolphinWX/Src/NetWindow.cpp index 7f1b7c6866..79ec2b59a5 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.cpp +++ b/Source/Core/DolphinWX/Src/NetWindow.cpp @@ -32,7 +32,7 @@ std::string BuildGameName(const GameListItem& game) { // Lang needs to be consistent auto const lang = 0; - + std::string name(game.GetBannerName(lang)); if (name.empty()) name = game.GetVolumeName(lang); @@ -62,7 +62,7 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* // top row wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname :"), wxDefaultPosition, wxDefaultSize); - + std::string nickname; netplay_section.Get("Nickname", &nickname, "Player"); m_nickname_text = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(nickname)); @@ -84,17 +84,17 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* { wxStaticText* const ip_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Address :"), wxDefaultPosition, wxDefaultSize); - + std::string address; netplay_section.Get("Address", &address, "localhost"); m_connect_ip_text = new wxTextCtrl(connect_tab, wxID_ANY, StrToWxStr(address)); wxStaticText* const port_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Port :"), wxDefaultPosition, wxDefaultSize); - + // string? w/e std::string port; - netplay_section.Get("ConnectPort", &port, "2626"); + netplay_section.Get("ConnectPort", &port, "2626"); m_connect_port_text = new wxTextCtrl(connect_tab, wxID_ANY, StrToWxStr(port)); wxButton* const connect_btn = new wxButton(connect_tab, wxID_ANY, _("Connect")); @@ -107,11 +107,11 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* " - DSP Emulator Engine Must be the same on all computers!\n" " - DSP on Dedicated Thread [OFF]\n" " - Framelimit NOT set to [Audio]\n" - " - Manually set the exact number of controllers to be used to [Standard Controller]\n" + " - Manually set the extensions for each wiimote\n" "\n" "All players should use the same Dolphin version and settings.\n" "All memory cards must be identical between players or disabled.\n" - "Wiimote support has not been implemented!\n" + "Wiimote support is probably terrible. Don't use it.\n" "\n" "The host must have the chosen TCP port open/forwarded!\n"), wxDefaultPosition, wxDefaultSize); @@ -136,10 +136,10 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* { wxStaticText* const port_lbl = new wxStaticText(host_tab, wxID_ANY, _("Port :"), wxDefaultPosition, wxDefaultSize); - + // string? w/e std::string port; - netplay_section.Get("HostPort", &port, "2626"); + netplay_section.Get("HostPort", &port, "2626"); m_host_port_text = new wxTextCtrl(host_tab, wxID_ANY, StrToWxStr(port)); wxButton* const host_btn = new wxButton(host_tab, wxID_ANY, _("Host")); @@ -147,7 +147,7 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* m_game_lbox = new wxListBox(host_tab, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxLB_SORT); m_game_lbox->Bind(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, &NetPlaySetupDiag::OnHost, this); - + FillWithGameNames(m_game_lbox, *game_list); wxBoxSizer* const top_szr = new wxBoxSizer(wxHORIZONTAL); @@ -254,9 +254,12 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent&) if(m_upnp_chk->GetValue()) netplay_server->TryPortmapping(port); #endif + MakeNetPlayDiag(port, game, true); + } + else + { + PanicAlertT("Failed to listen. Is another instance of the NetPlay server running?"); } - - MakeNetPlayDiag(port, game, true); } void NetPlaySetupDiag::OnJoin(wxCommandEvent&) @@ -291,7 +294,7 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game m_game_btn = new wxButton(panel, wxID_ANY, StrToWxStr(m_selected_game).Prepend(_(" Game : ")), wxDefaultPosition, wxDefaultSize, wxBU_LEFT); - + if (is_hosting) m_game_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &NetPlayDiag::OnChangeGame, this); else @@ -355,6 +358,9 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game bottom_szr->Add(m_memcard_write, 0, wxCENTER); } + m_record_chkbox = new wxCheckBox(panel, wxID_ANY, _("Record input")); + bottom_szr->Add(m_record_chkbox, 0, wxCENTER); + bottom_szr->AddStretchSpacer(1); bottom_szr->Add(quit_btn); @@ -402,12 +408,12 @@ void NetPlayDiag::OnChat(wxCommandEvent&) void NetPlayDiag::GetNetSettings(NetSettings &settings) { SConfig &instance = SConfig::GetInstance(); + settings.m_CPUthread = instance.m_LocalCoreStartupParameter.bCPUThread; settings.m_DSPHLE = instance.m_LocalCoreStartupParameter.bDSPHLE; settings.m_DSPEnableJIT = instance.m_EnableJIT; settings.m_WriteToMemcard = m_memcard_write->GetValue(); - - for (unsigned int i = 0; i < 4; ++i) - settings.m_Controllers[i] = SConfig::GetInstance().m_SIDevice[i]; + settings.m_EXIDevice[0] = instance.m_EXIDevice[0]; + settings.m_EXIDevice[1] = instance.m_EXIDevice[1]; } std::string NetPlayDiag::FindGame() @@ -416,7 +422,7 @@ std::string NetPlayDiag::FindGame() for (u32 i = 0 ; auto game = m_game_list->GetISO(i); ++i) if (m_selected_game == BuildGameName(*game)) return game->GetFileName(); - + PanicAlertT("Game not found!"); return ""; } @@ -467,6 +473,7 @@ void NetPlayDiag::OnMsgStartGame() GetEventHandler()->AddPendingEvent(evt); if (m_start_btn) m_start_btn->Disable(); + m_record_chkbox->Disable(); } void NetPlayDiag::OnMsgStopGame() @@ -475,6 +482,7 @@ void NetPlayDiag::OnMsgStopGame() GetEventHandler()->AddPendingEvent(evt); if (m_start_btn) m_start_btn->Enable(); + m_record_chkbox->Enable(); } void NetPlayDiag::OnAdjustBuffer(wxCommandEvent& event) @@ -559,23 +567,21 @@ void NetPlayDiag::OnChangeGame(wxCommandEvent&) void NetPlayDiag::OnConfigPads(wxCommandEvent&) { - int mapping[4]; - - // get selected player id - int pid = m_player_lbox->GetSelection(); - if (pid < 0) - return; - pid = m_playerids.at(pid); - - if (false == netplay_server->GetPadMapping(pid, mapping)) - return; - - PadMapDiag pmd(this, mapping); + PadMapping mapping[4]; + PadMapping wiimotemapping[4]; + std::vector player_list; + netplay_server->GetPadMapping(mapping); + netplay_server->GetWiimoteMapping(wiimotemapping); + netplay_client->GetPlayers(player_list); + PadMapDiag pmd(this, mapping, wiimotemapping, player_list); pmd.ShowModal(); + netplay_server->SetPadMapping(mapping); + netplay_server->SetWiimoteMapping(wiimotemapping); +} - if (false == netplay_server->SetPadMapping(pid, mapping)) - PanicAlertT("Could not set pads. The player left or the game is currently running!\n" - "(setting pads while the game is running is not yet supported)"); +bool NetPlayDiag::IsRecording() +{ + return m_record_chkbox->GetValue(); } ChangeGameDiag::ChangeGameDiag(wxWindow* const parent, const CGameListCtrl* const game_list, wxString& game_name) @@ -605,44 +611,66 @@ void ChangeGameDiag::OnPick(wxCommandEvent& event) EndModal(wxID_OK); } -PadMapDiag::PadMapDiag(wxWindow* const parent, int map[]) +PadMapDiag::PadMapDiag(wxWindow* const parent, PadMapping map[], PadMapping wiimotemap[], std::vector& player_list) : wxDialog(parent, wxID_ANY, _("Configure Pads"), wxDefaultPosition, wxDefaultSize) , m_mapping(map) + , m_wiimapping (wiimotemap) + , m_player_list(player_list) { wxBoxSizer* const h_szr = new wxBoxSizer(wxHORIZONTAL); + h_szr->AddSpacer(10); - h_szr->AddSpacer(20); + wxArrayString player_names; + player_names.Add(_("None")); + for (auto& player : m_player_list) + player_names.Add(player->name); - // labels - wxBoxSizer* const label_szr = new wxBoxSizer(wxVERTICAL); - label_szr->Add(new wxStaticText(this, wxID_ANY, _("Local")), 0, wxALIGN_TOP); - label_szr->AddStretchSpacer(1); - label_szr->Add(new wxStaticText(this, wxID_ANY, _("In-Game")), 0, wxALIGN_BOTTOM); - - h_szr->Add(label_szr, 1, wxTOP | wxEXPAND, 20); - - // set up choices - wxString pad_names[5]; - pad_names[0] = _("None"); - for (unsigned int i=1; i<5; ++i) - pad_names[i] = wxString(_("Pad ")) + (wxChar)(wxT('0')+i); + wxString wiimote_names[5]; + wiimote_names[0] = _("None"); + for (unsigned int i=1; i < 5; ++i) + wiimote_names[i] = wxString(_("Wiimote ")) + (wxChar)(wxT('0')+i); for (unsigned int i=0; i<4; ++i) { - wxChoice* const pad_cbox = m_map_cbox[i] - = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 5, pad_names); - pad_cbox->Select(m_mapping[i] + 1); - - pad_cbox->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &PadMapDiag::OnAdjust, this); - wxBoxSizer* const v_szr = new wxBoxSizer(wxVERTICAL); - v_szr->Add(new wxStaticText(this,wxID_ANY, pad_names[i + 1]), 1, wxALIGN_CENTER_HORIZONTAL); - v_szr->Add(pad_cbox, 1); + v_szr->Add(new wxStaticText(this, wxID_ANY, (wxString(_("Pad ")) + (wxChar)(wxT('0')+i))), + 1, wxALIGN_CENTER_HORIZONTAL); + + m_map_cbox[i] = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, player_names); + m_map_cbox[i]->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &PadMapDiag::OnAdjust, this); + if (m_mapping[i] == -1) + m_map_cbox[i]->Select(0); + else + for (unsigned int j = 0; j < m_player_list.size(); j++) + if (m_mapping[i] == m_player_list[j]->pid) + m_map_cbox[i]->Select(j + 1); + + v_szr->Add(m_map_cbox[i], 1); h_szr->Add(v_szr, 1, wxTOP | wxEXPAND, 20); + h_szr->AddSpacer(10); } - h_szr->AddSpacer(20); + for (unsigned int i=0; i<4; ++i) + { + wxBoxSizer* const v_szr = new wxBoxSizer(wxVERTICAL); + v_szr->Add(new wxStaticText(this, wxID_ANY, (wxString(_("Wiimote ")) + (wxChar)(wxT('0')+i))), + 1, wxALIGN_CENTER_HORIZONTAL); + + m_map_cbox[i+4] = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, player_names); + m_map_cbox[i+4]->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &PadMapDiag::OnAdjust, this); + if (m_wiimapping[i] == -1) + m_map_cbox[i+4]->Select(0); + else + for (unsigned int j = 0; j < m_player_list.size(); j++) + if (m_wiimapping[i] == m_player_list[j]->pid) + m_map_cbox[i+4]->Select(j + 1); + + v_szr->Add(m_map_cbox[i+4], 1); + + h_szr->Add(v_szr, 1, wxTOP | wxEXPAND, 20); + h_szr->AddSpacer(10); + } wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL); main_szr->Add(h_szr); @@ -656,14 +684,24 @@ PadMapDiag::PadMapDiag(wxWindow* const parent, int map[]) void PadMapDiag::OnAdjust(wxCommandEvent& event) { (void)event; - for (unsigned int i=0; i<4; ++i) - m_mapping[i] = m_map_cbox[i]->GetSelection() - 1; + for (unsigned int i = 0; i < 4; i++) + { + int player_idx = m_map_cbox[i]->GetSelection(); + if (player_idx > 0) + m_mapping[i] = m_player_list[player_idx - 1]->pid; + else + m_mapping[i] = -1; + + player_idx = m_map_cbox[i+4]->GetSelection(); + if (player_idx > 0) + m_wiimapping[i] = m_player_list[player_idx - 1]->pid; + else + m_wiimapping[i] = -1; + } } void NetPlay::StopGame() { - if (netplay_server != NULL) - netplay_server->StopGame(); - - // TODO: allow non-hosting clients to close the window + if (netplay_client != NULL) + netplay_client->Stop(); } diff --git a/Source/Core/DolphinWX/Src/NetWindow.h b/Source/Core/DolphinWX/Src/NetWindow.h index 75f9964e9d..0e55862259 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.h +++ b/Source/Core/DolphinWX/Src/NetWindow.h @@ -81,6 +81,8 @@ public: static NetPlayDiag *&GetInstance() { return npd; }; + bool IsRecording(); + private: DECLARE_EVENT_TABLE() @@ -97,6 +99,7 @@ private: wxTextCtrl* m_chat_text; wxTextCtrl* m_chat_msg_text; wxCheckBox* m_memcard_write; + wxCheckBox* m_record_chkbox; std::string m_selected_game; wxButton* m_game_btn; @@ -124,13 +127,15 @@ private: class PadMapDiag : public wxDialog { public: - PadMapDiag(wxWindow* const parent, int map[]); + PadMapDiag(wxWindow* const parent, PadMapping map[], PadMapping wiimotemap[], std::vector& player_list); private: void OnAdjust(wxCommandEvent& event); - wxChoice* m_map_cbox[4]; - int* const m_mapping; + wxChoice* m_map_cbox[8]; + PadMapping* const m_mapping; + PadMapping* const m_wiimapping; + std::vector& m_player_list; }; namespace NetPlay diff --git a/Source/Core/DolphinWX/Src/PHackSettings.cpp b/Source/Core/DolphinWX/Src/PHackSettings.cpp index 9fb93d3d73..3db44891e6 100644 --- a/Source/Core/DolphinWX/Src/PHackSettings.cpp +++ b/Source/Core/DolphinWX/Src/PHackSettings.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include "CommonPaths.h" #include "PHackSettings.h" #include "ConfigManager.h" #include "WxUtils.h" @@ -18,10 +19,9 @@ CPHackSettings::CPHackSettings(wxWindow* parent, wxWindowID id, const wxString& { CreateGUIControls(); std::string _iniFilename; - _iniFilename = File::GetUserPath(D_GAMECONFIG_IDX) + "PH_PRESETS.ini"; + _iniFilename = File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP "PH_PRESETS.ini"; PHPresetsIni.Load(_iniFilename.c_str()); - //PHPresetsIni.SortSections(); - //PHPresetsIni.Save(_iniFilename.c_str()); + PHPresetsIni.SortSections(); LoadPHackData(); } diff --git a/Source/Core/DolphinWX/Src/PatchAddEdit.cpp b/Source/Core/DolphinWX/Src/PatchAddEdit.cpp index e730b21afe..9850d2bc32 100644 --- a/Source/Core/DolphinWX/Src/PatchAddEdit.cpp +++ b/Source/Core/DolphinWX/Src/PatchAddEdit.cpp @@ -74,7 +74,7 @@ void CPatchAddEdit::CreateGUIControls(int _selection) wxGridBagSizer* sgEntry = new wxGridBagSizer(0, 0); sgEntry->Add(EditPatchType, wxGBPosition(0, 0), wxGBSpan(1, 2), wxEXPAND|wxALL, 5); sgEntry->Add(EditPatchOffsetText, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5); - sgEntry->Add(EditPatchOffset, wxGBPosition(1, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sgEntry->Add(EditPatchOffset, wxGBPosition(1, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); sgEntry->Add(EditPatchValueText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5); sgEntry->Add(EditPatchValue, wxGBPosition(2, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); sgEntry->Add(EntrySelection, wxGBPosition(0, 2), wxGBSpan(3, 1), wxEXPAND|wxALL, 5); @@ -95,7 +95,7 @@ void CPatchAddEdit::ChangeEntry(wxSpinEvent& event) { if (!UpdateTempEntryData(itCurEntry)) return; - + itCurEntry = tempEntries.end() - event.GetPosition() - 1; currentItem = (int)tempEntries.size() - event.GetPosition(); UpdateEntryCtrls(*itCurEntry); @@ -147,9 +147,9 @@ void CPatchAddEdit::AddRemoveEntry(wxCommandEvent& event) } break; case ID_ENTRY_REMOVE: - { + { itCurEntry = tempEntries.erase(itCurEntry); - + if (itCurEntry != tempEntries.begin()) { --itCurEntry; @@ -159,8 +159,8 @@ void CPatchAddEdit::AddRemoveEntry(wxCommandEvent& event) { EntrySelection->SetValue(EntrySelection->GetValue() - 1); } - - EntrySelection->SetRange(EntrySelection->GetMin(), EntrySelection->GetMax() - 1); + + EntrySelection->SetRange(EntrySelection->GetMin(), EntrySelection->GetMax() - 1); UpdateEntryCtrls(*itCurEntry); if ((int)tempEntries.size() <= 1) @@ -193,7 +193,7 @@ bool CPatchAddEdit::UpdateTempEntryData(std::vector::it else parsed_ok = false; - PatchEngine::PatchType tempType = + PatchEngine::PatchType tempType = (*iterEntry).type = (PatchEngine::PatchType)EditPatchType->GetSelection(); if (EditPatchValue->GetValue().ToULong(&value, 16)) diff --git a/Source/Core/DolphinWX/Src/TASInputDlg.cpp b/Source/Core/DolphinWX/Src/TASInputDlg.cpp index 8845eda961..8952725463 100644 --- a/Source/Core/DolphinWX/Src/TASInputDlg.cpp +++ b/Source/Core/DolphinWX/Src/TASInputDlg.cpp @@ -32,7 +32,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, A_turbo = B_turbo = X_turbo = Y_turbo = Z_turbo = L_turbo = R_turbo = START_turbo = DL_turbo = DR_turbo = DD_turbo = DU_turbo = false; xaxis = yaxis = c_xaxis = c_yaxis = 128; A_cont = B_cont = X_cont = Y_cont = Z_cont = L_cont = L_button_cont = R_cont = R_button_cont = START_cont = DL_cont = DR_cont = DD_cont = DU_cont = mstickx = msticky = cstickx = csticky = false; - + wxBoxSizer* const top_box = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* const bottom_box = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* const main_box = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Main Stick")); @@ -66,7 +66,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, wxBoxSizer* const c_xslider_box = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* const c_yslider_box = new wxBoxSizer(wxVERTICAL); wxBoxSizer* const c_stick_box = new wxBoxSizer(wxVERTICAL); - + static_bitmap_c = new wxStaticBitmap(this, ID_C_STICK, TASInputDlg::CreateStickBitmap(128,128), wxDefaultPosition, wxDefaultSize); static_bitmap_c->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::OnMouseDownL, this); static_bitmap_c->Bind(wxEVT_MOTION, &TASInputDlg::OnMouseDownL, this); @@ -90,7 +90,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, c_box->Add(c_yslider_box); wxStaticBoxSizer* const shoulder_box = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Shoulder Buttons")); - + wx_l_s = new wxSlider(this, ID_L_SLIDER, 0, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL | wxSL_INVERSE); wx_l_s->SetMinSize(wxSize(-1,100)); wx_l_t = new wxTextCtrl(this, ID_L_TEXT, wxT("0"), wxDefaultPosition, wxSize(40, 20)); @@ -99,7 +99,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, wx_r_s->SetMinSize(wxSize(-1,100)); wx_r_t = new wxTextCtrl(this, ID_R_TEXT, wxT("0"), wxDefaultPosition, wxSize(40, 20)); wx_r_t->SetMaxLength(3); - + shoulder_box->Add(wx_l_s, 0, wxALIGN_CENTER_VERTICAL); shoulder_box->Add(wx_l_t, 0, wxALIGN_CENTER_VERTICAL); shoulder_box->Add(wx_r_s, 0, wxALIGN_CENTER_VERTICAL); @@ -107,7 +107,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, wxStaticBoxSizer* const buttons_box = new wxStaticBoxSizer(wxVERTICAL, this, _("Buttons")); wxGridSizer* const buttons_grid = new wxGridSizer(4); - + wx_a_button = new wxCheckBox(this,ID_A,_T("A"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr); wx_a_button->Bind(wxEVT_RIGHT_DOWN, &TASInputDlg::SetTurbo, this); wx_a_button->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::SetTurboFalse, this); @@ -132,7 +132,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, wx_start_button = new wxCheckBox(this,ID_START,_T("Start"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr); wx_start_button->Bind(wxEVT_RIGHT_DOWN, &TASInputDlg::SetTurbo, this); wx_start_button->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::SetTurboFalse, this); - + buttons_grid->Add(wx_a_button,false); buttons_grid->Add(wx_b_button,false); buttons_grid->Add(wx_x_button,false); @@ -144,7 +144,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, buttons_grid->AddSpacer(5); wxGridSizer* const buttons_dpad = new wxGridSizer(3); - + wx_up_button = new wxCheckBox(this,ID_UP,_T("Up"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr); wx_up_button->Bind(wxEVT_RIGHT_DOWN, &TASInputDlg::SetTurbo, this); wx_up_button->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::SetTurboFalse, this); @@ -157,7 +157,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title, wx_left_button = new wxCheckBox(this,ID_LEFT,_T("Left"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr); wx_left_button->Bind(wxEVT_RIGHT_DOWN, &TASInputDlg::SetTurbo, this); wx_left_button->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::SetTurboFalse, this); - + buttons_dpad->AddSpacer(20); buttons_dpad->Add(wx_up_button,false); buttons_dpad->AddSpacer(20); @@ -192,21 +192,21 @@ void TASInputDlg::ResetValues() { mainX = mainY = cX = cY = 128; lTrig = rTrig = 0; - + wx_mainX_s->SetValue(128); wx_mainY_s->SetValue(128); wx_cX_s->SetValue(128); wx_cY_s->SetValue(128); wx_l_s->SetValue(0); wx_r_s->SetValue(0); - + wx_mainX_t->SetValue(wxT("128")); wx_mainY_t->SetValue(wxT("128")); wx_cX_t->SetValue(wxT("128")); wx_cY_t->SetValue(wxT("128")); wx_l_t->SetValue(wxT("0")); wx_r_t->SetValue(wxT("0")); - + wx_up_button->SetValue(false); wx_down_button->SetValue(false); wx_left_button->SetValue(false); @@ -229,7 +229,7 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus) mstickx = true; wx_mainX_t->SetValue(wxString::Format(wxT("%i"), mainX)); } - + else if(mstickx) { mstickx = false; @@ -308,7 +308,7 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus) wx_left_button->SetValue(false); DL_cont = false; } - + if(((PadStatus->button & PAD_BUTTON_RIGHT) != 0)) { wx_right_button->SetValue(true); @@ -388,7 +388,7 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus) wx_l_t->SetValue(wxT("0")); L_cont = false; } - + if(((PadStatus->triggerRight) != 0)) { if (PadStatus->triggerRight == 255) @@ -424,7 +424,7 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus) wx_z_button->SetValue(false); Z_cont = false; } - + if(((PadStatus->button & PAD_BUTTON_START) != 0)) { wx_start_button->SetValue(true); @@ -454,7 +454,7 @@ void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID) { if (!IsShown()) return; - + //TODO:: Make this instant not when polled. GetKeyBoardInput(PadStatus); SetLandRTriggers(); @@ -485,7 +485,7 @@ void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID) PadStatus->button |= PAD_BUTTON_RIGHT; else PadStatus->button &= ~PAD_BUTTON_RIGHT; - + if(wx_a_button->IsChecked()) { PadStatus->button |= PAD_BUTTON_A; @@ -527,7 +527,17 @@ void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID) PadStatus->button |= PAD_BUTTON_START; else PadStatus->button &= ~PAD_BUTTON_START; - + + if(wx_r_button->IsChecked() || rTrig >= 255) + PadStatus->button |= PAD_TRIGGER_R; + else + PadStatus->button &= ~PAD_TRIGGER_R; + + if(wx_l_button->IsChecked() || lTrig >= 255) + PadStatus->button |= PAD_TRIGGER_L; + else + PadStatus->button &= ~PAD_TRIGGER_L; + ButtonTurbo(); } @@ -584,12 +594,12 @@ void TASInputDlg::UpdateFromSliders(wxCommandEvent& event) int value = ((wxSlider *) event.GetEventObject())->GetValue(); *v = (u8) value; text->SetValue(wxString::Format(wxT("%i"), value)); - + if(update == 1) { static_bitmap_main->SetBitmap(TASInputDlg::CreateStickBitmap(xaxis, yaxis)); } - + if(update == 2) { static_bitmap_c->SetBitmap(TASInputDlg::CreateStickBitmap(c_xaxis, c_yaxis)); @@ -602,7 +612,7 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event) u8 *v; update = 0; update_axis = 0; - + switch(event.GetId()) { case ID_MAIN_X_TEXT: @@ -629,7 +639,7 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event) case ID_C_Y_TEXT: slider = wx_cY_s; v = &cY; - update = 2; + update = 2; update_axis = 2; break; @@ -652,7 +662,7 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event) { *v = (u8) (value > 255 ? 255 : value); slider->SetValue(*v); - + if(update == 1) { if(update_axis == 1) @@ -660,13 +670,13 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event) xaxis = *v; static_bitmap_main->SetBitmap(TASInputDlg::CreateStickBitmap(xaxis,yaxis)); } - + if(update_axis == 2) { yaxis =256 - *v; static_bitmap_main->SetBitmap(TASInputDlg::CreateStickBitmap(xaxis,yaxis)); } - + } if(update == 2) @@ -676,13 +686,13 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event) c_xaxis = *v; static_bitmap_c->SetBitmap(TASInputDlg::CreateStickBitmap(c_xaxis,c_yaxis)); } - + if(update_axis == 2) { c_yaxis =256- *v; static_bitmap_c->SetBitmap(TASInputDlg::CreateStickBitmap(c_xaxis,c_yaxis)); } - + } } } @@ -697,8 +707,8 @@ void TASInputDlg::OnCloseWindow(wxCloseEvent& event) } } -bool TASInputDlg::HasFocus() -{ +bool TASInputDlg::TASHasFocus() +{ //allows numbers to be used as hotkeys if(TextBoxHasFocus()) return false; @@ -772,10 +782,10 @@ void TASInputDlg::OnMouseUpR(wxMouseEvent& event) *y = 128; sbitmap->SetBitmap(TASInputDlg::CreateStickBitmap(*x,*y)); - + textX->SetValue(wxString::Format(wxT("%i"), *x)); textY->SetValue(wxString::Format(wxT("%i"), 256 - *y)); - + sliderX->SetValue(*x); sliderY->SetValue(256 - *y); event.Skip(true); @@ -818,21 +828,21 @@ void TASInputDlg::OnMouseDownL(wxMouseEvent& event) return; } - wxPoint ptM(event.GetPosition()); + wxPoint ptM(event.GetPosition()); *x = ptM.x *2; *y = ptM.y * 2; if(*x > 255) *x = 255; - + if(*y > 255) *y = 255; sbitmap->SetBitmap(TASInputDlg::CreateStickBitmap(*x,*y)); - + textX->SetValue(wxString::Format(wxT("%i"), *x)); textY->SetValue(wxString::Format(wxT("%i"), 256 - *y)); - + sliderX->SetValue(*x); sliderY->SetValue(256 - *y); event.Skip(true); @@ -905,7 +915,7 @@ void TASInputDlg::SetTurbo(wxMouseEvent& event) { case ID_A: placeholder = wx_a_button; - + if(A_turbo) A_turbo = false; else diff --git a/Source/Core/DolphinWX/Src/TASInputDlg.h b/Source/Core/DolphinWX/Src/TASInputDlg.h index 46f2d50405..70f2db92a1 100644 --- a/Source/Core/DolphinWX/Src/TASInputDlg.h +++ b/Source/Core/DolphinWX/Src/TASInputDlg.h @@ -34,7 +34,7 @@ class TASInputDlg : public wxDialog void GetKeyBoardInput(SPADStatus *PadStatus); bool TextBoxHasFocus(); void SetLandRTriggers(); - bool HasFocus(); + bool TASHasFocus(); wxBitmap CreateStickBitmap(int x, int y); diff --git a/Source/Core/DolphinWX/Src/UDPConfigDiag.cpp b/Source/Core/DolphinWX/Src/UDPConfigDiag.cpp index 9619f38dee..3504ae5c85 100644 --- a/Source/Core/DolphinWX/Src/UDPConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/UDPConfigDiag.cpp @@ -45,7 +45,7 @@ UDPConfigDiag::UDPConfigDiag(wxWindow * const parent, UDPWrapper * _wrp) : point->SetValue(wrp->updIR); nun->SetValue(wrp->updNun); nunaccel->SetValue(wrp->updNunAccel); - + sizer1->Add(enable, 1, wxALL | wxEXPAND, 5); sizer1->Add(port_sizer, 1, wxBOTTOM | wxLEFT| wxRIGHT | wxEXPAND, 5); diff --git a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp index a606bf413e..dc91670f4b 100644 --- a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp @@ -67,9 +67,9 @@ void VideoConfigDiag::Event_Close(wxCloseEvent& ev) } #if defined(_WIN32) -wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nDirect3D 9 usually is the fastest one. OpenGL is more accurate though. Direct3D 11 is somewhere between the two.\nNote that the Direct3D backends are only available on Windows.\n\nIf unsure, use Direct3D 11."); +wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nThe software renderer is only used for debugging, so you'll want to use either Direct3D or OpenGL. Different games will behave differently on each backend, so for best emulation experience it's recommended to try both and chose the one that fits your requirements best.\nNote that the Direct3D backend is not available on old Windows versions.\n\nIf unsure, use Direct3D."); #else -wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nDirect3D 9 usually is the fastest one. OpenGL is more accurate though. Direct3D 11 is somewhere between the two.\nNote that the Direct3D backends are only available on Windows.\n\nIf unsure, use OpenGL."); +wxString backend_desc = wxTRANSLATE("Selects what graphics API to use internally.\nThe software renderer is only used for debugging, so unless you have a reason to use it you'll want to select OpenGL here.\n\nIf unsure, use OpenGL."); #endif wxString adapter_desc = wxTRANSLATE("Select a hardware adapter to use.\n\nIf unsure, use the first one."); wxString display_res_desc = wxTRANSLATE("Selects the display resolution used in fullscreen mode.\nThis should always be bigger than or equal to the internal resolution. Performance impact is negligible.\n\nIf unsure, use your desktop resolution.\nIf still unsure, use the highest resolution which works for you."); @@ -86,7 +86,7 @@ wxString af_desc = wxTRANSLATE("Enable anisotropic filtering.\nEnhances visual q wxString aa_desc = wxTRANSLATE("Reduces the amount of aliasing caused by rasterizing 3D graphics.\nThis makes the rendered picture look less blocky.\nHeavily decreases emulation speed and sometimes causes issues.\n\nIf unsure, select None."); wxString scaled_efb_copy_desc = wxTRANSLATE("Greatly increases quality of textures generated using render to texture effects.\nRaising the internal resolution will improve the effect of this setting.\nSlightly decreases performance and possibly causes issues (although unlikely).\n\nIf unsure, leave this checked."); wxString pixel_lighting_desc = wxTRANSLATE("Calculate lighting of 3D graphics per-pixel rather than per vertex.\nDecreases emulation speed by some percent (depending on your GPU).\nThis usually is a safe enhancement, but might cause issues sometimes.\n\nIf unsure, leave this unchecked."); -wxString hacked_buffer_upload_desc = wxTRANSLATE("Speed up vertex streaming by using unsafe OpenGL code. Enabling this option might cause heavy glitches or even crash the emulator.\n\nIf unsure, leave this unchecked."); +wxString hacked_buffer_upload_desc = wxTRANSLATE("Uses unsafe operations to speed up vertex streaming in OpenGL. There are no known problems on supported GPUs, but it will cause severe stability and graphical issues otherwise.\n\nIf unsure, leave this unchecked."); wxString fast_depth_calc_desc = wxTRANSLATE("Use a less accurate algorithm to calculate depth values.\nCauses issues in a few games but might give a decent speedup.\n\nIf unsure, leave this checked."); wxString force_filtering_desc = wxTRANSLATE("Force texture filtering even if the emulated game explicitly disabled it.\nImproves texture quality slightly but causes glitches in some games.\n\nIf unsure, leave this unchecked."); wxString _3d_vision_desc = wxTRANSLATE("Enable 3D effects via stereoscopy using Nvidia 3D Vision technology if it's supported by your GPU.\nPossibly causes issues.\nRequires fullscreen to work.\n\nIf unsure, leave this unchecked."); @@ -101,7 +101,7 @@ wxString wireframe_desc = wxTRANSLATE("Render the scene as a wireframe.\n\nIf un wxString disable_fog_desc = wxTRANSLATE("Makes distant objects more visible by removing fog, thus increasing the overall detail.\nDisabling fog will break some games which rely on proper fog emulation.\n\nIf unsure, leave this unchecked."); wxString disable_dstalpha_desc = wxTRANSLATE("Disables emulation of a hardware feature called destination alpha, which is used in many games for various graphical effects.\n\nIf unsure, leave this unchecked."); wxString show_fps_desc = wxTRANSLATE("Show the number of frames rendered per second as a measure of emulation speed.\n\nIf unsure, leave this unchecked."); -wxString log_fps_to_file_desc = wxTRANSLATE("Log the number of frames rendered per second to User/Logs/fps.txt. Use this feature when you want to measure the performance of Dolphin.\n\nIf unsure, leave this unchecked."); +wxString log_fps_to_file_desc = wxTRANSLATE("Log the number of frames rendered per second to User/Logs/fps.txt. Use this feature when you want to measure the performance of Dolphin.\n\nIf unsure, leave this unchecked."); wxString show_input_display_desc = wxTRANSLATE("Display the inputs read by the emulator.\n\nIf unsure, leave this unchecked."); wxString show_stats_desc = wxTRANSLATE("Show various statistics.\n\nIf unsure, leave this unchecked."); wxString texfmt_desc = wxTRANSLATE("Modify textures to show the format they're encoded in. Needs an emulation reset in most cases.\n\nIf unsure, leave this unchecked."); @@ -154,32 +154,32 @@ wxArrayString GetListOfResolutions() #elif defined(HAVE_XRANDR) && HAVE_XRANDR main_frame->m_XRRConfig->AddResolutions(retlist); #elif defined(__APPLE__) - CFArrayRef modes = CGDisplayAvailableModes(CGMainDisplayID()); + CFArrayRef modes = CGDisplayCopyAllDisplayModes(CGMainDisplayID(), NULL); for (CFIndex i = 0; i < CFArrayGetCount(modes); i++) { std::stringstream res; - CFDictionaryRef mode; - CFNumberRef ref; - int w, h, d; + CGDisplayModeRef mode; + CFStringRef encoding; + size_t w, h; + bool is32; - mode = (CFDictionaryRef)CFArrayGetValueAtIndex(modes, i); - ref = (CFNumberRef)CFDictionaryGetValue(mode, kCGDisplayWidth); - CFNumberGetValue(ref, kCFNumberIntType, &w); - ref = (CFNumberRef)CFDictionaryGetValue(mode, kCGDisplayHeight); - CFNumberGetValue(ref, kCFNumberIntType, &h); - ref = (CFNumberRef)CFDictionaryGetValue(mode, - kCGDisplayBitsPerPixel); - CFNumberGetValue(ref, kCFNumberIntType, &d); + mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + w = CGDisplayModeGetWidth(mode); + h = CGDisplayModeGetHeight(mode); + encoding = CGDisplayModeCopyPixelEncoding(mode); + is32 = CFEqual(encoding, CFSTR(IO32BitDirectPixels)); + CFRelease(encoding); - if (CFDictionaryContainsKey(mode, kCGDisplayModeIsStretched)) + if (!is32) continue; - if (d != 32) + if (CGDisplayModeGetIOFlags(mode) & kDisplayModeStretchedFlag) continue; res << w << "x" << h; retlist.Add(res.str()); } + CFRelease(modes); #endif return retlist; } @@ -344,7 +344,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con // Internal resolution { const wxString efbscale_choices[] = { _("Auto (Window Size)"), _("Auto (Multiple of 640x528)"), - _("1x Native (640x528)"), _("1.5x Native (960x792)"), _("2x Native (1280x1056)"), + _("1x Native (640x528)"), _("1.5x Native (960x792)"), _("2x Native (1280x1056)"), _("2.5x Native (1600x1320)"), _("3x Native (1920x1584)"), _("4x Native (2560x2112)") }; wxChoice *const choice_efbscale = CreateChoice(page_enh, @@ -503,7 +503,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con szr_other->Add(CreateCheckBox(page_hacks, _("OpenMP Texture Decoder"), wxGetTranslation(omp_desc), vconfig.bOMPDecoder)); szr_other->Add(CreateCheckBox(page_hacks, _("Fast Depth Calculation"), wxGetTranslation(fast_depth_calc_desc), vconfig.bFastDepthCalc)); szr_other->Add(hacked_buffer_upload = CreateCheckBox(page_hacks, _("Vertex Streaming Hack"), wxGetTranslation(hacked_buffer_upload_desc), vconfig.bHackedBufferUpload)); - + wxStaticBoxSizer* const group_other = new wxStaticBoxSizer(wxVERTICAL, page_hacks, _("Other")); group_other->Add(szr_other, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); szr_hacks->Add(group_other, 0, wxEXPAND | wxALL, 5); diff --git a/Source/Core/DolphinWX/Src/VideoConfigDiag.h b/Source/Core/DolphinWX/Src/VideoConfigDiag.h index 563f5076d6..a1b3b59e12 100644 --- a/Source/Core/DolphinWX/Src/VideoConfigDiag.h +++ b/Source/Core/DolphinWX/Src/VideoConfigDiag.h @@ -166,7 +166,7 @@ protected: // XFB virtual_xfb->Enable(vconfig.bUseXFB); real_xfb->Enable(vconfig.bUseXFB); - + // OGL Hacked buffer hacked_buffer_upload->Enable(Core::GetState() == Core::CORE_UNINITIALIZED && vconfig.backend_info.APIType == API_OPENGL); hacked_buffer_upload->Show(vconfig.backend_info.APIType == API_OPENGL); diff --git a/Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp b/Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp index 06b839b960..5e145ec391 100644 --- a/Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/WiimoteConfigDiag.cpp @@ -3,6 +3,7 @@ #include "HW/Wiimote.h" #include "HW/WiimoteReal/WiimoteReal.h" #include "Frame.h" +#include "NetPlayProto.h" WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin) : wxDialog(parent, -1, _("Dolphin Wiimote Configuration"), wxDefaultPosition, wxDefaultSize) @@ -54,8 +55,8 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin wiimote_sizer->Add(wiimote_configure_bt[i]); } wiimote_group->Add(wiimote_sizer, 1, wxEXPAND, 5 ); - - + + // "BalanceBoard" layout wxStaticBoxSizer* const bb_group = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Balance Board")); wxFlexGridSizer* const bb_sizer = new wxFlexGridSizer(1, 5, 5); @@ -64,27 +65,27 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin const wxString src_choices[] = { _("None"), _("Real Balance Board") }; wxChoice* bb_source = new wxChoice(this, source_ctrl_id, wxDefaultPosition, wxDefaultSize, sizeof(src_choices)/sizeof(*src_choices), src_choices); bb_source->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &WiimoteConfigDiag::SelectSource, this); - + m_orig_wiimote_sources[WIIMOTE_BALANCE_BOARD] = g_wiimote_sources[WIIMOTE_BALANCE_BOARD]; bb_source->Select(m_orig_wiimote_sources[WIIMOTE_BALANCE_BOARD] ? 1 : 0); - + bb_sizer->Add(bb_source, 0, wxALIGN_CENTER_VERTICAL); - + bb_group->Add(bb_sizer, 1, wxEXPAND, 5 ); - + // "Real wiimotes" controls wxButton* const refresh_btn = new wxButton(this, -1, _("Refresh"), wxDefaultPosition); refresh_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &WiimoteConfigDiag::RefreshRealWiimotes, this); wxStaticBoxSizer* const real_wiimotes_group = new wxStaticBoxSizer(wxVERTICAL, this, _("Real Wiimotes")); - + wxBoxSizer* const real_wiimotes_sizer = new wxBoxSizer(wxHORIZONTAL); - + if (!WiimoteReal::g_wiimote_scanner.IsReady()) real_wiimotes_group->Add(new wxStaticText(this, -1, _("A supported bluetooth device could not be found.\n" "You must manually connect your wiimotes.")), 0, wxALIGN_CENTER | wxALL, 5); - + wxCheckBox* const continuous_scanning = new wxCheckBox(this, wxID_ANY, _("Continuous Scanning")); continuous_scanning->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, &WiimoteConfigDiag::OnContinuousScanning, this); continuous_scanning->SetValue(SConfig::GetInstance().m_WiimoteContinuousScanning); @@ -92,7 +93,7 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin auto wiimote_speaker = new wxCheckBox(this, wxID_ANY, _("Enable Speaker Data")); wiimote_speaker->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, &WiimoteConfigDiag::OnEnableSpeaker, this); wiimote_speaker->SetValue(SConfig::GetInstance().m_WiimoteEnableSpeaker); - + real_wiimotes_sizer->Add(continuous_scanning, 0, wxALIGN_CENTER_VERTICAL); real_wiimotes_sizer->AddStretchSpacer(1); real_wiimotes_sizer->Add(refresh_btn, 0, wxALL | wxALIGN_CENTER, 5); @@ -134,6 +135,16 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin WiimoteSpkVolumeText->Disable(); WiimoteSpkVolumeMinText->Disable(); WiimoteSpkVolumeMaxText->Disable(); + if (NetPlay::IsNetPlayRunning()) + { + bb_source->Disable(); + for (int i = 0; i < 4; ++i) + { + wiimote_label[i]->Disable(); + wiimote_source_ch[i]->Disable(); + } + } + } @@ -209,7 +220,7 @@ void WiimoteConfigDiag::SelectSource(wxCommandEvent& event) // This needs to be changed now in order for refresh to work right. // Revert if the dialog is canceled. int index = m_wiimote_index_from_ctrl_id[event.GetId()]; - + if(index != WIIMOTE_BALANCE_BOARD) { WiimoteReal::ChangeWiimoteSource(index, event.GetInt()); @@ -220,7 +231,7 @@ void WiimoteConfigDiag::SelectSource(wxCommandEvent& event) } else { - WiimoteReal::ChangeWiimoteSource(index, event.GetInt() ? WIIMOTE_SRC_REAL : WIIMOTE_SRC_NONE); + WiimoteReal::ChangeWiimoteSource(index, event.GetInt() ? WIIMOTE_SRC_REAL : WIIMOTE_SRC_NONE); } } @@ -245,7 +256,7 @@ void WiimoteConfigDiag::Save(wxCommandEvent& event) sec.Set("Source", (int)g_wiimote_sources[i]); } - + std::string secname("BalanceBoard"); IniFile::Section& sec = *inifile.GetOrCreateSection(secname.c_str()); sec.Set("Source", (int)g_wiimote_sources[WIIMOTE_BALANCE_BOARD]); diff --git a/Source/Core/DolphinWX/Src/WiimoteConfigDiag.h b/Source/Core/DolphinWX/Src/WiimoteConfigDiag.h index c6368fc33b..977760f579 100644 --- a/Source/Core/DolphinWX/Src/WiimoteConfigDiag.h +++ b/Source/Core/DolphinWX/Src/WiimoteConfigDiag.h @@ -68,7 +68,6 @@ private: void Cancel(wxCommandEvent& event); InputPlugin& m_plugin; - wxNotebook* m_pad_notebook; std::map m_wiimote_index_from_ctrl_id; unsigned int m_orig_wiimote_sources[MAX_BBMOTES]; diff --git a/Source/Core/DolphinWX/Src/WxUtils.cpp b/Source/Core/DolphinWX/Src/WxUtils.cpp index 173c07fbcc..617e32901e 100644 --- a/Source/Core/DolphinWX/Src/WxUtils.cpp +++ b/Source/Core/DolphinWX/Src/WxUtils.cpp @@ -9,6 +9,10 @@ #include "WxUtils.h" +#ifdef __APPLE__ +#import +#endif + namespace WxUtils { // Launch a file according to its mime type @@ -24,11 +28,13 @@ void Launch(const char *filename) void Explore(const char *path) { wxString wxPath = StrToWxStr(path); +#ifndef _WIN32 // Default to file if (! wxPath.Contains(wxT("://"))) { wxPath = wxT("file://") + wxPath; } +#endif #ifdef __WXGTK__ wxPath.Replace(wxT(" "), wxT("\\ ")); @@ -40,6 +46,18 @@ void Explore(const char *path) } } +double GetCurrentBitmapLogicalScale() +{ +#ifdef __APPLE__ + // wx doesn't expose this itself, unfortunately. + if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) + { + return [[NSScreen mainScreen] backingScaleFactor]; + } +#endif + return 1.0; +} + } // namespace std::string WxStrToStr(const wxString& str) diff --git a/Source/Core/DolphinWX/Src/WxUtils.h b/Source/Core/DolphinWX/Src/WxUtils.h index 9dee725da3..b14bc614ca 100644 --- a/Source/Core/DolphinWX/Src/WxUtils.h +++ b/Source/Core/DolphinWX/Src/WxUtils.h @@ -17,6 +17,8 @@ void Launch(const char *filename); // Launch an file explorer window on a certain path void Explore(const char *path); +double GetCurrentBitmapLogicalScale(); + } // namespace std::string WxStrToStr(const wxString& str); diff --git a/Source/Core/DolphinWX/Src/X11Utils.cpp b/Source/Core/DolphinWX/Src/X11Utils.cpp index 9c509add91..71f0e43a2d 100644 --- a/Source/Core/DolphinWX/Src/X11Utils.cpp +++ b/Source/Core/DolphinWX/Src/X11Utils.cpp @@ -166,7 +166,7 @@ void XRRConfiguration::Update() { if(SConfig::GetInstance().m_LocalCoreStartupParameter.strFullscreenResolution == "Auto") return; - + if (!bValid) return; diff --git a/Source/Core/DolphinWX/resource.h b/Source/Core/DolphinWX/resource.h index 2032a4efd9..bd0d18386d 100644 --- a/Source/Core/DolphinWX/resource.h +++ b/Source/Core/DolphinWX/resource.h @@ -5,7 +5,7 @@ #define IDI_ICON1 101 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 diff --git a/Source/Core/DolphinWX/resources/Dolphin.c b/Source/Core/DolphinWX/resources/Dolphin.c index e3392da769..59268d8abc 100644 --- a/Source/Core/DolphinWX/resources/Dolphin.c +++ b/Source/Core/DolphinWX/resources/Dolphin.c @@ -1,206 +1,103 @@ -static const unsigned char dolphin_ico32x32[] = { -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, -0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, -0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, -0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, -0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, -0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, -0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdd, 0x07, 0x07, -0x00, 0x25, 0x16, 0x51, 0xa4, 0x24, 0x4e, 0x00, 0x00, 0x09, 0x13, 0x49, -0x44, 0x41, 0x54, 0x58, 0xc3, 0x9d, 0x97, 0x6b, 0x8c, 0x5d, 0x55, 0x15, -0xc7, 0x7f, 0x6b, 0xed, 0xbd, 0xcf, 0xeb, 0xde, 0x99, 0xb9, 0x33, 0x53, -0x3a, 0xa5, 0x64, 0xa4, 0x50, 0xb0, 0xa0, 0x96, 0x50, 0x20, 0x84, 0x47, -0x95, 0x80, 0x0f, 0x10, 0x50, 0x41, 0x4d, 0x10, 0xe2, 0x07, 0xc3, 0x23, -0xe1, 0x21, 0x46, 0x3e, 0x28, 0x26, 0x2a, 0xc6, 0x08, 0x41, 0x89, 0x46, -0x14, 0xb5, 0x8d, 0x0f, 0x7c, 0x00, 0x31, 0x6a, 0x94, 0x2a, 0x8d, 0x8f, -0x40, 0x35, 0x0d, 0x1a, 0x14, 0x95, 0x56, 0x41, 0x2a, 0xb5, 0x4c, 0x29, -0xd0, 0x69, 0x67, 0x98, 0x4e, 0x67, 0xe6, 0xce, 0xdc, 0xc7, 0x79, 0xec, -0xed, 0x87, 0x3b, 0x54, 0x27, 0x3e, 0x18, 0xfd, 0x27, 0x27, 0x39, 0x7b, -0x9d, 0x73, 0xf6, 0xfe, 0xaf, 0xb5, 0xd7, 0xf9, 0xaf, 0xb5, 0xe5, 0xc1, -0x07, 0x1f, 0x64, 0xf3, 0xa6, 0x4d, 0x67, 0x9f, 0xf7, 0xe6, 0x8b, 0xb7, -0x7a, 0x2f, 0xb1, 0x75, 0x8e, 0x20, 0x02, 0x00, 0x21, 0xf4, 0x2e, 0x16, -0xc7, 0x3d, 0xe3, 0x91, 0x3b, 0x11, 0x45, 0x44, 0x7a, 0x8f, 0x03, 0x84, -0xe0, 0x09, 0xc8, 0x3f, 0x5e, 0xf7, 0x61, 0xc9, 0x37, 0x02, 0x94, 0x65, -0x81, 0x0a, 0xdd, 0xed, 0x8f, 0xfc, 0xf4, 0xd2, 0xeb, 0x6f, 0xb8, 0xe1, -0x31, 0xeb, 0x8c, 0x9e, 0xb7, 0x63, 0xcf, 0x4b, 0x5b, 0xfa, 0xd6, 0x4c, -0x36, 0xae, 0x7c, 0xfb, 0x1b, 0x29, 0x4a, 0x0f, 0x62, 0x08, 0x02, 0xe2, -0x3d, 0x81, 0x80, 0x2c, 0xce, 0x18, 0x16, 0x49, 0xa9, 0x08, 0x51, 0x92, -0x30, 0x33, 0x33, 0x4b, 0x73, 0x6e, 0x16, 0x44, 0x89, 0xe3, 0x98, 0xe1, -0xe1, 0x61, 0x44, 0x84, 0xbc, 0x28, 0x7a, 0x0b, 0x06, 0xbf, 0x94, 0x74, -0x08, 0x38, 0xab, 0x7c, 0x77, 0xcb, 0xc3, 0xb5, 0x1d, 0xbb, 0x27, 0x7f, -0xea, 0x8c, 0x5e, 0x66, 0x77, 0x8d, 0x8d, 0x3f, 0xd4, 0xf6, 0x71, 0xdf, -0xcd, 0xd7, 0x5c, 0x41, 0x12, 0x47, 0xe4, 0x45, 0x05, 0x28, 0xc8, 0xcb, -0xac, 0x5f, 0x76, 0x0f, 0x82, 0x0a, 0x0a, 0xd4, 0xb2, 0x1a, 0xbf, 0x7f, -0xfc, 0xb7, 0xec, 0xdd, 0xb3, 0x0b, 0x0d, 0x25, 0xa2, 0x4a, 0x5e, 0x94, -0x4c, 0xf4, 0x37, 0x38, 0xf7, 0x0d, 0x6f, 0x62, 0x70, 0x70, 0x88, 0x85, -0x85, 0x79, 0x10, 0xe9, 0xf9, 0xed, 0x03, 0x22, 0x10, 0x24, 0x10, 0xa9, -0x70, 0xf3, 0x75, 0x57, 0xf2, 0x8b, 0x5f, 0x3e, 0xda, 0xd8, 0x35, 0x36, -0xfe, 0x90, 0x7d, 0x71, 0x62, 0xda, 0xae, 0x3f, 0xe5, 0x75, 0x4c, 0x1e, -0x9a, 0x65, 0xa1, 0x1b, 0x10, 0x63, 0x09, 0x28, 0x08, 0x04, 0xef, 0x17, -0x43, 0x2d, 0x84, 0xaa, 0xc2, 0xc6, 0x11, 0x69, 0x92, 0xf1, 0xc8, 0x03, -0xdf, 0x60, 0x28, 0xad, 0xb8, 0xf6, 0x9a, 0xab, 0x39, 0xee, 0xb8, 0xe3, -0x01, 0x98, 0x9b, 0x9b, 0x65, 0xdb, 0xb6, 0x6d, 0x6c, 0xfa, 0xd2, 0xe7, -0x39, 0xe7, 0xcd, 0xef, 0x64, 0x74, 0xcd, 0x5a, 0x9a, 0x73, 0x73, 0x18, -0x63, 0xf0, 0xde, 0x03, 0x01, 0x55, 0xc1, 0x17, 0x05, 0xf5, 0x18, 0xd6, -0x9f, 0xf2, 0x3a, 0x5e, 0x9c, 0x38, 0x6c, 0xad, 0x89, 0xea, 0xbe, 0x4b, -0x9d, 0xfd, 0x53, 0x6d, 0x9a, 0x85, 0x41, 0x4d, 0xa0, 0x04, 0xbc, 0x0f, -0x38, 0x67, 0xb0, 0x51, 0x42, 0x00, 0x8a, 0x4e, 0x49, 0x7d, 0x20, 0xe6, -0xb1, 0xad, 0x3f, 0x60, 0xe3, 0x89, 0x0d, 0x3e, 0xf0, 0xc1, 0x5b, 0xf8, -0x67, 0xf4, 0xf7, 0x0f, 0x70, 0xf9, 0xe5, 0xef, 0xe4, 0xa4, 0x75, 0xeb, -0xf8, 0xe8, 0xed, 0x9f, 0x63, 0xdd, 0xc6, 0x77, 0x51, 0xef, 0x1b, 0xa0, -0x28, 0xdb, 0xc8, 0xa2, 0x13, 0x46, 0x95, 0xa2, 0xdd, 0xa2, 0x91, 0x40, -0x1e, 0xfa, 0x30, 0x71, 0xdd, 0x5b, 0x75, 0x35, 0x66, 0xf3, 0x3e, 0x9e, -0x9f, 0xea, 0xb2, 0xe0, 0x1d, 0xe2, 0x40, 0xe2, 0x1a, 0x6a, 0x2d, 0xcd, -0x97, 0xa6, 0x19, 0xff, 0xcd, 0xb7, 0x31, 0xf5, 0x15, 0x9c, 0x7c, 0xc1, -0x95, 0xfc, 0x61, 0xfb, 0xa3, 0xac, 0x4d, 0x3b, 0xdc, 0x78, 0xe3, 0x4d, -0xfc, 0x27, 0x9c, 0xfc, 0x9a, 0xd7, 0xf2, 0xe1, 0xf7, 0x5f, 0xcd, 0x2d, -0x9f, 0xf9, 0x16, 0x1b, 0xde, 0x76, 0x1d, 0x55, 0xbb, 0xe8, 0x25, 0x2a, -0x10, 0xca, 0x9c, 0xa2, 0xd3, 0xa1, 0x19, 0x5b, 0x9a, 0xe5, 0x10, 0xea, -0x6a, 0x58, 0xb5, 0x11, 0xf3, 0xdd, 0x3e, 0xf6, 0x4d, 0x76, 0x69, 0xab, -0x47, 0xfb, 0x33, 0x66, 0xf6, 0x3e, 0x49, 0x7b, 0xf2, 0x05, 0x66, 0xf6, -0xef, 0xe3, 0xbe, 0x3b, 0xae, 0xe5, 0xd1, 0xc7, 0x7e, 0xcf, 0x03, 0xbf, -0xfa, 0x15, 0xd9, 0xe4, 0x1f, 0xb9, 0xf7, 0x9b, 0x9f, 0xc1, 0x46, 0x11, -0xff, 0x0d, 0x67, 0x9d, 0xb3, 0x91, 0x4b, 0xcf, 0xdc, 0xce, 0xd6, 0x9d, -0x4f, 0x70, 0xcc, 0x09, 0xa7, 0xd1, 0x59, 0x98, 0xc7, 0x1a, 0x43, 0xd1, -0x2d, 0xf0, 0x1d, 0x68, 0x6a, 0x49, 0xab, 0x1c, 0xc6, 0x9a, 0x18, 0x55, -0x63, 0x58, 0x28, 0x32, 0xc6, 0xa7, 0x3d, 0xd3, 0x45, 0xca, 0xf3, 0xfb, -0x0f, 0x70, 0x72, 0xb9, 0x97, 0x3b, 0xae, 0x3a, 0x83, 0x13, 0xeb, 0x73, -0xcc, 0x36, 0x17, 0xb8, 0xf9, 0xa6, 0xeb, 0xd9, 0xfb, 0xf0, 0xbd, 0x5c, -0xfc, 0xfa, 0xd3, 0x19, 0x5e, 0xb9, 0x9a, 0xe5, 0xe0, 0xf5, 0x67, 0x9d, -0xc9, 0x54, 0x6b, 0x81, 0xc9, 0xae, 0x61, 0xaa, 0x0d, 0x93, 0xad, 0xc0, -0xe4, 0x7c, 0x60, 0xb2, 0x19, 0x38, 0x70, 0x58, 0x68, 0x15, 0x09, 0x6a, -0x05, 0x6b, 0x2d, 0x74, 0xab, 0x01, 0x0e, 0xcc, 0x2a, 0x71, 0x9a, 0x32, -0x9f, 0xb7, 0xc0, 0x16, 0x5c, 0x78, 0xc9, 0xdb, 0x39, 0x7b, 0xe3, 0x1b, -0xd8, 0xf7, 0xfc, 0x0b, 0xa4, 0x69, 0xc6, 0x05, 0x67, 0xac, 0xc5, 0x77, -0xe7, 0x58, 0x2e, 0xa6, 0x0f, 0xcf, 0xb0, 0xff, 0xc5, 0x71, 0xc2, 0x1a, -0xc5, 0x94, 0x31, 0x65, 0x59, 0x20, 0x55, 0x82, 0x86, 0x88, 0x66, 0xb3, -0x60, 0x21, 0x8f, 0x11, 0x29, 0x51, 0xa8, 0x28, 0x7c, 0xc6, 0x4c, 0x5e, -0xe3, 0x70, 0x2b, 0x10, 0x56, 0x9e, 0xc8, 0xf7, 0xf7, 0x8d, 0xb0, 0xe9, -0x2b, 0x9b, 0xe9, 0x1f, 0x68, 0xb0, 0x7e, 0xfd, 0x7a, 0x00, 0xee, 0xb9, -0xe7, 0x8b, 0x9c, 0x7a, 0xea, 0x29, 0x54, 0x55, 0xb5, 0x2c, 0x02, 0x67, -0x9d, 0x7b, 0x2e, 0x6f, 0x1d, 0x69, 0x33, 0xbe, 0xff, 0x20, 0xd3, 0xde, -0x31, 0x5b, 0x59, 0x9a, 0xc4, 0xcc, 0x14, 0x8e, 0xa9, 0x85, 0x40, 0xa7, -0x10, 0x44, 0x3c, 0x56, 0xa4, 0x24, 0x88, 0x05, 0xdb, 0x80, 0x38, 0xa1, -0x52, 0xc1, 0x37, 0x56, 0x33, 0x37, 0x3f, 0xbe, 0x64, 0xc2, 0xd1, 0xd1, -0x51, 0x46, 0x47, 0x47, 0x09, 0x21, 0x2c, 0x8b, 0xc0, 0xaa, 0xa3, 0x57, -0x73, 0xe9, 0xb9, 0xa7, 0xb1, 0x6d, 0xfb, 0x2c, 0xd9, 0x09, 0xeb, 0xa8, -0x16, 0x3a, 0x94, 0x9d, 0x92, 0xa2, 0xd5, 0xa2, 0x1b, 0x4a, 0xa0, 0x8d, -0xd0, 0xc2, 0x8a, 0x06, 0xcc, 0x40, 0x82, 0xab, 0xf7, 0x11, 0x4c, 0x89, -0x8d, 0x62, 0xea, 0xe1, 0x00, 0x6f, 0x3c, 0x6f, 0xc3, 0xbf, 0x9d, 0xf8, -0xe5, 0x8c, 0x5e, 0x0e, 0x9e, 0xda, 0xb3, 0x87, 0xb0, 0xfa, 0x22, 0x5c, -0x14, 0x63, 0xc5, 0x20, 0x9a, 0x13, 0x72, 0x21, 0xd4, 0x63, 0x5a, 0x51, -0xab, 0xa7, 0x0d, 0x10, 0xb0, 0x7d, 0x31, 0xae, 0xd1, 0x4f, 0x5c, 0xcf, -0x48, 0xb3, 0x94, 0xd6, 0x31, 0x67, 0xf0, 0xd5, 0x6f, 0xfe, 0x04, 0xca, -0x2e, 0xff, 0x0f, 0x16, 0x66, 0xa6, 0xb8, 0x6f, 0xf3, 0x97, 0xf8, 0xd9, -0x81, 0x94, 0x15, 0xeb, 0x4e, 0xc2, 0xa8, 0xa0, 0xce, 0x12, 0x65, 0x09, -0x71, 0x3d, 0x23, 0x3b, 0x6a, 0x05, 0x9a, 0x45, 0x20, 0xa0, 0x04, 0xc0, -0x05, 0xc4, 0x56, 0x44, 0x59, 0x8c, 0x52, 0xd1, 0x77, 0xec, 0xf1, 0x6c, -0x29, 0x5e, 0xcd, 0x87, 0x3e, 0x7a, 0x3b, 0x7f, 0xfd, 0xf3, 0x4e, 0xc6, -0xf7, 0x8d, 0xfd, 0x4f, 0x04, 0xee, 0xfa, 0xc2, 0x26, 0xae, 0xde, 0x5e, -0x50, 0xbd, 0xe9, 0x7a, 0x32, 0xeb, 0x50, 0x23, 0xb8, 0x48, 0x71, 0x91, -0x45, 0xac, 0x80, 0xf1, 0x68, 0xb4, 0x58, 0x57, 0x00, 0x6c, 0x22, 0x20, -0x15, 0xa8, 0x27, 0x4e, 0x1d, 0xfd, 0x56, 0x19, 0xba, 0xe0, 0x3d, 0x7c, -0xcf, 0x9e, 0xcd, 0x5b, 0xef, 0xfa, 0x09, 0x17, 0x5c, 0x7f, 0x27, 0x5f, -0xdb, 0xbc, 0x99, 0x50, 0x2c, 0x23, 0x22, 0xc1, 0x53, 0xe2, 0x18, 0xd0, -0x08, 0x1b, 0x09, 0x51, 0x6c, 0x70, 0x91, 0x22, 0x26, 0x50, 0xf9, 0x2e, -0xde, 0xe7, 0x54, 0x55, 0x0b, 0x49, 0x41, 0x54, 0x7a, 0x11, 0xd0, 0x54, -0x31, 0xa9, 0x01, 0xad, 0x50, 0x27, 0x38, 0xa7, 0x48, 0xb3, 0xc9, 0xe0, -0x49, 0xa7, 0x33, 0xf4, 0x8e, 0x5b, 0xd0, 0x2b, 0x3e, 0xc5, 0x87, 0x1f, -0xef, 0x72, 0xeb, 0xc7, 0x6f, 0xa7, 0xca, 0x5f, 0x81, 0x84, 0x28, 0x77, -0x7c, 0xe2, 0x23, 0x7c, 0xed, 0x92, 0x01, 0xf2, 0x1f, 0x7e, 0x9a, 0x66, -0x39, 0x87, 0x49, 0x94, 0x40, 0x45, 0x10, 0x8f, 0xda, 0x80, 0x89, 0x14, -0x8d, 0x7a, 0xb5, 0x46, 0x83, 0x0f, 0x84, 0xaa, 0x20, 0xca, 0x22, 0x8c, -0x11, 0x34, 0x54, 0xb8, 0x48, 0xa9, 0xd5, 0x12, 0xca, 0x4e, 0x9b, 0xce, -0xe1, 0x29, 0x9c, 0x54, 0x1c, 0x73, 0xd1, 0x7b, 0xb9, 0x77, 0x6a, 0x05, -0xf7, 0xdf, 0xff, 0xc0, 0xb2, 0xb6, 0xe1, 0xf2, 0xab, 0xde, 0xcb, 0x97, -0xaf, 0x3a, 0x8b, 0xf2, 0xe1, 0x7b, 0xe9, 0x22, 0x58, 0x2b, 0x44, 0x4e, -0x30, 0x46, 0x30, 0x26, 0xa0, 0xa6, 0xd7, 0x67, 0x28, 0x1e, 0x94, 0x0a, -0x11, 0xb0, 0x06, 0x82, 0x2f, 0xb1, 0x80, 0x73, 0x42, 0xe2, 0x0c, 0xb1, -0x53, 0xc8, 0xbb, 0x44, 0x45, 0x87, 0xfe, 0x35, 0x67, 0x70, 0xa8, 0xd9, -0x5e, 0x76, 0x2e, 0xbc, 0xe5, 0xdd, 0x57, 0xf0, 0xb6, 0x55, 0x42, 0x67, -0x62, 0x2f, 0x2e, 0xb2, 0x58, 0xa3, 0x58, 0x27, 0xa8, 0x33, 0x18, 0x2b, -0x08, 0x01, 0x4b, 0x80, 0x50, 0x96, 0x18, 0xf1, 0xa4, 0xb5, 0x84, 0x38, -0xb3, 0x20, 0x1e, 0x3c, 0x24, 0xb1, 0xc3, 0x1a, 0xa5, 0xd3, 0xc9, 0x11, -0x6b, 0xc8, 0xe6, 0x5e, 0x64, 0xcd, 0xb1, 0x8d, 0x65, 0x13, 0xf0, 0xed, -0x39, 0x5e, 0x98, 0xed, 0x92, 0xad, 0x1b, 0x24, 0x31, 0x90, 0xf6, 0xd7, -0xf0, 0xdd, 0x0a, 0x52, 0x83, 0xeb, 0x77, 0x10, 0x40, 0x43, 0x08, 0x88, -0x01, 0x13, 0x3b, 0xac, 0x8b, 0x30, 0xf4, 0xca, 0x66, 0x64, 0x0d, 0x4a, -0xc0, 0x57, 0x25, 0x49, 0x12, 0xa1, 0xaa, 0x80, 0x47, 0x97, 0x29, 0x03, -0x87, 0x0e, 0x1e, 0xe0, 0x86, 0x8f, 0xdd, 0xc5, 0xae, 0x35, 0x1b, 0x19, -0x3e, 0x6a, 0x05, 0xbe, 0xaa, 0x50, 0x55, 0x92, 0x34, 0x45, 0x44, 0xa8, -0x3a, 0x3d, 0x45, 0x55, 0x5e, 0xee, 0x7b, 0x54, 0x51, 0x15, 0x50, 0xc1, -0xfb, 0x8a, 0x76, 0xa7, 0x43, 0x59, 0x15, 0x54, 0x55, 0x49, 0x91, 0xe7, -0x28, 0x9e, 0xb0, 0x62, 0x0d, 0x63, 0xd3, 0xb3, 0xcb, 0x22, 0xf0, 0xbb, -0x3f, 0xfc, 0x91, 0x2d, 0xed, 0x55, 0xac, 0x3c, 0xf5, 0x7c, 0x8a, 0xe6, -0x3c, 0xc6, 0x18, 0x08, 0x81, 0x6e, 0xbb, 0x8d, 0x89, 0x1c, 0xea, 0x14, -0x02, 0x58, 0x00, 0x31, 0x82, 0xf7, 0x9e, 0xa2, 0xa8, 0x40, 0x15, 0x6b, -0x14, 0xe7, 0x1c, 0xc1, 0x7b, 0x5c, 0x64, 0xf1, 0x3e, 0x40, 0x70, 0xc8, -0xf0, 0x10, 0x7b, 0x9e, 0x9d, 0xee, 0x35, 0xaa, 0xaf, 0xa0, 0x88, 0xd3, -0x0b, 0x5d, 0x86, 0x87, 0x47, 0x70, 0x95, 0x87, 0x28, 0x22, 0x88, 0xd2, -0xed, 0x74, 0x09, 0x3e, 0xa0, 0xce, 0x61, 0x22, 0x4b, 0x08, 0x8b, 0x42, -0x24, 0x02, 0x46, 0xc0, 0x17, 0x39, 0xa1, 0x2a, 0x50, 0xa3, 0x18, 0x15, -0xf0, 0x15, 0x51, 0x64, 0x11, 0x40, 0xc5, 0x13, 0xab, 0x72, 0xb0, 0x05, -0x55, 0x55, 0xbc, 0x82, 0x16, 0x54, 0xec, 0x78, 0xf2, 0x2f, 0x24, 0x83, -0x23, 0x38, 0x0b, 0xde, 0x57, 0x58, 0x15, 0x42, 0x59, 0x61, 0xad, 0x60, -0x2c, 0x18, 0x35, 0x8b, 0x5b, 0x20, 0x82, 0x51, 0x70, 0xc6, 0x93, 0xa5, -0x31, 0xf5, 0x2c, 0x25, 0x4d, 0x1c, 0x91, 0x15, 0xac, 0x80, 0x21, 0x90, -0xc6, 0x16, 0x67, 0x40, 0x8d, 0x67, 0x65, 0xa6, 0x18, 0xbb, 0xb4, 0x21, -0xd9, 0xb9, 0x73, 0x27, 0xcd, 0x66, 0xf3, 0xc8, 0xf8, 0xf0, 0xe4, 0x04, -0xdb, 0xff, 0xf6, 0x12, 0x43, 0x6b, 0x5f, 0x8b, 0x56, 0x39, 0x59, 0x6c, -0x31, 0xea, 0x89, 0x23, 0x43, 0x12, 0x3b, 0x92, 0xc8, 0x22, 0xc1, 0x13, -0x00, 0x15, 0x15, 0x6c, 0x64, 0x89, 0x4c, 0x20, 0x89, 0x0d, 0xd6, 0x06, -0x52, 0xa3, 0x64, 0x89, 0xc3, 0x45, 0x81, 0x50, 0x76, 0xb1, 0x54, 0x18, -0xe7, 0xf1, 0xed, 0x0e, 0xa3, 0x8d, 0xf8, 0x5f, 0x1c, 0xbe, 0xfb, 0xee, -0xbb, 0xd9, 0xbd, 0x7b, 0xf7, 0x91, 0xf1, 0x5f, 0x9f, 0x79, 0x9a, 0x43, -0xb6, 0x8f, 0x7a, 0xa3, 0x86, 0xc1, 0xe3, 0x14, 0xc4, 0x17, 0xa4, 0x91, -0xd2, 0xd7, 0x97, 0x12, 0xa9, 0x47, 0xa8, 0x7a, 0x7f, 0x81, 0xf7, 0x1e, -0x27, 0x81, 0x7a, 0x2d, 0x26, 0x32, 0x81, 0xcc, 0x09, 0xce, 0x05, 0x9c, -0x09, 0xa4, 0xd6, 0x90, 0x3a, 0x43, 0x12, 0x09, 0x43, 0x8d, 0x3e, 0xf2, -0x27, 0x7f, 0xcd, 0xfa, 0x35, 0xc7, 0x2c, 0x59, 0x7c, 0x7e, 0x7e, 0x9e, -0xc9, 0xc9, 0x49, 0x46, 0x46, 0x46, 0x8e, 0xd8, 0x5e, 0xb3, 0x7e, 0x03, -0x97, 0xbd, 0x4a, 0x78, 0xee, 0xbe, 0xdb, 0x51, 0x69, 0x93, 0x44, 0x90, -0x46, 0x86, 0x34, 0x31, 0x18, 0x4a, 0x5c, 0xe8, 0xa2, 0x65, 0xb1, 0x98, -0x03, 0x22, 0x18, 0x11, 0x32, 0x27, 0x24, 0x56, 0x50, 0x5f, 0xe0, 0xf0, -0x64, 0x4e, 0xa9, 0x25, 0x96, 0x2c, 0x32, 0x1c, 0x35, 0xd4, 0xc7, 0xd4, -0xe3, 0xdb, 0x38, 0x69, 0xe1, 0x2f, 0x9c, 0x7f, 0xe1, 0x85, 0x4b, 0x08, -0x8c, 0x8d, 0x8d, 0x51, 0xab, 0xd5, 0x18, 0x1a, 0x1a, 0x3a, 0x62, 0x1b, -0x18, 0x1c, 0xe6, 0xf3, 0x77, 0x7c, 0x92, 0xaf, 0x5c, 0x79, 0x36, 0xb3, -0x0f, 0xdf, 0xcf, 0xc8, 0x51, 0x83, 0x34, 0xea, 0x69, 0xcf, 0x19, 0x1b, -0x48, 0xad, 0xc7, 0x6a, 0xe8, 0x55, 0xc3, 0x10, 0x02, 0x51, 0xec, 0x48, -0x22, 0x41, 0xcb, 0x2e, 0xb1, 0xed, 0x29, 0xa0, 0x09, 0x3d, 0x95, 0x8a, -0x9d, 0x21, 0x3f, 0x34, 0xc5, 0xf0, 0xb3, 0xdb, 0xf9, 0xf6, 0x17, 0xef, -0xa4, 0x6f, 0x60, 0x70, 0x09, 0x81, 0x6e, 0x9e, 0x33, 0x71, 0xf0, 0x00, -0x59, 0x9a, 0x2c, 0xdd, 0x17, 0xb5, 0x8c, 0x1e, 0xb7, 0x0e, 0xa9, 0x72, -0x5c, 0x80, 0x48, 0x42, 0x4f, 0x8c, 0x9c, 0xa1, 0xbf, 0x9e, 0x12, 0x59, -0x65, 0xa6, 0x55, 0x60, 0xab, 0xca, 0x2b, 0x40, 0x3d, 0xb1, 0x94, 0x36, -0xc6, 0x59, 0xa5, 0x6c, 0xb5, 0x50, 0xa3, 0xa4, 0xd6, 0x11, 0x45, 0x8e, -0xa2, 0x5d, 0x91, 0x26, 0x31, 0x69, 0x56, 0x5b, 0x72, 0x46, 0x6c, 0x37, -0x67, 0x79, 0x7a, 0xc7, 0x0e, 0xc6, 0x64, 0x05, 0x5f, 0x7f, 0xe0, 0x07, -0x58, 0xa3, 0x0c, 0xa6, 0x8e, 0x5a, 0x6c, 0xc9, 0xbd, 0xf0, 0x9d, 0x87, -0x1e, 0x61, 0xe5, 0xf9, 0xd7, 0x40, 0xde, 0xc1, 0x86, 0x80, 0x31, 0x8a, -0x2c, 0x36, 0xa2, 0x01, 0xc8, 0xac, 0xa8, 0x5d, 0xd5, 0x6f, 0xcb, 0x03, -0x7b, 0x26, 0x71, 0x26, 0x21, 0x35, 0x01, 0xb5, 0x86, 0x32, 0x04, 0x8c, -0xb5, 0x18, 0x6b, 0x51, 0x35, 0xf4, 0xad, 0x7e, 0x15, 0x4f, 0xf5, 0xaf, -0xe5, 0xce, 0xdb, 0x6e, 0xe3, 0x94, 0x0d, 0xa7, 0xf3, 0xb7, 0xf1, 0xfd, -0x3c, 0xb1, 0xeb, 0x39, 0x2a, 0xd7, 0x4f, 0x27, 0x19, 0xe6, 0x92, 0x5b, -0xef, 0xe1, 0xe7, 0xbb, 0x9f, 0x02, 0xc0, 0x54, 0x1d, 0xbc, 0x5f, 0x00, -0x35, 0x0c, 0x9c, 0xff, 0x3e, 0x56, 0x9e, 0xb0, 0x8e, 0x6e, 0x3b, 0x27, -0x8d, 0x1c, 0xde, 0x83, 0x43, 0xa8, 0x7c, 0xcc, 0xc1, 0xf1, 0x09, 0x56, -0x1f, 0x1b, 0x95, 0xb2, 0xf5, 0xc7, 0x3f, 0x3c, 0xef, 0xda, 0xcf, 0x3e, -0xb2, 0xa5, 0x71, 0xe6, 0x85, 0x8d, 0x0d, 0x27, 0xac, 0x46, 0x23, 0x07, -0xbe, 0x22, 0xf8, 0x80, 0x18, 0x03, 0x46, 0x51, 0x51, 0xaa, 0x3c, 0xe7, -0x99, 0x3f, 0xed, 0x64, 0x6e, 0xe2, 0x25, 0x6a, 0xc3, 0x83, 0xac, 0x18, -0x59, 0x8d, 0x4b, 0x33, 0x6a, 0x8d, 0x21, 0x52, 0x67, 0x41, 0x04, 0xb5, -0x06, 0xb1, 0xa6, 0x27, 0xbb, 0x46, 0x10, 0x81, 0xa2, 0xdb, 0x45, 0x08, -0x78, 0x5f, 0x11, 0xca, 0x8a, 0x50, 0x94, 0xec, 0x18, 0x1b, 0x67, 0xe6, -0xb7, 0x3f, 0x9f, 0xf9, 0xfa, 0xad, 0x17, 0x5f, 0x66, 0xbd, 0x98, 0xed, -0xab, 0x8a, 0x67, 0x2e, 0x3e, 0xf8, 0xd4, 0xd1, 0x5b, 0x7f, 0xf4, 0xc4, -0x9f, 0xe3, 0x78, 0xa8, 0xde, 0x23, 0xd0, 0xea, 0x82, 0x68, 0xef, 0x70, -0x69, 0x04, 0x02, 0x18, 0x93, 0x80, 0x64, 0x4c, 0xec, 0x6b, 0xf2, 0xec, -0x9e, 0x27, 0x7b, 0x47, 0x71, 0x6b, 0x41, 0x85, 0x90, 0x17, 0xa8, 0x11, -0xc8, 0x62, 0x28, 0x73, 0x24, 0x2f, 0x7b, 0xe5, 0xf5, 0x48, 0xf1, 0x08, -0x84, 0xaa, 0xa2, 0xdb, 0xea, 0x30, 0x68, 0xe8, 0x1e, 0x5d, 0x3d, 0x7b, -0xa9, 0x17, 0xfb, 0xd8, 0xdf, 0x01, 0x8b, 0xfb, 0xb9, 0x42, 0x10, 0x02, -0xa4, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, -0x60, 0x82, +static const unsigned char Dolphin_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x00, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x00, 0x00, + 0x04, 0x54, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x57, 0x7d, 0x6c, + 0x14, 0x45, 0x14, 0x9f, 0xd9, 0xdd, 0xdb, 0xbb, 0xa3, 0x57, 0x4e, 0x96, + 0xe3, 0x4a, 0xbf, 0x6c, 0xf1, 0xd0, 0xe6, 0xae, 0x39, 0xac, 0x96, 0xc4, + 0xb4, 0x16, 0x1b, 0x88, 0x10, 0x88, 0xf8, 0x91, 0xe6, 0xb4, 0x8a, 0x09, + 0xc6, 0x28, 0x89, 0x51, 0x30, 0xfa, 0x07, 0x49, 0x49, 0x34, 0xfe, 0x41, + 0xd4, 0x26, 0xf2, 0x87, 0x1a, 0x15, 0x21, 0x4a, 0x4c, 0x4c, 0x40, 0xc2, + 0x25, 0x24, 0x44, 0xd2, 0x53, 0xfc, 0xa8, 0x42, 0xda, 0x7a, 0x58, 0x44, + 0x8a, 0x50, 0x6d, 0x45, 0xda, 0x1e, 0xf7, 0xd1, 0xed, 0xd1, 0xee, 0x72, + 0x1f, 0xdb, 0xbd, 0x9d, 0x5d, 0xde, 0x1e, 0x7b, 0xe7, 0x51, 0x5b, 0xc4, + 0x3f, 0xc8, 0xfd, 0x61, 0x27, 0xf9, 0xe5, 0xcd, 0xbc, 0xf7, 0xe6, 0xcd, + 0x9b, 0x79, 0xef, 0xcd, 0xce, 0x62, 0x4d, 0xd3, 0x50, 0x31, 0x1b, 0x85, + 0x8a, 0xdc, 0xe6, 0x1d, 0x28, 0xba, 0x03, 0x18, 0xb5, 0x1f, 0x2a, 0xaa, + 0x03, 0xcc, 0x2d, 0xb0, 0xe9, 0x01, 0xb4, 0x14, 0x8c, 0xa3, 0x80, 0x23, + 0x73, 0x9e, 0xc0, 0xba, 0xb3, 0xb3, 0x97, 0xe1, 0xd7, 0x3b, 0xfd, 0xba, + 0xa1, 0x76, 0x40, 0x23, 0xa0, 0x12, 0xd0, 0x60, 0x88, 0x04, 0xc0, 0xb0, + 0x41, 0x83, 0x80, 0x5e, 0x83, 0xae, 0x05, 0x74, 0x18, 0x0e, 0xe8, 0x4d, + 0x31, 0xf8, 0x57, 0xd6, 0xbd, 0xee, 0x5b, 0x7f, 0xd3, 0x27, 0x00, 0x0b, + 0xb7, 0x02, 0xd9, 0x0e, 0x78, 0x28, 0xab, 0x60, 0x36, 0xa1, 0x05, 0x9c, + 0x0d, 0x59, 0x6f, 0x2b, 0x41, 0x26, 0x2b, 0x8b, 0x54, 0x85, 0xd8, 0x13, + 0xbc, 0xd8, 0x48, 0x64, 0x05, 0x25, 0xe3, 0x57, 0xd6, 0x14, 0xce, 0x35, + 0x97, 0x5a, 0x51, 0xe5, 0xdd, 0xb5, 0xa8, 0x74, 0xa9, 0x1d, 0xf4, 0x6d, + 0xf4, 0x74, 0x22, 0xed, 0x88, 0x9e, 0x1d, 0x8b, 0xdf, 0x30, 0x04, 0xaa, + 0x7a, 0xad, 0xf3, 0xcd, 0x9b, 0x7e, 0x1a, 0xc8, 0xbb, 0x80, 0xad, 0xfa, + 0x62, 0xe5, 0x2b, 0x6a, 0x50, 0x99, 0xbb, 0x0a, 0x95, 0x38, 0x16, 0xce, + 0x39, 0x39, 0x93, 0x96, 0x91, 0x70, 0x29, 0x8e, 0x84, 0xd0, 0x65, 0x64, + 0xe5, 0x60, 0x8e, 0xb7, 0x06, 0x61, 0x8c, 0xb3, 0xb2, 0x24, 0x2f, 0xc6, + 0x16, 0xbb, 0xca, 0x5b, 0x01, 0xd1, 0xdc, 0x1a, 0xb3, 0x3b, 0x40, 0xf2, + 0xfd, 0xdd, 0x34, 0xcb, 0x6c, 0x59, 0xbe, 0xda, 0x8b, 0x2a, 0x1a, 0xee, + 0xc8, 0x1b, 0x2a, 0x90, 0xff, 0xa3, 0xd1, 0x2c, 0x8b, 0xb8, 0x65, 0xe5, + 0x59, 0xe8, 0x4d, 0x83, 0x85, 0x72, 0x01, 0x1d, 0x0c, 0xfc, 0xe2, 0x98, + 0x1c, 0xe5, 0x5b, 0xd6, 0x74, 0xf8, 0xfc, 0x37, 0x2c, 0x43, 0x15, 0x22, + 0xf5, 0x5d, 0xa7, 0xbf, 0x91, 0x2d, 0xb1, 0x6c, 0xb9, 0x77, 0xd3, 0x6a, + 0xd8, 0x85, 0x0b, 0x69, 0x04, 0x23, 0x9d, 0x4f, 0x64, 0x4d, 0x02, 0xba, + 0x17, 0xf0, 0x28, 0x60, 0x25, 0xa0, 0x14, 0x80, 0x01, 0x8c, 0x31, 0xde, + 0x08, 0x78, 0x0d, 0xf4, 0x02, 0x40, 0x55, 0x7d, 0x4e, 0x0e, 0x4e, 0xf7, + 0xed, 0x7a, 0x78, 0x0f, 0x81, 0xed, 0x8e, 0x42, 0xfe, 0x4c, 0x30, 0x04, + 0x76, 0x88, 0x29, 0x6a, 0x9b, 0xe7, 0x91, 0x66, 0x64, 0x59, 0x64, 0x47, + 0xc4, 0xd8, 0xb1, 0x24, 0x24, 0x4f, 0xff, 0x1e, 0x08, 0x1e, 0x10, 0xc3, + 0xf1, 0x29, 0x23, 0xb1, 0x96, 0x1a, 0x09, 0x39, 0xa0, 0x27, 0xe1, 0xaa, + 0x57, 0x7d, 0xfd, 0xc6, 0x26, 0x8e, 0xea, 0xd5, 0x8c, 0x08, 0xe2, 0xf4, + 0xa4, 0xd5, 0x54, 0xf5, 0x69, 0xb0, 0x77, 0xbf, 0xd3, 0xb3, 0x0c, 0x69, + 0x1a, 0x46, 0x43, 0xdf, 0x9e, 0x7a, 0xbb, 0x7b, 0x97, 0xbf, 0x12, 0xf4, + 0xb7, 0xcd, 0x75, 0x0f, 0x58, 0x17, 0xbb, 0x2a, 0xf9, 0xba, 0x0d, 0x4d, + 0x25, 0x39, 0xe6, 0xd4, 0x58, 0x0c, 0x9d, 0x3f, 0x72, 0x02, 0xfd, 0xcb, + 0x87, 0x2a, 0x01, 0xf8, 0x01, 0x70, 0x18, 0x70, 0xb0, 0x79, 0xab, 0x2f, + 0x51, 0x20, 0x6b, 0x55, 0x09, 0xd9, 0x4b, 0xd1, 0xf4, 0x5d, 0xe2, 0x25, + 0x1e, 0x0d, 0x76, 0xf5, 0x22, 0x45, 0x92, 0x3b, 0x41, 0x67, 0xc7, 0x6c, + 0x0e, 0x7c, 0x50, 0xbb, 0xea, 0x9e, 0x97, 0xca, 0xea, 0x5d, 0x79, 0xe6, + 0xd4, 0x48, 0x04, 0xc9, 0xc9, 0x74, 0xb6, 0x6f, 0xb1, 0xdb, 0x20, 0xd6, + 0xa6, 0x6c, 0x5f, 0xe7, 0x65, 0x52, 0x12, 0x92, 0xc4, 0x24, 0x24, 0xd9, + 0xa4, 0x92, 0x88, 0xc5, 0x53, 0x50, 0x15, 0x7a, 0x96, 0x8a, 0x80, 0x3d, + 0x80, 0xce, 0xfb, 0x5e, 0xf0, 0x5d, 0xce, 0xa5, 0x08, 0x9c, 0xc6, 0x76, + 0xc8, 0xa5, 0xb7, 0xc4, 0x30, 0x8f, 0x07, 0x8f, 0xc2, 0x86, 0xe0, 0x74, + 0x40, 0xbe, 0xff, 0x3a, 0x07, 0xd8, 0x67, 0xbf, 0xcc, 0x78, 0xda, 0xd6, + 0x32, 0x8c, 0x99, 0xbd, 0xce, 0x33, 0x4d, 0xd5, 0x44, 0x4d, 0x25, 0x21, + 0x8a, 0x61, 0xd2, 0xb0, 0x9b, 0x3a, 0xd8, 0x8d, 0x6d, 0xa6, 0xf7, 0x6a, + 0x46, 0x21, 0x13, 0x43, 0x17, 0xe9, 0x89, 0x3f, 0x2e, 0x4e, 0xa7, 0xe2, + 0x53, 0x11, 0x60, 0xe9, 0x61, 0xe8, 0x58, 0xf9, 0x9c, 0x6f, 0xf7, 0xdf, + 0x76, 0xd4, 0x27, 0x80, 0xec, 0x9f, 0xfc, 0x2b, 0x44, 0x5f, 0xe8, 0x0e, + 0x4a, 0xd0, 0xf7, 0x82, 0x7c, 0x38, 0xef, 0x80, 0xeb, 0x93, 0x18, 0x29, + 0x2d, 0x77, 0x52, 0xa0, 0x18, 0x81, 0xd8, 0x7d, 0x08, 0xbc, 0x13, 0x80, + 0x7e, 0xe3, 0x88, 0xaf, 0x19, 0x21, 0xea, 0x83, 0x98, 0xa6, 0x8e, 0xe5, + 0xc6, 0xc2, 0x58, 0x18, 0x49, 0x53, 0xc2, 0xc7, 0x65, 0x5e, 0x77, 0x1c, + 0xe6, 0x3d, 0x0c, 0xf3, 0x56, 0x48, 0x82, 0x28, 0x84, 0xfb, 0x07, 0x4c, + 0x62, 0x28, 0x72, 0xdc, 0xb8, 0x84, 0x36, 0x37, 0x6c, 0xce, 0x9f, 0x46, + 0x0b, 0xe8, 0x7d, 0xcf, 0x9f, 0x1b, 0xa2, 0xc2, 0xa7, 0x06, 0x7e, 0x02, + 0x7e, 0x73, 0xbe, 0x92, 0xb8, 0xc7, 0x76, 0xd4, 0xd0, 0x26, 0xf6, 0x15, + 0x84, 0xe9, 0x97, 0xa1, 0x8c, 0x8e, 0x03, 0x46, 0x00, 0x72, 0xb6, 0xa4, + 0x72, 0x40, 0xf8, 0x02, 0x5c, 0x3c, 0x10, 0x07, 0xea, 0x01, 0x7d, 0x8c, + 0x29, 0x1a, 0x8d, 0xfc, 0xd8, 0x67, 0x8d, 0x9e, 0xfe, 0x4d, 0x89, 0x9d, + 0x39, 0xff, 0xcc, 0x92, 0x7a, 0xcf, 0x7b, 0x34, 0x6b, 0x16, 0xec, 0xd5, + 0x55, 0xd5, 0x0b, 0xab, 0x2a, 0x1c, 0x89, 0xe8, 0xb8, 0x99, 0xc8, 0x99, + 0x27, 0xa3, 0xbf, 0x9e, 0x3b, 0x06, 0x32, 0x01, 0xe6, 0x8c, 0x42, 0x42, + 0xf6, 0x59, 0x39, 0x6e, 0x53, 0x72, 0x7c, 0x82, 0x1b, 0xeb, 0xf9, 0x79, + 0x04, 0xf8, 0x03, 0x59, 0x5b, 0x6e, 0xff, 0x7f, 0x7a, 0x11, 0xb5, 0x43, + 0x66, 0x7e, 0x04, 0x97, 0x04, 0x97, 0xe2, 0xf9, 0x68, 0xa8, 0xa7, 0x37, + 0x45, 0x64, 0xf9, 0x2b, 0xf7, 0xe3, 0xbe, 0x17, 0x0b, 0x74, 0xd6, 0x2b, + 0x92, 0xf4, 0x46, 0xf8, 0xe4, 0x49, 0x7b, 0x32, 0x1a, 0x0b, 0xc1, 0xb8, + 0x0d, 0xe4, 0x09, 0x23, 0x1c, 0x4f, 0x81, 0xec, 0xd3, 0x3f, 0xbb, 0x02, + 0x11, 0xe8, 0xbb, 0x81, 0x2f, 0x53, 0x24, 0x03, 0x15, 0x74, 0xf3, 0x38, + 0x48, 0x14, 0xec, 0x04, 0xba, 0x81, 0xb5, 0x3b, 0xf6, 0x38, 0xea, 0xbd, + 0x13, 0x0b, 0x96, 0x38, 0xcd, 0x33, 0x74, 0x02, 0x98, 0xb6, 0x34, 0x71, + 0x77, 0xba, 0x3b, 0x2d, 0x8b, 0x38, 0x33, 0xac, 0x6b, 0xcd, 0xc9, 0x54, + 0x42, 0x1d, 0xd0, 0x10, 0xb3, 0x8f, 0xab, 0x73, 0xeb, 0x89, 0xfb, 0xbc, + 0xce, 0xc3, 0xae, 0xcf, 0x6f, 0xdd, 0x9b, 0x30, 0xd6, 0xdf, 0xc7, 0x11, + 0x79, 0x5a, 0xae, 0x68, 0x6a, 0x2d, 0x2c, 0x51, 0x5a, 0x91, 0xd2, 0xc1, + 0x70, 0x4f, 0xf7, 0x78, 0x26, 0x95, 0xdc, 0x88, 0x6b, 0xf7, 0x15, 0xe5, + 0x51, 0xba, 0x3c, 0x19, 0x19, 0xfd, 0x8c, 0x3f, 0x13, 0xdc, 0xc5, 0x10, + 0x52, 0x94, 0x77, 0xc8, 0x30, 0x63, 0xe3, 0xba, 0x28, 0x13, 0xdb, 0xa6, + 0xdf, 0xe9, 0xc5, 0x79, 0x0b, 0xb2, 0xb6, 0x77, 0xac, 0xce, 0xea, 0xc3, + 0x8c, 0x5a, 0x9c, 0x13, 0xc8, 0x5e, 0xac, 0x70, 0xbf, 0x7c, 0x81, 0xcb, + 0xde, 0xff, 0x9f, 0xff, 0x98, 0xe0, 0xf9, 0x5f, 0xb3, 0x79, 0x07, 0x8a, + 0xed, 0xc0, 0x55, 0x01, 0x06, 0x00, 0x42, 0xad, 0x29, 0x6c, 0x85, 0x2d, + 0x33, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, + 0x60, 0x82 }; diff --git a/Source/Core/DolphinWX/resources/Dolphin.icns b/Source/Core/DolphinWX/resources/Dolphin.icns index ef69fda74d..4a17b18dec 100644 Binary files a/Source/Core/DolphinWX/resources/Dolphin.icns and b/Source/Core/DolphinWX/resources/Dolphin.icns differ diff --git a/Source/Core/DolphinWX/resources/Dolphin.png b/Source/Core/DolphinWX/resources/Dolphin.png index e3bfebe487..597829386d 100644 Binary files a/Source/Core/DolphinWX/resources/Dolphin.png and b/Source/Core/DolphinWX/resources/Dolphin.png differ diff --git a/Source/Core/DolphinWX/resources/Dolphin.xpm b/Source/Core/DolphinWX/resources/Dolphin.xpm index 8d3df77781..ef8d837539 100644 --- a/Source/Core/DolphinWX/resources/Dolphin.xpm +++ b/Source/Core/DolphinWX/resources/Dolphin.xpm @@ -1,129 +1,214 @@ /* XPM */ -static const char *Dolphin_xpm[] = { -"32 32 94 2", -" c None", -". c #000000", -"+ c #1A496C", -"@ c #091A27", -"# c #3AA4F0", -"$ c #3AA3EF", -"% c #3CA1EA", -"& c #1A4A6D", -"* c #3AA2ED", -"= c #F7FAFA", -"- c #FFFFFF", -"; c #FDFDFD", -"> c #49A1E0", -", c #3BA2EC", -"' c #FBFDFC", -") c #FEFFFD", -"! c #4EA3E0", -"~ c #3DA1E9", -"{ c #D1E1EB", -"] c #8ABBDE", -"^ c #F2F6F7", -"/ c #FAFBFC", -"( c #CEDEEA", -"_ c #E5EEF2", -": c #BBD2E1", -"< c #B3CFE5", -"[ c #FFFFFE", -"} c #FEFFFE", -"| c #E8F0F3", -"1 c #E4ECF1", -"2 c #E5EDF0", -"3 c #E9F0F3", -"4 c #FEFEFE", -"5 c #F9FBFB", -"6 c #B0CCE0", -"7 c #FEFEFF", -"8 c #F9FAFB", -"9 c #43A1E4", -"0 c #EFF3F6", -"a c #F0F5F7", -"b c #97C1DE", -"c c #FEFEFD", -"d c #FDFDFC", -"e c #97BEDB", -"f c #FBFCFC", -"g c #EDF3F6", -"h c #6EADDA", -"i c #F3F6F8", -"j c #3BA1EA", -"k c #6EADDB", -"l c #F4F8F9", -"m c #F1F6F7", -"n c #3FA1E7", -"o c #9BC1DD", -"p c #FCFDFC", -"q c #FBFDFB", -"r c #B9D1E1", -"s c #E0EBF2", -"t c #D3E3EF", -"u c #FFFEFE", -"v c #F2F7F7", -"w c #D5E4F0", -"x c #F6F9F9", -"y c #BDD5E5", -"z c #EBF1F4", -"A c #DEEAF2", -"B c #AAC9DE", -"C c #FEFFFF", -"D c #EFF4F6", -"E c #F8FAFB", -"F c #A0C4E1", -"G c #D6E5F0", -"H c #FAFCFC", -"I c #BDD5E7", -"J c #EEF3F7", -"K c #F3F7FA", -"L c #C7D8E4", -"M c #CDDEEC", -"N c #DAE6ED", -"O c #9AC2DF", -"P c #E8EFF4", -"Q c #ACCDE3", -"R c #8DBBDC", -"S c #D5E3EB", -"T c #FDFFFE", -"U c #FCFDFD", -"V c #FEFDFD", -"W c #F7F9FA", -"X c #FDFEFD", -"Y c #E7EFF4", -"Z c #A4C7E0", -"` c #F9FDFB", -" . c #F6FBFC", -".. c #B8D1E3", -" . . + . . . . . . . . . . . . . . . . . . . . . . . . ", -". @ . . # # # # # # # # # # # # # # # # # # # # # # # # . . ", -". . # # # # # # # # # # # # $ . . . . . % # # # # # # # # # . ", -"& . # # # # # # # # # # # * . = - - - ; . > # # # # # # # # . ", -". # # # # # # # # # # # , . ' ) - - - - ) . ! # # # # # # # # . ", -". # # # # # # $ . . # $ . ; - - - - - - - - . ~ # # # # # # # . ", -". # # # # . . . { ] . . ^ ) - - - - - - - - / . # # # # # # # . ", -". # # # . ( _ . : < . . [ } - - - - - - - - [ . # # # # # # # . ", -". # # # # . | 1 2 3 . . 4 - - - - - - - - - 5 . $ # # # # # # . ", -". # # # # . 6 [ } 7 . . 4 - - - - - - - - - 8 . 9 # # # # # # . ", -". # # # # . 0 } - - - - - - - - - - - - - - - 4 . # # # # # # . ", -". # # # # . a ) - [ - - - - - - - - - - - - - ; . # # # # # # . ", -". # # # # . b = c 4 - - - - - - - - - - - - d . ~ # # # # # # . ", -". # # # # # . . . e f - - - - - - - - - - g . , # # # # # # # . ", -". # # # # # # # # . h i - - - - - - - - ) . j # # # # # # # # . ", -". # # # # # # # # # . k l - - - - - - - } m . n # # # # # # # . ", -". # # # # # # # # # # . o } - - - - - - - - p . , # # # # # # . ", -". # # # # # # # # # # $ . } - - - - - - - - 4 q . # # # # # # . ", -". # # # # # # # # # # . r - - - - - - - - - } 4 s . # # # # # . ", -". # # # # # # # # # # . t - - - - - - - - - u v . # # # # # # . ", -". # # # # # # # # # # . w - - - - - - - - - x . # # # # # # # . ", -". # # # # # # # # # # . y [ - - - - - - - - z . # # # # # # # . ", -". # # # # # # # # # # $ . ) - - [ - - - - - A . # # # # # # # . ", -". # # # # # # # # # # . B C - - [ D E - - - F . # # # # # # # . ", -". # # # # # # # # # # . G - - - H . I - - J . # # # # # # # # . ", -". # # # # # # # # # # . K - - - L . M - [ N . # # # # # # # # . ", -". # # # # # # # # # . O - - - - . . P - - 5 Q . $ # # # # # # . ", -". # # # # # # # # . R q - - - - . . i - - - 7 l . # # # # # # . ", -" . # # # # # # # . S T [ [ U V . . 5 W ; - X Y . # # # # # . ", -" . # # # # # # # . Z ` .... . ~ , . . . . . . # # # # # # . ", -" . . # # # # # # . . . . # # # # # # # # # # # # # # . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . "}; +static char *Dolphin[] = { +/* columns rows colors chars-per-pixel */ +"128 128 80 1 ", +" c #0057AB", +". c #0159AD", +"X c #035EB1", +"o c #0662B5", +"O c #0866B5", +"+ c #0A68B7", +"@ c #0867BB", +"# c #0B6BBC", +"$ c #0E70BC", +"% c #0666C0", +"& c #0769C4", +"* c #0A6DC2", +"= c #0E72C4", +"- c #0E74CA", +"; c #1176C2", +": c #147BC4", +"> c #137CCC", +", c #0F7AD6", +"< c #0E79D8", +"1 c #127DD3", +"2 c #107FE2", +"3 c #1780C7", +"4 c #1681CD", +"5 c #1984CC", +"6 c #1C89CD", +"7 c #1683D5", +"8 c #1885D2", +"9 c #1A89D3", +"0 c #1484DD", +"q c #1788DF", +"w c #1B8CDC", +"e c #1E91DB", +"r c #2294D5", +"t c #2598D7", +"y c #2196DD", +"u c #269CDA", +"i c #289EDB", +"p c #2AA2DD", +"a c #1788E0", +"s c #198BE1", +"d c #1487E9", +"f c #1488EE", +"g c #1E93E2", +"h c #1C94EC", +"j c #1F98EB", +"k c #1F9AF3", +"l c #1994FA", +"z c #1D9BFF", +"x c #239BE5", +"c c #239CEB", +"v c #219DF6", +"b c #209EFE", +"n c #26A0E6", +"m c #2BA5E4", +"M c #2EA9E3", +"N c #26A1EC", +"B c #29A4EB", +"V c #2CAAED", +"C c #31AFE7", +"Z c #33B4EB", +"A c #36B9EE", +"S c #38BAEE", +"D c #27A5F6", +"F c #28A6F5", +"G c #2DADF2", +"H c #25A5FE", +"J c #27A8FF", +"K c #2AADFF", +"L c #2FB1F7", +"P c #2EB3FF", +"I c #32B4F3", +"U c #36BAF3", +"Y c #31B6FF", +"T c #34BBFF", +"R c #3EC6F7", +"E c #3AC4FF", +"W c #3ECAFF", +"Q c #41CDFF", +"! c #44D1FF", +"~ c None", +/* pixels */ +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~ ..O...X ~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ . ~~~~~~~~~~~~ O6uCS!!!!!!!QSpt:o~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$6666ppp66663$. ~~~~~ OrS!!!!!!!!!!!!!!!RC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~ .#6iZQ!!!!!!!!!!!!!!!!!!AMt3+ :Z!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~ .$rZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Ct5+ :S!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~ .:pQ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Q!!!!RM6+ ;S!!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~ $iQQ!!!!!!Q!Q!!!!!!!Q!!!!!!!Q!!!!!!Q!!!!!!!!!Q!RMZ!!!!!!Q!!!!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~ :Z!!!Q!!!!Q!!!!!!!!!!!!!!!!Q!!!!!Q!!!!!!Q!Q!!!!!!QQ!Q!!Q!!!!!!!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~ $AQQQQ!!QQ!QQQ!!QQ!QQ!QQQ!!Q!QQ!!Q!Q!Q!!QQ!QQW!Q!QQ!QQQQQQQQ!!!!QQQQ!Q~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~ XmQQQQQQQQQQQQQQQQQQQQQ!QQQQQQQQQQQQQQQQQQQQQQQQQQ!!QQ!QQQQQQQQQQQQ!QQQA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~ .rWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWQQQQQQQQQQQQQQQQQU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~ OAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWQQQQQQQQQQQQQQQQQQQQQX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~ ;RWQQWQWQQQQQQWQWQQQQWQQQWQQQ~~~~~~~~~~~~~~~~QQQQQQWQQQWQWQQQWQWQQQWQQQQQQQW6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~ 9WWWWWWWWWWWWWWWWQWWWWWWW~~~~~~~~~~~~~~~~~~~~~~~~~~~WWWWWWWWWWWWWWWWWWWWQQRRWRo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~ 9WWWQWWWWWQWWWWQWWWWWQW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WWQWQWQWQQWWQWWWWQRWWV. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~ 5WWWWWWWWWWWWWWWWWWWW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WQEWWEWWWEWWWWWWWWQm. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~ $WWWEEWWWWEWWWEWEWEW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WWWWEWWWEWWWEWWWmX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~ oTWWEWWWWEWWEWEWWEEW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EWEEWWEEWWEWEWIo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~ mWWEWEWEEEWEEWEWEW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WEWEWEWWWEEWEU$ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~ ;EEEEEEEEEEEEEEEEW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EEEEEEEEEEEWT: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~ GEEEEEEEEEEEEEEEE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EEEEEEETEEEW4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~#EEETEETEEEETEEEE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EEEEEEEEEEEy. ~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~ yEEEEEETEEETEEEE~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ETEEETEEEEm.. ~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~ IETETTEETETETETG. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ETEETTTETVo ~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~+EETETEETETEETEE4 . X##$##. . ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ETEEETTETGX ~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~>TTETTTTTTETTETTo+;>yyxVVTETEETTTTETETTETVVny9>#. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~TTETETTEV. ~~~~~~~~~~~~~~~~~~~~~~", +"~~~~ eTTTTTETETTETTTTETTTETTTTTTETTTTETTTTETTTTTTTTTTTGx8;. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~TTTTEETTVX ~~~~~~~~~~~~~~~~~~~~~", +"~~~ BTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTmw# ~~~~~~~~~~~~~~~~~~~~~~~~~~~TTTTTTTTB. ~~~~~~~~~~~~~~~~~~~~", +"~~~ oTTTTTTTYTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTYTTTTTTTTTTTTTTTTTTLe= ~~~~~~~~~~~~~~~~~~~~~~~~~TTTTTTTTc. ~~~~~~~~~~~~~~~~~~~", +"~~ xTYTTTTTYTTTYTTTTYYTTTYTYTYTYTYTTYYTTTTTYTTTTTYTTYTTTTYTTTTTTLw+ ~~~~~~~~~~~~~~~~~~~~~~~~~TTYYTYTx ~~~~~~~~~~~~~~~~~~~", +"~ 8TYTTTPTTTPTYYYTYYTYTYTYTYTYTYTYTYTYTTTYYYYTYTTYTYTYTYTYTYYTYYTTYN:.. ~~~~~~~~~~~~~~~~~~~~~~~~YTYTTTTw ~~~~~~~~~~~~~~~~~~", +" =YYYYYPTYYPTPTYTYYYYYYYYY~~~~~~~~~~~YYYYYTYTYYYYYYYYYYYYYYYYYYYYYYYTK9X ~~~~~~~~~~~~~~~~~~~~~~~YYYPTPT> ~~~~~~~~~~~~~~~~~", +" XKYYYPYYYYYYYYYYYYY~~~~~~~~~~~~~~~~~~YYPYYYYYYPYYYYYYgYYYYYYYYYYYYYYYYYPwo ~~~~~~~~~~~~~~~~~~~~~~YYYYYYP# ~~~~~~~~~~~~~~~~", +" xYPPYPPPPPYPPP~~~~~~~~~~~~~~~~~~~~~~~~PPYPPPPPPPYPPPY#~~~~~PPPPPPPPPYPPPPPgo ~~~~~~~~~~~~~~~~~~~~~~PPYPPPGX ~~~~~~~~~~~~~~~~", +":PPPPPPPPPPP~~~~~~~~~~~~~~~~~~~~~~~~~~~PYPPPPPPPPPPPPP>~~~~~~~~~PPYPPPPPYPPPK9X ~~~~~~~~~~~~~~~~~~~~~PPPPPPx ~~~~~~~~~~~~~~~", +"cPPPPPPPPP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PPPPPPPPPPPPPPw ~~~~~~~~~~~PPPPPPPPPYYK7. ~~~~~~~~~~~~~~~~~~~~~PPPPPP7 ~~~~~~~~~~~~~~", +"KPKPPPPP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PPPPPKPKPKPPKD ~~~~~~~~~~~~~~~PKYYKKKYKD* . ~~~~~~~~~~~~~~~~~~~~PPPPPK@ ~~~~~~~~~~~~~~", +"FPPKK~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KKKKPKPKPPKPKP* ~~~~~~~~~~~~~~~~KKYKYPKPKw. ~~~~~~~~~~~~~~~~~~~~KKKPPc. ~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KPPKKKPKKKKPKg ~~~~~~~~~~~~~~~~~~KKKKPKKD= ~~~~~~~~~~~~~~~~~~~~KKKKK1 ~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KKKKKKKKKKKKK= ~~~~~~~~~~~~~~~~~~~~KKKKKK7. ~~~~~~~~~~~~~~~~~~~KKKKKKO ~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KKKKJKKKKKKKD@ ~~~~~~~~~~~~~~~~~~~~KKKKKcX ~~~~~~~~~~~~~~~~~~KKKKKj ~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~JKJKJKKJKJJD@ ~~~~~~~~~~~~~~~~~~~~~JKJKD* ~~~~~~~~~~~~~~~~~~JKJKJ1 ~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~JJJKJKJJJJJH= ~~~~~~~~~~~~~~~~~~~~~JJJJ- ~~~~~~~~~~~~~~~~~~JJJJDo ~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~JJJJJJJJJJJqX ~~~~~~~~~~~~~~~~~~~~~JJJ7 ~~~~~~~~~~~~~~~~~~JJJJs ~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~JJJJJHJJJv- ~~~~~~~~~~~~~~~~~~~~~~JJ0 ~~~~~~~~~~~~~~~~~~JJJJ@ ~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~HJJHHHJJh# ~~~~~~~~~~~~~~~~~~~~~~~~Ja. ~~~~~~~~~~~~~~~~~~JJHh ~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jhkvh#~~~~~~~~~~~~~~~~~~~~~~~~~ka ~~~~~~~~~~~~~~~~~HHHH- ~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0. ~~~~~~~~~~~~~~~~~~HHHv. ~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~- ~~~~~~~~~~~~~~~~~~~HHH1 ~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bzzX ~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Hbb0 ~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bHbo ~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bza ~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zzzo.~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz<.~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bzX~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz< ~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zl ~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zz* ~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zd ~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~zX~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~l< ~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~lX~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~f& ", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2 ", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2.", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +}; diff --git a/Source/Core/DolphinWX/resources/dolphin_logo.cpp b/Source/Core/DolphinWX/resources/dolphin_logo.cpp index a78ca0fb95..2514e4ae37 100644 --- a/Source/Core/DolphinWX/resources/dolphin_logo.cpp +++ b/Source/Core/DolphinWX/resources/dolphin_logo.cpp @@ -1,2868 +1,2868 @@ static const unsigned char dolphin_logo_png[] = { -0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, -0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01, 0x76, -0x08, 0x02, 0x00, 0x00, 0x00, 0xec, 0xb7, 0xca, 0x94, 0x00, 0x00, 0x00, -0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, -0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, -0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, -0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, -0x80, 0xe8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, -0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, -0x85, 0xcd, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5e, 0xed, 0x9d, 0x07, 0x98, -0x14, 0x55, 0xb6, 0xc7, 0x7b, 0x62, 0x4f, 0x1e, 0x18, 0x26, 0x90, 0xd3, -0x30, 0xe4, 0xcc, 0x90, 0xe3, 0x90, 0x73, 0x8e, 0x22, 0x41, 0x92, 0x82, -0x48, 0x14, 0x15, 0x45, 0x24, 0x89, 0xc0, 0xc0, 0x90, 0x83, 0x04, 0x45, -0x50, 0x11, 0x31, 0x60, 0xc0, 0xac, 0x6b, 0x5c, 0x73, 0x5a, 0xd3, 0xa6, -0xf7, 0x36, 0xb9, 0xcf, 0x4d, 0xba, 0xee, 0xae, 0xae, 0xab, 0xee, 0x2e, -0xef, 0xd7, 0x1c, 0xbc, 0x73, 0xa7, 0xaa, 0xba, 0xbb, 0x3a, 0x4c, 0xe8, -0x50, 0xdf, 0xc0, 0xd7, 0xd3, 0x53, 0x75, 0xeb, 0xd6, 0xad, 0xf3, 0xbf, -0x27, 0x9f, 0x13, 0x13, 0x17, 0x17, 0x97, 0x9e, 0x9e, 0xfe, 0xed, 0xb7, -0xdf, 0xc6, 0xc4, 0xc4, 0x38, 0xac, 0x8e, 0xf3, 0xe7, 0xcf, 0x5b, 0x7e, -0x1f, 0xfd, 0x32, 0xba, 0x02, 0xa1, 0xbb, 0x02, 0x96, 0xd4, 0x0e, 0xa9, -0x3b, 0x9d, 0xce, 0x7f, 0xfc, 0xe3, 0x1f, 0x8e, 0xcc, 0xcc, 0xcc, 0x7d, -0xfb, 0xf6, 0xdd, 0x7b, 0xef, 0xbd, 0xa7, 0x4c, 0xc7, 0xdd, 0x17, 0x8e, -0xbb, 0x2e, 0x1c, 0x77, 0xde, 0x79, 0xe7, 0xc9, 0x0b, 0xc7, 0x89, 0x0b, -0xc7, 0x1d, 0x6e, 0x8e, 0xe3, 0xc7, 0x8f, 0xab, 0xbf, 0xf0, 0xd9, 0xeb, -0x71, 0x7b, 0x39, 0x1f, 0xb7, 0xd9, 0x3e, 0x8e, 0x95, 0xc3, 0x71, 0xf4, -0xe8, 0x51, 0x46, 0xe5, 0x7f, 0x9f, 0x8e, 0x23, 0x47, 0x8e, 0xf8, 0x74, -0xbe, 0xdc, 0x25, 0xe8, 0x87, 0xed, 0x95, 0xbb, 0x8d, 0x77, 0xc8, 0xc9, -0xe5, 0xf1, 0x26, 0xa1, 0x1f, 0x86, 0xf5, 0x4a, 0x45, 0x3a, 0xd5, 0x99, -0x09, 0x53, 0x28, 0x56, 0xa8, 0x17, 0x32, 0x16, 0x7a, 0x16, 0xda, 0x36, -0x90, 0x3c, 0x28, 0x00, 0x0b, 0x20, 0xc2, 0x91, 0x92, 0x92, 0xc2, 0x9f, -0x41, 0x89, 0x7e, 0xfc, 0xf7, 0xc2, 0xf1, 0x9f, 0x0b, 0xc7, 0xbf, 0xff, -0xfd, 0xef, 0xef, 0xbf, 0xff, 0x1e, 0x66, 0xf2, 0xcd, 0x37, 0xdf, 0xfc, -0xf3, 0x9f, 0xff, 0xfc, 0xfa, 0xeb, 0xaf, 0xbf, 0xfa, 0xea, 0x2b, 0xf0, -0xc4, 0xf1, 0x77, 0xd3, 0xf1, 0xb7, 0xbf, 0xfd, 0x4d, 0x7d, 0xc7, 0x67, -0xcb, 0xe3, 0x4b, 0x1b, 0xc7, 0x5f, 0x6d, 0x1c, 0x5f, 0xd8, 0x38, 0x3e, -0xb7, 0x71, 0xfc, 0xc5, 0x74, 0xfc, 0xf9, 0xcf, 0x7f, 0xd6, 0xbf, 0xe3, -0x57, 0x3b, 0xc7, 0x9f, 0x4c, 0xc7, 0x1f, 0xff, 0xf8, 0x47, 0xf5, 0x1d, -0x9f, 0x2d, 0x8f, 0x3f, 0xfc, 0xe1, 0x0f, 0x86, 0xef, 0xcd, 0xdf, 0x58, -0x5e, 0x68, 0xbe, 0x9d, 0xf9, 0x1b, 0x3b, 0xd3, 0x36, 0x3f, 0xbe, 0x7c, -0xa3, 0x56, 0x4e, 0xff, 0xac, 0x2f, 0xa7, 0xbe, 0xfc, 0x7c, 0xef, 0xee, -0x6d, 0xa8, 0x37, 0xc9, 0x09, 0xee, 0xde, 0xaa, 0xa2, 0x08, 0x4e, 0xb0, -0xa4, 0x0e, 0x77, 0xb4, 0xa4, 0xbe, 0x37, 0x93, 0x22, 0xdf, 0x40, 0xa2, -0xd0, 0x2a, 0x07, 0x44, 0x0b, 0xe9, 0xfe, 0xeb, 0x5f, 0xff, 0x82, 0x8c, -0xbf, 0xfb, 0xee, 0x3b, 0xe8, 0x19, 0xaa, 0x86, 0xb6, 0x85, 0xce, 0x75, -0xca, 0x07, 0x0b, 0x20, 0xc2, 0x02, 0x15, 0x82, 0x07, 0x01, 0x03, 0x43, -0x08, 0x1e, 0x18, 0x97, 0x7b, 0x30, 0x09, 0x79, 0x30, 0x59, 0x1d, 0x77, -0xf4, 0xe4, 0xee, 0x65, 0x78, 0x78, 0x91, 0xee, 0x88, 0x86, 0xef, 0x85, -0x4a, 0xf8, 0xdf, 0xf2, 0xf8, 0xcc, 0xdb, 0xf1, 0x7f, 0xee, 0x8f, 0xdf, -0xff, 0xfe, 0xf7, 0xfc, 0x91, 0xff, 0x0d, 0xc7, 0xa7, 0x9f, 0x7e, 0xca, -0x37, 0xfc, 0xef, 0xe1, 0xf8, 0x9d, 0xc7, 0xe3, 0xb7, 0xa6, 0xe3, 0x37, -0xbf, 0xf9, 0x0d, 0xdf, 0xf1, 0x7f, 0xe0, 0x87, 0x79, 0x70, 0xf9, 0xc6, -0xf3, 0x94, 0x3c, 0x3f, 0x8e, 0xfc, 0xd5, 0xbc, 0x14, 0xb2, 0x3e, 0x96, -0x4b, 0xe8, 0x6d, 0xe1, 0x3f, 0xe3, 0x7d, 0x71, 0x8e, 0xbb, 0x17, 0xa7, -0xde, 0xac, 0x4f, 0x98, 0x77, 0x47, 0x5a, 0x90, 0xa2, 0xfa, 0x93, 0x22, -0x4b, 0xc1, 0xaa, 0x20, 0x4d, 0x40, 0x02, 0x19, 0x43, 0xcc, 0xc0, 0xc3, -0x80, 0x0d, 0x05, 0x0c, 0x6b, 0x54, 0xe8, 0x90, 0x30, 0xe3, 0x81, 0xfb, -0x41, 0xd9, 0x3c, 0x86, 0xac, 0x88, 0x2c, 0x96, 0x79, 0x29, 0xe5, 0x1b, -0xb5, 0xca, 0xe6, 0xf7, 0x61, 0xf9, 0xfe, 0xdc, 0xbd, 0x6c, 0xa1, 0x27, -0x77, 0x24, 0xf5, 0x6b, 0x37, 0xc7, 0xaf, 0x7e, 0xf5, 0x2b, 0xf9, 0x0b, -0x1f, 0xcc, 0xc7, 0xff, 0x9a, 0x8e, 0xff, 0x71, 0x73, 0xfc, 0xf2, 0x97, -0xbf, 0x94, 0xbf, 0xf0, 0xc1, 0x7c, 0xfc, 0xc2, 0xcd, 0xf1, 0x73, 0xd3, -0xf1, 0xb3, 0x9f, 0xfd, 0x4c, 0xbe, 0xe3, 0x83, 0xf9, 0xf8, 0xe9, 0x0f, -0x87, 0xe5, 0x5f, 0x0d, 0x5f, 0x9a, 0x07, 0xb7, 0x9c, 0x85, 0xcc, 0x96, -0x3f, 0x59, 0xce, 0x5c, 0x3d, 0x97, 0xe1, 0xb9, 0x65, 0x61, 0xf8, 0xd2, -0xbc, 0x44, 0x96, 0x2b, 0xa9, 0xd6, 0xd9, 0xf0, 0x1e, 0x04, 0xfc, 0x7c, -0xe9, 0x6e, 0x17, 0xb0, 0x7c, 0xdd, 0x42, 0x18, 0x3a, 0xc2, 0x85, 0x78, -0xf8, 0xd2, 0x1d, 0xaa, 0x2d, 0xc9, 0x4f, 0xc1, 0x58, 0xb6, 0x54, 0x00, -0x03, 0x42, 0x04, 0x1e, 0x0a, 0x1b, 0xc2, 0x37, 0x14, 0xd3, 0x10, 0x60, -0x58, 0xa0, 0x42, 0x41, 0x82, 0xb3, 0x85, 0x3f, 0x80, 0x30, 0xc6, 0x02, -0x0c, 0xcf, 0x3c, 0xf3, 0xcc, 0x8a, 0x15, 0x2b, 0x7a, 0xf4, 0xe8, 0x91, -0x9b, 0x9b, 0x1b, 0x1b, 0x1b, 0x1b, 0xba, 0x6a, 0x56, 0x74, 0xe6, 0x91, -0xb3, 0x02, 0x10, 0x6a, 0x76, 0x76, 0x36, 0x44, 0xbb, 0x7c, 0xf9, 0xf2, -0xc7, 0x1f, 0x7f, 0x1c, 0xa8, 0x80, 0x10, 0x88, 0x19, 0x06, 0x82, 0xd4, -0x83, 0x64, 0x05, 0x91, 0x0b, 0xd3, 0x10, 0x69, 0xca, 0x02, 0x15, 0x06, -0x48, 0x00, 0x29, 0x80, 0xc5, 0x10, 0xf7, 0xdd, 0x77, 0x5f, 0x9f, 0x3e, -0x7d, 0x22, 0x67, 0x29, 0xa3, 0x4f, 0x1a, 0xae, 0x2b, 0xd0, 0xbb, 0x77, -0x6f, 0xd4, 0x6b, 0x78, 0x0e, 0x62, 0x0e, 0x84, 0x0d, 0x79, 0x2b, 0x60, -0x28, 0x8e, 0x51, 0x86, 0x57, 0x18, 0x20, 0x01, 0x8b, 0x80, 0xe3, 0xc0, -0x7d, 0xe6, 0xce, 0x9d, 0xcb, 0x1a, 0x0d, 0x1c, 0x38, 0x30, 0x5c, 0x57, -0x2a, 0xfa, 0x5c, 0x91, 0xb6, 0x02, 0xb3, 0x67, 0xcf, 0x46, 0x3e, 0x44, -0x24, 0x83, 0x6f, 0xc0, 0x34, 0xd8, 0xfd, 0x85, 0x63, 0x08, 0x30, 0x30, -0x4f, 0x95, 0x6a, 0xdb, 0xa0, 0x42, 0xd4, 0x6b, 0xce, 0xe0, 0x3c, 0x20, -0x81, 0xbc, 0xd8, 0xaf, 0x5f, 0xbf, 0xac, 0xac, 0xac, 0x48, 0x5b, 0xb5, -0xe8, 0xf3, 0x86, 0xfd, 0x0a, 0xc0, 0x34, 0x3e, 0xf8, 0xe0, 0x03, 0x14, -0x1e, 0xf6, 0x7d, 0x14, 0x04, 0x38, 0x86, 0xe8, 0xdf, 0x40, 0x00, 0xd3, -0x6d, 0x72, 0x72, 0xb2, 0xcb, 0x06, 0x05, 0x3e, 0x40, 0x89, 0x98, 0x5f, -0xd1, 0x25, 0xe0, 0x2c, 0x9c, 0x5d, 0x54, 0x54, 0x34, 0x69, 0xd2, 0xa4, -0x32, 0x0b, 0x54, 0x30, 0xc8, 0x31, 0xe1, 0x88, 0x63, 0xe5, 0x27, 0x8e, -0x4d, 0xdf, 0x38, 0x36, 0xff, 0xdb, 0xb1, 0xe5, 0xbf, 0xe5, 0xf9, 0xf3, -0x1f, 0xc7, 0x16, 0x6e, 0x21, 0x3f, 0x7c, 0xe6, 0xc7, 0xb7, 0xdb, 0xc5, -0x6c, 0xf9, 0x6f, 0xcc, 0x96, 0xff, 0xc4, 0x6e, 0xf9, 0x0f, 0xff, 0xcb, -0x4f, 0xec, 0x56, 0x7e, 0xfe, 0x1d, 0x1b, 0xc0, 0x98, 0xbe, 0xce, 0xc1, -0xe3, 0xf9, 0xf2, 0x50, 0xea, 0xd1, 0x64, 0x92, 0x17, 0x9f, 0x51, 0x26, -0x1f, 0xd4, 0xdb, 0xf9, 0xb6, 0x7a, 0x61, 0x72, 0x6b, 0x08, 0x15, 0x72, -0x85, 0x68, 0x21, 0xdd, 0xb2, 0x47, 0xcf, 0x9e, 0x3d, 0x31, 0x5a, 0xa0, -0xd6, 0xa3, 0x88, 0x43, 0xf0, 0xd8, 0x6d, 0x21, 0x7e, 0x20, 0x60, 0x44, -0x85, 0x68, 0xd8, 0xc8, 0x4e, 0x88, 0x5c, 0xf3, 0xe6, 0xcd, 0x73, 0xf9, -0x32, 0x7e, 0x38, 0x12, 0x72, 0xf2, 0x1d, 0xb3, 0x1f, 0xad, 0xd8, 0x95, -0x12, 0x72, 0x09, 0x04, 0x15, 0x2e, 0x3a, 0x2b, 0x3b, 0x67, 0x9d, 0x0a, -0xab, 0x02, 0x95, 0x18, 0xd0, 0x5e, 0x8a, 0x0a, 0xa6, 0xad, 0x10, 0x52, -0xb1, 0xcb, 0x5e, 0x15, 0x96, 0xa5, 0x7c, 0xe6, 0x30, 0xfb, 0xd1, 0x78, -0xc8, 0x58, 0x3b, 0x2e, 0xbd, 0xf4, 0x52, 0x0c, 0x71, 0xa8, 0xe0, 0x10, -0xbc, 0x92, 0xa3, 0x2e, 0xa2, 0x02, 0x7e, 0xc1, 0x27, 0x78, 0x87, 0x30, -0x0a, 0x18, 0x0a, 0xea, 0xb5, 0x7e, 0x71, 0x52, 0x93, 0x5e, 0x8e, 0x9b, -0xbe, 0xa8, 0x8c, 0x77, 0x63, 0xd8, 0x4d, 0xcb, 0x67, 0xb1, 0x7c, 0x64, -0x41, 0xc1, 0x5e, 0x87, 0x32, 0xb8, 0x8d, 0x22, 0x21, 0xd8, 0xcb, 0x5b, -0x96, 0x66, 0x6e, 0xfa, 0xc2, 0x99, 0xdf, 0x4b, 0xa7, 0x6d, 0x9c, 0xe2, -0xb0, 0x0b, 0x14, 0x0c, 0xd8, 0x05, 0xc4, 0x0f, 0x04, 0xf0, 0x7f, 0xbb, -0x24, 0x28, 0x41, 0x85, 0xd2, 0x28, 0xc0, 0x4d, 0xdf, 0xbe, 0x7d, 0x1b, -0x34, 0x68, 0x20, 0x17, 0xbb, 0xb8, 0x44, 0xe5, 0x40, 0x82, 0xe7, 0x11, -0x8a, 0xf1, 0x47, 0x7c, 0x2a, 0xdf, 0xc5, 0xad, 0x64, 0x20, 0x85, 0xe5, -0xee, 0x50, 0x51, 0x0f, 0x75, 0xd3, 0x17, 0x3a, 0xc7, 0xe8, 0xde, 0xbd, -0x3b, 0x6e, 0x19, 0xd8, 0x85, 0x52, 0xbb, 0x89, 0x0d, 0xb9, 0x88, 0x0a, -0xf0, 0x21, 0x8c, 0x02, 0x23, 0xee, 0xd3, 0x4f, 0x3f, 0x5d, 0x46, 0x00, -0xab, 0x68, 0xc1, 0xc9, 0x72, 0x75, 0xa2, 0x12, 0x76, 0x45, 0x11, 0x4d, -0x24, 0x00, 0x1e, 0x92, 0xd6, 0x8e, 0xb3, 0x67, 0xcf, 0x62, 0x8f, 0x42, -0xbb, 0x80, 0xf8, 0x81, 0x00, 0x61, 0x54, 0x17, 0x51, 0x01, 0x3e, 0xc4, -0xf4, 0x84, 0xf8, 0xb4, 0x72, 0xe5, 0xca, 0xd2, 0x4b, 0xd0, 0x51, 0x42, -0x69, 0x99, 0xa2, 0xe0, 0x89, 0x82, 0xc7, 0xde, 0x0a, 0x68, 0xca, 0xf7, -0xa2, 0x45, 0x8b, 0x70, 0xc0, 0x2b, 0x2b, 0x2d, 0x32, 0x55, 0x29, 0x2a, -0xd0, 0xc1, 0xc1, 0x0a, 0xe2, 0x13, 0xba, 0x79, 0x29, 0x2a, 0x50, 0xde, -0x43, 0x09, 0x15, 0xf6, 0x56, 0x24, 0xfa, 0x44, 0xd1, 0x15, 0x80, 0xb0, -0x7f, 0x38, 0x3a, 0x77, 0xee, 0x8c, 0xfb, 0x42, 0x74, 0x6e, 0x4c, 0x4d, -0xa5, 0xa8, 0x80, 0x6b, 0x88, 0x9e, 0x4d, 0x8c, 0x53, 0x4e, 0x4e, 0x4e, -0x29, 0x2a, 0xb0, 0x6a, 0x45, 0x57, 0x30, 0xba, 0x02, 0xe1, 0xb7, 0x02, -0x10, 0xf6, 0x0f, 0x07, 0x21, 0x21, 0x98, 0x68, 0x11, 0xa2, 0x20, 0x7e, -0x74, 0x6e, 0x42, 0xe2, 0x2f, 0xf2, 0x0a, 0xf0, 0x81, 0x23, 0x03, 0x85, -0x03, 0x3e, 0x52, 0x26, 0xc6, 0x09, 0x73, 0x6f, 0xf8, 0xad, 0x48, 0xf4, -0x89, 0xa2, 0x2b, 0x00, 0x61, 0xff, 0x70, 0x40, 0xf0, 0x44, 0x66, 0x8a, -0x25, 0x0a, 0xc6, 0x50, 0x06, 0x15, 0xe2, 0xcf, 0x26, 0x3e, 0xa4, 0x8c, -0xaa, 0x1d, 0x5d, 0xbe, 0xe8, 0x0a, 0x84, 0xe5, 0x0a, 0xe0, 0x83, 0xd6, -0x8e, 0x4f, 0x3e, 0xf9, 0x04, 0xd5, 0x02, 0xe2, 0x87, 0x31, 0x44, 0x51, -0x11, 0xd5, 0x43, 0x22, 0x78, 0x05, 0x34, 0x54, 0x7c, 0xfc, 0xf1, 0xc7, -0xd6, 0xa8, 0x10, 0x97, 0x36, 0x3a, 0x47, 0x94, 0x57, 0x44, 0x85, 0xc6, -0x88, 0x58, 0x01, 0x8d, 0xd0, 0x3f, 0xfa, 0xe8, 0x23, 0xa2, 0xfe, 0x20, -0x7e, 0xc4, 0x25, 0x12, 0x7d, 0x4b, 0xf5, 0x8a, 0x28, 0x2a, 0x22, 0x82, -0x14, 0xc2, 0x52, 0x1c, 0xf2, 0xef, 0xa1, 0xec, 0xa3, 0x82, 0xb4, 0xa6, -0x28, 0xaf, 0x88, 0xc2, 0x23, 0x22, 0x56, 0x20, 0x8a, 0x8a, 0x88, 0x78, -0xcd, 0xfe, 0x6d, 0x99, 0x11, 0x7b, 0x55, 0x14, 0x15, 0x21, 0x87, 0x8a, -0xa4, 0x6d, 0xdf, 0xe5, 0xed, 0xf8, 0x47, 0xfe, 0xce, 0xcf, 0x5b, 0xee, -0xfc, 0xac, 0x5d, 0xc9, 0x6f, 0x46, 0x6e, 0x3c, 0x5d, 0x74, 0xed, 0xb1, -0x76, 0x57, 0xec, 0x6e, 0x3c, 0x73, 0x6b, 0xdb, 0xcb, 0x77, 0xf7, 0xbf, -0xe6, 0xe8, 0x98, 0xe2, 0x73, 0xfc, 0x35, 0xe4, 0x9e, 0xab, 0x0a, 0x4d, -0x58, 0x43, 0xc5, 0x87, 0x1f, 0x7e, 0x28, 0xd1, 0x50, 0xd6, 0x7a, 0x45, -0x54, 0x82, 0xaa, 0x94, 0xd7, 0x96, 0xbd, 0xfd, 0xeb, 0x56, 0x25, 0x9f, -0x8e, 0xdc, 0x74, 0xa6, 0xdf, 0xc2, 0xcd, 0x1d, 0x47, 0xce, 0x6a, 0xd4, -0xa6, 0x73, 0x66, 0xcd, 0xc6, 0xce, 0xcc, 0x3c, 0x67, 0x7a, 0x96, 0x33, -0xbd, 0x86, 0x33, 0xad, 0x46, 0x62, 0x52, 0x7a, 0x62, 0x52, 0x9a, 0xfe, -0xe3, 0x4c, 0xad, 0x96, 0xde, 0xb0, 0x43, 0xcf, 0x79, 0x1b, 0xda, 0xee, -0xfe, 0x2c, 0x67, 0xc7, 0x3f, 0x2b, 0x65, 0xda, 0xa1, 0x7d, 0x53, 0xaf, -0xbc, 0x82, 0x42, 0x54, 0x84, 0x7b, 0x10, 0x20, 0x15, 0x45, 0x45, 0x05, -0xbf, 0x69, 0xf6, 0xfb, 0xa1, 0xab, 0x8f, 0xd6, 0xef, 0x50, 0xe4, 0x88, -0x4b, 0x8a, 0x8b, 0x89, 0x4b, 0x75, 0x26, 0x55, 0x4f, 0x4d, 0xcd, 0xcd, -0xcc, 0xa8, 0x59, 0x3d, 0xb3, 0x65, 0x7e, 0xe3, 0x3e, 0xdd, 0xba, 0xf6, -0xec, 0x5c, 0xd8, 0xbf, 0x57, 0xcf, 0x99, 0xd3, 0xa6, 0x5e, 0x36, 0xe3, -0xd2, 0x39, 0xda, 0xcf, 0x88, 0x41, 0x83, 0xb2, 0x33, 0xd2, 0x12, 0x1c, -0x8e, 0xd8, 0xe4, 0x8c, 0x66, 0x43, 0x66, 0x8d, 0xdd, 0xf9, 0x74, 0x93, -0xdd, 0x5f, 0x56, 0xf0, 0xe4, 0x43, 0xfb, 0x76, 0x5e, 0x51, 0x81, 0x6f, -0x1b, 0x1b, 0x54, 0x14, 0x15, 0x15, 0xf6, 0x9a, 0xb3, 0x77, 0x7c, 0xdd, -0x66, 0xd7, 0xff, 0xf5, 0x59, 0xbc, 0x23, 0x31, 0xaf, 0x80, 0xb7, 0x93, -0x93, 0x99, 0xd1, 0xbd, 0xb0, 0x70, 0xce, 0xcc, 0x99, 0xc5, 0x5b, 0xb6, -0x3c, 0xfa, 0xc8, 0x23, 0xd4, 0xaa, 0x81, 0xa1, 0x4b, 0x45, 0x19, 0x55, -0xf5, 0x47, 0x2f, 0xfd, 0x22, 0xb5, 0x61, 0x5e, 0x7d, 0xf5, 0xd5, 0xe5, -0x4b, 0x97, 0xb6, 0x6d, 0xde, 0x3c, 0x35, 0x01, 0x74, 0xc4, 0xa5, 0x34, -0xea, 0x58, 0xb4, 0x62, 0x5f, 0xc1, 0x9e, 0xbf, 0x55, 0xd8, 0x53, 0x84, -0xf6, 0x8d, 0xa2, 0xa8, 0xa8, 0x3a, 0xef, 0xaf, 0xf1, 0xce, 0xcf, 0x47, -0x6f, 0x7f, 0xa2, 0xdd, 0xa5, 0x37, 0x26, 0x64, 0xd6, 0xe2, 0xbd, 0x34, -0xa8, 0x95, 0x37, 0x7d, 0xca, 0x94, 0xfb, 0xcf, 0x9c, 0x81, 0xd0, 0xa5, -0x18, 0x99, 0xd4, 0x2f, 0x92, 0x72, 0x72, 0x52, 0xf6, 0xcb, 0xb2, 0x74, -0x9f, 0x14, 0x05, 0xe3, 0x1c, 0xb2, 0xc9, 0x6e, 0x3d, 0x78, 0x70, 0xcc, -0x88, 0x61, 0xb5, 0xb3, 0x5c, 0xb9, 0x93, 0x69, 0xf9, 0x9d, 0x07, 0xaf, -0x39, 0xd9, 0x34, 0x8a, 0x0d, 0xaf, 0x56, 0x04, 0x9b, 0x7a, 0x45, 0x94, -0x57, 0x94, 0x37, 0x78, 0x90, 0x97, 0x7a, 0x2f, 0xda, 0xe6, 0xac, 0x56, -0x93, 0x37, 0xd2, 0xb8, 0x4e, 0xad, 0x15, 0x4b, 0x97, 0x3c, 0xf9, 0xc4, -0x13, 0x52, 0xa4, 0x48, 0xca, 0x78, 0xa9, 0x42, 0x77, 0x52, 0x28, 0x52, -0xaa, 0x44, 0x4a, 0xf1, 0x52, 0xf3, 0xc1, 0x9f, 0xa4, 0x94, 0x23, 0x57, -0x71, 0xf9, 0x13, 0x8f, 0x3f, 0x3e, 0x77, 0xd6, 0xac, 0xcc, 0x24, 0x17, -0xdf, 0xc8, 0xe9, 0x36, 0x7e, 0xc8, 0xe6, 0x87, 0x0a, 0xf6, 0x44, 0x65, -0x2a, 0xf7, 0xce, 0x7b, 0xaf, 0xa8, 0x50, 0x7a, 0x05, 0xa5, 0x72, 0xa2, -0xfe, 0x8a, 0xf2, 0xc0, 0x46, 0xe3, 0x92, 0xbf, 0x0c, 0xb8, 0xf1, 0xee, -0x8c, 0x26, 0x1d, 0x59, 0xde, 0x3a, 0x35, 0xaa, 0x6d, 0xde, 0xb8, 0x01, -0xf9, 0x07, 0x3c, 0x40, 0xcd, 0x90, 0x35, 0xc4, 0x2d, 0x05, 0xed, 0x88, -0xe7, 0x97, 0x7a, 0x8f, 0xfa, 0x41, 0x42, 0x98, 0xe5, 0xc1, 0x39, 0xaa, -0xf2, 0xaf, 0x14, 0x3b, 0x65, 0xb4, 0x87, 0x1f, 0x7e, 0x78, 0x58, 0xff, -0x7e, 0xdc, 0x25, 0x21, 0x35, 0xab, 0xd7, 0xac, 0xd5, 0x51, 0x81, 0xca, -0xed, 0xdb, 0xb4, 0x8f, 0x8a, 0xa8, 0xb6, 0x5d, 0x1e, 0x90, 0x80, 0x45, -0xf4, 0xba, 0x62, 0xb3, 0x33, 0x3d, 0x9b, 0x17, 0x31, 0x79, 0xdc, 0xd8, -0x97, 0x5e, 0x7a, 0x89, 0x75, 0x86, 0x3f, 0xc0, 0x1c, 0x04, 0x0f, 0x02, -0x06, 0x21, 0x7d, 0x29, 0x65, 0x67, 0x38, 0xc8, 0xaa, 0x37, 0x1c, 0x72, -0x02, 0x27, 0xeb, 0x85, 0x80, 0xe1, 0x1e, 0x52, 0x9f, 0xe5, 0x8e, 0xdb, -0x6e, 0x6b, 0xde, 0xb0, 0x3e, 0x8d, 0x17, 0x9c, 0x19, 0xb9, 0x7d, 0xae, -0xd8, 0x5c, 0x10, 0x55, 0xc4, 0xcd, 0x02, 0x55, 0x14, 0x15, 0xe5, 0x41, -0xeb, 0x76, 0xc6, 0x84, 0x45, 0x0c, 0xda, 0xf4, 0x40, 0x6a, 0xc3, 0xb6, -0xbc, 0x82, 0x7a, 0x79, 0x39, 0xbb, 0x76, 0xee, 0x44, 0x8d, 0x56, 0x85, -0xeb, 0x04, 0x0f, 0x86, 0x4a, 0xc0, 0x52, 0x07, 0x5e, 0x6a, 0x65, 0x7b, -0x3d, 0xcc, 0x45, 0xe3, 0x55, 0x11, 0x54, 0x6e, 0xb4, 0xee, 0xc6, 0x35, -0x75, 0xb3, 0x6b, 0x50, 0xfc, 0xb4, 0x70, 0xc4, 0xcc, 0xa8, 0xa6, 0x61, -0x7c, 0x5f, 0x26, 0x54, 0xb0, 0x55, 0xa1, 0xad, 0x95, 0xc6, 0x41, 0x45, -0x25, 0x28, 0x3b, 0x24, 0xee, 0xeb, 0x39, 0x28, 0xd6, 0xfd, 0x96, 0xee, -0x89, 0x4b, 0xcb, 0x8e, 0x77, 0x38, 0xc6, 0x8e, 0x18, 0xf1, 0xc6, 0xeb, -0xaf, 0x23, 0xa0, 0x4a, 0x26, 0x24, 0x9b, 0xba, 0xd4, 0x72, 0x34, 0x14, -0x00, 0x56, 0x30, 0x30, 0x34, 0x4e, 0x70, 0xf7, 0xab, 0x3a, 0x5f, 0x6a, -0xc8, 0xc3, 0x37, 0xc0, 0x18, 0x48, 0x63, 0x70, 0xa9, 0x86, 0xfa, 0xfe, -0xfb, 0xef, 0x8f, 0x1b, 0x35, 0x0a, 0x55, 0x23, 0x21, 0x3d, 0x7b, 0xd0, -0x9a, 0x3b, 0xa2, 0x02, 0x55, 0xe9, 0x4b, 0xb4, 0x42, 0x45, 0x19, 0x2f, -0x5e, 0x14, 0x15, 0xbe, 0x52, 0xbc, 0xd7, 0xf3, 0x91, 0x9a, 0xba, 0xcf, -0xb8, 0x96, 0x95, 0xaf, 0x9d, 0x5d, 0x63, 0xc7, 0xf6, 0xed, 0x58, 0x52, -0x95, 0xc8, 0xe4, 0x0e, 0x0f, 0x36, 0x91, 0x60, 0x79, 0x9a, 0xea, 0x37, -0x22, 0x62, 0x95, 0x60, 0x43, 0x12, 0xf1, 0x29, 0xe7, 0xbd, 0x71, 0xdd, -0xba, 0x2c, 0x57, 0x75, 0xaf, 0x84, 0x3e, 0x0b, 0x36, 0x35, 0xdd, 0xfb, -0x77, 0xaf, 0x93, 0x8f, 0x88, 0x13, 0xa2, 0xa8, 0xa8, 0xe0, 0xd7, 0x9c, -0xbf, 0xeb, 0x8b, 0x4e, 0xc3, 0x2e, 0x61, 0xd9, 0xbb, 0x15, 0x76, 0x7a, -0xe8, 0xc1, 0x07, 0x61, 0xcd, 0x98, 0x50, 0x21, 0x50, 0x58, 0x84, 0x59, -0x64, 0x32, 0x74, 0x15, 0xf1, 0x1b, 0x1b, 0x0a, 0x18, 0x7a, 0x17, 0x1e, -0x10, 0x88, 0xea, 0xc2, 0x16, 0x78, 0xee, 0xd1, 0x47, 0xdb, 0xb7, 0x68, -0xce, 0x94, 0xaa, 0xb5, 0xe8, 0x35, 0xd4, 0x65, 0x9e, 0x8a, 0x78, 0xb7, -0x86, 0x4d, 0x54, 0xf0, 0xe6, 0xa2, 0x36, 0xa8, 0x00, 0xf1, 0xe3, 0xb2, -0x35, 0xad, 0xbb, 0x27, 0xbd, 0x8e, 0x8b, 0xfe, 0xa6, 0x4e, 0x9a, 0xf8, -0xfa, 0x6b, 0xaf, 0x49, 0x9a, 0xbc, 0x54, 0x55, 0x51, 0x75, 0xe1, 0xdd, -0x35, 0xda, 0xf1, 0x1b, 0x12, 0xea, 0x42, 0x77, 0xd8, 0x40, 0xa0, 0xfa, -0xc9, 0xfb, 0xef, 0xe3, 0x20, 0x67, 0x62, 0xc9, 0xd5, 0xeb, 0x0c, 0xba, -0x21, 0xe2, 0xa5, 0xa9, 0x28, 0x2a, 0x02, 0xa4, 0x75, 0x9b, 0x97, 0xa3, -0x48, 0xf4, 0x5d, 0xb6, 0x37, 0x21, 0xb5, 0x3a, 0x8a, 0xc4, 0xaa, 0x15, -0xcb, 0x55, 0xb5, 0x46, 0x81, 0x84, 0xaa, 0xef, 0x6b, 0xd9, 0x78, 0x2a, -0x70, 0x3c, 0x18, 0x1a, 0xb8, 0xe9, 0xdd, 0xaa, 0xa4, 0x15, 0x09, 0xd3, -0x80, 0x6b, 0xed, 0x2a, 0x29, 0xa9, 0x9e, 0xec, 0x8c, 0x8d, 0x4d, 0xe8, -0x35, 0xe3, 0xda, 0x88, 0x56, 0xc1, 0xed, 0xa0, 0x82, 0xbd, 0x24, 0xca, -0x2b, 0x6c, 0x52, 0xbf, 0xe5, 0x69, 0x28, 0x12, 0x5d, 0xa7, 0x5f, 0xcd, -0x52, 0xe7, 0x56, 0xcf, 0xdc, 0xb3, 0x67, 0x37, 0x11, 0x19, 0xd8, 0x9a, -0x10, 0x5d, 0x44, 0x6a, 0x92, 0xca, 0xbe, 0x86, 0xb6, 0x3a, 0xc1, 0x45, -0x82, 0xbb, 0xce, 0x86, 0x4a, 0xa0, 0x12, 0xf3, 0x14, 0xba, 0xfe, 0xb3, -0xcf, 0x3c, 0xdd, 0xb1, 0x55, 0x4b, 0xa6, 0xda, 0xa1, 0xff, 0xe8, 0xc8, -0x55, 0x33, 0x6c, 0xda, 0xa0, 0xa2, 0xa8, 0xf0, 0x1b, 0x15, 0xf9, 0x3b, -0xbf, 0xe8, 0x38, 0xdc, 0xa5, 0x48, 0xb4, 0x6b, 0xd5, 0xea, 0xec, 0x83, -0x0f, 0x4a, 0x6f, 0x04, 0x03, 0x24, 0x2a, 0x80, 0x45, 0x98, 0x61, 0x26, -0x02, 0x95, 0x00, 0x43, 0x57, 0xc1, 0xa9, 0xf5, 0x82, 0x34, 0x15, 0x17, -0xe3, 0x48, 0xa8, 0x5e, 0x7b, 0xf0, 0xda, 0x53, 0x91, 0xe8, 0x05, 0xb7, -0x8f, 0x0a, 0x5e, 0x67, 0xd4, 0xb7, 0xed, 0x2b, 0x36, 0xd0, 0xad, 0xdb, -0xf5, 0x1d, 0xc1, 0xba, 0x8d, 0x1d, 0x39, 0x52, 0x14, 0x09, 0x29, 0xfe, -0x2e, 0x65, 0xae, 0xe1, 0x12, 0x15, 0xc9, 0x22, 0xdc, 0x59, 0xa8, 0xa4, -0x13, 0x83, 0x94, 0x9d, 0x57, 0x2a, 0x78, 0xc9, 0x8e, 0x1d, 0x19, 0x49, -0xce, 0xf8, 0x94, 0xea, 0x83, 0xd7, 0xdd, 0x13, 0x71, 0xd2, 0x94, 0x1b, -0x54, 0xd0, 0xa6, 0xf9, 0x62, 0xde, 0xb6, 0x58, 0x66, 0xe1, 0x15, 0x51, -0x54, 0xf8, 0x04, 0x89, 0x0b, 0x4e, 0xba, 0x07, 0x93, 0x73, 0x1b, 0xe3, -0x29, 0x5b, 0xbc, 0x70, 0xa1, 0x2a, 0x41, 0xa7, 0xb7, 0x96, 0x52, 0x3d, -0xd7, 0x82, 0x65, 0x6b, 0xf2, 0x4f, 0xee, 0xd2, 0x7b, 0x59, 0xc1, 0x34, -0x94, 0x34, 0x75, 0xf4, 0xf0, 0xe1, 0xcc, 0xc4, 0x78, 0xc2, 0x43, 0x06, -0xaf, 0x3b, 0xdd, 0x74, 0x6f, 0x24, 0x19, 0xa6, 0xbc, 0xa2, 0x82, 0x1a, -0x38, 0xa2, 0x57, 0x44, 0x51, 0x61, 0x1f, 0x15, 0x2e, 0x48, 0x6c, 0x78, -0x20, 0x25, 0x2f, 0x1f, 0x48, 0xac, 0x5e, 0xb5, 0x8a, 0xb0, 0x6f, 0x42, -0x2d, 0x44, 0x6a, 0x32, 0xeb, 0xd6, 0xfe, 0x91, 0x72, 0x70, 0xaf, 0x32, -0x77, 0xc7, 0x95, 0xd6, 0x87, 0xb7, 0x1f, 0x3d, 0x9a, 0x99, 0x10, 0x9b, -0x98, 0x9e, 0x3d, 0x64, 0xdd, 0xe9, 0x08, 0xb2, 0xd8, 0x6a, 0xa8, 0xa0, -0xef, 0x11, 0x3b, 0x9a, 0xf8, 0xb6, 0x4b, 0x79, 0x45, 0x14, 0x15, 0xf6, -0xc1, 0x20, 0x67, 0x36, 0x72, 0x41, 0xe2, 0xbe, 0xe4, 0xbc, 0x7c, 0xcc, -0x4d, 0xab, 0xaf, 0xb9, 0x86, 0x2c, 0x08, 0xd1, 0xad, 0x61, 0xb9, 0xe2, -0x91, 0xa8, 0x60, 0xdd, 0xda, 0x26, 0x7e, 0x0c, 0xc0, 0x50, 0x9e, 0xbe, -0x13, 0xb7, 0xdf, 0x9e, 0x91, 0x18, 0x87, 0xff, 0x7b, 0xc8, 0x4d, 0xf7, -0x44, 0x0a, 0x30, 0xa2, 0xbc, 0xc2, 0x57, 0xa2, 0xf7, 0x7c, 0x3e, 0x90, -0x18, 0xb8, 0xfe, 0x8c, 0x33, 0xa7, 0x51, 0x62, 0x6c, 0xcc, 0xea, 0x6b, -0xaf, 0xc5, 0xdc, 0xa4, 0xb8, 0x84, 0x32, 0x37, 0x55, 0x8a, 0x6e, 0x6d, -0x07, 0x1b, 0xba, 0x43, 0x43, 0xfa, 0xa9, 0x4b, 0x78, 0xc8, 0x89, 0xe3, -0xb7, 0x57, 0x4b, 0x4e, 0x8a, 0x4b, 0xcd, 0xba, 0xc0, 0x31, 0x22, 0x20, -0x04, 0x3d, 0x8a, 0x8a, 0x20, 0xa2, 0x02, 0xc1, 0x49, 0x20, 0xe1, 0x04, -0x12, 0xd7, 0x5c, 0x23, 0x90, 0x90, 0xd0, 0x26, 0x03, 0x24, 0xec, 0xd0, -0x68, 0x65, 0x9d, 0x23, 0x4c, 0x43, 0x3a, 0x21, 0x0a, 0x30, 0x70, 0xbd, -0xdf, 0x7e, 0xec, 0x58, 0x46, 0x6a, 0x4a, 0x42, 0xf5, 0xba, 0xc3, 0xb6, -0x3d, 0x1e, 0xc4, 0x15, 0xab, 0xa2, 0x43, 0xd9, 0x44, 0x05, 0xc6, 0x44, -0xde, 0x71, 0xd4, 0x06, 0xe5, 0xf9, 0x2d, 0x0e, 0x5a, 0x7f, 0x26, 0x39, -0xa7, 0x21, 0xf1, 0x76, 0xc2, 0x25, 0x54, 0xdf, 0x83, 0x10, 0x82, 0x84, -0x40, 0xd1, 0xd0, 0x4b, 0x5a, 0x38, 0xc6, 0xce, 0xed, 0xdb, 0x9d, 0x09, -0xf1, 0x29, 0xb5, 0x9a, 0x35, 0xdb, 0x17, 0xee, 0xe1, 0x52, 0x36, 0xf5, -0x8a, 0x28, 0x2a, 0xbc, 0xee, 0x6a, 0xf8, 0x25, 0x92, 0x72, 0x1a, 0xa2, -0x4b, 0x5c, 0x7f, 0xed, 0xb5, 0xd2, 0x97, 0x36, 0xe4, 0xb8, 0x84, 0xd9, -0x05, 0x2e, 0x1c, 0x43, 0x74, 0x0c, 0x1e, 0xe7, 0xc6, 0xd5, 0xab, 0x49, -0xcc, 0x28, 0xec, 0x3f, 0x36, 0xcc, 0x1d, 0x7c, 0x51, 0x54, 0x78, 0x25, -0x77, 0x3b, 0x27, 0x10, 0xd0, 0xd1, 0xbe, 0xff, 0x58, 0x2c, 0x4e, 0x37, -0xac, 0xbe, 0x8e, 0x4a, 0x03, 0x66, 0xd7, 0xb5, 0xe8, 0x12, 0x95, 0x25, -0x14, 0xf9, 0x77, 0x5f, 0x5d, 0x94, 0x02, 0x18, 0xc8, 0x81, 0xd8, 0x0c, -0x16, 0x2e, 0x58, 0xe0, 0x0a, 0x6d, 0x1c, 0x3d, 0x2b, 0x9c, 0x81, 0x11, -0x45, 0x85, 0x1d, 0xa2, 0xf7, 0x7c, 0x0e, 0xea, 0x44, 0x97, 0x49, 0x57, -0xb1, 0x92, 0xf3, 0x67, 0xcf, 0x96, 0x8a, 0x5a, 0x12, 0xf3, 0xa7, 0x2c, -0x4e, 0xa1, 0x08, 0x09, 0x5d, 0x94, 0x52, 0xdd, 0xd6, 0x79, 0xa8, 0xdf, -0xfc, 0xfa, 0xd7, 0x93, 0xc6, 0x8f, 0xe7, 0x61, 0x7b, 0xcd, 0x58, 0x15, -0xb6, 0x26, 0x29, 0x3b, 0xa8, 0x40, 0xd9, 0x0a, 0x03, 0x09, 0xaa, 0xc6, -0xf6, 0xaf, 0x5a, 0x95, 0xfc, 0x8e, 0x0a, 0x4b, 0x9d, 0xa7, 0x2e, 0xaf, -0x53, 0x38, 0xb8, 0x76, 0xe1, 0x90, 0x4e, 0x13, 0xae, 0x1c, 0x7a, 0xc3, -0xed, 0xd0, 0x74, 0x80, 0xc0, 0xe8, 0xb3, 0x64, 0x8f, 0x8b, 0x4a, 0xba, -0x75, 0x7d, 0xf7, 0x9d, 0x77, 0xc5, 0x7b, 0x2d, 0x31, 0x7f, 0x12, 0xe0, -0x54, 0x65, 0x2d, 0x4e, 0x76, 0x18, 0x88, 0x21, 0x2a, 0x44, 0x14, 0x0c, -0x8a, 0xd7, 0xf7, 0xbb, 0xd0, 0x0b, 0xae, 0xef, 0x15, 0xb7, 0x84, 0x67, -0xa5, 0xa9, 0x48, 0x40, 0x85, 0xcb, 0x81, 0xb0, 0x72, 0x6f, 0x9d, 0xd6, -0xbc, 0xc8, 0xb8, 0xf8, 0x18, 0x47, 0xb5, 0x94, 0xe4, 0x5a, 0xd9, 0x35, -0xf8, 0xa9, 0x9e, 0x96, 0x8a, 0xcc, 0x13, 0x9f, 0x5a, 0xbd, 0xcf, 0xb2, -0x3d, 0x7e, 0x63, 0x03, 0xd9, 0x29, 0x3e, 0x23, 0xb7, 0x56, 0x4e, 0xce, -0x7d, 0x67, 0xce, 0x10, 0x6c, 0x2f, 0x01, 0x1d, 0xe2, 0xaa, 0x13, 0xbf, -0x84, 0x10, 0x96, 0x1d, 0x12, 0xac, 0x9a, 0xe7, 0x18, 0x34, 0x6f, 0x49, -0x57, 0x7a, 0xed, 0xd5, 0x57, 0xdb, 0x36, 0x6f, 0x06, 0xf1, 0x0c, 0x5c, -0x73, 0x47, 0x80, 0x7b, 0x4a, 0x55, 0xbc, 0x3c, 0xec, 0x51, 0x01, 0xb9, -0x77, 0x9f, 0x75, 0x43, 0x8c, 0x23, 0xa6, 0x6e, 0x4e, 0xd6, 0xb0, 0x41, -0x83, 0xae, 0x5d, 0xb5, 0xea, 0xf0, 0xa1, 0x43, 0x8f, 0x3f, 0xf6, 0xd8, -0x63, 0xe7, 0xce, 0x9d, 0x38, 0x7e, 0x9c, 0x58, 0x8c, 0x3a, 0x79, 0x79, -0x14, 0xe7, 0x2b, 0xba, 0xfa, 0x90, 0x1f, 0xaf, 0x87, 0xc1, 0xdb, 0xf5, -0x1b, 0x95, 0x10, 0x1f, 0xbf, 0x71, 0xfd, 0x7a, 0xd5, 0x3d, 0x8d, 0x0d, -0x55, 0x20, 0x11, 0xd2, 0x5c, 0xc2, 0xa0, 0x79, 0x4b, 0x1c, 0xa1, 0xc4, -0x4a, 0x49, 0xef, 0xab, 0x47, 0x1e, 0x7e, 0x38, 0x2f, 0x3b, 0xdb, 0x99, -0xd7, 0x24, 0x0c, 0x3d, 0x18, 0x26, 0x54, 0xb0, 0xdf, 0x19, 0x7d, 0xdb, -0xa1, 0x2c, 0x41, 0x9d, 0xef, 0xb3, 0xb8, 0xc4, 0x11, 0x97, 0xd0, 0xb1, -0x6d, 0x9b, 0x87, 0xce, 0x9e, 0xc5, 0x75, 0x8f, 0xc1, 0x94, 0x27, 0x44, -0xce, 0xe1, 0xc0, 0x8d, 0x8f, 0xb1, 0xe8, 0xae, 0x93, 0x27, 0x6b, 0x54, -0xaf, 0x16, 0xeb, 0x4c, 0x27, 0x92, 0xcf, 0x27, 0x60, 0xc0, 0x82, 0xba, -0x4d, 0x5d, 0xce, 0x02, 0x4e, 0x99, 0x38, 0x11, 0x75, 0x42, 0x8c, 0x4e, -0x92, 0x62, 0x0a, 0xf5, 0x84, 0x01, 0x97, 0xb0, 0xcc, 0xca, 0x10, 0x93, -0x94, 0x94, 0xd2, 0xb9, 0x74, 0xea, 0x54, 0x1e, 0x7f, 0xcc, 0x2d, 0x0f, -0xf8, 0xb4, 0x6e, 0x21, 0x70, 0xb2, 0x4d, 0x54, 0xf0, 0xca, 0x21, 0xa0, -0x90, 0xf3, 0x57, 0x60, 0x2d, 0x4d, 0xc9, 0x69, 0x50, 0xb3, 0x5a, 0x3a, -0x65, 0xc2, 0x28, 0x41, 0x29, 0xe9, 0xa0, 0xec, 0x73, 0xe0, 0x5c, 0x2a, -0x88, 0xa1, 0x2f, 0xf1, 0x25, 0x1e, 0x37, 0x2c, 0xaa, 0x5d, 0xa7, 0x2e, -0x41, 0x1c, 0xb2, 0xff, 0xce, 0xa8, 0x04, 0x1e, 0x9f, 0x9c, 0xd1, 0x3c, -0xbf, 0xd1, 0x9b, 0x6f, 0xbe, 0x29, 0x7b, 0x09, 0x56, 0x1a, 0x05, 0x89, -0xd0, 0xd5, 0xb0, 0x3d, 0x94, 0x47, 0x10, 0xef, 0x1e, 0x9c, 0x50, 0x5c, -0x7b, 0x6c, 0x28, 0xd5, 0xd3, 0xd3, 0x0a, 0x8a, 0xa6, 0xe4, 0xee, 0x0c, -0xaf, 0xd6, 0xa1, 0xf6, 0x51, 0x11, 0x82, 0x5e, 0xbc, 0xf3, 0xc3, 0xae, -0xde, 0xcb, 0x03, 0xae, 0xb9, 0xee, 0x3a, 0xf6, 0x72, 0x3d, 0x43, 0x9a, -0x97, 0x8a, 0x18, 0x20, 0x79, 0x36, 0xe0, 0xe4, 0x17, 0xbf, 0xfc, 0x65, -0xbb, 0x16, 0x2d, 0x62, 0xe3, 0x93, 0x46, 0x17, 0x3f, 0x6a, 0x13, 0x15, -0xe0, 0x27, 0xbd, 0x5e, 0x6b, 0xb0, 0x44, 0x1d, 0x5e, 0xf6, 0x0b, 0xd0, -0x25, 0xea, 0x84, 0xae, 0x61, 0x57, 0x4d, 0x3d, 0x21, 0x90, 0x59, 0x29, -0x39, 0x4a, 0x0c, 0xb5, 0xb0, 0x8b, 0xae, 0x1d, 0xda, 0xc7, 0x26, 0xa6, -0x76, 0xd8, 0x1f, 0xa8, 0xc5, 0xc2, 0xe6, 0xb2, 0x57, 0xd0, 0x69, 0x61, -0x8d, 0x8a, 0xff, 0xf6, 0x9a, 0x7c, 0x45, 0x7a, 0x8c, 0xe3, 0x47, 0xcf, -0x3d, 0xa7, 0x9a, 0xc3, 0x82, 0x07, 0x31, 0x98, 0x4a, 0x69, 0x3d, 0xd1, -0x1d, 0x71, 0x2f, 0x6c, 0xda, 0xb0, 0x3e, 0x29, 0xd1, 0xd9, 0xeb, 0xf2, -0x4d, 0x76, 0xd6, 0xdd, 0xa5, 0xab, 0xcc, 0x5c, 0xcd, 0xd2, 0x5d, 0x31, -0x7f, 0x3e, 0xb9, 0xa6, 0xe2, 0x9d, 0x30, 0xa8, 0x13, 0x81, 0x10, 0x5f, -0x95, 0xbd, 0x56, 0x69, 0xde, 0x12, 0x70, 0xce, 0x9e, 0xb2, 0x7e, 0xed, -0x8d, 0x49, 0xce, 0xa4, 0x81, 0xab, 0x0e, 0xdb, 0x59, 0xb7, 0x90, 0x39, -0xc7, 0x0a, 0x15, 0x6c, 0x01, 0x65, 0x62, 0x66, 0xa1, 0x9b, 0x10, 0x95, -0xa0, 0x5a, 0xf7, 0x18, 0xdc, 0xa5, 0x6d, 0xab, 0x77, 0xdf, 0x79, 0xc7, -0xe0, 0x43, 0x50, 0x75, 0xf5, 0x24, 0x97, 0x00, 0x76, 0xf1, 0xf4, 0x53, -0x4f, 0xa5, 0x27, 0x27, 0x35, 0xec, 0x39, 0x36, 0xa3, 0xf8, 0x5f, 0x5e, -0x5f, 0x5e, 0xd1, 0x35, 0xc7, 0x28, 0x15, 0xd3, 0xae, 0x75, 0x4b, 0x4c, -0x31, 0x12, 0x63, 0x8c, 0x9c, 0xad, 0xab, 0x13, 0x55, 0x96, 0xac, 0x03, -0x9f, 0x98, 0x00, 0x43, 0xd4, 0x6e, 0x96, 0x6e, 0xdf, 0xee, 0xdd, 0x89, -0x09, 0x89, 0x79, 0x7d, 0xa6, 0x37, 0xdb, 0xf7, 0x0f, 0xaf, 0xeb, 0x16, -0x32, 0x27, 0xd8, 0xe7, 0x15, 0x95, 0xa8, 0x57, 0xb0, 0x37, 0x0f, 0xbf, -0xe1, 0xb6, 0x3e, 0xf3, 0xd7, 0xb7, 0x1c, 0x38, 0x35, 0xaf, 0xe3, 0x90, -0xf4, 0x96, 0xfd, 0x72, 0xdb, 0x0f, 0x6c, 0x33, 0x62, 0xee, 0x80, 0x15, -0x7b, 0x47, 0x6f, 0x39, 0xeb, 0xc1, 0xa8, 0xda, 0xa0, 0x75, 0xd7, 0xbe, -0x5d, 0x3a, 0x11, 0x22, 0x2f, 0x5d, 0xc4, 0xe1, 0x0c, 0xaa, 0x6e, 0x80, -0xca, 0xcc, 0x64, 0x8f, 0x67, 0xa7, 0x87, 0x99, 0xe4, 0x66, 0xa6, 0xa7, -0xd6, 0x6c, 0xe2, 0x55, 0xe7, 0xe6, 0x76, 0x49, 0x75, 0x9a, 0x3b, 0x63, -0x1d, 0xb7, 0x1d, 0x3b, 0x26, 0xa6, 0x58, 0xb3, 0x77, 0x22, 0x70, 0xe2, -0xab, 0xb2, 0x23, 0xe8, 0x0e, 0x6f, 0xf6, 0x94, 0xdb, 0x6f, 0xbb, 0xad, -0xa0, 0x41, 0x03, 0x97, 0xef, 0x62, 0xfe, 0x3a, 0xc7, 0x96, 0xf3, 0x21, -0x43, 0xf7, 0x9e, 0xcb, 0x92, 0x57, 0x71, 0x54, 0x34, 0xdc, 0xfe, 0xa7, -0xa2, 0x1b, 0x4e, 0x12, 0x91, 0xc6, 0x3c, 0xe3, 0x1c, 0x8e, 0xba, 0x59, -0x19, 0x0d, 0x72, 0xaa, 0xd7, 0xcf, 0xae, 0xde, 0x28, 0xb7, 0x46, 0xb5, -0x24, 0xe7, 0x85, 0xc9, 0x27, 0x64, 0x36, 0xed, 0xda, 0x7f, 0xed, 0xa9, -0xc6, 0x25, 0x16, 0x8a, 0x72, 0x56, 0x41, 0x97, 0xb6, 0x4d, 0x1a, 0x52, -0x24, 0x4f, 0xdc, 0x08, 0x22, 0xe4, 0x88, 0x81, 0x48, 0x0e, 0xb1, 0xa8, -0x20, 0x09, 0x20, 0x05, 0x15, 0xf5, 0xec, 0xee, 0xcc, 0xc8, 0x69, 0xb7, -0xeb, 0x53, 0xcf, 0xaf, 0xb6, 0xfb, 0xec, 0x35, 0xdc, 0x75, 0xee, 0x65, -0x97, 0xa1, 0xbe, 0x0b, 0xd8, 0x0c, 0xde, 0x89, 0x2a, 0x4b, 0xd0, 0xc1, -0x9a, 0x98, 0xc1, 0x4a, 0x4b, 0xed, 0xf4, 0xcc, 0x78, 0x47, 0x66, 0xb3, -0x1e, 0xe1, 0xc3, 0x2e, 0xaa, 0x38, 0x2a, 0xfa, 0x5c, 0x7d, 0x30, 0x3e, -0x2d, 0x2b, 0x39, 0x3e, 0x6e, 0xc1, 0x9c, 0xcb, 0xee, 0xb8, 0xe3, 0x8e, -0x47, 0x1f, 0x7d, 0x14, 0x57, 0x03, 0xaf, 0x81, 0x9f, 0xfb, 0xef, 0xbf, -0x7f, 0xdb, 0x2d, 0xb7, 0x4c, 0x1c, 0x3d, 0x92, 0x78, 0xb5, 0xe4, 0xea, -0xb5, 0x8b, 0xae, 0x3b, 0x66, 0x6e, 0x06, 0x97, 0xd7, 0x69, 0x48, 0xad, -0x8c, 0xe4, 0xb7, 0xde, 0x7a, 0x4b, 0x95, 0x5d, 0x52, 0xda, 0xb0, 0x94, -0x61, 0x15, 0x49, 0x00, 0xc0, 0x40, 0xdf, 0x37, 0x5c, 0x77, 0x6d, 0x7c, -0x6c, 0xfc, 0x10, 0x14, 0x74, 0xf7, 0x1b, 0x49, 0xa3, 0x1d, 0x7f, 0x8e, -0xab, 0x56, 0xa7, 0x49, 0xa3, 0x86, 0x2f, 0x3c, 0xff, 0x3c, 0x8c, 0x02, -0x26, 0xa3, 0xf3, 0x9f, 0xf0, 0xb3, 0x3b, 0x79, 0x4e, 0xf5, 0x16, 0xed, -0x02, 0xe9, 0x7a, 0x68, 0xbf, 0xde, 0xce, 0xac, 0x7a, 0x93, 0x0f, 0xbc, -0x1c, 0x7e, 0xbc, 0xe2, 0x27, 0x3f, 0xf9, 0x09, 0xaa, 0xa3, 0xb5, 0xbf, -0xa2, 0x52, 0xf4, 0x0a, 0x48, 0x30, 0xb9, 0x5e, 0x2b, 0x6c, 0x7f, 0xc5, -0x5b, 0xb7, 0xfe, 0xec, 0x67, 0x3f, 0xc3, 0x8e, 0x24, 0x4d, 0x7d, 0xc4, -0xd5, 0xc0, 0x67, 0x76, 0x6b, 0xa2, 0x0f, 0x6e, 0xb9, 0x79, 0x53, 0x7a, -0x7c, 0x4c, 0xbc, 0x33, 0xad, 0xef, 0xd2, 0xbd, 0x65, 0x2b, 0x6c, 0x9f, -0x6f, 0x3f, 0x6e, 0x21, 0xb0, 0x7f, 0xe5, 0xe5, 0x97, 0xcd, 0xe1, 0xab, -0x82, 0x0a, 0xb1, 0x33, 0x8a, 0xf5, 0xfd, 0xa9, 0x27, 0x9f, 0xe4, 0xe4, -0xa6, 0xfd, 0x26, 0x64, 0xbb, 0xef, 0x25, 0x37, 0x62, 0xf3, 0x59, 0xce, -0x19, 0x3d, 0x62, 0x84, 0x54, 0x4a, 0x8e, 0x04, 0xbb, 0x93, 0x3b, 0x60, -0x28, 0xa7, 0x1e, 0xda, 0xc5, 0xfa, 0x35, 0xd7, 0xb3, 0x2c, 0x83, 0xaf, -0x3f, 0x5e, 0x6d, 0xc7, 0xb7, 0xe1, 0x00, 0x0c, 0x3b, 0xbc, 0x02, 0x92, -0xaa, 0x14, 0x54, 0x8c, 0x58, 0x7f, 0x8f, 0x90, 0x20, 0xa4, 0x4f, 0xcf, -0x2b, 0x31, 0xad, 0x4a, 0x83, 0x1f, 0x69, 0xe7, 0xc3, 0xac, 0x00, 0x09, -0x7f, 0x22, 0x8b, 0xb2, 0x76, 0x76, 0x96, 0x23, 0x3e, 0x79, 0xc0, 0xb5, -0xc7, 0xb4, 0x58, 0xce, 0xf3, 0xfd, 0xaf, 0x2a, 0x66, 0x84, 0x53, 0x77, -0xdd, 0x29, 0x4a, 0x05, 0xc2, 0x92, 0x88, 0x4f, 0x02, 0x09, 0x95, 0x5b, -0xc3, 0x9f, 0x18, 0xf0, 0xe3, 0x8f, 0x3e, 0x6a, 0x54, 0x33, 0x27, 0xb5, -0x6e, 0x2b, 0x1a, 0x70, 0x59, 0xbe, 0xda, 0xf4, 0x6d, 0xdf, 0x74, 0x9d, -0xb1, 0x3a, 0x39, 0x21, 0x61, 0xc3, 0x4d, 0x37, 0xa1, 0x87, 0x30, 0x19, -0x29, 0xd5, 0xa1, 0x7c, 0x76, 0xc1, 0x12, 0x51, 0xaa, 0xfe, 0x38, 0xba, -0x76, 0x81, 0x5c, 0xfa, 0xe4, 0xe3, 0x8f, 0xb3, 0xce, 0x2d, 0xc6, 0x2e, -0x69, 0xba, 0x37, 0x2c, 0x74, 0x6e, 0x3b, 0x36, 0xa8, 0xca, 0x42, 0x45, -0xcf, 0x59, 0xd7, 0xa7, 0x27, 0x25, 0x6d, 0xdf, 0xb6, 0x8d, 0x0a, 0x45, -0x52, 0x46, 0x89, 0x99, 0xb0, 0x3d, 0x4b, 0x23, 0x1f, 0x3e, 0x48, 0x23, -0x1f, 0xf6, 0x6c, 0xfe, 0x7a, 0xfa, 0xd4, 0xa9, 0x9c, 0x6a, 0x99, 0x8e, -0xc4, 0xf4, 0xa1, 0x1b, 0xce, 0x34, 0x3f, 0xf0, 0xb5, 0x90, 0xf5, 0xd8, -0x0d, 0xa7, 0x78, 0xc0, 0x4d, 0x37, 0xad, 0xd5, 0x2b, 0x6b, 0x28, 0xaf, -0xb3, 0xc8, 0xc7, 0xc8, 0x54, 0xbc, 0x57, 0x86, 0x02, 0x5d, 0xd3, 0x27, -0x8e, 0xc7, 0xc9, 0x3d, 0x7a, 0xf3, 0x7d, 0x96, 0xa8, 0x80, 0x77, 0xd5, -0x6c, 0xd5, 0xa3, 0x66, 0x76, 0x8d, 0x67, 0x9e, 0x7e, 0x5a, 0x58, 0xaa, -0x28, 0x2a, 0x02, 0xb3, 0xaa, 0x4f, 0xca, 0xc1, 0x9d, 0xa1, 0xee, 0xbb, -0xa0, 0x20, 0x67, 0xdd, 0xcc, 0x94, 0xcc, 0x96, 0x45, 0x1d, 0xf7, 0xff, -0x29, 0x5c, 0x79, 0x85, 0xd1, 0x32, 0x2b, 0xca, 0x28, 0xe2, 0x4a, 0x05, -0xfb, 0xb6, 0x5b, 0x14, 0x8d, 0xcf, 0xad, 0x56, 0x8d, 0x12, 0xc5, 0x22, -0xae, 0xa8, 0x1a, 0x19, 0xe2, 0x6a, 0x90, 0xa2, 0xf3, 0x20, 0x04, 0x3e, -0x20, 0x7c, 0xe3, 0xe4, 0x1d, 0x77, 0x54, 0xcb, 0x48, 0x8f, 0x4b, 0xcb, -0x19, 0xb5, 0xfd, 0xa9, 0x96, 0x87, 0x5c, 0xde, 0xd6, 0x19, 0xb7, 0xbf, -0x93, 0x54, 0xa3, 0x7e, 0xbf, 0x6e, 0x5d, 0xd8, 0xd7, 0xcd, 0xb1, 0x18, -0x3a, 0x2a, 0x18, 0x04, 0xc1, 0xac, 0xa4, 0x78, 0x1b, 0xcf, 0x38, 0x60, -0x69, 0x89, 0xa5, 0x39, 0xa5, 0xf5, 0xf6, 0x5f, 0xc5, 0x25, 0xa6, 0x76, -0x6e, 0xdf, 0x0e, 0x94, 0x72, 0x32, 0xcb, 0x22, 0x6e, 0xbb, 0x08, 0x51, -0x27, 0xcc, 0xa0, 0x92, 0xca, 0x9c, 0xbc, 0x0e, 0x56, 0x63, 0xf4, 0xe0, -0x01, 0x31, 0xe9, 0x35, 0x27, 0xed, 0x7f, 0x31, 0xcc, 0x50, 0xa1, 0xf4, -0x8a, 0xaa, 0x82, 0x8a, 0xec, 0x26, 0x9d, 0x6a, 0xe7, 0x64, 0xd3, 0xfe, -0x47, 0x59, 0x7b, 0x54, 0x21, 0x7b, 0xe9, 0xfd, 0xa3, 0x3c, 0x71, 0xb0, -0x0e, 0x68, 0x94, 0xcd, 0x9b, 0xc8, 0xbf, 0x14, 0xbc, 0x4a, 0xd9, 0x0d, -0xc6, 0xec, 0x7b, 0x09, 0xca, 0x6e, 0x75, 0xeb, 0xb7, 0xd9, 0xed, 0x07, -0xa7, 0xc6, 0x38, 0x7e, 0xf9, 0x8b, 0x5f, 0x18, 0xb2, 0x1d, 0x54, 0x8c, -0x34, 0xf2, 0x0f, 0xc4, 0x2d, 0x7d, 0x80, 0x88, 0x7b, 0x05, 0x15, 0x9d, -0xa7, 0x5f, 0x63, 0x89, 0x8a, 0x61, 0xd7, 0xdf, 0x96, 0x98, 0x98, 0x74, -0xf9, 0xbc, 0xb9, 0x34, 0x32, 0x05, 0xa5, 0x00, 0x49, 0x44, 0xb2, 0x88, -0x45, 0x85, 0x6c, 0x2b, 0x12, 0x00, 0xb2, 0xe1, 0xa6, 0xb5, 0x2c, 0xdd, -0xf0, 0x75, 0xa7, 0xa2, 0xa8, 0x70, 0xdf, 0x6f, 0xcf, 0x6b, 0x9b, 0x4a, -0x1b, 0x27, 0x64, 0x17, 0x14, 0xd6, 0xce, 0xce, 0x7e, 0xf9, 0xa5, 0x97, -0x70, 0x95, 0x88, 0x5b, 0x40, 0x12, 0xa0, 0x95, 0x5d, 0x55, 0xb2, 0x61, -0x54, 0xb3, 0x12, 0x91, 0xac, 0xf0, 0x2b, 0x61, 0xc3, 0x4d, 0xaf, 0x55, -0x30, 0xee, 0xd0, 0x6b, 0x10, 0x77, 0xc3, 0x49, 0xab, 0xe3, 0x1c, 0x31, -0xc7, 0x8f, 0x1d, 0x95, 0x5a, 0x7d, 0x7a, 0x28, 0xab, 0x2e, 0x03, 0x70, -0x21, 0x12, 0x1a, 0xa2, 0x11, 0x41, 0x1c, 0xf5, 0xfb, 0x4d, 0x4d, 0x2d, -0xfe, 0xce, 0xfc, 0x76, 0x7b, 0x5d, 0x76, 0x43, 0x72, 0x42, 0xe2, 0xf6, -0xe2, 0x62, 0xa2, 0x0c, 0x81, 0x10, 0xa8, 0x10, 0xa5, 0x22, 0x92, 0x51, -0xc1, 0xb3, 0xb3, 0xaa, 0x2e, 0xc7, 0xc5, 0x31, 0x3c, 0x9b, 0x8e, 0x5e, -0x4b, 0xf7, 0xa6, 0x16, 0x7f, 0x1f, 0xf2, 0xc0, 0xd0, 0x84, 0xa2, 0x2a, -0xc7, 0x2b, 0x5a, 0x0d, 0x9c, 0x96, 0x9d, 0x99, 0x79, 0xe6, 0xde, 0x7b, -0x15, 0x2a, 0xf4, 0xd8, 0x3b, 0x61, 0xdf, 0x52, 0x0a, 0x52, 0xf1, 0x0d, -0x5e, 0x0f, 0x1a, 0xf0, 0xb6, 0x2d, 0x5b, 0x78, 0xae, 0xb4, 0x3a, 0xcd, -0x78, 0x3d, 0x6d, 0x6f, 0x7e, 0xc1, 0x99, 0x52, 0x7d, 0xcc, 0xb0, 0x21, -0xe6, 0xba, 0xdf, 0x4a, 0x65, 0x14, 0x37, 0x2d, 0xc0, 0xc3, 0x57, 0x5d, -0x37, 0x2b, 0x3d, 0xa3, 0x79, 0x9f, 0xfa, 0xbb, 0xbf, 0x32, 0xbf, 0xda, -0xd6, 0x03, 0xa7, 0xa4, 0x26, 0xc4, 0x3d, 0xfc, 0xd0, 0x43, 0x48, 0x74, -0x12, 0xf8, 0xa4, 0x47, 0x8c, 0x07, 0x57, 0x6a, 0x0f, 0x89, 0xd1, 0x64, -0x01, 0xc5, 0xe7, 0x43, 0xdd, 0x30, 0xd6, 0xbc, 0xe5, 0x9c, 0xad, 0xf5, -0x77, 0x5d, 0x54, 0xea, 0x42, 0x18, 0x1b, 0x55, 0x19, 0x15, 0xbd, 0x66, -0x5d, 0x9f, 0x91, 0x9c, 0xbc, 0x7b, 0x67, 0x89, 0xa0, 0x02, 0xc2, 0x35, -0x53, 0xb6, 0x01, 0x1b, 0x12, 0xe0, 0x04, 0x36, 0x36, 0xaf, 0x5f, 0xc7, -0xa3, 0x25, 0xd7, 0x2a, 0xe8, 0xb0, 0xed, 0xf5, 0x6a, 0x2d, 0xfb, 0xd4, -0xce, 0xaa, 0xfe, 0xa7, 0x3f, 0xfe, 0xd1, 0xc0, 0x28, 0x14, 0x2a, 0x44, -0x06, 0x40, 0x6f, 0xf9, 0xe0, 0x27, 0x3f, 0xe9, 0xd4, 0xa2, 0x69, 0x52, -0x9d, 0xd6, 0xad, 0xf7, 0xff, 0xd5, 0xf4, 0x52, 0xcf, 0xe7, 0x36, 0xef, -0x9c, 0x16, 0x1f, 0xfb, 0xd6, 0x9b, 0x6f, 0x22, 0xd1, 0xa1, 0xa8, 0xc0, -0x5e, 0xa2, 0xa8, 0x10, 0x9f, 0x0f, 0xa8, 0x38, 0x7d, 0x8f, 0xcb, 0x60, -0x98, 0xd7, 0xe7, 0xd2, 0x56, 0x7b, 0x7d, 0x88, 0x3b, 0xae, 0xa2, 0xc8, -0xa9, 0xca, 0xa8, 0x18, 0xb9, 0xc1, 0xb5, 0xd0, 0x93, 0x2f, 0x64, 0x2f, -0xc8, 0xde, 0xac, 0x24, 0x28, 0x95, 0xd0, 0x23, 0x94, 0xad, 0xb0, 0xa1, -0x58, 0x07, 0x1b, 0x58, 0xc9, 0xb6, 0x6d, 0x88, 0x52, 0x49, 0xb5, 0x5b, -0xe4, 0x76, 0x9b, 0x90, 0x91, 0x96, 0x7e, 0xcf, 0xdd, 0x77, 0xab, 0xab, -0xd4, 0x4e, 0x2c, 0x17, 0x8a, 0x0c, 0x80, 0x44, 0x84, 0x57, 0xa4, 0x5f, -0xd7, 0xc2, 0x84, 0x9c, 0xfc, 0xc2, 0x03, 0x7f, 0x36, 0xa3, 0xa2, 0x56, -0xa7, 0xc1, 0x69, 0x09, 0xf1, 0x4f, 0x3f, 0xf9, 0xa4, 0x8e, 0x52, 0xee, -0x18, 0xd2, 0xa9, 0x76, 0x81, 0x30, 0x25, 0x15, 0x13, 0xc5, 0x7b, 0xf9, -0xf9, 0xcf, 0x7e, 0xd6, 0xbb, 0x4b, 0xa1, 0xc3, 0x99, 0xd9, 0x61, 0x8f, -0xb5, 0x5d, 0xbb, 0x8a, 0x02, 0xc0, 0x52, 0x92, 0xaf, 0xca, 0xa8, 0x20, -0xe2, 0x28, 0xbe, 0x46, 0xfd, 0x82, 0xc6, 0x8d, 0x70, 0xc3, 0xa1, 0xdd, -0x4a, 0x4e, 0x8f, 0xb2, 0x84, 0x8a, 0xba, 0xac, 0x1f, 0x0a, 0x1e, 0x22, -0x59, 0x71, 0x1c, 0xdc, 0xb7, 0x2f, 0x39, 0x31, 0x21, 0x21, 0xa7, 0x31, -0xf0, 0x58, 0x30, 0x67, 0x8e, 0x39, 0x59, 0x54, 0x99, 0xa1, 0x24, 0x93, -0x06, 0xe3, 0xec, 0xc8, 0x41, 0xfd, 0x1d, 0x58, 0xb1, 0x76, 0xff, 0xc8, -0xfc, 0x16, 0x3b, 0x8c, 0x5f, 0x94, 0x92, 0x90, 0x70, 0xc7, 0xed, 0xb7, -0xe3, 0xac, 0x90, 0x6c, 0x0a, 0xe1, 0x15, 0x11, 0x8e, 0x0a, 0xd9, 0x53, -0xe0, 0xb4, 0x57, 0xcc, 0x9d, 0x03, 0x39, 0x4d, 0xd8, 0xfd, 0x4c, 0x28, -0x01, 0x20, 0xe4, 0x50, 0xc1, 0xe2, 0x76, 0x9b, 0xe9, 0x72, 0x9a, 0x2e, -0xba, 0xe2, 0x0a, 0xc9, 0xff, 0x14, 0x85, 0x5b, 0x79, 0xe2, 0x74, 0x2a, -0x57, 0xf0, 0x50, 0x1e, 0x3a, 0xe1, 0x03, 0xc7, 0x8f, 0x1d, 0x4b, 0x49, -0x4e, 0x66, 0x90, 0xee, 0xdd, 0xba, 0x99, 0xc9, 0x57, 0xed, 0x76, 0xd0, -0x37, 0x0a, 0x09, 0x72, 0xda, 0xbc, 0x79, 0x73, 0x39, 0x39, 0xa7, 0xeb, -0xb8, 0x2e, 0x07, 0x8c, 0xa6, 0xf7, 0x01, 0x8b, 0x8b, 0x93, 0x13, 0x9c, -0x84, 0x99, 0xe0, 0x4f, 0x14, 0x88, 0x8a, 0xea, 0x1f, 0xc9, 0xa8, 0x50, -0x0e, 0x9f, 0x4f, 0x3e, 0xfe, 0xb8, 0x67, 0xa7, 0x8e, 0xb1, 0xd5, 0xea, -0xb5, 0xdb, 0xf3, 0xc7, 0x08, 0x42, 0x05, 0xfb, 0x68, 0x05, 0xfb, 0x2b, -0x58, 0x5c, 0x42, 0x9b, 0x92, 0x6a, 0x35, 0x75, 0xc6, 0x39, 0x76, 0xef, -0xdc, 0x29, 0x2e, 0x02, 0xdd, 0x9d, 0x6c, 0x69, 0xfc, 0x31, 0xf3, 0x90, -0x07, 0xce, 0x9c, 0x69, 0xdb, 0xa2, 0xc5, 0x94, 0x09, 0x13, 0xcc, 0xd2, -0x82, 0x21, 0x02, 0x94, 0xed, 0xff, 0x9d, 0x77, 0xde, 0x19, 0x3b, 0x7c, -0x18, 0x4f, 0xda, 0x60, 0xda, 0x86, 0x91, 0x25, 0xcf, 0xea, 0x11, 0x6f, -0x63, 0x36, 0x9e, 0x72, 0x26, 0x26, 0xaf, 0x58, 0xba, 0x44, 0xcc, 0xb2, -0x6c, 0x90, 0x11, 0xe8, 0xd5, 0xd6, 0xd7, 0x50, 0xf6, 0x1d, 0xd9, 0x50, -0x8e, 0x1e, 0x39, 0xe2, 0x72, 0x6f, 0x8f, 0x59, 0x98, 0x53, 0x12, 0xfa, -0x79, 0x79, 0x55, 0x59, 0x82, 0x92, 0x2d, 0x67, 0xc0, 0xf5, 0x27, 0x62, -0x93, 0x32, 0x32, 0x52, 0x92, 0xb0, 0xfd, 0x89, 0x7b, 0x5b, 0xbc, 0x16, -0xaa, 0x82, 0x86, 0x1d, 0xc9, 0x98, 0xee, 0xbd, 0xc4, 0x4e, 0x79, 0x0d, -0xe9, 0x91, 0x9e, 0x26, 0x08, 0x6c, 0x05, 0x8d, 0x1a, 0x39, 0x62, 0x9c, -0x54, 0xa8, 0x4f, 0xab, 0xd3, 0xbc, 0xf7, 0x9c, 0x35, 0x82, 0x8d, 0xe6, -0xfb, 0xbf, 0x8a, 0x4f, 0x4c, 0xeb, 0xd7, 0xb3, 0x87, 0xa8, 0xfe, 0x32, -0x87, 0x08, 0x37, 0xcb, 0xb2, 0x02, 0xac, 0xc3, 0x2f, 0x7f, 0xfe, 0xf3, -0xb6, 0x2d, 0x9a, 0x51, 0x14, 0x62, 0x5c, 0xf1, 0x23, 0x21, 0xcf, 0x28, -0xa0, 0x3a, 0xaf, 0xa8, 0xa0, 0x1f, 0x3d, 0x22, 0x63, 0xa5, 0xf8, 0xb6, -0x65, 0x7d, 0xc9, 0x05, 0xed, 0x7f, 0xcd, 0x61, 0x80, 0x91, 0x95, 0x96, -0x72, 0xef, 0xe9, 0xd3, 0xc8, 0x51, 0x12, 0xbe, 0x11, 0xac, 0x5c, 0x50, -0x61, 0x17, 0x22, 0x09, 0xa8, 0x66, 0x3f, 0x84, 0x99, 0x14, 0xf5, 0xea, -0x31, 0x6e, 0xd8, 0x90, 0x7a, 0xd9, 0x59, 0x78, 0x30, 0x52, 0x72, 0x1b, -0x4d, 0x3b, 0x84, 0x5b, 0xf0, 0xbf, 0x19, 0x4d, 0xbb, 0xd7, 0xcd, 0xcd, -0x79, 0xe7, 0xad, 0xb7, 0x0c, 0x1a, 0x8e, 0x1d, 0x64, 0x86, 0xd3, 0x39, -0x06, 0x1f, 0xe8, 0xfa, 0x1b, 0x5d, 0xd1, 0xf5, 0x03, 0x96, 0xec, 0x08, -0x93, 0x60, 0x72, 0xfb, 0xa8, 0xa8, 0x14, 0x09, 0x4a, 0x80, 0x41, 0x26, -0x50, 0xff, 0xab, 0x0f, 0xc7, 0x3b, 0x53, 0xa9, 0x4b, 0xf0, 0xe8, 0xc3, -0x0f, 0xab, 0xca, 0x7c, 0xc1, 0x12, 0x60, 0x74, 0x39, 0x4a, 0x0c, 0xbb, -0x12, 0x48, 0xc2, 0x8d, 0xd0, 0x67, 0x56, 0x2e, 0x5d, 0xca, 0x2a, 0x55, -0x6b, 0xd5, 0x8f, 0x99, 0xd4, 0x9f, 0xb6, 0x3e, 0x29, 0x36, 0x76, 0xdb, -0xe6, 0xcd, 0x51, 0xff, 0x1d, 0x8b, 0x26, 0x5e, 0xd4, 0x47, 0x1e, 0x7e, -0x28, 0x3d, 0xd6, 0x91, 0x56, 0xb7, 0x45, 0x8b, 0x83, 0xff, 0x0c, 0x07, -0x46, 0x61, 0x9f, 0x57, 0x20, 0xd3, 0x57, 0x22, 0x2a, 0x58, 0xeb, 0x26, -0xbb, 0xfe, 0xda, 0x7f, 0xc5, 0x81, 0xf8, 0x78, 0x67, 0xc3, 0x5a, 0x79, -0x78, 0xa0, 0x95, 0x3d, 0x4a, 0x64, 0x98, 0x00, 0xb7, 0x61, 0xd9, 0xf9, -0x24, 0x84, 0x16, 0xa4, 0xe9, 0xce, 0xf2, 0x0b, 0x41, 0x56, 0x7f, 0x99, -0x77, 0xd9, 0x6c, 0x80, 0xd1, 0x74, 0xe1, 0xa1, 0xf6, 0xc5, 0xaf, 0xf1, -0x61, 0x70, 0xff, 0xa2, 0xaf, 0xbf, 0xfa, 0x2a, 0x2a, 0x3e, 0xb1, 0x02, -0xef, 0xbc, 0xfd, 0x76, 0xa3, 0x5a, 0x79, 0x89, 0xc9, 0x19, 0xae, 0x18, -0x7b, 0x1b, 0xf1, 0x0a, 0xa1, 0x71, 0x8e, 0x89, 0x57, 0xb0, 0x39, 0x96, -0x89, 0x83, 0x12, 0x09, 0xaa, 0xd2, 0x51, 0xe1, 0x02, 0xc6, 0xee, 0x2f, -0x8b, 0x96, 0xee, 0x66, 0xc2, 0xcd, 0x1a, 0x36, 0x78, 0xf1, 0x85, 0x17, -0xa4, 0x29, 0x44, 0xb0, 0x02, 0x2e, 0x14, 0x30, 0x54, 0xb3, 0x5d, 0x09, -0xb2, 0x92, 0x6a, 0x20, 0xcf, 0xff, 0xe8, 0x47, 0x8d, 0x6a, 0xe6, 0xa6, -0xb7, 0x19, 0xd8, 0xf9, 0xf0, 0xff, 0xd4, 0xec, 0x7f, 0x99, 0xab, 0xaf, -0xd7, 0x35, 0xd7, 0x70, 0x42, 0x24, 0x5b, 0x9f, 0xd8, 0x44, 0xb0, 0xc5, -0xf5, 0xea, 0xda, 0xc5, 0xe1, 0x88, 0x29, 0x58, 0x78, 0xb0, 0xe5, 0xa1, -0xb0, 0xc8, 0xac, 0x10, 0x60, 0x87, 0x10, 0x2a, 0x98, 0x2e, 0x65, 0xea, -0xfa, 0x2d, 0xde, 0xce, 0x9c, 0xdb, 0xb7, 0x6c, 0xf1, 0xce, 0xdb, 0xef, -0x04, 0xdd, 0x36, 0xaa, 0x63, 0x43, 0x02, 0x49, 0xc4, 0x59, 0x4e, 0xdc, -0x78, 0xcf, 0xce, 0x85, 0xb1, 0xb9, 0x4d, 0x3a, 0x1f, 0xfe, 0x75, 0xe1, -0xde, 0x8f, 0xe3, 0x6b, 0x36, 0x6f, 0x96, 0xdf, 0xf0, 0xa3, 0x0f, 0x3f, -0x8c, 0x70, 0x54, 0x48, 0x95, 0xb4, 0x9a, 0xfd, 0x66, 0xb5, 0xdb, 0xf2, -0x72, 0x93, 0xf9, 0x7b, 0x87, 0xdd, 0x74, 0x4f, 0xb3, 0xfd, 0x16, 0x91, -0x32, 0xa1, 0xc1, 0x1f, 0x74, 0x46, 0xa7, 0xa1, 0x82, 0xf4, 0x66, 0x82, -0x41, 0xab, 0x2e, 0xaf, 0x90, 0xc5, 0x25, 0xa9, 0xa8, 0xdf, 0xc2, 0xcd, -0x4c, 0xbb, 0x47, 0x61, 0x21, 0x11, 0xdd, 0x2a, 0xe6, 0x22, 0x40, 0x21, -0xca, 0xb2, 0x4e, 0x9e, 0x08, 0x54, 0x02, 0x8f, 0x59, 0xd3, 0xa7, 0x73, -0xd3, 0xdc, 0x6e, 0xe3, 0x5b, 0x5d, 0xff, 0x50, 0x4a, 0xe3, 0xce, 0xb9, -0x19, 0xa9, 0xaf, 0xbc, 0xf4, 0x52, 0x10, 0x6f, 0x1a, 0x5a, 0x43, 0xc9, -0xf6, 0x41, 0xa7, 0x0e, 0xd6, 0xc4, 0x59, 0xbd, 0x4e, 0x52, 0x56, 0x9d, -0xb8, 0x38, 0x67, 0x7c, 0x42, 0x4a, 0x52, 0xf5, 0x5a, 0x5d, 0xc7, 0xce, -0x29, 0x9b, 0x11, 0x59, 0xbe, 0x21, 0xa4, 0xe5, 0x02, 0xb9, 0xd0, 0xe2, -0x15, 0xb2, 0x04, 0x18, 0x3a, 0xfa, 0x2e, 0xd8, 0xc0, 0xcc, 0x47, 0x0c, -0x1a, 0x88, 0x49, 0x2a, 0x58, 0x42, 0x94, 0x01, 0x18, 0xca, 0x36, 0x25, -0x32, 0x15, 0x62, 0xe4, 0xcc, 0x69, 0x53, 0x29, 0xa0, 0x90, 0x10, 0x9f, -0x84, 0x55, 0xea, 0xea, 0x65, 0xcb, 0x22, 0x96, 0x51, 0xb0, 0x50, 0x82, -0x0a, 0x38, 0xe9, 0xe3, 0xe7, 0xce, 0x0d, 0xee, 0xd7, 0x67, 0xdc, 0xb0, -0x61, 0x1b, 0xd6, 0xae, 0x59, 0xb5, 0x6c, 0x69, 0x9f, 0x2e, 0x85, 0x29, -0xf1, 0x71, 0xce, 0xcc, 0xdc, 0xf1, 0x7b, 0x9f, 0x2d, 0x17, 0x7a, 0xad, -0x18, 0xd5, 0xc5, 0x0a, 0x15, 0x50, 0x5a, 0x69, 0x3d, 0xa8, 0xaa, 0xa3, -0x57, 0xe8, 0xab, 0xdc, 0xf5, 0xd0, 0xe7, 0xd5, 0x5a, 0xf6, 0x4d, 0x74, -0x38, 0x08, 0xbf, 0x29, 0x0f, 0x54, 0xa8, 0x17, 0x2f, 0xd8, 0x50, 0x07, -0x89, 0x4d, 0x57, 0x2e, 0x58, 0xf0, 0xf8, 0xa3, 0x8f, 0x02, 0x95, 0xd0, -0xda, 0xdd, 0x83, 0x3e, 0x5b, 0xdd, 0xa2, 0xad, 0xea, 0xcd, 0x11, 0x60, -0x7f, 0xf3, 0x86, 0x0d, 0xa9, 0x71, 0x8e, 0xd4, 0x5a, 0x05, 0x4d, 0x76, -0x9b, 0x23, 0x2c, 0x43, 0x84, 0x6f, 0xd8, 0xe7, 0x15, 0x84, 0xe8, 0x55, -0xbc, 0x6f, 0xdb, 0x72, 0xbf, 0x41, 0x88, 0xea, 0x7f, 0x55, 0x89, 0x2b, -0x88, 0xa3, 0x73, 0x21, 0xbe, 0xb9, 0x0a, 0x08, 0xbb, 0x50, 0xfe, 0xf2, -0xa0, 0xd3, 0x56, 0x48, 0x0f, 0xa8, 0x5b, 0xb4, 0x05, 0x18, 0xe2, 0xda, -0x5a, 0xb5, 0x72, 0xa5, 0xeb, 0xed, 0x4c, 0xb9, 0x2a, 0x54, 0x81, 0x61, -0x5f, 0xaf, 0xa8, 0x3a, 0xa8, 0xe8, 0xbf, 0xf2, 0x80, 0x2b, 0xb8, 0xa0, -0xa0, 0xc9, 0x1b, 0xaf, 0xbd, 0xa6, 0xa2, 0x68, 0x23, 0x59, 0x9e, 0xa9, -0x44, 0x68, 0x19, 0x80, 0x41, 0x64, 0x00, 0x4e, 0x1e, 0xb2, 0xb2, 0x7a, -0x74, 0xee, 0xe4, 0x48, 0x48, 0x19, 0xb5, 0xe9, 0x74, 0x48, 0x96, 0x4e, -0x0b, 0x39, 0x54, 0xe0, 0xd1, 0x73, 0xd6, 0x6c, 0x9a, 0x57, 0xbd, 0xda, -0xc3, 0x67, 0xcf, 0xaa, 0xcc, 0xe9, 0x48, 0x0e, 0xd1, 0xab, 0x44, 0x48, -0xc8, 0xad, 0x0d, 0xb1, 0x64, 0x02, 0x8c, 0x47, 0x1f, 0x7a, 0x08, 0xfb, -0x75, 0xcb, 0x51, 0x0b, 0x42, 0x32, 0x2c, 0x2a, 0xe4, 0x50, 0xd1, 0x73, -0xc1, 0xcd, 0xcc, 0x79, 0xe1, 0xe5, 0x97, 0xab, 0xcc, 0xe9, 0x48, 0xae, -0x27, 0x50, 0xe9, 0x90, 0x50, 0x0a, 0x98, 0x5e, 0xa1, 0x54, 0xba, 0x84, -0x51, 0xe1, 0x97, 0x18, 0xfe, 0xf6, 0xfb, 0xcc, 0x99, 0x2a, 0x55, 0x5e, -0xbb, 0xb0, 0x83, 0x0a, 0xa0, 0x8f, 0xbf, 0xa6, 0x2a, 0x48, 0x50, 0x34, -0x52, 0xa1, 0xb9, 0x4e, 0x83, 0xda, 0xb5, 0xe8, 0x47, 0x81, 0x62, 0xc7, -0xea, 0x47, 0x78, 0xe4, 0x45, 0x55, 0x40, 0x85, 0x62, 0x17, 0x7a, 0x33, -0x24, 0x62, 0x02, 0xae, 0x5e, 0xe6, 0x8a, 0x94, 0x19, 0xb7, 0x25, 0x04, -0x7b, 0xbe, 0x58, 0xa1, 0xc2, 0x68, 0x83, 0xaa, 0x3a, 0xa8, 0x18, 0xbd, -0xc3, 0x55, 0x8d, 0x6b, 0xec, 0xc8, 0x91, 0x84, 0x9f, 0x48, 0xba, 0x85, -0x42, 0x45, 0x15, 0xa1, 0x8f, 0x88, 0x9d, 0x86, 0x41, 0xc1, 0x20, 0xf2, -0x40, 0x72, 0x56, 0xfb, 0x5c, 0x7e, 0x73, 0xe8, 0x99, 0x68, 0xbd, 0xa2, -0x02, 0x1b, 0x6d, 0xd5, 0x41, 0xc5, 0xc0, 0xa5, 0x25, 0x94, 0xee, 0xbb, -0x71, 0xcd, 0x1a, 0x32, 0xa7, 0xa5, 0xea, 0x47, 0x84, 0x67, 0xc3, 0x55, -0x29, 0x10, 0x2a, 0x60, 0x48, 0x1e, 0x3c, 0x61, 0x32, 0x35, 0xd3, 0x93, -0x1b, 0xf4, 0x9b, 0x16, 0x7a, 0x65, 0x36, 0x43, 0x0b, 0x15, 0xdd, 0x26, -0xcc, 0xaf, 0x91, 0x91, 0x41, 0xd5, 0x8f, 0x68, 0x8e, 0x68, 0x95, 0xc2, -0x83, 0x9a, 0x0c, 0xc0, 0x50, 0x95, 0xde, 0xdf, 0x7b, 0xf7, 0x5d, 0x0a, -0xc2, 0x27, 0x37, 0xee, 0xd2, 0x6c, 0xdf, 0xdf, 0x43, 0x8c, 0x5d, 0xd8, -0x47, 0x05, 0xe6, 0xb6, 0x4a, 0xf7, 0x57, 0xb4, 0xee, 0x3e, 0xb0, 0x76, -0x4e, 0x0e, 0xe9, 0x72, 0xc4, 0xa5, 0x48, 0x3d, 0xf0, 0x0a, 0x70, 0x56, -0x54, 0x4d, 0xfa, 0xab, 0x9a, 0xb3, 0x12, 0x76, 0x21, 0x95, 0xde, 0xe1, -0xe7, 0x83, 0xfa, 0xf4, 0x74, 0x64, 0xd4, 0xe9, 0x74, 0x20, 0xd4, 0xfa, -0x83, 0x85, 0x16, 0x2a, 0x1a, 0x36, 0x6d, 0xdd, 0xb8, 0x6e, 0x6d, 0xc2, -0x9f, 0x08, 0xd7, 0x8b, 0x66, 0x4e, 0x57, 0x59, 0x60, 0xa8, 0x4a, 0xef, -0x33, 0xa6, 0x4c, 0x82, 0xc0, 0x26, 0xec, 0x7d, 0x2e, 0xa4, 0x78, 0xc5, -0x7f, 0xf4, 0xdd, 0x5f, 0x45, 0x07, 0x96, 0xd1, 0xb6, 0x95, 0x5e, 0x51, -0x15, 0x78, 0x45, 0x5e, 0xdd, 0x46, 0xed, 0x5a, 0x36, 0x27, 0x86, 0x11, -0x9b, 0x18, 0x56, 0x0e, 0x84, 0xd7, 0x60, 0x25, 0x1e, 0x55, 0x4d, 0x0a, -0x0b, 0xc5, 0x59, 0xa9, 0x6c, 0x24, 0x38, 0xf9, 0xbc, 0xd9, 0x33, 0xa1, -0xb0, 0x9e, 0x37, 0x3d, 0x18, 0x52, 0xa8, 0x28, 0x13, 0x49, 0x2e, 0xa8, -0x90, 0x12, 0xf4, 0xa5, 0x71, 0x50, 0x55, 0x0a, 0x15, 0xa9, 0x19, 0xd9, -0xfd, 0x7b, 0xf7, 0xa2, 0xcb, 0x06, 0xf9, 0x1e, 0x51, 0x54, 0x54, 0x4d, -0xcc, 0xe8, 0xa8, 0x98, 0x3b, 0xcb, 0x85, 0x8a, 0xe6, 0x57, 0x87, 0x5a, -0xf1, 0x59, 0x93, 0x04, 0x65, 0x8d, 0x0a, 0x24, 0x96, 0xaa, 0xc0, 0x2b, -0x12, 0x93, 0x32, 0x06, 0xf5, 0xeb, 0xcb, 0x4c, 0x14, 0x2a, 0xa2, 0x7a, -0x45, 0x55, 0xc3, 0x86, 0xa0, 0x02, 0x33, 0x14, 0xc6, 0xd9, 0x79, 0xb3, -0x67, 0xb9, 0x78, 0xc5, 0xba, 0x10, 0xe6, 0x15, 0xef, 0xbd, 0xf7, 0x1e, -0x12, 0x7b, 0x95, 0x46, 0x45, 0x4a, 0x66, 0x76, 0x87, 0x56, 0x2d, 0xa3, -0xa8, 0xa8, 0x6a, 0x48, 0x30, 0x04, 0xe1, 0x2b, 0x54, 0xcc, 0x99, 0xe1, -0x4a, 0x4a, 0x99, 0xb8, 0x3b, 0x84, 0xa2, 0xca, 0xff, 0x63, 0xc8, 0xc5, -0xf3, 0x82, 0x0a, 0xe4, 0x96, 0x4a, 0xb7, 0x41, 0xe5, 0xd5, 0x6b, 0xd2, -0xb8, 0x6e, 0x1d, 0x5d, 0x82, 0x8a, 0xf2, 0x8a, 0x2a, 0x85, 0x10, 0xdd, -0x65, 0x41, 0xdd, 0xd1, 0x41, 0xbd, 0x7b, 0x38, 0xaa, 0xd5, 0x2b, 0x3c, -0x18, 0x42, 0x36, 0x28, 0x4f, 0xa8, 0x38, 0x72, 0xe4, 0x48, 0x32, 0x15, -0xf7, 0xf8, 0x87, 0x5e, 0x81, 0xbf, 0xac, 0x8a, 0x48, 0x50, 0xf9, 0x1d, -0x7a, 0xd7, 0xc9, 0xcd, 0xa1, 0x46, 0xb2, 0xd2, 0xb6, 0xa3, 0xa8, 0xa8, -0x82, 0xa8, 0x10, 0xcb, 0xec, 0x4b, 0x2f, 0xbe, 0x58, 0x3b, 0x23, 0xa5, -0x41, 0xd1, 0x25, 0xcd, 0x43, 0xae, 0x15, 0xb7, 0xb6, 0xfd, 0xeb, 0xbc, -0xa2, 0x8a, 0xa2, 0xa2, 0x5d, 0xff, 0x71, 0x35, 0xb3, 0xaa, 0xbf, 0xf8, -0xe2, 0x8b, 0xd1, 0x9a, 0x96, 0x55, 0x0a, 0x0c, 0x6a, 0x32, 0x7a, 0x35, -0xeb, 0x53, 0x77, 0xdd, 0x05, 0x75, 0x15, 0x2d, 0xdb, 0x55, 0x6d, 0x87, -0x45, 0x33, 0x90, 0x2a, 0x6c, 0x95, 0x2a, 0x63, 0x99, 0x55, 0xa8, 0xa0, -0x42, 0x9f, 0x05, 0x2a, 0xaa, 0x82, 0x04, 0xd5, 0x6d, 0xdc, 0xfc, 0xec, -0x8c, 0x8c, 0xfb, 0xef, 0xbb, 0x4f, 0x79, 0xf1, 0xa2, 0x11, 0x1f, 0x55, -0x07, 0x1e, 0xe2, 0xd8, 0x16, 0x46, 0x81, 0xaa, 0xbd, 0x7c, 0xf1, 0x22, -0x50, 0x31, 0xbe, 0xf8, 0xe1, 0x2a, 0x0c, 0x00, 0x73, 0xf4, 0xae, 0x8f, -0x12, 0x54, 0x55, 0x40, 0x45, 0xbf, 0xf9, 0x6b, 0xe9, 0x68, 0xb1, 0x77, -0xd7, 0x2e, 0x6c, 0x02, 0x12, 0x07, 0x15, 0x8d, 0x99, 0xad, 0x0a, 0xa8, -0x50, 0xb5, 0x51, 0xa4, 0x6e, 0x1a, 0x7e, 0xa4, 0x0f, 0x3f, 0xf8, 0xa0, -0x61, 0x6e, 0x8d, 0xe4, 0xba, 0xad, 0x3b, 0x1c, 0xf8, 0x22, 0xd4, 0x50, -0x61, 0xcd, 0x2b, 0xf0, 0x57, 0x54, 0x51, 0x5e, 0x31, 0x72, 0xe3, 0xbd, -0xd4, 0xdc, 0x9f, 0x33, 0x7b, 0x36, 0x31, 0xb3, 0x86, 0x8e, 0x16, 0xd1, -0x5c, 0xbc, 0xca, 0x82, 0x87, 0x0e, 0x09, 0x29, 0x30, 0xc7, 0x6e, 0x75, -0xeb, 0xc1, 0x83, 0x30, 0x8a, 0x76, 0xd3, 0xae, 0xc9, 0xdd, 0xf9, 0xaf, -0x28, 0x2a, 0xca, 0x37, 0xa1, 0xa4, 0x55, 0xc9, 0xa7, 0xf4, 0x0e, 0xee, -0xda, 0xa9, 0x23, 0xc6, 0x59, 0xbd, 0xa3, 0x45, 0x24, 0x97, 0xf1, 0xab, -0x2c, 0x30, 0xe8, 0x11, 0x81, 0x52, 0x76, 0x51, 0x5a, 0x81, 0x21, 0x3b, -0x7d, 0xfa, 0xbb, 0xdf, 0x75, 0x6d, 0xdf, 0x26, 0x21, 0x23, 0x6f, 0xc2, -0xae, 0xa7, 0x43, 0x0d, 0x12, 0xc6, 0x2a, 0x69, 0x5e, 0xb4, 0xed, 0xaa, -0x20, 0x41, 0xd5, 0xd8, 0xfe, 0x55, 0xa3, 0x5e, 0x63, 0xd2, 0x9c, 0x09, -0x08, 0x51, 0xaa, 0xa3, 0x85, 0xb4, 0xf7, 0xd5, 0xbb, 0x7b, 0x55, 0x3a, -0xa1, 0x44, 0xc8, 0x04, 0x84, 0x4b, 0xa8, 0x6a, 0x8b, 0xc2, 0x25, 0x88, -0xda, 0x2c, 0xde, 0xb6, 0x15, 0x96, 0xde, 0x73, 0xda, 0x52, 0xea, 0x4e, -0x84, 0x14, 0x2a, 0x7e, 0xd8, 0xd3, 0x6d, 0xda, 0xa0, 0x20, 0xc1, 0xaa, -0x80, 0x0a, 0x96, 0x78, 0xc4, 0x2d, 0x67, 0x1d, 0xb1, 0xce, 0xfc, 0x7a, -0xf5, 0x48, 0xc7, 0x13, 0x76, 0x21, 0xa5, 0x35, 0x05, 0x18, 0xd2, 0x10, -0x5e, 0x95, 0xe4, 0xb0, 0xfc, 0x10, 0x21, 0x24, 0x5b, 0xae, 0x8f, 0xa9, -0xa4, 0x26, 0x1d, 0x12, 0x52, 0xe3, 0x03, 0x5b, 0x48, 0x8d, 0xd4, 0x24, -0x67, 0x46, 0x4e, 0x08, 0x42, 0xe2, 0x82, 0xaa, 0x5d, 0xb6, 0xa2, 0xa6, -0x27, 0x1b, 0x54, 0xd5, 0x41, 0x05, 0x6d, 0xc1, 0x7a, 0x5f, 0x59, 0x0c, -0x98, 0x5b, 0x36, 0x6d, 0x4a, 0x19, 0x66, 0xe9, 0x68, 0x01, 0x30, 0xe0, -0x18, 0x08, 0xb5, 0x60, 0x03, 0x1b, 0x88, 0xc0, 0xc3, 0x7c, 0xe8, 0x95, -0x9d, 0xe4, 0xbd, 0x96, 0x2b, 0xe9, 0x84, 0xdf, 0xe0, 0x0a, 0x0c, 0x7a, -0x93, 0x4e, 0xa9, 0xe2, 0x2e, 0x5c, 0xe2, 0xd5, 0x57, 0x5e, 0x69, 0x52, -0xbf, 0x1e, 0x95, 0x67, 0x07, 0x5e, 0x77, 0x2c, 0x04, 0xb9, 0x04, 0xa8, -0x70, 0x6b, 0x83, 0xb2, 0xb0, 0xcc, 0x82, 0x0a, 0x22, 0x07, 0x2b, 0xdd, -0xb7, 0x2d, 0x0b, 0x4d, 0x03, 0xa4, 0x3e, 0x57, 0xb8, 0x7a, 0x07, 0xb7, -0x69, 0xd9, 0xe2, 0x85, 0xe7, 0x9f, 0x17, 0x60, 0xf0, 0x56, 0x30, 0x7d, -0xf0, 0x7a, 0x78, 0x49, 0x02, 0x0f, 0x39, 0xa4, 0x24, 0xa6, 0x1c, 0xd2, -0x2c, 0x4f, 0x61, 0xc6, 0xdc, 0x3c, 0x32, 0xfc, 0xe8, 0x38, 0x58, 0x4f, -0xa4, 0xb8, 0xae, 0x8e, 0x07, 0x29, 0xc2, 0x2b, 0xad, 0x70, 0x48, 0xd8, -0x7c, 0xe0, 0x81, 0x07, 0x9a, 0x36, 0x68, 0xe0, 0xca, 0x4a, 0x5d, 0xb0, -0x91, 0x52, 0xd9, 0x21, 0x8b, 0x0a, 0xdb, 0xfe, 0x8a, 0x2a, 0x85, 0x0a, -0x17, 0x30, 0x76, 0x7d, 0xe1, 0x4a, 0x08, 0x76, 0xc4, 0x14, 0xb6, 0x6f, -0x47, 0x26, 0x24, 0xc1, 0x82, 0x18, 0xce, 0xd8, 0xab, 0x08, 0xa4, 0xe5, -0x0d, 0xc1, 0x3a, 0xe0, 0xe6, 0xbc, 0x2d, 0xc1, 0x89, 0x1c, 0x48, 0x59, -0x1c, 0xbc, 0x45, 0x05, 0x1b, 0x83, 0xc4, 0x15, 0x2c, 0x02, 0x0a, 0xbf, -0x71, 0x74, 0x79, 0x49, 0xef, 0x6e, 0xce, 0x22, 0x0b, 0x8b, 0xc0, 0xa9, -0xba, 0x79, 0xe3, 0xc6, 0xac, 0x8c, 0x74, 0x6a, 0x40, 0xf5, 0x9e, 0xbf, -0x31, 0xc4, 0xeb, 0xcc, 0x86, 0x2c, 0x2a, 0x5c, 0x85, 0xfb, 0x77, 0xfd, -0xb5, 0xd7, 0xfc, 0xf5, 0x8e, 0x98, 0xd8, 0x4e, 0x6d, 0xdb, 0x3c, 0xf9, -0xe4, 0x93, 0x78, 0x30, 0xc0, 0x06, 0x85, 0x3f, 0x80, 0x07, 0xfb, 0x16, -0xaf, 0x0a, 0x06, 0x02, 0x48, 0xe4, 0xa0, 0x1a, 0x88, 0xa0, 0x45, 0x01, -0x06, 0x84, 0x98, 0xbb, 0x77, 0x87, 0x1f, 0x41, 0x07, 0xfe, 0x44, 0xba, -0xe1, 0x55, 0x9a, 0x7b, 0xb0, 0xc5, 0x08, 0x1e, 0x58, 0x61, 0xbc, 0x46, -0x3f, 0x7e, 0xe5, 0x95, 0xc9, 0xe3, 0xc7, 0xc5, 0x50, 0x86, 0x39, 0xa7, -0xfe, 0xc0, 0xd5, 0xb7, 0x85, 0x26, 0x97, 0x40, 0x06, 0xf9, 0x41, 0xa9, -0x28, 0xab, 0x57, 0xbc, 0xfb, 0xee, 0xbb, 0xf4, 0x9b, 0x26, 0xa6, 0xab, -0xaa, 0x4b, 0x50, 0x8a, 0x35, 0xc3, 0x31, 0x7a, 0xcd, 0x5b, 0x07, 0xcb, -0xae, 0x5f, 0x33, 0x6f, 0xf2, 0x84, 0x09, 0xeb, 0xd6, 0xae, 0xdd, 0xb4, -0x7e, 0xfd, 0xf1, 0xdb, 0x6e, 0xc3, 0x6e, 0x0b, 0x73, 0x63, 0x03, 0x03, -0x27, 0x1c, 0x28, 0xe5, 0xa0, 0x45, 0x00, 0xc3, 0x5b, 0x04, 0x33, 0x4a, -0xe2, 0x32, 0xab, 0xe9, 0x81, 0x93, 0x51, 0x98, 0x8d, 0x60, 0x2e, 0x9b, -0xc9, 0x16, 0xc3, 0xa6, 0xc3, 0x62, 0xb2, 0xb6, 0x74, 0x94, 0x2d, 0xb8, -0x20, 0x35, 0x15, 0x8e, 0x98, 0x51, 0xb0, 0xe7, 0x6f, 0x21, 0x28, 0x35, -0x19, 0x7c, 0x09, 0x17, 0x54, 0x0b, 0x93, 0x0d, 0xca, 0x02, 0x15, 0x3c, -0x7f, 0x55, 0x93, 0xa0, 0xd4, 0xea, 0xd3, 0x35, 0xaf, 0xd7, 0xc2, 0x2d, -0x09, 0x35, 0xea, 0xb2, 0x57, 0x25, 0xc5, 0xc7, 0x53, 0x01, 0x04, 0xe7, -0x77, 0xbb, 0x16, 0x2d, 0xb0, 0x84, 0x10, 0x16, 0x0f, 0xca, 0xf9, 0x1f, -0x8d, 0x08, 0x03, 0x1a, 0x50, 0xa1, 0xa4, 0x15, 0xee, 0x3f, 0x0e, 0x18, -0x0b, 0x98, 0x01, 0xfd, 0xb0, 0x11, 0x61, 0x1a, 0x51, 0x69, 0xca, 0x12, -0xcc, 0xe6, 0x7a, 0x36, 0x82, 0x87, 0x0f, 0x3e, 0xf8, 0x60, 0xe3, 0xba, -0x9b, 0x0a, 0xdb, 0xb4, 0xa6, 0x48, 0x7b, 0x8c, 0x33, 0xb3, 0xf7, 0x15, -0xb7, 0x84, 0x6a, 0x49, 0xd9, 0xd2, 0x22, 0xe7, 0x8a, 0x57, 0x84, 0x3e, -0x2a, 0x04, 0x1e, 0x60, 0x63, 0xd4, 0xd6, 0x87, 0x7a, 0x2d, 0x2a, 0x6e, -0x31, 0xed, 0x86, 0x1a, 0x9d, 0x46, 0xc6, 0xc5, 0x25, 0x24, 0x38, 0x1c, -0x79, 0x19, 0xe9, 0xed, 0x9b, 0x17, 0xb4, 0x29, 0x68, 0x7c, 0xe1, 0x27, -0xbf, 0x6d, 0x41, 0x7e, 0x87, 0xe6, 0x4d, 0xf3, 0x6b, 0xe7, 0xa5, 0xc5, -0xc6, 0xd0, 0x7f, 0x9b, 0x9f, 0x94, 0x18, 0x47, 0x97, 0x4e, 0x9d, 0x30, -0x64, 0x49, 0x53, 0x56, 0xb3, 0x6d, 0x37, 0xcc, 0x76, 0x7d, 0x5f, 0x1f, -0x47, 0x20, 0x21, 0x35, 0x3b, 0xe8, 0x2b, 0x7b, 0xd3, 0x8d, 0x37, 0xae, -0x5c, 0xb2, 0x78, 0xea, 0xb8, 0xb1, 0x9d, 0xdb, 0xb4, 0xac, 0x91, 0xe2, -0x4c, 0x88, 0x89, 0x8d, 0x4f, 0x48, 0x2e, 0x1c, 0x31, 0x33, 0x64, 0x45, -0x26, 0xcb, 0x20, 0xa8, 0xb0, 0xe0, 0x15, 0x3a, 0xcb, 0xce, 0x28, 0xfe, -0x06, 0x78, 0xb4, 0x2d, 0xf9, 0xed, 0x88, 0xeb, 0x8f, 0xf5, 0x9d, 0xb6, -0xa4, 0x73, 0xd1, 0x88, 0xd6, 0x5d, 0xfb, 0x16, 0xb4, 0xef, 0x5e, 0xb7, -0x69, 0x87, 0xcc, 0xba, 0x4d, 0x53, 0x72, 0x1b, 0xa6, 0xe4, 0x34, 0x4c, -0xad, 0x5d, 0x90, 0xd1, 0xb0, 0x7d, 0x66, 0xa3, 0x0e, 0xd5, 0x9a, 0x14, -0xd2, 0x35, 0x18, 0x56, 0xb9, 0x61, 0xdd, 0x3a, 0x69, 0xca, 0x2a, 0xd2, -0x94, 0x32, 0xec, 0x46, 0xb8, 0x85, 0x4a, 0x79, 0xe8, 0x24, 0xda, 0xef, -0xc8, 0xad, 0xb7, 0xc6, 0xc7, 0xc6, 0x3a, 0x62, 0x12, 0x9d, 0xe9, 0x39, -0xc9, 0xd9, 0x0d, 0x9a, 0x74, 0x1d, 0x3a, 0x64, 0xc9, 0x56, 0x5a, 0x4f, -0x85, 0xbe, 0xc8, 0xe4, 0x45, 0x82, 0x72, 0xab, 0x57, 0x54, 0x65, 0x09, -0xca, 0xfd, 0x5b, 0x39, 0xaf, 0xff, 0xc9, 0xb9, 0xed, 0xfb, 0xac, 0x1d, -0xdf, 0xd4, 0xdd, 0xf9, 0x0f, 0x36, 0xb6, 0x56, 0x7b, 0x3f, 0xa7, 0xf8, -0x69, 0xe1, 0xfe, 0x3f, 0xb5, 0xbc, 0xee, 0x3e, 0x50, 0x41, 0x59, 0x79, -0x1e, 0x50, 0xd7, 0x34, 0x44, 0x0b, 0x8f, 0x64, 0x99, 0xca, 0x10, 0xda, -0xc4, 0x96, 0x71, 0xd3, 0x1a, 0x57, 0xef, 0xe0, 0x86, 0x53, 0xd7, 0x8e, -0xd8, 0xf1, 0x54, 0x87, 0x03, 0x9f, 0xe7, 0xee, 0x0c, 0xfd, 0x56, 0xf3, -0xc6, 0x06, 0x31, 0xe2, 0xac, 0x30, 0xfa, 0x2b, 0x3c, 0xa1, 0x02, 0x41, -0x1c, 0x01, 0xbd, 0x8a, 0xf8, 0x2b, 0x82, 0xb5, 0x3f, 0x0d, 0xdd, 0xf2, -0x28, 0x4f, 0x34, 0x79, 0xec, 0x58, 0x9e, 0x0e, 0x8d, 0x1c, 0x45, 0x1c, -0x35, 0x43, 0x1c, 0x82, 0x22, 0x50, 0x49, 0x01, 0x91, 0x48, 0x63, 0x1a, -0x86, 0x00, 0x58, 0x58, 0x28, 0x4d, 0x42, 0x86, 0x0c, 0xec, 0xcf, 0x5a, -0x75, 0x3d, 0x44, 0x56, 0x5d, 0x99, 0xed, 0x26, 0x58, 0xef, 0xa2, 0x52, -0xc7, 0xd1, 0x34, 0x0a, 0x93, 0x6f, 0xdb, 0x0b, 0x2a, 0xaa, 0x8e, 0x17, -0x2f, 0x58, 0x2b, 0x88, 0x82, 0x98, 0xde, 0xbc, 0x27, 0xda, 0x45, 0x49, -0x71, 0x31, 0x8a, 0x38, 0x16, 0x05, 0x4b, 0x6c, 0x44, 0x5a, 0xe8, 0xa1, -0x52, 0x27, 0x44, 0x76, 0xc2, 0x08, 0xbb, 0x71, 0x9d, 0xcb, 0xd0, 0xd7, -0x6b, 0xfa, 0x8a, 0x60, 0xad, 0x7c, 0x15, 0x1b, 0x47, 0xe3, 0x12, 0x51, -0x54, 0xf0, 0x6e, 0x8a, 0xae, 0x3d, 0x16, 0xe7, 0x4c, 0x4d, 0x8e, 0x73, -0x4c, 0x9d, 0x30, 0xe1, 0xb1, 0x73, 0xe7, 0x04, 0x1b, 0xd8, 0xa6, 0xb0, -0xb4, 0x88, 0xb3, 0x5c, 0x69, 0xe1, 0xc2, 0x31, 0x7c, 0x55, 0x58, 0x43, -0xee, 0x7c, 0xc5, 0x28, 0xc4, 0x35, 0x01, 0xf3, 0xdc, 0xb4, 0x6e, 0x1d, -0x96, 0x89, 0xa4, 0xda, 0xcd, 0x9a, 0x87, 0x47, 0x7f, 0x54, 0xeb, 0xce, -0x7a, 0x3f, 0xc8, 0x4e, 0xbe, 0xa2, 0x22, 0xfc, 0x24, 0x28, 0x50, 0x41, -0xe9, 0xff, 0xa2, 0xeb, 0x8f, 0x27, 0xd7, 0x6c, 0x42, 0x8c, 0x67, 0x4a, -0x5c, 0x4c, 0xf3, 0x86, 0xf5, 0xa7, 0x8e, 0x1f, 0xb7, 0x7b, 0xe7, 0x4e, -0xcc, 0xb8, 0x22, 0x50, 0xb1, 0x53, 0x2a, 0x9f, 0x46, 0x24, 0x00, 0x43, -0xb7, 0x3b, 0xe1, 0x8e, 0x28, 0xea, 0xd5, 0x8b, 0x95, 0x49, 0xce, 0xaa, -0x33, 0x75, 0xf7, 0x53, 0x55, 0x6c, 0x83, 0x0f, 0x7a, 0xce, 0x82, 0x2f, -0x5e, 0x3c, 0xf2, 0x8f, 0x50, 0x46, 0xc3, 0x52, 0xaf, 0x28, 0x75, 0x7a, -0x94, 0xfc, 0x65, 0xd0, 0xf2, 0x9d, 0x4d, 0xfb, 0x4e, 0xc0, 0x4e, 0xe5, -0xc0, 0xe7, 0x11, 0xe3, 0x58, 0xb7, 0x66, 0x0d, 0x0e, 0x0d, 0x1e, 0x5c, -0x80, 0x21, 0x1c, 0x43, 0xe9, 0x18, 0x21, 0xc7, 0x01, 0xec, 0x4f, 0x58, -0x2f, 0xd2, 0x31, 0x77, 0x16, 0xd5, 0x9c, 0x62, 0xfa, 0xce, 0xbc, 0xba, -0xe5, 0xa1, 0xf0, 0xd3, 0xad, 0x75, 0x50, 0x95, 0x65, 0x14, 0x76, 0x7c, -0xdb, 0x91, 0x80, 0x0a, 0x81, 0x47, 0xf6, 0x8e, 0x7f, 0xb6, 0xd9, 0xf5, -0xd9, 0x80, 0xd5, 0xb7, 0x27, 0xd7, 0x6a, 0x82, 0x18, 0x7d, 0xed, 0xca, -0x95, 0x52, 0x1b, 0x4b, 0x01, 0x43, 0x57, 0xbe, 0xed, 0xd3, 0x59, 0x68, -0x9d, 0xa9, 0x50, 0x71, 0xf2, 0xf8, 0xf1, 0x94, 0xa4, 0xa4, 0xea, 0x1d, -0x86, 0xf5, 0xb8, 0x2d, 0x2c, 0x1a, 0xcb, 0xfb, 0xd4, 0x92, 0x58, 0x33, -0x2b, 0x59, 0x6b, 0xdb, 0x91, 0x83, 0x8a, 0x1f, 0x58, 0xc7, 0x79, 0x82, -0xdb, 0xda, 0xf5, 0x1a, 0x42, 0x5b, 0xb7, 0x55, 0x2b, 0x56, 0x50, 0xf2, -0x07, 0x60, 0x88, 0x43, 0x43, 0x72, 0xc4, 0xc3, 0x9b, 0x63, 0x28, 0x54, -0x0c, 0x1d, 0x3c, 0x18, 0xda, 0xa8, 0xde, 0x76, 0xe0, 0xc8, 0x2d, 0x0f, -0x5f, 0xe0, 0x15, 0xe1, 0x67, 0x7a, 0x12, 0x76, 0x61, 0x62, 0x14, 0x51, -0x5e, 0xe1, 0x4e, 0x56, 0xc6, 0x3c, 0xd5, 0xb6, 0xe7, 0x10, 0x57, 0xb7, -0xf9, 0xe5, 0xcb, 0x25, 0xe9, 0x4f, 0xca, 0xda, 0x86, 0x3d, 0x30, 0x94, -0x5e, 0x71, 0xfb, 0xb1, 0x63, 0x5d, 0x3b, 0x76, 0x44, 0xcf, 0x8e, 0x4b, -0x48, 0x49, 0xab, 0xdf, 0xba, 0xcf, 0xf4, 0x15, 0x61, 0xaa, 0x6d, 0xfb, -0x8b, 0x0a, 0x6c, 0x32, 0xe1, 0xad, 0x57, 0x58, 0x62, 0x83, 0xd0, 0xc3, -0x36, 0x3d, 0x06, 0xa3, 0x63, 0xac, 0x5a, 0xbe, 0x1c, 0x1d, 0x03, 0xe5, -0x3b, 0x12, 0x38, 0x86, 0x6e, 0x83, 0xc2, 0x16, 0xbf, 0x73, 0xc7, 0x8e, -0xb1, 0xc3, 0x86, 0xe4, 0xd7, 0xcc, 0x73, 0x85, 0xc4, 0x56, 0xaf, 0xdd, -0x7b, 0xfe, 0x86, 0xb0, 0x08, 0x01, 0xf4, 0xa8, 0x54, 0xb8, 0xe1, 0x15, -0x44, 0x97, 0x96, 0xd6, 0xf8, 0xe0, 0x53, 0x64, 0xa2, 0x42, 0xb2, 0x38, -0x92, 0x6b, 0x35, 0x85, 0x63, 0xac, 0x5e, 0xb5, 0x0a, 0x51, 0x4a, 0xac, -0x52, 0x66, 0x8e, 0x11, 0x66, 0x16, 0x5b, 0x83, 0xbf, 0x02, 0xb7, 0x26, -0xc6, 0xa8, 0x92, 0xed, 0xdb, 0x1b, 0xd4, 0xac, 0x89, 0x4c, 0x95, 0xda, -0xa8, 0xc3, 0x80, 0xd5, 0xc7, 0x09, 0xe3, 0x0f, 0x17, 0x93, 0x94, 0x66, -0x7a, 0x52, 0xba, 0x87, 0x1d, 0xbd, 0x02, 0x54, 0x10, 0x49, 0x4b, 0xfc, -0x69, 0x98, 0xf9, 0xb6, 0xed, 0xbc, 0xd7, 0x81, 0x1b, 0xee, 0x4f, 0xae, -0x59, 0x80, 0x75, 0x72, 0xed, 0x0d, 0xd7, 0xeb, 0x1c, 0x23, 0x8c, 0x73, -0x33, 0xf4, 0x1c, 0x23, 0x2c, 0x6f, 0xe2, 0xc8, 0x83, 0x4f, 0xd2, 0xc9, -0x61, 0xd6, 0xf4, 0xe9, 0x59, 0x69, 0xa9, 0xb1, 0x09, 0xc9, 0x7d, 0x08, -0x92, 0x0d, 0x1f, 0x60, 0x98, 0x8c, 0xbc, 0x51, 0x54, 0x78, 0xc6, 0x06, -0x69, 0xe2, 0x83, 0x37, 0x3d, 0x98, 0x94, 0x97, 0x0f, 0x30, 0x08, 0x1a, -0xfd, 0xf4, 0xd3, 0x32, 0xa2, 0x54, 0xb8, 0xd6, 0x16, 0x31, 0x07, 0x7d, -0x00, 0x0c, 0xf8, 0x24, 0xfb, 0xe3, 0x89, 0x13, 0x27, 0x9a, 0x35, 0xc9, -0x87, 0x6c, 0x7a, 0x5c, 0xb2, 0x22, 0x5c, 0x80, 0x61, 0x62, 0x17, 0x51, -0x54, 0x78, 0xe5, 0x18, 0xc4, 0xe1, 0xba, 0x80, 0x91, 0xd3, 0x00, 0x51, -0x8a, 0x20, 0x39, 0x83, 0x8e, 0x11, 0xae, 0xc0, 0xc0, 0xa0, 0xac, 0x7b, -0xf4, 0x84, 0x63, 0x00, 0x0c, 0x0c, 0x0f, 0x2f, 0xbf, 0xf8, 0x62, 0x8f, -0x6e, 0xdd, 0x5c, 0x99, 0x46, 0xc3, 0x2f, 0x6d, 0xb2, 0x2b, 0xb4, 0x4a, -0x03, 0x5a, 0xfa, 0xfe, 0x3c, 0xa1, 0x82, 0x26, 0x8c, 0x3f, 0xfd, 0xe9, -0x4f, 0x8d, 0x59, 0x47, 0xa2, 0x57, 0x44, 0xac, 0x04, 0xa5, 0xf2, 0x37, -0x06, 0x6d, 0x7c, 0x20, 0x29, 0xbb, 0x41, 0x92, 0xc3, 0xb1, 0xce, 0xc5, -0x31, 0x5c, 0xe6, 0xda, 0x48, 0xf0, 0x7c, 0x9b, 0x13, 0xf1, 0x04, 0x18, -0x1f, 0x7f, 0xf2, 0xc9, 0xb4, 0x89, 0x13, 0x5d, 0x05, 0x25, 0xba, 0xf5, -0x0f, 0x17, 0x8e, 0xa1, 0x01, 0xc6, 0x0e, 0xaf, 0x40, 0xfb, 0x8e, 0x70, -0x54, 0xb8, 0x12, 0x9b, 0xf0, 0x7f, 0xaf, 0x3f, 0x93, 0x58, 0xad, 0x4e, -0x72, 0x7c, 0xdc, 0x05, 0x51, 0xca, 0x08, 0x8c, 0x70, 0xf5, 0x63, 0xe8, -0x1c, 0x83, 0xe0, 0x17, 0xd1, 0x31, 0x00, 0xc6, 0x6f, 0x7e, 0xfb, 0x5b, -0x8c, 0x10, 0x49, 0x09, 0x09, 0xad, 0x3b, 0xf7, 0x09, 0x37, 0x60, 0x58, -0xa1, 0x02, 0x14, 0x1c, 0x3e, 0x7c, 0xf8, 0x62, 0xff, 0x8a, 0x28, 0xaf, -0xd0, 0x03, 0x43, 0x06, 0xae, 0x3b, 0xe3, 0xcc, 0xaa, 0x9b, 0x18, 0xe3, -0xb8, 0xf6, 0x82, 0x55, 0xca, 0xec, 0xf9, 0x0e, 0x33, 0x7b, 0x94, 0x38, -0xe6, 0x75, 0x8e, 0x21, 0xa5, 0x6e, 0xe0, 0x18, 0xd2, 0xd5, 0x64, 0xcd, -0xf5, 0xd7, 0x27, 0x3a, 0x1c, 0xed, 0xfb, 0x8e, 0x0c, 0xa3, 0x0c, 0xd5, -0x32, 0xdd, 0x22, 0xdd, 0xfa, 0xb6, 0x45, 0x82, 0x42, 0xba, 0x8a, 0x40, -0x1b, 0x94, 0x41, 0xeb, 0x70, 0x29, 0xdf, 0x1b, 0xee, 0x4b, 0xa9, 0xd5, -0x94, 0xa5, 0x58, 0xba, 0xf8, 0xca, 0xdf, 0xfc, 0xc6, 0x55, 0x1a, 0x9d, -0xbd, 0xd3, 0x50, 0xd5, 0x33, 0xb4, 0xa2, 0x3c, 0xbc, 0xce, 0xd6, 0x50, -0xf9, 0x46, 0xd5, 0x80, 0xe2, 0xd9, 0x31, 0xda, 0x2e, 0x5c, 0x30, 0xdf, -0xa5, 0x63, 0x8c, 0x9c, 0x11, 0x9a, 0xc0, 0x70, 0x79, 0xf1, 0x62, 0x2e, -0xfc, 0x94, 0x96, 0xf9, 0xd0, 0x08, 0xdd, 0x8b, 0x5e, 0x11, 0x45, 0x85, -0x42, 0x08, 0xaf, 0xbf, 0x7d, 0xbf, 0x51, 0x2c, 0xdd, 0x92, 0x45, 0x0b, -0xa5, 0x93, 0x06, 0x46, 0xfd, 0xf0, 0xee, 0x19, 0x60, 0x09, 0x0c, 0xb6, -0x03, 0x80, 0xf1, 0xeb, 0x5f, 0xfd, 0x6a, 0xca, 0xc4, 0x09, 0xac, 0x46, -0xb7, 0x49, 0x57, 0x86, 0x94, 0x28, 0x25, 0x4a, 0xb6, 0xeb, 0xff, 0x98, -0x0b, 0x3f, 0xa5, 0x3b, 0x60, 0x14, 0x15, 0x5e, 0x6d, 0x50, 0x96, 0x27, -0x10, 0x2b, 0xd5, 0xa1, 0xff, 0x58, 0x56, 0x6f, 0xe3, 0xfa, 0x75, 0x52, -0x2b, 0x44, 0x4a, 0x7a, 0x8a, 0x76, 0xe1, 0x75, 0xf7, 0x0d, 0xd1, 0x13, -0x74, 0x07, 0x1f, 0x0f, 0x2b, 0x55, 0x03, 0x01, 0xc6, 0x4f, 0x3f, 0xf9, -0x64, 0xc8, 0xc0, 0x01, 0x2e, 0x73, 0xed, 0xa5, 0x2b, 0x71, 0x7d, 0xfa, -0xb7, 0xa4, 0x95, 0x7a, 0x55, 0x59, 0x33, 0x94, 0x09, 0x15, 0xbf, 0xfe, -0xf5, 0xaf, 0xa3, 0x7a, 0x85, 0xad, 0xd8, 0x7d, 0x72, 0xf9, 0x93, 0xb2, -0xea, 0x66, 0x24, 0x26, 0xdc, 0x71, 0xfc, 0x38, 0x94, 0x21, 0x01, 0xe7, -0x92, 0xb8, 0x17, 0xa2, 0x44, 0x6f, 0x67, 0xda, 0x06, 0xcf, 0x37, 0xc0, -0x10, 0x8e, 0xf1, 0xee, 0xdb, 0x6f, 0x77, 0x29, 0x2c, 0x74, 0x01, 0x63, -0xc6, 0xb5, 0x94, 0x3c, 0xad, 0x54, 0x12, 0xb7, 0xf5, 0xfa, 0xf4, 0x19, -0x96, 0x61, 0x14, 0xee, 0x23, 0x3e, 0x4a, 0xb5, 0x6d, 0x3e, 0x45, 0x6d, -0x50, 0xee, 0xde, 0xf1, 0xc0, 0xb5, 0x77, 0x39, 0xe2, 0x93, 0xf2, 0xeb, -0xd7, 0x47, 0xfa, 0x14, 0xed, 0x42, 0x82, 0x6a, 0xc3, 0x52, 0xe7, 0x56, -0x98, 0xb1, 0x04, 0x06, 0x86, 0x87, 0x17, 0x5f, 0x78, 0xa1, 0x79, 0xbe, -0xcb, 0xc1, 0xd7, 0x77, 0xf9, 0x1e, 0x9c, 0x3c, 0xa1, 0x02, 0x8c, 0x0b, -0xe2, 0x93, 0x5b, 0x5e, 0xa1, 0xb4, 0xed, 0x28, 0xaf, 0xb0, 0xbb, 0xd9, -0xb4, 0xdb, 0xfd, 0x7f, 0x35, 0x07, 0xce, 0x75, 0x26, 0x26, 0x50, 0x42, -0x8f, 0x2a, 0x21, 0x6c, 0x9c, 0x11, 0xd2, 0xd3, 0xd5, 0x9c, 0xdb, 0xcd, -0xe3, 0x23, 0x49, 0x3e, 0xf8, 0xc0, 0x03, 0xb5, 0x73, 0xb2, 0x63, 0x62, -0x13, 0x07, 0xde, 0x74, 0x2a, 0x74, 0x50, 0xa1, 0xb4, 0x6d, 0x8b, 0xfe, -0x15, 0x51, 0x54, 0xd8, 0x05, 0x43, 0xa9, 0xda, 0xbd, 0xeb, 0xf3, 0x46, -0xb3, 0x8a, 0x13, 0x1c, 0x31, 0x4b, 0x17, 0x2f, 0xa6, 0x50, 0x27, 0x3a, -0x77, 0xe4, 0x74, 0xaf, 0x34, 0x78, 0xbe, 0x79, 0x76, 0x80, 0x81, 0x49, -0x6a, 0xdf, 0x9e, 0x3d, 0xa9, 0xf1, 0x71, 0x69, 0x75, 0x5b, 0x84, 0x94, -0xe6, 0x5d, 0xf6, 0xd5, 0x47, 0xf5, 0x8a, 0x40, 0xb6, 0xb4, 0xcc, 0xe2, -0x6f, 0x1a, 0x4c, 0x5d, 0x97, 0x18, 0x1b, 0x77, 0xcd, 0xca, 0x95, 0xd2, -0xbd, 0x32, 0x72, 0x50, 0x61, 0xf0, 0x63, 0x48, 0x0b, 0x0b, 0x71, 0x62, -0x2c, 0x5b, 0xbc, 0x18, 0xba, 0xea, 0x32, 0x66, 0x4e, 0xa8, 0x02, 0xc3, -0xbe, 0x0d, 0x2a, 0x32, 0x63, 0x66, 0xbd, 0x62, 0xa6, 0xee, 0xd8, 0xab, -0x93, 0xe3, 0xe3, 0x29, 0xfc, 0x2c, 0xdd, 0x2b, 0x45, 0xe1, 0x0e, 0x6f, -0xbd, 0x42, 0x57, 0xca, 0x79, 0x52, 0x69, 0x77, 0x24, 0x26, 0x29, 0x89, -0x07, 0xa1, 0x16, 0xc4, 0xc8, 0x61, 0xc3, 0x5c, 0x9a, 0xf7, 0xcc, 0xeb, -0x42, 0xd2, 0x24, 0x15, 0x45, 0x85, 0x57, 0xba, 0xf7, 0x70, 0x42, 0x7a, -0xf1, 0xbf, 0x6a, 0x8f, 0x5c, 0x96, 0x92, 0x90, 0xb0, 0x69, 0xc3, 0x06, -0x41, 0x45, 0x44, 0xf1, 0x0a, 0x3d, 0x82, 0x50, 0x15, 0x8f, 0x42, 0x8e, -0x42, 0x31, 0x7d, 0xe3, 0xf5, 0xd7, 0x5b, 0x37, 0x6f, 0x46, 0x26, 0xdf, -0x80, 0x6b, 0x8e, 0x04, 0xb2, 0xc2, 0x95, 0x73, 0xad, 0x9d, 0x38, 0xa8, -0x68, 0x74, 0xa0, 0xbb, 0x77, 0xd3, 0x68, 0xc7, 0x9f, 0x6b, 0x0d, 0xbe, -0x3c, 0xd5, 0xe9, 0xdc, 0xbe, 0x6d, 0x9b, 0x8e, 0x8a, 0x48, 0xa8, 0x91, -0x63, 0x69, 0x92, 0x92, 0x1e, 0xaa, 0xb8, 0x35, 0x01, 0xc6, 0x99, 0xd3, -0xa7, 0xab, 0xa7, 0x26, 0x27, 0x52, 0x94, 0x76, 0x77, 0xa8, 0xa5, 0x28, -0x45, 0xe3, 0xa0, 0x02, 0xd9, 0x8d, 0x5a, 0x6f, 0xff, 0x55, 0x62, 0x7a, -0x4e, 0x4e, 0x66, 0xc6, 0xe9, 0x7b, 0xee, 0x89, 0x4c, 0x5e, 0x61, 0x0e, -0x94, 0x52, 0x9d, 0x54, 0xd1, 0xbc, 0x37, 0xdc, 0x74, 0x13, 0x04, 0xd6, -0xf5, 0x92, 0x50, 0x2b, 0x3a, 0x18, 0xe5, 0x15, 0x81, 0xa0, 0xa2, 0x68, -0xc1, 0xfa, 0xc4, 0xb8, 0xb8, 0x15, 0x4b, 0x96, 0x20, 0x49, 0x47, 0xa6, -0x5e, 0x61, 0xe0, 0x18, 0xd2, 0x75, 0x1b, 0xcd, 0x1b, 0x8e, 0x81, 0x51, -0xee, 0xa3, 0x0f, 0x3f, 0x2c, 0x6c, 0xdf, 0xd6, 0xe1, 0xcc, 0x0c, 0xb1, -0xea, 0xe5, 0x51, 0xbd, 0x22, 0x00, 0x54, 0x9c, 0xef, 0x30, 0x68, 0x52, -0x72, 0x5c, 0xcc, 0x53, 0x4f, 0x3e, 0x49, 0x29, 0x4e, 0x50, 0x11, 0x69, -0x36, 0x28, 0x83, 0x2f, 0x5c, 0xd7, 0xbc, 0x01, 0x86, 0x68, 0xde, 0x04, -0xd5, 0x92, 0xc6, 0x38, 0xe0, 0xf2, 0x75, 0x01, 0xac, 0xb3, 0xcf, 0x16, -0xf3, 0x40, 0xef, 0x15, 0xe5, 0x15, 0x7e, 0xaf, 0x60, 0xfa, 0xb6, 0x6f, -0x6a, 0x36, 0xed, 0x98, 0x1e, 0x1f, 0x8b, 0xa3, 0x07, 0x54, 0x40, 0x01, -0x11, 0x8e, 0x0a, 0xa5, 0x7c, 0x4b, 0x8d, 0x5a, 0x42, 0x60, 0xd0, 0xbc, -0x09, 0x2a, 0x6d, 0xd1, 0xa4, 0x49, 0xad, 0x06, 0x4d, 0x73, 0x4b, 0x42, -0xa7, 0x00, 0xa1, 0x4d, 0x54, 0x44, 0x60, 0xe5, 0x1b, 0xaf, 0x68, 0x69, -0xb4, 0xe3, 0x4f, 0x29, 0xb9, 0x8d, 0xea, 0xe7, 0x66, 0x93, 0xe6, 0x4f, -0xf4, 0x18, 0xa6, 0xfa, 0x88, 0xf2, 0xe2, 0x79, 0xe8, 0x18, 0x86, 0xad, -0x16, 0x60, 0x88, 0x07, 0x83, 0xcd, 0x62, 0xcc, 0xf0, 0xe1, 0x31, 0x8e, -0xb8, 0xf6, 0xfb, 0xa8, 0xf2, 0x5f, 0xe1, 0xbb, 0xbe, 0x7f, 0x77, 0x8c, -0xa2, 0xc2, 0xef, 0x57, 0xd5, 0xaa, 0xf8, 0x7f, 0x93, 0xaa, 0xd7, 0xee, -0xd8, 0xba, 0xe5, 0x87, 0x1f, 0x7e, 0x48, 0xfe, 0x89, 0xf8, 0xb6, 0x25, -0x8d, 0x3b, 0x72, 0xfc, 0x15, 0x66, 0x6c, 0xe8, 0x95, 0x6a, 0xf1, 0x60, -0x60, 0x8f, 0xa2, 0x36, 0xa9, 0x33, 0x21, 0x71, 0xec, 0xa6, 0x7b, 0xfc, -0x5e, 0xea, 0x8a, 0xbe, 0xd0, 0x8d, 0x0d, 0xaa, 0x4c, 0x3d, 0xa8, 0xb0, -0xaf, 0xbe, 0xec, 0xdf, 0xa2, 0x8f, 0xbc, 0xe5, 0xc1, 0xc4, 0xb4, 0xec, -0xc1, 0x45, 0x7d, 0x3f, 0xf9, 0xe4, 0x13, 0x78, 0x29, 0xaf, 0x1f, 0x99, -0x21, 0x42, 0xe2, 0xa0, 0x3c, 0x44, 0xd7, 0xea, 0x91, 0x20, 0xa2, 0x5d, -0x1c, 0x3b, 0x72, 0x24, 0x3d, 0x29, 0x79, 0xe0, 0xa2, 0xcd, 0xfe, 0xad, -0x73, 0x25, 0x5c, 0x65, 0x87, 0x57, 0x44, 0x51, 0x61, 0x7e, 0x31, 0x28, -0x15, 0x7d, 0x57, 0x1d, 0x8e, 0x4f, 0x4a, 0xbf, 0x64, 0xd2, 0x04, 0x7a, -0x18, 0x10, 0xe6, 0x10, 0x45, 0x85, 0x6e, 0x8f, 0x92, 0x1e, 0x93, 0x62, -0xa5, 0xfd, 0xf1, 0xcb, 0x2f, 0xd7, 0x48, 0x4f, 0xef, 0x30, 0x7c, 0x66, -0x25, 0xd0, 0x77, 0xf9, 0x49, 0x50, 0x51, 0x54, 0x98, 0x5f, 0x27, 0xfe, -0xbb, 0x16, 0x97, 0xac, 0x75, 0xc4, 0xc4, 0x2d, 0x5b, 0xbc, 0x88, 0xb6, -0xc5, 0x94, 0xc3, 0x89, 0xa8, 0x98, 0x59, 0xcf, 0x99, 0x18, 0xc2, 0x2e, -0xc4, 0xdb, 0x8d, 0x54, 0x89, 0x75, 0xae, 0x56, 0xf5, 0x6a, 0x79, 0x05, -0x1d, 0xa2, 0xa8, 0x08, 0x11, 0xbd, 0xca, 0xbf, 0xbd, 0x64, 0xcb, 0x7f, -0x51, 0x2a, 0x6a, 0xb4, 0x1b, 0x84, 0xcd, 0x91, 0x8a, 0xf6, 0x38, 0x2b, -0xf0, 0x58, 0x49, 0x3a, 0x5e, 0x24, 0xe4, 0x57, 0x78, 0x4d, 0x4e, 0x52, -0xa8, 0x10, 0x4b, 0xd4, 0x67, 0xff, 0xf7, 0x7f, 0x35, 0xab, 0x67, 0xa6, -0xd5, 0x69, 0x11, 0x3e, 0xa8, 0x38, 0x7a, 0xf4, 0x68, 0x94, 0x57, 0x98, -0x5f, 0xe7, 0xa8, 0x2d, 0x0f, 0xc5, 0xa5, 0x65, 0xf7, 0xe9, 0xda, 0xf9, -0x8d, 0x37, 0xde, 0xa0, 0xad, 0x3d, 0x01, 0x0e, 0x04, 0x41, 0x21, 0x30, -0x80, 0x8a, 0x88, 0x0a, 0xf7, 0xf0, 0x60, 0x89, 0x12, 0xfb, 0x2c, 0xbc, -0xe2, 0xbd, 0x77, 0xdf, 0xcd, 0xc9, 0x48, 0xaf, 0x5d, 0x38, 0x34, 0x0c, -0x51, 0x11, 0x7e, 0xdd, 0x22, 0x03, 0x79, 0x49, 0x43, 0xd7, 0xdc, 0x8e, -0x4a, 0xb6, 0x68, 0xfe, 0xdc, 0x8f, 0x3f, 0xfe, 0x18, 0xb3, 0xac, 0xb8, -0xf0, 0x40, 0x45, 0xa4, 0xb5, 0x96, 0x74, 0x67, 0x83, 0x12, 0xe3, 0xac, -0x48, 0x50, 0xcf, 0x3d, 0xfb, 0x4c, 0x56, 0x5a, 0x5a, 0x87, 0x31, 0x0b, -0x02, 0x59, 0xf0, 0x0a, 0xbd, 0xd6, 0xab, 0xb6, 0xad, 0x78, 0x45, 0x14, -0x15, 0xfa, 0x8b, 0x19, 0xb4, 0xea, 0x00, 0x4b, 0x77, 0xcd, 0x8a, 0xe5, -0x04, 0xd8, 0x4b, 0x4b, 0x24, 0x29, 0xf3, 0x11, 0x45, 0x85, 0x6e, 0x99, -0x65, 0x9b, 0x80, 0x85, 0xde, 0x79, 0xf2, 0x64, 0x46, 0x72, 0xf2, 0x80, -0xf9, 0x37, 0x55, 0x28, 0x65, 0xfb, 0x2b, 0x1b, 0xbb, 0x26, 0x69, 0x1f, -0x15, 0x61, 0xd9, 0x2d, 0xd2, 0xdf, 0xf7, 0x74, 0xbe, 0xff, 0xf2, 0x3d, -0x2c, 0xdd, 0xf5, 0xd7, 0x5e, 0xc3, 0xb2, 0x50, 0xfc, 0x46, 0x5c, 0x78, -0x51, 0x54, 0x98, 0x53, 0xba, 0x59, 0x99, 0xc1, 0x45, 0x45, 0xb1, 0x8e, -0xb8, 0x09, 0xc5, 0x0f, 0xf9, 0xbb, 0xda, 0x15, 0xae, 0xa3, 0xda, 0x44, -0x05, 0x2f, 0x3e, 0xca, 0x2b, 0xb4, 0x97, 0x7a, 0xbe, 0xef, 0xe2, 0xed, -0x2c, 0xdd, 0x86, 0x9b, 0xd6, 0xb2, 0x2c, 0x98, 0x65, 0x71, 0xe1, 0x45, -0x48, 0x8d, 0x0f, 0x3b, 0x9e, 0x0a, 0xd1, 0x28, 0xa4, 0xfc, 0x07, 0x71, -0x50, 0xf4, 0x52, 0xeb, 0x71, 0xc9, 0xf2, 0x66, 0xfb, 0xfe, 0x11, 0x45, -0x45, 0x85, 0xe3, 0x3b, 0x10, 0x8e, 0xe9, 0xf3, 0xb5, 0xe7, 0x7b, 0x5c, -0xbe, 0x19, 0x54, 0xdc, 0xb2, 0x69, 0xa3, 0x98, 0x65, 0xa3, 0xa8, 0x30, -0x94, 0x8a, 0x92, 0x70, 0x8f, 0xfd, 0x7b, 0xf6, 0x64, 0xa6, 0xa5, 0x24, -0x66, 0xd5, 0x0b, 0xb1, 0xee, 0x61, 0x51, 0x5e, 0xe1, 0xd7, 0x06, 0x76, -0xbe, 0x70, 0xf6, 0x3a, 0x96, 0xae, 0xa4, 0x78, 0x9b, 0x98, 0x65, 0x71, -0xe1, 0xb1, 0x35, 0x86, 0x7d, 0x95, 0x34, 0x77, 0x8c, 0xc2, 0x2c, 0x38, -0xb1, 0x20, 0x1b, 0xd6, 0xae, 0x4d, 0x4e, 0x8c, 0x8f, 0x4b, 0xca, 0x18, -0xba, 0xe1, 0x3e, 0xbf, 0x16, 0xb9, 0xf2, 0x36, 0x56, 0x0d, 0x15, 0xef, -0xbd, 0xf7, 0x1e, 0x42, 0xb2, 0xb1, 0x52, 0xbf, 0x68, 0xdb, 0x51, 0x09, -0xaa, 0xec, 0x7b, 0x3d, 0xdf, 0xf6, 0x92, 0xd5, 0x2c, 0xdd, 0xde, 0xdd, -0xbb, 0x88, 0x96, 0x35, 0xa3, 0x22, 0xa2, 0xe2, 0xa0, 0xcc, 0x90, 0x80, -0x73, 0x5e, 0xb5, 0x70, 0x61, 0x02, 0xed, 0xeb, 0xeb, 0x34, 0x1f, 0x7e, -0xcb, 0xc3, 0x4d, 0xf7, 0xfe, 0x3d, 0x0c, 0x51, 0x81, 0xc2, 0x14, 0x45, -0x85, 0x01, 0x15, 0x4d, 0xc7, 0x2f, 0x07, 0x15, 0xb7, 0x1e, 0x3c, 0x08, -0x2a, 0x3e, 0xfb, 0xec, 0x33, 0x71, 0x6c, 0x47, 0x20, 0xaf, 0x30, 0x43, -0x02, 0xef, 0xcd, 0xd4, 0x09, 0xe3, 0xd1, 0x25, 0x0a, 0x07, 0x8c, 0x09, -0x31, 0xc1, 0xc9, 0xaa, 0x2f, 0x9e, 0x5b, 0x5e, 0x11, 0x45, 0x85, 0x69, -0xab, 0x3b, 0x5f, 0x7f, 0xd8, 0x15, 0xa0, 0xe2, 0xb6, 0xa3, 0x47, 0x21, -0x02, 0x1d, 0x15, 0x61, 0x5f, 0x51, 0x53, 0x0f, 0x76, 0x32, 0x40, 0x82, -0xad, 0xe1, 0xc4, 0xf1, 0xe3, 0x8d, 0x6b, 0xe5, 0xb9, 0xaa, 0x7b, 0x8c, -0x5f, 0x10, 0xaa, 0x90, 0xb0, 0x69, 0x99, 0x8d, 0xa2, 0xc2, 0x8c, 0x8a, -0x5a, 0x03, 0xe7, 0xf0, 0xee, 0x4f, 0x9e, 0x38, 0x11, 0x99, 0xa8, 0x30, -0x37, 0xce, 0x7b, 0xed, 0xc7, 0xaf, 0x4e, 0x1e, 0x3b, 0x86, 0x06, 0xc4, -0x24, 0xb2, 0xf7, 0xbf, 0x72, 0x6b, 0xb3, 0xfd, 0x5f, 0x85, 0x98, 0xd4, -0xe4, 0xa6, 0x26, 0xb9, 0xf0, 0x0a, 0x71, 0x49, 0x95, 0x46, 0x92, 0xa3, -0x57, 0x44, 0x51, 0x61, 0xc1, 0x2b, 0x46, 0x2c, 0x12, 0x09, 0x2a, 0x02, -0x51, 0x61, 0x80, 0xc4, 0x87, 0x1f, 0x7c, 0xb0, 0xfe, 0xc6, 0x1b, 0xeb, -0xe5, 0xe5, 0xb2, 0x20, 0x39, 0x5d, 0xc7, 0x8d, 0x2c, 0x7e, 0x22, 0x94, -0x8c, 0xb0, 0x96, 0xe6, 0x47, 0x93, 0xb6, 0x6d, 0x8d, 0x0a, 0x4c, 0xf2, -0x98, 0x20, 0x75, 0x9f, 0x5f, 0x08, 0xef, 0x04, 0x3e, 0xdb, 0x61, 0xcd, -0xc6, 0x90, 0xf3, 0xcd, 0xa7, 0x5e, 0xcf, 0x6a, 0x6c, 0xdd, 0x7c, 0xb3, -0x01, 0x15, 0xe1, 0x5d, 0xa9, 0xdf, 0x5c, 0xd1, 0xe3, 0xb6, 0x63, 0xc7, -0x2e, 0xd4, 0x7d, 0x72, 0x38, 0x73, 0xf2, 0x87, 0x5c, 0x77, 0xb4, 0xf9, -0x81, 0xaf, 0xc3, 0x81, 0x30, 0xa2, 0xa8, 0xf0, 0xeb, 0x2d, 0x9e, 0x6f, -0x3f, 0x77, 0x0b, 0x4b, 0xb7, 0xfa, 0x9a, 0x55, 0x96, 0xa8, 0x08, 0x63, -0x1b, 0x94, 0x30, 0x0a, 0x09, 0x73, 0x22, 0xa0, 0xa3, 0xb0, 0x6d, 0x5b, -0xd6, 0x61, 0xe0, 0xb2, 0x3d, 0x2d, 0x0f, 0x86, 0x4e, 0x5a, 0xb6, 0xd7, -0x6d, 0xd1, 0x0a, 0x15, 0x84, 0xba, 0x19, 0x25, 0xa8, 0x28, 0xaf, 0x30, -0x80, 0xa7, 0xc3, 0x94, 0x15, 0x2c, 0x1d, 0x45, 0x97, 0x61, 0xa1, 0x11, -0x65, 0x83, 0x32, 0x24, 0xa0, 0xb6, 0x6a, 0xde, 0x2c, 0x2e, 0x35, 0xa7, -0xdb, 0xe1, 0xbf, 0xf9, 0xb5, 0xb9, 0x54, 0x9e, 0x47, 0xc2, 0x33, 0x30, -0xa2, 0xbc, 0xc2, 0xbf, 0xd7, 0xd9, 0xb2, 0x68, 0x7c, 0xa3, 0xbc, 0x1a, -0xb7, 0x1e, 0x3a, 0x64, 0xf0, 0xe2, 0x85, 0xbd, 0x0d, 0x4a, 0x18, 0x85, -0xe4, 0xd9, 0xa1, 0x70, 0xb6, 0x68, 0x92, 0x9f, 0x98, 0xd5, 0xb0, 0xf0, -0xd6, 0x28, 0x2a, 0x04, 0x49, 0x5e, 0xd9, 0x50, 0x58, 0x9f, 0xd0, 0x69, -0xf4, 0x9c, 0x6a, 0x09, 0x8e, 0x87, 0xce, 0x9e, 0x8d, 0x58, 0x54, 0x10, -0xd3, 0x41, 0x08, 0x7d, 0xd3, 0x86, 0x0d, 0x92, 0x6a, 0x35, 0x6f, 0x73, -0x30, 0xd4, 0xfc, 0x74, 0x51, 0x5e, 0x51, 0x1e, 0x00, 0xee, 0x31, 0x6d, -0x19, 0x89, 0x78, 0xf7, 0x9e, 0x3e, 0x1d, 0x69, 0x71, 0x50, 0xe4, 0x54, -0xa9, 0x0a, 0xe4, 0x94, 0x71, 0xc8, 0xaf, 0x57, 0x37, 0xa5, 0x7e, 0xbb, -0xfc, 0xbd, 0x61, 0xa1, 0x64, 0xbb, 0xf7, 0xe2, 0xb9, 0xb5, 0x41, 0xb1, -0x29, 0x46, 0x6d, 0x50, 0x3f, 0x00, 0xec, 0x7c, 0xd1, 0xbc, 0xb5, 0xe2, -0xaf, 0x88, 0xb4, 0x98, 0x59, 0x41, 0x05, 0x31, 0xf3, 0xc4, 0x08, 0xbf, -0xfd, 0xd6, 0x5b, 0x0d, 0x6b, 0xd5, 0xaa, 0xd1, 0xba, 0x4f, 0xde, 0xce, -0x7f, 0x95, 0xc7, 0xd6, 0x53, 0x69, 0x63, 0x6a, 0x84, 0x4e, 0xb1, 0x2f, -0x5e, 0xb1, 0xa0, 0x02, 0x2f, 0xc5, 0xc5, 0x2e, 0xf4, 0xe2, 0xaf, 0x40, -0xdb, 0x8e, 0xa2, 0x42, 0x8f, 0x24, 0x1f, 0x78, 0xe5, 0x56, 0xf1, 0x57, -0xa8, 0xfc, 0x0a, 0x3d, 0x92, 0x3c, 0x5c, 0x6d, 0x50, 0x4a, 0xd5, 0x96, -0xda, 0xe3, 0xaf, 0xbc, 0xfc, 0x72, 0xbd, 0xbc, 0xbc, 0xfc, 0x5e, 0x63, -0x93, 0xb6, 0x7d, 0x5f, 0x69, 0x14, 0x5c, 0x1e, 0x82, 0xba, 0x1d, 0x54, -0x10, 0xec, 0x15, 0x45, 0x85, 0xe1, 0xad, 0x0f, 0xbf, 0x90, 0xa1, 0x3a, -0xff, 0xb2, 0xd9, 0x9f, 0x7c, 0xfc, 0x71, 0xe4, 0xe4, 0xe2, 0xa9, 0x32, -0x05, 0x52, 0xd2, 0xe6, 0xb9, 0x67, 0x9f, 0xad, 0x93, 0x93, 0xdd, 0x3e, -0x84, 0x4a, 0xda, 0xd8, 0x84, 0x50, 0x14, 0x15, 0xfe, 0x6d, 0x72, 0x8d, -0x4b, 0xfe, 0x92, 0x5e, 0xaf, 0x25, 0x61, 0xa1, 0xfb, 0x76, 0xef, 0x96, -0x30, 0x63, 0xc9, 0xdb, 0x0e, 0xef, 0x1a, 0x1f, 0xca, 0x53, 0x81, 0xaa, -0x4d, 0x46, 0xd1, 0xfd, 0xf7, 0xdd, 0x47, 0x97, 0x82, 0x9e, 0xd3, 0x43, -0xad, 0x10, 0xbf, 0x57, 0x6c, 0xb8, 0xb1, 0xcc, 0x96, 0x91, 0xa0, 0xa2, -0xbc, 0xc2, 0x12, 0x39, 0xfd, 0x6f, 0x38, 0x91, 0x98, 0x5a, 0xad, 0x41, -0xcd, 0xdc, 0x5f, 0xfe, 0xe2, 0x17, 0x52, 0xe3, 0x23, 0xec, 0x2b, 0xdf, -0x28, 0x54, 0x48, 0xb3, 0xaf, 0x5d, 0x3b, 0x77, 0xa6, 0x25, 0x26, 0x0c, -0x59, 0xb1, 0xcb, 0xbf, 0x9d, 0xa5, 0xea, 0x5e, 0x65, 0xe2, 0x15, 0xc4, -0x8c, 0x1b, 0xf5, 0x8a, 0x28, 0x2a, 0x2c, 0xdf, 0x5f, 0xdb, 0x92, 0xdf, -0x65, 0x34, 0xee, 0x98, 0x1c, 0xe3, 0xf8, 0xe0, 0x83, 0x0f, 0x22, 0xa4, -0x1e, 0x94, 0x72, 0x56, 0x80, 0x0a, 0x22, 0x64, 0x97, 0x5e, 0x79, 0x25, -0xf4, 0x33, 0x6e, 0x6b, 0xe8, 0x24, 0x64, 0x7b, 0xe5, 0x12, 0x72, 0x82, -0x4d, 0x54, 0x90, 0x84, 0x69, 0xd2, 0xb6, 0xcb, 0x36, 0xee, 0xb6, 0x79, -0xbf, 0x30, 0x3a, 0x2d, 0x7f, 0xe7, 0xe7, 0xd5, 0xdb, 0xf4, 0x4f, 0x72, -0xf5, 0xaf, 0x78, 0x42, 0xd5, 0x0e, 0x8c, 0x04, 0x09, 0x0a, 0x17, 0x9e, -0xa0, 0x62, 0xec, 0xc8, 0x91, 0xd0, 0x4f, 0xc7, 0xbd, 0x7f, 0xa8, 0xba, -0xbb, 0xbe, 0x7f, 0xf4, 0x66, 0x1f, 0x15, 0xa4, 0xd7, 0x94, 0xb5, 0xcc, -0x46, 0x3a, 0x2a, 0x32, 0x8a, 0xbf, 0x69, 0x3c, 0x70, 0x46, 0x52, 0x7c, -0xfc, 0xf1, 0xdb, 0x6f, 0x83, 0xc3, 0x46, 0x42, 0x9d, 0x59, 0xc5, 0x2b, -0x5c, 0x15, 0x01, 0x3f, 0xfb, 0xac, 0x47, 0xd7, 0x2e, 0x8e, 0xe4, 0xac, -0xd6, 0xfb, 0xbe, 0x88, 0xa2, 0xe2, 0x07, 0x68, 0x6c, 0x89, 0x74, 0x54, -0x40, 0x0a, 0x3d, 0x17, 0x6c, 0x74, 0x26, 0x38, 0x89, 0xa3, 0xc6, 0x0c, -0x15, 0x09, 0x95, 0xfa, 0x41, 0x85, 0xf4, 0xf8, 0xc2, 0x2c, 0x4b, 0x97, -0xd4, 0xe6, 0x8d, 0x1a, 0x64, 0xb7, 0xec, 0xdb, 0x60, 0x77, 0x28, 0xa7, -0x52, 0x78, 0x8b, 0x24, 0x17, 0x7f, 0x85, 0xb5, 0x5e, 0x61, 0x25, 0x41, -0x55, 0xd5, 0xd0, 0x2e, 0xff, 0x98, 0xa6, 0x5f, 0x57, 0x51, 0x57, 0x33, -0xde, 0x99, 0x3a, 0x74, 0xe0, 0x00, 0xe9, 0xea, 0x12, 0xf6, 0xbd, 0x8e, -0x04, 0x15, 0x24, 0xe2, 0xf2, 0xa4, 0x0f, 0xdc, 0x7f, 0x7f, 0x4e, 0x5a, -0x72, 0xfb, 0x89, 0x4b, 0x53, 0x8b, 0xbf, 0x8b, 0xf2, 0x0a, 0xc5, 0x2b, -0xa2, 0xa8, 0xf8, 0x6f, 0xab, 0x92, 0x4f, 0x13, 0x33, 0x6a, 0x36, 0xaa, -0x53, 0x9b, 0x78, 0xf2, 0x48, 0xe8, 0x00, 0xa6, 0xa3, 0x02, 0x03, 0x14, -0xa4, 0x30, 0x68, 0xd5, 0xc1, 0x70, 0x83, 0x84, 0x4f, 0xda, 0xb6, 0x49, -0xaf, 0x88, 0xa2, 0xe2, 0xbf, 0xd9, 0xdb, 0xbf, 0xaa, 0xd6, 0xba, 0x28, -0xa7, 0x5a, 0xe6, 0xb9, 0x47, 0x1f, 0x8d, 0x84, 0x1e, 0xaa, 0x82, 0x0a, -0xc2, 0x3d, 0x30, 0x43, 0xaf, 0x5c, 0xba, 0x14, 0x54, 0x4c, 0xd8, 0xf1, -0x78, 0x24, 0xa2, 0xe2, 0xd8, 0xb1, 0x63, 0x48, 0xcc, 0x48, 0x50, 0x7e, -0xa1, 0xe2, 0x3f, 0x31, 0x5b, 0x5c, 0x3f, 0x8e, 0x8b, 0x3f, 0x61, 0x08, -0xa4, 0x1a, 0x5d, 0xc6, 0x66, 0xa5, 0xa7, 0x51, 0x4a, 0x35, 0x12, 0x7a, -0xa8, 0xaa, 0xae, 0x14, 0xff, 0xfb, 0x3f, 0xff, 0x53, 0xd4, 0xb3, 0xbb, -0x23, 0x25, 0xbb, 0xfd, 0xbe, 0x3f, 0x47, 0x51, 0xa1, 0x59, 0xa1, 0xbc, -0x0b, 0xe2, 0x80, 0xe1, 0xdf, 0xb1, 0x17, 0x7e, 0xf8, 0x70, 0x01, 0x18, -0xe1, 0x86, 0x8a, 0x1a, 0xdb, 0xbf, 0x4e, 0xae, 0xd3, 0xb2, 0x56, 0x4e, -0xf6, 0x5b, 0x6f, 0xbe, 0xa9, 0xa3, 0x22, 0x2c, 0x8b, 0xf5, 0xeb, 0xe1, -0x1e, 0x84, 0xd0, 0x27, 0x3b, 0x1c, 0xcd, 0x87, 0xce, 0xce, 0xdd, 0x19, -0x46, 0x29, 0x78, 0x56, 0x31, 0xb3, 0xd6, 0xda, 0x36, 0xbc, 0x02, 0x9b, -0x23, 0x5e, 0x2a, 0xdf, 0x79, 0xc5, 0x7f, 0xe2, 0xb6, 0x7c, 0x9f, 0xb8, -0xf5, 0xfb, 0xf8, 0xad, 0x02, 0x89, 0x30, 0x44, 0x45, 0xab, 0x1d, 0xbf, -0x4d, 0x70, 0xa6, 0xf5, 0xe9, 0xd6, 0x45, 0xba, 0xd0, 0x87, 0xb7, 0xb6, -0xad, 0xcc, 0xb2, 0xb8, 0xf0, 0x6f, 0xbc, 0xee, 0x5a, 0x36, 0xc8, 0xb1, -0x9b, 0x43, 0xad, 0x28, 0xa0, 0xcd, 0x7d, 0xd9, 0xca, 0x5f, 0x81, 0x35, -0xa5, 0x34, 0xe2, 0xc3, 0x2f, 0x54, 0xb8, 0xb8, 0x04, 0x90, 0x70, 0x6e, -0xfb, 0x2e, 0x69, 0xdb, 0x77, 0xf1, 0x5b, 0x09, 0xa8, 0x0c, 0x43, 0x48, -0xc0, 0xfa, 0x06, 0x2d, 0xdf, 0x9d, 0x98, 0xe0, 0x5c, 0xb5, 0x7c, 0xb9, -0xa0, 0x02, 0x69, 0x5b, 0xca, 0x92, 0x87, 0x5f, 0xcc, 0xac, 0x2a, 0xfd, -0x84, 0x01, 0x8a, 0x87, 0xed, 0xd6, 0xae, 0x4d, 0x7c, 0xf5, 0x7a, 0x1d, -0x0e, 0x7c, 0x1e, 0x7e, 0xfc, 0xdf, 0x9d, 0x6f, 0x3b, 0x40, 0x54, 0xb8, -0x20, 0x01, 0x7f, 0x00, 0x12, 0x29, 0xdb, 0xbf, 0x4d, 0x2e, 0xfe, 0x36, -0x7e, 0x2b, 0x96, 0xbb, 0x30, 0x44, 0x05, 0x0d, 0x23, 0x0b, 0xc7, 0x2d, -0x48, 0x8a, 0x8b, 0xa3, 0x09, 0x58, 0xd8, 0x77, 0xa1, 0xd7, 0x2b, 0x18, -0x3c, 0xfb, 0xec, 0x33, 0x6c, 0xa6, 0xad, 0xc7, 0x2c, 0xcc, 0x0d, 0xb3, -0xb4, 0x0a, 0x8f, 0x12, 0x54, 0x20, 0xa8, 0x70, 0x49, 0x4a, 0x17, 0xb8, -0xc4, 0xb7, 0x69, 0xdb, 0xbf, 0x4d, 0xdf, 0xf1, 0xaf, 0xe4, 0xed, 0xdf, -0xc6, 0x6e, 0x11, 0x5e, 0x11, 0x6e, 0xc0, 0xa0, 0x61, 0x64, 0xbd, 0x8e, -0xfd, 0x93, 0x62, 0x1d, 0xcf, 0x3f, 0xff, 0x7c, 0x78, 0x5b, 0x66, 0x55, -0x5a, 0x05, 0xfe, 0x3b, 0xbc, 0xda, 0xd7, 0xad, 0x5a, 0xe9, 0x12, 0x9f, -0x6e, 0xbe, 0xd7, 0xb1, 0xe5, 0x7c, 0xa4, 0xf3, 0x0a, 0x5e, 0xbc, 0x8d, -0x5c, 0xbc, 0x0b, 0x8c, 0x62, 0xcb, 0x77, 0xa9, 0xc5, 0xdf, 0x66, 0x94, -0xfc, 0x8b, 0xff, 0x13, 0xb7, 0x7e, 0x17, 0x13, 0xa6, 0xaa, 0x76, 0xeb, -0xe2, 0xff, 0x4d, 0xc9, 0xa9, 0x9f, 0x1a, 0xe7, 0xf8, 0xc9, 0x4f, 0x7e, -0x12, 0xc6, 0x5d, 0xe8, 0x95, 0xec, 0x24, 0x15, 0x0c, 0x7e, 0xfb, 0x9b, -0xdf, 0x34, 0xaf, 0x5f, 0x27, 0xa5, 0x56, 0xd3, 0x8e, 0x07, 0xff, 0x1a, -0x9e, 0x90, 0x28, 0xeb, 0xaf, 0xe0, 0xe5, 0x92, 0x84, 0x2c, 0x8d, 0x7b, -0x2c, 0xf4, 0x0a, 0x3b, 0xa8, 0xc0, 0x08, 0x0b, 0x67, 0x40, 0x70, 0xca, -0xd8, 0xe1, 0xfa, 0x49, 0xdd, 0xfe, 0x5d, 0x7c, 0x98, 0x32, 0x8a, 0x86, -0xdb, 0xff, 0xd8, 0x65, 0xca, 0x32, 0xb6, 0x89, 0x99, 0xd3, 0x2f, 0xa1, -0x09, 0x58, 0x18, 0xc7, 0x41, 0x89, 0xec, 0x24, 0x6e, 0x0a, 0x82, 0x02, -0xef, 0xbd, 0xe7, 0x1e, 0x9e, 0xba, 0xed, 0xa4, 0x65, 0x79, 0xbb, 0xc2, -0x2b, 0x2b, 0xd5, 0x4d, 0x45, 0x4d, 0x85, 0x8a, 0x32, 0x91, 0xe4, 0x4a, -0xdb, 0xb6, 0x81, 0x0a, 0x20, 0xf1, 0x6f, 0x98, 0x43, 0xaa, 0x0b, 0x15, -0x2e, 0x46, 0x91, 0xb0, 0xf5, 0xfb, 0x70, 0x65, 0x14, 0x23, 0x6e, 0x7e, -0x20, 0x21, 0x3d, 0xa7, 0x45, 0xe3, 0x86, 0x3f, 0x7a, 0xee, 0x39, 0x29, -0x68, 0x40, 0xbe, 0x01, 0x44, 0x13, 0x66, 0x31, 0xb3, 0xba, 0xec, 0x84, -0xe9, 0x89, 0x67, 0xec, 0xde, 0xa9, 0x43, 0x62, 0x72, 0xb5, 0xf1, 0xdb, -0x1f, 0x09, 0x5b, 0x46, 0x11, 0x54, 0x5e, 0x01, 0x24, 0x5c, 0x1a, 0x45, -0x4a, 0xf1, 0xbf, 0x50, 0x27, 0x10, 0x9f, 0xd0, 0xb6, 0xe3, 0x2e, 0xca, -0x4e, 0xe1, 0xa6, 0x51, 0x20, 0x4f, 0x0f, 0x58, 0xe6, 0x8a, 0x77, 0xa0, -0x76, 0xe0, 0x87, 0x1f, 0x7e, 0x28, 0xc5, 0xfa, 0x2b, 0x3e, 0xeb, 0x88, -0xfd, 0xfb, 0xcb, 0xbf, 0xfe, 0xf5, 0x8b, 0xcf, 0x3f, 0xe7, 0xe7, 0xaf, -0x5f, 0x7c, 0x81, 0x84, 0x23, 0x85, 0xfd, 0x82, 0x68, 0x01, 0x53, 0x3e, -0x0a, 0xe9, 0x9c, 0x7d, 0xf2, 0x8e, 0xe3, 0xc9, 0xf1, 0xf1, 0x79, 0xbd, -0xa6, 0x84, 0x7c, 0x25, 0x59, 0xdb, 0x95, 0x6f, 0x94, 0xbf, 0xc2, 0x3f, -0x09, 0x0a, 0x1f, 0x36, 0x76, 0x27, 0x94, 0xec, 0x7f, 0xa5, 0x63, 0x7a, -0x42, 0x76, 0x72, 0x31, 0x8a, 0x30, 0x54, 0xb2, 0x2f, 0xec, 0x91, 0xe7, -0x7b, 0xcf, 0x5f, 0x0f, 0x2a, 0x76, 0xed, 0xd8, 0x6e, 0xe8, 0x2c, 0x5c, -0x91, 0xfd, 0xb6, 0xef, 0xb9, 0xfb, 0xee, 0x41, 0x7d, 0xfa, 0x14, 0x75, -0x2d, 0xec, 0xd7, 0xb5, 0x70, 0xd4, 0xb0, 0x61, 0xcf, 0x3d, 0xf3, 0x8c, -0x54, 0xb9, 0x15, 0x1f, 0x62, 0x50, 0xb0, 0xa1, 0x7c, 0x14, 0x92, 0xa8, -0xdd, 0xa3, 0x4b, 0xe7, 0xf8, 0xa4, 0xf4, 0xe1, 0x37, 0x87, 0x5d, 0x9a, -0x91, 0x01, 0x24, 0x9a, 0x02, 0x1d, 0xa0, 0x5e, 0x01, 0xa3, 0xf8, 0x37, -0x76, 0xd8, 0xf4, 0xed, 0xff, 0x42, 0x82, 0x4a, 0xdc, 0xf6, 0xfd, 0x05, -0x97, 0x76, 0xf8, 0x71, 0x09, 0x71, 0xcf, 0x9f, 0xef, 0x7c, 0xa9, 0xcb, -0x8d, 0x45, 0x8d, 0x0f, 0xbd, 0xb3, 0x70, 0x45, 0xf6, 0xdb, 0x86, 0x5e, -0xa7, 0x4c, 0x98, 0xc0, 0x1c, 0x9c, 0xb5, 0x5a, 0xc4, 0xe5, 0xe4, 0xf3, -0xe1, 0xd0, 0x81, 0x03, 0x60, 0x12, 0x06, 0x22, 0xd8, 0x08, 0x0a, 0x30, -0xf4, 0xea, 0x4f, 0x87, 0x0f, 0x1e, 0x4c, 0x49, 0x72, 0x66, 0x77, 0x9d, -0x10, 0xe6, 0x8c, 0xc2, 0xbe, 0x04, 0x85, 0x84, 0xe0, 0x59, 0xaf, 0x40, -0x7c, 0x4a, 0xd8, 0xf2, 0x5d, 0x4a, 0xf1, 0xb7, 0xa8, 0xda, 0xc8, 0x4e, -0xfc, 0x1a, 0xbe, 0x90, 0x70, 0xa1, 0xa2, 0xd5, 0xf8, 0x25, 0x10, 0xe2, -0x1d, 0xc7, 0x8f, 0x5b, 0xd6, 0x83, 0x0a, 0xca, 0x3e, 0xed, 0xb9, 0x5b, -0x29, 0x55, 0x14, 0x92, 0x63, 0x1d, 0x99, 0x6d, 0x06, 0xb0, 0xce, 0x4d, -0xae, 0x38, 0xc4, 0x64, 0x76, 0x97, 0x94, 0x20, 0xe7, 0x20, 0x47, 0x89, -0x6e, 0x13, 0x94, 0xa8, 0x13, 0x55, 0xfd, 0x09, 0x8d, 0xa2, 0xa8, 0x67, -0x4f, 0x47, 0x5c, 0xf2, 0xf0, 0xe2, 0x27, 0xc3, 0x59, 0xa3, 0x30, 0x65, -0xa8, 0x0a, 0xaf, 0xa0, 0xc6, 0x8d, 0x85, 0x04, 0x05, 0x2a, 0x48, 0x21, -0x70, 0x6f, 0x99, 0x75, 0x31, 0x8a, 0x44, 0x50, 0xb1, 0xfd, 0x5b, 0x97, -0x33, 0x7b, 0xcb, 0xbf, 0x2f, 0xc8, 0x4e, 0xe1, 0x16, 0xf5, 0xa4, 0x9e, -0xc8, 0xb9, 0xf5, 0xfb, 0x06, 0x43, 0xe7, 0xb3, 0x1a, 0x27, 0x4e, 0x9c, -0xc0, 0xd1, 0x8b, 0xaa, 0xad, 0xba, 0x45, 0x96, 0x77, 0x17, 0x7a, 0xe1, -0x00, 0xef, 0xbf, 0xf7, 0x5e, 0xfd, 0x9a, 0xb9, 0xf1, 0x79, 0xcd, 0x26, -0x1c, 0x7e, 0x93, 0x59, 0x15, 0x5c, 0x75, 0x9c, 0xc9, 0x94, 0x14, 0x17, -0xa3, 0x10, 0x63, 0x29, 0x02, 0x1b, 0x41, 0x01, 0x86, 0xf2, 0xdc, 0x31, -0x2c, 0x8c, 0x82, 0x82, 0x26, 0x35, 0xba, 0x8e, 0x0f, 0x7f, 0x46, 0x61, -0xc5, 0x2b, 0x8c, 0xa8, 0xb8, 0xed, 0xb6, 0xdb, 0xc8, 0xd0, 0xf5, 0x88, -0x8a, 0x8b, 0x3e, 0x8a, 0xe4, 0x6d, 0x78, 0xb2, 0xbf, 0x0b, 0x77, 0xd9, -0xc9, 0x05, 0xf5, 0x1a, 0xdb, 0xff, 0x29, 0xbd, 0x8e, 0x08, 0x95, 0x55, -0x95, 0xfa, 0x21, 0x9d, 0xf2, 0xee, 0x8b, 0x27, 0x90, 0x60, 0xff, 0x3e, -0x73, 0xef, 0xbd, 0xdc, 0x3d, 0x7f, 0xd6, 0xb6, 0x1e, 0x77, 0xb8, 0xca, -0x93, 0x35, 0xba, 0x6c, 0x57, 0x3c, 0x35, 0x78, 0xf6, 0xec, 0x41, 0x21, -0x16, 0x60, 0xc0, 0x31, 0x02, 0xc7, 0xa7, 0x52, 0x2a, 0x7e, 0xfd, 0xab, -0x5f, 0xf5, 0xe9, 0xde, 0xcd, 0x11, 0x97, 0x32, 0xa2, 0xe4, 0xd9, 0x30, -0xde, 0xec, 0x4a, 0x1f, 0xcd, 0xa4, 0x57, 0xb8, 0x45, 0x85, 0x7b, 0x09, -0xca, 0x85, 0x0a, 0xc4, 0x27, 0xf0, 0x90, 0xb8, 0x8d, 0xf0, 0xa7, 0x70, -0x8e, 0x1b, 0x97, 0x85, 0xab, 0xb7, 0xe3, 0xcb, 0xda, 0x83, 0xe6, 0xb1, -0x74, 0x77, 0xdf, 0x75, 0x97, 0x14, 0x83, 0x42, 0xc0, 0x80, 0x1c, 0xa1, -0xc5, 0xf2, 0xeb, 0xea, 0xa2, 0x20, 0xc1, 0x2d, 0x76, 0x6d, 0x2f, 0xe6, -0xee, 0xbd, 0x6f, 0xbc, 0xaf, 0xf6, 0x5e, 0x17, 0x4f, 0x6e, 0x38, 0xfd, -0x16, 0xe7, 0x05, 0xbd, 0x02, 0x3b, 0x98, 0x02, 0x46, 0xe0, 0xec, 0x82, -0x3b, 0x4a, 0xe6, 0xdd, 0x81, 0x7d, 0xfb, 0xb8, 0x5d, 0x5e, 0xd1, 0xec, -0xd0, 0xee, 0xeb, 0x65, 0x5f, 0x78, 0xb1, 0x8f, 0x0a, 0xf7, 0x12, 0x94, -0xcb, 0x20, 0x8b, 0xb7, 0x0e, 0xa3, 0xd3, 0x05, 0x48, 0x84, 0xad, 0xe0, -0xa4, 0x1e, 0xad, 0x69, 0xc9, 0x9f, 0x84, 0x57, 0x9c, 0x3e, 0x75, 0x4a, -0x32, 0x7a, 0x21, 0x47, 0x54, 0x6d, 0x41, 0x45, 0x79, 0x28, 0x15, 0x0a, -0x12, 0x90, 0xe9, 0xd7, 0x5f, 0x7d, 0xb5, 0x68, 0xee, 0x6c, 0x47, 0x4c, -0xf2, 0xf4, 0xc3, 0x3f, 0xbe, 0x88, 0xd2, 0xa9, 0xeb, 0x53, 0x1c, 0x8e, -0x23, 0x87, 0x0f, 0x03, 0x4e, 0x32, 0xaa, 0x71, 0x9b, 0xc0, 0x2e, 0x02, -0x47, 0x85, 0x28, 0x15, 0xbf, 0xf8, 0xf9, 0xcf, 0xdb, 0x36, 0x6d, 0x12, -0x9b, 0x91, 0x37, 0x7a, 0xcf, 0x0b, 0x91, 0xf0, 0x72, 0x0d, 0xd1, 0x81, -0xd6, 0x7a, 0x85, 0x37, 0x09, 0xea, 0x62, 0x78, 0x2c, 0xa8, 0x40, 0xb5, -0x08, 0x6f, 0x75, 0x42, 0xd1, 0x44, 0xab, 0x92, 0xdf, 0xe7, 0xf4, 0x98, -0x9c, 0xe8, 0x70, 0x3c, 0xf2, 0xf0, 0xc3, 0xf0, 0x56, 0xb2, 0xb2, 0xb0, -0x5a, 0x2a, 0x42, 0x0c, 0x3a, 0x2a, 0x74, 0x48, 0x00, 0x3c, 0x8a, 0xb2, -0x35, 0xaf, 0x5f, 0x3b, 0x25, 0xbf, 0x4b, 0xeb, 0xc3, 0x17, 0x13, 0xa6, -0x73, 0xfb, 0xcf, 0xcb, 0x4a, 0x4d, 0xc2, 0xeb, 0x8c, 0x7a, 0x23, 0xec, -0x42, 0x20, 0x1a, 0x88, 0x10, 0xa5, 0x3c, 0x15, 0xbb, 0x2f, 0x64, 0xa2, -0x0e, 0x58, 0xb4, 0x25, 0x4c, 0xba, 0x7b, 0xd9, 0xd9, 0xb5, 0x03, 0xe3, -0x15, 0x2e, 0x48, 0xc4, 0xb8, 0x18, 0x05, 0x82, 0x93, 0x64, 0x17, 0x45, -0x04, 0xaf, 0x68, 0xb7, 0xe3, 0x57, 0xce, 0xbc, 0xfc, 0x5a, 0xd5, 0x32, -0x70, 0x11, 0x48, 0xa3, 0x23, 0x08, 0x11, 0x49, 0x23, 0x10, 0x2a, 0xf4, -0x6c, 0x71, 0x62, 0xdb, 0x96, 0x5e, 0x2a, 0xbf, 0xff, 0xf4, 0xd3, 0x4b, -0x26, 0x4f, 0xe6, 0xad, 0x0d, 0x5a, 0xb2, 0x5d, 0x50, 0x7a, 0xc9, 0x91, -0xd7, 0x1d, 0x09, 0xe9, 0x6d, 0xdb, 0xb6, 0xf9, 0xf9, 0xcf, 0x7e, 0x16, -0x5c, 0x54, 0x70, 0x47, 0x06, 0x1c, 0xd0, 0xa3, 0x6b, 0x42, 0x56, 0xfd, -0x96, 0x87, 0xc2, 0x31, 0xbb, 0xc8, 0x1d, 0x42, 0x02, 0x47, 0x05, 0x81, -0x4f, 0x3f, 0xe0, 0x21, 0x22, 0x20, 0x41, 0xa8, 0x6c, 0xc7, 0xe1, 0x97, -0xb2, 0x6e, 0xf3, 0xe7, 0xcc, 0xc1, 0xab, 0x2d, 0x4a, 0x05, 0x42, 0x4b, -0x80, 0x7b, 0xb3, 0x67, 0x54, 0x48, 0x1f, 0x3a, 0xd8, 0xd1, 0x92, 0xc5, -0xae, 0x72, 0x7d, 0x7d, 0xa6, 0x2d, 0x6d, 0x75, 0xeb, 0xb7, 0x40, 0xa2, -0xd6, 0x9e, 0xef, 0x5b, 0x8d, 0x98, 0x93, 0x92, 0x10, 0xbf, 0x7d, 0xeb, -0x56, 0x4c, 0x87, 0x41, 0x44, 0x85, 0xe0, 0x90, 0x4a, 0xa1, 0xad, 0x1b, -0xd7, 0x4f, 0xcb, 0x2f, 0x8c, 0xa2, 0xa2, 0x8c, 0x65, 0xd6, 0xa3, 0x04, -0x25, 0xbc, 0x22, 0xbc, 0x5d, 0x13, 0x46, 0x35, 0xa9, 0xef, 0x65, 0x37, -0x40, 0x97, 0xa3, 0x86, 0x0e, 0x25, 0xd6, 0x43, 0x4c, 0x13, 0xe5, 0x5a, -0x77, 0x59, 0x24, 0x19, 0xa9, 0xc2, 0x84, 0x42, 0xdf, 0x20, 0x2f, 0x27, -0x29, 0xbb, 0x7e, 0xf7, 0x63, 0x17, 0xbb, 0xa8, 0x74, 0x39, 0xfa, 0x55, -0x7c, 0x72, 0x46, 0xc7, 0x36, 0xad, 0x01, 0x27, 0x82, 0x1c, 0x5c, 0x8b, -0xc9, 0xe8, 0x7a, 0x85, 0xdf, 0xe2, 0x9c, 0xa0, 0x82, 0x58, 0x92, 0x11, -0x03, 0x8a, 0xe2, 0xb3, 0xea, 0x8d, 0xd9, 0xff, 0x4a, 0xb8, 0x2b, 0x15, -0xda, 0x9e, 0x1e, 0x00, 0xaf, 0x70, 0x41, 0x22, 0x2c, 0x13, 0x27, 0x3c, -0xbc, 0xfe, 0xac, 0xe2, 0x7f, 0xe4, 0x15, 0x74, 0x28, 0x68, 0xd4, 0xf0, -0xd9, 0x67, 0x9f, 0xc5, 0x53, 0x81, 0xf8, 0x24, 0x25, 0x03, 0xcb, 0x55, -0xa9, 0x50, 0x8c, 0x82, 0x1b, 0xe5, 0x64, 0xa4, 0xa6, 0xd6, 0x6a, 0xda, -0xea, 0xd0, 0xc5, 0x78, 0xd5, 0xa9, 0x87, 0x5e, 0x4e, 0x74, 0xa6, 0x4c, -0x9b, 0x38, 0x41, 0xa1, 0x02, 0x6d, 0x5b, 0x6c, 0xc4, 0x81, 0xc4, 0x29, -0x2a, 0x28, 0xf2, 0x5c, 0x5b, 0x6f, 0xde, 0x04, 0x91, 0xd4, 0x1e, 0x72, -0x45, 0xb8, 0x7b, 0x2a, 0x82, 0x83, 0x0a, 0x55, 0xa3, 0x20, 0x22, 0x04, -0x27, 0x81, 0x4a, 0x8b, 0x62, 0x57, 0x92, 0x49, 0xbf, 0x5e, 0xbd, 0x68, -0x7e, 0x85, 0x51, 0x4e, 0xd9, 0x64, 0xcb, 0x55, 0xa9, 0x50, 0xdd, 0x19, -0xe1, 0x03, 0xb9, 0xe9, 0xa9, 0x75, 0x9a, 0x75, 0xaa, 0xbe, 0x93, 0xc5, -0xff, 0x6f, 0xf5, 0x92, 0xef, 0x47, 0x6c, 0x7f, 0xd2, 0xe9, 0x4c, 0x9d, -0x33, 0x73, 0x06, 0x33, 0x09, 0xa2, 0xf8, 0xa4, 0x50, 0xc1, 0x73, 0x51, -0xce, 0xa3, 0x27, 0x95, 0x33, 0x79, 0xea, 0x85, 0xb7, 0x14, 0xec, 0x09, -0xaf, 0xae, 0x90, 0x65, 0xf4, 0x8a, 0x28, 0x2a, 0xec, 0x18, 0x22, 0xac, -0xce, 0xe9, 0xb1, 0xa8, 0x38, 0xd6, 0xe1, 0xb8, 0x6c, 0xe6, 0x4c, 0x69, -0x71, 0x24, 0xd6, 0x27, 0x65, 0x93, 0x0d, 0x4a, 0x90, 0x85, 0x41, 0xc1, -0xd0, 0x23, 0x91, 0x1e, 0x3f, 0x77, 0x2e, 0xc3, 0x99, 0xd0, 0x75, 0xe4, -0x8c, 0x8b, 0x10, 0x3d, 0xf0, 0x75, 0xe7, 0xd5, 0xa7, 0xe3, 0xe3, 0x9d, -0x23, 0x87, 0x0e, 0xc1, 0x3a, 0x0c, 0x2a, 0x94, 0xf8, 0x14, 0xa0, 0x92, -0xa3, 0xa3, 0x02, 0x79, 0xec, 0x8d, 0x37, 0xde, 0x68, 0xdd, 0xcc, 0xd5, -0x6a, 0xbe, 0xf7, 0xfc, 0x0d, 0xed, 0x76, 0x7d, 0xda, 0xb8, 0xe4, 0xcf, -0x64, 0xe7, 0x86, 0x97, 0x40, 0x55, 0x56, 0x0b, 0xb0, 0x29, 0x41, 0xa1, -0x75, 0xe1, 0xae, 0x2a, 0x1b, 0xf1, 0x11, 0x59, 0xea, 0x04, 0x44, 0xd0, -0xa0, 0xf8, 0x8f, 0x29, 0xf5, 0x5a, 0x65, 0xa4, 0xa7, 0xdd, 0x7e, 0xdb, -0x6d, 0x12, 0x3d, 0x8e, 0x9e, 0x2d, 0xd6, 0xa7, 0xf2, 0x0b, 0x95, 0x55, -0x91, 0x48, 0x7f, 0xfb, 0xf2, 0x4b, 0xf6, 0xec, 0x98, 0xd8, 0xc4, 0x49, -0x25, 0x8f, 0x09, 0x45, 0x76, 0x3e, 0xf4, 0x45, 0x76, 0x87, 0x21, 0x34, -0xad, 0xdc, 0xbe, 0x6d, 0x1b, 0xea, 0x8d, 0x4c, 0x26, 0x70, 0xf1, 0x49, -0x60, 0xa9, 0xac, 0x5e, 0x60, 0x1e, 0x6b, 0xef, 0x8f, 0x5f, 0xf9, 0x71, -0xeb, 0xa6, 0x05, 0x10, 0x40, 0xcd, 0xfe, 0x97, 0xb5, 0x99, 0xb7, 0xbd, -0xff, 0x0d, 0x27, 0x87, 0x6f, 0x3e, 0xdb, 0x62, 0xeb, 0x2f, 0x1a, 0x6c, -0xfb, 0x43, 0xda, 0xd6, 0x7f, 0x86, 0x38, 0x42, 0x4c, 0x7e, 0x67, 0x8d, -0xd0, 0x69, 0xc3, 0x80, 0xa8, 0x6c, 0xed, 0xdb, 0x76, 0x83, 0x8a, 0xf0, -0x77, 0xd8, 0xa9, 0xf7, 0xdd, 0xa0, 0xf8, 0x0f, 0x85, 0x53, 0x5c, 0xd5, -0xf2, 0x86, 0x0c, 0x18, 0x40, 0xf4, 0xb8, 0x74, 0xfd, 0x62, 0x6f, 0x16, -0x97, 0x76, 0xb9, 0xda, 0x64, 0x25, 0x0f, 0x8e, 0xf8, 0xdc, 0xe4, 0xc4, -0xc4, 0xac, 0xc2, 0xd1, 0x2d, 0x0e, 0x5e, 0xa4, 0xc2, 0xd1, 0xeb, 0xee, -0x8c, 0x4b, 0x48, 0xea, 0xdf, 0xab, 0x27, 0x59, 0xa3, 0xa0, 0x02, 0xda, -0x15, 0x3d, 0x3b, 0x28, 0xf3, 0x51, 0x41, 0x50, 0x60, 0x1e, 0x5d, 0x05, -0x46, 0xf4, 0xe2, 0x8b, 0x2f, 0x0a, 0x30, 0x62, 0xe3, 0x53, 0x12, 0xd3, -0x6a, 0x24, 0x66, 0xe4, 0xa6, 0xd4, 0x6c, 0x52, 0xaf, 0xd3, 0x60, 0x96, -0x65, 0xf0, 0x0d, 0x77, 0xd4, 0xdf, 0x26, 0xf5, 0xfa, 0x43, 0x51, 0x9c, -0x36, 0xed, 0xef, 0x76, 0x50, 0xc1, 0x26, 0x14, 0xe1, 0xa8, 0xe0, 0x95, -0x77, 0x9f, 0xb3, 0x3e, 0x26, 0x36, 0x01, 0xb2, 0x78, 0xee, 0xb9, 0xe7, -0x88, 0x93, 0xa5, 0x40, 0x96, 0x44, 0x04, 0x4a, 0xa9, 0x9b, 0xf2, 0x90, -0x9d, 0xd8, 0xb0, 0x95, 0x2b, 0x8d, 0x0d, 0x7b, 0xd2, 0xf8, 0xf1, 0xbc, -0xac, 0xd1, 0x7b, 0x5f, 0x12, 0xa0, 0xe6, 0xed, 0xfa, 0xae, 0x59, 0xff, -0x49, 0x44, 0xec, 0x3d, 0xf5, 0xc4, 0x13, 0x4c, 0x46, 0xc9, 0x72, 0xa2, -0xe1, 0x04, 0xee, 0x62, 0x37, 0xd8, 0xbe, 0xc0, 0x3f, 0xbb, 0x00, 0xc0, -0xb8, 0x6e, 0xd5, 0xd5, 0xf3, 0x67, 0xcf, 0x1e, 0x39, 0x68, 0x60, 0xff, -0x9e, 0xdd, 0x6b, 0x67, 0x65, 0xe2, 0xca, 0x4c, 0x88, 0x89, 0x8d, 0x77, -0xa6, 0x55, 0x6b, 0xd5, 0xaf, 0xcf, 0x35, 0xc7, 0xea, 0x6f, 0xfb, 0x2c, -0x04, 0x81, 0x61, 0x42, 0xb2, 0x15, 0x2a, 0x58, 0xe1, 0xd2, 0xbc, 0x6d, -0x2c, 0xb3, 0x11, 0x8e, 0x0a, 0xde, 0x74, 0xf7, 0xcb, 0x6f, 0x89, 0x49, -0x48, 0xae, 0x59, 0x23, 0x8b, 0xb0, 0x3c, 0x49, 0x33, 0xaa, 0x80, 0x28, -0x0f, 0x41, 0x85, 0x18, 0xa0, 0x30, 0xb9, 0xf6, 0xed, 0x41, 0x05, 0xcb, -0x9c, 0xae, 0x87, 0xbf, 0x14, 0x54, 0x74, 0x38, 0xf0, 0x45, 0x4a, 0xed, -0xe6, 0xed, 0x9a, 0xe6, 0x13, 0x92, 0x20, 0x10, 0x65, 0x47, 0x17, 0x46, -0x11, 0xac, 0x30, 0x72, 0xb9, 0xbb, 0x84, 0x42, 0x49, 0x23, 0x3c, 0x9e, -0x5a, 0x6a, 0xab, 0x62, 0x6c, 0x20, 0x49, 0xed, 0xcd, 0x37, 0xdf, 0x7c, -0xf8, 0xec, 0xd9, 0x4d, 0x1b, 0x36, 0x14, 0xb6, 0x6d, 0x9b, 0x18, 0xe3, -0x88, 0x75, 0xa6, 0x76, 0x99, 0xb5, 0x06, 0x99, 0x2a, 0xa4, 0x04, 0x2a, -0x2b, 0xe6, 0x66, 0xa5, 0x57, 0xd8, 0x44, 0x45, 0x44, 0x88, 0x4f, 0xf5, -0xb7, 0x7e, 0xd6, 0xfd, 0x8a, 0x2d, 0x8e, 0x84, 0xe4, 0x8c, 0xe4, 0xa4, -0x03, 0xfb, 0xf7, 0x4b, 0xbe, 0x22, 0x52, 0xa6, 0x50, 0x61, 0xf9, 0x99, -0x9e, 0x44, 0xb8, 0x57, 0xa8, 0xb8, 0x98, 0xde, 0x90, 0x9c, 0xd5, 0xf1, -0xf0, 0x3f, 0x84, 0xe6, 0x26, 0x1f, 0x78, 0x21, 0x3e, 0xa3, 0xe6, 0xb0, -0xfe, 0xfd, 0x40, 0xa9, 0x84, 0xb2, 0x0b, 0x2a, 0x82, 0xa8, 0xe1, 0x08, -0xbb, 0x50, 0x76, 0x61, 0x18, 0x23, 0xc0, 0x40, 0x54, 0x03, 0x84, 0x08, -0x90, 0x60, 0x03, 0x93, 0xc3, 0x47, 0x1f, 0x7d, 0xf4, 0xde, 0x7b, 0xef, -0xbd, 0xfa, 0xea, 0xab, 0x37, 0xde, 0xb0, 0x86, 0x2e, 0xc3, 0x90, 0x53, -0xd7, 0xd9, 0x6b, 0x90, 0x36, 0x2b, 0x04, 0x18, 0x81, 0x4b, 0x6b, 0x32, -0x42, 0x30, 0x79, 0x45, 0xf8, 0xa3, 0xa2, 0xde, 0xd6, 0xcf, 0xba, 0xcd, -0xdf, 0xe4, 0x88, 0x77, 0x56, 0xcf, 0x48, 0xdf, 0xb6, 0x65, 0xcb, 0x3b, -0xef, 0xbc, 0xf3, 0xd3, 0x9f, 0xfe, 0x54, 0x82, 0x64, 0x25, 0x4b, 0xbb, -0xfc, 0xc2, 0x01, 0x75, 0x54, 0x48, 0xc7, 0xad, 0xc1, 0x45, 0x45, 0x24, -0xde, 0xb5, 0x3c, 0x78, 0xd1, 0x7f, 0xd7, 0x74, 0xef, 0xdf, 0x53, 0x1b, -0xb4, 0x6f, 0x98, 0x97, 0xfd, 0xee, 0x3b, 0xef, 0x28, 0x54, 0x04, 0x1d, -0xa5, 0x06, 0x60, 0xf0, 0xc8, 0x88, 0x52, 0x30, 0x2e, 0x98, 0x06, 0xc6, -0x06, 0xac, 0x70, 0x44, 0x52, 0x83, 0x0d, 0x1c, 0x9a, 0x2c, 0xce, 0xa9, -0x53, 0xa7, 0x1a, 0xd6, 0xab, 0x8b, 0xde, 0xd1, 0xf3, 0xca, 0x92, 0x0a, -0x01, 0x46, 0xb0, 0x50, 0x61, 0xa2, 0x64, 0xfb, 0x12, 0x14, 0xdb, 0x43, -0x59, 0x1b, 0x54, 0x98, 0xa3, 0xc2, 0x05, 0x89, 0x79, 0x1b, 0x11, 0x0b, -0xaa, 0x57, 0xcb, 0xdc, 0xb9, 0x63, 0x07, 0x6f, 0x9d, 0x5d, 0x19, 0x22, -0x10, 0x71, 0xa5, 0x62, 0x7a, 0xce, 0xab, 0x0c, 0x07, 0x6e, 0x87, 0x37, -0x3d, 0x39, 0x39, 0xb9, 0xde, 0x1e, 0x55, 0x6f, 0xe6, 0x7c, 0x8f, 0x4b, -0x96, 0xc7, 0x38, 0x1c, 0x2b, 0x97, 0x2d, 0x15, 0xde, 0x55, 0x4e, 0xb1, -0x58, 0x3a, 0x30, 0x44, 0x94, 0x82, 0x29, 0xb1, 0x29, 0x70, 0x47, 0x76, -0x07, 0x56, 0x83, 0x6d, 0x02, 0x2b, 0x0d, 0x32, 0x15, 0xb2, 0xdc, 0xad, -0x87, 0x0e, 0x55, 0xcb, 0xcc, 0x8c, 0x4b, 0xca, 0xe8, 0xbd, 0x6c, 0x5f, -0x85, 0xb0, 0x8b, 0xf2, 0x21, 0xc2, 0x28, 0x2a, 0x2c, 0x5f, 0x1e, 0x82, -0x53, 0xd7, 0xd9, 0x6b, 0x63, 0xe3, 0x9c, 0xd5, 0xd3, 0xd2, 0xf6, 0xec, -0xde, 0xfd, 0xee, 0xbb, 0xef, 0xf2, 0xd6, 0x91, 0x19, 0xd8, 0x95, 0x0d, -0x3e, 0x0a, 0xbf, 0x43, 0x2a, 0x3c, 0x04, 0x3e, 0xa9, 0x3f, 0x49, 0x86, -0x83, 0x54, 0xec, 0x1b, 0x37, 0x6a, 0x54, 0xdd, 0xba, 0x75, 0x53, 0x8a, -0x5d, 0xfe, 0x3b, 0xf9, 0xc1, 0xa7, 0x96, 0x5c, 0xa3, 0x5e, 0x56, 0x4a, -0x12, 0xbb, 0x35, 0xb3, 0xe2, 0x9c, 0xa0, 0x58, 0x9f, 0xcc, 0x13, 0xd3, -0x81, 0xc1, 0x2d, 0x90, 0xd3, 0xc0, 0x06, 0xb7, 0x03, 0x1b, 0xdc, 0x17, -0x6c, 0xb0, 0x2c, 0xe8, 0x5a, 0xc8, 0x96, 0xd8, 0x31, 0x37, 0x6f, 0xda, -0xe4, 0x8c, 0x8d, 0x49, 0xc9, 0x6d, 0x44, 0xc0, 0x98, 0xbf, 0xc0, 0x08, -0x9c, 0x09, 0x04, 0x86, 0x16, 0x9b, 0x36, 0x28, 0x9e, 0x3c, 0x72, 0x78, -0x05, 0x90, 0xe8, 0x34, 0x65, 0x59, 0x6c, 0x6c, 0x5c, 0x5e, 0xf5, 0xcc, -0xfd, 0xfb, 0xf7, 0x03, 0x09, 0x04, 0x27, 0xe1, 0x12, 0x12, 0xf5, 0x54, -0xae, 0xd6, 0x58, 0x9d, 0x28, 0x15, 0x2a, 0xfe, 0xfc, 0x97, 0xbf, 0xf4, -0xe9, 0xd1, 0xbd, 0x45, 0x87, 0x1e, 0x3a, 0x9d, 0x15, 0xec, 0xf9, 0x32, -0x25, 0xa7, 0x41, 0x5e, 0x66, 0x1a, 0x15, 0x15, 0xca, 0xbb, 0x2b, 0x9f, -0x02, 0x86, 0xa0, 0x14, 0xa6, 0x21, 0x45, 0xd3, 0xe0, 0x1b, 0xe8, 0x3c, -0xdc, 0x5d, 0x04, 0x2a, 0x52, 0x9c, 0xd1, 0x34, 0x26, 0x8e, 0x1d, 0x13, -0x1b, 0x1b, 0x3f, 0x70, 0xe9, 0x0e, 0x7f, 0x51, 0x11, 0x18, 0x4d, 0xfb, -0xeb, 0xa2, 0x2d, 0x9d, 0xad, 0x4d, 0x5e, 0x11, 0x39, 0xa8, 0x00, 0x12, -0x6d, 0x87, 0x4c, 0x67, 0x59, 0x9a, 0x35, 0x6a, 0x74, 0xd7, 0xc9, 0x93, -0x02, 0x09, 0x36, 0x42, 0x09, 0x79, 0x52, 0x9e, 0xec, 0xf2, 0xb3, 0xc6, -0x9a, 0x51, 0x01, 0x09, 0x3e, 0xf7, 0xec, 0xb3, 0xf5, 0x72, 0x6b, 0xf4, -0xb9, 0xe4, 0x2a, 0x9d, 0xce, 0x7a, 0xcf, 0x5b, 0xc7, 0x3c, 0x17, 0xcc, -0x9d, 0x83, 0x0c, 0x03, 0x5c, 0x95, 0xf6, 0x5f, 0x4e, 0xec, 0x4b, 0x4f, -0x06, 0xe4, 0xf1, 0x51, 0xeb, 0x15, 0xdf, 0xe0, 0xd6, 0xa2, 0x6c, 0x20, -0xcb, 0xc1, 0x51, 0xcf, 0x9d, 0x3b, 0x97, 0xe4, 0x70, 0x34, 0xea, 0xd4, -0x3f, 0x7b, 0xc7, 0x45, 0x2d, 0xc8, 0x17, 0x78, 0x28, 0x9f, 0x5a, 0xe5, -0x25, 0x75, 0xda, 0x41, 0x05, 0x8c, 0x32, 0x12, 0x50, 0x51, 0xf7, 0x96, -0xdf, 0x77, 0x5f, 0xbc, 0xd3, 0x99, 0xdb, 0x90, 0x35, 0xe9, 0xde, 0xa5, -0xf3, 0x23, 0x8f, 0x3c, 0x82, 0x2e, 0x81, 0xe0, 0x24, 0x99, 0xd9, 0x22, -0x38, 0x19, 0xb8, 0x44, 0x39, 0xd1, 0x9f, 0x41, 0x82, 0x02, 0x15, 0x4b, -0x17, 0x2f, 0x66, 0x56, 0xe3, 0x37, 0xde, 0xad, 0x89, 0x4f, 0x5f, 0x26, -0xe7, 0x36, 0xac, 0x99, 0x99, 0xfe, 0xc2, 0x0b, 0x2f, 0xc0, 0xc6, 0x2b, -0x00, 0x15, 0x62, 0x13, 0x13, 0xa6, 0x21, 0xb6, 0x29, 0xc1, 0x06, 0xd3, -0xc3, 0x9d, 0x82, 0x40, 0x05, 0xd3, 0x10, 0x60, 0xa0, 0x80, 0x15, 0xf5, -0xe8, 0xea, 0xac, 0x5e, 0xb7, 0xcd, 0x2e, 0xdc, 0x17, 0x3e, 0x6d, 0xfc, -0x06, 0x48, 0xf8, 0x74, 0x6d, 0xf0, 0x4e, 0x8e, 0xa2, 0x42, 0xbd, 0xb6, -0x2e, 0x73, 0x37, 0xc6, 0x39, 0xd3, 0xf0, 0x1f, 0x4f, 0x9f, 0x3a, 0xf5, -0xf1, 0xc7, 0x1f, 0x7f, 0xfb, 0xed, 0xb7, 0x79, 0xbb, 0xec, 0x7c, 0xa2, -0x5e, 0x9b, 0xb9, 0x44, 0x79, 0x43, 0x42, 0xa8, 0x10, 0xca, 0xfb, 0xf0, -0x83, 0x0f, 0x5a, 0xe6, 0x37, 0x4c, 0xac, 0xd3, 0x5a, 0x39, 0x2b, 0x28, -0xbd, 0xd3, 0x67, 0xe1, 0x56, 0xde, 0xdd, 0x35, 0xab, 0xae, 0x86, 0x95, -0x55, 0x18, 0x2a, 0x94, 0x65, 0xcc, 0xc0, 0x37, 0x84, 0x69, 0x20, 0x50, -0x09, 0x30, 0x58, 0xb4, 0x49, 0xa3, 0x47, 0xc6, 0xa7, 0xd6, 0x18, 0xbd, -0xf5, 0x61, 0x5f, 0x50, 0x21, 0x90, 0xa8, 0x02, 0x81, 0xd8, 0x51, 0x54, -0xc8, 0x6b, 0xab, 0xbb, 0xe5, 0xf7, 0x09, 0xe9, 0xd9, 0x19, 0x69, 0xa9, -0x9b, 0x36, 0x6e, 0x7c, 0xf9, 0xe5, 0x97, 0x81, 0x04, 0xf2, 0xb1, 0x54, -0xb5, 0xa9, 0x60, 0x5d, 0xc2, 0x20, 0x41, 0xb1, 0x25, 0xff, 0xe8, 0xd9, -0x67, 0xd3, 0x09, 0x40, 0x1a, 0xb2, 0xb0, 0xcb, 0x91, 0xbf, 0x2b, 0x3d, -0x3b, 0xb5, 0x7e, 0x1b, 0xde, 0xdd, 0x99, 0xd3, 0xa7, 0x55, 0x9c, 0xa2, -0x68, 0xdb, 0x81, 0x7b, 0xb5, 0xed, 0x98, 0x01, 0x14, 0x3c, 0x14, 0xd3, -0x90, 0x8a, 0xe5, 0x12, 0x1b, 0x82, 0x82, 0x31, 0x63, 0xca, 0xe4, 0xb8, -0xa4, 0x6a, 0x5d, 0xaf, 0xbe, 0xdd, 0x77, 0x54, 0x54, 0x9e, 0xe0, 0xa4, -0xd8, 0x9a, 0x09, 0x15, 0x62, 0x65, 0x31, 0xfa, 0xb6, 0x91, 0xa0, 0x78, -0xd4, 0x30, 0xb6, 0xcc, 0xf6, 0x5b, 0xb6, 0x3b, 0x2e, 0x36, 0x7e, 0xd8, -0xe0, 0x41, 0x08, 0x24, 0x6f, 0xbd, 0xf5, 0x96, 0x40, 0x42, 0x62, 0xc2, -0x54, 0xa5, 0x82, 0x8a, 0xd1, 0x25, 0xcc, 0xa8, 0x80, 0xf4, 0x59, 0xf9, -0xc6, 0x33, 0xb6, 0x14, 0x1e, 0xb9, 0xd8, 0xef, 0xbd, 0xe7, 0x05, 0x8d, -0xe2, 0x8a, 0x05, 0x0b, 0xb0, 0xf9, 0x48, 0xed, 0x67, 0xb1, 0xcc, 0x56, -0x30, 0x2a, 0x74, 0x99, 0x4a, 0xe5, 0x45, 0x89, 0xbc, 0xbd, 0xf8, 0xf2, -0xf9, 0x8e, 0xf8, 0xe4, 0x2e, 0x2b, 0x0e, 0xfb, 0x82, 0x8a, 0xe0, 0x89, -0x40, 0xbe, 0x89, 0x6d, 0xde, 0xfd, 0x15, 0x16, 0xa8, 0x90, 0xe7, 0x0c, -0x6f, 0x54, 0xb4, 0x1b, 0x3e, 0x33, 0x35, 0x31, 0x71, 0x7b, 0x71, 0xf1, -0x6b, 0xaf, 0xbd, 0x26, 0xa4, 0x06, 0x24, 0x24, 0xac, 0xa3, 0x5c, 0xb3, -0x4f, 0x3d, 0x6f, 0xcc, 0xe2, 0xaf, 0x38, 0x7a, 0xf8, 0x30, 0x18, 0x68, -0x7a, 0xc5, 0xa1, 0xb6, 0xb7, 0xba, 0xe2, 0xb7, 0x29, 0x3f, 0x13, 0x9f, -0xd5, 0xb0, 0x59, 0xa3, 0xfa, 0x0f, 0x3f, 0xf4, 0x90, 0xd8, 0x8b, 0x91, -0xf1, 0x50, 0x76, 0x65, 0x9e, 0x15, 0xc9, 0x2b, 0x0c, 0x1c, 0x03, 0x1d, -0x43, 0xd8, 0x05, 0xd4, 0x32, 0x63, 0xca, 0xc4, 0xb8, 0x94, 0xac, 0x71, -0x3b, 0xce, 0x85, 0x39, 0x2a, 0xc2, 0xdb, 0x32, 0x5b, 0xab, 0x5d, 0xbf, -0xf4, 0x24, 0xe7, 0x3d, 0xa7, 0x4e, 0x61, 0x74, 0x12, 0x99, 0x44, 0xb8, -0x84, 0x04, 0x66, 0x57, 0x3c, 0x97, 0xd0, 0x7d, 0xdb, 0x3b, 0xb6, 0x6e, -0x01, 0x15, 0xcd, 0x97, 0x1c, 0x6f, 0x7e, 0xd0, 0xe5, 0xc2, 0x1b, 0xb6, -0xf9, 0x2c, 0xbf, 0xce, 0x9e, 0x31, 0x03, 0xf4, 0x62, 0x93, 0x15, 0x63, -0x80, 0xca, 0x1d, 0xaf, 0x78, 0x54, 0xa8, 0xc8, 0x14, 0x89, 0x98, 0x02, -0x9c, 0x90, 0x4a, 0x41, 0x9d, 0x9a, 0x69, 0xf5, 0xdb, 0x10, 0xac, 0x15, -0xce, 0xa8, 0x60, 0xd7, 0x0c, 0x6f, 0x5e, 0x51, 0xbb, 0x6d, 0xdf, 0xf4, -0xa4, 0xa4, 0x07, 0xee, 0xbf, 0x1f, 0x52, 0x53, 0xb9, 0x13, 0xbc, 0x60, -0x3d, 0x77, 0xa2, 0x02, 0xd4, 0x6b, 0x03, 0xeb, 0x10, 0x5e, 0xb1, 0x7e, -0xcd, 0x1a, 0x60, 0xd0, 0x62, 0xe5, 0xdd, 0x0d, 0xf6, 0xb9, 0x4a, 0xdd, -0x14, 0x2c, 0xba, 0x95, 0x5f, 0x97, 0x2f, 0x5d, 0x4a, 0x9c, 0x05, 0x00, -0xc6, 0x6a, 0x4c, 0x44, 0xb3, 0x94, 0x69, 0x0b, 0x24, 0x2b, 0xd5, 0xbe, -0x3a, 0x61, 0xe9, 0xe6, 0xd3, 0x3b, 0xbf, 0xbc, 0xf6, 0xea, 0xab, 0x38, -0xdd, 0x5b, 0x0e, 0xbc, 0x24, 0x6f, 0xa7, 0xab, 0xe4, 0x42, 0xe8, 0xfd, -0xd8, 0xd1, 0x2b, 0x24, 0x58, 0x32, 0xbc, 0x51, 0xd1, 0x69, 0xc2, 0x95, -0xc9, 0x09, 0x09, 0xf8, 0x65, 0x55, 0xee, 0x84, 0x04, 0xdb, 0xa9, 0xa8, -0xec, 0x8a, 0x87, 0x84, 0xda, 0x83, 0x57, 0xaf, 0x5c, 0xce, 0x6b, 0x6a, -0x73, 0xdd, 0x7d, 0xd9, 0xbb, 0x5c, 0xf5, 0x33, 0x47, 0x94, 0xb8, 0x9a, -0x35, 0x4e, 0x9f, 0x32, 0x19, 0xe5, 0x07, 0x77, 0x32, 0xce, 0x0a, 0x50, -0x51, 0xf1, 0xdd, 0x33, 0x74, 0xf3, 0xb1, 0x1e, 0x44, 0x88, 0x7a, 0xb3, -0x66, 0xf5, 0x75, 0xf1, 0xb1, 0x09, 0xa3, 0xae, 0x3f, 0x1a, 0x7a, 0x78, -0x30, 0x55, 0x5f, 0x96, 0xac, 0x23, 0x6b, 0xbd, 0x22, 0xec, 0x51, 0x31, -0x74, 0xdd, 0x3d, 0xa4, 0x09, 0x90, 0x90, 0x8d, 0xa1, 0x53, 0x0a, 0x9f, -0x09, 0xa3, 0x28, 0xbf, 0x0a, 0x99, 0x5e, 0xf7, 0x66, 0xf1, 0x0c, 0xa0, -0x2a, 0xac, 0x58, 0xbc, 0xc8, 0xe5, 0x42, 0x59, 0xff, 0x68, 0xe2, 0x36, -0x57, 0x28, 0x44, 0x73, 0x97, 0x5e, 0x51, 0x9f, 0x36, 0x4b, 0x8f, 0x9d, -0x3b, 0x57, 0x15, 0x78, 0x85, 0x21, 0x13, 0x03, 0x25, 0xa7, 0x69, 0x83, -0xfa, 0x29, 0x79, 0x8d, 0x99, 0x67, 0x18, 0xa0, 0x42, 0xba, 0xf6, 0xf8, -0x8d, 0x0a, 0x77, 0xfe, 0x97, 0xca, 0x8e, 0x69, 0xb1, 0xc7, 0xc1, 0x1b, -0x6e, 0xff, 0x53, 0x52, 0xcd, 0x26, 0x79, 0xd9, 0x35, 0xce, 0x3d, 0xf2, -0x88, 0x28, 0xaf, 0xe5, 0x5a, 0x21, 0xd3, 0x2b, 0x24, 0x14, 0xa3, 0x80, -0x5f, 0x2d, 0x5d, 0x74, 0x05, 0xa8, 0x18, 0x70, 0xcb, 0xe3, 0x8a, 0xc8, -0xfa, 0x2d, 0x76, 0xd5, 0x99, 0x25, 0x5d, 0x1b, 0x0b, 0xb2, 0xae, 0x57, -0x54, 0xbc, 0x04, 0x65, 0x08, 0xaa, 0x85, 0xc1, 0xee, 0xd8, 0xb6, 0x2d, -0x21, 0x3e, 0xbe, 0xf7, 0xec, 0xd5, 0xa1, 0x0a, 0x89, 0xb2, 0x35, 0xc9, -0xad, 0x51, 0x71, 0xfb, 0xed, 0xb7, 0xdb, 0x90, 0xa0, 0xcc, 0x36, 0x66, -0x95, 0xf5, 0xa7, 0x42, 0xd8, 0xab, 0x7a, 0x9e, 0x77, 0xaf, 0xcb, 0x5d, -0x4a, 0xed, 0x84, 0x31, 0x63, 0xd8, 0x18, 0x14, 0x2a, 0xca, 0x29, 0xc9, -0xce, 0x12, 0x15, 0xe2, 0x1a, 0x53, 0x87, 0x64, 0x6c, 0xa3, 0x2d, 0x5c, -0x39, 0x8f, 0x9a, 0xb6, 0xf1, 0x23, 0x76, 0x3c, 0xa3, 0xe8, 0x8c, 0x30, -0xf2, 0xac, 0xf6, 0x83, 0x99, 0x2d, 0x46, 0x33, 0xd5, 0x2a, 0xa0, 0xfc, -0xa2, 0x03, 0x3d, 0x60, 0x58, 0x31, 0x0a, 0x09, 0xa7, 0x65, 0xe9, 0x3a, -0xb4, 0x6c, 0xc9, 0x6c, 0x43, 0x98, 0x51, 0x94, 0x03, 0x2a, 0x74, 0xce, -0x50, 0x05, 0x02, 0x5a, 0xec, 0x31, 0x0a, 0xa1, 0xb6, 0xb6, 0x3b, 0x7e, -0x9d, 0x90, 0xdb, 0xb4, 0x55, 0xd3, 0x82, 0x77, 0xde, 0x7e, 0x1b, 0xf3, -0xbf, 0x04, 0x77, 0x94, 0x37, 0x2a, 0x0c, 0x48, 0x30, 0xc7, 0x53, 0xc0, -0x2b, 0xae, 0x5d, 0xbe, 0x0c, 0x00, 0x8c, 0xdd, 0x51, 0xca, 0x2b, 0x98, -0xed, 0xc0, 0x1b, 0xef, 0x74, 0xc4, 0x25, 0xcd, 0x98, 0x36, 0x15, 0xe3, -0xac, 0x54, 0x1b, 0xf1, 0x90, 0x75, 0x64, 0xbe, 0x8b, 0xfa, 0xc6, 0x0e, -0xd7, 0x72, 0x77, 0x8e, 0xce, 0x28, 0xc4, 0x26, 0xbb, 0xe8, 0x0a, 0x17, -0x5b, 0xeb, 0x79, 0xe9, 0xd5, 0x21, 0xcc, 0x28, 0xca, 0xa2, 0xc2, 0x5a, -0xaf, 0x80, 0x57, 0x48, 0xce, 0xae, 0x95, 0xb6, 0xed, 0x35, 0x6a, 0x45, -0x3f, 0xa1, 0xaa, 0xdb, 0x22, 0x9a, 0xef, 0xfc, 0x43, 0x5c, 0x46, 0xed, -0xc2, 0xb6, 0x6d, 0xa0, 0x33, 0x88, 0xac, 0xfc, 0x50, 0x61, 0x60, 0x08, -0x2a, 0xac, 0x08, 0x1d, 0x46, 0x2c, 0x39, 0x7a, 0xec, 0x1d, 0xea, 0x8d, -0x14, 0xca, 0x1f, 0xbb, 0xe9, 0xb4, 0x4e, 0x6a, 0xed, 0xf6, 0xfc, 0x31, -0xb9, 0x56, 0xd3, 0x36, 0x4d, 0x1a, 0x62, 0xf0, 0xd1, 0x2b, 0x53, 0xe9, -0x19, 0xaa, 0x3a, 0xdb, 0x91, 0xbb, 0x88, 0x5a, 0xac, 0x3e, 0xfb, 0x87, -0x0d, 0x7d, 0x58, 0xc9, 0xd4, 0x93, 0x5e, 0x92, 0xc7, 0x8e, 0x1c, 0x49, -0x8e, 0x8f, 0x4d, 0x2f, 0xe8, 0x1e, 0xf2, 0x05, 0xfd, 0x35, 0x1b, 0x94, -0x5b, 0x09, 0xca, 0x36, 0x2a, 0x68, 0x18, 0x69, 0x26, 0xfd, 0xd0, 0xd0, -0x2b, 0x5c, 0x41, 0x1f, 0x25, 0x5f, 0xa6, 0x64, 0xe4, 0xf4, 0xea, 0xda, -0x45, 0x9c, 0x15, 0x4a, 0xdb, 0x0e, 0xa2, 0xf5, 0xc9, 0x40, 0xa6, 0x02, -0x03, 0x1d, 0x09, 0x12, 0x88, 0x2a, 0x71, 0xda, 0xec, 0xbe, 0x92, 0x14, -0xba, 0x63, 0xab, 0x2b, 0xe4, 0x69, 0xc2, 0x2d, 0xf7, 0xeb, 0xa8, 0xc8, -0x29, 0xf9, 0x67, 0xe3, 0xee, 0xc3, 0x53, 0x1d, 0x8e, 0xc7, 0x1f, 0x7b, -0x0c, 0x21, 0x4a, 0xcf, 0x85, 0x52, 0x35, 0xfa, 0x15, 0xf5, 0x03, 0x33, -0xec, 0x54, 0xa0, 0x1d, 0x5b, 0x82, 0x2a, 0x77, 0x60, 0x86, 0x87, 0x1d, -0xbe, 0x61, 0x80, 0x84, 0xca, 0xea, 0x06, 0x9c, 0x8d, 0x48, 0xc4, 0x8b, -0x4b, 0x1a, 0xb1, 0xed, 0x62, 0x61, 0x9e, 0x10, 0x66, 0x17, 0xf6, 0x51, -0x81, 0x65, 0xc6, 0x14, 0xf1, 0x61, 0x96, 0x91, 0xaa, 0xba, 0xf2, 0xe0, -0xe1, 0x55, 0xa5, 0x6c, 0xfb, 0xb6, 0x61, 0xdb, 0xee, 0xed, 0x5a, 0xb6, -0x20, 0x11, 0x19, 0xde, 0xa8, 0x2c, 0xb3, 0x01, 0x0a, 0x51, 0xe6, 0x0d, -0x5b, 0x45, 0x9b, 0x0a, 0x06, 0x74, 0x18, 0x80, 0x04, 0x78, 0x14, 0x60, -0x60, 0xeb, 0x55, 0xb9, 0xa0, 0x57, 0x11, 0x3d, 0xe1, 0x88, 0x99, 0xb2, -0xe7, 0xe9, 0xb2, 0x93, 0x3f, 0xdf, 0x77, 0xd6, 0x2a, 0xde, 0xc8, 0xcc, -0xe9, 0xd3, 0x25, 0x40, 0x50, 0x0a, 0x19, 0x4a, 0x92, 0xa0, 0xa4, 0x1f, -0x29, 0xb6, 0x73, 0xf3, 0x86, 0x0d, 0xfd, 0x7b, 0xf7, 0x6e, 0x5f, 0xd0, -0xb8, 0x55, 0x7e, 0xc3, 0xc5, 0x0b, 0x17, 0x52, 0x29, 0x87, 0x13, 0xb8, -0xbb, 0x74, 0x97, 0x14, 0xeb, 0xb3, 0x0e, 0x12, 0x33, 0x33, 0x51, 0xdf, -0x08, 0xb7, 0x91, 0x47, 0x50, 0x91, 0xe4, 0x3f, 0xfd, 0xe4, 0x13, 0xda, -0xab, 0x32, 0x99, 0x81, 0x57, 0xef, 0x0f, 0x87, 0xc2, 0x9b, 0x6e, 0x50, -0x41, 0xef, 0x79, 0xd2, 0x21, 0x1d, 0xfc, 0x53, 0xda, 0xb6, 0x37, 0x54, -0x08, 0x97, 0x08, 0x61, 0x54, 0x30, 0xff, 0x6e, 0x53, 0x96, 0x54, 0x4f, -0x76, 0xd2, 0x03, 0x92, 0x9d, 0xd5, 0x32, 0x6e, 0x5c, 0x48, 0xdc, 0xec, -0x6b, 0xd3, 0x8d, 0xf7, 0x66, 0xa5, 0x59, 0xa7, 0x24, 0x88, 0x09, 0x1a, -0x42, 0xd8, 0xd8, 0xbf, 0x77, 0xef, 0x53, 0x4f, 0x3e, 0x09, 0x0c, 0x14, -0x12, 0x60, 0x0b, 0xb4, 0x50, 0xe1, 0xe7, 0x67, 0x90, 0xf9, 0x27, 0x9f, -0x7c, 0xfc, 0xd1, 0x47, 0xaf, 0xbf, 0xf6, 0xda, 0xd2, 0xab, 0x16, 0xe7, -0xa4, 0x3a, 0x53, 0xeb, 0xb5, 0x32, 0x53, 0x5b, 0xe3, 0x92, 0xbf, 0x74, -0x18, 0x30, 0x9e, 0x5a, 0x86, 0x03, 0x8b, 0x8a, 0xf6, 0xef, 0xdb, 0xc7, -0x85, 0xaa, 0x56, 0x1a, 0x63, 0x4a, 0xe7, 0x48, 0x81, 0x5c, 0xcf, 0x2e, -0x94, 0xc4, 0x8c, 0x49, 0x69, 0xde, 0x2f, 0xa9, 0x7e, 0x07, 0xde, 0xf8, -0xdd, 0x27, 0x4f, 0xaa, 0x0e, 0x7a, 0x72, 0x8e, 0x19, 0x21, 0x8a, 0x8f, -0x19, 0x18, 0x9a, 0x92, 0xee, 0x24, 0x80, 0x1c, 0x00, 0x7f, 0xf2, 0xf1, -0xc7, 0x3d, 0x0a, 0x0b, 0x19, 0xb6, 0xdf, 0xe5, 0x1b, 0x43, 0x5e, 0x76, -0x32, 0xf9, 0x2b, 0x74, 0x09, 0xaa, 0x0c, 0x2a, 0x44, 0x82, 0x32, 0xa1, -0x42, 0x0f, 0xfa, 0xd5, 0xc1, 0x10, 0xc2, 0xc0, 0x18, 0xbe, 0xf6, 0x24, -0x6f, 0xf7, 0xca, 0x85, 0x0b, 0x55, 0x15, 0x0f, 0xd5, 0x1e, 0x45, 0x36, -0x54, 0x7d, 0xcb, 0xb4, 0xfc, 0x6c, 0x20, 0x26, 0x5d, 0x49, 0x60, 0x28, -0x0a, 0xe7, 0xd0, 0x21, 0xbb, 0x6e, 0x6e, 0x4e, 0x86, 0xd3, 0x99, 0x96, -0x90, 0x90, 0x5b, 0x2d, 0xb3, 0x55, 0x93, 0xfc, 0xd6, 0x05, 0x4d, 0xf8, -0x69, 0x55, 0xd0, 0xa4, 0x79, 0xe3, 0x46, 0x8d, 0x6a, 0xd7, 0xe2, 0xa7, -0xa1, 0xfc, 0xd4, 0xaa, 0xc5, 0x99, 0x34, 0xbc, 0x73, 0xe6, 0x36, 0x9a, -0xb4, 0xd3, 0x5a, 0x2c, 0x01, 0x18, 0xed, 0x07, 0x4d, 0x62, 0xce, 0x69, -0x89, 0x09, 0x2d, 0x0b, 0x9a, 0xcc, 0xba, 0x64, 0xda, 0xfe, 0x3d, 0xbb, -0xdf, 0x78, 0xfd, 0x35, 0x5e, 0x19, 0x4c, 0x43, 0x0e, 0x2c, 0x07, 0x9d, -0xdb, 0xb6, 0x71, 0x66, 0xe4, 0xd0, 0x05, 0x66, 0xcc, 0x8e, 0x27, 0x63, -0x53, 0xaa, 0xb7, 0x2e, 0x68, 0x0c, 0xea, 0x38, 0x87, 0x03, 0x96, 0x28, -0x15, 0x07, 0x31, 0x1f, 0xbd, 0xfd, 0xd6, 0x5b, 0x6f, 0xbf, 0xf9, 0xe6, -0x3b, 0x6f, 0xbd, 0x25, 0x3f, 0xef, 0xbe, 0xfd, 0xb6, 0xfa, 0x71, 0xfd, -0xfa, 0xce, 0x3b, 0xd4, 0x9e, 0xba, 0xf3, 0xe4, 0x89, 0x3b, 0x4f, 0xdc, -0x41, 0x3b, 0xfa, 0x13, 0x77, 0x1c, 0xbf, 0x83, 0x22, 0x8a, 0x47, 0x0e, -0x77, 0x6e, 0xd7, 0xce, 0x05, 0x89, 0x79, 0xeb, 0x42, 0xdb, 0xee, 0xa4, -0x0b, 0xff, 0x56, 0xbc, 0x82, 0x65, 0xf4, 0x15, 0x15, 0x06, 0x75, 0x22, -0x64, 0x74, 0x09, 0x83, 0x40, 0xd5, 0x78, 0xe7, 0xe7, 0x38, 0xc8, 0xea, -0xe5, 0x64, 0x53, 0xd1, 0x15, 0x81, 0x44, 0xda, 0xb5, 0xa8, 0x7d, 0x57, -0xc9, 0x1b, 0x4a, 0x38, 0x31, 0x7f, 0x90, 0x4d, 0x57, 0x0e, 0xd9, 0xa7, -0x45, 0x49, 0x60, 0xcb, 0x99, 0x34, 0x66, 0x14, 0x24, 0x1e, 0xeb, 0x88, -0x49, 0x6b, 0xd4, 0xb1, 0xde, 0xa4, 0x1b, 0x1b, 0x4c, 0x5b, 0x5f, 0xbd, -0xcd, 0xc0, 0xf8, 0xd4, 0x9c, 0xd8, 0xc4, 0xd4, 0x58, 0x67, 0xba, 0x33, -0x35, 0x2b, 0xa7, 0x6e, 0x93, 0x82, 0x6e, 0xc3, 0x5a, 0xf7, 0x19, 0xdd, -0x71, 0xe0, 0x84, 0x6e, 0xc3, 0xa6, 0xf4, 0x1c, 0x79, 0x49, 0x9f, 0x09, -0x73, 0x46, 0x5e, 0xb3, 0x17, 0x3b, 0xac, 0x07, 0xc1, 0x8f, 0x39, 0x8f, -0xdc, 0xfc, 0x40, 0xb3, 0xa1, 0xb3, 0x9d, 0x35, 0xea, 0x27, 0xc4, 0x27, -0x26, 0x3b, 0x93, 0xd2, 0x12, 0xe3, 0x6b, 0xa4, 0x24, 0xb6, 0x6e, 0xd2, -0xa8, 0x7f, 0x8f, 0x6e, 0x97, 0x4e, 0x9a, 0xd8, 0xac, 0x7e, 0x5d, 0xee, -0xdb, 0x6f, 0xf6, 0xf5, 0x0c, 0xd2, 0xf2, 0xd0, 0xb7, 0x83, 0x56, 0xee, -0x8d, 0x8b, 0x89, 0x4d, 0x8f, 0x73, 0x54, 0x73, 0xc6, 0x95, 0xfd, 0x89, -0xcf, 0x70, 0x26, 0x7a, 0xfe, 0x49, 0xa3, 0xd4, 0xb3, 0x33, 0x49, 0xff, -0x49, 0x49, 0x74, 0xc6, 0xc7, 0x39, 0xc3, 0x0a, 0x12, 0x6e, 0x2c, 0xb3, -0x16, 0xa8, 0x80, 0x35, 0x9b, 0x78, 0x85, 0xca, 0x0e, 0x09, 0x61, 0xe6, -0x60, 0xa6, 0xb6, 0x5e, 0x57, 0xdc, 0xc2, 0x4e, 0x31, 0x67, 0xd6, 0x2c, -0x89, 0xa4, 0x00, 0x18, 0xd2, 0x53, 0x0b, 0x51, 0x81, 0x0d, 0x15, 0x84, -0x40, 0xe2, 0xee, 0x0e, 0x11, 0x87, 0x44, 0x22, 0x92, 0x7c, 0x7f, 0x76, -0x62, 0x0c, 0x44, 0xbb, 0x76, 0xec, 0xc8, 0x49, 0x4f, 0x21, 0x34, 0xa8, -0x7a, 0x8b, 0x9e, 0x63, 0x76, 0x3d, 0xdb, 0xfd, 0xe8, 0xdf, 0xbb, 0x1e, -0xfd, 0x07, 0x61, 0xe1, 0xed, 0x6f, 0xfd, 0xba, 0xe5, 0xc1, 0x7f, 0xe6, -0xef, 0xff, 0xa6, 0xce, 0x9e, 0x6f, 0xb3, 0x4a, 0x5c, 0xbd, 0x36, 0xfd, -0xd6, 0x50, 0x51, 0xbe, 0xdb, 0xef, 0xfb, 0xf3, 0x84, 0x9d, 0x4f, 0x0c, -0x59, 0xb6, 0xb3, 0xe3, 0xe8, 0x39, 0x35, 0x9b, 0x75, 0x4e, 0xad, 0x99, -0x9f, 0x9c, 0x55, 0xd7, 0x99, 0x9e, 0x4d, 0xc5, 0x83, 0xbe, 0x73, 0x6e, -0x50, 0x75, 0x38, 0x5b, 0x1c, 0xf8, 0x7a, 0xcc, 0x75, 0xfb, 0xfb, 0x8f, -0x9d, 0xd1, 0x77, 0xd4, 0xd4, 0x3e, 0x23, 0xa7, 0xf4, 0x1e, 0x3e, 0xb9, -0xfb, 0xd0, 0x09, 0x9d, 0x07, 0x8c, 0x29, 0x1c, 0x32, 0xa5, 0xd3, 0xd8, -0x05, 0x6d, 0x46, 0xcc, 0x69, 0x36, 0x78, 0x66, 0xc3, 0x7e, 0xd3, 0x6a, -0xf6, 0x98, 0x98, 0xd3, 0x75, 0x5c, 0xcd, 0x1e, 0x13, 0x1a, 0xf4, 0x9d, -0xc6, 0x37, 0x6d, 0x46, 0xcc, 0xed, 0x38, 0x66, 0x41, 0xcf, 0x99, 0xd7, -0xf5, 0x5f, 0x5c, 0x3c, 0x68, 0xe9, 0x8e, 0x61, 0xcb, 0x4b, 0x86, 0xaf, -0xd8, 0x35, 0x72, 0xe5, 0xee, 0x51, 0xab, 0xf6, 0xc0, 0xc7, 0xc2, 0x41, -0x97, 0xf0, 0x83, 0x57, 0x58, 0xa1, 0xc2, 0xe0, 0xb9, 0x0b, 0x55, 0xfe, -0x60, 0x20, 0xc4, 0xfc, 0x9d, 0x5f, 0x64, 0x36, 0xe9, 0x42, 0xa1, 0xc8, -0x0d, 0xeb, 0xd7, 0x11, 0x3f, 0x8b, 0xb9, 0x1a, 0xd3, 0x8d, 0x04, 0xa5, -0x02, 0x0f, 0x91, 0x37, 0x2c, 0x0f, 0xfe, 0xc4, 0x21, 0x62, 0x09, 0x48, -0x40, 0x35, 0xf8, 0xd1, 0x73, 0xcf, 0xed, 0xdf, 0xb7, 0xb7, 0x3f, 0x35, -0xff, 0x1c, 0x54, 0xfd, 0x6b, 0x34, 0xf4, 0x86, 0xdb, 0xc1, 0x80, 0xdf, -0x74, 0x6f, 0xff, 0xc2, 0xb4, 0xed, 0xdf, 0x37, 0xdc, 0xfb, 0xcf, 0xb6, -0x07, 0xff, 0xde, 0xf9, 0xe0, 0xe7, 0x53, 0xf6, 0x3f, 0xef, 0x46, 0xb0, -0x39, 0x4f, 0x42, 0x9f, 0xe9, 0xa7, 0xaa, 0x5b, 0xcf, 0xed, 0x2f, 0x42, -0x40, 0x67, 0xda, 0x94, 0xa0, 0x3c, 0xa2, 0x22, 0x4c, 0xf0, 0xa0, 0xd6, -0x71, 0xc2, 0x9e, 0x67, 0x9d, 0x35, 0x5c, 0x52, 0x47, 0xc7, 0x56, 0xcd, -0xbb, 0xb6, 0x6f, 0xdb, 0xb3, 0x53, 0x87, 0x51, 0x83, 0x07, 0x4d, 0x1e, -0x37, 0x66, 0xe2, 0x98, 0x51, 0xf3, 0x2e, 0x9b, 0xbd, 0x7c, 0xc9, 0x92, -0xa5, 0x57, 0x5d, 0x75, 0xc3, 0x75, 0xd7, 0x6d, 0xb9, 0xf9, 0xe6, 0x6b, -0xae, 0xbe, 0x7a, 0xd9, 0x92, 0x25, 0x2b, 0x96, 0x2e, 0x5d, 0x72, 0xe5, -0x95, 0xd3, 0x27, 0x4f, 0x9c, 0x34, 0x66, 0xf4, 0xa4, 0xb1, 0xa3, 0x39, -0xad, 0xa8, 0x7b, 0xb7, 0x6e, 0xed, 0x5a, 0xe7, 0x56, 0xcb, 0x60, 0x79, -0x63, 0x12, 0x52, 0x6a, 0xf6, 0xbd, 0x74, 0x64, 0xc9, 0x33, 0xcd, 0xf7, -0xfb, 0x91, 0xda, 0x1f, 0x25, 0xd3, 0xca, 0x58, 0x01, 0xfb, 0xa8, 0x40, -0x1b, 0x2b, 0x6b, 0x99, 0x0d, 0x2b, 0xc1, 0xc9, 0xb0, 0xb5, 0x34, 0xd9, -0xf5, 0xc5, 0x80, 0x79, 0x37, 0xb6, 0xef, 0x3d, 0x3c, 0xbf, 0x63, 0xdf, -0xf4, 0x7a, 0xad, 0x1c, 0x09, 0x69, 0x90, 0xb7, 0xc3, 0x41, 0x55, 0x7c, -0x0f, 0x87, 0x9c, 0xc0, 0x4f, 0x7c, 0x4a, 0xcd, 0xfc, 0x86, 0xed, 0xfb, -0x76, 0x19, 0x7f, 0xf9, 0x88, 0x35, 0xb7, 0x4d, 0xde, 0xfb, 0x5c, 0xb3, -0x7d, 0x9e, 0x14, 0x83, 0x80, 0x76, 0x35, 0x5f, 0x9c, 0xf7, 0xd1, 0x1b, -0xd9, 0x5d, 0x01, 0x3b, 0x96, 0x59, 0x44, 0x02, 0x78, 0x85, 0x1b, 0x54, -0x84, 0x1b, 0xa3, 0x30, 0x2f, 0x5c, 0x5a, 0xf1, 0x77, 0x0d, 0xf6, 0x7c, -0xdd, 0x66, 0xff, 0x97, 0x85, 0x07, 0xff, 0x32, 0xe5, 0xc0, 0x4b, 0x63, -0x77, 0x3e, 0x3d, 0x68, 0xeb, 0xe3, 0xed, 0x57, 0x9e, 0x68, 0x74, 0x59, -0x49, 0x87, 0xeb, 0x4e, 0x0f, 0xda, 0xf2, 0xd8, 0xb8, 0x5d, 0xcf, 0x4c, -0x39, 0xf0, 0x22, 0xe2, 0x4a, 0x87, 0x83, 0x5f, 0x22, 0xae, 0xd4, 0xdd, -0xfd, 0x4d, 0x4a, 0xb1, 0x2b, 0xe4, 0x3b, 0xfa, 0x13, 0xaa, 0x2b, 0x60, -0x42, 0x85, 0x38, 0x49, 0x8d, 0x36, 0x28, 0xf7, 0x12, 0x54, 0xf4, 0xdd, -0x47, 0x57, 0x20, 0xec, 0x56, 0xc0, 0x2b, 0x2a, 0x8e, 0x1f, 0x3f, 0x8e, -0x12, 0x69, 0xc5, 0x2b, 0xc2, 0x6e, 0x2d, 0xa2, 0xbb, 0x7b, 0x74, 0x05, -0xdc, 0x78, 0xf1, 0x8c, 0xbc, 0x22, 0x8a, 0x8a, 0x50, 0x15, 0x03, 0xa2, -0x24, 0xee, 0xf7, 0x0a, 0xd8, 0xe4, 0x15, 0xc4, 0x90, 0x9a, 0xf4, 0x8a, -0x28, 0xaf, 0x88, 0xae, 0x40, 0x98, 0xae, 0x80, 0x86, 0x0a, 0xd2, 0x80, -0x55, 0x21, 0x7a, 0xa3, 0x5e, 0x01, 0x2a, 0x60, 0x22, 0x65, 0xec, 0x2f, -0x9b, 0xfd, 0x77, 0x39, 0x45, 0x77, 0xdf, 0xe8, 0x0a, 0x54, 0xe9, 0x15, -0xf0, 0x8a, 0x0a, 0x91, 0xa0, 0x04, 0x15, 0xb1, 0xb1, 0x84, 0xa2, 0xfd, -0x70, 0x6c, 0x0a, 0xb3, 0xde, 0xb2, 0x61, 0xba, 0xed, 0xf9, 0x2d, 0x45, -0x44, 0xec, 0x85, 0x10, 0xf6, 0x0f, 0x07, 0x04, 0x6f, 0xcd, 0x2b, 0x74, -0x54, 0xe4, 0xe4, 0xe4, 0x94, 0xa2, 0x62, 0xe5, 0x27, 0x55, 0x1a, 0xee, -0x11, 0xfb, 0x52, 0xa3, 0x0f, 0x1e, 0xe0, 0x0a, 0x40, 0xd8, 0x3f, 0x1c, -0x35, 0x6a, 0xd4, 0x70, 0x8b, 0x0a, 0x89, 0xbb, 0x84, 0x57, 0x74, 0xeb, -0xd6, 0xad, 0x14, 0x15, 0x13, 0x8e, 0x44, 0x51, 0x11, 0x5d, 0x81, 0x30, -0x5c, 0x01, 0x08, 0xfb, 0x87, 0xa3, 0x73, 0xe7, 0xce, 0x82, 0x0a, 0x42, -0x7e, 0x88, 0x88, 0xa3, 0x73, 0xea, 0xc5, 0xfc, 0x0a, 0x78, 0x85, 0xa0, -0x82, 0x3f, 0x2c, 0x59, 0xb2, 0xa4, 0x14, 0x15, 0x05, 0x83, 0xc2, 0x70, -0x45, 0x02, 0xdc, 0x66, 0xa2, 0x97, 0x87, 0xc1, 0x0a, 0x14, 0x0c, 0x4a, -0x4b, 0x23, 0x94, 0xc1, 0x75, 0x2c, 0x58, 0xb0, 0x40, 0x5a, 0xe6, 0x5a, -0xa0, 0x82, 0x70, 0x51, 0x80, 0x42, 0x00, 0x29, 0x2d, 0x1d, 0xca, 0x28, -0xdc, 0xb3, 0x1f, 0x8d, 0x02, 0x23, 0xba, 0x02, 0x61, 0xb5, 0x02, 0x90, -0xb4, 0x76, 0xdc, 0x79, 0xe7, 0x9d, 0xc4, 0x86, 0x4a, 0xf4, 0x34, 0xe1, -0xa1, 0xa5, 0xbc, 0xe2, 0x8e, 0x3b, 0xee, 0x90, 0xbe, 0x04, 0xe4, 0x1b, -0x00, 0x9a, 0x1e, 0x3d, 0x7a, 0x94, 0x5e, 0x95, 0xdd, 0xd4, 0x71, 0x53, -0x68, 0x16, 0x12, 0x0d, 0x83, 0x2d, 0x2d, 0xfa, 0x08, 0x41, 0x5f, 0x01, -0x88, 0x39, 0xbb, 0xe9, 0x94, 0x29, 0x53, 0x84, 0xc2, 0x11, 0x9f, 0xa4, -0x6b, 0xae, 0xca, 0xfe, 0x2d, 0x45, 0xc5, 0x89, 0x13, 0x27, 0xa4, 0x03, -0x39, 0xee, 0x6d, 0x40, 0x83, 0x40, 0x55, 0x86, 0x5d, 0xe4, 0x17, 0x45, -0x81, 0x11, 0x56, 0x9b, 0x65, 0xd0, 0x49, 0x2d, 0x54, 0x06, 0x04, 0x12, -0xf9, 0x45, 0x57, 0x5e, 0x79, 0xa5, 0x22, 0xef, 0xdd, 0xbb, 0x77, 0x93, -0xc1, 0x4f, 0x75, 0x46, 0x55, 0x9d, 0x9e, 0x6c, 0xed, 0x8b, 0x7a, 0x05, -0xa8, 0x20, 0x8d, 0x86, 0x00, 0x41, 0x8c, 0xb3, 0x14, 0xbf, 0xe0, 0xa4, -0x69, 0xd3, 0xa6, 0x95, 0x01, 0x06, 0x1c, 0x23, 0x2a, 0x4a, 0x85, 0xca, -0xbb, 0x8f, 0xce, 0xd3, 0x72, 0x05, 0x20, 0xe0, 0xec, 0xa6, 0x3a, 0x24, -0xc6, 0x8d, 0x1b, 0xf7, 0xca, 0x2b, 0xaf, 0xd0, 0x2b, 0x59, 0xda, 0x83, -0x48, 0x67, 0x9f, 0x32, 0xa8, 0x20, 0xf5, 0x0c, 0x85, 0x1b, 0xd5, 0x82, -0x3f, 0x53, 0x64, 0x05, 0x00, 0x75, 0xed, 0xda, 0xb5, 0x0c, 0x30, 0xf8, -0x05, 0xe5, 0x1b, 0xe5, 0x1d, 0xab, 0x56, 0xd4, 0x8f, 0x11, 0xa5, 0xbc, -0xaa, 0xbf, 0x02, 0xf8, 0xa0, 0x21, 0x54, 0xc8, 0x15, 0xa2, 0x85, 0x74, -0x1d, 0x0e, 0x25, 0x38, 0xf1, 0xb9, 0x53, 0xa7, 0x4e, 0xcf, 0x3c, 0xf3, -0xcc, 0xeb, 0xaf, 0xbf, 0x2e, 0x1d, 0xd6, 0xa5, 0x51, 0x28, 0x10, 0x40, -0x50, 0xba, 0xc8, 0x2b, 0x4e, 0x9e, 0x3c, 0x29, 0x4d, 0x09, 0x10, 0xa2, -0xd0, 0x39, 0x50, 0x2d, 0x48, 0x41, 0xa6, 0x21, 0x50, 0x17, 0x57, 0xd9, -0x08, 0x37, 0x47, 0x8c, 0xe6, 0xec, 0x73, 0x7b, 0x52, 0xf4, 0x0f, 0xd1, -0x15, 0xa8, 0x12, 0x2b, 0xa0, 0x2c, 0x4e, 0x32, 0x9b, 0xf6, 0xed, 0xdb, -0x9f, 0x3d, 0x7b, 0x16, 0x0a, 0xa7, 0x86, 0x2f, 0xed, 0x41, 0xd0, 0x1a, -0xa4, 0xa4, 0x10, 0x10, 0x28, 0x45, 0x05, 0x6a, 0xb8, 0xea, 0x61, 0x23, -0xf1, 0xe4, 0x9c, 0x4a, 0xea, 0x26, 0xcd, 0xe3, 0xe0, 0x32, 0x55, 0xe2, -0xb1, 0xa2, 0x93, 0x88, 0xae, 0x40, 0x90, 0x56, 0x60, 0xc4, 0x88, 0x11, -0x18, 0x5a, 0x9f, 0x7d, 0xf6, 0x59, 0x69, 0x79, 0xa5, 0x7a, 0x85, 0x12, -0xde, 0x81, 0x1e, 0x81, 0x36, 0x71, 0x91, 0x57, 0x80, 0x0a, 0x55, 0x1f, -0x0e, 0xc4, 0xc0, 0x2e, 0xe0, 0x29, 0xb8, 0x36, 0x68, 0x1e, 0xf7, 0xe2, -0x8b, 0x2f, 0x6e, 0xdb, 0xb6, 0xad, 0x79, 0x7b, 0x57, 0x79, 0xac, 0xe8, -0x11, 0x5d, 0x81, 0x90, 0x5e, 0x81, 0xc6, 0xad, 0x3a, 0xae, 0x5b, 0xb7, -0xee, 0xd1, 0x47, 0x1f, 0x7d, 0xfa, 0xe9, 0xa7, 0xd1, 0x28, 0xd8, 0xf7, -0xd9, 0xfd, 0x51, 0xa4, 0x55, 0x17, 0x38, 0x24, 0xa6, 0x32, 0xa8, 0x90, -0x5a, 0xa2, 0x68, 0x17, 0xd2, 0x21, 0x53, 0xb4, 0x0b, 0xe4, 0xa8, 0x37, -0xdf, 0x7c, 0x93, 0xeb, 0x9f, 0x7e, 0xe6, 0xb9, 0x8d, 0xdb, 0xf7, 0xf6, -0x9f, 0x38, 0x3b, 0x35, 0xbf, 0x5b, 0x5c, 0x5a, 0x0d, 0x47, 0x54, 0x7c, -0x0a, 0x69, 0xea, 0x88, 0x9c, 0xc9, 0xd3, 0xaf, 0x24, 0x2d, 0x3b, 0xa5, -0x51, 0xe7, 0x6e, 0xa3, 0x2e, 0x5d, 0xbb, 0xb9, 0xf8, 0xfe, 0x87, 0x1e, -0x79, 0xe2, 0x89, 0x27, 0x9e, 0x7b, 0xee, 0x39, 0x48, 0x1a, 0x83, 0xac, -0x68, 0x14, 0x52, 0xe4, 0x45, 0xca, 0x31, 0x02, 0x01, 0x38, 0x84, 0x8b, -0x57, 0xa4, 0xa4, 0xa4, 0xdc, 0x75, 0xd7, 0x5d, 0x52, 0x32, 0x9e, 0xea, -0x46, 0x98, 0x68, 0x55, 0xc5, 0x34, 0x74, 0x73, 0x38, 0x06, 0x90, 0x42, -0x29, 0x79, 0xe9, 0xa5, 0x97, 0x9e, 0x7c, 0xfa, 0xb9, 0xfb, 0x1e, 0x7d, -0xf2, 0xde, 0x87, 0xce, 0xdd, 0xf3, 0xe0, 0x23, 0x77, 0xdd, 0x77, 0xf6, -0xce, 0x33, 0x0f, 0xde, 0x79, 0xef, 0x03, 0xfc, 0x9c, 0x3c, 0x7d, 0xbf, -0x4f, 0x3f, 0x27, 0xee, 0xb9, 0xcf, 0x8f, 0x9f, 0x3b, 0x4e, 0x9d, 0xf1, -0xfa, 0x73, 0xfc, 0xee, 0x7b, 0x0d, 0xe7, 0xf0, 0x8d, 0xd7, 0x9f, 0xdb, -0xef, 0x3a, 0xed, 0xf5, 0xe7, 0xb6, 0x3b, 0xef, 0x31, 0x9c, 0xc3, 0x37, -0x5e, 0x7f, 0x8e, 0x9d, 0x3c, 0x65, 0x38, 0x87, 0x6f, 0x82, 0xf5, 0xe3, -0xf5, 0xee, 0x96, 0x73, 0xf6, 0xfa, 0xa4, 0x9c, 0x60, 0x58, 0x31, 0xf3, -0x37, 0x96, 0x4b, 0x6a, 0x5e, 0x79, 0xaf, 0xef, 0x8b, 0x13, 0xec, 0x53, -0x82, 0x7d, 0x1a, 0x13, 0xb2, 0x74, 0xd1, 0xe7, 0x99, 0x07, 0xef, 0xbe, -0xff, 0xa1, 0x53, 0xf7, 0x3f, 0x7c, 0xf6, 0x91, 0x73, 0x4f, 0x3e, 0xf9, -0x24, 0x78, 0x40, 0xf6, 0x41, 0x70, 0x12, 0x48, 0x48, 0x27, 0x17, 0x78, -0x80, 0xc8, 0x4e, 0x52, 0xa1, 0xb4, 0x14, 0x15, 0x77, 0xdf, 0x7d, 0xb7, -0x74, 0x67, 0x13, 0x76, 0xa1, 0x3c, 0x7a, 0x30, 0x17, 0x38, 0x06, 0x9e, -0x3f, 0xac, 0x57, 0xe8, 0x25, 0x0c, 0x87, 0xa6, 0xf1, 0xfc, 0xf3, 0xcf, -0x33, 0x3a, 0x3c, 0xe8, 0xa9, 0xa7, 0xa8, 0x16, 0xe9, 0x3a, 0xc0, 0x9f, -0x4f, 0x07, 0xed, 0xdf, 0xfd, 0x38, 0x1e, 0xf3, 0xeb, 0x38, 0x67, 0xfb, -0x80, 0xb1, 0xfa, 0x74, 0x20, 0x9b, 0xfa, 0x71, 0x3c, 0x1c, 0x8c, 0xc3, -0xfe, 0x7d, 0x7d, 0x7a, 0x22, 0x75, 0xb2, 0xed, 0x35, 0x2b, 0x73, 0xa2, -0x5f, 0xef, 0xe7, 0x31, 0x3b, 0x94, 0xe0, 0x13, 0x75, 0x71, 0xb2, 0x90, -0x25, 0xf4, 0xc9, 0x81, 0xa1, 0x09, 0x72, 0x45, 0xb1, 0x66, 0x5b, 0x87, -0x80, 0x51, 0x0a, 0xde, 0x7f, 0xff, 0x7d, 0x20, 0x21, 0x4d, 0xa5, 0x45, -0x76, 0xd2, 0xdb, 0x85, 0xc2, 0x21, 0x2e, 0xf2, 0x0a, 0x41, 0x85, 0x54, -0x4a, 0x95, 0x6a, 0xbb, 0x62, 0xa5, 0x45, 0x31, 0xe7, 0x4a, 0x4c, 0x52, -0xb4, 0x66, 0x63, 0x20, 0x86, 0x03, 0x64, 0x6f, 0xbc, 0xf1, 0x06, 0xa3, -0xc3, 0x83, 0x40, 0x08, 0x77, 0xe2, 0x00, 0x7f, 0x3e, 0x1d, 0x4c, 0xd1, -0x8f, 0x03, 0x34, 0xfa, 0x71, 0xfc, 0xc8, 0xf6, 0xc1, 0xda, 0xf9, 0x74, -0xa0, 0xae, 0xf9, 0x71, 0xf0, 0x92, 0x02, 0x3f, 0xec, 0xdf, 0xd7, 0xa7, -0x27, 0x52, 0x27, 0xdb, 0x5e, 0xb3, 0x32, 0x27, 0xfa, 0xf1, 0x76, 0xb8, -0xc4, 0x0e, 0x25, 0xf8, 0x44, 0x5d, 0x9c, 0x2c, 0x64, 0x09, 0x7d, 0x72, -0xfc, 0xf8, 0xc7, 0x3f, 0x86, 0x5c, 0x51, 0x04, 0xd8, 0xd6, 0x21, 0x60, -0x64, 0x1f, 0xdc, 0x71, 0x70, 0x09, 0x81, 0x84, 0xd8, 0x9d, 0x44, 0x76, -0x82, 0xf8, 0x41, 0x01, 0xa8, 0x40, 0x7a, 0x72, 0x49, 0x50, 0xa0, 0x42, -0xba, 0x51, 0x29, 0x39, 0x4a, 0xfa, 0x77, 0x00, 0x0c, 0xae, 0xc4, 0x94, -0x8b, 0x3f, 0x1c, 0x09, 0x0c, 0x6c, 0xe0, 0x1b, 0x47, 0xd9, 0x80, 0x75, -0xe0, 0xd0, 0x40, 0xb2, 0x02, 0x24, 0x1e, 0x0e, 0xe6, 0xe1, 0xf7, 0x01, -0xa6, 0x83, 0x72, 0xb0, 0x1c, 0x36, 0x0f, 0xd0, 0xee, 0xd3, 0x81, 0x54, -0x19, 0x94, 0x83, 0x77, 0x66, 0xe7, 0xf0, 0xef, 0x5e, 0x3e, 0x3d, 0x91, -0x3a, 0xd9, 0xe6, 0x8a, 0x19, 0x4e, 0x0b, 0xca, 0xfb, 0x62, 0x10, 0xfb, -0x34, 0xe3, 0x99, 0xfc, 0xa0, 0x4f, 0x0e, 0x90, 0x00, 0xb9, 0x02, 0x06, -0x44, 0x1e, 0xf0, 0x00, 0x8b, 0xc0, 0x0e, 0x8b, 0xe0, 0x04, 0x61, 0x2b, -0x75, 0x42, 0xef, 0x07, 0x02, 0x16, 0x8c, 0xa8, 0x30, 0x00, 0x03, 0x8e, -0x01, 0x7f, 0x41, 0xf0, 0x12, 0x6c, 0x00, 0x2f, 0x46, 0x04, 0x67, 0x0c, -0x0d, 0x42, 0xb8, 0x07, 0x2a, 0xbc, 0xd7, 0x03, 0x20, 0xa9, 0x73, 0xf8, -0x1c, 0xc4, 0x83, 0xe7, 0x0c, 0xca, 0x01, 0x1b, 0xf4, 0xe3, 0x60, 0xa1, -0x83, 0x72, 0xb0, 0xcb, 0xd8, 0x39, 0xfc, 0xbb, 0x97, 0x1f, 0xcf, 0x65, -0x79, 0x49, 0x50, 0xd6, 0x59, 0x7a, 0x6b, 0xf8, 0x7d, 0xe8, 0x54, 0xe4, -0x95, 0xea, 0x38, 0x01, 0xfa, 0xe4, 0x40, 0x37, 0x86, 0x5c, 0xd9, 0xd3, -0x21, 0x5d, 0x34, 0x02, 0x72, 0x25, 0x90, 0x80, 0x88, 0xe1, 0x90, 0x86, -0x07, 0x4a, 0x9d, 0x50, 0xad, 0x1a, 0x8c, 0xa8, 0x10, 0x76, 0xa1, 0x03, -0x43, 0x74, 0x0c, 0x98, 0x06, 0xd8, 0x00, 0x58, 0xb8, 0x32, 0x18, 0x11, -0x78, 0x30, 0x34, 0x08, 0x91, 0x83, 0x3b, 0x05, 0x7e, 0xc0, 0x8b, 0x18, -0x84, 0xff, 0xe5, 0xd0, 0x3f, 0xab, 0x2f, 0x03, 0xf9, 0xc0, 0x8a, 0xc8, -0xa1, 0x06, 0x51, 0xdf, 0x04, 0xf8, 0x01, 0xf1, 0xb2, 0x6a, 0x1e, 0x01, -0x3e, 0x97, 0xe1, 0x72, 0xd6, 0xcd, 0xc3, 0x1a, 0x06, 0xf2, 0x6a, 0xcc, -0xd7, 0xca, 0xdb, 0x0f, 0x9c, 0xa8, 0x84, 0x3e, 0x61, 0x0b, 0x90, 0x2b, -0x86, 0x26, 0x48, 0x17, 0x02, 0x66, 0x8b, 0x07, 0x0f, 0xd8, 0x93, 0x20, -0x6c, 0x33, 0x24, 0x80, 0x80, 0x05, 0x2a, 0x0c, 0xc0, 0x90, 0xbe, 0x4f, -0xaa, 0x25, 0x8f, 0x74, 0x21, 0x01, 0x21, 0x8c, 0x0b, 0x48, 0xe4, 0xe0, -0x36, 0xc1, 0x3a, 0x40, 0xb0, 0x1c, 0x6a, 0x40, 0x9f, 0xbe, 0x51, 0x27, -0x07, 0xf2, 0x81, 0x85, 0x53, 0x97, 0xf3, 0x59, 0x0e, 0x3b, 0xdf, 0xa8, -0x93, 0xab, 0xc8, 0x07, 0x3b, 0x73, 0xf6, 0x70, 0x4e, 0x20, 0x6b, 0x68, -0x79, 0xad, 0xaf, 0xef, 0x34, 0x70, 0xa2, 0x52, 0x24, 0x2a, 0xe5, 0x83, -0xa5, 0xb1, 0x81, 0x2a, 0xb0, 0x0d, 0x61, 0x4b, 0xfd, 0x79, 0xe1, 0x12, -0xaa, 0x63, 0x89, 0x35, 0x2a, 0x74, 0x60, 0xa8, 0x86, 0x3d, 0x7a, 0xab, -0x1e, 0xe9, 0xd3, 0xa3, 0x0e, 0x77, 0x85, 0x8a, 0xcb, 0xe9, 0x7b, 0xa9, -0x7f, 0xac, 0x17, 0x48, 0x0e, 0xf0, 0x1b, 0x75, 0x79, 0xe0, 0x1f, 0xa4, -0x2a, 0x33, 0x2f, 0x40, 0x0e, 0x69, 0x1c, 0xa1, 0x0e, 0xfd, 0x57, 0x39, -0x33, 0xf0, 0x6f, 0x0c, 0x73, 0x66, 0x40, 0x28, 0xc0, 0xce, 0xe1, 0x6e, -0x86, 0x32, 0x82, 0xfa, 0xab, 0xde, 0x22, 0xc3, 0xe6, 0x3a, 0xab, 0x47, -0x93, 0x41, 0xd4, 0x64, 0x0c, 0xab, 0xe1, 0xa1, 0xc4, 0x75, 0xb0, 0x28, -0x47, 0xa7, 0x52, 0x29, 0x20, 0x2f, 0xc5, 0xe4, 0xd9, 0xe5, 0x05, 0x12, -0xd2, 0xab, 0xc4, 0xd0, 0xc4, 0xc7, 0x2d, 0x2a, 0xa4, 0xa9, 0x8f, 0x92, -0xa6, 0xdc, 0x75, 0x76, 0x93, 0x0e, 0x3a, 0x15, 0x7c, 0x48, 0xb3, 0x08, -0xd5, 0xe3, 0x47, 0xb5, 0x8f, 0xa8, 0xdc, 0x6f, 0x78, 0xf7, 0xe8, 0x06, -0x58, 0x03, 0x89, 0xa2, 0xd9, 0xb4, 0x69, 0xd3, 0x9a, 0x35, 0x6b, 0x1e, -0x78, 0xe0, 0x01, 0xd5, 0x13, 0x43, 0xcd, 0x59, 0x26, 0xa9, 0xff, 0xea, -0xf7, 0x67, 0xd5, 0xe2, 0x48, 0xad, 0x06, 0xc1, 0x6c, 0xab, 0x57, 0xaf, -0xbe, 0xee, 0xba, 0xeb, 0xae, 0xbf, 0xfe, 0xfa, 0x1b, 0x6e, 0xb8, 0x81, -0x39, 0xac, 0x5d, 0xbb, 0x16, 0x57, 0xee, 0x86, 0x0d, 0x1b, 0x6e, 0xbe, -0xf9, 0xe6, 0xcd, 0x9b, 0x37, 0x6f, 0xd9, 0xb2, 0x65, 0xeb, 0xd6, 0xad, -0xdb, 0xb7, 0x6f, 0xdf, 0xb1, 0x63, 0xc7, 0xce, 0x9d, 0x3b, 0xd1, 0x41, -0x65, 0x86, 0x22, 0x0e, 0x60, 0x57, 0xe5, 0xfc, 0xf5, 0xeb, 0xd7, 0x1f, -0x3a, 0x74, 0xe8, 0xbe, 0xfb, 0xee, 0xc3, 0xba, 0xc4, 0x09, 0x88, 0x31, -0x90, 0xaf, 0xf9, 0x5e, 0xe6, 0x6f, 0x20, 0x7a, 0x14, 0x4e, 0xcc, 0x06, -0xf7, 0xdf, 0x7f, 0xff, 0xae, 0x5d, 0xbb, 0x96, 0x2f, 0x5f, 0xbe, 0x7f, -0xff, 0x7e, 0xa6, 0xc1, 0x04, 0xf8, 0x95, 0x04, 0x1e, 0x2c, 0xd2, 0xd8, -0x85, 0x58, 0x25, 0xe4, 0x19, 0xa1, 0xcb, 0x0a, 0xa3, 0x1c, 0x44, 0x5c, -0x0c, 0x53, 0x38, 0xad, 0x59, 0x0a, 0xe6, 0xc3, 0x6b, 0x92, 0xbe, 0x81, -0x96, 0x7d, 0x34, 0xbd, 0xa0, 0xc2, 0x80, 0x0d, 0xbd, 0x3f, 0xa7, 0xb9, -0x73, 0x94, 0xbb, 0x6f, 0xf4, 0x3e, 0x40, 0x3a, 0x41, 0x48, 0xc8, 0x3a, -0x3a, 0x10, 0x12, 0x24, 0x9f, 0xcd, 0xb4, 0x2e, 0xdc, 0xcd, 0xb2, 0xab, -0x90, 0x87, 0x7e, 0x2b, 0x41, 0xfc, 0x93, 0x34, 0x6d, 0x51, 0x44, 0xc3, -0x8b, 0x64, 0x71, 0x31, 0xf3, 0x41, 0x31, 0x7b, 0xf6, 0xec, 0x81, 0xfe, -0x66, 0xce, 0x9c, 0x39, 0x60, 0xc0, 0x80, 0x96, 0x2d, 0x5b, 0x56, 0xab, -0x56, 0xcd, 0xd2, 0x59, 0x3c, 0x64, 0xc8, 0x10, 0xd5, 0xd2, 0xdb, 0xb2, -0x59, 0x8c, 0xde, 0x1a, 0xc6, 0x40, 0x67, 0xfa, 0x7d, 0xb9, 0x35, 0xd6, -0x0e, 0xee, 0x0e, 0xd9, 0xf1, 0x41, 0x35, 0xd6, 0x50, 0x18, 0xc3, 0x1e, -0xd8, 0xa6, 0x4d, 0x1b, 0x3f, 0x1c, 0xd6, 0x57, 0x5f, 0x7d, 0xb5, 0x6c, -0xcc, 0x13, 0x27, 0x4e, 0xf4, 0x70, 0x79, 0x7c, 0x7c, 0x7c, 0x66, 0x66, -0x66, 0x5e, 0x5e, 0x5e, 0xfd, 0xfa, 0xf5, 0x1b, 0x37, 0x6e, 0x9c, 0x9f, -0x9f, 0xdf, 0xa4, 0x49, 0x13, 0xfe, 0x6f, 0x44, 0xdb, 0xa6, 0xda, 0xb5, -0xab, 0x57, 0xaf, 0x9e, 0x98, 0x48, 0xd7, 0x03, 0xdf, 0x0e, 0x06, 0x6c, -0xd0, 0xa0, 0x01, 0x51, 0x7a, 0x45, 0x45, 0x45, 0xe3, 0xc7, 0x8f, 0xbf, -0xec, 0xb2, 0xcb, 0xc8, 0x75, 0x23, 0x1a, 0x75, 0xf8, 0xf0, 0xe1, 0x33, -0x66, 0xcc, 0x58, 0xb1, 0x62, 0x05, 0x30, 0x3e, 0x7c, 0xf8, 0x30, 0x18, -0x03, 0x4b, 0xa8, 0xe9, 0xc8, 0xa5, 0x86, 0xcd, 0x45, 0x7a, 0x9a, 0xa9, -0x96, 0x7f, 0xe2, 0x83, 0xc6, 0xd4, 0x0b, 0x02, 0xa1, 0xfe, 0xb9, 0x73, -0xe7, 0x0e, 0x1a, 0x34, 0xa8, 0x69, 0xd3, 0xa6, 0x96, 0x73, 0x23, 0x51, -0x02, 0xd6, 0xc1, 0xe5, 0xe6, 0x7e, 0x88, 0xb6, 0x50, 0xa1, 0xb7, 0x87, -0x33, 0x34, 0x83, 0xf3, 0xfa, 0xab, 0xd8, 0x79, 0xb1, 0x56, 0x9d, 0x3e, -0x7d, 0x9a, 0xad, 0x6b, 0xd2, 0xa4, 0x49, 0x85, 0x85, 0x85, 0xb5, 0x6a, -0xd5, 0x8a, 0x8b, 0x33, 0xd6, 0xfd, 0x66, 0xdd, 0x1b, 0x36, 0x6c, 0x38, -0x70, 0xe0, 0xc0, 0x95, 0x2b, 0x57, 0xb2, 0x10, 0x32, 0x63, 0x5d, 0xe6, -0xf3, 0x7a, 0xaf, 0xa0, 0x9f, 0x80, 0x51, 0x81, 0x7d, 0x85, 0x17, 0x46, -0x79, 0x87, 0x7a, 0xf5, 0xea, 0x99, 0xe7, 0x6c, 0x87, 0x0a, 0xa6, 0x4f, -0x9f, 0x0e, 0xcd, 0x89, 0xe1, 0x4f, 0x9f, 0xa1, 0x6c, 0x31, 0x6a, 0xcb, -0x40, 0x11, 0xc4, 0x80, 0x88, 0x63, 0x14, 0x63, 0x79, 0x49, 0x49, 0xc9, -0xb5, 0xd7, 0x5e, 0x0b, 0x95, 0x10, 0xc4, 0x46, 0xa6, 0x18, 0x84, 0x98, -0x94, 0x94, 0xa4, 0xdf, 0x2b, 0x23, 0x23, 0x83, 0x20, 0x7f, 0x08, 0x1a, -0x63, 0xbc, 0x6c, 0x34, 0x16, 0x31, 0xff, 0x76, 0x26, 0x77, 0xe1, 0x1c, -0xf8, 0xc6, 0xe2, 0xc5, 0x8b, 0x6d, 0x9f, 0x5e, 0x99, 0x27, 0xb2, 0x0e, -0x75, 0xeb, 0xd6, 0x05, 0x48, 0xd0, 0x09, 0x64, 0x4d, 0xd2, 0x9c, 0x02, -0x06, 0x8b, 0x89, 0x4f, 0xba, 0x4e, 0x9d, 0x3a, 0xf6, 0xe7, 0xb7, 0x6a, -0xd5, 0x2a, 0x71, 0x53, 0x18, 0x80, 0xe1, 0x33, 0x2a, 0xec, 0x34, 0xa5, -0x15, 0xd1, 0x0b, 0x3e, 0x00, 0xd0, 0x99, 0x3a, 0xf4, 0x64, 0x7f, 0xa2, -0xea, 0x4c, 0x9c, 0x8b, 0xec, 0xc4, 0x70, 0x5b, 0xc5, 0xe9, 0x6c, 0xde, -0x3a, 0x28, 0xa7, 0x31, 0x7f, 0xe4, 0x87, 0xec, 0xec, 0x6c, 0x3f, 0x66, -0x6e, 0xbe, 0x84, 0xa8, 0x4c, 0x38, 0x06, 0x2f, 0x40, 0xcd, 0x0d, 0x1b, -0x2b, 0x7b, 0xe1, 0xd0, 0xa1, 0x43, 0x3b, 0x74, 0xe8, 0xc0, 0x8b, 0x4c, -0x48, 0x48, 0xf0, 0xfb, 0x46, 0x7d, 0xfb, 0xf6, 0x45, 0x54, 0xf3, 0xfb, -0x72, 0x2e, 0x64, 0x37, 0x75, 0xb9, 0x72, 0x43, 0xf3, 0x18, 0x39, 0x72, -0xa4, 0xf8, 0x1c, 0xf0, 0x67, 0xfb, 0xfa, 0x04, 0xbc, 0x5f, 0xa8, 0x14, -0x9d, 0x9e, 0x57, 0xc3, 0xf6, 0xa4, 0xde, 0x4e, 0xf0, 0x51, 0xc1, 0x14, -0xf7, 0xee, 0xdd, 0xcb, 0xab, 0xf2, 0x75, 0x8a, 0xee, 0xce, 0x07, 0x57, -0x18, 0x9e, 0x03, 0x6c, 0xfb, 0xab, 0x1e, 0x58, 0xa4, 0x7f, 0x44, 0x4c, -0xa2, 0x0c, 0x88, 0x55, 0x60, 0x51, 0x2c, 0x7b, 0xa5, 0xc2, 0xdc, 0x10, -0x0c, 0x7c, 0x7a, 0x04, 0x67, 0x42, 0x6c, 0x7e, 0x9d, 0xf4, 0xde, 0x6d, -0x73, 0x27, 0x17, 0x35, 0x58, 0x3e, 0xb9, 0x45, 0xb5, 0xb4, 0x52, 0x89, -0x82, 0x55, 0x46, 0x4a, 0x44, 0xef, 0x14, 0x5e, 0x01, 0x11, 0xc7, 0xc4, -0xd0, 0x04, 0xa3, 0x5c, 0x8e, 0x76, 0x4d, 0xaa, 0xdf, 0x30, 0xa3, 0x8d, -0xe5, 0xcf, 0xd5, 0x53, 0x5b, 0x5e, 0x39, 0xae, 0x99, 0xfc, 0xcc, 0x1e, -0x96, 0xaf, 0x6e, 0xaf, 0xf3, 0x40, 0xa6, 0xcd, 0x69, 0xb3, 0x86, 0xe6, -0x0f, 0xed, 0x5a, 0xbb, 0x4b, 0x8b, 0x1a, 0x05, 0x75, 0xd3, 0xf3, 0xaa, -0x27, 0xa5, 0x24, 0x79, 0x6e, 0xe8, 0x71, 0x71, 0xa4, 0xd4, 0xa4, 0xf8, -0x3a, 0xd9, 0xc9, 0x1d, 0x0a, 0xb2, 0x06, 0x77, 0xae, 0x3d, 0x67, 0x44, -0x13, 0x2e, 0xe7, 0x0f, 0x19, 0xa9, 0x09, 0xd7, 0x5e, 0xd2, 0x6a, 0xc1, -0xe8, 0x02, 0x96, 0x65, 0x50, 0xe7, 0x5a, 0x9d, 0x9b, 0xd7, 0x68, 0x52, -0x37, 0xbd, 0x46, 0x86, 0x33, 0x36, 0x36, 0x68, 0x2b, 0x40, 0x49, 0x1a, -0x38, 0x2d, 0xdc, 0xc3, 0xc3, 0x82, 0xe6, 0x54, 0x73, 0x76, 0x6a, 0x96, -0x35, 0xbe, 0x4f, 0xfd, 0x25, 0x13, 0x9b, 0xeb, 0xa7, 0x11, 0x9f, 0x81, -0x0c, 0xcf, 0xab, 0xd1, 0xf7, 0xac, 0xe0, 0xa0, 0x42, 0x02, 0xa8, 0xe0, -0xe6, 0xb3, 0x66, 0xcd, 0xb2, 0xff, 0xbe, 0x59, 0xaf, 0x7a, 0xb9, 0x29, -0xf5, 0x73, 0x53, 0xf9, 0x3f, 0x3d, 0x85, 0x96, 0x43, 0x6e, 0x0f, 0xc4, -0x56, 0x64, 0x2a, 0xec, 0x09, 0xca, 0x27, 0x6f, 0x87, 0x21, 0xc8, 0xac, -0xb8, 0x8a, 0xe4, 0x12, 0x78, 0x25, 0xc2, 0x6b, 0x6e, 0x6e, 0xae, 0xf9, -0x1e, 0x6c, 0xd8, 0x67, 0xce, 0x9c, 0x41, 0x60, 0x13, 0x21, 0x47, 0x64, -0xd3, 0x32, 0xc5, 0x1c, 0xb4, 0x6b, 0x58, 0xdc, 0xf6, 0x4d, 0xaa, 0x0f, -0xeb, 0x56, 0x67, 0xee, 0x88, 0x26, 0x6b, 0x67, 0xb7, 0x3d, 0xb4, 0xb2, -0xdb, 0x43, 0x9b, 0x8b, 0xde, 0x3e, 0x3a, 0xe2, 0xff, 0x1e, 0x9c, 0xf8, -0xcd, 0x33, 0xd3, 0xf5, 0x9f, 0xec, 0x4c, 0xa7, 0xba, 0x0e, 0x25, 0x18, -0x5f, 0x12, 0xfa, 0x00, 0x83, 0xa3, 0x92, 0x22, 0x9d, 0xfb, 0x01, 0x88, -0xb4, 0xe4, 0x78, 0x59, 0xab, 0x64, 0xa7, 0x27, 0x1a, 0x5d, 0x3f, 0xa7, -0x9d, 0x61, 0x26, 0x96, 0xbf, 0x1e, 0xbf, 0xbe, 0xa7, 0x9a, 0x43, 0x56, -0x56, 0x96, 0xfa, 0x3c, 0xaa, 0x47, 0x5d, 0x77, 0x97, 0xff, 0xe9, 0xe1, -0xc9, 0x9f, 0x9d, 0x9d, 0xf4, 0x3f, 0xf7, 0x8c, 0xfb, 0xe9, 0x9d, 0x63, -0xf4, 0x9f, 0x4f, 0xef, 0x9f, 0xc8, 0xf7, 0xe6, 0xab, 0xd8, 0x20, 0x18, -0x16, 0x44, 0x79, 0x18, 0xf0, 0x67, 0x77, 0x8d, 0x7d, 0xfd, 0xd6, 0xe1, -0x4f, 0x6e, 0x1f, 0x78, 0xea, 0xa6, 0xde, 0x07, 0x57, 0x76, 0xbd, 0xe9, -0xb2, 0x76, 0xcf, 0xef, 0x19, 0xf2, 0xe0, 0xcd, 0xfd, 0x0e, 0xaf, 0xea, -0xbe, 0x69, 0x7e, 0xfb, 0x15, 0x93, 0x5b, 0xce, 0x1c, 0xda, 0x18, 0x7c, -0x82, 0xa5, 0x46, 0xb5, 0xd2, 0x40, 0x9d, 0xbb, 0x75, 0x83, 0x8e, 0x0d, -0x4f, 0xc1, 0xb5, 0xbb, 0x97, 0x74, 0x3e, 0xbb, 0xb9, 0xdf, 0xbb, 0xc7, -0x46, 0x7e, 0x71, 0x6e, 0x8a, 0x9a, 0x03, 0xb7, 0x53, 0x83, 0xa4, 0xa7, -0xa7, 0xa3, 0x84, 0xc0, 0xb7, 0xd1, 0x58, 0x20, 0x80, 0x20, 0xf3, 0x0a, -0xf8, 0xd7, 0xe8, 0xd1, 0xa3, 0x3d, 0xbc, 0x69, 0x9e, 0xa7, 0x6f, 0xfb, -0xbc, 0x65, 0x93, 0x5a, 0xf0, 0xb4, 0xcf, 0xed, 0x1e, 0xfc, 0xbf, 0xa7, -0xc7, 0x7f, 0xf5, 0xe4, 0x34, 0xc3, 0x62, 0x7d, 0xf9, 0xd8, 0xd4, 0x9f, -0xdc, 0x3e, 0xea, 0xae, 0xb5, 0xbd, 0x17, 0x8d, 0x6b, 0x56, 0x37, 0x27, -0xc5, 0x30, 0x1a, 0x0a, 0x13, 0x2c, 0x12, 0x12, 0x87, 0x64, 0xed, 0xf0, -0x0d, 0x20, 0x01, 0x2d, 0x8e, 0x1d, 0x3b, 0xd6, 0xa6, 0x32, 0x80, 0xae, -0x89, 0x16, 0x81, 0xb4, 0x86, 0x4d, 0x66, 0xe1, 0xc2, 0x85, 0xfa, 0xdd, -0x2f, 0x1f, 0xdd, 0xf4, 0x47, 0xbb, 0x07, 0xf3, 0xfe, 0xfe, 0xf6, 0xf8, -0x54, 0x3b, 0x04, 0xc7, 0x39, 0x9f, 0x3f, 0x7a, 0xb1, 0x7e, 0x84, 0x8c, -0x73, 0xea, 0xd4, 0x29, 0x74, 0x06, 0xdc, 0x49, 0x6c, 0x48, 0x47, 0x8f, -0x1e, 0xb5, 0x5c, 0x28, 0xb6, 0xcf, 0xa6, 0xf5, 0x32, 0xfa, 0xb4, 0xcb, -0x9b, 0xd8, 0xaf, 0x01, 0x2b, 0xb0, 0x6e, 0x4e, 0xbb, 0x03, 0x2b, 0xba, -0x3e, 0xb0, 0xa9, 0xdf, 0x8b, 0xfb, 0x86, 0x70, 0xeb, 0xbf, 0x3e, 0x56, -0xe6, 0xd6, 0xbf, 0xba, 0x77, 0xfc, 0x89, 0x1b, 0x7a, 0x0e, 0xe8, 0x54, -0xd3, 0x3c, 0xd4, 0xfd, 0x1b, 0xfb, 0xda, 0x99, 0xe4, 0x88, 0xee, 0xa5, -0xf2, 0x37, 0xd6, 0x02, 0x35, 0xce, 0x96, 0xcb, 0x3b, 0xda, 0xb9, 0xdc, -0xeb, 0x39, 0xac, 0x40, 0x42, 0xbc, 0x2b, 0x55, 0x93, 0xfd, 0xce, 0xeb, -0xc9, 0xea, 0x84, 0x37, 0x0e, 0x0f, 0xf7, 0x7c, 0x32, 0x44, 0xf2, 0xcb, -0x7b, 0xc6, 0xbd, 0x7a, 0x70, 0xd8, 0xc3, 0xb7, 0x14, 0xd5, 0xaa, 0x51, -0x2a, 0xf5, 0xb5, 0x6a, 0xd5, 0x4a, 0x3d, 0x02, 0xc4, 0xf6, 0xf5, 0x53, -0x97, 0xb8, 0x1b, 0x67, 0xcf, 0xd2, 0xd2, 0x34, 0x21, 0xec, 0x13, 0x0f, -0x3d, 0xf4, 0x10, 0x41, 0x2b, 0xb8, 0xf9, 0xb0, 0xb3, 0x05, 0x0d, 0x15, -0xe2, 0x05, 0x47, 0x29, 0xb4, 0x7c, 0xd3, 0x5d, 0x5b, 0x66, 0xf3, 0x76, -0x5f, 0xde, 0x3f, 0xd4, 0x8c, 0x01, 0xcf, 0x0f, 0xcf, 0xf9, 0xa7, 0xd7, -0xf7, 0x69, 0xdd, 0xa8, 0x9a, 0x3e, 0x2c, 0x4f, 0x0e, 0xe1, 0xc2, 0xec, -0x64, 0x53, 0x37, 0xb3, 0x0b, 0x99, 0x0c, 0xbb, 0x32, 0xfa, 0xba, 0xbe, -0x73, 0xd8, 0xdc, 0x98, 0x5b, 0xb4, 0x68, 0x41, 0xcc, 0x0c, 0xba, 0x90, -0x7e, 0xfe, 0xe8, 0x9e, 0x75, 0x3d, 0x2c, 0xb1, 0xbb, 0xa7, 0xe0, 0x91, -0xd5, 0x20, 0x98, 0xa7, 0x50, 0xa0, 0x09, 0xec, 0x81, 0x53, 0xc3, 0x28, -0xf4, 0xb5, 0xba, 0x74, 0x70, 0xe3, 0x1f, 0x1f, 0x1c, 0xc6, 0xee, 0xfb, -0xf7, 0x27, 0x8c, 0x7b, 0x84, 0x4d, 0x4a, 0x3a, 0xb3, 0xa1, 0xaf, 0x81, -0xcd, 0xfe, 0xf4, 0xae, 0x31, 0x5e, 0xaf, 0x85, 0xb3, 0xc5, 0xc7, 0x95, -0x0a, 0x30, 0xa9, 0xa9, 0xa9, 0x6a, 0xb6, 0xcc, 0xdc, 0xeb, 0xe5, 0x76, -0x4e, 0x80, 0x6a, 0x65, 0x4c, 0xa0, 0x6e, 0xe7, 0x7c, 0x39, 0x07, 0x8e, -0x61, 0xff, 0x64, 0xb6, 0x0c, 0xcb, 0x37, 0xdb, 0xab, 0x4d, 0xae, 0x87, -0x41, 0xa6, 0x0f, 0x6a, 0xa4, 0xae, 0x42, 0x27, 0x41, 0x4c, 0xc0, 0x94, -0x8c, 0x20, 0xcd, 0xab, 0x09, 0x1a, 0x2a, 0xa0, 0x42, 0xc2, 0x3f, 0x0d, -0x93, 0x43, 0xbc, 0x86, 0xfd, 0xfd, 0xe2, 0xd4, 0x38, 0xfb, 0x4f, 0x68, -0x79, 0x26, 0xe4, 0xb8, 0xfa, 0xd2, 0xd6, 0xfa, 0xe0, 0x37, 0xde, 0x78, -0x23, 0xc0, 0x80, 0xd9, 0xe9, 0xba, 0x91, 0x32, 0x1f, 0x63, 0xbc, 0x9b, -0x37, 0x6f, 0x9e, 0x67, 0x0c, 0x20, 0x7e, 0xf0, 0x9e, 0x58, 0xb8, 0x91, -0x3d, 0xea, 0x76, 0x6c, 0x5a, 0x2a, 0x39, 0xc8, 0x55, 0xed, 0xda, 0xb5, -0xd3, 0xa5, 0x2c, 0x1e, 0xe4, 0x8f, 0x0f, 0x4d, 0xf6, 0xe3, 0x29, 0x76, -0x5d, 0x55, 0xba, 0x21, 0x61, 0xc1, 0xa4, 0x66, 0x04, 0x81, 0x7d, 0x12, -0xa7, 0xa9, 0x4f, 0x0f, 0x48, 0xf8, 0x31, 0xb8, 0xe1, 0x12, 0x78, 0x6f, -0xdc, 0x0f, 0x32, 0x3a, 0x08, 0xf9, 0xe7, 0xd3, 0x6e, 0xb7, 0x49, 0x75, -0x21, 0x82, 0x9f, 0x0e, 0x5a, 0xf5, 0x19, 0x99, 0xd6, 0xd7, 0xfd, 0xcb, -0xdd, 0xfc, 0xd1, 0xac, 0x64, 0x58, 0x98, 0x92, 0xcd, 0x67, 0x84, 0x01, -0xde, 0x76, 0x5d, 0x0f, 0x9b, 0x27, 0xcb, 0x69, 0x97, 0x0c, 0x2c, 0x25, -0x71, 0xf5, 0x14, 0x68, 0x0e, 0x1e, 0x06, 0xe1, 0x9d, 0xaa, 0x33, 0x11, -0x0a, 0x10, 0xbd, 0x30, 0xfb, 0x62, 0xf2, 0x46, 0xe1, 0x0c, 0x0e, 0x2a, -0xd8, 0x9b, 0xd9, 0xb6, 0xaf, 0xb8, 0xe2, 0x0a, 0x75, 0x9b, 0x96, 0x0d, -0x33, 0x91, 0xe4, 0xfc, 0xd8, 0x5c, 0x3d, 0x3c, 0xc6, 0xb4, 0x01, 0x0d, -0xd5, 0xf8, 0x98, 0xb7, 0x09, 0x5c, 0x33, 0x48, 0x81, 0x4c, 0x03, 0x06, -0xb2, 0x74, 0xe9, 0x52, 0x77, 0x78, 0x68, 0x5c, 0x3b, 0x6d, 0xe1, 0xd8, -0xa6, 0x77, 0xde, 0xd8, 0x0b, 0x69, 0xd8, 0x40, 0x34, 0x2f, 0xed, 0x1b, -0x6a, 0xc6, 0x86, 0x8c, 0x03, 0xa9, 0xf9, 0x4d, 0xb5, 0xe3, 0x7a, 0x97, -0x9a, 0xdd, 0x30, 0x3c, 0xe0, 0x3c, 0x82, 0x4d, 0x13, 0x12, 0x87, 0xc9, -0x55, 0x4d, 0x92, 0xd7, 0x63, 0x87, 0x82, 0xed, 0x50, 0xc9, 0xe2, 0xf1, -0xcd, 0x64, 0xd8, 0x6e, 0x2d, 0xb3, 0xed, 0x9c, 0xdf, 0xbf, 0x63, 0xa9, -0xe8, 0xd5, 0xb1, 0x63, 0xc7, 0xd2, 0xbd, 0xd3, 0xbd, 0x52, 0x61, 0x67, -0x58, 0xfd, 0x1c, 0x94, 0x7e, 0x19, 0x96, 0x7d, 0xcd, 0xe6, 0xb5, 0x3b, -0xae, 0x2c, 0xfc, 0xe8, 0xc4, 0x68, 0x9b, 0x27, 0xcb, 0x69, 0xbf, 0x7f, -0x60, 0x22, 0xc6, 0x00, 0xc3, 0x7b, 0x47, 0x65, 0x72, 0x37, 0xc8, 0xef, -0xee, 0x9f, 0xa0, 0x9f, 0x8c, 0x49, 0x1a, 0xd7, 0x13, 0xbc, 0x02, 0xe1, -0x36, 0x38, 0xbc, 0x42, 0xe9, 0xb2, 0x35, 0x6b, 0x96, 0x2e, 0xf1, 0xbd, -0xeb, 0xfb, 0xf8, 0xf4, 0x54, 0x76, 0x4e, 0x46, 0x09, 0x11, 0x09, 0x55, -0x0e, 0xdc, 0xa5, 0xc4, 0xa8, 0x81, 0x6c, 0x65, 0xfb, 0xa7, 0x07, 0x87, -0xa5, 0xfe, 0x8a, 0xbe, 0xcb, 0x8e, 0xf5, 0xa6, 0x0d, 0x51, 0x15, 0xbe, -0x61, 0x46, 0xd4, 0x8d, 0xb3, 0xda, 0xda, 0x99, 0x9e, 0xf9, 0x1c, 0xd4, -0x0f, 0x5d, 0xaa, 0xc1, 0xbe, 0x8c, 0x1d, 0x1d, 0x09, 0x0a, 0x3c, 0xf7, -0xef, 0xdf, 0x5f, 0xdd, 0xc8, 0x3e, 0xb9, 0x78, 0x9d, 0xc6, 0x6b, 0x87, -0x86, 0xc9, 0xb0, 0xd8, 0x00, 0xbc, 0x9e, 0xfc, 0x9b, 0x33, 0x13, 0x74, -0x03, 0x98, 0x6e, 0x6a, 0x43, 0x3d, 0xf5, 0x7a, 0xb9, 0x9d, 0x13, 0x74, -0xe2, 0xb3, 0xa9, 0xe7, 0x30, 0xec, 0x84, 0xbe, 0xf5, 0xfd, 0xd8, 0x26, -0x90, 0xb4, 0x0d, 0xef, 0x0e, 0xed, 0xd4, 0xdd, 0x24, 0x99, 0x8c, 0x3a, -0x19, 0xba, 0xc5, 0x85, 0x4f, 0xf2, 0x16, 0xaf, 0x06, 0x01, 0x04, 0xdd, -0x38, 0x08, 0xbc, 0x42, 0x92, 0x93, 0x10, 0xcb, 0xd4, 0x6d, 0xe0, 0xbf, -0x28, 0x43, 0x76, 0x56, 0xcd, 0xd7, 0x73, 0x30, 0xa8, 0xa9, 0xbb, 0x4c, -0x9d, 0x3a, 0x95, 0x4d, 0x97, 0xf8, 0x47, 0x34, 0x63, 0x18, 0x1f, 0x2e, -0x36, 0x33, 0x41, 0x37, 0xab, 0x9f, 0x81, 0x5a, 0x6f, 0x7f, 0x32, 0x7f, -0x79, 0x64, 0x4a, 0xfd, 0xbc, 0x52, 0xd9, 0x9a, 0x01, 0x5b, 0x34, 0xc8, -0xb4, 0xaf, 0x5b, 0x1b, 0x1e, 0x47, 0x97, 0x77, 0x09, 0xd3, 0xdf, 0xb8, -0x71, 0x23, 0x1e, 0x4c, 0xa9, 0x96, 0xa2, 0x4f, 0x15, 0xcb, 0x95, 0xaf, -0xeb, 0xe0, 0xee, 0x7c, 0xd4, 0x12, 0x19, 0x79, 0xe7, 0x55, 0x85, 0x5e, -0xc7, 0xe4, 0x1c, 0x35, 0x0d, 0x2a, 0xd4, 0xeb, 0x53, 0x42, 0xad, 0xf7, -0x7a, 0xb9, 0x9d, 0x13, 0x4e, 0xae, 0xe9, 0xa5, 0x86, 0x65, 0x3b, 0xb7, -0x73, 0x09, 0xea, 0x10, 0xe2, 0x90, 0x9d, 0x33, 0xcd, 0xe7, 0x4c, 0xea, -0xd7, 0x40, 0xdd, 0x8e, 0xfd, 0xc8, 0x83, 0xa8, 0x82, 0x8d, 0x58, 0x9d, -0x89, 0x37, 0x19, 0x27, 0x20, 0x6e, 0x53, 0xbc, 0x49, 0x98, 0x07, 0x83, -0x63, 0x83, 0x42, 0xb2, 0xc7, 0x5c, 0x83, 0xe3, 0x56, 0xdd, 0x66, 0xc6, -0x90, 0xc6, 0xfe, 0x3d, 0x95, 0xd7, 0xab, 0x8e, 0x5e, 0xdb, 0x5d, 0xdd, -0x05, 0x9d, 0x9b, 0x44, 0x13, 0xf0, 0x00, 0xa9, 0xe9, 0x6c, 0x4a, 0x4e, -0x68, 0x58, 0x2b, 0x0d, 0x06, 0xea, 0x87, 0x08, 0x07, 0x8a, 0x74, 0xfa, -0x78, 0xaa, 0x64, 0xa0, 0xd7, 0x59, 0xb9, 0x3b, 0x81, 0x3d, 0x4f, 0x0d, -0x85, 0x17, 0x96, 0xf2, 0x28, 0x38, 0x28, 0x08, 0x28, 0x42, 0x29, 0x52, -0xdf, 0x23, 0x6a, 0x9a, 0x2f, 0x87, 0xd3, 0xee, 0x5d, 0xd6, 0xe5, 0xad, -0x23, 0x3e, 0xa3, 0x05, 0x65, 0x40, 0x46, 0x7e, 0x72, 0x87, 0xf7, 0x69, -0xf7, 0x68, 0x5d, 0xda, 0x9c, 0x04, 0xca, 0x28, 0x9d, 0x6a, 0x93, 0xea, -0x7e, 0x3f, 0xb2, 0xe1, 0x42, 0xdc, 0x1d, 0x32, 0x2c, 0xf6, 0x12, 0x9b, -0x63, 0xa2, 0x88, 0xf2, 0x0a, 0x6c, 0x9e, 0x6c, 0x38, 0x0d, 0xd6, 0xa4, -0xec, 0xe0, 0x18, 0xf1, 0x3c, 0x0c, 0x82, 0x21, 0x54, 0x3d, 0x2f, 0xfb, -0x29, 0x3c, 0x9c, 0xad, 0x0a, 0x6f, 0x98, 0x44, 0xe5, 0x04, 0x81, 0x57, -0x60, 0x64, 0x44, 0x9a, 0x27, 0xf4, 0x40, 0xdd, 0xe6, 0x91, 0x2d, 0xfd, -0xfd, 0x7b, 0x2a, 0xaf, 0x57, 0x7d, 0x70, 0x7c, 0x94, 0xba, 0x0b, 0x77, -0xc4, 0x07, 0x47, 0xe4, 0x99, 0x4e, 0xc4, 0x7c, 0x4e, 0x4a, 0x8c, 0xc3, -0x54, 0x6f, 0x9f, 0x3f, 0x18, 0x6e, 0x8a, 0xe9, 0x53, 0x99, 0xc3, 0xd1, -0x0a, 0xbc, 0x4e, 0xc9, 0xdd, 0x09, 0xbf, 0xbd, 0x6f, 0x82, 0x2e, 0xef, -0xe1, 0xc0, 0x41, 0xe4, 0x23, 0x19, 0x9a, 0x0d, 0x49, 0xef, 0x0a, 0x82, -0x61, 0xde, 0x30, 0x02, 0xc2, 0x43, 0xed, 0x1f, 0x4c, 0x8d, 0x37, 0xcf, -0xef, 0xe0, 0xd3, 0x04, 0xd0, 0x97, 0x64, 0x35, 0xb8, 0xbb, 0xe7, 0x0b, -0x7f, 0x7e, 0xf7, 0x58, 0x7d, 0xdd, 0xf4, 0xf6, 0x3d, 0xbe, 0xde, 0xd4, -0xdd, 0x8d, 0x78, 0x10, 0x65, 0x58, 0xbf, 0x6a, 0x82, 0x27, 0xc5, 0x57, -0x1f, 0x01, 0x2f, 0x10, 0xa2, 0xb2, 0x4f, 0x4f, 0xad, 0x9f, 0x8c, 0xd2, -0x28, 0xcf, 0x85, 0xf5, 0xdf, 0xdd, 0x20, 0xec, 0x1d, 0xba, 0xc7, 0x83, -0xd8, 0x02, 0x24, 0x1d, 0xc4, 0x27, 0x76, 0x58, 0x94, 0x0a, 0x04, 0x9f, -0x20, 0xa0, 0x02, 0xd7, 0x01, 0x31, 0x58, 0x6a, 0x89, 0x01, 0xeb, 0x3f, -0x4c, 0x2e, 0x08, 0xbf, 0x1f, 0xd2, 0x70, 0x21, 0x23, 0xeb, 0xa2, 0xb0, -0xd9, 0x10, 0x8c, 0x4d, 0xc9, 0x57, 0x45, 0xcd, 0x3c, 0xb7, 0x21, 0x5d, -0x5c, 0xce, 0x6c, 0x7c, 0xae, 0x80, 0xd0, 0xef, 0x99, 0x6f, 0x98, 0xdb, -0x5e, 0xad, 0x09, 0xce, 0x47, 0x18, 0x05, 0x06, 0x28, 0x49, 0xa8, 0xd7, -0xc9, 0xf1, 0xc3, 0x3b, 0x8c, 0x6a, 0x25, 0x36, 0x78, 0x75, 0x42, 0x9b, -0xc6, 0x76, 0xb7, 0x58, 0x99, 0xe7, 0xed, 0xab, 0x5d, 0x05, 0xe4, 0x79, -0x05, 0x5e, 0xa7, 0xbd, 0x79, 0x41, 0x07, 0x75, 0x17, 0xdd, 0xda, 0xc6, -0xf2, 0x62, 0x20, 0xf6, 0x7a, 0xb9, 0x9d, 0x13, 0xde, 0x39, 0x36, 0x52, -0xdd, 0x02, 0x17, 0xa7, 0x9d, 0x4b, 0xde, 0xbf, 0x7d, 0x14, 0xda, 0xb9, -0x9d, 0x33, 0x3d, 0x9c, 0x33, 0xf6, 0x82, 0x85, 0x03, 0x37, 0x8e, 0xbb, -0x73, 0x74, 0xff, 0x1d, 0x11, 0x2e, 0xa8, 0xda, 0xc4, 0xf0, 0x62, 0xb7, -0x24, 0x80, 0xd7, 0x60, 0xd5, 0xf4, 0xdf, 0xb7, 0x0d, 0xbc, 0x74, 0x99, -0x1e, 0x97, 0x7e, 0x80, 0x4f, 0xe5, 0xf9, 0x72, 0x9c, 0x5c, 0x06, 0xe6, -0x20, 0xbf, 0xf2, 0x3a, 0xd9, 0x77, 0x83, 0x62, 0x4f, 0xc4, 0x1b, 0xca, -0x80, 0x38, 0x53, 0xfd, 0x7e, 0x10, 0xe4, 0x7b, 0x42, 0x1e, 0xd4, 0x3c, -0xfb, 0xf5, 0xeb, 0xb7, 0x6f, 0xdf, 0x3e, 0x09, 0xc9, 0xbe, 0xe6, 0x9a, -0x6b, 0xd4, 0xf7, 0xc4, 0x44, 0x98, 0x6f, 0x81, 0xa7, 0x5c, 0x9d, 0x80, -0xa0, 0xec, 0xd3, 0x1c, 0xc4, 0xe4, 0xe5, 0x59, 0x78, 0x90, 0x01, 0xb9, -0xb5, 0xba, 0x8b, 0x1e, 0x71, 0xe8, 0xc1, 0xa5, 0xed, 0xd3, 0x4c, 0x38, -0xf9, 0x96, 0xcb, 0x2f, 0x02, 0x0f, 0xee, 0xad, 0x3b, 0x95, 0x3d, 0x8c, -0x73, 0xc3, 0xcc, 0x36, 0xd7, 0xdb, 0x36, 0x55, 0xb9, 0x1b, 0xe7, 0xd7, -0x67, 0xc6, 0x57, 0x4f, 0x4f, 0xf4, 0xb0, 0x39, 0xea, 0xfe, 0x3b, 0xcc, -0xe5, 0x94, 0x22, 0xc7, 0x2f, 0x8c, 0x13, 0x89, 0x78, 0x6d, 0x83, 0x07, -0xcc, 0x4f, 0x54, 0x60, 0xff, 0x21, 0xf2, 0xc4, 0xe9, 0x2c, 0xa5, 0xd4, -0xa7, 0x77, 0x0e, 0xf2, 0x75, 0xf9, 0x7c, 0x3a, 0xdf, 0xec, 0xed, 0xe6, -0xed, 0xb2, 0x0a, 0x8f, 0x6d, 0x1b, 0xe0, 0xd3, 0x38, 0x1e, 0x4e, 0x46, -0x84, 0x00, 0x63, 0x81, 0xf0, 0x1c, 0xd9, 0xb3, 0xd5, 0x41, 0xdc, 0x2b, -0xfa, 0x1c, 0xa1, 0xfc, 0x58, 0xc4, 0x89, 0x02, 0x54, 0xdf, 0xb3, 0x61, -0x9b, 0xa7, 0x21, 0x51, 0x43, 0x1c, 0x44, 0x76, 0x78, 0xb0, 0xa2, 0x98, -0x2f, 0x64, 0x8f, 0x17, 0x97, 0x1c, 0x1e, 0x71, 0xcf, 0x4b, 0xa1, 0x0b, -0xa2, 0x86, 0x2d, 0xc6, 0x8e, 0x42, 0x62, 0x73, 0x9d, 0xfb, 0x75, 0xb8, -0x28, 0xbb, 0x13, 0x17, 0x63, 0xf3, 0x12, 0x3c, 0x48, 0x7e, 0x1b, 0xc1, -0xf5, 0x5b, 0x60, 0xe7, 0xf0, 0x60, 0xc5, 0xd2, 0xfd, 0x77, 0x84, 0xff, -0x20, 0xd9, 0x52, 0xd0, 0x04, 0xeb, 0x13, 0xfb, 0xbb, 0x84, 0x33, 0x07, -0x24, 0x41, 0x89, 0x4d, 0xf6, 0xd6, 0x5b, 0x6f, 0x55, 0x2b, 0xcb, 0x06, -0xe9, 0x87, 0x82, 0x6b, 0x73, 0xc9, 0xe4, 0xb4, 0x9a, 0x59, 0x46, 0xb3, -0x34, 0x81, 0x31, 0x3e, 0x89, 0x3a, 0x68, 0x0e, 0x18, 0x5b, 0xf1, 0x4e, -0x10, 0x49, 0x61, 0x79, 0x6b, 0x14, 0x3e, 0xa2, 0x2d, 0x7c, 0x9a, 0x95, -0x7e, 0x32, 0xef, 0x03, 0xc9, 0x47, 0xad, 0x09, 0x7a, 0x36, 0xf9, 0x3d, -0xc4, 0x7a, 0x10, 0x7f, 0xa6, 0x5b, 0xea, 0x38, 0xc1, 0x6c, 0xea, 0x41, -0x1f, 0x90, 0x0b, 0x89, 0x1a, 0x7a, 0x62, 0xbb, 0x6f, 0x38, 0xbf, 0x62, -0x4c, 0x53, 0xb9, 0x96, 0x38, 0x22, 0xcf, 0x93, 0xe7, 0xf1, 0x0d, 0x60, -0x90, 0x5f, 0x6d, 0x7a, 0x39, 0xec, 0xac, 0x0c, 0x4e, 0x4f, 0xe5, 0x35, -0xdf, 0xb7, 0xac, 0x8b, 0x9d, 0x4b, 0x30, 0x2b, 0x63, 0x00, 0xf4, 0xc3, -0x26, 0x6b, 0x67, 0x70, 0xfd, 0x1c, 0xa2, 0x12, 0xd5, 0xe3, 0xcf, 0x9e, -0x3d, 0xfb, 0xc8, 0x91, 0x23, 0xec, 0x56, 0x30, 0x0a, 0x74, 0x01, 0x43, -0x84, 0xa8, 0x3f, 0xbc, 0x42, 0x2a, 0xa9, 0xe9, 0xc2, 0xfd, 0xd2, 0x89, -0x6e, 0x55, 0x1c, 0x5f, 0xa7, 0xee, 0xee, 0x7c, 0x43, 0xd8, 0x26, 0xc6, -0x0d, 0x38, 0xa6, 0xfd, 0xc1, 0x89, 0x6c, 0xe3, 0xdd, 0xcb, 0xa2, 0xf0, -0x0e, 0x2c, 0x2f, 0x44, 0x82, 0x22, 0xe8, 0xc8, 0xfe, 0x98, 0x86, 0x33, -0x71, 0x5f, 0xea, 0x34, 0x37, 0x7f, 0xfe, 0x7c, 0x78, 0x34, 0x81, 0x89, -0xe4, 0x03, 0xe9, 0xd9, 0x0b, 0xdd, 0x5b, 0xe5, 0x98, 0x6f, 0x71, 0xe4, -0x1a, 0x97, 0x05, 0x0c, 0x6f, 0x23, 0xb2, 0xaf, 0x4f, 0x13, 0xe0, 0x7c, -0x15, 0x7c, 0xea, 0x35, 0x58, 0xa3, 0x79, 0xfd, 0x52, 0xd3, 0x88, 0x3e, -0xd5, 0x20, 0x32, 0x8a, 0xbb, 0xd7, 0xf6, 0x56, 0x23, 0xdb, 0xd4, 0x9e, -0x57, 0x4e, 0x69, 0x89, 0x5b, 0xc9, 0xa7, 0xa7, 0xf6, 0xe3, 0x64, 0x42, -0x18, 0xf5, 0x47, 0x26, 0xdf, 0x10, 0xad, 0x18, 0xff, 0x9d, 0x21, 0x5a, -0x56, 0xd8, 0x85, 0xcf, 0xa8, 0x00, 0x55, 0x40, 0x02, 0x77, 0x81, 0x7e, -0x8f, 0x57, 0x0e, 0xd8, 0x0d, 0x9e, 0x61, 0x9b, 0x24, 0x74, 0x07, 0x19, -0x1a, 0x51, 0x18, 0xbe, 0x09, 0x7c, 0x09, 0x69, 0xf6, 0x1a, 0x55, 0x81, -0x3f, 0x41, 0xbf, 0x1d, 0x90, 0xe0, 0x21, 0xed, 0x2f, 0x0d, 0x7c, 0x0c, -0x6e, 0xae, 0x46, 0x70, 0xa7, 0xd8, 0x05, 0x68, 0x84, 0xd1, 0x2d, 0x9e, -0x88, 0xad, 0x64, 0x84, 0xb2, 0x1b, 0xa1, 0x67, 0x63, 0xf8, 0xd3, 0x63, -0xd7, 0xf0, 0xe0, 0x9a, 0x67, 0x4e, 0x94, 0x35, 0xc6, 0x13, 0x1e, 0xd3, -0xfe, 0x43, 0x71, 0x26, 0xdc, 0x4f, 0x71, 0x27, 0x3c, 0xf1, 0x86, 0x08, -0x42, 0xc3, 0x50, 0x2c, 0x02, 0x0e, 0x4d, 0x89, 0x75, 0x25, 0x18, 0x87, -0x28, 0x57, 0x7e, 0x7c, 0xbd, 0xa3, 0xd7, 0xe9, 0x11, 0xd9, 0x25, 0xeb, -0x8c, 0x40, 0xe8, 0xf5, 0x64, 0x4e, 0x80, 0x45, 0x10, 0x08, 0x6c, 0x9f, -0x7e, 0xec, 0x8c, 0x69, 0x79, 0x8e, 0xee, 0x44, 0xc2, 0xcc, 0x40, 0xc6, -0x2c, 0x96, 0x7d, 0x0c, 0x50, 0x92, 0x7c, 0x6b, 0x88, 0xa9, 0xf3, 0x07, -0x15, 0xd8, 0x64, 0x51, 0x22, 0x15, 0x91, 0xb1, 0xc3, 0xd9, 0x64, 0x7f, -0x98, 0x4d, 0xd1, 0xc0, 0xcc, 0x4c, 0x9c, 0xdd, 0xc2, 0xf3, 0xd3, 0xea, -0x66, 0x0d, 0x02, 0x25, 0xf0, 0xce, 0xfa, 0xb4, 0x3a, 0xba, 0x9a, 0xc5, -0xdd, 0xc9, 0x1f, 0xb0, 0xbc, 0x3c, 0x90, 0x2d, 0x93, 0x6b, 0xf5, 0xe7, -0xc2, 0xd5, 0x48, 0x70, 0x07, 0x8b, 0x8b, 0x39, 0x9c, 0x22, 0x7f, 0xea, -0x4f, 0xe8, 0x2d, 0x44, 0xfb, 0x98, 0xef, 0xfe, 0xb1, 0x8f, 0x91, 0x0e, -0x32, 0xc2, 0x65, 0xc3, 0x9b, 0xa8, 0x91, 0xdb, 0xe6, 0x07, 0x6a, 0xc3, -0xf1, 0x69, 0x49, 0x2d, 0x4f, 0xc6, 0xe6, 0xa1, 0xfc, 0x06, 0x88, 0xa3, -0x76, 0x06, 0x24, 0x18, 0x99, 0x9d, 0xd1, 0x26, 0xfd, 0xd8, 0x19, 0xd0, -0xdd, 0x39, 0xba, 0xff, 0x8e, 0x66, 0x2e, 0x07, 0x0f, 0x1e, 0x84, 0x8d, -0xe3, 0x44, 0x92, 0x34, 0xc9, 0x80, 0x50, 0x21, 0x1a, 0x05, 0xda, 0x09, -0xc9, 0xca, 0xea, 0x7d, 0x5c, 0x37, 0xdd, 0x6e, 0xa0, 0x8b, 0x81, 0x74, -0xd4, 0x08, 0xf3, 0x46, 0x7a, 0xb1, 0x5f, 0xdd, 0xb3, 0xee, 0xa2, 0x57, -0x9f, 0x45, 0xf7, 0x95, 0x80, 0xd8, 0x41, 0x73, 0xab, 0x95, 0xea, 0x24, -0xd0, 0xa5, 0xd9, 0x2a, 0xca, 0x52, 0x12, 0x46, 0x1a, 0xc8, 0xc6, 0xa9, -0xbb, 0x87, 0x48, 0x65, 0xa6, 0x9a, 0x01, 0x11, 0xe3, 0xb8, 0x29, 0x08, -0x7f, 0x22, 0x8f, 0x54, 0x3d, 0x29, 0xa7, 0x05, 0xf2, 0x6a, 0xf5, 0x6b, -0xb7, 0x5e, 0x51, 0x1a, 0xbf, 0xc4, 0xf8, 0x76, 0x62, 0x3d, 0x82, 0x75, -0x6b, 0x77, 0xe3, 0x3c, 0xbb, 0xcb, 0xd5, 0x4c, 0x48, 0x0e, 0x9b, 0x46, -0x0b, 0x2c, 0x04, 0x08, 0x0e, 0xe5, 0x3d, 0x31, 0xc6, 0xd7, 0x5f, 0xd0, -0x84, 0x09, 0x13, 0x30, 0x97, 0x63, 0x80, 0xc2, 0x2c, 0x6b, 0x19, 0x69, -0xea, 0x1b, 0xaf, 0x90, 0x3c, 0x63, 0xb2, 0x34, 0xf4, 0x7d, 0x91, 0x8d, -0xdc, 0xe6, 0x53, 0x19, 0x02, 0x60, 0xd5, 0x20, 0x24, 0x9d, 0x78, 0x1e, -0x01, 0xb3, 0x1d, 0x27, 0xa3, 0xc6, 0x3d, 0xe3, 0xbb, 0xa5, 0x4b, 0x4f, -0xaf, 0x61, 0x10, 0x77, 0x0e, 0x78, 0xcf, 0xe2, 0x87, 0xe7, 0xe9, 0x31, -0x2b, 0x7d, 0x41, 0xf0, 0xf7, 0x53, 0xeb, 0xe0, 0xde, 0x7b, 0xef, 0xa5, -0x7c, 0x2a, 0xbb, 0x91, 0x9e, 0xbd, 0xb0, 0x7f, 0xb9, 0x2d, 0x05, 0xd4, -0xeb, 0x7a, 0x1e, 0x5e, 0x55, 0x1a, 0xf4, 0x2a, 0xb7, 0xf6, 0xdb, 0x31, -0xec, 0xf5, 0x5e, 0xf6, 0x4f, 0x40, 0x08, 0x94, 0xc9, 0xe0, 0x92, 0xb3, -0x73, 0x15, 0xbc, 0x85, 0x1c, 0x09, 0x24, 0x3a, 0x3b, 0x27, 0x07, 0x72, -0x8e, 0xc1, 0x7f, 0x87, 0x95, 0x1c, 0x2b, 0x08, 0xf9, 0x46, 0x64, 0x5c, -0xe2, 0xd2, 0x36, 0xc7, 0x5f, 0xfb, 0x86, 0x0a, 0x89, 0x7d, 0xa2, 0xf2, -0x82, 0x22, 0x82, 0x56, 0xb6, 0x5d, 0xfa, 0x3c, 0x95, 0xd2, 0x77, 0x75, -0x1a, 0xb2, 0xe3, 0xe8, 0x18, 0x58, 0x58, 0x8b, 0x4b, 0x2c, 0x25, 0x72, -0xaf, 0x8b, 0xa5, 0xc7, 0x5f, 0x10, 0x5f, 0xe9, 0xce, 0xfb, 0xeb, 0x77, -0x86, 0x03, 0x13, 0x28, 0xd2, 0x42, 0x50, 0x49, 0x52, 0xa7, 0xba, 0x0c, -0x9a, 0x1c, 0x19, 0xb0, 0xd4, 0x4b, 0xc5, 0x59, 0xa1, 0x1e, 0x16, 0xd1, -0xdf, 0x27, 0x75, 0xc8, 0xdd, 0xa3, 0x61, 0xdb, 0xd1, 0x17, 0x50, 0x3e, -0x5b, 0x32, 0x40, 0xaf, 0x8b, 0x13, 0xc4, 0x13, 0x90, 0x82, 0xb0, 0x0a, -0xca, 0x64, 0x36, 0xce, 0xb3, 0x25, 0x3e, 0x3d, 0x5e, 0x3c, 0xc0, 0x8e, -0x8f, 0x25, 0xf0, 0x49, 0x92, 0xcc, 0xa4, 0x56, 0x8c, 0xc8, 0x34, 0x6c, -0xb2, 0xc4, 0xe0, 0xbc, 0xfa, 0xea, 0xab, 0x38, 0x2b, 0x50, 0x07, 0xcc, -0xb9, 0x3a, 0xbe, 0xa1, 0x42, 0x62, 0x9f, 0xf4, 0xec, 0x4d, 0x9b, 0xf9, -0x90, 0x3c, 0x18, 0x56, 0x20, 0x95, 0x06, 0xa0, 0xa6, 0x48, 0x76, 0xaf, -0x57, 0x07, 0x1c, 0x51, 0x7a, 0x18, 0xa0, 0xc8, 0xfe, 0xf1, 0x4f, 0xfa, -0x54, 0xf6, 0x38, 0xbc, 0xfd, 0x2f, 0xec, 0xb5, 0x36, 0x31, 0x21, 0x3e, -0xf9, 0x6d, 0x59, 0x46, 0x32, 0xd6, 0x69, 0x94, 0x6e, 0x69, 0x62, 0x7a, -0x92, 0x62, 0x2d, 0x7a, 0x98, 0x3d, 0xd9, 0xcc, 0x01, 0xbe, 0x60, 0xd6, -0x0a, 0x1d, 0xcc, 0x0c, 0x09, 0x76, 0x5c, 0xff, 0x16, 0x27, 0xc0, 0xf9, -0xe8, 0x97, 0xeb, 0x94, 0xf7, 0xc9, 0x49, 0x5b, 0xdb, 0x3f, 0x7a, 0x11, -0xc6, 0xb7, 0x20, 0xce, 0xc1, 0xdd, 0x50, 0x44, 0x97, 0xa9, 0x45, 0x6b, -0xd6, 0xac, 0x19, 0xc2, 0x2d, 0x29, 0xfb, 0x44, 0xd3, 0x11, 0x40, 0xae, -0xfb, 0xef, 0xbc, 0xd7, 0x0e, 0xb4, 0x4c, 0x8c, 0xc6, 0xfa, 0x44, 0x38, -0xb4, 0xfe, 0x56, 0xec, 0x4b, 0xf9, 0x86, 0xcc, 0x29, 0x5c, 0x1c, 0x1e, -0x9c, 0xf3, 0xfa, 0xe3, 0xb1, 0xa3, 0xa0, 0x18, 0x10, 0x01, 0xe6, 0xdf, -0xf2, 0x61, 0x09, 0x65, 0xc2, 0xd8, 0x6a, 0x3c, 0x44, 0xdd, 0xf9, 0x6a, -0x0f, 0xd5, 0x67, 0x22, 0x71, 0x22, 0x72, 0xc0, 0x28, 0x28, 0x0a, 0xc6, -0xa2, 0xe3, 0x1e, 0xc2, 0xbe, 0x41, 0xc5, 0x5f, 0x4a, 0x27, 0xa9, 0xbf, -0x06, 0x48, 0x01, 0xa8, 0xe9, 0x3a, 0x53, 0xd2, 0xdf, 0xc2, 0xd4, 0x01, -0x0d, 0xfd, 0x5b, 0x9c, 0x20, 0x5e, 0x25, 0x52, 0x2e, 0x87, 0x4d, 0xeb, -0x13, 0x9b, 0x1d, 0x26, 0x72, 0x4b, 0x5d, 0xee, 0xcf, 0x8f, 0x4c, 0x0e, -0xae, 0x58, 0x75, 0xe9, 0xe0, 0xd2, 0xe4, 0x24, 0x2a, 0x44, 0x11, 0x14, -0x88, 0x09, 0x04, 0x4a, 0xc6, 0x94, 0x2a, 0x65, 0x6f, 0x54, 0xe2, 0x9a, -0x3f, 0x96, 0x59, 0x82, 0xb7, 0x31, 0x38, 0xaa, 0xf7, 0x51, 0xd8, 0xcc, -0x96, 0xf5, 0x4d, 0x96, 0x9e, 0x0c, 0x29, 0x5c, 0xd1, 0x64, 0x66, 0xa1, -0x5d, 0xa1, 0x3d, 0xdb, 0x0f, 0xe3, 0xc3, 0x4b, 0x45, 0x32, 0xb7, 0xdf, -0xef, 0x0f, 0x3f, 0x31, 0x01, 0xb0, 0x1e, 0x58, 0x01, 0x66, 0x4a, 0xbf, -0xad, 0x4f, 0x7a, 0x68, 0x0d, 0xcb, 0x42, 0x08, 0x0c, 0x71, 0xe3, 0xc8, -0xac, 0x28, 0xd9, 0x30, 0x0a, 0x72, 0x82, 0xd5, 0x5a, 0x25, 0x26, 0xc4, -0xfe, 0xc1, 0x2a, 0xe5, 0xdf, 0xe6, 0x73, 0xa1, 0x1d, 0x65, 0x65, 0xb8, -0x2d, 0x43, 0x86, 0x9a, 0x61, 0x73, 0x9c, 0xf2, 0x3b, 0x8d, 0xe8, 0x7d, -0x79, 0x58, 0x9b, 0x82, 0x2e, 0xbb, 0x24, 0xbc, 0xc2, 0x72, 0x3e, 0x64, -0x41, 0x6c, 0x5b, 0xd8, 0x29, 0x88, 0x53, 0xd5, 0xfd, 0x77, 0x0b, 0x16, -0x2c, 0xc0, 0xa9, 0x8a, 0x6b, 0x95, 0xbc, 0x48, 0x5c, 0x78, 0x52, 0x70, -0xcc, 0x4f, 0x54, 0x48, 0x4a, 0x34, 0x5e, 0x40, 0x3d, 0xf6, 0xd8, 0xa7, -0xa9, 0xe3, 0xd3, 0xf1, 0x43, 0x4a, 0x41, 0xdc, 0xf7, 0x3b, 0xec, 0xde, -0xe6, 0xb2, 0x92, 0xc8, 0x66, 0x1f, 0xa2, 0x86, 0x31, 0xf1, 0x33, 0x28, -0xba, 0xa7, 0xac, 0x13, 0x90, 0x38, 0x70, 0xe0, 0x00, 0x75, 0x29, 0x31, -0x48, 0xa0, 0xc9, 0x5d, 0x7e, 0xf9, 0xe5, 0xea, 0xaf, 0x7e, 0x07, 0x1a, -0x51, 0xa2, 0xc2, 0x5c, 0xb5, 0x40, 0x8f, 0xb5, 0xe1, 0x16, 0x36, 0xfd, -0x65, 0x36, 0x17, 0xc4, 0x8f, 0xd3, 0xf0, 0x84, 0xc8, 0x93, 0xe2, 0x52, -0xb4, 0x69, 0x37, 0x27, 0xc5, 0xd2, 0x9d, 0x40, 0xcb, 0x3e, 0xe8, 0x39, -0xf7, 0xda, 0xa7, 0x19, 0x1a, 0xfc, 0x77, 0x04, 0x1c, 0x48, 0xa6, 0x11, -0x15, 0x0c, 0xcc, 0xb1, 0x1e, 0xbe, 0xf1, 0x0a, 0xb1, 0x3e, 0xd1, 0xf2, -0x43, 0x67, 0xdc, 0xc1, 0x8a, 0xb2, 0xf4, 0xf0, 0x90, 0x64, 0x5a, 0x79, -0x4d, 0xa6, 0xf3, 0x69, 0x8d, 0x0c, 0x27, 0xe3, 0x0f, 0x1e, 0xd3, 0xcb, -0xcf, 0xb8, 0x71, 0x12, 0x65, 0xf4, 0xa2, 0x46, 0x63, 0xc6, 0x8c, 0x41, -0xa3, 0xb8, 0xe7, 0x9e, 0x7b, 0xf0, 0x51, 0xa0, 0xc6, 0xb1, 0x15, 0x51, -0xf3, 0x4f, 0x2d, 0x97, 0x4d, 0x71, 0x51, 0x9f, 0x1e, 0x51, 0xdf, 0xec, -0xa6, 0xe6, 0xba, 0x49, 0x54, 0x5e, 0xec, 0xd9, 0xb3, 0xb4, 0x6e, 0x8d, -0x65, 0xac, 0x61, 0x20, 0x6b, 0xe2, 0xc7, 0xb5, 0xab, 0xa6, 0x5d, 0xcc, -0xe6, 0xb1, 0xa9, 0x3b, 0x11, 0x35, 0x88, 0xa0, 0xe5, 0x4e, 0x17, 0x92, -0xad, 0xdd, 0xd2, 0xb1, 0xe3, 0xc7, 0xdc, 0x74, 0xd1, 0x9d, 0xc8, 0x79, -0x54, 0x6d, 0x32, 0x8d, 0xa8, 0x09, 0x46, 0x71, 0x34, 0xcc, 0xb2, 0x96, -0xf5, 0x62, 0xec, 0x6a, 0xdb, 0x40, 0x02, 0x6d, 0x9d, 0xb2, 0xbe, 0xea, -0x35, 0x53, 0xed, 0xc7, 0x8f, 0x29, 0xfa, 0x7a, 0x49, 0xb0, 0x72, 0x26, -0x2d, 0xef, 0x0b, 0x23, 0xc2, 0xcf, 0x4d, 0xe5, 0x01, 0x5f, 0x67, 0xa5, -0x64, 0x42, 0xb5, 0x1a, 0x54, 0xa1, 0x23, 0x88, 0x80, 0x5c, 0x59, 0x62, -0x01, 0x49, 0xbb, 0x63, 0x1f, 0x02, 0x1e, 0xea, 0xaf, 0x94, 0x50, 0xf0, -0xc9, 0x19, 0xc2, 0x46, 0x40, 0xe8, 0xae, 0x5e, 0x86, 0xa3, 0x54, 0x6a, -0x2d, 0x2c, 0x24, 0x7e, 0x84, 0xfc, 0x75, 0xf5, 0x4d, 0xc5, 0xd8, 0xfb, -0x3d, 0x2c, 0x11, 0x22, 0x00, 0xfe, 0x69, 0x99, 0x0f, 0xf1, 0x91, 0x76, -0x16, 0x13, 0x91, 0x18, 0x7f, 0x8b, 0xe5, 0x99, 0x2a, 0x57, 0xc4, 0xa6, -0x24, 0xe6, 0xf5, 0x76, 0xba, 0xff, 0xae, 0x6d, 0xdb, 0xb6, 0xd4, 0x70, -0xc1, 0x62, 0x4e, 0x65, 0x09, 0xbc, 0xda, 0x68, 0x04, 0xe6, 0x1a, 0x79, -0x3e, 0x44, 0x7c, 0xa0, 0xaa, 0x33, 0x8a, 0x1e, 0xb9, 0x80, 0x5e, 0xef, -0x75, 0x42, 0x01, 0x9e, 0x40, 0xc1, 0xac, 0x40, 0x02, 0x93, 0xbc, 0xde, -0x5d, 0x14, 0xc4, 0xf7, 0x6e, 0xb3, 0xeb, 0x6f, 0xd1, 0x07, 0x84, 0xca, -0xc9, 0xc8, 0x55, 0xa4, 0x49, 0x95, 0x65, 0x58, 0x33, 0x41, 0x04, 0xb0, -0x53, 0x56, 0x9c, 0x7a, 0x0b, 0xc4, 0x9f, 0xa9, 0xbf, 0xda, 0x8c, 0x0c, -0xc7, 0x14, 0x86, 0x43, 0x43, 0xcc, 0x03, 0xe6, 0x83, 0x04, 0x6b, 0xaa, -0xf4, 0x52, 0xd4, 0x47, 0xb7, 0x6b, 0xf9, 0x3d, 0x7f, 0xaf, 0x8b, 0x63, -0xff, 0x04, 0xe5, 0x9c, 0x25, 0xda, 0x97, 0x32, 0x50, 0x76, 0x2e, 0x9c, -0xd2, 0xbf, 0xa1, 0x3b, 0xf3, 0x89, 0xb2, 0x17, 0x51, 0x19, 0xcd, 0xce, -0x50, 0x5e, 0xcf, 0x51, 0x31, 0xbc, 0xac, 0xd5, 0xb0, 0x61, 0xc3, 0xf0, -0xdf, 0x11, 0xfe, 0x44, 0xa6, 0x91, 0xa1, 0x8a, 0xa6, 0x6e, 0x5e, 0xb2, -0xcb, 0x2b, 0x30, 0xc8, 0x92, 0x24, 0xa0, 0x5e, 0x15, 0x36, 0x56, 0xbf, -0x8d, 0x42, 0x5e, 0x1f, 0x43, 0x9d, 0x50, 0xae, 0x41, 0x63, 0xbc, 0x4b, -0xfc, 0xdc, 0xd4, 0x02, 0xf4, 0xcf, 0xa6, 0x09, 0xf9, 0xaa, 0xd5, 0x20, -0x51, 0x81, 0x02, 0xf7, 0x88, 0x4f, 0x08, 0xac, 0xb0, 0x66, 0x34, 0x39, -0x8a, 0x7a, 0xe8, 0x05, 0x16, 0x90, 0x03, 0xdd, 0x3d, 0x35, 0xc6, 0x56, -0x82, 0x46, 0xa9, 0x4d, 0xc6, 0xcb, 0x33, 0x5b, 0xae, 0xe5, 0x16, 0xa4, -0x1f, 0x52, 0x06, 0x81, 0x22, 0x26, 0x18, 0xb8, 0x70, 0x16, 0xf1, 0x6a, -0xd5, 0xad, 0x3d, 0x07, 0x7a, 0x10, 0x66, 0x0f, 0x4b, 0xef, 0xd9, 0x3a, -0x07, 0x13, 0x1c, 0xc1, 0x63, 0x52, 0x7a, 0x10, 0x30, 0x23, 0xb8, 0xdb, -0x7f, 0x0b, 0x5e, 0xcf, 0xc4, 0x31, 0x2a, 0xf3, 0xb1, 0x99, 0x9a, 0x42, -0xd8, 0x1b, 0x46, 0x21, 0x77, 0xc3, 0x22, 0xd0, 0xaa, 0xa7, 0xf3, 0x29, -0x26, 0xda, 0x72, 0x40, 0x83, 0xff, 0x8e, 0x0d, 0x05, 0x8a, 0x47, 0xa9, -0xc0, 0x26, 0xab, 0xeb, 0xd9, 0x7e, 0x46, 0x7c, 0xc0, 0x28, 0xf4, 0xd2, -0x32, 0x36, 0xc5, 0x47, 0xaf, 0x0b, 0xea, 0xe1, 0x84, 0x47, 0xb7, 0xf6, -0xa7, 0xc2, 0x5a, 0x20, 0x23, 0x78, 0xb8, 0x16, 0x95, 0x00, 0x3c, 0xb0, -0xfa, 0x7e, 0x2b, 0x15, 0xd8, 0xdf, 0xd4, 0xcb, 0x23, 0xae, 0x86, 0x20, -0x02, 0x4c, 0x7e, 0x54, 0x91, 0x31, 0x57, 0x67, 0x23, 0xbf, 0xde, 0xec, -0x38, 0x47, 0x05, 0xa4, 0xd8, 0x2b, 0x3e, 0x2c, 0xf6, 0x57, 0x4b, 0xce, -0x20, 0x5f, 0x52, 0xf2, 0x11, 0x15, 0x02, 0x91, 0x89, 0x74, 0x4a, 0xc4, -0x57, 0xfc, 0x83, 0x94, 0xa5, 0xd0, 0xcb, 0x6e, 0xbb, 0x93, 0x43, 0xe4, -0xd9, 0xf5, 0x2a, 0x10, 0xfa, 0x5d, 0x82, 0xc8, 0xe7, 0xb1, 0xa2, 0xaa, -0x70, 0x66, 0x9b, 0xc9, 0xee, 0x64, 0xe1, 0xf3, 0x72, 0x2d, 0xdf, 0x0e, -0x49, 0x97, 0x3a, 0x07, 0x5e, 0xe3, 0x6f, 0x99, 0x15, 0x35, 0xb8, 0xee, -0x45, 0x21, 0xff, 0x8e, 0x48, 0x1c, 0x0c, 0x50, 0x04, 0x1c, 0x90, 0x56, -0xe1, 0xa1, 0x02, 0xa5, 0x2d, 0x5e, 0x81, 0xec, 0x45, 0xa5, 0x19, 0xe2, -0x40, 0xd5, 0xca, 0x06, 0x68, 0x7a, 0xf7, 0x4a, 0xeb, 0x18, 0xb3, 0xb1, -0xf4, 0x05, 0x25, 0x13, 0xc5, 0x7c, 0x2f, 0xaa, 0x4e, 0xa8, 0x98, 0x6a, -0xff, 0xe2, 0x64, 0xb1, 0xf6, 0x7a, 0x20, 0x65, 0xc3, 0x9f, 0x2c, 0xf7, -0x45, 0xf4, 0x25, 0xcf, 0x23, 0x50, 0xa8, 0x41, 0x9a, 0x16, 0xc0, 0x1f, -0x78, 0x97, 0x74, 0x60, 0x21, 0xa1, 0x05, 0x43, 0x3b, 0xbf, 0xaa, 0x0b, -0x51, 0x3c, 0x3c, 0x24, 0x6a, 0xe3, 0x36, 0xa5, 0x20, 0xb4, 0xe5, 0x5d, -0xfc, 0x28, 0x98, 0xe0, 0xee, 0x95, 0xa9, 0x82, 0x6b, 0x38, 0xb6, 0x6d, -0x72, 0x5d, 0xa2, 0x19, 0xdc, 0x59, 0x23, 0xf5, 0x48, 0x2a, 0x66, 0xee, -0x53, 0xe4, 0x84, 0xe5, 0x0c, 0x75, 0xff, 0x1d, 0x04, 0x2c, 0x59, 0xa9, -0x78, 0x2a, 0x28, 0xea, 0x61, 0xa9, 0x51, 0xf8, 0x60, 0x83, 0xe2, 0x7a, -0xbd, 0x0c, 0x3a, 0xa6, 0x77, 0xaf, 0xb1, 0xdf, 0x5e, 0xe9, 0xde, 0xf3, -0x09, 0x94, 0xd4, 0xe6, 0x8d, 0x96, 0x47, 0x22, 0x38, 0x90, 0xd0, 0xb3, -0x34, 0xfd, 0xf3, 0x54, 0x90, 0x13, 0x6b, 0x1f, 0x15, 0x96, 0xb9, 0xcb, -0x48, 0x35, 0x96, 0x23, 0x20, 0x2c, 0xa1, 0x11, 0xc2, 0x79, 0x16, 0x2d, -0x5a, 0x44, 0xc5, 0x68, 0xba, 0x67, 0x10, 0x7b, 0x8b, 0x5b, 0x90, 0x1d, -0x8e, 0xa0, 0x74, 0x9c, 0x83, 0x7a, 0x60, 0x01, 0xd2, 0xb9, 0x87, 0x65, -0xa4, 0x0e, 0x9f, 0xe5, 0x2d, 0x88, 0xb0, 0xf4, 0xc3, 0x44, 0xee, 0xee, -0x46, 0x2a, 0x8a, 0xc7, 0x5c, 0x9f, 0xc1, 0xf2, 0x12, 0x98, 0xa4, 0x87, -0x78, 0x08, 0xe5, 0x0a, 0x54, 0x33, 0xb7, 0x53, 0x20, 0xd4, 0xc3, 0x22, -0xe8, 0xfe, 0x3b, 0xa4, 0x50, 0xec, 0xe6, 0x50, 0x32, 0x8a, 0x1f, 0x9e, -0x8a, 0x80, 0x50, 0x21, 0x36, 0x59, 0x5d, 0xc3, 0xf3, 0x5b, 0xea, 0xb0, -0x09, 0x15, 0x62, 0x28, 0x30, 0x47, 0xc2, 0x2b, 0x6c, 0x9e, 0x6f, 0xff, -0x34, 0x1c, 0x76, 0x94, 0x9c, 0xd1, 0x69, 0xc5, 0x3f, 0x78, 0xeb, 0xe2, -0x93, 0x99, 0xf2, 0x32, 0x53, 0x13, 0x7a, 0xb7, 0xcb, 0xc5, 0x0d, 0x42, -0x04, 0x3b, 0x5e, 0x79, 0x73, 0x84, 0x15, 0xd3, 0xd0, 0xaf, 0xa2, 0x9d, -0x0d, 0x4e, 0x71, 0xc8, 0xfd, 0x92, 0x4b, 0x2e, 0x81, 0x39, 0x10, 0xbb, -0x46, 0xfb, 0x1b, 0x2c, 0x5a, 0x6c, 0x6c, 0xc8, 0x4b, 0x70, 0x73, 0x62, -0x6f, 0x29, 0x6b, 0x42, 0xf6, 0x12, 0x36, 0x2e, 0xfd, 0x42, 0xcf, 0xa6, -0x08, 0x4a, 0x79, 0xab, 0x93, 0xf5, 0x36, 0x48, 0x9e, 0xb1, 0x64, 0x7f, -0x31, 0x39, 0x13, 0x5f, 0x8a, 0xdc, 0x02, 0x0d, 0xcd, 0x66, 0x01, 0x55, -0x12, 0x21, 0x3d, 0x54, 0x9d, 0x42, 0xc3, 0x36, 0xac, 0xa7, 0xcd, 0x84, -0x3e, 0x77, 0xd3, 0xd6, 0xfd, 0x77, 0x54, 0x5b, 0x45, 0xd5, 0x66, 0x67, -0xc1, 0x68, 0x4e, 0xa9, 0x9b, 0x80, 0x50, 0x21, 0x36, 0x59, 0x1a, 0xcc, -0xa8, 0xe9, 0x52, 0x65, 0xc4, 0xa7, 0xb5, 0xf3, 0xe9, 0x64, 0x32, 0xec, -0xa4, 0x00, 0x4c, 0xb0, 0x4c, 0x10, 0xea, 0xee, 0x80, 0xcd, 0x90, 0xe6, -0x4a, 0xf1, 0x28, 0x9f, 0xe6, 0x26, 0x27, 0x93, 0xac, 0x63, 0x78, 0x73, -0x0d, 0x6a, 0xa6, 0xe2, 0xa4, 0x23, 0x25, 0x9f, 0x82, 0x4e, 0xfa, 0xde, -0x46, 0x62, 0x1a, 0x81, 0x5e, 0xe6, 0x5b, 0xa0, 0x5b, 0xab, 0x11, 0xb0, -0xa0, 0xa3, 0x36, 0x50, 0xc8, 0x87, 0x24, 0x6f, 0x0a, 0x46, 0xd1, 0xb7, -0x0a, 0xe5, 0x81, 0x9c, 0x18, 0x12, 0x00, 0x90, 0x97, 0x88, 0xa7, 0x92, -0xe0, 0x11, 0x52, 0x97, 0xb0, 0xf6, 0x62, 0xe9, 0x52, 0x17, 0x7a, 0xf6, -0x73, 0xc1, 0x12, 0x75, 0xc3, 0x2e, 0xd5, 0x46, 0xd4, 0x85, 0x36, 0x8d, -0xa7, 0x76, 0x56, 0x46, 0xf5, 0x82, 0x20, 0xec, 0xc5, 0xce, 0xf9, 0x9c, -0x43, 0x0d, 0x14, 0x77, 0x67, 0x32, 0x67, 0x73, 0x57, 0x0f, 0x9b, 0xe6, -0x3b, 0x77, 0x7c, 0x49, 0x7f, 0x53, 0x2c, 0xac, 0x24, 0x0c, 0xab, 0x5e, -0x22, 0xee, 0xfa, 0x3d, 0x78, 0xef, 0x16, 0x09, 0x24, 0x30, 0xad, 0xa8, -0xd1, 0x89, 0xb1, 0xb3, 0x69, 0x7d, 0xb3, 0xb9, 0x4c, 0xfa, 0x69, 0x8c, -0xac, 0x76, 0x8b, 0x20, 0xf2, 0x0a, 0x0c, 0x11, 0x44, 0x71, 0x9a, 0x2d, -0x3c, 0xf6, 0x0b, 0x03, 0xeb, 0x93, 0x44, 0xa7, 0xc4, 0xcb, 0x81, 0xe1, -0x65, 0xfb, 0xa2, 0x4e, 0x7c, 0xf6, 0x10, 0xc7, 0x41, 0xbe, 0xa1, 0x65, -0x12, 0xb6, 0x5e, 0xd9, 0x16, 0x16, 0x81, 0x1a, 0x0d, 0x18, 0xe0, 0x0c, -0x20, 0x81, 0x60, 0x5b, 0x42, 0xd0, 0x61, 0x0e, 0x80, 0x81, 0xa0, 0x4e, -0xf8, 0x03, 0x78, 0xe0, 0x2d, 0x52, 0x9d, 0x85, 0x0e, 0x1e, 0xfa, 0x3b, -0xf6, 0x5c, 0x7d, 0x8b, 0x2d, 0x59, 0x9d, 0xac, 0xf7, 0xec, 0x03, 0x2a, -0x96, 0xbd, 0x26, 0xfc, 0x78, 0x59, 0x04, 0x04, 0xa8, 0x20, 0x14, 0x0f, -0x46, 0x36, 0x7d, 0x64, 0xdc, 0xbe, 0x1e, 0xbc, 0x99, 0xaa, 0xa6, 0x93, -0xfe, 0x98, 0xc4, 0xcb, 0xf9, 0x31, 0x37, 0xb9, 0x84, 0x3e, 0x18, 0x6a, -0x28, 0x4c, 0x82, 0x2c, 0xaf, 0x65, 0x5d, 0x7e, 0x33, 0x36, 0x3c, 0xa1, -0x42, 0x72, 0x8c, 0x48, 0x56, 0xa2, 0x41, 0x9b, 0x1a, 0xbd, 0xfc, 0x02, -0xd1, 0x30, 0xd4, 0x48, 0xc4, 0xb8, 0x1c, 0x10, 0x31, 0xfa, 0xa2, 0xdf, -0x2b, 0xa2, 0x2e, 0x24, 0x54, 0xc9, 0xcc, 0x97, 0xe5, 0x16, 0x5e, 0x73, -0x00, 0x03, 0xb9, 0x3b, 0x93, 0x87, 0x17, 0x99, 0x23, 0x82, 0x09, 0xf9, -0xd6, 0xdf, 0x3a, 0x1d, 0x0d, 0x89, 0x13, 0x21, 0xb7, 0x11, 0x63, 0x2e, -0xef, 0x0c, 0x30, 0x48, 0x9d, 0x66, 0x4c, 0x87, 0x68, 0x84, 0xd2, 0x29, -0x9d, 0x8d, 0x09, 0x1b, 0x60, 0xaf, 0x5e, 0xa5, 0x65, 0x2a, 0xf1, 0x69, -0x78, 0x56, 0x6d, 0xf5, 0x24, 0x1b, 0x14, 0x15, 0x75, 0x47, 0xfb, 0x75, -0x37, 0xbc, 0x3e, 0xbb, 0x2a, 0x68, 0x02, 0x07, 0xb6, 0x19, 0x87, 0x4f, -0xbc, 0x96, 0x87, 0x5a, 0x38, 0xaa, 0xe2, 0xe0, 0x05, 0x91, 0xac, 0xb4, -0x91, 0x80, 0xdf, 0x21, 0x14, 0xe4, 0xc3, 0xa9, 0x07, 0xc7, 0x4e, 0x28, -0xf5, 0x33, 0x31, 0x40, 0x51, 0x9e, 0x86, 0x55, 0xf5, 0xd0, 0x18, 0xc8, -0x0b, 0x2a, 0x10, 0x9f, 0x70, 0x8c, 0xeb, 0xed, 0xe1, 0xec, 0x17, 0xd3, -0xf5, 0xba, 0xac, 0xfa, 0x09, 0xc8, 0xf7, 0xfa, 0x8b, 0x94, 0x87, 0x09, -0x50, 0xa6, 0x44, 0xd2, 0x25, 0x62, 0xc2, 0x43, 0xab, 0x2d, 0xec, 0x27, -0x3e, 0x4d, 0xd2, 0xa7, 0x93, 0x8f, 0x5d, 0xd7, 0x83, 0x42, 0xe8, 0xe6, -0x4b, 0x74, 0x4d, 0x1d, 0xb9, 0xf4, 0xa6, 0x9b, 0x6e, 0x92, 0x6c, 0x49, -0xa2, 0x38, 0xc1, 0x03, 0x01, 0x54, 0x48, 0xbd, 0xd8, 0x0d, 0x31, 0xfa, -0x09, 0x1e, 0xe4, 0x40, 0xa6, 0xd2, 0xb1, 0x84, 0xad, 0xc6, 0xc3, 0x64, -0x88, 0x95, 0xd0, 0x9f, 0x5a, 0xef, 0x79, 0xe7, 0x47, 0xe0, 0x89, 0xbb, -0x1b, 0x29, 0x6f, 0xa3, 0xfd, 0x64, 0xcc, 0x5b, 0xaf, 0x76, 0xbb, 0xe0, -0x7a, 0xc5, 0x41, 0x9e, 0x54, 0x2f, 0x6a, 0x78, 0x9f, 0xbd, 0x3e, 0x35, -0xe6, 0x79, 0xea, 0xfe, 0x3b, 0xa9, 0x9f, 0x89, 0xf8, 0x24, 0xf5, 0x33, -0xf5, 0x7e, 0x5f, 0xbe, 0xf1, 0x0a, 0xc9, 0x31, 0x62, 0xac, 0x52, 0x5e, -0x9c, 0x96, 0xe8, 0x77, 0x4d, 0x62, 0x0f, 0x6f, 0x91, 0xed, 0x93, 0x6a, -0xc7, 0xfa, 0x5b, 0x97, 0xcf, 0xb8, 0x14, 0xfc, 0x8b, 0x7b, 0xc3, 0x2f, -0x46, 0x91, 0x04, 0xbd, 0xb2, 0xe5, 0x45, 0xfe, 0x13, 0x17, 0xa7, 0x2f, -0xb7, 0xd7, 0x1c, 0x40, 0x9f, 0x60, 0x60, 0x38, 0x19, 0x65, 0x97, 0xce, -0x12, 0xe6, 0x11, 0xf4, 0x27, 0xc5, 0xf6, 0x4a, 0x71, 0x41, 0xec, 0x4b, -0x12, 0x63, 0xab, 0xf8, 0x83, 0x24, 0x88, 0x49, 0x91, 0x22, 0x3e, 0x20, -0x41, 0xe9, 0x6e, 0x10, 0xaf, 0x05, 0x3f, 0x89, 0x95, 0x50, 0x8b, 0xa9, -0xd7, 0x57, 0xc6, 0x0c, 0x10, 0x48, 0xca, 0xa1, 0xfe, 0x2c, 0xaa, 0xd2, -0x21, 0xf0, 0xb3, 0x59, 0xb3, 0x99, 0xa4, 0x0b, 0x0f, 0x60, 0x56, 0x8a, -0xbb, 0x30, 0x8a, 0xe6, 0xcd, 0x4b, 0xbb, 0xd7, 0xf9, 0x57, 0x1c, 0x1e, -0x2e, 0xad, 0xfb, 0x82, 0xa4, 0x7e, 0xa6, 0x54, 0x28, 0xb6, 0xac, 0x60, -0x60, 0xd7, 0xb7, 0xcd, 0x5b, 0x01, 0x52, 0x93, 0x27, 0x4f, 0x56, 0x4b, -0x0c, 0xa9, 0x05, 0x42, 0x28, 0x96, 0xd7, 0xb2, 0x7b, 0x79, 0x68, 0x8a, -0x47, 0x1d, 0x10, 0x9b, 0x0e, 0x4e, 0xb8, 0x0d, 0x42, 0x3c, 0x49, 0xb0, -0x06, 0x2b, 0x93, 0x9a, 0x3c, 0x6d, 0x8b, 0xc9, 0x1d, 0x25, 0x15, 0x4b, -0x7d, 0x63, 0x33, 0x39, 0xc6, 0x8f, 0x47, 0x46, 0x71, 0xb4, 0x2c, 0xf2, -0x80, 0xa3, 0x40, 0x07, 0x3f, 0xaf, 0x8a, 0x60, 0x35, 0x6c, 0x85, 0x04, -0xd8, 0xa2, 0x4c, 0x53, 0x85, 0x05, 0xfe, 0x20, 0x3d, 0x63, 0xc5, 0xc7, -0xc4, 0xc1, 0x2b, 0xa0, 0x36, 0x82, 0xba, 0x8a, 0x90, 0x2a, 0xaf, 0xc6, -0x4a, 0x5a, 0x4c, 0xa9, 0xf3, 0xf5, 0x42, 0xfc, 0x5e, 0xcb, 0xa8, 0xd9, -0x7f, 0x52, 0x65, 0xf1, 0x1c, 0x6e, 0xbb, 0x14, 0x1a, 0x2f, 0xda, 0x83, -0xd4, 0x57, 0xbc, 0xa8, 0x93, 0x9a, 0x33, 0x6e, 0x4a, 0x5d, 0x5c, 0x24, -0x9b, 0xd2, 0xfe, 0xc4, 0xd4, 0x99, 0x06, 0xff, 0x1d, 0x6a, 0x1b, 0x02, -0x2a, 0x9e, 0x0a, 0x34, 0x34, 0x73, 0x56, 0xaa, 0x21, 0x1d, 0xcf, 0x93, -0x04, 0x25, 0x99, 0x77, 0x69, 0x69, 0x17, 0xd3, 0x0e, 0x99, 0x74, 0x10, -0x0b, 0xf5, 0x31, 0x7b, 0x1a, 0x9c, 0xe9, 0xdd, 0x4f, 0x64, 0x51, 0xa8, -0x4a, 0x42, 0xc3, 0x21, 0x9d, 0x74, 0x70, 0x8f, 0xcc, 0x1f, 0x55, 0x80, -0x63, 0xc1, 0x10, 0x60, 0x87, 0x37, 0x83, 0x48, 0x32, 0x24, 0xba, 0x6b, -0xa6, 0xb5, 0x72, 0xd7, 0x99, 0x45, 0xc6, 0xc1, 0x09, 0xc0, 0xae, 0x8c, -0x9d, 0xc7, 0x50, 0xb3, 0xd9, 0xef, 0x00, 0x72, 0xaf, 0x2f, 0x89, 0x78, -0x10, 0xcb, 0x70, 0x15, 0xa6, 0xaa, 0x1e, 0x8d, 0x08, 0x3f, 0xac, 0x22, -0xc7, 0x8f, 0x1f, 0xa7, 0xad, 0x3d, 0x71, 0x53, 0xe0, 0xc1, 0x50, 0xc1, -0x8e, 0xdd, 0x0b, 0x54, 0xd0, 0xac, 0x43, 0x5f, 0x0d, 0xcb, 0xba, 0x83, -0xfa, 0x7c, 0xc0, 0x8c, 0x99, 0xeb, 0xca, 0x37, 0xec, 0xc7, 0x5e, 0x67, -0x6e, 0xe7, 0x04, 0x55, 0xad, 0x90, 0x31, 0xe9, 0xf4, 0x65, 0xe7, 0x12, -0xce, 0xf1, 0x6c, 0xba, 0x24, 0x5a, 0x42, 0x4d, 0x9b, 0x32, 0xd5, 0x04, -0x20, 0xab, 0x5f, 0xed, 0x17, 0x36, 0xd7, 0x67, 0xa2, 0xe7, 0xf1, 0xaa, -0xfa, 0x99, 0x92, 0x53, 0x61, 0xee, 0x20, 0x67, 0x50, 0x33, 0x3c, 0xa1, -0x82, 0x8b, 0x69, 0xb8, 0xa8, 0x26, 0x47, 0xd2, 0xb3, 0xd7, 0x6c, 0x52, -0x9b, 0x0b, 0x84, 0xe0, 0x4b, 0x49, 0x32, 0x73, 0x15, 0x1c, 0x66, 0x8f, -0xf7, 0xea, 0xaa, 0xab, 0xae, 0x62, 0x5f, 0xb7, 0x7c, 0xb5, 0x78, 0xa0, -0x08, 0xe6, 0xe1, 0x87, 0xb2, 0xb3, 0x76, 0x7a, 0xf3, 0x02, 0x69, 0x22, -0x26, 0xe8, 0x3c, 0x8b, 0x9d, 0x07, 0xa5, 0x16, 0xbf, 0x98, 0x1a, 0x96, -0x14, 0x28, 0x9b, 0xb3, 0xf5, 0xe3, 0x34, 0x74, 0x24, 0xca, 0x10, 0x1a, -0x72, 0xa9, 0xd9, 0x29, 0xd1, 0xbf, 0xd5, 0x04, 0x86, 0x0f, 0x1f, 0x4e, -0x0b, 0x66, 0x61, 0xeb, 0x68, 0x11, 0xf0, 0x04, 0xb3, 0x05, 0x9d, 0x6f, -0x08, 0xf0, 0x54, 0x97, 0x20, 0x13, 0x12, 0x6d, 0x4a, 0x90, 0x85, 0x87, -0x29, 0x61, 0x6d, 0x53, 0xe7, 0xeb, 0xf5, 0x95, 0xc9, 0xe3, 0xf3, 0xe3, -0x41, 0x2c, 0x2f, 0x51, 0xdd, 0xbd, 0xe0, 0x87, 0x36, 0x1d, 0x82, 0x94, -0xbc, 0xc0, 0xe6, 0xc1, 0x66, 0x61, 0x6e, 0x36, 0xcb, 0x2d, 0x0c, 0x25, -0x91, 0xe0, 0x8d, 0xe4, 0x06, 0xa9, 0xa7, 0x80, 0x4e, 0x6c, 0x7a, 0xcd, -0xf5, 0xd9, 0xaa, 0xca, 0x54, 0x8c, 0x43, 0xc1, 0x5f, 0xfc, 0x77, 0x58, -0x32, 0xdc, 0xe5, 0x54, 0xe8, 0x65, 0xfa, 0xbd, 0xc4, 0xcc, 0xf2, 0x9e, -0xae, 0xbc, 0xf2, 0x4a, 0x35, 0x39, 0xaf, 0xf5, 0x69, 0xbc, 0x2e, 0x3a, -0x66, 0x19, 0xda, 0x01, 0x12, 0x9c, 0x63, 0x19, 0x23, 0xdd, 0xa5, 0x4b, -0x17, 0xc8, 0x17, 0x37, 0x16, 0xa5, 0x62, 0x20, 0x5f, 0x5a, 0xa3, 0xbb, -0xdb, 0xf3, 0xec, 0x7c, 0x8f, 0xe4, 0x40, 0x2d, 0x51, 0xe6, 0x0f, 0x7f, -0xc0, 0x2f, 0x46, 0x0a, 0x21, 0x76, 0x9e, 0xd5, 0xab, 0x57, 0xab, 0x6b, -0xf1, 0xef, 0x78, 0x9d, 0xb0, 0x7f, 0x27, 0xa0, 0x0b, 0x29, 0xc4, 0x62, -0xf3, 0x81, 0xc1, 0xca, 0x4b, 0xa5, 0xdb, 0x98, 0x3e, 0x73, 0x62, 0x37, -0xb0, 0x8a, 0x48, 0x8a, 0x92, 0x34, 0x4d, 0x36, 0xa8, 0x7d, 0x92, 0xe9, -0x65, 0x48, 0x09, 0x66, 0x04, 0xb0, 0x81, 0xb1, 0xae, 0x64, 0x71, 0xa1, -0xa5, 0x28, 0x45, 0xbc, 0xa0, 0xe5, 0xfa, 0x90, 0x66, 0xe0, 0xdf, 0xe3, -0x18, 0xae, 0x82, 0xac, 0x55, 0xbd, 0x7b, 0xfb, 0x69, 0x67, 0xaa, 0xbc, -0x0b, 0xaf, 0x1e, 0xa1, 0x8b, 0xd4, 0x42, 0x9d, 0xf3, 0xb3, 0x44, 0x6a, -0xce, 0x6c, 0x64, 0xd0, 0x00, 0xbb, 0x98, 0x9e, 0x59, 0xe5, 0x87, 0x7a, -0x49, 0xa7, 0x70, 0x35, 0x26, 0xfd, 0x12, 0xa8, 0x58, 0x47, 0xde, 0x0b, -0x8c, 0x02, 0x00, 0x98, 0x77, 0x1f, 0x5b, 0xa8, 0x50, 0x99, 0x77, 0x7a, -0x29, 0x48, 0xee, 0xc1, 0x9d, 0x28, 0x61, 0x8b, 0x08, 0x48, 0x2e, 0x35, -0x39, 0x31, 0x5e, 0xf7, 0x09, 0x56, 0x90, 0xb4, 0x1e, 0x8a, 0xb2, 0x10, -0x09, 0xc7, 0x56, 0xe1, 0x2e, 0x26, 0x14, 0x0d, 0x98, 0xc6, 0xbe, 0xd0, -0x2e, 0x01, 0x3f, 0xd4, 0x8c, 0x81, 0x7c, 0x91, 0xb6, 0x8b, 0x8b, 0x8b, -0xe9, 0x84, 0xad, 0xd7, 0xcd, 0xf6, 0x0a, 0x06, 0x62, 0xe9, 0xf2, 0xf3, -0xf3, 0xe9, 0x43, 0x37, 0x67, 0xce, 0x1c, 0x46, 0x23, 0x8e, 0x15, 0x30, -0x48, 0x04, 0x11, 0x3c, 0x91, 0x00, 0x18, 0xdc, 0x02, 0x6a, 0x90, 0xa0, -0x7b, 0x09, 0xa1, 0x1e, 0x4c, 0x11, 0x78, 0x03, 0xf4, 0x6a, 0xf8, 0x72, -0x3b, 0x34, 0x6c, 0xb6, 0x49, 0xe4, 0x40, 0x75, 0x77, 0x72, 0xea, 0x89, -0xb1, 0xc5, 0x35, 0x41, 0xd1, 0x03, 0xd2, 0xbb, 0x2d, 0xeb, 0xaf, 0x88, -0x65, 0x1c, 0x7b, 0x94, 0xbb, 0x16, 0xb5, 0x8c, 0x46, 0xa4, 0x10, 0x19, -0x3f, 0xa8, 0xf5, 0xc2, 0xc6, 0x89, 0x8a, 0xb7, 0x5c, 0x25, 0xd4, 0x33, -0xaf, 0x2f, 0xcb, 0x26, 0x66, 0x70, 0x56, 0xca, 0x2d, 0x08, 0x0a, 0xb4, -0xe9, 0xfa, 0x60, 0x53, 0xd0, 0x7b, 0x34, 0xca, 0xe5, 0x28, 0x48, 0x78, -0xe8, 0xb0, 0x2f, 0xb1, 0x68, 0x8a, 0xf9, 0xf0, 0x7d, 0xeb, 0xd6, 0xad, -0xb1, 0xcb, 0xc1, 0xd8, 0xf5, 0x96, 0x3d, 0xee, 0xb2, 0xf6, 0x98, 0x33, -0x73, 0x30, 0x3f, 0x1a, 0x7a, 0x9d, 0xbe, 0x0e, 0x04, 0x0a, 0x60, 0xf8, -0xa6, 0x61, 0xa7, 0xf0, 0x64, 0xb3, 0xd1, 0xc9, 0x16, 0x2a, 0x24, 0xca, -0x83, 0x21, 0x74, 0x03, 0x94, 0x79, 0xb9, 0xa1, 0x72, 0x9c, 0x2c, 0x14, -0xff, 0x21, 0x5c, 0x99, 0x0d, 0x80, 0xee, 0x72, 0xfc, 0xf0, 0x99, 0x80, -0x08, 0x78, 0xab, 0xa1, 0x32, 0xac, 0xe5, 0xdb, 0xa2, 0x8b, 0x76, 0xf7, -0xee, 0xdd, 0x11, 0x99, 0xd8, 0xc5, 0xa1, 0x60, 0x32, 0x42, 0xb0, 0x51, -0xe2, 0x34, 0x64, 0x07, 0x85, 0x8e, 0xc1, 0x06, 0xab, 0x03, 0x36, 0xa0, -0x75, 0x5d, 0x4b, 0x56, 0x43, 0x25, 0x24, 0x24, 0x60, 0x63, 0x29, 0x28, -0x28, 0x40, 0x39, 0x9b, 0x32, 0x65, 0x0a, 0x61, 0x29, 0x0c, 0x85, 0x0a, -0x4b, 0xc4, 0x04, 0x11, 0xd7, 0x00, 0x8c, 0xcd, 0x18, 0xe7, 0x17, 0x56, -0x6a, 0x64, 0x77, 0x3c, 0x62, 0x18, 0x7c, 0x4a, 0xe9, 0xd2, 0xd5, 0x25, -0xac, 0x1b, 0x3f, 0x6c, 0xba, 0xec, 0x79, 0x90, 0x32, 0xc1, 0x57, 0xfc, -0x50, 0xd4, 0x08, 0x0c, 0x63, 0x54, 0x45, 0xa1, 0xe4, 0x07, 0xce, 0xc6, -0x43, 0xe1, 0xef, 0xe3, 0xb9, 0xf8, 0x01, 0x4b, 0x44, 0x65, 0xf3, 0x23, -0x82, 0x1c, 0x52, 0x25, 0x31, 0x9e, 0x7a, 0x98, 0xa7, 0x57, 0xe8, 0xca, -0x09, 0xec, 0x02, 0x44, 0x37, 0xf1, 0x98, 0xa4, 0x28, 0x61, 0x7a, 0x42, -0xc3, 0x36, 0xd7, 0x5f, 0x91, 0xb7, 0xc0, 0x5f, 0xd9, 0xe4, 0xf4, 0x90, -0x0d, 0xcb, 0x5b, 0x20, 0x52, 0xb2, 0x61, 0xe9, 0x41, 0xb2, 0xba, 0x9e, -0x4d, 0xe8, 0x9e, 0xbc, 0x1d, 0x7e, 0x70, 0xc3, 0xcb, 0xa3, 0xe9, 0x3f, -0x3c, 0x2f, 0x4f, 0xad, 0xff, 0xa0, 0x02, 0xc9, 0x82, 0xa8, 0x1f, 0xdc, -0xd2, 0x2c, 0x54, 0xb5, 0xb4, 0x8b, 0xe9, 0xe3, 0xdc, 0x51, 0x8d, 0x89, -0xc4, 0x28, 0xeb, 0x63, 0xfe, 0xc1, 0x80, 0xeb, 0xce, 0xfe, 0x21, 0x0f, -0x82, 0x65, 0x0c, 0x69, 0x56, 0x3d, 0x14, 0x2d, 0xd2, 0x79, 0x4d, 0x28, -0xc7, 0x7a, 0x1d, 0x2d, 0xd2, 0x59, 0xa9, 0x65, 0x4c, 0xae, 0x32, 0xea, -0x07, 0xaf, 0x00, 0x8c, 0x71, 0x77, 0x83, 0xc4, 0x81, 0xa0, 0xc5, 0x97, -0x3c, 0x69, 0xa7, 0x66, 0x59, 0x7a, 0x48, 0x8e, 0xd7, 0xfa, 0x99, 0x80, -0xc4, 0x37, 0x54, 0xf0, 0x4a, 0xf4, 0x68, 0x7e, 0x9b, 0xaf, 0xdc, 0xce, -0x69, 0x68, 0xc0, 0xe0, 0x01, 0x5e, 0x04, 0x1e, 0x80, 0x32, 0x3b, 0x3a, -0x41, 0x3e, 0xe0, 0x01, 0x87, 0x2e, 0x89, 0x3b, 0xc4, 0x38, 0x20, 0x05, -0x52, 0xb4, 0x87, 0x2f, 0xb7, 0x6f, 0xdf, 0x0e, 0x36, 0xae, 0xbf, 0xfe, -0x7a, 0x64, 0x21, 0x42, 0x59, 0xe0, 0x86, 0x1c, 0x7c, 0xe0, 0x5a, 0x04, -0x2d, 0x0e, 0x62, 0x25, 0x60, 0xb8, 0x20, 0x81, 0x3d, 0x06, 0x68, 0x71, -0x3e, 0x70, 0x22, 0xe2, 0x05, 0x91, 0x9d, 0xa2, 0x4c, 0x98, 0xa8, 0x71, -0xdc, 0xe0, 0x17, 0x63, 0x4b, 0xd6, 0xdb, 0xd0, 0xd8, 0x99, 0x64, 0x39, -0x9d, 0x13, 0x1b, 0x1b, 0x0b, 0x68, 0x89, 0x3e, 0x40, 0x67, 0xc0, 0x7c, -0x8e, 0xb7, 0x4e, 0xaf, 0x34, 0x21, 0x4a, 0x36, 0x90, 0x40, 0xaf, 0x43, -0xd5, 0x86, 0xa5, 0x8c, 0x1a, 0x35, 0xca, 0x8f, 0xf6, 0xe1, 0xe5, 0x34, -0xf9, 0xf2, 0x1e, 0x16, 0x7a, 0xc0, 0x81, 0x03, 0x7b, 0xd7, 0x3b, 0x6b, -0x06, 0x72, 0x53, 0xc2, 0xfb, 0x55, 0xfd, 0x4c, 0x4b, 0x49, 0xd5, 0x07, -0x54, 0xf0, 0x9e, 0xe0, 0x15, 0x74, 0xe7, 0x86, 0x3a, 0xd9, 0xd8, 0x2c, -0x9b, 0x94, 0xfa, 0x31, 0x57, 0xa4, 0x46, 0x4c, 0xd1, 0x74, 0xff, 0x5e, -0xb6, 0x6c, 0x19, 0xa4, 0x0c, 0x1d, 0xb3, 0x31, 0x20, 0x32, 0xd1, 0xa7, -0x9d, 0x12, 0x3d, 0xe0, 0x81, 0x8c, 0x67, 0xcc, 0xf3, 0x68, 0x45, 0xc8, -0xd3, 0x6c, 0xf0, 0xc4, 0x3e, 0xc0, 0xfb, 0x58, 0x23, 0x42, 0x47, 0x39, -0x13, 0x62, 0x82, 0xee, 0x01, 0x89, 0x1c, 0x7c, 0xbe, 0xe5, 0x96, 0x5b, -0x64, 0x6b, 0x81, 0x7a, 0x00, 0x03, 0x28, 0x82, 0xbf, 0x01, 0x27, 0xcc, -0x9d, 0x08, 0x27, 0xec, 0xc4, 0xef, 0xbf, 0xff, 0x3e, 0xbf, 0x72, 0xf2, -0xb4, 0x69, 0xd3, 0xf0, 0xf2, 0xea, 0x1d, 0xd7, 0xfd, 0x98, 0xbf, 0x4f, -0x97, 0x50, 0xac, 0x5f, 0x4f, 0x25, 0x55, 0xd7, 0xa2, 0xfc, 0x61, 0x7d, -0x62, 0x0b, 0xc0, 0x4d, 0xc1, 0xbe, 0x83, 0x41, 0x56, 0xb7, 0x3e, 0x01, -0x09, 0x62, 0x01, 0x89, 0x89, 0xd2, 0x3b, 0x86, 0x99, 0xef, 0xab, 0x3b, -0x5e, 0x7c, 0x9a, 0x55, 0xe5, 0x9e, 0x8c, 0x34, 0x48, 0x46, 0xa7, 0xee, -0x58, 0xd4, 0xe7, 0x43, 0x97, 0x0f, 0x5e, 0x34, 0x6f, 0x1c, 0x33, 0x0f, -0x02, 0x70, 0x50, 0xa6, 0x8a, 0xf8, 0xe0, 0xb9, 0x7e, 0xa6, 0x5d, 0x54, -0xa8, 0x58, 0x0f, 0x7c, 0xe3, 0xa4, 0xf3, 0x21, 0xcc, 0xe0, 0x5b, 0x25, -0xeb, 0x88, 0x12, 0x60, 0xe8, 0xc4, 0xc8, 0x33, 0x6c, 0x5d, 0x44, 0x7a, -0xda, 0x99, 0x34, 0x30, 0xc0, 0x83, 0x0b, 0x39, 0x52, 0x9a, 0x16, 0x77, -0x01, 0xfa, 0x34, 0x12, 0x0e, 0x1b, 0x3f, 0x22, 0x3e, 0xfc, 0x01, 0x91, -0x89, 0xfc, 0x66, 0xf0, 0x80, 0x90, 0x40, 0xe7, 0x38, 0x3c, 0x2c, 0xb8, -0xd2, 0x41, 0x23, 0x91, 0x0e, 0xc8, 0xd3, 0xd8, 0xd1, 0xd8, 0xe6, 0xd9, -0xec, 0xf1, 0xfb, 0x42, 0x43, 0xc8, 0x42, 0xec, 0xaf, 0xe0, 0x47, 0x56, -0x8d, 0x83, 0x89, 0x91, 0x14, 0x0a, 0xd1, 0xf3, 0x57, 0x60, 0x40, 0x97, -0x2d, 0x76, 0x5f, 0xb0, 0x84, 0x65, 0x1a, 0x15, 0x05, 0x4f, 0x0b, 0xe2, -0xbb, 0x9d, 0x49, 0x56, 0xca, 0x39, 0xa3, 0x47, 0x8f, 0x06, 0xb1, 0xac, -0x30, 0x4e, 0x25, 0x50, 0x21, 0x0e, 0x0a, 0xac, 0x52, 0x86, 0xbe, 0xa6, -0x1e, 0xe6, 0x86, 0xad, 0xa6, 0x4f, 0x9f, 0x3e, 0x94, 0xb5, 0x8d, 0x8b, -0xb3, 0xa8, 0x69, 0x5d, 0x29, 0x0f, 0xe5, 0xe1, 0xa6, 0x50, 0x02, 0xd1, -0x8d, 0x50, 0x11, 0x1b, 0x22, 0xff, 0xf3, 0xf8, 0x2d, 0x5a, 0xb4, 0x40, -0x06, 0x56, 0x97, 0x20, 0x25, 0xb2, 0x79, 0x41, 0x12, 0xbc, 0x3e, 0x0e, -0x64, 0x69, 0x82, 0x88, 0x03, 0x79, 0x0a, 0x76, 0x40, 0xe4, 0x6a, 0xb6, -0x4b, 0x88, 0x04, 0xc2, 0xf8, 0xe5, 0x2f, 0x7f, 0xe9, 0x2e, 0x2b, 0xd5, -0x96, 0x04, 0x25, 0x4c, 0x9c, 0x21, 0x20, 0x50, 0xde, 0x1c, 0x34, 0xc7, -0x1e, 0xcc, 0xae, 0xcc, 0x06, 0x86, 0x7d, 0x00, 0x49, 0x06, 0xe2, 0xe6, -0x40, 0x8c, 0x61, 0xde, 0x40, 0x85, 0x0d, 0x80, 0x07, 0x1e, 0x3c, 0x78, -0x30, 0xff, 0x63, 0x70, 0xc4, 0xd8, 0x0c, 0x45, 0x22, 0xe7, 0x20, 0xe4, -0x80, 0x54, 0x39, 0x99, 0xb5, 0x00, 0x0f, 0x12, 0x19, 0xca, 0x4e, 0x09, -0x7f, 0x80, 0xa6, 0x11, 0xac, 0x21, 0x62, 0x8c, 0x30, 0x30, 0x25, 0x90, -0xa0, 0x7c, 0xba, 0xe2, 0x56, 0xe7, 0x57, 0x26, 0x40, 0x29, 0x2b, 0xd0, -0x82, 0x08, 0x84, 0x62, 0x80, 0x7c, 0x05, 0x48, 0x78, 0x42, 0x76, 0x53, -0x58, 0x01, 0xd7, 0xc2, 0x5e, 0x94, 0x80, 0xc4, 0x38, 0x14, 0x9b, 0xd1, -0x0b, 0x93, 0x05, 0xb2, 0xa6, 0xf6, 0xaf, 0x85, 0xf5, 0xe9, 0x41, 0x31, -0xf6, 0x2f, 0x24, 0x0f, 0x9b, 0xe8, 0x03, 0x2a, 0x4d, 0xf0, 0xbc, 0x1c, -0xbc, 0x3f, 0x0f, 0xd7, 0xa2, 0xbd, 0x10, 0xc3, 0xaf, 0xea, 0x06, 0x70, -0x26, 0x92, 0x15, 0x46, 0x36, 0x56, 0x98, 0x75, 0x36, 0x68, 0xe4, 0xd8, -0x85, 0x2d, 0xcb, 0xbf, 0x5b, 0x8e, 0x8f, 0x06, 0xa8, 0x57, 0x12, 0x21, -0x64, 0x08, 0xa9, 0x83, 0x6d, 0x1b, 0x5e, 0x87, 0xef, 0x88, 0x1d, 0x0d, -0x7a, 0x45, 0x4b, 0x31, 0x5b, 0x3e, 0x50, 0x0b, 0xd9, 0xec, 0x48, 0x42, -0xe4, 0xbd, 0xa3, 0xfe, 0xf1, 0xea, 0x99, 0x06, 0xab, 0xc1, 0xc1, 0xdc, -0xa0, 0x7b, 0x0e, 0x88, 0x01, 0x55, 0x01, 0xea, 0x84, 0x00, 0x10, 0x77, -0x11, 0x10, 0x90, 0x91, 0x38, 0xa0, 0x04, 0x7e, 0x85, 0x24, 0x38, 0x01, -0x29, 0x7d, 0xc6, 0x8c, 0x19, 0x10, 0x06, 0xd2, 0x2f, 0x54, 0x41, 0x2e, -0x34, 0x12, 0x0a, 0x7b, 0x1c, 0xf5, 0x48, 0x91, 0xae, 0xf1, 0x35, 0x31, -0x0d, 0xb6, 0xe3, 0xde, 0xbd, 0x7b, 0x43, 0x63, 0x8c, 0x09, 0x75, 0x71, -0x3e, 0xe4, 0xb7, 0x70, 0xe1, 0x42, 0x79, 0x7c, 0x54, 0x4a, 0x7e, 0xa5, -0xb5, 0x39, 0x37, 0xe2, 0x76, 0xcc, 0x87, 0xff, 0xa1, 0x55, 0x28, 0x4d, -0x95, 0xc1, 0x46, 0x06, 0xb1, 0xd4, 0xdf, 0xec, 0xf2, 0x0a, 0x51, 0xd2, -0x11, 0xa2, 0x78, 0x61, 0x50, 0x24, 0x8c, 0x5e, 0xa6, 0x88, 0x70, 0x02, -0x94, 0x31, 0xfd, 0xa2, 0xc8, 0xb2, 0xd3, 0xf3, 0x0c, 0x48, 0x2f, 0xdc, -0x18, 0xc0, 0x20, 0xcc, 0xe8, 0x07, 0xdf, 0xf0, 0x3d, 0x7f, 0xe5, 0x1c, -0xce, 0x14, 0xf1, 0x06, 0x41, 0x08, 0x5e, 0x26, 0x12, 0x0e, 0x78, 0x10, -0x09, 0x87, 0x14, 0x10, 0xe4, 0x25, 0x09, 0x4d, 0x41, 0xb9, 0x14, 0x87, -0xae, 0x30, 0x2b, 0x71, 0x23, 0xb2, 0x95, 0xc2, 0x40, 0x60, 0x1d, 0x08, -0xd9, 0xf8, 0x80, 0x11, 0xc4, 0x09, 0x8e, 0x00, 0x24, 0x1c, 0xfc, 0x8a, -0xb6, 0xc0, 0xd3, 0xf2, 0x57, 0xbe, 0xd4, 0xc3, 0x04, 0x3c, 0x90, 0x17, -0xfa, 0x22, 0x5e, 0x3f, 0x14, 0x53, 0x02, 0xa1, 0xc9, 0xc5, 0x23, 0x61, -0x12, 0x57, 0x20, 0xd1, 0x1f, 0x44, 0x31, 0x10, 0x2a, 0x22, 0x3f, 0xa4, -0x2e, 0x60, 0x67, 0x23, 0x14, 0x9c, 0x64, 0x2e, 0xac, 0x2e, 0x04, 0xae, -0xa1, 0x50, 0x92, 0xf4, 0x6c, 0x39, 0xac, 0x9e, 0xa5, 0x68, 0x1f, 0x12, -0x72, 0x26, 0xb9, 0x44, 0xc0, 0x9e, 0x67, 0xc7, 0x91, 0xa7, 0xbb, 0x17, -0xd4, 0x38, 0x4c, 0x95, 0x40, 0x23, 0x0a, 0x3c, 0x4b, 0x0e, 0x96, 0xde, -0x5b, 0x1a, 0x42, 0x44, 0xcc, 0x90, 0xc5, 0x87, 0x22, 0xf5, 0x4b, 0x38, -0x13, 0x3b, 0x38, 0xee, 0x64, 0x66, 0x8e, 0x17, 0x0c, 0x83, 0x8f, 0xfa, -0x2b, 0x91, 0x04, 0xc4, 0x23, 0x63, 0x32, 0x46, 0x7f, 0x25, 0xa7, 0x12, -0x77, 0xbb, 0xa1, 0xd6, 0x1b, 0x34, 0xc7, 0x2e, 0x8e, 0x84, 0xa6, 0x87, -0xe8, 0xb9, 0x7b, 0x2e, 0xf6, 0x63, 0x11, 0x86, 0x99, 0x09, 0x3b, 0x3d, -0x2c, 0x5a, 0x91, 0x01, 0xe2, 0xae, 0x1c, 0x22, 0xe5, 0x22, 0x1a, 0x41, -0x03, 0xd0, 0x28, 0x26, 0x10, 0x14, 0x3c, 0xfe, 0x87, 0x96, 0xd8, 0x1c, -0xf9, 0x1e, 0x01, 0x18, 0x3a, 0x11, 0x53, 0x21, 0x72, 0x01, 0xdb, 0x1c, -0x07, 0x9b, 0x20, 0x7b, 0x1f, 0x3b, 0x32, 0x34, 0xc3, 0xe5, 0x0c, 0x22, -0x62, 0x33, 0xb7, 0x90, 0x31, 0x21, 0x30, 0x2a, 0x48, 0xf0, 0x27, 0x75, -0xf0, 0x2b, 0x5f, 0x0a, 0x41, 0x62, 0xc3, 0x14, 0x61, 0x0c, 0x49, 0x04, -0x79, 0x07, 0x52, 0x61, 0x85, 0xdd, 0xe5, 0x6a, 0xdb, 0xe5, 0x15, 0xa0, -0x42, 0x59, 0xa2, 0x90, 0x7d, 0x19, 0x14, 0xa6, 0xc1, 0xc6, 0xcc, 0x3e, -0x8d, 0x49, 0x87, 0x3b, 0xc1, 0xe3, 0xc0, 0x09, 0xf2, 0x0f, 0x54, 0xce, -0xbd, 0xf1, 0xd1, 0x32, 0x7b, 0x1e, 0x95, 0xff, 0x39, 0xf8, 0x86, 0xef, -0x11, 0x78, 0x30, 0x3e, 0x3e, 0xf8, 0xe0, 0x83, 0x3c, 0x1b, 0xaf, 0x9f, -0x2a, 0xd0, 0xec, 0xee, 0xd4, 0x24, 0x96, 0xdd, 0x1d, 0xbc, 0x41, 0x10, -0xe0, 0x01, 0x1d, 0x08, 0xce, 0x60, 0x99, 0x05, 0x22, 0xf0, 0x10, 0xbe, -0x01, 0x3c, 0x60, 0x1d, 0x9c, 0x8f, 0xd5, 0x19, 0x9c, 0x88, 0xac, 0x85, -0x50, 0xce, 0xf7, 0x8c, 0xa0, 0xfb, 0x7d, 0xf4, 0x57, 0x88, 0xeb, 0x00, -0xb2, 0x20, 0xd1, 0x9e, 0xe8, 0x20, 0x48, 0x3f, 0xc0, 0x22, 0x0c, 0x58, -0xd9, 0x01, 0x0c, 0x50, 0xd1, 0x93, 0xee, 0x75, 0x55, 0x18, 0xeb, 0x87, -0x6e, 0xc2, 0xc2, 0xce, 0x43, 0x96, 0x8f, 0xb2, 0xd5, 0xe0, 0x67, 0xc0, -0x4a, 0xa3, 0x77, 0xbe, 0x64, 0x2f, 0x64, 0x6d, 0xe1, 0x93, 0xd0, 0x96, -0x9a, 0x36, 0x79, 0x88, 0x18, 0x94, 0x08, 0x4a, 0x35, 0xcf, 0x56, 0x5a, -0x5a, 0xca, 0x81, 0x7e, 0xc2, 0x76, 0x03, 0x85, 0xb1, 0xe0, 0x3a, 0x32, -0xc9, 0xdf, 0x30, 0x9b, 0x59, 0x99, 0x39, 0x46, 0x4c, 0xcb, 0xf4, 0x46, -0x3d, 0x61, 0xcd, 0xdc, 0xc2, 0xdc, 0x2b, 0xce, 0xc9, 0x1c, 0x84, 0x1c, -0xd9, 0x28, 0xf1, 0x09, 0x20, 0x53, 0x08, 0x01, 0x70, 0x40, 0x12, 0x1c, -0x4c, 0x8f, 0x03, 0x4a, 0x80, 0x5a, 0xd8, 0x0a, 0xe1, 0x03, 0xec, 0x86, -0x90, 0x29, 0x32, 0x33, 0xf4, 0x80, 0x39, 0x84, 0x2d, 0x92, 0x3f, 0x41, -0x27, 0x10, 0x15, 0xdf, 0x20, 0x48, 0xb3, 0x4b, 0x72, 0x40, 0x75, 0xec, -0x74, 0x90, 0x1c, 0x57, 0x41, 0x4e, 0x0c, 0xc8, 0xf8, 0x02, 0x2a, 0x86, -0x15, 0x02, 0x03, 0x45, 0x8c, 0x0c, 0x11, 0xf2, 0x3f, 0x07, 0xbf, 0xf2, -0x25, 0x87, 0x92, 0xae, 0xd9, 0xcd, 0x71, 0x92, 0x22, 0x3b, 0x61, 0xd2, -0xb0, 0x8c, 0x1e, 0x10, 0x06, 0xe0, 0x03, 0x2a, 0xc4, 0x12, 0xc2, 0x36, -0xc6, 0x3b, 0x83, 0x10, 0x09, 0x20, 0x81, 0x8e, 0xd9, 0xda, 0x11, 0x54, -0xd8, 0xe3, 0x99, 0xae, 0x08, 0x33, 0x80, 0x1b, 0x9c, 0x50, 0x07, 0x09, -0xc9, 0x5e, 0x0e, 0x3e, 0xf3, 0x0d, 0xdf, 0xf3, 0x90, 0xb2, 0x04, 0xd8, -0x94, 0x78, 0x5a, 0xb6, 0x79, 0x54, 0x05, 0x84, 0x25, 0xb6, 0x76, 0x80, -0xab, 0xc2, 0x42, 0x61, 0x4a, 0x66, 0xbb, 0xa4, 0x32, 0x2a, 0x2b, 0xbe, -0x01, 0x36, 0x98, 0x0c, 0x0f, 0xa0, 0x0e, 0x89, 0x27, 0xe5, 0x57, 0x1e, -0x98, 0x74, 0x36, 0xf5, 0xfe, 0x10, 0x1e, 0x70, 0xe5, 0x52, 0x28, 0x09, -0x18, 0xf8, 0x54, 0x88, 0xc9, 0xa6, 0xcd, 0x9e, 0xd3, 0xcc, 0xb9, 0x94, -0x72, 0x77, 0x3b, 0x7d, 0x0b, 0xb0, 0x8d, 0xaa, 0xa9, 0xb2, 0xcb, 0xf2, -0xda, 0xe0, 0xc6, 0x3a, 0xf1, 0x79, 0xc8, 0xe2, 0xd7, 0x23, 0xff, 0x3a, -0x77, 0xee, 0x0c, 0xa1, 0xb0, 0x3d, 0xb1, 0x07, 0xeb, 0x97, 0xdb, 0x4c, -0x8b, 0x93, 0x87, 0x25, 0xee, 0x46, 0x37, 0x71, 0x5a, 0x5a, 0xc0, 0xd5, -0xe0, 0x48, 0x71, 0x64, 0x3b, 0x11, 0x4f, 0xc5, 0x46, 0xa3, 0xbe, 0x84, -0x4d, 0x31, 0x01, 0x68, 0x91, 0xbd, 0x0f, 0xca, 0x16, 0x02, 0x50, 0x07, -0xbb, 0xa1, 0x6c, 0x88, 0x50, 0x0b, 0x4f, 0x0a, 0xa1, 0xb3, 0x0b, 0x60, -0x53, 0x81, 0x52, 0x75, 0xa9, 0x18, 0x3a, 0x61, 0x11, 0x20, 0x12, 0x38, -0x3f, 0xf4, 0xc6, 0x66, 0x07, 0x79, 0x80, 0x0d, 0xe8, 0x0d, 0x4a, 0x63, -0x04, 0xf0, 0x83, 0xe9, 0x85, 0xf1, 0x01, 0x89, 0x10, 0x18, 0x52, 0x16, -0xc3, 0x72, 0x40, 0x84, 0x1c, 0x7c, 0x00, 0x72, 0x50, 0x1d, 0x07, 0x60, -0xe0, 0x33, 0x5f, 0xc2, 0x70, 0xb8, 0x97, 0x84, 0x8e, 0xbb, 0xdb, 0x79, -0x7d, 0x43, 0x85, 0x99, 0x2e, 0x21, 0x41, 0xd2, 0x2d, 0xd8, 0xad, 0x21, -0x6b, 0x66, 0x8f, 0xf4, 0xc2, 0xa4, 0x31, 0x16, 0x51, 0xee, 0x85, 0xed, -0x1f, 0x66, 0xc2, 0x24, 0xf8, 0x9f, 0xcf, 0x3c, 0x1e, 0xe0, 0x01, 0x06, -0x3c, 0x3c, 0x92, 0x0f, 0x8f, 0x07, 0xae, 0x44, 0x73, 0x90, 0x28, 0x14, -0x11, 0x93, 0x3c, 0xc4, 0xb8, 0xdb, 0xf9, 0x93, 0x0c, 0xc2, 0x80, 0x7a, -0x4b, 0x0d, 0x36, 0xda, 0xf2, 0xcb, 0x8b, 0x12, 0x4a, 0x22, 0x9d, 0xc0, -0xdc, 0xbd, 0x12, 0x2a, 0xb1, 0x99, 0xbb, 0x8b, 0x6f, 0x47, 0x91, 0x14, -0x7a, 0x27, 0x2f, 0x0f, 0x05, 0x43, 0x7d, 0x43, 0x81, 0x71, 0x0f, 0x48, -0xd6, 0x1b, 0xcf, 0x61, 0xd1, 0x67, 0x77, 0xe4, 0x72, 0x44, 0x6a, 0x75, -0x39, 0x19, 0xe1, 0xf6, 0xb1, 0xcd, 0x99, 0x3a, 0xf3, 0xc9, 0xcc, 0x34, -0x46, 0x2e, 0x13, 0xa2, 0x42, 0x35, 0x78, 0x50, 0xea, 0x4a, 0x33, 0xfc, -0xa1, 0xd1, 0x04, 0x81, 0xb7, 0xba, 0x8b, 0x06, 0x05, 0x92, 0xcd, 0x5b, -0x4c, 0x88, 0x6c, 0x7f, 0x42, 0x00, 0xea, 0x80, 0x12, 0x38, 0xc4, 0x32, -0x2e, 0xa2, 0x32, 0xbc, 0x5d, 0x36, 0x32, 0xe8, 0x01, 0x7a, 0x65, 0xab, -0x65, 0xaf, 0x14, 0x3a, 0x91, 0x8e, 0xa6, 0xc8, 0x39, 0x72, 0x40, 0x6c, -0xec, 0x9e, 0x90, 0x35, 0xa3, 0xb1, 0x11, 0x33, 0x38, 0xb8, 0xe2, 0x03, -0xbf, 0xf2, 0xc6, 0x45, 0x90, 0x86, 0xc6, 0x20, 0x42, 0x39, 0xf8, 0x15, -0x6a, 0xe4, 0x4f, 0xf2, 0x57, 0xfe, 0x04, 0xc3, 0x01, 0x5d, 0xdc, 0xce, -0x1c, 0x63, 0xa6, 0x13, 0x98, 0x0f, 0xbc, 0x42, 0xbf, 0x4c, 0xf8, 0x06, -0x13, 0xd5, 0x85, 0x19, 0x08, 0x1d, 0xc6, 0x84, 0x14, 0xc4, 0xc3, 0x08, -0xd7, 0x53, 0x07, 0xdf, 0x70, 0xf0, 0x57, 0xce, 0x61, 0x21, 0x54, 0xf6, -0x8c, 0x0a, 0x90, 0xb6, 0x43, 0xf4, 0x5e, 0xcf, 0x11, 0x36, 0xc2, 0xfa, -0x62, 0x90, 0xf6, 0x9b, 0x2c, 0x7c, 0xa2, 0x21, 0x39, 0x59, 0x27, 0x4d, -0x7d, 0x93, 0xb6, 0x59, 0x94, 0x44, 0x2f, 0x63, 0x4e, 0xdc, 0x17, 0x52, -0xb5, 0x3e, 0x88, 0x87, 0x24, 0x04, 0x6e, 0x4d, 0x07, 0x67, 0x75, 0x32, -0xec, 0x91, 0x1d, 0x9a, 0x5d, 0x56, 0x8f, 0x8e, 0xf1, 0xa9, 0xda, 0x22, -0xba, 0x87, 0x4e, 0xdf, 0x28, 0xd9, 0x6a, 0x70, 0x04, 0x3f, 0x77, 0x49, -0xed, 0x27, 0xd7, 0x94, 0xe6, 0x3f, 0x61, 0x63, 0x45, 0x76, 0x12, 0xdf, -0x0b, 0x94, 0x0d, 0x89, 0x2b, 0x1a, 0x40, 0xb8, 0xe0, 0x33, 0xff, 0x73, -0x40, 0xfd, 0xfa, 0xb6, 0x28, 0x84, 0x24, 0xd9, 0x54, 0x90, 0x07, 0xc2, -0xb0, 0xc8, 0x0e, 0xaa, 0x9e, 0x9f, 0xf2, 0xd8, 0xf0, 0x72, 0xf9, 0xab, -0x08, 0x54, 0x6c, 0xc4, 0xfc, 0xcf, 0xc1, 0x80, 0x50, 0x17, 0x63, 0x72, -0x40, 0x63, 0xea, 0xe0, 0x57, 0xa8, 0x51, 0x08, 0x52, 0xfe, 0x04, 0xcf, -0x81, 0xe2, 0x11, 0x46, 0x3c, 0x6f, 0xc1, 0x7e, 0xa2, 0x42, 0xe7, 0x1b, -0x42, 0x8b, 0xa2, 0x0d, 0x73, 0x3f, 0x1e, 0xcf, 0xdd, 0xc1, 0x5f, 0x05, -0xf4, 0xca, 0xf2, 0xe8, 0x95, 0xd0, 0x7d, 0x3a, 0x81, 0x99, 0x30, 0x38, -0xcb, 0x7a, 0xe9, 0xa5, 0x97, 0xaa, 0xd7, 0x89, 0x53, 0xd6, 0x0f, 0x42, -0xf7, 0xe9, 0x12, 0xcb, 0x8a, 0xf9, 0xf6, 0x73, 0x97, 0xf5, 0x94, 0x43, -0xb6, 0x79, 0x4c, 0x3d, 0x6a, 0xf2, 0x48, 0x26, 0x9e, 0x43, 0x30, 0xf5, -0x3c, 0x04, 0xf4, 0x19, 0x04, 0x68, 0xf6, 0x69, 0x75, 0x39, 0xa6, 0x24, -0x0f, 0xb5, 0x70, 0xcc, 0xcf, 0xa8, 0x67, 0x90, 0x13, 0x77, 0xa4, 0xbb, -0xc3, 0x31, 0x42, 0xb8, 0x5b, 0x13, 0x1d, 0xd5, 0x48, 0x71, 0x88, 0x4f, -0x18, 0xcd, 0xd9, 0xc8, 0x21, 0x5f, 0x69, 0x33, 0x67, 0x3e, 0x84, 0x12, -0x74, 0x19, 0x41, 0xb7, 0xa9, 0x28, 0x22, 0x31, 0xec, 0xe8, 0xba, 0xf0, -0xcc, 0x98, 0x58, 0x90, 0xf4, 0x91, 0x19, 0x53, 0x11, 0x98, 0x90, 0xa2, -0x3a, 0x38, 0x4d, 0x3e, 0xdb, 0x24, 0xbc, 0x40, 0x51, 0x21, 0x54, 0x2b, -0x8f, 0x04, 0xf7, 0xe0, 0x10, 0x84, 0x58, 0x1e, 0x72, 0x82, 0x32, 0x2b, -0xf9, 0x44, 0xf1, 0x76, 0x4e, 0x66, 0x70, 0x9e, 0x9c, 0x5d, 0x41, 0xdf, -0x2c, 0x2d, 0x2b, 0xcd, 0xf8, 0x44, 0xf4, 0x9e, 0x4f, 0x76, 0xd7, 0xcb, -0xdd, 0x32, 0xc7, 0xc8, 0x72, 0x28, 0x3d, 0x47, 0x0c, 0xdf, 0xa2, 0xce, -0x28, 0xdc, 0x95, 0x0f, 0x53, 0xe3, 0x50, 0xed, 0x41, 0x9d, 0x8f, 0x0e, -0x80, 0xf6, 0x89, 0x17, 0x48, 0x7d, 0x03, 0xde, 0xec, 0x3f, 0x29, 0x72, -0x60, 0xdd, 0x9c, 0x52, 0xab, 0x1a, 0x06, 0x59, 0xdd, 0xe8, 0xe4, 0xae, -0x83, 0x04, 0xf1, 0xce, 0xba, 0x19, 0x17, 0x23, 0x87, 0xc4, 0x38, 0x22, -0x45, 0xb3, 0xd3, 0x4b, 0xeb, 0x20, 0xf3, 0xa1, 0x28, 0xc1, 0xf0, 0x5a, -0x15, 0x6d, 0x28, 0x3a, 0x31, 0x9f, 0xe0, 0x8e, 0xc6, 0x64, 0x4c, 0xcb, -0x43, 0xc0, 0xe0, 0x6e, 0x4c, 0x33, 0x69, 0x05, 0x07, 0x15, 0x76, 0x48, -0xb6, 0x02, 0xce, 0x11, 0xf3, 0x14, 0xbb, 0x94, 0xbe, 0x59, 0x06, 0x25, -0xdb, 0xdb, 0x03, 0x6d, 0x61, 0xd0, 0x34, 0x9b, 0x65, 0x7c, 0xea, 0x64, -0x45, 0x5d, 0x1c, 0x35, 0x82, 0x1e, 0x34, 0x30, 0xa8, 0xb3, 0x77, 0x9a, -0x26, 0xef, 0x59, 0x5d, 0x8b, 0xf3, 0x0e, 0xcb, 0xa6, 0x6e, 0x66, 0xf0, -0xa9, 0x91, 0x85, 0xa1, 0x60, 0x14, 0x1e, 0x06, 0x35, 0x32, 0x55, 0x4b, -0xdc, 0xad, 0x80, 0xce, 0x5e, 0x30, 0x25, 0x23, 0xfe, 0x89, 0x87, 0xc1, -0x5d, 0x8f, 0xb9, 0x0a, 0x20, 0x83, 0xc0, 0x6f, 0x11, 0x6e, 0xa8, 0x60, -0x73, 0xd2, 0x9d, 0x5f, 0x3e, 0x35, 0x9a, 0xb1, 0xbf, 0xad, 0xaa, 0x33, -0x51, 0x34, 0xf5, 0x50, 0x36, 0x45, 0x46, 0x38, 0x37, 0xec, 0x8f, 0x66, -0x59, 0x22, 0x0d, 0x0b, 0xb2, 0x9d, 0x92, 0x7e, 0xc4, 0x9f, 0xea, 0x98, -0xc4, 0x3d, 0xaa, 0x7e, 0x25, 0xc2, 0xdc, 0x7e, 0xe3, 0x18, 0xc6, 0xd1, -0x63, 0xce, 0x89, 0xc2, 0xd0, 0x05, 0x39, 0x0f, 0x59, 0x03, 0xaa, 0xc3, -0x37, 0xf7, 0xc5, 0x85, 0x27, 0x85, 0x33, 0xd0, 0xb3, 0xd1, 0x95, 0xdd, -0xf9, 0xc8, 0x02, 0xa7, 0xda, 0xf2, 0x1e, 0x21, 0xac, 0x50, 0x21, 0x6e, -0x3e, 0xdc, 0x99, 0x8a, 0x32, 0xdc, 0xf5, 0xd2, 0xb6, 0x4f, 0xb2, 0x9e, -0xcf, 0xc4, 0xed, 0x65, 0x66, 0x14, 0x64, 0x84, 0xfa, 0x34, 0xbe, 0x9e, -0x41, 0xaa, 0x46, 0x73, 0xd7, 0xf8, 0xc7, 0x3c, 0x32, 0xc9, 0x89, 0xea, -0x2a, 0x3d, 0x93, 0xd3, 0xa7, 0xc6, 0x31, 0xe7, 0xb6, 0xf6, 0xd7, 0x1f, -0x04, 0x41, 0x4e, 0x4f, 0xba, 0xa4, 0x66, 0x8c, 0xe5, 0x13, 0x19, 0xfc, -0x7d, 0x84, 0xeb, 0xe3, 0x37, 0xc0, 0x48, 0x8a, 0x95, 0x09, 0x05, 0xd7, -0x9c, 0xe3, 0x56, 0xde, 0xd4, 0x1c, 0xac, 0xf1, 0xc3, 0x0d, 0x15, 0xd8, -0x28, 0xf4, 0xe6, 0x29, 0xbc, 0x6c, 0x9f, 0x08, 0xd4, 0xd7, 0x93, 0x2d, -0x09, 0xda, 0xd7, 0x84, 0x1e, 0x73, 0xe9, 0x41, 0x62, 0x2e, 0xec, 0x37, -0x31, 0xd1, 0x43, 0xf4, 0xf5, 0x5a, 0x4f, 0x3e, 0xd5, 0xef, 0xd0, 0x35, -0x7e, 0x22, 0xa9, 0x08, 0xa3, 0x50, 0x20, 0xc1, 0xf9, 0xed, 0x2e, 0x77, -0xf7, 0xaa, 0x09, 0xa5, 0x45, 0x06, 0x08, 0x7c, 0x24, 0x6a, 0x41, 0x35, -0x23, 0xc5, 0xe6, 0x21, 0xa1, 0x09, 0xc1, 0xa2, 0xd4, 0x8a, 0x1c, 0x27, -0xac, 0x50, 0xc1, 0xe6, 0x84, 0xa7, 0x5c, 0xbd, 0x4e, 0x36, 0x51, 0x0f, -0xe5, 0x86, 0x7c, 0x05, 0x80, 0xf9, 0x7c, 0xc3, 0x4e, 0x29, 0xf7, 0xa5, -0x62, 0x9a, 0xaf, 0xf9, 0x93, 0x7a, 0xa1, 0x5b, 0x19, 0xc4, 0xa7, 0xe2, -0xdb, 0x96, 0x65, 0xcc, 0x81, 0x8a, 0x7d, 0x7f, 0xa5, 0x9e, 0xe9, 0xcf, -0xdd, 0xd1, 0x28, 0xc8, 0x51, 0x51, 0xcb, 0x48, 0x90, 0x88, 0xe5, 0x5a, -0xe1, 0x17, 0xa7, 0x40, 0xa8, 0x3a, 0x8d, 0x78, 0x13, 0x62, 0x7f, 0xf0, -0xaf, 0xc1, 0x28, 0x24, 0xef, 0x5c, 0xb4, 0xdb, 0x8a, 0xa4, 0xe6, 0x60, -0xdd, 0x2b, 0xac, 0x50, 0x81, 0x52, 0x41, 0xac, 0x81, 0x7a, 0x4f, 0xf6, -0x53, 0x93, 0x31, 0xbf, 0xb0, 0x59, 0x92, 0x4b, 0x44, 0xd1, 0x37, 0xf6, -0x3f, 0xa2, 0xa1, 0x08, 0xaf, 0xa0, 0x44, 0x08, 0xb9, 0x6c, 0x1e, 0x94, -0x75, 0xa4, 0x6d, 0xb3, 0xf8, 0x84, 0xef, 0xc2, 0x57, 0xbc, 0x19, 0x92, -0x48, 0x3d, 0xbb, 0xed, 0xcc, 0x83, 0xab, 0x04, 0x51, 0x7d, 0x32, 0x74, -0xe8, 0xb3, 0x3f, 0x0d, 0xc2, 0x49, 0xd4, 0xb5, 0xf4, 0x13, 0xd3, 0xad, -0x58, 0x7c, 0x4f, 0xe9, 0x51, 0xcb, 0xa1, 0xf4, 0x56, 0x5a, 0x44, 0x4c, -0xe3, 0x95, 0xc7, 0x28, 0x4c, 0xe0, 0x06, 0x7a, 0xb6, 0x87, 0xbe, 0x41, -0xc1, 0x22, 0xdc, 0x72, 0x1d, 0x27, 0x7c, 0x50, 0xc1, 0xb6, 0xc4, 0xfe, -0x44, 0x10, 0xa5, 0x7a, 0xc1, 0xb7, 0x5c, 0xde, 0xc1, 0x26, 0x65, 0x60, -0xbd, 0x35, 0xd3, 0xb7, 0xfa, 0x86, 0x80, 0x11, 0x72, 0x09, 0x49, 0x22, -0x23, 0x82, 0x70, 0xee, 0x88, 0x26, 0xc0, 0x46, 0xf2, 0xd1, 0xcc, 0xe4, -0x48, 0x98, 0x9d, 0x1f, 0x99, 0x9f, 0x86, 0xdc, 0x34, 0xcf, 0x6e, 0x3b, -0xf3, 0x13, 0x59, 0x06, 0xc3, 0x9e, 0xd9, 0xd0, 0xd7, 0xe6, 0xb3, 0x13, -0x0f, 0xa2, 0xa7, 0x0a, 0x13, 0xaf, 0xa1, 0x47, 0x55, 0x12, 0x8c, 0xe8, -0x6e, 0x1c, 0x3d, 0xd1, 0x8f, 0x40, 0x5a, 0xa2, 0xf4, 0x88, 0xd0, 0xc6, -0xd9, 0x4c, 0x08, 0x4f, 0xe8, 0xea, 0xd9, 0x02, 0xb6, 0x30, 0x41, 0x85, -0xf8, 0xef, 0x60, 0xdc, 0x7a, 0x80, 0xfe, 0xdb, 0x47, 0x47, 0xd8, 0xa4, -0x0c, 0x38, 0x03, 0x8d, 0x49, 0xc9, 0x66, 0xd6, 0x83, 0x49, 0x3d, 0xe0, -0xc4, 0xdd, 0x9f, 0x28, 0x10, 0x68, 0xf3, 0x8e, 0xfa, 0x69, 0xaa, 0x09, -0x2f, 0xc3, 0x7a, 0x75, 0xdb, 0x99, 0xc7, 0x37, 0xa7, 0xbf, 0x93, 0xe4, -0x69, 0xbf, 0x8a, 0x8f, 0x9e, 0x24, 0x4d, 0x55, 0x66, 0x22, 0xae, 0xf5, -0xa7, 0x73, 0x87, 0x2e, 0x52, 0xf0, 0x75, 0x2d, 0x9f, 0x40, 0x6e, 0x52, -0x6e, 0x08, 0x7c, 0x22, 0xb6, 0x02, 0x7f, 0x51, 0xe8, 0x6a, 0x14, 0x61, -0x85, 0x0a, 0x3c, 0x15, 0xec, 0x4f, 0x7a, 0x61, 0x1e, 0x12, 0x0f, 0x7c, -0x95, 0xef, 0x85, 0xe0, 0xc8, 0x7c, 0x27, 0x74, 0x9c, 0xb4, 0xfa, 0x9d, -0x57, 0x15, 0x12, 0x14, 0x44, 0xa8, 0x36, 0x3d, 0x19, 0x70, 0x6f, 0x79, -0xad, 0xac, 0x43, 0x8a, 0xb0, 0x87, 0x0e, 0x1b, 0x1e, 0x26, 0xa3, 0x97, -0x8f, 0xf7, 0xea, 0xb6, 0x33, 0xa0, 0x02, 0xd6, 0x64, 0x86, 0xa8, 0xcd, -0xd6, 0x5b, 0x0c, 0x45, 0x10, 0x87, 0x5e, 0x93, 0x8e, 0xca, 0x0f, 0x7a, -0x66, 0x48, 0x8f, 0xd6, 0x6e, 0xcb, 0xd7, 0xea, 0xed, 0x51, 0x50, 0xf1, -0x25, 0x6f, 0x81, 0x38, 0x3c, 0xa2, 0x9b, 0x3c, 0x57, 0xbd, 0x2f, 0x57, -0xc9, 0x27, 0x58, 0x83, 0x87, 0x09, 0xaf, 0x40, 0xcf, 0x26, 0xb8, 0x40, -0x0f, 0xf4, 0xa0, 0x83, 0x8e, 0x1f, 0xdb, 0xb6, 0x87, 0x4b, 0xa0, 0x78, -0x6a, 0x45, 0xb2, 0x77, 0xba, 0x63, 0x14, 0xd4, 0xfd, 0xf6, 0x70, 0x39, -0xfd, 0x90, 0xdc, 0xfd, 0x55, 0x55, 0x85, 0xf2, 0xdc, 0x48, 0x8d, 0x06, -0x28, 0xe6, 0x11, 0x08, 0x7c, 0x34, 0xcf, 0xc7, 0x3e, 0xb4, 0x10, 0x32, -0xd5, 0xe5, 0x84, 0x78, 0xe8, 0xdd, 0xd3, 0xd9, 0x05, 0xc8, 0x30, 0x71, -0x37, 0x67, 0xdd, 0xf8, 0x46, 0x89, 0x2d, 0x72, 0x06, 0x09, 0xff, 0x26, -0x1a, 0x9a, 0xa8, 0x24, 0x82, 0xdc, 0x42, 0x54, 0xc9, 0x56, 0xa0, 0x0a, -0x13, 0x54, 0xa0, 0x67, 0xb3, 0x45, 0xe9, 0xc9, 0x00, 0xf6, 0x8b, 0xd8, -0xf9, 0x04, 0x1e, 0xbd, 0x86, 0x8a, 0x9e, 0x94, 0x4b, 0x71, 0x13, 0xcf, -0x25, 0x77, 0x0f, 0xae, 0x74, 0x8b, 0x19, 0xc9, 0xa7, 0xf3, 0xea, 0xb6, -0xb3, 0x6c, 0x19, 0x4c, 0x98, 0x93, 0x01, 0x15, 0x54, 0xe3, 0xb5, 0xd9, -0x14, 0x0a, 0x1b, 0x03, 0xd3, 0x56, 0x97, 0x13, 0xe2, 0xa1, 0x0f, 0x45, -0x1b, 0x1a, 0x77, 0x2b, 0x63, 0x08, 0x72, 0x21, 0xf7, 0x4d, 0xea, 0x7b, -0x63, 0x7d, 0x92, 0xbc, 0x85, 0x60, 0xed, 0xd9, 0x95, 0x35, 0x4e, 0x98, -0xa0, 0x82, 0x37, 0xa1, 0x77, 0xd5, 0xc0, 0x58, 0x69, 0x5f, 0xb0, 0xf6, -0x09, 0x15, 0x1f, 0x9f, 0x28, 0x35, 0xe4, 0xeb, 0xe9, 0xd1, 0x9e, 0xbb, -0x41, 0x53, 0x35, 0xd0, 0x83, 0xb1, 0x55, 0x48, 0xd3, 0xb3, 0xdb, 0x0e, -0xa1, 0x8e, 0x3e, 0xed, 0xe6, 0xa9, 0x52, 0x1b, 0xd7, 0x80, 0x8a, 0xcb, -0x47, 0xdb, 0x6d, 0x88, 0x8a, 0x16, 0xa4, 0x5f, 0xab, 0xab, 0x64, 0x00, -0xd5, 0x43, 0x49, 0x42, 0xbd, 0xe4, 0x3d, 0x01, 0x26, 0x88, 0x4f, 0xd2, -0x43, 0x19, 0xf1, 0x89, 0xa0, 0x54, 0x44, 0xd9, 0xca, 0xa2, 0xe6, 0x60, -0xdd, 0x37, 0x1c, 0x50, 0x01, 0xbf, 0x86, 0x6b, 0xeb, 0x4d, 0xc9, 0x48, -0x53, 0xf6, 0x89, 0xd6, 0xed, 0x9f, 0x4c, 0xbf, 0x12, 0xb3, 0xc4, 0x82, -0xd9, 0xde, 0xb3, 0x63, 0x84, 0x6d, 0xde, 0x83, 0x7c, 0x45, 0x15, 0x29, -0xaf, 0x6e, 0x3b, 0x22, 0x08, 0x2d, 0x43, 0xfd, 0xcc, 0x3e, 0x13, 0x92, -0x57, 0x6d, 0x3e, 0x0e, 0x95, 0xbb, 0xd4, 0xb3, 0xe8, 0x7c, 0x0f, 0xae, -0xe5, 0xa1, 0x3f, 0xa0, 0xde, 0x64, 0x9e, 0xcb, 0x71, 0x53, 0xe0, 0xbc, -0x23, 0x01, 0x88, 0xec, 0x05, 0x62, 0xb6, 0x25, 0xd5, 0x3e, 0x58, 0xd4, -0x59, 0x59, 0xe3, 0x84, 0x09, 0x2a, 0x10, 0x9f, 0xf4, 0x5a, 0xb4, 0xe5, -0xd7, 0x94, 0x4c, 0xcf, 0xde, 0x54, 0x24, 0xe5, 0xb5, 0xf3, 0x2a, 0x3d, -0x5a, 0xcf, 0x6e, 0x76, 0x5b, 0xc1, 0x92, 0x6a, 0xb9, 0x9e, 0xab, 0xcf, -0x93, 0x47, 0xce, 0xbd, 0xc6, 0xf6, 0xae, 0x67, 0x26, 0x77, 0xba, 0x2b, -0xe9, 0x28, 0xc5, 0x2a, 0x60, 0xd3, 0x34, 0x8c, 0x8f, 0xcf, 0x9d, 0x82, -0xe4, 0xb9, 0x30, 0x26, 0xf9, 0x8c, 0xfa, 0x85, 0x52, 0xaf, 0x09, 0x3d, -0x9b, 0x6c, 0x07, 0xde, 0x82, 0xa1, 0x92, 0x55, 0x65, 0x91, 0x75, 0x80, -0xf7, 0x0d, 0x79, 0x54, 0x48, 0x04, 0x3b, 0x7b, 0x95, 0xee, 0x5e, 0xb0, -0xef, 0xd6, 0xb5, 0xb9, 0xad, 0xca, 0x69, 0x84, 0x6d, 0x9b, 0x9b, 0xf3, -0x12, 0x1d, 0xe8, 0x39, 0x2c, 0xf7, 0xcd, 0xc3, 0xae, 0xc2, 0x02, 0xf8, -0x8f, 0xdd, 0xdd, 0x8b, 0x32, 0x98, 0x1e, 0x26, 0x8c, 0xf4, 0x8f, 0xc9, -0x98, 0x11, 0x2c, 0xdb, 0x4a, 0x91, 0x13, 0xa7, 0xd3, 0x28, 0x95, 0x0e, -0x6d, 0x3e, 0x11, 0x66, 0x6b, 0x4b, 0x54, 0x50, 0x01, 0xd6, 0xf3, 0x08, -0x7a, 0x19, 0x63, 0x22, 0xf6, 0x0d, 0x75, 0xd4, 0x43, 0xd7, 0x9f, 0xad, -0x03, 0x29, 0xe4, 0x51, 0x21, 0x29, 0x81, 0xf3, 0xe7, 0xcf, 0x57, 0xef, -0x18, 0xef, 0x92, 0x4d, 0xca, 0xf0, 0xf5, 0x34, 0x44, 0x76, 0x33, 0x25, -0x79, 0x6d, 0x32, 0x22, 0xe5, 0xf8, 0x3d, 0x94, 0x4d, 0xb8, 0x67, 0x5d, -0x1f, 0x0f, 0x33, 0xd9, 0x75, 0xd5, 0xc5, 0x56, 0xdc, 0x96, 0xf6, 0x56, -0x5c, 0x7e, 0xfa, 0x94, 0x50, 0x3f, 0x6c, 0x3e, 0x94, 0xea, 0xc3, 0xa2, -0x2e, 0x47, 0x70, 0xa2, 0xb5, 0x9f, 0xe7, 0xcb, 0x41, 0xaf, 0xee, 0xbb, -0x24, 0x93, 0x96, 0xd8, 0x75, 0xac, 0x4f, 0x1e, 0xea, 0xa8, 0x07, 0xb8, -0x6d, 0x57, 0xca, 0xe5, 0x21, 0x8f, 0x0a, 0xc9, 0xa9, 0xd0, 0xad, 0x4f, -0xd4, 0x39, 0xb7, 0x49, 0x19, 0x3e, 0x9d, 0x06, 0x19, 0xe9, 0xe9, 0x35, -0x42, 0x4c, 0xa8, 0xf5, 0x96, 0xb5, 0xe6, 0xd5, 0xc8, 0x52, 0x8e, 0x9f, -0xa0, 0x6e, 0x0f, 0xfe, 0x0a, 0x0f, 0x7f, 0x22, 0x14, 0x5c, 0x55, 0x00, -0xb1, 0x6c, 0x20, 0x86, 0xf0, 0xa6, 0xc8, 0xda, 0xa7, 0x02, 0xd2, 0x8c, -0xac, 0x37, 0x7f, 0x42, 0xbd, 0xb6, 0xd3, 0xea, 0x49, 0x77, 0xf9, 0x11, -0x54, 0x4b, 0xc9, 0x19, 0xa9, 0xc3, 0x47, 0x7a, 0xb4, 0xbb, 0xea, 0x94, -0x95, 0x42, 0xd6, 0x01, 0xde, 0x34, 0xb4, 0x51, 0x81, 0xf8, 0x84, 0x4d, -0x96, 0x2a, 0x29, 0x8a, 0x32, 0xf0, 0x49, 0x05, 0xab, 0xab, 0x95, 0x8e, -0x19, 0x2c, 0x5a, 0x7a, 0x19, 0x0b, 0x75, 0x3b, 0x0a, 0x80, 0x7b, 0x86, -0x16, 0x75, 0x71, 0x38, 0xb9, 0x7e, 0x9e, 0xdb, 0xac, 0x1d, 0xcf, 0x97, -0xeb, 0xb5, 0x05, 0x2c, 0x65, 0x1b, 0x44, 0x26, 0x35, 0x19, 0xcb, 0x0a, -0x37, 0x1e, 0xc6, 0xc7, 0x13, 0x07, 0x62, 0xf1, 0x51, 0xc2, 0x22, 0xec, -0x14, 0x7c, 0xc0, 0x0d, 0xa2, 0xf3, 0x25, 0x92, 0x51, 0xc5, 0x4d, 0x41, -0xb5, 0x0e, 0xea, 0x0f, 0x84, 0x87, 0x9e, 0x1d, 0xf2, 0xbe, 0x6d, 0xc9, -0xe2, 0x25, 0x10, 0x8d, 0xba, 0xb7, 0xea, 0x6d, 0xb9, 0x0b, 0xf0, 0x34, -0x13, 0x07, 0x89, 0x41, 0x52, 0x48, 0xdc, 0xce, 0x8f, 0x1e, 0x1c, 0xaa, -0x2b, 0x30, 0x5e, 0xb3, 0xa2, 0xb1, 0xfa, 0x73, 0x3e, 0x31, 0x54, 0x3e, -0xf1, 0x25, 0x39, 0x99, 0xa4, 0x50, 0x3d, 0xaa, 0xc2, 0xd2, 0xf8, 0x4b, -0x5d, 0x6e, 0x35, 0x1f, 0x0f, 0xaa, 0x8b, 0x1f, 0x77, 0x37, 0x5c, 0x42, -0x82, 0x38, 0x81, 0x24, 0xea, 0x5e, 0x54, 0x43, 0xa3, 0xb6, 0x1f, 0x8c, -0x82, 0xaa, 0x33, 0x94, 0xd8, 0xa0, 0xbc, 0x40, 0xe8, 0x66, 0x53, 0x98, -0x19, 0x4b, 0x08, 0xf3, 0x0a, 0x89, 0x7d, 0x62, 0x97, 0xa2, 0xa6, 0xb7, -0x7a, 0x5b, 0xd8, 0x64, 0x6c, 0x52, 0x80, 0x1e, 0x28, 0xea, 0xce, 0x1a, -0xe3, 0xf9, 0x7b, 0xc2, 0x04, 0x3d, 0xdf, 0x0b, 0x73, 0x10, 0x01, 0xb0, -0x0c, 0xe2, 0x9f, 0xaa, 0xa3, 0xd7, 0x05, 0x64, 0x10, 0xcb, 0x68, 0x5c, -0x55, 0x48, 0x81, 0x22, 0x4e, 0x36, 0x9d, 0x77, 0x36, 0xd7, 0x47, 0x3f, -0x0d, 0xb7, 0x9d, 0x3c, 0x88, 0x3a, 0x28, 0x92, 0x49, 0xe0, 0x13, 0x55, -0x0b, 0x60, 0x14, 0xb8, 0x29, 0x28, 0xd8, 0x11, 0xea, 0xb1, 0x4f, 0x61, -0xa2, 0x6d, 0x8b, 0x46, 0x41, 0xc1, 0x46, 0xf5, 0xaa, 0x90, 0x07, 0x6c, -0xc6, 0x3e, 0x19, 0xb4, 0x46, 0x35, 0x02, 0x91, 0x76, 0x84, 0x33, 0x51, -0xcf, 0x8f, 0x0e, 0x7d, 0xaa, 0x9f, 0x03, 0xa5, 0xfe, 0x48, 0x81, 0x30, -0xf4, 0xdf, 0x40, 0x28, 0xf7, 0xda, 0xf8, 0x19, 0xab, 0xbf, 0x8c, 0xec, -0xc1, 0x4f, 0xec, 0x8e, 0x46, 0x69, 0x5c, 0x62, 0xc0, 0xe4, 0x2b, 0x07, -0x86, 0x9a, 0x4f, 0x56, 0x91, 0x85, 0xd8, 0x64, 0xfd, 0x20, 0x77, 0x3b, -0x97, 0xd0, 0x88, 0x07, 0x7f, 0xb9, 0x3e, 0x99, 0xae, 0x5d, 0xbb, 0x62, -0x90, 0xa5, 0x00, 0x26, 0xd9, 0x14, 0x94, 0x7b, 0xc2, 0x4d, 0x21, 0x15, -0xa3, 0x43, 0x3d, 0xd0, 0x23, 0x1c, 0x22, 0x3e, 0x24, 0x1f, 0x55, 0x4f, -0x2f, 0xf6, 0x6a, 0x0e, 0x52, 0x44, 0xa0, 0x5a, 0xa6, 0xf3, 0xb2, 0x71, -0x66, 0x51, 0xfd, 0x8e, 0x6f, 0xa8, 0xf3, 0xe7, 0xa1, 0x7d, 0x3a, 0x1b, -0x3f, 0xd6, 0x4c, 0x1a, 0x3b, 0x49, 0x30, 0x9f, 0x9d, 0x06, 0x68, 0x84, -0x9d, 0x0b, 0x31, 0x79, 0xed, 0xe9, 0x68, 0xa0, 0x4e, 0xb0, 0x8d, 0xb8, -0x6f, 0x40, 0x85, 0x39, 0x09, 0x9b, 0xd3, 0x94, 0x45, 0x88, 0xa2, 0xb7, -0x76, 0x48, 0xdc, 0xd7, 0x73, 0xf0, 0x7f, 0x1b, 0x22, 0xd5, 0x49, 0xe9, -0xa6, 0x59, 0x99, 0xf8, 0xb3, 0x69, 0x17, 0x04, 0xa3, 0xc0, 0x85, 0x8a, -0x3f, 0x3b, 0x6c, 0x20, 0x11, 0xda, 0x91, 0xe4, 0x38, 0x8c, 0xa8, 0x94, -0xa8, 0x48, 0x07, 0xc3, 0xa2, 0xfd, 0xd2, 0x91, 0xd8, 0xfe, 0x91, 0xa0, -0x28, 0xef, 0x45, 0x5c, 0x93, 0x4f, 0x84, 0x82, 0xda, 0x4d, 0xc1, 0x0b, -0x8c, 0x51, 0xee, 0x2a, 0xc1, 0xa8, 0xd1, 0x00, 0x58, 0x56, 0xc6, 0xc5, -0x9e, 0x3d, 0x40, 0xce, 0xa7, 0xbb, 0xe0, 0x85, 0x34, 0x40, 0x02, 0x01, -0xc6, 0x3c, 0x42, 0x99, 0xa0, 0xac, 0xb8, 0x98, 0xe0, 0xf6, 0x3e, 0xa7, -0x0a, 0xad, 0x59, 0xc8, 0xa4, 0x0c, 0x33, 0x6d, 0x0a, 0x31, 0x3d, 0xe1, -0xb9, 0xc3, 0xf4, 0x44, 0x41, 0x3e, 0x89, 0x1b, 0xc7, 0x3e, 0x1e, 0xa0, -0xd9, 0xa7, 0x4a, 0x5d, 0x1e, 0xaa, 0x7a, 0x85, 0x58, 0x9f, 0x28, 0xc5, -0xae, 0xa8, 0x87, 0xaa, 0xda, 0xf6, 0x29, 0xcf, 0xa6, 0x03, 0xd8, 0x3c, -0x20, 0x7e, 0x5f, 0xee, 0x88, 0x27, 0xcb, 0xeb, 0xbd, 0xf4, 0x4c, 0x26, -0x0f, 0x01, 0x14, 0xe6, 0x71, 0x00, 0x9e, 0xde, 0x5b, 0x55, 0x1e, 0xd0, -0x32, 0x9c, 0x96, 0xda, 0x84, 0x3a, 0x78, 0x1e, 0xd9, 0x12, 0x9c, 0x24, -0x75, 0x58, 0x10, 0xfb, 0x85, 0x41, 0x91, 0xe0, 0x46, 0xd4, 0xc7, 0x97, -0xce, 0x6c, 0x04, 0x8d, 0xab, 0x1e, 0x34, 0x30, 0x8a, 0xf0, 0xf0, 0xdc, -0x85, 0xbc, 0x5e, 0x21, 0xd6, 0x27, 0x42, 0x0c, 0x74, 0x3d, 0xdb, 0xd7, -0x1a, 0x02, 0x5e, 0xc9, 0xda, 0x7c, 0x02, 0xdb, 0xa7, 0xd4, 0xb9, 0x79, -0xdf, 0x7d, 0x58, 0xb8, 0xba, 0x4a, 0xdf, 0x68, 0xd1, 0x56, 0xed, 0xdf, -0x4e, 0x8f, 0xee, 0x56, 0x44, 0x4f, 0x40, 0x9e, 0x79, 0x04, 0x43, 0x25, -0x4f, 0x62, 0xa5, 0x6c, 0xaa, 0x55, 0x1e, 0x26, 0xf3, 0xec, 0xae, 0x41, -0x96, 0x95, 0x78, 0xa8, 0x1e, 0x42, 0xff, 0x07, 0x20, 0x41, 0x72, 0x36, -0x8d, 0x36, 0x29, 0xba, 0x45, 0xbd, 0x57, 0x91, 0x9d, 0xaa, 0xd4, 0x36, -0x1f, 0x94, 0xc9, 0x84, 0x24, 0xaf, 0x10, 0x3d, 0x9b, 0x76, 0x61, 0x8a, -0x68, 0x70, 0x08, 0x04, 0xab, 0xf9, 0xb7, 0x07, 0x8a, 0x59, 0x39, 0xc5, -0x55, 0x16, 0xdf, 0x4e, 0xe8, 0x21, 0x3e, 0x13, 0xbd, 0xc8, 0x80, 0x1d, -0x6f, 0x80, 0xdc, 0x97, 0x24, 0x0a, 0xcb, 0x66, 0x93, 0x84, 0x42, 0x99, -0x27, 0xb6, 0x69, 0x7e, 0x7b, 0x83, 0xa0, 0x65, 0x3f, 0x29, 0xd7, 0x30, -0x1a, 0xab, 0x47, 0xa2, 0x95, 0x5e, 0xaf, 0x4d, 0x8d, 0x4c, 0xa1, 0x4e, -0x8a, 0xef, 0xa3, 0x4b, 0x20, 0x38, 0xd1, 0x53, 0x02, 0x07, 0x05, 0xfd, -0x15, 0x80, 0x04, 0x99, 0x8f, 0xee, 0x7a, 0x05, 0x05, 0x85, 0x34, 0x2b, -0x71, 0x90, 0x90, 0x44, 0x05, 0x1a, 0x05, 0x9e, 0x54, 0x3d, 0x1c, 0x10, -0xfa, 0xb0, 0xbf, 0x19, 0xfb, 0x77, 0x26, 0xad, 0x93, 0x25, 0x08, 0x8a, -0xb8, 0x26, 0xaf, 0x23, 0xe0, 0x5f, 0x57, 0x54, 0x05, 0x95, 0x7b, 0x3d, -0x5f, 0x9d, 0x80, 0x03, 0xdb, 0x40, 0xe8, 0xf2, 0xab, 0x65, 0xca, 0xd1, -0x9c, 0x1f, 0xb4, 0x79, 0xfd, 0x12, 0x6a, 0x19, 0xda, 0x07, 0x21, 0xf7, -0xc5, 0xcb, 0x41, 0x4c, 0x8a, 0x5e, 0x4b, 0x53, 0x1f, 0x8d, 0x84, 0x6c, -0x7a, 0x59, 0x21, 0x38, 0x51, 0x26, 0x02, 0x48, 0x50, 0xd8, 0x86, 0xd6, -0x2a, 0x84, 0xc7, 0x12, 0x31, 0x0e, 0x24, 0xc2, 0x4f, 0x76, 0x0a, 0x61, -0x2f, 0x1e, 0x50, 0xa6, 0x51, 0x83, 0x7a, 0x79, 0x18, 0x49, 0x7c, 0x55, -0x9a, 0xed, 0x93, 0xa9, 0x3a, 0x53, 0xa2, 0x65, 0xb1, 0xd2, 0xda, 0xb9, -0x56, 0xcf, 0xf4, 0x27, 0x60, 0xd6, 0xce, 0x25, 0x9c, 0x43, 0xbe, 0x9e, -0x65, 0x0f, 0x72, 0xca, 0x1d, 0x58, 0x8e, 0x40, 0xdd, 0x4e, 0x4b, 0x08, -0x11, 0x9a, 0x4e, 0xb1, 0x05, 0xc8, 0xdd, 0x52, 0x7d, 0x82, 0x2d, 0x20, -0x01, 0x52, 0x3f, 0x13, 0x50, 0xc1, 0x63, 0x2d, 0x47, 0xe0, 0x4b, 0x12, -0x27, 0x08, 0x73, 0x42, 0xb7, 0x96, 0x96, 0x85, 0x94, 0x3f, 0xa3, 0x65, -0x04, 0xd9, 0x76, 0x54, 0xc0, 0x47, 0xc3, 0x56, 0x9d, 0xa8, 0x2a, 0x71, -0x47, 0x2f, 0xbf, 0x5b, 0x87, 0x1e, 0xaf, 0x40, 0xa9, 0xc0, 0x3a, 0x8e, -0xc9, 0x5c, 0xbd, 0x4e, 0x0c, 0xa0, 0x36, 0xc9, 0xce, 0xef, 0xd3, 0x54, -0x1a, 0xc3, 0x4b, 0xfb, 0x2c, 0x9c, 0x06, 0x86, 0x61, 0x09, 0xa1, 0xd5, -0xad, 0x99, 0xf6, 0x0b, 0xf0, 0x00, 0x39, 0xf5, 0x50, 0xe9, 0xe9, 0x2e, -0xfb, 0xaf, 0x1c, 0x96, 0x11, 0x50, 0xdc, 0xb4, 0x76, 0x59, 0xcf, 0x9a, -0x99, 0xbe, 0x91, 0xe2, 0xf0, 0xb4, 0xa0, 0xa9, 0xab, 0xde, 0xe7, 0x05, -0x75, 0xd3, 0xf5, 0xf0, 0x27, 0x4b, 0x48, 0x50, 0xfc, 0x86, 0xac, 0x09, -0x32, 0xec, 0xa8, 0x05, 0x88, 0x98, 0x4a, 0xe5, 0x7d, 0x1a, 0x00, 0x60, -0xee, 0xa3, 0xa0, 0x32, 0xf5, 0x3b, 0xa4, 0xa6, 0x72, 0xb8, 0x72, 0x89, -0x90, 0xe4, 0x15, 0x12, 0x37, 0x0e, 0x1f, 0xd7, 0x5f, 0x27, 0x55, 0x9b, -0xfc, 0x26, 0x77, 0x9b, 0x17, 0x4a, 0x69, 0x3d, 0xea, 0x80, 0xd8, 0x39, -0xdf, 0x50, 0xc6, 0x18, 0x26, 0x63, 0xe7, 0x2a, 0x43, 0xde, 0x82, 0x5e, -0x05, 0x10, 0x89, 0xdf, 0x3c, 0x02, 0xb9, 0x72, 0xfa, 0x22, 0x50, 0xf2, -0xc7, 0xdc, 0xbe, 0xd1, 0x1d, 0x1f, 0x70, 0xf7, 0x3d, 0x7d, 0xc3, 0x68, -0xf6, 0x09, 0x7f, 0x90, 0xfe, 0x7a, 0xc4, 0xc3, 0x52, 0xe2, 0x89, 0xba, -0xb1, 0x34, 0xa3, 0x20, 0xac, 0x83, 0x9c, 0x6c, 0x32, 0x28, 0x50, 0xaf, -0xc3, 0xc9, 0x8d, 0x6d, 0xc9, 0x70, 0x42, 0x8c, 0x57, 0x48, 0x94, 0x07, -0x3b, 0x99, 0x7a, 0xaf, 0x34, 0x0a, 0xb2, 0x43, 0x73, 0x81, 0x9c, 0xa3, -0x6a, 0xb0, 0xd2, 0x42, 0xc5, 0xce, 0x38, 0xd8, 0x88, 0x75, 0xb2, 0xb3, -0xd3, 0x40, 0x03, 0x51, 0x47, 0xcf, 0x8c, 0xd3, 0x2b, 0x93, 0x13, 0xca, -0x61, 0x99, 0x2c, 0xaa, 0x9b, 0x65, 0x33, 0x32, 0x32, 0x48, 0x45, 0x9c, -0x3b, 0x77, 0x6e, 0xeb, 0xd6, 0xad, 0x7d, 0x45, 0x02, 0xe7, 0xd7, 0xa9, -0x53, 0xa7, 0x47, 0x8f, 0x1e, 0xb3, 0x67, 0xcf, 0xa6, 0x01, 0x29, 0xc5, -0xce, 0x10, 0x99, 0xe0, 0x0f, 0x88, 0x4c, 0xe0, 0x81, 0x3e, 0x5a, 0x34, -0x13, 0xc2, 0x55, 0xe7, 0xb5, 0x6b, 0x56, 0xf9, 0xc9, 0x33, 0x15, 0x3f, -0x72, 0x28, 0xa1, 0x02, 0x48, 0xa0, 0x67, 0xf3, 0x9e, 0xf4, 0x17, 0x8f, -0x25, 0xd1, 0x0e, 0xa5, 0xfa, 0x7d, 0x0e, 0xf4, 0x4a, 0x91, 0x4c, 0xee, -0x48, 0x03, 0x38, 0x3b, 0x83, 0xa0, 0xe1, 0xe8, 0x7d, 0xe5, 0xb8, 0x90, -0x9e, 0xab, 0xf0, 0x01, 0x9c, 0xc4, 0xf8, 0x3a, 0x08, 0x6b, 0xe5, 0x7f, -0x3a, 0xa4, 0x3c, 0xb6, 0x6d, 0x00, 0x29, 0xe0, 0x2a, 0x72, 0xc9, 0x50, -0xc5, 0x59, 0x6f, 0x38, 0xef, 0x4e, 0x00, 0xd3, 0xdd, 0xf3, 0xd4, 0x78, -0x65, 0x83, 0xc7, 0x4c, 0x44, 0xe7, 0x72, 0x28, 0xbb, 0xa8, 0xa8, 0x88, -0x62, 0xbb, 0x1e, 0xba, 0x6e, 0x93, 0xa2, 0x8d, 0x98, 0x44, 0x58, 0x00, -0x9d, 0x7f, 0x69, 0x46, 0x4c, 0x4b, 0x5f, 0x1a, 0xfb, 0xc2, 0x1f, 0xa8, -0x74, 0x26, 0x5d, 0xcf, 0xcf, 0x9c, 0x39, 0x43, 0x75, 0x02, 0x5c, 0xd7, -0x84, 0x88, 0x63, 0x01, 0x97, 0xfe, 0x2c, 0x9e, 0xfb, 0x15, 0x56, 0x3c, -0xed, 0x96, 0xdf, 0x1d, 0x43, 0x06, 0x15, 0x22, 0x3b, 0x31, 0x5d, 0xac, -0x84, 0x0a, 0x15, 0x14, 0x2c, 0xb2, 0xa4, 0x54, 0xb2, 0xa8, 0x51, 0x28, -0xd9, 0xda, 0x71, 0x12, 0xef, 0x59, 0xda, 0x79, 0xdd, 0x9c, 0x76, 0x84, -0x64, 0x23, 0x9d, 0xab, 0xd0, 0xa6, 0xf9, 0xa3, 0x0a, 0xe8, 0x23, 0x7c, -0xd3, 0x65, 0xed, 0x88, 0xa6, 0xc6, 0xe8, 0x89, 0x59, 0xc9, 0x5d, 0xe2, -0xb5, 0x4a, 0xf9, 0xd7, 0x7d, 0x64, 0x94, 0x51, 0x22, 0x0c, 0x91, 0x6b, -0x19, 0x76, 0xda, 0x80, 0xd2, 0x9e, 0xa8, 0xf8, 0x28, 0x28, 0xcb, 0x69, -0x7f, 0xb7, 0x06, 0x3f, 0x24, 0xe2, 0x51, 0xfd, 0x52, 0x6f, 0xab, 0x97, -0x9f, 0x9f, 0xaf, 0xf7, 0x08, 0x27, 0xa5, 0x81, 0x48, 0x24, 0x22, 0x7c, -0x49, 0x19, 0x3f, 0xbc, 0xaa, 0x3b, 0x91, 0xb3, 0x4c, 0x1b, 0x1b, 0x31, -0x71, 0xb8, 0xea, 0x46, 0xb4, 0xea, 0x42, 0x01, 0x50, 0x9d, 0x9d, 0x21, -0x6e, 0x7e, 0x05, 0x21, 0x70, 0x0f, 0x02, 0x8a, 0x29, 0x07, 0x28, 0xbd, -0xcf, 0x09, 0xe9, 0xa3, 0x4d, 0x30, 0x19, 0x5a, 0x78, 0x1e, 0xa4, 0xd7, -0xf5, 0x9a, 0x35, 0x6b, 0xd6, 0xad, 0x5b, 0x87, 0x17, 0x82, 0x6e, 0xbc, -0xf0, 0x07, 0xf0, 0x40, 0xf3, 0x2e, 0x3c, 0x74, 0xb4, 0x11, 0xa3, 0x60, -0x07, 0xfd, 0xbb, 0x08, 0xfb, 0xf3, 0xd0, 0x6b, 0xb4, 0xfc, 0xe8, 0xb2, -0x72, 0x47, 0x0e, 0x25, 0x54, 0x20, 0x3b, 0xd1, 0x01, 0x4d, 0xa7, 0x39, -0xfc, 0xc7, 0x58, 0x54, 0x3e, 0x3a, 0x31, 0x9a, 0x44, 0xcd, 0x0d, 0x73, -0xdb, 0x43, 0xf4, 0x14, 0xc2, 0xd0, 0x1b, 0xf5, 0xda, 0x27, 0x50, 0xce, -0x24, 0x2e, 0x90, 0xa0, 0x40, 0x62, 0x96, 0x48, 0x8a, 0x90, 0x5d, 0x1c, -0xb7, 0x83, 0x94, 0xa5, 0xe9, 0xd4, 0x2c, 0x8b, 0x30, 0x24, 0xec, 0xad, -0xc0, 0x09, 0x9b, 0x92, 0x4f, 0xc3, 0xfa, 0x7a, 0x32, 0x65, 0x5e, 0x6d, -0x76, 0x0a, 0x57, 0x23, 0xb3, 0xe5, 0x93, 0xea, 0x40, 0x60, 0x92, 0x1c, -0x08, 0x3f, 0xb8, 0x9f, 0xd1, 0x0a, 0x68, 0x32, 0x8d, 0x7a, 0x80, 0x44, -0x04, 0xe9, 0x83, 0x13, 0xfe, 0xe7, 0xa0, 0x47, 0xb5, 0xf4, 0x9f, 0x86, -0x2d, 0x10, 0xb8, 0x41, 0xd1, 0x1a, 0xfa, 0xb0, 0xd0, 0xee, 0x99, 0x08, -0x0e, 0xf8, 0x30, 0xa5, 0x3a, 0xc0, 0x03, 0x22, 0x13, 0xa5, 0xf6, 0x3d, -0x77, 0x79, 0xae, 0x5c, 0xc2, 0x2d, 0xd7, 0xbb, 0x87, 0x0c, 0x2a, 0xcc, -0x7d, 0x8c, 0x08, 0x7c, 0x42, 0xb6, 0x31, 0x27, 0x52, 0xfb, 0x4a, 0x85, -0x96, 0xe7, 0x93, 0x4b, 0x40, 0x20, 0xf7, 0x8c, 0x21, 0x8d, 0xe5, 0xaf, -0xec, 0xe5, 0x96, 0x36, 0xd3, 0xa0, 0xdc, 0x4b, 0x1f, 0x04, 0xa9, 0x86, -0x5d, 0x5c, 0xef, 0x33, 0xe4, 0xf5, 0x16, 0x28, 0x15, 0x6c, 0xf6, 0xec, -0xf1, 0x04, 0x75, 0xe3, 0x5f, 0xc3, 0x78, 0x0a, 0x71, 0x43, 0xe2, 0xb8, -0xdb, 0xe8, 0x6c, 0x2d, 0xad, 0xdd, 0xe1, 0x03, 0x60, 0x80, 0x7e, 0x37, -0x1c, 0x38, 0xa7, 0xf9, 0x52, 0x9a, 0x5e, 0xa3, 0x39, 0x10, 0xf7, 0xca, -0x55, 0x20, 0x81, 0xe6, 0x8e, 0xd2, 0xdb, 0x56, 0x9a, 0x9a, 0xe2, 0x27, -0x95, 0x00, 0xa7, 0x70, 0x0a, 0xfb, 0xb3, 0x89, 0xa5, 0x50, 0x42, 0x05, -0xd6, 0x0f, 0x64, 0x5c, 0xdd, 0x38, 0xe3, 0x95, 0x62, 0x2a, 0xeb, 0x04, -0x64, 0xfa, 0xfe, 0xfd, 0xfb, 0x53, 0x77, 0x0c, 0x92, 0x65, 0x0e, 0xd4, -0x6f, 0xc5, 0xe7, 0x48, 0x68, 0x5d, 0x9b, 0x36, 0x6d, 0xe8, 0xff, 0x4b, -0x83, 0x08, 0x0a, 0x57, 0x26, 0x26, 0x5e, 0x8c, 0x1d, 0x54, 0x93, 0xa4, -0x3e, 0x3e, 0x52, 0x0d, 0xf2, 0x0f, 0xb4, 0x4b, 0x68, 0xaa, 0x9d, 0xc9, -0x33, 0x3e, 0x5a, 0x32, 0xe7, 0x23, 0xf6, 0x40, 0xd9, 0xd2, 0xbe, 0x1a, -0x65, 0x80, 0x9e, 0xce, 0x02, 0x0f, 0xd4, 0x03, 0xfc, 0x0c, 0x34, 0xaa, -0xa3, 0xe0, 0x83, 0x1c, 0x00, 0x86, 0x2f, 0xa5, 0xe3, 0x35, 0x3d, 0xad, -0x31, 0x2e, 0x71, 0x09, 0xf6, 0x25, 0x0a, 0x9c, 0x11, 0xc1, 0xf1, 0xf5, -0xd7, 0x5f, 0x0b, 0x1e, 0x82, 0xd5, 0xee, 0xd9, 0x26, 0x21, 0x56, 0xa9, -0xd3, 0x42, 0x06, 0x15, 0xbc, 0x27, 0xcc, 0xe4, 0x70, 0x76, 0xbd, 0x99, -0xb4, 0x07, 0xba, 0xc1, 0x4c, 0x59, 0xa3, 0x46, 0x0d, 0xac, 0x2b, 0x88, -0xe9, 0x50, 0x58, 0x87, 0x0e, 0x1d, 0xba, 0x74, 0xe9, 0xd2, 0xbd, 0x7b, -0x77, 0x8c, 0x2d, 0x1c, 0xb8, 0x3b, 0x90, 0xc5, 0xf9, 0x1e, 0x09, 0x1e, -0x83, 0x8f, 0xe7, 0x5e, 0xeb, 0x96, 0x77, 0x81, 0x1c, 0xd1, 0x71, 0x09, -0x98, 0x63, 0x34, 0xb4, 0x5b, 0x9a, 0x5f, 0xf5, 0xeb, 0xd7, 0x8f, 0xcf, -0x0c, 0x4b, 0xc8, 0x10, 0x61, 0x8b, 0x0b, 0x17, 0x2e, 0x44, 0xf1, 0xc5, -0x31, 0x4c, 0x0b, 0x6d, 0x3e, 0xc8, 0xc1, 0x67, 0xf5, 0x0d, 0x6a, 0x2e, -0x45, 0x8b, 0x11, 0xfa, 0x99, 0x0c, 0xd9, 0x9e, 0xf0, 0x07, 0xb8, 0x04, -0xd2, 0x0e, 0x5b, 0xfb, 0x5d, 0x77, 0xdd, 0xc5, 0xff, 0x83, 0x06, 0x0d, -0xa2, 0xd3, 0x1c, 0x59, 0x6f, 0x6c, 0x04, 0x39, 0x39, 0x39, 0x3c, 0x0b, -0xd0, 0xa2, 0xac, 0x86, 0xb4, 0xe7, 0xe2, 0x71, 0xd0, 0x16, 0x68, 0xf9, -0x05, 0x8a, 0xd8, 0xfb, 0xe9, 0xc1, 0x2e, 0x0d, 0xaa, 0x11, 0x7b, 0x88, -0xc5, 0xc0, 0x64, 0x04, 0xa1, 0x4b, 0x77, 0x77, 0xfc, 0x6e, 0x78, 0xa3, -0x69, 0x3e, 0x2d, 0x07, 0xbf, 0xf2, 0x25, 0x7f, 0x62, 0x8b, 0x81, 0x39, -0x70, 0x26, 0x3d, 0x7c, 0x51, 0x1e, 0xc4, 0x31, 0x17, 0x66, 0xd1, 0xaf, -0xfe, 0x81, 0xcd, 0xc0, 0x1e, 0x91, 0x30, 0x5d, 0x14, 0xc2, 0x3f, 0x3e, -0xf9, 0x37, 0x62, 0x39, 0x5d, 0xc5, 0xd6, 0xc5, 0x6b, 0xe3, 0x5d, 0xb2, -0xc3, 0x19, 0xea, 0x66, 0x63, 0x51, 0x81, 0xb2, 0xd9, 0x89, 0x29, 0x78, -0x4a, 0x93, 0x1e, 0xf6, 0x4e, 0x88, 0x0f, 0x9b, 0x0c, 0x44, 0x86, 0x1f, -0x8a, 0x83, 0x0d, 0x98, 0x83, 0xb0, 0x05, 0x0e, 0x74, 0x50, 0x39, 0xe4, -0x57, 0xbe, 0xc7, 0xfc, 0xc2, 0x39, 0x38, 0xad, 0xd0, 0x44, 0x7b, 0xf7, -0xee, 0x0d, 0x4e, 0xf4, 0x2a, 0x7a, 0x3a, 0x24, 0x40, 0x02, 0x9b, 0x3d, -0x74, 0x4c, 0xa7, 0x50, 0x51, 0x58, 0xb9, 0x56, 0x46, 0x56, 0xc3, 0x62, -0x08, 0xe2, 0xc0, 0x9e, 0xb3, 0x7e, 0xfd, 0x7a, 0xd1, 0x62, 0x49, 0x45, -0x20, 0x82, 0x48, 0x0e, 0x3e, 0xcb, 0x37, 0x48, 0xf6, 0x50, 0x33, 0xe7, -0x20, 0xee, 0x93, 0xea, 0xc9, 0xf9, 0xa2, 0x2e, 0x1f, 0x3a, 0x74, 0x08, -0xc5, 0x80, 0xbd, 0x9c, 0xff, 0x11, 0xfa, 0x39, 0x19, 0x85, 0x98, 0xc1, -0xb9, 0x91, 0x1c, 0xea, 0x59, 0xf8, 0x52, 0x14, 0x65, 0x89, 0x4d, 0x62, -0xd7, 0x57, 0xfd, 0xa4, 0xd9, 0xef, 0xa5, 0xa9, 0x3b, 0xe4, 0x0e, 0x48, -0x10, 0x8a, 0x38, 0x80, 0x8a, 0x1c, 0xd2, 0xf2, 0x9c, 0x3f, 0x11, 0xb5, -0x81, 0xb0, 0x24, 0x78, 0x10, 0xfb, 0x92, 0xb4, 0x30, 0x2d, 0xa7, 0x37, -0x18, 0xba, 0xc3, 0x56, 0x75, 0x54, 0x60, 0x15, 0x41, 0x30, 0x40, 0x1a, -0x86, 0xb0, 0xa8, 0xb5, 0x3c, 0x7e, 0xfc, 0x78, 0x9d, 0x40, 0x21, 0x14, -0x28, 0x0c, 0xf2, 0x62, 0xc7, 0x85, 0xe6, 0x14, 0x15, 0xa2, 0x59, 0x42, -0x70, 0xb4, 0xf7, 0x2c, 0x29, 0x29, 0x41, 0xbc, 0x96, 0x83, 0xcf, 0x7c, -0xa3, 0xec, 0x36, 0x9c, 0x8c, 0x1a, 0x0a, 0x9d, 0x41, 0x85, 0x50, 0x1e, -0xc1, 0x0e, 0x84, 0x00, 0x21, 0xea, 0xb0, 0x2b, 0x03, 0x42, 0x3c, 0x24, -0xb4, 0x8a, 0x03, 0x09, 0xe0, 0x07, 0xa2, 0xe7, 0x16, 0xa2, 0xb3, 0x42, -0xb5, 0x32, 0x32, 0x03, 0x92, 0xb1, 0x29, 0x82, 0x3b, 0x07, 0x3d, 0xa7, -0xa1, 0x6f, 0x14, 0x59, 0x14, 0x5f, 0x24, 0x78, 0xf2, 0x9b, 0xe5, 0xe0, -0x33, 0x85, 0xd3, 0xe5, 0x1b, 0x14, 0x62, 0x08, 0x1a, 0xd2, 0x87, 0x2d, -0x70, 0x3e, 0x07, 0x27, 0xe3, 0xa0, 0xa4, 0x01, 0x29, 0xf2, 0x0f, 0x7b, -0x3f, 0xb4, 0xce, 0x08, 0x8c, 0xc6, 0xf8, 0xdc, 0x48, 0x0e, 0xf5, 0x2c, -0xdc, 0x91, 0x4b, 0x18, 0x84, 0x34, 0x51, 0x4e, 0x86, 0x09, 0xe8, 0x3d, -0xdb, 0x85, 0x04, 0x55, 0xa3, 0x5e, 0x77, 0x1f, 0x42, 0x97, 0x52, 0x2b, -0x72, 0xe6, 0x55, 0x17, 0x15, 0xaa, 0x97, 0x36, 0xa2, 0x33, 0x01, 0x6a, -0x50, 0x0f, 0xa1, 0x50, 0x60, 0x43, 0xf6, 0x5d, 0x68, 0x05, 0x2a, 0xc7, -0x0e, 0x03, 0x91, 0x41, 0x28, 0x90, 0x1d, 0x41, 0x0a, 0x68, 0x93, 0xd8, -0xdd, 0x39, 0xf3, 0xec, 0xd9, 0xb3, 0x04, 0x3f, 0x23, 0x52, 0x9f, 0x3b, -0x77, 0x0e, 0x09, 0x5b, 0x0e, 0x3e, 0xf3, 0x0d, 0xdf, 0x63, 0x7e, 0x81, -0xfe, 0x38, 0x19, 0xa2, 0x3c, 0x76, 0xec, 0x18, 0x23, 0x40, 0xdf, 0x04, -0xc3, 0x41, 0xf7, 0x20, 0x44, 0x9c, 0x00, 0x80, 0x8d, 0x7d, 0x9d, 0x7b, -0x41, 0xa0, 0x10, 0x31, 0x12, 0x0b, 0x27, 0xb3, 0x9d, 0x33, 0xb8, 0x8c, -0x8c, 0xec, 0x8e, 0xbc, 0x4e, 0x6a, 0x3f, 0x07, 0xfa, 0x2b, 0xb5, 0xf4, -0x44, 0x70, 0xc7, 0xa4, 0x83, 0xd5, 0x1f, 0x24, 0xcb, 0xc1, 0xaf, 0x72, -0xf0, 0x19, 0x1d, 0x17, 0x03, 0x28, 0xa7, 0x71, 0x32, 0x64, 0xcd, 0xc1, -0x37, 0x14, 0x56, 0x82, 0xbe, 0x09, 0xac, 0xe0, 0x31, 0x39, 0x8d, 0xbf, -0x32, 0x4f, 0x76, 0x01, 0x66, 0x08, 0xf5, 0xcb, 0xb3, 0xf0, 0x2b, 0x5a, -0x04, 0x8f, 0x40, 0x14, 0x06, 0x5e, 0x67, 0x82, 0xba, 0x11, 0x90, 0x10, -0x84, 0x42, 0xbd, 0x97, 0x4a, 0x45, 0x12, 0xba, 0x4f, 0xf7, 0xaa, 0xba, -0xa8, 0x90, 0x9c, 0x0a, 0xa4, 0x02, 0x44, 0x61, 0xd4, 0x4a, 0xa8, 0x01, -0x12, 0x81, 0x3a, 0xe5, 0x20, 0x30, 0x01, 0x59, 0x1c, 0xd2, 0x81, 0x46, -0xa1, 0x4b, 0xb6, 0x5b, 0x5a, 0x51, 0x41, 0x8e, 0x50, 0x0c, 0x89, 0xc5, -0xb4, 0x1a, 0x51, 0xf2, 0x34, 0x9a, 0x89, 0x1c, 0x22, 0x70, 0x43, 0x7c, -0x8c, 0x86, 0xfb, 0x16, 0x32, 0x65, 0x4c, 0xae, 0x85, 0xe6, 0x40, 0x08, -0x9b, 0x34, 0x3b, 0xb1, 0xe2, 0x24, 0x80, 0x01, 0x33, 0x0e, 0x78, 0x03, -0x6c, 0xdc, 0x17, 0x8a, 0x14, 0x23, 0x26, 0x83, 0x33, 0xb2, 0x88, 0xe9, -0xf0, 0x31, 0x0e, 0x84, 0x75, 0x91, 0xd7, 0xc9, 0x66, 0x46, 0x56, 0x41, -0x4a, 0x61, 0xce, 0x96, 0x07, 0x32, 0x0c, 0xde, 0x31, 0xa8, 0x99, 0x93, -0xb1, 0x38, 0x73, 0x20, 0x02, 0x21, 0xdb, 0x88, 0x09, 0x88, 0xbf, 0x32, -0x02, 0x03, 0x42, 0xf1, 0x04, 0x20, 0x31, 0x43, 0x18, 0x08, 0x9a, 0x31, -0x9f, 0x51, 0xa6, 0xf9, 0x92, 0x9b, 0x72, 0x23, 0x51, 0x24, 0x70, 0xb1, -0xa1, 0x22, 0x47, 0x85, 0x1f, 0x9f, 0x68, 0xdd, 0xfe, 0xc9, 0x55, 0x1a, -0x15, 0xe2, 0xc5, 0x83, 0x08, 0xa0, 0x06, 0xa8, 0x19, 0xa2, 0x47, 0xfe, -0x96, 0x03, 0x1a, 0x65, 0xdf, 0x85, 0xb2, 0xe9, 0x16, 0x29, 0x30, 0x10, -0xba, 0x51, 0x3a, 0x25, 0xd4, 0x03, 0xfd, 0x41, 0x76, 0x1c, 0xc8, 0xd6, -0xf2, 0x81, 0x6f, 0xf8, 0x1e, 0xad, 0x14, 0xe2, 0xe3, 0x64, 0xc6, 0x84, -0xec, 0x18, 0x81, 0x3d, 0x9e, 0x9d, 0x9b, 0xbd, 0x1f, 0x84, 0xb0, 0x37, -0x0b, 0x43, 0x00, 0x09, 0x6c, 0xea, 0xdc, 0x85, 0xfb, 0x42, 0xa3, 0x9c, -0x0c, 0xb4, 0x84, 0x2e, 0x19, 0x0a, 0x00, 0x40, 0xe2, 0x1c, 0x4c, 0x8f, -0x03, 0x18, 0x40, 0xdc, 0xc8, 0xf7, 0xec, 0xdf, 0x1c, 0x90, 0xac, 0xf9, -0x40, 0x9a, 0xe7, 0x71, 0x20, 0x68, 0x85, 0x19, 0x3e, 0xf3, 0x8d, 0x04, -0x1a, 0xf1, 0x81, 0xef, 0x19, 0x10, 0x6c, 0xc8, 0x0c, 0x05, 0x6f, 0x7c, -0x16, 0xc8, 0xe9, 0x10, 0x0a, 0xa7, 0xaa, 0x33, 0xf6, 0x89, 0xb5, 0xc2, -0xce, 0xac, 0xba, 0xa8, 0x10, 0x29, 0x59, 0x2c, 0x51, 0x90, 0x0b, 0x94, -0x0d, 0x7d, 0x40, 0xca, 0x72, 0xc8, 0x56, 0xcd, 0x37, 0xec, 0xb8, 0xd0, -0xba, 0x52, 0x28, 0x39, 0x13, 0x52, 0x43, 0xa1, 0x84, 0xc8, 0xb8, 0x90, -0x43, 0xc8, 0x94, 0x43, 0x7e, 0xe5, 0x7b, 0xfe, 0x0a, 0x05, 0xb3, 0x37, -0x73, 0x15, 0xd7, 0x32, 0x02, 0xc4, 0x07, 0xc5, 0xc3, 0x49, 0xd8, 0x95, -0x01, 0x18, 0x07, 0x18, 0x80, 0x27, 0xf0, 0xa5, 0xdc, 0x45, 0xf1, 0x01, -0xa1, 0x63, 0xc6, 0x51, 0x44, 0x8f, 0xda, 0xca, 0xa1, 0x2c, 0x9b, 0x9e, -0xdf, 0x9c, 0x38, 0xec, 0xe1, 0x81, 0xea, 0x50, 0xfe, 0x01, 0xa9, 0x14, -0xca, 0xb0, 0x6a, 0x86, 0x4c, 0x52, 0x9e, 0x05, 0xb0, 0xc9, 0x4d, 0x45, -0x45, 0x8e, 0x4c, 0x97, 0x42, 0x85, 0x41, 0x82, 0x1b, 0x55, 0x69, 0x54, -0x08, 0x30, 0xc4, 0x9d, 0x07, 0x65, 0xc8, 0x56, 0x2a, 0x7b, 0x33, 0x34, -0xcd, 0x21, 0x3b, 0xb4, 0x60, 0x40, 0x27, 0x56, 0x21, 0x53, 0xa1, 0x54, -0xfd, 0x90, 0x2f, 0xf9, 0x2b, 0x03, 0xea, 0x08, 0x61, 0x1c, 0x31, 0xdd, -0x28, 0x96, 0x22, 0xdc, 0x40, 0x6e, 0xa4, 0x6e, 0x21, 0x60, 0x30, 0x0c, -0x0b, 0x8d, 0x0a, 0x99, 0xda, 0x94, 0x67, 0xcc, 0x7a, 0xb0, 0x52, 0x94, -0x05, 0x30, 0x6a, 0x86, 0x02, 0x3c, 0xfd, 0x59, 0x7c, 0xba, 0x51, 0x45, -0x92, 0x51, 0x98, 0xdd, 0xab, 0xaa, 0xa3, 0xc2, 0xb0, 0xdc, 0x06, 0x92, -0x0a, 0xe2, 0xcb, 0xf0, 0x60, 0xbd, 0x09, 0xe2, 0x5d, 0xa2, 0x43, 0x85, -0xc4, 0x0a, 0x84, 0x18, 0x2a, 0x42, 0x62, 0x4d, 0xa3, 0x93, 0x0c, 0xf5, -0x15, 0x88, 0xa2, 0x22, 0xd4, 0xdf, 0x60, 0x74, 0xfe, 0xc1, 0x5f, 0x81, -0x28, 0x2a, 0x82, 0xbf, 0xa6, 0xd1, 0x11, 0x43, 0x7d, 0x05, 0xa2, 0xa8, -0x08, 0xf5, 0x37, 0x18, 0x9d, 0x7f, 0xf0, 0x57, 0x20, 0x8a, 0x8a, 0xe0, -0xaf, 0x69, 0x74, 0xc4, 0x50, 0x5f, 0x81, 0x8b, 0xa8, 0xc8, 0xcc, 0xcc, -0x24, 0xae, 0x81, 0x6e, 0x29, 0x78, 0x79, 0xa3, 0x47, 0x74, 0x05, 0x22, -0x79, 0x05, 0x40, 0x01, 0x58, 0x00, 0x11, 0x0e, 0xd2, 0x03, 0x88, 0x5e, -0x4e, 0x4e, 0x4e, 0x26, 0x78, 0x36, 0x7a, 0x44, 0x57, 0x20, 0x92, 0x57, -0x00, 0x14, 0x80, 0x05, 0x10, 0xf1, 0xff, 0x0a, 0xfb, 0x09, 0x6c, 0x5e, -0xaf, 0x2e, 0x17, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, -0x42, 0x60, 0x82, +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01, 0x76, +0x08, 0x02, 0x00, 0x00, 0x00, 0xec, 0xb7, 0xca, 0x94, 0x00, 0x00, 0x00, +0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, +0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, +0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, +0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, +0x80, 0xe8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, +0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, +0x85, 0xcd, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5e, 0xed, 0x9d, 0x07, 0x98, +0x14, 0x55, 0xb6, 0xc7, 0x7b, 0x62, 0x4f, 0x1e, 0x18, 0x26, 0x90, 0xd3, +0x30, 0xe4, 0xcc, 0x90, 0xe3, 0x90, 0x73, 0x8e, 0x22, 0x41, 0x92, 0x82, +0x48, 0x14, 0x15, 0x45, 0x24, 0x89, 0xc0, 0xc0, 0x90, 0x83, 0x04, 0x45, +0x50, 0x11, 0x31, 0x60, 0xc0, 0xac, 0x6b, 0x5c, 0x73, 0x5a, 0xd3, 0xa6, +0xf7, 0x36, 0xb9, 0xcf, 0x4d, 0xba, 0xee, 0xae, 0xae, 0xab, 0xee, 0x2e, +0xef, 0xd7, 0x1c, 0xbc, 0x73, 0xa7, 0xaa, 0xba, 0xbb, 0x3a, 0x4c, 0xe8, +0x50, 0xdf, 0xc0, 0xd7, 0xd3, 0x53, 0x75, 0xeb, 0xd6, 0xad, 0xf3, 0xbf, +0x27, 0x9f, 0x13, 0x13, 0x17, 0x17, 0x97, 0x9e, 0x9e, 0xfe, 0xed, 0xb7, +0xdf, 0xc6, 0xc4, 0xc4, 0x38, 0xac, 0x8e, 0xf3, 0xe7, 0xcf, 0x5b, 0x7e, +0x1f, 0xfd, 0x32, 0xba, 0x02, 0xa1, 0xbb, 0x02, 0x96, 0xd4, 0x0e, 0xa9, +0x3b, 0x9d, 0xce, 0x7f, 0xfc, 0xe3, 0x1f, 0x8e, 0xcc, 0xcc, 0xcc, 0x7d, +0xfb, 0xf6, 0xdd, 0x7b, 0xef, 0xbd, 0xa7, 0x4c, 0xc7, 0xdd, 0x17, 0x8e, +0xbb, 0x2e, 0x1c, 0x77, 0xde, 0x79, 0xe7, 0xc9, 0x0b, 0xc7, 0x89, 0x0b, +0xc7, 0x1d, 0x6e, 0x8e, 0xe3, 0xc7, 0x8f, 0xab, 0xbf, 0xf0, 0xd9, 0xeb, +0x71, 0x7b, 0x39, 0x1f, 0xb7, 0xd9, 0x3e, 0x8e, 0x95, 0xc3, 0x71, 0xf4, +0xe8, 0x51, 0x46, 0xe5, 0x7f, 0x9f, 0x8e, 0x23, 0x47, 0x8e, 0xf8, 0x74, +0xbe, 0xdc, 0x25, 0xe8, 0x87, 0xed, 0x95, 0xbb, 0x8d, 0x77, 0xc8, 0xc9, +0xe5, 0xf1, 0x26, 0xa1, 0x1f, 0x86, 0xf5, 0x4a, 0x45, 0x3a, 0xd5, 0x99, +0x09, 0x53, 0x28, 0x56, 0xa8, 0x17, 0x32, 0x16, 0x7a, 0x16, 0xda, 0x36, +0x90, 0x3c, 0x28, 0x00, 0x0b, 0x20, 0xc2, 0x91, 0x92, 0x92, 0xc2, 0x9f, +0x41, 0x89, 0x7e, 0xfc, 0xf7, 0xc2, 0xf1, 0x9f, 0x0b, 0xc7, 0xbf, 0xff, +0xfd, 0xef, 0xef, 0xbf, 0xff, 0x1e, 0x66, 0xf2, 0xcd, 0x37, 0xdf, 0xfc, +0xf3, 0x9f, 0xff, 0xfc, 0xfa, 0xeb, 0xaf, 0xbf, 0xfa, 0xea, 0x2b, 0xf0, +0xc4, 0xf1, 0x77, 0xd3, 0xf1, 0xb7, 0xbf, 0xfd, 0x4d, 0x7d, 0xc7, 0x67, +0xcb, 0xe3, 0x4b, 0x1b, 0xc7, 0x5f, 0x6d, 0x1c, 0x5f, 0xd8, 0x38, 0x3e, +0xb7, 0x71, 0xfc, 0xc5, 0x74, 0xfc, 0xf9, 0xcf, 0x7f, 0xd6, 0xbf, 0xe3, +0x57, 0x3b, 0xc7, 0x9f, 0x4c, 0xc7, 0x1f, 0xff, 0xf8, 0x47, 0xf5, 0x1d, +0x9f, 0x2d, 0x8f, 0x3f, 0xfc, 0xe1, 0x0f, 0x86, 0xef, 0xcd, 0xdf, 0x58, +0x5e, 0x68, 0xbe, 0x9d, 0xf9, 0x1b, 0x3b, 0xd3, 0x36, 0x3f, 0xbe, 0x7c, +0xa3, 0x56, 0x4e, 0xff, 0xac, 0x2f, 0xa7, 0xbe, 0xfc, 0x7c, 0xef, 0xee, +0x6d, 0xa8, 0x37, 0xc9, 0x09, 0xee, 0xde, 0xaa, 0xa2, 0x08, 0x4e, 0xb0, +0xa4, 0x0e, 0x77, 0xb4, 0xa4, 0xbe, 0x37, 0x93, 0x22, 0xdf, 0x40, 0xa2, +0xd0, 0x2a, 0x07, 0x44, 0x0b, 0xe9, 0xfe, 0xeb, 0x5f, 0xff, 0x82, 0x8c, +0xbf, 0xfb, 0xee, 0x3b, 0xe8, 0x19, 0xaa, 0x86, 0xb6, 0x85, 0xce, 0x75, +0xca, 0x07, 0x0b, 0x20, 0xc2, 0x02, 0x15, 0x82, 0x07, 0x01, 0x03, 0x43, +0x08, 0x1e, 0x18, 0x97, 0x7b, 0x30, 0x09, 0x79, 0x30, 0x59, 0x1d, 0x77, +0xf4, 0xe4, 0xee, 0x65, 0x78, 0x78, 0x91, 0xee, 0x88, 0x86, 0xef, 0x85, +0x4a, 0xf8, 0xdf, 0xf2, 0xf8, 0xcc, 0xdb, 0xf1, 0x7f, 0xee, 0x8f, 0xdf, +0xff, 0xfe, 0xf7, 0xfc, 0x91, 0xff, 0x0d, 0xc7, 0xa7, 0x9f, 0x7e, 0xca, +0x37, 0xfc, 0xef, 0xe1, 0xf8, 0x9d, 0xc7, 0xe3, 0xb7, 0xa6, 0xe3, 0x37, +0xbf, 0xf9, 0x0d, 0xdf, 0xf1, 0x7f, 0xe0, 0x87, 0x79, 0x70, 0xf9, 0xc6, +0xf3, 0x94, 0x3c, 0x3f, 0x8e, 0xfc, 0xd5, 0xbc, 0x14, 0xb2, 0x3e, 0x96, +0x4b, 0xe8, 0x6d, 0xe1, 0x3f, 0xe3, 0x7d, 0x71, 0x8e, 0xbb, 0x17, 0xa7, +0xde, 0xac, 0x4f, 0x98, 0x77, 0x47, 0x5a, 0x90, 0xa2, 0xfa, 0x93, 0x22, +0x4b, 0xc1, 0xaa, 0x20, 0x4d, 0x40, 0x02, 0x19, 0x43, 0xcc, 0xc0, 0xc3, +0x80, 0x0d, 0x05, 0x0c, 0x6b, 0x54, 0xe8, 0x90, 0x30, 0xe3, 0x81, 0xfb, +0x41, 0xd9, 0x3c, 0x86, 0xac, 0x88, 0x2c, 0x96, 0x79, 0x29, 0xe5, 0x1b, +0xb5, 0xca, 0xe6, 0xf7, 0x61, 0xf9, 0xfe, 0xdc, 0xbd, 0x6c, 0xa1, 0x27, +0x77, 0x24, 0xf5, 0x6b, 0x37, 0xc7, 0xaf, 0x7e, 0xf5, 0x2b, 0xf9, 0x0b, +0x1f, 0xcc, 0xc7, 0xff, 0x9a, 0x8e, 0xff, 0x71, 0x73, 0xfc, 0xf2, 0x97, +0xbf, 0x94, 0xbf, 0xf0, 0xc1, 0x7c, 0xfc, 0xc2, 0xcd, 0xf1, 0x73, 0xd3, +0xf1, 0xb3, 0x9f, 0xfd, 0x4c, 0xbe, 0xe3, 0x83, 0xf9, 0xf8, 0xe9, 0x0f, +0x87, 0xe5, 0x5f, 0x0d, 0x5f, 0x9a, 0x07, 0xb7, 0x9c, 0x85, 0xcc, 0x96, +0x3f, 0x59, 0xce, 0x5c, 0x3d, 0x97, 0xe1, 0xb9, 0x65, 0x61, 0xf8, 0xd2, +0xbc, 0x44, 0x96, 0x2b, 0xa9, 0xd6, 0xd9, 0xf0, 0x1e, 0x04, 0xfc, 0x7c, +0xe9, 0x6e, 0x17, 0xb0, 0x7c, 0xdd, 0x42, 0x18, 0x3a, 0xc2, 0x85, 0x78, +0xf8, 0xd2, 0x1d, 0xaa, 0x2d, 0xc9, 0x4f, 0xc1, 0x58, 0xb6, 0x54, 0x00, +0x03, 0x42, 0x04, 0x1e, 0x0a, 0x1b, 0xc2, 0x37, 0x14, 0xd3, 0x10, 0x60, +0x58, 0xa0, 0x42, 0x41, 0x82, 0xb3, 0x85, 0x3f, 0x80, 0x30, 0xc6, 0x02, +0x0c, 0xcf, 0x3c, 0xf3, 0xcc, 0x8a, 0x15, 0x2b, 0x7a, 0xf4, 0xe8, 0x91, +0x9b, 0x9b, 0x1b, 0x1b, 0x1b, 0x1b, 0xba, 0x6a, 0x56, 0x74, 0xe6, 0x91, +0xb3, 0x02, 0x10, 0x6a, 0x76, 0x76, 0x36, 0x44, 0xbb, 0x7c, 0xf9, 0xf2, +0xc7, 0x1f, 0x7f, 0x1c, 0xa8, 0x80, 0x10, 0x88, 0x19, 0x06, 0x82, 0xd4, +0x83, 0x64, 0x05, 0x91, 0x0b, 0xd3, 0x10, 0x69, 0xca, 0x02, 0x15, 0x06, +0x48, 0x00, 0x29, 0x80, 0xc5, 0x10, 0xf7, 0xdd, 0x77, 0x5f, 0x9f, 0x3e, +0x7d, 0x22, 0x67, 0x29, 0xa3, 0x4f, 0x1a, 0xae, 0x2b, 0xd0, 0xbb, 0x77, +0x6f, 0xd4, 0x6b, 0x78, 0x0e, 0x62, 0x0e, 0x84, 0x0d, 0x79, 0x2b, 0x60, +0x28, 0x8e, 0x51, 0x86, 0x57, 0x18, 0x20, 0x01, 0x8b, 0x80, 0xe3, 0xc0, +0x7d, 0xe6, 0xce, 0x9d, 0xcb, 0x1a, 0x0d, 0x1c, 0x38, 0x30, 0x5c, 0x57, +0x2a, 0xfa, 0x5c, 0x91, 0xb6, 0x02, 0xb3, 0x67, 0xcf, 0x46, 0x3e, 0x44, +0x24, 0x83, 0x6f, 0xc0, 0x34, 0xd8, 0xfd, 0x85, 0x63, 0x08, 0x30, 0x30, +0x4f, 0x95, 0x6a, 0xdb, 0xa0, 0x42, 0xd4, 0x6b, 0xce, 0xe0, 0x3c, 0x20, +0x81, 0xbc, 0xd8, 0xaf, 0x5f, 0xbf, 0xac, 0xac, 0xac, 0x48, 0x5b, 0xb5, +0xe8, 0xf3, 0x86, 0xfd, 0x0a, 0xc0, 0x34, 0x3e, 0xf8, 0xe0, 0x03, 0x14, +0x1e, 0xf6, 0x7d, 0x14, 0x04, 0x38, 0x86, 0xe8, 0xdf, 0x40, 0x00, 0xd3, +0x6d, 0x72, 0x72, 0xb2, 0xcb, 0x06, 0x05, 0x3e, 0x40, 0x89, 0x98, 0x5f, +0xd1, 0x25, 0xe0, 0x2c, 0x9c, 0x5d, 0x54, 0x54, 0x34, 0x69, 0xd2, 0xa4, +0x32, 0x0b, 0x54, 0x30, 0xc8, 0x31, 0xe1, 0x88, 0x63, 0xe5, 0x27, 0x8e, +0x4d, 0xdf, 0x38, 0x36, 0xff, 0xdb, 0xb1, 0xe5, 0xbf, 0xe5, 0xf9, 0xf3, +0x1f, 0xc7, 0x16, 0x6e, 0x21, 0x3f, 0x7c, 0xe6, 0xc7, 0xb7, 0xdb, 0xc5, +0x6c, 0xf9, 0x6f, 0xcc, 0x96, 0xff, 0xc4, 0x6e, 0xf9, 0x0f, 0xff, 0xcb, +0x4f, 0xec, 0x56, 0x7e, 0xfe, 0x1d, 0x1b, 0xc0, 0x98, 0xbe, 0xce, 0xc1, +0xe3, 0xf9, 0xf2, 0x50, 0xea, 0xd1, 0x64, 0x92, 0x17, 0x9f, 0x51, 0x26, +0x1f, 0xd4, 0xdb, 0xf9, 0xb6, 0x7a, 0x61, 0x72, 0x6b, 0x08, 0x15, 0x72, +0x85, 0x68, 0x21, 0xdd, 0xb2, 0x47, 0xcf, 0x9e, 0x3d, 0x31, 0x5a, 0xa0, +0xd6, 0xa3, 0x88, 0x43, 0xf0, 0xd8, 0x6d, 0x21, 0x7e, 0x20, 0x60, 0x44, +0x85, 0x68, 0xd8, 0xc8, 0x4e, 0x88, 0x5c, 0xf3, 0xe6, 0xcd, 0x73, 0xf9, +0x32, 0x7e, 0x38, 0x12, 0x72, 0xf2, 0x1d, 0xb3, 0x1f, 0xad, 0xd8, 0x95, +0x12, 0x72, 0x09, 0x04, 0x15, 0x2e, 0x3a, 0x2b, 0x3b, 0x67, 0x9d, 0x0a, +0xab, 0x02, 0x95, 0x18, 0xd0, 0x5e, 0x8a, 0x0a, 0xa6, 0xad, 0x10, 0x52, +0xb1, 0xcb, 0x5e, 0x15, 0x96, 0xa5, 0x7c, 0xe6, 0x30, 0xfb, 0xd1, 0x78, +0xc8, 0x58, 0x3b, 0x2e, 0xbd, 0xf4, 0x52, 0x0c, 0x71, 0xa8, 0xe0, 0x10, +0xbc, 0x92, 0xa3, 0x2e, 0xa2, 0x02, 0x7e, 0xc1, 0x27, 0x78, 0x87, 0x30, +0x0a, 0x18, 0x0a, 0xea, 0xb5, 0x7e, 0x71, 0x52, 0x93, 0x5e, 0x8e, 0x9b, +0xbe, 0xa8, 0x8c, 0x77, 0x63, 0xd8, 0x4d, 0xcb, 0x67, 0xb1, 0x7c, 0x64, +0x41, 0xc1, 0x5e, 0x87, 0x32, 0xb8, 0x8d, 0x22, 0x21, 0xd8, 0xcb, 0x5b, +0x96, 0x66, 0x6e, 0xfa, 0xc2, 0x99, 0xdf, 0x4b, 0xa7, 0x6d, 0x9c, 0xe2, +0xb0, 0x0b, 0x14, 0x0c, 0xd8, 0x05, 0xc4, 0x0f, 0x04, 0xf0, 0x7f, 0xbb, +0x24, 0x28, 0x41, 0x85, 0xd2, 0x28, 0xc0, 0x4d, 0xdf, 0xbe, 0x7d, 0x1b, +0x34, 0x68, 0x20, 0x17, 0xbb, 0xb8, 0x44, 0xe5, 0x40, 0x82, 0xe7, 0x11, +0x8a, 0xf1, 0x47, 0x7c, 0x2a, 0xdf, 0xc5, 0xad, 0x64, 0x20, 0x85, 0xe5, +0xee, 0x50, 0x51, 0x0f, 0x75, 0xd3, 0x17, 0x3a, 0xc7, 0xe8, 0xde, 0xbd, +0x3b, 0x6e, 0x19, 0xd8, 0x85, 0x52, 0xbb, 0x89, 0x0d, 0xb9, 0x88, 0x0a, +0xf0, 0x21, 0x8c, 0x02, 0x23, 0xee, 0xd3, 0x4f, 0x3f, 0x5d, 0x46, 0x00, +0xab, 0x68, 0xc1, 0xc9, 0x72, 0x75, 0xa2, 0x12, 0x76, 0x45, 0x11, 0x4d, +0x24, 0x00, 0x1e, 0x92, 0xd6, 0x8e, 0xb3, 0x67, 0xcf, 0x62, 0x8f, 0x42, +0xbb, 0x80, 0xf8, 0x81, 0x00, 0x61, 0x54, 0x17, 0x51, 0x01, 0x3e, 0xc4, +0xf4, 0x84, 0xf8, 0xb4, 0x72, 0xe5, 0xca, 0xd2, 0x4b, 0xd0, 0x51, 0x42, +0x69, 0x99, 0xa2, 0xe0, 0x89, 0x82, 0xc7, 0xde, 0x0a, 0x68, 0xca, 0xf7, +0xa2, 0x45, 0x8b, 0x70, 0xc0, 0x2b, 0x2b, 0x2d, 0x32, 0x55, 0x29, 0x2a, +0xd0, 0xc1, 0xc1, 0x0a, 0xe2, 0x13, 0xba, 0x79, 0x29, 0x2a, 0x50, 0xde, +0x43, 0x09, 0x15, 0xf6, 0x56, 0x24, 0xfa, 0x44, 0xd1, 0x15, 0x80, 0xb0, +0x7f, 0x38, 0x3a, 0x77, 0xee, 0x8c, 0xfb, 0x42, 0x74, 0x6e, 0x4c, 0x4d, +0xa5, 0xa8, 0x80, 0x6b, 0x88, 0x9e, 0x4d, 0x8c, 0x53, 0x4e, 0x4e, 0x4e, +0x29, 0x2a, 0xb0, 0x6a, 0x45, 0x57, 0x30, 0xba, 0x02, 0xe1, 0xb7, 0x02, +0x10, 0xf6, 0x0f, 0x07, 0x21, 0x21, 0x98, 0x68, 0x11, 0xa2, 0x20, 0x7e, +0x74, 0x6e, 0x42, 0xe2, 0x2f, 0xf2, 0x0a, 0xf0, 0x81, 0x23, 0x03, 0x85, +0x03, 0x3e, 0x52, 0x26, 0xc6, 0x09, 0x73, 0x6f, 0xf8, 0xad, 0x48, 0xf4, +0x89, 0xa2, 0x2b, 0x00, 0x61, 0xff, 0x70, 0x40, 0xf0, 0x44, 0x66, 0x8a, +0x25, 0x0a, 0xc6, 0x50, 0x06, 0x15, 0xe2, 0xcf, 0x26, 0x3e, 0xa4, 0x8c, +0xaa, 0x1d, 0x5d, 0xbe, 0xe8, 0x0a, 0x84, 0xe5, 0x0a, 0xe0, 0x83, 0xd6, +0x8e, 0x4f, 0x3e, 0xf9, 0x04, 0xd5, 0x02, 0xe2, 0x87, 0x31, 0x44, 0x51, +0x11, 0xd5, 0x43, 0x22, 0x78, 0x05, 0x34, 0x54, 0x7c, 0xfc, 0xf1, 0xc7, +0xd6, 0xa8, 0x10, 0x97, 0x36, 0x3a, 0x47, 0x94, 0x57, 0x44, 0x85, 0xc6, +0x88, 0x58, 0x01, 0x8d, 0xd0, 0x3f, 0xfa, 0xe8, 0x23, 0xa2, 0xfe, 0x20, +0x7e, 0xc4, 0x25, 0x12, 0x7d, 0x4b, 0xf5, 0x8a, 0x28, 0x2a, 0x22, 0x82, +0x14, 0xc2, 0x52, 0x1c, 0xf2, 0xef, 0xa1, 0xec, 0xa3, 0x82, 0xb4, 0xa6, +0x28, 0xaf, 0x88, 0xc2, 0x23, 0x22, 0x56, 0x20, 0x8a, 0x8a, 0x88, 0x78, +0xcd, 0xfe, 0x6d, 0x99, 0x11, 0x7b, 0x55, 0x14, 0x15, 0x21, 0x87, 0x8a, +0xa4, 0x6d, 0xdf, 0xe5, 0xed, 0xf8, 0x47, 0xfe, 0xce, 0xcf, 0x5b, 0xee, +0xfc, 0xac, 0x5d, 0xc9, 0x6f, 0x46, 0x6e, 0x3c, 0x5d, 0x74, 0xed, 0xb1, +0x76, 0x57, 0xec, 0x6e, 0x3c, 0x73, 0x6b, 0xdb, 0xcb, 0x77, 0xf7, 0xbf, +0xe6, 0xe8, 0x98, 0xe2, 0x73, 0xfc, 0x35, 0xe4, 0x9e, 0xab, 0x0a, 0x4d, +0x58, 0x43, 0xc5, 0x87, 0x1f, 0x7e, 0x28, 0xd1, 0x50, 0xd6, 0x7a, 0x45, +0x54, 0x82, 0xaa, 0x94, 0xd7, 0x96, 0xbd, 0xfd, 0xeb, 0x56, 0x25, 0x9f, +0x8e, 0xdc, 0x74, 0xa6, 0xdf, 0xc2, 0xcd, 0x1d, 0x47, 0xce, 0x6a, 0xd4, +0xa6, 0x73, 0x66, 0xcd, 0xc6, 0xce, 0xcc, 0x3c, 0x67, 0x7a, 0x96, 0x33, +0xbd, 0x86, 0x33, 0xad, 0x46, 0x62, 0x52, 0x7a, 0x62, 0x52, 0x9a, 0xfe, +0xe3, 0x4c, 0xad, 0x96, 0xde, 0xb0, 0x43, 0xcf, 0x79, 0x1b, 0xda, 0xee, +0xfe, 0x2c, 0x67, 0xc7, 0x3f, 0x2b, 0x65, 0xda, 0xa1, 0x7d, 0x53, 0xaf, +0xbc, 0x82, 0x42, 0x54, 0x84, 0x7b, 0x10, 0x20, 0x15, 0x45, 0x45, 0x05, +0xbf, 0x69, 0xf6, 0xfb, 0xa1, 0xab, 0x8f, 0xd6, 0xef, 0x50, 0xe4, 0x88, +0x4b, 0x8a, 0x8b, 0x89, 0x4b, 0x75, 0x26, 0x55, 0x4f, 0x4d, 0xcd, 0xcd, +0xcc, 0xa8, 0x59, 0x3d, 0xb3, 0x65, 0x7e, 0xe3, 0x3e, 0xdd, 0xba, 0xf6, +0xec, 0x5c, 0xd8, 0xbf, 0x57, 0xcf, 0x99, 0xd3, 0xa6, 0x5e, 0x36, 0xe3, +0xd2, 0x39, 0xda, 0xcf, 0x88, 0x41, 0x83, 0xb2, 0x33, 0xd2, 0x12, 0x1c, +0x8e, 0xd8, 0xe4, 0x8c, 0x66, 0x43, 0x66, 0x8d, 0xdd, 0xf9, 0x74, 0x93, +0xdd, 0x5f, 0x56, 0xf0, 0xe4, 0x43, 0xfb, 0x76, 0x5e, 0x51, 0x81, 0x6f, +0x1b, 0x1b, 0x54, 0x14, 0x15, 0x15, 0xf6, 0x9a, 0xb3, 0x77, 0x7c, 0xdd, +0x66, 0xd7, 0xff, 0xf5, 0x59, 0xbc, 0x23, 0x31, 0xaf, 0x80, 0xb7, 0x93, +0x93, 0x99, 0xd1, 0xbd, 0xb0, 0x70, 0xce, 0xcc, 0x99, 0xc5, 0x5b, 0xb6, +0x3c, 0xfa, 0xc8, 0x23, 0xd4, 0xaa, 0x81, 0xa1, 0x4b, 0x45, 0x19, 0x55, +0xf5, 0x47, 0x2f, 0xfd, 0x22, 0xb5, 0x61, 0x5e, 0x7d, 0xf5, 0xd5, 0xe5, +0x4b, 0x97, 0xb6, 0x6d, 0xde, 0x3c, 0x35, 0x01, 0x74, 0xc4, 0xa5, 0x34, +0xea, 0x58, 0xb4, 0x62, 0x5f, 0xc1, 0x9e, 0xbf, 0x55, 0xd8, 0x53, 0x84, +0xf6, 0x8d, 0xa2, 0xa8, 0xa8, 0x3a, 0xef, 0xaf, 0xf1, 0xce, 0xcf, 0x47, +0x6f, 0x7f, 0xa2, 0xdd, 0xa5, 0x37, 0x26, 0x64, 0xd6, 0xe2, 0xbd, 0x34, +0xa8, 0x95, 0x37, 0x7d, 0xca, 0x94, 0xfb, 0xcf, 0x9c, 0x81, 0xd0, 0xa5, +0x18, 0x99, 0xd4, 0x2f, 0x92, 0x72, 0x72, 0x52, 0xf6, 0xcb, 0xb2, 0x74, +0x9f, 0x14, 0x05, 0xe3, 0x1c, 0xb2, 0xc9, 0x6e, 0x3d, 0x78, 0x70, 0xcc, +0x88, 0x61, 0xb5, 0xb3, 0x5c, 0xb9, 0x93, 0x69, 0xf9, 0x9d, 0x07, 0xaf, +0x39, 0xd9, 0x34, 0x8a, 0x0d, 0xaf, 0x56, 0x04, 0x9b, 0x7a, 0x45, 0x94, +0x57, 0x94, 0x37, 0x78, 0x90, 0x97, 0x7a, 0x2f, 0xda, 0xe6, 0xac, 0x56, +0x93, 0x37, 0xd2, 0xb8, 0x4e, 0xad, 0x15, 0x4b, 0x97, 0x3c, 0xf9, 0xc4, +0x13, 0x52, 0xa4, 0x48, 0xca, 0x78, 0xa9, 0x42, 0x77, 0x52, 0x28, 0x52, +0xaa, 0x44, 0x4a, 0xf1, 0x52, 0xf3, 0xc1, 0x9f, 0xa4, 0x94, 0x23, 0x57, +0x71, 0xf9, 0x13, 0x8f, 0x3f, 0x3e, 0x77, 0xd6, 0xac, 0xcc, 0x24, 0x17, +0xdf, 0xc8, 0xe9, 0x36, 0x7e, 0xc8, 0xe6, 0x87, 0x0a, 0xf6, 0x44, 0x65, +0x2a, 0xf7, 0xce, 0x7b, 0xaf, 0xa8, 0x50, 0x7a, 0x05, 0xa5, 0x72, 0xa2, +0xfe, 0x8a, 0xf2, 0xc0, 0x46, 0xe3, 0x92, 0xbf, 0x0c, 0xb8, 0xf1, 0xee, +0x8c, 0x26, 0x1d, 0x59, 0xde, 0x3a, 0x35, 0xaa, 0x6d, 0xde, 0xb8, 0x01, +0xf9, 0x07, 0x3c, 0x40, 0xcd, 0x90, 0x35, 0xc4, 0x2d, 0x05, 0xed, 0x88, +0xe7, 0x97, 0x7a, 0x8f, 0xfa, 0x41, 0x42, 0x98, 0xe5, 0xc1, 0x39, 0xaa, +0xf2, 0xaf, 0x14, 0x3b, 0x65, 0xb4, 0x87, 0x1f, 0x7e, 0x78, 0x58, 0xff, +0x7e, 0xdc, 0x25, 0x21, 0x35, 0xab, 0xd7, 0xac, 0xd5, 0x51, 0x81, 0xca, +0xed, 0xdb, 0xb4, 0x8f, 0x8a, 0xa8, 0xb6, 0x5d, 0x1e, 0x90, 0x80, 0x45, +0xf4, 0xba, 0x62, 0xb3, 0x33, 0x3d, 0x9b, 0x17, 0x31, 0x79, 0xdc, 0xd8, +0x97, 0x5e, 0x7a, 0x89, 0x75, 0x86, 0x3f, 0xc0, 0x1c, 0x04, 0x0f, 0x02, +0x06, 0x21, 0x7d, 0x29, 0x65, 0x67, 0x38, 0xc8, 0xaa, 0x37, 0x1c, 0x72, +0x02, 0x27, 0xeb, 0x85, 0x80, 0xe1, 0x1e, 0x52, 0x9f, 0xe5, 0x8e, 0xdb, +0x6e, 0x6b, 0xde, 0xb0, 0x3e, 0x8d, 0x17, 0x9c, 0x19, 0xb9, 0x7d, 0xae, +0xd8, 0x5c, 0x10, 0x55, 0xc4, 0xcd, 0x02, 0x55, 0x14, 0x15, 0xe5, 0x41, +0xeb, 0x76, 0xc6, 0x84, 0x45, 0x0c, 0xda, 0xf4, 0x40, 0x6a, 0xc3, 0xb6, +0xbc, 0x82, 0x7a, 0x79, 0x39, 0xbb, 0x76, 0xee, 0x44, 0x8d, 0x56, 0x85, +0xeb, 0x04, 0x0f, 0x86, 0x4a, 0xc0, 0x52, 0x07, 0x5e, 0x6a, 0x65, 0x7b, +0x3d, 0xcc, 0x45, 0xe3, 0x55, 0x11, 0x54, 0x6e, 0xb4, 0xee, 0xc6, 0x35, +0x75, 0xb3, 0x6b, 0x50, 0xfc, 0xb4, 0x70, 0xc4, 0xcc, 0xa8, 0xa6, 0x61, +0x7c, 0x5f, 0x26, 0x54, 0xb0, 0x55, 0xa1, 0xad, 0x95, 0xc6, 0x41, 0x45, +0x25, 0x28, 0x3b, 0x24, 0xee, 0xeb, 0x39, 0x28, 0xd6, 0xfd, 0x96, 0xee, +0x89, 0x4b, 0xcb, 0x8e, 0x77, 0x38, 0xc6, 0x8e, 0x18, 0xf1, 0xc6, 0xeb, +0xaf, 0x23, 0xa0, 0x4a, 0x26, 0x24, 0x9b, 0xba, 0xd4, 0x72, 0x34, 0x14, +0x00, 0x56, 0x30, 0x30, 0x34, 0x4e, 0x70, 0xf7, 0xab, 0x3a, 0x5f, 0x6a, +0xc8, 0xc3, 0x37, 0xc0, 0x18, 0x48, 0x63, 0x70, 0xa9, 0x86, 0xfa, 0xfe, +0xfb, 0xef, 0x8f, 0x1b, 0x35, 0x0a, 0x55, 0x23, 0x21, 0x3d, 0x7b, 0xd0, +0x9a, 0x3b, 0xa2, 0x02, 0x55, 0xe9, 0x4b, 0xb4, 0x42, 0x45, 0x19, 0x2f, +0x5e, 0x14, 0x15, 0xbe, 0x52, 0xbc, 0xd7, 0xf3, 0x91, 0x9a, 0xba, 0xcf, +0xb8, 0x96, 0x95, 0xaf, 0x9d, 0x5d, 0x63, 0xc7, 0xf6, 0xed, 0x58, 0x52, +0x95, 0xc8, 0xe4, 0x0e, 0x0f, 0x36, 0x91, 0x60, 0x79, 0x9a, 0xea, 0x37, +0x22, 0x62, 0x95, 0x60, 0x43, 0x12, 0xf1, 0x29, 0xe7, 0xbd, 0x71, 0xdd, +0xba, 0x2c, 0x57, 0x75, 0xaf, 0x84, 0x3e, 0x0b, 0x36, 0x35, 0xdd, 0xfb, +0x77, 0xaf, 0x93, 0x8f, 0x88, 0x13, 0xa2, 0xa8, 0xa8, 0xe0, 0xd7, 0x9c, +0xbf, 0xeb, 0x8b, 0x4e, 0xc3, 0x2e, 0x61, 0xd9, 0xbb, 0x15, 0x76, 0x7a, +0xe8, 0xc1, 0x07, 0x61, 0xcd, 0x98, 0x50, 0x21, 0x50, 0x58, 0x84, 0x59, +0x64, 0x32, 0x74, 0x15, 0xf1, 0x1b, 0x1b, 0x0a, 0x18, 0x7a, 0x17, 0x1e, +0x10, 0x88, 0xea, 0xc2, 0x16, 0x78, 0xee, 0xd1, 0x47, 0xdb, 0xb7, 0x68, +0xce, 0x94, 0xaa, 0xb5, 0xe8, 0x35, 0xd4, 0x65, 0x9e, 0x8a, 0x78, 0xb7, +0x86, 0x4d, 0x54, 0xf0, 0xe6, 0xa2, 0x36, 0xa8, 0x00, 0xf1, 0xe3, 0xb2, +0x35, 0xad, 0xbb, 0x27, 0xbd, 0x8e, 0x8b, 0xfe, 0xa6, 0x4e, 0x9a, 0xf8, +0xfa, 0x6b, 0xaf, 0x49, 0x9a, 0xbc, 0x54, 0x55, 0x51, 0x75, 0xe1, 0xdd, +0x35, 0xda, 0xf1, 0x1b, 0x12, 0xea, 0x42, 0x77, 0xd8, 0x40, 0xa0, 0xfa, +0xc9, 0xfb, 0xef, 0xe3, 0x20, 0x67, 0x62, 0xc9, 0xd5, 0xeb, 0x0c, 0xba, +0x21, 0xe2, 0xa5, 0xa9, 0x28, 0x2a, 0x02, 0xa4, 0x75, 0x9b, 0x97, 0xa3, +0x48, 0xf4, 0x5d, 0xb6, 0x37, 0x21, 0xb5, 0x3a, 0x8a, 0xc4, 0xaa, 0x15, +0xcb, 0x55, 0xb5, 0x46, 0x81, 0x84, 0xaa, 0xef, 0x6b, 0xd9, 0x78, 0x2a, +0x70, 0x3c, 0x18, 0x1a, 0xb8, 0xe9, 0xdd, 0xaa, 0xa4, 0x15, 0x09, 0xd3, +0x80, 0x6b, 0xed, 0x2a, 0x29, 0xa9, 0x9e, 0xec, 0x8c, 0x8d, 0x4d, 0xe8, +0x35, 0xe3, 0xda, 0x88, 0x56, 0xc1, 0xed, 0xa0, 0x82, 0xbd, 0x24, 0xca, +0x2b, 0x6c, 0x52, 0xbf, 0xe5, 0x69, 0x28, 0x12, 0x5d, 0xa7, 0x5f, 0xcd, +0x52, 0xe7, 0x56, 0xcf, 0xdc, 0xb3, 0x67, 0x37, 0x11, 0x19, 0xd8, 0x9a, +0x10, 0x5d, 0x44, 0x6a, 0x92, 0xca, 0xbe, 0x86, 0xb6, 0x3a, 0xc1, 0x45, +0x82, 0xbb, 0xce, 0x86, 0x4a, 0xa0, 0x12, 0xf3, 0x14, 0xba, 0xfe, 0xb3, +0xcf, 0x3c, 0xdd, 0xb1, 0x55, 0x4b, 0xa6, 0xda, 0xa1, 0xff, 0xe8, 0xc8, +0x55, 0x33, 0x6c, 0xda, 0xa0, 0xa2, 0xa8, 0xf0, 0x1b, 0x15, 0xf9, 0x3b, +0xbf, 0xe8, 0x38, 0xdc, 0xa5, 0x48, 0xb4, 0x6b, 0xd5, 0xea, 0xec, 0x83, +0x0f, 0x4a, 0x6f, 0x04, 0x03, 0x24, 0x2a, 0x80, 0x45, 0x98, 0x61, 0x26, +0x02, 0x95, 0x00, 0x43, 0x57, 0xc1, 0xa9, 0xf5, 0x82, 0x34, 0x15, 0x17, +0xe3, 0x48, 0xa8, 0x5e, 0x7b, 0xf0, 0xda, 0x53, 0x91, 0xe8, 0x05, 0xb7, +0x8f, 0x0a, 0x5e, 0x67, 0xd4, 0xb7, 0xed, 0x2b, 0x36, 0xd0, 0xad, 0xdb, +0xf5, 0x1d, 0xc1, 0xba, 0x8d, 0x1d, 0x39, 0x52, 0x14, 0x09, 0x29, 0xfe, +0x2e, 0x65, 0xae, 0xe1, 0x12, 0x15, 0xc9, 0x22, 0xdc, 0x59, 0xa8, 0xa4, +0x13, 0x83, 0x94, 0x9d, 0x57, 0x2a, 0x78, 0xc9, 0x8e, 0x1d, 0x19, 0x49, +0xce, 0xf8, 0x94, 0xea, 0x83, 0xd7, 0xdd, 0x13, 0x71, 0xd2, 0x94, 0x1b, +0x54, 0xd0, 0xa6, 0xf9, 0x62, 0xde, 0xb6, 0x58, 0x66, 0xe1, 0x15, 0x51, +0x54, 0xf8, 0x04, 0x89, 0x0b, 0x4e, 0xba, 0x07, 0x93, 0x73, 0x1b, 0xe3, +0x29, 0x5b, 0xbc, 0x70, 0xa1, 0x2a, 0x41, 0xa7, 0xb7, 0x96, 0x52, 0x3d, +0xd7, 0x82, 0x65, 0x6b, 0xf2, 0x4f, 0xee, 0xd2, 0x7b, 0x59, 0xc1, 0x34, +0x94, 0x34, 0x75, 0xf4, 0xf0, 0xe1, 0xcc, 0xc4, 0x78, 0xc2, 0x43, 0x06, +0xaf, 0x3b, 0xdd, 0x74, 0x6f, 0x24, 0x19, 0xa6, 0xbc, 0xa2, 0x82, 0x1a, +0x38, 0xa2, 0x57, 0x44, 0x51, 0x61, 0x1f, 0x15, 0x2e, 0x48, 0x6c, 0x78, +0x20, 0x25, 0x2f, 0x1f, 0x48, 0xac, 0x5e, 0xb5, 0x8a, 0xb0, 0x6f, 0x42, +0x2d, 0x44, 0x6a, 0x32, 0xeb, 0xd6, 0xfe, 0x91, 0x72, 0x70, 0xaf, 0x32, +0x77, 0xc7, 0x95, 0xd6, 0x87, 0xb7, 0x1f, 0x3d, 0x9a, 0x99, 0x10, 0x9b, +0x98, 0x9e, 0x3d, 0x64, 0xdd, 0xe9, 0x08, 0xb2, 0xd8, 0x6a, 0xa8, 0xa0, +0xef, 0x11, 0x3b, 0x9a, 0xf8, 0xb6, 0x4b, 0x79, 0x45, 0x14, 0x15, 0xf6, +0xc1, 0x20, 0x67, 0x36, 0x72, 0x41, 0xe2, 0xbe, 0xe4, 0xbc, 0x7c, 0xcc, +0x4d, 0xab, 0xaf, 0xb9, 0x86, 0x2c, 0x08, 0xd1, 0xad, 0x61, 0xb9, 0xe2, +0x91, 0xa8, 0x60, 0xdd, 0xda, 0x26, 0x7e, 0x0c, 0xc0, 0x50, 0x9e, 0xbe, +0x13, 0xb7, 0xdf, 0x9e, 0x91, 0x18, 0x87, 0xff, 0x7b, 0xc8, 0x4d, 0xf7, +0x44, 0x0a, 0x30, 0xa2, 0xbc, 0xc2, 0x57, 0xa2, 0xf7, 0x7c, 0x3e, 0x90, +0x18, 0xb8, 0xfe, 0x8c, 0x33, 0xa7, 0x51, 0x62, 0x6c, 0xcc, 0xea, 0x6b, +0xaf, 0xc5, 0xdc, 0xa4, 0xb8, 0x84, 0x32, 0x37, 0x55, 0x8a, 0x6e, 0x6d, +0x07, 0x1b, 0xba, 0x43, 0x43, 0xfa, 0xa9, 0x4b, 0x78, 0xc8, 0x89, 0xe3, +0xb7, 0x57, 0x4b, 0x4e, 0x8a, 0x4b, 0xcd, 0xba, 0xc0, 0x31, 0x22, 0x20, +0x04, 0x3d, 0x8a, 0x8a, 0x20, 0xa2, 0x02, 0xc1, 0x49, 0x20, 0xe1, 0x04, +0x12, 0xd7, 0x5c, 0x23, 0x90, 0x90, 0xd0, 0x26, 0x03, 0x24, 0xec, 0xd0, +0x68, 0x65, 0x9d, 0x23, 0x4c, 0x43, 0x3a, 0x21, 0x0a, 0x30, 0x70, 0xbd, +0xdf, 0x7e, 0xec, 0x58, 0x46, 0x6a, 0x4a, 0x42, 0xf5, 0xba, 0xc3, 0xb6, +0x3d, 0x1e, 0xc4, 0x15, 0xab, 0xa2, 0x43, 0xd9, 0x44, 0x05, 0xc6, 0x44, +0xde, 0x71, 0xd4, 0x06, 0xe5, 0xf9, 0x2d, 0x0e, 0x5a, 0x7f, 0x26, 0x39, +0xa7, 0x21, 0xf1, 0x76, 0xc2, 0x25, 0x54, 0xdf, 0x83, 0x10, 0x82, 0x84, +0x40, 0xd1, 0xd0, 0x4b, 0x5a, 0x38, 0xc6, 0xce, 0xed, 0xdb, 0x9d, 0x09, +0xf1, 0x29, 0xb5, 0x9a, 0x35, 0xdb, 0x17, 0xee, 0xe1, 0x52, 0x36, 0xf5, +0x8a, 0x28, 0x2a, 0xbc, 0xee, 0x6a, 0xf8, 0x25, 0x92, 0x72, 0x1a, 0xa2, +0x4b, 0x5c, 0x7f, 0xed, 0xb5, 0xd2, 0x97, 0x36, 0xe4, 0xb8, 0x84, 0xd9, +0x05, 0x2e, 0x1c, 0x43, 0x74, 0x0c, 0x1e, 0xe7, 0xc6, 0xd5, 0xab, 0x49, +0xcc, 0x28, 0xec, 0x3f, 0x36, 0xcc, 0x1d, 0x7c, 0x51, 0x54, 0x78, 0x25, +0x77, 0x3b, 0x27, 0x10, 0xd0, 0xd1, 0xbe, 0xff, 0x58, 0x2c, 0x4e, 0x37, +0xac, 0xbe, 0x8e, 0x4a, 0x03, 0x66, 0xd7, 0xb5, 0xe8, 0x12, 0x95, 0x25, +0x14, 0xf9, 0x77, 0x5f, 0x5d, 0x94, 0x02, 0x18, 0xc8, 0x81, 0xd8, 0x0c, +0x16, 0x2e, 0x58, 0xe0, 0x0a, 0x6d, 0x1c, 0x3d, 0x2b, 0x9c, 0x81, 0x11, +0x45, 0x85, 0x1d, 0xa2, 0xf7, 0x7c, 0x0e, 0xea, 0x44, 0x97, 0x49, 0x57, +0xb1, 0x92, 0xf3, 0x67, 0xcf, 0x96, 0x8a, 0x5a, 0x12, 0xf3, 0xa7, 0x2c, +0x4e, 0xa1, 0x08, 0x09, 0x5d, 0x94, 0x52, 0xdd, 0xd6, 0x79, 0xa8, 0xdf, +0xfc, 0xfa, 0xd7, 0x93, 0xc6, 0x8f, 0xe7, 0x61, 0x7b, 0xcd, 0x58, 0x15, +0xb6, 0x26, 0x29, 0x3b, 0xa8, 0x40, 0xd9, 0x0a, 0x03, 0x09, 0xaa, 0xc6, +0xf6, 0xaf, 0x5a, 0x95, 0xfc, 0x8e, 0x0a, 0x4b, 0x9d, 0xa7, 0x2e, 0xaf, +0x53, 0x38, 0xb8, 0x76, 0xe1, 0x90, 0x4e, 0x13, 0xae, 0x1c, 0x7a, 0xc3, +0xed, 0xd0, 0x74, 0x80, 0xc0, 0xe8, 0xb3, 0x64, 0x8f, 0x8b, 0x4a, 0xba, +0x75, 0x7d, 0xf7, 0x9d, 0x77, 0xc5, 0x7b, 0x2d, 0x31, 0x7f, 0x12, 0xe0, +0x54, 0x65, 0x2d, 0x4e, 0x76, 0x18, 0x88, 0x21, 0x2a, 0x44, 0x14, 0x0c, +0x8a, 0xd7, 0xf7, 0xbb, 0xd0, 0x0b, 0xae, 0xef, 0x15, 0xb7, 0x84, 0x67, +0xa5, 0xa9, 0x48, 0x40, 0x85, 0xcb, 0x81, 0xb0, 0x72, 0x6f, 0x9d, 0xd6, +0xbc, 0xc8, 0xb8, 0xf8, 0x18, 0x47, 0xb5, 0x94, 0xe4, 0x5a, 0xd9, 0x35, +0xf8, 0xa9, 0x9e, 0x96, 0x8a, 0xcc, 0x13, 0x9f, 0x5a, 0xbd, 0xcf, 0xb2, +0x3d, 0x7e, 0x63, 0x03, 0xd9, 0x29, 0x3e, 0x23, 0xb7, 0x56, 0x4e, 0xce, +0x7d, 0x67, 0xce, 0x10, 0x6c, 0x2f, 0x01, 0x1d, 0xe2, 0xaa, 0x13, 0xbf, +0x84, 0x10, 0x96, 0x1d, 0x12, 0xac, 0x9a, 0xe7, 0x18, 0x34, 0x6f, 0x49, +0x57, 0x7a, 0xed, 0xd5, 0x57, 0xdb, 0x36, 0x6f, 0x06, 0xf1, 0x0c, 0x5c, +0x73, 0x47, 0x80, 0x7b, 0x4a, 0x55, 0xbc, 0x3c, 0xec, 0x51, 0x01, 0xb9, +0x77, 0x9f, 0x75, 0x43, 0x8c, 0x23, 0xa6, 0x6e, 0x4e, 0xd6, 0xb0, 0x41, +0x83, 0xae, 0x5d, 0xb5, 0xea, 0xf0, 0xa1, 0x43, 0x8f, 0x3f, 0xf6, 0xd8, +0x63, 0xe7, 0xce, 0x9d, 0x38, 0x7e, 0x9c, 0x58, 0x8c, 0x3a, 0x79, 0x79, +0x14, 0xe7, 0x2b, 0xba, 0xfa, 0x90, 0x1f, 0xaf, 0x87, 0xc1, 0xdb, 0xf5, +0x1b, 0x95, 0x10, 0x1f, 0xbf, 0x71, 0xfd, 0x7a, 0xd5, 0x3d, 0x8d, 0x0d, +0x55, 0x20, 0x11, 0xd2, 0x5c, 0xc2, 0xa0, 0x79, 0x4b, 0x1c, 0xa1, 0xc4, +0x4a, 0x49, 0xef, 0xab, 0x47, 0x1e, 0x7e, 0x38, 0x2f, 0x3b, 0xdb, 0x99, +0xd7, 0x24, 0x0c, 0x3d, 0x18, 0x26, 0x54, 0xb0, 0xdf, 0x19, 0x7d, 0xdb, +0xa1, 0x2c, 0x41, 0x9d, 0xef, 0xb3, 0xb8, 0xc4, 0x11, 0x97, 0xd0, 0xb1, +0x6d, 0x9b, 0x87, 0xce, 0x9e, 0xc5, 0x75, 0x8f, 0xc1, 0x94, 0x27, 0x44, +0xce, 0xe1, 0xc0, 0x8d, 0x8f, 0xb1, 0xe8, 0xae, 0x93, 0x27, 0x6b, 0x54, +0xaf, 0x16, 0xeb, 0x4c, 0x27, 0x92, 0xcf, 0x27, 0x60, 0xc0, 0x82, 0xba, +0x4d, 0x5d, 0xce, 0x02, 0x4e, 0x99, 0x38, 0x11, 0x75, 0x42, 0x8c, 0x4e, +0x92, 0x62, 0x0a, 0xf5, 0x84, 0x01, 0x97, 0xb0, 0xcc, 0xca, 0x10, 0x93, +0x94, 0x94, 0xd2, 0xb9, 0x74, 0xea, 0x54, 0x1e, 0x7f, 0xcc, 0x2d, 0x0f, +0xf8, 0xb4, 0x6e, 0x21, 0x70, 0xb2, 0x4d, 0x54, 0xf0, 0xca, 0x21, 0xa0, +0x90, 0xf3, 0x57, 0x60, 0x2d, 0x4d, 0xc9, 0x69, 0x50, 0xb3, 0x5a, 0x3a, +0x65, 0xc2, 0x28, 0x41, 0x29, 0xe9, 0xa0, 0xec, 0x73, 0xe0, 0x5c, 0x2a, +0x88, 0xa1, 0x2f, 0xf1, 0x25, 0x1e, 0x37, 0x2c, 0xaa, 0x5d, 0xa7, 0x2e, +0x41, 0x1c, 0xb2, 0xff, 0xce, 0xa8, 0x04, 0x1e, 0x9f, 0x9c, 0xd1, 0x3c, +0xbf, 0xd1, 0x9b, 0x6f, 0xbe, 0x29, 0x7b, 0x09, 0x56, 0x1a, 0x05, 0x89, +0xd0, 0xd5, 0xb0, 0x3d, 0x94, 0x47, 0x10, 0xef, 0x1e, 0x9c, 0x50, 0x5c, +0x7b, 0x6c, 0x28, 0xd5, 0xd3, 0xd3, 0x0a, 0x8a, 0xa6, 0xe4, 0xee, 0x0c, +0xaf, 0xd6, 0xa1, 0xf6, 0x51, 0x11, 0x82, 0x5e, 0xbc, 0xf3, 0xc3, 0xae, +0xde, 0xcb, 0x03, 0xae, 0xb9, 0xee, 0x3a, 0xf6, 0x72, 0x3d, 0x43, 0x9a, +0x97, 0x8a, 0x18, 0x20, 0x79, 0x36, 0xe0, 0xe4, 0x17, 0xbf, 0xfc, 0x65, +0xbb, 0x16, 0x2d, 0x62, 0xe3, 0x93, 0x46, 0x17, 0x3f, 0x6a, 0x13, 0x15, +0xe0, 0x27, 0xbd, 0x5e, 0x6b, 0xb0, 0x44, 0x1d, 0x5e, 0xf6, 0x0b, 0xd0, +0x25, 0xea, 0x84, 0xae, 0x61, 0x57, 0x4d, 0x3d, 0x21, 0x90, 0x59, 0x29, +0x39, 0x4a, 0x0c, 0xb5, 0xb0, 0x8b, 0xae, 0x1d, 0xda, 0xc7, 0x26, 0xa6, +0x76, 0xd8, 0x1f, 0xa8, 0xc5, 0xc2, 0xe6, 0xb2, 0x57, 0xd0, 0x69, 0x61, +0x8d, 0x8a, 0xff, 0xf6, 0x9a, 0x7c, 0x45, 0x7a, 0x8c, 0xe3, 0x47, 0xcf, +0x3d, 0xa7, 0x9a, 0xc3, 0x82, 0x07, 0x31, 0x98, 0x4a, 0x69, 0x3d, 0xd1, +0x1d, 0x71, 0x2f, 0x6c, 0xda, 0xb0, 0x3e, 0x29, 0xd1, 0xd9, 0xeb, 0xf2, +0x4d, 0x76, 0xd6, 0xdd, 0xa5, 0xab, 0xcc, 0x5c, 0xcd, 0xd2, 0x5d, 0x31, +0x7f, 0x3e, 0xb9, 0xa6, 0xe2, 0x9d, 0x30, 0xa8, 0x13, 0x81, 0x10, 0x5f, +0x95, 0xbd, 0x56, 0x69, 0xde, 0x12, 0x70, 0xce, 0x9e, 0xb2, 0x7e, 0xed, +0x8d, 0x49, 0xce, 0xa4, 0x81, 0xab, 0x0e, 0xdb, 0x59, 0xb7, 0x90, 0x39, +0xc7, 0x0a, 0x15, 0x6c, 0x01, 0x65, 0x62, 0x66, 0xa1, 0x9b, 0x10, 0x95, +0xa0, 0x5a, 0xf7, 0x18, 0xdc, 0xa5, 0x6d, 0xab, 0x77, 0xdf, 0x79, 0xc7, +0xe0, 0x43, 0x50, 0x75, 0xf5, 0x24, 0x97, 0x00, 0x76, 0xf1, 0xf4, 0x53, +0x4f, 0xa5, 0x27, 0x27, 0x35, 0xec, 0x39, 0x36, 0xa3, 0xf8, 0x5f, 0x5e, +0x5f, 0x5e, 0xd1, 0x35, 0xc7, 0x28, 0x15, 0xd3, 0xae, 0x75, 0x4b, 0x4c, +0x31, 0x12, 0x63, 0x8c, 0x9c, 0xad, 0xab, 0x13, 0x55, 0x96, 0xac, 0x03, +0x9f, 0x98, 0x00, 0x43, 0xd4, 0x6e, 0x96, 0x6e, 0xdf, 0xee, 0xdd, 0x89, +0x09, 0x89, 0x79, 0x7d, 0xa6, 0x37, 0xdb, 0xf7, 0x0f, 0xaf, 0xeb, 0x16, +0x32, 0x27, 0xd8, 0xe7, 0x15, 0x95, 0xa8, 0x57, 0xb0, 0x37, 0x0f, 0xbf, +0xe1, 0xb6, 0x3e, 0xf3, 0xd7, 0xb7, 0x1c, 0x38, 0x35, 0xaf, 0xe3, 0x90, +0xf4, 0x96, 0xfd, 0x72, 0xdb, 0x0f, 0x6c, 0x33, 0x62, 0xee, 0x80, 0x15, +0x7b, 0x47, 0x6f, 0x39, 0xeb, 0xc1, 0xa8, 0xda, 0xa0, 0x75, 0xd7, 0xbe, +0x5d, 0x3a, 0x11, 0x22, 0x2f, 0x5d, 0xc4, 0xe1, 0x0c, 0xaa, 0x6e, 0x80, +0xca, 0xcc, 0x64, 0x8f, 0x67, 0xa7, 0x87, 0x99, 0xe4, 0x66, 0xa6, 0xa7, +0xd6, 0x6c, 0xe2, 0x55, 0xe7, 0xe6, 0x76, 0x49, 0x75, 0x9a, 0x3b, 0x63, +0x1d, 0xb7, 0x1d, 0x3b, 0x26, 0xa6, 0x58, 0xb3, 0x77, 0x22, 0x70, 0xe2, +0xab, 0xb2, 0x23, 0xe8, 0x0e, 0x6f, 0xf6, 0x94, 0xdb, 0x6f, 0xbb, 0xad, +0xa0, 0x41, 0x03, 0x97, 0xef, 0x62, 0xfe, 0x3a, 0xc7, 0x96, 0xf3, 0x21, +0x43, 0xf7, 0x9e, 0xcb, 0x92, 0x57, 0x71, 0x54, 0x34, 0xdc, 0xfe, 0xa7, +0xa2, 0x1b, 0x4e, 0x12, 0x91, 0xc6, 0x3c, 0xe3, 0x1c, 0x8e, 0xba, 0x59, +0x19, 0x0d, 0x72, 0xaa, 0xd7, 0xcf, 0xae, 0xde, 0x28, 0xb7, 0x46, 0xb5, +0x24, 0xe7, 0x85, 0xc9, 0x27, 0x64, 0x36, 0xed, 0xda, 0x7f, 0xed, 0xa9, +0xc6, 0x25, 0x16, 0x8a, 0x72, 0x56, 0x41, 0x97, 0xb6, 0x4d, 0x1a, 0x52, +0x24, 0x4f, 0xdc, 0x08, 0x22, 0xe4, 0x88, 0x81, 0x48, 0x0e, 0xb1, 0xa8, +0x20, 0x09, 0x20, 0x05, 0x15, 0xf5, 0xec, 0xee, 0xcc, 0xc8, 0x69, 0xb7, +0xeb, 0x53, 0xcf, 0xaf, 0xb6, 0xfb, 0xec, 0x35, 0xdc, 0x75, 0xee, 0x65, +0x97, 0xa1, 0xbe, 0x0b, 0xd8, 0x0c, 0xde, 0x89, 0x2a, 0x4b, 0xd0, 0xc1, +0x9a, 0x98, 0xc1, 0x4a, 0x4b, 0xed, 0xf4, 0xcc, 0x78, 0x47, 0x66, 0xb3, +0x1e, 0xe1, 0xc3, 0x2e, 0xaa, 0x38, 0x2a, 0xfa, 0x5c, 0x7d, 0x30, 0x3e, +0x2d, 0x2b, 0x39, 0x3e, 0x6e, 0xc1, 0x9c, 0xcb, 0xee, 0xb8, 0xe3, 0x8e, +0x47, 0x1f, 0x7d, 0x14, 0x57, 0x03, 0xaf, 0x81, 0x9f, 0xfb, 0xef, 0xbf, +0x7f, 0xdb, 0x2d, 0xb7, 0x4c, 0x1c, 0x3d, 0x92, 0x78, 0xb5, 0xe4, 0xea, +0xb5, 0x8b, 0xae, 0x3b, 0x66, 0x6e, 0x06, 0x97, 0xd7, 0x69, 0x48, 0xad, +0x8c, 0xe4, 0xb7, 0xde, 0x7a, 0x4b, 0x95, 0x5d, 0x52, 0xda, 0xb0, 0x94, +0x61, 0x15, 0x49, 0x00, 0xc0, 0x40, 0xdf, 0x37, 0x5c, 0x77, 0x6d, 0x7c, +0x6c, 0xfc, 0x10, 0x14, 0x74, 0xf7, 0x1b, 0x49, 0xa3, 0x1d, 0x7f, 0x8e, +0xab, 0x56, 0xa7, 0x49, 0xa3, 0x86, 0x2f, 0x3c, 0xff, 0x3c, 0x8c, 0x02, +0x26, 0xa3, 0xf3, 0x9f, 0xf0, 0xb3, 0x3b, 0x79, 0x4e, 0xf5, 0x16, 0xed, +0x02, 0xe9, 0x7a, 0x68, 0xbf, 0xde, 0xce, 0xac, 0x7a, 0x93, 0x0f, 0xbc, +0x1c, 0x7e, 0xbc, 0xe2, 0x27, 0x3f, 0xf9, 0x09, 0xaa, 0xa3, 0xb5, 0xbf, +0xa2, 0x52, 0xf4, 0x0a, 0x48, 0x30, 0xb9, 0x5e, 0x2b, 0x6c, 0x7f, 0xc5, +0x5b, 0xb7, 0xfe, 0xec, 0x67, 0x3f, 0xc3, 0x8e, 0x24, 0x4d, 0x7d, 0xc4, +0xd5, 0xc0, 0x67, 0x76, 0x6b, 0xa2, 0x0f, 0x6e, 0xb9, 0x79, 0x53, 0x7a, +0x7c, 0x4c, 0xbc, 0x33, 0xad, 0xef, 0xd2, 0xbd, 0x65, 0x2b, 0x6c, 0x9f, +0x6f, 0x3f, 0x6e, 0x21, 0xb0, 0x7f, 0xe5, 0xe5, 0x97, 0xcd, 0xe1, 0xab, +0x82, 0x0a, 0xb1, 0x33, 0x8a, 0xf5, 0xfd, 0xa9, 0x27, 0x9f, 0xe4, 0xe4, +0xa6, 0xfd, 0x26, 0x64, 0xbb, 0xef, 0x25, 0x37, 0x62, 0xf3, 0x59, 0xce, +0x19, 0x3d, 0x62, 0x84, 0x54, 0x4a, 0x8e, 0x04, 0xbb, 0x93, 0x3b, 0x60, +0x28, 0xa7, 0x1e, 0xda, 0xc5, 0xfa, 0x35, 0xd7, 0xb3, 0x2c, 0x83, 0xaf, +0x3f, 0x5e, 0x6d, 0xc7, 0xb7, 0xe1, 0x00, 0x0c, 0x3b, 0xbc, 0x02, 0x92, +0xaa, 0x14, 0x54, 0x8c, 0x58, 0x7f, 0x8f, 0x90, 0x20, 0xa4, 0x4f, 0xcf, +0x2b, 0x31, 0xad, 0x4a, 0x83, 0x1f, 0x69, 0xe7, 0xc3, 0xac, 0x00, 0x09, +0x7f, 0x22, 0x8b, 0xb2, 0x76, 0x76, 0x96, 0x23, 0x3e, 0x79, 0xc0, 0xb5, +0xc7, 0xb4, 0x58, 0xce, 0xf3, 0xfd, 0xaf, 0x2a, 0x66, 0x84, 0x53, 0x77, +0xdd, 0x29, 0x4a, 0x05, 0xc2, 0x92, 0x88, 0x4f, 0x02, 0x09, 0x95, 0x5b, +0xc3, 0x9f, 0x18, 0xf0, 0xe3, 0x8f, 0x3e, 0x6a, 0x54, 0x33, 0x27, 0xb5, +0x6e, 0x2b, 0x1a, 0x70, 0x59, 0xbe, 0xda, 0xf4, 0x6d, 0xdf, 0x74, 0x9d, +0xb1, 0x3a, 0x39, 0x21, 0x61, 0xc3, 0x4d, 0x37, 0xa1, 0x87, 0x30, 0x19, +0x29, 0xd5, 0xa1, 0x7c, 0x76, 0xc1, 0x12, 0x51, 0xaa, 0xfe, 0x38, 0xba, +0x76, 0x81, 0x5c, 0xfa, 0xe4, 0xe3, 0x8f, 0xb3, 0xce, 0x2d, 0xc6, 0x2e, +0x69, 0xba, 0x37, 0x2c, 0x74, 0x6e, 0x3b, 0x36, 0xa8, 0xca, 0x42, 0x45, +0xcf, 0x59, 0xd7, 0xa7, 0x27, 0x25, 0x6d, 0xdf, 0xb6, 0x8d, 0x0a, 0x45, +0x52, 0x46, 0x89, 0x99, 0xb0, 0x3d, 0x4b, 0x23, 0x1f, 0x3e, 0x48, 0x23, +0x1f, 0xf6, 0x6c, 0xfe, 0x7a, 0xfa, 0xd4, 0xa9, 0x9c, 0x6a, 0x99, 0x8e, +0xc4, 0xf4, 0xa1, 0x1b, 0xce, 0x34, 0x3f, 0xf0, 0xb5, 0x90, 0xf5, 0xd8, +0x0d, 0xa7, 0x78, 0xc0, 0x4d, 0x37, 0xad, 0xd5, 0x2b, 0x6b, 0x28, 0xaf, +0xb3, 0xc8, 0xc7, 0xc8, 0x54, 0xbc, 0x57, 0x86, 0x02, 0x5d, 0xd3, 0x27, +0x8e, 0xc7, 0xc9, 0x3d, 0x7a, 0xf3, 0x7d, 0x96, 0xa8, 0x80, 0x77, 0xd5, +0x6c, 0xd5, 0xa3, 0x66, 0x76, 0x8d, 0x67, 0x9e, 0x7e, 0x5a, 0x58, 0xaa, +0x28, 0x2a, 0x02, 0xb3, 0xaa, 0x4f, 0xca, 0xc1, 0x9d, 0xa1, 0xee, 0xbb, +0xa0, 0x20, 0x67, 0xdd, 0xcc, 0x94, 0xcc, 0x96, 0x45, 0x1d, 0xf7, 0xff, +0x29, 0x5c, 0x79, 0x85, 0xd1, 0x32, 0x2b, 0xca, 0x28, 0xe2, 0x4a, 0x05, +0xfb, 0xb6, 0x5b, 0x14, 0x8d, 0xcf, 0xad, 0x56, 0x8d, 0x12, 0xc5, 0x22, +0xae, 0xa8, 0x1a, 0x19, 0xe2, 0x6a, 0x90, 0xa2, 0xf3, 0x20, 0x04, 0x3e, +0x20, 0x7c, 0xe3, 0xe4, 0x1d, 0x77, 0x54, 0xcb, 0x48, 0x8f, 0x4b, 0xcb, +0x19, 0xb5, 0xfd, 0xa9, 0x96, 0x87, 0x5c, 0xde, 0xd6, 0x19, 0xb7, 0xbf, +0x93, 0x54, 0xa3, 0x7e, 0xbf, 0x6e, 0x5d, 0xd8, 0xd7, 0xcd, 0xb1, 0x18, +0x3a, 0x2a, 0x18, 0x04, 0xc1, 0xac, 0xa4, 0x78, 0x1b, 0xcf, 0x38, 0x60, +0x69, 0x89, 0xa5, 0x39, 0xa5, 0xf5, 0xf6, 0x5f, 0xc5, 0x25, 0xa6, 0x76, +0x6e, 0xdf, 0x0e, 0x94, 0x72, 0x32, 0xcb, 0x22, 0x6e, 0xbb, 0x08, 0x51, +0x27, 0xcc, 0xa0, 0x92, 0xca, 0x9c, 0xbc, 0x0e, 0x56, 0x63, 0xf4, 0xe0, +0x01, 0x31, 0xe9, 0x35, 0x27, 0xed, 0x7f, 0x31, 0xcc, 0x50, 0xa1, 0xf4, +0x8a, 0xaa, 0x82, 0x8a, 0xec, 0x26, 0x9d, 0x6a, 0xe7, 0x64, 0xd3, 0xfe, +0x47, 0x59, 0x7b, 0x54, 0x21, 0x7b, 0xe9, 0xfd, 0xa3, 0x3c, 0x71, 0xb0, +0x0e, 0x68, 0x94, 0xcd, 0x9b, 0xc8, 0xbf, 0x14, 0xbc, 0x4a, 0xd9, 0x0d, +0xc6, 0xec, 0x7b, 0x09, 0xca, 0x6e, 0x75, 0xeb, 0xb7, 0xd9, 0xed, 0x07, +0xa7, 0xc6, 0x38, 0x7e, 0xf9, 0x8b, 0x5f, 0x18, 0xb2, 0x1d, 0x54, 0x8c, +0x34, 0xf2, 0x0f, 0xc4, 0x2d, 0x7d, 0x80, 0x88, 0x7b, 0x05, 0x15, 0x9d, +0xa7, 0x5f, 0x63, 0x89, 0x8a, 0x61, 0xd7, 0xdf, 0x96, 0x98, 0x98, 0x74, +0xf9, 0xbc, 0xb9, 0x34, 0x32, 0x05, 0xa5, 0x00, 0x49, 0x44, 0xb2, 0x88, +0x45, 0x85, 0x6c, 0x2b, 0x12, 0x00, 0xb2, 0xe1, 0xa6, 0xb5, 0x2c, 0xdd, +0xf0, 0x75, 0xa7, 0xa2, 0xa8, 0x70, 0xdf, 0x6f, 0xcf, 0x6b, 0x9b, 0x4a, +0x1b, 0x27, 0x64, 0x17, 0x14, 0xd6, 0xce, 0xce, 0x7e, 0xf9, 0xa5, 0x97, +0x70, 0x95, 0x88, 0x5b, 0x40, 0x12, 0xa0, 0x95, 0x5d, 0x55, 0xb2, 0x61, +0x54, 0xb3, 0x12, 0x91, 0xac, 0xf0, 0x2b, 0x61, 0xc3, 0x4d, 0xaf, 0x55, +0x30, 0xee, 0xd0, 0x6b, 0x10, 0x77, 0xc3, 0x49, 0xab, 0xe3, 0x1c, 0x31, +0xc7, 0x8f, 0x1d, 0x95, 0x5a, 0x7d, 0x7a, 0x28, 0xab, 0x2e, 0x03, 0x70, +0x21, 0x12, 0x1a, 0xa2, 0x11, 0x41, 0x1c, 0xf5, 0xfb, 0x4d, 0x4d, 0x2d, +0xfe, 0xce, 0xfc, 0x76, 0x7b, 0x5d, 0x76, 0x43, 0x72, 0x42, 0xe2, 0xf6, +0xe2, 0x62, 0xa2, 0x0c, 0x81, 0x10, 0xa8, 0x10, 0xa5, 0x22, 0x92, 0x51, +0xc1, 0xb3, 0xb3, 0xaa, 0x2e, 0xc7, 0xc5, 0x31, 0x3c, 0x9b, 0x8e, 0x5e, +0x4b, 0xf7, 0xa6, 0x16, 0x7f, 0x1f, 0xf2, 0xc0, 0xd0, 0x84, 0xa2, 0x2a, +0xc7, 0x2b, 0x5a, 0x0d, 0x9c, 0x96, 0x9d, 0x99, 0x79, 0xe6, 0xde, 0x7b, +0x15, 0x2a, 0xf4, 0xd8, 0x3b, 0x61, 0xdf, 0x52, 0x0a, 0x52, 0xf1, 0x0d, +0x5e, 0x0f, 0x1a, 0xf0, 0xb6, 0x2d, 0x5b, 0x78, 0xae, 0xb4, 0x3a, 0xcd, +0x78, 0x3d, 0x6d, 0x6f, 0x7e, 0xc1, 0x99, 0x52, 0x7d, 0xcc, 0xb0, 0x21, +0xe6, 0xba, 0xdf, 0x4a, 0x65, 0x14, 0x37, 0x2d, 0xc0, 0xc3, 0x57, 0x5d, +0x37, 0x2b, 0x3d, 0xa3, 0x79, 0x9f, 0xfa, 0xbb, 0xbf, 0x32, 0xbf, 0xda, +0xd6, 0x03, 0xa7, 0xa4, 0x26, 0xc4, 0x3d, 0xfc, 0xd0, 0x43, 0x48, 0x74, +0x12, 0xf8, 0xa4, 0x47, 0x8c, 0x07, 0x57, 0x6a, 0x0f, 0x89, 0xd1, 0x64, +0x01, 0xc5, 0xe7, 0x43, 0xdd, 0x30, 0xd6, 0xbc, 0xe5, 0x9c, 0xad, 0xf5, +0x77, 0x5d, 0x54, 0xea, 0x42, 0x18, 0x1b, 0x55, 0x19, 0x15, 0xbd, 0x66, +0x5d, 0x9f, 0x91, 0x9c, 0xbc, 0x7b, 0x67, 0x89, 0xa0, 0x02, 0xc2, 0x35, +0x53, 0xb6, 0x01, 0x1b, 0x12, 0xe0, 0x04, 0x36, 0x36, 0xaf, 0x5f, 0xc7, +0xa3, 0x25, 0xd7, 0x2a, 0xe8, 0xb0, 0xed, 0xf5, 0x6a, 0x2d, 0xfb, 0xd4, +0xce, 0xaa, 0xfe, 0xa7, 0x3f, 0xfe, 0xd1, 0xc0, 0x28, 0x14, 0x2a, 0x44, +0x06, 0x40, 0x6f, 0xf9, 0xe0, 0x27, 0x3f, 0xe9, 0xd4, 0xa2, 0x69, 0x52, +0x9d, 0xd6, 0xad, 0xf7, 0xff, 0xd5, 0xf4, 0x52, 0xcf, 0xe7, 0x36, 0xef, +0x9c, 0x16, 0x1f, 0xfb, 0xd6, 0x9b, 0x6f, 0x22, 0xd1, 0xa1, 0xa8, 0xc0, +0x5e, 0xa2, 0xa8, 0x10, 0x9f, 0x0f, 0xa8, 0x38, 0x7d, 0x8f, 0xcb, 0x60, +0x98, 0xd7, 0xe7, 0xd2, 0x56, 0x7b, 0x7d, 0x88, 0x3b, 0xae, 0xa2, 0xc8, +0xa9, 0xca, 0xa8, 0x18, 0xb9, 0xc1, 0xb5, 0xd0, 0x93, 0x2f, 0x64, 0x2f, +0xc8, 0xde, 0xac, 0x24, 0x28, 0x95, 0xd0, 0x23, 0x94, 0xad, 0xb0, 0xa1, +0x58, 0x07, 0x1b, 0x58, 0xc9, 0xb6, 0x6d, 0x88, 0x52, 0x49, 0xb5, 0x5b, +0xe4, 0x76, 0x9b, 0x90, 0x91, 0x96, 0x7e, 0xcf, 0xdd, 0x77, 0xab, 0xab, +0xd4, 0x4e, 0x2c, 0x17, 0x8a, 0x0c, 0x80, 0x44, 0x84, 0x57, 0xa4, 0x5f, +0xd7, 0xc2, 0x84, 0x9c, 0xfc, 0xc2, 0x03, 0x7f, 0x36, 0xa3, 0xa2, 0x56, +0xa7, 0xc1, 0x69, 0x09, 0xf1, 0x4f, 0x3f, 0xf9, 0xa4, 0x8e, 0x52, 0xee, +0x18, 0xd2, 0xa9, 0x76, 0x81, 0x30, 0x25, 0x15, 0x13, 0xc5, 0x7b, 0xf9, +0xf9, 0xcf, 0x7e, 0xd6, 0xbb, 0x4b, 0xa1, 0xc3, 0x99, 0xd9, 0x61, 0x8f, +0xb5, 0x5d, 0xbb, 0x8a, 0x02, 0xc0, 0x52, 0x92, 0xaf, 0xca, 0xa8, 0x20, +0xe2, 0x28, 0xbe, 0x46, 0xfd, 0x82, 0xc6, 0x8d, 0x70, 0xc3, 0xa1, 0xdd, +0x4a, 0x4e, 0x8f, 0xb2, 0x84, 0x8a, 0xba, 0xac, 0x1f, 0x0a, 0x1e, 0x22, +0x59, 0x71, 0x1c, 0xdc, 0xb7, 0x2f, 0x39, 0x31, 0x21, 0x21, 0xa7, 0x31, +0xf0, 0x58, 0x30, 0x67, 0x8e, 0x39, 0x59, 0x54, 0x99, 0xa1, 0x24, 0x93, +0x06, 0xe3, 0xec, 0xc8, 0x41, 0xfd, 0x1d, 0x58, 0xb1, 0x76, 0xff, 0xc8, +0xfc, 0x16, 0x3b, 0x8c, 0x5f, 0x94, 0x92, 0x90, 0x70, 0xc7, 0xed, 0xb7, +0xe3, 0xac, 0x90, 0x6c, 0x0a, 0xe1, 0x15, 0x11, 0x8e, 0x0a, 0xd9, 0x53, +0xe0, 0xb4, 0x57, 0xcc, 0x9d, 0x03, 0x39, 0x4d, 0xd8, 0xfd, 0x4c, 0x28, +0x01, 0x20, 0xe4, 0x50, 0xc1, 0xe2, 0x76, 0x9b, 0xe9, 0x72, 0x9a, 0x2e, +0xba, 0xe2, 0x0a, 0xc9, 0xff, 0x14, 0x85, 0x5b, 0x79, 0xe2, 0x74, 0x2a, +0x57, 0xf0, 0x50, 0x1e, 0x3a, 0xe1, 0x03, 0xc7, 0x8f, 0x1d, 0x4b, 0x49, +0x4e, 0x66, 0x90, 0xee, 0xdd, 0xba, 0x99, 0xc9, 0x57, 0xed, 0x76, 0xd0, +0x37, 0x0a, 0x09, 0x72, 0xda, 0xbc, 0x79, 0x73, 0x39, 0x39, 0xa7, 0xeb, +0xb8, 0x2e, 0x07, 0x8c, 0xa6, 0xf7, 0x01, 0x8b, 0x8b, 0x93, 0x13, 0x9c, +0x84, 0x99, 0xe0, 0x4f, 0x14, 0x88, 0x8a, 0xea, 0x1f, 0xc9, 0xa8, 0x50, +0x0e, 0x9f, 0x4f, 0x3e, 0xfe, 0xb8, 0x67, 0xa7, 0x8e, 0xb1, 0xd5, 0xea, +0xb5, 0xdb, 0xf3, 0xc7, 0x08, 0x42, 0x05, 0xfb, 0x68, 0x05, 0xfb, 0x2b, +0x58, 0x5c, 0x42, 0x9b, 0x92, 0x6a, 0x35, 0x75, 0xc6, 0x39, 0x76, 0xef, +0xdc, 0x29, 0x2e, 0x02, 0xdd, 0x9d, 0x6c, 0x69, 0xfc, 0x31, 0xf3, 0x90, +0x07, 0xce, 0x9c, 0x69, 0xdb, 0xa2, 0xc5, 0x94, 0x09, 0x13, 0xcc, 0xd2, +0x82, 0x21, 0x02, 0x94, 0xed, 0xff, 0x9d, 0x77, 0xde, 0x19, 0x3b, 0x7c, +0x18, 0x4f, 0xda, 0x60, 0xda, 0x86, 0x91, 0x25, 0xcf, 0xea, 0x11, 0x6f, +0x63, 0x36, 0x9e, 0x72, 0x26, 0x26, 0xaf, 0x58, 0xba, 0x44, 0xcc, 0xb2, +0x6c, 0x90, 0x11, 0xe8, 0xd5, 0xd6, 0xd7, 0x50, 0xf6, 0x1d, 0xd9, 0x50, +0x8e, 0x1e, 0x39, 0xe2, 0x72, 0x6f, 0x8f, 0x59, 0x98, 0x53, 0x12, 0xfa, +0x79, 0x79, 0x55, 0x59, 0x82, 0x92, 0x2d, 0x67, 0xc0, 0xf5, 0x27, 0x62, +0x93, 0x32, 0x32, 0x52, 0x92, 0xb0, 0xfd, 0x89, 0x7b, 0x5b, 0xbc, 0x16, +0xaa, 0x82, 0x86, 0x1d, 0xc9, 0x98, 0xee, 0xbd, 0xc4, 0x4e, 0x79, 0x0d, +0xe9, 0x91, 0x9e, 0x26, 0x08, 0x6c, 0x05, 0x8d, 0x1a, 0x39, 0x62, 0x9c, +0x54, 0xa8, 0x4f, 0xab, 0xd3, 0xbc, 0xf7, 0x9c, 0x35, 0x82, 0x8d, 0xe6, +0xfb, 0xbf, 0x8a, 0x4f, 0x4c, 0xeb, 0xd7, 0xb3, 0x87, 0xa8, 0xfe, 0x32, +0x87, 0x08, 0x37, 0xcb, 0xb2, 0x02, 0xac, 0xc3, 0x2f, 0x7f, 0xfe, 0xf3, +0xb6, 0x2d, 0x9a, 0x51, 0x14, 0x62, 0x5c, 0xf1, 0x23, 0x21, 0xcf, 0x28, +0xa0, 0x3a, 0xaf, 0xa8, 0xa0, 0x1f, 0x3d, 0x22, 0x63, 0xa5, 0xf8, 0xb6, +0x65, 0x7d, 0xc9, 0x05, 0xed, 0x7f, 0xcd, 0x61, 0x80, 0x91, 0x95, 0x96, +0x72, 0xef, 0xe9, 0xd3, 0xc8, 0x51, 0x12, 0xbe, 0x11, 0xac, 0x5c, 0x50, +0x61, 0x17, 0x22, 0x09, 0xa8, 0x66, 0x3f, 0x84, 0x99, 0x14, 0xf5, 0xea, +0x31, 0x6e, 0xd8, 0x90, 0x7a, 0xd9, 0x59, 0x78, 0x30, 0x52, 0x72, 0x1b, +0x4d, 0x3b, 0x84, 0x5b, 0xf0, 0xbf, 0x19, 0x4d, 0xbb, 0xd7, 0xcd, 0xcd, +0x79, 0xe7, 0xad, 0xb7, 0x0c, 0x1a, 0x8e, 0x1d, 0x64, 0x86, 0xd3, 0x39, +0x06, 0x1f, 0xe8, 0xfa, 0x1b, 0x5d, 0xd1, 0xf5, 0x03, 0x96, 0xec, 0x08, +0x93, 0x60, 0x72, 0xfb, 0xa8, 0xa8, 0x14, 0x09, 0x4a, 0x80, 0x41, 0x26, +0x50, 0xff, 0xab, 0x0f, 0xc7, 0x3b, 0x53, 0xa9, 0x4b, 0xf0, 0xe8, 0xc3, +0x0f, 0xab, 0xca, 0x7c, 0xc1, 0x12, 0x60, 0x74, 0x39, 0x4a, 0x0c, 0xbb, +0x12, 0x48, 0xc2, 0x8d, 0xd0, 0x67, 0x56, 0x2e, 0x5d, 0xca, 0x2a, 0x55, +0x6b, 0xd5, 0x8f, 0x99, 0xd4, 0x9f, 0xb6, 0x3e, 0x29, 0x36, 0x76, 0xdb, +0xe6, 0xcd, 0x51, 0xff, 0x1d, 0x8b, 0x26, 0x5e, 0xd4, 0x47, 0x1e, 0x7e, +0x28, 0x3d, 0xd6, 0x91, 0x56, 0xb7, 0x45, 0x8b, 0x83, 0xff, 0x0c, 0x07, +0x46, 0x61, 0x9f, 0x57, 0x20, 0xd3, 0x57, 0x22, 0x2a, 0x58, 0xeb, 0x26, +0xbb, 0xfe, 0xda, 0x7f, 0xc5, 0x81, 0xf8, 0x78, 0x67, 0xc3, 0x5a, 0x79, +0x78, 0xa0, 0x95, 0x3d, 0x4a, 0x64, 0x98, 0x00, 0xb7, 0x61, 0xd9, 0xf9, +0x24, 0x84, 0x16, 0xa4, 0xe9, 0xce, 0xf2, 0x0b, 0x41, 0x56, 0x7f, 0x99, +0x77, 0xd9, 0x6c, 0x80, 0xd1, 0x74, 0xe1, 0xa1, 0xf6, 0xc5, 0xaf, 0xf1, +0x61, 0x70, 0xff, 0xa2, 0xaf, 0xbf, 0xfa, 0x2a, 0x2a, 0x3e, 0xb1, 0x02, +0xef, 0xbc, 0xfd, 0x76, 0xa3, 0x5a, 0x79, 0x89, 0xc9, 0x19, 0xae, 0x18, +0x7b, 0x1b, 0xf1, 0x0a, 0xa1, 0x71, 0x8e, 0x89, 0x57, 0xb0, 0x39, 0x96, +0x89, 0x83, 0x12, 0x09, 0xaa, 0xd2, 0x51, 0xe1, 0x02, 0xc6, 0xee, 0x2f, +0x8b, 0x96, 0xee, 0x66, 0xc2, 0xcd, 0x1a, 0x36, 0x78, 0xf1, 0x85, 0x17, +0xa4, 0x29, 0x44, 0xb0, 0x02, 0x2e, 0x14, 0x30, 0x54, 0xb3, 0x5d, 0x09, +0xb2, 0x92, 0x6a, 0x20, 0xcf, 0xff, 0xe8, 0x47, 0x8d, 0x6a, 0xe6, 0xa6, +0xb7, 0x19, 0xd8, 0xf9, 0xf0, 0xff, 0xd4, 0xec, 0x7f, 0x99, 0xab, 0xaf, +0xd7, 0x35, 0xd7, 0x70, 0x42, 0x24, 0x5b, 0x9f, 0xd8, 0x44, 0xb0, 0xc5, +0xf5, 0xea, 0xda, 0xc5, 0xe1, 0x88, 0x29, 0x58, 0x78, 0xb0, 0xe5, 0xa1, +0xb0, 0xc8, 0xac, 0x10, 0x60, 0x87, 0x10, 0x2a, 0x98, 0x2e, 0x65, 0xea, +0xfa, 0x2d, 0xde, 0xce, 0x9c, 0xdb, 0xb7, 0x6c, 0xf1, 0xce, 0xdb, 0xef, +0x04, 0xdd, 0x36, 0xaa, 0x63, 0x43, 0x02, 0x49, 0xc4, 0x59, 0x4e, 0xdc, +0x78, 0xcf, 0xce, 0x85, 0xb1, 0xb9, 0x4d, 0x3a, 0x1f, 0xfe, 0x75, 0xe1, +0xde, 0x8f, 0xe3, 0x6b, 0x36, 0x6f, 0x96, 0xdf, 0xf0, 0xa3, 0x0f, 0x3f, +0x8c, 0x70, 0x54, 0x48, 0x95, 0xb4, 0x9a, 0xfd, 0x66, 0xb5, 0xdb, 0xf2, +0x72, 0x93, 0xf9, 0x7b, 0x87, 0xdd, 0x74, 0x4f, 0xb3, 0xfd, 0x16, 0x91, +0x32, 0xa1, 0xc1, 0x1f, 0x74, 0x46, 0xa7, 0xa1, 0x82, 0xf4, 0x66, 0x82, +0x41, 0xab, 0x2e, 0xaf, 0x90, 0xc5, 0x25, 0xa9, 0xa8, 0xdf, 0xc2, 0xcd, +0x4c, 0xbb, 0x47, 0x61, 0x21, 0x11, 0xdd, 0x2a, 0xe6, 0x22, 0x40, 0x21, +0xca, 0xb2, 0x4e, 0x9e, 0x08, 0x54, 0x02, 0x8f, 0x59, 0xd3, 0xa7, 0x73, +0xd3, 0xdc, 0x6e, 0xe3, 0x5b, 0x5d, 0xff, 0x50, 0x4a, 0xe3, 0xce, 0xb9, +0x19, 0xa9, 0xaf, 0xbc, 0xf4, 0x52, 0x10, 0x6f, 0x1a, 0x5a, 0x43, 0xc9, +0xf6, 0x41, 0xa7, 0x0e, 0xd6, 0xc4, 0x59, 0xbd, 0x4e, 0x52, 0x56, 0x9d, +0xb8, 0x38, 0x67, 0x7c, 0x42, 0x4a, 0x52, 0xf5, 0x5a, 0x5d, 0xc7, 0xce, +0x29, 0x9b, 0x11, 0x59, 0xbe, 0x21, 0xa4, 0xe5, 0x02, 0xb9, 0xd0, 0xe2, +0x15, 0xb2, 0x04, 0x18, 0x3a, 0xfa, 0x2e, 0xd8, 0xc0, 0xcc, 0x47, 0x0c, +0x1a, 0x88, 0x49, 0x2a, 0x58, 0x42, 0x94, 0x01, 0x18, 0xca, 0x36, 0x25, +0x32, 0x15, 0x62, 0xe4, 0xcc, 0x69, 0x53, 0x29, 0xa0, 0x90, 0x10, 0x9f, +0x84, 0x55, 0xea, 0xea, 0x65, 0xcb, 0x22, 0x96, 0x51, 0xb0, 0x50, 0x82, +0x0a, 0x38, 0xe9, 0xe3, 0xe7, 0xce, 0x0d, 0xee, 0xd7, 0x67, 0xdc, 0xb0, +0x61, 0x1b, 0xd6, 0xae, 0x59, 0xb5, 0x6c, 0x69, 0x9f, 0x2e, 0x85, 0x29, +0xf1, 0x71, 0xce, 0xcc, 0xdc, 0xf1, 0x7b, 0x9f, 0x2d, 0x17, 0x7a, 0xad, +0x18, 0xd5, 0xc5, 0x0a, 0x15, 0x50, 0x5a, 0x69, 0x3d, 0xa8, 0xaa, 0xa3, +0x57, 0xe8, 0xab, 0xdc, 0xf5, 0xd0, 0xe7, 0xd5, 0x5a, 0xf6, 0x4d, 0x74, +0x38, 0x08, 0xbf, 0x29, 0x0f, 0x54, 0xa8, 0x17, 0x2f, 0xd8, 0x50, 0x07, +0x89, 0x4d, 0x57, 0x2e, 0x58, 0xf0, 0xf8, 0xa3, 0x8f, 0x02, 0x95, 0xd0, +0xda, 0xdd, 0x83, 0x3e, 0x5b, 0xdd, 0xa2, 0xad, 0xea, 0xcd, 0x11, 0x60, +0x7f, 0xf3, 0x86, 0x0d, 0xa9, 0x71, 0x8e, 0xd4, 0x5a, 0x05, 0x4d, 0x76, +0x9b, 0x23, 0x2c, 0x43, 0x84, 0x6f, 0xd8, 0xe7, 0x15, 0x84, 0xe8, 0x55, +0xbc, 0x6f, 0xdb, 0x72, 0xbf, 0x41, 0x88, 0xea, 0x7f, 0x55, 0x89, 0x2b, +0x88, 0xa3, 0x73, 0x21, 0xbe, 0xb9, 0x0a, 0x08, 0xbb, 0x50, 0xfe, 0xf2, +0xa0, 0xd3, 0x56, 0x48, 0x0f, 0xa8, 0x5b, 0xb4, 0x05, 0x18, 0xe2, 0xda, +0x5a, 0xb5, 0x72, 0xa5, 0xeb, 0xed, 0x4c, 0xb9, 0x2a, 0x54, 0x81, 0x61, +0x5f, 0xaf, 0xa8, 0x3a, 0xa8, 0xe8, 0xbf, 0xf2, 0x80, 0x2b, 0xb8, 0xa0, +0xa0, 0xc9, 0x1b, 0xaf, 0xbd, 0xa6, 0xa2, 0x68, 0x23, 0x59, 0x9e, 0xa9, +0x44, 0x68, 0x19, 0x80, 0x41, 0x64, 0x00, 0x4e, 0x1e, 0xb2, 0xb2, 0x7a, +0x74, 0xee, 0xe4, 0x48, 0x48, 0x19, 0xb5, 0xe9, 0x74, 0x48, 0x96, 0x4e, +0x0b, 0x39, 0x54, 0xe0, 0xd1, 0x73, 0xd6, 0x6c, 0x9a, 0x57, 0xbd, 0xda, +0xc3, 0x67, 0xcf, 0xaa, 0xcc, 0xe9, 0x48, 0x0e, 0xd1, 0xab, 0x44, 0x48, +0xc8, 0xad, 0x0d, 0xb1, 0x64, 0x02, 0x8c, 0x47, 0x1f, 0x7a, 0x08, 0xfb, +0x75, 0xcb, 0x51, 0x0b, 0x42, 0x32, 0x2c, 0x2a, 0xe4, 0x50, 0xd1, 0x73, +0xc1, 0xcd, 0xcc, 0x79, 0xe1, 0xe5, 0x97, 0xab, 0xcc, 0xe9, 0x48, 0xae, +0x27, 0x50, 0xe9, 0x90, 0x50, 0x0a, 0x98, 0x5e, 0xa1, 0x54, 0xba, 0x84, +0x51, 0xe1, 0x97, 0x18, 0xfe, 0xf6, 0xfb, 0xcc, 0x99, 0x2a, 0x55, 0x5e, +0xbb, 0xb0, 0x83, 0x0a, 0xa0, 0x8f, 0xbf, 0xa6, 0x2a, 0x48, 0x50, 0x34, +0x52, 0xa1, 0xb9, 0x4e, 0x83, 0xda, 0xb5, 0xe8, 0x47, 0x81, 0x62, 0xc7, +0xea, 0x47, 0x78, 0xe4, 0x45, 0x55, 0x40, 0x85, 0x62, 0x17, 0x7a, 0x33, +0x24, 0x62, 0x02, 0xae, 0x5e, 0xe6, 0x8a, 0x94, 0x19, 0xb7, 0x25, 0x04, +0x7b, 0xbe, 0x58, 0xa1, 0xc2, 0x68, 0x83, 0xaa, 0x3a, 0xa8, 0x18, 0xbd, +0xc3, 0x55, 0x8d, 0x6b, 0xec, 0xc8, 0x91, 0x84, 0x9f, 0x48, 0xba, 0x85, +0x42, 0x45, 0x15, 0xa1, 0x8f, 0x88, 0x9d, 0x86, 0x41, 0xc1, 0x20, 0xf2, +0x40, 0x72, 0x56, 0xfb, 0x5c, 0x7e, 0x73, 0xe8, 0x99, 0x68, 0xbd, 0xa2, +0x02, 0x1b, 0x6d, 0xd5, 0x41, 0xc5, 0xc0, 0xa5, 0x25, 0x94, 0xee, 0xbb, +0x71, 0xcd, 0x1a, 0x32, 0xa7, 0xa5, 0xea, 0x47, 0x84, 0x67, 0xc3, 0x55, +0x29, 0x10, 0x2a, 0x60, 0x48, 0x1e, 0x3c, 0x61, 0x32, 0x35, 0xd3, 0x93, +0x1b, 0xf4, 0x9b, 0x16, 0x7a, 0x65, 0x36, 0x43, 0x0b, 0x15, 0xdd, 0x26, +0xcc, 0xaf, 0x91, 0x91, 0x41, 0xd5, 0x8f, 0x68, 0x8e, 0x68, 0x95, 0xc2, +0x83, 0x9a, 0x0c, 0xc0, 0x50, 0x95, 0xde, 0xdf, 0x7b, 0xf7, 0x5d, 0x0a, +0xc2, 0x27, 0x37, 0xee, 0xd2, 0x6c, 0xdf, 0xdf, 0x43, 0x8c, 0x5d, 0xd8, +0x47, 0x05, 0xe6, 0xb6, 0x4a, 0xf7, 0x57, 0xb4, 0xee, 0x3e, 0xb0, 0x76, +0x4e, 0x0e, 0xe9, 0x72, 0xc4, 0xa5, 0x48, 0x3d, 0xf0, 0x0a, 0x70, 0x56, +0x54, 0x4d, 0xfa, 0xab, 0x9a, 0xb3, 0x12, 0x76, 0x21, 0x95, 0xde, 0xe1, +0xe7, 0x83, 0xfa, 0xf4, 0x74, 0x64, 0xd4, 0xe9, 0x74, 0x20, 0xd4, 0xfa, +0x83, 0x85, 0x16, 0x2a, 0x1a, 0x36, 0x6d, 0xdd, 0xb8, 0x6e, 0x6d, 0xc2, +0x9f, 0x08, 0xd7, 0x8b, 0x66, 0x4e, 0x57, 0x59, 0x60, 0xa8, 0x4a, 0xef, +0x33, 0xa6, 0x4c, 0x82, 0xc0, 0x26, 0xec, 0x7d, 0x2e, 0xa4, 0x78, 0xc5, +0x7f, 0xf4, 0xdd, 0x5f, 0x45, 0x07, 0x96, 0xd1, 0xb6, 0x95, 0x5e, 0x51, +0x15, 0x78, 0x45, 0x5e, 0xdd, 0x46, 0xed, 0x5a, 0x36, 0x27, 0x86, 0x11, +0x9b, 0x18, 0x56, 0x0e, 0x84, 0xd7, 0x60, 0x25, 0x1e, 0x55, 0x4d, 0x0a, +0x0b, 0xc5, 0x59, 0xa9, 0x6c, 0x24, 0x38, 0xf9, 0xbc, 0xd9, 0x33, 0xa1, +0xb0, 0x9e, 0x37, 0x3d, 0x18, 0x52, 0xa8, 0x28, 0x13, 0x49, 0x2e, 0xa8, +0x90, 0x12, 0xf4, 0xa5, 0x71, 0x50, 0x55, 0x0a, 0x15, 0xa9, 0x19, 0xd9, +0xfd, 0x7b, 0xf7, 0xa2, 0xcb, 0x06, 0xf9, 0x1e, 0x51, 0x54, 0x54, 0x4d, +0xcc, 0xe8, 0xa8, 0x98, 0x3b, 0xcb, 0x85, 0x8a, 0xe6, 0x57, 0x87, 0x5a, +0xf1, 0x59, 0x93, 0x04, 0x65, 0x8d, 0x0a, 0x24, 0x96, 0xaa, 0xc0, 0x2b, +0x12, 0x93, 0x32, 0x06, 0xf5, 0xeb, 0xcb, 0x4c, 0x14, 0x2a, 0xa2, 0x7a, +0x45, 0x55, 0xc3, 0x86, 0xa0, 0x02, 0x33, 0x14, 0xc6, 0xd9, 0x79, 0xb3, +0x67, 0xb9, 0x78, 0xc5, 0xba, 0x10, 0xe6, 0x15, 0xef, 0xbd, 0xf7, 0x1e, +0x12, 0x7b, 0x95, 0x46, 0x45, 0x4a, 0x66, 0x76, 0x87, 0x56, 0x2d, 0xa3, +0xa8, 0xa8, 0x6a, 0x48, 0x30, 0x04, 0xe1, 0x2b, 0x54, 0xcc, 0x99, 0xe1, +0x4a, 0x4a, 0x99, 0xb8, 0x3b, 0x84, 0xa2, 0xca, 0xff, 0x63, 0xc8, 0xc5, +0xf3, 0x82, 0x0a, 0xe4, 0x96, 0x4a, 0xb7, 0x41, 0xe5, 0xd5, 0x6b, 0xd2, +0xb8, 0x6e, 0x1d, 0x5d, 0x82, 0x8a, 0xf2, 0x8a, 0x2a, 0x85, 0x10, 0xdd, +0x65, 0x41, 0xdd, 0xd1, 0x41, 0xbd, 0x7b, 0x38, 0xaa, 0xd5, 0x2b, 0x3c, +0x18, 0x42, 0x36, 0x28, 0x4f, 0xa8, 0x38, 0x72, 0xe4, 0x48, 0x32, 0x15, +0xf7, 0xf8, 0x87, 0x5e, 0x81, 0xbf, 0xac, 0x8a, 0x48, 0x50, 0xf9, 0x1d, +0x7a, 0xd7, 0xc9, 0xcd, 0xa1, 0x46, 0xb2, 0xd2, 0xb6, 0xa3, 0xa8, 0xa8, +0x82, 0xa8, 0x10, 0xcb, 0xec, 0x4b, 0x2f, 0xbe, 0x58, 0x3b, 0x23, 0xa5, +0x41, 0xd1, 0x25, 0xcd, 0x43, 0xae, 0x15, 0xb7, 0xb6, 0xfd, 0xeb, 0xbc, +0xa2, 0x8a, 0xa2, 0xa2, 0x5d, 0xff, 0x71, 0x35, 0xb3, 0xaa, 0xbf, 0xf8, +0xe2, 0x8b, 0xd1, 0x9a, 0x96, 0x55, 0x0a, 0x0c, 0x6a, 0x32, 0x7a, 0x35, +0xeb, 0x53, 0x77, 0xdd, 0x05, 0x75, 0x15, 0x2d, 0xdb, 0x55, 0x6d, 0x87, +0x45, 0x33, 0x90, 0x2a, 0x6c, 0x95, 0x2a, 0x63, 0x99, 0x55, 0xa8, 0xa0, +0x42, 0x9f, 0x05, 0x2a, 0xaa, 0x82, 0x04, 0xd5, 0x6d, 0xdc, 0xfc, 0xec, +0x8c, 0x8c, 0xfb, 0xef, 0xbb, 0x4f, 0x79, 0xf1, 0xa2, 0x11, 0x1f, 0x55, +0x07, 0x1e, 0xe2, 0xd8, 0x16, 0x46, 0x81, 0xaa, 0xbd, 0x7c, 0xf1, 0x22, +0x50, 0x31, 0xbe, 0xf8, 0xe1, 0x2a, 0x0c, 0x00, 0x73, 0xf4, 0xae, 0x8f, +0x12, 0x54, 0x55, 0x40, 0x45, 0xbf, 0xf9, 0x6b, 0xe9, 0x68, 0xb1, 0x77, +0xd7, 0x2e, 0x6c, 0x02, 0x12, 0x07, 0x15, 0x8d, 0x99, 0xad, 0x0a, 0xa8, +0x50, 0xb5, 0x51, 0xa4, 0x6e, 0x1a, 0x7e, 0xa4, 0x0f, 0x3f, 0xf8, 0xa0, +0x61, 0x6e, 0x8d, 0xe4, 0xba, 0xad, 0x3b, 0x1c, 0xf8, 0x22, 0xd4, 0x50, +0x61, 0xcd, 0x2b, 0xf0, 0x57, 0x54, 0x51, 0x5e, 0x31, 0x72, 0xe3, 0xbd, +0xd4, 0xdc, 0x9f, 0x33, 0x7b, 0x36, 0x31, 0xb3, 0x86, 0x8e, 0x16, 0xd1, +0x5c, 0xbc, 0xca, 0x82, 0x87, 0x0e, 0x09, 0x29, 0x30, 0xc7, 0x6e, 0x75, +0xeb, 0xc1, 0x83, 0x30, 0x8a, 0x76, 0xd3, 0xae, 0xc9, 0xdd, 0xf9, 0xaf, +0x28, 0x2a, 0xca, 0x37, 0xa1, 0xa4, 0x55, 0xc9, 0xa7, 0xf4, 0x0e, 0xee, +0xda, 0xa9, 0x23, 0xc6, 0x59, 0xbd, 0xa3, 0x45, 0x24, 0x97, 0xf1, 0xab, +0x2c, 0x30, 0xe8, 0x11, 0x81, 0x52, 0x76, 0x51, 0x5a, 0x81, 0x21, 0x3b, +0x7d, 0xfa, 0xbb, 0xdf, 0x75, 0x6d, 0xdf, 0x26, 0x21, 0x23, 0x6f, 0xc2, +0xae, 0xa7, 0x43, 0x0d, 0x12, 0xc6, 0x2a, 0x69, 0x5e, 0xb4, 0xed, 0xaa, +0x20, 0x41, 0xd5, 0xd8, 0xfe, 0x55, 0xa3, 0x5e, 0x63, 0xd2, 0x9c, 0x09, +0x08, 0x51, 0xaa, 0xa3, 0x85, 0xb4, 0xf7, 0xd5, 0xbb, 0x7b, 0x55, 0x3a, +0xa1, 0x44, 0xc8, 0x04, 0x84, 0x4b, 0xa8, 0x6a, 0x8b, 0xc2, 0x25, 0x88, +0xda, 0x2c, 0xde, 0xb6, 0x15, 0x96, 0xde, 0x73, 0xda, 0x52, 0xea, 0x4e, +0x84, 0x14, 0x2a, 0x7e, 0xd8, 0xd3, 0x6d, 0xda, 0xa0, 0x20, 0xc1, 0xaa, +0x80, 0x0a, 0x96, 0x78, 0xc4, 0x2d, 0x67, 0x1d, 0xb1, 0xce, 0xfc, 0x7a, +0xf5, 0x48, 0xc7, 0x13, 0x76, 0x21, 0xa5, 0x35, 0x05, 0x18, 0xd2, 0x10, +0x5e, 0x95, 0xe4, 0xb0, 0xfc, 0x10, 0x21, 0x24, 0x5b, 0xae, 0x8f, 0xa9, +0xa4, 0x26, 0x1d, 0x12, 0x52, 0xe3, 0x03, 0x5b, 0x48, 0x8d, 0xd4, 0x24, +0x67, 0x46, 0x4e, 0x08, 0x42, 0xe2, 0x82, 0xaa, 0x5d, 0xb6, 0xa2, 0xa6, +0x27, 0x1b, 0x54, 0xd5, 0x41, 0x05, 0x6d, 0xc1, 0x7a, 0x5f, 0x59, 0x0c, +0x98, 0x5b, 0x36, 0x6d, 0x4a, 0x19, 0x66, 0xe9, 0x68, 0x01, 0x30, 0xe0, +0x18, 0x08, 0xb5, 0x60, 0x03, 0x1b, 0x88, 0xc0, 0xc3, 0x7c, 0xe8, 0x95, +0x9d, 0xe4, 0xbd, 0x96, 0x2b, 0xe9, 0x84, 0xdf, 0xe0, 0x0a, 0x0c, 0x7a, +0x93, 0x4e, 0xa9, 0xe2, 0x2e, 0x5c, 0xe2, 0xd5, 0x57, 0x5e, 0x69, 0x52, +0xbf, 0x1e, 0x95, 0x67, 0x07, 0x5e, 0x77, 0x2c, 0x04, 0xb9, 0x04, 0xa8, +0x70, 0x6b, 0x83, 0xb2, 0xb0, 0xcc, 0x82, 0x0a, 0x22, 0x07, 0x2b, 0xdd, +0xb7, 0x2d, 0x0b, 0x4d, 0x03, 0xa4, 0x3e, 0x57, 0xb8, 0x7a, 0x07, 0xb7, +0x69, 0xd9, 0xe2, 0x85, 0xe7, 0x9f, 0x17, 0x60, 0xf0, 0x56, 0x30, 0x7d, +0xf0, 0x7a, 0x78, 0x49, 0x02, 0x0f, 0x39, 0xa4, 0x24, 0xa6, 0x1c, 0xd2, +0x2c, 0x4f, 0x61, 0xc6, 0xdc, 0x3c, 0x32, 0xfc, 0xe8, 0x38, 0x58, 0x4f, +0xa4, 0xb8, 0xae, 0x8e, 0x07, 0x29, 0xc2, 0x2b, 0xad, 0x70, 0x48, 0xd8, +0x7c, 0xe0, 0x81, 0x07, 0x9a, 0x36, 0x68, 0xe0, 0xca, 0x4a, 0x5d, 0xb0, +0x91, 0x52, 0xd9, 0x21, 0x8b, 0x0a, 0xdb, 0xfe, 0x8a, 0x2a, 0x85, 0x0a, +0x17, 0x30, 0x76, 0x7d, 0xe1, 0x4a, 0x08, 0x76, 0xc4, 0x14, 0xb6, 0x6f, +0x47, 0x26, 0x24, 0xc1, 0x82, 0x18, 0xce, 0xd8, 0xab, 0x08, 0xa4, 0xe5, +0x0d, 0xc1, 0x3a, 0xe0, 0xe6, 0xbc, 0x2d, 0xc1, 0x89, 0x1c, 0x48, 0x59, +0x1c, 0xbc, 0x45, 0x05, 0x1b, 0x83, 0xc4, 0x15, 0x2c, 0x02, 0x0a, 0xbf, +0x71, 0x74, 0x79, 0x49, 0xef, 0x6e, 0xce, 0x22, 0x0b, 0x8b, 0xc0, 0xa9, +0xba, 0x79, 0xe3, 0xc6, 0xac, 0x8c, 0x74, 0x6a, 0x40, 0xf5, 0x9e, 0xbf, +0x31, 0xc4, 0xeb, 0xcc, 0x86, 0x2c, 0x2a, 0x5c, 0x85, 0xfb, 0x77, 0xfd, +0xb5, 0xd7, 0xfc, 0xf5, 0x8e, 0x98, 0xd8, 0x4e, 0x6d, 0xdb, 0x3c, 0xf9, +0xe4, 0x93, 0x78, 0x30, 0xc0, 0x06, 0x85, 0x3f, 0x80, 0x07, 0xfb, 0x16, +0xaf, 0x0a, 0x06, 0x02, 0x48, 0xe4, 0xa0, 0x1a, 0x88, 0xa0, 0x45, 0x01, +0x06, 0x84, 0x98, 0xbb, 0x77, 0x87, 0x1f, 0x41, 0x07, 0xfe, 0x44, 0xba, +0xe1, 0x55, 0x9a, 0x7b, 0xb0, 0xc5, 0x08, 0x1e, 0x58, 0x61, 0xbc, 0x46, +0x3f, 0x7e, 0xe5, 0x95, 0xc9, 0xe3, 0xc7, 0xc5, 0x50, 0x86, 0x39, 0xa7, +0xfe, 0xc0, 0xd5, 0xb7, 0x85, 0x26, 0x97, 0x40, 0x06, 0xf9, 0x41, 0xa9, +0x28, 0xab, 0x57, 0xbc, 0xfb, 0xee, 0xbb, 0xf4, 0x9b, 0x26, 0xa6, 0xab, +0xaa, 0x4b, 0x50, 0x8a, 0x35, 0xc3, 0x31, 0x7a, 0xcd, 0x5b, 0x07, 0xcb, +0xae, 0x5f, 0x33, 0x6f, 0xf2, 0x84, 0x09, 0xeb, 0xd6, 0xae, 0xdd, 0xb4, +0x7e, 0xfd, 0xf1, 0xdb, 0x6e, 0xc3, 0x6e, 0x0b, 0x73, 0x63, 0x03, 0x03, +0x27, 0x1c, 0x28, 0xe5, 0xa0, 0x45, 0x00, 0xc3, 0x5b, 0x04, 0x33, 0x4a, +0xe2, 0x32, 0xab, 0xe9, 0x81, 0x93, 0x51, 0x98, 0x8d, 0x60, 0x2e, 0x9b, +0xc9, 0x16, 0xc3, 0xa6, 0xc3, 0x62, 0xb2, 0xb6, 0x74, 0x94, 0x2d, 0xb8, +0x20, 0x35, 0x15, 0x8e, 0x98, 0x51, 0xb0, 0xe7, 0x6f, 0x21, 0x28, 0x35, +0x19, 0x7c, 0x09, 0x17, 0x54, 0x0b, 0x93, 0x0d, 0xca, 0x02, 0x15, 0x3c, +0x7f, 0x55, 0x93, 0xa0, 0xd4, 0xea, 0xd3, 0x35, 0xaf, 0xd7, 0xc2, 0x2d, +0x09, 0x35, 0xea, 0xb2, 0x57, 0x25, 0xc5, 0xc7, 0x53, 0x01, 0x04, 0xe7, +0x77, 0xbb, 0x16, 0x2d, 0xb0, 0x84, 0x10, 0x16, 0x0f, 0xca, 0xf9, 0x1f, +0x8d, 0x08, 0x03, 0x1a, 0x50, 0xa1, 0xa4, 0x15, 0xee, 0x3f, 0x0e, 0x18, +0x0b, 0x98, 0x01, 0xfd, 0xb0, 0x11, 0x61, 0x1a, 0x51, 0x69, 0xca, 0x12, +0xcc, 0xe6, 0x7a, 0x36, 0x82, 0x87, 0x0f, 0x3e, 0xf8, 0x60, 0xe3, 0xba, +0x9b, 0x0a, 0xdb, 0xb4, 0xa6, 0x48, 0x7b, 0x8c, 0x33, 0xb3, 0xf7, 0x15, +0xb7, 0x84, 0x6a, 0x49, 0xd9, 0xd2, 0x22, 0xe7, 0x8a, 0x57, 0x84, 0x3e, +0x2a, 0x04, 0x1e, 0x60, 0x63, 0xd4, 0xd6, 0x87, 0x7a, 0x2d, 0x2a, 0x6e, +0x31, 0xed, 0x86, 0x1a, 0x9d, 0x46, 0xc6, 0xc5, 0x25, 0x24, 0x38, 0x1c, +0x79, 0x19, 0xe9, 0xed, 0x9b, 0x17, 0xb4, 0x29, 0x68, 0x7c, 0xe1, 0x27, +0xbf, 0x6d, 0x41, 0x7e, 0x87, 0xe6, 0x4d, 0xf3, 0x6b, 0xe7, 0xa5, 0xc5, +0xc6, 0xd0, 0x7f, 0x9b, 0x9f, 0x94, 0x18, 0x47, 0x97, 0x4e, 0x9d, 0x30, +0x64, 0x49, 0x53, 0x56, 0xb3, 0x6d, 0x37, 0xcc, 0x76, 0x7d, 0x5f, 0x1f, +0x47, 0x20, 0x21, 0x35, 0x3b, 0xe8, 0x2b, 0x7b, 0xd3, 0x8d, 0x37, 0xae, +0x5c, 0xb2, 0x78, 0xea, 0xb8, 0xb1, 0x9d, 0xdb, 0xb4, 0xac, 0x91, 0xe2, +0x4c, 0x88, 0x89, 0x8d, 0x4f, 0x48, 0x2e, 0x1c, 0x31, 0x33, 0x64, 0x45, +0x26, 0xcb, 0x20, 0xa8, 0xb0, 0xe0, 0x15, 0x3a, 0xcb, 0xce, 0x28, 0xfe, +0x06, 0x78, 0xb4, 0x2d, 0xf9, 0xed, 0x88, 0xeb, 0x8f, 0xf5, 0x9d, 0xb6, +0xa4, 0x73, 0xd1, 0x88, 0xd6, 0x5d, 0xfb, 0x16, 0xb4, 0xef, 0x5e, 0xb7, +0x69, 0x87, 0xcc, 0xba, 0x4d, 0x53, 0x72, 0x1b, 0xa6, 0xe4, 0x34, 0x4c, +0xad, 0x5d, 0x90, 0xd1, 0xb0, 0x7d, 0x66, 0xa3, 0x0e, 0xd5, 0x9a, 0x14, +0xd2, 0x35, 0x18, 0x56, 0xb9, 0x61, 0xdd, 0x3a, 0x69, 0xca, 0x2a, 0xd2, +0x94, 0x32, 0xec, 0x46, 0xb8, 0x85, 0x4a, 0x79, 0xe8, 0x24, 0xda, 0xef, +0xc8, 0xad, 0xb7, 0xc6, 0xc7, 0xc6, 0x3a, 0x62, 0x12, 0x9d, 0xe9, 0x39, +0xc9, 0xd9, 0x0d, 0x9a, 0x74, 0x1d, 0x3a, 0x64, 0xc9, 0x56, 0x5a, 0x4f, +0x85, 0xbe, 0xc8, 0xe4, 0x45, 0x82, 0x72, 0xab, 0x57, 0x54, 0x65, 0x09, +0xca, 0xfd, 0x5b, 0x39, 0xaf, 0xff, 0xc9, 0xb9, 0xed, 0xfb, 0xac, 0x1d, +0xdf, 0xd4, 0xdd, 0xf9, 0x0f, 0x36, 0xb6, 0x56, 0x7b, 0x3f, 0xa7, 0xf8, +0x69, 0xe1, 0xfe, 0x3f, 0xb5, 0xbc, 0xee, 0x3e, 0x50, 0x41, 0x59, 0x79, +0x1e, 0x50, 0xd7, 0x34, 0x44, 0x0b, 0x8f, 0x64, 0x99, 0xca, 0x10, 0xda, +0xc4, 0x96, 0x71, 0xd3, 0x1a, 0x57, 0xef, 0xe0, 0x86, 0x53, 0xd7, 0x8e, +0xd8, 0xf1, 0x54, 0x87, 0x03, 0x9f, 0xe7, 0xee, 0x0c, 0xfd, 0x56, 0xf3, +0xc6, 0x06, 0x31, 0xe2, 0xac, 0x30, 0xfa, 0x2b, 0x3c, 0xa1, 0x02, 0x41, +0x1c, 0x01, 0xbd, 0x8a, 0xf8, 0x2b, 0x82, 0xb5, 0x3f, 0x0d, 0xdd, 0xf2, +0x28, 0x4f, 0x34, 0x79, 0xec, 0x58, 0x9e, 0x0e, 0x8d, 0x1c, 0x45, 0x1c, +0x35, 0x43, 0x1c, 0x82, 0x22, 0x50, 0x49, 0x01, 0x91, 0x48, 0x63, 0x1a, +0x86, 0x00, 0x58, 0x58, 0x28, 0x4d, 0x42, 0x86, 0x0c, 0xec, 0xcf, 0x5a, +0x75, 0x3d, 0x44, 0x56, 0x5d, 0x99, 0xed, 0x26, 0x58, 0xef, 0xa2, 0x52, +0xc7, 0xd1, 0x34, 0x0a, 0x93, 0x6f, 0xdb, 0x0b, 0x2a, 0xaa, 0x8e, 0x17, +0x2f, 0x58, 0x2b, 0x88, 0x82, 0x98, 0xde, 0xbc, 0x27, 0xda, 0x45, 0x49, +0x71, 0x31, 0x8a, 0x38, 0x16, 0x05, 0x4b, 0x6c, 0x44, 0x5a, 0xe8, 0xa1, +0x52, 0x27, 0x44, 0x76, 0xc2, 0x08, 0xbb, 0x71, 0x9d, 0xcb, 0xd0, 0xd7, +0x6b, 0xfa, 0x8a, 0x60, 0xad, 0x7c, 0x15, 0x1b, 0x47, 0xe3, 0x12, 0x51, +0x54, 0xf0, 0x6e, 0x8a, 0xae, 0x3d, 0x16, 0xe7, 0x4c, 0x4d, 0x8e, 0x73, +0x4c, 0x9d, 0x30, 0xe1, 0xb1, 0x73, 0xe7, 0x04, 0x1b, 0xd8, 0xa6, 0xb0, +0xb4, 0x88, 0xb3, 0x5c, 0x69, 0xe1, 0xc2, 0x31, 0x7c, 0x55, 0x58, 0x43, +0xee, 0x7c, 0xc5, 0x28, 0xc4, 0x35, 0x01, 0xf3, 0xdc, 0xb4, 0x6e, 0x1d, +0x96, 0x89, 0xa4, 0xda, 0xcd, 0x9a, 0x87, 0x47, 0x7f, 0x54, 0xeb, 0xce, +0x7a, 0x3f, 0xc8, 0x4e, 0xbe, 0xa2, 0x22, 0xfc, 0x24, 0x28, 0x50, 0x41, +0xe9, 0xff, 0xa2, 0xeb, 0x8f, 0x27, 0xd7, 0x6c, 0x42, 0x8c, 0x67, 0x4a, +0x5c, 0x4c, 0xf3, 0x86, 0xf5, 0xa7, 0x8e, 0x1f, 0xb7, 0x7b, 0xe7, 0x4e, +0xcc, 0xb8, 0x22, 0x50, 0xb1, 0x53, 0x2a, 0x9f, 0x46, 0x24, 0x00, 0x43, +0xb7, 0x3b, 0xe1, 0x8e, 0x28, 0xea, 0xd5, 0x8b, 0x95, 0x49, 0xce, 0xaa, +0x33, 0x75, 0xf7, 0x53, 0x55, 0x6c, 0x83, 0x0f, 0x7a, 0xce, 0x82, 0x2f, +0x5e, 0x3c, 0xf2, 0x8f, 0x50, 0x46, 0xc3, 0x52, 0xaf, 0x28, 0x75, 0x7a, +0x94, 0xfc, 0x65, 0xd0, 0xf2, 0x9d, 0x4d, 0xfb, 0x4e, 0xc0, 0x4e, 0xe5, +0xc0, 0xe7, 0x11, 0xe3, 0x58, 0xb7, 0x66, 0x0d, 0x0e, 0x0d, 0x1e, 0x5c, +0x80, 0x21, 0x1c, 0x43, 0xe9, 0x18, 0x21, 0xc7, 0x01, 0xec, 0x4f, 0x58, +0x2f, 0xd2, 0x31, 0x77, 0x16, 0xd5, 0x9c, 0x62, 0xfa, 0xce, 0xbc, 0xba, +0xe5, 0xa1, 0xf0, 0xd3, 0xad, 0x75, 0x50, 0x95, 0x65, 0x14, 0x76, 0x7c, +0xdb, 0x91, 0x80, 0x0a, 0x81, 0x47, 0xf6, 0x8e, 0x7f, 0xb6, 0xd9, 0xf5, +0xd9, 0x80, 0xd5, 0xb7, 0x27, 0xd7, 0x6a, 0x82, 0x18, 0x7d, 0xed, 0xca, +0x95, 0x52, 0x1b, 0x4b, 0x01, 0x43, 0x57, 0xbe, 0xed, 0xd3, 0x59, 0x68, +0x9d, 0xa9, 0x50, 0x71, 0xf2, 0xf8, 0xf1, 0x94, 0xa4, 0xa4, 0xea, 0x1d, +0x86, 0xf5, 0xb8, 0x2d, 0x2c, 0x1a, 0xcb, 0xfb, 0xd4, 0x92, 0x58, 0x33, +0x2b, 0x59, 0x6b, 0xdb, 0x91, 0x83, 0x8a, 0x1f, 0x58, 0xc7, 0x79, 0x82, +0xdb, 0xda, 0xf5, 0x1a, 0x42, 0x5b, 0xb7, 0x55, 0x2b, 0x56, 0x50, 0xf2, +0x07, 0x60, 0x88, 0x43, 0x43, 0x72, 0xc4, 0xc3, 0x9b, 0x63, 0x28, 0x54, +0x0c, 0x1d, 0x3c, 0x18, 0xda, 0xa8, 0xde, 0x76, 0xe0, 0xc8, 0x2d, 0x0f, +0x5f, 0xe0, 0x15, 0xe1, 0x67, 0x7a, 0x12, 0x76, 0x61, 0x62, 0x14, 0x51, +0x5e, 0xe1, 0x4e, 0x56, 0xc6, 0x3c, 0xd5, 0xb6, 0xe7, 0x10, 0x57, 0xb7, +0xf9, 0xe5, 0xcb, 0x25, 0xe9, 0x4f, 0xca, 0xda, 0x86, 0x3d, 0x30, 0x94, +0x5e, 0x71, 0xfb, 0xb1, 0x63, 0x5d, 0x3b, 0x76, 0x44, 0xcf, 0x8e, 0x4b, +0x48, 0x49, 0xab, 0xdf, 0xba, 0xcf, 0xf4, 0x15, 0x61, 0xaa, 0x6d, 0xfb, +0x8b, 0x0a, 0x6c, 0x32, 0xe1, 0xad, 0x57, 0x58, 0x62, 0x83, 0xd0, 0xc3, +0x36, 0x3d, 0x06, 0xa3, 0x63, 0xac, 0x5a, 0xbe, 0x1c, 0x1d, 0x03, 0xe5, +0x3b, 0x12, 0x38, 0x86, 0x6e, 0x83, 0xc2, 0x16, 0xbf, 0x73, 0xc7, 0x8e, +0xb1, 0xc3, 0x86, 0xe4, 0xd7, 0xcc, 0x73, 0x85, 0xc4, 0x56, 0xaf, 0xdd, +0x7b, 0xfe, 0x86, 0xb0, 0x08, 0x01, 0xf4, 0xa8, 0x54, 0xb8, 0xe1, 0x15, +0x44, 0x97, 0x96, 0xd6, 0xf8, 0xe0, 0x53, 0x64, 0xa2, 0x42, 0xb2, 0x38, +0x92, 0x6b, 0x35, 0x85, 0x63, 0xac, 0x5e, 0xb5, 0x0a, 0x51, 0x4a, 0xac, +0x52, 0x66, 0x8e, 0x11, 0x66, 0x16, 0x5b, 0x83, 0xbf, 0x02, 0xb7, 0x26, +0xc6, 0xa8, 0x92, 0xed, 0xdb, 0x1b, 0xd4, 0xac, 0x89, 0x4c, 0x95, 0xda, +0xa8, 0xc3, 0x80, 0xd5, 0xc7, 0x09, 0xe3, 0x0f, 0x17, 0x93, 0x94, 0x66, +0x7a, 0x52, 0xba, 0x87, 0x1d, 0xbd, 0x02, 0x54, 0x10, 0x49, 0x4b, 0xfc, +0x69, 0x98, 0xf9, 0xb6, 0xed, 0xbc, 0xd7, 0x81, 0x1b, 0xee, 0x4f, 0xae, +0x59, 0x80, 0x75, 0x72, 0xed, 0x0d, 0xd7, 0xeb, 0x1c, 0x23, 0x8c, 0x73, +0x33, 0xf4, 0x1c, 0x23, 0x2c, 0x6f, 0xe2, 0xc8, 0x83, 0x4f, 0xd2, 0xc9, +0x61, 0xd6, 0xf4, 0xe9, 0x59, 0x69, 0xa9, 0xb1, 0x09, 0xc9, 0x7d, 0x08, +0x92, 0x0d, 0x1f, 0x60, 0x98, 0x8c, 0xbc, 0x51, 0x54, 0x78, 0xc6, 0x06, +0x69, 0xe2, 0x83, 0x37, 0x3d, 0x98, 0x94, 0x97, 0x0f, 0x30, 0x08, 0x1a, +0xfd, 0xf4, 0xd3, 0x32, 0xa2, 0x54, 0xb8, 0xd6, 0x16, 0x31, 0x07, 0x7d, +0x00, 0x0c, 0xf8, 0x24, 0xfb, 0xe3, 0x89, 0x13, 0x27, 0x9a, 0x35, 0xc9, +0x87, 0x6c, 0x7a, 0x5c, 0xb2, 0x22, 0x5c, 0x80, 0x61, 0x62, 0x17, 0x51, +0x54, 0x78, 0xe5, 0x18, 0xc4, 0xe1, 0xba, 0x80, 0x91, 0xd3, 0x00, 0x51, +0x8a, 0x20, 0x39, 0x83, 0x8e, 0x11, 0xae, 0xc0, 0xc0, 0xa0, 0xac, 0x7b, +0xf4, 0x84, 0x63, 0x00, 0x0c, 0x0c, 0x0f, 0x2f, 0xbf, 0xf8, 0x62, 0x8f, +0x6e, 0xdd, 0x5c, 0x99, 0x46, 0xc3, 0x2f, 0x6d, 0xb2, 0x2b, 0xb4, 0x4a, +0x03, 0x5a, 0xfa, 0xfe, 0x3c, 0xa1, 0x82, 0x26, 0x8c, 0x3f, 0xfd, 0xe9, +0x4f, 0x8d, 0x59, 0x47, 0xa2, 0x57, 0x44, 0xac, 0x04, 0xa5, 0xf2, 0x37, +0x06, 0x6d, 0x7c, 0x20, 0x29, 0xbb, 0x41, 0x92, 0xc3, 0xb1, 0xce, 0xc5, +0x31, 0x5c, 0xe6, 0xda, 0x48, 0xf0, 0x7c, 0x9b, 0x13, 0xf1, 0x04, 0x18, +0x1f, 0x7f, 0xf2, 0xc9, 0xb4, 0x89, 0x13, 0x5d, 0x05, 0x25, 0xba, 0xf5, +0x0f, 0x17, 0x8e, 0xa1, 0x01, 0xc6, 0x0e, 0xaf, 0x40, 0xfb, 0x8e, 0x70, +0x54, 0xb8, 0x12, 0x9b, 0xf0, 0x7f, 0xaf, 0x3f, 0x93, 0x58, 0xad, 0x4e, +0x72, 0x7c, 0xdc, 0x05, 0x51, 0xca, 0x08, 0x8c, 0x70, 0xf5, 0x63, 0xe8, +0x1c, 0x83, 0xe0, 0x17, 0xd1, 0x31, 0x00, 0xc6, 0x6f, 0x7e, 0xfb, 0x5b, +0x8c, 0x10, 0x49, 0x09, 0x09, 0xad, 0x3b, 0xf7, 0x09, 0x37, 0x60, 0x58, +0xa1, 0x02, 0x14, 0x1c, 0x3e, 0x7c, 0xf8, 0x62, 0xff, 0x8a, 0x28, 0xaf, +0xd0, 0x03, 0x43, 0x06, 0xae, 0x3b, 0xe3, 0xcc, 0xaa, 0x9b, 0x18, 0xe3, +0xb8, 0xf6, 0x82, 0x55, 0xca, 0xec, 0xf9, 0x0e, 0x33, 0x7b, 0x94, 0x38, +0xe6, 0x75, 0x8e, 0x21, 0xa5, 0x6e, 0xe0, 0x18, 0xd2, 0xd5, 0x64, 0xcd, +0xf5, 0xd7, 0x27, 0x3a, 0x1c, 0xed, 0xfb, 0x8e, 0x0c, 0xa3, 0x0c, 0xd5, +0x32, 0xdd, 0x22, 0xdd, 0xfa, 0xb6, 0x45, 0x82, 0x42, 0xba, 0x8a, 0x40, +0x1b, 0x94, 0x41, 0xeb, 0x70, 0x29, 0xdf, 0x1b, 0xee, 0x4b, 0xa9, 0xd5, +0x94, 0xa5, 0x58, 0xba, 0xf8, 0xca, 0xdf, 0xfc, 0xc6, 0x55, 0x1a, 0x9d, +0xbd, 0xd3, 0x50, 0xd5, 0x33, 0xb4, 0xa2, 0x3c, 0xbc, 0xce, 0xd6, 0x50, +0xf9, 0x46, 0xd5, 0x80, 0xe2, 0xd9, 0x31, 0xda, 0x2e, 0x5c, 0x30, 0xdf, +0xa5, 0x63, 0x8c, 0x9c, 0x11, 0x9a, 0xc0, 0x70, 0x79, 0xf1, 0x62, 0x2e, +0xfc, 0x94, 0x96, 0xf9, 0xd0, 0x08, 0xdd, 0x8b, 0x5e, 0x11, 0x45, 0x85, +0x42, 0x08, 0xaf, 0xbf, 0x7d, 0xbf, 0x51, 0x2c, 0xdd, 0x92, 0x45, 0x0b, +0xa5, 0x93, 0x06, 0x46, 0xfd, 0xf0, 0xee, 0x19, 0x60, 0x09, 0x0c, 0xb6, +0x03, 0x80, 0xf1, 0xeb, 0x5f, 0xfd, 0x6a, 0xca, 0xc4, 0x09, 0xac, 0x46, +0xb7, 0x49, 0x57, 0x86, 0x94, 0x28, 0x25, 0x4a, 0xb6, 0xeb, 0xff, 0x98, +0x0b, 0x3f, 0xa5, 0x3b, 0x60, 0x14, 0x15, 0x5e, 0x6d, 0x50, 0x96, 0x27, +0x10, 0x2b, 0xd5, 0xa1, 0xff, 0x58, 0x56, 0x6f, 0xe3, 0xfa, 0x75, 0x52, +0x2b, 0x44, 0x4a, 0x7a, 0x8a, 0x76, 0xe1, 0x75, 0xf7, 0x0d, 0xd1, 0x13, +0x74, 0x07, 0x1f, 0x0f, 0x2b, 0x55, 0x03, 0x01, 0xc6, 0x4f, 0x3f, 0xf9, +0x64, 0xc8, 0xc0, 0x01, 0x2e, 0x73, 0xed, 0xa5, 0x2b, 0x71, 0x7d, 0xfa, +0xb7, 0xa4, 0x95, 0x7a, 0x55, 0x59, 0x33, 0x94, 0x09, 0x15, 0xbf, 0xfe, +0xf5, 0xaf, 0xa3, 0x7a, 0x85, 0xad, 0xd8, 0x7d, 0x72, 0xf9, 0x93, 0xb2, +0xea, 0x66, 0x24, 0x26, 0xdc, 0x71, 0xfc, 0x38, 0x94, 0x21, 0x01, 0xe7, +0x92, 0xb8, 0x17, 0xa2, 0x44, 0x6f, 0x67, 0xda, 0x06, 0xcf, 0x37, 0xc0, +0x10, 0x8e, 0xf1, 0xee, 0xdb, 0x6f, 0x77, 0x29, 0x2c, 0x74, 0x01, 0x63, +0xc6, 0xb5, 0x94, 0x3c, 0xad, 0x54, 0x12, 0xb7, 0xf5, 0xfa, 0xf4, 0x19, +0x96, 0x61, 0x14, 0xee, 0x23, 0x3e, 0x4a, 0xb5, 0x6d, 0x3e, 0x45, 0x6d, +0x50, 0xee, 0xde, 0xf1, 0xc0, 0xb5, 0x77, 0x39, 0xe2, 0x93, 0xf2, 0xeb, +0xd7, 0x47, 0xfa, 0x14, 0xed, 0x42, 0x82, 0x6a, 0xc3, 0x52, 0xe7, 0x56, +0x98, 0xb1, 0x04, 0x06, 0x86, 0x87, 0x17, 0x5f, 0x78, 0xa1, 0x79, 0xbe, +0xcb, 0xc1, 0xd7, 0x77, 0xf9, 0x1e, 0x9c, 0x3c, 0xa1, 0x02, 0x8c, 0x0b, +0xe2, 0x93, 0x5b, 0x5e, 0xa1, 0xb4, 0xed, 0x28, 0xaf, 0xb0, 0xbb, 0xd9, +0xb4, 0xdb, 0xfd, 0x7f, 0x35, 0x07, 0xce, 0x75, 0x26, 0x26, 0x50, 0x42, +0x8f, 0x2a, 0x21, 0x6c, 0x9c, 0x11, 0xd2, 0xd3, 0xd5, 0x9c, 0xdb, 0xcd, +0xe3, 0x23, 0x49, 0x3e, 0xf8, 0xc0, 0x03, 0xb5, 0x73, 0xb2, 0x63, 0x62, +0x13, 0x07, 0xde, 0x74, 0x2a, 0x74, 0x50, 0xa1, 0xb4, 0x6d, 0x8b, 0xfe, +0x15, 0x51, 0x54, 0xd8, 0x05, 0x43, 0xa9, 0xda, 0xbd, 0xeb, 0xf3, 0x46, +0xb3, 0x8a, 0x13, 0x1c, 0x31, 0x4b, 0x17, 0x2f, 0xa6, 0x50, 0x27, 0x3a, +0x77, 0xe4, 0x74, 0xaf, 0x34, 0x78, 0xbe, 0x79, 0x76, 0x80, 0x81, 0x49, +0x6a, 0xdf, 0x9e, 0x3d, 0xa9, 0xf1, 0x71, 0x69, 0x75, 0x5b, 0x84, 0x94, +0xe6, 0x5d, 0xf6, 0xd5, 0x47, 0xf5, 0x8a, 0x40, 0xb6, 0xb4, 0xcc, 0xe2, +0x6f, 0x1a, 0x4c, 0x5d, 0x97, 0x18, 0x1b, 0x77, 0xcd, 0xca, 0x95, 0xd2, +0xbd, 0x32, 0x72, 0x50, 0x61, 0xf0, 0x63, 0x48, 0x0b, 0x0b, 0x71, 0x62, +0x2c, 0x5b, 0xbc, 0x18, 0xba, 0xea, 0x32, 0x66, 0x4e, 0xa8, 0x02, 0xc3, +0xbe, 0x0d, 0x2a, 0x32, 0x63, 0x66, 0xbd, 0x62, 0xa6, 0xee, 0xd8, 0xab, +0x93, 0xe3, 0xe3, 0x29, 0xfc, 0x2c, 0xdd, 0x2b, 0x45, 0xe1, 0x0e, 0x6f, +0xbd, 0x42, 0x57, 0xca, 0x79, 0x52, 0x69, 0x77, 0x24, 0x26, 0x29, 0x89, +0x07, 0xa1, 0x16, 0xc4, 0xc8, 0x61, 0xc3, 0x5c, 0x9a, 0xf7, 0xcc, 0xeb, +0x42, 0xd2, 0x24, 0x15, 0x45, 0x85, 0x57, 0xba, 0xf7, 0x70, 0x42, 0x7a, +0xf1, 0xbf, 0x6a, 0x8f, 0x5c, 0x96, 0x92, 0x90, 0xb0, 0x69, 0xc3, 0x06, +0x41, 0x45, 0x44, 0xf1, 0x0a, 0x3d, 0x82, 0x50, 0x15, 0x8f, 0x42, 0x8e, +0x42, 0x31, 0x7d, 0xe3, 0xf5, 0xd7, 0x5b, 0x37, 0x6f, 0x46, 0x26, 0xdf, +0x80, 0x6b, 0x8e, 0x04, 0xb2, 0xc2, 0x95, 0x73, 0xad, 0x9d, 0x38, 0xa8, +0x68, 0x74, 0xa0, 0xbb, 0x77, 0xd3, 0x68, 0xc7, 0x9f, 0x6b, 0x0d, 0xbe, +0x3c, 0xd5, 0xe9, 0xdc, 0xbe, 0x6d, 0x9b, 0x8e, 0x8a, 0x48, 0xa8, 0x91, +0x63, 0x69, 0x92, 0x92, 0x1e, 0xaa, 0xb8, 0x35, 0x01, 0xc6, 0x99, 0xd3, +0xa7, 0xab, 0xa7, 0x26, 0x27, 0x52, 0x94, 0x76, 0x77, 0xa8, 0xa5, 0x28, +0x45, 0xe3, 0xa0, 0x02, 0xd9, 0x8d, 0x5a, 0x6f, 0xff, 0x55, 0x62, 0x7a, +0x4e, 0x4e, 0x66, 0xc6, 0xe9, 0x7b, 0xee, 0x89, 0x4c, 0x5e, 0x61, 0x0e, +0x94, 0x52, 0x9d, 0x54, 0xd1, 0xbc, 0x37, 0xdc, 0x74, 0x13, 0x04, 0xd6, +0xf5, 0x92, 0x50, 0x2b, 0x3a, 0x18, 0xe5, 0x15, 0x81, 0xa0, 0xa2, 0x68, +0xc1, 0xfa, 0xc4, 0xb8, 0xb8, 0x15, 0x4b, 0x96, 0x20, 0x49, 0x47, 0xa6, +0x5e, 0x61, 0xe0, 0x18, 0xd2, 0x75, 0x1b, 0xcd, 0x1b, 0x8e, 0x81, 0x51, +0xee, 0xa3, 0x0f, 0x3f, 0x2c, 0x6c, 0xdf, 0xd6, 0xe1, 0xcc, 0x0c, 0xb1, +0xea, 0xe5, 0x51, 0xbd, 0x22, 0x00, 0x54, 0x9c, 0xef, 0x30, 0x68, 0x52, +0x72, 0x5c, 0xcc, 0x53, 0x4f, 0x3e, 0x49, 0x29, 0x4e, 0x50, 0x11, 0x69, +0x36, 0x28, 0x83, 0x2f, 0x5c, 0xd7, 0xbc, 0x01, 0x86, 0x68, 0xde, 0x04, +0xd5, 0x92, 0xc6, 0x38, 0xe0, 0xf2, 0x75, 0x01, 0xac, 0xb3, 0xcf, 0x16, +0xf3, 0x40, 0xef, 0x15, 0xe5, 0x15, 0x7e, 0xaf, 0x60, 0xfa, 0xb6, 0x6f, +0x6a, 0x36, 0xed, 0x98, 0x1e, 0x1f, 0x8b, 0xa3, 0x07, 0x54, 0x40, 0x01, +0x11, 0x8e, 0x0a, 0xa5, 0x7c, 0x4b, 0x8d, 0x5a, 0x42, 0x60, 0xd0, 0xbc, +0x09, 0x2a, 0x6d, 0xd1, 0xa4, 0x49, 0xad, 0x06, 0x4d, 0x73, 0x4b, 0x42, +0xa7, 0x00, 0xa1, 0x4d, 0x54, 0x44, 0x60, 0xe5, 0x1b, 0xaf, 0x68, 0x69, +0xb4, 0xe3, 0x4f, 0x29, 0xb9, 0x8d, 0xea, 0xe7, 0x66, 0x93, 0xe6, 0x4f, +0xf4, 0x18, 0xa6, 0xfa, 0x88, 0xf2, 0xe2, 0x79, 0xe8, 0x18, 0x86, 0xad, +0x16, 0x60, 0x88, 0x07, 0x83, 0xcd, 0x62, 0xcc, 0xf0, 0xe1, 0x31, 0x8e, +0xb8, 0xf6, 0xfb, 0xa8, 0xf2, 0x5f, 0xe1, 0xbb, 0xbe, 0x7f, 0x77, 0x8c, +0xa2, 0xc2, 0xef, 0x57, 0xd5, 0xaa, 0xf8, 0x7f, 0x93, 0xaa, 0xd7, 0xee, +0xd8, 0xba, 0xe5, 0x87, 0x1f, 0x7e, 0x48, 0xfe, 0x89, 0xf8, 0xb6, 0x25, +0x8d, 0x3b, 0x72, 0xfc, 0x15, 0x66, 0x6c, 0xe8, 0x95, 0x6a, 0xf1, 0x60, +0x60, 0x8f, 0xa2, 0x36, 0xa9, 0x33, 0x21, 0x71, 0xec, 0xa6, 0x7b, 0xfc, +0x5e, 0xea, 0x8a, 0xbe, 0xd0, 0x8d, 0x0d, 0xaa, 0x4c, 0x3d, 0xa8, 0xb0, +0xaf, 0xbe, 0xec, 0xdf, 0xa2, 0x8f, 0xbc, 0xe5, 0xc1, 0xc4, 0xb4, 0xec, +0xc1, 0x45, 0x7d, 0x3f, 0xf9, 0xe4, 0x13, 0x78, 0x29, 0xaf, 0x1f, 0x99, +0x21, 0x42, 0xe2, 0xa0, 0x3c, 0x44, 0xd7, 0xea, 0x91, 0x20, 0xa2, 0x5d, +0x1c, 0x3b, 0x72, 0x24, 0x3d, 0x29, 0x79, 0xe0, 0xa2, 0xcd, 0xfe, 0xad, +0x73, 0x25, 0x5c, 0x65, 0x87, 0x57, 0x44, 0x51, 0x61, 0x7e, 0x31, 0x28, +0x15, 0x7d, 0x57, 0x1d, 0x8e, 0x4f, 0x4a, 0xbf, 0x64, 0xd2, 0x04, 0x7a, +0x18, 0x10, 0xe6, 0x10, 0x45, 0x85, 0x6e, 0x8f, 0x92, 0x1e, 0x93, 0x62, +0xa5, 0xfd, 0xf1, 0xcb, 0x2f, 0xd7, 0x48, 0x4f, 0xef, 0x30, 0x7c, 0x66, +0x25, 0xd0, 0x77, 0xf9, 0x49, 0x50, 0x51, 0x54, 0x98, 0x5f, 0x27, 0xfe, +0xbb, 0x16, 0x97, 0xac, 0x75, 0xc4, 0xc4, 0x2d, 0x5b, 0xbc, 0x88, 0xb6, +0xc5, 0x94, 0xc3, 0x89, 0xa8, 0x98, 0x59, 0xcf, 0x99, 0x18, 0xc2, 0x2e, +0xc4, 0xdb, 0x8d, 0x54, 0x89, 0x75, 0xae, 0x56, 0xf5, 0x6a, 0x79, 0x05, +0x1d, 0xa2, 0xa8, 0x08, 0x11, 0xbd, 0xca, 0xbf, 0xbd, 0x64, 0xcb, 0x7f, +0x51, 0x2a, 0x6a, 0xb4, 0x1b, 0x84, 0xcd, 0x91, 0x8a, 0xf6, 0x38, 0x2b, +0xf0, 0x58, 0x49, 0x3a, 0x5e, 0x24, 0xe4, 0x57, 0x78, 0x4d, 0x4e, 0x52, +0xa8, 0x10, 0x4b, 0xd4, 0x67, 0xff, 0xf7, 0x7f, 0x35, 0xab, 0x67, 0xa6, +0xd5, 0x69, 0x11, 0x3e, 0xa8, 0x38, 0x7a, 0xf4, 0x68, 0x94, 0x57, 0x98, +0x5f, 0xe7, 0xa8, 0x2d, 0x0f, 0xc5, 0xa5, 0x65, 0xf7, 0xe9, 0xda, 0xf9, +0x8d, 0x37, 0xde, 0xa0, 0xad, 0x3d, 0x01, 0x0e, 0x04, 0x41, 0x21, 0x30, +0x80, 0x8a, 0x88, 0x0a, 0xf7, 0xf0, 0x60, 0x89, 0x12, 0xfb, 0x2c, 0xbc, +0xe2, 0xbd, 0x77, 0xdf, 0xcd, 0xc9, 0x48, 0xaf, 0x5d, 0x38, 0x34, 0x0c, +0x51, 0x11, 0x7e, 0xdd, 0x22, 0x03, 0x79, 0x49, 0x43, 0xd7, 0xdc, 0x8e, +0x4a, 0xb6, 0x68, 0xfe, 0xdc, 0x8f, 0x3f, 0xfe, 0x18, 0xb3, 0xac, 0xb8, +0xf0, 0x40, 0x45, 0xa4, 0xb5, 0x96, 0x74, 0x67, 0x83, 0x12, 0xe3, 0xac, +0x48, 0x50, 0xcf, 0x3d, 0xfb, 0x4c, 0x56, 0x5a, 0x5a, 0x87, 0x31, 0x0b, +0x02, 0x59, 0xf0, 0x0a, 0xbd, 0xd6, 0xab, 0xb6, 0xad, 0x78, 0x45, 0x14, +0x15, 0xfa, 0x8b, 0x19, 0xb4, 0xea, 0x00, 0x4b, 0x77, 0xcd, 0x8a, 0xe5, +0x04, 0xd8, 0x4b, 0x4b, 0x24, 0x29, 0xf3, 0x11, 0x45, 0x85, 0x6e, 0x99, +0x65, 0x9b, 0x80, 0x85, 0xde, 0x79, 0xf2, 0x64, 0x46, 0x72, 0xf2, 0x80, +0xf9, 0x37, 0x55, 0x28, 0x65, 0xfb, 0x2b, 0x1b, 0xbb, 0x26, 0x69, 0x1f, +0x15, 0x61, 0xd9, 0x2d, 0xd2, 0xdf, 0xf7, 0x74, 0xbe, 0xff, 0xf2, 0x3d, +0x2c, 0xdd, 0xf5, 0xd7, 0x5e, 0xc3, 0xb2, 0x50, 0xfc, 0x46, 0x5c, 0x78, +0x51, 0x54, 0x98, 0x53, 0xba, 0x59, 0x99, 0xc1, 0x45, 0x45, 0xb1, 0x8e, +0xb8, 0x09, 0xc5, 0x0f, 0xf9, 0xbb, 0xda, 0x15, 0xae, 0xa3, 0xda, 0x44, +0x05, 0x2f, 0x3e, 0xca, 0x2b, 0xb4, 0x97, 0x7a, 0xbe, 0xef, 0xe2, 0xed, +0x2c, 0xdd, 0x86, 0x9b, 0xd6, 0xb2, 0x2c, 0x98, 0x65, 0x71, 0xe1, 0x45, +0x48, 0x8d, 0x0f, 0x3b, 0x9e, 0x0a, 0xd1, 0x28, 0xa4, 0xfc, 0x07, 0x71, +0x50, 0xf4, 0x52, 0xeb, 0x71, 0xc9, 0xf2, 0x66, 0xfb, 0xfe, 0x11, 0x45, +0x45, 0x85, 0xe3, 0x3b, 0x10, 0x8e, 0xe9, 0xf3, 0xb5, 0xe7, 0x7b, 0x5c, +0xbe, 0x19, 0x54, 0xdc, 0xb2, 0x69, 0xa3, 0x98, 0x65, 0xa3, 0xa8, 0x30, +0x94, 0x8a, 0x92, 0x70, 0x8f, 0xfd, 0x7b, 0xf6, 0x64, 0xa6, 0xa5, 0x24, +0x66, 0xd5, 0x0b, 0xb1, 0xee, 0x61, 0x51, 0x5e, 0xe1, 0xd7, 0x06, 0x76, +0xbe, 0x70, 0xf6, 0x3a, 0x96, 0xae, 0xa4, 0x78, 0x9b, 0x98, 0x65, 0x71, +0xe1, 0xb1, 0x35, 0x86, 0x7d, 0x95, 0x34, 0x77, 0x8c, 0xc2, 0x2c, 0x38, +0xb1, 0x20, 0x1b, 0xd6, 0xae, 0x4d, 0x4e, 0x8c, 0x8f, 0x4b, 0xca, 0x18, +0xba, 0xe1, 0x3e, 0xbf, 0x16, 0xb9, 0xf2, 0x36, 0x56, 0x0d, 0x15, 0xef, +0xbd, 0xf7, 0x1e, 0x42, 0xb2, 0xb1, 0x52, 0xbf, 0x68, 0xdb, 0x51, 0x09, +0xaa, 0xec, 0x7b, 0x3d, 0xdf, 0xf6, 0x92, 0xd5, 0x2c, 0xdd, 0xde, 0xdd, +0xbb, 0x88, 0x96, 0x35, 0xa3, 0x22, 0xa2, 0xe2, 0xa0, 0xcc, 0x90, 0x80, +0x73, 0x5e, 0xb5, 0x70, 0x61, 0x02, 0xed, 0xeb, 0xeb, 0x34, 0x1f, 0x7e, +0xcb, 0xc3, 0x4d, 0xf7, 0xfe, 0x3d, 0x0c, 0x51, 0x81, 0xc2, 0x14, 0x45, +0x85, 0x01, 0x15, 0x4d, 0xc7, 0x2f, 0x07, 0x15, 0xb7, 0x1e, 0x3c, 0x08, +0x2a, 0x3e, 0xfb, 0xec, 0x33, 0x71, 0x6c, 0x47, 0x20, 0xaf, 0x30, 0x43, +0x02, 0xef, 0xcd, 0xd4, 0x09, 0xe3, 0xd1, 0x25, 0x0a, 0x07, 0x8c, 0x09, +0x31, 0xc1, 0xc9, 0xaa, 0x2f, 0x9e, 0x5b, 0x5e, 0x11, 0x45, 0x85, 0x69, +0xab, 0x3b, 0x5f, 0x7f, 0xd8, 0x15, 0xa0, 0xe2, 0xb6, 0xa3, 0x47, 0x21, +0x02, 0x1d, 0x15, 0x61, 0x5f, 0x51, 0x53, 0x0f, 0x76, 0x32, 0x40, 0x82, +0xad, 0xe1, 0xc4, 0xf1, 0xe3, 0x8d, 0x6b, 0xe5, 0xb9, 0xaa, 0x7b, 0x8c, +0x5f, 0x10, 0xaa, 0x90, 0xb0, 0x69, 0x99, 0x8d, 0xa2, 0xc2, 0x8c, 0x8a, +0x5a, 0x03, 0xe7, 0xf0, 0xee, 0x4f, 0x9e, 0x38, 0x11, 0x99, 0xa8, 0x30, +0x37, 0xce, 0x7b, 0xed, 0xc7, 0xaf, 0x4e, 0x1e, 0x3b, 0x86, 0x06, 0xc4, +0x24, 0xb2, 0xf7, 0xbf, 0x72, 0x6b, 0xb3, 0xfd, 0x5f, 0x85, 0x98, 0xd4, +0xe4, 0xa6, 0x26, 0xb9, 0xf0, 0x0a, 0x71, 0x49, 0x95, 0x46, 0x92, 0xa3, +0x57, 0x44, 0x51, 0x61, 0xc1, 0x2b, 0x46, 0x2c, 0x12, 0x09, 0x2a, 0x02, +0x51, 0x61, 0x80, 0xc4, 0x87, 0x1f, 0x7c, 0xb0, 0xfe, 0xc6, 0x1b, 0xeb, +0xe5, 0xe5, 0xb2, 0x20, 0x39, 0x5d, 0xc7, 0x8d, 0x2c, 0x7e, 0x22, 0x94, +0x8c, 0xb0, 0x96, 0xe6, 0x47, 0x93, 0xb6, 0x6d, 0x8d, 0x0a, 0x4c, 0xf2, +0x98, 0x20, 0x75, 0x9f, 0x5f, 0x08, 0xef, 0x04, 0x3e, 0xdb, 0x61, 0xcd, +0xc6, 0x90, 0xf3, 0xcd, 0xa7, 0x5e, 0xcf, 0x6a, 0x6c, 0xdd, 0x7c, 0xb3, +0x01, 0x15, 0xe1, 0x5d, 0xa9, 0xdf, 0x5c, 0xd1, 0xe3, 0xb6, 0x63, 0xc7, +0x2e, 0xd4, 0x7d, 0x72, 0x38, 0x73, 0xf2, 0x87, 0x5c, 0x77, 0xb4, 0xf9, +0x81, 0xaf, 0xc3, 0x81, 0x30, 0xa2, 0xa8, 0xf0, 0xeb, 0x2d, 0x9e, 0x6f, +0x3f, 0x77, 0x0b, 0x4b, 0xb7, 0xfa, 0x9a, 0x55, 0x96, 0xa8, 0x08, 0x63, +0x1b, 0x94, 0x30, 0x0a, 0x09, 0x73, 0x22, 0xa0, 0xa3, 0xb0, 0x6d, 0x5b, +0xd6, 0x61, 0xe0, 0xb2, 0x3d, 0x2d, 0x0f, 0x86, 0x4e, 0x5a, 0xb6, 0xd7, +0x6d, 0xd1, 0x0a, 0x15, 0x84, 0xba, 0x19, 0x25, 0xa8, 0x28, 0xaf, 0x30, +0x80, 0xa7, 0xc3, 0x94, 0x15, 0x2c, 0x1d, 0x45, 0x97, 0x61, 0xa1, 0x11, +0x65, 0x83, 0x32, 0x24, 0xa0, 0xb6, 0x6a, 0xde, 0x2c, 0x2e, 0x35, 0xa7, +0xdb, 0xe1, 0xbf, 0xf9, 0xb5, 0xb9, 0x54, 0x9e, 0x47, 0xc2, 0x33, 0x30, +0xa2, 0xbc, 0xc2, 0xbf, 0xd7, 0xd9, 0xb2, 0x68, 0x7c, 0xa3, 0xbc, 0x1a, +0xb7, 0x1e, 0x3a, 0x64, 0xf0, 0xe2, 0x85, 0xbd, 0x0d, 0x4a, 0x18, 0x85, +0xe4, 0xd9, 0xa1, 0x70, 0xb6, 0x68, 0x92, 0x9f, 0x98, 0xd5, 0xb0, 0xf0, +0xd6, 0x28, 0x2a, 0x04, 0x49, 0x5e, 0xd9, 0x50, 0x58, 0x9f, 0xd0, 0x69, +0xf4, 0x9c, 0x6a, 0x09, 0x8e, 0x87, 0xce, 0x9e, 0x8d, 0x58, 0x54, 0x10, +0xd3, 0x41, 0x08, 0x7d, 0xd3, 0x86, 0x0d, 0x92, 0x6a, 0x35, 0x6f, 0x73, +0x30, 0xd4, 0xfc, 0x74, 0x51, 0x5e, 0x51, 0x1e, 0x00, 0xee, 0x31, 0x6d, +0x19, 0x89, 0x78, 0xf7, 0x9e, 0x3e, 0x1d, 0x69, 0x71, 0x50, 0xe4, 0x54, +0xa9, 0x0a, 0xe4, 0x94, 0x71, 0xc8, 0xaf, 0x57, 0x37, 0xa5, 0x7e, 0xbb, +0xfc, 0xbd, 0x61, 0xa1, 0x64, 0xbb, 0xf7, 0xe2, 0xb9, 0xb5, 0x41, 0xb1, +0x29, 0x46, 0x6d, 0x50, 0x3f, 0x00, 0xec, 0x7c, 0xd1, 0xbc, 0xb5, 0xe2, +0xaf, 0x88, 0xb4, 0x98, 0x59, 0x41, 0x05, 0x31, 0xf3, 0xc4, 0x08, 0xbf, +0xfd, 0xd6, 0x5b, 0x0d, 0x6b, 0xd5, 0xaa, 0xd1, 0xba, 0x4f, 0xde, 0xce, +0x7f, 0x95, 0xc7, 0xd6, 0x53, 0x69, 0x63, 0x6a, 0x84, 0x4e, 0xb1, 0x2f, +0x5e, 0xb1, 0xa0, 0x02, 0x2f, 0xc5, 0xc5, 0x2e, 0xf4, 0xe2, 0xaf, 0x40, +0xdb, 0x8e, 0xa2, 0x42, 0x8f, 0x24, 0x1f, 0x78, 0xe5, 0x56, 0xf1, 0x57, +0xa8, 0xfc, 0x0a, 0x3d, 0x92, 0x3c, 0x5c, 0x6d, 0x50, 0x4a, 0xd5, 0x96, +0xda, 0xe3, 0xaf, 0xbc, 0xfc, 0x72, 0xbd, 0xbc, 0xbc, 0xfc, 0x5e, 0x63, +0x93, 0xb6, 0x7d, 0x5f, 0x69, 0x14, 0x5c, 0x1e, 0x82, 0xba, 0x1d, 0x54, +0x10, 0xec, 0x15, 0x45, 0x85, 0xe1, 0xad, 0x0f, 0xbf, 0x90, 0xa1, 0x3a, +0xff, 0xb2, 0xd9, 0x9f, 0x7c, 0xfc, 0x71, 0xe4, 0xe4, 0xe2, 0xa9, 0x32, +0x05, 0x52, 0xd2, 0xe6, 0xb9, 0x67, 0x9f, 0xad, 0x93, 0x93, 0xdd, 0x3e, +0x84, 0x4a, 0xda, 0xd8, 0x84, 0x50, 0x14, 0x15, 0xfe, 0x6d, 0x72, 0x8d, +0x4b, 0xfe, 0x92, 0x5e, 0xaf, 0x25, 0x61, 0xa1, 0xfb, 0x76, 0xef, 0x96, +0x30, 0x63, 0xc9, 0xdb, 0x0e, 0xef, 0x1a, 0x1f, 0xca, 0x53, 0x81, 0xaa, +0x4d, 0x46, 0xd1, 0xfd, 0xf7, 0xdd, 0x47, 0x97, 0x82, 0x9e, 0xd3, 0x43, +0xad, 0x10, 0xbf, 0x57, 0x6c, 0xb8, 0xb1, 0xcc, 0x96, 0x91, 0xa0, 0xa2, +0xbc, 0xc2, 0x12, 0x39, 0xfd, 0x6f, 0x38, 0x91, 0x98, 0x5a, 0xad, 0x41, +0xcd, 0xdc, 0x5f, 0xfe, 0xe2, 0x17, 0x52, 0xe3, 0x23, 0xec, 0x2b, 0xdf, +0x28, 0x54, 0x48, 0xb3, 0xaf, 0x5d, 0x3b, 0x77, 0xa6, 0x25, 0x26, 0x0c, +0x59, 0xb1, 0xcb, 0xbf, 0x9d, 0xa5, 0xea, 0x5e, 0x65, 0xe2, 0x15, 0xc4, +0x8c, 0x1b, 0xf5, 0x8a, 0x28, 0x2a, 0x2c, 0xdf, 0x5f, 0xdb, 0x92, 0xdf, +0x65, 0x34, 0xee, 0x98, 0x1c, 0xe3, 0xf8, 0xe0, 0x83, 0x0f, 0x22, 0xa4, +0x1e, 0x94, 0x72, 0x56, 0x80, 0x0a, 0x22, 0x64, 0x97, 0x5e, 0x79, 0x25, +0xf4, 0x33, 0x6e, 0x6b, 0xe8, 0x24, 0x64, 0x7b, 0xe5, 0x12, 0x72, 0x82, +0x4d, 0x54, 0x90, 0x84, 0x69, 0xd2, 0xb6, 0xcb, 0x36, 0xee, 0xb6, 0x79, +0xbf, 0x30, 0x3a, 0x2d, 0x7f, 0xe7, 0xe7, 0xd5, 0xdb, 0xf4, 0x4f, 0x72, +0xf5, 0xaf, 0x78, 0x42, 0xd5, 0x0e, 0x8c, 0x04, 0x09, 0x0a, 0x17, 0x9e, +0xa0, 0x62, 0xec, 0xc8, 0x91, 0xd0, 0x4f, 0xc7, 0xbd, 0x7f, 0xa8, 0xba, +0xbb, 0xbe, 0x7f, 0xf4, 0x66, 0x1f, 0x15, 0xa4, 0xd7, 0x94, 0xb5, 0xcc, +0x46, 0x3a, 0x2a, 0x32, 0x8a, 0xbf, 0x69, 0x3c, 0x70, 0x46, 0x52, 0x7c, +0xfc, 0xf1, 0xdb, 0x6f, 0x83, 0xc3, 0x46, 0x42, 0x9d, 0x59, 0xc5, 0x2b, +0x5c, 0x15, 0x01, 0x3f, 0xfb, 0xac, 0x47, 0xd7, 0x2e, 0x8e, 0xe4, 0xac, +0xd6, 0xfb, 0xbe, 0x88, 0xa2, 0xe2, 0x07, 0x68, 0x6c, 0x89, 0x74, 0x54, +0x40, 0x0a, 0x3d, 0x17, 0x6c, 0x74, 0x26, 0x38, 0x89, 0xa3, 0xc6, 0x0c, +0x15, 0x09, 0x95, 0xfa, 0x41, 0x85, 0xf4, 0xf8, 0xc2, 0x2c, 0x4b, 0x97, +0xd4, 0xe6, 0x8d, 0x1a, 0x64, 0xb7, 0xec, 0xdb, 0x60, 0x77, 0x28, 0xa7, +0x52, 0x78, 0x8b, 0x24, 0x17, 0x7f, 0x85, 0xb5, 0x5e, 0x61, 0x25, 0x41, +0x55, 0xd5, 0xd0, 0x2e, 0xff, 0x98, 0xa6, 0x5f, 0x57, 0x51, 0x57, 0x33, +0xde, 0x99, 0x3a, 0x74, 0xe0, 0x00, 0xe9, 0xea, 0x12, 0xf6, 0xbd, 0x8e, +0x04, 0x15, 0x24, 0xe2, 0xf2, 0xa4, 0x0f, 0xdc, 0x7f, 0x7f, 0x4e, 0x5a, +0x72, 0xfb, 0x89, 0x4b, 0x53, 0x8b, 0xbf, 0x8b, 0xf2, 0x0a, 0xc5, 0x2b, +0xa2, 0xa8, 0xf8, 0x6f, 0xab, 0x92, 0x4f, 0x13, 0x33, 0x6a, 0x36, 0xaa, +0x53, 0x9b, 0x78, 0xf2, 0x48, 0xe8, 0x00, 0xa6, 0xa3, 0x02, 0x03, 0x14, +0xa4, 0x30, 0x68, 0xd5, 0xc1, 0x70, 0x83, 0x84, 0x4f, 0xda, 0xb6, 0x49, +0xaf, 0x88, 0xa2, 0xe2, 0xbf, 0xd9, 0xdb, 0xbf, 0xaa, 0xd6, 0xba, 0x28, +0xa7, 0x5a, 0xe6, 0xb9, 0x47, 0x1f, 0x8d, 0x84, 0x1e, 0xaa, 0x82, 0x0a, +0xc2, 0x3d, 0x30, 0x43, 0xaf, 0x5c, 0xba, 0x14, 0x54, 0x4c, 0xd8, 0xf1, +0x78, 0x24, 0xa2, 0xe2, 0xd8, 0xb1, 0x63, 0x48, 0xcc, 0x48, 0x50, 0x7e, +0xa1, 0xe2, 0x3f, 0x31, 0x5b, 0x5c, 0x3f, 0x8e, 0x8b, 0x3f, 0x61, 0x08, +0xa4, 0x1a, 0x5d, 0xc6, 0x66, 0xa5, 0xa7, 0x51, 0x4a, 0x35, 0x12, 0x7a, +0xa8, 0xaa, 0xae, 0x14, 0xff, 0xfb, 0x3f, 0xff, 0x53, 0xd4, 0xb3, 0xbb, +0x23, 0x25, 0xbb, 0xfd, 0xbe, 0x3f, 0x47, 0x51, 0xa1, 0x59, 0xa1, 0xbc, +0x0b, 0xe2, 0x80, 0xe1, 0xdf, 0xb1, 0x17, 0x7e, 0xf8, 0x70, 0x01, 0x18, +0xe1, 0x86, 0x8a, 0x1a, 0xdb, 0xbf, 0x4e, 0xae, 0xd3, 0xb2, 0x56, 0x4e, +0xf6, 0x5b, 0x6f, 0xbe, 0xa9, 0xa3, 0x22, 0x2c, 0x8b, 0xf5, 0xeb, 0xe1, +0x1e, 0x84, 0xd0, 0x27, 0x3b, 0x1c, 0xcd, 0x87, 0xce, 0xce, 0xdd, 0x19, +0x46, 0x29, 0x78, 0x56, 0x31, 0xb3, 0xd6, 0xda, 0x36, 0xbc, 0x02, 0x9b, +0x23, 0x5e, 0x2a, 0xdf, 0x79, 0xc5, 0x7f, 0xe2, 0xb6, 0x7c, 0x9f, 0xb8, +0xf5, 0xfb, 0xf8, 0xad, 0x02, 0x89, 0x30, 0x44, 0x45, 0xab, 0x1d, 0xbf, +0x4d, 0x70, 0xa6, 0xf5, 0xe9, 0xd6, 0x45, 0xba, 0xd0, 0x87, 0xb7, 0xb6, +0xad, 0xcc, 0xb2, 0xb8, 0xf0, 0x6f, 0xbc, 0xee, 0x5a, 0x36, 0xc8, 0xb1, +0x9b, 0x43, 0xad, 0x28, 0xa0, 0xcd, 0x7d, 0xd9, 0xca, 0x5f, 0x81, 0x35, +0xa5, 0x34, 0xe2, 0xc3, 0x2f, 0x54, 0xb8, 0xb8, 0x04, 0x90, 0x70, 0x6e, +0xfb, 0x2e, 0x69, 0xdb, 0x77, 0xf1, 0x5b, 0x09, 0xa8, 0x0c, 0x43, 0x48, +0xc0, 0xfa, 0x06, 0x2d, 0xdf, 0x9d, 0x98, 0xe0, 0x5c, 0xb5, 0x7c, 0xb9, +0xa0, 0x02, 0x69, 0x5b, 0xca, 0x92, 0x87, 0x5f, 0xcc, 0xac, 0x2a, 0xfd, +0x84, 0x01, 0x8a, 0x87, 0xed, 0xd6, 0xae, 0x4d, 0x7c, 0xf5, 0x7a, 0x1d, +0x0e, 0x7c, 0x1e, 0x7e, 0xfc, 0xdf, 0x9d, 0x6f, 0x3b, 0x40, 0x54, 0xb8, +0x20, 0x01, 0x7f, 0x00, 0x12, 0x29, 0xdb, 0xbf, 0x4d, 0x2e, 0xfe, 0x36, +0x7e, 0x2b, 0x96, 0xbb, 0x30, 0x44, 0x05, 0x0d, 0x23, 0x0b, 0xc7, 0x2d, +0x48, 0x8a, 0x8b, 0xa3, 0x09, 0x58, 0xd8, 0x77, 0xa1, 0xd7, 0x2b, 0x18, +0x3c, 0xfb, 0xec, 0x33, 0x6c, 0xa6, 0xad, 0xc7, 0x2c, 0xcc, 0x0d, 0xb3, +0xb4, 0x0a, 0x8f, 0x12, 0x54, 0x20, 0xa8, 0x70, 0x49, 0x4a, 0x17, 0xb8, +0xc4, 0xb7, 0x69, 0xdb, 0xbf, 0x4d, 0xdf, 0xf1, 0xaf, 0xe4, 0xed, 0xdf, +0xc6, 0x6e, 0x11, 0x5e, 0x11, 0x6e, 0xc0, 0xa0, 0x61, 0x64, 0xbd, 0x8e, +0xfd, 0x93, 0x62, 0x1d, 0xcf, 0x3f, 0xff, 0x7c, 0x78, 0x5b, 0x66, 0x55, +0x5a, 0x05, 0xfe, 0x3b, 0xbc, 0xda, 0xd7, 0xad, 0x5a, 0xe9, 0x12, 0x9f, +0x6e, 0xbe, 0xd7, 0xb1, 0xe5, 0x7c, 0xa4, 0xf3, 0x0a, 0x5e, 0xbc, 0x8d, +0x5c, 0xbc, 0x0b, 0x8c, 0x62, 0xcb, 0x77, 0xa9, 0xc5, 0xdf, 0x66, 0x94, +0xfc, 0x8b, 0xff, 0x13, 0xb7, 0x7e, 0x17, 0x13, 0xa6, 0xaa, 0x76, 0xeb, +0xe2, 0xff, 0x4d, 0xc9, 0xa9, 0x9f, 0x1a, 0xe7, 0xf8, 0xc9, 0x4f, 0x7e, +0x12, 0xc6, 0x5d, 0xe8, 0x95, 0xec, 0x24, 0x15, 0x0c, 0x7e, 0xfb, 0x9b, +0xdf, 0x34, 0xaf, 0x5f, 0x27, 0xa5, 0x56, 0xd3, 0x8e, 0x07, 0xff, 0x1a, +0x9e, 0x90, 0x28, 0xeb, 0xaf, 0xe0, 0xe5, 0x92, 0x84, 0x2c, 0x8d, 0x7b, +0x2c, 0xf4, 0x0a, 0x3b, 0xa8, 0xc0, 0x08, 0x0b, 0x67, 0x40, 0x70, 0xca, +0xd8, 0xe1, 0xfa, 0x49, 0xdd, 0xfe, 0x5d, 0x7c, 0x98, 0x32, 0x8a, 0x86, +0xdb, 0xff, 0xd8, 0x65, 0xca, 0x32, 0xb6, 0x89, 0x99, 0xd3, 0x2f, 0xa1, +0x09, 0x58, 0x18, 0xc7, 0x41, 0x89, 0xec, 0x24, 0x6e, 0x0a, 0x82, 0x02, +0xef, 0xbd, 0xe7, 0x1e, 0x9e, 0xba, 0xed, 0xa4, 0x65, 0x79, 0xbb, 0xc2, +0x2b, 0x2b, 0xd5, 0x4d, 0x45, 0x4d, 0x85, 0x8a, 0x32, 0x91, 0xe4, 0x4a, +0xdb, 0xb6, 0x81, 0x0a, 0x20, 0xf1, 0x6f, 0x98, 0x43, 0xaa, 0x0b, 0x15, +0x2e, 0x46, 0x91, 0xb0, 0xf5, 0xfb, 0x70, 0x65, 0x14, 0x23, 0x6e, 0x7e, +0x20, 0x21, 0x3d, 0xa7, 0x45, 0xe3, 0x86, 0x3f, 0x7a, 0xee, 0x39, 0x29, +0x68, 0x40, 0xbe, 0x01, 0x44, 0x13, 0x66, 0x31, 0xb3, 0xba, 0xec, 0x84, +0xe9, 0x89, 0x67, 0xec, 0xde, 0xa9, 0x43, 0x62, 0x72, 0xb5, 0xf1, 0xdb, +0x1f, 0x09, 0x5b, 0x46, 0x11, 0x54, 0x5e, 0x01, 0x24, 0x5c, 0x1a, 0x45, +0x4a, 0xf1, 0xbf, 0x50, 0x27, 0x10, 0x9f, 0xd0, 0xb6, 0xe3, 0x2e, 0xca, +0x4e, 0xe1, 0xa6, 0x51, 0x20, 0x4f, 0x0f, 0x58, 0xe6, 0x8a, 0x77, 0xa0, +0x76, 0xe0, 0x87, 0x1f, 0x7e, 0x28, 0xc5, 0xfa, 0x2b, 0x3e, 0xeb, 0x88, +0xfd, 0xfb, 0xcb, 0xbf, 0xfe, 0xf5, 0x8b, 0xcf, 0x3f, 0xe7, 0xe7, 0xaf, +0x5f, 0x7c, 0x81, 0x84, 0x23, 0x85, 0xfd, 0x82, 0x68, 0x01, 0x53, 0x3e, +0x0a, 0xe9, 0x9c, 0x7d, 0xf2, 0x8e, 0xe3, 0xc9, 0xf1, 0xf1, 0x79, 0xbd, +0xa6, 0x84, 0x7c, 0x25, 0x59, 0xdb, 0x95, 0x6f, 0x94, 0xbf, 0xc2, 0x3f, +0x09, 0x0a, 0x1f, 0x36, 0x76, 0x27, 0x94, 0xec, 0x7f, 0xa5, 0x63, 0x7a, +0x42, 0x76, 0x72, 0x31, 0x8a, 0x30, 0x54, 0xb2, 0x2f, 0xec, 0x91, 0xe7, +0x7b, 0xcf, 0x5f, 0x0f, 0x2a, 0x76, 0xed, 0xd8, 0x6e, 0xe8, 0x2c, 0x5c, +0x91, 0xfd, 0xb6, 0xef, 0xb9, 0xfb, 0xee, 0x41, 0x7d, 0xfa, 0x14, 0x75, +0x2d, 0xec, 0xd7, 0xb5, 0x70, 0xd4, 0xb0, 0x61, 0xcf, 0x3d, 0xf3, 0x8c, +0x54, 0xb9, 0x15, 0x1f, 0x62, 0x50, 0xb0, 0xa1, 0x7c, 0x14, 0x92, 0xa8, +0xdd, 0xa3, 0x4b, 0xe7, 0xf8, 0xa4, 0xf4, 0xe1, 0x37, 0x87, 0x5d, 0x9a, +0x91, 0x01, 0x24, 0x9a, 0x02, 0x1d, 0xa0, 0x5e, 0x01, 0xa3, 0xf8, 0x37, +0x76, 0xd8, 0xf4, 0xed, 0xff, 0x42, 0x82, 0x4a, 0xdc, 0xf6, 0xfd, 0x05, +0x97, 0x76, 0xf8, 0x71, 0x09, 0x71, 0xcf, 0x9f, 0xef, 0x7c, 0xa9, 0xcb, +0x8d, 0x45, 0x8d, 0x0f, 0xbd, 0xb3, 0x70, 0x45, 0xf6, 0xdb, 0x86, 0x5e, +0xa7, 0x4c, 0x98, 0xc0, 0x1c, 0x9c, 0xb5, 0x5a, 0xc4, 0xe5, 0xe4, 0xf3, +0xe1, 0xd0, 0x81, 0x03, 0x60, 0x12, 0x06, 0x22, 0xd8, 0x08, 0x0a, 0x30, +0xf4, 0xea, 0x4f, 0x87, 0x0f, 0x1e, 0x4c, 0x49, 0x72, 0x66, 0x77, 0x9d, +0x10, 0xe6, 0x8c, 0xc2, 0xbe, 0x04, 0x85, 0x84, 0xe0, 0x59, 0xaf, 0x40, +0x7c, 0x4a, 0xd8, 0xf2, 0x5d, 0x4a, 0xf1, 0xb7, 0xa8, 0xda, 0xc8, 0x4e, +0xfc, 0x1a, 0xbe, 0x90, 0x70, 0xa1, 0xa2, 0xd5, 0xf8, 0x25, 0x10, 0xe2, +0x1d, 0xc7, 0x8f, 0x5b, 0xd6, 0x83, 0x0a, 0xca, 0x3e, 0xed, 0xb9, 0x5b, +0x29, 0x55, 0x14, 0x92, 0x63, 0x1d, 0x99, 0x6d, 0x06, 0xb0, 0xce, 0x4d, +0xae, 0x38, 0xc4, 0x64, 0x76, 0x97, 0x94, 0x20, 0xe7, 0x20, 0x47, 0x89, +0x6e, 0x13, 0x94, 0xa8, 0x13, 0x55, 0xfd, 0x09, 0x8d, 0xa2, 0xa8, 0x67, +0x4f, 0x47, 0x5c, 0xf2, 0xf0, 0xe2, 0x27, 0xc3, 0x59, 0xa3, 0x30, 0x65, +0xa8, 0x0a, 0xaf, 0xa0, 0xc6, 0x8d, 0x85, 0x04, 0x05, 0x2a, 0x48, 0x21, +0x70, 0x6f, 0x99, 0x75, 0x31, 0x8a, 0x44, 0x50, 0xb1, 0xfd, 0x5b, 0x97, +0x33, 0x7b, 0xcb, 0xbf, 0x2f, 0xc8, 0x4e, 0xe1, 0x16, 0xf5, 0xa4, 0x9e, +0xc8, 0xb9, 0xf5, 0xfb, 0x06, 0x43, 0xe7, 0xb3, 0x1a, 0x27, 0x4e, 0x9c, +0xc0, 0xd1, 0x8b, 0xaa, 0xad, 0xba, 0x45, 0x96, 0x77, 0x17, 0x7a, 0xe1, +0x00, 0xef, 0xbf, 0xf7, 0x5e, 0xfd, 0x9a, 0xb9, 0xf1, 0x79, 0xcd, 0x26, +0x1c, 0x7e, 0x93, 0x59, 0x15, 0x5c, 0x75, 0x9c, 0xc9, 0x94, 0x14, 0x17, +0xa3, 0x10, 0x63, 0x29, 0x02, 0x1b, 0x41, 0x01, 0x86, 0xf2, 0xdc, 0x31, +0x2c, 0x8c, 0x82, 0x82, 0x26, 0x35, 0xba, 0x8e, 0x0f, 0x7f, 0x46, 0x61, +0xc5, 0x2b, 0x8c, 0xa8, 0xb8, 0xed, 0xb6, 0xdb, 0xc8, 0xd0, 0xf5, 0x88, +0x8a, 0x8b, 0x3e, 0x8a, 0xe4, 0x6d, 0x78, 0xb2, 0xbf, 0x0b, 0x77, 0xd9, +0xc9, 0x05, 0xf5, 0x1a, 0xdb, 0xff, 0x29, 0xbd, 0x8e, 0x08, 0x95, 0x55, +0x95, 0xfa, 0x21, 0x9d, 0xf2, 0xee, 0x8b, 0x27, 0x90, 0x60, 0xff, 0x3e, +0x73, 0xef, 0xbd, 0xdc, 0x3d, 0x7f, 0xd6, 0xb6, 0x1e, 0x77, 0xb8, 0xca, +0x93, 0x35, 0xba, 0x6c, 0x57, 0x3c, 0x35, 0x78, 0xf6, 0xec, 0x41, 0x21, +0x16, 0x60, 0xc0, 0x31, 0x02, 0xc7, 0xa7, 0x52, 0x2a, 0x7e, 0xfd, 0xab, +0x5f, 0xf5, 0xe9, 0xde, 0xcd, 0x11, 0x97, 0x32, 0xa2, 0xe4, 0xd9, 0x30, +0xde, 0xec, 0x4a, 0x1f, 0xcd, 0xa4, 0x57, 0xb8, 0x45, 0x85, 0x7b, 0x09, +0xca, 0x85, 0x0a, 0xc4, 0x27, 0xf0, 0x90, 0xb8, 0x8d, 0xf0, 0xa7, 0x70, +0x8e, 0x1b, 0x97, 0x85, 0xab, 0xb7, 0xe3, 0xcb, 0xda, 0x83, 0xe6, 0xb1, +0x74, 0x77, 0xdf, 0x75, 0x97, 0x14, 0x83, 0x42, 0xc0, 0x80, 0x1c, 0xa1, +0xc5, 0xf2, 0xeb, 0xea, 0xa2, 0x20, 0xc1, 0x2d, 0x76, 0x6d, 0x2f, 0xe6, +0xee, 0xbd, 0x6f, 0xbc, 0xaf, 0xf6, 0x5e, 0x17, 0x4f, 0x6e, 0x38, 0xfd, +0x16, 0xe7, 0x05, 0xbd, 0x02, 0x3b, 0x98, 0x02, 0x46, 0xe0, 0xec, 0x82, +0x3b, 0x4a, 0xe6, 0xdd, 0x81, 0x7d, 0xfb, 0xb8, 0x5d, 0x5e, 0xd1, 0xec, +0xd0, 0xee, 0xeb, 0x65, 0x5f, 0x78, 0xb1, 0x8f, 0x0a, 0xf7, 0x12, 0x94, +0xcb, 0x20, 0x8b, 0xb7, 0x0e, 0xa3, 0xd3, 0x05, 0x48, 0x84, 0xad, 0xe0, +0xa4, 0x1e, 0xad, 0x69, 0xc9, 0x9f, 0x84, 0x57, 0x9c, 0x3e, 0x75, 0x4a, +0x32, 0x7a, 0x21, 0x47, 0x54, 0x6d, 0x41, 0x45, 0x79, 0x28, 0x15, 0x0a, +0x12, 0x90, 0xe9, 0xd7, 0x5f, 0x7d, 0xb5, 0x68, 0xee, 0x6c, 0x47, 0x4c, +0xf2, 0xf4, 0xc3, 0x3f, 0xbe, 0x88, 0xd2, 0xa9, 0xeb, 0x53, 0x1c, 0x8e, +0x23, 0x87, 0x0f, 0x03, 0x4e, 0x32, 0xaa, 0x71, 0x9b, 0xc0, 0x2e, 0x02, +0x47, 0x85, 0x28, 0x15, 0xbf, 0xf8, 0xf9, 0xcf, 0xdb, 0x36, 0x6d, 0x12, +0x9b, 0x91, 0x37, 0x7a, 0xcf, 0x0b, 0x91, 0xf0, 0x72, 0x0d, 0xd1, 0x81, +0xd6, 0x7a, 0x85, 0x37, 0x09, 0xea, 0x62, 0x78, 0x2c, 0xa8, 0x40, 0xb5, +0x08, 0x6f, 0x75, 0x42, 0xd1, 0x44, 0xab, 0x92, 0xdf, 0xe7, 0xf4, 0x98, +0x9c, 0xe8, 0x70, 0x3c, 0xf2, 0xf0, 0xc3, 0xf0, 0x56, 0xb2, 0xb2, 0xb0, +0x5a, 0x2a, 0x42, 0x0c, 0x3a, 0x2a, 0x74, 0x48, 0x00, 0x3c, 0x8a, 0xb2, +0x35, 0xaf, 0x5f, 0x3b, 0x25, 0xbf, 0x4b, 0xeb, 0xc3, 0x17, 0x13, 0xa6, +0x73, 0xfb, 0xcf, 0xcb, 0x4a, 0x4d, 0xc2, 0xeb, 0x8c, 0x7a, 0x23, 0xec, +0x42, 0x20, 0x1a, 0x88, 0x10, 0xa5, 0x3c, 0x15, 0xbb, 0x2f, 0x64, 0xa2, +0x0e, 0x58, 0xb4, 0x25, 0x4c, 0xba, 0x7b, 0xd9, 0xd9, 0xb5, 0x03, 0xe3, +0x15, 0x2e, 0x48, 0xc4, 0xb8, 0x18, 0x05, 0x82, 0x93, 0x64, 0x17, 0x45, +0x04, 0xaf, 0x68, 0xb7, 0xe3, 0x57, 0xce, 0xbc, 0xfc, 0x5a, 0xd5, 0x32, +0x70, 0x11, 0x48, 0xa3, 0x23, 0x08, 0x11, 0x49, 0x23, 0x10, 0x2a, 0xf4, +0x6c, 0x71, 0x62, 0xdb, 0x96, 0x5e, 0x2a, 0xbf, 0xff, 0xf4, 0xd3, 0x4b, +0x26, 0x4f, 0xe6, 0xad, 0x0d, 0x5a, 0xb2, 0x5d, 0x50, 0x7a, 0xc9, 0x91, +0xd7, 0x1d, 0x09, 0xe9, 0x6d, 0xdb, 0xb6, 0xf9, 0xf9, 0xcf, 0x7e, 0x16, +0x5c, 0x54, 0x70, 0x47, 0x06, 0x1c, 0xd0, 0xa3, 0x6b, 0x42, 0x56, 0xfd, +0x96, 0x87, 0xc2, 0x31, 0xbb, 0xc8, 0x1d, 0x42, 0x02, 0x47, 0x05, 0x81, +0x4f, 0x3f, 0xe0, 0x21, 0x22, 0x20, 0x41, 0xa8, 0x6c, 0xc7, 0xe1, 0x97, +0xb2, 0x6e, 0xf3, 0xe7, 0xcc, 0xc1, 0xab, 0x2d, 0x4a, 0x05, 0x42, 0x4b, +0x80, 0x7b, 0xb3, 0x67, 0x54, 0x48, 0x1f, 0x3a, 0xd8, 0xd1, 0x92, 0xc5, +0xae, 0x72, 0x7d, 0x7d, 0xa6, 0x2d, 0x6d, 0x75, 0xeb, 0xb7, 0x40, 0xa2, +0xd6, 0x9e, 0xef, 0x5b, 0x8d, 0x98, 0x93, 0x92, 0x10, 0xbf, 0x7d, 0xeb, +0x56, 0x4c, 0x87, 0x41, 0x44, 0x85, 0xe0, 0x90, 0x4a, 0xa1, 0xad, 0x1b, +0xd7, 0x4f, 0xcb, 0x2f, 0x8c, 0xa2, 0xa2, 0x8c, 0x65, 0xd6, 0xa3, 0x04, +0x25, 0xbc, 0x22, 0xbc, 0x5d, 0x13, 0x46, 0x35, 0xa9, 0xef, 0x65, 0x37, +0x40, 0x97, 0xa3, 0x86, 0x0e, 0x25, 0xd6, 0x43, 0x4c, 0x13, 0xe5, 0x5a, +0x77, 0x59, 0x24, 0x19, 0xa9, 0xc2, 0x84, 0x42, 0xdf, 0x20, 0x2f, 0x27, +0x29, 0xbb, 0x7e, 0xf7, 0x63, 0x17, 0xbb, 0xa8, 0x74, 0x39, 0xfa, 0x55, +0x7c, 0x72, 0x46, 0xc7, 0x36, 0xad, 0x01, 0x27, 0x82, 0x1c, 0x5c, 0x8b, +0xc9, 0xe8, 0x7a, 0x85, 0xdf, 0xe2, 0x9c, 0xa0, 0x82, 0x58, 0x92, 0x11, +0x03, 0x8a, 0xe2, 0xb3, 0xea, 0x8d, 0xd9, 0xff, 0x4a, 0xb8, 0x2b, 0x15, +0xda, 0x9e, 0x1e, 0x00, 0xaf, 0x70, 0x41, 0x22, 0x2c, 0x13, 0x27, 0x3c, +0xbc, 0xfe, 0xac, 0xe2, 0x7f, 0xe4, 0x15, 0x74, 0x28, 0x68, 0xd4, 0xf0, +0xd9, 0x67, 0x9f, 0xc5, 0x53, 0x81, 0xf8, 0x24, 0x25, 0x03, 0xcb, 0x55, +0xa9, 0x50, 0x8c, 0x82, 0x1b, 0xe5, 0x64, 0xa4, 0xa6, 0xd6, 0x6a, 0xda, +0xea, 0xd0, 0xc5, 0x78, 0xd5, 0xa9, 0x87, 0x5e, 0x4e, 0x74, 0xa6, 0x4c, +0x9b, 0x38, 0x41, 0xa1, 0x02, 0x6d, 0x5b, 0x6c, 0xc4, 0x81, 0xc4, 0x29, +0x2a, 0x28, 0xf2, 0x5c, 0x5b, 0x6f, 0xde, 0x04, 0x91, 0xd4, 0x1e, 0x72, +0x45, 0xb8, 0x7b, 0x2a, 0x82, 0x83, 0x0a, 0x55, 0xa3, 0x20, 0x22, 0x04, +0x27, 0x81, 0x4a, 0x8b, 0x62, 0x57, 0x92, 0x49, 0xbf, 0x5e, 0xbd, 0x68, +0x7e, 0x85, 0x51, 0x4e, 0xd9, 0x64, 0xcb, 0x55, 0xa9, 0x50, 0xdd, 0x19, +0xe1, 0x03, 0xb9, 0xe9, 0xa9, 0x75, 0x9a, 0x75, 0xaa, 0xbe, 0x93, 0xc5, +0xff, 0x6f, 0xf5, 0x92, 0xef, 0x47, 0x6c, 0x7f, 0xd2, 0xe9, 0x4c, 0x9d, +0x33, 0x73, 0x06, 0x33, 0x09, 0xa2, 0xf8, 0xa4, 0x50, 0xc1, 0x73, 0x51, +0xce, 0xa3, 0x27, 0x95, 0x33, 0x79, 0xea, 0x85, 0xb7, 0x14, 0xec, 0x09, +0xaf, 0xae, 0x90, 0x65, 0xf4, 0x8a, 0x28, 0x2a, 0xec, 0x18, 0x22, 0xac, +0xce, 0xe9, 0xb1, 0xa8, 0x38, 0xd6, 0xe1, 0xb8, 0x6c, 0xe6, 0x4c, 0x69, +0x71, 0x24, 0xd6, 0x27, 0x65, 0x93, 0x0d, 0x4a, 0x90, 0x85, 0x41, 0xc1, +0xd0, 0x23, 0x91, 0x1e, 0x3f, 0x77, 0x2e, 0xc3, 0x99, 0xd0, 0x75, 0xe4, +0x8c, 0x8b, 0x10, 0x3d, 0xf0, 0x75, 0xe7, 0xd5, 0xa7, 0xe3, 0xe3, 0x9d, +0x23, 0x87, 0x0e, 0xc1, 0x3a, 0x0c, 0x2a, 0x94, 0xf8, 0x14, 0xa0, 0x92, +0xa3, 0xa3, 0x02, 0x79, 0xec, 0x8d, 0x37, 0xde, 0x68, 0xdd, 0xcc, 0xd5, +0x6a, 0xbe, 0xf7, 0xfc, 0x0d, 0xed, 0x76, 0x7d, 0xda, 0xb8, 0xe4, 0xcf, +0x64, 0xe7, 0x86, 0x97, 0x40, 0x55, 0x56, 0x0b, 0xb0, 0x29, 0x41, 0xa1, +0x75, 0xe1, 0xae, 0x2a, 0x1b, 0xf1, 0x11, 0x59, 0xea, 0x04, 0x44, 0xd0, +0xa0, 0xf8, 0x8f, 0x29, 0xf5, 0x5a, 0x65, 0xa4, 0xa7, 0xdd, 0x7e, 0xdb, +0x6d, 0x12, 0x3d, 0x8e, 0x9e, 0x2d, 0xd6, 0xa7, 0xf2, 0x0b, 0x95, 0x55, +0x91, 0x48, 0x7f, 0xfb, 0xf2, 0x4b, 0xf6, 0xec, 0x98, 0xd8, 0xc4, 0x49, +0x25, 0x8f, 0x09, 0x45, 0x76, 0x3e, 0xf4, 0x45, 0x76, 0x87, 0x21, 0x34, +0xad, 0xdc, 0xbe, 0x6d, 0x1b, 0xea, 0x8d, 0x4c, 0x26, 0x70, 0xf1, 0x49, +0x60, 0xa9, 0xac, 0x5e, 0x60, 0x1e, 0x6b, 0xef, 0x8f, 0x5f, 0xf9, 0x71, +0xeb, 0xa6, 0x05, 0x10, 0x40, 0xcd, 0xfe, 0x97, 0xb5, 0x99, 0xb7, 0xbd, +0xff, 0x0d, 0x27, 0x87, 0x6f, 0x3e, 0xdb, 0x62, 0xeb, 0x2f, 0x1a, 0x6c, +0xfb, 0x43, 0xda, 0xd6, 0x7f, 0x86, 0x38, 0x42, 0x4c, 0x7e, 0x67, 0x8d, +0xd0, 0x69, 0xc3, 0x80, 0xa8, 0x6c, 0xed, 0xdb, 0x76, 0x83, 0x8a, 0xf0, +0x77, 0xd8, 0xa9, 0xf7, 0xdd, 0xa0, 0xf8, 0x0f, 0x85, 0x53, 0x5c, 0xd5, +0xf2, 0x86, 0x0c, 0x18, 0x40, 0xf4, 0xb8, 0x74, 0xfd, 0x62, 0x6f, 0x16, +0x97, 0x76, 0xb9, 0xda, 0x64, 0x25, 0x0f, 0x8e, 0xf8, 0xdc, 0xe4, 0xc4, +0xc4, 0xac, 0xc2, 0xd1, 0x2d, 0x0e, 0x5e, 0xa4, 0xc2, 0xd1, 0xeb, 0xee, +0x8c, 0x4b, 0x48, 0xea, 0xdf, 0xab, 0x27, 0x59, 0xa3, 0xa0, 0x02, 0xda, +0x15, 0x3d, 0x3b, 0x28, 0xf3, 0x51, 0x41, 0x50, 0x60, 0x1e, 0x5d, 0x05, +0x46, 0xf4, 0xe2, 0x8b, 0x2f, 0x0a, 0x30, 0x62, 0xe3, 0x53, 0x12, 0xd3, +0x6a, 0x24, 0x66, 0xe4, 0xa6, 0xd4, 0x6c, 0x52, 0xaf, 0xd3, 0x60, 0x96, +0x65, 0xf0, 0x0d, 0x77, 0xd4, 0xdf, 0x26, 0xf5, 0xfa, 0x43, 0x51, 0x9c, +0x36, 0xed, 0xef, 0x76, 0x50, 0xc1, 0x26, 0x14, 0xe1, 0xa8, 0xe0, 0x95, +0x77, 0x9f, 0xb3, 0x3e, 0x26, 0x36, 0x01, 0xb2, 0x78, 0xee, 0xb9, 0xe7, +0x88, 0x93, 0xa5, 0x40, 0x96, 0x44, 0x04, 0x4a, 0xa9, 0x9b, 0xf2, 0x90, +0x9d, 0xd8, 0xb0, 0x95, 0x2b, 0x8d, 0x0d, 0x7b, 0xd2, 0xf8, 0xf1, 0xbc, +0xac, 0xd1, 0x7b, 0x5f, 0x12, 0xa0, 0xe6, 0xed, 0xfa, 0xae, 0x59, 0xff, +0x49, 0x44, 0xec, 0x3d, 0xf5, 0xc4, 0x13, 0x4c, 0x46, 0xc9, 0x72, 0xa2, +0xe1, 0x04, 0xee, 0x62, 0x37, 0xd8, 0xbe, 0xc0, 0x3f, 0xbb, 0x00, 0xc0, +0xb8, 0x6e, 0xd5, 0xd5, 0xf3, 0x67, 0xcf, 0x1e, 0x39, 0x68, 0x60, 0xff, +0x9e, 0xdd, 0x6b, 0x67, 0x65, 0xe2, 0xca, 0x4c, 0x88, 0x89, 0x8d, 0x77, +0xa6, 0x55, 0x6b, 0xd5, 0xaf, 0xcf, 0x35, 0xc7, 0xea, 0x6f, 0xfb, 0x2c, +0x04, 0x81, 0x61, 0x42, 0xb2, 0x15, 0x2a, 0x58, 0xe1, 0xd2, 0xbc, 0x6d, +0x2c, 0xb3, 0x11, 0x8e, 0x0a, 0xde, 0x74, 0xf7, 0xcb, 0x6f, 0x89, 0x49, +0x48, 0xae, 0x59, 0x23, 0x8b, 0xb0, 0x3c, 0x49, 0x33, 0xaa, 0x80, 0x28, +0x0f, 0x41, 0x85, 0x18, 0xa0, 0x30, 0xb9, 0xf6, 0xed, 0x41, 0x05, 0xcb, +0x9c, 0xae, 0x87, 0xbf, 0x14, 0x54, 0x74, 0x38, 0xf0, 0x45, 0x4a, 0xed, +0xe6, 0xed, 0x9a, 0xe6, 0x13, 0x92, 0x20, 0x10, 0x65, 0x47, 0x17, 0x46, +0x11, 0xac, 0x30, 0x72, 0xb9, 0xbb, 0x84, 0x42, 0x49, 0x23, 0x3c, 0x9e, +0x5a, 0x6a, 0xab, 0x62, 0x6c, 0x20, 0x49, 0xed, 0xcd, 0x37, 0xdf, 0x7c, +0xf8, 0xec, 0xd9, 0x4d, 0x1b, 0x36, 0x14, 0xb6, 0x6d, 0x9b, 0x18, 0xe3, +0x88, 0x75, 0xa6, 0x76, 0x99, 0xb5, 0x06, 0x99, 0x2a, 0xa4, 0x04, 0x2a, +0x2b, 0xe6, 0x66, 0xa5, 0x57, 0xd8, 0x44, 0x45, 0x44, 0x88, 0x4f, 0xf5, +0xb7, 0x7e, 0xd6, 0xfd, 0x8a, 0x2d, 0x8e, 0x84, 0xe4, 0x8c, 0xe4, 0xa4, +0x03, 0xfb, 0xf7, 0x4b, 0xbe, 0x22, 0x52, 0xa6, 0x50, 0x61, 0xf9, 0x99, +0x9e, 0x44, 0xb8, 0x57, 0xa8, 0xb8, 0x98, 0xde, 0x90, 0x9c, 0xd5, 0xf1, +0xf0, 0x3f, 0x84, 0xe6, 0x26, 0x1f, 0x78, 0x21, 0x3e, 0xa3, 0xe6, 0xb0, +0xfe, 0xfd, 0x40, 0xa9, 0x84, 0xb2, 0x0b, 0x2a, 0x82, 0xa8, 0xe1, 0x08, +0xbb, 0x50, 0x76, 0x61, 0x18, 0x23, 0xc0, 0x40, 0x54, 0x03, 0x84, 0x08, +0x90, 0x60, 0x03, 0x93, 0xc3, 0x47, 0x1f, 0x7d, 0xf4, 0xde, 0x7b, 0xef, +0xbd, 0xfa, 0xea, 0xab, 0x37, 0xde, 0xb0, 0x86, 0x2e, 0xc3, 0x90, 0x53, +0xd7, 0xd9, 0x6b, 0x90, 0x36, 0x2b, 0x04, 0x18, 0x81, 0x4b, 0x6b, 0x32, +0x42, 0x30, 0x79, 0x45, 0xf8, 0xa3, 0xa2, 0xde, 0xd6, 0xcf, 0xba, 0xcd, +0xdf, 0xe4, 0x88, 0x77, 0x56, 0xcf, 0x48, 0xdf, 0xb6, 0x65, 0xcb, 0x3b, +0xef, 0xbc, 0xf3, 0xd3, 0x9f, 0xfe, 0x54, 0x82, 0x64, 0x25, 0x4b, 0xbb, +0xfc, 0xc2, 0x01, 0x75, 0x54, 0x48, 0xc7, 0xad, 0xc1, 0x45, 0x45, 0x24, +0xde, 0xb5, 0x3c, 0x78, 0xd1, 0x7f, 0xd7, 0x74, 0xef, 0xdf, 0x53, 0x1b, +0xb4, 0x6f, 0x98, 0x97, 0xfd, 0xee, 0x3b, 0xef, 0x28, 0x54, 0x04, 0x1d, +0xa5, 0x06, 0x60, 0xf0, 0xc8, 0x88, 0x52, 0x30, 0x2e, 0x98, 0x06, 0xc6, +0x06, 0xac, 0x70, 0x44, 0x52, 0x83, 0x0d, 0x1c, 0x9a, 0x2c, 0xce, 0xa9, +0x53, 0xa7, 0x1a, 0xd6, 0xab, 0x8b, 0xde, 0xd1, 0xf3, 0xca, 0x92, 0x0a, +0x01, 0x46, 0xb0, 0x50, 0x61, 0xa2, 0x64, 0xfb, 0x12, 0x14, 0xdb, 0x43, +0x59, 0x1b, 0x54, 0x98, 0xa3, 0xc2, 0x05, 0x89, 0x79, 0x1b, 0x11, 0x0b, +0xaa, 0x57, 0xcb, 0xdc, 0xb9, 0x63, 0x07, 0x6f, 0x9d, 0x5d, 0x19, 0x22, +0x10, 0x71, 0xa5, 0x62, 0x7a, 0xce, 0xab, 0x0c, 0x07, 0x6e, 0x87, 0x37, +0x3d, 0x39, 0x39, 0xb9, 0xde, 0x1e, 0x55, 0x6f, 0xe6, 0x7c, 0x8f, 0x4b, +0x96, 0xc7, 0x38, 0x1c, 0x2b, 0x97, 0x2d, 0x15, 0xde, 0x55, 0x4e, 0xb1, +0x58, 0x3a, 0x30, 0x44, 0x94, 0x82, 0x29, 0xb1, 0x29, 0x70, 0x47, 0x76, +0x07, 0x56, 0x83, 0x6d, 0x02, 0x2b, 0x0d, 0x32, 0x15, 0xb2, 0xdc, 0xad, +0x87, 0x0e, 0x55, 0xcb, 0xcc, 0x8c, 0x4b, 0xca, 0xe8, 0xbd, 0x6c, 0x5f, +0x85, 0xb0, 0x8b, 0xf2, 0x21, 0xc2, 0x28, 0x2a, 0x2c, 0x5f, 0x1e, 0x82, +0x53, 0xd7, 0xd9, 0x6b, 0x63, 0xe3, 0x9c, 0xd5, 0xd3, 0xd2, 0xf6, 0xec, +0xde, 0xfd, 0xee, 0xbb, 0xef, 0xf2, 0xd6, 0x91, 0x19, 0xd8, 0x95, 0x0d, +0x3e, 0x0a, 0xbf, 0x43, 0x2a, 0x3c, 0x04, 0x3e, 0xa9, 0x3f, 0x49, 0x86, +0x83, 0x54, 0xec, 0x1b, 0x37, 0x6a, 0x54, 0xdd, 0xba, 0x75, 0x53, 0x8a, +0x5d, 0xfe, 0x3b, 0xf9, 0xc1, 0xa7, 0x96, 0x5c, 0xa3, 0x5e, 0x56, 0x4a, +0x12, 0xbb, 0x35, 0xb3, 0xe2, 0x9c, 0xa0, 0x58, 0x9f, 0xcc, 0x13, 0xd3, +0x81, 0xc1, 0x2d, 0x90, 0xd3, 0xc0, 0x06, 0xb7, 0x03, 0x1b, 0xdc, 0x17, +0x6c, 0xb0, 0x2c, 0xe8, 0x5a, 0xc8, 0x96, 0xd8, 0x31, 0x37, 0x6f, 0xda, +0xe4, 0x8c, 0x8d, 0x49, 0xc9, 0x6d, 0x44, 0xc0, 0x98, 0xbf, 0xc0, 0x08, +0x9c, 0x09, 0x04, 0x86, 0x16, 0x9b, 0x36, 0x28, 0x9e, 0x3c, 0x72, 0x78, +0x05, 0x90, 0xe8, 0x34, 0x65, 0x59, 0x6c, 0x6c, 0x5c, 0x5e, 0xf5, 0xcc, +0xfd, 0xfb, 0xf7, 0x03, 0x09, 0x04, 0x27, 0xe1, 0x12, 0x12, 0xf5, 0x54, +0xae, 0xd6, 0x58, 0x9d, 0x28, 0x15, 0x2a, 0xfe, 0xfc, 0x97, 0xbf, 0xf4, +0xe9, 0xd1, 0xbd, 0x45, 0x87, 0x1e, 0x3a, 0x9d, 0x15, 0xec, 0xf9, 0x32, +0x25, 0xa7, 0x41, 0x5e, 0x66, 0x1a, 0x15, 0x15, 0xca, 0xbb, 0x2b, 0x9f, +0x02, 0x86, 0xa0, 0x14, 0xa6, 0x21, 0x45, 0xd3, 0xe0, 0x1b, 0xe8, 0x3c, +0xdc, 0x5d, 0x04, 0x2a, 0x52, 0x9c, 0xd1, 0x34, 0x26, 0x8e, 0x1d, 0x13, +0x1b, 0x1b, 0x3f, 0x70, 0xe9, 0x0e, 0x7f, 0x51, 0x11, 0x18, 0x4d, 0xfb, +0xeb, 0xa2, 0x2d, 0x9d, 0xad, 0x4d, 0x5e, 0x11, 0x39, 0xa8, 0x00, 0x12, +0x6d, 0x87, 0x4c, 0x67, 0x59, 0x9a, 0x35, 0x6a, 0x74, 0xd7, 0xc9, 0x93, +0x02, 0x09, 0x36, 0x42, 0x09, 0x79, 0x52, 0x9e, 0xec, 0xf2, 0xb3, 0xc6, +0x9a, 0x51, 0x01, 0x09, 0x3e, 0xf7, 0xec, 0xb3, 0xf5, 0x72, 0x6b, 0xf4, +0xb9, 0xe4, 0x2a, 0x9d, 0xce, 0x7a, 0xcf, 0x5b, 0xc7, 0x3c, 0x17, 0xcc, +0x9d, 0x83, 0x0c, 0x03, 0x5c, 0x95, 0xf6, 0x5f, 0x4e, 0xec, 0x4b, 0x4f, +0x06, 0xe4, 0xf1, 0x51, 0xeb, 0x15, 0xdf, 0xe0, 0xd6, 0xa2, 0x6c, 0x20, +0xcb, 0xc1, 0x51, 0xcf, 0x9d, 0x3b, 0x97, 0xe4, 0x70, 0x34, 0xea, 0xd4, +0x3f, 0x7b, 0xc7, 0x45, 0x2d, 0xc8, 0x17, 0x78, 0x28, 0x9f, 0x5a, 0xe5, +0x25, 0x75, 0xda, 0x41, 0x05, 0x8c, 0x32, 0x12, 0x50, 0x51, 0xf7, 0x96, +0xdf, 0x77, 0x5f, 0xbc, 0xd3, 0x99, 0xdb, 0x90, 0x35, 0xe9, 0xde, 0xa5, +0xf3, 0x23, 0x8f, 0x3c, 0x82, 0x2e, 0x81, 0xe0, 0x24, 0x99, 0xd9, 0x22, +0x38, 0x19, 0xb8, 0x44, 0x39, 0xd1, 0x9f, 0x41, 0x82, 0x02, 0x15, 0x4b, +0x17, 0x2f, 0x66, 0x56, 0xe3, 0x37, 0xde, 0xad, 0x89, 0x4f, 0x5f, 0x26, +0xe7, 0x36, 0xac, 0x99, 0x99, 0xfe, 0xc2, 0x0b, 0x2f, 0xc0, 0xc6, 0x2b, +0x00, 0x15, 0x62, 0x13, 0x13, 0xa6, 0x21, 0xb6, 0x29, 0xc1, 0x06, 0xd3, +0xc3, 0x9d, 0x82, 0x40, 0x05, 0xd3, 0x10, 0x60, 0xa0, 0x80, 0x15, 0xf5, +0xe8, 0xea, 0xac, 0x5e, 0xb7, 0xcd, 0x2e, 0xdc, 0x17, 0x3e, 0x6d, 0xfc, +0x06, 0x48, 0xf8, 0x74, 0x6d, 0xf0, 0x4e, 0x8e, 0xa2, 0x42, 0xbd, 0xb6, +0x2e, 0x73, 0x37, 0xc6, 0x39, 0xd3, 0xf0, 0x1f, 0x4f, 0x9f, 0x3a, 0xf5, +0xf1, 0xc7, 0x1f, 0x7f, 0xfb, 0xed, 0xb7, 0x79, 0xbb, 0xec, 0x7c, 0xa2, +0x5e, 0x9b, 0xb9, 0x44, 0x79, 0x43, 0x42, 0xa8, 0x10, 0xca, 0xfb, 0xf0, +0x83, 0x0f, 0x5a, 0xe6, 0x37, 0x4c, 0xac, 0xd3, 0x5a, 0x39, 0x2b, 0x28, +0xbd, 0xd3, 0x67, 0xe1, 0x56, 0xde, 0xdd, 0x35, 0xab, 0xae, 0x86, 0x95, +0x55, 0x18, 0x2a, 0x94, 0x65, 0xcc, 0xc0, 0x37, 0x84, 0x69, 0x20, 0x50, +0x09, 0x30, 0x58, 0xb4, 0x49, 0xa3, 0x47, 0xc6, 0xa7, 0xd6, 0x18, 0xbd, +0xf5, 0x61, 0x5f, 0x50, 0x21, 0x90, 0xa8, 0x02, 0x81, 0xd8, 0x51, 0x54, +0xc8, 0x6b, 0xab, 0xbb, 0xe5, 0xf7, 0x09, 0xe9, 0xd9, 0x19, 0x69, 0xa9, +0x9b, 0x36, 0x6e, 0x7c, 0xf9, 0xe5, 0x97, 0x81, 0x04, 0xf2, 0xb1, 0x54, +0xb5, 0xa9, 0x60, 0x5d, 0xc2, 0x20, 0x41, 0xb1, 0x25, 0xff, 0xe8, 0xd9, +0x67, 0xd3, 0x09, 0x40, 0x1a, 0xb2, 0xb0, 0xcb, 0x91, 0xbf, 0x2b, 0x3d, +0x3b, 0xb5, 0x7e, 0x1b, 0xde, 0xdd, 0x99, 0xd3, 0xa7, 0x55, 0x9c, 0xa2, +0x68, 0xdb, 0x81, 0x7b, 0xb5, 0xed, 0x98, 0x01, 0x14, 0x3c, 0x14, 0xd3, +0x90, 0x8a, 0xe5, 0x12, 0x1b, 0x82, 0x82, 0x31, 0x63, 0xca, 0xe4, 0xb8, +0xa4, 0x6a, 0x5d, 0xaf, 0xbe, 0xdd, 0x77, 0x54, 0x54, 0x9e, 0xe0, 0xa4, +0xd8, 0x9a, 0x09, 0x15, 0x62, 0x65, 0x31, 0xfa, 0xb6, 0x91, 0xa0, 0x78, +0xd4, 0x30, 0xb6, 0xcc, 0xf6, 0x5b, 0xb6, 0x3b, 0x2e, 0x36, 0x7e, 0xd8, +0xe0, 0x41, 0x08, 0x24, 0x6f, 0xbd, 0xf5, 0x96, 0x40, 0x42, 0x62, 0xc2, +0x54, 0xa5, 0x82, 0x8a, 0xd1, 0x25, 0xcc, 0xa8, 0x80, 0xf4, 0x59, 0xf9, +0xc6, 0x33, 0xb6, 0x14, 0x1e, 0xb9, 0xd8, 0xef, 0xbd, 0xe7, 0x05, 0x8d, +0xe2, 0x8a, 0x05, 0x0b, 0xb0, 0xf9, 0x48, 0xed, 0x67, 0xb1, 0xcc, 0x56, +0x30, 0x2a, 0x74, 0x99, 0x4a, 0xe5, 0x45, 0x89, 0xbc, 0xbd, 0xf8, 0xf2, +0xf9, 0x8e, 0xf8, 0xe4, 0x2e, 0x2b, 0x0e, 0xfb, 0x82, 0x8a, 0xe0, 0x89, +0x40, 0xbe, 0x89, 0x6d, 0xde, 0xfd, 0x15, 0x16, 0xa8, 0x90, 0xe7, 0x0c, +0x6f, 0x54, 0xb4, 0x1b, 0x3e, 0x33, 0x35, 0x31, 0x71, 0x7b, 0x71, 0xf1, +0x6b, 0xaf, 0xbd, 0x26, 0xa4, 0x06, 0x24, 0x24, 0xac, 0xa3, 0x5c, 0xb3, +0x4f, 0x3d, 0x6f, 0xcc, 0xe2, 0xaf, 0x38, 0x7a, 0xf8, 0x30, 0x18, 0x68, +0x7a, 0xc5, 0xa1, 0xb6, 0xb7, 0xba, 0xe2, 0xb7, 0x29, 0x3f, 0x13, 0x9f, +0xd5, 0xb0, 0x59, 0xa3, 0xfa, 0x0f, 0x3f, 0xf4, 0x90, 0xd8, 0x8b, 0x91, +0xf1, 0x50, 0x76, 0x65, 0x9e, 0x15, 0xc9, 0x2b, 0x0c, 0x1c, 0x03, 0x1d, +0x43, 0xd8, 0x05, 0xd4, 0x32, 0x63, 0xca, 0xc4, 0xb8, 0x94, 0xac, 0x71, +0x3b, 0xce, 0x85, 0x39, 0x2a, 0xc2, 0xdb, 0x32, 0x5b, 0xab, 0x5d, 0xbf, +0xf4, 0x24, 0xe7, 0x3d, 0xa7, 0x4e, 0x61, 0x74, 0x12, 0x99, 0x44, 0xb8, +0x84, 0x04, 0x66, 0x57, 0x3c, 0x97, 0xd0, 0x7d, 0xdb, 0x3b, 0xb6, 0x6e, +0x01, 0x15, 0xcd, 0x97, 0x1c, 0x6f, 0x7e, 0xd0, 0xe5, 0xc2, 0x1b, 0xb6, +0xf9, 0x2c, 0xbf, 0xce, 0x9e, 0x31, 0x03, 0xf4, 0x62, 0x93, 0x15, 0x63, +0x80, 0xca, 0x1d, 0xaf, 0x78, 0x54, 0xa8, 0xc8, 0x14, 0x89, 0x98, 0x02, +0x9c, 0x90, 0x4a, 0x41, 0x9d, 0x9a, 0x69, 0xf5, 0xdb, 0x10, 0xac, 0x15, +0xce, 0xa8, 0x60, 0xd7, 0x0c, 0x6f, 0x5e, 0x51, 0xbb, 0x6d, 0xdf, 0xf4, +0xa4, 0xa4, 0x07, 0xee, 0xbf, 0x1f, 0x52, 0x53, 0xb9, 0x13, 0xbc, 0x60, +0x3d, 0x77, 0xa2, 0x02, 0xd4, 0x6b, 0x03, 0xeb, 0x10, 0x5e, 0xb1, 0x7e, +0xcd, 0x1a, 0x60, 0xd0, 0x62, 0xe5, 0xdd, 0x0d, 0xf6, 0xb9, 0x4a, 0xdd, +0x14, 0x2c, 0xba, 0x95, 0x5f, 0x97, 0x2f, 0x5d, 0x4a, 0x9c, 0x05, 0x00, +0xc6, 0x6a, 0x4c, 0x44, 0xb3, 0x94, 0x69, 0x0b, 0x24, 0x2b, 0xd5, 0xbe, +0x3a, 0x61, 0xe9, 0xe6, 0xd3, 0x3b, 0xbf, 0xbc, 0xf6, 0xea, 0xab, 0x38, +0xdd, 0x5b, 0x0e, 0xbc, 0x24, 0x6f, 0xa7, 0xab, 0xe4, 0x42, 0xe8, 0xfd, +0xd8, 0xd1, 0x2b, 0x24, 0x58, 0x32, 0xbc, 0x51, 0xd1, 0x69, 0xc2, 0x95, +0xc9, 0x09, 0x09, 0xf8, 0x65, 0x55, 0xee, 0x84, 0x04, 0xdb, 0xa9, 0xa8, +0xec, 0x8a, 0x87, 0x84, 0xda, 0x83, 0x57, 0xaf, 0x5c, 0xce, 0x6b, 0x6a, +0x73, 0xdd, 0x7d, 0xd9, 0xbb, 0x5c, 0xf5, 0x33, 0x47, 0x94, 0xb8, 0x9a, +0x35, 0x4e, 0x9f, 0x32, 0x19, 0xe5, 0x07, 0x77, 0x32, 0xce, 0x0a, 0x50, +0x51, 0xf1, 0xdd, 0x33, 0x74, 0xf3, 0xb1, 0x1e, 0x44, 0x88, 0x7a, 0xb3, +0x66, 0xf5, 0x75, 0xf1, 0xb1, 0x09, 0xa3, 0xae, 0x3f, 0x1a, 0x7a, 0x78, +0x30, 0x55, 0x5f, 0x96, 0xac, 0x23, 0x6b, 0xbd, 0x22, 0xec, 0x51, 0x31, +0x74, 0xdd, 0x3d, 0xa4, 0x09, 0x90, 0x90, 0x8d, 0xa1, 0x53, 0x0a, 0x9f, +0x09, 0xa3, 0x28, 0xbf, 0x0a, 0x99, 0x5e, 0xf7, 0x66, 0xf1, 0x0c, 0xa0, +0x2a, 0xac, 0x58, 0xbc, 0xc8, 0xe5, 0x42, 0x59, 0xff, 0x68, 0xe2, 0x36, +0x57, 0x28, 0x44, 0x73, 0x97, 0x5e, 0x51, 0x9f, 0x36, 0x4b, 0x8f, 0x9d, +0x3b, 0x57, 0x15, 0x78, 0x85, 0x21, 0x13, 0x03, 0x25, 0xa7, 0x69, 0x83, +0xfa, 0x29, 0x79, 0x8d, 0x99, 0x67, 0x18, 0xa0, 0x42, 0xba, 0xf6, 0xf8, +0x8d, 0x0a, 0x77, 0xfe, 0x97, 0xca, 0x8e, 0x69, 0xb1, 0xc7, 0xc1, 0x1b, +0x6e, 0xff, 0x53, 0x52, 0xcd, 0x26, 0x79, 0xd9, 0x35, 0xce, 0x3d, 0xf2, +0x88, 0x28, 0xaf, 0xe5, 0x5a, 0x21, 0xd3, 0x2b, 0x24, 0x14, 0xa3, 0x80, +0x5f, 0x2d, 0x5d, 0x74, 0x05, 0xa8, 0x18, 0x70, 0xcb, 0xe3, 0x8a, 0xc8, +0xfa, 0x2d, 0x76, 0xd5, 0x99, 0x25, 0x5d, 0x1b, 0x0b, 0xb2, 0xae, 0x57, +0x54, 0xbc, 0x04, 0x65, 0x08, 0xaa, 0x85, 0xc1, 0xee, 0xd8, 0xb6, 0x2d, +0x21, 0x3e, 0xbe, 0xf7, 0xec, 0xd5, 0xa1, 0x0a, 0x89, 0xb2, 0x35, 0xc9, +0xad, 0x51, 0x71, 0xfb, 0xed, 0xb7, 0xdb, 0x90, 0xa0, 0xcc, 0x36, 0x66, +0x95, 0xf5, 0xa7, 0x42, 0xd8, 0xab, 0x7a, 0x9e, 0x77, 0xaf, 0xcb, 0x5d, +0x4a, 0xed, 0x84, 0x31, 0x63, 0xd8, 0x18, 0x14, 0x2a, 0xca, 0x29, 0xc9, +0xce, 0x12, 0x15, 0xe2, 0x1a, 0x53, 0x87, 0x64, 0x6c, 0xa3, 0x2d, 0x5c, +0x39, 0x8f, 0x9a, 0xb6, 0xf1, 0x23, 0x76, 0x3c, 0xa3, 0xe8, 0x8c, 0x30, +0xf2, 0xac, 0xf6, 0x83, 0x99, 0x2d, 0x46, 0x33, 0xd5, 0x2a, 0xa0, 0xfc, +0xa2, 0x03, 0x3d, 0x60, 0x58, 0x31, 0x0a, 0x09, 0xa7, 0x65, 0xe9, 0x3a, +0xb4, 0x6c, 0xc9, 0x6c, 0x43, 0x98, 0x51, 0x94, 0x03, 0x2a, 0x74, 0xce, +0x50, 0x05, 0x02, 0x5a, 0xec, 0x31, 0x0a, 0xa1, 0xb6, 0xb6, 0x3b, 0x7e, +0x9d, 0x90, 0xdb, 0xb4, 0x55, 0xd3, 0x82, 0x77, 0xde, 0x7e, 0x1b, 0xf3, +0xbf, 0x04, 0x77, 0x94, 0x37, 0x2a, 0x0c, 0x48, 0x30, 0xc7, 0x53, 0xc0, +0x2b, 0xae, 0x5d, 0xbe, 0x0c, 0x00, 0x8c, 0xdd, 0x51, 0xca, 0x2b, 0x98, +0xed, 0xc0, 0x1b, 0xef, 0x74, 0xc4, 0x25, 0xcd, 0x98, 0x36, 0x15, 0xe3, +0xac, 0x54, 0x1b, 0xf1, 0x90, 0x75, 0x64, 0xbe, 0x8b, 0xfa, 0xc6, 0x0e, +0xd7, 0x72, 0x77, 0x8e, 0xce, 0x28, 0xc4, 0x26, 0xbb, 0xe8, 0x0a, 0x17, +0x5b, 0xeb, 0x79, 0xe9, 0xd5, 0x21, 0xcc, 0x28, 0xca, 0xa2, 0xc2, 0x5a, +0xaf, 0x80, 0x57, 0x48, 0xce, 0xae, 0x95, 0xb6, 0xed, 0x35, 0x6a, 0x45, +0x3f, 0xa1, 0xaa, 0xdb, 0x22, 0x9a, 0xef, 0xfc, 0x43, 0x5c, 0x46, 0xed, +0xc2, 0xb6, 0x6d, 0xa0, 0x33, 0x88, 0xac, 0xfc, 0x50, 0x61, 0x60, 0x08, +0x2a, 0xac, 0x08, 0x1d, 0x46, 0x2c, 0x39, 0x7a, 0xec, 0x1d, 0xea, 0x8d, +0x14, 0xca, 0x1f, 0xbb, 0xe9, 0xb4, 0x4e, 0x6a, 0xed, 0xf6, 0xfc, 0x31, +0xb9, 0x56, 0xd3, 0x36, 0x4d, 0x1a, 0x62, 0xf0, 0xd1, 0x2b, 0x53, 0xe9, +0x19, 0xaa, 0x3a, 0xdb, 0x91, 0xbb, 0x88, 0x5a, 0xac, 0x3e, 0xfb, 0x87, +0x0d, 0x7d, 0x58, 0xc9, 0xd4, 0x93, 0x5e, 0x92, 0xc7, 0x8e, 0x1c, 0x49, +0x8e, 0x8f, 0x4d, 0x2f, 0xe8, 0x1e, 0xf2, 0x05, 0xfd, 0x35, 0x1b, 0x94, +0x5b, 0x09, 0xca, 0x36, 0x2a, 0x68, 0x18, 0x69, 0x26, 0xfd, 0xd0, 0xd0, +0x2b, 0x5c, 0x41, 0x1f, 0x25, 0x5f, 0xa6, 0x64, 0xe4, 0xf4, 0xea, 0xda, +0x45, 0x9c, 0x15, 0x4a, 0xdb, 0x0e, 0xa2, 0xf5, 0xc9, 0x40, 0xa6, 0x02, +0x03, 0x1d, 0x09, 0x12, 0x88, 0x2a, 0x71, 0xda, 0xec, 0xbe, 0x92, 0x14, +0xba, 0x63, 0xab, 0x2b, 0xe4, 0x69, 0xc2, 0x2d, 0xf7, 0xeb, 0xa8, 0xc8, +0x29, 0xf9, 0x67, 0xe3, 0xee, 0xc3, 0x53, 0x1d, 0x8e, 0xc7, 0x1f, 0x7b, +0x0c, 0x21, 0x4a, 0xcf, 0x85, 0x52, 0x35, 0xfa, 0x15, 0xf5, 0x03, 0x33, +0xec, 0x54, 0xa0, 0x1d, 0x5b, 0x82, 0x2a, 0x77, 0x60, 0x86, 0x87, 0x1d, +0xbe, 0x61, 0x80, 0x84, 0xca, 0xea, 0x06, 0x9c, 0x8d, 0x48, 0xc4, 0x8b, +0x4b, 0x1a, 0xb1, 0xed, 0x62, 0x61, 0x9e, 0x10, 0x66, 0x17, 0xf6, 0x51, +0x81, 0x65, 0xc6, 0x14, 0xf1, 0x61, 0x96, 0x91, 0xaa, 0xba, 0xf2, 0xe0, +0xe1, 0x55, 0xa5, 0x6c, 0xfb, 0xb6, 0x61, 0xdb, 0xee, 0xed, 0x5a, 0xb6, +0x20, 0x11, 0x19, 0xde, 0xa8, 0x2c, 0xb3, 0x01, 0x0a, 0x51, 0xe6, 0x0d, +0x5b, 0x45, 0x9b, 0x0a, 0x06, 0x74, 0x18, 0x80, 0x04, 0x78, 0x14, 0x60, +0x60, 0xeb, 0x55, 0xb9, 0xa0, 0x57, 0x11, 0x3d, 0xe1, 0x88, 0x99, 0xb2, +0xe7, 0xe9, 0xb2, 0x93, 0x3f, 0xdf, 0x77, 0xd6, 0x2a, 0xde, 0xc8, 0xcc, +0xe9, 0xd3, 0x25, 0x40, 0x50, 0x0a, 0x19, 0x4a, 0x92, 0xa0, 0xa4, 0x1f, +0x29, 0xb6, 0x73, 0xf3, 0x86, 0x0d, 0xfd, 0x7b, 0xf7, 0x6e, 0x5f, 0xd0, +0xb8, 0x55, 0x7e, 0xc3, 0xc5, 0x0b, 0x17, 0x52, 0x29, 0x87, 0x13, 0xb8, +0xbb, 0x74, 0x97, 0x14, 0xeb, 0xb3, 0x0e, 0x12, 0x33, 0x33, 0x51, 0xdf, +0x08, 0xb7, 0x91, 0x47, 0x50, 0x91, 0xe4, 0x3f, 0xfd, 0xe4, 0x13, 0xda, +0xab, 0x32, 0x99, 0x81, 0x57, 0xef, 0x0f, 0x87, 0xc2, 0x9b, 0x6e, 0x50, +0x41, 0xef, 0x79, 0xd2, 0x21, 0x1d, 0xfc, 0x53, 0xda, 0xb6, 0x37, 0x54, +0x08, 0x97, 0x08, 0x61, 0x54, 0x30, 0xff, 0x6e, 0x53, 0x96, 0x54, 0x4f, +0x76, 0xd2, 0x03, 0x92, 0x9d, 0xd5, 0x32, 0x6e, 0x5c, 0x48, 0xdc, 0xec, +0x6b, 0xd3, 0x8d, 0xf7, 0x66, 0xa5, 0x59, 0xa7, 0x24, 0x88, 0x09, 0x1a, +0x42, 0xd8, 0xd8, 0xbf, 0x77, 0xef, 0x53, 0x4f, 0x3e, 0x09, 0x0c, 0x14, +0x12, 0x60, 0x0b, 0xb4, 0x50, 0xe1, 0xe7, 0x67, 0x90, 0xf9, 0x27, 0x9f, +0x7c, 0xfc, 0xd1, 0x47, 0xaf, 0xbf, 0xf6, 0xda, 0xd2, 0xab, 0x16, 0xe7, +0xa4, 0x3a, 0x53, 0xeb, 0xb5, 0x32, 0x53, 0x5b, 0xe3, 0x92, 0xbf, 0x74, +0x18, 0x30, 0x9e, 0x5a, 0x86, 0x03, 0x8b, 0x8a, 0xf6, 0xef, 0xdb, 0xc7, +0x85, 0xaa, 0x56, 0x1a, 0x63, 0x4a, 0xe7, 0x48, 0x81, 0x5c, 0xcf, 0x2e, +0x94, 0xc4, 0x8c, 0x49, 0x69, 0xde, 0x2f, 0xa9, 0x7e, 0x07, 0xde, 0xf8, +0xdd, 0x27, 0x4f, 0xaa, 0x0e, 0x7a, 0x72, 0x8e, 0x19, 0x21, 0x8a, 0x8f, +0x19, 0x18, 0x9a, 0x92, 0xee, 0x24, 0x80, 0x1c, 0x00, 0x7f, 0xf2, 0xf1, +0xc7, 0x3d, 0x0a, 0x0b, 0x19, 0xb6, 0xdf, 0xe5, 0x1b, 0x43, 0x5e, 0x76, +0x32, 0xf9, 0x2b, 0x74, 0x09, 0xaa, 0x0c, 0x2a, 0x44, 0x82, 0x32, 0xa1, +0x42, 0x0f, 0xfa, 0xd5, 0xc1, 0x10, 0xc2, 0xc0, 0x18, 0xbe, 0xf6, 0x24, +0x6f, 0xf7, 0xca, 0x85, 0x0b, 0x55, 0x15, 0x0f, 0xd5, 0x1e, 0x45, 0x36, +0x54, 0x7d, 0xcb, 0xb4, 0xfc, 0x6c, 0x20, 0x26, 0x5d, 0x49, 0x60, 0x28, +0x0a, 0xe7, 0xd0, 0x21, 0xbb, 0x6e, 0x6e, 0x4e, 0x86, 0xd3, 0x99, 0x96, +0x90, 0x90, 0x5b, 0x2d, 0xb3, 0x55, 0x93, 0xfc, 0xd6, 0x05, 0x4d, 0xf8, +0x69, 0x55, 0xd0, 0xa4, 0x79, 0xe3, 0x46, 0x8d, 0x6a, 0xd7, 0xe2, 0xa7, +0xa1, 0xfc, 0xd4, 0xaa, 0xc5, 0x99, 0x34, 0xbc, 0x73, 0xe6, 0x36, 0x9a, +0xb4, 0xd3, 0x5a, 0x2c, 0x01, 0x18, 0xed, 0x07, 0x4d, 0x62, 0xce, 0x69, +0x89, 0x09, 0x2d, 0x0b, 0x9a, 0xcc, 0xba, 0x64, 0xda, 0xfe, 0x3d, 0xbb, +0xdf, 0x78, 0xfd, 0x35, 0x5e, 0x19, 0x4c, 0x43, 0x0e, 0x2c, 0x07, 0x9d, +0xdb, 0xb6, 0x71, 0x66, 0xe4, 0xd0, 0x05, 0x66, 0xcc, 0x8e, 0x27, 0x63, +0x53, 0xaa, 0xb7, 0x2e, 0x68, 0x0c, 0xea, 0x38, 0x87, 0x03, 0x96, 0x28, +0x15, 0x07, 0x31, 0x1f, 0xbd, 0xfd, 0xd6, 0x5b, 0x6f, 0xbf, 0xf9, 0xe6, +0x3b, 0x6f, 0xbd, 0x25, 0x3f, 0xef, 0xbe, 0xfd, 0xb6, 0xfa, 0x71, 0xfd, +0xfa, 0xce, 0x3b, 0xd4, 0x9e, 0xba, 0xf3, 0xe4, 0x89, 0x3b, 0x4f, 0xdc, +0x41, 0x3b, 0xfa, 0x13, 0x77, 0x1c, 0xbf, 0x83, 0x22, 0x8a, 0x47, 0x0e, +0x77, 0x6e, 0xd7, 0xce, 0x05, 0x89, 0x79, 0xeb, 0x42, 0xdb, 0xee, 0xa4, +0x0b, 0xff, 0x56, 0xbc, 0x82, 0x65, 0xf4, 0x15, 0x15, 0x06, 0x75, 0x22, +0x64, 0x74, 0x09, 0x83, 0x40, 0xd5, 0x78, 0xe7, 0xe7, 0x38, 0xc8, 0xea, +0xe5, 0x64, 0x53, 0xd1, 0x15, 0x81, 0x44, 0xda, 0xb5, 0xa8, 0x7d, 0x57, +0xc9, 0x1b, 0x4a, 0x38, 0x31, 0x7f, 0x90, 0x4d, 0x57, 0x0e, 0xd9, 0xa7, +0x45, 0x49, 0x60, 0xcb, 0x99, 0x34, 0x66, 0x14, 0x24, 0x1e, 0xeb, 0x88, +0x49, 0x6b, 0xd4, 0xb1, 0xde, 0xa4, 0x1b, 0x1b, 0x4c, 0x5b, 0x5f, 0xbd, +0xcd, 0xc0, 0xf8, 0xd4, 0x9c, 0xd8, 0xc4, 0xd4, 0x58, 0x67, 0xba, 0x33, +0x35, 0x2b, 0xa7, 0x6e, 0x93, 0x82, 0x6e, 0xc3, 0x5a, 0xf7, 0x19, 0xdd, +0x71, 0xe0, 0x84, 0x6e, 0xc3, 0xa6, 0xf4, 0x1c, 0x79, 0x49, 0x9f, 0x09, +0x73, 0x46, 0x5e, 0xb3, 0x17, 0x3b, 0xac, 0x07, 0xc1, 0x8f, 0x39, 0x8f, +0xdc, 0xfc, 0x40, 0xb3, 0xa1, 0xb3, 0x9d, 0x35, 0xea, 0x27, 0xc4, 0x27, +0x26, 0x3b, 0x93, 0xd2, 0x12, 0xe3, 0x6b, 0xa4, 0x24, 0xb6, 0x6e, 0xd2, +0xa8, 0x7f, 0x8f, 0x6e, 0x97, 0x4e, 0x9a, 0xd8, 0xac, 0x7e, 0x5d, 0xee, +0xdb, 0x6f, 0xf6, 0xf5, 0x0c, 0xd2, 0xf2, 0xd0, 0xb7, 0x83, 0x56, 0xee, +0x8d, 0x8b, 0x89, 0x4d, 0x8f, 0x73, 0x54, 0x73, 0xc6, 0x95, 0xfd, 0x89, +0xcf, 0x70, 0x26, 0x7a, 0xfe, 0x49, 0xa3, 0xd4, 0xb3, 0x33, 0x49, 0xff, +0x49, 0x49, 0x74, 0xc6, 0xc7, 0x39, 0xc3, 0x0a, 0x12, 0x6e, 0x2c, 0xb3, +0x16, 0xa8, 0x80, 0x35, 0x9b, 0x78, 0x85, 0xca, 0x0e, 0x09, 0x61, 0xe6, +0x60, 0xa6, 0xb6, 0x5e, 0x57, 0xdc, 0xc2, 0x4e, 0x31, 0x67, 0xd6, 0x2c, +0x89, 0xa4, 0x00, 0x18, 0xd2, 0x53, 0x0b, 0x51, 0x81, 0x0d, 0x15, 0x84, +0x40, 0xe2, 0xee, 0x0e, 0x11, 0x87, 0x44, 0x22, 0x92, 0x7c, 0x7f, 0x76, +0x62, 0x0c, 0x44, 0xbb, 0x76, 0xec, 0xc8, 0x49, 0x4f, 0x21, 0x34, 0xa8, +0x7a, 0x8b, 0x9e, 0x63, 0x76, 0x3d, 0xdb, 0xfd, 0xe8, 0xdf, 0xbb, 0x1e, +0xfd, 0x07, 0x61, 0xe1, 0xed, 0x6f, 0xfd, 0xba, 0xe5, 0xc1, 0x7f, 0xe6, +0xef, 0xff, 0xa6, 0xce, 0x9e, 0x6f, 0xb3, 0x4a, 0x5c, 0xbd, 0x36, 0xfd, +0xd6, 0x50, 0x51, 0xbe, 0xdb, 0xef, 0xfb, 0xf3, 0x84, 0x9d, 0x4f, 0x0c, +0x59, 0xb6, 0xb3, 0xe3, 0xe8, 0x39, 0x35, 0x9b, 0x75, 0x4e, 0xad, 0x99, +0x9f, 0x9c, 0x55, 0xd7, 0x99, 0x9e, 0x4d, 0xc5, 0x83, 0xbe, 0x73, 0x6e, +0x50, 0x75, 0x38, 0x5b, 0x1c, 0xf8, 0x7a, 0xcc, 0x75, 0xfb, 0xfb, 0x8f, +0x9d, 0xd1, 0x77, 0xd4, 0xd4, 0x3e, 0x23, 0xa7, 0xf4, 0x1e, 0x3e, 0xb9, +0xfb, 0xd0, 0x09, 0x9d, 0x07, 0x8c, 0x29, 0x1c, 0x32, 0xa5, 0xd3, 0xd8, +0x05, 0x6d, 0x46, 0xcc, 0x69, 0x36, 0x78, 0x66, 0xc3, 0x7e, 0xd3, 0x6a, +0xf6, 0x98, 0x98, 0xd3, 0x75, 0x5c, 0xcd, 0x1e, 0x13, 0x1a, 0xf4, 0x9d, +0xc6, 0x37, 0x6d, 0x46, 0xcc, 0xed, 0x38, 0x66, 0x41, 0xcf, 0x99, 0xd7, +0xf5, 0x5f, 0x5c, 0x3c, 0x68, 0xe9, 0x8e, 0x61, 0xcb, 0x4b, 0x86, 0xaf, +0xd8, 0x35, 0x72, 0xe5, 0xee, 0x51, 0xab, 0xf6, 0xc0, 0xc7, 0xc2, 0x41, +0x97, 0xf0, 0x83, 0x57, 0x58, 0xa1, 0xc2, 0xe0, 0xb9, 0x0b, 0x55, 0xfe, +0x60, 0x20, 0xc4, 0xfc, 0x9d, 0x5f, 0x64, 0x36, 0xe9, 0x42, 0xa1, 0xc8, +0x0d, 0xeb, 0xd7, 0x11, 0x3f, 0x8b, 0xb9, 0x1a, 0xd3, 0x8d, 0x04, 0xa5, +0x02, 0x0f, 0x91, 0x37, 0x2c, 0x0f, 0xfe, 0xc4, 0x21, 0x62, 0x09, 0x48, +0x40, 0x35, 0xf8, 0xd1, 0x73, 0xcf, 0xed, 0xdf, 0xb7, 0xb7, 0x3f, 0x35, +0xff, 0x1c, 0x54, 0xfd, 0x6b, 0x34, 0xf4, 0x86, 0xdb, 0xc1, 0x80, 0xdf, +0x74, 0x6f, 0xff, 0xc2, 0xb4, 0xed, 0xdf, 0x37, 0xdc, 0xfb, 0xcf, 0xb6, +0x07, 0xff, 0xde, 0xf9, 0xe0, 0xe7, 0x53, 0xf6, 0x3f, 0xef, 0x46, 0xb0, +0x39, 0x4f, 0x42, 0x9f, 0xe9, 0xa7, 0xaa, 0x5b, 0xcf, 0xed, 0x2f, 0x42, +0x40, 0x67, 0xda, 0x94, 0xa0, 0x3c, 0xa2, 0x22, 0x4c, 0xf0, 0xa0, 0xd6, +0x71, 0xc2, 0x9e, 0x67, 0x9d, 0x35, 0x5c, 0x52, 0x47, 0xc7, 0x56, 0xcd, +0xbb, 0xb6, 0x6f, 0xdb, 0xb3, 0x53, 0x87, 0x51, 0x83, 0x07, 0x4d, 0x1e, +0x37, 0x66, 0xe2, 0x98, 0x51, 0xf3, 0x2e, 0x9b, 0xbd, 0x7c, 0xc9, 0x92, +0xa5, 0x57, 0x5d, 0x75, 0xc3, 0x75, 0xd7, 0x6d, 0xb9, 0xf9, 0xe6, 0x6b, +0xae, 0xbe, 0x7a, 0xd9, 0x92, 0x25, 0x2b, 0x96, 0x2e, 0x5d, 0x72, 0xe5, +0x95, 0xd3, 0x27, 0x4f, 0x9c, 0x34, 0x66, 0xf4, 0xa4, 0xb1, 0xa3, 0x39, +0xad, 0xa8, 0x7b, 0xb7, 0x6e, 0xed, 0x5a, 0xe7, 0x56, 0xcb, 0x60, 0x79, +0x63, 0x12, 0x52, 0x6a, 0xf6, 0xbd, 0x74, 0x64, 0xc9, 0x33, 0xcd, 0xf7, +0xfb, 0x91, 0xda, 0x1f, 0x25, 0xd3, 0xca, 0x58, 0x01, 0xfb, 0xa8, 0x40, +0x1b, 0x2b, 0x6b, 0x99, 0x0d, 0x2b, 0xc1, 0xc9, 0xb0, 0xb5, 0x34, 0xd9, +0xf5, 0xc5, 0x80, 0x79, 0x37, 0xb6, 0xef, 0x3d, 0x3c, 0xbf, 0x63, 0xdf, +0xf4, 0x7a, 0xad, 0x1c, 0x09, 0x69, 0x90, 0xb7, 0xc3, 0x41, 0x55, 0x7c, +0x0f, 0x87, 0x9c, 0xc0, 0x4f, 0x7c, 0x4a, 0xcd, 0xfc, 0x86, 0xed, 0xfb, +0x76, 0x19, 0x7f, 0xf9, 0x88, 0x35, 0xb7, 0x4d, 0xde, 0xfb, 0x5c, 0xb3, +0x7d, 0x9e, 0x14, 0x83, 0x80, 0x76, 0x35, 0x5f, 0x9c, 0xf7, 0xd1, 0x1b, +0xd9, 0x5d, 0x01, 0x3b, 0x96, 0x59, 0x44, 0x02, 0x78, 0x85, 0x1b, 0x54, +0x84, 0x1b, 0xa3, 0x30, 0x2f, 0x5c, 0x5a, 0xf1, 0x77, 0x0d, 0xf6, 0x7c, +0xdd, 0x66, 0xff, 0x97, 0x85, 0x07, 0xff, 0x32, 0xe5, 0xc0, 0x4b, 0x63, +0x77, 0x3e, 0x3d, 0x68, 0xeb, 0xe3, 0xed, 0x57, 0x9e, 0x68, 0x74, 0x59, +0x49, 0x87, 0xeb, 0x4e, 0x0f, 0xda, 0xf2, 0xd8, 0xb8, 0x5d, 0xcf, 0x4c, +0x39, 0xf0, 0x22, 0xe2, 0x4a, 0x87, 0x83, 0x5f, 0x22, 0xae, 0xd4, 0xdd, +0xfd, 0x4d, 0x4a, 0xb1, 0x2b, 0xe4, 0x3b, 0xfa, 0x13, 0xaa, 0x2b, 0x60, +0x42, 0x85, 0x38, 0x49, 0x8d, 0x36, 0x28, 0xf7, 0x12, 0x54, 0xf4, 0xdd, +0x47, 0x57, 0x20, 0xec, 0x56, 0xc0, 0x2b, 0x2a, 0x8e, 0x1f, 0x3f, 0x8e, +0x12, 0x69, 0xc5, 0x2b, 0xc2, 0x6e, 0x2d, 0xa2, 0xbb, 0x7b, 0x74, 0x05, +0xdc, 0x78, 0xf1, 0x8c, 0xbc, 0x22, 0x8a, 0x8a, 0x50, 0x15, 0x03, 0xa2, +0x24, 0xee, 0xf7, 0x0a, 0xd8, 0xe4, 0x15, 0xc4, 0x90, 0x9a, 0xf4, 0x8a, +0x28, 0xaf, 0x88, 0xae, 0x40, 0x98, 0xae, 0x80, 0x86, 0x0a, 0xd2, 0x80, +0x55, 0x21, 0x7a, 0xa3, 0x5e, 0x01, 0x2a, 0x60, 0x22, 0x65, 0xec, 0x2f, +0x9b, 0xfd, 0x77, 0x39, 0x45, 0x77, 0xdf, 0xe8, 0x0a, 0x54, 0xe9, 0x15, +0xf0, 0x8a, 0x0a, 0x91, 0xa0, 0x04, 0x15, 0xb1, 0xb1, 0x84, 0xa2, 0xfd, +0x70, 0x6c, 0x0a, 0xb3, 0xde, 0xb2, 0x61, 0xba, 0xed, 0xf9, 0x2d, 0x45, +0x44, 0xec, 0x85, 0x10, 0xf6, 0x0f, 0x07, 0x04, 0x6f, 0xcd, 0x2b, 0x74, +0x54, 0xe4, 0xe4, 0xe4, 0x94, 0xa2, 0x62, 0xe5, 0x27, 0x55, 0x1a, 0xee, +0x11, 0xfb, 0x52, 0xa3, 0x0f, 0x1e, 0xe0, 0x0a, 0x40, 0xd8, 0x3f, 0x1c, +0x35, 0x6a, 0xd4, 0x70, 0x8b, 0x0a, 0x89, 0xbb, 0x84, 0x57, 0x74, 0xeb, +0xd6, 0xad, 0x14, 0x15, 0x13, 0x8e, 0x44, 0x51, 0x11, 0x5d, 0x81, 0x30, +0x5c, 0x01, 0x08, 0xfb, 0x87, 0xa3, 0x73, 0xe7, 0xce, 0x82, 0x0a, 0x42, +0x7e, 0x88, 0x88, 0xa3, 0x73, 0xea, 0xc5, 0xfc, 0x0a, 0x78, 0x85, 0xa0, +0x82, 0x3f, 0x2c, 0x59, 0xb2, 0xa4, 0x14, 0x15, 0x05, 0x83, 0xc2, 0x70, +0x45, 0x02, 0xdc, 0x66, 0xa2, 0x97, 0x87, 0xc1, 0x0a, 0x14, 0x0c, 0x4a, +0x4b, 0x23, 0x94, 0xc1, 0x75, 0x2c, 0x58, 0xb0, 0x40, 0x5a, 0xe6, 0x5a, +0xa0, 0x82, 0x70, 0x51, 0x80, 0x42, 0x00, 0x29, 0x2d, 0x1d, 0xca, 0x28, +0xdc, 0xb3, 0x1f, 0x8d, 0x02, 0x23, 0xba, 0x02, 0x61, 0xb5, 0x02, 0x90, +0xb4, 0x76, 0xdc, 0x79, 0xe7, 0x9d, 0xc4, 0x86, 0x4a, 0xf4, 0x34, 0xe1, +0xa1, 0xa5, 0xbc, 0xe2, 0x8e, 0x3b, 0xee, 0x90, 0xbe, 0x04, 0xe4, 0x1b, +0x00, 0x9a, 0x1e, 0x3d, 0x7a, 0x94, 0x5e, 0x95, 0xdd, 0xd4, 0x71, 0x53, +0x68, 0x16, 0x12, 0x0d, 0x83, 0x2d, 0x2d, 0xfa, 0x08, 0x41, 0x5f, 0x01, +0x88, 0x39, 0xbb, 0xe9, 0x94, 0x29, 0x53, 0x84, 0xc2, 0x11, 0x9f, 0xa4, +0x6b, 0xae, 0xca, 0xfe, 0x2d, 0x45, 0xc5, 0x89, 0x13, 0x27, 0xa4, 0x03, +0x39, 0xee, 0x6d, 0x40, 0x83, 0x40, 0x55, 0x86, 0x5d, 0xe4, 0x17, 0x45, +0x81, 0x11, 0x56, 0x9b, 0x65, 0xd0, 0x49, 0x2d, 0x54, 0x06, 0x04, 0x12, +0xf9, 0x45, 0x57, 0x5e, 0x79, 0xa5, 0x22, 0xef, 0xdd, 0xbb, 0x77, 0x93, +0xc1, 0x4f, 0x75, 0x46, 0x55, 0x9d, 0x9e, 0x6c, 0xed, 0x8b, 0x7a, 0x05, +0xa8, 0x20, 0x8d, 0x86, 0x00, 0x41, 0x8c, 0xb3, 0x14, 0xbf, 0xe0, 0xa4, +0x69, 0xd3, 0xa6, 0x95, 0x01, 0x06, 0x1c, 0x23, 0x2a, 0x4a, 0x85, 0xca, +0xbb, 0x8f, 0xce, 0xd3, 0x72, 0x05, 0x20, 0xe0, 0xec, 0xa6, 0x3a, 0x24, +0xc6, 0x8d, 0x1b, 0xf7, 0xca, 0x2b, 0xaf, 0xd0, 0x2b, 0x59, 0xda, 0x83, +0x48, 0x67, 0x9f, 0x32, 0xa8, 0x20, 0xf5, 0x0c, 0x85, 0x1b, 0xd5, 0x82, +0x3f, 0x53, 0x64, 0x05, 0x00, 0x75, 0xed, 0xda, 0xb5, 0x0c, 0x30, 0xf8, +0x05, 0xe5, 0x1b, 0xe5, 0x1d, 0xab, 0x56, 0xd4, 0x8f, 0x11, 0xa5, 0xbc, +0xaa, 0xbf, 0x02, 0xf8, 0xa0, 0x21, 0x54, 0xc8, 0x15, 0xa2, 0x85, 0x74, +0x1d, 0x0e, 0x25, 0x38, 0xf1, 0xb9, 0x53, 0xa7, 0x4e, 0xcf, 0x3c, 0xf3, +0xcc, 0xeb, 0xaf, 0xbf, 0x2e, 0x1d, 0xd6, 0xa5, 0x51, 0x28, 0x10, 0x40, +0x50, 0xba, 0xc8, 0x2b, 0x4e, 0x9e, 0x3c, 0x29, 0x4d, 0x09, 0x10, 0xa2, +0xd0, 0x39, 0x50, 0x2d, 0x48, 0x41, 0xa6, 0x21, 0x50, 0x17, 0x57, 0xd9, +0x08, 0x37, 0x47, 0x8c, 0xe6, 0xec, 0x73, 0x7b, 0x52, 0xf4, 0x0f, 0xd1, +0x15, 0xa8, 0x12, 0x2b, 0xa0, 0x2c, 0x4e, 0x32, 0x9b, 0xf6, 0xed, 0xdb, +0x9f, 0x3d, 0x7b, 0x16, 0x0a, 0xa7, 0x86, 0x2f, 0xed, 0x41, 0xd0, 0x1a, +0xa4, 0xa4, 0x10, 0x10, 0x28, 0x45, 0x05, 0x6a, 0xb8, 0xea, 0x61, 0x23, +0xf1, 0xe4, 0x9c, 0x4a, 0xea, 0x26, 0xcd, 0xe3, 0xe0, 0x32, 0x55, 0xe2, +0xb1, 0xa2, 0x93, 0x88, 0xae, 0x40, 0x90, 0x56, 0x60, 0xc4, 0x88, 0x11, +0x18, 0x5a, 0x9f, 0x7d, 0xf6, 0x59, 0x69, 0x79, 0xa5, 0x7a, 0x85, 0x12, +0xde, 0x81, 0x1e, 0x81, 0x36, 0x71, 0x91, 0x57, 0x80, 0x0a, 0x55, 0x1f, +0x0e, 0xc4, 0xc0, 0x2e, 0xe0, 0x29, 0xb8, 0x36, 0x68, 0x1e, 0xf7, 0xe2, +0x8b, 0x2f, 0x6e, 0xdb, 0xb6, 0xad, 0x79, 0x7b, 0x57, 0x79, 0xac, 0xe8, +0x11, 0x5d, 0x81, 0x90, 0x5e, 0x81, 0xc6, 0xad, 0x3a, 0xae, 0x5b, 0xb7, +0xee, 0xd1, 0x47, 0x1f, 0x7d, 0xfa, 0xe9, 0xa7, 0xd1, 0x28, 0xd8, 0xf7, +0xd9, 0xfd, 0x51, 0xa4, 0x55, 0x17, 0x38, 0x24, 0xa6, 0x32, 0xa8, 0x90, +0x5a, 0xa2, 0x68, 0x17, 0xd2, 0x21, 0x53, 0xb4, 0x0b, 0xe4, 0xa8, 0x37, +0xdf, 0x7c, 0x93, 0xeb, 0x9f, 0x7e, 0xe6, 0xb9, 0x8d, 0xdb, 0xf7, 0xf6, +0x9f, 0x38, 0x3b, 0x35, 0xbf, 0x5b, 0x5c, 0x5a, 0x0d, 0x47, 0x54, 0x7c, +0x0a, 0x69, 0xea, 0x88, 0x9c, 0xc9, 0xd3, 0xaf, 0x24, 0x2d, 0x3b, 0xa5, +0x51, 0xe7, 0x6e, 0xa3, 0x2e, 0x5d, 0xbb, 0xb9, 0xf8, 0xfe, 0x87, 0x1e, +0x79, 0xe2, 0x89, 0x27, 0x9e, 0x7b, 0xee, 0x39, 0x48, 0x1a, 0x83, 0xac, +0x68, 0x14, 0x52, 0xe4, 0x45, 0xca, 0x31, 0x02, 0x01, 0x38, 0x84, 0x8b, +0x57, 0xa4, 0xa4, 0xa4, 0xdc, 0x75, 0xd7, 0x5d, 0x52, 0x32, 0x9e, 0xea, +0x46, 0x98, 0x68, 0x55, 0xc5, 0x34, 0x74, 0x73, 0x38, 0x06, 0x90, 0x42, +0x29, 0x79, 0xe9, 0xa5, 0x97, 0x9e, 0x7c, 0xfa, 0xb9, 0xfb, 0x1e, 0x7d, +0xf2, 0xde, 0x87, 0xce, 0xdd, 0xf3, 0xe0, 0x23, 0x77, 0xdd, 0x77, 0xf6, +0xce, 0x33, 0x0f, 0xde, 0x79, 0xef, 0x03, 0xfc, 0x9c, 0x3c, 0x7d, 0xbf, +0x4f, 0x3f, 0x27, 0xee, 0xb9, 0xcf, 0x8f, 0x9f, 0x3b, 0x4e, 0x9d, 0xf1, +0xfa, 0x73, 0xfc, 0xee, 0x7b, 0x0d, 0xe7, 0xf0, 0x8d, 0xd7, 0x9f, 0xdb, +0xef, 0x3a, 0xed, 0xf5, 0xe7, 0xb6, 0x3b, 0xef, 0x31, 0x9c, 0xc3, 0x37, +0x5e, 0x7f, 0x8e, 0x9d, 0x3c, 0x65, 0x38, 0x87, 0x6f, 0x82, 0xf5, 0xe3, +0xf5, 0xee, 0x96, 0x73, 0xf6, 0xfa, 0xa4, 0x9c, 0x60, 0x58, 0x31, 0xf3, +0x37, 0x96, 0x4b, 0x6a, 0x5e, 0x79, 0xaf, 0xef, 0x8b, 0x13, 0xec, 0x53, +0x82, 0x7d, 0x1a, 0x13, 0xb2, 0x74, 0xd1, 0xe7, 0x99, 0x07, 0xef, 0xbe, +0xff, 0xa1, 0x53, 0xf7, 0x3f, 0x7c, 0xf6, 0x91, 0x73, 0x4f, 0x3e, 0xf9, +0x24, 0x78, 0x40, 0xf6, 0x41, 0x70, 0x12, 0x48, 0x48, 0x27, 0x17, 0x78, +0x80, 0xc8, 0x4e, 0x52, 0xa1, 0xb4, 0x14, 0x15, 0x77, 0xdf, 0x7d, 0xb7, +0x74, 0x67, 0x13, 0x76, 0xa1, 0x3c, 0x7a, 0x30, 0x17, 0x38, 0x06, 0x9e, +0x3f, 0xac, 0x57, 0xe8, 0x25, 0x0c, 0x87, 0xa6, 0xf1, 0xfc, 0xf3, 0xcf, +0x33, 0x3a, 0x3c, 0xe8, 0xa9, 0xa7, 0xa8, 0x16, 0xe9, 0x3a, 0xc0, 0x9f, +0x4f, 0x07, 0xed, 0xdf, 0xfd, 0x38, 0x1e, 0xf3, 0xeb, 0x38, 0x67, 0xfb, +0x80, 0xb1, 0xfa, 0x74, 0x20, 0x9b, 0xfa, 0x71, 0x3c, 0x1c, 0x8c, 0xc3, +0xfe, 0x7d, 0x7d, 0x7a, 0x22, 0x75, 0xb2, 0xed, 0x35, 0x2b, 0x73, 0xa2, +0x5f, 0xef, 0xe7, 0x31, 0x3b, 0x94, 0xe0, 0x13, 0x75, 0x71, 0xb2, 0x90, +0x25, 0xf4, 0xc9, 0x81, 0xa1, 0x09, 0x72, 0x45, 0xb1, 0x66, 0x5b, 0x87, +0x80, 0x51, 0x0a, 0xde, 0x7f, 0xff, 0x7d, 0x20, 0x21, 0x4d, 0xa5, 0x45, +0x76, 0xd2, 0xdb, 0x85, 0xc2, 0x21, 0x2e, 0xf2, 0x0a, 0x41, 0x85, 0x54, +0x4a, 0x95, 0x6a, 0xbb, 0x62, 0xa5, 0x45, 0x31, 0xe7, 0x4a, 0x4c, 0x52, +0xb4, 0x66, 0x63, 0x20, 0x86, 0x03, 0x64, 0x6f, 0xbc, 0xf1, 0x06, 0xa3, +0xc3, 0x83, 0x40, 0x08, 0x77, 0xe2, 0x00, 0x7f, 0x3e, 0x1d, 0x4c, 0xd1, +0x8f, 0x03, 0x34, 0xfa, 0x71, 0xfc, 0xc8, 0xf6, 0xc1, 0xda, 0xf9, 0x74, +0xa0, 0xae, 0xf9, 0x71, 0xf0, 0x92, 0x02, 0x3f, 0xec, 0xdf, 0xd7, 0xa7, +0x27, 0x52, 0x27, 0xdb, 0x5e, 0xb3, 0x32, 0x27, 0xfa, 0xf1, 0x76, 0xb8, +0xc4, 0x0e, 0x25, 0xf8, 0x44, 0x5d, 0x9c, 0x2c, 0x64, 0x09, 0x7d, 0x72, +0xfc, 0xf8, 0xc7, 0x3f, 0x86, 0x5c, 0x51, 0x04, 0xd8, 0xd6, 0x21, 0x60, +0x64, 0x1f, 0xdc, 0x71, 0x70, 0x09, 0x81, 0x84, 0xd8, 0x9d, 0x44, 0x76, +0x82, 0xf8, 0x41, 0x01, 0xa8, 0x40, 0x7a, 0x72, 0x49, 0x50, 0xa0, 0x42, +0xba, 0x51, 0x29, 0x39, 0x4a, 0xfa, 0x77, 0x00, 0x0c, 0xae, 0xc4, 0x94, +0x8b, 0x3f, 0x1c, 0x09, 0x0c, 0x6c, 0xe0, 0x1b, 0x47, 0xd9, 0x80, 0x75, +0xe0, 0xd0, 0x40, 0xb2, 0x02, 0x24, 0x1e, 0x0e, 0xe6, 0xe1, 0xf7, 0x01, +0xa6, 0x83, 0x72, 0xb0, 0x1c, 0x36, 0x0f, 0xd0, 0xee, 0xd3, 0x81, 0x54, +0x19, 0x94, 0x83, 0x77, 0x66, 0xe7, 0xf0, 0xef, 0x5e, 0x3e, 0x3d, 0x91, +0x3a, 0xd9, 0xe6, 0x8a, 0x19, 0x4e, 0x0b, 0xca, 0xfb, 0x62, 0x10, 0xfb, +0x34, 0xe3, 0x99, 0xfc, 0xa0, 0x4f, 0x0e, 0x90, 0x00, 0xb9, 0x02, 0x06, +0x44, 0x1e, 0xf0, 0x00, 0x8b, 0xc0, 0x0e, 0x8b, 0xe0, 0x04, 0x61, 0x2b, +0x75, 0x42, 0xef, 0x07, 0x02, 0x16, 0x8c, 0xa8, 0x30, 0x00, 0x03, 0x8e, +0x01, 0x7f, 0x41, 0xf0, 0x12, 0x6c, 0x00, 0x2f, 0x46, 0x04, 0x67, 0x0c, +0x0d, 0x42, 0xb8, 0x07, 0x2a, 0xbc, 0xd7, 0x03, 0x20, 0xa9, 0x73, 0xf8, +0x1c, 0xc4, 0x83, 0xe7, 0x0c, 0xca, 0x01, 0x1b, 0xf4, 0xe3, 0x60, 0xa1, +0x83, 0x72, 0xb0, 0xcb, 0xd8, 0x39, 0xfc, 0xbb, 0x97, 0x1f, 0xcf, 0x65, +0x79, 0x49, 0x50, 0xd6, 0x59, 0x7a, 0x6b, 0xf8, 0x7d, 0xe8, 0x54, 0xe4, +0x95, 0xea, 0x38, 0x01, 0xfa, 0xe4, 0x40, 0x37, 0x86, 0x5c, 0xd9, 0xd3, +0x21, 0x5d, 0x34, 0x02, 0x72, 0x25, 0x90, 0x80, 0x88, 0xe1, 0x90, 0x86, +0x07, 0x4a, 0x9d, 0x50, 0xad, 0x1a, 0x8c, 0xa8, 0x10, 0x76, 0xa1, 0x03, +0x43, 0x74, 0x0c, 0x98, 0x06, 0xd8, 0x00, 0x58, 0xb8, 0x32, 0x18, 0x11, +0x78, 0x30, 0x34, 0x08, 0x91, 0x83, 0x3b, 0x05, 0x7e, 0xc0, 0x8b, 0x18, +0x84, 0xff, 0xe5, 0xd0, 0x3f, 0xab, 0x2f, 0x03, 0xf9, 0xc0, 0x8a, 0xc8, +0xa1, 0x06, 0x51, 0xdf, 0x04, 0xf8, 0x01, 0xf1, 0xb2, 0x6a, 0x1e, 0x01, +0x3e, 0x97, 0xe1, 0x72, 0xd6, 0xcd, 0xc3, 0x1a, 0x06, 0xf2, 0x6a, 0xcc, +0xd7, 0xca, 0xdb, 0x0f, 0x9c, 0xa8, 0x84, 0x3e, 0x61, 0x0b, 0x90, 0x2b, +0x86, 0x26, 0x48, 0x17, 0x02, 0x66, 0x8b, 0x07, 0x0f, 0xd8, 0x93, 0x20, +0x6c, 0x33, 0x24, 0x80, 0x80, 0x05, 0x2a, 0x0c, 0xc0, 0x90, 0xbe, 0x4f, +0xaa, 0x25, 0x8f, 0x74, 0x21, 0x01, 0x21, 0x8c, 0x0b, 0x48, 0xe4, 0xe0, +0x36, 0xc1, 0x3a, 0x40, 0xb0, 0x1c, 0x6a, 0x40, 0x9f, 0xbe, 0x51, 0x27, +0x07, 0xf2, 0x81, 0x85, 0x53, 0x97, 0xf3, 0x59, 0x0e, 0x3b, 0xdf, 0xa8, +0x93, 0xab, 0xc8, 0x07, 0x3b, 0x73, 0xf6, 0x70, 0x4e, 0x20, 0x6b, 0x68, +0x79, 0xad, 0xaf, 0xef, 0x34, 0x70, 0xa2, 0x52, 0x24, 0x2a, 0xe5, 0x83, +0xa5, 0xb1, 0x81, 0x2a, 0xb0, 0x0d, 0x61, 0x4b, 0xfd, 0x79, 0xe1, 0x12, +0xaa, 0x63, 0x89, 0x35, 0x2a, 0x74, 0x60, 0xa8, 0x86, 0x3d, 0x7a, 0xab, +0x1e, 0xe9, 0xd3, 0xa3, 0x0e, 0x77, 0x85, 0x8a, 0xcb, 0xe9, 0x7b, 0xa9, +0x7f, 0xac, 0x17, 0x48, 0x0e, 0xf0, 0x1b, 0x75, 0x79, 0xe0, 0x1f, 0xa4, +0x2a, 0x33, 0x2f, 0x40, 0x0e, 0x69, 0x1c, 0xa1, 0x0e, 0xfd, 0x57, 0x39, +0x33, 0xf0, 0x6f, 0x0c, 0x73, 0x66, 0x40, 0x28, 0xc0, 0xce, 0xe1, 0x6e, +0x86, 0x32, 0x82, 0xfa, 0xab, 0xde, 0x22, 0xc3, 0xe6, 0x3a, 0xab, 0x47, +0x93, 0x41, 0xd4, 0x64, 0x0c, 0xab, 0xe1, 0xa1, 0xc4, 0x75, 0xb0, 0x28, +0x47, 0xa7, 0x52, 0x29, 0x20, 0x2f, 0xc5, 0xe4, 0xd9, 0xe5, 0x05, 0x12, +0xd2, 0xab, 0xc4, 0xd0, 0xc4, 0xc7, 0x2d, 0x2a, 0xa4, 0xa9, 0x8f, 0x92, +0xa6, 0xdc, 0x75, 0x76, 0x93, 0x0e, 0x3a, 0x15, 0x7c, 0x48, 0xb3, 0x08, +0xd5, 0xe3, 0x47, 0xb5, 0x8f, 0xa8, 0xdc, 0x6f, 0x78, 0xf7, 0xe8, 0x06, +0x58, 0x03, 0x89, 0xa2, 0xd9, 0xb4, 0x69, 0xd3, 0x9a, 0x35, 0x6b, 0x1e, +0x78, 0xe0, 0x01, 0xd5, 0x13, 0x43, 0xcd, 0x59, 0x26, 0xa9, 0xff, 0xea, +0xf7, 0x67, 0xd5, 0xe2, 0x48, 0xad, 0x06, 0xc1, 0x6c, 0xab, 0x57, 0xaf, +0xbe, 0xee, 0xba, 0xeb, 0xae, 0xbf, 0xfe, 0xfa, 0x1b, 0x6e, 0xb8, 0x81, +0x39, 0xac, 0x5d, 0xbb, 0x16, 0x57, 0xee, 0x86, 0x0d, 0x1b, 0x6e, 0xbe, +0xf9, 0xe6, 0xcd, 0x9b, 0x37, 0x6f, 0xd9, 0xb2, 0x65, 0xeb, 0xd6, 0xad, +0xdb, 0xb7, 0x6f, 0xdf, 0xb1, 0x63, 0xc7, 0xce, 0x9d, 0x3b, 0xd1, 0x41, +0x65, 0x86, 0x22, 0x0e, 0x60, 0x57, 0xe5, 0xfc, 0xf5, 0xeb, 0xd7, 0x1f, +0x3a, 0x74, 0xe8, 0xbe, 0xfb, 0xee, 0xc3, 0xba, 0xc4, 0x09, 0x88, 0x31, +0x90, 0xaf, 0xf9, 0x5e, 0xe6, 0x6f, 0x20, 0x7a, 0x14, 0x4e, 0xcc, 0x06, +0xf7, 0xdf, 0x7f, 0xff, 0xae, 0x5d, 0xbb, 0x96, 0x2f, 0x5f, 0xbe, 0x7f, +0xff, 0x7e, 0xa6, 0xc1, 0x04, 0xf8, 0x95, 0x04, 0x1e, 0x2c, 0xd2, 0xd8, +0x85, 0x58, 0x25, 0xe4, 0x19, 0xa1, 0xcb, 0x0a, 0xa3, 0x1c, 0x44, 0x5c, +0x0c, 0x53, 0x38, 0xad, 0x59, 0x0a, 0xe6, 0xc3, 0x6b, 0x92, 0xbe, 0x81, +0x96, 0x7d, 0x34, 0xbd, 0xa0, 0xc2, 0x80, 0x0d, 0xbd, 0x3f, 0xa7, 0xb9, +0x73, 0x94, 0xbb, 0x6f, 0xf4, 0x3e, 0x40, 0x3a, 0x41, 0x48, 0xc8, 0x3a, +0x3a, 0x10, 0x12, 0x24, 0x9f, 0xcd, 0xb4, 0x2e, 0xdc, 0xcd, 0xb2, 0xab, +0x90, 0x87, 0x7e, 0x2b, 0x41, 0xfc, 0x93, 0x34, 0x6d, 0x51, 0x44, 0xc3, +0x8b, 0x64, 0x71, 0x31, 0xf3, 0x41, 0x31, 0x7b, 0xf6, 0xec, 0x81, 0xfe, +0x66, 0xce, 0x9c, 0x39, 0x60, 0xc0, 0x80, 0x96, 0x2d, 0x5b, 0x56, 0xab, +0x56, 0xcd, 0xd2, 0x59, 0x3c, 0x64, 0xc8, 0x10, 0xd5, 0xd2, 0xdb, 0xb2, +0x59, 0x8c, 0xde, 0x1a, 0xc6, 0x40, 0x67, 0xfa, 0x7d, 0xb9, 0x35, 0xd6, +0x0e, 0xee, 0x0e, 0xd9, 0xf1, 0x41, 0x35, 0xd6, 0x50, 0x18, 0xc3, 0x1e, +0xd8, 0xa6, 0x4d, 0x1b, 0x3f, 0x1c, 0xd6, 0x57, 0x5f, 0x7d, 0xb5, 0x6c, +0xcc, 0x13, 0x27, 0x4e, 0xf4, 0x70, 0x79, 0x7c, 0x7c, 0x7c, 0x66, 0x66, +0x66, 0x5e, 0x5e, 0x5e, 0xfd, 0xfa, 0xf5, 0x1b, 0x37, 0x6e, 0x9c, 0x9f, +0x9f, 0xdf, 0xa4, 0x49, 0x13, 0xfe, 0x6f, 0x44, 0xdb, 0xa6, 0xda, 0xb5, +0xab, 0x57, 0xaf, 0x9e, 0x98, 0x48, 0xd7, 0x03, 0xdf, 0x0e, 0x06, 0x6c, +0xd0, 0xa0, 0x01, 0x51, 0x7a, 0x45, 0x45, 0x45, 0xe3, 0xc7, 0x8f, 0xbf, +0xec, 0xb2, 0xcb, 0xc8, 0x75, 0x23, 0x1a, 0x75, 0xf8, 0xf0, 0xe1, 0x33, +0x66, 0xcc, 0x58, 0xb1, 0x62, 0x05, 0x30, 0x3e, 0x7c, 0xf8, 0x30, 0x18, +0x03, 0x4b, 0xa8, 0xe9, 0xc8, 0xa5, 0x86, 0xcd, 0x45, 0x7a, 0x9a, 0xa9, +0x96, 0x7f, 0xe2, 0x83, 0xc6, 0xd4, 0x0b, 0x02, 0xa1, 0xfe, 0xb9, 0x73, +0xe7, 0x0e, 0x1a, 0x34, 0xa8, 0x69, 0xd3, 0xa6, 0x96, 0x73, 0x23, 0x51, +0x02, 0xd6, 0xc1, 0xe5, 0xe6, 0x7e, 0x88, 0xb6, 0x50, 0xa1, 0xb7, 0x87, +0x33, 0x34, 0x83, 0xf3, 0xfa, 0xab, 0xd8, 0x79, 0xb1, 0x56, 0x9d, 0x3e, +0x7d, 0x9a, 0xad, 0x6b, 0xd2, 0xa4, 0x49, 0x85, 0x85, 0x85, 0xb5, 0x6a, +0xd5, 0x8a, 0x8b, 0x33, 0xd6, 0xfd, 0x66, 0xdd, 0x1b, 0x36, 0x6c, 0x38, +0x70, 0xe0, 0xc0, 0x95, 0x2b, 0x57, 0xb2, 0x10, 0x32, 0x63, 0x5d, 0xe6, +0xf3, 0x7a, 0xaf, 0xa0, 0x9f, 0x80, 0x51, 0x81, 0x7d, 0x85, 0x17, 0x46, +0x79, 0x87, 0x7a, 0xf5, 0xea, 0x99, 0xe7, 0x6c, 0x87, 0x0a, 0xa6, 0x4f, +0x9f, 0x0e, 0xcd, 0x89, 0xe1, 0x4f, 0x9f, 0xa1, 0x6c, 0x31, 0x6a, 0xcb, +0x40, 0x11, 0xc4, 0x80, 0x88, 0x63, 0x14, 0x63, 0x79, 0x49, 0x49, 0xc9, +0xb5, 0xd7, 0x5e, 0x0b, 0x95, 0x10, 0xc4, 0x46, 0xa6, 0x18, 0x84, 0x98, +0x94, 0x94, 0xa4, 0xdf, 0x2b, 0x23, 0x23, 0x83, 0x20, 0x7f, 0x08, 0x1a, +0x63, 0xbc, 0x6c, 0x34, 0x16, 0x31, 0xff, 0x76, 0x26, 0x77, 0xe1, 0x1c, +0xf8, 0xc6, 0xe2, 0xc5, 0x8b, 0x6d, 0x9f, 0x5e, 0x99, 0x27, 0xb2, 0x0e, +0x75, 0xeb, 0xd6, 0x05, 0x48, 0xd0, 0x09, 0x64, 0x4d, 0xd2, 0x9c, 0x02, +0x06, 0x8b, 0x89, 0x4f, 0xba, 0x4e, 0x9d, 0x3a, 0xf6, 0xe7, 0xb7, 0x6a, +0xd5, 0x2a, 0x71, 0x53, 0x18, 0x80, 0xe1, 0x33, 0x2a, 0xec, 0x34, 0xa5, +0x15, 0xd1, 0x0b, 0x3e, 0x00, 0xd0, 0x99, 0x3a, 0xf4, 0x64, 0x7f, 0xa2, +0xea, 0x4c, 0x9c, 0x8b, 0xec, 0xc4, 0x70, 0x5b, 0xc5, 0xe9, 0x6c, 0xde, +0x3a, 0x28, 0xa7, 0x31, 0x7f, 0xe4, 0x87, 0xec, 0xec, 0x6c, 0x3f, 0x66, +0x6e, 0xbe, 0x84, 0xa8, 0x4c, 0x38, 0x06, 0x2f, 0x40, 0xcd, 0x0d, 0x1b, +0x2b, 0x7b, 0xe1, 0xd0, 0xa1, 0x43, 0x3b, 0x74, 0xe8, 0xc0, 0x8b, 0x4c, +0x48, 0x48, 0xf0, 0xfb, 0x46, 0x7d, 0xfb, 0xf6, 0x45, 0x54, 0xf3, 0xfb, +0x72, 0x2e, 0x64, 0x37, 0x75, 0xb9, 0x72, 0x43, 0xf3, 0x18, 0x39, 0x72, +0xa4, 0xf8, 0x1c, 0xf0, 0x67, 0xfb, 0xfa, 0x04, 0xbc, 0x5f, 0xa8, 0x14, +0x9d, 0x9e, 0x57, 0xc3, 0xf6, 0xa4, 0xde, 0x4e, 0xf0, 0x51, 0xc1, 0x14, +0xf7, 0xee, 0xdd, 0xcb, 0xab, 0xf2, 0x75, 0x8a, 0xee, 0xce, 0x07, 0x57, +0x18, 0x9e, 0x03, 0x6c, 0xfb, 0xab, 0x1e, 0x58, 0xa4, 0x7f, 0x44, 0x4c, +0xa2, 0x0c, 0x88, 0x55, 0x60, 0x51, 0x2c, 0x7b, 0xa5, 0xc2, 0xdc, 0x10, +0x0c, 0x7c, 0x7a, 0x04, 0x67, 0x42, 0x6c, 0x7e, 0x9d, 0xf4, 0xde, 0x6d, +0x73, 0x27, 0x17, 0x35, 0x58, 0x3e, 0xb9, 0x45, 0xb5, 0xb4, 0x52, 0x89, +0x82, 0x55, 0x46, 0x4a, 0x44, 0xef, 0x14, 0x5e, 0x01, 0x11, 0xc7, 0xc4, +0xd0, 0x04, 0xa3, 0x5c, 0x8e, 0x76, 0x4d, 0xaa, 0xdf, 0x30, 0xa3, 0x8d, +0xe5, 0xcf, 0xd5, 0x53, 0x5b, 0x5e, 0x39, 0xae, 0x99, 0xfc, 0xcc, 0x1e, +0x96, 0xaf, 0x6e, 0xaf, 0xf3, 0x40, 0xa6, 0xcd, 0x69, 0xb3, 0x86, 0xe6, +0x0f, 0xed, 0x5a, 0xbb, 0x4b, 0x8b, 0x1a, 0x05, 0x75, 0xd3, 0xf3, 0xaa, +0x27, 0xa5, 0x24, 0x79, 0x6e, 0xe8, 0x71, 0x71, 0xa4, 0xd4, 0xa4, 0xf8, +0x3a, 0xd9, 0xc9, 0x1d, 0x0a, 0xb2, 0x06, 0x77, 0xae, 0x3d, 0x67, 0x44, +0x13, 0x2e, 0xe7, 0x0f, 0x19, 0xa9, 0x09, 0xd7, 0x5e, 0xd2, 0x6a, 0xc1, +0xe8, 0x02, 0x96, 0x65, 0x50, 0xe7, 0x5a, 0x9d, 0x9b, 0xd7, 0x68, 0x52, +0x37, 0xbd, 0x46, 0x86, 0x33, 0x36, 0x36, 0x68, 0x2b, 0x40, 0x49, 0x1a, +0x38, 0x2d, 0xdc, 0xc3, 0xc3, 0x82, 0xe6, 0x54, 0x73, 0x76, 0x6a, 0x96, +0x35, 0xbe, 0x4f, 0xfd, 0x25, 0x13, 0x9b, 0xeb, 0xa7, 0x11, 0x9f, 0x81, +0x0c, 0xcf, 0xab, 0xd1, 0xf7, 0xac, 0xe0, 0xa0, 0x42, 0x02, 0xa8, 0xe0, +0xe6, 0xb3, 0x66, 0xcd, 0xb2, 0xff, 0xbe, 0x59, 0xaf, 0x7a, 0xb9, 0x29, +0xf5, 0x73, 0x53, 0xf9, 0x3f, 0x3d, 0x85, 0x96, 0x43, 0x6e, 0x0f, 0xc4, +0x56, 0x64, 0x2a, 0xec, 0x09, 0xca, 0x27, 0x6f, 0x87, 0x21, 0xc8, 0xac, +0xb8, 0x8a, 0xe4, 0x12, 0x78, 0x25, 0xc2, 0x6b, 0x6e, 0x6e, 0xae, 0xf9, +0x1e, 0x6c, 0xd8, 0x67, 0xce, 0x9c, 0x41, 0x60, 0x13, 0x21, 0x47, 0x64, +0xd3, 0x32, 0xc5, 0x1c, 0xb4, 0x6b, 0x58, 0xdc, 0xf6, 0x4d, 0xaa, 0x0f, +0xeb, 0x56, 0x67, 0xee, 0x88, 0x26, 0x6b, 0x67, 0xb7, 0x3d, 0xb4, 0xb2, +0xdb, 0x43, 0x9b, 0x8b, 0xde, 0x3e, 0x3a, 0xe2, 0xff, 0x1e, 0x9c, 0xf8, +0xcd, 0x33, 0xd3, 0xf5, 0x9f, 0xec, 0x4c, 0xa7, 0xba, 0x0e, 0x25, 0x18, +0x5f, 0x12, 0xfa, 0x00, 0x83, 0xa3, 0x92, 0x22, 0x9d, 0xfb, 0x01, 0x88, +0xb4, 0xe4, 0x78, 0x59, 0xab, 0x64, 0xa7, 0x27, 0x1a, 0x5d, 0x3f, 0xa7, +0x9d, 0x61, 0x26, 0x96, 0xbf, 0x1e, 0xbf, 0xbe, 0xa7, 0x9a, 0x43, 0x56, +0x56, 0x96, 0xfa, 0x3c, 0xaa, 0x47, 0x5d, 0x77, 0x97, 0xff, 0xe9, 0xe1, +0xc9, 0x9f, 0x9d, 0x9d, 0xf4, 0x3f, 0xf7, 0x8c, 0xfb, 0xe9, 0x9d, 0x63, +0xf4, 0x9f, 0x4f, 0xef, 0x9f, 0xc8, 0xf7, 0xe6, 0xab, 0xd8, 0x20, 0x18, +0x16, 0x44, 0x79, 0x18, 0xf0, 0x67, 0x77, 0x8d, 0x7d, 0xfd, 0xd6, 0xe1, +0x4f, 0x6e, 0x1f, 0x78, 0xea, 0xa6, 0xde, 0x07, 0x57, 0x76, 0xbd, 0xe9, +0xb2, 0x76, 0xcf, 0xef, 0x19, 0xf2, 0xe0, 0xcd, 0xfd, 0x0e, 0xaf, 0xea, +0xbe, 0x69, 0x7e, 0xfb, 0x15, 0x93, 0x5b, 0xce, 0x1c, 0xda, 0x18, 0x7c, +0x82, 0xa5, 0x46, 0xb5, 0xd2, 0x40, 0x9d, 0xbb, 0x75, 0x83, 0x8e, 0x0d, +0x4f, 0xc1, 0xb5, 0xbb, 0x97, 0x74, 0x3e, 0xbb, 0xb9, 0xdf, 0xbb, 0xc7, +0x46, 0x7e, 0x71, 0x6e, 0x8a, 0x9a, 0x03, 0xb7, 0x53, 0x83, 0xa4, 0xa7, +0xa7, 0xa3, 0x84, 0xc0, 0xb7, 0xd1, 0x58, 0x20, 0x80, 0x20, 0xf3, 0x0a, +0xf8, 0xd7, 0xe8, 0xd1, 0xa3, 0x3d, 0xbc, 0x69, 0x9e, 0xa7, 0x6f, 0xfb, +0xbc, 0x65, 0x93, 0x5a, 0xf0, 0xb4, 0xcf, 0xed, 0x1e, 0xfc, 0xbf, 0xa7, +0xc7, 0x7f, 0xf5, 0xe4, 0x34, 0xc3, 0x62, 0x7d, 0xf9, 0xd8, 0xd4, 0x9f, +0xdc, 0x3e, 0xea, 0xae, 0xb5, 0xbd, 0x17, 0x8d, 0x6b, 0x56, 0x37, 0x27, +0xc5, 0x30, 0x1a, 0x0a, 0x13, 0x2c, 0x12, 0x12, 0x87, 0x64, 0xed, 0xf0, +0x0d, 0x20, 0x01, 0x2d, 0x8e, 0x1d, 0x3b, 0xd6, 0xa6, 0x32, 0x80, 0xae, +0x89, 0x16, 0x81, 0xb4, 0x86, 0x4d, 0x66, 0xe1, 0xc2, 0x85, 0xfa, 0xdd, +0x2f, 0x1f, 0xdd, 0xf4, 0x47, 0xbb, 0x07, 0xf3, 0xfe, 0xfe, 0xf6, 0xf8, +0x54, 0x3b, 0x04, 0xc7, 0x39, 0x9f, 0x3f, 0x7a, 0xb1, 0x7e, 0x84, 0x8c, +0x73, 0xea, 0xd4, 0x29, 0x74, 0x06, 0xdc, 0x49, 0x6c, 0x48, 0x47, 0x8f, +0x1e, 0xb5, 0x5c, 0x28, 0xb6, 0xcf, 0xa6, 0xf5, 0x32, 0xfa, 0xb4, 0xcb, +0x9b, 0xd8, 0xaf, 0x01, 0x2b, 0xb0, 0x6e, 0x4e, 0xbb, 0x03, 0x2b, 0xba, +0x3e, 0xb0, 0xa9, 0xdf, 0x8b, 0xfb, 0x86, 0x70, 0xeb, 0xbf, 0x3e, 0x56, +0xe6, 0xd6, 0xbf, 0xba, 0x77, 0xfc, 0x89, 0x1b, 0x7a, 0x0e, 0xe8, 0x54, +0xd3, 0x3c, 0xd4, 0xfd, 0x1b, 0xfb, 0xda, 0x99, 0xe4, 0x88, 0xee, 0xa5, +0xf2, 0x37, 0xd6, 0x02, 0x35, 0xce, 0x96, 0xcb, 0x3b, 0xda, 0xb9, 0xdc, +0xeb, 0x39, 0xac, 0x40, 0x42, 0xbc, 0x2b, 0x55, 0x93, 0xfd, 0xce, 0xeb, +0xc9, 0xea, 0x84, 0x37, 0x0e, 0x0f, 0xf7, 0x7c, 0x32, 0x44, 0xf2, 0xcb, +0x7b, 0xc6, 0xbd, 0x7a, 0x70, 0xd8, 0xc3, 0xb7, 0x14, 0xd5, 0xaa, 0x51, +0x2a, 0xf5, 0xb5, 0x6a, 0xd5, 0x4a, 0x3d, 0x02, 0xc4, 0xf6, 0xf5, 0x53, +0x97, 0xb8, 0x1b, 0x67, 0xcf, 0xd2, 0xd2, 0x34, 0x21, 0xec, 0x13, 0x0f, +0x3d, 0xf4, 0x10, 0x41, 0x2b, 0xb8, 0xf9, 0xb0, 0xb3, 0x05, 0x0d, 0x15, +0xe2, 0x05, 0x47, 0x29, 0xb4, 0x7c, 0xd3, 0x5d, 0x5b, 0x66, 0xf3, 0x76, +0x5f, 0xde, 0x3f, 0xd4, 0x8c, 0x01, 0xcf, 0x0f, 0xcf, 0xf9, 0xa7, 0xd7, +0xf7, 0x69, 0xdd, 0xa8, 0x9a, 0x3e, 0x2c, 0x4f, 0x0e, 0xe1, 0xc2, 0xec, +0x64, 0x53, 0x37, 0xb3, 0x0b, 0x99, 0x0c, 0xbb, 0x32, 0xfa, 0xba, 0xbe, +0x73, 0xd8, 0xdc, 0x98, 0x5b, 0xb4, 0x68, 0x41, 0xcc, 0x0c, 0xba, 0x90, +0x7e, 0xfe, 0xe8, 0x9e, 0x75, 0x3d, 0x2c, 0xb1, 0xbb, 0xa7, 0xe0, 0x91, +0xd5, 0x20, 0x98, 0xa7, 0x50, 0xa0, 0x09, 0xec, 0x81, 0x53, 0xc3, 0x28, +0xf4, 0xb5, 0xba, 0x74, 0x70, 0xe3, 0x1f, 0x1f, 0x1c, 0xc6, 0xee, 0xfb, +0xf7, 0x27, 0x8c, 0x7b, 0x84, 0x4d, 0x4a, 0x3a, 0xb3, 0xa1, 0xaf, 0x81, +0xcd, 0xfe, 0xf4, 0xae, 0x31, 0x5e, 0xaf, 0x85, 0xb3, 0xc5, 0xc7, 0x95, +0x0a, 0x30, 0xa9, 0xa9, 0xa9, 0x6a, 0xb6, 0xcc, 0xdc, 0xeb, 0xe5, 0x76, +0x4e, 0x80, 0x6a, 0x65, 0x4c, 0xa0, 0x6e, 0xe7, 0x7c, 0x39, 0x07, 0x8e, +0x61, 0xff, 0x64, 0xb6, 0x0c, 0xcb, 0x37, 0xdb, 0xab, 0x4d, 0xae, 0x87, +0x41, 0xa6, 0x0f, 0x6a, 0xa4, 0xae, 0x42, 0x27, 0x41, 0x4c, 0xc0, 0x94, +0x8c, 0x20, 0xcd, 0xab, 0x09, 0x1a, 0x2a, 0xa0, 0x42, 0xc2, 0x3f, 0x0d, +0x93, 0x43, 0xbc, 0x86, 0xfd, 0xfd, 0xe2, 0xd4, 0x38, 0xfb, 0x4f, 0x68, +0x79, 0x26, 0xe4, 0xb8, 0xfa, 0xd2, 0xd6, 0xfa, 0xe0, 0x37, 0xde, 0x78, +0x23, 0xc0, 0x80, 0xd9, 0xe9, 0xba, 0x91, 0x32, 0x1f, 0x63, 0xbc, 0x9b, +0x37, 0x6f, 0x9e, 0x67, 0x0c, 0x20, 0x7e, 0xf0, 0x9e, 0x58, 0xb8, 0x91, +0x3d, 0xea, 0x76, 0x6c, 0x5a, 0x2a, 0x39, 0xc8, 0x55, 0xed, 0xda, 0xb5, +0xd3, 0xa5, 0x2c, 0x1e, 0xe4, 0x8f, 0x0f, 0x4d, 0xf6, 0xe3, 0x29, 0x76, +0x5d, 0x55, 0xba, 0x21, 0x61, 0xc1, 0xa4, 0x66, 0x04, 0x81, 0x7d, 0x12, +0xa7, 0xa9, 0x4f, 0x0f, 0x48, 0xf8, 0x31, 0xb8, 0xe1, 0x12, 0x78, 0x6f, +0xdc, 0x0f, 0x32, 0x3a, 0x08, 0xf9, 0xe7, 0xd3, 0x6e, 0xb7, 0x49, 0x75, +0x21, 0x82, 0x9f, 0x0e, 0x5a, 0xf5, 0x19, 0x99, 0xd6, 0xd7, 0xfd, 0xcb, +0xdd, 0xfc, 0xd1, 0xac, 0x64, 0x58, 0x98, 0x92, 0xcd, 0x67, 0x84, 0x01, +0xde, 0x76, 0x5d, 0x0f, 0x9b, 0x27, 0xcb, 0x69, 0x97, 0x0c, 0x2c, 0x25, +0x71, 0xf5, 0x14, 0x68, 0x0e, 0x1e, 0x06, 0xe1, 0x9d, 0xaa, 0x33, 0x11, +0x0a, 0x10, 0xbd, 0x30, 0xfb, 0x62, 0xf2, 0x46, 0xe1, 0x0c, 0x0e, 0x2a, +0xd8, 0x9b, 0xd9, 0xb6, 0xaf, 0xb8, 0xe2, 0x0a, 0x75, 0x9b, 0x96, 0x0d, +0x33, 0x91, 0xe4, 0xfc, 0xd8, 0x5c, 0x3d, 0x3c, 0xc6, 0xb4, 0x01, 0x0d, +0xd5, 0xf8, 0x98, 0xb7, 0x09, 0x5c, 0x33, 0x48, 0x81, 0x4c, 0x03, 0x06, +0xb2, 0x74, 0xe9, 0x52, 0x77, 0x78, 0x68, 0x5c, 0x3b, 0x6d, 0xe1, 0xd8, +0xa6, 0x77, 0xde, 0xd8, 0x0b, 0x69, 0xd8, 0x40, 0x34, 0x2f, 0xed, 0x1b, +0x6a, 0xc6, 0x86, 0x8c, 0x03, 0xa9, 0xf9, 0x4d, 0xb5, 0xe3, 0x7a, 0x97, +0x9a, 0xdd, 0x30, 0x3c, 0xe0, 0x3c, 0x82, 0x4d, 0x13, 0x12, 0x87, 0xc9, +0x55, 0x4d, 0x92, 0xd7, 0x63, 0x87, 0x82, 0xed, 0x50, 0xc9, 0xe2, 0xf1, +0xcd, 0x64, 0xd8, 0x6e, 0x2d, 0xb3, 0xed, 0x9c, 0xdf, 0xbf, 0x63, 0xa9, +0xe8, 0xd5, 0xb1, 0x63, 0xc7, 0xd2, 0xbd, 0xd3, 0xbd, 0x52, 0x61, 0x67, +0x58, 0xfd, 0x1c, 0x94, 0x7e, 0x19, 0x96, 0x7d, 0xcd, 0xe6, 0xb5, 0x3b, +0xae, 0x2c, 0xfc, 0xe8, 0xc4, 0x68, 0x9b, 0x27, 0xcb, 0x69, 0xbf, 0x7f, +0x60, 0x22, 0xc6, 0x00, 0xc3, 0x7b, 0x47, 0x65, 0x72, 0x37, 0xc8, 0xef, +0xee, 0x9f, 0xa0, 0x9f, 0x8c, 0x49, 0x1a, 0xd7, 0x13, 0xbc, 0x02, 0xe1, +0x36, 0x38, 0xbc, 0x42, 0xe9, 0xb2, 0x35, 0x6b, 0x96, 0x2e, 0xf1, 0xbd, +0xeb, 0xfb, 0xf8, 0xf4, 0x54, 0x76, 0x4e, 0x46, 0x09, 0x11, 0x09, 0x55, +0x0e, 0xdc, 0xa5, 0xc4, 0xa8, 0x81, 0x6c, 0x65, 0xfb, 0xa7, 0x07, 0x87, +0xa5, 0xfe, 0x8a, 0xbe, 0xcb, 0x8e, 0xf5, 0xa6, 0x0d, 0x51, 0x15, 0xbe, +0x61, 0x46, 0xd4, 0x8d, 0xb3, 0xda, 0xda, 0x99, 0x9e, 0xf9, 0x1c, 0xd4, +0x0f, 0x5d, 0xaa, 0xc1, 0xbe, 0x8c, 0x1d, 0x1d, 0x09, 0x0a, 0x3c, 0xf7, +0xef, 0xdf, 0x5f, 0xdd, 0xc8, 0x3e, 0xb9, 0x78, 0x9d, 0xc6, 0x6b, 0x87, +0x86, 0xc9, 0xb0, 0xd8, 0x00, 0xbc, 0x9e, 0xfc, 0x9b, 0x33, 0x13, 0x74, +0x03, 0x98, 0x6e, 0x6a, 0x43, 0x3d, 0xf5, 0x7a, 0xb9, 0x9d, 0x13, 0x74, +0xe2, 0xb3, 0xa9, 0xe7, 0x30, 0xec, 0x84, 0xbe, 0xf5, 0xfd, 0xd8, 0x26, +0x90, 0xb4, 0x0d, 0xef, 0x0e, 0xed, 0xd4, 0xdd, 0x24, 0x99, 0x8c, 0x3a, +0x19, 0xba, 0xc5, 0x85, 0x4f, 0xf2, 0x16, 0xaf, 0x06, 0x01, 0x04, 0xdd, +0x38, 0x08, 0xbc, 0x42, 0x92, 0x93, 0x10, 0xcb, 0xd4, 0x6d, 0xe0, 0xbf, +0x28, 0x43, 0x76, 0x56, 0xcd, 0xd7, 0x73, 0x30, 0xa8, 0xa9, 0xbb, 0x4c, +0x9d, 0x3a, 0x95, 0x4d, 0x97, 0xf8, 0x47, 0x34, 0x63, 0x18, 0x1f, 0x2e, +0x36, 0x33, 0x41, 0x37, 0xab, 0x9f, 0x81, 0x5a, 0x6f, 0x7f, 0x32, 0x7f, +0x79, 0x64, 0x4a, 0xfd, 0xbc, 0x52, 0xd9, 0x9a, 0x01, 0x5b, 0x34, 0xc8, +0xb4, 0xaf, 0x5b, 0x1b, 0x1e, 0x47, 0x97, 0x77, 0x09, 0xd3, 0xdf, 0xb8, +0x71, 0x23, 0x1e, 0x4c, 0xa9, 0x96, 0xa2, 0x4f, 0x15, 0xcb, 0x95, 0xaf, +0xeb, 0xe0, 0xee, 0x7c, 0xd4, 0x12, 0x19, 0x79, 0xe7, 0x55, 0x85, 0x5e, +0xc7, 0xe4, 0x1c, 0x35, 0x0d, 0x2a, 0xd4, 0xeb, 0x53, 0x42, 0xad, 0xf7, +0x7a, 0xb9, 0x9d, 0x13, 0x4e, 0xae, 0xe9, 0xa5, 0x86, 0x65, 0x3b, 0xb7, +0x73, 0x09, 0xea, 0x10, 0xe2, 0x90, 0x9d, 0x33, 0xcd, 0xe7, 0x4c, 0xea, +0xd7, 0x40, 0xdd, 0x8e, 0xfd, 0xc8, 0x83, 0xa8, 0x82, 0x8d, 0x58, 0x9d, +0x89, 0x37, 0x19, 0x27, 0x20, 0x6e, 0x53, 0xbc, 0x49, 0x98, 0x07, 0x83, +0x63, 0x83, 0x42, 0xb2, 0xc7, 0x5c, 0x83, 0xe3, 0x56, 0xdd, 0x66, 0xc6, +0x90, 0xc6, 0xfe, 0x3d, 0x95, 0xd7, 0xab, 0x8e, 0x5e, 0xdb, 0x5d, 0xdd, +0x05, 0x9d, 0x9b, 0x44, 0x13, 0xf0, 0x00, 0xa9, 0xe9, 0x6c, 0x4a, 0x4e, +0x68, 0x58, 0x2b, 0x0d, 0x06, 0xea, 0x87, 0x08, 0x07, 0x8a, 0x74, 0xfa, +0x78, 0xaa, 0x64, 0xa0, 0xd7, 0x59, 0xb9, 0x3b, 0x81, 0x3d, 0x4f, 0x0d, +0x85, 0x17, 0x96, 0xf2, 0x28, 0x38, 0x28, 0x08, 0x28, 0x42, 0x29, 0x52, +0xdf, 0x23, 0x6a, 0x9a, 0x2f, 0x87, 0xd3, 0xee, 0x5d, 0xd6, 0xe5, 0xad, +0x23, 0x3e, 0xa3, 0x05, 0x65, 0x40, 0x46, 0x7e, 0x72, 0x87, 0xf7, 0x69, +0xf7, 0x68, 0x5d, 0xda, 0x9c, 0x04, 0xca, 0x28, 0x9d, 0x6a, 0x93, 0xea, +0x7e, 0x3f, 0xb2, 0xe1, 0x42, 0xdc, 0x1d, 0x32, 0x2c, 0xf6, 0x12, 0x9b, +0x63, 0xa2, 0x88, 0xf2, 0x0a, 0x6c, 0x9e, 0x6c, 0x38, 0x0d, 0xd6, 0xa4, +0xec, 0xe0, 0x18, 0xf1, 0x3c, 0x0c, 0x82, 0x21, 0x54, 0x3d, 0x2f, 0xfb, +0x29, 0x3c, 0x9c, 0xad, 0x0a, 0x6f, 0x98, 0x44, 0xe5, 0x04, 0x81, 0x57, +0x60, 0x64, 0x44, 0x9a, 0x27, 0xf4, 0x40, 0xdd, 0xe6, 0x91, 0x2d, 0xfd, +0xfd, 0x7b, 0x2a, 0xaf, 0x57, 0x7d, 0x70, 0x7c, 0x94, 0xba, 0x0b, 0x77, +0xc4, 0x07, 0x47, 0xe4, 0x99, 0x4e, 0xc4, 0x7c, 0x4e, 0x4a, 0x8c, 0xc3, +0x54, 0x6f, 0x9f, 0x3f, 0x18, 0x6e, 0x8a, 0xe9, 0x53, 0x99, 0xc3, 0xd1, +0x0a, 0xbc, 0x4e, 0xc9, 0xdd, 0x09, 0xbf, 0xbd, 0x6f, 0x82, 0x2e, 0xef, +0xe1, 0xc0, 0x41, 0xe4, 0x23, 0x19, 0x9a, 0x0d, 0x49, 0xef, 0x0a, 0x82, +0x61, 0xde, 0x30, 0x02, 0xc2, 0x43, 0xed, 0x1f, 0x4c, 0x8d, 0x37, 0xcf, +0xef, 0xe0, 0xd3, 0x04, 0xd0, 0x97, 0x64, 0x35, 0xb8, 0xbb, 0xe7, 0x0b, +0x7f, 0x7e, 0xf7, 0x58, 0x7d, 0xdd, 0xf4, 0xf6, 0x3d, 0xbe, 0xde, 0xd4, +0xdd, 0x8d, 0x78, 0x10, 0x65, 0x58, 0xbf, 0x6a, 0x82, 0x27, 0xc5, 0x57, +0x1f, 0x01, 0x2f, 0x10, 0xa2, 0xb2, 0x4f, 0x4f, 0xad, 0x9f, 0x8c, 0xd2, +0x28, 0xcf, 0x85, 0xf5, 0xdf, 0xdd, 0x20, 0xec, 0x1d, 0xba, 0xc7, 0x83, +0xd8, 0x02, 0x24, 0x1d, 0xc4, 0x27, 0x76, 0x58, 0x94, 0x0a, 0x04, 0x9f, +0x20, 0xa0, 0x02, 0xd7, 0x01, 0x31, 0x58, 0x6a, 0x89, 0x01, 0xeb, 0x3f, +0x4c, 0x2e, 0x08, 0xbf, 0x1f, 0xd2, 0x70, 0x21, 0x23, 0xeb, 0xa2, 0xb0, +0xd9, 0x10, 0x8c, 0x4d, 0xc9, 0x57, 0x45, 0xcd, 0x3c, 0xb7, 0x21, 0x5d, +0x5c, 0xce, 0x6c, 0x7c, 0xae, 0x80, 0xd0, 0xef, 0x99, 0x6f, 0x98, 0xdb, +0x5e, 0xad, 0x09, 0xce, 0x47, 0x18, 0x05, 0x06, 0x28, 0x49, 0xa8, 0xd7, +0xc9, 0xf1, 0xc3, 0x3b, 0x8c, 0x6a, 0x25, 0x36, 0x78, 0x75, 0x42, 0x9b, +0xc6, 0x76, 0xb7, 0x58, 0x99, 0xe7, 0xed, 0xab, 0x5d, 0x05, 0xe4, 0x79, +0x05, 0x5e, 0xa7, 0xbd, 0x79, 0x41, 0x07, 0x75, 0x17, 0xdd, 0xda, 0xc6, +0xf2, 0x62, 0x20, 0xf6, 0x7a, 0xb9, 0x9d, 0x13, 0xde, 0x39, 0x36, 0x52, +0xdd, 0x02, 0x17, 0xa7, 0x9d, 0x4b, 0xde, 0xbf, 0x7d, 0x14, 0xda, 0xb9, +0x9d, 0x33, 0x3d, 0x9c, 0x33, 0xf6, 0x82, 0x85, 0x03, 0x37, 0x8e, 0xbb, +0x73, 0x74, 0xff, 0x1d, 0x11, 0x2e, 0xa8, 0xda, 0xc4, 0xf0, 0x62, 0xb7, +0x24, 0x80, 0xd7, 0x60, 0xd5, 0xf4, 0xdf, 0xb7, 0x0d, 0xbc, 0x74, 0x99, +0x1e, 0x97, 0x7e, 0x80, 0x4f, 0xe5, 0xf9, 0x72, 0x9c, 0x5c, 0x06, 0xe6, +0x20, 0xbf, 0xf2, 0x3a, 0xd9, 0x77, 0x83, 0x62, 0x4f, 0xc4, 0x1b, 0xca, +0x80, 0x38, 0x53, 0xfd, 0x7e, 0x10, 0xe4, 0x7b, 0x42, 0x1e, 0xd4, 0x3c, +0xfb, 0xf5, 0xeb, 0xb7, 0x6f, 0xdf, 0x3e, 0x09, 0xc9, 0xbe, 0xe6, 0x9a, +0x6b, 0xd4, 0xf7, 0xc4, 0x44, 0x98, 0x6f, 0x81, 0xa7, 0x5c, 0x9d, 0x80, +0xa0, 0xec, 0xd3, 0x1c, 0xc4, 0xe4, 0xe5, 0x59, 0x78, 0x90, 0x01, 0xb9, +0xb5, 0xba, 0x8b, 0x1e, 0x71, 0xe8, 0xc1, 0xa5, 0xed, 0xd3, 0x4c, 0x38, +0xf9, 0x96, 0xcb, 0x2f, 0x02, 0x0f, 0xee, 0xad, 0x3b, 0x95, 0x3d, 0x8c, +0x73, 0xc3, 0xcc, 0x36, 0xd7, 0xdb, 0x36, 0x55, 0xb9, 0x1b, 0xe7, 0xd7, +0x67, 0xc6, 0x57, 0x4f, 0x4f, 0xf4, 0xb0, 0x39, 0xea, 0xfe, 0x3b, 0xcc, +0xe5, 0x94, 0x22, 0xc7, 0x2f, 0x8c, 0x13, 0x89, 0x78, 0x6d, 0x83, 0x07, +0xcc, 0x4f, 0x54, 0x60, 0xff, 0x21, 0xf2, 0xc4, 0xe9, 0x2c, 0xa5, 0xd4, +0xa7, 0x77, 0x0e, 0xf2, 0x75, 0xf9, 0x7c, 0x3a, 0xdf, 0xec, 0xed, 0xe6, +0xed, 0xb2, 0x0a, 0x8f, 0x6d, 0x1b, 0xe0, 0xd3, 0x38, 0x1e, 0x4e, 0x46, +0x84, 0x00, 0x63, 0x81, 0xf0, 0x1c, 0xd9, 0xb3, 0xd5, 0x41, 0xdc, 0x2b, +0xfa, 0x1c, 0xa1, 0xfc, 0x58, 0xc4, 0x89, 0x02, 0x54, 0xdf, 0xb3, 0x61, +0x9b, 0xa7, 0x21, 0x51, 0x43, 0x1c, 0x44, 0x76, 0x78, 0xb0, 0xa2, 0x98, +0x2f, 0x64, 0x8f, 0x17, 0x97, 0x1c, 0x1e, 0x71, 0xcf, 0x4b, 0xa1, 0x0b, +0xa2, 0x86, 0x2d, 0xc6, 0x8e, 0x42, 0x62, 0x73, 0x9d, 0xfb, 0x75, 0xb8, +0x28, 0xbb, 0x13, 0x17, 0x63, 0xf3, 0x12, 0x3c, 0x48, 0x7e, 0x1b, 0xc1, +0xf5, 0x5b, 0x60, 0xe7, 0xf0, 0x60, 0xc5, 0xd2, 0xfd, 0x77, 0x84, 0xff, +0x20, 0xd9, 0x52, 0xd0, 0x04, 0xeb, 0x13, 0xfb, 0xbb, 0x84, 0x33, 0x07, +0x24, 0x41, 0x89, 0x4d, 0xf6, 0xd6, 0x5b, 0x6f, 0x55, 0x2b, 0xcb, 0x06, +0xe9, 0x87, 0x82, 0x6b, 0x73, 0xc9, 0xe4, 0xb4, 0x9a, 0x59, 0x46, 0xb3, +0x34, 0x81, 0x31, 0x3e, 0x89, 0x3a, 0x68, 0x0e, 0x18, 0x5b, 0xf1, 0x4e, +0x10, 0x49, 0x61, 0x79, 0x6b, 0x14, 0x3e, 0xa2, 0x2d, 0x7c, 0x9a, 0x95, +0x7e, 0x32, 0xef, 0x03, 0xc9, 0x47, 0xad, 0x09, 0x7a, 0x36, 0xf9, 0x3d, +0xc4, 0x7a, 0x10, 0x7f, 0xa6, 0x5b, 0xea, 0x38, 0xc1, 0x6c, 0xea, 0x41, +0x1f, 0x90, 0x0b, 0x89, 0x1a, 0x7a, 0x62, 0xbb, 0x6f, 0x38, 0xbf, 0x62, +0x4c, 0x53, 0xb9, 0x96, 0x38, 0x22, 0xcf, 0x93, 0xe7, 0xf1, 0x0d, 0x60, +0x90, 0x5f, 0x6d, 0x7a, 0x39, 0xec, 0xac, 0x0c, 0x4e, 0x4f, 0xe5, 0x35, +0xdf, 0xb7, 0xac, 0x8b, 0x9d, 0x4b, 0x30, 0x2b, 0x63, 0x00, 0xf4, 0xc3, +0x26, 0x6b, 0x67, 0x70, 0xfd, 0x1c, 0xa2, 0x12, 0xd5, 0xe3, 0xcf, 0x9e, +0x3d, 0xfb, 0xc8, 0x91, 0x23, 0xec, 0x56, 0x30, 0x0a, 0x74, 0x01, 0x43, +0x84, 0xa8, 0x3f, 0xbc, 0x42, 0x2a, 0xa9, 0xe9, 0xc2, 0xfd, 0xd2, 0x89, +0x6e, 0x55, 0x1c, 0x5f, 0xa7, 0xee, 0xee, 0x7c, 0x43, 0xd8, 0x26, 0xc6, +0x0d, 0x38, 0xa6, 0xfd, 0xc1, 0x89, 0x6c, 0xe3, 0xdd, 0xcb, 0xa2, 0xf0, +0x0e, 0x2c, 0x2f, 0x44, 0x82, 0x22, 0xe8, 0xc8, 0xfe, 0x98, 0x86, 0x33, +0x71, 0x5f, 0xea, 0x34, 0x37, 0x7f, 0xfe, 0x7c, 0x78, 0x34, 0x81, 0x89, +0xe4, 0x03, 0xe9, 0xd9, 0x0b, 0xdd, 0x5b, 0xe5, 0x98, 0x6f, 0x71, 0xe4, +0x1a, 0x97, 0x05, 0x0c, 0x6f, 0x23, 0xb2, 0xaf, 0x4f, 0x13, 0xe0, 0x7c, +0x15, 0x7c, 0xea, 0x35, 0x58, 0xa3, 0x79, 0xfd, 0x52, 0xd3, 0x88, 0x3e, +0xd5, 0x20, 0x32, 0x8a, 0xbb, 0xd7, 0xf6, 0x56, 0x23, 0xdb, 0xd4, 0x9e, +0x57, 0x4e, 0x69, 0x89, 0x5b, 0xc9, 0xa7, 0xa7, 0xf6, 0xe3, 0x64, 0x42, +0x18, 0xf5, 0x47, 0x26, 0xdf, 0x10, 0xad, 0x18, 0xff, 0x9d, 0x21, 0x5a, +0x56, 0xd8, 0x85, 0xcf, 0xa8, 0x00, 0x55, 0x40, 0x02, 0x77, 0x81, 0x7e, +0x8f, 0x57, 0x0e, 0xd8, 0x0d, 0x9e, 0x61, 0x9b, 0x24, 0x74, 0x07, 0x19, +0x1a, 0x51, 0x18, 0xbe, 0x09, 0x7c, 0x09, 0x69, 0xf6, 0x1a, 0x55, 0x81, +0x3f, 0x41, 0xbf, 0x1d, 0x90, 0xe0, 0x21, 0xed, 0x2f, 0x0d, 0x7c, 0x0c, +0x6e, 0xae, 0x46, 0x70, 0xa7, 0xd8, 0x05, 0x68, 0x84, 0xd1, 0x2d, 0x9e, +0x88, 0xad, 0x64, 0x84, 0xb2, 0x1b, 0xa1, 0x67, 0x63, 0xf8, 0xd3, 0x63, +0xd7, 0xf0, 0xe0, 0x9a, 0x67, 0x4e, 0x94, 0x35, 0xc6, 0x13, 0x1e, 0xd3, +0xfe, 0x43, 0x71, 0x26, 0xdc, 0x4f, 0x71, 0x27, 0x3c, 0xf1, 0x86, 0x08, +0x42, 0xc3, 0x50, 0x2c, 0x02, 0x0e, 0x4d, 0x89, 0x75, 0x25, 0x18, 0x87, +0x28, 0x57, 0x7e, 0x7c, 0xbd, 0xa3, 0xd7, 0xe9, 0x11, 0xd9, 0x25, 0xeb, +0x8c, 0x40, 0xe8, 0xf5, 0x64, 0x4e, 0x80, 0x45, 0x10, 0x08, 0x6c, 0x9f, +0x7e, 0xec, 0x8c, 0x69, 0x79, 0x8e, 0xee, 0x44, 0xc2, 0xcc, 0x40, 0xc6, +0x2c, 0x96, 0x7d, 0x0c, 0x50, 0x92, 0x7c, 0x6b, 0x88, 0xa9, 0xf3, 0x07, +0x15, 0xd8, 0x64, 0x51, 0x22, 0x15, 0x91, 0xb1, 0xc3, 0xd9, 0x64, 0x7f, +0x98, 0x4d, 0xd1, 0xc0, 0xcc, 0x4c, 0x9c, 0xdd, 0xc2, 0xf3, 0xd3, 0xea, +0x66, 0x0d, 0x02, 0x25, 0xf0, 0xce, 0xfa, 0xb4, 0x3a, 0xba, 0x9a, 0xc5, +0xdd, 0xc9, 0x1f, 0xb0, 0xbc, 0x3c, 0x90, 0x2d, 0x93, 0x6b, 0xf5, 0xe7, +0xc2, 0xd5, 0x48, 0x70, 0x07, 0x8b, 0x8b, 0x39, 0x9c, 0x22, 0x7f, 0xea, +0x4f, 0xe8, 0x2d, 0x44, 0xfb, 0x98, 0xef, 0xfe, 0xb1, 0x8f, 0x91, 0x0e, +0x32, 0xc2, 0x65, 0xc3, 0x9b, 0xa8, 0x91, 0xdb, 0xe6, 0x07, 0x6a, 0xc3, +0xf1, 0x69, 0x49, 0x2d, 0x4f, 0xc6, 0xe6, 0xa1, 0xfc, 0x06, 0x88, 0xa3, +0x76, 0x06, 0x24, 0x18, 0x99, 0x9d, 0xd1, 0x26, 0xfd, 0xd8, 0x19, 0xd0, +0xdd, 0x39, 0xba, 0xff, 0x8e, 0x66, 0x2e, 0x07, 0x0f, 0x1e, 0x84, 0x8d, +0xe3, 0x44, 0x92, 0x34, 0xc9, 0x80, 0x50, 0x21, 0x1a, 0x05, 0xda, 0x09, +0xc9, 0xca, 0xea, 0x7d, 0x5c, 0x37, 0xdd, 0x6e, 0xa0, 0x8b, 0x81, 0x74, +0xd4, 0x08, 0xf3, 0x46, 0x7a, 0xb1, 0x5f, 0xdd, 0xb3, 0xee, 0xa2, 0x57, +0x9f, 0x45, 0xf7, 0x95, 0x80, 0xd8, 0x41, 0x73, 0xab, 0x95, 0xea, 0x24, +0xd0, 0xa5, 0xd9, 0x2a, 0xca, 0x52, 0x12, 0x46, 0x1a, 0xc8, 0xc6, 0xa9, +0xbb, 0x87, 0x48, 0x65, 0xa6, 0x9a, 0x01, 0x11, 0xe3, 0xb8, 0x29, 0x08, +0x7f, 0x22, 0x8f, 0x54, 0x3d, 0x29, 0xa7, 0x05, 0xf2, 0x6a, 0xf5, 0x6b, +0xb7, 0x5e, 0x51, 0x1a, 0xbf, 0xc4, 0xf8, 0x76, 0x62, 0x3d, 0x82, 0x75, +0x6b, 0x77, 0xe3, 0x3c, 0xbb, 0xcb, 0xd5, 0x4c, 0x48, 0x0e, 0x9b, 0x46, +0x0b, 0x2c, 0x04, 0x08, 0x0e, 0xe5, 0x3d, 0x31, 0xc6, 0xd7, 0x5f, 0xd0, +0x84, 0x09, 0x13, 0x30, 0x97, 0x63, 0x80, 0xc2, 0x2c, 0x6b, 0x19, 0x69, +0xea, 0x1b, 0xaf, 0x90, 0x3c, 0x63, 0xb2, 0x34, 0xf4, 0x7d, 0x91, 0x8d, +0xdc, 0xe6, 0x53, 0x19, 0x02, 0x60, 0xd5, 0x20, 0x24, 0x9d, 0x78, 0x1e, +0x01, 0xb3, 0x1d, 0x27, 0xa3, 0xc6, 0x3d, 0xe3, 0xbb, 0xa5, 0x4b, 0x4f, +0xaf, 0x61, 0x10, 0x77, 0x0e, 0x78, 0xcf, 0xe2, 0x87, 0xe7, 0xe9, 0x31, +0x2b, 0x7d, 0x41, 0xf0, 0xf7, 0x53, 0xeb, 0xe0, 0xde, 0x7b, 0xef, 0xa5, +0x7c, 0x2a, 0xbb, 0x91, 0x9e, 0xbd, 0xb0, 0x7f, 0xb9, 0x2d, 0x05, 0xd4, +0xeb, 0x7a, 0x1e, 0x5e, 0x55, 0x1a, 0xf4, 0x2a, 0xb7, 0xf6, 0xdb, 0x31, +0xec, 0xf5, 0x5e, 0xf6, 0x4f, 0x40, 0x08, 0x94, 0xc9, 0xe0, 0x92, 0xb3, +0x73, 0x15, 0xbc, 0x85, 0x1c, 0x09, 0x24, 0x3a, 0x3b, 0x27, 0x07, 0x72, +0x8e, 0xc1, 0x7f, 0x87, 0x95, 0x1c, 0x2b, 0x08, 0xf9, 0x46, 0x64, 0x5c, +0xe2, 0xd2, 0x36, 0xc7, 0x5f, 0xfb, 0x86, 0x0a, 0x89, 0x7d, 0xa2, 0xf2, +0x82, 0x22, 0x82, 0x56, 0xb6, 0x5d, 0xfa, 0x3c, 0x95, 0xd2, 0x77, 0x75, +0x1a, 0xb2, 0xe3, 0xe8, 0x18, 0x58, 0x58, 0x8b, 0x4b, 0x2c, 0x25, 0x72, +0xaf, 0x8b, 0xa5, 0xc7, 0x5f, 0x10, 0x5f, 0xe9, 0xce, 0xfb, 0xeb, 0x77, +0x86, 0x03, 0x13, 0x28, 0xd2, 0x42, 0x50, 0x49, 0x52, 0xa7, 0xba, 0x0c, +0x9a, 0x1c, 0x19, 0xb0, 0xd4, 0x4b, 0xc5, 0x59, 0xa1, 0x1e, 0x16, 0xd1, +0xdf, 0x27, 0x75, 0xc8, 0xdd, 0xa3, 0x61, 0xdb, 0xd1, 0x17, 0x50, 0x3e, +0x5b, 0x32, 0x40, 0xaf, 0x8b, 0x13, 0xc4, 0x13, 0x90, 0x82, 0xb0, 0x0a, +0xca, 0x64, 0x36, 0xce, 0xb3, 0x25, 0x3e, 0x3d, 0x5e, 0x3c, 0xc0, 0x8e, +0x8f, 0x25, 0xf0, 0x49, 0x92, 0xcc, 0xa4, 0x56, 0x8c, 0xc8, 0x34, 0x6c, +0xb2, 0xc4, 0xe0, 0xbc, 0xfa, 0xea, 0xab, 0x38, 0x2b, 0x50, 0x07, 0xcc, +0xb9, 0x3a, 0xbe, 0xa1, 0x42, 0x62, 0x9f, 0xf4, 0xec, 0x4d, 0x9b, 0xf9, +0x90, 0x3c, 0x18, 0x56, 0x20, 0x95, 0x06, 0xa0, 0xa6, 0x48, 0x76, 0xaf, +0x57, 0x07, 0x1c, 0x51, 0x7a, 0x18, 0xa0, 0xc8, 0xfe, 0xf1, 0x4f, 0xfa, +0x54, 0xf6, 0x38, 0xbc, 0xfd, 0x2f, 0xec, 0xb5, 0x36, 0x31, 0x21, 0x3e, +0xf9, 0x6d, 0x59, 0x46, 0x32, 0xd6, 0x69, 0x94, 0x6e, 0x69, 0x62, 0x7a, +0x92, 0x62, 0x2d, 0x7a, 0x98, 0x3d, 0xd9, 0xcc, 0x01, 0xbe, 0x60, 0xd6, +0x0a, 0x1d, 0xcc, 0x0c, 0x09, 0x76, 0x5c, 0xff, 0x16, 0x27, 0xc0, 0xf9, +0xe8, 0x97, 0xeb, 0x94, 0xf7, 0xc9, 0x49, 0x5b, 0xdb, 0x3f, 0x7a, 0x11, +0xc6, 0xb7, 0x20, 0xce, 0xc1, 0xdd, 0x50, 0x44, 0x97, 0xa9, 0x45, 0x6b, +0xd6, 0xac, 0x19, 0xc2, 0x2d, 0x29, 0xfb, 0x44, 0xd3, 0x11, 0x40, 0xae, +0xfb, 0xef, 0xbc, 0xd7, 0x0e, 0xb4, 0x4c, 0x8c, 0xc6, 0xfa, 0x44, 0x38, +0xb4, 0xfe, 0x56, 0xec, 0x4b, 0xf9, 0x86, 0xcc, 0x29, 0x5c, 0x1c, 0x1e, +0x9c, 0xf3, 0xfa, 0xe3, 0xb1, 0xa3, 0xa0, 0x18, 0x10, 0x01, 0xe6, 0xdf, +0xf2, 0x61, 0x09, 0x65, 0xc2, 0xd8, 0x6a, 0x3c, 0x44, 0xdd, 0xf9, 0x6a, +0x0f, 0xd5, 0x67, 0x22, 0x71, 0x22, 0x72, 0xc0, 0x28, 0x28, 0x0a, 0xc6, +0xa2, 0xe3, 0x1e, 0xc2, 0xbe, 0x41, 0xc5, 0x5f, 0x4a, 0x27, 0xa9, 0xbf, +0x06, 0x48, 0x01, 0xa8, 0xe9, 0x3a, 0x53, 0xd2, 0xdf, 0xc2, 0xd4, 0x01, +0x0d, 0xfd, 0x5b, 0x9c, 0x20, 0x5e, 0x25, 0x52, 0x2e, 0x87, 0x4d, 0xeb, +0x13, 0x9b, 0x1d, 0x26, 0x72, 0x4b, 0x5d, 0xee, 0xcf, 0x8f, 0x4c, 0x0e, +0xae, 0x58, 0x75, 0xe9, 0xe0, 0xd2, 0xe4, 0x24, 0x2a, 0x44, 0x11, 0x14, +0x88, 0x09, 0x04, 0x4a, 0xc6, 0x94, 0x2a, 0x65, 0x6f, 0x54, 0xe2, 0x9a, +0x3f, 0x96, 0x59, 0x82, 0xb7, 0x31, 0x38, 0xaa, 0xf7, 0x51, 0xd8, 0xcc, +0x96, 0xf5, 0x4d, 0x96, 0x9e, 0x0c, 0x29, 0x5c, 0xd1, 0x64, 0x66, 0xa1, +0x5d, 0xa1, 0x3d, 0xdb, 0x0f, 0xe3, 0xc3, 0x4b, 0x45, 0x32, 0xb7, 0xdf, +0xef, 0x0f, 0x3f, 0x31, 0x01, 0xb0, 0x1e, 0x58, 0x01, 0x66, 0x4a, 0xbf, +0xad, 0x4f, 0x7a, 0x68, 0x0d, 0xcb, 0x42, 0x08, 0x0c, 0x71, 0xe3, 0xc8, +0xac, 0x28, 0xd9, 0x30, 0x0a, 0x72, 0x82, 0xd5, 0x5a, 0x25, 0x26, 0xc4, +0xfe, 0xc1, 0x2a, 0xe5, 0xdf, 0xe6, 0x73, 0xa1, 0x1d, 0x65, 0x65, 0xb8, +0x2d, 0x43, 0x86, 0x9a, 0x61, 0x73, 0x9c, 0xf2, 0x3b, 0x8d, 0xe8, 0x7d, +0x79, 0x58, 0x9b, 0x82, 0x2e, 0xbb, 0x24, 0xbc, 0xc2, 0x72, 0x3e, 0x64, +0x41, 0x6c, 0x5b, 0xd8, 0x29, 0x88, 0x53, 0xd5, 0xfd, 0x77, 0x0b, 0x16, +0x2c, 0xc0, 0xa9, 0x8a, 0x6b, 0x95, 0xbc, 0x48, 0x5c, 0x78, 0x52, 0x70, +0xcc, 0x4f, 0x54, 0x48, 0x4a, 0x34, 0x5e, 0x40, 0x3d, 0xf6, 0xd8, 0xa7, +0xa9, 0xe3, 0xd3, 0xf1, 0x43, 0x4a, 0x41, 0xdc, 0xf7, 0x3b, 0xec, 0xde, +0xe6, 0xb2, 0x92, 0xc8, 0x66, 0x1f, 0xa2, 0x86, 0x31, 0xf1, 0x33, 0x28, +0xba, 0xa7, 0xac, 0x13, 0x90, 0x38, 0x70, 0xe0, 0x00, 0x75, 0x29, 0x31, +0x48, 0xa0, 0xc9, 0x5d, 0x7e, 0xf9, 0xe5, 0xea, 0xaf, 0x7e, 0x07, 0x1a, +0x51, 0xa2, 0xc2, 0x5c, 0xb5, 0x40, 0x8f, 0xb5, 0xe1, 0x16, 0x36, 0xfd, +0x65, 0x36, 0x17, 0xc4, 0x8f, 0xd3, 0xf0, 0x84, 0xc8, 0x93, 0xe2, 0x52, +0xb4, 0x69, 0x37, 0x27, 0xc5, 0xd2, 0x9d, 0x40, 0xcb, 0x3e, 0xe8, 0x39, +0xf7, 0xda, 0xa7, 0x19, 0x1a, 0xfc, 0x77, 0x04, 0x1c, 0x48, 0xa6, 0x11, +0x15, 0x0c, 0xcc, 0xb1, 0x1e, 0xbe, 0xf1, 0x0a, 0xb1, 0x3e, 0xd1, 0xf2, +0x43, 0x67, 0xdc, 0xc1, 0x8a, 0xb2, 0xf4, 0xf0, 0x90, 0x64, 0x5a, 0x79, +0x4d, 0xa6, 0xf3, 0x69, 0x8d, 0x0c, 0x27, 0xe3, 0x0f, 0x1e, 0xd3, 0xcb, +0xcf, 0xb8, 0x71, 0x12, 0x65, 0xf4, 0xa2, 0x46, 0x63, 0xc6, 0x8c, 0x41, +0xa3, 0xb8, 0xe7, 0x9e, 0x7b, 0xf0, 0x51, 0xa0, 0xc6, 0xb1, 0x15, 0x51, +0xf3, 0x4f, 0x2d, 0x97, 0x4d, 0x71, 0x51, 0x9f, 0x1e, 0x51, 0xdf, 0xec, +0xa6, 0xe6, 0xba, 0x49, 0x54, 0x5e, 0xec, 0xd9, 0xb3, 0xb4, 0x6e, 0x8d, +0x65, 0xac, 0x61, 0x20, 0x6b, 0xe2, 0xc7, 0xb5, 0xab, 0xa6, 0x5d, 0xcc, +0xe6, 0xb1, 0xa9, 0x3b, 0x11, 0x35, 0x88, 0xa0, 0xe5, 0x4e, 0x17, 0x92, +0xad, 0xdd, 0xd2, 0xb1, 0xe3, 0xc7, 0xdc, 0x74, 0xd1, 0x9d, 0xc8, 0x79, +0x54, 0x6d, 0x32, 0x8d, 0xa8, 0x09, 0x46, 0x71, 0x34, 0xcc, 0xb2, 0x96, +0xf5, 0x62, 0xec, 0x6a, 0xdb, 0x40, 0x02, 0x6d, 0x9d, 0xb2, 0xbe, 0xea, +0x35, 0x53, 0xed, 0xc7, 0x8f, 0x29, 0xfa, 0x7a, 0x49, 0xb0, 0x72, 0x26, +0x2d, 0xef, 0x0b, 0x23, 0xc2, 0xcf, 0x4d, 0xe5, 0x01, 0x5f, 0x67, 0xa5, +0x64, 0x42, 0xb5, 0x1a, 0x54, 0xa1, 0x23, 0x88, 0x80, 0x5c, 0x59, 0x62, +0x01, 0x49, 0xbb, 0x63, 0x1f, 0x02, 0x1e, 0xea, 0xaf, 0x94, 0x50, 0xf0, +0xc9, 0x19, 0xc2, 0x46, 0x40, 0xe8, 0xae, 0x5e, 0x86, 0xa3, 0x54, 0x6a, +0x2d, 0x2c, 0x24, 0x7e, 0x84, 0xfc, 0x75, 0xf5, 0x4d, 0xc5, 0xd8, 0xfb, +0x3d, 0x2c, 0x11, 0x22, 0x00, 0xfe, 0x69, 0x99, 0x0f, 0xf1, 0x91, 0x76, +0x16, 0x13, 0x91, 0x18, 0x7f, 0x8b, 0xe5, 0x99, 0x2a, 0x57, 0xc4, 0xa6, +0x24, 0xe6, 0xf5, 0x76, 0xba, 0xff, 0xae, 0x6d, 0xdb, 0xb6, 0xd4, 0x70, +0xc1, 0x62, 0x4e, 0x65, 0x09, 0xbc, 0xda, 0x68, 0x04, 0xe6, 0x1a, 0x79, +0x3e, 0x44, 0x7c, 0xa0, 0xaa, 0x33, 0x8a, 0x1e, 0xb9, 0x80, 0x5e, 0xef, +0x75, 0x42, 0x01, 0x9e, 0x40, 0xc1, 0xac, 0x40, 0x02, 0x93, 0xbc, 0xde, +0x5d, 0x14, 0xc4, 0xf7, 0x6e, 0xb3, 0xeb, 0x6f, 0xd1, 0x07, 0x84, 0xca, +0xc9, 0xc8, 0x55, 0xa4, 0x49, 0x95, 0x65, 0x58, 0x33, 0x41, 0x04, 0xb0, +0x53, 0x56, 0x9c, 0x7a, 0x0b, 0xc4, 0x9f, 0xa9, 0xbf, 0xda, 0x8c, 0x0c, +0xc7, 0x14, 0x86, 0x43, 0x43, 0xcc, 0x03, 0xe6, 0x83, 0x04, 0x6b, 0xaa, +0xf4, 0x52, 0xd4, 0x47, 0xb7, 0x6b, 0xf9, 0x3d, 0x7f, 0xaf, 0x8b, 0x63, +0xff, 0x04, 0xe5, 0x9c, 0x25, 0xda, 0x97, 0x32, 0x50, 0x76, 0x2e, 0x9c, +0xd2, 0xbf, 0xa1, 0x3b, 0xf3, 0x89, 0xb2, 0x17, 0x51, 0x19, 0xcd, 0xce, +0x50, 0x5e, 0xcf, 0x51, 0x31, 0xbc, 0xac, 0xd5, 0xb0, 0x61, 0xc3, 0xf0, +0xdf, 0x11, 0xfe, 0x44, 0xa6, 0x91, 0xa1, 0x8a, 0xa6, 0x6e, 0x5e, 0xb2, +0xcb, 0x2b, 0x30, 0xc8, 0x92, 0x24, 0xa0, 0x5e, 0x15, 0x36, 0x56, 0xbf, +0x8d, 0x42, 0x5e, 0x1f, 0x43, 0x9d, 0x50, 0xae, 0x41, 0x63, 0xbc, 0x4b, +0xfc, 0xdc, 0xd4, 0x02, 0xf4, 0xcf, 0xa6, 0x09, 0xf9, 0xaa, 0xd5, 0x20, +0x51, 0x81, 0x02, 0xf7, 0x88, 0x4f, 0x08, 0xac, 0xb0, 0x66, 0x34, 0x39, +0x8a, 0x7a, 0xe8, 0x05, 0x16, 0x90, 0x03, 0xdd, 0x3d, 0x35, 0xc6, 0x56, +0x82, 0x46, 0xa9, 0x4d, 0xc6, 0xcb, 0x33, 0x5b, 0xae, 0xe5, 0x16, 0xa4, +0x1f, 0x52, 0x06, 0x81, 0x22, 0x26, 0x18, 0xb8, 0x70, 0x16, 0xf1, 0x6a, +0xd5, 0xad, 0x3d, 0x07, 0x7a, 0x10, 0x66, 0x0f, 0x4b, 0xef, 0xd9, 0x3a, +0x07, 0x13, 0x1c, 0xc1, 0x63, 0x52, 0x7a, 0x10, 0x30, 0x23, 0xb8, 0xdb, +0x7f, 0x0b, 0x5e, 0xcf, 0xc4, 0x31, 0x2a, 0xf3, 0xb1, 0x99, 0x9a, 0x42, +0xd8, 0x1b, 0x46, 0x21, 0x77, 0xc3, 0x22, 0xd0, 0xaa, 0xa7, 0xf3, 0x29, +0x26, 0xda, 0x72, 0x40, 0x83, 0xff, 0x8e, 0x0d, 0x05, 0x8a, 0x47, 0xa9, +0xc0, 0x26, 0xab, 0xeb, 0xd9, 0x7e, 0x46, 0x7c, 0xc0, 0x28, 0xf4, 0xd2, +0x32, 0x36, 0xc5, 0x47, 0xaf, 0x0b, 0xea, 0xe1, 0x84, 0x47, 0xb7, 0xf6, +0xa7, 0xc2, 0x5a, 0x20, 0x23, 0x78, 0xb8, 0x16, 0x95, 0x00, 0x3c, 0xb0, +0xfa, 0x7e, 0x2b, 0x15, 0xd8, 0xdf, 0xd4, 0xcb, 0x23, 0xae, 0x86, 0x20, +0x02, 0x4c, 0x7e, 0x54, 0x91, 0x31, 0x57, 0x67, 0x23, 0xbf, 0xde, 0xec, +0x38, 0x47, 0x05, 0xa4, 0xd8, 0x2b, 0x3e, 0x2c, 0xf6, 0x57, 0x4b, 0xce, +0x20, 0x5f, 0x52, 0xf2, 0x11, 0x15, 0x02, 0x91, 0x89, 0x74, 0x4a, 0xc4, +0x57, 0xfc, 0x83, 0x94, 0xa5, 0xd0, 0xcb, 0x6e, 0xbb, 0x93, 0x43, 0xe4, +0xd9, 0xf5, 0x2a, 0x10, 0xfa, 0x5d, 0x82, 0xc8, 0xe7, 0xb1, 0xa2, 0xaa, +0x70, 0x66, 0x9b, 0xc9, 0xee, 0x64, 0xe1, 0xf3, 0x72, 0x2d, 0xdf, 0x0e, +0x49, 0x97, 0x3a, 0x07, 0x5e, 0xe3, 0x6f, 0x99, 0x15, 0x35, 0xb8, 0xee, +0x45, 0x21, 0xff, 0x8e, 0x48, 0x1c, 0x0c, 0x50, 0x04, 0x1c, 0x90, 0x56, +0xe1, 0xa1, 0x02, 0xa5, 0x2d, 0x5e, 0x81, 0xec, 0x45, 0xa5, 0x19, 0xe2, +0x40, 0xd5, 0xca, 0x06, 0x68, 0x7a, 0xf7, 0x4a, 0xeb, 0x18, 0xb3, 0xb1, +0xf4, 0x05, 0x25, 0x13, 0xc5, 0x7c, 0x2f, 0xaa, 0x4e, 0xa8, 0x98, 0x6a, +0xff, 0xe2, 0x64, 0xb1, 0xf6, 0x7a, 0x20, 0x65, 0xc3, 0x9f, 0x2c, 0xf7, +0x45, 0xf4, 0x25, 0xcf, 0x23, 0x50, 0xa8, 0x41, 0x9a, 0x16, 0xc0, 0x1f, +0x78, 0x97, 0x74, 0x60, 0x21, 0xa1, 0x05, 0x43, 0x3b, 0xbf, 0xaa, 0x0b, +0x51, 0x3c, 0x3c, 0x24, 0x6a, 0xe3, 0x36, 0xa5, 0x20, 0xb4, 0xe5, 0x5d, +0xfc, 0x28, 0x98, 0xe0, 0xee, 0x95, 0xa9, 0x82, 0x6b, 0x38, 0xb6, 0x6d, +0x72, 0x5d, 0xa2, 0x19, 0xdc, 0x59, 0x23, 0xf5, 0x48, 0x2a, 0x66, 0xee, +0x53, 0xe4, 0x84, 0xe5, 0x0c, 0x75, 0xff, 0x1d, 0x04, 0x2c, 0x59, 0xa9, +0x78, 0x2a, 0x28, 0xea, 0x61, 0xa9, 0x51, 0xf8, 0x60, 0x83, 0xe2, 0x7a, +0xbd, 0x0c, 0x3a, 0xa6, 0x77, 0xaf, 0xb1, 0xdf, 0x5e, 0xe9, 0xde, 0xf3, +0x09, 0x94, 0xd4, 0xe6, 0x8d, 0x96, 0x47, 0x22, 0x38, 0x90, 0xd0, 0xb3, +0x34, 0xfd, 0xf3, 0x54, 0x90, 0x13, 0x6b, 0x1f, 0x15, 0x96, 0xb9, 0xcb, +0x48, 0x35, 0x96, 0x23, 0x20, 0x2c, 0xa1, 0x11, 0xc2, 0x79, 0x16, 0x2d, +0x5a, 0x44, 0xc5, 0x68, 0xba, 0x67, 0x10, 0x7b, 0x8b, 0x5b, 0x90, 0x1d, +0x8e, 0xa0, 0x74, 0x9c, 0x83, 0x7a, 0x60, 0x01, 0xd2, 0xb9, 0x87, 0x65, +0xa4, 0x0e, 0x9f, 0xe5, 0x2d, 0x88, 0xb0, 0xf4, 0xc3, 0x44, 0xee, 0xee, +0x46, 0x2a, 0x8a, 0xc7, 0x5c, 0x9f, 0xc1, 0xf2, 0x12, 0x98, 0xa4, 0x87, +0x78, 0x08, 0xe5, 0x0a, 0x54, 0x33, 0xb7, 0x53, 0x20, 0xd4, 0xc3, 0x22, +0xe8, 0xfe, 0x3b, 0xa4, 0x50, 0xec, 0xe6, 0x50, 0x32, 0x8a, 0x1f, 0x9e, +0x8a, 0x80, 0x50, 0x21, 0x36, 0x59, 0x5d, 0xc3, 0xf3, 0x5b, 0xea, 0xb0, +0x09, 0x15, 0x62, 0x28, 0x30, 0x47, 0xc2, 0x2b, 0x6c, 0x9e, 0x6f, 0xff, +0x34, 0x1c, 0x76, 0x94, 0x9c, 0xd1, 0x69, 0xc5, 0x3f, 0x78, 0xeb, 0xe2, +0x93, 0x99, 0xf2, 0x32, 0x53, 0x13, 0x7a, 0xb7, 0xcb, 0xc5, 0x0d, 0x42, +0x04, 0x3b, 0x5e, 0x79, 0x73, 0x84, 0x15, 0xd3, 0xd0, 0xaf, 0xa2, 0x9d, +0x0d, 0x4e, 0x71, 0xc8, 0xfd, 0x92, 0x4b, 0x2e, 0x81, 0x39, 0x10, 0xbb, +0x46, 0xfb, 0x1b, 0x2c, 0x5a, 0x6c, 0x6c, 0xc8, 0x4b, 0x70, 0x73, 0x62, +0x6f, 0x29, 0x6b, 0x42, 0xf6, 0x12, 0x36, 0x2e, 0xfd, 0x42, 0xcf, 0xa6, +0x08, 0x4a, 0x79, 0xab, 0x93, 0xf5, 0x36, 0x48, 0x9e, 0xb1, 0x64, 0x7f, +0x31, 0x39, 0x13, 0x5f, 0x8a, 0xdc, 0x02, 0x0d, 0xcd, 0x66, 0x01, 0x55, +0x12, 0x21, 0x3d, 0x54, 0x9d, 0x42, 0xc3, 0x36, 0xac, 0xa7, 0xcd, 0x84, +0x3e, 0x77, 0xd3, 0xd6, 0xfd, 0x77, 0x54, 0x5b, 0x45, 0xd5, 0x66, 0x67, +0xc1, 0x68, 0x4e, 0xa9, 0x9b, 0x80, 0x50, 0x21, 0x36, 0x59, 0x1a, 0xcc, +0xa8, 0xe9, 0x52, 0x65, 0xc4, 0xa7, 0xb5, 0xf3, 0xe9, 0x64, 0x32, 0xec, +0xa4, 0x00, 0x4c, 0xb0, 0x4c, 0x10, 0xea, 0xee, 0x80, 0xcd, 0x90, 0xe6, +0x4a, 0xf1, 0x28, 0x9f, 0xe6, 0x26, 0x27, 0x93, 0xac, 0x63, 0x78, 0x73, +0x0d, 0x6a, 0xa6, 0xe2, 0xa4, 0x23, 0x25, 0x9f, 0x82, 0x4e, 0xfa, 0xde, +0x46, 0x62, 0x1a, 0x81, 0x5e, 0xe6, 0x5b, 0xa0, 0x5b, 0xab, 0x11, 0xb0, +0xa0, 0xa3, 0x36, 0x50, 0xc8, 0x87, 0x24, 0x6f, 0x0a, 0x46, 0xd1, 0xb7, +0x0a, 0xe5, 0x81, 0x9c, 0x18, 0x12, 0x00, 0x90, 0x97, 0x88, 0xa7, 0x92, +0xe0, 0x11, 0x52, 0x97, 0xb0, 0xf6, 0x62, 0xe9, 0x52, 0x17, 0x7a, 0xf6, +0x73, 0xc1, 0x12, 0x75, 0xc3, 0x2e, 0xd5, 0x46, 0xd4, 0x85, 0x36, 0x8d, +0xa7, 0x76, 0x56, 0x46, 0xf5, 0x82, 0x20, 0xec, 0xc5, 0xce, 0xf9, 0x9c, +0x43, 0x0d, 0x14, 0x77, 0x67, 0x32, 0x67, 0x73, 0x57, 0x0f, 0x9b, 0xe6, +0x3b, 0x77, 0x7c, 0x49, 0x7f, 0x53, 0x2c, 0xac, 0x24, 0x0c, 0xab, 0x5e, +0x22, 0xee, 0xfa, 0x3d, 0x78, 0xef, 0x16, 0x09, 0x24, 0x30, 0xad, 0xa8, +0xd1, 0x89, 0xb1, 0xb3, 0x69, 0x7d, 0xb3, 0xb9, 0x4c, 0xfa, 0x69, 0x8c, +0xac, 0x76, 0x8b, 0x20, 0xf2, 0x0a, 0x0c, 0x11, 0x44, 0x71, 0x9a, 0x2d, +0x3c, 0xf6, 0x0b, 0x03, 0xeb, 0x93, 0x44, 0xa7, 0xc4, 0xcb, 0x81, 0xe1, +0x65, 0xfb, 0xa2, 0x4e, 0x7c, 0xf6, 0x10, 0xc7, 0x41, 0xbe, 0xa1, 0x65, +0x12, 0xb6, 0x5e, 0xd9, 0x16, 0x16, 0x81, 0x1a, 0x0d, 0x18, 0xe0, 0x0c, +0x20, 0x81, 0x60, 0x5b, 0x42, 0xd0, 0x61, 0x0e, 0x80, 0x81, 0xa0, 0x4e, +0xf8, 0x03, 0x78, 0xe0, 0x2d, 0x52, 0x9d, 0x85, 0x0e, 0x1e, 0xfa, 0x3b, +0xf6, 0x5c, 0x7d, 0x8b, 0x2d, 0x59, 0x9d, 0xac, 0xf7, 0xec, 0x03, 0x2a, +0x96, 0xbd, 0x26, 0xfc, 0x78, 0x59, 0x04, 0x04, 0xa8, 0x20, 0x14, 0x0f, +0x46, 0x36, 0x7d, 0x64, 0xdc, 0xbe, 0x1e, 0xbc, 0x99, 0xaa, 0xa6, 0x93, +0xfe, 0x98, 0xc4, 0xcb, 0xf9, 0x31, 0x37, 0xb9, 0x84, 0x3e, 0x18, 0x6a, +0x28, 0x4c, 0x82, 0x2c, 0xaf, 0x65, 0x5d, 0x7e, 0x33, 0x36, 0x3c, 0xa1, +0x42, 0x72, 0x8c, 0x48, 0x56, 0xa2, 0x41, 0x9b, 0x1a, 0xbd, 0xfc, 0x02, +0xd1, 0x30, 0xd4, 0x48, 0xc4, 0xb8, 0x1c, 0x10, 0x31, 0xfa, 0xa2, 0xdf, +0x2b, 0xa2, 0x2e, 0x24, 0x54, 0xc9, 0xcc, 0x97, 0xe5, 0x16, 0x5e, 0x73, +0x00, 0x03, 0xb9, 0x3b, 0x93, 0x87, 0x17, 0x99, 0x23, 0x82, 0x09, 0xf9, +0xd6, 0xdf, 0x3a, 0x1d, 0x0d, 0x89, 0x13, 0x21, 0xb7, 0x11, 0x63, 0x2e, +0xef, 0x0c, 0x30, 0x48, 0x9d, 0x66, 0x4c, 0x87, 0x68, 0x84, 0xd2, 0x29, +0x9d, 0x8d, 0x09, 0x1b, 0x60, 0xaf, 0x5e, 0xa5, 0x65, 0x2a, 0xf1, 0x69, +0x78, 0x56, 0x6d, 0xf5, 0x24, 0x1b, 0x14, 0x15, 0x75, 0x47, 0xfb, 0x75, +0x37, 0xbc, 0x3e, 0xbb, 0x2a, 0x68, 0x02, 0x07, 0xb6, 0x19, 0x87, 0x4f, +0xbc, 0x96, 0x87, 0x5a, 0x38, 0xaa, 0xe2, 0xe0, 0x05, 0x91, 0xac, 0xb4, +0x91, 0x80, 0xdf, 0x21, 0x14, 0xe4, 0xc3, 0xa9, 0x07, 0xc7, 0x4e, 0x28, +0xf5, 0x33, 0x31, 0x40, 0x51, 0x9e, 0x86, 0x55, 0xf5, 0xd0, 0x18, 0xc8, +0x0b, 0x2a, 0x10, 0x9f, 0x70, 0x8c, 0xeb, 0xed, 0xe1, 0xec, 0x17, 0xd3, +0xf5, 0xba, 0xac, 0xfa, 0x09, 0xc8, 0xf7, 0xfa, 0x8b, 0x94, 0x87, 0x09, +0x50, 0xa6, 0x44, 0xd2, 0x25, 0x62, 0xc2, 0x43, 0xab, 0x2d, 0xec, 0x27, +0x3e, 0x4d, 0xd2, 0xa7, 0x93, 0x8f, 0x5d, 0xd7, 0x83, 0x42, 0xe8, 0xe6, +0x4b, 0x74, 0x4d, 0x1d, 0xb9, 0xf4, 0xa6, 0x9b, 0x6e, 0x92, 0x6c, 0x49, +0xa2, 0x38, 0xc1, 0x03, 0x01, 0x54, 0x48, 0xbd, 0xd8, 0x0d, 0x31, 0xfa, +0x09, 0x1e, 0xe4, 0x40, 0xa6, 0xd2, 0xb1, 0x84, 0xad, 0xc6, 0xc3, 0x64, +0x88, 0x95, 0xd0, 0x9f, 0x5a, 0xef, 0x79, 0xe7, 0x47, 0xe0, 0x89, 0xbb, +0x1b, 0x29, 0x6f, 0xa3, 0xfd, 0x64, 0xcc, 0x5b, 0xaf, 0x76, 0xbb, 0xe0, +0x7a, 0xc5, 0x41, 0x9e, 0x54, 0x2f, 0x6a, 0x78, 0x9f, 0xbd, 0x3e, 0x35, +0xe6, 0x79, 0xea, 0xfe, 0x3b, 0xa9, 0x9f, 0x89, 0xf8, 0x24, 0xf5, 0x33, +0xf5, 0x7e, 0x5f, 0xbe, 0xf1, 0x0a, 0xc9, 0x31, 0x62, 0xac, 0x52, 0x5e, +0x9c, 0x96, 0xe8, 0x77, 0x4d, 0x62, 0x0f, 0x6f, 0x91, 0xed, 0x93, 0x6a, +0xc7, 0xfa, 0x5b, 0x97, 0xcf, 0xb8, 0x14, 0xfc, 0x8b, 0x7b, 0xc3, 0x2f, +0x46, 0x91, 0x04, 0xbd, 0xb2, 0xe5, 0x45, 0xfe, 0x13, 0x17, 0xa7, 0x2f, +0xb7, 0xd7, 0x1c, 0x40, 0x9f, 0x60, 0x60, 0x38, 0x19, 0x65, 0x97, 0xce, +0x12, 0xe6, 0x11, 0xf4, 0x27, 0xc5, 0xf6, 0x4a, 0x71, 0x41, 0xec, 0x4b, +0x12, 0x63, 0xab, 0xf8, 0x83, 0x24, 0x88, 0x49, 0x91, 0x22, 0x3e, 0x20, +0x41, 0xe9, 0x6e, 0x10, 0xaf, 0x05, 0x3f, 0x89, 0x95, 0x50, 0x8b, 0xa9, +0xd7, 0x57, 0xc6, 0x0c, 0x10, 0x48, 0xca, 0xa1, 0xfe, 0x2c, 0xaa, 0xd2, +0x21, 0xf0, 0xb3, 0x59, 0xb3, 0x99, 0xa4, 0x0b, 0x0f, 0x60, 0x56, 0x8a, +0xbb, 0x30, 0x8a, 0xe6, 0xcd, 0x4b, 0xbb, 0xd7, 0xf9, 0x57, 0x1c, 0x1e, +0x2e, 0xad, 0xfb, 0x82, 0xa4, 0x7e, 0xa6, 0x54, 0x28, 0xb6, 0xac, 0x60, +0x60, 0xd7, 0xb7, 0xcd, 0x5b, 0x01, 0x52, 0x93, 0x27, 0x4f, 0x56, 0x4b, +0x0c, 0xa9, 0x05, 0x42, 0x28, 0x96, 0xd7, 0xb2, 0x7b, 0x79, 0x68, 0x8a, +0x47, 0x1d, 0x10, 0x9b, 0x0e, 0x4e, 0xb8, 0x0d, 0x42, 0x3c, 0x49, 0xb0, +0x06, 0x2b, 0x93, 0x9a, 0x3c, 0x6d, 0x8b, 0xc9, 0x1d, 0x25, 0x15, 0x4b, +0x7d, 0x63, 0x33, 0x39, 0xc6, 0x8f, 0x47, 0x46, 0x71, 0xb4, 0x2c, 0xf2, +0x80, 0xa3, 0x40, 0x07, 0x3f, 0xaf, 0x8a, 0x60, 0x35, 0x6c, 0x85, 0x04, +0xd8, 0xa2, 0x4c, 0x53, 0x85, 0x05, 0xfe, 0x20, 0x3d, 0x63, 0xc5, 0xc7, +0xc4, 0xc1, 0x2b, 0xa0, 0x36, 0x82, 0xba, 0x8a, 0x90, 0x2a, 0xaf, 0xc6, +0x4a, 0x5a, 0x4c, 0xa9, 0xf3, 0xf5, 0x42, 0xfc, 0x5e, 0xcb, 0xa8, 0xd9, +0x7f, 0x52, 0x65, 0xf1, 0x1c, 0x6e, 0xbb, 0x14, 0x1a, 0x2f, 0xda, 0x83, +0xd4, 0x57, 0xbc, 0xa8, 0x93, 0x9a, 0x33, 0x6e, 0x4a, 0x5d, 0x5c, 0x24, +0x9b, 0xd2, 0xfe, 0xc4, 0xd4, 0x99, 0x06, 0xff, 0x1d, 0x6a, 0x1b, 0x02, +0x2a, 0x9e, 0x0a, 0x34, 0x34, 0x73, 0x56, 0xaa, 0x21, 0x1d, 0xcf, 0x93, +0x04, 0x25, 0x99, 0x77, 0x69, 0x69, 0x17, 0xd3, 0x0e, 0x99, 0x74, 0x10, +0x0b, 0xf5, 0x31, 0x7b, 0x1a, 0x9c, 0xe9, 0xdd, 0x4f, 0x64, 0x51, 0xa8, +0x4a, 0x42, 0xc3, 0x21, 0x9d, 0x74, 0x70, 0x8f, 0xcc, 0x1f, 0x55, 0x80, +0x63, 0xc1, 0x10, 0x60, 0x87, 0x37, 0x83, 0x48, 0x32, 0x24, 0xba, 0x6b, +0xa6, 0xb5, 0x72, 0xd7, 0x99, 0x45, 0xc6, 0xc1, 0x09, 0xc0, 0xae, 0x8c, +0x9d, 0xc7, 0x50, 0xb3, 0xd9, 0xef, 0x00, 0x72, 0xaf, 0x2f, 0x89, 0x78, +0x10, 0xcb, 0x70, 0x15, 0xa6, 0xaa, 0x1e, 0x8d, 0x08, 0x3f, 0xac, 0x22, +0xc7, 0x8f, 0x1f, 0xa7, 0xad, 0x3d, 0x71, 0x53, 0xe0, 0xc1, 0x50, 0xc1, +0x8e, 0xdd, 0x0b, 0x54, 0xd0, 0xac, 0x43, 0x5f, 0x0d, 0xcb, 0xba, 0x83, +0xfa, 0x7c, 0xc0, 0x8c, 0x99, 0xeb, 0xca, 0x37, 0xec, 0xc7, 0x5e, 0x67, +0x6e, 0xe7, 0x04, 0x55, 0xad, 0x90, 0x31, 0xe9, 0xf4, 0x65, 0xe7, 0x12, +0xce, 0xf1, 0x6c, 0xba, 0x24, 0x5a, 0x42, 0x4d, 0x9b, 0x32, 0xd5, 0x04, +0x20, 0xab, 0x5f, 0xed, 0x17, 0x36, 0xd7, 0x67, 0xa2, 0xe7, 0xf1, 0xaa, +0xfa, 0x99, 0x92, 0x53, 0x61, 0xee, 0x20, 0x67, 0x50, 0x33, 0x3c, 0xa1, +0x82, 0x8b, 0x69, 0xb8, 0xa8, 0x26, 0x47, 0xd2, 0xb3, 0xd7, 0x6c, 0x52, +0x9b, 0x0b, 0x84, 0xe0, 0x4b, 0x49, 0x32, 0x73, 0x15, 0x1c, 0x66, 0x8f, +0xf7, 0xea, 0xaa, 0xab, 0xae, 0x62, 0x5f, 0xb7, 0x7c, 0xb5, 0x78, 0xa0, +0x08, 0xe6, 0xe1, 0x87, 0xb2, 0xb3, 0x76, 0x7a, 0xf3, 0x02, 0x69, 0x22, +0x26, 0xe8, 0x3c, 0x8b, 0x9d, 0x07, 0xa5, 0x16, 0xbf, 0x98, 0x1a, 0x96, +0x14, 0x28, 0x9b, 0xb3, 0xf5, 0xe3, 0x34, 0x74, 0x24, 0xca, 0x10, 0x1a, +0x72, 0xa9, 0xd9, 0x29, 0xd1, 0xbf, 0xd5, 0x04, 0x86, 0x0f, 0x1f, 0x4e, +0x0b, 0x66, 0x61, 0xeb, 0x68, 0x11, 0xf0, 0x04, 0xb3, 0x05, 0x9d, 0x6f, +0x08, 0xf0, 0x54, 0x97, 0x20, 0x13, 0x12, 0x6d, 0x4a, 0x90, 0x85, 0x87, +0x29, 0x61, 0x6d, 0x53, 0xe7, 0xeb, 0xf5, 0x95, 0xc9, 0xe3, 0xf3, 0xe3, +0x41, 0x2c, 0x2f, 0x51, 0xdd, 0xbd, 0xe0, 0x87, 0x36, 0x1d, 0x82, 0x94, +0xbc, 0xc0, 0xe6, 0xc1, 0x66, 0x61, 0x6e, 0x36, 0xcb, 0x2d, 0x0c, 0x25, +0x91, 0xe0, 0x8d, 0xe4, 0x06, 0xa9, 0xa7, 0x80, 0x4e, 0x6c, 0x7a, 0xcd, +0xf5, 0xd9, 0xaa, 0xca, 0x54, 0x8c, 0x43, 0xc1, 0x5f, 0xfc, 0x77, 0x58, +0x32, 0xdc, 0xe5, 0x54, 0xe8, 0x65, 0xfa, 0xbd, 0xc4, 0xcc, 0xf2, 0x9e, +0xae, 0xbc, 0xf2, 0x4a, 0x35, 0x39, 0xaf, 0xf5, 0x69, 0xbc, 0x2e, 0x3a, +0x66, 0x19, 0xda, 0x01, 0x12, 0x9c, 0x63, 0x19, 0x23, 0xdd, 0xa5, 0x4b, +0x17, 0xc8, 0x17, 0x37, 0x16, 0xa5, 0x62, 0x20, 0x5f, 0x5a, 0xa3, 0xbb, +0xdb, 0xf3, 0xec, 0x7c, 0x8f, 0xe4, 0x40, 0x2d, 0x51, 0xe6, 0x0f, 0x7f, +0xc0, 0x2f, 0x46, 0x0a, 0x21, 0x76, 0x9e, 0xd5, 0xab, 0x57, 0xab, 0x6b, +0xf1, 0xef, 0x78, 0x9d, 0xb0, 0x7f, 0x27, 0xa0, 0x0b, 0x29, 0xc4, 0x62, +0xf3, 0x81, 0xc1, 0xca, 0x4b, 0xa5, 0xdb, 0x98, 0x3e, 0x73, 0x62, 0x37, +0xb0, 0x8a, 0x48, 0x8a, 0x92, 0x34, 0x4d, 0x36, 0xa8, 0x7d, 0x92, 0xe9, +0x65, 0x48, 0x09, 0x66, 0x04, 0xb0, 0x81, 0xb1, 0xae, 0x64, 0x71, 0xa1, +0xa5, 0x28, 0x45, 0xbc, 0xa0, 0xe5, 0xfa, 0x90, 0x66, 0xe0, 0xdf, 0xe3, +0x18, 0xae, 0x82, 0xac, 0x55, 0xbd, 0x7b, 0xfb, 0x69, 0x67, 0xaa, 0xbc, +0x0b, 0xaf, 0x1e, 0xa1, 0x8b, 0xd4, 0x42, 0x9d, 0xf3, 0xb3, 0x44, 0x6a, +0xce, 0x6c, 0x64, 0xd0, 0x00, 0xbb, 0x98, 0x9e, 0x59, 0xe5, 0x87, 0x7a, +0x49, 0xa7, 0x70, 0x35, 0x26, 0xfd, 0x12, 0xa8, 0x58, 0x47, 0xde, 0x0b, +0x8c, 0x02, 0x00, 0x98, 0x77, 0x1f, 0x5b, 0xa8, 0x50, 0x99, 0x77, 0x7a, +0x29, 0x48, 0xee, 0xc1, 0x9d, 0x28, 0x61, 0x8b, 0x08, 0x48, 0x2e, 0x35, +0x39, 0x31, 0x5e, 0xf7, 0x09, 0x56, 0x90, 0xb4, 0x1e, 0x8a, 0xb2, 0x10, +0x09, 0xc7, 0x56, 0xe1, 0x2e, 0x26, 0x14, 0x0d, 0x98, 0xc6, 0xbe, 0xd0, +0x2e, 0x01, 0x3f, 0xd4, 0x8c, 0x81, 0x7c, 0x91, 0xb6, 0x8b, 0x8b, 0x8b, +0xe9, 0x84, 0xad, 0xd7, 0xcd, 0xf6, 0x0a, 0x06, 0x62, 0xe9, 0xf2, 0xf3, +0xf3, 0xe9, 0x43, 0x37, 0x67, 0xce, 0x1c, 0x46, 0x23, 0x8e, 0x15, 0x30, +0x48, 0x04, 0x11, 0x3c, 0x91, 0x00, 0x18, 0xdc, 0x02, 0x6a, 0x90, 0xa0, +0x7b, 0x09, 0xa1, 0x1e, 0x4c, 0x11, 0x78, 0x03, 0xf4, 0x6a, 0xf8, 0x72, +0x3b, 0x34, 0x6c, 0xb6, 0x49, 0xe4, 0x40, 0x75, 0x77, 0x72, 0xea, 0x89, +0xb1, 0xc5, 0x35, 0x41, 0xd1, 0x03, 0xd2, 0xbb, 0x2d, 0xeb, 0xaf, 0x88, +0x65, 0x1c, 0x7b, 0x94, 0xbb, 0x16, 0xb5, 0x8c, 0x46, 0xa4, 0x10, 0x19, +0x3f, 0xa8, 0xf5, 0xc2, 0xc6, 0x89, 0x8a, 0xb7, 0x5c, 0x25, 0xd4, 0x33, +0xaf, 0x2f, 0xcb, 0x26, 0x66, 0x70, 0x56, 0xca, 0x2d, 0x08, 0x0a, 0xb4, +0xe9, 0xfa, 0x60, 0x53, 0xd0, 0x7b, 0x34, 0xca, 0xe5, 0x28, 0x48, 0x78, +0xe8, 0xb0, 0x2f, 0xb1, 0x68, 0x8a, 0xf9, 0xf0, 0x7d, 0xeb, 0xd6, 0xad, +0xb1, 0xcb, 0xc1, 0xd8, 0xf5, 0x96, 0x3d, 0xee, 0xb2, 0xf6, 0x98, 0x33, +0x73, 0x30, 0x3f, 0x1a, 0x7a, 0x9d, 0xbe, 0x0e, 0x04, 0x0a, 0x60, 0xf8, +0xa6, 0x61, 0xa7, 0xf0, 0x64, 0xb3, 0xd1, 0xc9, 0x16, 0x2a, 0x24, 0xca, +0x83, 0x21, 0x74, 0x03, 0x94, 0x79, 0xb9, 0xa1, 0x72, 0x9c, 0x2c, 0x14, +0xff, 0x21, 0x5c, 0x99, 0x0d, 0x80, 0xee, 0x72, 0xfc, 0xf0, 0x99, 0x80, +0x08, 0x78, 0xab, 0xa1, 0x32, 0xac, 0xe5, 0xdb, 0xa2, 0x8b, 0x76, 0xf7, +0xee, 0xdd, 0x11, 0x99, 0xd8, 0xc5, 0xa1, 0x60, 0x32, 0x42, 0xb0, 0x51, +0xe2, 0x34, 0x64, 0x07, 0x85, 0x8e, 0xc1, 0x06, 0xab, 0x03, 0x36, 0xa0, +0x75, 0x5d, 0x4b, 0x56, 0x43, 0x25, 0x24, 0x24, 0x60, 0x63, 0x29, 0x28, +0x28, 0x40, 0x39, 0x9b, 0x32, 0x65, 0x0a, 0x61, 0x29, 0x0c, 0x85, 0x0a, +0x4b, 0xc4, 0x04, 0x11, 0xd7, 0x00, 0x8c, 0xcd, 0x18, 0xe7, 0x17, 0x56, +0x6a, 0x64, 0x77, 0x3c, 0x62, 0x18, 0x7c, 0x4a, 0xe9, 0xd2, 0xd5, 0x25, +0xac, 0x1b, 0x3f, 0x6c, 0xba, 0xec, 0x79, 0x90, 0x32, 0xc1, 0x57, 0xfc, +0x50, 0xd4, 0x08, 0x0c, 0x63, 0x54, 0x45, 0xa1, 0xe4, 0x07, 0xce, 0xc6, +0x43, 0xe1, 0xef, 0xe3, 0xb9, 0xf8, 0x01, 0x4b, 0x44, 0x65, 0xf3, 0x23, +0x82, 0x1c, 0x52, 0x25, 0x31, 0x9e, 0x7a, 0x98, 0xa7, 0x57, 0xe8, 0xca, +0x09, 0xec, 0x02, 0x44, 0x37, 0xf1, 0x98, 0xa4, 0x28, 0x61, 0x7a, 0x42, +0xc3, 0x36, 0xd7, 0x5f, 0x91, 0xb7, 0xc0, 0x5f, 0xd9, 0xe4, 0xf4, 0x90, +0x0d, 0xcb, 0x5b, 0x20, 0x52, 0xb2, 0x61, 0xe9, 0x41, 0xb2, 0xba, 0x9e, +0x4d, 0xe8, 0x9e, 0xbc, 0x1d, 0x7e, 0x70, 0xc3, 0xcb, 0xa3, 0xe9, 0x3f, +0x3c, 0x2f, 0x4f, 0xad, 0xff, 0xa0, 0x02, 0xc9, 0x82, 0xa8, 0x1f, 0xdc, +0xd2, 0x2c, 0x54, 0xb5, 0xb4, 0x8b, 0xe9, 0xe3, 0xdc, 0x51, 0x8d, 0x89, +0xc4, 0x28, 0xeb, 0x63, 0xfe, 0xc1, 0x80, 0xeb, 0xce, 0xfe, 0x21, 0x0f, +0x82, 0x65, 0x0c, 0x69, 0x56, 0x3d, 0x14, 0x2d, 0xd2, 0x79, 0x4d, 0x28, +0xc7, 0x7a, 0x1d, 0x2d, 0xd2, 0x59, 0xa9, 0x65, 0x4c, 0xae, 0x32, 0xea, +0x07, 0xaf, 0x00, 0x8c, 0x71, 0x77, 0x83, 0xc4, 0x81, 0xa0, 0xc5, 0x97, +0x3c, 0x69, 0xa7, 0x66, 0x59, 0x7a, 0x48, 0x8e, 0xd7, 0xfa, 0x99, 0x80, +0xc4, 0x37, 0x54, 0xf0, 0x4a, 0xf4, 0x68, 0x7e, 0x9b, 0xaf, 0xdc, 0xce, +0x69, 0x68, 0xc0, 0xe0, 0x01, 0x5e, 0x04, 0x1e, 0x80, 0x32, 0x3b, 0x3a, +0x41, 0x3e, 0xe0, 0x01, 0x87, 0x2e, 0x89, 0x3b, 0xc4, 0x38, 0x20, 0x05, +0x52, 0xb4, 0x87, 0x2f, 0xb7, 0x6f, 0xdf, 0x0e, 0x36, 0xae, 0xbf, 0xfe, +0x7a, 0x64, 0x21, 0x42, 0x59, 0xe0, 0x86, 0x1c, 0x7c, 0xe0, 0x5a, 0x04, +0x2d, 0x0e, 0x62, 0x25, 0x60, 0xb8, 0x20, 0x81, 0x3d, 0x06, 0x68, 0x71, +0x3e, 0x70, 0x22, 0xe2, 0x05, 0x91, 0x9d, 0xa2, 0x4c, 0x98, 0xa8, 0x71, +0xdc, 0xe0, 0x17, 0x63, 0x4b, 0xd6, 0xdb, 0xd0, 0xd8, 0x99, 0x64, 0x39, +0x9d, 0x13, 0x1b, 0x1b, 0x0b, 0x68, 0x89, 0x3e, 0x40, 0x67, 0xc0, 0x7c, +0x8e, 0xb7, 0x4e, 0xaf, 0x34, 0x21, 0x4a, 0x36, 0x90, 0x40, 0xaf, 0x43, +0xd5, 0x86, 0xa5, 0x8c, 0x1a, 0x35, 0xca, 0x8f, 0xf6, 0xe1, 0xe5, 0x34, +0xf9, 0xf2, 0x1e, 0x16, 0x7a, 0xc0, 0x81, 0x03, 0x7b, 0xd7, 0x3b, 0x6b, +0x06, 0x72, 0x53, 0xc2, 0xfb, 0x55, 0xfd, 0x4c, 0x4b, 0x49, 0xd5, 0x07, +0x54, 0xf0, 0x9e, 0xe0, 0x15, 0x74, 0xe7, 0x86, 0x3a, 0xd9, 0xd8, 0x2c, +0x9b, 0x94, 0xfa, 0x31, 0x57, 0xa4, 0x46, 0x4c, 0xd1, 0x74, 0xff, 0x5e, +0xb6, 0x6c, 0x19, 0xa4, 0x0c, 0x1d, 0xb3, 0x31, 0x20, 0x32, 0xd1, 0xa7, +0x9d, 0x12, 0x3d, 0xe0, 0x81, 0x8c, 0x67, 0xcc, 0xf3, 0x68, 0x45, 0xc8, +0xd3, 0x6c, 0xf0, 0xc4, 0x3e, 0xc0, 0xfb, 0x58, 0x23, 0x42, 0x47, 0x39, +0x13, 0x62, 0x82, 0xee, 0x01, 0x89, 0x1c, 0x7c, 0xbe, 0xe5, 0x96, 0x5b, +0x64, 0x6b, 0x81, 0x7a, 0x00, 0x03, 0x28, 0x82, 0xbf, 0x01, 0x27, 0xcc, +0x9d, 0x08, 0x27, 0xec, 0xc4, 0xef, 0xbf, 0xff, 0x3e, 0xbf, 0x72, 0xf2, +0xb4, 0x69, 0xd3, 0xf0, 0xf2, 0xea, 0x1d, 0xd7, 0xfd, 0x98, 0xbf, 0x4f, +0x97, 0x50, 0xac, 0x5f, 0x4f, 0x25, 0x55, 0xd7, 0xa2, 0xfc, 0x61, 0x7d, +0x62, 0x0b, 0xc0, 0x4d, 0xc1, 0xbe, 0x83, 0x41, 0x56, 0xb7, 0x3e, 0x01, +0x09, 0x62, 0x01, 0x89, 0x89, 0xd2, 0x3b, 0x86, 0x99, 0xef, 0xab, 0x3b, +0x5e, 0x7c, 0x9a, 0x55, 0xe5, 0x9e, 0x8c, 0x34, 0x48, 0x46, 0xa7, 0xee, +0x58, 0xd4, 0xe7, 0x43, 0x97, 0x0f, 0x5e, 0x34, 0x6f, 0x1c, 0x33, 0x0f, +0x02, 0x70, 0x50, 0xa6, 0x8a, 0xf8, 0xe0, 0xb9, 0x7e, 0xa6, 0x5d, 0x54, +0xa8, 0x58, 0x0f, 0x7c, 0xe3, 0xa4, 0xf3, 0x21, 0xcc, 0xe0, 0x5b, 0x25, +0xeb, 0x88, 0x12, 0x60, 0xe8, 0xc4, 0xc8, 0x33, 0x6c, 0x5d, 0x44, 0x7a, +0xda, 0x99, 0x34, 0x30, 0xc0, 0x83, 0x0b, 0x39, 0x52, 0x9a, 0x16, 0x77, +0x01, 0xfa, 0x34, 0x12, 0x0e, 0x1b, 0x3f, 0x22, 0x3e, 0xfc, 0x01, 0x91, +0x89, 0xfc, 0x66, 0xf0, 0x80, 0x90, 0x40, 0xe7, 0x38, 0x3c, 0x2c, 0xb8, +0xd2, 0x41, 0x23, 0x91, 0x0e, 0xc8, 0xd3, 0xd8, 0xd1, 0xd8, 0xe6, 0xd9, +0xec, 0xf1, 0xfb, 0x42, 0x43, 0xc8, 0x42, 0xec, 0xaf, 0xe0, 0x47, 0x56, +0x8d, 0x83, 0x89, 0x91, 0x14, 0x0a, 0xd1, 0xf3, 0x57, 0x60, 0x40, 0x97, +0x2d, 0x76, 0x5f, 0xb0, 0x84, 0x65, 0x1a, 0x15, 0x05, 0x4f, 0x0b, 0xe2, +0xbb, 0x9d, 0x49, 0x56, 0xca, 0x39, 0xa3, 0x47, 0x8f, 0x06, 0xb1, 0xac, +0x30, 0x4e, 0x25, 0x50, 0x21, 0x0e, 0x0a, 0xac, 0x52, 0x86, 0xbe, 0xa6, +0x1e, 0xe6, 0x86, 0xad, 0xa6, 0x4f, 0x9f, 0x3e, 0x94, 0xb5, 0x8d, 0x8b, +0xb3, 0xa8, 0x69, 0x5d, 0x29, 0x0f, 0xe5, 0xe1, 0xa6, 0x50, 0x02, 0xd1, +0x8d, 0x50, 0x11, 0x1b, 0x22, 0xff, 0xf3, 0xf8, 0x2d, 0x5a, 0xb4, 0x40, +0x06, 0x56, 0x97, 0x20, 0x25, 0xb2, 0x79, 0x41, 0x12, 0xbc, 0x3e, 0x0e, +0x64, 0x69, 0x82, 0x88, 0x03, 0x79, 0x0a, 0x76, 0x40, 0xe4, 0x6a, 0xb6, +0x4b, 0x88, 0x04, 0xc2, 0xf8, 0xe5, 0x2f, 0x7f, 0xe9, 0x2e, 0x2b, 0xd5, +0x96, 0x04, 0x25, 0x4c, 0x9c, 0x21, 0x20, 0x50, 0xde, 0x1c, 0x34, 0xc7, +0x1e, 0xcc, 0xae, 0xcc, 0x06, 0x86, 0x7d, 0x00, 0x49, 0x06, 0xe2, 0xe6, +0x40, 0x8c, 0x61, 0xde, 0x40, 0x85, 0x0d, 0x80, 0x07, 0x1e, 0x3c, 0x78, +0x30, 0xff, 0x63, 0x70, 0xc4, 0xd8, 0x0c, 0x45, 0x22, 0xe7, 0x20, 0xe4, +0x80, 0x54, 0x39, 0x99, 0xb5, 0x00, 0x0f, 0x12, 0x19, 0xca, 0x4e, 0x09, +0x7f, 0x80, 0xa6, 0x11, 0xac, 0x21, 0x62, 0x8c, 0x30, 0x30, 0x25, 0x90, +0xa0, 0x7c, 0xba, 0xe2, 0x56, 0xe7, 0x57, 0x26, 0x40, 0x29, 0x2b, 0xd0, +0x82, 0x08, 0x84, 0x62, 0x80, 0x7c, 0x05, 0x48, 0x78, 0x42, 0x76, 0x53, +0x58, 0x01, 0xd7, 0xc2, 0x5e, 0x94, 0x80, 0xc4, 0x38, 0x14, 0x9b, 0xd1, +0x0b, 0x93, 0x05, 0xb2, 0xa6, 0xf6, 0xaf, 0x85, 0xf5, 0xe9, 0x41, 0x31, +0xf6, 0x2f, 0x24, 0x0f, 0x9b, 0xe8, 0x03, 0x2a, 0x4d, 0xf0, 0xbc, 0x1c, +0xbc, 0x3f, 0x0f, 0xd7, 0xa2, 0xbd, 0x10, 0xc3, 0xaf, 0xea, 0x06, 0x70, +0x26, 0x92, 0x15, 0x46, 0x36, 0x56, 0x98, 0x75, 0x36, 0x68, 0xe4, 0xd8, +0x85, 0x2d, 0xcb, 0xbf, 0x5b, 0x8e, 0x8f, 0x06, 0xa8, 0x57, 0x12, 0x21, +0x64, 0x08, 0xa9, 0x83, 0x6d, 0x1b, 0x5e, 0x87, 0xef, 0x88, 0x1d, 0x0d, +0x7a, 0x45, 0x4b, 0x31, 0x5b, 0x3e, 0x50, 0x0b, 0xd9, 0xec, 0x48, 0x42, +0xe4, 0xbd, 0xa3, 0xfe, 0xf1, 0xea, 0x99, 0x06, 0xab, 0xc1, 0xc1, 0xdc, +0xa0, 0x7b, 0x0e, 0x88, 0x01, 0x55, 0x01, 0xea, 0x84, 0x00, 0x10, 0x77, +0x11, 0x10, 0x90, 0x91, 0x38, 0xa0, 0x04, 0x7e, 0x85, 0x24, 0x38, 0x01, +0x29, 0x7d, 0xc6, 0x8c, 0x19, 0x10, 0x06, 0xd2, 0x2f, 0x54, 0x41, 0x2e, +0x34, 0x12, 0x0a, 0x7b, 0x1c, 0xf5, 0x48, 0x91, 0xae, 0xf1, 0x35, 0x31, +0x0d, 0xb6, 0xe3, 0xde, 0xbd, 0x7b, 0x43, 0x63, 0x8c, 0x09, 0x75, 0x71, +0x3e, 0xe4, 0xb7, 0x70, 0xe1, 0x42, 0x79, 0x7c, 0x54, 0x4a, 0x7e, 0xa5, +0xb5, 0x39, 0x37, 0xe2, 0x76, 0xcc, 0x87, 0xff, 0xa1, 0x55, 0x28, 0x4d, +0x95, 0xc1, 0x46, 0x06, 0xb1, 0xd4, 0xdf, 0xec, 0xf2, 0x0a, 0x51, 0xd2, +0x11, 0xa2, 0x78, 0x61, 0x50, 0x24, 0x8c, 0x5e, 0xa6, 0x88, 0x70, 0x02, +0x94, 0x31, 0xfd, 0xa2, 0xc8, 0xb2, 0xd3, 0xf3, 0x0c, 0x48, 0x2f, 0xdc, +0x18, 0xc0, 0x20, 0xcc, 0xe8, 0x07, 0xdf, 0xf0, 0x3d, 0x7f, 0xe5, 0x1c, +0xce, 0x14, 0xf1, 0x06, 0x41, 0x08, 0x5e, 0x26, 0x12, 0x0e, 0x78, 0x10, +0x09, 0x87, 0x14, 0x10, 0xe4, 0x25, 0x09, 0x4d, 0x41, 0xb9, 0x14, 0x87, +0xae, 0x30, 0x2b, 0x71, 0x23, 0xb2, 0x95, 0xc2, 0x40, 0x60, 0x1d, 0x08, +0xd9, 0xf8, 0x80, 0x11, 0xc4, 0x09, 0x8e, 0x00, 0x24, 0x1c, 0xfc, 0x8a, +0xb6, 0xc0, 0xd3, 0xf2, 0x57, 0xbe, 0xd4, 0xc3, 0x04, 0x3c, 0x90, 0x17, +0xfa, 0x22, 0x5e, 0x3f, 0x14, 0x53, 0x02, 0xa1, 0xc9, 0xc5, 0x23, 0x61, +0x12, 0x57, 0x20, 0xd1, 0x1f, 0x44, 0x31, 0x10, 0x2a, 0x22, 0x3f, 0xa4, +0x2e, 0x60, 0x67, 0x23, 0x14, 0x9c, 0x64, 0x2e, 0xac, 0x2e, 0x04, 0xae, +0xa1, 0x50, 0x92, 0xf4, 0x6c, 0x39, 0xac, 0x9e, 0xa5, 0x68, 0x1f, 0x12, +0x72, 0x26, 0xb9, 0x44, 0xc0, 0x9e, 0x67, 0xc7, 0x91, 0xa7, 0xbb, 0x17, +0xd4, 0x38, 0x4c, 0x95, 0x40, 0x23, 0x0a, 0x3c, 0x4b, 0x0e, 0x96, 0xde, +0x5b, 0x1a, 0x42, 0x44, 0xcc, 0x90, 0xc5, 0x87, 0x22, 0xf5, 0x4b, 0x38, +0x13, 0x3b, 0x38, 0xee, 0x64, 0x66, 0x8e, 0x17, 0x0c, 0x83, 0x8f, 0xfa, +0x2b, 0x91, 0x04, 0xc4, 0x23, 0x63, 0x32, 0x46, 0x7f, 0x25, 0xa7, 0x12, +0x77, 0xbb, 0xa1, 0xd6, 0x1b, 0x34, 0xc7, 0x2e, 0x8e, 0x84, 0xa6, 0x87, +0xe8, 0xb9, 0x7b, 0x2e, 0xf6, 0x63, 0x11, 0x86, 0x99, 0x09, 0x3b, 0x3d, +0x2c, 0x5a, 0x91, 0x01, 0xe2, 0xae, 0x1c, 0x22, 0xe5, 0x22, 0x1a, 0x41, +0x03, 0xd0, 0x28, 0x26, 0x10, 0x14, 0x3c, 0xfe, 0x87, 0x96, 0xd8, 0x1c, +0xf9, 0x1e, 0x01, 0x18, 0x3a, 0x11, 0x53, 0x21, 0x72, 0x01, 0xdb, 0x1c, +0x07, 0x9b, 0x20, 0x7b, 0x1f, 0x3b, 0x32, 0x34, 0xc3, 0xe5, 0x0c, 0x22, +0x62, 0x33, 0xb7, 0x90, 0x31, 0x21, 0x30, 0x2a, 0x48, 0xf0, 0x27, 0x75, +0xf0, 0x2b, 0x5f, 0x0a, 0x41, 0x62, 0xc3, 0x14, 0x61, 0x0c, 0x49, 0x04, +0x79, 0x07, 0x52, 0x61, 0x85, 0xdd, 0xe5, 0x6a, 0xdb, 0xe5, 0x15, 0xa0, +0x42, 0x59, 0xa2, 0x90, 0x7d, 0x19, 0x14, 0xa6, 0xc1, 0xc6, 0xcc, 0x3e, +0x8d, 0x49, 0x87, 0x3b, 0xc1, 0xe3, 0xc0, 0x09, 0xf2, 0x0f, 0x54, 0xce, +0xbd, 0xf1, 0xd1, 0x32, 0x7b, 0x1e, 0x95, 0xff, 0x39, 0xf8, 0x86, 0xef, +0x11, 0x78, 0x30, 0x3e, 0x3e, 0xf8, 0xe0, 0x83, 0x3c, 0x1b, 0xaf, 0x9f, +0x2a, 0xd0, 0xec, 0xee, 0xd4, 0x24, 0x96, 0xdd, 0x1d, 0xbc, 0x41, 0x10, +0xe0, 0x01, 0x1d, 0x08, 0xce, 0x60, 0x99, 0x05, 0x22, 0xf0, 0x10, 0xbe, +0x01, 0x3c, 0x60, 0x1d, 0x9c, 0x8f, 0xd5, 0x19, 0x9c, 0x88, 0xac, 0x85, +0x50, 0xce, 0xf7, 0x8c, 0xa0, 0xfb, 0x7d, 0xf4, 0x57, 0x88, 0xeb, 0x00, +0xb2, 0x20, 0xd1, 0x9e, 0xe8, 0x20, 0x48, 0x3f, 0xc0, 0x22, 0x0c, 0x58, +0xd9, 0x01, 0x0c, 0x50, 0xd1, 0x93, 0xee, 0x75, 0x55, 0x18, 0xeb, 0x87, +0x6e, 0xc2, 0xc2, 0xce, 0x43, 0x96, 0x8f, 0xb2, 0xd5, 0xe0, 0x67, 0xc0, +0x4a, 0xa3, 0x77, 0xbe, 0x64, 0x2f, 0x64, 0x6d, 0xe1, 0x93, 0xd0, 0x96, +0x9a, 0x36, 0x79, 0x88, 0x18, 0x94, 0x08, 0x4a, 0x35, 0xcf, 0x56, 0x5a, +0x5a, 0xca, 0x81, 0x7e, 0xc2, 0x76, 0x03, 0x85, 0xb1, 0xe0, 0x3a, 0x32, +0xc9, 0xdf, 0x30, 0x9b, 0x59, 0x99, 0x39, 0x46, 0x4c, 0xcb, 0xf4, 0x46, +0x3d, 0x61, 0xcd, 0xdc, 0xc2, 0xdc, 0x2b, 0xce, 0xc9, 0x1c, 0x84, 0x1c, +0xd9, 0x28, 0xf1, 0x09, 0x20, 0x53, 0x08, 0x01, 0x70, 0x40, 0x12, 0x1c, +0x4c, 0x8f, 0x03, 0x4a, 0x80, 0x5a, 0xd8, 0x0a, 0xe1, 0x03, 0xec, 0x86, +0x90, 0x29, 0x32, 0x33, 0xf4, 0x80, 0x39, 0x84, 0x2d, 0x92, 0x3f, 0x41, +0x27, 0x10, 0x15, 0xdf, 0x20, 0x48, 0xb3, 0x4b, 0x72, 0x40, 0x75, 0xec, +0x74, 0x90, 0x1c, 0x57, 0x41, 0x4e, 0x0c, 0xc8, 0xf8, 0x02, 0x2a, 0x86, +0x15, 0x02, 0x03, 0x45, 0x8c, 0x0c, 0x11, 0xf2, 0x3f, 0x07, 0xbf, 0xf2, +0x25, 0x87, 0x92, 0xae, 0xd9, 0xcd, 0x71, 0x92, 0x22, 0x3b, 0x61, 0xd2, +0xb0, 0x8c, 0x1e, 0x10, 0x06, 0xe0, 0x03, 0x2a, 0xc4, 0x12, 0xc2, 0x36, +0xc6, 0x3b, 0x83, 0x10, 0x09, 0x20, 0x81, 0x8e, 0xd9, 0xda, 0x11, 0x54, +0xd8, 0xe3, 0x99, 0xae, 0x08, 0x33, 0x80, 0x1b, 0x9c, 0x50, 0x07, 0x09, +0xc9, 0x5e, 0x0e, 0x3e, 0xf3, 0x0d, 0xdf, 0xf3, 0x90, 0xb2, 0x04, 0xd8, +0x94, 0x78, 0x5a, 0xb6, 0x79, 0x54, 0x05, 0x84, 0x25, 0xb6, 0x76, 0x80, +0xab, 0xc2, 0x42, 0x61, 0x4a, 0x66, 0xbb, 0xa4, 0x32, 0x2a, 0x2b, 0xbe, +0x01, 0x36, 0x98, 0x0c, 0x0f, 0xa0, 0x0e, 0x89, 0x27, 0xe5, 0x57, 0x1e, +0x98, 0x74, 0x36, 0xf5, 0xfe, 0x10, 0x1e, 0x70, 0xe5, 0x52, 0x28, 0x09, +0x18, 0xf8, 0x54, 0x88, 0xc9, 0xa6, 0xcd, 0x9e, 0xd3, 0xcc, 0xb9, 0x94, +0x72, 0x77, 0x3b, 0x7d, 0x0b, 0xb0, 0x8d, 0xaa, 0xa9, 0xb2, 0xcb, 0xf2, +0xda, 0xe0, 0xc6, 0x3a, 0xf1, 0x79, 0xc8, 0xe2, 0xd7, 0x23, 0xff, 0x3a, +0x77, 0xee, 0x0c, 0xa1, 0xb0, 0x3d, 0xb1, 0x07, 0xeb, 0x97, 0xdb, 0x4c, +0x8b, 0x93, 0x87, 0x25, 0xee, 0x46, 0x37, 0x71, 0x5a, 0x5a, 0xc0, 0xd5, +0xe0, 0x48, 0x71, 0x64, 0x3b, 0x11, 0x4f, 0xc5, 0x46, 0xa3, 0xbe, 0x84, +0x4d, 0x31, 0x01, 0x68, 0x91, 0xbd, 0x0f, 0xca, 0x16, 0x02, 0x50, 0x07, +0xbb, 0xa1, 0x6c, 0x88, 0x50, 0x0b, 0x4f, 0x0a, 0xa1, 0xb3, 0x0b, 0x60, +0x53, 0x81, 0x52, 0x75, 0xa9, 0x18, 0x3a, 0x61, 0x11, 0x20, 0x12, 0x38, +0x3f, 0xf4, 0xc6, 0x66, 0x07, 0x79, 0x80, 0x0d, 0xe8, 0x0d, 0x4a, 0x63, +0x04, 0xf0, 0x83, 0xe9, 0x85, 0xf1, 0x01, 0x89, 0x10, 0x18, 0x52, 0x16, +0xc3, 0x72, 0x40, 0x84, 0x1c, 0x7c, 0x00, 0x72, 0x50, 0x1d, 0x07, 0x60, +0xe0, 0x33, 0x5f, 0xc2, 0x70, 0xb8, 0x97, 0x84, 0x8e, 0xbb, 0xdb, 0x79, +0x7d, 0x43, 0x85, 0x99, 0x2e, 0x21, 0x41, 0xd2, 0x2d, 0xd8, 0xad, 0x21, +0x6b, 0x66, 0x8f, 0xf4, 0xc2, 0xa4, 0x31, 0x16, 0x51, 0xee, 0x85, 0xed, +0x1f, 0x66, 0xc2, 0x24, 0xf8, 0x9f, 0xcf, 0x3c, 0x1e, 0xe0, 0x01, 0x06, +0x3c, 0x3c, 0x92, 0x0f, 0x8f, 0x07, 0xae, 0x44, 0x73, 0x90, 0x28, 0x14, +0x11, 0x93, 0x3c, 0xc4, 0xb8, 0xdb, 0xf9, 0x93, 0x0c, 0xc2, 0x80, 0x7a, +0x4b, 0x0d, 0x36, 0xda, 0xf2, 0xcb, 0x8b, 0x12, 0x4a, 0x22, 0x9d, 0xc0, +0xdc, 0xbd, 0x12, 0x2a, 0xb1, 0x99, 0xbb, 0x8b, 0x6f, 0x47, 0x91, 0x14, +0x7a, 0x27, 0x2f, 0x0f, 0x05, 0x43, 0x7d, 0x43, 0x81, 0x71, 0x0f, 0x48, +0xd6, 0x1b, 0xcf, 0x61, 0xd1, 0x67, 0x77, 0xe4, 0x72, 0x44, 0x6a, 0x75, +0x39, 0x19, 0xe1, 0xf6, 0xb1, 0xcd, 0x99, 0x3a, 0xf3, 0xc9, 0xcc, 0x34, +0x46, 0x2e, 0x13, 0xa2, 0x42, 0x35, 0x78, 0x50, 0xea, 0x4a, 0x33, 0xfc, +0xa1, 0xd1, 0x04, 0x81, 0xb7, 0xba, 0x8b, 0x06, 0x05, 0x92, 0xcd, 0x5b, +0x4c, 0x88, 0x6c, 0x7f, 0x42, 0x00, 0xea, 0x80, 0x12, 0x38, 0xc4, 0x32, +0x2e, 0xa2, 0x32, 0xbc, 0x5d, 0x36, 0x32, 0xe8, 0x01, 0x7a, 0x65, 0xab, +0x65, 0xaf, 0x14, 0x3a, 0x91, 0x8e, 0xa6, 0xc8, 0x39, 0x72, 0x40, 0x6c, +0xec, 0x9e, 0x90, 0x35, 0xa3, 0xb1, 0x11, 0x33, 0x38, 0xb8, 0xe2, 0x03, +0xbf, 0xf2, 0xc6, 0x45, 0x90, 0x86, 0xc6, 0x20, 0x42, 0x39, 0xf8, 0x15, +0x6a, 0xe4, 0x4f, 0xf2, 0x57, 0xfe, 0x04, 0xc3, 0x01, 0x5d, 0xdc, 0xce, +0x1c, 0x63, 0xa6, 0x13, 0x98, 0x0f, 0xbc, 0x42, 0xbf, 0x4c, 0xf8, 0x06, +0x13, 0xd5, 0x85, 0x19, 0x08, 0x1d, 0xc6, 0x84, 0x14, 0xc4, 0xc3, 0x08, +0xd7, 0x53, 0x07, 0xdf, 0x70, 0xf0, 0x57, 0xce, 0x61, 0x21, 0x54, 0xf6, +0x8c, 0x0a, 0x90, 0xb6, 0x43, 0xf4, 0x5e, 0xcf, 0x11, 0x36, 0xc2, 0xfa, +0x62, 0x90, 0xf6, 0x9b, 0x2c, 0x7c, 0xa2, 0x21, 0x39, 0x59, 0x27, 0x4d, +0x7d, 0x93, 0xb6, 0x59, 0x94, 0x44, 0x2f, 0x63, 0x4e, 0xdc, 0x17, 0x52, +0xb5, 0x3e, 0x88, 0x87, 0x24, 0x04, 0x6e, 0x4d, 0x07, 0x67, 0x75, 0x32, +0xec, 0x91, 0x1d, 0x9a, 0x5d, 0x56, 0x8f, 0x8e, 0xf1, 0xa9, 0xda, 0x22, +0xba, 0x87, 0x4e, 0xdf, 0x28, 0xd9, 0x6a, 0x70, 0x04, 0x3f, 0x77, 0x49, +0xed, 0x27, 0xd7, 0x94, 0xe6, 0x3f, 0x61, 0x63, 0x45, 0x76, 0x12, 0xdf, +0x0b, 0x94, 0x0d, 0x89, 0x2b, 0x1a, 0x40, 0xb8, 0xe0, 0x33, 0xff, 0x73, +0x40, 0xfd, 0xfa, 0xb6, 0x28, 0x84, 0x24, 0xd9, 0x54, 0x90, 0x07, 0xc2, +0xb0, 0xc8, 0x0e, 0xaa, 0x9e, 0x9f, 0xf2, 0xd8, 0xf0, 0x72, 0xf9, 0xab, +0x08, 0x54, 0x6c, 0xc4, 0xfc, 0xcf, 0xc1, 0x80, 0x50, 0x17, 0x63, 0x72, +0x40, 0x63, 0xea, 0xe0, 0x57, 0xa8, 0x51, 0x08, 0x52, 0xfe, 0x04, 0xcf, +0x81, 0xe2, 0x11, 0x46, 0x3c, 0x6f, 0xc1, 0x7e, 0xa2, 0x42, 0xe7, 0x1b, +0x42, 0x8b, 0xa2, 0x0d, 0x73, 0x3f, 0x1e, 0xcf, 0xdd, 0xc1, 0x5f, 0x05, +0xf4, 0xca, 0xf2, 0xe8, 0x95, 0xd0, 0x7d, 0x3a, 0x81, 0x99, 0x30, 0x38, +0xcb, 0x7a, 0xe9, 0xa5, 0x97, 0xaa, 0xd7, 0x89, 0x53, 0xd6, 0x0f, 0x42, +0xf7, 0xe9, 0x12, 0xcb, 0x8a, 0xf9, 0xf6, 0x73, 0x97, 0xf5, 0x94, 0x43, +0xb6, 0x79, 0x4c, 0x3d, 0x6a, 0xf2, 0x48, 0x26, 0x9e, 0x43, 0x30, 0xf5, +0x3c, 0x04, 0xf4, 0x19, 0x04, 0x68, 0xf6, 0x69, 0x75, 0x39, 0xa6, 0x24, +0x0f, 0xb5, 0x70, 0xcc, 0xcf, 0xa8, 0x67, 0x90, 0x13, 0x77, 0xa4, 0xbb, +0xc3, 0x31, 0x42, 0xb8, 0x5b, 0x13, 0x1d, 0xd5, 0x48, 0x71, 0x88, 0x4f, +0x18, 0xcd, 0xd9, 0xc8, 0x21, 0x5f, 0x69, 0x33, 0x67, 0x3e, 0x84, 0x12, +0x74, 0x19, 0x41, 0xb7, 0xa9, 0x28, 0x22, 0x31, 0xec, 0xe8, 0xba, 0xf0, +0xcc, 0x98, 0x58, 0x90, 0xf4, 0x91, 0x19, 0x53, 0x11, 0x98, 0x90, 0xa2, +0x3a, 0x38, 0x4d, 0x3e, 0xdb, 0x24, 0xbc, 0x40, 0x51, 0x21, 0x54, 0x2b, +0x8f, 0x04, 0xf7, 0xe0, 0x10, 0x84, 0x58, 0x1e, 0x72, 0x82, 0x32, 0x2b, +0xf9, 0x44, 0xf1, 0x76, 0x4e, 0x66, 0x70, 0x9e, 0x9c, 0x5d, 0x41, 0xdf, +0x2c, 0x2d, 0x2b, 0xcd, 0xf8, 0x44, 0xf4, 0x9e, 0x4f, 0x76, 0xd7, 0xcb, +0xdd, 0x32, 0xc7, 0xc8, 0x72, 0x28, 0x3d, 0x47, 0x0c, 0xdf, 0xa2, 0xce, +0x28, 0xdc, 0x95, 0x0f, 0x53, 0xe3, 0x50, 0xed, 0x41, 0x9d, 0x8f, 0x0e, +0x80, 0xf6, 0x89, 0x17, 0x48, 0x7d, 0x03, 0xde, 0xec, 0x3f, 0x29, 0x72, +0x60, 0xdd, 0x9c, 0x52, 0xab, 0x1a, 0x06, 0x59, 0xdd, 0xe8, 0xe4, 0xae, +0x83, 0x04, 0xf1, 0xce, 0xba, 0x19, 0x17, 0x23, 0x87, 0xc4, 0x38, 0x22, +0x45, 0xb3, 0xd3, 0x4b, 0xeb, 0x20, 0xf3, 0xa1, 0x28, 0xc1, 0xf0, 0x5a, +0x15, 0x6d, 0x28, 0x3a, 0x31, 0x9f, 0xe0, 0x8e, 0xc6, 0x64, 0x4c, 0xcb, +0x43, 0xc0, 0xe0, 0x6e, 0x4c, 0x33, 0x69, 0x05, 0x07, 0x15, 0x76, 0x48, +0xb6, 0x02, 0xce, 0x11, 0xf3, 0x14, 0xbb, 0x94, 0xbe, 0x59, 0x06, 0x25, +0xdb, 0xdb, 0x03, 0x6d, 0x61, 0xd0, 0x34, 0x9b, 0x65, 0x7c, 0xea, 0x64, +0x45, 0x5d, 0x1c, 0x35, 0x82, 0x1e, 0x34, 0x30, 0xa8, 0xb3, 0x77, 0x9a, +0x26, 0xef, 0x59, 0x5d, 0x8b, 0xf3, 0x0e, 0xcb, 0xa6, 0x6e, 0x66, 0xf0, +0xa9, 0x91, 0x85, 0xa1, 0x60, 0x14, 0x1e, 0x06, 0x35, 0x32, 0x55, 0x4b, +0xdc, 0xad, 0x80, 0xce, 0x5e, 0x30, 0x25, 0x23, 0xfe, 0x89, 0x87, 0xc1, +0x5d, 0x8f, 0xb9, 0x0a, 0x20, 0x83, 0xc0, 0x6f, 0x11, 0x6e, 0xa8, 0x60, +0x73, 0xd2, 0x9d, 0x5f, 0x3e, 0x35, 0x9a, 0xb1, 0xbf, 0xad, 0xaa, 0x33, +0x51, 0x34, 0xf5, 0x50, 0x36, 0x45, 0x46, 0x38, 0x37, 0xec, 0x8f, 0x66, +0x59, 0x22, 0x0d, 0x0b, 0xb2, 0x9d, 0x92, 0x7e, 0xc4, 0x9f, 0xea, 0x98, +0xc4, 0x3d, 0xaa, 0x7e, 0x25, 0xc2, 0xdc, 0x7e, 0xe3, 0x18, 0xc6, 0xd1, +0x63, 0xce, 0x89, 0xc2, 0xd0, 0x05, 0x39, 0x0f, 0x59, 0x03, 0xaa, 0xc3, +0x37, 0xf7, 0xc5, 0x85, 0x27, 0x85, 0x33, 0xd0, 0xb3, 0xd1, 0x95, 0xdd, +0xf9, 0xc8, 0x02, 0xa7, 0xda, 0xf2, 0x1e, 0x21, 0xac, 0x50, 0x21, 0x6e, +0x3e, 0xdc, 0x99, 0x8a, 0x32, 0xdc, 0xf5, 0xd2, 0xb6, 0x4f, 0xb2, 0x9e, +0xcf, 0xc4, 0xed, 0x65, 0x66, 0x14, 0x64, 0x84, 0xfa, 0x34, 0xbe, 0x9e, +0x41, 0xaa, 0x46, 0x73, 0xd7, 0xf8, 0xc7, 0x3c, 0x32, 0xc9, 0x89, 0xea, +0x2a, 0x3d, 0x93, 0xd3, 0xa7, 0xc6, 0x31, 0xe7, 0xb6, 0xf6, 0xd7, 0x1f, +0x04, 0x41, 0x4e, 0x4f, 0xba, 0xa4, 0x66, 0x8c, 0xe5, 0x13, 0x19, 0xfc, +0x7d, 0x84, 0xeb, 0xe3, 0x37, 0xc0, 0x48, 0x8a, 0x95, 0x09, 0x05, 0xd7, +0x9c, 0xe3, 0x56, 0xde, 0xd4, 0x1c, 0xac, 0xf1, 0xc3, 0x0d, 0x15, 0xd8, +0x28, 0xf4, 0xe6, 0x29, 0xbc, 0x6c, 0x9f, 0x08, 0xd4, 0xd7, 0x93, 0x2d, +0x09, 0xda, 0xd7, 0x84, 0x1e, 0x73, 0xe9, 0x41, 0x62, 0x2e, 0xec, 0x37, +0x31, 0xd1, 0x43, 0xf4, 0xf5, 0x5a, 0x4f, 0x3e, 0xd5, 0xef, 0xd0, 0x35, +0x7e, 0x22, 0xa9, 0x08, 0xa3, 0x50, 0x20, 0xc1, 0xf9, 0xed, 0x2e, 0x77, +0xf7, 0xaa, 0x09, 0xa5, 0x45, 0x06, 0x08, 0x7c, 0x24, 0x6a, 0x41, 0x35, +0x23, 0xc5, 0xe6, 0x21, 0xa1, 0x09, 0xc1, 0xa2, 0xd4, 0x8a, 0x1c, 0x27, +0xac, 0x50, 0xc1, 0xe6, 0x84, 0xa7, 0x5c, 0xbd, 0x4e, 0x36, 0x51, 0x0f, +0xe5, 0x86, 0x7c, 0x05, 0x80, 0xf9, 0x7c, 0xc3, 0x4e, 0x29, 0xf7, 0xa5, +0x62, 0x9a, 0xaf, 0xf9, 0x93, 0x7a, 0xa1, 0x5b, 0x19, 0xc4, 0xa7, 0xe2, +0xdb, 0x96, 0x65, 0xcc, 0x81, 0x8a, 0x7d, 0x7f, 0xa5, 0x9e, 0xe9, 0xcf, +0xdd, 0xd1, 0x28, 0xc8, 0x51, 0x51, 0xcb, 0x48, 0x90, 0x88, 0xe5, 0x5a, +0xe1, 0x17, 0xa7, 0x40, 0xa8, 0x3a, 0x8d, 0x78, 0x13, 0x62, 0x7f, 0xf0, +0xaf, 0xc1, 0x28, 0x24, 0xef, 0x5c, 0xb4, 0xdb, 0x8a, 0xa4, 0xe6, 0x60, +0xdd, 0x2b, 0xac, 0x50, 0x81, 0x52, 0x41, 0xac, 0x81, 0x7a, 0x4f, 0xf6, +0x53, 0x93, 0x31, 0xbf, 0xb0, 0x59, 0x92, 0x4b, 0x44, 0xd1, 0x37, 0xf6, +0x3f, 0xa2, 0xa1, 0x08, 0xaf, 0xa0, 0x44, 0x08, 0xb9, 0x6c, 0x1e, 0x94, +0x75, 0xa4, 0x6d, 0xb3, 0xf8, 0x84, 0xef, 0xc2, 0x57, 0xbc, 0x19, 0x92, +0x48, 0x3d, 0xbb, 0xed, 0xcc, 0x83, 0xab, 0x04, 0x51, 0x7d, 0x32, 0x74, +0xe8, 0xb3, 0x3f, 0x0d, 0xc2, 0x49, 0xd4, 0xb5, 0xf4, 0x13, 0xd3, 0xad, +0x58, 0x7c, 0x4f, 0xe9, 0x51, 0xcb, 0xa1, 0xf4, 0x56, 0x5a, 0x44, 0x4c, +0xe3, 0x95, 0xc7, 0x28, 0x4c, 0xe0, 0x06, 0x7a, 0xb6, 0x87, 0xbe, 0x41, +0xc1, 0x22, 0xdc, 0x72, 0x1d, 0x27, 0x7c, 0x50, 0xc1, 0xb6, 0xc4, 0xfe, +0x44, 0x10, 0xa5, 0x7a, 0xc1, 0xb7, 0x5c, 0xde, 0xc1, 0x26, 0x65, 0x60, +0xbd, 0x35, 0xd3, 0xb7, 0xfa, 0x86, 0x80, 0x11, 0x72, 0x09, 0x49, 0x22, +0x23, 0x82, 0x70, 0xee, 0x88, 0x26, 0xc0, 0x46, 0xf2, 0xd1, 0xcc, 0xe4, +0x48, 0x98, 0x9d, 0x1f, 0x99, 0x9f, 0x86, 0xdc, 0x34, 0xcf, 0x6e, 0x3b, +0xf3, 0x13, 0x59, 0x06, 0xc3, 0x9e, 0xd9, 0xd0, 0xd7, 0xe6, 0xb3, 0x13, +0x0f, 0xa2, 0xa7, 0x0a, 0x13, 0xaf, 0xa1, 0x47, 0x55, 0x12, 0x8c, 0xe8, +0x6e, 0x1c, 0x3d, 0xd1, 0x8f, 0x40, 0x5a, 0xa2, 0xf4, 0x88, 0xd0, 0xc6, +0xd9, 0x4c, 0x08, 0x4f, 0xe8, 0xea, 0xd9, 0x02, 0xb6, 0x30, 0x41, 0x85, +0xf8, 0xef, 0x60, 0xdc, 0x7a, 0x80, 0xfe, 0xdb, 0x47, 0x47, 0xd8, 0xa4, +0x0c, 0x38, 0x03, 0x8d, 0x49, 0xc9, 0x66, 0xd6, 0x83, 0x49, 0x3d, 0xe0, +0xc4, 0xdd, 0x9f, 0x28, 0x10, 0x68, 0xf3, 0x8e, 0xfa, 0x69, 0xaa, 0x09, +0x2f, 0xc3, 0x7a, 0x75, 0xdb, 0x99, 0xc7, 0x37, 0xa7, 0xbf, 0x93, 0xe4, +0x69, 0xbf, 0x8a, 0x8f, 0x9e, 0x24, 0x4d, 0x55, 0x66, 0x22, 0xae, 0xf5, +0xa7, 0x73, 0x87, 0x2e, 0x52, 0xf0, 0x75, 0x2d, 0x9f, 0x40, 0x6e, 0x52, +0x6e, 0x08, 0x7c, 0x22, 0xb6, 0x02, 0x7f, 0x51, 0xe8, 0x6a, 0x14, 0x61, +0x85, 0x0a, 0x3c, 0x15, 0xec, 0x4f, 0x7a, 0x61, 0x1e, 0x12, 0x0f, 0x7c, +0x95, 0xef, 0x85, 0xe0, 0xc8, 0x7c, 0x27, 0x74, 0x9c, 0xb4, 0xfa, 0x9d, +0x57, 0x15, 0x12, 0x14, 0x44, 0xa8, 0x36, 0x3d, 0x19, 0x70, 0x6f, 0x79, +0xad, 0xac, 0x43, 0x8a, 0xb0, 0x87, 0x0e, 0x1b, 0x1e, 0x26, 0xa3, 0x97, +0x8f, 0xf7, 0xea, 0xb6, 0x33, 0xa0, 0x02, 0xd6, 0x64, 0x86, 0xa8, 0xcd, +0xd6, 0x5b, 0x0c, 0x45, 0x10, 0x87, 0x5e, 0x93, 0x8e, 0xca, 0x0f, 0x7a, +0x66, 0x48, 0x8f, 0xd6, 0x6e, 0xcb, 0xd7, 0xea, 0xed, 0x51, 0x50, 0xf1, +0x25, 0x6f, 0x81, 0x38, 0x3c, 0xa2, 0x9b, 0x3c, 0x57, 0xbd, 0x2f, 0x57, +0xc9, 0x27, 0x58, 0x83, 0x87, 0x09, 0xaf, 0x40, 0xcf, 0x26, 0xb8, 0x40, +0x0f, 0xf4, 0xa0, 0x83, 0x8e, 0x1f, 0xdb, 0xb6, 0x87, 0x4b, 0xa0, 0x78, +0x6a, 0x45, 0xb2, 0x77, 0xba, 0x63, 0x14, 0xd4, 0xfd, 0xf6, 0x70, 0x39, +0xfd, 0x90, 0xdc, 0xfd, 0x55, 0x55, 0x85, 0xf2, 0xdc, 0x48, 0x8d, 0x06, +0x28, 0xe6, 0x11, 0x08, 0x7c, 0x34, 0xcf, 0xc7, 0x3e, 0xb4, 0x10, 0x32, +0xd5, 0xe5, 0x84, 0x78, 0xe8, 0xdd, 0xd3, 0xd9, 0x05, 0xc8, 0x30, 0x71, +0x37, 0x67, 0xdd, 0xf8, 0x46, 0x89, 0x2d, 0x72, 0x06, 0x09, 0xff, 0x26, +0x1a, 0x9a, 0xa8, 0x24, 0x82, 0xdc, 0x42, 0x54, 0xc9, 0x56, 0xa0, 0x0a, +0x13, 0x54, 0xa0, 0x67, 0xb3, 0x45, 0xe9, 0xc9, 0x00, 0xf6, 0x8b, 0xd8, +0xf9, 0x04, 0x1e, 0xbd, 0x86, 0x8a, 0x9e, 0x94, 0x4b, 0x71, 0x13, 0xcf, +0x25, 0x77, 0x0f, 0xae, 0x74, 0x8b, 0x19, 0xc9, 0xa7, 0xf3, 0xea, 0xb6, +0xb3, 0x6c, 0x19, 0x4c, 0x98, 0x93, 0x01, 0x15, 0x54, 0xe3, 0xb5, 0xd9, +0x14, 0x0a, 0x1b, 0x03, 0xd3, 0x56, 0x97, 0x13, 0xe2, 0xa1, 0x0f, 0x45, +0x1b, 0x1a, 0x77, 0x2b, 0x63, 0x08, 0x72, 0x21, 0xf7, 0x4d, 0xea, 0x7b, +0x63, 0x7d, 0x92, 0xbc, 0x85, 0x60, 0xed, 0xd9, 0x95, 0x35, 0x4e, 0x98, +0xa0, 0x82, 0x37, 0xa1, 0x77, 0xd5, 0xc0, 0x58, 0x69, 0x5f, 0xb0, 0xf6, +0x09, 0x15, 0x1f, 0x9f, 0x28, 0x35, 0xe4, 0xeb, 0xe9, 0xd1, 0x9e, 0xbb, +0x41, 0x53, 0x35, 0xd0, 0x83, 0xb1, 0x55, 0x48, 0xd3, 0xb3, 0xdb, 0x0e, +0xa1, 0x8e, 0x3e, 0xed, 0xe6, 0xa9, 0x52, 0x1b, 0xd7, 0x80, 0x8a, 0xcb, +0x47, 0xdb, 0x6d, 0x88, 0x8a, 0x16, 0xa4, 0x5f, 0xab, 0xab, 0x64, 0x00, +0xd5, 0x43, 0x49, 0x42, 0xbd, 0xe4, 0x3d, 0x01, 0x26, 0x88, 0x4f, 0xd2, +0x43, 0x19, 0xf1, 0x89, 0xa0, 0x54, 0x44, 0xd9, 0xca, 0xa2, 0xe6, 0x60, +0xdd, 0x37, 0x1c, 0x50, 0x01, 0xbf, 0x86, 0x6b, 0xeb, 0x4d, 0xc9, 0x48, +0x53, 0xf6, 0x89, 0xd6, 0xed, 0x9f, 0x4c, 0xbf, 0x12, 0xb3, 0xc4, 0x82, +0xd9, 0xde, 0xb3, 0x63, 0x84, 0x6d, 0xde, 0x83, 0x7c, 0x45, 0x15, 0x29, +0xaf, 0x6e, 0x3b, 0x22, 0x08, 0x2d, 0x43, 0xfd, 0xcc, 0x3e, 0x13, 0x92, +0x57, 0x6d, 0x3e, 0x0e, 0x95, 0xbb, 0xd4, 0xb3, 0xe8, 0x7c, 0x0f, 0xae, +0xe5, 0xa1, 0x3f, 0xa0, 0xde, 0x64, 0x9e, 0xcb, 0x71, 0x53, 0xe0, 0xbc, +0x23, 0x01, 0x88, 0xec, 0x05, 0x62, 0xb6, 0x25, 0xd5, 0x3e, 0x58, 0xd4, +0x59, 0x59, 0xe3, 0x84, 0x09, 0x2a, 0x10, 0x9f, 0xf4, 0x5a, 0xb4, 0xe5, +0xd7, 0x94, 0x4c, 0xcf, 0xde, 0x54, 0x24, 0xe5, 0xb5, 0xf3, 0x2a, 0x3d, +0x5a, 0xcf, 0x6e, 0x76, 0x5b, 0xc1, 0x92, 0x6a, 0xb9, 0x9e, 0xab, 0xcf, +0x93, 0x47, 0xce, 0xbd, 0xc6, 0xf6, 0xae, 0x67, 0x26, 0x77, 0xba, 0x2b, +0xe9, 0x28, 0xc5, 0x2a, 0x60, 0xd3, 0x34, 0x8c, 0x8f, 0xcf, 0x9d, 0x82, +0xe4, 0xb9, 0x30, 0x26, 0xf9, 0x8c, 0xfa, 0x85, 0x52, 0xaf, 0x09, 0x3d, +0x9b, 0x6c, 0x07, 0xde, 0x82, 0xa1, 0x92, 0x55, 0x65, 0x91, 0x75, 0x80, +0xf7, 0x0d, 0x79, 0x54, 0x48, 0x04, 0x3b, 0x7b, 0x95, 0xee, 0x5e, 0xb0, +0xef, 0xd6, 0xb5, 0xb9, 0xad, 0xca, 0x69, 0x84, 0x6d, 0x9b, 0x9b, 0xf3, +0x12, 0x1d, 0xe8, 0x39, 0x2c, 0xf7, 0xcd, 0xc3, 0xae, 0xc2, 0x02, 0xf8, +0x8f, 0xdd, 0xdd, 0x8b, 0x32, 0x98, 0x1e, 0x26, 0x8c, 0xf4, 0x8f, 0xc9, +0x98, 0x11, 0x2c, 0xdb, 0x4a, 0x91, 0x13, 0xa7, 0xd3, 0x28, 0x95, 0x0e, +0x6d, 0x3e, 0x11, 0x66, 0x6b, 0x4b, 0x54, 0x50, 0x01, 0xd6, 0xf3, 0x08, +0x7a, 0x19, 0x63, 0x22, 0xf6, 0x0d, 0x75, 0xd4, 0x43, 0xd7, 0x9f, 0xad, +0x03, 0x29, 0xe4, 0x51, 0x21, 0x29, 0x81, 0xf3, 0xe7, 0xcf, 0x57, 0xef, +0x18, 0xef, 0x92, 0x4d, 0xca, 0xf0, 0xf5, 0x34, 0x44, 0x76, 0x33, 0x25, +0x79, 0x6d, 0x32, 0x22, 0xe5, 0xf8, 0x3d, 0x94, 0x4d, 0xb8, 0x67, 0x5d, +0x1f, 0x0f, 0x33, 0xd9, 0x75, 0xd5, 0xc5, 0x56, 0xdc, 0x96, 0xf6, 0x56, +0x5c, 0x7e, 0xfa, 0x94, 0x50, 0x3f, 0x6c, 0x3e, 0x94, 0xea, 0xc3, 0xa2, +0x2e, 0x47, 0x70, 0xa2, 0xb5, 0x9f, 0xe7, 0xcb, 0x41, 0xaf, 0xee, 0xbb, +0x24, 0x93, 0x96, 0xd8, 0x75, 0xac, 0x4f, 0x1e, 0xea, 0xa8, 0x07, 0xb8, +0x6d, 0x57, 0xca, 0xe5, 0x21, 0x8f, 0x0a, 0xc9, 0xa9, 0xd0, 0xad, 0x4f, +0xd4, 0x39, 0xb7, 0x49, 0x19, 0x3e, 0x9d, 0x06, 0x19, 0xe9, 0xe9, 0x35, +0x42, 0x4c, 0xa8, 0xf5, 0x96, 0xb5, 0xe6, 0xd5, 0xc8, 0x52, 0x8e, 0x9f, +0xa0, 0x6e, 0x0f, 0xfe, 0x0a, 0x0f, 0x7f, 0x22, 0x14, 0x5c, 0x55, 0x00, +0xb1, 0x6c, 0x20, 0x86, 0xf0, 0xa6, 0xc8, 0xda, 0xa7, 0x02, 0xd2, 0x8c, +0xac, 0x37, 0x7f, 0x42, 0xbd, 0xb6, 0xd3, 0xea, 0x49, 0x77, 0xf9, 0x11, +0x54, 0x4b, 0xc9, 0x19, 0xa9, 0xc3, 0x47, 0x7a, 0xb4, 0xbb, 0xea, 0x94, +0x95, 0x42, 0xd6, 0x01, 0xde, 0x34, 0xb4, 0x51, 0x81, 0xf8, 0x84, 0x4d, +0x96, 0x2a, 0x29, 0x8a, 0x32, 0xf0, 0x49, 0x05, 0xab, 0xab, 0x95, 0x8e, +0x19, 0x2c, 0x5a, 0x7a, 0x19, 0x0b, 0x75, 0x3b, 0x0a, 0x80, 0x7b, 0x86, +0x16, 0x75, 0x71, 0x38, 0xb9, 0x7e, 0x9e, 0xdb, 0xac, 0x1d, 0xcf, 0x97, +0xeb, 0xb5, 0x05, 0x2c, 0x65, 0x1b, 0x44, 0x26, 0x35, 0x19, 0xcb, 0x0a, +0x37, 0x1e, 0xc6, 0xc7, 0x13, 0x07, 0x62, 0xf1, 0x51, 0xc2, 0x22, 0xec, +0x14, 0x7c, 0xc0, 0x0d, 0xa2, 0xf3, 0x25, 0x92, 0x51, 0xc5, 0x4d, 0x41, +0xb5, 0x0e, 0xea, 0x0f, 0x84, 0x87, 0x9e, 0x1d, 0xf2, 0xbe, 0x6d, 0xc9, +0xe2, 0x25, 0x10, 0x8d, 0xba, 0xb7, 0xea, 0x6d, 0xb9, 0x0b, 0xf0, 0x34, +0x13, 0x07, 0x89, 0x41, 0x52, 0x48, 0xdc, 0xce, 0x8f, 0x1e, 0x1c, 0xaa, +0x2b, 0x30, 0x5e, 0xb3, 0xa2, 0xb1, 0xfa, 0x73, 0x3e, 0x31, 0x54, 0x3e, +0xf1, 0x25, 0x39, 0x99, 0xa4, 0x50, 0x3d, 0xaa, 0xc2, 0xd2, 0xf8, 0x4b, +0x5d, 0x6e, 0x35, 0x1f, 0x0f, 0xaa, 0x8b, 0x1f, 0x77, 0x37, 0x5c, 0x42, +0x82, 0x38, 0x81, 0x24, 0xea, 0x5e, 0x54, 0x43, 0xa3, 0xb6, 0x1f, 0x8c, +0x82, 0xaa, 0x33, 0x94, 0xd8, 0xa0, 0xbc, 0x40, 0xe8, 0x66, 0x53, 0x98, +0x19, 0x4b, 0x08, 0xf3, 0x0a, 0x89, 0x7d, 0x62, 0x97, 0xa2, 0xa6, 0xb7, +0x7a, 0x5b, 0xd8, 0x64, 0x6c, 0x52, 0x80, 0x1e, 0x28, 0xea, 0xce, 0x1a, +0xe3, 0xf9, 0x7b, 0xc2, 0x04, 0x3d, 0xdf, 0x0b, 0x73, 0x10, 0x01, 0xb0, +0x0c, 0xe2, 0x9f, 0xaa, 0xa3, 0xd7, 0x05, 0x64, 0x10, 0xcb, 0x68, 0x5c, +0x55, 0x48, 0x81, 0x22, 0x4e, 0x36, 0x9d, 0x77, 0x36, 0xd7, 0x47, 0x3f, +0x0d, 0xb7, 0x9d, 0x3c, 0x88, 0x3a, 0x28, 0x92, 0x49, 0xe0, 0x13, 0x55, +0x0b, 0x60, 0x14, 0xb8, 0x29, 0x28, 0xd8, 0x11, 0xea, 0xb1, 0x4f, 0x61, +0xa2, 0x6d, 0x8b, 0x46, 0x41, 0xc1, 0x46, 0xf5, 0xaa, 0x90, 0x07, 0x6c, +0xc6, 0x3e, 0x19, 0xb4, 0x46, 0x35, 0x02, 0x91, 0x76, 0x84, 0x33, 0x51, +0xcf, 0x8f, 0x0e, 0x7d, 0xaa, 0x9f, 0x03, 0xa5, 0xfe, 0x48, 0x81, 0x30, +0xf4, 0xdf, 0x40, 0x28, 0xf7, 0xda, 0xf8, 0x19, 0xab, 0xbf, 0x8c, 0xec, +0xc1, 0x4f, 0xec, 0x8e, 0x46, 0x69, 0x5c, 0x62, 0xc0, 0xe4, 0x2b, 0x07, +0x86, 0x9a, 0x4f, 0x56, 0x91, 0x85, 0xd8, 0x64, 0xfd, 0x20, 0x77, 0x3b, +0x97, 0xd0, 0x88, 0x07, 0x7f, 0xb9, 0x3e, 0x99, 0xae, 0x5d, 0xbb, 0x62, +0x90, 0xa5, 0x00, 0x26, 0xd9, 0x14, 0x94, 0x7b, 0xc2, 0x4d, 0x21, 0x15, +0xa3, 0x43, 0x3d, 0xd0, 0x23, 0x1c, 0x22, 0x3e, 0x24, 0x1f, 0x55, 0x4f, +0x2f, 0xf6, 0x6a, 0x0e, 0x52, 0x44, 0xa0, 0x5a, 0xa6, 0xf3, 0xb2, 0x71, +0x66, 0x51, 0xfd, 0x8e, 0x6f, 0xa8, 0xf3, 0xe7, 0xa1, 0x7d, 0x3a, 0x1b, +0x3f, 0xd6, 0x4c, 0x1a, 0x3b, 0x49, 0x30, 0x9f, 0x9d, 0x06, 0x68, 0x84, +0x9d, 0x0b, 0x31, 0x79, 0xed, 0xe9, 0x68, 0xa0, 0x4e, 0xb0, 0x8d, 0xb8, +0x6f, 0x40, 0x85, 0x39, 0x09, 0x9b, 0xd3, 0x94, 0x45, 0x88, 0xa2, 0xb7, +0x76, 0x48, 0xdc, 0xd7, 0x73, 0xf0, 0x7f, 0x1b, 0x22, 0xd5, 0x49, 0xe9, +0xa6, 0x59, 0x99, 0xf8, 0xb3, 0x69, 0x17, 0x04, 0xa3, 0xc0, 0x85, 0x8a, +0x3f, 0x3b, 0x6c, 0x20, 0x11, 0xda, 0x91, 0xe4, 0x38, 0x8c, 0xa8, 0x94, +0xa8, 0x48, 0x07, 0xc3, 0xa2, 0xfd, 0xd2, 0x91, 0xd8, 0xfe, 0x91, 0xa0, +0x28, 0xef, 0x45, 0x5c, 0x93, 0x4f, 0x84, 0x82, 0xda, 0x4d, 0xc1, 0x0b, +0x8c, 0x51, 0xee, 0x2a, 0xc1, 0xa8, 0xd1, 0x00, 0x58, 0x56, 0xc6, 0xc5, +0x9e, 0x3d, 0x40, 0xce, 0xa7, 0xbb, 0xe0, 0x85, 0x34, 0x40, 0x02, 0x01, +0xc6, 0x3c, 0x42, 0x99, 0xa0, 0xac, 0xb8, 0x98, 0xe0, 0xf6, 0x3e, 0xa7, +0x0a, 0xad, 0x59, 0xc8, 0xa4, 0x0c, 0x33, 0x6d, 0x0a, 0x31, 0x3d, 0xe1, +0xb9, 0xc3, 0xf4, 0x44, 0x41, 0x3e, 0x89, 0x1b, 0xc7, 0x3e, 0x1e, 0xa0, +0xd9, 0xa7, 0x4a, 0x5d, 0x1e, 0xaa, 0x7a, 0x85, 0x58, 0x9f, 0x28, 0xc5, +0xae, 0xa8, 0x87, 0xaa, 0xda, 0xf6, 0x29, 0xcf, 0xa6, 0x03, 0xd8, 0x3c, +0x20, 0x7e, 0x5f, 0xee, 0x88, 0x27, 0xcb, 0xeb, 0xbd, 0xf4, 0x4c, 0x26, +0x0f, 0x01, 0x14, 0xe6, 0x71, 0x00, 0x9e, 0xde, 0x5b, 0x55, 0x1e, 0xd0, +0x32, 0x9c, 0x96, 0xda, 0x84, 0x3a, 0x78, 0x1e, 0xd9, 0x12, 0x9c, 0x24, +0x75, 0x58, 0x10, 0xfb, 0x85, 0x41, 0x91, 0xe0, 0x46, 0xd4, 0xc7, 0x97, +0xce, 0x6c, 0x04, 0x8d, 0xab, 0x1e, 0x34, 0x30, 0x8a, 0xf0, 0xf0, 0xdc, +0x85, 0xbc, 0x5e, 0x21, 0xd6, 0x27, 0x42, 0x0c, 0x74, 0x3d, 0xdb, 0xd7, +0x1a, 0x02, 0x5e, 0xc9, 0xda, 0x7c, 0x02, 0xdb, 0xa7, 0xd4, 0xb9, 0x79, +0xdf, 0x7d, 0x58, 0xb8, 0xba, 0x4a, 0xdf, 0x68, 0xd1, 0x56, 0xed, 0xdf, +0x4e, 0x8f, 0xee, 0x56, 0x44, 0x4f, 0x40, 0x9e, 0x79, 0x04, 0x43, 0x25, +0x4f, 0x62, 0xa5, 0x6c, 0xaa, 0x55, 0x1e, 0x26, 0xf3, 0xec, 0xae, 0x41, +0x96, 0x95, 0x78, 0xa8, 0x1e, 0x42, 0xff, 0x07, 0x20, 0x41, 0x72, 0x36, +0x8d, 0x36, 0x29, 0xba, 0x45, 0xbd, 0x57, 0x91, 0x9d, 0xaa, 0xd4, 0x36, +0x1f, 0x94, 0xc9, 0x84, 0x24, 0xaf, 0x10, 0x3d, 0x9b, 0x76, 0x61, 0x8a, +0x68, 0x70, 0x08, 0x04, 0xab, 0xf9, 0xb7, 0x07, 0x8a, 0x59, 0x39, 0xc5, +0x55, 0x16, 0xdf, 0x4e, 0xe8, 0x21, 0x3e, 0x13, 0xbd, 0xc8, 0x80, 0x1d, +0x6f, 0x80, 0xdc, 0x97, 0x24, 0x0a, 0xcb, 0x66, 0x93, 0x84, 0x42, 0x99, +0x27, 0xb6, 0x69, 0x7e, 0x7b, 0x83, 0xa0, 0x65, 0x3f, 0x29, 0xd7, 0x30, +0x1a, 0xab, 0x47, 0xa2, 0x95, 0x5e, 0xaf, 0x4d, 0x8d, 0x4c, 0xa1, 0x4e, +0x8a, 0xef, 0xa3, 0x4b, 0x20, 0x38, 0xd1, 0x53, 0x02, 0x07, 0x05, 0xfd, +0x15, 0x80, 0x04, 0x99, 0x8f, 0xee, 0x7a, 0x05, 0x05, 0x85, 0x34, 0x2b, +0x71, 0x90, 0x90, 0x44, 0x05, 0x1a, 0x05, 0x9e, 0x54, 0x3d, 0x1c, 0x10, +0xfa, 0xb0, 0xbf, 0x19, 0xfb, 0x77, 0x26, 0xad, 0x93, 0x25, 0x08, 0x8a, +0xb8, 0x26, 0xaf, 0x23, 0xe0, 0x5f, 0x57, 0x54, 0x05, 0x95, 0x7b, 0x3d, +0x5f, 0x9d, 0x80, 0x03, 0xdb, 0x40, 0xe8, 0xf2, 0xab, 0x65, 0xca, 0xd1, +0x9c, 0x1f, 0xb4, 0x79, 0xfd, 0x12, 0x6a, 0x19, 0xda, 0x07, 0x21, 0xf7, +0xc5, 0xcb, 0x41, 0x4c, 0x8a, 0x5e, 0x4b, 0x53, 0x1f, 0x8d, 0x84, 0x6c, +0x7a, 0x59, 0x21, 0x38, 0x51, 0x26, 0x02, 0x48, 0x50, 0xd8, 0x86, 0xd6, +0x2a, 0x84, 0xc7, 0x12, 0x31, 0x0e, 0x24, 0xc2, 0x4f, 0x76, 0x0a, 0x61, +0x2f, 0x1e, 0x50, 0xa6, 0x51, 0x83, 0x7a, 0x79, 0x18, 0x49, 0x7c, 0x55, +0x9a, 0xed, 0x93, 0xa9, 0x3a, 0x53, 0xa2, 0x65, 0xb1, 0xd2, 0xda, 0xb9, +0x56, 0xcf, 0xf4, 0x27, 0x60, 0xd6, 0xce, 0x25, 0x9c, 0x43, 0xbe, 0x9e, +0x65, 0x0f, 0x72, 0xca, 0x1d, 0x58, 0x8e, 0x40, 0xdd, 0x4e, 0x4b, 0x08, +0x11, 0x9a, 0x4e, 0xb1, 0x05, 0xc8, 0xdd, 0x52, 0x7d, 0x82, 0x2d, 0x20, +0x01, 0x52, 0x3f, 0x13, 0x50, 0xc1, 0x63, 0x2d, 0x47, 0xe0, 0x4b, 0x12, +0x27, 0x08, 0x73, 0x42, 0xb7, 0x96, 0x96, 0x85, 0x94, 0x3f, 0xa3, 0x65, +0x04, 0xd9, 0x76, 0x54, 0xc0, 0x47, 0xc3, 0x56, 0x9d, 0xa8, 0x2a, 0x71, +0x47, 0x2f, 0xbf, 0x5b, 0x87, 0x1e, 0xaf, 0x40, 0xa9, 0xc0, 0x3a, 0x8e, +0xc9, 0x5c, 0xbd, 0x4e, 0x0c, 0xa0, 0x36, 0xc9, 0xce, 0xef, 0xd3, 0x54, +0x1a, 0xc3, 0x4b, 0xfb, 0x2c, 0x9c, 0x06, 0x86, 0x61, 0x09, 0xa1, 0xd5, +0xad, 0x99, 0xf6, 0x0b, 0xf0, 0x00, 0x39, 0xf5, 0x50, 0xe9, 0xe9, 0x2e, +0xfb, 0xaf, 0x1c, 0x96, 0x11, 0x50, 0xdc, 0xb4, 0x76, 0x59, 0xcf, 0x9a, +0x99, 0xbe, 0x91, 0xe2, 0xf0, 0xb4, 0xa0, 0xa9, 0xab, 0xde, 0xe7, 0x05, +0x75, 0xd3, 0xf5, 0xf0, 0x27, 0x4b, 0x48, 0x50, 0xfc, 0x86, 0xac, 0x09, +0x32, 0xec, 0xa8, 0x05, 0x88, 0x98, 0x4a, 0xe5, 0x7d, 0x1a, 0x00, 0x60, +0xee, 0xa3, 0xa0, 0x32, 0xf5, 0x3b, 0xa4, 0xa6, 0x72, 0xb8, 0x72, 0x89, +0x90, 0xe4, 0x15, 0x12, 0x37, 0x0e, 0x1f, 0xd7, 0x5f, 0x27, 0x55, 0x9b, +0xfc, 0x26, 0x77, 0x9b, 0x17, 0x4a, 0x69, 0x3d, 0xea, 0x80, 0xd8, 0x39, +0xdf, 0x50, 0xc6, 0x18, 0x26, 0x63, 0xe7, 0x2a, 0x43, 0xde, 0x82, 0x5e, +0x05, 0x10, 0x89, 0xdf, 0x3c, 0x02, 0xb9, 0x72, 0xfa, 0x22, 0x50, 0xf2, +0xc7, 0xdc, 0xbe, 0xd1, 0x1d, 0x1f, 0x70, 0xf7, 0x3d, 0x7d, 0xc3, 0x68, +0xf6, 0x09, 0x7f, 0x90, 0xfe, 0x7a, 0xc4, 0xc3, 0x52, 0xe2, 0x89, 0xba, +0xb1, 0x34, 0xa3, 0x20, 0xac, 0x83, 0x9c, 0x6c, 0x32, 0x28, 0x50, 0xaf, +0xc3, 0xc9, 0x8d, 0x6d, 0xc9, 0x70, 0x42, 0x8c, 0x57, 0x48, 0x94, 0x07, +0x3b, 0x99, 0x7a, 0xaf, 0x34, 0x0a, 0xb2, 0x43, 0x73, 0x81, 0x9c, 0xa3, +0x6a, 0xb0, 0xd2, 0x42, 0xc5, 0xce, 0x38, 0xd8, 0x88, 0x75, 0xb2, 0xb3, +0xd3, 0x40, 0x03, 0x51, 0x47, 0xcf, 0x8c, 0xd3, 0x2b, 0x93, 0x13, 0xca, +0x61, 0x99, 0x2c, 0xaa, 0x9b, 0x65, 0x33, 0x32, 0x32, 0x48, 0x45, 0x9c, +0x3b, 0x77, 0x6e, 0xeb, 0xd6, 0xad, 0x7d, 0x45, 0x02, 0xe7, 0xd7, 0xa9, +0x53, 0xa7, 0x47, 0x8f, 0x1e, 0xb3, 0x67, 0xcf, 0xa6, 0x01, 0x29, 0xc5, +0xce, 0x10, 0x99, 0xe0, 0x0f, 0x88, 0x4c, 0xe0, 0x81, 0x3e, 0x5a, 0x34, +0x13, 0xc2, 0x55, 0xe7, 0xb5, 0x6b, 0x56, 0xf9, 0xc9, 0x33, 0x15, 0x3f, +0x72, 0x28, 0xa1, 0x02, 0x48, 0xa0, 0x67, 0xf3, 0x9e, 0xf4, 0x17, 0x8f, +0x25, 0xd1, 0x0e, 0xa5, 0xfa, 0x7d, 0x0e, 0xf4, 0x4a, 0x91, 0x4c, 0xee, +0x48, 0x03, 0x38, 0x3b, 0x83, 0xa0, 0xe1, 0xe8, 0x7d, 0xe5, 0xb8, 0x90, +0x9e, 0xab, 0xf0, 0x01, 0x9c, 0xc4, 0xf8, 0x3a, 0x08, 0x6b, 0xe5, 0x7f, +0x3a, 0xa4, 0x3c, 0xb6, 0x6d, 0x00, 0x29, 0xe0, 0x2a, 0x72, 0xc9, 0x50, +0xc5, 0x59, 0x6f, 0x38, 0xef, 0x4e, 0x00, 0xd3, 0xdd, 0xf3, 0xd4, 0x78, +0x65, 0x83, 0xc7, 0x4c, 0x44, 0xe7, 0x72, 0x28, 0xbb, 0xa8, 0xa8, 0x88, +0x62, 0xbb, 0x1e, 0xba, 0x6e, 0x93, 0xa2, 0x8d, 0x98, 0x44, 0x58, 0x00, +0x9d, 0x7f, 0x69, 0x46, 0x4c, 0x4b, 0x5f, 0x1a, 0xfb, 0xc2, 0x1f, 0xa8, +0x74, 0x26, 0x5d, 0xcf, 0xcf, 0x9c, 0x39, 0x43, 0x75, 0x02, 0x5c, 0xd7, +0x84, 0x88, 0x63, 0x01, 0x97, 0xfe, 0x2c, 0x9e, 0xfb, 0x15, 0x56, 0x3c, +0xed, 0x96, 0xdf, 0x1d, 0x43, 0x06, 0x15, 0x22, 0x3b, 0x31, 0x5d, 0xac, +0x84, 0x0a, 0x15, 0x14, 0x2c, 0xb2, 0xa4, 0x54, 0xb2, 0xa8, 0x51, 0x28, +0xd9, 0xda, 0x71, 0x12, 0xef, 0x59, 0xda, 0x79, 0xdd, 0x9c, 0x76, 0x84, +0x64, 0x23, 0x9d, 0xab, 0xd0, 0xa6, 0xf9, 0xa3, 0x0a, 0xe8, 0x23, 0x7c, +0xd3, 0x65, 0xed, 0x88, 0xa6, 0xc6, 0xe8, 0x89, 0x59, 0xc9, 0x5d, 0xe2, +0xb5, 0x4a, 0xf9, 0xd7, 0x7d, 0x64, 0x94, 0x51, 0x22, 0x0c, 0x91, 0x6b, +0x19, 0x76, 0xda, 0x80, 0xd2, 0x9e, 0xa8, 0xf8, 0x28, 0x28, 0xcb, 0x69, +0x7f, 0xb7, 0x06, 0x3f, 0x24, 0xe2, 0x51, 0xfd, 0x52, 0x6f, 0xab, 0x97, +0x9f, 0x9f, 0xaf, 0xf7, 0x08, 0x27, 0xa5, 0x81, 0x48, 0x24, 0x22, 0x7c, +0x49, 0x19, 0x3f, 0xbc, 0xaa, 0x3b, 0x91, 0xb3, 0x4c, 0x1b, 0x1b, 0x31, +0x71, 0xb8, 0xea, 0x46, 0xb4, 0xea, 0x42, 0x01, 0x50, 0x9d, 0x9d, 0x21, +0x6e, 0x7e, 0x05, 0x21, 0x70, 0x0f, 0x02, 0x8a, 0x29, 0x07, 0x28, 0xbd, +0xcf, 0x09, 0xe9, 0xa3, 0x4d, 0x30, 0x19, 0x5a, 0x78, 0x1e, 0xa4, 0xd7, +0xf5, 0x9a, 0x35, 0x6b, 0xd6, 0xad, 0x5b, 0x87, 0x17, 0x82, 0x6e, 0xbc, +0xf0, 0x07, 0xf0, 0x40, 0xf3, 0x2e, 0x3c, 0x74, 0xb4, 0x11, 0xa3, 0x60, +0x07, 0xfd, 0xbb, 0x08, 0xfb, 0xf3, 0xd0, 0x6b, 0xb4, 0xfc, 0xe8, 0xb2, +0x72, 0x47, 0x0e, 0x25, 0x54, 0x20, 0x3b, 0xd1, 0x01, 0x4d, 0xa7, 0x39, +0xfc, 0xc7, 0x58, 0x54, 0x3e, 0x3a, 0x31, 0x9a, 0x44, 0xcd, 0x0d, 0x73, +0xdb, 0x43, 0xf4, 0x14, 0xc2, 0xd0, 0x1b, 0xf5, 0xda, 0x27, 0x50, 0xce, +0x24, 0x2e, 0x90, 0xa0, 0x40, 0x62, 0x96, 0x48, 0x8a, 0x90, 0x5d, 0x1c, +0xb7, 0x83, 0x94, 0xa5, 0xe9, 0xd4, 0x2c, 0x8b, 0x30, 0x24, 0xec, 0xad, +0xc0, 0x09, 0x9b, 0x92, 0x4f, 0xc3, 0xfa, 0x7a, 0x32, 0x65, 0x5e, 0x6d, +0x76, 0x0a, 0x57, 0x23, 0xb3, 0xe5, 0x93, 0xea, 0x40, 0x60, 0x92, 0x1c, +0x08, 0x3f, 0xb8, 0x9f, 0xd1, 0x0a, 0x68, 0x32, 0x8d, 0x7a, 0x80, 0x44, +0x04, 0xe9, 0x83, 0x13, 0xfe, 0xe7, 0xa0, 0x47, 0xb5, 0xf4, 0x9f, 0x86, +0x2d, 0x10, 0xb8, 0x41, 0xd1, 0x1a, 0xfa, 0xb0, 0xd0, 0xee, 0x99, 0x08, +0x0e, 0xf8, 0x30, 0xa5, 0x3a, 0xc0, 0x03, 0x22, 0x13, 0xa5, 0xf6, 0x3d, +0x77, 0x79, 0xae, 0x5c, 0xc2, 0x2d, 0xd7, 0xbb, 0x87, 0x0c, 0x2a, 0xcc, +0x7d, 0x8c, 0x08, 0x7c, 0x42, 0xb6, 0x31, 0x27, 0x52, 0xfb, 0x4a, 0x85, +0x96, 0xe7, 0x93, 0x4b, 0x40, 0x20, 0xf7, 0x8c, 0x21, 0x8d, 0xe5, 0xaf, +0xec, 0xe5, 0x96, 0x36, 0xd3, 0xa0, 0xdc, 0x4b, 0x1f, 0x04, 0xa9, 0x86, +0x5d, 0x5c, 0xef, 0x33, 0xe4, 0xf5, 0x16, 0x28, 0x15, 0x6c, 0xf6, 0xec, +0xf1, 0x04, 0x75, 0xe3, 0x5f, 0xc3, 0x78, 0x0a, 0x71, 0x43, 0xe2, 0xb8, +0xdb, 0xe8, 0x6c, 0x2d, 0xad, 0xdd, 0xe1, 0x03, 0x60, 0x80, 0x7e, 0x37, +0x1c, 0x38, 0xa7, 0xf9, 0x52, 0x9a, 0x5e, 0xa3, 0x39, 0x10, 0xf7, 0xca, +0x55, 0x20, 0x81, 0xe6, 0x8e, 0xd2, 0xdb, 0x56, 0x9a, 0x9a, 0xe2, 0x27, +0x95, 0x00, 0xa7, 0x70, 0x0a, 0xfb, 0xb3, 0x89, 0xa5, 0x50, 0x42, 0x05, +0xd6, 0x0f, 0x64, 0x5c, 0xdd, 0x38, 0xe3, 0x95, 0x62, 0x2a, 0xeb, 0x04, +0x64, 0xfa, 0xfe, 0xfd, 0xfb, 0x53, 0x77, 0x0c, 0x92, 0x65, 0x0e, 0xd4, +0x6f, 0xc5, 0xe7, 0x48, 0x68, 0x5d, 0x9b, 0x36, 0x6d, 0xe8, 0xff, 0x4b, +0x83, 0x08, 0x0a, 0x57, 0x26, 0x26, 0x5e, 0x8c, 0x1d, 0x54, 0x93, 0xa4, +0x3e, 0x3e, 0x52, 0x0d, 0xf2, 0x0f, 0xb4, 0x4b, 0x68, 0xaa, 0x9d, 0xc9, +0x33, 0x3e, 0x5a, 0x32, 0xe7, 0x23, 0xf6, 0x40, 0xd9, 0xd2, 0xbe, 0x1a, +0x65, 0x80, 0x9e, 0xce, 0x02, 0x0f, 0xd4, 0x03, 0xfc, 0x0c, 0x34, 0xaa, +0xa3, 0xe0, 0x83, 0x1c, 0x00, 0x86, 0x2f, 0xa5, 0xe3, 0x35, 0x3d, 0xad, +0x31, 0x2e, 0x71, 0x09, 0xf6, 0x25, 0x0a, 0x9c, 0x11, 0xc1, 0xf1, 0xf5, +0xd7, 0x5f, 0x0b, 0x1e, 0x82, 0xd5, 0xee, 0xd9, 0x26, 0x21, 0x56, 0xa9, +0xd3, 0x42, 0x06, 0x15, 0xbc, 0x27, 0xcc, 0xe4, 0x70, 0x76, 0xbd, 0x99, +0xb4, 0x07, 0xba, 0xc1, 0x4c, 0x59, 0xa3, 0x46, 0x0d, 0xac, 0x2b, 0x88, +0xe9, 0x50, 0x58, 0x87, 0x0e, 0x1d, 0xba, 0x74, 0xe9, 0xd2, 0xbd, 0x7b, +0x77, 0x8c, 0x2d, 0x1c, 0xb8, 0x3b, 0x90, 0xc5, 0xf9, 0x1e, 0x09, 0x1e, +0x83, 0x8f, 0xe7, 0x5e, 0xeb, 0x96, 0x77, 0x81, 0x1c, 0xd1, 0x71, 0x09, +0x98, 0x63, 0x34, 0xb4, 0x5b, 0x9a, 0x5f, 0xf5, 0xeb, 0xd7, 0x8f, 0xcf, +0x0c, 0x4b, 0xc8, 0x10, 0x61, 0x8b, 0x0b, 0x17, 0x2e, 0x44, 0xf1, 0xc5, +0x31, 0x4c, 0x0b, 0x6d, 0x3e, 0xc8, 0xc1, 0x67, 0xf5, 0x0d, 0x6a, 0x2e, +0x45, 0x8b, 0x11, 0xfa, 0x99, 0x0c, 0xd9, 0x9e, 0xf0, 0x07, 0xb8, 0x04, +0xd2, 0x0e, 0x5b, 0xfb, 0x5d, 0x77, 0xdd, 0xc5, 0xff, 0x83, 0x06, 0x0d, +0xa2, 0xd3, 0x1c, 0x59, 0x6f, 0x6c, 0x04, 0x39, 0x39, 0x39, 0x3c, 0x0b, +0xd0, 0xa2, 0xac, 0x86, 0xb4, 0xe7, 0xe2, 0x71, 0xd0, 0x16, 0x68, 0xf9, +0x05, 0x8a, 0xd8, 0xfb, 0xe9, 0xc1, 0x2e, 0x0d, 0xaa, 0x11, 0x7b, 0x88, +0xc5, 0xc0, 0x64, 0x04, 0xa1, 0x4b, 0x77, 0x77, 0xfc, 0x6e, 0x78, 0xa3, +0x69, 0x3e, 0x2d, 0x07, 0xbf, 0xf2, 0x25, 0x7f, 0x62, 0x8b, 0x81, 0x39, +0x70, 0x26, 0x3d, 0x7c, 0x51, 0x1e, 0xc4, 0x31, 0x17, 0x66, 0xd1, 0xaf, +0xfe, 0x81, 0xcd, 0xc0, 0x1e, 0x91, 0x30, 0x5d, 0x14, 0xc2, 0x3f, 0x3e, +0xf9, 0x37, 0x62, 0x39, 0x5d, 0xc5, 0xd6, 0xc5, 0x6b, 0xe3, 0x5d, 0xb2, +0xc3, 0x19, 0xea, 0x66, 0x63, 0x51, 0x81, 0xb2, 0xd9, 0x89, 0x29, 0x78, +0x4a, 0x93, 0x1e, 0xf6, 0x4e, 0x88, 0x0f, 0x9b, 0x0c, 0x44, 0x86, 0x1f, +0x8a, 0x83, 0x0d, 0x98, 0x83, 0xb0, 0x05, 0x0e, 0x74, 0x50, 0x39, 0xe4, +0x57, 0xbe, 0xc7, 0xfc, 0xc2, 0x39, 0x38, 0xad, 0xd0, 0x44, 0x7b, 0xf7, +0xee, 0x0d, 0x4e, 0xf4, 0x2a, 0x7a, 0x3a, 0x24, 0x40, 0x02, 0x9b, 0x3d, +0x74, 0x4c, 0xa7, 0x50, 0x51, 0x58, 0xb9, 0x56, 0x46, 0x56, 0xc3, 0x62, +0x08, 0xe2, 0xc0, 0x9e, 0xb3, 0x7e, 0xfd, 0x7a, 0xd1, 0x62, 0x49, 0x45, +0x20, 0x82, 0x48, 0x0e, 0x3e, 0xcb, 0x37, 0x48, 0xf6, 0x50, 0x33, 0xe7, +0x20, 0xee, 0x93, 0xea, 0xc9, 0xf9, 0xa2, 0x2e, 0x1f, 0x3a, 0x74, 0x08, +0xc5, 0x80, 0xbd, 0x9c, 0xff, 0x11, 0xfa, 0x39, 0x19, 0x85, 0x98, 0xc1, +0xb9, 0x91, 0x1c, 0xea, 0x59, 0xf8, 0x52, 0x14, 0x65, 0x89, 0x4d, 0x62, +0xd7, 0x57, 0xfd, 0xa4, 0xd9, 0xef, 0xa5, 0xa9, 0x3b, 0xe4, 0x0e, 0x48, +0x10, 0x8a, 0x38, 0x80, 0x8a, 0x1c, 0xd2, 0xf2, 0x9c, 0x3f, 0x11, 0xb5, +0x81, 0xb0, 0x24, 0x78, 0x10, 0xfb, 0x92, 0xb4, 0x30, 0x2d, 0xa7, 0x37, +0x18, 0xba, 0xc3, 0x56, 0x75, 0x54, 0x60, 0x15, 0x41, 0x30, 0x40, 0x1a, +0x86, 0xb0, 0xa8, 0xb5, 0x3c, 0x7e, 0xfc, 0x78, 0x9d, 0x40, 0x21, 0x14, +0x28, 0x0c, 0xf2, 0x62, 0xc7, 0x85, 0xe6, 0x14, 0x15, 0xa2, 0x59, 0x42, +0x70, 0xb4, 0xf7, 0x2c, 0x29, 0x29, 0x41, 0xbc, 0x96, 0x83, 0xcf, 0x7c, +0xa3, 0xec, 0x36, 0x9c, 0x8c, 0x1a, 0x0a, 0x9d, 0x41, 0x85, 0x50, 0x1e, +0xc1, 0x0e, 0x84, 0x00, 0x21, 0xea, 0xb0, 0x2b, 0x03, 0x42, 0x3c, 0x24, +0xb4, 0x8a, 0x03, 0x09, 0xe0, 0x07, 0xa2, 0xe7, 0x16, 0xa2, 0xb3, 0x42, +0xb5, 0x32, 0x32, 0x03, 0x92, 0xb1, 0x29, 0x82, 0x3b, 0x07, 0x3d, 0xa7, +0xa1, 0x6f, 0x14, 0x59, 0x14, 0x5f, 0x24, 0x78, 0xf2, 0x9b, 0xe5, 0xe0, +0x33, 0x85, 0xd3, 0xe5, 0x1b, 0x14, 0x62, 0x08, 0x1a, 0xd2, 0x87, 0x2d, +0x70, 0x3e, 0x07, 0x27, 0xe3, 0xa0, 0xa4, 0x01, 0x29, 0xf2, 0x0f, 0x7b, +0x3f, 0xb4, 0xce, 0x08, 0x8c, 0xc6, 0xf8, 0xdc, 0x48, 0x0e, 0xf5, 0x2c, +0xdc, 0x91, 0x4b, 0x18, 0x84, 0x34, 0x51, 0x4e, 0x86, 0x09, 0xe8, 0x3d, +0xdb, 0x85, 0x04, 0x55, 0xa3, 0x5e, 0x77, 0x1f, 0x42, 0x97, 0x52, 0x2b, +0x72, 0xe6, 0x55, 0x17, 0x15, 0xaa, 0x97, 0x36, 0xa2, 0x33, 0x01, 0x6a, +0x50, 0x0f, 0xa1, 0x50, 0x60, 0x43, 0xf6, 0x5d, 0x68, 0x05, 0x2a, 0xc7, +0x0e, 0x03, 0x91, 0x41, 0x28, 0x90, 0x1d, 0x41, 0x0a, 0x68, 0x93, 0xd8, +0xdd, 0x39, 0xf3, 0xec, 0xd9, 0xb3, 0x04, 0x3f, 0x23, 0x52, 0x9f, 0x3b, +0x77, 0x0e, 0x09, 0x5b, 0x0e, 0x3e, 0xf3, 0x0d, 0xdf, 0x63, 0x7e, 0x81, +0xfe, 0x38, 0x19, 0xa2, 0x3c, 0x76, 0xec, 0x18, 0x23, 0x40, 0xdf, 0x04, +0xc3, 0x41, 0xf7, 0x20, 0x44, 0x9c, 0x00, 0x80, 0x8d, 0x7d, 0x9d, 0x7b, +0x41, 0xa0, 0x10, 0x31, 0x12, 0x0b, 0x27, 0xb3, 0x9d, 0x33, 0xb8, 0x8c, +0x8c, 0xec, 0x8e, 0xbc, 0x4e, 0x6a, 0x3f, 0x07, 0xfa, 0x2b, 0xb5, 0xf4, +0x44, 0x70, 0xc7, 0xa4, 0x83, 0xd5, 0x1f, 0x24, 0xcb, 0xc1, 0xaf, 0x72, +0xf0, 0x19, 0x1d, 0x17, 0x03, 0x28, 0xa7, 0x71, 0x32, 0x64, 0xcd, 0xc1, +0x37, 0x14, 0x56, 0x82, 0xbe, 0x09, 0xac, 0xe0, 0x31, 0x39, 0x8d, 0xbf, +0x32, 0x4f, 0x76, 0x01, 0x66, 0x08, 0xf5, 0xcb, 0xb3, 0xf0, 0x2b, 0x5a, +0x04, 0x8f, 0x40, 0x14, 0x06, 0x5e, 0x67, 0x82, 0xba, 0x11, 0x90, 0x10, +0x84, 0x42, 0xbd, 0x97, 0x4a, 0x45, 0x12, 0xba, 0x4f, 0xf7, 0xaa, 0xba, +0xa8, 0x90, 0x9c, 0x0a, 0xa4, 0x02, 0x44, 0x61, 0xd4, 0x4a, 0xa8, 0x01, +0x12, 0x81, 0x3a, 0xe5, 0x20, 0x30, 0x01, 0x59, 0x1c, 0xd2, 0x81, 0x46, +0xa1, 0x4b, 0xb6, 0x5b, 0x5a, 0x51, 0x41, 0x8e, 0x50, 0x0c, 0x89, 0xc5, +0xb4, 0x1a, 0x51, 0xf2, 0x34, 0x9a, 0x89, 0x1c, 0x22, 0x70, 0x43, 0x7c, +0x8c, 0x86, 0xfb, 0x16, 0x32, 0x65, 0x4c, 0xae, 0x85, 0xe6, 0x40, 0x08, +0x9b, 0x34, 0x3b, 0xb1, 0xe2, 0x24, 0x80, 0x01, 0x33, 0x0e, 0x78, 0x03, +0x6c, 0xdc, 0x17, 0x8a, 0x14, 0x23, 0x26, 0x83, 0x33, 0xb2, 0x88, 0xe9, +0xf0, 0x31, 0x0e, 0x84, 0x75, 0x91, 0xd7, 0xc9, 0x66, 0x46, 0x56, 0x41, +0x4a, 0x61, 0xce, 0x96, 0x07, 0x32, 0x0c, 0xde, 0x31, 0xa8, 0x99, 0x93, +0xb1, 0x38, 0x73, 0x20, 0x02, 0x21, 0xdb, 0x88, 0x09, 0x88, 0xbf, 0x32, +0x02, 0x03, 0x42, 0xf1, 0x04, 0x20, 0x31, 0x43, 0x18, 0x08, 0x9a, 0x31, +0x9f, 0x51, 0xa6, 0xf9, 0x92, 0x9b, 0x72, 0x23, 0x51, 0x24, 0x70, 0xb1, +0xa1, 0x22, 0x47, 0x85, 0x1f, 0x9f, 0x68, 0xdd, 0xfe, 0xc9, 0x55, 0x1a, +0x15, 0xe2, 0xc5, 0x83, 0x08, 0xa0, 0x06, 0xa8, 0x19, 0xa2, 0x47, 0xfe, +0x96, 0x03, 0x1a, 0x65, 0xdf, 0x85, 0xb2, 0xe9, 0x16, 0x29, 0x30, 0x10, +0xba, 0x51, 0x3a, 0x25, 0xd4, 0x03, 0xfd, 0x41, 0x76, 0x1c, 0xc8, 0xd6, +0xf2, 0x81, 0x6f, 0xf8, 0x1e, 0xad, 0x14, 0xe2, 0xe3, 0x64, 0xc6, 0x84, +0xec, 0x18, 0x81, 0x3d, 0x9e, 0x9d, 0x9b, 0xbd, 0x1f, 0x84, 0xb0, 0x37, +0x0b, 0x43, 0x00, 0x09, 0x6c, 0xea, 0xdc, 0x85, 0xfb, 0x42, 0xa3, 0x9c, +0x0c, 0xb4, 0x84, 0x2e, 0x19, 0x0a, 0x00, 0x40, 0xe2, 0x1c, 0x4c, 0x8f, +0x03, 0x18, 0x40, 0xdc, 0xc8, 0xf7, 0xec, 0xdf, 0x1c, 0x90, 0xac, 0xf9, +0x40, 0x9a, 0xe7, 0x71, 0x20, 0x68, 0x85, 0x19, 0x3e, 0xf3, 0x8d, 0x04, +0x1a, 0xf1, 0x81, 0xef, 0x19, 0x10, 0x6c, 0xc8, 0x0c, 0x05, 0x6f, 0x7c, +0x16, 0xc8, 0xe9, 0x10, 0x0a, 0xa7, 0xaa, 0x33, 0xf6, 0x89, 0xb5, 0xc2, +0xce, 0xac, 0xba, 0xa8, 0x10, 0x29, 0x59, 0x2c, 0x51, 0x90, 0x0b, 0x94, +0x0d, 0x7d, 0x40, 0xca, 0x72, 0xc8, 0x56, 0xcd, 0x37, 0xec, 0xb8, 0xd0, +0xba, 0x52, 0x28, 0x39, 0x13, 0x52, 0x43, 0xa1, 0x84, 0xc8, 0xb8, 0x90, +0x43, 0xc8, 0x94, 0x43, 0x7e, 0xe5, 0x7b, 0xfe, 0x0a, 0x05, 0xb3, 0x37, +0x73, 0x15, 0xd7, 0x32, 0x02, 0xc4, 0x07, 0xc5, 0xc3, 0x49, 0xd8, 0x95, +0x01, 0x18, 0x07, 0x18, 0x80, 0x27, 0xf0, 0xa5, 0xdc, 0x45, 0xf1, 0x01, +0xa1, 0x63, 0xc6, 0x51, 0x44, 0x8f, 0xda, 0xca, 0xa1, 0x2c, 0x9b, 0x9e, +0xdf, 0x9c, 0x38, 0xec, 0xe1, 0x81, 0xea, 0x50, 0xfe, 0x01, 0xa9, 0x14, +0xca, 0xb0, 0x6a, 0x86, 0x4c, 0x52, 0x9e, 0x05, 0xb0, 0xc9, 0x4d, 0x45, +0x45, 0x8e, 0x4c, 0x97, 0x42, 0x85, 0x41, 0x82, 0x1b, 0x55, 0x69, 0x54, +0x08, 0x30, 0xc4, 0x9d, 0x07, 0x65, 0xc8, 0x56, 0x2a, 0x7b, 0x33, 0x34, +0xcd, 0x21, 0x3b, 0xb4, 0x60, 0x40, 0x27, 0x56, 0x21, 0x53, 0xa1, 0x54, +0xfd, 0x90, 0x2f, 0xf9, 0x2b, 0x03, 0xea, 0x08, 0x61, 0x1c, 0x31, 0xdd, +0x28, 0x96, 0x22, 0xdc, 0x40, 0x6e, 0xa4, 0x6e, 0x21, 0x60, 0x30, 0x0c, +0x0b, 0x8d, 0x0a, 0x99, 0xda, 0x94, 0x67, 0xcc, 0x7a, 0xb0, 0x52, 0x94, +0x05, 0x30, 0x6a, 0x86, 0x02, 0x3c, 0xfd, 0x59, 0x7c, 0xba, 0x51, 0x45, +0x92, 0x51, 0x98, 0xdd, 0xab, 0xaa, 0xa3, 0xc2, 0xb0, 0xdc, 0x06, 0x92, +0x0a, 0xe2, 0xcb, 0xf0, 0x60, 0xbd, 0x09, 0xe2, 0x5d, 0xa2, 0x43, 0x85, +0xc4, 0x0a, 0x84, 0x18, 0x2a, 0x42, 0x62, 0x4d, 0xa3, 0x93, 0x0c, 0xf5, +0x15, 0x88, 0xa2, 0x22, 0xd4, 0xdf, 0x60, 0x74, 0xfe, 0xc1, 0x5f, 0x81, +0x28, 0x2a, 0x82, 0xbf, 0xa6, 0xd1, 0x11, 0x43, 0x7d, 0x05, 0xa2, 0xa8, +0x08, 0xf5, 0x37, 0x18, 0x9d, 0x7f, 0xf0, 0x57, 0x20, 0x8a, 0x8a, 0xe0, +0xaf, 0x69, 0x74, 0xc4, 0x50, 0x5f, 0x81, 0x8b, 0xa8, 0xc8, 0xcc, 0xcc, +0x24, 0xae, 0x81, 0x6e, 0x29, 0x78, 0x79, 0xa3, 0x47, 0x74, 0x05, 0x22, +0x79, 0x05, 0x40, 0x01, 0x58, 0x00, 0x11, 0x0e, 0xd2, 0x03, 0x88, 0x5e, +0x4e, 0x4e, 0x4e, 0x26, 0x78, 0x36, 0x7a, 0x44, 0x57, 0x20, 0x92, 0x57, +0x00, 0x14, 0x80, 0x05, 0x10, 0xf1, 0xff, 0x0a, 0xfb, 0x09, 0x6c, 0x5e, +0xaf, 0x2e, 0x17, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, +0x42, 0x60, 0x82, }; diff --git a/Source/Core/InputCommon/CMakeLists.txt b/Source/Core/InputCommon/CMakeLists.txt index 76871e5b3b..f99351ffe2 100644 --- a/Source/Core/InputCommon/CMakeLists.txt +++ b/Source/Core/InputCommon/CMakeLists.txt @@ -32,4 +32,4 @@ elseif(ANDROID) Src/ControllerInterface/Android/Android.cpp) endif() -add_library(inputcommon ${SRCS}) +add_dolphin_library(inputcommon "${SRCS}" "") diff --git a/Source/Core/InputCommon/InputCommon.vcxproj b/Source/Core/InputCommon/InputCommon.vcxproj index 03aaf1b3ea..4b2cd7cfeb 100644 --- a/Source/Core/InputCommon/InputCommon.vcxproj +++ b/Source/Core/InputCommon/InputCommon.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,153 +19,43 @@ - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F} - InputCommon + {6BBD47CF-91FD-4077-B676-8B76980178A9} - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - true - true - - - - - - ..\Common\Src;..\..\..\Externals\SDL\Include_1.2;%(AdditionalIncludeDirectories) - - - true - true - true - - - - + + + Create + @@ -181,22 +63,27 @@ - - + + - + + + + + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} + - + \ No newline at end of file diff --git a/Source/Core/InputCommon/InputCommon.vcxproj.filters b/Source/Core/InputCommon/InputCommon.vcxproj.filters index c93a9289f4..0f28bafa56 100644 --- a/Source/Core/InputCommon/InputCommon.vcxproj.filters +++ b/Source/Core/InputCommon/InputCommon.vcxproj.filters @@ -1,34 +1,49 @@ - + + + + {3a755a86-0efa-4396-bf79-bb3a1910764d} + + + {0289ef91-50f5-4c16-9fa4-ff4c4d8208e7} + + + {770bf6f3-b0c3-4731-be52-46f54b4cb319} + + + {07bad1aa-7e03-4f5c-ade2-a44857c5cbc3} + + - - ControllerInterface\SDL - - - ControllerInterface\XInput - - - ControllerInterface - - + ControllerInterface\DInput ControllerInterface\DInput - + ControllerInterface\DInput - - ControllerInterface + + ControllerInterface\XInput + + + ControllerInterface\SDL ControllerInterface + + ControllerInterface + + + ControllerInterface + + @@ -36,12 +51,21 @@ - - ControllerInterface\SDL + + ControllerInterface\DInput + + + ControllerInterface\DInput + + + ControllerInterface\DInput ControllerInterface\XInput + + ControllerInterface\SDL + ControllerInterface @@ -51,34 +75,9 @@ ControllerInterface - - ControllerInterface\DInput - - - ControllerInterface\DInput - - - ControllerInterface\DInput - - - ControllerInterface\DInput - + - + - - - {63655b75-3fd6-4cd0-814a-eb9f3505f91d} - - - {64f2ab35-5cce-40a5-a4d3-232710267e05} - - - {08565cb5-f959-45dc-90b1-93a9c0135478} - - - {5a9c1b94-2eab-4357-b44f-87d5db50da3d} - - - + \ No newline at end of file diff --git a/Source/Core/InputCommon/Src/ControllerEmu.cpp b/Source/Core/InputCommon/Src/ControllerEmu.cpp index 328fcb8c2f..e2e37789c7 100644 --- a/Source/Core/InputCommon/Src/ControllerEmu.cpp +++ b/Source/Core/InputCommon/Src/ControllerEmu.cpp @@ -221,8 +221,8 @@ void ControllerEmu::SaveConfig(IniFile::Section *sec, const std::string& base) ControllerEmu::AnalogStick::AnalogStick(const char* const _name) : ControlGroup(_name, GROUP_TYPE_STICK) { - for (unsigned int i = 0; i < 4; ++i) - controls.push_back(new Input(named_directions[i])); + for (auto& named_direction : named_directions) + controls.push_back(new Input(named_direction)); controls.push_back(new Input(_trans("Modifier"))); @@ -290,8 +290,8 @@ ControllerEmu::Cursor::Cursor(const char* const _name) : ControlGroup(_name, GROUP_TYPE_CURSOR) , m_z(0) { - for (unsigned int i = 0; i < 4; ++i) - controls.push_back(new Input(named_directions[i])); + for (auto& named_direction : named_directions) + controls.push_back(new Input(named_direction)); controls.push_back(new Input("Forward")); controls.push_back(new Input("Backward")); controls.push_back(new Input(_trans("Hide"))); diff --git a/Source/Core/InputCommon/Src/ControllerEmu.h b/Source/Core/InputCommon/Src/ControllerEmu.h index 5dc54b463f..750aa692c4 100644 --- a/Source/Core/InputCommon/Src/ControllerEmu.h +++ b/Source/Core/InputCommon/Src/ControllerEmu.h @@ -42,7 +42,7 @@ enum SETTING_SQUARE, }; -const char * const named_directions[] = +const char * const named_directions[] = { "Up", "Down", @@ -109,7 +109,7 @@ public: ControlGroup(const char* const _name, const unsigned int _type = GROUP_TYPE_OTHER) : name(_name), type(_type) {} virtual ~ControlGroup(); - + virtual void LoadConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" ); virtual void SaveConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" ); @@ -325,7 +325,7 @@ public: { // this section might be all wrong, but its working good enough, I think - ControlState ang = atan2(yy, xx); + ControlState ang = atan2(yy, xx); ControlState ang_sin = sin(ang); ControlState ang_cos = cos(ang); @@ -352,7 +352,7 @@ public: // this is kinda silly here // gui being open will make this happen 2x as fast, o well - + // silly if (step) { @@ -391,7 +391,7 @@ public: m_z = std::max(m_z - 0.1f, zz); *z = m_z; - + // hide if (controls[6]->control_ref->State() > 0.5f) { diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp index d2982bba24..7287c380d5 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp @@ -99,7 +99,7 @@ void ControllerInterface::Shutdown() m_devices.clear(); #ifdef CIFACE_USE_XINPUT - // nothing needed + ciface::XInput::DeInit(); #endif #ifdef CIFACE_USE_DINPUT // nothing needed @@ -178,11 +178,11 @@ bool ControllerInterface::UpdateOutput(const bool force) size_t ok_count = 0; - std::vector::const_iterator - d = m_devices.begin(), - e = m_devices.end(); - for (;d != e; ++d) - (*d)->UpdateOutput(); + for (auto d = m_devices.cbegin(); d != m_devices.cend(); ++d) + { + if ((*d)->UpdateOutput()) + ++ok_count; + } return (m_devices.size() == ok_count); } @@ -196,7 +196,7 @@ bool ControllerInterface::UpdateOutput(const bool force) ControlState ControllerInterface::InputReference::State( const ControlState ignore ) { if (parsed_expression) - return parsed_expression->GetValue(); + return parsed_expression->GetValue() * range; else return 0.0f; } @@ -249,7 +249,7 @@ Device::Control* ControllerInterface::InputReference::Detect(const unsigned int if (device->Inputs().size() == 0) return NULL; - // get starting state of all inputs, + // get starting state of all inputs, // so we can ignore those that were activated at time of Detect start std::vector::const_iterator i = device->Inputs().begin(), @@ -308,7 +308,7 @@ Device::Control* ControllerInterface::OutputReference::Detect(const unsigned int device->UpdateOutput(); Common::SleepCurrentThread(10); } - + State(0); device->UpdateOutput(); } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h index 00b4b2c07d..4efb8941b7 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.h @@ -109,7 +109,7 @@ public: }; ControllerInterface() : m_is_init(false), m_hwnd(NULL) {} - + void SetHwnd(void* const hwnd); void Initialize(); void Shutdown(); diff --git a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp index fa33595ee8..7211559e93 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.cpp @@ -76,17 +76,17 @@ void GetXInputGUIDS( std::vector& guids ) bstrNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );if( bstrNamespace == NULL ) goto LCleanup; bstrClassName = SysAllocString( L"Win32_PNPEntity" ); if( bstrClassName == NULL ) goto LCleanup; bstrDeviceID = SysAllocString( L"DeviceID" ); if( bstrDeviceID == NULL ) goto LCleanup; - - // Connect to WMI + + // Connect to WMI hr = pIWbemLocator->ConnectServer( bstrNamespace, NULL, NULL, 0L, 0L, NULL, NULL, &pIWbemServices ); if( FAILED(hr) || pIWbemServices == NULL ) goto LCleanup; - // Switch security level to IMPERSONATE. - CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, + // Switch security level to IMPERSONATE. + CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); - hr = pIWbemServices->CreateInstanceEnum( bstrClassName, 0, NULL, &pEnumDevices ); + hr = pIWbemServices->CreateInstanceEnum( bstrClassName, 0, NULL, &pEnumDevices ); if( FAILED(hr) || pEnumDevices == NULL ) goto LCleanup; @@ -105,7 +105,7 @@ void GetXInputGUIDS( std::vector& guids ) if( SUCCEEDED( hr ) && var.vt == VT_BSTR && var.bstrVal != NULL ) { // Check if the device ID contains "IG_". If it does, then it's an XInput device - // This information can not be found from DirectInput + // This information can not be found from DirectInput if( wcsstr( var.bstrVal, L"IG_" ) ) { // If it does, then get the VID/PID from var.bstrVal @@ -122,7 +122,7 @@ void GetXInputGUIDS( std::vector& guids ) guids.push_back( dwVidPid ); //bIsXinputDevice = true; } - } + } SAFE_RELEASE( pDevices[iDevice] ); } } @@ -324,7 +324,7 @@ Joystick::Joystick( /*const LPCDIDEVICEINSTANCE lpddi, */const LPDIRECTINPUTDEVI { eff.cbTypeSpecificParams = sizeof(DIPERIODIC); } - + LPDIRECTINPUTEFFECT pEffect; if (SUCCEEDED(m_device->CreateEffect(force_type_names[f].guid, &eff, &pEffect, NULL))) { diff --git a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.h b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.h index ad383bd764..20b38c8a69 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/DInput/DInputJoystick.h @@ -88,7 +88,7 @@ public: Joystick(const LPDIRECTINPUTDEVICE8 device, const unsigned int index); ~Joystick(); - + std::string GetName() const; int GetId() const; std::string GetSource() const; diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ExpressionParser.cpp b/Source/Core/InputCommon/Src/ControllerInterface/ExpressionParser.cpp index d91fbc587c..b313559907 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/ExpressionParser.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/ExpressionParser.cpp @@ -222,22 +222,22 @@ public: ControlExpression(ControlQualifier qualifier_, Device::Control *control_) : qualifier(qualifier_), control(control_) {} - virtual ControlState GetValue() + virtual ControlState GetValue() override { return control->ToInput()->GetState(); } - virtual void SetValue(ControlState value) + virtual void SetValue(ControlState value) override { control->ToOutput()->SetState(value); } - virtual int CountNumControls() + virtual int CountNumControls() override { return 1; } - virtual operator std::string() + virtual operator std::string() override { return "`" + (std::string)qualifier + "`"; } @@ -257,7 +257,7 @@ public: delete rhs; } - virtual ControlState GetValue() + virtual ControlState GetValue() override { ControlState lhsValue = lhs->GetValue(); ControlState rhsValue = rhs->GetValue(); @@ -275,7 +275,7 @@ public: } } - virtual void SetValue(ControlState value) + virtual void SetValue(ControlState value) override { // Don't do anything special with the op we have. // Treat "A & B" the same as "A | B". @@ -283,12 +283,12 @@ public: rhs->SetValue(value); } - virtual int CountNumControls() + virtual int CountNumControls() override { return lhs->CountNumControls() + rhs->CountNumControls(); } - virtual operator std::string() + virtual operator std::string() override { return OpName(op) + "(" + (std::string)(*lhs) + ", " + (std::string)(*rhs) + ")"; } @@ -306,7 +306,7 @@ public: delete inner; } - virtual ControlState GetValue() + virtual ControlState GetValue() override { ControlState value = inner->GetValue(); switch (op) @@ -319,7 +319,7 @@ public: } } - virtual void SetValue(ControlState value) + virtual void SetValue(ControlState value) override { switch (op) { @@ -330,12 +330,12 @@ public: } } - virtual int CountNumControls() + virtual int CountNumControls() override { return inner->CountNumControls(); } - virtual operator std::string() + virtual operator std::string() override { return OpName(op) + "(" + (std::string)(*inner) + ")"; } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h index 930f849a17..e5c2c1b3d4 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h @@ -26,7 +26,7 @@ private: public: std::string GetName() const; bool IsDetectable() { return false; } - Cursor(u8 index, const float& axis, const bool positive) : m_index(index), m_axis(axis), m_positive(positive) {} + Cursor(u8 index, const float& axis, const bool positive) : m_axis(axis), m_index(index), m_positive(positive) {} ControlState GetState() const; private: const float& m_axis; @@ -37,7 +37,7 @@ private: { public: std::string GetName() const; - Button(u8 index, const unsigned char& button) : m_index(index), m_button(button) {} + Button(u8 index, const unsigned char& button) : m_button(button), m_index(index) {} ControlState GetState() const; private: const unsigned char& m_button; @@ -63,7 +63,6 @@ private: const IOHIDDeviceRef m_device; const std::string m_device_name; int m_index; - void *m_window; uint32_t m_windowid; unsigned char m_mousebuttons[3]; }; diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm index 003240d4a9..93de15daa4 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm +++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm @@ -16,7 +16,6 @@ Keyboard::Keyboard(IOHIDDeviceRef device, std::string name, int index, void *win : m_device(device) , m_device_name(name) , m_index(index) - , m_window(window) { // This class should only recieve Keyboard or Keypad devices // Now, filter on just the buttons we can handle sanely @@ -223,9 +222,9 @@ Keyboard::Key::Key(IOHIDElementRef element, IOHIDDeviceRef device) }; const uint32_t keycode = IOHIDElementGetUsage(m_element); - for (uint32_t i = 0; i < sizeof named_keys / sizeof *named_keys; i++) - if (named_keys[i].code == keycode) { - m_name = named_keys[i].name; + for (auto & named_key : named_keys) + if (named_key.code == keycode) { + m_name = named_key.name; return; } diff --git a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp index 40c822c577..24e0d0de58 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp @@ -7,18 +7,14 @@ #include #ifdef _WIN32 - #if SDL_VERSION_ATLEAST(1, 3, 0) - #pragma comment(lib, "SDL.1.3.lib") - #else - #pragma comment(lib, "SDL.lib") - #endif +#pragma comment(lib, "SDL2.lib") #endif namespace ciface { namespace SDL { - + std::string GetJoystickName(int index) { #if SDL_VERSION_ATLEAST(2, 0, 0) @@ -29,7 +25,7 @@ std::string GetJoystickName(int index) } void Init( std::vector& devices ) -{ +{ // this is used to number the joysticks // multiple joysticks with the same name shall get unique ids starting at 0 std::map name_counts; @@ -83,7 +79,7 @@ Joystick::Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsi // get buttons for (u8 i = 0; i != SDL_JoystickNumButtons(m_joystick); ++i) AddInput(new Button(i, m_joystick)); - + // get hats for (u8 i = 0; i != SDL_JoystickNumHats(m_joystick); ++i) { @@ -155,15 +151,16 @@ Joystick::~Joystick() { #ifdef USE_SDL_HAPTIC if (m_haptic) - { + { // stop/destroy all effects SDL_HapticStopAll(m_haptic); - std::list::iterator - i = m_state_out.begin(), - e = m_state_out.end(); - for ( ; i != e; ++i) - if (i->id != -1) - SDL_HapticDestroyEffect(m_haptic, i->id); + for (auto &i : m_state_out) + { + if (i.id != -1) + { + SDL_HapticDestroyEffect(m_haptic, i.id); + } + } // close haptic first SDL_HapticClose(m_haptic); } @@ -201,7 +198,7 @@ std::string Joystick::TriangleEffect::GetName() const return "Triangle"; } -void Joystick::ConstantEffect::SetState(const ControlState state) +void Joystick::ConstantEffect::SetState(ControlState state) { if (state) { @@ -214,12 +211,12 @@ void Joystick::ConstantEffect::SetState(const ControlState state) } const Sint16 old = m_effect.effect.constant.level; - m_effect.effect.constant.level = state * 0x7FFF; + m_effect.effect.constant.level = (Sint16)(state * 0x7FFF); if (old != m_effect.effect.constant.level) m_effect.changed = true; } -void Joystick::RampEffect::SetState(const ControlState state) +void Joystick::RampEffect::SetState(ControlState state) { if (state) { @@ -232,12 +229,12 @@ void Joystick::RampEffect::SetState(const ControlState state) } const Sint16 old = m_effect.effect.ramp.start; - m_effect.effect.ramp.start = state * 0x7FFF; + m_effect.effect.ramp.start = (Sint16)(state * 0x7FFF); if (old != m_effect.effect.ramp.start) m_effect.changed = true; } -void Joystick::SineEffect::SetState(const ControlState state) +void Joystick::SineEffect::SetState(ControlState state) { if (state) { @@ -251,7 +248,7 @@ void Joystick::SineEffect::SetState(const ControlState state) const Sint16 old = m_effect.effect.periodic.magnitude; m_effect.effect.periodic.period = 5; - m_effect.effect.periodic.magnitude = state * 0x5000; + m_effect.effect.periodic.magnitude = (Sint16)(state * 0x5000); m_effect.effect.periodic.attack_length = 0; m_effect.effect.periodic.fade_length = 500; @@ -260,7 +257,7 @@ void Joystick::SineEffect::SetState(const ControlState state) } #ifdef SDL_HAPTIC_SQUARE -void Joystick::SquareEffect::SetState(const ControlState state) +void Joystick::SquareEffect::SetState(ControlState state) { if (state) { @@ -283,7 +280,7 @@ void Joystick::SquareEffect::SetState(const ControlState state) } #endif // defined(SDL_HAPTIC_SQUARE) -void Joystick::TriangleEffect::SetState(const ControlState state) +void Joystick::TriangleEffect::SetState(ControlState state) { if (state) { @@ -297,7 +294,7 @@ void Joystick::TriangleEffect::SetState(const ControlState state) const Sint16 old = m_effect.effect.periodic.magnitude; m_effect.effect.periodic.period = 5; - m_effect.effect.periodic.magnitude = state * 0x5000; + m_effect.effect.periodic.magnitude = (Sint16)(state * 0x5000); m_effect.effect.periodic.attack_length = 0; m_effect.effect.periodic.fade_length = 100; @@ -310,41 +307,42 @@ bool Joystick::UpdateInput() { // each joystick is doin this, o well SDL_JoystickUpdate(); - + return true; } bool Joystick::UpdateOutput() { #ifdef USE_SDL_HAPTIC - std::list::iterator - i = m_state_out.begin(), - e = m_state_out.end(); - for ( ; i != e; ++i) + for (auto &i : m_state_out) { - if (i->changed) // if SetState was called on this output + if (i.changed) // if SetState was called on this output { - if (-1 == i->id) // effect isn't currently uploaded + if (-1 == i.id) // effect isn't currently uploaded { - if (i->effect.type) // if outputstate is >0 this would be true - if ((i->id = SDL_HapticNewEffect( m_haptic, &i->effect )) > -1) // upload the effect - SDL_HapticRunEffect(m_haptic, i->id, 1); // run the effect + if (i.effect.type) // if outputstate is >0 this would be true + { + if ((i.id = SDL_HapticNewEffect(m_haptic, &i.effect)) > -1) // upload the effect + { + SDL_HapticRunEffect(m_haptic, i.id, 1); // run the effect + } + } } else // effect is already uploaded { - if (i->effect.type) // if ouputstate >0 + if (i.effect.type) // if ouputstate >0 { - SDL_HapticUpdateEffect(m_haptic, i->id, &i->effect); // update the effect + SDL_HapticUpdateEffect(m_haptic, i.id, &i.effect); // update the effect } else { - SDL_HapticStopEffect(m_haptic, i->id); // else, stop and remove the effect - SDL_HapticDestroyEffect(m_haptic, i->id); - i->id = -1; // mark it as not uploaded + SDL_HapticStopEffect(m_haptic, i.id); // else, stop and remove the effect + SDL_HapticDestroyEffect(m_haptic, i.id); + i.id = -1; // mark it as not uploaded } } - i->changed = false; + i.changed = false; } } #endif diff --git a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h index 9b9794c481..f1714b253e 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h @@ -43,9 +43,9 @@ private: class Button : public Core::Device::Input { public: - std::string GetName() const; + std::string GetName() const override; Button(u8 index, SDL_Joystick* js) : m_js(js), m_index(index) {} - ControlState GetState() const; + ControlState GetState() const override; private: SDL_Joystick* const m_js; const u8 m_index; @@ -54,9 +54,9 @@ private: class Axis : public Core::Device::Input { public: - std::string GetName() const; + std::string GetName() const override; Axis(u8 index, SDL_Joystick* js, Sint16 range) : m_js(js), m_range(range), m_index(index) {} - ControlState GetState() const; + ControlState GetState() const override; private: SDL_Joystick* const m_js; const Sint16 m_range; @@ -66,9 +66,9 @@ private: class Hat : public Input { public: - std::string GetName() const; + std::string GetName() const override; Hat(u8 index, SDL_Joystick* js, u8 direction) : m_js(js), m_direction(direction), m_index(index) {} - ControlState GetState() const; + ControlState GetState() const override; private: SDL_Joystick* const m_js; const u8 m_direction; @@ -81,7 +81,7 @@ private: public: std::string GetName() const; ConstantEffect(EffectIDState& effect) : m_effect(effect) {} - void SetState(const ControlState state); + void SetState(ControlState state); private: EffectIDState& m_effect; }; @@ -91,7 +91,7 @@ private: public: std::string GetName() const; RampEffect(EffectIDState& effect) : m_effect(effect) {} - void SetState(const ControlState state); + void SetState(ControlState state); private: EffectIDState& m_effect; }; @@ -101,7 +101,7 @@ private: public: std::string GetName() const; SineEffect(EffectIDState& effect) : m_effect(effect) {} - void SetState(const ControlState state); + void SetState(ControlState state); private: EffectIDState& m_effect; }; @@ -112,7 +112,7 @@ private: public: std::string GetName() const; SquareEffect(EffectIDState& effect) : m_effect(effect) {} - void SetState(const ControlState state); + void SetState(ControlState state); private: EffectIDState& m_effect; }; @@ -123,22 +123,22 @@ private: public: std::string GetName() const; TriangleEffect(EffectIDState& effect) : m_effect(effect) {} - void SetState(const ControlState state); + void SetState(ControlState state); private: EffectIDState& m_effect; }; #endif public: - bool UpdateInput(); - bool UpdateOutput(); + bool UpdateInput() override; + bool UpdateOutput() override; Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsigned int index); ~Joystick(); - std::string GetName() const; - int GetId() const; - std::string GetSource() const; + std::string GetName() const override; + int GetId() const override; + std::string GetSource() const override; private: SDL_Joystick* const m_joystick; diff --git a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp index c687bef856..0aa639aae8 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp @@ -10,7 +10,7 @@ static const struct { const char* const name; const WORD bitmask; -} named_buttons[] = +} named_buttons[] = { { "Button A", XINPUT_GAMEPAD_A }, { "Button B", XINPUT_GAMEPAD_B }, @@ -48,14 +48,60 @@ static const char* const named_motors[] = "Motor R" }; +static HMODULE hXInput = nullptr; + +typedef decltype(&XInputGetCapabilities) XInputGetCapabilities_t; +typedef decltype(&XInputSetState) XInputSetState_t; +typedef decltype(&XInputGetState) XInputGetState_t; + +static XInputGetCapabilities_t PXInputGetCapabilities = nullptr; +static XInputSetState_t PXInputSetState = nullptr; +static XInputGetState_t PXInputGetState = nullptr; + void Init(std::vector& devices) { + if (!hXInput) + { + // Try for the most recent version we were compiled against (will only work if running on Win8+) + hXInput = ::LoadLibrary(XINPUT_DLL); + if (!hXInput) + { + // Drop back to DXSDK June 2010 version. Requires DX June 2010 redist. + hXInput = ::LoadLibrary(TEXT("xinput1_3.dll")); + if (!hXInput) + { + return; + } + } + + PXInputGetCapabilities = (XInputGetCapabilities_t)::GetProcAddress(hXInput, "XInputGetCapabilities"); + PXInputSetState = (XInputSetState_t)::GetProcAddress(hXInput, "XInputSetState"); + PXInputGetState = (XInputGetState_t)::GetProcAddress(hXInput, "XInputGetState"); + if (!PXInputGetCapabilities || + !PXInputSetState || + !PXInputGetState) + { + ::FreeLibrary(hXInput); + hXInput = nullptr; + return; + } + } + XINPUT_CAPABILITIES caps; for (int i = 0; i != 4; ++i) - if (ERROR_SUCCESS == XInputGetCapabilities(i, 0, &caps)) + if (ERROR_SUCCESS == PXInputGetCapabilities(i, 0, &caps)) devices.push_back(new Device(caps, i)); } +void DeInit() +{ + if (hXInput) + { + ::FreeLibrary(hXInput); + hXInput = nullptr; + } +} + Device::Device(const XINPUT_CAPABILITIES& caps, u8 index) : m_index(index), m_subtype(caps.SubType) { @@ -107,25 +153,21 @@ Device::Device(const XINPUT_CAPABILITIES& caps, u8 index) void Device::ClearInputState() { - ZeroMemory(&m_state_in, sizeof(m_state_in)); + ZeroMemory(&m_state_in, sizeof(m_state_in)); } std::string Device::GetName() const { - // why aren't these defined - // subtype doesn't seem to work, I tested with 2 different arcade sticks, both were shown as gamepad - // I'll leave it in anyway, maybe m$ will fix it - switch (m_subtype) { - case XINPUT_DEVSUBTYPE_GAMEPAD : return "Gamepad"; break; - case 0x02 /*XINPUT_DEVSUBTYPE_WHEEL*/ : return "Wheel"; break; - case 0x03 /*XINPUT_DEVSUBTYPE_ARCADE_STICK*/ : return "Arcade Stick"; break; - case 0x04 /*XINPUT_DEVSUBTYPE_FLIGHT_STICK*/ : return "Flight Stick"; break; - case 0x05 /*XINPUT_DEVSUBTYPE_DANCE_PAD*/ : return "Dance Pad"; break; - case 0x06 /*XINPUT_DEVSUBTYPE_GUITAR*/ : return "Guitar"; break; - case 0x08 /*XINPUT_DEVSUBTYPE_DRUM_KIT*/ : return "Drum Kit"; break; - default : return "Device"; break; + case XINPUT_DEVSUBTYPE_GAMEPAD: return "Gamepad"; break; + case XINPUT_DEVSUBTYPE_WHEEL: return "Wheel"; break; + case XINPUT_DEVSUBTYPE_ARCADE_STICK: return "Arcade Stick"; break; + case XINPUT_DEVSUBTYPE_FLIGHT_STICK: return "Flight Stick"; break; + case XINPUT_DEVSUBTYPE_DANCE_PAD: return "Dance Pad"; break; + case XINPUT_DEVSUBTYPE_GUITAR: return "Guitar"; break; + case XINPUT_DEVSUBTYPE_DRUM_KIT: return "Drum Kit"; break; + default: return "Device"; break; } } @@ -143,7 +185,7 @@ std::string Device::GetSource() const bool Device::UpdateInput() { - return (ERROR_SUCCESS == XInputGetState(m_index, &m_state_in)); + return (ERROR_SUCCESS == PXInputGetState(m_index, &m_state_in)); } bool Device::UpdateOutput() @@ -153,7 +195,7 @@ bool Device::UpdateOutput() if (memcmp(&m_state_out, &m_current_state_out, sizeof(m_state_out))) { m_current_state_out = m_state_out; - return (ERROR_SUCCESS == XInputSetState(m_index, &m_state_out)); + return (ERROR_SUCCESS == PXInputSetState(m_index, &m_state_out)); } else { diff --git a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h index 8fe6dd1dee..17e49e5e2b 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h @@ -1,3 +1,8 @@ +// XInput suffers a similar issue as XAudio2. Since Win8, it is part of the OS. +// However, unlike XAudio2 they have not made the API incompatible - so we just +// compile against the latest version and fall back to dynamically loading the +// old DLL. + #ifndef _CIFACE_XINPUT_H_ #define _CIFACE_XINPUT_H_ @@ -7,12 +12,17 @@ #include #include +#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK +#error You are building this module against the wrong version of DirectX. You probably need to remove DXSDK_DIR from your include path and/or _WIN32_WINNT is wrong. +#endif + namespace ciface { namespace XInput { void Init(std::vector& devices); +void DeInit(); class Device : public Core::Device { diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.cpp index b42eda1f21..23cadd3ee6 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.cpp @@ -8,8 +8,8 @@ #include // This is an input plugin using the XInput 2.0 extension to the X11 protocol, -// loosely based on the old XLib plugin. (Has nothing to do with the XInput -// API on Windows.) +// loosely based on the old XLib plugin. (Has nothing to do with the XInput +// API on Windows.) // This plugin creates one KeyboardMouse object for each master pointer/ // keyboard pair. Each KeyboardMouse object exports four types of controls: @@ -20,20 +20,20 @@ // center of the emulator window. // * Mouse axis controls: one for each cardinal direction. Calculated using // a running average of relative mouse motion on each axis. -// * Key controls: these correspond to a limited subset of the keyboard +// * Key controls: these correspond to a limited subset of the keyboard // keys. // Mouse axis control tuning. Unlike absolute mouse position, relative mouse // motion data needs to be tweaked and smoothed out a bit to be usable. -// Mouse axis control output is simply divided by this number. In practice, +// Mouse axis control output is simply divided by this number. In practice, // that just means you can use a smaller "dead zone" if you bind axis controls // to a joystick. No real need to make this customizable. #define MOUSE_AXIS_SENSITIVITY 8.0f // The mouse axis controls use a weighted running average. Each frame, the new -// value is the average of the old value and the amount of relative mouse +// value is the average of the old value and the amount of relative mouse // motion during that frame. The old value is weighted by a ratio of // MOUSE_AXIS_SMOOTHING:1 compared to the new value. Increasing // MOUSE_AXIS_SMOOTHING makes the controls smoother, decreasing it makes them @@ -49,31 +49,31 @@ namespace XInput2 void Init(std::vector& devices, void* const hwnd) { Display* dpy; - + dpy = XOpenDisplay(NULL); - - // xi_opcode is important; it will be used to identify XInput events by + + // xi_opcode is important; it will be used to identify XInput events by // the polling loop in UpdateInput. int xi_opcode, event, error; - + // verify that the XInput extension is available if (!XQueryExtension(dpy, "XInputExtension", &xi_opcode, &event, &error)) return; - + // verify that the XInput extension is at at least version 2.0 int major = 2, minor = 0; - + if (XIQueryVersion(dpy, &major, &minor) != Success) return; - + // register all master devices with Dolphin - + XIDeviceInfo* all_masters; XIDeviceInfo* current_master; int num_masters; - + all_masters = XIQueryDevice(dpy, XIAllMasterDevices, &num_masters); - + for (int i = 0; i < num_masters; i++) { current_master = &all_masters[i]; @@ -82,34 +82,34 @@ void Init(std::vector& devices, void* const hwnd) // be a master keyboard. devices.push_back(new KeyboardMouse((Window)hwnd, xi_opcode, current_master->deviceid, current_master->attachment)); } - + XCloseDisplay(dpy); - + XIFreeDeviceInfo(all_masters); } -// Apply the event mask to the device and all its slaves. Only used in the +// Apply the event mask to the device and all its slaves. Only used in the // constructor. Remember, each KeyboardMouse has its own copy of the event // stream, which is how multiple event masks can "coexist." void KeyboardMouse::SelectEventsForDevice(Window window, XIEventMask *mask, int deviceid) { // Set the event mask for the master device. - + mask->deviceid = deviceid; XISelectEvents(m_display, window, mask, 1); - + // Query all the master device's slaves and set the same event mask for // those too. There are two reasons we want to do this. For mouse devices, // we want the raw motion events, and only slaves (i.e. physical hardware // devices) emit those. For keyboard devices, selecting slaves avoids // dealing with key focus. - + XIDeviceInfo* all_slaves; XIDeviceInfo* current_slave; int num_slaves; - + all_slaves = XIQueryDevice(m_display, XIAllDevices, &num_slaves); - + for (int i = 0; i < num_slaves; i++) { current_slave = &all_slaves[i]; @@ -118,33 +118,33 @@ void KeyboardMouse::SelectEventsForDevice(Window window, XIEventMask *mask, int mask->deviceid = current_slave->deviceid; XISelectEvents(m_display, window, mask, 1); } - + XIFreeDeviceInfo(all_slaves); } -KeyboardMouse::KeyboardMouse(Window window, int opcode, int pointer, int keyboard) +KeyboardMouse::KeyboardMouse(Window window, int opcode, int pointer, int keyboard) : m_window(window), xi_opcode(opcode), pointer_deviceid(pointer), keyboard_deviceid(keyboard) { memset(&m_state, 0, sizeof(m_state)); - + // The cool thing about each KeyboardMouse object having its own Display // is that each one gets its own separate copy of the X11 event stream, // which it can individually filter to get just the events it's interested // in. So be aware that each KeyboardMouse object actually has its own X11 // "context." m_display = XOpenDisplay(NULL); - + int min_keycode, max_keycode; XDisplayKeycodes(m_display, &min_keycode, &max_keycode); - + int unused; // should always be 1 XIDeviceInfo* pointer_device = XIQueryDevice(m_display, pointer_deviceid, &unused); name = std::string(pointer_device->name); XIFreeDeviceInfo(pointer_device); - + XIEventMask mask; unsigned char mask_buf[(XI_LASTEVENT + 7)/8]; - + mask.mask_len = sizeof(mask_buf); mask.mask = mask_buf; memset(mask_buf, 0, sizeof(mask_buf)); @@ -155,9 +155,9 @@ KeyboardMouse::KeyboardMouse(Window window, int opcode, int pointer, int keyboar XISetMask(mask_buf, XI_KeyPress); XISetMask(mask_buf, XI_KeyRelease); - SelectEventsForDevice(DefaultRootWindow(m_display), &mask, pointer_deviceid); + SelectEventsForDevice(DefaultRootWindow(m_display), &mask, pointer_deviceid); SelectEventsForDevice(DefaultRootWindow(m_display), &mask, keyboard_deviceid); - + // Keyboard Keys for (int i = min_keycode; i <= max_keycode; ++i) { @@ -175,7 +175,7 @@ KeyboardMouse::KeyboardMouse(Window window, int opcode, int pointer, int keyboar // Mouse Cursor, X-/+ and Y-/+ for (int i = 0; i != 4; ++i) AddInput(new Cursor(!!(i & 2), !!(i & 1), (&m_state.cursor.x)[!!(i & 2)])); - + // Mouse Axis, X-/+ and Y-/+ for (int i = 0; i != 4; ++i) AddInput(new Axis(!!(i & 2), !!(i & 1), (&m_state.axis.x)[!!(i & 2)])); @@ -191,15 +191,15 @@ void KeyboardMouse::UpdateCursor() { double root_x, root_y, win_x, win_y; Window root, child; - - // unused-- we're not interested in button presses here, as those are + + // unused-- we're not interested in button presses here, as those are // updated using events XIButtonState button_state; XIModifierState mods; XIGroupState group; - + XIQueryPointer(m_display, pointer_deviceid, m_window, &root, &child, &root_x, &root_y, &win_x, &win_y, &button_state, &mods, &group); - + free (button_state.mask); XWindowAttributes win_attribs; @@ -213,32 +213,32 @@ void KeyboardMouse::UpdateCursor() bool KeyboardMouse::UpdateInput() { XFlush(m_display); - + // Get the absolute position of the mouse pointer UpdateCursor(); - + // for the axis controls float delta_x = 0.0f, delta_y = 0.0f; double delta_delta; - + // Iterate through the event queue - update the axis controls, mouse // button controls, and keyboard controls. XEvent event; - while (XPending(m_display)) + while (XPending(m_display)) { XNextEvent(m_display, &event); - + if (event.xcookie.type != GenericEvent) continue; if (event.xcookie.extension != xi_opcode) continue; if (!XGetEventData(m_display, &event.xcookie)) continue; - + // only one of these will get used XIDeviceEvent* dev_event = (XIDeviceEvent*)event.xcookie.data; XIRawEvent* raw_event = (XIRawEvent*)event.xcookie.data; - + switch (event.xcookie.evtype) { case XI_ButtonPress: @@ -254,7 +254,7 @@ bool KeyboardMouse::UpdateInput() m_state.keyboard[dev_event->detail / 8] &= ~(1<<(dev_event->detail % 8)); break; case XI_RawMotion: - // always safe because there is always at least one byte in + // always safe because there is always at least one byte in // raw_event->valuators.mask, and if a bit is set in the mask, // then the value in raw_values is also available. if (XIMaskIsSet(raw_event->valuators.mask, 0)) @@ -273,10 +273,10 @@ bool KeyboardMouse::UpdateInput() } break; } - + XFreeEventData(m_display, &event.xcookie); } - + // apply axis smoothing m_state.axis.x *= MOUSE_AXIS_SMOOTHING; m_state.axis.x += delta_x; @@ -284,7 +284,7 @@ bool KeyboardMouse::UpdateInput() m_state.axis.y *= MOUSE_AXIS_SMOOTHING; m_state.axis.y += delta_y; m_state.axis.y /= MOUSE_AXIS_SMOOTHING+1.0f; - + return true; } @@ -322,10 +322,10 @@ KeyboardMouse::Key::Key(Display* const display, KeyCode keycode, const char* key } while (keysym == NoSymbol && i < 8); - // Convert to upper case for the keyname + // Convert to upper case for the keyname if (keysym >= 97 && keysym <= 122) keysym -= 32; - + // 0x0110ffff is the top of the unicode character range according // to keysymdef.h although it is probably more than we need. if (keysym == NoSymbol || keysym > 0x0110ffff || diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.h b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.h index 58a1a38c8c..dfb8fa285d 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/XInput2.h @@ -35,7 +35,7 @@ private: float x, y; } cursor, axis; }; - + class Key : public Input { friend class KeyboardMouse; @@ -43,21 +43,21 @@ private: std::string GetName() const { return m_keyname; } Key(Display* display, KeyCode keycode, const char* keyboard); ControlState GetState() const; - + private: std::string m_keyname; Display* const m_display; const char* const m_keyboard; const KeyCode m_keycode; }; - + class Button : public Input { public: std::string GetName() const { return name; } Button(unsigned int index, unsigned int& buttons); ControlState GetState() const; - + private: const unsigned int& m_buttons; const unsigned int m_index; @@ -71,14 +71,14 @@ private: bool IsDetectable() { return false; } Cursor(u8 index, bool positive, const float& cursor); ControlState GetState() const; - + private: const float& m_cursor; const u8 m_index; const bool m_positive; std::string name; }; - + class Axis : public Input { public: @@ -93,22 +93,22 @@ private: const bool m_positive; std::string name; }; - + private: void SelectEventsForDevice(Window window, XIEventMask *mask, int deviceid); void UpdateCursor(); - + public: bool UpdateInput(); bool UpdateOutput(); - + KeyboardMouse(Window window, int opcode, int pointer_deviceid, int keyboard_deviceid); ~KeyboardMouse(); - + std::string GetName() const; std::string GetSource() const; int GetId() const; - + private: Window m_window; Display* m_display; diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp index 7016c4908b..e507b88c9f 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp @@ -20,7 +20,7 @@ KeyboardMouse::KeyboardMouse(Window window) : m_window(window) int min_keycode, max_keycode; XDisplayKeycodes(m_display, &min_keycode, &max_keycode); - + // Keyboard Keys for (int i = min_keycode; i <= max_keycode; ++i) { @@ -99,7 +99,7 @@ KeyboardMouse::Key::Key(Display* const display, KeyCode keycode, const char* key i++; } while (keysym == NoSymbol && i < 8); - + // Convert to upper case for the keyname if (keysym >= 97 && keysym <= 122) keysym -= 32; diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.h b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.h index c178f1e9b4..35b6100081 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.h +++ b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.h @@ -26,7 +26,7 @@ private: float x, y; } cursor; }; - + class Key : public Input { friend class KeyboardMouse; @@ -34,14 +34,14 @@ private: std::string GetName() const; Key(Display* display, KeyCode keycode, const char* keyboard); ControlState GetState() const; - + private: std::string m_keyname; Display* const m_display; const char* const m_keyboard; const KeyCode m_keycode; }; - + class Button : public Input { public: @@ -49,7 +49,7 @@ private: Button(unsigned int index, unsigned int& buttons) : m_buttons(buttons), m_index(index) {} ControlState GetState() const; - + private: const unsigned int& m_buttons; const unsigned int m_index; @@ -69,18 +69,18 @@ private: const u8 m_index; const bool m_positive; }; - + public: bool UpdateInput(); bool UpdateOutput(); - + KeyboardMouse(Window window); ~KeyboardMouse(); - + std::string GetName() const; std::string GetSource() const; int GetId() const; - + private: Window m_window; Display* m_display; diff --git a/Source/Core/InputCommon/Src/GCPadStatus.h b/Source/Core/InputCommon/Src/GCPadStatus.h index c94f0b7fe8..94abef01e2 100644 --- a/Source/Core/InputCommon/Src/GCPadStatus.h +++ b/Source/Core/InputCommon/Src/GCPadStatus.h @@ -5,8 +5,6 @@ #ifndef _GCPAD_H_INCLUDED__ #define _GCPAD_H_INCLUDED__ -#include "CommonTypes.h" - #define PAD_ERR_NONE 0 #define PAD_ERR_NO_CONTROLLER -1 #define PAD_ERR_NOT_READY -2 diff --git a/Source/Core/InputCommon/Src/InputConfig.cpp b/Source/Core/InputCommon/Src/InputConfig.cpp index 96fc6205db..9382138c43 100644 --- a/Source/Core/InputCommon/Src/InputConfig.cpp +++ b/Source/Core/InputCommon/Src/InputConfig.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include "InputConfig.h" +#include "CommonPaths.h" #include "../../Core/Src/ConfigManager.h" #include "../../Core/Src/HW/Wiimote.h" @@ -37,7 +38,8 @@ bool InputPlugin::LoadConfig(bool isGC) type = "Wiimote"; path = "Profiles/Wiimote/"; } - game_ini.Load(File::GetUserPath(D_GAMECONFIG_IDX) + SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID() + ".ini"); + game_ini.Load(File::GetSysDirectory() + GAMESETTINGS_DIR DIR_SEP + SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID() + ".ini"); + game_ini.Load(File::GetUserPath(D_GAMESETTINGS_IDX) + SConfig::GetInstance().m_LocalCoreStartupParameter.GetUniqueID() + ".ini", true); for (int i = 0; i < 4; i++) { if (game_ini.Exists("Controls", (type + "Profile" + num[i]).c_str())) @@ -46,7 +48,10 @@ bool InputPlugin::LoadConfig(bool isGC) if (File::Exists(File::GetUserPath(D_CONFIG_IDX) + path + profile[i] + ".ini")) useProfile[i] = true; else + { + // TODO: Having a PanicAlert for this is dumb. PanicAlertT("Selected controller profile does not exist"); + } } } } @@ -94,6 +99,6 @@ void InputPlugin::SaveConfig() e = controllers.end(); for ( ; i!=e; ++i ) (*i)->SaveConfig(inifile.GetOrCreateSection((*i)->GetName().c_str())); - + inifile.Save(ini_filename); } diff --git a/Source/Core/InputCommon/Src/InputConfig.h b/Source/Core/InputCommon/Src/InputConfig.h index 0d14f325d1..f6d563fa11 100644 --- a/Source/Core/InputCommon/Src/InputConfig.h +++ b/Source/Core/InputCommon/Src/InputConfig.h @@ -12,10 +12,8 @@ #include "ControllerInterface/ControllerInterface.h" #include "ControllerEmu.h" -#include #include #include -#include // InputPlugin isn't a very good name anymore since it's used by GCPad/Wiimote // which are not even plugins anymore. diff --git a/Source/Core/InputCommon/Src/UDPWiimote.cpp b/Source/Core/InputCommon/Src/UDPWiimote.cpp index e0cf787e0f..5419cb61ce 100644 --- a/Source/Core/InputCommon/Src/UDPWiimote.cpp +++ b/Source/Core/InputCommon/Src/UDPWiimote.cpp @@ -59,12 +59,12 @@ struct UDPWiimote::_d int UDPWiimote::noinst = 0; -UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) : +UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) : port(_port), displayName(name), d(new _d) ,x(0),y(0),z(1.0f),naX(0),naY(0),naZ(-1.0f),nunX(0),nunY(0), pointerX(1001.0f/2),pointerY(0),nunMask(0),mask(0),index(_index), int_port(atoi(_port)) { - + static bool sranded=false; if (!sranded) { @@ -72,7 +72,7 @@ UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) : sranded=true; } bcastMagic=rand() & 0xFFFF; - + #ifdef _WIN32 u_long iMode = 1; #endif @@ -88,21 +88,21 @@ UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) : WSAStartup(sockVersion, &wsaData); } #endif - + noinst++; memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; // use my IP - + if (!int_port) { cleanup; err=-1; return; } - + if ((rv = getaddrinfo(NULL, _port, &hints, &servinfo)) != 0) { cleanup; @@ -126,14 +126,14 @@ UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) : } d->sockfds.push_back(sock); } - + if (d->sockfds.empty()) { cleanup; err=-2; return; } - + freeaddrinfo(servinfo); err=0; d->exit=false; @@ -160,15 +160,15 @@ void UDPWiimote::mainThread() { int maxfd=0; FD_ZERO(&fds); - for (std::list::iterator i=d->sockfds.begin(); i!=d->sockfds.end(); i++) + for (auto& fd : d->sockfds) { - FD_SET(*i,&fds); + FD_SET(fd,&fds); #ifndef _WIN32 - if (*i>=maxfd) - maxfd=(*i)+1; + if (fd>=maxfd) + maxfd=(fd)+1; #endif } - + u64 tleft=timeout.tv_sec*1000+timeout.tv_usec/1000; u64 telapsed=time.GetTimeDifference(); time.Update(); @@ -184,29 +184,28 @@ void UDPWiimote::mainThread() timeout.tv_sec=(long)(tleft/1000); timeout.tv_usec=(tleft%1000)*1000; } - + lk.unlock(); //VERY hacky. don't like it - if (d->exit) return; + if (d->exit) return; int rt=select(maxfd,&fds,NULL,NULL,&timeout); if (d->exit) return; lk.lock(); if (d->exit) return; - + if (rt) { - for (std::list::iterator i=d->sockfds.begin(); i!=d->sockfds.end(); i++) + for (sock_t fd : d->sockfds) { - if (FD_ISSET(*i,&fds)) + if (FD_ISSET(fd,&fds)) { - sock_t fd=*i; u8 bf[64]; int size=60; size_t addr_len; struct sockaddr_storage their_addr; addr_len = sizeof their_addr; - if ((size = recvfrom(fd, - (dataz)bf, - size , 0,(struct sockaddr *)&their_addr, (socklen_t*)&addr_len)) == -1) + if ((size = recvfrom(fd, + (dataz)bf, + size , 0,(struct sockaddr *)&their_addr, (socklen_t*)&addr_len)) == -1) { ERROR_LOG(WIIMOTE,"UDPWii Packet error"); } @@ -235,8 +234,8 @@ UDPWiimote::~UDPWiimote() std::lock_guard lk(d->termLock); d->thread.join(); } - for (std::list::iterator i=d->sockfds.begin(); i!=d->sockfds.end(); i++) - close(*i); + for (auto& elem : d->sockfds) + close(elem); close(d->bipv4_fd); close(d->bipv6_fd); cleanup; @@ -328,7 +327,7 @@ void UDPWiimote::initBroadcastIPv4() WARN_LOG(WIIMOTE,"socket() failed"); return; } - + int broad=1; if (setsockopt(d->bipv4_fd,SOL_SOCKET,SO_BROADCAST, (const dataz)(&broad), sizeof broad) == -1) { @@ -345,7 +344,7 @@ void UDPWiimote::broadcastIPv4(const void * data, size_t size) their_addr.sin_port = htons(4431); their_addr.sin_addr.s_addr = INADDR_BROADCAST; memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero); - + int num; if ((num=sendto(d->bipv4_fd,(const dataz)data,(int)size,0,(struct sockaddr *) &their_addr, sizeof their_addr)) == -1) { diff --git a/Source/Core/InputCommon/Src/UDPWiimote.h b/Source/Core/InputCommon/Src/UDPWiimote.h index 01b9b11969..877cb87473 100644 --- a/Source/Core/InputCommon/Src/UDPWiimote.h +++ b/Source/Core/InputCommon/Src/UDPWiimote.h @@ -38,7 +38,7 @@ private: std::string port,displayName; int pharsePacket(u8 * data, size_t size); struct _d; //using pimpl because Winsock2.h doesn't have include guards -_- - _d *d; + _d *d; double x,y,z; double naX,naY,naZ; double nunX,nunY; diff --git a/Source/Core/InputCommon/Src/UDPWrapper.cpp b/Source/Core/InputCommon/Src/UDPWrapper.cpp index e176a2164d..7fc77c4f44 100644 --- a/Source/Core/InputCommon/Src/UDPWrapper.cpp +++ b/Source/Core/InputCommon/Src/UDPWrapper.cpp @@ -12,7 +12,7 @@ const char* DefaultPort(const int index) return s.c_str(); } -UDPWrapper::UDPWrapper(int indx, const char* const _name) : +UDPWrapper::UDPWrapper(int indx, const char* const _name) : ControllerEmu::ControlGroup(_name,GROUP_TYPE_UDPWII), inst(NULL), index(indx), updIR(false),updAccel(false), diff --git a/Source/Core/InputCommon/Src/X11InputBase.cpp b/Source/Core/InputCommon/Src/X11InputBase.cpp index d23d2d77c5..b555a21449 100644 --- a/Source/Core/InputCommon/Src/X11InputBase.cpp +++ b/Source/Core/InputCommon/Src/X11InputBase.cpp @@ -105,7 +105,7 @@ KeySym wxCharCodeWXToX(int id) if (id >= 65 && id <= 90) // Standard uppercase letter: return lowercase keycode keySym = (KeySym)id + 32; - else + else // All other keyboard characters keySym = id <= 255 ? (KeySym)id : 0; } @@ -126,7 +126,7 @@ int wxKeyModWXToX(int modstate) #endif void XKeyToString(unsigned int keycode, char *keyStr) { switch (keycode) - { + { case XK_Insert: sprintf(keyStr, "INSERT"); break; @@ -148,10 +148,10 @@ void XKeyToString(unsigned int keycode, char *keyStr) { case XK_Left: sprintf(keyStr, "LEFT"); break; - case XK_Up: + case XK_Up: sprintf(keyStr, "UP"); break; - case XK_Right: + case XK_Right: sprintf(keyStr, "RIGHT"); break; case XK_Down: @@ -178,10 +178,10 @@ void XKeyToString(unsigned int keycode, char *keyStr) { case XK_KP_Left: sprintf(keyStr, "KP LEFT"); break; - case XK_KP_Up: + case XK_KP_Up: sprintf(keyStr, "KP UP"); break; - case XK_KP_Right: + case XK_KP_Right: sprintf(keyStr, "KP RIGHT"); break; case XK_KP_Down: diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/stdafx.cpp b/Source/Core/InputCommon/Src/stdafx.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/stdafx.cpp rename to Source/Core/InputCommon/Src/stdafx.cpp diff --git a/Source/Core/InputCommon/Src/stdafx.h b/Source/Core/InputCommon/Src/stdafx.h new file mode 100644 index 0000000000..498a15a12f --- /dev/null +++ b/Source/Core/InputCommon/Src/stdafx.h @@ -0,0 +1,14 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#pragma once +/* +#define _WIN32_WINNT 0x501 +#ifndef _WIN32_IE +#define _WIN32_IE 0x0500 // Default value is 0x0400 +#endif +*/ +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include diff --git a/Source/Core/VideoBackends/CMakeLists.txt b/Source/Core/VideoBackends/CMakeLists.txt new file mode 100644 index 0000000000..cb12f5fe55 --- /dev/null +++ b/Source/Core/VideoBackends/CMakeLists.txt @@ -0,0 +1,5 @@ +if(NOT USE_GLES OR USE_GLES3) + add_subdirectory(OGL) +endif() +add_subdirectory(Software) +# TODO: Add other backends here! diff --git a/Source/Core/VideoBackends/D3D/D3D.vcxproj b/Source/Core/VideoBackends/D3D/D3D.vcxproj new file mode 100644 index 0000000000..a4177f6909 --- /dev/null +++ b/Source/Core/VideoBackends/D3D/D3D.vcxproj @@ -0,0 +1,106 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {1c8436c9-dbaf-42be-83bc-cf3ec9175abe} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + + + + \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj.filters b/Source/Core/VideoBackends/D3D/D3D.vcxproj.filters similarity index 96% rename from Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj.filters rename to Source/Core/VideoBackends/D3D/D3D.vcxproj.filters index 4b8efac92b..efd5c46a08 100644 --- a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj.filters +++ b/Source/Core/VideoBackends/D3D/D3D.vcxproj.filters @@ -1,8 +1,14 @@  - - + + {ae700f7e-33c8-45b5-b7ee-a0ded3630549} + + + {3683d29b-19f6-4e7a-803f-4ac70b1d49fd} + + + D3D @@ -24,15 +30,30 @@ Render + + Render + Render + + Render + Render + + Render + + + Render + Render + + Render + Render @@ -42,33 +63,13 @@ Render - - Render - Render - - Render - - - Render - - - Render - - - Render - + + - - - - - - D3D - D3D @@ -81,55 +82,54 @@ D3D + + D3D + D3D Render - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - Render - - Render - Render - - - - {8dda993d-a0ed-4c2e-9651-c13c743e3e27} - - - {41d3f9d1-16f3-4a48-a486-292b1593dc92} - + + Render + + + Render + + + Render + + + Render + + + Render + + + Render + + + Render + + + Render + + + Render + + + Render + + + + + \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp b/Source/Core/VideoBackends/D3D/Src/D3DBase.cpp similarity index 85% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp rename to Source/Core/VideoBackends/D3D/Src/D3DBase.cpp index 0bd9a14ed8..5434354f37 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp +++ b/Source/Core/VideoBackends/D3D/Src/D3DBase.cpp @@ -14,15 +14,9 @@ namespace DX11 HINSTANCE hD3DCompilerDll = NULL; D3DREFLECT PD3DReflect = NULL; +pD3DCompile PD3DCompile = NULL; int d3dcompiler_dll_ref = 0; -HINSTANCE hD3DXDll = NULL; -D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory = NULL; -D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL; -D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA = NULL; -D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW = NULL; -int d3dx_dll_ref = 0; - CREATEDXGIFACTORY PCreateDXGIFactory = NULL; HINSTANCE hDXGIDll = NULL; int dxgi_dll_ref = 0; @@ -97,44 +91,6 @@ HRESULT LoadD3D() return S_OK; } -HRESULT LoadD3DX() -{ - if (d3dx_dll_ref++ > 0) return S_OK; - if (hD3DXDll) return S_OK; - - // try to load D3DX11 first to check whether we have proper runtime support - // try to use the dll the backend was compiled against first - don't bother about debug runtimes - hD3DXDll = LoadLibraryA(D3DX11_DLL_A); - if (!hD3DXDll) - { - // if that fails, use the dll which should be available in every SDK which officially supports DX11. - hD3DXDll = LoadLibraryA("d3dx11_42.dll"); - if (!hD3DXDll) - { - MessageBoxA(NULL, "Failed to load d3dx11_42.dll, update your DX11 runtime, please", "Critical error", MB_OK | MB_ICONERROR); - return E_FAIL; - } - else - { - NOTICE_LOG(VIDEO, "Successfully loaded d3dx11_42.dll. If you're having trouble, try updating your DX runtime first."); - } - } - - PD3DX11CompileFromMemory = (D3DX11COMPILEFROMMEMORYTYPE)GetProcAddress(hD3DXDll, "D3DX11CompileFromMemory"); - if (PD3DX11CompileFromMemory == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11CompileFromMemory!", "Critical error", MB_OK | MB_ICONERROR); - - PD3DX11FilterTexture = (D3DX11FILTERTEXTURETYPE)GetProcAddress(hD3DXDll, "D3DX11FilterTexture"); - if (PD3DX11FilterTexture == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11FilterTexture!", "Critical error", MB_OK | MB_ICONERROR); - - PD3DX11SaveTextureToFileA = (D3DX11SAVETEXTURETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileA"); - if (PD3DX11SaveTextureToFileA == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileA!", "Critical error", MB_OK | MB_ICONERROR); - - PD3DX11SaveTextureToFileW = (D3DX11SAVETEXTURETOFILEWTYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileW"); - if (PD3DX11SaveTextureToFileW == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileW!", "Critical error", MB_OK | MB_ICONERROR); - - return S_OK; -} - HRESULT LoadD3DCompiler() { if (d3dcompiler_dll_ref++ > 0) return S_OK; @@ -160,6 +116,8 @@ HRESULT LoadD3DCompiler() PD3DReflect = (D3DREFLECT)GetProcAddress(hD3DCompilerDll, "D3DReflect"); if (PD3DReflect == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DReflect!", "Critical error", MB_OK | MB_ICONERROR); + PD3DCompile = (pD3DCompile)GetProcAddress(hD3DCompilerDll, "D3DCompile"); + if (PD3DCompile == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DCompile!", "Critical error", MB_OK | MB_ICONERROR); return S_OK; } @@ -174,18 +132,6 @@ void UnloadDXGI() PCreateDXGIFactory = NULL; } -void UnloadD3DX() -{ - if (!d3dx_dll_ref) return; - if (--d3dx_dll_ref != 0) return; - - if(hD3DXDll) FreeLibrary(hD3DXDll); - hD3DXDll = NULL; - PD3DX11FilterTexture = NULL; - PD3DX11SaveTextureToFileA = NULL; - PD3DX11SaveTextureToFileW = NULL; -} - void UnloadD3D() { if (!d3d_dll_ref) return; @@ -269,13 +215,11 @@ HRESULT Create(HWND wnd) hr = LoadDXGI(); if (SUCCEEDED(hr)) hr = LoadD3D(); - if (SUCCEEDED(hr)) hr = LoadD3DX(); if (SUCCEEDED(hr)) hr = LoadD3DCompiler(); if (FAILED(hr)) { UnloadDXGI(); UnloadD3D(); - UnloadD3DX(); UnloadD3DCompiler(); return hr; } @@ -416,7 +360,6 @@ void Close() device = NULL; // unload DLLs - UnloadD3DX(); UnloadD3D(); UnloadDXGI(); } diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.h b/Source/Core/VideoBackends/D3D/Src/D3DBase.h similarity index 58% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DBase.h rename to Source/Core/VideoBackends/D3D/Src/D3DBase.h index 03c1ed9d13..7f26cbd3cc 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.h +++ b/Source/Core/VideoBackends/D3D/Src/D3DBase.h @@ -4,12 +4,13 @@ #pragma once -#include -#include +#include +#include +#include #include "Common.h" #include -namespace DX11 +namespace DX11 { #define SAFE_RELEASE(x) { if (x) (x)->Release(); (x) = NULL; } @@ -24,11 +25,9 @@ namespace D3D HRESULT LoadDXGI(); HRESULT LoadD3D(); -HRESULT LoadD3DX(); HRESULT LoadD3DCompiler(); void UnloadDXGI(); void UnloadD3D(); -void UnloadD3DX(); void UnloadD3DCompiler(); D3D_FEATURE_LEVEL GetFeatureLevel(IDXGIAdapter* adapter); @@ -71,36 +70,15 @@ void SetDebugObjectName(T resource, const char* name) #endif } -} // namespace +} // namespace D3D - -// Used to not require the SDK and runtime versions to match: -// Linking with d3dx11.lib makes the most recent d3dx11_xx.dll of the -// compiler's SDK a requirement, but this backend works with DX11 runtimes -// back to August 2009 even if the backend was built with June 2010. -// Add any d3dx11 functions which you want to use here and load them in Create() -typedef HRESULT (WINAPI* D3DX11COMPILEFROMMEMORYTYPE)(LPCSTR, SIZE_T, LPCSTR, const D3D10_SHADER_MACRO*, LPD3D10INCLUDE, LPCSTR, LPCSTR, UINT, UINT, ID3DX11ThreadPump*, ID3D10Blob**, ID3D10Blob**, HRESULT*); -typedef HRESULT (WINAPI* D3DX11FILTERTEXTURETYPE)(ID3D11DeviceContext*, ID3D11Resource*, UINT, UINT); -typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEATYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCSTR); -typedef HRESULT (WINAPI* D3DX11SAVETEXTURETOFILEWTYPE)(ID3D11DeviceContext*, ID3D11Resource*, D3DX11_IMAGE_FILE_FORMAT, LPCWSTR); - -extern D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory; -extern D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture; -extern D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA; -extern D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW; - -#ifdef UNICODE -#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileW -#else -#define PD3DX11SaveTextureToFile PD3DX11SaveTextureToFileA -#endif - -typedef HRESULT (WINAPI* CREATEDXGIFACTORY)(REFIID, void**); +typedef HRESULT (WINAPI *CREATEDXGIFACTORY)(REFIID, void**); extern CREATEDXGIFACTORY PCreateDXGIFactory; -typedef HRESULT (WINAPI* D3D11CREATEDEVICE)(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, CONST D3D_FEATURE_LEVEL*, UINT, UINT, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**); +typedef HRESULT (WINAPI *D3D11CREATEDEVICE)(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, CONST D3D_FEATURE_LEVEL*, UINT, UINT, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**); extern D3D11CREATEDEVICE PD3D11CreateDevice; typedef HRESULT (WINAPI *D3DREFLECT)(LPCVOID, SIZE_T, REFIID, void**); extern D3DREFLECT PD3DReflect; +extern pD3DCompile PD3DCompile; } // namespace DX11 diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DBlob.cpp b/Source/Core/VideoBackends/D3D/Src/D3DBlob.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DBlob.cpp rename to Source/Core/VideoBackends/D3D/Src/D3DBlob.cpp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DBlob.h b/Source/Core/VideoBackends/D3D/Src/D3DBlob.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DBlob.h rename to Source/Core/VideoBackends/D3D/Src/D3DBlob.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DShader.cpp b/Source/Core/VideoBackends/D3D/Src/D3DShader.cpp similarity index 92% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DShader.cpp rename to Source/Core/VideoBackends/D3D/Src/D3DShader.cpp index 602dcf9807..51a51b7233 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/D3DShader.cpp +++ b/Source/Core/VideoBackends/D3D/Src/D3DShader.cpp @@ -37,9 +37,8 @@ bool CompileVertexShader(const char* code, unsigned int len, D3DBlob** blob) #else UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_OPTIMIZATION_LEVEL3|D3D10_SHADER_SKIP_VALIDATION; #endif - HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, NULL, NULL, "main", D3D::VertexShaderVersionString(), - flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL); - + HRESULT hr = PD3DCompile(code, len, NULL, NULL, NULL, "main", D3D::VertexShaderVersionString(), + flags, 0, &shaderBuffer, &errorBuffer); if (errorBuffer) { INFO_LOG(VIDEO, "Vertex shader compiler messages:\n%s\n", @@ -95,9 +94,9 @@ bool CompileGeometryShader(const char* code, unsigned int len, D3DBlob** blob, #else UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY|D3D10_SHADER_OPTIMIZATION_LEVEL3|D3D10_SHADER_SKIP_VALIDATION; #endif - HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, pDefines, NULL, "main", D3D::GeometryShaderVersionString(), - flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL); - + HRESULT hr = PD3DCompile(code, len, NULL, pDefines, NULL, "main", D3D::GeometryShaderVersionString(), + flags, 0, &shaderBuffer, &errorBuffer); + if (errorBuffer) { INFO_LOG(VIDEO, "Geometry shader compiler messages:\n%s\n", @@ -155,9 +154,9 @@ bool CompilePixelShader(const char* code, unsigned int len, D3DBlob** blob, #else UINT flags = D3D10_SHADER_OPTIMIZATION_LEVEL3; #endif - HRESULT hr = PD3DX11CompileFromMemory(code, len, NULL, pDefines, NULL, "main", D3D::PixelShaderVersionString(), - flags, 0, NULL, &shaderBuffer, &errorBuffer, NULL); - + HRESULT hr = PD3DCompile(code, len, NULL, pDefines, NULL, "main", D3D::PixelShaderVersionString(), + flags, 0, &shaderBuffer, &errorBuffer); + if (errorBuffer) { INFO_LOG(VIDEO, "Pixel shader compiler messages:\n%s", @@ -233,4 +232,4 @@ ID3D11PixelShader* CompileAndCreatePixelShader(const char* code, } // namespace -} // namespace DX11 \ No newline at end of file +} // namespace DX11 diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DShader.h b/Source/Core/VideoBackends/D3D/Src/D3DShader.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DShader.h rename to Source/Core/VideoBackends/D3D/Src/D3DShader.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DTexture.cpp b/Source/Core/VideoBackends/D3D/Src/D3DTexture.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DTexture.cpp rename to Source/Core/VideoBackends/D3D/Src/D3DTexture.cpp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DTexture.h b/Source/Core/VideoBackends/D3D/Src/D3DTexture.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DTexture.h rename to Source/Core/VideoBackends/D3D/Src/D3DTexture.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DUtil.cpp b/Source/Core/VideoBackends/D3D/Src/D3DUtil.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DUtil.cpp rename to Source/Core/VideoBackends/D3D/Src/D3DUtil.cpp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DUtil.h b/Source/Core/VideoBackends/D3D/Src/D3DUtil.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/D3DUtil.h rename to Source/Core/VideoBackends/D3D/Src/D3DUtil.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/FramebufferManager.cpp b/Source/Core/VideoBackends/D3D/Src/FramebufferManager.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoDX11/Src/FramebufferManager.cpp rename to Source/Core/VideoBackends/D3D/Src/FramebufferManager.cpp index 6f64cea0ec..973cf38181 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/D3D/Src/FramebufferManager.cpp @@ -70,10 +70,10 @@ FramebufferManager::FramebufferManager() D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_tex->GetRTV(), "EFB color texture render target view"); // Temporary EFB color texture - used in ReinterpretPixelData - texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, target_width, target_height, 1, 1, D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET, D3D11_USAGE_DEFAULT, 0, 1, 0); + texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, target_width, target_height, 1, 1, D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET, D3D11_USAGE_DEFAULT, 0, sample_desc.Count, sample_desc.Quality); hr = D3D::device->CreateTexture2D(&texdesc, NULL, &buf); CHECK(hr==S_OK, "create EFB color temp texture (size: %dx%d; hr=%#x)", target_width, target_height, hr); - m_efb.color_temp_tex = new D3DTexture2D(buf, (D3D11_BIND_FLAG)(D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET), DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8G8B8A8_UNORM); + m_efb.color_temp_tex = new D3DTexture2D(buf, (D3D11_BIND_FLAG)(D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET), DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8G8B8A8_UNORM, (sample_desc.Count > 1)); CHECK(m_efb.color_temp_tex!=NULL, "create EFB color temp texture (size: %dx%d)", target_width, target_height); SAFE_RELEASE(buf); D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.color_temp_tex->GetTex(), "EFB color temp texture"); @@ -196,7 +196,7 @@ void XFBSource::DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) void XFBSource::CopyEFB(float Gamma) { g_renderer->ResetAPIState(); // reset any game specific settings - + // Copy EFB data to XFB and restore render target again const D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)texWidth, (float)texHeight); @@ -211,7 +211,7 @@ void XFBSource::CopyEFB(float Gamma) D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV()); - + g_renderer->RestoreAPIState(); } diff --git a/Source/Plugins/Plugin_VideoDX11/Src/FramebufferManager.h b/Source/Core/VideoBackends/D3D/Src/FramebufferManager.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/FramebufferManager.h rename to Source/Core/VideoBackends/D3D/Src/FramebufferManager.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/GfxState.cpp b/Source/Core/VideoBackends/D3D/Src/GfxState.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/GfxState.cpp rename to Source/Core/VideoBackends/D3D/Src/GfxState.cpp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/GfxState.h b/Source/Core/VideoBackends/D3D/Src/GfxState.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/GfxState.h rename to Source/Core/VideoBackends/D3D/Src/GfxState.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Globals.h b/Source/Core/VideoBackends/D3D/Src/Globals.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/Globals.h rename to Source/Core/VideoBackends/D3D/Src/Globals.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/LineGeometryShader.cpp b/Source/Core/VideoBackends/D3D/Src/LineGeometryShader.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/LineGeometryShader.cpp rename to Source/Core/VideoBackends/D3D/Src/LineGeometryShader.cpp index 9009d39029..a68dadaabb 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/LineGeometryShader.cpp +++ b/Source/Core/VideoBackends/D3D/Src/LineGeometryShader.cpp @@ -172,12 +172,12 @@ bool LineGeometryShader::SetShader(u32 components, float lineWidth, static char buffer[16384]; ShaderCode code; code.SetBuffer(buffer); - GenerateVSOutputStructForGS(code, components, API_D3D11); + GenerateVSOutputStructForGS(code, components, API_D3D); code.Write("\n%s", LINE_GS_COMMON); std::stringstream numTexCoordsStream; numTexCoordsStream << xfregs.numTexGen.numTexGens; - + INFO_LOG(VIDEO, "Compiling line geometry shader for components 0x%.08X (num texcoords %d)", components, xfregs.numTexGen.numTexGens); diff --git a/Source/Plugins/Plugin_VideoDX11/Src/LineGeometryShader.h b/Source/Core/VideoBackends/D3D/Src/LineGeometryShader.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/LineGeometryShader.h rename to Source/Core/VideoBackends/D3D/Src/LineGeometryShader.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/NativeVertexFormat.cpp b/Source/Core/VideoBackends/D3D/Src/NativeVertexFormat.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoDX11/Src/NativeVertexFormat.cpp rename to Source/Core/VideoBackends/D3D/Src/NativeVertexFormat.cpp index 373026bcd3..4c6332dedd 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/NativeVertexFormat.cpp +++ b/Source/Core/VideoBackends/D3D/Src/NativeVertexFormat.cpp @@ -76,7 +76,7 @@ void D3DVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl) for (int i = 0; i < 3; i++) { - if (_vtx_decl.normal_offset[i] > 0) + if (_vtx_decl.normal_offset[i] > 0) { m_elems[m_num_elems].SemanticName = "NORMAL"; m_elems[m_num_elems].SemanticIndex = i; @@ -89,7 +89,7 @@ void D3DVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl) for (int i = 0; i < 2; i++) { - if (_vtx_decl.color_offset[i] > 0) + if (_vtx_decl.color_offset[i] > 0) { m_elems[m_num_elems].SemanticName = "COLOR"; m_elems[m_num_elems].SemanticIndex = i; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.cpp b/Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.cpp rename to Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.cpp index 5282c4cbb7..82e95d2bf0 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.cpp +++ b/Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.cpp @@ -31,7 +31,7 @@ namespace DX11 { - + union EFBEncodeParams { struct @@ -384,7 +384,7 @@ static const char EFB_ENCODE_PS[] = "sample[y*8+x] = SampleEFB(subBlockUL+float2(x,y));\n" "}\n" "}\n" - + "uint dw[4];\n" "for (uint i = 0; i < 4; ++i) {\n" "dw[i] = UINT_44444444_BE(\n" @@ -433,7 +433,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample2.r, sample6.r, sampleA.r, sampleE.r),\n" "255*float4(sample3.r, sample7.r, sampleB.r, sampleF.r)\n" ");\n" - + "return dw4;\n" "}\n" @@ -444,7 +444,7 @@ static const char EFB_ENCODE_PS[] = "float2 blockUL = blockCoord * float2(8,4);\n" "float2 subBlockUL = blockUL + float2(0, 2*(cacheCoord.x%2));\n" - + "float4 sample0 = SampleEFB(subBlockUL+float2(0,0));\n" "float4 sample1 = SampleEFB(subBlockUL+float2(1,0));\n" "float4 sample2 = SampleEFB(subBlockUL+float2(2,0));\n" @@ -486,7 +486,7 @@ static const char EFB_ENCODE_PS[] = "Float8ToUint4(sampleE.a), Float8ToUint4(sampleE.r),\n" "Float8ToUint4(sampleF.a), Float8ToUint4(sampleF.r)\n" ");\n" - + "return uint4(dw0, dw1, dw2, dw3);\n" "}\n" @@ -513,7 +513,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample1.a, sample3.a, sample5.a, sample7.a),\n" "255*float4(sample1.r, sample3.r, sample5.r, sample7.r)\n" ");\n" - + "return dw4;\n" "}\n" @@ -532,7 +532,7 @@ static const char EFB_ENCODE_PS[] = "float4 sample5 = SampleEFB(subBlockUL+float2(1,1));\n" "float4 sample6 = SampleEFB(subBlockUL+float2(2,1));\n" "float4 sample7 = SampleEFB(subBlockUL+float2(3,1));\n" - + "uint dw0 = UINT_1616(EncodeRGB565(sample0), EncodeRGB565(sample1));\n" "uint dw1 = UINT_1616(EncodeRGB565(sample2), EncodeRGB565(sample3));\n" "uint dw2 = UINT_1616(EncodeRGB565(sample4), EncodeRGB565(sample5));\n" @@ -556,12 +556,12 @@ static const char EFB_ENCODE_PS[] = "float4 sample5 = SampleEFB(subBlockUL+float2(1,1));\n" "float4 sample6 = SampleEFB(subBlockUL+float2(2,1));\n" "float4 sample7 = SampleEFB(subBlockUL+float2(3,1));\n" - + "uint dw0 = UINT_1616(EncodeRGB5A3(sample0), EncodeRGB5A3(sample1));\n" "uint dw1 = UINT_1616(EncodeRGB5A3(sample2), EncodeRGB5A3(sample3));\n" "uint dw2 = UINT_1616(EncodeRGB5A3(sample4), EncodeRGB5A3(sample5));\n" "uint dw3 = UINT_1616(EncodeRGB5A3(sample6), EncodeRGB5A3(sample7));\n" - + "return Swap4_32(uint4(dw0, dw1, dw2, dw3));\n" "}\n" @@ -602,7 +602,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample1.b, sample3.b, sample5.b, sample7.b)\n" ");\n" "}\n" - + "return dw4;\n" "}\n" @@ -612,7 +612,7 @@ static const char EFB_ENCODE_PS[] = "float2 blockUL = blockCoord * float2(8,4);\n" "float2 subBlockUL = blockUL + float2(0, 2*(cacheCoord.x%2));\n" - + "float4 sample0 = SampleEFB(subBlockUL+float2(0,0));\n" "float4 sample1 = SampleEFB(subBlockUL+float2(1,0));\n" "float4 sample2 = SampleEFB(subBlockUL+float2(2,0));\n" @@ -636,7 +636,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample2.a, sample6.a, sampleA.a, sampleE.a),\n" "255*float4(sample3.a, sample7.a, sampleB.a, sampleF.a)\n" ");\n" - + "return dw4;\n" "}\n" @@ -670,7 +670,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample2.r, sample6.r, sampleA.r, sampleE.r),\n" "255*float4(sample3.r, sample7.r, sampleB.r, sampleF.r)\n" ");\n" - + "return dw4;\n" "}\n" @@ -705,7 +705,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample2.g, sample6.g, sampleA.g, sampleE.g),\n" "255*float4(sample3.g, sample7.g, sampleB.g, sampleF.g)\n" ");\n" - + "return dw4;\n" "}\n" @@ -715,7 +715,7 @@ static const char EFB_ENCODE_PS[] = "float2 blockUL = blockCoord * float2(8,4);\n" "float2 subBlockUL = blockUL + float2(0, 2*(cacheCoord.x%2));\n" - + "float4 sample0 = SampleEFB(subBlockUL+float2(0,0));\n" "float4 sample1 = SampleEFB(subBlockUL+float2(1,0));\n" "float4 sample2 = SampleEFB(subBlockUL+float2(2,0));\n" @@ -739,7 +739,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample2.b, sample6.b, sampleA.b, sampleE.b),\n" "255*float4(sample3.b, sample7.b, sampleB.b, sampleF.b)\n" ");\n" - + "return dw4;\n" "}\n" @@ -765,7 +765,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample1.g, sample3.g, sample5.g, sample7.g),\n" "255*float4(sample1.r, sample3.r, sample5.r, sample7.r)\n" ");\n" - + "return dw4;\n" "}\n" @@ -792,7 +792,7 @@ static const char EFB_ENCODE_PS[] = "255*float4(sample1.b, sample3.b, sample5.b, sample7.b),\n" "255*float4(sample1.g, sample3.g, sample5.g, sample7.g)\n" ");\n" - + "return dw4;\n" "}\n" @@ -902,7 +902,7 @@ void PSTextureEncoder::Init() D3D::SetDebugObjectName(m_outRTV, "efb encoder output rtv"); // Create output staging buffer - + t2dd.Usage = D3D11_USAGE_STAGING; t2dd.BindFlags = 0; t2dd.CPUAccessFlags = D3D11_CPU_ACCESS_READ; @@ -998,7 +998,7 @@ void PSTextureEncoder::Init() void PSTextureEncoder::Shutdown() { m_ready = false; - + for (size_t i = 0; i < 4; ++i) SAFE_RELEASE(m_fetchClass[i]); for (size_t i = 0; i < 2; ++i) @@ -1008,7 +1008,7 @@ void PSTextureEncoder::Shutdown() for (size_t i = 0; i < 16; ++i) SAFE_RELEASE(m_generatorClass[i]); m_linkageArray.clear(); - + SAFE_RELEASE(m_classLinkage); SAFE_RELEASE(m_dynamicShader); @@ -1073,13 +1073,13 @@ size_t PSTextureEncoder::Encode(u8* dst, unsigned int dstFormat, _assert_msg_(VIDEO, totalCacheLines*32 <= MAX_BYTES_PER_ENCODE, "total encode size sanity check"); size_t encodeSize = 0; - + // Reset API g_renderer->ResetAPIState(); // Set up all the state for EFB encoding - + #ifdef USE_DYNAMIC_MODE if (SetDynamicShader(dstFormat, srcFormat, isIntensity, scaleByHalf)) #else @@ -1092,7 +1092,7 @@ size_t PSTextureEncoder::Encode(u8* dst, unsigned int dstFormat, D3D::stateman->PushDepthState(m_efbEncodeDepthState); D3D::stateman->PushRasterizerState(m_efbEncodeRastState); D3D::stateman->Apply(); - + D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, FLOAT(cacheLinesPerRow*2), FLOAT(numBlocksY)); D3D::context->RSSetViewports(1, &vp); @@ -1101,14 +1101,14 @@ size_t PSTextureEncoder::Encode(u8* dst, unsigned int dstFormat, UINT stride = sizeof(QuadVertex); UINT offset = 0; D3D::context->IASetVertexBuffers(0, 1, &m_quad, &stride, &offset); - + EFBRectangle fullSrcRect; fullSrcRect.left = 0; fullSrcRect.top = 0; fullSrcRect.right = EFB_WIDTH; fullSrcRect.bottom = EFB_HEIGHT; TargetRectangle targetRect = g_renderer->ConvertEFBRectangle(fullSrcRect); - + EFBEncodeParams params = { 0 }; params.NumHalfCacheLinesX = FLOAT(cacheLinesPerRow*2); params.NumBlocksY = FLOAT(numBlocksY); @@ -1121,7 +1121,7 @@ size_t PSTextureEncoder::Encode(u8* dst, unsigned int dstFormat, D3D::context->UpdateSubresource(m_encodeParams, 0, NULL, ¶ms, 0, 0); D3D::context->VSSetConstantBuffers(0, 1, &m_encodeParams); - + D3D::context->OMSetRenderTargets(1, &m_outRTV, NULL); ID3D11ShaderResourceView* pEFB = (srcFormat == PIXELFMT_Z24) ? @@ -1145,17 +1145,17 @@ size_t PSTextureEncoder::Encode(u8* dst, unsigned int dstFormat, D3D::context->CopySubresourceRegion(m_outStage, 0, 0, 0, 0, m_out, 0, &srcBox); // Clean up state - + IUnknown* nullDummy = NULL; D3D::context->PSSetSamplers(0, 1, (ID3D11SamplerState**)&nullDummy); D3D::context->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&nullDummy); D3D::context->PSSetConstantBuffers(0, 1, (ID3D11Buffer**)&nullDummy); - + D3D::context->OMSetRenderTargets(0, NULL, NULL); D3D::context->VSSetConstantBuffers(0, 1, (ID3D11Buffer**)&nullDummy); - + D3D::stateman->PopRasterizerState(); D3D::stateman->PopDepthState(); D3D::stateman->PopBlendState(); @@ -1312,7 +1312,7 @@ bool PSTextureEncoder::InitDynamicMode() hr = D3D::device->CreatePixelShader(bytecode->Data(), bytecode->Size(), m_classLinkage, &m_dynamicShader); CHECK(SUCCEEDED(hr), "create efb encode pixel shader"); D3D::SetDebugObjectName(m_dynamicShader, "efb encoder pixel shader"); - + // Use D3DReflect ID3D11ShaderReflection* reflect = NULL; @@ -1438,7 +1438,7 @@ bool PSTextureEncoder::SetDynamicShader(unsigned int dstFormat, m_linkageArray[m_intensitySlot] = m_intensityClass[intensityNum]; if (m_generatorSlot != UINT(-1)) m_linkageArray[m_generatorSlot] = m_generatorClass[generatorNum]; - + D3D::context->PSSetShader(m_dynamicShader, m_linkageArray.empty() ? NULL : &m_linkageArray[0], (UINT)m_linkageArray.size()); diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.h b/Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.h similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.h rename to Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.h index 14cdfa8bae..ff33e22c0a 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PSTextureEncoder.h +++ b/Source/Core/VideoBackends/D3D/Src/PSTextureEncoder.h @@ -37,7 +37,7 @@ public: bool scaleByHalf); private: - + bool m_ready; ID3D11Texture2D* m_out; @@ -73,7 +73,7 @@ private: // Stuff only used for dynamic-linking mode (SM5.0+, available as soon as // Microsoft fixes their bloody HLSL compiler) - + bool InitDynamicMode(); bool SetDynamicShader(unsigned int dstFormat, unsigned int srcFormat, bool isIntensity, bool scaleByHalf); diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/Src/PerfQuery.cpp similarity index 79% rename from Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp rename to Source/Core/VideoBackends/D3D/Src/PerfQuery.cpp index 3ba5e098ef..b2c77a876e 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/Src/PerfQuery.cpp @@ -9,7 +9,7 @@ PerfQuery::PerfQuery() : m_query_read_pos() , m_query_count() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { D3D11_QUERY_DESC qdesc = CD3D11_QUERY_DESC(D3D11_QUERY_OCCLUSION, 0); D3D::device->CreateQuery(&qdesc, &m_query_buffer[i].query); @@ -19,7 +19,7 @@ PerfQuery::PerfQuery() PerfQuery::~PerfQuery() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { // TODO: EndQuery? m_query_buffer[i].query->Release(); @@ -32,10 +32,10 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) return; // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) + if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); - if (ARRAYSIZE(m_query_buffer) == m_query_count) + if (ArraySize(m_query_buffer) == m_query_count) { // TODO FlushOne(); @@ -45,7 +45,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; D3D::context->Begin(entry.query); entry.query_type = type; @@ -62,7 +62,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ARRAYSIZE(m_query_buffer)-1) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ArraySize(m_query_buffer)-1) % ArraySize(m_query_buffer)]; D3D::context->End(entry.query); } } @@ -70,7 +70,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) void PerfQuery::ResetQuery() { m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); + std::fill_n(m_results, ArraySize(m_results), 0); } u32 PerfQuery::GetQueryResult(PerfQueryType type) @@ -116,9 +116,9 @@ void PerfQuery::FlushOne() } // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); + m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } @@ -147,9 +147,9 @@ void PerfQuery::WeakFlush() if (hr == S_OK) { // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); + m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } else diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.h b/Source/Core/VideoBackends/D3D/Src/PerfQuery.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.h rename to Source/Core/VideoBackends/D3D/Src/PerfQuery.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/Src/PixelShaderCache.cpp similarity index 86% rename from Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.cpp rename to Source/Core/VideoBackends/D3D/Src/PixelShaderCache.cpp index 819fd46974..d8716c85f2 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/Src/PixelShaderCache.cpp @@ -14,15 +14,12 @@ #include "Globals.h" #include "PixelShaderGen.h" #include "PixelShaderCache.h" +#include "PixelShaderManager.h" #include "ConfigManager.h" extern int frameCount; -// See comment near the bottom of this file. -float psconstants[C_PENVCONST_END*4]; -bool pscbufchanged = true; - namespace DX11 { @@ -83,7 +80,7 @@ const char color_matrix_program_code[] = { "sampler samp0 : register(s0);\n" "Texture2D Tex0 : register(t0);\n" "uniform float4 cColMatrix[7] : register(c0);\n" - "void main(\n" + "void main(\n" "out float4 ocol0 : SV_Target,\n" "in float4 pos : SV_Position,\n" " in float2 uv0 : TEXCOORD0){\n" @@ -97,7 +94,7 @@ const char color_matrix_program_code_msaa[] = { "sampler samp0 : register(s0);\n" "Texture2DMS Tex0 : register(t0);\n" "uniform float4 cColMatrix[7] : register(c0);\n" - "void main(\n" + "void main(\n" "out float4 ocol0 : SV_Target,\n" "in float4 pos : SV_Position,\n" " in float2 uv0 : TEXCOORD0){\n" @@ -247,7 +244,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGBA6ToRGB8(bool multisampled) { // create MSAA shader for current AA mode char buf[1024]; - const int l = sprintf_s(buf, 1024, reint_rgba6_to_rgb8_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode)); + const int l = sprintf_s(buf, 1024, reint_rgba6_to_rgb8_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); s_rgba6_to_rgb8[1] = D3D::CompileAndCreatePixelShader(buf, l); @@ -273,7 +270,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGB8ToRGBA6(bool multisampled) { // create MSAA shader for current AA mode char buf[1024]; - const int l = sprintf_s(buf, 1024, reint_rgb8_to_rgba6_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode)); + const int l = sprintf_s(buf, 1024, reint_rgb8_to_rgba6_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); s_rgb8_to_rgba6[1] = D3D::CompileAndCreatePixelShader(buf, l); @@ -291,7 +288,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram(bool multisampled) { // create MSAA shader for current AA mode char buf[1024]; - int l = sprintf_s(buf, 1024, color_copy_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode)); + int l = sprintf_s(buf, 1024, color_copy_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); s_ColorCopyProgram[1] = D3D::CompileAndCreatePixelShader(buf, l); CHECK(s_ColorCopyProgram[1]!=NULL, "Create color copy MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ColorCopyProgram[1], "color copy MSAA pixel shader"); @@ -307,7 +304,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram(bool multisampled) { // create MSAA shader for current AA mode char buf[1024]; - int l = sprintf_s(buf, 1024, color_matrix_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode)); + int l = sprintf_s(buf, 1024, color_matrix_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); s_ColorMatrixProgram[1] = D3D::CompileAndCreatePixelShader(buf, l); CHECK(s_ColorMatrixProgram[1]!=NULL, "Create color matrix MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ColorMatrixProgram[1], "color matrix MSAA pixel shader"); @@ -323,7 +320,7 @@ ID3D11PixelShader* PixelShaderCache::GetDepthMatrixProgram(bool multisampled) { // create MSAA shader for current AA mode char buf[1024]; - int l = sprintf_s(buf, 1024, depth_matrix_program_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode)); + int l = sprintf_s(buf, 1024, depth_matrix_program_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); s_DepthMatrixProgram[1] = D3D::CompileAndCreatePixelShader(buf, l); CHECK(s_DepthMatrixProgram[1]!=NULL, "Create depth matrix MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_DepthMatrixProgram[1], "depth matrix MSAA pixel shader"); @@ -339,15 +336,15 @@ ID3D11PixelShader* PixelShaderCache::GetClearProgram() ID3D11Buffer* &PixelShaderCache::GetConstantBuffer() { // TODO: divide the global variables of the generated shaders into about 5 constant buffers to speed this up - if (pscbufchanged) + if (PixelShaderManager::dirty) { D3D11_MAPPED_SUBRESOURCE map; D3D::context->Map(pscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - memcpy(map.pData, psconstants, sizeof(psconstants)); + memcpy(map.pData, &PixelShaderManager::constants, sizeof(PixelShaderConstants)); D3D::context->Unmap(pscbuf, 0); - pscbufchanged = false; - - ADDSTAT(stats.thisFrame.bytesUniformStreamed, sizeof(psconstants)); + PixelShaderManager::dirty = false; + + ADDSTAT(stats.thisFrame.bytesUniformStreamed, sizeof(PixelShaderConstants)); } return pscbuf; } @@ -364,14 +361,14 @@ public: void PixelShaderCache::Init() { - unsigned int cbsize = ((sizeof(psconstants))&(~0xf))+0x10; // must be a multiple of 16 + unsigned int cbsize = ((sizeof(PixelShaderConstants))&(~0xf))+0x10; // must be a multiple of 16 D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(cbsize, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); D3D::device->CreateBuffer(&cbdesc, NULL, &pscbuf); CHECK(pscbuf!=NULL, "Create pixel shader constant buffer"); D3D::SetDebugObjectName((ID3D11DeviceChild*)pscbuf, "pixel shader constant buffer used to emulate the GX pipeline"); // used when drawing clear quads - s_ClearProgram = D3D::CompileAndCreatePixelShader(clear_program_code, sizeof(clear_program_code)); + s_ClearProgram = D3D::CompileAndCreatePixelShader(clear_program_code, sizeof(clear_program_code)); CHECK(s_ClearProgram!=NULL, "Create clear pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ClearProgram, "clear pixel shader"); @@ -444,7 +441,7 @@ void PixelShaderCache::Shutdown() SAFE_RELEASE(s_rgba6_to_rgb8[i]); SAFE_RELEASE(s_rgb8_to_rgba6[i]); } - + Clear(); g_ps_disk_cache.Sync(); g_ps_disk_cache.Close(); @@ -453,11 +450,11 @@ void PixelShaderCache::Shutdown() bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components) { PixelShaderUid uid; - GetPixelShaderUid(uid, dstAlphaMode, API_D3D11, components); + GetPixelShaderUid(uid, dstAlphaMode, API_D3D, components); if (g_ActiveConfig.bEnableShaderDebugging) { PixelShaderCode code; - GeneratePixelShaderCode(code, dstAlphaMode, API_D3D11, components); + GeneratePixelShaderCode(code, dstAlphaMode, API_D3D, components); pixel_uid_checker.AddToIndexAndCheck(code, uid, "Pixel", "p"); } @@ -480,14 +477,14 @@ bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components) { const PSCacheEntry &entry = iter->second; last_entry = &entry; - + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE,true); return (entry.shader != NULL); } // Need to compile a new shader PixelShaderCode code; - GeneratePixelShaderCode(code, dstAlphaMode, API_D3D11, components); + GeneratePixelShaderCode(code, dstAlphaMode, API_D3D, components); D3DBlob* pbytecode; if (!D3D::CompilePixelShader(code.GetBuffer(), (unsigned int)strlen(code.GetBuffer()), &pbytecode)) @@ -536,50 +533,4 @@ bool PixelShaderCache::InsertByteCode(const PixelShaderUid &uid, const void* byt return true; } -// These are "callbacks" from VideoCommon and thus must be outside namespace DX11. -// This will have to be changed when we merge. - -// HACK to avoid some invasive VideoCommon changes -// these values are hardcoded, they depend on internal D3DCompile behavior; TODO: Solve this with D3DReflect or something -// offset given in floats, table index is float4 -static const unsigned int ps_constant_offset_table[] = { - 0, 4, 8, 12, // C_COLORS, 16 - 16, 20, 24, 28, // C_KCOLORS, 16 - 32, // C_ALPHA, 4 - 36, 40, 44, 48, 52, 56, 60, 64, // C_TEXDIMS, 32 - 68, 72, // C_ZBIAS, 8 - 76, 80, // C_INDTEXSCALE, 8 - 84, 88, 92, 96, 100, 104, // C_INDTEXMTX, 24 - 108, 112, 116, // C_FOG, 12 - 120, 124, 128, 132, 136, // C_PLIGHTS0, 20 - 140, 144, 148, 152, 156, // C_PLIGHTS1, 20 - 160, 164, 168, 172, 176, // C_PLIGHTS2, 20 - 180, 184, 188, 192, 196, // C_PLIGHTS3, 20 - 200, 204, 208, 212, 216, // C_PLIGHTS4, 20 - 220, 224, 228, 232, 236, // C_PLIGHTS5, 20 - 240, 244, 248, 252, 256, // C_PLIGHTS6, 20 - 260, 264, 268, 272, 276, // C_PLIGHTS7, 20 - 280, 284, 288, 292 // C_PMATERIALS, 16 -}; -void Renderer::SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - psconstants[ps_constant_offset_table[const_number] ] = f1; - psconstants[ps_constant_offset_table[const_number]+1] = f2; - psconstants[ps_constant_offset_table[const_number]+2] = f3; - psconstants[ps_constant_offset_table[const_number]+3] = f4; - pscbufchanged = true; -} - -void Renderer::SetPSConstant4fv(unsigned int const_number, const float* f) -{ - memcpy(&psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4); - pscbufchanged = true; -} - -void Renderer::SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float* f) -{ - memcpy(&psconstants[ps_constant_offset_table[const_number]], f, sizeof(float)*4*count); - pscbufchanged = true; -} - } // DX11 diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.h b/Source/Core/VideoBackends/D3D/Src/PixelShaderCache.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.h rename to Source/Core/VideoBackends/D3D/Src/PixelShaderCache.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PointGeometryShader.cpp b/Source/Core/VideoBackends/D3D/Src/PointGeometryShader.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/PointGeometryShader.cpp rename to Source/Core/VideoBackends/D3D/Src/PointGeometryShader.cpp index 9d6e02104e..30e4434521 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PointGeometryShader.cpp +++ b/Source/Core/VideoBackends/D3D/Src/PointGeometryShader.cpp @@ -166,9 +166,9 @@ bool PointGeometryShader::SetShader(u32 components, float pointSize, static char buffer[16384]; ShaderCode code; code.SetBuffer(buffer); - GenerateVSOutputStructForGS(code, components, API_D3D11); + GenerateVSOutputStructForGS(code, components, API_D3D); code.Write("\n%s", POINT_GS_COMMON); - + std::stringstream numTexCoordsStream; numTexCoordsStream << xfregs.numTexGen.numTexGens; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PointGeometryShader.h b/Source/Core/VideoBackends/D3D/Src/PointGeometryShader.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/PointGeometryShader.h rename to Source/Core/VideoBackends/D3D/Src/PointGeometryShader.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp b/Source/Core/VideoBackends/D3D/Src/Render.cpp similarity index 91% rename from Source/Plugins/Plugin_VideoDX11/Src/Render.cpp rename to Source/Core/VideoBackends/D3D/Src/Render.cpp index 761563264d..d2938e6600 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Src/Render.cpp @@ -2,7 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include +#include +#include #include "Timer.h" @@ -33,6 +34,7 @@ #include "FPSCounter.h" #include "ConfigManager.h" #include +#include "ImageWrite.h" namespace DX11 { @@ -168,9 +170,9 @@ void TeardownDeviceObjects() s_television.Shutdown(); } -void CreateScreenshotTexture() +void CreateScreenshotTexture(const TargetRectangle& rc) { - D3D11_TEXTURE2D_DESC scrtex_desc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, D3D::GetBackBufferWidth(), D3D::GetBackBufferHeight(), 1, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE); + D3D11_TEXTURE2D_DESC scrtex_desc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, rc.GetWidth(), rc.GetHeight(), 1, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE); HRESULT hr = D3D::device->CreateTexture2D(&scrtex_desc, NULL, &s_screenshot_texture); CHECK(hr==S_OK, "Create screenshot staging texture"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_screenshot_texture, "staging screenshot texture"); @@ -293,7 +295,7 @@ bool Renderer::CheckForResize() // Sanity check if ((client_width != Renderer::GetBackbufferWidth() || - client_height != Renderer::GetBackbufferHeight()) && + client_height != Renderer::GetBackbufferHeight()) && client_width >= 4 && client_height >= 4) { return true; @@ -449,7 +451,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) else if (bpmem.zcontrol.pixel_format == PIXELFMT_RGB565_Z16) { ret = RGBA8ToRGB565ToRGBA8(ret); - } + } if(bpmem.zcontrol.pixel_format != PIXELFMT_RGBA6_Z24) { ret |= 0xFF000000; @@ -477,30 +479,9 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) } } -// Viewport correction: -// Say you want a viewport at (ix, iy) with size (iw, ih), -// but your viewport must be clamped at (ax, ay) with size (aw, ah). -// Just multiply the projection matrix with the following to get the same -// effect: -// [ (iw/aw) 0 0 ((iw - 2*(ax-ix)) / aw - 1) ] -// [ 0 (ih/ah) 0 ((-ih + 2*(ay-iy)) / ah + 1) ] -// [ 0 0 1 0 ] -// [ 0 0 0 1 ] -static void ViewportCorrectionMatrix(Matrix44& result, - float ix, float iy, float iw, float ih, // Intended viewport (x, y, width, height) - float ax, float ay, float aw, float ah) // Actual viewport (x, y, width, height) -{ - Matrix44::LoadIdentity(result); - if (aw == 0.f || ah == 0.f) - return; - result.data[4*0+0] = iw / aw; - result.data[4*0+3] = (iw - 2.f * (ax - ix)) / aw - 1.f; - result.data[4*1+1] = ih / ah; - result.data[4*1+3] = (-ih + 2.f * (ay - iy)) / ah + 1.f; -} // Called from VertexShaderManager -void Renderer::UpdateViewport(Matrix44& vpCorrection) +void Renderer::UpdateViewport() { // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) // [0] = width/2 @@ -513,50 +494,30 @@ void Renderer::UpdateViewport(Matrix44& vpCorrection) int scissorXOff = bpmem.scissorOffset.x * 2; int scissorYOff = bpmem.scissorOffset.y * 2; - // TODO: ceil, floor or just cast to int? - // TODO: Directly use the floats instead of rounding them? - int intendedX = Renderer::EFBToScaledX((int)ceil(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff)); - int intendedY = Renderer::EFBToScaledY((int)ceil(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff)); - int intendedWd = Renderer::EFBToScaledX((int)ceil(2.0f * xfregs.viewport.wd)); - int intendedHt = Renderer::EFBToScaledY((int)ceil(-2.0f * xfregs.viewport.ht)); - if (intendedWd < 0) + float X = Renderer::EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff); + float Y = Renderer::EFBToScaledYf(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff); + float Wd = Renderer::EFBToScaledXf(2.0f * xfregs.viewport.wd); + float Ht = Renderer::EFBToScaledYf(-2.0f * xfregs.viewport.ht); + if (Wd < 0.0f) { - intendedX += intendedWd; - intendedWd = -intendedWd; + X += Wd; + Wd = -Wd; } - if (intendedHt < 0) + if (Ht < 0.0f) { - intendedY += intendedHt; - intendedHt = -intendedHt; + Y += Ht; + Ht = -Ht; } // In D3D, the viewport rectangle must fit within the render target. - int X = intendedX; - if (X < 0) - X = 0; - - int Y = intendedY; - if (Y < 0) - Y = 0; - - int Wd = intendedWd; - if (X + Wd > GetTargetWidth()) - Wd = GetTargetWidth() - X; - int Ht = intendedHt; - if (Y + Ht > GetTargetHeight()) - Ht = GetTargetHeight() - Y; - - // If GX viewport is off the render target, we must clamp our viewport - // within the bounds. Use the correction matrix to compensate. - ViewportCorrectionMatrix(vpCorrection, - (float)intendedX, (float)intendedY, - (float)intendedWd, (float)intendedHt, - (float)X, (float)Y, - (float)Wd, (float)Ht); + X = (X >= 0.f) ? X : 0.f; + Y = (Y >= 0.f) ? Y : 0.f; + Wd = (X + Wd <= GetTargetWidth()) ? Wd : (GetTargetWidth() - X); + Ht = (Y + Ht <= GetTargetHeight()) ? Ht : (GetTargetHeight() - Y); // Some games set invalid values for z-min and z-max so fix them to the max and min allowed and let the shaders do this work - D3D11_VIEWPORT vp = CD3D11_VIEWPORT((float)X, (float)Y, - (float)Wd, (float)Ht, + D3D11_VIEWPORT vp = CD3D11_VIEWPORT(X, Y, + Wd, Ht, 0.f, // (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f; 1.f); // xfregs.viewport.farZ / 16777216.0f; D3D::context->RSSetViewports(1, &vp); @@ -578,7 +539,7 @@ void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaE // Update the view port for clearing the picture TargetRectangle targetRc = Renderer::ConvertEFBRectangle(rc); - D3D11_VIEWPORT vp = CD3D11_VIEWPORT((float)targetRc.left, (float)targetRc.top, (float)targetRc.GetWidth(), (float)targetRc.GetHeight(), 0.f, 1.f); + D3D11_VIEWPORT vp = CD3D11_VIEWPORT((float)targetRc.left, (float)targetRc.top, (float)targetRc.GetWidth(), (float)targetRc.GetHeight(), 0.f, 1.f); D3D::context->RSSetViewports(1, &vp); // Color is passed in bgra mode so we need to convert it to rgba @@ -721,32 +682,34 @@ void Renderer::SetBlendMode(bool forceUpdate) } } -bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle &rc) +bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle& rc) { if (!s_screenshot_texture) - CreateScreenshotTexture(); + CreateScreenshotTexture(rc); // copy back buffer to system memory - D3D::context->CopyResource(s_screenshot_texture, (ID3D11Resource*)D3D::GetBackBuffer()->GetTex()); + D3D11_BOX box = CD3D11_BOX(rc.left, rc.top, 0, rc.right, rc.bottom, 1); + D3D::context->CopySubresourceRegion(s_screenshot_texture, 0, 0, 0, 0, (ID3D11Resource*)D3D::GetBackBuffer()->GetTex(), 0, &box); - // D3DX11SaveTextureToFileA doesn't allow us to ignore the alpha channel, so we need to strip it out ourselves D3D11_MAPPED_SUBRESOURCE map; D3D::context->Map(s_screenshot_texture, 0, D3D11_MAP_READ_WRITE, 0, &map); - for (unsigned int y = 0; y < D3D::GetBackBufferHeight(); ++y) - { - u8* ptr = (u8*)map.pData + y * map.RowPitch + 3; - for (unsigned int x = 0; x < D3D::GetBackBufferWidth(); ++x) - { - *ptr = 0xFF; - ptr += 4; - } - } + + bool saved_png = TextureToPng((u8*)map.pData, map.RowPitch, filename, rc.GetWidth(), rc.GetHeight(), false); + D3D::context->Unmap(s_screenshot_texture, 0); - // ready to be saved - HRESULT hr = PD3DX11SaveTextureToFileA(D3D::context, s_screenshot_texture, D3DX11_IFF_PNG, filename.c_str()); - return SUCCEEDED(hr); + if (saved_png) + { + OSD::AddMessage(StringFromFormat("Saved %i x %i %s", rc.GetWidth(), + rc.GetHeight(), filename.c_str())); + } + else + { + OSD::AddMessage(StringFromFormat("Error saving %s", filename.c_str())); + } + + return saved_png; } void formatBufferDump(const u8* in, u8* out, int w, int h, int p) @@ -766,7 +729,7 @@ void formatBufferDump(const u8* in, u8* out, int w, int h, int p) } // This function has the final picture. We adjust the aspect ratio here. -void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) +void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) { if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight) { @@ -777,7 +740,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons return; } - if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2; u32 xfbCount = 0; const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount); if ((!xfbSourceList || xfbCount == 0) && g_ActiveConfig.bUseXFB && !g_ActiveConfig.bUseRealXFB) @@ -833,7 +795,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons { xfbSource = xfbSourceList[i]; MathUtil::Rectangle sourceRc; - + sourceRc.left = 0; sourceRc.top = 0; sourceRc.right = (float)xfbSource->texWidth; @@ -897,9 +859,10 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons static int s_recordHeight; if (!s_screenshot_texture) - CreateScreenshotTexture(); + CreateScreenshotTexture(GetTargetRectangle()); - D3D::context->CopyResource(s_screenshot_texture, (ID3D11Resource*)D3D::GetBackBuffer()->GetTex()); + D3D11_BOX box = CD3D11_BOX(GetTargetRectangle().left, GetTargetRectangle().top, 0, GetTargetRectangle().right, GetTargetRectangle().bottom, 1); + D3D::context->CopySubresourceRegion(s_screenshot_texture, 0, 0, 0, 0, (ID3D11Resource*)D3D::GetBackBuffer()->GetTex(), 0, &box); if (!bLastFrameDumped) { s_recordWidth = GetTargetRectangle().GetWidth(); @@ -928,9 +891,8 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons w = s_recordWidth; h = s_recordHeight; } - auto source_ptr = (const u8*)map.pData + GetTargetRectangle().left*4 + GetTargetRectangle().top*map.RowPitch; - formatBufferDump(source_ptr, &frame_data[0], s_recordWidth, s_recordHeight, map.RowPitch); - AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight); + formatBufferDump((u8*)map.pData, &frame_data[0], s_recordWidth, s_recordHeight, map.RowPitch); + AVIDump::AddFrame(&frame_data[0], GetTargetRectangle().GetWidth(), GetTargetRectangle().GetHeight()); D3D::context->Unmap(s_screenshot_texture, 0); } bLastFrameDumped = true; @@ -960,7 +922,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons if (SConfig::GetInstance().m_ShowLag) { char lag[10]; - StringCchPrintfA(lag, 10, "Lag: %llu\n", Movie::g_currentLagCount); + StringCchPrintfA(lag, 10, "Lag: %" PRIu64 "\n", Movie::g_currentLagCount); D3D::font.DrawTextScaled(0, 18, 20, 0.0f, 0xFF00FFFF, lag); } @@ -1058,10 +1020,10 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons } // begin next frame - Renderer::RestoreAPIState(); + RestoreAPIState(); D3D::BeginFrame(); D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV()); - VertexShaderManager::SetViewportChanged(); + UpdateViewport(); Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); XFBWrited = false; @@ -1081,7 +1043,7 @@ void Renderer::RestoreAPIState() D3D::stateman->PopBlendState(); D3D::stateman->PopDepthState(); D3D::stateman->PopRasterizerState(); - VertexShaderManager::SetViewportChanged(); + UpdateViewport(); BPFunctions::SetScissor(); } @@ -1291,7 +1253,7 @@ void Renderer::SetLogicOpMode() D3D11_BLEND_INV_DEST_COLOR,//10 D3D11_BLEND_ONE,//11 D3D11_BLEND_INV_SRC_COLOR,//12 - D3D11_BLEND_INV_SRC_COLOR,//13 + D3D11_BLEND_INV_SRC_COLOR,//13 D3D11_BLEND_INV_DEST_COLOR,//14 D3D11_BLEND_ONE//15 }; @@ -1310,7 +1272,7 @@ void Renderer::SetLogicOpMode() D3D11_BLEND_INV_DEST_COLOR,//10 D3D11_BLEND_INV_DEST_COLOR,//11 D3D11_BLEND_INV_SRC_COLOR,//12 - D3D11_BLEND_ONE,//13 + D3D11_BLEND_ONE,//13 D3D11_BLEND_INV_SRC_COLOR,//14 D3D11_BLEND_ONE//15 }; @@ -1361,7 +1323,7 @@ void Renderer::SetSamplerState(int stage, int texindex) const FourTexUnits &tex = bpmem.tex[texindex]; const TexMode0 &tm0 = tex.texMode0[stage]; const TexMode1 &tm1 = tex.texMode1[stage]; - + unsigned int mip = d3dMipFilters[tm0.min_filter & 3]; if (texindex) stage += 4; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Render.h b/Source/Core/VideoBackends/D3D/Src/Render.h similarity index 61% rename from Source/Plugins/Plugin_VideoDX11/Src/Render.h rename to Source/Core/VideoBackends/D3D/Src/Render.h index 8f6c78fae1..12e5b595d3 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/Render.h +++ b/Source/Core/VideoBackends/D3D/Src/Render.h @@ -40,26 +40,17 @@ public: TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc); - void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); + void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z); void ReinterpretPixelData(unsigned int convtype); - void UpdateViewport(Matrix44& vpCorrection); + void UpdateViewport(); bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); static bool CheckForResize(); - - void SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetPSConstant4fv(unsigned int const_number, const float *f); - void SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f); - - void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetVSConstant4fv(unsigned int const_number, const float *f); - void SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f); - void SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f); }; } diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Television.cpp b/Source/Core/VideoBackends/D3D/Src/Television.cpp similarity index 73% rename from Source/Plugins/Plugin_VideoDX11/Src/Television.cpp rename to Source/Core/VideoBackends/D3D/Src/Television.cpp index e1feec595b..029ba9ce9f 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/Television.cpp +++ b/Source/Core/VideoBackends/D3D/Src/Television.cpp @@ -10,6 +10,7 @@ #include "D3DUtil.h" #include "VertexShaderCache.h" #include "HW/Memmap.h" +#include namespace DX11 { @@ -67,10 +68,22 @@ void Television::Init() // Create YUYV texture for real XFB mode + + // Initialize the texture with YCbCr black + // + // Some games use narrower XFB widths (Nintendo titles are fond of 608), + // so the sampler's BorderColor won't cover the right side + // (see sampler state below) + const unsigned int MAX_XFB_SIZE = 2*(MAX_XFB_WIDTH) * MAX_XFB_HEIGHT; + std::vector fill(MAX_XFB_SIZE); + for (size_t i = 0; i < MAX_XFB_SIZE / sizeof(u32); ++i) + reinterpret_cast(fill.data())[i] = 0x80108010; + D3D11_SUBRESOURCE_DATA srd = { fill.data(), 2*(MAX_XFB_WIDTH), 0 }; + // This texture format is designed for YUYV data. D3D11_TEXTURE2D_DESC t2dd = CD3D11_TEXTURE2D_DESC( DXGI_FORMAT_G8R8_G8B8_UNORM, MAX_XFB_WIDTH, MAX_XFB_HEIGHT, 1, 1); - hr = D3D::device->CreateTexture2D(&t2dd, NULL, &m_yuyvTexture); + hr = D3D::device->CreateTexture2D(&t2dd, &srd, &m_yuyvTexture); CHECK(SUCCEEDED(hr), "create tv yuyv texture"); D3D::SetDebugObjectName(m_yuyvTexture, "tv yuyv texture"); @@ -88,6 +101,21 @@ void Television::Init() m_pShader = D3D::CompileAndCreatePixelShader(YUYV_DECODER_PS, sizeof(YUYV_DECODER_PS)); CHECK(m_pShader != NULL, "compile and create yuyv decoder pixel shader"); D3D::SetDebugObjectName(m_pShader, "yuyv decoder pixel shader"); + + // Create sampler state and set border color + // + // The default sampler border color of { 0.f, 0.f, 0.f, 0.f } + // creates a green border around the image - see issue 6483 + // (remember, the XFB is being interpreted as YUYV, and 0,0,0,0 + // is actually two green pixels in YUYV - black should be 16,128,16,128, + // but we reverse the order to match DXGI_FORMAT_G8R8_G8B8_UNORM's ordering) + float border[4] = { 128.0f/255.0f, 16.0f/255.0f, 128.0f/255.0f, 16.0f/255.0f }; + D3D11_SAMPLER_DESC samDesc = CD3D11_SAMPLER_DESC(D3D11_FILTER_MIN_MAG_MIP_LINEAR, + D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, D3D11_TEXTURE_ADDRESS_BORDER, + 0.f, 1, D3D11_COMPARISON_ALWAYS, border, 0.f, 0.f); + hr = D3D::device->CreateSamplerState(&samDesc, &m_samplerState); + CHECK(SUCCEEDED(hr), "create yuyv decoder sampler state"); + D3D::SetDebugObjectName(m_samplerState, "yuyv decoder sampler state"); } void Television::Shutdown() @@ -95,6 +123,7 @@ void Television::Shutdown() SAFE_RELEASE(m_pShader); SAFE_RELEASE(m_yuyvTextureSRV); SAFE_RELEASE(m_yuyvTexture); + SAFE_RELEASE(m_samplerState); } void Television::Submit(u32 xfbAddr, u32 width, u32 height) @@ -121,6 +150,8 @@ void Television::Render() MathUtil::Rectangle sourceRc(0.f, 0.f, float(m_curWidth), float(m_curHeight)); MathUtil::Rectangle destRc(-1.f, 1.f, 1.f, -1.f); + D3D::context->PSSetSamplers(0, 1, &m_samplerState); + D3D::drawShadedTexSubQuad( m_yuyvTextureSRV, &sourceRc, MAX_XFB_WIDTH, MAX_XFB_HEIGHT, diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Television.h b/Source/Core/VideoBackends/D3D/Src/Television.h similarity index 93% rename from Source/Plugins/Plugin_VideoDX11/Src/Television.h rename to Source/Core/VideoBackends/D3D/Src/Television.h index 163d9131a6..a33ae7112d 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/Television.h +++ b/Source/Core/VideoBackends/D3D/Src/Television.h @@ -10,6 +10,7 @@ struct ID3D11Texture2D; struct ID3D11ShaderResourceView; struct ID3D11PixelShader; +struct ID3D11SamplerState; namespace DX11 { @@ -44,6 +45,7 @@ private: ID3D11Texture2D* m_yuyvTexture; ID3D11ShaderResourceView* m_yuyvTextureSRV; ID3D11PixelShader* m_pShader; + ID3D11SamplerState* m_samplerState; }; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/TextureCache.cpp b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp similarity index 87% rename from Source/Plugins/Plugin_VideoDX11/Src/TextureCache.cpp rename to Source/Core/VideoBackends/D3D/Src/TextureCache.cpp index e803f4a8f2..22e644b2d8 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D/Src/TextureCache.cpp @@ -14,6 +14,7 @@ #include "PSTextureEncoder.h" #include "HW/Memmap.h" #include "VideoConfig.h" +#include "ImageWrite.h" namespace DX11 { @@ -32,7 +33,7 @@ void TextureCache::TCacheEntry::Bind(unsigned int stage) D3D::context->PSSetShaderResources(stage, 1, &texture->GetSRV()); } -bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) +bool TextureCache::TCacheEntry::Save(const std::string filename, unsigned int level) { // TODO: Somehow implement this (D3DX11 doesn't support dumping individual LODs) static bool warn_once = true; @@ -42,7 +43,35 @@ bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) warn_once = false; return false; } - return SUCCEEDED(PD3DX11SaveTextureToFileA(D3D::context, texture->GetTex(), D3DX11_IFF_PNG, filename)); + + ID3D11Texture2D* pNewTexture = NULL; + ID3D11Texture2D* pSurface = texture->GetTex(); + D3D11_TEXTURE2D_DESC desc; + pSurface->GetDesc(&desc); + + desc.BindFlags = 0; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; + desc.Usage = D3D11_USAGE_STAGING; + + HRESULT hr = D3D::device->CreateTexture2D(&desc, NULL, &pNewTexture); + + bool saved_png = false; + + if (SUCCEEDED(hr) && pNewTexture) + { + D3D::context->CopyResource(pNewTexture, pSurface); + + D3D11_MAPPED_SUBRESOURCE map; + HRESULT hr = D3D::context->Map(pNewTexture, 0, D3D11_MAP_READ_WRITE, 0, &map); + if (SUCCEEDED(hr)) + { + saved_png = TextureToPng((u8*)map.pData, map.RowPitch, filename, desc.Width, desc.Height); + D3D::context->Unmap(pNewTexture, 0); + } + SAFE_RELEASE(pNewTexture); + } + + return saved_png; } void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height, @@ -82,10 +111,10 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, // TODO: better debug names D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetTex(), "a texture of the TextureCache"); - D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetSRV(), "shader resource view of a texture of the TextureCache"); + D3D::SetDebugObjectName((ID3D11DeviceChild*)entry->texture->GetSRV(), "shader resource view of a texture of the TextureCache"); SAFE_RELEASE(pTexture); - + if (tex_levels != 1) entry->Load(width, height, expanded_width, 0); @@ -137,7 +166,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo VertexShaderCache::GetSimpleVertexShader(), VertexShaderCache::GetSimpleInputLayout()); D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV()); - + g_renderer->RestoreAPIState(); } diff --git a/Source/Plugins/Plugin_VideoDX11/Src/TextureCache.h b/Source/Core/VideoBackends/D3D/Src/TextureCache.h similarity index 95% rename from Source/Plugins/Plugin_VideoDX11/Src/TextureCache.h rename to Source/Core/VideoBackends/D3D/Src/TextureCache.h index 94adfe8cce..91603bc56d 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/TextureCache.h +++ b/Source/Core/VideoBackends/D3D/Src/TextureCache.h @@ -36,7 +36,7 @@ private: const float *colmat); void Bind(unsigned int stage); - bool Save(const char filename[], unsigned int level); + bool Save(const std::string filename, unsigned int level); }; TCacheEntryBase* CreateTexture(unsigned int width, unsigned int height, diff --git a/Source/Plugins/Plugin_VideoDX11/Src/TextureEncoder.h b/Source/Core/VideoBackends/D3D/Src/TextureEncoder.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/TextureEncoder.h rename to Source/Core/VideoBackends/D3D/Src/TextureEncoder.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/VertexManager.cpp b/Source/Core/VideoBackends/D3D/Src/VertexManager.cpp similarity index 97% rename from Source/Plugins/Plugin_VideoDX11/Src/VertexManager.cpp rename to Source/Core/VideoBackends/D3D/Src/VertexManager.cpp index b16a91ad95..b951a7464f 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/VertexManager.cpp +++ b/Source/Core/VideoBackends/D3D/Src/VertexManager.cpp @@ -40,7 +40,7 @@ void VertexManager::CreateDeviceObjects() m_line_draw_index = 0; m_point_draw_index = 0; m_index_buffers = new PID3D11Buffer[MAX_VBUFFER_COUNT]; - m_vertex_buffers = new PID3D11Buffer[MAX_VBUFFER_COUNT]; + m_vertex_buffers = new PID3D11Buffer[MAX_VBUFFER_COUNT]; for (m_current_index_buffer = 0; m_current_index_buffer < MAX_VBUFFER_COUNT; m_current_index_buffer++) { m_index_buffers[m_current_index_buffer] = NULL; @@ -74,7 +74,7 @@ void VertexManager::DestroyDeviceObjects() SAFE_RELEASE(m_vertex_buffers[m_current_vertex_buffer]); SAFE_RELEASE(m_index_buffers[m_current_vertex_buffer]); } - + } VertexManager::VertexManager() @@ -96,7 +96,7 @@ void VertexManager::PrepareDrawBuffers() if (m_vertex_buffer_cursor + vSize >= VBUFFER_SIZE) { // Wrap around - m_current_vertex_buffer = (m_current_vertex_buffer + 1) % MAX_VBUFFER_COUNT; + m_current_vertex_buffer = (m_current_vertex_buffer + 1) % MAX_VBUFFER_COUNT; m_vertex_buffer_cursor = 0; MapType = D3D11_MAP_WRITE_DISCARD; } @@ -114,7 +114,7 @@ void VertexManager::PrepareDrawBuffers() if (m_index_buffer_cursor + iCount >= (IBUFFER_SIZE / sizeof(u16))) { // Wrap around - m_current_index_buffer = (m_current_index_buffer + 1) % MAX_VBUFFER_COUNT; + m_current_index_buffer = (m_current_index_buffer + 1) % MAX_VBUFFER_COUNT; m_index_buffer_cursor = 0; MapType = D3D11_MAP_WRITE_DISCARD; } @@ -128,7 +128,7 @@ void VertexManager::PrepareDrawBuffers() memcpy((u16*)map.pData + m_point_draw_index, GetPointIndexBuffer(), sizeof(u16) * IndexGenerator::GetPointindexLen()); D3D::context->Unmap(m_index_buffers[m_current_index_buffer], 0); m_index_buffer_cursor += iCount; - + ADDSTAT(stats.thisFrame.bytesVertexStreamed, vSize); ADDSTAT(stats.thisFrame.bytesIndexStreamed, iCount*sizeof(u16)); } @@ -141,7 +141,7 @@ void VertexManager::Draw(UINT stride) { D3D::context->IASetVertexBuffers(0, 1, &m_vertex_buffers[m_current_vertex_buffer], &stride, &m_vertex_draw_offset); D3D::context->IASetIndexBuffer(m_index_buffers[m_current_index_buffer], DXGI_FORMAT_R16_UINT, 0); - + if (IndexGenerator::GetNumTriangles() > 0) { D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); @@ -217,14 +217,14 @@ void VertexManager::vFlush() { g_renderer->SetSamplerState(i & 3, i >> 2); const FourTexUnits &tex = bpmem.tex[i >> 2]; - const TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, + const TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, - tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, + tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, tex.texTlut[i&3].tlut_format, - (tex.texMode0[i&3].min_filter & 3), + ((tex.texMode0[i&3].min_filter & 3) != 0), (tex.texMode1[i&3].max_lod + 0xf) / 0x10, - tex.texImage1[i&3].image_type); + (tex.texImage1[i&3].image_type != 0)); if (tentry) { diff --git a/Source/Plugins/Plugin_VideoDX11/Src/VertexManager.h b/Source/Core/VideoBackends/D3D/Src/VertexManager.h similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/VertexManager.h rename to Source/Core/VideoBackends/D3D/Src/VertexManager.h index 889c2ee0eb..b4b7aa0ef4 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/VertexManager.h +++ b/Source/Core/VideoBackends/D3D/Src/VertexManager.h @@ -23,7 +23,7 @@ public: void DestroyDeviceObjects(); private: - + void PrepareDrawBuffers(); void Draw(u32 stride); // temp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.cpp b/Source/Core/VideoBackends/D3D/Src/VertexShaderCache.cpp similarity index 72% rename from Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.cpp rename to Source/Core/VideoBackends/D3D/Src/VertexShaderCache.cpp index 6121824b8e..e17f273a85 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/Src/VertexShaderCache.cpp @@ -12,14 +12,10 @@ #include "D3DShader.h" #include "Globals.h" #include "VertexShaderCache.h" +#include "VertexShaderManager.h" #include "ConfigManager.h" -// See comment near the bottom of this file -static unsigned int vs_constant_offset_table[C_VENVCONST_END]; -float vsconstants[C_VENVCONST_END*4]; -bool vscbufchanged = true; - namespace DX11 { VertexShaderCache::VSCache VertexShaderCache::vshaders; @@ -44,15 +40,15 @@ ID3D11Buffer* vscbuf = NULL; ID3D11Buffer* &VertexShaderCache::GetConstantBuffer() { // TODO: divide the global variables of the generated shaders into about 5 constant buffers to speed this up - if (vscbufchanged) + if (VertexShaderManager::dirty) { D3D11_MAPPED_SUBRESOURCE map; D3D::context->Map(vscbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - memcpy(map.pData, vsconstants, sizeof(vsconstants)); + memcpy(map.pData, &VertexShaderManager::constants, sizeof(VertexShaderConstants)); D3D::context->Unmap(vscbuf, 0); - vscbufchanged = false; - - ADDSTAT(stats.thisFrame.bytesUniformStreamed, sizeof(vsconstants)); + VertexShaderManager::dirty = false; + + ADDSTAT(stats.thisFrame.bytesUniformStreamed, sizeof(VertexShaderConstants)); } return vscbuf; } @@ -91,7 +87,7 @@ const char clear_shader_code[] = { "struct VSOUTPUT\n" "{\n" "float4 vPosition : POSITION;\n" - "float4 vColor0 : COLOR0;\n" + "float4 vColor0 : COLOR0;\n" "};\n" "VSOUTPUT main(float4 inPosition : POSITION,float4 inColor0: COLOR0)\n" "{\n" @@ -108,7 +104,7 @@ void VertexShaderCache::Init() { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - + }; const D3D11_INPUT_ELEMENT_DESC clearelems[2] = { @@ -116,7 +112,7 @@ void VertexShaderCache::Init() { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; - unsigned int cbsize = ((sizeof(vsconstants))&(~0xf))+0x10; // must be a multiple of 16 + unsigned int cbsize = ((sizeof(VertexShaderConstants))&(~0xf))+0x10; // must be a multiple of 16 D3D11_BUFFER_DESC cbdesc = CD3D11_BUFFER_DESC(cbsize, D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); HRESULT hr = D3D::device->CreateBuffer(&cbdesc, NULL, &vscbuf); CHECK(hr==S_OK, "Create vertex shader constant buffer (size=%u)", cbsize); @@ -141,19 +137,6 @@ void VertexShaderCache::Init() Clear(); - // these values are hardcoded, they depend on internal D3DCompile behavior - // TODO: Do this with D3DReflect or something instead - unsigned int k; - for (k = 0;k < 6;k++) vs_constant_offset_table[C_POSNORMALMATRIX+k] = 0+4*k; - for (k = 0;k < 4;k++) vs_constant_offset_table[C_PROJECTION+k] = 24+4*k; - for (k = 0;k < 4;k++) vs_constant_offset_table[C_MATERIALS+k] = 40+4*k; - for (k = 0;k < 40;k++) vs_constant_offset_table[C_LIGHTS+k] = 56+4*k; - for (k = 0;k < 24;k++) vs_constant_offset_table[C_TEXMATRICES+k] = 216+4*k; - for (k = 0;k < 64;k++) vs_constant_offset_table[C_TRANSFORMMATRICES+k] = 312+4*k; - for (k = 0;k < 32;k++) vs_constant_offset_table[C_NORMALMATRICES+k] = 568+4*k; - for (k = 0;k < 64;k++) vs_constant_offset_table[C_POSTTRANSFORMMATRICES+k] = 696+4*k; - vs_constant_offset_table[C_DEPTHPARAMS] = 952; - if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); @@ -200,11 +183,11 @@ void VertexShaderCache::Shutdown() bool VertexShaderCache::SetShader(u32 components) { VertexShaderUid uid; - GetVertexShaderUid(uid, components, API_D3D11); + GetVertexShaderUid(uid, components, API_D3D); if (g_ActiveConfig.bEnableShaderDebugging) { VertexShaderCode code; - GenerateVertexShaderCode(code, components, API_D3D11); + GenerateVertexShaderCode(code, components, API_D3D); vertex_uid_checker.AddToIndexAndCheck(code, uid, "Vertex", "v"); } @@ -230,7 +213,7 @@ bool VertexShaderCache::SetShader(u32 components) } VertexShaderCode code; - GenerateVertexShaderCode(code, components, API_D3D11); + GenerateVertexShaderCode(code, components, API_D3D); D3DBlob* pbytecode = NULL; D3D::CompileVertexShader(code.GetBuffer(), (int)strlen(code.GetBuffer()), &pbytecode); @@ -277,39 +260,4 @@ bool VertexShaderCache::InsertByteCode(const VertexShaderUid &uid, D3DBlob* bcod return true; } -// These are "callbacks" from VideoCommon and thus must be outside namespace DX11. -// This will have to be changed when we merge. - -// maps the constant numbers to float indices in the constant buffer -void Renderer::SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - vsconstants[vs_constant_offset_table[const_number] ] = f1; - vsconstants[vs_constant_offset_table[const_number]+1] = f2; - vsconstants[vs_constant_offset_table[const_number]+2] = f3; - vsconstants[vs_constant_offset_table[const_number]+3] = f4; - vscbufchanged = true; -} - -void Renderer::SetVSConstant4fv(unsigned int const_number, const float* f) -{ - memcpy(&vsconstants[vs_constant_offset_table[const_number]], f, sizeof(float)*4); - vscbufchanged = true; -} - -void Renderer::SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float* f) -{ - for (unsigned int i = 0; i < count; i++) - { - memcpy(&vsconstants[vs_constant_offset_table[const_number+i]], f+3*i, sizeof(float)*3); - vsconstants[vs_constant_offset_table[const_number+i]+3] = 0.f; - } - vscbufchanged = true; -} - -void Renderer::SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float* f) -{ - memcpy(&vsconstants[vs_constant_offset_table[const_number]], f, sizeof(float)*4*count); - vscbufchanged = true; -} - } // namespace DX11 diff --git a/Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.h b/Source/Core/VideoBackends/D3D/Src/VertexShaderCache.h similarity index 99% rename from Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.h rename to Source/Core/VideoBackends/D3D/Src/VertexShaderCache.h index b80dbcd7b1..5fe81a11d5 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/VertexShaderCache.h +++ b/Source/Core/VideoBackends/D3D/Src/VertexShaderCache.h @@ -35,7 +35,7 @@ public: private: struct VSCacheEntry - { + { ID3D11VertexShader* shader; D3DBlob* bytecode; // needed to initialize the input layout @@ -55,7 +55,7 @@ private: } }; typedef std::map VSCache; - + static VSCache vshaders; static const VSCacheEntry* last_entry; static VertexShaderUid last_uid; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/VideoBackend.h b/Source/Core/VideoBackends/D3D/Src/VideoBackend.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/VideoBackend.h rename to Source/Core/VideoBackends/D3D/Src/VideoBackend.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/XFBEncoder.cpp b/Source/Core/VideoBackends/D3D/Src/XFBEncoder.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/XFBEncoder.cpp rename to Source/Core/VideoBackends/D3D/Src/XFBEncoder.cpp diff --git a/Source/Plugins/Plugin_VideoDX11/Src/XFBEncoder.h b/Source/Core/VideoBackends/D3D/Src/XFBEncoder.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/XFBEncoder.h rename to Source/Core/VideoBackends/D3D/Src/XFBEncoder.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/main.cpp b/Source/Core/VideoBackends/D3D/Src/main.cpp similarity index 92% rename from Source/Plugins/Plugin_VideoDX11/Src/main.cpp rename to Source/Core/VideoBackends/D3D/Src/main.cpp index 10369a1329..0514106da5 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/main.cpp +++ b/Source/Core/VideoBackends/D3D/Src/main.cpp @@ -58,18 +58,18 @@ unsigned int VideoBackend::PeekMessages() void VideoBackend::UpdateFPSDisplay(const char *text) { TCHAR temp[512]; - swprintf_s(temp, sizeof(temp)/sizeof(TCHAR), _T("%hs | DX11 | %hs"), scm_rev_str, text); + swprintf_s(temp, sizeof(temp)/sizeof(TCHAR), _T("%hs | D3D | %hs"), scm_rev_str, text); EmuWindow::SetWindowText(temp); } std::string VideoBackend::GetName() { - return "DX11"; + return "D3D"; } std::string VideoBackend::GetDisplayName() { - return "Direct3D11"; + return "Direct3D"; } void InitBackendInfo() @@ -82,7 +82,7 @@ void InitBackendInfo() return; } - g_Config.backend_info.APIType = API_D3D11; + g_Config.backend_info.APIType = API_D3D; g_Config.backend_info.bUseRGBATextures = true; // the GX formats barely match any D3D11 formats g_Config.backend_info.bUseMinimalMipCount = true; g_Config.backend_info.bSupports3DVision = false; @@ -90,6 +90,7 @@ void InitBackendInfo() g_Config.backend_info.bSupportsFormatReinterpretation = true; g_Config.backend_info.bSupportsPixelLighting = true; g_Config.backend_info.bSupportsPrimitiveRestart = true; + g_Config.backend_info.bSupportsOversizedViewports = false; IDXGIFactory* factory; IDXGIAdapter* ad; @@ -142,7 +143,7 @@ void VideoBackend::ShowConfig(void *_hParent) { #if defined(HAVE_WX) && HAVE_WX InitBackendInfo(); - VideoConfigDiag diag((wxWindow*)_hParent, _trans("Direct3D11"), "gfx_dx11"); + VideoConfigDiag diag((wxWindow*)_hParent, _trans("Direct3D"), "gfx_dx11"); diag.ShowModal(); #endif } @@ -154,8 +155,10 @@ bool VideoBackend::Initialize(void *&window_handle) frameCount = 0; + const SCoreStartupParameter& core_params = SConfig::GetInstance().m_LocalCoreStartupParameter; + g_Config.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_dx11.ini").c_str()); - g_Config.GameIniLoad(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strGameIni.c_str()); + g_Config.GameIniLoad(); g_Config.UpdateProjectionHack(); g_Config.VerifyValidity(); UpdateActiveConfig(); diff --git a/Source/Plugins/Plugin_VideoDX11/Src/main.h b/Source/Core/VideoBackends/D3D/Src/main.h similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/main.h rename to Source/Core/VideoBackends/D3D/Src/main.h diff --git a/Source/Plugins/Plugin_VideoDX11/Src/stdafx.cpp b/Source/Core/VideoBackends/D3D/Src/stdafx.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoDX11/Src/stdafx.cpp rename to Source/Core/VideoBackends/D3D/Src/stdafx.cpp diff --git a/Source/Plugins/Plugin_VideoDX9/Src/stdafx.h b/Source/Core/VideoBackends/D3D/Src/stdafx.h similarity index 92% rename from Source/Plugins/Plugin_VideoDX9/Src/stdafx.h rename to Source/Core/VideoBackends/D3D/Src/stdafx.h index 2431184aaf..81bb44dc19 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/stdafx.h +++ b/Source/Core/VideoBackends/D3D/Src/stdafx.h @@ -9,4 +9,4 @@ #endif #include -#include +#include diff --git a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt b/Source/Core/VideoBackends/OGL/CMakeLists.txt similarity index 86% rename from Source/Plugins/Plugin_VideoOGL/CMakeLists.txt rename to Source/Core/VideoBackends/OGL/CMakeLists.txt index f3d7ce4e4f..f8ccb85052 100644 --- a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt +++ b/Source/Core/VideoBackends/OGL/CMakeLists.txt @@ -3,7 +3,6 @@ set(SRCS Src/FramebufferManager.cpp Src/main.cpp Src/NativeVertexFormat.cpp Src/PerfQuery.cpp - Src/PixelShaderCache.cpp Src/PostProcessing.cpp Src/ProgramShaderCache.cpp Src/RasterFont.cpp @@ -12,7 +11,6 @@ set(SRCS Src/FramebufferManager.cpp Src/StreamBuffer.cpp Src/TextureCache.cpp Src/TextureConverter.cpp - Src/VertexShaderCache.cpp Src/VertexManager.cpp) set(LIBS videocommon @@ -47,5 +45,4 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR set(LIBS ${LIBS} usbhid) endif() -add_library(videoogl STATIC ${SRCS}) -target_link_libraries(videoogl ${LIBS}) +add_dolphin_library(videoogl "${SRCS}" "${LIBS}") diff --git a/Source/Core/VideoBackends/OGL/OGL.vcxproj b/Source/Core/VideoBackends/OGL/OGL.vcxproj new file mode 100644 index 0000000000..a0c804a051 --- /dev/null +++ b/Source/Core/VideoBackends/OGL/OGL.vcxproj @@ -0,0 +1,102 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {EC1A314C-5588-4506-9C1E-2E58E5817F75} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2a3f751d-69e9-45f2-9199-9a00bfb6cc72} + + + {1c8436c9-dbaf-42be-83bc-cf3ec9175abe} + + + {ff213b23-2c26-4214-9f88-85271e557e87} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + + + + \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj.filters b/Source/Core/VideoBackends/OGL/OGL.vcxproj.filters similarity index 85% rename from Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj.filters rename to Source/Core/VideoBackends/OGL/OGL.vcxproj.filters index a8b79d85ad..c284f425dd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj.filters +++ b/Source/Core/VideoBackends/OGL/OGL.vcxproj.filters @@ -1,8 +1,20 @@  - - + + {f29f8e7f-21ba-49da-8044-e5279a091c8f} + + + {5bfec41c-1031-4925-8f98-38c7b49b1924} + + + {00dadfd8-a906-4b0c-b415-d42a69cf3ca7} + + + {696df73b-378e-4399-8f21-999b65d78dcd} + + + Decoder @@ -21,7 +33,7 @@ Render - + Render @@ -39,18 +51,11 @@ Render - - Render - - - Render - + + + - - - - Decoder @@ -66,6 +71,9 @@ Render + + Render + Render @@ -75,28 +83,19 @@ Render + + Render + Render - - Render - + + + + + - + - - - {a0bb3390-6085-4d10-af48-b60eb4c920e7} - - - {5b16573b-fb79-4a51-aa7a-d760df844128} - - - {14fca297-ab2f-4686-855f-65ab18602248} - - - {aaa16061-dca9-4155-be44-f77538e839fc} - - - + \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp b/Source/Core/VideoBackends/OGL/Src/FramebufferManager.cpp similarity index 85% rename from Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp rename to Source/Core/VideoBackends/OGL/Src/FramebufferManager.cpp index 140dbd4d78..081c5e71d0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/OGL/Src/FramebufferManager.cpp @@ -5,6 +5,9 @@ #include "Globals.h" #include "FramebufferManager.h" #include "VertexShaderGen.h" +#include "OnScreenDisplay.h" +#include "GLFunctions.h" +#include "DriverDetails.h" #include "TextureConverter.h" #include "Render.h" @@ -44,7 +47,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms m_resolvedColorTexture = 0; m_resolvedDepthTexture = 0; m_xfbFramebuffer = 0; - + m_targetWidth = targetWidth; m_targetHeight = targetHeight; @@ -63,7 +66,15 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms // alpha channel should be ignored if the EFB does not have one. // Create EFB target. - + u32 depthType; + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + { + depthType = GL_DEPTH_COMPONENT; + } + else + { + depthType = GL_DEPTH_COMPONENT24; + } glGenFramebuffers(1, &m_efbFramebuffer); glActiveTexture(GL_TEXTURE0 + 9); @@ -79,15 +90,15 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms glBindTexture(getFbType(), m_efbColor); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(getFbType(), 0, GL_RGBA8, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(getFbType(), 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(getFbType(), m_efbDepth); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(getFbType(), 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - + glTexImage2D(getFbType(), 0, depthType, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + glBindTexture(getFbType(), m_resolvedColorTexture); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(getFbType(), 0, GL_RGBA8, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(getFbType(), 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // Bind target textures to the EFB framebuffer. @@ -98,7 +109,6 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms GL_REPORT_FBO_ERROR(); } -#ifndef USE_GLES3 else { // EFB targets will be renderbuffers in MSAA mode (required by OpenGL). @@ -114,9 +124,9 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms glBindRenderbuffer(GL_RENDERBUFFER, m_efbColor); if (m_msaaCoverageSamples) - glRenderbufferStorageMultisampleCoverageNV(GL_RENDERBUFFER, m_msaaCoverageSamples, m_msaaSamples, GL_RGBA8, m_targetWidth, m_targetHeight); + glRenderbufferStorageMultisampleCoverageNV(GL_RENDERBUFFER, m_msaaCoverageSamples, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight); else - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_msaaSamples, GL_RGBA8, m_targetWidth, m_targetHeight); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight); glBindRenderbuffer(GL_RENDERBUFFER, m_efbDepth); if (m_msaaCoverageSamples) @@ -145,11 +155,11 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms glBindTexture(getFbType(), m_resolvedColorTexture); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(getFbType(), 0, GL_RGBA8, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(getFbType(), 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(getFbType(), m_resolvedDepthTexture); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(getFbType(), 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(getFbType(), 0, depthType, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); // Bind resolved textures to resolved framebuffer. @@ -164,18 +174,17 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms glBindFramebuffer(GL_FRAMEBUFFER, m_efbFramebuffer); } -#endif // Create XFB framebuffer; targets will be created elsewhere. glGenFramebuffers(1, &m_xfbFramebuffer); - + // EFB framebuffer is currently bound, make sure to clear its alpha value to 1.f glViewport(0, 0, m_targetWidth, m_targetHeight); glScissor(0, 0, m_targetWidth, m_targetHeight); glClearColor(0.f, 0.f, 0.f, 1.f); glClearDepthf(1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - + // reinterpret pixel format glGenBuffers(1, &m_pixel_format_vbo); glGenVertexArrays(1, &m_pixel_format_vao); @@ -183,7 +192,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms glBindBuffer(GL_ARRAY_BUFFER, m_pixel_format_vbo); glEnableVertexAttribArray(SHADER_POSITION_ATTRIB); glVertexAttribPointer(SHADER_POSITION_ATTRIB, 2, GL_FLOAT, 0, sizeof(GLfloat)*2, NULL); - + float vertices[] = { -1.0, -1.0, 1.0, -1.0, @@ -191,14 +200,14 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms 1.0, 1.0, }; glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - - char vs[] = + + char vs[] = "ATTRIN vec2 rawpos;\n" "void main(void) {\n" " gl_Position = vec4(rawpos,0,1);\n" "}\n"; - - char ps_rgba6_to_rgb8[] = + + char ps_rgba6_to_rgb8[] = "uniform sampler2DRect samp9;\n" "COLOROUT(ocol0)\n" "void main()\n" @@ -211,8 +220,8 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms " dst8.a = 255;\n" " ocol0 = float4(dst8) / 255.f;\n" "}"; - - char ps_rgb8_to_rgba6[] = + + char ps_rgb8_to_rgba6[] = "uniform sampler2DRect samp9;\n" "COLOROUT(ocol0)\n" "void main()\n" @@ -225,15 +234,14 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms " dst6.a = src8.b & 0x3F;\n" " ocol0 = float4(dst6) / 63.f;\n" "}"; - - if(g_ogl_config.eSupportedGLSLVersion != GLSL_120) + + if(g_ogl_config.eSupportedGLSLVersion != GLSLES2) { - // HACK: This shaders aren't glsl120 compatible as glsl120 don't support bit operations - // it could be workaround by floor + frac + tons off additions, but I think it isn't worth + // HACK: This shaders aren't glsles2 compatible as glsles2 don't support bit operations + // it could be workaround by floor + frac + tons off additions, but I think it isn't worth ProgramShaderCache::CompileShader(m_pixel_format_shaders[0], vs, ps_rgb8_to_rgba6); ProgramShaderCache::CompileShader(m_pixel_format_shaders[1], vs, ps_rgba6_to_rgb8); } - } FramebufferManager::~FramebufferManager() @@ -265,7 +273,7 @@ FramebufferManager::~FramebufferManager() glDeleteRenderbuffers(2, glObj); m_efbColor = 0; m_efbDepth = 0; - + // reinterpret pixel format glDeleteVertexArrays(1, &m_pixel_format_vao); glDeleteBuffers(1, &m_pixel_format_vbo); @@ -364,15 +372,23 @@ GLuint FramebufferManager::ResolveAndGetDepthTarget(const EFBRectangle &source_r void FramebufferManager::ReinterpretPixelData(unsigned int convtype) { - if(g_ogl_config.eSupportedGLSLVersion == GLSL_120) { - // This feature isn't supported by glsl120 + if(g_ogl_config.eSupportedGLSLVersion == GLSLES2) { + // This feature isn't supported by glsles2 + + // TODO: move this to InitBackendInfo + // We have to disable both the active and the stored config. Else we + // would either + // show this line per format change in one frame or + // once per frame. + OSD::AddMessage("Format Change Emulation isn't supported by your GPU.", 10000); + g_ActiveConfig.bEFBEmulateFormatChanges = false; + g_Config.bEFBEmulateFormatChanges = false; return; } - g_renderer->ResetAPIState(); - + GLuint src_texture = 0; - + if(m_msaaSamples > 1) { // MSAA mode, so resolve first @@ -386,7 +402,7 @@ void FramebufferManager::ReinterpretPixelData(unsigned int convtype) // Return to EFB. glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_efbFramebuffer); - + src_texture = m_resolvedColorTexture; } else @@ -395,24 +411,24 @@ void FramebufferManager::ReinterpretPixelData(unsigned int convtype) src_texture = m_efbColor; m_efbColor = m_resolvedColorTexture; m_resolvedColorTexture = src_texture; - + // also switch them on fbo glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, getFbType(), m_efbColor, 0); } glViewport(0,0, m_targetWidth, m_targetHeight); glActiveTexture(GL_TEXTURE0 + 9); glBindTexture(getFbType(), src_texture); - + m_pixel_format_shaders[convtype ? 1 : 0].Bind(); glBindVertexArray(m_pixel_format_vao); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + g_renderer->RestoreAPIState(); } XFBSource::~XFBSource() { - glDeleteRenderbuffers(1, &renderbuf); + glDeleteTextures(1, &texture); } @@ -420,7 +436,7 @@ void XFBSource::Draw(const MathUtil::Rectangle &sourcerc, const MathUtil::Rectangle &drawrc, int width, int height) const { // Texture map xfbSource->texture onto the main buffer - glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuf); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); glBlitFramebuffer(sourcerc.left, sourcerc.bottom, sourcerc.right, sourcerc.top, drawrc.left, drawrc.bottom, drawrc.right, drawrc.top, GL_COLOR_BUFFER_BIT, GL_LINEAR); @@ -430,17 +446,19 @@ void XFBSource::Draw(const MathUtil::Rectangle &sourcerc, void XFBSource::DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) { - TextureConverter::DecodeToTexture(xfbAddr, fbWidth, fbHeight, renderbuf); + TextureConverter::DecodeToTexture(xfbAddr, fbWidth, fbHeight, texture); } void XFBSource::CopyEFB(float Gamma) { + g_renderer->ResetAPIState(); + // Copy EFB data to XFB and restore render target again glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferManager::GetEFBFramebuffer()); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferManager::GetXFBFramebuffer()); // Bind texture. - glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuf); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); GL_REPORT_FBO_ERROR(); glBlitFramebuffer( @@ -452,18 +470,22 @@ void XFBSource::CopyEFB(float Gamma) // Return to EFB. FramebufferManager::SetFramebuffer(0); + g_renderer->RestoreAPIState(); + } XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height) { - GLuint renderbuf; + GLuint texture; - glGenRenderbuffers(1, &renderbuf); - - glBindRenderbuffer(GL_RENDERBUFFER, renderbuf); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, target_width, target_height); + glGenTextures(1, &texture); - return new XFBSource(renderbuf); + glActiveTexture(GL_TEXTURE0 + 9); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, target_width, target_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + return new XFBSource(texture); } void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.h b/Source/Core/VideoBackends/OGL/Src/FramebufferManager.h similarity index 91% rename from Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.h rename to Source/Core/VideoBackends/OGL/Src/FramebufferManager.h index 0c64a25e58..47c8b2048d 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.h +++ b/Source/Core/VideoBackends/OGL/Src/FramebufferManager.h @@ -46,24 +46,21 @@ namespace OGL { struct XFBSource : public XFBSourceBase { - XFBSource(GLuint rbuf) : renderbuf(rbuf) {} + XFBSource(GLuint tex) : texture(tex) {} ~XFBSource(); - void CopyEFB(float Gamma); - void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight); + void CopyEFB(float Gamma) override; + void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) override; void Draw(const MathUtil::Rectangle &sourcerc, - const MathUtil::Rectangle &drawrc, int width, int height) const; + const MathUtil::Rectangle &drawrc, int width, int height) const override; - const GLuint renderbuf; + const GLuint texture; }; inline GLenum getFbType() { #ifndef USE_GLES3 - if(g_ogl_config.eSupportedGLSLVersion == GLSL_120) - { - return GL_TEXTURE_RECTANGLE; - } + return GL_TEXTURE_RECTANGLE; #endif return GL_TEXTURE_2D; } @@ -96,16 +93,16 @@ public: // Same as above but for the depth Target. // After calling this, before you render anything else, you MUST bind the framebuffer you want to draw to. static GLuint ResolveAndGetDepthTarget(const EFBRectangle &rect); - - // Convert EFB content on pixel format change. + + // Convert EFB content on pixel format change. // convtype=0 -> rgb8->rgba6, convtype=2 -> rgba6->rgb8 static void ReinterpretPixelData(unsigned int convtype); private: - XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height); - void GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc); + XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height) override; + void GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc) override; - void CopyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma); + void CopyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) override; static int m_targetWidth; static int m_targetHeight; @@ -122,7 +119,7 @@ private: static GLuint m_resolvedDepthTexture; static GLuint m_xfbFramebuffer; // Only used in MSAA mode - + // For pixel format draw static GLuint m_pixel_format_vbo; static GLuint m_pixel_format_vao; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp similarity index 57% rename from Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp rename to Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp index 8360f9631e..6ff264aebe 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp +++ b/Source/Core/VideoBackends/OGL/Src/GLFunctions.cpp @@ -1,9 +1,12 @@ // Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. + +#include "DriverDetails.h" #include "GLFunctions.h" #include "Log.h" #include + #ifdef USE_GLES3 PFNGLMAPBUFFERRANGEPROC glMapBufferRange; PFNGLUNMAPBUFFERPROC glUnmapBuffer; @@ -32,6 +35,8 @@ PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLE glRenderbufferStorageMultisample; + PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; @@ -65,16 +70,40 @@ namespace GLFunc void Init() { self = dlopen(NULL, RTLD_LAZY); - LoadFunction("glBeginQuery", (void**)&glBeginQuery); - LoadFunction("glEndQuery", (void**)&glEndQuery); - LoadFunction("glGetQueryObjectuiv", (void**)&glGetQueryObjectuiv); - LoadFunction("glDeleteQueries", (void**)&glDeleteQueries); - LoadFunction("glGenQueries", (void**)&glGenQueries); + + LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer); + + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) { - LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer); + LoadFunction("glBeginQueryEXT", (void**)&glBeginQuery); + LoadFunction("glEndQueryEXT", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuivEXT", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueriesEXT", (void**)&glDeleteQueries); + LoadFunction("glGenQueriesEXT", (void**)&glGenQueries); + + LoadFunction("glMapBufferRangeNV", (void**)&glMapBufferRange); + LoadFunction("glBindBufferRangeNV", (void**)&glBindBufferRange); + LoadFunction("glBlitFramebufferNV", (void**)&glBlitFramebuffer); + + LoadFunction("glGenVertexArraysOES", (void**)&glGenVertexArrays); + LoadFunction("glDeleteVertexArraysOES", (void**)&glDeleteVertexArrays); + LoadFunction("glBindVertexArrayOES", (void**)&glBindVertexArray); + + LoadFunction("glRenderbufferStorageMultisampleNV", (void**)&glRenderbufferStorageMultisample); + + LoadFunction("glGetUniformBlockIndexNV", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBindingNV", (void**)&glUniformBlockBinding); + } + else + { + LoadFunction("glBeginQuery", (void**)&glBeginQuery); + LoadFunction("glEndQuery", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuiv", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueries", (void**)&glDeleteQueries); + LoadFunction("glGenQueries", (void**)&glGenQueries); + LoadFunction("glMapBufferRange", (void**)&glMapBufferRange); LoadFunction("glBindBufferRange", (void**)&glBindBufferRange); - LoadFunction("glBlitFramebuffer", (void**)&glBlitFramebuffer); LoadFunction("glGenVertexArrays", (void**)&glGenVertexArrays); @@ -84,22 +113,26 @@ namespace GLFunc LoadFunction("glClientWaitSync", (void**)&glClientWaitSync); LoadFunction("glDeleteSync", (void**)&glDeleteSync); LoadFunction("glFenceSync", (void**)&glFenceSync); + LoadFunction("glSamplerParameterf", (void**)&glSamplerParameterf); LoadFunction("glSamplerParameteri", (void**)&glSamplerParameteri); LoadFunction("glSamplerParameterfv", (void**)&glSamplerParameterfv); LoadFunction("glBindSampler", (void**)&glBindSampler); LoadFunction("glDeleteSamplers", (void**)&glDeleteSamplers); LoadFunction("glGenSamplers", (void**)&glGenSamplers); - } - - LoadFunction("glGetProgramBinary", (void**)&glGetProgramBinary); - LoadFunction("glProgramBinary", (void**)&glProgramBinary); - LoadFunction("glProgramParameteri", (void**)&glProgramParameteri); - - LoadFunction("glDrawRangeElements", (void**)&glDrawRangeElements); - LoadFunction("glGetUniformBlockIndex", (void**)&glGetUniformBlockIndex); - LoadFunction("glUniformBlockBinding", (void**)&glUniformBlockBinding); + LoadFunction("glGetProgramBinary", (void**)&glGetProgramBinary); + LoadFunction("glProgramBinary", (void**)&glProgramBinary); + LoadFunction("glProgramParameteri", (void**)&glProgramParameteri); + + LoadFunction("glDrawRangeElements", (void**)&glDrawRangeElements); + + LoadFunction("glRenderbufferStorageMultisample", (void**)&glRenderbufferStorageMultisample); + + LoadFunction("glGetUniformBlockIndex", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBinding", (void**)&glUniformBlockBinding); + + } dlclose(self); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.h b/Source/Core/VideoBackends/OGL/Src/GLFunctions.h similarity index 94% rename from Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.h rename to Source/Core/VideoBackends/OGL/Src/GLFunctions.h index 74fed7e227..cbfde1276c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.h +++ b/Source/Core/VideoBackends/OGL/Src/GLFunctions.h @@ -30,7 +30,7 @@ typedef void (*PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (*PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); typedef void (*PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); -//Program binar +//Program binary typedef void (*PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary); typedef void (*PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length); typedef void (*PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); @@ -48,6 +48,9 @@ typedef void (*PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); // glDraw* typedef void (*PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices); +// Multisample buffer +typedef void (*PFNGLRENDERBUFFERSTORAGEMULTISAMPLE) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + // ptrs extern PFNGLBEGINQUERYPROC glBeginQuery; extern PFNGLENDQUERYPROC glEndQuery; @@ -75,6 +78,8 @@ extern PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; extern PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLE glRenderbufferStorageMultisample; + //Sampler extern PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf; extern PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Core/VideoBackends/OGL/Src/GLUtil.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp rename to Source/Core/VideoBackends/OGL/Src/GLUtil.cpp index d7a891ecd1..f2cf74acf2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Core/VideoBackends/OGL/Src/GLUtil.cpp @@ -6,12 +6,10 @@ #include "VideoConfig.h" #include "IniFile.h" #include "Core.h" -#include "Host.h" #include "VideoBackend.h" #include "ConfigManager.h" #include "Render.h" -#include "VertexShaderManager.h" #include "GLUtil.h" @@ -55,7 +53,7 @@ GLuint OpenGL_CompileProgram ( const char* vertexShader, const char* fragmentSha GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); GLuint programID = glCreateProgram(); - + // compile vertex shader glShaderSource(vertexShaderID, 1, &vertexShader, NULL); glCompileShader(vertexShaderID); @@ -74,7 +72,7 @@ GLuint OpenGL_CompileProgram ( const char* vertexShader, const char* fragmentSha } bool shader_errors = !Result; #endif - + // compile fragment shader glShaderSource(fragmentShaderID, 1, &fragmentShader, NULL); glCompileShader(fragmentShaderID); @@ -90,7 +88,7 @@ GLuint OpenGL_CompileProgram ( const char* vertexShader, const char* fragmentSha } shader_errors |= !Result; #endif - + // link them glAttachShader(programID, vertexShaderID); glAttachShader(programID, fragmentShaderID); @@ -104,11 +102,11 @@ GLuint OpenGL_CompileProgram ( const char* vertexShader, const char* fragmentSha ERROR_LOG(VIDEO, "GLSL linker error:\n%s%s%s", stringBuffer, vertexShader, fragmentShader); } #endif - + // cleanup glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); - + return programID; } @@ -141,7 +139,6 @@ void OpenGL_ReportARBProgramError() bool OpenGL_ReportFBOError(const char *function, const char *file, int line) { -#ifndef USE_GLES unsigned int fbo_status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (fbo_status != GL_FRAMEBUFFER_COMPLETE) { @@ -154,12 +151,14 @@ bool OpenGL_ReportFBOError(const char *function, const char *file, int line) case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: error = "INCOMPLETE_MISSING_ATTACHMENT"; break; +#ifndef USE_GLES case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: error = "INCOMPLETE_DRAW_BUFFER"; break; case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: error = "INCOMPLETE_READ_BUFFER"; break; +#endif case GL_FRAMEBUFFER_UNSUPPORTED: error = "UNSUPPORTED"; break; @@ -168,7 +167,6 @@ bool OpenGL_ReportFBOError(const char *function, const char *file, int line) file, line, function, error); return false; } -#endif return true; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Core/VideoBackends/OGL/Src/GLUtil.h similarity index 89% rename from Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h rename to Source/Core/VideoBackends/OGL/Src/GLUtil.h index ccab3702cc..48466fe580 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Core/VideoBackends/OGL/Src/GLUtil.h @@ -30,16 +30,16 @@ #define GL_READ_WRITE 0x88BA #define GL_SRC1_ALPHA 0 #define GL_BGRA GL_RGBA -#define glDrawElementsBaseVertex -#define glDrawRangeElementsBaseVertex -#define GLRENDERBUFFERFORMAT 0x8058 /* RGBA8_OES */ +#define glDrawElementsBaseVertex(...) +#define glDrawRangeElementsBaseVertex(...) +#define glRenderbufferStorageMultisampleCoverageNV(...) +#define glViewportIndexedf(...) #endif #else #define TEX2D GL_TEXTURE_RECTANGLE_ARB -#define PREC +#define PREC #define TEXTYPE "sampler2DRect" #define TEXFUNC "texture2DRect" -#define GLRENDERBUFFERFORMAT GL_RGBA #endif @@ -71,14 +71,14 @@ __forceinline GLenum GL_REPORT_ERROR() { return GL_NO_ERROR; } #endif // this should be removed in future, but as long as glsl is unstable, we should really read this messages -#if defined(_DEBUG) || defined(DEBUGFAST) +#if defined(_DEBUG) || defined(DEBUGFAST) #define DEBUG_GLSL 1 #else #define DEBUG_GLSL 0 #endif // Isn't defined if we aren't using GLEW 1.6 -#ifndef GL_ONE_MINUS_SRC1_ALPHA +#ifndef GL_ONE_MINUS_SRC1_ALPHA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Globals.h b/Source/Core/VideoBackends/OGL/Src/Globals.h similarity index 100% rename from Source/Plugins/Plugin_VideoOGL/Src/Globals.h rename to Source/Core/VideoBackends/OGL/Src/Globals.h diff --git a/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp b/Source/Core/VideoBackends/OGL/Src/NativeVertexFormat.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp rename to Source/Core/VideoBackends/OGL/Src/NativeVertexFormat.cpp index 293e674cbb..c0112c4e9e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp +++ b/Source/Core/VideoBackends/OGL/Src/NativeVertexFormat.cpp @@ -48,21 +48,21 @@ void GLVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl) vertex_stride = vtx_decl.stride; // We will not allow vertex components causing uneven strides. - if (vertex_stride & 3) + if (vertex_stride & 3) PanicAlert("Uneven vertex stride: %i", vertex_stride); - + VertexManager *vm = (OGL::VertexManager*)g_vertex_manager; - + glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); - + // the element buffer is bound directly to the vao, so we must it set for every vao glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vm->m_index_buffers); glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers); glEnableVertexAttribArray(SHADER_POSITION_ATTRIB); glVertexAttribPointer(SHADER_POSITION_ATTRIB, 3, GL_FLOAT, GL_FALSE, vtx_decl.stride, (u8*)NULL); - + for (int i = 0; i < 3; i++) { if (vtx_decl.num_normals > i) { glEnableVertexAttribArray(SHADER_NORM0_ATTRIB+i); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp b/Source/Core/VideoBackends/OGL/Src/PerfQuery.cpp similarity index 87% rename from Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp rename to Source/Core/VideoBackends/OGL/Src/PerfQuery.cpp index a1582c0c62..7cb408b62e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp +++ b/Source/Core/VideoBackends/OGL/Src/PerfQuery.cpp @@ -9,15 +9,15 @@ PerfQuery::PerfQuery() : m_query_read_pos() , m_query_count() { - for (u32 i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (u32 i = 0; i != ArraySize(m_query_buffer); ++i) glGenQueries(1, &m_query_buffer[i].query_id); - + ResetQuery(); } PerfQuery::~PerfQuery() { - for (u32 i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (u32 i = 0; i != ArraySize(m_query_buffer); ++i) glDeleteQueries(1, &m_query_buffer[i].query_id); } @@ -27,23 +27,23 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) return; // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) + if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); - - if (ARRAYSIZE(m_query_buffer) == m_query_count) + + if (ArraySize(m_query_buffer) == m_query_count) { FlushOne(); //ERROR_LOG(VIDEO, "Flushed query buffer early!"); } - + // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; - + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; + glBeginQuery(GL_SAMPLES_PASSED, entry.query_id); entry.query_type = type; - + ++m_query_count; } } @@ -81,7 +81,7 @@ void PerfQuery::FlushOne() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } @@ -103,10 +103,10 @@ void PerfQuery::WeakFlush() while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; - + GLuint result = GL_FALSE; glGetQueryObjectuiv(entry.query_id, GL_QUERY_RESULT_AVAILABLE, &result); - + if (GL_TRUE == result) { FlushOne(); @@ -121,7 +121,7 @@ void PerfQuery::WeakFlush() void PerfQuery::ResetQuery() { m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); + std::fill_n(m_results, ArraySize(m_results), 0); } u32 PerfQuery::GetQueryResult(PerfQueryType type) @@ -130,7 +130,7 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) return 0; u32 result = 0; - + if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) { result = m_results[PQG_ZCOMP_ZCOMPLOC]; @@ -147,7 +147,7 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) { result = m_results[PQG_EFB_COPY_CLOCKS]; } - + return result / 4; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.h b/Source/Core/VideoBackends/OGL/Src/PerfQuery.h similarity index 77% rename from Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.h rename to Source/Core/VideoBackends/OGL/Src/PerfQuery.h index b96fe7a4a0..c47fa194d1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.h +++ b/Source/Core/VideoBackends/OGL/Src/PerfQuery.h @@ -11,11 +11,11 @@ public: PerfQuery(); ~PerfQuery(); - void EnableQuery(PerfQueryGroup type); - void DisableQuery(PerfQueryGroup type); - void ResetQuery(); - u32 GetQueryResult(PerfQueryType type); - void FlushResults(); + void EnableQuery(PerfQueryGroup type) override; + void DisableQuery(PerfQueryGroup type) override; + void ResetQuery() override; + u32 GetQueryResult(PerfQueryType type) override; + void FlushResults() override; bool IsFlushed() const; private: diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp b/Source/Core/VideoBackends/OGL/Src/PostProcessing.cpp similarity index 87% rename from Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp rename to Source/Core/VideoBackends/OGL/Src/PostProcessing.cpp index d5899038fc..84fb0c4d1c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp +++ b/Source/Core/VideoBackends/OGL/Src/PostProcessing.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include "CommonPaths.h" #include "FileUtil.h" #include "VideoCommon.h" #include "VideoConfig.h" @@ -36,7 +37,7 @@ static char s_vertex_shader[] = "void main(void) {\n" " gl_Position = vec4(rawpos,0,1);\n" " uv0 = tex0;\n" - "}\n"; + "}\n"; void Init() { @@ -44,28 +45,28 @@ void Init() s_enable = 0; s_width = 0; s_height = 0; - + glGenFramebuffers(1, &s_fbo); glGenTextures(1, &s_texture); glBindTexture(GL_TEXTURE_2D, s_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); // disable mipmaps glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindFramebuffer(GL_FRAMEBUFFER, s_fbo); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, s_texture, 0); FramebufferManager::SetFramebuffer(0); - + glGenBuffers(1, &s_vbo); glBindBuffer(GL_ARRAY_BUFFER, s_vbo); - GLfloat vertices[] = { - -1.f, -1.f, 0.f, 0.f, - -1.f, 1.f, 0.f, 1.f, - 1.f, -1.f, 1.f, 0.f, + GLfloat vertices[] = { + -1.f, -1.f, 0.f, 0.f, + -1.f, 1.f, 0.f, 1.f, + 1.f, -1.f, 1.f, 0.f, 1.f, 1.f, 1.f, 1.f }; glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - + glGenVertexArrays(1, &s_vao); glBindVertexArray( s_vao ); glEnableVertexAttribArray(SHADER_POSITION_ATTRIB); @@ -77,10 +78,10 @@ void Init() void Shutdown() { s_shader.Destroy(); - + glDeleteFramebuffers(1, &s_vbo); glDeleteTextures(1, &s_texture); - + glDeleteBuffers(1, &s_vbo); glDeleteVertexArrays(1, &s_vao); } @@ -98,22 +99,22 @@ void BindTargetFramebuffer () void BlitToScreen() { if(!s_enable) return; - + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glViewport(0, 0, s_width, s_height); - + glBindVertexArray(s_vao); s_shader.Bind(); - + glUniform4f(s_uniform_resolution, (float)s_width, (float)s_height, 1.0f/(float)s_width, 1.0f/(float)s_height); - + glActiveTexture(GL_TEXTURE0+9); glBindTexture(GL_TEXTURE_2D, s_texture); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindTexture(GL_TEXTURE_2D, 0); - + /* glBindFramebuffer(GL_READ_FRAMEBUFFER, s_fbo); - + glBlitFramebuffer(rc.left, rc.bottom, rc.right, rc.top, rc.left, rc.bottom, rc.right, rc.top, GL_COLOR_BUFFER_BIT, GL_NEAREST);*/ @@ -126,11 +127,11 @@ void Update ( u32 width, u32 height ) if(s_enable && (width != s_width || height != s_height)) { s_width = width; s_height = height; - + // alloc texture for framebuffer glActiveTexture(GL_TEXTURE0+9); glBindTexture(GL_TEXTURE_2D, s_texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); } } @@ -142,29 +143,34 @@ void ApplyShader() s_currentShader = g_ActiveConfig.sPostProcessingShader; s_enable = false; s_shader.Destroy(); - + // shader disabled if (g_ActiveConfig.sPostProcessingShader == "") return; - + // so need to compile shader - + // loading shader code std::string code; - std::string path = File::GetUserPath(D_SHADERS_IDX) + g_ActiveConfig.sPostProcessingShader + ".txt"; - if(!File::ReadFileToString(true, path.c_str(), code)) { + std::string path = File::GetUserPath(D_SHADERS_IDX) + g_ActiveConfig.sPostProcessingShader + ".glsl"; + if (!File::Exists(path)) + { + // Fallback to shared user dir + path = File::GetSysDirectory() + SHADERS_DIR DIR_SEP + g_ActiveConfig.sPostProcessingShader + ".glsl"; + } + if(!File::ReadFileToString(path.c_str(), code)) { ERROR_LOG(VIDEO, "Post-processing shader not found: %s", path.c_str()); return; } - + // and compile it if (!ProgramShaderCache::CompileShader(s_shader, s_vertex_shader, code.c_str())) { ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", s_currentShader.c_str()); return; } - + // read uniform locations s_uniform_resolution = glGetUniformLocation(s_shader.glprogid, "resolution"); - + // successful s_enable = true; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.h b/Source/Core/VideoBackends/OGL/Src/PostProcessing.h similarity index 100% rename from Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.h rename to Source/Core/VideoBackends/OGL/Src/PostProcessing.h diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp similarity index 64% rename from Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp rename to Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp index 9c068a7f03..cc807b7952 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp @@ -10,18 +10,16 @@ #include "Statistics.h" #include "ImageWrite.h" #include "Render.h" +#include "PixelShaderManager.h" +#include "VertexShaderManager.h" namespace OGL { static const u32 UBO_LENGTH = 32*1024*1024; -GLintptr ProgramShaderCache::s_vs_data_size; -GLintptr ProgramShaderCache::s_ps_data_size; -GLintptr ProgramShaderCache::s_vs_data_offset; -u8 *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; -bool ProgramShaderCache::s_ubo_dirty; +s32 ProgramShaderCache::s_ubo_align; static StreamBuffer *s_buffer; static int num_failures = 0; @@ -36,6 +34,10 @@ UidChecker ProgramShaderCache::vertex_uid_chec static char s_glsl_header[1024] = ""; + + +// Annoying sure, can be removed once we drop our UBO workaround + const char *UniformNames[NUM_UNIFORMS] = { // PIXEL SHADER UNIFORMS @@ -61,41 +63,86 @@ const char *UniformNames[NUM_UNIFORMS] = I_DEPTHPARAMS, }; +const static int PSVar_Loc[] = { + offsetof(PixelShaderConstants, colors)/16, + offsetof(PixelShaderConstants, kcolors)/16, + offsetof(PixelShaderConstants, alpha)/16, + offsetof(PixelShaderConstants, texdims)/16, + offsetof(PixelShaderConstants, zbias)/16, + offsetof(PixelShaderConstants, indtexscale)/16, + offsetof(PixelShaderConstants, indtexmtx)/16, + offsetof(PixelShaderConstants, fog)/16, + offsetof(PixelShaderConstants, plights)/16, + offsetof(PixelShaderConstants, pmaterials)/16, +}; + +const static int VSVar_Loc[] = { + offsetof(VertexShaderConstants, posnormalmatrix)/16, + offsetof(VertexShaderConstants, projection)/16, + offsetof(VertexShaderConstants, materials)/16, + offsetof(VertexShaderConstants, lights)/16, + offsetof(VertexShaderConstants, texmatrices)/16, + offsetof(VertexShaderConstants, transformmatrices)/16, + offsetof(VertexShaderConstants, normalmatrices)/16, + offsetof(VertexShaderConstants, posttransformmatrices)/16, + offsetof(VertexShaderConstants, depthparams)/16, +}; + +// End of UBO workaround + void SHADER::SetProgramVariables() { // glsl shader must be bind to set samplers Bind(); - - // Bind UBO + + // Bind UBO if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); - + if(PSBlock_id != -1) glUniformBlockBinding(glprogid, PSBlock_id, 1); if(VSBlock_id != -1) glUniformBlockBinding(glprogid, VSBlock_id, 2); } - - // We cache our uniform locations for now - // Once we move up to a newer version of GLSL, ~1.30 - // We can remove this - // (Sonicadvance): For some reason this fails on my hardware - //glGetUniformIndices(glprogid, NUM_UNIFORMS, UniformNames, UniformLocations); - // Got to do it this crappy way. - UniformLocations[0] = glGetUniformLocation(glprogid, UniformNames[0]); - if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for (int a = 1; a < NUM_UNIFORMS; ++a) - UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); + // UBO workaround + for (int a = 0; a < NUM_UNIFORMS; ++a) + { + UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); + UniformSize[a] = 0; + if(g_ActiveConfig.backend_info.bSupportsGLSLUBO) + break; + } + if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + int max_uniforms = 0; + char name[50]; + int size; + + glGetProgramiv(glprogid, GL_ACTIVE_UNIFORMS, &max_uniforms); + for(int i=0; i GLSL_120) - { - glBindFragDataLocation(glprogid, 0, "ocol0"); - } - else - { - // ogl2 shaders don't need to bind output colors. - // gl_FragColor already point to color channel - } #endif + } // Need to set some attribute locations glBindAttribLocation(glprogid, SHADER_POSITION_ATTRIB, "rawpos"); - + glBindAttribLocation(glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); - + glBindAttribLocation(glprogid, SHADER_COLOR0_ATTRIB, "color0"); glBindAttribLocation(glprogid, SHADER_COLOR1_ATTRIB, "color1"); - + glBindAttribLocation(glprogid, SHADER_NORM0_ATTRIB, "rawnorm0"); glBindAttribLocation(glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - + for(int i=0; i<8; i++) { char attrib_name[8]; snprintf(attrib_name, 8, "tex%d", i); @@ -153,30 +191,60 @@ void SHADER::Bind() } } - -void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) -{ - s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4*sizeof(float)), f, count*4*sizeof(float)); -} - -void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) -{ - s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4*sizeof(float))+s_vs_data_offset, f, count*4*sizeof(float)); -} - void ProgramShaderCache::UploadConstants() { - if(s_ubo_dirty) { - s_buffer->Alloc(s_ubo_buffer_size); - size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_ps_data_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_vs_data_size); - s_ubo_dirty = false; - + if(g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + if(PixelShaderManager::dirty || VertexShaderManager::dirty) + { + s_buffer->Alloc(s_ubo_buffer_size); + if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) + { + // This is just a hack to support our BUFFERDATA upload method + // as it's broken to uploaded in a splited way + static u8 *tmpbuffer = new u8[s_ubo_buffer_size]; + memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants)); + memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, + s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, + s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants)); + } + else + { + size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align)); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, + s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); + offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, + s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants)); + } + + PixelShaderManager::dirty = false; + VertexShaderManager::dirty = false; + + ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); + } + } + else + { + // UBO workaround + // this must be updated per shader switch, so also update it when it's not dirty + for (unsigned int a = 0; a < 10; ++a) + { + if(last_entry->shader.UniformSize[a] > 0) + glUniform4fv(last_entry->shader.UniformLocations[a], last_entry->shader.UniformSize[a], (float*) &PixelShaderManager::constants + 4*PSVar_Loc[a]); + } + for (unsigned int a = 0; a < 9; ++a) + { + if(last_entry->shader.UniformSize[a+10] > 0) + glUniform4fv(last_entry->shader.UniformLocations[a+10], last_entry->shader.UniformSize[a+10], (float*) &VertexShaderManager::constants + 4*VSVar_Loc[a]); + } + ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); } + } GLuint ProgramShaderCache::GetCurrentProgram(void) @@ -249,7 +317,7 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen INCSTAT(stats.numPixelShadersCreated); SETSTAT(stats.numPixelShadersAlive, pshaders.size()); GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); - + last_entry->shader.Bind(); return &last_entry->shader; } @@ -265,9 +333,9 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glDeleteShader(psid); return false; } - + GLuint pid = shader.glprogid = glCreateProgram();; - + glAttachShader(pid, vsid); glAttachShader(pid, psid); @@ -275,13 +343,13 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); shader.SetProgramBindings(); - + glLinkProgram(pid); - + // original shaders aren't needed any more glDeleteShader(vsid); glDeleteShader(psid); - + GLint linkStatus; glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); GLsizei length = 0; @@ -298,14 +366,15 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons OpenFStream(file, szTemp, std::ios_base::out); file << s_glsl_header << vcode << s_glsl_header << pcode << infoLog; file.close(); - - PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - szTemp, - g_ogl_config.gl_vendor, - g_ogl_config.gl_renderer, - g_ogl_config.gl_version, - infoLog); - + + if(linkStatus != GL_TRUE) + PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", + szTemp, + g_ogl_config.gl_vendor, + g_ogl_config.gl_renderer, + g_ogl_config.gl_version, + infoLog); + delete [] infoLog; } if (linkStatus != GL_TRUE) @@ -319,7 +388,7 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons } shader.SetProgramVariables(); - + return true; } @@ -328,7 +397,7 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) GLuint result = glCreateShader(type); const char *src[] = {s_glsl_header, code}; - + glShaderSource(result, 2, src, NULL); glCompileShader(result); GLint compileStatus; @@ -346,24 +415,25 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) glGetShaderInfoLog(result, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "PS Shader info log:\n%s", infoLog); char szTemp[MAX_PATH]; - sprintf(szTemp, - "%sbad_%s_%04i.txt", - File::GetUserPath(D_DUMP_IDX).c_str(), - type==GL_VERTEX_SHADER ? "vs" : "ps", + sprintf(szTemp, + "%sbad_%s_%04i.txt", + File::GetUserPath(D_DUMP_IDX).c_str(), + type==GL_VERTEX_SHADER ? "vs" : "ps", num_failures++); std::ofstream file; OpenFStream(file, szTemp, std::ios_base::out); file << s_glsl_header << code << infoLog; file.close(); - - PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - type==GL_VERTEX_SHADER ? "vertex" : "pixel", - szTemp, - g_ogl_config.gl_vendor, - g_ogl_config.gl_renderer, - g_ogl_config.gl_version, - infoLog); - + + if(compileStatus != GL_TRUE) + PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", + type==GL_VERTEX_SHADER ? "vertex" : "pixel", + szTemp, + g_ogl_config.gl_vendor, + g_ogl_config.gl_renderer, + g_ogl_config.gl_version, + infoLog); + delete[] infoLog; } if (compileStatus != GL_TRUE) @@ -408,22 +478,14 @@ void ProgramShaderCache::Init(void) // then the UBO will fail. if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - GLint Align; - glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &s_ubo_align); - s_ps_data_size = C_PENVCONST_END * sizeof(float) * 4; - s_vs_data_size = C_VENVCONST_END * sizeof(float) * 4; - s_vs_data_offset = ROUND_UP(s_ps_data_size, Align); - s_ubo_buffer_size = ROUND_UP(s_ps_data_size, Align) + ROUND_UP(s_vs_data_size, Align); + s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align); // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH); - - s_ubo_buffer = new u8[s_ubo_buffer_size]; - memset(s_ubo_buffer, 0, s_ubo_buffer_size); - s_ubo_dirty = true; } // Read our shader cache, only if supported @@ -440,19 +502,19 @@ void ProgramShaderCache::Init(void) { if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); - + char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); - + ProgramShaderCacheInserter inserter; g_program_disk_cache.OpenAndRead(cache_filename, inserter); } SETSTAT(stats.numPixelShadersAlive, pshaders.size()); } - + CreateHeader(); - + CurrentProgram = 0; last_entry = NULL; } @@ -466,16 +528,16 @@ void ProgramShaderCache::Shutdown(void) for (; iter != pshaders.end(); ++iter) { if(iter->second.in_cache) continue; - + GLint binary_size; glGetProgramiv(iter->second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); if(!binary_size) continue; - + u8 *data = new u8[binary_size+sizeof(GLenum)]; u8 *binary = data + sizeof(GLenum); GLenum *prog_format = (GLenum*)data; glGetProgramBinary(iter->second.shader.glprogid, binary_size, NULL, prog_format, binary); - + g_program_disk_cache.Append(iter->first, data, binary_size+sizeof(GLenum)); delete [] data; } @@ -485,7 +547,7 @@ void ProgramShaderCache::Shutdown(void) } glUseProgram(0); - + PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) iter->second.Destroy(); @@ -498,19 +560,20 @@ void ProgramShaderCache::Shutdown(void) { delete s_buffer; s_buffer = 0; - delete [] s_ubo_buffer; - s_ubo_buffer = 0; } } void ProgramShaderCache::CreateHeader ( void ) { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; - snprintf(s_glsl_header, sizeof(s_glsl_header), - "#version %s\n" - "%s\n" // default precision + snprintf(s_glsl_header, sizeof(s_glsl_header), + "%s\n" "%s\n" // ubo - + "%s\n" // early-z + + // Precision defines for GLSLES2/3 + "%s\n" + "\n"// A few required defines and ones that will make our lives a lot easier "#define ATTRIN %s\n" "#define ATTROUT %s\n" @@ -526,35 +589,45 @@ void ProgramShaderCache::CreateHeader ( void ) "#define frac fract\n" "#define lerp mix\n" - // glsl 120 hack + // texture2d hack + "%s\n" + "%s\n" + "%s\n" + + // GLSLES2 hacks + "%s\n" + "%s\n" "%s\n" "%s\n" "%s\n" "%s\n" "%s\n" "#define COLOROUT(name) %s\n" - - // texture2d hack - "%s\n" - "%s\n" - "%s\n" - - , v==GLSLES3 ? "300 es" : v==GLSL_120 ? "120" : v==GLSL_130 ? "130" : v==GLSL_140 ? "140" : "150" - , v==GLSLES3 ? "precision highp float;" : "" + + + , v==GLSLES2 ? "" : v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v { public: - void Read(const SHADERUID &key, const u8 *value, u32 value_size); + void Read(const SHADERUID &key, const u8 *value, u32 value_size) override; }; static PCache pshaders; @@ -109,12 +107,8 @@ private: static UidChecker pixel_uid_checker; static UidChecker vertex_uid_checker; - static GLintptr s_vs_data_size; - static GLintptr s_ps_data_size; - static GLintptr s_vs_data_offset; - static u8 *s_ubo_buffer; static u32 s_ubo_buffer_size; - static bool s_ubo_dirty; + static s32 s_ubo_align; }; } // namespace OGL diff --git a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp b/Source/Core/VideoBackends/OGL/Src/RasterFont.cpp similarity index 84% rename from Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp rename to Source/Core/VideoBackends/OGL/Src/RasterFont.cpp index 9011b072e8..42b8963784 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp +++ b/Source/Core/VideoBackends/OGL/Src/RasterFont.cpp @@ -16,104 +16,104 @@ static const u32 char_offset = 32; static const u32 char_count = 95; const u8 rasters[char_count][char_height] = { - {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} + {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} }; -static const char *s_vertexShaderSrc = +static const char *s_vertexShaderSrc = "uniform vec2 charSize;\n" "ATTRIN vec2 rawpos;\n" "ATTRIN vec2 tex0;\n" @@ -121,7 +121,7 @@ static const char *s_vertexShaderSrc = "void main(void) {\n" " gl_Position = vec4(rawpos,0,1);\n" " uv0 = tex0 * charSize;\n" - "}\n"; + "}\n"; static const char *s_fragmentShaderSrc = "uniform sampler2D samp8;\n" @@ -131,9 +131,9 @@ static const char *s_fragmentShaderSrc = "void main(void) {\n" " ocol0 = texture(samp8,uv0) * color;\n" "}\n"; - + static SHADER s_shader; - + RasterFont::RasterFont() { // generate the texture @@ -144,7 +144,7 @@ RasterFont::RasterFont() for(u32 y=0; y>16)&0xff)/255.f,GLfloat((color>>8)&0xff)/255.f,GLfloat((color>>0)&0xff)/255.f,GLfloat((color>>24)&0xff)/255.f); cached_color = color; } - + glActiveTexture(GL_TEXTURE0+8); glDrawArrays(GL_TRIANGLES, 0, usage/4); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.h b/Source/Core/VideoBackends/OGL/Src/RasterFont.h similarity index 99% rename from Source/Plugins/Plugin_VideoOGL/Src/RasterFont.h rename to Source/Core/VideoBackends/OGL/Src/RasterFont.h index 97ad877082..7f3cff1414 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.h +++ b/Source/Core/VideoBackends/OGL/Src/RasterFont.h @@ -15,7 +15,7 @@ public: void printMultilineText(const char *text, double x, double y, double z, int bbWidth, int bbHeight, u32 color); private: - + u32 VBO; u32 VAO; u32 texture; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Core/VideoBackends/OGL/Src/Render.cpp similarity index 84% rename from Source/Plugins/Plugin_VideoOGL/Src/Render.cpp rename to Source/Core/VideoBackends/OGL/Src/Render.cpp index 126294b857..b9a3fa4fce 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Src/Render.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "GLUtil.h" #if defined(HAVE_WX) && HAVE_WX @@ -28,13 +29,11 @@ #include "ImageWrite.h" #include "PixelEngine.h" #include "Render.h" -#include "OpcodeDecoding.h" #include "BPStructs.h" #include "TextureCache.h" #include "RasterFont.h" #include "VertexShaderGen.h" #include "DLCache.h" -#include "PixelShaderManager.h" #include "ProgramShaderCache.h" #include "VertexShaderManager.h" #include "VertexLoaderManager.h" @@ -49,7 +48,6 @@ #include "Debugger.h" #include "Core.h" #include "Movie.h" -#include "Host.h" #include "BPFunctions.h" #include "FPSCounter.h" #include "ConfigManager.h" @@ -65,10 +63,6 @@ #include "AVIDump.h" #endif -#if defined(HAVE_WX) && HAVE_WX -#include -#endif - // glew1.8 doesn't define KHR_debug #ifndef GL_DEBUG_OUTPUT #define GL_DEBUG_OUTPUT 0x92E0 @@ -80,18 +74,6 @@ void VideoConfig::UpdateProjectionHack() ::UpdateProjectionHack(g_Config.iPhackvalue, g_Config.sPhackvalue); } - -#if defined(HAVE_WX) && HAVE_WX -// Screenshot thread struct -typedef struct -{ - int W, H; - std::string filename; - wxImage *img; -} ScrStrct; -#endif - - int OSDInternalW, OSDInternalH; namespace OGL @@ -170,10 +152,11 @@ int GetNumMSAASamples(int MSAAMode) default: samples = 1; } - + if(samples <= g_ogl_config.max_samples) return samples; - - ERROR_LOG(VIDEO, "MSAA Bug: %d samples selected, but only %d supported by GPU.", samples, g_ogl_config.max_samples); + + // TODO: move this to InitBackendInfo + OSD::AddMessage(StringFromFormat("%d Anti Aliasing samples selected, but only %d supported by your GPU.", samples, g_ogl_config.max_samples), 10000); return g_ogl_config.max_samples; } @@ -196,8 +179,9 @@ int GetNumMSAACoverageSamples(int MSAAMode) samples = 0; } if(g_ogl_config.bSupportCoverageMSAA || samples == 0) return samples; - - ERROR_LOG(VIDEO, "MSAA Bug: CSAA selected, but not supported by GPU."); + + // TODO: move this to InitBackendInfo + OSD::AddMessage("CSAA Anti Aliasing isn't supported by your GPU.", 10000); return 0; } @@ -209,7 +193,8 @@ void ApplySSAASettings() { glEnable(GL_SAMPLE_SHADING_ARB); glMinSampleShadingARB(s_MSAASamples); } else { - ERROR_LOG(VIDEO, "MSAA Bug: SSAA selected, but not supported by GPU."); + // TODO: move this to InitBackendInfo + OSD::AddMessage("SSAA Anti Aliasing isn't supported by your GPU.", 10000); } } else if(g_ogl_config.bSupportSampleShading) { glDisable(GL_SAMPLE_SHADING_ARB); @@ -269,22 +254,29 @@ void GLAPIENTRY ClearDepthf(GLfloat depthval) void InitDriverInfo() { - // Get Vendor std::string svendor = std::string(g_ogl_config.gl_vendor); std::string srenderer = std::string(g_ogl_config.gl_renderer); + std::string sversion = std::string(g_ogl_config.gl_version); DriverDetails::Vendor vendor = DriverDetails::VENDOR_UNKNOWN; - u32 devfamily = 0; + DriverDetails::Driver driver = DriverDetails::DRIVER_UNKNOWN; double version = 0.0; - // Get Vendor first + // Get the vendor first if (svendor == "NVIDIA Corporation" && srenderer != "NVIDIA Tegra") - vendor = DriverDetails::VENDOR_NVIDIA; - else if (svendor == "ATI Technologies Inc.") + vendor = DriverDetails::VENDOR_NVIDIA; + else if (svendor == "ATI Technologies Inc." || svendor == "Advanced Micro Devices, Inc.") vendor = DriverDetails::VENDOR_ATI; + else if (std::string::npos != sversion.find("Mesa")) + vendor = DriverDetails::VENDOR_MESA; else if (std::string::npos != svendor.find("Intel")) vendor = DriverDetails::VENDOR_INTEL; else if (svendor == "ARM") vendor = DriverDetails::VENDOR_ARM; + else if (svendor == "http://limadriver.org/") + { + vendor = DriverDetails::VENDOR_ARM; + driver = DriverDetails::DRIVER_LIMA; + } else if (svendor == "Qualcomm") vendor = DriverDetails::VENDOR_QUALCOMM; else if (svendor == "Imagination Technologies") @@ -293,31 +285,47 @@ void InitDriverInfo() vendor = DriverDetails::VENDOR_TEGRA; else if (svendor == "Vivante Corporation") vendor = DriverDetails::VENDOR_VIVANTE; - + // Get device family and driver version...if we care about it switch(vendor) { case DriverDetails::VENDOR_QUALCOMM: { if (std::string::npos != srenderer.find("Adreno (TM) 3")) - devfamily = 300; + driver = DriverDetails::DRIVER_QUALCOMM_3XX; else - devfamily = 200; + driver = DriverDetails::DRIVER_QUALCOMM_2XX; double glVersion; sscanf(g_ogl_config.gl_version, "OpenGL ES %lg V@%lg", &glVersion, &version); } break; case DriverDetails::VENDOR_ARM: if (std::string::npos != srenderer.find("Mali-T6")) - devfamily = 600; + driver = DriverDetails::DRIVER_ARM_T6XX; else if(std::string::npos != srenderer.find("Mali-4")) - devfamily = 400; + driver = DriverDetails::DRIVER_ARM_4XX; + break; + case DriverDetails::VENDOR_MESA: + { + if(svendor == "nouveau") + driver = DriverDetails::DRIVER_NOUVEAU; + else if(svendor == "Intel Open Source Technology Center") + driver = DriverDetails::DRIVER_I965; + else if(std::string::npos != srenderer.find("AMD") || std::string::npos != srenderer.find("ATI")) + driver = DriverDetails::DRIVER_R600; + + int major = 0; + int minor = 0; + int release = 0; + sscanf(g_ogl_config.gl_version, "%*s Mesa %d.%d.%d", &major, &minor, &release); + version = 100*major + 10*minor + release; + } break; // We don't care about these default: break; } - DriverDetails::Init(vendor, devfamily, version); + DriverDetails::Init(vendor, driver, version); } // Init functions @@ -337,7 +345,7 @@ Renderer::Renderer() g_ogl_config.gl_renderer = (const char*)glGetString(GL_RENDERER); g_ogl_config.gl_version = (const char*)glGetString(GL_VERSION); g_ogl_config.glsl_version = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); - + InitDriverInfo(); // Init extension support. @@ -345,38 +353,59 @@ Renderer::Renderer() // Set default GLES3 options GLFunc::Init(); WARN_LOG(VIDEO, "Running the OpenGL ES 3 backend!"); + g_Config.backend_info.bSupportsDualSourceBlend = false; - g_Config.backend_info.bSupportsGLSLUBO = true; - g_Config.backend_info.bSupportsPrimitiveRestart = false; + g_Config.backend_info.bSupportsGLSLUBO = !DriverDetails::HasBug(DriverDetails::BUG_ANNIHILATEDUBOS); + g_Config.backend_info.bSupportsPrimitiveRestart = true; g_Config.backend_info.bSupportsEarlyZ = false; - - g_ogl_config.bSupportsGLSLCache = true; - g_ogl_config.bSupportsGLPinnedMemory = false; - g_ogl_config.bSupportsGLSync = true; - g_ogl_config.bSupportsGLBaseVertex = false; - g_ogl_config.bSupportCoverageMSAA = false; // XXX: GLES3 spec has MSAA - g_ogl_config.bSupportSampleShading = false; - g_ogl_config.bSupportOGL31 = false; - g_ogl_config.eSupportedGLSLVersion = GLSLES3; + +#ifdef ANDROID + g_ogl_config.bSupportsGLSLCache = false; +#else + g_ogl_config.bSupportsGLSLCache = true; +#endif + g_ogl_config.bSupportsGLPinnedMemory = false; + g_ogl_config.bSupportsGLSync = true; + g_ogl_config.bSupportsGLBaseVertex = false; + g_ogl_config.bSupportCoverageMSAA = false; // XXX: GLES3 spec has MSAA + g_ogl_config.bSupportSampleShading = false; + g_ogl_config.bSupportOGL31 = false; + g_ogl_config.bSupportViewportFloat = false; + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA) || DriverDetails::HasBug(DriverDetails::BUG_ISPOWERVR)) + g_ogl_config.eSupportedGLSLVersion = GLSLES2; + else + g_ogl_config.eSupportedGLSLVersion = GLSLES3; #else - GLint numvertexattribs = 0; - glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numvertexattribs); - if (numvertexattribs < 16) - { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Number of attributes %d not enough.\n" - "GPU: Does your video card support OpenGL 2.x?", - numvertexattribs); - bSuccess = false; - } #ifdef __APPLE__ glewExperimental = 1; #endif if (glewInit() != GLEW_OK) { - ERROR_LOG(VIDEO, "glewInit() failed! Does your video card support OpenGL 2.x?"); - return; // TODO: fail + PanicAlert("glewInit() failed! Does your video card support OpenGL 2.x?"); + return; } - + + // check for the max vertex attributes + GLint numvertexattribs = 0; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numvertexattribs); + if (numvertexattribs < 16) + { + PanicAlert("GPU: OGL ERROR: Number of attributes %d not enough.\n" + "GPU: Does your video card support OpenGL 2.x?", + numvertexattribs); + bSuccess = false; + } + + // check the max texture width and height + GLint max_texture_size; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&max_texture_size); + if (max_texture_size < 1024) + { + PanicAlert("GL_MAX_TEXTURE_SIZE too small at %i - must be at least 1024.", + max_texture_size); + bSuccess = false; + } + #if defined(_DEBUG) || defined(DEBUGFAST) if (GLEW_ARB_debug_output) { @@ -386,44 +415,50 @@ Renderer::Renderer() } #endif - if (!GLEW_EXT_secondary_color) + if (!GLEW_VERSION_2_0) { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_EXT_secondary_color.\n" - "GPU: Does your video card support OpenGL 2.x?"); + // OpenGL 2.0 is required for all shader based drawings. There is no way to get this by extensions + PanicAlert("GPU: OGL ERROR: Does your video card support OpenGL 2.0?"); bSuccess = false; } if (!GLEW_ARB_framebuffer_object) { - ERROR_LOG(VIDEO, "GPU: ERROR: Need GL_ARB_framebuffer_object for multiple render targets.\n" + // We want the ogl3 framebuffer instead of the ogl2 one for better blitting support. + // It's also compatible with the gles3 one. + PanicAlert("GPU: ERROR: Need GL_ARB_framebuffer_object for multiple render targets.\n" "GPU: Does your video card support OpenGL 3.0?"); bSuccess = false; } if (!GLEW_ARB_vertex_array_object) { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_ARB_vertex_array_object.\n" + // This extension is used to replace lots of pointer setting function. + // Also gles3 requires to use it. + PanicAlert("GPU: OGL ERROR: Need GL_ARB_vertex_array_object.\n" "GPU: Does your video card support OpenGL 3.0?"); bSuccess = false; } - + if (!GLEW_ARB_map_buffer_range) { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_ARB_map_buffer_range.\n" + // ogl3 buffer mapping for better streaming support. + // The ogl2 one also isn't in gles3. + PanicAlert("GPU: OGL ERROR: Need GL_ARB_map_buffer_range.\n" "GPU: Does your video card support OpenGL 3.0?"); bSuccess = false; } if (!GLEW_ARB_sampler_objects && bSuccess) { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_ARB_sampler_objects." - "GPU: Does your video card support OpenGL 3.2?" + // Our sampler cache uses this extension. It could easyly be workaround and it's by far the + // highest requirement, but it seems that no driver lacks support for it. + PanicAlert("GPU: OGL ERROR: Need GL_ARB_sampler_objects." + "GPU: Does your video card support OpenGL 3.3?" "Please report this issue, then there will be a workaround"); bSuccess = false; } - if (!GLEW_ARB_texture_non_power_of_two) - WARN_LOG(VIDEO, "ARB_texture_non_power_of_two not supported."); - + // OpenGL 3 doesn't provide GLES like float functions for depth. // They are in core in OpenGL 4.1, so almost every driver should support them. // But for the oldest ones, we provide fallbacks to the old double functions. @@ -431,38 +466,34 @@ Renderer::Renderer() { glDepthRangef = DepthRangef; glClearDepthf = ClearDepthf; - + } - if (!bSuccess) - return; // TODO: fail - - g_Config.backend_info.bSupportsDualSourceBlend = GLEW_ARB_blend_func_extended; - g_Config.backend_info.bSupportsGLSLUBO = GLEW_ARB_uniform_buffer_object; - g_Config.backend_info.bSupportsPrimitiveRestart = GLEW_VERSION_3_1 || GLEW_NV_primitive_restart; - g_Config.backend_info.bSupportsEarlyZ = GLEW_ARB_shader_image_load_store; - - g_ogl_config.bSupportsGLSLCache = GLEW_ARB_get_program_binary; - g_ogl_config.bSupportsGLPinnedMemory = GLEW_AMD_pinned_memory; - g_ogl_config.bSupportsGLSync = GLEW_ARB_sync; - g_ogl_config.bSupportsGLBaseVertex = GLEW_ARB_draw_elements_base_vertex; - g_ogl_config.bSupportCoverageMSAA = GLEW_NV_framebuffer_multisample_coverage; - g_ogl_config.bSupportSampleShading = GLEW_ARB_sample_shading; - g_ogl_config.bSupportOGL31 = GLEW_VERSION_3_1; +#define TO_BOOL(c) (0 != (c)) - if(strstr(g_ogl_config.glsl_version, "1.00") || strstr(g_ogl_config.glsl_version, "1.10")) + g_Config.backend_info.bSupportsDualSourceBlend = TO_BOOL(GLEW_ARB_blend_func_extended); + g_Config.backend_info.bSupportsGLSLUBO = TO_BOOL(GLEW_ARB_uniform_buffer_object); + g_Config.backend_info.bSupportsPrimitiveRestart = TO_BOOL(GLEW_VERSION_3_1) || TO_BOOL(GLEW_NV_primitive_restart); + g_Config.backend_info.bSupportsEarlyZ = TO_BOOL(GLEW_ARB_shader_image_load_store); + + g_ogl_config.bSupportsGLSLCache = TO_BOOL(GLEW_ARB_get_program_binary); + g_ogl_config.bSupportsGLPinnedMemory = TO_BOOL(GLEW_AMD_pinned_memory); + g_ogl_config.bSupportsGLSync = TO_BOOL(GLEW_ARB_sync); + g_ogl_config.bSupportsGLBaseVertex = TO_BOOL(GLEW_ARB_draw_elements_base_vertex); + g_ogl_config.bSupportCoverageMSAA = TO_BOOL(GLEW_NV_framebuffer_multisample_coverage); + g_ogl_config.bSupportSampleShading = TO_BOOL(GLEW_ARB_sample_shading); + g_ogl_config.bSupportOGL31 = TO_BOOL(GLEW_VERSION_3_1); + g_ogl_config.bSupportViewportFloat = TO_BOOL(GLEW_ARB_viewport_array); + +#undef TO_BOOL + + if(strstr(g_ogl_config.glsl_version, "1.00") || strstr(g_ogl_config.glsl_version, "1.10") || strstr(g_ogl_config.glsl_version, "1.20")) { - ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need at least GLSL 1.20\n" - "GPU: Does your video card support OpenGL 2.1?\n" + PanicAlert("GPU: OGL ERROR: Need at least GLSL 1.30\n" + "GPU: Does your video card support OpenGL 3.0?\n" "GPU: Your driver supports GLSL %s", g_ogl_config.glsl_version); bSuccess = false; } - else if(strstr(g_ogl_config.glsl_version, "1.20")) - { - g_ogl_config.eSupportedGLSLVersion = GLSL_120; - g_Config.backend_info.bSupportsDualSourceBlend = false; //TODO: implement dual source blend - g_Config.backend_info.bSupportsEarlyZ = false; // layout keyword is only supported on glsl150+ - } else if(strstr(g_ogl_config.glsl_version, "1.30")) { g_ogl_config.eSupportedGLSLVersion = GLSL_130; @@ -477,33 +508,46 @@ Renderer::Renderer() { g_ogl_config.eSupportedGLSLVersion = GLSL_150; } -#endif - +#endif + int samples; + glGetIntegerv(GL_SAMPLES, &samples); + if(samples > 1) + { + // MSAA on default framebuffer isn't working because of glBlitFramebuffer. + // It also isn't useful as we don't render anything to the default framebuffer. + // We also try to get a non-msaa fb, so this only happens when forced by the driver. + PanicAlert("MSAA on default framebuffer isn't supported.\n" + "Please avoid forcing dolphin to use MSAA by the driver.\n" + "%d samples on default framebuffer found.", samples); + bSuccess = false; + } + + if (!bSuccess) + { + // Not all needed extensions are supported, so we have to stop here. + // Else some of the next calls might crash. + return; + } + glGetIntegerv(GL_MAX_SAMPLES, &g_ogl_config.max_samples); - if(g_ogl_config.max_samples < 1) + if(g_ogl_config.max_samples < 1) g_ogl_config.max_samples = 1; - - if(g_Config.backend_info.bSupportsGLSLUBO && ( - // hd3000 get corruption, hd4000 also and a big slowdown - !strcmp(g_ogl_config.gl_vendor, "Intel Open Source Technology Center") && ( - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.0") || - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.1") || - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.2") || - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.3") || - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.1.0") || - !strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.1.1") ) - )) { + + if(g_Config.backend_info.bSupportsGLSLUBO && DriverDetails::HasBug(DriverDetails::BUG_BROKENUBO)) + { g_Config.backend_info.bSupportsGLSLUBO = false; ERROR_LOG(VIDEO, "Buggy driver detected. Disable UBO"); + OSD::AddMessage("Major performance warning: Buggy GPU driver detected.", 20000); + OSD::AddMessage("Please either install the closed-source GPU driver or update your Mesa 3D version.", 20000); } - + UpdateActiveConfig(); OSD::AddMessage(StringFromFormat("Video Info: %s, %s, %s", g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, - g_ogl_config.gl_version).c_str(), 5000); - + g_ogl_config.gl_version), 5000); + WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "" : "UniformBuffer ", @@ -516,12 +560,12 @@ Renderer::Renderer() g_ogl_config.bSupportCoverageMSAA ? "" : "CSAA ", g_ogl_config.bSupportSampleShading ? "" : "SSAA " ); - + s_LastMultisampleMode = g_ActiveConfig.iMultisampleMode; s_MSAASamples = GetNumMSAASamples(s_LastMultisampleMode); s_MSAACoverageSamples = GetNumMSAACoverageSamples(s_LastMultisampleMode); ApplySSAASettings(); - + // Decide framebuffer size s_backbuffer_width = (int)GLInterface->GetBackBufferWidth(); s_backbuffer_height = (int)GLInterface->GetBackBufferHeight(); @@ -530,16 +574,6 @@ Renderer::Renderer() s_vsync = g_ActiveConfig.IsVSync(); GLInterface->SwapInterval(s_vsync); - // check the max texture width and height - GLint max_texture_size; - glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&max_texture_size); - if (max_texture_size < 1024) - ERROR_LOG(VIDEO, "GL_MAX_TEXTURE_SIZE too small at %i - must be at least 1024.", - max_texture_size); - - if (GL_REPORT_ERROR() != GL_NO_ERROR) - bSuccess = false; - // TODO: Move these somewhere else? FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); @@ -553,9 +587,6 @@ Renderer::Renderer() // options while running g_Config.bRunning = true; - if (GL_REPORT_ERROR() != GL_NO_ERROR) - bSuccess = false; - glStencilFunc(GL_ALWAYS, 0, 0); glBlendFunc(GL_ONE, GL_ONE); @@ -575,9 +606,11 @@ Renderer::Renderer() glBlendColor(0, 0, 0, 0.5f); glClearDepthf(1.0f); -#ifndef USE_GLES3 if(g_ActiveConfig.backend_info.bSupportsPrimitiveRestart) { +#ifdef USE_GLES3 + glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX); +#else if(g_ogl_config.bSupportOGL31) { glEnable(GL_PRIMITIVE_RESTART); @@ -588,8 +621,8 @@ Renderer::Renderer() glEnableClientState(GL_PRIMITIVE_RESTART_NV); glPrimitiveRestartIndexNV(65535); } - } #endif + } UpdateActiveConfig(); } @@ -605,14 +638,14 @@ Renderer::~Renderer() void Renderer::Shutdown() { delete g_framebuffer_manager; - + g_Config.bRunning = false; UpdateActiveConfig(); - + glDeleteBuffers(1, &s_ShowEFBCopyRegions_VBO); glDeleteVertexArrays(1, &s_ShowEFBCopyRegions_VAO); s_ShowEFBCopyRegions_VBO = 0; - + delete s_pfont; s_pfont = 0; s_ShowEFBCopyRegions.Destroy(); @@ -623,23 +656,23 @@ void Renderer::Init() // Initialize the FramebufferManager g_framebuffer_manager = new FramebufferManager(s_target_width, s_target_height, s_MSAASamples, s_MSAACoverageSamples); - + s_pfont = new RasterFont(); - - ProgramShaderCache::CompileShader(s_ShowEFBCopyRegions, + + ProgramShaderCache::CompileShader(s_ShowEFBCopyRegions, "ATTRIN vec2 rawpos;\n" "ATTRIN vec3 color0;\n" "VARYOUT vec4 c;\n" "void main(void) {\n" - " gl_Position = vec4(rawpos, 0.0f, 1.0f);\n" - " c = vec4(color0, 1.0f);\n" + " gl_Position = vec4(rawpos, 0.0, 1.0);\n" + " c = vec4(color0, 1.0);\n" "}\n", "VARYIN vec4 c;\n" "COLOROUT(ocol0)\n" "void main(void) {\n" " ocol0 = c;\n" "}\n"); - + // creating buffers glGenBuffers(1, &s_ShowEFBCopyRegions_VBO); glGenVertexArrays(1, &s_ShowEFBCopyRegions_VAO); @@ -665,7 +698,7 @@ void Renderer::DrawDebugInfo() p+=sprintf(p, "FPS: %d\n", s_fps); if (SConfig::GetInstance().m_ShowLag) - p+=sprintf(p, "Lag: %llu\n", Movie::g_currentLagCount); + p+=sprintf(p, "Lag: %" PRIu64 "\n", Movie::g_currentLagCount); if (g_ActiveConfig.bShowInputDisplay) p+=sprintf(p, "%s", Movie::GetInputDisplay().c_str()); @@ -685,7 +718,7 @@ void Renderer::DrawDebugInfo() // Draw EFB copy regions rectangles int a = 0; GLfloat color[3] = {0.0f, 1.0f, 1.0f}; - + for (std::vector::const_iterator it = stats.efb_regions.begin(); it != stats.efb_regions.end(); ++it) { @@ -701,78 +734,78 @@ void Renderer::DrawDebugInfo() Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x2; Vertices[a++] = y; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - - + + Vertices[a++] = x2; Vertices[a++] = y; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x2; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - - + + Vertices[a++] = x2; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - - + + Vertices[a++] = x; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x; Vertices[a++] = y; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - - + + Vertices[a++] = x; Vertices[a++] = y; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x2; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - - + + Vertices[a++] = x2; Vertices[a++] = y; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + Vertices[a++] = x; Vertices[a++] = y2; Vertices[a++] = color[0]; Vertices[a++] = color[1]; Vertices[a++] = color[2]; - + // TO DO: build something nicer here GLfloat temp = color[0]; color[0] = color[1]; @@ -780,7 +813,7 @@ void Renderer::DrawDebugInfo() color[2] = temp; } glUnmapBuffer(GL_ARRAY_BUFFER); - + s_ShowEFBCopyRegions.Bind(); glBindVertexArray( s_ShowEFBCopyRegions_VAO ); glDrawArrays(GL_LINES, 0, stats.efb_regions.size() * 2*6); @@ -941,9 +974,13 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) { if (s_MSAASamples > 1) { + g_renderer->ResetAPIState(); + // Resolve our rectangle. FramebufferManager::GetEFBDepthTexture(efbPixelRc); glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferManager::GetResolvedFramebuffer()); + + g_renderer->RestoreAPIState(); } u32* depthMap = new u32[targetPixelRcWidth * targetPixelRcHeight]; @@ -990,9 +1027,13 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) { if (s_MSAASamples > 1) { + g_renderer->ResetAPIState(); + // Resolve our rectangle. FramebufferManager::GetEFBColorTexture(efbPixelRc); glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferManager::GetResolvedFramebuffer()); + + g_renderer->RestoreAPIState(); } u32* colorMap = new u32[targetPixelRcWidth * targetPixelRcHeight]; @@ -1053,7 +1094,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) } // Called from VertexShaderManager -void Renderer::UpdateViewport(Matrix44& vpCorrection) +void Renderer::UpdateViewport() { // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) // [0] = width/2 @@ -1067,12 +1108,12 @@ void Renderer::UpdateViewport(Matrix44& vpCorrection) int scissorYOff = bpmem.scissorOffset.y * 2; // TODO: ceil, floor or just cast to int? - int X = EFBToScaledX((int)ceil(xfregs.viewport.xOrig - xfregs.viewport.wd - (float)scissorXOff)); - int Y = EFBToScaledY((int)ceil((float)EFB_HEIGHT - xfregs.viewport.yOrig + xfregs.viewport.ht + (float)scissorYOff)); - int Width = EFBToScaledX((int)ceil(2.0f * xfregs.viewport.wd)); - int Height = EFBToScaledY((int)ceil(-2.0f * xfregs.viewport.ht)); - double GLNear = (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f; - double GLFar = xfregs.viewport.farZ / 16777216.0f; + float X = EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - (float)scissorXOff); + float Y = EFBToScaledYf((float)EFB_HEIGHT - xfregs.viewport.yOrig + xfregs.viewport.ht + (float)scissorYOff); + float Width = EFBToScaledXf(2.0f * xfregs.viewport.wd); + float Height = EFBToScaledYf(-2.0f * xfregs.viewport.ht); + float GLNear = (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f; + float GLFar = xfregs.viewport.farZ / 16777216.0f; if (Width < 0) { X += Width; @@ -1084,11 +1125,15 @@ void Renderer::UpdateViewport(Matrix44& vpCorrection) Height *= -1; } - // OpenGL does not require any viewport correct - Matrix44::LoadIdentity(vpCorrection); - // Update the view port - glViewport(X, Y, Width, Height); + if(g_ogl_config.bSupportViewportFloat) + { + glViewportIndexedf(0, X, Y, Width, Height); + } + else + { + glViewport(ceil(X), ceil(Y), ceil(Width), ceil(Height)); + } glDepthRangef(GLNear, GLFar); } @@ -1144,10 +1189,10 @@ void Renderer::SetBlendMode(bool forceUpdate) // Our render target always uses an alpha channel, so we need to override the blend functions to assume a destination alpha of 1 if the render target isn't supposed to have an alpha channel // Example: D3DBLEND_DESTALPHA needs to be D3DBLEND_ONE since the result without an alpha channel is assumed to always be 1. bool target_has_alpha = bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - + bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && target_has_alpha; bool useDualSource = useDstAlpha && g_ActiveConfig.backend_info.bSupportsDualSourceBlend; - + const GLenum glSrcFactors[8] = { GL_ZERO, @@ -1201,7 +1246,7 @@ void Renderer::SetBlendMode(bool forceUpdate) // subtract enable change GLenum equation = newval & 4 ? GL_FUNC_REVERSE_SUBTRACT : GL_FUNC_ADD; GLenum equationAlpha = useDualSource ? GL_FUNC_ADD : equation; - + glBlendEquationSeparate(equation, equationAlpha); } @@ -1217,7 +1262,7 @@ void Renderer::SetBlendMode(bool forceUpdate) { srcidx = GX_BL_ONE; dstidx = GX_BL_ZERO; - } + } else { // we can't use GL_DST_COLOR or GL_ONE_MINUS_DST_COLOR for source in alpha channel so use their alpha equivalent instead @@ -1227,7 +1272,7 @@ void Renderer::SetBlendMode(bool forceUpdate) // we can't use GL_SRC_COLOR or GL_ONE_MINUS_SRC_COLOR for destination in alpha channel so use their alpha equivalent instead if (dstidx == GX_BL_SRCCLR) dstidx = GX_BL_SRCALPHA; if (dstidx == GX_BL_INVSRCCLR) dstidx = GX_BL_INVSRCALPHA; - } + } GLenum srcFactorAlpha = glSrcFactors[srcidx]; GLenum dstFactorAlpha = glDestFactors[dstidx]; // blend RGB change @@ -1247,7 +1292,7 @@ void DumpFrame(const std::vector& data, int w, int h) } // This function has the final picture. We adjust the aspect ratio here. -void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) +void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) { static int w = 0, h = 0; if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight) @@ -1257,7 +1302,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons return; } - if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2; u32 xfbCount = 0; const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount); if (g_ActiveConfig.VirtualXFBEnabled() && (!xfbSourceList || xfbCount == 0)) @@ -1277,7 +1321,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons int tmp = flipped_trc.top; flipped_trc.top = flipped_trc.bottom; flipped_trc.bottom = tmp; - + GL_REPORT_ERRORD(); // Copy the framebuffer to screen. @@ -1288,7 +1332,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons { // Render to the real/postprocessing buffer now. PostProcessing::BindTargetFramebuffer(); - + // draw each xfb source glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferManager::GetXFBFramebuffer()); @@ -1311,12 +1355,12 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons int xfbHeight = xfbSource->srcHeight; int xfbWidth = xfbSource->srcWidth; int hOffset = ((s32)xfbSource->srcAddr - (s32)xfbAddr) / ((s32)fbWidth * 2); - + drawRc.top = flipped_trc.top - hOffset * flipped_trc.GetHeight() / fbHeight; drawRc.bottom = flipped_trc.top - (hOffset + xfbHeight) * flipped_trc.GetHeight() / fbHeight; drawRc.left = flipped_trc.left + (flipped_trc.GetWidth() - xfbWidth * flipped_trc.GetWidth() / fbWidth)/2; drawRc.right = flipped_trc.left + (flipped_trc.GetWidth() + xfbWidth * flipped_trc.GetWidth() / fbWidth)/2; - + // The following code disables auto stretch. Kept for reference. // scale draw area for a 1 to 1 pixel mapping with the draw target //float vScale = (float)fbHeight / (float)flipped_trc.GetHeight(); @@ -1341,22 +1385,22 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons else { TargetRectangle targetRc = ConvertEFBRectangle(rc); - + // for msaa mode, we must resolve the efb content to non-msaa FramebufferManager::ResolveAndGetRenderTarget(rc); - + // Render to the real/postprocessing buffer now. (resolve have changed this in msaa mode) PostProcessing::BindTargetFramebuffer(); - + // always the non-msaa fbo GLuint fb = s_MSAASamples>1?FramebufferManager::GetResolvedFramebuffer():FramebufferManager::GetEFBFramebuffer(); - + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb); glBlitFramebuffer(targetRc.left, targetRc.bottom, targetRc.right, targetRc.top, flipped_trc.left, flipped_trc.bottom, flipped_trc.right, flipped_trc.top, GL_COLOR_BUFFER_BIT, GL_LINEAR); } - + PostProcessing::BlitToScreen(); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); @@ -1410,7 +1454,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons #ifndef _WIN32 FlipImageData(&frame_data[0], w, h); #endif - + AVIDump::AddFrame(&frame_data[0], w, h); } @@ -1509,7 +1553,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons s_MSAASamples = GetNumMSAASamples(s_LastMultisampleMode); s_MSAACoverageSamples = GetNumMSAACoverageSamples(s_LastMultisampleMode); ApplySSAASettings(); - + delete g_framebuffer_manager; g_framebuffer_manager = new FramebufferManager(s_target_width, s_target_height, s_MSAASamples, s_MSAACoverageSamples); @@ -1519,35 +1563,36 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons if (XFBWrited) s_fps = UpdateFPSCounter(); // --------------------------------------------------------------------- - GL_REPORT_ERRORD(); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if (!DriverDetails::HasBug(DriverDetails::BUG_BROKENSWAP)) + { + GL_REPORT_ERRORD(); - DrawDebugInfo(); - DrawDebugText(); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - GL_REPORT_ERRORD(); - - // Do our OSD callbacks - OSD::DoCallbacks(OSD::OSD_ONFRAME); - OSD::DrawMessages(); - GL_REPORT_ERRORD(); + DrawDebugInfo(); + DrawDebugText(); + GL_REPORT_ERRORD(); + + // Do our OSD callbacks + OSD::DoCallbacks(OSD::OSD_ONFRAME); + OSD::DrawMessages(); + GL_REPORT_ERRORD(); + } // Copy the rendered frame to the real window GLInterface->Swap(); GL_REPORT_ERRORD(); // Clear framebuffer - if(!g_ActiveConfig.bAnaglyphStereo) + if (!DriverDetails::HasBug(DriverDetails::BUG_BROKENSWAP)) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + GL_REPORT_ERRORD(); } - GL_REPORT_ERRORD(); - if(s_vsync != g_ActiveConfig.IsVSync()) { s_vsync = g_ActiveConfig.IsVSync(); @@ -1582,7 +1627,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons // For testing zbuffer targets. // Renderer::SetZBufferRender(); - // SaveTexture("tex.tga", GL_TEXTURE_2D, s_FakeZTarget, + // SaveTexture("tex.png", GL_TEXTURE_2D, s_FakeZTarget, // GetTargetWidth(), GetTargetHeight()); Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); XFBWrited = false; @@ -1600,6 +1645,9 @@ void Renderer::ResetAPIState() glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_BLEND); +#ifndef USE_GLES3 + glDisable(GL_COLOR_LOGIC_OP); +#endif glDepthMask(GL_FALSE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } @@ -1613,16 +1661,17 @@ void Renderer::RestoreAPIState() SetColorMask(); SetDepthMode(); SetBlendMode(true); - VertexShaderManager::SetViewportChanged(); + SetLogicOpMode(); + UpdateViewport(); #ifndef USE_GLES3 glPolygonMode(GL_FRONT_AND_BACK, g_ActiveConfig.bWireFrame ? GL_LINE : GL_FILL); #endif - + VertexManager *vm = (OGL::VertexManager*)g_vertex_manager; glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers); vm->m_last_vao = 0; - + TextureCache::SetStage(); } @@ -1730,7 +1779,7 @@ void Renderer::SetSamplerState(int stage, int texindex) auto const& tex = bpmem.tex[texindex]; auto const& tm0 = tex.texMode0[stage]; auto const& tm1 = tex.texMode1[stage]; - + g_sampler_cache->SetSamplerState((texindex * 4) + stage, tm0, tm1); } @@ -1739,69 +1788,21 @@ void Renderer::SetInterlacingMode() // TODO } -void Renderer::FlipImageData(u8 *data, int w, int h) +void Renderer::FlipImageData(u8 *data, int w, int h, int pixel_width) { // Flip image upside down. Damn OpenGL. - for (int y = 0; y < h / 2; y++) + for (int y = 0; y < h / 2; ++y) { - for(int x = 0; x < w; x++) + for(int x = 0; x < w; ++x) { - std::swap(data[(y * w + x) * 3], data[((h - 1 - y) * w + x) * 3]); - std::swap(data[(y * w + x) * 3 + 1], data[((h - 1 - y) * w + x) * 3 + 1]); - std::swap(data[(y * w + x) * 3 + 2], data[((h - 1 - y) * w + x) * 3 + 2]); + for (auto delta = 0; delta < pixel_width; ++delta) + std::swap(data[(y * w + x) * pixel_width + delta], data[((h - 1 - y) * w + x) * pixel_width + delta]); } } } } -// TODO: remove -extern bool g_aspect_wide; - -#if defined(HAVE_WX) && HAVE_WX -void TakeScreenshot(ScrStrct* threadStruct) -{ - // These will contain the final image size - float FloatW = (float)threadStruct->W; - float FloatH = (float)threadStruct->H; - - // Handle aspect ratio for the final ScrStrct to look exactly like what's on screen. - if (g_ActiveConfig.iAspectRatio != ASPECT_STRETCH) - { - bool use16_9 = g_aspect_wide; - - // Check for force-settings and override. - if (g_ActiveConfig.iAspectRatio == ASPECT_FORCE_16_9) - use16_9 = true; - else if (g_ActiveConfig.iAspectRatio == ASPECT_FORCE_4_3) - use16_9 = false; - - float Ratio = (FloatW / FloatH) / (!use16_9 ? (4.0f / 3.0f) : (16.0f / 9.0f)); - - // If ratio > 1 the picture is too wide and we have to limit the width. - if (Ratio > 1) - FloatW /= Ratio; - // ratio == 1 or the image is too high, we have to limit the height. - else - FloatH *= Ratio; - - // This is a bit expensive on high resolutions - threadStruct->img->Rescale((int)FloatW, (int)FloatH, wxIMAGE_QUALITY_HIGH); - } - - // Save the screenshot and finally kill the wxImage object - // This is really expensive when saving to PNG, but not at all when using BMP - threadStruct->img->SaveFile(StrToWxStr(threadStruct->filename), - wxBITMAP_TYPE_PNG); - threadStruct->img->Destroy(); - - // Show success messages - OSD::AddMessage(StringFromFormat("Saved %i x %i %s", (int)FloatW, (int)FloatH, - threadStruct->filename.c_str()).c_str(), 2000); - delete threadStruct; -} -#endif - namespace OGL { @@ -1809,48 +1810,26 @@ bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle { u32 W = back_rc.GetWidth(); u32 H = back_rc.GetHeight(); - u8 *data = (u8 *)malloc((sizeof(u8) * 3 * W * H)); + u8 *data = new u8[W * 4 * H]; glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(back_rc.left, back_rc.bottom, W, H, GL_RGB, GL_UNSIGNED_BYTE, data); + glReadPixels(back_rc.left, back_rc.bottom, W, H, GL_RGBA, GL_UNSIGNED_BYTE, data); // Show failure message if (GL_REPORT_ERROR() != GL_NO_ERROR) { - free(data); + delete[] data; OSD::AddMessage("Error capturing or saving screenshot.", 2000); return false; } // Turn image upside down - FlipImageData(data, W, H); + FlipImageData(data, W, H, 4); + bool success = TextureToPng(data, W*4, filename, W, H, false); + delete[] data; -#if defined(HAVE_WX) && HAVE_WX - // Create wxImage - wxImage *a = new wxImage(W, H, data); + return success; - if (scrshotThread.joinable()) - scrshotThread.join(); - - ScrStrct *threadStruct = new ScrStrct; - threadStruct->filename = filename; - threadStruct->img = a; - threadStruct->H = H; threadStruct->W = W; - - scrshotThread = std::thread(TakeScreenshot, threadStruct); -#ifdef _WIN32 - SetThreadPriority(scrshotThread.native_handle(), THREAD_PRIORITY_BELOW_NORMAL); -#endif - bool result = true; - - OSD::AddMessage("Saving Screenshot... ", 2000); - -#else - bool result = SaveTGA(filename.c_str(), W, H, data); - free(data); -#endif - - return result; } } diff --git a/Source/Core/VideoBackends/OGL/Src/Render.h b/Source/Core/VideoBackends/OGL/Src/Render.h new file mode 100644 index 0000000000..0cda2f4c0e --- /dev/null +++ b/Source/Core/VideoBackends/OGL/Src/Render.h @@ -0,0 +1,91 @@ + +#ifndef _RENDER_H_ +#define _RENDER_H_ + +#include "RenderBase.h" + +namespace OGL +{ + +void ClearEFBCache(); + +enum GLSL_VERSION { + GLSL_130, + GLSL_140, + GLSL_150, // and above + GLSLES2, + GLSLES3 +}; + +// ogl-only config, so not in VideoConfig.h +extern struct VideoConfig { + bool bSupportsGLSLCache; + bool bSupportsGLPinnedMemory; + bool bSupportsGLSync; + bool bSupportsGLBaseVertex; + bool bSupportCoverageMSAA; + bool bSupportSampleShading; + GLSL_VERSION eSupportedGLSLVersion; + bool bSupportOGL31; + bool bSupportViewportFloat; + + const char *gl_vendor; + const char *gl_renderer; + const char* gl_version; + const char* glsl_version; + + s32 max_samples; +} g_ogl_config; + +class Renderer : public ::Renderer +{ +public: + Renderer(); + ~Renderer(); + + static void Init(); + static void Shutdown(); + + void SetColorMask() override; + void SetBlendMode(bool forceUpdate) override; + void SetScissorRect(const TargetRectangle& rc) override; + void SetGenerationMode() override; + void SetDepthMode() override; + void SetLogicOpMode() override; + void SetDitherMode() override; + void SetLineWidth() override; + void SetSamplerState(int stage,int texindex) override; + void SetInterlacingMode() override; + + // TODO: Implement and use these + void ApplyState(bool bUseDstAlpha) override {} + void RestoreState() override {} + + void RenderText(const char* pstr, int left, int top, u32 color) override; + void DrawDebugInfo(); + void FlipImageData(u8 *data, int w, int h, int pixel_width = 3); + + u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override; + + void ResetAPIState() override; + void RestoreAPIState() override; + + TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override; + + void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma) override; + + void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z) override; + + void ReinterpretPixelData(unsigned int convtype) override; + + void UpdateViewport() override; + + bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); + +private: + void UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data); +}; + +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp b/Source/Core/VideoBackends/OGL/Src/SamplerCache.cpp similarity index 90% rename from Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp rename to Source/Core/VideoBackends/OGL/Src/SamplerCache.cpp index 8f986cd6c7..8419777fae 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp +++ b/Source/Core/VideoBackends/OGL/Src/SamplerCache.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include "DriverDetails.h" #include "SamplerCache.h" namespace OGL @@ -15,29 +16,32 @@ SamplerCache::SamplerCache() SamplerCache::~SamplerCache() { - Clear(); + if (!DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + Clear(); } void SamplerCache::SetSamplerState(int stage, const TexMode0& tm0, const TexMode1& tm1) { + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + return; // TODO: can this go somewhere else? if (m_last_max_anisotropy != g_ActiveConfig.iMaxAnisotropy) { m_last_max_anisotropy = g_ActiveConfig.iMaxAnisotropy; Clear(); } - + Params params(tm0, tm1); - + // take equivalent forced linear when bForceFiltering if (g_ActiveConfig.bForceFiltering) { params.tm0.min_filter |= 0x4; params.tm0.mag_filter |= 0x1; } - + // TODO: Should keep a circular buffer for each stage of recently used samplers. - + auto& active_sampler = m_active_samplers[stage]; if (active_sampler.first != params || !active_sampler.second.sampler_id) { @@ -56,11 +60,11 @@ auto SamplerCache::GetEntry(const Params& params) -> Value& // Sampler not found in cache, create it. glGenSamplers(1, &val.sampler_id); SetParameters(val.sampler_id, params); - + // TODO: Maybe kill old samplers if the cache gets huge. It doesn't seem to get huge though. //ERROR_LOG(VIDEO, "Sampler cache size is now %ld.", m_cache.size()); } - + return val; } @@ -77,7 +81,7 @@ void SamplerCache::SetParameters(GLuint sampler_id, const Params& params) GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, }; - + static const GLint wrap_settings[4] = { GL_CLAMP_TO_EDGE, @@ -85,16 +89,16 @@ void SamplerCache::SetParameters(GLuint sampler_id, const Params& params) GL_MIRRORED_REPEAT, GL_REPEAT, }; - + auto& tm0 = params.tm0; auto& tm1 = params.tm1; - glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, min_filters[tm0.min_filter % ARRAYSIZE(min_filters)]); + glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, min_filters[tm0.min_filter % ArraySize(min_filters)]); glSamplerParameteri(sampler_id, GL_TEXTURE_MAG_FILTER, tm0.mag_filter ? GL_LINEAR : GL_NEAREST); glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, wrap_settings[tm0.wrap_s]); glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_T, wrap_settings[tm0.wrap_t]); - + glSamplerParameterf(sampler_id, GL_TEXTURE_MIN_LOD, tm1.min_lod / 16.f); glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_LOD, tm1.max_lod / 16.f); @@ -108,9 +112,9 @@ void SamplerCache::SetParameters(GLuint sampler_id, const Params& params) void SamplerCache::Clear() { - for (auto it = m_cache.begin(); it != m_cache.end(); ++it) + for (auto& p : m_cache) { - glDeleteSamplers(1, &it->second.sampler_id); + glDeleteSamplers(1, &p.second.sampler_id); } m_cache.clear(); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.h b/Source/Core/VideoBackends/OGL/Src/SamplerCache.h similarity index 97% rename from Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.h rename to Source/Core/VideoBackends/OGL/Src/SamplerCache.h index 81180d2a7a..4de716b27d 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.h +++ b/Source/Core/VideoBackends/OGL/Src/SamplerCache.h @@ -15,10 +15,10 @@ class SamplerCache : NonCopyable public: SamplerCache(); ~SamplerCache(); - + void SetSamplerState(int stage, const TexMode0& tm0, const TexMode1& tm1); void Clear(); - + private: struct Params { @@ -29,47 +29,47 @@ private: TexMode0 tm0; TexMode1 tm1; }; - + u64 hex; }; - + Params() : hex() {} - + Params(const TexMode0& _tm0, const TexMode1& _tm1) : tm0(_tm0) , tm1(_tm1) { static_assert(sizeof(Params) == 8, "Assuming I can treat this as a 64bit int."); } - + bool operator<(const Params& other) const { return hex < other.hex; } - + bool operator!=(const Params& other) const { return hex != other.hex; } }; - + struct Value { Value() : sampler_id() {} - + GLuint sampler_id; }; - + void SetParameters(GLuint sampler_id, const Params& params); Value& GetEntry(const Params& params); std::map m_cache; std::pair m_active_samplers[8]; - + int m_last_max_anisotropy; }; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp similarity index 82% rename from Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp rename to Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp index af013467eb..f6630c0d09 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp @@ -7,6 +7,8 @@ #include "StreamBuffer.h" #include "MemoryUtil.h" #include "Render.h" +#include "DriverDetails.h" +#include "OnScreenDisplay.h" namespace OGL { @@ -18,27 +20,36 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType) : m_uploadtype(uploadType), m_buffertype(type), m_size(size) { glGenBuffers(1, &m_buffer); - + bool nvidia = !strcmp(g_ogl_config.gl_vendor, "NVIDIA Corporation"); - + if(m_uploadtype & STREAM_DETECT) { - if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)) - m_uploadtype = BUFFERDATA; - else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA)) + // TODO: move this to InitBackendInfo + if(g_ActiveConfig.bHackedBufferUpload && DriverDetails::HasBug(DriverDetails::BUG_BROKENHACKEDBUFFER)) + { + OSD::AddMessage("Vertex Streaming Hack isn't supported by your GPU.", 10000); + g_ActiveConfig.bHackedBufferUpload = false; + g_Config.bHackedBufferUpload = false; + } + + if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA) + && !DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) m_uploadtype = BUFFERSUBDATA; - else if(g_ogl_config.bSupportsGLSync && g_Config.bHackedBufferUpload && (m_uploadtype & MAP_AND_RISK)) + else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)) + m_uploadtype = BUFFERDATA; + else if(g_ogl_config.bSupportsGLSync && g_ActiveConfig.bHackedBufferUpload && (m_uploadtype & MAP_AND_RISK)) m_uploadtype = MAP_AND_RISK; - else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory && (m_uploadtype & PINNED_MEMORY)) + else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory && !(DriverDetails::HasBug(DriverDetails::BUG_BROKENPINNEDMEMORY) && type == GL_ELEMENT_ARRAY_BUFFER) && (m_uploadtype & PINNED_MEMORY)) m_uploadtype = PINNED_MEMORY; else if(nvidia && (m_uploadtype & BUFFERSUBDATA)) m_uploadtype = BUFFERSUBDATA; else if(g_ogl_config.bSupportsGLSync && (m_uploadtype & MAP_AND_SYNC)) m_uploadtype = MAP_AND_SYNC; - else + else m_uploadtype = MAP_AND_ORPHAN; } - + Init(); } @@ -48,7 +59,7 @@ StreamBuffer::~StreamBuffer() glDeleteBuffers(1, &m_buffer); } -#define SLOT(x) (x)*SYNC_POINTS/m_size +#define SLOT(x) ((x)*SYNC_POINTS/m_size) void StreamBuffer::Alloc ( size_t size, u32 stride ) { @@ -58,7 +69,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) m_iterator_aligned = m_iterator_aligned - (m_iterator_aligned % stride) + stride; } size_t iter_end = m_iterator_aligned + size; - + switch(m_uploadtype) { case MAP_AND_ORPHAN: if(iter_end >= m_size) { @@ -68,33 +79,35 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) break; case MAP_AND_SYNC: case PINNED_MEMORY: - + // insert waiting slots for used memory - for(u32 i=SLOT(m_used_iterator); i= m_size) { - + // insert waiting slots in unused space at the end of the buffer - for(u32 i=SLOT(m_used_iterator); i < SYNC_POINTS; i++) + for (size_t i = SLOT(m_used_iterator); i < SYNC_POINTS; i++) + { fences[i] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - + } + // move to the start m_used_iterator = m_iterator_aligned = m_iterator = 0; // offset 0 is always aligned iter_end = size; - + // wait for space at the start for(u32 i=0; i<=SLOT(iter_end); i++) { @@ -103,7 +116,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) } m_free_iterator = iter_end; } - + break; case MAP_AND_RISK: if(iter_end >= m_size) { @@ -159,13 +172,13 @@ void StreamBuffer::Init() m_iterator = 0; m_used_iterator = 0; m_free_iterator = 0; - + switch(m_uploadtype) { case MAP_AND_SYNC: fences = new GLsync[SYNC_POINTS]; for(u32 i=0; i s_VBO; -bool SaveTexture(const char* filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level) +bool SaveTexture(const std::string filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level) { #ifndef USE_GLES3 int width = std::max(virtual_width >> level, 1); int height = std::max(virtual_height >> level, 1); - std::vector data(width * height); + u8* data = new u8[width * height * 4]; glActiveTexture(GL_TEXTURE0+9); glBindTexture(textarget, tex); - glGetTexImage(textarget, level, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]); + glGetTexImage(textarget, level, GL_RGBA, GL_UNSIGNED_BYTE, data); glBindTexture(textarget, 0); TextureCache::SetStage(); @@ -77,10 +75,12 @@ bool SaveTexture(const char* filename, u32 textarget, u32 tex, int virtual_width if (GL_NO_ERROR != err) { PanicAlert("Can't save texture, GL Error: %s", gluErrorString(err)); + delete[] data; return false; } - - return SaveTGA(filename, width, height, &data[0]); + bool success = TextureToPng(data, width * 4, filename, width, height, true); + delete[] data; + return success; #else return false; #endif @@ -90,9 +90,9 @@ TextureCache::TCacheEntry::~TCacheEntry() { if (texture) { - for(int i=0; i<8; i++) - if(s_Textures[i] == texture) - s_Textures[i] = 0; + for(auto& gtex : s_Textures) + if(gtex == texture) + gtex = 0; glDeleteTextures(1, &texture); texture = 0; } @@ -121,19 +121,15 @@ void TextureCache::TCacheEntry::Bind(unsigned int stage) glActiveTexture(GL_TEXTURE0 + stage); s_ActiveTexture = stage; } - + glBindTexture(GL_TEXTURE_2D, texture); s_Textures[stage] = texture; } } -bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) +bool TextureCache::TCacheEntry::Save(const std::string filename, unsigned int level) { - // TODO: make ogl dump PNGs - std::string tga_filename(filename); - tga_filename.replace(tga_filename.size() - 3, 3, "tga"); - - return SaveTexture(tga_filename.c_str(), GL_TEXTURE_2D, texture, virtual_width, virtual_height, level); + return SaveTexture(filename, GL_TEXTURE_2D, texture, virtual_width, virtual_height, level); } TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, @@ -150,7 +146,7 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, { default: case PC_TEX_FMT_NONE: - PanicAlert("Invalid PC texture format %i", pcfmt); + PanicAlert("Invalid PC texture format %i", pcfmt); case PC_TEX_FMT_BGRA32: gl_format = GL_BGRA; gl_iformat = GL_RGBA; @@ -202,7 +198,7 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, entry.pcfmt = pcfmt; entry.m_tex_levels = tex_levels; - + entry.Load(width, height, expanded_width, 0); return &entry; @@ -266,7 +262,7 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( glTexImage2D(GL_TEXTURE_2D, 0, gl_iformat, scaled_tex_w, scaled_tex_h, 0, gl_format, gl_type, NULL); glBindTexture(GL_TEXTURE_2D, 0); - + glGenFramebuffers(1, &entry->framebuffer); FramebufferManager::SetFramebuffer(entry->framebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, entry->texture, 0); @@ -357,7 +353,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo glBindBuffer(GL_ARRAY_BUFFER, vbo_it->second.vbo); glBufferData(GL_ARRAY_BUFFER, 4*4*sizeof(GLfloat), vertices, GL_STREAM_DRAW); - + vbo_it->second.targetSource = targetSource; } @@ -372,10 +368,10 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo int encoded_size = TextureConverter::EncodeToRamFromTexture( addr, read_texture, - srcFormat == PIXELFMT_Z24, - isIntensity, - dstFormat, - scaleByHalf, + srcFormat == PIXELFMT_Z24, + isIntensity, + dstFormat, + scaleByHalf, srcRect); u8* dst = Memory::GetPointer(addr); @@ -391,15 +387,14 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo } FramebufferManager::SetFramebuffer(0); - VertexShaderManager::SetViewportChanged(); GL_REPORT_ERRORD(); if (g_ActiveConfig.bDumpEFBTarget) { static int count = 0; - SaveTexture(StringFromFormat("%sefb_frame_%i.tga", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(), - count++).c_str(), GL_TEXTURE_2D, texture, virtual_width, virtual_height, 0); + SaveTexture(StringFromFormat("%sefb_frame_%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(), + count++), GL_TEXTURE_2D, texture, virtual_width, virtual_height, 0); } g_renderer->RestoreAPIState(); @@ -407,7 +402,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo TextureCache::TextureCache() { - const char *pColorMatrixProg = + const char *pColorMatrixProg = "uniform sampler2DRect samp9;\n" "uniform vec4 colmat[7];\n" "VARYIN vec2 uv0;\n" @@ -427,8 +422,8 @@ TextureCache::TextureCache() "\n" "void main(){\n" " vec4 texcol = texture2DRect(samp9, uv0);\n" - " vec4 EncodedDepth = fract((texcol.r * (16777215.0f/16777216.0f)) * vec4(1.0f,256.0f,256.0f*256.0f,1.0f));\n" - " texcol = round(EncodedDepth * (16777216.0f/16777215.0f) * vec4(255.0f,255.0f,255.0f,15.0f)) / vec4(255.0f,255.0f,255.0f,15.0f);\n" + " vec4 EncodedDepth = fract((texcol.r * (16777215.0/16777216.0)) * vec4(1.0,256.0,256.0*256.0,1.0));\n" + " texcol = round(EncodedDepth * (16777216.0/16777215.0) * vec4(255.0,255.0,255.0,15.0)) / vec4(255.0,255.0,255.0,15.0);\n" " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];" "}\n"; @@ -452,8 +447,8 @@ TextureCache::TextureCache() s_ActiveTexture = -1; s_NextStage = -1; - for(int i=0; i<8; i++) - s_Textures[i] = -1; + for(auto& gtex : s_Textures) + gtex = -1; } @@ -461,10 +456,10 @@ TextureCache::~TextureCache() { s_ColorMatrixProgram.Destroy(); s_DepthMatrixProgram.Destroy(); - - for(std::map::iterator it = s_VBO.begin(); it != s_VBO.end(); it++) { - glDeleteBuffers(1, &it->second.vbo); - glDeleteVertexArrays(1, &it->second.vao); + + for(auto& cache : s_VBO) { + glDeleteBuffers(1, &cache.second.vbo); + glDeleteVertexArrays(1, &cache.second.vao); } s_VBO.clear(); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.h b/Source/Core/VideoBackends/OGL/Src/TextureCache.h similarity index 77% rename from Source/Plugins/Plugin_VideoOGL/Src/TextureCache.h rename to Source/Core/VideoBackends/OGL/Src/TextureCache.h index 137d26704b..af1b60bc06 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.h +++ b/Source/Core/VideoBackends/OGL/Src/TextureCache.h @@ -45,26 +45,26 @@ private: ~TCacheEntry(); void Load(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int level); + unsigned int expanded_width, unsigned int level) override; void FromRenderTarget(u32 dstAddr, unsigned int dstFormat, unsigned int srcFormat, const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf, unsigned int cbufid, - const float *colmat); + const float *colmat) override; - void Bind(unsigned int stage); - bool Save(const char filename[], unsigned int level); + void Bind(unsigned int stage) override; + bool Save(const std::string filename, unsigned int level); }; ~TextureCache(); TCacheEntryBase* CreateTexture(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt); + unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt) override; - TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h); + TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h) override; }; -bool SaveTexture(const char* filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level); +bool SaveTexture(const std::string filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Core/VideoBackends/OGL/Src/TextureConverter.cpp similarity index 88% rename from Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp rename to Source/Core/VideoBackends/OGL/Src/TextureConverter.cpp index 0ceac2d283..0c1800381e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Core/VideoBackends/OGL/Src/TextureConverter.cpp @@ -5,13 +5,10 @@ // Fast image conversion using OpenGL shaders. // This kind of stuff would be a LOT nicer with OpenCL. -#include - #include "TextureConverter.h" #include "TextureConversionShader.h" #include "TextureCache.h" #include "ProgramShaderCache.h" -#include "VertexShaderManager.h" #include "FramebufferManager.h" #include "Globals.h" #include "VideoConfig.h" @@ -19,6 +16,7 @@ #include "Render.h" #include "FileUtil.h" #include "HW/Memmap.h" +#include "DriverDetails.h" namespace OGL { @@ -32,7 +30,7 @@ static GLuint s_texConvFrameBuffer = 0; static GLuint s_srcTexture = 0; // for decoding from RAM static GLuint s_srcTextureWidth = 0; static GLuint s_srcTextureHeight = 0; -static GLuint s_dstRenderBuffer = 0; // for encoding to RAM +static GLuint s_dstTexture = 0; // for encoding to RAM const int renderBufferWidth = 1024; const int renderBufferHeight = 1024; @@ -59,7 +57,7 @@ static const char *VProgram = "void main()\n" "{\n" " uv0 = tex0;\n" - " gl_Position = vec4(rawpos, 0.0f, 1.0f);\n" + " gl_Position = vec4(rawpos, 0.0, 1.0);\n" "}\n"; void CreatePrograms() @@ -77,7 +75,7 @@ void CreatePrograms() " vec3 y_const = vec3(0.257,0.504,0.098);\n" " vec3 u_const = vec3(-0.148,-0.291,0.439);\n" " vec3 v_const = vec3(0.439,-0.368,-0.071);\n" - " vec4 const3 = vec4(0.0625,0.5,0.0625f,0.5);\n" + " vec4 const3 = vec4(0.0625,0.5,0.0625,0.5);\n" " ocol0 = vec4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" "}\n"; @@ -90,13 +88,13 @@ void CreatePrograms() " vec4 c0 = texture2DRect(samp9, uv0).rgba;\n" " float f = step(0.5, fract(uv0.x));\n" " float y = mix(c0.b, c0.r, f);\n" - " float yComp = 1.164f * (y - 0.0625f);\n" - " float uComp = c0.g - 0.5f;\n" - " float vComp = c0.a - 0.5f;\n" - " ocol0 = vec4(yComp + (1.596f * vComp),\n" - " yComp - (0.813f * vComp) - (0.391f * uComp),\n" - " yComp + (2.018f * uComp),\n" - " 1.0f);\n" + " float yComp = 1.164 * (y - 0.0625);\n" + " float uComp = c0.g - 0.5;\n" + " float vComp = c0.a - 0.5;\n" + " ocol0 = vec4(yComp + (1.596 * vComp),\n" + " yComp - (0.813 * vComp) - (0.391 * uComp),\n" + " yComp + (2.018 * uComp),\n" + " 1.0);\n" "}\n"; ProgramShaderCache::CompileShader(s_rgbToYuyvProgram, VProgram, FProgramRgbToYuyv); @@ -159,11 +157,6 @@ void Init() glEnableVertexAttribArray(SHADER_TEXTURE0_ATTRIB); glVertexAttribPointer(SHADER_TEXTURE0_ATTRIB, 2, GL_FLOAT, 0, sizeof(GLfloat)*4, (GLfloat*)NULL+2); - glGenRenderbuffers(1, &s_dstRenderBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, s_dstRenderBuffer); - - glRenderbufferStorage(GL_RENDERBUFFER, GLRENDERBUFFERFORMAT, renderBufferWidth, renderBufferHeight); - s_srcTextureWidth = 0; s_srcTextureHeight = 0; @@ -171,14 +164,19 @@ void Init() glGenTextures(1, &s_srcTexture); glBindTexture(getFbType(), s_srcTexture); glTexParameteri(getFbType(), GL_TEXTURE_MAX_LEVEL, 0); - + + glGenTextures(1, &s_dstTexture); + glBindTexture(GL_TEXTURE_2D, s_dstTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderBufferWidth, renderBufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + CreatePrograms(); } void Shutdown() { glDeleteTextures(1, &s_srcTexture); - glDeleteRenderbuffers(1, &s_dstRenderBuffer); + glDeleteTextures(1, &s_dstTexture); glDeleteFramebuffers(1, &s_texConvFrameBuffer); glDeleteBuffers(1, &s_encode_VBO ); glDeleteVertexArrays(1, &s_encode_VAO ); @@ -188,11 +186,11 @@ void Shutdown() s_rgbToYuyvProgram.Destroy(); s_yuyvToRgbProgram.Destroy(); - for (unsigned int i = 0; i < NUM_ENCODING_PROGRAMS; i++) - s_encodingPrograms[i].Destroy(); + for (auto& program : s_encodingPrograms) + program.Destroy(); s_srcTexture = 0; - s_dstRenderBuffer = 0; + s_dstTexture = 0; s_texConvFrameBuffer = 0; } @@ -206,8 +204,7 @@ void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc, // attach render buffer as color destination FramebufferManager::SetFramebuffer(s_texConvFrameBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, s_dstRenderBuffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, s_dstRenderBuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, s_dstTexture, 0); GL_REPORT_ERRORD(); // set source texture @@ -232,7 +229,7 @@ void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc, GL_REPORT_ERRORD(); if(!(s_cached_sourceRc == sourceRc)) { GLfloat vertices[] = { - -1.f, -1.f, + -1.f, -1.f, (float)sourceRc.left, (float)sourceRc.top, -1.f, 1.f, (float)sourceRc.left, (float)sourceRc.bottom, @@ -243,13 +240,13 @@ void EncodeToRamUsingShader(GLuint srcTexture, const TargetRectangle& sourceRc, }; glBindBuffer(GL_ARRAY_BUFFER, s_encode_VBO ); glBufferData(GL_ARRAY_BUFFER, 4*4*sizeof(GLfloat), vertices, GL_STREAM_DRAW); - + s_cached_sourceRc = sourceRc; - } + } glBindVertexArray( s_encode_VAO ); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + GL_REPORT_ERRORD(); // .. and then read back the results. @@ -306,16 +303,16 @@ int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, int size_in_bytes = TexDecoder_GetTextureSizeInBytes(width, height, format); u16 blkW = TexDecoder_GetBlockWidthInTexels(format) - 1; - u16 blkH = TexDecoder_GetBlockHeightInTexels(format) - 1; - u16 samples = TextureConversionShader::GetEncodedSampleCount(format); + u16 blkH = TexDecoder_GetBlockHeightInTexels(format) - 1; + u16 samples = TextureConversionShader::GetEncodedSampleCount(format); // only copy on cache line boundaries // extra pixels are copied but not displayed in the resulting texture s32 expandedWidth = (width + blkW) & (~blkW); s32 expandedHeight = (height + blkH) & (~blkH); - + float sampleStride = bScaleByHalf ? 2.f : 1.f; - + float params[] = { Renderer::EFBToScaledXf(sampleStride), Renderer::EFBToScaledYf(sampleStride), 0.0f, 0.0f, @@ -324,7 +321,7 @@ int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, }; texconv_shader.Bind(); - glUniform4fv(texconv_shader.UniformLocations[C_COLORS], 2, params); + glUniform4fv(texconv_shader.UniformLocations[0], 2, params); TargetRectangle scaledSource; scaledSource.top = 0; @@ -347,12 +344,11 @@ int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight) { g_renderer->ResetAPIState(); - + s_rgbToYuyvProgram.Bind(); - + EncodeToRamUsingShader(srcTexture, sourceRc, destAddr, dstWidth / 2, dstHeight, 0, false, false); FramebufferManager::SetFramebuffer(0); - VertexShaderManager::SetViewportChanged(); TextureCache::DisableStage(0); g_renderer->RestoreAPIState(); GL_REPORT_ERRORD(); @@ -360,7 +356,7 @@ void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* des // Should be scale free. -void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRenderbuf) +void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTexture) { u8* srcAddr = Memory::GetPointer(xfbAddr); if (!srcAddr) @@ -376,7 +372,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRender // switch to texture converter frame buffer // attach destTexture as color destination FramebufferManager::SetFramebuffer(s_texConvFrameBuffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, destRenderbuf); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0); GL_REPORT_FBO_ERROR(); @@ -393,7 +389,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRender } else { - glTexImage2D(getFbType(), 0, GL_RGBA8, (GLsizei)srcFmtWidth, (GLsizei)srcHeight, + glTexImage2D(getFbType(), 0, GL_RGBA, (GLsizei)srcFmtWidth, (GLsizei)srcHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, srcAddr); s_srcTextureWidth = (GLsizei)srcFmtWidth; s_srcTextureHeight = (GLsizei)srcHeight; @@ -403,7 +399,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRender s_yuyvToRgbProgram.Bind(); GL_REPORT_ERRORD(); - + if(s_cached_srcHeight != srcHeight || s_cached_srcWidth != srcWidth) { GLfloat vertices[] = { 1.f, -1.f, @@ -415,20 +411,18 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRender -1.f, 1.f, 0.f, 0.f }; - + glBindBuffer(GL_ARRAY_BUFFER, s_decode_VBO ); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*4*4, vertices, GL_STREAM_DRAW); - + s_cached_srcHeight = srcHeight; s_cached_srcWidth = srcWidth; } - + glBindVertexArray( s_decode_VAO ); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - GL_REPORT_ERRORD(); - VertexShaderManager::SetViewportChanged(); + GL_REPORT_ERRORD(); FramebufferManager::SetFramebuffer(0); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.h b/Source/Core/VideoBackends/OGL/Src/TextureConverter.h similarity index 97% rename from Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.h rename to Source/Core/VideoBackends/OGL/Src/TextureConverter.h index 02467197d6..24bfbbc2d2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.h +++ b/Source/Core/VideoBackends/OGL/Src/TextureConverter.h @@ -22,7 +22,7 @@ void Shutdown(); void EncodeToRamYUYV(GLuint srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight); -void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destRenderbuf); +void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTexture); // returns size of the encoded data (in bytes) int EncodeToRamFromTexture(u32 address, GLuint source_texture, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp b/Source/Core/VideoBackends/OGL/Src/VertexManager.cpp similarity index 82% rename from Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp rename to Source/Core/VideoBackends/OGL/Src/VertexManager.cpp index 47f714cc47..1ff9b53e28 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp +++ b/Source/Core/VideoBackends/OGL/Src/VertexManager.cpp @@ -24,7 +24,6 @@ #include "VertexLoader.h" #include "VertexManager.h" #include "IndexGenerator.h" -#include "OpcodeDecoding.h" #include "FileUtil.h" #include "Debugger.h" #include "StreamBuffer.h" @@ -44,8 +43,8 @@ const u32 MAX_VBUFFER_SIZE = 16*1024*1024; static StreamBuffer *s_vertexBuffer; static StreamBuffer *s_indexBuffer; -static u32 s_baseVertex; -static u32 s_offset[3]; +static size_t s_baseVertex; +static size_t s_offset[3]; VertexManager::VertexManager() { @@ -61,9 +60,10 @@ void VertexManager::CreateDeviceObjects() { s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE); m_vertex_buffers = s_vertexBuffer->getBuffer(); - s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE, (StreamType)(DETECT_MASK & ~PINNED_MEMORY)); + + s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE); m_index_buffers = s_indexBuffer->getBuffer(); - + m_CurrentVertexFmt = NULL; m_last_vao = 0; } @@ -74,7 +74,7 @@ void VertexManager::DestroyDeviceObjects() glBindBuffer(GL_ARRAY_BUFFER, 0 ); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0 ); GL_REPORT_ERROR(); - + delete s_vertexBuffer; delete s_indexBuffer; GL_REPORT_ERROR(); @@ -87,9 +87,9 @@ void VertexManager::PrepareDrawBuffers(u32 stride) u32 line_index_size = IndexGenerator::GetLineindexLen(); u32 point_index_size = IndexGenerator::GetPointindexLen(); u32 index_size = (triangle_index_size+line_index_size+point_index_size) * sizeof(u16); - + s_vertexBuffer->Alloc(vertex_data_size, stride); - u32 offset = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size); + size_t offset = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size); s_baseVertex = offset / stride; s_indexBuffer->Alloc(index_size); @@ -105,7 +105,7 @@ void VertexManager::PrepareDrawBuffers(u32 stride) { s_offset[2] = s_indexBuffer->Upload((u8*)GetPointIndexBuffer(), point_index_size * sizeof(u16)); } - + ADDSTAT(stats.thisFrame.bytesVertexStreamed, vertex_data_size); ADDSTAT(stats.thisFrame.bytesIndexStreamed, index_size); } @@ -115,38 +115,57 @@ void VertexManager::Draw(u32 stride) u32 triangle_index_size = IndexGenerator::GetTriangleindexLen(); u32 line_index_size = IndexGenerator::GetLineindexLen(); u32 point_index_size = IndexGenerator::GetPointindexLen(); + u32 max_index = IndexGenerator::GetNumVerts(); GLenum triangle_mode = g_ActiveConfig.backend_info.bSupportsPrimitiveRestart?GL_TRIANGLE_STRIP:GL_TRIANGLES; - + if(g_ogl_config.bSupportsGLBaseVertex) { if (triangle_index_size > 0) { - glDrawRangeElementsBaseVertex(triangle_mode, 0, IndexGenerator::GetNumTriangles() * 3, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0], s_baseVertex); + glDrawRangeElementsBaseVertex(triangle_mode, 0, max_index, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0], (GLint)s_baseVertex); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } if (line_index_size > 0) { - glDrawRangeElementsBaseVertex(GL_LINES, 0, IndexGenerator::GetNumLines() * 2, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1], s_baseVertex); + glDrawRangeElementsBaseVertex(GL_LINES, 0, max_index, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1], (GLint)s_baseVertex); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } if (point_index_size > 0) { - glDrawRangeElementsBaseVertex(GL_POINTS, 0, IndexGenerator::GetNumPoints(), point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2], s_baseVertex); + glDrawRangeElementsBaseVertex(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2], (GLint)s_baseVertex); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } + } + else if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + { + if (triangle_index_size > 0) + { + glDrawElements(triangle_mode, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0]); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } + if (line_index_size > 0) + { + glDrawElements(GL_LINES, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1]); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } + if (point_index_size > 0) + { + glDrawElements(GL_POINTS, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } } else { if (triangle_index_size > 0) { - glDrawRangeElements(triangle_mode, 0, IndexGenerator::GetNumTriangles() * 3, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0]); + glDrawRangeElements(triangle_mode, 0, max_index, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0]); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } if (line_index_size > 0) { - glDrawRangeElements(GL_LINES, 0, IndexGenerator::GetNumLines() * 2, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1]); + glDrawRangeElements(GL_LINES, 0, max_index, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1]); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } if (point_index_size > 0) { - glDrawRangeElements(GL_POINTS, 0, IndexGenerator::GetNumPoints(), point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]); + glDrawRangeElements(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } } @@ -154,12 +173,12 @@ void VertexManager::Draw(u32 stride) void VertexManager::vFlush() { -#if defined(_DEBUG) || defined(DEBUGFAST) +#if defined(_DEBUG) || defined(DEBUGFAST) PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGen.numTexGens, xfregs.numChan.numColorChans, xfregs.dualTexTrans.enabled, bpmem.ztex2.op, bpmem.blendmode.colorupdate, bpmem.blendmode.alphaupdate, bpmem.zmode.updateenable); - for (unsigned int i = 0; i < xfregs.numChan.numColorChans; ++i) + for (unsigned int i = 0; i < xfregs.numChan.numColorChans; ++i) { LitChannel* ch = &xfregs.color[i]; PRIM_LOG("colchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); @@ -167,7 +186,7 @@ void VertexManager::vFlush() PRIM_LOG("alpchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); } - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) + for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) { TexMtxInfo tinfo = xfregs.texMtxInfo[i]; if (tinfo.texgentype != XF_TEXGEN_EMBOSS_MAP) tinfo.hex &= 0x7ff; @@ -183,10 +202,10 @@ void VertexManager::vFlush() #endif (void)GL_REPORT_ERROR(); - + GLVertexFormat *nativeVertexFmt = (GLVertexFormat*)g_nativeVertexFmt; u32 stride = nativeVertexFmt->GetVertexStride(); - + if(m_last_vao != nativeVertexFmt->VAO) { glBindVertexArray(nativeVertexFmt->VAO); m_last_vao = nativeVertexFmt->VAO; @@ -212,14 +231,14 @@ void VertexManager::vFlush() TextureCache::SetNextStage(i); g_renderer->SetSamplerState(i % 4, i / 4); FourTexUnits &tex = bpmem.tex[i >> 2]; - TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, + TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, - tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, + tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, tex.texTlut[i&3].tlut_format, - (tex.texMode0[i&3].min_filter & 3), + (0 != (tex.texMode0[i&3].min_filter & 3)), (tex.texMode1[i&3].max_lod + 0xf) / 0x10, - tex.texImage1[i&3].image_type); + (0 != tex.texImage1[i&3].image_type)); if (tentry) { @@ -260,7 +279,7 @@ void VertexManager::vFlush() VertexShaderManager::SetConstants(); PixelShaderManager::SetConstants(g_nativeVertexFmt->m_components); ProgramShaderCache::UploadConstants(); - + // setup the pointers if (g_nativeVertexFmt) g_nativeVertexFmt->SetupVertexPointers(); @@ -281,24 +300,24 @@ void VertexManager::vFlush() VertexShaderManager::SetConstants(); PixelShaderManager::SetConstants(g_nativeVertexFmt->m_components); } - + // only update alpha glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); glDisable(GL_BLEND); Draw(stride); - + // restore color mask g_renderer->SetColorMask(); - if (bpmem.blendmode.blendenable || bpmem.blendmode.subtract) + if (bpmem.blendmode.blendenable || bpmem.blendmode.subtract) glEnable(GL_BLEND); } GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); - + #if defined(_DEBUG) || defined(DEBUGFAST) - if (g_ActiveConfig.iLog & CONF_SAVESHADERS) + if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { // save the shaders ProgramShaderCache::PCacheEntry prog = ProgramShaderCache::GetShaderProgram(); @@ -313,10 +332,10 @@ void VertexManager::vFlush() fvs << prog.shader.strvprog.c_str(); } - if (g_ActiveConfig.iLog & CONF_SAVETARGETS) + if (g_ActiveConfig.iLog & CONF_SAVETARGETS) { char str[128]; - sprintf(str, "%starg%.3d.tga", File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), g_ActiveConfig.iSaveTargetId); + sprintf(str, "%starg%.3d.png", File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), g_ActiveConfig.iSaveTargetId); TargetRectangle tr; tr.left = 0; tr.right = Renderer::GetTargetWidth(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.h b/Source/Core/VideoBackends/OGL/Src/VertexManager.h similarity index 77% rename from Source/Plugins/Plugin_VideoOGL/Src/VertexManager.h rename to Source/Core/VideoBackends/OGL/Src/VertexManager.h index e31c8d48ec..f96ec7ec97 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.h +++ b/Source/Core/VideoBackends/OGL/Src/VertexManager.h @@ -19,9 +19,9 @@ namespace OGL GLVertexFormat(); ~GLVertexFormat(); - virtual void Initialize(const PortableVertexDeclaration &_vtx_decl); - virtual void SetupVertexPointers(); - + virtual void Initialize(const PortableVertexDeclaration &_vtx_decl) override; + virtual void SetupVertexPointers() override; + GLuint VAO; }; @@ -32,17 +32,17 @@ class VertexManager : public ::VertexManager public: VertexManager(); ~VertexManager(); - NativeVertexFormat* CreateNativeVertexFormat(); - void CreateDeviceObjects(); - void DestroyDeviceObjects(); - + NativeVertexFormat* CreateNativeVertexFormat() override; + void CreateDeviceObjects() override; + void DestroyDeviceObjects() override; + // NativeVertexFormat use this GLuint m_vertex_buffers; - GLuint m_index_buffers; + GLuint m_index_buffers; GLuint m_last_vao; private: void Draw(u32 stride); - void vFlush(); + void vFlush() override; void PrepareDrawBuffers(u32 stride); NativeVertexFormat *m_CurrentVertexFmt; }; diff --git a/Source/Core/VideoBackends/OGL/Src/VideoBackend.h b/Source/Core/VideoBackends/OGL/Src/VideoBackend.h new file mode 100644 index 0000000000..ed4a748eb4 --- /dev/null +++ b/Source/Core/VideoBackends/OGL/Src/VideoBackend.h @@ -0,0 +1,29 @@ + +#ifndef OGL_VIDEO_BACKEND_H_ +#define OGL_VIDEO_BACKEND_H_ + +#include "VideoBackendBase.h" + +namespace OGL +{ + +class VideoBackend : public VideoBackendHardware +{ + bool Initialize(void *&) override; + void Shutdown() override; + + std::string GetName() override; + std::string GetDisplayName() override; + + void Video_Prepare() override; + void Video_Cleanup() override; + + void ShowConfig(void* parent) override; + + void UpdateFPSDisplay(const char*) override; + unsigned int PeekMessages() override; +}; + +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Core/VideoBackends/OGL/Src/main.cpp similarity index 86% rename from Source/Plugins/Plugin_VideoOGL/Src/main.cpp rename to Source/Core/VideoBackends/OGL/Src/main.cpp index 1eb986fe74..7ad18bca25 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Core/VideoBackends/OGL/Src/main.cpp @@ -5,7 +5,7 @@ // OpenGL Backend Documentation -/* +/* 1.1 Display settings @@ -38,6 +38,7 @@ Make AA apply instantly during gameplay if possible #include "Globals.h" #include "Atomic.h" +#include "CommonPaths.h" #include "Thread.h" #include "LogManager.h" @@ -102,25 +103,37 @@ std::string VideoBackend::GetDisplayName() void GetShaders(std::vector &shaders) { + std::set already_found; + shaders.clear(); - if (File::IsDirectory(File::GetUserPath(D_SHADERS_IDX))) + static const std::string directories[] = { + File::GetUserPath(D_SHADERS_IDX), + File::GetSysDirectory() + SHADERS_DIR DIR_SEP, + }; + for (auto& directory : directories) { + if (!File::IsDirectory(directory)) + continue; + File::FSTEntry entry; - File::ScanDirectoryTree(File::GetUserPath(D_SHADERS_IDX), entry); - for (u32 i = 0; i < entry.children.size(); i++) + File::ScanDirectoryTree(directory, entry); + for (auto& file : entry.children) { - std::string name = entry.children[i].virtualName.c_str(); - if (!strcasecmp(name.substr(name.size() - 4).c_str(), ".txt")) { - name = name.substr(0, name.size() - 4); - shaders.push_back(name); - } + std::string name = file.virtualName.c_str(); + if (name.size() < 5) + continue; + if (strcasecmp(name.substr(name.size() - 5).c_str(), ".glsl")) + continue; + + name = name.substr(0, name.size() - 5); + if (already_found.find(name) != already_found.end()) + continue; + + already_found.insert(name); + shaders.push_back(name); } - std::sort(shaders.begin(), shaders.end()); - } - else - { - File::CreateDir(File::GetUserPath(D_SHADERS_IDX).c_str()); } + std::sort(shaders.begin(), shaders.end()); } void InitBackendInfo() @@ -133,6 +146,7 @@ void InitBackendInfo() g_Config.backend_info.bSupportsFormatReinterpretation = true; g_Config.backend_info.bSupportsPixelLighting = true; //g_Config.backend_info.bSupportsEarlyZ = true; // is gpu dependent and must be set in renderer + g_Config.backend_info.bSupportsOversizedViewports = true; // aamodes const char* caamodes[] = {_trans("None"), "2x", "4x", "8x", "8x CSAA", "8xQ CSAA", "16x CSAA", "16xQ CSAA", "4x SSAA"}; @@ -159,7 +173,7 @@ bool VideoBackend::Initialize(void *&window_handle) frameCount = 0; g_Config.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_opengl.ini").c_str()); - g_Config.GameIniLoad(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strGameIni.c_str()); + g_Config.GameIniLoad(); g_Config.UpdateProjectionHack(); g_Config.VerifyValidity(); UpdateActiveConfig(); @@ -168,7 +182,7 @@ bool VideoBackend::Initialize(void *&window_handle) if (!GLInterface->Create(window_handle)) return false; - // Do our OSD callbacks + // Do our OSD callbacks OSD::DoCallbacks(OSD::OSD_INIT); s_BackendInitialized = true; @@ -219,14 +233,14 @@ void VideoBackend::Shutdown() { s_BackendInitialized = false; - // Do our OSD callbacks + // Do our OSD callbacks OSD::DoCallbacks(OSD::OSD_SHUTDOWN); GLInterface->Shutdown(); } void VideoBackend::Video_Cleanup() { - + if (g_renderer) { s_efbAccessRequested = false; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.h b/Source/Core/VideoBackends/OGL/Src/main.h similarity index 100% rename from Source/Plugins/Plugin_VideoOGL/Src/main.h rename to Source/Core/VideoBackends/OGL/Src/main.h diff --git a/Source/Plugins/Plugin_VideoOGL/Src/stdafx.cpp b/Source/Core/VideoBackends/OGL/Src/stdafx.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoOGL/Src/stdafx.cpp rename to Source/Core/VideoBackends/OGL/Src/stdafx.cpp diff --git a/Source/Plugins/Plugin_VideoOGL/Src/stdafx.h b/Source/Core/VideoBackends/OGL/Src/stdafx.h similarity index 92% rename from Source/Plugins/Plugin_VideoOGL/Src/stdafx.h rename to Source/Core/VideoBackends/OGL/Src/stdafx.h index 2431184aaf..81bb44dc19 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/stdafx.h +++ b/Source/Core/VideoBackends/OGL/Src/stdafx.h @@ -9,4 +9,4 @@ #endif #include -#include +#include diff --git a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt b/Source/Core/VideoBackends/Software/CMakeLists.txt similarity index 87% rename from Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt rename to Source/Core/VideoBackends/Software/CMakeLists.txt index cda287f511..2ba8e6c0c7 100644 --- a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt +++ b/Source/Core/VideoBackends/Software/CMakeLists.txt @@ -36,7 +36,7 @@ if(USE_EGL) endif() if(USE_GLES) - set(SRCS ${SRCS} ../Plugin_VideoOGL/Src/GLUtil.cpp) + set(SRCS ${SRCS} ../OGL/Src/GLUtil.cpp) set(LIBS ${LIBS} GLESv2) else() @@ -49,5 +49,4 @@ if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) set(LIBS ${LIBS} clrun) endif() -add_library(videosoftware STATIC ${SRCS}) -target_link_libraries(videosoftware ${LIBS}) +add_dolphin_library(videosoftware "${SRCS}" "${LIBS}") diff --git a/Source/Core/VideoBackends/Software/Software.vcxproj b/Source/Core/VideoBackends/Software/Software.vcxproj new file mode 100644 index 0000000000..cd393dd437 --- /dev/null +++ b/Source/Core/VideoBackends/Software/Software.vcxproj @@ -0,0 +1,120 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {A4C423AA-F57C-46C7-A172-D1A777017D29} + + + + StaticLibrary + v120 + Unicode + + + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2a3f751d-69e9-45f2-9199-9a00bfb6cc72} + + + {1c8436c9-dbaf-42be-83bc-cf3ec9175abe} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + + + + \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.cpp b/Source/Core/VideoBackends/Software/Src/BPMemLoader.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.cpp rename to Source/Core/VideoBackends/Software/Src/BPMemLoader.cpp index 6317398f39..f6f810791d 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.cpp +++ b/Source/Core/VideoBackends/Software/Src/BPMemLoader.cpp @@ -97,7 +97,7 @@ void SWBPWritten(int address, int newvalue) case BPMEM_LOADTLUT1: // Load a Texture Look Up Table { u32 tlutTMemAddr = (newvalue & 0x3FF) << 9; - u32 tlutXferCount = (newvalue & 0x1FFC00) >> 5; + u32 tlutXferCount = (newvalue & 0x1FFC00) >> 5; u8 *ptr = 0; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h b/Source/Core/VideoBackends/Software/Src/BPMemLoader.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h rename to Source/Core/VideoBackends/Software/Src/BPMemLoader.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.cpp b/Source/Core/VideoBackends/Software/Src/CPMemLoader.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.cpp rename to Source/Core/VideoBackends/Software/Src/CPMemLoader.cpp diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h b/Source/Core/VideoBackends/Software/Src/CPMemLoader.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h rename to Source/Core/VideoBackends/Software/Src/CPMemLoader.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp b/Source/Core/VideoBackends/Software/Src/Clipper.cpp similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp rename to Source/Core/VideoBackends/Software/Src/Clipper.cpp index ff71ee491d..6d6069b262 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp +++ b/Source/Core/VideoBackends/Software/Src/Clipper.cpp @@ -8,18 +8,18 @@ Copyright (c) 2007, 2008 Markus Trenkwalder All rights reserved. -Redistribution and use in source and binary forms, with or without +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation + this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -* Neither the name of the library's copyright owner nor the names of its - contributors may be used to endorse or promote products derived from this +* Neither the name of the library's copyright owner nor the names of its + contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS @@ -55,8 +55,8 @@ namespace Clipper void DoState(PointerWrap &p) { p.DoArray(m_ViewOffset,2); - for (int i = 0; i< NUM_CLIPPED_VERTICES; ++i) - ClippedVertices[i].DoState(p); + for (auto& ClippedVertice : ClippedVertices) + ClippedVertice.DoState(p); } void Init() @@ -190,7 +190,7 @@ namespace Clipper inlist[1] = 1; inlist[2] = 2; - // mark this triangle as unused in case it should be completely + // mark this triangle as unused in case it should be completely // clipped indices[0] = SKIP_FLAG; indices[1] = SKIP_FLAG; @@ -229,13 +229,13 @@ namespace Clipper mask |= clip_mask[i]; } - if (mask == 0) + if (mask == 0) return; float t0 = 0; float t1 = 0; - // Mark unused in case of early termination + // Mark unused in case of early termination // of the macros below. (When fully clipped) indices[0] = SKIP_FLAG; indices[1] = SKIP_FLAG; @@ -247,7 +247,7 @@ namespace Clipper LINE_CLIP(CLIP_POS_Z_BIT, 0, 0, -1, 1); LINE_CLIP(CLIP_NEG_Z_BIT, 0, 0, 1, 1); - // Restore the old values as this line + // Restore the old values as this line // was not fully clipped. indices[0] = 0; indices[1] = 1; @@ -305,7 +305,7 @@ namespace Clipper PerspectiveDivide(Vertices[indices[i+1]]); PerspectiveDivide(Vertices[indices[i+2]]); - Rasterizer::DrawTriangleFrontFace(Vertices[indices[i]], Vertices[indices[i+1]], Vertices[indices[i+2]]); + Rasterizer::DrawTriangleFrontFace(Vertices[indices[i]], Vertices[indices[i+1]], Vertices[indices[i+2]]); } } } @@ -349,7 +349,7 @@ namespace Clipper float dx = v1->screenPosition.x - v0->screenPosition.x; float dy = v1->screenPosition.y - v0->screenPosition.y; - + float screenDx = 0; float screenDy = 0; @@ -405,7 +405,7 @@ namespace Clipper float w1 = v1->projectedPosition.w; float w2 = v2->projectedPosition.w; - float normalZDir = (x0*w2 - x2*w0)*y1 + (x2*y0 - x0*y2)*w1 + (y2*w0 - y0*w2)*x1; + float normalZDir = (x0*w2 - x2*w0)*y1 + (x2*y0 - x0*y2)*w1 + (y2*w0 - y0*w2)*x1; backface = normalZDir <= 0.0f; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h b/Source/Core/VideoBackends/Software/Src/Clipper.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h rename to Source/Core/VideoBackends/Software/Src/Clipper.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp b/Source/Core/VideoBackends/Software/Src/DebugUtil.cpp similarity index 77% rename from Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp rename to Source/Core/VideoBackends/Software/Src/DebugUtil.cpp index 4472639a20..75c6c08ada 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp +++ b/Source/Core/VideoBackends/Software/Src/DebugUtil.cpp @@ -42,7 +42,7 @@ void Init() } } -void SaveTexture(const char* filename, u32 texmap, s32 mip) +void SaveTexture(const std::string filename, u32 texmap, s32 mip) { FourTexUnits& texUnit = bpmem.tex[(texmap >> 2) & 1]; u8 subTexmap = texmap & 3; @@ -54,28 +54,21 @@ void SaveTexture(const char* filename, u32 texmap, s32 mip) u8 *data = new u8[width * height * 4]; - GetTextureBGRA(data, texmap, mip, width, height); + GetTextureRGBA(data, texmap, mip, width, height); - (void)SaveTGA(filename, width, height, data); + (void)TextureToPng(data, width*4, filename, width, height, true); + delete[] data; - delete []data; } -void GetTextureBGRA(u8 *dst, u32 texmap, s32 mip, u32 width, u32 height) +void GetTextureRGBA(u8 *dst, u32 texmap, s32 mip, u32 width, u32 height) { - u8 sample[4]; - for (u32 y = 0; y < height; y++) { for (u32 x = 0; x < width; x++) { - TextureSampler::SampleMip(x << 7, y << 7, mip, false, texmap, sample); - - // RGBA to BGRA - *(dst++) = sample[2]; - *(dst++) = sample[1]; - *(dst++) = sample[0]; - *(dst++) = sample[3]; + TextureSampler::SampleMip(x << 7, y << 7, mip, false, texmap, dst); + dst += 4; } } } @@ -104,9 +97,9 @@ void DumpActiveTextures() s32 maxLod = GetMaxTextureLod(texmap); for (s32 mip = 0; mip <= maxLod; ++mip) { - SaveTexture(StringFromFormat("%star%i_ind%i_map%i_mip%i.tga", + SaveTexture(StringFromFormat("%star%i_ind%i_map%i_mip%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(), - swstats.thisFrame.numDrawnObjects, stageNum, texmap, mip).c_str(), texmap, mip); + swstats.thisFrame.numDrawnObjects, stageNum, texmap, mip), texmap, mip); } } @@ -121,14 +114,14 @@ void DumpActiveTextures() s32 maxLod = GetMaxTextureLod(texmap); for (s32 mip = 0; mip <= maxLod; ++mip) { - SaveTexture(StringFromFormat("%star%i_stage%i_map%i_mip%i.tga", + SaveTexture(StringFromFormat("%star%i_stage%i_map%i_mip%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(), - swstats.thisFrame.numDrawnObjects, stageNum, texmap, mip).c_str(), texmap, mip); + swstats.thisFrame.numDrawnObjects, stageNum, texmap, mip), texmap, mip); } } } -void DumpEfb(const char* filename) +void DumpEfb(const std::string filename) { u8 *data = new u8[EFB_WIDTH * EFB_HEIGHT * 4]; u8 *writePtr = data; @@ -139,20 +132,19 @@ void DumpEfb(const char* filename) for (int x = 0; x < EFB_WIDTH; x++) { EfbInterface::GetColor(x, y, sample); - // ABGR to BGRA - *(writePtr++) = sample[1]; - *(writePtr++) = sample[2]; + // ABGR to RGBA *(writePtr++) = sample[3]; + *(writePtr++) = sample[2]; + *(writePtr++) = sample[1]; *(writePtr++) = sample[0]; } } - (void)SaveTGA(filename, EFB_WIDTH, EFB_HEIGHT, data); - - delete []data; + (void)TextureToPng(data, EFB_WIDTH * 4, filename, EFB_WIDTH, EFB_HEIGHT, true); + delete[] data; } -void DumpDepth(const char* filename) +void DumpDepth(const std::string filename) { u8 *data = new u8[EFB_WIDTH * EFB_HEIGHT * 4]; u8 *writePtr = data; @@ -162,17 +154,16 @@ void DumpDepth(const char* filename) for (int x = 0; x < EFB_WIDTH; x++) { u32 depth = EfbInterface::GetDepth(x, y); - // depth to bgra - *(writePtr++) = (depth >> 16) & 0xff; + // depth to rgba + *(writePtr++) = depth & 0xff; *(writePtr++) = (depth >> 8) & 0xff; - *(writePtr++) = depth & 0xff; + *(writePtr++) = (depth >> 16) & 0xff; *(writePtr++) = 255; } } - (void)SaveTGA(filename, EFB_WIDTH, EFB_HEIGHT, data); - - delete []data; + (void)TextureToPng(data, EFB_WIDTH * 4, filename, EFB_WIDTH, EFB_HEIGHT, true); + delete[] data; } void DrawObjectBuffer(s16 x, s16 y, u8 *color, int bufferBase, int subBuffer, const char *name) @@ -232,9 +223,9 @@ void OnObjectEnd() if (!g_bSkipCurrentFrame) { if (g_SWVideoConfig.bDumpObjects && swstats.thisFrame.numDrawnObjects >= g_SWVideoConfig.drawStart && swstats.thisFrame.numDrawnObjects < g_SWVideoConfig.drawEnd) - DumpEfb(StringFromFormat("%sobject%i.tga", + DumpEfb(StringFromFormat("%sobject%i.png", File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), - swstats.thisFrame.numDrawnObjects).c_str()); + swstats.thisFrame.numDrawnObjects)); if (g_SWVideoConfig.bHwRasterizer || drawingHwTriangles) { @@ -247,11 +238,13 @@ void OnObjectEnd() if (DrawnToBuffer[i]) { DrawnToBuffer[i] = false; - (void)SaveTGA(StringFromFormat("%sobject%i_%s(%i).tga", - File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), - swstats.thisFrame.numDrawnObjects, ObjectBufferName[i], i - BufferBase[i]).c_str(), - EFB_WIDTH, EFB_HEIGHT, ObjectBuffer[i]); + std::string filename = StringFromFormat("%sobject%i_%s(%i).png", + File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), + swstats.thisFrame.numDrawnObjects, ObjectBufferName[i], i - BufferBase[i]); + + (void)TextureToPng((u8*)ObjectBuffer[i], EFB_WIDTH * 4, filename, EFB_WIDTH, EFB_HEIGHT, true); memset(ObjectBuffer[i], 0, sizeof(ObjectBuffer[i])); + } } @@ -265,10 +258,10 @@ void OnFrameEnd() { if (g_SWVideoConfig.bDumpFrames) { - DumpEfb(StringFromFormat("%sframe%i_color.tga", - File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), swstats.frameCount).c_str()); - DumpDepth(StringFromFormat("%sframe%i_depth.tga", - File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), swstats.frameCount).c_str()); + DumpEfb(StringFromFormat("%sframe%i_color.png", + File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), swstats.frameCount)); + DumpDepth(StringFromFormat("%sframe%i_depth.png", + File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), swstats.frameCount)); } } } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h b/Source/Core/VideoBackends/Software/Src/DebugUtil.h similarity index 88% rename from Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h rename to Source/Core/VideoBackends/Software/Src/DebugUtil.h index 89b0db9b72..7d5ac4beea 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h +++ b/Source/Core/VideoBackends/Software/Src/DebugUtil.h @@ -9,7 +9,7 @@ namespace DebugUtil { void Init(); - void GetTextureBGRA(u8 *dst, u32 texmap, s32 mip, u32 width, u32 height); + void GetTextureRGBA(u8 *dst, u32 texmap, s32 mip, u32 width, u32 height); void DumpActiveTextures(); @@ -24,4 +24,4 @@ namespace DebugUtil void CopyTempBuffer(s16 x, s16 y, int bufferBase, int subBuffer, const char *name); } -#endif +#endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp b/Source/Core/VideoBackends/Software/Src/EfbCopy.cpp similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp rename to Source/Core/VideoBackends/Software/Src/EfbCopy.cpp index 91a4b5dc41..1f042b8060 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp +++ b/Source/Core/VideoBackends/Software/Src/EfbCopy.cpp @@ -27,8 +27,9 @@ namespace EfbCopy { void CopyToXfb(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc, float Gamma) { - if (!g_SWVideoConfig.bHwRasterizer) + GLInterface->Update(); // just updates the render window position and the backbuffer size + if (!g_SWVideoConfig.bHwRasterizer) { INFO_LOG(VIDEO, "xfbaddr: %x, fbwidth: %i, fbheight: %i, source: (%i, %i, %i, %i), Gamma %f", xfbAddr, fbWidth, fbHeight, sourceRc.top, sourceRc.left, sourceRc.bottom, sourceRc.right, Gamma); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h b/Source/Core/VideoBackends/Software/Src/EfbCopy.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h rename to Source/Core/VideoBackends/Software/Src/EfbCopy.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbInterface.cpp b/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/EfbInterface.cpp rename to Source/Core/VideoBackends/Software/Src/EfbInterface.cpp index 7ab5b2f942..34d20a34ed 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbInterface.cpp +++ b/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp @@ -181,7 +181,7 @@ namespace EfbInterface u32 *dst = (u32*)&efb[offset]; u32 val = *dst & 0xff000000; val |= depth & 0x00ffffff; - *dst = val; + *dst = val; } break; case PIXELFMT_RGB565_Z16: @@ -190,7 +190,7 @@ namespace EfbInterface u32 *dst = (u32*)&efb[offset]; u32 val = *dst & 0xff000000; val |= depth & 0x00ffffff; - *dst = val; + *dst = val; } break; default: diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbInterface.h b/Source/Core/VideoBackends/Software/Src/EfbInterface.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/EfbInterface.h rename to Source/Core/VideoBackends/Software/Src/EfbInterface.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp b/Source/Core/VideoBackends/Software/Src/HwRasterizer.cpp similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp rename to Source/Core/VideoBackends/Software/Src/HwRasterizer.cpp index 5e3e4a4ae0..88b3e15ebd 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp +++ b/Source/Core/VideoBackends/Software/Src/HwRasterizer.cpp @@ -130,7 +130,7 @@ namespace HwRasterizer glDepthFunc(GL_LEQUAL); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - + CreateShaders(); GL_REPORT_ERRORD(); } @@ -141,7 +141,7 @@ namespace HwRasterizer u32 imageAddr = texUnit.texImage3[0].image_base; // Texture Rectangle uses pixel coordinates // While GLES uses texture coordinates -#ifdef USE_GLES +#ifdef USE_GLES width = texUnit.texImage0[0].width; height = texUnit.texImage0[0].height; #else @@ -303,7 +303,7 @@ namespace HwRasterizer { glUseProgram(clearProg); glVertexAttribPointer(clear_apos, 3, GL_FLOAT, GL_FALSE, 0, verts); - glUniform4f(clear_ucol, r, g, b, a); + glUniform4f(clear_ucol, r, g, b, a); glEnableVertexAttribArray(col_apos); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableVertexAttribArray(col_apos); @@ -329,15 +329,12 @@ namespace HwRasterizer int image_width = texImage0.width; int image_height = texImage0.height; - DebugUtil::GetTextureBGRA(temp, 0, 0, image_width, image_height); + DebugUtil::GetTextureRGBA(temp, 0, 0, image_width, image_height); glGenTextures(1, (GLuint *)&texture); glBindTexture(TEX2D, texture); -#ifdef USE_GLES glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)image_width, (GLsizei)image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp); -#else - glTexImage2D(TEX2D, 0, GL_RGBA8, (GLsizei)image_width, (GLsizei)image_height, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp); -#endif + GL_REPORT_ERRORD(); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h b/Source/Core/VideoBackends/Software/Src/HwRasterizer.h similarity index 82% rename from Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h rename to Source/Core/VideoBackends/Software/Src/HwRasterizer.h index 250b951175..c3af17cec2 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h +++ b/Source/Core/VideoBackends/Software/Src/HwRasterizer.h @@ -8,7 +8,7 @@ #include #include "BPMemLoader.h" -#include "../../Plugin_VideoOGL/Src/GLUtil.h" +#include "../../OGL/Src/GLUtil.h" struct OutputVertexData; @@ -28,10 +28,10 @@ namespace HwRasterizer struct TexCacheEntry { - TexImage0 texImage0; - TexImage1 texImage1; - TexImage2 texImage2; - TexImage3 texImage3; + TexImage0 texImage0; + TexImage1 texImage1; + TexImage2 texImage2; + TexImage3 texImage3; TexTLUT texTlut; GLuint texture; @@ -47,4 +47,4 @@ namespace HwRasterizer static TextureCache textures; } -#endif +#endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/NativeVertexFormat.h b/Source/Core/VideoBackends/Software/Src/NativeVertexFormat.h similarity index 94% rename from Source/Plugins/Plugin_VideoSoftware/Src/NativeVertexFormat.h rename to Source/Core/VideoBackends/Software/Src/NativeVertexFormat.h index 2f0213d469..9f9610910a 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/NativeVertexFormat.h +++ b/Source/Core/VideoBackends/Software/Src/NativeVertexFormat.h @@ -85,11 +85,11 @@ struct OutputVertexData mvPosition.DoState(p); p.Do(projectedPosition); screenPosition.DoState(p); - for (int i = 0; i < 3;++i) - normal[i].DoState(p); + for (auto& vec : normal) + vec.DoState(p); p.DoArray(color, sizeof color); - for (int i = 0; i < 8;++i) - texCoords[i].DoState(p); + for (auto& vec : texCoords) + vec.DoState(p); } }; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp b/Source/Core/VideoBackends/Software/Src/OpcodeDecoder.cpp similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp rename to Source/Core/VideoBackends/Software/Src/OpcodeDecoder.cpp index 7c3408a316..21f0a97abd 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp +++ b/Source/Core/VideoBackends/Software/Src/OpcodeDecoder.cpp @@ -82,7 +82,7 @@ void DecodePrimitiveStream(u32 iBufferSize) void ReadXFData(u32 iBufferSize) { - _assert_msg_(VIDEO, iBufferSize >= (u32)(streamSize * 4), "Underflow during standard opcode decoding"); + _assert_msg_(VIDEO, iBufferSize >= (u32)(streamSize * 4), "Underflow during standard opcode decoding"); u32 pData[16]; for (int i = 0; i < streamSize; i++) @@ -109,7 +109,7 @@ void ExecuteDisplayList(u32 addr, u32 count) u32 readCount = (u32)(g_pVideoData - dlStart); dlStart = g_pVideoData; - _assert_msg_(VIDEO, count >= readCount, "Display list underrun"); + _assert_msg_(VIDEO, count >= readCount, "Display list underrun"); count -= readCount; } @@ -119,7 +119,7 @@ void ExecuteDisplayList(u32 addr, u32 count) void DecodeStandard(u32 bufferSize) { - _assert_msg_(VIDEO, CommandRunnable(bufferSize), "Underflow during standard opcode decoding"); + _assert_msg_(VIDEO, CommandRunnable(bufferSize), "Underflow during standard opcode decoding"); int Cmd = DataReadU8(); @@ -191,7 +191,7 @@ void DecodeStandard(u32 bufferSize) // zelda 4 swords calls it and checks the metrics registers after that break; - case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); break; @@ -202,7 +202,7 @@ void DecodeStandard(u32 bufferSize) } break; - // draw primitives + // draw primitives default: if (Cmd & 0x80) { @@ -284,7 +284,7 @@ bool CommandRunnable(u32 iBufferSize) minSize = 5; break; - // draw primitives + // draw primitives default: if (Cmd & 0x80) minSize = 3; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.h b/Source/Core/VideoBackends/Software/Src/OpcodeDecoder.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.h rename to Source/Core/VideoBackends/Software/Src/OpcodeDecoder.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/RasterFont.cpp b/Source/Core/VideoBackends/Software/Src/RasterFont.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/RasterFont.cpp rename to Source/Core/VideoBackends/Software/Src/RasterFont.cpp index 2170d52137..77ac1cf077 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/RasterFont.cpp +++ b/Source/Core/VideoBackends/Software/Src/RasterFont.cpp @@ -2,7 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "../../Plugin_VideoOGL/Src/GLUtil.h" +#include "../../OGL/Src/GLUtil.h" #include diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/RasterFont.h b/Source/Core/VideoBackends/Software/Src/RasterFont.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/RasterFont.h rename to Source/Core/VideoBackends/Software/Src/RasterFont.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp b/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp rename to Source/Core/VideoBackends/Software/Src/Rasterizer.cpp index 3c45ee7d25..fa10ac38af 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp +++ b/Source/Core/VideoBackends/Software/Src/Rasterizer.cpp @@ -54,12 +54,12 @@ void DoState(PointerWrap &p) { ZSlope.DoState(p); WSlope.DoState(p); - for (int i=0;i<2;++i) + for (auto& ColorSlope : ColorSlopes) for (int n=0; n<4; ++n) - ColorSlopes[i][n].DoState(p); - for (int i=0;i<8;++i) + ColorSlope[n].DoState(p); + for (auto& TexSlope : TexSlopes) for (int n=0; n<3; ++n) - TexSlopes[i][n].DoState(p); + TexSlope[n].DoState(p); p.Do(vertex0X); p.Do(vertex0Y); p.Do(vertexOffsetX); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.h b/Source/Core/VideoBackends/Software/Src/Rasterizer.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.h rename to Source/Core/VideoBackends/Software/Src/Rasterizer.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWCommandProcessor.cpp b/Source/Core/VideoBackends/Software/Src/SWCommandProcessor.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWCommandProcessor.cpp rename to Source/Core/VideoBackends/Software/Src/SWCommandProcessor.cpp index 5fd1353a94..06876a2035 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWCommandProcessor.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWCommandProcessor.cpp @@ -88,7 +88,7 @@ void Init() cpreg.bboxbottom = 0; cpreg.token = 0; - + et_UpdateInterrupts = CoreTiming::RegisterEvent("UpdateInterrupts", UpdateInterrupts_Wrapper); // internal buffer position @@ -174,7 +174,7 @@ void Write16(const u16 _Value, const u32 _Address) cpreg.status.UnderflowLoWatermark = 0; INFO_LOG(COMMANDPROCESSOR,"\t write to CLEAR_REGISTER : %04x",_Value); - } + } break; // Fifo Registers diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWCommandProcessor.h b/Source/Core/VideoBackends/Software/Src/SWCommandProcessor.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWCommandProcessor.h rename to Source/Core/VideoBackends/Software/Src/SWCommandProcessor.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.cpp b/Source/Core/VideoBackends/Software/Src/SWPixelEngine.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.cpp rename to Source/Core/VideoBackends/Software/Src/SWPixelEngine.cpp index 6c81aedac7..a747a669ed 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWPixelEngine.cpp @@ -81,7 +81,7 @@ void Write16(const u16 _iValue, const u32 _iAddress) switch (address) { - case PE_CTRL_REGISTER: + case PE_CTRL_REGISTER: { UPECtrlReg tmpCtrl(_iValue); @@ -135,7 +135,7 @@ void SetToken_OnMainThread(u64 userdata, int cyclesLate) void SetFinish_OnMainThread(u64 userdata, int cyclesLate) { - g_bSignalFinishInterrupt = true; + g_bSignalFinishInterrupt = true; UpdateInterrupts(); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.h b/Source/Core/VideoBackends/Software/Src/SWPixelEngine.h similarity index 98% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.h rename to Source/Core/VideoBackends/Software/Src/SWPixelEngine.h index b61af07a06..01fb49685b 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWPixelEngine.h +++ b/Source/Core/VideoBackends/Software/Src/SWPixelEngine.h @@ -46,7 +46,7 @@ namespace SWPixelEngine union UPEZConfReg { u16 Hex; - struct + struct { u16 ZCompEnable : 1; // Z Comparator Enable u16 Function : 3; @@ -58,7 +58,7 @@ namespace SWPixelEngine union UPEAlphaConfReg { u16 Hex; - struct + struct { u16 BMMath : 1; // GX_BM_BLEND || GX_BM_SUBSTRACT u16 BMLogic : 1; // GX_BM_LOGIC @@ -75,7 +75,7 @@ namespace SWPixelEngine union UPEDstAlphaConfReg { u16 Hex; - struct + struct { u16 DstAlpha : 8; u16 Enable : 1; @@ -86,7 +86,7 @@ namespace SWPixelEngine union UPEAlphaModeConfReg { u16 Hex; - struct + struct { u16 Threshold : 8; u16 CompareMode : 8; @@ -96,7 +96,7 @@ namespace SWPixelEngine union UPEAlphaReadReg { u16 Hex; - struct + struct { u16 ReadMode : 3; u16 : 13; @@ -105,7 +105,7 @@ namespace SWPixelEngine union UPECtrlReg { - struct + struct { u16 PETokenEnable : 1; u16 PEFinishEnable : 1; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp similarity index 81% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp rename to Source/Core/VideoBackends/Software/Src/SWRenderer.cpp index 426ab3194e..83d542bcec 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp @@ -3,10 +3,10 @@ // Refer to the license.txt file included. #include "Common.h" -#include #include "Core.h" -#include "../../Plugin_VideoOGL/Src/GLUtil.h" +#include "../../OGL/Src/GLUtil.h" +#include "ImageWrite.h" #include "RasterFont.h" #include "SWRenderer.h" #include "SWStatistics.h" @@ -23,6 +23,11 @@ static GLuint program; static u8 s_xfbColorTexture[2][EFB_WIDTH*EFB_HEIGHT*4]; static int s_currentColorTexture = 0; +static volatile bool s_bScreenshot; +static std::mutex s_criticalScreenshot; +static std::string s_sScreenshotName; + + // Rasterfont isn't compatible with GLES // degasus: I think it does, but I can't test it #ifndef USE_GLES @@ -31,13 +36,13 @@ RasterFont* s_pfont = NULL; void SWRenderer::Init() { - GLInterface->SetBackBufferDimensions(EFB_WIDTH, EFB_HEIGHT); + s_bScreenshot = false; } void SWRenderer::Shutdown() { glDeleteProgram(program); - glDeleteTextures(1, &s_RenderTarget); + glDeleteTextures(1, &s_RenderTarget); #ifndef USE_GLES delete s_pfont; s_pfont = 0; @@ -69,7 +74,7 @@ void CreateShaders() uni_tex = glGetUniformLocation(program, "Texture"); attr_pos = glGetAttribLocation(program, "pos"); - attr_tex = glGetAttribLocation(program, "TexCoordIn"); + attr_tex = glGetAttribLocation(program, "TexCoordIn"); } void SWRenderer::Prepare() @@ -90,6 +95,13 @@ void SWRenderer::Prepare() GL_REPORT_ERRORD(); } +void SWRenderer::SetScreenshot(const char *_szFilename) +{ + std::lock_guard lk(s_criticalScreenshot); + s_sScreenshotName = _szFilename; + s_bScreenshot = true; +} + void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color) { #ifndef USE_GLES @@ -110,7 +122,7 @@ void SWRenderer::DrawDebugText() char *p = debugtext_buffer; p[0] = 0; - if (g_SWVideoConfig.bShowStats) + if (g_SWVideoConfig.bShowStats) { p+=sprintf(p,"Objects: %i\n",swstats.thisFrame.numDrawnObjects); p+=sprintf(p,"Primitives: %i\n",swstats.thisFrame.numPrimatives); @@ -131,46 +143,6 @@ void SWRenderer::DrawDebugText() SWRenderer::RenderText(debugtext_buffer, 21, 21, 0xDD000000); SWRenderer::RenderText(debugtext_buffer, 20, 20, 0xFFFFFF00); } -#ifdef ANDROID -// XXX: This /really/ shouldn't be here -// But for now, we don't have a generic way for all backends to draw the buttons on screen. -// Once that is implemented, we can remove this -void DrawButton(GLuint tex, float *coords) -{ - //Texture rectangle uses pixel coordinates -#ifndef USE_GLES - GLfloat u_max = (GLfloat)width; - GLfloat v_max = (GLfloat)height; - - static const GLfloat texverts[4][2] = { - {0, v_max}, - {0, 0}, - {u_max, 0}, - {u_max, v_max} - }; -#else - static const GLfloat texverts[4][2] = { - {0, 1}, - {0, 0}, - {1, 0}, - {1, 1} - }; -#endif - glBindTexture(TEX2D, tex); - - glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, coords); - glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texverts); - glEnableVertexAttribArray(attr_pos); - glEnableVertexAttribArray(attr_tex); - glActiveTexture(GL_TEXTURE0); - glUniform1i(uni_tex, 0); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(attr_pos); - glDisableVertexAttribArray(attr_tex); - - glBindTexture(TEX2D, 0); -} -#endif u8* SWRenderer::getColorTexture() { return s_xfbColorTexture[!s_currentColorTexture]; @@ -228,6 +200,16 @@ void SWRenderer::DrawTexture(u8 *texture, int width, int height) { // FIXME: This should add black bars when the game has set the VI to render less than the full xfb. + // Save screenshot + if (s_bScreenshot) + { + std::lock_guard lk(s_criticalScreenshot); + TextureToPng(texture, width*4, s_sScreenshotName, width, height, false); + // Reset settings + s_sScreenshotName.clear(); + s_bScreenshot = false; + } + GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth(); GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight(); @@ -241,7 +223,7 @@ void SWRenderer::DrawTexture(u8 *texture, int width, int height) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - + glUseProgram(program); static const GLfloat verts[4][2] = { { -1, -1}, // Left top @@ -266,13 +248,13 @@ void SWRenderer::DrawTexture(u8 *texture, int width, int height) glDisableVertexAttribArray(attr_pos); glDisableVertexAttribArray(attr_tex); - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, 0); GL_REPORT_ERRORD(); } void SWRenderer::SwapBuffer() { - // Do our OSD callbacks + // Do our OSD callbacks OSD::DoCallbacks(OSD::OSD_ONFRAME); DrawDebugText(); @@ -282,7 +264,7 @@ void SWRenderer::SwapBuffer() GLInterface->Swap(); swstats.ResetFrame(); - + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.h b/Source/Core/VideoBackends/Software/Src/SWRenderer.h similarity index 89% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.h rename to Source/Core/VideoBackends/Software/Src/SWRenderer.h index a2f737f2a8..35770bf364 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.h +++ b/Source/Core/VideoBackends/Software/Src/SWRenderer.h @@ -7,13 +7,15 @@ #include "CommonTypes.h" #include "EfbInterface.h" +#include "Thread.h" namespace SWRenderer -{ +{ void Init(); void Prepare(); void Shutdown(); - + + void SetScreenshot(const char *_szFilename); void RenderText(const char* pstr, int left, int top, u32 color); void DrawDebugText(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWStatistics.cpp b/Source/Core/VideoBackends/Software/Src/SWStatistics.cpp similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWStatistics.cpp rename to Source/Core/VideoBackends/Software/Src/SWStatistics.cpp diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWStatistics.h b/Source/Core/VideoBackends/Software/Src/SWStatistics.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWStatistics.h rename to Source/Core/VideoBackends/Software/Src/SWStatistics.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp b/Source/Core/VideoBackends/Software/Src/SWVertexLoader.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp rename to Source/Core/VideoBackends/Software/Src/SWVertexLoader.cpp index f176acd635..f08e2f3825 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWVertexLoader.cpp @@ -76,13 +76,13 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) g_VtxDesc.Tex4Coord, g_VtxDesc.Tex5Coord, g_VtxDesc.Tex6Coord, (const u32)((g_VtxDesc.Hex >> 31) & 3) }; const u32 tcElements[8] = { - m_CurrentVat->g0.Tex0CoordElements, m_CurrentVat->g1.Tex1CoordElements, m_CurrentVat->g1.Tex2CoordElements, + m_CurrentVat->g0.Tex0CoordElements, m_CurrentVat->g1.Tex1CoordElements, m_CurrentVat->g1.Tex2CoordElements, m_CurrentVat->g1.Tex3CoordElements, m_CurrentVat->g1.Tex4CoordElements, m_CurrentVat->g2.Tex5CoordElements, m_CurrentVat->g2.Tex6CoordElements, m_CurrentVat->g2.Tex7CoordElements }; const u32 tcFormat[8] = { - m_CurrentVat->g0.Tex0CoordFormat, m_CurrentVat->g1.Tex1CoordFormat, m_CurrentVat->g1.Tex2CoordFormat, + m_CurrentVat->g0.Tex0CoordFormat, m_CurrentVat->g1.Tex1CoordFormat, m_CurrentVat->g1.Tex2CoordFormat, m_CurrentVat->g1.Tex3CoordFormat, m_CurrentVat->g1.Tex4CoordFormat, m_CurrentVat->g2.Tex5CoordFormat, m_CurrentVat->g2.Tex6CoordFormat, m_CurrentVat->g2.Tex7CoordFormat }; @@ -161,10 +161,10 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) { m_VertexSize += VertexLoader_Normal::GetSize(g_VtxDesc.Normal, m_CurrentVat->g0.NormalFormat, m_CurrentVat->g0.NormalElements, m_CurrentVat->g0.NormalIndex3); - + m_normalLoader = VertexLoader_Normal::GetFunction(g_VtxDesc.Normal, m_CurrentVat->g0.NormalFormat, m_CurrentVat->g0.NormalElements, m_CurrentVat->g0.NormalIndex3); - + if (m_normalLoader == 0) { ERROR_LOG(VIDEO, "VertexLoader_Normal::GetFunction returned zero!"); @@ -192,7 +192,7 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) } AddAttributeLoader(LoadColor, i); break; - case INDEX8: + case INDEX8: m_VertexSize += 1; switch (colComp[i]) { diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.h b/Source/Core/VideoBackends/Software/Src/SWVertexLoader.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.h rename to Source/Core/VideoBackends/Software/Src/SWVertexLoader.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp b/Source/Core/VideoBackends/Software/Src/SWVideoConfig.cpp similarity index 94% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp rename to Source/Core/VideoBackends/Software/Src/SWVideoConfig.cpp index fbd8b95108..36f91265cb 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWVideoConfig.cpp @@ -12,7 +12,7 @@ SWVideoConfig::SWVideoConfig() { bFullscreen = false; bHideCursor = false; - renderToMainframe = false; + renderToMainframe = false; bHwRasterizer = false; bBypassXFB = false; @@ -68,8 +68,8 @@ void SWVideoConfig::Save(const char* ini_file) iniFile.Set("Rendering", "HwRasterizer", bHwRasterizer); iniFile.Set("Rendering", "BypassXFB", bBypassXFB); - iniFile.Set("Rendering", "ZComploc", &bZComploc); - iniFile.Set("Rendering", "ZFreeze", &bZFreeze); + iniFile.Set("Rendering", "ZComploc", bZComploc); + iniFile.Set("Rendering", "ZFreeze", bZFreeze); iniFile.Set("Info", "ShowStats", bShowStats); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h b/Source/Core/VideoBackends/Software/Src/SWVideoConfig.h similarity index 96% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h rename to Source/Core/VideoBackends/Software/Src/SWVideoConfig.h index 5e88da174e..1e02feb2ed 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h +++ b/Source/Core/VideoBackends/Software/Src/SWVideoConfig.h @@ -19,7 +19,7 @@ struct SWVideoConfig : NonCopyable // General bool bFullscreen; bool bHideCursor; - bool renderToMainframe; + bool renderToMainframe; bool bHwRasterizer; bool bBypassXFB; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp b/Source/Core/VideoBackends/Software/Src/SWmain.cpp similarity index 90% rename from Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp rename to Source/Core/VideoBackends/Software/Src/SWmain.cpp index a68489eaaf..963ea67921 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWmain.cpp @@ -41,7 +41,6 @@ static volatile u32 s_swapRequested = false; static volatile struct { u32 xfbAddr; - FieldType field; u32 fbWidth; u32 fbHeight; } s_beginFieldArgs; @@ -52,7 +51,6 @@ namespace SW static volatile bool fifoStateRun = false; static volatile bool emuRunningState = false; static std::mutex m_csSWVidOccupied; -static void* m_windowhandle; std::string VideoSoftware::GetName() { @@ -75,9 +73,13 @@ void VideoSoftware::ShowConfig(void *_hParent) bool VideoSoftware::Initialize(void *&window_handle) { g_SWVideoConfig.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_software.ini").c_str()); - InitInterface(); - - m_windowhandle = window_handle; + InitInterface(); + + if (!GLInterface->Create(window_handle)) + { + INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n"); + return false; + } InitBPMemory(); InitXFMemory(); @@ -160,7 +162,7 @@ void VideoSoftware::Shutdown() HwRasterizer::Shutdown(); SWRenderer::Shutdown(); - // Do our OSD callbacks + // Do our OSD callbacks OSD::DoCallbacks(OSD::OSD_SHUTDOWN); GLInterface->Shutdown(); @@ -173,12 +175,6 @@ void VideoSoftware::Video_Cleanup() // This is called after Video_Initialize() from the Core void VideoSoftware::Video_Prepare() { - if (!GLInterface->Create(m_windowhandle)) - { - INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n"); - return; - } - GLInterface->MakeCurrent(); // Init extension support. #ifndef USE_GLES @@ -193,7 +189,7 @@ void VideoSoftware::Video_Prepare() // Handle VSync on/off GLInterface->SwapInterval(VSYNC_ENABLED); - // Do our OSD callbacks + // Do our OSD callbacks OSD::DoCallbacks(OSD::OSD_INIT); HwRasterizer::Prepare(); @@ -203,10 +199,9 @@ void VideoSoftware::Video_Prepare() } // Run from the CPU thread (from VideoInterface.cpp) -void VideoSoftware::Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) +void VideoSoftware::Video_BeginField(u32 xfbAddr, u32 fbWidth, u32 fbHeight) { s_beginFieldArgs.xfbAddr = xfbAddr; - s_beginFieldArgs.field = field; s_beginFieldArgs.fbWidth = fbWidth; s_beginFieldArgs.fbHeight = fbHeight; } @@ -225,20 +220,8 @@ void VideoSoftware::Video_EndField() return; } if (!g_SWVideoConfig.bHwRasterizer) { - u32 xfbAddr = s_beginFieldArgs.xfbAddr; - if (s_beginFieldArgs.field != FIELD_PROGRESSIVE) { - // Force Progressive - xfbAddr = VideoInterface::GetXFBAddressTop(); - - // All drivers make an assumption that the two fields are interleaved in the framebuffer - // Give a warning if this isn't true. - if (xfbAddr + 1280 != VideoInterface::GetXFBAddressBottom()) { - WARN_LOG(VIDEO, "Feilds are not interleaved in XFB as expected."); - } - } - if(!g_SWVideoConfig.bBypassXFB) { - EfbInterface::yuv422_packed *xfb = (EfbInterface::yuv422_packed *) Memory::GetPointer(xfbAddr); + EfbInterface::yuv422_packed *xfb = (EfbInterface::yuv422_packed *) Memory::GetPointer(s_beginFieldArgs.xfbAddr); SWRenderer::UpdateColorTexture(xfb, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight); } @@ -295,7 +278,8 @@ u32 VideoSoftware::Video_GetQueryResult(PerfQueryType type) bool VideoSoftware::Video_Screenshot(const char *_szFilename) { - return false; + SWRenderer::SetScreenshot(_szFilename); + return true; } // Run from the graphics thread diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.cpp b/Source/Core/VideoBackends/Software/Src/SetupUnit.cpp similarity index 98% rename from Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.cpp rename to Source/Core/VideoBackends/Software/Src/SetupUnit.cpp index f0cc179f25..b08584e0a9 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.cpp +++ b/Source/Core/VideoBackends/Software/Src/SetupUnit.cpp @@ -99,7 +99,7 @@ void SetupUnit::SetupTriStrip() m_VertPointer[2 - (m_VertexCounter & 1)] = m_VertPointer[0]; m_VertWritePointer = m_VertPointer[0]; - m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3]; + m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3]; } void SetupUnit::SetupTriFan() diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h b/Source/Core/VideoBackends/Software/Src/SetupUnit.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h rename to Source/Core/VideoBackends/Software/Src/SetupUnit.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp b/Source/Core/VideoBackends/Software/Src/Tev.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp rename to Source/Core/VideoBackends/Software/Src/Tev.cpp index 7ab798e2fb..da9b30fe78 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp +++ b/Source/Core/VideoBackends/Software/Src/Tev.cpp @@ -179,7 +179,7 @@ void Tev::DrawColorRegular(TevStageCombiner::ColorCombiner &cc) InputReg.c = *m_ColorInputLUT[cc.c][i]; InputReg.d = *m_ColorInputLUT[cc.d][i]; - u16 c = InputReg.c + (InputReg.c >> 7); + u16 c = InputReg.c + (InputReg.c >> 7); s32 temp = InputReg.a * (256 - c) + (InputReg.b * c); temp = cc.op?(-temp >> 8):(temp >> 8); @@ -285,7 +285,7 @@ void Tev::DrawColorCompare(TevStageCombiner::ColorCombiner &cc) Reg[cc.dest][BLU_C + i] = InputReg.d + ((InputReg.a > InputReg.b) ? InputReg.c : 0); } break; - case TEVCMP_RGB8_EQ: + case TEVCMP_RGB8_EQ: for (int i = 0; i < 3; i++) { InputReg.a = *m_ColorInputLUT[cc.a][i]; @@ -307,7 +307,7 @@ void Tev::DrawAlphaRegular(TevStageCombiner::AlphaCombiner &ac) InputReg.c = m_AlphaInputLUT[ac.c][ALP_C]; InputReg.d = m_AlphaInputLUT[ac.d][ALP_C]; - u16 c = InputReg.c + (InputReg.c >> 7); + u16 c = InputReg.c + (InputReg.c >> 7); s32 temp = InputReg.a * (256 - c) + (InputReg.b * c); temp = ac.op?(-temp >> 8):(temp >> 8); @@ -736,8 +736,8 @@ void Tev::Draw() s32 denom = bpmem.fog.b_magnitude - (Position[2] >> bpmem.fog.b_shift); //in addition downscale magnitude and zs to 0.24 bits ze = (bpmem.fog.a.GetA() * 16777215.0f) / (float)denom; - } - else + } + else { // orthographic // ze = a*Zs @@ -755,7 +755,7 @@ void Tev::Draw() // First, calculate the offset from the viewport center (normalized to 0..1) float offset = (Position[0] - (bpmem.fogRange.Base.Center - 342)) / (float)swxfregs.viewport.wd; // Based on that, choose the index such that points which are far away from the z-axis use the 10th "k" value and such that central points use the first value. - int index = 9 - std::abs(offset) * 9.f; + int index = (int) (9 - std::abs(offset) * 9.f); index = (index < 0) ? 0 : (index > 9) ? 9 : index; // TODO: Shouldn't be necessary! // Look up coefficient... Seems like multiplying by 4 makes Fortune Street work properly (fog is too strong without the factor) float k = bpmem.fogRange.K[index/2].GetValue(index%2) * 4.f; @@ -848,7 +848,7 @@ void Tev::SetRegColor(int reg, int comp, bool konst, s16 color) void Tev::DoState(PointerWrap &p) { p.DoArray(Reg, sizeof(Reg)); - + p.DoArray(KonstantColors, sizeof(KonstantColors)); p.DoArray(TexColor,4); p.DoArray(RasColor,4); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h b/Source/Core/VideoBackends/Software/Src/Tev.h similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/Tev.h rename to Source/Core/VideoBackends/Software/Src/Tev.h index d701625dfb..e86768ac0b 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h +++ b/Source/Core/VideoBackends/Software/Src/Tev.h @@ -9,7 +9,7 @@ #include "ChunkFile.h" class Tev -{ +{ struct InputRegType { unsigned a : 8; @@ -40,7 +40,6 @@ class Tev s16 *m_ColorInputLUT[16][3]; s16 *m_AlphaInputLUT[8]; // values must point to ABGR color s16 *m_KonstLUT[32][4]; - u8 *m_RasColorLUT[8]; s16 m_BiasLUT[4]; u8 m_ScaleLShiftLUT[4]; u8 m_ScaleRShiftLUT[4]; @@ -50,7 +49,7 @@ class Tev { BLU_INP, GRN_INP, - RED_INP + RED_INP }; enum BufferBase diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.cpp b/Source/Core/VideoBackends/Software/Src/TextureEncoder.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.cpp rename to Source/Core/VideoBackends/Software/Src/TextureEncoder.cpp index 9874e13449..07bb162cd6 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.cpp +++ b/Source/Core/VideoBackends/Software/Src/TextureEncoder.cpp @@ -359,7 +359,7 @@ void EncodeRGBA6(u8 *dst, u8 *src, u32 format) SetSpans(sBlkSize, tBlkSize, tSpan, sBlkSpan, tBlkSpan, writeStride); ENCODE_LOOP_BLOCKS { - RGBA_to_RGBA8(src, dst[1], dst[32], dst[33], dst[0]); + RGBA_to_RGBA8(src, dst[1], dst[32], dst[33], dst[0]); src += readStride; dst += 2; } @@ -563,7 +563,7 @@ void EncodeRGBA6halfscale(u8 *dst, u8 *src, u32 format) boxfilterRGBA_to_RGB8(src, r, g, b); src += readStride; - u16 val = ((r << 8) & 0xf800) | ((g << 3) & 0x07e0) | ((b >> 3) & 0x001e); + u16 val = ((r << 8) & 0xf800) | ((g << 3) & 0x07e0) | ((b >> 3) & 0x001e); *(u16*)dst = Common::swap16(val); dst+=2; } @@ -595,7 +595,7 @@ void EncodeRGBA6halfscale(u8 *dst, u8 *src, u32 format) SetSpans(sBlkSize, tBlkSize, tSpan, sBlkSpan, tBlkSpan, writeStride); ENCODE_LOOP_BLOCKS { - boxfilterRGBA_to_RGBA8(src, dst[1], dst[32], dst[33], dst[0]); + boxfilterRGBA_to_RGBA8(src, dst[1], dst[32], dst[33], dst[0]); src += readStride; dst += 2; } @@ -721,7 +721,7 @@ void EncodeRGBA6halfscale(u8 *dst, u8 *src, u32 format) default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } } @@ -790,7 +790,7 @@ void EncodeRGB8(u8 *dst, u8 *src, u32 format) SetSpans(sBlkSize, tBlkSize, tSpan, sBlkSpan, tBlkSpan, writeStride); ENCODE_LOOP_BLOCKS { - u16 val = ((src[2] << 8) & 0xf800) | ((src[1] << 3) & 0x07e0) | ((src[0] >> 3) & 0x001e); + u16 val = ((src[2] << 8) & 0xf800) | ((src[1] << 3) & 0x07e0) | ((src[0] >> 3) & 0x001e); *(u16*)dst = Common::swap16(val); src += readStride; dst+=2; @@ -935,7 +935,7 @@ void EncodeRGB8(u8 *dst, u8 *src, u32 format) default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } } @@ -1010,7 +1010,7 @@ void EncodeRGB8halfscale(u8 *dst, u8 *src, u32 format) ENCODE_LOOP_BLOCKS { boxfilterRGB_to_RGB8(src, r, g, b); - u16 val = ((r << 8) & 0xf800) | ((g << 3) & 0x07e0) | ((b >> 3) & 0x001e); + u16 val = ((r << 8) & 0xf800) | ((g << 3) & 0x07e0) | ((b >> 3) & 0x001e); *(u16*)dst = Common::swap16(val); src += readStride; dst+=2; @@ -1166,7 +1166,7 @@ void EncodeRGB8halfscale(u8 *dst, u8 *src, u32 format) default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } } @@ -1270,7 +1270,7 @@ void EncodeZ24(u8 *dst, u8 *src, u32 format) default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } } @@ -1314,7 +1314,7 @@ void EncodeZ24halfscale(u8 *dst, u8 *src, u32 format) SetSpans(sBlkSize, tBlkSize, tSpan, sBlkSpan, tBlkSpan, writeStride); ENCODE_LOOP_BLOCKS { - boxfilterRGB_to_RGB8(src, dst[33], dst[32], dst[1]); + boxfilterRGB_to_RGB8(src, dst[33], dst[32], dst[1]); dst[0] = 255; src += readStride; dst += 2; @@ -1380,7 +1380,7 @@ void EncodeZ24halfscale(u8 *dst, u8 *src, u32 format) default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } } @@ -1389,7 +1389,7 @@ void Encode(u8 *dest_ptr) int pixelformat = bpmem.zcontrol.pixel_format; bool bFromZBuffer = pixelformat == PIXELFMT_Z24; bool bIsIntensityFmt = bpmem.triggerEFBCopy.intensity_fmt > 0; - u32 copyfmt = ((bpmem.triggerEFBCopy.target_pixel_format / 2) + ((bpmem.triggerEFBCopy.target_pixel_format & 1) * 8)); + u32 copyfmt = ((bpmem.triggerEFBCopy.target_pixel_format / 2) + ((bpmem.triggerEFBCopy.target_pixel_format & 1) * 8)); // pack copy format information into a single variable u32 format = copyfmt; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h b/Source/Core/VideoBackends/Software/Src/TextureEncoder.h similarity index 78% rename from Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h rename to Source/Core/VideoBackends/Software/Src/TextureEncoder.h index 0921b720ea..841590cbba 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h +++ b/Source/Core/VideoBackends/Software/Src/TextureEncoder.h @@ -2,8 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#ifndef _OPCODEDECODER_H_ -#define _OPCODEDECODER_H_ +#ifndef _TEXTUREENCODER_H_ +#define _TEXTUREENCODER_H_ #include "Common.h" diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.cpp b/Source/Core/VideoBackends/Software/Src/TextureSampler.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.cpp rename to Source/Core/VideoBackends/Software/Src/TextureSampler.cpp index f7c87ba513..0657f701f2 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.cpp +++ b/Source/Core/VideoBackends/Software/Src/TextureSampler.cpp @@ -124,7 +124,7 @@ void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8 *sample) int imageHeight = ti0.height; int tlutAddress = texTlut.tmem_offset << 9; - + // reduce sample location and texture size to mip level // move texture pointer to mip location if (mip) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h b/Source/Core/VideoBackends/Software/Src/TextureSampler.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h rename to Source/Core/VideoBackends/Software/Src/TextureSampler.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp b/Source/Core/VideoBackends/Software/Src/TransformUnit.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp rename to Source/Core/VideoBackends/Software/Src/TransformUnit.cpp index a1c2bd190a..e00f05e4aa 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp +++ b/Source/Core/VideoBackends/Software/Src/TransformUnit.cpp @@ -248,7 +248,7 @@ void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChann float attn; if (chan.attnfunc == 3) // spot - { + { float dist2 = ldir.length2(); float dist = sqrtf(dist2); ldir = ldir / dist; @@ -259,7 +259,7 @@ void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChann attn = SafeDivide(max(0.0f, cosAtt), distAtt); } else if (chan.attnfunc == 1) // specular - { + { // donko - what is going on here? 655.36 is a guess but seems about right. attn = (light->pos * normal) > -655.36 ? max(0.0f, (light->dir * normal)) : 0; ldir.set(1.0f, attn, attn * attn); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h b/Source/Core/VideoBackends/Software/Src/TransformUnit.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h rename to Source/Core/VideoBackends/Software/Src/TransformUnit.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Vec3.h b/Source/Core/VideoBackends/Software/Src/Vec3.h similarity index 97% rename from Source/Plugins/Plugin_VideoSoftware/Src/Vec3.h rename to Source/Core/VideoBackends/Software/Src/Vec3.h index d4b1502dcb..117a6f4197 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Vec3.h +++ b/Source/Core/VideoBackends/Software/Src/Vec3.h @@ -62,7 +62,7 @@ public: Vec3 operator %(const Vec3 &v) const { return Vec3(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); - } + } float length2() const { return x*x+y*y+z*z; } @@ -88,11 +88,11 @@ public: { return *((&x) + i); } - bool operator == (const Vec3 &other) const + bool operator == (const Vec3 &other) const { if (x==other.x && y==other.y && z==other.z) return true; - else + else return false; } void setZero() diff --git a/Source/Core/VideoBackends/Software/Src/VideoBackend.h b/Source/Core/VideoBackends/Software/Src/VideoBackend.h new file mode 100644 index 0000000000..4d85c637f0 --- /dev/null +++ b/Source/Core/VideoBackends/Software/Src/VideoBackend.h @@ -0,0 +1,67 @@ + +#ifndef SW_VIDEO_BACKEND_H_ +#define SW_VIDEO_BACKEND_H_ + +#include "VideoBackendBase.h" + +namespace SW +{ + +class VideoSoftware : public VideoBackend +{ + bool Initialize(void *&) override; + void Shutdown() override; + + std::string GetName() override; + + void EmuStateChange(EMUSTATE_CHANGE newState) override; + + void RunLoop(bool enable) override; + + void ShowConfig(void* parent) override; + + void Video_Prepare() override; + void Video_Cleanup() override; + + void Video_EnterLoop() override; + void Video_ExitLoop() override; + void Video_BeginField(u32, u32, u32) override; + void Video_EndField() override; + + u32 Video_AccessEFB(EFBAccessType, u32, u32, u32) override; + u32 Video_GetQueryResult(PerfQueryType type) override; + + void Video_AddMessage(const char* pstr, unsigned int milliseconds) override; + void Video_ClearMessages() override; + bool Video_Screenshot(const char* filename) override; + + int Video_LoadTexture(char *imagedata, u32 width, u32 height); + void Video_DeleteTexture(int texID); + void Video_DrawTexture(int texID, float *coords); + + void Video_SetRendering(bool bEnabled) override; + + void Video_GatherPipeBursted() override; + bool Video_IsHiWatermarkActive() override; + bool Video_IsPossibleWaitingSetDrawDone() override; + void Video_AbortFrame() override; + + readFn16 Video_CPRead16() override; + writeFn16 Video_CPWrite16() override; + readFn16 Video_PERead16() override; + writeFn16 Video_PEWrite16() override; + writeFn32 Video_PEWrite32() override; + + void UpdateFPSDisplay(const char*) override; + unsigned int PeekMessages() override; + + void PauseAndLock(bool doLock, bool unpauseOnUnlock=true) override; + void DoState(PointerWrap &p) override; + +public: + void CheckInvalidState() override; +}; + +} + +#endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp b/Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp rename to Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp index 18eaf08812..8d0d999bf7 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp +++ b/Source/Core/VideoBackends/Software/Src/VideoConfigDialog.cpp @@ -28,7 +28,7 @@ VideoConfigDialog::VideoConfigDialog(wxWindow* parent, const std::string& title, { vconfig.Load((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str()); - wxNotebook* const notebook = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize); + wxNotebook* const notebook = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize); // -- GENERAL -- { @@ -82,7 +82,7 @@ VideoConfigDialog::VideoConfigDialog(wxWindow* parent, const std::string& title, szr_info->Add(new SettingCheckBox(page_general, wxT("Various Statistics"), wxT(""), vconfig.bShowStats)); } - + // - utility { wxStaticBoxSizer* const group_utility = new wxStaticBoxSizer(wxVERTICAL, page_general, wxT("Utility")); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.h b/Source/Core/VideoBackends/Software/Src/VideoConfigDialog.h similarity index 100% rename from Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.h rename to Source/Core/VideoBackends/Software/Src/VideoConfigDialog.h diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp b/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp rename to Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp index 4580bafad8..899a5fab48 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp +++ b/Source/Core/VideoBackends/Software/Src/XFMemLoader.cpp @@ -23,7 +23,7 @@ void XFWritten(u32 transferSize, u32 baseAddress) if (baseAddress <= 0x1026 && topAddress >= 0x1020) Clipper::SetViewOffset(); - // fix lights so invalid values don't trash the lighting computations + // fix lights so invalid values don't trash the lighting computations if (baseAddress <= 0x067f && topAddress >= 0x0604) { u32* x = swxfregs.lights; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h b/Source/Core/VideoBackends/Software/Src/XFMemLoader.h similarity index 99% rename from Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h rename to Source/Core/VideoBackends/Software/Src/XFMemLoader.h index 75e05110bf..ff6c7267dd 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h +++ b/Source/Core/VideoBackends/Software/Src/XFMemLoader.h @@ -158,7 +158,7 @@ struct Projection union TexMtxInfo { - struct + struct { u32 unknown : 1; u32 projection : 1; // XF_TEXPROJ_X @@ -173,7 +173,7 @@ union TexMtxInfo union PostMtxInfo { - struct + struct { u32 index : 6; // base row of dual transform matrix u32 unused : 2; diff --git a/Source/Core/VideoBackends/Software/Src/stdafx.cpp b/Source/Core/VideoBackends/Software/Src/stdafx.cpp new file mode 100644 index 0000000000..b602b39925 --- /dev/null +++ b/Source/Core/VideoBackends/Software/Src/stdafx.cpp @@ -0,0 +1,5 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "stdafx.h" diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/stdafx.h b/Source/Core/VideoBackends/Software/Src/stdafx.h similarity index 92% rename from Source/Plugins/Plugin_VideoSoftware/Src/stdafx.h rename to Source/Core/VideoBackends/Software/Src/stdafx.h index 60f0912113..9d8868e8a9 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/stdafx.h +++ b/Source/Core/VideoBackends/Software/Src/stdafx.h @@ -9,5 +9,5 @@ #endif #include -#include +#include diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index 8503377779..9566712191 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -39,8 +39,7 @@ set(SRCS Src/BPFunctions.cpp Src/XFMemory.cpp Src/XFStructs.cpp Src/memcpy_amd.cpp) - -set(LIBS core) +set(LIBS core png) if(NOT _M_GENERIC) set(SRCS ${SRCS} Src/x64TextureDecoder.cpp @@ -61,8 +60,7 @@ if(LIBAV_FOUND OR WIN32) set(SRCS ${SRCS} Src/AVIDump.cpp) endif() -add_library(videocommon STATIC ${SRCS}) -target_link_libraries(videocommon ${LIBS}) +add_dolphin_library(videocommon "${SRCS}" "${LIBS}") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") if(LIBAV_FOUND) diff --git a/Source/Core/VideoCommon/Src/AVIDump.cpp b/Source/Core/VideoCommon/Src/AVIDump.cpp index 0910381d74..d6f2755e33 100644 --- a/Source/Core/VideoCommon/Src/AVIDump.cpp +++ b/Source/Core/VideoCommon/Src/AVIDump.cpp @@ -4,7 +4,7 @@ #if defined(__FreeBSD__) #define __STDC_CONSTANT_MACROS 1 -#endif +#endif #include "AVIDump.h" #include "HW/VideoInterface.h" //for TargetRefreshRate @@ -71,9 +71,9 @@ bool AVIDump::CreateFile() HRESULT hr = AVIFileOpenA(&m_file, movie_file_name, OF_WRITE | OF_CREATE, NULL); if (FAILED(hr)) { - if (hr == AVIERR_BADFORMAT) NOTICE_LOG(VIDEO, "The file couldn't be read, indicating a corrupt file or an unrecognized format."); - if (hr == AVIERR_MEMORY) NOTICE_LOG(VIDEO, "The file could not be opened because of insufficient memory."); - if (hr == AVIERR_FILEREAD) NOTICE_LOG(VIDEO, "A disk error occurred while reading the file."); + if (hr == AVIERR_BADFORMAT) NOTICE_LOG(VIDEO, "The file couldn't be read, indicating a corrupt file or an unrecognized format."); + if (hr == AVIERR_MEMORY) NOTICE_LOG(VIDEO, "The file could not be opened because of insufficient memory."); + if (hr == AVIERR_FILEREAD) NOTICE_LOG(VIDEO, "A disk error occurred while reading the file."); if (hr == AVIERR_FILEOPEN) NOTICE_LOG(VIDEO, "A disk error occurred while opening the file."); if (hr == REGDB_E_CLASSNOTREG) NOTICE_LOG(VIDEO, "AVI class not registered"); Stop(); diff --git a/Source/Core/VideoCommon/Src/AVIDump.h b/Source/Core/VideoCommon/Src/AVIDump.h index dced69887e..f5697613ca 100644 --- a/Source/Core/VideoCommon/Src/AVIDump.h +++ b/Source/Core/VideoCommon/Src/AVIDump.h @@ -29,7 +29,7 @@ class AVIDump static bool Start(int w, int h); #endif static void AddFrame(const u8* data, int width, int height); - + static void Stop(); }; diff --git a/Source/Core/VideoCommon/Src/BPFunctions.cpp b/Source/Core/VideoCommon/Src/BPFunctions.cpp index 9f4f4f3060..43623a94a8 100644 --- a/Source/Core/VideoCommon/Src/BPFunctions.cpp +++ b/Source/Core/VideoCommon/Src/BPFunctions.cpp @@ -49,8 +49,6 @@ void SetScissor() TargetRectangle trc = g_renderer->ConvertEFBRectangle(rc); g_renderer->SetScissorRect(trc); - - UpdateViewportWithCorrection(); } void SetLineWidth() diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h index 83dbefed50..94455b04bf 100644 --- a/Source/Core/VideoCommon/Src/BPMemory.h +++ b/Source/Core/VideoCommon/Src/BPMemory.h @@ -21,7 +21,7 @@ #define BPMEM_LINEPTWIDTH 0x22 #define BPMEM_PERF0_TRI 0x23 #define BPMEM_PERF0_QUAD 0x24 -#define BPMEM_RAS1_SS0 0x25 +#define BPMEM_RAS1_SS0 0x25 #define BPMEM_RAS1_SS1 0x26 #define BPMEM_IREF 0x27 #define BPMEM_TREF 0x28 // 0x28 + 8 @@ -47,7 +47,7 @@ #define BPMEM_TRIGGER_EFB_COPY 0x52 #define BPMEM_COPYFILTER0 0x53 #define BPMEM_COPYFILTER1 0x54 -#define BPMEM_CLEARBBOX1 0x55 +#define BPMEM_CLEARBBOX1 0x55 #define BPMEM_CLEARBBOX2 0x56 #define BPMEM_CLEAR_PIXEL_PERF 0x57 #define BPMEM_REVBITS 0x58 @@ -181,7 +181,7 @@ enum Compare enum AlphaOp { - ALPHAOP_AND = 0, + ALPHAOP_AND = 0, ALPHAOP_OR, ALPHAOP_XOR, ALPHAOP_XNOR, @@ -289,7 +289,7 @@ struct TevStageCombiner }; union AlphaCombiner { - struct + struct { u32 rswap : 2; u32 tswap : 2; @@ -367,7 +367,7 @@ struct TevStageCombiner }; struct { - u32 hex : 21; + u32 hex : 21; u32 unused : 11; }; @@ -442,7 +442,7 @@ union RAS1_IREF union TexMode0 { - struct + struct { u32 wrap_s : 2; u32 wrap_t : 2; @@ -458,7 +458,7 @@ union TexMode0 }; union TexMode1 { - struct + struct { u32 min_lod : 8; u32 max_lod : 8; @@ -467,7 +467,7 @@ union TexMode1 }; union TexImage0 { - struct + struct { u32 width : 10; //actually w-1 u32 height : 10; //actually h-1 @@ -477,7 +477,7 @@ union TexImage0 }; union TexImage1 { - struct + struct { u32 tmem_even : 15; // tmem line index for even LODs u32 cache_width : 3; @@ -489,10 +489,10 @@ union TexImage1 union TexImage2 { - struct + struct { u32 tmem_odd : 15; // tmem line index for odd LODs - u32 cache_width : 3; + u32 cache_width : 3; u32 cache_height : 3; }; u32 hex; @@ -500,7 +500,7 @@ union TexImage2 union TexImage3 { - struct + struct { u32 image_base: 24; //address in memory >> 5 (was 20 for GC) }; @@ -508,7 +508,7 @@ union TexImage3 }; union TexTLUT { - struct + struct { u32 tmem_offset : 10; u32 tlut_format : 2; @@ -518,7 +518,7 @@ union TexTLUT union ZTex1 { - struct + struct { u32 bias : 24; }; @@ -527,7 +527,7 @@ union ZTex1 union ZTex2 { - struct + struct { u32 type : 2; // TEV_Z_TYPE_X u32 op : 2; // GXZTexOp @@ -563,7 +563,7 @@ struct FourTexUnits union GenMode { - struct + struct { u32 numtexgens : 4; // 0xF u32 numcolchans : 5; // 0x1E0 @@ -578,7 +578,7 @@ union GenMode union LPSize { - struct + struct { u32 linesize : 8; // in 1/6th pixels u32 pointsize : 8; // in 1/6th pixels @@ -593,7 +593,7 @@ union LPSize union X12Y12 { - struct + struct { u32 y : 12; u32 x : 12; @@ -602,7 +602,7 @@ union X12Y12 }; union X10Y10 { - struct + struct { u32 x : 10; u32 y : 10; @@ -626,7 +626,7 @@ union X10Y10 union BlendMode { - struct + struct { u32 blendenable : 1; u32 logicopenable : 1; @@ -644,7 +644,7 @@ union BlendMode union FogParam0 { - struct + struct { u32 mantissa : 11; u32 exponent : 8; @@ -674,7 +674,7 @@ union FogParam3 // amount to subtract from eyespacez after range adjustment float GetC() - { + { union { u32 i; float f; } dummy; dummy.i = ((u32)c_sign << 31) | ((u32)c_exp << 23) | ((u32)c_mant << 12); // scale mantissa from 11 to 23 bits return dummy.f; @@ -814,7 +814,7 @@ union PE_CONTROL union TCInfo { - struct + struct { u32 scale_minus_1 : 16; u32 range_bias : 1; @@ -924,7 +924,7 @@ union AlphaTest union UPE_Copy { u32 Hex; - struct + struct { u32 clamp0 : 1; // if set clamp top u32 clamp1 : 1; // if set clamp bottom @@ -939,7 +939,7 @@ union UPE_Copy u32 intensity_fmt : 1; // if set, is an intensity format (I4,I8,IA4,IA8) u32 auto_conv : 1; // if 0 automatic color conversion by texture format and pixel type }; - u32 tp_realFormat() { + u32 tp_realFormat() { return target_pixel_format / 2 + (target_pixel_format & 1) * 8; } }; @@ -983,7 +983,7 @@ struct BPMemory // indirect matrices (set by GXSetIndTexMtx, selected by TevStageIndirect::mid) // abc form a 2x3 offset matrix, there's 3 such matrices // the 3 offset matrices can either be indirect type, S-type, or T-type - // 6bit scale factor s is distributed across IND_MTXA/B/C. + // 6bit scale factor s is distributed across IND_MTXA/B/C. // before using matrices scale by 2^-(s-17) IND_MTX indmtx[3];//06-0e GXSetIndTexMtx, 2x3 matrices IND_IMASK imask;//0f diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp index 00cecf0082..ed3fcce5dc 100644 --- a/Source/Core/VideoCommon/Src/BPStructs.cpp +++ b/Source/Core/VideoCommon/Src/BPStructs.cpp @@ -13,7 +13,6 @@ #include "BPFunctions.h" #include "BPStructs.h" #include "TextureDecoder.h" -#include "OpcodeDecoding.h" #include "VertexLoader.h" #include "VertexShaderManager.h" #include "Thread.h" @@ -28,7 +27,7 @@ static int numWrites; extern volatile bool g_bSkipCurrentFrame; -static const float s_gammaLUT[] = +static const float s_gammaLUT[] = { 1.0f, 1.7f, @@ -68,7 +67,7 @@ void BPWritten(const BPCmd& bp) just stuff geometry in them and don't put state changes there ---------------------------------------------------------------------------------------------------------------- */ - + // check for invalid state, else unneeded configuration are built g_video_backend->CheckInvalidState(); @@ -105,7 +104,7 @@ void BPWritten(const BPCmd& bp) { numWrites = 0; } - else if (++numWrites >= 100) // seem that if 100 consecutive BP writes are called to either of these addresses in ZTP, + else if (++numWrites >= 100) // seem that if 100 consecutive BP writes are called to either of these addresses in ZTP, { // then it is safe to assume the map texture address is currently loaded into the BP memory mapTexAddress = bpmem.tex[0].texImage3[0].hex << 5; mapTexFound = true; @@ -120,7 +119,7 @@ void BPWritten(const BPCmd& bp) FlushPipeline(); } } // END ZTP SPEEDUP HACK - else + else { if (((s32*)&bpmem)[bp.address] == bp.newvalue) { @@ -144,7 +143,7 @@ void BPWritten(const BPCmd& bp) } ((u32*)&bpmem)[bp.address] = bp.newvalue; - + switch (bp.address) { case BPMEM_GENMODE: // Set the Generation Mode @@ -168,12 +167,16 @@ void BPWritten(const BPCmd& bp) case BPMEM_IND_MTXA+6: case BPMEM_IND_MTXB+6: case BPMEM_IND_MTXC+6: - PixelShaderManager::SetIndMatrixChanged((bp.address - BPMEM_IND_MTXA) / 3); + if(bp.changes) + PixelShaderManager::SetIndMatrixChanged((bp.address - BPMEM_IND_MTXA) / 3); break; case BPMEM_RAS1_SS0: // Index Texture Coordinate Scale 0 - PixelShaderManager::SetIndTexScaleChanged(0x03); + if(bp.changes) + PixelShaderManager::SetIndTexScaleChanged(false); + break; case BPMEM_RAS1_SS1: // Index Texture Coordinate Scale 1 - PixelShaderManager::SetIndTexScaleChanged(0x0c); + if(bp.changes) + PixelShaderManager::SetIndTexScaleChanged(true); break; // ---------------- // Scissor Control @@ -182,6 +185,7 @@ void BPWritten(const BPCmd& bp) case BPMEM_SCISSORBR: // Scissor Rectable Bottom, Right case BPMEM_SCISSOROFFSET: // Scissor Offset SetScissor(); + VertexShaderManager::SetViewportChanged(); break; case BPMEM_LINEPTWIDTH: // Line Width SetLineWidth(); @@ -195,24 +199,24 @@ void BPWritten(const BPCmd& bp) { if (bp.changes & 0xFFFF) { - PRIM_LOG("blendmode: en=%d, open=%d, colupd=%d, alphaupd=%d, dst=%d, src=%d, sub=%d, mode=%d", + PRIM_LOG("blendmode: en=%d, open=%d, colupd=%d, alphaupd=%d, dst=%d, src=%d, sub=%d, mode=%d", bpmem.blendmode.blendenable, bpmem.blendmode.logicopenable, bpmem.blendmode.colorupdate, bpmem.blendmode.alphaupdate, bpmem.blendmode.dstfactor, bpmem.blendmode.srcfactor, bpmem.blendmode.subtract, bpmem.blendmode.logicmode); // Set LogicOp Blending Mode - if (bp.changes & 2) + if (bp.changes & 0xF002) // logicopenable | logicmode SetLogicOpMode(); // Set Dithering Mode - if (bp.changes & 4) + if (bp.changes & 4) // dither SetDitherMode(); // Set Blending Mode - if (bp.changes & 0xFF1) + if (bp.changes & 0xFF1) // blendenable | alphaupdate | dstfactor | srcfactor | subtract SetBlendMode(); // Set Color Mask - if (bp.changes & 0x18) + if (bp.changes & 0x18) // colorupdate | alphaupdate SetColorMask(); } break; @@ -220,7 +224,8 @@ void BPWritten(const BPCmd& bp) case BPMEM_CONSTANTALPHA: // Set Destination Alpha { PRIM_LOG("constalpha: alp=%d, en=%d", bpmem.dstalpha.alpha, bpmem.dstalpha.enable); - PixelShaderManager::SetDestAlpha(bpmem.dstalpha); + if(bp.changes & 0xFF) + PixelShaderManager::SetDestAlpha(); if(bp.changes & 0x100) SetBlendMode(); break; @@ -260,7 +265,7 @@ void BPWritten(const BPCmd& bp) EFBRectangle rc; rc.left = (int)bpmem.copyTexSrcXY.x; rc.top = (int)bpmem.copyTexSrcXY.y; - + // Here Width+1 like Height, otherwise some textures are corrupted already since the native resolution. rc.right = (int)(bpmem.copyTexSrcXY.x + bpmem.copyTexSrcWH.x + 1); rc.bottom = (int)(bpmem.copyTexSrcXY.y + bpmem.copyTexSrcWH.y + 1); @@ -282,7 +287,7 @@ void BPWritten(const BPCmd& bp) // We should be able to get away with deactivating the current bbox tracking // here. Not sure if there's a better spot to put this. // the number of lines copied is determined by the y scale * source efb height - + PixelEngine::bbox_active = false; float yScale; @@ -298,8 +303,8 @@ void BPWritten(const BPCmd& bp) xfbLines = MAX_XFB_HEIGHT; } - RenderToXFB(bp, rc, yScale, xfbLines, - bpmem.copyTexDest << 5, + RenderToXFB(bp, rc, yScale, xfbLines, + bpmem.copyTexDest << 5, bpmem.copyMipMapStrideChannels << 4, (u32)xfbLines, s_gammaLUT[PE_copy.gamma]); @@ -341,35 +346,38 @@ void BPWritten(const BPCmd& bp) case BPMEM_FOGRANGE+3: case BPMEM_FOGRANGE+4: case BPMEM_FOGRANGE+5: - if (!GetConfig(CONFIG_DISABLEFOG)) + if (!GetConfig(CONFIG_DISABLEFOG) && bp.changes) PixelShaderManager::SetFogRangeAdjustChanged(); break; case BPMEM_FOGPARAM0: case BPMEM_FOGBMAGNITUDE: case BPMEM_FOGBEXPONENT: case BPMEM_FOGPARAM3: - if (!GetConfig(CONFIG_DISABLEFOG)) + if (!GetConfig(CONFIG_DISABLEFOG) && bp.changes) PixelShaderManager::SetFogParamChanged(); break; case BPMEM_FOGCOLOR: // Fog Color - if (!GetConfig(CONFIG_DISABLEFOG)) + if (!GetConfig(CONFIG_DISABLEFOG) && bp.changes) PixelShaderManager::SetFogColorChanged(); break; case BPMEM_ALPHACOMPARE: // Compare Alpha Values PRIM_LOG("alphacmp: ref0=%d, ref1=%d, comp0=%d, comp1=%d, logic=%d", bpmem.alpha_test.ref0, bpmem.alpha_test.ref1, bpmem.alpha_test.comp0, bpmem.alpha_test.comp1, bpmem.alpha_test.logic); - PixelShaderManager::SetAlpha(bpmem.alpha_test); - g_renderer->SetColorMask(); + if(bp.changes & 0xFFFF) + PixelShaderManager::SetAlpha(); + if(bp.changes) + g_renderer->SetColorMask(); break; case BPMEM_BIAS: // BIAS PRIM_LOG("ztex bias=0x%x", bpmem.ztex1.bias); - PixelShaderManager::SetZTextureBias(bpmem.ztex1.bias); + if(bp.changes) + PixelShaderManager::SetZTextureBias(); break; case BPMEM_ZTEX2: // Z Texture type { if (bp.changes & 3) PixelShaderManager::SetZTextureTypeChanged(); - #if defined(_DEBUG) || defined(DEBUGFAST) + #if defined(_DEBUG) || defined(DEBUGFAST) const char* pzop[] = {"DISABLE", "ADD", "REPLACE", "?"}; const char* pztype[] = {"Z8", "Z16", "Z24", "?"}; PRIM_LOG("ztex op=%s, type=%s", pzop[bpmem.ztex2.op], pztype[bpmem.ztex2.type]); @@ -434,7 +442,7 @@ void BPWritten(const BPCmd& bp) { int right = bp.newvalue >> 10; int left = bp.newvalue & 0x3ff; - + // We should only set these if bbox is calculated properly. PixelEngine::bbox[0] = left; PixelEngine::bbox[1] = right; @@ -490,7 +498,7 @@ void BPWritten(const BPCmd& bp) case BPMEM_IND_IMASK: // Index Mask ? case BPMEM_REVBITS: // Always set to 0x0F when GX_InitRevBits() is called. break; - + case BPMEM_CLEAR_PIXEL_PERF: // GXClearPixMetric writes 0xAAA here, Sunshine alternates this register between values 0x000 and 0xAAA g_perf_query->ResetQuery(); @@ -573,7 +581,8 @@ void BPWritten(const BPCmd& bp) case BPMEM_SU_TSIZE+12: case BPMEM_SU_SSIZE+14: case BPMEM_SU_TSIZE+14: - PixelShaderManager::SetTexCoordChanged((bp.address - BPMEM_SU_SSIZE) >> 1); + if(bp.changes) + PixelShaderManager::SetTexCoordChanged((bp.address - BPMEM_SU_SSIZE) >> 1); break; // ------------------------ // BPMEM_TX_SETMODE0 - (Texture lookup and filtering mode) LOD/BIAS Clamp, MaxAnsio, LODBIAS, DiagLoad, Min Filter, Mag Filter, Wrap T, S @@ -627,9 +636,9 @@ void BPWritten(const BPCmd& bp) // don't compare with changes! int num = (bp.address >> 1) & 0x3; if ((bp.address & 1) == 0) - PixelShaderManager::SetColorChanged(bpmem.tevregs[num].low.type, num, false); + PixelShaderManager::SetColorChanged(bpmem.tevregs[num].low.type, num); else - PixelShaderManager::SetColorChanged(bpmem.tevregs[num].high.type, num, true); + PixelShaderManager::SetColorChanged(bpmem.tevregs[num].high.type, num); } break; diff --git a/Source/Core/VideoCommon/Src/CPMemory.h b/Source/Core/VideoCommon/Src/CPMemory.h index 28bc3d7d95..0647c2ae39 100644 --- a/Source/Core/VideoCommon/Src/CPMemory.h +++ b/Source/Core/VideoCommon/Src/CPMemory.h @@ -38,7 +38,7 @@ enum enum { FORMAT_16B_565 = 0, // NA - FORMAT_24B_888 = 1, + FORMAT_24B_888 = 1, FORMAT_32B_888x = 2, FORMAT_16B_4444 = 3, FORMAT_24B_6666 = 4, @@ -56,7 +56,7 @@ enum union TVtxDesc { u64 Hex; - struct + struct { // 0: not present // 1: present @@ -70,9 +70,9 @@ union TVtxDesc u32 Tex6MatIdx : 1; u32 Tex7MatIdx : 1; - // 00: not present - // 01: direct - // 10: 8 bit index + // 00: not present + // 01: direct + // 10: 8 bit index // 11: 16 bit index u32 Position : 2; u32 Normal : 2; @@ -98,21 +98,21 @@ union TVtxDesc union UVAT_group0 { u32 Hex; - struct + struct { // 0:8 u32 PosElements : 1; - u32 PosFormat : 3; - u32 PosFrac : 5; + u32 PosFormat : 3; + u32 PosFrac : 5; // 9:12 - u32 NormalElements : 1; - u32 NormalFormat : 3; + u32 NormalElements : 1; + u32 NormalFormat : 3; // 13:16 u32 Color0Elements : 1; - u32 Color0Comp : 3; + u32 Color0Comp : 3; // 17:20 u32 Color1Elements : 1; - u32 Color1Comp : 3; + u32 Color1Comp : 3; // 21:29 u32 Tex0CoordElements : 1; u32 Tex0CoordFormat : 3; @@ -126,7 +126,7 @@ union UVAT_group0 union UVAT_group1 { u32 Hex; - struct + struct { // 0:8 u32 Tex1CoordElements : 1; @@ -143,7 +143,7 @@ union UVAT_group1 // 27:30 u32 Tex4CoordElements : 1; u32 Tex4CoordFormat : 3; - // + // u32 : 1; }; }; @@ -151,7 +151,7 @@ union UVAT_group1 union UVAT_group2 { u32 Hex; - struct + struct { // 0:4 u32 Tex4Frac : 5; @@ -186,10 +186,10 @@ struct TexAttr struct TVtxAttr { u8 PosElements; - u8 PosFormat; - u8 PosFrac; + u8 PosFormat; + u8 PosFrac; u8 NormalElements; - u8 NormalFormat; + u8 NormalFormat; ColorAttr color[2]; TexAttr texCoord[8]; u8 ByteDequant; diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index 5c3848de4f..4f64d4172c 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -8,7 +8,6 @@ #include "MathUtil.h" #include "Thread.h" #include "Atomic.h" -#include "OpcodeDecoding.h" #include "Fifo.h" #include "ChunkFile.h" #include "CommandProcessor.h" @@ -51,7 +50,6 @@ volatile bool interruptSet= false; volatile bool interruptWaiting= false; volatile bool interruptTokenWaiting = false; volatile bool interruptFinishWaiting = false; -volatile bool waitingForPEInterruptDisable = false; volatile u32 VITicks = CommandProcessor::m_cpClockOrigin; @@ -110,7 +108,7 @@ void Init() m_bboxbottom = 480; m_tokenReg = 0; - + memset(&fifo,0,sizeof(fifo)); fifo.CPCmdIdle = 1; fifo.CPReadIdle = 1; @@ -455,9 +453,7 @@ void STACKALIGN GatherPipeBursted() if((ProcessorInterface::Fifo_CPUEnd == fifo.CPEnd) && (ProcessorInterface::Fifo_CPUBase == fifo.CPBase) && fifo.CPReadWriteDistance > 0) { - waitingForPEInterruptDisable = true; ProcessFifoAllDistance(); - waitingForPEInterruptDisable = false; } } return; @@ -617,7 +613,7 @@ void ProcessFifoEvents() void Shutdown() { - + } void SetCpStatusRegister() @@ -660,7 +656,7 @@ void SetCpControlRegister() ProcessorInterface::Fifo_CPUBase = fifo.CPBase; ProcessorInterface::Fifo_CPUEnd = fifo.CPEnd; } - + if(fifo.bFF_GPReadEnable && !m_CPCtrlReg.GPReadEnable) { fifo.bFF_GPReadEnable = m_CPCtrlReg.GPReadEnable; diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.h b/Source/Core/VideoCommon/Src/CommandProcessor.h index ce18da4686..6d480ef0bc 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.h +++ b/Source/Core/VideoCommon/Src/CommandProcessor.h @@ -23,8 +23,7 @@ extern volatile bool interruptSet; extern volatile bool interruptWaiting; extern volatile bool interruptTokenWaiting; extern volatile bool interruptFinishWaiting; -extern volatile bool waitingForPEInterruptDisable; - + // internal hardware addresses enum { diff --git a/Source/Core/VideoCommon/Src/ConstantManager.h b/Source/Core/VideoCommon/Src/ConstantManager.h new file mode 100644 index 0000000000..3c09c2007e --- /dev/null +++ b/Source/Core/VideoCommon/Src/ConstantManager.h @@ -0,0 +1,42 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#ifndef _CONSTANTMANAGER_H +#define _CONSTANTMANAGER_H + +// all constant buffer attributes must be 16 bytes aligned, so this are the only allowed components: +typedef float float4[4]; +typedef u32 uint4[4]; +typedef s32 int4[4]; + +struct PixelShaderConstants +{ + float4 colors[4]; + float4 kcolors[4]; + float4 alpha; + float4 texdims[8]; + float4 zbias[2]; + float4 indtexscale[2]; + float4 indtexmtx[6]; + float4 fog[3]; + + // For pixel lighting + float4 plights[40]; + float4 pmaterials[4]; +}; + +struct VertexShaderConstants +{ + float4 posnormalmatrix[6]; + float4 projection[4]; + float4 materials[4]; + float4 lights[40]; + float4 texmatrices[24]; + float4 transformmatrices[64]; + float4 normalmatrices[32]; + float4 posttransformmatrices[64]; + float4 depthparams; +}; + +#endif \ No newline at end of file diff --git a/Source/Core/VideoCommon/Src/DataReader.h b/Source/Core/VideoCommon/Src/DataReader.h index 3488642385..95c992a011 100644 --- a/Source/Core/VideoCommon/Src/DataReader.h +++ b/Source/Core/VideoCommon/Src/DataReader.h @@ -43,7 +43,7 @@ __forceinline u16 DataPeek16(int _uOffset) return DataPeek(_uOffset); } -__forceinline u32 DataPeek32(int _uOffset) +__forceinline u32 DataPeek32(int _uOffset) { return DataPeek(_uOffset); } diff --git a/Source/Core/VideoCommon/Src/Debugger.cpp b/Source/Core/VideoCommon/Src/Debugger.cpp index 85a9ba61f6..321fed8291 100644 --- a/Source/Core/VideoCommon/Src/Debugger.cpp +++ b/Source/Core/VideoCommon/Src/Debugger.cpp @@ -108,7 +108,7 @@ void GFXDebuggerBase::DumpPixelShader(const char* path) } File::CreateEmptyFile(filename); - File::WriteStringToFile(true, output, filename); + File::WriteStringToFile(output, filename); } void GFXDebuggerBase::DumpVertexShader(const char* path) @@ -117,7 +117,7 @@ void GFXDebuggerBase::DumpVertexShader(const char* path) sprintf(filename, "%sdump_vs.txt", path); File::CreateEmptyFile(filename); -/// File::WriteStringToFile(true, GenerateVertexShaderCode(g_nativeVertexFmt->m_components, g_ActiveConfig.backend_info.APIType), filename); +/// File::WriteStringToFile(GenerateVertexShaderCode(g_nativeVertexFmt->m_components, g_ActiveConfig.backend_info.APIType), filename); } void GFXDebuggerBase::DumpPixelShaderConstants(const char* path) diff --git a/Source/Core/VideoCommon/Src/DriverDetails.cpp b/Source/Core/VideoCommon/Src/DriverDetails.cpp index 76cf08dce9..d2e8f2a059 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.cpp +++ b/Source/Core/VideoCommon/Src/DriverDetails.cpp @@ -11,8 +11,9 @@ namespace DriverDetails { struct BugInfo { + Vendor m_vendor; // which vendor has the error + Driver m_driver; // which driver has the error Bug m_bug; // Which bug it is - u32 m_devfamily; // Which device(family) has the error double m_versionstart; // When it started double m_versionend; // When it ended bool m_hasbug; // Does it have it? @@ -20,52 +21,76 @@ namespace DriverDetails // Local members Vendor m_vendor = VENDOR_UNKNOWN; - u32 m_devfamily = 0; + Driver m_driver = DRIVER_UNKNOWN; double m_version = 0.0; // This is a list of all known bugs for each vendor // We use this to check if the device and driver has a issue - BugInfo m_qualcommbugs[] = { - {BUG_NODYNUBOACCESS, 300, 14.0, -1.0}, - {BUG_BROKENCENTROID, 300, 14.0, -1.0}, - {BUG_BROKENINFOLOG, 300, -1.0, -1.0}, + BugInfo m_known_bugs[] = { + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_NODYNUBOACCESS, 14.0, 46.0, true}, + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENCENTROID, 14.0, -1.0, true}, + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true}, + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_ANNIHILATEDUBOS, 41.0, 46.0, true}, + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENSWAP, -1.0, -1.0, true}, + {VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true}, + {VENDOR_ARM, DRIVER_ARM_T6XX, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true}, + {VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true}, + {VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true}, + {VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true}, + {VENDOR_ATI, DRIVER_ATI, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true}, + {VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true}, + {VENDOR_TEGRA, DRIVER_NVIDIA, BUG_ISTEGRA, -1.0, -1.0, true}, + {VENDOR_IMGTEC, DRIVER_IMGTEC, BUG_ISPOWERVR, -1.0, -1.0, true}, }; - std::map, BugInfo> m_bugs; - - // Private function - void InitBugMap() - { - switch(m_vendor) - { - case VENDOR_QUALCOMM: - for (unsigned int a = 0; a < (sizeof(m_qualcommbugs) / sizeof(BugInfo)); ++a) - m_bugs[std::make_pair(m_vendor, m_qualcommbugs[a].m_bug)] = m_qualcommbugs[a]; - break; - case VENDOR_ARM: - default: - break; - } - } + std::map m_bugs; - void Init(Vendor vendor, const u32 devfamily, const double version) + void Init(Vendor vendor, Driver driver, const double version) { m_vendor = vendor; - m_devfamily = devfamily; + m_driver = driver; m_version = version; - InitBugMap(); - for (auto it = m_bugs.begin(); it != m_bugs.end(); ++it) - if (it->second.m_devfamily == m_devfamily) - if (it->second.m_versionend == -1.0 || (it->second.m_versionstart <= m_version && it->second.m_versionend > m_version)) - it->second.m_hasbug = true; + if (driver == DRIVER_UNKNOWN) + switch(vendor) + { + case VENDOR_NVIDIA: + case VENDOR_TEGRA: + m_driver = DRIVER_NVIDIA; + break; + case VENDOR_ATI: + m_driver = DRIVER_ATI; + break; + case VENDOR_INTEL: + m_driver = DRIVER_INTEL; + break; + case VENDOR_IMGTEC: + m_driver = DRIVER_IMGTEC; + break; + case VENDOR_VIVANTE: + m_driver = DRIVER_VIVANTE; + break; + default: + break; + } + + for(auto& bug : m_known_bugs) + { + if( + ( bug.m_vendor == m_vendor || bug.m_vendor == VENDOR_ALL ) && + ( bug.m_driver == m_driver || bug.m_driver == DRIVER_ALL ) && + ( bug.m_versionstart <= m_version || bug.m_versionstart == -1 ) && + ( bug.m_versionend > m_version || bug.m_versionend == -1 ) + ) + m_bugs.insert(std::make_pair(bug.m_bug, bug)); + } } bool HasBug(Bug bug) { - auto it = m_bugs.find(std::make_pair(m_vendor, bug)); + auto it = m_bugs.find(bug); if (it == m_bugs.end()) - return false; + return false; return it->second.m_hasbug; } } diff --git a/Source/Core/VideoCommon/Src/DriverDetails.h b/Source/Core/VideoCommon/Src/DriverDetails.h index bfa9c572d0..49af92084e 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.h +++ b/Source/Core/VideoCommon/Src/DriverDetails.h @@ -10,7 +10,8 @@ namespace DriverDetails // Tegra and Nvidia are separated out due to such substantial differences enum Vendor { - VENDOR_NVIDIA = 0, + VENDOR_ALL = 0, + VENDOR_NVIDIA, VENDOR_ATI, VENDOR_INTEL, VENDOR_ARM, @@ -18,9 +19,31 @@ namespace DriverDetails VENDOR_IMGTEC, VENDOR_TEGRA, VENDOR_VIVANTE, + VENDOR_MESA, VENDOR_UNKNOWN }; + // Enum of known drivers + enum Driver + { + DRIVER_ALL = 0, + DRIVER_NVIDIA, // Official Nvidia, including mobile GPU + DRIVER_NOUVEAU, // OSS nouveau + DRIVER_ATI, // Official ATI + DRIVER_R600, // OSS Radeon + DRIVER_INTEL, // Official Intel + DRIVER_I965, // OSS Intel + DRIVER_ARM_4XX, // Official Mali driver + DRIVER_ARM_T6XX, // Official Mali driver + DRIVER_LIMA, // OSS Mali driver + DRIVER_QUALCOMM_3XX, // Official Adreno driver 3xx + DRIVER_QUALCOMM_2XX, // Official Adreno driver 2xx + DRIVER_FREEDRENO, // OSS Adreno driver + DRIVER_IMGTEC, // OSS PowerVR driver + DRIVER_VIVANTE, // Official vivante driver + DRIVER_UNKNOWN // Unknown driver, default to official hardware driver + }; + // Enum of known bugs // These can be vendor specific, but we put them all in here // For putting a new bug in here, make sure to put a detailed comment above the enum @@ -30,7 +53,7 @@ namespace DriverDetails // Bug: No Dynamic UBO array object access // Affected Devices: Qualcomm/Adreno // Started Version: 14 - // Ended Version: -1 + // Ended Version: 53 // Accessing UBO array members dynamically causes the Adreno shader compiler to crash // Errors out with "Internal Error" BUG_NODYNUBOACCESS = 0, @@ -46,17 +69,80 @@ namespace DriverDetails // Affected devices: Qualcomm/Adreno // Started Version: ? (Noticed on v14) // Ended Version: -1 - // When compiling a shader, it is important that when it fails, + // When compiling a shader, it is important that when it fails, // you first get the length of the information log prior to grabbing it. // This allows you to allocate an array to store all of the log // Adreno devices /always/ return 0 when querying GL_INFO_LOG_LENGTH // They also max out at 1024 bytes(1023 characters + null terminator) for the log BUG_BROKENINFOLOG, + // Bug: UBO buffer offset broken + // Affected devices: all mesa drivers + // Started Version: 9.0 (mesa doesn't support ubo before) + // Ended Version: up to 9.2 + // The offset of glBindBufferRange was ignored on all Mesa Gallium3D drivers until 9.1.3 + // Nouveau stored the offset as u16 which isn't enough for all cases with range until 9.1.6 + // I965 has broken data fetches from uniform buffers which results in a dithering until 9.2.0 + BUG_BROKENUBO, + // Bug: The hacked buffer upload method isn't working + // This isn't a bug as the hacked buffer itself isn't used to work. + // I'm still surprised that it works on so many drivers. + // Affected devices: - amd close sourced driver + // - nouveau + // - maybe also some others + // This hack is evil. It's like free(pointer); *pointer = data; + BUG_BROKENHACKEDBUFFER, + // Bug: The pinned memory extension isn't working for index buffers + // Affected devices: AMD as they are the only vendor providing this extension + // Started Version: ? + // Ended Version: 13.9 working for me (neobrain). + // Pinned memory is disabled for index buffer as the amd driver (the only one with pinned memory support) seems + // to be broken. We just get flickering/black rendering when using pinned memory here -- degasus - 2013/08/20 + // Please see issue #6105 on google code. Let's hope buffer storage solves this issues. + // TODO: Detect broken drivers. + BUG_BROKENPINNEDMEMORY, + // Bug: Entirely broken UBOs + // Affected devices: Qualcomm/Adreno + // Started Version: ? (Noticed on v45) + // Ended Version: 53 + // Uniform buffers are entirely broken on Qualcomm drivers with v45 + // Trying to use the uniform buffers causes a malloc to fail inside the driver + // To be safe, blanket drivers from v41 - v45 + BUG_ANNIHILATEDUBOS, + // Bug : Can't draw on screen text and clear correctly. + // Affected devices: Qualcomm/Adreno + // Started Version: ? + // Ended Version: ? + // Current code for drawing on screen text and clearing the framebuffer doesn't work on Adreno + // Drawing on screen text causes the whole screen to swizzle in a terrible fashion + // Clearing the framebuffer causes one to never see a frame. + BUG_BROKENSWAP, + // Bug: Running on a Tegra 4 device + // Affected devices: Nvidia Tegra + // Started Version: 4 + // Ended Version: 5 + // Tegra 4 hardware limitations don't allow it to support OpenGL ES 3 + // This is fixed in Tegra 5 + BUG_ISTEGRA, + // Bug: Running on a PowerVR5 device + // Affected devices: PowerVR54x + // Started Version: 540 + // Ended Version: 6xxx + // PowerVR 5 hardware limitations don't allow it to support OpenGL ES 3 + // This is fixed in PowerVR6 + BUG_ISPOWERVR, + // Bug: glBufferSubData/glMapBufferRange stalls + OOM + // Affected devices: Adreno a3xx/Mali-t6xx + // Started Version: -1 + // Ended Version: -1 + // Both Adreno and Mali have issues when you call glBufferSubData or glMapBufferRange + // The driver stalls in each instance no matter what you do + // Apparently Mali and Adreno share code in this regard since it was wrote by the same person. + BUG_BROKENBUFFERSTREAM, }; - - // Initializes our internal vendor, device family, and driver version - void Init(Vendor vendor, const u32 devfamily, const double version); - + + // Initializes our internal vendor, device family, and driver version + void Init(Vendor vendor, Driver driver, const double version); + // Once Vendor and driver version is set, this will return if it has the applicable bug passed to it. bool HasBug(Bug bug); } diff --git a/Source/Core/VideoCommon/Src/EmuWindow.cpp b/Source/Core/VideoCommon/Src/EmuWindow.cpp index fc4c049c80..9b8cde5178 100644 --- a/Source/Core/VideoCommon/Src/EmuWindow.cpp +++ b/Source/Core/VideoCommon/Src/EmuWindow.cpp @@ -145,8 +145,8 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) // Called when a screensaver wants to show up while this window is active case WM_SYSCOMMAND: - - switch (wParam) + + switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index a00e531fa4..92b9753623 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -28,7 +28,7 @@ static u8 *videoBuffer; static int size = 0; } // namespace -void Fifo_DoState(PointerWrap &p) +void Fifo_DoState(PointerWrap &p) { p.DoArray(videoBuffer, FIFO_SIZE); p.Do(size); @@ -148,13 +148,13 @@ void RunGpuLoop() Common::AtomicStore(CommandProcessor::VITicks, CommandProcessor::m_cpClockOrigin); - // check if we are able to run this buffer + // check if we are able to run this buffer while (GpuRunningState && !CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable && fifo.CPReadWriteDistance && !AtBreakpoint()) { fifo.isGpuReadingData = true; CommandProcessor::isPossibleWaitingSetDrawDone = fifo.bFF_GPLinkEnable ? true : false; - if (Common::AtomicLoad(CommandProcessor::VITicks) > CommandProcessor::m_cpClockOrigin || !Core::g_CoreStartupParameter.bSyncGPU) + if (!Core::g_CoreStartupParameter.bSyncGPU || Common::AtomicLoad(CommandProcessor::VITicks) > CommandProcessor::m_cpClockOrigin) { u32 readPtr = fifo.CPReadPointer; u8 *uData = Memory::GetPointer(readPtr); @@ -171,7 +171,7 @@ void RunGpuLoop() cyclesExecuted = OpcodeDecoder_Run(g_bSkipCurrentFrame); - if (Common::AtomicLoad(CommandProcessor::VITicks) > cyclesExecuted && Core::g_CoreStartupParameter.bSyncGPU) + if (Core::g_CoreStartupParameter.bSyncGPU && Common::AtomicLoad(CommandProcessor::VITicks) > cyclesExecuted) Common::AtomicAdd(CommandProcessor::VITicks, -(s32)cyclesExecuted); Common::AtomicStore(fifo.CPReadPointer, readPtr); @@ -181,11 +181,11 @@ void RunGpuLoop() } CommandProcessor::SetCpStatus(); - + // This call is pretty important in DualCore mode and must be called in the FIFO Loop. // If we don't, s_swapRequested or s_efbAccessRequested won't be set to false // leading the CPU thread to wait in Video_BeginField or Video_AccessEFB thus slowing things down. - VideoFifo_CheckAsyncRequest(); + VideoFifo_CheckAsyncRequest(); CommandProcessor::isPossibleWaitingSetDrawDone = false; } diff --git a/Source/Core/VideoCommon/Src/GenericDLCache.cpp b/Source/Core/VideoCommon/Src/GenericDLCache.cpp index d6826bbbde..d5ed12c9c8 100644 --- a/Source/Core/VideoCommon/Src/GenericDLCache.cpp +++ b/Source/Core/VideoCommon/Src/GenericDLCache.cpp @@ -32,7 +32,7 @@ void Shutdown() { } -void Clear() +void Clear() { } diff --git a/Source/Core/VideoCommon/Src/GenericTextureDecoder.cpp b/Source/Core/VideoCommon/Src/GenericTextureDecoder.cpp index c5d14bfe9e..fa9c2b1520 100644 --- a/Source/Core/VideoCommon/Src/GenericTextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/GenericTextureDecoder.cpp @@ -50,7 +50,7 @@ extern const unsigned char sfont_raw[][9*10]; int TexDecoder_GetTexelSizeInNibbles(int format) { switch (format & 0x3f) { - case GX_TF_I4: return 1; + case GX_TF_I4: return 1; case GX_TF_I8: return 2; case GX_TF_IA4: return 2; case GX_TF_IA8: return 4; @@ -61,7 +61,7 @@ int TexDecoder_GetTexelSizeInNibbles(int format) case GX_TF_C8: return 2; case GX_TF_C14X2: return 4; case GX_TF_CMPR: return 1; - case GX_CTF_R4: return 1; + case GX_CTF_R4: return 1; case GX_CTF_RA4: return 2; case GX_CTF_RA8: return 4; case GX_CTF_YUVA8: return 8; @@ -76,7 +76,7 @@ int TexDecoder_GetTexelSizeInNibbles(int format) case GX_TF_Z16: return 4; case GX_TF_Z24X8: return 8; - case GX_CTF_Z4: return 1; + case GX_CTF_Z4: return 1; case GX_CTF_Z8M: return 2; case GX_CTF_Z8L: return 2; case GX_CTF_Z16L: return 4; @@ -93,7 +93,7 @@ int TexDecoder_GetBlockWidthInTexels(u32 format) { switch (format) { - case GX_TF_I4: return 8; + case GX_TF_I4: return 8; case GX_TF_I8: return 8; case GX_TF_IA4: return 8; case GX_TF_IA8: return 4; @@ -130,7 +130,7 @@ int TexDecoder_GetBlockHeightInTexels(u32 format) { switch (format) { - case GX_TF_I4: return 8; + case GX_TF_I4: return 8; case GX_TF_I8: return 4; case GX_TF_IA4: return 4; case GX_TF_IA8: return 4; @@ -307,7 +307,7 @@ inline void decodebytesC4RGB565_To_RGBA(u32* dst, const u8* src, int tlutaddr) //inline void decodebytesC8(u32 *dst, const u8 *src, int numbytes, int tlutaddr, int tlutfmt) inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) -{ +{ u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { @@ -317,7 +317,7 @@ inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) } inline void decodebytesC8_5A3_To_RGBA32(u32 *dst, const u8 *src, int tlutaddr) -{ +{ u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { @@ -471,7 +471,7 @@ inline void decodebytesARGB8_4(u32 *dst, const u16 *src, const u16 *src2) // some unpack instruction x2: // ABABABABABABABAB 1212121212121212 -> // AB12AB12AB12AB12 AB12AB12AB12AB12 - // 2x pshufb-> + // 2x pshufb-> // 21BA21BA21BA21BA 21BA21BA21BA21BA // and we are done. } @@ -521,7 +521,7 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) int green3 = ((green2 - green1) >> 1) - ((green2 - green1) >> 3); int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3); colors[2] = makecol(red1 + red3, green1 + green3, blue1 + blue3, 255); - colors[3] = makecol(red2 - red3, green2 - green3, blue2 - blue3, 255); + colors[3] = makecol(red2 - red3, green2 - green3, blue2 - blue3, 255); } else { @@ -532,7 +532,7 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) } for (int y = 0; y < 4; y++) - { + { int val = src->lines[y]; for (int x = 0; x < 4; x++) { @@ -564,7 +564,7 @@ void decodeDXTBlockRGBA(u32 *dst, const DXTBlock *src, int pitch) int green3 = ((green2 - green1) >> 1) - ((green2 - green1) >> 3); int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3); colors[2] = makeRGBA(red1 + red3, green1 + green3, blue1 + blue3, 255); - colors[3] = makeRGBA(red2 - red3, green2 - green3, blue2 - blue3, 255); + colors[3] = makeRGBA(red2 - red3, green2 - green3, blue2 - blue3, 255); } else { @@ -575,7 +575,7 @@ void decodeDXTBlockRGBA(u32 *dst, const DXTBlock *src, int pitch) } for (int y = 0; y < 4; y++) - { + { int val = src->lines[y]; for (int x = 0; x < 4; x++) { @@ -629,7 +629,7 @@ PC_TexFormat GetPC_TexFormat(int texformat, int tlutfmt) return PC_TEX_FMT_IA4_AS_IA8; case GX_TF_IA8: return PC_TEX_FMT_IA8; - case GX_TF_C14X2: + case GX_TF_C14X2: return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_RGB565: return PC_TEX_FMT_RGB565; @@ -739,7 +739,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh } } return PC_TEX_FMT_IA8; - case GX_TF_C14X2: + case GX_TF_C14X2: if (tlutfmt == 2) { // Special decoding is required for TLUT format 5A3 @@ -817,14 +817,14 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh { for (int x = 0, yStep = (y / 8) * Wsteps8; x < width; x += 8, yStep++) { - const u8* src2 = src + 4 * sizeof(DXTBlock) * yStep; + const u8* src2 = src + 4 * sizeof(DXTBlock) * yStep; decodeDXTBlock((u32*)dst + y * width + x, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); decodeDXTBlock((u32*)dst + y * width + x + 4, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); decodeDXTBlock((u32*)dst + (y + 4) * width + x, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); - decodeDXTBlock((u32*)dst + (y + 4) * width + x + 4, (DXTBlock*)src2, width); + decodeDXTBlock((u32*)dst + (y + 4) * width + x + 4, (DXTBlock*)src2, width); } } #endif @@ -937,7 +937,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he for (int y = 0; y < height; y += 4) for (int x = 0, yStep = (y / 4) * Wsteps8; x < width; x += 8, yStep++) for (int iy = 0, xStep = 4 * yStep; iy < 4; iy++, xStep++) - decodebytesC8RGB565_To_RGBA(dst + (y + iy) * width + x, src + 8 * xStep, tlutaddr); + decodebytesC8RGB565_To_RGBA(dst + (y + iy) * width + x, src + 8 * xStep, tlutaddr); } break; @@ -1088,7 +1088,7 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in { int xcnt = 0; int nchar = sfont_map[(int)*fmt]; - + const unsigned char *ptr = sfont_raw[nchar]; // each char is up to 9x10 for (int x = 0; x < 9;x++) @@ -1147,7 +1147,7 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth, int texformat, int tlutaddr, int tlutfmt) { /* General formula for computing texture offset - // + // u16 sBlk = s / blockWidth; u16 tBlk = t / blockHeight; u16 widthBlks = (width / blockWidth) + 1; @@ -1289,7 +1289,7 @@ void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth *((u32*)dst) = decodeIA8Swapped(*valAddr); } break; - case GX_TF_C14X2: + case GX_TF_C14X2: { u16 sBlk = s >> 2; u16 tBlk = t >> 2; @@ -1515,696 +1515,696 @@ const unsigned char sfont_map[] = { const unsigned char sfont_raw[][9*10] = { { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, }, }; diff --git a/Source/Core/VideoCommon/Src/HiresTextures.cpp b/Source/Core/VideoCommon/Src/HiresTextures.cpp index 80bc41f089..c88e4ae5d5 100644 --- a/Source/Core/VideoCommon/Src/HiresTextures.cpp +++ b/Source/Core/VideoCommon/Src/HiresTextures.cpp @@ -27,27 +27,27 @@ void Init(const char *gameCode) char szDir[MAX_PATH]; sprintf(szDir, "%s%s", File::GetUserPath(D_HIRESTEXTURES_IDX).c_str(), gameCode); Directories.push_back(std::string(szDir)); - + for (u32 i = 0; i < Directories.size(); i++) { File::FSTEntry FST_Temp; File::ScanDirectoryTree(Directories[i], FST_Temp); - for (u32 j = 0; j < FST_Temp.children.size(); j++) + for (auto& entry : FST_Temp.children) { - if (FST_Temp.children.at(j).isDirectory) + if (entry.isDirectory) { bool duplicate = false; - for (u32 k = 0; k < Directories.size(); k++) + for (auto& Directory : Directories) { - if (strcmp(Directories[k].c_str(), FST_Temp.children.at(j).physicalName.c_str()) == 0) + if (strcmp(Directory.c_str(), entry.physicalName.c_str()) == 0) { duplicate = true; break; } } if (!duplicate) - Directories.push_back(FST_Temp.children.at(j).physicalName.c_str()); + Directories.push_back(entry.physicalName.c_str()); } } } @@ -66,13 +66,13 @@ void Init(const char *gameCode) if (rFilenames.size() > 0) { - for (u32 i = 0; i < rFilenames.size(); i++) + for (auto& rFilename : rFilenames) { std::string FileName; - SplitPath(rFilenames[i], NULL, &FileName, NULL); + SplitPath(rFilename, NULL, &FileName, NULL); if (FileName.substr(0, strlen(code)).compare(code) == 0 && textureMap.find(FileName) == textureMap.end()) - textureMap.insert(std::map::value_type(FileName, rFilenames[i])); + textureMap.insert(std::map::value_type(FileName, rFilename)); } } } diff --git a/Source/Core/VideoCommon/Src/ImageWrite.cpp b/Source/Core/VideoCommon/Src/ImageWrite.cpp index e8f3f68123..193f058541 100644 --- a/Source/Core/VideoCommon/Src/ImageWrite.cpp +++ b/Source/Core/VideoCommon/Src/ImageWrite.cpp @@ -5,55 +5,10 @@ #include #include +#include "png.h" #include "ImageWrite.h" #include "FileUtil.h" -#pragma pack(push, 1) - -struct TGA_HEADER -{ - u8 identsize; // size of ID field that follows 18 u8 header (0 usually) - u8 colourmaptype; // type of colour map 0=none, 1=has palette - u8 imagetype; // type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed - - s16 colourmapstart; // first colour map entry in palette - s16 colourmaplength; // number of colours in palette - u8 colourmapbits; // number of bits per palette entry 15,16,24,32 - - s16 xstart; // image x origin - s16 ystart; // image y origin - s16 width; // image width in pixels - s16 height; // image height in pixels - u8 bits; // image bits per pixel 8,16,24,32 - u8 descriptor; // image descriptor bits (vh flip bits) - - // pixel data follows header -}; - -#pragma pack(pop) - -bool SaveTGA(const char* filename, int width, int height, void* pdata) -{ - TGA_HEADER hdr; - File::IOFile f(filename, "wb"); - if (!f) - return false; - - _assert_(sizeof(TGA_HEADER) == 18 && sizeof(hdr) == 18); - - memset(&hdr, 0, sizeof(hdr)); - hdr.imagetype = 2; - hdr.bits = 32; - hdr.width = width; - hdr.height = height; - hdr.descriptor |= 8|(1<<5); // 8bit alpha, flip vertical - - f.WriteArray(&hdr, 1); - f.WriteBytes(pdata, width * height * 4); - - return true; -} - bool SaveData(const char* filename, const char* data) { std::ofstream f; @@ -62,3 +17,92 @@ bool SaveData(const char* filename, const char* data) return true; } + + +/* +TextureToPng + +Inputs: +data : This is an array of RGBA with 8 bits per channel. 4 bytes for each pixel. +row_stride: Determines the amount of bytes per row of pixels. +*/ +bool TextureToPng(u8* data, int row_stride, const std::string filename, int width, int height, bool saveAlpha) +{ + bool success = false; + + if (!data) + return false; + + char title[] = "Dolphin Screenshot"; + char title_key[] = "Title"; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + + // Open file for writing (binary mode) + File::IOFile fp(filename, "wb"); + if (!fp.IsOpen()) { + PanicAlert("Screenshot failed: Could not open file %s %d\n", filename.c_str(), errno); + goto finalise; + } + + // Initialize write structure + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png_ptr == NULL) { + PanicAlert("Screenshot failed: Could not allocate write struct\n"); + goto finalise; + + } + + // Initialize info structure + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) { + PanicAlert("Screenshot failed: Could not allocate info struct\n"); + goto finalise; + } + + // Setup Exception handling + if (setjmp(png_jmpbuf(png_ptr))) { + PanicAlert("Screenshot failed: Error during png creation\n"); + goto finalise; + } + + png_init_io(png_ptr, fp.GetHandle()); + + // Write header (8 bit colour depth) + png_set_IHDR(png_ptr, info_ptr, width, height, + 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_text title_text; + title_text.compression = PNG_TEXT_COMPRESSION_NONE; + title_text.key = title_key; + title_text.text = title; + png_set_text(png_ptr, info_ptr, &title_text, 1); + + png_write_info(png_ptr, info_ptr); + + // Write image data + for (auto y = 0; y < height; ++y) + { + u8* row_ptr = (u8*)data + y * row_stride; + u8* ptr = row_ptr; + for (auto x = 0; x < row_stride / 4; ++x) + { + if (!saveAlpha) + ptr[3] = 0xff; + ptr += 4; + } + png_write_row(png_ptr, row_ptr); + } + + // End write + png_write_end(png_ptr, NULL); + + success = true; + +finalise: + if (info_ptr != NULL) png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + if (png_ptr != NULL) png_destroy_write_struct(&png_ptr, (png_infopp)NULL); + + return success; +} diff --git a/Source/Core/VideoCommon/Src/ImageWrite.h b/Source/Core/VideoCommon/Src/ImageWrite.h index 7d1d6fa1e8..04de765d32 100644 --- a/Source/Core/VideoCommon/Src/ImageWrite.h +++ b/Source/Core/VideoCommon/Src/ImageWrite.h @@ -7,8 +7,8 @@ #include "Common.h" -bool SaveTGA(const char* filename, int width, int height, void* pdata); bool SaveData(const char* filename, const char* pdata); +bool TextureToPng(u8* data, int row_stride, const std::string filename, int width, int height, bool saveAlpha = true); #endif // _IMAGEWRITE_H diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.cpp b/Source/Core/VideoCommon/Src/IndexGenerator.cpp index 25597862e0..4b49a4db5e 100644 --- a/Source/Core/VideoCommon/Src/IndexGenerator.cpp +++ b/Source/Core/VideoCommon/Src/IndexGenerator.cpp @@ -74,7 +74,7 @@ template __forceinline void IndexGenerator::WriteTriangle(u32 index1, *Tptr++ = index3; if(pr) *Tptr++ = s_primitive_restart; - + ++numT; } @@ -96,7 +96,7 @@ template void IndexGenerator::AddStrip(u32 const numVerts) } *Tptr++ = s_primitive_restart; numT += numVerts - 2; - + } else { @@ -115,27 +115,27 @@ template void IndexGenerator::AddStrip(u32 const numVerts) /** * FAN simulator: - * + * * 2---3 * / \ / \ * 1---0---4 - * + * * would generate this triangles: * 012, 023, 034 - * + * * rotated (for better striping): * 120, 302, 034 - * + * * as odd ones have to winded, following strip is fine: * 12034 - * + * * so we use 6 indices for 3 triangles */ template void IndexGenerator::AddFan(u32 numVerts) { u32 i = 2; - + if(pr) { for(; i+3<=numVerts; i+=3) @@ -148,7 +148,7 @@ template void IndexGenerator::AddFan(u32 numVerts) *Tptr++ = s_primitive_restart; numT += 3; } - + for(; i+2<=numVerts; i+=2) { *Tptr++ = index + i - 1; @@ -159,7 +159,7 @@ template void IndexGenerator::AddFan(u32 numVerts) numT += 2; } } - + for (; i < numVerts; ++i) { WriteTriangle(index, index + i - 1, index + i); @@ -168,18 +168,18 @@ template void IndexGenerator::AddFan(u32 numVerts) /* * QUAD simulator - * + * * 0---1 4---5 * |\ | |\ | * | \ | | \ | * | \| | \| * 3---2 7---6 - * + * * 012,023, 456,467 ... * or 120,302, 564,746 * or as strip: 1203, 5647 - * - * Warning: + * + * Warning: * A simple triangle has to be rendered for three vertices. * ZWW do this for sun rays */ @@ -220,7 +220,7 @@ void IndexGenerator::AddLineList(u32 numVerts) *Lptr++ = index + i; ++numL; } - + } // shouldn't be used as strips as LineLists are much more common diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.h b/Source/Core/VideoCommon/Src/IndexGenerator.h index 1f25119bc0..1f72e6e74f 100644 --- a/Source/Core/VideoCommon/Src/IndexGenerator.h +++ b/Source/Core/VideoCommon/Src/IndexGenerator.h @@ -29,7 +29,7 @@ public: static u32 GetTriangleindexLen() {return (u32)(Tptr - BASETptr);} static u32 GetLineindexLen() {return (u32)(Lptr - BASELptr);} static u32 GetPointindexLen() {return (u32)(Pptr - BASEPptr);} - + static u32 GetRemainingIndices(); /* enum IndexPrimitiveType diff --git a/Source/Core/VideoCommon/Src/LightingShaderGen.h b/Source/Core/VideoCommon/Src/LightingShaderGen.h index fc107a2e2b..d50716cfcd 100644 --- a/Source/Core/VideoCommon/Src/LightingShaderGen.h +++ b/Source/Core/VideoCommon/Src/LightingShaderGen.h @@ -25,6 +25,19 @@ #define LIGHT_DIR "%s[5*%d+4]" #define LIGHT_DIR_PARAMS(lightsName, index) (lightsName), (index) +/** + * Common uid data used for shader generators that use lighting calculations. + */ +struct LightingUidData +{ + u32 matsource : 4; // 4x1 bit + u32 enablelighting : 4; // 4x1 bit + u32 ambsource : 4; // 4x1 bit + u32 diffusefunc : 8; // 4x2 bits + u32 attnfunc : 8; // 4x2 bits + u32 light_mask : 32; // 4x8 bits +}; + template static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, int litchan_index, const char* lightsName, int coloralpha) @@ -50,7 +63,7 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, case LIGHTDIF_CLAMP: object.Write("ldir = normalize(" LIGHT_POS".xyz - pos.xyz);\n", LIGHT_POS_PARAMS(lightsName, index)); object.Write("lacc.%s += %sdot(ldir, _norm0)) * " LIGHT_COL";\n", - swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); + swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); break; default: _assert_(0); } @@ -63,17 +76,20 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, object.Write("dist2 = dot(ldir, ldir);\n" "dist = sqrt(dist2);\n" "ldir = ldir / dist;\n" - "attn = max(0.0f, dot(ldir, " LIGHT_DIR".xyz));\n", + "attn = max(0.0, dot(ldir, " LIGHT_DIR".xyz));\n", LIGHT_DIR_PARAMS(lightsName, index)); - object.Write("attn = max(0.0f, dot(" LIGHT_COSATT".xyz, float3(1.0f, attn, attn*attn))) / dot(" LIGHT_DISTATT".xyz, float3(1.0f,dist,dist2));\n", - LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); + // attn*attn may overflow + object.Write("attn = max(0.0, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / dot(" LIGHT_DISTATT".xyz, float3(1.0,dist,dist2));\n", + LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); } else if (chan.attnfunc == 1) { // specular object.Write("ldir = normalize(" LIGHT_POS".xyz);\n", LIGHT_POS_PARAMS(lightsName, index)); - object.Write("attn = (dot(_norm0,ldir) >= 0.0f) ? max(0.0f, dot(_norm0, " LIGHT_DIR".xyz)) : 0.0f;\n", LIGHT_DIR_PARAMS(lightsName, index)); - object.Write("attn = max(0.0f, dot(" LIGHT_COSATT".xyz, float3(1,attn,attn*attn))) / dot(" LIGHT_DISTATT".xyz, float3(1,attn,attn*attn));\n", - LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); + object.Write("attn = (dot(_norm0,ldir) >= 0.0) ? max(0.0, dot(_norm0, " LIGHT_DIR".xyz)) : 0.0;\n", LIGHT_DIR_PARAMS(lightsName, index)); + // attn*attn may overflow + object.Write("attn = max(0.0, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / (" LIGHT_DISTATT".x + " LIGHT_DISTATT".y*attn + " LIGHT_DISTATT".z*attn*attn);\n", + LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), + LIGHT_DISTATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); } switch (chan.diffusefunc) @@ -85,7 +101,7 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, case LIGHTDIF_CLAMP: object.Write("lacc.%s += attn * %sdot(ldir, _norm0)) * " LIGHT_COL";\n", swizzle, - chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", + chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); break; default: _assert_(0); @@ -117,7 +133,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com else if (components & VB_HAS_COL0) object.Write("mat = %s0;\n", inColorName); else - object.Write("mat = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("mat = float4(1.0, 1.0, 1.0, 1.0);\n"); } else // from color { @@ -138,7 +154,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com // TODO: this isn't verified. Here we want to read the ambient from the vertex, // but the vertex itself has no color. So we don't know which value to read. // Returing 1.0 is the same as disabled lightning, so this could be fine - object.Write("lacc = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("lacc = float4(1.0, 1.0, 1.0, 1.0);\n"); } else // from color { @@ -147,7 +163,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com } else { - object.Write("lacc = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("lacc = float4(1.0, 1.0, 1.0, 1.0);\n"); } // check if alpha is different @@ -160,7 +176,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com object.Write("mat.w = %s%d.w;\n", inColorName, j); else if (components & VB_HAS_COL0) object.Write("mat.w = %s0.w;\n", inColorName); - else object.Write("mat.w = 1.0f;\n"); + else object.Write("mat.w = 1.0;\n"); } else // from color { @@ -180,7 +196,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com object.Write("lacc.w = %s0.w;\n", inColorName); else // TODO: The same for alpha: We want to read from vertex, but the vertex has no color - object.Write("lacc.w = 1.0f;\n"); + object.Write("lacc.w = 1.0;\n"); } else // from color { @@ -189,7 +205,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com } else { - object.Write("lacc.w = 1.0f;\n"); + object.Write("lacc.w = 1.0;\n"); } if(color.enablelighting && alpha.enablelighting) @@ -240,7 +256,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com GenerateLightShader(object, uid_data, i, lit_index, lightsName, coloralpha); } } - object.Write("%s%d = mat * clamp(lacc, 0.0f, 1.0f);\n", dest, j); + object.Write("%s%d = mat * clamp(lacc, 0.0, 1.0);\n", dest, j); object.Write("}\n"); } } diff --git a/Source/Core/VideoCommon/Src/MainBase.cpp b/Source/Core/VideoCommon/Src/MainBase.cpp index 1739683562..320f2d6752 100644 --- a/Source/Core/VideoCommon/Src/MainBase.cpp +++ b/Source/Core/VideoCommon/Src/MainBase.cpp @@ -28,7 +28,6 @@ static volatile bool s_perf_query_requested; static volatile struct { u32 xfbAddr; - FieldType field; u32 fbWidth; u32 fbHeight; } s_beginFieldArgs; @@ -73,7 +72,7 @@ void VideoFifo_CheckSwapRequest() if (Common::AtomicLoadAcquire(s_swapRequested)) { EFBRectangle rc; - g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.field, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc); + g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc); Common::AtomicStoreRelease(s_swapRequested, false); } } @@ -98,14 +97,13 @@ void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight) } // Run from the CPU thread (from VideoInterface.cpp) -void VideoBackendHardware::Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) +void VideoBackendHardware::Video_BeginField(u32 xfbAddr, u32 fbWidth, u32 fbHeight) { if (s_BackendInitialized && g_ActiveConfig.bUseXFB) { if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread) VideoFifo_CheckSwapRequest(); s_beginFieldArgs.xfbAddr = xfbAddr; - s_beginFieldArgs.field = field; s_beginFieldArgs.fbWidth = fbWidth; s_beginFieldArgs.fbHeight = fbHeight; } @@ -183,12 +181,12 @@ void VideoFifo_CheckPerfQueryRequest() if (s_perf_query_requested) { g_perf_query->FlushResults(); - + { std::lock_guard lk(s_perf_query_lock); s_perf_query_requested = false; } - + s_perf_query_cond.notify_one(); } } @@ -264,7 +262,7 @@ void VideoBackendHardware::CheckInvalidState() if (m_invalid) { m_invalid = false; - + BPReload(); TextureCache::Invalidate(); } diff --git a/Source/Core/VideoCommon/Src/NativeVertexFormat.h b/Source/Core/VideoCommon/Src/NativeVertexFormat.h index f97b493e67..f4f060e7bb 100644 --- a/Source/Core/VideoCommon/Src/NativeVertexFormat.h +++ b/Source/Core/VideoCommon/Src/NativeVertexFormat.h @@ -92,7 +92,7 @@ struct PortableVertexDeclaration // The implementation of this class is specific for GL/DX, so NativeVertexFormat.cpp // is in the respective backend, not here in VideoCommon. -// Note that this class can't just invent arbitrary vertex formats out of its input - +// Note that this class can't just invent arbitrary vertex formats out of its input - // all the data loading code must always be made compatible. class NativeVertexFormat : NonCopyable { diff --git a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp index 29a3837a9a..90e5c008ef 100644 --- a/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp +++ b/Source/Core/VideoCommon/Src/OnScreenDisplay.cpp @@ -11,51 +11,27 @@ #include "RenderBase.h" #include "Timer.h" -#include +#include +#include namespace OSD { -struct MESSAGE +struct Message { - MESSAGE() {} - MESSAGE(const char* p, u32 dw) - { - strncpy(str, p, 255); - str[255] = '\0'; - dwTimeStamp = dw; - } - char str[256]; - u32 dwTimeStamp; + Message() {} + Message(const std::string& s, u32 ts) : str(s), timestamp(ts) {} + + std::string str; + u32 timestamp; }; -class OSDCALLBACK +static std::multimap s_callbacks; +static std::list s_msgList; + +void AddMessage(const std::string& str, u32 ms) { -private: - CallbackPtr m_functionptr; - CallbackType m_type; - u32 m_data; -public: - OSDCALLBACK(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) - { - m_type = OnType; - m_functionptr = FuncPtr; - m_data = UserData; - } - void Call() - { - m_functionptr(m_data); - } - - CallbackType Type() { return m_type; } -}; - -std::vector m_callbacks; -static std::list s_listMsgs; - -void AddMessage(const char* pstr, u32 ms) -{ - s_listMsgs.push_back(MESSAGE(pstr, Common::Timer::GetTimeMs() + ms)); + s_msgList.push_back(Message(str, Common::Timer::GetTimeMs() + ms)); } void DrawMessages() @@ -63,59 +39,55 @@ void DrawMessages() if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages) return; - if (s_listMsgs.size() > 0) + int left = 25, top = 15; + auto it = s_msgList.begin(); + while (it != s_msgList.end()) { - int left = 25, top = 15; - std::list::iterator it = s_listMsgs.begin(); - while (it != s_listMsgs.end()) + int time_left = (int)(it->timestamp - Common::Timer::GetTimeMs()); + u32 alpha = 255; + + if (time_left < 1024) { - int time_left = (int)(it->dwTimeStamp - Common::Timer::GetTimeMs()); - int alpha = 255; - - if (time_left < 1024) - { - alpha = time_left >> 2; - if (time_left < 0) - alpha = 0; - } - - alpha <<= 24; - - g_renderer->RenderText(it->str, left+1, top+1, 0x000000|alpha); - g_renderer->RenderText(it->str, left, top, 0xffff30|alpha); - top += 15; - - if (time_left <= 0) - it = s_listMsgs.erase(it); - else - ++it; + alpha = time_left >> 2; + if (time_left < 0) + alpha = 0; } + + alpha <<= 24; + + g_renderer->RenderText(it->str.c_str(), left + 1, top + 1, 0x000000 | alpha); + g_renderer->RenderText(it->str.c_str(), left, top, 0xffff30 | alpha); + top += 15; + + if (time_left <= 0) + it = s_msgList.erase(it); + else + ++it; } } void ClearMessages() { - std::list::iterator it = s_listMsgs.begin(); - - while (it != s_listMsgs.end()) - { - it = s_listMsgs.erase(it); - } + s_msgList.clear(); } // On-Screen Display Callbacks -void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData) +void AddCallback(CallbackType type, Callback cb) { - m_callbacks.push_back(OSDCALLBACK(OnType, FuncPtr, UserData)); + s_callbacks.insert(std::pair(type, cb)); } -void DoCallbacks(CallbackType OnType) +void DoCallbacks(CallbackType type) { - for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) + auto it_bounds = s_callbacks.equal_range(type); + for (auto it = it_bounds.first; it != it_bounds.second; ++it) { - if (it->Type() == OnType) - it->Call(); + it->second(); } + + // Wipe all callbacks on shutdown + if (type == OSD_SHUTDOWN) + s_callbacks.clear(); } } // namespace diff --git a/Source/Core/VideoCommon/Src/OnScreenDisplay.h b/Source/Core/VideoCommon/Src/OnScreenDisplay.h index ef7d899e1f..a4a377b5d7 100644 --- a/Source/Core/VideoCommon/Src/OnScreenDisplay.h +++ b/Source/Core/VideoCommon/Src/OnScreenDisplay.h @@ -5,11 +5,13 @@ #ifndef _OSD_H_ #define _OSD_H_ -namespace OSD -{ +#include +#include +namespace OSD +{ // On-screen message display -void AddMessage(const char* str, u32 ms = 2000); +void AddMessage(const std::string& str, u32 ms = 2000); void DrawMessages(); // draw the current messages on the screen. Only call once per frame. void ClearMessages(); @@ -20,12 +22,10 @@ enum CallbackType OSD_ONFRAME, OSD_SHUTDOWN }; -typedef void(*CallbackPtr)(u32); +typedef std::function Callback; -void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData); - -void DoCallbacks(CallbackType OnType); -} // namespace +void AddCallback(CallbackType type, Callback cb); +void DoCallbacks(CallbackType type); +} // namespace OSD #endif // _OSD_H_ - diff --git a/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp b/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp index 818a2365fe..72b0584908 100644 --- a/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp +++ b/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp @@ -130,7 +130,7 @@ u32 FifoCommandRunnable(u32 &command_size) if (buffer_size == 0) return 0; // can't peek - u8 cmd_byte = DataPeek8(0); + u8 cmd_byte = DataPeek8(0); switch (cmd_byte) { @@ -340,14 +340,14 @@ static void Decode() u32 address = DataReadU32(); u32 count = DataReadU32(); ExecuteDisplayList(address, count); - } + } break; case GX_CMD_UNKNOWN_METRICS: // zelda 4 swords calls it and checks the metrics registers after that DEBUG_LOG(VIDEO, "GX 0x44: %08x", cmd_byte); break; - case GX_CMD_INVL_VC: // Invalidate Vertex Cache + case GX_CMD_INVL_VC: // Invalidate Vertex Cache DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); break; @@ -359,7 +359,7 @@ static void Decode() } break; - // draw primitives + // draw primitives default: if (cmd_byte & 0x80) { @@ -392,7 +392,7 @@ static void DecodeSemiNop() switch (cmd_byte) { case GX_CMD_UNKNOWN_METRICS: // zelda 4 swords calls it and checks the metrics registers after that - case GX_CMD_INVL_VC: // Invalidate Vertex Cache + case GX_CMD_INVL_VC: // Invalidate Vertex Cache case GX_NOP: break; @@ -432,7 +432,7 @@ static void DecodeSemiNop() break; case GX_CMD_CALL_DL: - // Hm, wonder if any games put tokens in display lists - in that case, + // Hm, wonder if any games put tokens in display lists - in that case, // we'll have to parse them too. DataSkip(8); break; @@ -447,7 +447,7 @@ static void DecodeSemiNop() } break; - // draw primitives + // draw primitives default: if (cmd_byte & 0x80) { diff --git a/Source/Core/VideoCommon/Src/OpenCL.cpp b/Source/Core/VideoCommon/Src/OpenCL.cpp index 6dac8725af..7781b04978 100644 --- a/Source/Core/VideoCommon/Src/OpenCL.cpp +++ b/Source/Core/VideoCommon/Src/OpenCL.cpp @@ -144,7 +144,7 @@ cl_program CompileProgram(const char *Kernel) buildlog = new char[buildlog_size + 1]; err = clGetProgramBuildInfo(program, OpenCL::device_id, CL_PROGRAM_BUILD_LOG, buildlog_size, buildlog, NULL); buildlog[buildlog_size] = 0; - + if(err != CL_SUCCESS) { HandleCLError(err, "Error: can't get build log"); @@ -192,7 +192,7 @@ void Destroy() { clReleaseContext(g_context); g_context = NULL; - } + } g_bInitialized = false; } diff --git a/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp b/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp index a9c6977d42..daea0bfca1 100644 --- a/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp @@ -5,6 +5,7 @@ #include "OCLTextureDecoder.h" #include "../OpenCL.h" +#include "CommonPaths.h" #include "FileUtil.h" #include @@ -138,8 +139,8 @@ void TexDecoder_OpenCL_Initialize() if (err) { std::string code; - filename = File::GetUserPath(D_OPENCL_IDX) + "TextureDecoder.cl"; - if (!File::ReadFileToString(true, filename.c_str(), code)) + filename = File::GetSysDirectory() + OPENCL_DIR DIR_SEP "TextureDecoder.cl"; + if (!File::ReadFileToString(filename.c_str(), code)) { ERROR_LOG(VIDEO, "Failed to load OpenCL code %s - file is missing?", filename.c_str()); return; diff --git a/Source/Core/VideoCommon/Src/PixelEngine.cpp b/Source/Core/VideoCommon/Src/PixelEngine.cpp index 5819f64a83..40a21a2132 100644 --- a/Source/Core/VideoCommon/Src/PixelEngine.cpp +++ b/Source/Core/VideoCommon/Src/PixelEngine.cpp @@ -26,7 +26,7 @@ namespace PixelEngine union UPEZConfReg { u16 Hex; - struct + struct { u16 ZCompEnable : 1; // Z Comparator Enable u16 Function : 3; @@ -38,7 +38,7 @@ union UPEZConfReg union UPEAlphaConfReg { u16 Hex; - struct + struct { u16 BMMath : 1; // GX_BM_BLEND || GX_BM_SUBSTRACT u16 BMLogic : 1; // GX_BM_LOGIC @@ -55,7 +55,7 @@ union UPEAlphaConfReg union UPEDstAlphaConfReg { u16 Hex; - struct + struct { u16 DstAlpha : 8; u16 Enable : 1; @@ -66,7 +66,7 @@ union UPEDstAlphaConfReg union UPEAlphaModeConfReg { u16 Hex; - struct + struct { u16 Threshold : 8; u16 CompareMode : 8; @@ -76,7 +76,7 @@ union UPEAlphaModeConfReg // fifo Control Register union UPECtrlReg { - struct + struct { u16 PETokenEnable : 1; u16 PEFinishEnable : 1; @@ -129,7 +129,7 @@ void DoState(PointerWrap &p) p.Do(g_bSignalFinishInterrupt); p.Do(interruptSetToken); p.Do(interruptSetFinish); - + p.Do(bbox); p.Do(bbox_active); } @@ -187,7 +187,7 @@ void Read16(u16& _uReturnValue, const u32 _iAddress) case PE_ALPHAMODE: _uReturnValue = m_AlphaModeConf.Hex; INFO_LOG(PIXELENGINE, "(r16) ALPHAMODE"); - break; + break; case PE_ALPHAREAD: _uReturnValue = m_AlphaRead.Hex; WARN_LOG(PIXELENGINE, "(r16) ALPHAREAD"); @@ -303,7 +303,7 @@ void Read16(u16& _uReturnValue, const u32 _iAddress) _uReturnValue = 1; break; } - + } void Write16(const u16 _iValue, const u32 _iAddress) @@ -332,7 +332,7 @@ void Write16(const u16 _iValue, const u32 _iAddress) INFO_LOG(PIXELENGINE, "(w16) ALPHAREAD: %02x", _iValue); break; - case PE_CTRL_REGISTER: + case PE_CTRL_REGISTER: { UPECtrlReg tmpCtrl(_iValue); @@ -376,7 +376,7 @@ void UpdateInterrupts() { // check if there is a token-interrupt UpdateTokenInterrupt((g_bSignalTokenInterrupt & m_Control.PETokenEnable)); - + // check if there is a finish-interrupt UpdateFinishInterrupt((g_bSignalFinishInterrupt & m_Control.PEFinishEnable)); } diff --git a/Source/Core/VideoCommon/Src/PixelEngine.h b/Source/Core/VideoCommon/Src/PixelEngine.h index 65323590a1..c420dbe9f1 100644 --- a/Source/Core/VideoCommon/Src/PixelEngine.h +++ b/Source/Core/VideoCommon/Src/PixelEngine.h @@ -25,18 +25,18 @@ enum // NOTE: Order not verified // These indicate the number of quads that are being used as input/output for each particular stage - PE_PERF_ZCOMP_INPUT_ZCOMPLOC_L = 0x18, + PE_PERF_ZCOMP_INPUT_ZCOMPLOC_L = 0x18, PE_PERF_ZCOMP_INPUT_ZCOMPLOC_H = 0x1a, - PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_L = 0x1c, - PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_H = 0x1e, - PE_PERF_ZCOMP_INPUT_L = 0x20, + PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_L = 0x1c, + PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_H = 0x1e, + PE_PERF_ZCOMP_INPUT_L = 0x20, PE_PERF_ZCOMP_INPUT_H = 0x22, - PE_PERF_ZCOMP_OUTPUT_L = 0x24, - PE_PERF_ZCOMP_OUTPUT_H = 0x26, - PE_PERF_BLEND_INPUT_L = 0x28, - PE_PERF_BLEND_INPUT_H = 0x2a, - PE_PERF_EFB_COPY_CLOCKS_L = 0x2c, - PE_PERF_EFB_COPY_CLOCKS_H = 0x2e, + PE_PERF_ZCOMP_OUTPUT_L = 0x24, + PE_PERF_ZCOMP_OUTPUT_H = 0x26, + PE_PERF_BLEND_INPUT_L = 0x28, + PE_PERF_BLEND_INPUT_H = 0x2a, + PE_PERF_EFB_COPY_CLOCKS_L = 0x2c, + PE_PERF_EFB_COPY_CLOCKS_H = 0x2e, }; namespace PixelEngine diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index b4ad513d37..f107da783e 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -29,14 +29,14 @@ static const char *tevKSelTableC[] = // KCSEL { - "1.0f,1.0f,1.0f", // 1 = 0x00 - "0.875f,0.875f,0.875f", // 7_8 = 0x01 - "0.75f,0.75f,0.75f", // 3_4 = 0x02 - "0.625f,0.625f,0.625f", // 5_8 = 0x03 - "0.5f,0.5f,0.5f", // 1_2 = 0x04 - "0.375f,0.375f,0.375f", // 3_8 = 0x05 - "0.25f,0.25f,0.25f", // 1_4 = 0x06 - "0.125f,0.125f,0.125f", // 1_8 = 0x07 + "1.0,1.0,1.0", // 1 = 0x00 + "0.875,0.875,0.875", // 7_8 = 0x01 + "0.75,0.75,0.75", // 3_4 = 0x02 + "0.625,0.625,0.625", // 5_8 = 0x03 + "0.5,0.5,0.5", // 1_2 = 0x04 + "0.375,0.375,0.375", // 3_8 = 0x05 + "0.25,0.25,0.25", // 1_4 = 0x06 + "0.125,0.125,0.125", // 1_8 = 0x07 "ERROR1", // 0x08 "ERROR2", // 0x09 "ERROR3", // 0x0a @@ -65,14 +65,14 @@ static const char *tevKSelTableC[] = // KCSEL static const char *tevKSelTableA[] = // KASEL { - "1.0f", // 1 = 0x00 - "0.875f",// 7_8 = 0x01 - "0.75f", // 3_4 = 0x02 - "0.625f",// 5_8 = 0x03 - "0.5f", // 1_2 = 0x04 - "0.375f",// 3_8 = 0x05 - "0.25f", // 1_4 = 0x06 - "0.125f",// 1_8 = 0x07 + "1.0", // 1 = 0x00 + "0.875",// 7_8 = 0x01 + "0.75", // 3_4 = 0x02 + "0.625",// 5_8 = 0x03 + "0.5", // 1_2 = 0x04 + "0.375",// 3_8 = 0x05 + "0.25", // 1_4 = 0x06 + "0.125",// 1_8 = 0x07 "ERROR5", // 0x08 "ERROR6", // 0x09 "ERROR7", // 0x0a @@ -101,17 +101,17 @@ static const char *tevKSelTableA[] = // KASEL static const char *tevScaleTable[] = // CS { - "1.0f", // SCALE_1 - "2.0f", // SCALE_2 - "4.0f", // SCALE_4 - "0.5f", // DIVIDE_2 + "1.0", // SCALE_1 + "2.0", // SCALE_2 + "4.0", // SCALE_4 + "0.5", // DIVIDE_2 }; static const char *tevBiasTable[] = // TB { "", // ZERO, - "+0.5f", // ADDHALF, - "-0.5f", // SUBHALF, + "+0.5", // ADDHALF, + "-0.5", // SUBHALF, "", }; @@ -134,10 +134,10 @@ static const char *tevCInputTable[] = // CC "(textemp.aaa)", // TEXA, "(rastemp.rgb)", // RASC, "(rastemp.aaa)", // RASA, - "float3(1.0f, 1.0f, 1.0f)", // ONE - "float3(0.5f, 0.5f, 0.5f)", // HALF + "float3(1.0, 1.0, 1.0)", // ONE + "float3(0.5, 0.5, 0.5)", // HALF "(konsttemp.rgb)", //"konsttemp.rgb", // KONST - "float3(0.0f, 0.0f, 0.0f)", // ZERO + "float3(0.0, 0.0, 0.0)", // ZERO ///added extra values to map clamped values "(cprev.rgb)", // CPREV, "(cprev.aaa)", // APREV, @@ -151,10 +151,10 @@ static const char *tevCInputTable[] = // CC "(textemp.aaa)", // TEXA, "(crastemp.rgb)", // RASC, "(crastemp.aaa)", // RASA, - "float3(1.0f, 1.0f, 1.0f)", // ONE - "float3(0.5f, 0.5f, 0.5f)", // HALF + "float3(1.0, 1.0, 1.0)", // ONE + "float3(0.5, 0.5, 0.5)", // HALF "(ckonsttemp.rgb)", //"konsttemp.rgb", // KONST - "float3(0.0f, 0.0f, 0.0f)", // ZERO + "float3(0.0, 0.0, 0.0)", // ZERO "PADERROR1", "PADERROR2", "PADERROR3", "PADERROR4" }; @@ -167,7 +167,7 @@ static const char *tevAInputTable[] = // CA "textemp", // TEXA, "rastemp", // RASA, "konsttemp", // KONST, (hw1 had quarter) - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // ZERO + "float4(0.0, 0.0, 0.0, 0.0)", // ZERO ///added extra values to map clamped values "cprev", // APREV, "cc0", // A0, @@ -176,7 +176,7 @@ static const char *tevAInputTable[] = // CA "textemp", // TEXA, "crastemp", // RASA, "ckonsttemp", // KONST, (hw1 had quarter) - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // ZERO + "float4(0.0, 0.0, 0.0, 0.0)", // ZERO "PADERROR5", "PADERROR6", "PADERROR7", "PADERROR8", "PADERROR9", "PADERROR10", "PADERROR11", "PADERROR12", }; @@ -189,8 +189,8 @@ static const char *tevRasTable[] = "ERROR14", //3 "ERROR15", //4 "float4(alphabump,alphabump,alphabump,alphabump)", // use bump alpha - "(float4(alphabump,alphabump,alphabump,alphabump)*(255.0f/248.0f))", //normalized - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // zero + "(float4(alphabump,alphabump,alphabump,alphabump)*(255.0/248.0))", //normalized + "float4(0.0, 0.0, 0.0, 0.0)", // zero }; //static const char *tevTexFunc[] = { "tex2D", "texRECT" }; @@ -199,11 +199,11 @@ static const char *tevCOutputTable[] = { "prev.rgb", "c0.rgb", "c1.rgb", "c2.rg static const char *tevAOutputTable[] = { "prev.a", "c0.a", "c1.a", "c2.a" }; static const char *tevIndAlphaSel[] = {"", "x", "y", "z"}; //static const char *tevIndAlphaScale[] = {"", "*32", "*16", "*8"}; -static const char *tevIndAlphaScale[] = {"*(248.0f/255.0f)", "*(224.0f/255.0f)", "*(240.0f/255.0f)", "*(248.0f/255.0f)"}; +static const char *tevIndAlphaScale[] = {"*(248.0/255.0)", "*(224.0/255.0)", "*(240.0/255.0)", "*(248.0/255.0)"}; static const char *tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias -static const char *tevIndBiasAdd[] = {"-128.0f", "1.0f", "1.0f", "1.0f" }; // indexed by fmt -static const char *tevIndWrapStart[] = {"0.0f", "256.0f", "128.0f", "64.0f", "32.0f", "16.0f", "0.001f" }; -static const char *tevIndFmtScale[] = {"255.0f", "31.0f", "15.0f", "7.0f" }; +static const char *tevIndBiasAdd[] = {"-128.0", "1.0", "1.0", "1.0" }; // indexed by fmt +static const char *tevIndWrapStart[] = {"0.0", "256.0", "128.0", "64.0", "32.0", "16.0", "0.001" }; +static const char *tevIndFmtScale[] = {"255.0", "31.0", "15.0", "7.0" }; struct RegisterState { @@ -212,24 +212,9 @@ struct RegisterState bool AuxStored; }; -static char swapModeTable[4][5]; - static char text[16384]; -static inline void BuildSwapModeTable() -{ - static const char *swapColors = "rgba"; - for (int i = 0; i < 4; i++) - { - swapModeTable[i][0] = swapColors[bpmem.tevksel[i*2].swap1]; - swapModeTable[i][1] = swapColors[bpmem.tevksel[i*2].swap2]; - swapModeTable[i][2] = swapColors[bpmem.tevksel[i*2+1].swap1]; - swapModeTable[i][3] = swapColors[bpmem.tevksel[i*2+1].swap2]; - swapModeTable[i][4] = '\0'; - } -} - -template static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, API_TYPE ApiType, RegisterState RegisterStates[4]); +template static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, API_TYPE ApiType, RegisterState RegisterStates[4], const char swapModeTable[4][5]); template static inline void SampleTexture(T& out, const char *texcoords, const char *texswap, int texmap, API_TYPE ApiType); template static inline void WriteAlphaTest(T& out, pixel_shader_uid_data& uid_data, API_TYPE ApiType,DSTALPHA_MODE dstAlphaMode, bool per_pixel_depth); template static inline void WriteFog(T& out, pixel_shader_uid_data& uid_data); @@ -286,20 +271,15 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T for (int i = 0; i < 8; ++i) out.Write("uniform sampler2D samp%d;\n", i); } - else + else // D3D { // Declare samplers for (int i = 0; i < 8; ++i) - out.Write("%s samp%d : register(s%d);\n", (ApiType == API_D3D11) ? "sampler" : "uniform sampler2D", i, i); + out.Write("sampler samp%d : register(s%d);\n", i, i); - if (ApiType == API_D3D11) - { - out.Write("\n"); - for (int i = 0; i < 8; ++i) - { - out.Write("Texture2D Tex%d : register(t%d);\n", i, i); - } - } + out.Write("\n"); + for (int i = 0; i < 8; ++i) + out.Write("Texture2D Tex%d : register(t%d);\n", i, i); } out.Write("\n"); @@ -326,7 +306,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T { out.Write("COLOROUT(ocol0)\n"); if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) - out.Write("COLOROUT(ocol1)\n"); + out.Write("out vec4 ocol1;\n"); if (per_pixel_depth) out.Write("#define depth gl_FragDepth\n"); @@ -336,36 +316,14 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T // compute window position if needed because binding semantic WPOS is not widely supported // Let's set up attributes - if (xfregs.numTexGen.numTexGens < 7) + for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) { - for (int i = 0; i < 8; ++i) - { - out.Write("VARYIN float3 uv%d_2;\n", i); - } - out.Write("VARYIN float4 clipPos_2;\n"); - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - out.Write("VARYIN float4 Normal_2;\n"); - } + out.Write("VARYIN float3 uv%d_2;\n", i); } - else + out.Write("VARYIN float4 clipPos_2;\n"); + if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { - // wpos is in w of first 4 texcoords - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - for (int i = 0; i < 8; ++i) - { - out.Write("VARYIN float4 uv%d_2;\n", i); - } - } - else - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - { - out.Write("VARYIN float%d uv%d_2;\n", i < 4 ? 4 : 3 , i); - } - } - out.Write("float4 clipPos;\n"); + out.Write("VARYIN float4 Normal_2;\n"); } if (forced_early_z) @@ -378,13 +336,13 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T { static bool warn_once = true; if (warn_once) - WARN_LOG(VIDEO, "Early z test enabled but not possible to emulate with current configuration. Make sure to use the D3D11 or OpenGL backend and enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU which supports D3D 11.0 / OGL 4.2 is required)."); + WARN_LOG(VIDEO, "Early z test enabled but not possible to emulate with current configuration. Make sure to enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU with D3D 11.0 / OGL 4.2 support is required)."); warn_once = false; } out.Write("void main()\n{\n"); } - else + else // D3D { if (forced_early_z) { @@ -394,67 +352,38 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T { static bool warn_once = true; if (warn_once) - WARN_LOG(VIDEO, "Early z test enabled but not possible to emulate with current configuration. Make sure to use the D3D11 or OpenGL backend and enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU which supports D3D 11.0 / OGL 4.2 is required)."); + WARN_LOG(VIDEO, "Early z test enabled but not possible to emulate with current configuration. Make sure to enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU with D3D 11.0 / OGL 4.2 support is required)."); warn_once = false; } out.Write("void main(\n"); - if(ApiType != API_D3D11) - { - out.Write(" out float4 ocol0 : COLOR0,%s%s\n in float4 rawpos : %s,\n", - dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND ? "\n out float4 ocol1 : COLOR1," : "", - per_pixel_depth ? "\n out float depth : DEPTH," : "", - ApiType & API_D3D9_SM20 ? "POSITION" : "VPOS"); - } - else - { - out.Write(" out float4 ocol0 : SV_Target0,%s%s\n in float4 rawpos : SV_Position,\n", - dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND ? "\n out float4 ocol1 : SV_Target1," : "", - per_pixel_depth ? "\n out float depth : SV_Depth," : ""); - } + out.Write(" out float4 ocol0 : SV_Target0,%s%s\n in float4 rawpos : SV_Position,\n", + dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND ? "\n out float4 ocol1 : SV_Target1," : "", + per_pixel_depth ? "\n out float depth : SV_Depth," : ""); - // "centroid" attribute is only supported by D3D11 - const char* optCentroid = (ApiType == API_D3D11 ? "centroid" : ""); + // Use centroid sampling to make MSAA work properly + const char* optCentroid = "centroid"; out.Write(" in %s float4 colors_0 : COLOR0,\n", optCentroid); out.Write(" in %s float4 colors_1 : COLOR1", optCentroid); // compute window position if needed because binding semantic WPOS is not widely supported - if (numTexgen < 7) - { - for (unsigned int i = 0; i < numTexgen; ++i) - out.Write(",\n in %s float3 uv%d : TEXCOORD%d", optCentroid, i, i); - out.Write(",\n in %s float4 clipPos : TEXCOORD%d", optCentroid, numTexgen); - if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - out.Write(",\n in %s float4 Normal : TEXCOORD%d", optCentroid, numTexgen + 1); - out.Write(" ) {\n"); - } - else - { - // wpos is in w of first 4 texcoords - if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - for (int i = 0; i < 8; ++i) - out.Write(",\n in float4 uv%d : TEXCOORD%d", i, i); - } - else - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - out.Write(",\n in float%d uv%d : TEXCOORD%d", i < 4 ? 4 : 3 , i, i); - } - out.Write(" ) {\n"); - out.Write("\tfloat4 clipPos = float4(0.0f, 0.0f, 0.0f, 0.0f);"); - } + for (unsigned int i = 0; i < numTexgen; ++i) + out.Write(",\n in %s float3 uv%d : TEXCOORD%d", optCentroid, i, i); + out.Write(",\n in %s float4 clipPos : TEXCOORD%d", optCentroid, numTexgen); + if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) + out.Write(",\n in %s float4 Normal : TEXCOORD%d", optCentroid, numTexgen + 1); + out.Write(" ) {\n"); } - out.Write(" float4 c0 = " I_COLORS"[1], c1 = " I_COLORS"[2], c2 = " I_COLORS"[3], prev = float4(0.0f, 0.0f, 0.0f, 0.0f), textemp = float4(0.0f, 0.0f, 0.0f, 0.0f), rastemp = float4(0.0f, 0.0f, 0.0f, 0.0f), konsttemp = float4(0.0f, 0.0f, 0.0f, 0.0f);\n" - " float3 comp16 = float3(1.0f, 255.0f, 0.0f), comp24 = float3(1.0f, 255.0f, 255.0f*255.0f);\n" - " float alphabump=0.0f;\n" - " float3 tevcoord=float3(0.0f, 0.0f, 0.0f);\n" - " float2 wrappedcoord=float2(0.0f,0.0f), tempcoord=float2(0.0f,0.0f);\n" - " float4 cc0=float4(0.0f,0.0f,0.0f,0.0f), cc1=float4(0.0f,0.0f,0.0f,0.0f);\n" - " float4 cc2=float4(0.0f,0.0f,0.0f,0.0f), cprev=float4(0.0f,0.0f,0.0f,0.0f);\n" - " float4 crastemp=float4(0.0f,0.0f,0.0f,0.0f),ckonsttemp=float4(0.0f,0.0f,0.0f,0.0f);\n\n"); + out.Write(" float4 c0 = " I_COLORS"[1], c1 = " I_COLORS"[2], c2 = " I_COLORS"[3], prev = float4(0.0, 0.0, 0.0, 0.0), textemp = float4(0.0, 0.0, 0.0, 0.0), rastemp = float4(0.0, 0.0, 0.0, 0.0), konsttemp = float4(0.0, 0.0, 0.0, 0.0);\n" + " float3 comp16 = float3(1.0, 255.0, 0.0), comp24 = float3(1.0, 255.0, 255.0*255.0);\n" + " float alphabump=0.0;\n" + " float3 tevcoord=float3(0.0, 0.0, 0.0);\n" + " float2 wrappedcoord=float2(0.0,0.0), tempcoord=float2(0.0,0.0);\n" + " float4 cc0=float4(0.0,0.0,0.0,0.0), cc1=float4(0.0,0.0,0.0,0.0);\n" + " float4 cc2=float4(0.0,0.0,0.0,0.0), cprev=float4(0.0,0.0,0.0,0.0);\n" + " float4 crastemp=float4(0.0,0.0,0.0,0.0),ckonsttemp=float4(0.0,0.0,0.0,0.0);\n\n"); if (ApiType == API_OPENGL) { @@ -465,53 +394,24 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("float4 colors_1 = colors_12;\n"); // compute window position if needed because binding semantic WPOS is not widely supported // Let's set up attributes - if (xfregs.numTexGen.numTexGens < 7) + if (numTexgen) { - if(numTexgen) - { - for (int i = 0; i < 8; ++i) + for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) { out.Write("float3 uv%d = uv%d_2;\n", i, i); } - } - out.Write("float4 clipPos = clipPos_2;\n"); - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - out.Write("float4 Normal = Normal_2;\n"); - } } - else + out.Write("float4 clipPos = clipPos_2;\n"); + if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { - // wpos is in w of first 4 texcoords - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - for (int i = 0; i < 8; ++i) - { - out.Write("float4 uv%d = uv%d_2;\n", i, i); - } - } - else - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - { - out.Write("float%d uv%d = uv%d_2;\n", i < 4 ? 4 : 3 , i, i); - } - } + out.Write("float4 Normal = Normal_2;\n"); } } if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { - if (xfregs.numTexGen.numTexGens < 7) - { - out.Write("\tfloat3 _norm0 = normalize(Normal.xyz);\n\n"); - out.Write("\tfloat3 pos = float3(clipPos.x,clipPos.y,Normal.w);\n"); - } - else - { - out.Write("\tfloat3 _norm0 = normalize(float3(uv4.w,uv5.w,uv6.w));\n\n"); - out.Write("\tfloat3 pos = float3(uv0.w,uv1.w,uv7.w);\n"); - } + out.Write("\tfloat3 _norm0 = normalize(Normal.xyz);\n\n"); + out.Write("\tfloat3 pos = float3(clipPos.x,clipPos.y,Normal.w);\n"); out.Write("\tfloat4 mat, lacc;\n" "\tfloat3 ldir, h;\n" @@ -523,15 +423,12 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T GenerateLightingShader(out, uid_data.lighting, components, I_PMATERIALS, I_PLIGHTS, "colors_", "colors_"); } - if (numTexgen < 7) - out.Write("\tclipPos = float4(rawpos.x, rawpos.y, clipPos.z, clipPos.w);\n"); - else - out.Write("\tclipPos = float4(rawpos.x, rawpos.y, uv2.w, uv3.w);\n"); + out.Write("\tclipPos = float4(rawpos.x, rawpos.y, clipPos.z, clipPos.w);\n"); // HACK to handle cases where the tex gen is not enabled if (numTexgen == 0) { - out.Write("\tfloat3 uv0 = float3(0.0f, 0.0f, 0.0f);\n"); + out.Write("\tfloat3 uv0 = float3(0.0, 0.0, 0.0);\n"); } else { @@ -542,7 +439,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T uid_data.texMtxInfo_n_projection |= xfregs.texMtxInfo[i].projection << i; if (xfregs.texMtxInfo[i].projection == XF_TEXPROJ_STQ) { - out.Write("\tif (uv%d.z != 0.0f)", i); + out.Write("\tif (uv%d.z != 0.0)", i); out.Write("\t\tuv%d.xy = uv%d.xy / uv%d.z;\n", i, i, i); } @@ -576,7 +473,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("\ttempcoord = uv%d.xy * " I_INDTEXSCALE"[%d].%s;\n", texcoord, i/2, (i&1)?"zw":"xy"); } else - out.Write("\ttempcoord = float2(0.0f, 0.0f);\n"); + out.Write("\ttempcoord = float2(0.0, 0.0);\n"); out.Write("float3 indtex%d = ", i); SampleTexture(out, "tempcoord", "abg", texmap, ApiType); @@ -595,9 +492,19 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T } // Uid fields for BuildSwapModeTable are set in WriteStage - BuildSwapModeTable(); + char swapModeTable[4][5]; + const char* swapColors = "rgba"; + for (int i = 0; i < 4; i++) + { + swapModeTable[i][0] = swapColors[bpmem.tevksel[i*2].swap1]; + swapModeTable[i][1] = swapColors[bpmem.tevksel[i*2].swap2]; + swapModeTable[i][2] = swapColors[bpmem.tevksel[i*2+1].swap1]; + swapModeTable[i][3] = swapColors[bpmem.tevksel[i*2+1].swap2]; + swapModeTable[i][4] = '\0'; + } + for (unsigned int i = 0; i < numStages; i++) - WriteStage(out, uid_data, i, ApiType, RegisterStates); // build the equation for this stage + WriteStage(out, uid_data, i, ApiType, RegisterStates, swapModeTable); // build the equation for this stage #define MY_STRUCT_OFFSET(str,elem) ((u32)((u64)&(str).elem-(u64)&(str))) bool enable_pl = g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting; @@ -623,21 +530,22 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T } // emulation of unsigned 8 overflow when casting if needed if(RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl) - out.Write("\tprev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("\tprev = frac(prev * (255.0/256.0)) * (256.0/255.0);\n"); AlphaTest::TEST_RESULT Pretest = bpmem.alpha_test.TestResult(); uid_data.Pretest = Pretest; - // NOTE: Fragment may not be discarded if alpha test always fails and early depth test is enabled + // NOTE: Fragment may not be discarded if alpha test always fails and early depth test is enabled // (in this case we need to write a depth value if depth test passes regardless of the alpha testing result) if (Pretest == AlphaTest::UNDETERMINED || (Pretest == AlphaTest::FAIL && bpmem.UseLateDepthTest())) WriteAlphaTest(out, uid_data, ApiType, dstAlphaMode, per_pixel_depth); - - // D3D9 doesn't support readback of depth in pixel shader, so we always have to calculate it again. - // This shouldn't be a performance issue as the written depth is usually still from perspective division - // but this isn't true for z-textures, so there will be depth issues between enabled and disabled z-textures fragments - if ((ApiType == API_OPENGL || ApiType == API_D3D11) && g_ActiveConfig.bFastDepthCalc) + // FastDepth means to trust the depth generated in perspective division. + // It should be correct, but it seems not to be as accurate as required. TODO: Find out why! + // For disabled FastDepth we just calculate the depth value again. + // The performance impact of this additional calculation doesn't matter, but it prevents + // the host GPU driver from performing any early depth test optimizations. + if (g_ActiveConfig.bFastDepthCalc) out.Write("float zCoord = rawpos.z;\n"); else { @@ -670,9 +578,9 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T (bpmem.ztex2.op == ZTEXTURE_ADD) ? "+ zCoord" : ""); // U24 overflow emulation - out.Write("zCoord = zCoord * (16777215.0f/16777216.0f);\n"); + out.Write("zCoord = zCoord * (16777215.0/16777216.0);\n"); out.Write("zCoord = frac(zCoord);\n"); - out.Write("zCoord = zCoord * (16777216.0f/16777215.0f);\n"); + out.Write("zCoord = zCoord * (16777216.0/16777215.0);\n"); } if (per_pixel_depth && bpmem.UseLateDepthTest()) @@ -693,18 +601,10 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) { out.SetConstantsUsed(C_ALPHA, C_ALPHA); - if(ApiType & API_D3D9) - { - // alpha component must be 0 or the shader will not compile (Direct3D 9Ex restriction) - // Colors will be blended against the color from ocol1 in D3D 9... - out.Write("\tocol1 = float4(prev.a, prev.a, prev.a, 0.0f);\n"); - } - else - { - // Colors will be blended against the alpha from ocol1... - out.Write("\tocol1 = prev;\n"); - } - // ...and the alpha from ocol0 will be written to the framebuffer. + + // Colors will be blended against the alpha from ocol1 and + // the alpha from ocol0 will be written to the framebuffer. + out.Write("\tocol1 = prev;\n"); out.Write("\tocol0.a = " I_ALPHA"[0].a;\n"); } @@ -727,47 +627,47 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T //table with the color compare operations static const char *TEVCMPColorOPTable[16] = { - "float3(0.0f, 0.0f, 0.0f)",//0 - "float3(0.0f, 0.0f, 0.0f)",//1 - "float3(0.0f, 0.0f, 0.0f)",//2 - "float3(0.0f, 0.0f, 0.0f)",//3 - "float3(0.0f, 0.0f, 0.0f)",//4 - "float3(0.0f, 0.0f, 0.0f)",//5 - "float3(0.0f, 0.0f, 0.0f)",//6 - "float3(0.0f, 0.0f, 0.0f)",//7 - " %s + ((%s.r >= %s.r + (0.25f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_R8_GT 8 - " %s + ((abs(%s.r - %s.r) < (0.5f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_R8_EQ 9 - " %s + (( dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_GR16_GT 10 - " %s + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_GR16_EQ 11 - " %s + (( dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_BGR24_GT 12 - " %s + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_BGR24_EQ 13 - " %s + (max(sign(%s.rgb - %s.rgb - (0.25f/255.0f)), float3(0.0f, 0.0f, 0.0f)) * %s)",//#define TEVCMP_RGB8_GT 14 - " %s + ((float3(1.0f, 1.0f, 1.0f) - max(sign(abs(%s.rgb - %s.rgb) - (0.5f/255.0f)), float3(0.0f, 0.0f, 0.0f))) * %s)"//#define TEVCMP_RGB8_EQ 15 + "float3(0.0, 0.0, 0.0)",//0 + "float3(0.0, 0.0, 0.0)",//1 + "float3(0.0, 0.0, 0.0)",//2 + "float3(0.0, 0.0, 0.0)",//3 + "float3(0.0, 0.0, 0.0)",//4 + "float3(0.0, 0.0, 0.0)",//5 + "float3(0.0, 0.0, 0.0)",//6 + "float3(0.0, 0.0, 0.0)",//7 + " %s + ((%s.r >= %s.r + (0.25/255.0)) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_R8_GT 8 + " %s + ((abs(%s.r - %s.r) < (0.5/255.0)) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_R8_EQ 9 + " %s + (( dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25/255.0))) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_GR16_GT 10 + " %s + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5/255.0) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_GR16_EQ 11 + " %s + (( dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25/255.0))) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_BGR24_GT 12 + " %s + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5/255.0) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_BGR24_EQ 13 + " %s + (max(sign(%s.rgb - %s.rgb - (0.25/255.0)), float3(0.0, 0.0, 0.0)) * %s)",//#define TEVCMP_RGB8_GT 14 + " %s + ((float3(1.0, 1.0, 1.0) - max(sign(abs(%s.rgb - %s.rgb) - (0.5/255.0)), float3(0.0, 0.0, 0.0))) * %s)"//#define TEVCMP_RGB8_EQ 15 }; //table with the alpha compare operations static const char *TEVCMPAlphaOPTable[16] = { - "0.0f",//0 - "0.0f",//1 - "0.0f",//2 - "0.0f",//3 - "0.0f",//4 - "0.0f",//5 - "0.0f",//6 - "0.0f",//7 - " %s.a + ((%s.r >= (%s.r + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_R8_GT 8 - " %s.a + (abs(%s.r - %s.r) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_R8_EQ 9 - " %s.a + ((dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_GR16_GT 10 - " %s.a + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_GR16_EQ 11 - " %s.a + ((dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_BGR24_GT 12 - " %s.a + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_BGR24_EQ 13 - " %s.a + ((%s.a >= (%s.a + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_A8_GT 14 - " %s.a + (abs(%s.a - %s.a) < (0.5f/255.0f) ? %s.a : 0.0f)"//#define TEVCMP_A8_EQ 15 + "0.0",//0 + "0.0",//1 + "0.0",//2 + "0.0",//3 + "0.0",//4 + "0.0",//5 + "0.0",//6 + "0.0",//7 + " %s.a + ((%s.r >= (%s.r + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_R8_GT 8 + " %s.a + (abs(%s.r - %s.r) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_R8_EQ 9 + " %s.a + ((dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_GR16_GT 10 + " %s.a + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_GR16_EQ 11 + " %s.a + ((dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_BGR24_GT 12 + " %s.a + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_BGR24_EQ 13 + " %s.a + ((%s.a >= (%s.a + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_A8_GT 14 + " %s.a + (abs(%s.a - %s.a) < (0.5/255.0) ? %s.a : 0.0)"//#define TEVCMP_A8_EQ 15 }; template -static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, API_TYPE ApiType, RegisterState RegisterStates[4]) +static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, API_TYPE ApiType, RegisterState RegisterStates[4], const char swapModeTable[4][5]) { int texcoord = bpmem.tevorders[n/2].getTexCoord(n&1); bool bHasTexCoord = (u32)texcoord < bpmem.genMode.numtexgens; @@ -826,12 +726,12 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP } else { - out.Write("float2 indtevtrans%d = float2(0.0f, 0.0f);\n", n); + out.Write("float2 indtevtrans%d = float2(0.0, 0.0);\n", n); } } else { - out.Write("float2 indtevtrans%d = float2(0.0f, 0.0f);\n", n); + out.Write("float2 indtevtrans%d = float2(0.0, 0.0);\n", n); } // --------- @@ -842,7 +742,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if (bpmem.tevind[n].sw == ITW_OFF) out.Write("wrappedcoord.x = uv%d.x;\n", texcoord); else if (bpmem.tevind[n].sw == ITW_0) - out.Write("wrappedcoord.x = 0.0f;\n"); + out.Write("wrappedcoord.x = 0.0;\n"); else out.Write("wrappedcoord.x = fmod( uv%d.x, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].sw]); @@ -850,7 +750,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if (bpmem.tevind[n].tw == ITW_OFF) out.Write("wrappedcoord.y = uv%d.y;\n", texcoord); else if (bpmem.tevind[n].tw == ITW_0) - out.Write("wrappedcoord.y = 0.0f;\n"); + out.Write("wrappedcoord.y = 0.0;\n"); else out.Write("wrappedcoord.y = fmod( uv%d.y, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].tw]); @@ -881,9 +781,9 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP uid_data.stagehash[n].tevksel_swap2b = bpmem.tevksel[i*2+1].swap2; uid_data.stagehash[n].tevorders_colorchan = bpmem.tevorders[n / 2].getColorChan(n & 1); - char *rasswap = swapModeTable[bpmem.combiners[n].alphaC.rswap]; + const char *rasswap = swapModeTable[bpmem.combiners[n].alphaC.rswap]; out.Write("rastemp = %s.%s;\n", tevRasTable[bpmem.tevorders[n / 2].getColorChan(n & 1)], rasswap); - out.Write("crastemp = frac(rastemp * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("crastemp = frac(rastemp * (255.0/256.0)) * (256.0/255.0);\n"); } uid_data.stagehash[n].tevorders_enable = bpmem.tevorders[n / 2].getEnable(n & 1); @@ -895,7 +795,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if(bHasTexCoord) out.Write("tevcoord.xy = uv%d.xy;\n", texcoord); else - out.Write("tevcoord.xy = float2(0.0f, 0.0f);\n"); + out.Write("tevcoord.xy = float2(0.0, 0.0);\n"); } const int i = bpmem.combiners[n].alphaC.tswap; @@ -907,7 +807,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP uid_data.stagehash[n].tevorders_texmap= bpmem.tevorders[n/2].getTexMap(n&1); - char *texswap = swapModeTable[bpmem.combiners[n].alphaC.tswap]; + const char *texswap = swapModeTable[bpmem.combiners[n].alphaC.tswap]; int texmap = bpmem.tevorders[n/2].getTexMap(n&1); uid_data.SetTevindrefTexmap(i, texmap); @@ -916,7 +816,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP } else { - out.Write("textemp = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + out.Write("textemp = float4(1.0, 1.0, 1.0, 1.0);\n"); } @@ -930,7 +830,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.Write("konsttemp = float4(%s, %s);\n", tevKSelTableC[kc], tevKSelTableA[ka]); if(kc > 7 || ka > 7) { - out.Write("ckonsttemp = frac(konsttemp * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("ckonsttemp = frac(konsttemp * (255.0/256.0)) * (256.0/255.0);\n"); } else { @@ -949,7 +849,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP { if(RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl) { - out.Write("cprev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cprev = frac(prev * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[0].AlphaNeedOverflowControl = false; RegisterStates[0].ColorNeedOverflowControl = false; } @@ -968,7 +868,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+1,C_COLORS+1); if(RegisterStates[1].AlphaNeedOverflowControl || RegisterStates[1].ColorNeedOverflowControl) { - out.Write("cc0 = frac(c0 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc0 = frac(c0 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[1].AlphaNeedOverflowControl = false; RegisterStates[1].ColorNeedOverflowControl = false; } @@ -987,7 +887,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+2,C_COLORS+2); if(RegisterStates[2].AlphaNeedOverflowControl || RegisterStates[2].ColorNeedOverflowControl) { - out.Write("cc1 = frac(c1 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc1 = frac(c1 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[2].AlphaNeedOverflowControl = false; RegisterStates[2].ColorNeedOverflowControl = false; } @@ -1006,7 +906,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+3,C_COLORS+3); if(RegisterStates[3].AlphaNeedOverflowControl || RegisterStates[3].ColorNeedOverflowControl) { - out.Write("cc2 = frac(c2 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc2 = frac(c2 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[3].AlphaNeedOverflowControl = false; RegisterStates[3].ColorNeedOverflowControl = false; } @@ -1060,7 +960,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP else if (cc.a == TEVCOLORARG_ZERO) out.Write("%s*%s", tevCInputTable[cc.b + 16], tevCInputTable[cc.c + 16]); else if (cc.b == TEVCOLORARG_ZERO) - out.Write("%s*(float3(1.0f, 1.0f, 1.0f)-%s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.c + 16]); + out.Write("%s*(float3(1.0, 1.0, 1.0)-%s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.c + 16]); else out.Write("lerp(%s, %s, %s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.b + 16], tevCInputTable[cc.c + 16]); @@ -1079,7 +979,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP tevCInputTable[cc.c + 16]); } if (cc.clamp) - out.Write(", 0.0f, 1.0f)"); + out.Write(", 0.0, 1.0)"); out.Write(";\n"); RegisterStates[ac.dest].AlphaNeedOverflowControl = (ac.clamp == 0); @@ -1107,7 +1007,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP else if (ac.a == TEVALPHAARG_ZERO) out.Write("%s.a*%s.a", tevAInputTable[ac.b + 8], tevAInputTable[ac.c + 8]); else if (ac.b == TEVALPHAARG_ZERO) - out.Write("%s.a*(1.0f-%s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.c + 8]); + out.Write("%s.a*(1.0-%s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.c + 8]); else out.Write("lerp(%s.a, %s.a, %s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.b + 8], tevAInputTable[ac.c + 8]); @@ -1128,7 +1028,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP tevAInputTable[ac.c + 8]); } if (ac.clamp) - out.Write(", 0.0f, 1.0f)"); + out.Write(", 0.0, 1.0)"); out.Write(";\n\n"); out.Write("// TEV done\n"); } @@ -1138,21 +1038,21 @@ void SampleTexture(T& out, const char *texcoords, const char *texswap, int texma { out.SetConstantsUsed(C_TEXDIMS+texmap,C_TEXDIMS+texmap); - if (ApiType == API_D3D11) + if (ApiType == API_D3D) out.Write("Tex%d.Sample(samp%d,%s.xy * " I_TEXDIMS"[%d].xy).%s;\n", texmap,texmap, texcoords, texmap, texswap); - else - out.Write("%s(samp%d,%s.xy * " I_TEXDIMS"[%d].xy).%s;\n", ApiType == API_OPENGL ? "texture" : "tex2D", texmap, texcoords, texmap, texswap); + else // OGL + out.Write("texture(samp%d,%s.xy * " I_TEXDIMS"[%d].xy).%s;\n", texmap, texcoords, texmap, texswap); } static const char *tevAlphaFuncsTable[] = { "(false)", // NEVER - "(prev.a <= %s - (0.25f/255.0f))", // LESS - "(abs( prev.a - %s ) < (0.5f/255.0f))", // EQUAL - "(prev.a < %s + (0.25f/255.0f))", // LEQUAL - "(prev.a >= %s + (0.25f/255.0f))", // GREATER - "(abs( prev.a - %s ) >= (0.5f/255.0f))", // NEQUAL - "(prev.a > %s - (0.25f/255.0f))", // GEQUAL + "(prev.a <= %s - (0.25/255.0))", // LESS + "(abs( prev.a - %s ) < (0.5/255.0))", // EQUAL + "(prev.a < %s + (0.25/255.0))", // LEQUAL + "(prev.a >= %s + (0.25/255.0))", // GREATER + "(abs( prev.a - %s ) >= (0.5/255.0))", // NEQUAL + "(prev.a > %s - (0.25/255.0))", // GEQUAL "(true)" // ALWAYS }; @@ -1175,7 +1075,6 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data& uid_data, API_T out.SetConstantsUsed(C_ALPHA, C_ALPHA); - // using discard then return works the same in cg and dx9 but not in dx11 out.Write("\tif(!( "); uid_data.alpha_test_comp0 = bpmem.alpha_test.comp0; @@ -1193,11 +1092,11 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data& uid_data, API_T out.Write(tevAlphaFuncsTable[compindex], alphaRef[1]); out.Write(")) {\n"); - out.Write("\t\tocol0 = float4(0.0f, 0.0f, 0.0f, 0.0f);\n"); + out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) - out.Write("\t\tocol1 = float4(0.0f, 0.0f, 0.0f, 0.0f);\n"); + out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); if(per_pixel_depth) - out.Write("\t\tdepth = 1.f;\n"); + out.Write("\t\tdepth = 1.0;\n"); // HAXX: zcomploc (aka early_ztest) is a way to control whether depth test is done before // or after texturing and alpha test. PC graphics APIs have no way to support this @@ -1209,14 +1108,14 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data& uid_data, API_T // It seems to be less buggy than not to update the depth buffer if alpha test fails, // but both ways wouldn't be accurate. - // OpenGL 4.2 has a flag which allows the driver to still update the depth buffer + // OpenGL 4.2 has a flag which allows the driver to still update the depth buffer // if alpha test fails. The driver doesn't have to, but I assume they all do because // it's the much faster code path for the GPU. uid_data.alpha_test_use_zcomploc_hack = bpmem.UseEarlyDepthTest() && bpmem.zmode.updateenable && !g_ActiveConfig.backend_info.bSupportsEarlyZ; if (!uid_data.alpha_test_use_zcomploc_hack) { out.Write("\t\tdiscard;\n"); - if (ApiType != API_D3D11) + if (ApiType != API_D3D) out.Write("\t\treturn;\n"); } @@ -1229,10 +1128,10 @@ static const char *tevFogFuncsTable[] = "", // ? "", // Linear "", // ? - "\tfog = 1.0f - pow(2.0f, -8.0f * fog);\n", // exp - "\tfog = 1.0f - pow(2.0f, -8.0f * fog * fog);\n", // exp2 - "\tfog = pow(2.0f, -8.0f * (1.0f - fog));\n", // backward exp - "\tfog = 1.0f - fog;\n fog = pow(2.0f, -8.0f * fog * fog);\n" // backward exp2 + "\tfog = 1.0 - pow(2.0, -8.0 * fog);\n", // exp + "\tfog = 1.0 - pow(2.0, -8.0 * fog * fog);\n", // exp2 + "\tfog = pow(2.0, -8.0 * (1.0 - fog));\n", // backward exp + "\tfog = 1.0 - fog;\n fog = pow(2.0, -8.0 * fog * fog);\n" // backward exp2 }; template @@ -1265,12 +1164,12 @@ static inline void WriteFog(T& out, pixel_shader_uid_data& uid_data) if (bpmem.fogRange.Base.Enabled) { out.SetConstantsUsed(C_FOG+2, C_FOG+2); - out.Write("\tfloat x_adjust = (2.0f * (clipPos.x / " I_FOG"[2].y)) - 1.0f - " I_FOG"[2].x;\n"); + out.Write("\tfloat x_adjust = (2.0 * (clipPos.x / " I_FOG"[2].y)) - 1.0 - " I_FOG"[2].x;\n"); out.Write("\tx_adjust = sqrt(x_adjust * x_adjust + " I_FOG"[2].z * " I_FOG"[2].z) / " I_FOG"[2].z;\n"); out.Write("\tze *= x_adjust;\n"); } - out.Write("\tfloat fog = clamp(ze - " I_FOG"[1].z, 0.0f, 1.0f);\n"); + out.Write("\tfloat fog = clamp(ze - " I_FOG"[1].z, 0.0, 1.0);\n"); if (bpmem.fog.c_proj_fsel.fsel > 3) { diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.h b/Source/Core/VideoCommon/Src/PixelShaderGen.h index 7763cbd574..983e304998 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.h +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.h @@ -8,6 +8,7 @@ #include "VideoCommon.h" #include "ShaderGenCommon.h" #include "BPMemory.h" +#include "LightingShaderGen.h" #define I_COLORS "color" #define I_KCOLORS "k" @@ -20,6 +21,7 @@ #define I_PLIGHTS "cPLights" #define I_PMATERIALS "cPmtrl" +// TODO: get rid of them as they aren't used #define C_COLORMATRIX 0 // 0 #define C_COLORS 0 // 0 #define C_KCOLORS (C_COLORS + 4) // 4 @@ -42,19 +44,6 @@ enum DSTALPHA_MODE DSTALPHA_DUAL_SOURCE_BLEND // Use dual-source blending }; -// Annoying sure, can be removed once we get up to GLSL ~1.3 -const s_svar PSVar_Loc[] = { {I_COLORS, C_COLORS, 4 }, - {I_KCOLORS, C_KCOLORS, 4 }, - {I_ALPHA, C_ALPHA, 1 }, - {I_TEXDIMS, C_TEXDIMS, 8 }, - {I_ZBIAS , C_ZBIAS, 2 }, - {I_INDTEXSCALE , C_INDTEXSCALE, 2 }, - {I_INDTEXMTX, C_INDTEXMTX, 6 }, - {I_FOG, C_FOG, 3 }, - {I_PLIGHTS, C_PLIGHTS, 40 }, - {I_PMATERIALS, C_PMATERIALS, 4 }, - }; - #pragma pack(1) struct pixel_shader_uid_data { diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp index aef4baa14c..98722e48ce 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp @@ -11,58 +11,53 @@ #include "VideoConfig.h" #include "RenderBase.h" -static int s_nColorsChanged[2]; // 0 - regular colors, 1 - k colors -static int s_nIndTexMtxChanged; -static bool s_bAlphaChanged; -static bool s_bZBiasChanged; -static bool s_bZTextureTypeChanged; -static bool s_bDepthRangeChanged; -static bool s_bFogColorChanged; -static bool s_bFogParamChanged; static bool s_bFogRangeAdjustChanged; +static bool s_bViewPortChanged; static int nLightsChanged[2]; // min,max -static float lastRGBAfull[2][4][4]; -static u8 s_nTexDimsChanged; -static u8 s_nIndTexScaleChanged; -static u32 lastAlpha; -static u32 lastTexDims[8]; // width | height << 16 | wrap_s << 28 | wrap_t << 30 -static u32 lastZBias; -static int nMaterialsChanged; -inline void SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - g_renderer->SetPSConstant4f(const_number, f1, f2, f3, f4); -} - -inline void SetPSConstant4fv(unsigned int const_number, const float *f) -{ - g_renderer->SetPSConstant4fv(const_number, f); -} - -inline void SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - g_renderer->SetMultiPSConstant4fv(const_number, count, f); -} +PixelShaderConstants PixelShaderManager::constants; +bool PixelShaderManager::dirty; void PixelShaderManager::Init() { - lastAlpha = 0; - memset(lastTexDims, 0, sizeof(lastTexDims)); - lastZBias = 0; - memset(lastRGBAfull, 0, sizeof(lastRGBAfull)); + memset(&constants, 0, sizeof(constants)); Dirty(); } void PixelShaderManager::Dirty() { - s_nColorsChanged[0] = s_nColorsChanged[1] = 15; - s_nTexDimsChanged = 0xFF; - s_nIndTexScaleChanged = 0xFF; - s_nIndTexMtxChanged = 15; - s_bAlphaChanged = s_bZBiasChanged = s_bZTextureTypeChanged = s_bDepthRangeChanged = true; - s_bFogRangeAdjustChanged = s_bFogColorChanged = s_bFogParamChanged = true; + s_bFogRangeAdjustChanged = true; + s_bViewPortChanged = true; nLightsChanged[0] = 0; nLightsChanged[1] = 0x80; - nMaterialsChanged = 15; + + SetColorChanged(0, 0); + SetColorChanged(0, 1); + SetColorChanged(0, 2); + SetColorChanged(0, 3); + SetColorChanged(1, 0); + SetColorChanged(1, 1); + SetColorChanged(1, 2); + SetColorChanged(1, 3); + SetAlpha(); + SetDestAlpha(); + SetZTextureBias(); + SetViewportChanged(); + SetIndTexScaleChanged(false); + SetIndTexScaleChanged(true); + SetIndMatrixChanged(0); + SetIndMatrixChanged(1); + SetIndMatrixChanged(2); + SetZTextureTypeChanged(); + SetTexCoordChanged(0); + SetTexCoordChanged(1); + SetTexCoordChanged(2); + SetTexCoordChanged(3); + SetTexCoordChanged(4); + SetTexCoordChanged(5); + SetTexCoordChanged(6); + SetTexCoordChanged(7); + SetFogColorChanged(); + SetFogParamChanged(); } void PixelShaderManager::Shutdown() @@ -72,169 +67,10 @@ void PixelShaderManager::Shutdown() void PixelShaderManager::SetConstants(u32 components) { - if (g_ActiveConfig.backend_info.APIType == API_OPENGL && !g_ActiveConfig.backend_info.bSupportsGLSLUBO) - Dirty(); - - for (int i = 0; i < 2; ++i) - { - if (s_nColorsChanged[i]) - { - int baseind = i ? C_KCOLORS : C_COLORS; - for (int j = 0; j < 4; ++j) - { - if ((s_nColorsChanged[i] & (1 << j))) - { - SetPSConstant4fv(baseind+j, &lastRGBAfull[i][j][0]); - s_nColorsChanged[i] &= ~(1<>8)&0xff)/255.0f, 0, ((lastAlpha>>16)&0xff)/255.0f); - s_bAlphaChanged = false; - } - - if (s_bZTextureTypeChanged) - { - float ftemp[4]; - switch (bpmem.ztex2.type) - { - case 0: - // 8 bits - ftemp[0] = 0; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 255.0f/16777215.0f; - break; - case 1: - // 16 bits - ftemp[0] = 255.0f/16777215.0f; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 65280.0f/16777215.0f; - break; - case 2: - // 24 bits - ftemp[0] = 16711680.0f/16777215.0f; ftemp[1] = 65280.0f/16777215.0f; ftemp[2] = 255.0f/16777215.0f; ftemp[3] = 0; - break; - } - SetPSConstant4fv(C_ZBIAS, ftemp); - s_bZTextureTypeChanged = false; - } - - if (s_bZBiasChanged || s_bDepthRangeChanged) - { - // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) - // [0] = width/2 - // [1] = height/2 - // [2] = 16777215 * (farz - nearz) - // [3] = xorig + width/2 + 342 - // [4] = yorig + height/2 + 342 - // [5] = 16777215 * farz - - //ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias); - SetPSConstant4f(C_ZBIAS+1, xfregs.viewport.farZ / 16777216.0f, xfregs.viewport.zRange / 16777216.0f, 0, (float)(lastZBias)/16777215.0f); - s_bZBiasChanged = s_bDepthRangeChanged = false; - } - - // indirect incoming texture scales - if (s_nIndTexScaleChanged) - { - // set as two sets of vec4s, each containing S and T of two ind stages. - float f[8]; - - if (s_nIndTexScaleChanged & 0x03) - { - for (u32 i = 0; i < 2; ++i) - { - f[2 * i] = bpmem.texscale[0].getScaleS(i & 1); - f[2 * i + 1] = bpmem.texscale[0].getScaleT(i & 1); - PRIM_LOG("tex indscale%d: %f %f\n", i, f[2 * i], f[2 * i + 1]); - } - SetPSConstant4fv(C_INDTEXSCALE, f); - } - - if (s_nIndTexScaleChanged & 0x0c) - { - for (u32 i = 2; i < 4; ++i) - { - f[2 * i] = bpmem.texscale[1].getScaleS(i & 1); - f[2 * i + 1] = bpmem.texscale[1].getScaleT(i & 1); - PRIM_LOG("tex indscale%d: %f %f\n", i, f[2 * i], f[2 * i + 1]); - } - SetPSConstant4fv(C_INDTEXSCALE+1, &f[4]); - } - s_nIndTexScaleChanged = 0; - } - - if (s_nIndTexMtxChanged) - { - for (int i = 0; i < 3; ++i) - { - if (s_nIndTexMtxChanged & (1 << i)) - { - int scale = ((u32)bpmem.indmtx[i].col0.s0 << 0) | - ((u32)bpmem.indmtx[i].col1.s1 << 2) | - ((u32)bpmem.indmtx[i].col2.s2 << 4); - float fscale = powf(2.0f, (float)(scale - 17)) / 1024.0f; - - // xyz - static matrix - // TODO w - dynamic matrix scale / 256...... somehow / 4 works better - // rev 2972 - now using / 256.... verify that this works - SetPSConstant4f(C_INDTEXMTX + 2 * i, - bpmem.indmtx[i].col0.ma * fscale, - bpmem.indmtx[i].col1.mc * fscale, - bpmem.indmtx[i].col2.me * fscale, - fscale * 4.0f); - SetPSConstant4f(C_INDTEXMTX + 2 * i + 1, - bpmem.indmtx[i].col0.mb * fscale, - bpmem.indmtx[i].col1.md * fscale, - bpmem.indmtx[i].col2.mf * fscale, - fscale * 4.0f); - - PRIM_LOG("indmtx%d: scale=%f, mat=(%f %f %f; %f %f %f)\n", - i, 1024.0f*fscale, - bpmem.indmtx[i].col0.ma * fscale, bpmem.indmtx[i].col1.mc * fscale, bpmem.indmtx[i].col2.me * fscale, - bpmem.indmtx[i].col0.mb * fscale, bpmem.indmtx[i].col1.md * fscale, bpmem.indmtx[i].col2.mf * fscale); - - s_nIndTexMtxChanged &= ~(1 << i); - } - } - } - - if (s_bFogColorChanged) - { - SetPSConstant4f(C_FOG, bpmem.fog.color.r / 255.0f, bpmem.fog.color.g / 255.0f, bpmem.fog.color.b / 255.0f, 0); - s_bFogColorChanged = false; - } - - if (s_bFogParamChanged) - { - if(!g_ActiveConfig.bDisableFog) - { - //downscale magnitude to 0.24 bits - float b = (float)bpmem.fog.b_magnitude / 0xFFFFFF; - - float b_shf = (float)(1 << bpmem.fog.b_shift); - SetPSConstant4f(C_FOG + 1, bpmem.fog.a.GetA(), b, bpmem.fog.c_proj_fsel.GetC(), b_shf); - } - else - SetPSConstant4f(C_FOG + 1, 0.0, 1.0, 0.0, 1.0); - - s_bFogParamChanged = false; - } - if (s_bFogRangeAdjustChanged) { + // set by two components, so keep changed flag here + // TODO: try to split both registers and move this logic to the shader if(!g_ActiveConfig.bDisableFog && bpmem.fogRange.Base.Enabled == 1) { //bpmem.fogRange.Base.Center : center of the viewport in x axis. observation: bpmem.fogRange.Base.Center = realcenter + 342; @@ -247,12 +83,17 @@ void PixelShaderManager::SetConstants(u32 components) // they always seems to be larger than 256 so my theory is : // they are the coefficients from the center to the border of the screen // so to simplify I use the hi coefficient as K in the shader taking 256 as the scale - SetPSConstant4f(C_FOG + 2, ScreenSpaceCenter, (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.viewport.wd)), bpmem.fogRange.K[4].HI / 256.0f,0.0f); + constants.fog[2][0] = ScreenSpaceCenter; + constants.fog[2][1] = (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.viewport.wd)); + constants.fog[2][2] = bpmem.fogRange.K[4].HI / 256.0f; } else { - SetPSConstant4f(C_FOG + 2, 0.0f, 1.0f, 1.0f, 0.0f); // Need to update these values for older hardware that fails to divide by zero in shaders. + constants.fog[2][0] = 0; + constants.fog[2][1] = 1; + constants.fog[2][2] = 1; } + dirty = true; s_bFogRangeAdjustChanged = false; } @@ -269,12 +110,10 @@ void PixelShaderManager::SetConstants(u32 components) for (int i = istart; i < iend; ++i) { u32 color = *(const u32*)(xfmemptr + 3); - float NormalizationCoef = 1 / 255.0f; - SetPSConstant4f(C_PLIGHTS + 5 * i, - ((color >> 24) & 0xFF) * NormalizationCoef, - ((color >> 16) & 0xFF) * NormalizationCoef, - ((color >> 8) & 0xFF) * NormalizationCoef, - ((color) & 0xFF) * NormalizationCoef); + constants.plights[5*i][0] = ((color >> 24) & 0xFF) / 255.0f; + constants.plights[5*i][1] = ((color >> 16) & 0xFF) / 255.0f; + constants.plights[5*i][2] = ((color >> 8) & 0xFF) / 255.0f; + constants.plights[5*i][3] = ((color) & 0xFF) / 255.0f; xfmemptr += 4; for (int j = 0; j < 4; ++j, xfmemptr += 3) @@ -283,174 +122,177 @@ void PixelShaderManager::SetConstants(u32 components) fabs(xfmemptr[0]) < 0.00001f && fabs(xfmemptr[1]) < 0.00001f && fabs(xfmemptr[2]) < 0.00001f) - { // dist attenuation, make sure not equal to 0!!! - SetPSConstant4f(C_PLIGHTS+5*i+j+1, 0.00001f, xfmemptr[1], xfmemptr[2], 0); - } + constants.plights[5*i+j+1][0] = 0.00001f; else - { - SetPSConstant4fv(C_PLIGHTS+5*i+j+1, xfmemptr); - } + constants.plights[5*i+j+1][0] = xfmemptr[0]; + constants.plights[5*i+j+1][1] = xfmemptr[1]; + constants.plights[5*i+j+1][2] = xfmemptr[2]; } } + dirty = true; nLightsChanged[0] = nLightsChanged[1] = -1; } - - if (nMaterialsChanged) - { - float GC_ALIGNED16(material[4]); - float NormalizationCoef = 1 / 255.0f; - - for (int i = 0; i < 2; ++i) - { - if (nMaterialsChanged & (1 << i)) - { - u32 data = *(xfregs.ambColor + i); - - material[0] = ((data >> 24) & 0xFF) * NormalizationCoef; - material[1] = ((data >> 16) & 0xFF) * NormalizationCoef; - material[2] = ((data >> 8) & 0xFF) * NormalizationCoef; - material[3] = ( data & 0xFF) * NormalizationCoef; - - SetPSConstant4fv(C_PMATERIALS + i, material); - } - } - - for (int i = 0; i < 2; ++i) - { - if (nMaterialsChanged & (1 << (i + 2))) - { - u32 data = *(xfregs.matColor + i); - - material[0] = ((data >> 24) & 0xFF) * NormalizationCoef; - material[1] = ((data >> 16) & 0xFF) * NormalizationCoef; - material[2] = ((data >> 8) & 0xFF) * NormalizationCoef; - material[3] = ( data & 0xFF) * NormalizationCoef; - - SetPSConstant4fv(C_PMATERIALS + i + 2, material); - } - } - - nMaterialsChanged = 0; - } } -} -void PixelShaderManager::SetPSTextureDims(int texid) -{ - // texdims.xy are reciprocals of the real texture dimensions - // texdims.zw are the scaled dimensions - float fdims[4]; - - TCoordInfo& tc = bpmem.texcoords[texid]; - fdims[0] = 1.0f / (float)(lastTexDims[texid] & 0xffff); - fdims[1] = 1.0f / (float)((lastTexDims[texid] >> 16) & 0xfff); - fdims[2] = (float)(tc.s.scale_minus_1 + 1); - fdims[3] = (float)(tc.t.scale_minus_1 + 1); - - PRIM_LOG("texdims%d: %f %f %f %f\n", texid, fdims[0], fdims[1], fdims[2], fdims[3]); - SetPSConstant4fv(C_TEXDIMS + texid, fdims); + if(s_bViewPortChanged) + { + constants.zbias[1][0] = xfregs.viewport.farZ / 16777216.0f; + constants.zbias[1][1] = xfregs.viewport.zRange / 16777216.0f; + dirty = true; + } } // This one is high in profiles (0.5%). // TODO: Move conversion out, only store the raw color value // and update it when the shader constant is set, only. // TODO: Conversion should be checked in the context of tev_fixes.. -void PixelShaderManager::SetColorChanged(int type, int num, bool high) +void PixelShaderManager::SetColorChanged(int type, int num) { - float *pf = &lastRGBAfull[type][num][0]; + float4* c = type ? constants.kcolors : constants.colors; + c[num][0] = bpmem.tevregs[num].low.a / 255.0f; + c[num][3] = bpmem.tevregs[num].low.b / 255.0f; + c[num][2] = bpmem.tevregs[num].high.a / 255.0f; + c[num][1] = bpmem.tevregs[num].high.b / 255.0f; + dirty = true; - if (!high) - { - int r = bpmem.tevregs[num].low.a; - int a = bpmem.tevregs[num].low.b; - pf[0] = (float)r * (1.0f / 255.0f); - pf[3] = (float)a * (1.0f / 255.0f); - } - else - { - int b = bpmem.tevregs[num].high.a; - int g = bpmem.tevregs[num].high.b; - pf[1] = (float)g * (1.0f / 255.0f); - pf[2] = (float)b * (1.0f / 255.0f); - } - - s_nColorsChanged[type] |= 1 << num; - PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, pf[0], pf[1], pf[2], pf[3]); + PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, c[num][0], c[num][1], c[num][2], c[num][3]); } -void PixelShaderManager::SetAlpha(const AlphaTest& alpha) +void PixelShaderManager::SetAlpha() { - if ((alpha.hex & 0xffff) != lastAlpha) - { - lastAlpha = (lastAlpha & ~0xffff) | (alpha.hex & 0xffff); - s_bAlphaChanged = true; - } + constants.alpha[0] = bpmem.alpha_test.ref0 / 255.0f; + constants.alpha[1] = bpmem.alpha_test.ref1 / 255.0f; + dirty = true; } -void PixelShaderManager::SetDestAlpha(const ConstantAlpha& alpha) +void PixelShaderManager::SetDestAlpha() { - if (alpha.alpha != (lastAlpha >> 16)) - { - lastAlpha = (lastAlpha & ~0xff0000) | ((alpha.hex & 0xff) << 16); - s_bAlphaChanged = true; - } + constants.alpha[3] = bpmem.dstalpha.alpha / 255.0f; + dirty = true; } void PixelShaderManager::SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt) { - u32 wh = width | (height << 16) | (wraps << 28) | (wrapt << 30); - if (lastTexDims[texmapid] != wh) - { - lastTexDims[texmapid] = wh; - s_nTexDimsChanged |= 1 << texmapid; - } + // TODO: move this check out to callee. There we could just call this function on texture changes + // or better, use textureSize() in glsl + if(constants.texdims[texmapid][0] != 1.0f/width || constants.texdims[texmapid][1] != 1.0f/height) + dirty = true; + + constants.texdims[texmapid][0] = 1.0f/width; + constants.texdims[texmapid][1] = 1.0f/height; } -void PixelShaderManager::SetZTextureBias(u32 bias) +void PixelShaderManager::SetZTextureBias() { - if (lastZBias != bias) - { - s_bZBiasChanged = true; - lastZBias = bias; - } + constants.zbias[1][3] = bpmem.ztex1.bias/16777215.0f; + dirty = true; } void PixelShaderManager::SetViewportChanged() { - s_bDepthRangeChanged = true; + s_bViewPortChanged = true; s_bFogRangeAdjustChanged = true; // TODO: Shouldn't be necessary with an accurate fog range adjust implementation } -void PixelShaderManager::SetIndTexScaleChanged(u8 stagemask) +void PixelShaderManager::SetIndTexScaleChanged(bool high) { - s_nIndTexScaleChanged |= stagemask; + constants.indtexscale[high][0] = bpmem.texscale[high].getScaleS(0); + constants.indtexscale[high][1] = bpmem.texscale[high].getScaleT(0); + constants.indtexscale[high][2] = bpmem.texscale[high].getScaleS(1); + constants.indtexscale[high][3] = bpmem.texscale[high].getScaleT(1); + dirty = true; } void PixelShaderManager::SetIndMatrixChanged(int matrixidx) { - s_nIndTexMtxChanged |= 1 << matrixidx; + int scale = ((u32)bpmem.indmtx[matrixidx].col0.s0 << 0) | + ((u32)bpmem.indmtx[matrixidx].col1.s1 << 2) | + ((u32)bpmem.indmtx[matrixidx].col2.s2 << 4); + float fscale = powf(2.0f, (float)(scale - 17)) / 1024.0f; + + // xyz - static matrix + // TODO w - dynamic matrix scale / 256...... somehow / 4 works better + // rev 2972 - now using / 256.... verify that this works + constants.indtexmtx[2*matrixidx][0] = bpmem.indmtx[matrixidx].col0.ma * fscale; + constants.indtexmtx[2*matrixidx][1] = bpmem.indmtx[matrixidx].col1.mc * fscale; + constants.indtexmtx[2*matrixidx][2] = bpmem.indmtx[matrixidx].col2.me * fscale; + constants.indtexmtx[2*matrixidx][3] = fscale * 4.0f; + constants.indtexmtx[2*matrixidx+1][0] = bpmem.indmtx[matrixidx].col0.mb * fscale; + constants.indtexmtx[2*matrixidx+1][1] = bpmem.indmtx[matrixidx].col1.md * fscale; + constants.indtexmtx[2*matrixidx+1][2] = bpmem.indmtx[matrixidx].col2.mf * fscale; + constants.indtexmtx[2*matrixidx+1][3] = fscale * 4.0f; + dirty = true; + + PRIM_LOG("indmtx%d: scale=%f, mat=(%f %f %f; %f %f %f)\n", + matrixidx, 1024.0f*fscale, + bpmem.indmtx[matrixidx].col0.ma * fscale, bpmem.indmtx[matrixidx].col1.mc * fscale, bpmem.indmtx[matrixidx].col2.me * fscale, + bpmem.indmtx[matrixidx].col0.mb * fscale, bpmem.indmtx[matrixidx].col1.md * fscale, bpmem.indmtx[matrixidx].col2.mf * fscale); + } void PixelShaderManager::SetZTextureTypeChanged() { - s_bZTextureTypeChanged = true; + switch (bpmem.ztex2.type) + { + case TEV_ZTEX_TYPE_U8: + constants.zbias[0][0] = 0; + constants.zbias[0][1] = 0; + constants.zbias[0][2] = 0; + constants.zbias[0][3] = 255.0f/16777215.0f; + break; + case TEV_ZTEX_TYPE_U16: + constants.zbias[0][0] = 255.0f/16777215.0f; + constants.zbias[0][1] = 0; + constants.zbias[0][2] = 0; + constants.zbias[0][3] = 65280.0f/16777215.0f; + break; + case TEV_ZTEX_TYPE_U24: + constants.zbias[0][0] = 16711680.0f/16777215.0f; + constants.zbias[0][1] = 65280.0f/16777215.0f; + constants.zbias[0][2] = 255.0f/16777215.0f; + constants.zbias[0][3] = 0; + break; + default: + break; + } + dirty = true; } void PixelShaderManager::SetTexCoordChanged(u8 texmapid) { - s_nTexDimsChanged |= 1 << texmapid; + TCoordInfo& tc = bpmem.texcoords[texmapid]; + constants.texdims[texmapid][2] = (float)(tc.s.scale_minus_1 + 1); + constants.texdims[texmapid][3] = (float)(tc.t.scale_minus_1 + 1); + dirty = true; } void PixelShaderManager::SetFogColorChanged() { - s_bFogColorChanged = true; + constants.fog[0][0] = bpmem.fog.color.r / 255.0f; + constants.fog[0][1] = bpmem.fog.color.g / 255.0f; + constants.fog[0][2] = bpmem.fog.color.b / 255.0f; + dirty = true; } void PixelShaderManager::SetFogParamChanged() { - s_bFogParamChanged = true; + if(!g_ActiveConfig.bDisableFog) + { + constants.fog[1][0] = bpmem.fog.a.GetA(); + constants.fog[1][1] = (float)bpmem.fog.b_magnitude / 0xFFFFFF; + constants.fog[1][2] = bpmem.fog.c_proj_fsel.GetC(); + constants.fog[1][3] = (float)(1 << bpmem.fog.b_shift); + } + else + { + constants.fog[1][0] = 0; + constants.fog[1][1] = 1; + constants.fog[1][2] = 0; + constants.fog[1][3] = 1; + } + dirty = true; } void PixelShaderManager::SetFogRangeAdjustChanged() @@ -458,12 +300,6 @@ void PixelShaderManager::SetFogRangeAdjustChanged() s_bFogRangeAdjustChanged = true; } -void PixelShaderManager::SetColorMatrix(const float* pmatrix) -{ - SetMultiPSConstant4fv(C_COLORMATRIX,7,pmatrix); - s_nColorsChanged[0] = s_nColorsChanged[1] = 15; -} - void PixelShaderManager::InvalidateXFRange(int start, int end) { if (start < XFMEM_LIGHTS_END && end > XFMEM_LIGHTS) @@ -484,17 +320,22 @@ void PixelShaderManager::InvalidateXFRange(int start, int end) } } -void PixelShaderManager::SetMaterialColorChanged(int index) +void PixelShaderManager::SetMaterialColorChanged(int index, u32 color) { - nMaterialsChanged |= (1 << index); + if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) + { + constants.pmaterials[index][0] = ((color >> 24) & 0xFF) / 255.0f; + constants.pmaterials[index][1] = ((color >> 16) & 0xFF) / 255.0f; + constants.pmaterials[index][2] = ((color >> 8) & 0xFF) / 255.0f; + constants.pmaterials[index][3] = ( color & 0xFF) / 255.0f; + dirty = true; + } } void PixelShaderManager::DoState(PointerWrap &p) { - p.Do(lastRGBAfull); - p.Do(lastAlpha); - p.Do(lastTexDims); - p.Do(lastZBias); + p.Do(constants); + p.Do(dirty); if (p.GetMode() == PointerWrap::MODE_READ) { diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.h b/Source/Core/VideoCommon/Src/PixelShaderManager.h index 7f63fb3f46..d0c3509baa 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.h +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.h @@ -8,13 +8,15 @@ #include "BPMemory.h" #include "XFMemory.h" #include "PixelShaderGen.h" +#include "ConstantManager.h" class PointerWrap; + + // The non-API dependent parts. class PixelShaderManager { - static void SetPSTextureDims(int texid); public: static void Init(); static void Dirty(); @@ -24,23 +26,25 @@ public: static void SetConstants(u32 components); // sets pixel shader constants // constant management, should be called after memory is committed - static void SetColorChanged(int type, int index, bool high); - static void SetAlpha(const AlphaTest& alpha); - static void SetDestAlpha(const ConstantAlpha& alpha); + static void SetColorChanged(int type, int index); + static void SetAlpha(); + static void SetDestAlpha(); static void SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt); - static void SetZTextureBias(u32 bias); + static void SetZTextureBias(); static void SetViewportChanged(); static void SetIndMatrixChanged(int matrixidx); static void SetTevKSelChanged(int id); static void SetZTextureTypeChanged(); - static void SetIndTexScaleChanged(u8 stagemask); + static void SetIndTexScaleChanged(bool high); static void SetTexCoordChanged(u8 texmapid); static void SetFogColorChanged(); static void SetFogParamChanged(); static void SetFogRangeAdjustChanged(); - static void SetColorMatrix(const float* pmatrix); static void InvalidateXFRange(int start, int end); - static void SetMaterialColorChanged(int index); + static void SetMaterialColorChanged(int index, u32 color); + + static PixelShaderConstants constants; + static bool dirty; }; diff --git a/Source/Core/VideoCommon/Src/RenderBase.cpp b/Source/Core/VideoCommon/Src/RenderBase.cpp index e4e330d6f5..e509ccb980 100644 --- a/Source/Core/VideoCommon/Src/RenderBase.cpp +++ b/Source/Core/VideoCommon/Src/RenderBase.cpp @@ -30,7 +30,6 @@ #include "XFMemory.h" #include "FifoPlayer/FifoRecorder.h" #include "AVIDump.h" -#include "VertexShaderManager.h" #include #include @@ -67,7 +66,6 @@ unsigned int Renderer::efb_scale_numeratorX = 1; unsigned int Renderer::efb_scale_numeratorY = 1; unsigned int Renderer::efb_scale_denominatorX = 1; unsigned int Renderer::efb_scale_denominatorY = 1; -unsigned int Renderer::ssaa_multiplier = 1; Renderer::Renderer() @@ -90,7 +88,7 @@ Renderer::~Renderer() // invalidate previous efb format prev_efb_format = (unsigned int)-1; - efb_scale_numeratorX = efb_scale_numeratorY = efb_scale_denominatorX = efb_scale_denominatorY = ssaa_multiplier = 1; + efb_scale_numeratorX = efb_scale_numeratorY = efb_scale_denominatorX = efb_scale_denominatorY = 1; #if defined _WIN32 || defined HAVE_LIBAV if (g_ActiveConfig.bDumpFrames && bLastFrameDumped && bAVIDumping) @@ -120,9 +118,7 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect } else { - // XXX: Without the VI, how would we know what kind of field this is? So - // just use progressive. - g_renderer->Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight,sourceRc,Gamma); + g_renderer->Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma); Common::AtomicStoreRelease(s_swapRequested, false); } } @@ -132,10 +128,10 @@ int Renderer::EFBToScaledX(int x) switch (g_ActiveConfig.iEFBScale) { case SCALE_AUTO: // fractional - return (int)ssaa_multiplier * FramebufferManagerBase::ScaleToVirtualXfbWidth(x, s_backbuffer_width); + return FramebufferManagerBase::ScaleToVirtualXfbWidth(x, s_backbuffer_width); default: - return x * (int)ssaa_multiplier * (int)efb_scale_numeratorX / (int)efb_scale_denominatorX; + return x * (int)efb_scale_numeratorX / (int)efb_scale_denominatorX; }; } @@ -144,10 +140,10 @@ int Renderer::EFBToScaledY(int y) switch (g_ActiveConfig.iEFBScale) { case SCALE_AUTO: // fractional - return (int)ssaa_multiplier * FramebufferManagerBase::ScaleToVirtualXfbHeight(y, s_backbuffer_height); + return FramebufferManagerBase::ScaleToVirtualXfbHeight(y, s_backbuffer_height); default: - return y * (int)ssaa_multiplier * (int)efb_scale_numeratorY / (int)efb_scale_denominatorY; + return y * (int)efb_scale_numeratorY / (int)efb_scale_denominatorY; }; } @@ -166,7 +162,7 @@ void Renderer::CalculateTargetScale(int x, int y, int &scaledX, int &scaledY) } // return true if target size changed -bool Renderer::CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height, int multiplier) +bool Renderer::CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height) { int newEFBWidth, newEFBHeight; @@ -230,15 +226,10 @@ bool Renderer::CalculateTargetSize(unsigned int framebuffer_width, unsigned int break; } - newEFBWidth *= multiplier; - newEFBHeight *= multiplier; - ssaa_multiplier = multiplier; - if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { s_target_width = newEFBWidth; s_target_height = newEFBHeight; - VertexShaderManager::SetViewportChanged(); return true; } return false; @@ -527,8 +518,8 @@ void Renderer::RecordVideoMemory() FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4); } -void UpdateViewport(Matrix44& vpCorrection) +void UpdateViewport() { if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0) - g_renderer->UpdateViewport(vpCorrection); + g_renderer->UpdateViewport(); } diff --git a/Source/Core/VideoCommon/Src/RenderBase.h b/Source/Core/VideoCommon/Src/RenderBase.h index 84849f476e..22d31cde23 100644 --- a/Source/Core/VideoCommon/Src/RenderBase.h +++ b/Source/Core/VideoCommon/Src/RenderBase.h @@ -106,30 +106,19 @@ public: virtual void RestoreAPIState() = 0; // Finish up the current frame, print some stats - virtual void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; + virtual void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0; - virtual void UpdateViewport(Matrix44& vpCorrection) = 0; + virtual void UpdateViewport() = 0; virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0; static unsigned int GetPrevPixelFormat() { return prev_efb_format; } static void StorePixelFormat(unsigned int new_format) { prev_efb_format = new_format; } - // TODO: doesn't belong here - virtual void SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) = 0; - virtual void SetPSConstant4fv(unsigned int const_number, const float *f) = 0; - virtual void SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f) = 0; - - // TODO: doesn't belong here - virtual void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) = 0; - virtual void SetVSConstant4fv(unsigned int const_number, const float *f) = 0; - virtual void SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f) = 0; - virtual void SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f) = 0; - protected: static void CalculateTargetScale(int x, int y, int &scaledX, int &scaledY); - static bool CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height, int multiplier = 1); + static bool CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height); static void CheckFifoRecording(); static void RecordVideoMemory(); @@ -170,11 +159,10 @@ private: static unsigned int efb_scale_numeratorY; static unsigned int efb_scale_denominatorX; static unsigned int efb_scale_denominatorY; - static unsigned int ssaa_multiplier; }; extern Renderer *g_renderer; -void UpdateViewport(Matrix44& vpCorrection); +void UpdateViewport(); #endif // _COMMON_RENDERBASE_H_ diff --git a/Source/Core/VideoCommon/Src/ShaderGenCommon.h b/Source/Core/VideoCommon/Src/ShaderGenCommon.h index a804c08f13..b56e9f29ff 100644 --- a/Source/Core/VideoCommon/Src/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/Src/ShaderGenCommon.h @@ -88,26 +88,18 @@ public: bool operator == (const ShaderUid& obj) const { - return memcmp(this->values, obj.values, sizeof(values)) == 0; + return memcmp(this->values, obj.values, data.NumValues() * sizeof(*values)) == 0; } bool operator != (const ShaderUid& obj) const { - return memcmp(this->values, obj.values, sizeof(values)) != 0; + return memcmp(this->values, obj.values, data.NumValues() * sizeof(*values)) != 0; } // determines the storage order inside STL containers bool operator < (const ShaderUid& obj) const { - // TODO: Store last frame used and order by that? makes much more sense anyway... - for (unsigned int i = 0; i < data.NumValues(); ++i) - { - if (this->values[i] < obj.values[i]) - return true; - else if (this->values[i] > obj.values[i]) - return false; - } - return false; + return memcmp(this->values, obj.values, data.NumValues() * sizeof(*values)) < 0; } template @@ -199,23 +191,6 @@ static inline void DeclareUniform(T& object, API_TYPE api_type, bool using_ubos, object.Write(";\n"); } -#pragma pack(1) -/** - * Common uid data used for shader generators that use lighting calculations. - */ -struct LightingUidData -{ - u32 matsource : 4; // 4x1 bit - u32 enablelighting : 4; // 4x1 bit - u32 ambsource : 4; // 4x1 bit - u32 diffusefunc : 8; // 4x2 bits - u32 attnfunc : 8; // 4x2 bits - u32 light_mask : 32; // 4x8 bits - - u32 NumValues() const { return sizeof(LightingUidData); } -}; -#pragma pack() - /** * Checks if there has been */ @@ -261,7 +236,7 @@ public: u32 value = ((u32*)&new_uid.GetUidData())[i]; if ((i % 4) == 0) { - unsigned int last_value = (i+3 < new_uid.GetUidDataSize()-1) ? i+3 : new_uid.GetUidDataSize(); + auto last_value = (i+3 < new_uid.GetUidDataSize()-1) ? i+3 : new_uid.GetUidDataSize(); file << std::setfill(' ') << std::dec; file << "Values " << std::setw(2) << i << " - " << last_value << ": "; } @@ -278,7 +253,7 @@ public: } } } - + private: std::map m_shaders; std::vector m_uids; diff --git a/Source/Core/VideoCommon/Src/Statistics.h b/Source/Core/VideoCommon/Src/Statistics.h index a7976651a5..3a79061b7a 100644 --- a/Source/Core/VideoCommon/Src/Statistics.h +++ b/Source/Core/VideoCommon/Src/Statistics.h @@ -21,7 +21,7 @@ struct Statistics int numRenderTargetsCreated; int numRenderTargetsAlive; - + int numDListsCalled; int numDListsCreated; int numDListsAlive; @@ -44,11 +44,11 @@ struct Statistics int numBPLoads; int numCPLoads; int numXFLoads; - + int numBPLoadsInDL; int numCPLoadsInDL; int numXFLoadsInDL; - + int numDLs; int numPrims; int numDLPrims; @@ -60,7 +60,7 @@ struct Statistics int numBufferSplits; int numDListsCalled; - + int bytesVertexStreamed; int bytesIndexStreamed; int bytesUniformStreamed; diff --git a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp index 7d5b9354ad..31ba3d5e61 100644 --- a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp @@ -112,7 +112,7 @@ void TextureCache::OnConfigChanged(VideoConfig& config) g_texture_cache->ClearRenderTargets(); } } - + backup_config.s_colorsamples = config.iSafeTextureCache_ColorSamples; backup_config.s_copy_efb_to_texture = config.bCopyEFBToTexture; backup_config.s_copy_efb_scaled = config.bCopyEFBScaled; @@ -131,7 +131,7 @@ void TextureCache::Cleanup() while (iter != tcend) { if ( frameCount > TEXTURE_KILL_THRESHOLD + iter->second->frameCount - + // EFB copies living on the host GPU are unrecoverable and thus shouldn't be deleted && ! iter->second->IsEfbCopy() ) { @@ -283,7 +283,7 @@ PC_TexFormat TextureCache::LoadCustomTexture(u64 tex_hash, int texformat, unsign void TextureCache::DumpTexture(TCacheEntryBase* entry, unsigned int level) { - char szTemp[MAX_PATH]; + std::string filename; std::string szDir = File::GetUserPath(D_DUMPTEXTURES_IDX) + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID; @@ -295,19 +295,19 @@ void TextureCache::DumpTexture(TCacheEntryBase* entry, unsigned int level) // TODO: TLUT format should actually be stored in filename? :/ if (level == 0) { - sprintf(szTemp, "%s/%s_%08x_%i.png", szDir.c_str(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), - (u32) (entry->hash & 0x00000000FFFFFFFFLL), entry->format & 0xFFFF); + filename = StringFromFormat("%s/%s_%08x_%i.png", szDir.c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), + (u32)(entry->hash & 0x00000000FFFFFFFFLL), entry->format & 0xFFFF); } else { - sprintf(szTemp, "%s/%s_%08x_%i_mip%i.png", szDir.c_str(), + filename = StringFromFormat("%s/%s_%08x_%i_mip%i.png", szDir.c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), (u32) (entry->hash & 0x00000000FFFFFFFFLL), entry->format & 0xFFFF, level); } - if (false == File::Exists(szTemp)) - entry->Save(szTemp, level); + if (!File::Exists(filename)) + entry->Save(filename, level); } static u32 CalculateLevelSize(u32 level_0_size, u32 level) @@ -445,9 +445,12 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int const stage, expandedWidth = width; expandedHeight = height; - // If we thought we could reuse the texture before, make sure to delete it now! - delete entry; - entry = NULL; + // If we thought we could reuse the texture before, make sure to pool it now! + if(entry) + { + delete entry; + entry = NULL; + } } using_custom_texture = true; } @@ -481,8 +484,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int const stage, // Sometimes, we can get around recreating a texture if only the number of mip levels changes // e.g. if our texture cache entry got too many mipmap levels we can limit the number of used levels by setting the appropriate render states // Thus, we don't update this member for every Load, but just whenever the texture gets recreated - // TODO: D3D9 doesn't support min_lod. We should add a workaround for that here! - + // TODO: This is the wrong value. We should be storing the number of levels our actual texture has. // But that will currently make the above "existing entry" tests fail as "texLevels" is not calculated until after. // Currently, we might try to reuse a texture which appears to have more levels than actual, maybe.. @@ -500,7 +502,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int const stage, entry->SetGeneralParameters(address, texture_size, full_format, entry->num_mipmaps); entry->SetDimensions(nativeW, nativeH, width, height); entry->hash = tex_hash; - + if (entry->IsEfbCopy() && !g_ActiveConfig.bCopyEFBToTexture) entry->type = TCET_EC_DYNAMIC; else @@ -516,7 +518,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int const stage, if (use_native_mips) { src_data += texture_size; - + const u8* ptr_even = NULL; const u8* ptr_odd = NULL; if (from_tmem) @@ -531,13 +533,13 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int const stage, const u32 mip_height = CalculateLevelSize(height, level); const u32 expanded_mip_width = (mip_width + bsw) & (~bsw); const u32 expanded_mip_height = (mip_height + bsh) & (~bsh); - + const u8*& mip_src_data = from_tmem ? ((level % 2) ? ptr_odd : ptr_even) : src_data; TexDecoder_Decode(temp, mip_src_data, expanded_mip_width, expanded_mip_height, texformat, tlutaddr, tlutfmt, g_ActiveConfig.backend_info.bUseRGBATextures); mip_src_data += TexDecoder_GetTextureSizeInBytes(expanded_mip_width, expanded_mip_height, texformat); - + entry->Load(mip_width, mip_height, expanded_mip_width, level); if (g_ActiveConfig.bDumpTextures) @@ -567,19 +569,19 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat const EFBRectangle& srcRect, bool isIntensity, bool scaleByHalf) { // Emulation methods: - // + // // - EFB to RAM: // Encodes the requested EFB data at its native resolution to the emulated RAM using shaders. // Load() decodes the data from there again (using TextureDecoder) if the EFB copy is being used as a texture again. // Advantage: CPU can read data from the EFB copy and we don't lose any important updates to the texture // Disadvantage: Encoding+decoding steps often are redundant because only some games read or modify EFB copies before using them as textures. - // + // // - EFB to texture: // Copies the requested EFB data to a texture object in VRAM, performing any color conversion using shaders. // Advantage: Works for many games, since in most cases EFB copies aren't read or modified at all before being used as a texture again. // Since we don't do any further encoding or decoding here, this method is much faster. // It also allows enhancing the visual quality by doing scaled EFB copies. - // + // // - Hybrid EFB copies: // 1a) Whenever this function gets called, encode the requested EFB data to RAM (like EFB to RAM) // 1b) Set type to TCET_EC_DYNAMIC for all texture cache entries in the destination address range. @@ -668,10 +670,10 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat break; } } - else if (isIntensity) + else if (isIntensity) { fConstAdd[0] = fConstAdd[1] = fConstAdd[2] = 16.0f/255.0f; - switch (dstFormat) + switch (dstFormat) { case 0: // I4 case 1: // I8 @@ -683,7 +685,7 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat colmat[4] = 0.257f; colmat[5] = 0.504f; colmat[6] = 0.098f; colmat[8] = 0.257f; colmat[9] = 0.504f; colmat[10] = 0.098f; - if (dstFormat < 2 || dstFormat == 8) + if (dstFormat < 2 || dstFormat == 8) { colmat[12] = 0.257f; colmat[13] = 0.504f; colmat[14] = 0.098f; fConstAdd[3] = 16.0f/255.0f; @@ -711,7 +713,7 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat { cbufid = 11; } - + } break; @@ -724,7 +726,7 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat } else { - switch (dstFormat) + switch (dstFormat) { case 0: // R4 colmat[0] = colmat[4] = colmat[8] = colmat[12] = 1; diff --git a/Source/Core/VideoCommon/Src/TextureCacheBase.h b/Source/Core/VideoCommon/Src/TextureCacheBase.h index 1afcb8cd2d..4db768f5e4 100644 --- a/Source/Core/VideoCommon/Src/TextureCacheBase.h +++ b/Source/Core/VideoCommon/Src/TextureCacheBase.h @@ -73,7 +73,7 @@ public: virtual ~TCacheEntryBase(); virtual void Bind(unsigned int stage) = 0; - virtual bool Save(const char filename[], unsigned int level) = 0; + virtual bool Save(const std::string filename, unsigned int level) = 0; virtual void Load(unsigned int width, unsigned int height, unsigned int expanded_width, unsigned int level) = 0; diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp index de5198c9fe..99e9f702c7 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp @@ -12,7 +12,6 @@ #include "TextureConversionShader.h" #include "TextureDecoder.h" -#include "PixelShaderManager.h" #include "PixelShaderGen.h" #include "BPMemory.h" #include "RenderBase.h" @@ -67,7 +66,7 @@ const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num) return result; } -// block dimensions : widthStride, heightStride +// block dimensions : widthStride, heightStride // texture dims : width, height, x offset, y offset void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) { @@ -76,61 +75,45 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) // Two were merged for GLSL WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS)); - float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); - float blkH = (float)TexDecoder_GetBlockHeightInTexels(format); - float samples = (float)GetEncodedSampleCount(format); + int blkW = TexDecoder_GetBlockWidthInTexels(format); + int blkH = TexDecoder_GetBlockHeightInTexels(format); + int samples = GetEncodedSampleCount(format); if (ApiType == API_OPENGL) { WRITE(p, "#define samp0 samp9\n"); WRITE(p, "uniform sampler2DRect samp0;\n"); - } - else if (ApiType & API_D3D9) - { - WRITE(p,"uniform sampler samp0 : register(s0);\n"); - } - else - { - WRITE(p,"sampler samp0 : register(s0);\n"); - WRITE(p, "Texture2D Tex0 : register(t0);\n"); - } - if (ApiType == API_OPENGL) - { - WRITE(p, " COLOROUT(ocol0)\n"); + WRITE(p, " out vec4 ocol0;\n"); WRITE(p, " VARYIN float2 uv0;\n"); WRITE(p, "void main()\n"); } - else + else // D3D { + WRITE(p,"sampler samp0 : register(s0);\n"); + WRITE(p, "Texture2D Tex0 : register(t0);\n"); + WRITE(p,"void main(\n"); - if (ApiType != API_D3D11) - { - WRITE(p," out float4 ocol0 : COLOR0,\n"); - } - else - { - WRITE(p," out float4 ocol0 : SV_Target,\n"); - } + WRITE(p," out float4 ocol0 : SV_Target,\n"); WRITE(p," in float2 uv0 : TEXCOORD0)\n"); } - WRITE(p, "{\n" + WRITE(p, "{\n" " float2 sampleUv;\n" " float2 uv1 = floor(uv0);\n"); - WRITE(p, " uv1.x = uv1.x * %f;\n", samples); + WRITE(p, " uv1.x = uv1.x * %d.0;\n", samples); - WRITE(p, " float xl = floor(uv1.x / %f);\n", blkW); - WRITE(p, " float xib = uv1.x - (xl * %f);\n", blkW); - WRITE(p, " float yl = floor(uv1.y / %f);\n", blkH); - WRITE(p, " float yb = yl * %f;\n", blkH); + WRITE(p, " float xl = floor(uv1.x / %d.0);\n", blkW); + WRITE(p, " float xib = uv1.x - (xl * %d.0);\n", blkW); + WRITE(p, " float yl = floor(uv1.y / %d.0);\n", blkH); + WRITE(p, " float yb = yl * %d.0;\n", blkH); WRITE(p, " float yoff = uv1.y - yb;\n"); WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n"); - WRITE(p, " float xel = floor(xp / %f);\n", blkW); - WRITE(p, " float xb = floor(xel / %f);\n", blkH); - WRITE(p, " float xoff = xel - (xb * %f);\n", blkH); + WRITE(p, " float xel = floor(xp / %d.0);\n", blkW); + WRITE(p, " float xb = floor(xel / %d.0);\n", blkH); + WRITE(p, " float xoff = xel - (xb * %d.0);\n", blkH); - WRITE(p, " sampleUv.x = xib + (xb * %f);\n", blkW); + WRITE(p, " sampleUv.x = xib + (xb * %d.0);\n", blkW); WRITE(p, " sampleUv.y = yb + xoff;\n"); WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n"); @@ -142,78 +125,62 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) if (ApiType != API_OPENGL) { - WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this + WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n"); // still need to determine the reason for this WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n"); } } -// block dimensions : widthStride, heightStride +// block dimensions : widthStride, heightStride // texture dims : width, height, x offset, y offset void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) -{ +{ // [0] left, top, right, bottom of source rectangle within source texture // [1] width and height of destination texture in pixels // Two were merged for GLSL WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS)); - float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); - float blkH = (float)TexDecoder_GetBlockHeightInTexels(format); + int blkW = TexDecoder_GetBlockWidthInTexels(format); + int blkH = TexDecoder_GetBlockHeightInTexels(format); // 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments if (ApiType == API_OPENGL) { WRITE(p, "#define samp0 samp9\n"); WRITE(p, "uniform sampler2DRect samp0;\n"); - } - else if (ApiType & API_D3D9) - { - WRITE(p,"uniform sampler samp0 : register(s0);\n"); - } - else - { - WRITE(p,"sampler samp0 : register(s0);\n"); - WRITE(p, "Texture2D Tex0 : register(t0);\n"); - } - if (ApiType == API_OPENGL) - { WRITE(p, " out float4 ocol0;\n"); WRITE(p, " VARYIN float2 uv0;\n"); WRITE(p, "void main()\n"); } else { + WRITE(p,"sampler samp0 : register(s0);\n"); + WRITE(p, "Texture2D Tex0 : register(t0);\n"); + WRITE(p,"void main(\n"); - if(ApiType != API_D3D11) - { - WRITE(p," out float4 ocol0 : COLOR0,\n"); - } - else - { - WRITE(p," out float4 ocol0 : SV_Target,\n"); - } + WRITE(p," out float4 ocol0 : SV_Target,\n"); WRITE(p," in float2 uv0 : TEXCOORD0)\n"); } - WRITE(p, "{\n" + WRITE(p, "{\n" " float2 sampleUv;\n" " float2 uv1 = floor(uv0);\n"); - WRITE(p, " float yl = floor(uv1.y / %f);\n", blkH); - WRITE(p, " float yb = yl * %f;\n", blkH); + WRITE(p, " float yl = floor(uv1.y / %d.0);\n", blkH); + WRITE(p, " float yb = yl * %d.0;\n", blkH); WRITE(p, " float yoff = uv1.y - yb;\n"); WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n"); - WRITE(p, " float xel = floor(xp / 2.0f);\n"); - WRITE(p, " float xb = floor(xel / %f);\n", blkH); - WRITE(p, " float xoff = xel - (xb * %f);\n", blkH); + WRITE(p, " float xel = floor(xp / 2.0);\n"); + WRITE(p, " float xb = floor(xel / %d.0);\n", blkH); + WRITE(p, " float xoff = xel - (xb * %d.0);\n", blkH); - WRITE(p, " float x2 = uv1.x * 2.0f;\n"); - WRITE(p, " float xl = floor(x2 / %f);\n", blkW); - WRITE(p, " float xib = x2 - (xl * %f);\n", blkW); - WRITE(p, " float halfxb = floor(xb / 2.0f);\n"); + WRITE(p, " float x2 = uv1.x * 2.0;\n"); + WRITE(p, " float xl = floor(x2 / %d.0);\n", blkW); + WRITE(p, " float xib = x2 - (xl * %d.0);\n", blkW); + WRITE(p, " float halfxb = floor(xb / 2.0);\n"); - WRITE(p, " sampleUv.x = xib + (halfxb * %f);\n", blkW); + WRITE(p, " sampleUv.x = xib + (halfxb * %d.0);\n", blkW); WRITE(p, " sampleUv.y = yb + xoff;\n"); WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n"); @@ -224,7 +191,7 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) if (ApiType != API_OPENGL) { - WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this + WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n");// still to determine the reason for this WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n"); } } @@ -232,21 +199,19 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYPE ApiType) { const char* texSampleOpName; - if (ApiType & API_D3D9) - texSampleOpName = "tex2D"; - else if (ApiType == API_D3D11) + if (ApiType == API_D3D) texSampleOpName = "tex0.Sample"; - else + else // OGL texSampleOpName = "texture2DRect"; // the increment of sampleUv.x is delayed, so we perform it here. see WriteIncrementSampleX. const char* texSampleIncrementUnit; - if (ApiType != API_OPENGL) + if (ApiType == API_D3D) texSampleIncrementUnit = I_COLORS"[0].x / " I_COLORS"[0].z"; - else + else // OGL texSampleIncrementUnit = I_COLORS"[0].x"; - WRITE(p, " %s = %s(samp0, sampleUv + float2(%d.0f * (%s), 0.0f)).%s;\n", + WRITE(p, " %s = %s(samp0, sampleUv + float2(%d.0 * (%s), 0.0)).%s;\n", dest, texSampleOpName, s_incrementSampleXCount, texSampleIncrementUnit, colorComp); } @@ -282,8 +247,7 @@ void WriteIncrementSampleX(char*& p,API_TYPE ApiType) void WriteToBitDepth(char*& p, u8 depth, const char* src, const char* dest) { - float result = 255 / pow(2.0f, (8 - depth)); - WRITE(p, " %s = floor(%s * %ff);\n", dest, src, result); + WRITE(p, " %s = floor(%s * 255.0 / exp2(8.0 - %d.0));\n", dest, src, depth); } void WriteEncoderEnd(char* p, API_TYPE ApiType) @@ -296,7 +260,7 @@ void WriteEncoderEnd(char* p, API_TYPE ApiType) void WriteI8Encoder(char* p, API_TYPE ApiType) { WriteSwizzler(p, GX_TF_I8, ApiType); - WRITE(p, " float3 texSample;\n"); + WRITE(p, " float3 texSample;\n"); WriteSampleColor(p, "rgb", "texSample", ApiType); WriteColorToIntensity(p, "texSample", "ocol0.b"); @@ -362,19 +326,19 @@ void WriteI4Encoder(char* p, API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } void WriteIA8Encoder(char* p,API_TYPE ApiType) { WriteSwizzler(p, GX_TF_IA8, ApiType); - WRITE(p, " float4 texSample;\n"); + WRITE(p, " float4 texSample;\n"); WriteSampleColor(p, "rgba", "texSample", ApiType); WRITE(p, " ocol0.b = texSample.a;\n"); WriteColorToIntensity(p, "texSample", "ocol0.g"); - WriteIncrementSampleX(p, ApiType); + WriteIncrementSampleX(p, ApiType); WriteSampleColor(p, "rgba", "texSample", ApiType); WRITE(p, " ocol0.r = texSample.a;\n"); @@ -416,7 +380,7 @@ void WriteIA4Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -430,17 +394,17 @@ void WriteRGB565Encoder(char* p,API_TYPE ApiType) WRITE(p, " float2 texRs = float2(texSample0.r, texSample1.r);\n"); WRITE(p, " float2 texGs = float2(texSample0.g, texSample1.g);\n"); WRITE(p, " float2 texBs = float2(texSample0.b, texSample1.b);\n"); - + WriteToBitDepth(p, 6, "texGs", "float2 gInt"); - WRITE(p, " float2 gUpper = floor(gInt / 8.0f);\n"); - WRITE(p, " float2 gLower = gInt - gUpper * 8.0f;\n"); + WRITE(p, " float2 gUpper = floor(gInt / 8.0);\n"); + WRITE(p, " float2 gLower = gInt - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texRs", "ocol0.br"); - WRITE(p, " ocol0.br = ocol0.br * 8.0f + gUpper;\n"); + WRITE(p, " ocol0.br = ocol0.br * 8.0 + gUpper;\n"); WriteToBitDepth(p, 5, "texBs", "ocol0.ga"); - WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0f;\n"); + WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0;\n"); - WRITE(p, " ocol0 = ocol0 / 255.0f;\n"); + WRITE(p, " ocol0 = ocol0 / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -459,13 +423,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WRITE(p, "if(texSample.a > 0.878f) {\n"); WriteToBitDepth(p, 5, "texSample.g", "color0"); - WRITE(p, " gUpper = floor(color0 / 8.0f);\n"); - WRITE(p, " gLower = color0 - gUpper * 8.0f;\n"); + WRITE(p, " gUpper = floor(color0 / 8.0);\n"); + WRITE(p, " gLower = color0 - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texSample.r", "ocol0.b"); - WRITE(p, " ocol0.b = ocol0.b * 4.0f + gUpper + 128.0f;\n"); + WRITE(p, " ocol0.b = ocol0.b * 4.0 + gUpper + 128.0;\n"); WriteToBitDepth(p, 5, "texSample.b", "ocol0.g"); - WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0f;\n"); + WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0;\n"); WRITE(p, "} else {\n"); @@ -473,9 +437,9 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.b", "ocol0.g"); WriteToBitDepth(p, 3, "texSample.a", "color0"); - WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0f;\n"); + WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0;\n"); WriteToBitDepth(p, 4, "texSample.g", "color0"); - WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0f;\n"); + WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0;\n"); WRITE(p, "}\n"); @@ -487,13 +451,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WRITE(p, "if(texSample.a > 0.878f) {\n"); WriteToBitDepth(p, 5, "texSample.g", "color0"); - WRITE(p, " gUpper = floor(color0 / 8.0f);\n"); - WRITE(p, " gLower = color0 - gUpper * 8.0f;\n"); + WRITE(p, " gUpper = floor(color0 / 8.0);\n"); + WRITE(p, " gLower = color0 - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texSample.r", "ocol0.r"); - WRITE(p, " ocol0.r = ocol0.r * 4.0f + gUpper + 128.0f;\n"); + WRITE(p, " ocol0.r = ocol0.r * 4.0 + gUpper + 128.0;\n"); WriteToBitDepth(p, 5, "texSample.b", "ocol0.a"); - WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0f;\n"); + WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0;\n"); WRITE(p, "} else {\n"); @@ -501,13 +465,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.b", "ocol0.a"); WriteToBitDepth(p, 3, "texSample.a", "color0"); - WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0f;\n"); + WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0;\n"); WriteToBitDepth(p, 4, "texSample.g", "color0"); - WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0f;\n"); + WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0;\n"); WRITE(p, "}\n"); - WRITE(p, " ocol0 = ocol0 / 255.0f;\n"); + WRITE(p, " ocol0 = ocol0 / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -533,7 +497,7 @@ void WriteRGBA4443Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.g", "color0.a"); WriteToBitDepth(p, 4, "texSample.b", "color1.a"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -541,8 +505,8 @@ void WriteRGBA8Encoder(char* p,API_TYPE ApiType) { Write32BitSwizzler(p, GX_TF_RGBA8, ApiType); - WRITE(p, " float cl1 = xb - (halfxb * 2.0f);\n"); - WRITE(p, " float cl0 = 1.0f - cl1;\n"); + WRITE(p, " float cl1 = xb - (halfxb * 2.0);\n"); + WRITE(p, " float cl0 = 1.0 - cl1;\n"); WRITE(p, " float4 texSample;\n"); WRITE(p, " float4 color0;\n"); @@ -599,7 +563,7 @@ void WriteC4Encoder(char* p, const char* comp,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -650,7 +614,7 @@ void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -701,25 +665,25 @@ void WriteZ16Encoder(char* p,API_TYPE ApiType) WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); - WRITE(p, " ocol0.b = expanded.g / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded.r / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded.g / 255.0;\n"); + WRITE(p, " ocol0.g = expanded.r / 255.0;\n"); WriteIncrementSampleX(p, ApiType); WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); - WRITE(p, " ocol0.r = expanded.g / 255.0f;\n"); - WRITE(p, " ocol0.a = expanded.r / 255.0f;\n"); + WRITE(p, " ocol0.r = expanded.g / 255.0;\n"); + WRITE(p, " ocol0.a = expanded.r / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -735,25 +699,25 @@ void WriteZ16LEncoder(char* p,API_TYPE ApiType) WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); - WRITE(p, " depth -= expanded.g * 256.0f;\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); + WRITE(p, " depth -= expanded.g * 256.0;\n"); WRITE(p, " expanded.b = depth;\n"); - WRITE(p, " ocol0.b = expanded.b / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded.g / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded.b / 255.0;\n"); + WRITE(p, " ocol0.g = expanded.g / 255.0;\n"); WriteIncrementSampleX(p, ApiType); WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); - WRITE(p, " depth -= expanded.g * 256.0f;\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); + WRITE(p, " depth -= expanded.g * 256.0;\n"); WRITE(p, " expanded.b = depth;\n"); WRITE(p, " ocol0.r = expanded.b;\n"); @@ -766,7 +730,7 @@ void WriteZ24Encoder(char* p, API_TYPE ApiType) { Write32BitSwizzler(p, GX_TF_Z24X8, ApiType); - WRITE(p, " float cl = xb - (halfxb * 2.0f);\n"); + WRITE(p, " float cl = xb - (halfxb * 2.0);\n"); WRITE(p, " float depth0;\n"); WRITE(p, " float depth1;\n"); @@ -779,27 +743,27 @@ void WriteZ24Encoder(char* p, API_TYPE ApiType) for (int i = 0; i < 2; i++) { - WRITE(p, " depth%i *= 16777215.0f;\n", i); + WRITE(p, " depth%i *= 16777215.0;\n", i); - WRITE(p, " expanded%i.r = floor(depth%i / (256.0f * 256.0f));\n", i, i); - WRITE(p, " depth%i -= expanded%i.r * 256.0f * 256.0f;\n", i, i); - WRITE(p, " expanded%i.g = floor(depth%i / 256.0f);\n", i, i); - WRITE(p, " depth%i -= expanded%i.g * 256.0f;\n", i, i); + WRITE(p, " expanded%i.r = floor(depth%i / (256.0 * 256.0));\n", i, i); + WRITE(p, " depth%i -= expanded%i.r * 256.0 * 256.0;\n", i, i); + WRITE(p, " expanded%i.g = floor(depth%i / 256.0);\n", i, i); + WRITE(p, " depth%i -= expanded%i.g * 256.0;\n", i, i); WRITE(p, " expanded%i.b = depth%i;\n", i, i); } - WRITE(p, " if(cl > 0.5f) {\n"); + WRITE(p, " if(cl > 0.5) {\n"); // upper 16 - WRITE(p, " ocol0.b = expanded0.g / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded0.b / 255.0f;\n"); - WRITE(p, " ocol0.r = expanded1.g / 255.0f;\n"); - WRITE(p, " ocol0.a = expanded1.b / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded0.g / 255.0;\n"); + WRITE(p, " ocol0.g = expanded0.b / 255.0;\n"); + WRITE(p, " ocol0.r = expanded1.g / 255.0;\n"); + WRITE(p, " ocol0.a = expanded1.b / 255.0;\n"); WRITE(p, " } else {\n"); // lower 8 - WRITE(p, " ocol0.b = 1.0f;\n"); - WRITE(p, " ocol0.g = expanded0.r / 255.0f;\n"); - WRITE(p, " ocol0.r = 1.0f;\n"); - WRITE(p, " ocol0.a = expanded1.r / 255.0f;\n"); + WRITE(p, " ocol0.b = 1.0;\n"); + WRITE(p, " ocol0.g = expanded0.r / 255.0;\n"); + WRITE(p, " ocol0.r = 1.0;\n"); + WRITE(p, " ocol0.a = expanded1.r / 255.0;\n"); WRITE(p, " }\n"); WriteEncoderEnd(p, ApiType); @@ -878,22 +842,22 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType) WriteC4Encoder(p, "b", ApiType); break; case GX_CTF_Z8M: - WriteZ8Encoder(p, "256.0f", ApiType); + WriteZ8Encoder(p, "256.0", ApiType); break; case GX_CTF_Z8L: - WriteZ8Encoder(p, "65536.0f" , ApiType); + WriteZ8Encoder(p, "65536.0" , ApiType); break; case GX_CTF_Z16L: WriteZ16LEncoder(p, ApiType); break; default: PanicAlert("Unknown texture copy format: 0x%x\n", format); - break; + break; } if (text[sizeof(text) - 1] != 0x7C) PanicAlert("TextureConversionShader generator - buffer too small, canary has been eaten!"); - + #ifndef ANDROID uselocale(old_locale); // restore locale freelocale(locale); @@ -901,10 +865,4 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType) return text; } -void SetShaderParameters(float width, float height, float offsetX, float offsetY, float widthStride, float heightStride,float buffW,float buffH) -{ - g_renderer->SetPSConstant4f(C_COLORMATRIX, widthStride, heightStride, buffW, buffH); - g_renderer->SetPSConstant4f(C_COLORMATRIX + 1, width, (height - 1), offsetX, offsetY); -} - } // namespace diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.h b/Source/Core/VideoCommon/Src/TextureConversionShader.h index aa42726b2c..843c5ef7ee 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.h +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.h @@ -15,8 +15,6 @@ u16 GetEncodedSampleCount(u32 format); const char *GenerateEncodingShader(u32 format, API_TYPE ApiType = API_OPENGL); -void SetShaderParameters(float width, float height, float offsetX, float offsetY, float widthStride, float heightStride,float buffW = 0.0f,float buffH = 0.0f); - } #endif // _TEXTURECONVERSIONSHADER_H_ diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.h b/Source/Core/VideoCommon/Src/TextureDecoder.h index 968570a084..d474f1684b 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.h +++ b/Source/Core/VideoCommon/Src/TextureDecoder.h @@ -5,7 +5,7 @@ #ifndef _TEXTUREDECODER_H #define _TEXTUREDECODER_H #include "Hash.h" -enum +enum { TMEM_SIZE = 1024*1024, TMEM_LINE_SIZE = 32, diff --git a/Source/Core/VideoCommon/Src/VertexLoader.cpp b/Source/Core/VideoCommon/Src/VertexLoader.cpp index babaff83a5..d5cf003e76 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoader.cpp @@ -2,8 +2,6 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include - #include "Common.h" #include "VideoCommon.h" #include "VideoConfig.h" @@ -93,18 +91,18 @@ void LOADERDECL PosMtx_Write() DataWrite(0); } -void LOADERDECL UpdateBoundingBoxPrepare() +void LOADERDECL UpdateBoundingBoxPrepare() { if (!PixelEngine::bbox_active) return; - + // set our buffer as videodata buffer, so we will get a copy of the vertex positions // this is a big hack, but so we can use the same converting function then without bbox s_bbox_pCurBufferPointer_orig = VertexManager::s_pCurBufferPointer; VertexManager::s_pCurBufferPointer = (u8*)s_bbox_vertex_buffer; } -void LOADERDECL UpdateBoundingBox() +void LOADERDECL UpdateBoundingBox() { if (!PixelEngine::bbox_active) return; @@ -142,7 +140,7 @@ void LOADERDECL UpdateBoundingBox() o[1] = (1.0f - o[1]) * 242.0f; if (o[0] < PixelEngine::bbox[0]) PixelEngine::bbox[0] = (u16) std::max(0.0f, o[0]); - if (o[0] > PixelEngine::bbox[1]) PixelEngine::bbox[1] = (u16) o[0]; + if (o[0] > PixelEngine::bbox[1]) PixelEngine::bbox[1] = (u16) o[0]; if (o[1] < PixelEngine::bbox[2]) PixelEngine::bbox[2] = (u16) std::max(0.0f, o[1]); if (o[1] > PixelEngine::bbox[3]) PixelEngine::bbox[3] = (u16) o[1]; } @@ -174,7 +172,7 @@ void LOADERDECL TexMtx_Write_Float4() DataWrite(0.f); } -VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr) +VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr) { m_compiledCode = NULL; m_numLoadedVertices = 0; @@ -199,7 +197,7 @@ VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr) } -VertexLoader::~VertexLoader() +VertexLoader::~VertexLoader() { #ifdef USE_JIT FreeCodeSpace(); @@ -217,7 +215,7 @@ void VertexLoader::CompileVertexTranslator() PanicAlert("Trying to recompile a vertex translator"); m_compiledCode = GetCodePtr(); - ABI_EmitPrologue(4); + ABI_PushAllCalleeSavedRegsAndAdjustStack(); // Start loop here const u8 *loop_start = GetCodePtr(); @@ -250,7 +248,7 @@ void VertexLoader::CompileVertexTranslator() m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, m_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, (const u32)((m_VtxDesc.Hex >> 31) & 3) }; - + // Reset pipeline m_numPipelineStages = 0; @@ -267,7 +265,7 @@ void VertexLoader::CompileVertexTranslator() } // m_VBVertexStride for texmtx and posmtx is computed later when writing. - + // Position Matrix Index if (m_VtxDesc.PosMatIdx) { @@ -305,7 +303,7 @@ void VertexLoader::CompileVertexTranslator() { m_VertexSize += VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3); - + TPipelineFunction pFunc = VertexLoader_Normal::GetFunction(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3); @@ -349,7 +347,7 @@ void VertexLoader::CompileVertexTranslator() m_NativeFmt->m_components |= VB_HAS_COL0 << i; switch (col[i]) { - case NOT_PRESENT: + case NOT_PRESENT: m_NativeFmt->m_components &= ~(VB_HAS_COL0 << i); vtx_decl.color_offset[i] = -1; break; @@ -456,7 +454,7 @@ void VertexLoader::CompileVertexTranslator() if (tc[i] == NOT_PRESENT) { - // if there's more tex coords later, have to write a dummy call + // if there's more tex coords later, have to write a dummy call int j = i + 1; for (; j < 8; ++j) { @@ -499,7 +497,8 @@ void VertexLoader::CompileVertexTranslator() #endif J_CC(CC_NZ, loop_start, true); - ABI_EmitEpilogue(4); + ABI_PopAllCalleeSavedRegsAndAdjustStack(); + RET(); #endif m_NativeFmt->Initialize(vtx_decl); } @@ -552,8 +551,8 @@ int VertexLoader::SetupRunVertices(int vtx_attr_group, int primitive, int const if (g_nativeVertexFmt != NULL && g_nativeVertexFmt != m_NativeFmt) { // We really must flush here. It's possible that the native representations - // of the two vtx formats are the same, but we have no way to easily check that - // now. + // of the two vtx formats are the same, but we have no way to easily check that + // now. VertexManager::Flush(); // Also move the Set() here? } @@ -588,7 +587,7 @@ int VertexLoader::SetupRunVertices(int vtx_attr_group, int primitive, int const colElements[i] = m_VtxAttr.color[i].Elements; VertexManager::PrepareForAdditionalData(primitive, count, native_stride); - + return count; } @@ -628,10 +627,10 @@ void VertexLoader::RunCompiledVertices(int vtx_attr_group, int primitive, int co VertexManager::s_pCurBufferPointer += native_stride * new_count; DataSkip(new_count * m_VertexSize); - VertexManager::AddVertices(primitive, new_count); + VertexManager::AddVertices(primitive, new_count); } -void VertexLoader::SetVAT(u32 _group0, u32 _group1, u32 _group2) +void VertexLoader::SetVAT(u32 _group0, u32 _group1, u32 _group2) { VAT vat; vat.g0.Hex = _group0; @@ -675,7 +674,7 @@ void VertexLoader::SetVAT(u32 _group0, u32 _group1, u32 _group2) m_VtxAttr.texCoord[7].Elements = vat.g2.Tex7CoordElements; m_VtxAttr.texCoord[7].Format = vat.g2.Tex7CoordFormat; m_VtxAttr.texCoord[7].Frac = vat.g2.Tex7Frac; - + if(!m_VtxAttr.ByteDequant) { ERROR_LOG(VIDEO, "ByteDequant is set to zero"); } @@ -723,7 +722,7 @@ void VertexLoader::AppendToString(std::string *dest) const } } u32 tex_mode[8] = { - m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, + m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, m_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, m_VtxDesc.Tex7Coord }; for (int i = 0; i < 8; i++) diff --git a/Source/Core/VideoCommon/Src/VertexLoader.h b/Source/Core/VideoCommon/Src/VertexLoader.h index 06c5508040..c9ef28175c 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader.h +++ b/Source/Core/VideoCommon/Src/VertexLoader.h @@ -24,7 +24,7 @@ class VertexLoaderUID u32 vid[5]; size_t hash; public: - VertexLoaderUID() + VertexLoaderUID() { } @@ -73,9 +73,9 @@ private: { size_t h = -1; - for (unsigned int i = 0; i < sizeof(vid) / sizeof(vid[0]); ++i) + for (auto word : vid) { - h = h * 137 + vid[i]; + h = h * 137 + word; } return h; @@ -94,7 +94,7 @@ public: ~VertexLoader(); int GetVertexSize() const {return m_VertexSize;} - + int SetupRunVertices(int vtx_attr_group, int primitive, int const count); void RunVertices(int vtx_attr_group, int primitive, int count); void RunCompiledVertices(int vtx_attr_group, int primitive, int count, u8* Data); diff --git a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp index 856b5d9fa5..9ad3e013c6 100644 --- a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp @@ -43,16 +43,16 @@ static VertexLoaderMap g_VertexLoaderMap; void Init() { MarkAllDirty(); - for (int i = 0; i < 8; i++) - g_VertexLoaders[i] = NULL; + for (auto& vertexLoader : g_VertexLoaders) + vertexLoader = NULL; RecomputeCachedArraybases(); } void Shutdown() { - for (VertexLoaderMap::iterator iter = g_VertexLoaderMap.begin(); iter != g_VertexLoaderMap.end(); ++iter) + for (auto& p : g_VertexLoaderMap) { - delete iter->second; + delete p.second; } g_VertexLoaderMap.clear(); } diff --git a/Source/Core/VideoCommon/Src/VertexLoader_Color.cpp b/Source/Core/VideoCommon/Src/VertexLoader_Color.cpp index 45af21138f..e32af6226c 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader_Color.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoader_Color.cpp @@ -100,7 +100,7 @@ void LOADERDECL Color_ReadDirect_24b_6666() // F|RES: i am not 100 percent sure, but the colElements seems to be important for rendering only // at least it fixes mario party 4 // -// if (colElements[colIndex]) +// if (colElements[colIndex]) // else // col |= 0xFF< __forceinline void Normal_Index_Offset() { static_assert(!std::numeric_limits::is_signed, "Only unsigned I is sane!"); - + auto const index = DataRead(); auto const data = reinterpret_cast(cached_arraybases[ARRAY_NORMAL] + (index * arraystrides[ARRAY_NORMAL]) + sizeof(T) * 3 * Offset); diff --git a/Source/Core/VideoCommon/Src/VertexLoader_Normal.h b/Source/Core/VideoCommon/Src/VertexLoader_Normal.h index 40fd8cac06..4ad15c51b0 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader_Normal.h +++ b/Source/Core/VideoCommon/Src/VertexLoader_Normal.h @@ -65,7 +65,7 @@ private: gc_size = T::size; function = T::function; } - + int gc_size; TPipelineFunction function; }; diff --git a/Source/Core/VideoCommon/Src/VertexLoader_Position.cpp b/Source/Core/VideoCommon/Src/VertexLoader_Position.cpp index 2b383fc3f8..da844484ad 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader_Position.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoader_Position.cpp @@ -27,7 +27,7 @@ MOVZX(32, R(EBX), MOffset(ESI, 1)); MOVZX(32, R(ECX), MOffset(ESI, 2)); MOVD(XMM0, R(EAX)); MOVD(XMM1, R(EBX)); -MOVD(XMM2, R(ECX)); +MOVD(XMM2, R(ECX)); CVTDQ2PS(XMM0, XMM0); CVTDQ2PS(XMM1, XMM1); CVTDQ2PS(XMM2, XMM2); diff --git a/Source/Core/VideoCommon/Src/VertexLoader_TextCoord.cpp b/Source/Core/VideoCommon/Src/VertexLoader_TextCoord.cpp index 2d956b242a..70c1f2de3f 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader_TextCoord.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoader_TextCoord.cpp @@ -67,7 +67,7 @@ template void LOADERDECL TexCoord_ReadIndex() { static_assert(!std::numeric_limits::is_signed, "Only unsigned I is sane!"); - + auto const index = DataRead(); auto const data = reinterpret_cast(cached_arraybases[ARRAY_TEXCOORD0 + tcIndex] + (index * arraystrides[ARRAY_TEXCOORD0 + tcIndex])); diff --git a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp index 13fbd55641..b586ad1a99 100644 --- a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp @@ -50,13 +50,13 @@ u32 VertexManager::GetRemainingSize() } void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 stride) -{ +{ u32 const needed_vertex_bytes = count * stride; - + if (count > IndexGenerator::GetRemainingIndices() || count > GetRemainingIndices(primitive) || needed_vertex_bytes > GetRemainingSize()) { Flush(); - + if(count > IndexGenerator::GetRemainingIndices()) ERROR_LOG(VIDEO, "Too little remaining index values. Use 32-bit or reset them on flush."); if (count > GetRemainingIndices(primitive)) @@ -75,7 +75,7 @@ bool VertexManager::IsFlushed() const u32 VertexManager::GetRemainingIndices(int primitive) { - + if(g_Config.backend_info.bSupportsPrimitiveRestart) { switch (primitive) @@ -125,7 +125,7 @@ u32 VertexManager::GetRemainingIndices(int primitive) default: return 0; } - } + } } void VertexManager::AddVertices(int primitive, u32 numVertices) @@ -158,12 +158,12 @@ void VertexManager::Flush() #if (0) void VertexManager::Flush() { -#if defined(_DEBUG) || defined(DEBUGFAST) +#if defined(_DEBUG) || defined(DEBUGFAST) PRIM_LOG("frame%d:\n texgen=%d, numchan=%d, dualtex=%d, ztex=%d, cole=%d, alpe=%d, ze=%d", g_ActiveConfig.iSaveTargetId, xfregs.numTexGens, xfregs.nNumChans, (int)xfregs.bEnableDualTexTransform, bpmem.ztex2.op, bpmem.blendmode.colorupdate, bpmem.blendmode.alphaupdate, bpmem.zmode.updateenable); - for (int i = 0; i < xfregs.nNumChans; ++i) + for (int i = 0; i < xfregs.nNumChans; ++i) { LitChannel* ch = &xfregs.colChans[i].color; PRIM_LOG("colchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); @@ -171,7 +171,7 @@ void VertexManager::Flush() PRIM_LOG("alpchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); } - for (int i = 0; i < xfregs.numTexGens; ++i) + for (int i = 0; i < xfregs.numTexGens; ++i) { TexMtxInfo tinfo = xfregs.texcoords[i].texmtxinfo; if (tinfo.texgentype != XF_TEXGEN_EMBOSS_MAP) tinfo.hex &= 0x7ff; @@ -206,10 +206,10 @@ void VertexManager::Flush() Renderer::SetSamplerState(i & 3, i >> 2); FourTexUnits &tex = bpmem.tex[i >> 2]; - TCacheEntry::TCacheEntryBase* tentry = TextureCache::Load(i, + TCacheEntry::TCacheEntryBase* tentry = TextureCache::Load(i, (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, - tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, + tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, tex.texTlut[i&3].tlut_format, (tex.texMode0[i&3].min_filter & 3) && (tex.texMode0[i&3].min_filter != 8), (tex.texMode1[i&3].max_lod >> 4)); @@ -257,7 +257,7 @@ void VertexManager::Flush() //IndexGenerator::Start(TIBuffer, LIBuffer, PIBuffer); #if defined(_DEBUG) || defined(DEBUGFAST) - if (g_ActiveConfig.iLog & CONF_SAVESHADERS) + if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { // save the shaders char strfile[255]; @@ -271,7 +271,7 @@ void VertexManager::Flush() fvs << vs->strprog.c_str(); } - if (g_ActiveConfig.iLog & CONF_SAVETARGETS) + if (g_ActiveConfig.iLog & CONF_SAVETARGETS) { char str[128]; sprintf(str, "%starg%.3d.tga", File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), g_ActiveConfig.iSaveTargetId); @@ -297,12 +297,12 @@ void VertexManager::DoStateShared(PointerWrap& p) // It seems we half-assume to be flushed here // We update s_pCurBufferPointer yet don't worry about IndexGenerator's outdated pointers // and maybe other things are overlooked - + p.Do(LocalVBuffer); p.Do(TIBuffer); p.Do(LIBuffer); p.Do(PIBuffer); - + s_pBaseBufferPointer = &LocalVBuffer[0]; s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size(); p.DoPointer(s_pCurBufferPointer, s_pBaseBufferPointer); diff --git a/Source/Core/VideoCommon/Src/VertexManagerBase.h b/Source/Core/VideoCommon/Src/VertexManagerBase.h index fafde8de44..b5b13c8933 100644 --- a/Source/Core/VideoCommon/Src/VertexManagerBase.h +++ b/Source/Core/VideoCommon/Src/VertexManagerBase.h @@ -12,13 +12,13 @@ class VertexManager { private: static const u32 SMALLEST_POSSIBLE_VERTEX = sizeof(float)*3; // 3 pos - static const u32 LARGEST_POSSIBLE_VERTEX = sizeof(float)*45 + sizeof(u32)*2; // 3 pos, 3*3 normal, 2*u32 color, 8*4 tex, 1 posMat - + static const u32 LARGEST_POSSIBLE_VERTEX = sizeof(float)*45 + sizeof(u32)*2; // 3 pos, 3*3 normal, 2*u32 color, 8*4 tex, 1 posMat + static const u32 MAX_PRIMITIVES_PER_COMMAND = (u16)-1; - + public: static const u32 MAXVBUFFERSIZE = ROUND_UP_POW2 (MAX_PRIMITIVES_PER_COMMAND * LARGEST_POSSIBLE_VERTEX); - + // We may convert triangle-fans to triangle-lists, almost 3x as many indices. static const u32 MAXIBUFFERSIZE = ROUND_UP_POW2 (MAX_PRIMITIVES_PER_COMMAND * 3); @@ -43,7 +43,7 @@ public: static void DoState(PointerWrap& p); virtual void CreateDeviceObjects(){}; virtual void DestroyDeviceObjects(){}; - + protected: u16* GetTriangleIndexBuffer() { return &TIBuffer[0]; } u16* GetLineIndexBuffer() { return &LIBuffer[0]; } @@ -55,13 +55,13 @@ protected: private: bool IsFlushed() const; - + void ResetBuffer(); - + //virtual void Draw(u32 stride, bool alphapass) = 0; // temp virtual void vFlush() = 0; - + std::vector LocalVBuffer; std::vector TIBuffer; std::vector LIBuffer; diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index ad090fb839..78b3c57dda 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -28,7 +28,7 @@ static void DefineVSOutputStructMember(T& object, API_TYPE api_type, const char* if (api_type == API_OPENGL) object.Write(";\n"); - else + else // D3D { if (semantic_index != -1) object.Write(" : %s%d;\n", semantic, semantic_index); @@ -45,24 +45,14 @@ static inline void GenerateVSOutputStruct(T& object, u32 components, API_TYPE ap DefineVSOutputStructMember(object, api_type, "float4", "colors_", 0, "COLOR", 0); DefineVSOutputStructMember(object, api_type, "float4", "colors_", 1, "COLOR", 1); - if (xfregs.numTexGen.numTexGens < 7) - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - DefineVSOutputStructMember(object, api_type, "float3", "tex", i, "TEXCOORD", i); + for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) + DefineVSOutputStructMember(object, api_type, "float3", "tex", i, "TEXCOORD", i); - DefineVSOutputStructMember(object, api_type, "float4", "clipPos", -1, "TEXCOORD", xfregs.numTexGen.numTexGens); + DefineVSOutputStructMember(object, api_type, "float4", "clipPos", -1, "TEXCOORD", xfregs.numTexGen.numTexGens); + + if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) + DefineVSOutputStructMember(object, api_type, "float4", "Normal", -1, "TEXCOORD", xfregs.numTexGen.numTexGens + 1); - if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - DefineVSOutputStructMember(object, api_type, "float4", "Normal", -1, "TEXCOORD", xfregs.numTexGen.numTexGens + 1); - } - else - { - // Store clip position in the w component of first 4 texcoords - bool ppl = g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting; - int num_texcoords = ppl ? 8 : xfregs.numTexGen.numTexGens; - for (int i = 0; i < num_texcoords; ++i) - DefineVSOutputStructMember(object, api_type, (ppl || i < 4) ? "float4" : "float3", "tex", i, "TEXCOORD", i); - } object.Write("};\n"); } @@ -140,34 +130,23 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } // Let's set up attributes - if (xfregs.numTexGen.numTexGens < 7) + for (size_t i = 0; i < 8; ++i) { - for (int i = 0; i < 8; ++i) + if (i < xfregs.numTexGen.numTexGens) + { out.Write("VARYOUT float3 uv%d_2;\n", i); - out.Write("VARYOUT float4 clipPos_2;\n"); - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - out.Write("VARYOUT float4 Normal_2;\n"); - } - else - { - // wpos is in w of first 4 texcoords - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - for (int i = 0; i < 8; ++i) - out.Write("VARYOUT float4 uv%d_2;\n", i); - } - else - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - out.Write("VARYOUT float%d uv%d_2;\n", i < 4 ? 4 : 3 , i); } } + out.Write("VARYOUT float4 clipPos_2;\n"); + if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) + out.Write("VARYOUT float4 Normal_2;\n"); + out.Write("VARYOUT float4 colors_02;\n"); out.Write("VARYOUT float4 colors_12;\n"); out.Write("void main()\n{\n"); } - else + else // D3D { out.Write("VS_OUTPUT main(\n"); @@ -197,21 +176,12 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ // transforms if (components & VB_HAS_POSMTXIDX) { - if (api_type & API_D3D9) - { - out.Write("int4 indices = D3DCOLORtoUBYTE4(blend_indices);\n"); - out.Write("int posmtx = indices.x;\n"); - } - else if (api_type == API_D3D11) - { - out.Write("int posmtx = blend_indices.x * 255.0f;\n"); - } + if (api_type == API_D3D) + out.Write("int posmtx = blend_indices.x * 255.0;\n"); // TODO: Ugly, should use an integer instead else - { out.Write("int posmtx = int(fposmtx);\n"); - } - if (is_writing_shadercode && DriverDetails::HasBug(DriverDetails::BUG_NODYNUBOACCESS)) + if (is_writing_shadercode && (DriverDetails::HasBug(DriverDetails::BUG_NODYNUBOACCESS) && !DriverDetails::HasBug(DriverDetails::BUG_ANNIHILATEDUBOS)) ) { // This'll cause issues, but it can't be helped out.Write("float4 pos = float4(dot(" I_TRANSFORMMATRICES"[0], rawpos), dot(" I_TRANSFORMMATRICES"[1], rawpos), dot(" I_TRANSFORMMATRICES"[2], rawpos), 1);\n"); @@ -236,7 +206,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } else { - out.Write("float4 pos = float4(dot(" I_POSNORMALMATRIX"[0], rawpos), dot(" I_POSNORMALMATRIX"[1], rawpos), dot(" I_POSNORMALMATRIX"[2], rawpos), 1.0f);\n"); + out.Write("float4 pos = float4(dot(" I_POSNORMALMATRIX"[0], rawpos), dot(" I_POSNORMALMATRIX"[1], rawpos), dot(" I_POSNORMALMATRIX"[2], rawpos), 1.0);\n"); if (components & VB_HAS_NRM0) out.Write("float3 _norm0 = normalize(float3(dot(" I_POSNORMALMATRIX"[3].xyz, rawnorm0), dot(" I_POSNORMALMATRIX"[4].xyz, rawnorm0), dot(" I_POSNORMALMATRIX"[5].xyz, rawnorm0)));\n"); if (components & VB_HAS_NRM1) @@ -246,7 +216,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } if (!(components & VB_HAS_NRM0)) - out.Write("float3 _norm0 = float3(0.0f, 0.0f, 0.0f);\n"); + out.Write("float3 _norm0 = float3(0.0, 0.0, 0.0);\n"); out.Write("o.pos = float4(dot(" I_PROJECTION"[0], pos), dot(" I_PROJECTION"[1], pos), dot(" I_PROJECTION"[2], pos), dot(" I_PROJECTION"[3], pos));\n"); @@ -261,7 +231,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_COL0) out.Write("o.colors_0 = color0;\n"); else - out.Write("o.colors_0 = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n"); } GenerateLightingShader(out, uid_data.lighting, components, I_MATERIALS, I_LIGHTS, "color", "o.colors_"); @@ -283,13 +253,13 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ */ // transform texcoords - out.Write("float4 coord = float4(0.0f, 0.0f, 1.0f, 1.0f);\n"); + out.Write("float4 coord = float4(0.0, 0.0, 1.0, 1.0);\n"); for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) { TexMtxInfo& texinfo = xfregs.texMtxInfo[i]; out.Write("{\n"); - out.Write("coord = float4(0.0f, 0.0f, 1.0f, 1.0f);\n"); + out.Write("coord = float4(0.0, 0.0, 1.0, 1.0);\n"); uid_data.texMtxInfo[i].sourcerow = xfregs.texMtxInfo[i].sourcerow; switch (texinfo.sourcerow) { @@ -301,7 +271,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_NRM0) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm0.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm0.xyz, 1.0);\n"); } break; case XF_SRCCOLORS_INROW: @@ -311,20 +281,20 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_NRM1) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm1.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm1.xyz, 1.0);\n"); } break; case XF_SRCBINORMAL_B_INROW: if (components & VB_HAS_NRM2) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm2.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm2.xyz, 1.0);\n"); } break; default: _assert_(texinfo.sourcerow <= XF_SRCTEX7_INROW); if (components & (VB_HAS_UV0<<(texinfo.sourcerow - XF_SRCTEX0_INROW)) ) - out.Write("coord = float4(tex%d.x, tex%d.y, 1.0f, 1.0f);\n", texinfo.sourcerow - XF_SRCTEX0_INROW, texinfo.sourcerow - XF_SRCTEX0_INROW); + out.Write("coord = float4(tex%d.x, tex%d.y, 1.0, 1.0);\n", texinfo.sourcerow - XF_SRCTEX0_INROW, texinfo.sourcerow - XF_SRCTEX0_INROW); break; } @@ -340,7 +310,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ uid_data.texMtxInfo[i].embosslightshift = xfregs.texMtxInfo[i].embosslightshift; uid_data.texMtxInfo[i].embosssourceshift = xfregs.texMtxInfo[i].embosssourceshift; out.Write("ldir = normalize(" LIGHT_POS".xyz - pos.xyz);\n", LIGHT_POS_PARAMS(I_LIGHTS, texinfo.embosslightshift)); - out.Write("o.tex%d.xyz = o.tex%d.xyz + float3(dot(ldir, _norm1), dot(ldir, _norm2), 0.0f);\n", i, texinfo.embosssourceshift); + out.Write("o.tex%d.xyz = o.tex%d.xyz + float3(dot(ldir, _norm1), dot(ldir, _norm2), 0.0);\n", i, texinfo.embosssourceshift); } else { @@ -399,7 +369,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ // q of output is unknown // multiply by postmatrix - out.Write("o.tex%d.xyz = float3(dot(P0.xy, o.tex%d.xy) + P0.z + P0.w, dot(P1.xy, o.tex%d.xy) + P1.z + P1.w, 0.0f);\n", i, i, i); + out.Write("o.tex%d.xyz = float3(dot(P0.xy, o.tex%d.xy) + P0.z + P0.w, dot(P1.xy, o.tex%d.xy) + P1.z + P1.w, 0.0);\n", i, i, i); } else { @@ -416,34 +386,11 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } // clipPos/w needs to be done in pixel shader, not here - if (xfregs.numTexGen.numTexGens < 7) - { - out.Write("o.clipPos = float4(pos.x,pos.y,o.pos.z,o.pos.w);\n"); - } - else - { - out.Write("o.tex0.w = pos.x;\n"); - out.Write("o.tex1.w = pos.y;\n"); - out.Write("o.tex2.w = o.pos.z;\n"); - out.Write("o.tex3.w = o.pos.w;\n"); - } + out.Write("o.clipPos = float4(pos.x,pos.y,o.pos.z,o.pos.w);\n"); if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { - if (xfregs.numTexGen.numTexGens < 7) - { - out.Write("o.Normal = float4(_norm0.x,_norm0.y,_norm0.z,pos.z);\n"); - } - else - { - out.Write("o.tex4.w = _norm0.x;\n"); - out.Write("o.tex5.w = _norm0.y;\n"); - out.Write("o.tex6.w = _norm0.z;\n"); - if (xfregs.numTexGen.numTexGens < 8) - out.Write("o.tex7 = pos.xyzz;\n"); - else - out.Write("o.tex7.w = pos.z;\n"); - } + out.Write("o.Normal = float4(_norm0.x,_norm0.y,_norm0.z,pos.z);\n"); if (components & VB_HAS_COL0) out.Write("o.colors_0 = color0;\n"); @@ -454,22 +401,22 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ //write the true depth value, if the game uses depth textures pixel shaders will override with the correct values //if not early z culling will improve speed - if (api_type & API_D3D9 || api_type == API_D3D11) + if (api_type == API_D3D) { out.Write("o.pos.z = " I_DEPTHPARAMS".x * o.pos.w + o.pos.z * " I_DEPTHPARAMS".y;\n"); } - else + else // OGL { // this results in a scale from -1..0 to -1..1 after perspective // divide - out.Write("o.pos.z = o.pos.w + o.pos.z * 2.0f;\n"); + out.Write("o.pos.z = o.pos.w + o.pos.z * 2.0;\n"); // Sonic Unleashed puts its final rendering at the near or // far plane of the viewing frustrum(actually box, they use // orthogonal projection for that), and we end up putting it // just beyond, and the rendering gets clipped away. (The // primitive gets dropped) - out.Write("o.pos.z = o.pos.z * 1048575.0f/1048576.0f;\n"); + out.Write("o.pos.z = o.pos.z * 1048575.0/1048576.0;\n"); // the next steps of the OGL pipeline are: // (x_c,y_c,z_c,w_c) = o.pos //switch to OGL spec terminology @@ -482,13 +429,6 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ //seems to get rather complicated } - if (api_type & API_D3D9) - { - // D3D9 is addressing pixel centers instead of pixel boundaries in clip space. - // Thus we need to offset the final position by half a pixel - out.Write("o.pos = o.pos + float4(" I_DEPTHPARAMS".z, " I_DEPTHPARAMS".w, 0.f, 0.f);\n"); - } - if(api_type == API_OPENGL) { // Bit ugly here @@ -496,39 +436,18 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ // Will look better when we bind uniforms in GLSL 1.3 // clipPos/w needs to be done in pixel shader, not here - if (xfregs.numTexGen.numTexGens < 7) - { - for (unsigned int i = 0; i < 8; ++i) - { - if(i < xfregs.numTexGen.numTexGens) - out.Write(" uv%d_2.xyz = o.tex%d;\n", i, i); - else - out.Write(" uv%d_2.xyz = float3(0.0f, 0.0f, 0.0f);\n", i); - } - out.Write(" clipPos_2 = o.clipPos;\n"); - if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - out.Write(" Normal_2 = o.Normal;\n"); - } - else - { - // clip position is in w of first 4 texcoords - if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) - { - for (int i = 0; i < 8; ++i) - out.Write(" uv%d_2 = o.tex%d;\n", i, i); - } - else - { - for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) - out.Write(" uv%d_2%s = o.tex%d;\n", i, i < 4 ? ".xyzw" : ".xyz" , i); - } - } + for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) + out.Write(" uv%d_2.xyz = o.tex%d;\n", i, i); + out.Write(" clipPos_2 = o.clipPos;\n"); + if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) + out.Write(" Normal_2 = o.Normal;\n"); + out.Write("colors_02 = o.colors_0;\n"); out.Write("colors_12 = o.colors_1;\n"); out.Write("gl_Position = o.pos;\n"); out.Write("}\n"); } - else + else // D3D { out.Write("return o;\n}\n"); } diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.h b/Source/Core/VideoCommon/Src/VertexShaderGen.h index ab9a378107..378f2cd77d 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.h +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.h @@ -5,10 +5,10 @@ #ifndef GCOGL_VERTEXSHADER_H #define GCOGL_VERTEXSHADER_H -#include #include "XFMemory.h" #include "VideoCommon.h" #include "ShaderGenCommon.h" +#include "LightingShaderGen.h" // TODO should be reordered #define SHADER_POSITION_ATTRIB 0 @@ -39,8 +39,9 @@ #define I_TRANSFORMMATRICES "ctrmtx" #define I_NORMALMATRICES "cnmtx" #define I_POSTTRANSFORMMATRICES "cpostmtx" -#define I_DEPTHPARAMS "cDepth" // farZ, zRange, scaled viewport width, scaled viewport height +#define I_DEPTHPARAMS "cDepth" // farZ, zRange +//TODO: get rid of them, they aren't used at all #define C_POSNORMALMATRIX 0 #define C_PROJECTION (C_POSNORMALMATRIX + 6) #define C_MATERIALS (C_PROJECTION + 4) @@ -52,17 +53,6 @@ #define C_DEPTHPARAMS (C_POSTTRANSFORMMATRICES + 64) #define C_VENVCONST_END (C_DEPTHPARAMS + 1) -const s_svar VSVar_Loc[] = { {I_POSNORMALMATRIX, C_POSNORMALMATRIX, 6 }, - {I_PROJECTION , C_PROJECTION, 4 }, - {I_MATERIALS, C_MATERIALS, 4 }, - {I_LIGHTS, C_LIGHTS, 40 }, - {I_TEXMATRICES, C_TEXMATRICES, 24 }, - {I_TRANSFORMMATRICES , C_TRANSFORMMATRICES, 64 }, - {I_NORMALMATRICES , C_NORMALMATRICES, 32 }, - {I_POSTTRANSFORMMATRICES, C_POSTTRANSFORMMATRICES, 64 }, - {I_DEPTHPARAMS, C_DEPTHPARAMS, 1 }, - }; - #pragma pack(1) struct vertex_shader_uid_data diff --git a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp index c07286d58f..5ec371a0ba 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp @@ -36,32 +36,8 @@ static Matrix33 s_viewInvRotationMatrix; static float s_fViewTranslationVector[3]; static float s_fViewRotation[2]; -void UpdateViewport(Matrix44& vpCorrection); - -void UpdateViewportWithCorrection() -{ - UpdateViewport(s_viewportCorrection); -} - -inline void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - g_renderer->SetVSConstant4f(const_number, f1, f2, f3, f4); -} - -inline void SetVSConstant4fv(unsigned int const_number, const float *f) -{ - g_renderer->SetVSConstant4fv(const_number, f); -} - -inline void SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f) -{ - g_renderer->SetMultiVSConstant3fv(const_number, count, f); -} - -inline void SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - g_renderer->SetMultiVSConstant4fv(const_number, count, f); -} +VertexShaderConstants VertexShaderManager::constants; +bool VertexShaderManager::dirty; struct ProjectionHack { @@ -147,12 +123,65 @@ void UpdateProjectionHack(int iPhackvalue[], std::string sPhackvalue[]) g_ProjHack3 = bProjHack3; } + +// Viewport correction: +// In D3D, the viewport rectangle must fit within the render target. +// Say you want a viewport at (ix, iy) with size (iw, ih), +// but your viewport must be clamped at (ax, ay) with size (aw, ah). +// Just multiply the projection matrix with the following to get the same +// effect: +// [ (iw/aw) 0 0 ((iw - 2*(ax-ix)) / aw - 1) ] +// [ 0 (ih/ah) 0 ((-ih + 2*(ay-iy)) / ah + 1) ] +// [ 0 0 1 0 ] +// [ 0 0 0 1 ] +static void ViewportCorrectionMatrix(Matrix44& result) +{ + int scissorXOff = bpmem.scissorOffset.x * 2; + int scissorYOff = bpmem.scissorOffset.y * 2; + + // TODO: ceil, floor or just cast to int? + // TODO: Directly use the floats instead of rounding them? + float intendedX = xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff; + float intendedY = xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff; + float intendedWd = 2.0f * xfregs.viewport.wd; + float intendedHt = -2.0f * xfregs.viewport.ht; + + if (intendedWd < 0.f) + { + intendedX += intendedWd; + intendedWd = -intendedWd; + } + if (intendedHt < 0.f) + { + intendedY += intendedHt; + intendedHt = -intendedHt; + } + + // fit to EFB size + float X = (intendedX >= 0.f) ? intendedX : 0.f; + float Y = (intendedY >= 0.f) ? intendedY : 0.f; + float Wd = (X + intendedWd <= EFB_WIDTH) ? intendedWd : (EFB_WIDTH - X); + float Ht = (Y + intendedHt <= EFB_HEIGHT) ? intendedHt : (EFB_HEIGHT - Y); + + Matrix44::LoadIdentity(result); + if (Wd == 0 || Ht == 0) + return; + + result.data[4*0+0] = intendedWd / Wd; + result.data[4*0+3] = (intendedWd - 2.f * (X - intendedX)) / Wd - 1.f; + result.data[4*1+1] = intendedHt / Ht; + result.data[4*1+3] = (-intendedHt + 2.f * (Y - intendedY)) / Ht + 1.f; +} + +void UpdateViewport(); + void VertexShaderManager::Init() { Dirty(); memset(&xfregs, 0, sizeof(xfregs)); memset(xfmem, 0, sizeof(xfmem)); + memset(&constants, 0 , sizeof(constants)); ResetView(); // TODO: should these go inside ResetView()? @@ -168,16 +197,16 @@ void VertexShaderManager::Shutdown() void VertexShaderManager::Dirty() { - nTransformMatricesChanged[0] = 0; + nTransformMatricesChanged[0] = 0; nTransformMatricesChanged[1] = 256; nNormalMatricesChanged[0] = 0; nNormalMatricesChanged[1] = 96; - nPostTransformMatricesChanged[0] = 0; + nPostTransformMatricesChanged[0] = 0; nPostTransformMatricesChanged[1] = 256; - nLightsChanged[0] = 0; + nLightsChanged[0] = 0; nLightsChanged[1] = 0x80; bPosNormalMatrixChanged = true; @@ -187,21 +216,20 @@ void VertexShaderManager::Dirty() bProjectionChanged = true; nMaterialsChanged = 15; + + dirty = true; } // Syncs the shader constant buffers with xfmem // TODO: A cleaner way to control the matrices without making a mess in the parameters field void VertexShaderManager::SetConstants() { - if (g_ActiveConfig.backend_info.APIType == API_OPENGL && !g_ActiveConfig.backend_info.bSupportsGLSLUBO) - Dirty(); - if (nTransformMatricesChanged[0] >= 0) { int startn = nTransformMatricesChanged[0] / 4; int endn = (nTransformMatricesChanged[1] + 3) / 4; - const float* pstart = (const float*)&xfmem[startn * 4]; - SetMultiVSConstant4fv(C_TRANSFORMMATRICES + startn, endn - startn, pstart); + memcpy(constants.transformmatrices[startn], &xfmem[startn * 4], (endn - startn) * 16); + dirty = true; nTransformMatricesChanged[0] = nTransformMatricesChanged[1] = -1; } @@ -209,8 +237,11 @@ void VertexShaderManager::SetConstants() { int startn = nNormalMatricesChanged[0] / 3; int endn = (nNormalMatricesChanged[1] + 2) / 3; - const float *pnstart = (const float*)&xfmem[XFMEM_NORMALMATRICES+3*startn]; - SetMultiVSConstant3fv(C_NORMALMATRICES + startn, endn - startn, pnstart); + for(int i=startn; i> 24) & 0xFF) * NormalizationCoef, - ((color >> 16) & 0xFF) * NormalizationCoef, - ((color >> 8) & 0xFF) * NormalizationCoef, - ((color) & 0xFF) * NormalizationCoef); + constants.lights[5*i][0] = ((color >> 24) & 0xFF) / 255.0f; + constants.lights[5*i][1] = ((color >> 16) & 0xFF) / 255.0f; + constants.lights[5*i][2] = ((color >> 8) & 0xFF) / 255.0f; + constants.lights[5*i][3] = ((color) & 0xFF) / 255.0f; xfmemptr += 4; for (int j = 0; j < 4; ++j, xfmemptr += 3) @@ -249,52 +278,45 @@ void VertexShaderManager::SetConstants() fabs(xfmemptr[2]) < 0.00001f) { // dist attenuation, make sure not equal to 0!!! - SetVSConstant4f(C_LIGHTS+5*i+j+1, 0.00001f, xfmemptr[1], xfmemptr[2], 0); + constants.lights[5*i+j+1][0] = 0.00001f; } else - { - SetVSConstant4fv(C_LIGHTS+5*i+j+1, xfmemptr); - } + constants.lights[5*i+j+1][0] = xfmemptr[0]; + constants.lights[5*i+j+1][1] = xfmemptr[1]; + constants.lights[5*i+j+1][2] = xfmemptr[2]; } } + dirty = true; nLightsChanged[0] = nLightsChanged[1] = -1; } if (nMaterialsChanged) { - float GC_ALIGNED16(material[4]); - float NormalizationCoef = 1 / 255.0f; - for (int i = 0; i < 2; ++i) { if (nMaterialsChanged & (1 << i)) { u32 data = *(xfregs.ambColor + i); - - material[0] = ((data >> 24) & 0xFF) * NormalizationCoef; - material[1] = ((data >> 16) & 0xFF) * NormalizationCoef; - material[2] = ((data >> 8) & 0xFF) * NormalizationCoef; - material[3] = ( data & 0xFF) * NormalizationCoef; - - SetVSConstant4fv(C_MATERIALS + i, material); + constants.materials[i][0] = ((data >> 24) & 0xFF) / 255.0f; + constants.materials[i][1] = ((data >> 16) & 0xFF) / 255.0f; + constants.materials[i][2] = ((data >> 8) & 0xFF) / 255.0f; + constants.materials[i][3] = ( data & 0xFF) / 255.0f; } } - + for (int i = 0; i < 2; ++i) { if (nMaterialsChanged & (1 << (i + 2))) { u32 data = *(xfregs.matColor + i); - - material[0] = ((data >> 24) & 0xFF) * NormalizationCoef; - material[1] = ((data >> 16) & 0xFF) * NormalizationCoef; - material[2] = ((data >> 8) & 0xFF) * NormalizationCoef; - material[3] = ( data & 0xFF) * NormalizationCoef; - - SetVSConstant4fv(C_MATERIALS + i + 2, material); + constants.materials[i+2][0] = ((data >> 24) & 0xFF) / 255.0f; + constants.materials[i+2][1] = ((data >> 16) & 0xFF) / 255.0f; + constants.materials[i+2][2] = ((data >> 8) & 0xFF) / 255.0f; + constants.materials[i+2][3] = ( data & 0xFF) / 255.0f; } } + dirty = true; nMaterialsChanged = 0; } @@ -306,14 +328,17 @@ void VertexShaderManager::SetConstants() const float *pos = (const float *)xfmem + MatrixIndexA.PosNormalMtxIdx * 4; const float *norm = (const float *)xfmem + XFMEM_NORMALMATRICES + 3 * (MatrixIndexA.PosNormalMtxIdx & 31); - SetMultiVSConstant4fv(C_POSNORMALMATRIX, 3, pos); - SetMultiVSConstant3fv(C_POSNORMALMATRIX + 3, 3, norm); + memcpy(constants.posnormalmatrix, pos, 3*16); + memcpy(constants.posnormalmatrix[3], norm, 12); + memcpy(constants.posnormalmatrix[4], norm+3, 12); + memcpy(constants.posnormalmatrix[5], norm+6, 12); + dirty = true; } if (bTexMatricesChanged[0]) { bTexMatricesChanged[0] = false; - const float *fptrs[] = + const float *fptrs[] = { (const float *)xfmem + MatrixIndexA.Tex0MtxIdx * 4, (const float *)xfmem + MatrixIndexA.Tex1MtxIdx * 4, (const float *)xfmem + MatrixIndexA.Tex2MtxIdx * 4, (const float *)xfmem + MatrixIndexA.Tex3MtxIdx * 4 @@ -321,8 +346,9 @@ void VertexShaderManager::SetConstants() for (int i = 0; i < 4; ++i) { - SetMultiVSConstant4fv(C_TEXMATRICES + 3 * i, 3, fptrs[i]); + memcpy(constants.texmatrices[3*i], fptrs[i], 3*16); } + dirty = true; } if (bTexMatricesChanged[1]) @@ -335,27 +361,32 @@ void VertexShaderManager::SetConstants() for (int i = 0; i < 4; ++i) { - SetMultiVSConstant4fv(C_TEXMATRICES+3 * i + 12, 3, fptrs[i]); + memcpy(constants.texmatrices[3*i+12], fptrs[i], 3*16); } + dirty = true; } if (bViewportChanged) { bViewportChanged = false; - SetVSConstant4f(C_DEPTHPARAMS, - xfregs.viewport.farZ / 16777216.0f, - xfregs.viewport.zRange / 16777216.0f, - -1.f / (float)g_renderer->EFBToScaledX((int)ceil(2.0f * xfregs.viewport.wd)), - 1.f / (float)g_renderer->EFBToScaledY((int)ceil(-2.0f * xfregs.viewport.ht))); + constants.depthparams[0] = xfregs.viewport.farZ / 16777216.0f; + constants.depthparams[1] = xfregs.viewport.zRange / 16777216.0f; + dirty = true; // This is so implementation-dependent that we can't have it here. - UpdateViewport(s_viewportCorrection); - bProjectionChanged = true; + UpdateViewport(); + + // Update projection if the viewport isn't 1:1 useable + if(!g_ActiveConfig.backend_info.bSupportsOversizedViewports) + { + ViewportCorrectionMatrix(s_viewportCorrection); + bProjectionChanged = true; + } } if (bProjectionChanged) { bProjectionChanged = false; - + float *rawProjection = xfregs.projection.rawProjection; switch(xfregs.projection.type) @@ -475,8 +506,7 @@ void VertexShaderManager::SetConstants() Matrix44::Set(mtxB, g_fProjectionMatrix); Matrix44::Multiply(mtxB, viewMtx, mtxA); // mtxA = projection x view Matrix44::Multiply(s_viewportCorrection, mtxA, mtxB); // mtxB = viewportCorrection x mtxA - - SetMultiVSConstant4fv(C_PROJECTION, 4, mtxB.data); + memcpy(constants.projection, mtxB.data, 4*16); } else { @@ -485,8 +515,9 @@ void VertexShaderManager::SetConstants() Matrix44 correctedMtx; Matrix44::Multiply(s_viewportCorrection, projMtx, correctedMtx); - SetMultiVSConstant4fv(C_PROJECTION, 4, correctedMtx.data); + memcpy(constants.projection, correctedMtx.data, 4*16); } + dirty = true; } } @@ -614,7 +645,7 @@ void VertexShaderManager::SetProjectionChanged() bProjectionChanged = true; } -void VertexShaderManager::SetMaterialColorChanged(int index) +void VertexShaderManager::SetMaterialColorChanged(int index, u32 color) { nMaterialsChanged |= (1 << index); } @@ -669,6 +700,8 @@ void VertexShaderManager::DoState(PointerWrap &p) p.Do(s_viewInvRotationMatrix); p.Do(s_fViewTranslationVector); p.Do(s_fViewRotation); + p.Do(constants); + p.Do(dirty); if (p.GetMode() == PointerWrap::MODE_READ) { diff --git a/Source/Core/VideoCommon/Src/VertexShaderManager.h b/Source/Core/VideoCommon/Src/VertexShaderManager.h index b4c5d3907c..93287ffe1e 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderManager.h +++ b/Source/Core/VideoCommon/Src/VertexShaderManager.h @@ -6,13 +6,12 @@ #define _VERTEXSHADERMANAGER_H #include "VertexShaderGen.h" +#include "ConstantManager.h" class PointerWrap; void UpdateProjectionHack(int iParams[], std::string sParams[]); -void UpdateViewportWithCorrection(); - // The non-API dependent parts. class VertexShaderManager { @@ -30,11 +29,14 @@ public: static void SetTexMatrixChangedB(u32 value); static void SetViewportChanged(); static void SetProjectionChanged(); - static void SetMaterialColorChanged(int index); + static void SetMaterialColorChanged(int index, u32 color); static void TranslateView(float x, float y, float z = 0.0f); static void RotateView(float x, float y); static void ResetView(); + + static VertexShaderConstants constants; + static bool dirty; }; #endif // _VERTEXSHADERMANAGER_H diff --git a/Source/Core/VideoCommon/Src/VideoBackendBase.cpp b/Source/Core/VideoCommon/Src/VideoBackendBase.cpp index 4769ede3a0..68ea7c9c35 100644 --- a/Source/Core/VideoCommon/Src/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/Src/VideoBackendBase.cpp @@ -6,13 +6,12 @@ // TODO: ugly #ifdef _WIN32 -#include "../../../Plugins/Plugin_VideoDX9/Src/VideoBackend.h" -#include "../../../Plugins/Plugin_VideoDX11/Src/VideoBackend.h" +#include "../../VideoBackends/D3D/Src/VideoBackend.h" #endif #if !defined(USE_GLES) || USE_GLES3 -#include "../../../Plugins/Plugin_VideoOGL/Src/VideoBackend.h" +#include "../../VideoBackends/OGL/Src/VideoBackend.h" #endif -#include "../../../Plugins/Plugin_VideoSoftware/Src/VideoBackend.h" +#include "../../VideoBackends/Software/Src/VideoBackend.h" std::vector g_available_video_backends; VideoBackend* g_video_backend = NULL; @@ -22,7 +21,7 @@ static VideoBackend* s_default_backend = NULL; #include // http://msdn.microsoft.com/en-us/library/ms725491.aspx -static bool IsGteVista() +static bool IsGteVista() { OSVERSIONINFOEX osvi; DWORDLONG dwlConditionMask = 0; @@ -41,9 +40,8 @@ void VideoBackend::PopulateList() { VideoBackend* backends[4] = { NULL }; - // D3D11 > OGL > D3D9 > SW + // D3D11 > OGL > SW #ifdef _WIN32 - g_available_video_backends.push_back(backends[2] = new DX9::VideoBackend); if (IsGteVista()) g_available_video_backends.push_back(backends[0] = new DX11::VideoBackend); #endif @@ -52,11 +50,11 @@ void VideoBackend::PopulateList() #endif g_available_video_backends.push_back(backends[3] = new SW::VideoSoftware); - for (int i = 0; i < 4; ++i) + for (auto& backend : backends) { - if (backends[i]) + if (backend) { - s_default_backend = g_video_backend = backends[i]; + s_default_backend = g_video_backend = backend; break; } } diff --git a/Source/Core/VideoCommon/Src/VideoBackendBase.h b/Source/Core/VideoCommon/Src/VideoBackendBase.h index 9c591d05a5..0e8c142e0e 100644 --- a/Source/Core/VideoCommon/Src/VideoBackendBase.h +++ b/Source/Core/VideoCommon/Src/VideoBackendBase.h @@ -55,7 +55,7 @@ struct SCPFifoStruct volatile u32 bFF_Breakpoint; volatile u32 CPCmdIdle; - volatile u32 CPReadIdle; + volatile u32 CPReadIdle; volatile u32 bFF_LoWatermarkInt; volatile u32 bFF_HiWatermarkInt; @@ -93,7 +93,7 @@ public: virtual void Video_ExitLoop() = 0; virtual void Video_Cleanup() = 0; // called from gl/d3d thread - virtual void Video_BeginField(u32, FieldType, u32, u32) = 0; + virtual void Video_BeginField(u32, u32, u32) = 0; virtual void Video_EndField() = 0; virtual u32 Video_AccessEFB(EFBAccessType, u32, u32, u32) = 0; @@ -128,14 +128,14 @@ public: // the implementation needs not do synchronization logic, because calls to it are surrounded by PauseAndLock now virtual void DoState(PointerWrap &p) = 0; - + virtual void CheckInvalidState() = 0; }; extern std::vector g_available_video_backends; extern VideoBackend* g_video_backend; -// inherited by dx9/dx11/ogl backends +// inherited by D3D/OGL backends class VideoBackendHardware : public VideoBackend { void RunLoop(bool enable); @@ -145,12 +145,12 @@ class VideoBackendHardware : public VideoBackend void Video_EnterLoop(); void Video_ExitLoop(); - void Video_BeginField(u32, FieldType, u32, u32); + void Video_BeginField(u32, u32, u32); void Video_EndField(); u32 Video_AccessEFB(EFBAccessType, u32, u32, u32); u32 Video_GetQueryResult(PerfQueryType type); - + void Video_AddMessage(const char* pstr, unsigned int milliseconds); void Video_ClearMessages(); bool Video_Screenshot(const char* filename); @@ -171,9 +171,9 @@ class VideoBackendHardware : public VideoBackend void PauseAndLock(bool doLock, bool unpauseOnUnlock=true); void DoState(PointerWrap &p); - + bool m_invalid; - + public: void CheckInvalidState(); diff --git a/Source/Core/VideoCommon/Src/VideoCommon.h b/Source/Core/VideoCommon/Src/VideoCommon.h index c85a6e382a..ef36b1fed6 100644 --- a/Source/Core/VideoCommon/Src/VideoCommon.h +++ b/Source/Core/VideoCommon/Src/VideoCommon.h @@ -85,11 +85,8 @@ struct TargetRectangle : public MathUtil::Rectangle typedef enum { API_OPENGL = 1, - API_D3D9_SM30 = 2, - API_D3D9_SM20 = 4, - API_D3D9 = 6, - API_D3D11 = 8, - API_NONE = 16 + API_D3D = 2, + API_NONE = 3 } API_TYPE; inline u32 RGBA8ToRGBA6ToRGBA8(u32 src) @@ -135,11 +132,5 @@ inline unsigned int GetPow2(unsigned int val) ++ret; return ret; } -struct s_svar -{ - const char *name; - const unsigned int reg; - const unsigned int size; -}; #endif // _VIDEOCOMMON_H diff --git a/Source/Core/VideoCommon/Src/VideoConfig.cpp b/Source/Core/VideoCommon/Src/VideoConfig.cpp index 6b6c796015..93840d7586 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.cpp +++ b/Source/Core/VideoCommon/Src/VideoConfig.cpp @@ -12,6 +12,7 @@ #include "Core.h" #include "Movie.h" #include "OnScreenDisplay.h" +#include "ConfigManager.h" VideoConfig g_Config; VideoConfig g_ActiveConfig; @@ -119,30 +120,43 @@ void VideoConfig::Load(const char *ini_file) OSD::AddMessage("Warning: Shader Debugging is enabled, performance will suffer heavily", 15000); } -void VideoConfig::GameIniLoad(const char *ini_file) +void VideoConfig::GameIniLoad() { - IniFile iniFile; - iniFile.Load(ini_file); + bool gfx_override_exists = false; - iniFile.GetIfExists("Video_Hardware", "VSync", &bVSync); + // XXX: Again, bad place to put OSD messages at (see delroth's comment above) + // XXX: This will add an OSD message for each projection hack value... meh +#define CHECK_SETTING(section, key, var) do { \ + decltype(var) temp = var; \ + if (iniFile.GetIfExists(section, key, &var) && var != temp) { \ + char buf[256]; \ + snprintf(buf, sizeof(buf), "Note: Option \"%s\" is overridden by game ini.", key); \ + OSD::AddMessage(buf, 7500); \ + gfx_override_exists = true; \ + } \ + } while (0) - iniFile.GetIfExists("Video_Settings", "wideScreenHack", &bWidescreenHack); - iniFile.GetIfExists("Video_Settings", "AspectRatio", &iAspectRatio); - iniFile.GetIfExists("Video_Settings", "Crop", &bCrop); - iniFile.GetIfExists("Video_Settings", "UseXFB", &bUseXFB); - iniFile.GetIfExists("Video_Settings", "UseRealXFB", &bUseRealXFB); - iniFile.GetIfExists("Video_Settings", "SafeTextureCacheColorSamples", &iSafeTextureCache_ColorSamples); - iniFile.GetIfExists("Video_Settings", "DLOptimize", &iCompileDLsLevel); - iniFile.GetIfExists("Video_Settings", "HiresTextures", &bHiresTextures); - iniFile.GetIfExists("Video_Settings", "AnaglyphStereo", &bAnaglyphStereo); - iniFile.GetIfExists("Video_Settings", "AnaglyphStereoSeparation", &iAnaglyphStereoSeparation); - iniFile.GetIfExists("Video_Settings", "AnaglyphFocalAngle", &iAnaglyphFocalAngle); - iniFile.GetIfExists("Video_Settings", "EnablePixelLighting", &bEnablePixelLighting); - iniFile.GetIfExists("Video_Settings", "HackedBufferUpload", &bHackedBufferUpload); - iniFile.GetIfExists("Video_Settings", "FastDepthCalc", &bFastDepthCalc); - iniFile.GetIfExists("Video_Settings", "MSAA", &iMultisampleMode); + IniFile iniFile = SConfig::GetInstance().m_LocalCoreStartupParameter.LoadGameIni(); + + CHECK_SETTING("Video_Hardware", "VSync", bVSync); + + CHECK_SETTING("Video_Settings", "wideScreenHack", bWidescreenHack); + CHECK_SETTING("Video_Settings", "AspectRatio", iAspectRatio); + CHECK_SETTING("Video_Settings", "Crop", bCrop); + CHECK_SETTING("Video_Settings", "UseXFB", bUseXFB); + CHECK_SETTING("Video_Settings", "UseRealXFB", bUseRealXFB); + CHECK_SETTING("Video_Settings", "SafeTextureCacheColorSamples", iSafeTextureCache_ColorSamples); + CHECK_SETTING("Video_Settings", "DLOptimize", iCompileDLsLevel); + CHECK_SETTING("Video_Settings", "HiresTextures", bHiresTextures); + CHECK_SETTING("Video_Settings", "AnaglyphStereo", bAnaglyphStereo); + CHECK_SETTING("Video_Settings", "AnaglyphStereoSeparation", iAnaglyphStereoSeparation); + CHECK_SETTING("Video_Settings", "AnaglyphFocalAngle", iAnaglyphFocalAngle); + CHECK_SETTING("Video_Settings", "EnablePixelLighting", bEnablePixelLighting); + CHECK_SETTING("Video_Settings", "HackedBufferUpload", bHackedBufferUpload); + CHECK_SETTING("Video_Settings", "FastDepthCalc", bFastDepthCalc); + CHECK_SETTING("Video_Settings", "MSAA", iMultisampleMode); int tmp = -9000; - iniFile.GetIfExists("Video_Settings", "EFBScale", &tmp); // integral + CHECK_SETTING("Video_Settings", "EFBScale", tmp); // integral if (tmp != -9000) { if (tmp != SCALE_FORCE_INTEGRAL) @@ -168,33 +182,36 @@ void VideoConfig::GameIniLoad(const char *ini_file) } } - iniFile.GetIfExists("Video_Settings", "DstAlphaPass", &bDstAlphaPass); - iniFile.GetIfExists("Video_Settings", "DisableFog", &bDisableFog); - iniFile.GetIfExists("Video_Settings", "EnableOpenCL", &bEnableOpenCL); - iniFile.GetIfExists("Video_Settings", "OMPDecoder", &bOMPDecoder); + CHECK_SETTING("Video_Settings", "DstAlphaPass", bDstAlphaPass); + CHECK_SETTING("Video_Settings", "DisableFog", bDisableFog); + CHECK_SETTING("Video_Settings", "EnableOpenCL", bEnableOpenCL); + CHECK_SETTING("Video_Settings", "OMPDecoder", bOMPDecoder); - iniFile.GetIfExists("Video_Enhancements", "ForceFiltering", &bForceFiltering); - iniFile.GetIfExists("Video_Enhancements", "MaxAnisotropy", &iMaxAnisotropy); // NOTE - this is x in (1 << x) - iniFile.GetIfExists("Video_Enhancements", "PostProcessingShader", &sPostProcessingShader); - iniFile.GetIfExists("Video_Enhancements", "Enable3dVision", &b3DVision); + CHECK_SETTING("Video_Enhancements", "ForceFiltering", bForceFiltering); + CHECK_SETTING("Video_Enhancements", "MaxAnisotropy", iMaxAnisotropy); // NOTE - this is x in (1 << x) + CHECK_SETTING("Video_Enhancements", "PostProcessingShader", sPostProcessingShader); + CHECK_SETTING("Video_Enhancements", "Enable3dVision", b3DVision); - iniFile.GetIfExists("Video_Hacks", "EFBAccessEnable", &bEFBAccessEnable); - iniFile.GetIfExists("Video_Hacks", "DlistCachingEnable", &bDlistCachingEnable); - iniFile.GetIfExists("Video_Hacks", "EFBCopyEnable", &bEFBCopyEnable); - iniFile.GetIfExists("Video_Hacks", "EFBToTextureEnable", &bCopyEFBToTexture); - iniFile.GetIfExists("Video_Hacks", "EFBScaledCopy", &bCopyEFBScaled); - iniFile.GetIfExists("Video_Hacks", "EFBCopyCacheEnable", &bEFBCopyCacheEnable); - iniFile.GetIfExists("Video_Hacks", "EFBEmulateFormatChanges", &bEFBEmulateFormatChanges); + CHECK_SETTING("Video_Hacks", "EFBAccessEnable", bEFBAccessEnable); + CHECK_SETTING("Video_Hacks", "DlistCachingEnable", bDlistCachingEnable); + CHECK_SETTING("Video_Hacks", "EFBCopyEnable", bEFBCopyEnable); + CHECK_SETTING("Video_Hacks", "EFBToTextureEnable", bCopyEFBToTexture); + CHECK_SETTING("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled); + CHECK_SETTING("Video_Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable); + CHECK_SETTING("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges); - iniFile.GetIfExists("Video", "ProjectionHack", &iPhackvalue[0]); - iniFile.GetIfExists("Video", "PH_SZNear", &iPhackvalue[1]); - iniFile.GetIfExists("Video", "PH_SZFar", &iPhackvalue[2]); - iniFile.GetIfExists("Video", "PH_ExtraParam", &iPhackvalue[3]); - iniFile.GetIfExists("Video", "PH_ZNear", &sPhackvalue[0]); - iniFile.GetIfExists("Video", "PH_ZFar", &sPhackvalue[1]); - iniFile.GetIfExists("Video", "ZTPSpeedupHack", &bZTPSpeedHack); - iniFile.GetIfExists("Video", "UseBBox", &bUseBBox); - iniFile.GetIfExists("Video", "PerfQueriesEnable", &bPerfQueriesEnable); + CHECK_SETTING("Video", "ProjectionHack", iPhackvalue[0]); + CHECK_SETTING("Video", "PH_SZNear", iPhackvalue[1]); + CHECK_SETTING("Video", "PH_SZFar", iPhackvalue[2]); + CHECK_SETTING("Video", "PH_ExtraParam", iPhackvalue[3]); + CHECK_SETTING("Video", "PH_ZNear", sPhackvalue[0]); + CHECK_SETTING("Video", "PH_ZFar", sPhackvalue[1]); + CHECK_SETTING("Video", "ZTPSpeedupHack", bZTPSpeedHack); + CHECK_SETTING("Video", "UseBBox", bUseBBox); + CHECK_SETTING("Video", "PerfQueriesEnable", bPerfQueriesEnable); + + if (gfx_override_exists) + OSD::AddMessage("Warning: Opening the graphics configuration will reset settings and might cause issues!", 10000); } void VideoConfig::VerifyValidity() @@ -261,7 +278,7 @@ void VideoConfig::Save(const char *ini_file) iniFile.Set("Hacks", "EFBAccessEnable", bEFBAccessEnable); iniFile.Set("Hacks", "DlistCachingEnable", bDlistCachingEnable); iniFile.Set("Hacks", "EFBCopyEnable", bEFBCopyEnable); - iniFile.Set("Hacks", "EFBToTextureEnable", bCopyEFBToTexture); + iniFile.Set("Hacks", "EFBToTextureEnable", bCopyEFBToTexture); iniFile.Set("Hacks", "EFBScaledCopy", bCopyEFBScaled); iniFile.Set("Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable); iniFile.Set("Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges); @@ -271,60 +288,6 @@ void VideoConfig::Save(const char *ini_file) iniFile.Save(ini_file); } -void VideoConfig::GameIniSave(const char* default_ini, const char* game_ini) -{ - // wxWidgets doesn't provide us with a nice way to change 3-state checkboxes into 2-state ones - // This would allow us to make the "default config" dialog layout to be 2-state based, but the - // "game config" layout to be 3-state based (with the 3rd state being "use default") - // Since we can't do that, we instead just save anything which differs from the default config - // TODO: Make this less ugly - - VideoConfig defCfg; - defCfg.Load(default_ini); - - IniFile iniFile; - iniFile.Load(game_ini); - - #define SET_IF_DIFFERS(section, key, member) { if ((member) != (defCfg.member)) iniFile.Set((section), (key), (member)); else iniFile.DeleteKey((section), (key)); } - - SET_IF_DIFFERS("Video_Hardware", "VSync", bVSync); - - SET_IF_DIFFERS("Video_Settings", "wideScreenHack", bWidescreenHack); - SET_IF_DIFFERS("Video_Settings", "AspectRatio", iAspectRatio); - SET_IF_DIFFERS("Video_Settings", "Crop", bCrop); - SET_IF_DIFFERS("Video_Settings", "UseXFB", bUseXFB); - SET_IF_DIFFERS("Video_Settings", "UseRealXFB", bUseRealXFB); - SET_IF_DIFFERS("Video_Settings", "SafeTextureCacheColorSamples", iSafeTextureCache_ColorSamples); - SET_IF_DIFFERS("Video_Settings", "DLOptimize", iCompileDLsLevel); - SET_IF_DIFFERS("Video_Settings", "HiresTextures", bHiresTextures); - SET_IF_DIFFERS("Video_Settings", "AnaglyphStereo", bAnaglyphStereo); - SET_IF_DIFFERS("Video_Settings", "AnaglyphStereoSeparation", iAnaglyphStereoSeparation); - SET_IF_DIFFERS("Video_Settings", "AnaglyphFocalAngle", iAnaglyphFocalAngle); - SET_IF_DIFFERS("Video_Settings", "EnablePixelLighting", bEnablePixelLighting); - SET_IF_DIFFERS("Video_Settings", "FastDepthCalc", bFastDepthCalc); - SET_IF_DIFFERS("Video_Settings", "MSAA", iMultisampleMode); - SET_IF_DIFFERS("Video_Settings", "EFBScale", iEFBScale); // integral - SET_IF_DIFFERS("Video_Settings", "DstAlphaPass", bDstAlphaPass); - SET_IF_DIFFERS("Video_Settings", "DisableFog", bDisableFog); - SET_IF_DIFFERS("Video_Settings", "EnableOpenCL", bEnableOpenCL); - SET_IF_DIFFERS("Video_Settings", "OMPDecoder", bOMPDecoder); - - SET_IF_DIFFERS("Video_Enhancements", "ForceFiltering", bForceFiltering); - SET_IF_DIFFERS("Video_Enhancements", "MaxAnisotropy", iMaxAnisotropy); // NOTE - this is x in (1 << x) - SET_IF_DIFFERS("Video_Enhancements", "PostProcessingShader", sPostProcessingShader); - SET_IF_DIFFERS("Video_Enhancements", "Enable3dVision", b3DVision); - - SET_IF_DIFFERS("Video_Hacks", "EFBAccessEnable", bEFBAccessEnable); - SET_IF_DIFFERS("Video_Hacks", "DlistCachingEnable", bDlistCachingEnable); - SET_IF_DIFFERS("Video_Hacks", "EFBCopyEnable", bEFBCopyEnable); - SET_IF_DIFFERS("Video_Hacks", "EFBToTextureEnable", bCopyEFBToTexture); - SET_IF_DIFFERS("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled); - SET_IF_DIFFERS("Video_Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable); - SET_IF_DIFFERS("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges); - - iniFile.Save(game_ini); -} - bool VideoConfig::IsVSync() { return Core::isTabPressed ? false : bVSync; diff --git a/Source/Core/VideoCommon/Src/VideoConfig.h b/Source/Core/VideoCommon/Src/VideoConfig.h index b856683595..4e597e6235 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.h +++ b/Source/Core/VideoCommon/Src/VideoConfig.h @@ -6,7 +6,7 @@ // IMPORTANT: UI etc should modify g_Config. Graphics code should read g_ActiveConfig. // The reason for this is to get rid of race conditions etc when the configuration // changes in the middle of a frame. This is done by copying g_Config to g_ActiveConfig -// at the start of every frame. Noone should ever change members of g_ActiveConfig +// at the start of every frame. Noone should ever change members of g_ActiveConfig // directly. #ifndef _VIDEO_CONFIG_H_ @@ -50,10 +50,9 @@ struct VideoConfig { VideoConfig(); void Load(const char *ini_file); - void GameIniLoad(const char *ini_file); + void GameIniLoad(); void VerifyValidity(); void Save(const char *ini_file); - void GameIniSave(const char* default_ini, const char* game_ini); void UpdateProjectionHack(); bool IsVSync(); @@ -113,7 +112,7 @@ struct VideoConfig bool bEFBCopyEnable; bool bEFBCopyCacheEnable; bool bEFBEmulateFormatChanges; - bool bCopyEFBToTexture; + bool bCopyEFBToTexture; bool bCopyEFBScaled; int iSafeTextureCache_ColorSamples; int iPhackvalue[4]; @@ -124,7 +123,6 @@ struct VideoConfig bool bEnablePixelLighting; bool bHackedBufferUpload; bool bFastDepthCalc; - int iLog; // CONF_ bits int iSaveTargetId; // TODO: Should be dropped @@ -143,18 +141,19 @@ struct VideoConfig { API_TYPE APIType; - std::vector Adapters; // for D3D9 and D3D11 + std::vector Adapters; // for D3D std::vector AAModes; std::vector PPShaders; // post-processing shaders - bool bUseRGBATextures; // used for D3D11 in TextureCache + bool bUseRGBATextures; // used for D3D in TextureCache bool bUseMinimalMipCount; bool bSupports3DVision; - bool bSupportsDualSourceBlend; // only supported by D3D11 and OpenGL + bool bSupportsDualSourceBlend; bool bSupportsFormatReinterpretation; bool bSupportsPixelLighting; bool bSupportsPrimitiveRestart; bool bSupportsSeparateAlphaFunction; + bool bSupportsOversizedViewports; bool bSupportsGLSLUBO; // needed by PixelShaderGen, so must stay in VideoCommon bool bSupportsEarlyZ; // needed by PixelShaderGen, so must stay in VideoCommon } backend_info; diff --git a/Source/Core/VideoCommon/Src/VideoState.cpp b/Source/Core/VideoCommon/Src/VideoState.cpp index 00d6eba320..9bfbeeaf52 100644 --- a/Source/Core/VideoCommon/Src/VideoState.cpp +++ b/Source/Core/VideoCommon/Src/VideoState.cpp @@ -38,7 +38,7 @@ static void DoState(PointerWrap &p) // Texture decoder p.DoArray(texMem, TMEM_SIZE); p.DoMarker("texMem"); - + // FIFO Fifo_DoState(p); p.DoMarker("Fifo"); diff --git a/Source/Core/VideoCommon/Src/XFMemory.h b/Source/Core/VideoCommon/Src/XFMemory.h index c350f67395..f681e15f50 100644 --- a/Source/Core/VideoCommon/Src/XFMemory.h +++ b/Source/Core/VideoCommon/Src/XFMemory.h @@ -139,7 +139,7 @@ union INVTXSPEC union TexMtxInfo { - struct + struct { u32 unknown : 1; u32 projection : 1; // XF_TEXPROJ_X @@ -154,7 +154,7 @@ union TexMtxInfo union PostMtxInfo { - struct + struct { u32 index : 6; // base row of dual transform matrix u32 unused : 2; @@ -194,14 +194,14 @@ union DualTexInfo struct Light { - u32 useless[3]; + u32 useless[3]; u32 color; // rgba float a0; // attenuation - float a1; - float a2; + float a1; + float a2; float k0; // k stuff - float k1; - float k2; + float k1; + float k2; union { diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index 98bef38f00..2b9e0d45a5 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -57,11 +57,11 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETCHAN1_AMBCOLOR: { u8 chan = address - XFMEM_SETCHAN0_AMBCOLOR; - if (xfregs.ambColor[chan] != newValue) + if (xfregs.ambColor[chan] != newValue) { VertexManager::Flush(); - VertexShaderManager::SetMaterialColorChanged(chan); - PixelShaderManager::SetMaterialColorChanged(chan); + VertexShaderManager::SetMaterialColorChanged(chan, newValue); + PixelShaderManager::SetMaterialColorChanged(chan, newValue); } break; } @@ -73,8 +73,8 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) if (xfregs.matColor[chan] != newValue) { VertexManager::Flush(); - VertexShaderManager::SetMaterialColorChanged(chan + 2); - PixelShaderManager::SetMaterialColorChanged(chan + 2); + VertexShaderManager::SetMaterialColorChanged(chan + 2, newValue); + PixelShaderManager::SetMaterialColorChanged(chan + 2, newValue); } break; } @@ -172,7 +172,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case 0x104d: case 0x104e: case 0x104f: - DEBUG_LOG(VIDEO, "Possible Normal Mtx XF reg?: %x=%x\n", address, newValue); + DEBUG_LOG(VIDEO, "Possible Normal Mtx XF reg?: %x=%x", address, newValue); break; case 0x1013: @@ -182,7 +182,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case 0x1017: default: - WARN_LOG(VIDEO, "Unknown XF Reg: %x=%x\n", address, newValue); + WARN_LOG(VIDEO, "Unknown XF Reg: %x=%x", address, newValue); break; } @@ -199,7 +199,7 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) // do not allow writes past registers if (baseAddress + transferSize > 0x1058) { - INFO_LOG(VIDEO, "XF load exceeds address space: %x %d bytes\n", baseAddress, transferSize); + INFO_LOG(VIDEO, "XF load exceeds address space: %x %d bytes", baseAddress, transferSize); if (baseAddress >= 0x1058) transferSize = 0; @@ -226,7 +226,7 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) { transferSize = 0; } - + XFMemWritten(xfMemTransferSize, xfMemBase); memcpy_gc(&xfmem[xfMemBase], pData, xfMemTransferSize * 4); @@ -235,9 +235,9 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) // write to XF regs if (transferSize > 0) - { + { XFRegWritten(transferSize, baseAddress, pData); - memcpy_gc((u32*)(&xfregs) + (baseAddress - 0x1000), pData, transferSize * 4); + memcpy_gc((u32*)(&xfregs) + (baseAddress - 0x1000), pData, transferSize * 4); } } diff --git a/Source/Core/VideoCommon/Src/memcpy_amd.cpp b/Source/Core/VideoCommon/Src/memcpy_amd.cpp index bd393560d4..a563b80886 100644 --- a/Source/Core/VideoCommon/Src/memcpy_amd.cpp +++ b/Source/Core/VideoCommon/Src/memcpy_amd.cpp @@ -60,7 +60,7 @@ MEMCPY_AMD.CPP // uses the software prefetch instruction to pre-read the data. // USE 64 * 1024 FOR THIS VALUE IF YOU'RE ALWAYS FILLING A "CLEAN CACHE" -#define BLOCK_PREFETCH_COPY infinity // no limit for movq/movntq w/block prefetch +#define BLOCK_PREFETCH_COPY infinity // no limit for movq/movntq w/block prefetch #define CACHEBLOCK 80h // number of 64-byte blocks (cache lines) for block prefetch // For the largest size blocks, a special technique called Block Prefetch // can be used to accelerate the read operations. Block Prefetch reads @@ -233,7 +233,7 @@ $memcpy_bp_3: add esi, 64 ; update source pointer movntq [edi ], mm0 ; write 64 bits, bypassing cache movntq [edi+ 8], mm1 ; note: movntq also prevents the CPU - movntq [edi+16], mm2 ; from READING the destination address + movntq [edi+16], mm2 ; from READING the destination address movntq [edi+24], mm3 ; into the cache, only to be over-written, movntq [edi+32], mm4 ; so that also helps performance movntq [edi+40], mm5 @@ -273,7 +273,7 @@ $memcpy_last_few: ; dword aligned from before movsd''s jz $memcpy_final ; no more, lets leave rep movsb ; the last 1, 2, or 3 bytes -$memcpy_final: +$memcpy_final: emms ; clean up the MMX state sfence ; flush the write buffer mov eax, [dest] ; ret value = destination pointer @@ -294,7 +294,7 @@ unsigned char memcmp_mmx(const void* src1, const void* src2, int cmpsize) mov ecx, cmpsize mov edx, src1 mov esi, src2 - + cmp ecx, 32 jl Done4 @@ -358,7 +358,7 @@ Cmp8: pand mm0, mm6 pand mm0, mm7 pmovmskb eax, mm0 - + // check if eq cmp eax, 0xff je Continue diff --git a/Source/Core/VideoCommon/Src/stdafx.cpp b/Source/Core/VideoCommon/Src/stdafx.cpp new file mode 100644 index 0000000000..b602b39925 --- /dev/null +++ b/Source/Core/VideoCommon/Src/stdafx.cpp @@ -0,0 +1,5 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "stdafx.h" diff --git a/Source/Plugins/Plugin_VideoDX11/Src/stdafx.h b/Source/Core/VideoCommon/Src/stdafx.h similarity index 69% rename from Source/Plugins/Plugin_VideoDX11/Src/stdafx.h rename to Source/Core/VideoCommon/Src/stdafx.h index 2431184aaf..bc5046304d 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/stdafx.h +++ b/Source/Core/VideoCommon/Src/stdafx.h @@ -3,10 +3,12 @@ // Refer to the license.txt file included. #pragma once + #define _WIN32_WINNT 0x501 #ifndef _WIN32_IE #define _WIN32_IE 0x0500 // Default value is 0x0400 #endif -#include -#include +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include diff --git a/Source/Core/VideoCommon/Src/x64DLCache.cpp b/Source/Core/VideoCommon/Src/x64DLCache.cpp index ae32ea5ea9..c2ad2a558c 100644 --- a/Source/Core/VideoCommon/Src/x64DLCache.cpp +++ b/Source/Core/VideoCommon/Src/x64DLCache.cpp @@ -4,7 +4,7 @@ // TODO: Handle cache-is-full condition :p -#include +#include #include "Common.h" #include "VideoCommon.h" @@ -58,7 +58,7 @@ struct ReferencedDataRegion ReferencedDataRegion* NextRegion; u32 size; u32 MustClean; - + int IntersectsMemoryRange(u8* range_address, u32 range_size) { @@ -78,7 +78,7 @@ struct CachedDisplayList uncachable(false), num_xf_reg(0), num_cp_reg(0), - num_bp_reg(0), + num_bp_reg(0), num_index_xf(0), num_draw_call(0), pass(DLPASS_ANALYZE), @@ -96,7 +96,7 @@ struct CachedDisplayList // Analytic data u32 num_xf_reg; u32 num_cp_reg; - u32 num_bp_reg; + u32 num_bp_reg; u32 num_index_xf; u32 num_draw_call; u32 pass; @@ -142,7 +142,7 @@ struct CachedDisplayList NewRegion = new ReferencedDataRegion; NewRegion->MustClean = false; NewRegion->size = Size; - NewRegion->start_address = RegionStartAddress; + NewRegion->start_address = RegionStartAddress; NewRegion->hash = GetHash64(RegionStartAddress, Size, DL_HASH_STEPS); InsertRegion(NewRegion); } @@ -216,7 +216,7 @@ inline u64 CreateVMapId(u32 VATUSED) return vmap_id; } -typedef std::map DLMap; +typedef std::unordered_map DLMap; struct VDlist { @@ -225,7 +225,7 @@ struct VDlist u32 count; }; -typedef std::map VDLMap; +typedef std::unordered_map VDLMap; static VDLMap dl_map; static u8* dlcode_cache; @@ -241,11 +241,11 @@ u32 AnalyzeAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) u8* startAddress = Memory::GetPointer(address); u32 num_xf_reg = 0; u32 num_cp_reg = 0; - u32 num_bp_reg = 0; + u32 num_bp_reg = 0; u32 num_index_xf = 0; u32 num_draw_call = 0; u32 result = 0; - + // Avoid the crash if Memory::GetPointer failed .. if (startAddress != 0) @@ -322,7 +322,7 @@ u32 AnalyzeAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) case GX_CMD_UNKNOWN_METRICS: // zelda 4 swords calls it and checks the metrics registers after that DEBUG_LOG(VIDEO, "GX 0x44: %08x", cmd_byte); break; - case GX_CMD_INVL_VC: // Invalidate Vertex Cache + case GX_CMD_INVL_VC: // Invalidate Vertex Cache DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); break; case GX_LOAD_BP_REG: //0x61 @@ -334,7 +334,7 @@ u32 AnalyzeAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) } break; - // draw primitives + // draw primitives default: if (cmd_byte & 0x80) { @@ -349,7 +349,7 @@ u32 AnalyzeAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) numVertices); num_draw_call++; const u32 tc[12] = { - g_VtxDesc.Position, g_VtxDesc.Normal, g_VtxDesc.Color0, g_VtxDesc.Color1, g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, + g_VtxDesc.Position, g_VtxDesc.Normal, g_VtxDesc.Color0, g_VtxDesc.Color1, g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, g_VtxDesc.Tex2Coord, g_VtxDesc.Tex3Coord, g_VtxDesc.Tex4Coord, g_VtxDesc.Tex5Coord, g_VtxDesc.Tex6Coord, (const u32)((g_VtxDesc.Hex >> 31) & 3) }; for(int i = 0; i < 12; i++) @@ -380,11 +380,11 @@ u32 AnalyzeAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) dl->num_index_xf = num_index_xf; dl->num_xf_reg = num_xf_reg; // reset to the old pointer - g_pVideoData = old_pVideoData; + g_pVideoData = old_pVideoData; return result; } -// The only sensible way to detect changes to vertex data is to convert several times +// The only sensible way to detect changes to vertex data is to convert several times // and hash the output. // Second pass - compile @@ -409,7 +409,7 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) emitter.AlignCode4(); dl->compiled_code = emitter.GetCodePtr(); - emitter.ABI_EmitPrologue(4); + emitter.ABI_PushAllCalleeSavedRegsAndAdjustStack(); while (g_pVideoData < end) { @@ -506,7 +506,7 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) // zelda 4 swords calls it and checks the metrics registers after that break; - case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); break; @@ -521,7 +521,7 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) } break; - // draw primitives + // draw primitives default: if (cmd_byte & 0x80) { @@ -543,13 +543,13 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) ReferencedDataRegion* NewRegion = new ReferencedDataRegion; NewRegion->MustClean = true; NewRegion->size = Vdatasize; - NewRegion->start_address = (u8*)new u8[Vdatasize]; + NewRegion->start_address = (u8*)new u8[Vdatasize]; NewRegion->hash = 0; dl->InsertRegion(NewRegion); memcpy(NewRegion->start_address, StartAddress, Vdatasize); emitter.ABI_CallFunctionCCCP((void *)&VertexLoaderManager::RunCompiledVertices, cmd_byte & GX_VAT_MASK, (cmd_byte & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT, numVertices, NewRegion->start_address); const u32 tc[12] = { - g_VtxDesc.Position, g_VtxDesc.Normal, g_VtxDesc.Color0, g_VtxDesc.Color1, g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, + g_VtxDesc.Position, g_VtxDesc.Normal, g_VtxDesc.Color0, g_VtxDesc.Color1, g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, g_VtxDesc.Tex2Coord, g_VtxDesc.Tex3Coord, g_VtxDesc.Tex4Coord, g_VtxDesc.Tex5Coord, g_VtxDesc.Tex6Coord, (const u32)((g_VtxDesc.Hex >> 31) & 3) }; for(int i = 0; i < 12; i++) @@ -572,7 +572,8 @@ void CompileAndRunDisplayList(u32 address, u32 size, CachedDisplayList *dl) break; } } - emitter.ABI_EmitEpilogue(4); + emitter.ABI_PopAllCalleeSavedRegsAndAdjustStack(); + emitter.RET(); INCSTAT(stats.numDListsCalled); INCSTAT(stats.thisFrame.numDListsCalled); Statistics::SwapDL(); @@ -591,11 +592,11 @@ void Init() void Shutdown() { Clear(); - FreeMemoryPages(dlcode_cache, DL_CODE_CACHE_SIZE); + FreeMemoryPages(dlcode_cache, DL_CODE_CACHE_SIZE); dlcode_cache = NULL; } -void Clear() +void Clear() { VDLMap::iterator iter = dl_map.begin(); while (iter != dl_map.end()) @@ -624,7 +625,7 @@ void ProgressiveCleanup() { VDlist &ParentEntry = iter->second; DLMap::iterator childiter = ParentEntry.dl_map.begin(); - while (childiter != ParentEntry.dl_map.end()) + while (childiter != ParentEntry.dl_map.end()) { CachedDisplayList &entry = childiter->second; int limit = 3600; @@ -711,9 +712,9 @@ bool HandleDisplayList(u32 address, u32 size) if (dl.check != CheckContextId) { dl.check = CheckContextId; - DlistChanged = !dl.CheckRegions() || dl.dl_hash != GetHash64(Memory::GetPointer(address), size, 0); + DlistChanged = !dl.CheckRegions() || dl.dl_hash != GetHash64(Memory::GetPointer(address), size, 0); } - if (DlistChanged) + if (DlistChanged) { dl.uncachable = true; dl.ClearRegions(); @@ -733,7 +734,7 @@ bool HandleDisplayList(u32 address, u32 size) INCSTAT(stats.numDListsCalled); INCSTAT(stats.thisFrame.numDListsCalled); - + Statistics::SwapDL(); g_pVideoData = old_datareader; break; @@ -743,7 +744,7 @@ bool HandleDisplayList(u32 address, u32 size) } DLCache::CachedDisplayList dl; - + u32 dlvatused = DLCache::AnalyzeAndRunDisplayList(address, size, &dl); dl.dl_hash = GetHash64(Memory::GetPointer(address), size,0); dl.pass = DLCache::DLPASS_COMPILE; @@ -753,14 +754,14 @@ bool HandleDisplayList(u32 address, u32 size) { DLCache::VDlist &vdl = Parentiter->second; vdl.dl_map[vhash] = dl; - vdl.VATUsed = dlvatused; + vdl.VATUsed = dlvatused; vdl.count++; } else { DLCache::VDlist vdl; vdl.dl_map[vhash] = dl; - vdl.VATUsed = dlvatused; + vdl.VATUsed = dlvatused; vdl.count = 1; DLCache::dl_map[dl_id] = vdl; } diff --git a/Source/Core/VideoCommon/Src/x64TextureDecoder.cpp b/Source/Core/VideoCommon/Src/x64TextureDecoder.cpp index e12b62d5a7..a02738479a 100644 --- a/Source/Core/VideoCommon/Src/x64TextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/x64TextureDecoder.cpp @@ -28,6 +28,12 @@ #include #endif +// This avoids a harmless warning from a system header in Clang; +// see http://llvm.org/bugs/show_bug.cgi?id=16093 +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wshadow" +#endif + bool TexFmt_Overlay_Enable=false; bool TexFmt_Overlay_Center=false; @@ -48,7 +54,7 @@ extern const unsigned char sfont_raw[][9*10]; int TexDecoder_GetTexelSizeInNibbles(int format) { switch (format & 0x3f) { - case GX_TF_I4: return 1; + case GX_TF_I4: return 1; case GX_TF_I8: return 2; case GX_TF_IA4: return 2; case GX_TF_IA8: return 4; @@ -59,7 +65,7 @@ int TexDecoder_GetTexelSizeInNibbles(int format) case GX_TF_C8: return 2; case GX_TF_C14X2: return 4; case GX_TF_CMPR: return 1; - case GX_CTF_R4: return 1; + case GX_CTF_R4: return 1; case GX_CTF_RA4: return 2; case GX_CTF_RA8: return 4; case GX_CTF_YUVA8: return 8; @@ -74,7 +80,7 @@ int TexDecoder_GetTexelSizeInNibbles(int format) case GX_TF_Z16: return 4; case GX_TF_Z24X8: return 8; - case GX_CTF_Z4: return 1; + case GX_CTF_Z4: return 1; case GX_CTF_Z8M: return 2; case GX_CTF_Z8L: return 2; case GX_CTF_Z16L: return 4; @@ -91,7 +97,7 @@ int TexDecoder_GetBlockWidthInTexels(u32 format) { switch (format) { - case GX_TF_I4: return 8; + case GX_TF_I4: return 8; case GX_TF_I8: return 8; case GX_TF_IA4: return 8; case GX_TF_IA8: return 4; @@ -128,7 +134,7 @@ int TexDecoder_GetBlockHeightInTexels(u32 format) { switch (format) { - case GX_TF_I4: return 8; + case GX_TF_I4: return 8; case GX_TF_I8: return 4; case GX_TF_IA4: return 4; case GX_TF_IA8: return 4; @@ -305,7 +311,7 @@ inline void decodebytesC4RGB565_To_RGBA(u32* dst, const u8* src, int tlutaddr) //inline void decodebytesC8(u32 *dst, const u8 *src, int numbytes, int tlutaddr, int tlutfmt) inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) -{ +{ u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { @@ -315,7 +321,7 @@ inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) } inline void decodebytesC8_5A3_To_RGBA32(u32 *dst, const u8 *src, int tlutaddr) -{ +{ u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { @@ -495,7 +501,7 @@ inline void decodebytesARGB8_4(u32 *dst, const u16 *src, const u16 *src2) // some unpack instruction x2: // ABABABABABABABAB 1212121212121212 -> // AB12AB12AB12AB12 AB12AB12AB12AB12 - // 2x pshufb-> + // 2x pshufb-> // 21BA21BA21BA21BA 21BA21BA21BA21BA // and we are done. } @@ -545,7 +551,7 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) int green3 = ((green2 - green1) >> 1) - ((green2 - green1) >> 3); int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3); colors[2] = makecol(red1 + red3, green1 + green3, blue1 + blue3, 255); - colors[3] = makecol(red2 - red3, green2 - green3, blue2 - blue3, 255); + colors[3] = makecol(red2 - red3, green2 - green3, blue2 - blue3, 255); } else { @@ -556,7 +562,7 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) } for (int y = 0; y < 4; y++) - { + { int val = src->lines[y]; for (int x = 0; x < 4; x++) { @@ -586,9 +592,9 @@ void decodeDXTBlockRGBA(u32 *dst, const DXTBlock *src, int pitch) { int blue3 = ((blue2 - blue1) >> 1) - ((blue2 - blue1) >> 3); int green3 = ((green2 - green1) >> 1) - ((green2 - green1) >> 3); - int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3); + int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3); colors[2] = makeRGBA(red1 + red3, green1 + green3, blue1 + blue3, 255); - colors[3] = makeRGBA(red2 - red3, green2 - green3, blue2 - blue3, 255); + colors[3] = makeRGBA(red2 - red3, green2 - green3, blue2 - blue3, 255); } else { @@ -599,7 +605,7 @@ void decodeDXTBlockRGBA(u32 *dst, const DXTBlock *src, int pitch) } for (int y = 0; y < 4; y++) - { + { int val = src->lines[y]; for (int x = 0; x < 4; x++) { @@ -653,7 +659,7 @@ PC_TexFormat GetPC_TexFormat(int texformat, int tlutfmt) return PC_TEX_FMT_IA4_AS_IA8; case GX_TF_IA8: return PC_TEX_FMT_IA8; - case GX_TF_C14X2: + case GX_TF_C14X2: return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_RGB565: return PC_TEX_FMT_RGB565; @@ -709,7 +715,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 8) for (int x = 0, yStep = (y / 8) * Wsteps8; x < width; x += 8, yStep++) for (int iy = 0, xStep = yStep * 8; iy < 8; iy++, xStep++) - decodebytesC4_5A3_To_BGRA32((u32*)dst + (y + iy) * width + x, src + 4 * xStep, tlutaddr); + decodebytesC4_5A3_To_BGRA32((u32*)dst + (y + iy) * width + x, src + 4 * xStep, tlutaddr); } else { @@ -717,7 +723,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 8) for (int x = 0, yStep = (y / 8) * Wsteps8; x < width; x += 8, yStep++) for (int iy = 0, xStep = yStep * 8; iy < 8; iy++, xStep++) - decodebytesC4_To_Raw16((u16*)dst + (y + iy) * width + x, src + 4 * xStep, tlutaddr); + decodebytesC4_To_Raw16((u16*)dst + (y + iy) * width + x, src + 4 * xStep, tlutaddr); } return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_I4: @@ -801,7 +807,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh } return PC_TEX_FMT_IA8; - case GX_TF_C14X2: + case GX_TF_C14X2: if (tlutfmt == 2) { // Special decoding is required for TLUT format 5A3 @@ -898,7 +904,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh { const u8* src2 = src + 64 * yStep; for (int iy = 0; iy < 4; iy++) - decodebytesARGB8_4((u32*)dst + (y+iy)*width + x, (u16*)src2 + 4 * iy, (u16*)src2 + 4 * iy + 16); + decodebytesARGB8_4((u32*)dst + (y+iy)*width + x, (u16*)src2 + 4 * iy, (u16*)src2 + 4 * iy + 16); } } } @@ -930,14 +936,14 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh { for (int x = 0, yStep = (y / 8) * Wsteps8; x < width; x += 8, yStep++) { - const u8* src2 = src + 4 * sizeof(DXTBlock) * yStep; + const u8* src2 = src + 4 * sizeof(DXTBlock) * yStep; decodeDXTBlock((u32*)dst + y * width + x, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); decodeDXTBlock((u32*)dst + y * width + x + 4, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); decodeDXTBlock((u32*)dst + (y + 4) * width + x, (DXTBlock*)src2, width); src2 += sizeof(DXTBlock); - decodeDXTBlock((u32*)dst + (y + 4) * width + x + 4, (DXTBlock*)src2, width); + decodeDXTBlock((u32*)dst + (y + 4) * width + x + 4, (DXTBlock*)src2, width); } } #endif @@ -985,7 +991,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he for (int x = 0, yStep = (y / 8) * Wsteps8; x < width; x += 8,yStep++) for (int iy = 0, xStep = 8 * yStep; iy < 8; iy++,xStep++) decodebytesC4IA8_To_RGBA(dst + (y + iy) * width + x, src + 4 * xStep, tlutaddr); - + } else { @@ -1134,7 +1140,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he _mm_storeu_si128(quaddst, rgba0); _mm_storeu_si128(quaddst+1, rgba1); } - + } else #endif // JSD optimized with SSE2 intrinsics. @@ -1218,7 +1224,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he _mm_storeu_si128(quaddst, rgba6); // Store (hhhh gggg ffff eeee) out: _mm_storeu_si128(quaddst+1, rgba7); - + } } } @@ -1240,7 +1246,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he for (int x = 0, yStep = (y / 4) * Wsteps8; x < width; x += 8, yStep++) for (int iy = 0, xStep = 4 * yStep; iy < 4; iy++, xStep++) decodebytesC8IA8_To_RGBA(dst + (y + iy) * width + x, src + 8 * xStep, tlutaddr); - + } else { @@ -1248,7 +1254,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he for (int y = 0; y < height; y += 4) for (int x = 0, yStep = (y / 4) * Wsteps8; x < width; x += 8, yStep++) for (int iy = 0, xStep = 4 * yStep; iy < 4; iy++, xStep++) - decodebytesC8RGB565_To_RGBA(dst + (y + iy) * width + x, src + 8 * xStep, tlutaddr); + decodebytesC8RGB565_To_RGBA(dst + (y + iy) * width + x, src + 8 * xStep, tlutaddr); } break; @@ -1398,7 +1404,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he // 0b_gggBBBbb_RRRrrGGg_gggBBBbb_RRRrrGGg >> 3 [32] = // 0b_000gggBB_BbbRRRrr_GGggggBB_BbbRRRrr & - // 0b_00000000_00000000_11111100_00000000 = + // 0b_00000000_00000000_11111100_00000000 = // 0b_00000000_00000000_GGgggg00_00000000 const __m128i gtmp = _mm_srli_epi32(c0, 3); const __m128i g0 = _mm_and_si128(gtmp, kMaskG0); @@ -1454,7 +1460,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he for (int iy = 0, xStep = 4 * yStep; iy < 4; iy++, xStep++) { u32 *newdst = dst+(y+iy)*width+x; - const __m128i mask = _mm_set_epi8(128,128,6,7,128,128,4,5,128,128,2,3,128,128,0,1); + const __m128i mask = _mm_set_epi8(-128,-128,6,7,-128,-128,4,5,-128,-128,2,3,-128,-128,0,1); const __m128i valV = _mm_shuffle_epi8(_mm_loadl_epi64((const __m128i*)(src + 8 * xStep)),mask); int cmp = _mm_movemask_epi8(valV); //MSB: 0x2 = val0; 0x20=val1; 0x200 = val2; 0x2000=val3 if ((cmp&0x2222)==0x2222) // SSSE3 case #1: all 4 pixels are in RGB555 and alpha = 0xFF. @@ -1778,7 +1784,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he _mm_storeu_si128(dst128, rgba10); dst128 = (__m128i*)( dst + (y + 3) * width + x ); _mm_storeu_si128(dst128, rgba11); - } + } } } break; @@ -2011,7 +2017,7 @@ PC_TexFormat TexDecoder_Decode_RGBA(u32 * dst, const u8 * src, int width, int he assert( memcmp(&(tmp0[3]), &dst32[(width * 3)], 16) == 0 ); assert( memcmp(&(tmp1[3]), &dst32[(width * 3) + 4], 16) == 0 ); #endif - } + } } } break; @@ -2061,7 +2067,7 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in { int xcnt = 0; int nchar = sfont_map[(int)*fmt]; - + const unsigned char *ptr = sfont_raw[nchar]; // each char is up to 9x10 for (int x = 0; x < 9;x++) @@ -2097,7 +2103,7 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in dtp[(y + yoff)*width + x + xoff] = ptr[x] ? 0xFFFF : 0x0000; break; } - default: + default: case PC_TEX_FMT_BGRA32: { int *dtp = (int*)dst; @@ -2120,7 +2126,7 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth, int texformat, int tlutaddr, int tlutfmt) { /* General formula for computing texture offset - // + // u16 sBlk = s / blockWidth; u16 tBlk = t / blockHeight; u16 widthBlks = (width / blockWidth) + 1; @@ -2262,7 +2268,7 @@ void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth *((u32*)dst) = decodeIA8Swapped(*valAddr); } break; - case GX_TF_C14X2: + case GX_TF_C14X2: { u16 sBlk = s >> 2; u16 tBlk = t >> 2; @@ -2488,696 +2494,696 @@ const unsigned char sfont_map[] = { const unsigned char sfont_raw[][9*10] = { { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, },{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + },{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x78, 0x78, 0x78, }, }; diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj b/Source/Core/VideoCommon/VideoCommon.vcxproj index c5896af1a6..fa7ef921ae 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -27,153 +19,29 @@ - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} - VideoCommon + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3} - + StaticLibrary + v120 + Unicode + + true - Unicode - - StaticLibrary - true - Unicode - - - StaticLibrary + false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - false - - - true - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - - - true - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - false - - - true - true - true - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - false - - - true - true - true - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - true - - - true - true - true - - - - - - ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - - - true - true - true - - - @@ -202,6 +70,9 @@ + + Create + @@ -230,8 +101,8 @@ - + @@ -254,6 +125,7 @@ + @@ -266,44 +138,34 @@ - + - - + {aa862e5e-a993-497a-b6a0-0e8e94b10050} - true - true - false - true - false + + + {4c9f135b-a85e-430c-bad4-4c67ef5fc12c} - {8544f1ff-f2a5-42d8-a568-c56b5d3b4181} - true - true - false - true - false + {b441cc62-877e-4b3f-93e0-0de80544f705} + + + {ff213b23-2c26-4214-9f88-85271e557e87} - {c87a4178-44f6-49b2-b7aa-c79af1b8c534} - true - true - false - true - false + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} - + \ No newline at end of file diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters index 3f864b0e7e..7d9534f4eb 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters @@ -1,95 +1,38 @@  + + + {23908fac-d3fd-4fa5-a9b4-87b3bafc7bd9} + + + {2baa29c2-a528-4981-abcb-e0842c311f63} + + + {f32547ad-f1c1-4e47-9ded-c07f66de2100} + + + {6a88e4a0-754c-43df-98e6-405c99cd2ca7} + + + {7ce5076f-4e85-4f4d-b3f0-8c88267b8b2d} + + + {8c17624b-2ccb-4ee4-9ec0-593f8f3d1dd2} + + + {8edd4982-cce6-406e-9029-f7a6449311b1} + + + {cefc166b-1f5e-4e96-863d-1448e14c0741} + + + - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Util - - - Util - - - Util - - - Util - - - Util - - - Util - - - Util - - - Shader Managers - - - Shader Managers - - - Shader Generators - - - Shader Generators - - - Shader Generators - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Decoding\OpenCL - - - Decoding\OpenCL - - - Decoding - - - Decoding - Base @@ -114,119 +57,109 @@ Base - - Util + + Decoding\OpenCL + + + Decoding\OpenCL + + + Decoding + + + Decoding Decoding + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + + + Shader Generators + + + Shader Generators + + + Shader Generators + + + Shader Managers + + + Shader Managers + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + Vertex Loading + + - + - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Vertex Loading - - - Util - - - Util - - - Util - - - Util - - - Util - - - Util - - - Util - - - Util - - - Shader Managers - - - Shader Managers - - - Shader Generators - - - Shader Generators - - - Shader Generators - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Register Sections - - - Decoding\OpenCL - - - Decoding\OpenCL - - - Decoding - - - Decoding - - - Decoding - Base @@ -251,46 +184,114 @@ Base + + Decoding\OpenCL + + + Decoding\OpenCL + + + Decoding + + + Decoding + + + Decoding + + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + + + Register Sections + Shader Generators - - Util + + Shader Generators Shader Generators + + Shader Generators + + + Shader Generators + + + Shader Managers + + + Shader Managers + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Util + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + + Vertex Loading + + - - - Decoding\OpenCL - + - - - {7520d766-5816-4e85-8068-3744850718d9} - - - {ba650466-ae40-45ba-89f4-c3d4919d1f31} - - - {9b5b4ba1-ee30-4cdc-86b2-2c6b15bb47f5} - - - {a833e7b4-e178-4ed6-9692-ebb05e2196b4} - - - {b7c0a925-0c89-4a92-9f07-8b60bd44a8bb} - - - {2e8e6b8a-0d42-48a7-8a44-085830c6d033} - - - {448cb71f-7edd-4a5a-ab31-a6505f5a5820} - - - {e2a527a2-ccc8-4ab8-a93e-dd2628c0f3b6} - - - + \ No newline at end of file diff --git a/Source/DSPSpy/dsp_interface.cpp b/Source/DSPSpy/dsp_interface.cpp index 5a935f12ef..b6a56acacb 100644 --- a/Source/DSPSpy/dsp_interface.cpp +++ b/Source/DSPSpy/dsp_interface.cpp @@ -23,7 +23,7 @@ void IDSP::SendTask(void *addr, u16 iram_addr, u16 len, u16 start) // iram_addr dsp addr 4byte aligned (2 DSP words) // len block length in bytes multiple of 4 (wtf? if you want to fill whole iram, you need 8191) // (8191 % 4 = 3) wtffff - // start dsp iram entry point + // start dsp iram entry point while (CheckMailTo()); SendMailTo(0x80F3A001); while (CheckMailTo()); diff --git a/Source/DSPSpy/dsp_interface.h b/Source/DSPSpy/dsp_interface.h index 03ce9c4f60..e1842ccedc 100644 --- a/Source/DSPSpy/dsp_interface.h +++ b/Source/DSPSpy/dsp_interface.h @@ -36,7 +36,7 @@ class IDSP { public: virtual ~IDSP() {} - + virtual void Init() = 0; virtual void Reset() = 0; virtual u32 CheckMailTo() = 0; diff --git a/Source/DSPSpy/main_spy.cpp b/Source/DSPSpy/main_spy.cpp index aba2007852..0000eacb7c 100644 --- a/Source/DSPSpy/main_spy.cpp +++ b/Source/DSPSpy/main_spy.cpp @@ -21,7 +21,7 @@ // It's very unpolished though // Use Dolphin's dsptool to generate a new dsp_code.h. // Originally written by duddie and modified by FIRES. Then further modified by ector. - + #include #include #include @@ -75,7 +75,7 @@ u16 *dspbufC; u32 *dspbufU; u16 dspreg_in[32] = { - 0x0410, 0x0510, 0x0610, 0x0710, 0x0810, 0x0910, 0x0a10, 0x0b10, + 0x0410, 0x0510, 0x0610, 0x0710, 0x0810, 0x0910, 0x0a10, 0x0b10, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0855, 0x0966, 0x0a77, 0x0b88, 0x0014, 0xfff5, 0x00ff, 0x2200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0004, 0x8000, 0x000C, 0x0007, 0x0008, 0x0009, 0x000a, @@ -84,22 +84,22 @@ u16 dspreg_in[32] = { /* ttt ? u16 dspreg_in[32] = { -0x0e4c, 0x03c0, 0x0bd9, 0x06a3, 0x0c06, 0x0240, 0x0010, 0x0ecc, +0x0e4c, 0x03c0, 0x0bd9, 0x06a3, 0x0c06, 0x0240, 0x0010, 0x0ecc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0322, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ff, 0x1b41, 0x0000, 0x0040, 0x00ff, 0x0000, 0x1000, 0x96cc, 0x0000, 0x0000, 0x3fc0, 0x96cc, 0x0000, 0x0000, }; */ -// if i set bit 0x4000 of SR my tests crashes :( +// if i set bit 0x4000 of SR my tests crashes :( /* // zelda 0x00da u16 dspreg_in[32] = { -0x0a50, 0x0ca2, 0x04f8, 0x0ab0, 0x8039, 0x0000, 0x0000, 0x0000, +0x0a50, 0x0ca2, 0x04f8, 0x0ab0, 0x8039, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03d1, 0x0000, 0x0418, 0x0002, // r08 must have a value ... no idea why (ector: it's the looped addressing regs) 0x0000, 0x0000, 0x00ff, 0x1804, 0xdb70, 0x4ddb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xde6d, 0x0000, 0x0000, 0x0000, 0x004e, -};*/ +};*/ u16 dspreg_out[1000][32]; @@ -470,16 +470,16 @@ void dump_all_ucodes(bool fastmode) sprintf(filename, "sd:/dsp_dump_all.bin"); FILE *f2 = fopen(filename, "ab"); - if (fastmode == false) + if (fastmode == false) { // Then write microcode dump to file sprintf(filename, "sd:/dsp_dump%d.bin", UCodeToDump); FILE *f = fopen(filename, "wb"); - if (f) + if (f) { // First write initial regs written = fwrite(dspreg_in, 1, 32 * 2, f); - + // Then write all the dumps. written += fwrite(dspreg_out, 1, dsp_steps * 32 * 2, f); fclose(f); diff --git a/Source/DSPSpy/mem_dump.h b/Source/DSPSpy/mem_dump.h index b3768f28ca..389c9f27c0 100644 --- a/Source/DSPSpy/mem_dump.h +++ b/Source/DSPSpy/mem_dump.h @@ -17,516 +17,516 @@ unsigned int mem_dump[] __attribute__ ((aligned (64))) = { - 0x0c3966ad, 0x0d46ffdf, 0x0b396696, 0x0e5fffd8, - 0x0a446669, 0x0f83ffd0, 0x095a6626, 0x10b4ffc8, - 0x087d65cd, 0x11f0ffbf, 0x07ab655e, 0x1338ffb6, - 0x06e464d9, 0x148cffac, 0x0628643f, 0x15ebffa1, - 0x0577638f, 0x1756ff96, 0x04d162cb, 0x18cbff8a, - 0x043561f3, 0x1a4cff7e, 0x03a46106, 0x1bd7ff71, - 0x031c6007, 0x1d6cff64, 0x029f5ef5, 0x1f0bff56, - 0x022a5dd0, 0x20b3ff48, 0x01be5c9a, 0x2264ff3a, - 0x015b5b53, 0x241eff2c, 0x010159fc, 0x25e0ff1e, - 0x00ae5896, 0x27a9ff10, 0x00635720, 0x297aff02, - 0x001f559d, 0x2b50fef4, 0xffe2540d, 0x2d2cfee8, - 0xffac5270, 0x2f0dfedb, 0xff7c50c7, 0x30f3fed0, - 0xff534f14, 0x32dcfec6, 0xff2e4d57, 0x34c8febd, - 0xff0f4b91, 0x36b6feb6, 0xfef549c2, 0x38a5feb0, - 0xfedf47ed, 0x3a95feac, 0xfece4611, 0x3c85feab, - 0xfec04430, 0x3e74feac, 0xfeb6424a, 0x4060feaf, - 0xfeaf4060, 0x424afeb6, 0xfeac3e74, 0x4430fec0, - 0xfeab3c85, 0x4611fece, 0xfeac3a95, 0x47edfedf, - 0xfeb038a5, 0x49c2fef5, 0xfeb636b6, 0x4b91ff0f, - 0xfebd34c8, 0x4d57ff2e, 0xfec632dc, 0x4f14ff53, - 0xfed030f3, 0x50c7ff7c, 0xfedb2f0d, 0x5270ffac, - 0xfee82d2c, 0x540dffe2, 0xfef42b50, 0x559d001f, - 0xff02297a, 0x57200063, 0xff1027a9, 0x589600ae, - 0xff1e25e0, 0x59fc0101, 0xff2c241e, 0x5b53015b, - 0xff3a2264, 0x5c9a01be, 0xff4820b3, 0x5dd0022a, - 0xff561f0b, 0x5ef5029f, 0xff641d6c, 0x6007031c, - 0xff711bd7, 0x610603a4, 0xff7e1a4c, 0x61f30435, - 0xff8a18cb, 0x62cb04d1, 0xff961756, 0x638f0577, - 0xffa115eb, 0x643f0628, 0xffac148c, 0x64d906e4, - 0xffb61338, 0x655e07ab, 0xffbf11f0, 0x65cd087d, - 0xffc810b4, 0x6626095a, 0xffd00f83, 0x66690a44, - 0xffd80e5f, 0x66960b39, 0xffdf0d46, 0x66ad0c39, - 0x00000c8b, 0x18f82527, 0x30fb3c56, 0x471c5133, - 0x5a8262f1, 0x6a6d70e2, 0x76417a7c, 0x7d897f61, - 0x7fff7f61, 0x7d897a7c, 0x764170e2, 0x6a6d62f1, - 0x5a825133, 0x471c3c56, 0x30fb2527, 0x18f80c8b, - 0x0000f375, 0xe708dad9, 0xcf05c3aa, 0xb8e4aecd, - 0xa57e9d0f, 0x95938f1e, 0x89bf8584, 0x8277809f, - 0x8001809f, 0x82778584, 0x89bf8f1e, 0x95939d0f, - 0xa57eaecd, 0xb8e4c3aa, 0xcf05dad9, 0xe708f375, - 0x000007ff, 0x0fff17ff, 0x1fff27ff, 0x2fff37ff, - 0x3fff47ff, 0x4fff57ff, 0x5fff67ff, 0x6fff77ff, - 0x7fff7800, 0x70006800, 0x60005800, 0x50004800, - 0x40003800, 0x30002800, 0x20001800, 0x10000800, - 0x0000f801, 0xf001e801, 0xe001d801, 0xd001c801, - 0xc001b801, 0xb001a801, 0xa0019801, 0x90018801, - 0x80018800, 0x90009800, 0xa000a800, 0xb000b800, - 0xc000c800, 0xd000d800, 0xe000e800, 0xf000f800, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x682e469b, 0x25080375, 0xe1e2c04f, 0x9ebc7d29, - 0x5b963a03, 0x1870f6dd, 0xd54ab3b7, 0x92247091, - 0x4efe2d6b, 0x0bd8ea45, 0xc8b2a71f, 0x858c63f9, - 0x426620d3, 0xff40ddad, 0xbc1a9a87, 0x78f45761, - 0x35ce143b, 0xf2a8d115, 0xaf828def, 0x6c5c4ac9, - 0x293607a3, 0xe610c47d, 0xa2ea8157, 0x5fc43e31, - 0x1c9efb0b, 0xd978b7e5, 0x965274bf, 0x532c3199, - 0x1006ee73, 0xcce0ab4d, 0x89ba6827, 0x46942501, - 0x00000001, 0x00020003, 0x00040005, 0x00060007, - 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, - 0x00000001, 0x00020003, 0x00040005, 0x00060007, - 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, - 0x00000001, 0x00020003, 0x00040005, 0x00060007, - 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, - 0x00000001, 0x00020003, 0x00040005, 0x00060007, - 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, - 0x5a825b9c, 0x5cb35dc7, 0x5ed75fe3, 0x60eb61f0, - 0x62f163ee, 0x64e865dd, 0x66cf67bc, 0x68a6698b, - 0x6a6d6b4a, 0x6c236cf8, 0x6dc96e96, 0x6f5e7022, - 0x70e2719d, 0x72547307, 0x73b5745f, 0x750475a5, - 0x764176d8, 0x776b77fa, 0x78847909, 0x79897a05, - 0x7a7c7aee, 0x7b5c7bc5, 0x7c297c88, 0x7ce37d39, - 0x7d897dd5, 0x7e1d7e5f, 0x7e9c7ed5, 0x7f097f37, - 0x7f617f86, 0x7fa67fc1, 0x7fd87fe9, 0x7ff57ffd, - 0x00058100, 0x0040806a, 0x19e08039, 0x8f208039, - 0x8ee0806a, 0x79e00002, 0x8d00000a, 0x803ea5e0, - 0x00038207, 0x5ffb8069, 0xffa0806a, 0x04000003, - 0x82075ffb, 0x806a0860, 0x806a0cc0, 0x00038207, - 0x5ffb806a, 0x1120806a, 0x15800003, 0x82075ffb, - 0x8069ffa0, 0x806a0400, 0x00038207, 0x5ffb806a, - 0x0860806a, 0x0cc00003, 0x82075ffb, 0x806a1120, - 0x806a1580, 0x00038207, 0x5ffb8069, 0xffa0806a, - 0x04000003, 0x82075ffb, 0x806a0860, 0x806a0cc0, - 0x00038207, 0x5ffb806a, 0x1120806a, 0x15800003, - 0x82075ffb, 0x8069ffa0, 0x806a0400, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x08000000, 0x00000800, 0x04000400, - 0x1000f800, 0x0e00fa00, 0x0c00fc00, 0x1200f600, - 0x1068f738, 0x12c0f704, 0x1400f400, 0x0800f800, - 0x0400fc00, 0xfc000400, 0xfc000000, 0xf8000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000002, 0x00400004, 0x00075ffb, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00400000, - 0x02d602d6, 0x00000000, 0x00400006, 0x82075ffb, - 0x8069ffa0, 0x806a0400, 0x80398ee0, 0x806a79e0, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x803ea5e0, 0x000a0001, - 0x00000000, 0x00000000, 0x00010000, 0x00000000, - 0x806a19e0, 0x80398f20, 0x80398ee0, 0x806a79e0, - 0x806a02c0, 0x806a0720, 0x00000000, 0x5ffb0000, - 0x00010038, 0x80758e80, 0x0d000000, 0x0d604000, - 0x00000000, 0x00000000, 0x00000000, 0x58000000, - 0x03a80f40, 0x03e80000, 0x003d003d, 0x003d003d, - 0x00010020, 0x80754380, 0x0d002000, 0x0d600000, - 0x00000000, 0x00000000, 0x00000000, 0x3fff0000, - 0x00010020, 0x80755780, 0x0d000000, 0x0d602000, - 0x00000000, 0x00000000, 0x00000000, 0x3fff0000, - 0x00010038, 0x80756b80, 0x0d004000, 0x0d600000, - 0x00000000, 0x00000000, 0x00000000, 0x58000000, - 0x00010038, 0x80758e80, 0x0d000000, 0x0d604000, - 0x00000000, 0x00000000, 0x00000000, 0x58000000, - 0x00000000, 0x00000000, 0x00000000, 0x58000000, - 0x00501568, 0xffff0030, 0x00107f00, 0x08000100, - 0x0000002d, 0xabb80500, 0xffff0000, 0xff06f000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x82407fff, 0x7dbf843f, 0x00000000, 0x00000000, - 0xb23b7fff, 0x4dc4d808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0c3966ad, 0x0d46ffdf, 0x0b396696, 0x0e5fffd8, + 0x0a446669, 0x0f83ffd0, 0x095a6626, 0x10b4ffc8, + 0x087d65cd, 0x11f0ffbf, 0x07ab655e, 0x1338ffb6, + 0x06e464d9, 0x148cffac, 0x0628643f, 0x15ebffa1, + 0x0577638f, 0x1756ff96, 0x04d162cb, 0x18cbff8a, + 0x043561f3, 0x1a4cff7e, 0x03a46106, 0x1bd7ff71, + 0x031c6007, 0x1d6cff64, 0x029f5ef5, 0x1f0bff56, + 0x022a5dd0, 0x20b3ff48, 0x01be5c9a, 0x2264ff3a, + 0x015b5b53, 0x241eff2c, 0x010159fc, 0x25e0ff1e, + 0x00ae5896, 0x27a9ff10, 0x00635720, 0x297aff02, + 0x001f559d, 0x2b50fef4, 0xffe2540d, 0x2d2cfee8, + 0xffac5270, 0x2f0dfedb, 0xff7c50c7, 0x30f3fed0, + 0xff534f14, 0x32dcfec6, 0xff2e4d57, 0x34c8febd, + 0xff0f4b91, 0x36b6feb6, 0xfef549c2, 0x38a5feb0, + 0xfedf47ed, 0x3a95feac, 0xfece4611, 0x3c85feab, + 0xfec04430, 0x3e74feac, 0xfeb6424a, 0x4060feaf, + 0xfeaf4060, 0x424afeb6, 0xfeac3e74, 0x4430fec0, + 0xfeab3c85, 0x4611fece, 0xfeac3a95, 0x47edfedf, + 0xfeb038a5, 0x49c2fef5, 0xfeb636b6, 0x4b91ff0f, + 0xfebd34c8, 0x4d57ff2e, 0xfec632dc, 0x4f14ff53, + 0xfed030f3, 0x50c7ff7c, 0xfedb2f0d, 0x5270ffac, + 0xfee82d2c, 0x540dffe2, 0xfef42b50, 0x559d001f, + 0xff02297a, 0x57200063, 0xff1027a9, 0x589600ae, + 0xff1e25e0, 0x59fc0101, 0xff2c241e, 0x5b53015b, + 0xff3a2264, 0x5c9a01be, 0xff4820b3, 0x5dd0022a, + 0xff561f0b, 0x5ef5029f, 0xff641d6c, 0x6007031c, + 0xff711bd7, 0x610603a4, 0xff7e1a4c, 0x61f30435, + 0xff8a18cb, 0x62cb04d1, 0xff961756, 0x638f0577, + 0xffa115eb, 0x643f0628, 0xffac148c, 0x64d906e4, + 0xffb61338, 0x655e07ab, 0xffbf11f0, 0x65cd087d, + 0xffc810b4, 0x6626095a, 0xffd00f83, 0x66690a44, + 0xffd80e5f, 0x66960b39, 0xffdf0d46, 0x66ad0c39, + 0x00000c8b, 0x18f82527, 0x30fb3c56, 0x471c5133, + 0x5a8262f1, 0x6a6d70e2, 0x76417a7c, 0x7d897f61, + 0x7fff7f61, 0x7d897a7c, 0x764170e2, 0x6a6d62f1, + 0x5a825133, 0x471c3c56, 0x30fb2527, 0x18f80c8b, + 0x0000f375, 0xe708dad9, 0xcf05c3aa, 0xb8e4aecd, + 0xa57e9d0f, 0x95938f1e, 0x89bf8584, 0x8277809f, + 0x8001809f, 0x82778584, 0x89bf8f1e, 0x95939d0f, + 0xa57eaecd, 0xb8e4c3aa, 0xcf05dad9, 0xe708f375, + 0x000007ff, 0x0fff17ff, 0x1fff27ff, 0x2fff37ff, + 0x3fff47ff, 0x4fff57ff, 0x5fff67ff, 0x6fff77ff, + 0x7fff7800, 0x70006800, 0x60005800, 0x50004800, + 0x40003800, 0x30002800, 0x20001800, 0x10000800, + 0x0000f801, 0xf001e801, 0xe001d801, 0xd001c801, + 0xc001b801, 0xb001a801, 0xa0019801, 0x90018801, + 0x80018800, 0x90009800, 0xa000a800, 0xb000b800, + 0xc000c800, 0xd000d800, 0xe000e800, 0xf000f800, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x682e469b, 0x25080375, 0xe1e2c04f, 0x9ebc7d29, + 0x5b963a03, 0x1870f6dd, 0xd54ab3b7, 0x92247091, + 0x4efe2d6b, 0x0bd8ea45, 0xc8b2a71f, 0x858c63f9, + 0x426620d3, 0xff40ddad, 0xbc1a9a87, 0x78f45761, + 0x35ce143b, 0xf2a8d115, 0xaf828def, 0x6c5c4ac9, + 0x293607a3, 0xe610c47d, 0xa2ea8157, 0x5fc43e31, + 0x1c9efb0b, 0xd978b7e5, 0x965274bf, 0x532c3199, + 0x1006ee73, 0xcce0ab4d, 0x89ba6827, 0x46942501, + 0x00000001, 0x00020003, 0x00040005, 0x00060007, + 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, + 0x00000001, 0x00020003, 0x00040005, 0x00060007, + 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, + 0x00000001, 0x00020003, 0x00040005, 0x00060007, + 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, + 0x00000001, 0x00020003, 0x00040005, 0x00060007, + 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, + 0x5a825b9c, 0x5cb35dc7, 0x5ed75fe3, 0x60eb61f0, + 0x62f163ee, 0x64e865dd, 0x66cf67bc, 0x68a6698b, + 0x6a6d6b4a, 0x6c236cf8, 0x6dc96e96, 0x6f5e7022, + 0x70e2719d, 0x72547307, 0x73b5745f, 0x750475a5, + 0x764176d8, 0x776b77fa, 0x78847909, 0x79897a05, + 0x7a7c7aee, 0x7b5c7bc5, 0x7c297c88, 0x7ce37d39, + 0x7d897dd5, 0x7e1d7e5f, 0x7e9c7ed5, 0x7f097f37, + 0x7f617f86, 0x7fa67fc1, 0x7fd87fe9, 0x7ff57ffd, + 0x00058100, 0x0040806a, 0x19e08039, 0x8f208039, + 0x8ee0806a, 0x79e00002, 0x8d00000a, 0x803ea5e0, + 0x00038207, 0x5ffb8069, 0xffa0806a, 0x04000003, + 0x82075ffb, 0x806a0860, 0x806a0cc0, 0x00038207, + 0x5ffb806a, 0x1120806a, 0x15800003, 0x82075ffb, + 0x8069ffa0, 0x806a0400, 0x00038207, 0x5ffb806a, + 0x0860806a, 0x0cc00003, 0x82075ffb, 0x806a1120, + 0x806a1580, 0x00038207, 0x5ffb8069, 0xffa0806a, + 0x04000003, 0x82075ffb, 0x806a0860, 0x806a0cc0, + 0x00038207, 0x5ffb806a, 0x1120806a, 0x15800003, + 0x82075ffb, 0x8069ffa0, 0x806a0400, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x08000000, 0x00000800, 0x04000400, + 0x1000f800, 0x0e00fa00, 0x0c00fc00, 0x1200f600, + 0x1068f738, 0x12c0f704, 0x1400f400, 0x0800f800, + 0x0400fc00, 0xfc000400, 0xfc000000, 0xf8000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00400004, 0x00075ffb, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00400000, + 0x02d602d6, 0x00000000, 0x00400006, 0x82075ffb, + 0x8069ffa0, 0x806a0400, 0x80398ee0, 0x806a79e0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x803ea5e0, 0x000a0001, + 0x00000000, 0x00000000, 0x00010000, 0x00000000, + 0x806a19e0, 0x80398f20, 0x80398ee0, 0x806a79e0, + 0x806a02c0, 0x806a0720, 0x00000000, 0x5ffb0000, + 0x00010038, 0x80758e80, 0x0d000000, 0x0d604000, + 0x00000000, 0x00000000, 0x00000000, 0x58000000, + 0x03a80f40, 0x03e80000, 0x003d003d, 0x003d003d, + 0x00010020, 0x80754380, 0x0d002000, 0x0d600000, + 0x00000000, 0x00000000, 0x00000000, 0x3fff0000, + 0x00010020, 0x80755780, 0x0d000000, 0x0d602000, + 0x00000000, 0x00000000, 0x00000000, 0x3fff0000, + 0x00010038, 0x80756b80, 0x0d004000, 0x0d600000, + 0x00000000, 0x00000000, 0x00000000, 0x58000000, + 0x00010038, 0x80758e80, 0x0d000000, 0x0d604000, + 0x00000000, 0x00000000, 0x00000000, 0x58000000, + 0x00000000, 0x00000000, 0x00000000, 0x58000000, + 0x00501568, 0xffff0030, 0x00107f00, 0x08000100, + 0x0000002d, 0xabb80500, 0xffff0000, 0xff06f000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x82407fff, 0x7dbf843f, 0x00000000, 0x00000000, + 0xb23b7fff, 0x4dc4d808, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, }; diff --git a/Source/DSPTool/DSPTool.vcxproj b/Source/DSPTool/DSPTool.vcxproj index e72c055233..386ea0ce61 100644 --- a/Source/DSPTool/DSPTool.vcxproj +++ b/Source/DSPTool/DSPTool.vcxproj @@ -1,14 +1,6 @@  - + - - DebugFast - Win32 - - - DebugFast - x64 - Debug Win32 @@ -28,164 +20,28 @@ {1970D175-3DE8-4738-942A-4D98D1CDBF64} - DSPTool - Win32Proj - - Application - Unicode - false - - + Application + v120 Unicode - - Application - Unicode - false + + true - - Application - Unicode - false - - - Application - Unicode - - - Application - Unicode - false + + false - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - ../../Binary/$(Platform)/ - ../../Binary/$(Platform)/ - ../../Binary/$(Platform)/ - ../../Binary/$(Platform)/ - ../../Binary/$(Platform)/ - ../../Binary/$(Platform)/ - $(ProjectName)DF - $(ProjectName)DF - $(ProjectName)D - $(ProjectName)D - - - - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - - - winmm.lib;%(AdditionalDependencies) - Console - - - - - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - - - winmm.lib;%(AdditionalDependencies) - Console - - - - - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - - - winmm.lib;%(AdditionalDependencies) - Console - - - - - /MP %(AdditionalOptions) - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - - - winmm.lib;%(AdditionalDependencies) - Console - - - - - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - - - winmm.lib;%(AdditionalDependencies) - Console - - - - - ../Core/Core/Src;../Core/Common/Src;%(AdditionalIncludeDirectories) - - - + winmm.lib;%(AdditionalDependencies) Console @@ -200,25 +56,26 @@ + + + - {c87a4178-44f6-49b2-b7aa-c79af1b8c534} - true - true - false - true - false + {2e6c348c-c75c-4d94-8d1e-9c1fcbf3efe4} - {8c60e805-0da5-4e25-8f84-038db504bb0d} - true - true - false - true - false + {e54cf649-140e-4255-81a5-30a673c1fb36} + + + + + + + + \ No newline at end of file diff --git a/Source/DSPTool/DSPTool.vcxproj.filters b/Source/DSPTool/DSPTool.vcxproj.filters index c5b78da492..f3000e3495 100644 --- a/Source/DSPTool/DSPTool.vcxproj.filters +++ b/Source/DSPTool/DSPTool.vcxproj.filters @@ -1,5 +1,5 @@  - + {0b70242b-1d98-432f-a60e-d4ca0674852e} @@ -22,4 +22,7 @@ + + + \ No newline at end of file diff --git a/Source/DSPTool/Src/DSPTool.cpp b/Source/DSPTool/Src/DSPTool.cpp index 78335d3026..5a776be558 100644 --- a/Source/DSPTool/Src/DSPTool.cpp +++ b/Source/DSPTool/Src/DSPTool.cpp @@ -11,6 +11,7 @@ // Stub out the dsplib host stuff, since this is just a simple cmdline tools. u8 DSPHost_ReadHostMemory(u32 addr) { return 0; } void DSPHost_WriteHostMemory(u8 value, u32 addr) {} +void DSPHost_OSD_AddMessage(const std::string& str, u32 ms) {} bool DSPHost_OnThread() { return false; } bool DSPHost_Wii() { return false; } void DSPHost_CodeLoaded(const u8 *ptr, int size) {} @@ -72,8 +73,8 @@ bool SuperTrip(const char *asm_code) std::string text2; Disassemble(code1, true, &text1); Disassemble(code2, true, &text2); - File::WriteStringToFile(true, text1, "code1.txt"); - File::WriteStringToFile(true, text2, "code2.txt"); + File::WriteStringToFile(text1, "code1.txt"); + File::WriteStringToFile(text2, "code2.txt"); */ return true; } @@ -126,7 +127,7 @@ void RunAsmTests() /* std::vector code; std::string text_orig; - File::ReadFileToString(false, "testdata/dsp_test.S", &text_orig); + File::ReadFileToString("testdata/dsp_test.S", &text_orig); if (!Assemble(text_orig.c_str(), &code)) { printf("SuperTrip: First assembly failed\n"); @@ -168,15 +169,15 @@ void RunAsmTests() RoundTrip(rand_code); - if (File::ReadFileToString(true, "C:/devkitPro/examples/wii/asndlib/dsptest/dsp_test.ds", &dsp_test)) + if (File::ReadFileToString("C:/devkitPro/examples/wii/asndlib/dsptest/dsp_test.ds", &dsp_test)) SuperTrip(dsp_test.c_str()); - //.File::ReadFileToString(true, "C:/devkitPro/trunk/libogc/libasnd/dsp_mixer/dsp_mixer.s", &dsp_test); + //.File::ReadFileToString("C:/devkitPro/trunk/libogc/libasnd/dsp_mixer/dsp_mixer.s", &dsp_test); // This is CLOSE to working. Sorry about the local path btw. This is preliminary code. */ - + std::string dsp_test; - if (File::ReadFileToString(true, "Testdata/dsp_test.s", dsp_test)) + if (File::ReadFileToString("Testdata/dsp_test.s", dsp_test)) fail = fail || !SuperTrip(dsp_test.c_str()); if (!fail) printf("All passed!\n"); @@ -213,7 +214,7 @@ int main(int argc, const char *argv[]) printf("-ps : Print results of DSPSpy register dump (disable SR output)\n"); printf("-pm : Print results of DSPSpy register dump (convert PROD values)\n"); printf("-psm : Print results of DSPSpy register dump (convert PROD values/disable SR output)\n"); - + return 0; } @@ -227,7 +228,7 @@ int main(int argc, const char *argv[]) std::string output_header_name; std::string output_name; - bool disassemble = false, compare = false, multiple = false, outputSize = false, + bool disassemble = false, compare = false, multiple = false, outputSize = false, force = false, print_results = false, print_results_prodhack = false, print_results_srhack = false; for (int i = 1; i < argc; i++) { @@ -260,7 +261,7 @@ int main(int argc, const char *argv[]) print_results_srhack = true; print_results_prodhack = true; } - else + else { if (!input_name.empty()) { @@ -288,9 +289,9 @@ int main(int argc, const char *argv[]) // Two binary inputs, let's diff. std::string binary_code; std::vector code1, code2; - File::ReadFileToString(false, input_name.c_str(), binary_code); + File::ReadFileToString(input_name.c_str(), binary_code); BinaryStringBEToCode(binary_code, code1); - File::ReadFileToString(false, output_name.c_str(), binary_code); + File::ReadFileToString(output_name.c_str(), binary_code); BinaryStringBEToCode(binary_code, code2); Compare(code1, code2); return 0; @@ -301,7 +302,7 @@ int main(int argc, const char *argv[]) std::string dumpfile, results; std::vector reg_vector; - File::ReadFileToString(false, input_name.c_str(), dumpfile); + File::ReadFileToString(input_name.c_str(), dumpfile); BinaryStringBEToCode(dumpfile, reg_vector); results.append("Start:\n"); @@ -325,17 +326,17 @@ int main(int argc, const char *argv[]) { if ((reg >= 0x0c) && (reg <= 0x0f)) continue; if (print_results_srhack && (reg == 0x13)) continue; - + if ((print_results_prodhack) && (reg >= 0x15) && (reg <= 0x17)) { switch (reg) { case 0x15: //DSP_REG_PRODM last_reg = reg_vector.at((step*32-32)+reg) + reg_vector.at((step*32-32)+reg+2); - current_reg = reg_vector.at(step*32+reg) + reg_vector.at(step*32+reg+2); + current_reg = reg_vector.at(step*32+reg) + reg_vector.at(step*32+reg+2); break; case 0x16: //DSP_REG_PRODH - htemp = ((reg_vector.at(step*32+reg-1) + reg_vector.at(step*32+reg+1))&~0xffff)>>16; + htemp = ((reg_vector.at(step*32+reg-1) + reg_vector.at(step*32+reg+1))&~0xffff)>>16; current_reg = (u8)(reg_vector.at(step*32+reg) + htemp); - htemp = ((reg_vector.at(step*32-32+reg-1) + reg_vector.at(step*32-32+reg+1))&~0xffff)>>16; + htemp = ((reg_vector.at(step*32-32+reg-1) + reg_vector.at(step*32-32+reg+1))&~0xffff)>>16; last_reg = (u8)(reg_vector.at(step*32-32+reg) + htemp); break; case 0x17: //DSP_REG_PRODM2 @@ -362,7 +363,7 @@ int main(int argc, const char *argv[]) } if (!output_name.empty()) - File::WriteStringToFile(true, results, output_name.c_str()); + File::WriteStringToFile(results, output_name.c_str()); else printf("%s", results.c_str()); return 0; @@ -377,16 +378,16 @@ int main(int argc, const char *argv[]) } std::string binary_code; std::vector code; - File::ReadFileToString(false, input_name.c_str(), binary_code); + File::ReadFileToString(input_name.c_str(), binary_code); BinaryStringBEToCode(binary_code, code); std::string text; Disassemble(code, true, text); if (!output_name.empty()) - File::WriteStringToFile(true, text, output_name.c_str()); + File::WriteStringToFile(text, output_name.c_str()); else printf("%s", text.c_str()); } - else + else { if (input_name.empty()) { @@ -394,9 +395,9 @@ int main(int argc, const char *argv[]) return 1; } std::string source; - if (File::ReadFileToString(true, input_name.c_str(), source)) + if (File::ReadFileToString(input_name.c_str(), source)) { - if(multiple) + if(multiple) { // When specifying a list of files we must compile a header // (we can't assemble multiple files to one binary) @@ -408,8 +409,8 @@ int main(int argc, const char *argv[]) size_t lastPos = 0, pos = 0; source.append("\n"); - - while((pos = source.find('\n', lastPos)) != std::string::npos) + + while((pos = source.find('\n', lastPos)) != std::string::npos) { std::string temp = source.substr(lastPos, pos - lastPos); if(!temp.empty()) @@ -419,26 +420,26 @@ int main(int argc, const char *argv[]) lines = (int)files.size(); - if(lines == 0) + if(lines == 0) { printf("ERROR: Must specify at least one file\n"); return 1; } - + codes = new std::vector[lines]; - for (int i = 0; i < lines; i++) + for (int i = 0; i < lines; i++) { - if (!File::ReadFileToString(true, files[i].c_str(), currentSource)) + if (!File::ReadFileToString(files[i].c_str(), currentSource)) { printf("ERROR reading %s, skipping...\n", files[i].c_str()); lines--; } - else + else { - if (!Assemble(currentSource.c_str(), codes[i], force)) + if (!Assemble(currentSource.c_str(), codes[i], force)) { - printf("Assemble: Assembly of %s failed due to errors\n", + printf("Assemble: Assembly of %s failed due to errors\n", files[i].c_str()); lines--; } @@ -447,10 +448,10 @@ int main(int argc, const char *argv[]) } } } - + CodesToHeader(codes, &files, lines, output_header_name.c_str(), header); - File::WriteStringToFile(true, header, (output_header_name + ".h").c_str()); + File::WriteStringToFile(header, (output_header_name + ".h").c_str()); delete[] codes; } @@ -466,18 +467,18 @@ int main(int argc, const char *argv[]) if (outputSize) { printf("%s: %d\n", input_name.c_str(), (int)code.size()); } - + if (!output_name.empty()) { std::string binary_code; CodeToBinaryStringBE(code, binary_code); - File::WriteStringToFile(false, binary_code, output_name.c_str()); + File::WriteStringToFile(binary_code, output_name.c_str()); } if (!output_header_name.empty()) { std::string header; CodeToHeader(code, input_name, output_header_name.c_str(), header); - File::WriteStringToFile(true, header, (output_header_name + ".h").c_str()); + File::WriteStringToFile(header, (output_header_name + ".h").c_str()); } } } diff --git a/Source/Dolphin_2010.sln b/Source/Dolphin_2010.sln deleted file mode 100644 index 7706250490..0000000000 --- a/Source/Dolphin_2010.sln +++ /dev/null @@ -1,430 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dolphin", "Core\DolphinWX\Dolphin.vcxproj", "{1B099EF8-6F87-47A2-A3E7-898A24584F49}" - ProjectSection(ProjectDependencies) = postProject - {8C60E805-0DA5-4E25-8F84-038DB504BB0D} = {8C60E805-0DA5-4E25-8F84-038DB504BB0D} - {69F00340-5C3D-449F-9A80-958435C6CF06} = {69F00340-5C3D-449F-9A80-958435C6CF06} - {9E9DA440-E9AD-413C-B648-91030E792211} = {9E9DA440-E9AD-413C-B648-91030E792211} - {93D73454-2512-424E-9CDA-4BB357FE13DD} = {93D73454-2512-424E-9CDA-4BB357FE13DD} - {B6398059-EBB6-4C34-B547-95F365B71FF4} = {B6398059-EBB6-4C34-B547-95F365B71FF4} - {AA862E5E-A993-497A-B6A0-0E8E94B10050} = {AA862E5E-A993-497A-B6A0-0E8E94B10050} - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F} = {B39AC394-5DB5-4DA9-9D98-09D46CA3701F} - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Core\Common\Common.vcxproj", "{C87A4178-44F6-49B2-B7AA-C79AF1B8C534}" - ProjectSection(ProjectDependencies) = postProject - {69F00340-5C3D-449F-9A80-958435C6CF06} = {69F00340-5C3D-449F-9A80-958435C6CF06} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioCommon", "Core\AudioCommon\AudioCommon.vcxproj", "{37D007BD-D66C-4EAF-B56C-BD1AAC340A05}" - ProjectSection(ProjectDependencies) = postProject - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SOIL", "..\Externals\SOIL\SOIL.vcxproj", "{8544F1FF-F2A5-42D8-A568-C56B5D3B4181}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SFML_Network", "..\Externals\SFML\build\vc2010\SFML_Network.vcxproj", "{93D73454-2512-424E-9CDA-4BB357FE13DD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LZO", "..\Externals\LZO\LZO.vcxproj", "{D8890B98-26F7-4CFF-BBFB-B95F371B5F20}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\Externals\zlib\zlib.vcxproj", "{3E1339F5-9311-4122-9442-369702E8FCAD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoCommon", "Core\VideoCommon\VideoCommon.vcxproj", "{3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}" - ProjectSection(ProjectDependencies) = postProject - {AA862E5E-A993-497A-B6A0-0E8E94B10050} = {AA862E5E-A993-497A-B6A0-0E8E94B10050} - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181} = {8544F1FF-F2A5-42D8-A568-C56B5D3B4181} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CLRun", "..\Externals\CLRun\clrun\CLRun.vcxproj", "{AA862E5E-A993-497A-B6A0-0E8E94B10050}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcxproj", "{8C60E805-0DA5-4E25-8F84-038DB504BB0D}" - ProjectSection(ProjectDependencies) = postProject - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6} = {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6} - {93D73454-2512-424E-9CDA-4BB357FE13DD} = {93D73454-2512-424E-9CDA-4BB357FE13DD} - {B6398059-EBB6-4C34-B547-95F365B71FF4} = {B6398059-EBB6-4C34-B547-95F365B71FF4} - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F} = {B39AC394-5DB5-4DA9-9D98-09D46CA3701F} - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20} = {D8890B98-26F7-4CFF-BBFB-B95F371B5F20} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bochs_disasm", "..\Externals\Bochs_disasm\Bochs_disasm.vcxproj", "{CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcxproj", "{B6398059-EBB6-4C34-B547-95F365B71FF4}" - ProjectSection(ProjectDependencies) = postProject - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - {3E1339F5-9311-4122-9442-369702E8FCAD} = {3E1339F5-9311-4122-9442-369702E8FCAD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoDX9", "Plugins\Plugin_VideoDX9\Plugin_VideoDX9.vcxproj", "{DC7D7AF4-CE47-49E8-8B63-265CB6233A49}" - ProjectSection(ProjectDependencies) = postProject - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} = {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoDX11", "Plugins\Plugin_VideoDX11\Plugin_VideoDX11.vcxproj", "{9A4C733C-BADE-4AC6-B58A-6E274395E90E}" - ProjectSection(ProjectDependencies) = postProject - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} = {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoOGL", "Plugins\Plugin_VideoOGL\Plugin_VideoOGL.vcxproj", "{1909CD2D-1707-456F-86CA-0DF42A727C99}" - ProjectSection(ProjectDependencies) = postProject - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} = {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF} - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoSoftware", "Plugins\Plugin_VideoSoftware\Plugin_VideoSoftware.vcxproj", "{9E9DA440-E9AD-413C-B648-91030E792211}" - ProjectSection(ProjectDependencies) = postProject - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InputCommon", "Core\InputCommon\InputCommon.vcxproj", "{B39AC394-5DB5-4DA9-9D98-09D46CA3701F}" - ProjectSection(ProjectDependencies) = postProject - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Languages", "..\Languages\Languages.vcxproj", "{0B8D0A82-C520-46BA-849D-3BB8F637EE0C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DSPTool", "DSPTool\DSPTool.vcxproj", "{1970D175-3DE8-4738-942A-4D98D1CDBF64}" - ProjectSection(ProjectDependencies) = postProject - {8C60E805-0DA5-4E25-8F84-038DB504BB0D} = {8C60E805-0DA5-4E25-8F84-038DB504BB0D} - {69F00340-5C3D-449F-9A80-958435C6CF06} = {69F00340-5C3D-449F-9A80-958435C6CF06} - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} = {C87A4178-44F6-49B2-B7AA-C79AF1B8C534} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxWidgets", "..\Externals\wxWidgets3\build\msw\wx_base.vcxproj", "{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}" - ProjectSection(ProjectDependencies) = postProject - {01573C36-AC6E-49F6-94BA-572517EB9740} = {01573C36-AC6E-49F6-94BA-572517EB9740} - {3E1339F5-9311-4122-9442-369702E8FCAD} = {3E1339F5-9311-4122-9442-369702E8FCAD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "png", "..\Externals\libpng\png\png.vcxproj", "{01573C36-AC6E-49F6-94BA-572517EB9740}" - ProjectSection(ProjectDependencies) = postProject - {3E1339F5-9311-4122-9442-369702E8FCAD} = {3E1339F5-9311-4122-9442-369702E8FCAD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCMRevGen", "Core\Common\SVNRevGen.vcxproj", "{69F00340-5C3D-449F-9A80-958435C6CF06}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\Externals\SoundTouch\SoundTouch.vcxproj", "{68A5DD20-7057-448B-8FE0-B6AC8D205509}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests", "UnitTests\UnitTests.vcxproj", "{40C636FA-B5BF-4D67-ABC8-376B524A7551}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc", "..\Externals\miniupnpc\miniupnpc.vcxproj", "{A680190D-0764-485B-9CF3-A82C5EDD5715}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - DebugFast|Win32 = DebugFast|Win32 - DebugFast|x64 = DebugFast|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Debug|Win32.ActiveCfg = Debug|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Debug|Win32.Build.0 = Debug|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Debug|x64.ActiveCfg = Debug|x64 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Debug|x64.Build.0 = Debug|x64 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.DebugFast|x64.Build.0 = DebugFast|x64 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Release|Win32.ActiveCfg = Release|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Release|Win32.Build.0 = Release|Win32 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Release|x64.ActiveCfg = Release|x64 - {1B099EF8-6F87-47A2-A3E7-898A24584F49}.Release|x64.Build.0 = Release|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Debug|Win32.ActiveCfg = Debug|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Debug|Win32.Build.0 = Debug|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Debug|x64.ActiveCfg = Debug|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Debug|x64.Build.0 = Debug|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.DebugFast|x64.Build.0 = DebugFast|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Release|Win32.ActiveCfg = Release|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Release|Win32.Build.0 = Release|Win32 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Release|x64.ActiveCfg = Release|x64 - {C87A4178-44F6-49B2-B7AA-C79AF1B8C534}.Release|x64.Build.0 = Release|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Debug|Win32.ActiveCfg = Debug|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Debug|Win32.Build.0 = Debug|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Debug|x64.ActiveCfg = Debug|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Debug|x64.Build.0 = Debug|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.DebugFast|x64.Build.0 = DebugFast|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Release|Win32.ActiveCfg = Release|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Release|Win32.Build.0 = Release|Win32 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Release|x64.ActiveCfg = Release|x64 - {37D007BD-D66C-4EAF-B56C-BD1AAC340A05}.Release|x64.Build.0 = Release|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Debug|Win32.ActiveCfg = Debug|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Debug|Win32.Build.0 = Debug|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Debug|x64.ActiveCfg = Debug|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Debug|x64.Build.0 = Debug|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.DebugFast|x64.Build.0 = DebugFast|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Release|Win32.ActiveCfg = Release|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Release|Win32.Build.0 = Release|Win32 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Release|x64.ActiveCfg = Release|x64 - {8544F1FF-F2A5-42D8-A568-C56B5D3B4181}.Release|x64.Build.0 = Release|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|Win32.ActiveCfg = Debug|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|Win32.Build.0 = Debug|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.ActiveCfg = Debug|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.Build.0 = Debug|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.DebugFast|x64.Build.0 = DebugFast|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|Win32.ActiveCfg = Release|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|Win32.Build.0 = Release|Win32 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.ActiveCfg = Release|x64 - {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.Build.0 = Release|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Debug|Win32.ActiveCfg = Debug|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Debug|Win32.Build.0 = Debug|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Debug|x64.ActiveCfg = Debug|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Debug|x64.Build.0 = Debug|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.DebugFast|x64.Build.0 = DebugFast|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Release|Win32.ActiveCfg = Release|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Release|Win32.Build.0 = Release|Win32 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Release|x64.ActiveCfg = Release|x64 - {D8890B98-26F7-4CFF-BBFB-B95F371B5F20}.Release|x64.Build.0 = Release|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Debug|Win32.Build.0 = Debug|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Debug|x64.ActiveCfg = Debug|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Debug|x64.Build.0 = Debug|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.DebugFast|x64.Build.0 = DebugFast|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Release|Win32.ActiveCfg = Release|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Release|Win32.Build.0 = Release|Win32 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Release|x64.ActiveCfg = Release|x64 - {3E1339F5-9311-4122-9442-369702E8FCAD}.Release|x64.Build.0 = Release|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Debug|Win32.Build.0 = Debug|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Debug|x64.ActiveCfg = Debug|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Debug|x64.Build.0 = Debug|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.DebugFast|x64.Build.0 = DebugFast|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Release|Win32.ActiveCfg = Release|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Release|Win32.Build.0 = Release|Win32 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Release|x64.ActiveCfg = Release|x64 - {3E5C4E02-1BA9-4776-BDBE-E3F91FFA34CF}.Release|x64.Build.0 = Release|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|Win32.ActiveCfg = Debug|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|Win32.Build.0 = Debug|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|x64.ActiveCfg = Debug|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|x64.Build.0 = Debug|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.DebugFast|x64.Build.0 = DebugFast|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|Win32.ActiveCfg = Release|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|Win32.Build.0 = Release|Win32 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|x64.ActiveCfg = Release|x64 - {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|x64.Build.0 = Release|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Debug|Win32.ActiveCfg = Debug|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Debug|Win32.Build.0 = Debug|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Debug|x64.ActiveCfg = Debug|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Debug|x64.Build.0 = Debug|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.DebugFast|x64.Build.0 = DebugFast|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Release|Win32.ActiveCfg = Release|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Release|Win32.Build.0 = Release|Win32 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Release|x64.ActiveCfg = Release|x64 - {8C60E805-0DA5-4E25-8F84-038DB504BB0D}.Release|x64.Build.0 = Release|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Debug|Win32.ActiveCfg = Debug|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Debug|Win32.Build.0 = Debug|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Debug|x64.ActiveCfg = Debug|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Debug|x64.Build.0 = Debug|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.DebugFast|x64.Build.0 = DebugFast|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Release|Win32.ActiveCfg = Release|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Release|Win32.Build.0 = Release|Win32 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Release|x64.ActiveCfg = Release|x64 - {CD3D4C3C-1027-4D33-B047-AEC7B56D0BF6}.Release|x64.Build.0 = Release|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Debug|Win32.ActiveCfg = Debug|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Debug|Win32.Build.0 = Debug|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Debug|x64.ActiveCfg = Debug|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Debug|x64.Build.0 = Debug|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.DebugFast|x64.Build.0 = DebugFast|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Release|Win32.ActiveCfg = Release|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Release|Win32.Build.0 = Release|Win32 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Release|x64.ActiveCfg = Release|x64 - {B6398059-EBB6-4C34-B547-95F365B71FF4}.Release|x64.Build.0 = Release|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Debug|Win32.ActiveCfg = Debug|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Debug|Win32.Build.0 = Debug|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Debug|x64.ActiveCfg = Debug|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Debug|x64.Build.0 = Debug|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.DebugFast|x64.Build.0 = DebugFast|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Release|Win32.ActiveCfg = Release|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Release|Win32.Build.0 = Release|Win32 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Release|x64.ActiveCfg = Release|x64 - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49}.Release|x64.Build.0 = Release|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Debug|Win32.ActiveCfg = Debug|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Debug|Win32.Build.0 = Debug|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Debug|x64.ActiveCfg = Debug|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Debug|x64.Build.0 = Debug|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.DebugFast|x64.Build.0 = DebugFast|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Release|Win32.ActiveCfg = Release|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Release|Win32.Build.0 = Release|Win32 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Release|x64.ActiveCfg = Release|x64 - {9A4C733C-BADE-4AC6-B58A-6E274395E90E}.Release|x64.Build.0 = Release|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Debug|Win32.ActiveCfg = Debug|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Debug|Win32.Build.0 = Debug|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Debug|x64.ActiveCfg = Debug|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Debug|x64.Build.0 = Debug|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.DebugFast|x64.Build.0 = DebugFast|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Release|Win32.ActiveCfg = Release|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Release|Win32.Build.0 = Release|Win32 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Release|x64.ActiveCfg = Release|x64 - {1909CD2D-1707-456F-86CA-0DF42A727C99}.Release|x64.Build.0 = Release|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.Debug|Win32.ActiveCfg = Debug|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.Debug|Win32.Build.0 = Debug|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.Debug|x64.ActiveCfg = Debug|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.Debug|x64.Build.0 = Debug|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.DebugFast|x64.Build.0 = DebugFast|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.Release|Win32.ActiveCfg = Release|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.Release|Win32.Build.0 = Release|Win32 - {9E9DA440-E9AD-413C-B648-91030E792211}.Release|x64.ActiveCfg = Release|x64 - {9E9DA440-E9AD-413C-B648-91030E792211}.Release|x64.Build.0 = Release|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Debug|Win32.ActiveCfg = Debug|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Debug|Win32.Build.0 = Debug|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Debug|x64.ActiveCfg = Debug|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Debug|x64.Build.0 = Debug|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.DebugFast|x64.Build.0 = DebugFast|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Release|Win32.ActiveCfg = Release|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Release|Win32.Build.0 = Release|Win32 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Release|x64.ActiveCfg = Release|x64 - {B39AC394-5DB5-4DA9-9D98-09D46CA3701F}.Release|x64.Build.0 = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Debug|Win32.ActiveCfg = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Debug|Win32.Build.0 = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Debug|x64.ActiveCfg = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Debug|x64.Build.0 = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.DebugFast|Win32.ActiveCfg = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.DebugFast|Win32.Build.0 = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.DebugFast|x64.ActiveCfg = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.DebugFast|x64.Build.0 = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Release|Win32.ActiveCfg = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Release|Win32.Build.0 = Release|Win32 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Release|x64.ActiveCfg = Release|x64 - {0B8D0A82-C520-46BA-849D-3BB8F637EE0C}.Release|x64.Build.0 = Release|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|Win32.ActiveCfg = Debug|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|Win32.Build.0 = Debug|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.ActiveCfg = Debug|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.Build.0 = Debug|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.DebugFast|x64.Build.0 = DebugFast|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|Win32.ActiveCfg = Release|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|Win32.Build.0 = Release|Win32 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64 - {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.Build.0 = Release|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|Win32.ActiveCfg = Debug|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|Win32.Build.0 = Debug|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|x64.ActiveCfg = Debug|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|x64.Build.0 = Debug|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.DebugFast|x64.Build.0 = DebugFast|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.ActiveCfg = Release|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.Build.0 = Release|Win32 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.ActiveCfg = Release|x64 - {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.Build.0 = Release|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Debug|Win32.ActiveCfg = Debug|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Debug|Win32.Build.0 = Debug|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Debug|x64.ActiveCfg = Debug|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Debug|x64.Build.0 = Debug|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.DebugFast|Win32.Build.0 = DebugFast|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.DebugFast|x64.ActiveCfg = DebugFast|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.DebugFast|x64.Build.0 = DebugFast|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Release|Win32.ActiveCfg = Release|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Release|Win32.Build.0 = Release|Win32 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Release|x64.ActiveCfg = Release|x64 - {01573C36-AC6E-49F6-94BA-572517EB9740}.Release|x64.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Debug|Win32.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Debug|Win32.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Debug|x64.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Debug|x64.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.DebugFast|Win32.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.DebugFast|Win32.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.DebugFast|x64.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.DebugFast|x64.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Release|Win32.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Release|Win32.Build.0 = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Release|x64.ActiveCfg = Release|x64 - {69F00340-5C3D-449F-9A80-958435C6CF06}.Release|x64.Build.0 = Release|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug|Win32.ActiveCfg = Debug|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug|Win32.Build.0 = Debug|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug|x64.ActiveCfg = Debug|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug|x64.Build.0 = Debug|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.DebugFast|Win32.ActiveCfg = Debug|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.DebugFast|Win32.Build.0 = Debug|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.DebugFast|x64.ActiveCfg = Release|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.DebugFast|x64.Build.0 = Release|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release|Win32.ActiveCfg = Release|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release|Win32.Build.0 = Release|Win32 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release|x64.ActiveCfg = Release|x64 - {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release|x64.Build.0 = Release|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Debug|Win32.ActiveCfg = Debug|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Debug|Win32.Build.0 = Debug|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Debug|x64.ActiveCfg = Debug|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Debug|x64.Build.0 = Debug|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|Win32.ActiveCfg = Debug|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.ActiveCfg = Debug|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.DebugFast|x64.Build.0 = Debug|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.ActiveCfg = Release|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|Win32.Build.0 = Release|Win32 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.ActiveCfg = Release|x64 - {40C636FA-B5BF-4D67-ABC8-376B524A7551}.Release|x64.Build.0 = Release|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Debug|Win32.ActiveCfg = Debug|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Debug|Win32.Build.0 = Debug|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Debug|x64.ActiveCfg = Debug|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Debug|x64.Build.0 = Debug|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.DebugFast|Win32.ActiveCfg = Debug|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.DebugFast|Win32.Build.0 = Debug|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.DebugFast|x64.ActiveCfg = Debug|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.DebugFast|x64.Build.0 = Debug|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Release|Win32.ActiveCfg = Release|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Release|Win32.Build.0 = Release|Win32 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Release|x64.ActiveCfg = Release|x64 - {A680190D-0764-485B-9CF3-A82C5EDD5715}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Source/Plugins/CMakeLists.txt b/Source/Plugins/CMakeLists.txt deleted file mode 100644 index 3a58c3aab1..0000000000 --- a/Source/Plugins/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -if(NOT USE_GLES OR USE_GLES3) - add_subdirectory(Plugin_VideoOGL) -endif() -add_subdirectory(Plugin_VideoSoftware) -# TODO: Add other backends here! diff --git a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj b/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj deleted file mode 100644 index aab9345ef7..0000000000 --- a/Source/Plugins/Plugin_VideoDX11/Plugin_VideoDX11.vcxproj +++ /dev/null @@ -1,249 +0,0 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9A4C733C-BADE-4AC6-B58A-6E274395E90E} - Plugin_VideoDX11 - VideoDX11 - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - dxguid.lib;%(AdditionalDependencies) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj deleted file mode 100644 index 02d39e314f..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {DC7D7AF4-CE47-49E8-8B63-265CB6233A49} - Plugin_VideoDX9 - VideoDX9 - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(PlatformName)\$(Configuration)\ - - - - $(ProjectName)D - - - - - - - - - - - - - Disabled - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - _SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDebug - stdafx.h - Use - - - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - - - true - true - true - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj.filters b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj.filters deleted file mode 100644 index c1d091c239..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcxproj.filters +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - D3D - - - D3D - - - D3D - - - D3D - - - D3D - - - Render - - - - - - - - - Render - - - Render - - - Render - - - Render - - - Render - - - Render - - - D3D - - - D3D - - - D3D - - - D3D - - - D3D - - - Render - - - - - {7acd5e48-186b-4788-ab0a-3551205635f8} - - - {46f1aa47-0eaf-4c32-bdbb-f61c587cd233} - - - \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp deleted file mode 100644 index 44e5abd317..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp +++ /dev/null @@ -1,955 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "D3DBase.h" -#include "VideoConfig.h" -#include "Render.h" -#include "XFStructs.h" -#include "StringUtil.h" -#include "VideoCommon.h" - -D3DXSAVESURFACETOFILEATYPE PD3DXSaveSurfaceToFileA = NULL; -D3DXSAVETEXTURETOFILEATYPE PD3DXSaveTextureToFileA = NULL; -D3DXCOMPILESHADERTYPE PD3DXCompileShader = NULL; - -namespace DX9 -{ -static char vsVersions[5][7] = {"ERROR", "vs_1_4", "vs_2_a", "vs_3_0", "vs_4_0"}; -static char psVersions[5][7] = {"ERROR", "ps_1_4", "ps_2_a", "ps_3_0", "ps_4_0"}; -// D3DX -HINSTANCE hD3DXDll = NULL; -int d3dx_dll_ref = 0; - -typedef IDirect3D9* (WINAPI* DIRECT3DCREATE9)(UINT); -DIRECT3DCREATE9 PDirect3DCreate9 = NULL; -HINSTANCE hD3DDll = NULL; -int d3d_dll_ref = 0; - -namespace D3D -{ - -LPDIRECT3D9 D3D = NULL; // Used to create the D3DDevice -LPDIRECT3DDEVICE9 dev = NULL; // Our rendering device -LPDIRECT3DSURFACE9 back_buffer; -LPDIRECT3DSURFACE9 back_buffer_z; -D3DCAPS9 caps; -HWND hWnd; - -static int multisample; -static int resolution; -static int xres, yres; -static bool auto_depth_stencil = false; - -#define VENDOR_NVIDIA 4318 -#define VENDOR_ATI 4098 -#define VENDOR_INTEL 32902 - -bool bFrameInProgress = false; - -#define MAX_ADAPTERS 4 -static Adapter adapters[MAX_ADAPTERS]; -static int numAdapters; -static int cur_adapter; - -// Value caches for state filtering -const int MaxStreamSources = 16; -const int MaxTextureStages = 9; -const int MaxRenderStates = 210 + 46; -const int MaxTextureTypes = 33; -const int MaxSamplerSize = 13; -const int MaxSamplerTypes = 15; -static bool m_RenderStatesSet[MaxRenderStates]; -static DWORD m_RenderStates[MaxRenderStates]; -static bool m_RenderStatesChanged[MaxRenderStates]; - -static DWORD m_TextureStageStates[MaxTextureStages][MaxTextureTypes]; -static bool m_TextureStageStatesSet[MaxTextureStages][MaxTextureTypes]; -static bool m_TextureStageStatesChanged[MaxTextureStages][MaxTextureTypes]; - -static DWORD m_SamplerStates[MaxSamplerSize][MaxSamplerTypes]; -static bool m_SamplerStatesSet[MaxSamplerSize][MaxSamplerTypes]; -static bool m_SamplerStatesChanged[MaxSamplerSize][MaxSamplerTypes]; - -static LPDIRECT3DBASETEXTURE9 m_Textures[16]; -static LPDIRECT3DVERTEXDECLARATION9 m_VtxDecl; -static bool m_VtxDeclChanged; -static LPDIRECT3DPIXELSHADER9 m_PixelShader; -static bool m_PixelShaderChanged; -static LPDIRECT3DVERTEXSHADER9 m_VertexShader; -static bool m_VertexShaderChanged; -struct StreamSourceDescriptor -{ - LPDIRECT3DVERTEXBUFFER9 pStreamData; - UINT OffsetInBytes; - UINT Stride; -}; -static StreamSourceDescriptor m_stream_sources[MaxStreamSources]; -static bool m_stream_sources_Changed[MaxStreamSources]; -static LPDIRECT3DINDEXBUFFER9 m_index_buffer; -static bool m_index_buffer_Changed; - -// Z buffer formats to be used for EFB depth surface -D3DFORMAT DepthFormats[] = { - FOURCC_INTZ, - FOURCC_DF24, - FOURCC_RAWZ, - FOURCC_DF16, - D3DFMT_D24X8, - D3DFMT_D24X4S4, - D3DFMT_D24S8, - D3DFMT_D24FS8, - D3DFMT_D32, // too much precision, but who cares - D3DFMT_D16, // much lower precision, but better than nothing - D3DFMT_D15S1, -}; - - -void Enumerate(); - -int GetNumAdapters() { return numAdapters; } -const Adapter &GetAdapter(int i) { return adapters[i]; } -const Adapter &GetCurAdapter() { return adapters[cur_adapter]; } - -bool IsATIDevice() -{ - return GetCurAdapter().ident.VendorId == VENDOR_ATI; -} -bool IsIntelDevice() -{ - return GetCurAdapter().ident.VendorId == VENDOR_INTEL; -} - - -HRESULT Init() -{ - if (d3d_dll_ref++ > 0) return S_OK; - - hD3DDll = LoadLibraryA("d3d9.dll"); - if (!hD3DDll) - { - MessageBoxA(NULL, "Failed to load d3d9.dll", "Critical error", MB_OK | MB_ICONERROR); - return E_FAIL; - } - PDirect3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3DDll, "Direct3DCreate9"); - if (PDirect3DCreate9 == NULL) MessageBoxA(NULL, "GetProcAddress failed for Direct3DCreate9!", "Critical error", MB_OK | MB_ICONERROR); - - // Create the D3D object, which is needed to create the D3DDevice. - D3D = PDirect3DCreate9(D3D_SDK_VERSION); - if (!D3D) - { - --d3d_dll_ref; - return E_FAIL; - } - - // Init the caps structure using data from the currently selected device - int adapter = g_Config.iAdapter; - D3D->GetDeviceCaps((adapter >= 0 && adapter < std::min(MAX_ADAPTERS, numAdapters)) ? adapter : D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); - Enumerate(); - if(IsIntelDevice()){ - // Murder the a because Intel doesn't support 2.0a because the 'a' part was a ATI and Nvidia war going on - psVersions[2][5] = '0'; - vsVersions[2][5] = '0'; - } - - return S_OK; -} - -void Shutdown() -{ - if (!d3d_dll_ref) return; - if (--d3d_dll_ref != 0) return; - - if (D3D) D3D->Release(); - D3D = NULL; - - if (hD3DDll) FreeLibrary(hD3DDll); - PDirect3DCreate9 = NULL; -} - -void EnableAlphaToCoverage() -{ - // Each vendor has their own specific little hack. - if (GetCurAdapter().ident.VendorId == VENDOR_ATI) - SetRenderState(D3DRS_POINTSIZE, (D3DFORMAT)MAKEFOURCC('A', '2', 'M', '1')); - else - SetRenderState(D3DRS_ADAPTIVETESS_Y, (D3DFORMAT)MAKEFOURCC('A', 'T', 'O', 'C')); -} - -void InitPP(int adapter, int f, int aa_mode, D3DPRESENT_PARAMETERS *pp) -{ - ZeroMemory(pp, sizeof(D3DPRESENT_PARAMETERS)); - pp->hDeviceWindow = hWnd; - if (auto_depth_stencil) - { - pp->EnableAutoDepthStencil = TRUE; - pp->AutoDepthStencilFormat = D3DFMT_D24S8; - } else { - pp->EnableAutoDepthStencil = FALSE; - pp->AutoDepthStencilFormat = D3DFMT_UNKNOWN; - } - pp->BackBufferFormat = D3DFMT_X8R8G8B8; - if (aa_mode >= (int)adapters[adapter].aa_levels.size()) - aa_mode = 0; - - pp->MultiSampleType = adapters[adapter].aa_levels[aa_mode].ms_setting; - pp->MultiSampleQuality = adapters[adapter].aa_levels[aa_mode].qual_setting; - - pp->Flags = auto_depth_stencil ? D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL : 0; - - if(g_Config.b3DVision) - { - xres = pp->BackBufferWidth = adapters[adapter].resolutions[f].xres; - yres = pp->BackBufferHeight = adapters[adapter].resolutions[f].yres; - } - else - { - RECT client; - GetClientRect(hWnd, &client); - xres = pp->BackBufferWidth = client.right - client.left; - yres = pp->BackBufferHeight = client.bottom - client.top; - } - pp->SwapEffect = D3DSWAPEFFECT_DISCARD; - pp->PresentationInterval = g_Config.IsVSync() ? D3DPRESENT_INTERVAL_DEFAULT : D3DPRESENT_INTERVAL_IMMEDIATE; - pp->Windowed = !g_Config.b3DVision; -} - -void Enumerate() -{ - numAdapters = D3D->GetAdapterCount(); - - for (int i = 0; i < std::min(MAX_ADAPTERS, numAdapters); i++) - { - Adapter &a = adapters[i]; - a.aa_levels.clear(); - a.resolutions.clear(); - D3D->GetAdapterIdentifier(i, 0, &a.ident); - bool isNvidia = a.ident.VendorId == VENDOR_NVIDIA; - - // Add SuperSamples modes - a.aa_levels.push_back(AALevel("None", D3DMULTISAMPLE_NONE, 0)); - a.aa_levels.push_back(AALevel("4x SSAA", D3DMULTISAMPLE_NONE, 0)); - a.aa_levels.push_back(AALevel("9x SSAA", D3DMULTISAMPLE_NONE, 0)); - //Add multisample modes - //disable them will they are not implemnted - /* - DWORD qlevels = 0; - if (D3DERR_NOTAVAILABLE != D3D->CheckDeviceMultiSampleType( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_2_SAMPLES, &qlevels)) - if (qlevels > 0) - a.aa_levels.push_back(AALevel("2x MSAA", D3DMULTISAMPLE_2_SAMPLES, 0)); - - if (D3DERR_NOTAVAILABLE != D3D->CheckDeviceMultiSampleType( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_2_SAMPLES, &qlevels)) - if (qlevels > 0) - a.aa_levels.push_back(AALevel("4x MSAA", D3DMULTISAMPLE_4_SAMPLES, 0)); - - if (D3DERR_NOTAVAILABLE != D3D->CheckDeviceMultiSampleType( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, &qlevels)) - if (qlevels > 0) - a.aa_levels.push_back(AALevel("8x MSAA", D3DMULTISAMPLE_8_SAMPLES, 0)); - - if (isNvidia) - { - // CSAA support - if (D3DERR_NOTAVAILABLE != D3D->CheckDeviceMultiSampleType( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_4_SAMPLES, &qlevels)) - { - if (qlevels > 2) - { - // 8x, 8xQ are available - // See http://developer.nvidia.com/object/coverage-sampled-aa.html - a.aa_levels.push_back(AALevel("8x CSAA", D3DMULTISAMPLE_4_SAMPLES, 2)); - a.aa_levels.push_back(AALevel("8xQ CSAA", D3DMULTISAMPLE_8_SAMPLES, 0)); - } - } - if (D3DERR_NOTAVAILABLE != D3D->CheckDeviceMultiSampleType( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, &qlevels)) - { - if (qlevels > 2) - { - // 16x, 16xQ are available - // See http://developer.nvidia.com/object/coverage-sampled-aa.html - a.aa_levels.push_back(AALevel("16x CSAA", D3DMULTISAMPLE_4_SAMPLES, 4)); - a.aa_levels.push_back(AALevel("16xQ CSAA", D3DMULTISAMPLE_8_SAMPLES, 2)); - } - } - } - */ - // Determine if INTZ is supported. Code from ATI's doc. - // http://developer.amd.com/gpu_assets/Advanced%20DX9%20Capabilities%20for%20ATI%20Radeon%20Cards.pdf - a.supports_intz = D3D_OK == D3D->CheckDeviceFormat( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, FOURCC_INTZ); - // Also check for RAWZ (nvidia only, but the only option to get Z24 textures on sub GF8800 - a.supports_rawz = D3D_OK == D3D->CheckDeviceFormat( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, FOURCC_RAWZ); - // Might as well check for RESZ and NULL too. - a.supports_resz = D3D_OK == D3D->CheckDeviceFormat( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, FOURCC_RESZ); - a.supports_null = D3D_OK == D3D->CheckDeviceFormat( - i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, FOURCC_NULL); - - if (a.aa_levels.size() == 1) - { - strcpy(a.aa_levels[0].name, "(Not supported on this device)"); - } - int numModes = D3D->GetAdapterModeCount(i, D3DFMT_X8R8G8B8); - for (int m = 0; m < numModes; m++) - { - D3DDISPLAYMODE mode; - D3D->EnumAdapterModes(i, D3DFMT_X8R8G8B8, m, &mode); - - int found = -1; - for (int x = 0; x < (int)a.resolutions.size(); x++) - { - if (a.resolutions[x].xres == mode.Width && a.resolutions[x].yres == mode.Height) - { - found = x; - break; - } - } - - Resolution temp; - Resolution &r = found==-1 ? temp : a.resolutions[found]; - - sprintf(r.name, "%ix%i", mode.Width, mode.Height); - r.bitdepths.insert(mode.Format); - r.refreshes.insert(mode.RefreshRate); - if (found == -1 && mode.Width >= 640 && mode.Height >= 480) - { - r.xres = mode.Width; - r.yres = mode.Height; - a.resolutions.push_back(r); - } - } - } -} - -// dynamically picks one of the available d3dx9 dlls and loads it. -// we're first trying to load the dll Dolphin was compiled with, otherwise the most up-to-date one -HRESULT LoadD3DX9() -{ - if (d3dx_dll_ref++ > 0) return S_OK; - - HRESULT hr = E_FAIL; - hD3DXDll = LoadLibraryA(StringFromFormat("d3dx9_%d.dll", D3DX_SDK_VERSION).c_str()); - if (hD3DXDll != NULL) - { - hr = S_OK; - } - else - { - // if that fails, try loading older dlls (no need to look for newer ones) - for (unsigned int num = D3DX_SDK_VERSION-1; num >= 24; --num) - { - hD3DXDll = LoadLibraryA(StringFromFormat("d3dx9_%d.dll", num).c_str()); - if (hD3DXDll != NULL) - { - NOTICE_LOG(VIDEO, "Successfully loaded %s. If you're having trouble, try updating your DX runtime first.", StringFromFormat("d3dx9_%d.dll", num).c_str()); - hr = S_OK; - break; - } - } - if (FAILED(hr)) - { - MessageBoxA(NULL, "Failed to load any D3DX9 dll, update your DX9 runtime, please", "Critical error", MB_OK | MB_ICONERROR); - return hr; - } - } - PD3DXCompileShader = (D3DXCOMPILESHADERTYPE)GetProcAddress(hD3DXDll, "D3DXCompileShader"); - if (PD3DXCompileShader == NULL) - { - MessageBoxA(NULL, "GetProcAddress failed for D3DXCompileShader!", "Critical error", MB_OK | MB_ICONERROR); - goto fail; - } - - PD3DXSaveSurfaceToFileA = (D3DXSAVESURFACETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DXSaveSurfaceToFileA"); - if (PD3DXSaveSurfaceToFileA == NULL) - { - MessageBoxA(NULL, "GetProcAddress failed for D3DXSaveSurfaceToFileA!", "Critical error", MB_OK | MB_ICONERROR); - goto fail; - } - - PD3DXSaveTextureToFileA = (D3DXSAVETEXTURETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DXSaveTextureToFileA"); - if (PD3DXSaveTextureToFileA == NULL) - { - MessageBoxA(NULL, "GetProcAddress failed for D3DXSaveTextureToFileA!", "Critical error", MB_OK | MB_ICONERROR); - goto fail; - } - return S_OK; - -fail: - --d3dx_dll_ref; - FreeLibrary(hD3DXDll); - PD3DXCompileShader = NULL; - PD3DXSaveSurfaceToFileA = NULL; - PD3DXSaveTextureToFileA = NULL; - return E_FAIL; -} - -void UnloadD3DX9() -{ - if (!d3dx_dll_ref) return; - if (--d3dx_dll_ref != 0) return; - - FreeLibrary(hD3DXDll); - PD3DXCompileShader = NULL; - PD3DXSaveSurfaceToFileA = NULL; - PD3DXSaveTextureToFileA = NULL; -} - -HRESULT Create(int adapter, HWND wnd, int _resolution, int aa_mode, bool auto_depth) -{ - hWnd = wnd; - multisample = aa_mode; - resolution = _resolution; - auto_depth_stencil = auto_depth; - cur_adapter = adapter; - D3DPRESENT_PARAMETERS d3dpp; - - HRESULT hr = LoadD3DX9(); - if (FAILED(hr)) return hr; - - InitPP(adapter, resolution, aa_mode, &d3dpp); - - if (FAILED(D3D->CreateDevice( - adapter, - D3DDEVTYPE_HAL, - wnd, - D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, //doesn't seem to make a difference - &d3dpp, &dev))) - { - if (FAILED(D3D->CreateDevice( - adapter, - D3DDEVTYPE_HAL, - wnd, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &d3dpp, &dev))) - { - MessageBox(wnd, - _T("Failed to initialize Direct3D."), - _T("Dolphin Direct3D Backend"), MB_OK | MB_ICONERROR); - return E_FAIL; - } - } - - dev->GetDeviceCaps(&caps); - dev->GetRenderTarget(0, &back_buffer); - if (dev->GetDepthStencilSurface(&back_buffer_z) == D3DERR_NOTFOUND) - back_buffer_z = NULL; - SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE ); - SetRenderState(D3DRS_FILLMODE, g_Config.bWireFrame ? D3DFILL_WIREFRAME : D3DFILL_SOLID); - memset(m_Textures, 0, sizeof(m_Textures)); - memset(m_TextureStageStatesSet, 0, sizeof(m_TextureStageStatesSet)); - memset(m_RenderStatesSet, 0, sizeof(m_RenderStatesSet)); - memset(m_SamplerStatesSet, 0, sizeof(m_SamplerStatesSet)); - memset(m_TextureStageStatesChanged, 0, sizeof(m_TextureStageStatesChanged)); - memset(m_RenderStatesChanged, 0, sizeof(m_RenderStatesChanged)); - memset(m_SamplerStatesChanged, 0, sizeof(m_SamplerStatesChanged)); - m_VtxDecl = NULL; - m_PixelShader = NULL; - m_VertexShader = NULL; - m_index_buffer = NULL; - memset(m_stream_sources, 0, sizeof(m_stream_sources)); - m_index_buffer = NULL; - - m_VtxDeclChanged = false; - m_PixelShaderChanged = false; - m_VertexShaderChanged = false; - memset(m_stream_sources_Changed, 0 , sizeof(m_stream_sources_Changed)); - m_index_buffer_Changed = false; - // Device state would normally be set here - return S_OK; -} - -void Close() -{ - UnloadD3DX9(); - - if (back_buffer_z) - back_buffer_z->Release(); - back_buffer_z = NULL; - if( back_buffer ) - back_buffer->Release(); - back_buffer = NULL; - - ULONG references = dev->Release(); - if (references) - ERROR_LOG(VIDEO, "Unreleased references: %i.", references); - - dev = NULL; -} - -const D3DCAPS9 &GetCaps() -{ - return caps; -} - -// returns true if size was changed -bool FixTextureSize(int& width, int& height) -{ - int oldw = width, oldh = height; - - // conditional nonpow2 support should work fine for us - if ((caps.TextureCaps & D3DPTEXTURECAPS_POW2) && !(caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) - { - // all texture dimensions need to be powers of two - width = (int)MakePow2((u32)width); - height = (int)MakePow2((u32)height); - } - if (caps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) - { - width = height = max(width, height); - } - - width = min(width, (int)caps.MaxTextureWidth); - height = min(height, (int)caps.MaxTextureHeight); - - return (width != oldw) || (height != oldh); -} - -// returns true if format is supported -bool CheckTextureSupport(DWORD usage, D3DFORMAT tex_format) -{ - return D3D_OK == D3D->CheckDeviceFormat(cur_adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, usage, D3DRTYPE_TEXTURE, tex_format); -} - -bool CheckDepthStencilSupport(D3DFORMAT target_format, D3DFORMAT depth_format) -{ - return D3D_OK == D3D->CheckDepthStencilMatch(cur_adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, target_format, depth_format); -} - -D3DFORMAT GetSupportedDepthTextureFormat() -{ - for (int i = 0; i < sizeof(DepthFormats)/sizeof(D3DFORMAT); ++i) - if (CheckTextureSupport(D3DUSAGE_DEPTHSTENCIL, DepthFormats[i])) - return DepthFormats[i]; - - return D3DFMT_UNKNOWN; -} - -D3DFORMAT GetSupportedDepthSurfaceFormat(D3DFORMAT target_format) -{ - for (int i = 0; i < sizeof(DepthFormats)/sizeof(D3DFORMAT); ++i) - if (CheckDepthStencilSupport(target_format, DepthFormats[i])) - return DepthFormats[i]; - - return D3DFMT_UNKNOWN; -} - -const char *VertexShaderVersionString() -{ - int version = ((caps.VertexShaderVersion >> 8) & 0xFF); - return vsVersions[std::min(4, version)]; -} - -const char *PixelShaderVersionString() -{ - int version = ((caps.PixelShaderVersion >> 8) & 0xFF); - return psVersions[std::min(4, version)]; -} - -LPDIRECT3DSURFACE9 GetBackBufferSurface() -{ - return back_buffer; -} - -LPDIRECT3DSURFACE9 GetBackBufferDepthSurface() -{ - return back_buffer_z; -} - -void ShowD3DError(HRESULT err) -{ - switch (err) - { - case D3DERR_DEVICELOST: - PanicAlert("Device Lost"); - break; - case D3DERR_INVALIDCALL: - PanicAlert("Invalid Call"); - break; - case D3DERR_DRIVERINTERNALERROR: - PanicAlert("Driver Internal Error"); - break; - case D3DERR_OUTOFVIDEOMEMORY: - PanicAlert("Out of vid mem"); - break; - default: - // MessageBox(0,_T("Other error or success"),_T("ERROR"),0); - break; - } -} - -void Reset() -{ - if (dev) - { - // ForgetCachedState(); - - // Can't keep a pointer around to the backbuffer surface when resetting. - if (back_buffer_z) - back_buffer_z->Release(); - back_buffer_z = NULL; - back_buffer->Release(); - back_buffer = NULL; - - D3DPRESENT_PARAMETERS d3dpp; - InitPP(cur_adapter, resolution, multisample, &d3dpp); - HRESULT hr = dev->Reset(&d3dpp); - ShowD3DError(hr); - - dev->GetRenderTarget(0, &back_buffer); - if (dev->GetDepthStencilSurface(&back_buffer_z) == D3DERR_NOTFOUND) - back_buffer_z = NULL; - ApplyCachedState(); - } -} - -int GetBackBufferWidth() -{ - return xres; -} - -int GetBackBufferHeight() -{ - return yres; -} - -bool BeginFrame() -{ - if (bFrameInProgress) - { - PanicAlert("BeginFrame WTF"); - return false; - } - bFrameInProgress = true; - if (dev) - { - dev->BeginScene(); - return true; - } - else - return false; -} - -void EndFrame() -{ - if (!bFrameInProgress) - { - PanicAlert("EndFrame WTF"); - return; - } - bFrameInProgress = false; - dev->EndScene(); -} - -void Present() -{ - if (dev) - { - dev->Present(NULL, NULL, NULL, NULL); - } -} - -void ApplyCachedState() -{ - for (int sampler = 0; sampler < 8; sampler++) - { - for (int type = 0; type < MaxSamplerTypes; type++) - { - if(m_SamplerStatesSet[sampler][type]) - dev->SetSamplerState(sampler, (D3DSAMPLERSTATETYPE)type, m_SamplerStates[sampler][type]); - } - } - - for (int rs = 0; rs < MaxRenderStates; rs++) - { - if (m_RenderStatesSet[rs]) - dev->SetRenderState((D3DRENDERSTATETYPE)rs, m_RenderStates[rs]); - } - - // We don't bother restoring these so let's just wipe the state copy - // so no stale state is around. - memset(m_Textures, 0, sizeof(m_Textures)); - memset(m_TextureStageStatesSet, 0, sizeof(m_TextureStageStatesSet)); - memset(m_TextureStageStatesChanged, 0, sizeof(m_TextureStageStatesChanged)); - m_VtxDecl = NULL; - m_PixelShader = NULL; - m_VertexShader = NULL; - memset(m_stream_sources, 0, sizeof(m_stream_sources)); - m_index_buffer = NULL; - m_VtxDeclChanged = false; - m_PixelShaderChanged = false; - m_VertexShaderChanged = false; - memset(m_stream_sources_Changed, 0 , sizeof(m_stream_sources_Changed)); - m_index_buffer_Changed = false; -} - -void SetTexture(DWORD Stage, LPDIRECT3DBASETEXTURE9 pTexture) -{ - if (m_Textures[Stage] != pTexture) - { - m_Textures[Stage] = pTexture; - dev->SetTexture(Stage, pTexture); - } -} - -void RefreshRenderState(D3DRENDERSTATETYPE State) -{ - if(m_RenderStatesSet[State] && m_RenderStatesChanged[State]) - { - dev->SetRenderState(State, m_RenderStates[State]); - m_RenderStatesChanged[State] = false; - } -} - -void SetRenderState(D3DRENDERSTATETYPE State, DWORD Value) -{ - if (m_RenderStates[State] != Value || !m_RenderStatesSet[State]) - { - m_RenderStates[State] = Value; - m_RenderStatesSet[State] = true; - m_RenderStatesChanged[State] = false; - dev->SetRenderState(State, Value); - } -} - -void ChangeRenderState(D3DRENDERSTATETYPE State, DWORD Value) -{ - if (m_RenderStates[State] != Value || !m_RenderStatesSet[State]) - { - m_RenderStatesChanged[State] = m_RenderStatesSet[State]; - dev->SetRenderState(State, Value); - } - else - { - m_RenderStatesChanged[State] = false; - } -} - -void SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) -{ - if (m_TextureStageStates[Stage][Type] != Value || !m_TextureStageStatesSet[Stage][Type]) - { - m_TextureStageStates[Stage][Type] = Value; - m_TextureStageStatesSet[Stage][Type]=true; - m_TextureStageStatesChanged[Stage][Type]=false; - dev->SetTextureStageState(Stage, Type, Value); - } -} - -void RefreshTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type) -{ - if(m_TextureStageStatesSet[Stage][Type] && m_TextureStageStatesChanged[Stage][Type]) - { - dev->SetTextureStageState(Stage, Type, m_TextureStageStates[Stage][Type]); - m_TextureStageStatesChanged[Stage][Type] = false; - } -} - -void ChangeTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) -{ - if (m_TextureStageStates[Stage][Type] != Value || !m_TextureStageStatesSet[Stage][Type]) - { - m_TextureStageStatesChanged[Stage][Type] = m_TextureStageStatesSet[Stage][Type]; - dev->SetTextureStageState(Stage, Type, Value); - } - else - { - m_TextureStageStatesChanged[Stage][Type] = false; - } -} - -void SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) -{ - if (m_SamplerStates[Sampler][Type] != Value || !m_SamplerStatesSet[Sampler][Type]) - { - m_SamplerStates[Sampler][Type] = Value; - m_SamplerStatesSet[Sampler][Type] = true; - m_SamplerStatesChanged[Sampler][Type] = false; - dev->SetSamplerState(Sampler, Type, Value); - } -} - -void RefreshSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type) -{ - if(m_SamplerStatesSet[Sampler][Type] && m_SamplerStatesChanged[Sampler][Type]) - { - dev->SetSamplerState(Sampler, Type, m_SamplerStates[Sampler][Type]); - m_SamplerStatesChanged[Sampler][Type] = false; - } -} - -void ChangeSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) -{ - if (m_SamplerStates[Sampler][Type] != Value || !m_SamplerStatesSet[Sampler][Type]) - { - m_SamplerStatesChanged[Sampler][Type] = m_SamplerStatesSet[Sampler][Type]; - dev->SetSamplerState(Sampler, Type, Value); - } - else - { - m_SamplerStatesChanged[Sampler][Type] = false; - } -} - -void RefreshVertexDeclaration() -{ - if (m_VtxDeclChanged) - { - dev->SetVertexDeclaration(m_VtxDecl); - m_VtxDeclChanged = false; - } -} - -void SetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 decl) -{ - if (decl != m_VtxDecl) - { - dev->SetVertexDeclaration(decl); - m_VtxDecl = decl; - m_VtxDeclChanged = false; - } -} - -void ChangeVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 decl) -{ - if (decl != m_VtxDecl) { - dev->SetVertexDeclaration(decl); - m_VtxDeclChanged = true; - } -} - -void ChangeVertexShader(LPDIRECT3DVERTEXSHADER9 shader) -{ - if (shader != m_VertexShader) - { - dev->SetVertexShader(shader); - m_VertexShaderChanged = true; - } -} - -void RefreshVertexShader() -{ - if (m_VertexShaderChanged) - { - dev->SetVertexShader(m_VertexShader); - m_VertexShaderChanged = false; - } -} - -void SetVertexShader(LPDIRECT3DVERTEXSHADER9 shader) -{ - if (shader != m_VertexShader) - { - dev->SetVertexShader(shader); - m_VertexShader = shader; - m_VertexShaderChanged = false; - } -} - -void RefreshPixelShader() -{ - if (m_PixelShaderChanged) - { - dev->SetPixelShader(m_PixelShader); - m_PixelShaderChanged = false; - } -} - -void SetPixelShader(LPDIRECT3DPIXELSHADER9 shader) -{ - if (shader != m_PixelShader) - { - dev->SetPixelShader(shader); - m_PixelShader = shader; - m_PixelShaderChanged = false; - } -} - -void ChangePixelShader(LPDIRECT3DPIXELSHADER9 shader) -{ - if (shader != m_PixelShader) - { - dev->SetPixelShader(shader); - m_PixelShaderChanged = true; - } -} - -void SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) -{ - if (m_stream_sources[StreamNumber].OffsetInBytes != OffsetInBytes - || m_stream_sources[StreamNumber].pStreamData != pStreamData - || m_stream_sources[StreamNumber].Stride != Stride) - { - m_stream_sources[StreamNumber].OffsetInBytes = OffsetInBytes; - m_stream_sources[StreamNumber].pStreamData = pStreamData; - m_stream_sources[StreamNumber].Stride = Stride; - dev->SetStreamSource(StreamNumber, pStreamData, OffsetInBytes, Stride); - m_stream_sources_Changed[StreamNumber] = false; - } -} - -void ChangeStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) -{ - if (m_stream_sources[StreamNumber].OffsetInBytes != OffsetInBytes - || m_stream_sources[StreamNumber].pStreamData != pStreamData - || m_stream_sources[StreamNumber].Stride != Stride) - { - dev->SetStreamSource(StreamNumber, pStreamData, OffsetInBytes, Stride); - m_stream_sources_Changed[StreamNumber] = true; - } - -} - -void RefreshStreamSource(UINT StreamNumber) -{ - if (m_PixelShaderChanged) - { - dev->SetStreamSource( - StreamNumber, - m_stream_sources[StreamNumber].pStreamData, - m_stream_sources[StreamNumber].OffsetInBytes, - m_stream_sources[StreamNumber].Stride); - m_stream_sources_Changed[StreamNumber] = false; - } -} - -void SetIndices(LPDIRECT3DINDEXBUFFER9 pIndexData) -{ - if(pIndexData != m_index_buffer) - { - m_index_buffer = pIndexData; - dev->SetIndices(pIndexData); - m_index_buffer_Changed = false; - } -} - -void ChangeIndices(LPDIRECT3DINDEXBUFFER9 pIndexData) -{ - if(pIndexData != m_index_buffer) - { - dev->SetIndices(pIndexData); - m_index_buffer_Changed = true; - } -} - -void RefreshIndices() -{ - if (m_index_buffer_Changed) - { - dev->SetIndices(m_index_buffer); - m_index_buffer_Changed = false; - } -} - - - -} // namespace - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h deleted file mode 100644 index b5a6649989..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include -#include - -#include - -#include "Common.h" - -namespace DX9 -{ - -namespace D3D -{ - -// From http://developer.amd.com/gpu_assets/Advanced%20DX9%20Capabilities%20for%20ATI%20Radeon%20Cards.pdf -// Magic FourCC's to unlock undocumented D3D9 features: - -// Z texture formats -#define FOURCC_INTZ ((D3DFORMAT)(MAKEFOURCC('I','N','T','Z'))) -#define FOURCC_RAWZ ((D3DFORMAT)(MAKEFOURCC('R','A','W','Z'))) -#define FOURCC_DF24 ((D3DFORMAT)(MAKEFOURCC('D','F','2','4'))) -#define FOURCC_DF16 ((D3DFORMAT)(MAKEFOURCC('D','F','1','6'))) - -// Depth buffer resolve: -#define FOURCC_RESZ ((D3DFORMAT)(MAKEFOURCC('R','E','S','Z'))) -#define RESZ_CODE 0x7fa05000 - -// Null render target to do Z-only shadow maps: (probably not useful for Dolphin) -#define FOURCC_NULL ((D3DFORMAT)(MAKEFOURCC('N','U','L','L'))) - -bool IsATIDevice(); -bool IsIntelDevice(); -HRESULT Init(); -HRESULT Create(int adapter, HWND wnd, int resolution, int aa_mode, bool auto_depth); -void Close(); -void Shutdown(); - -// Direct access to the device. -extern LPDIRECT3DDEVICE9 dev; -extern bool bFrameInProgress; - -void Reset(); -bool BeginFrame(); -void EndFrame(); -void Present(); -bool CanUseINTZ(); - -int GetBackBufferWidth(); -int GetBackBufferHeight(); -LPDIRECT3DSURFACE9 GetBackBufferSurface(); -LPDIRECT3DSURFACE9 GetBackBufferDepthSurface(); -LPDIRECT3DVERTEXBUFFER9 GetquadVB(); -LPDIRECT3DVERTEXDECLARATION9 GetBasicvertexDecl(); -const D3DCAPS9 &GetCaps(); -const char *PixelShaderVersionString(); -const char *VertexShaderVersionString(); -void ShowD3DError(HRESULT err); - -// returns true if size was changed -bool FixTextureSize(int& width, int& height); - -// returns true if format is supported -bool CheckTextureSupport(DWORD usage, D3DFORMAT tex_format); -bool CheckDepthStencilSupport(D3DFORMAT target_format, D3DFORMAT depth_format); - -D3DFORMAT GetSupportedDepthTextureFormat(); -D3DFORMAT GetSupportedDepthSurfaceFormat(D3DFORMAT target_format); - -// The following are "filtered" versions of the corresponding D3Ddev-> functions. -void SetTexture(DWORD Stage, IDirect3DBaseTexture9 *pTexture); -void SetRenderState(D3DRENDERSTATETYPE State, DWORD Value); -void RefreshRenderState(D3DRENDERSTATETYPE State); -void ChangeRenderState(D3DRENDERSTATETYPE State, DWORD Value); - -void SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); -void RefreshTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type); -void ChangeTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); - -void SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value); -void RefreshSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type); -void ChangeSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value); - -void RefreshVertexDeclaration(); -void SetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 decl); -void ChangeVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 decl); - -void RefreshVertexShader(); -void SetVertexShader(LPDIRECT3DVERTEXSHADER9 shader); -void ChangeVertexShader(LPDIRECT3DVERTEXSHADER9 shader); - -void RefreshPixelShader(); -void SetPixelShader(LPDIRECT3DPIXELSHADER9 shader); -void ChangePixelShader(LPDIRECT3DPIXELSHADER9 shader); - -void SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride); -void ChangeStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride); -void RefreshStreamSource(UINT StreamNumber); - -void SetIndices(LPDIRECT3DINDEXBUFFER9 pIndexData); -void ChangeIndices(LPDIRECT3DINDEXBUFFER9 pIndexData); -void RefreshIndices(); - -void ApplyCachedState(); - -// Utility functions for vendor specific hacks. So far, just the one. -void EnableAlphaToCoverage(); - -struct Resolution -{ - char name[32]; - int xres; - int yres; - std::set bitdepths; - std::set refreshes; -}; - -struct AALevel -{ - AALevel(const char *n, D3DMULTISAMPLE_TYPE m, int q) { - strncpy(name, n, 32); - name[31] = '\0'; - ms_setting = m; - qual_setting = q; - } - char name[32]; - D3DMULTISAMPLE_TYPE ms_setting; - int qual_setting; -}; - -struct Adapter -{ - D3DADAPTER_IDENTIFIER9 ident; - std::vector resolutions; - std::vector aa_levels; - bool supports_alpha_to_coverage; - - // Magic render targets, see the top of this file. - bool supports_intz; - bool supports_rawz; - bool supports_resz; - bool supports_null; -}; - -const Adapter &GetAdapter(int i); -const Adapter &GetCurAdapter(); -int GetNumAdapters(); - -} // namespace - -} // namespace DX9 - - -// Used to not require the SDK and runtime versions to match: -// Linking with d3dx9.lib makes the most recent d3dx9_xx.dll of the -// compiler's SDK an actually unnecessary requirement. -// Add any d3dx9 functions which you want to use here and load them in LoadD3DX9() -typedef HRESULT (WINAPI* D3DXSAVESURFACETOFILEATYPE)(LPCSTR, D3DXIMAGE_FILEFORMAT, LPDIRECT3DSURFACE9, CONST PALETTEENTRY*, CONST RECT*); -typedef HRESULT (WINAPI* D3DXSAVETEXTURETOFILEATYPE)(LPCSTR, D3DXIMAGE_FILEFORMAT, LPDIRECT3DBASETEXTURE9, CONST PALETTEENTRY*); -typedef HRESULT (WINAPI* D3DXCOMPILESHADERTYPE)(LPCSTR, UINT, CONST D3DXMACRO*, LPD3DXINCLUDE, LPCSTR, LPCSTR, DWORD, LPD3DXBUFFER*, LPD3DXBUFFER*, LPD3DXCONSTANTTABLE*); - -extern D3DXSAVESURFACETOFILEATYPE PD3DXSaveSurfaceToFileA; -extern D3DXSAVETEXTURETOFILEATYPE PD3DXSaveTextureToFileA; -extern D3DXCOMPILESHADERTYPE PD3DXCompileShader; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp deleted file mode 100644 index 8649ebfac2..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include -#include - -#include "VideoConfig.h" -#include "D3DShader.h" - -namespace DX9 -{ - -namespace D3D -{ - -// bytecode->shader. -LPDIRECT3DVERTEXSHADER9 CreateVertexShaderFromByteCode(const u8 *bytecode, int len) -{ - LPDIRECT3DVERTEXSHADER9 v_shader; - HRESULT hr = D3D::dev->CreateVertexShader((DWORD *)bytecode, &v_shader); - if (FAILED(hr)) - return NULL; - - return v_shader; -} - -// code->bytecode. -bool CompileVertexShader(const char *code, int len, u8 **bytecode, int *bytecodelen) -{ - LPD3DXBUFFER shaderBuffer = NULL; - LPD3DXBUFFER errorBuffer = NULL; - HRESULT hr = PD3DXCompileShader(code, len, 0, 0, "main", D3D::VertexShaderVersionString(), - 0, &shaderBuffer, &errorBuffer, 0); - if (FAILED(hr)) - { - static int num_failures = 0; - char szTemp[MAX_PATH]; - sprintf(szTemp, "%sbad_vs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); - std::ofstream file; - OpenFStream(file, szTemp, std::ios_base::out); - file << code; - file.close(); - - PanicAlert("Failed to compile vertex shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s):\n%s", - szTemp, - D3D::VertexShaderVersionString(), - (char*)errorBuffer->GetBufferPointer()); - - *bytecode = NULL; - *bytecodelen = 0; - } - else - { - *bytecodelen = shaderBuffer->GetBufferSize(); - *bytecode = new u8[*bytecodelen]; - memcpy(*bytecode, shaderBuffer->GetBufferPointer(), *bytecodelen); - } - - //cleanup - if (shaderBuffer) - shaderBuffer->Release(); - if (errorBuffer) - errorBuffer->Release(); - return SUCCEEDED(hr) ? true : false; -} - -// bytecode->shader -LPDIRECT3DPIXELSHADER9 CreatePixelShaderFromByteCode(const u8 *bytecode, int len) -{ - LPDIRECT3DPIXELSHADER9 p_shader; - HRESULT hr = D3D::dev->CreatePixelShader((DWORD *)bytecode, &p_shader); - if (FAILED(hr)) - return NULL; - - return p_shader; -} - -// code->bytecode -bool CompilePixelShader(const char *code, int len, u8 **bytecode, int *bytecodelen) -{ - LPD3DXBUFFER shaderBuffer = 0; - LPD3DXBUFFER errorBuffer = 0; - - // Someone: - // For some reason, I had this kind of errors : "Shader uses texture addressing operations - // in a dependency chain that is too complex for the target shader model (ps_2_0) to handle." - HRESULT hr = PD3DXCompileShader(code, len, 0, 0, "main", D3D::PixelShaderVersionString(), - 0, &shaderBuffer, &errorBuffer, 0); - - if (FAILED(hr)) - { - static int num_failures = 0; - char szTemp[MAX_PATH]; - sprintf(szTemp, "%sbad_ps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); - std::ofstream file; - OpenFStream(file, szTemp, std::ios_base::out); - file << code; - file.close(); - - PanicAlert("Failed to compile pixel shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s):\n%s", - szTemp, - D3D::PixelShaderVersionString(), - (char*)errorBuffer->GetBufferPointer()); - - *bytecode = NULL; - *bytecodelen = 0; - } - else - { - *bytecodelen = shaderBuffer->GetBufferSize(); - *bytecode = new u8[*bytecodelen]; - memcpy(*bytecode, shaderBuffer->GetBufferPointer(), *bytecodelen); - } - - //cleanup - if (shaderBuffer) - shaderBuffer->Release(); - if (errorBuffer) - errorBuffer->Release(); - return SUCCEEDED(hr) ? true : false; -} - -LPDIRECT3DVERTEXSHADER9 CompileAndCreateVertexShader(const char *code, int len) -{ - u8 *bytecode; - int bytecodelen; - if (CompileVertexShader(code, len, &bytecode, &bytecodelen)) - { - LPDIRECT3DVERTEXSHADER9 v_shader = CreateVertexShaderFromByteCode(bytecode, len); - delete [] bytecode; - return v_shader; - } - return NULL; -} - -LPDIRECT3DPIXELSHADER9 CompileAndCreatePixelShader(const char* code, unsigned int len) -{ - u8 *bytecode; - int bytecodelen; - if (CompilePixelShader(code, len, &bytecode, &bytecodelen)) - { - LPDIRECT3DPIXELSHADER9 p_shader = CreatePixelShaderFromByteCode(bytecode, len); - delete [] bytecode; - return p_shader; - } - return NULL; -} - -} // namespace - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h deleted file mode 100644 index 449f2dacea..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "D3DBase.h" - -namespace DX9 -{ - -namespace D3D -{ - LPDIRECT3DVERTEXSHADER9 CreateVertexShaderFromByteCode(const u8 *bytecode, int len); - LPDIRECT3DPIXELSHADER9 CreatePixelShaderFromByteCode(const u8 *bytecode, int len); - - // The returned bytecode buffers should be delete[]-d. - bool CompileVertexShader(const char *code, int len, u8 **bytecode, int *bytecodelen); - bool CompilePixelShader(const char *code, int len, u8 **bytecode, int *bytecodelen); - - // Utility functions - LPDIRECT3DVERTEXSHADER9 CompileAndCreateVertexShader(const char *code, int len); - LPDIRECT3DPIXELSHADER9 CompileAndCreatePixelShader(const char *code, unsigned int len); -} - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp deleted file mode 100644 index f16e308eef..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "D3DBase.h" -#include "D3DTexture.h" - -#include "CPUDetect.h" - -#if _M_SSE >= 0x401 -#include -#include -#elif _M_SSE >= 0x301 && !(defined __GNUC__ && !defined __SSSE3__) -#include -#endif - -namespace DX9 -{ - -namespace D3D -{ - -void ConvertRGBA_BGRA_SSE2(u32 *dst, const int dstPitch, u32 *pIn, const int width, const int height, const int pitch) -{ - // Converts RGBA to BGRA: - // TODO: this would be totally unnecessary if we just change the TextureDecoder_RGBA to decode - // to BGRA instead. - for (int y = 0; y < height; y++, pIn += pitch) - { - u8 *pIn8 = (u8 *)pIn; - u8 *pBits = (u8 *)((u8*)dst + (y * dstPitch)); - - // Batch up loads/stores into 16 byte chunks to use SSE2 efficiently: - int sse2blocks = (width * 4) / 16; - int sse2remainder = (width * 4) & 15; - - // Do conversions in batches of 16 bytes: - if (sse2blocks > 0) - { - // Generate a constant of all FF bytes: - const __m128i allFFs128 = _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()); - __m128i *src128 = (__m128i *)pIn8; - __m128i *dst128 = (__m128i *)pBits; - - // Increment by 16 bytes at a time: - for (int i = 0; i < sse2blocks; ++i, ++dst128, ++src128) - { - // Load up 4 colors simultaneously: - __m128i rgba = _mm_loadu_si128(src128); - // Swap the R and B components: - // Isolate the B component and shift it left 16 bits: - // ABGR - const __m128i bMask = _mm_srli_epi32(allFFs128, 24); - const __m128i bNew = _mm_slli_epi32(_mm_and_si128(rgba, bMask), 16); - // Isolate the R component and shift it right 16 bits: - const __m128i rMask = _mm_slli_epi32(bMask, 16); - const __m128i rNew = _mm_srli_epi32(_mm_and_si128(rgba, rMask), 16); - // Now mask off the old R and B components from the rgba data to get 0g0a: - const __m128i _g_a = _mm_or_si128( - _mm_and_si128( - rgba, - _mm_or_si128( - _mm_slli_epi32(bMask, 8), - _mm_slli_epi32(rMask, 8) - ) - ), - _mm_or_si128(rNew, bNew) - ); - // Finally, OR up all the individual components to get BGRA: - const __m128i bgra = _mm_or_si128(_g_a, _mm_or_si128(rNew, bNew)); - _mm_storeu_si128(dst128, bgra); - } - } - - // Take the remainder colors at the end of the row that weren't able to - // be included into the last 16 byte chunk: - if (sse2remainder > 0) - { - for (int x = (sse2blocks * 16); x < (width * 4); x += 4) - { - pBits[x + 0] = pIn8[x + 2]; - pBits[x + 1] = pIn8[x + 1]; - pBits[x + 2] = pIn8[x + 0]; - pBits[x + 3] = pIn8[x + 3]; - } - } - } - - // Memory fence to make sure the stores are good: - _mm_mfence(); -} - -void ConvertRGBA_BGRA_SSSE3(u32 *dst, const int dstPitch, u32 *pIn, const int width, const int height, const int pitch) -{ - __m128i mask = _mm_set_epi8(15, 12, 13, 14, 11, 8, 9, 10, 7, 4, 5, 6, 3, 0, 1, 2); - for (int y = 0; y < height; y++, pIn += pitch) - { - u8 *pIn8 = (u8 *)pIn; - u8 *pBits = (u8 *)((u8*)dst + (y * dstPitch)); - - // Batch up loads/stores into 16 byte chunks to use SSE2 efficiently: - int ssse3blocks = (width * 4) / 16; - int ssse3remainder = (width * 4) & 15; - - // Do conversions in batches of 16 bytes: - if (ssse3blocks > 0) - { - __m128i *src128 = (__m128i *)pIn8; - __m128i *dst128 = (__m128i *)pBits; - - // Increment by 16 bytes at a time: - for (int i = 0; i < ssse3blocks; ++i, ++dst128, ++src128) - { - _mm_storeu_si128(dst128, _mm_shuffle_epi8(_mm_loadu_si128(src128), mask)); - } - } - - // Take the remainder colors at the end of the row that weren't able to - // be included into the last 16 byte chunk: - if (ssse3remainder > 0) - { - for (int x = (ssse3blocks * 16); x < (width * 4); x += 4) - { - pBits[x + 0] = pIn8[x + 2]; - pBits[x + 1] = pIn8[x + 1]; - pBits[x + 2] = pIn8[x + 0]; - pBits[x + 3] = pIn8[x + 3]; - } - } - } - - // Memory fence to make sure the stores are good: - _mm_mfence(); -} - -LPDIRECT3DTEXTURE9 CreateTexture2D(const u8* buffer, const int width, const int height, const int pitch, D3DFORMAT fmt, bool swap_r_b, int levels) -{ - u32* pBuffer = (u32*)buffer; - LPDIRECT3DTEXTURE9 pTexture; - - // crazy bitmagic, sorry :) - bool isPow2 = !((width&(width-1)) || (height&(height-1))); - bool bExpand = false; - - if (fmt == D3DFMT_A8P8) { - fmt = D3DFMT_A8L8; - bExpand = true; - } - - HRESULT hr; - if (levels > 0) - hr = dev->CreateTexture(width, height, levels, 0, fmt, D3DPOOL_MANAGED, &pTexture, NULL); - else - hr = dev->CreateTexture(width, height, 0, D3DUSAGE_AUTOGENMIPMAP, fmt, D3DPOOL_MANAGED, &pTexture, NULL); - - if (FAILED(hr)) - return 0; - int level = 0; - D3DLOCKED_RECT Lock; - pTexture->LockRect(level, &Lock, NULL, 0); - switch (fmt) - { - case D3DFMT_L8: - case D3DFMT_A8: - case D3DFMT_A4L4: - { - const u8 *pIn = buffer; - for (int y = 0; y < height; y++) - { - u8* pBits = ((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width); - pIn += pitch; - } - } - break; - case D3DFMT_R5G6B5: - { - const u16 *pIn = (u16*)buffer; - for (int y = 0; y < height; y++) - { - u16* pBits = (u16*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 2); - pIn += pitch; - } - } - break; - case D3DFMT_A8L8: - { - if (bExpand) { // I8 - const u8 *pIn = buffer; - // TODO(XK): Find a better way that does not involve either unpacking - // or downsampling (i.e. A4L4) - for (int y = 0; y < height; y++) - { - u8* pBits = ((u8*)Lock.pBits + (y * Lock.Pitch)); - for(int i = 0; i < width * 2; i += 2) { - pBits[i] = pIn[i / 2]; - pBits[i + 1] = pIn[i / 2]; - } - pIn += pitch; - } - } else { // IA8 - const u16 *pIn = (u16*)buffer; - - for (int y = 0; y < height; y++) - { - u16* pBits = (u16*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 2); - pIn += pitch; - } - } - } - break; - case D3DFMT_A8R8G8B8: - { - if(pitch * 4 == Lock.Pitch && !swap_r_b) - { - memcpy(Lock.pBits,buffer,Lock.Pitch*height); - } - else - { - u32* pIn = pBuffer; - if (!swap_r_b) { - for (int y = 0; y < height; y++) - { - u32 *pBits = (u32*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 4); - pIn += pitch; - } - } else { -#if _M_SSE >= 0x301 - // Uses SSSE3 intrinsics to optimize RGBA -> BGRA swizzle: - if (cpu_info.bSSSE3) { - ConvertRGBA_BGRA_SSSE3((u32 *)Lock.pBits, Lock.Pitch, pIn, width, height, pitch); - } else -#endif - // Uses SSE2 intrinsics to optimize RGBA -> BGRA swizzle: - { - ConvertRGBA_BGRA_SSE2((u32 *)Lock.pBits, Lock.Pitch, pIn, width, height, pitch); - } -#if 0 - for (int y = 0; y < height; y++) - { - u8 *pIn8 = (u8 *)pIn; - u8 *pBits = (u8 *)((u8*)Lock.pBits + (y * Lock.Pitch)); - for (int x = 0; x < width * 4; x += 4) { - pBits[x + 0] = pIn8[x + 2]; - pBits[x + 1] = pIn8[x + 1]; - pBits[x + 2] = pIn8[x + 0]; - pBits[x + 3] = pIn8[x + 3]; - } - pIn += pitch; - } -#endif - } - } - } - break; - case D3DFMT_DXT1: - memcpy(Lock.pBits,buffer,((width+3)/4)*((height+3)/4)*8); - break; - default: - PanicAlert("D3D: Invalid texture format %i", fmt); - } - pTexture->UnlockRect(level); - return pTexture; -} - -LPDIRECT3DTEXTURE9 CreateOnlyTexture2D(const int width, const int height, D3DFORMAT fmt) -{ - LPDIRECT3DTEXTURE9 pTexture; - // crazy bitmagic, sorry :) - bool isPow2 = !((width&(width-1)) || (height&(height-1))); - bool bExpand = false; - HRESULT hr; - // TODO(ector): Allow mipmaps for non-pow textures on newer cards? - // TODO(ector): Use the game-specified mipmaps? - if (!isPow2) - hr = dev->CreateTexture(width, height, 1, 0, fmt, D3DPOOL_MANAGED, &pTexture, NULL); - else - hr = dev->CreateTexture(width, height, 0, D3DUSAGE_AUTOGENMIPMAP, fmt, D3DPOOL_MANAGED, &pTexture, NULL); - - if (FAILED(hr)) - return 0; - return pTexture; -} - -void ReplaceTexture2D(LPDIRECT3DTEXTURE9 pTexture, const u8* buffer, const int width, const int height, const int pitch, D3DFORMAT fmt, bool swap_r_b, int level) -{ - u32* pBuffer = (u32*)buffer; - D3DLOCKED_RECT Lock; - pTexture->LockRect(level, &Lock, NULL, 0); - u32* pIn = pBuffer; - - bool bExpand = false; - - if (fmt == D3DFMT_A8P8) { - fmt = D3DFMT_A8L8; - bExpand = true; - } - switch (fmt) - { - case D3DFMT_A8R8G8B8: - if(pitch * 4 == Lock.Pitch && !swap_r_b) - { - memcpy(Lock.pBits, pBuffer, Lock.Pitch*height); - } - else if (!swap_r_b) - { - for (int y = 0; y < height; y++) - { - u32 *pBits = (u32*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 4); - pIn += pitch; - } - } - else - { -#if _M_SSE >= 0x301 - // Uses SSSE3 intrinsics to optimize RGBA -> BGRA swizzle: - if (cpu_info.bSSSE3) { - ConvertRGBA_BGRA_SSSE3((u32 *)Lock.pBits, Lock.Pitch, pIn, width, height, pitch); - } else -#endif - // Uses SSE2 intrinsics to optimize RGBA -> BGRA swizzle: - { - ConvertRGBA_BGRA_SSE2((u32 *)Lock.pBits, Lock.Pitch, pIn, width, height, pitch); - } -#if 0 - for (int y = 0; y < height; y++) - { - u8 *pIn8 = (u8 *)pIn; - u8 *pBits = (u8 *)((u8*)Lock.pBits + (y * Lock.Pitch)); - for (int x = 0; x < width * 4; x += 4) - { - pBits[x + 0] = pIn8[x + 2]; - pBits[x + 1] = pIn8[x + 1]; - pBits[x + 2] = pIn8[x + 0]; - pBits[x + 3] = pIn8[x + 3]; - } - pIn += pitch; - } -#endif - } - break; - case D3DFMT_L8: - case D3DFMT_A8: - case D3DFMT_A4L4: - { - const u8 *pIn = buffer; - for (int y = 0; y < height; y++) - { - u8* pBits = ((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width); - pIn += pitch; - } - } - break; - case D3DFMT_R5G6B5: - { - const u16 *pIn = (u16*)buffer; - for (int y = 0; y < height; y++) - { - u16* pBits = (u16*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 2); - pIn += pitch; - } - } - break; - case D3DFMT_A8L8: - { - if (bExpand) { // I8 - const u8 *pIn = buffer; - // TODO(XK): Find a better way that does not involve either unpacking - // or downsampling (i.e. A4L4) - for (int y = 0; y < height; y++) - { - u8* pBits = ((u8*)Lock.pBits + (y * Lock.Pitch)); - for(int i = 0; i < width * 2; i += 2) { - pBits[i] = pIn[i / 2]; - pBits[i + 1] = pIn[i / 2]; - } - pIn += pitch; - } - } else { // IA8 - const u16 *pIn = (u16*)buffer; - - for (int y = 0; y < height; y++) - { - u16* pBits = (u16*)((u8*)Lock.pBits + (y * Lock.Pitch)); - memcpy(pBits, pIn, width * 2); - pIn += pitch; - } - } - } - break; - case D3DFMT_DXT1: - memcpy(Lock.pBits,buffer,((width+3)/4)*((height+3)/4)*8); - break; - } - pTexture->UnlockRect(level); -} - -} // namespace - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h deleted file mode 100644 index 54ed57000a..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "D3DBase.h" - -namespace DX9 -{ - -namespace D3D -{ - LPDIRECT3DTEXTURE9 CreateTexture2D(const u8* buffer, const int width, const int height, const int pitch, D3DFORMAT fmt = D3DFMT_A8R8G8B8, bool swap_r_b = false, int levels = 1); - void ReplaceTexture2D(LPDIRECT3DTEXTURE9 pTexture, const u8* buffer, const int width, const int height, const int pitch, D3DFORMAT fmt, bool swap_r_b, int level = 0); - LPDIRECT3DTEXTURE9 CreateRenderTarget(const int width, const int height); - LPDIRECT3DSURFACE9 CreateDepthStencilSurface(const int width, const int height); - LPDIRECT3DTEXTURE9 CreateOnlyTexture2D(const int width, const int height, D3DFORMAT fmt); -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp deleted file mode 100644 index 066f99ad3f..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "Common.h" -#include "StringUtil.h" - -#include "D3DBase.h" -#include "D3DUtil.h" -#include "Render.h" -#include "PixelShaderCache.h" -#include "VertexShaderCache.h" - -namespace DX9 -{ - -namespace D3D -{ -CD3DFont font; - -#define MAX_NUM_VERTICES 50*6 -struct FONT2DVERTEX { - float x,y,z; - float rhw; - u32 color; - float tu, tv; -}; - -#define D3DFVF_FONT2DVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1) -#define D3DFVF_FONT3DVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_NORMAL|D3DFVF_TEX1) - -inline FONT2DVERTEX InitFont2DVertex(float x, float y, u32 color, float tu, float tv) -{ - FONT2DVERTEX v; v.x=x; v.y=y; v.z=0; v.rhw=1.0f; v.color = color; v.tu = tu; v.tv = tv; - return v; -} - -CD3DFont::CD3DFont() -{ - m_pTexture = NULL; - m_pVB = NULL; -} - -enum {m_dwTexWidth = 512, m_dwTexHeight = 512}; - -int CD3DFont::Init() -{ - // Create vertex buffer for the letters - HRESULT hr; - if (FAILED(hr = dev->CreateVertexBuffer(MAX_NUM_VERTICES*sizeof(FONT2DVERTEX), - D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0, D3DPOOL_DEFAULT, &m_pVB, NULL))) - { - return hr; - } - m_fTextScale = 1.0f; // Draw fonts into texture without scaling - - // Prepare to create a bitmap - unsigned int* pBitmapBits; - BITMAPINFO bmi; - ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER)); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biWidth = (int)m_dwTexWidth; - bmi.bmiHeader.biHeight = -(int)m_dwTexHeight; - bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biCompression = BI_RGB; - bmi.bmiHeader.biBitCount = 32; - - // Create a DC and a bitmap for the font - HDC hDC = CreateCompatibleDC(NULL); - HBITMAP hbmBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pBitmapBits, NULL, 0); - SetMapMode(hDC, MM_TEXT); - - // Create a font. By specifying ANTIALIASED_QUALITY, we might get an - // antialiased font, but this is not guaranteed. - // We definitely don't want to get it cleartype'd, anyway. - int m_dwFontHeight = 24; - int nHeight = -MulDiv(m_dwFontHeight, int(GetDeviceCaps(hDC, LOGPIXELSY) * m_fTextScale), 72); - int dwBold = FW_NORMAL; ///FW_BOLD - HFONT hFont = CreateFont(nHeight, 0, 0, 0, dwBold, 0, - FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, - VARIABLE_PITCH, _T("Tahoma")); - if (NULL == hFont) - return E_FAIL; - - HGDIOBJ hOldbmBitmap = SelectObject(hDC, hbmBitmap); - HGDIOBJ hOldFont = SelectObject(hDC, hFont); - - // Set text properties - SetTextColor(hDC, 0xFFFFFF); - SetBkColor (hDC, 0); - SetTextAlign(hDC, TA_TOP); - - // Loop through all printable characters and output them to the bitmap - // Meanwhile, keep track of the corresponding tex coords for each character. - int x = 0, y = 0; - char str[2] = "\0"; - for (int c = 0; c < 127 - 32; c++) - { - str[0] = c + 32; - SIZE size; - GetTextExtentPoint32A(hDC, str, 1, &size); - if ((int)(x+size.cx+1) > m_dwTexWidth) - { - x = 0; - y += size.cy + 1; - } - - ExtTextOutA(hDC, x+1, y+0, ETO_OPAQUE | ETO_CLIPPED, NULL, str, 1, NULL); - m_fTexCoords[c][0] = ((float)(x+0))/m_dwTexWidth; - m_fTexCoords[c][1] = ((float)(y+0))/m_dwTexHeight; - m_fTexCoords[c][2] = ((float)(x+0+size.cx))/m_dwTexWidth; - m_fTexCoords[c][3] = ((float)(y+0+size.cy))/m_dwTexHeight; - - x += size.cx + 3; // 3 to work around annoying ij conflict (part of the j ends up with the i) - } - - // Create a new texture for the font - // possible optimization: store the converted data in a buffer and fill the texture on creation. - // That way, we can use a static texture - hr = dev->CreateTexture(m_dwTexWidth, m_dwTexHeight, 1, D3DUSAGE_DYNAMIC, - D3DFMT_A4R4G4B4, D3DPOOL_DEFAULT, &m_pTexture, NULL); - if (FAILED(hr)) - { - PanicAlert("Failed to create font texture"); - return hr; - } - - // Lock the surface and write the alpha values for the set pixels - D3DLOCKED_RECT d3dlr; - m_pTexture->LockRect(0, &d3dlr, 0, D3DLOCK_DISCARD); - int bAlpha; // 4-bit measure of pixel intensity - - for (y = 0; y < m_dwTexHeight; y++) - { - u16 *pDst16 = (u16*)((u8 *)d3dlr.pBits + y * d3dlr.Pitch); - for (x = 0; x < m_dwTexWidth; x++) - { - bAlpha = ((pBitmapBits[m_dwTexWidth * y + x] & 0xff) >> 4); - pDst16[x] = (bAlpha << 12) | 0x0fff; - } - } - - // Done updating texture, so clean up used objects - m_pTexture->UnlockRect(0); - - SelectObject(hDC, hOldbmBitmap); - DeleteObject(hbmBitmap); - - SelectObject(hDC, hOldFont); - DeleteObject(hFont); - - return S_OK; -} - -int CD3DFont::Shutdown() -{ - m_pVB->Release(); - m_pVB = NULL; - m_pTexture->Release(); - m_pTexture = NULL; - return S_OK; -} - - -const int RS[6][2] = -{ - {D3DRS_ALPHABLENDENABLE, TRUE}, - {D3DRS_SRCBLEND, D3DBLEND_SRCALPHA}, - {D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA}, - {D3DRS_CULLMODE, D3DCULL_NONE}, - {D3DRS_ZENABLE, FALSE}, - {D3DRS_FOGENABLE, FALSE}, -}; -const int TS[6][2] = -{ - {D3DTSS_COLOROP, D3DTOP_MODULATE}, - {D3DTSS_COLORARG1, D3DTA_TEXTURE}, - {D3DTSS_COLORARG2, D3DTA_DIFFUSE }, - {D3DTSS_ALPHAOP, D3DTOP_MODULATE }, - {D3DTSS_ALPHAARG1, D3DTA_TEXTURE }, - {D3DTSS_ALPHAARG2, D3DTA_DIFFUSE }, -}; - -void RestoreShaders() -{ - D3D::SetTexture(0, 0); - D3D::RefreshStreamSource(0); - D3D::RefreshIndices(); - D3D::RefreshVertexDeclaration(); - D3D::RefreshPixelShader(); - D3D::RefreshVertexShader(); -} - -void RestoreRenderStates() -{ - RestoreShaders(); - for (int i = 0; i < 6; i++) - { - D3D::RefreshRenderState((_D3DRENDERSTATETYPE)RS[i][0]); - D3D::RefreshTextureStageState(0, (_D3DTEXTURESTAGESTATETYPE)int(TS[i][0])); - } -} - -void CD3DFont::SetRenderStates() -{ - D3D::SetTexture(0, m_pTexture); - - D3D::ChangePixelShader(0); - D3D::ChangeVertexShader(0); - D3D::ChangeVertexDeclaration(0); - dev->SetFVF(D3DFVF_FONT2DVERTEX); - - for (int i = 0; i < 6; i++) - { - D3D::ChangeRenderState((_D3DRENDERSTATETYPE)RS[i][0], RS[i][1]); - D3D::ChangeTextureStageState(0, (_D3DTEXTURESTAGESTATETYPE)int(TS[i][0]), TS[i][1]); - } -} - - -int CD3DFont::DrawTextScaled(float x, float y, float fXScale, float fYScale, float spacing, u32 dwColor, const char* strText) -{ - if (!m_pVB) - return 0; - - SetRenderStates(); - D3D::ChangeStreamSource(0, m_pVB, 0, sizeof(FONT2DVERTEX)); - - float vpWidth = 1; - float vpHeight = 1; - - float sx = x*vpWidth-0.5f; - float sy = y*vpHeight-0.5f; - - float fStartX = sx; - - float invLineHeight = 1.0f / ((m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight); - // Fill vertex buffer - FONT2DVERTEX* pVertices; - int dwNumTriangles = 0L; - m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); - - const char *oldstrText=strText; - //First, let's measure the text - float tw=0; - float mx=0; - float maxx=0; - - while (*strText) - { - char c = *strText++; - - if (c == ('\n')) - mx = 0; - if (c < (' ')) - continue; - - float tx1 = m_fTexCoords[c-32][0]; - float tx2 = m_fTexCoords[c-32][2]; - - float w = (tx2-tx1)*m_dwTexWidth; - w *= (fXScale*vpHeight)*invLineHeight; - mx += w + spacing*fXScale*vpWidth; - if (mx > maxx) maxx = mx; - } - - float offset = -maxx/2; - strText = oldstrText; - - float wScale = (fXScale*vpHeight)*invLineHeight; - float hScale = (fYScale*vpHeight)*invLineHeight; - - // Let's draw it - while (*strText) - { - char c = *strText++; - - if (c == ('\n')) - { - sx = fStartX; - sy += fYScale*vpHeight; - } - if (c < (' ')) - continue; - - c -= 32; - float tx1 = m_fTexCoords[c][0]; - float ty1 = m_fTexCoords[c][1]; - float tx2 = m_fTexCoords[c][2]; - float ty2 = m_fTexCoords[c][3]; - - float w = (tx2-tx1)*m_dwTexWidth; - float h = (ty2-ty1)*m_dwTexHeight; - - w *= wScale; - h *= hScale; - - FONT2DVERTEX v[6]; - v[0] = InitFont2DVertex(sx, sy+h, dwColor, tx1, ty2); - v[1] = InitFont2DVertex(sx, sy, dwColor, tx1, ty1); - v[2] = InitFont2DVertex(sx+w, sy+h, dwColor, tx2, ty2); - v[3] = InitFont2DVertex(sx+w, sy, dwColor, tx2, ty1); - v[4] = v[2]; - v[5] = v[1]; - - memcpy(pVertices, v, 6*sizeof(FONT2DVERTEX)); - - pVertices+=6; - dwNumTriangles += 2; - - if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6)) - { - // Unlock, render, and relock the vertex buffer - m_pVB->Unlock(); - dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles); - m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); - dwNumTriangles = 0; - } - sx += w + spacing*fXScale*vpWidth; - } - - // Unlock and render the vertex buffer - m_pVB->Unlock(); - if (dwNumTriangles > 0) - dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles); - RestoreRenderStates(); - return S_OK; -} - -/* Explanation of texture copying via drawShadedTexQuad and drawShadedTexSubQuad: - From MSDN: "When rendering 2D output using pre-transformed vertices, - care must be taken to ensure that each texel area correctly corresponds - to a single pixel area, otherwise texture distortion can occur." - => We need to subtract 0.5 from the vertex positions to properly map texels to pixels. - HOWEVER, the MSDN article talks about D3DFVF_XYZRHW vertices, which bypass the programmable pipeline. - Since we're using D3DFVF_XYZW and the programmable pipeline though, the vertex positions - are normalized to [-1;+1], i.e. we need to scale the -0.5 offset by the texture dimensions. - For example see a texture with a width of 640 pixels: - "Expected" coordinate range when using D3DFVF_XYZRHW: [0;640] - Normalizing this coordinate range for D3DFVF_XYZW: [0;640]->[-320;320]->[-1;1] - i.e. we're subtracting width/2 and dividing by width/2 - BUT: The actual range when using D3DFVF_XYZRHW needs to be [-0.5;639.5] because of the need for exact texel->pixel mapping. - We can still apply the same normalizing procedure though: - [-0.5;639.5]->[-320-0.5;320-0.5]->[-1-0.5/320;1-0.5/320] - - So generally speaking the correct coordinate range is [-1-0.5/(w/2);1-0.5/(w/2)] - which can be simplified to [-1-1/w;1-1/w]. - - Note that while for D3DFVF_XYZRHW the y coordinate of the bottom of the screen is positive, - it's negative for D3DFVF_XYZW. This is why we need to _add_ 1/h for the second position component instead of subtracting it. - - For a detailed explanation of this read the MSDN article "Directly Mapping Texels to Pixels (Direct3D 9)". -*/ -void drawShadedTexQuad(IDirect3DTexture9 *texture, - const RECT *rSource, - int SourceWidth, - int SourceHeight, - int DestWidth, - int DestHeight, - IDirect3DPixelShader9 *PShader, - IDirect3DVertexShader9 *Vshader, - float Gamma) -{ - float sw = 1.0f /(float) SourceWidth; - float sh = 1.0f /(float) SourceHeight; - float dw = 1.0f /(float) DestWidth; - float dh = 1.0f /(float) DestHeight; - float u1=((float)rSource->left) * sw; - float u2=((float)rSource->right) * sw; - float v1=((float)rSource->top) * sh; - float v2=((float)rSource->bottom) * sh; - float g = 1.0f/Gamma; - - const struct Q2DVertex { float x,y,z,rhw,u,v,w,h,G; } coords[4] = { - {-1.0f - dw,-1.0f + dh, 0.0f,1.0f, u1, v2, sw, sh, g}, - {-1.0f - dw, 1.0f + dh, 0.0f,1.0f, u1, v1, sw, sh, g}, - { 1.0f - dw,-1.0f + dh, 0.0f,1.0f, u2, v2, sw, sh, g}, - { 1.0f - dw, 1.0f + dh, 0.0f,1.0f, u2, v1, sw, sh, g} - }; - D3D::ChangeVertexShader(Vshader); - D3D::ChangePixelShader(PShader); - D3D::SetTexture(0, texture); - D3D::ChangeVertexDeclaration(0); - dev->SetFVF(D3DFVF_XYZW | D3DFVF_TEX3 | D3DFVF_TEXCOORDSIZE1(2)); - dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, coords, sizeof(Q2DVertex)); - RestoreShaders(); -} - -void drawShadedTexSubQuad(IDirect3DTexture9 *texture, - const MathUtil::Rectangle *rSource, - int SourceWidth, - int SourceHeight, - const MathUtil::Rectangle *rDest, - int DestWidth, - int DestHeight, - IDirect3DPixelShader9 *PShader, - IDirect3DVertexShader9 *Vshader, - float Gamma) -{ - float sw = 1.0f /(float) SourceWidth; - float sh = 1.0f /(float) SourceHeight; - float dw = 1.0f /(float) DestWidth; - float dh = 1.0f /(float) DestHeight; - float u1= rSource->left * sw; - float u2= rSource->right * sw; - float v1= rSource->top * sh; - float v2= rSource->bottom * sh; - float g = 1.0f/Gamma; - - struct Q2DVertex { float x,y,z,rhw,u,v,w,h,G; } coords[4] = { - { rDest->left - dw , rDest->top + dh, 1.0f,1.0f, u1, v2, sw, sh, g}, - { rDest->left - dw , rDest->bottom + dh, 1.0f,1.0f, u1, v1, sw, sh, g}, - { rDest->right - dw , rDest->top + dh, 1.0f,1.0f, u2, v2, sw, sh, g}, - { rDest->right - dw , rDest->bottom + dh, 1.0f,1.0f, u2, v1, sw, sh, g} - }; - D3D::ChangeVertexShader(Vshader); - D3D::ChangePixelShader(PShader); - D3D::SetTexture(0, texture); - D3D::ChangeVertexDeclaration(0); - dev->SetFVF(D3DFVF_XYZW | D3DFVF_TEX3 | D3DFVF_TEXCOORDSIZE1(2)); - dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, coords, sizeof(Q2DVertex)); - RestoreShaders(); -} - -// Fills a certain area of the current render target with the specified color -// Z buffer disabled; destination coordinates normalized to (-1;1) -void drawColorQuad(u32 Color, float x1, float y1, float x2, float y2) -{ - struct CQVertex { float x, y, z, rhw; u32 col; } coords[4] = { - { x1, y2, 0.f, 1.f, Color }, - { x2, y2, 0.f, 1.f, Color }, - { x1, y1, 0.f, 1.f, Color }, - { x2, y1, 0.f, 1.f, Color }, - }; - D3D::ChangeVertexShader(VertexShaderCache::GetClearVertexShader()); - D3D::ChangePixelShader(PixelShaderCache::GetClearProgram()); - D3D::ChangeVertexDeclaration(0); - dev->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE); - dev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, coords, sizeof(CQVertex)); - RestoreShaders(); -} - -void drawClearQuad(u32 Color,float z,IDirect3DPixelShader9 *PShader,IDirect3DVertexShader9 *Vshader) -{ - struct Q2DVertex { float x,y,z,rhw;u32 color;} coords[4] = { - {-1.0f, 1.0f, z, 1.0f, Color}, - { 1.0f, 1.0f, z, 1.0f, Color}, - { 1.0f, -1.0f, z, 1.0f, Color}, - {-1.0f, -1.0f, z, 1.0f, Color} - }; - D3D::ChangeVertexShader(Vshader); - D3D::ChangePixelShader(PShader); - D3D::ChangeVertexDeclaration(0); - dev->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE); - dev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, coords, sizeof(Q2DVertex)); - RestoreShaders(); -} - - -} // namespace - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h deleted file mode 100644 index 35cc63a5f0..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "D3DBase.h" -#include -#include - -namespace DX9 -{ - -namespace D3D -{ - // Font creation flags - #define D3DFONT_BOLD 0x0001 - #define D3DFONT_ITALIC 0x0002 - - // Font rendering flags - #define D3DFONT_CENTERED 0x0001 - - //a cut-down variant of the DXSDK CD3DFont class - class CD3DFont - { - LPDIRECT3DTEXTURE9 m_pTexture; // The d3d texture for this font - LPDIRECT3DVERTEXBUFFER9 m_pVB; // VertexBuffer for rendering text - //int m_dwTexWidth; // Texture dimensions - //int m_dwTexHeight; - float m_fTextScale; - float m_fTexCoords[128-32][4]; - - public: - CD3DFont(); - // 2D (no longer 3D) text drawing function - // Initializing and destroying device-dependent objects - void SetRenderStates(); - int Init(); - int Shutdown(); - int DrawTextScaled( float x, float y, - float fXScale, float fYScale, - float spacing, u32 dwColor, - const char* strText); - - - // Constructor / destructor - //~CD3DFont(); - }; - - extern CD3DFont font; - - void quad2d(float x1, float y1, float x2, float y2, u32 color, float u1=0, float v1=0, float u2=1, float v2=1); - void drawShadedTexQuad(IDirect3DTexture9 *texture, - const RECT *rSource, - int SourceWidth, - int SourceHeight, - int DestWidth, - int DestHeight, - IDirect3DPixelShader9 *PShader, - IDirect3DVertexShader9 *Vshader, - float Gamma = 1.0f); - void drawShadedTexSubQuad(IDirect3DTexture9 *texture, - const MathUtil::Rectangle *rSource, - int SourceWidth, - int SourceHeight, - const MathUtil::Rectangle *rDest, - int DestWidth, - int DestHeight, - IDirect3DPixelShader9 *PShader, - IDirect3DVertexShader9 *Vshader, - float Gamma = 1.0f); - void drawClearQuad(u32 Color, float z, IDirect3DPixelShader9 *PShader, IDirect3DVertexShader9 *Vshader); - void drawColorQuad(u32 Color, float x1, float y1, float x2, float y2); - - void SaveRenderStates(); - void RestoreRenderStates(); -} - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp deleted file mode 100644 index 6b83b0e0d6..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "D3DBase.h" -#include "Render.h" -#include "FramebufferManager.h" -#include "VideoConfig.h" -#include "PixelShaderCache.h" -#include "VertexShaderCache.h" -#include "TextureConverter.h" -#include "HW/Memmap.h" - -namespace DX9 -{ - -// TODO: this is probably somewhere else -#define SAFE_RELEASE(p) if (p) { (p)->Release(); (p) = NULL; } - -#undef CHECK -#define CHECK(hr, Message, ...) if (FAILED(hr)) { PanicAlert(__FUNCTION__ "Failed in %s at line %d: " Message, __FILE__, __LINE__, __VA_ARGS__); } - -inline void GetSurface(IDirect3DTexture9* texture, IDirect3DSurface9** surface) -{ - if (!texture) return; - texture->GetSurfaceLevel(0, surface); -} - -FramebufferManager::Efb FramebufferManager::s_efb; - -FramebufferManager::FramebufferManager() -{ - bool depth_textures_supported = true; - int target_width = Renderer::GetTargetWidth(); - int target_height = Renderer::GetTargetHeight(); - s_efb.color_surface_Format = D3DFMT_A8R8G8B8; - - // EFB color texture - primary render target - HRESULT hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, s_efb.color_surface_Format, - D3DPOOL_DEFAULT, &s_efb.color_texture, NULL); - GetSurface(s_efb.color_texture, &s_efb.color_surface); - CHECK(hr, "Create color texture (size: %dx%d; hr=%#x)", target_width, target_height, hr); - - // Render buffer for AccessEFB (color data) - hr = D3D::dev->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, s_efb.color_surface_Format, - D3DPOOL_DEFAULT, &s_efb.colorRead_texture, NULL); - GetSurface(s_efb.colorRead_texture, &s_efb.color_ReadBuffer); - CHECK(hr, "Create Color Read Texture (hr=%#x)", hr); - - // AccessEFB - Sysmem buffer used to retrieve the pixel data from color_ReadBuffer - hr = D3D::dev->CreateOffscreenPlainSurface(1, 1, s_efb.color_surface_Format, D3DPOOL_SYSTEMMEM, &s_efb.color_OffScreenReadBuffer, NULL); - CHECK(hr, "Create offscreen color surface (hr=%#x)", hr); - - // Select a Z-buffer texture format with hardware support - s_efb.depth_surface_Format = D3D::GetSupportedDepthTextureFormat(); - if (s_efb.depth_surface_Format == D3DFMT_UNKNOWN) - { - // workaround for Intel GPUs etc: only create a depth _surface_ - depth_textures_supported = false; - s_efb.depth_surface_Format = D3D::GetSupportedDepthSurfaceFormat(s_efb.color_surface_Format); - ERROR_LOG(VIDEO, "No supported depth texture format found, disabling Z peeks for EFB access."); - } - - if (depth_textures_supported) - { - // EFB depth buffer - primary depth buffer - hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_DEPTHSTENCIL, s_efb.depth_surface_Format, - D3DPOOL_DEFAULT, &s_efb.depth_texture, NULL); - GetSurface(s_efb.depth_texture, &s_efb.depth_surface); - CHECK(hr, "Framebuffer depth texture (size: %dx%d; hr=%#x)", target_width, target_height, hr); - - // Render buffer for AccessEFB (depth data) - D3DFORMAT DepthTexFormats[2]; - DepthTexFormats[0] = D3DFMT_D24X8; - // This is expected to work on all hardware - DepthTexFormats[1] = D3DFMT_A8R8G8B8; - - for (int i = 0; i < 2; ++i) - { - if (D3D::CheckTextureSupport(D3DUSAGE_RENDERTARGET, DepthTexFormats[i])) - { - s_efb.depth_ReadBuffer_Format = DepthTexFormats[i]; - break; - } - } - hr = D3D::dev->CreateTexture(4, 4, 1, D3DUSAGE_RENDERTARGET, s_efb.depth_ReadBuffer_Format, - D3DPOOL_DEFAULT, &s_efb.depthRead_texture, NULL); - GetSurface(s_efb.depthRead_texture, &s_efb.depth_ReadBuffer); - CHECK(hr, "Create depth read texture (hr=%#x)", hr); - - // AccessEFB - Sysmem buffer used to retrieve the pixel data from depth_ReadBuffer - hr = D3D::dev->CreateOffscreenPlainSurface(4, 4, s_efb.depth_ReadBuffer_Format, D3DPOOL_SYSTEMMEM, &s_efb.depth_OffScreenReadBuffer, NULL); - CHECK(hr, "Create depth offscreen surface (hr=%#x)", hr); - } - else if (s_efb.depth_surface_Format) - { - // just create a depth surface - hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, s_efb.depth_surface_Format, D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb.depth_surface, NULL); - CHECK(hr, "Framebuffer depth surface (size: %dx%d; hr=%#x)", target_width, target_height, hr); - } - - // ReinterpretPixelData - EFB color data will be copy-converted to this texture and the buffers are swapped then - hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, s_efb.color_surface_Format, - D3DPOOL_DEFAULT, &s_efb.color_reinterpret_texture, NULL); - GetSurface(s_efb.color_reinterpret_texture, &s_efb.color_reinterpret_surface); - CHECK(hr, "Create color reinterpret texture (size: %dx%d; hr=%#x)", target_width, target_height, hr); -} - -FramebufferManager::~FramebufferManager() -{ - SAFE_RELEASE(s_efb.depth_surface); - SAFE_RELEASE(s_efb.color_surface); - SAFE_RELEASE(s_efb.color_ReadBuffer); - SAFE_RELEASE(s_efb.depth_ReadBuffer); - SAFE_RELEASE(s_efb.color_OffScreenReadBuffer); - SAFE_RELEASE(s_efb.depth_OffScreenReadBuffer); - SAFE_RELEASE(s_efb.color_texture); - SAFE_RELEASE(s_efb.colorRead_texture); - SAFE_RELEASE(s_efb.depth_texture); - SAFE_RELEASE(s_efb.depthRead_texture); - SAFE_RELEASE(s_efb.color_reinterpret_texture); - SAFE_RELEASE(s_efb.color_reinterpret_surface); - s_efb.color_surface_Format = D3DFMT_UNKNOWN; - s_efb.depth_surface_Format = D3DFMT_UNKNOWN; - s_efb.depth_ReadBuffer_Format = D3DFMT_UNKNOWN; -} - -XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height) -{ - LPDIRECT3DTEXTURE9 tex; - D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, - s_efb.color_surface_Format, D3DPOOL_DEFAULT, &tex, NULL); - - return new XFBSource(tex); -} - -void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc) -{ - TargetRectangle targetSource; - - targetSource.top = ScaleToVirtualXfbHeight(sourceRc.top, Renderer::GetBackbufferHeight()); - targetSource.bottom = ScaleToVirtualXfbHeight(sourceRc.bottom, Renderer::GetBackbufferHeight()); - targetSource.left = ScaleToVirtualXfbWidth(sourceRc.left, Renderer::GetBackbufferWidth()); - targetSource.right = ScaleToVirtualXfbWidth(sourceRc.right, Renderer::GetBackbufferWidth()); - - *width = targetSource.right - targetSource.left; - *height = targetSource.bottom - targetSource.top; -} - -void XFBSource::Draw(const MathUtil::Rectangle &sourcerc, - const MathUtil::Rectangle &drawrc, int width, int height) const -{ - D3D::drawShadedTexSubQuad(texture, &sourcerc, texWidth, texHeight, &drawrc, width , height, - PixelShaderCache::GetColorCopyProgram(0), VertexShaderCache::GetSimpleVertexShader(0)); -} - -void XFBSource::DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) -{ - TextureConverter::DecodeToTexture(xfbAddr, fbWidth, fbHeight, texture); -} - -void FramebufferManager::CopyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) -{ - u8* xfb_in_ram = Memory::GetPointer(xfbAddr); - if (!xfb_in_ram) - { - WARN_LOG(VIDEO, "Tried to copy to invalid XFB address"); - return; - } - - TargetRectangle targetRc = g_renderer->ConvertEFBRectangle(sourceRc); - TextureConverter::EncodeToRamYUYV(GetEFBColorTexture(), targetRc, xfb_in_ram, fbWidth, fbHeight,Gamma); -} - -void XFBSource::CopyEFB(float Gamma) -{ - g_renderer->ResetAPIState(); // reset any game specific settings - - // Copy EFB data to XFB and restore render target again - LPDIRECT3DSURFACE9 Rendersurf = NULL; - texture->GetSurfaceLevel(0, &Rendersurf); - D3D::dev->SetDepthStencilSurface(NULL); - D3D::dev->SetRenderTarget(0, Rendersurf); - - D3DVIEWPORT9 vp; - vp.X = 0; - vp.Y = 0; - vp.Width = texWidth; - vp.Height = texHeight; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - - RECT sourcerect; - sourcerect.bottom = sourceRc.bottom; - sourcerect.left = sourceRc.left; - sourcerect.right = sourceRc.right; - sourcerect.top = sourceRc.top; - - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - - D3D::drawShadedTexQuad( - FramebufferManager::GetEFBColorTexture(), - &sourcerect, - Renderer::GetTargetWidth(), - Renderer::GetTargetHeight(), - texWidth, - texHeight, - PixelShaderCache::GetColorCopyProgram( g_ActiveConfig.iMultisampleMode), - VertexShaderCache::GetSimpleVertexShader( g_ActiveConfig.iMultisampleMode), - Gamma); - - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - D3D::RefreshSamplerState(0, D3DSAMP_MAGFILTER); - D3D::SetTexture(0, NULL); - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - - Rendersurf->Release(); - - g_renderer->RestoreAPIState(); -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h deleted file mode 100644 index 66cdc2ec99..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "D3DBase.h" -#include "FramebufferManagerBase.h" - -// On the GameCube, the game sends a request for the graphics processor to -// transfer its internal EFB (Embedded Framebuffer) to an area in GameCube RAM -// called the XFB (External Framebuffer). The size and location of the XFB is -// decided at the time of the copy, and the format is always YUYV. The video -// interface is given a pointer to the XFB, which will be decoded and -// displayed on the TV. -// -// There are two ways for Dolphin to emulate this: -// -// Real XFB mode: -// -// Dolphin will behave like the GameCube and encode the EFB to -// a portion of GameCube RAM. The emulated video interface will decode the data -// for output to the screen. -// -// Advantages: Behaves exactly like the GameCube. -// Disadvantages: Resolution will be limited. -// -// Virtual XFB mode: -// -// When a request is made to copy the EFB to an XFB, Dolphin -// will remember the RAM location and size of the XFB in a Virtual XFB list. -// The video interface will look up the XFB in the list and use the enhanced -// data stored there, if available. -// -// Advantages: Enables high resolution graphics, better than real hardware. -// Disadvantages: If the GameCube CPU writes directly to the XFB (which is -// possible but uncommon), the Virtual XFB will not capture this information. - -namespace DX9 -{ - -struct XFBSource : public XFBSourceBase -{ - XFBSource(LPDIRECT3DTEXTURE9 tex) : texture(tex) {} - ~XFBSource() { texture->Release(); } - - void Draw(const MathUtil::Rectangle &sourcerc, - const MathUtil::Rectangle &drawrc, int width, int height) const; - void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight); - void CopyEFB(float Gamma); - - LPDIRECT3DTEXTURE9 const texture; -}; - -class FramebufferManager : public FramebufferManagerBase -{ -public: - FramebufferManager(); - ~FramebufferManager(); - - static LPDIRECT3DTEXTURE9 GetEFBColorTexture() { return s_efb.color_texture; } - static LPDIRECT3DTEXTURE9 GetEFBDepthTexture() { return s_efb.depth_texture; } - - static LPDIRECT3DSURFACE9 GetEFBColorRTSurface() { return s_efb.color_surface; } - static LPDIRECT3DSURFACE9 GetEFBDepthRTSurface() { return s_efb.depth_surface; } - - static LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface() { return s_efb.color_OffScreenReadBuffer; } - static LPDIRECT3DSURFACE9 GetEFBDepthOffScreenRTSurface() { return s_efb.depth_OffScreenReadBuffer; } - - static D3DFORMAT GetEFBDepthRTSurfaceFormat() { return s_efb.depth_surface_Format; } - static D3DFORMAT GetEFBColorRTSurfaceFormat() { return s_efb.color_surface_Format; } - static D3DFORMAT GetEFBDepthReadSurfaceFormat() { return s_efb.depth_ReadBuffer_Format; } - - static LPDIRECT3DSURFACE9 GetEFBColorReadSurface() { return s_efb.color_ReadBuffer; } - static LPDIRECT3DSURFACE9 GetEFBDepthReadSurface() { return s_efb.depth_ReadBuffer; } - - static LPDIRECT3DTEXTURE9 GetEFBColorReinterpretTexture() { return s_efb.color_reinterpret_texture; } - static LPDIRECT3DSURFACE9 GetEFBColorReinterpretSurface() { return s_efb.color_reinterpret_surface; } - static void SwapReinterpretTexture() - { - LPDIRECT3DSURFACE9 swapsurf = GetEFBColorReinterpretSurface(); - LPDIRECT3DTEXTURE9 swaptex = GetEFBColorReinterpretTexture(); - s_efb.color_reinterpret_surface = GetEFBColorRTSurface(); - s_efb.color_reinterpret_texture = GetEFBColorTexture(); - s_efb.color_surface = swapsurf; - s_efb.color_texture = swaptex; - } - -private: - XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height); - void GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc); - - void CopyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma); - - static struct Efb - { - Efb() : color_texture(NULL), colorRead_texture(NULL), depth_texture(NULL), depthRead_texture(NULL), - color_reinterpret_texture(NULL), color_reinterpret_surface(NULL), - depth_surface(NULL), color_surface(NULL), color_ReadBuffer(NULL), depth_ReadBuffer(NULL), - color_OffScreenReadBuffer(NULL), depth_OffScreenReadBuffer(NULL), - color_surface_Format(D3DFMT_UNKNOWN), depth_surface_Format(D3DFMT_UNKNOWN), - depth_ReadBuffer_Format(D3DFMT_UNKNOWN) {} - - LPDIRECT3DTEXTURE9 color_texture;//Texture that contains the color data of the render target - LPDIRECT3DTEXTURE9 colorRead_texture;//1 pixel texture for temporal data store - LPDIRECT3DTEXTURE9 depth_texture;//Texture that contains the depth data of the render target - LPDIRECT3DTEXTURE9 depthRead_texture;//4 pixel texture for temporal data store - - LPDIRECT3DTEXTURE9 color_reinterpret_texture;//buffer used for ReinterpretPixelData - LPDIRECT3DSURFACE9 color_reinterpret_surface;//corresponding surface - - LPDIRECT3DSURFACE9 depth_surface;//Depth Surface - LPDIRECT3DSURFACE9 color_surface;//Color Surface - LPDIRECT3DSURFACE9 color_ReadBuffer;//Surface 0 of colorRead_texture - LPDIRECT3DSURFACE9 depth_ReadBuffer;//Surface 0 of depthRead_texture - LPDIRECT3DSURFACE9 color_OffScreenReadBuffer;//System memory Surface that can be locked to retrieve the data - LPDIRECT3DSURFACE9 depth_OffScreenReadBuffer;//System memory Surface that can be locked to retrieve the data - - D3DFORMAT color_surface_Format;//Format of the color Surface - D3DFORMAT depth_surface_Format;//Format of the Depth Surface - D3DFORMAT depth_ReadBuffer_Format;//Format of the Depth color Read Surface - } s_efb; -}; - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Globals.h b/Source/Plugins/Plugin_VideoDX9/Src/Globals.h deleted file mode 100644 index 89800694e8..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/Globals.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef _GLOBALS_H_ -#define _GLOBALS_H_ - -#include "Common.h" -#include "VideoConfig.h" -#include "main.h" - -#include "VideoCommon.h" - -#endif // _GLOBALS_H_ \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/NativeVertexFormat.cpp b/Source/Plugins/Plugin_VideoDX9/Src/NativeVertexFormat.cpp deleted file mode 100644 index 69de7e0a58..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/NativeVertexFormat.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "D3DBase.h" - -#include "x64Emitter.h" -#include "x64ABI.h" -#include "MemoryUtil.h" -#include "VertexShaderGen.h" - -#include "CPMemory.h" -#include "NativeVertexFormat.h" -#include "VertexManager.h" - -namespace DX9 -{ - -class D3DVertexFormat : public NativeVertexFormat -{ - LPDIRECT3DVERTEXDECLARATION9 d3d_decl; - -public: - D3DVertexFormat() : d3d_decl(NULL) {} - ~D3DVertexFormat(); - virtual void Initialize(const PortableVertexDeclaration &_vtx_decl); - virtual void SetupVertexPointers(); - -#if defined(_DEBUG) || defined(DEBUGFAST) - D3DVERTEXELEMENT9 elements[32]; - int num_elements; -#endif -}; - -NativeVertexFormat* VertexManager::CreateNativeVertexFormat() -{ - return new D3DVertexFormat(); -} - -void DX9::VertexManager::GetElements(NativeVertexFormat* format, D3DVERTEXELEMENT9** elems, int* num) -{ -#if defined(_DEBUG) || defined(DEBUGFAST) - *elems = ((D3DVertexFormat*)format)->elements; - *num = ((D3DVertexFormat*)format)->num_elements; -#else - *elems = NULL; - *num = 0; -#endif -} - -D3DVertexFormat::~D3DVertexFormat() -{ - if (d3d_decl) - { - d3d_decl->Release(); - d3d_decl = NULL; - } -} - -D3DDECLTYPE VarToD3D(VarType t, int size) -{ - if (t < 0 || t > 4) { - PanicAlert("VarToD3D: Invalid VarType %i", t); - } - static const D3DDECLTYPE lookup1[5] = { - D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_FLOAT1, - }; - static const D3DDECLTYPE lookup2[5] = { - D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_SHORT2N, D3DDECLTYPE_USHORT2N, D3DDECLTYPE_FLOAT2, - }; - static const D3DDECLTYPE lookup3[5] = { - D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_UNUSED, D3DDECLTYPE_FLOAT3, - }; - // Sadly, D3D9 has no SBYTE4N. D3D10 does, though. - static const D3DDECLTYPE lookup4[5] = { - D3DDECLTYPE_UNUSED, D3DDECLTYPE_UBYTE4N, D3DDECLTYPE_SHORT4N, D3DDECLTYPE_USHORT4N, D3DDECLTYPE_FLOAT4, - }; - D3DDECLTYPE retval = D3DDECLTYPE_UNUSED; - switch (size) - { - case 1: retval = lookup1[t]; break; - case 2: retval = lookup2[t]; break; - case 3: retval = lookup3[t]; break; - case 4: retval = lookup4[t]; break; - default: break; - } - if (retval == D3DDECLTYPE_UNUSED) { - PanicAlert("VarToD3D: Invalid type/size combo %i , %i", (int)t, size); - } - return retval; -} - -void D3DVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl) -{ - vertex_stride = _vtx_decl.stride; - - D3DVERTEXELEMENT9 elems[32]; - memset(elems, 0, sizeof(elems)); - - // There's only one stream and it's 0, so the above memset takes care of that - no need to set Stream. - // Same for method. - - // So, here we go. First position: - int elem_idx = 0; - elems[elem_idx].Offset = 0; // Positions are always first, at position 0. Always float3. - elems[elem_idx].Type = D3DDECLTYPE_FLOAT3; - elems[elem_idx].Usage = D3DDECLUSAGE_POSITION; - ++elem_idx; - - for (int i = 0; i < 3; i++) - { - if (_vtx_decl.normal_offset[i] > 0) - { - elems[elem_idx].Offset = _vtx_decl.normal_offset[i]; - elems[elem_idx].Type = VarToD3D(_vtx_decl.normal_gl_type, _vtx_decl.normal_gl_size); - elems[elem_idx].Usage = D3DDECLUSAGE_NORMAL; - elems[elem_idx].UsageIndex = i; - ++elem_idx; - } - } - - for (int i = 0; i < 2; i++) - { - if (_vtx_decl.color_offset[i] > 0) - { - elems[elem_idx].Offset = _vtx_decl.color_offset[i]; - elems[elem_idx].Type = VarToD3D(_vtx_decl.color_gl_type, 4); - elems[elem_idx].Usage = D3DDECLUSAGE_COLOR; - elems[elem_idx].UsageIndex = i; - ++elem_idx; - } - } - - for (int i = 0; i < 8; i++) - { - if (_vtx_decl.texcoord_offset[i] > 0) - { - elems[elem_idx].Offset = _vtx_decl.texcoord_offset[i]; - elems[elem_idx].Type = VarToD3D(_vtx_decl.texcoord_gl_type[i], _vtx_decl.texcoord_size[i]); - elems[elem_idx].Usage = D3DDECLUSAGE_TEXCOORD; - elems[elem_idx].UsageIndex = i; - ++elem_idx; - } - } - - if (_vtx_decl.posmtx_offset != -1) - { - elems[elem_idx].Offset = _vtx_decl.posmtx_offset; - elems[elem_idx].Usage = D3DDECLUSAGE_BLENDINDICES; - elems[elem_idx].Type = D3DDECLTYPE_D3DCOLOR; - elems[elem_idx].UsageIndex = 0; - ++elem_idx; - } - - // End marker - elems[elem_idx].Stream = 0xff; - elems[elem_idx].Type = D3DDECLTYPE_UNUSED; - ++elem_idx; - - if (FAILED(DX9::D3D::dev->CreateVertexDeclaration(elems, &d3d_decl))) - { - PanicAlert("Failed to create D3D vertex declaration!"); - return; - } -#if defined(_DEBUG) || defined(DEBUGFAST) - memcpy(&elements, elems, sizeof(elems)); - num_elements = elem_idx; -#endif -} - -void D3DVertexFormat::SetupVertexPointers() -{ - if (d3d_decl) - DX9::D3D::SetVertexDeclaration(d3d_decl); - else - ERROR_LOG(VIDEO, "Invalid D3D decl"); -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp deleted file mode 100644 index 8a1d5c59a9..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "RenderBase.h" - -#include "D3DBase.h" -#include "PerfQuery.h" - -namespace DX9 { - -PerfQuery::PerfQuery() - : m_query_read_pos() - , m_query_count() -{ - -} - -PerfQuery::~PerfQuery() -{ - -} - -void PerfQuery::CreateDeviceObjects() -{ - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) - { - D3D::dev->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_query_buffer[i].query); - } - ResetQuery(); -} -void PerfQuery::DestroyDeviceObjects() -{ - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) - { - m_query_buffer[i].query->Release(); - } -} - -void PerfQuery::EnableQuery(PerfQueryGroup type) -{ - // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) - WeakFlush(); - - if (ARRAYSIZE(m_query_buffer) == m_query_count) - { - // TODO - FlushOne(); - ERROR_LOG(VIDEO, "Flushed query buffer early!"); - } - - // start query - if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) - { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; - entry.query->Issue(D3DISSUE_BEGIN); - entry.query_type = type; - ++m_query_count; - } -} - -void PerfQuery::DisableQuery(PerfQueryGroup type) -{ - // stop query - if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) - { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ARRAYSIZE(m_query_buffer)-1) % ARRAYSIZE(m_query_buffer)]; - entry.query->Issue(D3DISSUE_END); - } -} - -void PerfQuery::ResetQuery() -{ - m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); -} - -u32 PerfQuery::GetQueryResult(PerfQueryType type) -{ - u32 result = 0; - - if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) - { - result = m_results[PQG_ZCOMP_ZCOMPLOC]; - } - else if (type == PQ_ZCOMP_INPUT || type == PQ_ZCOMP_OUTPUT) - { - result = m_results[PQG_ZCOMP]; - } - else if (type == PQ_BLEND_INPUT) - { - result = m_results[PQG_ZCOMP] + m_results[PQG_ZCOMP_ZCOMPLOC]; - } - else if (type == PQ_EFB_COPY_CLOCKS) - { - result = m_results[PQG_EFB_COPY_CLOCKS]; - } - - return result / 4; -} - -void PerfQuery::FlushOne() -{ - auto& entry = m_query_buffer[m_query_read_pos]; - - DWORD result = 0; - HRESULT hr = S_FALSE; - while (hr != S_OK && hr != D3DERR_DEVICELOST) - { - // TODO: Might cause us to be stuck in an infinite loop! - hr = entry.query->GetData(&result, sizeof(result), D3DGETDATA_FLUSH); - } - - // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u32)((u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); - --m_query_count; -} - -// TODO: could selectively flush things, but I don't think that will do much -void PerfQuery::FlushResults() -{ - while (!IsFlushed()) - FlushOne(); -} - -void PerfQuery::WeakFlush() -{ - while (!IsFlushed()) - { - auto& entry = m_query_buffer[m_query_read_pos]; - - DWORD result = 0; - HRESULT hr = entry.query->GetData(&result, sizeof(result), 0); - - if (hr == S_OK) - { - // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u32)((u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); - --m_query_count; - } - else - { - break; - } - } -} - -bool PerfQuery::IsFlushed() const -{ - return 0 == m_query_count; -} - - -} // namespace diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.h b/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.h deleted file mode 100644 index 9b8f637655..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _PERFQUERY_H_ -#define _PERFQUERY_H_ - -#include "PerfQueryBase.h" - -namespace DX9 { - -class PerfQuery : public PerfQueryBase -{ -public: - PerfQuery(); - ~PerfQuery(); - - void EnableQuery(PerfQueryGroup type); - void DisableQuery(PerfQueryGroup type); - void ResetQuery(); - u32 GetQueryResult(PerfQueryType type); - void FlushResults(); - bool IsFlushed() const; - void CreateDeviceObjects(); - void DestroyDeviceObjects(); - -private: - struct ActiveQuery - { - IDirect3DQuery9* query; - PerfQueryGroup query_type; - }; - - void WeakFlush(); - // Only use when non-empty - void FlushOne(); - - // when testing in SMS: 64 was too small, 128 was ok - static const int PERF_QUERY_BUFFER_SIZE = 512; - - ActiveQuery m_query_buffer[PERF_QUERY_BUFFER_SIZE]; - int m_query_read_pos; - - // TODO: sloppy - volatile int m_query_count; - volatile u32 m_results[PQG_NUM_MEMBERS]; -}; - -} // namespace - -#endif // _PERFQUERY_H_ diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp deleted file mode 100644 index a4a788c7e3..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include -#include -#include - -#include "Common.h" -#include "Hash.h" -#include "FileUtil.h" -#include "LinearDiskCache.h" - -#include "Globals.h" -#include "D3DBase.h" -#include "D3DShader.h" -#include "Statistics.h" -#include "VideoConfig.h" -#include "PixelShaderGen.h" -#include "PixelShaderManager.h" -#include "PixelShaderCache.h" -#include "VertexLoader.h" -#include "BPMemory.h" -#include "XFMemory.h" -#include "ImageWrite.h" -#include "Debugger.h" -#include "ConfigManager.h" - -namespace DX9 -{ - -PixelShaderCache::PSCache PixelShaderCache::PixelShaders; -const PixelShaderCache::PSCacheEntry *PixelShaderCache::last_entry; -PixelShaderUid PixelShaderCache::last_uid; -UidChecker PixelShaderCache::pixel_uid_checker; - -static LinearDiskCache g_ps_disk_cache; -static std::set unique_shaders; - -#define MAX_SSAA_SHADERS 3 -enum -{ - COPY_TYPE_DIRECT, - COPY_TYPE_MATRIXCOLOR, - NUM_COPY_TYPES -}; -enum -{ - DEPTH_CONVERSION_TYPE_NONE, - DEPTH_CONVERSION_TYPE_ON, - NUM_DEPTH_CONVERSION_TYPES -}; - -static LPDIRECT3DPIXELSHADER9 s_CopyProgram[NUM_COPY_TYPES][NUM_DEPTH_CONVERSION_TYPES][MAX_SSAA_SHADERS]; -static LPDIRECT3DPIXELSHADER9 s_ClearProgram = NULL; -static LPDIRECT3DPIXELSHADER9 s_rgba6_to_rgb8 = NULL; -static LPDIRECT3DPIXELSHADER9 s_rgb8_to_rgba6 = NULL; - -class PixelShaderCacheInserter : public LinearDiskCacheReader -{ -public: - void Read(const PixelShaderUid &key, const u8 *value, u32 value_size) - { - PixelShaderCache::InsertByteCode(key, value, value_size, false); - } -}; - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetColorMatrixProgram(int SSAAMode) -{ - return s_CopyProgram[COPY_TYPE_MATRIXCOLOR][DEPTH_CONVERSION_TYPE_NONE][SSAAMode % MAX_SSAA_SHADERS]; -} - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetDepthMatrixProgram(int SSAAMode, bool depthConversion) -{ - return s_CopyProgram[COPY_TYPE_MATRIXCOLOR][depthConversion ? DEPTH_CONVERSION_TYPE_ON : DEPTH_CONVERSION_TYPE_NONE][SSAAMode % MAX_SSAA_SHADERS]; -} - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetColorCopyProgram(int SSAAMode) -{ - return s_CopyProgram[COPY_TYPE_DIRECT][DEPTH_CONVERSION_TYPE_NONE][SSAAMode % MAX_SSAA_SHADERS]; -} - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetClearProgram() -{ - return s_ClearProgram; -} - -static LPDIRECT3DPIXELSHADER9 s_rgb8 = NULL; -static LPDIRECT3DPIXELSHADER9 s_rgba6 = NULL; - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::ReinterpRGBA6ToRGB8() -{ - const char code[] = - { - "uniform sampler samp0 : register(s0);\n" - "void main(\n" - " out float4 ocol0 : COLOR0,\n" - " in float2 uv0 : TEXCOORD0){\n" - " ocol0 = tex2D(samp0,uv0);\n" - " float4 src6 = round(ocol0 * 63.f);\n" - " ocol0.r = floor(src6.r*4.f) + floor(src6.g/16.f);\n" // dst8r = (src6r<<2)|(src6g>>4); - " ocol0.g = frac(src6.g/16.f)*16.f*16.f + floor(src6.b/4.f);\n" // dst8g = ((src6g&0xF)<<4)|(src6b>>2); - " ocol0.b = frac(src6.b/4.f)*4.f*64.f + src6.a;\n" // dst8b = ((src6b&0x3)<<6)|src6a; - " ocol0.a = 255.f;\n" - " ocol0 /= 255.f;\n" - "}\n" - }; - - if (!s_rgba6_to_rgb8) - s_rgba6_to_rgb8 = D3D::CompileAndCreatePixelShader(code, (int)strlen(code)); - - return s_rgba6_to_rgb8; -} - -LPDIRECT3DPIXELSHADER9 PixelShaderCache::ReinterpRGB8ToRGBA6() -{ - /* old code here for reference - const char code[] = - { - "uniform sampler samp0 : register(s0);\n" - "void main(\n" - " out float4 ocol0 : COLOR0,\n" - " in float2 uv0 : TEXCOORD0){\n" - " ocol0 = tex2D(samp0,uv0);\n" - " float4 src8 = round(ocol0*255.f);\n" - " ocol0.r = floor(src8.r/4.f);\n" // dst6r = src8r>>2; - " ocol0.g = frac(src8.r/4.f)*4.f*16.f + floor(src8.g/16.f);\n" // dst6g = ((src8r&0x3)<<4)|(src8g>>4); - " ocol0.b = frac(src8.g/16.f)*16.f*4.f + floor(src8.b/64.f);\n" // dst6b = ((src8g&0xF)<<2)|(src8b>>6); - " ocol0.a = frac(src8.b/64.f)*64.f;\n" // dst6a = src8b&0x3F; - " ocol0 /= 63.f;\n" - "}\n" - }; - */ - const char code[] = - { - "uniform sampler samp0 : register(s0);\n" - "void main(\n" - "out float4 ocol0 : COLOR0,\n" - "in float2 uv0 : TEXCOORD0){\n" - "float4 temp1 = float4(1.0f/4.0f,1.0f/16.0f,1.0f/64.0f,0.0f);\n" - "float4 temp2 = float4(1.0f,64.0f,255.0f,1.0f/63.0f);\n" - "float4 src8 = round(tex2D(samp0,uv0)*temp2.z) * temp1;\n" - "ocol0 = (frac(src8.wxyz) * temp2.xyyy + floor(src8)) * temp2.w;\n" - "}\n" - }; - if (!s_rgb8_to_rgba6) s_rgb8_to_rgba6 = D3D::CompileAndCreatePixelShader(code, (int)strlen(code)); - return s_rgb8_to_rgba6; -} - -#define WRITE p+=sprintf - -static LPDIRECT3DPIXELSHADER9 CreateCopyShader(int copyMatrixType, int depthConversionType, int SSAAMode) -{ - //Used for Copy/resolve the color buffer - //Color conversion Programs - //Depth copy programs - // this should create the same shaders as before (plus some extras added for DF16), just... more manageably than listing the full program for each combination - char text[3072]; - - locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation - locale_t old_locale = uselocale(locale); // Apply the locale for this thread - text[sizeof(text) - 1] = 0x7C; // canary - - char* p = text; - WRITE(p, "// Copy/Color Matrix/Depth Matrix shader (matrix=%d, depth=%d, ssaa=%d)\n", copyMatrixType, depthConversionType, SSAAMode); - - WRITE(p, "uniform sampler samp0 : register(s0);\n"); - if(copyMatrixType == COPY_TYPE_MATRIXCOLOR) - WRITE(p, "uniform float4 cColMatrix[7] : register(c%d);\n", C_COLORMATRIX); - WRITE(p, "void main(\n" - "out float4 ocol0 : COLOR0,\n"); - - switch(SSAAMode % MAX_SSAA_SHADERS) - { - case 0: // 1 Sample - WRITE(p, "in float2 uv0 : TEXCOORD0,\n" - "in float uv1 : TEXCOORD1){\n" - "float4 texcol = tex2D(samp0,uv0.xy);\n"); - break; - case 1: // 1 Samples SSAA - WRITE(p, "in float2 uv0 : TEXCOORD0,\n" - "in float uv1 : TEXCOORD1){\n" - "float4 texcol = tex2D(samp0,uv0.xy);\n"); - break; - case 2: // 4 Samples SSAA - WRITE(p, "in float4 uv0 : TEXCOORD0,\n" - "in float uv1 : TEXCOORD1,\n" - "in float4 uv2 : TEXCOORD2,\n" - "in float4 uv3 : TEXCOORD3){\n" - "float4 texcol = (tex2D(samp0,uv2.xy) + tex2D(samp0,uv2.wz) + tex2D(samp0,uv3.xy) + tex2D(samp0,uv3.wz))*0.25f;\n"); - break; - } - - if(depthConversionType != DEPTH_CONVERSION_TYPE_NONE) - { - // Watch out for the fire fumes effect in Metroid it's really sensitive to this, - // the lighting in RE0 is also way beyond sensitive since the "good value" is hardcoded and Dolphin is almost always off. - WRITE(p, "float4 EncodedDepth = frac(texcol.r * (16777215.f/16777216.f) * float4(1.0f,256.0f,256.0f*256.0f,1.0f));\n" - "texcol = floor(EncodedDepth * float4(256.f,256.f,256.f,15.0f)) / float4(255.0f,255.0f,255.0f,15.0f);\n"); - } - else - { - //Apply Gamma Correction - WRITE(p, "texcol = pow(texcol,uv1.xxxx);\n"); - } - - if(copyMatrixType == COPY_TYPE_MATRIXCOLOR) - { - if(depthConversionType == DEPTH_CONVERSION_TYPE_NONE) - WRITE(p, "texcol = round(texcol * cColMatrix[5])*cColMatrix[6];\n"); - - WRITE(p, "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"); - } - else - WRITE(p, "ocol0 = texcol;\n"); - - WRITE(p, "}\n"); - if (text[sizeof(text) - 1] != 0x7C) - PanicAlert("PixelShaderCache copy shader generator - buffer too small, canary has been eaten!"); - - uselocale(old_locale); // restore locale - freelocale(locale); - return D3D::CompileAndCreatePixelShader(text, (int)strlen(text)); -} - -void PixelShaderCache::Init() -{ - last_entry = NULL; - - //program used for clear screen - { - char pprog[3072]; - sprintf(pprog, "void main(\n" - "out float4 ocol0 : COLOR0,\n" - " in float4 incol0 : COLOR0){\n" - "ocol0 = incol0;\n" - "}\n"); - s_ClearProgram = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - } - - int shaderModel = ((D3D::GetCaps().PixelShaderVersion >> 8) & 0xFF); - int maxConstants = (shaderModel < 3) ? 32 : ((shaderModel < 4) ? 224 : 65536); - - // other screen copy/convert programs - for(int copyMatrixType = 0; copyMatrixType < NUM_COPY_TYPES; copyMatrixType++) - { - for(int depthType = 0; depthType < NUM_DEPTH_CONVERSION_TYPES; depthType++) - { - for(int ssaaMode = 0; ssaaMode < MAX_SSAA_SHADERS; ssaaMode++) - { - if(ssaaMode && !s_CopyProgram[copyMatrixType][depthType][ssaaMode-1] - || depthType && !s_CopyProgram[copyMatrixType][depthType-1][ssaaMode] - || copyMatrixType && !s_CopyProgram[copyMatrixType-1][depthType][ssaaMode]) - { - // if it failed at a lower setting, it's going to fail here for the same reason it did there, - // so skip this attempt to avoid duplicate error messages. - s_CopyProgram[copyMatrixType][depthType][ssaaMode] = NULL; - } - else - { - s_CopyProgram[copyMatrixType][depthType][ssaaMode] = CreateCopyShader(copyMatrixType, depthType, ssaaMode); - } - } - } - } - - Clear(); - - if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) - File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); - - SETSTAT(stats.numPixelShadersCreated, 0); - SETSTAT(stats.numPixelShadersAlive, 0); - - char cache_filename[MAX_PATH]; - sprintf(cache_filename, "%sdx9-%s-ps.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); - PixelShaderCacheInserter inserter; - g_ps_disk_cache.OpenAndRead(cache_filename, inserter); - - if (g_Config.bEnableShaderDebugging) - Clear(); -} - -// ONLY to be used during shutdown. -void PixelShaderCache::Clear() -{ - for (PSCache::iterator iter = PixelShaders.begin(); iter != PixelShaders.end(); iter++) - iter->second.Destroy(); - PixelShaders.clear(); - pixel_uid_checker.Invalidate(); - - last_entry = NULL; -} - -void PixelShaderCache::Shutdown() -{ - for(int copyMatrixType = 0; copyMatrixType < NUM_COPY_TYPES; copyMatrixType++) - for(int depthType = 0; depthType < NUM_DEPTH_CONVERSION_TYPES; depthType++) - for(int ssaaMode = 0; ssaaMode < MAX_SSAA_SHADERS; ssaaMode++) - if(s_CopyProgram[copyMatrixType][depthType][ssaaMode] - && (copyMatrixType == 0 || s_CopyProgram[copyMatrixType][depthType][ssaaMode] != s_CopyProgram[copyMatrixType-1][depthType][ssaaMode])) - s_CopyProgram[copyMatrixType][depthType][ssaaMode]->Release(); - - for(int copyMatrixType = 0; copyMatrixType < NUM_COPY_TYPES; copyMatrixType++) - for(int depthType = 0; depthType < NUM_DEPTH_CONVERSION_TYPES; depthType++) - for(int ssaaMode = 0; ssaaMode < MAX_SSAA_SHADERS; ssaaMode++) - s_CopyProgram[copyMatrixType][depthType][ssaaMode] = NULL; - - if (s_ClearProgram) s_ClearProgram->Release(); - s_ClearProgram = NULL; - if (s_rgb8_to_rgba6) s_rgb8_to_rgba6->Release(); - s_rgb8_to_rgba6 = NULL; - if (s_rgba6_to_rgb8) s_rgba6_to_rgb8->Release(); - s_rgba6_to_rgb8 = NULL; - - - Clear(); - g_ps_disk_cache.Sync(); - g_ps_disk_cache.Close(); - - unique_shaders.clear(); -} - -bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components) -{ - const API_TYPE api = ((D3D::GetCaps().PixelShaderVersion >> 8) & 0xFF) < 3 ? API_D3D9_SM20 : API_D3D9_SM30; - PixelShaderUid uid; - GetPixelShaderUid(uid, dstAlphaMode, API_D3D9, components); - if (g_ActiveConfig.bEnableShaderDebugging) - { - PixelShaderCode code; - GeneratePixelShaderCode(code, dstAlphaMode, API_D3D9, components); - pixel_uid_checker.AddToIndexAndCheck(code, uid, "Pixel", "p"); - } - - // Check if the shader is already set - if (last_entry) - { - if (uid == last_uid) - { - GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); - return last_entry->shader != NULL; - } - } - - last_uid = uid; - - // Check if the shader is already in the cache - PSCache::iterator iter; - iter = PixelShaders.find(uid); - if (iter != PixelShaders.end()) - { - const PSCacheEntry &entry = iter->second; - last_entry = &entry; - - if (entry.shader) D3D::SetPixelShader(entry.shader); - GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); - return (entry.shader != NULL); - } - - - // Need to compile a new shader - PixelShaderCode code; - GeneratePixelShaderCode(code, dstAlphaMode, api, components); - - if (g_ActiveConfig.bEnableShaderDebugging) - { - u32 code_hash = HashAdler32((const u8 *)code.GetBuffer(), strlen(code.GetBuffer())); - unique_shaders.insert(code_hash); - SETSTAT(stats.numUniquePixelShaders, unique_shaders.size()); - } - -#if defined(_DEBUG) || defined(DEBUGFAST) - if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { - static int counter = 0; - char szTemp[MAX_PATH]; - sprintf(szTemp, "%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); - - SaveData(szTemp, code.GetBuffer()); - } -#endif - - u8 *bytecode = 0; - int bytecodelen = 0; - if (!D3D::CompilePixelShader(code.GetBuffer(), (int)strlen(code.GetBuffer()), &bytecode, &bytecodelen)) { - GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); - return false; - } - - // Insert the bytecode into the caches - g_ps_disk_cache.Append(uid, bytecode, bytecodelen); - - // And insert it into the shader cache. - bool success = InsertByteCode(uid, bytecode, bytecodelen, true); - delete [] bytecode; - - if (g_ActiveConfig.bEnableShaderDebugging && success) - { - PixelShaders[uid].code = code.GetBuffer(); - } - - GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); - return success; -} - -bool PixelShaderCache::InsertByteCode(const PixelShaderUid &uid, const u8 *bytecode, int bytecodelen, bool activate) -{ - LPDIRECT3DPIXELSHADER9 shader = D3D::CreatePixelShaderFromByteCode(bytecode, bytecodelen); - - // Make an entry in the table - PSCacheEntry newentry; - newentry.shader = shader; - PixelShaders[uid] = newentry; - last_entry = &PixelShaders[uid]; - - if (!shader) { - // INCSTAT(stats.numPixelShadersFailed); - return false; - } - - INCSTAT(stats.numPixelShadersCreated); - SETSTAT(stats.numPixelShadersAlive, PixelShaders.size()); - if (activate) - { - D3D::SetPixelShader(shader); - } - return true; -} - -void Renderer::SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - float f[4] = { f1, f2, f3, f4 }; - DX9::D3D::dev->SetPixelShaderConstantF(const_number, f, 1); -} - -void Renderer::SetPSConstant4fv(unsigned int const_number, const float *f) -{ - DX9::D3D::dev->SetPixelShaderConstantF(const_number, f, 1); -} - -void Renderer::SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - DX9::D3D::dev->SetPixelShaderConstantF(const_number, f, count); -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.h b/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.h deleted file mode 100644 index 733a68233a..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "Common.h" -#include "LinearDiskCache.h" -#include "D3DBase.h" - -#include - -#include "PixelShaderGen.h" -#include "VertexShaderGen.h" - -namespace DX9 -{ - -typedef u32 tevhash; - -tevhash GetCurrentTEV(); - -class PixelShaderCache -{ -private: - struct PSCacheEntry - { - LPDIRECT3DPIXELSHADER9 shader; - bool owns_shader; - - std::string code; - - PSCacheEntry() : shader(NULL), owns_shader(true) {} - void Destroy() - { - if (shader && owns_shader) - shader->Release(); - shader = NULL; - } - }; - - typedef std::map PSCache; - - static PSCache PixelShaders; - static const PSCacheEntry *last_entry; - static PixelShaderUid last_uid; - static UidChecker pixel_uid_checker; - - static void Clear(); - -public: - static void Init(); - static void Shutdown(); - static bool SetShader(DSTALPHA_MODE dstAlphaMode, u32 componets); - static bool InsertByteCode(const PixelShaderUid &uid, const u8 *bytecode, int bytecodelen, bool activate); - static LPDIRECT3DPIXELSHADER9 GetColorMatrixProgram(int SSAAMode); - static LPDIRECT3DPIXELSHADER9 GetColorCopyProgram(int SSAAMode); - static LPDIRECT3DPIXELSHADER9 GetDepthMatrixProgram(int SSAAMode, bool depthConversion); - static LPDIRECT3DPIXELSHADER9 GetClearProgram(); - static LPDIRECT3DPIXELSHADER9 ReinterpRGBA6ToRGB8(); - static LPDIRECT3DPIXELSHADER9 ReinterpRGB8ToRGBA6(); -}; - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp deleted file mode 100644 index 625db5f44e..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ /dev/null @@ -1,1386 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include -#include - -#include "StringUtil.h" -#include "Common.h" -#include "Atomic.h" -#include "FileUtil.h" -#include "Thread.h" -#include "Timer.h" -#include "Statistics.h" -#include "Host.h" - -#include "VideoConfig.h" -#include "main.h" -#include "VertexManager.h" -#include "PixelEngine.h" -#include "Render.h" -#include "OpcodeDecoding.h" -#include "BPStructs.h" -#include "XFStructs.h" -#include "D3DUtil.h" -#include "VertexShaderManager.h" -#include "PixelShaderManager.h" -#include "VertexShaderCache.h" -#include "PixelShaderCache.h" -#include "VertexLoaderManager.h" -#include "TextureCache.h" -#include "EmuWindow.h" -#include "AVIDump.h" -#include "OnScreenDisplay.h" -#include "FramebufferManager.h" -#include "Fifo.h" -#include "TextureConverter.h" -#include "DLCache.h" -#include "Debugger.h" -#include "Core.h" -#include "Movie.h" -#include "BPFunctions.h" -#include "FPSCounter.h" -#include "ConfigManager.h" -#include "PerfQuery.h" -#include - - -namespace DX9 -{ - -static int s_fps = 0; - -static u32 s_blendMode; -static u32 s_LastAA; -static bool IS_AMD; -static float m_fMaxPointSize; -static bool s_vsync; -static char *st; - -static LPDIRECT3DSURFACE9 ScreenShootMEMSurface = NULL; - - -void SetupDeviceObjects() -{ - D3D::font.Init(); - VertexLoaderManager::Init(); - g_framebuffer_manager = new FramebufferManager; - - VertexShaderManager::Dirty(); - PixelShaderManager::Dirty(); - TextureConverter::Init(); - - // To avoid shader compilation stutters, read back all shaders from cache. - VertexShaderCache::Init(); - PixelShaderCache::Init(); - g_vertex_manager->CreateDeviceObjects(); - ((PerfQuery*)g_perf_query)->CreateDeviceObjects(); - // Texture cache will recreate themselves over time. -} - -// Kill off all POOL_DEFAULT device objects. -void TeardownDeviceObjects() -{ - if(ScreenShootMEMSurface) - ScreenShootMEMSurface->Release(); - ScreenShootMEMSurface = NULL; - D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface()); - D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface()); - delete g_framebuffer_manager; - ((PerfQuery*)g_perf_query)->DestroyDeviceObjects(); - D3D::font.Shutdown(); - TextureCache::Invalidate(); - VertexLoaderManager::Shutdown(); - VertexShaderCache::Shutdown(); - PixelShaderCache::Shutdown(); - TextureConverter::Shutdown(); - g_vertex_manager->DestroyDeviceObjects(); -} - -// Init functions -Renderer::Renderer() -{ - InitFPSCounter(); - - st = new char[32768]; - - int fullScreenRes, x, y, w_temp, h_temp; - s_blendMode = 0; - // Multisample Anti-aliasing hasn't been implemented yet use supersamling instead - int backbuffer_ms_mode = 0; - - Host_GetRenderWindowSize(x, y, w_temp, h_temp); - - for (fullScreenRes = 0; fullScreenRes < (int)D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions.size(); fullScreenRes++) - { - if ((D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions[fullScreenRes].xres == w_temp) && - (D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions[fullScreenRes].yres == h_temp)) - break; - } - if (fullScreenRes == D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions.size()) - fullScreenRes = 0; - - D3D::Create(g_ActiveConfig.iAdapter, EmuWindow::GetWnd(), - fullScreenRes, backbuffer_ms_mode, false); - - IS_AMD = D3D::IsATIDevice(); - - // Decide framebuffer size - s_backbuffer_width = D3D::GetBackBufferWidth(); - s_backbuffer_height = D3D::GetBackBufferHeight(); - - FramebufferManagerBase::SetLastXfbWidth(MAX_XFB_WIDTH); - FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); - - UpdateDrawRectangle(s_backbuffer_width, s_backbuffer_height); - - s_LastAA = g_ActiveConfig.iMultisampleMode; - int SupersampleCoeficient = (s_LastAA % 3) + 1; - - s_LastEFBScale = g_ActiveConfig.iEFBScale; - CalculateTargetSize(s_backbuffer_width, s_backbuffer_height, SupersampleCoeficient); - - // Make sure to use valid texture sizes - D3D::FixTextureSize(s_target_width, s_target_height); - - // We're not using fixed function. - // Let's just set the matrices to identity to be sure. - D3DXMATRIX mtx; - D3DXMatrixIdentity(&mtx); - D3D::dev->SetTransform(D3DTS_VIEW, &mtx); - D3D::dev->SetTransform(D3DTS_WORLD, &mtx); - - SetupDeviceObjects(); - - for (int stage = 0; stage < 8; stage++) - D3D::SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, 1 << g_ActiveConfig.iMaxAnisotropy); - - D3DVIEWPORT9 vp; - vp.X = 0; - vp.Y = 0; - vp.Width = s_backbuffer_width; - vp.Height = s_backbuffer_height; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 0, 0); - - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - vp.X = 0; - vp.Y = 0; - vp.Width = s_target_width; - vp.Height = s_target_height; - D3D::dev->SetViewport(&vp); - D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); - D3D::BeginFrame(); - D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, true); - D3D::dev->CreateOffscreenPlainSurface(s_backbuffer_width,s_backbuffer_height, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &ScreenShootMEMSurface, NULL ); - D3D::SetRenderState(D3DRS_POINTSCALEENABLE,false); - m_fMaxPointSize = D3D::GetCaps().MaxPointSize; - // Handle VSync on/off - s_vsync = g_ActiveConfig.IsVSync(); -} - -Renderer::~Renderer() -{ - TeardownDeviceObjects(); - D3D::EndFrame(); - D3D::Present(); - D3D::Close(); - - delete[] st; -} - -void Renderer::RenderText(const char *text, int left, int top, u32 color) -{ - D3D::font.DrawTextScaled((float)left, (float)top, 20, 20, 0.0f, color, text); -} - -TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc) -{ - TargetRectangle result; - result.left = EFBToScaledX(rc.left); - result.top = EFBToScaledY(rc.top); - result.right = EFBToScaledX(rc.right); - result.bottom = EFBToScaledY(rc.bottom); - return result; -} - -} - -void formatBufferDump(const u8* in, u8* out, int w, int h, int p) -{ - for (int y = 0; y < h; y++) - { - auto line = in + (h - y - 1) * p; - for (int x = 0; x < w; x++) - { - memcpy(out, line, 3); - out += 3; - line += 4; - } - } -} - -namespace DX9 -{ - -// With D3D, we have to resize the backbuffer if the window changed -// size. -bool Renderer::CheckForResize() -{ - while (EmuWindow::IsSizing()) - Sleep(10); - - if (EmuWindow::GetParentWnd()) - { - // Re-stretch window to parent window size again, if it has a parent window. - RECT rcParentWindow; - GetWindowRect(EmuWindow::GetParentWnd(), &rcParentWindow); - int width = rcParentWindow.right - rcParentWindow.left; - int height = rcParentWindow.bottom - rcParentWindow.top; - if (width != Renderer::GetBackbufferWidth() || height != Renderer::GetBackbufferHeight()) - MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE); - } - - RECT rcWindow; - GetClientRect(EmuWindow::GetWnd(), &rcWindow); - int client_width = rcWindow.right - rcWindow.left; - int client_height = rcWindow.bottom - rcWindow.top; - - // Sanity check - if ((client_width != Renderer::GetBackbufferWidth() || - client_height != Renderer::GetBackbufferHeight()) && - client_width >= 4 && client_height >= 4) - { - TeardownDeviceObjects(); - - D3D::Reset(); - s_backbuffer_width = D3D::GetBackBufferWidth(); - s_backbuffer_height = D3D::GetBackBufferHeight(); - if(ScreenShootMEMSurface) - ScreenShootMEMSurface->Release(); - D3D::dev->CreateOffscreenPlainSurface(Renderer::GetBackbufferWidth(), Renderer::GetBackbufferHeight(), - D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &ScreenShootMEMSurface, NULL ); - - return true; - } - - return false; -} - -void Renderer::SetScissorRect(const TargetRectangle& rc) -{ - D3D::dev->SetScissorRect(rc.AsRECT()); -} - -void Renderer::SetColorMask() -{ - // Only enable alpha channel if it's supported by the current EFB format - DWORD color_mask = 0; - if (bpmem.alpha_test.TestResult() != AlphaTest::FAIL) - { - if (bpmem.blendmode.alphaupdate && (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24)) - color_mask = D3DCOLORWRITEENABLE_ALPHA; - if (bpmem.blendmode.colorupdate) - color_mask |= D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; - } - D3D::SetRenderState(D3DRS_COLORWRITEENABLE, color_mask); -} - -// This function allows the CPU to directly access the EFB. -// There are EFB peeks (which will read the color or depth of a pixel) -// and EFB pokes (which will change the color or depth of a pixel). -// -// The behavior of EFB peeks can only be modified by: -// - GX_PokeAlphaRead -// The behavior of EFB pokes can be modified by: -// - GX_PokeAlphaMode (TODO) -// - GX_PokeAlphaUpdate (TODO) -// - GX_PokeBlendMode (TODO) -// - GX_PokeColorUpdate (TODO) -// - GX_PokeDither (TODO) -// - GX_PokeDstAlpha (TODO) -// - GX_PokeZMode (TODO) -u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) -{ - if (!g_ActiveConfig.bEFBAccessEnable) - return 0; - - if (type == POKE_Z) - { - static bool alert_only_once = true; - if (!alert_only_once) return 0; - PanicAlert("EFB: Poke Z not implemented (tried to poke z value %#x at (%d,%d))", poke_data, x, y); - alert_only_once = false; - return 0; - } - - // if depth textures aren't supported by the hardware, just return - if (type == PEEK_Z) - if (FramebufferManager::GetEFBDepthTexture() == NULL) - return 0; - - // We're using three surfaces here: - // - pEFBSurf: EFB Surface. Source surface when peeking, destination surface when poking. - // - pBufferRT: A render target surface. When peeking, we render a textured quad to this surface. - // - pSystemBuf: An offscreen surface. Used to retrieve the pixel data from pBufferRT. - LPDIRECT3DSURFACE9 pEFBSurf, pBufferRT, pSystemBuf; - if(type == PEEK_Z || type == POKE_Z) - { - pEFBSurf = FramebufferManager::GetEFBDepthRTSurface(); - pBufferRT = FramebufferManager::GetEFBDepthReadSurface(); - pSystemBuf = FramebufferManager::GetEFBDepthOffScreenRTSurface(); - } - else //if(type == PEEK_COLOR || type == POKE_COLOR) - { - pEFBSurf = FramebufferManager::GetEFBColorRTSurface(); - pBufferRT = FramebufferManager::GetEFBColorReadSurface(); - pSystemBuf = FramebufferManager::GetEFBColorOffScreenRTSurface(); - } - - // Buffer not found alert - if (!pEFBSurf) { - PanicAlert("No %s!", (type == PEEK_Z || type == POKE_Z) ? "Z-Buffer" : "Color EFB"); - return 0; - } - - // Convert EFB dimensions to the ones of our render target - EFBRectangle efbPixelRc; - efbPixelRc.left = x; - efbPixelRc.top = y; - efbPixelRc.right = x + 1; - efbPixelRc.bottom = y + 1; - - TargetRectangle targetPixelRc = ConvertEFBRectangle(efbPixelRc); - - HRESULT hr; - RECT RectToLock; - RectToLock.bottom = targetPixelRc.bottom; - RectToLock.left = targetPixelRc.left; - RectToLock.right = targetPixelRc.right; - RectToLock.top = targetPixelRc.top; - if (type == PEEK_Z) - { - // TODO: why is D3DFMT_D24X8 singled out here? why not D3DFMT_D24X4S4/D24S8/D24FS8/D32/D16/D15S1 too, or none of them? - if (FramebufferManager::GetEFBDepthRTSurfaceFormat() == D3DFMT_D24X8) - return 0; - - RECT PixelRect; - PixelRect.bottom = 4; - PixelRect.left = 0; - PixelRect.right = 4; - PixelRect.top = 0; - RectToLock.bottom+=2; - RectToLock.right+=1; - RectToLock.top-=1; - RectToLock.left-=2; - if ((RectToLock.bottom - RectToLock.top) > 4) - RectToLock.bottom--; - if ((RectToLock.right - RectToLock.left) > 4) - RectToLock.left++; - - ResetAPIState(); // Reset any game specific settings - D3D::dev->SetDepthStencilSurface(NULL); - D3D::dev->SetRenderTarget(0, pBufferRT); - - // Stretch picture with increased internal resolution - D3DVIEWPORT9 vp; - vp.X = 0; - vp.Y = 0; - vp.Width = 4; - vp.Height = 4; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - - float colmat[28] = {0.0f}; - colmat[0] = colmat[5] = colmat[10] = 1.0f; - PixelShaderManager::SetColorMatrix(colmat); // set transformation - LPDIRECT3DTEXTURE9 read_texture = FramebufferManager::GetEFBDepthTexture(); - - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - - D3DFORMAT bformat = FramebufferManager::GetEFBDepthRTSurfaceFormat(); - - D3D::drawShadedTexQuad( - read_texture, - &RectToLock, - Renderer::GetTargetWidth(), - Renderer::GetTargetHeight(), - 4, 4, - PixelShaderCache::GetDepthMatrixProgram(0, bformat != FOURCC_RAWZ), - VertexShaderCache::GetSimpleVertexShader(0)); - - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - RestoreAPIState(); - - // Retrieve the pixel data to the local memory buffer - RectToLock.bottom = 4; - RectToLock.left = 0; - RectToLock.right = 4; - RectToLock.top = 0; - D3D::dev->GetRenderTargetData(pBufferRT, pSystemBuf); - - // EFB data successfully retrieved, now get the pixel data - D3DLOCKED_RECT drect; - pSystemBuf->LockRect(&drect, &RectToLock, D3DLOCK_READONLY); - u32 z = ((u32*)drect.pBits)[6]; // 24 bit depth value - pSystemBuf->UnlockRect(); - - // if Z is in 16 bit format you must return a 16 bit integer - if(bpmem.zcontrol.pixel_format == PIXELFMT_RGB565_Z16) { - z >>= 8; - } - - return z; - } - else if(type == PEEK_COLOR) - { - // We can't directly StretchRect to System buf because is not supported by all implementations - // this is the only safe path that works in most cases - hr = D3D::dev->StretchRect(pEFBSurf, &RectToLock, pBufferRT, NULL, D3DTEXF_NONE); - D3D::dev->GetRenderTargetData(pBufferRT, pSystemBuf); - - // EFB data successfully retrieved, now get the pixel data - RectToLock.bottom = 1; - RectToLock.left = 0; - RectToLock.right = 1; - RectToLock.top = 0; - - D3DLOCKED_RECT drect; - pSystemBuf->LockRect(&drect, &RectToLock, D3DLOCK_READONLY); - u32 ret = ((u32*)drect.pBits)[0]; - pSystemBuf->UnlockRect(); - - // check what to do with the alpha channel (GX_PokeAlphaRead) - PixelEngine::UPEAlphaReadReg alpha_read_mode; - PixelEngine::Read16((u16&)alpha_read_mode, PE_ALPHAREAD); - - if (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24) - { - ret = RGBA8ToRGBA6ToRGBA8(ret); - } - else if (bpmem.zcontrol.pixel_format == PIXELFMT_RGB565_Z16) - { - ret = RGBA8ToRGB565ToRGBA8(ret); - } - if(bpmem.zcontrol.pixel_format != PIXELFMT_RGBA6_Z24) - { - ret |= 0xFF000000; - } - - if(alpha_read_mode.ReadMode == 2) return ret; // GX_READ_NONE - else if(alpha_read_mode.ReadMode == 1) return (ret | 0xFF000000); // GX_READ_FF - else return (ret & 0x00FFFFFF); // GX_READ_00 - } - else //if(type == POKE_COLOR) - { - // TODO: Speed this up by batching pokes? - ResetAPIState(); - D3D::drawColorQuad(poke_data, - (float)RectToLock.left * 2.f / (float)Renderer::GetTargetWidth() - 1.f, - - (float)RectToLock.top * 2.f / (float)Renderer::GetTargetHeight() + 1.f, - (float)RectToLock.right * 2.f / (float)Renderer::GetTargetWidth() - 1.f, - - (float)RectToLock.bottom * 2.f / (float)Renderer::GetTargetHeight() + 1.f); - RestoreAPIState(); - return 0; - } -} - -// Viewport correction: -// Say you want a viewport at (ix, iy) with size (iw, ih), -// but your viewport must be clamped at (ax, ay) with size (aw, ah). -// Just multiply the projection matrix with the following to get the same -// effect: -// [ (iw/aw) 0 0 ((iw - 2*(ax-ix)) / aw - 1) ] -// [ 0 (ih/ah) 0 ((-ih + 2*(ay-iy)) / ah + 1) ] -// [ 0 0 1 0 ] -// [ 0 0 0 1 ] -static void ViewportCorrectionMatrix(Matrix44& result, - float ix, float iy, float iw, float ih, // Intended viewport (x, y, width, height) - float ax, float ay, float aw, float ah) // Actual viewport (x, y, width, height) -{ - Matrix44::LoadIdentity(result); - if (aw == 0.f || ah == 0.f) - return; - result.data[4*0+0] = iw / aw; - result.data[4*0+3] = (iw - 2.f * (ax - ix)) / aw - 1.f; - result.data[4*1+1] = ih / ah; - result.data[4*1+3] = (-ih + 2.f * (ay - iy)) / ah + 1.f; -} - -// Called from VertexShaderManager -void Renderer::UpdateViewport(Matrix44& vpCorrection) -{ - // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) - // [0] = width/2 - // [1] = height/2 - // [2] = 16777215 * (farz - nearz) - // [3] = xorig + width/2 + 342 - // [4] = yorig + height/2 + 342 - // [5] = 16777215 * farz - - int scissorXOff = bpmem.scissorOffset.x * 2; - int scissorYOff = bpmem.scissorOffset.y * 2; - - // TODO: ceil, floor or just cast to int? - int intendedX = EFBToScaledX((int)ceil(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff)); - int intendedY = EFBToScaledY((int)ceil(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff)); - int intendedWd = EFBToScaledX((int)ceil(2.0f * xfregs.viewport.wd)); - int intendedHt = EFBToScaledY((int)ceil(-2.0f * xfregs.viewport.ht)); - if (intendedWd < 0) - { - intendedX += intendedWd; - intendedWd = -intendedWd; - } - if (intendedHt < 0) - { - intendedY += intendedHt; - intendedHt = -intendedHt; - } - - // In D3D, the viewport rectangle must fit within the render target. - int X = intendedX; - if (X < 0) - X = 0; - int Y = intendedY; - if (Y < 0) - Y = 0; - int Wd = intendedWd; - if (X + Wd > GetTargetWidth()) - Wd = GetTargetWidth() - X; - int Ht = intendedHt; - if (Y + Ht > GetTargetHeight()) - Ht = GetTargetHeight() - Y; - - // If GX viewport is off the render target, we must clamp our viewport - // within the bounds. Use the correction matrix to compensate. - ViewportCorrectionMatrix(vpCorrection, - (float)intendedX, (float)intendedY, (float)intendedWd, (float)intendedHt, - (float)X, (float)Y, (float)Wd, (float)Ht); - - D3DVIEWPORT9 vp; - vp.X = X; - vp.Y = Y; - vp.Width = Wd; - vp.Height = Ht; - - // Some games set invalids values for z min and z max so fix them to the max an min alowed and let the shaders do this work - vp.MinZ = 0.0f; // (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f; - vp.MaxZ = 1.0f; // xfregs.viewport.farZ / 16777216.0f; - D3D::dev->SetViewport(&vp); -} - -void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z) -{ - // Reset rendering pipeline while keeping color masks and depth buffer settings - ResetAPIState(); - - DWORD color_mask = 0; - if (alphaEnable) - color_mask = D3DCOLORWRITEENABLE_ALPHA; - if (colorEnable) - color_mask |= D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; - D3D::ChangeRenderState(D3DRS_COLORWRITEENABLE, color_mask); - - if (zEnable) - { - D3D::ChangeRenderState(D3DRS_ZENABLE, TRUE); - D3D::ChangeRenderState(D3DRS_ZWRITEENABLE, TRUE); - D3D::ChangeRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - } - else - { - D3D::ChangeRenderState(D3DRS_ZENABLE, FALSE); - } - - // Update the viewport for clearing the target EFB rect - TargetRectangle targetRc = ConvertEFBRectangle(rc); - D3DVIEWPORT9 vp; - vp.X = targetRc.left; - vp.Y = targetRc.top; - vp.Width = targetRc.GetWidth(); - vp.Height = targetRc.GetHeight(); - vp.MinZ = 0.0; - vp.MaxZ = 1.0; - D3D::dev->SetViewport(&vp); - D3D::drawClearQuad(color, (z & 0xFFFFFF) / float(0xFFFFFF), PixelShaderCache::GetClearProgram(), VertexShaderCache::GetClearVertexShader()); - RestoreAPIState(); -} - -void Renderer::ReinterpretPixelData(unsigned int convtype) -{ - RECT source; - SetRect(&source, 0, 0, g_renderer->GetTargetWidth(), g_renderer->GetTargetHeight()); - - LPDIRECT3DPIXELSHADER9 pixel_shader; - if (convtype == 0) pixel_shader = PixelShaderCache::ReinterpRGB8ToRGBA6(); - else if (convtype == 2) pixel_shader = PixelShaderCache::ReinterpRGBA6ToRGB8(); - else - { - ERROR_LOG(VIDEO, "Trying to reinterpret pixel data with unsupported conversion type %d", convtype); - return; - } - - // convert data and set the target texture as our new EFB - g_renderer->ResetAPIState(); - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorReinterpretSurface()); - D3DVIEWPORT9 vp; - vp.X = 0; - vp.Y = 0; - vp.Width = g_renderer->GetTargetWidth(); - vp.Height = g_renderer->GetTargetHeight(); - vp.MinZ = 0.0; - vp.MaxZ = 1.0; - D3D::dev->SetViewport(&vp); - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - D3D::drawShadedTexQuad(FramebufferManager::GetEFBColorTexture(), &source, - g_renderer->GetTargetWidth(), g_renderer->GetTargetHeight(), - g_renderer->GetTargetWidth(), g_renderer->GetTargetHeight(), - pixel_shader, VertexShaderCache::GetSimpleVertexShader(0)); - FramebufferManager::SwapReinterpretTexture(); - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - g_renderer->RestoreAPIState(); -} - -void Renderer::SetBlendMode(bool forceUpdate) -{ - // Our render target always uses an alpha channel, so we need to override the blend functions to assume a destination alpha of 1 if the render target isn't supposed to have an alpha channel - // Example: D3DBLEND_DESTALPHA needs to be D3DBLEND_ONE since the result without an alpha channel is assumed to always be 1. - bool target_has_alpha = bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - //bDstAlphaPass is taken into account because the ability to disable alpha composition is - //really useful for debugging shader and blending errors - bool use_DstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && target_has_alpha; - bool use_DualSource = use_DstAlpha && g_ActiveConfig.backend_info.bSupportsDualSourceBlend; - const D3DBLEND d3dSrcFactors[8] = - { - D3DBLEND_ZERO, - D3DBLEND_ONE, - D3DBLEND_DESTCOLOR, - D3DBLEND_INVDESTCOLOR, - (use_DualSource) ? D3DBLEND_SRCCOLOR2 : D3DBLEND_SRCALPHA, - (use_DualSource) ? D3DBLEND_INVSRCCOLOR2 : D3DBLEND_INVSRCALPHA, - (target_has_alpha) ? D3DBLEND_DESTALPHA : D3DBLEND_ONE, - (target_has_alpha) ? D3DBLEND_INVDESTALPHA : D3DBLEND_ZERO - }; - const D3DBLEND d3dDestFactors[8] = - { - D3DBLEND_ZERO, - D3DBLEND_ONE, - D3DBLEND_SRCCOLOR, - D3DBLEND_INVSRCCOLOR, - (use_DualSource) ? D3DBLEND_SRCCOLOR2 : D3DBLEND_SRCALPHA, - (use_DualSource) ? D3DBLEND_INVSRCCOLOR2 : D3DBLEND_INVSRCALPHA, - (target_has_alpha) ? D3DBLEND_DESTALPHA : D3DBLEND_ONE, - (target_has_alpha) ? D3DBLEND_INVDESTALPHA : D3DBLEND_ZERO - }; - - if (bpmem.blendmode.logicopenable && !forceUpdate) - { - D3D::SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE , false); - return; - } - - bool blend_enable = bpmem.blendmode.subtract || bpmem.blendmode.blendenable; - D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, blend_enable); - D3D::SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, blend_enable && g_ActiveConfig.backend_info.bSupportsSeparateAlphaFunction); - if (blend_enable) - { - D3DBLENDOP op = D3DBLENDOP_ADD; - u32 srcidx = bpmem.blendmode.srcfactor; - u32 dstidx = bpmem.blendmode.dstfactor; - if (bpmem.blendmode.subtract) - { - op = D3DBLENDOP_REVSUBTRACT; - srcidx = GX_BL_ONE; - dstidx = GX_BL_ONE; - } - D3D::SetRenderState(D3DRS_BLENDOP, op); - D3D::SetRenderState(D3DRS_SRCBLEND, d3dSrcFactors[srcidx]); - D3D::SetRenderState(D3DRS_DESTBLEND, d3dDestFactors[dstidx]); - if (g_ActiveConfig.backend_info.bSupportsSeparateAlphaFunction) - { - if (use_DualSource) - { - op = D3DBLENDOP_ADD; - srcidx = GX_BL_ONE; - dstidx = GX_BL_ZERO; - } - else - { - // we can't use D3DBLEND_DESTCOLOR or D3DBLEND_INVDESTCOLOR for source in alpha channel so use their alpha equivalent instead - if (srcidx == GX_BL_DSTCLR) srcidx = GX_BL_DSTALPHA; - if (srcidx == GX_BL_INVDSTCLR) srcidx = GX_BL_INVDSTALPHA; - // we can't use D3DBLEND_SRCCOLOR or D3DBLEND_INVSRCCOLOR for destination in alpha channel so use their alpha equivalent instead - if (dstidx == GX_BL_SRCCLR) dstidx = GX_BL_SRCALPHA; - if (dstidx == GX_BL_INVSRCCLR) dstidx = GX_BL_INVSRCALPHA; - } - D3D::SetRenderState(D3DRS_BLENDOPALPHA, op); - D3D::SetRenderState(D3DRS_SRCBLENDALPHA, d3dSrcFactors[srcidx]); - D3D::SetRenderState(D3DRS_DESTBLENDALPHA, d3dDestFactors[dstidx]); - } - } -} - -bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle &dst_rect) -{ - HRESULT hr = D3D::dev->GetRenderTargetData(D3D::GetBackBufferSurface(),ScreenShootMEMSurface); - if(FAILED(hr)) - { - PanicAlert("Error dumping surface data."); - return false; - } - hr = PD3DXSaveSurfaceToFileA(filename.c_str(), D3DXIFF_PNG, ScreenShootMEMSurface, NULL, dst_rect.AsRECT()); - if(FAILED(hr)) - { - PanicAlert("Error saving screen."); - return false; - } - - return true; -} - -// This function has the final picture. We adjust the aspect ratio here. -void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma) -{ - if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight) - { - if (g_ActiveConfig.bDumpFrames && !frame_data.empty()) - AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight); - - Core::Callback_VideoCopiedToXFB(false); - return; - } - - if (field == FIELD_LOWER) xfbAddr -= fbWidth * 2; - u32 xfbCount = 0; - const XFBSourceBase* const* xfbSourceList = FramebufferManager::GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount); - if ((!xfbSourceList || xfbCount == 0) && g_ActiveConfig.bUseXFB && !g_ActiveConfig.bUseRealXFB) - { - if (g_ActiveConfig.bDumpFrames && !frame_data.empty()) - AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight); - - Core::Callback_VideoCopiedToXFB(false); - return; - } - - ResetAPIState(); - - if(g_ActiveConfig.bAnaglyphStereo) - { - static bool RightFrame = false; - if(RightFrame) - { - D3D::SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN); - VertexShaderManager::ResetView(); - VertexShaderManager::TranslateView(-0.001f * g_ActiveConfig.iAnaglyphStereoSeparation,0.0f); - VertexShaderManager::RotateView(-0.0001f *g_ActiveConfig.iAnaglyphFocalAngle,0.0f); - RightFrame = false; - } - else - { - D3D::SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED); - VertexShaderManager::ResetView(); - VertexShaderManager::TranslateView(0.001f *g_ActiveConfig.iAnaglyphStereoSeparation,0.0f); - VertexShaderManager::RotateView(0.0001f * g_ActiveConfig.iAnaglyphFocalAngle,0.0f); - RightFrame = true; - } - } - - // Prepare to copy the XFBs to our backbuffer - D3D::dev->SetDepthStencilSurface(NULL); - D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface()); - - UpdateDrawRectangle(s_backbuffer_width, s_backbuffer_height); - D3DVIEWPORT9 vp; - - // Clear full target screen (edges, borders etc) - if(g_ActiveConfig.bAnaglyphStereo) { - // use a clear quad to keep old red or blue/green data - vp.X = 0; - vp.Y = 0; - vp.Width = s_backbuffer_width; - vp.Height = s_backbuffer_height; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - D3D::drawClearQuad(0, 1.0, PixelShaderCache::GetClearProgram(), VertexShaderCache::GetClearVertexShader()); - } - else - { - D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - } - - int X = GetTargetRectangle().left; - int Y = GetTargetRectangle().top; - int Width = GetTargetRectangle().right - GetTargetRectangle().left; - int Height = GetTargetRectangle().bottom - GetTargetRectangle().top; - - // Sanity check - if (X < 0) X = 0; - if (Y < 0) Y = 0; - if (X > s_backbuffer_width) X = s_backbuffer_width; - if (Y > s_backbuffer_height) Y = s_backbuffer_height; - if (Width < 0) Width = 0; - if (Height < 0) Height = 0; - if (Width > (s_backbuffer_width - X)) Width = s_backbuffer_width - X; - if (Height > (s_backbuffer_height - Y)) Height = s_backbuffer_height - Y; - - vp.X = X; - vp.Y = Y; - vp.Width = Width; - vp.Height = Height; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - - D3D::dev->SetViewport(&vp); - - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - - const XFBSourceBase* xfbSource = NULL; - - if(g_ActiveConfig.bUseXFB) - { - // draw each xfb source - // Render to the real buffer now. - for (u32 i = 0; i < xfbCount; ++i) - { - xfbSource = xfbSourceList[i]; - - MathUtil::Rectangle sourceRc; - - sourceRc.left = 0; - sourceRc.top = 0; - sourceRc.right = (float)xfbSource->texWidth; - sourceRc.bottom = (float)xfbSource->texHeight; - - MathUtil::Rectangle drawRc; - - if (g_ActiveConfig.bUseRealXFB) - { - drawRc.top = -1; - drawRc.bottom = 1; - drawRc.left = -1; - drawRc.right = 1; - } - else - { - // use virtual xfb with offset - int xfbHeight = xfbSource->srcHeight; - int xfbWidth = xfbSource->srcWidth; - int hOffset = ((s32)xfbSource->srcAddr - (s32)xfbAddr) / ((s32)fbWidth * 2); - - drawRc.bottom = 1.0f - (2.0f * (hOffset) / (float)fbHeight); - drawRc.top = 1.0f - (2.0f * (hOffset + xfbHeight) / (float)fbHeight); - drawRc.left = -(xfbWidth / (float)fbWidth); - drawRc.right = (xfbWidth / (float)fbWidth); - - // The following code disables auto stretch. Kept for reference. - // scale draw area for a 1 to 1 pixel mapping with the draw target - //float vScale = (float)fbHeight / (float)GetTargetRectangle().GetHeight(); - //float hScale = (float)fbWidth / (float)GetTargetRectangle().GetWidth(); - //drawRc.top *= vScale; - //drawRc.bottom *= vScale; - //drawRc.left *= hScale; - //drawRc.right *= hScale; - } - - xfbSource->Draw(sourceRc, drawRc, Width, Height); - } - } - else - { - TargetRectangle targetRc = ConvertEFBRectangle(rc); - LPDIRECT3DTEXTURE9 read_texture = FramebufferManager::GetEFBColorTexture(); - D3D::drawShadedTexQuad(read_texture,targetRc.AsRECT(), - Renderer::GetTargetWidth(),Renderer::GetTargetHeight(), - Width,Height, - PixelShaderCache::GetColorCopyProgram(g_ActiveConfig.iMultisampleMode), - VertexShaderCache::GetSimpleVertexShader(g_ActiveConfig.iMultisampleMode),Gamma); - - } - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - D3D::RefreshSamplerState(0, D3DSAMP_MAGFILTER); - - if(g_ActiveConfig.bAnaglyphStereo) - { - DWORD color_mask = D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; - D3D::SetRenderState(D3DRS_COLORWRITEENABLE, color_mask); - } - - vp.X = 0; - vp.Y = 0; - vp.Width = s_backbuffer_width; - vp.Height = s_backbuffer_height; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - - // Save screenshot - if (s_bScreenshot) - { - std::lock_guard lk(s_criticalScreenshot); - SaveScreenshot(s_sScreenshotName, GetTargetRectangle()); - s_bScreenshot = false; - } - - // Dump frames - static int w = 0, h = 0; - if (g_ActiveConfig.bDumpFrames) - { - static int s_recordWidth; - static int s_recordHeight; - - HRESULT hr = D3D::dev->GetRenderTargetData(D3D::GetBackBufferSurface(),ScreenShootMEMSurface); - if (!bLastFrameDumped) - { - s_recordWidth = GetTargetRectangle().GetWidth(); - s_recordHeight = GetTargetRectangle().GetHeight(); - bAVIDumping = AVIDump::Start(EmuWindow::GetParentWnd(), s_recordWidth, s_recordHeight); - if (!bAVIDumping) - { - PanicAlert("Error dumping frames to AVI."); - } - else - { - char msg [255]; - sprintf_s(msg,255, "Dumping Frames to \"%sframedump0.avi\" (%dx%d RGB24)", - File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), s_recordWidth, s_recordHeight); - OSD::AddMessage(msg, 2000); - } - } - if (bAVIDumping) - { - D3DLOCKED_RECT rect; - if (SUCCEEDED(ScreenShootMEMSurface->LockRect(&rect, GetTargetRectangle().AsRECT(), D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK | D3DLOCK_READONLY))) - { - if (frame_data.empty() || w != s_recordWidth || h != s_recordHeight) - { - frame_data.resize(3 * s_recordWidth * s_recordHeight); - w = s_recordWidth; - h = s_recordHeight; - } - formatBufferDump((const u8*)rect.pBits, &frame_data[0], s_recordWidth, s_recordHeight, rect.Pitch); - AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight); - ScreenShootMEMSurface->UnlockRect(); - } - } - bLastFrameDumped = true; - } - else - { - if (bLastFrameDumped && bAVIDumping) - { - std::vector().swap(frame_data); - w = h = 0; - AVIDump::Stop(); - bAVIDumping = false; - OSD::AddMessage("Stop dumping frames to AVI", 2000); - } - bLastFrameDumped = false; - } - - // Finish up the current frame, print some stats - if (g_ActiveConfig.bShowFPS) - { - char fps[20]; - StringCchPrintfA(fps, 20, "FPS: %d\n", s_fps); - D3D::font.DrawTextScaled(0, 0, 20, 20, 0.0f, 0xFF00FFFF, fps); - } - - if (SConfig::GetInstance().m_ShowLag) - { - char lag[10]; - StringCchPrintfA(lag, 10, "Lag: %llu\n", Movie::g_currentLagCount); - D3D::font.DrawTextScaled(0, 18, 20, 20, 0.0f, 0xFF00FFFF, lag); - } - - if (g_ActiveConfig.bShowInputDisplay) - { - char inputDisplay[1000]; - StringCchPrintfA(inputDisplay, 1000, Movie::GetInputDisplay().c_str()); - D3D::font.DrawTextScaled(0, 36, 20, 20, 0.0f, 0xFF00FFFF, inputDisplay); - } - - Renderer::DrawDebugText(); - - if (g_ActiveConfig.bOverlayStats) - { - Statistics::ToString(st); - D3D::font.DrawTextScaled(0, 36, 20, 20, 0.0f, 0xFF00FFFF, st); - } - else if (g_ActiveConfig.bOverlayProjStats) - { - Statistics::ToStringProj(st); - D3D::font.DrawTextScaled(0, 36, 20, 20, 0.0f, 0xFF00FFFF, st); - } - - OSD::DrawMessages(); - D3D::EndFrame(); - ++frameCount; - - GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true); - - DLCache::ProgressiveCleanup(); - TextureCache::Cleanup(); - // Flip/present backbuffer to frontbuffer here - D3D::Present(); - // Enable configuration changes - UpdateActiveConfig(); - TextureCache::OnConfigChanged(g_ActiveConfig); - - SetWindowSize(fbWidth, fbHeight); - - const bool windowResized = CheckForResize(); - - bool xfbchanged = false; - - if (FramebufferManagerBase::LastXfbWidth() != fbWidth || FramebufferManagerBase::LastXfbHeight() != fbHeight) - { - xfbchanged = true; - unsigned int w = (fbWidth < 1 || fbWidth > MAX_XFB_WIDTH) ? MAX_XFB_WIDTH : fbWidth; - unsigned int h = (fbHeight < 1 || fbHeight > MAX_XFB_HEIGHT) ? MAX_XFB_HEIGHT : fbHeight; - FramebufferManagerBase::SetLastXfbWidth(w); - FramebufferManagerBase::SetLastXfbHeight(h); - } - - u32 newAA = g_ActiveConfig.iMultisampleMode; - - if (xfbchanged || windowResized || s_LastEFBScale != g_ActiveConfig.iEFBScale || s_LastAA != newAA) - { - s_LastAA = newAA; - - UpdateDrawRectangle(s_backbuffer_width, s_backbuffer_height); - - int SupersampleCoeficient = (s_LastAA % 3) + 1; - - s_LastEFBScale = g_ActiveConfig.iEFBScale; - CalculateTargetSize(s_backbuffer_width, s_backbuffer_height, SupersampleCoeficient); - - D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface()); - D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface()); - if (windowResized) - { - // device objects lost, so recreate all of them - SetupDeviceObjects(); - } - else - { - // just resize the frame buffer - delete g_framebuffer_manager; - g_framebuffer_manager = new FramebufferManager; - } - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); - } - - if (XFBWrited) - s_fps = UpdateFPSCounter(); - - // Begin new frame - // Set default viewport and scissor, for the clear to work correctly - // New frame - stats.ResetFrame(); - - // Handle vsync changes during execution - if(s_vsync != g_ActiveConfig.IsVSync()) - { - s_vsync = g_ActiveConfig.IsVSync(); - TeardownDeviceObjects(); - D3D::Reset(); - // device objects lost, so recreate all of them - SetupDeviceObjects(); - } - D3D::BeginFrame(); - RestoreAPIState(); - - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - VertexShaderManager::SetViewportChanged(); - - Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB)); - XFBWrited = false; -} - -void Renderer::ApplyState(bool bUseDstAlpha) -{ - if (bUseDstAlpha) - { - // If we get here we are sure that we are using dst alpha pass. (bpmem.dstalpha.enable) - // Alpha write is enabled. (because bpmem.blendmode.alphaupdate && bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24) - // We must disable blend because we want to write alpha value directly to the alpha channel without modifications. - D3D::ChangeRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA); - D3D::ChangeRenderState(D3DRS_ALPHABLENDENABLE, false); - if(bpmem.zmode.testenable && bpmem.zmode.updateenable) - { - // This is needed to draw to the correct pixels in multi-pass algorithms - // to avoid z-fighting and grants that you write to the same pixels - // affected by the last pass - D3D::ChangeRenderState(D3DRS_ZWRITEENABLE, false); - D3D::ChangeRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL); - } - } -} - -void Renderer::RestoreState() -{ - D3D::RefreshRenderState(D3DRS_COLORWRITEENABLE); - D3D::RefreshRenderState(D3DRS_ALPHABLENDENABLE); - if(bpmem.zmode.testenable && bpmem.zmode.updateenable) - { - D3D::RefreshRenderState(D3DRS_ZWRITEENABLE); - D3D::RefreshRenderState(D3DRS_ZFUNC); - } - // TODO: Enable this code. Caused glitches for me however (neobrain) -// for (unsigned int i = 0; i < 8; ++i) -// D3D::dev->SetTexture(i, NULL); -} - -// ALWAYS call RestoreAPIState for each ResetAPIState call you're doing -void Renderer::ResetAPIState() -{ - D3D::SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - D3D::SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - D3D::SetRenderState(D3DRS_ZENABLE, FALSE); - D3D::SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - DWORD color_mask = D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; - D3D::SetRenderState(D3DRS_COLORWRITEENABLE, color_mask); -} - -void Renderer::RestoreAPIState() -{ - // Gets us back into a more game-like state. - D3D::SetRenderState(D3DRS_FILLMODE, g_ActiveConfig.bWireFrame ? D3DFILL_WIREFRAME : D3DFILL_SOLID); - D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); - VertexShaderManager::SetViewportChanged(); - BPFunctions::SetScissor(); - if (bpmem.zmode.testenable) { - D3D::SetRenderState(D3DRS_ZENABLE, TRUE); - if (bpmem.zmode.updateenable) - D3D::SetRenderState(D3DRS_ZWRITEENABLE, TRUE); - } - SetColorMask(); - SetLogicOpMode(); - SetGenerationMode(); -} - -void Renderer::SetGenerationMode() -{ - const D3DCULL d3dCullModes[4] = - { - D3DCULL_NONE, - D3DCULL_CCW, - D3DCULL_CW, - D3DCULL_CCW - }; - - D3D::SetRenderState(D3DRS_CULLMODE, d3dCullModes[bpmem.genMode.cullmode]); -} - -void Renderer::SetDepthMode() -{ - const D3DCMPFUNC d3dCmpFuncs[8] = - { - D3DCMP_NEVER, - D3DCMP_LESS, - D3DCMP_EQUAL, - D3DCMP_LESSEQUAL, - D3DCMP_GREATER, - D3DCMP_NOTEQUAL, - D3DCMP_GREATEREQUAL, - D3DCMP_ALWAYS - }; - - if (bpmem.zmode.testenable) - { - D3D::SetRenderState(D3DRS_ZENABLE, TRUE); - D3D::SetRenderState(D3DRS_ZWRITEENABLE, bpmem.zmode.updateenable); - D3D::SetRenderState(D3DRS_ZFUNC, d3dCmpFuncs[bpmem.zmode.func]); - } - else - { - // if the test is disabled write is disabled too - D3D::SetRenderState(D3DRS_ZENABLE, FALSE); - D3D::SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - } -} - -void Renderer::SetLogicOpMode() -{ - // D3D9 doesn't support logic blending, so this is a huge hack - - // 0 0x00 - // 1 Source & destination - // 2 Source & ~destination - // 3 Source - // 4 ~Source & destination - // 5 Destination - // 6 Source ^ destination = Source & ~destination | ~Source & destination - // 7 Source | destination - // 8 ~(Source | destination) - // 9 ~(Source ^ destination) = ~Source & ~destination | Source & destination - // 10 ~Destination - // 11 Source | ~destination - // 12 ~Source - // 13 ~Source | destination - // 14 ~(Source & destination) - // 15 0xff - const D3DBLENDOP d3dLogicOpop[16] = - { - D3DBLENDOP_ADD, - D3DBLENDOP_ADD, - D3DBLENDOP_SUBTRACT, - D3DBLENDOP_ADD, - D3DBLENDOP_REVSUBTRACT, - D3DBLENDOP_ADD, - D3DBLENDOP_MAX, - D3DBLENDOP_ADD, - D3DBLENDOP_MAX, - D3DBLENDOP_MAX, - D3DBLENDOP_ADD, - D3DBLENDOP_ADD, - D3DBLENDOP_ADD, - D3DBLENDOP_ADD, - D3DBLENDOP_ADD, - D3DBLENDOP_ADD - }; - const D3DBLEND d3dLogicOpSrcFactors[16] = - { - D3DBLEND_ZERO, - D3DBLEND_DESTCOLOR, - D3DBLEND_ONE, - D3DBLEND_ONE, - D3DBLEND_DESTCOLOR, - D3DBLEND_ZERO, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_ONE, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_ONE - }; - const D3DBLEND d3dLogicOpDestFactors[16] = - { - D3DBLEND_ZERO, - D3DBLEND_ZERO, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_ZERO, - D3DBLEND_ONE, - D3DBLEND_ONE, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_ONE, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_SRCCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_INVDESTCOLOR, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_ONE, - D3DBLEND_INVSRCCOLOR, - D3DBLEND_ONE - }; - - if (bpmem.blendmode.logicopenable) - { - D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, true); - D3D::SetRenderState(D3DRS_BLENDOP, d3dLogicOpop[bpmem.blendmode.logicmode]); - D3D::SetRenderState(D3DRS_SRCBLEND, d3dLogicOpSrcFactors[bpmem.blendmode.logicmode]); - D3D::SetRenderState(D3DRS_DESTBLEND, d3dLogicOpDestFactors[bpmem.blendmode.logicmode]); - } - else - { - SetBlendMode(true); - } -} - -void Renderer::SetDitherMode() -{ - D3D::SetRenderState(D3DRS_DITHERENABLE, bpmem.blendmode.dither); -} - -void Renderer::SetLineWidth() -{ - // We can't change line width in D3D unless we use ID3DXLine - float fratio = xfregs.viewport.wd != 0 ? Renderer::EFBToScaledXf(1.f) : 1.0f; - float psize = bpmem.lineptwidth.linesize * fratio / 6.0f; - //little hack to compensate scaling problems in dx9 must be taken out when scaling is fixed. - psize *= 2.0f; - if (psize > m_fMaxPointSize) - { - psize = m_fMaxPointSize; - } - D3D::SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&psize)); - D3D::SetRenderState(D3DRS_POINTSIZE_MIN, *((DWORD*)&psize)); - D3D::SetRenderState(D3DRS_POINTSIZE_MAX, *((DWORD*)&psize)); -} - -void Renderer::SetSamplerState(int stage, int texindex) -{ - const D3DTEXTUREFILTERTYPE d3dMipFilters[4] = - { - D3DTEXF_NONE, - D3DTEXF_POINT, - D3DTEXF_LINEAR, - D3DTEXF_NONE, //reserved - }; - const D3DTEXTUREADDRESS d3dClamps[4] = - { - D3DTADDRESS_CLAMP, - D3DTADDRESS_WRAP, - D3DTADDRESS_MIRROR, - D3DTADDRESS_WRAP //reserved - }; - - const FourTexUnits &tex = bpmem.tex[texindex]; - const TexMode0 &tm0 = tex.texMode0[stage]; - const TexMode1 &tm1 = tex.texMode1[stage]; - - D3DTEXTUREFILTERTYPE min, mag, mip; - if (g_ActiveConfig.bForceFiltering) - { - min = mag = mip = D3DTEXF_LINEAR; - } - else - { - min = (tm0.min_filter & 4) ? D3DTEXF_LINEAR : D3DTEXF_POINT; - mag = tm0.mag_filter ? D3DTEXF_LINEAR : D3DTEXF_POINT; - mip = d3dMipFilters[tm0.min_filter & 3]; - } - if (texindex) - stage += 4; - - if (mag == D3DTEXF_LINEAR && min == D3DTEXF_LINEAR && g_ActiveConfig.iMaxAnisotropy) - { - min = D3DTEXF_ANISOTROPIC; - } - D3D::SetSamplerState(stage, D3DSAMP_MINFILTER, min); - D3D::SetSamplerState(stage, D3DSAMP_MAGFILTER, mag); - D3D::SetSamplerState(stage, D3DSAMP_MIPFILTER, mip); - - D3D::SetSamplerState(stage, D3DSAMP_ADDRESSU, d3dClamps[tm0.wrap_s]); - D3D::SetSamplerState(stage, D3DSAMP_ADDRESSV, d3dClamps[tm0.wrap_t]); - - float lodbias = (s32)tm0.lod_bias / 32.0f; - D3D::SetSamplerState(stage, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)&lodbias); - D3D::SetSamplerState(stage, D3DSAMP_MAXMIPLEVEL, tm1.min_lod >> 4); -} - -void Renderer::SetInterlacingMode() -{ - // TODO -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.h b/Source/Plugins/Plugin_VideoDX9/Src/Render.h deleted file mode 100644 index 6e5198b3cd..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.h +++ /dev/null @@ -1,63 +0,0 @@ - -#ifndef _RENDER_H_ -#define _RENDER_H_ - -#include "RenderBase.h" - -namespace DX9 -{ - -class Renderer : public ::Renderer -{ -public: - Renderer(); - ~Renderer(); - - void SetColorMask(); - void SetBlendMode(bool forceUpdate); - void SetScissorRect(const TargetRectangle& rc); - void SetGenerationMode(); - void SetDepthMode(); - void SetLogicOpMode(); - void SetDitherMode(); - void SetLineWidth(); - void SetSamplerState(int stage,int texindex); - void SetInterlacingMode(); - - void ApplyState(bool bUseDstAlpha); - void RestoreState(); - - void RenderText(const char* pstr, int left, int top, u32 color); - - u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data); - - void ResetAPIState(); - void RestoreAPIState(); - - TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc); - - void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); - - void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z); - - void ReinterpretPixelData(unsigned int convtype); - - void UpdateViewport(Matrix44& vpCorrection); - - bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); - - static bool CheckForResize(); - - void SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetPSConstant4fv(unsigned int const_number, const float *f); - void SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f); - - void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetVSConstant4fv(unsigned int const_number, const float *f); - void SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f); - void SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f); -}; - -} // namespace DX9 - -#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp deleted file mode 100644 index ce8b1acaf5..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include - -#include "Globals.h" -#include "Statistics.h" -#include "MemoryUtil.h" -#include "Hash.h" -#include "HW/Memmap.h" - -#include "CommonPaths.h" -#include "FileUtil.h" - -#include "D3DBase.h" -#include "D3DTexture.h" -#include "D3DUtil.h" -#include "FramebufferManager.h" -#include "PixelShaderCache.h" -#include "PixelShaderManager.h" -#include "VertexShaderManager.h" -#include "VertexShaderCache.h" - -#include "Render.h" - -#include "TextureDecoder.h" -#include "TextureCache.h" -#include "HiresTextures.h" -#include "TextureConverter.h" -#include "Debugger.h" - -extern int frameCount; - -namespace DX9 -{ - -TextureCache::TCacheEntry::~TCacheEntry() -{ - texture->Release(); -} - -void TextureCache::TCacheEntry::Bind(unsigned int stage) -{ - D3D::SetTexture(stage, texture); -} - -bool TextureCache::TCacheEntry::Save(const char filename[], unsigned int level) -{ - IDirect3DSurface9* surface; - HRESULT hr = texture->GetSurfaceLevel(level, &surface); - if (FAILED(hr)) - return false; - - hr = PD3DXSaveSurfaceToFileA(filename, D3DXIFF_PNG, surface, NULL, NULL); - surface->Release(); - - return SUCCEEDED(hr); -} - -void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int level) -{ - D3D::ReplaceTexture2D(texture, temp, width, height, expanded_width, d3d_fmt, swap_r_b, level); -} - -void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFormat, - unsigned int srcFormat, const EFBRectangle& srcRect, - bool isIntensity, bool scaleByHalf, unsigned int cbufid, - const float *colmat) -{ - g_renderer->ResetAPIState(); // reset any game specific settings - - const LPDIRECT3DTEXTURE9 read_texture = (srcFormat == PIXELFMT_Z24) ? - FramebufferManager::GetEFBDepthTexture() : - FramebufferManager::GetEFBColorTexture(); - - if (type != TCET_EC_DYNAMIC || g_ActiveConfig.bCopyEFBToTexture) - { - LPDIRECT3DSURFACE9 Rendersurf = NULL; - texture->GetSurfaceLevel(0, &Rendersurf); - D3D::dev->SetDepthStencilSurface(NULL); - D3D::dev->SetRenderTarget(0, Rendersurf); - - D3DVIEWPORT9 vp; - - // Stretch picture with increased internal resolution - vp.X = 0; - vp.Y = 0; - vp.Width = virtual_width; - vp.Height = virtual_height; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - RECT destrect; - destrect.bottom = virtual_height; - destrect.left = 0; - destrect.right = virtual_width; - destrect.top = 0; - - PixelShaderManager::SetColorMatrix(colmat); // set transformation - TargetRectangle targetSource = g_renderer->ConvertEFBRectangle(srcRect); - RECT sourcerect; - sourcerect.bottom = targetSource.bottom; - sourcerect.left = targetSource.left; - sourcerect.right = targetSource.right; - sourcerect.top = targetSource.top; - - if (srcFormat == PIXELFMT_Z24) - { - if (scaleByHalf || g_ActiveConfig.iMultisampleMode) - { - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - } - else - { - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - } - } - else - { - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - } - - D3DFORMAT bformat = FramebufferManager::GetEFBDepthRTSurfaceFormat(); - int SSAAMode = g_ActiveConfig.iMultisampleMode; - - D3D::drawShadedTexQuad(read_texture, &sourcerect, - Renderer::GetTargetWidth(), Renderer::GetTargetHeight(), - virtual_width, virtual_height, - // TODO: why is D3DFMT_D24X8 singled out here? why not D3DFMT_D24X4S4/D24S8/D24FS8/D32/D16/D15S1 too, or none of them? - PixelShaderCache::GetDepthMatrixProgram(SSAAMode, (srcFormat == PIXELFMT_Z24) && bformat != FOURCC_RAWZ && bformat != D3DFMT_D24X8), - VertexShaderCache::GetSimpleVertexShader(SSAAMode)); - - Rendersurf->Release(); - } - - if (!g_ActiveConfig.bCopyEFBToTexture) - { - int encoded_size = TextureConverter::EncodeToRamFromTexture( - addr, - read_texture, - Renderer::GetTargetWidth(), - Renderer::GetTargetHeight(), - srcFormat == PIXELFMT_Z24, - isIntensity, - dstFormat, - scaleByHalf, - srcRect); - - u8* dst = Memory::GetPointer(addr); - u64 hash = GetHash64(dst,encoded_size,g_ActiveConfig.iSafeTextureCache_ColorSamples); - - // Mark texture entries in destination address range dynamic unless caching is enabled and the texture entry is up to date - if (!g_ActiveConfig.bEFBCopyCacheEnable) - TextureCache::MakeRangeDynamic(addr,encoded_size); - else if (!TextureCache::Find(addr, hash)) - TextureCache::MakeRangeDynamic(addr,encoded_size); - - this->hash = hash; - } - - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - D3D::RefreshSamplerState(0, D3DSAMP_MAGFILTER); - D3D::SetTexture(0, NULL); - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - - g_renderer->RestoreAPIState(); -} - -TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt) -{ - D3DFORMAT d3d_fmt; - bool swap_r_b = false; - - switch (pcfmt) - { - case PC_TEX_FMT_BGRA32: - d3d_fmt = D3DFMT_A8R8G8B8; - break; - - case PC_TEX_FMT_RGBA32: - d3d_fmt = D3DFMT_A8R8G8B8; - swap_r_b = true; - break; - - case PC_TEX_FMT_RGB565: - d3d_fmt = D3DFMT_R5G6B5; - break; - - case PC_TEX_FMT_IA4_AS_IA8: - d3d_fmt = D3DFMT_A8L8; - break; - - case PC_TEX_FMT_I8: - case PC_TEX_FMT_I4_AS_I8: - // A hack which means the format is a packed - // 8-bit intensity texture. It is unpacked - // to A8L8 in D3DTexture.cpp - d3d_fmt = D3DFMT_A8P8; - break; - - case PC_TEX_FMT_IA8: - d3d_fmt = D3DFMT_A8L8; - break; - - case PC_TEX_FMT_DXT1: - d3d_fmt = D3DFMT_DXT1; - break; - } - - TCacheEntry* entry = new TCacheEntry(D3D::CreateTexture2D(temp, width, height, expanded_width, d3d_fmt, swap_r_b, tex_levels)); - entry->swap_r_b = swap_r_b; - entry->d3d_fmt = d3d_fmt; - - entry->Load(width, height, expanded_width, 0); - - return entry; -} - -TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( - unsigned int scaled_tex_w, unsigned int scaled_tex_h) -{ - LPDIRECT3DTEXTURE9 texture; - D3D::dev->CreateTexture(scaled_tex_w, scaled_tex_h, 1, D3DUSAGE_RENDERTARGET, - D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, 0); - - return new TCacheEntry(texture); -} - -} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h deleted file mode 100644 index 5c711129f1..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef _TEXTURECACHE_H -#define _TEXTURECACHE_H - - -#include - -#include "D3DBase.h" -#include "VideoCommon.h" -#include "BPMemory.h" - -#include "TextureCacheBase.h" - -namespace DX9 -{ - -class TextureCache : public ::TextureCache -{ -private: - struct TCacheEntry : TCacheEntryBase - { - const LPDIRECT3DTEXTURE9 texture; - - D3DFORMAT d3d_fmt; - bool swap_r_b; - - TCacheEntry(LPDIRECT3DTEXTURE9 _tex) : texture(_tex) {} - ~TCacheEntry(); - - void Load(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int levels); - - void FromRenderTarget(u32 dstAddr, unsigned int dstFormat, - unsigned int srcFormat, const EFBRectangle& srcRect, - bool isIntensity, bool scaleByHalf, unsigned int cbufid, - const float *colmat); - - void Bind(unsigned int stage); - bool Save(const char filename[], unsigned int level); - }; - - TCacheEntryBase* CreateTexture(unsigned int width, unsigned int height, - unsigned int expanded_width, unsigned int tex_levels, PC_TexFormat pcfmt); - - TCacheEntryBase* CreateRenderTargetTexture(unsigned int scaled_tex_w, unsigned int scaled_tex_h); -}; - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp deleted file mode 100644 index aff12af2c3..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp +++ /dev/null @@ -1,462 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -// Fast image conversion using OpenGL shaders. -// This kind of stuff would be a LOT nicer with OpenCL. - -#include "TextureConverter.h" -#include "TextureConversionShader.h" -#include "PixelShaderCache.h" -#include "VertexShaderManager.h" -#include "VertexShaderCache.h" -#include "FramebufferManager.h" -#include "Globals.h" -#include "VideoConfig.h" -#include "ImageWrite.h" -#include "Render.h" -#include "TextureCache.h" -#include "Math.h" -#include "FileUtil.h" -#include "HW/Memmap.h" - -namespace DX9 -{ - -namespace TextureConverter -{ -struct TransformBuffer -{ - LPDIRECT3DTEXTURE9 FBTexture; - LPDIRECT3DSURFACE9 RenderSurface; - LPDIRECT3DSURFACE9 ReadSurface; - int Width; - int Height; -}; -const u32 NUM_TRANSFORM_BUFFERS = 16; -static TransformBuffer TrnBuffers[NUM_TRANSFORM_BUFFERS]; -static u32 WorkingBuffers = 0; - -static LPDIRECT3DPIXELSHADER9 s_rgbToYuyvProgram = NULL; -static LPDIRECT3DPIXELSHADER9 s_yuyvToRgbProgram = NULL; - -// Not all slots are taken - but who cares. -const u32 NUM_ENCODING_PROGRAMS = 64; -static LPDIRECT3DPIXELSHADER9 s_encodingPrograms[NUM_ENCODING_PROGRAMS]; -static bool s_encodingProgramsFailed[NUM_ENCODING_PROGRAMS]; - -void CreateRgbToYuyvProgram() -{ - // Output is BGRA because that is slightly faster than RGBA. - char* FProgram = new char[2048]; - sprintf(FProgram,"uniform float4 blkDims : register(c%d);\n" - "uniform float4 textureDims : register(c%d);\n" - "uniform sampler samp0 : register(s0);\n" - "void main(\n" - " out float4 ocol0 : COLOR0,\n" - " in float2 uv0 : TEXCOORD0,\n" - " in float uv2 : TEXCOORD1)\n" - "{\n" - " float2 uv1 = float2((uv0.x + 1.0f)/ blkDims.z, uv0.y / blkDims.w);\n" - " float3 c0 = tex2D(samp0, uv0.xy / blkDims.zw).rgb;\n" - " float3 c1 = tex2D(samp0, uv1).rgb;\n" - " c0 = pow(c0,uv2.xxx);\n" - " c1 = pow(c1,uv2.xxx);\n" - " float3 y_const = float3(0.257f,0.504f,0.098f);\n" - " float3 u_const = float3(-0.148f,-0.291f,0.439f);\n" - " float3 v_const = float3(0.439f,-0.368f,-0.071f);\n" - " float4 const3 = float4(0.0625f,0.5f,0.0625f,0.5f);\n" - " float3 c01 = (c0 + c1) * 0.5f;\n" - " ocol0 = float4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" - "}\n",C_COLORMATRIX,C_COLORMATRIX+1); - - s_rgbToYuyvProgram = D3D::CompileAndCreatePixelShader(FProgram, (int)strlen(FProgram)); - if (!s_rgbToYuyvProgram) { - ERROR_LOG(VIDEO, "Failed to create RGB to YUYV fragment program"); - } - delete [] FProgram; -} - -void CreateYuyvToRgbProgram() -{ - char* FProgram = new char[2048]; - sprintf(FProgram,"uniform float4 blkDims : register(c%d);\n" - "uniform float4 textureDims : register(c%d);\n" - "uniform sampler samp0 : register(s0);\n" - "void main(\n" - " out float4 ocol0 : COLOR0,\n" - " in float2 uv0 : TEXCOORD0)\n" - "{\n" - " float4 c0 = tex2D(samp0, uv0 / blkDims.zw).rgba;\n" - " float f = step(0.5, frac(uv0.x));\n" - " float y = lerp(c0.b, c0.r, f);\n" - " float yComp = 1.164f * (y - 0.0625f);\n" - " float uComp = c0.g - 0.5f;\n" - " float vComp = c0.a - 0.5f;\n" - - " ocol0 = float4(yComp + (1.596f * vComp),\n" - " yComp - (0.813f * vComp) - (0.391f * uComp),\n" - " yComp + (2.018f * uComp),\n" - " 1.0f);\n" - "}\n",C_COLORMATRIX,C_COLORMATRIX+1); - s_yuyvToRgbProgram = D3D::CompileAndCreatePixelShader(FProgram, (int)strlen(FProgram)); - if (!s_yuyvToRgbProgram) { - ERROR_LOG(VIDEO, "Failed to create YUYV to RGB fragment program"); - } - delete [] FProgram; -} - -LPDIRECT3DPIXELSHADER9 GetOrCreateEncodingShader(u32 format) -{ - if (format > NUM_ENCODING_PROGRAMS) - { - PanicAlert("Unknown texture copy format: 0x%x\n", format); - return s_encodingPrograms[0]; - } - - if (!s_encodingPrograms[format]) - { - if(s_encodingProgramsFailed[format]) - { - // we already failed to create a shader for this format, - // so instead of re-trying and showing the same error message every frame, just return. - return NULL; - } - - const char* shader = TextureConversionShader::GenerateEncodingShader(format,API_D3D9); - -#if defined(_DEBUG) || defined(DEBUGFAST) - if (g_ActiveConfig.iLog & CONF_SAVESHADERS && shader) { - static int counter = 0; - char szTemp[MAX_PATH]; - sprintf(szTemp, "%senc_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); - - SaveData(szTemp, shader); - } -#endif - s_encodingPrograms[format] = D3D::CompileAndCreatePixelShader(shader, (int)strlen(shader)); - if (!s_encodingPrograms[format]) { - ERROR_LOG(VIDEO, "Failed to create encoding fragment program"); - s_encodingProgramsFailed[format] = true; - } - } - return s_encodingPrograms[format]; -} - -void Init() -{ - for (unsigned int i = 0; i < NUM_ENCODING_PROGRAMS; i++) - { - s_encodingPrograms[i] = NULL; - s_encodingProgramsFailed[i] = false; - } - for (unsigned int i = 0; i < NUM_TRANSFORM_BUFFERS; i++) - { - TrnBuffers[i].FBTexture = NULL; - TrnBuffers[i].RenderSurface = NULL; - TrnBuffers[i].ReadSurface = NULL; - TrnBuffers[i].Width = 0; - TrnBuffers[i].Height = 0; - } - CreateRgbToYuyvProgram(); - CreateYuyvToRgbProgram(); -} - -void Shutdown() -{ - if(s_rgbToYuyvProgram) - s_rgbToYuyvProgram->Release(); - s_rgbToYuyvProgram = NULL; - if(s_yuyvToRgbProgram) - s_yuyvToRgbProgram->Release(); - s_yuyvToRgbProgram=NULL; - - for (unsigned int i = 0; i < NUM_ENCODING_PROGRAMS; i++) - { - if(s_encodingPrograms[i]) - s_encodingPrograms[i]->Release(); - s_encodingPrograms[i] = NULL; - } - for (unsigned int i = 0; i < NUM_TRANSFORM_BUFFERS; i++) - { - if(TrnBuffers[i].RenderSurface != NULL) - TrnBuffers[i].RenderSurface->Release(); - TrnBuffers[i].RenderSurface = NULL; - - if(TrnBuffers[i].ReadSurface != NULL) - TrnBuffers[i].ReadSurface->Release(); - TrnBuffers[i].ReadSurface = NULL; - - if(TrnBuffers[i].FBTexture != NULL) - TrnBuffers[i].FBTexture->Release(); - TrnBuffers[i].FBTexture = NULL; - - TrnBuffers[i].Width = 0; - TrnBuffers[i].Height = 0; - } - WorkingBuffers = 0; -} - -void EncodeToRamUsingShader(LPDIRECT3DPIXELSHADER9 shader, LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourceRc, - u8* destAddr, int dstWidth, int dstHeight, int readStride, bool toTexture, bool linearFilter,float Gamma) -{ - HRESULT hr; - u32 index =0; - while(index < WorkingBuffers && (TrnBuffers[index].Width != dstWidth || TrnBuffers[index].Height != dstHeight)) - index++; - - LPDIRECT3DSURFACE9 s_texConvReadSurface = NULL; - LPDIRECT3DSURFACE9 Rendersurf = NULL; - - if (index >= WorkingBuffers) - { - if (WorkingBuffers < NUM_TRANSFORM_BUFFERS) - WorkingBuffers++; - if (index >= WorkingBuffers) - index--; - if (TrnBuffers[index].RenderSurface != NULL) - { - TrnBuffers[index].RenderSurface->Release(); - TrnBuffers[index].RenderSurface = NULL; - } - if (TrnBuffers[index].ReadSurface != NULL) - { - TrnBuffers[index].ReadSurface->Release(); - TrnBuffers[index].ReadSurface = NULL; - } - if (TrnBuffers[index].FBTexture != NULL) - { - TrnBuffers[index].FBTexture->Release(); - TrnBuffers[index].FBTexture = NULL; - } - TrnBuffers[index].Width = dstWidth; - TrnBuffers[index].Height = dstHeight; - D3D::dev->CreateTexture(dstWidth, dstHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, - D3DPOOL_DEFAULT, &TrnBuffers[index].FBTexture, NULL); - TrnBuffers[index].FBTexture->GetSurfaceLevel(0,&TrnBuffers[index].RenderSurface); - D3D::dev->CreateOffscreenPlainSurface(dstWidth, dstHeight, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &TrnBuffers[index].ReadSurface, NULL ); - } - - s_texConvReadSurface = TrnBuffers[index].ReadSurface; - Rendersurf = TrnBuffers[index].RenderSurface; - - hr = D3D::dev->SetDepthStencilSurface(NULL); - hr = D3D::dev->SetRenderTarget(0, Rendersurf); - - if (linearFilter) - { - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - } - else - { - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - } - - D3DVIEWPORT9 vp; - vp.X = 0; - vp.Y = 0; - vp.Width = dstWidth; - vp.Height = dstHeight; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - hr = D3D::dev->SetViewport(&vp); - RECT SrcRect; - SrcRect.top = sourceRc.top; - SrcRect.left = sourceRc.left; - SrcRect.right = sourceRc.right; - SrcRect.bottom = sourceRc.bottom; - RECT DstRect; - DstRect.top = 0; - DstRect.left = 0; - DstRect.right = dstWidth; - DstRect.bottom = dstHeight; - - - // Draw... - D3D::drawShadedTexQuad(srcTexture,&SrcRect,1,1,dstWidth,dstHeight,shader,VertexShaderCache::GetSimpleVertexShader(0), Gamma); - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - // .. and then read back the results. - // TODO: make this less slow. - - hr = D3D::dev->GetRenderTargetData(Rendersurf,s_texConvReadSurface); - - D3DLOCKED_RECT drect; - hr = s_texConvReadSurface->LockRect(&drect, &DstRect, D3DLOCK_READONLY); - - int srcRowsPerBlockRow = readStride / (dstWidth*4); // 4 bytes per pixel - - int readLoops = dstHeight / srcRowsPerBlockRow; - const u8 *Source = (const u8*)drect.pBits; - for (int i = 0; i < readLoops; i++) - { - for (int j = 0; j < srcRowsPerBlockRow; ++j) - { - memcpy(destAddr + j*dstWidth*4, Source, dstWidth*4); - Source += drect.Pitch; - } - destAddr += bpmem.copyMipMapStrideChannels*32; - } - - hr = s_texConvReadSurface->UnlockRect(); -} - -int EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source) -{ - u32 format = copyfmt; - - if (bFromZBuffer) - { - format |= _GX_TF_ZTF; - if (copyfmt == 11) - format = GX_TF_Z16; - else if (format < GX_TF_Z8 || format > GX_TF_Z24X8) - format |= _GX_TF_CTF; - } - else - { - if (copyfmt > GX_TF_RGBA8 || (copyfmt < GX_TF_RGB565 && !bIsIntensityFmt)) - format |= _GX_TF_CTF; - } - - LPDIRECT3DPIXELSHADER9 texconv_shader = GetOrCreateEncodingShader(format); - if (!texconv_shader) - return 0; - - u8 *dest_ptr = Memory::GetPointer(address); - - int width = (source.right - source.left) >> bScaleByHalf; - int height = (source.bottom - source.top) >> bScaleByHalf; - - int size_in_bytes = TexDecoder_GetTextureSizeInBytes(width, height, format); - - u16 blkW = TexDecoder_GetBlockWidthInTexels(format) - 1; - u16 blkH = TexDecoder_GetBlockHeightInTexels(format) - 1; - u16 samples = TextureConversionShader::GetEncodedSampleCount(format); - - // only copy on cache line boundaries - // extra pixels are copied but not displayed in the resulting texture - s32 expandedWidth = (width + blkW) & (~blkW); - s32 expandedHeight = (height + blkH) & (~blkH); - - float sampleStride = bScaleByHalf ? 2.f : 1.f; - TextureConversionShader::SetShaderParameters( - (float)expandedWidth, - (float)Renderer::EFBToScaledY(expandedHeight), // TODO: Why do we scale this? - (float)Renderer::EFBToScaledX(source.left), - (float)Renderer::EFBToScaledY(source.top), - Renderer::EFBToScaledXf(sampleStride), - Renderer::EFBToScaledYf(sampleStride), - (float)SourceW, - (float)SourceH); - - TargetRectangle scaledSource; - scaledSource.top = 0; - scaledSource.bottom = expandedHeight; - scaledSource.left = 0; - scaledSource.right = expandedWidth / samples; - int cacheBytes = 32; - if ((format & 0x0f) == 6) - cacheBytes = 64; - - int readStride = (expandedWidth * cacheBytes) / TexDecoder_GetBlockWidthInTexels(format); - EncodeToRamUsingShader(texconv_shader, source_texture, scaledSource, dest_ptr, expandedWidth / samples, expandedHeight, readStride, true, bScaleByHalf > 0,1.0f); - return size_in_bytes; // TODO: D3D11 is calculating this value differently! -} - -void EncodeToRamYUYV(LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourceRc, u8* destAddr, int dstWidth, int dstHeight,float Gamma) -{ - TextureConversionShader::SetShaderParameters( - (float)dstWidth, - (float)dstHeight, - 0.0f, - 0.0f, - 1.0f, - 1.0f, - (float)Renderer::GetTargetWidth(), - (float)Renderer::GetTargetHeight()); - g_renderer->ResetAPIState(); - EncodeToRamUsingShader(s_rgbToYuyvProgram, srcTexture, sourceRc, destAddr, - dstWidth / 2, dstHeight, dstWidth * 2, false, false,Gamma); - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - g_renderer->RestoreAPIState(); -} - - -// Should be scale free. -void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE9 destTexture) -{ - u8* srcAddr = Memory::GetPointer(xfbAddr); - if (!srcAddr) - { - WARN_LOG(VIDEO, "Tried to decode from invalid memory address"); - return; - } - - int srcFmtWidth = srcWidth / 2; - - g_renderer->ResetAPIState(); // reset any game specific settings - LPDIRECT3DTEXTURE9 s_srcTexture = D3D::CreateTexture2D(srcAddr, srcFmtWidth, srcHeight, srcFmtWidth, D3DFMT_A8R8G8B8, false); - LPDIRECT3DSURFACE9 Rendersurf = NULL; - destTexture->GetSurfaceLevel(0,&Rendersurf); - D3D::dev->SetDepthStencilSurface(NULL); - D3D::dev->SetRenderTarget(0, Rendersurf); - - D3DVIEWPORT9 vp; - - // Stretch picture with increased internal resolution - vp.X = 0; - vp.Y = 0; - vp.Width = srcWidth; - vp.Height = srcHeight; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - D3D::dev->SetViewport(&vp); - RECT destrect; - destrect.bottom = srcHeight; - destrect.left = 0; - destrect.right = srcWidth; - destrect.top = 0; - - RECT sourcerect; - sourcerect.bottom = srcHeight; - sourcerect.left = 0; - sourcerect.right = srcFmtWidth; - sourcerect.top = 0; - - D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - - TextureConversionShader::SetShaderParameters( - (float)srcFmtWidth, - (float)srcHeight, - 0.0f, - 0.0f, - 1.0f, - 1.0f, - (float)srcFmtWidth, - (float)srcHeight); - D3D::drawShadedTexQuad( - s_srcTexture, - &sourcerect, - 1, - 1, - srcWidth, - srcHeight, - s_yuyvToRgbProgram, - VertexShaderCache::GetSimpleVertexShader(0)); - - - D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); - D3D::RefreshSamplerState(0, D3DSAMP_MAGFILTER); - D3D::SetTexture(0,NULL); - D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface()); - D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface()); - g_renderer->RestoreAPIState(); - Rendersurf->Release(); - s_srcTexture->Release(); -} - -} // namespace - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.h b/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.h deleted file mode 100644 index af23949f5c..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef _TEXTURECONVERTER_H_ -#define _TEXTURECONVERTER_H_ - -#include "VideoCommon.h" -#include "D3DBase.h" -#include "D3DTexture.h" -#include "D3DUtil.h" -#include "D3DShader.h" - -namespace DX9 -{ - -// Converts textures between formats using shaders -// TODO: support multiple texture formats -namespace TextureConverter -{ - -void Init(); -void Shutdown(); - -void EncodeToRamYUYV(LPDIRECT3DTEXTURE9 srcTexture, const TargetRectangle& sourceRc, - u8* destAddr, int dstWidth, int dstHeight,float Gamma); - -void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE9 destTexture); - -// returns size of the encoded data (in bytes) -int EncodeToRamFromTexture(u32 address,LPDIRECT3DTEXTURE9 source_texture, u32 SourceW, u32 SourceH, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle& source); - - -} - -} // namespace DX9 - -#endif // _TEXTURECONVERTER_H_ diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp deleted file mode 100644 index adb4ddf580..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp +++ /dev/null @@ -1,410 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "Common.h" -#include "FileUtil.h" - -#include "D3DBase.h" -#include "Fifo.h" -#include "Statistics.h" -#include "VertexManager.h" -#include "OpcodeDecoding.h" -#include "IndexGenerator.h" -#include "VertexShaderManager.h" -#include "VertexShaderCache.h" -#include "PixelShaderManager.h" -#include "PixelShaderCache.h" -#include "NativeVertexFormat.h" -#include "TextureCache.h" -#include "main.h" - -#include "BPStructs.h" -#include "XFStructs.h" -#include "Debugger.h" -#include "VideoConfig.h" - -// internal state for loading vertices -extern NativeVertexFormat *g_nativeVertexFmt; -namespace DX9 -{ -//This are the initially requeted size for the buffers expresed in elements -const u32 IBUFFER_SIZE = VertexManager::MAXIBUFFERSIZE * sizeof(u16) * 8; -const u32 VBUFFER_SIZE = VertexManager::MAXVBUFFERSIZE; -const u32 MAX_VBUFFER_COUNT = 2; - -inline void DumpBadShaders() -{ -#if defined(_DEBUG) || defined(DEBUGFAST) - // TODO: Reimplement! -/* std::string error_shaders; - error_shaders.append(VertexShaderCache::GetCurrentShaderCode()); - error_shaders.append(PixelShaderCache::GetCurrentShaderCode()); - char filename[512] = "bad_shader_combo_0.txt"; - int which = 0; - while (File::Exists(filename)) - { - which++; - sprintf(filename, "bad_shader_combo_%i.txt", which); - } - File::WriteStringToFile(true, error_shaders, filename); - PanicAlert("DrawIndexedPrimitiveUP failed. Shaders written to %s", filename);*/ -#endif -} - -void VertexManager::CreateDeviceObjects() -{ - m_buffers_count = 0; - m_vertex_buffers = NULL; - m_index_buffers = NULL; - D3DCAPS9 DeviceCaps = D3D::GetCaps(); - u32 devicevMaxBufferSize = DeviceCaps.MaxPrimitiveCount * 3 * DeviceCaps.MaxStreamStride; - //Calculate Device Dependant size - m_vertex_buffer_size = (VBUFFER_SIZE > devicevMaxBufferSize) ? devicevMaxBufferSize : VBUFFER_SIZE; - m_index_buffer_size = (IBUFFER_SIZE > DeviceCaps.MaxVertexIndex) ? DeviceCaps.MaxVertexIndex : IBUFFER_SIZE; - //if device caps are not enough for Vbuffer fall back to vertex arrays - if (m_index_buffer_size < MAXIBUFFERSIZE || m_vertex_buffer_size < MAXVBUFFERSIZE) return; - - m_vertex_buffers = new LPDIRECT3DVERTEXBUFFER9[MAX_VBUFFER_COUNT]; - m_index_buffers = new LPDIRECT3DINDEXBUFFER9[MAX_VBUFFER_COUNT]; - - bool Fail = false; - for (m_current_vertex_buffer = 0; m_current_vertex_buffer < MAX_VBUFFER_COUNT; m_current_vertex_buffer++) - { - m_vertex_buffers[m_current_vertex_buffer] = NULL; - m_index_buffers[m_current_vertex_buffer] = NULL; - } - for (m_current_vertex_buffer = 0; m_current_vertex_buffer < MAX_VBUFFER_COUNT; m_current_vertex_buffer++) - { - if(FAILED( D3D::dev->CreateVertexBuffer( m_vertex_buffer_size, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &m_vertex_buffers[m_current_vertex_buffer], NULL ) ) ) - { - Fail = true; - break; - } - if( FAILED( D3D::dev->CreateIndexBuffer( m_index_buffer_size * sizeof(u16), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_index_buffers[m_current_vertex_buffer], NULL ) ) ) - { - Fail = true; - return; - } - } - m_buffers_count = m_current_vertex_buffer; - m_current_vertex_buffer = 0; - m_current_index_buffer = 0; - m_index_buffer_cursor = m_index_buffer_size; - m_vertex_buffer_cursor = m_vertex_buffer_size; - m_current_stride = 0; - if (Fail) - { - m_buffers_count--; - if (m_buffers_count < 2) - { - //Error creating Vertex buffers. clean and fall to Vertex arrays - m_buffers_count = MAX_VBUFFER_COUNT; - DestroyDeviceObjects(); - } - } -} -void VertexManager::DestroyDeviceObjects() -{ - D3D::SetStreamSource( 0, NULL, 0, 0); - D3D::SetIndices(NULL); - for (int i = 0; i < MAX_VBUFFER_COUNT; i++) - { - if(m_vertex_buffers) - { - if (m_vertex_buffers[i]) - { - m_vertex_buffers[i]->Release(); - m_vertex_buffers[i] = NULL; - } - } - - if (m_index_buffers[i]) - { - m_index_buffers[i]->Release(); - m_index_buffers[i] = NULL; - } - } - if(m_vertex_buffers) - delete [] m_vertex_buffers; - if(m_index_buffers) - delete [] m_index_buffers; - m_vertex_buffers = NULL; - m_index_buffers = NULL; -} - -void VertexManager::PrepareDrawBuffers(u32 stride) -{ - if (!m_buffers_count) - { - return; - } - u8* pVertices; - u16* pIndices; - int datasize = IndexGenerator::GetNumVerts() * stride; - int TdataSize = IndexGenerator::GetTriangleindexLen(); - int LDataSize = IndexGenerator::GetLineindexLen(); - int PDataSize = IndexGenerator::GetPointindexLen(); - int IndexDataSize = TdataSize + LDataSize; - DWORD LockMode = D3DLOCK_NOOVERWRITE; - m_vertex_buffer_cursor--; - m_vertex_buffer_cursor = m_vertex_buffer_cursor - (m_vertex_buffer_cursor % stride) + stride; - if (m_vertex_buffer_cursor > m_vertex_buffer_size - datasize) - { - LockMode = D3DLOCK_DISCARD; - m_vertex_buffer_cursor = 0; - m_current_vertex_buffer = (m_current_vertex_buffer + 1) % m_buffers_count; - } - if(FAILED(m_vertex_buffers[m_current_vertex_buffer]->Lock(m_vertex_buffer_cursor, datasize,(VOID**)(&pVertices), LockMode))) - { - DestroyDeviceObjects(); - return; - } - memcpy(pVertices, s_pBaseBufferPointer, datasize); - m_vertex_buffers[m_current_vertex_buffer]->Unlock(); - - LockMode = D3DLOCK_NOOVERWRITE; - if (m_index_buffer_cursor > m_index_buffer_size - IndexDataSize) - { - LockMode = D3DLOCK_DISCARD; - m_index_buffer_cursor = 0; - m_current_index_buffer = (m_current_index_buffer + 1) % m_buffers_count; - } - - if(FAILED(m_index_buffers[m_current_index_buffer]->Lock(m_index_buffer_cursor * sizeof(u16), IndexDataSize * sizeof(u16), (VOID**)(&pIndices), LockMode ))) - { - DestroyDeviceObjects(); - return; - } - if(TdataSize) - { - memcpy(pIndices, GetTriangleIndexBuffer(), TdataSize * sizeof(u16)); - pIndices += TdataSize; - } - if(LDataSize) - { - memcpy(pIndices, GetLineIndexBuffer(), LDataSize * sizeof(u16)); - pIndices += LDataSize; - } - m_index_buffers[m_current_index_buffer]->Unlock(); - if(m_current_stride != stride || m_vertex_buffer_cursor == 0) - { - m_current_stride = stride; - D3D::SetStreamSource( 0, m_vertex_buffers[m_current_vertex_buffer], 0, stride); - } - if (m_index_buffer_cursor == 0) - { - D3D::SetIndices(m_index_buffers[m_current_index_buffer]); - } - - ADDSTAT(stats.thisFrame.bytesVertexStreamed, datasize); - ADDSTAT(stats.thisFrame.bytesIndexStreamed, IndexDataSize); -} - -void VertexManager::DrawVertexBuffer(int stride) -{ - int triangles = IndexGenerator::GetNumTriangles(); - int lines = IndexGenerator::GetNumLines(); - int points = IndexGenerator::GetNumPoints(); - int numverts = IndexGenerator::GetNumVerts(); - int StartIndex = m_index_buffer_cursor; - int basevertex = m_vertex_buffer_cursor / stride; - if (triangles > 0) - { - if (FAILED(D3D::dev->DrawIndexedPrimitive( - D3DPT_TRIANGLELIST, - basevertex, - 0, - numverts, - StartIndex, - triangles))) - { - DumpBadShaders(); - } - StartIndex += IndexGenerator::GetTriangleindexLen(); - INCSTAT(stats.thisFrame.numIndexedDrawCalls); - } - if (lines > 0) - { - if (FAILED(D3D::dev->DrawIndexedPrimitive( - D3DPT_LINELIST, - basevertex, - 0, - numverts, - StartIndex, - IndexGenerator::GetNumLines()))) - { - DumpBadShaders(); - } - StartIndex += IndexGenerator::GetLineindexLen(); - INCSTAT(stats.thisFrame.numIndexedDrawCalls); - } - if (points > 0) - { - //DrawIndexedPrimitive does not support point list so we have to draw the points one by one - for (int i = 0; i < points; i++) - { - if (FAILED(D3D::dev->DrawPrimitive( - D3DPT_POINTLIST, - basevertex + GetPointIndexBuffer()[i], - 1))) - { - DumpBadShaders(); - } - INCSTAT(stats.thisFrame.numDrawCalls); - } - - - } - -} - -void VertexManager::DrawVertexArray(int stride) -{ - int triangles = IndexGenerator::GetNumTriangles(); - int lines = IndexGenerator::GetNumLines(); - int points = IndexGenerator::GetNumPoints(); - int numverts = IndexGenerator::GetNumVerts(); - if (triangles > 0) - { - if (FAILED(D3D::dev->DrawIndexedPrimitiveUP( - D3DPT_TRIANGLELIST, - 0, numverts, triangles, - GetTriangleIndexBuffer(), - D3DFMT_INDEX16, - s_pBaseBufferPointer, - stride))) - { - DumpBadShaders(); - } - INCSTAT(stats.thisFrame.numIndexedDrawCalls); - } - if (lines > 0) - { - if (FAILED(D3D::dev->DrawIndexedPrimitiveUP( - D3DPT_LINELIST, - 0, numverts, lines, - GetLineIndexBuffer(), - D3DFMT_INDEX16, - s_pBaseBufferPointer, - stride))) - { - DumpBadShaders(); - } - INCSTAT(stats.thisFrame.numIndexedDrawCalls); - } - if (points > 0) - { - if (FAILED(D3D::dev->DrawIndexedPrimitiveUP( - D3DPT_POINTLIST, - 0, numverts, points, - GetPointIndexBuffer(), - D3DFMT_INDEX16, - s_pBaseBufferPointer, - stride))) - { - DumpBadShaders(); - } - INCSTAT(stats.thisFrame.numIndexedDrawCalls); - } -} - -void VertexManager::vFlush() -{ - u32 usedtextures = 0; - for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i) - if (bpmem.tevorders[i / 2].getEnable(i & 1)) - usedtextures |= 1 << bpmem.tevorders[i/2].getTexMap(i & 1); - - if (bpmem.genMode.numindstages > 0) - for (unsigned int i = 0; i < bpmem.genMode.numtevstages + 1; ++i) - if (bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages) - usedtextures |= 1 << bpmem.tevindref.getTexMap(bpmem.tevind[i].bt); - - for (unsigned int i = 0; i < 8; i++) - { - if (usedtextures & (1 << i)) - { - g_renderer->SetSamplerState(i & 3, i >> 2); - FourTexUnits &tex = bpmem.tex[i >> 2]; - TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, - (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, - tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, - tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, - tex.texTlut[i&3].tlut_format, - (tex.texMode0[i&3].min_filter & 3), - (tex.texMode1[i&3].max_lod + 0xf) / 0x10, - tex.texImage1[i&3].image_type); - - if (tentry) - { - // 0s are probably for no manual wrapping needed. - PixelShaderManager::SetTexDims(i, tentry->native_width, tentry->native_height, 0, 0); - } - else - ERROR_LOG(VIDEO, "Error loading texture"); - } - } - - // set global constants - VertexShaderManager::SetConstants(); - PixelShaderManager::SetConstants(g_nativeVertexFmt->m_components); - u32 stride = g_nativeVertexFmt->GetVertexStride(); - bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && - bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - bool useDualSource = useDstAlpha && g_ActiveConfig.backend_info.bSupportsDualSourceBlend; - DSTALPHA_MODE AlphaMode = useDualSource ? DSTALPHA_DUAL_SOURCE_BLEND : DSTALPHA_NONE; - - if (!PixelShaderCache::SetShader(AlphaMode ,g_nativeVertexFmt->m_components)) - { - GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");}); - goto shader_fail; - } - if (!VertexShaderCache::SetShader(g_nativeVertexFmt->m_components)) - { - GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set vertex shader\n");}); - goto shader_fail; - - } - PrepareDrawBuffers(stride); - g_nativeVertexFmt->SetupVertexPointers(); - g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); - if(m_buffers_count) - { - DrawVertexBuffer(stride); - } - else - { - DrawVertexArray(stride); - } - g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); - if (useDstAlpha && !useDualSource) - { - if (!PixelShaderCache::SetShader(DSTALPHA_ALPHA_PASS, g_nativeVertexFmt->m_components)) - { - GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");}); - goto shader_fail; - } - // update alpha only - g_renderer->ApplyState(true); - if(m_buffers_count) - { - DrawVertexBuffer(stride); - } - else - { - DrawVertexArray(stride); - } - g_renderer->RestoreState(); - } - GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true); - -shader_fail: - if(m_buffers_count) - { - m_index_buffer_cursor += IndexGenerator::GetTriangleindexLen() + IndexGenerator::GetLineindexLen() + IndexGenerator::GetPointindexLen(); - m_vertex_buffer_cursor += IndexGenerator::GetNumVerts() * stride; - } -} - -} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.h deleted file mode 100644 index 81a1c58211..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef _VERTEXMANAGER_H -#define _VERTEXMANAGER_H - -#include "CPMemory.h" -#include "VertexLoader.h" - -#include "VertexManagerBase.h" - -namespace DX9 -{ - -class VertexManager : public ::VertexManager -{ -public: - NativeVertexFormat* CreateNativeVertexFormat(); - void GetElements(NativeVertexFormat* format, D3DVERTEXELEMENT9** elems, int* num); - void CreateDeviceObjects(); - void DestroyDeviceObjects(); -private: - u32 m_vertex_buffer_cursor; - u32 m_vertex_buffer_size; - u32 m_index_buffer_cursor; - u32 m_index_buffer_size; - u32 m_buffers_count; - u32 m_current_vertex_buffer; - u32 m_current_stride; - u32 m_current_index_buffer; - LPDIRECT3DVERTEXBUFFER9 *m_vertex_buffers; - LPDIRECT3DINDEXBUFFER9 *m_index_buffers; - void PrepareDrawBuffers(u32 stride); - void DrawVertexBuffer(int stride); - void DrawVertexArray(int stride); - // temp - void vFlush(); -}; - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp deleted file mode 100644 index 2d11368a6d..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include - -#include "Common.h" -#include "FileUtil.h" -#include "LinearDiskCache.h" - -#include "Globals.h" -#include "D3DBase.h" -#include "D3DShader.h" -#include "Statistics.h" -#include "VideoConfig.h" -#include "VertexShaderCache.h" -#include "VertexLoader.h" -#include "BPMemory.h" -#include "XFMemory.h" -#include "Debugger.h" -#include "ConfigManager.h" - -namespace DX9 -{ - -VertexShaderCache::VSCache VertexShaderCache::vshaders; -const VertexShaderCache::VSCacheEntry *VertexShaderCache::last_entry; -VertexShaderUid VertexShaderCache::last_uid; -UidChecker VertexShaderCache::vertex_uid_checker; - -#define MAX_SSAA_SHADERS 3 - -static LPDIRECT3DVERTEXSHADER9 SimpleVertexShader[MAX_SSAA_SHADERS]; -static LPDIRECT3DVERTEXSHADER9 ClearVertexShader; - -LinearDiskCache g_vs_disk_cache; - -LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetSimpleVertexShader(int level) -{ - return SimpleVertexShader[level % MAX_SSAA_SHADERS]; -} - -LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetClearVertexShader() -{ - return ClearVertexShader; -} - -// this class will load the precompiled shaders into our cache -class VertexShaderCacheInserter : public LinearDiskCacheReader -{ -public: - void Read(const VertexShaderUid &key, const u8 *value, u32 value_size) - { - VertexShaderCache::InsertByteCode(key, value, value_size, false); - } -}; - -void VertexShaderCache::Init() -{ - char* vProg = new char[2048]; - sprintf(vProg,"struct VSOUTPUT\n" - "{\n" - "float4 vPosition : POSITION;\n" - "float2 vTexCoord : TEXCOORD0;\n" - "float vTexCoord1 : TEXCOORD1;\n" - "};\n" - "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inTEX1 : TEXCOORD1,float inTEX2 : TEXCOORD2)\n" - "{\n" - "VSOUTPUT OUT;\n" - "OUT.vPosition = inPosition;\n" - "OUT.vTexCoord = inTEX0;\n" - "OUT.vTexCoord1 = inTEX2;\n" - "return OUT;\n" - "}\n"); - - SimpleVertexShader[0] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); - - sprintf(vProg,"struct VSOUTPUT\n" - "{\n" - "float4 vPosition : POSITION;\n" - "float4 vColor0 : COLOR0;\n" - "};\n" - "VSOUTPUT main(float4 inPosition : POSITION,float4 inColor0: COLOR0)\n" - "{\n" - "VSOUTPUT OUT;\n" - "OUT.vPosition = inPosition;\n" - "OUT.vColor0 = inColor0;\n" - "return OUT;\n" - "}\n"); - - ClearVertexShader = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); - sprintf(vProg, "struct VSOUTPUT\n" - "{\n" - "float4 vPosition : POSITION;\n" - "float2 vTexCoord : TEXCOORD0;\n" - "float vTexCoord1 : TEXCOORD1;\n" - "};\n" - "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inInvTexSize : TEXCOORD1,float inTEX2 : TEXCOORD2)\n" - "{\n" - "VSOUTPUT OUT;" - "OUT.vPosition = inPosition;\n" - "OUT.vTexCoord = inTEX0;\n" - "OUT.vTexCoord1 = inTEX2;\n" - "return OUT;\n" - "}\n"); - SimpleVertexShader[1] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); - - sprintf(vProg, "struct VSOUTPUT\n" - "{\n" - "float4 vPosition : POSITION;\n" - "float4 vTexCoord : TEXCOORD0;\n" - "float vTexCoord1 : TEXCOORD1;\n" - "float4 vTexCoord2 : TEXCOORD2;\n" - "float4 vTexCoord3 : TEXCOORD3;\n" - "};\n" - "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inTEX1 : TEXCOORD1,float inTEX2 : TEXCOORD2)\n" - "{\n" - "VSOUTPUT OUT;" - "OUT.vPosition = inPosition;\n" - "OUT.vTexCoord = inTEX0.xyyx;\n" - "OUT.vTexCoord1 = inTEX2.x;\n" - "OUT.vTexCoord2 = inTEX0.xyyx + (float4(-1.0f,-0.5f, 1.0f,-0.5f) * inTEX1.xyyx);\n" - "OUT.vTexCoord3 = inTEX0.xyyx + (float4( 1.0f, 0.5f,-1.0f, 0.5f) * inTEX1.xyyx);\n" - "return OUT;\n" - "}\n"); - SimpleVertexShader[2] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); - - Clear(); - delete [] vProg; - - if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) - File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); - - SETSTAT(stats.numVertexShadersCreated, 0); - SETSTAT(stats.numVertexShadersAlive, 0); - - char cache_filename[MAX_PATH]; - sprintf(cache_filename, "%sdx9-%s-vs.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); - VertexShaderCacheInserter inserter; - g_vs_disk_cache.OpenAndRead(cache_filename, inserter); - - if (g_Config.bEnableShaderDebugging) - Clear(); - - last_entry = NULL; -} - -void VertexShaderCache::Clear() -{ - for (VSCache::iterator iter = vshaders.begin(); iter != vshaders.end(); ++iter) - iter->second.Destroy(); - vshaders.clear(); - vertex_uid_checker.Invalidate(); - - last_entry = NULL; -} - -void VertexShaderCache::Shutdown() -{ - for (int i = 0; i < MAX_SSAA_SHADERS; i++) - { - if (SimpleVertexShader[i]) - SimpleVertexShader[i]->Release(); - SimpleVertexShader[i] = NULL; - } - - if (ClearVertexShader) - ClearVertexShader->Release(); - ClearVertexShader = NULL; - - Clear(); - g_vs_disk_cache.Sync(); - g_vs_disk_cache.Close(); -} - -bool VertexShaderCache::SetShader(u32 components) -{ - VertexShaderUid uid; - GetVertexShaderUid(uid, components, API_D3D9); - if (g_ActiveConfig.bEnableShaderDebugging) - { - VertexShaderCode code; - GenerateVertexShaderCode(code, components, API_D3D9); - vertex_uid_checker.AddToIndexAndCheck(code, uid, "Vertex", "v"); - } - - if (last_entry) - { - if (uid == last_uid) - { - GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); - return (last_entry->shader != NULL); - } - } - - last_uid = uid; - - VSCache::iterator iter = vshaders.find(uid); - if (iter != vshaders.end()) - { - const VSCacheEntry &entry = iter->second; - last_entry = &entry; - - if (entry.shader) D3D::SetVertexShader(entry.shader); - GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); - return (entry.shader != NULL); - } - - VertexShaderCode code; - GenerateVertexShaderCode(code, components, API_D3D9); - - u8 *bytecode; - int bytecodelen; - if (!D3D::CompileVertexShader(code.GetBuffer(), (int)strlen(code.GetBuffer()), &bytecode, &bytecodelen)) - { - GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); - return false; - } - g_vs_disk_cache.Append(uid, bytecode, bytecodelen); - - bool success = InsertByteCode(uid, bytecode, bytecodelen, true); - if (g_ActiveConfig.bEnableShaderDebugging && success) - { - vshaders[uid].code = code.GetBuffer(); - } - delete [] bytecode; - GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); - return success; -} - -bool VertexShaderCache::InsertByteCode(const VertexShaderUid &uid, const u8 *bytecode, int bytecodelen, bool activate) { - LPDIRECT3DVERTEXSHADER9 shader = D3D::CreateVertexShaderFromByteCode(bytecode, bytecodelen); - - // Make an entry in the table - VSCacheEntry entry; - entry.shader = shader; - - vshaders[uid] = entry; - last_entry = &vshaders[uid]; - if (!shader) - return false; - - INCSTAT(stats.numVertexShadersCreated); - SETSTAT(stats.numVertexShadersAlive, (int)vshaders.size()); - if (activate) - { - D3D::SetVertexShader(shader); - return true; - } - return false; -} - -void Renderer::SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - const float f[4] = { f1, f2, f3, f4 }; - DX9::D3D::dev->SetVertexShaderConstantF(const_number, f, 1); -} - -void Renderer::SetVSConstant4fv(unsigned int const_number, const float *f) -{ - DX9::D3D::dev->SetVertexShaderConstantF(const_number, f, 1); -} - -void Renderer::SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f) -{ - float buf[4*C_VENVCONST_END]; - for (unsigned int i = 0; i < count; i++) - { - buf[4*i ] = *f++; - buf[4*i+1] = *f++; - buf[4*i+2] = *f++; - buf[4*i+3] = 0.f; - } - DX9::D3D::dev->SetVertexShaderConstantF(const_number, buf, count); -} - -void Renderer::SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - DX9::D3D::dev->SetVertexShaderConstantF(const_number, f, count); -} - -} // namespace DX9 diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h deleted file mode 100644 index 32fbea92be..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#pragma once - -#include "D3DBase.h" - -#include -#include - -#include "D3DBase.h" -#include "VertexShaderGen.h" - -namespace DX9 -{ - -class VertexShaderCache -{ -private: - struct VSCacheEntry - { - LPDIRECT3DVERTEXSHADER9 shader; - - std::string code; - - VSCacheEntry() : shader(NULL) {} - void Destroy() - { - if (shader) - shader->Release(); - shader = NULL; - } - }; - - typedef std::map VSCache; - - static VSCache vshaders; - static const VSCacheEntry *last_entry; - static VertexShaderUid last_uid; - - static UidChecker vertex_uid_checker; - - static void Clear(); - -public: - static void Init(); - static void Shutdown(); - static bool SetShader(u32 components); - static LPDIRECT3DVERTEXSHADER9 GetSimpleVertexShader(int level); - static LPDIRECT3DVERTEXSHADER9 GetClearVertexShader(); - static bool InsertByteCode(const VertexShaderUid &uid, const u8 *bytecode, int bytecodelen, bool activate); - - static std::string GetCurrentShaderCode(); -}; - -} // namespace DX9 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VideoBackend.h b/Source/Plugins/Plugin_VideoDX9/Src/VideoBackend.h deleted file mode 100644 index 5b7c54d326..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/VideoBackend.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef DX9_VIDEO_BACKEND_H_ -#define DX9_VIDEO_BACKEND_H_ - -#include "VideoBackendBase.h" - -namespace DX9 -{ - -class VideoBackend : public VideoBackendHardware -{ - bool Initialize(void *&); - void Shutdown(); - - std::string GetName(); - std::string GetDisplayName(); - - void Video_Prepare(); - void Video_Cleanup(); - - void ShowConfig(void* parent); - - void UpdateFPSDisplay(const char*); - unsigned int PeekMessages(); -}; - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp deleted file mode 100644 index 1a4e1bf84d..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "Common.h" -#include "Atomic.h" -#include "Thread.h" -#include "LogManager.h" - -#if defined(HAVE_WX) && HAVE_WX -#include "VideoConfigDiag.h" -#endif // HAVE_WX - -#if defined(HAVE_WX) && HAVE_WX -#include "Debugger/DebuggerPanel.h" -#endif // HAVE_WX - -#include "MainBase.h" -#include "main.h" -#include "VideoConfig.h" -#include "Fifo.h" -#include "OpcodeDecoding.h" -#include "TextureCache.h" -#include "BPStructs.h" -#include "VertexManager.h" -#include "FramebufferManager.h" -#include "VertexLoaderManager.h" -#include "VertexShaderManager.h" -#include "PixelShaderManager.h" -#include "VertexShaderCache.h" -#include "PixelShaderCache.h" -#include "CommandProcessor.h" -#include "PixelEngine.h" -#include "OnScreenDisplay.h" -#include "D3DTexture.h" -#include "D3DUtil.h" -#include "EmuWindow.h" -#include "VideoState.h" -#include "Render.h" -#include "DLCache.h" -#include "IndexGenerator.h" -#include "IniFile.h" -#include "Core.h" -#include "Host.h" - -#include "ConfigManager.h" -#include "VideoBackend.h" -#include "PerfQuery.h" - -namespace DX9 -{ - -unsigned int VideoBackend::PeekMessages() -{ - MSG msg; - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - return FALSE; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return TRUE; -} - -void VideoBackend::UpdateFPSDisplay(const char *text) -{ - TCHAR temp[512]; - swprintf_s(temp, sizeof(temp)/sizeof(TCHAR), _T("%hs | DX9 | %hs"), scm_rev_str, text); - EmuWindow::SetWindowText(temp); -} - -std::string VideoBackend::GetName() -{ - return "DX9"; -} - -std::string VideoBackend::GetDisplayName() -{ - return "Direct3D9 (deprecated)"; -} - -void InitBackendInfo() -{ - DX9::D3D::Init(); - D3DCAPS9 device_caps = DX9::D3D::GetCaps(); - const int shaderModel = ((device_caps.PixelShaderVersion >> 8) & 0xFF); - const int maxConstants = (shaderModel < 3) ? 32 : ((shaderModel < 4) ? 224 : 65536); - g_Config.backend_info.APIType = shaderModel < 3 ? API_D3D9_SM20 : API_D3D9_SM30; - g_Config.backend_info.bUseRGBATextures = false; - g_Config.backend_info.bUseMinimalMipCount = true; - g_Config.backend_info.bSupports3DVision = true; - g_Config.backend_info.bSupportsPrimitiveRestart = false; // TODO: figure out if it does - g_Config.backend_info.bSupportsSeparateAlphaFunction = device_caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND; - // Dual source blend disabled by default until a proper method to test for support is found - g_Config.backend_info.bSupportsDualSourceBlend = false; - g_Config.backend_info.bSupportsFormatReinterpretation = true; - g_Config.backend_info.bSupportsPixelLighting = C_PLIGHTS + 40 <= maxConstants && C_PMATERIALS + 4 <= maxConstants; - g_Config.backend_info.bSupportsEarlyZ = false; - - // adapters - g_Config.backend_info.Adapters.clear(); - for (int i = 0; i < DX9::D3D::GetNumAdapters(); ++i) - g_Config.backend_info.Adapters.push_back(DX9::D3D::GetAdapter(i).ident.Description); - - // aamodes - g_Config.backend_info.AAModes.clear(); - if (g_Config.iAdapter < DX9::D3D::GetNumAdapters()) - { - const DX9::D3D::Adapter &adapter = DX9::D3D::GetAdapter(g_Config.iAdapter); - - for (int i = 0; i < (int)adapter.aa_levels.size(); ++i) - g_Config.backend_info.AAModes.push_back(adapter.aa_levels[i].name); - } - - // Clear ppshaders string vector - g_Config.backend_info.PPShaders.clear(); - - DX9::D3D::Shutdown(); -} - -void VideoBackend::ShowConfig(void* parent) -{ -#if defined(HAVE_WX) && HAVE_WX - InitBackendInfo(); - VideoConfigDiag diag((wxWindow*)parent, _trans("Direct3D9"), "gfx_dx9"); - diag.ShowModal(); -#endif -} - -bool VideoBackend::Initialize(void *&window_handle) -{ - InitializeShared(); - InitBackendInfo(); - - frameCount = 0; - - g_Config.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_dx9.ini").c_str()); - g_Config.GameIniLoad(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strGameIni.c_str()); - g_Config.UpdateProjectionHack(); - g_Config.VerifyValidity(); - UpdateActiveConfig(); - - window_handle = (void*)EmuWindow::Create((HWND)window_handle, GetModuleHandle(0), _T("Loading - Please wait.")); - if (window_handle == NULL) - { - ERROR_LOG(VIDEO, "An error has occurred while trying to create the window."); - return false; - } - else if (FAILED(DX9::D3D::Init())) - { - MessageBox(GetActiveWindow(), _T("Unable to initialize Direct3D. Please make sure that you have the latest version of DirectX 9.0c correctly installed."), _T("Fatal Error"), MB_ICONERROR|MB_OK); - return false; - } - - s_BackendInitialized = true; - - return true; -} - -void VideoBackend::Video_Prepare() -{ - // Better be safe... - s_efbAccessRequested = FALSE; - s_FifoShuttingDown = FALSE; - s_swapRequested = FALSE; - - // internal interfaces - g_vertex_manager = new VertexManager; - g_perf_query = new PerfQuery; - g_renderer = new Renderer; - g_texture_cache = new TextureCache; - // VideoCommon - BPInit(); - Fifo_Init(); - IndexGenerator::Init(); - VertexLoaderManager::Init(); - OpcodeDecoder_Init(); - VertexShaderManager::Init(); - PixelShaderManager::Init(); - CommandProcessor::Init(); - PixelEngine::Init(); - DLCache::Init(); - // Notify the core that the video backend is ready - Host_Message(WM_USER_CREATE); -} - -void VideoBackend::Shutdown() -{ - s_BackendInitialized = false; - - // TODO: should be in Video_Cleanup - if (g_renderer) - { - s_efbAccessRequested = FALSE; - s_FifoShuttingDown = FALSE; - s_swapRequested = FALSE; - - // VideoCommon - DLCache::Shutdown(); - Fifo_Shutdown(); - CommandProcessor::Shutdown(); - PixelShaderManager::Shutdown(); - VertexShaderManager::Shutdown(); - OpcodeDecoder_Shutdown(); - VertexLoaderManager::Shutdown(); - - // internal interfaces - PixelShaderCache::Shutdown(); - VertexShaderCache::Shutdown(); - delete g_texture_cache; - delete g_renderer; - delete g_perf_query; - delete g_vertex_manager; - g_renderer = NULL; - g_texture_cache = NULL; - } - D3D::Shutdown(); -} - -void VideoBackend::Video_Cleanup() { -} - -} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.h b/Source/Plugins/Plugin_VideoDX9/Src/main.h deleted file mode 100644 index 07d615b6e1..0000000000 --- a/Source/Plugins/Plugin_VideoDX9/Src/main.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#ifndef MAIN_H -#define MAIN_H - -#include - -#include "VideoBackend.h" -#include "Render.h" -#include "MainBase.h" - -#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj deleted file mode 100644 index 403aac2c30..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj +++ /dev/null @@ -1,256 +0,0 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {1909CD2D-1707-456F-86CA-0DF42A727C99} - Plugin_VideoOGL - VideoOGL - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\GLew\include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {3e1339f5-9311-4122-9442-369702e8fcad} - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp deleted file mode 100644 index 382784b502..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include "Globals.h" - -#include "GLUtil.h" - -#include - -#include "Statistics.h" -#include "VideoConfig.h" -#include "ImageWrite.h" -#include "Common.h" -#include "Render.h" -#include "VertexShaderGen.h" -#include "ProgramShaderCache.h" -#include "PixelShaderManager.h" -#include "OnScreenDisplay.h" -#include "StringUtil.h" -#include "FileUtil.h" -#include "Debugger.h" - -namespace OGL -{ - -void SetPSConstant4fvByName(const char * name, unsigned int offset, const float *f, const unsigned int count = 1) -{ - ProgramShaderCache::PCacheEntry tmp = ProgramShaderCache::GetShaderProgram(); - for (int a = 0; a < NUM_UNIFORMS; ++a) - { - if (!strcmp(name, UniformNames[a])) - { - if (tmp.shader.UniformLocations[a] == -1) - return; - else - { - glUniform4fv(tmp.shader.UniformLocations[a] + offset, count, f); - return; - } - } - } -} - -// Renderer functions -void Renderer::SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - float const f[4] = {f1, f2, f3, f4}; - - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiPSConstant4fv(const_number, f, 1); - return; - } - for (unsigned int a = 0; a < 10; ++a) - { - if (const_number >= PSVar_Loc[a].reg && const_number < (PSVar_Loc[a].reg + PSVar_Loc[a].size)) - { - unsigned int offset = const_number - PSVar_Loc[a].reg; - SetPSConstant4fvByName(PSVar_Loc[a].name, offset, f); - return; - } - } -} - -void Renderer::SetPSConstant4fv(unsigned int const_number, const float *f) -{ - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiPSConstant4fv(const_number, f, 1); - return; - } - for (unsigned int a = 0; a < 10; ++a) - { - if (const_number >= PSVar_Loc[a].reg && const_number < (PSVar_Loc[a].reg + PSVar_Loc[a].size)) - { - unsigned int offset = const_number - PSVar_Loc[a].reg; - SetPSConstant4fvByName(PSVar_Loc[a].name, offset, f); - return; - } - } -} - -void Renderer::SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiPSConstant4fv(const_number, f, count); - return; - } - for (unsigned int a = 0; a < 10; ++a) - { - if (const_number >= PSVar_Loc[a].reg && const_number < (PSVar_Loc[a].reg + PSVar_Loc[a].size)) - { - unsigned int offset = const_number - PSVar_Loc[a].reg; - SetPSConstant4fvByName(PSVar_Loc[a].name, offset, f, count); - return; - } - } -} -} // namespace OGL diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.h b/Source/Plugins/Plugin_VideoOGL/Src/Render.h deleted file mode 100644 index a570faab85..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.h +++ /dev/null @@ -1,99 +0,0 @@ - -#ifndef _RENDER_H_ -#define _RENDER_H_ - -#include "RenderBase.h" - -namespace OGL -{ - -void ClearEFBCache(); - -enum GLSL_VERSION { - GLSL_120, - GLSL_130, - GLSL_140, - GLSL_150, // and above - GLSLES3 -}; - -// ogl-only config, so not in VideoConfig.h -extern struct VideoConfig { - bool bSupportsGLSLCache; - bool bSupportsGLPinnedMemory; - bool bSupportsGLSync; - bool bSupportsGLBaseVertex; - bool bSupportCoverageMSAA; - bool bSupportSampleShading; - GLSL_VERSION eSupportedGLSLVersion; - bool bSupportOGL31; - - const char *gl_vendor; - const char *gl_renderer; - const char* gl_version; - const char* glsl_version; - - s32 max_samples; -} g_ogl_config; - -class Renderer : public ::Renderer -{ -public: - Renderer(); - ~Renderer(); - - static void Init(); - static void Shutdown(); - - void SetColorMask(); - void SetBlendMode(bool forceUpdate); - void SetScissorRect(const TargetRectangle& rc); - void SetGenerationMode(); - void SetDepthMode(); - void SetLogicOpMode(); - void SetDitherMode(); - void SetLineWidth(); - void SetSamplerState(int stage,int texindex); - void SetInterlacingMode(); - - // TODO: Implement and use these - void ApplyState(bool bUseDstAlpha) {} - void RestoreState() {} - - void RenderText(const char* pstr, int left, int top, u32 color); - void DrawDebugInfo(); - void FlipImageData(u8 *data, int w, int h); - - u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data); - - void ResetAPIState(); - void RestoreAPIState(); - - TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc); - - void Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma); - - void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z); - - void ReinterpretPixelData(unsigned int convtype); - - void UpdateViewport(Matrix44& vpCorrection); - - bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc); - - void SetPSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetPSConstant4fv(unsigned int const_number, const float *f); - void SetMultiPSConstant4fv(unsigned int const_number, unsigned int count, const float *f); - - void SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4); - void SetVSConstant4fv(unsigned int const_number, const float *f); - void SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f); - void SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f); - -private: - void UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data); -}; - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp deleted file mode 100644 index acf72eeeee..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 -// Refer to the license.txt file included. - -#include - -#include "Globals.h" -#include "VideoConfig.h" -#include "Statistics.h" - -#include "GLUtil.h" - -#include "Render.h" -#include "VertexShaderGen.h" -#include "VertexShaderManager.h" -#include "ProgramShaderCache.h" -#include "VertexManager.h" -#include "VertexLoader.h" -#include "XFMemory.h" -#include "ImageWrite.h" -#include "FileUtil.h" -#include "Debugger.h" - -namespace OGL -{ - -void SetVSConstant4fvByName(const char * name, unsigned int offset, const float *f, const unsigned int count = 1) -{ - ProgramShaderCache::PCacheEntry tmp = ProgramShaderCache::GetShaderProgram(); - for (int a = 0; a < NUM_UNIFORMS; ++a) - { - if (!strcmp(name, UniformNames[a])) - { - if (tmp.shader.UniformLocations[a] == -1) - return; - else - { - glUniform4fv(tmp.shader.UniformLocations[a] + offset, count, f); - return; - } - } - } -} - -void Renderer::SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4) -{ - float const buf[4] = {f1, f2, f3, f4}; - - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiVSConstant4fv(const_number, buf, 1); - return; - } - for (unsigned int a = 0; a < 9; ++a) - { - if (const_number >= VSVar_Loc[a].reg && const_number < ( VSVar_Loc[a].reg + VSVar_Loc[a].size)) - { - unsigned int offset = const_number - VSVar_Loc[a].reg; - SetVSConstant4fvByName(VSVar_Loc[a].name, offset, buf); - return; - } - } -} - -void Renderer::SetVSConstant4fv(unsigned int const_number, const float *f) -{ - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiVSConstant4fv(const_number, f, 1); - return; - } - for (unsigned int a = 0; a < 9; ++a) - { - if (const_number >= VSVar_Loc[a].reg && const_number < ( VSVar_Loc[a].reg + VSVar_Loc[a].size)) - { - unsigned int offset = const_number - VSVar_Loc[a].reg; - SetVSConstant4fvByName(VSVar_Loc[a].name, offset, f); - return; - } - } -} - -void Renderer::SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f) -{ - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiVSConstant4fv(const_number, f, count); - return; - } - for (unsigned int a = 0; a < 9; ++a) - { - if (const_number >= VSVar_Loc[a].reg && const_number < ( VSVar_Loc[a].reg + VSVar_Loc[a].size)) - { - unsigned int offset = const_number - VSVar_Loc[a].reg; - SetVSConstant4fvByName(VSVar_Loc[a].name, offset, f, count); - return; - } - } -} - -void Renderer::SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f) -{ - float buf[4 * C_VENVCONST_END]; - for (unsigned int i = 0; i < count; i++) - { - buf[4*i ] = *f++; - buf[4*i+1] = *f++; - buf[4*i+2] = *f++; - buf[4*i+3] = 0.f; - } - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - ProgramShaderCache::SetMultiVSConstant4fv(const_number, buf, count); - return; - } - for (unsigned int a = 0; a < 9; ++a) - { - if (const_number >= VSVar_Loc[a].reg && const_number < ( VSVar_Loc[a].reg + VSVar_Loc[a].size)) - { - unsigned int offset = const_number - VSVar_Loc[a].reg; - SetVSConstant4fvByName(VSVar_Loc[a].name, offset, buf, count); - return; - } - } -} - -} // namespace OGL diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VideoBackend.h b/Source/Plugins/Plugin_VideoOGL/Src/VideoBackend.h deleted file mode 100644 index 137c09a973..0000000000 --- a/Source/Plugins/Plugin_VideoOGL/Src/VideoBackend.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef OGL_VIDEO_BACKEND_H_ -#define OGL_VIDEO_BACKEND_H_ - -#include "VideoBackendBase.h" - -namespace OGL -{ - -class VideoBackend : public VideoBackendHardware -{ - bool Initialize(void *&); - void Shutdown(); - - std::string GetName(); - std::string GetDisplayName(); - - void Video_Prepare(); - void Video_Cleanup(); - - void ShowConfig(void* parent); - - void UpdateFPSDisplay(const char*); - unsigned int PeekMessages(); -}; - -} - -#endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj b/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj deleted file mode 100644 index 0f18d096f8..0000000000 --- a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj +++ /dev/null @@ -1,248 +0,0 @@ - - - - - DebugFast - Win32 - - - DebugFast - x64 - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9E9DA440-E9AD-413C-B648-91030E792211} - Plugin_VideoSoftware - VideoSoftware - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - false - - - StaticLibrary - false - Unicode - - - StaticLibrary - - - Unicode - - - StaticLibrary - - - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - opengl32.lib;glew32s.lib;glu32.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - opengl32.lib;glew64s.lib;glu32.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glew32s.lib;glu32.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - true - true - true - opengl32.lib;glew64s.lib;glu32.lib;%(AdditionalDependencies) - ..\..\..\Externals\GLew;%(AdditionalLibraryDirectories) - ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - - - ..\..\Core\Common\Src;..\..\Core\Core\Src;..\..\Core\VideoCommon\Src;..\..\Core\DolphinWX\Src;..\..\..\Externals\GLew\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\Include;..\..\..\Externals;%(AdditionalIncludeDirectories) - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf} - - - - - - - - - \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj.filters b/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj.filters deleted file mode 100644 index 14be6ff447..0000000000 --- a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcxproj.filters +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {081288cb-a63b-4ae9-93eb-e668568520b8} - - - \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoBackend.h b/Source/Plugins/Plugin_VideoSoftware/Src/VideoBackend.h deleted file mode 100644 index 37fe817f07..0000000000 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoBackend.h +++ /dev/null @@ -1,63 +0,0 @@ - -#ifndef SW_VIDEO_BACKEND_H_ -#define SW_VIDEO_BACKEND_H_ - -#include "VideoBackendBase.h" - -namespace SW -{ - -class VideoSoftware : public VideoBackend -{ - bool Initialize(void *&); - void Shutdown(); - - std::string GetName(); - - void EmuStateChange(EMUSTATE_CHANGE newState); - - void RunLoop(bool enable); - - void ShowConfig(void* parent); - - void Video_Prepare(); - void Video_Cleanup(); - - void Video_EnterLoop(); - void Video_ExitLoop(); - void Video_BeginField(u32, FieldType, u32, u32); - void Video_EndField(); - - u32 Video_AccessEFB(EFBAccessType, u32, u32, u32); - u32 Video_GetQueryResult(PerfQueryType type); - - void Video_AddMessage(const char* pstr, unsigned int milliseconds); - void Video_ClearMessages(); - bool Video_Screenshot(const char* filename); - - void Video_SetRendering(bool bEnabled); - - void Video_GatherPipeBursted(); - bool Video_IsHiWatermarkActive(); - bool Video_IsPossibleWaitingSetDrawDone(); - void Video_AbortFrame(); - - readFn16 Video_CPRead16(); - writeFn16 Video_CPWrite16(); - readFn16 Video_PERead16(); - writeFn16 Video_PEWrite16(); - writeFn32 Video_PEWrite32(); - - void UpdateFPSDisplay(const char*); - unsigned int PeekMessages(); - - void PauseAndLock(bool doLock, bool unpauseOnUnlock=true); - void DoState(PointerWrap &p); - -public: - void CheckInvalidState(); -}; - -} - -#endif diff --git a/Source/TestSuite/ASM/source/Init.cpp b/Source/TestSuite/ASM/source/Init.cpp index cd2ab852b1..610e7b5bb1 100644 --- a/Source/TestSuite/ASM/source/Init.cpp +++ b/Source/TestSuite/ASM/source/Init.cpp @@ -38,29 +38,29 @@ void init_crap() { VIDEO_Init(); WPAD_Init(); PAD_Init(); - + // Obtain the preferred video mode from the system // This will correspond to the settings in the Wii menu rmode = VIDEO_GetPreferredMode(NULL); - + // Allocate memory for the display in the uncached region xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); - + // Initialise the console, required for printf console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ); - + // Set up the video registers with the chosen mode VIDEO_Configure(rmode); - + // Tell the video hardware where our display memory is VIDEO_SetNextFramebuffer(xfb); - + // Make the display visible VIDEO_SetBlack(FALSE); - + // Flush the video register changes to the hardware VIDEO_Flush(); - + // Wait for Video setup to complete VIDEO_WaitVSync(); if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync(); diff --git a/Source/TestSuite/ASM/source/asm_tables.cpp b/Source/TestSuite/ASM/source/asm_tables.cpp index 6f3c1accef..d775b138aa 100644 --- a/Source/TestSuite/ASM/source/asm_tables.cpp +++ b/Source/TestSuite/ASM/source/asm_tables.cpp @@ -59,22 +59,22 @@ void ShowModifies(u32 inst) void RunInstruction(u32 inst) { u32 inval1, inval2, inval3; - + u32 outval = 0; - + // CR0 u32 cr1 = 0, cr2 = 0; - + //CR1 u32 cr11 = 0, cr12 = 0; - + //XER u32 xer1 = 0, xer2 = 0; - + bool modCR0 = instructions[inst].Modifies & MOD_CR0; bool modCR1 = instructions[inst].Modifies & MOD_CR1; bool modXER = instructions[inst].Modifies & MOD_XER; - + if(instructions[inst].numInput != 3) { Print("Don't support Input not 3 yet~!\n"); @@ -92,7 +92,7 @@ void RunInstruction(u32 inst) f = fopen(temp, "wb"); if (!f) printf("unable to open output file\n"); - + printf("%s: InputNum: %d Modifies(flags): ", instructions[inst].name, instructions[inst].numInput); if(f) fprintf(f, "%s: InputNum: %d Modifies(flags): ", instructions[inst].name, instructions[inst].numInput); @@ -119,7 +119,7 @@ void RunInstruction(u32 inst) //Actually call instruction instructions[inst].Call(&outval, &inval1, &inval2, 0); - + // Get flags after if(modCR0) cr2 = GetCR0(); @@ -130,7 +130,7 @@ void RunInstruction(u32 inst) // Print out value printf(":o=%08x\n\t", outval); - + // show off flag changes if(modCR0) printf("CR0:(%08x ~ %08x)", cr1,cr2); @@ -138,8 +138,8 @@ void RunInstruction(u32 inst) printf("CR1:(%08x ~ %08x)", cr11,cr12); if(modXER) printf("XER:(%08x ~ %08x)", xer1, xer2); - - + + // same in the file if(f) { diff --git a/Source/TestSuite/ASM/source/asm_tables.h b/Source/TestSuite/ASM/source/asm_tables.h index 1f47a4c406..62dde85be1 100644 --- a/Source/TestSuite/ASM/source/asm_tables.h +++ b/Source/TestSuite/ASM/source/asm_tables.h @@ -32,7 +32,7 @@ struct inst inst_type type; void (*Call)(u32*, u32*, u32*, u32*); void (*CallFP)(float*, float*, float*, float*); - + }; static inst instructions[] = { diff --git a/Source/TestSuite/ASM/source/dolphintest_asm.cpp b/Source/TestSuite/ASM/source/dolphintest_asm.cpp index da3afdf73e..8bedaf0a69 100644 --- a/Source/TestSuite/ASM/source/dolphintest_asm.cpp +++ b/Source/TestSuite/ASM/source/dolphintest_asm.cpp @@ -31,13 +31,13 @@ int main(int argc, char **argv) { init_crap(); initialise_fat(); - + for (uint a = 0; a < sizeof(instructions) / sizeof(inst); ++a) { RunInstruction(a); } - + end(); - + return 0; } diff --git a/Source/TestSuite/AX/source/dolphintest_ax.cpp b/Source/TestSuite/AX/source/dolphintest_ax.cpp index 0b4b4152bb..b97e7e33e6 100644 --- a/Source/TestSuite/AX/source/dolphintest_ax.cpp +++ b/Source/TestSuite/AX/source/dolphintest_ax.cpp @@ -23,7 +23,7 @@ int main(int argc, char **argv) { while(1) { PAD_ScanPads(); VIDEO_ClearFrameBuffer(rmode, xfb, 0); - + VIDEO_WaitVSync(); } @@ -37,12 +37,12 @@ void * Initialise() { VIDEO_Init(); PAD_Init(); - + rmode = VIDEO_GetPreferredMode(NULL); framebuffer = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); console_init(framebuffer,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ); - + VIDEO_Configure(rmode); VIDEO_SetNextFramebuffer(framebuffer); VIDEO_SetBlack(FALSE); diff --git a/Source/TestSuite/FPU/source/asm.h b/Source/TestSuite/FPU/source/asm.h index 2feed006f4..ed28f7895b 100644 --- a/Source/TestSuite/FPU/source/asm.h +++ b/Source/TestSuite/FPU/source/asm.h @@ -191,7 +191,7 @@ #define STATE_OFFSET 204 #define MODE_OFFSET 206 - + #define FPR0_OFFSET 208 #define FPR1_OFFSET 216 #define FPR2_OFFSET 224 @@ -267,13 +267,13 @@ #define EXCEPTION_FRAME_END 728 #define IBAT0U 528 -#define IBAT0L 529 -#define IBAT1U 530 -#define IBAT1L 531 -#define IBAT2U 532 -#define IBAT2L 533 -#define IBAT3U 534 -#define IBAT3L 535 +#define IBAT0L 529 +#define IBAT1U 530 +#define IBAT1L 531 +#define IBAT2U 532 +#define IBAT2L 533 +#define IBAT3U 534 +#define IBAT3L 535 #define IBAT4U 560 #define IBAT4L 561 #define IBAT5U 562 @@ -284,12 +284,12 @@ #define IBAT7L 567 #define DBAT0U 536 -#define DBAT0L 537 -#define DBAT1U 538 -#define DBAT1L 539 -#define DBAT2U 540 -#define DBAT2L 541 -#define DBAT3U 542 +#define DBAT0L 537 +#define DBAT1U 538 +#define DBAT1L 539 +#define DBAT2U 540 +#define DBAT2L 541 +#define DBAT3U 542 #define DBAT3L 543 #define DBAT4U 568 #define DBAT4L 569 @@ -302,7 +302,7 @@ #define HID0 1008 #define HID1 1009 -#define HID2 920 +#define HID2 920 #define HID4 1011 #define GQR0 912 diff --git a/Source/TestSuite/PAD/source/dolphintest_pad.cpp b/Source/TestSuite/PAD/source/dolphintest_pad.cpp index ef85a4c356..1643206b3b 100644 --- a/Source/TestSuite/PAD/source/dolphintest_pad.cpp +++ b/Source/TestSuite/PAD/source/dolphintest_pad.cpp @@ -58,7 +58,7 @@ int main() (pad[a].button & PAD_BUTTON_LEFT ? "Left " : "")<< (pad[a].button & PAD_BUTTON_RIGHT ? "Right " : "")<ir.angle<<" deg\n"; drawdot(screen_buffer, rmode, rmode->fbWidth, rmode->xfbHeight, wd->ir.x, wd->ir.y, COLOR_RED); - drawdot(screen_buffer, rmode, rmode->fbWidth, rmode->xfbHeight, wd->ir.x + 10*sinf(theta), wd->ir.y - 10*cosf(theta), COLOR_BLUE); + drawdot(screen_buffer, rmode, rmode->fbWidth, rmode->xfbHeight, wd->ir.x + 10*sinf(theta), wd->ir.y - 10*cosf(theta), COLOR_BLUE); } else { std::cout<<" No Cursor\n\n"; } diff --git a/Source/UnitTests/AudioJitTests.cpp b/Source/UnitTests/AudioJitTests.cpp index 7712f59fc3..f078e8541b 100644 --- a/Source/UnitTests/AudioJitTests.cpp +++ b/Source/UnitTests/AudioJitTests.cpp @@ -86,7 +86,7 @@ void sbset() tester.Report(); } -void nx_s() +void nx_s() { DSPJitTester tester(0x8000, 0x0020); tester.AddTestData(DSP_REG_AR0); @@ -96,7 +96,7 @@ void nx_s() tester.Report(); } -void nx_sn() +void nx_sn() { DSPJitTester tester(0x8000, 0x0024); tester.AddTestData(DSP_REG_AR0); @@ -107,7 +107,7 @@ void nx_sn() tester.Report(); } -void nx_l() +void nx_l() { DSPJitTester tester(0x8000, 0x0040); @@ -118,7 +118,7 @@ void nx_l() tester.Report(); } -void set16_l() +void set16_l() { DSPJitTester tester(0x8e00, 0x0070); @@ -131,7 +131,7 @@ void set16_l() tester.Report(); } -void nx_ln() +void nx_ln() { DSPJitTester tester(0x8000, 0x0044); tester.AddTestData(DSP_REG_AR0); @@ -142,7 +142,7 @@ void nx_ln() tester.Report(); } -void nx_ls() +void nx_ls() { DSPJitTester tester1(0x8000, 0x0080); tester1.AddTestData(DSP_REG_ACM0); @@ -159,7 +159,7 @@ void nx_ls() tester2.Report(); } -void nx_lsn() +void nx_lsn() { DSPJitTester tester1(0x8000, 0x0084); tester1.AddTestData(DSP_REG_ACM0); @@ -177,7 +177,7 @@ void nx_lsn() tester2.Report(); } -void nx_lsm() +void nx_lsm() { DSPJitTester tester1(0x8000, 0x0088); tester1.AddTestData(DSP_REG_ACM0); @@ -195,7 +195,7 @@ void nx_lsm() tester2.Report(); } -void nx_lsnm() +void nx_lsnm() { DSPJitTester tester1(0x8000, 0x008c); tester1.AddTestData(DSP_REG_ACM0); @@ -214,7 +214,7 @@ void nx_lsnm() tester2.Report(); } -void nx_sl() +void nx_sl() { DSPJitTester tester1(0x8000, 0x0082); tester1.AddTestData(DSP_REG_ACM0); @@ -231,7 +231,7 @@ void nx_sl() tester2.Report(); } -void nx_sln() +void nx_sln() { DSPJitTester tester1(0x8000, 0x0086); tester1.AddTestData(DSP_REG_ACM0); @@ -249,7 +249,7 @@ void nx_sln() tester2.Report(); } -void nx_slm() +void nx_slm() { DSPJitTester tester1(0x8000, 0x008a); tester1.AddTestData(DSP_REG_ACM0); @@ -267,7 +267,7 @@ void nx_slm() tester2.Report(); } -void nx_slnm() +void nx_slnm() { DSPJitTester tester1(0x8000, 0x008e); tester1.AddTestData(DSP_REG_ACM0); @@ -286,7 +286,7 @@ void nx_slnm() tester2.Report(); } -void nx_ld() +void nx_ld() { DSPJitTester tester1(0x8000, 0x00c0); tester1.AddTestData(DSP_REG_AXL0,0xdead); diff --git a/Source/UnitTests/DSPJitTester.cpp b/Source/UnitTests/DSPJitTester.cpp index 8980391c56..a0c37057c5 100644 --- a/Source/UnitTests/DSPJitTester.cpp +++ b/Source/UnitTests/DSPJitTester.cpp @@ -6,8 +6,8 @@ DSPJitTester::DSPJitTester(u16 opcode, u16 opcode_ext, bool verbose, bool only_f instruction = opcode | opcode_ext; opcode_template = GetOpTemplate(instruction); sprintf(instruction_name, "%s", opcode_template->name); - if (opcode_template->extended) - sprintf(&instruction_name[strlen(instruction_name)], "'%s", + if (opcode_template->extended) + sprintf(&instruction_name[strlen(instruction_name)], "'%s", extOpTable[instruction & (((instruction >> 12) == 0x3) ? 0x7F : 0xFF)]->name); } bool DSPJitTester::Test(SDSP dsp_settings) @@ -17,7 +17,7 @@ bool DSPJitTester::Test(SDSP dsp_settings) printf("Running %s: ", instruction_name); DumpRegs(dsp_settings); } - + last_input_dsp = dsp_settings; last_int_dsp = RunInterpreter(dsp_settings); last_jit_dsp = RunJit(dsp_settings); diff --git a/Source/UnitTests/DSPJitTester.h b/Source/UnitTests/DSPJitTester.h index ac40fa41c0..e507d6dca8 100644 --- a/Source/UnitTests/DSPJitTester.h +++ b/Source/UnitTests/DSPJitTester.h @@ -1,62 +1,62 @@ // How to use the DSPJitTester: -// +// // == Before running == // Make sure to call Initialize to set initial stuff required by int and jit: // DSPJitTester::Initialize(); -// +// // == Creation of a testcase == // Create a testcase for a normal operation: // DSPJitTester tester(0x0004); //taken from DSPTables.cpp, opcodes[] -// +// // Create a testcase for an extended operation: // DSPJitTester tester(0x8000, 0x0004); //NX from opcodes, DR from opcodes_ext -// +// // By default, no messages are written. // To log all operations, set verbose to true: // DSPJitTester tester(0x8000, 0x0004, true); -// +// // You can also choose to only print failing tests: // DSPJitTester tester(0x8000, 0x0004, verbosity_setting, true); -// verbose = true will give the same output as verbose, +// verbose = true will give the same output as verbose, // while verbose = false will only (really!) print failing tests. -// +// // == Setting up values == // You can set the tester up with values for each DSP register: // tester.AddTestData(DSP_REG_ACC0, 1); // tester.AddTestData(DSP_REG_ACC0, 2); // tester.AddTestData(DSP_REG_ACC0, 3); -// +// // You can also choose to have a few predefined values added for a register: // tester.AddTestData(DSP_REG_ACC0); //see the method body for the values added -// +// // == Running the tests == -// After setup, you can either run JIT against the interpreter +// After setup, you can either run JIT against the interpreter // using all predefined register values, pass your own set of // registers or run either of the two independently from each other. -// +// // int failed_tests = tester.TestAll(); //run jit against int, using values from AddTestData // int failed_tests = tester.TestAll(true); //override the value for only_failed to show failure -// +// // SDSP dsp = GetCustomSetOfRegisters(); // bool success = tester.Test(dsp); //run jit against int, using a custom set of register values -// +// // SDSP result = tester.RunInterpreter(dsp); //run int alone // SDSP result = tester.RunJit(dsp); //run jit alone -// +// // == Examining results == // When either verbose or only_failed is set to true, the tester will automatically report // failure to stdout, along with input registers and the differences in output registers. -// +// // tester.Report(); //display a small report afterwards -// +// // SDSP int = tester.GetLastInterpreterDSP(); //examine the DSP set left after running int // SDSP jit = tester.GetLastJitDSP(); //same for jit -// +// // int tests_run = tester.GetRunCount(); // int tests_failed = tester.GetFailCount(); // const char* tested_instruction = tester.GetInstructionName(); // printf("%s ran %d tests and failed %d times\n", tested_instruction, tests_run, tests_failed); -// +// // tester.DumpJittedCode(); //prints the code bytes produced by jit (examine with udcli/udis86 or similar) #ifndef __DSP_JIT_TESTER_ diff --git a/Source/VSProps/Base.props b/Source/VSProps/Base.props index e1201912fd..1b40800891 100644 --- a/Source/VSProps/Base.props +++ b/Source/VSProps/Base.props @@ -1,28 +1,123 @@  - + - + + false + + D + $(SolutionDir)..\Build\ + $(SolutionDir)..\Binary\ + $(BinaryRootDir)$(Platform)\ + $(SolutionDir)..\Externals\ + $(SolutionDir)Core\ + - $(Platform)\$(Configuration)\ - $(SolutionDir)$(Platform)\$(Configuration)\ + + $(BuildRootDir)$(Platform)\$(Configuration)\$(ProjectName)\ + $(IntDir)bin\ + $(ProjectName)$(TargetSuffix) + - _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;USE_UPNP;%(PreprocessorDefinitions) + + $(CoreDir)AudioCommon\Src;%(AdditionalIncludeDirectories) + $(CoreDir)Common\Src;%(AdditionalIncludeDirectories) + $(CoreDir)Core\Src;%(AdditionalIncludeDirectories) + $(CoreDir)DiscIO\Src;%(AdditionalIncludeDirectories) + $(CoreDir)DolphinWX\Src;%(AdditionalIncludeDirectories) + $(CoreDir)InputCommon\Src;%(AdditionalIncludeDirectories) + $(CoreDir)VideoBackends\D3D\Src;%(AdditionalIncludeDirectories) + $(CoreDir)VideoBackends\OGL\Src;%(AdditionalIncludeDirectories) + $(CoreDir)VideoBackends\Software\Src;%(AdditionalIncludeDirectories) + $(CoreDir)VideoCommon\Src;%(AdditionalIncludeDirectories) + $(ExternalsDir);%(AdditionalIncludeDirectories) + $(ExternalsDir)Bochs_disasm;%(AdditionalIncludeDirectories) + $(ExternalsDir)CLRun\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)GLew\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)libpng;%(AdditionalIncludeDirectories) + $(ExternalsDir)libusbx\libusb;%(AdditionalIncludeDirectories) + $(ExternalsDir)LZO;%(AdditionalIncludeDirectories) + $(ExternalsDir)miniupnpc\src;%(AdditionalIncludeDirectories) + $(ExternalsDir)polarssl\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)portaudio\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)SDL2-2.0.1\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)SFML\include;%(AdditionalIncludeDirectories) + $(ExternalsDir)SOIL;%(AdditionalIncludeDirectories) + $(ExternalsDir)wxWidgets3;%(AdditionalIncludeDirectories) + $(ExternalsDir)wxWidgets3\Include;%(AdditionalIncludeDirectories) + $(ExternalsDir)zlib;%(AdditionalIncludeDirectories) + + + HAVE_DXSDK;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + USE_UPNP;%(PreprocessorDefinitions) Level3 true 16Bytes - true false + false true + /d2Zi+ /volatile:iso %(AdditionalOptions) + ProgramDatabase + + 4996 + true + + + _LIB;%(PreprocessorDefinitions) + + + + true + _DEBUG;_SECURE_SCL=1;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Disabled + + + + true + AnySuitable + Speed + true + true + true + MultiThreadedDLL + false + false + _SECURE_SCL=0;%(PreprocessorDefinitions) + + StreamingSIMDExtensions2 + + true - 0x00400000 + true - - ..\..\..\Externals\wxWidgets3\include;%(AdditionalIncludeDirectories) - + + + UseLinkTimeCodeGeneration + true + true + + + true + true + \ No newline at end of file diff --git a/Source/VSProps/CodeGen_Debug.props b/Source/VSProps/CodeGen_Debug.props deleted file mode 100644 index 9c321b75aa..0000000000 --- a/Source/VSProps/CodeGen_Debug.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - _DEBUG;_SECURE_SCL=1;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - MultiThreadedDebug - Disabled - false - - - - \ No newline at end of file diff --git a/Source/VSProps/CodeGen_DebugFast.props b/Source/VSProps/CodeGen_DebugFast.props deleted file mode 100644 index dc534c6a85..0000000000 --- a/Source/VSProps/CodeGen_DebugFast.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - <_PropertySheetDisplayName>CodeGen_DebugFast - - - - DEBUGFAST;_SECURE_SCL=0;%(PreprocessorDefinitions) - MultiThreaded - false - - - - \ No newline at end of file diff --git a/Source/VSProps/CodeGen_Release.props b/Source/VSProps/CodeGen_Release.props deleted file mode 100644 index 2b69dc0f63..0000000000 --- a/Source/VSProps/CodeGen_Release.props +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - <_PropertySheetDisplayName>CodeGen_Release - - - - AnySuitable - true - Speed - true - true - true - false - MultiThreaded - false - false - _SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - StreamingSIMDExtensions2 - - - true - true - - - - \ No newline at end of file diff --git a/Source/VSProps/Dolphin.Win32.props b/Source/VSProps/Dolphin.Win32.props deleted file mode 100644 index f9585b861f..0000000000 --- a/Source/VSProps/Dolphin.Win32.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ..\..\..\Binary\$(PlatformName)\ - - - - ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) - - - - \ No newline at end of file diff --git a/Source/VSProps/Dolphin.x64.props b/Source/VSProps/Dolphin.x64.props deleted file mode 100644 index 9ec1a10f53..0000000000 --- a/Source/VSProps/Dolphin.x64.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - <_PropertySheetDisplayName>Dolphin.x64 - ..\..\..\Binary\$(PlatformName)\ - - - - ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) - - - - \ No newline at end of file diff --git a/Source/VSProps/PrecompiledHeader.props b/Source/VSProps/PrecompiledHeader.props index c305a1f4c5..39ad2a5035 100644 --- a/Source/VSProps/PrecompiledHeader.props +++ b/Source/VSProps/PrecompiledHeader.props @@ -1,10 +1,11 @@  - + + Use stdafx.h diff --git a/Source/VSProps/WXWOverrides.props b/Source/VSProps/WXWOverrides.props index d979a83c43..2fb4b31762 100644 --- a/Source/VSProps/WXWOverrides.props +++ b/Source/VSProps/WXWOverrides.props @@ -1,18 +1,14 @@  - + - - $(ProjectName)$(Platform)\$(Configuration)\ - - - + wx/wxprec.h Async - 4267 - _LIB;__WXMSW__;WXBUILDING;%(PreprocessorDefinitions) + 4267;%(DisableSpecificWarnings) + __WXMSW__;WXBUILDING;%(PreprocessorDefinitions) ..\..\;..\..\include;..\..\..\zlib;..\..\..\libpng diff --git a/Source/dolphin-emu.sln b/Source/dolphin-emu.sln new file mode 100644 index 0000000000..97618922dd --- /dev/null +++ b/Source/dolphin-emu.sln @@ -0,0 +1,320 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DolphinWX", "Core\DolphinWX\DolphinWX.vcxproj", "{47411FDB-1BF2-48D0-AB4E-C7C41160F898}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcxproj", "{E54CF649-140E-4255-81A5-30A673C1FB36}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioCommon", "Core\AudioCommon\AudioCommon.vcxproj", "{54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Core\Common\Common.vcxproj", "{2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcxproj", "{160BDC25-5626-4B0D-BDD8-2953D9777FB5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InputCommon", "Core\InputCommon\InputCommon.vcxproj", "{6BBD47CF-91FD-4077-B676-8B76980178A9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoCommon", "Core\VideoCommon\VideoCommon.vcxproj", "{3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Externals", "Externals", "{87ADDFF9-5768-4DA2-A33B-2477593D6677}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bochs_disasm", "..\Externals\Bochs_disasm\Bochs_disasm.vcxproj", "{8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Languages", "..\Languages\Languages.vcxproj", "{0E033BE3-2E08-428E-9AE9-BC673EFA12B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dolphin Core", "Dolphin Core", "{15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LZO", "..\Externals\LZO\LZO.vcxproj", "{AB993F38-C31D-4897-B139-A620C42BC565}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc", "..\Externals\miniupnpc\miniupnpc.vcxproj", "{31643FDB-1BB8-4965-9DE7-000FC88D35AE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "png", "..\Externals\libpng\png\png.vcxproj", "{4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SOIL", "..\Externals\SOIL\SOIL.vcxproj", "{B441CC62-877E-4B3F-93E0-0DE80544F705}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\Externals\zlib\zlib.vcxproj", "{FF213B23-2C26-4214-9F88-85271E557E87}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\Externals\soundtouch\SoundTouch.vcxproj", "{EC082900-B4D8-42E9-9663-77F02F6936AE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxWidgets", "..\Externals\wxWidgets3\build\msw\wx_base.vcxproj", "{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolarSSL", "..\Externals\polarssl\visualc\PolarSSL.vcxproj", "{BDB6578B-0691-4E80-A46C-DF21639FD3B8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCMRevGen", "Core\Common\SCMRevGen.vcxproj", "{41279555-F94F-4EBC-99DE-AF863C10C5C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SFML_Network", "..\Externals\SFML\build\vc2010\SFML_Network.vcxproj", "{93D73454-2512-424E-9CDA-4BB357FE13DD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CLRun", "..\Externals\CLRun\clrun\CLRun.vcxproj", "{AA862E5E-A993-497A-B6A0-0E8E94B10050}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0", "..\Externals\libusbx\msvc\libusb_static_2013.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glew", "..\Externals\GLew\glew.vcxproj", "{2A3F751D-69E9-45F2-9199-9A00BFB6CC72}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "..\Externals\portaudio\build\portaudio.vcxproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DSPTool", "DSPTool\DSPTool.vcxproj", "{1970D175-3DE8-4738-942A-4D98D1CDBF64}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "D3D", "Core\VideoBackends\D3D\D3D.vcxproj", "{96020103-4BA5-4FD2-B4AA-5B6D24492D4E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OGL", "Core\VideoBackends\OGL\OGL.vcxproj", "{EC1A314C-5588-4506-9C1E-2E58E5817F75}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Software", "Core\VideoBackends\Software\Software.vcxproj", "{A4C423AA-F57C-46C7-A172-D1A777017D29}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Video Backends", "Video Backends", "{AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Debug|Win32.ActiveCfg = Debug|Win32 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Debug|Win32.Build.0 = Debug|Win32 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Debug|x64.ActiveCfg = Debug|x64 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Debug|x64.Build.0 = Debug|x64 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Release|Win32.ActiveCfg = Release|Win32 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Release|Win32.Build.0 = Release|Win32 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Release|x64.ActiveCfg = Release|x64 + {47411FDB-1BF2-48D0-AB4E-C7C41160F898}.Release|x64.Build.0 = Release|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|Win32.ActiveCfg = Debug|Win32 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|Win32.Build.0 = Debug|Win32 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|x64.ActiveCfg = Debug|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|x64.Build.0 = Debug|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|Win32.ActiveCfg = Release|Win32 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|Win32.Build.0 = Release|Win32 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|x64.ActiveCfg = Release|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|x64.Build.0 = Release|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|Win32.ActiveCfg = Debug|Win32 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|Win32.Build.0 = Debug|Win32 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|x64.ActiveCfg = Debug|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|x64.Build.0 = Debug|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|Win32.ActiveCfg = Release|Win32 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|Win32.Build.0 = Release|Win32 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|x64.ActiveCfg = Release|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|x64.Build.0 = Release|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|Win32.ActiveCfg = Debug|Win32 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|Win32.Build.0 = Debug|Win32 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|x64.ActiveCfg = Debug|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|x64.Build.0 = Debug|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|Win32.ActiveCfg = Release|Win32 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|Win32.Build.0 = Release|Win32 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|x64.ActiveCfg = Release|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|x64.Build.0 = Release|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|Win32.ActiveCfg = Debug|Win32 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|Win32.Build.0 = Debug|Win32 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|x64.ActiveCfg = Debug|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|x64.Build.0 = Debug|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|Win32.ActiveCfg = Release|Win32 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|Win32.Build.0 = Release|Win32 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|x64.ActiveCfg = Release|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|x64.Build.0 = Release|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|Win32.Build.0 = Debug|Win32 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|x64.ActiveCfg = Debug|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|x64.Build.0 = Debug|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|Win32.ActiveCfg = Release|Win32 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|Win32.Build.0 = Release|Win32 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|x64.ActiveCfg = Release|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|x64.Build.0 = Release|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|Win32.ActiveCfg = Debug|Win32 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|Win32.Build.0 = Debug|Win32 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|x64.ActiveCfg = Debug|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|x64.Build.0 = Debug|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|Win32.ActiveCfg = Release|Win32 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|Win32.Build.0 = Release|Win32 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|x64.ActiveCfg = Release|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|x64.Build.0 = Release|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|Win32.ActiveCfg = Debug|Win32 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|Win32.Build.0 = Debug|Win32 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|x64.ActiveCfg = Debug|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|x64.Build.0 = Debug|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|Win32.ActiveCfg = Release|Win32 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|Win32.Build.0 = Release|Win32 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|x64.ActiveCfg = Release|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|x64.Build.0 = Release|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|Win32.Build.0 = Debug|Win32 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|x64.ActiveCfg = Debug|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|x64.Build.0 = Debug|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|Win32.ActiveCfg = Release|Win32 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|Win32.Build.0 = Release|Win32 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|x64.ActiveCfg = Release|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|x64.Build.0 = Release|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|Win32.ActiveCfg = Debug|Win32 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|Win32.Build.0 = Debug|Win32 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|x64.ActiveCfg = Debug|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|x64.Build.0 = Debug|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|Win32.ActiveCfg = Release|Win32 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|Win32.Build.0 = Release|Win32 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|x64.ActiveCfg = Release|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|x64.Build.0 = Release|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|Win32.Build.0 = Debug|Win32 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|x64.ActiveCfg = Debug|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|x64.Build.0 = Debug|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|Win32.ActiveCfg = Release|Win32 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|Win32.Build.0 = Release|Win32 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|x64.ActiveCfg = Release|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|x64.Build.0 = Release|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|Win32.Build.0 = Debug|Win32 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|x64.ActiveCfg = Debug|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|x64.Build.0 = Debug|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|Win32.ActiveCfg = Release|Win32 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|Win32.Build.0 = Release|Win32 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|x64.ActiveCfg = Release|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|x64.Build.0 = Release|x64 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Debug|Win32.ActiveCfg = Debug|Win32 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Debug|Win32.Build.0 = Debug|Win32 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Debug|x64.ActiveCfg = Debug|x64 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Debug|x64.Build.0 = Debug|x64 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Release|Win32.ActiveCfg = Release|Win32 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Release|Win32.Build.0 = Release|Win32 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Release|x64.ActiveCfg = Release|x64 + {B441CC62-877E-4B3F-93E0-0DE80544F705}.Release|x64.Build.0 = Release|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|Win32.Build.0 = Debug|Win32 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|x64.ActiveCfg = Debug|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|x64.Build.0 = Debug|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|Win32.ActiveCfg = Release|Win32 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|Win32.Build.0 = Release|Win32 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|x64.ActiveCfg = Release|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|x64.Build.0 = Release|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|Win32.Build.0 = Debug|Win32 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|x64.ActiveCfg = Debug|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|x64.Build.0 = Debug|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|Win32.ActiveCfg = Release|Win32 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|Win32.Build.0 = Release|Win32 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|x64.ActiveCfg = Release|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|x64.Build.0 = Release|x64 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|Win32.Build.0 = Debug|Win32 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|x64.ActiveCfg = Debug|x64 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Debug|x64.Build.0 = Debug|x64 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.ActiveCfg = Release|Win32 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|Win32.Build.0 = Release|Win32 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.ActiveCfg = Release|x64 + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}.Release|x64.Build.0 = Release|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|Win32.ActiveCfg = Debug|Win32 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|Win32.Build.0 = Debug|Win32 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|x64.ActiveCfg = Debug|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|x64.Build.0 = Debug|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|Win32.ActiveCfg = Release|Win32 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|Win32.Build.0 = Release|Win32 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.ActiveCfg = Release|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.Build.0 = Release|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|Win32.ActiveCfg = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|Win32.Build.0 = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.ActiveCfg = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.Build.0 = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|Win32.ActiveCfg = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|Win32.Build.0 = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.ActiveCfg = Release|Win32 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.Build.0 = Release|Win32 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|Win32.ActiveCfg = Debug|Win32 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|Win32.Build.0 = Debug|Win32 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.ActiveCfg = Debug|x64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.Build.0 = Debug|x64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|Win32.ActiveCfg = Release|Win32 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|Win32.Build.0 = Release|Win32 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.ActiveCfg = Release|x64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.Build.0 = Release|x64 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|Win32.Build.0 = Debug|Win32 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|x64.ActiveCfg = Debug|x64 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Debug|x64.Build.0 = Debug|x64 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|Win32.ActiveCfg = Release|Win32 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|Win32.Build.0 = Release|Win32 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|x64.ActiveCfg = Release|x64 + {AA862E5E-A993-497A-B6A0-0E8E94B10050}.Release|x64.Build.0 = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.Build.0 = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.Build.0 = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Debug|Win32.ActiveCfg = Debug|Win32 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Debug|Win32.Build.0 = Debug|Win32 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Debug|x64.ActiveCfg = Debug|x64 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Debug|x64.Build.0 = Debug|x64 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Release|Win32.ActiveCfg = Release|Win32 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Release|Win32.Build.0 = Release|Win32 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Release|x64.ActiveCfg = Release|x64 + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72}.Release|x64.Build.0 = Release|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|Win32.ActiveCfg = Debug|Win32 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|Win32.Build.0 = Debug|Win32 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.ActiveCfg = Debug|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.Build.0 = Debug|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|Win32.ActiveCfg = Release|Win32 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|Win32.Build.0 = Release|Win32 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.Build.0 = Release|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|Win32.ActiveCfg = Debug|Win32 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|Win32.Build.0 = Debug|Win32 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|x64.ActiveCfg = Debug|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|x64.Build.0 = Debug|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|Win32.ActiveCfg = Release|Win32 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|Win32.Build.0 = Release|Win32 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|x64.ActiveCfg = Release|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|x64.Build.0 = Release|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|Win32.ActiveCfg = Debug|Win32 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|Win32.Build.0 = Debug|Win32 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|x64.ActiveCfg = Debug|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|x64.Build.0 = Debug|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|Win32.ActiveCfg = Release|Win32 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|Win32.Build.0 = Release|Win32 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|x64.ActiveCfg = Release|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|x64.Build.0 = Release|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|Win32.ActiveCfg = Debug|Win32 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|Win32.Build.0 = Debug|Win32 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|x64.ActiveCfg = Debug|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|x64.Build.0 = Debug|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|Win32.ActiveCfg = Release|Win32 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|Win32.Build.0 = Release|Win32 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|x64.ActiveCfg = Release|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {160BDC25-5626-4B0D-BDD8-2953D9777FB5} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {6BBD47CF-91FD-4077-B676-8B76980178A9} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {E54CF649-140E-4255-81A5-30A673C1FB36} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4} = {15670B2E-CED6-4ED5-94CE-A00B1B2B5BA6} + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {AB993F38-C31D-4897-B139-A620C42BC565} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {31643FDB-1BB8-4965-9DE7-000FC88D35AE} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {B441CC62-877E-4B3F-93E0-0DE80544F705} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {FF213B23-2C26-4214-9F88-85271E557E87} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {EC082900-B4D8-42E9-9663-77F02F6936AE} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {BDB6578B-0691-4E80-A46C-DF21639FD3B8} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {93D73454-2512-424E-9CDA-4BB357FE13DD} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {AA862E5E-A993-497A-B6A0-0E8E94B10050} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {349EE8F9-7D25-4909-AAF5-FF3FADE72187} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {2A3F751D-69E9-45F2-9199-9A00BFB6CC72} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {87ADDFF9-5768-4DA2-A33B-2477593D6677} + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E} = {AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4} + {EC1A314C-5588-4506-9C1E-2E58E5817F75} = {AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4} + {A4C423AA-F57C-46C7-A172-D1A777017D29} = {AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4} + EndGlobalSection +EndGlobal diff --git a/Source/pch.h b/Source/pch.h new file mode 100644 index 0000000000..2851adefca --- /dev/null +++ b/Source/pch.h @@ -0,0 +1,58 @@ +#include "Common.h" +#include "Thread.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef ANDROID +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/docs/DSP/DSP_UC_AXWii.txt b/docs/DSP/DSP_UC_AXWii.txt deleted file mode 100644 index 07a3d938f0..0000000000 --- a/docs/DSP/DSP_UC_AXWii.txt +++ /dev/null @@ -1,3339 +0,0 @@ -// Memory map: -// 0x0C00: current AXList - - -// Voice PB structure: -// the current PB is stored at 0x02D0 -// offsets and sizes are counted in words -// -// Offset Size Desription -// 0x000 2 Address of the next PB -// 0x002 2 Address of this PB -// 0x004 1 Sample rate converter (0-2) -// 0x005 1 Coef select (0-2: 0x1000, 0x1200, 0x1400) -// 0x006 2 Selects entries in 4 tables (19 bits used) -// 0x008 1 Play/stop flag (1=play, 0=stop) -// 0x022 1 Initial time delay enable -// 0x023 2 Initial time delay data - - - 0000 0000 nop - 0001 0000 nop - -// Exception jump table - 0002 029f 0f3c jmp 0x0f3c - 0004 029f 0f48 jmp 0x0f48 - 0006 029f 0f4d jmp 0x0f4d - 0008 029f 0f5c jmp 0x0f5c - 000a 029f 0f61 jmp 0x0f61 - 000c 029f 0f8d jmp 0x0f8d - 000e 029f 0f92 jmp 0x0f92 - -// Entry point -void 0010_Entry() { - 0010 1302 sbset #0x02 - 0011 1303 sbset #0x03 - 0012 1204 sbclr #0x04 - 0013 1305 sbset #0x05 - 0014 1306 sbset #0x06 - 0015 8e00 set16 - 0016 8c00 clr15 - 0017 8b00 m0 - 0018 0092 00ff lri $CR, #0x00ff - 001a 009e 8000 lri $AC0.M, #0x8000 - 001c 00fe 0ce5 sr @0x0ce5, $AC0.M - 001e 009e 8000 lri $AC0.M, #0x8000 - 0020 00fe 0ce6 sr @0x0ce6, $AC0.M - 0022 00fe 0ce7 sr @0x0ce7, $AC0.M - 0024 00fe 0ce8 sr @0x0ce8, $AC0.M - 0026 8100 clr $ACC0 - 0027 00fe 0ce9 sr @0x0ce9, $AC0.M - 0029 8900 clr $ACC1 - 002a 16fc dcd1 si @DMBH, #0xdcd1 - 002c 16fd 0000 si @DMBL, #0x0000 - 002e 16fb 0001 si @DIRQ, #0x0001 // send a 0xDCD10000 and trigger an IRQ - 0030 26fc lrs $AC0.M, @DMBH - 0031 02a0 8000 andf $AC0.M, #0x8000 - 0033 029c 0030 jlnz 0x0030 // wait until the mail is received by CPU - 0035 029f 004c jmp 0x004c // enter the main loop -} - -void 0037_Unk_Restart() { - 0037 1302 sbset #0x02 - 0038 1303 sbset #0x03 - 0039 1204 sbclr #0x04 - 003a 1305 sbset #0x05 - 003b 1306 sbset #0x06 - 003c 8e00 set16 - 003d 8c00 clr15 - 003e 8b00 m0 - 003f 0092 00ff lri $CR, #0x00ff - 0041 16fc dcd1 si @DMBH, #0xdcd1 - 0043 16fd 0001 si @DMBL, #0x0001 - 0045 16fb 0001 si @DIRQ, #0x0001 // send a 0xDCD10001 and trigger an IRQ - 0047 26fc lrs $AC0.M, @DMBH - 0048 02a0 8000 andf $AC0.M, #0x8000 - 004a 029c 0047 jlnz 0x0047 // wait until the mail is received by CPU - -// main loop - 004c 8e00 set16 - 004d 8100 clr $ACC0 - 004e 8900 clr $ACC1 - 004f 009f babe lri $AC1.M, #0xbabe - 0051 26fe lrs $AC0.M, @CMBH - 0052 02c0 8000 andcf $AC0.M, #0x8000 - 0054 029c 0051 jlnz 0x0051 // wait until we get a new mail from CPU - 0056 8200 cmp - 0057 0294 0051 jnz 0x0051 // discard it if it's not a 0xBABE---- (AXList begin) - 0059 23ff lrs $AX1.H, @CMBL // AX1.H = low part of 0xBABE---- mail = length of list in bytes - 005a 8100 clr $ACC0 - 005b 26fe lrs $AC0.M, @CMBH - 005c 02c0 8000 andcf $AC0.M, #0x8000 - 005e 029c 005b jlnz 0x005b // wait until the next mail - 0060 27ff lrs $AC1.M, @CMBL - 0061 0240 7fff andi $AC0.M, #0x7fff // AC0.M = address high part, AC1.M = address low part - 0063 2ece srs @DSMAH, $AC0.M - 0064 2fcf srs @DSMAL, $AC1.M - 0065 16cd 0c00 si @DSPA, #0x0c00 - 0067 8100 clr $ACC0 - 0068 2ec9 srs @DSCR, $AC0.M - 0069 1ffb mrr $AC1.M, $AX1.H // Transfer the AXList (DMA) - 006a 2fcb srs @DSBL, $AC1.M // DMA transfer from main memory (addr = second mail) to 0x0C00, len = low part of first mail - 006b 02bf 0084 call 0084_WaitForDMACompletion() - 006d 0080 0c00 lri $AR0, #0x0c00 // AR0 = 0x0C00 -} // continues into next function - -void 006f_MailHandler() { - 006f 8e00 set16 - 0070 8100 clr $ACC0 - 0071 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0072 b100 tst $ACC0 - 0073 0291 0080 jl 0x0080 - 0075 0a0e lris $AX0.H, #0x0e - 0076 c100 cmpar $ACC0, $AX0.H - 0077 0292 0080 jg 0x0080 // die if command number is higher than 0xE - 0079 009f 0d04 lri $AC1.M, #0x0d04 - 007b 4c00 add $ACC0, $ACC1 - 007c 1c7e mrr $AR3, $AC0.M - 007d 0213 ilrr $AC0.M, @$AR3 - 007e 1c7e mrr $AR3, $AC0.M // func at [0x0D04 + cmd_num] - 007f 176f jmpr $AR3 // Jump to command func: AR0 = 0x0C01. Okay. - AC0.M = - AC1.M = 0x0D04. Not interesting either. -} - -void 0080_Die() { - 0080 16fc baad si @DMBH, #0xbaad - 0082 2efd srs @DMBL, $AC0.M - 0083 0021 halt -} - -void 0084_WaitForDMACompletion() { - 0084 26c9 lrs $AC0.M, @DSCR - 0085 02a0 0004 andf $AC0.M, #0x0004 - 0087 029c 0084 jlnz 0x0084 - 0089 02df ret -} - -void 008a_Cmd_0() { - 008a 8100 clr $ACC0 - 008b 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 008c 8e78 set16'l : $AC1.M, @$AR0 - 008d 2ece srs @DSMAH, $AC0.M - 008e 2fcf srs @DSMAL, $AC1.M - 008f 16cd 0d08 si @DSPA, #0x0d08 - 0091 16c9 0000 si @DSCR, #0x0000 - 0093 16cb 0078 si @DSBL, #0x0078 - 0095 0081 0d08 lri $AR1, #0x0d08 - 0097 0082 0000 lri $AR2, #0x0000 - 0099 009b 005f lri $AX1.H, #0x005f - 009b 009a 00c0 lri $AX0.H, #0x00c0 - 009d 8100 clr $ACC0 - 009e 8900 clr $ACC1 - 009f 8f00 set40 - 00a0 02bf 0084 call 0084_WaitForDMACompletion() - 00a2 193e lrri $AC0.M, @$AR1 - 00a3 193c lrri $AC0.L, @$AR1 - 00a4 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 00a5 0294 00ab jnz 0x00ab - 00a7 005a loop $AX0.H - 00a8 1b5e srri @$AR2, $AC0.M - 00a9 029f 00b3 jmp 0x00b3 - 00ab 9900 asr16 $ACC1 - 00ac 1b5e srri @$AR2, $AC0.M - 00ad 1b5c srri @$AR2, $AC0.L - 00ae 007b 00b2 bloop $AX1.H, 0x00b2 - 00b0 4c00 add $ACC0, $ACC1 - 00b1 1b5e srri @$AR2, $AC0.M - 00b2 1b5c srri @$AR2, $AC0.L - 00b3 0082 00c0 lri $AR2, #0x00c0 - 00b5 193e lrri $AC0.M, @$AR1 - 00b6 193c lrri $AC0.L, @$AR1 - 00b7 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 00b8 0294 00be jnz 0x00be - 00ba 005a loop $AX0.H - 00bb 1b5e srri @$AR2, $AC0.M - 00bc 029f 00c6 jmp 0x00c6 - 00be 9900 asr16 $ACC1 - 00bf 1b5e srri @$AR2, $AC0.M - 00c0 1b5c srri @$AR2, $AC0.L - 00c1 007b 00c5 bloop $AX1.H, 0x00c5 - 00c3 4c00 add $ACC0, $ACC1 - 00c4 1b5e srri @$AR2, $AC0.M - 00c5 1b5c srri @$AR2, $AC0.L - 00c6 0082 0180 lri $AR2, #0x0180 - 00c8 193e lrri $AC0.M, @$AR1 - 00c9 193c lrri $AC0.L, @$AR1 - 00ca b179 tst'l $ACC0 : $AC1.M, @$AR1 - 00cb 0294 00d1 jnz 0x00d1 - 00cd 005a loop $AX0.H - 00ce 1b5e srri @$AR2, $AC0.M - 00cf 029f 00d9 jmp 0x00d9 - 00d1 9900 asr16 $ACC1 - 00d2 1b5e srri @$AR2, $AC0.M - 00d3 1b5c srri @$AR2, $AC0.L - 00d4 007b 00d8 bloop $AX1.H, 0x00d8 - 00d6 4c00 add $ACC0, $ACC1 - 00d7 1b5e srri @$AR2, $AC0.M - 00d8 1b5c srri @$AR2, $AC0.L - 00d9 0082 0400 lri $AR2, #0x0400 - 00db 193e lrri $AC0.M, @$AR1 - 00dc 193c lrri $AC0.L, @$AR1 - 00dd b179 tst'l $ACC0 : $AC1.M, @$AR1 - 00de 0294 00e4 jnz 0x00e4 - 00e0 005a loop $AX0.H - 00e1 1b5e srri @$AR2, $AC0.M - 00e2 029f 00ec jmp 0x00ec - 00e4 9900 asr16 $ACC1 - 00e5 1b5e srri @$AR2, $AC0.M - 00e6 1b5c srri @$AR2, $AC0.L - 00e7 007b 00eb bloop $AX1.H, 0x00eb - 00e9 4c00 add $ACC0, $ACC1 - 00ea 1b5e srri @$AR2, $AC0.M - 00eb 1b5c srri @$AR2, $AC0.L - 00ec 0082 04c0 lri $AR2, #0x04c0 - 00ee 193e lrri $AC0.M, @$AR1 - 00ef 193c lrri $AC0.L, @$AR1 - 00f0 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 00f1 0294 00f7 jnz 0x00f7 - 00f3 005a loop $AX0.H - 00f4 1b5e srri @$AR2, $AC0.M - 00f5 029f 00ff jmp 0x00ff - 00f7 9900 asr16 $ACC1 - 00f8 1b5e srri @$AR2, $AC0.M - 00f9 1b5c srri @$AR2, $AC0.L - 00fa 007b 00fe bloop $AX1.H, 0x00fe - 00fc 4c00 add $ACC0, $ACC1 - 00fd 1b5e srri @$AR2, $AC0.M - 00fe 1b5c srri @$AR2, $AC0.L - 00ff 0082 0580 lri $AR2, #0x0580 - 0101 193e lrri $AC0.M, @$AR1 - 0102 193c lrri $AC0.L, @$AR1 - 0103 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0104 0294 010a jnz 0x010a - 0106 005a loop $AX0.H - 0107 1b5e srri @$AR2, $AC0.M - 0108 029f 0112 jmp 0x0112 - 010a 9900 asr16 $ACC1 - 010b 1b5e srri @$AR2, $AC0.M - 010c 1b5c srri @$AR2, $AC0.L - 010d 007b 0111 bloop $AX1.H, 0x0111 - 010f 4c00 add $ACC0, $ACC1 - 0110 1b5e srri @$AR2, $AC0.M - 0111 1b5c srri @$AR2, $AC0.L - 0112 0082 0640 lri $AR2, #0x0640 - 0114 193e lrri $AC0.M, @$AR1 - 0115 193c lrri $AC0.L, @$AR1 - 0116 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0117 0294 011d jnz 0x011d - 0119 005a loop $AX0.H - 011a 1b5e srri @$AR2, $AC0.M - 011b 029f 0125 jmp 0x0125 - 011d 9900 asr16 $ACC1 - 011e 1b5e srri @$AR2, $AC0.M - 011f 1b5c srri @$AR2, $AC0.L - 0120 007b 0124 bloop $AX1.H, 0x0124 - 0122 4c00 add $ACC0, $ACC1 - 0123 1b5e srri @$AR2, $AC0.M - 0124 1b5c srri @$AR2, $AC0.L - 0125 0082 0700 lri $AR2, #0x0700 - 0127 193e lrri $AC0.M, @$AR1 - 0128 193c lrri $AC0.L, @$AR1 - 0129 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 012a 0294 0130 jnz 0x0130 - 012c 005a loop $AX0.H - 012d 1b5e srri @$AR2, $AC0.M - 012e 029f 0138 jmp 0x0138 - 0130 9900 asr16 $ACC1 - 0131 1b5e srri @$AR2, $AC0.M - 0132 1b5c srri @$AR2, $AC0.L - 0133 007b 0137 bloop $AX1.H, 0x0137 - 0135 4c00 add $ACC0, $ACC1 - 0136 1b5e srri @$AR2, $AC0.M - 0137 1b5c srri @$AR2, $AC0.L - 0138 0082 07c0 lri $AR2, #0x07c0 - 013a 193e lrri $AC0.M, @$AR1 - 013b 193c lrri $AC0.L, @$AR1 - 013c b179 tst'l $ACC0 : $AC1.M, @$AR1 - 013d 0294 0143 jnz 0x0143 - 013f 005a loop $AX0.H - 0140 1b5e srri @$AR2, $AC0.M - 0141 029f 014b jmp 0x014b - 0143 9900 asr16 $ACC1 - 0144 1b5e srri @$AR2, $AC0.M - 0145 1b5c srri @$AR2, $AC0.L - 0146 007b 014a bloop $AX1.H, 0x014a - 0148 4c00 add $ACC0, $ACC1 - 0149 1b5e srri @$AR2, $AC0.M - 014a 1b5c srri @$AR2, $AC0.L - 014b 0082 0880 lri $AR2, #0x0880 - 014d 193e lrri $AC0.M, @$AR1 - 014e 193c lrri $AC0.L, @$AR1 - 014f b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0150 0294 0156 jnz 0x0156 - 0152 005a loop $AX0.H - 0153 1b5e srri @$AR2, $AC0.M - 0154 029f 015e jmp 0x015e - 0156 9900 asr16 $ACC1 - 0157 1b5e srri @$AR2, $AC0.M - 0158 1b5c srri @$AR2, $AC0.L - 0159 007b 015d bloop $AX1.H, 0x015d - 015b 4c00 add $ACC0, $ACC1 - 015c 1b5e srri @$AR2, $AC0.M - 015d 1b5c srri @$AR2, $AC0.L - 015e 0082 0940 lri $AR2, #0x0940 - 0160 193e lrri $AC0.M, @$AR1 - 0161 193c lrri $AC0.L, @$AR1 - 0162 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0163 0294 0169 jnz 0x0169 - 0165 005a loop $AX0.H - 0166 1b5e srri @$AR2, $AC0.M - 0167 029f 0171 jmp 0x0171 - 0169 9900 asr16 $ACC1 - 016a 1b5e srri @$AR2, $AC0.M - 016b 1b5c srri @$AR2, $AC0.L - 016c 007b 0170 bloop $AX1.H, 0x0170 - 016e 4c00 add $ACC0, $ACC1 - 016f 1b5e srri @$AR2, $AC0.M - 0170 1b5c srri @$AR2, $AC0.L - 0171 0082 0a00 lri $AR2, #0x0a00 - 0173 193e lrri $AC0.M, @$AR1 - 0174 193c lrri $AC0.L, @$AR1 - 0175 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0176 0294 017c jnz 0x017c - 0178 005a loop $AX0.H - 0179 1b5e srri @$AR2, $AC0.M - 017a 029f 0184 jmp 0x0184 - 017c 9900 asr16 $ACC1 - 017d 1b5e srri @$AR2, $AC0.M - 017e 1b5c srri @$AR2, $AC0.L - 017f 007b 0183 bloop $AX1.H, 0x0183 - 0181 4c00 add $ACC0, $ACC1 - 0182 1b5e srri @$AR2, $AC0.M - 0183 1b5c srri @$AR2, $AC0.L - 0184 009b 0011 lri $AX1.H, #0x0011 - 0186 009a 0024 lri $AX0.H, #0x0024 - 0188 0082 0240 lri $AR2, #0x0240 - 018a 193e lrri $AC0.M, @$AR1 - 018b 193c lrri $AC0.L, @$AR1 - 018c b179 tst'l $ACC0 : $AC1.M, @$AR1 - 018d 0294 0193 jnz 0x0193 - 018f 005a loop $AX0.H - 0190 1b5e srri @$AR2, $AC0.M - 0191 029f 019b jmp 0x019b - 0193 9900 asr16 $ACC1 - 0194 1b5e srri @$AR2, $AC0.M - 0195 1b5c srri @$AR2, $AC0.L - 0196 007b 019a bloop $AX1.H, 0x019a - 0198 4c00 add $ACC0, $ACC1 - 0199 1b5e srri @$AR2, $AC0.M - 019a 1b5c srri @$AR2, $AC0.L - 019b 0082 0ac0 lri $AR2, #0x0ac0 - 019d 193e lrri $AC0.M, @$AR1 - 019e 193c lrri $AC0.L, @$AR1 - 019f b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01a0 0294 01a6 jnz 0x01a6 - 01a2 005a loop $AX0.H - 01a3 1b5e srri @$AR2, $AC0.M - 01a4 029f 01ae jmp 0x01ae - 01a6 9900 asr16 $ACC1 - 01a7 1b5e srri @$AR2, $AC0.M - 01a8 1b5c srri @$AR2, $AC0.L - 01a9 007b 01ad bloop $AX1.H, 0x01ad - 01ab 4c00 add $ACC0, $ACC1 - 01ac 1b5e srri @$AR2, $AC0.M - 01ad 1b5c srri @$AR2, $AC0.L - 01ae 0082 0264 lri $AR2, #0x0264 - 01b0 193e lrri $AC0.M, @$AR1 - 01b1 193c lrri $AC0.L, @$AR1 - 01b2 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01b3 0294 01b9 jnz 0x01b9 - 01b5 005a loop $AX0.H - 01b6 1b5e srri @$AR2, $AC0.M - 01b7 029f 01c1 jmp 0x01c1 - 01b9 9900 asr16 $ACC1 - 01ba 1b5e srri @$AR2, $AC0.M - 01bb 1b5c srri @$AR2, $AC0.L - 01bc 007b 01c0 bloop $AX1.H, 0x01c0 - 01be 4c00 add $ACC0, $ACC1 - 01bf 1b5e srri @$AR2, $AC0.M - 01c0 1b5c srri @$AR2, $AC0.L - 01c1 0082 0ae4 lri $AR2, #0x0ae4 - 01c3 193e lrri $AC0.M, @$AR1 - 01c4 193c lrri $AC0.L, @$AR1 - 01c5 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01c6 0294 01cc jnz 0x01cc - 01c8 005a loop $AX0.H - 01c9 1b5e srri @$AR2, $AC0.M - 01ca 029f 01d4 jmp 0x01d4 - 01cc 9900 asr16 $ACC1 - 01cd 1b5e srri @$AR2, $AC0.M - 01ce 1b5c srri @$AR2, $AC0.L - 01cf 007b 01d3 bloop $AX1.H, 0x01d3 - 01d1 4c00 add $ACC0, $ACC1 - 01d2 1b5e srri @$AR2, $AC0.M - 01d3 1b5c srri @$AR2, $AC0.L - 01d4 0082 0288 lri $AR2, #0x0288 - 01d6 193e lrri $AC0.M, @$AR1 - 01d7 193c lrri $AC0.L, @$AR1 - 01d8 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01d9 0294 01df jnz 0x01df - 01db 005a loop $AX0.H - 01dc 1b5e srri @$AR2, $AC0.M - 01dd 029f 01e7 jmp 0x01e7 - 01df 9900 asr16 $ACC1 - 01e0 1b5e srri @$AR2, $AC0.M - 01e1 1b5c srri @$AR2, $AC0.L - 01e2 007b 01e6 bloop $AX1.H, 0x01e6 - 01e4 4c00 add $ACC0, $ACC1 - 01e5 1b5e srri @$AR2, $AC0.M - 01e6 1b5c srri @$AR2, $AC0.L - 01e7 0082 0b08 lri $AR2, #0x0b08 - 01e9 193e lrri $AC0.M, @$AR1 - 01ea 193c lrri $AC0.L, @$AR1 - 01eb b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01ec 0294 01f2 jnz 0x01f2 - 01ee 005a loop $AX0.H - 01ef 1b5e srri @$AR2, $AC0.M - 01f0 029f 01fa jmp 0x01fa - 01f2 9900 asr16 $ACC1 - 01f3 1b5e srri @$AR2, $AC0.M - 01f4 1b5c srri @$AR2, $AC0.L - 01f5 007b 01f9 bloop $AX1.H, 0x01f9 - 01f7 4c00 add $ACC0, $ACC1 - 01f8 1b5e srri @$AR2, $AC0.M - 01f9 1b5c srri @$AR2, $AC0.L - 01fa 0082 02ac lri $AR2, #0x02ac - 01fc 193e lrri $AC0.M, @$AR1 - 01fd 193c lrri $AC0.L, @$AR1 - 01fe b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01ff 0294 0205 jnz 0x0205 - 0201 005a loop $AX0.H - 0202 1b5e srri @$AR2, $AC0.M - 0203 029f 020d jmp 0x020d - 0205 9900 asr16 $ACC1 - 0206 1b5e srri @$AR2, $AC0.M - 0207 1b5c srri @$AR2, $AC0.L - 0208 007b 020c bloop $AX1.H, 0x020c - 020a 4c00 add $ACC0, $ACC1 - 020b 1b5e srri @$AR2, $AC0.M - 020c 1b5c srri @$AR2, $AC0.L - 020d 0082 0b2c lri $AR2, #0x0b2c - 020f 193e lrri $AC0.M, @$AR1 - 0210 193c lrri $AC0.L, @$AR1 - 0211 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 0212 0294 0218 jnz 0x0218 - 0214 005a loop $AX0.H - 0215 1b5e srri @$AR2, $AC0.M - 0216 029f 0220 jmp 0x0220 - 0218 9900 asr16 $ACC1 - 0219 1b5e srri @$AR2, $AC0.M - 021a 1b5c srri @$AR2, $AC0.L - 021b 007b 021f bloop $AX1.H, 0x021f - 021d 4c00 add $ACC0, $ACC1 - 021e 1b5e srri @$AR2, $AC0.M - 021f 1b5c srri @$AR2, $AC0.L - 0220 029f 006f jmp 006f_MailHandler() -} - -void 0222_Cmd_1() { - 0222 8100 clr $ACC0 - 0223 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0224 8e60 set16'l : $AC0.L, @$AR0 - 0225 2ece srs @DSMAH, $AC0.M - 0226 2ccf srs @DSMAL, $AC0.L - 0227 16cd 0d08 si @DSPA, #0x0d08 - 0229 16c9 0000 si @DSCR, #0x0000 - 022b 16cb 0180 si @DSBL, #0x0180 - 022d 1cc0 mrr $IX2, $AR0 - 022e 0080 0000 lri $AR0, #0x0000 - 0230 0083 00c0 lri $AR3, #0x00c0 - 0232 0081 0d08 lri $AR1, #0x0d08 - 0234 0084 ffff lri $IX0, #0xffff - 0236 1ce4 mrr $IX3, $IX0 - 0237 02bf 0084 call 0084_WaitForDMACompletion() - 0239 8f00 set40 - 023a 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 023b 80c9 nx'ldm : $AX0.L, $AX1.L, @$AR1 - 023c 6800 movax $ACC0, $AX0.L - 023d 4a00 addax $ACC0, $AX1.L - 023e 191b lrri $AX1.H, @$AR0 - 023f 6994 movax'lsn $ACC1, $AX0.L : $AX1.L, $AC0.M - 0240 4b23 addax's $ACC1, $AX1.L : @$AR3, $AC0.L - 0241 115f 0249 bloopi #0x5f, 0x0249 - 0243 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0244 80c9 nx'ldm : $AX0.L, $AX1.L, @$AR1 - 0245 6838 movax's $ACC0, $AX0.L : @$AR0, $AC1.M - 0246 4a28 addax's $ACC0, $AX1.L : @$AR0, $AC1.L - 0247 191b lrri $AX1.H, @$AR0 - 0248 6994 movax'lsn $ACC1, $AX0.L : $AX1.L, $AC0.M - 0249 4b23 addax's $ACC1, $AX1.L : @$AR3, $AC0.L - 024a 1b1f srri @$AR0, $AC1.M - 024b 1b1d srri @$AR0, $AC1.L - 024c 1c06 mrr $AR0, $IX2 - 024d 029f 006f jmp 006f_MailHandler() -} - -void 024f_Cmd_2() { - 024f 8100 clr $ACC0 - 0250 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0251 8e60 set16'l : $AC0.L, @$AR0 - 0252 2ece srs @DSMAH, $AC0.M - 0253 2ccf srs @DSMAL, $AC0.L - 0254 16cd 0d08 si @DSPA, #0x0d08 - 0256 16c9 0000 si @DSCR, #0x0000 - 0258 16cb 0180 si @DSBL, #0x0180 - 025a 1cc0 mrr $IX2, $AR0 - 025b 0080 0000 lri $AR0, #0x0000 - 025d 0083 00c0 lri $AR3, #0x00c0 - 025f 0081 0d08 lri $AR1, #0x0d08 - 0261 0084 ffff lri $IX0, #0xffff - 0263 1ce4 mrr $IX3, $IX0 - 0264 02bf 0084 call 0084_WaitForDMACompletion() - 0266 8f00 set40 - 0267 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0268 80c9 nx'ldm : $AX0.L, $AX1.L, @$AR1 - 0269 6800 movax $ACC0, $AX0.L - 026a 4a00 addax $ACC0, $AX1.L - 026b 191b lrri $AX1.H, @$AR0 - 026c 6994 movax'lsn $ACC1, $AX0.L : $AX1.L, $AC0.M - 026d 7d00 neg $ACC1 - 026e 4b23 addax's $ACC1, $AX1.L : @$AR3, $AC0.L - 026f 115f 0278 bloopi #0x5f, 0x0278 - 0271 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0272 80c9 nx'ldm : $AX0.L, $AX1.L, @$AR1 - 0273 6838 movax's $ACC0, $AX0.L : @$AR0, $AC1.M - 0274 4a28 addax's $ACC0, $AX1.L : @$AR0, $AC1.L - 0275 191b lrri $AX1.H, @$AR0 - 0276 6994 movax'lsn $ACC1, $AX0.L : $AX1.L, $AC0.M - 0277 7d00 neg $ACC1 - 0278 4b23 addax's $ACC1, $AX1.L : @$AR3, $AC0.L - 0279 1b1f srri @$AR0, $AC1.M - 027a 1b1d srri @$AR0, $AC1.L - 027b 1c06 mrr $AR0, $IX2 - 027c 029f 006f jmp 006f_MailHandler() -} - -// Command 0x4 - Mixer -// Parameters: AR0 -> 0x0C01 -// AXList data: command (2), PBs address (4) -// Stores 0x140 bytes of data from the PBs address to 0x02D0. Suspicious. - -void 027e_Cmd_4_SetPBsAddress() { - 027e 8100 clr $ACC0 // ACC0 = 0, ACC1 = 0 - 027f 8970 clr'l $ACC1 : $AC0.M, @$AR0 // ACC0 = mem32[0x0C01] (the new PBs address is there) - 0280 8e60 set16'l : $AC0.L, @$AR0 // - 0281 00e0 0cd2 sr @0x0cd2, $AR0 // mem16[0x0CD2] = 0x0C03; - - -// Mixing loop - stops when the pointer to the next PB in the current PB is NULL - 0283 2ece srs @DSMAH, $AC0.M - 0284 2ccf srs @DSMAL, $AC0.L - 0285 16cd 02d0 si @DSPA, #0x02d0 - 0287 16c9 0000 si @DSCR, #0x0000 - 0289 16cb 0140 si @DSBL, #0x0140 // transfer 0x140 bytes from the current PB address to 0x02D0. aka Transfer the current PB - 028b 02bf 0084 call 0084_WaitForDMACompletion() - -// Load some values to memory [0x0CDX / 0x0CEX] - 028d 8100 clr $ACC0 - 028e 8900 clr $ACC1 - 028f 00de 02d4 lr $AC0.M, @0x02d4 // - 0291 009f 0db7 lri $AC1.M, #0x0db7 - 0293 4c00 add $ACC0, $ACC1 // mem16[0x02D4] + 0xDB7; - 0294 1c7e mrr $AR3, $AC0.M - 0295 0213 ilrr $AC0.M, @$AR3 // Sample rate converter - 0296 00fe 0cdf sr @0x0cdf, $AC0.M // mem16[0x0CDF] = iram16[0x0DB7 + mem16[0x02D4]]; - 0298 00de 02d5 lr $AC0.M, @0x02d5 - 029a 009f 0dba lri $AC1.M, #0x0dba - 029c 4c00 add $ACC0, $ACC1 - 029d 1c7e mrr $AR3, $AC0.M - 029e 0213 ilrr $AC0.M, @$AR3 // Coef select - 029f 00fe 0ce0 sr @0x0ce0, $AC0.M // mem16[0x0CE0] = iram16[0x0DBA + mem16[0x02D5]]; - 02a1 009a 001f lri $AX0.H, #0x001f - 02a3 00de 02d7 lr $AC0.M, @0x02d7 - 02a5 009f 0d13 lri $AC1.M, #0x0d13 - 02a7 3400 andr $AC0.M, $AX0.H - 02a8 4c00 add $ACC0, $ACC1 - 02a9 1c7e mrr $AR3, $AC0.M - 02aa 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table - 02ab 00fe 0cd3 sr @0x0cd3, $AC0.M // mem16[0x0CD3] = iram16[0x0D13 + (mem16[0x02D7] & 0x001F)]; (5 bits) - 02ad 00de 02d6 lr $AC0.M, @0x02d6 - 02af 009f 0d33 lri $AC1.M, #0x0d33 - 02b1 3400 andr $AC0.M, $AX0.H - 02b2 4c00 add $ACC0, $ACC1 - 02b3 1c7e mrr $AR3, $AC0.M - 02b4 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table - 02b5 00fe 0cd4 sr @0x0cd4, $AC0.M // mem16[0x0CD4] = iram16[0x0D33 + (mem16[0x02D6] & 0x001F)]; (5 bits) - 02b7 00de 02d6 lr $AC0.M, @0x02d6 - 02b9 009f 0d53 lri $AC1.M, #0x0d53 - 02bb 14fb asr $ACC0, #-5 - 02bc 3400 andr $AC0.M, $AX0.H - 02bd 4c00 add $ACC0, $ACC1 - 02be 1c7e mrr $AR3, $AC0.M - 02bf 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table - 02c0 00fe 0cd5 sr @0x0cd5, $AC0.M // mem16[0x0CD5] = iram16[0x0D53 + ((mem16[0x02D6] >> 5) & 0x001F)]; (5 bits) - 02c2 00de 02d6 lr $AC0.M, @0x02d6 - 02c4 009f 0d73 lri $AC1.M, #0x0d73 - 02c6 14f6 asr $ACC0, #-10 - 02c7 4c00 add $ACC0, $ACC1 - 02c8 1c7e mrr $AR3, $AC0.M - 02c9 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table - 02ca 00fe 0cd6 sr @0x0cd6, $AC0.M // mem16[0x0CD6] = iram16[0x0D73 + (mem16[0x02D6] >> 10)]; (6 bits) - 02cc 8100 clr $ACC0 - 02cd 00de 033c lr $AC0.M, @0x033c - 02cf 009a 0003 lri $AX0.H, #0x0003 - 02d1 009b 0db3 lri $AX1.H, #0x0db3 - 02d3 1ffe mrr $AC1.M, $AC0.M - 02d4 3500 andr $AC1.M, $AX0.H - 02d5 4700 addr $ACC1, $AX1.H - 02d6 1c7f mrr $AR3, $AC1.M - 02d7 0313 ilrr $AC1.M, @$AR3 - 02d8 00ff 0cd7 sr @0x0cd7, $AC1.M // mem16[0x0CD7] = iram16[0x0DB3 + (mem16[0x033C] & 0x0003)]; - 02da 147e lsr $ACC0, #-2 - 02db 1ffe mrr $AC1.M, $AC0.M - 02dc 3500 andr $AC1.M, $AX0.H - 02dd 4700 addr $ACC1, $AX1.H - 02de 1c7f mrr $AR3, $AC1.M - 02df 0313 ilrr $AC1.M, @$AR3 - 02e0 00ff 0cd8 sr @0x0cd8, $AC1.M // mem16[0x0CD8] = iram16[0x0DB3 + ((mem16[0x033C] >> 2) & 0x0003)]; - 02e2 147e lsr $ACC0, #-2 - 02e3 1ffe mrr $AC1.M, $AC0.M - 02e4 3500 andr $AC1.M, $AX0.H - 02e5 4700 addr $ACC1, $AX1.H - 02e6 1c7f mrr $AR3, $AC1.M - 02e7 0313 ilrr $AC1.M, @$AR3 - 02e8 00ff 0cd9 sr @0x0cd9, $AC1.M // mem16[0x0CD9] = iram16[0x0DB3 + ((mem16[0x033C] >> 4) & 0x0003)]; - 02ea 147e lsr $ACC0, #-2 - 02eb 1ffe mrr $AC1.M, $AC0.M - 02ec 3500 andr $AC1.M, $AX0.H - 02ed 4700 addr $ACC1, $AX1.H - 02ee 1c7f mrr $AR3, $AC1.M - 02ef 0313 ilrr $AC1.M, @$AR3 - 02f0 00ff 0cda sr @0x0cda, $AC1.M // mem16[0x0CDA] = iram16[0x0DB3 + ((mem16[0x033C] >> 6) & 0x0003)]; - 02f2 147e lsr $ACC0, #-2 - 02f3 1ffe mrr $AC1.M, $AC0.M - 02f4 3500 andr $AC1.M, $AX0.H - 02f5 4700 addr $ACC1, $AX1.H - 02f6 1c7f mrr $AR3, $AC1.M - 02f7 0313 ilrr $AC1.M, @$AR3 - 02f8 00ff 0cdb sr @0x0cdb, $AC1.M // mem16[0x0CDB] = iram16[0x0DB3 + ((mem16[0x033C] >> 8) & 0x0003)]; - 02fa 147e lsr $ACC0, #-2 - 02fb 1ffe mrr $AC1.M, $AC0.M - 02fc 3500 andr $AC1.M, $AX0.H - 02fd 4700 addr $ACC1, $AX1.H - 02fe 1c7f mrr $AR3, $AC1.M - 02ff 0313 ilrr $AC1.M, @$AR3 - 0300 00ff 0cdc sr @0x0cdc, $AC1.M // mem16[0x0CDC] = iram16[0x0DB3 + ((mem16[0x033C] >> 10) & 0x0003)]; - 0302 147e lsr $ACC0, #-2 - 0303 1ffe mrr $AC1.M, $AC0.M - 0304 3500 andr $AC1.M, $AX0.H - 0305 4700 addr $ACC1, $AX1.H - 0306 1c7f mrr $AR3, $AC1.M - 0307 0313 ilrr $AC1.M, @$AR3 - 0308 00ff 0cdd sr @0x0cdd, $AC1.M // mem16[0x0CDD] = iram16[0x0DB3 + ((mem16[0x033C] >> 12) & 0x0003)]; - 030a 147e lsr $ACC0, #-2 - 030b 1ffe mrr $AC1.M, $AC0.M - 030c 3500 andr $AC1.M, $AX0.H - 030d 4700 addr $ACC1, $AX1.H - 030e 1c7f mrr $AR3, $AC1.M - 030f 0313 ilrr $AC1.M, @$AR3 - 0310 00ff 0cde sr @0x0cde, $AC1.M // mem16[0x0CDE] = iram16[0x0DB3 + (mem16[0x033C] >> 14)]; - - 0312 8100 clr $ACC0 - 0313 00de 02f2 lr $AC0.M, @0x02f2 - 0315 b100 tst $ACC0 - 0316 0295 0339 jz 0x0339 - - // Initial time delay - aka echo aka reverb - // The buffer is 64 bytes - // That thing may be hard to implement in HLE because the HLE sound buffer size is variable - if (mem16[0x02F2] != 0) - { - 0318 8900 clr $ACC1 - 0319 00df 02f5 lr $AC1.M, @0x02f5 - 031b 0300 0c40 addi $AC1.M, #0x0c40 - 031d 00ff 0ce2 sr @0x0ce2, $AC1.M - 031f 00df 02f6 lr $AC1.M, @0x02f6 - 0321 0300 0c40 addi $AC1.M, #0x0c40 - 0323 00ff 0ce3 sr @0x0ce3, $AC1.M - 0325 009f 0c60 lri $AC1.M, #0x0c60 - 0327 00ff 0ce1 sr @0x0ce1, $AC1.M - 0329 00de 02f3 lr $AC0.M, @0x02f3 - 032b 2ece srs @DSMAH, $AC0.M - 032c 00de 02f4 lr $AC0.M, @0x02f4 - 032e 2ecf srs @DSMAL, $AC0.M - 032f 16cd 0c40 si @DSPA, #0x0c40 - 0331 16c9 0000 si @DSCR, #0x0000 - 0333 16cb 0040 si @DSBL, #0x0040 - 0335 02bf 0084 call 0084_WaitForDMACompletion() // so yet another DMA... from mem32[0x02F3] to 0x0C40, 64 bytes - 0337 029f 0341 jmp 0x0341 - } - else - { - 0339 009f 0c60 lri $AC1.M, #0x0c60 - 033b 00ff 0ce2 sr @0x0ce2, $AC1.M - 033d 00ff 0ce3 sr @0x0ce3, $AC1.M - 033f 00ff 0ce1 sr @0x0ce1, $AC1.M - } - - 0341 8c00 clr15 - 0342 8b00 m0 - 0343 8100 clr $ACC0 - 0344 00de 02d8 lr $AC0.M, @0x02d8 - 0346 0601 cmpis $ACC0, #0x01 - 0347 0294 046a jnz 0x046a - -if (mem16[0x02D8] == 1) // if the voice is playing -{ - 0349 00c3 0cdf lr $AR3, @0x0cdf - 034b 177f callr $AR3 // call the sample rate converter - 034c 8a00 m2 // MULTIPLICATION x2 MODE ENABLED! - 034d 8100 clr $ACC0 - 034e 8900 clr $ACC1 - 034f 00de 0306 lr $AC0.M, @0x0306 // pb[0x36] - 0351 00df 0305 lr $AC1.M, @0x0305 // pb[0x35] - 0353 1f1f mrr $AX0.L, $AC1.M - 0354 4d00 add $ACC1, $ACC0 - 0355 1481 asl $ACC0, #1 - 0356 8d1e set15'mv : $AX1.H, $AC0.M - 0357 1fd8 mrr $AC0.M, $AX0.L - 0358 0098 8000 lri $AX0.L, #0x8000 - 035a 0080 0d08 lri $AR0, #0x0d08 - 035c a830 mulx's $AX0.L, $AX1.H : @$AR0, $AC0.M - 035d 112f 0360 bloopi #0x2f, 0x0360 - 035f ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0360 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0361 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0362 00fe 0305 sr @0x0305, $AC0.M - 0364 8f00 set40 - 0365 0080 0d08 lri $AR0, #0x0d08 - 0367 00c1 0ce1 lr $AR1, @0x0ce1 - 0369 1c61 mrr $AR3, $AR1 - 036a 193a lrri $AX0.H, @$AR1 - 036b 1919 lrri $AX1.L, @$AR0 - 036c b051 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR1 - 036d 1919 lrri $AX1.L, @$AR0 - 036e 115e 0371 bloopi #0x5e, 0x0371 - 0370 b651 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR1 - 0371 8090 nx'ls : $AX1.L, $AC0.M - 0372 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0373 6e33 movp's $ACC0 : @$AR3, $AC0.M - 0374 1b7e srri @$AR3, $AC0.M - 0375 00de 032d lr $AC0.M, @0x032d - 0377 b100 tst $ACC0 - 0378 0295 0381 jz 0x0381 - 037a 00c0 0ce1 lr $AR0, @0x0ce1 - 037c 1c20 mrr $AR1, $AR0 - 037d 0083 032e lri $AR3, #0x032e - 037f 02bf 06ab call 0x06ab - 0381 00de 0331 lr $AC0.M, @0x0331 - 0383 b100 tst $ACC0 - 0384 0295 038d jz 0x038d - 0386 0080 0332 lri $AR0, #0x0332 - 0388 00c1 0ce1 lr $AR1, @0x0ce1 - 038a 1c41 mrr $AR2, $AR1 - 038b 02bf 06c3 call 06c3_Unknown() - 038d 0080 02f9 lri $AR0, #0x02f9 - 038f 8100 clr $ACC0 - 0390 100c loopi #0x0c - 0391 1b1e srri @$AR0, $AC0.M // zero out the updates field - 0392 0080 034d lri $AR0, #0x034d - 0394 1008 loopi #0x08 - 0395 1b1e srri @$AR0, $AC0.M - 0396 00c3 0cd3 lr $AR3, @0x0cd3 // perform volume stuff - 0398 177f callr $AR3 // what a complicated volume control! - 0399 00c3 0cd4 lr $AR3, @0x0cd4 - 039b 177f callr $AR3 - 039c 00c3 0cd5 lr $AR3, @0x0cd5 - 039e 177f callr $AR3 - 039f 00c3 0cd6 lr $AR3, @0x0cd6 - 03a1 177f callr $AR3 - - 03a2 00de 033b lr $AC0.M, @0x033b - 03a4 b100 tst $ACC0 - 03a5 0295 0447 jz 0x0447 - if (mem16[0x033B] != 0) - { - 03a7 00de 035a lr $AC0.M, @0x035a - 03a9 b100 tst $ACC0 - 03aa 0295 03c4 jz 0x03c4 - if (mem16[0x035A] != 0) - { - 03ac 0a02 lris $AX0.H, #0x02 - 03ad c100 cmpar $ACC0, $AX0.H - 03ae 0294 03ba jnz 0x03ba - 03b0 0080 035b lri $AR0, #0x035b - 03b2 00c1 0ce1 lr $AR1, @0x0ce1 - 03b4 0082 0d0c lri $AR2, #0x0d0c - 03b6 02bf 06c3 call 06c3_Unknown() - 03b8 029f 03cc jmp 0x03cc - 03ba 0080 0d0c lri $AR0, #0x0d0c - 03bc 00c1 0ce1 lr $AR1, @0x0ce1 - 03be 0083 035b lri $AR3, #0x035b - 03c0 02bf 06ab call 0x06ab - 03c2 029f 03cc jmp 0x03cc - } - else - { - 03c4 0080 0d0c lri $AR0, #0x0d0c - 03c6 00c1 0ce1 lr $AR1, @0x0ce1 - 03c8 1160 03cb bloopi #0x60, 0x03cb - 03ca 193f lrri $AC1.M, @$AR1 - 03cb 1b1f srri @$AR0, $AC1.M - } - 03cc 0082 0355 lri $AR2, #0x0355 - 03ce 8c00 clr15 - 03cf 8100 clr $ACC0 - 03d0 195c lrri $AC0.L, @$AR2 - 03d1 009b 0005 lri $AX1.H, #0x0005 - 03d3 0099 5555 lri $AX1.L, #0x5555 - 03d5 0080 0d08 lri $AR0, #0x0d08 - 03d7 1104 03da bloopi #0x04, 0x03da - 03d9 195f lrri $AC1.M, @$AR2 - 03da 1b1f srri @$AR0, $AC1.M - 03db 0081 0cc0 lri $AR1, #0x0cc0 - 03dd 0084 0d08 lri $IX0, #0x0d08 - 03df 0087 1000 lri $IX3, #0x1000 - 03e1 1112 03f2 bloopi #0x12, 0x03f2 - 03e3 4a00 addax $ACC0, $AX1.L - 03e4 1c1e mrr $AR0, $AC0.M - 03e5 0010 addarn $AR0, $IX0 - 03e6 8900 clr $ACC1 - 03e7 1fbc mrr $AC1.L, $AC0.L - 03e8 1577 lsr $ACC1, #-9 - 03e9 1512 lsl $ACC1, #18 - 03ea 1c7f mrr $AR3, $AC1.M - 03eb 001f addarn $AR3, $IX3 - 03ec 80c3 nx'ld : $AX0.L, $AX1.L, @$AR3 - 03ed 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 03ee 97c3 mulmv'ld $AX0.L, $AX0.H, $ACC1 : $AX0.L, $AX1.L, @$AR3 - 03ef 95c3 mulac'ld $AX0.L, $AX0.H, $ACC1 : $AX0.L, $AX1.L, @$AR3 - 03f0 9500 mulac $AX0.L, $AX0.H, $ACC1 - 03f1 4f00 addp $ACC1 - 03f2 1b3f srri @$AR1, $AC1.M - 03f3 0004 dar $AR0 - 03f4 0006 dar $AR2 - 03f5 189f lrrd $AC1.M, @$AR0 - 03f6 1adf srrd @$AR2, $AC1.M - 03f7 189f lrrd $AC1.M, @$AR0 - 03f8 1adf srrd @$AR2, $AC1.M - 03f9 189f lrrd $AC1.M, @$AR0 - 03fa 1adf srrd @$AR2, $AC1.M - 03fb 189f lrrd $AC1.M, @$AR0 - 03fc 1adf srrd @$AR2, $AC1.M - 03fd 1adc srrd @$AR2, $AC0.L - 03fe 8d00 set15 - 03ff 0081 033d lri $AR1, #0x033d - 0401 0082 0240 lri $AR2, #0x0240 - 0403 00c3 0cd7 lr $AR3, @0x0cd7 - 0405 177f callr $AR3 - 0406 00f8 034d sr @0x034d, $AX0.L - 0408 0081 033f lri $AR1, #0x033f - 040a 0082 0ac0 lri $AR2, #0x0ac0 - 040c 00c3 0cd8 lr $AR3, @0x0cd8 - 040e 177f callr $AR3 - 040f 00f8 0351 sr @0x0351, $AX0.L - 0411 0081 0341 lri $AR1, #0x0341 - 0413 0082 0264 lri $AR2, #0x0264 - 0415 00c3 0cd9 lr $AR3, @0x0cd9 - 0417 177f callr $AR3 - 0418 00f8 034e sr @0x034e, $AX0.L - 041a 0081 0343 lri $AR1, #0x0343 - 041c 0082 0ae4 lri $AR2, #0x0ae4 - 041e 00c3 0cda lr $AR3, @0x0cda - 0420 177f callr $AR3 - 0421 00f8 0352 sr @0x0352, $AX0.L - 0423 0081 0345 lri $AR1, #0x0345 - 0425 0082 0288 lri $AR2, #0x0288 - 0427 00c3 0cdb lr $AR3, @0x0cdb - 0429 177f callr $AR3 - 042a 00f8 034f sr @0x034f, $AX0.L - 042c 0081 0347 lri $AR1, #0x0347 - 042e 0082 0b08 lri $AR2, #0x0b08 - 0430 00c3 0cdc lr $AR3, @0x0cdc - 0432 177f callr $AR3 - 0433 00f8 0353 sr @0x0353, $AX0.L - 0435 0081 0349 lri $AR1, #0x0349 - 0437 0082 02ac lri $AR2, #0x02ac - 0439 00c3 0cdd lr $AR3, @0x0cdd - 043b 177f callr $AR3 - 043c 00f8 0350 sr @0x0350, $AX0.L - 043e 0081 034b lri $AR1, #0x034b - 0440 0082 0b2c lri $AR2, #0x0b2c - 0442 00c3 0cde lr $AR3, @0x0cde - 0444 177f callr $AR3 - 0445 00f8 0354 sr @0x0354, $AX0.L - } - 0447 00de 02f2 lr $AC0.M, @0x02f2 - 0449 b100 tst $ACC0 - 044a 0295 046a jz 0x046a - 044c 00de 02f5 lr $AC0.M, @0x02f5 - 044e 00df 02f7 lr $AC1.M, @0x02f7 - 0450 8200 cmp - 0451 0293 0456 jle 0x0456 - 0453 7800 decm $AC0.M - 0454 029f 0459 jmp 0x0459 - 0456 0295 0459 jz 0x0459 - 0458 7400 incm $AC0.M - 0459 00fe 02f5 sr @0x02f5, $AC0.M - 045b 00de 02f6 lr $AC0.M, @0x02f6 - 045d 00df 02f8 lr $AC1.M, @0x02f8 - 045f 8200 cmp - 0460 0293 0465 jle 0x0465 - 0462 7800 decm $AC0.M - 0463 029f 0468 jmp 0x0468 - 0465 0295 0468 jz 0x0468 - 0467 7400 incm $AC0.M - - 0468 00fe 02f6 sr @0x02f6, $AC0.M - 046a 8e00 set16 -} - - 046b 8100 clr $ACC0 - 046c 00de 02f2 lr $AC0.M, @0x02f2 - 046e b100 tst $ACC0 - 046f 0295 047f jz 0x047f - 0471 00de 02f3 lr $AC0.M, @0x02f3 - 0473 00dc 02f4 lr $AC0.L, @0x02f4 - 0475 2ece srs @DSMAH, $AC0.M - 0476 2ccf srs @DSMAL, $AC0.L - 0477 16cd 0ca0 si @DSPA, #0x0ca0 - 0479 16c9 0001 si @DSCR, #0x0001 - 047b 16cb 0040 si @DSBL, #0x0040 - 047d 02bf 0084 call 0084_WaitForDMACompletion() // from 0x0CA0 to mem32[0x02F3], 64 bytes - - 047f 8100 clr $ACC0 - 0480 8900 clr $ACC1 - 0481 00de 02d2 lr $AC0.M, @0x02d2 - 0483 00df 02d3 lr $AC1.M, @0x02d3 - 0485 2ece srs @DSMAH, $AC0.M - 0486 2fcf srs @DSMAL, $AC1.M - 0487 16cd 02d0 si @DSPA, #0x02d0 - 0489 16c9 0001 si @DSCR, #0x0001 - 048b 16cb 0140 si @DSBL, #0x0140 - 048d 02bf 0084 call 0084_WaitForDMACompletion() // from 0x02D0 to mem32[0x02D2], 0x140 bytes - 048f 8100 clr $ACC0 - 0490 00de 02d0 lr $AC0.M, @0x02d0 - 0492 00dc 02d1 lr $AC0.L, @0x02d1 - 0494 b100 tst $ACC0 - 0495 0294 0283 jnz 0x0283 // if (mem32[0x02D0] != 0) do the whole thing again; - - 0497 00c0 0cd2 lr $AR0, @0x0cd2 // restore AR0; - 0499 029f 006f jmp 006f_MailHandler() -} - - -void 049b_Cmd_5() { - 049b 8e00 set16 - 049c 00c4 0ce6 lr $IX0, @0x0ce6 - 049e 1905 lrri $IX1, @$AR0 - 049f 00e5 0ce6 sr @0x0ce6, $IX1 - 04a1 0086 0400 lri $IX2, #0x0400 - 04a3 8100 clr $ACC0 - 04a4 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 04a5 191c lrri $AC0.L, @$AR0 - 04a6 2ece srs @DSMAH, $AC0.M - 04a7 2ccf srs @DSMAL, $AC0.L - 04a8 1fc6 mrr $AC0.M, $IX2 - 04a9 2ecd srs @DSPA, $AC0.M - 04aa 16c9 0001 si @DSCR, #0x0001 - 04ac 16cb 0480 si @DSBL, #0x0480 - 04ae 02bf 0084 call 0084_WaitForDMACompletion() - 04b0 02bf 04e6 call 0x04e6 - 04b2 029f 006f jmp 006f_MailHandler() -} - -void 04b4_Cmd_6() { - 04b4 8e00 set16 - 04b5 00c4 0ce7 lr $IX0, @0x0ce7 - 04b7 1905 lrri $IX1, @$AR0 - 04b8 00e5 0ce7 sr @0x0ce7, $IX1 - 04ba 0086 0640 lri $IX2, #0x0640 - 04bc 8100 clr $ACC0 - 04bd 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 04be 191c lrri $AC0.L, @$AR0 - 04bf 2ece srs @DSMAH, $AC0.M - 04c0 2ccf srs @DSMAL, $AC0.L - 04c1 1fc6 mrr $AC0.M, $IX2 - 04c2 2ecd srs @DSPA, $AC0.M - 04c3 16c9 0001 si @DSCR, #0x0001 - 04c5 16cb 0480 si @DSBL, #0x0480 - 04c7 02bf 0084 call 0084_WaitForDMACompletion() - 04c9 02bf 04e6 call 0x04e6 - 04cb 029f 006f jmp 006f_MailHandler() -} - -// Command #7 - Set output buffer address -// AXList data: -// - command (2) -// - something (2) -// - Left/Right(?) output buffer address (4) -// - Right/Left(?) output buffer address (4) -// -void 04cd_Cmd_7() { - 04cd 8e00 set16 - 04ce 00c4 0ce8 lr $IX0, @0x0ce8 - 04d0 1905 lrri $IX1, @$AR0 - 04d1 00e5 0ce8 sr @0x0ce8, $IX1 // mem16[0x0CE8] = mem16[0x0C01]; - 04d3 0086 0880 lri $IX2, #0x0880 - 04d5 8100 clr $ACC0 - 04d6 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 04d7 191c lrri $AC0.L, @$AR0 - 04d8 2ece srs @DSMAH, $AC0.M - 04d9 2ccf srs @DSMAL, $AC0.L - 04da 1fc6 mrr $AC0.M, $IX2 - 04db 2ecd srs @DSPA, $AC0.M - 04dc 16c9 0001 si @DSCR, #0x0001 - 04de 16cb 0480 si @DSBL, #0x0480 // dma from 0x0880 to mem32[0x0C02], 1152 bytes. - 04e0 02bf 0084 call 0084_WaitForDMACompletion() - 04e2 02bf 04e6 call 0x04e6 - 04e4 029f 006f jmp 006f_MailHandler() -} - -void 04e6_Unk() { - 04e6 8b00 m0 - 04e7 8100 clr $ACC0 - 04e8 1fc4 mrr $AC0.M, $IX0 - 04e9 1fe5 mrr $AC1.M, $IX1 - 04ea 5d00 sub $ACC1, $ACC0 - 04eb 009a 02ab lri $AX0.H, #0x02ab - 04ed 009b 02aa lri $AX1.H, #0x02aa - 04ef 0081 0d08 lri $AR1, #0x0d08 - 04f1 d000 mulc $AC1.M, $AX0.H - 04f2 d400 mulcac $AC1.M, $AX0.H, $ACC0 - 04f3 111f 04f7 bloopi #0x1f, 0x04f7 - 04f5 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 04f6 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 04f7 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 04f8 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 04f9 4e31 addp's $ACC0 : @$AR1, $AC0.M - 04fa 1b25 srri @$AR1, $IX1 - 04fb 8e00 set16 - 04fc 191f lrri $AC1.M, @$AR0 - 04fd 191d lrri $AC1.L, @$AR0 - 04fe 2fce srs @DSMAH, $AC1.M - 04ff 2dcf srs @DSMAL, $AC1.L - 0500 8900 clr $ACC1 - 0501 1fa6 mrr $AC1.L, $IX2 - 0502 2dcd srs @DSPA, $AC1.L - 0503 16c9 0000 si @DSCR, #0x0000 - 0505 16cb 0480 si @DSBL, #0x0480 - 0507 02bf 0084 call 0084_WaitForDMACompletion() - 0509 00e0 0cd2 sr @0x0cd2, $AR0 - 050b 8f00 set40 - 050c 8d00 set15 - 050d 8a00 m2 - 050e 0080 0d08 lri $AR0, #0x0d08 - 0510 0081 0000 lri $AR1, #0x0000 - 0512 1c41 mrr $AR2, $AR1 - 0513 1c66 mrr $AR3, $IX2 - 0514 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0515 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0516 a000 mulx $AX0.L, $AX1.L - 0517 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0518 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0519 4e00 addp $ACC0 - 051a 4800 addax $ACC0, $AX0.L - 051b 112f 052a bloopi #0x2f, 0x052a - 051d 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 051e 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 051f a000 mulx $AX0.L, $AX1.L - 0520 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0521 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0522 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0523 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0524 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0525 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0526 a000 mulx $AX0.L, $AX1.L - 0527 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0528 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0529 4e3a addp's $ACC0 : @$AR2, $AC1.M - 052a 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 052b 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 052c 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 052d a000 mulx $AX0.L, $AX1.L - 052e af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 052f 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0530 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0531 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0532 1b5f srri @$AR2, $AC1.M - 0533 1b5d srri @$AR2, $AC1.L - 0534 0080 0d08 lri $AR0, #0x0d08 - 0536 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0537 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0538 a000 mulx $AX0.L, $AX1.L - 0539 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 053a 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 053b 4e00 addp $ACC0 - 053c 4800 addax $ACC0, $AX0.L - 053d 112f 054c bloopi #0x2f, 0x054c - 053f 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0540 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0541 a000 mulx $AX0.L, $AX1.L - 0542 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0543 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0544 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0545 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0546 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0547 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0548 a000 mulx $AX0.L, $AX1.L - 0549 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 054a 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 054b 4e3a addp's $ACC0 : @$AR2, $AC1.M - 054c 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 054d 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 054e 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 054f a000 mulx $AX0.L, $AX1.L - 0550 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0551 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0552 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0553 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0554 1b5f srri @$AR2, $AC1.M - 0555 1b5d srri @$AR2, $AC1.L - 0556 0080 0d08 lri $AR0, #0x0d08 - 0558 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0559 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 055a a000 mulx $AX0.L, $AX1.L - 055b ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 055c 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 055d 4e00 addp $ACC0 - 055e 4800 addax $ACC0, $AX0.L - 055f 112f 056e bloopi #0x2f, 0x056e - 0561 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0562 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0563 a000 mulx $AX0.L, $AX1.L - 0564 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0565 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0566 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0567 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0568 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0569 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 056a a000 mulx $AX0.L, $AX1.L - 056b ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 056c 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 056d 4e3a addp's $ACC0 : @$AR2, $AC1.M - 056e 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 056f 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0570 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0571 a000 mulx $AX0.L, $AX1.L - 0572 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0573 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0574 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0575 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0576 1b5f srri @$AR2, $AC1.M - 0577 1b5d srri @$AR2, $AC1.L - 0578 00c0 0cd2 lr $AR0, @0x0cd2 - 057a 02df ret -} - -void 057b_Cmd_A() { - 057b 8d00 set15 - 057c 8f00 set40 - 057d 8a00 m2 - 057e 8900 clr $ACC1 - 057f 8168 clr'l $ACC0 : $AC1.L, @$AR0 - 0580 0098 0000 lri $AX0.L, #0x0000 - 0582 0099 0001 lri $AX1.L, #0x0001 - 0584 0081 0000 lri $AR1, #0x0000 - 0586 193e lrri $AC0.M, @$AR1 - 0587 193c lrri $AC0.L, @$AR1 - 0588 1160 0593 bloopi #0x60, 0x0593 - 058a a100 tstaxl $ACC0 - 058b 8271 cmp'l : $AC0.M, @$AR1 - 058c 0277 ifc - 058d 1f19 mrr $AX0.L, $AX1.L - 058e 193c lrri $AC0.L, @$AR1 - 058f a100 tstaxl $ACC0 - 0590 8271 cmp'l : $AC0.M, @$AR1 - 0591 0277 ifc - 0592 1f19 mrr $AX0.L, $AX1.L - 0593 193c lrri $AC0.L, @$AR1 - 0594 1fd8 mrr $AC0.M, $AX0.L - 0595 b100 tst $ACC0 - 0596 0294 05c0 jnz 0x05c0 - 0598 00de 0ce4 lr $AC0.M, @0x0ce4 - 059a b100 tst $ACC0 - 059b 0294 05a2 jnz 0x05a2 - 059d 191c lrri $AC0.L, @$AR0 - 059e 191c lrri $AC0.L, @$AR0 - 059f 191c lrri $AC0.L, @$AR0 - 05a0 029f 006f jmp 006f_MailHandler() - 05a2 8b00 m0 - 05a3 7a00 dec $ACC0 - 05a4 00fe 0ce4 sr @0x0ce4, $AC0.M - 05a6 8400 clrp - 05a7 0099 00c0 lri $AX1.L, #0x00c0 - 05a9 1f1e mrr $AX0.L, $AC0.M - 05aa a000 mulx $AX0.L, $AX1.L - 05ab 191e lrri $AC0.M, @$AR0 - 05ac 191e lrri $AC0.M, @$AR0 - 05ad 191c lrri $AC0.L, @$AR0 - 05ae 00e0 0cd2 sr @0x0cd2, $AR0 - 05b0 009a 0000 lri $AX0.H, #0x0000 - 05b2 0098 0840 lri $AX0.L, #0x0840 - 05b4 4e00 addp $ACC0 - 05b5 4800 addax $ACC0, $AX0.L - 05b6 2ece srs @DSMAH, $AC0.M - 05b7 2ccf srs @DSMAL, $AC0.L - 05b8 16cd 0d08 si @DSPA, #0x0d08 - 05ba 16c9 0000 si @DSCR, #0x0000 - 05bc 16cb 00c0 si @DSBL, #0x00c0 - 05be 029f 05d6 jmp 0x05d6 - 05c0 8b00 m0 - 05c1 00d8 0ce4 lr $AX0.L, @0x0ce4 - 05c3 0099 00c0 lri $AX1.L, #0x00c0 - 05c5 a000 mulx $AX0.L, $AX1.L - 05c6 191e lrri $AC0.M, @$AR0 - 05c7 00fe 0ce4 sr @0x0ce4, $AC0.M - 05c9 191e lrri $AC0.M, @$AR0 - 05ca 191c lrri $AC0.L, @$AR0 - 05cb 00e0 0cd2 sr @0x0cd2, $AR0 - 05cd 4e00 addp $ACC0 - 05ce 2ece srs @DSMAH, $AC0.M - 05cf 2ccf srs @DSMAL, $AC0.L - 05d0 16cd 0d08 si @DSPA, #0x0d08 - 05d2 16c9 0000 si @DSCR, #0x0000 - 05d4 16cb 00c0 si @DSBL, #0x00c0 - 05d6 02bf 0084 call 0084_WaitForDMACompletion() - 05d8 8a48 m2'l : $AX1.L, @$AR0 - 05d9 0083 0d08 lri $AR3, #0x0d08 - 05db 0080 0000 lri $AR0, #0x0000 - 05dd 0081 0000 lri $AR1, #0x0000 - 05df 1979 lrri $AX1.L, @$AR3 - 05e0 193a lrri $AX0.H, @$AR1 - 05e1 b041 mulx'l $AX0.H, $AX1.L : $AX0.L, @$AR1 - 05e2 a64b mulxmv'l $AX0.L, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 05e3 f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 05e4 b441 mulxac'l $AX0.H, $AX1.L, $ACC0 : $AX0.L, @$AR1 - 05e5 9100 asr16 $ACC0 - 05e6 1130 05ef bloopi #0x30, 0x05ef - 05e8 a792 mulxmv'sl $AX0.L, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 05e9 f151 lsl16'l $ACC1 : $AX0.H, @$AR1 - 05ea b520 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR0, $AC0.L - 05eb 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 05ec a693 mulxmv'sl $AX0.L, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 05ed f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 05ee b428 mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC1.L - 05ef 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 05f0 0083 0d08 lri $AR3, #0x0d08 - 05f2 0080 00c0 lri $AR0, #0x00c0 - 05f4 0081 00c0 lri $AR1, #0x00c0 - 05f6 1979 lrri $AX1.L, @$AR3 - 05f7 193a lrri $AX0.H, @$AR1 - 05f8 b041 mulx'l $AX0.H, $AX1.L : $AX0.L, @$AR1 - 05f9 a64b mulxmv'l $AX0.L, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 05fa f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 05fb b441 mulxac'l $AX0.H, $AX1.L, $ACC0 : $AX0.L, @$AR1 - 05fc 9100 asr16 $ACC0 - 05fd 1130 0606 bloopi #0x30, 0x0606 - 05ff a792 mulxmv'sl $AX0.L, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 0600 f151 lsl16'l $ACC1 : $AX0.H, @$AR1 - 0601 b520 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR0, $AC0.L - 0602 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0603 a693 mulxmv'sl $AX0.L, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 0604 f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 0605 b428 mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC1.L - 0606 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0607 00c0 0cd2 lr $AR0, @0x0cd2 - 0609 029f 006f jmp 006f_MailHandler() -} - -void 060b_Cmd_B() { - 060b 8e48 set16'l : $AX1.L, @$AR0 - 060c 8b70 m0'l : $AC0.M, @$AR0 - 060d 8960 clr'l $ACC1 : $AC0.L, @$AR0 - 060e 00e0 0cd2 sr @0x0cd2, $AR0 - 0610 2ece srs @DSMAH, $AC0.M - 0611 2ccf srs @DSMAL, $AC0.L - 0612 16cd 0180 si @DSPA, #0x0180 - 0614 16c9 0001 si @DSCR, #0x0001 - 0616 16cb 0180 si @DSBL, #0x0180 - 0618 8100 clr $ACC0 - 0619 00de 0ce5 lr $AC0.M, @0x0ce5 - 061b 1ff9 mrr $AC1.M, $AX1.L - 061c 5d00 sub $ACC1, $ACC0 - 061d 00f9 0ce5 sr @0x0ce5, $AX1.L - 061f 009a 02ab lri $AX0.H, #0x02ab - 0621 009b 02aa lri $AX1.H, #0x02aa - 0623 0081 0d08 lri $AR1, #0x0d08 - 0625 d000 mulc $AC1.M, $AX0.H - 0626 d400 mulcac $AC1.M, $AX0.H, $ACC0 - 0627 111f 062b bloopi #0x1f, 0x062b - 0629 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 062a d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 062b d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 062c dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 062d 4e31 addp's $ACC0 : @$AR1, $AC0.M - 062e 1b39 srri @$AR1, $AX1.L - 062f 02bf 0084 call 0084_WaitForDMACompletion() - 0631 8f00 set40 - 0632 8d00 set15 - 0633 8a00 m2 - 0634 0080 0d08 lri $AR0, #0x0d08 - 0636 0081 0400 lri $AR1, #0x0400 - 0638 0083 0000 lri $AR3, #0x0000 - 063a 0082 00c0 lri $AR2, #0x00c0 - 063c 1918 lrri $AX0.L, @$AR0 - 063d 195b lrri $AX1.H, @$AR2 - 063e 1959 lrri $AX1.L, @$AR2 - 063f a000 mulx $AX0.L, $AX1.L - 0640 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0641 9100 asr16 $ACC0 - 0642 4e5b addp'l $ACC0 : $AX1.H, @$AR3 - 0643 f04b lsl16'l $ACC0 : $AX1.L, @$AR3 - 0644 115f 064f bloopi #0x5f, 0x064f - 0646 a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 0647 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0648 9140 asr16'l $ACC0 : $AX0.L, @$AR0 - 0649 4e5a addp'l $ACC0 : $AX1.H, @$AR2 - 064a f04a lsl16'l $ACC0 : $AX1.L, @$AR2 - 064b a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 064c ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 064d 9100 asr16 $ACC0 - 064e 4e5b addp'l $ACC0 : $AX1.H, @$AR3 - 064f f04b lsl16'l $ACC0 : $AX1.L, @$AR3 - 0650 a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 0651 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0652 9100 asr16 $ACC0 - 0653 4e00 addp $ACC0 - 0654 f000 lsl16 $ACC0 - 0655 1b3e srri @$AR1, $AC0.M - 0656 8e00 set16 - 0657 00c0 0cd2 lr $AR0, @0x0cd2 - 0659 191e lrri $AC0.M, @$AR0 - 065a 191c lrri $AC0.L, @$AR0 - 065b 2ece srs @DSMAH, $AC0.M - 065c 2ccf srs @DSMAL, $AC0.L - 065d 16cd 0400 si @DSPA, #0x0400 - 065f 16c9 0001 si @DSCR, #0x0001 - 0661 16cb 0180 si @DSBL, #0x0180 - 0663 02bf 0084 call 0084_WaitForDMACompletion() - 0665 16fc dcd1 si @DMBH, #0xdcd1 <--------------!!! - 0667 16fd 0004 si @DMBL, #0x0004 <--------------!!! - 0669 16fb 0001 si @DIRQ, #0x0001 <--------------!!! - 066b 26fc lrs $AC0.M, @DMBH - 066c 02a0 8000 andf $AC0.M, #0x8000 - 066e 029c 066b jlnz 0x066b - 0670 029f 006f jmp 006f_MailHandler() -} - -// Command 0xE - AXList end -void 0672_Cmd_E() { - 0672 16fc dcd1 si @DMBH, #0xdcd1 - 0674 16fd 0002 si @DMBL, #0x0002 - 0676 16fb 0001 si @DIRQ, #0x0001 // send a 0xDCD10002 and trigger an IRQ - 0678 029f 0f9b jmp 0x0f9b - 067a 029f 004c jmp 0x004c -} - -void 067c_Cmd_D() { - 067c 8c00 clr15 - 067d 8a00 m2 - 067e 8f00 set40 - 067f 0081 0ac0 lri $AR1, #0x0ac0 - 0681 0082 0240 lri $AR2, #0x0240 - 0683 1fa1 mrr $AC1.L, $AR1 - 0684 1112 0689 bloopi #0x12, 0x0689 - 0686 195e lrri $AC0.M, @$AR2 - 0687 195c lrri $AC0.L, @$AR2 - 0688 f000 lsl16 $ACC0 - 0689 1b3e srri @$AR1, $AC0.M - 068a 191e lrri $AC0.M, @$AR0 - 068b 191c lrri $AC0.L, @$AR0 - 068c 2ece srs @DSMAH, $AC0.M - 068d 2ccf srs @DSMAL, $AC0.L - 068e 2dcd srs @DSPA, $AC1.L - 068f 1103 06a2 bloopi #0x03, 0x06a2 - 0691 16c9 0001 si @DSCR, #0x0001 - 0693 16cb 0024 si @DSBL, #0x0024 - 0695 1fa1 mrr $AC1.L, $AR1 - 0696 1112 069b bloopi #0x12, 0x069b - 0698 195e lrri $AC0.M, @$AR2 - 0699 195c lrri $AC0.L, @$AR2 - 069a f000 lsl16 $ACC0 - 069b 1b3e srri @$AR1, $AC0.M - 069c 02bf 0084 call 0084_WaitForDMACompletion() - 069e 191e lrri $AC0.M, @$AR0 - 069f 191c lrri $AC0.L, @$AR0 - 06a0 2ece srs @DSMAH, $AC0.M - 06a1 2ccf srs @DSMAL, $AC0.L - 06a2 2dcd srs @DSPA, $AC1.L - 06a3 16c9 0001 si @DSCR, #0x0001 - 06a5 16cb 0024 si @DSBL, #0x0024 - 06a7 02bf 0084 call 0084_WaitForDMACompletion() - 06a9 029f 006f jmp 006f_MailHandler() -} - -void 06ab_unknown() { - 06ab 0087 ffff lri $IX3, #0xffff - 06ad 1c83 mrr $IX0, $AR3 - 06ae 197e lrri $AC0.M, @$AR3 - 06af 80e1 nx'ld : $AX0.H, $AX1.L, @$AR1 - 06b0 b04f mulx'ln $AX0.H, $AX1.L : $AX1.L, @$AR3 - 06b1 1f5e mrr $AX0.H, $AC0.M - 06b2 e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 06b3 b64f mulxmv'ln $AX0.H, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 06b4 1f5e mrr $AX0.H, $AC0.M - 06b5 e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 06b6 112f 06bd bloopi #0x2f, 0x06bd - 06b8 b79a mulxmv'slm $AX0.H, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 06b9 1f5f mrr $AX0.H, $AC1.M - 06ba e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 06bb b69b mulxmv'slm $AX0.H, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 06bc 1f5e mrr $AX0.H, $AC0.M - 06bd e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 06be 6f30 movp's $ACC1 : @$AR0, $AC0.M - 06bf 1b1f srri @$AR0, $AC1.M - 06c0 1c64 mrr $AR3, $IX0 - 06c1 1b7f srri @$AR3, $AC1.M - 06c2 02df ret -} - -void 06c3_Unknown() { - 06c3 8c00 clr15 - 06c4 8b00 m0 - 06c5 1ca0 mrr $IX1, $AR0 - 06c6 0083 0370 lri $AR3, #0x0370 - 06c8 191a lrri $AX0.H, @$AR0 - 06c9 1918 lrri $AX0.L, @$AR0 - 06ca 1b7a srri @$AR3, $AX0.H - 06cb 1b78 srri @$AR3, $AX0.L - 06cc 1919 lrri $AX1.L, @$AR0 - 06cd 191b lrri $AX1.H, @$AR0 - 06ce 0083 0d03 lri $AR3, #0x0d03 - 06d0 1105 06d3 bloopi #0x05, 0x06d3 - 06d2 191a lrri $AX0.H, @$AR0 - 06d3 1b7a srri @$AR3, $AX0.H - 06d4 0080 0d03 lri $AR0, #0x0d03 - 06d6 0088 0004 lri $WR0, #0x0004 - 06d8 0083 0370 lri $AR3, #0x0370 - 06da 008b 0001 lri $WR3, #0x0001 - 06dc 0087 0000 lri $IX3, #0x0000 - 06de 193f lrri $AC1.M, @$AR1 - 06df 191a lrri $AX0.H, @$AR0 - 06e0 d0c3 mulc'ld $AC1.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06e1 f2cb madd'ldm $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06e2 f2a9 madd'lsm $AX0.L, $AX0.H : $AX0.H, $AC1.M - 06e3 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 06e4 e379 maddx'l $AX0.H, $AX1.H : $AC1.M, @$AR1 - 06e5 6e50 movp'l $ACC0 : $AX0.H, @$AR0 - 06e6 1482 asl $ACC0, #2 - 06e7 fc00 clrl $AC1.L - 06e8 1f7e mrr $AX1.H, $AC0.M - 06e9 1b5e srri @$AR2, $AC0.M - 06ea 112f 06ff bloopi #0x2f, 0x06ff - 06ec d0c3 mulc'ld $AC1.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06ed f2cb madd'ldm $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06ee f2a9 madd'lsm $AX0.L, $AX0.H : $AX0.H, $AC1.M - 06ef e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 06f0 e279 maddx'l $AX0.H, $AX1.L : $AC1.M, @$AR1 - 06f1 6e50 movp'l $ACC0 : $AX0.H, @$AR0 - 06f2 1482 asl $ACC0, #2 - 06f3 fc00 clrl $AC1.L - 06f4 1f3e mrr $AX1.L, $AC0.M - 06f5 1b5e srri @$AR2, $AC0.M - 06f6 d0c3 mulc'ld $AC1.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06f7 f2cb madd'ldm $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 06f8 f2a9 madd'lsm $AX0.L, $AX0.H : $AX0.H, $AC1.M - 06f9 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 06fa e379 maddx'l $AX0.H, $AX1.H : $AC1.M, @$AR1 - 06fb 6e50 movp'l $ACC0 : $AX0.H, @$AR0 - 06fc 1482 asl $ACC0, #2 - 06fd fc00 clrl $AC1.L - 06fe 1f7e mrr $AX1.H, $AC0.M - 06ff 1b5e srri @$AR2, $AC0.M - 0700 d0c3 mulc'ld $AC1.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0701 f2cb madd'ldm $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0702 f2a9 madd'lsm $AX0.L, $AX0.H : $AX0.H, $AC1.M - 0703 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0704 e200 maddx $AX0.H, $AX1.L - 0705 6e00 movp $ACC0 - 0706 1482 asl $ACC0, #2 - 0707 fc00 clrl $AC1.L - 0708 1f3e mrr $AX1.L, $AC0.M - 0709 1b5e srri @$AR2, $AC0.M - 070a 0088 ffff lri $WR0, #0xffff - 070c 008b ffff lri $WR3, #0xffff - 070e 1c05 mrr $AR0, $IX1 - 070f 0083 0370 lri $AR3, #0x0370 - 0711 197a lrri $AX0.H, @$AR3 - 0712 1978 lrri $AX0.L, @$AR3 - 0713 1b1a srri @$AR0, $AX0.H - 0714 1b18 srri @$AR0, $AX0.L - 0715 1b19 srri @$AR0, $AX1.L - 0716 1b1b srri @$AR0, $AX1.H - 0717 8d00 set15 - 0718 8a00 m2 - 0719 02df ret -} - -// Sample rate converter #0 - None -// - 071a 02bf 07e6 call 0x07e6_SetupAccelerator() - 071c 8c00 clr15 - 071d 8a00 m2 - 071e 8f00 set40 - // Read ratio - 071f 195b lrri $AX1.H, @$AR2 - 0720 1959 lrri $AX1.L, @$AR2 - 0721 8100 clr $ACC0 - // Read cur_addr fractional part - 0722 195c lrri $AC0.L, @$AR2 - 0723 0080 0d08 lri $AR0, #0x0d08 - 0725 0088 0003 lri $WR0, #0x0003 - // Read the last samples, copy them to 0x0D08 - 0727 195f lrri $AC1.M, @$AR2 - 0728 1b1f srri @$AR0, $AC1.M - 0729 195f lrri $AC1.M, @$AR2 - 072a 1b1f srri @$AR0, $AC1.M - 072b 195f lrri $AC1.M, @$AR2 - 072c 1b1f srri @$AR0, $AC1.M - 072d 195f lrri $AC1.M, @$AR2 - 072e 1b1f srri @$AR0, $AC1.M - - 072f 0081 0c60 lri $AR1, #0x0c60 - 0731 0082 ffdd lri $AR2, #0xffdd - 0733 00c7 0ce0 lr $IX3, @0x0ce0 - 0735 4a00 addax $ACC0, $AX1.L - 0736 1160 074a bloopi #0x60, 0x074a - 0738 8912 clr'mv $ACC1 : $AX0.L, $AC0.M - 0739 1fbc mrr $AC1.L, $AC0.L - 073a 1577 lsr $ACC1, #-9 - 073b 1512 lsl $ACC1, #18 - 073c 1c7f mrr $AR3, $AC1.M - 073d 001f addarn $AR3, $IX3 - 073e 0078 0743 bloop $AX0.L, 0x0743 - 0740 185a lrr $AX0.H, @$AR2 - 0741 1b1a srri @$AR0, $AX0.H - 0742 5000 subr $ACC0, $AX0.L - 0743 1f1d mrr $AX0.L, $AC1.L - 0744 4ac3 addax'ld $ACC0, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0745 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0746 97c3 mulmv'ld $AX0.L, $AX0.H, $ACC1 : $AX0.L, $AX1.L, @$AR3 - 0747 95c3 mulac'ld $AX0.L, $AX0.H, $ACC1 : $AX0.L, $AX1.L, @$AR3 - 0748 9500 mulac $AX0.L, $AX0.H, $ACC1 - 0749 4f00 addp $ACC1 - 074a 1b3f srri @$AR1, $AC1.M - 074b 5a00 subax $ACC0, $AX1.L - 074c 0004 dar $AR0 - 074d 0082 0329 lri $AR2, #0x0329 - 074f 189f lrrd $AC1.M, @$AR0 - 0750 1adf srrd @$AR2, $AC1.M - 0751 189f lrrd $AC1.M, @$AR0 - 0752 1adf srrd @$AR2, $AC1.M - 0753 189f lrrd $AC1.M, @$AR0 - 0754 1adf srrd @$AR2, $AC1.M - 0755 189f lrrd $AC1.M, @$AR0 - 0756 1adf srrd @$AR2, $AC1.M - 0757 0088 ffff lri $WR0, #0xffff - 0759 1adc srrd @$AR2, $AC0.L - 075a 0082 0322 lri $AR2, #0x0322 - 075c 27dc lrs $AC1.M, @yn2 - 075d 1adf srrd @$AR2, $AC1.M - 075e 27db lrs $AC1.M, @yn1 - 075f 1adf srrd @$AR2, $AC1.M - 0760 27da lrs $AC1.M, @pred_scale - 0761 1adf srrd @$AR2, $AC1.M - 0762 0082 030e lri $AR2, #0x030e - 0764 27d9 lrs $AC1.M, @ACCAL - 0765 1adf srrd @$AR2, $AC1.M - 0766 27d8 lrs $AC1.M, @ACCAH - 0767 1adf srrd @$AR2, $AC1.M - 0768 8e00 set16 - 0769 8b00 m0 - 076a 02df ret - -// Sample rate converter #1 - ? -// - 076b 02bf 07e6 call 0x07e6_SetupAccelerator() - 076d 8d00 set15 - 076e 8b00 m0 - 076f 8f00 set40 - 0770 195b lrri $AX1.H, @$AR2 - 0771 1945 lrri $IX1, @$AR2 - 0772 8100 clr $ACC0 - 0773 195c lrri $AC0.L, @$AR2 - 0774 0080 0d08 lri $AR0, #0x0d08 - 0776 0088 0003 lri $WR0, #0x0003 - 0778 0084 0003 lri $IX0, #0x0003 - 077a 195f lrri $AC1.M, @$AR2 - 077b 1b1f srri @$AR0, $AC1.M - 077c 195f lrri $AC1.M, @$AR2 - 077d 1b1f srri @$AR0, $AC1.M - 077e 195f lrri $AC1.M, @$AR2 - 077f 1b1f srri @$AR0, $AC1.M - 0780 195f lrri $AC1.M, @$AR2 - 0781 1b1f srri @$AR0, $AC1.M - 0782 0081 0c60 lri $AR1, #0x0c60 - 0784 0082 ffdd lri $AR2, #0xffdd - 0786 1f25 mrr $AX1.L, $IX1 - 0787 4a00 addax $ACC0, $AX1.L - 0788 1160 079f bloopi #0x60, 0x079f - 078a 8912 clr'mv $ACC1 : $AX0.L, $AC0.M - 078b 0078 0790 bloop $AX0.L, 0x0790 - 078d 185a lrr $AX0.H, @$AR2 - 078e 1b1a srri @$AR0, $AX0.H - 078f 5000 subr $ACC0, $AX0.L - 0790 1f1f mrr $AX0.L, $AC1.M - 0791 7c00 neg $ACC0 - 0792 b114 tst'mv $ACC0 : $AX1.L, $AC0.L - 0793 0294 0799 jnz 0x0799 - 0795 191f lrri $AC1.M, @$AR0 - 0796 0010 addarn $AR0, $IX0 - 0797 029f 079e jmp 0x079e - 0799 7c50 neg'l $ACC0 : $AX0.H, @$AR0 - 079a b014 mulx'mv $AX0.H, $AX1.L : $AX1.L, $AC0.L - 079b 199a lrrn $AX0.H, @$AR0 - 079c b700 mulxmv $AX0.H, $AX1.L, $ACC1 - 079d 4f00 addp $ACC1 - 079e 1f25 mrr $AX1.L, $IX1 - 079f 4a39 addax's $ACC0, $AX1.L : @$AR1, $AC1.M - 07a0 5a00 subax $ACC0, $AX1.L - 07a1 0004 dar $AR0 - 07a2 0082 0329 lri $AR2, #0x0329 - 07a4 189f lrrd $AC1.M, @$AR0 - 07a5 1adf srrd @$AR2, $AC1.M - 07a6 189f lrrd $AC1.M, @$AR0 - 07a7 1adf srrd @$AR2, $AC1.M - 07a8 189f lrrd $AC1.M, @$AR0 - 07a9 1adf srrd @$AR2, $AC1.M - 07aa 189f lrrd $AC1.M, @$AR0 - 07ab 1adf srrd @$AR2, $AC1.M - 07ac 0088 ffff lri $WR0, #0xffff - 07ae 1adc srrd @$AR2, $AC0.L - 07af 0082 0322 lri $AR2, #0x0322 - 07b1 27dc lrs $AC1.M, @yn2 - 07b2 1adf srrd @$AR2, $AC1.M - 07b3 27db lrs $AC1.M, @yn1 - 07b4 1adf srrd @$AR2, $AC1.M - 07b5 27da lrs $AC1.M, @pred_scale - 07b6 1adf srrd @$AR2, $AC1.M - 07b7 0082 030e lri $AR2, #0x030e - 07b9 27d9 lrs $AC1.M, @ACCAL - 07ba 1adf srrd @$AR2, $AC1.M - 07bb 27d8 lrs $AC1.M, @ACCAH - 07bc 1adf srrd @$AR2, $AC1.M - 07bd 8e00 set16 - 07be 8c00 clr15 - 07bf 02df ret - -// Sample rate converter #2 - No sample rate conversion -// Just copies 96 bytes of data to the output buffer -// - 07c0 02bf 07e6 call 0x07e6_SetupAccelerator() - 07c2 0080 0c60 lri $AR0, #0x0c60 - 07c4 0082 ffdd lri $AR2, #0xffdd // 0xFFDD: ACDAT - 07c6 1160 07cb bloopi #0x60, 0x07cb - 07c8 1844 lrr $IX0, @$AR2 // Load a sample from accelerator - 07c9 1b04 srri @$AR0, $IX0 // and store it to 0x0C60+ - 07ca 0000 nop - 07cb 0000 nop - 07cc 0004 dar $AR0 - // Save the 4 last samples in the PB - 07cd 0082 0329 lri $AR2, #0x0329 - 07cf 189f lrrd $AC1.M, @$AR0 - 07d0 1adf srrd @$AR2, $AC1.M - 07d1 189f lrrd $AC1.M, @$AR0 - 07d2 1adf srrd @$AR2, $AC1.M - 07d3 189f lrrd $AC1.M, @$AR0 - 07d4 1adf srrd @$AR2, $AC1.M - 07d5 189f lrrd $AC1.M, @$AR0 - 07d6 1adf srrd @$AR2, $AC1.M - // Save the accelerator regs in the PB - 07d7 0082 0322 lri $AR2, #0x0322 - // YN1 and YN2 - 07d9 27dc lrs $AC1.M, @yn2 - 07da 1adf srrd @$AR2, $AC1.M - 07db 27db lrs $AC1.M, @yn1 - 07dc 1adf srrd @$AR2, $AC1.M - // Pred scale - 07dd 27da lrs $AC1.M, @pred_scale - 07de 1adf srrd @$AR2, $AC1.M - 07df 0082 030e lri $AR2, #0x030e - // Current address - 07e1 27d9 lrs $AC1.M, @ACCAL - 07e2 1adf srrd @$AR2, $AC1.M - 07e3 27d8 lrs $AC1.M, @ACCAH - 07e4 1adf srrd @$AR2, $AC1.M - 07e5 02df ret - -// Called by the three sample rate converters above. -// Sets up the accelerator so that it can be used to -// read the audio data. -// The accelerator area is set to be the same length -// as the sound data being played, so that looping -// will be handled by exception vector #5 (ACCOV). -// Parameters: None -// Return: AR0 = 0x0328 -// -07e6_SetupAccelerator() -{ - // Set the accelerator regs from the PB - 07e6 0082 0308 lri $AR2, #0x0308 - // Sample format - 07e8 195e lrri $AC0.M, @$AR2 - 07e9 2ed1 srs @SampleFormat, $AC0.M - // Start address - 07ea 195e lrri $AC0.M, @$AR2 - 07eb 2ed4 srs @ACSAH, $AC0.M - 07ec 195e lrri $AC0.M, @$AR2 - 07ed 2ed5 srs @ACSAL, $AC0.M - // End address - 07ee 195e lrri $AC0.M, @$AR2 - 07ef 2ed6 srs @ACEAH, $AC0.M - 07f0 195e lrri $AC0.M, @$AR2 - 07f1 2ed7 srs @ACEAL, $AC0.M - // Current address - 07f2 195e lrri $AC0.M, @$AR2 - 07f3 2ed8 srs @ACCAH, $AC0.M - 07f4 195e lrri $AC0.M, @$AR2 - 07f5 2ed9 srs @ACCAL, $AC0.M - // 16 coefs - 07f6 195e lrri $AC0.M, @$AR2 - 07f7 2ea0 srs @COEF_A1_0, $AC0.M - 07f8 195e lrri $AC0.M, @$AR2 - 07f9 2ea1 srs @COEF_A2_0, $AC0.M - 07fa 195e lrri $AC0.M, @$AR2 - 07fb 2ea2 srs @COEF_A1_1, $AC0.M - 07fc 195e lrri $AC0.M, @$AR2 - 07fd 2ea3 srs @COEF_A2_1, $AC0.M - 07fe 195e lrri $AC0.M, @$AR2 - 07ff 2ea4 srs @COEF_A1_2, $AC0.M - 0800 195e lrri $AC0.M, @$AR2 - 0801 2ea5 srs @COEF_A2_2, $AC0.M - 0802 195e lrri $AC0.M, @$AR2 - 0803 2ea6 srs @COEF_A1_3, $AC0.M - 0804 195e lrri $AC0.M, @$AR2 - 0805 2ea7 srs @COEF_A2_3, $AC0.M - 0806 195e lrri $AC0.M, @$AR2 - 0807 2ea8 srs @COEF_A1_4, $AC0.M - 0808 195e lrri $AC0.M, @$AR2 - 0809 2ea9 srs @COEF_A2_4, $AC0.M - 080a 195e lrri $AC0.M, @$AR2 - 080b 2eaa srs @COEF_A1_5, $AC0.M - 080c 195e lrri $AC0.M, @$AR2 - 080d 2eab srs @COEF_A2_5, $AC0.M - 080e 195e lrri $AC0.M, @$AR2 - 080f 2eac srs @COEF_A1_6, $AC0.M - 0810 195e lrri $AC0.M, @$AR2 - 0811 2ead srs @COEF_A2_6, $AC0.M - 0812 195e lrri $AC0.M, @$AR2 - 0813 2eae srs @COEF_A1_7, $AC0.M - 0814 195e lrri $AC0.M, @$AR2 - 0815 2eaf srs @COEF_A2_7, $AC0.M - // Gain - 0816 195e lrri $AC0.M, @$AR2 - 0817 2ede srs @GAIN, $AC0.M - // Pred scale - 0818 195e lrri $AC0.M, @$AR2 - 0819 2eda srs @pred_scale, $AC0.M - // YN1 and YN2 - 081a 195e lrri $AC0.M, @$AR2 - 081b 2edb srs @yn1, $AC0.M - 081c 195e lrri $AC0.M, @$AR2 - 081d 2edc srs @yn2, $AC0.M - 081e 02df ret -} - -// Volume_0_0 - 081f 02df ret - -// Volume_0_1 - 0820 00c0 0ce2 lr $AR0, @0x0ce2 - 0822 0081 02da lri $AR1, #0x02da - 0824 0082 0000 lri $AR2, #0x0000 - 0826 1c62 mrr $AR3, $AR2 - 0827 02bf 0bd1 call 0bd1_ApplyVolume1(mem16[0x0ce2], 0x02da, 0x0000, 0x0000) - 0829 00f8 02f9 sr @0x02f9, $AX0.L // uh? the last is saved in updates field? - 082b 02df ret - - 082c 00c0 0ce3 lr $AR0, @0x0ce3 - 082e 0081 02dc lri $AR1, #0x02dc - 0830 0082 00c0 lri $AR2, #0x00c0 - 0832 1c62 mrr $AR3, $AR2 - 0833 02bf 0bd1 call 0bd1_Unknown() - 0835 00f8 02fd sr @0x02fd, $AX0.L - 0837 02df ret - - 0838 00c0 0ce2 lr $AR0, @0x0ce2 - 083a 0081 02da lri $AR1, #0x02da - 083c 0082 0000 lri $AR2, #0x0000 - 083e 1c62 mrr $AR3, $AR2 - 083f 00c4 0ce3 lr $IX0, @0x0ce3 - 0841 0085 00c0 lri $IX1, #0x00c0 - 0843 02bf 0beb call 0x0beb - 0845 00f8 02f9 sr @0x02f9, $AX0.L - 0847 00fb 02fd sr @0x02fd, $AX1.H - 0849 02df ret - - 084a 00c0 0ce2 lr $AR0, @0x0ce2 - 084c 0081 02da lri $AR1, #0x02da - 084e 0082 0000 lri $AR2, #0x0000 - 0850 0083 0d08 lri $AR3, #0x0d08 - 0852 00c4 0ce3 lr $IX0, @0x0ce3 - 0854 0085 00c0 lri $IX1, #0x00c0 - 0856 02bf 0c51 call 0x0c51 - 0858 00f8 02f9 sr @0x02f9, $AX0.L - 085a 00fb 02fd sr @0x02fd, $AX1.H - 085c 02df ret - - 085d 00c0 0ce1 lr $AR0, @0x0ce1 - 085f 0081 02ea lri $AR1, #0x02ea - 0861 0082 0180 lri $AR2, #0x0180 - 0863 1c62 mrr $AR3, $AR2 - 0864 02bf 0bd1 call 0bd1_Unknown() - 0866 00f8 0301 sr @0x0301, $AX0.L - 0868 02df ret - - 0869 00c0 0ce1 lr $AR0, @0x0ce1 - 086b 0081 02ea lri $AR1, #0x02ea - 086d 0082 0180 lri $AR2, #0x0180 - 086f 1c62 mrr $AR3, $AR2 - 0870 02bf 0bd1 call 0bd1_Unknown() - 0872 00f8 0301 sr @0x0301, $AX0.L - 0874 029f 0820 jmp 0x0820 - 0876 00c0 0ce1 lr $AR0, @0x0ce1 - 0878 0081 02ea lri $AR1, #0x02ea - 087a 0082 0180 lri $AR2, #0x0180 - 087c 1c62 mrr $AR3, $AR2 - 087d 02bf 0bd1 call 0bd1_Unknown() - 087f 00f8 0301 sr @0x0301, $AX0.L - 0881 029f 082c jmp 0x082c - 0883 00c0 0ce1 lr $AR0, @0x0ce1 - 0885 0081 02ea lri $AR1, #0x02ea - 0887 0082 0180 lri $AR2, #0x0180 - 0889 1c62 mrr $AR3, $AR2 - 088a 02bf 0bd1 call 0bd1_Unknown() - 088c 00f8 0301 sr @0x0301, $AX0.L - 088e 029f 0838 jmp 0x0838 - 0890 00c0 0ce1 lr $AR0, @0x0ce1 - 0892 0081 02ea lri $AR1, #0x02ea - 0894 0082 0180 lri $AR2, #0x0180 - 0896 1c62 mrr $AR3, $AR2 - 0897 02bf 0bd1 call 0bd1_Unknown() - 0899 00f8 0301 sr @0x0301, $AX0.L - 089b 029f 084a jmp 0x084a - 089d 00c0 0ce1 lr $AR0, @0x0ce1 - 089f 0081 02ea lri $AR1, #0x02ea - 08a1 0082 0180 lri $AR2, #0x0180 - 08a3 0083 0d08 lri $AR3, #0x0d08 - 08a5 02bf 0c21 call 0c21_Unknown() - 08a7 00f8 0301 sr @0x0301, $AX0.L - 08a9 02df ret - - 08aa 00c0 0ce1 lr $AR0, @0x0ce1 - 08ac 0081 02ea lri $AR1, #0x02ea - 08ae 0082 0180 lri $AR2, #0x0180 - 08b0 0083 0d08 lri $AR3, #0x0d08 - 08b2 02bf 0c21 call 0c21_Unknown() - 08b4 00f8 0301 sr @0x0301, $AX0.L - 08b6 029f 0820 jmp 0x0820 - 08b8 00c0 0ce1 lr $AR0, @0x0ce1 - 08ba 0081 02ea lri $AR1, #0x02ea - 08bc 0082 0180 lri $AR2, #0x0180 - 08be 0083 0d08 lri $AR3, #0x0d08 - 08c0 02bf 0c21 call 0c21_Unknown() - 08c2 00f8 0301 sr @0x0301, $AX0.L - 08c4 029f 082c jmp 0x082c - 08c6 00c0 0ce1 lr $AR0, @0x0ce1 - 08c8 0081 02ea lri $AR1, #0x02ea - 08ca 0082 0180 lri $AR2, #0x0180 - 08cc 0083 0d08 lri $AR3, #0x0d08 - 08ce 02bf 0c21 call 0c21_Unknown() - 08d0 00f8 0301 sr @0x0301, $AX0.L - 08d2 029f 0838 jmp 0x0838 - 08d4 00c0 0ce1 lr $AR0, @0x0ce1 - 08d6 0081 02ea lri $AR1, #0x02ea - 08d8 0082 0180 lri $AR2, #0x0180 - 08da 0083 0d08 lri $AR3, #0x0d08 - 08dc 02bf 0c21 call 0c21_Unknown() - 08de 00f8 0301 sr @0x0301, $AX0.L - 08e0 029f 084a jmp 0x084a - 08e2 00c0 0ce2 lr $AR0, @0x0ce2 - 08e4 0081 02de lri $AR1, #0x02de - 08e6 0082 0400 lri $AR2, #0x0400 - 08e8 1c62 mrr $AR3, $AR2 - 08e9 02bf 0bd1 call 0bd1_Unknown() - 08eb 00f8 02fa sr @0x02fa, $AX0.L - 08ed 02df ret - - 08ee 00c0 0ce3 lr $AR0, @0x0ce3 - 08f0 0081 02e0 lri $AR1, #0x02e0 - 08f2 0082 04c0 lri $AR2, #0x04c0 - 08f4 1c62 mrr $AR3, $AR2 - 08f5 02bf 0bd1 call 0bd1_Unknown() - 08f7 00f8 02fe sr @0x02fe, $AX0.L - 08f9 02df ret - - 08fa 00c0 0ce2 lr $AR0, @0x0ce2 - 08fc 0081 02de lri $AR1, #0x02de - 08fe 0082 0400 lri $AR2, #0x0400 - 0900 1c62 mrr $AR3, $AR2 - 0901 00c4 0ce3 lr $IX0, @0x0ce3 - 0903 0085 04c0 lri $IX1, #0x04c0 - 0905 02bf 0beb call 0x0beb - 0907 00f8 02fa sr @0x02fa, $AX0.L - 0909 00fb 02fe sr @0x02fe, $AX1.H - 090b 02df ret - - 090c 00c0 0ce2 lr $AR0, @0x0ce2 - 090e 0081 02de lri $AR1, #0x02de - 0910 0082 0400 lri $AR2, #0x0400 - 0912 0083 0d08 lri $AR3, #0x0d08 - 0914 00c4 0ce3 lr $IX0, @0x0ce3 - 0916 0085 04c0 lri $IX1, #0x04c0 - 0918 02bf 0c51 call 0x0c51 - 091a 00f8 02fa sr @0x02fa, $AX0.L - 091c 00fb 02fe sr @0x02fe, $AX1.H - 091e 02df ret - - 091f 00c0 0ce1 lr $AR0, @0x0ce1 - 0921 0081 02ec lri $AR1, #0x02ec - 0923 0082 0580 lri $AR2, #0x0580 - 0925 1c62 mrr $AR3, $AR2 - 0926 02bf 0bd1 call 0bd1_Unknown() - 0928 00f8 0302 sr @0x0302, $AX0.L - 092a 02df ret - - 092b 00c0 0ce1 lr $AR0, @0x0ce1 - 092d 0081 02ec lri $AR1, #0x02ec - 092f 0082 0580 lri $AR2, #0x0580 - 0931 1c62 mrr $AR3, $AR2 - 0932 02bf 0bd1 call 0bd1_Unknown() - 0934 00f8 0302 sr @0x0302, $AX0.L - 0936 029f 08e2 jmp 0x08e2 - 0938 00c0 0ce1 lr $AR0, @0x0ce1 - 093a 0081 02ec lri $AR1, #0x02ec - 093c 0082 0580 lri $AR2, #0x0580 - 093e 1c62 mrr $AR3, $AR2 - 093f 02bf 0bd1 call 0bd1_Unknown() - 0941 00f8 0302 sr @0x0302, $AX0.L - 0943 029f 08ee jmp 0x08ee - 0945 00c0 0ce1 lr $AR0, @0x0ce1 - 0947 0081 02ec lri $AR1, #0x02ec - 0949 0082 0580 lri $AR2, #0x0580 - 094b 1c62 mrr $AR3, $AR2 - 094c 02bf 0bd1 call 0bd1_Unknown() - 094e 00f8 0302 sr @0x0302, $AX0.L - 0950 029f 08fa jmp 0x08fa - 0952 00c0 0ce1 lr $AR0, @0x0ce1 - 0954 0081 02ec lri $AR1, #0x02ec - 0956 0082 0580 lri $AR2, #0x0580 - 0958 1c62 mrr $AR3, $AR2 - 0959 02bf 0bd1 call 0bd1_Unknown() - 095b 00f8 0302 sr @0x0302, $AX0.L - 095d 029f 090c jmp 0x090c - 095f 00c0 0ce1 lr $AR0, @0x0ce1 - 0961 0081 02ec lri $AR1, #0x02ec - 0963 0082 0580 lri $AR2, #0x0580 - 0965 0083 0d08 lri $AR3, #0x0d08 - 0967 02bf 0c21 call 0c21_Unknown() - 0969 00f8 0302 sr @0x0302, $AX0.L - 096b 02df ret - - 096c 00c0 0ce1 lr $AR0, @0x0ce1 - 096e 0081 02ec lri $AR1, #0x02ec - 0970 0082 0580 lri $AR2, #0x0580 - 0972 0083 0d08 lri $AR3, #0x0d08 - 0974 02bf 0c21 call 0c21_Unknown() - 0976 00f8 0302 sr @0x0302, $AX0.L - 0978 029f 08e2 jmp 0x08e2 - 097a 00c0 0ce1 lr $AR0, @0x0ce1 - 097c 0081 02ec lri $AR1, #0x02ec - 097e 0082 0580 lri $AR2, #0x0580 - 0980 0083 0d08 lri $AR3, #0x0d08 - 0982 02bf 0c21 call 0c21_Unknown() - 0984 00f8 0302 sr @0x0302, $AX0.L - 0986 029f 08ee jmp 0x08ee - 0988 00c0 0ce1 lr $AR0, @0x0ce1 - 098a 0081 02ec lri $AR1, #0x02ec - 098c 0082 0580 lri $AR2, #0x0580 - 098e 0083 0d08 lri $AR3, #0x0d08 - 0990 02bf 0c21 call 0c21_Unknown() - 0992 00f8 0302 sr @0x0302, $AX0.L - 0994 029f 08fa jmp 0x08fa - 0996 00c0 0ce1 lr $AR0, @0x0ce1 - 0998 0081 02ec lri $AR1, #0x02ec - 099a 0082 0580 lri $AR2, #0x0580 - 099c 0083 0d08 lri $AR3, #0x0d08 - 099e 02bf 0c21 call 0c21_Unknown() - 09a0 00f8 0302 sr @0x0302, $AX0.L - 09a2 029f 090c jmp 0x090c - 09a4 00c0 0ce2 lr $AR0, @0x0ce2 - 09a6 0081 02e2 lri $AR1, #0x02e2 - 09a8 0082 0640 lri $AR2, #0x0640 - 09aa 1c62 mrr $AR3, $AR2 - 09ab 02bf 0bd1 call 0bd1_Unknown() - 09ad 00f8 02fb sr @0x02fb, $AX0.L - 09af 02df ret - - 09b0 00c0 0ce3 lr $AR0, @0x0ce3 - 09b2 0081 02e4 lri $AR1, #0x02e4 - 09b4 0082 0700 lri $AR2, #0x0700 - 09b6 1c62 mrr $AR3, $AR2 - 09b7 02bf 0bd1 call 0bd1_Unknown() - 09b9 00f8 02ff sr @0x02ff, $AX0.L - 09bb 02df ret - - 09bc 00c0 0ce2 lr $AR0, @0x0ce2 - 09be 0081 02e2 lri $AR1, #0x02e2 - 09c0 0082 0640 lri $AR2, #0x0640 - 09c2 1c62 mrr $AR3, $AR2 - 09c3 00c4 0ce3 lr $IX0, @0x0ce3 - 09c5 0085 0700 lri $IX1, #0x0700 - 09c7 02bf 0beb call 0x0beb - 09c9 00f8 02fb sr @0x02fb, $AX0.L - 09cb 00fb 02ff sr @0x02ff, $AX1.H - 09cd 02df ret - - 09ce 00c0 0ce2 lr $AR0, @0x0ce2 - 09d0 0081 02e2 lri $AR1, #0x02e2 - 09d2 0082 0640 lri $AR2, #0x0640 - 09d4 0083 0d08 lri $AR3, #0x0d08 - 09d6 00c4 0ce3 lr $IX0, @0x0ce3 - 09d8 0085 0700 lri $IX1, #0x0700 - 09da 02bf 0c51 call 0x0c51 - 09dc 00f8 02fb sr @0x02fb, $AX0.L - 09de 00fb 02ff sr @0x02ff, $AX1.H - 09e0 02df ret - - 09e1 00c0 0ce1 lr $AR0, @0x0ce1 - 09e3 0081 02ee lri $AR1, #0x02ee - 09e5 0082 07c0 lri $AR2, #0x07c0 - 09e7 1c62 mrr $AR3, $AR2 - 09e8 02bf 0bd1 call 0bd1_Unknown() - 09ea 00f8 0303 sr @0x0303, $AX0.L - 09ec 02df ret - - 09ed 00c0 0ce1 lr $AR0, @0x0ce1 - 09ef 0081 02ee lri $AR1, #0x02ee - 09f1 0082 07c0 lri $AR2, #0x07c0 - 09f3 1c62 mrr $AR3, $AR2 - 09f4 02bf 0bd1 call 0bd1_Unknown() - 09f6 00f8 0303 sr @0x0303, $AX0.L - 09f8 029f 09a4 jmp 0x09a4 - 09fa 00c0 0ce1 lr $AR0, @0x0ce1 - 09fc 0081 02ee lri $AR1, #0x02ee - 09fe 0082 07c0 lri $AR2, #0x07c0 - 0a00 1c62 mrr $AR3, $AR2 - 0a01 02bf 0bd1 call 0bd1_Unknown() - 0a03 00f8 0303 sr @0x0303, $AX0.L - 0a05 029f 09b0 jmp 0x09b0 - 0a07 00c0 0ce1 lr $AR0, @0x0ce1 - 0a09 0081 02ee lri $AR1, #0x02ee - 0a0b 0082 07c0 lri $AR2, #0x07c0 - 0a0d 1c62 mrr $AR3, $AR2 - 0a0e 02bf 0bd1 call 0bd1_Unknown() - 0a10 00f8 0303 sr @0x0303, $AX0.L - 0a12 029f 09bc jmp 0x09bc - 0a14 00c0 0ce1 lr $AR0, @0x0ce1 - 0a16 0081 02ee lri $AR1, #0x02ee - 0a18 0082 07c0 lri $AR2, #0x07c0 - 0a1a 1c62 mrr $AR3, $AR2 - 0a1b 02bf 0bd1 call 0bd1_Unknown() - 0a1d 00f8 0303 sr @0x0303, $AX0.L - 0a1f 029f 09ce jmp 0x09ce - 0a21 00c0 0ce1 lr $AR0, @0x0ce1 - 0a23 0081 02ee lri $AR1, #0x02ee - 0a25 0082 07c0 lri $AR2, #0x07c0 - 0a27 0083 0d08 lri $AR3, #0x0d08 - 0a29 02bf 0c21 call 0c21_Unknown() - 0a2b 00f8 0303 sr @0x0303, $AX0.L - 0a2d 02df ret - - 0a2e 00c0 0ce1 lr $AR0, @0x0ce1 - 0a30 0081 02ee lri $AR1, #0x02ee - 0a32 0082 07c0 lri $AR2, #0x07c0 - 0a34 0083 0d08 lri $AR3, #0x0d08 - 0a36 02bf 0c21 call 0c21_Unknown() - 0a38 00f8 0303 sr @0x0303, $AX0.L - 0a3a 029f 09a4 jmp 0x09a4 - 0a3c 00c0 0ce1 lr $AR0, @0x0ce1 - 0a3e 0081 02ee lri $AR1, #0x02ee - 0a40 0082 07c0 lri $AR2, #0x07c0 - 0a42 0083 0d08 lri $AR3, #0x0d08 - 0a44 02bf 0c21 call 0c21_Unknown() - 0a46 00f8 0303 sr @0x0303, $AX0.L - 0a48 029f 09b0 jmp 0x09b0 - 0a4a 00c0 0ce1 lr $AR0, @0x0ce1 - 0a4c 0081 02ee lri $AR1, #0x02ee - 0a4e 0082 07c0 lri $AR2, #0x07c0 - 0a50 0083 0d08 lri $AR3, #0x0d08 - 0a52 02bf 0c21 call 0c21_Unknown() - 0a54 00f8 0303 sr @0x0303, $AX0.L - 0a56 029f 09bc jmp 0x09bc - 0a58 00c0 0ce1 lr $AR0, @0x0ce1 - 0a5a 0081 02ee lri $AR1, #0x02ee - 0a5c 0082 07c0 lri $AR2, #0x07c0 - 0a5e 0083 0d08 lri $AR3, #0x0d08 - 0a60 02bf 0c21 call 0c21_Unknown() - 0a62 00f8 0303 sr @0x0303, $AX0.L - 0a64 029f 09ce jmp 0x09ce - 0a66 00c0 0ce2 lr $AR0, @0x0ce2 - 0a68 0081 02e6 lri $AR1, #0x02e6 - 0a6a 0082 0880 lri $AR2, #0x0880 - 0a6c 1c62 mrr $AR3, $AR2 - 0a6d 02bf 0bd1 call 0bd1_Unknown() - 0a6f 00f8 02fc sr @0x02fc, $AX0.L - 0a71 02df ret - - 0a72 00c0 0ce3 lr $AR0, @0x0ce3 - 0a74 0081 02e8 lri $AR1, #0x02e8 - 0a76 0082 0940 lri $AR2, #0x0940 - 0a78 1c62 mrr $AR3, $AR2 - 0a79 02bf 0bd1 call 0bd1_Unknown() - 0a7b 00f8 0300 sr @0x0300, $AX0.L - 0a7d 02df ret - - 0a7e 00c0 0ce2 lr $AR0, @0x0ce2 - 0a80 0081 02e6 lri $AR1, #0x02e6 - 0a82 0082 0880 lri $AR2, #0x0880 - 0a84 1c62 mrr $AR3, $AR2 - 0a85 00c4 0ce3 lr $IX0, @0x0ce3 - 0a87 0085 0940 lri $IX1, #0x0940 - 0a89 02bf 0beb call 0x0beb - 0a8b 00f8 02fc sr @0x02fc, $AX0.L - 0a8d 00fb 0300 sr @0x0300, $AX1.H - 0a8f 02df ret - - 0a90 00c0 0ce2 lr $AR0, @0x0ce2 - 0a92 0081 02e6 lri $AR1, #0x02e6 - 0a94 0082 0880 lri $AR2, #0x0880 - 0a96 0083 0d08 lri $AR3, #0x0d08 - 0a98 00c4 0ce3 lr $IX0, @0x0ce3 - 0a9a 0085 0940 lri $IX1, #0x0940 - 0a9c 02bf 0c51 call 0x0c51 - 0a9e 00f8 02fc sr @0x02fc, $AX0.L - 0aa0 00fb 0300 sr @0x0300, $AX1.H - 0aa2 02df ret - 0aa3 00c0 0ce1 lr $AR0, @0x0ce1 - 0aa5 0081 02f0 lri $AR1, #0x02f0 - 0aa7 0082 0a00 lri $AR2, #0x0a00 - 0aa9 1c62 mrr $AR3, $AR2 - 0aaa 02bf 0bd1 call 0bd1_Unknown() - 0aac 00f8 0304 sr @0x0304, $AX0.L - 0aae 02df ret - - 0aaf 00c0 0ce1 lr $AR0, @0x0ce1 - 0ab1 0081 02f0 lri $AR1, #0x02f0 - 0ab3 0082 0a00 lri $AR2, #0x0a00 - 0ab5 1c62 mrr $AR3, $AR2 - 0ab6 02bf 0bd1 call 0bd1_Unknown() - 0ab8 00f8 0304 sr @0x0304, $AX0.L - 0aba 029f 0a66 jmp 0x0a66 - 0abc 00c0 0ce1 lr $AR0, @0x0ce1 - 0abe 0081 02f0 lri $AR1, #0x02f0 - 0ac0 0082 0a00 lri $AR2, #0x0a00 - 0ac2 1c62 mrr $AR3, $AR2 - 0ac3 02bf 0bd1 call 0bd1_Unknown() - 0ac5 00f8 0304 sr @0x0304, $AX0.L - 0ac7 029f 0a72 jmp 0x0a72 - 0ac9 00c0 0ce1 lr $AR0, @0x0ce1 - 0acb 0081 02f0 lri $AR1, #0x02f0 - 0acd 0082 0a00 lri $AR2, #0x0a00 - 0acf 1c62 mrr $AR3, $AR2 - 0ad0 02bf 0bd1 call 0bd1_Unknown() - 0ad2 00f8 0304 sr @0x0304, $AX0.L - 0ad4 029f 0a7e jmp 0x0a7e - 0ad6 00c0 0ce1 lr $AR0, @0x0ce1 - 0ad8 0081 02f0 lri $AR1, #0x02f0 - 0ada 0082 0a00 lri $AR2, #0x0a00 - 0adc 1c62 mrr $AR3, $AR2 - 0add 02bf 0bd1 call 0bd1_Unknown() - 0adf 00f8 0304 sr @0x0304, $AX0.L - 0ae1 029f 0a90 jmp 0x0a90 - 0ae3 00c0 0ce1 lr $AR0, @0x0ce1 - 0ae5 0081 02f0 lri $AR1, #0x02f0 - 0ae7 0082 0a00 lri $AR2, #0x0a00 - 0ae9 0083 0d08 lri $AR3, #0x0d08 - 0aeb 02bf 0c21 call 0c21_Unknown() - 0aed 00f8 0304 sr @0x0304, $AX0.L - 0aef 02df ret - - 0af0 00c0 0ce1 lr $AR0, @0x0ce1 - 0af2 0081 02f0 lri $AR1, #0x02f0 - 0af4 0082 0a00 lri $AR2, #0x0a00 - 0af6 0083 0d08 lri $AR3, #0x0d08 - 0af8 02bf 0c21 call 0c21_Unknown() - 0afa 00f8 0304 sr @0x0304, $AX0.L - 0afc 029f 0a66 jmp 0x0a66 - 0afe 00c0 0ce1 lr $AR0, @0x0ce1 - 0b00 0081 02f0 lri $AR1, #0x02f0 - 0b02 0082 0a00 lri $AR2, #0x0a00 - 0b04 0083 0d08 lri $AR3, #0x0d08 - 0b06 02bf 0c21 call 0c21_Unknown() - 0b08 00f8 0304 sr @0x0304, $AX0.L - 0b0a 029f 0a72 jmp 0x0a72 - 0b0c 00c0 0ce1 lr $AR0, @0x0ce1 - 0b0e 0081 02f0 lri $AR1, #0x02f0 - 0b10 0082 0a00 lri $AR2, #0x0a00 - 0b12 0083 0d08 lri $AR3, #0x0d08 - 0b14 02bf 0c21 call 0c21_Unknown() - 0b16 00f8 0304 sr @0x0304, $AX0.L - 0b18 029f 0a7e jmp 0x0a7e - 0b1a 00c0 0ce1 lr $AR0, @0x0ce1 - 0b1c 0081 02f0 lri $AR1, #0x02f0 - 0b1e 0082 0a00 lri $AR2, #0x0a00 - 0b20 0083 0d08 lri $AR3, #0x0d08 - 0b22 02bf 0c21 call 0c21_Unknown() - 0b24 00f8 0304 sr @0x0304, $AX0.L - 0b26 029f 0a90 jmp 0x0a90 - 0b28 00c0 0ce1 lr $AR0, @0x0ce1 - 0b2a 0081 02e6 lri $AR1, #0x02e6 - 0b2c 0082 0880 lri $AR2, #0x0880 - 0b2e 1c62 mrr $AR3, $AR2 - 0b2f 02bf 0bd1 call 0bd1_Unknown() - 0b31 00f8 02fc sr @0x02fc, $AX0.L - 0b33 02df ret - - 0b34 00c0 0ce1 lr $AR0, @0x0ce1 - 0b36 0081 02e8 lri $AR1, #0x02e8 - 0b38 0082 0940 lri $AR2, #0x0940 - 0b3a 1c62 mrr $AR3, $AR2 - 0b3b 02bf 0bd1 call 0bd1_Unknown() - 0b3d 00f8 0300 sr @0x0300, $AX0.L - 0b3f 02df ret - - 0b40 00c0 0ce1 lr $AR0, @0x0ce1 - 0b42 0081 02e6 lri $AR1, #0x02e6 - 0b44 0082 0880 lri $AR2, #0x0880 - 0b46 1c62 mrr $AR3, $AR2 - 0b47 00c4 0ce1 lr $IX0, @0x0ce1 - 0b49 0085 0940 lri $IX1, #0x0940 - 0b4b 02bf 0beb call 0x0beb - 0b4d 00f8 02fc sr @0x02fc, $AX0.L - 0b4f 00fb 0300 sr @0x0300, $AX1.H - 0b51 02df ret - -void 0b52_Maybe_Mixer() { - 0b52 00c0 0ce1 lr $AR0, @0x0ce1 - 0b54 0081 02e6 lri $AR1, #0x02e6 - 0b56 0082 0880 lri $AR2, #0x0880 - 0b58 0083 0d08 lri $AR3, #0x0d08 - 0b5a 00c4 0ce1 lr $IX0, @0x0ce1 - 0b5c 0085 0940 lri $IX1, #0x0940 - 0b5e 02bf 0c51 call 0x0c51 - 0b60 00f8 02fc sr @0x02fc, $AX0.L - 0b62 00fb 0300 sr @0x0300, $AX1.H - 0b64 02df ret - 0b65 00c0 0ce1 lr $AR0, @0x0ce1 - 0b67 0081 02f0 lri $AR1, #0x02f0 - 0b69 0082 0a00 lri $AR2, #0x0a00 - 0b6b 1c62 mrr $AR3, $AR2 - 0b6c 02bf 0bd1 call 0bd1_Unknown() - 0b6e 00f8 0304 sr @0x0304, $AX0.L - 0b70 029f 0b28 jmp 0x0b28 - 0b72 00c0 0ce1 lr $AR0, @0x0ce1 - 0b74 0081 02f0 lri $AR1, #0x02f0 - 0b76 0082 0a00 lri $AR2, #0x0a00 - 0b78 1c62 mrr $AR3, $AR2 - 0b79 02bf 0bd1 call 0bd1_Unknown() - 0b7b 00f8 0304 sr @0x0304, $AX0.L - 0b7d 029f 0b34 jmp 0x0b34 - 0b7f 00c0 0ce1 lr $AR0, @0x0ce1 - 0b81 0081 02f0 lri $AR1, #0x02f0 - 0b83 0082 0a00 lri $AR2, #0x0a00 - 0b85 1c62 mrr $AR3, $AR2 - 0b86 02bf 0bd1 call 0bd1_Unknown() - 0b88 00f8 0304 sr @0x0304, $AX0.L - 0b8a 029f 0b40 jmp 0x0b40 - 0b8c 00c0 0ce1 lr $AR0, @0x0ce1 - 0b8e 0081 02f0 lri $AR1, #0x02f0 - 0b90 0082 0a00 lri $AR2, #0x0a00 - 0b92 1c62 mrr $AR3, $AR2 - 0b93 02bf 0bd1 call 0bd1_Unknown() - 0b95 00f8 0304 sr @0x0304, $AX0.L - 0b97 029f 0b52 jmp 0x0b52 - 0b99 00c0 0ce1 lr $AR0, @0x0ce1 - 0b9b 0081 02f0 lri $AR1, #0x02f0 - 0b9d 0082 0a00 lri $AR2, #0x0a00 - 0b9f 0083 0d08 lri $AR3, #0x0d08 - 0ba1 02bf 0c21 call 0c21_Unknown() - 0ba3 00f8 0304 sr @0x0304, $AX0.L - 0ba5 029f 0b28 jmp 0x0b28 - 0ba7 00c0 0ce1 lr $AR0, @0x0ce1 - 0ba9 0081 02f0 lri $AR1, #0x02f0 - 0bab 0082 0a00 lri $AR2, #0x0a00 - 0bad 0083 0d08 lri $AR3, #0x0d08 - 0baf 02bf 0c21 call 0c21_Unknown() - 0bb1 00f8 0304 sr @0x0304, $AX0.L - 0bb3 029f 0b34 jmp 0x0b34 - 0bb5 00c0 0ce1 lr $AR0, @0x0ce1 - 0bb7 0081 02f0 lri $AR1, #0x02f0 - 0bb9 0082 0a00 lri $AR2, #0x0a00 - 0bbb 0083 0d08 lri $AR3, #0x0d08 - 0bbd 02bf 0c21 call 0c21_Unknown() - 0bbf 00f8 0304 sr @0x0304, $AX0.L - 0bc1 029f 0b40 jmp 0x0b40 - 0bc3 00c0 0ce1 lr $AR0, @0x0ce1 - 0bc5 0081 02f0 lri $AR1, #0x02f0 - 0bc7 0082 0a00 lri $AR2, #0x0a00 - 0bc9 0083 0d08 lri $AR3, #0x0d08 - 0bcb 02bf 0c21 call 0c21_Unknown() - 0bcd 00f8 0304 sr @0x0304, $AX0.L - 0bcf 029f 0b52 jmp 0x0b52 -} - -// Volume -// AR0: factor table? -// AR1: factor -// AR2: input -// AR3: output -// returns: last in AX0.L (16 highest bits) -// -// basically: -// for (i = 0; i < 96; i++) -// out[i] = ((in[i*2+1] << 16) + (ar0[i] * factor)) >> 16; -// -// so that you don't bang your head against your keyboard trying to figure -// out those awful pipelined loops (I had to get myself a new head to finish -// this one). :P -// -void 0bd1_ApplyVolume1() { - 0bd1 191a lrri $AX0.H, @$AR0 // ax0.h = mem[ar0++] - 0bd2 1939 lrri $AX1.L, @$AR1 // ax1.l = mem[ar1++] - 0bd3 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 // = ax0.h * ax1.l; ac0.m = mem[ar2++] - 0bd4 195c lrri $AC0.L, @$AR2 // ac0.l = mem[ar2++] - 0bd5 f07a lsl16'l $ACC0 : $AC1.M, @$AR2 // acc0 <<= 16; ac1.m = mem[ar2++] - 0bd6 191a lrri $AX0.H, @$AR0 // ax0.h = mem[ar0++] - 0bd7 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 // acc0 += ; = ax0.h * ax1.l; ac1.l = mem[ar2++] - 0bd8 9100 asr16 $ACC0 // acc0 >>= 16 - 0bd9 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M // acc1 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac0.m - 0bda 112f 0be3 bloopi #0x2f, 0x0be3 // for (i = 0; i < 0x2f; i++) - 0bdc b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L // acc1 += ; = ax0.h * ax1.l; mem[ar3++] = ac0.l; - 0bdd 9972 asr16'l $ACC1 : $AC0.M, @$AR2 // acc1 >>= 16; ac0.m = mem[ar2++] - 0bde 195c lrri $AC0.L, @$AR2 // ac0.l = mem[ar2++]; - 0bdf f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M // acc0 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac1.m - 0be0 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L // acc0 += ; = ax0.h * ax1.l; mem[ar3++] = ac1.l; - 0be1 917a asr16'l $ACC0 : $AC1.M, @$AR2 // acc0 >>= 16; ac1.m = mem[ar2++] - 0be2 195d lrri $AC1.L, @$AR2 // ac1.l = mem[ar2++]; - 0be3 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M // acc1 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac0.m - 0be4 1b7c srri @$AR3, $AC0.L // mem[ar3++] = ac0.l; - 0be5 6e00 movp $ACC0 // acc0 = ; - 0be6 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M // acc1 += ; ax0.l = ac0.m; - 0be7 9900 asr16 $ACC1 // acc1 >>= 16; - 0be8 1b7f srri @$AR3, $AC1.M // mem[ar3++] = ac1.m; - 0be9 812b clr's $ACC0 : @$AR3, $AC1.L // acc0 = 0; mem[ar3++] = ac1.l; - 0bea 02df ret -} - - 0beb 191a lrri $AX0.H, @$AR0 - 0bec 1939 lrri $AX1.L, @$AR1 - 0bed b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 - 0bee 195c lrri $AC0.L, @$AR2 - 0bef f07a lsl16'l $ACC0 : $AC1.M, @$AR2 - 0bf0 191a lrri $AX0.H, @$AR0 - 0bf1 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 - 0bf2 9100 asr16 $ACC0 - 0bf3 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0bf4 112f 0bfd bloopi #0x2f, 0x0bfd - 0bf6 b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0bf7 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0bf8 195c lrri $AC0.L, @$AR2 - 0bf9 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0bfa b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0bfb 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0bfc 195d lrri $AC1.L, @$AR2 - 0bfd f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0bfe 1b7c srri @$AR3, $AC0.L - 0bff 6e00 movp $ACC0 - 0c00 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M - 0c01 9909 asr16'ir $ACC1 : $AR1 - 0c02 1b7f srri @$AR3, $AC1.M - 0c03 1b7d srri @$AR3, $AC1.L - 0c04 1c04 mrr $AR0, $IX0 - 0c05 1c45 mrr $AR2, $IX1 - 0c06 1c62 mrr $AR3, $AR2 - 0c07 191a lrri $AX0.H, @$AR0 - 0c08 1939 lrri $AX1.L, @$AR1 - 0c09 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 - 0c0a 195c lrri $AC0.L, @$AR2 - 0c0b f07a lsl16'l $ACC0 : $AC1.M, @$AR2 - 0c0c 191a lrri $AX0.H, @$AR0 - 0c0d b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 - 0c0e 9100 asr16 $ACC0 - 0c0f f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c10 112f 0c19 bloopi #0x2f, 0x0c19 - 0c12 b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0c13 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0c14 195c lrri $AC0.L, @$AR2 - 0c15 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0c16 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0c17 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0c18 195d lrri $AC1.L, @$AR2 - 0c19 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c1a 1b7c srri @$AR3, $AC0.L - 0c1b 6e00 movp $ACC0 - 0c1c 4f1e addp'mv $ACC1 : $AX1.H, $AC0.M - 0c1d 9900 asr16 $ACC1 - 0c1e 1b7f srri @$AR3, $AC1.M - 0c1f 1b7d srri @$AR3, $AC1.L - 0c20 02df ret - -void 0c21_Unknown() { - 0c21 1ce3 mrr $IX3, $AR3 - 0c22 8e00 set16 - 0c23 8100 clr $ACC0 - 0c24 8971 clr'l $ACC1 : $AC0.M, @$AR1 - 0c25 18bf lrrd $AC1.M, @$AR1 - 0c26 1b7e srri @$AR3, $AC0.M - 0c27 4c00 add $ACC0, $ACC1 - 0c28 1b7e srri @$AR3, $AC0.M - 0c29 112f 0c2e bloopi #0x2f, 0x0c2e - 0c2b 4c00 add $ACC0, $ACC1 - 0c2c 1b7e srri @$AR3, $AC0.M - 0c2d 4c00 add $ACC0, $ACC1 - 0c2e 1b7e srri @$AR3, $AC0.M - 0c2f 4c00 add $ACC0, $ACC1 - 0c30 1b3e srri @$AR1, $AC0.M - 0c31 1c27 mrr $AR1, $IX3 - 0c32 1c62 mrr $AR3, $AR2 - 0c33 8f50 set40'l : $AX0.H, @$AR0 - 0c34 1939 lrri $AX1.L, @$AR1 - 0c35 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 - 0c36 195c lrri $AC0.L, @$AR2 - 0c37 f07a lsl16'l $ACC0 : $AC1.M, @$AR2 - 0c38 191a lrri $AX0.H, @$AR0 - 0c39 1939 lrri $AX1.L, @$AR1 - 0c3a b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 - 0c3b 9100 asr16 $ACC0 - 0c3c f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c3d 1939 lrri $AX1.L, @$AR1 - 0c3e 112f 0c49 bloopi #0x2f, 0x0c49 - 0c40 b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0c41 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0c42 195c lrri $AC0.L, @$AR2 - 0c43 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0c44 1939 lrri $AX1.L, @$AR1 - 0c45 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0c46 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0c47 195d lrri $AC1.L, @$AR2 - 0c48 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c49 1939 lrri $AX1.L, @$AR1 - 0c4a 1b7c srri @$AR3, $AC0.L - 0c4b 6e00 movp $ACC0 - 0c4c 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M - 0c4d 9900 asr16 $ACC1 - 0c4e 1b7f srri @$AR3, $AC1.M - 0c4f 1b7d srri @$AR3, $AC1.L - 0c50 02df ret - 0c51 1ce3 mrr $IX3, $AR3 - 0c52 8e00 set16 - 0c53 8100 clr $ACC0 - 0c54 8971 clr'l $ACC1 : $AC0.M, @$AR1 - 0c55 18bf lrrd $AC1.M, @$AR1 - 0c56 1b7e srri @$AR3, $AC0.M - 0c57 4c00 add $ACC0, $ACC1 - 0c58 1b7e srri @$AR3, $AC0.M - 0c59 112f 0c5e bloopi #0x2f, 0x0c5e - 0c5b 4c00 add $ACC0, $ACC1 - 0c5c 1b7e srri @$AR3, $AC0.M - 0c5d 4c00 add $ACC0, $ACC1 - 0c5e 1b7e srri @$AR3, $AC0.M - 0c5f 4c00 add $ACC0, $ACC1 - 0c60 1b3e srri @$AR1, $AC0.M - 0c61 0009 iar $AR1 - 0c62 8100 clr $ACC0 - 0c63 8971 clr'l $ACC1 : $AC0.M, @$AR1 - 0c64 18bf lrrd $AC1.M, @$AR1 - 0c65 1b7e srri @$AR3, $AC0.M - 0c66 4c00 add $ACC0, $ACC1 - 0c67 1b7e srri @$AR3, $AC0.M - 0c68 112f 0c6d bloopi #0x2f, 0x0c6d - 0c6a 4c00 add $ACC0, $ACC1 - 0c6b 1b7e srri @$AR3, $AC0.M - 0c6c 4c00 add $ACC0, $ACC1 - 0c6d 1b7e srri @$AR3, $AC0.M - 0c6e 4c00 add $ACC0, $ACC1 - 0c6f 1b3e srri @$AR1, $AC0.M - 0c70 1c27 mrr $AR1, $IX3 - 0c71 1c62 mrr $AR3, $AR2 - 0c72 8f50 set40'l : $AX0.H, @$AR0 - 0c73 1939 lrri $AX1.L, @$AR1 - 0c74 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 - 0c75 195c lrri $AC0.L, @$AR2 - 0c76 f07a lsl16'l $ACC0 : $AC1.M, @$AR2 - 0c77 191a lrri $AX0.H, @$AR0 - 0c78 1939 lrri $AX1.L, @$AR1 - 0c79 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 - 0c7a 9100 asr16 $ACC0 - 0c7b f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c7c 1939 lrri $AX1.L, @$AR1 - 0c7d 112f 0c88 bloopi #0x2f, 0x0c88 - 0c7f b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0c80 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0c81 195c lrri $AC0.L, @$AR2 - 0c82 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0c83 1939 lrri $AX1.L, @$AR1 - 0c84 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0c85 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0c86 195d lrri $AC1.L, @$AR2 - 0c87 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c88 1939 lrri $AX1.L, @$AR1 - 0c89 1b7c srri @$AR3, $AC0.L - 0c8a 6e00 movp $ACC0 - 0c8b 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M - 0c8c 9905 asr16'dr $ACC1 : $AR1 - 0c8d 1b7f srri @$AR3, $AC1.M - 0c8e 1b7d srri @$AR3, $AC1.L - 0c8f 1c04 mrr $AR0, $IX0 - 0c90 1c45 mrr $AR2, $IX1 - 0c91 1c62 mrr $AR3, $AR2 - 0c92 191a lrri $AX0.H, @$AR0 - 0c93 1939 lrri $AX1.L, @$AR1 - 0c94 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 - 0c95 195c lrri $AC0.L, @$AR2 - 0c96 f07a lsl16'l $ACC0 : $AC1.M, @$AR2 - 0c97 191a lrri $AX0.H, @$AR0 - 0c98 1939 lrri $AX1.L, @$AR1 - 0c99 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 - 0c9a 9100 asr16 $ACC0 - 0c9b f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0c9c 1939 lrri $AX1.L, @$AR1 - 0c9d 112f 0ca8 bloopi #0x2f, 0x0ca8 - 0c9f b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0ca0 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0ca1 195c lrri $AC0.L, @$AR2 - 0ca2 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0ca3 1939 lrri $AX1.L, @$AR1 - 0ca4 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0ca5 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0ca6 195d lrri $AC1.L, @$AR2 - 0ca7 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0ca8 1939 lrri $AX1.L, @$AR1 - 0ca9 1b7c srri @$AR3, $AC0.L - 0caa 6e00 movp $ACC0 - 0cab 4f1e addp'mv $ACC1 : $AX1.H, $AC0.M - 0cac 9900 asr16 $ACC1 - 0cad 1b7f srri @$AR3, $AC1.M - 0cae 1b7d srri @$AR3, $AC1.L - 0caf 02df ret - 0cb0 0098 0000 lri $AX0.L, #0x0000 - 0cb2 02df ret -} - - 0cb3 0080 0cc0 lri $AR0, #0x0cc0 - 0cb5 1c62 mrr $AR3, $AR2 - 0cb6 1939 lrri $AX1.L, @$AR1 - 0cb7 191a lrri $AX0.H, @$AR0 - 0cb8 b000 mulx $AX0.H, $AX1.L - 0cb9 195e lrri $AC0.M, @$AR2 - 0cba 195c lrri $AC0.L, @$AR2 - 0cbb f050 lsl16'l $ACC0 : $AX0.H, @$AR0 - 0cbc b400 mulxac $AX0.H, $AX1.L, $ACC0 - 0cbd 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0cbe 195d lrri $AC1.L, @$AR2 - 0cbf f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0cc0 1108 0cc9 bloopi #0x08, 0x0cc9 - 0cc2 b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0cc3 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0cc4 195c lrri $AC0.L, @$AR2 - 0cc5 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0cc6 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0cc7 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0cc8 195d lrri $AC1.L, @$AR2 - 0cc9 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0cca 4f23 addp's $ACC1 : @$AR3, $AC0.L - 0ccb 9900 asr16 $ACC1 - 0ccc 1b7f srri @$AR3, $AC1.M - 0ccd 6e2b movp's $ACC0 : @$AR3, $AC1.L - 0cce 1f1e mrr $AX0.L, $AC0.M - 0ccf 02df ret - 0cd0 0080 0cc0 lri $AR0, #0x0cc0 - 0cd2 0083 0d08 lri $AR3, #0x0d08 - 0cd4 1ce3 mrr $IX3, $AR3 - 0cd5 8e00 set16 - 0cd6 8100 clr $ACC0 - 0cd7 8971 clr'l $ACC1 : $AC0.M, @$AR1 - 0cd8 18bf lrrd $AC1.M, @$AR1 - 0cd9 1b7e srri @$AR3, $AC0.M - 0cda 4c00 add $ACC0, $ACC1 - 0cdb 1b7e srri @$AR3, $AC0.M - 0cdc 1108 0ce1 bloopi #0x08, 0x0ce1 - 0cde 4c00 add $ACC0, $ACC1 - 0cdf 1b7e srri @$AR3, $AC0.M - 0ce0 4c00 add $ACC0, $ACC1 - 0ce1 1b7e srri @$AR3, $AC0.M - 0ce2 4c00 add $ACC0, $ACC1 - 0ce3 1b3e srri @$AR1, $AC0.M - 0ce4 1c27 mrr $AR1, $IX3 - 0ce5 1c62 mrr $AR3, $AR2 - 0ce6 8f50 set40'l : $AX0.H, @$AR0 - 0ce7 1939 lrri $AX1.L, @$AR1 - 0ce8 b000 mulx $AX0.H, $AX1.L - 0ce9 195e lrri $AC0.M, @$AR2 - 0cea 195c lrri $AC0.L, @$AR2 - 0ceb f050 lsl16'l $ACC0 : $AX0.H, @$AR0 - 0cec 1939 lrri $AX1.L, @$AR1 - 0ced b400 mulxac $AX0.H, $AX1.L, $ACC0 - 0cee 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0cef 195d lrri $AC1.L, @$AR2 - 0cf0 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0cf1 1939 lrri $AX1.L, @$AR1 - 0cf2 1108 0cfd bloopi #0x08, 0x0cfd - 0cf4 b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L - 0cf5 9972 asr16'l $ACC1 : $AC0.M, @$AR2 - 0cf6 195c lrri $AC0.L, @$AR2 - 0cf7 f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M - 0cf8 1939 lrri $AX1.L, @$AR1 - 0cf9 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L - 0cfa 917a asr16'l $ACC0 : $AC1.M, @$AR2 - 0cfb 195d lrri $AC1.L, @$AR2 - 0cfc f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M - 0cfd 1939 lrri $AX1.L, @$AR1 - 0cfe 4f23 addp's $ACC1 : @$AR3, $AC0.L - 0cff 9900 asr16 $ACC1 - 0d00 1b7f srri @$AR3, $AC1.M - 0d01 6e2b movp's $ACC0 : @$AR3, $AC1.L - 0d02 1f1e mrr $AX0.L, $AC0.M - 0d03 02df ret - -// Command jump table - 0d04 008a // 0x0 - ??? - 0d05 0222 // 0x1 - ??? - 0d06 024f // 0x2 - ??? - 0d07 0e83 // 0x3 - ??? - 0d08 027e // 0x4 - set PBs address - 0d09 049b // 0x5 - ??? - 0d0a 04b4 // 0x6 - ??? - 0d0b 04cd // 0x7 - set output buffers - 0d0c 0dbd // 0x8 - ??? - 0d0d 0ddf // 0x9 - ??? - 0d0e 057b // 0xA - set compressor table - 0d0f 060b // 0xB - ??? - 0d10 0ec6 // 0xC - ??? - 0d11 067c // 0xD - ??? - 0d12 0672 // 0xE - The End - -// Table #1 - entry selected by PB[0x007] bits 0-4 - 0d13 081f lris $AX0.L, #0x1f // 0: Do nothing - 0d14 0820 lris $AX0.L, #0x20 - 0d15 082c lris $AX0.L, #0x2c - 0d16 0838 lris $AX0.L, #0x38 - 0d17 084a lris $AX0.L, #0x4a - 0d18 084a lris $AX0.L, #0x4a - 0d19 084a lris $AX0.L, #0x4a - 0d1a 084a lris $AX0.L, #0x4a - 0d1b 085d lris $AX0.L, #0x5d - 0d1c 0869 lris $AX0.L, #0x69 - 0d1d 0876 lris $AX0.L, #0x76 - 0d1e 0883 lris $AX0.L, #0x83 - 0d1f 0890 lris $AX0.L, #0x90 - 0d20 0890 lris $AX0.L, #0x90 - 0d21 0890 lris $AX0.L, #0x90 - 0d22 0890 lris $AX0.L, #0x90 - 0d23 089d lris $AX0.L, #0x9d - 0d24 08aa lris $AX0.L, #0xaa - 0d25 08b8 lris $AX0.L, #0xb8 - 0d26 08c6 lris $AX0.L, #0xc6 - 0d27 08d4 lris $AX0.L, #0xd4 - 0d28 08d4 lris $AX0.L, #0xd4 - 0d29 08d4 lris $AX0.L, #0xd4 - 0d2a 08d4 lris $AX0.L, #0xd4 - 0d2b 089d lris $AX0.L, #0x9d - 0d2c 08aa lris $AX0.L, #0xaa - 0d2d 08b8 lris $AX0.L, #0xb8 - 0d2e 08c6 lris $AX0.L, #0xc6 - 0d2f 08d4 lris $AX0.L, #0xd4 - 0d30 08d4 lris $AX0.L, #0xd4 - 0d31 08d4 lris $AX0.L, #0xd4 - 0d32 08d4 lris $AX0.L, #0xd4 - -// Table #2 - entry selected by PB[0x006] bits 0-4 - 0d33 081f lris $AX0.L, #0x1f // 0: Do nothing - 0d34 08e2 lris $AX0.L, #0xe2 - 0d35 08ee lris $AX0.L, #0xee - 0d36 08fa lris $AX0.L, #0xfa - 0d37 090c lris $AX1.L, #0x0c - 0d38 090c lris $AX1.L, #0x0c - 0d39 090c lris $AX1.L, #0x0c - 0d3a 090c lris $AX1.L, #0x0c - 0d3b 091f lris $AX1.L, #0x1f - 0d3c 092b lris $AX1.L, #0x2b - 0d3d 0938 lris $AX1.L, #0x38 - 0d3e 0945 lris $AX1.L, #0x45 - 0d3f 0952 lris $AX1.L, #0x52 - 0d40 0952 lris $AX1.L, #0x52 - 0d41 0952 lris $AX1.L, #0x52 - 0d42 0952 lris $AX1.L, #0x52 - 0d43 095f lris $AX1.L, #0x5f - 0d44 096c lris $AX1.L, #0x6c - 0d45 097a lris $AX1.L, #0x7a - 0d46 0988 lris $AX1.L, #0x88 - 0d47 0996 lris $AX1.L, #0x96 - 0d48 0996 lris $AX1.L, #0x96 - 0d49 0996 lris $AX1.L, #0x96 - 0d4a 0996 lris $AX1.L, #0x96 - 0d4b 095f lris $AX1.L, #0x5f - 0d4c 096c lris $AX1.L, #0x6c - 0d4d 097a lris $AX1.L, #0x7a - 0d4e 0988 lris $AX1.L, #0x88 - 0d4f 0996 lris $AX1.L, #0x96 - 0d50 0996 lris $AX1.L, #0x96 - 0d51 0996 lris $AX1.L, #0x96 - 0d52 0996 lris $AX1.L, #0x96 - -// Table #3 - entry selected by PB[0x006] bits 5-9 - 0d53 081f lris $AX0.L, #0x1f // 0: Do nothing - 0d54 09a4 lris $AX1.L, #0xa4 - 0d55 09b0 lris $AX1.L, #0xb0 - 0d56 09bc lris $AX1.L, #0xbc - 0d57 09ce lris $AX1.L, #0xce - 0d58 09ce lris $AX1.L, #0xce - 0d59 09ce lris $AX1.L, #0xce - 0d5a 09ce lris $AX1.L, #0xce - 0d5b 09e1 lris $AX1.L, #0xe1 - 0d5c 09ed lris $AX1.L, #0xed - 0d5d 09fa lris $AX1.L, #0xfa - 0d5e 0a07 lris $AX0.H, #0x07 - 0d5f 0a14 lris $AX0.H, #0x14 - 0d60 0a14 lris $AX0.H, #0x14 - 0d61 0a14 lris $AX0.H, #0x14 - 0d62 0a14 lris $AX0.H, #0x14 - 0d63 0a21 lris $AX0.H, #0x21 - 0d64 0a2e lris $AX0.H, #0x2e - 0d65 0a3c lris $AX0.H, #0x3c - 0d66 0a4a lris $AX0.H, #0x4a - 0d67 0a58 lris $AX0.H, #0x58 - 0d68 0a58 lris $AX0.H, #0x58 - 0d69 0a58 lris $AX0.H, #0x58 - 0d6a 0a58 lris $AX0.H, #0x58 - 0d6b 0a21 lris $AX0.H, #0x21 - 0d6c 0a2e lris $AX0.H, #0x2e - 0d6d 0a3c lris $AX0.H, #0x3c - 0d6e 0a4a lris $AX0.H, #0x4a - 0d6f 0a58 lris $AX0.H, #0x58 - 0d70 0a58 lris $AX0.H, #0x58 - 0d71 0a58 lris $AX0.H, #0x58 - 0d72 0a58 lris $AX0.H, #0x58 - -// Table #4 - entry selected by PB[0x006] bits 10-15 -// (twice longer than the three previous ones!) - 0d73 081f lris $AX0.L, #0x1f // 0: Do nothing - 0d74 0a66 lris $AX0.H, #0x66 - 0d75 0a72 lris $AX0.H, #0x72 - 0d76 0a7e lris $AX0.H, #0x7e - 0d77 0a90 lris $AX0.H, #0x90 - 0d78 0a90 lris $AX0.H, #0x90 - 0d79 0a90 lris $AX0.H, #0x90 - 0d7a 0a90 lris $AX0.H, #0x90 - 0d7b 0aa3 lris $AX0.H, #0xa3 - 0d7c 0aaf lris $AX0.H, #0xaf - 0d7d 0abc lris $AX0.H, #0xbc - 0d7e 0ac9 lris $AX0.H, #0xc9 - 0d7f 0ad6 lris $AX0.H, #0xd6 - 0d80 0ad6 lris $AX0.H, #0xd6 - 0d81 0ad6 lris $AX0.H, #0xd6 - 0d82 0ad6 lris $AX0.H, #0xd6 - 0d83 0ae3 lris $AX0.H, #0xe3 - 0d84 0af0 lris $AX0.H, #0xf0 - 0d85 0afe lris $AX0.H, #0xfe - 0d86 0b0c lris $AX1.H, #0x0c - 0d87 0b1a lris $AX1.H, #0x1a - 0d88 0b1a lris $AX1.H, #0x1a - 0d89 0b1a lris $AX1.H, #0x1a - 0d8a 0b1a lris $AX1.H, #0x1a - 0d8b 0ae3 lris $AX0.H, #0xe3 - 0d8c 0af0 lris $AX0.H, #0xf0 - 0d8d 0afe lris $AX0.H, #0xfe - 0d8e 0b0c lris $AX1.H, #0x0c - 0d8f 0b1a lris $AX1.H, #0x1a - 0d90 0b1a lris $AX1.H, #0x1a - 0d91 0b1a lris $AX1.H, #0x1a - 0d92 0b1a lris $AX1.H, #0x1a - 0d93 081f lris $AX0.L, #0x1f - 0d94 0b28 lris $AX1.H, #0x28 - 0d95 0b34 lris $AX1.H, #0x34 - 0d96 0b40 lris $AX1.H, #0x40 - 0d97 0b52 lris $AX1.H, #0x52 - 0d98 0b52 lris $AX1.H, #0x52 - 0d99 0b52 lris $AX1.H, #0x52 - 0d9a 0b52 lris $AX1.H, #0x52 - 0d9b 0aa3 lris $AX0.H, #0xa3 - 0d9c 0b65 lris $AX1.H, #0x65 - 0d9d 0b72 lris $AX1.H, #0x72 - 0d9e 0b7f lris $AX1.H, #0x7f - 0d9f 0b8c lris $AX1.H, #0x8c - 0da0 0b8c lris $AX1.H, #0x8c - 0da1 0b8c lris $AX1.H, #0x8c - 0da2 0b8c lris $AX1.H, #0x8c - 0da3 0ae3 lris $AX0.H, #0xe3 - 0da4 0b99 lris $AX1.H, #0x99 - 0da5 0ba7 lris $AX1.H, #0xa7 - 0da6 0bb5 lris $AX1.H, #0xb5 - 0da7 0bc3 lris $AX1.H, #0xc3 - 0da8 0bc3 lris $AX1.H, #0xc3 - 0da9 0bc3 lris $AX1.H, #0xc3 - 0daa 0bc3 lris $AX1.H, #0xc3 - 0dab 0ae3 lris $AX0.H, #0xe3 - 0dac 0b99 lris $AX1.H, #0x99 - 0dad 0ba7 lris $AX1.H, #0xa7 - 0dae 0bb5 lris $AX1.H, #0xb5 - 0daf 0bc3 lris $AX1.H, #0xc3 - 0db0 0bc3 lris $AX1.H, #0xc3 - 0db1 0bc3 lris $AX1.H, #0xc3 - 0db2 0bc3 lris $AX1.H, #0xc3 - - - 0db3 0cb0 lris $AC0.L, #0xb0 - 0db4 0cb3 lris $AC0.L, #0xb3 - 0db5 0cd0 lris $AC0.L, #0xd0 - 0db6 0cd0 lris $AC0.L, #0xd0 - -// Jump table for sample rate converters - 0db7 071a cmpis $ACC1, #0x1a // none - 0db8 076b cmpis $ACC1, #0x6b // ? - 0db9 07c0 cmpis $ACC1, #0xc0 // linear - -// Table for coef_select -// addresses into COEF ROM - 0dba 1000 loopi #0x00 - 0dbb 1200 sbclr #0x00 - 0dbc 1400 lsl $ACC0, #0 - -void 0dbd_Cmd_8() { - 0dbd 8e00 set16 - 0dbe 00c4 0ce6 lr $IX0, @0x0ce6 - 0dc0 1905 lrri $IX1, @$AR0 - 0dc1 00e5 0ce6 sr @0x0ce6, $IX1 - 0dc3 0086 0400 lri $IX2, #0x0400 - 0dc5 191e lrri $AC0.M, @$AR0 - 0dc6 191c lrri $AC0.L, @$AR0 - 0dc7 2ece srs @DSMAH, $AC0.M - 0dc8 2ccf srs @DSMAL, $AC0.L - 0dc9 16cd 0400 si @DSPA, #0x0400 - 0dcb 16c9 0001 si @DSCR, #0x0001 - 0dcd 16cb 0480 si @DSBL, #0x0480 - 0dcf 02bf 0084 call 0084_WaitForDMACompletion() - 0dd1 191e lrri $AC0.M, @$AR0 - 0dd2 191c lrri $AC0.L, @$AR0 - 0dd3 2ece srs @DSMAH, $AC0.M - 0dd4 2ccf srs @DSMAL, $AC0.L - 0dd5 16cd 0940 si @DSPA, #0x0940 - 0dd7 16c9 0001 si @DSCR, #0x0001 - 0dd9 16cb 0180 si @DSBL, #0x0180 - 0ddb 02bf 0084 call 0084_WaitForDMACompletion() - 0ddd 029f 0e01 jmp 0e01_Unk() -} - -void 0ddf_Cmd_9() { - 0ddf 8e00 set16 - 0de0 00c4 0ce7 lr $IX0, @0x0ce7 - 0de2 1905 lrri $IX1, @$AR0 - 0de3 00e5 0ce7 sr @0x0ce7, $IX1 - 0de5 0086 0640 lri $IX2, #0x0640 - 0de7 191e lrri $AC0.M, @$AR0 - 0de8 191c lrri $AC0.L, @$AR0 - 0de9 2ece srs @DSMAH, $AC0.M - 0dea 2ccf srs @DSMAL, $AC0.L - 0deb 16cd 0640 si @DSPA, #0x0640 - 0ded 16c9 0001 si @DSCR, #0x0001 - 0def 16cb 0480 si @DSBL, #0x0480 - 0df1 02bf 0084 call 0084_WaitForDMACompletion() - 0df3 191e lrri $AC0.M, @$AR0 - 0df4 191c lrri $AC0.L, @$AR0 - 0df5 2ece srs @DSMAH, $AC0.M - 0df6 2ccf srs @DSMAL, $AC0.L - 0df7 16cd 0a00 si @DSPA, #0x0a00 - 0df9 16c9 0001 si @DSCR, #0x0001 - 0dfb 16cb 0180 si @DSBL, #0x0180 - 0dfd 02bf 0084 call 0084_WaitForDMACompletion() - 0dff 029f 0e01 jmp 0e01_Unk() -} - -void 0e01_Unk() { - 0e01 8b00 m0 - 0e02 8100 clr $ACC0 - 0e03 8900 clr $ACC1 - 0e04 1fc4 mrr $AC0.M, $IX0 - 0e05 1fe5 mrr $AC1.M, $IX1 - 0e06 5d00 sub $ACC1, $ACC0 - 0e07 009a 02ab lri $AX0.H, #0x02ab - 0e09 009b 02aa lri $AX1.H, #0x02aa - 0e0b 0081 0d08 lri $AR1, #0x0d08 - 0e0d d000 mulc $AC1.M, $AX0.H - 0e0e d400 mulcac $AC1.M, $AX0.H, $ACC0 - 0e0f 111f 0e13 bloopi #0x1f, 0x0e13 - 0e11 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e12 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e13 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e14 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e15 4e31 addp's $ACC0 : @$AR1, $AC0.M - 0e16 1b25 srri @$AR1, $IX1 - 0e17 191e lrri $AC0.M, @$AR0 - 0e18 191c lrri $AC0.L, @$AR0 - 0e19 2ece srs @DSMAH, $AC0.M - 0e1a 2ccf srs @DSMAL, $AC0.L - 0e1b 00e6 ffcd sr @DSPA, $IX2 - 0e1d 16c9 0000 si @DSCR, #0x0000 - 0e1f 16cb 0180 si @DSBL, #0x0180 - 0e21 0081 0000 lri $AR1, #0x0000 - 0e23 1c41 mrr $AR2, $AR1 - 0e24 02bf 0084 call 0084_WaitForDMACompletion() - 0e26 02bf 0e57 call 0x0e57 - 0e28 191e lrri $AC0.M, @$AR0 - 0e29 191c lrri $AC0.L, @$AR0 - 0e2a 2ece srs @DSMAH, $AC0.M - 0e2b 2ccf srs @DSMAL, $AC0.L - 0e2c 00e6 ffcd sr @DSPA, $IX2 - 0e2e 16c9 0000 si @DSCR, #0x0000 - 0e30 16cb 0180 si @DSBL, #0x0180 - 0e32 02bf 0084 call 0084_WaitForDMACompletion() - 0e34 02bf 0e57 call 0x0e57 - 0e36 191e lrri $AC0.M, @$AR0 - 0e37 191c lrri $AC0.L, @$AR0 - 0e38 2ece srs @DSMAH, $AC0.M - 0e39 2ccf srs @DSMAL, $AC0.L - 0e3a 00e6 ffcd sr @DSPA, $IX2 - 0e3c 16c9 0000 si @DSCR, #0x0000 - 0e3e 16cb 0180 si @DSBL, #0x0180 - 0e40 02bf 0084 call 0084_WaitForDMACompletion() - 0e42 02bf 0e57 call 0x0e57 - 0e44 191e lrri $AC0.M, @$AR0 - 0e45 191c lrri $AC0.L, @$AR0 - 0e46 2ece srs @DSMAH, $AC0.M - 0e47 2ccf srs @DSMAL, $AC0.L - 0e48 00e6 ffcd sr @DSPA, $IX2 - 0e4a 16c9 0000 si @DSCR, #0x0000 - 0e4c 16cb 0180 si @DSBL, #0x0180 - 0e4e 0081 0880 lri $AR1, #0x0880 - 0e50 1c41 mrr $AR2, $AR1 - 0e51 02bf 0084 call 0084_WaitForDMACompletion() - 0e53 02bf 0e57 call 0x0e57 - 0e55 029f 006f jmp 006f_MailHandler() -} - - 0e57 8f00 set40 - 0e58 8d00 set15 - 0e59 8a00 m2 - 0e5a 00e0 0cd2 sr @0x0cd2, $AR0 - 0e5c 0080 0d08 lri $AR0, #0x0d08 - 0e5e 1c66 mrr $AR3, $IX2 - 0e5f 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0e60 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e61 a000 mulx $AX0.L, $AX1.L - 0e62 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0e63 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0e64 4e00 addp $ACC0 - 0e65 4800 addax $ACC0, $AX0.L - 0e66 112f 0e75 bloopi #0x2f, 0x0e75 - 0e68 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0e69 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e6a a000 mulx $AX0.L, $AX1.L - 0e6b af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0e6c 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0e6d 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0e6e 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0e6f 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0e70 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e71 a000 mulx $AX0.L, $AX1.L - 0e72 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0e73 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0e74 4e3a addp's $ACC0 : @$AR2, $AC1.M - 0e75 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 0e76 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0e77 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e78 a000 mulx $AX0.L, $AX1.L - 0e79 af00 mulxmv $AX0.L, $AX1.H, $ACC1 - 0e7a 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0e7b 4f32 addp's $ACC1 : @$AR2, $AC0.M - 0e7c 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0e7d 1b5f srri @$AR2, $AC1.M - 0e7e 1b5d srri @$AR2, $AC1.L - 0e7f 00c0 0cd2 lr $AR0, @0x0cd2 - 0e81 8e00 set16 - 0e82 02df ret - -void 0e83_Cmd_3() { - 0e83 8e00 set16 - 0e84 191f lrri $AC1.M, @$AR0 - 0e85 191d lrri $AC1.L, @$AR0 - 0e86 2fce srs @DSMAH, $AC1.M - 0e87 2dcf srs @DSMAL, $AC1.L - 0e88 16cd 0d08 si @DSPA, #0x0d08 - 0e8a 16c9 0000 si @DSCR, #0x0000 - 0e8c 16cb 0300 si @DSBL, #0x0300 - 0e8e 02bf 0084 call 0084_WaitForDMACompletion() - 0e90 1c80 mrr $IX0, $AR0 - 0e91 8f00 set40 - 0e92 0080 0d08 lri $AR0, #0x0d08 - 0e94 0083 0000 lri $AR3, #0x0000 - 0e96 1c43 mrr $AR2, $AR3 - 0e97 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0e98 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e99 6a00 movax $ACC0, $AX1.L - 0e9a 4800 addax $ACC0, $AX0.L - 0e9b 112f 0ea4 bloopi #0x2f, 0x0ea4 - 0e9d 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0e9e 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0e9f 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0ea0 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0ea1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0ea2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0ea3 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 0ea4 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 0ea5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0ea6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0ea7 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0ea8 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0ea9 1b5f srri @$AR2, $AC1.M - 0eaa 1b5d srri @$AR2, $AC1.L - 0eab 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0eac 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0ead 6800 movax $ACC0, $AX0.L - 0eae 7c00 neg $ACC0 - 0eaf 4a00 addax $ACC0, $AX1.L - 0eb0 112f 0ebb bloopi #0x2f, 0x0ebb - 0eb2 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0eb3 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0eb4 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0eb5 7d00 neg $ACC1 - 0eb6 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0eb7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0eb8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0eb9 683a movax's $ACC0, $AX0.L : @$AR2, $AC1.M - 0eba 7c00 neg $ACC0 - 0ebb 4a2a addax's $ACC0, $AX1.L : @$AR2, $AC1.L - 0ebc 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0ebd 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0ebe 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0ebf 7d00 neg $ACC1 - 0ec0 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0ec1 1b5f srri @$AR2, $AC1.M - 0ec2 1b5d srri @$AR2, $AC1.L - 0ec3 1c04 mrr $AR0, $IX0 - 0ec4 029f 006f jmp 006f_MailHandler() -} - -void 0ec6_Cmd_C() { - 0ec6 8e48 set16'l : $AX1.L, @$AR0 - 0ec7 8b78 m0'l : $AC1.M, @$AR0 - 0ec8 8168 clr'l $ACC0 : $AC1.L, @$AR0 - 0ec9 00e0 0cd2 sr @0x0cd2, $AR0 - 0ecb 2fce srs @DSMAH, $AC1.M - 0ecc 2dcf srs @DSMAL, $AC1.L - 0ecd 16cd 0180 si @DSPA, #0x0180 - 0ecf 16c9 0001 si @DSCR, #0x0001 - 0ed1 16cb 0180 si @DSBL, #0x0180 - 0ed3 02bf 0084 call 0084_WaitForDMACompletion() - 0ed5 8100 clr $ACC0 - 0ed6 009c 0180 lri $AC0.L, #0x0180 - 0ed8 4d00 add $ACC1, $ACC0 - 0ed9 2fce srs @DSMAH, $AC1.M - 0eda 2dcf srs @DSMAL, $AC1.L - 0edb 16cd 0880 si @DSPA, #0x0880 - 0edd 16c9 0001 si @DSCR, #0x0001 - 0edf 16cb 0180 si @DSBL, #0x0180 - 0ee1 8100 clr $ACC0 - 0ee2 8900 clr $ACC1 - 0ee3 00de 0ce5 lr $AC0.M, @0x0ce5 - 0ee5 1ff9 mrr $AC1.M, $AX1.L - 0ee6 5d00 sub $ACC1, $ACC0 - 0ee7 00f9 0ce5 sr @0x0ce5, $AX1.L - 0ee9 009a 02ab lri $AX0.H, #0x02ab - 0eeb 009b 02aa lri $AX1.H, #0x02aa - 0eed 0081 0d08 lri $AR1, #0x0d08 - 0eef d000 mulc $AC1.M, $AX0.H - 0ef0 d400 mulcac $AC1.M, $AX0.H, $ACC0 - 0ef1 111f 0ef5 bloopi #0x1f, 0x0ef5 - 0ef3 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ef4 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0ef5 d431 mulcac's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0ef6 dc31 mulcac's $AC1.M, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ef7 4e31 addp's $ACC0 : @$AR1, $AC0.M - 0ef8 1b39 srri @$AR1, $AX1.L - 0ef9 02bf 0084 call 0084_WaitForDMACompletion() - 0efb 8f00 set40 - 0efc 8d00 set15 - 0efd 8a00 m2 - 0efe 0080 0d08 lri $AR0, #0x0d08 - 0f00 0081 0400 lri $AR1, #0x0400 - 0f02 0083 0000 lri $AR3, #0x0000 - 0f04 0082 00c0 lri $AR2, #0x00c0 - 0f06 1918 lrri $AX0.L, @$AR0 - 0f07 195b lrri $AX1.H, @$AR2 - 0f08 1959 lrri $AX1.L, @$AR2 - 0f09 a000 mulx $AX0.L, $AX1.L - 0f0a ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0f0b 9100 asr16 $ACC0 - 0f0c 4e5b addp'l $ACC0 : $AX1.H, @$AR3 - 0f0d f04b lsl16'l $ACC0 : $AX1.L, @$AR3 - 0f0e 115f 0f19 bloopi #0x5f, 0x0f19 - 0f10 a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 0f11 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0f12 9140 asr16'l $ACC0 : $AX0.L, @$AR0 - 0f13 4e5a addp'l $ACC0 : $AX1.H, @$AR2 - 0f14 f04a lsl16'l $ACC0 : $AX1.L, @$AR2 - 0f15 a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 0f16 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0f17 9100 asr16 $ACC0 - 0f18 4e5b addp'l $ACC0 : $AX1.H, @$AR3 - 0f19 f04b lsl16'l $ACC0 : $AX1.L, @$AR3 - 0f1a a031 mulx's $AX0.L, $AX1.L : @$AR1, $AC0.M - 0f1b ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0f1c 9100 asr16 $ACC0 - 0f1d 4e00 addp $ACC0 - 0f1e f000 lsl16 $ACC0 - 0f1f 1b3e srri @$AR1, $AC0.M - 0f20 8e00 set16 - 0f21 00c0 0cd2 lr $AR0, @0x0cd2 - 0f23 191e lrri $AC0.M, @$AR0 - 0f24 191c lrri $AC0.L, @$AR0 - 0f25 2ece srs @DSMAH, $AC0.M - 0f26 2ccf srs @DSMAL, $AC0.L - 0f27 16cd 0400 si @DSPA, #0x0400 - 0f29 16c9 0001 si @DSCR, #0x0001 - 0f2b 16cb 0180 si @DSBL, #0x0180 - 0f2d 02bf 0084 call 0084_WaitForDMACompletion() - 0f2f 16fc dcd1 si @DMBH, #0xdcd1 <-------------- !!! - 0f31 16fd 0004 si @DMBL, #0x0004 <-------------- !!! - 0f33 16fb 0001 si @DIRQ, #0x0001 <-------------- !!! - 0f35 26fc lrs $AC0.M, @DMBH - 0f36 02a0 8000 andf $AC0.M, #0x8000 - 0f38 029c 0f35 jlnz 0x0f35 - 0f3a 029f 006f jmp 006f_MailHandler() -} - -void 0f3c_Int1_Handler() { - 0f3c 8e00 set16 - 0f3d 1fcc mrr $AC0.M, $ST0 - 0f3e 1d9e mrr $ST0, $AC0.M - 0f3f 16fc ecc0 si @DMBH, #0xecc0 - 0f41 2efd srs @DMBL, $AC0.M - 0f42 26fc lrs $AC0.M, @DMBH - 0f43 02a0 8000 andf $AC0.M, #0x8000 - 0f45 029c 0f42 jlnz 0x0f42 - 0f47 02ff rti -} - -void 0f48_Int2_Handler() { - 0f48 0000 nop - 0f49 0000 nop - 0f4a 0000 nop - 0f4b 0000 nop - 0f4c 02ff rti -} - -void 0f4d_Int3_Handler() { - 0f4d 8e00 set16 - 0f4e 1dbc mrr $ST1, $AC0.L - 0f4f 1dbe mrr $ST1, $AC0.M - 0f50 8100 clr $ACC0 - 0f51 00de 0307 lr $AC0.M, @0x0307 - 0f53 0601 cmpis $ACC0, #0x01 - 0f54 0295 0f59 jz 0x0f59 - 0f56 0e00 lris $AC0.M, #0x00 - 0f57 00fe 02d8 sr @0x02d8, $AC0.M - 0f59 1fcd mrr $AC0.M, $ST1 - 0f5a 1f8d mrr $AC0.L, $ST1 - 0f5b 02ff rti -} - -void 0f5c_Int4_Handler() { - 0f5c 0000 nop - 0f5d 0000 nop - 0f5e 0000 nop - 0f5f 0000 nop - 0f60 02ff rti -} - -// Handles ACCOV exception -// ACCOV exception will be triggered when a sound being played -// reaches end and needs to be reloaded or stopped. -// -void 0f61_Int5_Handler() -{ - 0f61 8e00 set16 - 0f62 1dbc mrr $ST1, $AC0.L - 0f63 1dbe mrr $ST1, $AC0.M - 0f64 8100 clr $ACC0 - 0f65 00de 0307 lr $AC0.M, @0x0307 - 0f67 0601 cmpis $ACC0, #0x01 - 0f68 0295 0f72 jz 0x0f72 // if (mem16[0x0307] == 1) handle looping; - 0f6a 0e00 lris $AC0.M, #0x00 - 0f6b 00fe 02d8 sr @0x02d8, $AC0.M // else stop the sound; - 0f6d 0082 0ce9 lri $AR2, #0x0ce9 - 0f6f 1fcd mrr $AC0.M, $ST1 - 0f70 1f8d mrr $AC0.L, $ST1 - 0f71 02ff rti - - // Looping handling - 0f72 00de 02d9 lr $AC0.M, @0x02d9 - 0f74 0601 cmpis $ACC0, #0x01 - 0f75 0295 0f83 jz 0x0f83 // if (mem16[0x02D9] == 1) handle stream; - // reload pred scale, yn1 and yn2 from the PB - // the address will be automatically reloaded by the accelerator - 0f77 00de 032a lr $AC0.M, @0x032a - 0f79 2eda srs @pred_scale, $AC0.M - 0f7a 00de 032b lr $AC0.M, @0x032b - 0f7c 2edb srs @yn1, $AC0.M - 0f7d 00de 032c lr $AC0.M, @0x032c - 0f7f 2edc srs @yn2, $AC0.M - 0f80 1fcd mrr $AC0.M, $ST1 - 0f81 1f8d mrr $AC0.L, $ST1 - 0f82 02ff rti - - // Stream handling - // reload pred_scale from the PB - 0f83 00de 032a lr $AC0.M, @0x032a - 0f85 2eda srs @pred_scale, $AC0.M - // ??? - reload the yn1 and yn2 from... themselves - 0f86 26db lrs $AC0.M, @yn1 - 0f87 2edb srs @yn1, $AC0.M - 0f88 26dc lrs $AC0.M, @yn2 - 0f89 2edc srs @yn2, $AC0.M - 0f8a 1fcd mrr $AC0.M, $ST1 - 0f8b 1f8d mrr $AC0.L, $ST1 - 0f8c 02ff rti -} - -void 0f8d_Int6_Handler() { - 0f8d 0000 nop - 0f8e 0000 nop - 0f8f 0000 nop - 0f90 0000 nop - 0f91 02ff rti -} - -void 0f92_Int7_Handler() { - 0f92 0000 nop - 0f93 0000 nop - 0f94 0000 nop - 0f95 0000 nop - 0f96 02ff rti -} - -// action jump table - 0f97 0fa9 // Action 0 - restart - 0f98 0fac // Action 1 - dump DRAM and jump into iROM where new IRAM and DRAM can be uploaded - 0f99 0fe4 // Action 2 - soft reset - 0f9a 0fe7 // Action 3 - jump back to main loop - -// called at AXList end; wait for a last mail and take an action -// Note: the same thing can be found in Zelda ucode. It's called after DsyncFrame. -// Probably debugging stuff. -{ - 0f9b 8e00 set16 - 0f9c 8100 clr $ACC0 - 0f9d 8900 clr $ACC1 - 0f9e 02bf 0fea call 0x0fea // wait for the mail; the high part is likely 0xCDD1 as for Zelda - 0fa0 27ff lrs $AC1.M, @CMBL // the low part of the mail tells the action to take - 0fa1 009e 0f97 lri $AC0.M, #0x0f97 - 0fa3 4c00 add $ACC0, $ACC1 - 0fa4 1c7e mrr $AR3, $AC0.M - 0fa5 0313 ilrr $AC1.M, @$AR3 - 0fa6 1c7f mrr $AR3, $AC1.M - 0fa7 176f jmpr $AR3 // take the action! - 0fa8 0021 halt -} - -//ACTION 0 (0xCDD10000) -{ - 0fa9 029f 0037 jmp 0037_Unk_Restart() - 0fab 0021 halt -} - -//ACTION 1 (0xCDD10001) -{ - 0fac 8100 clr $ACC0 - 0fad 8900 clr $ACC1 - 0fae 02bf 0fea call 0x0fea - 0fb0 24ff lrs $AC0.L, @CMBL - 0fb1 02bf 0ff0 call 0x0ff0 - 0fb3 25ff lrs $AC1.L, @CMBL - 0fb4 02bf 0ff0 call 0x0ff0 - 0fb6 27ff lrs $AC1.M, @CMBL - 0fb7 2ece srs @DSMAH, $AC0.M - 0fb8 2ccf srs @DSMAL, $AC0.L - 0fb9 16c9 0001 si @DSCR, #0x0001 // DMEM->CPU - 0fbb 2fcd srs @DSPA, $AC1.M - 0fbc 2dcb srs @DSBL, $AC1.L - 0fbd 8100 clr $ACC0 - 0fbe 8900 clr $ACC1 - 0fbf 02bf 0fea call 0x0fea -//prepare addr-s/length/dsp-PC for new IRAM/DRAM - 0fc1 24ff lrs $AC0.L, @CMBL - 0fc2 1c9e mrr $IX0, $AC0.M - 0fc3 1cbc mrr $IX1, $AC0.L - 0fc4 02bf 0ff0 call 0x0ff0 - 0fc6 25ff lrs $AC1.L, @CMBL - 0fc7 02bf 0ff0 call 0x0ff0 - 0fc9 27ff lrs $AC1.M, @CMBL - 0fca 1cdf mrr $IX2, $AC1.M - 0fcb 1cfd mrr $IX3, $AC1.L - 0fcc 8100 clr $ACC0 - 0fcd 02bf 0fea call 0x0fea - 0fcf 26ff lrs $AC0.M, @CMBL - 0fd0 1c1e mrr $AR0, $AC0.M - 0fd1 8900 clr $ACC1 - 0fd2 02bf 0ff0 call 0x0ff0 - 0fd4 20ff lrs $AX0.L, @CMBL - 0fd5 1f5f mrr $AX0.H, $AC1.M - 0fd6 02bf 0fea call 0x0fea - 0fd8 21ff lrs $AX1.L, @CMBL - 0fd9 02bf 0fea call 0x0fea - 0fdb 23ff lrs $AX1.H, @CMBL -// - 0fdc 26c9 lrs $AC0.M, @DSCR - 0fdd 02a0 0004 andf $AC0.M, #0x0004 - 0fdf 029c 0fdc jlnz 0x0fdc - 0fe1 029f 80b5 jmp 0x80b5 // 80b5_BootUcode() - 0fe3 0021 halt -} - -//ACTION 2 (0xCDD10002) -{ - 0fe4 029f 8000 jmp 0x8000 - 0fe6 0021 halt -} - -//ACTION 3 (0xCDD10003) -{ - 0fe7 029f 004c jmp 0x004c - 0fe9 0021 halt -} - -{ - 0fea 26fe lrs $AC0.M, @CMBH - 0feb 02c0 8000 andcf $AC0.M, #0x8000 - 0fed 029c 0fea jlnz 0x0fea - 0fef 02df ret -} - -{ - 0ff0 27fe lrs $AC1.M, @CMBH - 0ff1 03c0 8000 andcf $AC1.M, #0x8000 - 0ff3 029c 0ff0 jlnz 0x0ff0 - 0ff5 02df ret -} - - 0ff6 0000 nop - 0ff7 0000 nop - 0ff8 0000 nop - 0ff9 0000 nop - 0ffa 0000 nop - 0ffb 0000 nop - 0ffc 0000 nop - 0ffd 0000 nop - 0ffe 0000 nop - 0fff 0000 nop diff --git a/docs/DSP/DSP_UC_AX_DD7E72D5.txt b/docs/DSP/DSP_UC_AX_DD7E72D5.txt deleted file mode 100644 index d985232bb7..0000000000 --- a/docs/DSP/DSP_UC_AX_DD7E72D5.txt +++ /dev/null @@ -1,3467 +0,0 @@ -// This document was previously called "DSP_UC_AX1.txt" and "Crazy Taxi.txt" -// CR is set to #FF all the time in this ucode, so srs/lrs always operate on hw registers. - -////////////////////////////////////////////////////////////////////////// -// Known addresses in DRAM -Addr Name Description/Notes - -// Buffers -0x0000 Main Right -0x0140 Main Left -0x0280 -0x0400 -0x0540 -0x0680 -0x07c0 -0x0900 -0x0a40 - -0x03c0 update_block Contains pairs to update current PB with - -0x0b80 pb Current pb, length = 0xc0 - -0x0e04 ms_remaining Milliseconds remaining to process for current voice -0x0e05 pUpdate_block Pointer to update_block -0x0e06 pUpdates_this_ms Pointer to number of updates - -// Pointers to buffers -0x0e08 0x0000 See buffers at 0x0000 -0x0e09 0x0140 -0x0e0a 0x0280 -0x0e0b 0x0400 -0x0e0c 0x0540 -0x0e0d 0x0680 -0x0e0e 0x07c0 -0x0e0f 0x0900 -0x0e10 0x0a40 - -// Func pointers -0x0e14 selectedMixCtrl -0x0e15 selectedSRC -0x0e16 selectedCoef Points into DROM - -// ITD -0x0e40 -0x0e41 -0x0e42 -0x0e43 -////////////////////////////////////////////////////////////////////////// - -// Good ol' exception table -0000 0000 nop -0001 0000 nop // 0 Reset falls through, kinda wierd... -0002 029f 0c10 jmp 0x0c10 // 1 Stack U/O flow -0004 029f 0c1f jmp 0x0c1f // 2 -0006 029f 0c3b jmp 0x0c3b // 3 -0008 029f 0c4a jmp 0x0c4a // 4 ? empty -000a 029f 0c50 jmp 0x0c50 // 5 accelerator address overflow -000c 029f 0c82 jmp 0x0c82 // 6 ? empty -000e 029f 0c88 jmp 0x0c88 // 7 ? empty - -// Entry point -void Task_Init() { - // AX operates in this context all the time - // 0010 1302 sbset #0x02 - // 0011 1303 sbset #0x03 - // 0012 1204 sbclr #0x04 - // 0013 1305 sbset #0x05 - // 0014 1306 sbset #0x06 - // 0015 8e00 set16 - // 0016 8c00 clr15 - // 0017 8b00 m0 - // 0018 0092 00ff lri $CR, #0x00ff - - // 001a 8100 clr $ACC0 - // 001b 8900 clr $ACC1 - // 001c 009e 0e80 lri $AC0.M, #0x0e80 - // 001e 00fe 0e1b sr @0x0e1b, $AC0.M - // 0020 8100 clr $ACC0 - // 0021 00fe 0e31 sr @0x0e31, $AC0.M - ACC0 = ACC1 = 0 - *0x0e1b = 0xe80 // Used in Cmd8 - *0x0e31 = 0 - - // Send DSP_INIT mail - // 0023 16fc dcd1 si @DMBH, #0xdcd1 - // 0025 16fd 0000 si @DMBL, #0x0000 - // 0027 16fb 0001 si @DIRQ, #0x0001 - DMB = 0xdcd10000 - // 0029 26fc lrs $AC0.M, @DMBH - // 002a 02a0 8000 andf $AC0.M, #0x8000 - // 002c 029c 0029 jlnz 0x0029 - while (@DMBH & 0x8000 == 0); - - // 002e 029f 0045 jmp 0x0045 - goto GetNextCmdBlock; -} - -void Task_Resume() { - // Ensure sane context - // 0030 1302 sbset #0x02 - // 0031 1303 sbset #0x03 - // 0032 1204 sbclr #0x04 - // 0033 1305 sbset #0x05 - // 0034 1306 sbset #0x06 - // 0035 8e00 set16 - // 0036 8c00 clr15 - // 0037 8b00 m0 - // 0038 0092 00ff lri $CR, #0x00ff - - // Send DSP_RESUME mail - // 003a 16fc dcd1 si @DMBH, #0xdcd1 - // 003c 16fd 0001 si @DMBL, #0x0001 - // 003e 16fb 0001 si @DIRQ, #0x0001 - DMB = 0xdcd10001 - // 0040 26fc lrs $AC0.M, @DMBH - // 0041 02a0 8000 andf $AC0.M, #0x8000 - // 0043 029c 0040 jlnz 0x0040 - while (@DMBH & 0x8000 == 0); - -GetNextCmdBlock: - 0045 8e00 set16 - 0046 8100 clr $ACC0 - 0047 8900 clr $ACC1 - 0048 009f babe lri $AC1.M, #0xbabe - - // Wait for 0xbabexxxx mail from cpu - do { - // 004a 26fe lrs $AC0.M, @CMBH - // 004b 02c0 8000 andcf $AC0.M, #0x8000 - // 004d 029c 004a jlnz 0x004a - while (@CMBH & 0x8000 == 0); - - // 004f 8200 cmp - // 0050 0294 004a jnz 0x004a - } while (@CMBH != 0xbabe); - - // Save the low 16bits of the mail - // 0052 23ff lrs $AX1.H, @CMBL - u16 length = @CMBL - - // Get next mail - // 0053 8100 clr $ACC0 - // 0054 26fe lrs $AC0.M, @CMBH - // 0055 02c0 8000 andcf $AC0.M, #0x8000 - // 0057 029c 0054 jlnz 0x0054 - while (@CMBH & 0x8000 == 0); - - // 0059 27ff lrs $AC1.M, @CMBL - // 005a 0240 7fff andi $AC0.M, #0x7fff - // 005c 2ece srs @DSMAH, $AC0.M - // 005d 2fcf srs @DSMAL, $AC1.M - // 005e 16cd 0c00 si @DSPA, #0x0c00 - // 0060 8100 clr $ACC0 - // 0061 2ec9 srs @DSCR, $AC0.M - // 0062 1ffb mrr $AC1.M, $AX1.H - // 0063 2fcb srs @DSBL, $AC1.M - // DMA in the CmdBlock - static u16* CmdBlockBuf = 0x0c00 - DSMA = (@CMBH & ~0x8000) << 16 | @CMBL - DSPA = CmdBlockBuf - DSCR = 0 // CPU -> DMEM - DSBL = length - - // 0064 02bf 055c call 0x055c - WaitDMA(); - - // Init the CmdBlock pointer - 0066 0080 0c00 lri $AR0, #0x0c00 - -DoNextCommand: - // 0068 8e00 set16 - // 0069 8100 clr $ACC0 - // 006a 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 006b b100 tst $ACC0 - // 006c 0291 007e jl 0x007e - u16 Cmd = *(CmdBlockBuf++) - if (Cmd < 0) // How could this be possible? 'l is 16bit load... - Die_InvalidCmd(); - - // 006e 0a12 lris $AX0.H, #0x12 - // 006f c100 cmpar $ACC0, $AX0.H - // 0070 0292 007e jg 0x007e - if (Cmd > 0x12) - Die_InvalidCmd(); - - // 0072 009f 0aff lri $AC1.M, #0x0aff - // 0074 4c00 add $ACC0, $ACC1 - // 0075 1c7e mrr $AR3, $AC0.M - // 0076 0213 ilrr $AC0.M, @$AR3 - // 0077 1c7e mrr $AR3, $AC0.M - // 0078 176f jmpr $AR3 - switch (Cmd) { - case 0: Cmd_0(); break; // 0082 - case 1: Cmd_1(); break; // 013e - case 2: Cmd_2(); break; // 01bc - case 3: Cmd_3(); break; // 0248 - case 4: Cmd_4(); break; // 0413 - case 5: Cmd_5(); break; // 0427 - case 6: Cmd_6(); break; // 0165 - case 7: Cmd_7(); break; // 0574 - case 8: Cmd_8(); break; // 0b37 - case 9: Cmd_9(); break; // 015f - case 0xa: Cmd_a(); break; // 0478 - case 0xb: Cmd_b(); break; // 0474 - case 0xc: Cmd_c(); break; // 0476 - case 0xd: Cmd_d(); break; // 01a9 - case 0xe: Cmd_e(); break; // 043b - case 0xf: Cmd_f(); break; // 047a - case 0x10: Cmd_10(); break; // 0bb1 - case 0x11: Cmd_11(); break; // 0175 - } - - // Somehow we've passed the cmd proccessor; DIE!! - // 0079 16fc fbad si @DMBH, #0xfbad - // 007b 16fd 8080 si @DMBL, #0x8080 - DMB = 0xfbad8080 - 007d 0021 halt -} - -// Die and conveniently tell the cpu which cmd was baad -void Die_InvalidCmd() { - 007e 16fc baad si @DMBH, #0xbaad - 0080 2efd srs @DMBL, $AC0.M - 0081 0021 halt -} - -// Executes the same operation 3 times on buffers: (0, 0x0400, 0x07c0) -void Cmd_0() { - // 0082 8100 clr $ACC0 - // 0083 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 0084 8e78 set16'l : $AC1.M, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 0085 2ece srs @DSMAH, $AC0.M - // 0086 2fcf srs @DSMAL, $AC1.M - // 0087 009e 0e44 lri $AC0.M, #0x0e44 - // 0089 2ecd srs @DSPA, $AC0.M - // 008a 0e00 lris $AC0.M, #0x00 - // 008b 2ec9 srs @DSCR, $AC0.M - // 008c 009e 0040 lri $AC0.M, #0x0040 - // 008e 2ecb srs @DSBL, $AC0.M - - // DMA 0x0040bytes to DRAM @ 0x0e44 from CPU @ maddr - - 008f 0081 0e44 lri $AR1, #0x0e44 // source - 0091 0082 0000 lri $AR2, #0x0000 // destination - - 0093 009b 009f lri $AX1.H, #0x009f - 0095 009a 0140 lri $AX0.H, #0x0140 // loop length if !ACC0 - - 0097 8100 clr $ACC0 - 0098 8900 clr $ACC1 - - 0099 8f00 set40 - - // 009a 02bf 055c call 0x055c - WaitDMA(); - - 009c 193e lrri $AC0.M, @$AR1 - 009d 193c lrri $AC0.L, @$AR1 - 009e b100 tst $ACC0 - 009f 193f lrri $AC1.M, @$AR1 // added to ACC0 in confusing ways - // 00a0 0294 00a6 jnz 0x00a6 - if (!$ACC0) { - 00a2 005a loop $AX0.H - 00a3 1b5e srri @$AR2, $AC0.M - - // 00a4 029f 00ae jmp 0x00ae - } else { - 00a6 9900 asr16 $ACC1 - 00a7 1b5e srri @$AR2, $AC0.M - 00a8 1b5c srri @$AR2, $AC0.L - 00a9 007b 00ad bloop $AX1.H, 0x00ad - 00ab 4c00 add $ACC0, $ACC1 - 00ac 1b5e srri @$AR2, $AC0.M - 00ad 1b5c srri @$AR2, $AC0.L - - } - - // same code block as above...epic fail? - 00ae 193e lrri $AC0.M, @$AR1 - 00af 193c lrri $AC0.L, @$AR1 - 00b0 b100 tst $ACC0 - 00b1 193f lrri $AC1.M, @$AR1 - // 00b2 0294 00b8 jnz 0x00b8 - if (!$ACC0) { - 00b4 005a loop $AX0.H - 00b5 1b5e srri @$AR2, $AC0.M - - // 00b6 029f 00c0 jmp 0x00c0 - } else { - 00b8 9900 asr16 $ACC1 - 00b9 1b5e srri @$AR2, $AC0.M - 00ba 1b5c srri @$AR2, $AC0.L - 00bb 007b 00bf bloop $AX1.H, 0x00bf - 00bd 4c00 add $ACC0, $ACC1 - 00be 1b5e srri @$AR2, $AC0.M - 00bf 1b5c srri @$AR2, $AC0.L - - } - - // ...and again! wtf - 00c0 193e lrri $AC0.M, @$AR1 - 00c1 193c lrri $AC0.L, @$AR1 - 00c2 b100 tst $ACC0 - 00c3 193f lrri $AC1.M, @$AR1 - // 00c4 0294 00ca jnz 0x00ca - if (!$ACC0) { - 00c6 005a loop $AX0.H - 00c7 1b5e srri @$AR2, $AC0.M - - // 00c8 029f 00d2 jmp 0x00d2 - } else { - 00ca 9900 asr16 $ACC1 - 00cb 1b5e srri @$AR2, $AC0.M - 00cc 1b5c srri @$AR2, $AC0.L - 00cd 007b 00d1 bloop $AX1.H, 0x00d1 - 00cf 4c00 add $ACC0, $ACC1 - 00d0 1b5e srri @$AR2, $AC0.M - 00d1 1b5c srri @$AR2, $AC0.L - - } - - // set to next buffer - 00d2 0082 0400 lri $AR2, #0x0400 - - // same code block, uses tst'l in one place...otherwise the same - 00d4 193e lrri $AC0.M, @$AR1 - 00d5 193c lrri $AC0.L, @$AR1 - 00d6 b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 00d7 0294 00dd jnz 0x00dd - if (!$ACC0) { - 00d9 005a loop $AX0.H - 00da 1b5e srri @$AR2, $AC0.M - // 00db 029f 00e5 jmp 0x00e5 - } else { - 00dd 9900 asr16 $ACC1 - 00de 1b5e srri @$AR2, $AC0.M - 00df 1b5c srri @$AR2, $AC0.L - 00e0 007b 00e4 bloop $AX1.H, 0x00e4 - 00e2 4c00 add $ACC0, $ACC1 - 00e3 1b5e srri @$AR2, $AC0.M - 00e4 1b5c srri @$AR2, $AC0.L - } - - // same code block, using tst'l again...wonder if it actually changes behavior? - 00e5 193e lrri $AC0.M, @$AR1 - 00e6 193c lrri $AC0.L, @$AR1 - 00e7 b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 00e8 0294 00ee jnz 0x00ee - if (!$ACC0) { - 00ea 005a loop $AX0.H - 00eb 1b5e srri @$AR2, $AC0.M - // 00ec 029f 00f6 jmp 0x00f6 - } else { - 00ee 9900 asr16 $ACC1 - 00ef 1b5e srri @$AR2, $AC0.M - 00f0 1b5c srri @$AR2, $AC0.L - 00f1 007b 00f5 bloop $AX1.H, 0x00f5 - 00f3 4c00 add $ACC0, $ACC1 - 00f4 1b5e srri @$AR2, $AC0.M - 00f5 1b5c srri @$AR2, $AC0.L - } - - // see comments above - 00f6 193e lrri $AC0.M, @$AR1 - 00f7 193c lrri $AC0.L, @$AR1 - 00f8 b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 00f9 0294 00ff jnz 0x00ff - if (!$ACC0) { - 00fb 005a loop $AX0.H - 00fc 1b5e srri @$AR2, $AC0.M - // 00fd 029f 0107 jmp 0x0107 - } else { - 00ff 9900 asr16 $ACC1 - 0100 1b5e srri @$AR2, $AC0.M - 0101 1b5c srri @$AR2, $AC0.L - 0102 007b 0106 bloop $AX1.H, 0x0106 - 0104 4c00 add $ACC0, $ACC1 - 0105 1b5e srri @$AR2, $AC0.M - 0106 1b5c srri @$AR2, $AC0.L - } - - // set to next buffer - 0107 0082 07c0 lri $AR2, #0x07c0 - - // see comments above - 0109 193e lrri $AC0.M, @$AR1 - 010a 193c lrri $AC0.L, @$AR1 - 010b b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 010c 0294 0112 jnz 0x0112 - if (!$ACC0) { - 010e 005a loop $AX0.H - 010f 1b5e srri @$AR2, $AC0.M - // 0110 029f 011a jmp 0x011a - } else { - 0112 9900 asr16 $ACC1 - 0113 1b5e srri @$AR2, $AC0.M - 0114 1b5c srri @$AR2, $AC0.L - 0115 007b 0119 bloop $AX1.H, 0x0119 - 0117 4c00 add $ACC0, $ACC1 - 0118 1b5e srri @$AR2, $AC0.M - 0119 1b5c srri @$AR2, $AC0.L - } - - // see comments above - 011a 193e lrri $AC0.M, @$AR1 - 011b 193c lrri $AC0.L, @$AR1 - 011c b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 011d 0294 0123 jnz 0x0123 - if (!$ACC0) { - 011f 005a loop $AX0.H - 0120 1b5e srri @$AR2, $AC0.M - // 0121 029f 012b jmp 0x012b - } else { - 0123 9900 asr16 $ACC1 - 0124 1b5e srri @$AR2, $AC0.M - 0125 1b5c srri @$AR2, $AC0.L - 0126 007b 012a bloop $AX1.H, 0x012a - 0128 4c00 add $ACC0, $ACC1 - 0129 1b5e srri @$AR2, $AC0.M - 012a 1b5c srri @$AR2, $AC0.L - } - - // see comments above - 012b 193e lrri $AC0.M, @$AR1 - 012c 193c lrri $AC0.L, @$AR1 - 012d b179 tst'l $ACC0 : $AC1.M, @$AR1 - // 012e 0294 0134 jnz 0x0134 - if (!$ACC0) { - 0130 005a loop $AX0.H - 0131 1b5e srri @$AR2, $AC0.M - // 0132 029f 013c jmp 0x013c - } else { - 0134 9900 asr16 $ACC1 - 0135 1b5e srri @$AR2, $AC0.M - 0136 1b5c srri @$AR2, $AC0.L - 0137 007b 013b bloop $AX1.H, 0x013b - 0139 4c00 add $ACC0, $ACC1 - 013a 1b5e srri @$AR2, $AC0.M - 013b 1b5c srri @$AR2, $AC0.L - } - - // 013c 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_1() { - 013e 0085 ffff lri $IX1, #0xffff // -1 - - // 0140 8150 clr'l $ACC0 : $AX0.H, @$AR0 - // 0141 8940 clr'l $ACC1 : $AX0.L, @$AR0 - // 0142 8e48 set16'l : $AX1.L, @$AR0 - // 0143 00fa 0e17 sr @0x0e17, $AX0.H - // 0145 00f8 0e18 sr @0x0e18, $AX0.L - // 0147 0081 0000 lri $AR1, #0x0000 - // 0149 02bf 04f1 call 0x04f1 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - u16 unkForMulBuffer1 = *(CmdBlockBuf++) - u16 unkForMulBuffer2 = 0 // a buffer in dram - Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2) - - // 014b 00da 0e17 lr $AX0.H, @0x0e17 - // 014d 00d8 0e18 lr $AX0.L, @0x0e18 - // 014f 8948 clr'l $ACC1 : $AX1.L, @$AR0 - // 0150 0081 0400 lri $AR1, #0x0400 - // 0152 02bf 04f1 call 0x04f1 - unkForMulBuffer1 = *(CmdBlockBuf++) - unkForMulBuffer2 = 0x0400 - Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2) - - // 0154 00da 0e17 lr $AX0.H, @0x0e17 - // 0156 00d8 0e18 lr $AX0.L, @0x0e18 - // 0158 8948 clr'l $ACC1 : $AX1.L, @$AR0 - // 0159 0081 07c0 lri $AR1, #0x07c0 - // 015b 02bf 04f1 call 0x04f1 - unkForMulBuffer1 = *(CmdBlockBuf++) - unkForMulBuffer2 = 0x07c0 - Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2) - - // 015d 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_9() { - 015f 0086 07c0 lri $IX2, #0x07c0 // often used buffer in dram - - 0161 02bf 0484 call 0x0484 - - // 0163 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_6() { - 0165 8100 clr $ACC0 - 0166 8e00 set16 - - // 0167 191e lrri $AC0.M, @$AR0 - // 0168 191c lrri $AC0.L, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 0169 2ece srs @DSMAH, $AC0.M - // 016a 2ccf srs @DSMAL, $AC0.L - // 016b 16cd 0000 si @DSPA, #0x0000 - // 016d 16c9 0001 si @DSCR, #0x0001 - // 016f 16cb 0780 si @DSBL, #0x0780 - - // DMA 0x780bytes to CPU @ maddr from DMEM @ 0 - - // 0171 02bf 055c call 0x055c - WaitDMA(); - - // 0173 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_11() { - // 0175 8100 clr $ACC0 - // 0176 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 0177 8e60 set16'l : $AC0.L, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 0178 2ece srs @DSMAH, $AC0.M - // 0179 2ccf srs @DSMAL, $AC0.L - // 017a 16cd 0e44 si @DSPA, #0x0e44 - // 017c 16c9 0000 si @DSCR, #0x0000 - // 017e 8900 clr $ACC1 - // 017f 0d20 lris $AC1.L, #0x20 - // 0180 2dcb srs @DSBL, $AC1.L - - // DMA 0x20bytes to DRAM @ 0x0e44 from CPU @ maddr - - u16 length_of_0e44 = 0x20 - - // 0181 4c00 add $ACC0, $ACC1 - maddr += length_of_0e44 - - // Save CmdBlockBuf - // 0182 1c80 mrr $IX0, $AR0 - - // 0183 0080 0280 lri $AR0, #0x0280 - // 0185 0081 0000 lri $AR1, #0x0000 - // 0187 0082 0140 lri $AR2, #0x0140 - // 0189 0083 0e44 lri $AR3, #0x0e44 - // 018b 0a00 lris $AX0.H, #0x00 - - // 018c 27c9 lrs $AC1.M, @DSCR - // 018d 03a0 0004 andf $AC1.M, #0x0004 - // 018f 029c 018c jlnz 0x018c - while (@DSCR & 4); - - // 0191 2ece srs @DSMAH, $AC0.M - // 0192 2ccf srs @DSMAL, $AC0.L - // 0193 16cd 0e54 si @DSPA, #0x0e54 - // 0195 16c9 0000 si @DSCR, #0x0000 - // 0197 16cb 0260 si @DSBL, #0x0260 - - // DMA 0x0260bytes to DRAM @ 0x0e54 from CPU @ maddr - - // 0199 009f 00a0 lri $AC1.M, #0x00a0 - // 019b 8f00 set40 - // 019c 007f 01a5 bloop $AC1.M, 0x01a5 - // 019e 197e lrri $AC0.M, @$AR3 - // 019f 1b1a srri @$AR0, $AX0.H - // 01a0 197c lrri $AC0.L, @$AR3 - // 01a1 1b1a srri @$AR0, $AX0.H - // 01a2 1b5e srri @$AR2, $AC0.M - // 01a3 7c22 neg's $ACC0 : @$AR2, $AC0.L - // 01a4 1b3e srri @$AR1, $AC0.M - // 01a5 1b3c srri @$AR1, $AC0.L - - // high reg will only be sign bits, and it's never stored, so we can use s32 here - s32* buffer_source = 0x0e44 - s32* buffer_dest = 0x0140 - s32* buffer_to_zero = 0x0280 - s32* buffer_dest_neg = 0x0000 - for (i = 0x00a0; i > 0; i--) { - s32 thing = *(buffer_source++) - *(buffer_to_zero++) = 0 - *(buffer_dest++) = thing - *(buffer_dest_neg++) = ~thing - } - - // Restore CmdBlockBuf - 01a6 1c04 mrr $AR0, $IX0 - - // 01a7 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -// Interesting, DMAs in new CmdBlock and starts executing it -void Cmd_D() { - // 01a9 8e70 set16'l : $AC0.M, @$AR0 - // 01aa 8960 clr'l $ACC1 : $AC0.L, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 01ab 191f lrri $AC1.M, @$AR0 - u16 numbytes = *(CmdBlockBuf++) - - // 01ac 2ece srs @DSMAH, $AC0.M - // 01ad 2ccf srs @DSMAL, $AC0.L - // 01ae 16cd 0c00 si @DSPA, #0x0c00 - // 01b0 16c9 0000 si @DSCR, #0x0000 - // 01b2 0503 addis $AC1.M, #0x03 - // 01b3 0340 fff0 andi $AC1.M, #0xfff0 - // 01b5 2fcb srs @DSBL, $AC1.M - - // DMA ((numbytes + 3) & 0xfff0)bytes to DMEM @ 0x0c00 from CPU @ maddr - - // 01b6 02bf 055c call 0x055c - WaitDMA(); - - // 01b8 0080 0c00 lri $AR0, #0x0c00 - CmdBlockBuf = 0x0c00 - - // 01ba 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -// DMAs in a new PB and inits values (itd, func pointers, etc) -// DMAs in new update_block, but doesn't apply it -void Cmd_2() { - 01bc 8100 clr $ACC0 - - // 01bd 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 01be 8e78 set16'l : $AC1.M, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 01bf 2ece srs @DSMAH, $AC0.M - // 01c0 2fcf srs @DSMAL, $AC1.M - // 01c1 16cd 0b80 si @DSPA, #0x0b80 - // 01c3 16c9 0000 si @DSCR, #0x0000 - // 01c5 16cb 00c0 si @DSBL, #0x00c0 - - // DMA 0x00c0bytes to DMEM @ 0x0b80 from CPU @ maddr - - // 01c7 0082 0e08 lri $AR2, #0x0e08 - // 01c9 009f 0000 lri $AC1.M, #0x0000 - // 01cb 1b5f srri @$AR2, $AC1.M - // 01cc 009f 0140 lri $AC1.M, #0x0140 - // 01ce 1b5f srri @$AR2, $AC1.M - // 01cf 009f 0280 lri $AC1.M, #0x0280 - // 01d1 1b5f srri @$AR2, $AC1.M - // 01d2 009f 0400 lri $AC1.M, #0x0400 - // 01d4 1b5f srri @$AR2, $AC1.M - // 01d5 009f 0540 lri $AC1.M, #0x0540 - // 01d7 1b5f srri @$AR2, $AC1.M - // 01d8 009f 0680 lri $AC1.M, #0x0680 - // 01da 1b5f srri @$AR2, $AC1.M - // 01db 009f 07c0 lri $AC1.M, #0x07c0 - // 01dd 1b5f srri @$AR2, $AC1.M - // 01de 009f 0900 lri $AC1.M, #0x0900 - // 01e0 1b5f srri @$AR2, $AC1.M - // 01e1 009f 0a40 lri $AC1.M, #0x0a40 - // 01e3 1b5f srri @$AR2, $AC1.M - *0x0e08 = 0x0000 - *0x0e09 = 0x0140 - *0x0e0a = 0x0280 - *0x0e0b = 0x0400 - *0x0e0c = 0x0540 - *0x0e0d = 0x0680 - *0x0e0e = 0x07c0 - *0x0e0f = 0x0900 - *0x0e10 = 0x0a40 - - // 01e4 02bf 055c call 0x055c - WaitDMA(); - - // 01e6 00de 0ba7 lr $AC0.M, @0x0ba7 - // 01e8 00df 0ba8 lr $AC1.M, @0x0ba8 - // 01ea 2ece srs @DSMAH, $AC0.M - // 01eb 2fcf srs @DSMAL, $AC1.M - // 01ec 16cd 03c0 si @DSPA, #0x03c0 - // 01ee 16c9 0000 si @DSCR, #0x0000 - // 01f0 16cb 0080 si @DSBL, #0x0080 - - // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0 - - // 01f2 8100 clr $ACC0 - // 01f3 8900 clr $ACC1 - - // 01f4 00de 0b84 lr $AC0.M, @0x0b84 - // 01f6 009f 0b31 lri $AC1.M, #0x0b31 - // 01f8 4c00 add $ACC0, $ACC1 - // 01f9 1c7e mrr $AR3, $AC0.M - // 01fa 0213 ilrr $AC0.M, @$AR3 - // 01fb 00fe 0e15 sr @0x0e15, $AC0.M - *0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src - - // 01fd 00de 0b85 lr $AC0.M, @0x0b85 - // 01ff 009f 0b34 lri $AC1.M, #0x0b34 - // 0201 4c00 add $ACC0, $ACC1 - // 0202 1c7e mrr $AR3, $AC0.M - // 0203 0213 ilrr $AC0.M, @$AR3 - // 0204 00fe 0e16 sr @0x0e16, $AC0.M - *0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table - - // 0206 00de 0b86 lr $AC0.M, @0x0b86 - // 0208 009f 0b11 lri $AC1.M, #0x0b11 - // 020a 4c00 add $ACC0, $ACC1 - // 020b 1c7e mrr $AR3, $AC0.M - // 020c 0213 ilrr $AC0.M, @$AR3 - // 020d 00fe 0e14 sr @0x0e14, $AC0.M - *0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer - - // 020f 8100 clr $ACC0 - // 0210 00de 0b9b lr $AC0.M, @0x0b9b - // 0212 b100 tst $ACC0 - // 0213 0295 023a jz 0x023a - if (pb.itd.flag != AX_PB_ITD_OFF) { - // 0215 8900 clr $ACC1 - // 0216 00df 0b9e lr $AC1.M, @0x0b9e - // 0218 0300 0cc0 addi $AC1.M, #0x0cc0 - // 021a 00ff 0e40 sr @0x0e40, $AC1.M - *0x0e40 = 0x0cc0 + pb.itd.shiftL - - // 021c 00df 0b9f lr $AC1.M, @0x0b9f - // 021e 0300 0cc0 addi $AC1.M, #0x0cc0 - // 0220 00ff 0e41 sr @0x0e41, $AC1.M - *0x0e41 = 0x0cc0 + pb.itd.shiftR - - // 0222 009f 0ce0 lri $AC1.M, #0x0ce0 - // 0224 00ff 0e42 sr @0x0e42, $AC1.M - // 0226 00ff 0e43 sr @0x0e43, $AC1.M - *0x0e42 = 0x0ce0 - *0x0e43 = 0x0ce0 - - // 0228 02bf 055c call 0x055c - WaitDMA(); - - // 022a 00de 0b9c lr $AC0.M, @0x0b9c - // 022c 2ece srs @DSMAH, $AC0.M - // 022d 00de 0b9d lr $AC0.M, @0x0b9d - // 022f 2ecf srs @DSMAL, $AC0.M - // 0230 16cd 0cc0 si @DSPA, #0x0cc0 - // 0232 16c9 0000 si @DSCR, #0x0000 - // 0234 16cb 0040 si @DSBL, #0x0040 - - // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo - - // 0236 02bf 055c call 0x055c - WaitDMA(); - - // 0238 029f 0068 jmp 0x0068 - goto DoNextCommand; - - } else { - - // 023a 009f 0ce0 lri $AC1.M, #0x0ce0 - // 023c 00ff 0e42 sr @0x0e42, $AC1.M - // 023e 00ff 0e40 sr @0x0e40, $AC1.M - // 0240 00ff 0e41 sr @0x0e41, $AC1.M - // 0242 00ff 0e43 sr @0x0e43, $AC1.M - *0x0e42 = 0x0ce0 - *0x0e40 = 0x0ce0 - *0x0e41 = 0x0ce0 - *0x0e43 = 0x0ce0 - - // 0244 02bf 055c call 0x055c - WaitDMA(); - - // 0246 029f 0068 jmp 0x0068 - goto DoNextCommand; - } -} - -// Function calls itself until there are no more linked PBs -void Cmd_3() { - 0248 8e00 set16 - - // Save CmdBlockBuf ptr - 0249 00e0 0e07 sr @0x0e07, $AR0 - - // Processes pb.update.updNum[0] to pb.update.updNum[5] - // Applies specified number of updates for every millisecond of voice frame (5 millisecs) - // first millisec's updates are ignored <- not proven, yet - - // 024b 0080 0ba2 lri $AR0, #0x0ba2 // pb.update.updNum[0] - // 024d 0081 03c0 lri $AR1, #0x03c0 - // 024f 0e05 lris $AC0.M, #0x05 - // 0250 00fe 0e04 sr @0x0e04, $AC0.M // counter to decrement - // 0252 8900 clr $ACC1 - u16* pUpdates_this_ms = 0x0ba2 - u16* pUpdate_block = 0x03c0 - u16 ms_remaining = 5 - -NextMillisecUpd: - // 0253 8150 clr'l $ACC0 : $AX0.H, @$AR0 - // 0254 009f 0b80 lri $AC1.M, #0x0b80 - // 0256 007a 025b bloop $AX0.H, 0x025b - // 0258 193e lrri $AC0.M, @$AR1 - // 0259 4c49 add'l $ACC0, $ACC1 : $AX1.L, @$AR1 - // 025a 1c5e mrr $AR2, $AC0.M - // 025b 1a59 srr @$AR2, $AX1.L // AR2 isn't changed till updates are done - - // Write updates from update_block to pb in dram - for (int i = 0; i < *pUpdates_this_ms; i+=2) { - // Looks like 0x03c0 is a struct of pairs to write into PB - *(0x0b80 + *(pUpdate_block + i)) = *(pUpdate_block + i + 1) - } - pUpdates_this_ms++ - - // 025c 0083 0e05 lri $AR3, #0x0e05 - // 025e 1b61 srri @$AR3, $AR1 - // 025f 1b60 srri @$AR3, $AR0 - *0x0e05 = pUpdate_block - *0x0e06 = pUpdates_this_ms - // They are restored before jmping back to NextMillisecUpd - - // 0260 00de 0b87 lr $AC0.M, @0x0b87 - // 0262 0601 cmpis $AC0.M, #0x01 - // 0263 0295 0267 jz 0x0267 - // 0265 029f 0332 jmp 0x0332 - if (pb.state == AX_PB_STATE_RUN) { - - // 0267 00de 0e42 lr $AC0.M, @0x0e42 - // 0269 00fe 0e1c sr @0x0e1c, $AC0.M - *0x0e1c = *0x0e42 - - // 026b 00c3 0e15 lr $AR3, @0x0e15 - // 026d 177f callr $AR3 - DoSelectedSRC() - - // Volume Envelope Processing - // 026e 8e00 set16 - // 026f 8a00 m2 - // 0270 8100 clr $ACC0 - // 0271 8900 clr $ACC1 - // 0272 00de 0bb3 lr $AC0.M, @0x0bb3 // currentDelta (s16) - // 0274 00df 0bb2 lr $AC1.M, @0x0bb2 // currentVolume (u16) - // 0276 1f1f mrr $AX0.L, $AC1.M - // 0277 4d00 add $ACC1, $ACC0 - // 0278 1481 asl $ACC0, #1 - // 0279 8d1e set15'mv : $AX1.H, $AC0.M // unsigned mulx, - // 027a 1fd8 mrr $AC0.M, $AX0.L - // 027b 0098 8000 lri $AX0.L, #0x8000 - // 027d 0080 0e44 lri $AR0, #0x0e44 - // 027f a830 mulx's $AX0.L, $AX1.H : @$AR0, $AC0.M - // 0280 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0281 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0282 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0283 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0284 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0285 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0286 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0287 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0288 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0289 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 028a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 028b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 028c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 028d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 028e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 028f ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0290 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0291 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0292 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0293 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0294 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0295 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0296 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0297 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 0298 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 0299 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 029a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 029b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 029c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 029d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - // 029e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - // 029f 00fe 0bb2 sr @0x0bb2, $AC0.M - - u40 temp1 = pb.ve.currentVolume << 16 - u40 temp2 = (pb.ve.currentVolume + pb.ve.currentDelta) << 16 - *0x0e44 = temp1 >> 16 - *0x0e45 = temp2 >> 16 - - u40 PROD = (u16)0x8000 * (u16)(pb.ve.currentDelta << 1) * 2 - for (u16* i = 0x0e46; i < 0x0e46 + 30; i+=2) { - temp1 += PROD - temp2 += PROD - - *i = temp1 >> 16 - *(i + 1) = temp2 >> 16 - } - temp1 += PROD - pb.ve.currentVolume = temp1 >> 16 - - // 02a1 8f00 set40 - // 02a2 0080 0e44 lri $AR0, #0x0e44 - // 02a4 00c1 0e43 lr $AR1, @0x0e43 - // 02a6 1c61 mrr $AR3, $AR1 - // 02a7 193a lrri $AX0.H, @$AR1 - // 02a8 1918 lrri $AX0.L, @$AR0 - // 02a9 9059 mul'l $AX0.L, $AX0.H : $AX1.H, @$AR1 - // 02aa 1919 lrri $AX1.L, @$AR0 - // 02ab 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02ac 8080 nx'ls : $AX0.L, $AC0.M - // 02ad 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02ae 8091 nx'ls : $AX1.L, $AC1.M - // 02af 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02b0 8080 nx'ls : $AX0.L, $AC0.M - // 02b1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02b2 8091 nx'ls : $AX1.L, $AC1.M - // 02b3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02b4 8080 nx'ls : $AX0.L, $AC0.M - // 02b5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02b6 8091 nx'ls : $AX1.L, $AC1.M - // 02b7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02b8 8080 nx'ls : $AX0.L, $AC0.M - // 02b9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02ba 8091 nx'ls : $AX1.L, $AC1.M - // 02bb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02bc 8080 nx'ls : $AX0.L, $AC0.M - // 02bd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02be 8091 nx'ls : $AX1.L, $AC1.M - // 02bf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02c0 8080 nx'ls : $AX0.L, $AC0.M - // 02c1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02c2 8091 nx'ls : $AX1.L, $AC1.M - // 02c3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02c4 8080 nx'ls : $AX0.L, $AC0.M - // 02c5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02c6 8091 nx'ls : $AX1.L, $AC1.M - // 02c7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02c8 8080 nx'ls : $AX0.L, $AC0.M - // 02c9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02ca 8091 nx'ls : $AX1.L, $AC1.M - // 02cb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02cc 8080 nx'ls : $AX0.L, $AC0.M - // 02cd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02ce 8091 nx'ls : $AX1.L, $AC1.M - // 02cf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02d0 8080 nx'ls : $AX0.L, $AC0.M - // 02d1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02d2 8091 nx'ls : $AX1.L, $AC1.M - // 02d3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02d4 8080 nx'ls : $AX0.L, $AC0.M - // 02d5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02d6 8091 nx'ls : $AX1.L, $AC1.M - // 02d7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02d8 8080 nx'ls : $AX0.L, $AC0.M - // 02d9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02da 8091 nx'ls : $AX1.L, $AC1.M - // 02db 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02dc 8080 nx'ls : $AX0.L, $AC0.M - // 02dd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02de 8091 nx'ls : $AX1.L, $AC1.M - // 02df 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02e0 8080 nx'ls : $AX0.L, $AC0.M - // 02e1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02e2 8091 nx'ls : $AX1.L, $AC1.M - // 02e3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - // 02e4 8080 nx'ls : $AX0.L, $AC0.M - // 02e5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - // 02e6 8091 nx'ls : $AX1.L, $AC1.M - // 02e7 9e00 mulmv $AX1.L, $AX1.H, $ACC0 - // 02e8 6f33 movp's $ACC1 : @$AR3, $AC0.M - // 02e9 1b7f srri @$AR3, $AC1.M - - u16* dst = *0x0e43 - u16* temp1 = 0x0e44 - - for (x = 0; x < 0x20; x++) { - *(dst + x) = ((u16)*(temp1 + x) * (u16)*(dst + x) * 2) >> 16 - } - - // 02ea 00c3 0e14 lr $AR3, @0x0e14 - // 02ec 8f00 set40 - // 02ed 8d00 set15 - // 02ee 8a00 m2 - // 02ef 177f callr $AR3 - // Keep in mind: 40bit, unsigned, *2 - DoSelectedMixer() - - // Note: 40bit, unsigned, *2 not changed till 0x0332 - - // 02f0 8100 clr $ACC0 - // 02f1 00de 0b9b lr $AC0.M, @0x0b9b - // 02f3 b100 tst $ACC0 - // 02f4 0295 032a jz 0x032a - if (pb.itd.flag != AX_PB_ITD_OFF) { - // 02f6 00de 0e42 lr $AC0.M, @0x0e42 - // 02f8 00fe 0e43 sr @0x0e43, $AC0.M - *0x0e43 = *0x0e42 - - // 02fa 8100 clr $ACC0 - // 02fb 8900 clr $ACC1 - // 02fc 00de 0b9e lr $AC0.M, @0x0b9e - // 02fe 00df 0ba0 lr $AC1.M, @0x0ba0 - // 0300 8200 cmp - // 0301 0293 0306 jle 0x0306 - if (pb.itd.shiftL > pb.itd.targetShiftL) { - // 0303 7800 decm $AC0.M - // 0304 029f 0309 jmp 0x0309 - pb.itd.shiftL-- - } else if (pb.itd.shiftL < pb.itd.targetShiftL) { - // 0306 0295 0309 jz 0x0309 - // 0308 7400 incm $AC0.M - pb.itd.shiftL++ - } - // 0309 00fe 0b9e sr @0x0b9e, $AC0.M // Store pb.itd.shiftL - - // 030b 00df 0e43 lr $AC1.M, @0x0e43 - // 030d 05e0 addis $AC1.M, #0xe0 - // 030e 4c00 add $ACC0, $ACC1 - // 030f 00fe 0e40 sr @0x0e40, $AC0.M - *0x0e40 = *0x0e43 - 32 - - // 0311 8100 clr $ACC0 - // 0312 8900 clr $ACC1 - // 0313 00de 0b9f lr $AC0.M, @0x0b9f - // 0315 00df 0ba1 lr $AC1.M, @0x0ba1 - // 0317 8200 cmp - // 0318 0293 031d jle 0x031d - if (pb.itd.shiftR > pb.itd.targetShiftR) { - // 031a 7800 decm $AC0.M - // 031b 029f 0320 jmp 0x0320 - pb.itd.shiftR-- - } else if (pb.itd.shiftR < pb.itd.targetShiftR) { - // 031d 0295 0320 jz 0x0320 - // 031f 7400 incm $AC0.M - pb.itd.shiftR++ - } - // 0320 00fe 0b9f sr @0x0b9f, $AC0.M // Store pb.itd.shiftR - - // 0322 00df 0e43 lr $AC1.M, @0x0e43 - // 0324 05e0 addis $AC1.M, #0xe0 - // 0325 4c00 add $ACC0, $ACC1 - // 0326 00fe 0e41 sr @0x0e41, $AC0.M - *0x0e41 = *0x0e43 - 32 - - 0328 029f 0332 jmp 0x0332 - - } else { // pb.itd.flag == AX_PB_ITD_OFF - - // 032a 00de 0e42 lr $AC0.M, @0x0e42 - // 032c 00fe 0e40 sr @0x0e40, $AC0.M - // 032e 00fe 0e41 sr @0x0e41, $AC0.M - // 0330 00fe 0e43 sr @0x0e43, $AC0.M - *0x0e40 = *0x0e42 - *0x0e41 = *0x0e42 - *0x0e43 = *0x0e42 - } - } - - - // 0332 8100 clr $ACC0 - // 0333 8e00 set16 - // 0334 8400 clrp - // 0335 8900 clr $ACC1 - // 0336 1efe mrr $PROD.M2, $AC0.M - // 0337 0e40 lris $AC0.M, #0x40 - // 0338 1ebe mrr $PROD.M1, $AC0.M - // 0339 0083 0e08 lri $AR3, #0x0e08 - // 033b 1c03 mrr $AR0, $AR3 - // 033c 1ff5 mrr $AC1.M, $PROD.M1 - // 033d 191a lrri $AX0.H, @$AR0 - // 033e f858 addpaxz'l $ACC0, $AX0.H : $AX1.H, @$AR0 - // 033f fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - // 0340 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - // 0341 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - // 0342 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - // 0343 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - // 0344 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - // 0345 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - // 0346 f83b addpaxz's $ACC0, $AX0.H : @$AR3, $AC1.M - // 0347 1b7e srri @$AR3, $AC0.M - - for (u16* i = 0x0e08; i <= 0x0e10; i++) { - *i = (u16)( (0xff00400000 + (u40)(*i << 16)) >> 16 ) - } - - // 0348 0083 0e04 lri $AR3, #0x0e04 - // 034a 8100 clr $ACC0 - // 034b 8973 clr'l $ACC1 : $AC0.M, @$AR3 - // 034c 1961 lrri $AR1, @$AR3 // 0x0e05 - // 034d 1960 lrri $AR0, @$AR3 // 0x0e06 - // 034e 7800 decm $AC0.M - // 034f 00fe 0e04 sr @0x0e04, $AC0.M - // 0351 0294 0253 jnz 0x0253 - ms_remaining-- - if (ms_remaining) - goto NextMillisecUpd - - // 0353 8e00 set16 - // 0354 8100 clr $ACC0 - // 0355 00de 0b9b lr $AC0.M, @0x0b9b - // 0357 b100 tst $ACC0 - // 0358 0295 036a jz 0x036a - if (pb.itd.flag != AX_PB_ITD_OFF) { - - // 035a 00de 0b9c lr $AC0.M, @0x0b9c - // 035c 00dc 0b9d lr $AC0.L, @0x0b9d - // 035e 2ece srs @DSMAH, $AC0.M - // 035f 2ccf srs @DSMAL, $AC0.L - // 0360 8100 clr $ACC0 - // 0361 00de 0e1c lr $AC0.M, @0x0e1c - // 0363 2ecd srs @DSPA, $AC0.M - // 0364 16c9 0001 si @DSCR, #0x0001 - // 0366 16cb 0040 si @DSBL, #0x0040 - - // DMA 0x40bytes from DRAM @ (*0x0e1c) to CPU @ ((pb.itd.bufferHi << 16) | pb.itd.bufferLo) - - // 0368 02bf 055c call 0x055c - WaitDMA(); - } - - // 036a 8100 clr $ACC0 - // 036b 8900 clr $ACC1 - // 036c 00de 0b82 lr $AC0.M, @0x0b82 - // 036e 00df 0b83 lr $AC1.M, @0x0b83 - u16 maddrh = pb.currHi - u16 maddrl = pb.currLo - - // This writes back the whole PB to mram from dsp - // 0370 2ece srs @DSMAH, $AC0.M - // 0371 2fcf srs @DSMAL, $AC1.M - // 0372 16cd 0b80 si @DSPA, #0x0b80 - // 0374 16c9 0001 si @DSCR, #0x0001 - // 0376 16cb 00c0 si @DSBL, #0x00c0 - - // DMA 0xc0bytes from DRAM @ 0x0b80 to CPU @ maddr - - // 0378 02bf 055c call 0x055c - WaitDMA(); - - // 037a 8100 clr $ACC0 - // 037b 00de 0b80 lr $AC0.M, @0x0b80 - // 037d 00dc 0b81 lr $AC0.L, @0x0b81 - // 037f b100 tst $ACC0 - // 0380 0294 0386 jnz 0x0386 - if (((pb.nextHi << 16) | pb.nextLo) == 0) { - // No more PBs! - - // Restore CmdBlockBuf ptr - 0382 00c0 0e07 lr $AR0, @0x0e07 - // 0384 029f 0068 jmp 0x0068 - goto DoNextCommand; - } - - // DMA in the next PB - // From here on out, it's the same as Cmd2, except it calls itself to process the PB it just loaded - - // 0386 2ece srs @DSMAH, $AC0.M - // 0387 2ccf srs @DSMAL, $AC0.L - // 0388 16cd 0b80 si @DSPA, #0x0b80 - // 038a 16c9 0000 si @DSCR, #0x0000 - // 038c 16cb 00c0 si @DSBL, #0x00c0 - - // DMA 0xc0bytes from CPU @ ((pb.nextHi << 16) | pb.nextLo) to DRAM @ 0x0b80 - - // 038e 0082 0e08 lri $AR2, #0x0e08 - // 0390 009f 0000 lri $AC1.M, #0x0000 - // 0392 1b5f srri @$AR2, $AC1.M - // 0393 009f 0140 lri $AC1.M, #0x0140 - // 0395 1b5f srri @$AR2, $AC1.M - // 0396 009f 0280 lri $AC1.M, #0x0280 - // 0398 1b5f srri @$AR2, $AC1.M - // 0399 009f 0400 lri $AC1.M, #0x0400 - // 039b 1b5f srri @$AR2, $AC1.M - // 039c 009f 0540 lri $AC1.M, #0x0540 - // 039e 1b5f srri @$AR2, $AC1.M - // 039f 009f 0680 lri $AC1.M, #0x0680 - // 03a1 1b5f srri @$AR2, $AC1.M - // 03a2 009f 07c0 lri $AC1.M, #0x07c0 - // 03a4 1b5f srri @$AR2, $AC1.M - // 03a5 009f 0900 lri $AC1.M, #0x0900 - // 03a7 1b5f srri @$AR2, $AC1.M - // 03a8 009f 0a40 lri $AC1.M, #0x0a40 - // 03aa 1b5f srri @$AR2, $AC1.M - *0x0e08 = 0x0000 - *0x0e09 = 0x0140 - *0x0e0a = 0x0280 - *0x0e0b = 0x0400 - *0x0e0c = 0x0540 - *0x0e0d = 0x0680 - *0x0e0e = 0x07c0 - *0x0e0f = 0x0900 - *0x0e10 = 0x0a40 - - // 03ab 02bf 055c call 0x055c - WaitDMA(); - - // 03ad 00de 0ba7 lr $AC0.M, @0x0ba7 - // 03af 00df 0ba8 lr $AC1.M, @0x0ba8 - // 03b1 2ece srs @DSMAH, $AC0.M - // 03b2 2fcf srs @DSMAL, $AC1.M - // 03b3 16cd 03c0 si @DSPA, #0x03c0 - // 03b5 16c9 0000 si @DSCR, #0x0000 - // 03b7 16cb 0080 si @DSBL, #0x0080 - - // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0 - - // 03b9 8100 clr $ACC0 - // 03ba 8900 clr $ACC1 - - // 03bb 00de 0b84 lr $AC0.M, @0x0b84 - // 03bd 009f 0b31 lri $AC1.M, #0x0b31 - // 03bf 4c00 add $ACC0, $ACC1 - // 03c0 1c7e mrr $AR3, $AC0.M - // 03c1 0213 ilrr $AC0.M, @$AR3 - // 03c2 00fe 0e15 sr @0x0e15, $AC0.M - *0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src - - // 03c4 00de 0b85 lr $AC0.M, @0x0b85 - // 03c6 009f 0b34 lri $AC1.M, #0x0b34 - // 03c8 4c00 add $ACC0, $ACC1 - // 03c9 1c7e mrr $AR3, $AC0.M - // 03ca 0213 ilrr $AC0.M, @$AR3 - // 03cb 00fe 0e16 sr @0x0e16, $AC0.M - *0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table - - // 03cd 00de 0b86 lr $AC0.M, @0x0b86 - // 03cf 009f 0b11 lri $AC1.M, #0x0b11 - // 03d1 4c00 add $ACC0, $ACC1 - // 03d2 1c7e mrr $AR3, $AC0.M - // 03d3 0213 ilrr $AC0.M, @$AR3 - // 03d4 00fe 0e14 sr @0x0e14, $AC0.M - *0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer - - // 03d6 8100 clr $ACC0 - // 03d7 00de 0b9b lr $AC0.M, @0x0b9b - // 03d9 b100 tst $ACC0 - // 03da 0295 0403 jz 0x0403 - if (pb.itd.flag != AX_PB_ITD_OFF) { - // 03dc 8900 clr $ACC1 - // 03dd 00df 0b9e lr $AC1.M, @0x0b9e - // 03df 0300 0cc0 addi $AC1.M, #0x0cc0 - // 03e1 00ff 0e40 sr @0x0e40, $AC1.M - *0x0e40 = 0x0cc0 + pb.itd.shiftL - - // 03e3 00df 0b9f lr $AC1.M, @0x0b9f - // 03e5 0300 0cc0 addi $AC1.M, #0x0cc0 - // 03e7 00ff 0e41 sr @0x0e41, $AC1.M - *0x0e41 = 0x0cc0 + pb.itd.shiftR - - // 03e9 009f 0ce0 lri $AC1.M, #0x0ce0 - // 03eb 00ff 0e42 sr @0x0e42, $AC1.M - // 03ed 00ff 0e43 sr @0x0e43, $AC1.M - *0x0e42 = 0x0ce0 - *0x0e43 = 0x0ce0 - - // 03ef 02bf 055c call 0x055c - WaitDMA(); - - // 03f1 00de 0b9c lr $AC0.M, @0x0b9c - // 03f3 2ece srs @DSMAH, $AC0.M - // 03f4 00de 0b9d lr $AC0.M, @0x0b9d - // 03f6 2ecf srs @DSMAL, $AC0.M - // 03f7 16cd 0cc0 si @DSPA, #0x0cc0 - // 03f9 16c9 0000 si @DSCR, #0x0000 - // 03fb 16cb 0040 si @DSBL, #0x0040 - - // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo - - // 03fd 02bf 055c call 0x055c - WaitDMA(); - - // Restore CmdBlockBuf ptr - 03ff 00c0 0e07 lr $AR0, @0x0e07 - // 0401 029f 0248 jmp 0x0248 - goto Cmd_3() // Calls itself till there are no more PBs linked - - } else { - - // 0403 009f 0ce0 lri $AC1.M, #0x0ce0 - // 0405 00ff 0e42 sr @0x0e42, $AC1.M - // 0407 00ff 0e40 sr @0x0e40, $AC1.M - // 0409 00ff 0e41 sr @0x0e41, $AC1.M - // 040b 00ff 0e43 sr @0x0e43, $AC1.M - *0x0e42 = 0x0ce0 - *0x0e40 = 0x0ce0 - *0x0e41 = 0x0ce0 - *0x0e43 = 0x0ce0 - - // 040d 02bf 055c call 0x055c - WaitDMA(); - - // Restore CmdBlockBuf ptr - 040f 00c0 0e07 lr $AR0, @0x0e07 - // 0411 029f 0248 jmp 0x0248 - goto Cmd_3() // Calls itself till there are no more PBs linked - } -} - -void Cmd_4() { - 0413 8e00 set16 - - 0414 0086 0400 lri $IX2, #0x0400 // buffer in dram - - // 0416 8100 clr $ACC0 - // 0417 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 0418 191c lrri $AC0.L, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 0419 2ece srs @DSMAH, $AC0.M - // 041a 2ccf srs @DSMAL, $AC0.L - // 041b 1fc6 mrr $AC0.M, $IX2 - // 041c 2ecd srs @DSPA, $AC0.M - // 041d 16c9 0001 si @DSCR, #0x0001 - // 041f 16cb 0780 si @DSBL, #0x0780 - - // DMA 0x0780bytes from DRAM @ 0x0400 to CPU @ maddr - - // 0421 02bf 055c call 0x055c - WaitDMA(); - - 0423 02bf 0484 call 0x0484 - - // 0425 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_5() { - 0427 8e00 set16 - - 0428 0086 07c0 lri $IX2, #0x07c0 - - 042a 8100 clr $ACC0 - 042b 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 042c 191c lrri $AC0.L, @$AR0 - 042d 2ece srs @DSMAH, $AC0.M - 042e 2ccf srs @DSMAL, $AC0.L - 042f 1fc6 mrr $AC0.M, $IX2 - 0430 2ecd srs @DSPA, $AC0.M - 0431 16c9 0001 si @DSCR, #0x0001 - 0433 16cb 0780 si @DSBL, #0x0780 - - // 0435 02bf 055c call 0x055c - WaitDMA(); - - 0437 02bf 0484 call 0x0484 - - // 0439 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_E() { - 043b 8c00 clr15 - 043c 8a00 m2 - 043d 8100 clr $ACC0 - 043e 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 043f 191f lrri $AC1.M, @$AR0 - 0440 2ece srs @DSMAH, $AC0.M - 0441 2fcf srs @DSMAL, $AC1.M - 0442 16cd 0280 si @DSPA, #0x0280 - 0444 16c9 0001 si @DSCR, #0x0001 // DMEM -> CPU - 0446 16cb 0280 si @DSBL, #0x0280 - - 0448 8f50 set40'l : $AX0.H, @$AR0 - 0449 8140 clr'l $ACC0 : $AX0.L, @$AR0 - 044a 0081 0400 lri $AR1, #0x0400 - 044c 0083 0000 lri $AR3, #0x0000 - 044e 0082 0140 lri $AR2, #0x0140 - 0450 0099 0080 lri $AX1.L, #0x0080 - - // 0452 02bf 055c call 0x055c - WaitDMA(); - - 0454 1105 046c bloopi #0x05, 0x046c - 0456 1f61 mrr $AX1.H, $AR1 - - 0457 1120 045e bloopi #0x20, 0x045e - 0459 8972 clr'l $ACC1 : $AC0.M, @$AR2 - 045a 195c lrri $AC0.L, @$AR2 - 045b f07b lsl16'l $ACC0 : $AC1.M, @$AR3 - 045c 197d lrri $AC1.L, @$AR3 - 045d f131 lsl16's $ACC1 : @$AR1, $AC0.M - 045e 8139 clr's $ACC0 : @$AR1, $AC1.M - - 045f 8900 clr $ACC1 - 0460 6800 movax $ACC0, $AX0 - 0461 2ece srs @DSMAH, $AC0.M - 0462 2ccf srs @DSMAL, $AC0.L - 0463 1ffb mrr $AC1.M, $AX1.H - 0464 2fcd srs @DSPA, $AC1.M - 0465 0f01 lris $AC1.M, #0x01 - 0466 2fc9 srs @DSCR, $AC1.M - 0467 1ff9 mrr $AC1.M, $AX1.L - 0468 2fcb srs @DSBL, $AC1.M - 0469 7200 addaxl $ACC0, $AX1.L - 046a 1f5e mrr $AX0.H, $AC0.M - 046b 1f1c mrr $AX0.L, $AC0.L - 046c 8100 clr $ACC0 - - // 046d 26c9 lrs $AC0.M, @DSCR - // 046e 02a0 0004 andf $AC0.M, #0x0004 - // 0470 029c 046d jlnz 0x046d - while (@DSCR & 4); - - // 0472 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void UnimplimentedCmd_B() { - // 0474 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void UnimplimentedCmd_C() { - // 0476 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void UnimplimentedCmd_A() { - // 0478 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Task_Yield() { - // Send DSP_YIELD mail - // 047a 16fc dcd1 si @DMBH, #0xdcd1 - // 047c 16fd 0002 si @DMBL, #0x0002 - DMB = 0xdcd10002 - // 047e 16fb 0001 si @DIRQ, #0x0001 - - 0480 029f 0c91 jmp 0x0c91 -} - - // Unused? - // 0482 029f 0045 jmp 0x0045 - goto GetNextCmdBlock; - -// Called by cmds 4 5 9 -// IX2 is always modified before calling... -void UnkFunc() { - 0484 8e00 set16 - 0485 191f lrri $AC1.M, @$AR0 - 0486 191d lrri $AC1.L, @$AR0 - 0487 1f5f mrr $AX0.H, $AC1.M - 0488 1f1d mrr $AX0.L, $AC1.L - 0489 2fce srs @DSMAH, $AC1.M - 048a 2dcf srs @DSMAL, $AC1.L - 048b 8900 clr $ACC1 - 048c 1fa6 mrr $AC1.L, $IX2 - 048d 2dcd srs @DSPA, $AC1.L - 048e 0e00 lris $AC0.M, #0x00 - 048f 2ec9 srs @DSCR, $AC0.M - 0490 8100 clr $ACC0 - 0491 009c 00c0 lri $AC0.L, #0x00c0 - 0493 2ccb srs @DSBL, $AC0.L - 0494 1ca0 mrr $IX1, $AR0 - 0495 0081 0e44 lri $AR1, #0x0e44 - 0497 4800 addax $ACC0, $AX0 - 0498 1b3e srri @$AR1, $AC0.M - 0499 1b3c srri @$AR1, $AC0.L - 049a 0b00 lris $AX1.H, #0x00 - 049b 0099 0060 lri $AX1.L, #0x0060 - 049d 4b00 addax $ACC1, $AX1 - 049e 1b3d srri @$AR1, $AC1.L - 049f 0081 0e44 lri $AR1, #0x0e44 - 04a1 1c06 mrr $AR0, $IX2 - 04a2 0083 0000 lri $AR3, #0x0000 - 04a4 1c43 mrr $AR2, $AR3 - - 04a5 27c9 lrs $AC1.M, @DSCR - 04a6 03a0 0004 andf $AC1.M, #0x0004 - 04a8 029c 04a5 jlnz 0x04a5 - - 04aa 1109 04da bloopi #0x09, 0x04da - 04ac 8e00 set16 - 04ad 193a lrri $AX0.H, @$AR1 - 04ae 1938 lrri $AX0.L, @$AR1 - 04af 6900 movax $ACC1, $AX0 - 04b0 2fce srs @DSMAH, $AC1.M - 04b1 2dcf srs @DSMAL, $AC1.L - 04b2 8900 clr $ACC1 - 04b3 193d lrri $AC1.L, @$AR1 - 04b4 2dcd srs @DSPA, $AC1.L - 04b5 16c9 0000 si @DSCR, #0x0000 - 04b7 8100 clr $ACC0 - 04b8 009c 00c0 lri $AC0.L, #0x00c0 - 04ba 2ccb srs @DSBL, $AC0.L - 04bb 0081 0e44 lri $AR1, #0x0e44 - 04bd 4800 addax $ACC0, $AX0 - 04be 1b3e srri @$AR1, $AC0.M - 04bf 1b3c srri @$AR1, $AC0.L - 04c0 0b00 lris $AX1.H, #0x00 - 04c1 0960 lris $AX1.L, #0x60 - 04c2 4b00 addax $ACC1, $AX1 - 04c3 1b3d srri @$AR1, $AC1.L - 04c4 0081 0e44 lri $AR1, #0x0e44 - 04c6 8f00 set40 - 04c7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04c8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04c9 6a00 movax $ACC0, $AX1 - 04ca 4800 addax $ACC0, $AX0 - 04cb 1117 04d4 bloopi #0x17, 0x04d4 - 04cd 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04ce 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04cf 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 04d0 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 04d1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04d2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04d3 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 04d4 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 04d5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04d6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04d7 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 04d8 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 04d9 1b5f srri @$AR2, $AC1.M - 04da 1b5d srri @$AR2, $AC1.L - - 04db 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04dc 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04dd 6a00 movax $ACC0, $AX1 - 04de 4800 addax $ACC0, $AX0 - - 04df 1117 04e8 bloopi #0x17, 0x04e8 - 04e1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04e2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04e3 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 04e4 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 04e5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04e6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04e7 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 04e8 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - - 04e9 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 04ea 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 04eb 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 04ec 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 04ed 1b5f srri @$AR2, $AC1.M - 04ee 1b5d srri @$AR2, $AC1.L - 04ef 1c05 mrr $AR0, $IX1 - 04f0 02df ret -} - -// Only called by Command 1 -// AX0 = maddr -// AX1.L = unkForMulBuffer1 -// AR1 = unkForMulBuffer2 -void Unk(maddr, unkForMulBuffer1, unkForMulBuffer2) { - 04f1 8e00 set16 - - // 04f2 009b 0e44 lri $AX1.H, #0x0e44 - // 04f4 009d 00c0 lri $AC1.L, #0x00c0 - // 04f6 02bf 0541 call 0x0541 - u16 daddr = 0x0e44 - const u16 dma_len = 0x00c0 - DMA_CPUToDMEM(maddr, daddr, dma_len); - - // 04f8 4900 addax $ACC1, $AX0 - // 04f9 00ff 0e1d sr @0x0e1d, $AC1.M - // 04fb 00fd 0e1e sr @0x0e1e, $AC1.L - // 04fd 8900 clr $ACC1 - maddr += dma_len - - // 04fe 02bf 055c call 0x055c - WaitDMA(); - - // 0500 1104 052c bloopi #0x04, 0x052c - for (u8 i = 0; i < 4; i++) { - // 0502 00da 0e1d lr $AX0.H, @0x0e1d // restore - // 0504 00d8 0e1e lr $AX0.L, @0x0e1e // restore - // 0506 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2 - // 0508 009d 00c0 lri $AC1.L, #0x00c0 // restore - // 050a 02bf 0541 call 0x0541 - daddr = 0x0ea4 - DMA_CPUToDMEM(maddr, daddr, dma_len); - - // 050c 4900 addax $ACC1, $AX0 - // 050d 00ff 0e1d sr @0x0e1d, $AC1.M // update - // 050f 00fd 0e1e sr @0x0e1e, $AC1.L - maddr += dma_len - - // 0511 0083 0e44 lri $AR3, #0x0e44 - // 0513 02bf 054c call 0x054c - UnknownMulBuffer(0x0e44); - - // 0515 8900 clr $ACC1 - // 0516 00da 0e1d lr $AX0.H, @0x0e1d // restore - // 0518 00d8 0e1e lr $AX0.L, @0x0e1e // restore - // 051a 009b 0e44 lri $AX1.H, #0x0e44 // buffer 1 - // 051c 009d 00c0 lri $AC1.L, #0x00c0 // restore - // 051e 02bf 0541 call 0x0541 - daddr = 0x0e44 - DMA_CPUToDMEM(maddr, daddr, dma_len); - - // 0520 4900 addax $ACC1, $AX0 - // 0521 00ff 0e1d sr @0x0e1d, $AC1.M // update - // 0523 00fd 0e1e sr @0x0e1e, $AC1.L - maddr += dma_len - - // 0525 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2 - // 0527 02bf 054c call 0x054c - UnknownMulBuffer(0x0ea4); - - // 0529 0000 nop - // 052a 0000 nop - // 052b 8e00 set16 // restore - // 052c 8900 clr $ACC1 - } - - // 052d 00da 0e1d lr $AX0.H, @0x0e1d // restore - // 052f 00d8 0e1e lr $AX0.L, @0x0e1e // restore - // 0531 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2 - // 0533 009d 00c0 lri $AC1.L, #0x00c0 // restore - // 0535 02bf 0541 call 0x0541 - DMA_CPUToDMEM(maddr, daddr, dma_len); - - // 0537 4900 addax $ACC1, $AX0 - maddr += dma_len - - // 0538 0083 0e44 lri $AR3, #0x0e44 // buffer 1 - // 053a 02bf 054c call 0x054c - UnknownMulBuffer(0x0e44); - - // 053c 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2 - // 053e 02bf 054c call 0x054c - UnknownMulBuffer(0x0ea4); - - 0540 02df ret -} - -// u32 maddr = AX0 -// u16 daddr = AX1.H -// u16 len = AC1.L -// Only transfers from CPU -> DMEM -void DMA_CPUToDMEM() { - 0541 8e00 set16 - 0542 00fa ffce sr @DSMAH, $AX0.H - 0544 00f8 ffcf sr @DSMAL, $AX0.L - 0546 00fb ffcd sr @DSPA, $AX1.H - 0548 16c9 0000 si @DSCR, #0x0000 - 054a 2dcb srs @DSBL, $AC1.L - 054b 02df ret -} - -// IX1 = 0xffff -// AX1.L = unkForMulBuffer1 (next value in cmd block) -// AR1 = unkForMulBuffer2 (0, 0x0400, then 0x07c0) -// AR3 is some buffer, either 0x0e44 or 0x0ea4 -void UnknownMulBuffer() { - 054c 8f00 set40 // Loaded ACx.M values extend to the entire ACC - 054d 8d00 set15 // multiplicands unsigned - 054e 8a00 m2 // mul results doubled - - // 054f 197a lrri $AX0.H, @$AR3 - // 0550 1978 lrri $AX0.L, @$AR3 - AX0.H = *(AR3++) - AX0.L = *(AR3++) - - // 0551 a000 mulx $AX0.L, $AX1.L - // 0552 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2 - PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2 - - // 0553 1130 055a bloopi #0x30, 0x055a - for (int i=0; i<48; i++) { - // 0555 9179 asr16'l $ACC0 : $AC1.M, @$AR1 - ACC0 >>= 16 - AC1.M = *(unkForMulBuffer2++) - - // 0556 4e6d addp'ln $ACC0 : $AC1.L, @$AR1 - ACC0 += PROD - AC1.L = *unkForMulBuffer2 - unkForMulBuffer2 -= 1 - - // 0557 197a lrri $AX0.H, @$AR3 - AX0.H = *(AR3++) - - // 0558 4d43 add'l $ACC1, $ACC0 : $AX0.L, @$AR3 - ACC1 += ACC0 - AX0.L = *(AR3++) - - // 0559 a039 mulx's $AX0.L, $AX1.L : @$AR1, $AC1.M - // 055a b629 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR1, $AC1.L - ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2 - *(unkForMulBuffer2++) = AC1.M - PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2 - *(unkForMulBuffer2++) = AC1.L - } - - 055b 02df ret -} - -void WaitDMA() { - // 055c 26c9 lrs $AC0.M, @DSCR - // 055d 02a0 0004 andf $AC0.M, #0x0004 - // 055f 029c 055c jlnz 0x055c - while (@DSCR & 4); - - // 0561 02df ret - return; -} - -// All apparently unused? -void WaitForCPUMailbox() { - 0562 26fe lrs $AC0.M, @CMBH - 0563 02c0 8000 andcf $AC0.M, #0x8000 - 0565 029c 0562 jlnz 0x0562 - 0567 02df ret -} -void WaitForDSPMailbox1() { - 0568 26fc lrs $AC0.M, @DMBH - 0569 02a0 8000 andf $AC0.M, #0x8000 - 056b 029c 0568 jlnz 0x0568 - 056d 02df ret -} -void WaitForDSPMailbox2() { - 056e 26fc lrs $AC0.M, @DMBH - 056f 02a0 8000 andf $AC0.M, #0x8000 - 0571 029c 056e jlnz 0x056e - 0573 02df ret -} - -void Cmd_7() { - // 0574 8100 clr $ACC0 - // 0575 8970 clr'l $ACC1 : $AC0.M, @$AR0 - // 0576 8e60 set16'l : $AC0.L, @$AR0 - u16 maddrh = *(CmdBlockBuf++) - u16 maddrl = *(CmdBlockBuf++) - - // 0577 2ece srs @DSMAH, $AC0.M - // 0578 2ccf srs @DSMAL, $AC0.L - // 0579 16cd 0e44 si @DSPA, #0x0e44 - // 057b 16c9 0000 si @DSCR, #0x0000 - // 057d 8900 clr $ACC1 - // 057e 0d20 lris $AC1.L, #0x20 - u16 dma_len = 32 - - // 057f 2dcb srs @DSBL, $AC1.L - // DMA 32bytes from CPU @ maddr -> DMEM @ 0x0e44 - - // 0580 4c00 add $ACC0, $ACC1 - maddr += dma_len - - // Push CmdBlockBuf ptr - 0581 1c80 mrr $IX0, $AR0 - - // 0582 0080 0280 lri $AR0, #0x0280 - // 0584 0081 0000 lri $AR1, #0x0000 - // 0586 0082 0140 lri $AR2, #0x0140 - // 0588 0083 0e44 lri $AR3, #0x0e44 - u16* unk_buf1 = 0x0280 - u16* unk_buf2 = 0x0000 - u16* unk_buf3 = 0x0140 - u16* dmem_buf = 0x0e44 - - // 058a 0a00 lris $AX0.H, #0x00 - const u16 null = 0 // Guess is that it's faster to use AXx instead of imm value? - - // 058b 27c9 lrs $AC1.M, @DSCR - // 058c 03a0 0004 andf $AC1.M, #0x0004 - // 058e 029c 058b jlnz 0x058b - while (@DSCR & 4); // Wait for DMA completion - - // 0590 2ece srs @DSMAH, $AC0.M - // 0591 2ccf srs @DSMAL, $AC0.L - // 0592 16cd 0e54 si @DSPA, #0x0e54 - // 0594 16c9 0000 si @DSCR, #0x0000 - // 0596 16cb 0260 si @DSBL, #0x0260 - - // DMA 0x0260bytes from CPU @ maddr -> DMEM @ 0x0e54 - // No waiting for DMA - - // 0598 009f 00a0 lri $AC1.M, #0x00a0 - u16 size = 0x00a0 - - // accum loads in the loop are 40bit - // 059a 8f00 set40 - - // 059b 007f 05a4 bloop $AC1.M, 0x05a4 - for (int i = 0; i < size; i++) { - // !!! Doesn't make sense with current understanding of set40 - 059d 197e lrri $AC0.M, @$AR3 - 059e 1b1a srri @$AR0, $AX0.H - 059f 197c lrri $AC0.L, @$AR3 - 05a0 1b1a srri @$AR0, $AX0.H - 05a1 1b5e srri @$AR2, $AC0.M - 05a2 1b5c srri @$AR2, $AC0.L - 05a3 1b3e srri @$AR1, $AC0.M - 05a4 1b3c srri @$AR1, $AC0.L - } - - // Pop CmdBlockBuf ptr - 05a5 1c04 mrr $AR0, $IX0 - - // 05a6 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -# Following 3 funcs are the SRCs to select from, in order - -void SRC_Polyphase() { - // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs - // 05a8 0082 0bb8 lri $AR2, #0x0bb8 - // 05aa 195e lrri $AC0.M, @$AR2 - // 05ab 2ed1 srs @SampleFormat, $AC0.M - // 05ac 195e lrri $AC0.M, @$AR2 - // 05ad 2ed4 srs @ACSAH, $AC0.M - // 05ae 195e lrri $AC0.M, @$AR2 - // 05af 2ed5 srs @ACSAL, $AC0.M - // 05b0 195e lrri $AC0.M, @$AR2 - // 05b1 2ed6 srs @ACEAH, $AC0.M - // 05b2 195e lrri $AC0.M, @$AR2 - // 05b3 2ed7 srs @ACEAL, $AC0.M - // 05b4 195e lrri $AC0.M, @$AR2 - // 05b5 2ed8 srs @ACCAH, $AC0.M - // 05b6 195e lrri $AC0.M, @$AR2 - // 05b7 2ed9 srs @ACCAL, $AC0.M - // 05b8 195e lrri $AC0.M, @$AR2 - // 05b9 2ea0 srs @COEF_A1_0, $AC0.M - // 05ba 195e lrri $AC0.M, @$AR2 - // 05bb 2ea1 srs @COEF_A2_0, $AC0.M - // 05bc 195e lrri $AC0.M, @$AR2 - // 05bd 2ea2 srs @COEF_A1_1, $AC0.M - // 05be 195e lrri $AC0.M, @$AR2 - // 05bf 2ea3 srs @COEF_A2_1, $AC0.M - // 05c0 195e lrri $AC0.M, @$AR2 - // 05c1 2ea4 srs @COEF_A1_2, $AC0.M - // 05c2 195e lrri $AC0.M, @$AR2 - // 05c3 2ea5 srs @COEF_A2_2, $AC0.M - // 05c4 195e lrri $AC0.M, @$AR2 - // 05c5 2ea6 srs @COEF_A1_3, $AC0.M - // 05c6 195e lrri $AC0.M, @$AR2 - // 05c7 2ea7 srs @COEF_A2_3, $AC0.M - // 05c8 195e lrri $AC0.M, @$AR2 - // 05c9 2ea8 srs @COEF_A1_4, $AC0.M - // 05ca 195e lrri $AC0.M, @$AR2 - // 05cb 2ea9 srs @COEF_A2_4, $AC0.M - // 05cc 195e lrri $AC0.M, @$AR2 - // 05cd 2eaa srs @COEF_A1_5, $AC0.M - // 05ce 195e lrri $AC0.M, @$AR2 - // 05cf 2eab srs @COEF_A2_5, $AC0.M - // 05d0 195e lrri $AC0.M, @$AR2 - // 05d1 2eac srs @COEF_A1_6, $AC0.M - // 05d2 195e lrri $AC0.M, @$AR2 - // 05d3 2ead srs @COEF_A2_6, $AC0.M - // 05d4 195e lrri $AC0.M, @$AR2 - // 05d5 2eae srs @COEF_A1_7, $AC0.M - // 05d6 195e lrri $AC0.M, @$AR2 - // 05d7 2eaf srs @COEF_A2_7, $AC0.M - // 05d8 195e lrri $AC0.M, @$AR2 - // 05d9 2ede srs @GAIN, $AC0.M - // 05da 195e lrri $AC0.M, @$AR2 - // 05db 2eda srs @scale, $AC0.M - // 05dc 195e lrri $AC0.M, @$AR2 - // 05dd 2edb srs @yn1, $AC0.M - // 05de 195e lrri $AC0.M, @$AR2 - // 05df 2edc srs @yn2, $AC0.M - - 05e0 8c00 clr15 - 05e1 8a00 m2 - 05e2 8e00 set16 - 05e3 00d8 0e16 lr $AX0.L, @0x0e16 - 05e5 195b lrri $AX1.H, @$AR2 - 05e6 1959 lrri $AX1.L, @$AR2 - 05e7 8100 clr $ACC0 - 05e8 195c lrri $AC0.L, @$AR2 - 05e9 0080 0e44 lri $AR0, #0x0e44 - 05eb 195f lrri $AC1.M, @$AR2 - 05ec 1b1f srri @$AR0, $AC1.M - 05ed 195f lrri $AC1.M, @$AR2 - 05ee 1b1f srri @$AR0, $AC1.M - 05ef 195f lrri $AC1.M, @$AR2 - 05f0 1b1f srri @$AR0, $AC1.M - 05f1 185f lrr $AC1.M, @$AR2 - 05f2 1b1f srri @$AR0, $AC1.M - 05f3 6b00 movax $ACC1, $AX1 - 05f4 1505 lsl $ACC1, #5 - 05f5 4d00 add $ACC1, $ACC0 - 05f6 157e lsr $ACC1, #-2 - 05f7 1c9f mrr $IX0, $AC1.M - 05f8 1cbd mrr $IX1, $AC1.L - 05f9 05e0 addis $AC1.M, #0xe0 - 05fa 9900 asr16 $ACC1 - 05fb 7d00 neg $ACC1 - 05fc 1cdd mrr $IX2, $AC1.L - 05fd 8900 clr $ACC1 - 05fe 1fa5 mrr $AC1.L, $IX1 - 05ff 1502 lsl $ACC1, #2 - 0600 1cbf mrr $IX1, $AC1.M - 0601 009a 01fc lri $AX0.H, #0x01fc - 0603 009e 0e44 lri $AC0.M, #0x0e44 - 0605 0081 ffdd lri $AR1, #0xffdd - 0607 0083 0d80 lri $AR3, #0x0d80 - 0609 0064 061a bloop $IX0, 0x061a - 060b 1827 lrr $IX3, @$AR1 - 060c 1b07 srri @$AR0, $IX3 - 060d 4a00 addax $ACC0, $AX1 - 060e 1ffc mrr $AC1.M, $AC0.L - 060f 1827 lrr $IX3, @$AR1 - 0610 1b07 srri @$AR0, $IX3 - 0611 1579 lsr $ACC1, #-7 - 0612 3500 andr $AC1.M, $AX0.H - 0613 1827 lrr $IX3, @$AR1 - 0614 1b07 srri @$AR0, $IX3 - 0615 4100 addr $ACC1, $AX0.L - 0616 1b7e srri @$AR3, $AC0.M - 0617 1827 lrr $IX3, @$AR1 - 0618 1b07 srri @$AR0, $IX3 - 0619 1b7f srri @$AR3, $AC1.M - 061a 0000 nop - - 061b 0065 0620 bloop $IX1, 0x0620 - 061d 1827 lrr $IX3, @$AR1 - 061e 1b07 srri @$AR0, $IX3 - 061f 0000 nop - 0620 0000 nop - - 0621 0007 dar $AR3 - 0622 187f lrr $AC1.M, @$AR3 - 0623 0066 0629 bloop $IX2, 0x0629 - 0625 4a3b addax's $ACC0, $AX1.L : @$AR3, $AC1.M - 0626 1ffc mrr $AC1.M, $AC0.L - 0627 1579 lsr $ACC1, #-7 - 0628 3533 andr's $AC1.M, $AX0.H : @$AR3, $AC0.M - 0629 4100 addr $ACC1, $AX0.L - - 062a 1b7f srri @$AR3, $AC1.M - 062b 0004 dar $AR0 - 062c 189f lrrd $AC1.M, @$AR0 - 062d 1adf srrd @$AR2, $AC1.M - 062e 189f lrrd $AC1.M, @$AR0 - 062f 1adf srrd @$AR2, $AC1.M - 0630 189f lrrd $AC1.M, @$AR0 - 0631 1adf srrd @$AR2, $AC1.M - 0632 189f lrrd $AC1.M, @$AR0 - 0633 1adf srrd @$AR2, $AC1.M - 0634 1adc srrd @$AR2, $AC0.L - 0635 0082 0bd2 lri $AR2, #0x0bd2 - 0637 27dc lrs $AC1.M, @yn2 - 0638 1adf srrd @$AR2, $AC1.M - 0639 27db lrs $AC1.M, @yn1 - 063a 1adf srrd @$AR2, $AC1.M - 063b 27da lrs $AC1.M, @scale - 063c 1adf srrd @$AR2, $AC1.M - 063d 0082 0bbe lri $AR2, #0x0bbe - 063f 27d9 lrs $AC1.M, @ACCAL - 0640 1adf srrd @$AR2, $AC1.M - 0641 27d8 lrs $AC1.M, @ACCAH - 0642 1adf srrd @$AR2, $AC1.M - 0643 8f00 set40 - 0644 00c1 0e42 lr $AR1, @0x0e42 - 0646 0082 0d80 lri $AR2, #0x0d80 - 0648 1940 lrri $AR0, @$AR2 - 0649 1943 lrri $AR3, @$AR2 - 064a 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 064b b8c0 mulx'ld $AX0.H, $AX1.H : $AX0.L, $AX1.L, @$AR0 - 064c 111f 0654 bloopi #0x1f, 0x0654 - 064e a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 064f bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0650 1940 lrri $AR0, @$AR2 - 0651 1943 lrri $AR3, @$AR2 - 0652 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0653 4ec0 addp'ld $ACC0 : $AX0.L, $AX1.L, @$AR0 - 0654 b831 mulx's $AX0.H, $AX1.H : @$AR1, $AC0.M - - 0655 a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0656 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0657 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0658 4e00 addp $ACC0 - 0659 1b3e srri @$AR1, $AC0.M - 065a 00e1 0e42 sr @0x0e42, $AR1 - - 065c 02df ret -} - -void SRC_Linear() { - // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs - // 065d 0082 0bb8 lri $AR2, #0x0bb8 - // 065f 195e lrri $AC0.M, @$AR2 - // 0660 2ed1 srs @SampleFormat, $AC0.M - // 0661 195e lrri $AC0.M, @$AR2 - // 0662 2ed4 srs @ACSAH, $AC0.M - // 0663 195e lrri $AC0.M, @$AR2 - // 0664 2ed5 srs @ACSAL, $AC0.M - // 0665 195e lrri $AC0.M, @$AR2 - // 0666 2ed6 srs @ACEAH, $AC0.M - // 0667 195e lrri $AC0.M, @$AR2 - // 0668 2ed7 srs @ACEAL, $AC0.M - // 0669 195e lrri $AC0.M, @$AR2 - // 066a 2ed8 srs @ACCAH, $AC0.M - // 066b 195e lrri $AC0.M, @$AR2 - // 066c 2ed9 srs @ACCAL, $AC0.M - // 066d 195e lrri $AC0.M, @$AR2 - // 066e 2ea0 srs @COEF_A1_0, $AC0.M - // 066f 195e lrri $AC0.M, @$AR2 - // 0670 2ea1 srs @COEF_A2_0, $AC0.M - // 0671 195e lrri $AC0.M, @$AR2 - // 0672 2ea2 srs @COEF_A1_1, $AC0.M - // 0673 195e lrri $AC0.M, @$AR2 - // 0674 2ea3 srs @COEF_A2_1, $AC0.M - // 0675 195e lrri $AC0.M, @$AR2 - // 0676 2ea4 srs @COEF_A1_2, $AC0.M - // 0677 195e lrri $AC0.M, @$AR2 - // 0678 2ea5 srs @COEF_A2_2, $AC0.M - // 0679 195e lrri $AC0.M, @$AR2 - // 067a 2ea6 srs @COEF_A1_3, $AC0.M - // 067b 195e lrri $AC0.M, @$AR2 - // 067c 2ea7 srs @COEF_A2_3, $AC0.M - // 067d 195e lrri $AC0.M, @$AR2 - // 067e 2ea8 srs @COEF_A1_4, $AC0.M - // 067f 195e lrri $AC0.M, @$AR2 - // 0680 2ea9 srs @COEF_A2_4, $AC0.M - // 0681 195e lrri $AC0.M, @$AR2 - // 0682 2eaa srs @COEF_A1_5, $AC0.M - // 0683 195e lrri $AC0.M, @$AR2 - // 0684 2eab srs @COEF_A2_5, $AC0.M - // 0685 195e lrri $AC0.M, @$AR2 - // 0686 2eac srs @COEF_A1_6, $AC0.M - // 0687 195e lrri $AC0.M, @$AR2 - // 0688 2ead srs @COEF_A2_6, $AC0.M - // 0689 195e lrri $AC0.M, @$AR2 - // 068a 2eae srs @COEF_A1_7, $AC0.M - // 068b 195e lrri $AC0.M, @$AR2 - // 068c 2eaf srs @COEF_A2_7, $AC0.M - // 068d 195e lrri $AC0.M, @$AR2 - // 068e 2ede srs @GAIN, $AC0.M - // 068f 195e lrri $AC0.M, @$AR2 - // 0690 2eda srs @scale, $AC0.M - // 0691 195e lrri $AC0.M, @$AR2 - // 0692 2edb srs @yn1, $AC0.M - // 0693 195e lrri $AC0.M, @$AR2 - // 0694 2edc srs @yn2, $AC0.M - - // 0695 8c00 clr15 // signed mulx - // 0696 8a00 m2 // *2 - // 0697 8e00 set16 // no sign extend - - // 0698 195b lrri $AX1.H, @$AR2 - // 0699 1959 lrri $AX1.L, @$AR2 - // 069a 8100 clr $ACC0 - // 069b 195c lrri $AC0.L, @$AR2 - // 069c 0080 0e44 lri $AR0, #0x0e44 - // 069e 195f lrri $AC1.M, @$AR2 - // 069f 195f lrri $AC1.M, @$AR2 - // 06a0 195f lrri $AC1.M, @$AR2 - // 06a1 1b1f srri @$AR0, $AC1.M - AR0 = 0x0e44 - AX1.H = pb.src.ratioHi - AX1.L = pb.src.ratioLo - AC0.L = pb.src.currentAddressFrac - AC1.M = pb.src.last_samples[2] - - *0x0e44 = pb.src.last_samples[2] - *0x0e45 = pb.src.last_samples[3] - - // 06a2 185f lrr $AC1.M, @$AR2 - // 06a3 1b1f srri @$AR0, $AC1.M - // 06a4 6b00 movax $ACC1, $AX1 - // 06a5 1505 lsl $ACC1, #5 - // 06a6 4d00 add $ACC1, $ACC0 - // 06a7 157e lsr $ACC1, #-2 - // 06a8 1c9f mrr $IX0, $AC1.M - // 06a9 1cbd mrr $IX1, $AC1.L - ACC1 = (pb.src.currentAddressFrac + (pb.src.ratio << 5)) >> 2 - IX0 = ACC1 >> 16 - IX1 = ((ACC1 & 0xffff) & 0xc000) >> 14 - IX2 = ~((ACC1 >> 16) - 32) - AX0.H = 0x01fc - AC0.M = 0x0e45 - AR1 = 0xffdd // DSP_ACCELERATOR - AR3 = 0x0d80 - - // 06aa 05e0 addis $AC1.M, #0xe0 - // 06ab 9900 asr16 $ACC1 - // 06ac 7d00 neg $ACC1 - // 06ad 1cdd mrr $IX2, $AC1.L - // 06ae 8900 clr $ACC1 - // 06af 1fa5 mrr $AC1.L, $IX1 - // 06b0 1502 lsl $ACC1, #2 - // 06b1 1cbf mrr $IX1, $AC1.M - // 06b2 009a 01fc lri $AX0.H, #0x01fc - // 06b4 009e 0e45 lri $AC0.M, #0x0e45 - // 06b6 0081 ffdd lri $AR1, #0xffdd - // 06b8 0083 0d80 lri $AR3, #0x0d80 - // 06ba 0064 06cb bloop $IX0, 0x06cb - // 06bc 1827 lrr $IX3, @$AR1 - // 06bd 1b07 srri @$AR0, $IX3 - // 06be 4a00 addax $ACC0, $AX1 - // 06bf 1b7e srri @$AR3, $AC0.M - // 06c0 1827 lrr $IX3, @$AR1 - // 06c1 1b07 srri @$AR0, $IX3 - // 06c2 1b7c srri @$AR3, $AC0.L - // 06c3 0000 nop - // 06c4 1827 lrr $IX3, @$AR1 - // 06c5 1b07 srri @$AR0, $IX3 - // 06c6 0000 nop - // 06c7 0000 nop - // 06c8 1827 lrr $IX3, @$AR1 - // 06c9 1b07 srri @$AR0, $IX3 - // 06ca 0000 nop - // 06cb 0000 nop - ACCO = (0x0e45 << 16) + pb.src.currentAddressFrac - for (i = 0; i < IX0; i++) { - ACC0 += pb.src.ratio - *(0x0d80++) = ACC0 >> 16 - *(0x0d80++) = ACC0 & 0xffff - *(0x0e46++) = *DSP_ACCELERATOR - *(0x0e46++) = *DSP_ACCELERATOR - *(0x0e46++) = *DSP_ACCELERATOR - *(0x0e46++) = *DSP_ACCELERATOR - } - - // 06cc 0065 06d1 bloop $IX1, 0x06d1 - // 06ce 1827 lrr $IX3, @$AR1 - // 06cf 1b07 srri @$AR0, $IX3 - // 06d0 0000 nop - // 06d1 0000 nop - for (i = 0; i < IX1; i++) { - *(0x0e46++) = *DSP_ACCELERATOR - } - - // 06d2 0066 06d6 bloop $IX2, 0x06d6 - // 06d4 4a00 addax $ACC0, $AX1 - // 06d5 1b7e srri @$AR3, $AC0.M - // 06d6 1b7c srri @$AR3, $AC0.L - for (i = 0; i < IX2; i++) { - ACC0 += pb.src.ratio - *(0x0d80++) = ACC0 >> 16 - *(0x0d80++) = ACC0 & 0xffff - } - - // 06d7 0004 dar $AR0 - // 06d8 189f lrrd $AC1.M, @$AR0 - // 06d9 1adf srrd @$AR2, $AC1.M - // 06da 189f lrrd $AC1.M, @$AR0 - // 06db 1adf srrd @$AR2, $AC1.M - // 06dc 189f lrrd $AC1.M, @$AR0 - // 06dd 1adf srrd @$AR2, $AC1.M - // 06de 189f lrrd $AC1.M, @$AR0 - // 06df 1adf srrd @$AR2, $AC1.M - // 06e0 1adc srrd @$AR2, $AC0.L - *(0x0e46++)-- - pb.src.last_samples[3] = *(0x0e46--) - pb.src.last_samples[2] = *(0x0e46--) - pb.src.last_samples[1] = *(0x0e46--) - pb.src.last_samples[0] = *(0x0e46--) - pb.src.currentAddressFrac = ACC0 & 0xffff - - // 06e1 0082 0bd2 lri $AR2, #0x0bd2 - // 06e3 27dc lrs $AC1.M, @yn2 - // 06e4 1adf srrd @$AR2, $AC1.M - // 06e5 27db lrs $AC1.M, @yn1 - // 06e6 1adf srrd @$AR2, $AC1.M - // 06e7 27da lrs $AC1.M, @scale - // 06e8 1adf srrd @$AR2, $AC1.M - // 06e9 0082 0bbe lri $AR2, #0x0bbe - // 06eb 27d9 lrs $AC1.M, @ACCAL - // 06ec 1adf srrd @$AR2, $AC1.M - // 06ed 27d8 lrs $AC1.M, @ACCAH - // 06ee 1adf srrd @$AR2, $AC1.M - pb.adpm.yn2 = *yn2 - pb.adpm.yn1 = *yn1 - pb.adpm.pred_scale = *scale - pb.addr.currentAddressLo = *ACCAL // Current playback position - pb.addr.currentAddressHi = *ACCAH - - 06ef 8d00 set15 // unsigned mulx - 06f0 8b00 m0 // no *2 - 06f1 8f00 set40 // sign extend - 06f2 00c1 0e42 lr $AR1, @0x0e42 - 06f4 0082 0d80 lri $AR2, #0x0d80 - 06f6 8100 clr $ACC0 - 06f7 1120 0703 bloopi #0x20, 0x0703 - 06f9 8900 clr $ACC1 - 06fa 1940 lrri $AR0, @$AR2 - 06fb 189e lrrd $AC0.M, @$AR0 - 06fc 181b lrr $AX1.H, @$AR0 - 06fd 199a lrrn $AX0.H, @$AR0 - 06fe 5400 subr $ACC0, $AX0.H - 06ff 1f5e mrr $AX0.H, $AC0.M - 0700 1959 lrri $AX1.L, @$AR2 - 0701 b000 mulx $AX0.H, $AX1.L - 0702 fb00 addpaxz $ACC1, $AX1 - 0703 8139 clr's $ACC0 : @$AR1, $AC1.M - - 0704 00e1 0e42 sr @0x0e42, $AR1 - - 0706 02df ret -} - -void SRC_None() { - // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs - // 0707 0082 0bb8 lri $AR2, #0x0bb8 - // 0709 195e lrri $AC0.M, @$AR2 - // 070a 2ed1 srs @SampleFormat, $AC0.M - // 070b 195e lrri $AC0.M, @$AR2 - // 070c 2ed4 srs @ACSAH, $AC0.M - // 070d 195e lrri $AC0.M, @$AR2 - // 070e 2ed5 srs @ACSAL, $AC0.M - // 070f 195e lrri $AC0.M, @$AR2 - // 0710 2ed6 srs @ACEAH, $AC0.M - // 0711 195e lrri $AC0.M, @$AR2 - // 0712 2ed7 srs @ACEAL, $AC0.M - // 0713 195e lrri $AC0.M, @$AR2 - // 0714 2ed8 srs @ACCAH, $AC0.M - // 0715 195e lrri $AC0.M, @$AR2 - // 0716 2ed9 srs @ACCAL, $AC0.M - // 0717 195e lrri $AC0.M, @$AR2 - // 0718 2ea0 srs @COEF_A1_0, $AC0.M - // 0719 195e lrri $AC0.M, @$AR2 - // 071a 2ea1 srs @COEF_A2_0, $AC0.M - // 071b 195e lrri $AC0.M, @$AR2 - // 071c 2ea2 srs @COEF_A1_1, $AC0.M - // 071d 195e lrri $AC0.M, @$AR2 - // 071e 2ea3 srs @COEF_A2_1, $AC0.M - // 071f 195e lrri $AC0.M, @$AR2 - // 0720 2ea4 srs @COEF_A1_2, $AC0.M - // 0721 195e lrri $AC0.M, @$AR2 - // 0722 2ea5 srs @COEF_A2_2, $AC0.M - // 0723 195e lrri $AC0.M, @$AR2 - // 0724 2ea6 srs @COEF_A1_3, $AC0.M - // 0725 195e lrri $AC0.M, @$AR2 - // 0726 2ea7 srs @COEF_A2_3, $AC0.M - // 0727 195e lrri $AC0.M, @$AR2 - // 0728 2ea8 srs @COEF_A1_4, $AC0.M - // 0729 195e lrri $AC0.M, @$AR2 - // 072a 2ea9 srs @COEF_A2_4, $AC0.M - // 072b 195e lrri $AC0.M, @$AR2 - // 072c 2eaa srs @COEF_A1_5, $AC0.M - // 072d 195e lrri $AC0.M, @$AR2 - // 072e 2eab srs @COEF_A2_5, $AC0.M - // 072f 195e lrri $AC0.M, @$AR2 - // 0730 2eac srs @COEF_A1_6, $AC0.M - // 0731 195e lrri $AC0.M, @$AR2 - // 0732 2ead srs @COEF_A2_6, $AC0.M - // 0733 195e lrri $AC0.M, @$AR2 - // 0734 2eae srs @COEF_A1_7, $AC0.M - // 0735 195e lrri $AC0.M, @$AR2 - // 0736 2eaf srs @COEF_A2_7, $AC0.M - // 0737 195e lrri $AC0.M, @$AR2 - // 0738 2ede srs @GAIN, $AC0.M - // 0739 195e lrri $AC0.M, @$AR2 - // 073a 2eda srs @scale, $AC0.M - // 073b 195e lrri $AC0.M, @$AR2 - // 073c 2edb srs @yn1, $AC0.M - // 073d 195e lrri $AC0.M, @$AR2 - // 073e 2edc srs @yn2, $AC0.M - - // 073f 00c0 0e42 lr $AR0, @0x0e42 - // 0741 0081 ffdd lri $AR1, #0xffdd // DSP_ACCELERATOR - // 0743 1120 0748 bloopi #0x20, 0x0748 - // 0745 1824 lrr $IX0, @$AR1 - // 0746 1b04 srri @$AR0, $IX0 - // 0747 0000 nop - // 0748 0000 nop - // 0749 00e0 0e42 sr @0x0e42, $AR0 - - u16 i = *0x0e42 - for (; i < ((*0x0e42) + 0x20); i++) { - *i = *DSP_ACCELERATOR - } - *0x0e42 = i - - // 074b 0082 0bd9 lri $AR2, #0x0bd9 // pb.src.last_samples[3] - // 074d 0004 dar $AR0 - // 074e 189f lrrd $AC1.M, @$AR0 - // 074f 1adf srrd @$AR2, $AC1.M - // 0750 189f lrrd $AC1.M, @$AR0 - // 0751 1adf srrd @$AR2, $AC1.M - // 0752 189f lrrd $AC1.M, @$AR0 - // 0753 1adf srrd @$AR2, $AC1.M - // 0754 189f lrrd $AC1.M, @$AR0 - // 0755 1adf srrd @$AR2, $AC1.M - // 0756 8900 clr $ACC1 - // 0757 1adc srrd @$AR2, $AC0.L // uhhh assume AC0.L is 0? - i-- // Guess that 0x0e42 points to struct of 1 pointer and 32 values - pb.src.last_samples[3] = *(i--) - pb.src.last_samples[2] = *(i--) - pb.src.last_samples[1] = *(i--) - pb.src.last_samples[0] = *(i--) - pb.src.currentAddressFrac = 0 - - // 0758 27dc lrs $AC1.M, @yn2 - // 0759 00ff 0bd2 sr @0x0bd2, $AC1.M - // 075b 27db lrs $AC1.M, @yn1 - // 075c 00ff 0bd1 sr @0x0bd1, $AC1.M - // 075e 27da lrs $AC1.M, @scale - // 075f 00ff 0bd0 sr @0x0bd0, $AC1.M - // 0761 27d9 lrs $AC1.M, @ACCAL - // 0762 00ff 0bbe sr @0x0bbe, $AC1.M - // 0764 27d8 lrs $AC1.M, @ACCAH - // 0765 00ff 0bbd sr @0x0bbd, $AC1.M - pb.adpm.yn2 = *yn2 - pb.adpm.yn1 = *yn1 - pb.adpm.pred_scale = *scale - pb.addr.currentAddressLo = *ACCAL // Current playback position - pb.addr.currentAddressHi = *ACCAH - - 0767 02df ret -} - - -# From here to the jump tables, all the funcs just wrap calls to mixer(s) in IROM - -void Mixer_0() { - 0768 00c0 0e40 lr $AR0, @0x0e40 - 076a 0081 0b89 lri $AR1, #0x0b89 - 076c 00c2 0e08 lr $AR2, @0x0e08 - 076e 1c62 mrr $AR3, $AR2 - 076f 00c4 0e41 lr $IX0, @0x0e41 - 0771 00c5 0e09 lr $IX1, @0x0e09 - 0773 02bf 80e7 call 0x80e7 - 0775 00f8 0ba9 sr @0x0ba9, $AX0.L - 0777 00fb 0bac sr @0x0bac, $AX1.H - 0779 02df ret -} - -void Mixer_1() { - 077a 00c0 0e40 lr $AR0, @0x0e40 - 077c 0081 0b89 lri $AR1, #0x0b89 - 077e 00c2 0e08 lr $AR2, @0x0e08 - 0780 1c62 mrr $AR3, $AR2 - 0781 00c4 0e41 lr $IX0, @0x0e41 - 0783 00c5 0e09 lr $IX1, @0x0e09 - 0785 02bf 80e7 call 0x80e7 - 0787 00f8 0ba9 sr @0x0ba9, $AX0.L - 0789 00fb 0bac sr @0x0bac, $AX1.H - 078b 00c0 0e40 lr $AR0, @0x0e40 - 078d 0081 0b8d lri $AR1, #0x0b8d - 078f 00c2 0e0b lr $AR2, @0x0e0b - 0791 1c62 mrr $AR3, $AR2 - 0792 00c4 0e41 lr $IX0, @0x0e41 - 0794 00c5 0e0c lr $IX1, @0x0e0c - 0796 02bf 80e7 call 0x80e7 - 0798 00f8 0baa sr @0x0baa, $AX0.L - 079a 00fb 0bad sr @0x0bad, $AX1.H - 079c 02df ret -} - -void Mixer_2() { - 079d 00c0 0e40 lr $AR0, @0x0e40 - 079f 0081 0b89 lri $AR1, #0x0b89 - 07a1 00c2 0e08 lr $AR2, @0x0e08 - 07a3 1c62 mrr $AR3, $AR2 - 07a4 00c4 0e41 lr $IX0, @0x0e41 - 07a6 00c5 0e09 lr $IX1, @0x0e09 - 07a8 02bf 80e7 call 0x80e7 - 07aa 00f8 0ba9 sr @0x0ba9, $AX0.L - 07ac 00fb 0bac sr @0x0bac, $AX1.H - 07ae 00c0 0e40 lr $AR0, @0x0e40 - 07b0 0081 0b91 lri $AR1, #0x0b91 - 07b2 00c2 0e0e lr $AR2, @0x0e0e - 07b4 1c62 mrr $AR3, $AR2 - 07b5 00c4 0e41 lr $IX0, @0x0e41 - 07b7 00c5 0e0f lr $IX1, @0x0e0f - 07b9 02bf 80e7 call 0x80e7 - 07bb 00f8 0bab sr @0x0bab, $AX0.L - 07bd 00fb 0bae sr @0x0bae, $AX1.H - 07bf 02df ret -} - -void Unk() { - 07c0 00c0 0e40 lr $AR0, @0x0e40 - 07c2 0081 0b89 lri $AR1, #0x0b89 - 07c4 00c2 0e08 lr $AR2, @0x0e08 - 07c6 1c62 mrr $AR3, $AR2 - 07c7 00c4 0e41 lr $IX0, @0x0e41 - 07c9 00c5 0e09 lr $IX1, @0x0e09 - 07cb 02bf 80e7 call 0x80e7 - 07cd 00f8 0ba9 sr @0x0ba9, $AX0.L - 07cf 00fb 0bac sr @0x0bac, $AX1.H - 07d1 00c0 0e40 lr $AR0, @0x0e40 - 07d3 0081 0b8d lri $AR1, #0x0b8d - 07d5 00c2 0e0b lr $AR2, @0x0e0b - 07d7 1c62 mrr $AR3, $AR2 - 07d8 00c4 0e41 lr $IX0, @0x0e41 - 07da 00c5 0e0c lr $IX1, @0x0e0c - 07dc 02bf 80e7 call 0x80e7 - 07de 00f8 0baa sr @0x0baa, $AX0.L - 07e0 00fb 0bad sr @0x0bad, $AX1.H - 07e2 00c0 0e40 lr $AR0, @0x0e40 - 07e4 0081 0b91 lri $AR1, #0x0b91 - 07e6 00c2 0e0e lr $AR2, @0x0e0e - 07e8 1c62 mrr $AR3, $AR2 - 07e9 00c4 0e41 lr $IX0, @0x0e41 - 07eb 00c5 0e0f lr $IX1, @0x0e0f - 07ed 02bf 80e7 call 0x80e7 - 07ef 00f8 0bab sr @0x0bab, $AX0.L - 07f1 00fb 0bae sr @0x0bae, $AX1.H - 07f3 02df ret -} - -void Unk() { - 07f4 00c0 0e40 lr $AR0, @0x0e40 - 07f6 0081 0b89 lri $AR1, #0x0b89 - 07f8 00c2 0e08 lr $AR2, @0x0e08 - 07fa 1c62 mrr $AR3, $AR2 - 07fb 00c4 0e41 lr $IX0, @0x0e41 - 07fd 00c5 0e09 lr $IX1, @0x0e09 - 07ff 02bf 80e7 call 0x80e7 - 0801 00f8 0ba9 sr @0x0ba9, $AX0.L - 0803 00fb 0bac sr @0x0bac, $AX1.H - 0805 00c0 0e43 lr $AR0, @0x0e43 - 0807 0081 0b97 lri $AR1, #0x0b97 - 0809 00c2 0e0a lr $AR2, @0x0e0a - 080b 1c62 mrr $AR3, $AR2 - 080c 02bf 81f9 call 0x81f9 - 080e 00f8 0baf sr @0x0baf, $AX0.L - 0810 02df ret -} - -void Unk() { - 0811 00c0 0e40 lr $AR0, @0x0e40 - 0813 0081 0b89 lri $AR1, #0x0b89 - 0815 00c2 0e08 lr $AR2, @0x0e08 - 0817 1c62 mrr $AR3, $AR2 - 0818 00c4 0e41 lr $IX0, @0x0e41 - 081a 00c5 0e09 lr $IX1, @0x0e09 - 081c 02bf 80e7 call 0x80e7 - 081e 00f8 0ba9 sr @0x0ba9, $AX0.L - 0820 00fb 0bac sr @0x0bac, $AX1.H - 0822 00c0 0e40 lr $AR0, @0x0e40 - 0824 0081 0b8d lri $AR1, #0x0b8d - 0826 00c2 0e0b lr $AR2, @0x0e0b - 0828 1c62 mrr $AR3, $AR2 - 0829 00c4 0e41 lr $IX0, @0x0e41 - 082b 00c5 0e0c lr $IX1, @0x0e0c - 082d 02bf 80e7 call 0x80e7 - 082f 00f8 0baa sr @0x0baa, $AX0.L - 0831 00fb 0bad sr @0x0bad, $AX1.H - 0833 00c0 0e43 lr $AR0, @0x0e43 - 0835 0081 0b97 lri $AR1, #0x0b97 - 0837 00c2 0e0a lr $AR2, @0x0e0a - 0839 1c62 mrr $AR3, $AR2 - 083a 1c80 mrr $IX0, $AR0 - 083b 00c5 0e0d lr $IX1, @0x0e0d - 083d 02bf 80e7 call 0x80e7 - 083f 00f8 0baf sr @0x0baf, $AX0.L - 0841 00fb 0bb0 sr @0x0bb0, $AX1.H - 0843 02df ret -} - -void Unk() { - 0844 00c0 0e40 lr $AR0, @0x0e40 - 0846 0081 0b89 lri $AR1, #0x0b89 - 0848 00c2 0e08 lr $AR2, @0x0e08 - 084a 1c62 mrr $AR3, $AR2 - 084b 00c4 0e41 lr $IX0, @0x0e41 - 084d 00c5 0e09 lr $IX1, @0x0e09 - 084f 02bf 80e7 call 0x80e7 - 0851 00f8 0ba9 sr @0x0ba9, $AX0.L - 0853 00fb 0bac sr @0x0bac, $AX1.H - 0855 00c0 0e40 lr $AR0, @0x0e40 - 0857 0081 0b91 lri $AR1, #0x0b91 - 0859 00c2 0e0e lr $AR2, @0x0e0e - 085b 1c62 mrr $AR3, $AR2 - 085c 00c4 0e41 lr $IX0, @0x0e41 - 085e 00c5 0e0f lr $IX1, @0x0e0f - 0860 02bf 80e7 call 0x80e7 - 0862 00f8 0bab sr @0x0bab, $AX0.L - 0864 00fb 0bae sr @0x0bae, $AX1.H - 0866 00c0 0e43 lr $AR0, @0x0e43 - 0868 0081 0b95 lri $AR1, #0x0b95 - 086a 00c2 0e10 lr $AR2, @0x0e10 - 086c 1c62 mrr $AR3, $AR2 - 086d 1c80 mrr $IX0, $AR0 - 086e 00c5 0e0a lr $IX1, @0x0e0a - 0870 02bf 80e7 call 0x80e7 - 0872 00f8 0bb1 sr @0x0bb1, $AX0.L - 0874 00fb 0baf sr @0x0baf, $AX1.H - 0876 02df ret -} - -void Unk() { - 0877 00c0 0e40 lr $AR0, @0x0e40 - 0879 0081 0b89 lri $AR1, #0x0b89 - 087b 00c2 0e08 lr $AR2, @0x0e08 - 087d 1c62 mrr $AR3, $AR2 - 087e 00c4 0e41 lr $IX0, @0x0e41 - 0880 00c5 0e09 lr $IX1, @0x0e09 - 0882 02bf 80e7 call 0x80e7 - 0884 00f8 0ba9 sr @0x0ba9, $AX0.L - 0886 00fb 0bac sr @0x0bac, $AX1.H - 0888 00c0 0e40 lr $AR0, @0x0e40 - 088a 0081 0b8d lri $AR1, #0x0b8d - 088c 00c2 0e0b lr $AR2, @0x0e0b - 088e 1c62 mrr $AR3, $AR2 - 088f 00c4 0e41 lr $IX0, @0x0e41 - 0891 00c5 0e0c lr $IX1, @0x0e0c - 0893 02bf 80e7 call 0x80e7 - 0895 00f8 0baa sr @0x0baa, $AX0.L - 0897 00fb 0bad sr @0x0bad, $AX1.H - 0899 00c0 0e40 lr $AR0, @0x0e40 - 089b 0081 0b91 lri $AR1, #0x0b91 - 089d 00c2 0e0e lr $AR2, @0x0e0e - 089f 1c62 mrr $AR3, $AR2 - 08a0 00c4 0e41 lr $IX0, @0x0e41 - 08a2 00c5 0e0f lr $IX1, @0x0e0f - 08a4 02bf 80e7 call 0x80e7 - 08a6 00f8 0bab sr @0x0bab, $AX0.L - 08a8 00fb 0bae sr @0x0bae, $AX1.H - 08aa 00c0 0e43 lr $AR0, @0x0e43 - 08ac 0081 0b97 lri $AR1, #0x0b97 - 08ae 00c2 0e0a lr $AR2, @0x0e0a - 08b0 1c62 mrr $AR3, $AR2 - 08b1 1c80 mrr $IX0, $AR0 - 08b2 00c5 0e0d lr $IX1, @0x0e0d - 08b4 02bf 80e7 call 0x80e7 - 08b6 00f8 0baf sr @0x0baf, $AX0.L - 08b8 00fb 0bb0 sr @0x0bb0, $AX1.H - 08ba 00c0 0e43 lr $AR0, @0x0e43 - 08bc 0081 0b95 lri $AR1, #0x0b95 - 08be 00c2 0e10 lr $AR2, @0x0e10 - 08c0 1c62 mrr $AR3, $AR2 - 08c1 02bf 81f9 call 0x81f9 - 08c3 00f8 0bb1 sr @0x0bb1, $AX0.L - 08c5 02df ret -} - -void Unk() { - 08c6 00c0 0e40 lr $AR0, @0x0e40 - 08c8 0081 0b89 lri $AR1, #0x0b89 - 08ca 00c2 0e08 lr $AR2, @0x0e08 - 08cc 0083 0e44 lri $AR3, #0x0e44 - 08ce 00c4 0e41 lr $IX0, @0x0e41 - 08d0 00c5 0e09 lr $IX1, @0x0e09 - 08d2 02bf 8282 call 0x8282 - 08d4 00f8 0ba9 sr @0x0ba9, $AX0.L - 08d6 00fb 0bac sr @0x0bac, $AX1.H - 08d8 02df ret -} - -void Unk() { - 08d9 00c0 0e40 lr $AR0, @0x0e40 - 08db 0081 0b89 lri $AR1, #0x0b89 - 08dd 00c2 0e08 lr $AR2, @0x0e08 - 08df 0083 0e44 lri $AR3, #0x0e44 - 08e1 00c4 0e41 lr $IX0, @0x0e41 - 08e3 00c5 0e09 lr $IX1, @0x0e09 - 08e5 02bf 8282 call 0x8282 - 08e7 00f8 0ba9 sr @0x0ba9, $AX0.L - 08e9 00fb 0bac sr @0x0bac, $AX1.H - 08eb 00c0 0e40 lr $AR0, @0x0e40 - 08ed 0081 0b8d lri $AR1, #0x0b8d - 08ef 00c2 0e0b lr $AR2, @0x0e0b - 08f1 0083 0e44 lri $AR3, #0x0e44 - 08f3 00c4 0e41 lr $IX0, @0x0e41 - 08f5 00c5 0e0c lr $IX1, @0x0e0c - 08f7 02bf 8282 call 0x8282 - 08f9 00f8 0baa sr @0x0baa, $AX0.L - 08fb 00fb 0bad sr @0x0bad, $AX1.H - 08fd 02df ret -} - -void Unk() { - 08fe 00c0 0e40 lr $AR0, @0x0e40 - 0900 0081 0b89 lri $AR1, #0x0b89 - 0902 00c2 0e08 lr $AR2, @0x0e08 - 0904 0083 0e44 lri $AR3, #0x0e44 - 0906 00c4 0e41 lr $IX0, @0x0e41 - 0908 00c5 0e09 lr $IX1, @0x0e09 - 090a 02bf 8282 call 0x8282 - 090c 00f8 0ba9 sr @0x0ba9, $AX0.L - 090e 00fb 0bac sr @0x0bac, $AX1.H - 0910 00c0 0e40 lr $AR0, @0x0e40 - 0912 0081 0b91 lri $AR1, #0x0b91 - 0914 00c2 0e0e lr $AR2, @0x0e0e - 0916 0083 0e44 lri $AR3, #0x0e44 - 0918 00c4 0e41 lr $IX0, @0x0e41 - 091a 00c5 0e0f lr $IX1, @0x0e0f - 091c 02bf 8282 call 0x8282 - 091e 00f8 0bab sr @0x0bab, $AX0.L - 0920 00fb 0bae sr @0x0bae, $AX1.H - 0922 02df ret -} - -void Unk() { - 0923 00c0 0e40 lr $AR0, @0x0e40 - 0925 0081 0b89 lri $AR1, #0x0b89 - 0927 00c2 0e08 lr $AR2, @0x0e08 - 0929 0083 0e44 lri $AR3, #0x0e44 - 092b 00c4 0e41 lr $IX0, @0x0e41 - 092d 00c5 0e09 lr $IX1, @0x0e09 - 092f 02bf 8282 call 0x8282 - 0931 00f8 0ba9 sr @0x0ba9, $AX0.L - 0933 00fb 0bac sr @0x0bac, $AX1.H - 0935 00c0 0e40 lr $AR0, @0x0e40 - 0937 0081 0b8d lri $AR1, #0x0b8d - 0939 00c2 0e0b lr $AR2, @0x0e0b - 093b 0083 0e44 lri $AR3, #0x0e44 - 093d 00c4 0e41 lr $IX0, @0x0e41 - 093f 00c5 0e0c lr $IX1, @0x0e0c - 0941 02bf 8282 call 0x8282 - 0943 00f8 0baa sr @0x0baa, $AX0.L - 0945 00fb 0bad sr @0x0bad, $AX1.H - 0947 00c0 0e40 lr $AR0, @0x0e40 - 0949 0081 0b91 lri $AR1, #0x0b91 - 094b 00c2 0e0e lr $AR2, @0x0e0e - 094d 0083 0e44 lri $AR3, #0x0e44 - 094f 00c4 0e41 lr $IX0, @0x0e41 - 0951 00c5 0e0f lr $IX1, @0x0e0f - 0953 02bf 8282 call 0x8282 - 0955 00f8 0bab sr @0x0bab, $AX0.L - 0957 00fb 0bae sr @0x0bae, $AX1.H - 0959 02df ret -} - -void Unk() { - 095a 00c0 0e40 lr $AR0, @0x0e40 - 095c 0081 0b89 lri $AR1, #0x0b89 - 095e 00c2 0e08 lr $AR2, @0x0e08 - 0960 0083 0e44 lri $AR3, #0x0e44 - 0962 00c4 0e41 lr $IX0, @0x0e41 - 0964 00c5 0e09 lr $IX1, @0x0e09 - 0966 02bf 8282 call 0x8282 - 0968 00f8 0ba9 sr @0x0ba9, $AX0.L - 096a 00fb 0bac sr @0x0bac, $AX1.H - 096c 00c0 0e43 lr $AR0, @0x0e43 - 096e 0081 0b97 lri $AR1, #0x0b97 - 0970 00c2 0e0a lr $AR2, @0x0e0a - 0972 0083 0e44 lri $AR3, #0x0e44 - 0974 02bf 845d call 0x845d - 0976 00f8 0baf sr @0x0baf, $AX0.L - 0978 02df ret -} - -void Unk() { - 0979 00c0 0e40 lr $AR0, @0x0e40 - 097b 0081 0b89 lri $AR1, #0x0b89 - 097d 00c2 0e08 lr $AR2, @0x0e08 - 097f 0083 0e44 lri $AR3, #0x0e44 - 0981 00c4 0e41 lr $IX0, @0x0e41 - 0983 00c5 0e09 lr $IX1, @0x0e09 - 0985 02bf 8282 call 0x8282 - 0987 00f8 0ba9 sr @0x0ba9, $AX0.L - 0989 00fb 0bac sr @0x0bac, $AX1.H - 098b 00c0 0e40 lr $AR0, @0x0e40 - 098d 0081 0b8d lri $AR1, #0x0b8d - 098f 00c2 0e0b lr $AR2, @0x0e0b - 0991 0083 0e44 lri $AR3, #0x0e44 - 0993 00c4 0e41 lr $IX0, @0x0e41 - 0995 00c5 0e0c lr $IX1, @0x0e0c - 0997 02bf 8282 call 0x8282 - 0999 00f8 0baa sr @0x0baa, $AX0.L - 099b 00fb 0bad sr @0x0bad, $AX1.H - 099d 00c0 0e43 lr $AR0, @0x0e43 - 099f 0081 0b97 lri $AR1, #0x0b97 - 09a1 00c2 0e0a lr $AR2, @0x0e0a - 09a3 0083 0e44 lri $AR3, #0x0e44 - 09a5 1c80 mrr $IX0, $AR0 - 09a6 00c5 0e0d lr $IX1, @0x0e0d - 09a8 02bf 8282 call 0x8282 - 09aa 00f8 0baf sr @0x0baf, $AX0.L - 09ac 00fb 0bb0 sr @0x0bb0, $AX1.H - 09ae 02df ret -} - -void Unk() { - 09af 00c0 0e40 lr $AR0, @0x0e40 - 09b1 0081 0b89 lri $AR1, #0x0b89 - 09b3 00c2 0e08 lr $AR2, @0x0e08 - 09b5 0083 0e44 lri $AR3, #0x0e44 - 09b7 00c4 0e41 lr $IX0, @0x0e41 - 09b9 00c5 0e09 lr $IX1, @0x0e09 - 09bb 02bf 8282 call 0x8282 - 09bd 00f8 0ba9 sr @0x0ba9, $AX0.L - 09bf 00fb 0bac sr @0x0bac, $AX1.H - 09c1 00c0 0e40 lr $AR0, @0x0e40 - 09c3 0081 0b91 lri $AR1, #0x0b91 - 09c5 00c2 0e0e lr $AR2, @0x0e0e - 09c7 0083 0e44 lri $AR3, #0x0e44 - 09c9 00c4 0e41 lr $IX0, @0x0e41 - 09cb 00c5 0e0f lr $IX1, @0x0e0f - 09cd 02bf 8282 call 0x8282 - 09cf 00f8 0bab sr @0x0bab, $AX0.L - 09d1 00fb 0bae sr @0x0bae, $AX1.H - 09d3 00c0 0e43 lr $AR0, @0x0e43 - 09d5 0081 0b95 lri $AR1, #0x0b95 - 09d7 00c2 0e10 lr $AR2, @0x0e10 - 09d9 0083 0e44 lri $AR3, #0x0e44 - 09db 1c80 mrr $IX0, $AR0 - 09dc 00c5 0e0a lr $IX1, @0x0e0a - 09de 02bf 8282 call 0x8282 - 09e0 00f8 0bb1 sr @0x0bb1, $AX0.L - 09e2 00fb 0baf sr @0x0baf, $AX1.H - 09e4 02df ret -} - -void Unk() { - 09e5 00c0 0e40 lr $AR0, @0x0e40 - 09e7 0081 0b89 lri $AR1, #0x0b89 - 09e9 00c2 0e08 lr $AR2, @0x0e08 - 09eb 0083 0e44 lri $AR3, #0x0e44 - 09ed 00c4 0e41 lr $IX0, @0x0e41 - 09ef 00c5 0e09 lr $IX1, @0x0e09 - 09f1 02bf 8282 call 0x8282 - 09f3 00f8 0ba9 sr @0x0ba9, $AX0.L - 09f5 00fb 0bac sr @0x0bac, $AX1.H - 09f7 00c0 0e40 lr $AR0, @0x0e40 - 09f9 0081 0b8d lri $AR1, #0x0b8d - 09fb 00c2 0e0b lr $AR2, @0x0e0b - 09fd 0083 0e44 lri $AR3, #0x0e44 - 09ff 00c0 0e41 lr $AR0, @0x0e41 - 0a01 00c5 0e0c lr $IX1, @0x0e0c - 0a03 02bf 8282 call 0x8282 - 0a05 00f8 0baa sr @0x0baa, $AX0.L - 0a07 00fb 0bad sr @0x0bad, $AX1.H - 0a09 00c0 0e40 lr $AR0, @0x0e40 - 0a0b 0081 0b91 lri $AR1, #0x0b91 - 0a0d 00c2 0e0e lr $AR2, @0x0e0e - 0a0f 0083 0e44 lri $AR3, #0x0e44 - 0a11 00c4 0e41 lr $IX0, @0x0e41 - 0a13 00c5 0e0f lr $IX1, @0x0e0f - 0a15 02bf 8282 call 0x8282 - 0a17 00f8 0bab sr @0x0bab, $AX0.L - 0a19 00fb 0bae sr @0x0bae, $AX1.H - 0a1b 00c0 0e43 lr $AR0, @0x0e43 - 0a1d 0081 0b97 lri $AR1, #0x0b97 - 0a1f 00c2 0e0a lr $AR2, @0x0e0a - 0a21 0083 0e44 lri $AR3, #0x0e44 - 0a23 1c80 mrr $IX0, $AR0 - 0a24 00c5 0e0d lr $IX1, @0x0e0d - 0a26 02bf 8282 call 0x8282 - 0a28 00f8 0baf sr @0x0baf, $AX0.L - 0a2a 00fb 0bb0 sr @0x0bb0, $AX1.H - 0a2c 00c0 0e43 lr $AR0, @0x0e43 - 0a2e 0081 0b95 lri $AR1, #0x0b95 - 0a30 00c2 0e10 lr $AR2, @0x0e10 - 0a32 0083 0e44 lri $AR3, #0x0e44 - 0a34 02bf 845d call 0x845d - 0a36 00f8 0bb1 sr @0x0bb1, $AX0.L - 0a38 02df ret -} - -void Unk() { - 0a39 00c0 0e40 lr $AR0, @0x0e40 - 0a3b 0081 0b89 lri $AR1, #0x0b89 - 0a3d 00c2 0e08 lr $AR2, @0x0e08 - 0a3f 1c62 mrr $AR3, $AR2 - 0a40 00c4 0e41 lr $IX0, @0x0e41 - 0a42 00c5 0e09 lr $IX1, @0x0e09 - 0a44 02bf 80e7 call 0x80e7 - 0a46 00f8 0ba9 sr @0x0ba9, $AX0.L - 0a48 00fb 0bac sr @0x0bac, $AX1.H - 0a4a 00c0 0e43 lr $AR0, @0x0e43 - 0a4c 0081 0b91 lri $AR1, #0x0b91 - 0a4e 00c2 0e0e lr $AR2, @0x0e0e - 0a50 1c62 mrr $AR3, $AR2 - 0a51 1c80 mrr $IX0, $AR0 - 0a52 00c5 0e0f lr $IX1, @0x0e0f - 0a54 02bf 80e7 call 0x80e7 - 0a56 00f8 0bab sr @0x0bab, $AX0.L - 0a58 00fb 0bae sr @0x0bae, $AX1.H - 0a5a 02df ret -} - -void Unk() { - 0a5b 00c0 0e40 lr $AR0, @0x0e40 - 0a5d 0081 0b89 lri $AR1, #0x0b89 - 0a5f 00c2 0e08 lr $AR2, @0x0e08 - 0a61 1c62 mrr $AR3, $AR2 - 0a62 00c4 0e41 lr $IX0, @0x0e41 - 0a64 00c5 0e09 lr $IX1, @0x0e09 - 0a66 02bf 80e7 call 0x80e7 - 0a68 00f8 0ba9 sr @0x0ba9, $AX0.L - 0a6a 00fb 0bac sr @0x0bac, $AX1.H - 0a6c 00c0 0e43 lr $AR0, @0x0e43 - 0a6e 0081 0b91 lri $AR1, #0x0b91 - 0a70 00c2 0e0e lr $AR2, @0x0e0e - 0a72 1c62 mrr $AR3, $AR2 - 0a73 1c80 mrr $IX0, $AR0 - 0a74 00c5 0e0f lr $IX1, @0x0e0f - 0a76 02bf 80e7 call 0x80e7 - 0a78 00f8 0bab sr @0x0bab, $AX0.L - 0a7a 00fb 0bae sr @0x0bae, $AX1.H - 0a7c 00c0 0e40 lr $AR0, @0x0e40 - 0a7e 0081 0b8d lri $AR1, #0x0b8d - 0a80 00c2 0e0b lr $AR2, @0x0e0b - 0a82 1c62 mrr $AR3, $AR2 - 0a83 00c4 0e41 lr $IX0, @0x0e41 - 0a85 00c5 0e0c lr $IX1, @0x0e0c - 0a87 02bf 80e7 call 0x80e7 - 0a89 00f8 0baa sr @0x0baa, $AX0.L - 0a8b 00fb 0bad sr @0x0bad, $AX1.H - 0a8d 00c0 0e43 lr $AR0, @0x0e43 - 0a8f 0081 0b99 lri $AR1, #0x0b99 - 0a91 00c2 0e0d lr $AR2, @0x0e0d - 0a93 1c62 mrr $AR3, $AR2 - 0a94 02bf 81f9 call 0x81f9 - 0a96 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a98 02df ret -} - -void Unk() { - 0a99 00c0 0e40 lr $AR0, @0x0e40 - 0a9b 0081 0b89 lri $AR1, #0x0b89 - 0a9d 00c2 0e08 lr $AR2, @0x0e08 - 0a9f 0083 0e44 lri $AR3, #0x0e44 - 0aa1 00c4 0e41 lr $IX0, @0x0e41 - 0aa3 00c5 0e09 lr $IX1, @0x0e09 - 0aa5 02bf 8282 call 0x8282 - 0aa7 00f8 0ba9 sr @0x0ba9, $AX0.L - 0aa9 00fb 0bac sr @0x0bac, $AX1.H - 0aab 00c0 0e43 lr $AR0, @0x0e43 - 0aad 0081 0b91 lri $AR1, #0x0b91 - 0aaf 00c2 0e0e lr $AR2, @0x0e0e - 0ab1 0083 0e44 lri $AR3, #0x0e44 - 0ab3 1c80 mrr $IX0, $AR0 - 0ab4 00c5 0e0f lr $IX1, @0x0e0f - 0ab6 02bf 8282 call 0x8282 - 0ab8 00f8 0bab sr @0x0bab, $AX0.L - 0aba 00fb 0bae sr @0x0bae, $AX1.H - 0abc 02df ret -} - -void Unk() { - 0abd 00c0 0e40 lr $AR0, @0x0e40 - 0abf 0081 0b89 lri $AR1, #0x0b89 - 0ac1 00c2 0e08 lr $AR2, @0x0e08 - 0ac3 0083 0e44 lri $AR3, #0x0e44 - 0ac5 00c4 0e41 lr $IX0, @0x0e41 - 0ac7 00c5 0e09 lr $IX1, @0x0e09 - 0ac9 02bf 8282 call 0x8282 - 0acb 00f8 0ba9 sr @0x0ba9, $AX0.L - 0acd 00fb 0bac sr @0x0bac, $AX1.H - 0acf 00c0 0e43 lr $AR0, @0x0e43 - 0ad1 0081 0b91 lri $AR1, #0x0b91 - 0ad3 00c2 0e0e lr $AR2, @0x0e0e - 0ad5 0083 0e44 lri $AR3, #0x0e44 - 0ad7 1c80 mrr $IX0, $AR0 - 0ad8 00c5 0e0f lr $IX1, @0x0e0f - 0ada 02bf 8282 call 0x8282 - 0adc 00f8 0bab sr @0x0bab, $AX0.L - 0ade 00fb 0bae sr @0x0bae, $AX1.H - 0ae0 00c0 0e40 lr $AR0, @0x0e40 - 0ae2 0081 0b8d lri $AR1, #0x0b8d - 0ae4 00c2 0e0b lr $AR2, @0x0e0b - 0ae6 0083 0e44 lri $AR3, #0x0e44 - 0ae8 00c4 0e41 lr $IX0, @0x0e41 - 0aea 00c5 0e0c lr $IX1, @0x0e0c - 0aec 02bf 8282 call 0x8282 - 0aee 00f8 0baa sr @0x0baa, $AX0.L - 0af0 00fb 0bad sr @0x0bad, $AX1.H - 0af2 00c0 0e43 lr $AR0, @0x0e43 - 0af4 0081 0b99 lri $AR1, #0x0b99 - 0af6 00c2 0e0d lr $AR2, @0x0e0d - 0af8 0083 0e44 lri $AR3, #0x0e44 - 0afa 02bf 845d call 0x845d - 0afc 00f8 0bb0 sr @0x0bb0, $AX0.L - 0afe 02df ret -} - -# Jump table for main commands -0aff 0082 // Jump 0 -0b00 013e // Jump 1 -0b01 01bc // Jump 2 -0b02 0248 // Jump 3 -0b03 0413 // Jump 4 -0b04 0427 // Jump 5 -0b05 0165 // Jump 6 -0b06 0574 // Jump 7 -0b07 0b37 // Jump 8 -0b08 015f // Jump 9 -0b09 0478 // Jump a -0b0a 0474 // Jump b -0b0b 0476 // Jump c -0b0c 01a9 // Jump d -0b0d 043b // Jump e -0b0e 047a // Jump f Task_Yield() -0b0f 0bb1 // Jump 10 -0b10 0175 // Jump 11 - -# LUT for pb.mixerCtrl -0b11 0768 // Jump3 0 -0b12 077a // Jump3 1 -0b13 079d // Jump3 2 -0b14 07c0 // Jump3 3 -0b15 07f4 // Jump3 4 -0b16 0811 // Jump3 5 -0b17 0844 // Jump3 6 -0b18 0877 // Jump3 7 -0b19 08c6 // Jump3 8 -0b1a 08d9 // Jump3 9 -0b1b 08fe // Jump3 a -0b1c 0923 // Jump3 b -0b1d 095a // Jump3 c -0b1e 0979 // Jump3 d -0b1f 09af // Jump3 e -0b20 09e5 // Jump3 f - -0b21 0a39 // Jump3 10 -0b22 0a5b // Jump3 11 -0b23 0768 // Jump3 12 -0b24 0768 // Jump3 13 -0b25 0768 // Jump3 14 -0b26 0768 // Jump3 15 -0b27 0768 // Jump3 16 -0b28 0768 // Jump3 17 -0b29 0a99 // Jump3 18 -0b2a 0abd // Jump3 19 -0b2b 0768 // Jump3 1a -0b2c 0768 // Jump3 1b -0b2d 0768 // Jump3 1c -0b2e 0768 // Jump3 1d -0b2f 0768 // Jump3 1e -0b30 0768 // Jump3 1f - -# LUT for pb.srcSelect -0b31 05a8 // Jump4 0 -0b32 065d // Jump4 1 -0b33 0707 // Jump4 2 - -# LUT for pb.coefSelect tables (in drom) -0b34 1000 -0b35 1200 -0b36 1400 - -# End of noise - back to code. - -void Cmd_8() { - 0b37 8e00 set16 - - 0b38 8100 clr $ACC0 - 0b39 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0b3a 191c lrri $AC0.L, @$AR0 - - 0b3b 2ece srs @DSMAH, $AC0.M - 0b3c 2ccf srs @DSMAL, $AC0.L - 0b3d 16cd 0e80 si @DSPA, #0x0e80 - 0b3f 16c9 0000 si @DSCR, #0x0000 - 0b41 16cb 0100 si @DSBL, #0x0100 - - 0b43 1f7e mrr $AX1.H, $AC0.M - 0b44 1f3c mrr $AX1.L, $AC0.L - - 0b45 8100 clr $ACC0 - - 0b46 26c9 lrs $AC0.M, @DSCR - 0b47 02a0 0004 andf $AC0.M, #0x0004 - 0b49 029c 0b46 jlnz 0x0b46 - - 0b4b 191e lrri $AC0.M, @$AR0 - 0b4c 191c lrri $AC0.L, @$AR0 - 0b4d 2ece srs @DSMAH, $AC0.M - 0b4e 2ccf srs @DSMAL, $AC0.L - 0b4f 16cd 0280 si @DSPA, #0x0280 - 0b51 16c9 0000 si @DSCR, #0x0000 - 0b53 16cb 0280 si @DSBL, #0x0280 - - 0b55 1c80 mrr $IX0, $AR0 - - 0b56 0080 0280 lri $AR0, #0x0280 - 0b58 00c1 0e1b lr $AR1, @0x0e1b - 0b5a 0085 0000 lri $IX1, #0x0000 - 0b5c 0089 007f lri $WR1, #0x007f - 0b5e 0082 0f00 lri $AR2, #0x0f00 - 0b60 0083 16b4 lri $AR3, #0x16b4 - 0b62 1ce3 mrr $IX3, $AR3 - 0b63 8100 clr $ACC0 - - 0b64 26c9 lrs $AC0.M, @DSCR - 0b65 02a0 0004 andf $AC0.M, #0x0004 - 0b67 029c 0b64 jlnz 0x0b64 - - 0b69 8f00 set40 - 0b6a 8a78 m2'l : $AC1.M, @$AR0 - 0b6b 8c68 clr15'l : $AC1.L, @$AR0 - 0b6c f100 lsl16 $ACC1 - 0b6d 1a3f srr @$AR1, $AC1.M - 0b6e 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0b6f 107e loopi #0x7e - 0b70 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b71 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b72 f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0 - 0b73 6e68 movp'l $ACC0 : $AC1.L, @$AR0 - 0b74 f132 lsl16's $ACC1 : @$AR2, $AC0.M - 0b75 1a3f srr @$AR1, $AC1.M - 0b76 119e 0b80 bloopi #0x9e, 0x0b80 - 0b78 1c67 mrr $AR3, $IX3 - 0b79 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0b7a 107e loopi #0x7e - 0b7b f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b7c f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b7d f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0 - 0b7e 6e68 movp'l $ACC0 : $AC1.L, @$AR0 - 0b7f f132 lsl16's $ACC1 : @$AR2, $AC0.M - 0b80 1a3f srr @$AR1, $AC1.M - - 0b81 1c67 mrr $AR3, $IX3 - 0b82 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0b83 107e loopi #0x7e - 0b84 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b85 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0b86 f200 madd $AX0.L, $AX0.H - 0b87 6e00 movp $ACC0 - 0b88 1b5e srri @$AR2, $AC0.M - 0b89 00e1 0e1b sr @0x0e1b, $AR1 - - 0b8b 0080 0280 lri $AR0, #0x0280 - 0b8d 0083 0f00 lri $AR3, #0x0f00 - 0b8f 0081 0000 lri $AR1, #0x0000 - 0b91 0082 0140 lri $AR2, #0x0140 - 0b93 0089 ffff lri $WR1, #0xffff - - 0b95 8900 clr $ACC1 - 0b96 8100 clr $ACC0 - - 0b97 8f00 set40 - - 0b98 11a0 0ba0 bloopi #0xa0, 0x0ba0 - 0b9a 197f lrri $AC1.M, @$AR3 - 0b9b 9930 asr16's $ACC1 : @$AR0, $AC0.M - 0b9c 1b1e srri @$AR0, $AC0.M - 0b9d 1b3f srri @$AR1, $AC1.M - 0b9e 7d29 neg's $ACC1 : @$AR1, $AC1.L - 0b9f 1b5f srri @$AR2, $AC1.M - 0ba0 1b5d srri @$AR2, $AC1.L - - 0ba1 8e00 set16 - - 0ba2 1fdb mrr $AC0.M, $AX1.H - 0ba3 1f99 mrr $AC0.L, $AX1.L - 0ba4 2ece srs @DSMAH, $AC0.M - 0ba5 2ccf srs @DSMAL, $AC0.L - 0ba6 16cd 0e80 si @DSPA, #0x0e80 - 0ba8 16c9 0001 si @DSCR, #0x0001 - 0baa 16cb 0100 si @DSBL, #0x0100 - - // 0bac 02bf 055c call 0x055c - WaitDMA(); - - 0bae 1c04 mrr $AR0, $IX0 - - // 0baf 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -void Cmd_10() { - 0bb1 8e00 set16 - - 0bb2 8100 clr $ACC0 - 0bb3 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0bb4 191c lrri $AC0.L, @$AR0 - - 0bb5 2ece srs @DSMAH, $AC0.M - 0bb6 2ccf srs @DSMAL, $AC0.L - 0bb7 16cd 07c0 si @DSPA, #0x07c0 - 0bb9 16c9 0001 si @DSCR, #0x0001 - 0bbb 16cb 0500 si @DSBL, #0x0500 - - // 0bbd 02bf 055c call 0x055c - WaitDMA(); - - 0bbf 8100 clr $ACC0 - 0bc0 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0bc1 191c lrri $AC0.L, @$AR0 - - 0bc2 2ece srs @DSMAH, $AC0.M - 0bc3 2ccf srs @DSMAL, $AC0.L - 0bc4 16cd 07c0 si @DSPA, #0x07c0 - 0bc6 16c9 0000 si @DSCR, #0x0000 - 0bc8 8900 clr $ACC1 - 0bc9 0d20 lris $AC1.L, #0x20 - 0bca 2dcb srs @DSBL, $AC1.L - - 0bcb 4c00 add $ACC0, $ACC1 - - 0bcc 1c80 mrr $IX0, $AR0 - - 0bcd 0080 07c0 lri $AR0, #0x07c0 - 0bcf 0083 0000 lri $AR3, #0x0000 - 0bd1 1c43 mrr $AR2, $AR3 - 0bd2 0a00 lris $AX0.H, #0x00 - - 0bd3 27c9 lrs $AC1.M, @DSCR - 0bd4 03a0 0004 andf $AC1.M, #0x0004 - 0bd6 029c 0bd3 jlnz 0x0bd3 - - 0bd8 2ece srs @DSMAH, $AC0.M - 0bd9 2ccf srs @DSMAL, $AC0.L - 0bda 16cd 07d0 si @DSPA, #0x07d0 - 0bdc 16c9 0000 si @DSCR, #0x0000 - 0bde 16cb 04e0 si @DSBL, #0x04e0 - - 0be0 8f00 set40 - - 0be1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0be2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0be3 6a00 movax $ACC0, $AX1 - 0be4 4800 addax $ACC0, $AX0 - 0be5 114f 0bee bloopi #0x4f, 0x0bee - 0be7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0be8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0be9 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0bea 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0beb 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0bec 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0bed 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 0bee 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - - 0bef 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0bf0 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0bf1 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0bf2 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0bf3 1b5f srri @$AR2, $AC1.M - 0bf4 1b5d srri @$AR2, $AC1.L - 0bf5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0bf6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0bf7 6800 movax $ACC0, $AX0 - 0bf8 7c00 neg $ACC0 - 0bf9 4a00 addax $ACC0, $AX1 - 0bfa 114f 0c05 bloopi #0x4f, 0x0c05 - 0bfc 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0bfd 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0bfe 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0bff 7d00 neg $ACC1 - 0c00 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0c01 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0c02 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0c03 683a movax's $ACC0, $AX0.L : @$AR2, $AC1.M - 0c04 7c00 neg $ACC0 - 0c05 4a2a addax's $ACC0, $AX1.L : @$AR2, $AC1.L - - 0c06 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0c07 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0c08 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0c09 7d00 neg $ACC1 - 0c0a 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0c0b 1b5f srri @$AR2, $AC1.M - 0c0c 1b5d srri @$AR2, $AC1.L - - 0c0d 1c04 mrr $AR0, $IX0 - - // 0c0e 029f 0068 jmp 0x0068 - goto DoNextCommand; -} - -# Begin interrupt handlers - -// Sends mail with value on top of callstack and rti's -void ResetAndStackUOFlow_Handler() { - 0c10 8e00 set16 - - // 0c11 16fc ecc0 si @DMBH, #0xecc0 - // 0c13 1fcc mrr $AC0.M, $ST0 - // 0c14 1d9e mrr $ST0, $AC0.M - // 0c15 2efd srs @DMBL, $AC0.M - DMB = 0xecc00000 | $ST0 - - // 0c16 26fc lrs $AC0.M, @DMBH - // 0c17 02a0 8000 andf $AC0.M, #0x8000 - // 0c19 029c 0c16 jlnz 0x0c16 - while (@DMBH & 0x8000 == 0); - - // 0c1b 0000 nop - // 0c1c 0000 nop - // 0c1d 0000 nop - // 0c1e 02ff rti - return; -} - -// Saves/Restores whole ACC0, but only modifies AC0.M. strange -void Int2_Handler() { - 0c1f 8e00 set16 - - // Save ACC0 - 0c20 00f0 0e17 sr @0x0e17, $AC0.H - 0c22 00fe 0e18 sr @0x0e18, $AC0.M - 0c24 00fc 0e19 sr @0x0e19, $AC0.L - - // 0c26 1fcc mrr $AC0.M, $ST0 - // 0c27 1d9e mrr $ST0, $AC0.M - // 0c28 16fc feed si @DMBH, #0xfeed - // 0c2a 2efd srs @DMBL, $AC0.M - DMB = 0xfeed0000 | $ST0 - - // 0c2b 26fc lrs $AC0.M, @DMBH - // 0c2c 02a0 8000 andf $AC0.M, #0x8000 - // 0c2e 029c 0c2b jlnz 0x0c2b - while (@DMBH & 0x8000 == 0); - - // Restore ACC0 - 0c30 00d0 0e17 lr $AC0.H, @0x0e17 - 0c32 00de 0e18 lr $AC0.M, @0x0e18 - 0c34 00dc 0e19 lr $AC0.L, @0x0e19 - - // 0c36 0000 nop - // 0c37 0000 nop - // 0c38 0000 nop - // 0c39 0000 nop - // 0c3a 02ff rti - return; -} - -void Int3_Handler() { - 0c3b 8e00 set16 - - // Save AC0.L, AC0.M - 0c3c 1dbc mrr $ST1, $AC0.L - 0c3d 1dbe mrr $ST1, $AC0.M - - // 0c3e 8100 clr $ACC0 - // 0c3f 00de 0bb7 lr $AC0.M, @0x0bb7 - // 0c41 0601 cmpis $AC0.M, #0x01 - // 0c42 0295 0c47 jz 0x0c47 - // 0c44 0e00 lris $AC0.M, #0x00 - // 0c45 00fe 0b87 sr @0x0b87, $AC0.M - if (*0x0bb7 != 1) { // pb.addr != AXPBADDR_LOOP_ON - *0x0b87 = 0; // pb.state = AX_PB_STATE_STOP - } - - // Restore AC0.L, AC0.M - 0c47 1fcd mrr $AC0.M, $ST1 - 0c48 1f8d mrr $AC0.L, $ST1 - - // 0c49 02ff rti - return; -} - -void Int4_Handler() { - // 0c4a 0000 nop - // 0c4b 0000 nop - // 0c4c 0000 nop - // 0c4d 0000 nop - // 0c4e 0000 nop - // 0c4f 02ff rti - return; -} - -void Int5_Handler() { - 0c50 8e00 set16 - - // Save AC0.L, AC0.M - 0c51 1dbc mrr $ST1, $AC0.L - 0c52 1dbe mrr $ST1, $AC0.M - - // 0c53 8100 clr $ACC0 - // 0c54 00de 0bb7 lr $AC0.M, @0x0bb7 - // 0c56 0601 cmpis $AC0.M, #0x01 - // 0c57 0295 0c5f jz 0x0c5f - if (*0x0bb7 != 1) // pb.addr != AXPBADDR_LOOP_ON - { - // 0c59 0e00 lris $AC0.M, #0x00 - // 0c5a 00fe 0b87 sr @0x0b87, $AC0.M - *0x0b87 = 0; // pb.state = AX_PB_STATE_STOP - - // Restore AC0.L, AC0.M - 0c5c 1fcd mrr $AC0.M, $ST1 - 0c5d 1f8d mrr $AC0.L, $ST1 - - // 0c5e 02ff rti - return; - } - - // 0c5f 8100 clr $ACC0 - // 0c60 00de 0b88 lr $AC0.M, @0x0b88 - // 0c62 0601 cmpis $AC0.M, #0x01 - // 0c63 0295 0c71 jz 0x0c71 - if (*0x0b88 != 1) { // pb.type != AX_PB_TYPE_STREAM - - // 0c65 00de 0bda lr $AC0.M, @0x0bda - // 0c67 2eda srs @scale, $AC0.M - // 0c68 00de 0bdb lr $AC0.M, @0x0bdb - // 0c6a 2edb srs @yn1, $AC0.M - // 0c6b 00de 0bdc lr $AC0.M, @0x0bdc - // 0c6d 2edc srs @yn2, $AC0.M - @scale = pb.adpcmLoop.loop_pred_scale - @yn1 = pb.adpcmLoop.loop_yn1 - @yn2 = pb.adpcmLoop.loop_yn2 - - // Restore AC0.L, AC0.M - 0c6e 1fcd mrr $AC0.M, $ST1 - 0c6f 1f8d mrr $AC0.L, $ST1 - - // 0c70 02ff rti - return; - - } else { - - // 0c71 00de 0bda lr $AC0.M, @0x0bda - // 0c73 2eda srs @scale, $AC0.M - // 0c74 26db lrs $AC0.M, @yn1 - // 0c75 2edb srs @yn1, $AC0.M - // 0c76 26dc lrs $AC0.M, @yn2 - // 0c77 2edc srs @yn2, $AC0.M - @scale = pb.adpcmLoop.loop_pred_scale - // refresh @yn1, @yn2....why? - @yn1 = @yn1 - @yn2 = @yn2 - - // Well helllloooo there, padding - // 0c78 8100 clr $ACC0 - // 0c79 00dc 0bdd lr $AC0.L, @0x0bdd - // 0c7b 7600 inc $ACC0 - // 0c7c 00fc 0bdd sr @0x0bdd, $AC0.L - // 0c7e 8100 clr $ACC0 - pb.pad[0]++ - - // Restore AC0.L, AC0.M - 0c7f 1fcd mrr $AC0.M, $ST1 - 0c80 1f8d mrr $AC0.L, $ST1 - - // 0c81 02ff rti - return; - } -} - -void Int6_Handler() { - 0c82 0000 nop - 0c83 0000 nop - 0c84 0000 nop - 0c85 0000 nop - 0c86 0000 nop - 0c87 02ff rti -} - -void Int7_Handler() { - 0c88 0000 nop - 0c89 0000 nop - 0c8a 0000 nop - 0c8b 0000 nop - 0c8c 02ff rti -} - -# End of interrupt handlers - -// Jump table for the next function. -0c8d 0c9f // some kind of soft-reset for the UCode -0c8e 0ca2 // looks like code to dump the UCode memory for debugging -0c8f 0cda // rest the UCode and jump to ROM -0c90 0cdd // normal case to return to the main-loop - -// Called only from Task_Yield() -// Decides what to do next (this cmdblock is done) -void JumpThroughTable2() { - 0c91 8e00 set16 - 0c92 8100 clr $ACC0 - 0c93 8900 clr $ACC1 - - // 0c94 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - // 0c96 27ff lrs $AC1.M, @CMBL - // 0c97 009e 0c8d lri $AC0.M, #0x0c8d - // 0c99 4c00 add $ACC0, $ACC1 - // 0c9a 1c7e mrr $AR3, $AC0.M - // 0c9b 0313 ilrr $AC1.M, @$AR3 - // 0c9c 1c7f mrr $AR3, $AC1.M - // 0c9d 176f jmpr $AR3 - switch(@CMBL) { - case 0: AX_ResumeTask(); break; - case 1: JumpTable2_1(); break; - case 2: IROM_Reset(); break; - case 3: AX_GetNextCmdBlock(); break; - } - 0c9e 0021 halt -} - -// case 0: -void AX_ResumeTask() { - 0c9f 029f 0030 jmp 0x0030 - 0ca1 0021 halt -} - -// case 1: -// funky...calls the mbox funcs, sometimes prefilling ACx regs... -// Perhaps DMAs some stuff and yields? -// Need to RE the ROM to figure this func out completely -void JumpTable2_1() { - // 0ca2 8100 clr $ACC0 - // 0ca3 8900 clr $ACC1 - // 0ca4 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - // 0ca6 24ff lrs $AC0.L, @CMBL - // 0ca7 02bf 0ce6 call 0x0ce6 - WaitForCPUMail1(); - - // 0ca9 25ff lrs $AC1.L, @CMBL - // 0caa 02bf 0ce6 call 0x0ce6 - WaitForCPUMail1(); - - 0cac 27ff lrs $AC1.M, @CMBL - 0cad 2ece srs @DSMAH, $AC0.M - 0cae 2ccf srs @DSMAL, $AC0.L - 0caf 16c9 0001 si @DSCR, #0x0001 - 0cb1 2fcd srs @DSPA, $AC1.M - 0cb2 2dcb srs @DSBL, $AC1.L - - // 0cb3 8100 clr $ACC0 - // 0cb4 8900 clr $ACC1 - // 0cb5 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - 0cb7 24ff lrs $AC0.L, @CMBL - 0cb8 1c9e mrr $IX0, $AC0.M - 0cb9 1cbc mrr $IX1, $AC0.L - 0cba 02bf 0ce6 call 0x0ce6 - WaitForCPUMail1(); - - 0cbc 25ff lrs $AC1.L, @CMBL - 0cbd 02bf 0ce6 call 0x0ce6 - WaitForCPUMail1(); - - 0cbf 27ff lrs $AC1.M, @CMBL - 0cc0 1cdf mrr $IX2, $AC1.M - 0cc1 1cfd mrr $IX3, $AC1.L - - // 0cc2 8100 clr $ACC0 - // 0cc3 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - 0cc5 26ff lrs $AC0.M, @CMBL - 0cc6 1c1e mrr $AR0, $AC0.M - 0cc7 8900 clr $ACC1 - 0cc8 02bf 0ce6 call 0x0ce6 - WaitForCPUMail1(); - - 0cca 20ff lrs $AX0.L, @CMBL - 0ccb 1f5f mrr $AX0.H, $AC1.M - 0ccc 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - 0cce 21ff lrs $AX1.L, @CMBL - 0ccf 02bf 0ce0 call 0x0ce0 - WaitForCPUMail0(); - - 0cd1 23ff lrs $AX1.H, @CMBL - - // 0cd2 26c9 lrs $AC0.M, @DSCR - // 0cd3 02a0 0004 andf $AC0.M, #0x0004 - // 0cd5 029c 0cd2 jlnz 0x0cd2 - while (@DSCR & 0x0004 != 0); // Wait for DMA to complete - - // 0cd7 029f 80b5 jmp 0x80b5 - // 0cd9 0021 halt - IROM_ErrorAndDie(); // Not sure...gotta RE the ROM -} - -// case 2: -void IROM_Reset() { - 0cda 029f 8000 jmp 0x8000 - 0cdc 0021 halt -} - -// case 3: -void AX_GetNextCmdBlock() { - // 0cdd 029f 0045 jmp 0x0045 - goto GetNextCmdBlock; - - 0cdf 0021 halt -} - -void WaitForCPUMail0() { - // 0ce0 26fe lrs $AC0.M, @CMBH - // 0ce1 02c0 8000 andcf $AC0.M, #0x8000 - // 0ce3 029c 0ce0 jlnz 0x0ce0 - while (@CMBH & 0x8000 == 0); - // 0ce5 02df ret - return; -} - -void WaitForCPUMail1() { - // 0ce6 27fe lrs $AC1.M, @CMBH - // 0ce7 03c0 8000 andcf $AC1.M, #0x8000 - // 0ce9 029c 0ce6 jlnz 0x0ce6 - while (@CMBH & 0x8000 == 0); - // 0ceb 02df ret - return; -} - -0cec 0000 nop -0ced 0000 nop -0cee 0000 nop -0cef 0000 nop diff --git a/docs/DSP/DSP_UC_GBA.txt b/docs/DSP/DSP_UC_GBA.txt deleted file mode 100644 index 0daa70dd11..0000000000 --- a/docs/DSP/DSP_UC_GBA.txt +++ /dev/null @@ -1,498 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -ROM functions used: -0x8000 dsp reset -0x8078 wait for CMBH & 0x8000 -0x807e wait for DMBH & 0x8000 -0x808b dump DRAM/IRAM to mainmem -0x80b5 boot new ucode -0x80bc boot new ucode without ACC clearing by ROM - -For the rest, this ucode is just calling the last few instructions -from huge functions in irom - some kind of obfuscation -Perhaps someone thought the irom would never be dumped? ;p - -Similarly, drom is used pretty extensively as a source of what is intended to -be "mystery" numbers. Usually a word will be fetched, and masked to create a -simple value. No problem! :) - -0x81f4 - mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M - asr16'ir $ACC1 : $AR1 - srri @$AR3, $AC1.M - clr's $ACC0 : @$AR3, $AC1.L -0x8458 - mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M - asr16 $ACC1 - srri @$AR3, $AC1.M - clr's $ACC0 : @$AR3, $AC1.L -0x8723 - xorr $AC1.M, $AX1.H - srrd @$AR2, $AC1.M -0x8809 - orr'sn $AC1.M, $AX0.H : @$AR2, $AC1.L - srri @$AR2, $AC1.M -0x88e5 - orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 - lrrd $AC1.L, @$AR2 - add'dr $ACC0, $ACC1 : $AR1 - srri @$AR2, $AC0.M - srr @$AR2, $AC0.L - -struct sec_params_t -{ - u32 key; // from gba - u32 unk1; // normally 2 - u32 unk2; // normally 2 - u32 length; // size of data transferred to gba - u32 dest_addr; // addr to store result in mram - u32 pad[3]; -} - -// exception vector -0000 0000 nop -0001 0000 nop -0002 0000 nop -0003 0000 nop -0004 0000 nop -0005 0000 nop -0006 0000 nop -0007 0000 nop -0008 0000 nop -0009 0000 nop -000a 0000 nop -000b 0000 nop -000c 0000 nop -000d 0021 halt -000e 02ff rti -000f 0021 halt - -// entry point -void 0010_main() -{ -0010 1306 sbset #0x06 -0011 1203 sbclr #0x03 -0012 1204 sbclr #0x04 -0013 1305 sbset #0x05 -0014 0092 00ff lri $CR, #0x00ff -0016 0088 ffff lri $WR0, #0xffff -0018 0089 ffff lri $WR1, #0xffff -001a 008a ffff lri $WR2, #0xffff -001c 008b ffff lri $WR3, #0xffff -001e 8f00 set40 -001f 8b00 m0 -0020 8c00 clr15 -0021 02bf 807e call 0x807e // loop until dsp->cpu mailbox is empty -0023 16fc dcd1 si @DMBH, #0xdcd1 -0025 16fd 0000 si @DMBL, #0x0000 // sendmail 0xdcd10000 -0027 16fb 0001 si @DIRQ, #0x0001 - -// wait for cpu mail == 0xabbaxxxx -0029 02bf 8078 call 0x8078 // wait for cpu mail -002b 24ff lrs $AC0.L, @CMBL -002c 0280 abba cmpi $AC0.M, #0xabba -002e 0294 0029 jnz 0x0029 - -// wait for cpu mail -0030 8e00 set16 -0031 02bf 8078 call 0x8078 - -0033 20ff lrs $AX0.L, @CMBL -0034 0240 0fff andi $AC0.M, #0x0fff -0036 1f5e mrr $AX0.H, $AC0.M -0037 009b 0000 lri $AX1.H, #0x0000 // DSP-dram addr -0039 0099 0020 lri $AX1.L, #0x0020 // length (20 bytes = 10 words, word 9 and 10 are addr where result should DMA'd to in main mem) -003b 0087 0000 lri $IX3, #0x0000 // there will be no ucode/iram upload -003d 0080 0041 lri $AR0, #0x0041 // return addr after dram upload -003f 029f 80bc jmp 0x80bc // DRAM upload !! -// $AX0.H-$AX0.L - CPU(PPC) addr = mail & 0x0fffffff -// upload data from mainmem do dsp dram and jump to 0x41 after that - -0041 02bf 008c call 008c_BigCrazyFunction() -0043 02bf 807e call 0x807e // loop until dsp->cpu mailbox is empty - -0045 16fc dcd1 si @DMBH, #0xdcd1 -0047 16fd 0003 si @DMBL, #0x0003 // sendmail 0xdcd10003 (aka... calc is over, result is in main mem now) -0049 16fb 0001 si @DIRQ, #0x0001 -004b 8f00 set40 - -004c 02bf 8078 call 0x8078 -004e 0280 cdd1 cmpi $AC0.M, #0xcdd1 -0050 0294 004c jnz 0x004c - -0052 26ff lrs $AC0.M, @CMBL -0053 0280 0001 cmpi $AC0.M, #0x0001 -0055 0295 005e jz 0x005e // if cpu->dsp mail was 0xcdd10001 -> 005e_PrepareBootUcode() - -0057 0280 0002 cmpi $AC0.M, #0x0002 -0059 0295 8000 jz 0x8000 // if cpu->dsp mail was 0xcdd10002 -> dsp reset ( jmp to irom(0x8000)) - -005b 029f 004c jmp 0x004c // wait for next mail from cpu -005d 0021 halt -} - -void 005e_PrepareBootUcode() -{ -005e 8e00 set16 -005f 02bf 8078 call 0x8078 -0061 24ff lrs $AC0.L, @CMBL // ??? -0062 02bf 8078 call 0x8078 -0064 24ff lrs $AC0.L, @CMBL // ??? -0065 02bf 8078 call 0x8078 -0067 24ff lrs $AC0.L, @CMBL // ??? -0068 02bf 8078 call 0x8078 -006a 00c5 ffff lr $IX1, @CMBL -006c 0240 0fff andi $AC0.M, #0x0fff -006e 1c9e mrr $IX0, $AC0.M // mram addr for iram -006f 02bf 8078 call 0x8078 -0071 00c7 ffff lr $IX3, @CMBL // iram upload length. upload skipped if 0 -0073 02bf 8078 call 0x8078 -0075 00c6 ffff lr $IX2, @CMBL // iram dest -0077 02bf 8078 call 0x8078 -0079 00c0 ffff lr $AR0, @CMBL // startpc / return addr -007b 02bf 8078 call 0x8078 -007d 20ff lrs $AX0.L, @CMBL -007e 0240 0fff andi $AC0.M, #0x0fff -0080 1f5e mrr $AX0.H, $AC0.M // mram addr for dram -0081 02bf 8078 call 0x8078 -0083 21ff lrs $AX1.L, @CMBL // dram upload length. upload skipped if 0 -0084 02bf 8078 call 0x8078 -0086 23ff lrs $AX1.H, @CMBL // dram dest -0087 1205 sbclr #0x05 -0088 1206 sbclr #0x06 -0089 029f 80b5 jmp 80b5_BootUcode() -008b 0021 halt -} - -// does some crazy stuff with data at dram @0x3/0x5/0x6/0x7 with help of some values from drom :) -// result is @0x22,@0x23 and written back to main memory to dmem-0x08:dmem-0x09 -void 008c_BigCrazyFunction() -{ -// 008c 8100 clr $ACC0 -// 008d 0081 0010 lri $AR1, #0x0010 -// 008f 1020 loopi #0x20 -// 0090 1b3e srri @$AR1, $AC0.M - memset(0x10, 0, 0x20 * sizeof(dsp_word)); - -// 0091 00df 1456 lr $AC1.M, @0x1456 // drom 102f -// 0093 0340 ffd0 andi $AC1.M, #0xffd0 // -> 0x1000 -// 0095 8417 clrp'mv : $AX1.L, $AC1.M // clrp, ax1.l = 0x1000 - IMPORTANT: "confusing" section relies on prod being cleared, and ax1.l == 0x1000 - -// 0096 0080 0000 lri $AR0, #0x0000 -// 0098 0086 0000 lri $IX2, #0x0000 -// 009a 0082 001f lri $AR2, #0x001f -// 009c 00de 15f6 lr $AC0.M, @0x15f6 // drom 7f65 -// 009e 1408 lsl $ACC0, #8 // -> 0x7f_6500 -// 009f 00df 1766 lr $AC1.M, @0x1766 // drom 0273 -// 00a1 0340 00ff andi $AC1.M, #0x00ff // -> 0x73 -// 00a3 1f5f mrr $AX0.H, $AC1.M // ax0.h = 0x73 -// 00a4 02bf 88e5 call 0x88e5 // ar2 = 0x1f, ar1 = 0x30 -// orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 // acc0 = 0x7f_6573, ac1.m = 0, ar2 = 0x20 -// lrrd $AC1.L, @$AR2 // ac1.l = 0, ar2 = 0x1f -// add'dr $ACC0, $ACC1 : $AR1 -// srri @$AR2, $AC0.M // *0x1f = 0x6573, ar2 = 0x20 -// srr @$AR2, $AC0.L // *0x20 = 0 -// 00a6 1f1c mrr $AX0.L, $AC0.L // ax0.l = 0 -// 00a7 811e clr'mv $ACC0 : $AX1.H, $AC0.M // acc0 = 0, ax1.h = 0x6573 -// 00a8 191e lrri $AC0.M, @$AR0 // ac0.m = sec_params.key[0], ar1 = 1 -// 00a9 1478 lsr $ACC0, #-8 // acc0 0x00_00.._..00 -// 00aa 1ffc mrr $AC1.M, $AC0.L // ac1.m = sec_params.key[0] & 0x00ff -// 00ab 1f5e mrr $AX0.H, $AC0.M // ax0.h = sec_params.key[0] >> 8 -// 00ac 02bf 8809 call 0x8809 -// orr'sn $AC1.M, $AX0.H : @$AR2, $AC1.L // ac1.m |= ax0.h ..tricky tricky :D -// srri @$AR2, $AC1.M // *0x20 = bswap(sec_params.key[0]), ar2 = 0x21 -// 00ae 02bf 8723 call 0x8723 -// xorr $AC1.M, $AX1.H // ac1.m = sec_params.key[0] ^ 0x6573 -// srrd @$AR2, $AC1.M // *0x21 = bswap(sec_params.key[0]) ^ 0x6573, ar2 = 0x20 - // Initialize 0x21 - *0x1f = 0x6573 - *0x20 = bswap(sec_params.key[0]) - *0x21 = bswap(sec_params.key[0]) ^ 0x6573 - -// 00b0 0006 dar $AR2 // ar2 = 0x1f -// 00b1 8106 clr'dr $ACC0 : $AR2 // acc0 = 0, ar2 = 0x1e -// 00b2 00de 166c lr $AC0.M, @0x166c // drom 06f2 -// 00b4 1404 lsl $ACC0, #4 -// 00b5 0240 ff00 andi $AC0.M, #0xff00 // -> 0x6f00 -// 00b7 00df 1231 lr $AC1.M, @0x1231 // drom 64fc -// 00b9 1578 lsr $ACC1, #-8 -// 00ba 0340 00ff andi $AC1.M, #0x00ff // -> 0x64 -// 00bc 1f5f mrr $AX0.H, $AC1.M // ax0.h = 0x64 -// 00bd 02bf 88e5 call 0x88e5 -// orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 // ac0.m = 0x6f64, ac1.m = 0, ar2 = 0x1f -// lrrd $AC1.L, @$AR2 // ac1.l = 0x6573, ar2 = 0x1e -// add'dr $ACC0, $ACC1 : $AR1 // acc0 = 0x00_6f64_6573 -// srri @$AR2, $AC0.M // *0x1e = 0x6f64, ar2 = 0x1f -// srr @$AR2, $AC0.L // *0x1f = 0x6573 -// 00bf 1f1c mrr $AX0.L, $AC0.L -// 00c0 811e clr'mv $ACC0 : $AX1.H, $AC0.M // acc0 = 0, ax1.h = 0x6f64 -// 00c1 191e lrri $AC0.M, @$AR0 // ac0.m = sec_params.key[1] -// 00c2 1478 lsr $ACC0, #-8 // acc0 = 0x00_00.._..00 -// 00c3 1ffc mrr $AC1.M, $AC0.L // ac1.m = sec_params.key[1] & 0xff -// 00c4 1f5e mrr $AX0.H, $AC0.M // ax0.h = sec_params.key[1] >> 8 -// 00c5 02bf 8809 call 0x8809 -// orr'sn $AC1.M, $AX0.H : @$AR2, $AC1.L // ac1.m |= ax0.h -// srri @$AR2, $AC1.M // *0x1f = bswap(sec_params.key[1]), ar2 = 0x20 -// 00c7 02bf 8723 call 0x8723 -// xorr $AC1.M, $AX1.H -// srrd @$AR2, $AC1.M // *0x20 = bswap(sec_params.key[1]) ^ 0x6f64 - // Initialize 0x20 - *0x1e = 0x6f64 - *0x1f = bswap(sec_params.key[1]) - *0x20 = bswap(sec_params.key[1]) ^ 0x6f64 - - // Initialize 0x11 -// 00c9 8100 clr $ACC0 -// 00ca 8900 clr $ACC1 -// 00cb 00d1 0005 lr $AC1.H, @0x0005 -// 00cd 9900 asr16 $ACC1 // s16 unk2 = (s8)(sec_params.unk2[1]) -// 00ce 8200 cmp -// 00cf 0295 00e5 jz 0x00e5 -// 00d1 0291 00f3 jl 0x00f3 -if (unk2 < 0) { - // 00d3 0082 0010 lri $AR2, #0x0010 - // 00d5 0086 0001 lri $IX2, #0x0001 // 'sn will inc ar2 by 1 - // 00d7 00d0 171b lr $AC0.H, @0x171b // drom ff03 - // 00d9 9100 asr16 $ACC0 // -> 0x00_0003_0000 - // 00da 7d00 neg $ACC1 - // 00db 4d00 add $ACC1, $ACC0 - // 00dc 1501 lsl $ACC1, #1 - // 00dd 1f5f mrr $AX0.H, $AC1.M // ax0.h = ((~unk2 + 3) << 1) & 0xffff - // 00de 00df 0003 lr $AC1.M, @0x0003 // sec_params.unk1[1] - // 00e0 1504 lsl $ACC1, #4 - // 00e1 02bf 8809 call 0x8809 - // orr'sn $AC1.M, $AX0.H : @$AR2, $AC1.L // ac1.m = (((~unk2 + 3) << 1) & 0xffff) | (sec_params.unk1[1] << 4), ar2 = 0x11 - // srri @$AR2, $AC1.M - // 00e3 029f 0102 jmp 0x0102 - *0x11 = (((~unk2 + 3) << 1) | (sec_params.unk1[1] << 4)) & 0xffff - -} else if (unk2 == 0) { - // unk2 is unused - // 00e5 0082 0011 lri $AR2, #0x0011 - // 00e7 00df 0003 lr $AC1.M, @0x0003 // sec_params.unk1[1] - // 00e9 1501 lsl $ACC1, #1 - // 00ea 1f5f mrr $AX0.H, $AC1.M // ax0.h = sec_params.unk1[1] << 1 - // 00eb 00de 1043 lr $AC0.M, @0x1043 // drom 0076 - // 00ed 0240 fff0 andi $AC0.M, #0xfff0 // -> 0x70 - // 00ef 02bf 88e5 call 0x88e5 - // orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 // ac0.m = (sec_params.unk1[1] << 1) | 0x70, ac1.m = 0, ar2 = 0x12 - // lrrd $AC1.L, @$AR2 // ar2 = 0x11 - // add'dr $ACC0, $ACC1 : $AR1 // acc1 must be 0 - // srri @$AR2, $AC0.M // *0x11 = (sec_params.unk1[1] << 1) | 0x70, ar2 = 0x12 - // srr @$AR2, $AC0.L // *0x12 = 0 // just a side effect, it's already 0 anyways - // 00f1 029f 0102 jmp 0x0102 - *0x11 = ((sec_params.unk1[1] << 1) | 0x70) & 0xffff - -} else if (unk2 > 0) { - // 00f3 0082 0010 lri $AR2, #0x0010 - // 00f5 0086 0001 lri $IX2, #0x0001 // 'sn will inc ar2 by 1 - // 00f7 00d0 1285 lr $AC0.H, @0x1285 // drom 5aff (0xffff because of .h) - // 00f9 9100 asr16 $ACC0 // -> 0xff_ffff_0000 = -1 - // 00fa 4d00 add $ACC1, $ACC0 // ac1.m = unk2 - 1 - // 00fb 1501 lsl $ACC1, #1 // ac1.m <<= 1 ..in the normal case, this makes it 2 again... - // 00fc 00de 0003 lr $AC0.M, @0x0003 // sec_params.unk1[1] - // 00fe 1404 lsl $ACC0, #4 - // 00ff 1f5e mrr $AX0.H, $AC0.M // ax0.h = sec_params.unk1[1] << 4 - // 0100 02bf 8809 call 0x8809 - // orr'sn $AC1.M, $AX0.H : @$AR2, $AC1.L // ac1.m = ((unk2 - 1) << 1) | (sec_params.unk1[1] << 4), ar2 = 0x11 - // srri @$AR2, $AC1.M - *0x11 = (((unk2 - 1) << 1) | (sec_params.unk1[1] << 4)) & 0xffff -} - -// This just clears acc1 -// 0102 0083 0013 lri $AR3, #0x0013 -// 0104 1b7e srri @$AR3, $AC0.M // *0x13 = intermediate from above -> unused -// 0105 8923 clr's $ACC1 : @$AR3, $AC0.L // acc1 = 0, *0x14 = intermediate from above -> unused - -// The "confusion" -// 0106 0083 0013 lri $AR3, #0x0013 -// 0108 00df 0007 lr $AC1.M, @0x0007 // ac1.m = sec_params.length[1] -// 010a 00de 11b8 lr $AC0.M, @0x11b8 // drom 007f -// 010c 0240 fff0 andi $AC0.M, #0xfff0 // -> 0x70 -// 010e 1f5e mrr $AX0.H, $AC0.M // ax0.h = 0x70 -// 010f 02bf 81f4 call 0x81f4 -// mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M// prod = 0x70 * 0x1000 : .m1 = 7 -// asr16'ir $ACC1 : $AR1 // ac1.l = sec_params.length[1], the rest of acc1 must be 0 -// srri @$AR3, $AC1.M // *0x13 = 0, ar3 = 0x14 -// clr's $ACC0 : @$AR3, $AC1.L // acc0 = 0, *0x14 = sec_params.length[1], ar3 = 0x15 -// -// 0111 f100 lsl16 $ACC1 // ac1.m = sec_params.length[1] -// 0112 02bf 8458 call 0x8458 // this is the same routine, just adds 7 and stores to different location -// mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M// acc1 += 7 // last prod has 7 in the mid -// asr16 $ACC1 // ac1.l = sec_params.length[1] + 7 -// srri @$AR3, $AC1.M // *0x15 = 0, ar3 = 0x16 -// clr's $ACC0 : @$AR3, $AC1.L // *0x16 = sec_params.length[1] + 7 - *0x13 = 0 - *0x14 = sec_params.length[1] - *0x15 = 0 - *0x16 = sec_params.length[1] + 7 - -// 0114 8f00 set40 // SIGN EXTENSION IN EFFECT!! -// 0115 0082 0015 lri $AR2, #0x0015 -// 0117 00de 0006 lr $AC0.M, @0x0006 // ac0.m = sec_params.length[0] ..always 0? // sign extended -// 0119 00da 165b lr $AX0.H, @0x165b // drom 0000 -// 011b 02bf 88e5 call 0x88e5 -// orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 // ac0.m = sec_params.length[0], effectively clears acc1 (*0x15 == 0), ar2 = 0x16 -// lrrd $AC1.L, @$AR2 // ac1.l = sec_params.length[1] + 7, ar2 = 0x15 -// add'dr $ACC0, $ACC1 : $AR1 // ac0.m = sec_params.length[0], ac0.l = sec_params.length[1] + 7 -// srri @$AR2, $AC0.M // *0x15 = sec_params.length[0], ar2 = 0x16 -// srr @$AR2, $AC0.L // *0x16 = sec_params.length[1] + 7 -// 011d 14fd asr $ACC0, #-3 -// 011e 1403 lsl $ACC0, #3 // ((acc0 + 7) & ~7) (round up) // consider .length rounded from here on out -// 011f 1b5e srri @$AR2, $AC0.M // *0x16 = sec_params.length[0], ar2 = 0x17 -// 0120 1b5c srri @$AR2, $AC0.L // *0x17 = sec_params.length[1], ar2 = 0x18 -// 0121 0082 0016 lri $AR2, #0x0016 -// 0123 00de 1723 lr $AC0.M, @0x1723 // drom ffe0 // obviously sign extended -// 0125 14f4 asr $ACC0, #-12 // -> 0xff_ffff_fe00 = -1, -0x200 -// 0126 00da 166b lr $AX0.H, @0x166b // drom 0000 -// 0128 02bf 88e5 call 0x88e5 -// orr'l $AC0.M, $AX0.H : $AC1.M, @$AR2 // ac1.m = sec_params.length[0] // sign extended -// lrrd $AC1.L, @$AR2 // ac1.l = sec_params.length[1] -// add'dr $ACC0, $ACC1 : $AR1 // acc0 = sec_params.length - 0x200 // this is a proper signed operation :) -// srri @$AR2, $AC0.M // *0x16 = sec_params.length - 0x200 HIGH -// srr @$AR2, $AC0.L // *0x17 = sec_params.length - 0x200 LOW - // The above block just does 40bit subtraction...so annoying :p - *0x15 = sec_params.length[0] - *0x16 = sec_params.length - 0x200 HIGH - *0x17 = sec_params.length - 0x200 LOW - -// 012a b100 tst $ACC0 -// 012b 0290 012e jge 0x012e -// 012d 8100 clr $ACC0 -if (acc0 < 0) acc0 = 0 - -// At this point, ACC0 = max40bit(0, sec_params.length - 0x200) - -// 012e 14fd asr $ACC0, #-3 // taken into account at 013f -// 012f 8e00 set16 // back to sanity - -// voodoo -0130 00df 1491 lr $AC1.M, @0x1491 // drom 6a0f -0132 0340 d0f0 andi $AC1.M, #0xd0f0 // -> 0x4000 -0134 1cbf mrr $IX1, $AC1.M // ix1 = 0x4000 -0135 00df 1468 lr $AC1.M, @0x1468 // drom f808 -0137 00d1 11fc lr $AC1.H, @0x11fc // drom 0003 -0139 157c lsr $ACC1, #-4 // -> 0x00_3f80_8000 -013a 1cdf mrr $IX2, $AC1.M // ix2 = 0x3f80 -013b 00d1 11b8 lr $AC1.H, @0x11b8 // drom 007f -013d 9900 asr16 $ACC1 // -> 0x00_007f_3f80 -013e 1418 lsl $ACC0, #24 -013f 1478 lsr $ACC0, #-8 // (((ACC0 >> 3) << 24) >> 8) -same as ((ACC0 >> 3) << 16) & 0x00_ffff_0000 -> ac0.m = (u16)((sec_params.length - 0x200) >> 3) -u16 size = (u16)((sec_params.length - 0x200) >> 3) -0140 1f5e mrr $AX0.H, $AC0.M // ax0.h = size -0141 1ffe mrr $AC1.M, $AC0.M // ac1.m = size -0142 1f65 mrr $AX1.H, $IX1 // ax1.h = 0x4000 -0143 3600 andr $AC0.M, $AX1.H // ac0.m = size & 0x4000 -0144 1402 lsl $ACC0, #2 // acc0 <<= 2 // t = (0x00_size_0000 & 0x00_4000_ffff) << 2 -0145 1f66 mrr $AX1.H, $IX2 // ax1.h = 0x3f80 -0146 3700 andr $AC1.M, $AX1.H // ac1.m = size & 0x3f80 -0147 1501 lsl $ACC1, #1 // acc1 <<= 1 // u = (0x00_size_3f80 & 0x00_3f80_ffff) << 1 -0148 4c00 add $ACC0, $ACC1 // acc0 += acc1 // t += u -0149 1518 lsl $ACC1, #24 -014a 9900 asr16 $ACC1 // signed cast (s16)ac1.l (ends up in ac1.m) -014b 3500 andr $AC1.M, $AX0.H // ac1.m = (s16)u & size -014c 4c00 add $ACC0, $ACC1 // acc0 += acc1 // t += (s16)u & size -014d 00df 0012 lr $AC1.M, @0x0012 -014f 3f00 orc $AC1.M, $AC0.M // ac1.m = acc0 | 0x00_ffff_0000 -0150 00ff 0012 sr @0x0012, $AC1.M // *0x12 = ac1.m -0152 1470 lsr $ACC0, #-16 // // t >>= 16 unsigned -0153 00df 0011 lr $AC1.M, @0x0011 -0155 3f00 orc $AC1.M, $AC0.M -0156 00ff 0011 sr @0x0011, $AC1.M // *0x11 |= previous ac0.h, now at ac0.m <- so ac0.m = unsigned ac0.h -0158 1fa5 mrr $AC1.L, $IX1 // ac1.l = 0x4000 -0159 1501 lsl $ACC1, #1 // ac1.l = 0x8000 -015a 1fe6 mrr $AC1.M, $IX2 // ac1.m = 0x3f80 0x00_3f80_8000 -015b f100 lsl16 $ACC1 // ((acc1 << 16) >> 8) << 16 -015c 15f8 asr $ACC1, #-8 -015d f500 lsr16 $ACC1 // acc1 = 0x00_00ff_8080 -015e 1f5f mrr $AX0.H, $AC1.M // ax0.h = 0xff -015f 1f7d mrr $AX1.H, $AC1.L // ax1.h = 0x8080 -0160 8100 clr $ACC0 -0161 00de 0011 lr $AC0.M, @0x0011 -0163 3400 andr $AC0.M, $AX0.H // ac0.m = *0x11 & 0xff -0164 8900 clr $ACC1 // so it was all to setup ax0.h and ax1.h... -0165 00df 0012 lr $AC1.M, @0x0012 -0167 3500 andr $AC1.M, $AX0.H // ac1.m = *0x12 & 0xff -0168 4c00 add $ACC0, $ACC1 -0169 00df 0012 lr $AC1.M, @0x0012 -016b 1578 lsr $ACC1, #-8 -016c 4c00 add $ACC0, $ACC1 // acc0 = ((*0x11 & 0xff) << 16) + ((*0x12 & 0xff) << 16) + (*0x12 << 8) -016d 8900 clr $ACC1 -016e 1ffe mrr $AC1.M, $AC0.M -016f 1508 lsl $ACC1, #8 -0170 3b00 orr $AC1.M, $AX1.H // ac1.m = (ac0.m << 8) | 0x8080 -0171 00de 0011 lr $AC0.M, @0x0011 -0173 3e00 orc $AC0.M, $AC1.M // final11 = *0x11 | (ac0.m << 8) | 0x8080 -0174 00df 0012 lr $AC1.M, @0x0012 -0176 3b00 orr $AC1.M, $AX1.H -0177 1cbf mrr $IX1, $AC1.M // final12 = *0x12 | 0x8080 - -// write the final values @22 and @23 -// 0178 00da 15f1 lr $AX0.H, @0x15f1 // drom 0200 -// 017a 3500 andr $AC1.M, $AX0.H -// 017b 0295 0192 jz 0x0192 -if (final12 & 0x200 != 0) { - - // 017d 00df 10e2 lr $AC1.M, @0x10e2 // drom 376f - // 017f 1508 lsl $ACC1, #8 // -> 0x37_6f00 - // 0180 1f5f mrr $AX0.H, $AC1.M - // 0181 00df 103b lr $AC1.M, @0x103b // drom 0065 - // 0183 7900 decm $AC1.M // -> 0x64 - // 0184 3900 orr $AC1.M, $AX0.H - // 0185 3080 xorc $AC0.M, $AC1.M - // 0186 00fe 0022 sr @0x0022, $AC0.M // *0x22 = final11 ^ 0x6f64 - // 0188 00dc 1229 lr $AC0.L, @0x1229 // drom 657c - // 018a 00dd 11f8 lr $AC1.L, @0x11f8 // drom 0009 - // 018c 5c00 sub $ACC0, $ACC1 - // 018d f000 lsl16 $ACC0 - // 018e 1fe5 mrr $AC1.M, $IX1 - // 018f 3080 xorc $AC0.M, $AC1.M // *0x23 = final12 ^ 0x6573 - // 0190 029f 01a5 jmp 0x01a5 - *0x22 = final11 ^ 0x6f64 - *0x23 = final12 ^ 0x6573 - -} else { - // 0192 00df 10ca lr $AC1.M, @0x10ca // drom 3461 - // 0194 1508 lsl $ACC1, #8 // -> 0x34_6100 - // 0195 1f5f mrr $AX0.H, $AC1.M - // 0196 00df 1043 lr $AC1.M, @0x1043 // drom 0076 - // 0198 7500 incm $AC1.M // -> 0x77 - // 0199 3900 orr $AC1.M, $AX0.H - // 019a 3080 xorc $AC0.M, $AC1.M - // 019b 00fe 0022 sr @0x0022, $AC0.M // *0x22 = final11 ^ 0x6177 - // 019d 00dc 1259 lr $AC0.L, @0x1259 // drom 6143 - // 019f 00dd 16fe lr $AC1.L, @0x16fe // drom 0008 - // 01a1 4c00 add $ACC0, $ACC1 - // 01a2 f000 lsl16 $ACC0 - // 01a3 1fe5 mrr $AC1.M, $IX1 - // 01a4 3080 xorc $AC0.M, $AC1.M // *0x23 = final12 ^ 0x614b - *0x22 = final11 ^ 0x6177 - *0x23 = final12 ^ 0x614b -} -// 01a5 00fe 0023 sr @0x0023, $AC0.M // taken care of above - -// this is where result is written to main memory -// dsp mem 0x20-0x23 (8 bytes) are written back - only values @22 and @23 were modified, so result is 32bit -01a7 00da 0008 lr $AX0.H, @0x0008 // sec_params.dest_addr[0] -01a9 00d8 0009 lr $AX0.L, @0x0009 // sec_params.dest_addr[1] -01ab 009b 0020 lri $AX1.H, #0x0020 // dsp addr -01ad 0099 0008 lri $AX1.L, #0x0008 // length -01af 0087 0000 lri $IX3, #0x0000 // there will be no iram dma -01b1 02bf 808b call 0x808b // do it! - -01b3 02df ret -} - -01b4 0000 nop -01b5 0000 nop -01b6 0000 nop -01b7 0000 nop -01b8 0000 nop -01b9 0000 nop -01ba 0000 nop -01bb 0000 nop -01bc 0000 nop -01bd 0000 nop -01be 0000 nop -01bf 0000 nop diff --git a/docs/DSP/DSP_UC_IPL_24B22038.txt b/docs/DSP/DSP_UC_IPL_24B22038.txt deleted file mode 100644 index 35848c957a..0000000000 --- a/docs/DSP/DSP_UC_IPL_24B22038.txt +++ /dev/null @@ -1,1985 +0,0 @@ -0000 029f 0010 jmp 0x0010 -0002 0000 nop -0003 0000 nop -0004 02ff rti -0005 0000 nop -0006 02ff rti -0007 0000 nop -0008 02ff rti -0009 0000 nop -000a 02ff rti -000b 0000 nop -000c 02ff rti -000d 0000 nop -000e 02ff rti -000f 0000 nop - -// Entry -void 0010_Entry() -{ -0010 1302 sbset #0x02 -0011 1303 sbset #0x03 -0012 1204 sbclr #0x04 -0013 1305 sbset #0x05 -0014 1306 sbset #0x06 -0015 8e00 set16 -0016 8c00 clr15 -0017 8b00 m0 -0018 009e ffff lri $AC0.M, #0xffff -001a 1d1e mrr $WR0, $AC0.M -001b 1d3e mrr $WR1, $AC0.M -001c 1d5e mrr $WR2, $AC0.M -001d 1d7e mrr $WR3, $AC0.M -001e 0092 00ff lri $CR, #0x00ff -0020 8100 clr $ACC0 -0021 009f 1000 lri $AC1.M, #0x1000 -0023 0080 0000 lri $AR0, #0x0000 -0025 005f loop $AC1.M - 0026 1b1e srri @$AR0, $AC0.M // clear dram -0027 26ff lrs $AC0.M, @CMBL -0028 16fc 8888 si @DMBH, #0x8888 -002a 16fd 1111 si @DMBL, #0x1111 // SENDMAIL 0x88881111 -002c 26fc lrs $AC0.M, @DMBH -002d 02a0 8000 andf $AC0.M, #0x8000 -002f 029c 002c jlnz 0x002c -} - -void 0031_MainLoop() -{ -0031 8100 clr $ACC0 -0032 8900 clr $ACC1 -0033 26fe lrs $AC0.M, @CMBH -0034 02c0 8000 andcf $AC0.M, #0x8000 -0036 029c 0031 jlnz 0x0031 // wait for mail -0038 27ff lrs $AC1.M, @CMBL -0039 00ff 0345 sr @0x0345, $AC1.M -003b 1ffe mrr $AC1.M, $AC0.M -003c 0340 00ff andi $AC1.M, #0x00ff -003e 00ff 0344 sr @0x0344, $AC1.M -0040 1479 lsr $ACC0, #-7 -0041 0240 007e andi $AC0.M, #0x007e -0043 0200 0062 addi $AC0.M, #0x0062 -0045 00fe 0343 sr @0x0343, $AC0.M -0047 1c1e mrr $AR0, $AC0.M -0048 170f jmpr $AR0 // jump on CMD? -0049 009e 8000 lri $AC0.M, #0x8000 -004b 00dc 0343 lr $AC0.L, @0x0343 -004d 02bf 005a call 005a_SendMail(AC0.M,AC0.L) // sendmail 0x8000???? -004f 029f 0031 jmp 0x0031 -} - -void 0051_WaitForMailAndStoreIt(DEST $AR0) -{ -0051 26fe lrs $AC0.M, @CMBH -0052 02c0 8000 andcf $AC0.M, #0x8000 -0054 029c 0051 jlnz 0x0051 -0056 24ff lrs $AC0.L, @CMBL -0057 1b1e srri @$AR0, $AC0.M -0058 1b1c srri @$AR0, $AC0.L -0059 02df ret -} - -void 005a_SendMail(AC0.M,AC0.L) -{ -005a 2efc srs @DMBH, $AC0.M -005b 2cfd srs @DMBL, $AC0.L -005c 26fc lrs $AC0.M, @DMBH -005d 02a0 8000 andf $AC0.M, #0x8000 -005f 029c 005c jlnz 0x005c -0061 02df ret -} - -//CMDs -0062 029f 0049 jmp 0x0049 // CMD_0 -0064 029f 02bd jmp 0x02bd // CMD_1 -0066 029f 0470 jmp 0x0470 // CMD_2 -0068 029f 0031 jmp 0x0031 // CMD_3 -006a 029f 00df jmp 0x00df // CMD_4 -006c 029f 00f1 jmp 0x00f1 // CMD_5 -006e 029f 05bb jmp 0x05bb // CMD_6 -0070 029f 056f jmp 0x056f // CMD_7 -0072 029f 05d7 jmp 0x05d7 // CMD_8 -0074 029f 059f jmp 0x059f // CMD_9 -0076 029f 0741 jmp 0x0741 // CMD_A -0078 029f 0618 jmp 0x0618 // CMD_B - jump to IROM area (0x8644) -007a 029f 0203 jmp 0x0203 // CMD_C - -{ -007c 193e lrri $AC0.M, @$AR1 -007d 193c lrri $AC0.L, @$AR1 -007e 2fcd srs @DSPA, $AC1.M -007f 0f00 lris $AC1.M, #0x00 -0080 2fc9 srs @DSCR, $AC1.M // DMEM->CPU -0081 2ece srs @DSMAH, $AC0.M -0082 2ccf srs @DSMAL, $AC0.L -0083 1fe0 mrr $AC1.M, $AR0 -0084 1501 lsl $ACC1, #1 -0085 2fcb srs @DSBL, $AC1.M -0086 02bf 008f call 0x008f -0088 02df ret -} - -{ -0089 193e lrri $AC0.M, @$AR1 -008a 193c lrri $AC0.L, @$AR1 -008b 2fcd srs @DSPA, $AC1.M -008c 0f01 lris $AC1.M, #0x01 -008d 029f 0080 jmp 0x0080 -} - -{ -008f 26c9 lrs $AC0.M, @DSCR -0090 02a0 0004 andf $AC0.M, #0x0004 -0092 029c 008f jlnz 0x008f -0094 02df ret -} - -{ -0095 193e lrri $AC0.M, @$AR1 -0096 193c lrri $AC0.L, @$AR1 -0097 00ff ffcd sr @DSPA, $AC1.M -0099 0f00 lris $AC1.M, #0x00 -009a 00ff ffc9 sr @DSCR, $AC1.M -009c 00fe ffce sr @DSMAH, $AC0.M -009e 00fc ffcf sr @DSMAL, $AC0.L -00a0 1fe0 mrr $AC1.M, $AR0 -00a1 1501 lsl $ACC1, #1 -00a2 00ff ffcb sr @DSBL, $AC1.M -00a4 02df ret -} - -void 00a5_WaitForDMAend() -{ -00a5 00de ffc9 lr $AC0.M, @DSCR -00a7 02a0 0004 andf $AC0.M, #0x0004 -00a9 029c 00a5 jlnz 0x00a5 -00ab 02df ret -} - -void 00ac_AccZeldaTypeRead() -{ -00ac 193e lrri $AC0.M, @$AR1 -00ad 193c lrri $AC0.L, @$AR1 -00ae 0240 7fff andi $AC0.M, #0x7fff -00b0 02bf 00ba call 00ba_AccSetup() -00b2 007a 00b8 bloop $AX0.H, 0x00b8 -00b4 26d3 lrs $AC0.M, @UnkZelda -00b5 1b3e srri @$AR1, $AC0.M -00b6 0000 nop -00b7 0000 nop -00b8 0000 nop -00b9 02df ret -} - -void 00ba_AccSetup() -{ -00ba 1c3f mrr $AR1, $AC1.M -00bb 009f 0005 lri $AC1.M, #0x0005 -00bd 2fd1 srs @SampleFormat, $AC1.M // reads will be u8 -00be 1f5e mrr $AX0.H, $AC0.M -00bf 1f1c mrr $AX0.L, $AC0.L -00c0 2ed4 srs @ACSAH, $AC0.M -00c1 2cd5 srs @ACSAL, $AC0.L -00c2 8900 clr $ACC1 -00c3 1fa0 mrr $AC1.L, $AR0 -00c4 4c00 add $ACC0, $ACC1 -00c5 0200 0030 addi $AC0.M, #0x0030 -00c7 2ed6 srs @ACEAH, $AC0.M -00c8 2cd7 srs @ACEAL, $AC0.L -00c9 1fda mrr $AC0.M, $AX0.H -00ca 1f98 mrr $AC0.L, $AX0.L -00cb 147f lsr $ACC0, #-1 -00cc 2ed8 srs @ACCAH, $AC0.M -00cd 2cd9 srs @ACCAL, $AC0.L -00ce 1f40 mrr $AX0.H, $AR0 -00cf 02df ret -} - -void 00d0_AccZeldaTypeWrite() -{ -00d0 193e lrri $AC0.M, @$AR1 -00d1 193c lrri $AC0.L, @$AR1 -00d2 0260 8000 ori $AC0.M, #0x8000 -00d4 02bf 00ba call 00ba_AccSetup() -00d6 007a 00dd bloop $AX0.H, 0x00dd -{ - 00d8 193e lrri $AC0.M, @$AR1 - 00d9 2ed3 srs @UnkZelda, $AC0.M - 00da 0000 nop - 00db 0000 nop - 00dc 0000 nop - 00dd 0000 nop -} -00de 02df ret -} - -{ -00df 0080 0346 lri $AR0, #0x0346 -00e1 02bf 0051 call 0x0051 -00e3 02bf 0051 call 0x0051 -00e5 0081 0346 lri $AR1, #0x0346 -00e7 00df 0349 lr $AC1.M, @0x0349 -00e9 0340 ffff andi $AC1.M, #0xffff -00eb 00c0 0345 lr $AR0, @0x0345 -00ed 02bf 007c call 0x007c -00ef 029f 0049 jmp 0x0049 -} - -{ -00f1 0080 0346 lri $AR0, #0x0346 -00f3 02bf 0051 call 0x0051 -00f5 02bf 0051 call 0x0051 -00f7 0081 0346 lri $AR1, #0x0346 -00f9 00df 0349 lr $AC1.M, @0x0349 -00fb 0340 ffff andi $AC1.M, #0xffff -00fd 00c0 0345 lr $AR0, @0x0345 -00ff 02bf 0089 call 0x0089 -0101 029f 0049 jmp 0x0049 -} - -{ -0103 0092 00ff lri $CR, #0x00ff -0105 2fd1 srs @SampleFormat, $AC1.M -0106 0340 0003 andi $AC1.M, #0x0003 -0108 1f7f mrr $AX1.H, $AC1.M -0109 1f5e mrr $AX0.H, $AC0.M -010a 1f1c mrr $AX0.L, $AC0.L -010b 0200 0010 addi $AC0.M, #0x0010 -010d 2ed4 srs @ACSAH, $AC0.M -010e 2cd5 srs @ACSAL, $AC0.L -010f 8900 clr $ACC1 -0110 1fa0 mrr $AC1.L, $AR0 -0111 4c00 add $ACC0, $ACC1 -0112 0200 0030 addi $AC0.M, #0x0030 -0114 2ed6 srs @ACEAH, $AC0.M -0115 2cd7 srs @ACEAL, $AC0.L -0116 1fda mrr $AC0.M, $AX0.H -0117 1f98 mrr $AC0.L, $AX0.L -0118 1ffb mrr $AC1.M, $AX1.H -0119 7900 decm $AC1.M -011a 02ca lsrn -011b 2ed8 srs @ACCAH, $AC0.M -011c 2cd9 srs @ACCAL, $AC0.L -011d 02df ret -} - -//DSPLLE errors here!!! readw/writes from 0x3??? -{ -011e 1c23 mrr $AR1, $AR3 -011f 197e lrri $AC0.M, @$AR3 -0120 191b lrri $AX1.H, @$AR0 -0121 d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 -0122 1128 0128 bloopi #0x28, 0x0128 -0124 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 -0125 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M -0126 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 -0127 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M -0128 4900 addax $ACC1, $AX0 -0129 02df ret -} - -{ -012a 8f00 set40 -012b 1c03 mrr $AR0, $AR3 -012c 00db 038e lr $AX1.H, @0x038e -012e 009a 0004 lri $AX0.H, #0x0004 -0130 1978 lrri $AX0.L, @$AR3 -0131 a843 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR3 -0132 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 -0133 1128 0138 bloopi #0x28, 0x0138 -0135 38c3 asrnrx'l $ACC0, $AX0.H : $AX0.L, @$AR3 -0136 ae30 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC0.M -0137 38c3 asrnrx'l $ACC0, $AX0.H : $AX0.L, @$AR3 -0138 ae30 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC0.M -0139 8e00 set16 -013a 02df ret -} - -{ -013b 00f9 0361 sr @0x0361, $AX1.L -013d 1fc0 mrr $AC0.M, $AR0 -013e 0200 fffc addi $AC0.M, #0xfffc -0140 1c1e mrr $AR0, $AC0.M -0141 1c5e mrr $AR2, $AC0.M -0142 0083 0424 lri $AR3, #0x0424 -0144 197e lrri $AC0.M, @$AR3 -0145 197f lrri $AC1.M, @$AR3 -0146 80a2 nx'sl : $AC0.M, $AX0.H -0147 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H -0148 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M -0149 1b1f srri @$AR0, $AC1.M -014a 1c02 mrr $AR0, $AR2 -014b 8100 clr $ACC0 -014c 00de 0402 lr $AC0.M, @0x0402 -014e 00fe 0362 sr @0x0362, $AC0.M -0150 1474 lsr $ACC0, #-12 -0151 1f7e mrr $AX1.H, $AC0.M -0152 1f3c mrr $AX1.L, $AC0.L -0153 8900 clr $ACC1 -0154 00dd 0418 lr $AC1.L, @0x0418 -0156 1504 lsl $ACC1, #4 -0157 0604 cmpis $AC0.M, #0x04 -0158 0290 01b0 jge 0x01b0 -015a 1fdd mrr $AC0.M, $AC1.L -015b 0082 0c00 lri $AR2, #0x0c00 -015d 1050 loopi #0x50 -015e 4b2a addax's $ACC1, $AX1 : @$AR2, $AC1.L -015f 1fbe mrr $AC1.L, $AC0.M -0160 00fe 0360 sr @0x0360, $AC0.M -0162 8900 clr $ACC1 -0163 1fbe mrr $AC1.L, $AC0.M -0164 009a fff8 lri $AX0.H, #0xfff8 -0166 009b 00fc lri $AX1.H, #0x00fc -0168 00d8 0361 lr $AX0.L, @0x0361 -016a 0082 0c00 lri $AR2, #0x0c00 -016c 0083 0c00 lri $AR3, #0x0c00 -016e 195e lrri $AC0.M, @$AR2 -016f 3480 lsrnrx $ACC0, $AX0.H -0170 1128 0175 bloopi #0x28, 0x0175 -0172 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 -0173 35b3 lsrnrx's $ACC1, $AX0.H : @$AR3, $AC0.M -0174 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 -0175 34bb lsrnrx's $ACC0, $AX0.H : @$AR3, $AC1.M -0176 8a00 m2 -0177 0082 0c00 lri $AR2, #0x0c00 -0179 00dd 0418 lr $AC1.L, @0x0418 -017b 1504 lsl $ACC1, #4 -017c 1fe0 mrr $AC1.M, $AR0 -017d 8100 clr $ACC0 -017e 00de 0362 lr $AC0.M, @0x0362 -0180 1474 lsr $ACC0, #-12 -0181 1f7e mrr $AX1.H, $AC0.M -0182 1f3c mrr $AX1.L, $AC0.L -0183 8f00 set40 -0184 1943 lrri $AR3, @$AR2 -0185 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 -0186 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0187 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0188 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0189 f200 madd $AX0.L, $AX0.H -018a fe00 movpz $ACC0 -018b 1c1f mrr $AR0, $AC1.M -018c 1943 lrri $AR3, @$AR2 -018d 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 -018e 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -018f 114e 0197 bloopi #0x4e, 0x0197 -0191 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0192 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0193 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M -0194 1c1f mrr $AR0, $AC1.M -0195 1943 lrri $AR3, @$AR2 -0196 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 -0197 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 -0198 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -0199 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 -019a f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M -019b fe00 movpz $ACC0 -019c 1b3e srri @$AR1, $AC0.M -019d 8b00 m0 -019e 8e00 set16 -019f 00fe 041b sr @0x041b, $AC0.M -01a1 1c1f mrr $AR0, $AC1.M -01a2 150c lsl $ACC1, #12 -01a3 0340 0fff andi $AC1.M, #0x0fff -01a5 00ff 0418 sr @0x0418, $AC1.M -01a7 0083 0424 lri $AR3, #0x0424 -01a9 191e lrri $AC0.M, @$AR0 -01aa 191f lrri $AC1.M, @$AR0 -01ab 80a0 nx'ls : $AX0.H, $AC0.M -01ac 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M -01ad 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M -01ae 1b7f srri @$AR3, $AC1.M -01af 02df ret -} - -{ -01b0 1fe0 mrr $AC1.M, $AR0 -01b1 1c1f mrr $AR0, $AC1.M -01b2 1128 01b9 bloopi #0x28, 0x01b9 -01b4 4b70 addax'l $ACC1, $AX1 : $AC0.M, @$AR0 -01b5 1b3e srri @$AR1, $AC0.M -01b6 1c1f mrr $AR0, $AC1.M -01b7 4b70 addax'l $ACC1, $AX1 : $AC0.M, @$AR0 -01b8 1b3e srri @$AR1, $AC0.M -01b9 1c1f mrr $AR0, $AC1.M -01ba 029f 019f jmp 0x019f -} - -{ -01bc 8a00 m2 -01bd 0088 0007 lri $WR0, #0x0007 -01bf 1150 01cc bloopi #0x50, 0x01cc -{ - 01c1 1c61 mrr $AR3, $AR1 - 01c2 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 01c3 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c4 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c5 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c6 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c7 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c8 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01c9 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01ca f200 madd $AX0.L, $AX0.H - 01cb fe00 movpz $ACC0 - 01cc 1b3e srri @$AR1, $AC0.M -} -01cd 0088 ffff lri $WR0, #0xffff -01cf 8b00 m0 -01d0 02df ret -} - -{ -01d1 0088 0003 lri $WR0, #0x0003 -01d3 0085 0000 lri $IX1, #0x0000 -01d5 0087 0000 lri $IX3, #0x0000 -01d7 1fc2 mrr $AC0.M, $AR2 -01d8 195b lrri $AX1.H, @$AR2 -01d9 1959 lrri $AX1.L, @$AR2 -01da 195f lrri $AC1.M, @$AR2 -01db 195a lrri $AX0.H, @$AR2 -01dc 1c5e mrr $AR2, $AC0.M -01dd 1fda mrr $AC0.M, $AX0.H -01de 1c61 mrr $AR3, $AR1 -01df 8a00 m2 -01e0 8f00 set40 -01e1 191a lrri $AX0.H, @$AR0 -01e2 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 -01e3 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 -01e4 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 -01e5 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 -01e6 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 -01e7 1127 01f2 bloopi #0x27, 0x01f2 -{ - 01e9 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 01ea 197e lrri $AC0.M, @$AR3 - 01eb e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 01ec eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 01ed bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 01ee e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 01ef 197f lrri $AC1.M, @$AR3 - 01f0 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 01f1 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 01f2 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 -} -01f3 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M -01f4 197e lrri $AC0.M, @$AR3 -01f5 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 -01f6 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 -01f7 bf00 mulxmv $AX0.H, $AX1.H, $ACC1 -01f8 1bff srrn @$AR3, $AC1.M -01f9 197f lrri $AC1.M, @$AR3 -01fa 8e00 set16 -01fb 8b00 m0 -01fc 0088 ffff lri $WR0, #0xffff -01fe 1b5b srri @$AR2, $AX1.H -01ff 1b59 srri @$AR2, $AX1.L -0200 1b5f srri @$AR2, $AC1.M -0201 1b5e srri @$AR2, $AC0.M -0202 02df ret -} - -{ -0203 0080 0346 lri $AR0, #0x0346 -0205 02bf 0051 call 0x0051 -0207 02bf 0051 call 0x0051 -0209 0081 0346 lri $AR1, #0x0346 -020b 009f 0580 lri $AC1.M, #0x0580 -020d 0080 0080 lri $AR0, #0x0080 -020f 02bf 007c call 0x007c -0211 0081 0348 lri $AR1, #0x0348 -0213 009f 0c00 lri $AC1.M, #0x0c00 -0215 0080 0080 lri $AR0, #0x0080 -0217 02bf 007c call 0x007c -0219 0080 0c00 lri $AR0, #0x0c00 -021b 0081 0580 lri $AR1, #0x0580 -021d 02bf 01d1 call 0x01d1 -021f 0081 0346 lri $AR1, #0x0346 -0221 009f 0580 lri $AC1.M, #0x0580 -0223 0080 0080 lri $AR0, #0x0080 -0225 02bf 0089 call 0x0089 -0227 0081 0348 lri $AR1, #0x0348 -0229 009f 0c00 lri $AC1.M, #0x0c00 -022b 0080 0080 lri $AR0, #0x0080 -022d 02bf 0089 call 0x0089 -022f 029f 0049 jmp 0x0049 -} - -void 0231_FormatAudioSynths(format AC0.M) -{ -0231 8100 clr $ACC0 -0232 1f5e mrr $AX0.H, $AC0.M -0233 00d8 0402 lr $AX0.L, @0x0402 -0235 00dc 0418 lr $AC0.L, @0x0418 -0237 0080 0520 lri $AR0, #0x0520 -0239 00df 0440 lr $AC1.M, @0x0440 -023b 1501 lsl $ACC1, #1 -023c 0340 007e andi $AC1.M, #0x007e -023e 0300 0246 addi $AC1.M, #0x0246 -0240 1c5f mrr $AR2, $AC1.M -0241 175f callr $AR2 // call 0x0246 -0242 00fc 0418 sr @0x0418, $AC0.L -0244 029f 04e7 jmp 0x04e7 // dummy -0246 029f 0257 jmp 0x0257 // 0x0 - Synth0 -0248 029f 028f jmp 0x028f // 0x1 - Synth1 -024a 029f 0277 jmp 0x0277 // 0x2 - Synth2 -024c 029f 0267 jmp 0x0267 // 0x3 - Synth3 -024e 029f 0292 jmp 0x0292 // 0x4 - Synth4 -0250 029f 0256 jmp 0x0256 // 0x5 - dummy -0252 029f 02b1 jmp 0x02b1 // 0x6 - Synth6 -0254 029f 02ae jmp 0x02ae // 0x7 - Synth7 -0256 02df ret -} - -void 0257_Synth0() -{ -0257 1401 lsl $ACC0, #1 -0258 009b c000 lri $AX1.H, #0xc000 -025a 0099 4000 lri $AX1.L, #0x4000 -025c 1150 0264 bloopi #0x50, 0x0264 -{ - 025e 02c0 0001 andcf $AC0.M, #0x0001 - 0260 027c iflnz - 0261 1b1b srri @$AR0, $AX1.H - 0262 027d iflz - 0263 1b19 srri @$AR0, $AX1.L - 0264 4800 addax $ACC0, $AX0 -} -0265 147f lsr $ACC0, #-1 -0266 02df ret -} - -void 0267_Synth3() -{ -0267 1401 lsl $ACC0, #1 -0268 009b c000 lri $AX1.H, #0xc000 -026a 0099 4000 lri $AX1.L, #0x4000 -026c 1150 0274 bloopi #0x50, 0x0274 -{ - 026e 02c0 0003 andcf $AC0.M, #0x0003 - 0270 027c iflnz - 0271 1b1b srri @$AR0, $AX1.H - 0272 027d iflz - 0273 1b19 srri @$AR0, $AX1.L - 0274 4800 addax $ACC0, $AX0 -} -0275 147f lsr $ACC0, #-1 -0276 02df ret -} - -void 0277_Synth2() -{ -0277 1401 lsl $ACC0, #1 -0278 0081 0ca0 lri $AR1, #0x0ca0 -027a 009b c000 lri $AX1.H, #0xc000 -027c 0099 4000 lri $AX1.L, #0x4000 -027e 8900 clr $ACC1 -027f 0082 0000 lri $AR2, #0x0000 -0281 1150 028c bloopi #0x50, 0x028c -{ - 0283 02c0 0001 andcf $AC0.M, #0x0001 - 0285 027c iflnz - 0286 1b1b srri @$AR0, $AX1.H - 0287 027d iflz - 0288 1b19 srri @$AR0, $AX1.L - 0289 183d lrr $AC1.L, @$AR1 - 028a 4900 addax $ACC1, $AX0 - 028b 1fe2 mrr $AC1.M, $AR2 - 028c 4c39 add's $ACC0, $ACC1 : @$AR1, $AC1.M -} -028d 147f lsr $ACC0, #-1 -028e 02df ret -} - -void 028f_Synth1() -{ -028f 1050 loopi #0x50 - 0290 4820 addax's $ACC0, $AX0 : @$AR0, $AC0.L -0291 02df ret -} - -void 0292_Synth4() -{ -0292 0082 0140 lri $AR2, #0x0140 -0294 008a 003f lri $WR2, #0x003f -0296 0086 0000 lri $IX2, #0x0000 -0298 1406 lsl $ACC0, #6 -0299 8900 clr $ACC1 -029a 1fb8 mrr $AC1.L, $AX0.L -029b 1506 lsl $ACC1, #6 -029c 009b 003f lri $AX1.H, #0x003f -029e 009a 0000 lri $AX0.H, #0x0000 -02a0 3600 andr $AC0.M, $AX1.H -02a1 1cde mrr $IX2, $AC0.M -02a2 001a addarn $AR2, $IX2 -02a3 3400 andr $AC0.M, $AX0.H -02a4 1150 02aa bloopi #0x50, 0x02aa -{ - 02a6 4c00 add $ACC0, $ACC1 - 02a7 364a andr'l $AC0.M, $AX1.H : $AX1.L, @$AR2 - 02a8 1cde mrr $IX2, $AC0.M - 02a9 340e andr'nr $AC0.M, $AX0.H : $AR2 - 02aa 1b19 srri @$AR0, $AX1.L -} -02ab 1fc2 mrr $AC0.M, $AR2 -02ac 147a lsr $ACC0, #-6 -02ad 02df ret -} - -void 02b1_Synth7() -{ -02ae 1050 loopi #0x50 - 02af 1b18 srri @$AR0, $AX0.L -02b0 02df ret -} - -void 02b1_Synth6() -{ -02b1 0083 0000 lri $AR3, #0x0000 -02b3 140f lsl $ACC0, #15 -02b4 4853 addax'l $ACC0, $AX0 : $AX0.H, @$AR3 -02b5 1114 02ba bloopi #0x14, 0x02ba -{ - 02b7 48a2 addax'sl $ACC0, $AX0 : $AC0.M, $AX0.H - 02b8 48a2 addax'sl $ACC0, $AX0 : $AC0.M, $AX0.H - 02b9 48a2 addax'sl $ACC0, $AX0 : $AC0.M, $AX0.H - 02ba 48a2 addax'sl $ACC0, $AX0 : $AC0.M, $AX0.H -} -02bb 146f lsr $ACC0, #-17 -02bc 02df ret -} - -{ -02bd 0080 0380 lri $AR0, #0x0380 -02bf 02bf 0051 call 0x0051 -02c1 02bf 0051 call 0x0051 -02c3 02bf 0051 call 0x0051 -02c5 02bf 0051 call 0x0051 -02c7 0081 0382 lri $AR1, #0x0382 -02c9 009f 0000 lri $AC1.M, #0x0000 -02cb 0080 0200 lri $AR0, #0x0200 -02cd 02bf 007c call 0x007c -02cf 0081 0384 lri $AR1, #0x0384 -02d1 009f 0300 lri $AC1.M, #0x0300 -02d3 0080 0020 lri $AR0, #0x0020 -02d5 02bf 007c call 0x007c -02d7 02bf 0351 call 0x0351 -02d9 00de 0345 lr $AC0.M, @0x0345 -02db 00fe 0342 sr @0x0342, $AC0.M -02dd 029f 0049 jmp 0x0049 -} - -{ -02df 00de 0344 lr $AC0.M, @0x0344 -02e1 1404 lsl $ACC0, #4 -02e2 0200 03a8 addi $AC0.M, #0x03a8 -02e4 1c1e mrr $AR0, $AC0.M -02e5 02bf 0051 call 0x0051 -02e7 02bf 0051 call 0x0051 -02e9 02bf 0051 call 0x0051 -02eb 00de 0345 lr $AC0.M, @0x0345 -02ed 1b1e srri @$AR0, $AC0.M -02ee 00de 0344 lr $AC0.M, @0x0344 -02f0 0200 03a4 addi $AC0.M, #0x03a4 -02f2 1c1e mrr $AR0, $AC0.M -02f3 8100 clr $ACC0 -02f4 1b1e srri @$AR0, $AC0.M -02f5 02df ret -} - -{ -02f6 00de 0344 lr $AC0.M, @0x0344 -02f8 1404 lsl $ACC0, #4 -02f9 0200 03b0 addi $AC0.M, #0x03b0 -02fb 1c1e mrr $AR0, $AC0.M -02fc 02bf 0051 call 0x0051 -02fe 02bf 0051 call 0x0051 -0300 02bf 0051 call 0x0051 -0302 02bf 0051 call 0x0051 -0304 02df ret -} - -{ -0305 0081 034c lri $AR1, #0x034c -0307 009f 0400 lri $AC1.M, #0x0400 -0309 0080 0080 lri $AR0, #0x0080 -030b 02bf 007c call 0x007c -030d 02df ret -} - -{ -030e 0081 034c lri $AR1, #0x034c -0310 009f 0a00 lri $AC1.M, #0x0a00 -0312 0080 0004 lri $AR0, #0x0004 -0314 02bf 00a5 call 00a5_WaitForDMAend() -0316 02bf 007c call 0x007c -0318 0081 034c lri $AR1, #0x034c -031a 009f 0400 lri $AC1.M, #0x0400 -031c 0080 0080 lri $AR0, #0x0080 -031e 02bf 0095 call 0x0095 -0320 02df ret -} - -{ -0321 0081 034c lri $AR1, #0x034c -0323 009f 0400 lri $AC1.M, #0x0400 -0325 0080 0040 lri $AR0, #0x0040 -0327 0081 034c lri $AR1, #0x034c -0329 193e lrri $AC0.M, @$AR1 -032a 193c lrri $AC0.L, @$AR1 -032b 0098 0000 lri $AX0.L, #0x0000 -032d 7000 addaxl $ACC0, $AX0.L -032e 02bf 008b call 0x008b -0330 02df ret -} - -{ -0331 191e lrri $AC0.M, @$AR0 -0332 191a lrri $AX0.H, @$AR0 -0333 005f loop $AC1.M -0334 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M -0335 1b7e srri @$AR3, $AC0.M -0336 1b7a srri @$AR3, $AX0.H -0337 02df ret -} - -{ -0338 191e lrri $AC0.M, @$AR0 -0339 191a lrri $AX0.H, @$AR0 -033a 007f 033f bloop $AC1.M, 0x033f -{ - 033c 32b2 not's $AC0.M : @$AR2, $AC0.M - 033d 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 033e 33ba not's $AC1.M : @$AR2, $AC1.M - 033f 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M -} -0340 0000 nop -0341 02df ret -} - -{ -0342 8a00 m2 -0343 157f lsr $ACC1, #-1 -0344 1c20 mrr $AR1, $AR0 -0345 1c03 mrr $AR0, $AR3 -0346 193a lrri $AX0.H, @$AR1 -0347 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 -0348 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 -0349 007f 034e bloop $AC1.M, 0x034e -{ - 034b 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 034c 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 034d 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 034e 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H -} -034f 8b00 m0 -0350 02df ret -} - -{ -0351 0083 ffa0 lri $AR3, #0xffa0 -0353 0080 0300 lri $AR0, #0x0300 -0355 009f 000e lri $AC1.M, #0x000e -0357 1108 035c bloopi #0x08, 0x035c -{ - 0359 191e lrri $AC0.M, @$AR0 - 035a 1b7e srri @$AR3, $AC0.M - 035b 191e lrri $AC0.M, @$AR0 - 035c 1b7e srri @$AR3, $AC0.M -} -035d 02df ret -} - -{ -035e 0080 0f40 lri $AR0, #0x0f40 -0360 0082 0d00 lri $AR2, #0x0d00 -0362 0083 0d60 lri $AR3, #0x0d60 -0364 009f 0028 lri $AC1.M, #0x0028 -0366 02bf 0338 call 0x0338 -0368 8900 clr $ACC1 -0369 009e 0050 lri $AC0.M, #0x0050 -036b 0080 0ca0 lri $AR0, #0x0ca0 -036d 005e loop $AC0.M - 036e 1b1f srri @$AR0, $AC1.M -036f 0080 0f40 lri $AR0, #0x0f40 -0371 005e loop $AC0.M - 0372 1b1f srri @$AR0, $AC1.M -0373 0080 0fa0 lri $AR0, #0x0fa0 -0375 005e loop $AC0.M - 0376 1b1f srri @$AR0, $AC1.M -0377 02df ret -} - -{ -0378 0080 0dc0 lri $AR0, #0x0dc0 -037a 009e 0180 lri $AC0.M, #0x0180 -037c 8900 clr $ACC1 -037d 005e loop $AC0.M - 037e 1b1f srri @$AR0, $AC1.M -037f 02df ret -} - -{ -0380 00c0 03a0 lr $AR0, @0x03a0 -0382 191a lrri $AX0.H, @$AR0 -0383 00df 03a1 lr $AC1.M, @0x03a1 -0385 009b 00a0 lri $AX1.H, #0x00a0 -0387 0081 0393 lri $AR1, #0x0393 -0389 18bc lrrd $AC0.L, @$AR1 -038a b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 -038b bc00 mulxac $AX0.H, $AX1.H, $ACC0 -038c 0080 0050 lri $AR0, #0x0050 -038e 0508 addis $AC1.M, #0x08 -038f 02bf 007e call 0x007e -0391 00de 0390 lr $AC0.M, @0x0390 -0393 02a0 0001 andf $AC0.M, #0x0001 -0395 029d 039f jlz 0x039f -0397 0080 0398 lri $AR0, #0x0398 -0399 009e 0008 lri $AC0.M, #0x0008 -039b 00c1 03a1 lr $AR1, @0x03a1 -039d 02bf 01bc call 0x01bc -039f 009f 0050 lri $AC1.M, #0x0050 -03a1 00c0 03a1 lr $AR0, @0x03a1 -03a3 8100 clr $ACC0 -03a4 00de 0394 lr $AC0.M, @0x0394 -03a6 b100 tst $ACC0 -03a7 0295 03ae jz 0x03ae -03a9 1c7e mrr $AR3, $AC0.M -03aa 00d8 0395 lr $AX0.L, @0x0395 -03ac 02bf 0342 call 0x0342 -03ae 009f 0050 lri $AC1.M, #0x0050 -03b0 00c0 03a1 lr $AR0, @0x03a1 -03b2 8100 clr $ACC0 -03b3 00de 0396 lr $AC0.M, @0x0396 -03b5 b100 tst $ACC0 -03b6 0295 03bd jz 0x03bd -03b8 1c7e mrr $AR3, $AC0.M -03b9 00d8 0397 lr $AX0.L, @0x0397 -03bb 02bf 0342 call 0x0342 -03bd 00de 0390 lr $AC0.M, @0x0390 -03bf 02a0 0002 andf $AC0.M, #0x0002 -03c1 02dd retlz -03c2 0080 0398 lri $AR0, #0x0398 -03c4 009e 0008 lri $AC0.M, #0x0008 -03c6 00c1 03a1 lr $AR1, @0x03a1 -03c8 02bf 01bc call 0x01bc -03ca 02df ret -} - -{ -03cb 009f 0dc0 lri $AC1.M, #0x0dc0 -03cd 00ff 03a1 sr @0x03a1, $AC1.M -03cf 009f 03a8 lri $AC1.M, #0x03a8 -03d1 00ff 03a2 sr @0x03a2, $AC1.M -03d3 009f 03a4 lri $AC1.M, #0x03a4 -03d5 00ff 03a0 sr @0x03a0, $AC1.M -03d7 1104 0400 bloopi #0x04, 0x0400 -{ - 03d9 00c0 03a2 lr $AR0, @0x03a2 - 03db 0083 0390 lri $AR3, #0x0390 - 03dd 009f 000e lri $AC1.M, #0x000e - 03df 02bf 0331 call 0x0331 - 03e1 00da 0390 lr $AX0.H, @0x0390 - 03e3 8600 tstaxh $AX0.H - 03e4 0295 03f1 jz 0x03f1 - 03e6 00df 03a1 lr $AC1.M, @0x03a1 - 03e8 1c7f mrr $AR3, $AC1.M - 03e9 0550 addis $AC1.M, #0x50 - 03ea 1c1f mrr $AR0, $AC1.M - 03eb 009f 0006 lri $AC1.M, #0x0006 - 03ed 02bf 0331 call 0x0331 - 03ef 02bf 0380 call 0x0380 - 03f1 00de 03a2 lr $AC0.M, @0x03a2 - 03f3 0410 addis $AC0.M, #0x10 - 03f4 00fe 03a2 sr @0x03a2, $AC0.M - 03f6 00de 03a1 lr $AC0.M, @0x03a1 - 03f8 0460 addis $AC0.M, #0x60 - 03f9 00fe 03a1 sr @0x03a1, $AC0.M - 03fb 00de 03a0 lr $AC0.M, @0x03a0 - 03fd 7400 incm $AC0.M - 03fe 00fe 03a0 sr @0x03a0, $AC0.M - 0400 0000 nop -} -0401 02df ret -} - -{ -0402 00c0 03a0 lr $AR0, @0x03a0 -0404 181a lrr $AX0.H, @$AR0 -0405 8100 clr $ACC0 -0406 181e lrr $AC0.M, @$AR0 -0407 00db 0391 lr $AX1.H, @0x0391 -0409 7400 incm $AC0.M -040a d100 cmpar $ACC1, $AX0.H -040b 0270 ifge -040c 8100 clr $ACC0 -040d 1b1e srri @$AR0, $AC0.M -040e 00df 03a1 lr $AC1.M, @0x03a1 -0410 009b 00a0 lri $AX1.H, #0x00a0 -0412 0081 0393 lri $AR1, #0x0393 -0414 18bc lrrd $AC0.L, @$AR1 -0415 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 -0416 bc00 mulxac $AX0.H, $AX1.H, $ACC0 -0417 0080 0050 lri $AR0, #0x0050 -0419 02bf 008b call 0x008b -041b 02df ret -} - -{ -041c 009f 0dc0 lri $AC1.M, #0x0dc0 -041e 00ff 03a1 sr @0x03a1, $AC1.M -0420 009f 03a8 lri $AC1.M, #0x03a8 -0422 00ff 03a2 sr @0x03a2, $AC1.M -0424 009f 03a4 lri $AC1.M, #0x03a4 -0426 00ff 03a0 sr @0x03a0, $AC1.M -0428 1104 0448 bloopi #0x04, 0x0448 -{ - 042a 00c0 03a2 lr $AR0, @0x03a2 - 042c 0083 0390 lri $AR3, #0x0390 - 042e 009f 000e lri $AC1.M, #0x000e - 0430 02bf 0331 call 0x0331 - 0432 00da 0390 lr $AX0.H, @0x0390 - 0434 8600 tstaxh $AX0.H - 0435 0295 0439 jz 0x0439 - 0437 02bf 0402 call 0x0402 - 0439 00de 03a2 lr $AC0.M, @0x03a2 - 043b 0410 addis $AC0.M, #0x10 - 043c 00fe 03a2 sr @0x03a2, $AC0.M - 043e 00de 03a1 lr $AC0.M, @0x03a1 - 0440 0460 addis $AC0.M, #0x60 - 0441 00fe 03a1 sr @0x03a1, $AC0.M - 0443 00de 03a0 lr $AC0.M, @0x03a0 - 0445 7400 incm $AC0.M - 0446 00fe 03a0 sr @0x03a0, $AC0.M - 0448 0000 nop -} -0449 02df ret -} - -{ -044a 0081 0386 lri $AR1, #0x0386 -044c 009f 03a8 lri $AC1.M, #0x03a8 -044e 0080 0040 lri $AR0, #0x0040 -0450 02bf 007c call 0x007c -0452 02df ret -} - -{ -0453 191e lrri $AC0.M, @$AR0 -0454 189c lrrd $AC0.L, @$AR0 -0455 4800 addax $ACC0, $AX0 -0456 1b1e srri @$AR0, $AC0.M -0457 1b1c srri @$AR0, $AC0.L -0458 02df ret -0459 8100 clr $ACC0 -045a 26fe lrs $AC0.M, @CMBH -045b 02c0 8000 andcf $AC0.M, #0x8000 -045d 029c 045a jlnz 0x045a -045f 26ff lrs $AC0.M, @CMBL -0460 02df ret -} - -{ -0461 0080 0388 lri $AR0, #0x0388 -0463 0081 0051 lri $AR1, #0x0051 -0465 173f callr $AR1 // call 0x0051 -0466 00de 0344 lr $AC0.M, @0x0344 -0468 00fe 0341 sr @0x0341, $AC0.M -046a 00de 0345 lr $AC0.M, @0x0345 -046c 00fe 038e sr @0x038e, $AC0.M -046e 173f callr $AR1 // call 0x0051 -046f 02df ret -} - -{ -0470 02bf 0461 call 0x0461 -0472 009e 8000 lri $AC0.M, #0x8000 -0474 00dc 0341 lr $AC0.L, @0x0341 -0476 02bf 005a call 005a_SendMail(AC0.M,AC0.L) // 0x8000???? -0478 8100 clr $ACC0 -0479 00fe 0355 sr @0x0355, $AC0.M -047b 02bf 044a call 0x044a -047d 00de 0341 lr $AC0.M, @0x0341 -047f 007e 056c bloop $AC0.M, 0x056c -{ - 0481 02bf 035e call 0x035e - 0483 02bf 03cb call 0x03cb - 0485 02bf 0459 call 0x0459 - 0487 8100 clr $ACC0 - 0488 00fe 0354 sr @0x0354, $AC0.M - 048a 00de 0342 lr $AC0.M, @0x0342 - 048c 007e 0538 bloop $AC0.M, 0x0538 - { - 048e 00d8 0354 lr $AX0.L, @0x0354 - 0490 009a 0100 lri $AX0.H, #0x0100 - 0492 8100 clr $ACC0 - 0493 00de 0380 lr $AC0.M, @0x0380 - 0495 00dc 0381 lr $AC0.L, @0x0381 - 0497 9000 mul $AX0.L, $AX0.H - 0498 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0499 00fe 034c sr @0x034c, $AC0.M - 049b 00fc 034d sr @0x034d, $AC0.L - 049d 02bf 0305 call 0x0305 - 049f 00da 0400 lr $AX0.H, @0x0400 - 04a1 8600 tstaxh $AX0.H - 04a2 0295 0533 jz 0x0533 - 04a4 00da 0401 lr $AX0.H, @0x0401 - 04a6 8600 tstaxh $AX0.H - 04a7 0294 0533 jnz 0x0533 - 04a9 00da 0406 lr $AX0.H, @0x0406 - 04ab 8600 tstaxh $AX0.H - 04ac 0294 0930 jnz 0x0930 - 04ae 8100 clr $ACC0 - 04af 00de 0440 lr $AC0.M, @0x0440 - 04b1 0607 cmpis $AC0.M, #0x07 // format 0x7 or less (Synths) - 04b2 0293 0231 jle 0x0231 - 04b4 0620 cmpis $AC0.M, #0x20 // format 0x20 - 04b5 0295 079e jz 0x079e - 04b7 0621 cmpis $AC0.M, #0x21 // format 0x21 - 04b8 0295 07a7 jz 0x07a7 - 04ba 00d8 0402 lr $AX0.L, @0x0402 - 04bc 8100 clr $ACC0 - 04bd 8900 clr $ACC1 - 04be 00dc 0418 lr $AC0.L, @0x0418 - 04c0 8d00 set15 - 04c1 0099 0050 lri $AX1.L, #0x0050 - 04c3 a000 mulx $AX0.L, $AX1.L - 04c4 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 04c5 1404 lsl $ACC0, #4 - 04c6 8c00 clr15 - 04c7 1ffe mrr $AC1.M, $AC0.M - 04c8 0083 0580 lri $AR3, #0x0580 - 04ca 00da 0441 lr $AX0.H, @0x0441 - 04cc 8600 tstaxh $AX0.H - 04cd 0295 04dd jz 0x04dd - 04cf 00da 0449 lr $AX0.H, @0x0449 - 04d1 8100 clr $ACC0 - 04d2 00de 044b lr $AC0.M, @0x044b - 04d4 3800 orr $AC0.M, $AX0.H - 04d5 0240 000f andi $AC0.M, #0x000f - 04d7 0295 04dd jz 0x04dd - 04d9 02bf 06a6 call 0x06a6 - 04db 029f 04df jmp 0x04df - 04dd 02bf 0837 call 0x0837 - //RAW21-jmp - 04df 0080 0580 lri $AR0, #0x0580 - 04e1 0081 0520 lri $AR1, #0x0520 - 04e3 0099 0000 lri $AX1.L, #0x0000 - 04e5 02bf 013b call 0x013b - //RAW20-jmp - 04e7 0080 0450 lri $AR0, #0x0450 - 04e9 0081 0520 lri $AR1, #0x0520 - 04eb 0082 0428 lri $AR2, #0x0428 - 04ed 0083 0453 lri $AR3, #0x0453 - 04ef 18fa lrrd $AX0.H, @$AR3 - 04f0 8600 tstaxh $AX0.H - 04f1 0294 0501 jnz 0x0501 - 04f3 18fa lrrd $AX0.H, @$AR3 - 04f4 8600 tstaxh $AX0.H - 04f5 0294 0501 jnz 0x0501 - 04f7 18fa lrrd $AX0.H, @$AR3 - 04f8 8600 tstaxh $AX0.H - 04f9 0294 0501 jnz 0x0501 - 04fb 8100 clr $ACC0 - 04fc 18fe lrrd $AC0.M, @$AR3 - 04fd 0280 7fff cmpi $AC0.M, #0x7fff - 04ff 0295 0505 jz 0x0505 - 0501 02bf 01d1 call 0x01d1 - 0503 029f 0505 jmp 0x0505 - 0505 8100 clr $ACC0 - 0506 1c9e mrr $IX0, $AC0.M - 0507 1cde mrr $IX2, $AC0.M - 0508 7400 incm $AC0.M - 0509 1cfe mrr $IX3, $AC0.M - 050a 8f00 set40 - 050b 0086 0002 lri $IX2, #0x0002 - 050d 0082 0408 lri $AR2, #0x0408 - 050f 1104 052f bloopi #0x04, 0x052f - { - 0511 8100 clr $ACC0 - 0512 195e lrri $AC0.M, @$AR2 - 0513 1200 sbclr #0x00 - 0514 b100 tst $ACC0 - 0515 0275 ifz - 0516 1300 sbset #0x00 - 0517 1c7e mrr $AR3, $AC0.M - 0518 195e lrri $AC0.M, @$AR2 - 0519 14fa asr $ACC0, #-6 - 051a 1f5e mrr $AX0.H, $AC0.M - 051b 1f1c mrr $AX0.L, $AC0.L - 051c 185f lrr $AC1.M, @$AR2 - 051d 0080 0520 lri $AR0, #0x0520 - 051f 029d 0523 jlz 0x0523 - 0521 02bf 011e call 0x011e - 0523 1b5f srri @$AR2, $AC1.M - 0524 8100 clr $ACC0 - 0525 185e lrr $AC0.M, @$AR2 - 0526 000e xar $AR2 - //; *** UNKNOWN OPCODE *** - // 0xc/0xd/0xe/0xf is one opcode where last 2 bits define target $AR? reg - // (new value is based on orig $AR? and %WR? reg value = unknown) - 0527 b100 tst $ACC0 - 0528 0274 ifnz - 0529 7800 decm $AC0.M - 052a b100 tst $ACC0 - 052b 8900 clr $ACC1 - 052c 0275 ifz - 052d 1a5f srr @$AR2, $AC1.M - 052e 001a addarn $AR2, $IX2 - 052f 1b5e srri @$AR2, $AC0.M - } - 0530 8e00 set16 - 0531 02bf 0321 call 0x0321 - 0533 00de 0354 lr $AC0.M, @0x0354 - 0535 7400 incm $AC0.M - 0536 00fe 0354 sr @0x0354, $AC0.M - 0538 0000 nop - } - 0539 16fb 0001 si @DIRQ, #0x0001 - 053b 0083 0d00 lri $AR3, #0x0d00 - 053d 02bf 012a call 0x012a - 053f 0081 0388 lri $AR1, #0x0388 - 0541 009f 0d00 lri $AC1.M, #0x0d00 - 0543 0080 0050 lri $AR0, #0x0050 - 0545 02bf 0089 call 0x0089 - 0547 0080 0fa0 lri $AR0, #0x0fa0 - 0549 0083 0d60 lri $AR3, #0x0d60 - 054b 009f 0050 lri $AC1.M, #0x0050 - 054d 0098 8000 lri $AX0.L, #0x8000 - 054f 02bf 0342 call 0x0342 - 0551 0083 0d60 lri $AR3, #0x0d60 - 0553 02bf 012a call 0x012a - 0555 0081 038a lri $AR1, #0x038a - 0557 009f 0d60 lri $AC1.M, #0x0d60 - 0559 0080 0050 lri $AR0, #0x0050 - 055b 02bf 0089 call 0x0089 - 055d 009a 0000 lri $AX0.H, #0x0000 - 055f 0098 00a0 lri $AX0.L, #0x00a0 - 0561 0080 0388 lri $AR0, #0x0388 - 0563 02bf 0453 call 0x0453 - 0565 0080 038a lri $AR0, #0x038a - 0567 02bf 0453 call 0x0453 - 0569 02bf 041c call 0x041c - 056b 0000 nop - 056c 0000 nop -} -056d 029f 0031 jmp 0x0031 -} - -{ -056f 0080 0346 lri $AR0, #0x0346 -0571 02bf 0051 call 0x0051 -0573 02bf 0051 call 0x0051 -0575 0081 0346 lri $AR1, #0x0346 -0577 193e lrri $AC0.M, @$AR1 -0578 193c lrri $AC0.L, @$AR1 -0579 009f 0400 lri $AC1.M, #0x0400 -057b 00c0 0345 lr $AR0, @0x0345 -057d 02bf 007e call 0x007e -057f 0081 0348 lri $AR1, #0x0348 -0581 193e lrri $AC0.M, @$AR1 -0582 193c lrri $AC0.L, @$AR1 -0583 009f 0800 lri $AC1.M, #0x0800 -0585 00c0 0345 lr $AR0, @0x0345 -0587 02bf 007e call 0x007e -0589 0081 0346 lri $AR1, #0x0346 -058b 193e lrri $AC0.M, @$AR1 -058c 193c lrri $AC0.L, @$AR1 -058d 009f 0800 lri $AC1.M, #0x0800 -058f 00c0 0345 lr $AR0, @0x0345 -0591 02bf 008b call 0x008b -0593 0081 0348 lri $AR1, #0x0348 -0595 193e lrri $AC0.M, @$AR1 -0596 193c lrri $AC0.L, @$AR1 -0597 009f 0400 lri $AC1.M, #0x0400 -0599 00c0 0345 lr $AR0, @0x0345 -059b 02bf 008b call 0x008b -059d 029f 0049 jmp 0x0049 -} - -{ -059f 0080 0346 lri $AR0, #0x0346 -05a1 02bf 0051 call 0x0051 -05a3 02bf 0051 call 0x0051 -05a5 0081 0346 lri $AR1, #0x0346 -05a7 193e lrri $AC0.M, @$AR1 -05a8 193c lrri $AC0.L, @$AR1 -05a9 009f 0400 lri $AC1.M, #0x0400 -05ab 00c0 0345 lr $AR0, @0x0345 -05ad 02bf 007e call 0x007e -05af 0081 0348 lri $AR1, #0x0348 -05b1 193e lrri $AC0.M, @$AR1 -05b2 193c lrri $AC0.L, @$AR1 -05b3 009f 0400 lri $AC1.M, #0x0400 -05b5 00c0 0345 lr $AR0, @0x0345 -05b7 02bf 008b call 0x008b -05b9 029f 0049 jmp 0x0049 -} - -{ -05bb 0080 0346 lri $AR0, #0x0346 -05bd 02bf 0051 call 0x0051 -05bf 02bf 0051 call 0x0051 -05c1 0081 0346 lri $AR1, #0x0346 -05c3 193e lrri $AC0.M, @$AR1 -05c4 193c lrri $AC0.L, @$AR1 -05c5 009f 0400 lri $AC1.M, #0x0400 -05c7 00c0 0345 lr $AR0, @0x0345 -05c9 02bf 00ae call 0x00ae -05cb 0081 0348 lri $AR1, #0x0348 -05cd 193e lrri $AC0.M, @$AR1 -05ce 193c lrri $AC0.L, @$AR1 -05cf 009f 0400 lri $AC1.M, #0x0400 -05d1 00c0 0345 lr $AR0, @0x0345 -05d3 02bf 008b call 0x008b -05d5 029f 0049 jmp 0x0049 -} - -{ -05d7 0080 0346 lri $AR0, #0x0346 -05d9 02bf 0051 call 0x0051 -05db 02bf 0051 call 0x0051 -05dd 0081 0346 lri $AR1, #0x0346 -05df 193e lrri $AC0.M, @$AR1 -05e0 193c lrri $AC0.L, @$AR1 -05e1 009f 0400 lri $AC1.M, #0x0400 -05e3 00c0 0344 lr $AR0, @0x0344 -05e5 02bf 007e call 0x007e -05e7 0081 0348 lri $AR1, #0x0348 -05e9 193e lrri $AC0.M, @$AR1 -05ea 193c lrri $AC0.L, @$AR1 -05eb 009f 0800 lri $AC1.M, #0x0800 -05ed 00c0 0344 lr $AR0, @0x0344 -05ef 02bf 007e call 0x007e -05f1 0080 0400 lri $AR0, #0x0400 -05f3 0083 0800 lri $AR3, #0x0800 -05f5 0084 0000 lri $IX0, #0x0000 -05f7 00da 0345 lr $AX0.H, @0x0345 -05f9 00df 0344 lr $AC1.M, @0x0344 -05fb 8f00 set40 -05fc 197b lrri $AX1.H, @$AR3 -05fd b800 mulx $AX0.H, $AX1.H -05fe 197b lrri $AX1.H, @$AR3 -05ff 007f 0604 bloop $AC1.M, 0x0604 -0601 199e lrrn $AC0.M, @$AR0 -0602 bc00 mulxac $AX0.H, $AX1.H, $ACC0 -0603 80b2 nx'sl : $AC0.M, $AX1.H -0604 0000 nop -0605 8e00 set16 -0606 0081 0346 lri $AR1, #0x0346 -0608 193e lrri $AC0.M, @$AR1 -0609 193c lrri $AC0.L, @$AR1 -060a 009f 0400 lri $AC1.M, #0x0400 -060c 00c0 0344 lr $AR0, @0x0344 -060e 02bf 008b call 0x008b -0610 009e 8200 lri $AC0.M, #0x8200 -0612 00dc 0344 lr $AC0.L, @0x0344 -0614 02bf 005a call 005a_SendMail(AC0.M,AC0.L) // 0x8200???? -0616 029f 0031 jmp 0x0031 -} - -{ -0618 0080 0346 lri $AR0, #0x0346 -061a 02bf 0051 call 0x0051 -061c 0081 0346 lri $AR1, #0x0346 -061e 009f 0400 lri $AC1.M, #0x0400 -0620 00c0 0345 lr $AR0, @0x0345 -0622 02bf 007c call 0x007c -0624 02bf 8644 call 0x8644 // iROM!!!! -0626 029f 0049 jmp 0x0049 -} - -{ -0628 009e 0430 lri $AC0.M, #0x0430 -062a 2219 lrs $AX0.H, @0x0019 -062b 4400 addr $ACC0, $AX0.H -062c 1c1e mrr $AR0, $AC0.M -062d 1fda mrr $AC0.M, $AX0.H -062e 3280 not $AC0.M -062f 7400 incm $AC0.M -0630 221a lrs $AX0.H, @0x001a -0631 4400 addr $ACC0, $AX0.H -0632 0090 0000 lri $AC0.H, #0x0000 -0634 029f 0645 jmp 0x0645 -} - -{ -0636 009e 0430 lri $AC0.M, #0x0430 -0638 2219 lrs $AX0.H, @0x0019 -0639 4400 addr $ACC0, $AX0.H -063a 1c1e mrr $AR0, $AC0.M -063b 1fda mrr $AC0.M, $AX0.H -063c 3280 not $AC0.M -063d 7400 incm $AC0.M -063e 221a lrs $AX0.H, @0x001a -063f 4400 addr $ACC0, $AX0.H -0640 0090 0000 lri $AC0.H, #0x0000 -0642 8200 cmp -0643 0270 ifge -0644 1fdf mrr $AC0.M, $AC1.M -0645 1f3e mrr $AX1.L, $AC0.M -0646 02bf 0699 call 0x0699 -0648 261c lrs $AC0.M, @0x001c -0649 241d lrs $AC0.L, @0x001d -064a 7200 addaxl $ACC0, $AX1.L -064b 5300 subr $ACC1, $AX1.L -064c 2e1c srs @0x001c, $AC0.M -064d 2c1d srs @0x001d, $AC0.L -064e 02df ret -} - -{ -064f 8100 clr $ACC0 -0650 221c lrs $AX0.H, @0x001c -0651 201d lrs $AX0.L, @0x001d -0652 4800 addax $ACC0, $AX0 -0653 147c lsr $ACC0, #-4 -0654 2e1e srs @0x001e, $AC0.M -0655 2c1f srs @0x001f, $AC0.L -0656 2340 lrs $AX1.H, @0x0040 -0657 c814 mulc'mv $AC0.M, $AX1.H : $AX1.L, $AC0.L -0658 9e00 mulmv $AX1.L, $AX1.H, $ACC0 -0659 f000 lsl16 $ACC0 -065a 4e00 addp $ACC0 -065b 234c lrs $AX1.H, @0x004c -065c 214d lrs $AX1.L, @0x004d -065d 4a00 addax $ACC0, $AX1 -065e 2e20 srs @0x0020, $AC0.M -065f 2c21 srs @0x0021, $AC0.L -0660 1fd8 mrr $AC0.M, $AX0.L -0661 0240 000f andi $AC0.M, #0x000f -0663 2e19 srs @0x0019, $AC0.M -0664 264a lrs $AC0.M, @0x004a -0665 244b lrs $AC0.L, @0x004b -0666 5800 subax $ACC0, $AX0 -0667 2e22 srs @0x0022, $AC0.M -0668 2c23 srs @0x0023, $AC0.L -0669 02df ret -} - -{ -066a 221e lrs $AX0.H, @0x001e -066b 201f lrs $AX0.L, @0x001f -066c 8100 clr $ACC0 -066d 264a lrs $AC0.M, @0x004a -066e 244b lrs $AC0.L, @0x004b -066f 147c lsr $ACC0, #-4 -0670 5800 subax $ACC0, $AX0 -0671 0295 067a jz 0x067a -0673 02bf 06ec call 0x06ec -0675 0e10 lris $AC0.M, #0x10 -0676 2e1a srs @0x001a, $AC0.M -0677 8100 clr $ACC0 -0678 2e19 srs @0x0019, $AC0.M -0679 02df ret -} - -{ -067a 224a lrs $AX0.H, @0x004a -067b 204b lrs $AX0.L, @0x004b -067c 8100 clr $ACC0 -067d 261c lrs $AC0.M, @0x001c -067e 241d lrs $AC0.L, @0x001d -067f 5800 subax $ACC0, $AX0 -0680 0290 0687 jge 0x0687 -0682 02bf 06ec call 0x06ec -0684 2623 lrs $AC0.M, @0x0023 -0685 029f 0676 jmp 0x0676 -} - -{ -0687 2648 lrs $AC0.M, @0x0048 -0688 2449 lrs $AC0.L, @0x0049 -0689 2e1c srs @0x001c, $AC0.M -068a 2c1d srs @0x001d, $AC0.L -068b 0e10 lris $AC0.M, #0x10 -068c 2e1a srs @0x001a, $AC0.M -068d 02bf 064f call 0x064f -068f 2642 lrs $AC0.M, @0x0042 -0690 2e3f srs @0x003f, $AC0.M -0691 2643 lrs $AC0.M, @0x0043 -0692 2e3e srs @0x003e, $AC0.M -0693 8100 clr $ACC0 -0694 00fe 0362 sr @0x0362, $AC0.M -0696 02bf 06ec call 0x06ec -0698 02df ret -} - -{ -0699 b100 tst $ACC0 -069a 02d5 retz -069b 04fe addis $AC0.M, #0xfe -069c 1f1e mrr $AX0.L, $AC0.M -069d 191e lrri $AC0.M, @$AR0 -069e 0291 06a4 jl 0x06a4 -06a0 191a lrri $AX0.H, @$AR0 -06a1 0058 loop $AX0.L -06a2 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M -06a3 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M -06a4 1b7e srri @$AR3, $AC0.M -06a5 02df ret -} - -{ -06a6 0092 0004 lri $CR, #0x0004 -06a8 02bf 064f call 0x064f -06aa 8100 clr $ACC0 -06ab 00fe 0362 sr @0x0362, $AC0.M -06ad 8100 clr $ACC0 -06ae 2622 lrs $AC0.M, @0x0022 -06af 2423 lrs $AC0.L, @0x0023 -06b0 b100 tst $ACC0 -06b1 0294 06c3 jnz 0x06c3 -06b3 02bf 066a call 0x066a -06b5 2219 lrs $AX0.H, @0x0019 -06b6 8600 tstaxh $AX0.H -06b7 0294 06c0 jnz 0x06c0 -06b9 02bf 0636 call 0x0636 -06bb b900 tst $ACC1 -06bc 0295 06e9 jz 0x06e9 -06be 02bf 064f call 0x064f -06c0 8100 clr $ACC0 -06c1 2622 lrs $AC0.M, @0x0022 -06c2 2423 lrs $AC0.L, @0x0023 -06c3 1f1f mrr $AX0.L, $AC1.M -06c4 009a 0000 lri $AX0.H, #0x0000 -06c6 5800 subax $ACC0, $AX0 -06c7 0290 06d6 jge 0x06d6 -06c9 8100 clr $ACC0 -06ca 2619 lrs $AC0.M, @0x0019 -06cb b100 tst $ACC0 -06cc 0294 06d0 jnz 0x06d0 -06ce 02bf 066a call 0x066a -06d0 02bf 0628 call 0x0628 -06d2 02bf 064f call 0x064f -06d4 029f 06ad jmp 0x06ad -} - -{ -06d6 8100 clr $ACC0 -06d7 2619 lrs $AC0.M, @0x0019 -06d8 b100 tst $ACC0 -06d9 0294 06dd jnz 0x06dd -06db 02bf 066a call 0x066a -06dd 02bf 0636 call 0x0636 -06df b900 tst $ACC1 -06e0 0295 06e9 jz 0x06e9 -06e2 02bf 064f call 0x064f -06e4 029f 06d6 jmp 0x06d6 -} - -{ -06e6 8100 clr $ACC0 -06e7 005f loop $AC1.M -06e8 1b7e srri @$AR3, $AC0.M -06e9 0092 00ff lri $CR, #0x00ff -06eb 02df ret -} - -{ -06ec 00ff 0360 sr @0x0360, $AC1.M -06ee 00da 0362 lr $AX0.H, @0x0362 -06f0 8600 tstaxh $AX0.H -06f1 0294 06fe jnz 0x06fe -06f3 0a01 lris $AX0.H, #0x01 -06f4 00fa 0362 sr @0x0362, $AX0.H -06f6 2620 lrs $AC0.M, @0x0020 -06f7 2421 lrs $AC0.L, @0x0021 -06f8 009f 0005 lri $AC1.M, #0x0005 -06fa 02bf 0103 call 0x0103 -06fc 0092 0004 lri $CR, #0x0004 -06fe 0080 ffd3 lri $AR0, #0xffd3 -0700 0084 0000 lri $IX0, #0x0000 -0702 199e lrrn $AC0.M, @$AR0 -0703 1ffe mrr $AC1.M, $AC0.M -0704 1401 lsl $ACC0, #1 -0705 0240 001e andi $AC0.M, #0x001e -0707 0200 0300 addi $AC0.M, #0x0300 -0709 1c3e mrr $AR1, $AC0.M -070a 157c lsr $ACC1, #-4 -070b 0340 000f andi $AC1.M, #0x000f -070d 0a11 lris $AX0.H, #0x11 -070e 5500 subr $ACC1, $AX0.H -070f 009a 00f0 lri $AX0.H, #0x00f0 -0711 009b 000f lri $AX1.H, #0x000f -0713 0082 0370 lri $AR2, #0x0370 -0715 1998 lrrn $AX0.L, @$AR0 -0716 6000 movr $ACC0, $AX0.L -0717 1107 071e bloopi #0x07, 0x071e -{ - 0719 3400 andr $AC0.M, $AX0.H - 071a 1408 lsl $ACC0, #8 - 071b 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 071c 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 071d 140c lsl $ACC0, #12 - 071e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M -} -071f 3400 andr $AC0.M, $AX0.H -0720 1408 lsl $ACC0, #8 -0721 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M -0722 3600 andr $AC0.M, $AX1.H -0723 140c lsl $ACC0, #12 -0724 1b5e srri @$AR2, $AC0.M -0725 8f00 set40 -0726 1f7f mrr $AX1.H, $AC1.M -0727 203e lrs $AX0.L, @0x003e -0728 273f lrs $AC1.M, @0x003f -0729 193a lrri $AX0.H, @$AR1 -072a 1939 lrri $AX1.L, @$AR1 -072b 0080 0370 lri $AR0, #0x0370 -072d 0081 0430 lri $AR1, #0x0430 -072f 1c80 mrr $IX0, $AR0 -0730 a000 mulx $AX0.L, $AX1.L -0731 ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 -0732 1108 073b bloopi #0x08, 0x073b -0734 3a93 asrnrx'mv $ACC0, $AX1.H : $AX0.L, $AC1.M -0735 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 -0736 1485 asl $ACC0, #5 -0737 e831 maddc's $AC0.M, $AX1.L : @$AR1, $AC0.M -0738 3b92 asrnrx'mv $ACC1, $AX1.H : $AX0.L, $AC0.M -0739 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 -073a 1585 asl $ACC1, #5 -073b ea39 maddc's $AC1.M, $AX1.L : @$AR1, $AC1.M -073c 8e00 set16 -073d 8900 clr $ACC1 -073e 00df 0360 lr $AC1.M, @0x0360 -0740 02df ret -} - -{ -0741 0080 0346 lri $AR0, #0x0346 -0743 02bf 0051 call 0x0051 -0745 8100 clr $ACC0 -0746 0080 0430 lri $AR0, #0x0430 -0748 1010 loopi #0x10 - 0749 1b1e srri @$AR0, $AC0.M -074a 00fe 0442 sr @0x0442, $AC0.M -074c 00fe 0443 sr @0x0443, $AC0.M -074e 009c 0000 lri $AC0.L, #0x0000 -0750 00fe 041c sr @0x041c, $AC0.M -0752 00fc 041d sr @0x041d, $AC0.L -0754 009e 0100 lri $AC0.M, #0x0100 -0756 009c f100 lri $AC0.L, #0xf100 -0758 00fe 044e sr @0x044e, $AC0.M -075a 00fc 044f sr @0x044f, $AC0.L -075c 009e 0040 lri $AC0.M, #0x0040 -075e 009c 0000 lri $AC0.L, #0x0000 -0760 00fe 044c sr @0x044c, $AC0.M -0762 00fc 044d sr @0x044d, $AC0.L -0764 009e 0009 lri $AC0.M, #0x0009 -0766 00fe 0440 sr @0x0440, $AC0.M -0768 009e 0010 lri $AC0.M, #0x0010 -076a 00fe 041a sr @0x041a, $AC0.M -076c 009e 0100 lri $AC0.M, #0x0100 -076e 009c f250 lri $AC0.L, #0xf250 -0770 00fe 044a sr @0x044a, $AC0.M -0772 00fc 044b sr @0x044b, $AC0.L -0774 009c 0000 lri $AC0.L, #0x0000 -0776 00fe 0448 sr @0x0448, $AC0.M -0778 00fc 0449 sr @0x0449, $AC0.L -077a 009e 0001 lri $AC0.M, #0x0001 -077c 00fe 0441 sr @0x0441, $AC0.M -077e 8900 clr $ACC1 -077f 00ff 0401 sr @0x0401, $AC1.M -0781 1180 079b bloopi #0x80, 0x079b -{ - 0783 0083 0580 lri $AR3, #0x0580 - 0785 009f 0100 lri $AC1.M, #0x0100 - 0787 02bf 06a6 call 0x06a6 - 0789 0081 0346 lri $AR1, #0x0346 - 078b 193e lrri $AC0.M, @$AR1 - 078c 18bc lrrd $AC0.L, @$AR1 - 078d 009f 0580 lri $AC1.M, #0x0580 - 078f 0080 0100 lri $AR0, #0x0100 - 0791 02bf 008b call 0x008b - 0793 0081 0346 lri $AR1, #0x0346 - 0795 193e lrri $AC0.M, @$AR1 - 0796 18bc lrrd $AC0.L, @$AR1 - 0797 0098 0200 lri $AX0.L, #0x0200 - 0799 7000 addaxl $ACC0, $AX0.L - 079a 1b3e srri @$AR1, $AC0.M - 079b 1abc srrd @$AR1, $AC0.L -} -079c 029f 0049 jmp 0x0049 -} - -void 079e_AudioFormatRAW20() -{ -079e 8900 clr $ACC1 -079f 009f 0050 lri $AC1.M, #0x0050 -07a1 0083 0520 lri $AR3, #0x0520 -07a3 02bf 07b9 call 0x07b9 -07a5 029f 04e7 jmp 0x04e7 -} - -void 07a7_AudioFormatRAW21() -{ -07a7 00d8 0402 lr $AX0.L, @0x0402 -07a9 8100 clr $ACC0 -07aa 8900 clr $ACC1 -07ab 00dc 0418 lr $AC0.L, @0x0418 -07ad 009a 0050 lri $AX0.H, #0x0050 -07af 9000 mul $AX0.L, $AX0.H -07b0 9400 mulac $AX0.L, $AX0.H, $ACC0 -07b1 1404 lsl $ACC0, #4 -07b2 1ffe mrr $AC1.M, $AC0.M -07b3 0083 0580 lri $AR3, #0x0580 -07b5 02bf 07b9 call 0x07b9 -07b7 029f 04df jmp 0x04df -} - -{ -07b9 0092 0004 lri $CR, #0x0004 -07bb 8100 clr $ACC0 -07bc 2622 lrs $AC0.M, @0x0022 -07bd 2423 lrs $AC0.L, @0x0023 -07be 1f1f mrr $AX0.L, $AC1.M -07bf 009a 0000 lri $AX0.H, #0x0000 -07c1 5800 subax $ACC0, $AX0 -07c2 0290 07d9 jge 0x07d9 -07c4 8900 clr $ACC1 -07c5 00c0 0423 lr $AR0, @0x0423 -07c7 02bf 07fe call 0x07fe -07c9 8100 clr $ACC0 -07ca 1fd8 mrr $AC0.M, $AX0.L -07cb 2223 lrs $AX0.H, @0x0023 -07cc 5400 subr $ACC0, $AX0.H -07cd 0007 dar $AR3 -07ce 1979 lrri $AX1.L, @$AR3 -07cf 005e loop $AC0.M -07d0 1b79 srri @$AR3, $AX1.L -07d1 009f 0001 lri $AC1.M, #0x0001 -07d3 2f01 srs @0x0001, $AC1.M -07d4 8900 clr $ACC1 -07d5 2f23 srs @0x0023, $AC1.M -07d6 0092 00ff lri $CR, #0x00ff -07d8 02df ret -} - -{ -07d9 2e22 srs @0x0022, $AC0.M -07da 2c23 srs @0x0023, $AC0.L -07db 8100 clr $ACC0 -07dc 8900 clr $ACC1 -07dd 264a lrs $AC0.M, @0x004a -07de 271c lrs $AC1.M, @0x001c -07df 5c00 sub $ACC0, $ACC1 -07e0 2e1e srs @0x001e, $AC0.M -07e1 5000 subr $ACC0, $AX0.L -07e2 0290 07f8 jge 0x07f8 -07e4 00c0 041e lr $AR0, @0x041e -07e6 02bf 07fe call 0x07fe -07e8 8100 clr $ACC0 -07e9 1fd8 mrr $AC0.M, $AX0.L -07ea 221e lrs $AX0.H, @0x001e -07eb 5400 subr $ACC0, $AX0.H -07ec 1c1e mrr $AR0, $AC0.M -07ed 8100 clr $ACC0 -07ee 2e1c srs @0x001c, $AC0.M -07ef 2648 lrs $AC0.M, @0x0048 -07f0 2449 lrs $AC0.L, @0x0049 -07f1 2e4c srs @0x004c, $AC0.M -07f2 2c4d srs @0x004d, $AC0.L -07f3 02bf 07fe call 0x07fe -07f5 0092 00ff lri $CR, #0x00ff -07f7 02df ret -} - -{ -07f8 1c18 mrr $AR0, $AX0.L -07f9 02bf 07fe call 0x07fe -07fb 0092 00ff lri $CR, #0x00ff -07fd 02df ret -} - -{ -07fe 8100 clr $ACC0 -07ff 1fc0 mrr $AC0.M, $AR0 -0800 b100 tst $ACC0 -0801 02d5 retz -0802 8900 clr $ACC1 -0803 271c lrs $AC1.M, @0x001c -0804 0340 0001 andi $AC1.M, #0x0001 -0806 009b 0000 lri $AX1.H, #0x0000 -0808 1f3f mrr $AX1.L, $AC1.M -0809 264c lrs $AC0.M, @0x004c -080a 244d lrs $AC0.L, @0x004d -080b 8900 clr $ACC1 -080c 251c lrs $AC1.L, @0x001c -080d 1501 lsl $ACC1, #1 -080e 4c00 add $ACC0, $ACC1 -080f 5a00 subax $ACC0, $AX1 -0810 5a00 subax $ACC0, $AX1 -0811 1c20 mrr $AR1, $AR0 -0812 1fe0 mrr $AC1.M, $AR0 -0813 0502 addis $AC1.M, #0x02 -0814 1c1f mrr $AR0, $AC1.M -0815 009f 0a00 lri $AC1.M, #0x0a00 -0817 0092 00ff lri $CR, #0x00ff -0819 02bf 007e call 0x007e -081b 0092 0004 lri $CR, #0x0004 -081d 271c lrs $AC1.M, @0x001c -081e 1f61 mrr $AX1.H, $AR1 -081f 4700 addr $ACC1, $AX1.H -0820 2f1c srs @0x001c, $AC1.M -0821 0080 0a00 lri $AR0, #0x0a00 -0823 8900 clr $ACC1 -0824 1ff9 mrr $AC1.M, $AX1.L -0825 b900 tst $ACC1 -0826 0274 ifnz -0827 0008 iar $AR0 -0828 8900 clr $ACC1 -0829 1fe1 mrr $AC1.M, $AR1 -082a 191e lrri $AC0.M, @$AR0 -082b 0701 cmpis $AC1.M, #0x01 -082c 0293 0835 jle 0x0835 -082e 191a lrri $AX0.H, @$AR0 -082f 05fe addis $AC1.M, #0xfe -0830 005f loop $AC1.M -0831 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M -0832 1b7e srri @$AR3, $AC0.M -0833 1b7a srri @$AR3, $AX0.H -0834 02df ret -} - -{ -0835 1b7e srri @$AR3, $AC0.M -0836 02df ret -} - -{ -0837 0092 0004 lri $CR, #0x0004 -0839 2201 lrs $AX0.H, @0x0001 -083a 8600 tstaxh $AX0.H -083b 0294 0868 jnz 0x0868 -083d 2204 lrs $AX0.H, @0x0004 -083e 8600 tstaxh $AX0.H -083f 02b4 08bc callnz 0x08bc -0841 2219 lrs $AX0.H, @0x0019 -0842 8600 tstaxh $AX0.H -0843 0295 085d jz 0x085d -0845 009e 0430 lri $AC0.M, #0x0430 -0847 4400 addr $ACC0, $AX0.H -0848 1c1e mrr $AR0, $AC0.M -0849 0e10 lris $AC0.M, #0x10 -084a 5400 subr $ACC0, $AX0.H -084b 1f7e mrr $AX1.H, $AC0.M -084c 02bf 0699 call 0x0699 -084e d900 cmpar $ACC1, $AX1.H -084f 0292 085c jg 0x085c -0851 0295 0858 jz 0x0858 -0853 2619 lrs $AC0.M, @0x0019 -0854 4c00 add $ACC0, $ACC1 -0855 2e19 srs @0x0019, $AC0.M -0856 029f 08b9 jmp 0x08b9 - -0858 8100 clr $ACC0 -0859 2e19 srs @0x0019, $AC0.M -085a 029f 08b9 jmp 0x08b9 - -085c 5700 subr $ACC1, $AX1.H -085d 8100 clr $ACC0 -085e 2605 lrs $AC0.M, @0x0005 -085f b100 tst $ACC0 -0860 0295 0879 jz 0x0879 -0862 8100 clr $ACC0 -0863 2e05 srs @0x0005, $AC0.M -0864 2241 lrs $AX0.H, @0x0041 -0865 8600 tstaxh $AX0.H -0866 0294 086f jnz 0x086f -0868 8100 clr $ACC0 -0869 005f loop $AC1.M -086a 1b7e srri @$AR3, $AC0.M -086b 7400 incm $AC0.M -086c 2e01 srs @0x0001, $AC0.M -086d 029f 08b9 jmp 0x08b9 - -086f 2648 lrs $AC0.M, @0x0048 -0870 2449 lrs $AC0.L, @0x0049 -0871 2e1c srs @0x001c, $AC0.M -0872 2c1d srs @0x001d, $AC0.L -0873 02bf 08c1 call 0x08c1 -0875 2642 lrs $AC0.M, @0x0042 -0876 2443 lrs $AC0.L, @0x0043 -0877 2e3f srs @0x003f, $AC0.M -0878 2c3e srs @0x003e, $AC0.L -0879 00ff 0360 sr @0x0360, $AC1.M -087b 2620 lrs $AC0.M, @0x0020 -087c 2421 lrs $AC0.L, @0x0021 -087d 009f 0005 lri $AC1.M, #0x0005 -087f 02bf 0103 call 0x0103 -0881 0092 0004 lri $CR, #0x0004 -0883 8900 clr $ACC1 -0884 00ff 0362 sr @0x0362, $AC1.M -0886 00df 0360 lr $AC1.M, @0x0360 -0888 02bf 08db call 0x08db -088a 8100 clr $ACC0 -088b 00de 0362 lr $AC0.M, @0x0362 -088d 2240 lrs $AX0.H, @0x0040 -088e 4400 addr $ACC0, $AX0.H -088f 00fe 0362 sr @0x0362, $AC0.M -0891 8100 clr $ACC0 -0892 2622 lrs $AC0.M, @0x0022 -0893 2423 lrs $AC0.L, @0x0023 -0894 0a01 lris $AX0.H, #0x01 -0895 0081 0405 lri $AR1, #0x0405 -0897 7a00 dec $ACC0 -0898 b100 tst $ACC0 -0899 0275 ifz -089a 1a3a srr @$AR1, $AX0.H -089b 2e22 srs @0x0022, $AC0.M -089c 2c23 srs @0x0023, $AC0.L -089d 0710 cmpis $AC1.M, #0x10 -089e 0293 08a7 jle 0x08a7 -08a0 05f0 addis $AC1.M, #0xf0 -08a1 2205 lrs $AX0.H, @0x0005 -08a2 8600 tstaxh $AX0.H -08a3 0294 0862 jnz 0x0862 -08a5 029f 0888 jmp 0x0888 -08a7 0275 ifz -08a8 8900 clr $ACC1 -08a9 2f19 srs @0x0019, $AC1.M -08aa 1fc3 mrr $AC0.M, $AR3 -08ab 04f0 addis $AC0.M, #0xf0 -08ac 1c1e mrr $AR0, $AC0.M -08ad 0083 0430 lri $AR3, #0x0430 -08af 0e10 lris $AC0.M, #0x10 -08b0 02bf 0699 call 0x0699 -08b2 2620 lrs $AC0.M, @0x0020 -08b3 2421 lrs $AC0.L, @0x0021 -08b4 00d8 0362 lr $AX0.L, @0x0362 -08b6 7000 addaxl $ACC0, $AX0.L -08b7 2c21 srs @0x0021, $AC0.L -08b8 2e20 srs @0x0020, $AC0.M -08b9 0092 00ff lri $CR, #0x00ff -08bb 02df ret -} - -{ -08bc 8100 clr $ACC0 -08bd 2e1c srs @0x001c, $AC0.M -08be 2e1d srs @0x001d, $AC0.M -08bf 2e3e srs @0x003e, $AC0.M -08c0 2e3f srs @0x003f, $AC0.M -08c1 231c lrs $AX1.H, @0x001c -08c2 211d lrs $AX1.L, @0x001d -08c3 264a lrs $AC0.M, @0x004a -08c4 244b lrs $AC0.L, @0x004b -08c5 5a00 subax $ACC0, $AX1 -08c6 147c lsr $ACC0, #-4 -08c7 2e22 srs @0x0022, $AC0.M -08c8 2c23 srs @0x0023, $AC0.L -08c9 261c lrs $AC0.M, @0x001c -08ca 241d lrs $AC0.L, @0x001d -08cb 147c lsr $ACC0, #-4 -08cc 2240 lrs $AX0.H, @0x0040 -08cd c010 mulc'mv $AC0.M, $AX0.H : $AX0.L, $AC0.L -08ce 9600 mulmv $AX0.L, $AX0.H, $ACC0 -08cf f000 lsl16 $ACC0 -08d0 4e00 addp $ACC0 -08d1 234c lrs $AX1.H, @0x004c -08d2 214d lrs $AX1.L, @0x004d -08d3 4a00 addax $ACC0, $AX1 -08d4 2e20 srs @0x0020, $AC0.M -08d5 2c21 srs @0x0021, $AC0.L -08d6 8100 clr $ACC0 -08d7 2e05 srs @0x0005, $AC0.M -08d8 2e19 srs @0x0019, $AC0.M -08d9 2e04 srs @0x0004, $AC0.M -08da 02df ret -} - -{ -08db 00ff 0360 sr @0x0360, $AC1.M -08dd 0080 ffd3 lri $AR0, #0xffd3 -08df 0084 0000 lri $IX0, #0x0000 -08e1 199e lrrn $AC0.M, @$AR0 -08e2 1ffe mrr $AC1.M, $AC0.M -08e3 1401 lsl $ACC0, #1 -08e4 0240 001e andi $AC0.M, #0x001e -08e6 0200 0300 addi $AC0.M, #0x0300 -08e8 1c3e mrr $AR1, $AC0.M -08e9 157c lsr $ACC1, #-4 -08ea 0340 000f andi $AC1.M, #0x000f -08ec 0a11 lris $AX0.H, #0x11 -08ed 5500 subr $ACC1, $AX0.H -08ee 009a 00f0 lri $AX0.H, #0x00f0 -08f0 009b 000f lri $AX1.H, #0x000f -08f2 0082 0370 lri $AR2, #0x0370 -08f4 1998 lrrn $AX0.L, @$AR0 -08f5 6000 movr $ACC0, $AX0.L -08f6 1107 08fd bloopi #0x07, 0x08fd -{ - 08f8 3400 andr $AC0.M, $AX0.H - 08f9 1408 lsl $ACC0, #8 - 08fa 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 08fb 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 08fc 140c lsl $ACC0, #12 - 08fd 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M -} -08fe 3400 andr $AC0.M, $AX0.H -08ff 1408 lsl $ACC0, #8 -0900 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M -0901 3600 andr $AC0.M, $AX1.H -0902 140c lsl $ACC0, #12 -0903 1b5e srri @$AR2, $AC0.M -0904 8f00 set40 -0905 1f7f mrr $AX1.H, $AC1.M -0906 203e lrs $AX0.L, @0x003e -0907 273f lrs $AC1.M, @0x003f -0908 193a lrri $AX0.H, @$AR1 -0909 1939 lrri $AX1.L, @$AR1 -090a 0080 0370 lri $AR0, #0x0370 -090c 1c80 mrr $IX0, $AR0 -090d a000 mulx $AX0.L, $AX1.L -090e ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 -090f 3a93 asrnrx'mv $ACC0, $AX1.H : $AX0.L, $AC1.M -0910 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 -0911 1485 asl $ACC0, #5 -0912 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M -0913 3b92 asrnrx'mv $ACC1, $AX1.H : $AX0.L, $AC0.M -0914 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 -0915 1585 asl $ACC1, #5 -0916 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M -0917 1106 0920 bloopi #0x06, 0x0920 -{ - 0919 3a93 asrnrx'mv $ACC0, $AX1.H : $AX0.L, $AC1.M - 091a a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 091b 1485 asl $ACC0, #5 - 091c e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 091d 3b92 asrnrx'mv $ACC1, $AX1.H : $AX0.L, $AC0.M - 091e a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 091f 1585 asl $ACC1, #5 - 0920 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M -} -0921 3a93 asrnrx'mv $ACC0, $AX1.H : $AX0.L, $AC1.M -0922 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 -0923 1485 asl $ACC0, #5 -0924 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M -0925 3b92 asrnrx'mv $ACC1, $AX1.H : $AX0.L, $AC0.M -0926 a500 mulxac $AX0.L, $AX1.L, $ACC1 -0927 1585 asl $ACC1, #5 -0928 1b7f srri @$AR3, $AC1.M -0929 2e3e srs @0x003e, $AC0.M -092a 2f3f srs @0x003f, $AC1.M -092b 8e00 set16 -092c 8900 clr $ACC1 -092d 00df 0360 lr $AC1.M, @0x0360 -092f 02df ret -} - -{ -0930 0083 0520 lri $AR3, #0x0520 -0932 00de 041b lr $AC0.M, @0x041b -0934 1050 loopi #0x50 - 0935 1b7e srri @$AR3, $AC0.M -0936 029f 04e7 jmp 0x04e7 -} - -0938 0000 nop -0939 0000 nop -093a 0000 nop -093b 0000 nop -093c 0000 nop -093d 0000 nop -093e 0000 nop -093f 0000 nop diff --git a/docs/DSP/DSP_UC_Luigi.txt b/docs/DSP/DSP_UC_Luigi.txt deleted file mode 100644 index 5aa599f797..0000000000 --- a/docs/DSP/DSP_UC_Luigi.txt +++ /dev/null @@ -1,2507 +0,0 @@ -// This ucode is interesting because it is very similar to the Zelda ucode, -// but does not make use of exceptions. Hence, it might be possible to get -// it running okay even without understanding how the exceptions work. - -// CRC: 379F1139 -// ector-CRC: 42f64ac4 - -// Notable differences: -// -// Luigi init (not using mail exception): -// sbset #0x02 -// sbset #0x03 -// sbclr #0x04 -// sbset #0x05 -// sbset #0x06 -// set16 -// clr15 -// m0 - -// Zelda init (using mail exception): -// sbclr #0x02 ! -// sbclr #0x03 ! -// sbclr #0x04 -// sbset #0x05 (late, just when it's time to receive messages) -// sbset #0x06 -// set16 -// clr15 -// m0 - -// AX1 init (not using mail exception, same as Luigi init): -// sbset #0x02 -// sbset #0x03 -// sbclr #0x04 -// sbset #0x05 -// sbset #0x06 -// set16 -// clr15 -// m0 - - - -// exception vectors -0000 029f 0010 jmp 0x0010 -0002 0000 nop -0003 0000 nop -0004 02ff rti -0005 0000 nop -0006 02ff rti -0007 0000 nop -0008 02ff rti -0009 0000 nop -000a 02ff rti -000b 0000 nop -000c 02ff rti -000d 0000 nop -000e 02ff rti // This is Zelda's message exception. -000f 0000 nop - -// Reset vector -void 0010_ResetVector() { - // Compare to 0057 in the Zelda ucode - 0010 1302 sbset #0x02 - 0011 1303 sbset #0x03 - 0012 1204 sbclr #0x04 - 0013 1305 sbset #0x05 - 0014 1306 sbset #0x06 - 0015 8e00 set16 - 0016 8c00 clr15 - 0017 8b00 m0 - 0018 009e ffff lri $AC0.M, #0xffff - 001a 1d1e mrr $WR0, $AC0.M - 001b 1d3e mrr $WR1, $AC0.M - 001c 1d5e mrr $WR2, $AC0.M - 001d 1d7e mrr $WR3, $AC0.M - 001e 0092 00ff lri $CR, #0x00ff - 0020 8100 clr $ACC0 - // Clear memory - 0021 009f 1000 lri $AC1.M, #0x1000 - 0023 0080 0000 lri $AR0, #0x0000 - 0025 005f loop $AC1.M - 0026 1b1e srri @$AR0, $AC0.M - 0027 26ff lrs $AC0.M, @CMBL - 0028 16fc 8888 si @DMBH, #0x8888 - 002a 16fd 1111 si @DMBL, #0x1111 - 002c 26fc lrs $AC0.M, @DMBH - 002d 02a0 8000 andf $AC0.M, #0x8000 - 002f 029c 002c jlnz 0x002c - - while (true) { - 0031 8100 clr $ACC0 - 0032 8900 clr $ACC1 - 0033 26fe lrs $AC0.M, @CMBH - 0034 02c0 8000 andcf $AC0.M, #0x8000 - 0036 029c 0031 jlnz 0x0031 - 0038 27ff lrs $AC1.M, @CMBL - 0039 00ff 0345 sr @0x0345, $AC1.M - 003b 1ffe mrr $AC1.M, $AC0.M - 003c 0340 00ff andi $AC1.M, #0x00ff - 003e 00ff 0344 sr @0x0344, $AC1.M - 0040 1479 lsr $ACC0, #-7 - - // Jump table below - 0041 0240 007e andi $AC0.M, #0x007e - 0043 0200 0062 addi $AC0.M, #0x0062 - 0045 00fe 0343 sr @0x0343, $AC0.M - 0047 1c1e mrr $AR0, $AC0.M - 0048 170f jmpr $AR0 - 0049 009e 8000 lri $AC0.M, #0x8000 - 004b 00dc 0343 lr $AC0.L, @0x0343 - 004d 02bf 005a call 0x005a - 004f 029f 0031 jmp 0x0031 - } -} - -void 0051_Unk_Mail() { - 0051 26fe lrs $AC0.M, @CMBH - 0052 02c0 8000 andcf $AC0.M, #0x8000 - 0054 029c 0051 jlnz 0x0051 - 0056 24ff lrs $AC0.L, @CMBL - 0057 1b1e srri @$AR0, $AC0.M - 0058 1b1c srri @$AR0, $AC0.L - 0059 02df ret -} - -void 005a_Unk_Mail() { - 005a 2efc srs @DMBH, $AC0.M - 005b 2cfd srs @DMBL, $AC0.L - 005c 26fc lrs $AC0.M, @DMBH - 005d 02a0 8000 andf $AC0.M, #0x8000 - 005f 029c 005c jlnz 0x005c - 0061 02df ret -} - -// Just a jump table. -0062 029f 0049 jmp 0x0049 -0064 029f 0349 jmp 0x0349 // Command 01 -0066 029f 04eb jmp 0x04eb // Command 02 -0068 029f 0031 jmp 0x0031 -006a 029f 00df jmp 0x00df -006c 029f 00f1 jmp 0x00f1 -006e 029f 06e7 jmp 0x06e7 -0070 029f 069b jmp 0x069b -0072 029f 0703 jmp 0x0703 -0074 029f 06cb jmp 0x06cb -0076 029f 0870 jmp 0x0870 -0078 029f 0744 jmp 0x0744 -007a 029f 0238 jmp 0x0238 - - -void 007c_Unk() { - 007c 193e lrri $AC0.M, @$AR1 - 007d 193c lrri $AC0.L, @$AR1 - 007e 2fcd srs @DSPA, $AC1.M - 007f 0f00 lris $AC1.M, #0x00 - 0080 2fc9 srs @DSCR, $AC1.M - 0081 2ece srs @DSMAH, $AC0.M - 0082 2ccf srs @DSMAL, $AC0.L - 0083 1fe0 mrr $AC1.M, $AR0 - 0084 1501 lsl $ACC1, #1 - 0085 2fcb srs @DSBL, $AC1.M - 0086 02bf 008f call 0x008f - 0088 02df ret -} - - -void 0089_Unk() { - 0089 193e lrri $AC0.M, @$AR1 - 008a 193c lrri $AC0.L, @$AR1 - 008b 2fcd srs @DSPA, $AC1.M - 008c 0f01 lris $AC1.M, #0x01 - 008d 029f 0080 jmp 0x0080 - 008f 26c9 lrs $AC0.M, @DSCR - 0090 02a0 0004 andf $AC0.M, #0x0004 - 0092 029c 008f jlnz 0x008f - 0094 02df ret -} - -void 0095_Unk() { - 0095 193e lrri $AC0.M, @$AR1 - 0096 193c lrri $AC0.L, @$AR1 - 0097 00ff ffcd sr @DSPA, $AC1.M - 0099 0f00 lris $AC1.M, #0x00 - 009a 00ff ffc9 sr @DSCR, $AC1.M - 009c 00fe ffce sr @DSMAH, $AC0.M - 009e 00fc ffcf sr @DSMAL, $AC0.L - 00a0 1fe0 mrr $AC1.M, $AR0 - 00a1 1501 lsl $ACC1, #1 - 00a2 00ff ffcb sr @DSBL, $AC1.M - 00a4 02df ret -} - -void 00a5_Unk() { - 00a5 00de ffc9 lr $AC0.M, @DSCR - 00a7 02a0 0004 andf $AC0.M, #0x0004 - 00a9 029c 00a5 jlnz 0x00a5 - 00ab 02df ret -} - -void 00ac_ReadBlockFromAccelerator() { - 00ac 193e lrri $AC0.M, @$AR1 - 00ad 193c lrri $AC0.L, @$AR1 - 00ae 0240 7fff andi $AC0.M, #0x7fff - // 00b0 02bf 00ba call 0x00ba - 00ba_SetupAccelerator() - - 00b2 007a 00b8 bloop $AX0.H, 0x00b8 - 00b4 26d3 lrs $AC0.M, @UnkZelda - 00b5 1b3e srri @$AR1, $AC0.M - 00b6 0000 nop - 00b7 0000 nop - 00b8 0000 nop - 00b9 02df ret -} - -void 00ba_SetupAccelerator() { - 00ba 1c3f mrr $AR1, $AC1.M - 00bb 009f 0005 lri $AC1.M, #0x0005 - 00bd 2fd1 srs @SampleFormat, $AC1.M - 00be 1f5e mrr $AX0.H, $AC0.M - 00bf 1f1c mrr $AX0.L, $AC0.L - 00c0 2ed4 srs @ACSAH, $AC0.M - 00c1 2cd5 srs @ACSAL, $AC0.L - 00c2 8900 clr $ACC1 - 00c3 1fa0 mrr $AC1.L, $AR0 - 00c4 4c00 add $ACC0, $AC1.L - 00c5 0200 0030 addi $AC0.M, #0x0030 - 00c7 2ed6 srs @ACEAH, $AC0.M - 00c8 2cd7 srs @ACEAL, $AC0.L - 00c9 1fda mrr $AC0.M, $AX0.H - 00ca 1f98 mrr $AC0.L, $AX0.L - 00cb 147f lsr $ACC0, #-1 - 00cc 2ed8 srs @ACCAH, $AC0.M - 00cd 2cd9 srs @ACCAL, $AC0.L - 00ce 1f40 mrr $AX0.H, $AR0 - 00cf 02df ret -} - - -void 00d0_Unk() { - 00d0 193e lrri $AC0.M, @$AR1 - 00d1 193c lrri $AC0.L, @$AR1 - 00d2 0260 8000 ori $AC0.M, #0x8000 - // 00d4 02bf 00ba call 0x00ba - 00ba_SetupAccelerator() - 00d6 007a 00dd bloop $AX0.H, 0x00dd - 00d8 193e lrri $AC0.M, @$AR1 - 00d9 2ed3 srs @UnkZelda, $AC0.M - 00da 0000 nop - 00db 0000 nop - 00dc 0000 nop - 00dd 0000 nop - 00de 02df ret -} - -void 00df_Unk() { - 00df 0080 0346 lri $AR0, #0x0346 - 00e1 02bf 0051 call 0x0051 - 00e3 02bf 0051 call 0x0051 - 00e5 0081 0346 lri $AR1, #0x0346 - 00e7 00df 0349 lr $AC1.M, @0x0349 - 00e9 0340 ffff andi $AC1.M, #0xffff - 00eb 00c0 0345 lr $AR0, @0x0345 - 00ed 02bf 007c call 0x007c - 00ef 029f 0049 jmp 0x0049 - 00f1 0080 0346 lri $AR0, #0x0346 - 00f3 02bf 0051 call 0x0051 - 00f5 02bf 0051 call 0x0051 - 00f7 0081 0346 lri $AR1, #0x0346 - 00f9 00df 0349 lr $AC1.M, @0x0349 - 00fb 0340 ffff andi $AC1.M, #0xffff - 00fd 00c0 0345 lr $AR0, @0x0345 - 00ff 02bf 0089 call 0x0089 - 0101 029f 0049 jmp 0x0049 -} - -void 0103_SetupAcceleratorMystery() { - 0103 0092 00ff lri $CR, #0x00ff - 0105 2fd1 srs @SampleFormat, $AC1.M - 0106 0340 0003 andi $AC1.M, #0x0003 - 0108 1f7f mrr $AX1.H, $AC1.M - 0109 1f5e mrr $AX0.H, $AC0.M - 010a 1f1c mrr $AX0.L, $AC0.L - 010b 0200 0010 addi $AC0.M, #0x0010 - 010d 2ed4 srs @ACSAH, $AC0.M - 010e 2cd5 srs @ACSAL, $AC0.L - 010f 8900 clr $ACC1 - 0110 1fa0 mrr $AC1.L, $AR0 - 0111 4c00 add $ACC0, $AC1.L - 0112 0200 0030 addi $AC0.M, #0x0030 - 0114 2ed6 srs @ACEAH, $AC0.M - 0115 2cd7 srs @ACEAL, $AC0.L - 0116 1fda mrr $AC0.M, $AX0.H - 0117 1f98 mrr $AC0.L, $AX0.L - 0118 1ffb mrr $AC1.M, $AX1.H - 0119 7900 decm $AC1.M - 011a 02ca lsrn - 011b 2ed8 srs @ACCAH, $AC0.M - 011c 2cd9 srs @ACCAL, $AC0.L - 011d 02df ret -} - -void 011e_Unk() { - 011e 1c23 mrr $AR1, $AR3 - 011f 197e lrri $AC0.M, @$AR3 - 0120 191b lrri $AX1.H, @$AR0 - 0121 d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - 0122 1120 0128 bloopi #0x20, 0x0128 - 0124 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0125 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0126 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0127 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0128 4900 addax $ACC1, $AX0.L - 0129 1108 012e bloopi #0x08, 0x012e - 012b dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 012c 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 012d dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 012e 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 012f 02df ret -} - - -void 0130_Unk() { - 0130 8f00 set40 - 0131 1c03 mrr $AR0, $AR3 - 0132 00db 038e lr $AX1.H, @0x038e - 0134 009a 0004 lri $AX0.H, #0x0004 - 0136 1978 lrri $AX0.L, @$AR3 - 0137 a843 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR3 - 0138 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0139 1128 013e bloopi #0x28, 0x013e - 013b 38c3 orr'ld $AC0.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 013c ae30 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC0.M - 013d 38c3 orr'ld $AC0.M, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 013e ae30 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC0.M - 013f 8e00 set16 - 0140 02df ret -} - -void 0141_Unk() { - 0141 00f9 0361 sr @0x0361, $AX1.L - 0143 1fc0 mrr $AC0.M, $AR0 - 0144 0200 fffc addi $AC0.M, #0xfffc - 0146 1c1e mrr $AR0, $AC0.M - 0147 1c5e mrr $AR2, $AC0.M - 0148 0083 043c lri $AR3, #0x043c - 014a 197e lrri $AC0.M, @$AR3 - 014b 197f lrri $AC1.M, @$AR3 - 014c 80a2 nx'sl : $AC0.M, $AX0.H - 014d 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - 014e 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - 014f 1b1f srri @$AR0, $AC1.M - 0150 1c02 mrr $AR0, $AR2 - 0151 8100 clr $ACC0 - 0152 00de 0402 lr $AC0.M, @0x0402 - 0154 00fe 0362 sr @0x0362, $AC0.M - 0156 1474 lsr $ACC0, #-12 - 0157 1f7e mrr $AX1.H, $AC0.M - 0158 1f3c mrr $AX1.L, $AC0.L - 0159 8900 clr $ACC1 - 015a 00dd 0430 lr $AC1.L, @0x0430 - 015c 1504 lsl $ACC1, #4 - 015d 0604 cmpis $ACC0, #0x04 - 015e 0290 01b6 jns 0x01b6 - 0160 1fdd mrr $AC0.M, $AC1.L - 0161 0082 0c00 lri $AR2, #0x0c00 - 0163 1050 loopi #0x50 - 0164 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L - 0165 1fbe mrr $AC1.L, $AC0.M - 0166 00fe 0360 sr @0x0360, $AC0.M - 0168 8900 clr $ACC1 - 0169 1fbe mrr $AC1.L, $AC0.M - 016a 009a fff8 lri $AX0.H, #0xfff8 - 016c 009b 00fc lri $AX1.H, #0x00fc - 016e 00d8 0361 lr $AX0.L, @0x0361 - 0170 0082 0c00 lri $AR2, #0x0c00 - 0172 0083 0c00 lri $AR3, #0x0c00 - 0174 195e lrri $AC0.M, @$AR2 - 0175 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M - 0176 1128 017b bloopi #0x28, 0x017b - 0178 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 - 0179 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H - 017a 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 - 017b 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - 017c 8a00 m2 - 017d 0082 0c00 lri $AR2, #0x0c00 - 017f 00dd 0430 lr $AC1.L, @0x0430 - 0181 1504 lsl $ACC1, #4 - 0182 1fe0 mrr $AC1.M, $AR0 - 0183 8100 clr $ACC0 - 0184 00de 0362 lr $AC0.M, @0x0362 - 0186 1474 lsr $ACC0, #-12 - 0187 1f7e mrr $AX1.H, $AC0.M - 0188 1f3c mrr $AX1.L, $AC0.L - 0189 8f00 set40 - 018a 1943 lrri $AR3, @$AR2 - 018b 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 018c 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 018d f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 018e f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 018f f200 madd $AX0.L, $AX0.H - 0190 fe00 movpz $ACC0 - 0191 1c1f mrr $AR0, $AC1.M - - 0192 1943 lrri $AR3, @$AR2 - 0193 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0194 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0195 114e 019d bloopi #0x4e, 0x019d - 0197 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0198 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0199 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - - 019a 1c1f mrr $AR0, $AC1.M - 019b 1943 lrri $AR3, @$AR2 - 019c 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 019d 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - 019e f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 019f f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01a0 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 01a1 fe00 movpz $ACC0 - 01a2 1b3e srri @$AR1, $AC0.M - - 01a3 8b00 m0 - 01a4 8e00 set16 - 01a5 00fe 0433 sr @0x0433, $AC0.M - 01a7 1c1f mrr $AR0, $AC1.M - 01a8 150c lsl $ACC1, #12 - 01a9 0340 0fff andi $AC1.M, #0x0fff - 01ab 00ff 0430 sr @0x0430, $AC1.M - 01ad 0083 043c lri $AR3, #0x043c - 01af 191e lrri $AC0.M, @$AR0 - 01b0 191f lrri $AC1.M, @$AR0 - 01b1 80a0 nx'ls : $AX0.H, $AC0.M - 01b2 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 01b3 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 01b4 1b7f srri @$AR3, $AC1.M - 01b5 02df ret - -subroutine: - 01b6 1fe0 mrr $AC1.M, $AR0 - 01b7 1c1f mrr $AR0, $AC1.M - 01b8 1128 01bf bloopi #0x28, 0x01bf - 01ba 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 01bb 1b3e srri @$AR1, $AC0.M - 01bc 1c1f mrr $AR0, $AC1.M - 01bd 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 01be 1b3e srri @$AR1, $AC0.M - 01bf 1c1f mrr $AR0, $AC1.M - 01c0 029f 01a5 jmp 0x01a5 -} - -void 01c2_Unk() { - 01c2 8a00 m2 - 01c3 0083 03e8 lri $AR3, #0x03e8 - 01c5 191e lrri $AC0.M, @$AR0 - 01c6 191a lrri $AX0.H, @$AR0 - 01c7 1006 loopi #0x06 - 01c8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 01c9 1b7e srri @$AR3, $AC0.M - 01ca 1b7a srri @$AR3, $AX0.H - 01cb 0080 03e8 lri $AR0, #0x03e8 - 01cd 0088 0007 lri $WR0, #0x0007 - 01cf 1150 01dc bloopi #0x50, 0x01dc - 01d1 1c61 mrr $AR3, $AR1 - 01d2 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 01d3 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d4 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d5 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d6 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d7 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d8 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01d9 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01da f200 madd $AX0.L, $AX0.H - 01db fe00 movpz $ACC0 - 01dc 1b3e srri @$AR1, $AC0.M - 01dd 0088 ffff lri $WR0, #0xffff - 01df 8b00 m0 - 01e0 02df ret -} - -void 01e1_Unk() { // ZWW: 0b4d_IIR_Filter - 01e1 8a00 m2 - 01e2 05fe addis $ACC1, #0xfe - 01e3 0083 03e8 lri $AR3, #0x03e8 - 01e5 191e lrri $AC0.M, @$AR0 - 01e6 191a lrri $AX0.H, @$AR0 - 01e7 005f loop $AC1.M - 01e8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 01e9 1b7e srri @$AR3, $AC0.M - 01ea 1b7a srri @$AR3, $AX0.H - 01eb 0080 03e8 lri $AR0, #0x03e8 - 01ed 0501 addis $ACC1, #0x01 - 01ee 1d1f mrr $WR0, $AC1.M - 01ef 1150 01f7 bloopi #0x50, 0x01f7 - 01f1 1c61 mrr $AR3, $AR1 - 01f2 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 01f3 005f loop $AC1.M - 01f4 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 01f5 f200 madd $AX0.L, $AX0.H - 01f6 fe00 movpz $ACC0 - 01f7 1b3e srri @$AR1, $AC0.M - 01f8 0088 ffff lri $WR0, #0xffff - 01fa 8b00 m0 - 01fb 02df ret -} - -void 01fc_Unk() { // ZWW: 0b68_4TapFIR - 01fc 0083 03e8 lri $AR3, #0x03e8 - 01fe 191e lrri $AC0.M, @$AR0 - 01ff 191a lrri $AX0.H, @$AR0 - 0200 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0201 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0202 1b7e srri @$AR3, $AC0.M - 0203 1b7a srri @$AR3, $AX0.H - 0204 0080 03e8 lri $AR0, #0x03e8 - 0206 0088 0003 lri $WR0, #0x0003 - 0208 0085 0000 lri $IX1, #0x0000 - 020a 0087 0000 lri $IX3, #0x0000 - 020c 1fc2 mrr $AC0.M, $AR2 - 020d 195b lrri $AX1.H, @$AR2 - 020e 1959 lrri $AX1.L, @$AR2 - 020f 195f lrri $AC1.M, @$AR2 - 0210 195a lrri $AX0.H, @$AR2 - 0211 1c5e mrr $AR2, $AC0.M - 0212 1fda mrr $AC0.M, $AX0.H - 0213 1c61 mrr $AR3, $AR1 - 0214 8a00 m2 - 0215 8f00 set40 - 0216 191a lrri $AX0.H, @$AR0 - 0217 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0218 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0219 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 021a e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 021b b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 021c 1127 0227 bloopi #0x27, 0x0227 - 021e e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - - 021f 197e lrri $AC0.M, @$AR3 - 0220 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0221 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0222 bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0223 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - - 0224 197f lrri $AC1.M, @$AR3 - 0225 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0226 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0227 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0228 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0229 197e lrri $AC0.M, @$AR3 - 022a e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 022b eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 022c bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 022d 1bff srrn @$AR3, $AC1.M - 022e 197f lrri $AC1.M, @$AR3 - 022f 8e00 set16 - 0230 8b00 m0 - 0231 0088 ffff lri $WR0, #0xffff - 0233 1b5b srri @$AR2, $AX1.H - 0234 1b59 srri @$AR2, $AX1.L - 0235 1b5f srri @$AR2, $AC1.M - 0236 1b5e srri @$AR2, $AC0.M - 0237 02df ret -} - -void 0238_Unk() { - 0238 0080 0346 lri $AR0, #0x0346 - 023a 02bf 0051 call 0x0051 - 023c 02bf 0051 call 0x0051 - 023e 0081 0346 lri $AR1, #0x0346 - 0240 009f 0580 lri $AC1.M, #0x0580 - 0242 0080 0080 lri $AR0, #0x0080 - 0244 02bf 007c call 0x007c - 0246 0081 0348 lri $AR1, #0x0348 - 0248 009f 0c00 lri $AC1.M, #0x0c00 - 024a 0080 0080 lri $AR0, #0x0080 - 024c 02bf 007c call 0x007c - 024e 0080 0c00 lri $AR0, #0x0c00 - 0250 0081 0580 lri $AR1, #0x0580 - 0252 02bf 01fc call 0x01fc - 0254 0081 0346 lri $AR1, #0x0346 - 0256 009f 0580 lri $AC1.M, #0x0580 - 0258 0080 0080 lri $AR0, #0x0080 - 025a 02bf 0089 call 0x0089 - 025c 0081 0348 lri $AR1, #0x0348 - 025e 009f 0c00 lri $AC1.M, #0x0c00 - 0260 0080 0080 lri $AR0, #0x0080 - 0262 02bf 0089 call 0x0089 - 0264 029f 0049 jmp 0x0049 - 0266 8100 clr $ACC0 - 0267 1f5e mrr $AX0.H, $AC0.M - 0268 00d8 0402 lr $AX0.L, @0x0402 - 026a 00dc 0430 lr $AC0.L, @0x0430 - 026c 0080 0520 lri $AR0, #0x0520 - 026e 00df 0480 lr $AC1.M, @0x0480 - 0270 1501 lsl $ACC1, #1 - 0271 0340 007e andi $AC1.M, #0x007e - 0273 0300 027b addi $AC1.M, #0x027b - 0275 1c5f mrr $AR2, $AC1.M - 0276 175f callr $AR2 - 0277 00fc 0430 sr @0x0430, $AC0.L - 0279 029f 056d jmp 0x056d - 027b 029f 029c jmp 0x029c - 027d 029f 02d7 jmp 0x02d7 - 027f 029f 02bf jmp 0x02bf - 0281 029f 02ac jmp 0x02ac - 0283 029f 02e5 jmp 0x02e5 - 0285 029f 029b jmp 0x029b - 0287 029f 0303 jmp 0x0303 - 0289 029f 0306 jmp 0x0306 - 028b 029f 029b jmp 0x029b - 028d 029f 029b jmp 0x029b - 028f 029f 0324 jmp 0x0324 - 0291 029f 02dd jmp 0x02dd - 0293 029f 02e1 jmp 0x02e1 - 0295 029f 029b jmp 0x029b - 0297 029f 029b jmp 0x029b - 0299 029f 029b jmp 0x029b - 029b 02df ret -} - -void 029c_Unk() { - 029c 1401 lsl $ACC0, #1 - 029d 009b c000 lri $AX1.H, #0xc000 - 029f 0099 4000 lri $AX1.L, #0x4000 - 02a1 1150 02a9 bloopi #0x50, 0x02a9 - 02a3 02c0 0001 andcf $AC0.M, #0x0001 - 02a5 027c iflnz - 02a6 1b1b srri @$AR0, $AX1.H - 02a7 027d iflz - 02a8 1b19 srri @$AR0, $AX1.L - 02a9 4800 addax $ACC0, $AX0.L - 02aa 147f lsr $ACC0, #-1 - 02ab 02df ret -} - -void 02ac_Unk() { - 02ac 1402 lsl $ACC0, #2 - 02ad 8900 clr $ACC1 - 02ae 1fb8 mrr $AC1.L, $AX0.L - 02af 1501 lsl $ACC1, #1 - 02b0 009b c000 lri $AX1.H, #0xc000 - 02b2 0099 4000 lri $AX1.L, #0x4000 - 02b4 1150 02bc bloopi #0x50, 0x02bc - 02b6 02c0 0003 andcf $AC0.M, #0x0003 - 02b8 027c iflnz - 02b9 1b1b srri @$AR0, $AX1.H - 02ba 027d iflz - 02bb 1b19 srri @$AR0, $AX1.L - 02bc 4c00 add $ACC0, $AC1.L - 02bd 147e lsr $ACC0, #-2 - 02be 02df ret -} - -void 02bf_Unk() { // ZWW:08d5 - 02bf 1401 lsl $ACC0, #1 - 02c0 0081 0ca0 lri $AR1, #0x0ca0 - 02c2 009b c000 lri $AX1.H, #0xc000 - 02c4 0099 4000 lri $AX1.L, #0x4000 - 02c6 8900 clr $ACC1 - 02c7 0082 0000 lri $AR2, #0x0000 - 02c9 1150 02d4 bloopi #0x50, 0x02d4 - 02cb 02c0 0001 andcf $AC0.M, #0x0001 - 02cd 027c iflnz - 02ce 1b1b srri @$AR0, $AX1.H - 02cf 027d iflz - 02d0 1b19 srri @$AR0, $AX1.L - 02d1 183d lrr $AC1.L, @$AR1 - 02d2 4900 addax $ACC1, $AX0.L - 02d3 1fe2 mrr $AC1.M, $AR2 - 02d4 4c39 add's $ACC0, $AC1.L : @$AR1, $AC1.M - 02d5 147f lsr $ACC0, #-1 - 02d6 02df ret -} - -void 02d7_Unk() { // ZWW:08ed - 02d7 8900 clr $ACC1 - 02d8 1fb8 mrr $AC1.L, $AX0.L - 02d9 157f lsr $ACC1, #-1 - 02da 1050 loopi #0x50 - 02db 4c20 add's $ACC0, $AC1.L : @$AR0, $AC0.L - 02dc 02df ret -} - -void 02dd_Unk() { // ZWW:08f3 - 02dd 0082 0180 lri $AR2, #0x0180 // Three entrances - 02df 029f 02e7 jmp 0x02e7 - 02e1 0082 01c0 lri $AR2, #0x01c0 - 02e3 029f 02e7 jmp 0x02e7 - 02e5 0082 0140 lri $AR2, #0x0140 - 02e7 008a 003f lri $WR2, #0x003f - 02e9 0086 0000 lri $IX2, #0x0000 - 02eb 1406 lsl $ACC0, #6 - 02ec 8900 clr $ACC1 - 02ed 1fb8 mrr $AC1.L, $AX0.L - 02ee 1505 lsl $ACC1, #5 - 02ef 009b 003f lri $AX1.H, #0x003f - 02f1 009a 0000 lri $AX0.H, #0x0000 - 02f3 3600 andr $AC0.M, $AX1.H - 02f4 1cde mrr $IX2, $AC0.M - 02f5 001a addarn $AR2, $IX2 - 02f6 3400 andr $AC0.M, $AX0.H - 02f7 1150 02fd bloopi #0x50, 0x02fd - 02f9 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 02fa 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 02fb 1cde mrr $IX2, $AC0.M - 02fc 340e andr'nr $AC0.M, $AX0.H : $AR2 - 02fd 1b19 srri @$AR0, $AX1.L - 02fe 1fc2 mrr $AC0.M, $AR2 - 02ff 147a lsr $ACC0, #-6 - 0300 008a ffff lri $WR2, #0xffff - 0302 02df ret -} - -void 030_MemsetBlock() { - 0303 1050 loopi #0x50 - 0304 1b18 srri @$AR0, $AX0.L - // 0305 02df ret -} - -void 0306_Unk() { - 0306 0082 0100 lri $AR2, #0x0100 - 0308 008a 003f lri $WR2, #0x003f - 030a 0086 0000 lri $IX2, #0x0000 - 030c 1406 lsl $ACC0, #6 - 030d 8900 clr $ACC1 - 030e 1fb8 mrr $AC1.L, $AX0.L - 030f 1505 lsl $ACC1, #5 - 0310 009b 003f lri $AX1.H, #0x003f - 0312 009a 0000 lri $AX0.H, #0x0000 - 0314 3600 andr $AC0.M, $AX1.H - 0315 1cde mrr $IX2, $AC0.M - 0316 001a addarn $AR2, $IX2 - 0317 3400 andr $AC0.M, $AX0.H - 0318 1150 031e bloopi #0x50, 0x031e - 031a 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 031b 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 031c 1cde mrr $IX2, $AC0.M - 031d 340e andr'nr $AC0.M, $AX0.H : $AR2 - 031e 1b19 srri @$AR0, $AX1.L - 031f 1fc2 mrr $AC0.M, $AR2 - 0320 147a lsr $ACC0, #-6 - 0321 008a ffff lri $WR2, #0xffff - 0323 02df ret -} - -void 0324_Unk() { - 0324 0082 0100 lri $AR2, #0x0100 - 0326 008a 003f lri $WR2, #0x003f - 0328 0086 0000 lri $IX2, #0x0000 - 032a 0081 0ca0 lri $AR1, #0x0ca0 - 032c 1406 lsl $ACC0, #6 - 032d 8900 clr $ACC1 - 032e 1fb8 mrr $AC1.L, $AX0.L - 032f 1505 lsl $ACC1, #5 - 0330 009b 003f lri $AX1.H, #0x003f - 0332 009a 0000 lri $AX0.H, #0x0000 - 0334 3600 andr $AC0.M, $AX1.H - 0335 1cde mrr $IX2, $AC0.M - 0336 001a addarn $AR2, $IX2 - 0337 3400 andr $AC0.M, $AX0.H - 0338 1150 0343 bloopi #0x50, 0x0343 - 033a 1939 lrri $AX1.L, @$AR1 - 033b a000 mulx $AX0.L, $AX1.L - 033c 140a lsl $ACC0, #10 - 033d 4e00 addp $ACC0 - 033e 1476 lsr $ACC0, #-10 - 033f 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 0340 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0341 1cde mrr $IX2, $AC0.M - 0342 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0343 1b19 srri @$AR0, $AX1.L - 0344 1fc2 mrr $AC0.M, $AR2 - 0345 147a lsr $ACC0, #-6 - 0346 008a ffff lri $WR2, #0xffff - 0348 02df ret -} - -// DsetupTable -void 0349_COMMAND_01() { - 0349 0080 0380 lri $AR0, #0x0380 - 034b 02bf 0051 call 0x0051 - 034d 02bf 0051 call 0x0051 - 034f 02bf 0051 call 0x0051 - 0351 02bf 0051 call 0x0051 - - 0353 0081 0382 lri $AR1, #0x0382 - 0355 009f 0000 lri $AC1.M, #0x0000 - 0357 0080 0200 lri $AR0, #0x0200 - // 0359 02bf 007c call 0x007c - 007c_CopyRAMtoDMEM() - - 035b 0081 0384 lri $AR1, #0x0384 - 035d 009f 0300 lri $AC1.M, #0x0300 - 035f 0080 0020 lri $AR0, #0x0020 - 0361 02bf 007c call 0x007c - 007c_CopyRAMtoDMEM() - - - 0363 02bf 03cc call 0x03cc - 0365 00de 0345 lr $AC0.M, @0x0345 - 0367 00fe 0342 sr @0x0342, $AC0.M - 0369 02bf 0af0 call 0x0af0 - 036b 029f 0049 jmp 0x0049 - 036d 00de 0344 lr $AC0.M, @0x0344 - 036f 1404 lsl $ACC0, #4 - 0370 0200 03a8 addi $AC0.M, #0x03a8 - 0372 1c1e mrr $AR0, $AC0.M - 0373 02bf 0051 call 0x0051 - 0375 02bf 0051 call 0x0051 - 0377 02bf 0051 call 0x0051 - 0379 00de 0345 lr $AC0.M, @0x0345 - 037b 1b1e srri @$AR0, $AC0.M - 037c 00de 0344 lr $AC0.M, @0x0344 - 037e 0200 03a4 addi $AC0.M, #0x03a4 - 0380 1c1e mrr $AR0, $AC0.M - 0381 8100 clr $ACC0 - 0382 1b1e srri @$AR0, $AC0.M - 0383 02df ret -} - -void 0384_Unk() { - 0384 00de 0344 lr $AC0.M, @0x0344 - 0386 1404 lsl $ACC0, #4 - 0387 0200 03b0 addi $AC0.M, #0x03b0 - 0389 1c1e mrr $AR0, $AC0.M - 038a 02bf 0051 call 0x0051 - 038c 02bf 0051 call 0x0051 - 038e 02bf 0051 call 0x0051 - 0390 02bf 0051 call 0x0051 - 0392 02df ret -} - -void 0393_Unk() { - 0393 0081 034c lri $AR1, #0x034c - 0395 009f 0400 lri $AC1.M, #0x0400 - 0397 0080 00c0 lri $AR0, #0x00c0 - 0399 02bf 007c call 0x007c - 039b 02df ret -} - -void 039c_Unk() { - 039c 0081 034c lri $AR1, #0x034c - 039e 009f 0400 lri $AC1.M, #0x0400 - 03a0 0080 0080 lri $AR0, #0x0080 - 03a2 0081 034c lri $AR1, #0x034c - 03a4 193e lrri $AC0.M, @$AR1 - 03a5 193c lrri $AC0.L, @$AR1 - 03a6 0098 0000 lri $AX0.L, #0x0000 - 03a8 7000 addaxl $ACC0, $AX0.L - 03a9 02bf 008b call 0x008b - 03ab 02df ret -} - -void 03ac_Unk() { - 03ac 191e lrri $AC0.M, @$AR0 - 03ad 191a lrri $AX0.H, @$AR0 - 03ae 005f loop $AC1.M - 03af 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 03b0 1b7e srri @$AR3, $AC0.M - 03b1 1b7a srri @$AR3, $AX0.H - 03b2 02df ret -} - -// Example call: -//a 03d9 0080 0f40 lri $AR0, #0x0f40 -//a 03db 0082 0d00 lri $AR2, #0x0d00 -//a 03dd 0083 0d60 lri $AR3, #0x0d60 -//a 03df 009f 0028 lri $AC1.M, #0x0028 -//a 03e1 02bf 03b3 call 0x03b3 -// Not sure how AR2 fits into the picture... -void 03b3_XorBuffer(InputBuffer($AR0), OutputBuffer($AR3), HalfLength($AC1.M)) { - 03b3 191e lrri $AC0.M, @$AR0 - 03b4 191a lrri $AX0.H, @$AR0 - 03b5 007f 03ba bloop $AC1.M, 0x03ba - 03b7 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 03b8 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 03b9 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 03ba 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 03bb 0000 nop - 03bc 02df ret -} - -void 03bd_Unk() { - 03bd 8a00 m2 - 03be 157f lsr $ACC1, #-1 - 03bf 1c20 mrr $AR1, $AR0 - 03c0 1c03 mrr $AR0, $AR3 - 03c1 193a lrri $AX0.H, @$AR1 - 03c2 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 - 03c3 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 - 03c4 007f 03c9 bloop $AC1.M, 0x03c9 - 03c6 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 03c7 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 03c8 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 03c9 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 03ca 8b00 m0 - 03cb 02df ret -} - -void 03cc_Unk() { - 03cc 0083 ffa0 lri $AR3, #0xffa0 - 03ce 0080 0300 lri $AR0, #0x0300 - 03d0 009f 000e lri $AC1.M, #0x000e - 03d2 1108 03d7 bloopi #0x08, 0x03d7 - 03d4 191e lrri $AC0.M, @$AR0 - 03d5 1b7e srri @$AR3, $AC0.M - 03d6 191e lrri $AC0.M, @$AR0 - 03d7 1b7e srri @$AR3, $AC0.M - 03d8 02df ret -} - -void 03d9_Unk() { - - 03d9 0080 0f40 lri $AR0, #0x0f40 - 03db 0082 0d00 lri $AR2, #0x0d00 - 03dd 0083 0d60 lri $AR3, #0x0d60 - 03df 009f 0028 lri $AC1.M, #0x0028 - // XorBuffer, why?? - 03e1 02bf 03b3 call 0x03b3 - - // Clear a bunch of buffers. - 03e3 8900 clr $ACC1 - 03e4 009e 0050 lri $AC0.M, #0x0050 - 03e6 0080 0ca0 lri $AR0, #0x0ca0 - 03e8 005e loop $AC0.M - 03e9 1b1f srri @$AR0, $AC1.M - 03ea 0080 0f40 lri $AR0, #0x0f40 - 03ec 005e loop $AC0.M - 03ed 1b1f srri @$AR0, $AC1.M - 03ee 0080 0fa0 lri $AR0, #0x0fa0 - 03f0 005e loop $AC0.M - 03f1 1b1f srri @$AR0, $AC1.M - 03f2 0080 0b00 lri $AR0, #0x0b00 - 03f4 005e loop $AC0.M - 03f5 1b1f srri @$AR0, $AC1.M - 03f6 0080 09a0 lri $AR0, #0x09a0 - 03f8 005e loop $AC0.M - 03f9 1b1f srri @$AR0, $AC1.M - - 03fa 02df ret -} - -void 03fb_Unk() { - 03fb 00c0 03a0 lr $AR0, @0x03a0 - 03fd 191a lrri $AX0.H, @$AR0 - 03fe 00df 03a1 lr $AC1.M, @0x03a1 - 0400 009b 00a0 lri $AX1.H, #0x00a0 - 0402 0081 0393 lri $AR1, #0x0393 - 0404 18bc lrrd $AC0.L, @$AR1 - 0405 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0406 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0407 0080 0050 lri $AR0, #0x0050 - 0409 0508 addis $ACC1, #0x08 - 040a 02bf 007e call 0x007e - 040c 00de 0390 lr $AC0.M, @0x0390 - 040e 02a0 0001 andf $AC0.M, #0x0001 - 0410 029d 041a jlz 0x041a - 0412 0080 0398 lri $AR0, #0x0398 - 0414 009e 0008 lri $AC0.M, #0x0008 - 0416 00c1 03a1 lr $AR1, @0x03a1 - 0418 02bf 01c2 call 0x01c2 - 041a 009f 0050 lri $AC1.M, #0x0050 - 041c 00c0 03a1 lr $AR0, @0x03a1 - 041e 8100 clr $ACC0 - 041f 00de 0394 lr $AC0.M, @0x0394 - 0421 b100 tst $ACC0 - 0422 0295 0429 jz 0x0429 - 0424 1c7e mrr $AR3, $AC0.M - 0425 00d8 0395 lr $AX0.L, @0x0395 - 0427 02bf 03bd call 0x03bd - 0429 009f 0050 lri $AC1.M, #0x0050 - 042b 00c0 03a1 lr $AR0, @0x03a1 - 042d 8100 clr $ACC0 - 042e 00de 0396 lr $AC0.M, @0x0396 - 0430 b100 tst $ACC0 - 0431 0295 0438 jz 0x0438 - 0433 1c7e mrr $AR3, $AC0.M - 0434 00d8 0397 lr $AX0.L, @0x0397 - 0436 02bf 03bd call 0x03bd - 0438 00de 0390 lr $AC0.M, @0x0390 - 043a 02a0 0002 andf $AC0.M, #0x0002 - 043c 02dd retlz - - 043d 0080 0398 lri $AR0, #0x0398 - 043f 009e 0008 lri $AC0.M, #0x0008 - 0441 00c1 03a1 lr $AR1, @0x03a1 - 0443 02bf 01c2 call 0x01c2 - 0445 02df ret -} - -void 0446_Unk() { - 0446 009f 0dc0 lri $AC1.M, #0x0dc0 - 0448 00ff 03a1 sr @0x03a1, $AC1.M - 044a 009f 03a8 lri $AC1.M, #0x03a8 - 044c 00ff 03a2 sr @0x03a2, $AC1.M - 044e 009f 03a4 lri $AC1.M, #0x03a4 - 0450 00ff 03a0 sr @0x03a0, $AC1.M - 0452 1104 047b bloopi #0x04, 0x047b - 0454 00c0 03a2 lr $AR0, @0x03a2 - 0456 0083 0390 lri $AR3, #0x0390 - 0458 009f 000e lri $AC1.M, #0x000e - 045a 02bf 03ac call 0x03ac - 045c 00da 0390 lr $AX0.H, @0x0390 - 045e 8600 tstaxh $AX0.H - 045f 0295 046c jz 0x046c - 0461 00df 03a1 lr $AC1.M, @0x03a1 - 0463 1c7f mrr $AR3, $AC1.M - 0464 0550 addis $ACC1, #0x50 - 0465 1c1f mrr $AR0, $AC1.M - 0466 009f 0006 lri $AC1.M, #0x0006 - 0468 02bf 03ac call 0x03ac - 046a 02bf 03fb call 0x03fb - 046c 00de 03a2 lr $AC0.M, @0x03a2 - 046e 0410 addis $ACC0, #0x10 - 046f 00fe 03a2 sr @0x03a2, $AC0.M - 0471 00de 03a1 lr $AC0.M, @0x03a1 - 0473 0460 addis $ACC0, #0x60 - 0474 00fe 03a1 sr @0x03a1, $AC0.M - 0476 00de 03a0 lr $AC0.M, @0x03a0 - 0478 7400 incm $AC0.M - 0479 00fe 03a0 sr @0x03a0, $AC0.M - 047b 0000 nop - 047c 02df ret -} - -void 047d_Unk() { - 047d 00c0 03a0 lr $AR0, @0x03a0 - 047f 181a lrr $AX0.H, @$AR0 - 0480 8100 clr $ACC0 - 0481 181e lrr $AC0.M, @$AR0 - 0482 00db 0391 lr $AX1.H, @0x0391 - 0484 7400 incm $AC0.M - 0485 d100 cmpar $ACC1, $AX0.H - 0486 0270 ifns - 0487 8100 clr $ACC0 - 0488 1b1e srri @$AR0, $AC0.M - 0489 00df 03a1 lr $AC1.M, @0x03a1 - 048b 009b 00a0 lri $AX1.H, #0x00a0 - 048d 0081 0393 lri $AR1, #0x0393 - 048f 18bc lrrd $AC0.L, @$AR1 - 0490 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0491 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0492 0080 0050 lri $AR0, #0x0050 - 0494 02bf 008b call 0x008b - 0496 02df ret -} - -void 0497_Unk() { - 0497 009f 0dc0 lri $AC1.M, #0x0dc0 - 0499 00ff 03a1 sr @0x03a1, $AC1.M - 049b 009f 03a8 lri $AC1.M, #0x03a8 - 049d 00ff 03a2 sr @0x03a2, $AC1.M - 049f 009f 03a4 lri $AC1.M, #0x03a4 - 04a1 00ff 03a0 sr @0x03a0, $AC1.M - 04a3 1104 04c3 bloopi #0x04, 0x04c3 - 04a5 00c0 03a2 lr $AR0, @0x03a2 - 04a7 0083 0390 lri $AR3, #0x0390 - 04a9 009f 000e lri $AC1.M, #0x000e - 04ab 02bf 03ac call 0x03ac - 04ad 00da 0390 lr $AX0.H, @0x0390 - 04af 8600 tstaxh $AX0.H - 04b0 0295 04b4 jz 0x04b4 - 04b2 02bf 047d call 0x047d - 04b4 00de 03a2 lr $AC0.M, @0x03a2 - 04b6 0410 addis $ACC0, #0x10 - 04b7 00fe 03a2 sr @0x03a2, $AC0.M - 04b9 00de 03a1 lr $AC0.M, @0x03a1 - 04bb 0460 addis $ACC0, #0x60 - 04bc 00fe 03a1 sr @0x03a1, $AC0.M - 04be 00de 03a0 lr $AC0.M, @0x03a0 - 04c0 7400 incm $AC0.M - 04c1 00fe 03a0 sr @0x03a0, $AC0.M - 04c3 0000 nop - 04c4 02df ret -} - -void 04c5_Unk() { - 04c5 0081 0386 lri $AR1, #0x0386 - 04c7 009f 03a8 lri $AC1.M, #0x03a8 - 04c9 0080 0040 lri $AR0, #0x0040 - 04cb 02bf 007c call 0x007c - 04cd 02df ret -} - -void 04ce_Increment32BitAddressAtAR0() { - 04ce 191e lrri $AC0.M, @$AR0 - 04cf 189c lrrd $AC0.L, @$AR0 - 04d0 4800 addax $ACC0, $AX0.L - 04d1 1b1e srri @$AR0, $AC0.M - 04d2 1b1c srri @$AR0, $AC0.L - 04d3 02df ret -} - -void 04d4_Unk() { - 04d4 8100 clr $ACC0 - 04d5 26fe lrs $AC0.M, @CMBH - 04d6 02c0 8000 andcf $AC0.M, #0x8000 - 04d8 029c 04d5 jlnz 0x04d5 - 04da 26ff lrs $AC0.M, @CMBL - 04db 02df ret -} - -void 04dc_Unk() { - 04dc 0080 0388 lri $AR0, #0x0388 - 04de 0081 0051 lri $AR1, #0x0051 - 04e0 173f callr $AR1 - 04e1 00de 0344 lr $AC0.M, @0x0344 - 04e3 00fe 0341 sr @0x0341, $AC0.M - 04e5 00de 0345 lr $AC0.M, @0x0345 - 04e7 00fe 038e sr @0x038e, $AC0.M - 04e9 173f callr $AR1 - 04ea 02df ret -} - -///////////////////////// -// -// -// 0x0341: Number of Frames to render ... - -// 0x034c + 0x034d: RAM address of the current PB block - -// 0x034e: Last Sync message for rendered frame -// 0x0354: PB loop counter - -// 0x0355: Current Frame - -// 0x0380: ??? -// 0x0381: ??? - -// 0x0388: RAM Address of Output Buffer1 -// 0x038a: RAM Address of Output Buffer2 -// -// 0x038f: Output Buffer Address (0x0520 most of the time) -// -// 0x03f8: *0x0433 -// 0x0520: Some kind of sample buffer - -// 0x0d00: Left mix buffer -// 0x0d60: Right mix buffer - -void 04eb_COMMAND_02() // sync frame - 04eb 02bf 04dc call 0x04dc - 04ed 009e 8000 lri $AC0.M, #0x8000 - 04ef 00dc 0341 lr $AC0.L, @0x0341 - 04f1 02bf 005a call 0x005a - 04f3 8100 clr $ACC0 - 04f4 00fe 0355 sr @0x0355, $AC0.M - 04f6 02bf 04c5 call 0x04c5 - 04f8 00de 0341 lr $AC0.M, @0x0341 - 04fa 007e 0698 bloop $AC0.M, 0x0698 - 04fc 02bf 03d9 call 0x03d9 - - 04fe 02bf 0446 call 0x0446 - 0500 02bf 0bb6 call 0x0bb6 - 0502 02bf 04d4 call 0x04d4 - 0504 8100 clr $ACC0 - 0505 00fe 0354 sr @0x0354, $AC0.M - 0507 00de 0342 lr $AC0.M, @0x0342 - 0509 007e 064c bloop $AC0.M, 0x064c - 050b 00d8 0354 lr $AX0.L, @0x0354 - 050d 009a 0180 lri $AX0.H, #0x0180 - 050f 8100 clr $ACC0 - 0510 00de 0380 lr $AC0.M, @0x0380 - 0512 00dc 0381 lr $AC0.L, @0x0381 - 0514 9000 mul $AX0.L, $AX0.H - 0515 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0516 00fe 034c sr @0x034c, $AC0.M - 0518 00fc 034d sr @0x034d, $AC0.L - 051a 02bf 0393 call 0x0393 - 051c 00da 0400 lr $AX0.H, @0x0400 - 051e 8600 tstaxh $AX0.H - 051f 0295 0647 jz 0x0647 - 0521 00da 0401 lr $AX0.H, @0x0401 - 0523 8600 tstaxh $AX0.H - 0524 0294 0647 jnz 0x0647 - 0526 00da 0433 lr $AX0.H, @0x0433 - 0528 00fa 03f8 sr @0x03f8, $AX0.H - 052a 00da 0406 lr $AX0.H, @0x0406 - 052c 8600 tstaxh $AX0.H - 052d 0294 0a5e jnz 0x0a5e - 052f 8100 clr $ACC0 - 0530 00de 0480 lr $AC0.M, @0x0480 - 0532 0609 cmpis $ACC0, #0x09 - 0533 0295 0540 jz 0x0540 - 0535 0620 cmpis $ACC0, #0x20 - 0536 0295 08cd jz 0x08cd - 0538 0621 cmpis $ACC0, #0x21 - 0539 0295 08d6 jz 0x08d6 - 053b 0608 cmpis $ACC0, #0x08 - 053c 0295 0a66 jz 0x0a66 - 053e 029f 0266 jmp 0x0266 - 0540 00d8 0402 lr $AX0.L, @0x0402 - 0542 8100 clr $ACC0 - 0543 8900 clr $ACC1 - 0544 00dc 0430 lr $AC0.L, @0x0430 - 0546 8d00 set15 - 0547 0099 0050 lri $AX1.L, #0x0050 - 0549 a000 mulx $AX0.L, $AX1.L - 054a a400 mulxac $AX0.L, $AX1.L, $ACC0 - 054b 1404 lsl $ACC0, #4 - 054c 8c00 clr15 - 054d 1ffe mrr $AC1.M, $AC0.M - 054e 0083 0580 lri $AR3, #0x0580 - 0550 00da 0481 lr $AX0.H, @0x0481 - 0552 8600 tstaxh $AX0.H - 0553 0295 0563 jz 0x0563 - 0555 00da 0489 lr $AX0.H, @0x0489 - 0557 8100 clr $ACC0 - 0558 00de 048b lr $AC0.M, @0x048b - 055a 3800 orr $AC0.M, $AX0.H - 055b 0240 000f andi $AC0.M, #0x000f - 055d 0295 0563 jz 0x0563 - 055f 02bf 07d5 call 0x07d5 - 0561 029f 0565 jmp 0x0565 - 0563 02bf 0966 call 0x0966 - 0565 0080 0580 lri $AR0, #0x0580 - 0567 0081 0520 lri $AR1, #0x0520 - 0569 0099 0000 lri $AX1.L, #0x0000 - 056b 02bf 0141 call 0x0141 - 056d 00da 04a8 lr $AX0.H, @0x04a8 - 056f 8600 tstaxh $AX0.H - 0570 0295 0576 jz 0x0576 - 0572 0080 0520 lri $AR0, #0x0520 - 0574 02bf 0b90 call 0x0b90 - 0576 009e 0520 lri $AC0.M, #0x0520 - 0578 00fe 038f sr @0x038f, $AC0.M - 057a 8900 clr $ACC1 - 057b 00df 0484 lr $AC1.M, @0x0484 - 057d 0340 001f andi $AC1.M, #0x001f - 057f b900 tst $ACC1 - 0580 0295 05a6 jz 0x05a6 - 0582 00de 038f lr $AC0.M, @0x038f - 0584 5c00 sub $ACC0, $AC1.L - 0585 00fe 038f sr @0x038f, $AC0.M - 0587 1c7e mrr $AR3, $AC0.M - 0588 0080 0440 lri $AR0, #0x0440 - 058a 05fe addis $ACC1, #0xfe - 058b 02bf 03ac call 0x03ac - 058d 0080 0490 lri $AR0, #0x0490 - 058f 00c1 038f lr $AR1, @0x038f - 0591 8900 clr $ACC1 - 0592 00df 0484 lr $AC1.M, @0x0484 - 0594 0340 001f andi $AC1.M, #0x001f - 0596 02bf 01e1 call 0x01e1 - 0598 00de 038f lr $AC0.M, @0x038f - 059a 0450 addis $ACC0, #0x50 - 059b 1c1e mrr $AR0, $AC0.M - 059c 0083 0440 lri $AR3, #0x0440 - 059e 8900 clr $ACC1 - 059f 00df 0484 lr $AC1.M, @0x0484 - 05a1 0340 001f andi $AC1.M, #0x001f - 05a3 05fe addis $ACC1, #0xfe - 05a4 02bf 03ac call 0x03ac - 05a6 00de 0484 lr $AC0.M, @0x0484 - 05a8 0240 0020 andi $AC0.M, #0x0020 - 05aa 0295 05c8 jz 0x05c8 - 05ac 0080 04a4 lri $AR0, #0x04a4 - 05ae 00c1 038f lr $AR1, @0x038f - 05b0 0082 0454 lri $AR2, #0x0454 - 05b2 0083 04a7 lri $AR3, #0x04a7 - 05b4 18fa lrrd $AX0.H, @$AR3 - 05b5 8600 tstaxh $AX0.H - 05b6 0294 05c6 jnz 0x05c6 - 05b8 18fa lrrd $AX0.H, @$AR3 - 05b9 8600 tstaxh $AX0.H - 05ba 0294 05c6 jnz 0x05c6 - 05bc 18fa lrrd $AX0.H, @$AR3 - 05bd 8600 tstaxh $AX0.H - 05be 0294 05c6 jnz 0x05c6 - 05c0 8100 clr $ACC0 - 05c1 18fe lrrd $AC0.M, @$AR3 - 05c2 0280 7fff cmpi $AC0.M, #0x7fff - 05c4 0295 05c8 jz 0x05c8 - 05c6 02bf 01fc call 0x01fc - 05c8 8100 clr $ACC0 - 05c9 1c9e mrr $IX0, $AC0.M - 05ca 1cde mrr $IX2, $AC0.M - 05cb 7400 incm $AC0.M - 05cc 1cfe mrr $IX3, $AC0.M - 05cd 8100 clr $ACC0 - 05ce 00de 0407 lr $AC0.M, @0x0407 - 05d0 b100 tst $ACC0 - 05d1 0295 05e0 jz 0x05e0 - 05d3 00c3 038f lr $AR3, @0x038f - 05d5 0007 dar $AR3 - 05d6 0080 0477 lri $AR0, #0x0477 - 05d8 0084 ffff lri $IX0, #0xffff - 05da 0087 ffff lri $IX3, #0xffff - 05dc 199a lrrn $AX0.H, @$AR0 - 05dd 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - 05de 005e loop $AC0.M - 05df 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - 05e0 00da 0485 lr $AX0.H, @0x0485 - 05e2 8600 tstaxh $AX0.H - 05e3 0295 05f6 jz 0x05f6 - 05e5 8900 clr $ACC1 - 05e6 0086 0005 lri $IX2, #0x0005 - 05e8 0082 040a lri $AR2, #0x040a - 05ea 1106 05ee bloopi #0x06, 0x05ee - 05ec 18de lrrd $AC0.M, @$AR2 - 05ed 147f lsr $ACC0, #-1 - 05ee 4d36 add'sn $ACC1, $AC0.L : @$AR2, $AC0.M - 05ef b900 tst $ACC1 - 05f0 0294 05f6 jnz 0x05f6 - 05f2 009a 0001 lri $AX0.H, #0x0001 - 05f4 00fa 0401 sr @0x0401, $AX0.H - 05f6 8f00 set40 - 05f7 0086 0002 lri $IX2, #0x0002 - 05f9 0082 0408 lri $AR2, #0x0408 - 05fb 1106 0626 bloopi #0x06, 0x0626 - 05fd 8100 clr $ACC0 - 05fe 195e lrri $AC0.M, @$AR2 - 05ff 1200 sbclr #0x00 - 0600 b100 tst $ACC0 - 0601 0275 ifz - 0602 1300 sbset #0x00 - 0603 1c7e mrr $AR3, $AC0.M - 0604 195e lrri $AC0.M, @$AR2 - 0605 195f lrri $AC1.M, @$AR2 - 0606 5c00 sub $ACC0, $AC1.L - 0607 14fb asr $ACC0, #-5 - 0608 1f5e mrr $AX0.H, $AC0.M - 0609 1f1c mrr $AX0.L, $AC0.L - 060a 185e lrr $AC0.M, @$AR2 - 060b 0240 00ff andi $AC0.M, #0x00ff - 060d 1f7e mrr $AX1.H, $AC0.M - 060e 185e lrr $AC0.M, @$AR2 - 060f 1478 lsr $ACC0, #-8 - 0610 009c 0000 lri $AC0.L, #0x0000 - 0612 d100 cmpar $ACC1, $AX0.H - 0613 0295 061b jz 0x061b - 0615 185e lrr $AC0.M, @$AR2 - 0616 0272 ifg - 0617 7400 incm $AC0.M - 0618 0271 ifs - 0619 7800 decm $AC0.M - 061a 1a5e srr @$AR2, $AC0.M - 061b 0006 dar $AR2 - 061c 00de 038f lr $AC0.M, @0x038f - 061e 5600 subr $ACC0, $AX1.H - 061f 029d 0624 jlz 0x0624 - 0621 1c1e mrr $AR0, $AC0.M - 0622 02bf 011e call 0x011e - 0624 0000 nop - 0625 1b5f srri @$AR2, $AC1.M - 0626 000a iar $AR2 - 0627 8e00 set16 - 0628 8100 clr $ACC0 - 0629 00de 0407 lr $AC0.M, @0x0407 - 062b b100 tst $ACC0 - 062c 0295 063d jz 0x063d - 062e 00c3 038f lr $AR3, @0x038f - 0630 0087 004f lri $IX3, #0x004f - 0632 001f addarn $AR3, $IX3 - 0633 0080 0477 lri $AR0, #0x0477 - 0635 0084 ffff lri $IX0, #0xffff - 0637 0087 ffff lri $IX3, #0xffff - 0639 19fa lrrn $AX0.H, @$AR3 - 063a 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 063b 005e loop $AC0.M - 063c 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - 063d 00da 0406 lr $AX0.H, @0x0406 - 063f 8600 tstaxh $AX0.H - 0640 0294 0645 jnz 0x0645 - 0642 8100 clr $ACC0 - 0643 00fe 0404 sr @0x0404, $AC0.M - 0645 02bf 039c call 0x039c - - - 0647 00de 0354 lr $AC0.M, @0x0354 - 0649 7400 incm $AC0.M - 064a 00fe 0354 sr @0x0354, $AC0.M - 064c 0000 nop - 064d 16fb 0001 si @DIRQ, #0x0001 - 064f 02bf 0b11 call 0x0b11 - 0651 02bf 0b24 call 0x0b24 - 0653 02bf 0b7b call 0x0b7b - 0655 0080 09a0 lri $AR0, #0x09a0 - 0657 0083 0d00 lri $AR3, #0x0d00 - 0659 009f 0050 lri $AC1.M, #0x0050 - 065b 0098 5a82 lri $AX0.L, #0x5a82 - 065d 02bf 03bd call 0x03bd - 065f 0080 09a0 lri $AR0, #0x09a0 - 0661 0083 0d60 lri $AR3, #0x0d60 - 0663 009f 0050 lri $AC1.M, #0x0050 - 0665 02bf 03bd call 0x03bd - 0667 0083 0d00 lri $AR3, #0x0d00 - 0669 02bf 0130 call 0x0130 - 066b 0081 0388 lri $AR1, #0x0388 - 066d 009f 0d00 lri $AC1.M, #0x0d00 - 066f 0080 0050 lri $AR0, #0x0050 - 0671 02bf 0089 call 0x0089 - 0673 0080 0fa0 lri $AR0, #0x0fa0 - 0675 0083 0d60 lri $AR3, #0x0d60 - 0677 009f 0050 lri $AC1.M, #0x0050 - 0679 0098 8000 lri $AX0.L, #0x8000 - 067b 02bf 03bd call 0x03bd - 067d 0083 0d60 lri $AR3, #0x0d60 - 067f 02bf 0130 call 0x0130 - 0681 0081 038a lri $AR1, #0x038a - 0683 009f 0d60 lri $AC1.M, #0x0d60 - 0685 0080 0050 lri $AR0, #0x0050 - 0687 02bf 0089 call 0x0089 - 0689 009a 0000 lri $AX0.H, #0x0000 - 068b 0098 00a0 lri $AX0.L, #0x00a0 - 068d 0080 0388 lri $AR0, #0x0388 - 068f 02bf 04ce call 0x04ce - 0691 0080 038a lri $AR0, #0x038a - 0693 02bf 04ce call 0x04ce - 0695 02bf 0497 call 0x0497 - 0697 0000 nop - 0698 0000 nop - } - 0699 029f 0031 jmp 0x0031 - 069b 0080 0346 lri $AR0, #0x0346 - 069d 02bf 0051 call 0x0051 - 069f 02bf 0051 call 0x0051 - 06a1 0081 0346 lri $AR1, #0x0346 - 06a3 193e lrri $AC0.M, @$AR1 - 06a4 193c lrri $AC0.L, @$AR1 - 06a5 009f 0400 lri $AC1.M, #0x0400 - 06a7 00c0 0345 lr $AR0, @0x0345 - 06a9 02bf 007e call 0x007e - - 06ab 0081 0348 lri $AR1, #0x0348 - 06ad 193e lrri $AC0.M, @$AR1 - 06ae 193c lrri $AC0.L, @$AR1 - 06af 009f 0800 lri $AC1.M, #0x0800 - 06b1 00c0 0345 lr $AR0, @0x0345 - 06b3 02bf 007e call 0x007e - - 06b5 0081 0346 lri $AR1, #0x0346 - 06b7 193e lrri $AC0.M, @$AR1 - 06b8 193c lrri $AC0.L, @$AR1 - 06b9 009f 0800 lri $AC1.M, #0x0800 - 06bb 00c0 0345 lr $AR0, @0x0345 - 06bd 02bf 008b call 0x008b - - 06bf 0081 0348 lri $AR1, #0x0348 - 06c1 193e lrri $AC0.M, @$AR1 - 06c2 193c lrri $AC0.L, @$AR1 - 06c3 009f 0400 lri $AC1.M, #0x0400 - 06c5 00c0 0345 lr $AR0, @0x0345 - 06c7 02bf 008b call 0x008b - - 06c9 029f 0049 jmp 0x0049 -} - -void 06cb_Unk() { - 06cb 0080 0346 lri $AR0, #0x0346 - 06cd 02bf 0051 call 0x0051 - 06cf 02bf 0051 call 0x0051 - 06d1 0081 0346 lri $AR1, #0x0346 - 06d3 193e lrri $AC0.M, @$AR1 - 06d4 193c lrri $AC0.L, @$AR1 - 06d5 009f 0400 lri $AC1.M, #0x0400 - 06d7 00c0 0345 lr $AR0, @0x0345 - 06d9 02bf 007e call 0x007e - 06db 0081 0348 lri $AR1, #0x0348 - 06dd 193e lrri $AC0.M, @$AR1 - 06de 193c lrri $AC0.L, @$AR1 - 06df 009f 0400 lri $AC1.M, #0x0400 - 06e1 00c0 0345 lr $AR0, @0x0345 - 06e3 02bf 008b call 0x008b - 06e5 029f 0049 jmp 0x0049 -} - -void 06e7_Unk() { - 06e7 0080 0346 lri $AR0, #0x0346 - 06e9 02bf 0051 call 0x0051 - 06eb 02bf 0051 call 0x0051 - 06ed 0081 0346 lri $AR1, #0x0346 - 06ef 193e lrri $AC0.M, @$AR1 - 06f0 193c lrri $AC0.L, @$AR1 - 06f1 009f 0400 lri $AC1.M, #0x0400 - 06f3 00c0 0345 lr $AR0, @0x0345 - 06f5 02bf 00ae call 0x00ae - 06f7 0081 0348 lri $AR1, #0x0348 - 06f9 193e lrri $AC0.M, @$AR1 - 06fa 193c lrri $AC0.L, @$AR1 - 06fb 009f 0400 lri $AC1.M, #0x0400 - 06fd 00c0 0345 lr $AR0, @0x0345 - 06ff 02bf 008b call 0x008b - 0701 029f 0049 jmp 0x0049 - 0703 0080 0346 lri $AR0, #0x0346 - 0705 02bf 0051 call 0x0051 - 0707 02bf 0051 call 0x0051 - 0709 0081 0346 lri $AR1, #0x0346 - 070b 193e lrri $AC0.M, @$AR1 - 070c 193c lrri $AC0.L, @$AR1 - 070d 009f 0400 lri $AC1.M, #0x0400 - 070f 00c0 0344 lr $AR0, @0x0344 - 0711 02bf 007e call 0x007e - 0713 0081 0348 lri $AR1, #0x0348 - 0715 193e lrri $AC0.M, @$AR1 - 0716 193c lrri $AC0.L, @$AR1 - 0717 009f 0800 lri $AC1.M, #0x0800 - 0719 00c0 0344 lr $AR0, @0x0344 - 071b 02bf 007e call 0x007e - 071d 0080 0400 lri $AR0, #0x0400 - 071f 0083 0800 lri $AR3, #0x0800 - 0721 0084 0000 lri $IX0, #0x0000 - 0723 00da 0345 lr $AX0.H, @0x0345 - 0725 00df 0344 lr $AC1.M, @0x0344 - 0727 8f00 set40 - 0728 197b lrri $AX1.H, @$AR3 - 0729 b800 mulx $AX0.H, $AX1.H - 072a 197b lrri $AX1.H, @$AR3 - 072b 007f 0730 bloop $AC1.M, 0x0730 - 072d 199e lrrn $AC0.M, @$AR0 - 072e bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 072f 80b2 nx'sl : $AC0.M, $AX1.H - 0730 0000 nop - 0731 8e00 set16 - 0732 0081 0346 lri $AR1, #0x0346 - 0734 193e lrri $AC0.M, @$AR1 - 0735 193c lrri $AC0.L, @$AR1 - 0736 009f 0400 lri $AC1.M, #0x0400 - 0738 00c0 0344 lr $AR0, @0x0344 - 073a 02bf 008b call 0x008b - 073c 009e 8200 lri $AC0.M, #0x8200 - 073e 00dc 0344 lr $AC0.L, @0x0344 - 0740 02bf 005a call 0x005a - 0742 029f 0031 jmp 0x0031 - 0744 0080 0346 lri $AR0, #0x0346 - 0746 02bf 0051 call 0x0051 - 0748 0081 0346 lri $AR1, #0x0346 - 074a 009f 0400 lri $AC1.M, #0x0400 - 074c 00c0 0345 lr $AR0, @0x0345 - 074e 02bf 007c call 0x007c - 0750 02bf 8644 call 0x8644 - 0752 029f 0049 jmp 0x0049 -} - -void 0754_Unk() { - 0754 009e 0458 lri $AC0.M, #0x0458 - 0756 2231 lrs $AX0.H, @0x0031 - 0757 4400 addr $ACC0, $AX0.H - 0758 1c1e mrr $AR0, $AC0.M - 0759 1fda mrr $AC0.M, $AX0.H - 075a 3280 xorr'ls $AC0.M, $AX1.H : $AX0.L, $AC0.M - 075b 7400 incm $AC0.M - 075c 2232 lrs $AX0.H, @0x0032 - 075d 4400 addr $ACC0, $AX0.H - 075e 0090 0000 lri $AC0.H, #0x0000 - 0760 029f 0771 jmp 0x0771 - 0762 009e 0458 lri $AC0.M, #0x0458 - 0764 2231 lrs $AX0.H, @0x0031 - 0765 4400 addr $ACC0, $AX0.H - 0766 1c1e mrr $AR0, $AC0.M - 0767 1fda mrr $AC0.M, $AX0.H - 0768 3280 xorr'ls $AC0.M, $AX1.H : $AX0.L, $AC0.M - 0769 7400 incm $AC0.M - 076a 2232 lrs $AX0.H, @0x0032 - 076b 4400 addr $ACC0, $AX0.H - 076c 0090 0000 lri $AC0.H, #0x0000 - 076e 8200 cmp - 076f 0270 ifns - 0770 1fdf mrr $AC0.M, $AC1.M - 0771 1f3e mrr $AX1.L, $AC0.M - 0772 02bf 07c8 call 0x07c8 - 0774 2634 lrs $AC0.M, @0x0034 - 0775 2435 lrs $AC0.L, @0x0035 - 0776 7200 addaxl $ACC0, $AX1.L - 0777 5300 subr $ACC1, $AX1.L - 0778 2e34 srs @0x0034, $AC0.M - 0779 2c35 srs @0x0035, $AC0.L - 077a 02df ret -} - -void 077b_Unk() { - 077b 8100 clr $ACC0 - 077c 2234 lrs $AX0.H, @0x0034 - 077d 2035 lrs $AX0.L, @0x0035 - 077e 4800 addax $ACC0, $AX0.L - 077f 147c lsr $ACC0, #-4 - 0780 2e36 srs @0x0036, $AC0.M - 0781 2c37 srs @0x0037, $AC0.L - 0782 2380 lrs $AX1.H, @0xff80 - 0783 8d00 set15 - 0784 c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - 0785 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0786 8c00 clr15 - 0787 2035 lrs $AX0.L, @0x0035 - 0788 f000 lsl16 $ACC0 - 0789 4e00 addp $ACC0 - 078a 238c lrs $AX1.H, @0xff8c - 078b 218d lrs $AX1.L, @0xff8d - 078c 4a00 addax $ACC0, $AX1.L - 078d 2e38 srs @0x0038, $AC0.M - 078e 2c39 srs @0x0039, $AC0.L - 078f 1fd8 mrr $AC0.M, $AX0.L - 0790 0240 000f andi $AC0.M, #0x000f - 0792 2e31 srs @0x0031, $AC0.M - 0793 268a lrs $AC0.M, @0xff8a - 0794 248b lrs $AC0.L, @0xff8b - 0795 5800 subax $ACC0, $AX0.L - 0796 2e3a srs @0x003a, $AC0.M - 0797 2c3b srs @0x003b, $AC0.L - 0798 02df ret -} - -void 0799_Unk() { - 0799 2236 lrs $AX0.H, @0x0036 - 079a 2037 lrs $AX0.L, @0x0037 - 079b 8100 clr $ACC0 - 079c 268a lrs $AC0.M, @0xff8a - 079d 248b lrs $AC0.L, @0xff8b - 079e 147c lsr $ACC0, #-4 - 079f 5800 subax $ACC0, $AX0.L - 07a0 0295 07a9 jz 0x07a9 - 07a2 02bf 081b call 0x081b - 07a4 0e10 lris $AC0.M, #0x10 - 07a5 2e32 srs @0x0032, $AC0.M - 07a6 8100 clr $ACC0 - 07a7 2e31 srs @0x0031, $AC0.M - 07a8 02df ret -} - -void 07a9_Unk() { - 07a9 228a lrs $AX0.H, @0xff8a - 07aa 208b lrs $AX0.L, @0xff8b - 07ab 8100 clr $ACC0 - 07ac 2634 lrs $AC0.M, @0x0034 - 07ad 2435 lrs $AC0.L, @0x0035 - 07ae 5800 subax $ACC0, $AX0.L - 07af 0290 07b6 jns 0x07b6 - 07b1 02bf 081b call 0x081b - 07b3 263b lrs $AC0.M, @0x003b - 07b4 029f 07a5 jmp 0x07a5 - 07b6 2688 lrs $AC0.M, @0xff88 - 07b7 2489 lrs $AC0.L, @0xff89 - 07b8 2e34 srs @0x0034, $AC0.M - 07b9 2c35 srs @0x0035, $AC0.L - 07ba 0e10 lris $AC0.M, #0x10 - 07bb 2e32 srs @0x0032, $AC0.M - 07bc 02bf 077b call 0x077b - 07be 2682 lrs $AC0.M, @0xff82 - 07bf 2e67 srs @0x0067, $AC0.M - 07c0 2683 lrs $AC0.M, @0xff83 - 07c1 2e66 srs @0x0066, $AC0.M - 07c2 8100 clr $ACC0 - 07c3 00fe 0362 sr @0x0362, $AC0.M - 07c5 02bf 081b call 0x081b - 07c7 02df ret -} - -void 07c8_Unk() { - 07c8 b100 tst $ACC0 - 07c9 02d5 retz - 07ca 04fe addis $ACC0, #0xfe - 07cb 1f1e mrr $AX0.L, $AC0.M - 07cc 191e lrri $AC0.M, @$AR0 - 07cd 0291 07d3 js 0x07d3 - 07cf 191a lrri $AX0.H, @$AR0 - 07d0 0058 loop $AX0.L - 07d1 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 07d2 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 07d3 1b7e srri @$AR3, $AC0.M - 07d4 02df ret -} - -void 07d5_Unk() { - 07d5 0092 0004 lri $CR, #0x0004 - 07d7 02bf 077b call 0x077b - 07d9 8100 clr $ACC0 - 07da 00fe 0362 sr @0x0362, $AC0.M - 07dc 8100 clr $ACC0 - 07dd 263a lrs $AC0.M, @0x003a - 07de 243b lrs $AC0.L, @0x003b - 07df b100 tst $ACC0 - 07e0 0294 07f2 jnz 0x07f2 - 07e2 02bf 0799 call 0x0799 - 07e4 2231 lrs $AX0.H, @0x0031 - 07e5 8600 tstaxh $AX0.H - 07e6 0294 07ef jnz 0x07ef - 07e8 02bf 0762 call 0x0762 - 07ea b900 tst $ACC1 - 07eb 0295 0818 jz 0x0818 - 07ed 02bf 077b call 0x077b - 07ef 8100 clr $ACC0 - 07f0 263a lrs $AC0.M, @0x003a - 07f1 243b lrs $AC0.L, @0x003b - 07f2 1f1f mrr $AX0.L, $AC1.M - 07f3 009a 0000 lri $AX0.H, #0x0000 - 07f5 5800 subax $ACC0, $AX0.L - 07f6 0290 0805 jns 0x0805 - 07f8 8100 clr $ACC0 - 07f9 2631 lrs $AC0.M, @0x0031 - 07fa b100 tst $ACC0 - 07fb 0294 07ff jnz 0x07ff - 07fd 02bf 0799 call 0x0799 - 07ff 02bf 0754 call 0x0754 - 0801 02bf 077b call 0x077b - 0803 029f 07dc jmp 0x07dc - 0805 8100 clr $ACC0 - 0806 2631 lrs $AC0.M, @0x0031 - 0807 b100 tst $ACC0 - 0808 0294 080c jnz 0x080c - 080a 02bf 0799 call 0x0799 - 080c 02bf 0762 call 0x0762 - 080e b900 tst $ACC1 - 080f 0295 0818 jz 0x0818 - 0811 02bf 077b call 0x077b - 0813 029f 0805 jmp 0x0805 - 0815 8100 clr $ACC0 - 0816 005f loop $AC1.M - 0817 1b7e srri @$AR3, $AC0.M - 0818 0092 00ff lri $CR, #0x00ff - 081a 02df ret -} - -void 081b_Unk() { - 081b 00ff 0360 sr @0x0360, $AC1.M - 081d 00da 0362 lr $AX0.H, @0x0362 - 081f 8600 tstaxh $AX0.H - 0820 0294 082d jnz 0x082d - 0822 0a01 lris $AX0.H, #0x01 - 0823 00fa 0362 sr @0x0362, $AX0.H - 0825 2638 lrs $AC0.M, @0x0038 - 0826 2439 lrs $AC0.L, @0x0039 - 0827 009f 0005 lri $AC1.M, #0x0005 - 0829 02bf 0103 call 0x0103 - 082b 0092 0004 lri $CR, #0x0004 - 082d 0080 ffd3 lri $AR0, #0xffd3 - 082f 0084 0000 lri $IX0, #0x0000 - 0831 199e lrrn $AC0.M, @$AR0 - 0832 1ffe mrr $AC1.M, $AC0.M - 0833 1401 lsl $ACC0, #1 - 0834 0240 001e andi $AC0.M, #0x001e - 0836 0200 0300 addi $AC0.M, #0x0300 - 0838 1c3e mrr $AR1, $AC0.M - 0839 157c lsr $ACC1, #-4 - 083a 0340 000f andi $AC1.M, #0x000f - 083c 0a11 lris $AX0.H, #0x11 - 083d 5500 subr $ACC1, $AX0.H - 083e 009a 00f0 lri $AX0.H, #0x00f0 - 0840 009b 000f lri $AX1.H, #0x000f - 0842 0082 0370 lri $AR2, #0x0370 - 0844 1998 lrrn $AX0.L, @$AR0 - 0845 6000 movr $ACC0, $AX0.L - 0846 1107 084d bloopi #0x07, 0x084d - 0848 3400 andr $AC0.M, $AX0.H - 0849 1408 lsl $ACC0, #8 - 084a 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 084b 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 084c 140c lsl $ACC0, #12 - 084d 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 084e 3400 andr $AC0.M, $AX0.H - 084f 1408 lsl $ACC0, #8 - 0850 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0851 3600 andr $AC0.M, $AX1.H - 0852 140c lsl $ACC0, #12 - 0853 1b5e srri @$AR2, $AC0.M - 0854 8f00 set40 - 0855 1f7f mrr $AX1.H, $AC1.M - 0856 2066 lrs $AX0.L, @0x0066 - 0857 2767 lrs $AC1.M, @0x0067 - 0858 193a lrri $AX0.H, @$AR1 - 0859 1939 lrri $AX1.L, @$AR1 - 085a 0080 0370 lri $AR0, #0x0370 - 085c 0081 0458 lri $AR1, #0x0458 - 085e 1c80 mrr $IX0, $AR0 - 085f a000 mulx $AX0.L, $AX1.L - 0860 ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - 0861 1108 086a bloopi #0x08, 0x086a - 0863 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0864 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0865 1485 asl $ACC0, #5 - 0866 e831 maddc's $AC0.M, $AX1.L : @$AR1, $AC0.M - 0867 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 0868 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 0869 1585 asl $ACC1, #5 - 086a ea39 maddc's $AC1.M, $AX1.L : @$AR1, $AC1.M - 086b 8e00 set16 - 086c 8900 clr $ACC1 - 086d 00df 0360 lr $AC1.M, @0x0360 - 086f 02df ret -} - -void 0870_Unk() { - 0870 0080 0346 lri $AR0, #0x0346 - 0872 02bf 0051 call 0x0051 - 0874 8100 clr $ACC0 - 0875 0080 0458 lri $AR0, #0x0458 - 0877 1010 loopi #0x10 - 0878 1b1e srri @$AR0, $AC0.M - 0879 00fe 0482 sr @0x0482, $AC0.M - 087b 00fe 0483 sr @0x0483, $AC0.M - 087d 009c 0000 lri $AC0.L, #0x0000 - 087f 00fe 0434 sr @0x0434, $AC0.M - 0881 00fc 0435 sr @0x0435, $AC0.L - 0883 009e 0100 lri $AC0.M, #0x0100 - 0885 009c f100 lri $AC0.L, #0xf100 - 0887 00fe 048e sr @0x048e, $AC0.M - 0889 00fc 048f sr @0x048f, $AC0.L - 088b 009e 0040 lri $AC0.M, #0x0040 - 088d 009c 0000 lri $AC0.L, #0x0000 - 088f 00fe 048c sr @0x048c, $AC0.M - 0891 00fc 048d sr @0x048d, $AC0.L - 0893 009e 0009 lri $AC0.M, #0x0009 - 0895 00fe 0480 sr @0x0480, $AC0.M - 0897 009e 0010 lri $AC0.M, #0x0010 - 0899 00fe 0432 sr @0x0432, $AC0.M - 089b 009e 0100 lri $AC0.M, #0x0100 - 089d 009c f250 lri $AC0.L, #0xf250 - 089f 00fe 048a sr @0x048a, $AC0.M - 08a1 00fc 048b sr @0x048b, $AC0.L - 08a3 009c 0000 lri $AC0.L, #0x0000 - 08a5 00fe 0488 sr @0x0488, $AC0.M - 08a7 00fc 0489 sr @0x0489, $AC0.L - 08a9 009e 0001 lri $AC0.M, #0x0001 - 08ab 00fe 0481 sr @0x0481, $AC0.M - 08ad 8900 clr $ACC1 - 08ae 00ff 0401 sr @0x0401, $AC1.M - 08b0 1180 08ca bloopi #0x80, 0x08ca - 08b2 0083 0580 lri $AR3, #0x0580 - 08b4 009f 0100 lri $AC1.M, #0x0100 - 08b6 02bf 07d5 call 0x07d5 - 08b8 0081 0346 lri $AR1, #0x0346 - 08ba 193e lrri $AC0.M, @$AR1 - 08bb 18bc lrrd $AC0.L, @$AR1 - 08bc 009f 0580 lri $AC1.M, #0x0580 - 08be 0080 0100 lri $AR0, #0x0100 - 08c0 02bf 008b call 0x008b - 08c2 0081 0346 lri $AR1, #0x0346 - 08c4 193e lrri $AC0.M, @$AR1 - 08c5 18bc lrrd $AC0.L, @$AR1 - 08c6 0098 0200 lri $AX0.L, #0x0200 - 08c8 7000 addaxl $ACC0, $AX0.L - 08c9 1b3e srri @$AR1, $AC0.M - 08ca 1abc srrd @$AR1, $AC0.L - 08cb 029f 0049 jmp 0x0049 -} - -void 08cd_Unk() { - 08cd 8900 clr $ACC1 - 08ce 009f 0050 lri $AC1.M, #0x0050 - 08d0 0083 0520 lri $AR3, #0x0520 - 08d2 02bf 08e8 call 0x08e8 - 08d4 029f 056d jmp 0x056d -} - -void 08d6_Unk() { - 08d6 00d8 0402 lr $AX0.L, @0x0402 - 08d8 8100 clr $ACC0 - 08d9 8900 clr $ACC1 - 08da 00dc 0430 lr $AC0.L, @0x0430 - 08dc 009a 0050 lri $AX0.H, #0x0050 - 08de 9000 mul $AX0.L, $AX0.H - 08df 9400 mulac $AX0.L, $AX0.H, $ACC0 - 08e0 1404 lsl $ACC0, #4 - 08e1 1ffe mrr $AC1.M, $AC0.M - 08e2 0083 0580 lri $AR3, #0x0580 - 08e4 02bf 08e8 call 0x08e8 - 08e6 029f 0565 jmp 0x0565 -} - -void 08e8_Unk() { - 08e8 0092 0004 lri $CR, #0x0004 - 08ea 8100 clr $ACC0 - 08eb 263a lrs $AC0.M, @0x003a - 08ec 243b lrs $AC0.L, @0x003b - 08ed 1f1f mrr $AX0.L, $AC1.M - 08ee 009a 0000 lri $AX0.H, #0x0000 - 08f0 5800 subax $ACC0, $AX0.L - 08f1 0290 0908 jns 0x0908 - 08f3 8900 clr $ACC1 - 08f4 00c0 043b lr $AR0, @0x043b - 08f6 02bf 092d call 0x092d - 08f8 8100 clr $ACC0 - 08f9 1fd8 mrr $AC0.M, $AX0.L - 08fa 223b lrs $AX0.H, @0x003b - 08fb 5400 subr $ACC0, $AX0.H - 08fc 0007 dar $AR3 - 08fd 1979 lrri $AX1.L, @$AR3 - 08fe 005e loop $AC0.M - 08ff 1b79 srri @$AR3, $AX1.L - 0900 009f 0001 lri $AC1.M, #0x0001 - 0902 2f01 srs @0x0001, $AC1.M - 0903 8900 clr $ACC1 - 0904 2f3b srs @0x003b, $AC1.M - 0905 0092 00ff lri $CR, #0x00ff - 0907 02df ret -} - -void 0908_Unk() { - 0908 2e3a srs @0x003a, $AC0.M - 0909 2c3b srs @0x003b, $AC0.L - 090a 8100 clr $ACC0 - 090b 8900 clr $ACC1 - 090c 268a lrs $AC0.M, @0xff8a - 090d 2734 lrs $AC1.M, @0x0034 - 090e 5c00 sub $ACC0, $AC1.L - 090f 2e36 srs @0x0036, $AC0.M - 0910 5000 subr $ACC0, $AX0.L - 0911 0290 0927 jns 0x0927 - 0913 00c0 0436 lr $AR0, @0x0436 - 0915 02bf 092d call 0x092d - 0917 8100 clr $ACC0 - 0918 1fd8 mrr $AC0.M, $AX0.L - 0919 2236 lrs $AX0.H, @0x0036 - 091a 5400 subr $ACC0, $AX0.H - 091b 1c1e mrr $AR0, $AC0.M - 091c 8100 clr $ACC0 - 091d 2e34 srs @0x0034, $AC0.M - 091e 2688 lrs $AC0.M, @0xff88 - 091f 2489 lrs $AC0.L, @0xff89 - 0920 2e8c srs @0xff8c, $AC0.M - 0921 2c8d srs @0xff8d, $AC0.L - 0922 02bf 092d call 0x092d - 0924 0092 00ff lri $CR, #0x00ff - 0926 02df ret -} - -void 0927_Unk() { - 0927 1c18 mrr $AR0, $AX0.L - 0928 02bf 092d call 0x092d - 092a 0092 00ff lri $CR, #0x00ff - 092c 02df ret -} - -void 092d_Unk() { - 092d 8100 clr $ACC0 - 092e 1fc0 mrr $AC0.M, $AR0 - 092f b100 tst $ACC0 - 0930 02d5 retz - 0931 8900 clr $ACC1 - 0932 2734 lrs $AC1.M, @0x0034 - 0933 0340 0001 andi $AC1.M, #0x0001 - 0935 009b 0000 lri $AX1.H, #0x0000 - 0937 1f3f mrr $AX1.L, $AC1.M - 0938 268c lrs $AC0.M, @0xff8c - 0939 248d lrs $AC0.L, @0xff8d - 093a 8900 clr $ACC1 - 093b 2534 lrs $AC1.L, @0x0034 - 093c 1501 lsl $ACC1, #1 - 093d 4c00 add $ACC0, $AC1.L - 093e 5a00 subax $ACC0, $AX1.L - 093f 5a00 subax $ACC0, $AX1.L - 0940 1c20 mrr $AR1, $AR0 - 0941 1fe0 mrr $AC1.M, $AR0 - 0942 0502 addis $ACC1, #0x02 - 0943 1c1f mrr $AR0, $AC1.M - 0944 009f 0a00 lri $AC1.M, #0x0a00 - 0946 0092 00ff lri $CR, #0x00ff - 0948 02bf 007e call 0x007e - 094a 0092 0004 lri $CR, #0x0004 - 094c 2734 lrs $AC1.M, @0x0034 - 094d 1f61 mrr $AX1.H, $AR1 - 094e 4700 addr $ACC1, $AX1.H - 094f 2f34 srs @0x0034, $AC1.M - 0950 0080 0a00 lri $AR0, #0x0a00 - 0952 8900 clr $ACC1 - 0953 1ff9 mrr $AC1.M, $AX1.L - 0954 b900 tst $ACC1 - 0955 0274 ifnz - 0956 0008 iar $AR0 - 0957 8900 clr $ACC1 - 0958 1fe1 mrr $AC1.M, $AR1 - 0959 191e lrri $AC0.M, @$AR0 - 095a 0701 cmpis $ACC1, #0x01 - 095b 0293 0964 jle 0x0964 - 095d 191a lrri $AX0.H, @$AR0 - 095e 05fe addis $ACC1, #0xfe - 095f 005f loop $AC1.M - 0960 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0961 1b7e srri @$AR3, $AC0.M - 0962 1b7a srri @$AR3, $AX0.H - 0963 02df ret -} - -void 0964_Unk() { - 0964 1b7e srri @$AR3, $AC0.M - 0965 02df ret -} - -void 0966_Unk() { - 0966 0092 0004 lri $CR, #0x0004 - 0968 2201 lrs $AX0.H, @0x0001 - 0969 8600 tstaxh $AX0.H - 096a 0294 0997 jnz 0x0997 - 096c 2204 lrs $AX0.H, @0x0004 - 096d 8600 tstaxh $AX0.H - 096e 02b4 09eb callne 0x09eb - 0970 2231 lrs $AX0.H, @0x0031 - 0971 8600 tstaxh $AX0.H - 0972 0295 098c jz 0x098c - 0974 009e 0458 lri $AC0.M, #0x0458 - 0976 4400 addr $ACC0, $AX0.H - 0977 1c1e mrr $AR0, $AC0.M - 0978 0e10 lris $AC0.M, #0x10 - 0979 5400 subr $ACC0, $AX0.H - 097a 1f7e mrr $AX1.H, $AC0.M - 097b 02bf 07c8 call 0x07c8 - 097d d900 cmpar $ACC1, $AX1.H - 097e 0292 098b jg 0x098b - 0980 0295 0987 jz 0x0987 - 0982 2631 lrs $AC0.M, @0x0031 - 0983 4c00 add $ACC0, $AC1.L - 0984 2e31 srs @0x0031, $AC0.M - 0985 029f 09e8 jmp 0x09e8 - 0987 8100 clr $ACC0 - 0988 2e31 srs @0x0031, $AC0.M - 0989 029f 09e8 jmp 0x09e8 - 098b 5700 subr $ACC1, $AX1.H - 098c 8100 clr $ACC0 - 098d 2605 lrs $AC0.M, @0x0005 - 098e b100 tst $ACC0 - 098f 0295 09a8 jz 0x09a8 - 0991 8100 clr $ACC0 - 0992 2e05 srs @0x0005, $AC0.M - 0993 2281 lrs $AX0.H, @0xff81 - 0994 8600 tstaxh $AX0.H - 0995 0294 099e jnz 0x099e - 0997 8100 clr $ACC0 - 0998 005f loop $AC1.M - 0999 1b7e srri @$AR3, $AC0.M - 099a 7400 incm $AC0.M - 099b 2e01 srs @0x0001, $AC0.M - 099c 029f 09e8 jmp 0x09e8 - 099e 2688 lrs $AC0.M, @0xff88 - 099f 2489 lrs $AC0.L, @0xff89 - 09a0 2e34 srs @0x0034, $AC0.M - 09a1 2c35 srs @0x0035, $AC0.L - 09a2 02bf 09f0 call 0x09f0 - 09a4 2682 lrs $AC0.M, @0xff82 - 09a5 2483 lrs $AC0.L, @0xff83 - 09a6 2e67 srs @0x0067, $AC0.M - 09a7 2c66 srs @0x0066, $AC0.L - 09a8 00ff 0360 sr @0x0360, $AC1.M - 09aa 2638 lrs $AC0.M, @0x0038 - 09ab 2439 lrs $AC0.L, @0x0039 - 09ac 009f 0005 lri $AC1.M, #0x0005 - 09ae 02bf 0103 call 0x0103 - 09b0 0092 0004 lri $CR, #0x0004 - 09b2 8900 clr $ACC1 - 09b3 00ff 0362 sr @0x0362, $AC1.M - 09b5 00df 0360 lr $AC1.M, @0x0360 - 09b7 02bf 0a09 call 0x0a09 - 09b9 8100 clr $ACC0 - 09ba 00de 0362 lr $AC0.M, @0x0362 - 09bc 2280 lrs $AX0.H, @0xff80 - 09bd 4400 addr $ACC0, $AX0.H - 09be 00fe 0362 sr @0x0362, $AC0.M - 09c0 8100 clr $ACC0 - 09c1 263a lrs $AC0.M, @0x003a - 09c2 243b lrs $AC0.L, @0x003b - 09c3 0a01 lris $AX0.H, #0x01 - 09c4 0081 0405 lri $AR1, #0x0405 - 09c6 7a00 dec $ACC0 - 09c7 b100 tst $ACC0 - 09c8 0275 ifz - 09c9 1a3a srr @$AR1, $AX0.H - 09ca 2e3a srs @0x003a, $AC0.M - 09cb 2c3b srs @0x003b, $AC0.L - 09cc 0710 cmpis $ACC1, #0x10 - 09cd 0293 09d6 jle 0x09d6 - 09cf 05f0 addis $ACC1, #0xf0 - 09d0 2205 lrs $AX0.H, @0x0005 - 09d1 8600 tstaxh $AX0.H - 09d2 0294 0991 jnz 0x0991 - 09d4 029f 09b7 jmp 0x09b7 - 09d6 0275 ifz - 09d7 8900 clr $ACC1 - 09d8 2f31 srs @0x0031, $AC1.M - 09d9 1fc3 mrr $AC0.M, $AR3 - 09da 04f0 addis $ACC0, #0xf0 - 09db 1c1e mrr $AR0, $AC0.M - 09dc 0083 0458 lri $AR3, #0x0458 - 09de 0e10 lris $AC0.M, #0x10 - 09df 02bf 07c8 call 0x07c8 - 09e1 2638 lrs $AC0.M, @0x0038 - 09e2 2439 lrs $AC0.L, @0x0039 - 09e3 00d8 0362 lr $AX0.L, @0x0362 - 09e5 7000 addaxl $ACC0, $AX0.L - 09e6 2c39 srs @0x0039, $AC0.L - 09e7 2e38 srs @0x0038, $AC0.M - 09e8 0092 00ff lri $CR, #0x00ff - 09ea 02df ret -} - -void 09eb_Unk() { - 09eb 8100 clr $ACC0 - 09ec 2e34 srs @0x0034, $AC0.M - 09ed 2e35 srs @0x0035, $AC0.M - 09ee 2e66 srs @0x0066, $AC0.M - 09ef 2e67 srs @0x0067, $AC0.M - 09f0 2334 lrs $AX1.H, @0x0034 - 09f1 2135 lrs $AX1.L, @0x0035 - 09f2 268a lrs $AC0.M, @0xff8a - 09f3 248b lrs $AC0.L, @0xff8b - 09f4 5a00 subax $ACC0, $AX1.L - 09f5 147c lsr $ACC0, #-4 - 09f6 2e3a srs @0x003a, $AC0.M - 09f7 2c3b srs @0x003b, $AC0.L - 09f8 2634 lrs $AC0.M, @0x0034 - 09f9 2435 lrs $AC0.L, @0x0035 - 09fa 147c lsr $ACC0, #-4 - 09fb 2280 lrs $AX0.H, @0xff80 - 09fc c010 mulc'mv $AC0.M, $AX0.H : $AX0.L, $AC0.L - 09fd 9600 mulmv $AX0.L, $AX0.H, $ACC0 - 09fe f000 lsl16 $ACC0 - 09ff 4e00 addp $ACC0 - 0a00 238c lrs $AX1.H, @0xff8c - 0a01 218d lrs $AX1.L, @0xff8d - 0a02 4a00 addax $ACC0, $AX1.L - 0a03 2e38 srs @0x0038, $AC0.M - 0a04 2c39 srs @0x0039, $AC0.L - 0a05 8100 clr $ACC0 - 0a06 2e05 srs @0x0005, $AC0.M - 0a07 2e31 srs @0x0031, $AC0.M - 0a08 02df ret -} - - -void 0a09_Unk() { - 0a09 00ff 0360 sr @0x0360, $AC1.M - 0a0b 0080 ffd3 lri $AR0, #0xffd3 - 0a0d 0084 0000 lri $IX0, #0x0000 - 0a0f 199e lrrn $AC0.M, @$AR0 - 0a10 1ffe mrr $AC1.M, $AC0.M - 0a11 1401 lsl $ACC0, #1 - 0a12 0240 001e andi $AC0.M, #0x001e - 0a14 0200 0300 addi $AC0.M, #0x0300 - 0a16 1c3e mrr $AR1, $AC0.M - 0a17 157c lsr $ACC1, #-4 - 0a18 0340 000f andi $AC1.M, #0x000f - 0a1a 0a11 lris $AX0.H, #0x11 - 0a1b 5500 subr $ACC1, $AX0.H - 0a1c 009a 00f0 lri $AX0.H, #0x00f0 - 0a1e 009b 000f lri $AX1.H, #0x000f - 0a20 0082 0370 lri $AR2, #0x0370 - 0a22 1998 lrrn $AX0.L, @$AR0 - 0a23 6000 movr $ACC0, $AX0.L - 0a24 1107 0a2b bloopi #0x07, 0x0a2b - 0a26 3400 andr $AC0.M, $AX0.H - 0a27 1408 lsl $ACC0, #8 - 0a28 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0a29 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 0a2a 140c lsl $ACC0, #12 - 0a2b 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0a2c 3400 andr $AC0.M, $AX0.H - 0a2d 1408 lsl $ACC0, #8 - 0a2e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0a2f 3600 andr $AC0.M, $AX1.H - 0a30 140c lsl $ACC0, #12 - 0a31 1b5e srri @$AR2, $AC0.M - 0a32 8f00 set40 - 0a33 1f7f mrr $AX1.H, $AC1.M - 0a34 2066 lrs $AX0.L, @0x0066 - 0a35 2767 lrs $AC1.M, @0x0067 - 0a36 193a lrri $AX0.H, @$AR1 - 0a37 1939 lrri $AX1.L, @$AR1 - 0a38 0080 0370 lri $AR0, #0x0370 - 0a3a 1c80 mrr $IX0, $AR0 - 0a3b a000 mulx $AX0.L, $AX1.L - 0a3c ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - 0a3d 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0a3e a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0a3f 1485 asl $ACC0, #5 - 0a40 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 0a41 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 0a42 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 0a43 1585 asl $ACC1, #5 - 0a44 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - 0a45 1106 0a4e bloopi #0x06, 0x0a4e - 0a47 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0a48 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0a49 1485 asl $ACC0, #5 - 0a4a e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 0a4b 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 0a4c a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 0a4d 1585 asl $ACC1, #5 - 0a4e ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - 0a4f 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0a50 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0a51 1485 asl $ACC0, #5 - 0a52 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 0a53 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 0a54 a500 mulxac $AX0.L, $AX1.L, $ACC1 - 0a55 1585 asl $ACC1, #5 - 0a56 1b7f srri @$AR3, $AC1.M - 0a57 2e66 srs @0x0066, $AC0.M - 0a58 2f67 srs @0x0067, $AC1.M - 0a59 8e00 set16 - 0a5a 8900 clr $ACC1 - 0a5b 00df 0360 lr $AC1.M, @0x0360 - 0a5d 02df ret -} - -void 0a5e_Unk() { - 0a5e 0083 0520 lri $AR3, #0x0520 - 0a60 00de 0433 lr $AC0.M, @0x0433 - 0a62 1050 loopi #0x50 - 0a63 1b7e srri @$AR3, $AC0.M - 0a64 029f 056d jmp 0x056d - 0a66 0092 0004 lri $CR, #0x0004 - 0a68 2002 lrs $AX0.L, @0x0002 - 0a69 8100 clr $ACC0 - 0a6a 8900 clr $ACC1 - 0a6b 2430 lrs $AC0.L, @0x0030 - 0a6c 8d00 set15 - 0a6d 0099 0050 lri $AX1.L, #0x0050 - 0a6f a000 mulx $AX0.L, $AX1.L - 0a70 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0a71 1404 lsl $ACC0, #4 - 0a72 8c00 clr15 - 0a73 1ffe mrr $AC1.M, $AC0.M - 0a74 0083 0580 lri $AR3, #0x0580 - 0a76 2201 lrs $AX0.H, @0x0001 - 0a77 8600 tstaxh $AX0.H - 0a78 0294 0a89 jnz 0x0a89 - 0a7a 2204 lrs $AX0.H, @0x0004 - 0a7b 8600 tstaxh $AX0.H - 0a7c 02b4 0ad2 callne 0x0ad2 - 0a7e 8100 clr $ACC0 - 0a7f 2605 lrs $AC0.M, @0x0005 - 0a80 b100 tst $ACC0 - 0a81 0295 0a96 jz 0x0a96 - 0a83 8100 clr $ACC0 - 0a84 2e05 srs @0x0005, $AC0.M - 0a85 2281 lrs $AX0.H, @0xff81 - 0a86 8600 tstaxh $AX0.H - 0a87 0294 0a90 jnz 0x0a90 - 0a89 8100 clr $ACC0 - 0a8a 005f loop $AC1.M - 0a8b 1b7e srri @$AR3, $AC0.M - 0a8c 7400 incm $AC0.M - 0a8d 2e01 srs @0x0001, $AC0.M - 0a8e 029f 0ace jmp 0x0ace - 0a90 2688 lrs $AC0.M, @0xff88 - 0a91 2489 lrs $AC0.L, @0xff89 - 0a92 2e34 srs @0x0034, $AC0.M - 0a93 2c35 srs @0x0035, $AC0.L - 0a94 02bf 0ad5 call 0x0ad5 - 0a96 00ff 0360 sr @0x0360, $AC1.M - 0a98 2638 lrs $AC0.M, @0x0038 - 0a99 2439 lrs $AC0.L, @0x0039 - 0a9a 009f 0005 lri $AC1.M, #0x0005 - 0a9c 02bf 0103 call 0x0103 - 0a9e 0092 0004 lri $CR, #0x0004 - 0aa0 00df 0360 lr $AC1.M, @0x0360 - 0aa2 8100 clr $ACC0 - 0aa3 263a lrs $AC0.M, @0x003a - 0aa4 b100 tst $ACC0 - 0aa5 0294 0ab5 jnz 0x0ab5 - 0aa7 263b lrs $AC0.M, @0x003b - 0aa8 5c00 sub $ACC0, $AC1.L - 0aa9 0290 0ab5 jns 0x0ab5 - 0aab 223b lrs $AX0.H, @0x003b - 0aac 02bf 0ae6 call 0x0ae6 - 0aae 5500 subr $ACC1, $AX0.H - 0aaf 009a 0001 lri $AX0.H, #0x0001 - 0ab1 00fa 0405 sr @0x0405, $AX0.H - 0ab3 029f 0a83 jmp 0x0a83 - 0ab5 1f5f mrr $AX0.H, $AC1.M - 0ab6 02bf 0ae6 call 0x0ae6 - 0ab8 00fa 0362 sr @0x0362, $AX0.H - 0aba 8100 clr $ACC0 - 0abb 263a lrs $AC0.M, @0x003a - 0abc 243b lrs $AC0.L, @0x003b - 0abd 1570 lsr $ACC1, #-16 - 0abe 0a01 lris $AX0.H, #0x01 - 0abf 0081 0405 lri $AR1, #0x0405 - 0ac1 5c00 sub $ACC0, $AC1.L - 0ac2 b100 tst $ACC0 - 0ac3 0275 ifz - 0ac4 1a3a srr @$AR1, $AX0.H - 0ac5 2e3a srs @0x003a, $AC0.M - 0ac6 2c3b srs @0x003b, $AC0.L - 0ac7 2638 lrs $AC0.M, @0x0038 - 0ac8 2439 lrs $AC0.L, @0x0039 - 0ac9 00d8 0362 lr $AX0.L, @0x0362 - 0acb 7000 addaxl $ACC0, $AX0.L - 0acc 2c39 srs @0x0039, $AC0.L - 0acd 2e38 srs @0x0038, $AC0.M - 0ace 0092 00ff lri $CR, #0x00ff - 0ad0 029f 0565 jmp 0x0565 - 0ad2 8100 clr $ACC0 - 0ad3 2e34 srs @0x0034, $AC0.M - 0ad4 2e35 srs @0x0035, $AC0.M - 0ad5 2334 lrs $AX1.H, @0x0034 - 0ad6 2135 lrs $AX1.L, @0x0035 - 0ad7 268a lrs $AC0.M, @0xff8a - 0ad8 248b lrs $AC0.L, @0xff8b - 0ad9 5a00 subax $ACC0, $AX1.L - 0ada 2e3a srs @0x003a, $AC0.M - 0adb 2c3b srs @0x003b, $AC0.L - 0adc 2634 lrs $AC0.M, @0x0034 - 0add 2435 lrs $AC0.L, @0x0035 - 0ade 238c lrs $AX1.H, @0xff8c - 0adf 218d lrs $AX1.L, @0xff8d - 0ae0 4a00 addax $ACC0, $AX1.L - 0ae1 2e38 srs @0x0038, $AC0.M - 0ae2 2c39 srs @0x0039, $AC0.L - 0ae3 8100 clr $ACC0 - 0ae4 2e05 srs @0x0005, $AC0.M - 0ae5 02df ret -} - -void 0ae6_ConvSigned8bitToSigned16bit() { - 0ae6 0080 ffd3 lri $AR0, #0xffd3 - 0ae8 0084 0000 lri $IX0, #0x0000 - 0aea 007a 0aee bloop $AX0.H, 0x0aee - 0aec 199e lrrn $AC0.M, @$AR0 - 0aed 1488 asl $ACC0, #8 - 0aee 1b7e srri @$AR3, $AC0.M - 0aef 02df ret -} - -void 0af0_Unk() { - 0af0 009e ffff lri $AC0.M, #0xffff - 0af2 00fe 03f2 sr @0x03f2, $AC0.M - 0af4 8100 clr $ACC0 - 0af5 00fe 03f0 sr @0x03f0, $AC0.M - 0af7 00fe 03f6 sr @0x03f6, $AC0.M - 0af9 009e 0100 lri $AC0.M, #0x0100 - 0afb 00fe 03f7 sr @0x03f7, $AC0.M - 0afd 00da 03f7 lr $AX0.H, @0x03f7 - 0aff 009e 8000 lri $AC0.M, #0x8000 - 0b01 5400 subr $ACC0, $AX0.H - 0b02 00fe 03f5 sr @0x03f5, $AC0.M - 0b04 009e 0030 lri $AC0.M, #0x0030 - 0b06 00fe 03f3 sr @0x03f3, $AC0.M - 0b08 009e 0010 lri $AC0.M, #0x0010 - 0b0a 00fe 03f4 sr @0x03f4, $AC0.M - 0b0c 009e 0096 lri $AC0.M, #0x0096 - 0b0e 00fe 03f1 sr @0x03f1, $AC0.M - 0b10 02df ret -} - -void 0b11_Unk() { - 0b11 0080 0b00 lri $AR0, #0x0b00 - 0b13 8100 clr $ACC0 - 0b14 00de 03f0 lr $AC0.M, @0x03f0 - 0b16 8900 clr $ACC1 - 0b17 b100 tst $ACC0 - 0b18 0275 ifz - 0b19 0550 addis $ACC1, #0x50 - 0b1a 00ff 03f0 sr @0x03f0, $AC1.M - 0b1c 0200 0b60 addi $AC0.M, #0x0b60 - 0b1e 1c7e mrr $AR3, $AC0.M - 0b1f 009f 004e lri $AC1.M, #0x004e - 0b21 02bf 03ac call 0x03ac - 0b23 02df ret -} - -void 0b24_Unk() { - - 0b24 00de 03f1 lr $AC0.M, @0x03f1 - 0b26 0200 0b60 addi $AC0.M, #0x0b60 - 0b28 1c7e mrr $AR3, $AC0.M - 0b29 8100 clr $ACC0 - 0b2a 8900 clr $ACC1 - 0b2b 009f 00a0 lri $AC1.M, #0x00a0 - 0b2d 00de 03f1 lr $AC0.M, @0x03f1 - 0b2f 5d00 sub $ACC1, $AC0.L - 0b30 009e 0050 lri $AC0.M, #0x0050 - 0b32 0750 cmpis $ACC1, #0x50 - 0b33 0270 ifns - 0b34 5d00 sub $ACC1, $AC0.L - 0b35 00da 03f2 lr $AX0.H, @0x03f2 - 0b37 8600 tstaxh $AX0.H - 0b38 0290 0b56 jns 0x0b56 - 0b3a 00de 03f3 lr $AC0.M, @0x03f3 - 0b3c 5c00 sub $ACC0, $AC1.L - 0b3d 0293 0b41 jle 0x0b41 - 0b3f 029f 0b5b jmp 0x0b5b - 0b41 00db 03f7 lr $AX1.H, @0x03f7 - 0b43 009e 8000 lri $AC0.M, #0x8000 - 0b45 4600 addr $ACC0, $AX1.H - 0b46 029f 0b4d jmp 0x0b4d - 0b48 00db 03f7 lr $AX1.H, @0x03f7 - 0b4a 009e 8000 lri $AC0.M, #0x8000 - 0b4c 5600 subr $ACC0, $AX1.H - 0b4d 00fe 03f5 sr @0x03f5, $AC0.M - 0b4f 1fda mrr $AC0.M, $AX0.H - 0b50 7c00 neg $ACC0 - 0b51 1f5e mrr $AX0.H, $AC0.M - 0b52 00fe 03f2 sr @0x03f2, $AC0.M - 0b54 029f 0b5b jmp 0x0b5b - 0b56 00de 03f4 lr $AC0.M, @0x03f4 - 0b58 5d00 sub $ACC1, $AC0.L - 0b59 0293 0b48 jle 0x0b48 - 0b5b 8900 clr $ACC1 - 0b5c 00dd 03f5 lr $AC1.L, @0x03f5 - 0b5e 1501 lsl $ACC1, #1 - 0b5f 8100 clr $ACC0 - 0b60 00dc 03f6 lr $AC0.L, @0x03f6 - 0b62 008b 009f lri $WR3, #0x009f - 0b64 0080 0b00 lri $AR0, #0x0b00 - 0b66 0099 0000 lri $AX1.L, #0x0000 - 0b68 1150 0b6f bloopi #0x50, 0x0b6f - 0b6a 1878 lrr $AX0.L, @$AR3 - 0b6b 4c00 add $ACC0, $AC1.L - 0b6c 1cfe mrr $IX3, $AC0.M - 0b6d 001f addarn $AR3, $IX3 - 0b6e 1fd9 mrr $AC0.M, $AX1.L - 0b6f 1b18 srri @$AR0, $AX0.L - 0b70 009f 0b60 lri $AC1.M, #0x0b60 - 0b72 1fc3 mrr $AC0.M, $AR3 - 0b73 5c00 sub $ACC0, $AC1.L - 0b74 00fe 03f1 sr @0x03f1, $AC0.M - 0b76 00fc 03f6 sr @0x03f6, $AC0.L - 0b78 008b ffff lri $WR3, #0xffff - 0b7a 02df ret -} - -void 0b7b_Unk() { - 0b7b 009f 0050 lri $AC1.M, #0x0050 - 0b7d 0080 0b00 lri $AR0, #0x0b00 - 0b7f 0083 0d60 lri $AR3, #0x0d60 - 0b81 0098 3fff lri $AX0.L, #0x3fff - 0b83 02bf 03bd call 0x03bd - 0b85 009f 0050 lri $AC1.M, #0x0050 - 0b87 0080 0b00 lri $AR0, #0x0b00 - 0b89 0083 0d00 lri $AR3, #0x0d00 - 0b8b 0098 3fff lri $AX0.L, #0x3fff - 0b8d 02bf 03bd call 0x03bd - 0b8f 02df ret -} - -void 0b90_Unk() { - 0b90 8a00 m2 - 0b91 8f00 set40 - 0b92 8100 clr $ACC0 - 0b93 00de 0404 lr $AC0.M, @0x0404 - 0b95 b100 tst $ACC0 - 0b96 0295 0b9d jz 0x0b9d - 0b98 8100 clr $ACC0 - 0b99 00fe 0478 sr @0x0478, $AC0.M - 0b9b 00fe 0479 sr @0x0479, $AC0.M - 0b9d 00df 0479 lr $AC1.M, @0x0479 - 0b9f 00db 0478 lr $AX1.H, @0x0478 - 0ba1 0099 0000 lri $AX1.L, #0x0000 - 0ba3 0084 0000 lri $IX0, #0x0000 - 0ba5 1150 0bae bloopi #0x50, 0x0bae - 0ba7 199e lrrn $AC0.M, @$AR0 - 0ba8 5c7c sub'ln $ACC0, $AC1.L : $AC1.M, @$AR0 - 0ba9 c000 mulc $AC0.M, $AX0.H - 0baa 6e00 movp $ACC0 - 0bab 1488 asl $ACC0, #8 - 0bac 4a00 addax $ACC0, $AX1.L - 0bad 1b1e srri @$AR0, $AC0.M - 0bae 1f7e mrr $AX1.H, $AC0.M - 0baf 00fb 0478 sr @0x0478, $AX1.H - 0bb1 00ff 0479 sr @0x0479, $AC1.M - 0bb3 8b00 m0 - 0bb4 8e00 set16 - 0bb5 02df ret -} - -void 0bb6_Unk() { - 0bb6 0080 01be lri $AR0, #0x01be - 0bb8 1918 lrri $AX0.L, @$AR0 - 0bb9 191a lrri $AX0.H, @$AR0 - 0bba 0080 0180 lri $AR0, #0x0180 - 0bbc 0083 0180 lri $AR3, #0x0180 - 0bbe 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0bbf 1ffe mrr $AC1.M, $AC0.M - 0bc0 1120 0bc7 bloopi #0x20, 0x0bc7 - 0bc2 7c00 neg $ACC0 - 0bc3 d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0bc4 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0bc5 c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 0bc6 1501 lsl $ACC1, #1 - 0bc7 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - 0bc8 0080 01fe lri $AR0, #0x01fe - 0bca 191a lrri $AX0.H, @$AR0 - 0bcb 1918 lrri $AX0.L, @$AR0 - 0bcc 0080 01c0 lri $AR0, #0x01c0 - 0bce 0083 01c0 lri $AR3, #0x01c0 - 0bd0 1ff8 mrr $AC1.M, $AX0.L - 0bd1 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0bd2 f800 addpaxz $ACC0, $AX0.H - 0bd3 0240 01ff andi $AC0.M, #0x01ff - 0bd5 0260 2000 ori $AC0.M, #0x2000 - 0bd7 02bf 0bda call 0x0bda - 0bd9 02df ret -} - -void 0bda_Unk() { - 0bda b900 tst $ACC1 - 0bdb 0272 ifg - 0bdc 7c00 neg $ACC0 - 0bdd 1f7e mrr $AX1.H, $AC0.M - 0bde 4700 addr $ACC1, $AX1.H - 0bdf 1110 0be4 bloopi #0x10, 0x0be4 - 0be1 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0be2 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0be3 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0be4 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0be5 02df ret -} - -void 0be6_Nop() { - 0be6 0000 nop - 0be7 0000 nop - 0be8 0000 nop - 0be9 0000 nop - 0bea 0000 nop - 0beb 0000 nop - 0bec 0000 nop - 0bed 0000 nop - 0bee 0000 nop - 0bef 0000 nop -} \ No newline at end of file diff --git a/docs/DSP/DSP_UC_MP2.txt b/docs/DSP/DSP_UC_MP2.txt deleted file mode 100644 index a0eedb801f..0000000000 --- a/docs/DSP/DSP_UC_MP2.txt +++ /dev/null @@ -1,2875 +0,0 @@ -// A common version of AX, especially in early games. CR is set to #FF all the -// time in this ucode, so srs/lrs always operate on hw registers. - - 0000 0000 nop - 0001 0000 nop - 0002 029f 0e71 jmp 0x0e71 - 0004 029f 0e80 jmp 0x0e80 - 0006 029f 0e9c jmp 0x0e9c - 0008 029f 0ebc jmp 0x0ebc - 000a 029f 0ec2 jmp 0x0ec2 - 000c 029f 0ef4 jmp 0x0ef4 - 000e 029f 0efa jmp 0x0efa - -void 0010_Entry() { - 0010 1302 sbset #0x02 - 0011 1303 sbset #0x03 - 0012 1204 sbclr #0x04 - 0013 1305 sbset #0x05 - 0014 1306 sbset #0x06 - 0015 8e00 set16 - 0016 8c00 clr15 - 0017 8b00 m0 - 0018 0092 00ff lri $CR, #0x00ff - 001a 8100 clr $ACC0 - 001b 8900 clr $ACC1 - 001c 009e 0e80 lri $AC0.M, #0x0e80 - 001e 00fe 0e1b sr @0x0e1b, $AC0.M - 0020 8100 clr $ACC0 - 0021 00fe 0e31 sr @0x0e31, $AC0.M - 0023 16fc dcd1 si @DMBH, #0xdcd1 - 0025 16fd 0000 si @DMBL, #0x0000 - 0027 16fb 0001 si @DIRQ, #0x0001 - 0029 26fc lrs $AC0.M, @DMBH - 002a 02a0 8000 andf $AC0.M, #0x8000 - 002c 029c 0029 jlnz 0x0029 - 002e 029f 0045 jmp 0x0045 -} - -void 0030_Unk_Restart() { - 0030 1302 sbset #0x02 - 0031 1303 sbset #0x03 - 0032 1204 sbclr #0x04 - 0033 1305 sbset #0x05 - 0034 1306 sbset #0x06 - 0035 8e00 set16 - 0036 8c00 clr15 - 0037 8b00 m0 - 0038 0092 00ff lri $CR, #0x00ff - 003a 16fc dcd1 si @DMBH, #0xdcd1 - 003c 16fd 0001 si @DMBL, #0x0001 - 003e 16fb 0001 si @DIRQ, #0x0001 - - do { - // 0040 26fc lrs $AC0.M, @DMBH - // 0041 02a0 8000 andf $AC0.M, #0x8000 - // 0043 029c 0040 jlnz 0x0040 - } while (DMBH & 0x8000); - - 0045 8e00 set16 - 0046 8100 clr $ACC0 - 0047 8900 clr $ACC1 - 0048 009f babe lri $AC1.M, #0xbabe - - do { - // 004a 26fe lrs $AC0.M, @CMBH - // 004b 02c0 8000 andcf $AC0.M, #0x8000 - // 004d 029c 004a jlnz 0x004a - // 004f 8200 cmp - // 0050 0294 004a jnz 0x004a - } while (CMBH & 0x8000 && CMBH == 0xbabe); - - 0052 23ff lrs $AX1.H, @CMBL - 0053 8100 clr $ACC0 - do { - // 0054 26fe lrs $AC0.M, @CMBH - // 0055 02c0 8000 andcf $AC0.M, #0x8000 - // 0057 029c 0054 jlnz 0x0054 - } while (CMBH & 0x8000) - - 0059 27ff lrs $AC1.M, @CMBL - 005a 0240 7fff andi $AC0.M, #0x7fff - 005c 2ece srs @DSMAH, $AC0.M - 005d 2fcf srs @DSMAL, $AC1.M - 005e 16cd 0c00 si @DSPA, #0x0c00 - 0060 8100 clr $ACC0 - 0061 2ec9 srs @DSCR, $AC0.M - 0062 1ffb mrr $AC1.M, $AX1.H - 0063 2fcb srs @DSBL, $AC1.M - 0064 02bf 0652 call 0652_WaitDMA - - 0066 0080 0c00 lri $AR0, #0x0c00 - 0068 8e00 set16 - 0069 8100 clr $ACC0 - 006a 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 006b b100 tst $ACC0 - 006c 0291 007e jl 0x007e - 006e 0a13 lris $AX0.H, #0x13 - 006f c100 cmpar $ACC0, $AX0.H - 0070 0292 007e jg 0x007e - 0072 009f 0c86 lri $AC1.M, #0x0c86 - 0074 4c00 add $ACC0, $ACC1 - 0075 1c7e mrr $AR3, $AC0.M - 0076 0213 ilrr $AC0.M, @$AR3 - 0077 1c7e mrr $AR3, $AC0.M - 0078 176f jmpr $AR3 - - // Check for bad ucode mail - 0079 16fc fbad si @DMBH, #0xfbad - 007b 16fd 8080 si @DMBL, #0x8080 - 007d 0021 halt - - // Check for bad ucode mail - 007e 16fc baad si @DMBH, #0xbaad - 0080 2efd srs @DMBL, $AC0.M - - 0082 8d00 set15 - 0083 8f00 set40 - 0084 8a00 m2 - 0085 8900 clr $ACC1 - 0086 8168 clr'l $ACC0 : $AC1.L, @$AR0 - 0087 0098 0000 lri $AX0.L, #0x0000 - 0089 0099 0001 lri $AX1.L, #0x0001 - 008b 0081 0000 lri $AR1, #0x0000 - 008d 193e lrri $AC0.M, @$AR1 - 008e 193c lrri $AC0.L, @$AR1 - - // 008f 11a0 009a bloopi #0xa0, 0x009a - for (int i = 0; i < 0x140; i+=2) { - 0091 a100 tstaxl $ACC0 - 0092 8271 cmp'l : $AC0.M, @$AR1 - 0093 0277 ifc - 0094 1f19 mrr $AX0.L, $AX1.L - 0095 193c lrri $AC0.L, @$AR1 - 0096 a100 tstaxl $ACC0 - 0097 8271 cmp'l : $AC0.M, @$AR1 - 0098 0277 ifc - 0099 1f19 mrr $AX0.L, $AX1.L - 009a 193c lrri $AC0.L, @$AR1 - } - - 009b 1fd8 mrr $AC0.M, $AX0.L - 009c b100 tst $ACC0 - 009d 0294 00cb jnz 0x00cb - 009f 00de 0e44 lr $AC0.M, @0x0e44 - 00a1 b100 tst $ACC0 - 00a2 0294 00ab jnz 0x00ab - 00a4 191c lrri $AC0.L, @$AR0 - 00a5 191c lrri $AC0.L, @$AR0 - 00a6 191c lrri $AC0.L, @$AR0 - 00a7 00e0 0e45 sr @0x0e45, $AR0 - 00a9 029f 0114 jmp 0x0114 - 00ab 8b00 m0 - 00ac 7a00 dec $ACC0 - 00ad 00fe 0e44 sr @0x0e44, $AC0.M - 00af 8400 clrp - 00b0 0099 0140 lri $AX1.L, #0x0140 - 00b2 1f1e mrr $AX0.L, $AC0.M - 00b3 a000 mulx $AX0.L, $AX1.L - 00b4 191e lrri $AC0.M, @$AR0 - 00b5 191e lrri $AC0.M, @$AR0 - 00b6 191c lrri $AC0.L, @$AR0 - 00b7 00e0 0e45 sr @0x0e45, $AR0 - 00b9 009a 0000 lri $AX0.H, #0x0000 - 00bb 0098 0dc0 lri $AX0.L, #0x0dc0 - 00bd 4e00 addp $ACC0 - 00be 4800 addax $ACC0, $AX0.L - 00bf 2ece srs @DSMAH, $AC0.M - 00c0 2ccf srs @DSMAL, $AC0.L - 00c1 009e 0e48 lri $AC0.M, #0x0e48 - 00c3 2ecd srs @DSPA, $AC0.M - 00c4 0e00 lris $AC0.M, #0x00 - 00c5 2ec9 srs @DSCR, $AC0.M - 00c6 009e 0140 lri $AC0.M, #0x0140 - 00c8 2ecb srs @DSBL, $AC0.M - 00c9 029f 00e3 jmp 0x00e3 - - 00cb 8b00 m0 - 00cc 00d8 0e44 lr $AX0.L, @0x0e44 - 00ce 0099 0140 lri $AX1.L, #0x0140 - 00d0 a000 mulx $AX0.L, $AX1.L - 00d1 191e lrri $AC0.M, @$AR0 - 00d2 00fe 0e44 sr @0x0e44, $AC0.M - 00d4 191e lrri $AC0.M, @$AR0 - 00d5 191c lrri $AC0.L, @$AR0 - 00d6 00e0 0e45 sr @0x0e45, $AR0 - 00d8 4e00 addp $ACC0 - 00d9 2ece srs @DSMAH, $AC0.M - 00da 2ccf srs @DSMAL, $AC0.L - 00db 009e 0e48 lri $AC0.M, #0x0e48 - 00dd 2ecd srs @DSPA, $AC0.M - 00de 0e00 lris $AC0.M, #0x00 - 00df 2ec9 srs @DSCR, $AC0.M - 00e0 009e 0140 lri $AC0.M, #0x0140 - 00e2 2ecb srs @DSBL, $AC0.M - 00e3 02bf 0652 call 0652_WaitDMA - 00e5 8a48 m2'l : $AX1.L, @$AR0 - 00e6 0083 0e48 lri $AR3, #0x0e48 - 00e8 0080 0000 lri $AR0, #0x0000 - 00ea 0081 0000 lri $AR1, #0x0000 - 00ec 1979 lrri $AX1.L, @$AR3 - 00ed 193a lrri $AX0.H, @$AR1 - 00ee b041 mulx'l $AX0.H, $AX1.L : $AX0.L, @$AR1 - 00ef a64b mulxmv'l $AX0.L, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 00f0 f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 00f1 b441 mulxac'l $AX0.H, $AX1.L, $ACC0 : $AX0.L, @$AR1 - 00f2 9100 asr16 $ACC0 - 00f3 1150 00fc bloopi #0x50, 0x00fc - 00f5 a792 mulxmv'sl $AX0.L, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 00f6 f151 lsl16'l $ACC1 : $AX0.H, @$AR1 - 00f7 b520 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR0, $AC0.L - 00f8 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 00f9 a693 mulxmv'sl $AX0.L, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 00fa f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 00fb b428 mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC1.L - 00fc 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 00fd 0083 0e48 lri $AR3, #0x0e48 - 00ff 0080 0140 lri $AR0, #0x0140 - 0101 0081 0140 lri $AR1, #0x0140 - 0103 1979 lrri $AX1.L, @$AR3 - 0104 193a lrri $AX0.H, @$AR1 - 0105 b041 mulx'l $AX0.H, $AX1.L : $AX0.L, @$AR1 - 0106 a64b mulxmv'l $AX0.L, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 0107 f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 0108 b441 mulxac'l $AX0.H, $AX1.L, $ACC0 : $AX0.L, @$AR1 - 0109 9100 asr16 $ACC0 - 010a 1150 0113 bloopi #0x50, 0x0113 - 010c a792 mulxmv'sl $AX0.L, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 010d f151 lsl16'l $ACC1 : $AX0.H, @$AR1 - 010e b520 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR0, $AC0.L - 010f 9941 asr16'l $ACC1 : $AX0.L, @$AR1 - 0110 a693 mulxmv'sl $AX0.L, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 0111 f051 lsl16'l $ACC0 : $AX0.H, @$AR1 - 0112 b428 mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC1.L - 0113 9141 asr16'l $ACC0 : $AX0.L, @$AR1 - 0114 00c0 0e45 lr $AR0, @0x0e45 - 0116 029f 0068 jmp 0x0068 - 0118 8100 clr $ACC0 - 0119 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 011a 8e78 set16'l : $AC1.M, @$AR0 - 011b 2ece srs @DSMAH, $AC0.M - 011c 2fcf srs @DSMAL, $AC1.M - 011d 009e 0e48 lri $AC0.M, #0x0e48 - 011f 2ecd srs @DSPA, $AC0.M - 0120 0e00 lris $AC0.M, #0x00 - 0121 2ec9 srs @DSCR, $AC0.M - 0122 009e 0040 lri $AC0.M, #0x0040 - 0124 2ecb srs @DSBL, $AC0.M - 0125 0081 0e48 lri $AR1, #0x0e48 - 0127 0082 0000 lri $AR2, #0x0000 - 0129 009b 009f lri $AX1.H, #0x009f - 012b 009a 0140 lri $AX0.H, #0x0140 - 012d 8100 clr $ACC0 - 012e 8900 clr $ACC1 - 012f 8f00 set40 - 0130 02bf 0652 call 0652_WaitDMA - 0132 193e lrri $AC0.M, @$AR1 - 0133 193c lrri $AC0.L, @$AR1 - 0134 b100 tst $ACC0 - 0135 193f lrri $AC1.M, @$AR1 - 0136 0294 013c jnz 0x013c - 0138 005a loop $AX0.H - 0139 1b5e srri @$AR2, $AC0.M - 013a 029f 0144 jmp 0x0144 - 013c 9900 asr16 $ACC1 - 013d 1b5e srri @$AR2, $AC0.M - 013e 1b5c srri @$AR2, $AC0.L - 013f 007b 0143 bloop $AX1.H, 0x0143 - 0141 4c00 add $ACC0, $ACC1 - 0142 1b5e srri @$AR2, $AC0.M - 0143 1b5c srri @$AR2, $AC0.L - 0144 193e lrri $AC0.M, @$AR1 - 0145 193c lrri $AC0.L, @$AR1 - 0146 b100 tst $ACC0 - 0147 193f lrri $AC1.M, @$AR1 - 0148 0294 014e jnz 0x014e - 014a 005a loop $AX0.H - 014b 1b5e srri @$AR2, $AC0.M - 014c 029f 0156 jmp 0x0156 - 014e 9900 asr16 $ACC1 - 014f 1b5e srri @$AR2, $AC0.M - 0150 1b5c srri @$AR2, $AC0.L - 0151 007b 0155 bloop $AX1.H, 0x0155 - 0153 4c00 add $ACC0, $ACC1 - 0154 1b5e srri @$AR2, $AC0.M - 0155 1b5c srri @$AR2, $AC0.L - 0156 193e lrri $AC0.M, @$AR1 - 0157 193c lrri $AC0.L, @$AR1 - 0158 b100 tst $ACC0 - 0159 193f lrri $AC1.M, @$AR1 - 015a 0294 0160 jnz 0x0160 - 015c 005a loop $AX0.H - 015d 1b5e srri @$AR2, $AC0.M - 015e 029f 0168 jmp 0x0168 - 0160 9900 asr16 $ACC1 - 0161 1b5e srri @$AR2, $AC0.M - 0162 1b5c srri @$AR2, $AC0.L - 0163 007b 0167 bloop $AX1.H, 0x0167 - 0165 4c00 add $ACC0, $ACC1 - 0166 1b5e srri @$AR2, $AC0.M - 0167 1b5c srri @$AR2, $AC0.L - 0168 0082 0400 lri $AR2, #0x0400 - 016a 193e lrri $AC0.M, @$AR1 - 016b 193c lrri $AC0.L, @$AR1 - 016c b179 tst'l $ACC0 : $AC1.M, @$AR1 - 016d 0294 0173 jnz 0x0173 - 016f 005a loop $AX0.H - 0170 1b5e srri @$AR2, $AC0.M - 0171 029f 017b jmp 0x017b - 0173 9900 asr16 $ACC1 - 0174 1b5e srri @$AR2, $AC0.M - 0175 1b5c srri @$AR2, $AC0.L - 0176 007b 017a bloop $AX1.H, 0x017a - 0178 4c00 add $ACC0, $ACC1 - 0179 1b5e srri @$AR2, $AC0.M - 017a 1b5c srri @$AR2, $AC0.L - 017b 193e lrri $AC0.M, @$AR1 - 017c 193c lrri $AC0.L, @$AR1 - 017d b179 tst'l $ACC0 : $AC1.M, @$AR1 - 017e 0294 0184 jnz 0x0184 - 0180 005a loop $AX0.H - 0181 1b5e srri @$AR2, $AC0.M - 0182 029f 018c jmp 0x018c - 0184 9900 asr16 $ACC1 - 0185 1b5e srri @$AR2, $AC0.M - 0186 1b5c srri @$AR2, $AC0.L - 0187 007b 018b bloop $AX1.H, 0x018b - 0189 4c00 add $ACC0, $ACC1 - 018a 1b5e srri @$AR2, $AC0.M - 018b 1b5c srri @$AR2, $AC0.L - 018c 193e lrri $AC0.M, @$AR1 - 018d 193c lrri $AC0.L, @$AR1 - 018e b179 tst'l $ACC0 : $AC1.M, @$AR1 - 018f 0294 0195 jnz 0x0195 - 0191 005a loop $AX0.H - 0192 1b5e srri @$AR2, $AC0.M - 0193 029f 019d jmp 0x019d - 0195 9900 asr16 $ACC1 - 0196 1b5e srri @$AR2, $AC0.M - 0197 1b5c srri @$AR2, $AC0.L - 0198 007b 019c bloop $AX1.H, 0x019c - 019a 4c00 add $ACC0, $ACC1 - 019b 1b5e srri @$AR2, $AC0.M - 019c 1b5c srri @$AR2, $AC0.L - 019d 0082 07c0 lri $AR2, #0x07c0 - 019f 193e lrri $AC0.M, @$AR1 - 01a0 193c lrri $AC0.L, @$AR1 - 01a1 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01a2 0294 01a8 jnz 0x01a8 - 01a4 005a loop $AX0.H - 01a5 1b5e srri @$AR2, $AC0.M - 01a6 029f 01b0 jmp 0x01b0 - 01a8 9900 asr16 $ACC1 - 01a9 1b5e srri @$AR2, $AC0.M - 01aa 1b5c srri @$AR2, $AC0.L - 01ab 007b 01af bloop $AX1.H, 0x01af - 01ad 4c00 add $ACC0, $ACC1 - 01ae 1b5e srri @$AR2, $AC0.M - 01af 1b5c srri @$AR2, $AC0.L - 01b0 193e lrri $AC0.M, @$AR1 - 01b1 193c lrri $AC0.L, @$AR1 - 01b2 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01b3 0294 01b9 jnz 0x01b9 - 01b5 005a loop $AX0.H - 01b6 1b5e srri @$AR2, $AC0.M - 01b7 029f 01c1 jmp 0x01c1 - 01b9 9900 asr16 $ACC1 - 01ba 1b5e srri @$AR2, $AC0.M - 01bb 1b5c srri @$AR2, $AC0.L - 01bc 007b 01c0 bloop $AX1.H, 0x01c0 - 01be 4c00 add $ACC0, $ACC1 - 01bf 1b5e srri @$AR2, $AC0.M - 01c0 1b5c srri @$AR2, $AC0.L - 01c1 193e lrri $AC0.M, @$AR1 - 01c2 193c lrri $AC0.L, @$AR1 - 01c3 b179 tst'l $ACC0 : $AC1.M, @$AR1 - 01c4 0294 01ca jnz 0x01ca - 01c6 005a loop $AX0.H - 01c7 1b5e srri @$AR2, $AC0.M - 01c8 029f 01d2 jmp 0x01d2 - 01ca 9900 asr16 $ACC1 - 01cb 1b5e srri @$AR2, $AC0.M - 01cc 1b5c srri @$AR2, $AC0.L - 01cd 007b 01d1 bloop $AX1.H, 0x01d1 - 01cf 4c00 add $ACC0, $ACC1 - 01d0 1b5e srri @$AR2, $AC0.M - 01d1 1b5c srri @$AR2, $AC0.L - 01d2 029f 0068 jmp 0x0068 - 01d4 0085 ffff lri $IX1, #0xffff - 01d6 8150 clr'l $ACC0 : $AX0.H, @$AR0 - 01d7 8940 clr'l $ACC1 : $AX0.L, @$AR0 - 01d8 8e48 set16'l : $AX1.L, @$AR0 - 01d9 00fa 0e17 sr @0x0e17, $AX0.H - 01db 00f8 0e18 sr @0x0e18, $AX0.L - 01dd 0081 0000 lri $AR1, #0x0000 - 01df 02bf 05e7 call 0x05e7 - 01e1 00da 0e17 lr $AX0.H, @0x0e17 - 01e3 00d8 0e18 lr $AX0.L, @0x0e18 - 01e5 8948 clr'l $ACC1 : $AX1.L, @$AR0 - 01e6 0081 0400 lri $AR1, #0x0400 - 01e8 02bf 05e7 call 0x05e7 - 01ea 00da 0e17 lr $AX0.H, @0x0e17 - 01ec 00d8 0e18 lr $AX0.L, @0x0e18 - 01ee 8948 clr'l $ACC1 : $AX1.L, @$AR0 - 01ef 0081 07c0 lri $AR1, #0x07c0 - 01f1 02bf 05e7 call 0x05e7 - 01f3 029f 0068 jmp 0x0068 - 01f5 0086 07c0 lri $IX2, #0x07c0 - 01f7 02bf 057a call 0x057a - 01f9 029f 0068 jmp 0x0068 - 01fb 8100 clr $ACC0 - 01fc 8e00 set16 - 01fd 191e lrri $AC0.M, @$AR0 - 01fe 191c lrri $AC0.L, @$AR0 - 01ff 2ece srs @DSMAH, $AC0.M - 0200 2ccf srs @DSMAL, $AC0.L - 0201 16cd 0000 si @DSPA, #0x0000 - 0203 16c9 0001 si @DSCR, #0x0001 - 0205 16cb 0780 si @DSBL, #0x0780 - 0207 02bf 0652 call 0652_WaitDMA - 0209 029f 0068 jmp 0x0068 - 020b 8100 clr $ACC0 - 020c 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 020d 8e60 set16'l : $AC0.L, @$AR0 - 020e 2ece srs @DSMAH, $AC0.M - 020f 2ccf srs @DSMAL, $AC0.L - 0210 16cd 0e48 si @DSPA, #0x0e48 - 0212 16c9 0000 si @DSCR, #0x0000 - 0214 8900 clr $ACC1 - 0215 0d20 lris $AC1.L, #0x20 - 0216 2dcb srs @DSBL, $AC1.L - 0217 4c00 add $ACC0, $ACC1 - 0218 1c80 mrr $IX0, $AR0 - 0219 0080 0280 lri $AR0, #0x0280 - 021b 0081 0000 lri $AR1, #0x0000 - 021d 0082 0140 lri $AR2, #0x0140 - 021f 0083 0e48 lri $AR3, #0x0e48 - 0221 0a00 lris $AX0.H, #0x00 - 0222 27c9 lrs $AC1.M, @DSCR - 0223 03a0 0004 andf $AC1.M, #0x0004 - 0225 029c 0222 jlnz 0x0222 - 0227 2ece srs @DSMAH, $AC0.M - 0228 2ccf srs @DSMAL, $AC0.L - 0229 16cd 0e58 si @DSPA, #0x0e58 - 022b 16c9 0000 si @DSCR, #0x0000 - 022d 16cb 0260 si @DSBL, #0x0260 - 022f 009f 00a0 lri $AC1.M, #0x00a0 - 0231 8f00 set40 - 0232 007f 023b bloop $AC1.M, 0x023b - 0234 197e lrri $AC0.M, @$AR3 - 0235 1b1a srri @$AR0, $AX0.H - 0236 197c lrri $AC0.L, @$AR3 - 0237 1b1a srri @$AR0, $AX0.H - 0238 1b5e srri @$AR2, $AC0.M - 0239 7c22 neg's $ACC0 : @$AR2, $AC0.L - 023a 1b3e srri @$AR1, $AC0.M - 023b 1b3c srri @$AR1, $AC0.L - 023c 1c04 mrr $AR0, $IX0 - 023d 029f 0068 jmp 0x0068 - 023f 8e70 set16'l : $AC0.M, @$AR0 - 0240 8960 clr'l $ACC1 : $AC0.L, @$AR0 - 0241 191f lrri $AC1.M, @$AR0 - 0242 2ece srs @DSMAH, $AC0.M - 0243 2ccf srs @DSMAL, $AC0.L - 0244 16cd 0c00 si @DSPA, #0x0c00 - 0246 16c9 0000 si @DSCR, #0x0000 - 0248 0503 addis $ACC1, #0x03 - 0249 0340 fff0 andi $AC1.M, #0xfff0 - 024b 2fcb srs @DSBL, $AC1.M - 024c 02bf 0652 call 0652_WaitDMA - 024e 0080 0c00 lri $AR0, #0x0c00 - 0250 029f 0068 jmp 0x0068 - 0252 8100 clr $ACC0 - 0253 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0254 8e78 set16'l : $AC1.M, @$AR0 - 0255 2ece srs @DSMAH, $AC0.M - 0256 2fcf srs @DSMAL, $AC1.M - 0257 16cd 0b80 si @DSPA, #0x0b80 - 0259 16c9 0000 si @DSCR, #0x0000 - 025b 16cb 00c4 si @DSBL, #0x00c4 - 025d 0082 0e08 lri $AR2, #0x0e08 - 025f 009f 0000 lri $AC1.M, #0x0000 - 0261 1b5f srri @$AR2, $AC1.M - 0262 009f 0140 lri $AC1.M, #0x0140 - 0264 1b5f srri @$AR2, $AC1.M - 0265 009f 0280 lri $AC1.M, #0x0280 - 0267 1b5f srri @$AR2, $AC1.M - 0268 009f 0400 lri $AC1.M, #0x0400 - 026a 1b5f srri @$AR2, $AC1.M - 026b 009f 0540 lri $AC1.M, #0x0540 - 026d 1b5f srri @$AR2, $AC1.M - 026e 009f 0680 lri $AC1.M, #0x0680 - 0270 1b5f srri @$AR2, $AC1.M - 0271 009f 07c0 lri $AC1.M, #0x07c0 - 0273 1b5f srri @$AR2, $AC1.M - 0274 009f 0900 lri $AC1.M, #0x0900 - 0276 1b5f srri @$AR2, $AC1.M - 0277 009f 0a40 lri $AC1.M, #0x0a40 - 0279 1b5f srri @$AR2, $AC1.M - 027a 02bf 0652 call 0652_WaitDMA - 027c 00de 0ba7 lr $AC0.M, @0x0ba7 - 027e 00df 0ba8 lr $AC1.M, @0x0ba8 - 0280 2ece srs @DSMAH, $AC0.M - 0281 2fcf srs @DSMAL, $AC1.M - 0282 16cd 03c0 si @DSPA, #0x03c0 - 0284 16c9 0000 si @DSCR, #0x0000 - 0286 16cb 0080 si @DSBL, #0x0080 - 0288 8100 clr $ACC0 - 0289 8900 clr $ACC1 - 028a 00de 0b84 lr $AC0.M, @0x0b84 - 028c 009f 0d0a lri $AC1.M, #0x0d0a - 028e 4c00 add $ACC0, $ACC1 - 028f 1c7e mrr $AR3, $AC0.M - 0290 0213 ilrr $AC0.M, @$AR3 - 0291 00fe 0e15 sr @0x0e15, $AC0.M - 0293 00de 0b85 lr $AC0.M, @0x0b85 - 0295 009f 0d0d lri $AC1.M, #0x0d0d - 0297 4c00 add $ACC0, $ACC1 - 0298 1c7e mrr $AR3, $AC0.M - 0299 0213 ilrr $AC0.M, @$AR3 - 029a 00fe 0e16 sr @0x0e16, $AC0.M - 029c 00de 0b86 lr $AC0.M, @0x0b86 - 029e 009a 000f lri $AX0.H, #0x000f - 02a0 009f 0c9a lri $AC1.M, #0x0c9a - 02a2 3400 andr $AC0.M, $AX0.H - 02a3 4c00 add $ACC0, $ACC1 - 02a4 1c7e mrr $AR3, $AC0.M - 02a5 0213 ilrr $AC0.M, @$AR3 - 02a6 00fe 0e14 sr @0x0e14, $AC0.M - 02a8 00de 0b86 lr $AC0.M, @0x0b86 - 02aa 009a 001f lri $AX0.H, #0x001f - 02ac 009f 0caa lri $AC1.M, #0x0caa - 02ae 14fc asr $ACC0, #-4 - 02af 3400 andr $AC0.M, $AX0.H - 02b0 4c00 add $ACC0, $ACC1 - 02b1 1c7e mrr $AR3, $AC0.M - 02b2 0213 ilrr $AC0.M, @$AR3 - 02b3 00fe 0e46 sr @0x0e46, $AC0.M - 02b5 00de 0b86 lr $AC0.M, @0x0b86 - 02b7 009f 0cca lri $AC1.M, #0x0cca - 02b9 14f7 asr $ACC0, #-9 - 02ba 4c00 add $ACC0, $ACC1 - 02bb 1c7e mrr $AR3, $AC0.M - 02bc 0213 ilrr $AC0.M, @$AR3 - 02bd 00fe 0e47 sr @0x0e47, $AC0.M - 02bf 8100 clr $ACC0 - 02c0 00de 0b9b lr $AC0.M, @0x0b9b - 02c2 b100 tst $ACC0 - 02c3 0295 02ea jz 0x02ea - 02c5 8900 clr $ACC1 - 02c6 00df 0b9e lr $AC1.M, @0x0b9e - 02c8 0300 0cc0 addi $AC1.M, #0x0cc0 - 02ca 00ff 0e40 sr @0x0e40, $AC1.M - 02cc 00df 0b9f lr $AC1.M, @0x0b9f - 02ce 0300 0cc0 addi $AC1.M, #0x0cc0 - 02d0 00ff 0e41 sr @0x0e41, $AC1.M - 02d2 009f 0ce0 lri $AC1.M, #0x0ce0 - 02d4 00ff 0e42 sr @0x0e42, $AC1.M - 02d6 00ff 0e43 sr @0x0e43, $AC1.M - 02d8 02bf 0652 call 0652_WaitDMA - 02da 00de 0b9c lr $AC0.M, @0x0b9c - 02dc 2ece srs @DSMAH, $AC0.M - 02dd 00de 0b9d lr $AC0.M, @0x0b9d - 02df 2ecf srs @DSMAL, $AC0.M - 02e0 16cd 0cc0 si @DSPA, #0x0cc0 - 02e2 16c9 0000 si @DSCR, #0x0000 - 02e4 16cb 0040 si @DSBL, #0x0040 - 02e6 02bf 0652 call 0652_WaitDMA - 02e8 029f 0068 jmp 0x0068 - 02ea 009f 0ce0 lri $AC1.M, #0x0ce0 - 02ec 00ff 0e42 sr @0x0e42, $AC1.M - 02ee 00ff 0e40 sr @0x0e40, $AC1.M - 02f0 00ff 0e41 sr @0x0e41, $AC1.M - 02f2 00ff 0e43 sr @0x0e43, $AC1.M - 02f4 02bf 0652 call 0652_WaitDMA - 02f6 029f 0068 jmp 0x0068 - 02f8 8e00 set16 - 02f9 00e0 0e07 sr @0x0e07, $AR0 - 02fb 0080 0ba2 lri $AR0, #0x0ba2 - 02fd 0081 03c0 lri $AR1, #0x03c0 - 02ff 0e05 lris $AC0.M, #0x05 - 0300 00fe 0e04 sr @0x0e04, $AC0.M - 0302 8900 clr $ACC1 - 0303 8150 clr'l $ACC0 : $AX0.H, @$AR0 - 0304 009f 0b80 lri $AC1.M, #0x0b80 - 0306 007a 030b bloop $AX0.H, 0x030b - 0308 193e lrri $AC0.M, @$AR1 - 0309 4c49 add'l $ACC0, $ACC1 : $AX1.L, @$AR1 - 030a 1c5e mrr $AR2, $AC0.M - 030b 1a59 srr @$AR2, $AX1.L - 030c 0083 0e05 lri $AR3, #0x0e05 - 030e 1b61 srri @$AR3, $AR1 - 030f 1b60 srri @$AR3, $AR0 - 0310 00de 0b87 lr $AC0.M, @0x0b87 - 0312 0601 cmpis $ACC0, #0x01 - 0313 0295 0317 jz 0x0317 - 0315 029f 040e jmp 0x040e - 0317 00de 0e42 lr $AC0.M, @0x0e42 - 0319 00fe 0e1c sr @0x0e1c, $AC0.M - 031b 00c3 0e15 lr $AR3, @0x0e15 - 031d 177f callr $AR3 - 031e 8e00 set16 - 031f 8a00 m2 - 0320 8100 clr $ACC0 - 0321 8900 clr $ACC1 - 0322 00de 0bb3 lr $AC0.M, @0x0bb3 - 0324 00df 0bb2 lr $AC1.M, @0x0bb2 - 0326 1f1f mrr $AX0.L, $AC1.M - 0327 4d00 add $ACC1, $ACC0 - 0328 1481 asl $ACC0, #1 - 0329 8d1e set15'mv : $AX1.H, $AC0.M - 032a 1fd8 mrr $AC0.M, $AX0.L - 032b 0098 8000 lri $AX0.L, #0x8000 - 032d 0080 0e48 lri $AR0, #0x0e48 - 032f a830 mulx's $AX0.L, $AX1.H : @$AR0, $AC0.M - 0330 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0331 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0332 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0333 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0334 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0335 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0336 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0337 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0338 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0339 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 033a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 033b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 033c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 033d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 033e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 033f ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0340 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0341 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0342 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0343 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0344 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0345 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0346 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0347 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 0348 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 0349 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 034a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 034b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 034c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 034d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M - 034e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M - 034f 00fe 0bb2 sr @0x0bb2, $AC0.M - 0351 8f00 set40 - 0352 0080 0e48 lri $AR0, #0x0e48 - 0354 00c1 0e43 lr $AR1, @0x0e43 - 0356 1c61 mrr $AR3, $AR1 - 0357 193a lrri $AX0.H, @$AR1 - 0358 1918 lrri $AX0.L, @$AR0 - 0359 9059 mul'l $AX0.L, $AX0.H : $AX1.H, @$AR1 - 035a 1919 lrri $AX1.L, @$AR0 - 035b 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 035c 8080 nx'ls : $AX0.L, $AC0.M - 035d 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 035e 8091 nx'ls : $AX1.L, $AC1.M - 035f 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0360 8080 nx'ls : $AX0.L, $AC0.M - 0361 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0362 8091 nx'ls : $AX1.L, $AC1.M - 0363 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0364 8080 nx'ls : $AX0.L, $AC0.M - 0365 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0366 8091 nx'ls : $AX1.L, $AC1.M - 0367 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0368 8080 nx'ls : $AX0.L, $AC0.M - 0369 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 036a 8091 nx'ls : $AX1.L, $AC1.M - 036b 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 036c 8080 nx'ls : $AX0.L, $AC0.M - 036d 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 036e 8091 nx'ls : $AX1.L, $AC1.M - 036f 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0370 8080 nx'ls : $AX0.L, $AC0.M - 0371 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0372 8091 nx'ls : $AX1.L, $AC1.M - 0373 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0374 8080 nx'ls : $AX0.L, $AC0.M - 0375 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0376 8091 nx'ls : $AX1.L, $AC1.M - 0377 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0378 8080 nx'ls : $AX0.L, $AC0.M - 0379 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 037a 8091 nx'ls : $AX1.L, $AC1.M - 037b 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 037c 8080 nx'ls : $AX0.L, $AC0.M - 037d 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 037e 8091 nx'ls : $AX1.L, $AC1.M - 037f 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0380 8080 nx'ls : $AX0.L, $AC0.M - 0381 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0382 8091 nx'ls : $AX1.L, $AC1.M - 0383 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0384 8080 nx'ls : $AX0.L, $AC0.M - 0385 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0386 8091 nx'ls : $AX1.L, $AC1.M - 0387 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0388 8080 nx'ls : $AX0.L, $AC0.M - 0389 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 038a 8091 nx'ls : $AX1.L, $AC1.M - 038b 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 038c 8080 nx'ls : $AX0.L, $AC0.M - 038d 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 038e 8091 nx'ls : $AX1.L, $AC1.M - 038f 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0390 8080 nx'ls : $AX0.L, $AC0.M - 0391 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0392 8091 nx'ls : $AX1.L, $AC1.M - 0393 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1 - 0394 8080 nx'ls : $AX0.L, $AC0.M - 0395 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1 - 0396 8091 nx'ls : $AX1.L, $AC1.M - 0397 9e00 mulmv $AX1.L, $AX1.H, $ACC0 - 0398 6f33 movp's $ACC1 : @$AR3, $AC0.M - 0399 1b7f srri @$AR3, $AC1.M - 039a 8100 clr $ACC0 - 039b 00de 0bdd lr $AC0.M, @0x0bdd - 039d b100 tst $ACC0 - 039e 0295 03c0 jz 0x03c0 - 03a0 8d00 set15 - 03a1 8f00 set40 - 03a2 8a00 m2 - 03a3 00c0 0e43 lr $AR0, @0x0e43 - 03a5 00c1 0e43 lr $AR1, @0x0e43 - 03a7 0083 0bdf lri $AR3, #0x0bdf - 03a9 0087 ffff lri $IX3, #0xffff - 03ab 00de 0bde lr $AC0.M, @0x0bde - 03ad 80e1 nx'ld : $AX0.H, $AX1.L, @$AR1 - 03ae b04f mulx'ln $AX0.H, $AX1.L : $AX1.L, @$AR3 - 03af 1f5e mrr $AX0.H, $AC0.M - 03b0 e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 03b1 b64f mulxmv'ln $AX0.H, $AX1.L, $ACC0 : $AX1.L, @$AR3 - 03b2 1f5e mrr $AX0.H, $AC0.M - 03b3 e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 03b4 110f 03bb bloopi #0x0f, 0x03bb - 03b6 b79a mulxmv'slm $AX0.H, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 03b7 1f5f mrr $AX0.H, $AC1.M - 03b8 e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 03b9 b69b mulxmv'slm $AX0.H, $AX1.L, $ACC0 : $AC1.M, $AX1.L - 03ba 1f5e mrr $AX0.H, $AC0.M - 03bb e2e1 maddx'ld $AX0.H, $AX1.L : $AX0.H, $AX1.L, @$AR1 - 03bc b79a mulxmv'slm $AX0.H, $AX1.L, $ACC1 : $AC0.M, $AX1.L - 03bd 1b1f srri @$AR0, $AC1.M - 03be 00ff 0bde sr @0x0bde, $AC1.M - 03c0 00c3 0e14 lr $AR3, @0x0e14 - 03c2 8a00 m2 - 03c3 177f callr $AR3 - 03c4 00c3 0e46 lr $AR3, @0x0e46 - 03c6 8a00 m2 - 03c7 177f callr $AR3 - 03c8 00c3 0e47 lr $AR3, @0x0e47 - 03ca 8a00 m2 - 03cb 177f callr $AR3 - 03cc 8100 clr $ACC0 - 03cd 00de 0b9b lr $AC0.M, @0x0b9b - 03cf b100 tst $ACC0 - 03d0 0295 0406 jz 0x0406 - 03d2 00de 0e42 lr $AC0.M, @0x0e42 - 03d4 00fe 0e43 sr @0x0e43, $AC0.M - 03d6 8100 clr $ACC0 - 03d7 8900 clr $ACC1 - 03d8 00de 0b9e lr $AC0.M, @0x0b9e - 03da 00df 0ba0 lr $AC1.M, @0x0ba0 - 03dc 8200 cmp - 03dd 0293 03e2 jle 0x03e2 - 03df 7800 decm $AC0.M - 03e0 029f 03e5 jmp 0x03e5 - 03e2 0295 03e5 jz 0x03e5 - 03e4 7400 incm $AC0.M - 03e5 00fe 0b9e sr @0x0b9e, $AC0.M - 03e7 00df 0e43 lr $AC1.M, @0x0e43 - 03e9 05e0 addis $ACC1, #0xe0 - 03ea 4c00 add $ACC0, $ACC1 - 03eb 00fe 0e40 sr @0x0e40, $AC0.M - 03ed 8100 clr $ACC0 - 03ee 8900 clr $ACC1 - 03ef 00de 0b9f lr $AC0.M, @0x0b9f - 03f1 00df 0ba1 lr $AC1.M, @0x0ba1 - 03f3 8200 cmp - 03f4 0293 03f9 jle 0x03f9 - 03f6 7800 decm $AC0.M - 03f7 029f 03fc jmp 0x03fc - 03f9 0295 03fc jz 0x03fc - 03fb 7400 incm $AC0.M - 03fc 00fe 0b9f sr @0x0b9f, $AC0.M - 03fe 00df 0e43 lr $AC1.M, @0x0e43 - 0400 05e0 addis $ACC1, #0xe0 - 0401 4c00 add $ACC0, $ACC1 - 0402 00fe 0e41 sr @0x0e41, $AC0.M - 0404 029f 040e jmp 0x040e - 0406 00de 0e42 lr $AC0.M, @0x0e42 - 0408 00fe 0e40 sr @0x0e40, $AC0.M - 040a 00fe 0e41 sr @0x0e41, $AC0.M - 040c 00fe 0e43 sr @0x0e43, $AC0.M - 040e 8100 clr $ACC0 - 040f 8e00 set16 - 0410 8400 clrp - 0411 8900 clr $ACC1 - 0412 1efe mrr $PROD.M2, $AC0.M - 0413 0e40 lris $AC0.M, #0x40 - 0414 1ebe mrr $PROD.M1, $AC0.M - 0415 0083 0e08 lri $AR3, #0x0e08 - 0417 1c03 mrr $AR0, $AR3 - 0418 1ff5 mrr $AC1.M, $PROD.M1 - 0419 191a lrri $AX0.H, @$AR0 - 041a f858 addpaxz'l $ACC0, $AX0.H : $AX1.H, @$AR0 - 041b fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - 041c f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - 041d fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - 041e f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - 041f fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - 0420 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M - 0421 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M - 0422 f83b addpaxz's $ACC0, $AX0.H : @$AR3, $AC1.M - 0423 1b7e srri @$AR3, $AC0.M - 0424 0083 0e04 lri $AR3, #0x0e04 - 0426 8100 clr $ACC0 - 0427 8973 clr'l $ACC1 : $AC0.M, @$AR3 - 0428 1961 lrri $AR1, @$AR3 - 0429 1960 lrri $AR0, @$AR3 - 042a 7800 decm $AC0.M - 042b 00fe 0e04 sr @0x0e04, $AC0.M - 042d 0294 0303 jnz 0x0303 - 042f 8e00 set16 - 0430 8100 clr $ACC0 - 0431 00de 0b9b lr $AC0.M, @0x0b9b - 0433 b100 tst $ACC0 - 0434 0295 0446 jz 0x0446 - 0436 00de 0b9c lr $AC0.M, @0x0b9c - 0438 00dc 0b9d lr $AC0.L, @0x0b9d - 043a 2ece srs @DSMAH, $AC0.M - 043b 2ccf srs @DSMAL, $AC0.L - 043c 8100 clr $ACC0 - 043d 00de 0e1c lr $AC0.M, @0x0e1c - 043f 2ecd srs @DSPA, $AC0.M - 0440 16c9 0001 si @DSCR, #0x0001 - 0442 16cb 0040 si @DSBL, #0x0040 - 0444 02bf 0652 call 0652_WaitDMA - 0446 8100 clr $ACC0 - 0447 8900 clr $ACC1 - 0448 00de 0b82 lr $AC0.M, @0x0b82 - 044a 00df 0b83 lr $AC1.M, @0x0b83 - 044c 2ece srs @DSMAH, $AC0.M - 044d 2fcf srs @DSMAL, $AC1.M - 044e 16cd 0b80 si @DSPA, #0x0b80 - 0450 16c9 0001 si @DSCR, #0x0001 - 0452 16cb 00c4 si @DSBL, #0x00c4 - 0454 02bf 0652 call 0652_WaitDMA - 0456 8100 clr $ACC0 - 0457 00de 0b80 lr $AC0.M, @0x0b80 - 0459 00dc 0b81 lr $AC0.L, @0x0b81 - 045b b100 tst $ACC0 - 045c 0294 0462 jnz 0x0462 - 045e 00c0 0e07 lr $AR0, @0x0e07 - 0460 029f 0068 jmp 0x0068 - 0462 2ece srs @DSMAH, $AC0.M - 0463 2ccf srs @DSMAL, $AC0.L - 0464 16cd 0b80 si @DSPA, #0x0b80 - 0466 16c9 0000 si @DSCR, #0x0000 - 0468 16cb 00c4 si @DSBL, #0x00c4 - 046a 0082 0e08 lri $AR2, #0x0e08 - 046c 009f 0000 lri $AC1.M, #0x0000 - 046e 1b5f srri @$AR2, $AC1.M - 046f 009f 0140 lri $AC1.M, #0x0140 - 0471 1b5f srri @$AR2, $AC1.M - 0472 009f 0280 lri $AC1.M, #0x0280 - 0474 1b5f srri @$AR2, $AC1.M - 0475 009f 0400 lri $AC1.M, #0x0400 - 0477 1b5f srri @$AR2, $AC1.M - 0478 009f 0540 lri $AC1.M, #0x0540 - 047a 1b5f srri @$AR2, $AC1.M - 047b 009f 0680 lri $AC1.M, #0x0680 - 047d 1b5f srri @$AR2, $AC1.M - 047e 009f 07c0 lri $AC1.M, #0x07c0 - 0480 1b5f srri @$AR2, $AC1.M - 0481 009f 0900 lri $AC1.M, #0x0900 - 0483 1b5f srri @$AR2, $AC1.M - 0484 009f 0a40 lri $AC1.M, #0x0a40 - 0486 1b5f srri @$AR2, $AC1.M - 0487 02bf 0652 call 0652_WaitDMA - 0489 00de 0ba7 lr $AC0.M, @0x0ba7 - 048b 00df 0ba8 lr $AC1.M, @0x0ba8 - 048d 2ece srs @DSMAH, $AC0.M - 048e 2fcf srs @DSMAL, $AC1.M - 048f 16cd 03c0 si @DSPA, #0x03c0 - 0491 16c9 0000 si @DSCR, #0x0000 - 0493 16cb 0080 si @DSBL, #0x0080 - 0495 8100 clr $ACC0 - 0496 8900 clr $ACC1 - 0497 00de 0b84 lr $AC0.M, @0x0b84 - 0499 009f 0d0a lri $AC1.M, #0x0d0a - 049b 4c00 add $ACC0, $ACC1 - 049c 1c7e mrr $AR3, $AC0.M - 049d 0213 ilrr $AC0.M, @$AR3 - 049e 00fe 0e15 sr @0x0e15, $AC0.M - 04a0 00de 0b85 lr $AC0.M, @0x0b85 - 04a2 009f 0d0d lri $AC1.M, #0x0d0d - 04a4 4c00 add $ACC0, $ACC1 - 04a5 1c7e mrr $AR3, $AC0.M - 04a6 0213 ilrr $AC0.M, @$AR3 - 04a7 00fe 0e16 sr @0x0e16, $AC0.M - 04a9 00de 0b86 lr $AC0.M, @0x0b86 - 04ab 009a 000f lri $AX0.H, #0x000f - 04ad 009f 0c9a lri $AC1.M, #0x0c9a - 04af 3400 andr $AC0.M, $AX0.H - 04b0 4c00 add $ACC0, $ACC1 - 04b1 1c7e mrr $AR3, $AC0.M - 04b2 0213 ilrr $AC0.M, @$AR3 - 04b3 00fe 0e14 sr @0x0e14, $AC0.M - 04b5 00de 0b86 lr $AC0.M, @0x0b86 - 04b7 009a 001f lri $AX0.H, #0x001f - 04b9 009f 0caa lri $AC1.M, #0x0caa - 04bb 14fc asr $ACC0, #-4 - 04bc 3400 andr $AC0.M, $AX0.H - 04bd 4c00 add $ACC0, $ACC1 - 04be 1c7e mrr $AR3, $AC0.M - 04bf 0213 ilrr $AC0.M, @$AR3 - 04c0 00fe 0e46 sr @0x0e46, $AC0.M - 04c2 00de 0b86 lr $AC0.M, @0x0b86 - 04c4 009f 0cca lri $AC1.M, #0x0cca - 04c6 14f7 asr $ACC0, #-9 - 04c7 4c00 add $ACC0, $ACC1 - 04c8 1c7e mrr $AR3, $AC0.M - 04c9 0213 ilrr $AC0.M, @$AR3 - 04ca 00fe 0e47 sr @0x0e47, $AC0.M - 04cc 8100 clr $ACC0 - 04cd 00de 0b9b lr $AC0.M, @0x0b9b - 04cf b100 tst $ACC0 - 04d0 0295 04f9 jz 0x04f9 - 04d2 8900 clr $ACC1 - 04d3 00df 0b9e lr $AC1.M, @0x0b9e - 04d5 0300 0cc0 addi $AC1.M, #0x0cc0 - 04d7 00ff 0e40 sr @0x0e40, $AC1.M - 04d9 00df 0b9f lr $AC1.M, @0x0b9f - 04db 0300 0cc0 addi $AC1.M, #0x0cc0 - 04dd 00ff 0e41 sr @0x0e41, $AC1.M - 04df 009f 0ce0 lri $AC1.M, #0x0ce0 - 04e1 00ff 0e42 sr @0x0e42, $AC1.M - 04e3 00ff 0e43 sr @0x0e43, $AC1.M - 04e5 02bf 0652 call 0652_WaitDMA - 04e7 00de 0b9c lr $AC0.M, @0x0b9c - 04e9 2ece srs @DSMAH, $AC0.M - 04ea 00de 0b9d lr $AC0.M, @0x0b9d - 04ec 2ecf srs @DSMAL, $AC0.M - 04ed 16cd 0cc0 si @DSPA, #0x0cc0 - 04ef 16c9 0000 si @DSCR, #0x0000 - 04f1 16cb 0040 si @DSBL, #0x0040 - 04f3 02bf 0652 call 0652_WaitDMA - 04f5 00c0 0e07 lr $AR0, @0x0e07 - 04f7 029f 02f8 jmp 0x02f8 - 04f9 009f 0ce0 lri $AC1.M, #0x0ce0 - 04fb 00ff 0e42 sr @0x0e42, $AC1.M - 04fd 00ff 0e40 sr @0x0e40, $AC1.M - 04ff 00ff 0e41 sr @0x0e41, $AC1.M - 0501 00ff 0e43 sr @0x0e43, $AC1.M - 0503 02bf 0652 call 0652_WaitDMA - 0505 00c0 0e07 lr $AR0, @0x0e07 - 0507 029f 02f8 jmp 0x02f8 - 0509 8e00 set16 - 050a 0086 0400 lri $IX2, #0x0400 - 050c 8100 clr $ACC0 - 050d 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 050e 191c lrri $AC0.L, @$AR0 - 050f 2ece srs @DSMAH, $AC0.M - 0510 2ccf srs @DSMAL, $AC0.L - 0511 1fc6 mrr $AC0.M, $IX2 - 0512 2ecd srs @DSPA, $AC0.M - 0513 16c9 0001 si @DSCR, #0x0001 - 0515 16cb 0780 si @DSBL, #0x0780 - 0517 02bf 0652 call 0652_WaitDMA - 0519 02bf 057a call 0x057a - 051b 029f 0068 jmp 0x0068 - 051d 8e00 set16 - 051e 0086 07c0 lri $IX2, #0x07c0 - 0520 8100 clr $ACC0 - 0521 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0522 191c lrri $AC0.L, @$AR0 - 0523 2ece srs @DSMAH, $AC0.M - 0524 2ccf srs @DSMAL, $AC0.L - 0525 1fc6 mrr $AC0.M, $IX2 - 0526 2ecd srs @DSPA, $AC0.M - 0527 16c9 0001 si @DSCR, #0x0001 - 0529 16cb 0780 si @DSBL, #0x0780 - 052b 02bf 0652 call 0652_WaitDMA - 052d 02bf 057a call 0x057a - 052f 029f 0068 jmp 0x0068 - 0531 8c00 clr15 - 0532 8a00 m2 - 0533 8100 clr $ACC0 - 0534 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0535 191f lrri $AC1.M, @$AR0 - 0536 2ece srs @DSMAH, $AC0.M - 0537 2fcf srs @DSMAL, $AC1.M - 0538 16cd 0280 si @DSPA, #0x0280 - 053a 16c9 0001 si @DSCR, #0x0001 - 053c 16cb 0280 si @DSBL, #0x0280 - 053e 8f50 set40'l : $AX0.H, @$AR0 - 053f 8140 clr'l $ACC0 : $AX0.L, @$AR0 - 0540 0081 0400 lri $AR1, #0x0400 - 0542 0083 0000 lri $AR3, #0x0000 - 0544 0082 0140 lri $AR2, #0x0140 - 0546 0099 0080 lri $AX1.L, #0x0080 - 0548 02bf 0652 call 0652_WaitDMA - 054a 1105 0562 bloopi #0x05, 0x0562 - 054c 1f61 mrr $AX1.H, $AR1 - 054d 1120 0554 bloopi #0x20, 0x0554 - 054f 8972 clr'l $ACC1 : $AC0.M, @$AR2 - 0550 195c lrri $AC0.L, @$AR2 - 0551 f07b lsl16'l $ACC0 : $AC1.M, @$AR3 - 0552 197d lrri $AC1.L, @$AR3 - 0553 f131 lsl16's $ACC1 : @$AR1, $AC0.M - 0554 8139 clr's $ACC0 : @$AR1, $AC1.M - 0555 8900 clr $ACC1 - 0556 6800 movax $ACC0, $AX0.L - 0557 2ece srs @DSMAH, $AC0.M - 0558 2ccf srs @DSMAL, $AC0.L - 0559 1ffb mrr $AC1.M, $AX1.H - 055a 2fcd srs @DSPA, $AC1.M - 055b 0f01 lris $AC1.M, #0x01 - 055c 2fc9 srs @DSCR, $AC1.M - 055d 1ff9 mrr $AC1.M, $AX1.L - 055e 2fcb srs @DSBL, $AC1.M - 055f 7200 addaxl $ACC0, $AX1.L - 0560 1f5e mrr $AX0.H, $AC0.M - 0561 1f1c mrr $AX0.L, $AC0.L - 0562 8100 clr $ACC0 - 0563 26c9 lrs $AC0.M, @DSCR - 0564 02a0 0004 andf $AC0.M, #0x0004 - 0566 029c 0563 jlnz 0x0563 - 0568 029f 0068 jmp 0x0068 - 056a 029f 0068 jmp 0x0068 - 056c 029f 0068 jmp 0x0068 - 056e 029f 0068 jmp 0x0068 - 0570 16fc dcd1 si @DMBH, #0xdcd1 - 0572 16fd 0002 si @DMBL, #0x0002 - 0574 16fb 0001 si @DIRQ, #0x0001 - 0576 029f 0f03 jmp 0x0f03 - 0578 029f 0045 jmp 0x0045 - 057a 8e00 set16 - 057b 191f lrri $AC1.M, @$AR0 - 057c 191d lrri $AC1.L, @$AR0 - 057d 1f5f mrr $AX0.H, $AC1.M - 057e 1f1d mrr $AX0.L, $AC1.L - 057f 2fce srs @DSMAH, $AC1.M - 0580 2dcf srs @DSMAL, $AC1.L - 0581 8900 clr $ACC1 - 0582 1fa6 mrr $AC1.L, $IX2 - 0583 2dcd srs @DSPA, $AC1.L - 0584 0e00 lris $AC0.M, #0x00 - 0585 2ec9 srs @DSCR, $AC0.M - 0586 8100 clr $ACC0 - 0587 009c 00c0 lri $AC0.L, #0x00c0 - 0589 2ccb srs @DSBL, $AC0.L - 058a 1ca0 mrr $IX1, $AR0 - 058b 0081 0e48 lri $AR1, #0x0e48 - 058d 4800 addax $ACC0, $AX0.L - 058e 1b3e srri @$AR1, $AC0.M - 058f 1b3c srri @$AR1, $AC0.L - 0590 0b00 lris $AX1.H, #0x00 - 0591 0099 0060 lri $AX1.L, #0x0060 - 0593 4b00 addax $ACC1, $AX1.L - 0594 1b3d srri @$AR1, $AC1.L - 0595 0081 0e48 lri $AR1, #0x0e48 - 0597 1c06 mrr $AR0, $IX2 - 0598 0083 0000 lri $AR3, #0x0000 - 059a 1c43 mrr $AR2, $AR3 - 059b 27c9 lrs $AC1.M, @DSCR - 059c 03a0 0004 andf $AC1.M, #0x0004 - 059e 029c 059b jlnz 0x059b - 05a0 1109 05d0 bloopi #0x09, 0x05d0 - 05a2 8e00 set16 - 05a3 193a lrri $AX0.H, @$AR1 - 05a4 1938 lrri $AX0.L, @$AR1 - 05a5 6900 movax $ACC1, $AX0.L - 05a6 2fce srs @DSMAH, $AC1.M - 05a7 2dcf srs @DSMAL, $AC1.L - 05a8 8900 clr $ACC1 - 05a9 193d lrri $AC1.L, @$AR1 - 05aa 2dcd srs @DSPA, $AC1.L - 05ab 16c9 0000 si @DSCR, #0x0000 - 05ad 8100 clr $ACC0 - 05ae 009c 00c0 lri $AC0.L, #0x00c0 - 05b0 2ccb srs @DSBL, $AC0.L - 05b1 0081 0e48 lri $AR1, #0x0e48 - 05b3 4800 addax $ACC0, $AX0.L - 05b4 1b3e srri @$AR1, $AC0.M - 05b5 1b3c srri @$AR1, $AC0.L - 05b6 0b00 lris $AX1.H, #0x00 - 05b7 0960 lris $AX1.L, #0x60 - 05b8 4b00 addax $ACC1, $AX1.L - 05b9 1b3d srri @$AR1, $AC1.L - 05ba 0081 0e48 lri $AR1, #0x0e48 - 05bc 8f00 set40 - 05bd 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05be 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05bf 6a00 movax $ACC0, $AX1.L - 05c0 4800 addax $ACC0, $AX0.L - 05c1 1117 05ca bloopi #0x17, 0x05ca - 05c3 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05c4 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05c5 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 05c6 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 05c7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05c8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05c9 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 05ca 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 05cb 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05cc 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05cd 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 05ce 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 05cf 1b5f srri @$AR2, $AC1.M - 05d0 1b5d srri @$AR2, $AC1.L - 05d1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05d2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05d3 6a00 movax $ACC0, $AX1.L - 05d4 4800 addax $ACC0, $AX0.L - 05d5 1117 05de bloopi #0x17, 0x05de - 05d7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05d8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05d9 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 05da 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 05db 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05dc 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05dd 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 05de 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 05df 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 05e0 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 05e1 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 05e2 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 05e3 1b5f srri @$AR2, $AC1.M - 05e4 1b5d srri @$AR2, $AC1.L - 05e5 1c05 mrr $AR0, $IX1 - 05e6 02df ret - 05e7 8e00 set16 - 05e8 009b 0e48 lri $AX1.H, #0x0e48 - 05ea 009d 00c0 lri $AC1.L, #0x00c0 - 05ec 02bf 0637 call 0x0637 - 05ee 4900 addax $ACC1, $AX0.L - 05ef 00ff 0e1d sr @0x0e1d, $AC1.M - 05f1 00fd 0e1e sr @0x0e1e, $AC1.L - 05f3 8900 clr $ACC1 - 05f4 02bf 0652 call 0652_WaitDMA - 05f6 1104 0622 bloopi #0x04, 0x0622 - 05f8 00da 0e1d lr $AX0.H, @0x0e1d - 05fa 00d8 0e1e lr $AX0.L, @0x0e1e - 05fc 009b 0ea8 lri $AX1.H, #0x0ea8 - 05fe 009d 00c0 lri $AC1.L, #0x00c0 - 0600 02bf 0637 call 0x0637 - 0602 4900 addax $ACC1, $AX0.L - 0603 00ff 0e1d sr @0x0e1d, $AC1.M - 0605 00fd 0e1e sr @0x0e1e, $AC1.L - 0607 0083 0e48 lri $AR3, #0x0e48 - 0609 02bf 0642 call 0x0642 - 060b 8900 clr $ACC1 - 060c 00da 0e1d lr $AX0.H, @0x0e1d - 060e 00d8 0e1e lr $AX0.L, @0x0e1e - 0610 009b 0e48 lri $AX1.H, #0x0e48 - 0612 009d 00c0 lri $AC1.L, #0x00c0 - 0614 02bf 0637 call 0x0637 - 0616 4900 addax $ACC1, $AX0.L - 0617 00ff 0e1d sr @0x0e1d, $AC1.M - 0619 00fd 0e1e sr @0x0e1e, $AC1.L - 061b 0083 0ea8 lri $AR3, #0x0ea8 - 061d 02bf 0642 call 0x0642 - 061f 0000 nop - 0620 0000 nop - 0621 8e00 set16 - 0622 8900 clr $ACC1 - 0623 00da 0e1d lr $AX0.H, @0x0e1d - 0625 00d8 0e1e lr $AX0.L, @0x0e1e - 0627 009b 0ea8 lri $AX1.H, #0x0ea8 - 0629 009d 00c0 lri $AC1.L, #0x00c0 - 062b 02bf 0637 call 0x0637 - 062d 4900 addax $ACC1, $AX0.L - 062e 0083 0e48 lri $AR3, #0x0e48 - 0630 02bf 0642 call 0x0642 - 0632 0083 0ea8 lri $AR3, #0x0ea8 - 0634 02bf 0642 call 0x0642 - 0636 02df ret - 0637 8e00 set16 - 0638 00fa ffce sr @DSMAH, $AX0.H - 063a 00f8 ffcf sr @DSMAL, $AX0.L - 063c 00fb ffcd sr @DSPA, $AX1.H - 063e 16c9 0000 si @DSCR, #0x0000 - 0640 2dcb srs @DSBL, $AC1.L - 0641 02df ret - 0642 8f00 set40 - 0643 8d00 set15 - 0644 8a00 m2 - 0645 197a lrri $AX0.H, @$AR3 - 0646 1978 lrri $AX0.L, @$AR3 - 0647 a000 mulx $AX0.L, $AX1.L - 0648 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0649 1130 0650 bloopi #0x30, 0x0650 - 064b 9179 asr16'l $ACC0 : $AC1.M, @$AR1 - 064c 4e6d addp'ln $ACC0 : $AC1.L, @$AR1 - 064d 197a lrri $AX0.H, @$AR3 - 064e 4d43 add'l $ACC1, $ACC0 : $AX0.L, @$AR3 - 064f a039 mulx's $AX0.L, $AX1.L : @$AR1, $AC1.M - 0650 b629 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR1, $AC1.L - 0651 02df ret - -void 0652_WaitDMA() { - do { - // 0652 26c9 lrs $AC0.M, @DSCR - // 0653 02a0 0004 andf $AC0.M, #0x0004 - // 0655 029c 0652 jlnz 0x0652 - } while (DSCR & 0x0004); - - 0657 02df ret -} - -void 0658_WaitForCPUMail() { - do { - // 0658 26fe lrs $AC0.M, @CMBH - // 0659 02c0 8000 andcf $AC0.M, #0x8000 - // 065b 029c 0658 jlnz 0x0658 - } while (CMBH & 0x8000); - - 065d 02df ret -} - -void 065e_WaitForDSPMail1() { - do { - // 065e 26fc lrs $AC0.M, @DMBH - // 065f 02a0 8000 andf $AC0.M, #0x8000 - // 0661 029c 065e jlnz 0x065e - } while (DMBH & 0x8000); - 0663 02df ret -} - -void 0644_WaitForDSPMail2() { - do { - // 0664 26fc lrs $AC0.M, @DMBH - // 0665 02a0 8000 andf $AC0.M, #0x8000 - // 0667 029c 0664 jlnz 0x0664 - } while (DMBH & 0x8000); - 0669 02df ret -} - - 066a 8100 clr $ACC0 - 066b 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 066c 8e60 set16'l : $AC0.L, @$AR0 - 066d 2ece srs @DSMAH, $AC0.M - 066e 2ccf srs @DSMAL, $AC0.L - 066f 16cd 0e48 si @DSPA, #0x0e48 - 0671 16c9 0000 si @DSCR, #0x0000 - 0673 8900 clr $ACC1 - 0674 0d20 lris $AC1.L, #0x20 - 0675 2dcb srs @DSBL, $AC1.L - 0676 4c00 add $ACC0, $ACC1 - 0677 1c80 mrr $IX0, $AR0 - 0678 0080 0280 lri $AR0, #0x0280 - 067a 0081 0000 lri $AR1, #0x0000 - 067c 0082 0140 lri $AR2, #0x0140 - 067e 0083 0e48 lri $AR3, #0x0e48 - 0680 0a00 lris $AX0.H, #0x00 - 0681 27c9 lrs $AC1.M, @DSCR - 0682 03a0 0004 andf $AC1.M, #0x0004 - 0684 029c 0681 jlnz 0x0681 - 0686 2ece srs @DSMAH, $AC0.M - 0687 2ccf srs @DSMAL, $AC0.L - 0688 16cd 0e58 si @DSPA, #0x0e58 - 068a 16c9 0000 si @DSCR, #0x0000 - 068c 16cb 0260 si @DSBL, #0x0260 - 068e 009f 00a0 lri $AC1.M, #0x00a0 - 0690 8f00 set40 - 0691 007f 069a bloop $AC1.M, 0x069a - 0693 197e lrri $AC0.M, @$AR3 - 0694 1b1a srri @$AR0, $AX0.H - 0695 197c lrri $AC0.L, @$AR3 - 0696 1b1a srri @$AR0, $AX0.H - 0697 1b5e srri @$AR2, $AC0.M - 0698 1b5c srri @$AR2, $AC0.L - 0699 1b3e srri @$AR1, $AC0.M - 069a 1b3c srri @$AR1, $AC0.L - 069b 1c04 mrr $AR0, $IX0 - 069c 029f 0068 jmp 0x0068 - 069e 0082 0bb8 lri $AR2, #0x0bb8 - 06a0 195e lrri $AC0.M, @$AR2 - 06a1 2ed1 srs @SampleFormat, $AC0.M - 06a2 195e lrri $AC0.M, @$AR2 - 06a3 2ed4 srs @ACSAH, $AC0.M - 06a4 195e lrri $AC0.M, @$AR2 - 06a5 2ed5 srs @ACSAL, $AC0.M - 06a6 195e lrri $AC0.M, @$AR2 - 06a7 2ed6 srs @ACEAH, $AC0.M - 06a8 195e lrri $AC0.M, @$AR2 - 06a9 2ed7 srs @ACEAL, $AC0.M - 06aa 195e lrri $AC0.M, @$AR2 - 06ab 2ed8 srs @ACCAH, $AC0.M - 06ac 195e lrri $AC0.M, @$AR2 - 06ad 2ed9 srs @ACCAL, $AC0.M - 06ae 195e lrri $AC0.M, @$AR2 - 06af 2ea0 srs @COEF_A1_0, $AC0.M - 06b0 195e lrri $AC0.M, @$AR2 - 06b1 2ea1 srs @COEF_A2_0, $AC0.M - 06b2 195e lrri $AC0.M, @$AR2 - 06b3 2ea2 srs @COEF_A1_1, $AC0.M - 06b4 195e lrri $AC0.M, @$AR2 - 06b5 2ea3 srs @COEF_A2_1, $AC0.M - 06b6 195e lrri $AC0.M, @$AR2 - 06b7 2ea4 srs @COEF_A1_2, $AC0.M - 06b8 195e lrri $AC0.M, @$AR2 - 06b9 2ea5 srs @COEF_A2_2, $AC0.M - 06ba 195e lrri $AC0.M, @$AR2 - 06bb 2ea6 srs @COEF_A1_3, $AC0.M - 06bc 195e lrri $AC0.M, @$AR2 - 06bd 2ea7 srs @COEF_A2_3, $AC0.M - 06be 195e lrri $AC0.M, @$AR2 - 06bf 2ea8 srs @COEF_A1_4, $AC0.M - 06c0 195e lrri $AC0.M, @$AR2 - 06c1 2ea9 srs @COEF_A2_4, $AC0.M - 06c2 195e lrri $AC0.M, @$AR2 - 06c3 2eaa srs @COEF_A1_5, $AC0.M - 06c4 195e lrri $AC0.M, @$AR2 - 06c5 2eab srs @COEF_A2_5, $AC0.M - 06c6 195e lrri $AC0.M, @$AR2 - 06c7 2eac srs @COEF_A1_6, $AC0.M - 06c8 195e lrri $AC0.M, @$AR2 - 06c9 2ead srs @COEF_A2_6, $AC0.M - 06ca 195e lrri $AC0.M, @$AR2 - 06cb 2eae srs @COEF_A1_7, $AC0.M - 06cc 195e lrri $AC0.M, @$AR2 - 06cd 2eaf srs @COEF_A2_7, $AC0.M - 06ce 195e lrri $AC0.M, @$AR2 - 06cf 2ede srs @GAIN, $AC0.M - 06d0 195e lrri $AC0.M, @$AR2 - 06d1 2eda srs @pred_scale, $AC0.M - 06d2 195e lrri $AC0.M, @$AR2 - 06d3 2edb srs @yn1, $AC0.M - 06d4 195e lrri $AC0.M, @$AR2 - 06d5 2edc srs @yn2, $AC0.M - 06d6 8c00 clr15 - 06d7 8a00 m2 - 06d8 8e00 set16 - 06d9 00d8 0e16 lr $AX0.L, @0x0e16 - 06db 195b lrri $AX1.H, @$AR2 - 06dc 1959 lrri $AX1.L, @$AR2 - 06dd 8100 clr $ACC0 - 06de 195c lrri $AC0.L, @$AR2 - 06df 0080 0e48 lri $AR0, #0x0e48 - 06e1 195f lrri $AC1.M, @$AR2 - 06e2 1b1f srri @$AR0, $AC1.M - 06e3 195f lrri $AC1.M, @$AR2 - 06e4 1b1f srri @$AR0, $AC1.M - 06e5 195f lrri $AC1.M, @$AR2 - 06e6 1b1f srri @$AR0, $AC1.M - 06e7 185f lrr $AC1.M, @$AR2 - 06e8 1b1f srri @$AR0, $AC1.M - 06e9 6b00 movax $ACC1, $AX1.L - 06ea 1505 lsl $ACC1, #5 - 06eb 4d00 add $ACC1, $ACC0 - 06ec 157e lsr $ACC1, #-2 - 06ed 1c9f mrr $IX0, $AC1.M - 06ee 1cbd mrr $IX1, $AC1.L - 06ef 05e0 addis $ACC1, #0xe0 - 06f0 9900 asr16 $ACC1 - 06f1 7d00 neg $ACC1 - 06f2 1cdd mrr $IX2, $AC1.L - 06f3 8900 clr $ACC1 - 06f4 1fa5 mrr $AC1.L, $IX1 - 06f5 1502 lsl $ACC1, #2 - 06f6 1cbf mrr $IX1, $AC1.M - 06f7 009a 01fc lri $AX0.H, #0x01fc - 06f9 009e 0e48 lri $AC0.M, #0x0e48 - 06fb 0081 ffdd lri $AR1, #0xffdd - 06fd 0083 0d80 lri $AR3, #0x0d80 - 06ff 0064 0710 bloop $IX0, 0x0710 - 0701 1827 lrr $IX3, @$AR1 - 0702 1b07 srri @$AR0, $IX3 - 0703 4a00 addax $ACC0, $AX1.L - 0704 1ffc mrr $AC1.M, $AC0.L - 0705 1827 lrr $IX3, @$AR1 - 0706 1b07 srri @$AR0, $IX3 - 0707 1579 lsr $ACC1, #-7 - 0708 3500 andr $AC1.M, $AX0.H - 0709 1827 lrr $IX3, @$AR1 - 070a 1b07 srri @$AR0, $IX3 - 070b 4100 addr $ACC1, $AX0.L - 070c 1b7e srri @$AR3, $AC0.M - 070d 1827 lrr $IX3, @$AR1 - 070e 1b07 srri @$AR0, $IX3 - 070f 1b7f srri @$AR3, $AC1.M - 0710 0000 nop - 0711 0065 0716 bloop $IX1, 0x0716 - 0713 1827 lrr $IX3, @$AR1 - 0714 1b07 srri @$AR0, $IX3 - 0715 0000 nop - 0716 0000 nop - 0717 0007 dar $AR3 - 0718 187f lrr $AC1.M, @$AR3 - 0719 0066 071f bloop $IX2, 0x071f - 071b 4a3b addax's $ACC0, $AX1.L : @$AR3, $AC1.M - 071c 1ffc mrr $AC1.M, $AC0.L - 071d 1579 lsr $ACC1, #-7 - 071e 3533 andr's $AC1.M, $AX0.H : @$AR3, $AC0.M - 071f 4100 addr $ACC1, $AX0.L - 0720 1b7f srri @$AR3, $AC1.M - 0721 0004 dar $AR0 - 0722 189f lrrd $AC1.M, @$AR0 - 0723 1adf srrd @$AR2, $AC1.M - 0724 189f lrrd $AC1.M, @$AR0 - 0725 1adf srrd @$AR2, $AC1.M - 0726 189f lrrd $AC1.M, @$AR0 - 0727 1adf srrd @$AR2, $AC1.M - 0728 189f lrrd $AC1.M, @$AR0 - 0729 1adf srrd @$AR2, $AC1.M - 072a 1adc srrd @$AR2, $AC0.L - 072b 0082 0bd2 lri $AR2, #0x0bd2 - 072d 27dc lrs $AC1.M, @yn2 - 072e 1adf srrd @$AR2, $AC1.M - 072f 27db lrs $AC1.M, @yn1 - 0730 1adf srrd @$AR2, $AC1.M - 0731 27da lrs $AC1.M, @pred_scale - 0732 1adf srrd @$AR2, $AC1.M - 0733 0082 0bbe lri $AR2, #0x0bbe - 0735 27d9 lrs $AC1.M, @ACCAL - 0736 1adf srrd @$AR2, $AC1.M - 0737 27d8 lrs $AC1.M, @ACCAH - 0738 1adf srrd @$AR2, $AC1.M - 0739 8f00 set40 - 073a 00c1 0e42 lr $AR1, @0x0e42 - 073c 0082 0d80 lri $AR2, #0x0d80 - 073e 1940 lrri $AR0, @$AR2 - 073f 1943 lrri $AR3, @$AR2 - 0740 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0741 b8c0 mulx'ld $AX0.H, $AX1.H : $AX0.L, $AX1.L, @$AR0 - 0742 111f 074a bloopi #0x1f, 0x074a - 0744 a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0745 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0746 1940 lrri $AR0, @$AR2 - 0747 1943 lrri $AR3, @$AR2 - 0748 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 0749 4ec0 addp'ld $ACC0 : $AX0.L, $AX1.L, @$AR0 - 074a b831 mulx's $AX0.H, $AX1.H : @$AR1, $AC0.M - 074b a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 074c bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0 - 074d bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 074e 4e00 addp $ACC0 - 074f 1b3e srri @$AR1, $AC0.M - 0750 00e1 0e42 sr @0x0e42, $AR1 - 0752 02df ret - 0753 0082 0bb8 lri $AR2, #0x0bb8 - 0755 195e lrri $AC0.M, @$AR2 - 0756 2ed1 srs @SampleFormat, $AC0.M - 0757 195e lrri $AC0.M, @$AR2 - 0758 2ed4 srs @ACSAH, $AC0.M - 0759 195e lrri $AC0.M, @$AR2 - 075a 2ed5 srs @ACSAL, $AC0.M - 075b 195e lrri $AC0.M, @$AR2 - 075c 2ed6 srs @ACEAH, $AC0.M - 075d 195e lrri $AC0.M, @$AR2 - 075e 2ed7 srs @ACEAL, $AC0.M - 075f 195e lrri $AC0.M, @$AR2 - 0760 2ed8 srs @ACCAH, $AC0.M - 0761 195e lrri $AC0.M, @$AR2 - 0762 2ed9 srs @ACCAL, $AC0.M - 0763 195e lrri $AC0.M, @$AR2 - 0764 2ea0 srs @COEF_A1_0, $AC0.M - 0765 195e lrri $AC0.M, @$AR2 - 0766 2ea1 srs @COEF_A2_0, $AC0.M - 0767 195e lrri $AC0.M, @$AR2 - 0768 2ea2 srs @COEF_A1_1, $AC0.M - 0769 195e lrri $AC0.M, @$AR2 - 076a 2ea3 srs @COEF_A2_1, $AC0.M - 076b 195e lrri $AC0.M, @$AR2 - 076c 2ea4 srs @COEF_A1_2, $AC0.M - 076d 195e lrri $AC0.M, @$AR2 - 076e 2ea5 srs @COEF_A2_2, $AC0.M - 076f 195e lrri $AC0.M, @$AR2 - 0770 2ea6 srs @COEF_A1_3, $AC0.M - 0771 195e lrri $AC0.M, @$AR2 - 0772 2ea7 srs @COEF_A2_3, $AC0.M - 0773 195e lrri $AC0.M, @$AR2 - 0774 2ea8 srs @COEF_A1_4, $AC0.M - 0775 195e lrri $AC0.M, @$AR2 - 0776 2ea9 srs @COEF_A2_4, $AC0.M - 0777 195e lrri $AC0.M, @$AR2 - 0778 2eaa srs @COEF_A1_5, $AC0.M - 0779 195e lrri $AC0.M, @$AR2 - 077a 2eab srs @COEF_A2_5, $AC0.M - 077b 195e lrri $AC0.M, @$AR2 - 077c 2eac srs @COEF_A1_6, $AC0.M - 077d 195e lrri $AC0.M, @$AR2 - 077e 2ead srs @COEF_A2_6, $AC0.M - 077f 195e lrri $AC0.M, @$AR2 - 0780 2eae srs @COEF_A1_7, $AC0.M - 0781 195e lrri $AC0.M, @$AR2 - 0782 2eaf srs @COEF_A2_7, $AC0.M - 0783 195e lrri $AC0.M, @$AR2 - 0784 2ede srs @GAIN, $AC0.M - 0785 195e lrri $AC0.M, @$AR2 - 0786 2eda srs @pred_scale, $AC0.M - 0787 195e lrri $AC0.M, @$AR2 - 0788 2edb srs @yn1, $AC0.M - 0789 195e lrri $AC0.M, @$AR2 - 078a 2edc srs @yn2, $AC0.M - 078b 8c00 clr15 - 078c 8a00 m2 - 078d 8e00 set16 - 078e 195b lrri $AX1.H, @$AR2 - 078f 1959 lrri $AX1.L, @$AR2 - 0790 8100 clr $ACC0 - 0791 195c lrri $AC0.L, @$AR2 - 0792 0080 0e48 lri $AR0, #0x0e48 - 0794 195f lrri $AC1.M, @$AR2 - 0795 195f lrri $AC1.M, @$AR2 - 0796 195f lrri $AC1.M, @$AR2 - 0797 1b1f srri @$AR0, $AC1.M - 0798 185f lrr $AC1.M, @$AR2 - 0799 1b1f srri @$AR0, $AC1.M - 079a 6b00 movax $ACC1, $AX1.L - 079b 1505 lsl $ACC1, #5 - 079c 4d00 add $ACC1, $ACC0 - 079d 157e lsr $ACC1, #-2 - 079e 1c9f mrr $IX0, $AC1.M - 079f 1cbd mrr $IX1, $AC1.L - 07a0 05e0 addis $ACC1, #0xe0 - 07a1 9900 asr16 $ACC1 - 07a2 7d00 neg $ACC1 - 07a3 1cdd mrr $IX2, $AC1.L - 07a4 8900 clr $ACC1 - 07a5 1fa5 mrr $AC1.L, $IX1 - 07a6 1502 lsl $ACC1, #2 - 07a7 1cbf mrr $IX1, $AC1.M - 07a8 009a 01fc lri $AX0.H, #0x01fc - 07aa 009e 0e49 lri $AC0.M, #0x0e49 - 07ac 0081 ffdd lri $AR1, #0xffdd - 07ae 0083 0d80 lri $AR3, #0x0d80 - 07b0 0064 07c1 bloop $IX0, 0x07c1 - 07b2 1827 lrr $IX3, @$AR1 - 07b3 1b07 srri @$AR0, $IX3 - 07b4 4a00 addax $ACC0, $AX1.L - 07b5 1b7e srri @$AR3, $AC0.M - 07b6 1827 lrr $IX3, @$AR1 - 07b7 1b07 srri @$AR0, $IX3 - 07b8 1b7c srri @$AR3, $AC0.L - 07b9 0000 nop - 07ba 1827 lrr $IX3, @$AR1 - 07bb 1b07 srri @$AR0, $IX3 - 07bc 0000 nop - 07bd 0000 nop - 07be 1827 lrr $IX3, @$AR1 - 07bf 1b07 srri @$AR0, $IX3 - 07c0 0000 nop - 07c1 0000 nop - 07c2 0065 07c7 bloop $IX1, 0x07c7 - 07c4 1827 lrr $IX3, @$AR1 - 07c5 1b07 srri @$AR0, $IX3 - 07c6 0000 nop - 07c7 0000 nop - 07c8 0066 07cc bloop $IX2, 0x07cc - 07ca 4a00 addax $ACC0, $AX1.L - 07cb 1b7e srri @$AR3, $AC0.M - 07cc 1b7c srri @$AR3, $AC0.L - 07cd 0004 dar $AR0 - 07ce 189f lrrd $AC1.M, @$AR0 - 07cf 1adf srrd @$AR2, $AC1.M - 07d0 189f lrrd $AC1.M, @$AR0 - 07d1 1adf srrd @$AR2, $AC1.M - 07d2 189f lrrd $AC1.M, @$AR0 - 07d3 1adf srrd @$AR2, $AC1.M - 07d4 189f lrrd $AC1.M, @$AR0 - 07d5 1adf srrd @$AR2, $AC1.M - 07d6 1adc srrd @$AR2, $AC0.L - 07d7 0082 0bd2 lri $AR2, #0x0bd2 - 07d9 27dc lrs $AC1.M, @yn2 - 07da 1adf srrd @$AR2, $AC1.M - 07db 27db lrs $AC1.M, @yn1 - 07dc 1adf srrd @$AR2, $AC1.M - 07dd 27da lrs $AC1.M, @pred_scale - 07de 1adf srrd @$AR2, $AC1.M - 07df 0082 0bbe lri $AR2, #0x0bbe - 07e1 27d9 lrs $AC1.M, @ACCAL - 07e2 1adf srrd @$AR2, $AC1.M - 07e3 27d8 lrs $AC1.M, @ACCAH - 07e4 1adf srrd @$AR2, $AC1.M - 07e5 8d00 set15 - 07e6 8b00 m0 - 07e7 8f00 set40 - 07e8 00c1 0e42 lr $AR1, @0x0e42 - 07ea 0082 0d80 lri $AR2, #0x0d80 - 07ec 8100 clr $ACC0 - 07ed 1120 07f9 bloopi #0x20, 0x07f9 - 07ef 8900 clr $ACC1 - 07f0 1940 lrri $AR0, @$AR2 - 07f1 189e lrrd $AC0.M, @$AR0 - 07f2 181b lrr $AX1.H, @$AR0 - 07f3 199a lrrn $AX0.H, @$AR0 - 07f4 5400 subr $ACC0, $AX0.H - 07f5 1f5e mrr $AX0.H, $AC0.M - 07f6 1959 lrri $AX1.L, @$AR2 - 07f7 b000 mulx $AX0.H, $AX1.L - 07f8 fb00 addpaxz $ACC1, $AX1.H - 07f9 8139 clr's $ACC0 : @$AR1, $AC1.M - 07fa 00e1 0e42 sr @0x0e42, $AR1 - 07fc 02df ret - 07fd 0082 0bb8 lri $AR2, #0x0bb8 - 07ff 195e lrri $AC0.M, @$AR2 - 0800 2ed1 srs @SampleFormat, $AC0.M - 0801 195e lrri $AC0.M, @$AR2 - 0802 2ed4 srs @ACSAH, $AC0.M - 0803 195e lrri $AC0.M, @$AR2 - 0804 2ed5 srs @ACSAL, $AC0.M - 0805 195e lrri $AC0.M, @$AR2 - 0806 2ed6 srs @ACEAH, $AC0.M - 0807 195e lrri $AC0.M, @$AR2 - 0808 2ed7 srs @ACEAL, $AC0.M - 0809 195e lrri $AC0.M, @$AR2 - 080a 2ed8 srs @ACCAH, $AC0.M - 080b 195e lrri $AC0.M, @$AR2 - 080c 2ed9 srs @ACCAL, $AC0.M - 080d 195e lrri $AC0.M, @$AR2 - 080e 2ea0 srs @COEF_A1_0, $AC0.M - 080f 195e lrri $AC0.M, @$AR2 - 0810 2ea1 srs @COEF_A2_0, $AC0.M - 0811 195e lrri $AC0.M, @$AR2 - 0812 2ea2 srs @COEF_A1_1, $AC0.M - 0813 195e lrri $AC0.M, @$AR2 - 0814 2ea3 srs @COEF_A2_1, $AC0.M - 0815 195e lrri $AC0.M, @$AR2 - 0816 2ea4 srs @COEF_A1_2, $AC0.M - 0817 195e lrri $AC0.M, @$AR2 - 0818 2ea5 srs @COEF_A2_2, $AC0.M - 0819 195e lrri $AC0.M, @$AR2 - 081a 2ea6 srs @COEF_A1_3, $AC0.M - 081b 195e lrri $AC0.M, @$AR2 - 081c 2ea7 srs @COEF_A2_3, $AC0.M - 081d 195e lrri $AC0.M, @$AR2 - 081e 2ea8 srs @COEF_A1_4, $AC0.M - 081f 195e lrri $AC0.M, @$AR2 - 0820 2ea9 srs @COEF_A2_4, $AC0.M - 0821 195e lrri $AC0.M, @$AR2 - 0822 2eaa srs @COEF_A1_5, $AC0.M - 0823 195e lrri $AC0.M, @$AR2 - 0824 2eab srs @COEF_A2_5, $AC0.M - 0825 195e lrri $AC0.M, @$AR2 - 0826 2eac srs @COEF_A1_6, $AC0.M - 0827 195e lrri $AC0.M, @$AR2 - 0828 2ead srs @COEF_A2_6, $AC0.M - 0829 195e lrri $AC0.M, @$AR2 - 082a 2eae srs @COEF_A1_7, $AC0.M - 082b 195e lrri $AC0.M, @$AR2 - 082c 2eaf srs @COEF_A2_7, $AC0.M - 082d 195e lrri $AC0.M, @$AR2 - 082e 2ede srs @GAIN, $AC0.M - 082f 195e lrri $AC0.M, @$AR2 - 0830 2eda srs @pred_scale, $AC0.M - 0831 195e lrri $AC0.M, @$AR2 - 0832 2edb srs @yn1, $AC0.M - 0833 195e lrri $AC0.M, @$AR2 - 0834 2edc srs @yn2, $AC0.M - 0835 00c0 0e42 lr $AR0, @0x0e42 - 0837 0081 ffdd lri $AR1, #0xffdd - 0839 1120 083e bloopi #0x20, 0x083e - 083b 1824 lrr $IX0, @$AR1 - 083c 1b04 srri @$AR0, $IX0 - 083d 0000 nop - 083e 0000 nop - 083f 00e0 0e42 sr @0x0e42, $AR0 - 0841 0082 0bd9 lri $AR2, #0x0bd9 - 0843 0004 dar $AR0 - 0844 189f lrrd $AC1.M, @$AR0 - 0845 1adf srrd @$AR2, $AC1.M - 0846 189f lrrd $AC1.M, @$AR0 - 0847 1adf srrd @$AR2, $AC1.M - 0848 189f lrrd $AC1.M, @$AR0 - 0849 1adf srrd @$AR2, $AC1.M - 084a 189f lrrd $AC1.M, @$AR0 - 084b 1adf srrd @$AR2, $AC1.M - 084c 8900 clr $ACC1 - 084d 1adc srrd @$AR2, $AC0.L - 084e 27dc lrs $AC1.M, @yn2 - 084f 00ff 0bd2 sr @0x0bd2, $AC1.M - 0851 27db lrs $AC1.M, @yn1 - 0852 00ff 0bd1 sr @0x0bd1, $AC1.M - 0854 27da lrs $AC1.M, @pred_scale - 0855 00ff 0bd0 sr @0x0bd0, $AC1.M - 0857 27d9 lrs $AC1.M, @ACCAL - 0858 00ff 0bbe sr @0x0bbe, $AC1.M - 085a 27d8 lrs $AC1.M, @ACCAH - 085b 00ff 0bbd sr @0x0bbd, $AC1.M - 085d 02df ret - 085e 02df ret - 085f 00c0 0e40 lr $AR0, @0x0e40 - 0861 0081 0b89 lri $AR1, #0x0b89 - 0863 00c2 0e08 lr $AR2, @0x0e08 - 0865 1c62 mrr $AR3, $AR2 - 0866 02bf 81f9 call 0x81f9 - 0868 00f8 0ba9 sr @0x0ba9, $AX0.L - 086a 02df ret - 086b 00c0 0e41 lr $AR0, @0x0e41 - 086d 0081 0b8b lri $AR1, #0x0b8b - 086f 00c2 0e09 lr $AR2, @0x0e09 - 0871 1c62 mrr $AR3, $AR2 - 0872 02bf 81f9 call 0x81f9 - 0874 00f8 0bac sr @0x0bac, $AX0.L - 0876 02df ret - 0877 00c0 0e40 lr $AR0, @0x0e40 - 0879 0081 0b89 lri $AR1, #0x0b89 - 087b 00c2 0e08 lr $AR2, @0x0e08 - 087d 1c62 mrr $AR3, $AR2 - 087e 00c4 0e41 lr $IX0, @0x0e41 - 0880 00c5 0e09 lr $IX1, @0x0e09 - 0882 02bf 80e7 call 0x80e7 - 0884 00f8 0ba9 sr @0x0ba9, $AX0.L - 0886 00fb 0bac sr @0x0bac, $AX1.H - 0888 02df ret - 0889 00c0 0e43 lr $AR0, @0x0e43 - 088b 0081 0b97 lri $AR1, #0x0b97 - 088d 00c2 0e0a lr $AR2, @0x0e0a - 088f 1c62 mrr $AR3, $AR2 - 0890 02bf 81f9 call 0x81f9 - 0892 00f8 0baf sr @0x0baf, $AX0.L - 0894 02df ret - 0895 00c0 0e40 lr $AR0, @0x0e40 - 0897 0081 0b89 lri $AR1, #0x0b89 - 0899 00c2 0e08 lr $AR2, @0x0e08 - 089b 1c62 mrr $AR3, $AR2 - 089c 02bf 81f9 call 0x81f9 - 089e 00f8 0ba9 sr @0x0ba9, $AX0.L - 08a0 00c0 0e43 lr $AR0, @0x0e43 - 08a2 0081 0b97 lri $AR1, #0x0b97 - 08a4 00c2 0e0a lr $AR2, @0x0e0a - 08a6 1c62 mrr $AR3, $AR2 - 08a7 02bf 81f9 call 0x81f9 - 08a9 00f8 0baf sr @0x0baf, $AX0.L - 08ab 02df ret - 08ac 00c0 0e41 lr $AR0, @0x0e41 - 08ae 0081 0b8b lri $AR1, #0x0b8b - 08b0 00c2 0e09 lr $AR2, @0x0e09 - 08b2 1c62 mrr $AR3, $AR2 - 08b3 02bf 81f9 call 0x81f9 - 08b5 00f8 0bac sr @0x0bac, $AX0.L - 08b7 00c0 0e43 lr $AR0, @0x0e43 - 08b9 0081 0b97 lri $AR1, #0x0b97 - 08bb 00c2 0e0a lr $AR2, @0x0e0a - 08bd 1c62 mrr $AR3, $AR2 - 08be 02bf 81f9 call 0x81f9 - 08c0 00f8 0baf sr @0x0baf, $AX0.L - 08c2 02df ret - 08c3 00c0 0e40 lr $AR0, @0x0e40 - 08c5 0081 0b89 lri $AR1, #0x0b89 - 08c7 00c2 0e08 lr $AR2, @0x0e08 - 08c9 1c62 mrr $AR3, $AR2 - 08ca 00c4 0e41 lr $IX0, @0x0e41 - 08cc 00c5 0e09 lr $IX1, @0x0e09 - 08ce 02bf 80e7 call 0x80e7 - 08d0 00f8 0ba9 sr @0x0ba9, $AX0.L - 08d2 00fb 0bac sr @0x0bac, $AX1.H - 08d4 00c0 0e43 lr $AR0, @0x0e43 - 08d6 0081 0b97 lri $AR1, #0x0b97 - 08d8 00c2 0e0a lr $AR2, @0x0e0a - 08da 1c62 mrr $AR3, $AR2 - 08db 02bf 81f9 call 0x81f9 - 08dd 00f8 0baf sr @0x0baf, $AX0.L - 08df 02df ret - 08e0 00c0 0e40 lr $AR0, @0x0e40 - 08e2 0081 0b89 lri $AR1, #0x0b89 - 08e4 00c2 0e08 lr $AR2, @0x0e08 - 08e6 0083 0e48 lri $AR3, #0x0e48 - 08e8 02bf 845d call 0x845d - 08ea 00f8 0ba9 sr @0x0ba9, $AX0.L - 08ec 02df ret - 08ed 00c0 0e41 lr $AR0, @0x0e41 - 08ef 0081 0b8b lri $AR1, #0x0b8b - 08f1 00c2 0e09 lr $AR2, @0x0e09 - 08f3 0083 0e48 lri $AR3, #0x0e48 - 08f5 02bf 845d call 0x845d - 08f7 00f8 0bac sr @0x0bac, $AX0.L - 08f9 02df ret - 08fa 00c0 0e40 lr $AR0, @0x0e40 - 08fc 0081 0b89 lri $AR1, #0x0b89 - 08fe 00c2 0e08 lr $AR2, @0x0e08 - 0900 0083 0e48 lri $AR3, #0x0e48 - 0902 00c4 0e41 lr $IX0, @0x0e41 - 0904 00c5 0e09 lr $IX1, @0x0e09 - 0906 02bf 8282 call 0x8282 - 0908 00f8 0ba9 sr @0x0ba9, $AX0.L - 090a 00fb 0bac sr @0x0bac, $AX1.H - 090c 02df ret - 090d 00c0 0e43 lr $AR0, @0x0e43 - 090f 0081 0b97 lri $AR1, #0x0b97 - 0911 00c2 0e0a lr $AR2, @0x0e0a - 0913 0083 0e48 lri $AR3, #0x0e48 - 0915 02bf 845d call 0x845d - 0917 00f8 0baf sr @0x0baf, $AX0.L - 0919 02df ret - 091a 00c0 0e40 lr $AR0, @0x0e40 - 091c 0081 0b89 lri $AR1, #0x0b89 - 091e 00c2 0e08 lr $AR2, @0x0e08 - 0920 0083 0e48 lri $AR3, #0x0e48 - 0922 02bf 845d call 0x845d - 0924 00f8 0ba9 sr @0x0ba9, $AX0.L - 0926 00c0 0e43 lr $AR0, @0x0e43 - 0928 0081 0b97 lri $AR1, #0x0b97 - 092a 00c2 0e0a lr $AR2, @0x0e0a - 092c 0083 0e48 lri $AR3, #0x0e48 - 092e 02bf 845d call 0x845d - 0930 00f8 0baf sr @0x0baf, $AX0.L - 0932 02df ret - 0933 00c0 0e41 lr $AR0, @0x0e41 - 0935 0081 0b8b lri $AR1, #0x0b8b - 0937 00c2 0e09 lr $AR2, @0x0e09 - 0939 0083 0e48 lri $AR3, #0x0e48 - 093b 02bf 845d call 0x845d - 093d 00f8 0bac sr @0x0bac, $AX0.L - 093f 00c0 0e43 lr $AR0, @0x0e43 - 0941 0081 0b97 lri $AR1, #0x0b97 - 0943 00c2 0e0a lr $AR2, @0x0e0a - 0945 0083 0e48 lri $AR3, #0x0e48 - 0947 02bf 845d call 0x845d - 0949 00f8 0baf sr @0x0baf, $AX0.L - 094b 02df ret - 094c 00c0 0e40 lr $AR0, @0x0e40 - 094e 0081 0b89 lri $AR1, #0x0b89 - 0950 00c2 0e08 lr $AR2, @0x0e08 - 0952 0083 0e48 lri $AR3, #0x0e48 - 0954 00c4 0e41 lr $IX0, @0x0e41 - 0956 00c5 0e09 lr $IX1, @0x0e09 - 0958 02bf 8282 call 0x8282 - 095a 00f8 0ba9 sr @0x0ba9, $AX0.L - 095c 00fb 0bac sr @0x0bac, $AX1.H - 095e 00c0 0e43 lr $AR0, @0x0e43 - 0960 0081 0b97 lri $AR1, #0x0b97 - 0962 00c2 0e0a lr $AR2, @0x0e0a - 0964 0083 0e48 lri $AR3, #0x0e48 - 0966 02bf 845d call 0x845d - 0968 00f8 0baf sr @0x0baf, $AX0.L - 096a 02df ret - 096b 00c0 0e40 lr $AR0, @0x0e40 - 096d 0081 0b8d lri $AR1, #0x0b8d - 096f 00c2 0e0b lr $AR2, @0x0e0b - 0971 1c62 mrr $AR3, $AR2 - 0972 02bf 81f9 call 0x81f9 - 0974 00f8 0baa sr @0x0baa, $AX0.L - 0976 02df ret - 0977 00c0 0e41 lr $AR0, @0x0e41 - 0979 0081 0b8f lri $AR1, #0x0b8f - 097b 00c2 0e0c lr $AR2, @0x0e0c - 097d 1c62 mrr $AR3, $AR2 - 097e 02bf 81f9 call 0x81f9 - 0980 00f8 0bad sr @0x0bad, $AX0.L - 0982 02df ret - 0983 00c0 0e40 lr $AR0, @0x0e40 - 0985 0081 0b8d lri $AR1, #0x0b8d - 0987 00c2 0e0b lr $AR2, @0x0e0b - 0989 1c62 mrr $AR3, $AR2 - 098a 00c4 0e41 lr $IX0, @0x0e41 - 098c 00c5 0e0c lr $IX1, @0x0e0c - 098e 02bf 80e7 call 0x80e7 - 0990 00f8 0baa sr @0x0baa, $AX0.L - 0992 00fb 0bad sr @0x0bad, $AX1.H - 0994 02df ret - 0995 00c0 0e40 lr $AR0, @0x0e40 - 0997 0081 0b8d lri $AR1, #0x0b8d - 0999 00c2 0e0b lr $AR2, @0x0e0b - 099b 0083 0e48 lri $AR3, #0x0e48 - 099d 02bf 845d call 0x845d - 099f 00f8 0baa sr @0x0baa, $AX0.L - 09a1 02df ret - 09a2 00c0 0e41 lr $AR0, @0x0e41 - 09a4 0081 0b8f lri $AR1, #0x0b8f - 09a6 00c2 0e0c lr $AR2, @0x0e0c - 09a8 0083 0e48 lri $AR3, #0x0e48 - 09aa 02bf 845d call 0x845d - 09ac 00f8 0bad sr @0x0bad, $AX0.L - 09ae 02df ret - 09af 00c0 0e40 lr $AR0, @0x0e40 - 09b1 0081 0b8d lri $AR1, #0x0b8d - 09b3 00c2 0e0b lr $AR2, @0x0e0b - 09b5 0083 0e48 lri $AR3, #0x0e48 - 09b7 00c4 0e41 lr $IX0, @0x0e41 - 09b9 00c5 0e0c lr $IX1, @0x0e0c - 09bb 02bf 8282 call 0x8282 - 09bd 00f8 0baa sr @0x0baa, $AX0.L - 09bf 00fb 0bad sr @0x0bad, $AX1.H - 09c1 02df ret - 09c2 00c0 0e43 lr $AR0, @0x0e43 - 09c4 0081 0b99 lri $AR1, #0x0b99 - 09c6 00c2 0e0d lr $AR2, @0x0e0d - 09c8 1c62 mrr $AR3, $AR2 - 09c9 02bf 81f9 call 0x81f9 - 09cb 00f8 0bb0 sr @0x0bb0, $AX0.L - 09cd 02df ret - 09ce 00c0 0e43 lr $AR0, @0x0e43 - 09d0 0081 0b99 lri $AR1, #0x0b99 - 09d2 00c2 0e0d lr $AR2, @0x0e0d - 09d4 1c62 mrr $AR3, $AR2 - 09d5 02bf 81f9 call 0x81f9 - 09d7 00f8 0bb0 sr @0x0bb0, $AX0.L - 09d9 029f 096b jmp 0x096b - 09db 00c0 0e43 lr $AR0, @0x0e43 - 09dd 0081 0b99 lri $AR1, #0x0b99 - 09df 00c2 0e0d lr $AR2, @0x0e0d - 09e1 1c62 mrr $AR3, $AR2 - 09e2 02bf 81f9 call 0x81f9 - 09e4 00f8 0bb0 sr @0x0bb0, $AX0.L - 09e6 029f 0977 jmp 0x0977 - 09e8 00c0 0e43 lr $AR0, @0x0e43 - 09ea 0081 0b99 lri $AR1, #0x0b99 - 09ec 00c2 0e0d lr $AR2, @0x0e0d - 09ee 1c62 mrr $AR3, $AR2 - 09ef 02bf 81f9 call 0x81f9 - 09f1 00f8 0bb0 sr @0x0bb0, $AX0.L - 09f3 029f 0983 jmp 0x0983 - 09f5 00c0 0e43 lr $AR0, @0x0e43 - 09f7 0081 0b99 lri $AR1, #0x0b99 - 09f9 00c2 0e0d lr $AR2, @0x0e0d - 09fb 1c62 mrr $AR3, $AR2 - 09fc 02bf 81f9 call 0x81f9 - 09fe 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a00 029f 0995 jmp 0x0995 - 0a02 00c0 0e43 lr $AR0, @0x0e43 - 0a04 0081 0b99 lri $AR1, #0x0b99 - 0a06 00c2 0e0d lr $AR2, @0x0e0d - 0a08 1c62 mrr $AR3, $AR2 - 0a09 02bf 81f9 call 0x81f9 - 0a0b 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a0d 029f 09a2 jmp 0x09a2 - 0a0f 00c0 0e43 lr $AR0, @0x0e43 - 0a11 0081 0b99 lri $AR1, #0x0b99 - 0a13 00c2 0e0d lr $AR2, @0x0e0d - 0a15 1c62 mrr $AR3, $AR2 - 0a16 02bf 81f9 call 0x81f9 - 0a18 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a1a 029f 09af jmp 0x09af - 0a1c 00c0 0e43 lr $AR0, @0x0e43 - 0a1e 0081 0b99 lri $AR1, #0x0b99 - 0a20 00c2 0e0d lr $AR2, @0x0e0d - 0a22 0083 0e48 lri $AR3, #0x0e48 - 0a24 02bf 845d call 0x845d - 0a26 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a28 02df ret - 0a29 00c0 0e43 lr $AR0, @0x0e43 - 0a2b 0081 0b99 lri $AR1, #0x0b99 - 0a2d 00c2 0e0d lr $AR2, @0x0e0d - 0a2f 0083 0e48 lri $AR3, #0x0e48 - 0a31 02bf 845d call 0x845d - 0a33 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a35 029f 096b jmp 0x096b - 0a37 00c0 0e43 lr $AR0, @0x0e43 - 0a39 0081 0b99 lri $AR1, #0x0b99 - 0a3b 00c2 0e0d lr $AR2, @0x0e0d - 0a3d 0083 0e48 lri $AR3, #0x0e48 - 0a3f 02bf 845d call 0x845d - 0a41 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a43 029f 0977 jmp 0x0977 - 0a45 00c0 0e43 lr $AR0, @0x0e43 - 0a47 0081 0b99 lri $AR1, #0x0b99 - 0a49 00c2 0e0d lr $AR2, @0x0e0d - 0a4b 0083 0e48 lri $AR3, #0x0e48 - 0a4d 02bf 845d call 0x845d - 0a4f 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a51 029f 0983 jmp 0x0983 - 0a53 00c0 0e43 lr $AR0, @0x0e43 - 0a55 0081 0b99 lri $AR1, #0x0b99 - 0a57 00c2 0e0d lr $AR2, @0x0e0d - 0a59 0083 0e48 lri $AR3, #0x0e48 - 0a5b 02bf 845d call 0x845d - 0a5d 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a5f 029f 0995 jmp 0x0995 - 0a61 00c0 0e43 lr $AR0, @0x0e43 - 0a63 0081 0b99 lri $AR1, #0x0b99 - 0a65 00c2 0e0d lr $AR2, @0x0e0d - 0a67 0083 0e48 lri $AR3, #0x0e48 - 0a69 02bf 845d call 0x845d - 0a6b 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a6d 029f 09a2 jmp 0x09a2 - 0a6f 00c0 0e43 lr $AR0, @0x0e43 - 0a71 0081 0b99 lri $AR1, #0x0b99 - 0a73 00c2 0e0d lr $AR2, @0x0e0d - 0a75 0083 0e48 lri $AR3, #0x0e48 - 0a77 02bf 845d call 0x845d - 0a79 00f8 0bb0 sr @0x0bb0, $AX0.L - 0a7b 029f 09af jmp 0x09af - 0a7d 00c0 0e40 lr $AR0, @0x0e40 - 0a7f 0081 0b91 lri $AR1, #0x0b91 - 0a81 00c2 0e0e lr $AR2, @0x0e0e - 0a83 1c62 mrr $AR3, $AR2 - 0a84 02bf 81f9 call 0x81f9 - 0a86 00f8 0bab sr @0x0bab, $AX0.L - 0a88 02df ret - 0a89 00c0 0e41 lr $AR0, @0x0e41 - 0a8b 0081 0b93 lri $AR1, #0x0b93 - 0a8d 00c2 0e0f lr $AR2, @0x0e0f - 0a8f 1c62 mrr $AR3, $AR2 - 0a90 02bf 81f9 call 0x81f9 - 0a92 00f8 0bae sr @0x0bae, $AX0.L - 0a94 02df ret - 0a95 00c0 0e40 lr $AR0, @0x0e40 - 0a97 0081 0b91 lri $AR1, #0x0b91 - 0a99 00c2 0e0e lr $AR2, @0x0e0e - 0a9b 1c62 mrr $AR3, $AR2 - 0a9c 00c4 0e41 lr $IX0, @0x0e41 - 0a9e 00c5 0e0f lr $IX1, @0x0e0f - 0aa0 02bf 80e7 call 0x80e7 - 0aa2 00f8 0bab sr @0x0bab, $AX0.L - 0aa4 00fb 0bae sr @0x0bae, $AX1.H - 0aa6 02df ret - 0aa7 00c0 0e40 lr $AR0, @0x0e40 - 0aa9 0081 0b91 lri $AR1, #0x0b91 - 0aab 00c2 0e0e lr $AR2, @0x0e0e - 0aad 0083 0e48 lri $AR3, #0x0e48 - 0aaf 02bf 845d call 0x845d - 0ab1 00f8 0bab sr @0x0bab, $AX0.L - 0ab3 02df ret - 0ab4 00c0 0e41 lr $AR0, @0x0e41 - 0ab6 0081 0b93 lri $AR1, #0x0b93 - 0ab8 00c2 0e0f lr $AR2, @0x0e0f - 0aba 0083 0e48 lri $AR3, #0x0e48 - 0abc 02bf 845d call 0x845d - 0abe 00f8 0bae sr @0x0bae, $AX0.L - 0ac0 02df ret - 0ac1 00c0 0e40 lr $AR0, @0x0e40 - 0ac3 0081 0b91 lri $AR1, #0x0b91 - 0ac5 00c2 0e0e lr $AR2, @0x0e0e - 0ac7 0083 0e48 lri $AR3, #0x0e48 - 0ac9 00c4 0e41 lr $IX0, @0x0e41 - 0acb 00c5 0e0f lr $IX1, @0x0e0f - 0acd 02bf 8282 call 0x8282 - 0acf 00f8 0bab sr @0x0bab, $AX0.L - 0ad1 00fb 0bae sr @0x0bae, $AX1.H - 0ad3 02df ret - 0ad4 00c0 0e43 lr $AR0, @0x0e43 - 0ad6 0081 0b95 lri $AR1, #0x0b95 - 0ad8 00c2 0e10 lr $AR2, @0x0e10 - 0ada 1c62 mrr $AR3, $AR2 - 0adb 02bf 81f9 call 0x81f9 - 0add 00f8 0bb1 sr @0x0bb1, $AX0.L - 0adf 02df ret - 0ae0 00c0 0e43 lr $AR0, @0x0e43 - 0ae2 0081 0b95 lri $AR1, #0x0b95 - 0ae4 00c2 0e10 lr $AR2, @0x0e10 - 0ae6 1c62 mrr $AR3, $AR2 - 0ae7 02bf 81f9 call 0x81f9 - 0ae9 00f8 0bb1 sr @0x0bb1, $AX0.L - 0aeb 029f 0a7d jmp 0x0a7d - 0aed 00c0 0e43 lr $AR0, @0x0e43 - 0aef 0081 0b95 lri $AR1, #0x0b95 - 0af1 00c2 0e10 lr $AR2, @0x0e10 - 0af3 1c62 mrr $AR3, $AR2 - 0af4 02bf 81f9 call 0x81f9 - 0af6 00f8 0bb1 sr @0x0bb1, $AX0.L - 0af8 029f 0a89 jmp 0x0a89 - 0afa 00c0 0e43 lr $AR0, @0x0e43 - 0afc 0081 0b95 lri $AR1, #0x0b95 - 0afe 00c2 0e10 lr $AR2, @0x0e10 - 0b00 1c62 mrr $AR3, $AR2 - 0b01 02bf 81f9 call 0x81f9 - 0b03 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b05 029f 0a95 jmp 0x0a95 - 0b07 00c0 0e43 lr $AR0, @0x0e43 - 0b09 0081 0b95 lri $AR1, #0x0b95 - 0b0b 00c2 0e10 lr $AR2, @0x0e10 - 0b0d 1c62 mrr $AR3, $AR2 - 0b0e 02bf 81f9 call 0x81f9 - 0b10 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b12 029f 0aa7 jmp 0x0aa7 - 0b14 00c0 0e43 lr $AR0, @0x0e43 - 0b16 0081 0b95 lri $AR1, #0x0b95 - 0b18 00c2 0e10 lr $AR2, @0x0e10 - 0b1a 1c62 mrr $AR3, $AR2 - 0b1b 02bf 81f9 call 0x81f9 - 0b1d 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b1f 029f 0ab4 jmp 0x0ab4 - 0b21 00c0 0e43 lr $AR0, @0x0e43 - 0b23 0081 0b95 lri $AR1, #0x0b95 - 0b25 00c2 0e10 lr $AR2, @0x0e10 - 0b27 1c62 mrr $AR3, $AR2 - 0b28 02bf 81f9 call 0x81f9 - 0b2a 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b2c 029f 0ac1 jmp 0x0ac1 - 0b2e 00c0 0e43 lr $AR0, @0x0e43 - 0b30 0081 0b95 lri $AR1, #0x0b95 - 0b32 00c2 0e10 lr $AR2, @0x0e10 - 0b34 0083 0e48 lri $AR3, #0x0e48 - 0b36 02bf 845d call 0x845d - 0b38 02df ret - 0b39 00c0 0e43 lr $AR0, @0x0e43 - 0b3b 0081 0b95 lri $AR1, #0x0b95 - 0b3d 00c2 0e10 lr $AR2, @0x0e10 - 0b3f 0083 0e48 lri $AR3, #0x0e48 - 0b41 02bf 845d call 0x845d - 0b43 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b45 029f 0a7d jmp 0x0a7d - 0b47 00c0 0e43 lr $AR0, @0x0e43 - 0b49 0081 0b95 lri $AR1, #0x0b95 - 0b4b 00c2 0e10 lr $AR2, @0x0e10 - 0b4d 0083 0e48 lri $AR3, #0x0e48 - 0b4f 02bf 845d call 0x845d - 0b51 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b53 029f 0a89 jmp 0x0a89 - 0b55 00c0 0e43 lr $AR0, @0x0e43 - 0b57 0081 0b95 lri $AR1, #0x0b95 - 0b59 00c2 0e10 lr $AR2, @0x0e10 - 0b5b 0083 0e48 lri $AR3, #0x0e48 - 0b5d 02bf 845d call 0x845d - 0b5f 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b61 029f 0a95 jmp 0x0a95 - 0b63 00c0 0e43 lr $AR0, @0x0e43 - 0b65 0081 0b95 lri $AR1, #0x0b95 - 0b67 00c2 0e10 lr $AR2, @0x0e10 - 0b69 0083 0e48 lri $AR3, #0x0e48 - 0b6b 02bf 845d call 0x845d - 0b6d 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b6f 029f 0aa7 jmp 0x0aa7 - 0b71 00c0 0e43 lr $AR0, @0x0e43 - 0b73 0081 0b95 lri $AR1, #0x0b95 - 0b75 00c2 0e10 lr $AR2, @0x0e10 - 0b77 0083 0e48 lri $AR3, #0x0e48 - 0b79 02bf 845d call 0x845d - 0b7b 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b7d 029f 0ab4 jmp 0x0ab4 - 0b7f 00c0 0e43 lr $AR0, @0x0e43 - 0b81 0081 0b95 lri $AR1, #0x0b95 - 0b83 00c2 0e10 lr $AR2, @0x0e10 - 0b85 0083 0e48 lri $AR3, #0x0e48 - 0b87 02bf 845d call 0x845d - 0b89 00f8 0bb1 sr @0x0bb1, $AX0.L - 0b8b 029f 0ac1 jmp 0x0ac1 - 0b8d 00c0 0e43 lr $AR0, @0x0e43 - 0b8f 0081 0b91 lri $AR1, #0x0b91 - 0b91 00c2 0e0e lr $AR2, @0x0e0e - 0b93 1c62 mrr $AR3, $AR2 - 0b94 02bf 81f9 call 0x81f9 - 0b96 00f8 0bab sr @0x0bab, $AX0.L - 0b98 02df ret - 0b99 00c0 0e43 lr $AR0, @0x0e43 - 0b9b 0081 0b93 lri $AR1, #0x0b93 - 0b9d 00c2 0e0f lr $AR2, @0x0e0f - 0b9f 1c62 mrr $AR3, $AR2 - 0ba0 02bf 81f9 call 0x81f9 - 0ba2 00f8 0bae sr @0x0bae, $AX0.L - 0ba4 02df ret - 0ba5 00c0 0e43 lr $AR0, @0x0e43 - 0ba7 0081 0b91 lri $AR1, #0x0b91 - 0ba9 00c2 0e0e lr $AR2, @0x0e0e - 0bab 1c62 mrr $AR3, $AR2 - 0bac 00c4 0e43 lr $IX0, @0x0e43 - 0bae 00c5 0e0f lr $IX1, @0x0e0f - 0bb0 02bf 80e7 call 0x80e7 - 0bb2 00f8 0bab sr @0x0bab, $AX0.L - 0bb4 00fb 0bae sr @0x0bae, $AX1.H - 0bb6 02df ret - 0bb7 00c0 0e43 lr $AR0, @0x0e43 - 0bb9 0081 0b91 lri $AR1, #0x0b91 - 0bbb 00c2 0e0e lr $AR2, @0x0e0e - 0bbd 0083 0e48 lri $AR3, #0x0e48 - 0bbf 02bf 845d call 0x845d - 0bc1 00f8 0bab sr @0x0bab, $AX0.L - 0bc3 02df ret - 0bc4 00c0 0e43 lr $AR0, @0x0e43 - 0bc6 0081 0b93 lri $AR1, #0x0b93 - 0bc8 00c2 0e0f lr $AR2, @0x0e0f - 0bca 0083 0e48 lri $AR3, #0x0e48 - 0bcc 02bf 845d call 0x845d - 0bce 00f8 0bae sr @0x0bae, $AX0.L - 0bd0 02df ret - 0bd1 00c0 0e43 lr $AR0, @0x0e43 - 0bd3 0081 0b91 lri $AR1, #0x0b91 - 0bd5 00c2 0e0e lr $AR2, @0x0e0e - 0bd7 0083 0e48 lri $AR3, #0x0e48 - 0bd9 00c4 0e43 lr $IX0, @0x0e43 - 0bdb 00c5 0e0f lr $IX1, @0x0e0f - 0bdd 02bf 8282 call 0x8282 - 0bdf 00f8 0bab sr @0x0bab, $AX0.L - 0be1 00fb 0bae sr @0x0bae, $AX1.H - 0be3 02df ret - 0be4 00c0 0e43 lr $AR0, @0x0e43 - 0be6 0081 0b95 lri $AR1, #0x0b95 - 0be8 00c2 0e10 lr $AR2, @0x0e10 - 0bea 1c62 mrr $AR3, $AR2 - 0beb 02bf 81f9 call 0x81f9 - 0bed 00f8 0bb1 sr @0x0bb1, $AX0.L - 0bef 029f 0b8d jmp 0x0b8d - 0bf1 00c0 0e43 lr $AR0, @0x0e43 - 0bf3 0081 0b95 lri $AR1, #0x0b95 - 0bf5 00c2 0e10 lr $AR2, @0x0e10 - 0bf7 1c62 mrr $AR3, $AR2 - 0bf8 02bf 81f9 call 0x81f9 - 0bfa 00f8 0bb1 sr @0x0bb1, $AX0.L - 0bfc 029f 0b99 jmp 0x0b99 - 0bfe 00c0 0e43 lr $AR0, @0x0e43 - 0c00 0081 0b95 lri $AR1, #0x0b95 - 0c02 00c2 0e10 lr $AR2, @0x0e10 - 0c04 1c62 mrr $AR3, $AR2 - 0c05 02bf 81f9 call 0x81f9 - 0c07 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c09 029f 0ba5 jmp 0x0ba5 - 0c0b 00c0 0e43 lr $AR0, @0x0e43 - 0c0d 0081 0b95 lri $AR1, #0x0b95 - 0c0f 00c2 0e10 lr $AR2, @0x0e10 - 0c11 1c62 mrr $AR3, $AR2 - 0c12 02bf 81f9 call 0x81f9 - 0c14 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c16 029f 0bb7 jmp 0x0bb7 - 0c18 00c0 0e43 lr $AR0, @0x0e43 - 0c1a 0081 0b95 lri $AR1, #0x0b95 - 0c1c 00c2 0e10 lr $AR2, @0x0e10 - 0c1e 1c62 mrr $AR3, $AR2 - 0c1f 02bf 81f9 call 0x81f9 - 0c21 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c23 029f 0bc4 jmp 0x0bc4 - 0c25 00c0 0e43 lr $AR0, @0x0e43 - 0c27 0081 0b95 lri $AR1, #0x0b95 - 0c29 00c2 0e10 lr $AR2, @0x0e10 - 0c2b 1c62 mrr $AR3, $AR2 - 0c2c 02bf 81f9 call 0x81f9 - 0c2e 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c30 029f 0bd1 jmp 0x0bd1 - 0c32 00c0 0e43 lr $AR0, @0x0e43 - 0c34 0081 0b95 lri $AR1, #0x0b95 - 0c36 00c2 0e10 lr $AR2, @0x0e10 - 0c38 0083 0e48 lri $AR3, #0x0e48 - 0c3a 02bf 845d call 0x845d - 0c3c 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c3e 029f 0b8d jmp 0x0b8d - 0c40 00c0 0e43 lr $AR0, @0x0e43 - 0c42 0081 0b95 lri $AR1, #0x0b95 - 0c44 00c2 0e10 lr $AR2, @0x0e10 - 0c46 0083 0e48 lri $AR3, #0x0e48 - 0c48 02bf 845d call 0x845d - 0c4a 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c4c 029f 0b99 jmp 0x0b99 - 0c4e 00c0 0e43 lr $AR0, @0x0e43 - 0c50 0081 0b95 lri $AR1, #0x0b95 - 0c52 00c2 0e10 lr $AR2, @0x0e10 - 0c54 0083 0e48 lri $AR3, #0x0e48 - 0c56 02bf 845d call 0x845d - 0c58 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c5a 029f 0ba5 jmp 0x0ba5 - 0c5c 00c0 0e43 lr $AR0, @0x0e43 - 0c5e 0081 0b95 lri $AR1, #0x0b95 - 0c60 00c2 0e10 lr $AR2, @0x0e10 - 0c62 0083 0e48 lri $AR3, #0x0e48 - 0c64 02bf 845d call 0x845d - 0c66 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c68 029f 0bb7 jmp 0x0bb7 - 0c6a 00c0 0e43 lr $AR0, @0x0e43 - 0c6c 0081 0b95 lri $AR1, #0x0b95 - 0c6e 00c2 0e10 lr $AR2, @0x0e10 - 0c70 0083 0e48 lri $AR3, #0x0e48 - 0c72 02bf 845d call 0x845d - 0c74 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c76 029f 0bc4 jmp 0x0bc4 - 0c78 00c0 0e43 lr $AR0, @0x0e43 - 0c7a 0081 0b95 lri $AR1, #0x0b95 - 0c7c 00c2 0e10 lr $AR2, @0x0e10 - 0c7e 0083 0e48 lri $AR3, #0x0e48 - 0c80 02bf 845d call 0x845d - 0c82 00f8 0bb1 sr @0x0bb1, $AX0.L - 0c84 029f 0bd1 jmp 0x0bd1 - -// Is this a jump table?? - 0c86 0118 cw 0x0118 ; *** UNKNOWN OPCODE *** - 0c87 01d4 cw 0x01d4 ; *** UNKNOWN OPCODE *** - 0c88 0252 cw 0x0252 ; *** UNKNOWN OPCODE *** - 0c89 02f8 cw 0x02f8 ; *** UNKNOWN OPCODE *** - 0c8a 0509 addis $ACC1, #0x09 - 0c8b 051d addis $ACC1, #0x1d - 0c8c 01fb cw 0x01fb ; *** UNKNOWN OPCODE *** - 0c8d 066a cmpis $ACC0, #0x6a - 0c8e 0d10 lris $AC1.L, #0x10 - 0c8f 01f5 cw 0x01f5 ; *** UNKNOWN OPCODE *** - 0c90 056e addis $ACC1, #0x6e - 0c91 056a addis $ACC1, #0x6a - 0c92 056c addis $ACC1, #0x6c - 0c93 023f cw 0x023f ; *** UNKNOWN OPCODE *** - 0c94 0531 addis $ACC1, #0x31 - 0c95 0570 addis $ACC1, #0x70 - 0c96 0d8a lris $AC1.L, #0x8a - 0c97 020b cw 0x020b ; *** UNKNOWN OPCODE *** - - 0c98 0082 0e00 lri $AR2, #0x0e00 - 0c9a 085e lris $AX0.L, #0x5e - 0c9b 085f lris $AX0.L, #0x5f - 0c9c 086b lris $AX0.L, #0x6b - 0c9d 0877 lris $AX0.L, #0x77 - 0c9e 0889 lris $AX0.L, #0x89 - 0c9f 0895 lris $AX0.L, #0x95 - 0ca0 08ac lris $AX0.L, #0xac - 0ca1 08c3 lris $AX0.L, #0xc3 - 0ca2 085e lris $AX0.L, #0x5e - 0ca3 08e0 lris $AX0.L, #0xe0 - 0ca4 08ed lris $AX0.L, #0xed - 0ca5 08fa lris $AX0.L, #0xfa - 0ca6 090d lris $AX1.L, #0x0d - 0ca7 091a lris $AX1.L, #0x1a - 0ca8 0933 lris $AX1.L, #0x33 - 0ca9 094c lris $AX1.L, #0x4c - 0caa 085e lris $AX0.L, #0x5e - 0cab 096b lris $AX1.L, #0x6b - 0cac 0977 lris $AX1.L, #0x77 - 0cad 0983 lris $AX1.L, #0x83 - 0cae 085e lris $AX0.L, #0x5e - 0caf 0995 lris $AX1.L, #0x95 - 0cb0 09a2 lris $AX1.L, #0xa2 - 0cb1 09af lris $AX1.L, #0xaf - 0cb2 09c2 lris $AX1.L, #0xc2 - 0cb3 09ce lris $AX1.L, #0xce - 0cb4 09db lris $AX1.L, #0xdb - 0cb5 09e8 lris $AX1.L, #0xe8 - 0cb6 09c2 lris $AX1.L, #0xc2 - 0cb7 09f5 lris $AX1.L, #0xf5 - 0cb8 0a02 lris $AX0.H, #0x02 - 0cb9 0a0f lris $AX0.H, #0x0f - 0cba 085e lris $AX0.L, #0x5e - 0cbb 096b lris $AX1.L, #0x6b - 0cbc 0977 lris $AX1.L, #0x77 - 0cbd 0983 lris $AX1.L, #0x83 - 0cbe 085e lris $AX0.L, #0x5e - 0cbf 0995 lris $AX1.L, #0x95 - 0cc0 09a2 lris $AX1.L, #0xa2 - 0cc1 09af lris $AX1.L, #0xaf - 0cc2 0a1c lris $AX0.H, #0x1c - 0cc3 0a29 lris $AX0.H, #0x29 - 0cc4 0a37 lris $AX0.H, #0x37 - 0cc5 0a45 lris $AX0.H, #0x45 - 0cc6 0a1c lris $AX0.H, #0x1c - 0cc7 0a53 lris $AX0.H, #0x53 - 0cc8 0a61 lris $AX0.H, #0x61 - 0cc9 0a6f lris $AX0.H, #0x6f - 0cca 085e lris $AX0.L, #0x5e - 0ccb 0a7d lris $AX0.H, #0x7d - 0ccc 0a89 lris $AX0.H, #0x89 - 0ccd 0a95 lris $AX0.H, #0x95 - 0cce 085e lris $AX0.L, #0x5e - 0ccf 0aa7 lris $AX0.H, #0xa7 - 0cd0 0ab4 lris $AX0.H, #0xb4 - 0cd1 0ac1 lris $AX0.H, #0xc1 - 0cd2 0ad4 lris $AX0.H, #0xd4 - 0cd3 0ae0 lris $AX0.H, #0xe0 - 0cd4 0aed lris $AX0.H, #0xed - 0cd5 0afa lris $AX0.H, #0xfa - 0cd6 0ad4 lris $AX0.H, #0xd4 - 0cd7 0b07 lris $AX1.H, #0x07 - 0cd8 0b14 lris $AX1.H, #0x14 - 0cd9 0b21 lris $AX1.H, #0x21 - 0cda 085e lris $AX0.L, #0x5e - 0cdb 0a7d lris $AX0.H, #0x7d - 0cdc 0a89 lris $AX0.H, #0x89 - 0cdd 0a95 lris $AX0.H, #0x95 - 0cde 085e lris $AX0.L, #0x5e - 0cdf 0aa7 lris $AX0.H, #0xa7 - 0ce0 0ab4 lris $AX0.H, #0xb4 - 0ce1 0ac1 lris $AX0.H, #0xc1 - 0ce2 0b2e lris $AX1.H, #0x2e - 0ce3 0b39 lris $AX1.H, #0x39 - 0ce4 0b47 lris $AX1.H, #0x47 - 0ce5 0b55 lris $AX1.H, #0x55 - 0ce6 0b2e lris $AX1.H, #0x2e - 0ce7 0b63 lris $AX1.H, #0x63 - 0ce8 0b71 lris $AX1.H, #0x71 - 0ce9 0b7f lris $AX1.H, #0x7f - 0cea 085e lris $AX0.L, #0x5e - 0ceb 0b8d lris $AX1.H, #0x8d - 0cec 0b99 lris $AX1.H, #0x99 - 0ced 0ba5 lris $AX1.H, #0xa5 - 0cee 085e lris $AX0.L, #0x5e - 0cef 0bb7 lris $AX1.H, #0xb7 - 0cf0 0bc4 lris $AX1.H, #0xc4 - 0cf1 0bd1 lris $AX1.H, #0xd1 - 0cf2 0ad4 lris $AX0.H, #0xd4 - 0cf3 0be4 lris $AX1.H, #0xe4 - 0cf4 0bf1 lris $AX1.H, #0xf1 - 0cf5 0bfe lris $AX1.H, #0xfe - 0cf6 0ad4 lris $AX0.H, #0xd4 - 0cf7 0c0b lris $AC0.L, #0x0b - 0cf8 0c18 lris $AC0.L, #0x18 - 0cf9 0c25 lris $AC0.L, #0x25 - 0cfa 085e lris $AX0.L, #0x5e - 0cfb 0b8d lris $AX1.H, #0x8d - 0cfc 0b99 lris $AX1.H, #0x99 - 0cfd 0ba5 lris $AX1.H, #0xa5 - 0cfe 085e lris $AX0.L, #0x5e - 0cff 0bb7 lris $AX1.H, #0xb7 - 0d00 0bc4 lris $AX1.H, #0xc4 - 0d01 0bd1 lris $AX1.H, #0xd1 - 0d02 0b2e lris $AX1.H, #0x2e - 0d03 0c32 lris $AC0.L, #0x32 - 0d04 0c40 lris $AC0.L, #0x40 - 0d05 0c4e lris $AC0.L, #0x4e - 0d06 0b2e lris $AX1.H, #0x2e - 0d07 0c5c lris $AC0.L, #0x5c - 0d08 0c6a lris $AC0.L, #0x6a - 0d09 0c78 lris $AC0.L, #0x78 - 0d0a 069e cmpis $ACC0, #0x9e - 0d0b 0753 cmpis $ACC1, #0x53 - 0d0c 07fd cmpis $ACC1, #0xfd - 0d0d 1000 loopi #0x00 - 0d0e 1200 sbclr #0x00 - 0d0f 1400 lsl $ACC0, #0 - 0d10 8e00 set16 - 0d11 8100 clr $ACC0 - 0d12 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0d13 191c lrri $AC0.L, @$AR0 - 0d14 2ece srs @DSMAH, $AC0.M - 0d15 2ccf srs @DSMAL, $AC0.L - 0d16 16cd 0e80 si @DSPA, #0x0e80 - 0d18 16c9 0000 si @DSCR, #0x0000 - 0d1a 16cb 0100 si @DSBL, #0x0100 - 0d1c 1f7e mrr $AX1.H, $AC0.M - 0d1d 1f3c mrr $AX1.L, $AC0.L - 0d1e 8100 clr $ACC0 - 0d1f 26c9 lrs $AC0.M, @DSCR - 0d20 02a0 0004 andf $AC0.M, #0x0004 - 0d22 029c 0d1f jlnz 0x0d1f - 0d24 191e lrri $AC0.M, @$AR0 - 0d25 191c lrri $AC0.L, @$AR0 - 0d26 2ece srs @DSMAH, $AC0.M - 0d27 2ccf srs @DSMAL, $AC0.L - 0d28 16cd 0280 si @DSPA, #0x0280 - 0d2a 16c9 0000 si @DSCR, #0x0000 - 0d2c 16cb 0280 si @DSBL, #0x0280 - 0d2e 1c80 mrr $IX0, $AR0 - 0d2f 0080 0280 lri $AR0, #0x0280 - 0d31 00c1 0e1b lr $AR1, @0x0e1b - 0d33 0085 0000 lri $IX1, #0x0000 - 0d35 0089 007f lri $WR1, #0x007f - 0d37 0082 0f00 lri $AR2, #0x0f00 - 0d39 0083 16b4 lri $AR3, #0x16b4 - 0d3b 1ce3 mrr $IX3, $AR3 - 0d3c 8100 clr $ACC0 - 0d3d 26c9 lrs $AC0.M, @DSCR - 0d3e 02a0 0004 andf $AC0.M, #0x0004 - 0d40 029c 0d3d jlnz 0x0d3d - 0d42 8f00 set40 - 0d43 8a78 m2'l : $AC1.M, @$AR0 - 0d44 8c68 clr15'l : $AC1.L, @$AR0 - 0d45 f100 lsl16 $ACC1 - 0d46 1a3f srr @$AR1, $AC1.M - 0d47 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0d48 107e loopi #0x7e - 0d49 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d4a f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d4b f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0 - 0d4c 6e68 movp'l $ACC0 : $AC1.L, @$AR0 - 0d4d f132 lsl16's $ACC1 : @$AR2, $AC0.M - 0d4e 1a3f srr @$AR1, $AC1.M - 0d4f 119e 0d59 bloopi #0x9e, 0x0d59 - 0d51 1c67 mrr $AR3, $IX3 - 0d52 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0d53 107e loopi #0x7e - 0d54 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d55 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d56 f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0 - 0d57 6e68 movp'l $ACC0 : $AC1.L, @$AR0 - 0d58 f132 lsl16's $ACC1 : @$AR2, $AC0.M - 0d59 1a3f srr @$AR1, $AC1.M - 0d5a 1c67 mrr $AR3, $IX3 - 0d5b 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3 - 0d5c 107e loopi #0x7e - 0d5d f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d5e f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3 - 0d5f f200 madd $AX0.L, $AX0.H - 0d60 6e00 movp $ACC0 - 0d61 1b5e srri @$AR2, $AC0.M - 0d62 00e1 0e1b sr @0x0e1b, $AR1 - 0d64 0080 0280 lri $AR0, #0x0280 - 0d66 0083 0f00 lri $AR3, #0x0f00 - 0d68 0081 0000 lri $AR1, #0x0000 - 0d6a 0082 0140 lri $AR2, #0x0140 - 0d6c 0089 ffff lri $WR1, #0xffff - 0d6e 8900 clr $ACC1 - 0d6f 8100 clr $ACC0 - 0d70 8f00 set40 - 0d71 11a0 0d79 bloopi #0xa0, 0x0d79 - 0d73 197f lrri $AC1.M, @$AR3 - 0d74 9930 asr16's $ACC1 : @$AR0, $AC0.M - 0d75 1b1e srri @$AR0, $AC0.M - 0d76 1b3f srri @$AR1, $AC1.M - 0d77 7d29 neg's $ACC1 : @$AR1, $AC1.L - 0d78 1b5f srri @$AR2, $AC1.M - 0d79 1b5d srri @$AR2, $AC1.L - 0d7a 8e00 set16 - 0d7b 1fdb mrr $AC0.M, $AX1.H - 0d7c 1f99 mrr $AC0.L, $AX1.L - 0d7d 2ece srs @DSMAH, $AC0.M - 0d7e 2ccf srs @DSMAL, $AC0.L - 0d7f 16cd 0e80 si @DSPA, #0x0e80 - 0d81 16c9 0001 si @DSCR, #0x0001 - 0d83 16cb 0100 si @DSBL, #0x0100 - 0d85 02bf 0652 call 0652_WaitDMA - 0d87 1c04 mrr $AR0, $IX0 - 0d88 029f 0068 jmp 0x0068 - 0d8a 8e00 set16 - 0d8b 8100 clr $ACC0 - 0d8c 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0d8d 191c lrri $AC0.L, @$AR0 - 0d8e 2ece srs @DSMAH, $AC0.M - 0d8f 2ccf srs @DSMAL, $AC0.L - 0d90 16cd 07c0 si @DSPA, #0x07c0 - 0d92 16c9 0001 si @DSCR, #0x0001 - 0d94 16cb 0500 si @DSBL, #0x0500 - 0d96 02bf 0652 call 0652_WaitDMA - 0d98 8100 clr $ACC0 - 0d99 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0d9a 191c lrri $AC0.L, @$AR0 - 0d9b 2ece srs @DSMAH, $AC0.M - 0d9c 2ccf srs @DSMAL, $AC0.L - 0d9d 16cd 07c0 si @DSPA, #0x07c0 - 0d9f 16c9 0000 si @DSCR, #0x0000 - 0da1 8900 clr $ACC1 - 0da2 0d20 lris $AC1.L, #0x20 - 0da3 2dcb srs @DSBL, $AC1.L - 0da4 4c00 add $ACC0, $ACC1 - 0da5 1c80 mrr $IX0, $AR0 - 0da6 0080 07c0 lri $AR0, #0x07c0 - 0da8 0083 0000 lri $AR3, #0x0000 - 0daa 1c43 mrr $AR2, $AR3 - 0dab 0a00 lris $AX0.H, #0x00 - 0dac 27c9 lrs $AC1.M, @DSCR - 0dad 03a0 0004 andf $AC1.M, #0x0004 - 0daf 029c 0dac jlnz 0x0dac - 0db1 2ece srs @DSMAH, $AC0.M - 0db2 2ccf srs @DSMAL, $AC0.L - 0db3 16cd 07d0 si @DSPA, #0x07d0 - 0db5 16c9 0000 si @DSCR, #0x0000 - 0db7 16cb 04e0 si @DSBL, #0x04e0 - 0db9 8f00 set40 - 0dba 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dbb 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dbc 6a00 movax $ACC0, $AX1.L - 0dbd 4800 addax $ACC0, $AX0.L - 0dbe 114f 0dc7 bloopi #0x4f, 0x0dc7 - 0dc0 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dc1 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dc2 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0dc3 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0dc4 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dc5 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dc6 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 0dc7 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 0dc8 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dc9 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dca 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0dcb 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0dcc 1b5f srri @$AR2, $AC1.M - 0dcd 1b5d srri @$AR2, $AC1.L - 0dce 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dcf 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dd0 6800 movax $ACC0, $AX0.L - 0dd1 7c00 neg $ACC0 - 0dd2 4a00 addax $ACC0, $AX1.L - 0dd3 114f 0dde bloopi #0x4f, 0x0dde - 0dd5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0dd6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0dd7 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0dd8 7d00 neg $ACC1 - 0dd9 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0dda 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0ddb 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0ddc 683a movax's $ACC0, $AX0.L : @$AR2, $AC1.M - 0ddd 7c00 neg $ACC0 - 0dde 4a2a addax's $ACC0, $AX1.L : @$AR2, $AC1.L - 0ddf 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0 - 0de0 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0 - 0de1 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M - 0de2 7d00 neg $ACC1 - 0de3 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L - 0de4 1b5f srri @$AR2, $AC1.M - 0de5 1b5d srri @$AR2, $AC1.L - 0de6 1c04 mrr $AR0, $IX0 - 0de7 029f 0068 jmp 0x0068 - 0de9 8f00 set40 - 0dea 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0deb 80c1 nx'ld : $AX0.L, $AX1.L, @$AR1 - 0dec 6a00 movax $ACC0, $AX1.L - 0ded 4800 addax $ACC0, $AX0.L - 0dee 114f 0df7 bloopi #0x4f, 0x0df7 - 0df0 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0df1 80c1 nx'ld : $AX0.L, $AX1.L, @$AR1 - 0df2 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0df3 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0df4 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0df5 80c1 nx'ld : $AX0.L, $AX1.L, @$AR1 - 0df6 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M - 0df7 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L - 0df8 80f1 nx'ld : $AX0.H, $AX1.H, @$AR1 - 0df9 80c1 nx'ld : $AX0.L, $AX1.L, @$AR1 - 0dfa 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M - 0dfb 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L - 0dfc 1b5f srri @$AR2, $AC1.M - 0dfd 1b5d srri @$AR2, $AC1.L - 0dfe 8e00 set16 - 0dff 02df ret - 0e00 8e00 set16 - 0e01 8100 clr $ACC0 - 0e02 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e03 191c lrri $AC0.L, @$AR0 - 0e04 2ece srs @DSMAH, $AC0.M - 0e05 2ccf srs @DSMAL, $AC0.L - 0e06 16cd 0400 si @DSPA, #0x0400 - 0e08 16c9 0001 si @DSCR, #0x0001 - 0e0a 16cb 0780 si @DSBL, #0x0780 - 0e0c 02bf 0652 call 0652_WaitDMA - 0e0e 8100 clr $ACC0 - 0e0f 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e10 191c lrri $AC0.L, @$AR0 - 0e11 2ece srs @DSMAH, $AC0.M - 0e12 2ccf srs @DSMAL, $AC0.L - 0e13 16cd 0a40 si @DSPA, #0x0a40 - 0e15 16c9 0001 si @DSCR, #0x0001 - 0e17 16cb 0280 si @DSBL, #0x0280 - 0e19 02bf 0652 call 0652_WaitDMA - 0e1b 8100 clr $ACC0 - 0e1c 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e1d 191c lrri $AC0.L, @$AR0 - 0e1e 2ece srs @DSMAH, $AC0.M - 0e1f 2ccf srs @DSMAL, $AC0.L - 0e20 16cd 0e48 si @DSPA, #0x0e48 - 0e22 16c9 0000 si @DSCR, #0x0000 - 0e24 16cb 0280 si @DSBL, #0x0280 - 0e26 0081 0e48 lri $AR1, #0x0e48 - 0e28 0082 0000 lri $AR2, #0x0000 - 0e2a 0083 0000 lri $AR3, #0x0000 - 0e2c 02bf 0652 call 0652_WaitDMA - 0e2e 02bf 0de9 call 0x0de9 - 0e30 8100 clr $ACC0 - 0e31 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e32 191c lrri $AC0.L, @$AR0 - 0e33 2ece srs @DSMAH, $AC0.M - 0e34 2ccf srs @DSMAL, $AC0.L - 0e35 16cd 0e48 si @DSPA, #0x0e48 - 0e37 16c9 0000 si @DSCR, #0x0000 - 0e39 16cb 0280 si @DSBL, #0x0280 - 0e3b 0081 0e48 lri $AR1, #0x0e48 - 0e3d 0082 0140 lri $AR2, #0x0140 - 0e3f 0083 0140 lri $AR3, #0x0140 - 0e41 02bf 0652 call 0652_WaitDMA - 0e43 02bf 0de9 call 0x0de9 - 0e45 8100 clr $ACC0 - 0e46 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e47 191c lrri $AC0.L, @$AR0 - 0e48 2ece srs @DSMAH, $AC0.M - 0e49 2ccf srs @DSMAL, $AC0.L - 0e4a 16cd 0e48 si @DSPA, #0x0e48 - 0e4c 16c9 0000 si @DSCR, #0x0000 - 0e4e 16cb 0280 si @DSBL, #0x0280 - 0e50 0081 0e48 lri $AR1, #0x0e48 - 0e52 0082 07c0 lri $AR2, #0x07c0 - 0e54 0083 07c0 lri $AR3, #0x07c0 - 0e56 02bf 0652 call 0652_WaitDMA - 0e58 02bf 0de9 call 0x0de9 - 0e5a 8100 clr $ACC0 - 0e5b 8970 clr'l $ACC1 : $AC0.M, @$AR0 - 0e5c 191c lrri $AC0.L, @$AR0 - 0e5d 2ece srs @DSMAH, $AC0.M - 0e5e 2ccf srs @DSMAL, $AC0.L - 0e5f 16cd 0e48 si @DSPA, #0x0e48 - 0e61 16c9 0000 si @DSCR, #0x0000 - 0e63 16cb 0280 si @DSBL, #0x0280 - 0e65 0081 0e48 lri $AR1, #0x0e48 - 0e67 0082 0900 lri $AR2, #0x0900 - 0e69 0083 0900 lri $AR3, #0x0900 - 0e6b 02bf 0652 call 0652_WaitDMA - 0e6d 02bf 0de9 call 0x0de9 - 0e6f 029f 0068 jmp 0x0068 - -void 0e71_Int1_Handler() { - 0e71 8e00 set16 - 0e72 16fc ecc0 si @DMBH, #0xecc0 - 0e74 1fcc mrr $AC0.M, $ST0 - 0e75 1d9e mrr $ST0, $AC0.M - 0e76 2efd srs @DMBL, $AC0.M - do { - // 0e77 26fc lrs $AC0.M, @DMBH - // 0e78 02a0 8000 andf $AC0.M, #0x8000 - // 0e7a 029c 0e77 jlnz 0x0e77 - } while(DMBH & 0x8000); - - 0e7c 0000 nop - 0e7d 0000 nop - 0e7e 0000 nop - 0e7f 02ff rti -} - -void 0e80_Int2_Handler() { - 0e80 8e00 set16 - 0e81 00f0 0e17 sr @0x0e17, $AC0.H - 0e83 00fe 0e18 sr @0x0e18, $AC0.M - 0e85 00fc 0e19 sr @0x0e19, $AC0.L - 0e87 1fcc mrr $AC0.M, $ST0 - 0e88 1d9e mrr $ST0, $AC0.M - 0e89 16fc feed si @DMBH, #0xfeed - 0e8b 2efd srs @DMBL, $AC0.M - 0e8c 26fc lrs $AC0.M, @DMBH - 0e8d 02a0 8000 andf $AC0.M, #0x8000 - 0e8f 029c 0e8c jlnz 0x0e8c - 0e91 00d0 0e17 lr $AC0.H, @0x0e17 - 0e93 00de 0e18 lr $AC0.M, @0x0e18 - 0e95 00dc 0e19 lr $AC0.L, @0x0e19 - 0e97 0000 nop - 0e98 0000 nop - 0e99 0000 nop - 0e9a 0000 nop - 0e9b 02ff rti -} - -void 0e9c_Int3_Handler() { - 0e9c 8e00 set16 - 0e9d 1dbc mrr $ST1, $AC0.L - 0e9e 1dbe mrr $ST1, $AC0.M - 0e9f 8100 clr $ACC0 - 0ea0 00de 0bb7 lr $AC0.M, @0x0bb7 - 0ea2 0601 cmpis $ACC0, #0x01 - 0ea3 0295 0ea8 jz 0x0ea8 - 0ea5 0e00 lris $AC0.M, #0x00 - 0ea6 00fe 0b87 sr @0x0b87, $AC0.M - 0ea8 8100 clr $ACC0 - 0ea9 00de 0b88 lr $AC0.M, @0x0b88 - 0eab 0601 cmpis $ACC0, #0x01 - 0eac 0295 0eb2 jz 0x0eb2 - 0eae 8100 clr $ACC0 - 0eaf 1fcd mrr $AC0.M, $ST1 - 0eb0 1f8d mrr $AC0.L, $ST1 - 0eb1 02ff rti - 0eb2 8100 clr $ACC0 - 0eb3 00dc 0be1 lr $AC0.L, @0x0be1 - 0eb5 7600 inc $ACC0 - 0eb6 00fc 0be1 sr @0x0be1, $AC0.L - 0eb8 8100 clr $ACC0 - 0eb9 1fcd mrr $AC0.M, $ST1 - 0eba 1f8d mrr $AC0.L, $ST1 - 0ebb 02ff rti -} - -void 0ebc_Int4_Handler() { - 0ebc 0000 nop - 0ebd 0000 nop - 0ebe 0000 nop - 0ebf 0000 nop - 0ec0 0000 nop - 0ec1 02ff rti -} - -void 0ec2_Int5_Handler() { - 0ec2 8e00 set16 - 0ec3 1dbc mrr $ST1, $AC0.L - 0ec4 1dbe mrr $ST1, $AC0.M - 0ec5 8100 clr $ACC0 - 0ec6 00de 0bb7 lr $AC0.M, @0x0bb7 - 0ec8 0601 cmpis $ACC0, #0x01 - 0ec9 0295 0ed1 jz 0x0ed1 - 0ecb 0e00 lris $AC0.M, #0x00 - 0ecc 00fe 0b87 sr @0x0b87, $AC0.M - 0ece 1fcd mrr $AC0.M, $ST1 - 0ecf 1f8d mrr $AC0.L, $ST1 - 0ed0 02ff rti - 0ed1 8100 clr $ACC0 - 0ed2 00de 0b88 lr $AC0.M, @0x0b88 - 0ed4 0601 cmpis $ACC0, #0x01 - 0ed5 0295 0ee3 jz 0x0ee3 - 0ed7 00de 0bda lr $AC0.M, @0x0bda - 0ed9 2eda srs @pred_scale, $AC0.M - 0eda 00de 0bdb lr $AC0.M, @0x0bdb - 0edc 2edb srs @yn1, $AC0.M - 0edd 00de 0bdc lr $AC0.M, @0x0bdc - 0edf 2edc srs @yn2, $AC0.M - 0ee0 1fcd mrr $AC0.M, $ST1 - 0ee1 1f8d mrr $AC0.L, $ST1 - 0ee2 02ff rti - 0ee3 00de 0bda lr $AC0.M, @0x0bda - 0ee5 2eda srs @pred_scale, $AC0.M - 0ee6 26db lrs $AC0.M, @yn1 - 0ee7 2edb srs @yn1, $AC0.M - 0ee8 26dc lrs $AC0.M, @yn2 - 0ee9 2edc srs @yn2, $AC0.M - 0eea 8100 clr $ACC0 - 0eeb 00dc 0be1 lr $AC0.L, @0x0be1 - 0eed 7600 inc $ACC0 - 0eee 00fc 0be1 sr @0x0be1, $AC0.L - 0ef0 8100 clr $ACC0 - 0ef1 1fcd mrr $AC0.M, $ST1 - 0ef2 1f8d mrr $AC0.L, $ST1 - 0ef3 02ff rti -} -void 0ef4_Int6_Handler() { - 0ef4 0000 nop - 0ef5 0000 nop - 0ef6 0000 nop - 0ef7 0000 nop - 0ef8 0000 nop - 0ef9 02ff rti -} - -void 0e71_Int7_Handler() { - 0efa 0000 nop - 0efb 0000 nop - 0efc 0000 nop - 0efd 0000 nop - 0efe 02ff rti -} - -// Jump Table -0eff 0f11 -0f00 0f14 -0f01 0f4c -0f02 0f4f - - 0f03 8e00 set16 - 0f04 8100 clr $ACC0 - 0f05 8900 clr $ACC1 - 0f06 02bf 0f52 call 0x0f52 - 0f08 27ff lrs $AC1.M, @CMBL - 0f09 009e 0eff lri $AC0.M, #0x0eff - 0f0b 4c00 add $ACC0, $ACC1 - 0f0c 1c7e mrr $AR3, $AC0.M - 0f0d 0313 ilrr $AC1.M, @$AR3 - 0f0e 1c7f mrr $AR3, $AC1.M - 0f0f 176f jmpr $AR3 - 0f10 0021 halt - 0f11 029f 0030 jmp 0x0030 - - 0f13 0021 halt - 0f14 8100 clr $ACC0 - 0f15 8900 clr $ACC1 - 0f16 02bf 0f52 call 0x0f52 - 0f18 24ff lrs $AC0.L, @CMBL - 0f19 02bf 0f58 call 0x0f58 - 0f1b 25ff lrs $AC1.L, @CMBL - 0f1c 02bf 0f58 call 0x0f58 - 0f1e 27ff lrs $AC1.M, @CMBL - 0f1f 2ece srs @DSMAH, $AC0.M - 0f20 2ccf srs @DSMAL, $AC0.L - 0f21 16c9 0001 si @DSCR, #0x0001 - 0f23 2fcd srs @DSPA, $AC1.M - 0f24 2dcb srs @DSBL, $AC1.L - 0f25 8100 clr $ACC0 - 0f26 8900 clr $ACC1 - 0f27 02bf 0f52 call 0x0f52 - 0f29 24ff lrs $AC0.L, @CMBL - 0f2a 1c9e mrr $IX0, $AC0.M - 0f2b 1cbc mrr $IX1, $AC0.L - 0f2c 02bf 0f58 call 0x0f58 - 0f2e 25ff lrs $AC1.L, @CMBL - 0f2f 02bf 0f58 call 0x0f58 - 0f31 27ff lrs $AC1.M, @CMBL - 0f32 1cdf mrr $IX2, $AC1.M - 0f33 1cfd mrr $IX3, $AC1.L - 0f34 8100 clr $ACC0 - 0f35 02bf 0f52 call 0x0f52 - 0f37 26ff lrs $AC0.M, @CMBL - 0f38 1c1e mrr $AR0, $AC0.M - 0f39 8900 clr $ACC1 - 0f3a 02bf 0f58 call 0x0f58 - 0f3c 20ff lrs $AX0.L, @CMBL - 0f3d 1f5f mrr $AX0.H, $AC1.M - 0f3e 02bf 0f52 call 0x0f52 - 0f40 21ff lrs $AX1.L, @CMBL - 0f41 02bf 0f52 call 0x0f52 - 0f43 23ff lrs $AX1.H, @CMBL - 0f44 26c9 lrs $AC0.M, @DSCR - 0f45 02a0 0004 andf $AC0.M, #0x0004 - 0f47 029c 0f44 jlnz 0x0f44 - 0f49 029f 80b5 jmp 0x80b5 - 0f4b 0021 halt - 0f4c 029f 8000 jmp 0x8000 - 0f4e 0021 halt - 0f4f 029f 0045 jmp 0x0045 - 0f51 0021 halt - 0f52 26fe lrs $AC0.M, @CMBH - 0f53 02c0 8000 andcf $AC0.M, #0x8000 - 0f55 029c 0f52 jlnz 0x0f52 - 0f57 02df ret - 0f58 27fe lrs $AC1.M, @CMBH - 0f59 03c0 8000 andcf $AC1.M, #0x8000 - 0f5b 029c 0f58 jlnz 0x0f58 - 0f5d 02df ret - 0f5e 0000 nop - 0f5f 0000 nop diff --git a/docs/DSP/DSP_UC_Pikmin2Wii.txt b/docs/DSP/DSP_UC_Pikmin2Wii.txt deleted file mode 100644 index c13559a1d9..0000000000 --- a/docs/DSP/DSP_UC_Pikmin2Wii.txt +++ /dev/null @@ -1,2877 +0,0 @@ -// This one belongs to Pikmin 2 for the Wii and utilizes the mysterious UnkZelda address. Also very different from Pikmin 1 for the Wii - 0000 029f 0012 jmp 0x0012 - 0002 0000 nop - 0003 0000 nop - 0004 02ff rti - 0005 0000 nop - 0006 02ff rti - 0007 0000 nop - 0008 02ff rti - 0009 0000 nop - 000a 02ff rti - 000b 0000 nop - 000c 02ff rti - 000d 0000 nop - 000e 029f 072e jmp 0x072e - 0010 029f 0059 jmp 0x0059 - 0012 1205 sbclr #0x05 - 0013 02bf 0062 call 0x0062 - 0015 8100 clr $ACC0 - 0016 009f 1000 lri $AC1.M, #0x1000 - 0018 0080 0000 lri $AR0, #0x0000 - 001a 005f loop $AC1.M - 001b 1b1e srri @$AR0, $AC0.M - 001c 02bf 07fe call 0x07fe - 001e 02bf 0f72 call 0x0f72 - 0020 0e00 lris $AC0.M, #0x00 - 0021 02bf 07e0 call 0x07e0 - 0023 009e 1111 lri $AC0.M, #0x1111 - 0025 02bf 07ea call 0x07ea - 0027 0e00 lris $AC0.M, #0x00 - 0028 00fe 034e sr @0x034e, $AC0.M - 002a 1305 sbset #0x05 - 002b 3a00 orr $AC0.M, $AX1.H - 002c 7400 incm $AC0.M - 002d 1f7e mrr $AX1.H, $AC0.M - 002e 0240 00ff andi $AC0.M, #0x00ff - 0030 0200 5500 addi $AC0.M, #0x5500 - 0032 02bf 00a0 call 0x00a0 - 0034 029f 083b jmp 0x083b - 0036 00df 0357 lr $AC1.M, @0x0357 - 0038 00ff 0345 sr @0x0345, $AC1.M - 003a 00de 0356 lr $AC0.M, @0x0356 - 003c 1ffe mrr $AC1.M, $AC0.M - 003d 0340 00ff andi $AC1.M, #0x00ff - 003f 00ff 0344 sr @0x0344, $AC1.M - 0041 1479 lsr $ACC0, #-7 - 0042 0240 007e andi $AC0.M, #0x007e - 0044 00fe 0343 sr @0x0343, $AC0.M - 0046 0200 0080 addi $AC0.M, #0x0080 - 0048 1c1e mrr $AR0, $AC0.M - 0049 170f jmpr $AR0 - 004a 0092 00ff lri $CR, #0x00ff - 004c 009e cafe lri $AC0.M, #0xcafe - 004e 02bf 00a0 call 0x00a0 - 0050 0e04 lris $AC0.M, #0x04 - 0051 02bf 07e0 call 0x07e0 - 0053 00de 0356 lr $AC0.M, @0x0356 - 0055 02bf 07ea call 0x07ea - 0057 029f 002b jmp 0x002b - 0059 1205 sbclr #0x05 - 005a 02bf 0062 call 0x0062 - 005c 0e01 lris $AC0.M, #0x01 - 005d 02bf 07e0 call 0x07e0 - 005f 1305 sbset #0x05 - 0060 029f 002b jmp 0x002b - 0062 1202 sbclr #0x02 - 0063 1203 sbclr #0x03 - 0064 1204 sbclr #0x04 - 0065 1306 sbset #0x06 - 0066 8e00 set16 - 0067 8c00 clr15 - 0068 8b00 m0 - 0069 009e ffff lri $AC0.M, #0xffff - 006b 1d1e mrr $WR0, $AC0.M - 006c 1d3e mrr $WR1, $AC0.M - 006d 1d5e mrr $WR2, $AC0.M - 006e 1d7e mrr $WR3, $AC0.M - 006f 0092 00ff lri $CR, #0x00ff - 0071 02df ret - 0072 0081 0358 lri $AR1, #0x0358 - 0074 0090 0000 lri $AC0.H, #0x0000 - 0076 0c00 lris $AC0.L, #0x00 - 0077 007e 007c bloop $AC0.M, 0x007c - 0079 193e lrri $AC0.M, @$AR1 - 007a 1b1e srri @$AR0, $AC0.M - 007b 193e lrri $AC0.M, @$AR1 - 007c 1b1e srri @$AR0, $AC0.M - 007d 02df ret - 007e 029f 004a jmp 0x004a - 0080 029f 004a jmp 0x004a - 0082 029f 00d9 jmp 0x00d9 - 0084 029f 02e3 jmp 0x02e3 - 0086 029f 007e jmp 0x007e - 0088 029f 0677 jmp 0x0677 - 008a 029f 0689 jmp 0x0689 - 008c 029f 004a jmp 0x004a - 008e 029f 05c0 jmp 0x05c0 - 0090 029f 060c jmp 0x060c - 0092 029f 05f0 jmp 0x05f0 - 0094 029f 004a jmp 0x004a - 0096 029f 004a jmp 0x004a - 0098 029f 004a jmp 0x004a - 009a 029f 0103 jmp 0x0103 - 009c 029f 00f6 jmp 0x00f6 - 009e 029f 004a jmp 0x004a - 00a0 00fe 0b00 sr @0x0b00, $AC0.M - 00a2 8100 clr $ACC0 - 00a3 00de 0354 lr $AC0.M, @0x0354 - 00a5 1408 lsl $ACC0, #8 - 00a6 00df 0341 lr $AC1.M, @0x0341 - 00a8 3e00 orc $AC0.M - 00a9 00fe 0b01 sr @0x0b01, $AC0.M - 00ab 00de 0350 lr $AC0.M, @0x0350 - 00ad 00fe 0b02 sr @0x0b02, $AC0.M - 00af 00de 0351 lr $AC0.M, @0x0351 - 00b1 00fe 0b03 sr @0x0b03, $AC0.M - 00b3 00de 0352 lr $AC0.M, @0x0352 - 00b5 00fe 0b04 sr @0x0b04, $AC0.M - 00b7 00de 037d lr $AC0.M, @0x037d - 00b9 00dc 037e lr $AC0.L, @0x037e - 00bb 009f 0b00 lri $AC1.M, #0x0b00 - 00bd 0080 0010 lri $AR0, #0x0010 - 00bf 0090 0001 lri $AC0.H, #0x0001 - 00c1 1c3f mrr $AR1, $AC1.M - 00c2 0f0a lris $AC1.M, #0x0a - 00c3 2fd1 srs @SampleFormat, $AC1.M - 00c4 1f5e mrr $AX0.H, $AC0.M - 00c5 1f1c mrr $AX0.L, $AC0.L - 00c6 009e ffff lri $AC0.M, #0xffff - 00c8 2ed6 srs @ACEAH, $AC0.M - 00c9 2ed7 srs @ACEAL, $AC0.M - 00ca 1fda mrr $AC0.M, $AX0.H - 00cb 1f98 mrr $AC0.L, $AX0.L - 00cc 147f lsr $ACC0, #-1 - 00cd 2ed8 srs @ACCAH, $AC0.M - 00ce 2cd9 srs @ACCAL, $AC0.L - 00cf 1f40 mrr $AX0.H, $AR0 - 00d0 007a 00d7 bloop $AX0.H, 0x00d7 - 00d2 193e lrri $AC0.M, @$AR1 - 00d3 2ed3 srs @UnkZelda, $AC0.M - 00d4 0000 nop - 00d5 0000 nop - 00d6 0000 nop - 00d7 0000 nop - 00d8 02df ret - 00d9 0080 0380 lri $AR0, #0x0380 - 00db 0e04 lris $AC0.M, #0x04 - 00dc 02bf 0072 call 0x0072 - 00de 0081 0382 lri $AR1, #0x0382 - 00e0 009f 0000 lri $AC1.M, #0x0000 - 00e2 0080 0280 lri $AR0, #0x0280 - 00e4 02bf 0647 call 0x0647 - 00e6 0081 0384 lri $AR1, #0x0384 - 00e8 009f 0300 lri $AC1.M, #0x0300 - 00ea 0080 0020 lri $AR0, #0x0020 - 00ec 02bf 0647 call 0x0647 - 00ee 00de 0345 lr $AC0.M, @0x0345 - 00f0 00fe 0342 sr @0x0342, $AC0.M - 00f2 02bf 0d44 call 0x0d44 - 00f4 029f 004a jmp 0x004a - 00f6 0080 037d lri $AR0, #0x037d - 00f8 0e01 lris $AC0.M, #0x01 - 00f9 02bf 0072 call 0x0072 - 00fb 00de 037d lr $AC0.M, @0x037d - 00fd 0240 7fff andi $AC0.M, #0x7fff - 00ff 00fe 037d sr @0x037d, $AC0.M - 0101 029f 004a jmp 0x004a - 0103 0080 0374 lri $AR0, #0x0374 - 0105 0e01 lris $AC0.M, #0x01 - 0106 00fe 0377 sr @0x0377, $AC0.M - 0108 00fe 037c sr @0x037c, $AC0.M - 010a 02bf 0072 call 0x0072 - 010c 00de 0345 lr $AC0.M, @0x0345 - 010e 00fe 0376 sr @0x0376, $AC0.M - 0110 029f 004a jmp 0x004a - 0112 0081 034c lri $AR1, #0x034c - 0114 009f 0400 lri $AC1.M, #0x0400 - 0116 0080 00c0 lri $AR0, #0x00c0 - 0118 02bf 0647 call 0x0647 - 011a 02df ret - 011b 0081 034c lri $AR1, #0x034c - 011d 009f 0400 lri $AC1.M, #0x0400 - 011f 0080 0080 lri $AR0, #0x0080 - 0121 0081 034c lri $AR1, #0x034c - 0123 193e lrri $AC0.M, @$AR1 - 0124 193c lrri $AC0.L, @$AR1 - 0125 0098 0000 lri $AX0.L, #0x0000 - 0127 7000 addaxl $ACC0, $AX0.L - 0128 02bf 0656 call 0x0656 - 012a 02df ret - 012b 191e lrri $AC0.M, @$AR0 - 012c 191a lrri $AX0.H, @$AR0 - 012d 005f loop $AC1.M - 012e 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 012f 1b7e srri @$AR3, $AC0.M - 0130 1b7a srri @$AR3, $AX0.H - 0131 02df ret - 0132 0000 nop - 0133 007f 0138 bloop $AC1.M, 0x0138 - 0135 191e lrri $AC0.M, @$AR0 - 0136 1b7e srri @$AR3, $AC0.M - 0137 191e lrri $AC0.M, @$AR0 - 0138 1b7e srri @$AR3, $AC0.M - 0139 0000 nop - 013a 02df ret - 013b 191e lrri $AC0.M, @$AR0 - 013c 191a lrri $AX0.H, @$AR0 - 013d 007f 0142 bloop $AC1.M, 0x0142 - 013f 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 0140 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 0141 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 0142 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0143 0000 nop - 0144 02df ret - 0145 8a00 m2 - 0146 157f lsr $ACC1, #-1 - 0147 1c20 mrr $AR1, $AR0 - 0148 1c03 mrr $AR0, $AR3 - 0149 193a lrri $AX0.H, @$AR1 - 014a 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 - 014b 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 - 014c 007f 0151 bloop $AC1.M, 0x0151 - 014e 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 014f 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 0150 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 0151 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 0152 8b00 m0 - 0153 02df ret - 0154 8a00 m2 - 0155 191a lrri $AX0.H, @$AR0 - 0156 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 - 0157 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0158 005f loop $AC1.M - 0159 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M - 015a 8b00 m0 - 015b 02df ret - 015c 8100 clr $ACC0 - 015d 8900 clr $ACC1 - 015e 0e50 lris $AC0.M, #0x50 - 015f 0080 0d00 lri $AR0, #0x0d00 - 0161 005e loop $AC0.M - 0162 1b1f srri @$AR0, $AC1.M - 0163 0080 0d60 lri $AR0, #0x0d60 - 0165 005e loop $AC0.M - 0166 1b1f srri @$AR0, $AC1.M - 0167 00da 0374 lr $AX0.H, @0x0374 - 0169 8600 tstaxh $AX0.H - 016a 02b5 0f9d callz 0x0f9d - 016c 8100 clr $ACC0 - 016d 8900 clr $ACC1 - 016e 0e50 lris $AC0.M, #0x50 - 016f 0080 0ca0 lri $AR0, #0x0ca0 - 0171 005e loop $AC0.M - 0172 1b1f srri @$AR0, $AC1.M - 0173 0080 0f40 lri $AR0, #0x0f40 - 0175 005e loop $AC0.M - 0176 1b1f srri @$AR0, $AC1.M - 0177 0080 0fa0 lri $AR0, #0x0fa0 - 0179 005e loop $AC0.M - 017a 1b1f srri @$AR0, $AC1.M - 017b 0080 0a00 lri $AR0, #0x0a00 - 017d 005e loop $AC0.M - 017e 1b1f srri @$AR0, $AC1.M - 017f 0080 09a0 lri $AR0, #0x09a0 - 0181 005e loop $AC0.M - 0182 1b1f srri @$AR0, $AC1.M - 0183 0f04 lris $AC1.M, #0x04 - 0184 0080 0e10 lri $AR0, #0x0e10 - 0186 0083 0dc0 lri $AR3, #0x0dc0 - 0188 02bf 0132 call 0x0132 - 018a 0080 0e70 lri $AR0, #0x0e70 - 018c 0083 0e20 lri $AR3, #0x0e20 - 018e 02bf 0132 call 0x0132 - 0190 0080 0ed0 lri $AR0, #0x0ed0 - 0192 0083 0e80 lri $AR3, #0x0e80 - 0194 02bf 0132 call 0x0132 - 0196 0080 0f30 lri $AR0, #0x0f30 - 0198 0083 0ee0 lri $AR3, #0x0ee0 - 019a 02bf 0132 call 0x0132 - 019c 8100 clr $ACC0 - 019d 0e50 lris $AC0.M, #0x50 - 019e 8900 clr $ACC1 - 019f 0080 0dc8 lri $AR0, #0x0dc8 - 01a1 005e loop $AC0.M - 01a2 1b1f srri @$AR0, $AC1.M - 01a3 0080 0e28 lri $AR0, #0x0e28 - 01a5 005e loop $AC0.M - 01a6 1b1f srri @$AR0, $AC1.M - 01a7 0080 0e88 lri $AR0, #0x0e88 - 01a9 005e loop $AC0.M - 01aa 1b1f srri @$AR0, $AC1.M - 01ab 0080 0ee8 lri $AR0, #0x0ee8 - 01ad 005e loop $AC0.M - 01ae 1b1f srri @$AR0, $AC1.M - 01af 02df ret - 01b0 009f 0580 lri $AC1.M, #0x0580 - 01b2 009b 00a0 lri $AX1.H, #0x00a0 - 01b4 0081 0393 lri $AR1, #0x0393 - 01b6 18bc lrrd $AC0.L, @$AR1 - 01b7 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 01b8 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 01b9 0080 0050 lri $AR0, #0x0050 - 01bb 02bf 0649 call 0x0649 - 01bd 02df ret - 01be 00df 03a1 lr $AC1.M, @0x03a1 - 01c0 0508 addis $ACC1, #0x08 - 01c1 0080 0580 lri $AR0, #0x0580 - 01c3 1c7f mrr $AR3, $AC1.M - 01c4 0098 7fff lri $AX0.L, #0x7fff - 01c6 8900 clr $ACC1 - 01c7 0f50 lris $AC1.M, #0x50 - 01c8 02bf 0145 call 0x0145 - 01ca 02df ret - 01cb 00c0 03a0 lr $AR0, @0x03a0 - 01cd 191a lrri $AX0.H, @$AR0 - 01ce 02bf 01b0 call 0x01b0 - 01d0 02bf 01be call 0x01be - 01d2 8100 clr $ACC0 - 01d3 8900 clr $ACC1 - 01d4 00de 0390 lr $AC0.M, @0x0390 - 01d6 02a0 0001 andf $AC0.M, #0x0001 - 01d8 029d 01e1 jlz 0x01e1 - 01da 0080 0398 lri $AR0, #0x0398 - 01dc 0e08 lris $AC0.M, #0x08 - 01dd 00c1 03a1 lr $AR1, @0x03a1 - 01df 02bf 0c86 call 0x0c86 - 01e1 0f50 lris $AC1.M, #0x50 - 01e2 00c0 03a1 lr $AR0, @0x03a1 - 01e4 00da 0394 lr $AX0.H, @0x0394 - 01e6 8600 tstaxh $AX0.H - 01e7 0295 01ee jz 0x01ee - 01e9 1c7a mrr $AR3, $AX0.H - 01ea 00d8 0395 lr $AX0.L, @0x0395 - 01ec 02bf 0145 call 0x0145 - 01ee 0f50 lris $AC1.M, #0x50 - 01ef 00c0 03a1 lr $AR0, @0x03a1 - 01f1 00da 0396 lr $AX0.H, @0x0396 - 01f3 8600 tstaxh $AX0.H - 01f4 0295 01fb jz 0x01fb - 01f6 1c7a mrr $AR3, $AX0.H - 01f7 00d8 0397 lr $AX0.L, @0x0397 - 01f9 02bf 0145 call 0x0145 - 01fb 00de 0390 lr $AC0.M, @0x0390 - 01fd 02a0 0002 andf $AC0.M, #0x0002 - 01ff 02dd retlz - 0200 0080 0398 lri $AR0, #0x0398 - 0202 0e08 lris $AC0.M, #0x08 - 0203 00c1 03a1 lr $AR1, @0x03a1 - 0205 02bf 0c86 call 0x0c86 - 0207 02df ret - 0208 8900 clr $ACC1 - 0209 009f 0dc0 lri $AC1.M, #0x0dc0 - 020b 00ff 03a1 sr @0x03a1, $AC1.M - 020d 009f 03a8 lri $AC1.M, #0x03a8 - 020f 00ff 03a2 sr @0x03a2, $AC1.M - 0211 009f 03a4 lri $AC1.M, #0x03a4 - 0213 00ff 03a0 sr @0x03a0, $AC1.M - 0215 1104 0235 bloopi #0x04, 0x0235 - 0217 00c0 03a2 lr $AR0, @0x03a2 - 0219 0083 0390 lri $AR3, #0x0390 - 021b 8900 clr $ACC1 - 021c 0f08 lris $AC1.M, #0x08 - 021d 02bf 0132 call 0x0132 - 021f 00da 0390 lr $AX0.H, @0x0390 - 0221 8600 tstaxh $AX0.H - 0222 0295 0226 jz 0x0226 - 0224 02bf 01cb call 0x01cb - 0226 8100 clr $ACC0 - 0227 00de 03a2 lr $AC0.M, @0x03a2 - 0229 0410 addis $ACC0, #0x10 - 022a 00fe 03a2 sr @0x03a2, $AC0.M - 022c 00de 03a1 lr $AC0.M, @0x03a1 - 022e 0460 addis $ACC0, #0x60 - 022f 00fe 03a1 sr @0x03a1, $AC0.M - 0231 00de 03a0 lr $AC0.M, @0x03a0 - 0233 7400 incm $AC0.M - 0234 00fe 03a0 sr @0x03a0, $AC0.M - 0236 00da 0374 lr $AX0.H, @0x0374 - 0238 8600 tstaxh $AX0.H - 0239 0294 025f jnz 0x025f - 023b 0f50 lris $AC1.M, #0x50 - 023c 0080 0be0 lri $AR0, #0x0be0 - 023e 0083 0e80 lri $AR3, #0x0e80 - 0240 0098 7fff lri $AX0.L, #0x7fff - 0242 02bf 0145 call 0x0145 - 0244 0f50 lris $AC1.M, #0x50 - 0245 0080 0be0 lri $AR0, #0x0be0 - 0247 0083 0ee0 lri $AR3, #0x0ee0 - 0249 0098 b820 lri $AX0.L, #0xb820 - 024b 02bf 0145 call 0x0145 - 024d 0f28 lris $AC1.M, #0x28 - 024e 0080 0c68 lri $AR0, #0x0c68 - 0250 0083 0e80 lri $AR3, #0x0e80 - 0252 0098 b820 lri $AX0.L, #0xb820 - 0254 02bf 0145 call 0x0145 - 0256 0f28 lris $AC1.M, #0x28 - 0257 0080 0c68 lri $AR0, #0x0c68 - 0259 0083 0ee0 lri $AR3, #0x0ee0 - 025b 0098 7fff lri $AX0.L, #0x7fff - 025d 02bf 0145 call 0x0145 - 025f 8100 clr $ACC0 - 0260 8900 clr $ACC1 - 0261 0e50 lris $AC0.M, #0x50 - 0262 0080 0be0 lri $AR0, #0x0be0 - 0264 005e loop $AC0.M - 0265 1b1f srri @$AR0, $AC1.M - 0266 0080 0c40 lri $AR0, #0x0c40 - 0268 005e loop $AC0.M - 0269 1b1f srri @$AR0, $AC1.M - 026a 02df ret - 026b 00c0 03a0 lr $AR0, @0x03a0 - 026d 181a lrr $AX0.H, @$AR0 - 026e 8100 clr $ACC0 - 026f 181e lrr $AC0.M, @$AR0 - 0270 00db 0391 lr $AX1.H, @0x0391 - 0272 7400 incm $AC0.M - 0273 d100 cmpar $ACC1, $AX0.H - 0274 0270 ifge - 0275 8100 clr $ACC0 - 0276 1b1e srri @$AR0, $AC0.M - 0277 00df 03a1 lr $AC1.M, @0x03a1 - 0279 009b 00a0 lri $AX1.H, #0x00a0 - 027b 0081 0393 lri $AR1, #0x0393 - 027d 18bc lrrd $AC0.L, @$AR1 - 027e b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 027f bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0280 0080 0050 lri $AR0, #0x0050 - 0282 02bf 0656 call 0x0656 - 0284 02df ret - 0285 00da 0374 lr $AX0.H, @0x0374 - 0287 8600 tstaxh $AX0.H - 0288 0294 029e jnz 0x029e - 028a 8900 clr $ACC1 - 028b 0f28 lris $AC1.M, #0x28 - 028c 0080 0c40 lri $AR0, #0x0c40 - 028e 0083 0ea8 lri $AR3, #0x0ea8 - 0290 0098 b820 lri $AX0.L, #0xb820 - 0292 02bf 0145 call 0x0145 - 0294 8900 clr $ACC1 - 0295 0f28 lris $AC1.M, #0x28 - 0296 0080 0c40 lri $AR0, #0x0c40 - 0298 0083 0f08 lri $AR3, #0x0f08 - 029a 0098 7fff lri $AX0.L, #0x7fff - 029c 02bf 0145 call 0x0145 - 029e 009f 0dc0 lri $AC1.M, #0x0dc0 - 02a0 00ff 03a1 sr @0x03a1, $AC1.M - 02a2 009f 03a8 lri $AC1.M, #0x03a8 - 02a4 00ff 03a2 sr @0x03a2, $AC1.M - 02a6 009f 03a4 lri $AC1.M, #0x03a4 - 02a8 00ff 03a0 sr @0x03a0, $AC1.M - 02aa 1104 02c8 bloopi #0x04, 0x02c8 - 02ac 00c0 03a2 lr $AR0, @0x03a2 - 02ae 0083 0390 lri $AR3, #0x0390 - 02b0 0f08 lris $AC1.M, #0x08 - 02b1 02bf 0132 call 0x0132 - 02b3 00da 0390 lr $AX0.H, @0x0390 - 02b5 8600 tstaxh $AX0.H - 02b6 0295 02ba jz 0x02ba - 02b8 02bf 026b call 0x026b - 02ba 00de 03a2 lr $AC0.M, @0x03a2 - 02bc 0410 addis $ACC0, #0x10 - 02bd 00fe 03a2 sr @0x03a2, $AC0.M - 02bf 00de 03a1 lr $AC0.M, @0x03a1 - 02c1 0460 addis $ACC0, #0x60 - 02c2 00fe 03a1 sr @0x03a1, $AC0.M - 02c4 00de 03a0 lr $AC0.M, @0x03a0 - 02c6 7400 incm $AC0.M - 02c7 00fe 03a0 sr @0x03a0, $AC0.M - 02c9 02df ret - 02ca 0081 0386 lri $AR1, #0x0386 - 02cc 009f 03a8 lri $AC1.M, #0x03a8 - 02ce 0080 0040 lri $AR0, #0x0040 - 02d0 02bf 0647 call 0x0647 - 02d2 02df ret - 02d3 191e lrri $AC0.M, @$AR0 - 02d4 189c lrrd $AC0.L, @$AR0 - 02d5 4800 addax $ACC0, $AX0.L - 02d6 1b1e srri @$AR0, $AC0.M - 02d7 1b1c srri @$AR0, $AC0.L - 02d8 02df ret - 02d9 8100 clr $ACC0 - 02da 8900 clr $ACC1 - 02db 00df 0354 lr $AC1.M, @0x0354 - 02dd 00de 034e lr $AC0.M, @0x034e - 02df 8200 cmp - 02e0 0293 02d9 jle 0x02d9 - 02e2 02df ret - 02e3 0080 0388 lri $AR0, #0x0388 - 02e5 0081 0072 lri $AR1, #0x0072 - 02e7 0e02 lris $AC0.M, #0x02 - 02e8 173f callr $AR1 - 02e9 02bf 04d7 call 0x04d7 - 02eb 00de 0344 lr $AC0.M, @0x0344 - 02ed 00fe 0341 sr @0x0341, $AC0.M - 02ef 00de 0345 lr $AC0.M, @0x0345 - 02f1 00fe 038e sr @0x038e, $AC0.M - 02f3 8100 clr $ACC0 - 02f4 00fe 0355 sr @0x0355, $AC0.M - 02f6 02bf 02ca call 0x02ca - 02f8 02bf 069b call 0x069b - 02fa 0092 00ff lri $CR, #0x00ff - 02fc 00de 0341 lr $AC0.M, @0x0341 - 02fe 007e 04ce bloop $AC0.M, 0x04ce - 0300 02bf 015c call 0x015c - 0302 02bf 0208 call 0x0208 - 0304 02bf 0543 call 0x0543 - 0306 02bf 0ad4 call 0x0ad4 - 0308 00de 0355 lr $AC0.M, @0x0355 - 030a 7400 incm $AC0.M - 030b 00fe 0355 sr @0x0355, $AC0.M - 030d 8100 clr $ACC0 - 030e 00fe 0354 sr @0x0354, $AC0.M - 0310 00de 0342 lr $AC0.M, @0x0342 - 0312 007e 046e bloop $AC0.M, 0x046e - 0314 009e fead lri $AC0.M, #0xfead - 0316 02bf 00a0 call 0x00a0 - 0318 02bf 02d9 call 0x02d9 - 031a 009e d0d0 lri $AC0.M, #0xd0d0 - 031c 02bf 00a0 call 0x00a0 - 031e 8100 clr $ACC0 - 031f 8900 clr $ACC1 - 0320 00de 0354 lr $AC0.M, @0x0354 - 0322 147c lsr $ACC0, #-4 - 0323 0200 04fc addi $AC0.M, #0x04fc - 0325 1c1e mrr $AR0, $AC0.M - 0326 181f lrr $AC1.M, @$AR0 - 0327 00de 0354 lr $AC0.M, @0x0354 - 0329 0240 000f andi $AC0.M, #0x000f - 032b 3d80 lsrnr $ACC1 - 032c 03c0 8000 andcf $AC1.M, #0x8000 - 032e 029c 046a jlnz 0x046a - 0330 00d8 0354 lr $AX0.L, @0x0354 - 0332 009a 0180 lri $AX0.H, #0x0180 - 0334 8100 clr $ACC0 - 0335 00de 0380 lr $AC0.M, @0x0380 - 0337 00dc 0381 lr $AC0.L, @0x0381 - 0339 9000 mul $AX0.L, $AX0.H - 033a 9400 mulac $AX0.L, $AX0.H, $ACC0 - 033b 00fe 034c sr @0x034c, $AC0.M - 033d 00fc 034d sr @0x034d, $AC0.L - 033f 02bf 0112 call 0x0112 - 0341 00da 0400 lr $AX0.H, @0x0400 - 0343 8600 tstaxh $AX0.H - 0344 0295 046a jz 0x046a - 0346 00da 0401 lr $AX0.H, @0x0401 - 0348 8600 tstaxh $AX0.H - 0349 0294 046a jnz 0x046a - 034b 00da 0433 lr $AX0.H, @0x0433 - 034d 00fa 03f8 sr @0x03f8, $AX0.H - 034f 00da 0406 lr $AX0.H, @0x0406 - 0351 8600 tstaxh $AX0.H - 0352 0294 0f5d jnz 0x0f5d - 0354 8100 clr $ACC0 - 0355 00de 0480 lr $AC0.M, @0x0480 - 0357 0609 cmpis $ACC0, #0x09 - 0358 0295 036b jz 0x036b - 035a 0605 cmpis $ACC0, #0x05 - 035b 0295 036b jz 0x036b - 035d 0608 cmpis $ACC0, #0x08 - 035e 0295 0b04 jz 0x0b04 - 0360 0610 cmpis $ACC0, #0x10 - 0361 0295 0b81 jz 0x0b81 - 0363 0620 cmpis $ACC0, #0x20 - 0364 0295 0bf2 jz 0x0bf2 - 0366 0621 cmpis $ACC0, #0x21 - 0367 0295 0bfa jz 0x0bfa - 0369 029f 09f1 jmp 0x09f1 - 036b 00d8 0402 lr $AX0.L, @0x0402 - 036d 8100 clr $ACC0 - 036e 8900 clr $ACC1 - 036f 00dc 0430 lr $AC0.L, @0x0430 - 0371 8d00 set15 - 0372 0950 lris $AX1.L, #0x50 - 0373 a000 mulx $AX0.L, $AX1.L - 0374 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0375 1404 lsl $ACC0, #4 - 0376 8c00 clr15 - 0377 1ffe mrr $AC1.M, $AC0.M - 0378 0083 0580 lri $AR3, #0x0580 - 037a 02bf 08b3 call 0x08b3 - 037c 029f 037e jmp 0x037e - 037e 0080 0580 lri $AR0, #0x0580 - 0380 0081 0520 lri $AR1, #0x0520 - 0382 0099 0000 lri $AX1.L, #0x0000 - 0384 02bf 0edd call 0x0edd - 0386 00da 04a8 lr $AX0.H, @0x04a8 - 0388 8600 tstaxh $AX0.H - 0389 0295 038f jz 0x038f - 038b 0080 0520 lri $AR0, #0x0520 - 038d 02bf 0ddc call 0x0ddc - 038f 009e 0520 lri $AC0.M, #0x0520 - 0391 00fe 038f sr @0x038f, $AC0.M - 0393 8900 clr $ACC1 - 0394 00df 0484 lr $AC1.M, @0x0484 - 0396 0340 001f andi $AC1.M, #0x001f - 0398 b900 tst $ACC1 - 0399 0295 03bf jz 0x03bf - 039b 00de 038f lr $AC0.M, @0x038f - 039d 5c00 sub $ACC0, $ACC1 - 039e 00fe 038f sr @0x038f, $AC0.M - 03a0 1c7e mrr $AR3, $AC0.M - 03a1 0080 0440 lri $AR0, #0x0440 - 03a3 05fe addis $ACC1, #0xfe - 03a4 02bf 012b call 0x012b - 03a6 0080 0490 lri $AR0, #0x0490 - 03a8 00c1 038f lr $AR1, @0x038f - 03aa 8900 clr $ACC1 - 03ab 00df 0484 lr $AC1.M, @0x0484 - 03ad 0340 001f andi $AC1.M, #0x001f - 03af 02bf 0ca5 call 0x0ca5 - 03b1 00de 038f lr $AC0.M, @0x038f - 03b3 0450 addis $ACC0, #0x50 - 03b4 1c1e mrr $AR0, $AC0.M - 03b5 0083 0440 lri $AR3, #0x0440 - 03b7 8900 clr $ACC1 - 03b8 00df 0484 lr $AC1.M, @0x0484 - 03ba 0340 001f andi $AC1.M, #0x001f - 03bc 05fe addis $ACC1, #0xfe - 03bd 02bf 012b call 0x012b - 03bf 00de 0484 lr $AC0.M, @0x0484 - 03c1 0240 0020 andi $AC0.M, #0x0020 - 03c3 0295 03e1 jz 0x03e1 - 03c5 0080 04a4 lri $AR0, #0x04a4 - 03c7 00c1 038f lr $AR1, @0x038f - 03c9 0082 0454 lri $AR2, #0x0454 - 03cb 0083 04a7 lri $AR3, #0x04a7 - 03cd 18fa lrrd $AX0.H, @$AR3 - 03ce 8600 tstaxh $AX0.H - 03cf 0294 03df jnz 0x03df - 03d1 18fa lrrd $AX0.H, @$AR3 - 03d2 8600 tstaxh $AX0.H - 03d3 0294 03df jnz 0x03df - 03d5 18fa lrrd $AX0.H, @$AR3 - 03d6 8600 tstaxh $AX0.H - 03d7 0294 03df jnz 0x03df - 03d9 8100 clr $ACC0 - 03da 18fe lrrd $AC0.M, @$AR3 - 03db 0280 7fff cmpi $AC0.M, #0x7fff - 03dd 0295 03e1 jz 0x03e1 - 03df 02bf 0cc0 call 0x0cc0 - 03e1 8100 clr $ACC0 - 03e2 00de 042c lr $AC0.M, @0x042c - 03e4 b100 tst $ACC0 - 03e5 0295 03eb jz 0x03eb - 03e7 02bf 0e2b call 0x0e2b - 03e9 029f 0460 jmp 0x0460 - 03eb 8100 clr $ACC0 - 03ec 1c9e mrr $IX0, $AC0.M - 03ed 1cde mrr $IX2, $AC0.M - 03ee 7400 incm $AC0.M - 03ef 1cfe mrr $IX3, $AC0.M - 03f0 8100 clr $ACC0 - 03f1 00de 0407 lr $AC0.M, @0x0407 - 03f3 b100 tst $ACC0 - 03f4 0295 0403 jz 0x0403 - 03f6 00c3 038f lr $AR3, @0x038f - 03f8 0007 dar $AR3 - 03f9 0080 0477 lri $AR0, #0x0477 - 03fb 0084 ffff lri $IX0, #0xffff - 03fd 0087 ffff lri $IX3, #0xffff - 03ff 199a lrrn $AX0.H, @$AR0 - 0400 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - 0401 005e loop $AC0.M - 0402 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - 0403 00da 0485 lr $AX0.H, @0x0485 - 0405 8600 tstaxh $AX0.H - 0406 0295 0419 jz 0x0419 - 0408 8900 clr $ACC1 - 0409 0086 0005 lri $IX2, #0x0005 - 040b 0082 040a lri $AR2, #0x040a - 040d 1106 0411 bloopi #0x06, 0x0411 - 040f 18de lrrd $AC0.M, @$AR2 - 0410 147f lsr $ACC0, #-1 - 0411 4d36 add'sn $ACC1, $ACC0 : @$AR2, $AC0.M - 0412 b900 tst $ACC1 - 0413 0294 0419 jnz 0x0419 - 0415 009a 0001 lri $AX0.H, #0x0001 - 0417 00fa 0401 sr @0x0401, $AX0.H - 0419 8f00 set40 - 041a 0086 0002 lri $IX2, #0x0002 - 041c 0082 0408 lri $AR2, #0x0408 - 041e 1106 0449 bloopi #0x06, 0x0449 - 0420 8100 clr $ACC0 - 0421 195e lrri $AC0.M, @$AR2 - 0422 1200 sbclr #0x00 - 0423 b100 tst $ACC0 - 0424 0275 ifz - 0425 1300 sbset #0x00 - 0426 1c7e mrr $AR3, $AC0.M - 0427 195e lrri $AC0.M, @$AR2 - 0428 195f lrri $AC1.M, @$AR2 - 0429 5c00 sub $ACC0, $ACC1 - 042a 14fb asr $ACC0, #-5 - 042b 1f5e mrr $AX0.H, $AC0.M - 042c 1f1c mrr $AX0.L, $AC0.L - 042d 185e lrr $AC0.M, @$AR2 - 042e 0240 00ff andi $AC0.M, #0x00ff - 0430 1f7e mrr $AX1.H, $AC0.M - 0431 185e lrr $AC0.M, @$AR2 - 0432 1478 lsr $ACC0, #-8 - 0433 009c 0000 lri $AC0.L, #0x0000 - 0435 d100 cmpar $ACC1, $AX0.H - 0436 0295 043e jz 0x043e - 0438 185e lrr $AC0.M, @$AR2 - 0439 0272 ifg - 043a 7400 incm $AC0.M - 043b 0271 ifl - 043c 7800 decm $AC0.M - 043d 1a5e srr @$AR2, $AC0.M - 043e 0006 dar $AR2 - 043f 00de 038f lr $AC0.M, @0x038f - 0441 5600 subr $ACC0, $AX1.H - 0442 029d 0447 jlz 0x0447 - 0444 1c1e mrr $AR0, $AC0.M - 0445 02bf 0e01 call 0x0e01 - 0447 0000 nop - 0448 1b5f srri @$AR2, $AC1.M - 0449 000a iar $AR2 - 044a 8e00 set16 - 044b 8100 clr $ACC0 - 044c 00de 0407 lr $AC0.M, @0x0407 - 044e b100 tst $ACC0 - 044f 0295 0460 jz 0x0460 - 0451 00c3 038f lr $AR3, @0x038f - 0453 0087 004f lri $IX3, #0x004f - 0455 001f addarn $AR3, $IX3 - 0456 0080 0477 lri $AR0, #0x0477 - 0458 0084 ffff lri $IX0, #0xffff - 045a 0087 ffff lri $IX3, #0xffff - 045c 19fa lrrn $AX0.H, @$AR3 - 045d 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 045e 005e loop $AC0.M - 045f 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - 0460 00da 0406 lr $AX0.H, @0x0406 - 0462 8600 tstaxh $AX0.H - 0463 0294 0468 jnz 0x0468 - 0465 8100 clr $ACC0 - 0466 00fe 0404 sr @0x0404, $AC0.M - 0468 02bf 011b call 0x011b - 046a 00de 0354 lr $AC0.M, @0x0354 - 046c 7400 incm $AC0.M - 046d 00fe 0354 sr @0x0354, $AC0.M - 046f 009e b05e lri $AC0.M, #0xb05e - 0471 02bf 00a0 call 0x00a0 - 0473 0e00 lris $AC0.M, #0x00 - 0474 00fe 034e sr @0x034e, $AC0.M - 0476 0e04 lris $AC0.M, #0x04 - 0477 02bf 07e0 call 0x07e0 - 0479 00de 0355 lr $AC0.M, @0x0355 - 047b 0260 ff00 ori $AC0.M, #0xff00 - 047d 02bf 07ea call 0x07ea - 047f 02bf 0d62 call 0x0d62 - 0481 02bf 0d74 call 0x0d74 - 0483 02bf 0dc9 call 0x0dc9 - 0485 00de 0341 lr $AC0.M, @0x0341 - 0487 7800 decm $AC0.M - 0488 00fe 0341 sr @0x0341, $AC0.M - 048a 0080 09a0 lri $AR0, #0x09a0 - 048c 0083 0d00 lri $AR3, #0x0d00 - 048e 0f50 lris $AC1.M, #0x50 - 048f 0098 5a82 lri $AX0.L, #0x5a82 - 0491 02bf 0145 call 0x0145 - 0493 0080 09a0 lri $AR0, #0x09a0 - 0495 0083 0d60 lri $AR3, #0x0d60 - 0497 0f50 lris $AC1.M, #0x50 - 0498 02bf 0145 call 0x0145 - 049a 0083 0d00 lri $AR3, #0x0d00 - 049c 02bf 0e19 call 0x0e19 - 049e 0081 0388 lri $AR1, #0x0388 - 04a0 009f 0d00 lri $AC1.M, #0x0d00 - 04a2 0080 0050 lri $AR0, #0x0050 - 04a4 02bf 0654 call 0x0654 - 04a6 0080 0fa0 lri $AR0, #0x0fa0 - 04a8 0083 0d60 lri $AR3, #0x0d60 - 04aa 0f50 lris $AC1.M, #0x50 - 04ab 0098 8000 lri $AX0.L, #0x8000 - 04ad 02bf 0145 call 0x0145 - 04af 0083 0d60 lri $AR3, #0x0d60 - 04b1 02bf 0e19 call 0x0e19 - 04b3 0081 038a lri $AR1, #0x038a - 04b5 009f 0d60 lri $AC1.M, #0x0d60 - 04b7 0080 0050 lri $AR0, #0x0050 - 04b9 02bf 0654 call 0x0654 - 04bb 009a 0000 lri $AX0.H, #0x0000 - 04bd 0098 00a0 lri $AX0.L, #0x00a0 - 04bf 0080 0388 lri $AR0, #0x0388 - 04c1 02bf 02d3 call 0x02d3 - 04c3 0080 038a lri $AR0, #0x038a - 04c5 02bf 02d3 call 0x02d3 - 04c7 02bf 0285 call 0x0285 - 04c9 02bf 0512 call 0x0512 - 04cb 02bf 04e9 call 0x04e9 - 04cd 0000 nop - 04ce 0000 nop - 04cf 009e 0dac lri $AC0.M, #0x0dac - 04d1 02bf 00a0 call 0x00a0 - 04d3 0080 002b lri $AR0, #0x002b - 04d5 029f 0779 jmp 0x0779 - 04d7 0080 0374 lri $AR0, #0x0374 - 04d9 0e02 lris $AC0.M, #0x02 - 04da 02bf 0074 call 0x0074 - 04dc 00de 0374 lr $AC0.M, @0x0374 - 04de 0240 7fff andi $AC0.M, #0x7fff - 04e0 00fe 0374 sr @0x0374, $AC0.M - 04e2 00de 0376 lr $AC0.M, @0x0376 - 04e4 0240 7fff andi $AC0.M, #0x7fff - 04e6 00fe 0376 sr @0x0376, $AC0.M - 04e8 02df ret - 04e9 00da 0374 lr $AX0.H, @0x0374 - 04eb 8600 tstaxh $AX0.H - 04ec 02d5 retz - 04ed 0083 0f40 lri $AR3, #0x0f40 - 04ef 02bf 0e19 call 0x0e19 - 04f1 0083 0ca0 lri $AR3, #0x0ca0 - 04f3 02bf 0e19 call 0x0e19 - 04f5 0081 0374 lri $AR1, #0x0374 - 04f7 009f 0f40 lri $AC1.M, #0x0f40 - 04f9 0080 0050 lri $AR0, #0x0050 - 04fb 02bf 0654 call 0x0654 - 04fd 0081 0376 lri $AR1, #0x0376 - 04ff 009f 0ca0 lri $AC1.M, #0x0ca0 - 0501 0080 0050 lri $AR0, #0x0050 - 0503 02bf 0654 call 0x0654 - 0505 009a 0000 lri $AX0.H, #0x0000 - 0507 0098 00a0 lri $AX0.L, #0x00a0 - 0509 0080 0374 lri $AR0, #0x0374 - 050b 02bf 02d3 call 0x02d3 - 050d 0080 0376 lri $AR0, #0x0376 - 050f 02bf 02d3 call 0x02d3 - 0511 02df ret - 0512 00da 0374 lr $AX0.H, @0x0374 - 0514 8600 tstaxh $AX0.H - 0515 02d5 retz - 0516 009f 0be0 lri $AC1.M, #0x0be0 - 0518 00ff 03a1 sr @0x03a1, $AC1.M - 051a 00df 03ca lr $AC1.M, @0x03ca - 051c 00ff 0392 sr @0x0392, $AC1.M - 051e 00df 03cb lr $AC1.M, @0x03cb - 0520 00ff 0393 sr @0x0393, $AC1.M - 0522 009f 03a6 lri $AC1.M, #0x03a6 - 0524 00ff 03a0 sr @0x03a0, $AC1.M - 0526 00df 03c9 lr $AC1.M, @0x03c9 - 0528 00ff 0391 sr @0x0391, $AC1.M - 052a 02bf 026b call 0x026b - 052c 009f 0c40 lri $AC1.M, #0x0c40 - 052e 00ff 03a1 sr @0x03a1, $AC1.M - 0530 00df 03da lr $AC1.M, @0x03da - 0532 00ff 0392 sr @0x0392, $AC1.M - 0534 00df 03db lr $AC1.M, @0x03db - 0536 00ff 0393 sr @0x0393, $AC1.M - 0538 009f 03a7 lri $AC1.M, #0x03a7 - 053a 00ff 03a0 sr @0x03a0, $AC1.M - 053c 00df 03d9 lr $AC1.M, @0x03d9 - 053e 00ff 0391 sr @0x0391, $AC1.M - 0540 02bf 026b call 0x026b - 0542 02df ret - 0543 00da 0374 lr $AX0.H, @0x0374 - 0545 8600 tstaxh $AX0.H - 0546 02d5 retz - 0547 00da 03d8 lr $AX0.H, @0x03d8 - 0549 8600 tstaxh $AX0.H - 054a 02d5 retz - 054b 0083 0be0 lri $AR3, #0x0be0 - 054d 0080 0c30 lri $AR0, #0x0c30 - 054f 0f04 lris $AC1.M, #0x04 - 0550 02bf 0132 call 0x0132 - 0552 0083 0c40 lri $AR3, #0x0c40 - 0554 0080 0c90 lri $AR0, #0x0c90 - 0556 0f04 lris $AC1.M, #0x04 - 0557 02bf 0132 call 0x0132 - 0559 00df 03ca lr $AC1.M, @0x03ca - 055b 00ff 0392 sr @0x0392, $AC1.M - 055d 00df 03cb lr $AC1.M, @0x03cb - 055f 00ff 0393 sr @0x0393, $AC1.M - 0561 00df 03a6 lr $AC1.M, @0x03a6 - 0563 7500 incm $AC1.M - 0564 1f5f mrr $AX0.H, $AC1.M - 0565 009f 0be8 lri $AC1.M, #0x0be8 - 0567 02bf 01b2 call 0x01b2 - 0569 00df 03da lr $AC1.M, @0x03da - 056b 00ff 0392 sr @0x0392, $AC1.M - 056d 00df 03db lr $AC1.M, @0x03db - 056f 00ff 0393 sr @0x0393, $AC1.M - 0571 00df 03a7 lr $AC1.M, @0x03a7 - 0573 7500 incm $AC1.M - 0574 1f5f mrr $AX0.H, $AC1.M - 0575 009f 0c48 lri $AC1.M, #0x0c48 - 0577 02bf 01b2 call 0x01b2 - 0579 00de 03c8 lr $AC0.M, @0x03c8 - 057b 02a0 0001 andf $AC0.M, #0x0001 - 057d 029d 0586 jlz 0x0586 - 057f 0080 03d0 lri $AR0, #0x03d0 - 0581 0e08 lris $AC0.M, #0x08 - 0582 0081 0be0 lri $AR1, #0x0be0 - 0584 02bf 0c86 call 0x0c86 - 0586 00de 03d8 lr $AC0.M, @0x03d8 - 0588 02a0 0001 andf $AC0.M, #0x0001 - 058a 029d 0593 jlz 0x0593 - 058c 0080 03e0 lri $AR0, #0x03e0 - 058e 0e08 lris $AC0.M, #0x08 - 058f 0081 0c40 lri $AR1, #0x0c40 - 0591 02bf 0c86 call 0x0c86 - 0593 0f50 lris $AC1.M, #0x50 - 0594 0080 0be0 lri $AR0, #0x0be0 - 0596 0083 0f40 lri $AR3, #0x0f40 - 0598 00d8 03cd lr $AX0.L, @0x03cd - 059a 02bf 0145 call 0x0145 - 059c 0f50 lris $AC1.M, #0x50 - 059d 0080 0c40 lri $AR0, #0x0c40 - 059f 0083 0ca0 lri $AR3, #0x0ca0 - 05a1 00d8 03df lr $AX0.L, @0x03df - 05a3 02bf 0145 call 0x0145 - 05a5 00de 03c8 lr $AC0.M, @0x03c8 - 05a7 02a0 0002 andf $AC0.M, #0x0002 - 05a9 029d 05b2 jlz 0x05b2 - 05ab 0080 03d0 lri $AR0, #0x03d0 - 05ad 0e08 lris $AC0.M, #0x08 - 05ae 0081 0be0 lri $AR1, #0x0be0 - 05b0 02bf 0c86 call 0x0c86 - 05b2 00de 03d8 lr $AC0.M, @0x03d8 - 05b4 02a0 0002 andf $AC0.M, #0x0002 - 05b6 029d 05bf jlz 0x05bf - 05b8 0080 03e0 lri $AR0, #0x03e0 - 05ba 0e08 lris $AC0.M, #0x08 - 05bb 0081 0c40 lri $AR1, #0x0c40 - 05bd 02bf 0c86 call 0x0c86 - 05bf 02df ret - 05c0 0080 0346 lri $AR0, #0x0346 - 05c2 02bf 0072 call 0x0072 - 05c4 02bf 0072 call 0x0072 - 05c6 0081 0346 lri $AR1, #0x0346 - 05c8 193e lrri $AC0.M, @$AR1 - 05c9 193c lrri $AC0.L, @$AR1 - 05ca 009f 0400 lri $AC1.M, #0x0400 - 05cc 00c0 0345 lr $AR0, @0x0345 - 05ce 02bf 0649 call 0x0649 - 05d0 0081 0348 lri $AR1, #0x0348 - 05d2 193e lrri $AC0.M, @$AR1 - 05d3 193c lrri $AC0.L, @$AR1 - 05d4 009f 0800 lri $AC1.M, #0x0800 - 05d6 00c0 0345 lr $AR0, @0x0345 - 05d8 02bf 0649 call 0x0649 - 05da 0081 0346 lri $AR1, #0x0346 - 05dc 193e lrri $AC0.M, @$AR1 - 05dd 193c lrri $AC0.L, @$AR1 - 05de 009f 0800 lri $AC1.M, #0x0800 - 05e0 00c0 0345 lr $AR0, @0x0345 - 05e2 02bf 0656 call 0x0656 - 05e4 0081 0348 lri $AR1, #0x0348 - 05e6 193e lrri $AC0.M, @$AR1 - 05e7 193c lrri $AC0.L, @$AR1 - 05e8 009f 0400 lri $AC1.M, #0x0400 - 05ea 00c0 0345 lr $AR0, @0x0345 - 05ec 02bf 0656 call 0x0656 - 05ee 029f 004a jmp 0x004a - 05f0 0080 0346 lri $AR0, #0x0346 - 05f2 02bf 0072 call 0x0072 - 05f4 02bf 0072 call 0x0072 - 05f6 0081 0346 lri $AR1, #0x0346 - 05f8 193e lrri $AC0.M, @$AR1 - 05f9 193c lrri $AC0.L, @$AR1 - 05fa 009f 0400 lri $AC1.M, #0x0400 - 05fc 00c0 0345 lr $AR0, @0x0345 - 05fe 02bf 0649 call 0x0649 - 0600 0081 0348 lri $AR1, #0x0348 - 0602 193e lrri $AC0.M, @$AR1 - 0603 193c lrri $AC0.L, @$AR1 - 0604 009f 0400 lri $AC1.M, #0x0400 - 0606 00c0 0345 lr $AR0, @0x0345 - 0608 02bf 0656 call 0x0656 - 060a 029f 004a jmp 0x004a - 060c 0080 0346 lri $AR0, #0x0346 - 060e 02bf 0072 call 0x0072 - 0610 02bf 0072 call 0x0072 - 0612 0081 0346 lri $AR1, #0x0346 - 0614 193e lrri $AC0.M, @$AR1 - 0615 193c lrri $AC0.L, @$AR1 - 0616 009f 0400 lri $AC1.M, #0x0400 - 0618 00c0 0344 lr $AR0, @0x0344 - 061a 02bf 0649 call 0x0649 - 061c 0081 0348 lri $AR1, #0x0348 - 061e 193e lrri $AC0.M, @$AR1 - 061f 193c lrri $AC0.L, @$AR1 - 0620 009f 0800 lri $AC1.M, #0x0800 - 0622 00c0 0344 lr $AR0, @0x0344 - 0624 02bf 0649 call 0x0649 - 0626 0080 0400 lri $AR0, #0x0400 - 0628 0083 0800 lri $AR3, #0x0800 - 062a 0084 0000 lri $IX0, #0x0000 - 062c 00da 0345 lr $AX0.H, @0x0345 - 062e 00df 0344 lr $AC1.M, @0x0344 - 0630 8f00 set40 - 0631 197b lrri $AX1.H, @$AR3 - 0632 b800 mulx $AX0.H, $AX1.H - 0633 197b lrri $AX1.H, @$AR3 - 0634 007f 0639 bloop $AC1.M, 0x0639 - 0636 199e lrrn $AC0.M, @$AR0 - 0637 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0638 80b2 nx'sl : $AC0.M, $AX1.H - 0639 0000 nop - 063a 8e00 set16 - 063b 0081 0346 lri $AR1, #0x0346 - 063d 193e lrri $AC0.M, @$AR1 - 063e 193c lrri $AC0.L, @$AR1 - 063f 009f 0400 lri $AC1.M, #0x0400 - 0641 00c0 0344 lr $AR0, @0x0344 - 0643 02bf 0656 call 0x0656 - 0645 029f 004a jmp 0x004a - 0647 193e lrri $AC0.M, @$AR1 - 0648 193c lrri $AC0.L, @$AR1 - 0649 2fcd srs @DSPA, $AC1.M - 064a 0f00 lris $AC1.M, #0x00 - 064b 2fc9 srs @DSCR, $AC1.M - 064c 2ece srs @DSMAH, $AC0.M - 064d 2ccf srs @DSMAL, $AC0.L - 064e 1fe0 mrr $AC1.M, $AR0 - 064f 1501 lsl $ACC1, #1 - 0650 2fcb srs @DSBL, $AC1.M - 0651 02bf 065a call 0x065a - 0653 02df ret - 0654 193e lrri $AC0.M, @$AR1 - 0655 193c lrri $AC0.L, @$AR1 - 0656 2fcd srs @DSPA, $AC1.M - 0657 0f01 lris $AC1.M, #0x01 - 0658 029f 064b jmp 0x064b - 065a 26c9 lrs $AC0.M, @DSCR - 065b 02a0 0004 andf $AC0.M, #0x0004 - 065d 029c 065a jlnz 0x065a - 065f 02df ret - 0660 193e lrri $AC0.M, @$AR1 - 0661 193c lrri $AC0.L, @$AR1 - 0662 00ff ffcd sr @DSPA, $AC1.M - 0664 0f00 lris $AC1.M, #0x00 - 0665 00ff ffc9 sr @DSCR, $AC1.M - 0667 00fe ffce sr @DSMAH, $AC0.M - 0669 00fc ffcf sr @DSMAL, $AC0.L - 066b 1fe0 mrr $AC1.M, $AR0 - 066c 1501 lsl $ACC1, #1 - 066d 00ff ffcb sr @DSBL, $AC1.M - 066f 02df ret - 0670 00de ffc9 lr $AC0.M, @DSCR - 0672 02a0 0004 andf $AC0.M, #0x0004 - 0674 029c 0670 jlnz 0x0670 - 0676 02df ret - 0677 0080 0346 lri $AR0, #0x0346 - 0679 02bf 0072 call 0x0072 - 067b 02bf 0072 call 0x0072 - 067d 0081 0346 lri $AR1, #0x0346 - 067f 00df 0349 lr $AC1.M, @0x0349 - 0681 0340 ffff andi $AC1.M, #0xffff - 0683 00c0 0345 lr $AR0, @0x0345 - 0685 02bf 0647 call 0x0647 - 0687 029f 004a jmp 0x004a - 0689 0080 0346 lri $AR0, #0x0346 - 068b 02bf 0072 call 0x0072 - 068d 02bf 0072 call 0x0072 - 068f 0081 0346 lri $AR1, #0x0346 - 0691 00df 0349 lr $AC1.M, @0x0349 - 0693 0340 ffff andi $AC1.M, #0xffff - 0695 00c0 0345 lr $AR0, @0x0345 - 0697 02bf 0654 call 0x0654 - 0699 029f 004a jmp 0x004a - 069b 0092 00ff lri $CR, #0x00ff - 069d 009e ffff lri $AC0.M, #0xffff - 069f 2ed4 srs @ACSAH, $AC0.M - 06a0 2ed5 srs @ACSAL, $AC0.M - 06a1 2ed6 srs @ACEAH, $AC0.M - 06a2 2ed7 srs @ACEAL, $AC0.M - 06a3 02df ret - 06a4 00ff ffd1 sr @SampleFormat, $AC1.M - 06a6 0340 0003 andi $AC1.M, #0x0003 - 06a8 7900 decm $AC1.M - 06a9 02ca lsrn - 06aa 00df 037d lr $AC1.M, @0x037d - 06ac 00dd 037e lr $AC1.L, @0x037e - 06ae 4c00 add $ACC0, $ACC1 - 06af 00fe ffd8 sr @ACCAH, $AC0.M - 06b1 00fc ffd9 sr @ACCAL, $AC0.L - 06b3 02df ret - 06b4 1fc3 mrr $AC0.M, $AR3 - 06b5 043f addis $ACC0, #0x3f - 06b6 0240 fff0 andi $AC0.M, #0xfff0 - 06b8 00fe ffcd sr @DSPA, $AC0.M - 06ba 1c1a mrr $AR0, $AX0.H - 06bb 00da 037f lr $AX0.H, @0x037f - 06bd 4400 addr $ACC0, $AX0.H - 06be 1f40 mrr $AX0.H, $AR0 - 06bf 1c1e mrr $AR0, $AC0.M - 06c0 1fda mrr $AC0.M, $AX0.H - 06c1 041f addis $ACC0, #0x1f - 06c2 0240 fff0 andi $AC0.M, #0xfff0 - 06c4 1401 lsl $ACC0, #1 - 06c5 00fe ffcb sr @DSBL, $AC0.M - 06c7 00de ffc9 lr $AC0.M, @DSCR - 06c9 02a0 0004 andf $AC0.M, #0x0004 - 06cb 029c 06c7 jlnz 0x06c7 - 06cd 007a 06d0 bloop $AX0.H, 0x06d0 - 06cf 191e lrri $AC0.M, @$AR0 - 06d0 1b7e srri @$AR3, $AC0.M - 06d1 02df ret - 06d2 8900 clr $ACC1 - 06d3 1ffc mrr $AC1.M, $AC0.L - 06d4 0340 001f andi $AC1.M, #0x001f - 06d6 00ff 037f sr @0x037f, $AC1.M - 06d8 1ffc mrr $AC1.M, $AC0.L - 06d9 0340 ffe0 andi $AC1.M, #0xffe0 - 06db 1f9f mrr $AC0.L, $AC1.M - 06dc 00df 037d lr $AC1.M, @0x037d - 06de 00dd 037e lr $AC1.L, @0x037e - 06e0 4c00 add $ACC0, $ACC1 - 06e1 00fe ffce sr @DSMAH, $AC0.M - 06e3 00fc ffcf sr @DSMAL, $AC0.L - 06e5 0f00 lris $AC1.M, #0x00 - 06e6 00ff ffc9 sr @DSCR, $AC1.M - 06e8 02df ret - 06e9 00df 037f lr $AC1.M, @0x037f - 06eb 157f lsr $ACC1, #-1 - 06ec 00ff 037f sr @0x037f, $AC1.M - 06ee 02df ret - 06ef 8600 tstaxh $AX0.H - 06f0 02d5 retz - 06f1 1f1a mrr $AX0.L, $AX0.H - 06f2 009e 0780 lri $AC0.M, #0x0780 - 06f4 00fe ffcd sr @DSPA, $AC0.M - 06f6 1fda mrr $AC0.M, $AX0.H - 06f7 043f addis $ACC0, #0x3f - 06f8 0240 ffe0 andi $AC0.M, #0xffe0 - 06fa 00fe ffcb sr @DSBL, $AC0.M - 06fc 00de ffc9 lr $AC0.M, @DSCR - 06fe 02a0 0004 andf $AC0.M, #0x0004 - 0700 029c 06fc jlnz 0x06fc - 0702 8100 clr $ACC0 - 0703 00de 037f lr $AC0.M, @0x037f - 0705 147f lsr $ACC0, #-1 - 0706 0200 0780 addi $AC0.M, #0x0780 - 0708 1c1e mrr $AR0, $AC0.M - 0709 00de 037f lr $AC0.M, @0x037f - 070b 02a0 0001 andf $AC0.M, #0x0001 - 070d 029d 0716 jlz 0x0716 - 070f 8100 clr $ACC0 - 0710 191e lrri $AC0.M, @$AR0 - 0711 1488 asl $ACC0, #8 - 0712 1b7e srri @$AR3, $AC0.M - 0713 1fda mrr $AC0.M, $AX0.H - 0714 7800 decm $AC0.M - 0715 1f5e mrr $AX0.H, $AC0.M - 0716 8100 clr $ACC0 - 0717 1fda mrr $AC0.M, $AX0.H - 0718 147f lsr $ACC0, #-1 - 0719 007e 0722 bloop $AC0.M, 0x0722 - 071b 8100 clr $ACC0 - 071c 181e lrr $AC0.M, @$AR0 - 071d 0240 ff00 andi $AC0.M, #0xff00 - 071f 1b7e srri @$AR3, $AC0.M - 0720 191e lrri $AC0.M, @$AR0 - 0721 1488 asl $ACC0, #8 - 0722 1b7e srri @$AR3, $AC0.M - 0723 1fda mrr $AC0.M, $AX0.H - 0724 1f58 mrr $AX0.H, $AX0.L - 0725 02a0 0001 andf $AC0.M, #0x0001 - 0727 02dd retlz - 0728 8100 clr $ACC0 - 0729 181e lrr $AC0.M, @$AR0 - 072a 0240 ff00 andi $AC0.M, #0xff00 - 072c 1b7e srri @$AR3, $AC0.M - 072d 02df ret - 072e 1205 sbclr #0x05 - 072f 8e00 set16 - 0730 00f0 03fd sr @0x03fd, $AC0.H - 0732 00fc 03ff sr @0x03ff, $AC0.L - 0734 f400 lsr16 $ACC0 - 0735 00fc 03fe sr @0x03fe, $AC0.L - 0737 00fa 03fa sr @0x03fa, $AX0.H - 0739 8100 clr $ACC0 - 073a 00de fffe lr $AC0.M, @CMBH - 073c 02c0 8000 andcf $AC0.M, #0x8000 - 073e 029c 082f jlnz 0x082f - 0740 00da ffff lr $AX0.H, @CMBL - 0742 8600 tstaxh $AX0.H - 0743 0294 0808 jnz 0x0808 - 0745 00de fffe lr $AC0.M, @CMBH - 0747 02c0 8000 andcf $AC0.M, #0x8000 - 0749 029c 0745 jlnz 0x0745 - 074b 0240 000f andi $AC0.M, #0x000f - 074d 1f5e mrr $AX0.H, $AC0.M - 074e 7400 incm $AC0.M - 074f 0c00 lris $AC0.L, #0x00 - 0750 1404 lsl $ACC0, #4 - 0751 00fe 034e sr @0x034e, $AC0.M - 0753 1fda mrr $AC0.M, $AX0.H - 0754 1f40 mrr $AX0.H, $AR0 - 0755 0200 04fc addi $AC0.M, #0x04fc - 0757 1c1e mrr $AR0, $AC0.M - 0758 00de ffff lr $AC0.M, @CMBL - 075a 1a1e srr @$AR0, $AC0.M - 075b 1c1a mrr $AR0, $AX0.H - 075c 00de 03fe lr $AC0.M, @0x03fe - 075e 00dc 03ff lr $AC0.L, @0x03ff - 0760 00d0 03fd lr $AC0.H, @0x03fd - 0762 00da 03fa lr $AX0.H, @0x03fa - 0764 1305 sbset #0x05 - 0765 02ff rti - 0766 009a 0002 lri $AX0.H, #0x0002 - 0768 00fa 03a3 sr @0x03a3, $AX0.H - 076a 00e0 03f9 sr @0x03f9, $AR0 - 076c 02bf 07f2 call 0x07f2 - 076e 16fc dcd1 si @DMBH, #0xdcd1 - 0770 16fd 0002 si @DMBL, #0x0002 - 0772 16fb 0001 si @DIRQ, #0x0001 - 0774 0021 halt - 0775 078d cmpis $ACC1, #0x8d - 0776 078e cmpis $ACC1, #0x8e - 0777 07ce cmpis $ACC1, #0xce - 0778 07d1 cmpis $ACC1, #0xd1 - 0779 00e0 03f9 sr @0x03f9, $AR0 - 077b 009e 0005 lri $AC0.M, #0x0005 - 077d 02bf 07e0 call 0x07e0 - 077f 8e00 set16 - 0780 8100 clr $ACC0 - 0781 8900 clr $ACC1 - 0782 02bf 07d4 call 0x07d4 - 0784 27ff lrs $AC1.M, @CMBL - 0785 009e 0775 lri $AC0.M, #0x0775 - 0787 4c00 add $ACC0, $ACC1 - 0788 1c7e mrr $AR3, $AC0.M - 0789 0313 ilrr $AC1.M, @$AR3 - 078a 1c7f mrr $AR3, $AC1.M - 078b 176f jmpr $AR3 - 078c 0021 halt - 078d 0021 halt - 078e 009a 0002 lri $AX0.H, #0x0002 - 0790 00fa 03a3 sr @0x03a3, $AX0.H - 0792 8100 clr $ACC0 - 0793 8900 clr $ACC1 - 0794 02bf 07d4 call 0x07d4 - 0796 24ff lrs $AC0.L, @CMBL - 0797 02bf 07da call 0x07da - 0799 25ff lrs $AC1.L, @CMBL - 079a 02bf 07da call 0x07da - 079c 27ff lrs $AC1.M, @CMBL - 079d 2ece srs @DSMAH, $AC0.M - 079e 2ccf srs @DSMAL, $AC0.L - 079f 16c9 0001 si @DSCR, #0x0001 - 07a1 2fcd srs @DSPA, $AC1.M - 07a2 2dcb srs @DSBL, $AC1.L - 07a3 8100 clr $ACC0 - 07a4 8900 clr $ACC1 - 07a5 02bf 07d4 call 0x07d4 - 07a7 24ff lrs $AC0.L, @CMBL - 07a8 1c9e mrr $IX0, $AC0.M - 07a9 1cbc mrr $IX1, $AC0.L - 07aa 02bf 07da call 0x07da - 07ac 25ff lrs $AC1.L, @CMBL - 07ad 02bf 07da call 0x07da - 07af 27ff lrs $AC1.M, @CMBL - 07b0 1cdf mrr $IX2, $AC1.M - 07b1 1cfd mrr $IX3, $AC1.L - 07b2 8100 clr $ACC0 - 07b3 02bf 07d4 call 0x07d4 - 07b5 26ff lrs $AC0.M, @CMBL - 07b6 1c1e mrr $AR0, $AC0.M - 07b7 8900 clr $ACC1 - 07b8 02bf 07da call 0x07da - 07ba 20ff lrs $AX0.L, @CMBL - 07bb 1f5f mrr $AX0.H, $AC1.M - 07bc 02bf 07d4 call 0x07d4 - 07be 21ff lrs $AX1.L, @CMBL - 07bf 02bf 07d4 call 0x07d4 - 07c1 23ff lrs $AX1.H, @CMBL - 07c2 26c9 lrs $AC0.M, @DSCR - 07c3 02a0 0004 andf $AC0.M, #0x0004 - 07c5 029c 07c2 jlnz 0x07c2 - 07c7 1206 sbclr #0x06 - 07c8 1203 sbclr #0x03 - 07c9 1204 sbclr #0x04 - 07ca 1205 sbclr #0x05 - 07cb 029f 80b5 jmp 0x80b5 - 07cd 0021 halt - 07ce 029f 8000 jmp 0x8000 - 07d0 0021 halt - 07d1 00c0 03f9 lr $AR0, @0x03f9 - 07d3 170f jmpr $AR0 - 07d4 26fe lrs $AC0.M, @CMBH - 07d5 02c0 8000 andcf $AC0.M, #0x8000 - 07d7 029c 07d4 jlnz 0x07d4 - 07d9 02df ret - 07da 27fe lrs $AC1.M, @CMBH - 07db 03c0 8000 andcf $AC1.M, #0x8000 - 07dd 029c 07da jlnz 0x07da - 07df 02df ret - 07e0 02bf 07f8 call 0x07f8 - 07e2 16fc dcd1 si @DMBH, #0xdcd1 - 07e4 2efd srs @DMBL, $AC0.M - 07e5 16fb 0001 si @DIRQ, #0x0001 - 07e7 02bf 07f8 call 0x07f8 - 07e9 02df ret - 07ea 02bf 07f8 call 0x07f8 - 07ec 16fc f355 si @DMBH, #0xf355 - 07ee 2efd srs @DMBL, $AC0.M - 07ef 02bf 07f8 call 0x07f8 - 07f1 02df ret - 07f2 26fc lrs $AC0.M, @DMBH - 07f3 02c0 8000 andcf $AC0.M, #0x8000 - 07f5 029d 07f2 jlz 0x07f2 - 07f7 02df ret - 07f8 27fc lrs $AC1.M, @DMBH - 07f9 03c0 8000 andcf $AC1.M, #0x8000 - 07fb 029d 07f8 jlz 0x07f8 - 07fd 02df ret - 07fe 009a 0280 lri $AX0.H, #0x0280 - 0800 00fa 0350 sr @0x0350, $AX0.H - 0802 00fa 0351 sr @0x0351, $AX0.H - 0804 0a00 lris $AX0.H, #0x00 - 0805 00fa 0352 sr @0x0352, $AX0.H - 0807 02df ret - 0808 00e0 03fb sr @0x03fb, $AR0 - 080a 00e8 03fc sr @0x03fc, $WR0 - 080c 00c0 0350 lr $AR0, @0x0350 - 080e 0088 002f lri $WR0, #0x002f - 0810 1b1a srri @$AR0, $AX0.H - 0811 00de fffe lr $AC0.M, @CMBH - 0813 02c0 8000 andcf $AC0.M, #0x8000 - 0815 029c 0811 jlnz 0x0811 - 0817 00dc ffff lr $AC0.L, @CMBL - 0819 1b1e srri @$AR0, $AC0.M - 081a 1b1c srri @$AR0, $AC0.L - 081b 1fda mrr $AC0.M, $AX0.H - 081c 7800 decm $AC0.M - 081d 1f5e mrr $AX0.H, $AC0.M - 081e 8600 tstaxh $AX0.H - 081f 0294 0811 jnz 0x0811 - 0821 8100 clr $ACC0 - 0822 00de 0352 lr $AC0.M, @0x0352 - 0824 7400 incm $AC0.M - 0825 00fe 0352 sr @0x0352, $AC0.M - 0827 00e0 0350 sr @0x0350, $AR0 - 0829 00c0 03fb lr $AR0, @0x03fb - 082b 00c8 03fc lr $WR0, @0x03fc - 082d 029f 075c jmp 0x075c - 082f 00e0 03fb sr @0x03fb, $AR0 - 0831 00e8 03fc sr @0x03fc, $WR0 - 0833 00c0 0350 lr $AR0, @0x0350 - 0835 0088 002f lri $WR0, #0x002f - 0837 0a00 lris $AX0.H, #0x00 - 0838 1b1a srri @$AR0, $AX0.H - 0839 029f 0821 jmp 0x0821 - 083b 00c0 0351 lr $AR0, @0x0351 - 083d 0088 002f lri $WR0, #0x002f - 083f 00da 0352 lr $AX0.H, @0x0352 - 0841 8600 tstaxh $AX0.H - 0842 0295 0863 jz 0x0863 - 0844 1205 sbclr #0x05 - 0845 00da 0352 lr $AX0.H, @0x0352 - 0847 1fda mrr $AC0.M, $AX0.H - 0848 7800 decm $AC0.M - 0849 00fe 0352 sr @0x0352, $AC0.M - 084b 1305 sbset #0x05 - 084c 0081 0356 lri $AR1, #0x0356 - 084e 191e lrri $AC0.M, @$AR0 - 084f 02c0 8000 andcf $AC0.M, #0x8000 - 0851 029d 0867 jlz 0x0867 - 0853 1f5e mrr $AX0.H, $AC0.M - 0854 8600 tstaxh $AX0.H - 0855 0295 086b jz 0x086b - 0857 007a 085c bloop $AX0.H, 0x085c - 0859 191e lrri $AC0.M, @$AR0 - 085a 1b3e srri @$AR1, $AC0.M - 085b 191e lrri $AC0.M, @$AR0 - 085c 1b3e srri @$AR1, $AC0.M - 085d 00e0 0351 sr @0x0351, $AR0 - 085f 0088 ffff lri $WR0, #0xffff - 0861 029f 0036 jmp 0x0036 - 0863 0088 ffff lri $WR0, #0xffff - 0865 029f 002b jmp 0x002b - 0867 00e0 0351 sr @0x0351, $AR0 - 0869 029f 083f jmp 0x083f - 086b 0080 083b lri $AR0, #0x083b - 086d 029f 0766 jmp 0x0766 - 086f 8100 clr $ACC0 - 0870 0e10 lris $AC0.M, #0x10 - 0871 2232 lrs $AX0.H, @0x0032 - 0872 8600 tstaxh $AX0.H - 0873 02d5 retz - 0874 5400 subr $ACC0, $AX0.H - 0875 0200 0458 addi $AC0.M, #0x0458 - 0877 1c1e mrr $AR0, $AC0.M - 0878 1fda mrr $AC0.M, $AX0.H - 0879 04fe addis $ACC0, #0xfe - 087a 1f1e mrr $AX0.L, $AC0.M - 087b 191e lrri $AC0.M, @$AR0 - 087c 0291 0882 jl 0x0882 - 087e 191a lrri $AX0.H, @$AR0 - 087f 0058 loop $AX0.L - 0880 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0881 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 0882 1b7e srri @$AR3, $AC0.M - 0883 02df ret - 0884 02bf 086f call 0x086f - 0886 8100 clr $ACC0 - 0887 2632 lrs $AC0.M, @0x0032 - 0888 5c00 sub $ACC0, $ACC1 - 0889 2e32 srs @0x0032, $AC0.M - 088a 0092 00ff lri $CR, #0x00ff - 088c 02df ret - 088d 00de 04fb lr $AC0.M, @0x04fb - 088f 7400 incm $AC0.M - 0890 00fe 04fb sr @0x04fb, $AC0.M - 0892 8100 clr $ACC0 - 0893 2e32 srs @0x0032, $AC0.M - 0894 2e66 srs @0x0066, $AC0.M - 0895 2e67 srs @0x0067, $AC0.M - 0896 268a lrs $AC0.M, @0xff8a - 0897 248b lrs $AC0.L, @0xff8b - 0898 2e3a srs @0x003a, $AC0.M - 0899 2c3b srs @0x003b, $AC0.L - 089a 268c lrs $AC0.M, @0xff8c - 089b 248d lrs $AC0.L, @0xff8d - 089c 2e38 srs @0x0038, $AC0.M - 089d 2c39 srs @0x0039, $AC0.L - 089e 02df ret - 089f 8100 clr $ACC0 - 08a0 2689 lrs $AC0.M, @0xff89 - 08a1 0240 000f andi $AC0.M, #0x000f - 08a3 1f5e mrr $AX0.H, $AC0.M - 08a4 8100 clr $ACC0 - 08a5 0e10 lris $AC0.M, #0x10 - 08a6 5400 subr $ACC0, $AX0.H - 08a7 2e32 srs @0x0032, $AC0.M - 08a8 268a lrs $AC0.M, @0xff8a - 08a9 248b lrs $AC0.L, @0xff8b - 08aa 2288 lrs $AX0.H, @0xff88 - 08ab 2089 lrs $AX0.L, @0xff89 - 08ac 5800 subax $ACC0, $AX0.L - 08ad 0a00 lris $AX0.H, #0x00 - 08ae 2032 lrs $AX0.L, @0x0032 - 08af 5800 subax $ACC0, $AX0.L - 08b0 2e3a srs @0x003a, $AC0.M - 08b1 2c3b srs @0x003b, $AC0.L - 08b2 02df ret - 08b3 0092 0004 lri $CR, #0x0004 - 08b5 8100 clr $ACC0 - 08b6 2604 lrs $AC0.M, @0x0004 - 08b7 b100 tst $ACC0 - 08b8 02b4 088d callnz 0x088d - 08ba 8100 clr $ACC0 - 08bb 2601 lrs $AC0.M, @0x0001 - 08bc b100 tst $ACC0 - 08bd 0294 095b jnz 0x095b - 08bf 2232 lrs $AX0.H, @0x0032 - 08c0 c900 cmpar $ACC0, $AX1.H - 08c1 0293 0884 jle 0x0884 - 08c3 5500 subr $ACC1, $AX0.H - 08c4 02bf 086f call 0x086f - 08c6 223a lrs $AX0.H, @0x003a - 08c7 8600 tstaxh $AX0.H - 08c8 0294 08cf jnz 0x08cf - 08ca 8100 clr $ACC0 - 08cb 263b lrs $AC0.M, @0x003b - 08cc 8200 cmp - 08cd 0291 0921 jl 0x0921 - 08cf 8100 clr $ACC0 - 08d0 1fdf mrr $AC0.M, $AC1.M - 08d1 040f addis $ACC0, #0x0f - 08d2 147c lsr $ACC0, #-4 - 08d3 1f7e mrr $AX1.H, $AC0.M - 08d4 0c00 lris $AC0.L, #0x00 - 08d5 1404 lsl $ACC0, #4 - 08d6 1f1e mrr $AX0.L, $AC0.M - 08d7 0a00 lris $AX0.H, #0x00 - 08d8 8100 clr $ACC0 - 08d9 263a lrs $AC0.M, @0x003a - 08da 243b lrs $AC0.L, @0x003b - 08db 5800 subax $ACC0, $AX0.L - 08dc 0290 08e7 jge 0x08e7 - 08de 8100 clr $ACC0 - 08df 263b lrs $AC0.M, @0x003b - 08e0 5c00 sub $ACC0, $ACC1 - 08e1 2e32 srs @0x0032, $AC0.M - 08e2 8100 clr $ACC0 - 08e3 2e3a srs @0x003a, $AC0.M - 08e4 2e3b srs @0x003b, $AC0.M - 08e5 029f 08ed jmp 0x08ed - 08e7 2e3a srs @0x003a, $AC0.M - 08e8 2c3b srs @0x003b, $AC0.L - 08e9 0c00 lris $AC0.L, #0x00 - 08ea 1fd8 mrr $AC0.M, $AX0.L - 08eb 5c00 sub $ACC0, $ACC1 - 08ec 2e32 srs @0x0032, $AC0.M - 08ed 8100 clr $ACC0 - 08ee 1fdb mrr $AC0.M, $AX1.H - 08ef 02bf 0961 call 0x0961 - 08f1 2232 lrs $AX0.H, @0x0032 - 08f2 8600 tstaxh $AX0.H - 08f3 0295 091e jz 0x091e - 08f5 0a10 lris $AX0.H, #0x10 - 08f6 8100 clr $ACC0 - 08f7 1fc3 mrr $AC0.M, $AR3 - 08f8 5400 subr $ACC0, $AX0.H - 08f9 1c7e mrr $AR3, $AC0.M - 08fa 0080 0458 lri $AR0, #0x0458 - 08fc 197e lrri $AC0.M, @$AR3 - 08fd 197a lrri $AX0.H, @$AR3 - 08fe 100e loopi #0x0e - 08ff 64a2 movr'sl $ACC0, $AX0.H : $AC0.M, $AX0.H - 0900 1b1e srri @$AR0, $AC0.M - 0901 1b1a srri @$AR0, $AX0.H - 0902 8100 clr $ACC0 - 0903 263a lrs $AC0.M, @0x003a - 0904 243b lrs $AC0.L, @0x003b - 0905 b100 tst $ACC0 - 0906 0294 091e jnz 0x091e - 0908 2232 lrs $AX0.H, @0x0032 - 0909 8600 tstaxh $AX0.H - 090a 0295 091e jz 0x091e - 090c 0080 0467 lri $AR0, #0x0467 - 090e 8100 clr $ACC0 - 090f 268b lrs $AC0.M, @0xff8b - 0910 b100 tst $ACC0 - 0911 0295 091e jz 0x091e - 0913 0200 000f addi $AC0.M, #0x000f - 0915 0240 000f andi $AC0.M, #0x000f - 0917 0200 0458 addi $AC0.M, #0x0458 - 0919 1c7e mrr $AR3, $AC0.M - 091a 007a 091d bloop $AX0.H, 0x091d - 091c 18fe lrrd $AC0.M, @$AR3 - 091d 1a9e srrd @$AR0, $AC0.M - 091e 0092 00ff lri $CR, #0x00ff - 0920 02df ret - 0921 b100 tst $ACC0 - 0922 0295 0931 jz 0x0931 - 0924 5d00 sub $ACC1, $ACC0 - 0925 040f addis $ACC0, #0x0f - 0926 147c lsr $ACC0, #-4 - 0927 0c00 lris $AC0.L, #0x00 - 0928 00e3 0363 sr @0x0363, $AR3 - 092a 02bf 0961 call 0x0961 - 092c 00de 0363 lr $AC0.M, @0x0363 - 092e 223b lrs $AX0.H, @0x003b - 092f 4400 addr $ACC0, $AX0.H - 0930 1c7e mrr $AR3, $AC0.M - 0931 8100 clr $ACC0 - 0932 2681 lrs $AC0.M, @0xff81 - 0933 b100 tst $ACC0 - 0934 0295 0959 jz 0x0959 - 0936 2380 lrs $AX1.H, @0xff80 - 0937 2688 lrs $AC0.M, @0xff88 - 0938 2489 lrs $AC0.L, @0xff89 - 0939 1408 lsl $ACC0, #8 - 093a 14f4 asr $ACC0, #-12 - 093b 2380 lrs $AX1.H, @0xff80 - 093c 8d00 set15 - 093d c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - 093e ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 093f 8c00 clr15 - 0940 f000 lsl16 $ACC0 - 0941 4e00 addp $ACC0 - 0942 238c lrs $AX1.H, @0xff8c - 0943 218d lrs $AX1.L, @0xff8d - 0944 4a00 addax $ACC0, $AX1.L - 0945 2e38 srs @0x0038, $AC0.M - 0946 2c39 srs @0x0039, $AC0.L - 0947 2682 lrs $AC0.M, @0xff82 - 0948 2e67 srs @0x0067, $AC0.M - 0949 2683 lrs $AC0.M, @0xff83 - 094a 2e66 srs @0x0066, $AC0.M - 094b 00e3 0363 sr @0x0363, $AR3 - 094d 0083 0458 lri $AR3, #0x0458 - 094f 8100 clr $ACC0 - 0950 0e01 lris $AC0.M, #0x01 - 0951 02bf 0961 call 0x0961 - 0953 00c3 0363 lr $AR3, @0x0363 - 0955 02bf 089f call 0x089f - 0957 029f 08bf jmp 0x08bf - 0959 0e01 lris $AC0.M, #0x01 - 095a 2e01 srs @0x0001, $AC0.M - 095b 8100 clr $ACC0 - 095c 005f loop $AC1.M - 095d 1b7e srri @$AR3, $AC0.M - 095e 0092 00ff lri $CR, #0x00ff - 0960 02df ret - 0961 00ff 0360 sr @0x0360, $AC1.M - 0963 00fe 0361 sr @0x0361, $AC0.M - 0965 2638 lrs $AC0.M, @0x0038 - 0966 2439 lrs $AC0.L, @0x0039 - 0967 0f05 lris $AC1.M, #0x05 - 0968 02bf 06a4 call 0x06a4 - 096a 2638 lrs $AC0.M, @0x0038 - 096b 2439 lrs $AC0.L, @0x0039 - 096c 8900 clr $ACC1 - 096d 00df 0361 lr $AC1.M, @0x0361 - 096f 2280 lrs $AX0.H, @0xff80 - 0970 d000 mulc $AC1.M, $AX0.H - 0971 6f00 movp $ACC1 - 0972 4c00 add $ACC0, $ACC1 - 0973 2e38 srs @0x0038, $AC0.M - 0974 2c39 srs @0x0039, $AC0.L - 0975 8100 clr $ACC0 - 0976 00de 0361 lr $AC0.M, @0x0361 - 0978 007e 09df bloop $AC0.M, 0x09df - 097a 0080 ffd3 lri $AR0, #0xffd3 - 097c 0084 0000 lri $IX0, #0x0000 - 097e 199e lrrn $AC0.M, @$AR0 - 097f 8900 clr $ACC1 - 0980 1ffe mrr $AC1.M, $AC0.M - 0981 1401 lsl $ACC0, #1 - 0982 0240 001e andi $AC0.M, #0x001e - 0984 0200 0300 addi $AC0.M, #0x0300 - 0986 1c3e mrr $AR1, $AC0.M - 0987 157c lsr $ACC1, #-4 - 0988 0340 000f andi $AC1.M, #0x000f - 098a 0a11 lris $AX0.H, #0x11 - 098b 5500 subr $ACC1, $AX0.H - 098c 8100 clr $ACC0 - 098d 2680 lrs $AC0.M, @0xff80 - 098e 0605 cmpis $ACC0, #0x05 - 098f 0295 09a8 jz 0x09a8 - 0991 009a 00f0 lri $AX0.H, #0x00f0 - 0993 0b0f lris $AX1.H, #0x0f - 0994 0082 0364 lri $AR2, #0x0364 - 0996 1998 lrrn $AX0.L, @$AR0 - 0997 6000 movr $ACC0, $AX0.L - 0998 1107 099f bloopi #0x07, 0x099f - 099a 3400 andr $AC0.M, $AX0.H - 099b 1408 lsl $ACC0, #8 - 099c 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 099d 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 099e 140c lsl $ACC0, #12 - 099f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09a0 3400 andr $AC0.M, $AX0.H - 09a1 1408 lsl $ACC0, #8 - 09a2 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09a3 3600 andr $AC0.M, $AX1.H - 09a4 140c lsl $ACC0, #12 - 09a5 1b5e srri @$AR2, $AC0.M - 09a6 029f 09c8 jmp 0x09c8 - 09a8 009a c000 lri $AX0.H, #0xc000 - 09aa 0082 0364 lri $AR2, #0x0364 - 09ac 1998 lrrn $AX0.L, @$AR0 - 09ad 6000 movr $ACC0, $AX0.L - 09ae 1103 09bb bloopi #0x03, 0x09bb - 09b0 1408 lsl $ACC0, #8 - 09b1 3400 andr $AC0.M, $AX0.H - 09b2 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b3 140a lsl $ACC0, #10 - 09b4 3400 andr $AC0.M, $AX0.H - 09b5 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b6 140c lsl $ACC0, #12 - 09b7 3400 andr $AC0.M, $AX0.H - 09b8 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b9 140e lsl $ACC0, #14 - 09ba 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0 - 09bb 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09bc 1408 lsl $ACC0, #8 - 09bd 3400 andr $AC0.M, $AX0.H - 09be 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09bf 140a lsl $ACC0, #10 - 09c0 3400 andr $AC0.M, $AX0.H - 09c1 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09c2 140c lsl $ACC0, #12 - 09c3 3400 andr $AC0.M, $AX0.H - 09c4 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09c5 140e lsl $ACC0, #14 - 09c6 3400 andr $AC0.M, $AX0.H - 09c7 1b5e srri @$AR2, $AC0.M - 09c8 8f00 set40 - 09c9 1f7f mrr $AX1.H, $AC1.M - 09ca 2066 lrs $AX0.L, @0x0066 - 09cb 2767 lrs $AC1.M, @0x0067 - 09cc 193a lrri $AX0.H, @$AR1 - 09cd 1939 lrri $AX1.L, @$AR1 - 09ce 0080 0364 lri $AR0, #0x0364 - 09d0 a000 mulx $AX0.L, $AX1.L - 09d1 ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - 09d2 1108 09db bloopi #0x08, 0x09db - 09d4 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 09d5 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 09d6 1485 asl $ACC0, #5 - 09d7 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 09d8 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 09d9 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 09da 1585 asl $ACC1, #5 - 09db ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - 09dc 2f67 srs @0x0067, $AC1.M - 09dd 8e00 set16 - 09de 1ff8 mrr $AC1.M, $AX0.L - 09df 2f66 srs @0x0066, $AC1.M - 09e0 8900 clr $ACC1 - 09e1 00df 0360 lr $AC1.M, @0x0360 - 09e3 02df ret - 09e4 b100 tst $ACC0 - 09e5 02d5 retz - 09e6 04fe addis $ACC0, #0xfe - 09e7 1f1e mrr $AX0.L, $AC0.M - 09e8 191e lrri $AC0.M, @$AR0 - 09e9 0291 09ef jl 0x09ef - 09eb 191a lrri $AX0.H, @$AR0 - 09ec 0058 loop $AX0.L - 09ed 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 09ee 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 09ef 1b7e srri @$AR3, $AC0.M - 09f0 02df ret - 09f1 8100 clr $ACC0 - 09f2 1f5e mrr $AX0.H, $AC0.M - 09f3 00d8 0402 lr $AX0.L, @0x0402 - 09f5 00dc 0430 lr $AC0.L, @0x0430 - 09f7 0080 0520 lri $AR0, #0x0520 - 09f9 00df 0480 lr $AC1.M, @0x0480 - 09fb 1501 lsl $ACC1, #1 - 09fc 0340 007e andi $AC1.M, #0x007e - 09fe 0300 0a06 addi $AC1.M, #0x0a06 - 0a00 1c5f mrr $AR2, $AC1.M - 0a01 175f callr $AR2 - 0a02 00fc 0430 sr @0x0430, $AC0.L - 0a04 029f 0386 jmp 0x0386 - 0a06 029f 0a27 jmp 0x0a27 - 0a08 029f 0a62 jmp 0x0a62 - 0a0a 029f 0a4a jmp 0x0a4a - 0a0c 029f 0a37 jmp 0x0a37 - 0a0e 029f 0a70 jmp 0x0a70 - 0a10 029f 0a26 jmp 0x0a26 - 0a12 029f 0a8e jmp 0x0a8e - 0a14 029f 0a91 jmp 0x0a91 - 0a16 029f 0a26 jmp 0x0a26 - 0a18 029f 0a26 jmp 0x0a26 - 0a1a 029f 0aaf jmp 0x0aaf - 0a1c 029f 0a68 jmp 0x0a68 - 0a1e 029f 0a6c jmp 0x0a6c - 0a20 029f 0a26 jmp 0x0a26 - 0a22 029f 0a26 jmp 0x0a26 - 0a24 029f 0a26 jmp 0x0a26 - 0a26 02df ret - 0a27 1401 lsl $ACC0, #1 - 0a28 009b c000 lri $AX1.H, #0xc000 - 0a2a 0099 4000 lri $AX1.L, #0x4000 - 0a2c 1150 0a34 bloopi #0x50, 0x0a34 - 0a2e 02c0 0001 andcf $AC0.M, #0x0001 - 0a30 027c iflnz - 0a31 1b1b srri @$AR0, $AX1.H - 0a32 027d iflz - 0a33 1b19 srri @$AR0, $AX1.L - 0a34 4800 addax $ACC0, $AX0.L - 0a35 147f lsr $ACC0, #-1 - 0a36 02df ret - 0a37 1402 lsl $ACC0, #2 - 0a38 8900 clr $ACC1 - 0a39 1fb8 mrr $AC1.L, $AX0.L - 0a3a 1501 lsl $ACC1, #1 - 0a3b 009b c000 lri $AX1.H, #0xc000 - 0a3d 0099 4000 lri $AX1.L, #0x4000 - 0a3f 1150 0a47 bloopi #0x50, 0x0a47 - 0a41 02c0 0003 andcf $AC0.M, #0x0003 - 0a43 027c iflnz - 0a44 1b1b srri @$AR0, $AX1.H - 0a45 027d iflz - 0a46 1b19 srri @$AR0, $AX1.L - 0a47 4c00 add $ACC0, $ACC1 - 0a48 147e lsr $ACC0, #-2 - 0a49 02df ret - 0a4a 1401 lsl $ACC0, #1 - 0a4b 0081 0ca0 lri $AR1, #0x0ca0 - 0a4d 009b c000 lri $AX1.H, #0xc000 - 0a4f 0099 4000 lri $AX1.L, #0x4000 - 0a51 8900 clr $ACC1 - 0a52 0082 0000 lri $AR2, #0x0000 - 0a54 1150 0a5f bloopi #0x50, 0x0a5f - 0a56 02c0 0001 andcf $AC0.M, #0x0001 - 0a58 027c iflnz - 0a59 1b1b srri @$AR0, $AX1.H - 0a5a 027d iflz - 0a5b 1b19 srri @$AR0, $AX1.L - 0a5c 183d lrr $AC1.L, @$AR1 - 0a5d 4900 addax $ACC1, $AX0.L - 0a5e 1fe2 mrr $AC1.M, $AR2 - 0a5f 4c39 add's $ACC0, $ACC1 : @$AR1, $AC1.M - 0a60 147f lsr $ACC0, #-1 - 0a61 02df ret - 0a62 8900 clr $ACC1 - 0a63 1fb8 mrr $AC1.L, $AX0.L - 0a64 157f lsr $ACC1, #-1 - 0a65 1050 loopi #0x50 - 0a66 4c20 add's $ACC0, $ACC1 : @$AR0, $AC0.L - 0a67 02df ret - 0a68 0082 0180 lri $AR2, #0x0180 - 0a6a 029f 0a72 jmp 0x0a72 - 0a6c 0082 01c0 lri $AR2, #0x01c0 - 0a6e 029f 0a72 jmp 0x0a72 - 0a70 0082 0140 lri $AR2, #0x0140 - 0a72 008a 003f lri $WR2, #0x003f - 0a74 0086 0000 lri $IX2, #0x0000 - 0a76 1406 lsl $ACC0, #6 - 0a77 8900 clr $ACC1 - 0a78 1fb8 mrr $AC1.L, $AX0.L - 0a79 1505 lsl $ACC1, #5 - 0a7a 009b 003f lri $AX1.H, #0x003f - 0a7c 009a 0000 lri $AX0.H, #0x0000 - 0a7e 3600 andr $AC0.M, $AX1.H - 0a7f 1cde mrr $IX2, $AC0.M - 0a80 001a addarn $AR2, $IX2 - 0a81 3400 andr $AC0.M, $AX0.H - 0a82 1150 0a88 bloopi #0x50, 0x0a88 - 0a84 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a85 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a86 1cde mrr $IX2, $AC0.M - 0a87 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a88 1b19 srri @$AR0, $AX1.L - 0a89 1fc2 mrr $AC0.M, $AR2 - 0a8a 147a lsr $ACC0, #-6 - 0a8b 008a ffff lri $WR2, #0xffff - 0a8d 02df ret - 0a8e 1050 loopi #0x50 - 0a8f 1b18 srri @$AR0, $AX0.L - 0a90 02df ret - 0a91 0082 0100 lri $AR2, #0x0100 - 0a93 008a 003f lri $WR2, #0x003f - 0a95 0086 0000 lri $IX2, #0x0000 - 0a97 1406 lsl $ACC0, #6 - 0a98 8900 clr $ACC1 - 0a99 1fb8 mrr $AC1.L, $AX0.L - 0a9a 1505 lsl $ACC1, #5 - 0a9b 009b 003f lri $AX1.H, #0x003f - 0a9d 009a 0000 lri $AX0.H, #0x0000 - 0a9f 3600 andr $AC0.M, $AX1.H - 0aa0 1cde mrr $IX2, $AC0.M - 0aa1 001a addarn $AR2, $IX2 - 0aa2 3400 andr $AC0.M, $AX0.H - 0aa3 1150 0aa9 bloopi #0x50, 0x0aa9 - 0aa5 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0aa6 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0aa7 1cde mrr $IX2, $AC0.M - 0aa8 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0aa9 1b19 srri @$AR0, $AX1.L - 0aaa 1fc2 mrr $AC0.M, $AR2 - 0aab 147a lsr $ACC0, #-6 - 0aac 008a ffff lri $WR2, #0xffff - 0aae 02df ret - 0aaf 0082 0100 lri $AR2, #0x0100 - 0ab1 008a 003f lri $WR2, #0x003f - 0ab3 0086 0000 lri $IX2, #0x0000 - 0ab5 0081 0ca0 lri $AR1, #0x0ca0 - 0ab7 1406 lsl $ACC0, #6 - 0ab8 8900 clr $ACC1 - 0ab9 1fb8 mrr $AC1.L, $AX0.L - 0aba 1505 lsl $ACC1, #5 - 0abb 009b 003f lri $AX1.H, #0x003f - 0abd 009a 0000 lri $AX0.H, #0x0000 - 0abf 3600 andr $AC0.M, $AX1.H - 0ac0 1cde mrr $IX2, $AC0.M - 0ac1 001a addarn $AR2, $IX2 - 0ac2 3400 andr $AC0.M, $AX0.H - 0ac3 1150 0ace bloopi #0x50, 0x0ace - 0ac5 1939 lrri $AX1.L, @$AR1 - 0ac6 a000 mulx $AX0.L, $AX1.L - 0ac7 140a lsl $ACC0, #10 - 0ac8 4e00 addp $ACC0 - 0ac9 1476 lsr $ACC0, #-10 - 0aca 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0acb 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0acc 1cde mrr $IX2, $AC0.M - 0acd 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0ace 1b19 srri @$AR0, $AX1.L - 0acf 1fc2 mrr $AC0.M, $AR2 - 0ad0 147a lsr $ACC0, #-6 - 0ad1 008a ffff lri $WR2, #0xffff - 0ad3 02df ret - 0ad4 0080 01be lri $AR0, #0x01be - 0ad6 1918 lrri $AX0.L, @$AR0 - 0ad7 191a lrri $AX0.H, @$AR0 - 0ad8 0080 0180 lri $AR0, #0x0180 - 0ada 0083 0180 lri $AR3, #0x0180 - 0adc 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0add 1ffe mrr $AC1.M, $AC0.M - 0ade 1120 0ae5 bloopi #0x20, 0x0ae5 - 0ae0 7c00 neg $ACC0 - 0ae1 d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0ae2 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0ae3 c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 0ae4 1501 lsl $ACC1, #1 - 0ae5 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - 0ae6 0080 01fe lri $AR0, #0x01fe - 0ae8 191a lrri $AX0.H, @$AR0 - 0ae9 1918 lrri $AX0.L, @$AR0 - 0aea 0080 01c0 lri $AR0, #0x01c0 - 0aec 0083 01c0 lri $AR3, #0x01c0 - 0aee 1ff8 mrr $AC1.M, $AX0.L - 0aef 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0af0 f800 addpaxz $ACC0, $AX0.H - 0af1 0240 01ff andi $AC0.M, #0x01ff - 0af3 0260 2000 ori $AC0.M, #0x2000 - 0af5 02bf 0af8 call 0x0af8 - 0af7 02df ret - 0af8 b900 tst $ACC1 - 0af9 0272 ifg - 0afa 7c00 neg $ACC0 - 0afb 1f7e mrr $AX1.H, $AC0.M - 0afc 4700 addr $ACC1, $AX1.H - 0afd 1110 0b02 bloopi #0x10, 0x0b02 - 0aff 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0b00 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0b01 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0b02 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0b03 02df ret - 0b04 02bf 0b71 call 0x0b71 - 0b06 2201 lrs $AX0.H, @0x0001 - 0b07 8600 tstaxh $AX0.H - 0b08 0294 0b19 jnz 0x0b19 - 0b0a 2204 lrs $AX0.H, @0x0004 - 0b0b 8600 tstaxh $AX0.H - 0b0c 02b4 0b60 callnz 0x0b60 - 0b0e 8100 clr $ACC0 - 0b0f 2605 lrs $AC0.M, @0x0005 - 0b10 b100 tst $ACC0 - 0b11 0295 0b26 jz 0x0b26 - 0b13 8100 clr $ACC0 - 0b14 2e05 srs @0x0005, $AC0.M - 0b15 2281 lrs $AX0.H, @0xff81 - 0b16 8600 tstaxh $AX0.H - 0b17 0294 0b20 jnz 0x0b20 - 0b19 8100 clr $ACC0 - 0b1a 005f loop $AC1.M - 0b1b 1b7e srri @$AR3, $AC0.M - 0b1c 7400 incm $AC0.M - 0b1d 2e01 srs @0x0001, $AC0.M - 0b1e 029f 0b59 jmp 0x0b59 - 0b20 2688 lrs $AC0.M, @0xff88 - 0b21 2489 lrs $AC0.L, @0xff89 - 0b22 2e34 srs @0x0034, $AC0.M - 0b23 2c35 srs @0x0035, $AC0.L - 0b24 02bf 0b60 call 0x0b60 - 0b26 00ff 0360 sr @0x0360, $AC1.M - 0b28 2638 lrs $AC0.M, @0x0038 - 0b29 2439 lrs $AC0.L, @0x0039 - 0b2a 02bf 06d2 call 0x06d2 - 0b2c 00df 0360 lr $AC1.M, @0x0360 - 0b2e 8100 clr $ACC0 - 0b2f 263a lrs $AC0.M, @0x003a - 0b30 b100 tst $ACC0 - 0b31 0294 0b40 jnz 0x0b40 - 0b33 263b lrs $AC0.M, @0x003b - 0b34 5c00 sub $ACC0, $ACC1 - 0b35 0290 0b40 jge 0x0b40 - 0b37 223b lrs $AX0.H, @0x003b - 0b38 02bf 06ef call 0x06ef - 0b3a 5500 subr $ACC1, $AX0.H - 0b3b 0a01 lris $AX0.H, #0x01 - 0b3c 00fa 0405 sr @0x0405, $AX0.H - 0b3e 029f 0b13 jmp 0x0b13 - 0b40 1f5f mrr $AX0.H, $AC1.M - 0b41 02bf 06ef call 0x06ef - 0b43 00fa 0362 sr @0x0362, $AX0.H - 0b45 8100 clr $ACC0 - 0b46 263a lrs $AC0.M, @0x003a - 0b47 243b lrs $AC0.L, @0x003b - 0b48 1570 lsr $ACC1, #-16 - 0b49 0a01 lris $AX0.H, #0x01 - 0b4a 0081 0405 lri $AR1, #0x0405 - 0b4c 5c00 sub $ACC0, $ACC1 - 0b4d b100 tst $ACC0 - 0b4e 0275 ifz - 0b4f 1a3a srr @$AR1, $AX0.H - 0b50 2e3a srs @0x003a, $AC0.M - 0b51 2c3b srs @0x003b, $AC0.L - 0b52 2638 lrs $AC0.M, @0x0038 - 0b53 2439 lrs $AC0.L, @0x0039 - 0b54 00d8 0362 lr $AX0.L, @0x0362 - 0b56 7000 addaxl $ACC0, $AX0.L - 0b57 2c39 srs @0x0039, $AC0.L - 0b58 2e38 srs @0x0038, $AC0.M - 0b59 0092 00ff lri $CR, #0x00ff - 0b5b 029f 037e jmp 0x037e - 0b5d 8100 clr $ACC0 - 0b5e 2e34 srs @0x0034, $AC0.M - 0b5f 2e35 srs @0x0035, $AC0.M - 0b60 2334 lrs $AX1.H, @0x0034 - 0b61 2135 lrs $AX1.L, @0x0035 - 0b62 268a lrs $AC0.M, @0xff8a - 0b63 248b lrs $AC0.L, @0xff8b - 0b64 5a00 subax $ACC0, $AX1.L - 0b65 2e3a srs @0x003a, $AC0.M - 0b66 2c3b srs @0x003b, $AC0.L - 0b67 2634 lrs $AC0.M, @0x0034 - 0b68 2435 lrs $AC0.L, @0x0035 - 0b69 238c lrs $AX1.H, @0xff8c - 0b6a 218d lrs $AX1.L, @0xff8d - 0b6b 4a00 addax $ACC0, $AX1.L - 0b6c 2e38 srs @0x0038, $AC0.M - 0b6d 2c39 srs @0x0039, $AC0.L - 0b6e 8100 clr $ACC0 - 0b6f 2e05 srs @0x0005, $AC0.M - 0b70 02df ret - 0b71 0092 0004 lri $CR, #0x0004 - 0b73 2002 lrs $AX0.L, @0x0002 - 0b74 8100 clr $ACC0 - 0b75 8900 clr $ACC1 - 0b76 2430 lrs $AC0.L, @0x0030 - 0b77 8d00 set15 - 0b78 0950 lris $AX1.L, #0x50 - 0b79 a000 mulx $AX0.L, $AX1.L - 0b7a a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0b7b 1404 lsl $ACC0, #4 - 0b7c 8c00 clr15 - 0b7d 1ffe mrr $AC1.M, $AC0.M - 0b7e 0083 0580 lri $AR3, #0x0580 - 0b80 02df ret - 0b81 02bf 0b71 call 0x0b71 - 0b83 2201 lrs $AX0.H, @0x0001 - 0b84 8600 tstaxh $AX0.H - 0b85 0294 0b96 jnz 0x0b96 - 0b87 2204 lrs $AX0.H, @0x0004 - 0b88 8600 tstaxh $AX0.H - 0b89 02b4 0be0 callnz 0x0be0 - 0b8b 8100 clr $ACC0 - 0b8c 2605 lrs $AC0.M, @0x0005 - 0b8d b100 tst $ACC0 - 0b8e 0295 0ba3 jz 0x0ba3 - 0b90 8100 clr $ACC0 - 0b91 2e05 srs @0x0005, $AC0.M - 0b92 2281 lrs $AX0.H, @0xff81 - 0b93 8600 tstaxh $AX0.H - 0b94 0294 0b9d jnz 0x0b9d - 0b96 8100 clr $ACC0 - 0b97 005f loop $AC1.M - 0b98 1b7e srri @$AR3, $AC0.M - 0b99 7400 incm $AC0.M - 0b9a 2e01 srs @0x0001, $AC0.M - 0b9b 029f 0bd9 jmp 0x0bd9 - 0b9d 2688 lrs $AC0.M, @0xff88 - 0b9e 2489 lrs $AC0.L, @0xff89 - 0b9f 2e34 srs @0x0034, $AC0.M - 0ba0 2c35 srs @0x0035, $AC0.L - 0ba1 02bf 0be0 call 0x0be0 - 0ba3 00ff 0360 sr @0x0360, $AC1.M - 0ba5 2638 lrs $AC0.M, @0x0038 - 0ba6 2439 lrs $AC0.L, @0x0039 - 0ba7 02bf 06d2 call 0x06d2 - 0ba9 02bf 06e9 call 0x06e9 - 0bab 00df 0360 lr $AC1.M, @0x0360 - 0bad 8100 clr $ACC0 - 0bae 263a lrs $AC0.M, @0x003a - 0baf b100 tst $ACC0 - 0bb0 0294 0bbf jnz 0x0bbf - 0bb2 263b lrs $AC0.M, @0x003b - 0bb3 5c00 sub $ACC0, $ACC1 - 0bb4 0290 0bbf jge 0x0bbf - 0bb6 223b lrs $AX0.H, @0x003b - 0bb7 02bf 06b4 call 0x06b4 - 0bb9 5500 subr $ACC1, $AX0.H - 0bba 0a01 lris $AX0.H, #0x01 - 0bbb 00fa 0405 sr @0x0405, $AX0.H - 0bbd 029f 0b90 jmp 0x0b90 - 0bbf 1f5f mrr $AX0.H, $AC1.M - 0bc0 02bf 06b4 call 0x06b4 - 0bc2 00fa 0362 sr @0x0362, $AX0.H - 0bc4 8100 clr $ACC0 - 0bc5 263a lrs $AC0.M, @0x003a - 0bc6 243b lrs $AC0.L, @0x003b - 0bc7 1570 lsr $ACC1, #-16 - 0bc8 0a01 lris $AX0.H, #0x01 - 0bc9 0081 0405 lri $AR1, #0x0405 - 0bcb 5c00 sub $ACC0, $ACC1 - 0bcc b100 tst $ACC0 - 0bcd 0275 ifz - 0bce 1a3a srr @$AR1, $AX0.H - 0bcf 2e3a srs @0x003a, $AC0.M - 0bd0 2c3b srs @0x003b, $AC0.L - 0bd1 2638 lrs $AC0.M, @0x0038 - 0bd2 2439 lrs $AC0.L, @0x0039 - 0bd3 00d8 0362 lr $AX0.L, @0x0362 - 0bd5 7000 addaxl $ACC0, $AX0.L - 0bd6 7000 addaxl $ACC0, $AX0.L - 0bd7 2c39 srs @0x0039, $AC0.L - 0bd8 2e38 srs @0x0038, $AC0.M - 0bd9 0092 00ff lri $CR, #0x00ff - 0bdb 029f 037e jmp 0x037e - 0bdd 8100 clr $ACC0 - 0bde 2e34 srs @0x0034, $AC0.M - 0bdf 2e35 srs @0x0035, $AC0.M - 0be0 2334 lrs $AX1.H, @0x0034 - 0be1 2135 lrs $AX1.L, @0x0035 - 0be2 268a lrs $AC0.M, @0xff8a - 0be3 248b lrs $AC0.L, @0xff8b - 0be4 5a00 subax $ACC0, $AX1.L - 0be5 2e3a srs @0x003a, $AC0.M - 0be6 2c3b srs @0x003b, $AC0.L - 0be7 2634 lrs $AC0.M, @0x0034 - 0be8 2435 lrs $AC0.L, @0x0035 - 0be9 1401 lsl $ACC0, #1 - 0bea 238c lrs $AX1.H, @0xff8c - 0beb 218d lrs $AX1.L, @0xff8d - 0bec 4a00 addax $ACC0, $AX1.L - 0bed 2e38 srs @0x0038, $AC0.M - 0bee 2c39 srs @0x0039, $AC0.L - 0bef 8100 clr $ACC0 - 0bf0 2e05 srs @0x0005, $AC0.M - 0bf1 02df ret - 0bf2 8900 clr $ACC1 - 0bf3 0f50 lris $AC1.M, #0x50 - 0bf4 0083 0520 lri $AR3, #0x0520 - 0bf6 02bf 0c0b call 0x0c0b - 0bf8 029f 0386 jmp 0x0386 - 0bfa 00d8 0402 lr $AX0.L, @0x0402 - 0bfc 8100 clr $ACC0 - 0bfd 8900 clr $ACC1 - 0bfe 00dc 0430 lr $AC0.L, @0x0430 - 0c00 0a50 lris $AX0.H, #0x50 - 0c01 9000 mul $AX0.L, $AX0.H - 0c02 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0c03 1404 lsl $ACC0, #4 - 0c04 1ffe mrr $AC1.M, $AC0.M - 0c05 0083 0580 lri $AR3, #0x0580 - 0c07 02bf 0c0b call 0x0c0b - 0c09 029f 037e jmp 0x037e - 0c0b 0092 0004 lri $CR, #0x0004 - 0c0d 8100 clr $ACC0 - 0c0e 263a lrs $AC0.M, @0x003a - 0c0f 243b lrs $AC0.L, @0x003b - 0c10 1f1f mrr $AX0.L, $AC1.M - 0c11 0a00 lris $AX0.H, #0x00 - 0c12 5800 subax $ACC0, $AX0.L - 0c13 0292 0c29 jg 0x0c29 - 0c15 8900 clr $ACC1 - 0c16 00c0 043b lr $AR0, @0x043b - 0c18 02bf 0c4e call 0x0c4e - 0c1a 8100 clr $ACC0 - 0c1b 1fd8 mrr $AC0.M, $AX0.L - 0c1c 223b lrs $AX0.H, @0x003b - 0c1d 5400 subr $ACC0, $AX0.H - 0c1e 0007 dar $AR3 - 0c1f 1979 lrri $AX1.L, @$AR3 - 0c20 005e loop $AC0.M - 0c21 1b79 srri @$AR3, $AX1.L - 0c22 0f01 lris $AC1.M, #0x01 - 0c23 2f01 srs @0x0001, $AC1.M - 0c24 8900 clr $ACC1 - 0c25 2f3b srs @0x003b, $AC1.M - 0c26 0092 00ff lri $CR, #0x00ff - 0c28 02df ret - 0c29 2e3a srs @0x003a, $AC0.M - 0c2a 2c3b srs @0x003b, $AC0.L - 0c2b 8100 clr $ACC0 - 0c2c 8900 clr $ACC1 - 0c2d 268a lrs $AC0.M, @0xff8a - 0c2e 2734 lrs $AC1.M, @0x0034 - 0c2f 5c00 sub $ACC0, $ACC1 - 0c30 2e36 srs @0x0036, $AC0.M - 0c31 5000 subr $ACC0, $AX0.L - 0c32 0290 0c48 jge 0x0c48 - 0c34 00c0 0436 lr $AR0, @0x0436 - 0c36 02bf 0c4e call 0x0c4e - 0c38 8100 clr $ACC0 - 0c39 1fd8 mrr $AC0.M, $AX0.L - 0c3a 2236 lrs $AX0.H, @0x0036 - 0c3b 5400 subr $ACC0, $AX0.H - 0c3c 1c1e mrr $AR0, $AC0.M - 0c3d 8100 clr $ACC0 - 0c3e 2e34 srs @0x0034, $AC0.M - 0c3f 2688 lrs $AC0.M, @0xff88 - 0c40 2489 lrs $AC0.L, @0xff89 - 0c41 2e8c srs @0xff8c, $AC0.M - 0c42 2c8d srs @0xff8d, $AC0.L - 0c43 02bf 0c4e call 0x0c4e - 0c45 0092 00ff lri $CR, #0x00ff - 0c47 02df ret - 0c48 1c18 mrr $AR0, $AX0.L - 0c49 02bf 0c4e call 0x0c4e - 0c4b 0092 00ff lri $CR, #0x00ff - 0c4d 02df ret - 0c4e 8100 clr $ACC0 - 0c4f 1fc0 mrr $AC0.M, $AR0 - 0c50 b100 tst $ACC0 - 0c51 02d5 retz - 0c52 8900 clr $ACC1 - 0c53 2734 lrs $AC1.M, @0x0034 - 0c54 0340 0001 andi $AC1.M, #0x0001 - 0c56 0b00 lris $AX1.H, #0x00 - 0c57 1f3f mrr $AX1.L, $AC1.M - 0c58 268c lrs $AC0.M, @0xff8c - 0c59 248d lrs $AC0.L, @0xff8d - 0c5a 8900 clr $ACC1 - 0c5b 2534 lrs $AC1.L, @0x0034 - 0c5c 1501 lsl $ACC1, #1 - 0c5d 4c00 add $ACC0, $ACC1 - 0c5e 5a00 subax $ACC0, $AX1.L - 0c5f 5a00 subax $ACC0, $AX1.L - 0c60 1c20 mrr $AR1, $AR0 - 0c61 1fe0 mrr $AC1.M, $AR0 - 0c62 0502 addis $ACC1, #0x02 - 0c63 1c1f mrr $AR0, $AC1.M - 0c64 009f 0b00 lri $AC1.M, #0x0b00 - 0c66 0092 00ff lri $CR, #0x00ff - 0c68 02bf 0649 call 0x0649 - 0c6a 0092 0004 lri $CR, #0x0004 - 0c6c 2734 lrs $AC1.M, @0x0034 - 0c6d 1f61 mrr $AX1.H, $AR1 - 0c6e 4700 addr $ACC1, $AX1.H - 0c6f 2f34 srs @0x0034, $AC1.M - 0c70 0080 0b00 lri $AR0, #0x0b00 - 0c72 8900 clr $ACC1 - 0c73 1ff9 mrr $AC1.M, $AX1.L - 0c74 b900 tst $ACC1 - 0c75 0274 ifnz - 0c76 0008 iar $AR0 - 0c77 8900 clr $ACC1 - 0c78 1fe1 mrr $AC1.M, $AR1 - 0c79 191e lrri $AC0.M, @$AR0 - 0c7a 0701 cmpis $ACC1, #0x01 - 0c7b 0293 0c84 jle 0x0c84 - 0c7d 191a lrri $AX0.H, @$AR0 - 0c7e 05fe addis $ACC1, #0xfe - 0c7f 005f loop $AC1.M - 0c80 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c81 1b7e srri @$AR3, $AC0.M - 0c82 1b7a srri @$AR3, $AX0.H - 0c83 02df ret - 0c84 1b7e srri @$AR3, $AC0.M - 0c85 02df ret - 0c86 0083 03e8 lri $AR3, #0x03e8 - 0c88 191e lrri $AC0.M, @$AR0 - 0c89 191a lrri $AX0.H, @$AR0 - 0c8a 1006 loopi #0x06 - 0c8b 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c8c 1b7e srri @$AR3, $AC0.M - 0c8d 1b7a srri @$AR3, $AX0.H - 0c8e 0080 03e8 lri $AR0, #0x03e8 - 0c90 8a00 m2 - 0c91 0088 0007 lri $WR0, #0x0007 - 0c93 1150 0ca0 bloopi #0x50, 0x0ca0 - 0c95 1c61 mrr $AR3, $AR1 - 0c96 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c97 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c98 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c99 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c9a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c9b f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c9c f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c9d f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c9e f200 madd $AX0.L, $AX0.H - 0c9f fe00 movpz $ACC0 - 0ca0 1b3e srri @$AR1, $AC0.M - 0ca1 0088 ffff lri $WR0, #0xffff - 0ca3 8b00 m0 - 0ca4 02df ret - 0ca5 8a00 m2 - 0ca6 05fe addis $ACC1, #0xfe - 0ca7 0083 03e8 lri $AR3, #0x03e8 - 0ca9 191e lrri $AC0.M, @$AR0 - 0caa 191a lrri $AX0.H, @$AR0 - 0cab 005f loop $AC1.M - 0cac 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cad 1b7e srri @$AR3, $AC0.M - 0cae 1b7a srri @$AR3, $AX0.H - 0caf 0080 03e8 lri $AR0, #0x03e8 - 0cb1 0501 addis $ACC1, #0x01 - 0cb2 1d1f mrr $WR0, $AC1.M - 0cb3 1150 0cbb bloopi #0x50, 0x0cbb - 0cb5 1c61 mrr $AR3, $AR1 - 0cb6 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0cb7 005f loop $AC1.M - 0cb8 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0cb9 f200 madd $AX0.L, $AX0.H - 0cba fe00 movpz $ACC0 - 0cbb 1b3e srri @$AR1, $AC0.M - 0cbc 0088 ffff lri $WR0, #0xffff - 0cbe 8b00 m0 - 0cbf 02df ret - 0cc0 0083 03e8 lri $AR3, #0x03e8 - 0cc2 191e lrri $AC0.M, @$AR0 - 0cc3 191a lrri $AX0.H, @$AR0 - 0cc4 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cc5 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cc6 1b7e srri @$AR3, $AC0.M - 0cc7 1b7a srri @$AR3, $AX0.H - 0cc8 0080 03e8 lri $AR0, #0x03e8 - 0cca 0088 0003 lri $WR0, #0x0003 - 0ccc 0085 0000 lri $IX1, #0x0000 - 0cce 0087 0000 lri $IX3, #0x0000 - 0cd0 1fc2 mrr $AC0.M, $AR2 - 0cd1 195b lrri $AX1.H, @$AR2 - 0cd2 1959 lrri $AX1.L, @$AR2 - 0cd3 195f lrri $AC1.M, @$AR2 - 0cd4 195a lrri $AX0.H, @$AR2 - 0cd5 1c5e mrr $AR2, $AC0.M - 0cd6 1fda mrr $AC0.M, $AX0.H - 0cd7 1c61 mrr $AR3, $AR1 - 0cd8 8a00 m2 - 0cd9 8f00 set40 - 0cda 191a lrri $AX0.H, @$AR0 - 0cdb b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0cdc e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cdd ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0cde e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0cdf b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0ce0 1127 0ceb bloopi #0x27, 0x0ceb - 0ce2 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ce3 197e lrri $AC0.M, @$AR3 - 0ce4 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ce5 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0ce6 bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0ce7 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0ce8 197f lrri $AC1.M, @$AR3 - 0ce9 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0cea e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0ceb b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0cec e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ced 197e lrri $AC0.M, @$AR3 - 0cee e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0cef eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cf0 bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 0cf1 1bff srrn @$AR3, $AC1.M - 0cf2 197f lrri $AC1.M, @$AR3 - 0cf3 8e00 set16 - 0cf4 8b00 m0 - 0cf5 0088 ffff lri $WR0, #0xffff - 0cf7 1b5b srri @$AR2, $AX1.H - 0cf8 1b59 srri @$AR2, $AX1.L - 0cf9 1b5f srri @$AR2, $AC1.M - 0cfa 1b5e srri @$AR2, $AC0.M - 0cfb 02df ret - 0cfc 0083 03e8 lri $AR3, #0x03e8 - 0cfe 191e lrri $AC0.M, @$AR0 - 0cff 191a lrri $AX0.H, @$AR0 - 0d00 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0d01 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0d02 1b7e srri @$AR3, $AC0.M - 0d03 1b7a srri @$AR3, $AX0.H - 0d04 0080 03e8 lri $AR0, #0x03e8 - 0d06 0088 0003 lri $WR0, #0x0003 - 0d08 0085 0000 lri $IX1, #0x0000 - 0d0a 0087 0000 lri $IX3, #0x0000 - 0d0c 1fc2 mrr $AC0.M, $AR2 - 0d0d 195b lrri $AX1.H, @$AR2 - 0d0e 1959 lrri $AX1.L, @$AR2 - 0d0f 195f lrri $AC1.M, @$AR2 - 0d10 195a lrri $AX0.H, @$AR2 - 0d11 1c5e mrr $AR2, $AC0.M - 0d12 1fda mrr $AC0.M, $AX0.H - 0d13 1c61 mrr $AR3, $AR1 - 0d14 8a00 m2 - 0d15 8f00 set40 - 0d16 191a lrri $AX0.H, @$AR0 - 0d17 b800 mulx $AX0.H, $AX1.H - 0d18 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0d19 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d1a ea00 maddc $AC1.M, $AX1.L - 0d1b ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0d1c e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0d1d ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0d1e b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0d1f 1127 0d30 bloopi #0x27, 0x0d30 - 0d21 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d22 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0d23 197e lrri $AC0.M, @$AR3 - 0d24 e800 maddc $AC0.M, $AX1.L - 0d25 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0d26 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0d27 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0d28 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0d29 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0d2a e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0d2b 197f lrri $AC1.M, @$AR3 - 0d2c ea00 maddc $AC1.M, $AX1.L - 0d2d ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0d2e e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0d2f ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0d30 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0d31 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d32 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0d33 197e lrri $AC0.M, @$AR3 - 0d34 e800 maddc $AC0.M, $AX1.L - 0d35 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0d36 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0d37 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0d38 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0d39 1bff srrn @$AR3, $AC1.M - 0d3a 197f lrri $AC1.M, @$AR3 - 0d3b 8e00 set16 - 0d3c 8b00 m0 - 0d3d 0088 ffff lri $WR0, #0xffff - 0d3f 1b5b srri @$AR2, $AX1.H - 0d40 1b59 srri @$AR2, $AX1.L - 0d41 1b5f srri @$AR2, $AC1.M - 0d42 1b5e srri @$AR2, $AC0.M - 0d43 02df ret - 0d44 0eff lris $AC0.M, #0xff - 0d45 00fe 03f2 sr @0x03f2, $AC0.M - 0d47 8100 clr $ACC0 - 0d48 00fe 03f0 sr @0x03f0, $AC0.M - 0d4a 00fe 03f6 sr @0x03f6, $AC0.M - 0d4c 009e 0100 lri $AC0.M, #0x0100 - 0d4e 00fe 03f7 sr @0x03f7, $AC0.M - 0d50 00da 03f7 lr $AX0.H, @0x03f7 - 0d52 009e 8000 lri $AC0.M, #0x8000 - 0d54 5400 subr $ACC0, $AX0.H - 0d55 00fe 03f5 sr @0x03f5, $AC0.M - 0d57 0e30 lris $AC0.M, #0x30 - 0d58 00fe 03f3 sr @0x03f3, $AC0.M - 0d5a 0e10 lris $AC0.M, #0x10 - 0d5b 00fe 03f4 sr @0x03f4, $AC0.M - 0d5d 009e 0096 lri $AC0.M, #0x0096 - 0d5f 00fe 03f1 sr @0x03f1, $AC0.M - 0d61 02df ret - 0d62 0080 0a00 lri $AR0, #0x0a00 - 0d64 8100 clr $ACC0 - 0d65 00de 03f0 lr $AC0.M, @0x03f0 - 0d67 8900 clr $ACC1 - 0d68 b100 tst $ACC0 - 0d69 0275 ifz - 0d6a 0550 addis $ACC1, #0x50 - 0d6b 00ff 03f0 sr @0x03f0, $AC1.M - 0d6d 0200 0a60 addi $AC0.M, #0x0a60 - 0d6f 1c7e mrr $AR3, $AC0.M - 0d70 0f4e lris $AC1.M, #0x4e - 0d71 02bf 012b call 0x012b - 0d73 02df ret - 0d74 00de 03f1 lr $AC0.M, @0x03f1 - 0d76 0200 0a60 addi $AC0.M, #0x0a60 - 0d78 1c7e mrr $AR3, $AC0.M - 0d79 8100 clr $ACC0 - 0d7a 8900 clr $ACC1 - 0d7b 009f 00a0 lri $AC1.M, #0x00a0 - 0d7d 00de 03f1 lr $AC0.M, @0x03f1 - 0d7f 5d00 sub $ACC1, $ACC0 - 0d80 0e50 lris $AC0.M, #0x50 - 0d81 0750 cmpis $ACC1, #0x50 - 0d82 0270 ifge - 0d83 5d00 sub $ACC1, $ACC0 - 0d84 00da 03f2 lr $AX0.H, @0x03f2 - 0d86 8600 tstaxh $AX0.H - 0d87 0290 0da5 jge 0x0da5 - 0d89 00de 03f3 lr $AC0.M, @0x03f3 - 0d8b 5c00 sub $ACC0, $ACC1 - 0d8c 0293 0d90 jle 0x0d90 - 0d8e 029f 0daa jmp 0x0daa - 0d90 00db 03f7 lr $AX1.H, @0x03f7 - 0d92 009e 8000 lri $AC0.M, #0x8000 - 0d94 4600 addr $ACC0, $AX1.H - 0d95 029f 0d9c jmp 0x0d9c - 0d97 00db 03f7 lr $AX1.H, @0x03f7 - 0d99 009e 8000 lri $AC0.M, #0x8000 - 0d9b 5600 subr $ACC0, $AX1.H - 0d9c 00fe 03f5 sr @0x03f5, $AC0.M - 0d9e 1fda mrr $AC0.M, $AX0.H - 0d9f 7c00 neg $ACC0 - 0da0 1f5e mrr $AX0.H, $AC0.M - 0da1 00fe 03f2 sr @0x03f2, $AC0.M - 0da3 029f 0daa jmp 0x0daa - 0da5 00de 03f4 lr $AC0.M, @0x03f4 - 0da7 5d00 sub $ACC1, $ACC0 - 0da8 0293 0d97 jle 0x0d97 - 0daa 8900 clr $ACC1 - 0dab 00dd 03f5 lr $AC1.L, @0x03f5 - 0dad 1501 lsl $ACC1, #1 - 0dae 8100 clr $ACC0 - 0daf 00dc 03f6 lr $AC0.L, @0x03f6 - 0db1 008b 009f lri $WR3, #0x009f - 0db3 0080 0a00 lri $AR0, #0x0a00 - 0db5 0900 lris $AX1.L, #0x00 - 0db6 1150 0dbd bloopi #0x50, 0x0dbd - 0db8 1878 lrr $AX0.L, @$AR3 - 0db9 4c00 add $ACC0, $ACC1 - 0dba 1cfe mrr $IX3, $AC0.M - 0dbb 001f addarn $AR3, $IX3 - 0dbc 1fd9 mrr $AC0.M, $AX1.L - 0dbd 1b18 srri @$AR0, $AX0.L - 0dbe 009f 0a60 lri $AC1.M, #0x0a60 - 0dc0 1fc3 mrr $AC0.M, $AR3 - 0dc1 5c00 sub $ACC0, $ACC1 - 0dc2 00fe 03f1 sr @0x03f1, $AC0.M - 0dc4 00fc 03f6 sr @0x03f6, $AC0.L - 0dc6 008b ffff lri $WR3, #0xffff - 0dc8 02df ret - 0dc9 0f50 lris $AC1.M, #0x50 - 0dca 0080 0a00 lri $AR0, #0x0a00 - 0dcc 0083 0d60 lri $AR3, #0x0d60 - 0dce 0098 3fff lri $AX0.L, #0x3fff - 0dd0 02bf 0145 call 0x0145 - 0dd2 0f50 lris $AC1.M, #0x50 - 0dd3 0080 0a00 lri $AR0, #0x0a00 - 0dd5 0083 0d00 lri $AR3, #0x0d00 - 0dd7 0098 3fff lri $AX0.L, #0x3fff - 0dd9 02bf 0145 call 0x0145 - 0ddb 02df ret - 0ddc 8a00 m2 - 0ddd 8f00 set40 - 0dde 8100 clr $ACC0 - 0ddf 00de 0404 lr $AC0.M, @0x0404 - 0de1 b100 tst $ACC0 - 0de2 0295 0de9 jz 0x0de9 - 0de4 8100 clr $ACC0 - 0de5 00fe 0478 sr @0x0478, $AC0.M - 0de7 00fe 0479 sr @0x0479, $AC0.M - 0de9 00df 0479 lr $AC1.M, @0x0479 - 0deb 00db 0478 lr $AX1.H, @0x0478 - 0ded 0900 lris $AX1.L, #0x00 - 0dee 0084 0000 lri $IX0, #0x0000 - 0df0 1150 0df9 bloopi #0x50, 0x0df9 - 0df2 199e lrrn $AC0.M, @$AR0 - 0df3 5c7c sub'ln $ACC0, $ACC1 : $AC1.M, @$AR0 - 0df4 c000 mulc $AC0.M, $AX0.H - 0df5 6e00 movp $ACC0 - 0df6 1488 asl $ACC0, #8 - 0df7 4a00 addax $ACC0, $AX1.L - 0df8 1b1e srri @$AR0, $AC0.M - 0df9 1f7e mrr $AX1.H, $AC0.M - 0dfa 00fb 0478 sr @0x0478, $AX1.H - 0dfc 00ff 0479 sr @0x0479, $AC1.M - 0dfe 8b00 m0 - 0dff 8e00 set16 - 0e00 02df ret - 0e01 b900 tst $ACC1 - 0e02 0294 0e07 jnz 0x0e07 - 0e04 6800 movax $ACC0, $AX0.L - 0e05 b100 tst $ACC0 - 0e06 02d5 retz - 0e07 1c23 mrr $AR1, $AR3 - 0e08 197e lrri $AC0.M, @$AR3 - 0e09 191b lrri $AX1.H, @$AR0 - 0e0a d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - 0e0b 1120 0e11 bloopi #0x20, 0x0e11 - 0e0d dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0e0e 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0e0f dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0e10 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0e11 4900 addax $ACC1, $AX0.L - 0e12 1108 0e17 bloopi #0x08, 0x0e17 - 0e14 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0e15 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0e16 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0e17 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0e18 02df ret - 0e19 8f00 set40 - 0e1a 8d00 set15 - 0e1b 1c03 mrr $AR0, $AR3 - 0e1c 00d9 038e lr $AX1.L, @0x038e - 0e1e 0b04 lris $AX1.H, #0x04 - 0e1f 197a lrri $AX0.H, @$AR3 - 0e20 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3 - 0e21 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0e22 1128 0e27 bloopi #0x28, 0x0e27 - 0e24 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0e25 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0e26 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0e27 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0e28 8c00 clr15 - 0e29 8e00 set16 - 0e2a 02df ret - 0e2b 00da 0485 lr $AX0.H, @0x0485 - 0e2d 8600 tstaxh $AX0.H - 0e2e 0295 0e3c jz 0x0e3c - 0e30 8100 clr $ACC0 - 0e31 00de 042a lr $AC0.M, @0x042a - 0e33 147f lsr $ACC0, #-1 - 0e34 00fe 042b sr @0x042b, $AC0.M - 0e36 b100 tst $ACC0 - 0e37 0294 0e3c jnz 0x0e3c - 0e39 0a01 lris $AX0.H, #0x01 - 0e3a 00fa 0401 sr @0x0401, $AX0.H - 0e3c 8f00 set40 - 0e3d 8100 clr $ACC0 - 0e3e 00de 0428 lr $AC0.M, @0x0428 - 0e40 1478 lsr $ACC0, #-8 - 0e41 00df 0428 lr $AC1.M, @0x0428 - 0e43 0340 007f andi $AC1.M, #0x007f - 0e45 1f1e mrr $AX0.L, $AC0.M - 0e46 1f5f mrr $AX0.H, $AC1.M - 0e47 0220 007f xori $ACC0, #0x007f - 0e49 1f3e mrr $AX1.L, $AC0.M - 0e4a 0320 007f xori $ACC1, #0x007f - 0e4c 1f7f mrr $AX1.H, $AC1.M - 0e4d 8100 clr $ACC0 - 0e4e 8900 clr $ACC1 - 0e4f 009f 0200 lri $AC1.M, #0x0200 - 0e51 1fd8 mrr $AC0.M, $AX0.L - 0e52 4c00 add $ACC0, $ACC1 - 0e53 1c1e mrr $AR0, $AC0.M - 0e54 1818 lrr $AX0.L, @$AR0 - 0e55 1fda mrr $AC0.M, $AX0.H - 0e56 4c00 add $ACC0, $ACC1 - 0e57 1c1e mrr $AR0, $AC0.M - 0e58 181a lrr $AX0.H, @$AR0 - 0e59 1fd9 mrr $AC0.M, $AX1.L - 0e5a 4c00 add $ACC0, $ACC1 - 0e5b 1c1e mrr $AR0, $AC0.M - 0e5c 1819 lrr $AX1.L, @$AR0 - 0e5d 1fdb mrr $AC0.M, $AX1.H - 0e5e 4c00 add $ACC0, $ACC1 - 0e5f 1c1e mrr $AR0, $AC0.M - 0e60 181b lrr $AX1.H, @$AR0 - 0e61 8a00 m2 - 0e62 0080 0b00 lri $AR0, #0x0b00 - 0e64 9800 mul $AX1.L, $AX1.H - 0e65 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0e66 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0e67 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M - 0e68 6e30 movp's $ACC0 : @$AR0, $AC0.M - 0e69 1b1e srri @$AR0, $AC0.M - 0e6a 8b00 m0 - 0e6b 0080 0b00 lri $AR0, #0x0b00 - 0e6d 0081 0b04 lri $AR1, #0x0b04 - 0e6f 00da 042a lr $AX0.H, @0x042a - 0e71 02bf 0ebc call 0x0ebc - 0e73 0081 0b08 lri $AR1, #0x0b08 - 0e75 0080 0b00 lri $AR0, #0x0b00 - 0e77 00da 042a lr $AX0.H, @0x042a - 0e79 00de 0429 lr $AC0.M, @0x0429 - 0e7b 8a00 m2 - 0e7c c000 mulc $AC0.M, $AX0.H - 0e7d 8b00 m0 - 0e7e 6e00 movp $ACC0 - 0e7f 1f5e mrr $AX0.H, $AC0.M - 0e80 02bf 0ebc call 0x0ebc - 0e82 0080 0b00 lri $AR0, #0x0b00 - 0e84 0081 0b0c lri $AR1, #0x0b0c - 0e86 8100 clr $ACC0 - 0e87 8900 clr $ACC1 - 0e88 00de 042b lr $AC0.M, @0x042b - 0e8a 00df 042a lr $AC1.M, @0x042a - 0e8c 00fe 042a sr @0x042a, $AC0.M - 0e8e 5c00 sub $ACC0, $ACC1 - 0e8f 1f5e mrr $AX0.H, $AC0.M - 0e90 02bf 0ec7 call 0x0ec7 - 0e92 0080 0b0c lri $AR0, #0x0b0c - 0e94 0081 0b10 lri $AR1, #0x0b10 - 0e96 00da 0429 lr $AX0.H, @0x0429 - 0e98 02bf 0ebc call 0x0ebc - 0e9a 0081 0b04 lri $AR1, #0x0b04 - 0e9c 0082 0b0c lri $AR2, #0x0b0c - 0e9e 0083 0ed5 lri $AR3, #0x0ed5 - 0ea0 1108 0eb9 bloopi #0x08, 0x0eb9 - 0ea2 195f lrri $AC1.M, @$AR2 - 0ea3 15fb asr $ACC1, #-5 - 0ea4 1f1d mrr $AX0.L, $AC1.L - 0ea5 1f5f mrr $AX0.H, $AC1.M - 0ea6 193f lrri $AC1.M, @$AR1 - 0ea7 00e1 0b24 sr @0x0b24, $AR1 - 0ea9 00e2 0b25 sr @0x0b25, $AR2 - 0eab 021b ilrri $AC0.M, @$AR3 - 0eac 00e3 0b26 sr @0x0b26, $AR3 - 0eae 1c7e mrr $AR3, $AC0.M - 0eaf 00c0 038f lr $AR0, @0x038f - 0eb1 02bf 0e01 call 0x0e01 - 0eb3 00c1 0b24 lr $AR1, @0x0b24 - 0eb5 00c2 0b25 lr $AR2, @0x0b25 - 0eb7 00c3 0b26 lr $AR3, @0x0b26 - 0eb9 0000 nop - 0eba 8e00 set16 - 0ebb 02df ret - 0ebc 8a00 m2 - 0ebd 191f lrri $AC1.M, @$AR0 - 0ebe d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0 - 0ebf d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0 - 0ec0 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0ec1 191f lrri $AC1.M, @$AR0 - 0ec2 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0ec3 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0ec4 1b3e srri @$AR1, $AC0.M - 0ec5 8b00 m0 - 0ec6 02df ret - 0ec7 8a00 m2 - 0ec8 8d00 set15 - 0ec9 1f7e mrr $AX1.H, $AC0.M - 0eca 1918 lrri $AX0.L, @$AR0 - 0ecb a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0 - 0ecc ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0 - 0ecd ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ece 1918 lrri $AX0.L, @$AR0 - 0ecf ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ed0 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0ed1 1b3e srri @$AR1, $AC0.M - 0ed2 8c00 clr15 - 0ed3 8b00 m0 - 0ed4 02df ret - 0ed5 0d00 lris $AC1.L, #0x00 - 0ed6 0d60 lris $AC1.L, #0x60 - 0ed7 0f40 lris $AC1.M, #0x40 - 0ed8 0ca0 lris $AC0.L, #0xa0 - 0ed9 0e80 lris $AC0.M, #0x80 - 0eda 0ee0 lris $AC0.M, #0xe0 - 0edb 0be0 lris $AX1.H, #0xe0 - 0edc 0c40 lris $AC0.L, #0x40 - 0edd 00f9 0361 sr @0x0361, $AX1.L - 0edf 1fc0 mrr $AC0.M, $AR0 - 0ee0 0200 fffc addi $AC0.M, #0xfffc - 0ee2 1c1e mrr $AR0, $AC0.M - 0ee3 1c5e mrr $AR2, $AC0.M - 0ee4 0083 043c lri $AR3, #0x043c - 0ee6 197e lrri $AC0.M, @$AR3 - 0ee7 197f lrri $AC1.M, @$AR3 - 0ee8 80a2 nx'sl : $AC0.M, $AX0.H - 0ee9 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - 0eea 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - 0eeb 1b1f srri @$AR0, $AC1.M - 0eec 1c02 mrr $AR0, $AR2 - 0eed 8100 clr $ACC0 - 0eee 00de 0402 lr $AC0.M, @0x0402 - 0ef0 00fe 0362 sr @0x0362, $AC0.M - 0ef2 1474 lsr $ACC0, #-12 - 0ef3 1f7e mrr $AX1.H, $AC0.M - 0ef4 1f3c mrr $AX1.L, $AC0.L - 0ef5 8900 clr $ACC1 - 0ef6 00dd 0430 lr $AC1.L, @0x0430 - 0ef8 1504 lsl $ACC1, #4 - 0ef9 0604 cmpis $ACC0, #0x04 - 0efa 0290 0f51 jge 0x0f51 - 0efc 1fdd mrr $AC0.M, $AC1.L - 0efd 0082 02b0 lri $AR2, #0x02b0 - 0eff 1050 loopi #0x50 - 0f00 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L - 0f01 1fbe mrr $AC1.L, $AC0.M - 0f02 00fe 0360 sr @0x0360, $AC0.M - 0f04 8900 clr $ACC1 - 0f05 1fbe mrr $AC1.L, $AC0.M - 0f06 0af8 lris $AX0.H, #0xf8 - 0f07 009b 00fc lri $AX1.H, #0x00fc - 0f09 00d8 0361 lr $AX0.L, @0x0361 - 0f0b 0082 02b0 lri $AR2, #0x02b0 - 0f0d 0083 02b0 lri $AR3, #0x02b0 - 0f0f 195e lrri $AC0.M, @$AR2 - 0f10 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M - 0f11 1128 0f16 bloopi #0x28, 0x0f16 - 0f13 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 - 0f14 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H - 0f15 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 - 0f16 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - 0f17 8a00 m2 - 0f18 0082 02b0 lri $AR2, #0x02b0 - 0f1a 00dd 0430 lr $AC1.L, @0x0430 - 0f1c 1504 lsl $ACC1, #4 - 0f1d 1fe0 mrr $AC1.M, $AR0 - 0f1e 8100 clr $ACC0 - 0f1f 00de 0362 lr $AC0.M, @0x0362 - 0f21 1474 lsr $ACC0, #-12 - 0f22 1f7e mrr $AX1.H, $AC0.M - 0f23 1f3c mrr $AX1.L, $AC0.L - 0f24 8f00 set40 - 0f25 1943 lrri $AR3, @$AR2 - 0f26 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0f27 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f28 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f29 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f2a f200 madd $AX0.L, $AX0.H - 0f2b fe00 movpz $ACC0 - 0f2c 1c1f mrr $AR0, $AC1.M - 0f2d 1943 lrri $AR3, @$AR2 - 0f2e 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0f2f 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f30 114e 0f38 bloopi #0x4e, 0x0f38 - 0f32 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f33 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f34 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0f35 1c1f mrr $AR0, $AC1.M - 0f36 1943 lrri $AR3, @$AR2 - 0f37 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0f38 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - 0f39 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f3a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f3b f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0f3c fe00 movpz $ACC0 - 0f3d 1b3e srri @$AR1, $AC0.M - 0f3e 8b00 m0 - 0f3f 8e00 set16 - 0f40 00fe 0433 sr @0x0433, $AC0.M - 0f42 1c1f mrr $AR0, $AC1.M - 0f43 150c lsl $ACC1, #12 - 0f44 0340 0fff andi $AC1.M, #0x0fff - 0f46 00ff 0430 sr @0x0430, $AC1.M - 0f48 0083 043c lri $AR3, #0x043c - 0f4a 191e lrri $AC0.M, @$AR0 - 0f4b 191f lrri $AC1.M, @$AR0 - 0f4c 80a0 nx'ls : $AX0.H, $AC0.M - 0f4d 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0f4e 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0f4f 1b7f srri @$AR3, $AC1.M - 0f50 02df ret - 0f51 1fe0 mrr $AC1.M, $AR0 - 0f52 1c1f mrr $AR0, $AC1.M - 0f53 1128 0f5a bloopi #0x28, 0x0f5a - 0f55 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f56 1b3e srri @$AR1, $AC0.M - 0f57 1c1f mrr $AR0, $AC1.M - 0f58 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f59 1b3e srri @$AR1, $AC0.M - 0f5a 1c1f mrr $AR0, $AC1.M - 0f5b 029f 0f40 jmp 0x0f40 - 0f5d 0083 0520 lri $AR3, #0x0520 - 0f5f 00de 0433 lr $AC0.M, @0x0433 - 0f61 1050 loopi #0x50 - 0f62 1b7e srri @$AR3, $AC0.M - 0f63 029f 0386 jmp 0x0386 - 0f65 1c20 mrr $AR1, $AR0 - 0f66 185f lrr $AC1.M, @$AR2 - 0f67 1f7f mrr $AX1.H, $AC1.M - 0f68 193a lrri $AX0.H, @$AR1 - 0f69 6400 movr $ACC0, $AX0.H - 0f6a 0078 0f6f bloop $AX0.L, 0x0f6f - 0f6c 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1 - 0f6d 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M - 0f6e 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1 - 0f6f 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M - 0f70 1a5b srr @$AR2, $AX1.H - 0f71 02df ret - 0f72 0098 8240 lri $AX0.L, #0x8240 - 0f74 00f8 04e8 sr @0x04e8, $AX0.L - 0f76 0098 7fff lri $AX0.L, #0x7fff - 0f78 00f8 04e9 sr @0x04e9, $AX0.L - 0f7a 0098 7dbf lri $AX0.L, #0x7dbf - 0f7c 00f8 04ea sr @0x04ea, $AX0.L - 0f7e 0098 843f lri $AX0.L, #0x843f - 0f80 00f8 04eb sr @0x04eb, $AX0.L - 0f82 0098 b23b lri $AX0.L, #0xb23b - 0f84 00f8 04f0 sr @0x04f0, $AX0.L - 0f86 0098 7fff lri $AX0.L, #0x7fff - 0f88 00f8 04f1 sr @0x04f1, $AX0.L - 0f8a 0098 4dc4 lri $AX0.L, #0x4dc4 - 0f8c 00f8 04f2 sr @0x04f2, $AX0.L - 0f8e 0098 d808 lri $AX0.L, #0xd808 - 0f90 00f8 04f3 sr @0x04f3, $AX0.L - 0f92 0098 0000 lri $AX0.L, #0x0000 - 0f94 0080 04ec lri $AR0, #0x04ec - 0f96 1004 loopi #0x04 - 0f97 1b18 srri @$AR0, $AX0.L - 0f98 0080 04f4 lri $AR0, #0x04f4 - 0f9a 1004 loopi #0x04 - 0f9b 1b18 srri @$AR0, $AX0.L - 0f9c 02df ret - 0f9d 0080 0f40 lri $AR0, #0x0f40 - 0f9f 0083 0b00 lri $AR3, #0x0b00 - 0fa1 8900 clr $ACC1 - 0fa2 0f50 lris $AC1.M, #0x50 - 0fa3 0098 6784 lri $AX0.L, #0x6784 - 0fa5 02bf 0154 call 0x0154 - 0fa7 0080 04e8 lri $AR0, #0x04e8 - 0fa9 0082 04ec lri $AR2, #0x04ec - 0fab 0081 0b00 lri $AR1, #0x0b00 - 0fad 8900 clr $ACC1 - 0fae 0f50 lris $AC1.M, #0x50 - 0faf 0080 0b00 lri $AR0, #0x0b00 - 0fb1 0083 0d00 lri $AR3, #0x0d00 - 0fb3 0098 7fff lri $AX0.L, #0x7fff - 0fb5 02bf 0145 call 0x0145 - 0fb7 8900 clr $ACC1 - 0fb8 0f50 lris $AC1.M, #0x50 - 0fb9 0080 0b00 lri $AR0, #0x0b00 - 0fbb 0083 0d60 lri $AR3, #0x0d60 - 0fbd 0098 b820 lri $AX0.L, #0xb820 - 0fbf 02bf 0145 call 0x0145 - 0fc1 0080 0ca0 lri $AR0, #0x0ca0 - 0fc3 0083 0b00 lri $AR3, #0x0b00 - 0fc5 8900 clr $ACC1 - 0fc6 0f50 lris $AC1.M, #0x50 - 0fc7 0098 6784 lri $AX0.L, #0x6784 - 0fc9 02bf 0154 call 0x0154 - 0fcb 0080 04e8 lri $AR0, #0x04e8 - 0fcd 0082 04f4 lri $AR2, #0x04f4 - 0fcf 0081 0b00 lri $AR1, #0x0b00 - 0fd1 8900 clr $ACC1 - 0fd2 0f50 lris $AC1.M, #0x50 - 0fd3 0080 0b00 lri $AR0, #0x0b00 - 0fd5 0083 0d00 lri $AR3, #0x0d00 - 0fd7 0098 47e0 lri $AX0.L, #0x47e0 - 0fd9 02bf 0145 call 0x0145 - 0fdb 8900 clr $ACC1 - 0fdc 0f50 lris $AC1.M, #0x50 - 0fdd 0080 0b00 lri $AR0, #0x0b00 - 0fdf 0083 0d60 lri $AR3, #0x0d60 - 0fe1 0098 8001 lri $AX0.L, #0x8001 - 0fe3 02bf 0145 call 0x0145 - 0fe5 02df ret - 0fe6 0000 nop - 0fe7 0000 nop - 0fe8 0000 nop - 0fe9 0000 nop - 0fea 0000 nop - 0feb 0000 nop - 0fec 0000 nop - 0fed 0000 nop - 0fee 0000 nop - 0fef 0000 nop diff --git a/docs/DSP/DSP_UC_PikminWii.txt b/docs/DSP/DSP_UC_PikminWii.txt deleted file mode 100644 index 19373ea920..0000000000 --- a/docs/DSP/DSP_UC_PikminWii.txt +++ /dev/null @@ -1,2825 +0,0 @@ -// What seems to be the latest Zelda/SMG UCode (2009). Seems to work differently than the rest. Also longer and has more ext ops. - - 0000 029f 0012 jmp 0x0012 - 0002 0000 nop - 0003 0000 nop - 0004 02ff rti - 0005 0000 nop - 0006 02ff rti - 0007 0000 nop - 0008 02ff rti - 0009 0000 nop - 000a 02ff rti - 000b 0000 nop - 000c 02ff rti - 000d 0000 nop - 000e 029f 06e0 jmp 0x06e0 - 0010 029f 004c jmp 0x004c - 0012 1205 sbclr #0x05 - 0013 02bf 0055 call 0x0055 - 0015 8100 clr $ACC0 - 0016 009f 1000 lri $AC1.M, #0x1000 - 0018 0080 0000 lri $AR0, #0x0000 - 001a 005f loop $AC1.M - 001b 1b1e srri @$AR0, $AC0.M - 001c 02bf 07b0 call 0x07b0 - 001e 02bf 0f24 call 0x0f24 - 0020 0e00 lris $AC0.M, #0x00 - 0021 02bf 0792 call 0x0792 - 0023 009e 1111 lri $AC0.M, #0x1111 - 0025 02bf 079c call 0x079c - 0027 0e00 lris $AC0.M, #0x00 - 0028 00fe 034e sr @0x034e, $AC0.M - 002a 1305 sbset #0x05 - 002b 029f 07ed jmp 0x07ed - 002d 00df 0357 lr $AC1.M, @0x0357 - 002f 00ff 0345 sr @0x0345, $AC1.M - 0031 00de 0356 lr $AC0.M, @0x0356 - 0033 1ffe mrr $AC1.M, $AC0.M - 0034 0340 00ff andi $AC1.M, #0x00ff - 0036 00ff 0344 sr @0x0344, $AC1.M - 0038 1479 lsr $ACC0, #-7 - 0039 0240 007e andi $AC0.M, #0x007e - 003b 00fe 0343 sr @0x0343, $AC0.M - 003d 0200 0073 addi $AC0.M, #0x0073 - 003f 1c1e mrr $AR0, $AC0.M - 0040 170f jmpr $AR0 - 0041 0092 00ff lri $CR, #0x00ff - 0043 0e04 lris $AC0.M, #0x04 - 0044 02bf 0792 call 0x0792 - 0046 00de 0356 lr $AC0.M, @0x0356 - 0048 02bf 079c call 0x079c - 004a 029f 002b jmp 0x002b - 004c 1205 sbclr #0x05 - 004d 02bf 0055 call 0x0055 - 004f 0e01 lris $AC0.M, #0x01 - 0050 02bf 0792 call 0x0792 - 0052 1305 sbset #0x05 - 0053 029f 002b jmp 0x002b - 0055 1202 sbclr #0x02 - 0056 1203 sbclr #0x03 - 0057 1204 sbclr #0x04 - 0058 1306 sbset #0x06 - 0059 8e00 set16 - 005a 8c00 clr15 - 005b 8b00 m0 - 005c 009e ffff lri $AC0.M, #0xffff - 005e 1d1e mrr $WR0, $AC0.M - 005f 1d3e mrr $WR1, $AC0.M - 0060 1d5e mrr $WR2, $AC0.M - 0061 1d7e mrr $WR3, $AC0.M - 0062 0092 00ff lri $CR, #0x00ff - 0064 02df ret - 0065 0081 0358 lri $AR1, #0x0358 - 0067 0090 0000 lri $AC0.H, #0x0000 - 0069 0c00 lris $AC0.L, #0x00 - 006a 007e 006f bloop $AC0.M, 0x006f - 006c 193e lrri $AC0.M, @$AR1 - 006d 1b1e srri @$AR0, $AC0.M - 006e 193e lrri $AC0.M, @$AR1 - 006f 1b1e srri @$AR0, $AC0.M - 0070 02df ret - 0071 029f 0041 jmp 0x0041 - 0073 029f 0041 jmp 0x0041 - 0075 029f 0093 jmp 0x0093 - 0077 029f 029d jmp 0x029d - 0079 029f 0071 jmp 0x0071 - 007b 029f 0629 jmp 0x0629 - 007d 029f 063b jmp 0x063b - 007f 029f 0041 jmp 0x0041 - 0081 029f 0572 jmp 0x0572 - 0083 029f 05be jmp 0x05be - 0085 029f 05a2 jmp 0x05a2 - 0087 029f 0041 jmp 0x0041 - 0089 029f 0041 jmp 0x0041 - 008b 029f 0041 jmp 0x0041 - 008d 029f 00bd jmp 0x00bd - 008f 029f 00b0 jmp 0x00b0 - 0091 029f 0041 jmp 0x0041 - 0093 0080 0380 lri $AR0, #0x0380 - 0095 0e04 lris $AC0.M, #0x04 - 0096 02bf 0065 call 0x0065 - 0098 0081 0382 lri $AR1, #0x0382 - 009a 009f 0000 lri $AC1.M, #0x0000 - 009c 0080 0280 lri $AR0, #0x0280 - 009e 02bf 05f9 call 0x05f9 - 00a0 0081 0384 lri $AR1, #0x0384 - 00a2 009f 0300 lri $AC1.M, #0x0300 - 00a4 0080 0020 lri $AR0, #0x0020 - 00a6 02bf 05f9 call 0x05f9 - 00a8 00de 0345 lr $AC0.M, @0x0345 - 00aa 00fe 0342 sr @0x0342, $AC0.M - 00ac 02bf 0cf6 call 0x0cf6 - 00ae 029f 0041 jmp 0x0041 - 00b0 0080 037d lri $AR0, #0x037d - 00b2 0e01 lris $AC0.M, #0x01 - 00b3 02bf 0065 call 0x0065 - 00b5 00de 037d lr $AC0.M, @0x037d - 00b7 0240 7fff andi $AC0.M, #0x7fff - 00b9 00fe 037d sr @0x037d, $AC0.M - 00bb 029f 0041 jmp 0x0041 - 00bd 0080 0374 lri $AR0, #0x0374 - 00bf 0e01 lris $AC0.M, #0x01 - 00c0 00fe 0377 sr @0x0377, $AC0.M - 00c2 00fe 037c sr @0x037c, $AC0.M - 00c4 02bf 0065 call 0x0065 - 00c6 00de 0345 lr $AC0.M, @0x0345 - 00c8 00fe 0376 sr @0x0376, $AC0.M - 00ca 029f 0041 jmp 0x0041 - 00cc 0081 034c lri $AR1, #0x034c - 00ce 009f 0400 lri $AC1.M, #0x0400 - 00d0 0080 00c0 lri $AR0, #0x00c0 - 00d2 02bf 05f9 call 0x05f9 - 00d4 02df ret - 00d5 0081 034c lri $AR1, #0x034c - 00d7 009f 0400 lri $AC1.M, #0x0400 - 00d9 0080 0080 lri $AR0, #0x0080 - 00db 0081 034c lri $AR1, #0x034c - 00dd 193e lrri $AC0.M, @$AR1 - 00de 193c lrri $AC0.L, @$AR1 - 00df 0098 0000 lri $AX0.L, #0x0000 - 00e1 7000 addaxl $ACC0, $AX0.L - 00e2 02bf 0608 call 0x0608 - 00e4 02df ret - 00e5 191e lrri $AC0.M, @$AR0 - 00e6 191a lrri $AX0.H, @$AR0 - 00e7 005f loop $AC1.M - 00e8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 00e9 1b7e srri @$AR3, $AC0.M - 00ea 1b7a srri @$AR3, $AX0.H - 00eb 02df ret - 00ec 0000 nop - 00ed 007f 00f2 bloop $AC1.M, 0x00f2 - 00ef 191e lrri $AC0.M, @$AR0 - 00f0 1b7e srri @$AR3, $AC0.M - 00f1 191e lrri $AC0.M, @$AR0 - 00f2 1b7e srri @$AR3, $AC0.M - 00f3 0000 nop - 00f4 02df ret - 00f5 191e lrri $AC0.M, @$AR0 - 00f6 191a lrri $AX0.H, @$AR0 - 00f7 007f 00fc bloop $AC1.M, 0x00fc - 00f9 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 00fa 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 00fb 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 00fc 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 00fd 0000 nop - 00fe 02df ret - 00ff 8a00 m2 - 0100 157f lsr $ACC1, #-1 - 0101 1c20 mrr $AR1, $AR0 - 0102 1c03 mrr $AR0, $AR3 - 0103 193a lrri $AX0.H, @$AR1 - 0104 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 - 0105 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 - 0106 007f 010b bloop $AC1.M, 0x010b - 0108 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 0109 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 010a 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 010b 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 010c 8b00 m0 - 010d 02df ret - 010e 8a00 m2 - 010f 191a lrri $AX0.H, @$AR0 - 0110 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 - 0111 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0112 005f loop $AC1.M - 0113 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M - 0114 8b00 m0 - 0115 02df ret - 0116 8100 clr $ACC0 - 0117 8900 clr $ACC1 - 0118 0e50 lris $AC0.M, #0x50 - 0119 0080 0d00 lri $AR0, #0x0d00 - 011b 005e loop $AC0.M - 011c 1b1f srri @$AR0, $AC1.M - 011d 0080 0d60 lri $AR0, #0x0d60 - 011f 005e loop $AC0.M - 0120 1b1f srri @$AR0, $AC1.M - 0121 00da 0374 lr $AX0.H, @0x0374 - 0123 8600 tstaxh $AX0.H - 0124 02b5 0f4f callz 0x0f4f - 0126 8100 clr $ACC0 - 0127 8900 clr $ACC1 - 0128 0e50 lris $AC0.M, #0x50 - 0129 0080 0ca0 lri $AR0, #0x0ca0 - 012b 005e loop $AC0.M - 012c 1b1f srri @$AR0, $AC1.M - 012d 0080 0f40 lri $AR0, #0x0f40 - 012f 005e loop $AC0.M - 0130 1b1f srri @$AR0, $AC1.M - 0131 0080 0fa0 lri $AR0, #0x0fa0 - 0133 005e loop $AC0.M - 0134 1b1f srri @$AR0, $AC1.M - 0135 0080 0a00 lri $AR0, #0x0a00 - 0137 005e loop $AC0.M - 0138 1b1f srri @$AR0, $AC1.M - 0139 0080 09a0 lri $AR0, #0x09a0 - 013b 005e loop $AC0.M - 013c 1b1f srri @$AR0, $AC1.M - 013d 0f04 lris $AC1.M, #0x04 - 013e 0080 0e10 lri $AR0, #0x0e10 - 0140 0083 0dc0 lri $AR3, #0x0dc0 - 0142 02bf 00ec call 0x00ec - 0144 0080 0e70 lri $AR0, #0x0e70 - 0146 0083 0e20 lri $AR3, #0x0e20 - 0148 02bf 00ec call 0x00ec - 014a 0080 0ed0 lri $AR0, #0x0ed0 - 014c 0083 0e80 lri $AR3, #0x0e80 - 014e 02bf 00ec call 0x00ec - 0150 0080 0f30 lri $AR0, #0x0f30 - 0152 0083 0ee0 lri $AR3, #0x0ee0 - 0154 02bf 00ec call 0x00ec - 0156 8100 clr $ACC0 - 0157 0e50 lris $AC0.M, #0x50 - 0158 8900 clr $ACC1 - 0159 0080 0dc8 lri $AR0, #0x0dc8 - 015b 005e loop $AC0.M - 015c 1b1f srri @$AR0, $AC1.M - 015d 0080 0e28 lri $AR0, #0x0e28 - 015f 005e loop $AC0.M - 0160 1b1f srri @$AR0, $AC1.M - 0161 0080 0e88 lri $AR0, #0x0e88 - 0163 005e loop $AC0.M - 0164 1b1f srri @$AR0, $AC1.M - 0165 0080 0ee8 lri $AR0, #0x0ee8 - 0167 005e loop $AC0.M - 0168 1b1f srri @$AR0, $AC1.M - 0169 02df ret - 016a 009f 0580 lri $AC1.M, #0x0580 - 016c 009b 00a0 lri $AX1.H, #0x00a0 - 016e 0081 0393 lri $AR1, #0x0393 - 0170 18bc lrrd $AC0.L, @$AR1 - 0171 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0172 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0173 0080 0050 lri $AR0, #0x0050 - 0175 02bf 05fb call 0x05fb - 0177 02df ret - 0178 00df 03a1 lr $AC1.M, @0x03a1 - 017a 0508 addis $ACC1, #0x08 - 017b 0080 0580 lri $AR0, #0x0580 - 017d 1c7f mrr $AR3, $AC1.M - 017e 0098 7fff lri $AX0.L, #0x7fff - 0180 8900 clr $ACC1 - 0181 0f50 lris $AC1.M, #0x50 - 0182 02bf 00ff call 0x00ff - 0184 02df ret - 0185 00c0 03a0 lr $AR0, @0x03a0 - 0187 191a lrri $AX0.H, @$AR0 - 0188 02bf 016a call 0x016a - 018a 02bf 0178 call 0x0178 - 018c 8100 clr $ACC0 - 018d 8900 clr $ACC1 - 018e 00de 0390 lr $AC0.M, @0x0390 - 0190 02a0 0001 andf $AC0.M, #0x0001 - 0192 029d 019b jlz 0x019b - 0194 0080 0398 lri $AR0, #0x0398 - 0196 0e08 lris $AC0.M, #0x08 - 0197 00c1 03a1 lr $AR1, @0x03a1 - 0199 02bf 0c38 call 0x0c38 - 019b 0f50 lris $AC1.M, #0x50 - 019c 00c0 03a1 lr $AR0, @0x03a1 - 019e 00da 0394 lr $AX0.H, @0x0394 - 01a0 8600 tstaxh $AX0.H - 01a1 0295 01a8 jz 0x01a8 - 01a3 1c7a mrr $AR3, $AX0.H - 01a4 00d8 0395 lr $AX0.L, @0x0395 - 01a6 02bf 00ff call 0x00ff - 01a8 0f50 lris $AC1.M, #0x50 - 01a9 00c0 03a1 lr $AR0, @0x03a1 - 01ab 00da 0396 lr $AX0.H, @0x0396 - 01ad 8600 tstaxh $AX0.H - 01ae 0295 01b5 jz 0x01b5 - 01b0 1c7a mrr $AR3, $AX0.H - 01b1 00d8 0397 lr $AX0.L, @0x0397 - 01b3 02bf 00ff call 0x00ff - 01b5 00de 0390 lr $AC0.M, @0x0390 - 01b7 02a0 0002 andf $AC0.M, #0x0002 - 01b9 02dd retlz - 01ba 0080 0398 lri $AR0, #0x0398 - 01bc 0e08 lris $AC0.M, #0x08 - 01bd 00c1 03a1 lr $AR1, @0x03a1 - 01bf 02bf 0c38 call 0x0c38 - 01c1 02df ret - 01c2 8900 clr $ACC1 - 01c3 009f 0dc0 lri $AC1.M, #0x0dc0 - 01c5 00ff 03a1 sr @0x03a1, $AC1.M - 01c7 009f 03a8 lri $AC1.M, #0x03a8 - 01c9 00ff 03a2 sr @0x03a2, $AC1.M - 01cb 009f 03a4 lri $AC1.M, #0x03a4 - 01cd 00ff 03a0 sr @0x03a0, $AC1.M - 01cf 1104 01ef bloopi #0x04, 0x01ef - 01d1 00c0 03a2 lr $AR0, @0x03a2 - 01d3 0083 0390 lri $AR3, #0x0390 - 01d5 8900 clr $ACC1 - 01d6 0f08 lris $AC1.M, #0x08 - 01d7 02bf 00ec call 0x00ec - 01d9 00da 0390 lr $AX0.H, @0x0390 - 01db 8600 tstaxh $AX0.H - 01dc 0295 01e0 jz 0x01e0 - 01de 02bf 0185 call 0x0185 - 01e0 8100 clr $ACC0 - 01e1 00de 03a2 lr $AC0.M, @0x03a2 - 01e3 0410 addis $ACC0, #0x10 - 01e4 00fe 03a2 sr @0x03a2, $AC0.M - 01e6 00de 03a1 lr $AC0.M, @0x03a1 - 01e8 0460 addis $ACC0, #0x60 - 01e9 00fe 03a1 sr @0x03a1, $AC0.M - 01eb 00de 03a0 lr $AC0.M, @0x03a0 - 01ed 7400 incm $AC0.M - 01ee 00fe 03a0 sr @0x03a0, $AC0.M - 01f0 00da 0374 lr $AX0.H, @0x0374 - 01f2 8600 tstaxh $AX0.H - 01f3 0294 0219 jnz 0x0219 - 01f5 0f50 lris $AC1.M, #0x50 - 01f6 0080 0be0 lri $AR0, #0x0be0 - 01f8 0083 0e80 lri $AR3, #0x0e80 - 01fa 0098 7fff lri $AX0.L, #0x7fff - 01fc 02bf 00ff call 0x00ff - 01fe 0f50 lris $AC1.M, #0x50 - 01ff 0080 0be0 lri $AR0, #0x0be0 - 0201 0083 0ee0 lri $AR3, #0x0ee0 - 0203 0098 b820 lri $AX0.L, #0xb820 - 0205 02bf 00ff call 0x00ff - 0207 0f28 lris $AC1.M, #0x28 - 0208 0080 0c68 lri $AR0, #0x0c68 - 020a 0083 0e80 lri $AR3, #0x0e80 - 020c 0098 b820 lri $AX0.L, #0xb820 - 020e 02bf 00ff call 0x00ff - 0210 0f28 lris $AC1.M, #0x28 - 0211 0080 0c68 lri $AR0, #0x0c68 - 0213 0083 0ee0 lri $AR3, #0x0ee0 - 0215 0098 7fff lri $AX0.L, #0x7fff - 0217 02bf 00ff call 0x00ff - 0219 8100 clr $ACC0 - 021a 8900 clr $ACC1 - 021b 0e50 lris $AC0.M, #0x50 - 021c 0080 0be0 lri $AR0, #0x0be0 - 021e 005e loop $AC0.M - 021f 1b1f srri @$AR0, $AC1.M - 0220 0080 0c40 lri $AR0, #0x0c40 - 0222 005e loop $AC0.M - 0223 1b1f srri @$AR0, $AC1.M - 0224 02df ret - 0225 00c0 03a0 lr $AR0, @0x03a0 - 0227 181a lrr $AX0.H, @$AR0 - 0228 8100 clr $ACC0 - 0229 181e lrr $AC0.M, @$AR0 - 022a 00db 0391 lr $AX1.H, @0x0391 - 022c 7400 incm $AC0.M - 022d d100 cmpar $ACC1, $AX0.H - 022e 0270 ifge - 022f 8100 clr $ACC0 - 0230 1b1e srri @$AR0, $AC0.M - 0231 00df 03a1 lr $AC1.M, @0x03a1 - 0233 009b 00a0 lri $AX1.H, #0x00a0 - 0235 0081 0393 lri $AR1, #0x0393 - 0237 18bc lrrd $AC0.L, @$AR1 - 0238 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0239 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 023a 0080 0050 lri $AR0, #0x0050 - 023c 02bf 0608 call 0x0608 - 023e 02df ret - 023f 00da 0374 lr $AX0.H, @0x0374 - 0241 8600 tstaxh $AX0.H - 0242 0294 0258 jnz 0x0258 - 0244 8900 clr $ACC1 - 0245 0f28 lris $AC1.M, #0x28 - 0246 0080 0c40 lri $AR0, #0x0c40 - 0248 0083 0ea8 lri $AR3, #0x0ea8 - 024a 0098 b820 lri $AX0.L, #0xb820 - 024c 02bf 00ff call 0x00ff - 024e 8900 clr $ACC1 - 024f 0f28 lris $AC1.M, #0x28 - 0250 0080 0c40 lri $AR0, #0x0c40 - 0252 0083 0f08 lri $AR3, #0x0f08 - 0254 0098 7fff lri $AX0.L, #0x7fff - 0256 02bf 00ff call 0x00ff - 0258 009f 0dc0 lri $AC1.M, #0x0dc0 - 025a 00ff 03a1 sr @0x03a1, $AC1.M - 025c 009f 03a8 lri $AC1.M, #0x03a8 - 025e 00ff 03a2 sr @0x03a2, $AC1.M - 0260 009f 03a4 lri $AC1.M, #0x03a4 - 0262 00ff 03a0 sr @0x03a0, $AC1.M - 0264 1104 0282 bloopi #0x04, 0x0282 - 0266 00c0 03a2 lr $AR0, @0x03a2 - 0268 0083 0390 lri $AR3, #0x0390 - 026a 0f08 lris $AC1.M, #0x08 - 026b 02bf 00ec call 0x00ec - 026d 00da 0390 lr $AX0.H, @0x0390 - 026f 8600 tstaxh $AX0.H - 0270 0295 0274 jz 0x0274 - 0272 02bf 0225 call 0x0225 - 0274 00de 03a2 lr $AC0.M, @0x03a2 - 0276 0410 addis $ACC0, #0x10 - 0277 00fe 03a2 sr @0x03a2, $AC0.M - 0279 00de 03a1 lr $AC0.M, @0x03a1 - 027b 0460 addis $ACC0, #0x60 - 027c 00fe 03a1 sr @0x03a1, $AC0.M - 027e 00de 03a0 lr $AC0.M, @0x03a0 - 0280 7400 incm $AC0.M - 0281 00fe 03a0 sr @0x03a0, $AC0.M - 0283 02df ret - 0284 0081 0386 lri $AR1, #0x0386 - 0286 009f 03a8 lri $AC1.M, #0x03a8 - 0288 0080 0040 lri $AR0, #0x0040 - 028a 02bf 05f9 call 0x05f9 - 028c 02df ret - 028d 191e lrri $AC0.M, @$AR0 - 028e 189c lrrd $AC0.L, @$AR0 - 028f 4800 addax $ACC0, $AX0.L - 0290 1b1e srri @$AR0, $AC0.M - 0291 1b1c srri @$AR0, $AC0.L - 0292 02df ret - 0293 8100 clr $ACC0 - 0294 8900 clr $ACC1 - 0295 00df 0354 lr $AC1.M, @0x0354 - 0297 00de 034e lr $AC0.M, @0x034e - 0299 8200 cmp - 029a 0293 0293 jle 0x0293 - 029c 02df ret - 029d 0080 0388 lri $AR0, #0x0388 - 029f 0081 0065 lri $AR1, #0x0065 - 02a1 0e02 lris $AC0.M, #0x02 - 02a2 173f callr $AR1 - 02a3 02bf 047f call 0x047f - 02a5 00de 0344 lr $AC0.M, @0x0344 - 02a7 00fe 0341 sr @0x0341, $AC0.M - 02a9 00de 0345 lr $AC0.M, @0x0345 - 02ab 00fe 038e sr @0x038e, $AC0.M - 02ad 8100 clr $ACC0 - 02ae 00fe 0355 sr @0x0355, $AC0.M - 02b0 02bf 0284 call 0x0284 - 02b2 02bf 064d call 0x064d - 02b4 0092 00ff lri $CR, #0x00ff - 02b6 00de 0341 lr $AC0.M, @0x0341 - 02b8 007e 047a bloop $AC0.M, 0x047a - 02ba 02bf 0116 call 0x0116 - 02bc 02bf 01c2 call 0x01c2 - 02be 02bf 04f5 call 0x04f5 - 02c0 02bf 0a86 call 0x0a86 - 02c2 00de 0355 lr $AC0.M, @0x0355 - 02c4 7400 incm $AC0.M - 02c5 00fe 0355 sr @0x0355, $AC0.M - 02c7 8100 clr $ACC0 - 02c8 00fe 0354 sr @0x0354, $AC0.M - 02ca 00de 0342 lr $AC0.M, @0x0342 - 02cc 007e 0420 bloop $AC0.M, 0x0420 - 02ce 02bf 0293 call 0x0293 - 02d0 8100 clr $ACC0 - 02d1 8900 clr $ACC1 - 02d2 00de 0354 lr $AC0.M, @0x0354 - 02d4 147c lsr $ACC0, #-4 - 02d5 0200 04fc addi $AC0.M, #0x04fc - 02d7 1c1e mrr $AR0, $AC0.M - 02d8 181f lrr $AC1.M, @$AR0 - 02d9 00de 0354 lr $AC0.M, @0x0354 - 02db 0240 000f andi $AC0.M, #0x000f - 02dd 3d80 lsrnr $ACC1 - 02de 03c0 8000 andcf $AC1.M, #0x8000 - 02e0 029c 041c jlnz 0x041c - 02e2 00d8 0354 lr $AX0.L, @0x0354 - 02e4 009a 0180 lri $AX0.H, #0x0180 - 02e6 8100 clr $ACC0 - 02e7 00de 0380 lr $AC0.M, @0x0380 - 02e9 00dc 0381 lr $AC0.L, @0x0381 - 02eb 9000 mul $AX0.L, $AX0.H - 02ec 9400 mulac $AX0.L, $AX0.H, $ACC0 - 02ed 00fe 034c sr @0x034c, $AC0.M - 02ef 00fc 034d sr @0x034d, $AC0.L - 02f1 02bf 00cc call 0x00cc - 02f3 00da 0400 lr $AX0.H, @0x0400 - 02f5 8600 tstaxh $AX0.H - 02f6 0295 041c jz 0x041c - 02f8 00da 0401 lr $AX0.H, @0x0401 - 02fa 8600 tstaxh $AX0.H - 02fb 0294 041c jnz 0x041c - 02fd 00da 0433 lr $AX0.H, @0x0433 - 02ff 00fa 03f8 sr @0x03f8, $AX0.H - 0301 00da 0406 lr $AX0.H, @0x0406 - 0303 8600 tstaxh $AX0.H - 0304 0294 0f0f jnz 0x0f0f - 0306 8100 clr $ACC0 - 0307 00de 0480 lr $AC0.M, @0x0480 - 0309 0609 cmpis $ACC0, #0x09 - 030a 0295 031d jz 0x031d - 030c 0605 cmpis $ACC0, #0x05 - 030d 0295 031d jz 0x031d - 030f 0608 cmpis $ACC0, #0x08 - 0310 0295 0ab6 jz 0x0ab6 - 0312 0610 cmpis $ACC0, #0x10 - 0313 0295 0b33 jz 0x0b33 - 0315 0620 cmpis $ACC0, #0x20 - 0316 0295 0ba4 jz 0x0ba4 - 0318 0621 cmpis $ACC0, #0x21 - 0319 0295 0bac jz 0x0bac - 031b 029f 09a3 jmp 0x09a3 - 031d 00d8 0402 lr $AX0.L, @0x0402 - 031f 8100 clr $ACC0 - 0320 8900 clr $ACC1 - 0321 00dc 0430 lr $AC0.L, @0x0430 - 0323 8d00 set15 - 0324 0950 lris $AX1.L, #0x50 - 0325 a000 mulx $AX0.L, $AX1.L - 0326 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0327 1404 lsl $ACC0, #4 - 0328 8c00 clr15 - 0329 1ffe mrr $AC1.M, $AC0.M - 032a 0083 0580 lri $AR3, #0x0580 - 032c 02bf 0865 call 0x0865 - 032e 029f 0330 jmp 0x0330 - 0330 0080 0580 lri $AR0, #0x0580 - 0332 0081 0520 lri $AR1, #0x0520 - 0334 0099 0000 lri $AX1.L, #0x0000 - 0336 02bf 0e8f call 0x0e8f - 0338 00da 04a8 lr $AX0.H, @0x04a8 - 033a 8600 tstaxh $AX0.H - 033b 0295 0341 jz 0x0341 - 033d 0080 0520 lri $AR0, #0x0520 - 033f 02bf 0d8e call 0x0d8e - 0341 009e 0520 lri $AC0.M, #0x0520 - 0343 00fe 038f sr @0x038f, $AC0.M - 0345 8900 clr $ACC1 - 0346 00df 0484 lr $AC1.M, @0x0484 - 0348 0340 001f andi $AC1.M, #0x001f - 034a b900 tst $ACC1 - 034b 0295 0371 jz 0x0371 - 034d 00de 038f lr $AC0.M, @0x038f - 034f 5c00 sub $ACC0, $ACC1 - 0350 00fe 038f sr @0x038f, $AC0.M - 0352 1c7e mrr $AR3, $AC0.M - 0353 0080 0440 lri $AR0, #0x0440 - 0355 05fe addis $ACC1, #0xfe - 0356 02bf 00e5 call 0x00e5 - 0358 0080 0490 lri $AR0, #0x0490 - 035a 00c1 038f lr $AR1, @0x038f - 035c 8900 clr $ACC1 - 035d 00df 0484 lr $AC1.M, @0x0484 - 035f 0340 001f andi $AC1.M, #0x001f - 0361 02bf 0c57 call 0x0c57 - 0363 00de 038f lr $AC0.M, @0x038f - 0365 0450 addis $ACC0, #0x50 - 0366 1c1e mrr $AR0, $AC0.M - 0367 0083 0440 lri $AR3, #0x0440 - 0369 8900 clr $ACC1 - 036a 00df 0484 lr $AC1.M, @0x0484 - 036c 0340 001f andi $AC1.M, #0x001f - 036e 05fe addis $ACC1, #0xfe - 036f 02bf 00e5 call 0x00e5 - 0371 00de 0484 lr $AC0.M, @0x0484 - 0373 0240 0020 andi $AC0.M, #0x0020 - 0375 0295 0393 jz 0x0393 - 0377 0080 04a4 lri $AR0, #0x04a4 - 0379 00c1 038f lr $AR1, @0x038f - 037b 0082 0454 lri $AR2, #0x0454 - 037d 0083 04a7 lri $AR3, #0x04a7 - 037f 18fa lrrd $AX0.H, @$AR3 - 0380 8600 tstaxh $AX0.H - 0381 0294 0391 jnz 0x0391 - 0383 18fa lrrd $AX0.H, @$AR3 - 0384 8600 tstaxh $AX0.H - 0385 0294 0391 jnz 0x0391 - 0387 18fa lrrd $AX0.H, @$AR3 - 0388 8600 tstaxh $AX0.H - 0389 0294 0391 jnz 0x0391 - 038b 8100 clr $ACC0 - 038c 18fe lrrd $AC0.M, @$AR3 - 038d 0280 7fff cmpi $AC0.M, #0x7fff - 038f 0295 0393 jz 0x0393 - 0391 02bf 0c72 call 0x0c72 - 0393 8100 clr $ACC0 - 0394 00de 042c lr $AC0.M, @0x042c - 0396 b100 tst $ACC0 - 0397 0295 039d jz 0x039d - 0399 02bf 0ddd call 0x0ddd - 039b 029f 0412 jmp 0x0412 - 039d 8100 clr $ACC0 - 039e 1c9e mrr $IX0, $AC0.M - 039f 1cde mrr $IX2, $AC0.M - 03a0 7400 incm $AC0.M - 03a1 1cfe mrr $IX3, $AC0.M - 03a2 8100 clr $ACC0 - 03a3 00de 0407 lr $AC0.M, @0x0407 - 03a5 b100 tst $ACC0 - 03a6 0295 03b5 jz 0x03b5 - 03a8 00c3 038f lr $AR3, @0x038f - 03aa 0007 dar $AR3 - 03ab 0080 0477 lri $AR0, #0x0477 - 03ad 0084 ffff lri $IX0, #0xffff - 03af 0087 ffff lri $IX3, #0xffff - 03b1 199a lrrn $AX0.H, @$AR0 - 03b2 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - 03b3 005e loop $AC0.M - 03b4 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - 03b5 00da 0485 lr $AX0.H, @0x0485 - 03b7 8600 tstaxh $AX0.H - 03b8 0295 03cb jz 0x03cb - 03ba 8900 clr $ACC1 - 03bb 0086 0005 lri $IX2, #0x0005 - 03bd 0082 040a lri $AR2, #0x040a - 03bf 1106 03c3 bloopi #0x06, 0x03c3 - 03c1 18de lrrd $AC0.M, @$AR2 - 03c2 147f lsr $ACC0, #-1 - 03c3 4d36 add'sn $ACC1, $ACC0 : @$AR2, $AC0.M - 03c4 b900 tst $ACC1 - 03c5 0294 03cb jnz 0x03cb - 03c7 009a 0001 lri $AX0.H, #0x0001 - 03c9 00fa 0401 sr @0x0401, $AX0.H - 03cb 8f00 set40 - 03cc 0086 0002 lri $IX2, #0x0002 - 03ce 0082 0408 lri $AR2, #0x0408 - 03d0 1106 03fb bloopi #0x06, 0x03fb - 03d2 8100 clr $ACC0 - 03d3 195e lrri $AC0.M, @$AR2 - 03d4 1200 sbclr #0x00 - 03d5 b100 tst $ACC0 - 03d6 0275 ifz - 03d7 1300 sbset #0x00 - 03d8 1c7e mrr $AR3, $AC0.M - 03d9 195e lrri $AC0.M, @$AR2 - 03da 195f lrri $AC1.M, @$AR2 - 03db 5c00 sub $ACC0, $ACC1 - 03dc 14fb asr $ACC0, #-5 - 03dd 1f5e mrr $AX0.H, $AC0.M - 03de 1f1c mrr $AX0.L, $AC0.L - 03df 185e lrr $AC0.M, @$AR2 - 03e0 0240 00ff andi $AC0.M, #0x00ff - 03e2 1f7e mrr $AX1.H, $AC0.M - 03e3 185e lrr $AC0.M, @$AR2 - 03e4 1478 lsr $ACC0, #-8 - 03e5 009c 0000 lri $AC0.L, #0x0000 - 03e7 d100 cmpar $ACC1, $AX0.H - 03e8 0295 03f0 jz 0x03f0 - 03ea 185e lrr $AC0.M, @$AR2 - 03eb 0272 ifg - 03ec 7400 incm $AC0.M - 03ed 0271 ifl - 03ee 7800 decm $AC0.M - 03ef 1a5e srr @$AR2, $AC0.M - 03f0 0006 dar $AR2 - 03f1 00de 038f lr $AC0.M, @0x038f - 03f3 5600 subr $ACC0, $AX1.H - 03f4 029d 03f9 jlz 0x03f9 - 03f6 1c1e mrr $AR0, $AC0.M - 03f7 02bf 0db3 call 0x0db3 - 03f9 0000 nop - 03fa 1b5f srri @$AR2, $AC1.M - 03fb 000a iar $AR2 - 03fc 8e00 set16 - 03fd 8100 clr $ACC0 - 03fe 00de 0407 lr $AC0.M, @0x0407 - 0400 b100 tst $ACC0 - 0401 0295 0412 jz 0x0412 - 0403 00c3 038f lr $AR3, @0x038f - 0405 0087 004f lri $IX3, #0x004f - 0407 001f addarn $AR3, $IX3 - 0408 0080 0477 lri $AR0, #0x0477 - 040a 0084 ffff lri $IX0, #0xffff - 040c 0087 ffff lri $IX3, #0xffff - 040e 19fa lrrn $AX0.H, @$AR3 - 040f 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 0410 005e loop $AC0.M - 0411 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - 0412 00da 0406 lr $AX0.H, @0x0406 - 0414 8600 tstaxh $AX0.H - 0415 0294 041a jnz 0x041a - 0417 8100 clr $ACC0 - 0418 00fe 0404 sr @0x0404, $AC0.M - 041a 02bf 00d5 call 0x00d5 - 041c 00de 0354 lr $AC0.M, @0x0354 - 041e 7400 incm $AC0.M - 041f 00fe 0354 sr @0x0354, $AC0.M - 0421 0e00 lris $AC0.M, #0x00 - 0422 00fe 034e sr @0x034e, $AC0.M - 0424 0e04 lris $AC0.M, #0x04 - 0425 02bf 0792 call 0x0792 - 0427 00de 0355 lr $AC0.M, @0x0355 - 0429 0260 ff00 ori $AC0.M, #0xff00 - 042b 02bf 079c call 0x079c - 042d 02bf 0d14 call 0x0d14 - 042f 02bf 0d26 call 0x0d26 - 0431 02bf 0d7b call 0x0d7b - 0433 00de 0341 lr $AC0.M, @0x0341 - 0435 7800 decm $AC0.M - 0436 00fe 0341 sr @0x0341, $AC0.M - 0438 0080 09a0 lri $AR0, #0x09a0 - 043a 0083 0d00 lri $AR3, #0x0d00 - 043c 0f50 lris $AC1.M, #0x50 - 043d 0098 5a82 lri $AX0.L, #0x5a82 - 043f 02bf 00ff call 0x00ff - 0441 0080 09a0 lri $AR0, #0x09a0 - 0443 0083 0d60 lri $AR3, #0x0d60 - 0445 0f50 lris $AC1.M, #0x50 - 0446 02bf 00ff call 0x00ff - 0448 0083 0d00 lri $AR3, #0x0d00 - 044a 02bf 0dcb call 0x0dcb - 044c 0081 0388 lri $AR1, #0x0388 - 044e 009f 0d00 lri $AC1.M, #0x0d00 - 0450 0080 0050 lri $AR0, #0x0050 - 0452 02bf 0606 call 0x0606 - 0454 0080 0fa0 lri $AR0, #0x0fa0 - 0456 0083 0d60 lri $AR3, #0x0d60 - 0458 0f50 lris $AC1.M, #0x50 - 0459 0098 8000 lri $AX0.L, #0x8000 - 045b 02bf 00ff call 0x00ff - 045d 0083 0d60 lri $AR3, #0x0d60 - 045f 02bf 0dcb call 0x0dcb - 0461 0081 038a lri $AR1, #0x038a - 0463 009f 0d60 lri $AC1.M, #0x0d60 - 0465 0080 0050 lri $AR0, #0x0050 - 0467 02bf 0606 call 0x0606 - 0469 009a 0000 lri $AX0.H, #0x0000 - 046b 0098 00a0 lri $AX0.L, #0x00a0 - 046d 0080 0388 lri $AR0, #0x0388 - 046f 02bf 028d call 0x028d - 0471 0080 038a lri $AR0, #0x038a - 0473 02bf 028d call 0x028d - 0475 02bf 023f call 0x023f - 0477 02bf 0491 call 0x0491 - 0479 0000 nop - 047a 0000 nop - 047b 0080 002b lri $AR0, #0x002b - 047d 029f 072b jmp 0x072b - 047f 0080 0374 lri $AR0, #0x0374 - 0481 0e02 lris $AC0.M, #0x02 - 0482 02bf 0067 call 0x0067 - 0484 00de 0374 lr $AC0.M, @0x0374 - 0486 0240 7fff andi $AC0.M, #0x7fff - 0488 00fe 0374 sr @0x0374, $AC0.M - 048a 00de 0376 lr $AC0.M, @0x0376 - 048c 0240 7fff andi $AC0.M, #0x7fff - 048e 00fe 0376 sr @0x0376, $AC0.M - 0490 02df ret - 0491 00da 0374 lr $AX0.H, @0x0374 - 0493 8600 tstaxh $AX0.H - 0494 02d5 retz - 0495 0083 0f40 lri $AR3, #0x0f40 - 0497 02bf 0dcb call 0x0dcb - 0499 0083 0ca0 lri $AR3, #0x0ca0 - 049b 02bf 0dcb call 0x0dcb - 049d 0081 0374 lri $AR1, #0x0374 - 049f 009f 0f40 lri $AC1.M, #0x0f40 - 04a1 0080 0050 lri $AR0, #0x0050 - 04a3 02bf 0606 call 0x0606 - 04a5 0081 0376 lri $AR1, #0x0376 - 04a7 009f 0ca0 lri $AC1.M, #0x0ca0 - 04a9 0080 0050 lri $AR0, #0x0050 - 04ab 02bf 0606 call 0x0606 - 04ad 009a 0000 lri $AX0.H, #0x0000 - 04af 0098 00a0 lri $AX0.L, #0x00a0 - 04b1 0080 0374 lri $AR0, #0x0374 - 04b3 02bf 028d call 0x028d - 04b5 0080 0376 lri $AR0, #0x0376 - 04b7 02bf 028d call 0x028d - 04b9 02df ret - 04ba 00da 0374 lr $AX0.H, @0x0374 - 04bc 8600 tstaxh $AX0.H - 04bd 02d5 retz - 04be 009f 0be0 lri $AC1.M, #0x0be0 - 04c0 00ff 03a1 sr @0x03a1, $AC1.M - 04c2 00df 03ca lr $AC1.M, @0x03ca - 04c4 00ff 0392 sr @0x0392, $AC1.M - 04c6 00df 03cb lr $AC1.M, @0x03cb - 04c8 00ff 0393 sr @0x0393, $AC1.M - 04ca 009f 03a6 lri $AC1.M, #0x03a6 - 04cc 00ff 03a0 sr @0x03a0, $AC1.M - 04ce 00df 03c9 lr $AC1.M, @0x03c9 - 04d0 00ff 0391 sr @0x0391, $AC1.M - 04d2 00da 03c8 lr $AX0.H, @0x03c8 - 04d4 8600 tstaxh $AX0.H - 04d5 0295 04d9 jz 0x04d9 - 04d7 02bf 0225 call 0x0225 - 04d9 009f 0c40 lri $AC1.M, #0x0c40 - 04db 00ff 03a1 sr @0x03a1, $AC1.M - 04dd 00df 03da lr $AC1.M, @0x03da - 04df 00ff 0392 sr @0x0392, $AC1.M - 04e1 00df 03db lr $AC1.M, @0x03db - 04e3 00ff 0393 sr @0x0393, $AC1.M - 04e5 009f 03a7 lri $AC1.M, #0x03a7 - 04e7 00ff 03a0 sr @0x03a0, $AC1.M - 04e9 00df 03d9 lr $AC1.M, @0x03d9 - 04eb 00ff 0391 sr @0x0391, $AC1.M - 04ed 00da 03d8 lr $AX0.H, @0x03d8 - 04ef 8600 tstaxh $AX0.H - 04f0 0295 04f4 jz 0x04f4 - 04f2 02bf 0225 call 0x0225 - 04f4 02df ret - 04f5 00da 0374 lr $AX0.H, @0x0374 - 04f7 8600 tstaxh $AX0.H - 04f8 02d5 retz - 04f9 00da 03d8 lr $AX0.H, @0x03d8 - 04fb 8600 tstaxh $AX0.H - 04fc 02d5 retz - 04fd 0083 0be0 lri $AR3, #0x0be0 - 04ff 0080 0c30 lri $AR0, #0x0c30 - 0501 0f04 lris $AC1.M, #0x04 - 0502 02bf 00ec call 0x00ec - 0504 0083 0c40 lri $AR3, #0x0c40 - 0506 0080 0c90 lri $AR0, #0x0c90 - 0508 0f04 lris $AC1.M, #0x04 - 0509 02bf 00ec call 0x00ec - 050b 00df 03ca lr $AC1.M, @0x03ca - 050d 00ff 0392 sr @0x0392, $AC1.M - 050f 00df 03cb lr $AC1.M, @0x03cb - 0511 00ff 0393 sr @0x0393, $AC1.M - 0513 00df 03a6 lr $AC1.M, @0x03a6 - 0515 7500 incm $AC1.M - 0516 1f5f mrr $AX0.H, $AC1.M - 0517 009f 0be8 lri $AC1.M, #0x0be8 - 0519 02bf 016c call 0x016c - 051b 00df 03da lr $AC1.M, @0x03da - 051d 00ff 0392 sr @0x0392, $AC1.M - 051f 00df 03db lr $AC1.M, @0x03db - 0521 00ff 0393 sr @0x0393, $AC1.M - 0523 00df 03a7 lr $AC1.M, @0x03a7 - 0525 7500 incm $AC1.M - 0526 1f5f mrr $AX0.H, $AC1.M - 0527 009f 0c48 lri $AC1.M, #0x0c48 - 0529 02bf 016c call 0x016c - 052b 00de 03c8 lr $AC0.M, @0x03c8 - 052d 02a0 0001 andf $AC0.M, #0x0001 - 052f 029d 0538 jlz 0x0538 - 0531 0080 03d0 lri $AR0, #0x03d0 - 0533 0e08 lris $AC0.M, #0x08 - 0534 0081 0be0 lri $AR1, #0x0be0 - 0536 02bf 0c38 call 0x0c38 - 0538 00de 03d8 lr $AC0.M, @0x03d8 - 053a 02a0 0001 andf $AC0.M, #0x0001 - 053c 029d 0545 jlz 0x0545 - 053e 0080 03e0 lri $AR0, #0x03e0 - 0540 0e08 lris $AC0.M, #0x08 - 0541 0081 0c40 lri $AR1, #0x0c40 - 0543 02bf 0c38 call 0x0c38 - 0545 0f50 lris $AC1.M, #0x50 - 0546 0080 0be0 lri $AR0, #0x0be0 - 0548 0083 0f40 lri $AR3, #0x0f40 - 054a 00d8 03cd lr $AX0.L, @0x03cd - 054c 02bf 00ff call 0x00ff - 054e 0f50 lris $AC1.M, #0x50 - 054f 0080 0c40 lri $AR0, #0x0c40 - 0551 0083 0ca0 lri $AR3, #0x0ca0 - 0553 00d8 03df lr $AX0.L, @0x03df - 0555 02bf 00ff call 0x00ff - 0557 00de 03c8 lr $AC0.M, @0x03c8 - 0559 02a0 0002 andf $AC0.M, #0x0002 - 055b 029d 0564 jlz 0x0564 - 055d 0080 03d0 lri $AR0, #0x03d0 - 055f 0e08 lris $AC0.M, #0x08 - 0560 0081 0be0 lri $AR1, #0x0be0 - 0562 02bf 0c38 call 0x0c38 - 0564 00de 03d8 lr $AC0.M, @0x03d8 - 0566 02a0 0002 andf $AC0.M, #0x0002 - 0568 029d 0571 jlz 0x0571 - 056a 0080 03e0 lri $AR0, #0x03e0 - 056c 0e08 lris $AC0.M, #0x08 - 056d 0081 0c40 lri $AR1, #0x0c40 - 056f 02bf 0c38 call 0x0c38 - 0571 02df ret - 0572 0080 0346 lri $AR0, #0x0346 - 0574 02bf 0065 call 0x0065 - 0576 02bf 0065 call 0x0065 - 0578 0081 0346 lri $AR1, #0x0346 - 057a 193e lrri $AC0.M, @$AR1 - 057b 193c lrri $AC0.L, @$AR1 - 057c 009f 0400 lri $AC1.M, #0x0400 - 057e 00c0 0345 lr $AR0, @0x0345 - 0580 02bf 05fb call 0x05fb - 0582 0081 0348 lri $AR1, #0x0348 - 0584 193e lrri $AC0.M, @$AR1 - 0585 193c lrri $AC0.L, @$AR1 - 0586 009f 0800 lri $AC1.M, #0x0800 - 0588 00c0 0345 lr $AR0, @0x0345 - 058a 02bf 05fb call 0x05fb - 058c 0081 0346 lri $AR1, #0x0346 - 058e 193e lrri $AC0.M, @$AR1 - 058f 193c lrri $AC0.L, @$AR1 - 0590 009f 0800 lri $AC1.M, #0x0800 - 0592 00c0 0345 lr $AR0, @0x0345 - 0594 02bf 0608 call 0x0608 - 0596 0081 0348 lri $AR1, #0x0348 - 0598 193e lrri $AC0.M, @$AR1 - 0599 193c lrri $AC0.L, @$AR1 - 059a 009f 0400 lri $AC1.M, #0x0400 - 059c 00c0 0345 lr $AR0, @0x0345 - 059e 02bf 0608 call 0x0608 - 05a0 029f 0041 jmp 0x0041 - 05a2 0080 0346 lri $AR0, #0x0346 - 05a4 02bf 0065 call 0x0065 - 05a6 02bf 0065 call 0x0065 - 05a8 0081 0346 lri $AR1, #0x0346 - 05aa 193e lrri $AC0.M, @$AR1 - 05ab 193c lrri $AC0.L, @$AR1 - 05ac 009f 0400 lri $AC1.M, #0x0400 - 05ae 00c0 0345 lr $AR0, @0x0345 - 05b0 02bf 05fb call 0x05fb - 05b2 0081 0348 lri $AR1, #0x0348 - 05b4 193e lrri $AC0.M, @$AR1 - 05b5 193c lrri $AC0.L, @$AR1 - 05b6 009f 0400 lri $AC1.M, #0x0400 - 05b8 00c0 0345 lr $AR0, @0x0345 - 05ba 02bf 0608 call 0x0608 - 05bc 029f 0041 jmp 0x0041 - 05be 0080 0346 lri $AR0, #0x0346 - 05c0 02bf 0065 call 0x0065 - 05c2 02bf 0065 call 0x0065 - 05c4 0081 0346 lri $AR1, #0x0346 - 05c6 193e lrri $AC0.M, @$AR1 - 05c7 193c lrri $AC0.L, @$AR1 - 05c8 009f 0400 lri $AC1.M, #0x0400 - 05ca 00c0 0344 lr $AR0, @0x0344 - 05cc 02bf 05fb call 0x05fb - 05ce 0081 0348 lri $AR1, #0x0348 - 05d0 193e lrri $AC0.M, @$AR1 - 05d1 193c lrri $AC0.L, @$AR1 - 05d2 009f 0800 lri $AC1.M, #0x0800 - 05d4 00c0 0344 lr $AR0, @0x0344 - 05d6 02bf 05fb call 0x05fb - 05d8 0080 0400 lri $AR0, #0x0400 - 05da 0083 0800 lri $AR3, #0x0800 - 05dc 0084 0000 lri $IX0, #0x0000 - 05de 00da 0345 lr $AX0.H, @0x0345 - 05e0 00df 0344 lr $AC1.M, @0x0344 - 05e2 8f00 set40 - 05e3 197b lrri $AX1.H, @$AR3 - 05e4 b800 mulx $AX0.H, $AX1.H - 05e5 197b lrri $AX1.H, @$AR3 - 05e6 007f 05eb bloop $AC1.M, 0x05eb - 05e8 199e lrrn $AC0.M, @$AR0 - 05e9 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 05ea 80b2 nx'sl : $AC0.M, $AX1.H - 05eb 0000 nop - 05ec 8e00 set16 - 05ed 0081 0346 lri $AR1, #0x0346 - 05ef 193e lrri $AC0.M, @$AR1 - 05f0 193c lrri $AC0.L, @$AR1 - 05f1 009f 0400 lri $AC1.M, #0x0400 - 05f3 00c0 0344 lr $AR0, @0x0344 - 05f5 02bf 0608 call 0x0608 - 05f7 029f 0041 jmp 0x0041 - 05f9 193e lrri $AC0.M, @$AR1 - 05fa 193c lrri $AC0.L, @$AR1 - 05fb 2fcd srs @DSPA, $AC1.M - 05fc 0f00 lris $AC1.M, #0x00 - 05fd 2fc9 srs @DSCR, $AC1.M - 05fe 2ece srs @DSMAH, $AC0.M - 05ff 2ccf srs @DSMAL, $AC0.L - 0600 1fe0 mrr $AC1.M, $AR0 - 0601 1501 lsl $ACC1, #1 - 0602 2fcb srs @DSBL, $AC1.M - 0603 02bf 060c call 0x060c - 0605 02df ret - 0606 193e lrri $AC0.M, @$AR1 - 0607 193c lrri $AC0.L, @$AR1 - 0608 2fcd srs @DSPA, $AC1.M - 0609 0f01 lris $AC1.M, #0x01 - 060a 029f 05fd jmp 0x05fd - 060c 26c9 lrs $AC0.M, @DSCR - 060d 02a0 0004 andf $AC0.M, #0x0004 - 060f 029c 060c jlnz 0x060c - 0611 02df ret - 0612 193e lrri $AC0.M, @$AR1 - 0613 193c lrri $AC0.L, @$AR1 - 0614 00ff ffcd sr @DSPA, $AC1.M - 0616 0f00 lris $AC1.M, #0x00 - 0617 00ff ffc9 sr @DSCR, $AC1.M - 0619 00fe ffce sr @DSMAH, $AC0.M - 061b 00fc ffcf sr @DSMAL, $AC0.L - 061d 1fe0 mrr $AC1.M, $AR0 - 061e 1501 lsl $ACC1, #1 - 061f 00ff ffcb sr @DSBL, $AC1.M - 0621 02df ret - 0622 00de ffc9 lr $AC0.M, @DSCR - 0624 02a0 0004 andf $AC0.M, #0x0004 - 0626 029c 0622 jlnz 0x0622 - 0628 02df ret - 0629 0080 0346 lri $AR0, #0x0346 - 062b 02bf 0065 call 0x0065 - 062d 02bf 0065 call 0x0065 - 062f 0081 0346 lri $AR1, #0x0346 - 0631 00df 0349 lr $AC1.M, @0x0349 - 0633 0340 ffff andi $AC1.M, #0xffff - 0635 00c0 0345 lr $AR0, @0x0345 - 0637 02bf 05f9 call 0x05f9 - 0639 029f 0041 jmp 0x0041 - 063b 0080 0346 lri $AR0, #0x0346 - 063d 02bf 0065 call 0x0065 - 063f 02bf 0065 call 0x0065 - 0641 0081 0346 lri $AR1, #0x0346 - 0643 00df 0349 lr $AC1.M, @0x0349 - 0645 0340 ffff andi $AC1.M, #0xffff - 0647 00c0 0345 lr $AR0, @0x0345 - 0649 02bf 0606 call 0x0606 - 064b 029f 0041 jmp 0x0041 - 064d 0092 00ff lri $CR, #0x00ff - 064f 009e ffff lri $AC0.M, #0xffff - 0651 2ed4 srs @ACSAH, $AC0.M - 0652 2ed5 srs @ACSAL, $AC0.M - 0653 2ed6 srs @ACEAH, $AC0.M - 0654 2ed7 srs @ACEAL, $AC0.M - 0655 02df ret - 0656 00ff ffd1 sr @SampleFormat, $AC1.M - 0658 0340 0003 andi $AC1.M, #0x0003 - 065a 7900 decm $AC1.M - 065b 02ca lsrn - 065c 00df 037d lr $AC1.M, @0x037d - 065e 00dd 037e lr $AC1.L, @0x037e - 0660 4c00 add $ACC0, $ACC1 - 0661 00fe ffd8 sr @ACCAH, $AC0.M - 0663 00fc ffd9 sr @ACCAL, $AC0.L - 0665 02df ret - 0666 1fc3 mrr $AC0.M, $AR3 - 0667 043f addis $ACC0, #0x3f - 0668 0240 fff0 andi $AC0.M, #0xfff0 - 066a 00fe ffcd sr @DSPA, $AC0.M - 066c 1c1a mrr $AR0, $AX0.H - 066d 00da 037f lr $AX0.H, @0x037f - 066f 4400 addr $ACC0, $AX0.H - 0670 1f40 mrr $AX0.H, $AR0 - 0671 1c1e mrr $AR0, $AC0.M - 0672 1fda mrr $AC0.M, $AX0.H - 0673 041f addis $ACC0, #0x1f - 0674 0240 fff0 andi $AC0.M, #0xfff0 - 0676 1401 lsl $ACC0, #1 - 0677 00fe ffcb sr @DSBL, $AC0.M - 0679 00de ffc9 lr $AC0.M, @DSCR - 067b 02a0 0004 andf $AC0.M, #0x0004 - 067d 029c 0679 jlnz 0x0679 - 067f 007a 0682 bloop $AX0.H, 0x0682 - 0681 191e lrri $AC0.M, @$AR0 - 0682 1b7e srri @$AR3, $AC0.M - 0683 02df ret - 0684 8900 clr $ACC1 - 0685 1ffc mrr $AC1.M, $AC0.L - 0686 0340 001f andi $AC1.M, #0x001f - 0688 00ff 037f sr @0x037f, $AC1.M - 068a 1ffc mrr $AC1.M, $AC0.L - 068b 0340 ffe0 andi $AC1.M, #0xffe0 - 068d 1f9f mrr $AC0.L, $AC1.M - 068e 00df 037d lr $AC1.M, @0x037d - 0690 00dd 037e lr $AC1.L, @0x037e - 0692 4c00 add $ACC0, $ACC1 - 0693 00fe ffce sr @DSMAH, $AC0.M - 0695 00fc ffcf sr @DSMAL, $AC0.L - 0697 0f00 lris $AC1.M, #0x00 - 0698 00ff ffc9 sr @DSCR, $AC1.M - 069a 02df ret - 069b 00df 037f lr $AC1.M, @0x037f - 069d 157f lsr $ACC1, #-1 - 069e 00ff 037f sr @0x037f, $AC1.M - 06a0 02df ret - 06a1 8600 tstaxh $AX0.H - 06a2 02d5 retz - 06a3 1f1a mrr $AX0.L, $AX0.H - 06a4 009e 0780 lri $AC0.M, #0x0780 - 06a6 00fe ffcd sr @DSPA, $AC0.M - 06a8 1fda mrr $AC0.M, $AX0.H - 06a9 043f addis $ACC0, #0x3f - 06aa 0240 ffe0 andi $AC0.M, #0xffe0 - 06ac 00fe ffcb sr @DSBL, $AC0.M - 06ae 00de ffc9 lr $AC0.M, @DSCR - 06b0 02a0 0004 andf $AC0.M, #0x0004 - 06b2 029c 06ae jlnz 0x06ae - 06b4 8100 clr $ACC0 - 06b5 00de 037f lr $AC0.M, @0x037f - 06b7 147f lsr $ACC0, #-1 - 06b8 0200 0780 addi $AC0.M, #0x0780 - 06ba 1c1e mrr $AR0, $AC0.M - 06bb 00de 037f lr $AC0.M, @0x037f - 06bd 02a0 0001 andf $AC0.M, #0x0001 - 06bf 029d 06c8 jlz 0x06c8 - 06c1 8100 clr $ACC0 - 06c2 191e lrri $AC0.M, @$AR0 - 06c3 1488 asl $ACC0, #8 - 06c4 1b7e srri @$AR3, $AC0.M - 06c5 1fda mrr $AC0.M, $AX0.H - 06c6 7800 decm $AC0.M - 06c7 1f5e mrr $AX0.H, $AC0.M - 06c8 8100 clr $ACC0 - 06c9 1fda mrr $AC0.M, $AX0.H - 06ca 147f lsr $ACC0, #-1 - 06cb 007e 06d4 bloop $AC0.M, 0x06d4 - 06cd 8100 clr $ACC0 - 06ce 181e lrr $AC0.M, @$AR0 - 06cf 0240 ff00 andi $AC0.M, #0xff00 - 06d1 1b7e srri @$AR3, $AC0.M - 06d2 191e lrri $AC0.M, @$AR0 - 06d3 1488 asl $ACC0, #8 - 06d4 1b7e srri @$AR3, $AC0.M - 06d5 1fda mrr $AC0.M, $AX0.H - 06d6 1f58 mrr $AX0.H, $AX0.L - 06d7 02a0 0001 andf $AC0.M, #0x0001 - 06d9 02dd retlz - 06da 8100 clr $ACC0 - 06db 181e lrr $AC0.M, @$AR0 - 06dc 0240 ff00 andi $AC0.M, #0xff00 - 06de 1b7e srri @$AR3, $AC0.M - 06df 02df ret - 06e0 1205 sbclr #0x05 - 06e1 8e00 set16 - 06e2 00f0 03fd sr @0x03fd, $AC0.H - 06e4 00fc 03ff sr @0x03ff, $AC0.L - 06e6 f400 lsr16 $ACC0 - 06e7 00fc 03fe sr @0x03fe, $AC0.L - 06e9 00fa 03fa sr @0x03fa, $AX0.H - 06eb 8100 clr $ACC0 - 06ec 00de fffe lr $AC0.M, @CMBH - 06ee 02c0 8000 andcf $AC0.M, #0x8000 - 06f0 029c 07e1 jlnz 0x07e1 - 06f2 00da ffff lr $AX0.H, @CMBL - 06f4 8600 tstaxh $AX0.H - 06f5 0294 07ba jnz 0x07ba - 06f7 00de fffe lr $AC0.M, @CMBH - 06f9 02c0 8000 andcf $AC0.M, #0x8000 - 06fb 029c 06f7 jlnz 0x06f7 - 06fd 0240 000f andi $AC0.M, #0x000f - 06ff 1f5e mrr $AX0.H, $AC0.M - 0700 7400 incm $AC0.M - 0701 0c00 lris $AC0.L, #0x00 - 0702 1404 lsl $ACC0, #4 - 0703 00fe 034e sr @0x034e, $AC0.M - 0705 1fda mrr $AC0.M, $AX0.H - 0706 1f40 mrr $AX0.H, $AR0 - 0707 0200 04fc addi $AC0.M, #0x04fc - 0709 1c1e mrr $AR0, $AC0.M - 070a 00de ffff lr $AC0.M, @CMBL - 070c 1a1e srr @$AR0, $AC0.M - 070d 1c1a mrr $AR0, $AX0.H - 070e 00de 03fe lr $AC0.M, @0x03fe - 0710 00dc 03ff lr $AC0.L, @0x03ff - 0712 00d0 03fd lr $AC0.H, @0x03fd - 0714 00da 03fa lr $AX0.H, @0x03fa - 0716 1305 sbset #0x05 - 0717 02ff rti - 0718 009a 0002 lri $AX0.H, #0x0002 - 071a 00fa 03a3 sr @0x03a3, $AX0.H - 071c 00e0 03f9 sr @0x03f9, $AR0 - 071e 02bf 07a4 call 0x07a4 - 0720 16fc dcd1 si @DMBH, #0xdcd1 - 0722 16fd 0002 si @DMBL, #0x0002 - 0724 16fb 0001 si @DIRQ, #0x0001 - 0726 0021 halt - 0727 073f cmpis $ACC1, #0x3f - 0728 0740 cmpis $ACC1, #0x40 - 0729 0780 cmpis $ACC1, #0x80 - 072a 0783 cmpis $ACC1, #0x83 - 072b 00e0 03f9 sr @0x03f9, $AR0 - 072d 009e 0005 lri $AC0.M, #0x0005 - 072f 02bf 0792 call 0x0792 - 0731 8e00 set16 - 0732 8100 clr $ACC0 - 0733 8900 clr $ACC1 - 0734 02bf 0786 call 0x0786 - 0736 27ff lrs $AC1.M, @CMBL - 0737 009e 0727 lri $AC0.M, #0x0727 - 0739 4c00 add $ACC0, $ACC1 - 073a 1c7e mrr $AR3, $AC0.M - 073b 0313 ilrr $AC1.M, @$AR3 - 073c 1c7f mrr $AR3, $AC1.M - 073d 176f jmpr $AR3 - 073e 0021 halt - 073f 0021 halt - 0740 009a 0002 lri $AX0.H, #0x0002 - 0742 00fa 03a3 sr @0x03a3, $AX0.H - 0744 8100 clr $ACC0 - 0745 8900 clr $ACC1 - 0746 02bf 0786 call 0x0786 - 0748 24ff lrs $AC0.L, @CMBL - 0749 02bf 078c call 0x078c - 074b 25ff lrs $AC1.L, @CMBL - 074c 02bf 078c call 0x078c - 074e 27ff lrs $AC1.M, @CMBL - 074f 2ece srs @DSMAH, $AC0.M - 0750 2ccf srs @DSMAL, $AC0.L - 0751 16c9 0001 si @DSCR, #0x0001 - 0753 2fcd srs @DSPA, $AC1.M - 0754 2dcb srs @DSBL, $AC1.L - 0755 8100 clr $ACC0 - 0756 8900 clr $ACC1 - 0757 02bf 0786 call 0x0786 - 0759 24ff lrs $AC0.L, @CMBL - 075a 1c9e mrr $IX0, $AC0.M - 075b 1cbc mrr $IX1, $AC0.L - 075c 02bf 078c call 0x078c - 075e 25ff lrs $AC1.L, @CMBL - 075f 02bf 078c call 0x078c - 0761 27ff lrs $AC1.M, @CMBL - 0762 1cdf mrr $IX2, $AC1.M - 0763 1cfd mrr $IX3, $AC1.L - 0764 8100 clr $ACC0 - 0765 02bf 0786 call 0x0786 - 0767 26ff lrs $AC0.M, @CMBL - 0768 1c1e mrr $AR0, $AC0.M - 0769 8900 clr $ACC1 - 076a 02bf 078c call 0x078c - 076c 20ff lrs $AX0.L, @CMBL - 076d 1f5f mrr $AX0.H, $AC1.M - 076e 02bf 0786 call 0x0786 - 0770 21ff lrs $AX1.L, @CMBL - 0771 02bf 0786 call 0x0786 - 0773 23ff lrs $AX1.H, @CMBL - 0774 26c9 lrs $AC0.M, @DSCR - 0775 02a0 0004 andf $AC0.M, #0x0004 - 0777 029c 0774 jlnz 0x0774 - 0779 1206 sbclr #0x06 - 077a 1203 sbclr #0x03 - 077b 1204 sbclr #0x04 - 077c 1205 sbclr #0x05 - 077d 029f 80b5 jmp 0x80b5 - 077f 0021 halt - 0780 029f 8000 jmp 0x8000 - 0782 0021 halt - 0783 00c0 03f9 lr $AR0, @0x03f9 - 0785 170f jmpr $AR0 - 0786 26fe lrs $AC0.M, @CMBH - 0787 02c0 8000 andcf $AC0.M, #0x8000 - 0789 029c 0786 jlnz 0x0786 - 078b 02df ret - 078c 27fe lrs $AC1.M, @CMBH - 078d 03c0 8000 andcf $AC1.M, #0x8000 - 078f 029c 078c jlnz 0x078c - 0791 02df ret - 0792 02bf 07aa call 0x07aa - 0794 16fc dcd1 si @DMBH, #0xdcd1 - 0796 2efd srs @DMBL, $AC0.M - 0797 16fb 0001 si @DIRQ, #0x0001 - 0799 02bf 07aa call 0x07aa - 079b 02df ret - 079c 02bf 07aa call 0x07aa - 079e 16fc f355 si @DMBH, #0xf355 - 07a0 2efd srs @DMBL, $AC0.M - 07a1 02bf 07aa call 0x07aa - 07a3 02df ret - 07a4 26fc lrs $AC0.M, @DMBH - 07a5 02c0 8000 andcf $AC0.M, #0x8000 - 07a7 029d 07a4 jlz 0x07a4 - 07a9 02df ret - 07aa 27fc lrs $AC1.M, @DMBH - 07ab 03c0 8000 andcf $AC1.M, #0x8000 - 07ad 029d 07aa jlz 0x07aa - 07af 02df ret - 07b0 009a 0280 lri $AX0.H, #0x0280 - 07b2 00fa 0350 sr @0x0350, $AX0.H - 07b4 00fa 0351 sr @0x0351, $AX0.H - 07b6 0a00 lris $AX0.H, #0x00 - 07b7 00fa 0352 sr @0x0352, $AX0.H - 07b9 02df ret - 07ba 00e0 03fb sr @0x03fb, $AR0 - 07bc 00e8 03fc sr @0x03fc, $WR0 - 07be 00c0 0350 lr $AR0, @0x0350 - 07c0 0088 002f lri $WR0, #0x002f - 07c2 1b1a srri @$AR0, $AX0.H - 07c3 00de fffe lr $AC0.M, @CMBH - 07c5 02c0 8000 andcf $AC0.M, #0x8000 - 07c7 029c 07c3 jlnz 0x07c3 - 07c9 00dc ffff lr $AC0.L, @CMBL - 07cb 1b1e srri @$AR0, $AC0.M - 07cc 1b1c srri @$AR0, $AC0.L - 07cd 1fda mrr $AC0.M, $AX0.H - 07ce 7800 decm $AC0.M - 07cf 1f5e mrr $AX0.H, $AC0.M - 07d0 8600 tstaxh $AX0.H - 07d1 0294 07c3 jnz 0x07c3 - 07d3 8100 clr $ACC0 - 07d4 00de 0352 lr $AC0.M, @0x0352 - 07d6 7400 incm $AC0.M - 07d7 00fe 0352 sr @0x0352, $AC0.M - 07d9 00e0 0350 sr @0x0350, $AR0 - 07db 00c0 03fb lr $AR0, @0x03fb - 07dd 00c8 03fc lr $WR0, @0x03fc - 07df 029f 070e jmp 0x070e - 07e1 00e0 03fb sr @0x03fb, $AR0 - 07e3 00e8 03fc sr @0x03fc, $WR0 - 07e5 00c0 0350 lr $AR0, @0x0350 - 07e7 0088 002f lri $WR0, #0x002f - 07e9 0a00 lris $AX0.H, #0x00 - 07ea 1b1a srri @$AR0, $AX0.H - 07eb 029f 07d3 jmp 0x07d3 - 07ed 00c0 0351 lr $AR0, @0x0351 - 07ef 0088 002f lri $WR0, #0x002f - 07f1 00da 0352 lr $AX0.H, @0x0352 - 07f3 8600 tstaxh $AX0.H - 07f4 0295 0815 jz 0x0815 - 07f6 1205 sbclr #0x05 - 07f7 00da 0352 lr $AX0.H, @0x0352 - 07f9 1fda mrr $AC0.M, $AX0.H - 07fa 7800 decm $AC0.M - 07fb 00fe 0352 sr @0x0352, $AC0.M - 07fd 1305 sbset #0x05 - 07fe 0081 0356 lri $AR1, #0x0356 - 0800 191e lrri $AC0.M, @$AR0 - 0801 02c0 8000 andcf $AC0.M, #0x8000 - 0803 029d 0819 jlz 0x0819 - 0805 1f5e mrr $AX0.H, $AC0.M - 0806 8600 tstaxh $AX0.H - 0807 0295 081d jz 0x081d - 0809 007a 080e bloop $AX0.H, 0x080e - 080b 191e lrri $AC0.M, @$AR0 - 080c 1b3e srri @$AR1, $AC0.M - 080d 191e lrri $AC0.M, @$AR0 - 080e 1b3e srri @$AR1, $AC0.M - 080f 00e0 0351 sr @0x0351, $AR0 - 0811 0088 ffff lri $WR0, #0xffff - 0813 029f 002d jmp 0x002d - 0815 0088 ffff lri $WR0, #0xffff - 0817 029f 002b jmp 0x002b - 0819 00e0 0351 sr @0x0351, $AR0 - 081b 029f 07f1 jmp 0x07f1 - 081d 0080 07ed lri $AR0, #0x07ed - 081f 029f 0718 jmp 0x0718 - 0821 8100 clr $ACC0 - 0822 0e10 lris $AC0.M, #0x10 - 0823 2232 lrs $AX0.H, @0x0032 - 0824 8600 tstaxh $AX0.H - 0825 02d5 retz - 0826 5400 subr $ACC0, $AX0.H - 0827 0200 0458 addi $AC0.M, #0x0458 - 0829 1c1e mrr $AR0, $AC0.M - 082a 1fda mrr $AC0.M, $AX0.H - 082b 04fe addis $ACC0, #0xfe - 082c 1f1e mrr $AX0.L, $AC0.M - 082d 191e lrri $AC0.M, @$AR0 - 082e 0291 0834 jl 0x0834 - 0830 191a lrri $AX0.H, @$AR0 - 0831 0058 loop $AX0.L - 0832 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0833 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 0834 1b7e srri @$AR3, $AC0.M - 0835 02df ret - 0836 02bf 0821 call 0x0821 - 0838 8100 clr $ACC0 - 0839 2632 lrs $AC0.M, @0x0032 - 083a 5c00 sub $ACC0, $ACC1 - 083b 2e32 srs @0x0032, $AC0.M - 083c 0092 00ff lri $CR, #0x00ff - 083e 02df ret - 083f 00de 04fb lr $AC0.M, @0x04fb - 0841 7400 incm $AC0.M - 0842 00fe 04fb sr @0x04fb, $AC0.M - 0844 8100 clr $ACC0 - 0845 2e32 srs @0x0032, $AC0.M - 0846 2e66 srs @0x0066, $AC0.M - 0847 2e67 srs @0x0067, $AC0.M - 0848 268a lrs $AC0.M, @0xff8a - 0849 248b lrs $AC0.L, @0xff8b - 084a 2e3a srs @0x003a, $AC0.M - 084b 2c3b srs @0x003b, $AC0.L - 084c 268c lrs $AC0.M, @0xff8c - 084d 248d lrs $AC0.L, @0xff8d - 084e 2e38 srs @0x0038, $AC0.M - 084f 2c39 srs @0x0039, $AC0.L - 0850 02df ret - 0851 8100 clr $ACC0 - 0852 2689 lrs $AC0.M, @0xff89 - 0853 0240 000f andi $AC0.M, #0x000f - 0855 1f5e mrr $AX0.H, $AC0.M - 0856 8100 clr $ACC0 - 0857 0e10 lris $AC0.M, #0x10 - 0858 5400 subr $ACC0, $AX0.H - 0859 2e32 srs @0x0032, $AC0.M - 085a 268a lrs $AC0.M, @0xff8a - 085b 248b lrs $AC0.L, @0xff8b - 085c 2288 lrs $AX0.H, @0xff88 - 085d 2089 lrs $AX0.L, @0xff89 - 085e 5800 subax $ACC0, $AX0.L - 085f 0a00 lris $AX0.H, #0x00 - 0860 2032 lrs $AX0.L, @0x0032 - 0861 5800 subax $ACC0, $AX0.L - 0862 2e3a srs @0x003a, $AC0.M - 0863 2c3b srs @0x003b, $AC0.L - 0864 02df ret - 0865 0092 0004 lri $CR, #0x0004 - 0867 8100 clr $ACC0 - 0868 2604 lrs $AC0.M, @0x0004 - 0869 b100 tst $ACC0 - 086a 02b4 083f callnz 0x083f - 086c 8100 clr $ACC0 - 086d 2601 lrs $AC0.M, @0x0001 - 086e b100 tst $ACC0 - 086f 0294 090d jnz 0x090d - 0871 2232 lrs $AX0.H, @0x0032 - 0872 c900 cmpar $ACC0, $AX1.H - 0873 0293 0836 jle 0x0836 - 0875 5500 subr $ACC1, $AX0.H - 0876 02bf 0821 call 0x0821 - 0878 223a lrs $AX0.H, @0x003a - 0879 8600 tstaxh $AX0.H - 087a 0294 0881 jnz 0x0881 - 087c 8100 clr $ACC0 - 087d 263b lrs $AC0.M, @0x003b - 087e 8200 cmp - 087f 0291 08d3 jl 0x08d3 - 0881 8100 clr $ACC0 - 0882 1fdf mrr $AC0.M, $AC1.M - 0883 040f addis $ACC0, #0x0f - 0884 147c lsr $ACC0, #-4 - 0885 1f7e mrr $AX1.H, $AC0.M - 0886 0c00 lris $AC0.L, #0x00 - 0887 1404 lsl $ACC0, #4 - 0888 1f1e mrr $AX0.L, $AC0.M - 0889 0a00 lris $AX0.H, #0x00 - 088a 8100 clr $ACC0 - 088b 263a lrs $AC0.M, @0x003a - 088c 243b lrs $AC0.L, @0x003b - 088d 5800 subax $ACC0, $AX0.L - 088e 0290 0899 jge 0x0899 - 0890 8100 clr $ACC0 - 0891 263b lrs $AC0.M, @0x003b - 0892 5c00 sub $ACC0, $ACC1 - 0893 2e32 srs @0x0032, $AC0.M - 0894 8100 clr $ACC0 - 0895 2e3a srs @0x003a, $AC0.M - 0896 2e3b srs @0x003b, $AC0.M - 0897 029f 089f jmp 0x089f - 0899 2e3a srs @0x003a, $AC0.M - 089a 2c3b srs @0x003b, $AC0.L - 089b 0c00 lris $AC0.L, #0x00 - 089c 1fd8 mrr $AC0.M, $AX0.L - 089d 5c00 sub $ACC0, $ACC1 - 089e 2e32 srs @0x0032, $AC0.M - 089f 8100 clr $ACC0 - 08a0 1fdb mrr $AC0.M, $AX1.H - 08a1 02bf 0913 call 0x0913 - 08a3 2232 lrs $AX0.H, @0x0032 - 08a4 8600 tstaxh $AX0.H - 08a5 0295 08d0 jz 0x08d0 - 08a7 0a10 lris $AX0.H, #0x10 - 08a8 8100 clr $ACC0 - 08a9 1fc3 mrr $AC0.M, $AR3 - 08aa 5400 subr $ACC0, $AX0.H - 08ab 1c7e mrr $AR3, $AC0.M - 08ac 0080 0458 lri $AR0, #0x0458 - 08ae 197e lrri $AC0.M, @$AR3 - 08af 197a lrri $AX0.H, @$AR3 - 08b0 100e loopi #0x0e - 08b1 64a2 movr'sl $ACC0, $AX0.H : $AC0.M, $AX0.H - 08b2 1b1e srri @$AR0, $AC0.M - 08b3 1b1a srri @$AR0, $AX0.H - 08b4 8100 clr $ACC0 - 08b5 263a lrs $AC0.M, @0x003a - 08b6 243b lrs $AC0.L, @0x003b - 08b7 b100 tst $ACC0 - 08b8 0294 08d0 jnz 0x08d0 - 08ba 2232 lrs $AX0.H, @0x0032 - 08bb 8600 tstaxh $AX0.H - 08bc 0295 08d0 jz 0x08d0 - 08be 0080 0467 lri $AR0, #0x0467 - 08c0 8100 clr $ACC0 - 08c1 268b lrs $AC0.M, @0xff8b - 08c2 b100 tst $ACC0 - 08c3 0295 08d0 jz 0x08d0 - 08c5 0200 000f addi $AC0.M, #0x000f - 08c7 0240 000f andi $AC0.M, #0x000f - 08c9 0200 0458 addi $AC0.M, #0x0458 - 08cb 1c7e mrr $AR3, $AC0.M - 08cc 007a 08cf bloop $AX0.H, 0x08cf - 08ce 18fe lrrd $AC0.M, @$AR3 - 08cf 1a9e srrd @$AR0, $AC0.M - 08d0 0092 00ff lri $CR, #0x00ff - 08d2 02df ret - 08d3 b100 tst $ACC0 - 08d4 0295 08e3 jz 0x08e3 - 08d6 5d00 sub $ACC1, $ACC0 - 08d7 040f addis $ACC0, #0x0f - 08d8 147c lsr $ACC0, #-4 - 08d9 0c00 lris $AC0.L, #0x00 - 08da 00e3 0363 sr @0x0363, $AR3 - 08dc 02bf 0913 call 0x0913 - 08de 00de 0363 lr $AC0.M, @0x0363 - 08e0 223b lrs $AX0.H, @0x003b - 08e1 4400 addr $ACC0, $AX0.H - 08e2 1c7e mrr $AR3, $AC0.M - 08e3 8100 clr $ACC0 - 08e4 2681 lrs $AC0.M, @0xff81 - 08e5 b100 tst $ACC0 - 08e6 0295 090b jz 0x090b - 08e8 2380 lrs $AX1.H, @0xff80 - 08e9 2688 lrs $AC0.M, @0xff88 - 08ea 2489 lrs $AC0.L, @0xff89 - 08eb 1408 lsl $ACC0, #8 - 08ec 14f4 asr $ACC0, #-12 - 08ed 2380 lrs $AX1.H, @0xff80 - 08ee 8d00 set15 - 08ef c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - 08f0 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 08f1 8c00 clr15 - 08f2 f000 lsl16 $ACC0 - 08f3 4e00 addp $ACC0 - 08f4 238c lrs $AX1.H, @0xff8c - 08f5 218d lrs $AX1.L, @0xff8d - 08f6 4a00 addax $ACC0, $AX1.L - 08f7 2e38 srs @0x0038, $AC0.M - 08f8 2c39 srs @0x0039, $AC0.L - 08f9 2682 lrs $AC0.M, @0xff82 - 08fa 2e67 srs @0x0067, $AC0.M - 08fb 2683 lrs $AC0.M, @0xff83 - 08fc 2e66 srs @0x0066, $AC0.M - 08fd 00e3 0363 sr @0x0363, $AR3 - 08ff 0083 0458 lri $AR3, #0x0458 - 0901 8100 clr $ACC0 - 0902 0e01 lris $AC0.M, #0x01 - 0903 02bf 0913 call 0x0913 - 0905 00c3 0363 lr $AR3, @0x0363 - 0907 02bf 0851 call 0x0851 - 0909 029f 0871 jmp 0x0871 - 090b 0e01 lris $AC0.M, #0x01 - 090c 2e01 srs @0x0001, $AC0.M - 090d 8100 clr $ACC0 - 090e 005f loop $AC1.M - 090f 1b7e srri @$AR3, $AC0.M - 0910 0092 00ff lri $CR, #0x00ff - 0912 02df ret - 0913 00ff 0360 sr @0x0360, $AC1.M - 0915 00fe 0361 sr @0x0361, $AC0.M - 0917 2638 lrs $AC0.M, @0x0038 - 0918 2439 lrs $AC0.L, @0x0039 - 0919 0f05 lris $AC1.M, #0x05 - 091a 02bf 0656 call 0x0656 - 091c 2638 lrs $AC0.M, @0x0038 - 091d 2439 lrs $AC0.L, @0x0039 - 091e 8900 clr $ACC1 - 091f 00df 0361 lr $AC1.M, @0x0361 - 0921 2280 lrs $AX0.H, @0xff80 - 0922 d000 mulc $AC1.M, $AX0.H - 0923 6f00 movp $ACC1 - 0924 4c00 add $ACC0, $ACC1 - 0925 2e38 srs @0x0038, $AC0.M - 0926 2c39 srs @0x0039, $AC0.L - 0927 8100 clr $ACC0 - 0928 00de 0361 lr $AC0.M, @0x0361 - 092a 007e 0991 bloop $AC0.M, 0x0991 - 092c 0080 ffd3 lri $AR0, #0xffd3 - 092e 0084 0000 lri $IX0, #0x0000 - 0930 199e lrrn $AC0.M, @$AR0 - 0931 8900 clr $ACC1 - 0932 1ffe mrr $AC1.M, $AC0.M - 0933 1401 lsl $ACC0, #1 - 0934 0240 001e andi $AC0.M, #0x001e - 0936 0200 0300 addi $AC0.M, #0x0300 - 0938 1c3e mrr $AR1, $AC0.M - 0939 157c lsr $ACC1, #-4 - 093a 0340 000f andi $AC1.M, #0x000f - 093c 0a11 lris $AX0.H, #0x11 - 093d 5500 subr $ACC1, $AX0.H - 093e 8100 clr $ACC0 - 093f 2680 lrs $AC0.M, @0xff80 - 0940 0605 cmpis $ACC0, #0x05 - 0941 0295 095a jz 0x095a - 0943 009a 00f0 lri $AX0.H, #0x00f0 - 0945 0b0f lris $AX1.H, #0x0f - 0946 0082 0364 lri $AR2, #0x0364 - 0948 1998 lrrn $AX0.L, @$AR0 - 0949 6000 movr $ACC0, $AX0.L - 094a 1107 0951 bloopi #0x07, 0x0951 - 094c 3400 andr $AC0.M, $AX0.H - 094d 1408 lsl $ACC0, #8 - 094e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 094f 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 0950 140c lsl $ACC0, #12 - 0951 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0952 3400 andr $AC0.M, $AX0.H - 0953 1408 lsl $ACC0, #8 - 0954 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0955 3600 andr $AC0.M, $AX1.H - 0956 140c lsl $ACC0, #12 - 0957 1b5e srri @$AR2, $AC0.M - 0958 029f 097a jmp 0x097a - 095a 009a c000 lri $AX0.H, #0xc000 - 095c 0082 0364 lri $AR2, #0x0364 - 095e 1998 lrrn $AX0.L, @$AR0 - 095f 6000 movr $ACC0, $AX0.L - 0960 1103 096d bloopi #0x03, 0x096d - 0962 1408 lsl $ACC0, #8 - 0963 3400 andr $AC0.M, $AX0.H - 0964 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0965 140a lsl $ACC0, #10 - 0966 3400 andr $AC0.M, $AX0.H - 0967 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0968 140c lsl $ACC0, #12 - 0969 3400 andr $AC0.M, $AX0.H - 096a 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 096b 140e lsl $ACC0, #14 - 096c 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0 - 096d 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 096e 1408 lsl $ACC0, #8 - 096f 3400 andr $AC0.M, $AX0.H - 0970 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0971 140a lsl $ACC0, #10 - 0972 3400 andr $AC0.M, $AX0.H - 0973 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0974 140c lsl $ACC0, #12 - 0975 3400 andr $AC0.M, $AX0.H - 0976 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0977 140e lsl $ACC0, #14 - 0978 3400 andr $AC0.M, $AX0.H - 0979 1b5e srri @$AR2, $AC0.M - 097a 8f00 set40 - 097b 1f7f mrr $AX1.H, $AC1.M - 097c 2066 lrs $AX0.L, @0x0066 - 097d 2767 lrs $AC1.M, @0x0067 - 097e 193a lrri $AX0.H, @$AR1 - 097f 1939 lrri $AX1.L, @$AR1 - 0980 0080 0364 lri $AR0, #0x0364 - 0982 a000 mulx $AX0.L, $AX1.L - 0983 ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - 0984 1108 098d bloopi #0x08, 0x098d - 0986 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0987 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0988 1485 asl $ACC0, #5 - 0989 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 098a 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 098b a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 098c 1585 asl $ACC1, #5 - 098d ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - 098e 2f67 srs @0x0067, $AC1.M - 098f 8e00 set16 - 0990 1ff8 mrr $AC1.M, $AX0.L - 0991 2f66 srs @0x0066, $AC1.M - 0992 8900 clr $ACC1 - 0993 00df 0360 lr $AC1.M, @0x0360 - 0995 02df ret - 0996 b100 tst $ACC0 - 0997 02d5 retz - 0998 04fe addis $ACC0, #0xfe - 0999 1f1e mrr $AX0.L, $AC0.M - 099a 191e lrri $AC0.M, @$AR0 - 099b 0291 09a1 jl 0x09a1 - 099d 191a lrri $AX0.H, @$AR0 - 099e 0058 loop $AX0.L - 099f 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 09a0 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 09a1 1b7e srri @$AR3, $AC0.M - 09a2 02df ret - 09a3 8100 clr $ACC0 - 09a4 1f5e mrr $AX0.H, $AC0.M - 09a5 00d8 0402 lr $AX0.L, @0x0402 - 09a7 00dc 0430 lr $AC0.L, @0x0430 - 09a9 0080 0520 lri $AR0, #0x0520 - 09ab 00df 0480 lr $AC1.M, @0x0480 - 09ad 1501 lsl $ACC1, #1 - 09ae 0340 007e andi $AC1.M, #0x007e - 09b0 0300 09b8 addi $AC1.M, #0x09b8 - 09b2 1c5f mrr $AR2, $AC1.M - 09b3 175f callr $AR2 - 09b4 00fc 0430 sr @0x0430, $AC0.L - 09b6 029f 0338 jmp 0x0338 - 09b8 029f 09d9 jmp 0x09d9 - 09ba 029f 0a14 jmp 0x0a14 - 09bc 029f 09fc jmp 0x09fc - 09be 029f 09e9 jmp 0x09e9 - 09c0 029f 0a22 jmp 0x0a22 - 09c2 029f 09d8 jmp 0x09d8 - 09c4 029f 0a40 jmp 0x0a40 - 09c6 029f 0a43 jmp 0x0a43 - 09c8 029f 09d8 jmp 0x09d8 - 09ca 029f 09d8 jmp 0x09d8 - 09cc 029f 0a61 jmp 0x0a61 - 09ce 029f 0a1a jmp 0x0a1a - 09d0 029f 0a1e jmp 0x0a1e - 09d2 029f 09d8 jmp 0x09d8 - 09d4 029f 09d8 jmp 0x09d8 - 09d6 029f 09d8 jmp 0x09d8 - 09d8 02df ret - 09d9 1401 lsl $ACC0, #1 - 09da 009b c000 lri $AX1.H, #0xc000 - 09dc 0099 4000 lri $AX1.L, #0x4000 - 09de 1150 09e6 bloopi #0x50, 0x09e6 - 09e0 02c0 0001 andcf $AC0.M, #0x0001 - 09e2 027c iflnz - 09e3 1b1b srri @$AR0, $AX1.H - 09e4 027d iflz - 09e5 1b19 srri @$AR0, $AX1.L - 09e6 4800 addax $ACC0, $AX0.L - 09e7 147f lsr $ACC0, #-1 - 09e8 02df ret - 09e9 1402 lsl $ACC0, #2 - 09ea 8900 clr $ACC1 - 09eb 1fb8 mrr $AC1.L, $AX0.L - 09ec 1501 lsl $ACC1, #1 - 09ed 009b c000 lri $AX1.H, #0xc000 - 09ef 0099 4000 lri $AX1.L, #0x4000 - 09f1 1150 09f9 bloopi #0x50, 0x09f9 - 09f3 02c0 0003 andcf $AC0.M, #0x0003 - 09f5 027c iflnz - 09f6 1b1b srri @$AR0, $AX1.H - 09f7 027d iflz - 09f8 1b19 srri @$AR0, $AX1.L - 09f9 4c00 add $ACC0, $ACC1 - 09fa 147e lsr $ACC0, #-2 - 09fb 02df ret - 09fc 1401 lsl $ACC0, #1 - 09fd 0081 0ca0 lri $AR1, #0x0ca0 - 09ff 009b c000 lri $AX1.H, #0xc000 - 0a01 0099 4000 lri $AX1.L, #0x4000 - 0a03 8900 clr $ACC1 - 0a04 0082 0000 lri $AR2, #0x0000 - 0a06 1150 0a11 bloopi #0x50, 0x0a11 - 0a08 02c0 0001 andcf $AC0.M, #0x0001 - 0a0a 027c iflnz - 0a0b 1b1b srri @$AR0, $AX1.H - 0a0c 027d iflz - 0a0d 1b19 srri @$AR0, $AX1.L - 0a0e 183d lrr $AC1.L, @$AR1 - 0a0f 4900 addax $ACC1, $AX0.L - 0a10 1fe2 mrr $AC1.M, $AR2 - 0a11 4c39 add's $ACC0, $ACC1 : @$AR1, $AC1.M - 0a12 147f lsr $ACC0, #-1 - 0a13 02df ret - 0a14 8900 clr $ACC1 - 0a15 1fb8 mrr $AC1.L, $AX0.L - 0a16 157f lsr $ACC1, #-1 - 0a17 1050 loopi #0x50 - 0a18 4c20 add's $ACC0, $ACC1 : @$AR0, $AC0.L - 0a19 02df ret - 0a1a 0082 0180 lri $AR2, #0x0180 - 0a1c 029f 0a24 jmp 0x0a24 - 0a1e 0082 01c0 lri $AR2, #0x01c0 - 0a20 029f 0a24 jmp 0x0a24 - 0a22 0082 0140 lri $AR2, #0x0140 - 0a24 008a 003f lri $WR2, #0x003f - 0a26 0086 0000 lri $IX2, #0x0000 - 0a28 1406 lsl $ACC0, #6 - 0a29 8900 clr $ACC1 - 0a2a 1fb8 mrr $AC1.L, $AX0.L - 0a2b 1505 lsl $ACC1, #5 - 0a2c 009b 003f lri $AX1.H, #0x003f - 0a2e 009a 0000 lri $AX0.H, #0x0000 - 0a30 3600 andr $AC0.M, $AX1.H - 0a31 1cde mrr $IX2, $AC0.M - 0a32 001a addarn $AR2, $IX2 - 0a33 3400 andr $AC0.M, $AX0.H - 0a34 1150 0a3a bloopi #0x50, 0x0a3a - 0a36 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a37 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a38 1cde mrr $IX2, $AC0.M - 0a39 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a3a 1b19 srri @$AR0, $AX1.L - 0a3b 1fc2 mrr $AC0.M, $AR2 - 0a3c 147a lsr $ACC0, #-6 - 0a3d 008a ffff lri $WR2, #0xffff - 0a3f 02df ret - 0a40 1050 loopi #0x50 - 0a41 1b18 srri @$AR0, $AX0.L - 0a42 02df ret - 0a43 0082 0100 lri $AR2, #0x0100 - 0a45 008a 003f lri $WR2, #0x003f - 0a47 0086 0000 lri $IX2, #0x0000 - 0a49 1406 lsl $ACC0, #6 - 0a4a 8900 clr $ACC1 - 0a4b 1fb8 mrr $AC1.L, $AX0.L - 0a4c 1505 lsl $ACC1, #5 - 0a4d 009b 003f lri $AX1.H, #0x003f - 0a4f 009a 0000 lri $AX0.H, #0x0000 - 0a51 3600 andr $AC0.M, $AX1.H - 0a52 1cde mrr $IX2, $AC0.M - 0a53 001a addarn $AR2, $IX2 - 0a54 3400 andr $AC0.M, $AX0.H - 0a55 1150 0a5b bloopi #0x50, 0x0a5b - 0a57 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a58 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a59 1cde mrr $IX2, $AC0.M - 0a5a 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a5b 1b19 srri @$AR0, $AX1.L - 0a5c 1fc2 mrr $AC0.M, $AR2 - 0a5d 147a lsr $ACC0, #-6 - 0a5e 008a ffff lri $WR2, #0xffff - 0a60 02df ret - 0a61 0082 0100 lri $AR2, #0x0100 - 0a63 008a 003f lri $WR2, #0x003f - 0a65 0086 0000 lri $IX2, #0x0000 - 0a67 0081 0ca0 lri $AR1, #0x0ca0 - 0a69 1406 lsl $ACC0, #6 - 0a6a 8900 clr $ACC1 - 0a6b 1fb8 mrr $AC1.L, $AX0.L - 0a6c 1505 lsl $ACC1, #5 - 0a6d 009b 003f lri $AX1.H, #0x003f - 0a6f 009a 0000 lri $AX0.H, #0x0000 - 0a71 3600 andr $AC0.M, $AX1.H - 0a72 1cde mrr $IX2, $AC0.M - 0a73 001a addarn $AR2, $IX2 - 0a74 3400 andr $AC0.M, $AX0.H - 0a75 1150 0a80 bloopi #0x50, 0x0a80 - 0a77 1939 lrri $AX1.L, @$AR1 - 0a78 a000 mulx $AX0.L, $AX1.L - 0a79 140a lsl $ACC0, #10 - 0a7a 4e00 addp $ACC0 - 0a7b 1476 lsr $ACC0, #-10 - 0a7c 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a7d 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a7e 1cde mrr $IX2, $AC0.M - 0a7f 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a80 1b19 srri @$AR0, $AX1.L - 0a81 1fc2 mrr $AC0.M, $AR2 - 0a82 147a lsr $ACC0, #-6 - 0a83 008a ffff lri $WR2, #0xffff - 0a85 02df ret - 0a86 0080 01be lri $AR0, #0x01be - 0a88 1918 lrri $AX0.L, @$AR0 - 0a89 191a lrri $AX0.H, @$AR0 - 0a8a 0080 0180 lri $AR0, #0x0180 - 0a8c 0083 0180 lri $AR3, #0x0180 - 0a8e 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0a8f 1ffe mrr $AC1.M, $AC0.M - 0a90 1120 0a97 bloopi #0x20, 0x0a97 - 0a92 7c00 neg $ACC0 - 0a93 d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0a94 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0a95 c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 0a96 1501 lsl $ACC1, #1 - 0a97 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - 0a98 0080 01fe lri $AR0, #0x01fe - 0a9a 191a lrri $AX0.H, @$AR0 - 0a9b 1918 lrri $AX0.L, @$AR0 - 0a9c 0080 01c0 lri $AR0, #0x01c0 - 0a9e 0083 01c0 lri $AR3, #0x01c0 - 0aa0 1ff8 mrr $AC1.M, $AX0.L - 0aa1 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0aa2 f800 addpaxz $ACC0, $AX0.H - 0aa3 0240 01ff andi $AC0.M, #0x01ff - 0aa5 0260 2000 ori $AC0.M, #0x2000 - 0aa7 02bf 0aaa call 0x0aaa - 0aa9 02df ret - 0aaa b900 tst $ACC1 - 0aab 0272 ifg - 0aac 7c00 neg $ACC0 - 0aad 1f7e mrr $AX1.H, $AC0.M - 0aae 4700 addr $ACC1, $AX1.H - 0aaf 1110 0ab4 bloopi #0x10, 0x0ab4 - 0ab1 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0ab2 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0ab3 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0ab4 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0ab5 02df ret - 0ab6 02bf 0b23 call 0x0b23 - 0ab8 2201 lrs $AX0.H, @0x0001 - 0ab9 8600 tstaxh $AX0.H - 0aba 0294 0acb jnz 0x0acb - 0abc 2204 lrs $AX0.H, @0x0004 - 0abd 8600 tstaxh $AX0.H - 0abe 02b4 0b12 callnz 0x0b12 - 0ac0 8100 clr $ACC0 - 0ac1 2605 lrs $AC0.M, @0x0005 - 0ac2 b100 tst $ACC0 - 0ac3 0295 0ad8 jz 0x0ad8 - 0ac5 8100 clr $ACC0 - 0ac6 2e05 srs @0x0005, $AC0.M - 0ac7 2281 lrs $AX0.H, @0xff81 - 0ac8 8600 tstaxh $AX0.H - 0ac9 0294 0ad2 jnz 0x0ad2 - 0acb 8100 clr $ACC0 - 0acc 005f loop $AC1.M - 0acd 1b7e srri @$AR3, $AC0.M - 0ace 7400 incm $AC0.M - 0acf 2e01 srs @0x0001, $AC0.M - 0ad0 029f 0b0b jmp 0x0b0b - 0ad2 2688 lrs $AC0.M, @0xff88 - 0ad3 2489 lrs $AC0.L, @0xff89 - 0ad4 2e34 srs @0x0034, $AC0.M - 0ad5 2c35 srs @0x0035, $AC0.L - 0ad6 02bf 0b12 call 0x0b12 - 0ad8 00ff 0360 sr @0x0360, $AC1.M - 0ada 2638 lrs $AC0.M, @0x0038 - 0adb 2439 lrs $AC0.L, @0x0039 - 0adc 02bf 0684 call 0x0684 - 0ade 00df 0360 lr $AC1.M, @0x0360 - 0ae0 8100 clr $ACC0 - 0ae1 263a lrs $AC0.M, @0x003a - 0ae2 b100 tst $ACC0 - 0ae3 0294 0af2 jnz 0x0af2 - 0ae5 263b lrs $AC0.M, @0x003b - 0ae6 5c00 sub $ACC0, $ACC1 - 0ae7 0290 0af2 jge 0x0af2 - 0ae9 223b lrs $AX0.H, @0x003b - 0aea 02bf 06a1 call 0x06a1 - 0aec 5500 subr $ACC1, $AX0.H - 0aed 0a01 lris $AX0.H, #0x01 - 0aee 00fa 0405 sr @0x0405, $AX0.H - 0af0 029f 0ac5 jmp 0x0ac5 - 0af2 1f5f mrr $AX0.H, $AC1.M - 0af3 02bf 06a1 call 0x06a1 - 0af5 00fa 0362 sr @0x0362, $AX0.H - 0af7 8100 clr $ACC0 - 0af8 263a lrs $AC0.M, @0x003a - 0af9 243b lrs $AC0.L, @0x003b - 0afa 1570 lsr $ACC1, #-16 - 0afb 0a01 lris $AX0.H, #0x01 - 0afc 0081 0405 lri $AR1, #0x0405 - 0afe 5c00 sub $ACC0, $ACC1 - 0aff b100 tst $ACC0 - 0b00 0275 ifz - 0b01 1a3a srr @$AR1, $AX0.H - 0b02 2e3a srs @0x003a, $AC0.M - 0b03 2c3b srs @0x003b, $AC0.L - 0b04 2638 lrs $AC0.M, @0x0038 - 0b05 2439 lrs $AC0.L, @0x0039 - 0b06 00d8 0362 lr $AX0.L, @0x0362 - 0b08 7000 addaxl $ACC0, $AX0.L - 0b09 2c39 srs @0x0039, $AC0.L - 0b0a 2e38 srs @0x0038, $AC0.M - 0b0b 0092 00ff lri $CR, #0x00ff - 0b0d 029f 0330 jmp 0x0330 - 0b0f 8100 clr $ACC0 - 0b10 2e34 srs @0x0034, $AC0.M - 0b11 2e35 srs @0x0035, $AC0.M - 0b12 2334 lrs $AX1.H, @0x0034 - 0b13 2135 lrs $AX1.L, @0x0035 - 0b14 268a lrs $AC0.M, @0xff8a - 0b15 248b lrs $AC0.L, @0xff8b - 0b16 5a00 subax $ACC0, $AX1.L - 0b17 2e3a srs @0x003a, $AC0.M - 0b18 2c3b srs @0x003b, $AC0.L - 0b19 2634 lrs $AC0.M, @0x0034 - 0b1a 2435 lrs $AC0.L, @0x0035 - 0b1b 238c lrs $AX1.H, @0xff8c - 0b1c 218d lrs $AX1.L, @0xff8d - 0b1d 4a00 addax $ACC0, $AX1.L - 0b1e 2e38 srs @0x0038, $AC0.M - 0b1f 2c39 srs @0x0039, $AC0.L - 0b20 8100 clr $ACC0 - 0b21 2e05 srs @0x0005, $AC0.M - 0b22 02df ret - 0b23 0092 0004 lri $CR, #0x0004 - 0b25 2002 lrs $AX0.L, @0x0002 - 0b26 8100 clr $ACC0 - 0b27 8900 clr $ACC1 - 0b28 2430 lrs $AC0.L, @0x0030 - 0b29 8d00 set15 - 0b2a 0950 lris $AX1.L, #0x50 - 0b2b a000 mulx $AX0.L, $AX1.L - 0b2c a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0b2d 1404 lsl $ACC0, #4 - 0b2e 8c00 clr15 - 0b2f 1ffe mrr $AC1.M, $AC0.M - 0b30 0083 0580 lri $AR3, #0x0580 - 0b32 02df ret - 0b33 02bf 0b23 call 0x0b23 - 0b35 2201 lrs $AX0.H, @0x0001 - 0b36 8600 tstaxh $AX0.H - 0b37 0294 0b48 jnz 0x0b48 - 0b39 2204 lrs $AX0.H, @0x0004 - 0b3a 8600 tstaxh $AX0.H - 0b3b 02b4 0b92 callnz 0x0b92 - 0b3d 8100 clr $ACC0 - 0b3e 2605 lrs $AC0.M, @0x0005 - 0b3f b100 tst $ACC0 - 0b40 0295 0b55 jz 0x0b55 - 0b42 8100 clr $ACC0 - 0b43 2e05 srs @0x0005, $AC0.M - 0b44 2281 lrs $AX0.H, @0xff81 - 0b45 8600 tstaxh $AX0.H - 0b46 0294 0b4f jnz 0x0b4f - 0b48 8100 clr $ACC0 - 0b49 005f loop $AC1.M - 0b4a 1b7e srri @$AR3, $AC0.M - 0b4b 7400 incm $AC0.M - 0b4c 2e01 srs @0x0001, $AC0.M - 0b4d 029f 0b8b jmp 0x0b8b - 0b4f 2688 lrs $AC0.M, @0xff88 - 0b50 2489 lrs $AC0.L, @0xff89 - 0b51 2e34 srs @0x0034, $AC0.M - 0b52 2c35 srs @0x0035, $AC0.L - 0b53 02bf 0b92 call 0x0b92 - 0b55 00ff 0360 sr @0x0360, $AC1.M - 0b57 2638 lrs $AC0.M, @0x0038 - 0b58 2439 lrs $AC0.L, @0x0039 - 0b59 02bf 0684 call 0x0684 - 0b5b 02bf 069b call 0x069b - 0b5d 00df 0360 lr $AC1.M, @0x0360 - 0b5f 8100 clr $ACC0 - 0b60 263a lrs $AC0.M, @0x003a - 0b61 b100 tst $ACC0 - 0b62 0294 0b71 jnz 0x0b71 - 0b64 263b lrs $AC0.M, @0x003b - 0b65 5c00 sub $ACC0, $ACC1 - 0b66 0290 0b71 jge 0x0b71 - 0b68 223b lrs $AX0.H, @0x003b - 0b69 02bf 0666 call 0x0666 - 0b6b 5500 subr $ACC1, $AX0.H - 0b6c 0a01 lris $AX0.H, #0x01 - 0b6d 00fa 0405 sr @0x0405, $AX0.H - 0b6f 029f 0b42 jmp 0x0b42 - 0b71 1f5f mrr $AX0.H, $AC1.M - 0b72 02bf 0666 call 0x0666 - 0b74 00fa 0362 sr @0x0362, $AX0.H - 0b76 8100 clr $ACC0 - 0b77 263a lrs $AC0.M, @0x003a - 0b78 243b lrs $AC0.L, @0x003b - 0b79 1570 lsr $ACC1, #-16 - 0b7a 0a01 lris $AX0.H, #0x01 - 0b7b 0081 0405 lri $AR1, #0x0405 - 0b7d 5c00 sub $ACC0, $ACC1 - 0b7e b100 tst $ACC0 - 0b7f 0275 ifz - 0b80 1a3a srr @$AR1, $AX0.H - 0b81 2e3a srs @0x003a, $AC0.M - 0b82 2c3b srs @0x003b, $AC0.L - 0b83 2638 lrs $AC0.M, @0x0038 - 0b84 2439 lrs $AC0.L, @0x0039 - 0b85 00d8 0362 lr $AX0.L, @0x0362 - 0b87 7000 addaxl $ACC0, $AX0.L - 0b88 7000 addaxl $ACC0, $AX0.L - 0b89 2c39 srs @0x0039, $AC0.L - 0b8a 2e38 srs @0x0038, $AC0.M - 0b8b 0092 00ff lri $CR, #0x00ff - 0b8d 029f 0330 jmp 0x0330 - 0b8f 8100 clr $ACC0 - 0b90 2e34 srs @0x0034, $AC0.M - 0b91 2e35 srs @0x0035, $AC0.M - 0b92 2334 lrs $AX1.H, @0x0034 - 0b93 2135 lrs $AX1.L, @0x0035 - 0b94 268a lrs $AC0.M, @0xff8a - 0b95 248b lrs $AC0.L, @0xff8b - 0b96 5a00 subax $ACC0, $AX1.L - 0b97 2e3a srs @0x003a, $AC0.M - 0b98 2c3b srs @0x003b, $AC0.L - 0b99 2634 lrs $AC0.M, @0x0034 - 0b9a 2435 lrs $AC0.L, @0x0035 - 0b9b 1401 lsl $ACC0, #1 - 0b9c 238c lrs $AX1.H, @0xff8c - 0b9d 218d lrs $AX1.L, @0xff8d - 0b9e 4a00 addax $ACC0, $AX1.L - 0b9f 2e38 srs @0x0038, $AC0.M - 0ba0 2c39 srs @0x0039, $AC0.L - 0ba1 8100 clr $ACC0 - 0ba2 2e05 srs @0x0005, $AC0.M - 0ba3 02df ret - 0ba4 8900 clr $ACC1 - 0ba5 0f50 lris $AC1.M, #0x50 - 0ba6 0083 0520 lri $AR3, #0x0520 - 0ba8 02bf 0bbd call 0x0bbd - 0baa 029f 0338 jmp 0x0338 - 0bac 00d8 0402 lr $AX0.L, @0x0402 - 0bae 8100 clr $ACC0 - 0baf 8900 clr $ACC1 - 0bb0 00dc 0430 lr $AC0.L, @0x0430 - 0bb2 0a50 lris $AX0.H, #0x50 - 0bb3 9000 mul $AX0.L, $AX0.H - 0bb4 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0bb5 1404 lsl $ACC0, #4 - 0bb6 1ffe mrr $AC1.M, $AC0.M - 0bb7 0083 0580 lri $AR3, #0x0580 - 0bb9 02bf 0bbd call 0x0bbd - 0bbb 029f 0330 jmp 0x0330 - 0bbd 0092 0004 lri $CR, #0x0004 - 0bbf 8100 clr $ACC0 - 0bc0 263a lrs $AC0.M, @0x003a - 0bc1 243b lrs $AC0.L, @0x003b - 0bc2 1f1f mrr $AX0.L, $AC1.M - 0bc3 0a00 lris $AX0.H, #0x00 - 0bc4 5800 subax $ACC0, $AX0.L - 0bc5 0292 0bdb jg 0x0bdb - 0bc7 8900 clr $ACC1 - 0bc8 00c0 043b lr $AR0, @0x043b - 0bca 02bf 0c00 call 0x0c00 - 0bcc 8100 clr $ACC0 - 0bcd 1fd8 mrr $AC0.M, $AX0.L - 0bce 223b lrs $AX0.H, @0x003b - 0bcf 5400 subr $ACC0, $AX0.H - 0bd0 0007 dar $AR3 - 0bd1 1979 lrri $AX1.L, @$AR3 - 0bd2 005e loop $AC0.M - 0bd3 1b79 srri @$AR3, $AX1.L - 0bd4 0f01 lris $AC1.M, #0x01 - 0bd5 2f01 srs @0x0001, $AC1.M - 0bd6 8900 clr $ACC1 - 0bd7 2f3b srs @0x003b, $AC1.M - 0bd8 0092 00ff lri $CR, #0x00ff - 0bda 02df ret - 0bdb 2e3a srs @0x003a, $AC0.M - 0bdc 2c3b srs @0x003b, $AC0.L - 0bdd 8100 clr $ACC0 - 0bde 8900 clr $ACC1 - 0bdf 268a lrs $AC0.M, @0xff8a - 0be0 2734 lrs $AC1.M, @0x0034 - 0be1 5c00 sub $ACC0, $ACC1 - 0be2 2e36 srs @0x0036, $AC0.M - 0be3 5000 subr $ACC0, $AX0.L - 0be4 0290 0bfa jge 0x0bfa - 0be6 00c0 0436 lr $AR0, @0x0436 - 0be8 02bf 0c00 call 0x0c00 - 0bea 8100 clr $ACC0 - 0beb 1fd8 mrr $AC0.M, $AX0.L - 0bec 2236 lrs $AX0.H, @0x0036 - 0bed 5400 subr $ACC0, $AX0.H - 0bee 1c1e mrr $AR0, $AC0.M - 0bef 8100 clr $ACC0 - 0bf0 2e34 srs @0x0034, $AC0.M - 0bf1 2688 lrs $AC0.M, @0xff88 - 0bf2 2489 lrs $AC0.L, @0xff89 - 0bf3 2e8c srs @0xff8c, $AC0.M - 0bf4 2c8d srs @0xff8d, $AC0.L - 0bf5 02bf 0c00 call 0x0c00 - 0bf7 0092 00ff lri $CR, #0x00ff - 0bf9 02df ret - 0bfa 1c18 mrr $AR0, $AX0.L - 0bfb 02bf 0c00 call 0x0c00 - 0bfd 0092 00ff lri $CR, #0x00ff - 0bff 02df ret - 0c00 8100 clr $ACC0 - 0c01 1fc0 mrr $AC0.M, $AR0 - 0c02 b100 tst $ACC0 - 0c03 02d5 retz - 0c04 8900 clr $ACC1 - 0c05 2734 lrs $AC1.M, @0x0034 - 0c06 0340 0001 andi $AC1.M, #0x0001 - 0c08 0b00 lris $AX1.H, #0x00 - 0c09 1f3f mrr $AX1.L, $AC1.M - 0c0a 268c lrs $AC0.M, @0xff8c - 0c0b 248d lrs $AC0.L, @0xff8d - 0c0c 8900 clr $ACC1 - 0c0d 2534 lrs $AC1.L, @0x0034 - 0c0e 1501 lsl $ACC1, #1 - 0c0f 4c00 add $ACC0, $ACC1 - 0c10 5a00 subax $ACC0, $AX1.L - 0c11 5a00 subax $ACC0, $AX1.L - 0c12 1c20 mrr $AR1, $AR0 - 0c13 1fe0 mrr $AC1.M, $AR0 - 0c14 0502 addis $ACC1, #0x02 - 0c15 1c1f mrr $AR0, $AC1.M - 0c16 009f 0b00 lri $AC1.M, #0x0b00 - 0c18 0092 00ff lri $CR, #0x00ff - 0c1a 02bf 05fb call 0x05fb - 0c1c 0092 0004 lri $CR, #0x0004 - 0c1e 2734 lrs $AC1.M, @0x0034 - 0c1f 1f61 mrr $AX1.H, $AR1 - 0c20 4700 addr $ACC1, $AX1.H - 0c21 2f34 srs @0x0034, $AC1.M - 0c22 0080 0b00 lri $AR0, #0x0b00 - 0c24 8900 clr $ACC1 - 0c25 1ff9 mrr $AC1.M, $AX1.L - 0c26 b900 tst $ACC1 - 0c27 0274 ifnz - 0c28 0008 iar $AR0 - 0c29 8900 clr $ACC1 - 0c2a 1fe1 mrr $AC1.M, $AR1 - 0c2b 191e lrri $AC0.M, @$AR0 - 0c2c 0701 cmpis $ACC1, #0x01 - 0c2d 0293 0c36 jle 0x0c36 - 0c2f 191a lrri $AX0.H, @$AR0 - 0c30 05fe addis $ACC1, #0xfe - 0c31 005f loop $AC1.M - 0c32 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c33 1b7e srri @$AR3, $AC0.M - 0c34 1b7a srri @$AR3, $AX0.H - 0c35 02df ret - 0c36 1b7e srri @$AR3, $AC0.M - 0c37 02df ret - 0c38 0083 03e8 lri $AR3, #0x03e8 - 0c3a 191e lrri $AC0.M, @$AR0 - 0c3b 191a lrri $AX0.H, @$AR0 - 0c3c 1006 loopi #0x06 - 0c3d 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c3e 1b7e srri @$AR3, $AC0.M - 0c3f 1b7a srri @$AR3, $AX0.H - 0c40 0080 03e8 lri $AR0, #0x03e8 - 0c42 8a00 m2 - 0c43 0088 0007 lri $WR0, #0x0007 - 0c45 1150 0c52 bloopi #0x50, 0x0c52 - 0c47 1c61 mrr $AR3, $AR1 - 0c48 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c49 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4b f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4c f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4d f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4e f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c4f f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c50 f200 madd $AX0.L, $AX0.H - 0c51 fe00 movpz $ACC0 - 0c52 1b3e srri @$AR1, $AC0.M - 0c53 0088 ffff lri $WR0, #0xffff - 0c55 8b00 m0 - 0c56 02df ret - 0c57 8a00 m2 - 0c58 05fe addis $ACC1, #0xfe - 0c59 0083 03e8 lri $AR3, #0x03e8 - 0c5b 191e lrri $AC0.M, @$AR0 - 0c5c 191a lrri $AX0.H, @$AR0 - 0c5d 005f loop $AC1.M - 0c5e 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c5f 1b7e srri @$AR3, $AC0.M - 0c60 1b7a srri @$AR3, $AX0.H - 0c61 0080 03e8 lri $AR0, #0x03e8 - 0c63 0501 addis $ACC1, #0x01 - 0c64 1d1f mrr $WR0, $AC1.M - 0c65 1150 0c6d bloopi #0x50, 0x0c6d - 0c67 1c61 mrr $AR3, $AR1 - 0c68 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c69 005f loop $AC1.M - 0c6a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c6b f200 madd $AX0.L, $AX0.H - 0c6c fe00 movpz $ACC0 - 0c6d 1b3e srri @$AR1, $AC0.M - 0c6e 0088 ffff lri $WR0, #0xffff - 0c70 8b00 m0 - 0c71 02df ret - 0c72 0083 03e8 lri $AR3, #0x03e8 - 0c74 191e lrri $AC0.M, @$AR0 - 0c75 191a lrri $AX0.H, @$AR0 - 0c76 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c77 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c78 1b7e srri @$AR3, $AC0.M - 0c79 1b7a srri @$AR3, $AX0.H - 0c7a 0080 03e8 lri $AR0, #0x03e8 - 0c7c 0088 0003 lri $WR0, #0x0003 - 0c7e 0085 0000 lri $IX1, #0x0000 - 0c80 0087 0000 lri $IX3, #0x0000 - 0c82 1fc2 mrr $AC0.M, $AR2 - 0c83 195b lrri $AX1.H, @$AR2 - 0c84 1959 lrri $AX1.L, @$AR2 - 0c85 195f lrri $AC1.M, @$AR2 - 0c86 195a lrri $AX0.H, @$AR2 - 0c87 1c5e mrr $AR2, $AC0.M - 0c88 1fda mrr $AC0.M, $AX0.H - 0c89 1c61 mrr $AR3, $AR1 - 0c8a 8a00 m2 - 0c8b 8f00 set40 - 0c8c 191a lrri $AX0.H, @$AR0 - 0c8d b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0c8e e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0c8f ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0c90 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0c91 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0c92 1127 0c9d bloopi #0x27, 0x0c9d - 0c94 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0c95 197e lrri $AC0.M, @$AR3 - 0c96 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0c97 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0c98 bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0c99 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0c9a 197f lrri $AC1.M, @$AR3 - 0c9b ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0c9c e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0c9d b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0c9e e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0c9f 197e lrri $AC0.M, @$AR3 - 0ca0 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ca1 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0ca2 bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 0ca3 1bff srrn @$AR3, $AC1.M - 0ca4 197f lrri $AC1.M, @$AR3 - 0ca5 8e00 set16 - 0ca6 8b00 m0 - 0ca7 0088 ffff lri $WR0, #0xffff - 0ca9 1b5b srri @$AR2, $AX1.H - 0caa 1b59 srri @$AR2, $AX1.L - 0cab 1b5f srri @$AR2, $AC1.M - 0cac 1b5e srri @$AR2, $AC0.M - 0cad 02df ret - 0cae 0083 03e8 lri $AR3, #0x03e8 - 0cb0 191e lrri $AC0.M, @$AR0 - 0cb1 191a lrri $AX0.H, @$AR0 - 0cb2 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cb3 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cb4 1b7e srri @$AR3, $AC0.M - 0cb5 1b7a srri @$AR3, $AX0.H - 0cb6 0080 03e8 lri $AR0, #0x03e8 - 0cb8 0088 0003 lri $WR0, #0x0003 - 0cba 0085 0000 lri $IX1, #0x0000 - 0cbc 0087 0000 lri $IX3, #0x0000 - 0cbe 1fc2 mrr $AC0.M, $AR2 - 0cbf 195b lrri $AX1.H, @$AR2 - 0cc0 1959 lrri $AX1.L, @$AR2 - 0cc1 195f lrri $AC1.M, @$AR2 - 0cc2 195a lrri $AX0.H, @$AR2 - 0cc3 1c5e mrr $AR2, $AC0.M - 0cc4 1fda mrr $AC0.M, $AX0.H - 0cc5 1c61 mrr $AR3, $AR1 - 0cc6 8a00 m2 - 0cc7 8f00 set40 - 0cc8 191a lrri $AX0.H, @$AR0 - 0cc9 b800 mulx $AX0.H, $AX1.H - 0cca e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0ccb e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0ccc ea00 maddc $AC1.M, $AX1.L - 0ccd ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0cce e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0ccf ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0cd0 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0cd1 1127 0ce2 bloopi #0x27, 0x0ce2 - 0cd3 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cd4 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0cd5 197e lrri $AC0.M, @$AR3 - 0cd6 e800 maddc $AC0.M, $AX1.L - 0cd7 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0cd8 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0cd9 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cda bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0cdb e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0cdc e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0cdd 197f lrri $AC1.M, @$AR3 - 0cde ea00 maddc $AC1.M, $AX1.L - 0cdf ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0ce0 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0ce1 ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0ce2 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0ce3 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0ce4 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ce5 197e lrri $AC0.M, @$AR3 - 0ce6 e800 maddc $AC0.M, $AX1.L - 0ce7 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ce8 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0ce9 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cea bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0ceb 1bff srrn @$AR3, $AC1.M - 0cec 197f lrri $AC1.M, @$AR3 - 0ced 8e00 set16 - 0cee 8b00 m0 - 0cef 0088 ffff lri $WR0, #0xffff - 0cf1 1b5b srri @$AR2, $AX1.H - 0cf2 1b59 srri @$AR2, $AX1.L - 0cf3 1b5f srri @$AR2, $AC1.M - 0cf4 1b5e srri @$AR2, $AC0.M - 0cf5 02df ret - 0cf6 0eff lris $AC0.M, #0xff - 0cf7 00fe 03f2 sr @0x03f2, $AC0.M - 0cf9 8100 clr $ACC0 - 0cfa 00fe 03f0 sr @0x03f0, $AC0.M - 0cfc 00fe 03f6 sr @0x03f6, $AC0.M - 0cfe 009e 0100 lri $AC0.M, #0x0100 - 0d00 00fe 03f7 sr @0x03f7, $AC0.M - 0d02 00da 03f7 lr $AX0.H, @0x03f7 - 0d04 009e 8000 lri $AC0.M, #0x8000 - 0d06 5400 subr $ACC0, $AX0.H - 0d07 00fe 03f5 sr @0x03f5, $AC0.M - 0d09 0e30 lris $AC0.M, #0x30 - 0d0a 00fe 03f3 sr @0x03f3, $AC0.M - 0d0c 0e10 lris $AC0.M, #0x10 - 0d0d 00fe 03f4 sr @0x03f4, $AC0.M - 0d0f 009e 0096 lri $AC0.M, #0x0096 - 0d11 00fe 03f1 sr @0x03f1, $AC0.M - 0d13 02df ret - 0d14 0080 0a00 lri $AR0, #0x0a00 - 0d16 8100 clr $ACC0 - 0d17 00de 03f0 lr $AC0.M, @0x03f0 - 0d19 8900 clr $ACC1 - 0d1a b100 tst $ACC0 - 0d1b 0275 ifz - 0d1c 0550 addis $ACC1, #0x50 - 0d1d 00ff 03f0 sr @0x03f0, $AC1.M - 0d1f 0200 0a60 addi $AC0.M, #0x0a60 - 0d21 1c7e mrr $AR3, $AC0.M - 0d22 0f4e lris $AC1.M, #0x4e - 0d23 02bf 00e5 call 0x00e5 - 0d25 02df ret - 0d26 00de 03f1 lr $AC0.M, @0x03f1 - 0d28 0200 0a60 addi $AC0.M, #0x0a60 - 0d2a 1c7e mrr $AR3, $AC0.M - 0d2b 8100 clr $ACC0 - 0d2c 8900 clr $ACC1 - 0d2d 009f 00a0 lri $AC1.M, #0x00a0 - 0d2f 00de 03f1 lr $AC0.M, @0x03f1 - 0d31 5d00 sub $ACC1, $ACC0 - 0d32 0e50 lris $AC0.M, #0x50 - 0d33 0750 cmpis $ACC1, #0x50 - 0d34 0270 ifge - 0d35 5d00 sub $ACC1, $ACC0 - 0d36 00da 03f2 lr $AX0.H, @0x03f2 - 0d38 8600 tstaxh $AX0.H - 0d39 0290 0d57 jge 0x0d57 - 0d3b 00de 03f3 lr $AC0.M, @0x03f3 - 0d3d 5c00 sub $ACC0, $ACC1 - 0d3e 0293 0d42 jle 0x0d42 - 0d40 029f 0d5c jmp 0x0d5c - 0d42 00db 03f7 lr $AX1.H, @0x03f7 - 0d44 009e 8000 lri $AC0.M, #0x8000 - 0d46 4600 addr $ACC0, $AX1.H - 0d47 029f 0d4e jmp 0x0d4e - 0d49 00db 03f7 lr $AX1.H, @0x03f7 - 0d4b 009e 8000 lri $AC0.M, #0x8000 - 0d4d 5600 subr $ACC0, $AX1.H - 0d4e 00fe 03f5 sr @0x03f5, $AC0.M - 0d50 1fda mrr $AC0.M, $AX0.H - 0d51 7c00 neg $ACC0 - 0d52 1f5e mrr $AX0.H, $AC0.M - 0d53 00fe 03f2 sr @0x03f2, $AC0.M - 0d55 029f 0d5c jmp 0x0d5c - 0d57 00de 03f4 lr $AC0.M, @0x03f4 - 0d59 5d00 sub $ACC1, $ACC0 - 0d5a 0293 0d49 jle 0x0d49 - 0d5c 8900 clr $ACC1 - 0d5d 00dd 03f5 lr $AC1.L, @0x03f5 - 0d5f 1501 lsl $ACC1, #1 - 0d60 8100 clr $ACC0 - 0d61 00dc 03f6 lr $AC0.L, @0x03f6 - 0d63 008b 009f lri $WR3, #0x009f - 0d65 0080 0a00 lri $AR0, #0x0a00 - 0d67 0900 lris $AX1.L, #0x00 - 0d68 1150 0d6f bloopi #0x50, 0x0d6f - 0d6a 1878 lrr $AX0.L, @$AR3 - 0d6b 4c00 add $ACC0, $ACC1 - 0d6c 1cfe mrr $IX3, $AC0.M - 0d6d 001f addarn $AR3, $IX3 - 0d6e 1fd9 mrr $AC0.M, $AX1.L - 0d6f 1b18 srri @$AR0, $AX0.L - 0d70 009f 0a60 lri $AC1.M, #0x0a60 - 0d72 1fc3 mrr $AC0.M, $AR3 - 0d73 5c00 sub $ACC0, $ACC1 - 0d74 00fe 03f1 sr @0x03f1, $AC0.M - 0d76 00fc 03f6 sr @0x03f6, $AC0.L - 0d78 008b ffff lri $WR3, #0xffff - 0d7a 02df ret - 0d7b 0f50 lris $AC1.M, #0x50 - 0d7c 0080 0a00 lri $AR0, #0x0a00 - 0d7e 0083 0d60 lri $AR3, #0x0d60 - 0d80 0098 3fff lri $AX0.L, #0x3fff - 0d82 02bf 00ff call 0x00ff - 0d84 0f50 lris $AC1.M, #0x50 - 0d85 0080 0a00 lri $AR0, #0x0a00 - 0d87 0083 0d00 lri $AR3, #0x0d00 - 0d89 0098 3fff lri $AX0.L, #0x3fff - 0d8b 02bf 00ff call 0x00ff - 0d8d 02df ret - 0d8e 8a00 m2 - 0d8f 8f00 set40 - 0d90 8100 clr $ACC0 - 0d91 00de 0404 lr $AC0.M, @0x0404 - 0d93 b100 tst $ACC0 - 0d94 0295 0d9b jz 0x0d9b - 0d96 8100 clr $ACC0 - 0d97 00fe 0478 sr @0x0478, $AC0.M - 0d99 00fe 0479 sr @0x0479, $AC0.M - 0d9b 00df 0479 lr $AC1.M, @0x0479 - 0d9d 00db 0478 lr $AX1.H, @0x0478 - 0d9f 0900 lris $AX1.L, #0x00 - 0da0 0084 0000 lri $IX0, #0x0000 - 0da2 1150 0dab bloopi #0x50, 0x0dab - 0da4 199e lrrn $AC0.M, @$AR0 - 0da5 5c7c sub'ln $ACC0, $ACC1 : $AC1.M, @$AR0 - 0da6 c000 mulc $AC0.M, $AX0.H - 0da7 6e00 movp $ACC0 - 0da8 1488 asl $ACC0, #8 - 0da9 4a00 addax $ACC0, $AX1.L - 0daa 1b1e srri @$AR0, $AC0.M - 0dab 1f7e mrr $AX1.H, $AC0.M - 0dac 00fb 0478 sr @0x0478, $AX1.H - 0dae 00ff 0479 sr @0x0479, $AC1.M - 0db0 8b00 m0 - 0db1 8e00 set16 - 0db2 02df ret - 0db3 b900 tst $ACC1 - 0db4 0294 0db9 jnz 0x0db9 - 0db6 6800 movax $ACC0, $AX0.L - 0db7 b100 tst $ACC0 - 0db8 02d5 retz - 0db9 1c23 mrr $AR1, $AR3 - 0dba 197e lrri $AC0.M, @$AR3 - 0dbb 191b lrri $AX1.H, @$AR0 - 0dbc d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - 0dbd 1120 0dc3 bloopi #0x20, 0x0dc3 - 0dbf dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0dc0 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dc1 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0dc2 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dc3 4900 addax $ACC1, $AX0.L - 0dc4 1108 0dc9 bloopi #0x08, 0x0dc9 - 0dc6 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0dc7 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dc8 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0dc9 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dca 02df ret - 0dcb 8f00 set40 - 0dcc 8d00 set15 - 0dcd 1c03 mrr $AR0, $AR3 - 0dce 00d9 038e lr $AX1.L, @0x038e - 0dd0 0b04 lris $AX1.H, #0x04 - 0dd1 197a lrri $AX0.H, @$AR3 - 0dd2 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3 - 0dd3 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0dd4 1128 0dd9 bloopi #0x28, 0x0dd9 - 0dd6 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0dd7 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dd8 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0dd9 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dda 8c00 clr15 - 0ddb 8e00 set16 - 0ddc 02df ret - 0ddd 00da 0485 lr $AX0.H, @0x0485 - 0ddf 8600 tstaxh $AX0.H - 0de0 0295 0dee jz 0x0dee - 0de2 8100 clr $ACC0 - 0de3 00de 042a lr $AC0.M, @0x042a - 0de5 147f lsr $ACC0, #-1 - 0de6 00fe 042b sr @0x042b, $AC0.M - 0de8 b100 tst $ACC0 - 0de9 0294 0dee jnz 0x0dee - 0deb 0a01 lris $AX0.H, #0x01 - 0dec 00fa 0401 sr @0x0401, $AX0.H - 0dee 8f00 set40 - 0def 8100 clr $ACC0 - 0df0 00de 0428 lr $AC0.M, @0x0428 - 0df2 1478 lsr $ACC0, #-8 - 0df3 00df 0428 lr $AC1.M, @0x0428 - 0df5 0340 007f andi $AC1.M, #0x007f - 0df7 1f1e mrr $AX0.L, $AC0.M - 0df8 1f5f mrr $AX0.H, $AC1.M - 0df9 0220 007f xori $ACC0, #0x007f - 0dfb 1f3e mrr $AX1.L, $AC0.M - 0dfc 0320 007f xori $ACC1, #0x007f - 0dfe 1f7f mrr $AX1.H, $AC1.M - 0dff 8100 clr $ACC0 - 0e00 8900 clr $ACC1 - 0e01 009f 0200 lri $AC1.M, #0x0200 - 0e03 1fd8 mrr $AC0.M, $AX0.L - 0e04 4c00 add $ACC0, $ACC1 - 0e05 1c1e mrr $AR0, $AC0.M - 0e06 1818 lrr $AX0.L, @$AR0 - 0e07 1fda mrr $AC0.M, $AX0.H - 0e08 4c00 add $ACC0, $ACC1 - 0e09 1c1e mrr $AR0, $AC0.M - 0e0a 181a lrr $AX0.H, @$AR0 - 0e0b 1fd9 mrr $AC0.M, $AX1.L - 0e0c 4c00 add $ACC0, $ACC1 - 0e0d 1c1e mrr $AR0, $AC0.M - 0e0e 1819 lrr $AX1.L, @$AR0 - 0e0f 1fdb mrr $AC0.M, $AX1.H - 0e10 4c00 add $ACC0, $ACC1 - 0e11 1c1e mrr $AR0, $AC0.M - 0e12 181b lrr $AX1.H, @$AR0 - 0e13 8a00 m2 - 0e14 0080 0b00 lri $AR0, #0x0b00 - 0e16 9800 mul $AX1.L, $AX1.H - 0e17 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0e18 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0e19 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M - 0e1a 6e30 movp's $ACC0 : @$AR0, $AC0.M - 0e1b 1b1e srri @$AR0, $AC0.M - 0e1c 8b00 m0 - 0e1d 0080 0b00 lri $AR0, #0x0b00 - 0e1f 0081 0b04 lri $AR1, #0x0b04 - 0e21 00da 042a lr $AX0.H, @0x042a - 0e23 02bf 0e6e call 0x0e6e - 0e25 0081 0b08 lri $AR1, #0x0b08 - 0e27 0080 0b00 lri $AR0, #0x0b00 - 0e29 00da 042a lr $AX0.H, @0x042a - 0e2b 00de 0429 lr $AC0.M, @0x0429 - 0e2d 8a00 m2 - 0e2e c000 mulc $AC0.M, $AX0.H - 0e2f 8b00 m0 - 0e30 6e00 movp $ACC0 - 0e31 1f5e mrr $AX0.H, $AC0.M - 0e32 02bf 0e6e call 0x0e6e - 0e34 0080 0b00 lri $AR0, #0x0b00 - 0e36 0081 0b0c lri $AR1, #0x0b0c - 0e38 8100 clr $ACC0 - 0e39 8900 clr $ACC1 - 0e3a 00de 042b lr $AC0.M, @0x042b - 0e3c 00df 042a lr $AC1.M, @0x042a - 0e3e 00fe 042a sr @0x042a, $AC0.M - 0e40 5c00 sub $ACC0, $ACC1 - 0e41 1f5e mrr $AX0.H, $AC0.M - 0e42 02bf 0e79 call 0x0e79 - 0e44 0080 0b0c lri $AR0, #0x0b0c - 0e46 0081 0b10 lri $AR1, #0x0b10 - 0e48 00da 0429 lr $AX0.H, @0x0429 - 0e4a 02bf 0e6e call 0x0e6e - 0e4c 0081 0b04 lri $AR1, #0x0b04 - 0e4e 0082 0b0c lri $AR2, #0x0b0c - 0e50 0083 0e87 lri $AR3, #0x0e87 - 0e52 1108 0e6b bloopi #0x08, 0x0e6b - 0e54 195f lrri $AC1.M, @$AR2 - 0e55 15fb asr $ACC1, #-5 - 0e56 1f1d mrr $AX0.L, $AC1.L - 0e57 1f5f mrr $AX0.H, $AC1.M - 0e58 193f lrri $AC1.M, @$AR1 - 0e59 00e1 0b24 sr @0x0b24, $AR1 - 0e5b 00e2 0b25 sr @0x0b25, $AR2 - 0e5d 021b ilrri $AC0.M, @$AR3 - 0e5e 00e3 0b26 sr @0x0b26, $AR3 - 0e60 1c7e mrr $AR3, $AC0.M - 0e61 00c0 038f lr $AR0, @0x038f - 0e63 02bf 0db3 call 0x0db3 - 0e65 00c1 0b24 lr $AR1, @0x0b24 - 0e67 00c2 0b25 lr $AR2, @0x0b25 - 0e69 00c3 0b26 lr $AR3, @0x0b26 - 0e6b 0000 nop - 0e6c 8e00 set16 - 0e6d 02df ret - 0e6e 8a00 m2 - 0e6f 191f lrri $AC1.M, @$AR0 - 0e70 d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0 - 0e71 d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0 - 0e72 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e73 191f lrri $AC1.M, @$AR0 - 0e74 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e75 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0e76 1b3e srri @$AR1, $AC0.M - 0e77 8b00 m0 - 0e78 02df ret - 0e79 8a00 m2 - 0e7a 8d00 set15 - 0e7b 1f7e mrr $AX1.H, $AC0.M - 0e7c 1918 lrri $AX0.L, @$AR0 - 0e7d a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0 - 0e7e ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0 - 0e7f ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e80 1918 lrri $AX0.L, @$AR0 - 0e81 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e82 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0e83 1b3e srri @$AR1, $AC0.M - 0e84 8c00 clr15 - 0e85 8b00 m0 - 0e86 02df ret - 0e87 0d00 lris $AC1.L, #0x00 - 0e88 0d60 lris $AC1.L, #0x60 - 0e89 0f40 lris $AC1.M, #0x40 - 0e8a 0ca0 lris $AC0.L, #0xa0 - 0e8b 0e80 lris $AC0.M, #0x80 - 0e8c 0ee0 lris $AC0.M, #0xe0 - 0e8d 0be0 lris $AX1.H, #0xe0 - 0e8e 0c40 lris $AC0.L, #0x40 - 0e8f 00f9 0361 sr @0x0361, $AX1.L - 0e91 1fc0 mrr $AC0.M, $AR0 - 0e92 0200 fffc addi $AC0.M, #0xfffc - 0e94 1c1e mrr $AR0, $AC0.M - 0e95 1c5e mrr $AR2, $AC0.M - 0e96 0083 043c lri $AR3, #0x043c - 0e98 197e lrri $AC0.M, @$AR3 - 0e99 197f lrri $AC1.M, @$AR3 - 0e9a 80a2 nx'sl : $AC0.M, $AX0.H - 0e9b 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - 0e9c 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - 0e9d 1b1f srri @$AR0, $AC1.M - 0e9e 1c02 mrr $AR0, $AR2 - 0e9f 8100 clr $ACC0 - 0ea0 00de 0402 lr $AC0.M, @0x0402 - 0ea2 00fe 0362 sr @0x0362, $AC0.M - 0ea4 1474 lsr $ACC0, #-12 - 0ea5 1f7e mrr $AX1.H, $AC0.M - 0ea6 1f3c mrr $AX1.L, $AC0.L - 0ea7 8900 clr $ACC1 - 0ea8 00dd 0430 lr $AC1.L, @0x0430 - 0eaa 1504 lsl $ACC1, #4 - 0eab 0604 cmpis $ACC0, #0x04 - 0eac 0290 0f03 jge 0x0f03 - 0eae 1fdd mrr $AC0.M, $AC1.L - 0eaf 0082 02b0 lri $AR2, #0x02b0 - 0eb1 1050 loopi #0x50 - 0eb2 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L - 0eb3 1fbe mrr $AC1.L, $AC0.M - 0eb4 00fe 0360 sr @0x0360, $AC0.M - 0eb6 8900 clr $ACC1 - 0eb7 1fbe mrr $AC1.L, $AC0.M - 0eb8 0af8 lris $AX0.H, #0xf8 - 0eb9 009b 00fc lri $AX1.H, #0x00fc - 0ebb 00d8 0361 lr $AX0.L, @0x0361 - 0ebd 0082 02b0 lri $AR2, #0x02b0 - 0ebf 0083 02b0 lri $AR3, #0x02b0 - 0ec1 195e lrri $AC0.M, @$AR2 - 0ec2 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M - 0ec3 1128 0ec8 bloopi #0x28, 0x0ec8 - 0ec5 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 - 0ec6 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H - 0ec7 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 - 0ec8 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - 0ec9 8a00 m2 - 0eca 0082 02b0 lri $AR2, #0x02b0 - 0ecc 00dd 0430 lr $AC1.L, @0x0430 - 0ece 1504 lsl $ACC1, #4 - 0ecf 1fe0 mrr $AC1.M, $AR0 - 0ed0 8100 clr $ACC0 - 0ed1 00de 0362 lr $AC0.M, @0x0362 - 0ed3 1474 lsr $ACC0, #-12 - 0ed4 1f7e mrr $AX1.H, $AC0.M - 0ed5 1f3c mrr $AX1.L, $AC0.L - 0ed6 8f00 set40 - 0ed7 1943 lrri $AR3, @$AR2 - 0ed8 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ed9 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0eda f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0edb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0edc f200 madd $AX0.L, $AX0.H - 0edd fe00 movpz $ACC0 - 0ede 1c1f mrr $AR0, $AC1.M - 0edf 1943 lrri $AR3, @$AR2 - 0ee0 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ee1 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ee2 114e 0eea bloopi #0x4e, 0x0eea - 0ee4 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ee5 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ee6 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0ee7 1c1f mrr $AR0, $AC1.M - 0ee8 1943 lrri $AR3, @$AR2 - 0ee9 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0eea 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - 0eeb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0eec f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0eed f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0eee fe00 movpz $ACC0 - 0eef 1b3e srri @$AR1, $AC0.M - 0ef0 8b00 m0 - 0ef1 8e00 set16 - 0ef2 00fe 0433 sr @0x0433, $AC0.M - 0ef4 1c1f mrr $AR0, $AC1.M - 0ef5 150c lsl $ACC1, #12 - 0ef6 0340 0fff andi $AC1.M, #0x0fff - 0ef8 00ff 0430 sr @0x0430, $AC1.M - 0efa 0083 043c lri $AR3, #0x043c - 0efc 191e lrri $AC0.M, @$AR0 - 0efd 191f lrri $AC1.M, @$AR0 - 0efe 80a0 nx'ls : $AX0.H, $AC0.M - 0eff 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0f00 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0f01 1b7f srri @$AR3, $AC1.M - 0f02 02df ret - 0f03 1fe0 mrr $AC1.M, $AR0 - 0f04 1c1f mrr $AR0, $AC1.M - 0f05 1128 0f0c bloopi #0x28, 0x0f0c - 0f07 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f08 1b3e srri @$AR1, $AC0.M - 0f09 1c1f mrr $AR0, $AC1.M - 0f0a 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f0b 1b3e srri @$AR1, $AC0.M - 0f0c 1c1f mrr $AR0, $AC1.M - 0f0d 029f 0ef2 jmp 0x0ef2 - 0f0f 0083 0520 lri $AR3, #0x0520 - 0f11 00de 0433 lr $AC0.M, @0x0433 - 0f13 1050 loopi #0x50 - 0f14 1b7e srri @$AR3, $AC0.M - 0f15 029f 0338 jmp 0x0338 - 0f17 1c20 mrr $AR1, $AR0 - 0f18 185f lrr $AC1.M, @$AR2 - 0f19 1f7f mrr $AX1.H, $AC1.M - 0f1a 193a lrri $AX0.H, @$AR1 - 0f1b 6400 movr $ACC0, $AX0.H - 0f1c 0078 0f21 bloop $AX0.L, 0x0f21 - 0f1e 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1 - 0f1f 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M - 0f20 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1 - 0f21 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M - 0f22 1a5b srr @$AR2, $AX1.H - 0f23 02df ret - 0f24 0098 8240 lri $AX0.L, #0x8240 - 0f26 00f8 04e8 sr @0x04e8, $AX0.L - 0f28 0098 7fff lri $AX0.L, #0x7fff - 0f2a 00f8 04e9 sr @0x04e9, $AX0.L - 0f2c 0098 7dbf lri $AX0.L, #0x7dbf - 0f2e 00f8 04ea sr @0x04ea, $AX0.L - 0f30 0098 843f lri $AX0.L, #0x843f - 0f32 00f8 04eb sr @0x04eb, $AX0.L - 0f34 0098 b23b lri $AX0.L, #0xb23b - 0f36 00f8 04f0 sr @0x04f0, $AX0.L - 0f38 0098 7fff lri $AX0.L, #0x7fff - 0f3a 00f8 04f1 sr @0x04f1, $AX0.L - 0f3c 0098 4dc4 lri $AX0.L, #0x4dc4 - 0f3e 00f8 04f2 sr @0x04f2, $AX0.L - 0f40 0098 d808 lri $AX0.L, #0xd808 - 0f42 00f8 04f3 sr @0x04f3, $AX0.L - 0f44 0098 0000 lri $AX0.L, #0x0000 - 0f46 0080 04ec lri $AR0, #0x04ec - 0f48 1004 loopi #0x04 - 0f49 1b18 srri @$AR0, $AX0.L - 0f4a 0080 04f4 lri $AR0, #0x04f4 - 0f4c 1004 loopi #0x04 - 0f4d 1b18 srri @$AR0, $AX0.L - 0f4e 02df ret - 0f4f 0080 0f40 lri $AR0, #0x0f40 - 0f51 0083 0b00 lri $AR3, #0x0b00 - 0f53 8900 clr $ACC1 - 0f54 0f50 lris $AC1.M, #0x50 - 0f55 0098 6784 lri $AX0.L, #0x6784 - 0f57 02bf 010e call 0x010e - 0f59 0080 04e8 lri $AR0, #0x04e8 - 0f5b 0082 04ec lri $AR2, #0x04ec - 0f5d 0081 0b00 lri $AR1, #0x0b00 - 0f5f 8900 clr $ACC1 - 0f60 0f50 lris $AC1.M, #0x50 - 0f61 0080 0b00 lri $AR0, #0x0b00 - 0f63 0083 0d00 lri $AR3, #0x0d00 - 0f65 0098 7fff lri $AX0.L, #0x7fff - 0f67 02bf 00ff call 0x00ff - 0f69 8900 clr $ACC1 - 0f6a 0f50 lris $AC1.M, #0x50 - 0f6b 0080 0b00 lri $AR0, #0x0b00 - 0f6d 0083 0d60 lri $AR3, #0x0d60 - 0f6f 0098 b820 lri $AX0.L, #0xb820 - 0f71 02bf 00ff call 0x00ff - 0f73 0080 0ca0 lri $AR0, #0x0ca0 - 0f75 0083 0b00 lri $AR3, #0x0b00 - 0f77 8900 clr $ACC1 - 0f78 0f50 lris $AC1.M, #0x50 - 0f79 0098 6784 lri $AX0.L, #0x6784 - 0f7b 02bf 010e call 0x010e - 0f7d 0080 04e8 lri $AR0, #0x04e8 - 0f7f 0082 04f4 lri $AR2, #0x04f4 - 0f81 0081 0b00 lri $AR1, #0x0b00 - 0f83 8900 clr $ACC1 - 0f84 0f50 lris $AC1.M, #0x50 - 0f85 0080 0b00 lri $AR0, #0x0b00 - 0f87 0083 0d00 lri $AR3, #0x0d00 - 0f89 0098 47e0 lri $AX0.L, #0x47e0 - 0f8b 02bf 00ff call 0x00ff - 0f8d 8900 clr $ACC1 - 0f8e 0f50 lris $AC1.M, #0x50 - 0f8f 0080 0b00 lri $AR0, #0x0b00 - 0f91 0083 0d60 lri $AR3, #0x0d60 - 0f93 0098 8001 lri $AX0.L, #0x8001 - 0f95 02bf 00ff call 0x00ff - 0f97 02df ret - 0f98 0000 nop - 0f99 0000 nop - 0f9a 0000 nop - 0f9b 0000 nop - 0f9c 0000 nop - 0f9d 0000 nop - 0f9e 0000 nop - 0f9f 0000 nop diff --git a/docs/DSP/DSP_UC_SuperMarioGalaxy.txt b/docs/DSP/DSP_UC_SuperMarioGalaxy.txt deleted file mode 100644 index 9909314224..0000000000 --- a/docs/DSP/DSP_UC_SuperMarioGalaxy.txt +++ /dev/null @@ -1,3174 +0,0 @@ - // Memory map: - // - // 0x0D00: final right buffer #1 - // 0x0D60: final left buffer #1 - // 0x0F40: final right buffer #2 - // 0x0CA0: final left buffer #2 - - 0000 029f 0012 jmp 0x0012 // Reset() - 0002 0000 nop - 0003 0000 nop - 0004 02ff rti - 0005 0000 nop - 0006 02ff rti - 0007 0000 nop - 0008 02ff rti - 0009 0000 nop - 000a 02ff rti - 000b 0000 nop - 000c 02ff rti - 000d 0000 nop - 000e 029f 06e9 jmp 0x06e9 // Exception_0E() - - 0010 029f 004c jmp 0x004c // TaskStart() - -// Reset() - 0012 1205 sbclr #0x05 - 0013 02bf 0055 call 0x0055 - 0015 8100 clr $ACC0 - 0016 009f 1000 lri $AC1.M, #0x1000 - 0018 0080 0000 lri $AR0, #0x0000 - 001a 005f loop $AC1.M - 001b 1b1e srri @$AR0, $AC0.M - 001c 02bf 07b9 call 0x07b9 // InitGlobalVars() - 001e 02bf 0f0a call 0x0f0a // InitUnkTable() - 0020 0e00 lris $AC0.M, #0x00 - 0021 02bf 079b call 0x079b // SendMail_DCD1(0x0000) - 0023 009e 1111 lri $AC0.M, #0x1111 - 0025 02bf 07a5 call 0x07a5 // sendMail_F355(0x1111) - 0027 0e00 lris $AC0.M, #0x00 - 0028 00fe 034e sr @0x034e, $AC0.M - 002a 1305 sbset #0x05 - 002b 029f 07f6 jmp 0x07f6 // jump to MessageLoop() - -// OpcodeHandler() - 002d 00df 0357 lr $AC1.M, @0x0357 - 002f 00ff 0345 sr @0x0345, $AC1.M - 0031 00de 0356 lr $AC0.M, @0x0356 - 0033 1ffe mrr $AC1.M, $AC0.M - 0034 0340 00ff andi $AC1.M, #0x00ff - 0036 00ff 0344 sr @0x0344, $AC1.M - 0038 1479 lsr $ACC0, #-7 - 0039 0240 007e andi $AC0.M, #0x007e - 003b 00fe 0343 sr @0x0343, $AC0.M - 003d 0200 0073 addi $AC0.M, #0x0073 // Opcode jump table address (0x0073) - 003f 1c1e mrr $AR0, $AC0.M - 0040 170f jmpr $AR0 // jump to opcode handler - 0041 0092 00ff lri $CR, #0x00ff // Return address from opcode handler - 0043 0e04 lris $AC0.M, #0x04 - 0044 02bf 079b call 0x079b // SendMail_DCD1(0x0004) - 0046 00de 0356 lr $AC0.M, @0x0356 - 0048 02bf 07a5 call 0x07a5 // SendMail_F355(mail_high_part) - 004a 029f 002b jmp 0x002b // jump back to MessageLoop() - -// TaskStart() - 004c 1205 sbclr #0x05 - 004d 02bf 0055 call 0x0055 - 004f 0e01 lris $AC0.M, #0x01 - 0050 02bf 079b call 0x079b // SendMail_DCD1(0x0001) - 0052 1305 sbset #0x05 - 0053 029f 002b jmp 0x002b // jump back to MessageLoop() - -// - 0055 1202 sbclr #0x02 - 0056 1203 sbclr #0x03 - 0057 1204 sbclr #0x04 - 0058 1306 sbset #0x06 - 0059 8e00 set16 - 005a 8c00 clr15 - 005b 8b00 m0 - 005c 009e ffff lri $AC0.M, #0xffff - 005e 1d1e mrr $WR0, $AC0.M - 005f 1d3e mrr $WR1, $AC0.M - 0060 1d5e mrr $WR2, $AC0.M - 0061 1d7e mrr $WR3, $AC0.M - 0062 0092 00ff lri $CR, #0x00ff - 0064 02df ret - -// ReadWholeMessage() - 0065 0081 0358 lri $AR1, #0x0358 - 0067 0090 0000 lri $AC0.H, #0x0000 - 0069 0c00 lris $AC0.L, #0x00 - 006a 007e 006f bloop $AC0.M, 0x006f - 006c 193e lrri $AC0.M, @$AR1 - 006d 1b1e srri @$AR0, $AC0.M - 006e 193e lrri $AC0.M, @$AR1 - 006f 1b1e srri @$AR0, $AC0.M - 0070 02df ret - -// Opcode_03() (dummy) - 0071 029f 0041 jmp 0x0041 - -// Opcode jump table (16 opcodes available) - 0073 029f 0041 jmp 0x0041 // 0 (dummy) - 0075 029f 0093 jmp 0x0093 // 1 (DsetupTable) - 0077 029f 029d jmp 0x029d // 2 (SyncFrame) - 0079 029f 0071 jmp 0x0071 // 3 (dummy) - 007b 029f 0616 jmp 0x0616 // 4 () - 007d 029f 0628 jmp 0x0628 // 5 () - 007f 029f 0041 jmp 0x0041 // 6 (dummy) - 0081 029f 055f jmp 0x055f // 7 () - 0083 029f 05ab jmp 0x05ab // 8 () - 0085 029f 058f jmp 0x058f // 9 () - 0087 029f 0041 jmp 0x0041 // A (dummy) - 0089 029f 0041 jmp 0x0041 // B (dummy) - 008b 029f 0041 jmp 0x0041 // C (dummy) - 008d 029f 00bd jmp 0x00bd // D (DsetDolbyDelay) - 008f 029f 00b0 jmp 0x00b0 // E () - 0091 029f 0041 jmp 0x0041 // F (dummy) - -// Opcode_01() - DsetupTable -// Message body: 5 mails -// Mail 1: bit0-15 = max (see inner loop of SyncFrame), bit16-32 = 0, bit24-30 = command (0x01) -// Mail 2: Address in main memory of parameter blocks used during mixing; there are X blocks of 384 bytes (192 words) each -// Mail 3: Address in main memory of something (640 words copied to 0x0000) -// Mail 4: Address in main memory of something (32 words copied to 0x0300) -// Mail 5: Address in main memory of other parameter blocks; there are 4 blocks (or more?) of 32 bytes (16 words) each -// Stores the mail body to 0x0380. - 0093 0080 0380 lri $AR0, #0x0380 - 0095 0e04 lris $AC0.M, #0x04 - 0096 02bf 0065 call 0x0065 - 0098 0081 0382 lri $AR1, #0x0382 - 009a 009f 0000 lri $AC1.M, #0x0000 - 009c 0080 0280 lri $AR0, #0x0280 - 009e 02bf 05e6 call 0x05e6 // DmaCopy(0x0000, Dword[0x0382], 0x280) - 00a0 0081 0384 lri $AR1, #0x0384 - 00a2 009f 0300 lri $AC1.M, #0x0300 - 00a4 0080 0020 lri $AR0, #0x0020 - 00a6 02bf 05e6 call 0x05e6 // DmaCopy(0x0300, Dword[0x0384], 32) - 00a8 00de 0345 lr $AC0.M, @0x0345 - 00aa 00fe 0342 sr @0x0342, $AC0.M - 00ac 02bf 0d01 call 0x0d01 - 00ae 029f 0041 jmp 0x0041 - -// Opcode_0E() - 00b0 0080 037d lri $AR0, #0x037d - 00b2 0e01 lris $AC0.M, #0x01 - 00b3 02bf 0065 call 0x0065 - 00b5 00de 037d lr $AC0.M, @0x037d - 00b7 0240 7fff andi $AC0.M, #0x7fff - 00b9 00fe 037d sr @0x037d, $AC0.M - 00bb 029f 0041 jmp 0x0041 - -// Opcode_0D() - DsetDolbyDelay - 00bd 0080 0374 lri $AR0, #0x0374 - 00bf 0e01 lris $AC0.M, #0x01 - 00c0 00fe 0377 sr @0x0377, $AC0.M - 00c2 00fe 037c sr @0x037c, $AC0.M - 00c4 02bf 0065 call 0x0065 - 00c6 00de 0345 lr $AC0.M, @0x0345 - 00c8 00fe 0376 sr @0x0376, $AC0.M - 00ca 029f 0041 jmp 0x0041 - -// read PB - 00cc 0081 034c lri $AR1, #0x034c - 00ce 009f 0400 lri $AC1.M, #0x0400 - 00d0 0080 00c0 lri $AR0, #0x00c0 - 00d2 02bf 05e6 call 0x05e6 // DmaCopy(0x0400, Dword[0x034C], 192) - 00d4 02df ret - -// writeback PB - 00d5 0081 034c lri $AR1, #0x034c - 00d7 009f 0400 lri $AC1.M, #0x0400 - 00d9 0080 0080 lri $AR0, #0x0080 - 00db 0081 034c lri $AR1, #0x034c - 00dd 193e lrri $AC0.M, @$AR1 - 00de 193c lrri $AC0.L, @$AR1 - 00df 0098 0000 lri $AX0.L, #0x0000 - 00e1 7000 addaxl $ACC0, $AX0.L - 00e2 02bf 05f5 call 0x05f5 // DmaCopy(Dword[0x034C], 0x0400, 128) - 00e4 02df ret - -// - 00e5 191e lrri $AC0.M, @$AR0 - 00e6 191a lrri $AX0.H, @$AR0 - 00e7 005f loop $AC1.M - 00e8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 00e9 1b7e srri @$AR3, $AC0.M - 00ea 1b7a srri @$AR3, $AX0.H - 00eb 02df ret - -// memcpy(destination, source, length) -// AR0 = source address -// AR3 = destination address -// AC1.M = length in dwords - 00ec 0000 nop - 00ed 007f 00f2 bloop $AC1.M, 0x00f2 - 00ef 191e lrri $AC0.M, @$AR0 - 00f0 1b7e srri @$AR3, $AC0.M - 00f1 191e lrri $AC0.M, @$AR0 - 00f2 1b7e srri @$AR3, $AC0.M - 00f3 0000 nop - 00f4 02df ret - -// - 00f5 191e lrri $AC0.M, @$AR0 - 00f6 191a lrri $AX0.H, @$AR0 - 00f7 007f 00fc bloop $AC1.M, 0x00fc - 00f9 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 00fa 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 00fb 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 00fc 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 00fd 0000 nop - 00fe 02df ret - -// multiply routine -// AC1.M = size in words -// AR0 = source addres -// AR3 = destination address - 00ff 8a00 m2 // multiply result by 2 - 0100 157f lsr $ACC1, #-1 // size >>= 1 (process buffers per dwords) - 0101 1c20 mrr $AR1, $AR0 // AR1 = AR0 - 0102 1c03 mrr $AR0, $AR3 // AR0 = AR3 - 0103 193a lrri $AX0.H, @$AR1 // AX0.H = Mem[AR1]; AR1++; - 0104 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 // prod = AX0.L * AX0.H; AX0.H = Mem[AR1]; AR1++; - 0105 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 // AC0.M = prod; AC0.L = 0; prod = AX0.L * AX0.H; AX1.H = Mem[AR3]; AR3++; - - 0106 007f 010b bloop $AC1.M, 0x010b - 0108 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 // ACC0 += AX1.H; AX0.H = Mem[AR1]; AR1++; - 0109 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H // AC0.M = prod; AC0.L = 0; prod = AX0.L * AX0.H; ... - 010a 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 010b 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - - 010c 8b00 m0 // don't multiply result - 010d 02df ret - -// - 010e 8a00 m2 - 010f 191a lrri $AX0.H, @$AR0 - 0110 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 - 0111 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0112 005f loop $AC1.M - 0113 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M - 0114 8b00 m0 - 0115 02df ret - -// ClearBuffers() -// clears: -// - 80 words at 0x0D00 (right buffer #1) -// - 80 words at 0x0D60 (left buffer #1) -// - 80 words at 0x0CA0 (left buffer #2) -// - 80 words at 0x0F40 (right buffer #2) -// - 80 words at 0x0FA0 -// - 80 words at 0x0A00 -// - 80 words at 0x09A0 -// - 80 words at 0x0DC8 -// - 80 words at 0x0E28 -// - 80 words at 0x0E88 -// - 80 words at 0x0EE8 -// copies: -// - 8 words from 0x0E10 to 0x0DC0 -// - 8 words from 0x0E70 to 0x0E20 -// - 8 words from 0x0ED0 to 0x0E80 -// - 8 words from 0x0F30 to 0x0EE0 - 0116 8100 clr $ACC0 - 0117 8900 clr $ACC1 - 0118 0e50 lris $AC0.M, #0x50 - 0119 0080 0d00 lri $AR0, #0x0d00 - 011b 005e loop $AC0.M - 011c 1b1f srri @$AR0, $AC1.M - 011d 0080 0d60 lri $AR0, #0x0d60 - 011f 005e loop $AC0.M - 0120 1b1f srri @$AR0, $AC1.M - 0121 00da 0374 lr $AX0.H, @0x0374 - 0123 8600 tstaxh $AX0.H - 0124 02b5 0f35 callz 0x0f35 // call this mixer if right buffer address is 0??? uh??? - 0126 8100 clr $ACC0 - 0127 8900 clr $ACC1 - 0128 0e50 lris $AC0.M, #0x50 - 0129 0080 0ca0 lri $AR0, #0x0ca0 - 012b 005e loop $AC0.M - 012c 1b1f srri @$AR0, $AC1.M - 012d 0080 0f40 lri $AR0, #0x0f40 - 012f 005e loop $AC0.M - 0130 1b1f srri @$AR0, $AC1.M - 0131 0080 0fa0 lri $AR0, #0x0fa0 - 0133 005e loop $AC0.M - 0134 1b1f srri @$AR0, $AC1.M - 0135 0080 0a00 lri $AR0, #0x0a00 - 0137 005e loop $AC0.M - 0138 1b1f srri @$AR0, $AC1.M - 0139 0080 09a0 lri $AR0, #0x09a0 - 013b 005e loop $AC0.M - 013c 1b1f srri @$AR0, $AC1.M - 013d 0f04 lris $AC1.M, #0x04 - 013e 0080 0e10 lri $AR0, #0x0e10 - 0140 0083 0dc0 lri $AR3, #0x0dc0 - 0142 02bf 00ec call 0x00ec // memcpy(0x0DC0, 0x0E10, 4); - 0144 0080 0e70 lri $AR0, #0x0e70 - 0146 0083 0e20 lri $AR3, #0x0e20 - 0148 02bf 00ec call 0x00ec // memcpy(0x0E20, 0x0E70, 4); - 014a 0080 0ed0 lri $AR0, #0x0ed0 - 014c 0083 0e80 lri $AR3, #0x0e80 - 014e 02bf 00ec call 0x00ec // memcpy(0x0E80, 0x0ED0, 4); - 0150 0080 0f30 lri $AR0, #0x0f30 - 0152 0083 0ee0 lri $AR3, #0x0ee0 - 0154 02bf 00ec call 0x00ec // memcpy(0x0EE0, 0x0F30, 4); - 0156 8100 clr $ACC0 - 0157 0e50 lris $AC0.M, #0x50 - 0158 8900 clr $ACC1 - 0159 0080 0dc8 lri $AR0, #0x0dc8 - 015b 005e loop $AC0.M - 015c 1b1f srri @$AR0, $AC1.M - 015d 0080 0e28 lri $AR0, #0x0e28 - 015f 005e loop $AC0.M - 0160 1b1f srri @$AR0, $AC1.M - 0161 0080 0e88 lri $AR0, #0x0e88 - 0163 005e loop $AC0.M - 0164 1b1f srri @$AR0, $AC1.M - 0165 0080 0ee8 lri $AR0, #0x0ee8 - 0167 005e loop $AC0.M - 0168 1b1f srri @$AR0, $AC1.M - 0169 02df ret - -// - 016a 009f 0580 lri $AC1.M, #0x0580 - 016c 009b 00a0 lri $AX1.H, #0x00a0 - 016e 0081 0393 lri $AR1, #0x0393 - 0170 18bc lrrd $AC0.L, @$AR1 // AC0.L = Mem[0x0393]; - 0171 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 // AC0.M = Mem[0x0392]; - 0172 bc00 mulxac $AX0.H, $AX1.H, $ACC0 // ACC0 += (AX0.H * AX1.H); (Mem[0x03A4] * 160) - 0173 0080 0050 lri $AR0, #0x0050 - 0175 02bf 05e8 call 0x05e8 // DmaCopy(0x0580, ((Dword[0x0392 << 16) | Dword[0x0393]) + (Mem[0x03A4] * 160), 80); - 0177 02df ret - -// - 0178 00df 03a1 lr $AC1.M, @0x03a1 - 017a 0508 addis $ACC1, #0x08 - 017b 0080 0580 lri $AR0, #0x0580 - 017d 1c7f mrr $AR3, $AC1.M - 017e 0098 7fff lri $AX0.L, #0x7fff - 0180 8900 clr $ACC1 - 0181 0f50 lris $AC1.M, #0x50 - 0182 02bf 00ff call 0x00ff // mult routine - 0184 02df ret - -// mix? - 0185 00c0 03a0 lr $AR0, @0x03a0 - 0187 191a lrri $AX0.H, @$AR0 // AX0.H = Mem[0x03A4]; - 0188 02bf 016a call 0x016a // get music? - 018a 02bf 0178 call 0x0178 - 018c 8100 clr $ACC0 - 018d 8900 clr $ACC1 - 018e 00de 0390 lr $AC0.M, @0x0390 // First word of PB: status; 1 = playing, 0 = not playing - 0190 02a0 0001 andf $AC0.M, #0x0001 - 0192 029d 019b jlz 0x019b - 0194 0080 0398 lri $AR0, #0x0398 // - 0196 0e08 lris $AC0.M, #0x08 - 0197 00c1 03a1 lr $AR1, @0x03a1 - 0199 02bf 0c43 call 0x0c43 // ??? - 019b 0f50 lris $AC1.M, #0x50 - 019c 00c0 03a1 lr $AR0, @0x03a1 - 019e 00da 0394 lr $AX0.H, @0x0394 // - 01a0 8600 tstaxh $AX0.H - 01a1 0295 01a8 jz 0x01a8 - 01a3 1c7a mrr $AR3, $AX0.H - 01a4 00d8 0395 lr $AX0.L, @0x0395 - 01a6 02bf 00ff call 0x00ff // mult routine - 01a8 0f50 lris $AC1.M, #0x50 - 01a9 00c0 03a1 lr $AR0, @0x03a1 - 01ab 00da 0396 lr $AX0.H, @0x0396 - 01ad 8600 tstaxh $AX0.H - 01ae 0295 01b5 jz 0x01b5 - 01b0 1c7a mrr $AR3, $AX0.H - 01b1 00d8 0397 lr $AX0.L, @0x0397 - 01b3 02bf 00ff call 0x00ff - 01b5 00de 0390 lr $AC0.M, @0x0390 - 01b7 02a0 0002 andf $AC0.M, #0x0002 - 01b9 02dd retlz - 01ba 0080 0398 lri $AR0, #0x0398 - 01bc 0e08 lris $AC0.M, #0x08 - 01bd 00c1 03a1 lr $AR1, @0x03a1 - 01bf 02bf 0c43 call 0x0c43 - 01c1 02df ret - -// mix background music? called by cmd 02 (SyncFrame) -// uses the 4 first PBs -// so these PBs would be for background music? - 01c2 8900 clr $ACC1 - 01c3 009f 0dc0 lri $AC1.M, #0x0dc0 - 01c5 00ff 03a1 sr @0x03a1, $AC1.M - 01c7 009f 03a8 lri $AC1.M, #0x03a8 - 01c9 00ff 03a2 sr @0x03a2, $AC1.M - 01cb 009f 03a4 lri $AC1.M, #0x03a4 - 01cd 00ff 03a0 sr @0x03a0, $AC1.M - - 01cf 1104 01ef bloopi #0x04, 0x01ef // Perform mixing for 4 PBs - 01d1 00c0 03a2 lr $AR0, @0x03a2 // Inited to 0x03A8 - 01d3 0083 0390 lri $AR3, #0x0390 - 01d5 8900 clr $ACC1 - 01d6 0f08 lris $AC1.M, #0x08 - 01d7 02bf 00ec call 0x00ec // memcpy(0x0390, Mem[0x03A2], 8); Copy the current PB to 0x0390 - 01d9 00da 0390 lr $AX0.H, @0x0390 - 01db 8600 tstaxh $AX0.H - 01dc 0295 01e0 jz 0x01e0 // skip the call below if [0x0390] is nonzero? ([0x0390] = first word of PB, probably start/stop flag?) - 01de 02bf 0185 call 0x0185 // mix? - 01e0 8100 clr $ACC0 - 01e1 00de 03a2 lr $AC0.M, @0x03a2 - 01e3 0410 addis $ACC0, #0x10 // Increment address to next PB - 01e4 00fe 03a2 sr @0x03a2, $AC0.M - 01e6 00de 03a1 lr $AC0.M, @0x03a1 - 01e8 0460 addis $ACC0, #0x60 // Increment another value (buffer address???) - 01e9 00fe 03a1 sr @0x03a1, $AC0.M - 01eb 00de 03a0 lr $AC0.M, @0x03a0 - 01ed 7400 incm $AC0.M // Increment another value (address of something) - 01ee 00fe 03a0 sr @0x03a0, $AC0.M - - 01f0 00da 0374 lr $AX0.H, @0x0374 - 01f2 8600 tstaxh $AX0.H - 01f3 0294 0219 jnz 0x0219 - 01f5 0f50 lris $AC1.M, #0x50 - 01f6 0080 0be0 lri $AR0, #0x0be0 - 01f8 0083 0e80 lri $AR3, #0x0e80 - 01fa 0098 7fff lri $AX0.L, #0x7fff // +32767 - 01fc 02bf 00ff call 0x00ff // mult routine - 01fe 0f50 lris $AC1.M, #0x50 - 01ff 0080 0be0 lri $AR0, #0x0be0 - 0201 0083 0ee0 lri $AR3, #0x0ee0 - 0203 0098 b820 lri $AX0.L, #0xb820 // -18400 - 0205 02bf 00ff call 0x00ff // mult routine - 0207 0f28 lris $AC1.M, #0x28 - 0208 0080 0c68 lri $AR0, #0x0c68 - 020a 0083 0e80 lri $AR3, #0x0e80 - 020c 0098 b820 lri $AX0.L, #0xb820 // -18400 - 020e 02bf 00ff call 0x00ff // mult routine - 0210 0f28 lris $AC1.M, #0x28 - 0211 0080 0c68 lri $AR0, #0x0c68 - 0213 0083 0ee0 lri $AR3, #0x0ee0 - 0215 0098 7fff lri $AX0.L, #0x7fff // +32767 - 0217 02bf 00ff call 0x00ff // mult routine - // clear buffers at 0x0BE0 and 0x0C40 (80 words(160 bytes) each) - 0219 8100 clr $ACC0 - 021a 8900 clr $ACC1 - 021b 0e50 lris $AC0.M, #0x50 - 021c 0080 0be0 lri $AR0, #0x0be0 - 021e 005e loop $AC0.M - 021f 1b1f srri @$AR0, $AC1.M - 0220 0080 0c40 lri $AR0, #0x0c40 - 0222 005e loop $AC0.M - 0223 1b1f srri @$AR0, $AC1.M - 0224 02df ret - -// - 0225 00c0 03a0 lr $AR0, @0x03a0 - 0227 181a lrr $AX0.H, @$AR0 - 0228 8100 clr $ACC0 - 0229 181e lrr $AC0.M, @$AR0 - 022a 00db 0391 lr $AX1.H, @0x0391 - 022c 7400 incm $AC0.M - 022d d100 cmpar $ACC1, $AX0.H - 022e 0270 ifns - 022f 8100 clr $ACC0 - 0230 1b1e srri @$AR0, $AC0.M - 0231 00df 03a1 lr $AC1.M, @0x03a1 - 0233 009b 00a0 lri $AX1.H, #0x00a0 - 0235 0081 0393 lri $AR1, #0x0393 - 0237 18bc lrrd $AC0.L, @$AR1 - 0238 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0239 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 023a 0080 0050 lri $AR0, #0x0050 - 023c 02bf 05f5 call 0x05f5 // DmaCopy((Mem[0x0392] << 16 | Mem[0x0393]), Mem[0x03A1], 80); - 023e 02df ret - -// another mixer? - 023f 00da 0374 lr $AX0.H, @0x0374 - 0241 8600 tstaxh $AX0.H - 0242 0294 0258 jnz 0x0258 - 0244 8900 clr $ACC1 - 0245 0f28 lris $AC1.M, #0x28 - 0246 0080 0c40 lri $AR0, #0x0c40 - 0248 0083 0ea8 lri $AR3, #0x0ea8 - 024a 0098 b820 lri $AX0.L, #0xb820 - 024c 02bf 00ff call 0x00ff - 024e 8900 clr $ACC1 - 024f 0f28 lris $AC1.M, #0x28 - 0250 0080 0c40 lri $AR0, #0x0c40 - 0252 0083 0f08 lri $AR3, #0x0f08 - 0254 0098 7fff lri $AX0.L, #0x7fff - 0256 02bf 00ff call 0x00ff - 0258 009f 0dc0 lri $AC1.M, #0x0dc0 - 025a 00ff 03a1 sr @0x03a1, $AC1.M - 025c 009f 03a8 lri $AC1.M, #0x03a8 - 025e 00ff 03a2 sr @0x03a2, $AC1.M - 0260 009f 03a4 lri $AC1.M, #0x03a4 - 0262 00ff 03a0 sr @0x03a0, $AC1.M - - 0264 1104 0282 bloopi #0x04, 0x0282 - 0266 00c0 03a2 lr $AR0, @0x03a2 - 0268 0083 0390 lri $AR3, #0x0390 - 026a 0f08 lris $AC1.M, #0x08 - 026b 02bf 00ec call 0x00ec // memcpy(0x0390, Mem[0x03A2], 8); - 026d 00da 0390 lr $AX0.H, @0x0390 - 026f 8600 tstaxh $AX0.H - 0270 0295 0274 jz 0x0274 - 0272 02bf 0225 call 0x0225 - 0274 00de 03a2 lr $AC0.M, @0x03a2 - 0276 0410 addis $ACC0, #0x10 - 0277 00fe 03a2 sr @0x03a2, $AC0.M - 0279 00de 03a1 lr $AC0.M, @0x03a1 - 027b 0460 addis $ACC0, #0x60 - 027c 00fe 03a1 sr @0x03a1, $AC0.M - 027e 00de 03a0 lr $AC0.M, @0x03a0 - 0280 7400 incm $AC0.M - 0281 00fe 03a0 sr @0x03a0, $AC0.M - - 0283 02df ret - -// CopyPBs() -// Copies some main memory region to 0x03A8 -// The memory region contains what seems to be PBs... -// Each PB is 32 bytes (16 words) long -// The transfer copies 64 words, ie 4 PBs. -// There may be more PBs, though. Dunno... - 0284 0081 0386 lri $AR1, #0x0386 // address of PBs, set by DsetupTable - 0286 009f 03a8 lri $AC1.M, #0x03a8 - 0288 0080 0040 lri $AR0, #0x0040 - 028a 02bf 05e6 call 0x05e6 // DmaCopy(0x03A8, Dword[0x0386], 64) - 028c 02df ret - -// Helper -// Increment the 32-bit value at AR0 by the value -// in AX0.L. - 028d 191e lrri $AC0.M, @$AR0 - 028e 189c lrrd $AC0.L, @$AR0 - 028f 4800 addax $ACC0, $AX0.L - 0290 1b1e srri @$AR0, $AC0.M - 0291 1b1c srri @$AR0, $AC0.L - 0292 02df ret - -// WaitForNextSyncMessage() -// Note: the wait loop continues until two values become non-equal. -// One of these values is set when sync mails are received. -// These mails, as well as 'regular' mails, are processed by the -// exception 7 handler. That's why that wait loop never checks for -// new mails. - 0293 8100 clr $ACC0 - 0294 8900 clr $ACC1 - 0295 00df 0354 lr $AC1.M, @0x0354 - 0297 00de 034e lr $AC0.M, @0x034e - 0299 8200 cmp - 029a 0293 0293 jle 0x0293 - 029c 02df ret - -// Opcode_02() - SyncFrame -// Message body: 5 mails -// Mail 1: bit0-15 = some number, bit16-32 = number of buffers to fill, bit24-30 = command (0x02) -// Mail 2: Address of right buffers in main memory (each buffer is 160 bytes long) -// Mail 3: Address of left buffers in main memory (each buffer is 160 bytes long) -// Mail 4: unused (zero) -// Mail 5: unused (zero) -// Stores the message body to 0x0388 and 0x0374. -// Performs mixing synchronously with the game. - 029d 0080 0388 lri $AR0, #0x0388 - 029f 0081 0065 lri $AR1, #0x0065 - 02a1 0e02 lris $AC0.M, #0x02 // Copy only 2 mails. The 2 last mails are unused. - 02a2 173f callr $AR1 // Copy message body to 0x0388 - 02a3 02bf 0476 call 0x0476 // Copy message body to 0x0374 - 02a5 00de 0344 lr $AC0.M, @0x0344 - 02a7 00fe 0341 sr @0x0341, $AC0.M - 02a9 00de 0345 lr $AC0.M, @0x0345 - 02ab 00fe 038e sr @0x038e, $AC0.M // Mem[0x038E] = Mem[0x0345] (set by DsetupTable) - 02ad 8100 clr $ACC0 - 02ae 00fe 0355 sr @0x0355, $AC0.M - 02b0 02bf 0284 call 0x0284 // Copy 4 PBs to 0x03A8 - 02b2 0092 00ff lri $CR, #0x00ff - 02b4 00de 0341 lr $AC0.M, @0x0341 - - 02b6 007e 0471 bloop $AC0.M, 0x0471 // Outer loop: for(i = 0; i < number_of_buffers; i++) - 02b8 02bf 0116 call 0x0116 // ClearBuffers() - 02ba 02bf 01c2 call 0x01c2 // ??? mix background music? echo processing? - 02bc 02bf 04e2 call 0x04e2 // ??? again a mixer? - 02be 02bf 0a91 call 0x0a91 // ??? multiplications - 02c0 00de 0355 lr $AC0.M, @0x0355 - 02c2 7400 incm $AC0.M // increment some counter - 02c3 00fe 0355 sr @0x0355, $AC0.M - 02c5 8100 clr $ACC0 - 02c6 00fe 0354 sr @0x0354, $AC0.M // reset some counter - 02c8 00de 0342 lr $AC0.M, @0x0342 - - 02ca 007e 0415 bloop $AC0.M, 0x0415 // Inner loop: for(j = 0; j < max (usually 64; set by DsetupTable); j++) - 02cc 02bf 0293 call 0x0293 // WaitForNextSyncMessage() - 02ce 8100 clr $ACC0 - 02cf 8900 clr $ACC1 - 02d0 00de 0354 lr $AC0.M, @0x0354 - 02d2 147c lsr $ACC0, #-4 - 02d3 0200 04fc addi $AC0.M, #0x04fc - 02d5 1c1e mrr $AR0, $AC0.M - 02d6 181f lrr $AC1.M, @$AR0 - 02d7 00de 0354 lr $AC0.M, @0x0354 - 02d9 0240 000f andi $AC0.M, #0x000f - 02db 3d80 andc'ls $AC1.M : $AX0.L, $AC0.M - 02dc 03c0 8000 andcf $AC1.M, #0x8000 - 02de 029c 0411 jlnz 0x0411 // skip if (AC1.M & 0x8000) != 0x8000 - 02e0 00d8 0354 lr $AX0.L, @0x0354 - 02e2 009a 0180 lri $AX0.H, #0x0180 - 02e4 8100 clr $ACC0 - 02e5 00de 0380 lr $AC0.M, @0x0380 - 02e7 00dc 0381 lr $AC0.L, @0x0381 - 02e9 9000 mul $AX0.L, $AX0.H - 02ea 9400 mulac $AX0.L, $AX0.H, $ACC0 // ACC0 += (j * 384); - 02eb 00fe 034c sr @0x034c, $AC0.M - 02ed 00fc 034d sr @0x034d, $AC0.L - 02ef 02bf 00cc call 0x00cc // read PB; dma transfer from (Dword[0x0380] + (j*384)) to 0x0400, 192 words - 02f1 00da 0400 lr $AX0.H, @0x0400 - 02f3 8600 tstaxh $AX0.H - 02f4 0295 0411 jz 0x0411 // skip if Mem[0x0400] is zero - 02f6 00da 0401 lr $AX0.H, @0x0401 - 02f8 8600 tstaxh $AX0.H - 02f9 0294 0411 jnz 0x0411 // skip if Mem[0x0401] is nonzero - 02fb 00da 0433 lr $AX0.H, @0x0433 - 02fd 00fa 03f8 sr @0x03f8, $AX0.H // Mem[0x03F8] = Mem[0x0433] - 02ff 00da 0406 lr $AX0.H, @0x0406 - 0301 8600 tstaxh $AX0.H - 0302 0294 0ef5 jnz 0x0ef5 // jump to 0x0EF5 if Mem[0x0406] is nonzero - 0304 8100 clr $ACC0 - 0305 00de 0480 lr $AC0.M, @0x0480 // switch (Mem[0x0480]) ; sound format? - 0307 0609 cmpis $ACC0, #0x09 // case 0x09: (smg) - 0308 0295 031b jz 0x031b - 030a 0605 cmpis $ACC0, #0x05 // case 0x05: - 030b 0295 031b jz 0x031b - 030d 0608 cmpis $ACC0, #0x08 // case 0x08: - 030e 0295 0ac1 jz 0x0ac1 - 0310 0610 cmpis $ACC0, #0x10 // case 0x10: (smg) - 0311 0295 0b3e jz 0x0b3e - 0313 0620 cmpis $ACC0, #0x20 // case 0x20: - 0314 0295 0baf jz 0x0baf - 0316 0621 cmpis $ACC0, #0x21 // case 0x21: - 0317 0295 0bb7 jz 0x0bb7 - 0319 029f 09ae jmp 0x09ae // default: - // sound types 9 and 5 - // no compression? - 031b 00d8 0402 lr $AX0.L, @0x0402 // 0x0D71 - 031d 8100 clr $ACC0 - 031e 8900 clr $ACC1 - 031f 00dc 0430 lr $AC0.L, @0x0430 // 0x0000 - 0321 8d00 set15 - 0322 0950 lris $AX1.L, #0x50 - 0323 a000 mulx $AX0.L, $AX1.L - 0324 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0325 1404 lsl $ACC0, #4 // ACC0 = (Mem[0x0430] + (Mem[0x0402] * 80)) << 4; (AC0.L = 0x3500; AC0.M = 0x0043; AC0.H = 0x00;) - 0326 8c00 clr15 - 0327 1ffe mrr $AC1.M, $AC0.M // AC1.M = 0x0043; - 0328 0083 0580 lri $AR3, #0x0580 // AR3 = 0x0580; - 032a 02bf 086e call 0x086e - 032c 029f 032e jmp 0x032e - - 032e 0080 0580 lri $AR0, #0x0580 - 0330 0081 0520 lri $AR1, #0x0520 - 0332 0099 0000 lri $AX1.L, #0x0000 - 0334 02bf 0e75 call 0x0e75 // store ramp - - 0336 009e 0520 lri $AC0.M, #0x0520 - 0338 00fe 038f sr @0x038f, $AC0.M // Mem[0x038F] = 0x0520; - 033a 8900 clr $ACC1 - 033b 00df 0484 lr $AC1.M, @0x0484 - 033d 0340 001f andi $AC1.M, #0x001f - 033f b900 tst $ACC1 - 0340 0295 0366 jz 0x0366 - 0342 00de 038f lr $AC0.M, @0x038f - 0344 5c00 sub $ACC0, $AC1.L - 0345 00fe 038f sr @0x038f, $AC0.M // Mem[0x038F] -= AC1.L; uh? - 0347 1c7e mrr $AR3, $AC0.M - 0348 0080 0440 lri $AR0, #0x0440 - 034a 05fe addis $ACC1, #0xfe - 034b 02bf 00e5 call 0x00e5 // ??? - 034d 0080 0490 lri $AR0, #0x0490 - 034f 00c1 038f lr $AR1, @0x038f - 0351 8900 clr $ACC1 - 0352 00df 0484 lr $AC1.M, @0x0484 - 0354 0340 001f andi $AC1.M, #0x001f - 0356 02bf 0c62 call 0x0c62 // ??? - 0358 00de 038f lr $AC0.M, @0x038f - 035a 0450 addis $ACC0, #0x50 - 035b 1c1e mrr $AR0, $AC0.M - 035c 0083 0440 lri $AR3, #0x0440 - 035e 8900 clr $ACC1 - 035f 00df 0484 lr $AC1.M, @0x0484 - 0361 0340 001f andi $AC1.M, #0x001f - 0363 05fe addis $ACC1, #0xfe - 0364 02bf 00e5 call 0x00e5 // ??? - - 0366 00de 0484 lr $AC0.M, @0x0484 - 0368 0240 0020 andi $AC0.M, #0x0020 - 036a 0295 0388 jz 0x0388 - 036c 0080 04a4 lri $AR0, #0x04a4 - 036e 00c1 038f lr $AR1, @0x038f - 0370 0082 0454 lri $AR2, #0x0454 - 0372 0083 04a7 lri $AR3, #0x04a7 - 0374 18fa lrrd $AX0.H, @$AR3 - 0375 8600 tstaxh $AX0.H - 0376 0294 0386 jnz 0x0386 - 0378 18fa lrrd $AX0.H, @$AR3 - 0379 8600 tstaxh $AX0.H - 037a 0294 0386 jnz 0x0386 - 037c 18fa lrrd $AX0.H, @$AR3 - 037d 8600 tstaxh $AX0.H - 037e 0294 0386 jnz 0x0386 - 0380 8100 clr $ACC0 - 0381 18fe lrrd $AC0.M, @$AR3 - 0382 0280 7fff cmpi $AC0.M, #0x7fff - 0384 0295 0388 jz 0x0388 - 0386 02bf 0c7d call 0x0c7d // ??? - - 0388 8100 clr $ACC0 - 0389 00de 042c lr $AC0.M, @0x042c // 0x0001 - 038b b100 tst $ACC0 - 038c 0295 0392 jz 0x0392 - 038e 02bf 0dc3 call 0x0dc3 // ??? - 0390 029f 0407 jmp 0x0407 - - 0392 8100 clr $ACC0 - 0393 1c9e mrr $IX0, $AC0.M - 0394 1cde mrr $IX2, $AC0.M - 0395 7400 incm $AC0.M - 0396 1cfe mrr $IX3, $AC0.M - 0397 8100 clr $ACC0 - 0398 00de 0407 lr $AC0.M, @0x0407 - 039a b100 tst $ACC0 - 039b 0295 03aa jz 0x03aa - 039d 00c3 038f lr $AR3, @0x038f - 039f 0007 dar $AR3 - 03a0 0080 0477 lri $AR0, #0x0477 - 03a2 0084 ffff lri $IX0, #0xffff - 03a4 0087 ffff lri $IX3, #0xffff - 03a6 199a lrrn $AX0.H, @$AR0 - 03a7 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - 03a8 005e loop $AC0.M - 03a9 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - 03aa 00da 0485 lr $AX0.H, @0x0485 - 03ac 8600 tstaxh $AX0.H - 03ad 0295 03c0 jz 0x03c0 - 03af 8900 clr $ACC1 - 03b0 0086 0005 lri $IX2, #0x0005 - 03b2 0082 040a lri $AR2, #0x040a - - 03b4 1106 03b8 bloopi #0x06, 0x03b8 - 03b6 18de lrrd $AC0.M, @$AR2 - 03b7 147f lsr $ACC0, #-1 - 03b8 4d36 add'sn $ACC1, $AC0.L : @$AR2, $AC0.M - - 03b9 b900 tst $ACC1 - 03ba 0294 03c0 jnz 0x03c0 - 03bc 009a 0001 lri $AX0.H, #0x0001 - 03be 00fa 0401 sr @0x0401, $AX0.H // Key Off - 03c0 8f00 set40 - 03c1 0086 0002 lri $IX2, #0x0002 - 03c3 0082 0408 lri $AR2, #0x0408 - - 03c5 1106 03f0 bloopi #0x06, 0x03f0 - 03c7 8100 clr $ACC0 - 03c8 195e lrri $AC0.M, @$AR2 - 03c9 1200 sbclr #0x00 - 03ca b100 tst $ACC0 - 03cb 0275 ifz - 03cc 1300 sbset #0x00 - 03cd 1c7e mrr $AR3, $AC0.M - 03ce 195e lrri $AC0.M, @$AR2 - 03cf 195f lrri $AC1.M, @$AR2 - 03d0 5c00 sub $ACC0, $AC1.L - 03d1 14fb asr $ACC0, #-5 - 03d2 1f5e mrr $AX0.H, $AC0.M - 03d3 1f1c mrr $AX0.L, $AC0.L - 03d4 185e lrr $AC0.M, @$AR2 - 03d5 0240 00ff andi $AC0.M, #0x00ff - 03d7 1f7e mrr $AX1.H, $AC0.M - 03d8 185e lrr $AC0.M, @$AR2 - 03d9 1478 lsr $ACC0, #-8 - 03da 009c 0000 lri $AC0.L, #0x0000 - 03dc d100 cmpar $ACC1, $AX0.H - 03dd 0295 03e5 jz 0x03e5 - 03df 185e lrr $AC0.M, @$AR2 - 03e0 0272 ifg - 03e1 7400 incm $AC0.M - 03e2 0271 ifs - 03e3 7800 decm $AC0.M - 03e4 1a5e srr @$AR2, $AC0.M - 03e5 0006 dar $AR2 - 03e6 00de 038f lr $AC0.M, @0x038f - 03e8 5600 subr $ACC0, $AX1.H - 03e9 029d 03ee jlz 0x03ee - 03eb 1c1e mrr $AR0, $AC0.M - 03ec 02bf 0d99 call 0x0d99 // ??? - 03ee 0000 nop - 03ef 1b5f srri @$AR2, $AC1.M - 03f0 000a iar $AR2 - - 03f1 8e00 set16 - 03f2 8100 clr $ACC0 - 03f3 00de 0407 lr $AC0.M, @0x0407 - 03f5 b100 tst $ACC0 - 03f6 0295 0407 jz 0x0407 - 03f8 00c3 038f lr $AR3, @0x038f - 03fa 0087 004f lri $IX3, #0x004f - 03fc 001f addarn $AR3, $IX3 - 03fd 0080 0477 lri $AR0, #0x0477 - 03ff 0084 ffff lri $IX0, #0xffff - 0401 0087 ffff lri $IX3, #0xffff - 0403 19fa lrrn $AX0.H, @$AR3 - 0404 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 0405 005e loop $AC0.M - 0406 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - - 0407 00da 0406 lr $AX0.H, @0x0406 - 0409 8600 tstaxh $AX0.H - 040a 0294 040f jnz 0x040f // skip zeroing of Mem[0x0404] if Mem[0x0406] is nonzero - 040c 8100 clr $ACC0 - 040d 00fe 0404 sr @0x0404, $AC0.M // Mem[0x0404] = 0x0000; - 040f 02bf 00d5 call 0x00d5 // write back PB - 0411 00de 0354 lr $AC0.M, @0x0354 - 0413 7400 incm $AC0.M // increment some counter - 0414 00fe 0354 sr @0x0354, $AC0.M - // end of inner loop - 0416 0e00 lris $AC0.M, #0x00 - 0417 00fe 034e sr @0x034e, $AC0.M - 0419 0e04 lris $AC0.M, #0x04 - 041a 02bf 079b call 0x079b // SendMail_DCD1(0x0004) - 041c 00de 0355 lr $AC0.M, @0x0355 - 041e 0260 ff00 ori $AC0.M, #0xff00 - 0420 02bf 07a5 call 0x07a5 // SendMail_F355(0xFF00 | Mem[0x0355]) - 0422 02bf 0d1f call 0x0d1f // ??? - 0424 02bf 0d31 call 0x0d31 // ??? - 0426 02bf 0d86 call 0x0d86 // perform mults on buffer #1 - 0428 00de 0341 lr $AC0.M, @0x0341 - 042a 7800 decm $AC0.M // decrement some counter - 042b 00fe 0341 sr @0x0341, $AC0.M - 042d 0080 09a0 lri $AR0, #0x09a0 - 042f 0083 0d00 lri $AR3, #0x0d00 - 0431 0f50 lris $AC1.M, #0x50 - 0432 0098 5a82 lri $AX0.L, #0x5a82 - 0434 02bf 00ff call 0x00ff // operations on right buffer - 0436 0080 09a0 lri $AR0, #0x09a0 - 0438 0083 0d60 lri $AR3, #0x0d60 - 043a 0f50 lris $AC1.M, #0x50 - 043b 02bf 00ff call 0x00ff // operations on left buffer - 043d 0083 0d00 lri $AR3, #0x0d00 - 043f 02bf 0db1 call 0x0db1 // operations on right buffer - 0441 0081 0388 lri $AR1, #0x0388 - 0443 009f 0d00 lri $AC1.M, #0x0d00 - 0445 0080 0050 lri $AR0, #0x0050 - 0447 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0388], 0x0D00, 80); Copy the final right buffer to main memory - 0449 0080 0fa0 lri $AR0, #0x0fa0 - 044b 0083 0d60 lri $AR3, #0x0d60 - 044d 0f50 lris $AC1.M, #0x50 - 044e 0098 8000 lri $AX0.L, #0x8000 - 0450 02bf 00ff call 0x00ff // operations on left buffer (uh? again?) - 0452 0083 0d60 lri $AR3, #0x0d60 - 0454 02bf 0db1 call 0x0db1 // operations on left buffer - 0456 0081 038a lri $AR1, #0x038a - 0458 009f 0d60 lri $AC1.M, #0x0d60 - 045a 0080 0050 lri $AR0, #0x0050 - 045c 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x038A], 0x0D60, 80); Copy the final left buffer to main memory - 045e 009a 0000 lri $AX0.H, #0x0000 - 0460 0098 00a0 lri $AX0.L, #0x00a0 - 0462 0080 0388 lri $AR0, #0x0388 - 0464 02bf 028d call 0x028d // Increment right buffer address - 0466 0080 038a lri $AR0, #0x038a - 0468 02bf 028d call 0x028d // Increment left buffer address - 046a 02bf 023f call 0x023f // call that other mixer - 046c 02bf 04b1 call 0x04b1 - 046e 02bf 0488 call 0x0488 // copy other buffers to main memory - 0470 0000 nop - 0471 0000 nop - // end of outer loop - 0472 0080 002b lri $AR0, #0x002b - 0474 029f 0734 jmp 0x0734 - -// copy the message body to 0x0374 - 0476 0080 0374 lri $AR0, #0x0374 - 0478 0e02 lris $AC0.M, #0x02 - 0479 02bf 0067 call 0x0067 - 047b 00de 0374 lr $AC0.M, @0x0374 - 047d 0240 7fff andi $AC0.M, #0x7fff - 047f 00fe 0374 sr @0x0374, $AC0.M - 0481 00de 0376 lr $AC0.M, @0x0376 - 0483 0240 7fff andi $AC0.M, #0x7fff - 0485 00fe 0376 sr @0x0376, $AC0.M - 0487 02df ret - -// copy other buffers to main memory -// that's probably why the mail body of cmd 0x02 is copied -// to two locations... - 0488 00da 0374 lr $AX0.H, @0x0374 - 048a 8600 tstaxh $AX0.H // Return immediately if right buffer address is zero - 048b 02d5 retz // But what happens if the left buffer address is zero? - 048c 0083 0f40 lri $AR3, #0x0f40 - 048e 02bf 0db1 call 0x0db1 // copy right buffer - 0490 0083 0ca0 lri $AR3, #0x0ca0 - 0492 02bf 0db1 call 0x0db1 // copy left buffer - 0494 0081 0374 lri $AR1, #0x0374 - 0496 009f 0f40 lri $AC1.M, #0x0f40 - 0498 0080 0050 lri $AR0, #0x0050 - 049a 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0374], 0x0F40, 80); Right buffer - 049c 0081 0376 lri $AR1, #0x0376 - 049e 009f 0ca0 lri $AC1.M, #0x0ca0 - 04a0 0080 0050 lri $AR0, #0x0050 - 04a2 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0376], 0x0CA0, 80); Left buffer - 04a4 009a 0000 lri $AX0.H, #0x0000 - 04a6 0098 00a0 lri $AX0.L, #0x00a0 - 04a8 0080 0374 lri $AR0, #0x0374 - 04aa 02bf 028d call 0x028d // Increment right buffer address - 04ac 0080 0376 lri $AR0, #0x0376 - 04ae 02bf 028d call 0x028d // Increment left buffer address - 04b0 02df ret - -// - 04b1 00da 0374 lr $AX0.H, @0x0374 - 04b3 8600 tstaxh $AX0.H - 04b4 02d5 retz - 04b5 009f 0be0 lri $AC1.M, #0x0be0 - 04b7 00ff 03a1 sr @0x03a1, $AC1.M - 04b9 00df 03ca lr $AC1.M, @0x03ca - 04bb 00ff 0392 sr @0x0392, $AC1.M - 04bd 00df 03cb lr $AC1.M, @0x03cb - 04bf 00ff 0393 sr @0x0393, $AC1.M - 04c1 009f 03a6 lri $AC1.M, #0x03a6 - 04c3 00ff 03a0 sr @0x03a0, $AC1.M - 04c5 00df 03c9 lr $AC1.M, @0x03c9 - 04c7 00ff 0391 sr @0x0391, $AC1.M - 04c9 02bf 0225 call 0x0225 - 04cb 009f 0c40 lri $AC1.M, #0x0c40 - 04cd 00ff 03a1 sr @0x03a1, $AC1.M - 04cf 00df 03da lr $AC1.M, @0x03da - 04d1 00ff 0392 sr @0x0392, $AC1.M - 04d3 00df 03db lr $AC1.M, @0x03db - 04d5 00ff 0393 sr @0x0393, $AC1.M - 04d7 009f 03a7 lri $AC1.M, #0x03a7 - 04d9 00ff 03a0 sr @0x03a0, $AC1.M - 04db 00df 03d9 lr $AC1.M, @0x03d9 - 04dd 00ff 0391 sr @0x0391, $AC1.M - 04df 02bf 0225 call 0x0225 - 04e1 02df ret - -// mixer? - 04e2 00da 0374 lr $AX0.H, @0x0374 // Check if right buffer address is zero - 04e4 8600 tstaxh $AX0.H - 04e5 02d5 retz - 04e6 00da 03d8 lr $AX0.H, @0x03d8 // uh? - 04e8 8600 tstaxh $AX0.H - 04e9 02d5 retz - 04ea 0083 0be0 lri $AR3, #0x0be0 - 04ec 0080 0c30 lri $AR0, #0x0c30 - 04ee 0f04 lris $AC1.M, #0x04 - 04ef 02bf 00ec call 0x00ec // memcpy(0x0BE0, 0x0C30, 4); - 04f1 0083 0c40 lri $AR3, #0x0c40 - 04f3 0080 0c90 lri $AR0, #0x0c90 - 04f5 0f04 lris $AC1.M, #0x04 - 04f6 02bf 00ec call 0x00ec // memcpy(0x0C40, 0x0C90, 4); - 04f8 00df 03ca lr $AC1.M, @0x03ca - 04fa 00ff 0392 sr @0x0392, $AC1.M - 04fc 00df 03cb lr $AC1.M, @0x03cb - 04fe 00ff 0393 sr @0x0393, $AC1.M - 0500 00df 03a6 lr $AC1.M, @0x03a6 - 0502 7500 incm $AC1.M - 0503 1f5f mrr $AX0.H, $AC1.M - 0504 009f 0be8 lri $AC1.M, #0x0be8 - 0506 02bf 016c call 0x016c - 0508 00df 03da lr $AC1.M, @0x03da - 050a 00ff 0392 sr @0x0392, $AC1.M - 050c 00df 03db lr $AC1.M, @0x03db - 050e 00ff 0393 sr @0x0393, $AC1.M - 0510 00df 03a7 lr $AC1.M, @0x03a7 - 0512 7500 incm $AC1.M - 0513 1f5f mrr $AX0.H, $AC1.M - 0514 009f 0c48 lri $AC1.M, #0x0c48 - 0516 02bf 016c call 0x016c - 0518 00de 03c8 lr $AC0.M, @0x03c8 - 051a 02a0 0001 andf $AC0.M, #0x0001 - 051c 029d 0525 jlz 0x0525 - 051e 0080 03d0 lri $AR0, #0x03d0 - 0520 0e08 lris $AC0.M, #0x08 - 0521 0081 0be0 lri $AR1, #0x0be0 - 0523 02bf 0c43 call 0x0c43 - 0525 00de 03d8 lr $AC0.M, @0x03d8 - 0527 02a0 0001 andf $AC0.M, #0x0001 - 0529 029d 0532 jlz 0x0532 - 052b 0080 03e0 lri $AR0, #0x03e0 - 052d 0e08 lris $AC0.M, #0x08 - 052e 0081 0c40 lri $AR1, #0x0c40 - 0530 02bf 0c43 call 0x0c43 - 0532 0f50 lris $AC1.M, #0x50 - 0533 0080 0be0 lri $AR0, #0x0be0 - 0535 0083 0f40 lri $AR3, #0x0f40 - 0537 00d8 03cd lr $AX0.L, @0x03cd - 0539 02bf 00ff call 0x00ff - 053b 0f50 lris $AC1.M, #0x50 - 053c 0080 0c40 lri $AR0, #0x0c40 - 053e 0083 0ca0 lri $AR3, #0x0ca0 - 0540 00d8 03df lr $AX0.L, @0x03df - 0542 02bf 00ff call 0x00ff - 0544 00de 03c8 lr $AC0.M, @0x03c8 - 0546 02a0 0002 andf $AC0.M, #0x0002 - 0548 029d 0551 jlz 0x0551 - 054a 0080 03d0 lri $AR0, #0x03d0 - 054c 0e08 lris $AC0.M, #0x08 - 054d 0081 0be0 lri $AR1, #0x0be0 - 054f 02bf 0c43 call 0x0c43 - 0551 00de 03d8 lr $AC0.M, @0x03d8 - 0553 02a0 0002 andf $AC0.M, #0x0002 - 0555 029d 055e jlz 0x055e - 0557 0080 03e0 lri $AR0, #0x03e0 - 0559 0e08 lris $AC0.M, #0x08 - 055a 0081 0c40 lri $AR1, #0x0c40 - 055c 02bf 0c43 call 0x0c43 - 055e 02df ret - -// Opcode_07() - - 055f 0080 0346 lri $AR0, #0x0346 - 0561 02bf 0065 call 0x0065 - 0563 02bf 0065 call 0x0065 - 0565 0081 0346 lri $AR1, #0x0346 - 0567 193e lrri $AC0.M, @$AR1 - 0568 193c lrri $AC0.L, @$AR1 - 0569 009f 0400 lri $AC1.M, #0x0400 - 056b 00c0 0345 lr $AR0, @0x0345 - 056d 02bf 05e8 call 0x05e8 - 056f 0081 0348 lri $AR1, #0x0348 - 0571 193e lrri $AC0.M, @$AR1 - 0572 193c lrri $AC0.L, @$AR1 - 0573 009f 0800 lri $AC1.M, #0x0800 - 0575 00c0 0345 lr $AR0, @0x0345 - 0577 02bf 05e8 call 0x05e8 - 0579 0081 0346 lri $AR1, #0x0346 - 057b 193e lrri $AC0.M, @$AR1 - 057c 193c lrri $AC0.L, @$AR1 - 057d 009f 0800 lri $AC1.M, #0x0800 - 057f 00c0 0345 lr $AR0, @0x0345 - 0581 02bf 05f5 call 0x05f5 - 0583 0081 0348 lri $AR1, #0x0348 - 0585 193e lrri $AC0.M, @$AR1 - 0586 193c lrri $AC0.L, @$AR1 - 0587 009f 0400 lri $AC1.M, #0x0400 - 0589 00c0 0345 lr $AR0, @0x0345 - 058b 02bf 05f5 call 0x05f5 - 058d 029f 0041 jmp 0x0041 - -// Opcode_09() - - 058f 0080 0346 lri $AR0, #0x0346 - 0591 02bf 0065 call 0x0065 - 0593 02bf 0065 call 0x0065 - 0595 0081 0346 lri $AR1, #0x0346 - 0597 193e lrri $AC0.M, @$AR1 - 0598 193c lrri $AC0.L, @$AR1 - 0599 009f 0400 lri $AC1.M, #0x0400 - 059b 00c0 0345 lr $AR0, @0x0345 - 059d 02bf 05e8 call 0x05e8 - 059f 0081 0348 lri $AR1, #0x0348 - 05a1 193e lrri $AC0.M, @$AR1 - 05a2 193c lrri $AC0.L, @$AR1 - 05a3 009f 0400 lri $AC1.M, #0x0400 - 05a5 00c0 0345 lr $AR0, @0x0345 - 05a7 02bf 05f5 call 0x05f5 - 05a9 029f 0041 jmp 0x0041 - -// Opcode_08() - - 05ab 0080 0346 lri $AR0, #0x0346 - 05ad 02bf 0065 call 0x0065 - 05af 02bf 0065 call 0x0065 - 05b1 0081 0346 lri $AR1, #0x0346 - 05b3 193e lrri $AC0.M, @$AR1 - 05b4 193c lrri $AC0.L, @$AR1 - 05b5 009f 0400 lri $AC1.M, #0x0400 - 05b7 00c0 0344 lr $AR0, @0x0344 - 05b9 02bf 05e8 call 0x05e8 - 05bb 0081 0348 lri $AR1, #0x0348 - 05bd 193e lrri $AC0.M, @$AR1 - 05be 193c lrri $AC0.L, @$AR1 - 05bf 009f 0800 lri $AC1.M, #0x0800 - 05c1 00c0 0344 lr $AR0, @0x0344 - 05c3 02bf 05e8 call 0x05e8 - 05c5 0080 0400 lri $AR0, #0x0400 - 05c7 0083 0800 lri $AR3, #0x0800 - 05c9 0084 0000 lri $IX0, #0x0000 - 05cb 00da 0345 lr $AX0.H, @0x0345 - 05cd 00df 0344 lr $AC1.M, @0x0344 - 05cf 8f00 set40 - 05d0 197b lrri $AX1.H, @$AR3 - 05d1 b800 mulx $AX0.H, $AX1.H - 05d2 197b lrri $AX1.H, @$AR3 - 05d3 007f 05d8 bloop $AC1.M, 0x05d8 - 05d5 199e lrrn $AC0.M, @$AR0 - 05d6 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 05d7 80b2 nx'sl : $AC0.M, $AX1.H - 05d8 0000 nop - 05d9 8e00 set16 - 05da 0081 0346 lri $AR1, #0x0346 - 05dc 193e lrri $AC0.M, @$AR1 - 05dd 193c lrri $AC0.L, @$AR1 - 05de 009f 0400 lri $AC1.M, #0x0400 - 05e0 00c0 0344 lr $AR0, @0x0344 - 05e2 02bf 05f5 call 0x05f5 - 05e4 029f 0041 jmp 0x0041 - -// DmaCopy(destination, source, len) -// AR1 = source: pointer to the main memory (32-bit) address -// AC1.M = destination: DSP memory address -// AR0 = len: length in words - 05e6 193e lrri $AC0.M, @$AR1 - 05e7 193c lrri $AC0.L, @$AR1 - 05e8 2fcd srs @DSPA, $AC1.M - 05e9 0f00 lris $AC1.M, #0x00 - 05ea 2fc9 srs @DSCR, $AC1.M - 05eb 2ece srs @DSMAH, $AC0.M - 05ec 2ccf srs @DSMAL, $AC0.L - 05ed 1fe0 mrr $AC1.M, $AR0 - 05ee 1501 lsl $ACC1, #1 - 05ef 2fcb srs @DSBL, $AC1.M - 05f0 02bf 05f9 call 0x05f9 - 05f2 02df ret - -// DmaCopy(destination, source, len) -// AR1 = destination: pointer to the main memory (32-bit) address -// AC1.M = source: DSP memory address -// AR0 = len: length in words - 05f3 193e lrri $AC0.M, @$AR1 - 05f4 193c lrri $AC0.L, @$AR1 - 05f5 2fcd srs @DSPA, $AC1.M - 05f6 0f01 lris $AC1.M, #0x01 - 05f7 029f 05ea jmp 0x05ea - -// wait for dma completion? - 05f9 26c9 lrs $AC0.M, @DSCR - 05fa 02a0 0004 andf $AC0.M, #0x0004 - 05fc 029c 05f9 jlnz 0x05f9 - 05fe 02df ret - -// unused dma routine - 05ff 193e lrri $AC0.M, @$AR1 - 0600 193c lrri $AC0.L, @$AR1 - 0601 00ff ffcd sr @DSPA, $AC1.M - 0603 0f00 lris $AC1.M, #0x00 - 0604 00ff ffc9 sr @DSCR, $AC1.M - 0606 00fe ffce sr @DSMAH, $AC0.M - 0608 00fc ffcf sr @DSMAL, $AC0.L - 060a 1fe0 mrr $AC1.M, $AR0 - 060b 1501 lsl $ACC1, #1 - 060c 00ff ffcb sr @DSBL, $AC1.M - 060e 02df ret - -// - 060f 00de ffc9 lr $AC0.M, @DSCR - 0611 02a0 0004 andf $AC0.M, #0x0004 - 0613 029c 060f jlnz 0x060f - 0615 02df ret - -// Opcode_04() - - 0616 0080 0346 lri $AR0, #0x0346 - 0618 02bf 0065 call 0x0065 - 061a 02bf 0065 call 0x0065 // wtf? - 061c 0081 0346 lri $AR1, #0x0346 - 061e 00df 0349 lr $AC1.M, @0x0349 - 0620 0340 ffff andi $AC1.M, #0xffff - 0622 00c0 0345 lr $AR0, @0x0345 - 0624 02bf 05e6 call 0x05e6 // DmaCopy(0x0349, Dword[0x0346], Mem[0x0345]) - 0626 029f 0041 jmp 0x0041 - -// Opcode_05() - - 0628 0080 0346 lri $AR0, #0x0346 - 062a 02bf 0065 call 0x0065 - 062c 02bf 0065 call 0x0065 // wtf? - 062e 0081 0346 lri $AR1, #0x0346 - 0630 00df 0349 lr $AC1.M, @0x0349 - 0632 0340 ffff andi $AC1.M, #0xffff - 0634 00c0 0345 lr $AR0, @0x0345 - 0636 02bf 05f3 call 0x05f3 - 0638 029f 0041 jmp 0x0041 - -// ReadSoundData(addr) -// AC0.M:AC0.L = main memory address -// read 128 samples of PCM8 sound from main memory to DSP memory at 0x0B00 - 063a 1ffc mrr $AC1.M, $AC0.L - 063b 0340 001f andi $AC1.M, #0x001f - 063d 00ff 037f sr @0x037f, $AC1.M - 063f 1ffc mrr $AC1.M, $AC0.L - 0640 0340 ffe0 andi $AC1.M, #0xffe0 - 0642 1f9f mrr $AC0.L, $AC1.M - 0643 00df 037d lr $AC1.M, @0x037d - 0645 00dd 037e lr $AC1.L, @0x037e - 0647 4c00 add $ACC0, $AC1.L - 0648 00fe ffce sr @DSMAH, $AC0.M - 064a 00fc ffcf sr @DSMAL, $AC0.L - 064c 0f00 lris $AC1.M, #0x00 - 064d 00ff ffc9 sr @DSCR, $AC1.M - 064f 009f 0b20 lri $AC1.M, #0x0b20 - 0651 00ff ffcd sr @DSPA, $AC1.M - 0653 0f40 lris $AC1.M, #0x40 - 0654 00ff ffcb sr @DSBL, $AC1.M - 0656 00de ffc9 lr $AC0.M, @DSCR - 0658 02a0 0004 andf $AC0.M, #0x0004 - 065a 029c 0656 jlnz 0x0656 - 065c 1fe1 mrr $AC1.M, $AR1 - 065d 0081 0b00 lri $AR1, #0x0b00 // Dst = 0x0B00; - 065f 0080 0b20 lri $AR0, #0x0b20 // Src = 0x0B20; - // for(i = 0; i < 32; i++) - 0661 1120 066a bloopi #0x20, 0x066a - 0663 8100 clr $ACC0 - 0664 191e lrri $AC0.M, @$AR0 - 0665 1478 lsr $ACC0, #-8 - 0666 1b3e srri @$AR1, $AC0.M // Dst[i*2] = Src[i] >> 8; - 0667 1408 lsl $ACC0, #8 - 0668 0240 00ff andi $AC0.M, #0x00ff - 066a 1b3e srri @$AR1, $AC0.M // Dst[i*2 + 1] = Src[i] & 0xFF; - - 066b 1c3f mrr $AR1, $AC1.M // Keep AR1 value to 0x0B00 - 066c 029f 092b jmp 0x092b - 066e 02df ret - -// dma? - 066f 1fc3 mrr $AC0.M, $AR3 - 0670 043f addis $ACC0, #0x3f - 0671 0240 fff0 andi $AC0.M, #0xfff0 - 0673 00fe ffcd sr @DSPA, $AC0.M - 0675 1c1a mrr $AR0, $AX0.H - 0676 00da 037f lr $AX0.H, @0x037f - 0678 4400 addr $ACC0, $AX0.H - 0679 1f40 mrr $AX0.H, $AR0 - 067a 1c1e mrr $AR0, $AC0.M - 067b 1fda mrr $AC0.M, $AX0.H - 067c 041f addis $ACC0, #0x1f - 067d 0240 fff0 andi $AC0.M, #0xfff0 - 067f 1401 lsl $ACC0, #1 - 0680 00fe ffcb sr @DSBL, $AC0.M - 0682 00de ffc9 lr $AC0.M, @DSCR - 0684 02a0 0004 andf $AC0.M, #0x0004 - 0686 029c 0682 jlnz 0x0682 - 0688 007a 068b bloop $AX0.H, 0x068b - 068a 191e lrri $AC0.M, @$AR0 - 068b 1b7e srri @$AR3, $AC0.M - 068c 02df ret - -// setup DSMAH, DSMAL and DSCR (RAM -> DSP memory) - 068d 8900 clr $ACC1 - 068e 1ffc mrr $AC1.M, $AC0.L - 068f 0340 001f andi $AC1.M, #0x001f - 0691 00ff 037f sr @0x037f, $AC1.M - 0693 1ffc mrr $AC1.M, $AC0.L - 0694 0340 ffe0 andi $AC1.M, #0xffe0 // addr &= 0xFFFFFFE0; - 0696 1f9f mrr $AC0.L, $AC1.M - 0697 00df 037d lr $AC1.M, @0x037d // 0x1000 - 0699 00dd 037e lr $AC1.L, @0x037e // 0x0800 - 069b 4c00 add $ACC0, $AC1.L // addr += 0x10000800; - 069c 00fe ffce sr @DSMAH, $AC0.M - 069e 00fc ffcf sr @DSMAL, $AC0.L - 06a0 0f00 lris $AC1.M, #0x00 - 06a1 00ff ffc9 sr @DSCR, $AC1.M - 06a3 02df ret - -// setup DSPA and DSBL (and thus complete DMA transfer) -// memory transferred is stored (temporarily) to 0x0780 -// then it's copied to the address specified by AR3 - 06a4 00df 037f lr $AC1.M, @0x037f - 06a6 157f lsr $ACC1, #-1 - 06a7 00ff 037f sr @0x037f, $AC1.M - 06a9 02df ret - 06aa 8600 tstaxh $AX0.H - 06ab 02d5 retz - 06ac 1f1a mrr $AX0.L, $AX0.H - 06ad 009e 0780 lri $AC0.M, #0x0780 - 06af 00fe ffcd sr @DSPA, $AC0.M - 06b1 1fda mrr $AC0.M, $AX0.H - 06b2 043f addis $ACC0, #0x3f - 06b3 0240 ffe0 andi $AC0.M, #0xffe0 - 06b5 00fe ffcb sr @DSBL, $AC0.M - 06b7 00de ffc9 lr $AC0.M, @DSCR - 06b9 02a0 0004 andf $AC0.M, #0x0004 - 06bb 029c 06b7 jlnz 0x06b7 - 06bd 8100 clr $ACC0 - 06be 00de 037f lr $AC0.M, @0x037f - 06c0 147f lsr $ACC0, #-1 - 06c1 0200 0780 addi $AC0.M, #0x0780 - 06c3 1c1e mrr $AR0, $AC0.M - 06c4 00de 037f lr $AC0.M, @0x037f - 06c6 02a0 0001 andf $AC0.M, #0x0001 - 06c8 029d 06d1 jlz 0x06d1 - 06ca 8100 clr $ACC0 - 06cb 191e lrri $AC0.M, @$AR0 - 06cc 1488 asl $ACC0, #8 - 06cd 1b7e srri @$AR3, $AC0.M - 06ce 1fda mrr $AC0.M, $AX0.H - 06cf 7800 decm $AC0.M - 06d0 1f5e mrr $AX0.H, $AC0.M - 06d1 8100 clr $ACC0 - 06d2 1fda mrr $AC0.M, $AX0.H - 06d3 147f lsr $ACC0, #-1 - - 06d4 007e 06dd bloop $AC0.M, 0x06dd - 06d6 8100 clr $ACC0 - 06d7 181e lrr $AC0.M, @$AR0 - 06d8 0240 ff00 andi $AC0.M, #0xff00 - 06da 1b7e srri @$AR3, $AC0.M - 06db 191e lrri $AC0.M, @$AR0 - 06dc 1488 asl $ACC0, #8 - 06dd 1b7e srri @$AR3, $AC0.M - - 06de 1fda mrr $AC0.M, $AX0.H - 06df 1f58 mrr $AX0.H, $AX0.L - 06e0 02a0 0001 andf $AC0.M, #0x0001 - 06e2 02dd retlz - 06e3 8100 clr $ACC0 - 06e4 181e lrr $AC0.M, @$AR0 - 06e5 0240 ff00 andi $AC0.M, #0xff00 - 06e7 1b7e srri @$AR3, $AC0.M - 06e8 02df ret - -// Exception_0E() - 06e9 1205 sbclr #0x05 - 06ea 8e00 set16 - 06eb 00f0 03fd sr @0x03fd, $AC0.H - 06ed 00fc 03ff sr @0x03ff, $AC0.L - 06ef f400 lsr16 $ACC0 - 06f0 00fc 03fe sr @0x03fe, $AC0.L - 06f2 00fa 03fa sr @0x03fa, $AX0.H - 06f4 8100 clr $ACC0 - 06f5 00de fffe lr $AC0.M, @CMBH // check for new mail - 06f7 02c0 8000 andcf $AC0.M, #0x8000 - 06f9 029c 07ea jlnz 0x07ea // If we received no mail - 06fb 00da ffff lr $AX0.H, @CMBL - 06fd 8600 tstaxh $AX0.H - 06fe 0294 07c3 jnz 0x07c3 // If we received a mail beginning a list, WaitForNextMails() - - 0700 00de fffe lr $AC0.M, @CMBH // if we received an empty mail, wait for the next mail - 0702 02c0 8000 andcf $AC0.M, #0x8000 - 0704 029c 0700 jlnz 0x0700 - 0706 0240 000f andi $AC0.M, #0x000f // get the number in the high part of the mail - 0708 1f5e mrr $AX0.H, $AC0.M - 0709 7400 incm $AC0.M // number++; - 070a 0c00 lris $AC0.L, #0x00 - 070b 1404 lsl $ACC0, #4 // number <<= 4; - 070c 00fe 034e sr @0x034e, $AC0.M - 070e 1fda mrr $AC0.M, $AX0.H - 070f 1f40 mrr $AX0.H, $AR0 - 0710 0200 04fc addi $AC0.M, #0x04fc - 0712 1c1e mrr $AR0, $AC0.M - 0713 00de ffff lr $AC0.M, @CMBL - 0715 1a1e srr @$AR0, $AC0.M - 0716 1c1a mrr $AR0, $AX0.H - - 0717 00de 03fe lr $AC0.M, @0x03fe - 0719 00dc 03ff lr $AC0.L, @0x03ff - 071b 00d0 03fd lr $AC0.H, @0x03fd - 071d 00da 03fa lr $AX0.H, @0x03fa - 071f 1305 sbset #0x05 - 0720 02ff rti - -// DoYield() - 0721 009a 0002 lri $AX0.H, #0x0002 - 0723 00fa 03a3 sr @0x03a3, $AX0.H - 0725 00e0 03f9 sr @0x03f9, $AR0 - 0727 02bf 07ad call 0x07ad - 0729 16fc dcd1 si @DMBH, #0xdcd1 - 072b 16fd 0002 si @DMBL, #0x0002 - 072d 16fb 0001 si @DIRQ, #0x0001 - 072f 0021 halt - -// Function jump table - 0730 0748 cmpis $ACC1, #0x48 // Function 0: halt - 0731 0749 cmpis $ACC1, #0x49 // Function 1: dump memory? and halt - 0732 0789 cmpis $ACC1, #0x89 // Function 2: jump to 0x8000 and halt - 0733 078c cmpis $ACC1, #0x8c // Function 3: return to MessageLoop() - -// Execute function according to mail received (0xCDD1000X) -// Warning: any function number above 3 will likely crash -// as no range check is performed. -// AR0 = 0x002B - 0734 00e0 03f9 sr @0x03f9, $AR0 - 0736 009e 0005 lri $AC0.M, #0x0005 - 0738 02bf 079b call 0x079b // SendMail_DCD1(0x0005) - 073a 8e00 set16 - 073b 8100 clr $ACC0 - 073c 8900 clr $ACC1 - 073d 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 073f 27ff lrs $AC1.M, @CMBL - 0740 009e 0730 lri $AC0.M, #0x0730 - 0742 4c00 add $ACC0, $AC1.L - 0743 1c7e mrr $AR3, $AC0.M - 0744 0313 ilrr $AC1.M, @$AR3 - 0745 1c7f mrr $AR3, $AC1.M - 0746 176f jmpr $AR3 - 0747 0021 halt -// Function 0 - 0748 0021 halt -// Function 1 - 0749 009a 0002 lri $AX0.H, #0x0002 - 074b 00fa 03a3 sr @0x03a3, $AX0.H - 074d 8100 clr $ACC0 - 074e 8900 clr $ACC1 - 074f 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 0751 24ff lrs $AC0.L, @CMBL - 0752 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1() - 0754 25ff lrs $AC1.L, @CMBL - 0755 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1() - 0757 27ff lrs $AC1.M, @CMBL - 0758 2ece srs @DSMAH, $AC0.M - 0759 2ccf srs @DSMAL, $AC0.L - 075a 16c9 0001 si @DSCR, #0x0001 - 075c 2fcd srs @DSPA, $AC1.M - 075d 2dcb srs @DSBL, $AC1.L - 075e 8100 clr $ACC0 - 075f 8900 clr $ACC1 - 0760 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 0762 24ff lrs $AC0.L, @CMBL - 0763 1c9e mrr $IX0, $AC0.M - 0764 1cbc mrr $IX1, $AC0.L - 0765 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1() - 0767 25ff lrs $AC1.L, @CMBL - 0768 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1() - 076a 27ff lrs $AC1.M, @CMBL - 076b 1cdf mrr $IX2, $AC1.M - 076c 1cfd mrr $IX3, $AC1.L - 076d 8100 clr $ACC0 - 076e 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 0770 26ff lrs $AC0.M, @CMBL - 0771 1c1e mrr $AR0, $AC0.M - 0772 8900 clr $ACC1 - 0773 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1() - 0775 20ff lrs $AX0.L, @CMBL - 0776 1f5f mrr $AX0.H, $AC1.M - 0777 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 0779 21ff lrs $AX1.L, @CMBL - 077a 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0() - 077c 23ff lrs $AX1.H, @CMBL - 077d 26c9 lrs $AC0.M, @DSCR - 077e 02a0 0004 andf $AC0.M, #0x0004 - 0780 029c 077d jlnz 0x077d - 0782 1206 sbclr #0x06 - 0783 1203 sbclr #0x03 - 0784 1204 sbclr #0x04 - 0785 1205 sbclr #0x05 - 0786 029f 80b5 jmp 0x80b5 - 0788 0021 halt -// Function 2 - 0789 029f 8000 jmp 0x8000 - 078b 0021 halt -// Function 3 - 078c 00c0 03f9 lr $AR0, @0x03f9 - 078e 170f jmpr $AR0 - -// WaitUntilCPUMailboxIsFull_AC0() - 078f 26fe lrs $AC0.M, @CMBH - 0790 02c0 8000 andcf $AC0.M, #0x8000 - 0792 029c 078f jlnz 0x078f - 0794 02df ret - -// WaitUntilCPUMailboxIsFull_AC1() - 0795 27fe lrs $AC1.M, @CMBH - 0796 03c0 8000 andcf $AC1.M, #0x8000 - 0798 029c 0795 jlnz 0x0795 - 079a 02df ret - -// SendMail_DCD1() // seems to additionally trigger an IRQ - 079b 02bf 07b3 call 0x07b3 - 079d 16fc dcd1 si @DMBH, #0xdcd1 - 079f 2efd srs @DMBL, $AC0.M - 07a0 16fb 0001 si @DIRQ, #0x0001 - 07a2 02bf 07b3 call 0x07b3 - 07a4 02df ret - -// SendMail_F355() - 07a5 02bf 07b3 call 0x07b3 - 07a7 16fc f355 si @DMBH, #0xf355 - 07a9 2efd srs @DMBL, $AC0.M - 07aa 02bf 07b3 call 0x07b3 - 07ac 02df ret - -// WaitUntilMailboxIsReady_AC0() - 07ad 26fc lrs $AC0.M, @DMBH - 07ae 02c0 8000 andcf $AC0.M, #0x8000 - 07b0 029d 07ad jlz 0x07ad - 07b2 02df ret - -// WaitUntilMailboxIsReady_AC1() - 07b3 27fc lrs $AC1.M, @DMBH - 07b4 03c0 8000 andcf $AC1.M, #0x8000 - 07b6 029d 07b3 jlz 0x07b3 - 07b8 02df ret - -// InitGlobalVars() - 07b9 009a 0280 lri $AX0.H, #0x0280 - 07bb 00fa 0350 sr @0x0350, $AX0.H - 07bd 00fa 0351 sr @0x0351, $AX0.H - 07bf 0a00 lris $AX0.H, #0x00 - 07c0 00fa 0352 sr @0x0352, $AX0.H - 07c2 02df ret - -// WaitForNextMails() -// AX0.H: low part of current mail (num of mails to wait for) - 07c3 00e0 03fb sr @0x03fb, $AR0 - 07c5 00e8 03fc sr @0x03fc, $WR0 - 07c7 00c0 0350 lr $AR0, @0x0350 - 07c9 0088 002f lri $WR0, #0x002f - 07cb 1b1a srri @$AR0, $AX0.H - 07cc 00de fffe lr $AC0.M, @CMBH - 07ce 02c0 8000 andcf $AC0.M, #0x8000 - 07d0 029c 07cc jlnz 0x07cc - 07d2 00dc ffff lr $AC0.L, @CMBL - 07d4 1b1e srri @$AR0, $AC0.M - 07d5 1b1c srri @$AR0, $AC0.L - 07d6 1fda mrr $AC0.M, $AX0.H - 07d7 7800 decm $AC0.M - 07d8 1f5e mrr $AX0.H, $AC0.M - 07d9 8600 tstaxh $AX0.H - 07da 0294 07cc jnz 0x07cc - - 07dc 8100 clr $ACC0 - 07dd 00de 0352 lr $AC0.M, @0x0352 - 07df 7400 incm $AC0.M - 07e0 00fe 0352 sr @0x0352, $AC0.M - 07e2 00e0 0350 sr @0x0350, $AR0 - 07e4 00c0 03fb lr $AR0, @0x03fb - 07e6 00c8 03fc lr $WR0, @0x03fc - 07e8 029f 0717 jmp 0x0717 - - // noMail() - 07ea 00e0 03fb sr @0x03fb, $AR0 - 07ec 00e8 03fc sr @0x03fc, $WR0 - 07ee 00c0 0350 lr $AR0, @0x0350 - 07f0 0088 002f lri $WR0, #0x002f - 07f2 0a00 lris $AX0.H, #0x00 - 07f3 1b1a srri @$AR0, $AX0.H - 07f4 029f 07dc jmp 0x07dc - -// MessageLoop() - 07f6 00c0 0351 lr $AR0, @0x0351 - 07f8 0088 002f lri $WR0, #0x002f - 07fa 00da 0352 lr $AX0.H, @0x0352 - 07fc 8600 tstaxh $AX0.H - 07fd 0295 081e jz 0x081e // jump back to MessageLoop - 07ff 1205 sbclr #0x05 - 0800 00da 0352 lr $AX0.H, @0x0352 - 0802 1fda mrr $AC0.M, $AX0.H - 0803 7800 decm $AC0.M - 0804 00fe 0352 sr @0x0352, $AC0.M - 0806 1305 sbset #0x05 - 0807 0081 0356 lri $AR1, #0x0356 - 0809 191e lrri $AC0.M, @$AR0 - 080a 02c0 8000 andcf $AC0.M, #0x8000 - 080c 029d 0822 jlz 0x0822 // ??? - 080e 1f5e mrr $AX0.H, $AC0.M - 080f 8600 tstaxh $AX0.H - 0810 0295 0826 jz 0x0826 // Yield() - 0812 007a 0817 bloop $AX0.H, 0x0817 - 0814 191e lrri $AC0.M, @$AR0 - 0815 1b3e srri @$AR1, $AC0.M - 0816 191e lrri $AC0.M, @$AR0 - 0817 1b3e srri @$AR1, $AC0.M - 0818 00e0 0351 sr @0x0351, $AR0 - 081a 0088 ffff lri $WR0, #0xffff - 081c 029f 002d jmp 0x002d // jump to OpcodeHandler() - 081e 0088 ffff lri $WR0, #0xffff - 0820 029f 002b jmp 0x002b // jump back to MessageLoop() - -// - 0822 00e0 0351 sr @0x0351, $AR0 - 0824 029f 07fa jmp 0x07fa - -// Yield() - 0826 0080 07f6 lri $AR0, #0x07f6 - 0828 029f 0721 jmp 0x0721 // DoYield() (halts) - -// interesting - writes value(s) to output - 082a 8100 clr $ACC0 - 082b 0e10 lris $AC0.M, #0x10 - 082c 2232 lrs $AX0.H, @0x0032 - 082d 8600 tstaxh $AX0.H - 082e 02d5 retz - 082f 5400 subr $ACC0, $AX0.H - 0830 0200 0458 addi $AC0.M, #0x0458 // source addr = (0x10 - Mem[0x0032]) + 0x0458 - 0832 1c1e mrr $AR0, $AC0.M - 0833 1fda mrr $AC0.M, $AX0.H - 0834 04fe addis $ACC0, #0xfe - 0835 1f1e mrr $AX0.L, $AC0.M // AX0.L = Mem[0x0032] - 2; - 0836 191e lrri $AC0.M, @$AR0 - 0837 0291 083d js 0x083d - 0839 191a lrri $AX0.H, @$AR0 - - 083a 0058 loop $AX0.L - 083b 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - - 083c 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 083d 1b7e srri @$AR3, $AC0.M // store value to output - 083e 02df ret - -// - 083f 02bf 082a call 0x082a - 0841 8100 clr $ACC0 - 0842 2632 lrs $AC0.M, @0x0032 - 0843 5c00 sub $ACC0, $AC1.L - 0844 2e32 srs @0x0032, $AC0.M - 0845 0092 00ff lri $CR, #0x00ff - 0847 02df ret - -// increment one value, then zero out other values - 0848 00de 04fb lr $AC0.M, @0x04fb - 084a 7400 incm $AC0.M - 084b 00fe 04fb sr @0x04fb, $AC0.M - 084d 8100 clr $ACC0 - 084e 2e32 srs @0x0032, $AC0.M - 084f 2e66 srs @0x0066, $AC0.M - 0850 2e67 srs @0x0067, $AC0.M - 0851 268a lrs $AC0.M, @0xff8a - 0852 248b lrs $AC0.L, @0xff8b - 0853 2e3a srs @0x003a, $AC0.M - 0854 2c3b srs @0x003b, $AC0.L - 0855 268c lrs $AC0.M, @0xff8c - 0856 248d lrs $AC0.L, @0xff8d - 0857 2e38 srs @0x0038, $AC0.M - 0858 2c39 srs @0x0039, $AC0.L - 0859 02df ret - -// - 085a 8100 clr $ACC0 - 085b 2689 lrs $AC0.M, @0xff89 - 085c 0240 000f andi $AC0.M, #0x000f - 085e 1f5e mrr $AX0.H, $AC0.M - 085f 8100 clr $ACC0 - 0860 0e10 lris $AC0.M, #0x10 - 0861 5400 subr $ACC0, $AX0.H - 0862 2e32 srs @0x0032, $AC0.M - 0863 268a lrs $AC0.M, @0xff8a - 0864 248b lrs $AC0.L, @0xff8b - 0865 2288 lrs $AX0.H, @0xff88 - 0866 2089 lrs $AX0.L, @0xff89 - 0867 5800 subax $ACC0, $AX0.L - 0868 0a00 lris $AX0.H, #0x00 - 0869 2032 lrs $AX0.L, @0x0032 - 086a 5800 subax $ACC0, $AX0.L - 086b 2e3a srs @0x003a, $AC0.M - 086c 2c3b srs @0x003b, $AC0.L - 086d 02df ret - -// mixer for sound types 5 and 9 -// AR3 = 0x0580 (out address) -// AC1.M = 0x0043, AC1.L = 0x0000 - 086e 0092 0004 lri $CR, #0x0004 - 0870 8100 clr $ACC0 - 0871 2604 lrs $AC0.M, @0x0004 - 0872 b100 tst $ACC0 - 0873 02b4 0848 callne 0x0848 // nothing much interesting - 0875 8100 clr $ACC0 - 0876 2601 lrs $AC0.M, @0x0001 - 0877 b100 tst $ACC0 - 0878 0294 0916 jnz 0x0916 // end - 087a 2232 lrs $AX0.H, @0x0032 - 087b c900 cmpar $ACC0, $AX1.H - 087c 0293 083f jle 0x083f // direct return (calls 0x082A though) - 087e 5500 subr $ACC1, $AX0.H - 087f 02bf 082a call 0x082a // interesting: stores value(s) to Mem[AR3] (output) - 0881 223a lrs $AX0.H, @0x003a - 0882 8600 tstaxh $AX0.H - 0883 0294 088a jnz 0x088a - 0885 8100 clr $ACC0 - 0886 263b lrs $AC0.M, @0x003b - 0887 8200 cmp - 0888 0291 08dc js 0x08dc - 088a 8100 clr $ACC0 - 088b 1fdf mrr $AC0.M, $AC1.M - 088c 040f addis $ACC0, #0x0f - 088d 147c lsr $ACC0, #-4 - 088e 1f7e mrr $AX1.H, $AC0.M - 088f 0c00 lris $AC0.L, #0x00 - 0890 1404 lsl $ACC0, #4 - 0891 1f1e mrr $AX0.L, $AC0.M - 0892 0a00 lris $AX0.H, #0x00 - 0893 8100 clr $ACC0 - 0894 263a lrs $AC0.M, @0x003a - 0895 243b lrs $AC0.L, @0x003b - 0896 5800 subax $ACC0, $AX0.L - 0897 0290 08a2 jns 0x08a2 - 0899 8100 clr $ACC0 - 089a 263b lrs $AC0.M, @0x003b - 089b 5c00 sub $ACC0, $AC1.L - 089c 2e32 srs @0x0032, $AC0.M - 089d 8100 clr $ACC0 - 089e 2e3a srs @0x003a, $AC0.M - 089f 2e3b srs @0x003b, $AC0.M - 08a0 029f 08a8 jmp 0x08a8 - 08a2 2e3a srs @0x003a, $AC0.M - 08a3 2c3b srs @0x003b, $AC0.L - 08a4 0c00 lris $AC0.L, #0x00 - 08a5 1fd8 mrr $AC0.M, $AX0.L - 08a6 5c00 sub $ACC0, $AC1.L - 08a7 2e32 srs @0x0032, $AC0.M - 08a8 8100 clr $ACC0 - 08a9 1fdb mrr $AC0.M, $AX1.H - 08aa 02bf 091c call 0x091c // afc decoder - 08ac 2232 lrs $AX0.H, @0x0032 - 08ad 8600 tstaxh $AX0.H - 08ae 0295 08d9 jz 0x08d9 // end - 08b0 0a10 lris $AX0.H, #0x10 - 08b1 8100 clr $ACC0 - 08b2 1fc3 mrr $AC0.M, $AR3 - 08b3 5400 subr $ACC0, $AX0.H - 08b4 1c7e mrr $AR3, $AC0.M - 08b5 0080 0458 lri $AR0, #0x0458 - 08b7 197e lrri $AC0.M, @$AR3 - 08b8 197a lrri $AX0.H, @$AR3 - - 08b9 100e loopi #0x0e - 08ba 64a2 movr'sl $ACC0, $AX0.H : $AC0.M, $AX0.H - - 08bb 1b1e srri @$AR0, $AC0.M - 08bc 1b1a srri @$AR0, $AX0.H - 08bd 8100 clr $ACC0 - 08be 263a lrs $AC0.M, @0x003a - 08bf 243b lrs $AC0.L, @0x003b - 08c0 b100 tst $ACC0 - 08c1 0294 08d9 jnz 0x08d9 // end - 08c3 2232 lrs $AX0.H, @0x0032 - 08c4 8600 tstaxh $AX0.H - 08c5 0295 08d9 jz 0x08d9 // end - 08c7 0080 0467 lri $AR0, #0x0467 - 08c9 8100 clr $ACC0 - 08ca 268b lrs $AC0.M, @0xff8b - 08cb b100 tst $ACC0 - 08cc 0295 08d9 jz 0x08d9 // end - 08ce 0200 000f addi $AC0.M, #0x000f - 08d0 0240 000f andi $AC0.M, #0x000f - 08d2 0200 0458 addi $AC0.M, #0x0458 - 08d4 1c7e mrr $AR3, $AC0.M - - 08d5 007a 08d8 bloop $AX0.H, 0x08d8 - 08d7 18fe lrrd $AC0.M, @$AR3 - 08d8 1a9e srrd @$AR0, $AC0.M - - 08d9 0092 00ff lri $CR, #0x00ff - 08db 02df ret - -// - 08dc b100 tst $ACC0 - 08dd 0295 08ec jz 0x08ec - 08df 5d00 sub $ACC1, $AC0.L - 08e0 040f addis $ACC0, #0x0f - 08e1 147c lsr $ACC0, #-4 - 08e2 0c00 lris $AC0.L, #0x00 - 08e3 00e3 0363 sr @0x0363, $AR3 - 08e5 02bf 091c call 0x091c - 08e7 00de 0363 lr $AC0.M, @0x0363 - 08e9 223b lrs $AX0.H, @0x003b - 08ea 4400 addr $ACC0, $AX0.H - 08eb 1c7e mrr $AR3, $AC0.M - 08ec 8100 clr $ACC0 - 08ed 2681 lrs $AC0.M, @0xff81 - 08ee b100 tst $ACC0 - 08ef 0295 0914 jz 0x0914 - 08f1 2380 lrs $AX1.H, @0xff80 - 08f2 2688 lrs $AC0.M, @0xff88 - 08f3 2489 lrs $AC0.L, @0xff89 - 08f4 1408 lsl $ACC0, #8 - 08f5 14f4 asr $ACC0, #-12 - 08f6 2380 lrs $AX1.H, @0xff80 - 08f7 8d00 set15 - 08f8 c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - 08f9 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 08fa 8c00 clr15 - 08fb f000 lsl16 $ACC0 - 08fc 4e00 addp $ACC0 - 08fd 238c lrs $AX1.H, @0xff8c - 08fe 218d lrs $AX1.L, @0xff8d - 08ff 4a00 addax $ACC0, $AX1.L - 0900 2e38 srs @0x0038, $AC0.M - 0901 2c39 srs @0x0039, $AC0.L - 0902 2682 lrs $AC0.M, @0xff82 - 0903 2e67 srs @0x0067, $AC0.M - 0904 2683 lrs $AC0.M, @0xff83 - 0905 2e66 srs @0x0066, $AC0.M - 0906 00e3 0363 sr @0x0363, $AR3 - 0908 0083 0458 lri $AR3, #0x0458 - 090a 8100 clr $ACC0 - 090b 0e01 lris $AC0.M, #0x01 - 090c 02bf 091c call 0x091c - 090e 00c3 0363 lr $AR3, @0x0363 - 0910 02bf 085a call 0x085a - 0912 029f 087a jmp 0x087a - 0914 0e01 lris $AC0.M, #0x01 - 0915 2e01 srs @0x0001, $AC0.M - 0916 8100 clr $ACC0 - 0917 005f loop $AC1.M - 0918 1b7e srri @$AR3, $AC0.M - 0919 0092 00ff lri $CR, #0x00ff - 091b 02df ret - -// afc decoder (for sound formats 5 and 9) -// AC0.M = num of blocks to do? (0x4) -// AC1.M = - 091c 00ff 0360 sr @0x0360, $AC1.M - 091e 00fe 0361 sr @0x0361, $AC0.M - 0920 8100 clr $ACC0 - 0921 00de 0361 lr $AC0.M, @0x0361 - - 0923 007e 099c bloop $AC0.M, 0x099c - 0925 2638 lrs $AC0.M, @0x0038 - 0926 2439 lrs $AC0.L, @0x0039 - 0927 0092 00ff lri $CR, #0x00ff - 0929 029f 063a jmp 0x063a // ReadSoundData(Dword[0x0038]) - 092b 0092 0004 lri $CR, #0x0004 - 092d 2638 lrs $AC0.M, @0x0038 - 092e 2439 lrs $AC0.L, @0x0039 - 092f 8900 clr $ACC1 - 0930 2580 lrs $AC1.L, @0xff80 - 0931 4c00 add $ACC0, $AC1.L - 0932 2e38 srs @0x0038, $AC0.M - 0933 2c39 srs @0x0039, $AC0.L - 0934 00de 037f lr $AC0.M, @0x037f - 0936 0200 0b00 addi $AC0.M, #0x0b00 // buffer where read sound data is stored (128 bytes) - 0938 1c1e mrr $AR0, $AC0.M // AR0 = AC0.M = 0x0B00 + Mem[0x037F]; (Mem[0x037F] seems to be the offset in buffer to the actual block...) - 0939 0084 0001 lri $IX0, #0x0001 // IX0 = 0x0001; - 093b 199e lrrn $AC0.M, @$AR0 // AC0.M = Mem[AR0]; AR0++; read first byte in buffer - 093c 8900 clr $ACC1 - 093d 1ffe mrr $AC1.M, $AC0.M // AC1.M = AC0.M = first_byte; - 093e 1401 lsl $ACC0, #1 - 093f 0240 001e andi $AC0.M, #0x001e - 0941 0200 0300 addi $AC0.M, #0x0300 - 0943 1c3e mrr $AR1, $AC0.M // AR1 = ((first_byte << 1) & 0x1E) + 0x0300; - 0944 157c lsr $ACC1, #-4 - 0945 0340 000f andi $AC1.M, #0x000f - 0947 0a11 lris $AX0.H, #0x11 - 0948 5500 subr $ACC1, $AX0.H // AC1.M = ((first_byte >> 4) & 0xF) - 0x11; - 0949 8100 clr $ACC0 - 094a 2680 lrs $AC0.M, @0xff80 - 094b 0605 cmpis $ACC0, #0x05 - 094c 0295 0965 jz 0x0965 // skip loop below (execute another loop) for sound format 5 - - 094e 009a 00f0 lri $AX0.H, #0x00f0 // these masks... for adpcm sound surely - 0950 0b0f lris $AX1.H, #0x0f - 0951 0082 0364 lri $AR2, #0x0364 // AR2 = 0x0364; - 0953 1998 lrrn $AX0.L, @$AR0 // AX0.L = Mem[AR0]; AR0++; - 0954 6000 movr $ACC0, $AX0.L // AC0.HM = AX0; AC0.L = 0x0000; - // loop for sound format 9 (looks like adpcm) - // decompose sound data into nibbles and store it to 0x0364 (again a temp buffer!) - // for(i = 0; i < 7; i++) - 0955 1107 095c bloopi #0x07, 0x095c - 0957 3400 andr $AC0.M, $AX0.H // AC0.M &= 0x00F0; - 0958 1408 lsl $ACC0, #8 // ACC0 <<= 8; - 0959 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M // AC0.HM = AX0; AC0.L = 0; Mem[AR2] = AC0.M; AR2++; - 095a 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 // AC0.M &= 0x000F; AX0.L = Mem[AR0]; AR0++; - 095b 140c lsl $ACC0, #12 // ACC0 <<= 12; - 095c 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M // AC0.HM = AX0; AC0.L = 0; Mem[AR2] = AC0.M; AR2++; - - 095d 3400 andr $AC0.M, $AX0.H - 095e 1408 lsl $ACC0, #8 - 095f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0960 3600 andr $AC0.M, $AX1.H - 0961 140c lsl $ACC0, #12 - 0962 1b5e srri @$AR2, $AC0.M - 0963 029f 0985 jmp 0x0985 - // below for sound format 5 only - 0965 009a c000 lri $AX0.H, #0xc000 - 0967 0082 0364 lri $AR2, #0x0364 - 0969 1998 lrrn $AX0.L, @$AR0 - 096a 6000 movr $ACC0, $AX0.L - // loop for sound format 5 - 096b 1103 0978 bloopi #0x03, 0x0978 - 096d 1408 lsl $ACC0, #8 - 096e 3400 andr $AC0.M, $AX0.H - 096f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0970 140a lsl $ACC0, #10 - 0971 3400 andr $AC0.M, $AX0.H - 0972 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0973 140c lsl $ACC0, #12 - 0974 3400 andr $AC0.M, $AX0.H - 0975 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0976 140e lsl $ACC0, #14 - 0977 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0 - 0978 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - - 0979 1408 lsl $ACC0, #8 - 097a 3400 andr $AC0.M, $AX0.H - 097b 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 097c 140a lsl $ACC0, #10 - 097d 3400 andr $AC0.M, $AX0.H - 097e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 097f 140c lsl $ACC0, #12 - 0980 3400 andr $AC0.M, $AX0.H - 0981 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0982 140e lsl $ACC0, #14 - 0983 3400 andr $AC0.M, $AX0.H - 0984 1b5e srri @$AR2, $AC0.M - - 0985 8f00 set40 - 0986 1f7f mrr $AX1.H, $AC1.M // AX1.H = AC1.M = ((first_byte >> 4) & 0xF) - 0x11; - 0987 2066 lrs $AX0.L, @0x0066 // AX0.L = Mem[0x0066]; - 0988 2767 lrs $AC1.M, @0x0067 // AC1.M = Mem[0x0067]; - 0989 193a lrri $AX0.H, @$AR1 // AX0.H = Mem[AR1]; AR1++; load coefs from 0x0300+ - 098a 1939 lrri $AX1.L, @$AR1 // AX1.L = Mem[AR1]; AR1++; - 098b 0080 0364 lri $AR0, #0x0364 // AR0 = 0x0364; - 098d a000 mulx $AX0.L, $AX1.L // prod = AX0.L * AX1.L; - 098e ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 // prod += AC1.M * AX1.L; AC0.M = Mem[AR0]; AR0++; - - 098f 1108 0998 bloopi #0x08, 0x0998 - 0991 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L // AC0.M |= AX1.H; Mem[AR3] = AC1.M; AR3++; AX1.L = Mem[AR0]; AR0++; - 0992 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 // ACC0 += prod; prod = AX0.L * AX1.L; AC1.M = Mem[AR0]; AR0++; - 0993 1485 asl $ACC0, #5 // ACC0 <<= 5; - 0994 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M // prod += AC0.M * AX1.L; Mem[AR3] = AC0.M; AR3++; - 0995 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L // AC1.M |= AX1.H; Mem[AR3] = AC0.M; AR3++; AX1.L = Mem[AR0]; AR0++; - 0996 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 // ACC1 += prod; prod = AX0.L * AX1.L; AC1.M = Mem[AR0]; AR0++; - 0997 1585 asl $ACC1, #5 // ACC1 <<= 5; - 0998 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M // prod += AC1.M * AX1.L; Mem[AR3] = AC1.M; AR3++; - - 0999 2f67 srs @0x0067, $AC1.M - 099a 8e00 set16 - 099b 1ff8 mrr $AC1.M, $AX0.L - 099c 2f66 srs @0x0066, $AC1.M - // end of outer loop - 099d 8900 clr $ACC1 - 099e 00df 0360 lr $AC1.M, @0x0360 - 09a0 02df ret - -// - 09a1 b100 tst $ACC0 - 09a2 02d5 retz - 09a3 04fe addis $ACC0, #0xfe - 09a4 1f1e mrr $AX0.L, $AC0.M - 09a5 191e lrri $AC0.M, @$AR0 - 09a6 0291 09ac js 0x09ac - 09a8 191a lrri $AX0.H, @$AR0 - 09a9 0058 loop $AX0.L - 09aa 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 09ab 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 09ac 1b7e srri @$AR3, $AC0.M - 09ad 02df ret - -// decode audio? - 09ae 8100 clr $ACC0 - 09af 1f5e mrr $AX0.H, $AC0.M - 09b0 00d8 0402 lr $AX0.L, @0x0402 - 09b2 00dc 0430 lr $AC0.L, @0x0430 - 09b4 0080 0520 lri $AR0, #0x0520 - 09b6 00df 0480 lr $AC1.M, @0x0480 // sound format??? - 09b8 1501 lsl $ACC1, #1 - 09b9 0340 007e andi $AC1.M, #0x007e - 09bb 0300 09c3 addi $AC1.M, #0x09c3 - 09bd 1c5f mrr $AR2, $AC1.M - 09be 175f callr $AR2 // jump to one of the functions - 09bf 00fc 0430 sr @0x0430, $AC0.L - 09c1 029f 0336 jmp 0x0336 // return to SyncFrame func - // jump table - 09c3 029f 09e4 jmp 0x09e4 // 0x0: - 09c5 029f 0a1f jmp 0x0a1f // 0x1: - 09c7 029f 0a07 jmp 0x0a07 // 0x2: - 09c9 029f 09f4 jmp 0x09f4 // 0x3: - 09cb 029f 0a2d jmp 0x0a2d // 0x4: - 09cd 029f 09e3 jmp 0x09e3 // 0x5: dummy - 09cf 029f 0a4b jmp 0x0a4b // 0x6: - 09d1 029f 0a4e jmp 0x0a4e // 0x7: - 09d3 029f 09e3 jmp 0x09e3 // 0x8: dummy - 09d5 029f 09e3 jmp 0x09e3 // 0x9: dummy - 09d7 029f 0a6c jmp 0x0a6c // 0xA: - 09d9 029f 0a25 jmp 0x0a25 // 0xB: - 09db 029f 0a29 jmp 0x0a29 // 0xC: - 09dd 029f 09e3 jmp 0x09e3 // 0xD: dummy - 09df 029f 09e3 jmp 0x09e3 // 0xE: dummy - 09e1 029f 09e3 jmp 0x09e3 // 0xF: dummy - 09e3 02df ret // direct return for dummy funcs - -// Func_00() - 09e4 1401 lsl $ACC0, #1 - 09e5 009b c000 lri $AX1.H, #0xc000 - 09e7 0099 4000 lri $AX1.L, #0x4000 - 09e9 1150 09f1 bloopi #0x50, 0x09f1 - 09eb 02c0 0001 andcf $AC0.M, #0x0001 - 09ed 027c iflnz - 09ee 1b1b srri @$AR0, $AX1.H - 09ef 027d iflz - 09f0 1b19 srri @$AR0, $AX1.L - 09f1 4800 addax $ACC0, $AX0.L - 09f2 147f lsr $ACC0, #-1 - 09f3 02df ret - 09f4 1402 lsl $ACC0, #2 - 09f5 8900 clr $ACC1 - 09f6 1fb8 mrr $AC1.L, $AX0.L - 09f7 1501 lsl $ACC1, #1 - 09f8 009b c000 lri $AX1.H, #0xc000 - 09fa 0099 4000 lri $AX1.L, #0x4000 - 09fc 1150 0a04 bloopi #0x50, 0x0a04 - 09fe 02c0 0003 andcf $AC0.M, #0x0003 - 0a00 027c iflnz - 0a01 1b1b srri @$AR0, $AX1.H - 0a02 027d iflz - 0a03 1b19 srri @$AR0, $AX1.L - 0a04 4c00 add $ACC0, $AC1.L - 0a05 147e lsr $ACC0, #-2 - 0a06 02df ret - 0a07 1401 lsl $ACC0, #1 - 0a08 0081 0ca0 lri $AR1, #0x0ca0 - 0a0a 009b c000 lri $AX1.H, #0xc000 - 0a0c 0099 4000 lri $AX1.L, #0x4000 - 0a0e 8900 clr $ACC1 - 0a0f 0082 0000 lri $AR2, #0x0000 - 0a11 1150 0a1c bloopi #0x50, 0x0a1c - 0a13 02c0 0001 andcf $AC0.M, #0x0001 - 0a15 027c iflnz - 0a16 1b1b srri @$AR0, $AX1.H - 0a17 027d iflz - 0a18 1b19 srri @$AR0, $AX1.L - 0a19 183d lrr $AC1.L, @$AR1 - 0a1a 4900 addax $ACC1, $AX0.L - 0a1b 1fe2 mrr $AC1.M, $AR2 - 0a1c 4c39 add's $ACC0, $AC1.L : @$AR1, $AC1.M - 0a1d 147f lsr $ACC0, #-1 - 0a1e 02df ret - 0a1f 8900 clr $ACC1 - 0a20 1fb8 mrr $AC1.L, $AX0.L - 0a21 157f lsr $ACC1, #-1 - 0a22 1050 loopi #0x50 - 0a23 4c20 add's $ACC0, $AC1.L : @$AR0, $AC0.L - 0a24 02df ret - 0a25 0082 0180 lri $AR2, #0x0180 - 0a27 029f 0a2f jmp 0x0a2f - 0a29 0082 01c0 lri $AR2, #0x01c0 - 0a2b 029f 0a2f jmp 0x0a2f - 0a2d 0082 0140 lri $AR2, #0x0140 - 0a2f 008a 003f lri $WR2, #0x003f - 0a31 0086 0000 lri $IX2, #0x0000 - 0a33 1406 lsl $ACC0, #6 - 0a34 8900 clr $ACC1 - 0a35 1fb8 mrr $AC1.L, $AX0.L - 0a36 1505 lsl $ACC1, #5 - 0a37 009b 003f lri $AX1.H, #0x003f - 0a39 009a 0000 lri $AX0.H, #0x0000 - 0a3b 3600 andr $AC0.M, $AX1.H - 0a3c 1cde mrr $IX2, $AC0.M - 0a3d 001a addarn $AR2, $IX2 - 0a3e 3400 andr $AC0.M, $AX0.H - 0a3f 1150 0a45 bloopi #0x50, 0x0a45 - 0a41 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 0a42 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a43 1cde mrr $IX2, $AC0.M - 0a44 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a45 1b19 srri @$AR0, $AX1.L - 0a46 1fc2 mrr $AC0.M, $AR2 - 0a47 147a lsr $ACC0, #-6 - 0a48 008a ffff lri $WR2, #0xffff - 0a4a 02df ret - 0a4b 1050 loopi #0x50 - 0a4c 1b18 srri @$AR0, $AX0.L - 0a4d 02df ret - 0a4e 0082 0100 lri $AR2, #0x0100 - 0a50 008a 003f lri $WR2, #0x003f - 0a52 0086 0000 lri $IX2, #0x0000 - 0a54 1406 lsl $ACC0, #6 - 0a55 8900 clr $ACC1 - 0a56 1fb8 mrr $AC1.L, $AX0.L - 0a57 1505 lsl $ACC1, #5 - 0a58 009b 003f lri $AX1.H, #0x003f - 0a5a 009a 0000 lri $AX0.H, #0x0000 - 0a5c 3600 andr $AC0.M, $AX1.H - 0a5d 1cde mrr $IX2, $AC0.M - 0a5e 001a addarn $AR2, $IX2 - 0a5f 3400 andr $AC0.M, $AX0.H - 0a60 1150 0a66 bloopi #0x50, 0x0a66 - 0a62 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 0a63 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a64 1cde mrr $IX2, $AC0.M - 0a65 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a66 1b19 srri @$AR0, $AX1.L - 0a67 1fc2 mrr $AC0.M, $AR2 - 0a68 147a lsr $ACC0, #-6 - 0a69 008a ffff lri $WR2, #0xffff - 0a6b 02df ret - -// - 0a6c 0082 0100 lri $AR2, #0x0100 - 0a6e 008a 003f lri $WR2, #0x003f - 0a70 0086 0000 lri $IX2, #0x0000 - 0a72 0081 0ca0 lri $AR1, #0x0ca0 - 0a74 1406 lsl $ACC0, #6 - 0a75 8900 clr $ACC1 - 0a76 1fb8 mrr $AC1.L, $AX0.L - 0a77 1505 lsl $ACC1, #5 - 0a78 009b 003f lri $AX1.H, #0x003f - 0a7a 009a 0000 lri $AX0.H, #0x0000 - 0a7c 3600 andr $AC0.M, $AX1.H - 0a7d 1cde mrr $IX2, $AC0.M - 0a7e 001a addarn $AR2, $IX2 - 0a7f 3400 andr $AC0.M, $AX0.H - - 0a80 1150 0a8b bloopi #0x50, 0x0a8b - 0a82 1939 lrri $AX1.L, @$AR1 - 0a83 a000 mulx $AX0.L, $AX1.L - 0a84 140a lsl $ACC0, #10 - 0a85 4e00 addp $ACC0 - 0a86 1476 lsr $ACC0, #-10 - 0a87 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2 - 0a88 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a89 1cde mrr $IX2, $AC0.M - 0a8a 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a8b 1b19 srri @$AR0, $AX1.L - - 0a8c 1fc2 mrr $AC0.M, $AR2 - 0a8d 147a lsr $ACC0, #-6 - 0a8e 008a ffff lri $WR2, #0xffff - 0a90 02df ret - -// - 0a91 0080 01be lri $AR0, #0x01be - 0a93 1918 lrri $AX0.L, @$AR0 - 0a94 191a lrri $AX0.H, @$AR0 - 0a95 0080 0180 lri $AR0, #0x0180 - 0a97 0083 0180 lri $AR3, #0x0180 - 0a99 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0a9a 1ffe mrr $AC1.M, $AC0.M - 0a9b 1120 0aa2 bloopi #0x20, 0x0aa2 - 0a9d 7c00 neg $ACC0 - 0a9e d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0a9f 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0aa0 c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 0aa1 1501 lsl $ACC1, #1 - 0aa2 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - 0aa3 0080 01fe lri $AR0, #0x01fe - 0aa5 191a lrri $AX0.H, @$AR0 - 0aa6 1918 lrri $AX0.L, @$AR0 - 0aa7 0080 01c0 lri $AR0, #0x01c0 - 0aa9 0083 01c0 lri $AR3, #0x01c0 - 0aab 1ff8 mrr $AC1.M, $AX0.L - 0aac 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0aad f800 addpaxz $ACC0, $AX0.H - 0aae 0240 01ff andi $AC0.M, #0x01ff - 0ab0 0260 2000 ori $AC0.M, #0x2000 - 0ab2 02bf 0ab5 call 0x0ab5 - 0ab4 02df ret - 0ab5 b900 tst $ACC1 - 0ab6 0272 ifg - 0ab7 7c00 neg $ACC0 - 0ab8 1f7e mrr $AX1.H, $AC0.M - 0ab9 4700 addr $ACC1, $AX1.H - 0aba 1110 0abf bloopi #0x10, 0x0abf - 0abc 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0abd 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0abe 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0abf 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0ac0 02df ret - -// - 0ac1 02bf 0b2e call 0x0b2e - 0ac3 2201 lrs $AX0.H, @0x0001 - 0ac4 8600 tstaxh $AX0.H - 0ac5 0294 0ad6 jnz 0x0ad6 - 0ac7 2204 lrs $AX0.H, @0x0004 - 0ac8 8600 tstaxh $AX0.H - 0ac9 02b4 0b1d callne 0x0b1d - 0acb 8100 clr $ACC0 - 0acc 2605 lrs $AC0.M, @0x0005 - 0acd b100 tst $ACC0 - 0ace 0295 0ae3 jz 0x0ae3 - 0ad0 8100 clr $ACC0 - 0ad1 2e05 srs @0x0005, $AC0.M - 0ad2 2281 lrs $AX0.H, @0xff81 - 0ad3 8600 tstaxh $AX0.H - 0ad4 0294 0add jnz 0x0add - 0ad6 8100 clr $ACC0 - 0ad7 005f loop $AC1.M - 0ad8 1b7e srri @$AR3, $AC0.M - 0ad9 7400 incm $AC0.M - 0ada 2e01 srs @0x0001, $AC0.M - 0adb 029f 0b16 jmp 0x0b16 - 0add 2688 lrs $AC0.M, @0xff88 - 0ade 2489 lrs $AC0.L, @0xff89 - 0adf 2e34 srs @0x0034, $AC0.M - 0ae0 2c35 srs @0x0035, $AC0.L - 0ae1 02bf 0b1d call 0x0b1d - 0ae3 00ff 0360 sr @0x0360, $AC1.M - 0ae5 2638 lrs $AC0.M, @0x0038 - 0ae6 2439 lrs $AC0.L, @0x0039 - 0ae7 02bf 068d call 0x068d - 0ae9 00df 0360 lr $AC1.M, @0x0360 - 0aeb 8100 clr $ACC0 - 0aec 263a lrs $AC0.M, @0x003a - 0aed b100 tst $ACC0 - 0aee 0294 0afd jnz 0x0afd - 0af0 263b lrs $AC0.M, @0x003b - 0af1 5c00 sub $ACC0, $AC1.L - 0af2 0290 0afd jns 0x0afd - 0af4 223b lrs $AX0.H, @0x003b - 0af5 02bf 06aa call 0x06aa - 0af7 5500 subr $ACC1, $AX0.H - 0af8 0a01 lris $AX0.H, #0x01 - 0af9 00fa 0405 sr @0x0405, $AX0.H - 0afb 029f 0ad0 jmp 0x0ad0 - 0afd 1f5f mrr $AX0.H, $AC1.M - 0afe 02bf 06aa call 0x06aa - 0b00 00fa 0362 sr @0x0362, $AX0.H - 0b02 8100 clr $ACC0 - 0b03 263a lrs $AC0.M, @0x003a - 0b04 243b lrs $AC0.L, @0x003b - 0b05 1570 lsr $ACC1, #-16 - 0b06 0a01 lris $AX0.H, #0x01 - 0b07 0081 0405 lri $AR1, #0x0405 - 0b09 5c00 sub $ACC0, $AC1.L - 0b0a b100 tst $ACC0 - 0b0b 0275 ifz - 0b0c 1a3a srr @$AR1, $AX0.H - 0b0d 2e3a srs @0x003a, $AC0.M - 0b0e 2c3b srs @0x003b, $AC0.L - 0b0f 2638 lrs $AC0.M, @0x0038 - 0b10 2439 lrs $AC0.L, @0x0039 - 0b11 00d8 0362 lr $AX0.L, @0x0362 - 0b13 7000 addaxl $ACC0, $AX0.L - 0b14 2c39 srs @0x0039, $AC0.L - 0b15 2e38 srs @0x0038, $AC0.M - 0b16 0092 00ff lri $CR, #0x00ff - 0b18 029f 032e jmp 0x032e - 0b1a 8100 clr $ACC0 - 0b1b 2e34 srs @0x0034, $AC0.M - 0b1c 2e35 srs @0x0035, $AC0.M - 0b1d 2334 lrs $AX1.H, @0x0034 - 0b1e 2135 lrs $AX1.L, @0x0035 - 0b1f 268a lrs $AC0.M, @0xff8a - 0b20 248b lrs $AC0.L, @0xff8b - 0b21 5a00 subax $ACC0, $AX1.L - 0b22 2e3a srs @0x003a, $AC0.M - 0b23 2c3b srs @0x003b, $AC0.L - 0b24 2634 lrs $AC0.M, @0x0034 - 0b25 2435 lrs $AC0.L, @0x0035 - 0b26 238c lrs $AX1.H, @0xff8c - 0b27 218d lrs $AX1.L, @0xff8d - 0b28 4a00 addax $ACC0, $AX1.L - 0b29 2e38 srs @0x0038, $AC0.M - 0b2a 2c39 srs @0x0039, $AC0.L - 0b2b 8100 clr $ACC0 - 0b2c 2e05 srs @0x0005, $AC0.M - 0b2d 02df ret - -// - 0b2e 0092 0004 lri $CR, #0x0004 - 0b30 2002 lrs $AX0.L, @0x0002 - 0b31 8100 clr $ACC0 - 0b32 8900 clr $ACC1 - 0b33 2430 lrs $AC0.L, @0x0030 - 0b34 8d00 set15 - 0b35 0950 lris $AX1.L, #0x50 - 0b36 a000 mulx $AX0.L, $AX1.L - 0b37 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0b38 1404 lsl $ACC0, #4 // ACC0 = (Mem[0x0002] * 80) << 4; - 0b39 8c00 clr15 - 0b3a 1ffe mrr $AC1.M, $AC0.M // AC1.M = AC0.M; - 0b3b 0083 0580 lri $AR3, #0x0580 - 0b3d 02df ret - -// process sound format 0x10 (smg) -// read data stored at 0x0000 by DsetupTable -// stores the output to 0x0580 - 0b3e 02bf 0b2e call 0x0b2e // prepare regs - 0b40 2201 lrs $AX0.H, @0x0001 - 0b41 8600 tstaxh $AX0.H - 0b42 0294 0b53 jnz 0x0b53 - 0b44 2204 lrs $AX0.H, @0x0004 - 0b45 8600 tstaxh $AX0.H - 0b46 02b4 0b9d callne 0x0b9d - 0b48 8100 clr $ACC0 - 0b49 2605 lrs $AC0.M, @0x0005 - 0b4a b100 tst $ACC0 - 0b4b 0295 0b60 jz 0x0b60 - 0b4d 8100 clr $ACC0 - 0b4e 2e05 srs @0x0005, $AC0.M - 0b4f 2281 lrs $AX0.H, @0xff81 - 0b50 8600 tstaxh $AX0.H - 0b51 0294 0b5a jnz 0x0b5a - - 0b53 8100 clr $ACC0 - - 0b54 005f loop $AC1.M - 0b55 1b7e srri @$AR3, $AC0.M // store zero to output - - 0b56 7400 incm $AC0.M - 0b57 2e01 srs @0x0001, $AC0.M - 0b58 029f 0b96 jmp 0x0b96 - - 0b5a 2688 lrs $AC0.M, @0xff88 - 0b5b 2489 lrs $AC0.L, @0xff89 - 0b5c 2e34 srs @0x0034, $AC0.M - 0b5d 2c35 srs @0x0035, $AC0.L - 0b5e 02bf 0b9d call 0x0b9d - - 0b60 00ff 0360 sr @0x0360, $AC1.M - 0b62 2638 lrs $AC0.M, @0x0038 - 0b63 2439 lrs $AC0.L, @0x0039 - // DMA transfer from main memory address Dword[0x0038] to 0x0580 - // Dword[0x0038] = Dword[0xFF8C] - 0b64 02bf 068d call 0x068d - 0b66 02bf 06a4 call 0x06a4 - 0b68 00df 0360 lr $AC1.M, @0x0360 - 0b6a 8100 clr $ACC0 - 0b6b 263a lrs $AC0.M, @0x003a - 0b6c b100 tst $ACC0 - 0b6d 0294 0b7c jnz 0x0b7c - 0b6f 263b lrs $AC0.M, @0x003b - 0b70 5c00 sub $ACC0, $AC1.L - 0b71 0290 0b7c jns 0x0b7c - 0b73 223b lrs $AX0.H, @0x003b - 0b74 02bf 066f call 0x066f // dma? - 0b76 5500 subr $ACC1, $AX0.H - 0b77 0a01 lris $AX0.H, #0x01 - 0b78 00fa 0405 sr @0x0405, $AX0.H - 0b7a 029f 0b4d jmp 0x0b4d - 0b7c 1f5f mrr $AX0.H, $AC1.M - 0b7d 02bf 066f call 0x066f // dma? - 0b7f 00fa 0362 sr @0x0362, $AX0.H - 0b81 8100 clr $ACC0 - 0b82 263a lrs $AC0.M, @0x003a - 0b83 243b lrs $AC0.L, @0x003b - 0b84 1570 lsr $ACC1, #-16 - 0b85 0a01 lris $AX0.H, #0x01 - 0b86 0081 0405 lri $AR1, #0x0405 - 0b88 5c00 sub $ACC0, $AC1.L - 0b89 b100 tst $ACC0 - 0b8a 0275 ifz - 0b8b 1a3a srr @$AR1, $AX0.H - 0b8c 2e3a srs @0x003a, $AC0.M - 0b8d 2c3b srs @0x003b, $AC0.L - 0b8e 2638 lrs $AC0.M, @0x0038 - 0b8f 2439 lrs $AC0.L, @0x0039 - 0b90 00d8 0362 lr $AX0.L, @0x0362 - 0b92 7000 addaxl $ACC0, $AX0.L - 0b93 7000 addaxl $ACC0, $AX0.L - 0b94 2c39 srs @0x0039, $AC0.L - 0b95 2e38 srs @0x0038, $AC0.M - 0b96 0092 00ff lri $CR, #0x00ff - 0b98 029f 032e jmp 0x032e - -// - 0b9a 8100 clr $ACC0 - - 0b9b 2e34 srs @0x0034, $AC0.M - 0b9c 2e35 srs @0x0035, $AC0.M - - 0b9d 2334 lrs $AX1.H, @0x0034 - 0b9e 2135 lrs $AX1.L, @0x0035 - 0b9f 268a lrs $AC0.M, @0xff8a - 0ba0 248b lrs $AC0.L, @0xff8b - 0ba1 5a00 subax $ACC0, $AX1.L - 0ba2 2e3a srs @0x003a, $AC0.M - 0ba3 2c3b srs @0x003b, $AC0.L - 0ba4 2634 lrs $AC0.M, @0x0034 - 0ba5 2435 lrs $AC0.L, @0x0035 - 0ba6 1401 lsl $ACC0, #1 - 0ba7 238c lrs $AX1.H, @0xff8c - 0ba8 218d lrs $AX1.L, @0xff8d - 0ba9 4a00 addax $ACC0, $AX1.L - 0baa 2e38 srs @0x0038, $AC0.M - 0bab 2c39 srs @0x0039, $AC0.L - 0bac 8100 clr $ACC0 - 0bad 2e05 srs @0x0005, $AC0.M - 0bae 02df ret - -// - 0baf 8900 clr $ACC1 - 0bb0 0f50 lris $AC1.M, #0x50 - 0bb1 0083 0520 lri $AR3, #0x0520 - 0bb3 02bf 0bc8 call 0x0bc8 - 0bb5 029f 0336 jmp 0x0336 - 0bb7 00d8 0402 lr $AX0.L, @0x0402 - 0bb9 8100 clr $ACC0 - 0bba 8900 clr $ACC1 - 0bbb 00dc 0430 lr $AC0.L, @0x0430 - 0bbd 0a50 lris $AX0.H, #0x50 - 0bbe 9000 mul $AX0.L, $AX0.H - 0bbf 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0bc0 1404 lsl $ACC0, #4 - 0bc1 1ffe mrr $AC1.M, $AC0.M - 0bc2 0083 0580 lri $AR3, #0x0580 - 0bc4 02bf 0bc8 call 0x0bc8 - 0bc6 029f 032e jmp 0x032e - -// - 0bc8 0092 0004 lri $CR, #0x0004 - 0bca 8100 clr $ACC0 - 0bcb 263a lrs $AC0.M, @0x003a - 0bcc 243b lrs $AC0.L, @0x003b - 0bcd 1f1f mrr $AX0.L, $AC1.M - 0bce 0a00 lris $AX0.H, #0x00 - 0bcf 5800 subax $ACC0, $AX0.L - 0bd0 0292 0be6 jg 0x0be6 - 0bd2 8900 clr $ACC1 - 0bd3 00c0 043b lr $AR0, @0x043b - 0bd5 02bf 0c0b call 0x0c0b - 0bd7 8100 clr $ACC0 - 0bd8 1fd8 mrr $AC0.M, $AX0.L - 0bd9 223b lrs $AX0.H, @0x003b - 0bda 5400 subr $ACC0, $AX0.H - 0bdb 0007 dar $AR3 - 0bdc 1979 lrri $AX1.L, @$AR3 - 0bdd 005e loop $AC0.M - 0bde 1b79 srri @$AR3, $AX1.L - 0bdf 0f01 lris $AC1.M, #0x01 - 0be0 2f01 srs @0x0001, $AC1.M - 0be1 8900 clr $ACC1 - 0be2 2f3b srs @0x003b, $AC1.M - 0be3 0092 00ff lri $CR, #0x00ff - 0be5 02df ret - -// - 0be6 2e3a srs @0x003a, $AC0.M - 0be7 2c3b srs @0x003b, $AC0.L - 0be8 8100 clr $ACC0 - 0be9 8900 clr $ACC1 - 0bea 268a lrs $AC0.M, @0xff8a - 0beb 2734 lrs $AC1.M, @0x0034 - 0bec 5c00 sub $ACC0, $AC1.L - 0bed 2e36 srs @0x0036, $AC0.M - 0bee 5000 subr $ACC0, $AX0.L - 0bef 0290 0c05 jns 0x0c05 - 0bf1 00c0 0436 lr $AR0, @0x0436 - 0bf3 02bf 0c0b call 0x0c0b - 0bf5 8100 clr $ACC0 - 0bf6 1fd8 mrr $AC0.M, $AX0.L - 0bf7 2236 lrs $AX0.H, @0x0036 - 0bf8 5400 subr $ACC0, $AX0.H - 0bf9 1c1e mrr $AR0, $AC0.M - 0bfa 8100 clr $ACC0 - 0bfb 2e34 srs @0x0034, $AC0.M - 0bfc 2688 lrs $AC0.M, @0xff88 - 0bfd 2489 lrs $AC0.L, @0xff89 - 0bfe 2e8c srs @0xff8c, $AC0.M - 0bff 2c8d srs @0xff8d, $AC0.L - 0c00 02bf 0c0b call 0x0c0b - 0c02 0092 00ff lri $CR, #0x00ff - 0c04 02df ret - -// - 0c05 1c18 mrr $AR0, $AX0.L - 0c06 02bf 0c0b call 0x0c0b - 0c08 0092 00ff lri $CR, #0x00ff - 0c0a 02df ret - -// - 0c0b 8100 clr $ACC0 - 0c0c 1fc0 mrr $AC0.M, $AR0 - 0c0d b100 tst $ACC0 - 0c0e 02d5 retz - 0c0f 8900 clr $ACC1 - 0c10 2734 lrs $AC1.M, @0x0034 - 0c11 0340 0001 andi $AC1.M, #0x0001 - 0c13 0b00 lris $AX1.H, #0x00 - 0c14 1f3f mrr $AX1.L, $AC1.M - 0c15 268c lrs $AC0.M, @0xff8c - 0c16 248d lrs $AC0.L, @0xff8d - 0c17 8900 clr $ACC1 - 0c18 2534 lrs $AC1.L, @0x0034 - 0c19 1501 lsl $ACC1, #1 - 0c1a 4c00 add $ACC0, $AC1.L - 0c1b 5a00 subax $ACC0, $AX1.L - 0c1c 5a00 subax $ACC0, $AX1.L - 0c1d 1c20 mrr $AR1, $AR0 - 0c1e 1fe0 mrr $AC1.M, $AR0 - 0c1f 0502 addis $ACC1, #0x02 - 0c20 1c1f mrr $AR0, $AC1.M - 0c21 009f 0b00 lri $AC1.M, #0x0b00 - 0c23 0092 00ff lri $CR, #0x00ff - 0c25 02bf 05e8 call 0x05e8 - 0c27 0092 0004 lri $CR, #0x0004 - 0c29 2734 lrs $AC1.M, @0x0034 - 0c2a 1f61 mrr $AX1.H, $AR1 - 0c2b 4700 addr $ACC1, $AX1.H - 0c2c 2f34 srs @0x0034, $AC1.M - 0c2d 0080 0b00 lri $AR0, #0x0b00 - 0c2f 8900 clr $ACC1 - 0c30 1ff9 mrr $AC1.M, $AX1.L - 0c31 b900 tst $ACC1 - 0c32 0274 ifnz - 0c33 0008 iar $AR0 - 0c34 8900 clr $ACC1 - 0c35 1fe1 mrr $AC1.M, $AR1 - 0c36 191e lrri $AC0.M, @$AR0 - 0c37 0701 cmpis $ACC1, #0x01 - 0c38 0293 0c41 jle 0x0c41 - 0c3a 191a lrri $AX0.H, @$AR0 - 0c3b 05fe addis $ACC1, #0xfe - 0c3c 005f loop $AC1.M - 0c3d 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c3e 1b7e srri @$AR3, $AC0.M - 0c3f 1b7a srri @$AR3, $AX0.H - 0c40 02df ret - -// uh? - 0c41 1b7e srri @$AR3, $AC0.M - 0c42 02df ret - -// ??? -// AR0 = some count??? address??? -// AC0.M = -// AR1 = - 0c43 0083 03e8 lri $AR3, #0x03e8 - 0c45 191e lrri $AC0.M, @$AR0 - 0c46 191a lrri $AX0.H, @$AR0 - 0c47 1006 loopi #0x06 - 0c48 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c49 1b7e srri @$AR3, $AC0.M - 0c4a 1b7a srri @$AR3, $AX0.H - 0c4b 0080 03e8 lri $AR0, #0x03e8 - 0c4d 8a00 m2 - 0c4e 0088 0007 lri $WR0, #0x0007 - - 0c50 1150 0c5d bloopi #0x50, 0x0c5d - 0c52 1c61 mrr $AR3, $AR1 - 0c53 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c54 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c55 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c56 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c57 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c58 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c59 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c5a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c5b f200 madd $AX0.L, $AX0.H - 0c5c fe00 movpz $ACC0 - 0c5d 1b3e srri @$AR1, $AC0.M - - 0c5e 0088 ffff lri $WR0, #0xffff - 0c60 8b00 m0 - 0c61 02df ret - -// - 0c62 8a00 m2 - 0c63 05fe addis $ACC1, #0xfe - 0c64 0083 03e8 lri $AR3, #0x03e8 - 0c66 191e lrri $AC0.M, @$AR0 - 0c67 191a lrri $AX0.H, @$AR0 - 0c68 005f loop $AC1.M - 0c69 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c6a 1b7e srri @$AR3, $AC0.M - 0c6b 1b7a srri @$AR3, $AX0.H - 0c6c 0080 03e8 lri $AR0, #0x03e8 - 0c6e 0501 addis $ACC1, #0x01 - 0c6f 1d1f mrr $WR0, $AC1.M - 0c70 1150 0c78 bloopi #0x50, 0x0c78 - 0c72 1c61 mrr $AR3, $AR1 - 0c73 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c74 005f loop $AC1.M - 0c75 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c76 f200 madd $AX0.L, $AX0.H - 0c77 fe00 movpz $ACC0 - 0c78 1b3e srri @$AR1, $AC0.M - 0c79 0088 ffff lri $WR0, #0xffff - 0c7b 8b00 m0 - 0c7c 02df ret - 0c7d 0083 03e8 lri $AR3, #0x03e8 - 0c7f 191e lrri $AC0.M, @$AR0 - 0c80 191a lrri $AX0.H, @$AR0 - 0c81 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c82 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c83 1b7e srri @$AR3, $AC0.M - 0c84 1b7a srri @$AR3, $AX0.H - 0c85 0080 03e8 lri $AR0, #0x03e8 - 0c87 0088 0003 lri $WR0, #0x0003 - 0c89 0085 0000 lri $IX1, #0x0000 - 0c8b 0087 0000 lri $IX3, #0x0000 - 0c8d 1fc2 mrr $AC0.M, $AR2 - 0c8e 195b lrri $AX1.H, @$AR2 - 0c8f 1959 lrri $AX1.L, @$AR2 - 0c90 195f lrri $AC1.M, @$AR2 - 0c91 195a lrri $AX0.H, @$AR2 - 0c92 1c5e mrr $AR2, $AC0.M - 0c93 1fda mrr $AC0.M, $AX0.H - 0c94 1c61 mrr $AR3, $AR1 - 0c95 8a00 m2 - 0c96 8f00 set40 - 0c97 191a lrri $AX0.H, @$AR0 - 0c98 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0c99 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0c9a ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0c9b e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0c9c b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0c9d 1127 0ca8 bloopi #0x27, 0x0ca8 - 0c9f e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ca0 197e lrri $AC0.M, @$AR3 - 0ca1 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ca2 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0ca3 bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0ca4 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0ca5 197f lrri $AC1.M, @$AR3 - 0ca6 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0ca7 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0ca8 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0ca9 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0caa 197e lrri $AC0.M, @$AR3 - 0cab e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0cac eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cad bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 0cae 1bff srrn @$AR3, $AC1.M - 0caf 197f lrri $AC1.M, @$AR3 - 0cb0 8e00 set16 - 0cb1 8b00 m0 - 0cb2 0088 ffff lri $WR0, #0xffff - 0cb4 1b5b srri @$AR2, $AX1.H - 0cb5 1b59 srri @$AR2, $AX1.L - 0cb6 1b5f srri @$AR2, $AC1.M - 0cb7 1b5e srri @$AR2, $AC0.M - 0cb8 02df ret - 0cb9 0083 03e8 lri $AR3, #0x03e8 - 0cbb 191e lrri $AC0.M, @$AR0 - 0cbc 191a lrri $AX0.H, @$AR0 - 0cbd 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cbe 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cbf 1b7e srri @$AR3, $AC0.M - 0cc0 1b7a srri @$AR3, $AX0.H - 0cc1 0080 03e8 lri $AR0, #0x03e8 - 0cc3 0088 0003 lri $WR0, #0x0003 - 0cc5 0085 0000 lri $IX1, #0x0000 - 0cc7 0087 0000 lri $IX3, #0x0000 - 0cc9 1fc2 mrr $AC0.M, $AR2 - 0cca 195b lrri $AX1.H, @$AR2 - 0ccb 1959 lrri $AX1.L, @$AR2 - 0ccc 195f lrri $AC1.M, @$AR2 - 0ccd 195a lrri $AX0.H, @$AR2 - 0cce 1c5e mrr $AR2, $AC0.M - 0ccf 1fda mrr $AC0.M, $AX0.H - 0cd0 1c61 mrr $AR3, $AR1 - 0cd1 8a00 m2 - 0cd2 8f00 set40 - 0cd3 191a lrri $AX0.H, @$AR0 - 0cd4 b800 mulx $AX0.H, $AX1.H - 0cd5 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0cd6 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cd7 ea00 maddc $AC1.M, $AX1.L - 0cd8 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0cd9 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0cda ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0cdb b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0cdc 1127 0ced bloopi #0x27, 0x0ced - 0cde e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cdf e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ce0 197e lrri $AC0.M, @$AR3 - 0ce1 e800 maddc $AC0.M, $AX1.L - 0ce2 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ce3 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0ce4 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0ce5 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0ce6 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0ce7 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0ce8 197f lrri $AC1.M, @$AR3 - 0ce9 ea00 maddc $AC1.M, $AX1.L - 0cea ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0ceb e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0cec ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0ced b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0cee e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cef e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0cf0 197e lrri $AC0.M, @$AR3 - 0cf1 e800 maddc $AC0.M, $AX1.L - 0cf2 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0cf3 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0cf4 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cf5 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0cf6 1bff srrn @$AR3, $AC1.M - 0cf7 197f lrri $AC1.M, @$AR3 - 0cf8 8e00 set16 - 0cf9 8b00 m0 - 0cfa 0088 ffff lri $WR0, #0xffff - 0cfc 1b5b srri @$AR2, $AX1.H - 0cfd 1b59 srri @$AR2, $AX1.L - 0cfe 1b5f srri @$AR2, $AC1.M - 0cff 1b5e srri @$AR2, $AC0.M - 0d00 02df ret - -// stores an offset table??? called by DsetupTable -// Mem[0x03F0] = 0x0000; -// Mem[0x03F1] = 0x0096; -// Mem[0x03F2] = 0x00FF; -// Mem[0x03F3] = 0x0030; -// Mem[0x03F4] = 0x0010; -// Mem[0x03F5] = 0x7F00; -// Mem[0x03F6] = 0x0000; -// Mem[0x03F7] = 0x0100; - 0d01 0eff lris $AC0.M, #0xff - 0d02 00fe 03f2 sr @0x03f2, $AC0.M - 0d04 8100 clr $ACC0 - 0d05 00fe 03f0 sr @0x03f0, $AC0.M - 0d07 00fe 03f6 sr @0x03f6, $AC0.M - 0d09 009e 0100 lri $AC0.M, #0x0100 - 0d0b 00fe 03f7 sr @0x03f7, $AC0.M - 0d0d 00da 03f7 lr $AX0.H, @0x03f7 - 0d0f 009e 8000 lri $AC0.M, #0x8000 - 0d11 5400 subr $ACC0, $AX0.H - 0d12 00fe 03f5 sr @0x03f5, $AC0.M - 0d14 0e30 lris $AC0.M, #0x30 - 0d15 00fe 03f3 sr @0x03f3, $AC0.M - 0d17 0e10 lris $AC0.M, #0x10 - 0d18 00fe 03f4 sr @0x03f4, $AC0.M - 0d1a 009e 0096 lri $AC0.M, #0x0096 - 0d1c 00fe 03f1 sr @0x03f1, $AC0.M - 0d1e 02df ret - -// - 0d1f 0080 0a00 lri $AR0, #0x0a00 - 0d21 8100 clr $ACC0 - 0d22 00de 03f0 lr $AC0.M, @0x03f0 - 0d24 8900 clr $ACC1 - 0d25 b100 tst $ACC0 - 0d26 0275 ifz - 0d27 0550 addis $ACC1, #0x50 - 0d28 00ff 03f0 sr @0x03f0, $AC1.M - 0d2a 0200 0a60 addi $AC0.M, #0x0a60 - 0d2c 1c7e mrr $AR3, $AC0.M - 0d2d 0f4e lris $AC1.M, #0x4e - 0d2e 02bf 00e5 call 0x00e5 - 0d30 02df ret - -// - 0d31 00de 03f1 lr $AC0.M, @0x03f1 - 0d33 0200 0a60 addi $AC0.M, #0x0a60 - 0d35 1c7e mrr $AR3, $AC0.M - 0d36 8100 clr $ACC0 - 0d37 8900 clr $ACC1 - 0d38 009f 00a0 lri $AC1.M, #0x00a0 - 0d3a 00de 03f1 lr $AC0.M, @0x03f1 - 0d3c 5d00 sub $ACC1, $AC0.L - 0d3d 0e50 lris $AC0.M, #0x50 - 0d3e 0750 cmpis $ACC1, #0x50 - 0d3f 0270 ifns - 0d40 5d00 sub $ACC1, $AC0.L - 0d41 00da 03f2 lr $AX0.H, @0x03f2 - 0d43 8600 tstaxh $AX0.H - 0d44 0290 0d62 jns 0x0d62 - 0d46 00de 03f3 lr $AC0.M, @0x03f3 - 0d48 5c00 sub $ACC0, $AC1.L - 0d49 0293 0d4d jle 0x0d4d - 0d4b 029f 0d67 jmp 0x0d67 - 0d4d 00db 03f7 lr $AX1.H, @0x03f7 - 0d4f 009e 8000 lri $AC0.M, #0x8000 - 0d51 4600 addr $ACC0, $AX1.H - 0d52 029f 0d59 jmp 0x0d59 - 0d54 00db 03f7 lr $AX1.H, @0x03f7 - 0d56 009e 8000 lri $AC0.M, #0x8000 - 0d58 5600 subr $ACC0, $AX1.H - 0d59 00fe 03f5 sr @0x03f5, $AC0.M - 0d5b 1fda mrr $AC0.M, $AX0.H - 0d5c 7c00 neg $ACC0 - 0d5d 1f5e mrr $AX0.H, $AC0.M - 0d5e 00fe 03f2 sr @0x03f2, $AC0.M - 0d60 029f 0d67 jmp 0x0d67 - 0d62 00de 03f4 lr $AC0.M, @0x03f4 - 0d64 5d00 sub $ACC1, $AC0.L - 0d65 0293 0d54 jle 0x0d54 - 0d67 8900 clr $ACC1 - 0d68 00dd 03f5 lr $AC1.L, @0x03f5 - 0d6a 1501 lsl $ACC1, #1 - 0d6b 8100 clr $ACC0 - 0d6c 00dc 03f6 lr $AC0.L, @0x03f6 - 0d6e 008b 009f lri $WR3, #0x009f - 0d70 0080 0a00 lri $AR0, #0x0a00 - 0d72 0900 lris $AX1.L, #0x00 - // fill buffer at 0x0A00 with buffer at (0x0A60 + Mem[0x03F1]) - 0d73 1150 0d7a bloopi #0x50, 0x0d7a - 0d75 1878 lrr $AX0.L, @$AR3 - 0d76 4c00 add $ACC0, $AC1.L - 0d77 1cfe mrr $IX3, $AC0.M - 0d78 001f addarn $AR3, $IX3 - 0d79 1fd9 mrr $AC0.M, $AX1.L - 0d7a 1b18 srri @$AR0, $AX0.L - - 0d7b 009f 0a60 lri $AC1.M, #0x0a60 - 0d7d 1fc3 mrr $AC0.M, $AR3 - 0d7e 5c00 sub $ACC0, $AC1.L - 0d7f 00fe 03f1 sr @0x03f1, $AC0.M - 0d81 00fc 03f6 sr @0x03f6, $AC0.L - 0d83 008b ffff lri $WR3, #0xffff - 0d85 02df ret - -// copy buffer at 0x0A00 to right & left buffers - 0d86 0f50 lris $AC1.M, #0x50 - 0d87 0080 0a00 lri $AR0, #0x0a00 - 0d89 0083 0d60 lri $AR3, #0x0d60 - 0d8b 0098 3fff lri $AX0.L, #0x3fff - 0d8d 02bf 00ff call 0x00ff - 0d8f 0f50 lris $AC1.M, #0x50 - 0d90 0080 0a00 lri $AR0, #0x0a00 - 0d92 0083 0d00 lri $AR3, #0x0d00 - 0d94 0098 3fff lri $AX0.L, #0x3fff - 0d96 02bf 00ff call 0x00ff - 0d98 02df ret - -// ??? -// ACC1: ??? - 0d99 b900 tst $ACC1 - 0d9a 0294 0d9f jnz 0x0d9f - 0d9c 6800 movax $ACC0, $AX0.L - 0d9d b100 tst $ACC0 - 0d9e 02d5 retz - 0d9f 1c23 mrr $AR1, $AR3 - 0da0 197e lrri $AC0.M, @$AR3 - 0da1 191b lrri $AX1.H, @$AR0 - 0da2 d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - - 0da3 1120 0da9 bloopi #0x20, 0x0da9 - 0da5 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0da6 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0da7 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0da8 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0da9 4900 addax $ACC1, $AX0.L - - 0daa 1108 0daf bloopi #0x08, 0x0daf - 0dac dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0dad 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dae dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0daf 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - - 0db0 02df ret - -// interleave two buffers - 0db1 8f00 set40 - 0db2 8d00 set15 - 0db3 1c03 mrr $AR0, $AR3 - 0db4 00d9 038e lr $AX1.L, @0x038e // (0x0040) set by DsetupTable - 0db6 0b04 lris $AX1.H, #0x04 - 0db7 197a lrri $AX0.H, @$AR3 - 0db8 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3 - 0db9 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0dba 1128 0dbf bloopi #0x28, 0x0dbf - 0dbc 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0dbd b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dbe 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0dbf b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dc0 8c00 clr15 - 0dc1 8e00 set16 - 0dc2 02df ret - -// ??? - 0dc3 00da 0485 lr $AX0.H, @0x0485 - 0dc5 8600 tstaxh $AX0.H - 0dc6 0295 0dd4 jz 0x0dd4 - 0dc8 8100 clr $ACC0 - 0dc9 00de 042a lr $AC0.M, @0x042a - 0dcb 147f lsr $ACC0, #-1 - 0dcc 00fe 042b sr @0x042b, $AC0.M - 0dce b100 tst $ACC0 - 0dcf 0294 0dd4 jnz 0x0dd4 - 0dd1 0a01 lris $AX0.H, #0x01 - 0dd2 00fa 0401 sr @0x0401, $AX0.H - - 0dd4 8f00 set40 - 0dd5 8100 clr $ACC0 - 0dd6 00de 0428 lr $AC0.M, @0x0428 - 0dd8 1478 lsr $ACC0, #-8 - 0dd9 00df 0428 lr $AC1.M, @0x0428 - 0ddb 0340 007f andi $AC1.M, #0x007f - 0ddd 1f1e mrr $AX0.L, $AC0.M - 0dde 1f5f mrr $AX0.H, $AC1.M - 0ddf 0220 007f xori $ACC0, #0x007f - 0de1 1f3e mrr $AX1.L, $AC0.M - 0de2 0320 007f xori $ACC1, #0x007f - 0de4 1f7f mrr $AX1.H, $AC1.M - 0de5 8100 clr $ACC0 - 0de6 8900 clr $ACC1 - 0de7 009f 0200 lri $AC1.M, #0x0200 - 0de9 1fd8 mrr $AC0.M, $AX0.L - 0dea 4c00 add $ACC0, $AC1.L - 0deb 1c1e mrr $AR0, $AC0.M - 0dec 1818 lrr $AX0.L, @$AR0 - 0ded 1fda mrr $AC0.M, $AX0.H - 0dee 4c00 add $ACC0, $AC1.L - 0def 1c1e mrr $AR0, $AC0.M - 0df0 181a lrr $AX0.H, @$AR0 - 0df1 1fd9 mrr $AC0.M, $AX1.L - 0df2 4c00 add $ACC0, $AC1.L - 0df3 1c1e mrr $AR0, $AC0.M - 0df4 1819 lrr $AX1.L, @$AR0 - 0df5 1fdb mrr $AC0.M, $AX1.H - 0df6 4c00 add $ACC0, $AC1.L - 0df7 1c1e mrr $AR0, $AC0.M - 0df8 181b lrr $AX1.H, @$AR0 - 0df9 8a00 m2 - 0dfa 0080 0b00 lri $AR0, #0x0b00 - 0dfc 9800 mul $AX1.L, $AX1.H - 0dfd ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0dfe b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dff 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M - 0e00 6e30 movp's $ACC0 : @$AR0, $AC0.M - 0e01 1b1e srri @$AR0, $AC0.M - 0e02 8b00 m0 - 0e03 0080 0b00 lri $AR0, #0x0b00 - 0e05 0081 0b04 lri $AR1, #0x0b04 - 0e07 00da 042a lr $AX0.H, @0x042a - 0e09 02bf 0e54 call 0x0e54 - 0e0b 0081 0b08 lri $AR1, #0x0b08 - 0e0d 0080 0b00 lri $AR0, #0x0b00 - 0e0f 00da 042a lr $AX0.H, @0x042a - 0e11 00de 0429 lr $AC0.M, @0x0429 - 0e13 8a00 m2 - 0e14 c000 mulc $AC0.M, $AX0.H - 0e15 8b00 m0 - 0e16 6e00 movp $ACC0 - 0e17 1f5e mrr $AX0.H, $AC0.M - 0e18 02bf 0e54 call 0x0e54 - 0e1a 0080 0b00 lri $AR0, #0x0b00 - 0e1c 0081 0b0c lri $AR1, #0x0b0c - 0e1e 8100 clr $ACC0 - 0e1f 8900 clr $ACC1 - 0e20 00de 042b lr $AC0.M, @0x042b - 0e22 00df 042a lr $AC1.M, @0x042a - 0e24 00fe 042a sr @0x042a, $AC0.M - 0e26 5c00 sub $ACC0, $AC1.L - 0e27 1f5e mrr $AX0.H, $AC0.M - 0e28 02bf 0e5f call 0x0e5f - 0e2a 0080 0b0c lri $AR0, #0x0b0c - 0e2c 0081 0b10 lri $AR1, #0x0b10 - 0e2e 00da 0429 lr $AX0.H, @0x0429 - 0e30 02bf 0e54 call 0x0e54 - 0e32 0081 0b04 lri $AR1, #0x0b04 - 0e34 0082 0b0c lri $AR2, #0x0b0c - 0e36 0083 0e6d lri $AR3, #0x0e6d - 0e38 1108 0e51 bloopi #0x08, 0x0e51 - 0e3a 195f lrri $AC1.M, @$AR2 - 0e3b 15fb asr $ACC1, #-5 - 0e3c 1f1d mrr $AX0.L, $AC1.L - 0e3d 1f5f mrr $AX0.H, $AC1.M - 0e3e 193f lrri $AC1.M, @$AR1 - 0e3f 00e1 0b24 sr @0x0b24, $AR1 - 0e41 00e2 0b25 sr @0x0b25, $AR2 - 0e43 021b ilrri $AC0.M, @$AR3 - 0e44 00e3 0b26 sr @0x0b26, $AR3 - 0e46 1c7e mrr $AR3, $AC0.M - 0e47 00c0 038f lr $AR0, @0x038f - 0e49 02bf 0d99 call 0x0d99 - 0e4b 00c1 0b24 lr $AR1, @0x0b24 - 0e4d 00c2 0b25 lr $AR2, @0x0b25 - 0e4f 00c3 0b26 lr $AR3, @0x0b26 - 0e51 0000 nop - 0e52 8e00 set16 - 0e53 02df ret - -// - 0e54 8a00 m2 - 0e55 191f lrri $AC1.M, @$AR0 - 0e56 d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0 - 0e57 d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0 - 0e58 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e59 191f lrri $AC1.M, @$AR0 - 0e5a d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e5b 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0e5c 1b3e srri @$AR1, $AC0.M - 0e5d 8b00 m0 - 0e5e 02df ret - 0e5f 8a00 m2 - 0e60 8d00 set15 - 0e61 1f7e mrr $AX1.H, $AC0.M - 0e62 1918 lrri $AX0.L, @$AR0 - 0e63 a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0 - 0e64 ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0 - 0e65 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e66 1918 lrri $AX0.L, @$AR0 - 0e67 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0e68 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0e69 1b3e srri @$AR1, $AC0.M - 0e6a 8c00 clr15 - 0e6b 8b00 m0 - 0e6c 02df ret - 0e6d 0d00 lris $AC1.L, #0x00 - 0e6e 0d60 lris $AC1.L, #0x60 - 0e6f 0f40 lris $AC1.M, #0x40 - 0e70 0ca0 lris $AC0.L, #0xa0 - 0e71 0e80 lris $AC0.M, #0x80 - 0e72 0ee0 lris $AC0.M, #0xe0 - 0e73 0be0 lris $AX1.H, #0xe0 - 0e74 0c40 lris $AC0.L, #0x40 - -// store ramp??? -// AR0 = 0x0580 (left buffer?) -// AR1 = 0x0520 (right buffer?) - 0e75 00f9 0361 sr @0x0361, $AX1.L - 0e77 1fc0 mrr $AC0.M, $AR0 - 0e78 0200 fffc addi $AC0.M, #0xfffc // AC0.M = AR0 - 4; - 0e7a 1c1e mrr $AR0, $AC0.M // AR0 = AC0.M = 0x057C; - 0e7b 1c5e mrr $AR2, $AC0.M // AR2 = AC0.M = 0x057C; - 0e7c 0083 043c lri $AR3, #0x043c // AR3 = 0x043C; - 0e7e 197e lrri $AC0.M, @$AR3 // AC0.M = Mem[AR3]; AR3++; - 0e7f 197f lrri $AC1.M, @$AR3 // AC1.M = Mem[AR3]; AR3++; - 0e80 80a2 nx'sl : $AC0.M, $AX0.H // AX0.H = Mem[AR3]; AR3++; Mem[AR0] = AC0.M; AR0++; - 0e81 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - 0e82 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - 0e83 1b1f srri @$AR0, $AC1.M - 0e84 1c02 mrr $AR0, $AR2 // AR0 = AR2; (0x0580) - 0e85 8100 clr $ACC0 - 0e86 00de 0402 lr $AC0.M, @0x0402 // AC0.M = Mem[0x0402]; (0x0FFC) (ACC0 = 0x0FFC0000) - 0e88 00fe 0362 sr @0x0362, $AC0.M // Mem[0x0362] = AC0.M; - 0e8a 1474 lsr $ACC0, #-12 // ACC0 >>= 12; - 0e8b 1f7e mrr $AX1.H, $AC0.M // AX1.H = AC0.M; (0x0000) - 0e8c 1f3c mrr $AX1.L, $AC0.L // AX1.L = AC0.L; (0xFFC0) - 0e8d 8900 clr $ACC1 - 0e8e 00dd 0430 lr $AC1.L, @0x0430 // AC1.L = Mem[0x0430]; - 0e90 1504 lsl $ACC1, #4 // ACC1 <<= 4; - 0e91 0604 cmpis $ACC0, #0x04 - 0e92 0290 0ee9 jns 0x0ee9 - 0e94 1fdd mrr $AC0.M, $AC1.L - 0e95 0082 02b0 lri $AR2, #0x02b0 // AR2 = 0x02B0; temp buffer? - // store a ramp. for example, the ramp is 0xFFC0, 0xFF80, 0xFF40, 0xFF00, 0xFEC0 and so on... if start value (Mem[0x0402]) is 0x0FFC. - 0e97 1050 loopi #0x50 // for(i = 0; i < 80; i++) - 0e98 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L // ACC1 += AX1.L; Mem[AR2] = AC1.L; AR2++; - - 0e99 1fbe mrr $AC1.L, $AC0.M - 0e9a 00fe 0360 sr @0x0360, $AC0.M - 0e9c 8900 clr $ACC1 - 0e9d 1fbe mrr $AC1.L, $AC0.M - 0e9e 0af8 lris $AX0.H, #0xf8 // AX0.H = 0x00F8; - 0e9f 009b 00fc lri $AX1.H, #0x00fc // AX1.H = 0x00FC; - 0ea1 00d8 0361 lr $AX0.L, @0x0361 // AX0.L = Mem[0x0361]; - 0ea3 0082 02b0 lri $AR2, #0x02b0 // AR2 = 0x02B0; - 0ea5 0083 02b0 lri $AR3, #0x02b0 // AR3 = 0x02B0; - 0ea7 195e lrri $AC0.M, @$AR2 // AC0.M = Mem[AR2]; - 0ea8 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M // AC0.M &= 0x00F8; AX0.L = Mem[AR0]; AR0++; Mem[AR3] = AC0.M; AR3++; - // do some processing on the ramp we just made, and merge it to the buffer at 0x0580 - 0ea9 1128 0eae bloopi #0x28, 0x0eae // - 0eab 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 // AC0.M &= AX1.H; AC1.M = Mem[AR2]; AR2++; - 0eac 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H // AC1.M &= 0x00F8; Mem[AR0] = AC1.M; AR0++; AX1.H = Mem[AR3]; AR3++; - 0ead 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 // ... - 0eae 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - - 0eaf 8a00 m2 // multiply by 2 - 0eb0 0082 02b0 lri $AR2, #0x02b0 - 0eb2 00dd 0430 lr $AC1.L, @0x0430 - 0eb4 1504 lsl $ACC1, #4 - 0eb5 1fe0 mrr $AC1.M, $AR0 - 0eb6 8100 clr $ACC0 - 0eb7 00de 0362 lr $AC0.M, @0x0362 - 0eb9 1474 lsr $ACC0, #-12 - 0eba 1f7e mrr $AX1.H, $AC0.M // AX1.H = 0x0000 - 0ebb 1f3c mrr $AX1.L, $AC0.L // AX1.L = 0xFFC0 - 0ebc 8f00 set40 - 0ebd 1943 lrri $AR3, @$AR2 - 0ebe 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ebf 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ec0 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ec1 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ec2 f200 madd $AX0.L, $AX0.H - 0ec3 fe00 movpz $ACC0 - 0ec4 1c1f mrr $AR0, $AC1.M - 0ec5 1943 lrri $AR3, @$AR2 - 0ec6 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ec7 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - - 0ec8 114e 0ed0 bloopi #0x4e, 0x0ed0 // uh? 0x4E? skip two samples? - 0eca f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ecb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ecc f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0ecd 1c1f mrr $AR0, $AC1.M - 0ece 1943 lrri $AR3, @$AR2 - 0ecf 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ed0 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - - 0ed1 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ed2 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ed3 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0ed4 fe00 movpz $ACC0 - 0ed5 1b3e srri @$AR1, $AC0.M - 0ed6 8b00 m0 // don't multiply by 2 - 0ed7 8e00 set16 - 0ed8 00fe 0433 sr @0x0433, $AC0.M - 0eda 1c1f mrr $AR0, $AC1.M - 0edb 150c lsl $ACC1, #12 - 0edc 0340 0fff andi $AC1.M, #0x0fff - 0ede 00ff 0430 sr @0x0430, $AC1.M - 0ee0 0083 043c lri $AR3, #0x043c - 0ee2 191e lrri $AC0.M, @$AR0 - 0ee3 191f lrri $AC1.M, @$AR0 - 0ee4 80a0 nx'ls : $AX0.H, $AC0.M - 0ee5 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0ee6 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0ee7 1b7f srri @$AR3, $AC1.M - 0ee8 02df ret - -// - 0ee9 1fe0 mrr $AC1.M, $AR0 - 0eea 1c1f mrr $AR0, $AC1.M - // copy buffer at 0x0580 to buffer at 0x0520? - 0eeb 1128 0ef2 bloopi #0x28, 0x0ef2 - 0eed 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0eee 1b3e srri @$AR1, $AC0.M - 0eef 1c1f mrr $AR0, $AC1.M - 0ef0 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0ef1 1b3e srri @$AR1, $AC0.M - 0ef2 1c1f mrr $AR0, $AC1.M - - 0ef3 029f 0ed8 jmp 0x0ed8 - -// - 0ef5 0083 0520 lri $AR3, #0x0520 - 0ef7 00de 0433 lr $AC0.M, @0x0433 - 0ef9 1050 loopi #0x50 - 0efa 1b7e srri @$AR3, $AC0.M - 0efb 029f 0336 jmp 0x0336 - -// - 0efd 1c20 mrr $AR1, $AR0 - 0efe 185f lrr $AC1.M, @$AR2 - 0eff 1f7f mrr $AX1.H, $AC1.M - 0f00 193a lrri $AX0.H, @$AR1 - 0f01 6400 movr $ACC0, $AX0.H - 0f02 0078 0f07 bloop $AX0.L, 0x0f07 - 0f04 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1 - 0f05 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M - 0f06 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1 - 0f07 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M - 0f08 1a5b srr @$AR2, $AX1.H - 0f09 02df ret - -// InitUnkTable() - 0f0a 0098 8240 lri $AX0.L, #0x8240 - 0f0c 00f8 04e8 sr @0x04e8, $AX0.L - 0f0e 0098 7fff lri $AX0.L, #0x7fff - 0f10 00f8 04e9 sr @0x04e9, $AX0.L - 0f12 0098 7dbf lri $AX0.L, #0x7dbf - 0f14 00f8 04ea sr @0x04ea, $AX0.L - 0f16 0098 843f lri $AX0.L, #0x843f - 0f18 00f8 04eb sr @0x04eb, $AX0.L - 0f1a 0098 b23b lri $AX0.L, #0xb23b - 0f1c 00f8 04f0 sr @0x04f0, $AX0.L - 0f1e 0098 7fff lri $AX0.L, #0x7fff - 0f20 00f8 04f1 sr @0x04f1, $AX0.L - 0f22 0098 4dc4 lri $AX0.L, #0x4dc4 - 0f24 00f8 04f2 sr @0x04f2, $AX0.L - 0f26 0098 d808 lri $AX0.L, #0xd808 - 0f28 00f8 04f3 sr @0x04f3, $AX0.L - 0f2a 0098 0000 lri $AX0.L, #0x0000 - 0f2c 0080 04ec lri $AR0, #0x04ec - 0f2e 1004 loopi #0x04 - 0f2f 1b18 srri @$AR0, $AX0.L - 0f30 0080 04f4 lri $AR0, #0x04f4 - 0f32 1004 loopi #0x04 - 0f33 1b18 srri @$AR0, $AX0.L - 0f34 02df ret - -// mixer? - 0f35 0080 0f40 lri $AR0, #0x0f40 - 0f37 0083 0b00 lri $AR3, #0x0b00 - 0f39 8900 clr $ACC1 - 0f3a 0f50 lris $AC1.M, #0x50 - 0f3b 0098 6784 lri $AX0.L, #0x6784 - 0f3d 02bf 010e call 0x010e - 0f3f 0080 04e8 lri $AR0, #0x04e8 - 0f41 0082 04ec lri $AR2, #0x04ec - 0f43 0081 0b00 lri $AR1, #0x0b00 - 0f45 8900 clr $ACC1 - 0f46 0f50 lris $AC1.M, #0x50 - 0f47 0080 0b00 lri $AR0, #0x0b00 - 0f49 0083 0d00 lri $AR3, #0x0d00 - 0f4b 0098 7fff lri $AX0.L, #0x7fff - 0f4d 02bf 00ff call 0x00ff - 0f4f 8900 clr $ACC1 - 0f50 0f50 lris $AC1.M, #0x50 - 0f51 0080 0b00 lri $AR0, #0x0b00 - 0f53 0083 0d60 lri $AR3, #0x0d60 - 0f55 0098 b820 lri $AX0.L, #0xb820 - 0f57 02bf 00ff call 0x00ff - 0f59 0080 0ca0 lri $AR0, #0x0ca0 - 0f5b 0083 0b00 lri $AR3, #0x0b00 - 0f5d 8900 clr $ACC1 - 0f5e 0f50 lris $AC1.M, #0x50 - 0f5f 0098 6784 lri $AX0.L, #0x6784 - 0f61 02bf 010e call 0x010e - 0f63 0080 04e8 lri $AR0, #0x04e8 - 0f65 0082 04f4 lri $AR2, #0x04f4 - 0f67 0081 0b00 lri $AR1, #0x0b00 - 0f69 8900 clr $ACC1 - 0f6a 0f50 lris $AC1.M, #0x50 - 0f6b 0080 0b00 lri $AR0, #0x0b00 - 0f6d 0083 0d00 lri $AR3, #0x0d00 - 0f6f 0098 47e0 lri $AX0.L, #0x47e0 - 0f71 02bf 00ff call 0x00ff - 0f73 8900 clr $ACC1 - 0f74 0f50 lris $AC1.M, #0x50 - 0f75 0080 0b00 lri $AR0, #0x0b00 - 0f77 0083 0d60 lri $AR3, #0x0d60 - 0f79 0098 8001 lri $AX0.L, #0x8001 - 0f7b 02bf 00ff call 0x00ff - 0f7d 02df ret - - 0f7e 0000 nop - 0f7f 0000 nop \ No newline at end of file diff --git a/docs/DSP/DSP_UC_Zelda.txt b/docs/DSP/DSP_UC_Zelda.txt deleted file mode 100644 index 770ca65f26..0000000000 --- a/docs/DSP/DSP_UC_Zelda.txt +++ /dev/null @@ -1,5094 +0,0 @@ -/* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -All code is now wrapped in void Function() {} - the new DSP LLE debugger -can parse this file and auto read symbols using those. - -BIG Questions: - - - Who resets the 0x0350 to the beginning of the command block? Wrap register? - - What does 00eb_Unk_BufferMultAddToDest?? - - Why is a PB-Transfer from RAM to DMEM 0xC0 shorts long but DMEM to RAM just 0x80 - -DSP functionality to test: - - Interrupts (7) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ -// -// memory map -// todo - define syntax for this so it can be auto read. - -// -0x0000 to 0x280 // Unknown table -0x0280 // command queue - -/////////////////////////////////////////// - -0x0300 to 0x0320 // AFC COEF table - -0x0342 // low part of the DSetupTable /(Luigi2us) thinks it is the number of PBs -0x0343 // current command code (the code for the switch - casement table) seems to be for debug... nobody loads it -0x0344 // high part of the (command & 0xFF) ... prolly some kind of paramter -0x0345 // low part of the command - -0x034e (0x0000) - -/////////////////////////////////////////// - - - -/////////////////////////////////////////// -// Initialized at 0688_InitCommandBlock() -0x0350 (0x0280) // address to end of the command queue -0x0351 (0x0280) // address to start of the command queue -0x0352 (0x0000) // number of commands - - -0x0356[] // current command queue... eg: 0x81000040 for DsetupTable -0x0358 // first parameter of the command ... - - -0x0364 // Temp Buffer for AFC Decoder - -/////////////////////////////////////////// -0x0380 // RAM Address of the PBs -0x0381 // - -0x038e // used by COMMAND_02 copies the low part of the command to this place - - -0x03a8 // COMMAND_02 copies a struct with the size of 0x40 to the place - -/////////////////////////////////////////// -// used by 05b8_NewMail() exception to store register and restore registers -0x03fa to 0x03ff - -// shared and used by COMMAND_01 (DSetupTable) -0x03f0 // 0x00 -0x03f1 // 0x96 -0x03f2 // 0xFF -0x03f3 // 0x30 -0x03f5 // 0x10 -0x03f6 // 0x00 -0x03f7 // 0x100 ... got some more math... have to recheck it - - -0x03f9 // used by COMMAND_02... if the program decides to continue the UCode it stores the continue address... - -////////////////////////////////////////////// -// current PB in DSyncFrame -0x0400 -. -. -. -0x04C0 - - -/// -0x0400 - must be != 0 to be a valid block -0x0401 - must be != 0 to be a valid block - -0x0402 - Sample Decode Offset ?? Offset = (*0x402 * 0x50) - -0x0404 - Initialize Sample Decoder -0x0406 - Direct Stream ... no sample decoder is needed. - At the end of the PB Handling 0x0404 is set to 0 if it is NOT a direct stream - -0x0430 - Base Address ?? (0x0430 + Offset) << 4 - -0x042c flag if > 0 033d_unk() does something - - -0x0433 stored to 0x03f8 ... i think that is the current sample buffer - -0x0458 hmmm.... - -0x0480 if 0x0406 is zero check how we have to decode this data... - -0x0484 seems to contain filter settings... -0x0484 & 0x1f -> (02ed to 030f) -0x0484 & 0x20 - -0x04a8 if != zero sample is modified with function at 0x0c84.. perhaps an filter or volume - - -//////////////////////////////////////// -0x04d3 "offset to sample data" ???? - -There's definitely a bunch of sample data stored in each PB but I don't know exactly how. - - -/////////////////////////////////////////// -// Initialized at 0e14_Unk() -0x04e8 (0x8240) -0x04e9 (0x7FFF) -0x04ea (0x7DBF) -0x04eb (0x843f) -0x04ec (0x0000) -0x04ed (0x0000) -0x04ee (0x0000) -0x04ef (0x0000) - -0x04f0 (0xb23b) -0x04f1 (0x7FFF) -0x04f2 (0x4dc4) -0x04f3 (0xd808) -0x04f4 (0x0000) -0x04f5 (0x0000) -0x04f6 (0x0000) -0x04f7 (0x0000) - -/////////////////////////////////////////// -0x04fc... // used for some kind of data exchange between SyncFrame and MailExceptionHandler - // It is like this: - // (0x04fc + lastRenderedFrame) must be "something" :) - -0x0580.. Unresampled audio data is decoded to here - -/////////////////////////////////////////// -// Initialized at 04c0_Unk()... used by SyncFrame -0x0B00 to 0x0C00 -// The memory at 0b00 seems to be generally used as scratch space for various things. - - -////////////////////////////////////////// - -0x0dc0 -- ?????????? - - -// -// exception vector -// -0000 029f 0012 jmp 0x0012 -> ResetVector() -0002 0000 nop -0003 0000 nop -0004 02ff rti -0005 0000 nop -0006 02ff rti -0007 0000 nop -0008 02ff rti -0009 0000 nop -000a 02ff rti -000b 0000 nop -000c 02ff rti -000d 0000 nop -000e 029f 05b8 jmp 0x05b8 -> 05b8_NewMail() - -0010 029f 004e jmp 0x004e -> 004e_ContinueUCode() ??? - -// reset vector - -void 0012_ResetVector() -{ - // 0012 1205 sbclr #0x05 - - // 0013 02bf 0057 call 0x0057 - 0057_InitHardware() - - /* - 0015 8100 clr $ACC0 - 0016 009f 1000 lri $AC1.M, #0x1000 - 0018 0080 0000 lri $AR0, #0x0000 - 001a 005f loop $AC1.M - 001b 1b1e srri @$AR0, $AC0.M - Clear memory - */ - { - short ACC0 = 0; - short AR0 = 0x0000; - for (int i=0; i<0x1000; i++) - { - *AR0 = ACC0; - AR0++; - } - } - - // 001c 02bf 0688 call 0x0688 - 0688_InitCommandBlock(); - - // 001e 02bf 04c0 call 0x04c0 - 04c0_UnknownInit(); - - // 0020 02bf 0e14 call 0x0e14 - 0e14_DolbyInit(); // Init from 0x04e8 to 0x04f8 - - // 0022 0e00 lris $AC0.M, #0x00 - // 0023 02bf 066a call 0x066a - SendMB_DCD1(0x0000) - - // 0025 009e 1111 lri $AC0.M, #0x1111 - // 0027 02bf 0674 call 0x0674 - SendMB_F355(0x1111) - - // 0029 0e00 lris $AC0.M, #0x00 - // 002a 00fe 034e sr @0x034e, $AC0.M - *0x034e = 0x00 - - 002c 1305 sbset #0x05 - - // 002d 029f 06c5 jmp 0x06c5 - - // - // an exception will be raised if a new mail is inside the mailbox - // the exception handler will copy the command to an address and the - // 06c5_CopyCommandBlock creates a copy of the command to 0x0356 - // -:WaitForNewCommandBlock - while (06c5_CopyCommandBlock() == 0x002d); - - // 002f 00df 0357 lr $AC1.M, @0x0357 - // 0031 00ff 0345 sr @0x0345, $AC1.M - - *0x0345 = *0x0357 - - // 0033 00de 0356 lr $AC0.M, @0x0356 - // 0035 1ffe mrr $AC1.M, $AC0.M - // 0036 0340 00ff andi $AC1.M, #0x00ff - // 0038 00ff 0344 sr @0x0344, $AC1.M - - short upperCommand = *0x0356 // AC0 = upperCommand - *0x0344 = upperCommand & 0x00FF - - // 003a 1479 lsr $ACC0, #-7 - // 003b 0240 007e andi $AC0.M, #0x007e - // 003d 00fe 0343 sr @0x0343, $AC0.M - upperCommand = (upperCommand >> 7) & 0x7e // F|RES: i think duddy is wrong here ... a negative must be a shift right - *0x0343 = upperCommand - - // 003f 0200 0075 addi $AC0.M, #0x0075 - // 0041 1c1e mrr $AR0, $AC0.M - // 0042 170f jmpr $AR0 - // switch casement of the commands.. jump table is at 0075 - - switch (upperCommand >> 1) // command must be shift >> 1 in our source code because the jump table is aligned with 2 Bytes - { - // case 0x00: 0x0043 - case 0x01: 0095_COMMAND_01(); break; - case 0x02: 0243_COMMAND_02(); break; - - case 0x03: 0x0073 - case 0x04: 0095_COMMAND_04(); break; - case 0x05: 0x0592 - case 0x06: 0x0469 - case 0x07: 0x041d - case 0x08: 0x0485 - case 0x09: 0x044d - // case 0x0A: 0x0043 - // case 0x0B: 0x0043 - // case 0x0C: 0x0043 - case 0x0D: 0x00b2 - // case 0x0E: 0x0043 - // case 0x0F: 0x0043 - } - - # 0043 0092 00ff lri $CR, #0x00ff - - // 0045 0e04 lris $AC0.M, #0x04 - // 0046 02bf 066a call 0x066a - SendMB_DCD1(0x0004) - - // 0048 00de 0356 lr $AC0.M, @0x0356 - // 004a 02bf 0674 call 0x0674 - SendMB_F355(@0x0356) - - // 004c 029f 002d jmp 0x002d - GOTO :WaitForNewCommandBlock -} - -void 004e_ContinueUCode??() -{ - # 004e 1205 sbclr #0x05 - - // 004f 02bf 0057 call 0x0057 - 0057_InitHardware() - - // 0051 0e01 lris $AC0.M, #0x01 - // 0052 02bf 066a call 0x066a - SendMB_DCD1(0x0001) - - # 0054 1305 sbset #0x05 - - // 0055 029f 002d jmp 0x002d - GOTO :WaitForNewCommandBlock -} - -void 0057_InitHardware() -{ - 0057 1202 sbclr #0x02 - 0058 1203 sbclr #0x03 - 0059 1204 sbclr #0x04 - 005a 1306 sbset #0x06 - 005b 8e00 set16 - 005c 8c00 clr15 - 005d 8b00 m0 - - // Set all indexing wrappers to max range. - 005e 009e ffff lri $AC0.M, #0xffff - 0060 1d1e mrr $WR0, $AC0.M - 0061 1d3e mrr $WR1, $AC0.M - 0062 1d5e mrr $WR2, $AC0.M - 0063 1d7e mrr $WR3, $AC0.M - - // Have CR point to the HW interface. - 0064 0092 00ff lri $CR, #0x00ff - // 0066 02df ret -} - -void 0067_CopyCommand(_destAddr($AR0), _loopCount($AC0.M)) -{ - // 0067 0090 0000 lri $AC0.H, #0x0000 - // 0069 0c00 lris $AC0.L, #0x00 - // 006a 0081 0358 lri $AR1, #0x0358 - AC0.H = 0x0000 - AC0.L = 0x00 - AR1 = 0x0358 - - // 006c 007e 0071 bloop $AC0.M, 0x0071 - // 006e 193e lrri $AC0.M, @$AR1 - // 006f 1b1e srri @$AR0, $AC0.M - // 0070 193e lrri $AC0.M, @$AR1 - // 0071 1b1e srri @$AR0, $AC0.M - - for (int i=0; i<_loopCount; i++) - { - *_destAddr++ = *AR1.M++ - *_destAddr++ = *AR1.M++ - } - - // 0072 02df ret -} - -/* - 0073 029f 0043 jmp 0x0043 - 0075 029f 0043 jmp 0x0043 - 0077 029f 0095 jmp 0x0095 - 0079 029f 0243 jmp 0x0243 - 007b 029f 0073 jmp 0x0073 - 007d 029f 0580 jmp 0x0580 - 007f 029f 0592 jmp 0x0592 - 0081 029f 0469 jmp 0x0469 - 0083 029f 041d jmp 0x041d - 0085 029f 0485 jmp 0x0485 - 0087 029f 044d jmp 0x044d - 0089 029f 0043 jmp 0x0043 - 008b 029f 0043 jmp 0x0043 - 008d 029f 0043 jmp 0x0043 - 008f 029f 00b2 jmp 0x00b2 - 0091 029f 0043 jmp 0x0043 - 0093 029f 0043 jmp 0x0043 -jump table for command code decoding - */ - -// DsetupTable -void 0095_COMMAND_01() -{ - // 0095 0080 0380 lri $AR0, #0x0380 - // 0097 0e04 lris $AC0.M, #0x04 - // 0098 02bf 0067 call 0x0067 - 0067_CopyCommand(0x0380, 0x04) - - // 009a 0081 0382 lri $AR1, #0x0382 - // 009c 009f 0000 lri $AC1.M, #0x0000 - // 009e 0080 0280 lri $AR0, #0x0280 - // 00a0 02bf 0523 call 0x0523 - 0523_CopyRAMtoDMEM(0x0382, 0x0000, 0x0280) - - // 00a2 0081 0384 lri $AR1, #0x0384 - // 00a4 009f 0300 lri $AC1.M, #0x0300 - // 00a6 0080 0020 lri $AR0, #0x0020 - // 00a8 02bf 0523 call 0x0523 - 0523_CopyRAMtoDMEM(0x0384, 0x0300, 0x0020) - - // 00aa 00de 0345 lr $AC0.M, @0x0345 - // 00ac 00fe 0342 sr @0x0342, $AC0.M - *0x0342 = *0x0345 - - // 00ae 02bf 0bec call 0x0bec - 0bec_Unk() - - // 00b0 029f 0043 jmp 0x0043 -} - -// Command 0xD -void 00b2_Unk_CommandD() { - 00b2 0080 0374 lri $AR0, #0x0374 - 00b4 0e01 lris $AC0.M, #0x01 - 00b5 00fe 0377 sr @0x0377, $AC0.M - 00b7 00fe 037c sr @0x037c, $AC0.M - 00b9 02bf 0067 call 0x0067 // CopyCommand - - // 00bb 00de 0345 lr $AC0.M, @0x0345 - // 00bd 00fe 0376 sr @0x0376, $AC0.M - *0x0376 = *0x0345; - - 00bf 029f 0043 jmp 0x0043 -} - -void 00c1_CopyPBToDMEM() -{ - // 00c1 0081 034c lri $AR1, #0x034c - // 00c3 009f 0400 lri $AC1.M, #0x0400 - // 00c5 0080 00c0 lri $AR0, #0x00c0 - // 00c7 02bf 0523 call 0x0523 - // 00c9 02df ret - - 0523_CopyRAMtoDMEM(0x034c, 0x0400, 0x00c0); -} - - -void 00ca_CopyPBToRAM() -{ - // 00ca 0081 034c lri $AR1, #0x034c - // 00cc 009f 0400 lri $AC1.M, #0x0400 - // 00ce 0080 0080 lri $AR0, #0x0080 - // 00d0 0081 034c lri $AR1, #0x034c - AR1 = 0x034c - AC1.M = 0x0400 - AR0 = 0x0080 - - // 00d2 193e lrri $AC0.M, @$AR1 - // 00d3 193c lrri $AC0.L, @$AR1 - AC0.M = *0x034c - AC0.L = *0x034d - - // 00d4 0098 0000 lri $AX0.L, #0x0000 - // 00d6 7000 addaxl $ACC0, $AX0.L - // 00d7 02bf 0532 call 0x0532 - - 0532_DMEMtoRAM(0x0400, ACC0, 0x0080) - - // 00d9 02df ret -} - - -void 00da_CopyBuffer(_src($AR0), _dest($AR3), LenMinusOne(_AC1.M)) -{ - 00da 191e lrri $AC0.M, @$AR0 - 00db 191a lrri $AX0.H, @$AR0 - 00dc 005f loop $AC1.M - 00dd 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 00de 1b7e srri @$AR3, $AC0.M - 00df 1b7a srri @$AR3, $AX0.H - // 00e0 02df ret -} - - -void 00e1_XorBuffer( .., _LenInDWORDs(_AC1.M)) { - 00e1 191e lrri $AC0.M, @$AR0 - 00e2 191a lrri $AX0.H, @$AR0 - // 00e3 007f 00e8 bloop $AC1.M, 0x00e8 - for (int i = 0; i < AC1.M; i++) { - 00e5 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 00e6 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 00e7 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 00e8 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - } - // 00e9 0000 nop - // 00ea 02df ret -} - - -// --- the disasm looks buggy... AR3 seems to be the destination but it isnt used at all... no idea -// Hm, SL actually is able to use AR3 implicitly. -void 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) -{ - // 00eb 8a00 m2 // All multiplication results are multiplied by 2. - // 00ec 157f lsr $ACC1, #-1 //_size/2 - 00ed 1c20 mrr $AR1, $AR0 - 00ee 1c03 mrr $AR0, $AR3 // 'sl stores to AR0 - - // SW pipelineing strikes again... - 00ef 193a lrri $AX0.H, @$AR1 - 00f0 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 - 00f1 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 - // 00f2 007f 00f7 bloop $AC1.M, 0x00f7 - for (int i = 0; i < _size/2; i++) { - AX0.H = *AR1; - PROD = * - // 00f4 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - // 00f5 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - // 00f6 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - // 00f7 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - ACC0 += AX1 - AX0.H = *AR1; - *(AR3++) = AC0.M; - ACC0 = PROD; - PROD = AX0.L * AX0.H; - ... - } - - // In simplified form: - AR1 = AR0; - AR0 = AR3; - for (int i = 0; i < _size; i++) { - *AR0 = ((*AR0 << 16) + *AR1 * Factor) >> 16); - } - - // 00f8 8b00 m0 // Restore multiplication results. - // 00f9 02df ret -} - -void 00fa_BufferMultiply(src($AR0), dst($AR3), count($AC1.M), $mult($AX0.L)) -{ - //00fa 8a00 m2 - 00fb 191a lrri $AX0.H, @$AR0 - 00fc 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 - 00fd 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 00fe 005f loop $AC1.M - 00ff 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M - - //0100 8b00 m0 - //0101 02df ret -} - - - // Clears the 0d00 and 0d60 buffers, plus a lot of other intermediate buffers. - // Also does some other things. -void 0102_PrepareFrameBuffers() - { - // 0102 8100 clr $ACC0 - // 0103 8900 clr $ACC1 - // 0104 0e50 lris $AC0.M, #0x50 - ACC0 = 0 - ACC1 = 0 - AC0.M = 0x50 - - // 0105 0080 0d00 lri $AR0, #0x0d00 - // 0107 005e loop $AC0.M - // 0108 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0d00++ = 0x00 - - // 0109 0080 0d60 lri $AR0, #0x0d60 - // 010b 005e loop $AC0.M - // 010c 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0d60++ = 0x00 - - // 10d 02bf 0e3f call 0x0e3f - - // This one adds and multiplies buffers together. Maybe surround or reverb stuff. - 0e3f_DolbyMixdown() - - // 010f 8100 clr $ACC0 - // 0110 8900 clr $ACC1 - // 0111 0e50 lris $AC0.M, #0x50 - ACC0 = 0 - ACC1 = 0 - AC0.M = 0x50 - - // 0112 0080 0ca0 lri $AR0, #0x0ca0 - // 0114 005e loop $AC0.M - // 0115 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0ca0++ = 0x00 - - // 0116 0080 0f40 lri $AR0, #0x0f40 - // 0118 005e loop $AC0.M - // 0119 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0f40++ = 0x00 - - // 011a 0080 0fa0 lri $AR0, #0x0fa0 - // 011c 005e loop $AC0.M - // 011d 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0fa0++ = 0x00 - - // 011e 0080 0a00 lri $AR0, #0x0a00 - // 0120 005e loop $AC0.M - // 0121 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x0a00++ = 0x00 - - // 0122 0080 09a0 lri $AR0, #0x09a0 - // 0124 005e loop $AC0.M - // 0125 1b1f srri @$AR0, $AC1.M - for (int i=0; i<0x50; i++) - *0x09a0++ = 0x00 - - // 0126 02df ret -} - - -void 0127_Unk() { - 0127 00c0 03a0 lr $AR0, @0x03a0 - 0129 191a lrri $AX0.H, @$AR0 - 012a 00df 03a1 lr $AC1.M, @0x03a1 - 012c 009b 00a0 lri $AX1.H, #0x00a0 - 012e 0081 0393 lri $AR1, #0x0393 - 0130 18bc lrrd $AC0.L, @$AR1 - 0131 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 0132 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0133 0080 0050 lri $AR0, #0x0050 - 0135 0508 addis $ACC1, #0x08 - 0136 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - // 0525_CopyRAMtoDMEM(... ,.. , 0x50) - - // 0138 00de 0390 lr $AC0.M, @0x0390 - // 013a 02a0 0001 andf $AC0.M, #0x0001 - // 013c 029d 0145 jlz 0x0145 - if (*0x0390 & 1) { - 013e 0080 0398 lri $AR0, #0x0398 - 0140 0e08 lris $AC0.M, #0x08 - 0141 00c1 03a1 lr $AR1, @0x03a1 - 0143 02bf 0b2e call 0x0b2e // 0b2e_Unk_Multiply - } - 0145 0f50 lris $AC1.M, #0x50 - 0146 00c0 03a1 lr $AR0, @0x03a1 - 0148 00da 0394 lr $AX0.H, @0x0394 - // 014a 8600 tstaxh $AX0.H - // 014b 0295 0152 jz 0x0152 - if (*0x0394 != 0) { - 014d 1c7a mrr $AR3, $AX0.H - 014e 00d8 0395 lr $AX0.L, @0x0395 - 0150 02bf 00eb call 0x00eb // 00eb_Unk_BufferMultAddToDest - } - 0152 0f50 lris $AC1.M, #0x50 - 0153 00c0 03a1 lr $AR0, @0x03a1 - 0155 00da 0396 lr $AX0.H, @0x0396 - 0157 8600 tstaxh $AX0.H - 0158 0295 015f jz 0x015f - 015a 1c7a mrr $AR3, $AX0.H - 015b 00d8 0397 lr $AX0.L, @0x0397 - 015d 02bf 00eb call 0x00eb // 00eb_Unk_BufferMultAddToDest - - // 015f 00de 0390 lr $AC0.M, @0x0390 - // 0161 02a0 0002 andf $AC0.M, #0x0002 - // 0163 02dd retlz - if (*0x390 & 2) - return; - - 0164 0080 0398 lri $AR0, #0x0398 - 0166 0e08 lris $AC0.M, #0x08 - 0167 00c1 03a1 lr $AR1, @0x03a1 - 0169 02bf 0b2e call 0x0b2e // 0b2e_Unk_Multiply - 016b 02df ret -} - - -// Looks similar to something else... -void 016c_Unk_SetupMemAt_0c00() -{ - 016c 8900 clr $ACC1 - - // 016d 009f 0dc0 lri $AC1.M, #0x0dc0 - // 016f 00ff 03a1 sr @0x03a1, $AC1.M - *0x03a1 = 0x0dc0; - // 0171 009f 03a8 lri $AC1.M, #0x03a8 - // 0173 00ff 03a2 sr @0x03a2, $AC1.M - *0x03a2 = 0x03a8; - // 0175 009f 03a4 lri $AC1.M, #0x03a4 - // 0177 00ff 03a0 sr @0x03a0, $AC1.M - *0x03a0 = 0x03a4; - - // Dangerous bloopi! It points to the SECOND HALF of a 2-word instruction so - // a naive check won't catch it! I think our current code does, though. - - // 0179 1104 019f bloopi #0x04, 0x019f - for (int i = 0; i < 4; i++) { - // 017b 00c0 03a2 lr $AR0, @0x03a2 - // 017d 0083 0390 lri $AR3, #0x0390 - // 017f 0f0e lris $AC1.M, #0x0e - // 0180 02bf 00da call 0x00da - 00da_CopyBuffer(@0x03a2, 0x0390, 0x0e) - - 0182 00da 0390 lr $AX0.H, @0x0390 - 0184 8600 tstaxh $AX0.H - 0185 0295 0191 jz 0x0191 - if (*0x0390) { - 0187 00df 03a1 lr $AC1.M, @0x03a1 - 0189 1c7f mrr $AR3, $AC1.M - 018a 0550 addis $ACC1, #0x50 - - // 018b 1c1f mrr $AR0, $AC1.M - // 018c 0f06 lris $AC1.M, #0x06 - // 018d 02bf 00da call 0x00da - 00da_CopyBuffer($AC1.M, $AR3, 0x06); - - // 018f 02bf 0127 call 0x0127 - 0127_Unk(); - } - // 0191 00de 03a2 lr $AC0.M, @0x03a2 - // 0193 0410 addis $ACC0, #0x10 - // 0194 00fe 03a2 sr @0x03a2, $AC0.M - (*0x03a2) += 0x10; - - // 0196 00de 03a1 lr $AC0.M, @0x03a1 - // 0198 0460 addis $ACC0, #0x60 - // 0199 00fe 03a1 sr @0x03a1, $AC0.M - (*0x03a1) += 0x60; - - // 019b 00de 03a0 lr $AC0.M, @0x03a0 - // 019d 7400 incm $AC0.M - // 019e 00fe 03a0 sr @0x03a0, $AC0.M - (*0x0ea0)++; - } - - // 01a0 0f50 lris $AC1.M, #0x50 - // 01a1 0080 0c00 lri $AR0, #0x0c00 - // 01a3 0083 0e80 lri $AR3, #0x0e80 - // 01a5 0098 7fff lri $AX0.L, #0x7fff - // 01a7 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src(0x0c00), _Dest(0x0e80), _size(0x50), _factor(0x7fff)) - - // 01a9 0f50 lris $AC1.M, #0x50 - // 01aa 0080 0c00 lri $AR0, #0x0c00 - // 01ac 0083 0ee0 lri $AR3, #0x0ee0 - // 01ae 0098 b820 lri $AX0.L, #0xb820 - // 01b0 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src(0x0c00), _Dest(0x0ee0), _size(0x50), _factor(0xb820)) - - // 01b2 0f28 lris $AC1.M, #0x28 - // 01b3 0080 0c78 lri $AR0, #0x0c78 - // 01b5 0083 0e80 lri $AR3, #0x0e80 - // 01b7 0098 b820 lri $AX0.L, #0xb820 - // 01b9 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src(0x0c78), _Dest(0x0e80), _size(0x28), _factor(0xb820)) - // 01bb 0f28 lris $AC1.M, #0x28 - // 01bc 0080 0c78 lri $AR0, #0x0c78 - // 01be 0083 0ee0 lri $AR3, #0x0ee0 - // 01c0 0098 7fff lri $AX0.L, #0x7fff - // 01c2 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src(0x0c78), _Dest(0x0e80), _size(0x28), _factor(0x7fff)) - - // Zero the temporary buffers 0x0c00 and 0x0c50 - 01c4 8100 clr $ACC0 - 01c5 8900 clr $ACC1 - 01c6 0e50 lris $AC0.M, #0x50 - 01c7 0080 0c00 lri $AR0, #0x0c00 - 01c9 005e loop $AC0.M - 01ca 1b1f srri @$AR0, $AC1.M - 01cb 0080 0c50 lri $AR0, #0x0c50 - 01cd 005e loop $AC0.M - 01ce 1b1f srri @$AR0, $AC1.M - - // 01cf 02df ret -} - -void 01d0_Unk() { - // 01d0 00c0 03a0 lr $AR0, @0x03a0 - // 01d2 181a lrr $AX0.H, @$AR0 - AX0.H = *0x03a0; - - // 01d3 8100 clr $ACC0 - // 01d4 181e lrr $AC0.M, @$AR0 - AC0.M = *0x03a0; - - // 01d5 00db 0391 lr $AX1.H, @0x0391 - AX1.H = *0x0391; - - // 01d7 7400 incm $AC0.M - AC0.M++; - - // 01d8 d100 cmpar $ACC1, $AX0.H - // 01d9 0270 ifge - if (ACC1 - AX0.H >= 0) { - 01da 8100 clr $ACC0 - } - - 01db 1b1e srri @$AR0, $AC0.M - 01dc 00df 03a1 lr $AC1.M, @0x03a1 - 01de 009b 00a0 lri $AX1.H, #0x00a0 - 01e0 0081 0393 lri $AR1, #0x0393 - 01e2 18bc lrrd $AC0.L, @$AR1 - 01e3 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 01e4 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - - // 01e5 0080 0050 lri $AR0, #0x0050 - // 01e7 02bf 0532 call 0x0532 - 0532_DMEMtoRAM(_DMEM(AC1.M), _pMemAddr(ACC0), 0x50) - - 01e9 02df ret -} - -void 01ea_Unk() { - 01ea 8900 clr $ACC1 - // 01eb 0f28 lris $AC1.M, #0x28 // half of 0x50 - // 01ec 0080 0c50 lri $AR0, #0x0c50 - // 01ee 0083 0ea8 lri $AR3, #0x0ea8 - // 01f0 0098 b820 lri $AX0.L, #0xb820 - // 01f2 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - 01f4 8900 clr $ACC1 - // 01f5 0f28 lris $AC1.M, #0x28 - // 01f6 0080 0c50 lri $AR0, #0x0c50 - // 01f8 0083 0f08 lri $AR3, #0x0f08 - // 01fa 0098 7fff lri $AX0.L, #0x7fff - // 01fc 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - - // 01fe 009f 0dc0 lri $AC1.M, #0x0dc0 - // 0200 00ff 03a1 sr @0x03a1, $AC1.M - // 0202 009f 03a8 lri $AC1.M, #0x03a8 - // 0204 00ff 03a2 sr @0x03a2, $AC1.M - // 0206 009f 03a4 lri $AC1.M, #0x03a4 - // 0208 00ff 03a0 sr @0x03a0, $AC1.M - (*0x03a1) = 0x0dc0; - (*0x03a2) = 0x03a8; - (*0x03a0) = 0x03a4; - - // Dangerous bloopi! It points to the SECOND HALF of a 2-word instruction so - // a naive check won't catch it! I think our current code does, though. - - // 020a 1104 0228 bloopi #0x04, 0x0228 - for (int i = 0; i < 4; i++) { - // 020c 00c0 03a2 lr $AR0, @0x03a2 - // 020e 0083 0390 lri $AR3, #0x0390 - // 0210 0f0e lris $AC1.M, #0x0e - // 0211 02bf 00da call 0x00da - 00da_CopyBuffer(_src(*0x03a2), _dest(0x0390), _LenInDWORDs(0xE)) - - // 0213 00da 0390 lr $AX0.H, @0x0390 - // 0215 8600 tstaxh $AX0.H - // 0216 0295 021a jz 0x021a - if (*0x0390) { - // 0218 02bf 01d0 call 0x01d0 - - // Copy some buffer to RAM? - 01d0_Unk(); - } - - // 021a 00de 03a2 lr $AC0.M, @0x03a2 - // 021c 0410 addis $ACC0, #0x10 - // 021d 00fe 03a2 sr @0x03a2, $AC0.M - (*0x03a2) += 0x10; - - // 021f 00de 03a1 lr $AC0.M, @0x03a1 - // 0221 0460 addis $ACC0, #0x60 - // 0222 00fe 03a1 sr @0x03a1, $AC0.M - (*0x03a1) += 0x60; - - // 0224 00de 03a0 lr $AC0.M, @0x03a0 - // 0226 7400 incm $AC0.M - // 0227 00fe 03a0 sr @0x03a0, $AC0.M - (*0x03a0)++; - } - 0229 02df ret -} - - -void 022a_Copy_XXX_From_RAM_To_0x03a8() -{ - // 022a 0081 0386 lri $AR1, #0x0386 - // 022c 009f 03a8 lri $AC1.M, #0x03a8 - // 022e 0080 0040 lri $AR0, #0x0040 - // 0230 02bf 0523 call 0x0523 - 0523_CopyRAMtoDMEM(0x0386, 0x03a8, 0x0040); - - // 0232 02df ret -} - - -void 0233_Increase_32BitAddress_InMem(_MemAddr(AR0), _Bytes(AX0.L)) -{ - // 0233 191e lrri $AC0.M, @$AR0 - // 0234 189c lrrd $AC0.L, @$AR0 - // 0235 4800 addax $ACC0, $AX0 - // 0236 1b1e srri @$AR0, $AC0.M - // 0237 1b1c srri @$AR0, $AC0.L - - *((u32*)AR0) += AX0 - - // 0238 02df ret -} - - -void 0239_WaitUntilLastFrameGotSynced() -{ - // 0239 8100 clr $ACC0 - // 023a 8900 clr $ACC1 - // 023b 00df 0354 lr $AC1.M, @0x0354 - // 023d 00de 034e lr $AC0.M, @0x034e - // 023f 8200 cmp - // 0240 0293 0239 jle 0x0239 // loop - do { - - } while (*0x0354 > *0x034e); // TODO: CHECK - - // 0242 02df ret -} - -///////////////////////// -// -// -// 0x0341: Number of Frames to render ... - -// 0x034c + 0x034d: RAM address of the current PB block - -// 0x034e: Last Sync message for rendered frame -// 0x0354: PB loop counter - -// 0x0355: Current Frame - -// 0x0380: ??? -// 0x0381: ??? - -// 0x0388: RAM Address of Output Buffer1 -// 0x038a: RAM Address of Output Buffer2 -// -// 0x038f: Output Buffer Address (0x0520 most of the time) -// -// 0x03f8: *0x0433 -// 0x0520: Some kind of sample buffer - -// 0x0d00: Left mix buffer -// 0x0d60: Right mix buffer - -void 0243_COMMAND_02() // sync frame -{ - // 0243 0080 0388 lri $AR0, #0x0388 - // 0245 0081 0067 lri $AR1, #0x0067 - // 0247 0e02 lris $AC0.M, #0x02 - // 0248 173f callr $AR1 - 0067_CopyCommand(0x0388, 0x02); - - // 0249 00de 0344 lr $AC0.M, @0x0344 - // 024b 00fe 0341 sr @0x0341, $AC0.M - *0x0341 = *0x0344; - - // 024d 00de 0345 lr $AC0.M, @0x0345 - // 024f 00fe 038e sr @0x038e, $AC0.M - *0x038e = *0x0345; - - // 0251 8100 clr $ACC0 - // 0252 00fe 0355 sr @0x0355, $AC0.M - *0x0355 = 0x00; - - // 0254 02bf 022a call 0x022a - 022a_Copy_XXX_From_RAM_To_0x03a8(); // perhaps an PB ?? - - // 0256 02bf 05a4 call 0x05a4 - 05A4_ResetAccelerator(); - - - // 0258 00de 0341 lr $AC0.M, @0x0341 - // 025a 007e 0418 bloop $AC0.M, 0x0418 - - // Frame size is 0xa0 * *0x0341 - for (int j=0; j< *0x0341; j++) // 0x0341 = high part of the (command & 0xFF) ... perhaps number of frames to render?? - { - // 025c 02bf 0102 call 0x0102 - 0102_PrepareFrameBuffers(); - - // 025e 02bf 016c call 0x016c - 016c_Unk_SetupMemAt_0c00(); - - // 0260 02bf 095f call 0x095f - 095f_Unk_SetupMemAt0_0180(); - - // 0262 00de 0355 lr $AC0.M, @0x0355 - // 0264 7400 incm $AC0.M - // 0265 00fe 0355 sr @0x0355, $AC0.M - (*0x0355)++; - - // 0267 8100 clr $ACC0 - // 0268 00fe 0354 sr @0x0354, $AC0.M - *0x0354 = 0; // PB counter - - // 026a 00de 0342 lr $AC0.M, @0x0342 - // 026c 007e 03c0 bloop $AC0.M, 0x03c0 - for (int i=0; i<*0x0342; i++) // 0x0342 - low part of the DSetupTable Command. Number of PBs? - { - // 026e 02bf 0239 call 0x0239 - 0239_WaitUntilLastFrameGotSynced(); - - // 0270 8100 clr $ACC0 - // 0271 8900 clr $ACC1 - ACC0 = 0; - ACC1 = 0; - - // this block is for masking out PBs... the lower part of the sync messages are updating this mask - // but i am not 100 percent sure how it works - { - // 0272 00de 0354 lr $AC0.M, @0x0354 - // 0274 147c lsr $ACC0, #-4 - // 0275 0200 04fc addi $AC0.M, #0x04fc - // 0277 1c1e mrr $AR0, $AC0.M - AC0.M = *0x0354 >> 4; - AR0 = AC0.M + 0x04fc; - - 0278 181f lrr $AC1.M, @$AR0 - 0279 00de 0354 lr $AC0.M, @0x0354 - 027b 0240 000f andi $AC0.M, #0x000f - // 027d 3d80 lsrnr - ACC1 <<= ACC0 - - 027e 03c0 8000 andcf $AC1.M, #0x8000 - // 0280 029c 03bc jlnz 0x03bc - GOTO NEXT_BLOCK: - } - - // 0282 00d8 0354 lr $AX0.L, @0x0354 - // 0284 009a 0180 lri $AX0.H, #0x0180 - // 0286 8100 clr $ACC0 - // 0287 00de 0380 lr $AC0.M, @0x0380 - // 0289 00dc 0381 lr $AC0.L, @0x0381 - // 028b 9000 mul $AX0.L, $AX0.H - // 028c 9400 mulac $AX0.L, $AX0.H, $ACC0 - // 028d 00fe 034c sr @0x034c, $AC0.M - // 028f 00fc 034d sr @0x034d, $AC0.L - AX0.L = *0x0354 // number of rendered frames - AX0.H = 0x0180 // PB Size with dummy buffer - ACC0 = (*0x0380 << 16) | *0x0381 - ACC0 += AX0.L * AX0.H - - // Compute the RAM address of the current PB. - *0x034C = AC0.M - *0x034D = AC0.L - - // Copy the current PB to 0x400, so we can access it from DSP code. - // 0291 02bf 00c1 call 0x00c1 - 00c1_CopyPBToDMEM() - - // 0293 00da 0400 lr $AX0.H, @0x0400 - // 0295 8600 tstaxh $AX0.H - // 0296 0295 03bc jz 0x03bc - if (*0x0400 == 0x00) - GOTO NEXT_BLOCK: - - // 0298 00da 0401 lr $AX0.H, @0x0401 - // 029a 8600 tstaxh $AX0.H - // 029b 0294 03bc jnz 0x03bc - if (*0x0401 != 0x00) - GOTO NEXT_BLOCK: - - // 029d 00da 0433 lr $AX0.H, @0x0433 - // 029f 00fa 03f8 sr @0x03f8, $AX0.H - *0x03f8 = *0x0433 - - // 02a1 00da 0406 lr $AX0.H, @0x0406 - // 02a3 8600 tstaxh $AX0.H - // 02a4 0294 0dff jnz 0x0dff - if (*0x0406 != 0x00) - { - // The Code at 0x0dff sets the value from *0x0433 to 0x50 shorts at 0x0520. - // Then it JMPs to ContinueWithBlock. - 0dff_Zero520_50(). - } - else - { - // 02a6 8100 clr $ACC0 - // 02a7 00de 0480 lr $AC0.M, @0x0480 - // 02a9 0609 cmpis $ACC0, #0x09 - // 02aa 0295 02bd jz 0x02bd - // 02ac 0605 cmpis $ACC0, #0x05 - // 02ad 0295 02bd jz 0x02bd - // 02af 0608 cmpis $ACC0, #0x08 - // 02b0 0295 098f jz 0x098f - // 02b2 0610 cmpis $ACC0, #0x10 - // 02b3 0295 0a14 jz 0x0a14 - // 02b5 0620 cmpis $ACC0, #0x20 - // 02b6 0295 0a9a jz 0x0a9a - // 02b8 0621 cmpis $ACC0, #0x21 - // 02b9 0295 0aa2 jz 0x0aa2 - // 02bb 029f 087c jmp 0x087c - - switch(*0x0480) - { - case 0x05: - case 0x09: GOTO 02BD: - case 0x08: GOTO 098f: - case 0x10: GOTO 0a14: - case 0x20: GOTO 0a9a: - case 0x21: GOTO 0aa2: - default: GOTO 087C: - } - - // This is the common decoding prep for 0x05 and 0x09. - - // 02bd 00d8 0402 lr $AX0.L, @0x0402 // delta? - // 02bf 8100 clr $ACC0 - // 02c0 8900 clr $ACC1 - // 02c1 00dc 0430 lr $AC0.L, @0x0430 // current fraction? - // 02c3 8d00 set15 // unsigned multiplication - // 02c4 0950 lris $AX1.L, #0x50 - // 02c5 a000 mulx $AX0.L, $AX1.L - // 02c6 a400 mulxac $AX0.L, $AX1.L, $ACC0 - // 02c7 1404 lsl $ACC0, #4 - // 02c8 8c00 clr15 - - // 0x0402 is delta ("Ratio"). - // Is this a computation of the starting point for decoding? - // If so 0x430 is the current sample position fraction and - AX0.L = *0x0402 - ACC0 = *0x430 + (AX0.L * 0x50) - ACC0 >>= 4 - - // 02c9 1ffe mrr $AC1.M, $AC0.M - // 02ca 0083 0580 lri $AR3, #0x0580 - // 02cc 02bf 073d call 0x073d - - // AC1.M here is ACC0.M! Effectively a shift right 16. The above fraction stuff seems to make sense. - 073d_DECODE_0x05_0x09(0x0580, AC1.M, 0x50) - - // NOP jump here. - // 02ce 029f 02d0 jmp 0x02d0 - - Resample_From0580To0520: - // 02d0 0080 0580 lri $AR0, #0x0580 - // 02d2 0081 0520 lri $AR1, #0x0520 - // 02d4 0099 0000 lri $AX1.L, #0x0000 - // 02d6 02bf 0d7f call 0x0d7f - 0d7f_ResampleAudioData(0x0580, 0x0520, 0x0000); - } - - // A block of audio is now present at 0x520. - - ContinueWithBlock: - // Apply various per-voice effects. - - // First up, a trivial in-place filter, if $0x04a8 is set. - - // 02d8 00da 04a8 lr $AX0.H, @0x04a8 - // 02da 8600 tstaxh $AX0.H - // 02db 0295 02e1 jz 0x02e1 - // 02dd 0080 0520 lri $AR0, #0x0520 - // 02df 02bf 0c84 call 0x0c84 - if (0x04a8 != 0) - void 0c84_FilterBufferInPlace(_sampleAddr($AR0), multiplier($AX0.H)) - - // 02e1 009e 0520 lri $AC0.M, #0x0520 - // 02e3 00fe 038f sr @0x038f, $AC0.M - *0x038f = 0x0520 - - // 02e5 8900 clr $ACC1 - // 02e6 00df 0484 lr $AC1.M, @0x0484 - // 02e8 0340 001f andi $AC1.M, #0x001f - // 02ea b900 tst $ACC1 - // 02eb 0295 0311 jz 0x0311 - if ((*0x0484 & 0x1f) != 0x00) - { - // 02ed 00de 038f lr $AC0.M, @0x038f - // 02ef 5c00 sub $ACC0, $ACC1 - // 02f0 00fe 038f sr @0x038f, $AC0.M - (*0x038f) -= AC1.M; - - // 02f2 1c7e mrr $AR3, $AC0.M - // 02f3 0080 0440 lri $AR0, #0x0440 - // 02f5 05fe addis $ACC1, #0xfe - // 02f6 02bf 00da call 0x00da - 00da_CopyBuffer(0x0440, (*0x038f), (*0x0484) + 0xfe) - - // 02f8 0080 0490 lri $AR0, #0x0490 - // 02fa 00c1 038f lr $AR1, @0x038f - // 02fc 8900 clr $ACC1 - // 02fd 00df 0484 lr $AC1.M, @0x0484 - // 02ff 0340 001f andi $AC1.M, #0x001f - // 0301 02bf 0b4d call 0x0b4d - 0b4d_IIR_Filter(In(0x0490), Out(*0x038f), FilterLength(*0x0484 & 0x1f)) - - 0303 00de 038f lr $AC0.M, @0x038f - 0305 0450 addis $ACC0, #0x50 - 0306 1c1e mrr $AR0, $AC0.M - // 0307 0083 0440 lri $AR3, #0x0440 - 0309 8900 clr $ACC1 - 030a 00df 0484 lr $AC1.M, @0x0484 - 030c 0340 001f andi $AC1.M, #0x001f - 030e 05fe addis $ACC1, #0xfe - // 030f 02bf 00da call 0x00da - 00da_CopyBuffer(, 0x0440) - } - - // 0311 00de 0484 lr $AC0.M, @0x0484 - // 0313 0240 0020 andi $AC0.M, #0x0020 - // 0315 0295 0333 jz 0x0333 - if ((*0x0484 & 0x0020) != 0) - { - 0317 0080 04a4 lri $AR0, #0x04a4 - 0319 00c1 038f lr $AR1, @0x038f - 031b 0082 0454 lri $AR2, #0x0454 - 031d 0083 04a7 lri $AR3, #0x04a7 - - // 031f 18fa lrrd $AX0.H, @$AR3 - // 0320 8600 tstaxh $AX0.H - // 0321 0294 0331 jnz 0x0331 - if (!*0x04a7) { - // 0323 18fa lrrd $AX0.H, @$AR3 - // 0324 8600 tstaxh $AX0.H - // 0325 0294 0331 jnz 0x0331 - if (!*0x04a6) { - // 0327 18fa lrrd $AX0.H, @$AR3 - // 0328 8600 tstaxh $AX0.H - // 0329 0294 0331 jnz 0x0331 - if (!*0x04a5) { - // 032b 8100 clr $ACC0 - // 032c 18fe lrrd $AC0.M, @$AR3 - // 032d 0280 7fff cmpi $AC0.M, #0x7fff - // 032f 0295 0333 jz 0x0333 - if (*0x04a4 != 0x7FFF) { - // 0331 02bf 0b68 call 0x0b68 - 0b68_4TapFIR(InBuffer($AR2), FilterBuffer($AR0), OutBuffer($AR1)); - } - } - } - } - } - - // Check volume mode, apply volume as appropriate - - // 0333 8100 clr $ACC0 - // 0334 00de 042c lr $AC0.M, @0x042c - // 0336 b100 tst $ACC0 - // 0337 0295 033d jz 0x033d - - if (*0x042c != 0) // Volume mode != 0 - { - // 0339 02bf 0cd3 call 0x0cd3 - // 033b 029f 03b2 jmp 0x03b2 - 0cd3_VolumeMixer1() // The complex one, probably with surround and stuff - } - else - { - // Volume mode == 0 - simple(r) volumes - // 033d 8100 clr $ACC0 - // 033e 1c9e mrr $IX0, $AC0.M - // 033f 1cde mrr $IX2, $AC0.M - // 0340 7400 incm $AC0.M - // 0341 1cfe mrr $IX3, $AC0.M - // 0342 8100 clr $ACC0 - $IX0 = 0; - $IX2 = 0; - $IX3 = 1; - - // 0343 00de 0407 lr $AC0.M, @0x0407 - // 0345 b100 tst $ACC0 - // 0346 0295 0355 jz 0x0355 - if (*0x0407 != 0) // Unknown, in zelda always 0x10, apparently. - { - // Seems like this all boils down to a backwards copy of - // 0x0470-0x0477 to *(*(0x038f)); - // Is that where we save samples in the PB, so that filters - // have something to read from at the start of each block? - - // 0348 00c3 038f lr $AR3, @0x038f - // 034a 0007 dar $AR3 - $AR3 = *(0x038f) - 1; - // 034b 0080 0477 lri $AR0, #0x0477 - // 034d 0084 ffff lri $IX0, #0xffff - // 034f 0087 ffff lri $IX3, #0xffff - $AR0 = 0x477; - $IX0 = -1; - $IX3 = -1; - // 0351 199a lrrn $AX0.H, @$AR0 - AX0.H = *$AR0; - AR0 += IX0; - - // 0352 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - $ACC1 = $AX0.H; - $AX0.H = *$AR0; - $AR0 += IX0; - // 0353 005e loop $AC0.M - for (int i = 0; i < AC0.M; i++) { - 0354 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - } - } - - // 0355 00da 0485 lr $AX0.H, @0x0485 - // 0357 8600 tstaxh $AX0.H - // 0358 0295 036b jz 0x036b - if (*0x0485 != 0) - { - 035a 8900 clr $ACC1 - 035b 0086 0005 lri $IX2, #0x0005 // 5 - 1 = 4, see loop - 035d 0082 040a lri $AR2, #0x040a - // 035f 1106 0363 bloopi #0x06, 0x0363 - - // Store half of every 4th value from 0x040a onwards in the position before. (!!!!) - // This really doesn't make a lot of sense. - // At the same time, keep their sum in ACC1. - for (int i = 0; i < 0x6; i++) { - // 0361 18de lrrd $AC0.M, @$AR2 - // 0362 147f lsr $ACC0, #-1 - // 0363 4d36 add'sn $ACC1, $ACC0 : @$AR2, $AC0.M - $AC0.M = *$AR2 >> 1; - $AR2--; - $ACC1 += $ACC0; - *$AR2 = $ACC0; - $AR2 += 5; - } - // 0364 b900 tst $ACC1 - // 0365 0294 036b jnz 0x036b - - // Volume has dropped to 0 on all channels, stop sound? - if (sum == 0) { - // 0367 009a 0001 lri $AX0.H, #0x0001 - // 0369 00fa 0401 sr @0x0401, $AX0.H // Write 1 to KeyOff. - } - } - - // 036b 8f00 set40 - // 036c 0086 0002 lri $IX2, #0x0002 - // 036e 0082 0408 lri $AR2, #0x0408 - $IX2 = 0x0002; - $AR2 = 0x0408; - - // Volume data starts at 0x0408, it's like this: - // 1 word controls sbset #0x00 apparently - // 2 volume values - // 1 other word. - - // 0370 1106 039b bloopi #0x06, 0x039b - for (int i = 0; i < 6; i++) - { - // 0372 8100 clr $ACC0 - // 0373 195e lrri $AC0.M, @$AR2 - // 0374 1200 sbclr #0x00 // W T F??? - // 0375 b100 tst $ACC0 - // 0376 0275 ifz - // 0377 1300 sbset #0x00 - // sbset #0x00 is logic zero ... we use it to store a bit here. see 0394 - if (*$AR2 == 0) { - sbset #0x00 - } else { - sbclr #0x00 - } - - 0378 1c7e mrr $AR3, $AC0.M - - 0379 195e lrri $AC0.M, @$AR2 // Load the two volume values - 037a 195f lrri $AC1.M, @$AR2 - - // 037b 5c00 sub $ACC0, $ACC1 // Subtract them - find volume delta? - // 037c 14fb asr $ACC0, #-5 - // 037d 1f5e mrr $AX0.H, $AC0.M - // 037e 1f1c mrr $AX0.L, $AC0.L - $AX0 = (vol1 - vol2) >> 5; // 32 steps .. - - // Read the value after the volumes. - - // 037f 185e lrr $AC0.M, @$AR2 - // 0380 0240 00ff andi $AC0.M, #0x00ff - // 0382 1f7e mrr $AX1.H, $AC0.M - $AX1.H = *$AR2 & 0xFF; - - // 0383 185e lrr $AC0.M, @$AR2 - // 0384 1478 lsr $ACC0, #-8 - // 0385 009c 0000 lri $AC0.L, #0x0000 - $AC0.M = *$AR2 >> 8; - - // ACC1 is here the second volume. Compare to delta. - // Adjust *$AR2 for some reason accordingly... - - // 0387 d100 cmpar $ACC1, $AX0.H - // 0388 0295 0390 jz 0x0390 - // 038a 185e lrr $AC0.M, @$AR2 - // 038b 0272 ifg - // 038c 7400 incm $AC0.M - // 038d 0271 ifl - // 038e 7800 decm $AC0.M - // 038f 1a5e srr @$AR2, $AC0.M - if ($ACC1 < $AX0.H) { - (*$AR2)--; - } else if ($ACC1 > $AX0.H) { - (*$AR2)++ - } - - // 0390 0006 dar $AR2 - $AR2--; - - // $AR2 again points at the second volume. - - 0391 00de 038f lr $AC0.M, @0x038f - - // Per channel mini-delay? - 0393 5600 subr $ACC0, $AX1.H // see 0382 - - // Use that stored logic zero bit, to skip mixing if the first word is (or isn't? not sure) 0. - // 0394 029d 0399 jlz 0x0399 - if (!logic zero) { - // 0396 1c1e mrr $AR0, $AC0.M - // 0397 02bf 0ca9 call 0x0ca9 - 0ca9_RampedMultiplyAddBuffer(Volume($ACC1), VolumeDelta($AX0), MultiplierData($AR0), Buffer($AR3)) - } - // 0399 0000 nop - // 039a 1b5f srri @$AR2, $AC1.M - // Update the second volume. - *($AR2++) = $AC1.M; - // 039b 000a iar $AR2 - $AR2++; // Next block of four values. - } - - // 039c 8e00 set16 - - // 039d 8100 clr $ACC0 - // 039e 00de 0407 lr $AC0.M, @0x0407 - // 03a0 b100 tst $ACC0 - // 03a1 0295 03b2 jz 0x03b2 - if (*0x0407 != 0) - { - // Stash away the last bunch of samples into 0x0477 and backwards, - // so that filter kernels and resampler have some previous data to - // read from the next time. - 03a3 00c3 038f lr $AR3, @0x038f - 03a5 0087 004f lri $IX3, #0x004f - 03a7 001f addarn $AR3, $IX3 - 03a8 0080 0477 lri $AR0, #0x0477 - 03aa 0084 ffff lri $IX0, #0xffff - 03ac 0087 ffff lri $IX3, #0xffff - 03ae 19fa lrrn $AX0.H, @$AR3 - 03af 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 03b0 005e loop $AC0.M - 03b1 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - } - } - - // 03b2 00da 0406 lr $AX0.H, @0x0406 - // 03b4 8600 tstaxh $AX0.H - // 03b5 0294 03ba jnz 0x03ba - if (*0x0406 == 0) - { - // 03b7 8100 clr $ACC0 - // 03b8 00fe 0404 sr @0x0404, $AC0.M - *0x0404 = 0x0000 - } - - // 03ba 02bf 00ca call 0x00ca - 00ca_CopyPBToRAM() - - NEXT_BLOCK: - 03bc 00de 0354 lr $AC0.M, @0x0354 - 03be 7400 incm $AC0.M - 03bf 00fe 0354 sr @0x0354, $AC0.M - } - - // Done mixing all voices, sync up with host before the final mixdown. - - // 03c1 0e00 lris $AC0.M, #0x00 - // 03c2 00fe 034e sr @0x034e, $AC0.M - *0x034e = 0x00 - - // 03c4 0e04 lris $AC0.M, #0x04 - // 03c5 02bf 066a call 0x066a - SendMB_DCD1(0x0004) - - // 03c7 00de 0355 lr $AC0.M, @0x0355 - // 03c9 0260 ff00 ori $AC0.M, #0xff00 - // 03cb 02bf 0674 call 0x0674 - SendMB_F355(*0x0355 | 0xFF00) // *0x0355 - current frame - - - // Buffer 0D00 and 0D60 are the final L & R mixing buffers. - - // This is where global effects are applied, and final mixdown is done. - - // 03cd 02bf 0c0a call 0x0c0a - 0c0a_Unk() // Copy 0a00 to 0a60? - - // 03cf 02bf 0c1c call 0x0c1c - 0c1c_ComputeReverbFrom0a60To0a00() // Not sure if this really is reverb but could be. - - // 03d1 02bf 0c71 call 0x0c71 - 0c71_AddBufferA00ToD60AndD00(); // add A00 on top of 0x0D00 and 0x0D60 - - // 03d3 00de 0341 lr $AC0.M, @0x0341 - // 03d5 7800 decm $AC0.M - // 03d6 00fe 0341 sr @0x0341, $AC0.M - - (*0x0341)--; - - // The audio at 09a0 is added to both channels, - // then the channel buffers are copied to RAM. - // For unknown reasons, the audio at 0x0fa0 is ONLY added to the right channel. - - // 03d8 0080 09a0 lri $AR0, #0x09a0 - // 03da 0083 0d00 lri $AR3, #0x0d00 - // 03dc 0f50 lris $AC1.M, #0x50 - // 03dd 0098 5a82 lri $AX0.L, #0x5a82 - // 03df 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(0x09a0, 0x0d00, 0x50, 0x5a82) - - // 03e1 0080 09a0 lri $AR0, #0x09a0 - // 03e3 0083 0d60 lri $AR3, #0x0d60 - // 03e5 0f50 lris $AC1.M, #0x50 - // 03e6 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(0x09a0, 0x0d60, 0x50, 0x5a82) - - // 03e8 0083 0d00 lri $AR3, #0x0d00 - // 03ea 02bf 0cc1 call 0x0cc1 - 0cc1_StrangeORRFilter(0x0d00) - - // 03ec 0081 0388 lri $AR1, #0x0388 - // 03ee 009f 0d00 lri $AC1.M, #0x0d00 - // 03f0 0080 0050 lri $AR0, #0x0050 - // 03f2 02bf 0530 call 0x0530 - 0530_DMEMtoRAM_Ind(0x0d00, 0x0388, 0x050) - - // 03f4 0080 0fa0 lri $AR0, #0x0fa0 - // 03f6 0083 0d60 lri $AR3, #0x0d60 - // 03f8 0f50 lris $AC1.M, #0x50 - // 03f9 0098 8000 lri $AX0.L, #0x8000 - // 03fb 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(0x0fa0, 0x0d60, 0x50, 0x8000) - - // 03fd 0083 0d60 lri $AR3, #0x0d60 - // 03ff 02bf 0cc1 call 0x0cc1 - 0cc1_StrangeORRFilter(0x0d60) - - // 0401 0081 038a lri $AR1, #0x038a - // 0403 009f 0d60 lri $AC1.M, #0x0d60 - // 0405 0080 0050 lri $AR0, #0x0050 - // 0407 02bf 0530 call 0x0530 - 0530_DMEMtoRAM_Ind(0x0d60, 0x038a, 0x050) - - - // Move both RAM output buffer pointers forward, 0xa0 bytes (0x50 samples). - - // 0409 009a 0000 lri $AX0.H, #0x0000 - // 040b 0098 00a0 lri $AX0.L, #0x00a0 - // 040d 0080 0388 lri $AR0, #0x0388 - // 040f 02bf 0233 call 0x0233 - 0233_Increase_32BitAddress_InMem(0x0388, 0xa0) - // 0411 0080 038a lri $AR0, #0x038a - // 0413 02bf 0233 call 0x0233 - 0233_Increase_32BitAddress_InMem(0x038a, 0xa0) - - - // 0415 02bf 01ea call 0x01ea - 01ea_Unk(); - - 0417 0000 nop - 0418 0000 nop - } - - // 0419 0080 002d lri $AR0, #0x002d - // 041b 029f 0603 jmp 0x0603 - 0603_FinalizeFrame(0x02d) -} - -// Command 07 - not seen used. -void 041d_Unk() { - 041d 0080 0346 lri $AR0, #0x0346 - // 041f 02bf 0067 call 0x0067 - 0067_CopyCommand(_destAddr(#0x0346), _loopCount($AC0.M)) - // 0421 02bf 0067 call 0x0067 - 0067_CopyCommand(_destAddr(#0x0346), _loopCount($AC0.M)) - - 0423 0081 0346 lri $AR1, #0x0346 - 0425 193e lrri $AC0.M, @$AR1 - 0426 193c lrri $AC0.L, @$AR1 - 0427 009f 0400 lri $AC1.M, #0x0400 - 0429 00c0 0345 lr $AR0, @0x0345 - 042b 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 042d 0081 0348 lri $AR1, #0x0348 - 042f 193e lrri $AC0.M, @$AR1 - 0430 193c lrri $AC0.L, @$AR1 - 0431 009f 0800 lri $AC1.M, #0x0800 - 0433 00c0 0345 lr $AR0, @0x0345 - 0435 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 0437 0081 0346 lri $AR1, #0x0346 - 0439 193e lrri $AC0.M, @$AR1 - 043a 193c lrri $AC0.L, @$AR1 - 043b 009f 0800 lri $AC1.M, #0x0800 - 043d 00c0 0345 lr $AR0, @0x0345 - 043f 02bf 0532 call 0x0532 - 0441 0081 0348 lri $AR1, #0x0348 - 0443 193e lrri $AC0.M, @$AR1 - 0444 193c lrri $AC0.L, @$AR1 - 0445 009f 0400 lri $AC1.M, #0x0400 - 0447 00c0 0345 lr $AR0, @0x0345 - 0449 02bf 0532 call 0x0532 - 044b 029f 0043 jmp 0x0043 -} - -void 044d_COMMAND_07() -{ - 044d 0080 0346 lri $AR0, #0x0346 - 044f 02bf 0067 call 0x0067 - 0451 02bf 0067 call 0x0067 - 0453 0081 0346 lri $AR1, #0x0346 - 0455 193e lrri $AC0.M, @$AR1 - 0456 193c lrri $AC0.L, @$AR1 - 0457 009f 0400 lri $AC1.M, #0x0400 - 0459 00c0 0345 lr $AR0, @0x0345 - 045b 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 045d 0081 0348 lri $AR1, #0x0348 - 045f 193e lrri $AC0.M, @$AR1 - 0460 193c lrri $AC0.L, @$AR1 - 0461 009f 0400 lri $AC1.M, #0x0400 - 0463 00c0 0345 lr $AR0, @0x0345 - 0465 02bf 0532 call 0x0532 - 0467 029f 0043 jmp 0x0043 -} - -void 0469_COMMAND_06_09() -{ - 0469 0080 0346 lri $AR0, #0x0346 - 046b 02bf 0067 call 0x0067 - 046d 02bf 0067 call 0x0067 - 046f 0081 0346 lri $AR1, #0x0346 - 0471 193e lrri $AC0.M, @$AR1 - 0472 193c lrri $AC0.L, @$AR1 - 0473 009f 0400 lri $AC1.M, #0x0400 - 0475 00c0 0345 lr $AR0, @0x0345 - // 0477 02bf 0555 call 0x0555 // ReadFromMysteryReg - 0555_UnknownReadFromMysteryReg(ARAMAddress(ACC0), DestBuffer(AC1.M), Length(AC0.M)) { - - 0479 0081 0348 lri $AR1, #0x0348 - 047b 193e lrri $AC0.M, @$AR1 - 047c 193c lrri $AC0.L, @$AR1 - 047d 009f 0400 lri $AC1.M, #0x0400 - 047f 00c0 0345 lr $AR0, @0x0345 - 0481 02bf 0532 call 0x0532 - 0483 029f 0043 jmp 0x0043 -} - -void 0485_COMMAND_08() -{ - 0485 0080 0346 lri $AR0, #0x0346 - 0487 02bf 0067 call 0x0067 - 0489 02bf 0067 call 0x0067 - 048b 0081 0346 lri $AR1, #0x0346 - 048d 193e lrri $AC0.M, @$AR1 - 048e 193c lrri $AC0.L, @$AR1 - 048f 009f 0400 lri $AC1.M, #0x0400 - 0491 00c0 0344 lr $AR0, @0x0344 - 0493 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 0495 0081 0348 lri $AR1, #0x0348 - 0497 193e lrri $AC0.M, @$AR1 - 0498 193c lrri $AC0.L, @$AR1 - 0499 009f 0800 lri $AC1.M, #0x0800 - 049b 00c0 0344 lr $AR0, @0x0344 - 049d 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 049f 0080 0400 lri $AR0, #0x0400 - 04a1 0083 0800 lri $AR3, #0x0800 - 04a3 0084 0000 lri $IX0, #0x0000 - 04a5 00da 0345 lr $AX0.H, @0x0345 - 04a7 00df 0344 lr $AC1.M, @0x0344 - 04a9 8f00 set40 - 04aa 197b lrri $AX1.H, @$AR3 - 04ab b800 mulx $AX0.H, $AX1.H - 04ac 197b lrri $AX1.H, @$AR3 - 04ad 007f 04b2 bloop $AC1.M, 0x04b2 - 04af 199e lrrn $AC0.M, @$AR0 - 04b0 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 04b1 80b2 nx'sl : $AC0.M, $AX1.H - 04b2 0000 nop - 04b3 8e00 set16 - 04b4 0081 0346 lri $AR1, #0x0346 - 04b6 193e lrri $AC0.M, @$AR1 - 04b7 193c lrri $AC0.L, @$AR1 - 04b8 009f 0400 lri $AC1.M, #0x0400 - 04ba 00c0 0344 lr $AR0, @0x0344 - 04bc 02bf 0532 call 0x0532 - 04be 029f 0043 jmp 0x0043 -} - - -// Zeroes 256 words @ 0x0b00, calls 0x0573 -void 04c0_UnknownInit() -{ - 04c0 0092 00ff lri $CR, #0x00ff - 04c2 8100 clr $ACC0 - 04c3 0080 0b00 lri $AR0, #0x0b00 - 04c5 10ff loopi #0xff - 04c6 1b1e srri @$AR0, $AC0.M - 04c7 1b1e srri @$AR0, $AC0.M - 04c8 8100 clr $ACC0 - 04c9 009f 0b00 lri $AC1.M, #0x0b00 - 04cb 0080 0100 lri $AR0, #0x0100 - 04cd 02bf 0573 call 0x0573 - - 04cf 02df ret -} - - -void 04d0_Unk() { - // 04d0 02bf 04e1 call 0x04e1 - 04e1_Read0x40WordsFromZeroTo0b00() - - // 04fb is incremented when you reset a voice - 04d2 00df 04fb lr $AC1.M, @0x04fb - 04d4 009e 0b00 lri $AC0.M, #0x0b00 - 04d6 4c00 add $ACC0, $ACC1 - 04d7 1c1e mrr $AR0, $AC0.M - - 04d8 181e lrr $AC0.M, @$AR0 - 04d9 7400 incm $AC0.M - 04da 1a1e srr @$AR0, $AC0.M - *(AR0)++ - - 04db 02bf 04ea call 0x04ea - 04dd 8100 clr $ACC0 - 04de 00fe 04fb sr @0x04fb, $AC0.M - 04e0 02df ret -} - -void 04e1_Read0x40WordsFromZeroTo0b00() { - 04e1 0092 00ff lri $CR, #0x00ff - 04e3 8100 clr $ACC0 - 04e4 009f 0b00 lri $AC1.M, #0x0b00 - 04e6 0080 0040 lri $AR0, #0x0040 - // 04e8 029f 0555 jmp 0x0555 - GOTO 0555_UnknownReadFromMysteryReg(ARAMAddress(ACC0), DestBuffer(AC1.M), Length(AR0)) { -} - -void 04ea_Call0573With0b00And0050() { - 04ea 8100 clr $ACC0 - 04eb 009f 0b00 lri $AC1.M, #0x0b00 - 04ed 0080 0050 lri $AR0, #0x0050 - 04ef 029f 0573 jmp 0x0573 - // I don't get it, the above doesn't match the parameters - 0573_Mystery_Write(InBuffer($AR1), _COUNT(AX0.H)); -} - - -void 04f1_Read0x40WordsFromZeroTo0b00() { - // 04f1 02bf 04e1 call 0x04e1 - 04e1_Read0x40WordsFromZeroTo0b00(); -} - -void 04f3_strange() { - 04f3 8900 clr $ACC1 - 04f4 0080 04fc lri $AR0, #0x04fc - 04f6 8100 clr $ACC0 - - // Count the masked voices, look at all four mask words - // 04f7 1104 0505 bloopi #0x04, 0x0505 - for (int j = 0; j < 4; j++) { - 04f9 0000 nop - 04fa 191e lrri $AC0.M, @$AR0 - 04fb 0000 nop - - 04fc 1110 0503 bloopi #0x10, 0x0503 - for (int i = 0; i < 0x10; i++) { - 04fe 02c0 0001 andcf $AC0.M, #0x0001 - 0500 027d iflz - 0501 7500 incm $AC1.M // count up - 0502 147f lsr $ACC0, #-1 - 0503 0000 nop - } - 0504 0000 nop - 0505 0000 nop - } - // AC1.M now contains the count of all voices masked/unmasked (not sure which) - - // Copy the voice masks to 0x0b48 ... - 0506 00de 04fc lr $AC0.M, @0x04fc - 0508 00fe 0b48 sr @0x0b48, $AC0.M - 050a 00de 04fd lr $AC0.M, @0x04fd - 050c 00fe 0b49 sr @0x0b49, $AC0.M - 050e 00de 04fe lr $AC0.M, @0x04fe - 0510 00fe 0b4a sr @0x0b4a, $AC0.M - 0512 00de 04ff lr $AC0.M, @0x04ff - 0514 00fe 0b4b sr @0x0b4b, $AC0.M - - 0516 009e 0b00 lri $AC0.M, #0x0b00 - 0518 4c00 add $ACC0, $ACC1 // The value is in AC1.M, this must be wrong disasm - 0519 1c1e mrr $AR0, $AC0.M - - // Increment the counter at [ #0b00 + masked voice count] - // why would you do this? making bucket histogram over the number of active voices? - 051a 181e lrr $AC0.M, @$AR0 - 051b 7400 incm $AC0.M - 051c 1a1e srr @$AR0, $AC0.M - - 051d 02bf 04ea call 0x04ea // 04ea_Call0573With0b00And0050() - 051f 02df ret -} - -void PointlessFunction_Unused() { - 0520 02bf 04ea call 0x04ea // 04ea_Call0573With0b00And0050() - 0522 02df ret -} - - -// the first parameter is a pointer to the real RAM addr -void 0523_CopyRAMtoDMEM(&_srcRAM($AR1), _destDMEM($AC1.M), _len($AR0)) -{ - // 0523 193e lrri $AC0.M, @$AR1 - // 0524 193c lrri $AC0.L, @$AR1 - AC0 = *AR1++ << 16 | *AR1 - -void 0525_CopyRAMtoDMEM(_srcRAM($AR1), _destDMEM($AC1.M), _len($AR0)) -{ - 0525 2fcd srs @DSPA, $AC1.M - 0526 0f00 lris $AC1.M, #0x00 - - // ugly jump to share code... i am not going to document it ^^ - 0527 2fc9 srs @DSCR, $AC1.M - 0528 2ece srs @DSMAH, $AC0.M - 0529 2ccf srs @DSMAL, $AC0.L - 052a 1fe0 mrr $AC1.M, $AR0 - 052b 1501 lsl $ACC1, #1 - 052c 2fcb srs @DSBL, $AC1.M - - // 052d 02bf 0536 call 0x0536 - 0536_WaitForDMATransfer() - - // 052f 02df ret -} - -void 0530_DMEMtoRAM_Ind(_DMEM(AC1.M), _pMemAddr(AR1), _len(AR0)) -{ - // 0530 193e lrri $AC0.M, @$AR1 - // 0531 193c lrri $AC0.L, @$AR1 - AC0 = *AR1++ << 16 | *AR1 - // continues.... - -void 0532_DMEMtoRAM(_DMEM(AC1.M), _pMemAddr(ACC0), _len(AR0)) -{ - 0532 2fcd srs @DSPA, $AC1.M - 0533 0f01 lris $AC1.M, #0x01 - 0534 029f 0527 jmp 0x0527 -} - -void 0536_WaitForDMATransfer() -{ - 0536 26c9 lrs $AC0.M, @DSCR - 0537 02a0 0004 andf $AC0.M, #0x0004 - 0539 029c 0536 jlnz 0x0536 - 053b 02df ret -} - -// Can't find any calls to this one. -void 053c_Unk_Unused() { - 053c 193e lrri $AC0.M, @$AR1 - 053d 193c lrri $AC0.L, @$AR1 - 053e 00ff ffcd sr @DSPA, $AC1.M - 0540 0f00 lris $AC1.M, #0x00 - 0541 00ff ffc9 sr @DSCR, $AC1.M - 0543 00fe ffce sr @DSMAH, $AC0.M - 0545 00fc ffcf sr @DSMAL, $AC0.L - 0547 1fe0 mrr $AC1.M, $AR0 - 0548 1501 lsl $ACC1, #1 - 0549 00ff ffcb sr @DSBL, $AC1.M - 054b 02df ret -} - -void 054c_WaitForDMATransfer2_Unused() { - 054c 00de ffc9 lr $AC0.M, @DSCR - 054e 02a0 0004 andf $AC0.M, #0x0004 - 0550 029c 054c jlnz 0x054c - 0552 02df ret -} - -void 0553_UnknownReadFromMysteryReg_Unused() { - 0553 193e lrri $AC0.M, @$AR1 - 0554 193c lrri $AC0.L, @$AR1 - // continues... - -void 0555_UnknownReadFromMysteryReg(ARAMAddress(ACC0), DestBuffer(AC1.M), Length(AC0.M)) { - // 0555 0240 7fff andi $AC0.M, #0x7fff - // 0557 02bf 0561 call 0x0561 - 0561_SetupAcceleratorForMysteryAccess(ACC0 & 0x7FFFFFFF, AR0, AC1.M); - // After that, length is now in AX0.H - - // 0559 007a 055f bloop $AX0.H, 0x055f - for (int i = 0; i < AX0.H; i++) { - // 055b 26d3 lrs $AC0.M, @Unk Zelda - // 055c 1b3e srri @$AR1, $AC0.M - *(AR1++) = ReadFromUnknownAcceleratorRegister(); - } - // 055d 0000 nop - // 055e 0000 nop - // 055f 0000 nop - // 0560 02df ret -} - -void 0561_SetupAcceleratorForMysteryAccess(ARAMAddress(ACC0), DestBuffer(AC1.M), Length(AR0)) { - 0561 1c3f mrr $AR1, $AC1.M - 0562 0f0a lris $AC1.M, #0x0a - 0563 2fd1 srs @SampleFormat, $AC1.M - 0564 1f5e mrr $AX0.H, $AC0.M - 0565 1f1c mrr $AX0.L, $AC0.L - // Store 0xFFFFFFFF value as end address - Zelda does not use the looping hardware - 0566 009e ffff lri $AC0.M, #0xffff - 0568 2ed6 srs @ACEAH, $AC0.M // end address - 0569 2ed7 srs @ACEAL, $AC0.M - 056a 1fda mrr $AC0.M, $AX0.H - 056b 1f98 mrr $AC0.L, $AX0.L - // Divide "current" address by 2. - 056c 147f lsr $ACC0, #-1 - 056d 2ed8 srs @ACCAH, $AC0.M // Current address - 056e 2cd9 srs @ACCAL, $AC0.L - 056f 1f40 mrr $AX0.H, $AR0 - 0570 02df ret -} - -// Writes to UnkZelda, nops -void 0571_Mystery_Write_FirstLoadTwoRegs_Unused() { - 0571 193e lrri $AC0.M, @$AR1 - 0572 193c lrri $AC0.L, @$AR1 - -void 0573_Mystery_Write(InBuffer($AR1), SourceBuffer(AC1.M), _COUNT(AX0.H)) { - 0573 0090 0001 lri $AC0.H, #0x0001 - // 0575 02bf 0561 call 0x0561 - 0561_SetupAcceleratorForMysteryAccess(ACC0, AR0, AC1.M); - 0577 007a 057e bloop $AX0.H, 0x057e - 0579 193e lrri $AC0.M, @$AR1 - 057a 2ed3 srs @Unk Zelda, $AC0.M - 057b 0000 nop // seems the above store takes some time, - 057c 0000 nop // whatever it does, so ... 4 nops does the trick I guess - 057d 0000 nop - 057e 0000 nop - 057f 02df ret -} - - -void 0580_COMMAND_04() -{ - // commando looks buggy... - // it copies data to the switch casement data address... sounds like BS - - 0580 0080 0346 lri $AR0, #0x0346 - 0582 02bf 0067 call 0x0067 - 0584 02bf 0067 call 0x0067 - - 0067_CopyCommand(0x0346, mssing AC0.M??) - - 0586 0081 0346 lri $AR1, #0x0346 - 0588 00df 0349 lr $AC1.M, @0x0349 - 058a 0340 ffff andi $AC1.M, #0xffff - 058c 00c0 0345 lr $AR0, @0x0345 - 058e 02bf 0523 call 0x0523 - 0590 029f 0043 jmp 0x0043 -} - -void 0592_COMMAND_05() -{ - 0592 0080 0346 lri $AR0, #0x0346 - 0594 02bf 0067 call 0x0067 - 0596 02bf 0067 call 0x0067 - - // 0598 0081 0346 lri $AR1, #0x0346 - // 059a 00df 0349 lr $AC1.M, @0x0349 - // 059c 0340 ffff andi $AC1.M, #0xffff - // 059e 00c0 0345 lr $AR0, @0x0345 - // 05a0 02bf 0530 call 0x0530 - 0530_DMEMtoRAM_Ind((*0x0349)&0xFFFF, 0x0346, *0x0345) - - // 05a2 029f 0043 jmp 0x0043 - // jumps back to send sync messages .... -} - - -void 05A4_ResetAccelerator() -{ - 05a4 0092 00ff lri $CR, #0x00ff - 05a6 009e ffff lri $AC0.M, #0xffff - 05a8 2ed4 srs @ACSAH, $AC0.M - 05a9 2ed5 srs @ACSAL, $AC0.M - 05aa 2ed6 srs @ACEAH, $AC0.M - 05ab 2ed7 srs @ACEAL, $AC0.M - 05ac 02df ret -} - - -void 05ad_SetupAccelerator(_acceleratorH(AC0.M), _accleratorL(AC0.L), _format(AC1.M)) -{ - // 05ad 00ff ffd1 sr @SampleFormat, $AC1.M - *SampleFormat = AC1.M - - // 05af 0340 0003 andi $AC1.M, #0x0003 - // 05b1 7900 decm $AC1.M - // 05b2 02ca lsrn // ACC0 >>= AC1.M - // 05b3 00fe ffd8 sr @ACCAH, $AC0.M - // 05b5 00fc ffd9 sr @ACCAL, $AC0.L - - *ACCAH/ACCAL = address >> ((sampleFormat & 3) - 1); - // ACCAH/ACCAL is current read address - // Hm, this seems to imply some direct relationship between the sample format number and - // the nibbles-per-sample value - - // 05b7 02df ret -} - -void 05b8_NewMail() { - # 05b8 1205 sbclr #0x05 - # 05b9 8e00 set16 - - /* - 05ba 00f0 03fd sr @0x03fd, $AC0.H - 05bc 00fc 03ff sr @0x03ff, $AC0.L - 05be f400 lsr16 $ACC0 - 05bf 00fc 03fe sr @0x03fe, $AC0.L - 05c1 00fa 03fa sr @0x03fa, $AX0.H - 05c3 8100 clr $ACC0 - - save AC0 register - */ - - *0x03fd = AC0.H - *0x03ff = AC0.L - ACC0 >>= 16 - *0x03fe = AC0.L - *0x03fa = AX0.H - - // 05c4 00de fffe lr $AC0.M, @CMBH - // 05c6 02c0 8000 andcf $AC0.M, #0x8000 - // 05c8 029c 06b9 jlnz 0x06b9 - if (@CMBH & 0x8000 > 0) - { - !MISSING! - } - - // 05ca 00da ffff lr $AX0.H, @CMBL - // 05cc 8600 tstaxh $AX0.H - // 05cd 0294 0692 jnz 0x0692 - if (*CMBL != 0) - { - !MISSING! - } - - - // 05cf 00de fffe lr $AC0.M, @CMBH - // 05d1 02c0 8000 andcf $AC0.M, #0x8000 - // 05d3 029c 05cf jlnz 0x05cf - while(@CMBH & 0x8000 > 0); - - - // 05d5 0240 000f andi $AC0.M, #0x000f - // 05d7 1f5e mrr $AX0.H, $AC0.M - // 05d8 7400 incm $AC0.M - // 05d9 0c00 lris $AC0.L, #0x00 - // 05da 1404 lsl $ACC0, #4 - // 05db 00fe 034e sr @0x034e, $AC0.M - AC0.M = *CMBH & 0x000F - AX0.H = AC0.M - *0x034e = (AC0.M++) << 4 - - - // 05dd 1fda mrr $AC0.M, $AX0.H - // 05de 1f40 mrr $AX0.H, $AR0 - // 05df 0200 04fc addi $AC0.M, #0x04fc - // 05e1 1c1e mrr $AR0, $AC0.M - - AX0.H = AR0 // save AR0 - - AC0.M = *CMBH & 0x000F - AC0.M += 0x04fc - AR0 = AC0.M - - // 05e2 00de ffff lr $AC0.M, @CMBL - // 05e4 1a1e srr @$AR0, $AC0.M - // 05e5 1c1a mrr $AR0, $AX0.H - AC0.M = *CMBL - *AR0 = AC0.M - AR0 = AX.H // restore AR0 - - -EndOfMailException: - - /* - 05e6 00de 03fe lr $AC0.M, @0x03fe - 05e8 00dc 03ff lr $AC0.L, @0x03ff - 05ea 00d0 03fd lr $AC0.H, @0x03fd - 05ec 00da 03fa lr $AX0.H, @0x03fa - restore AC0 register - */ - AC0.M = *0x03fe - AC0.L = *0x03ff - AC0.H = *0x03fd - AX0.H = *0x03fa - - # 05ee 1305 sbset #0x05 - - 05ef 02ff rti -} - -void 05f0_HaltUCode() -{ - 05f0 009a 0002 lri $AX0.H, #0x0002 - 05f2 00fa 03a3 sr @0x03a3, $AX0.H - 05f4 00e0 03f9 sr @0x03f9, $AR0 - /* - 05f6 02bf 067c call 0x067c - */ - 067c_Unk() - - 05f8 16fc dcd1 si @DMBH, #0xdcd1 - 05fa 16fd 0002 si @DMBL, #0x0002 - 05fc 16fb 0001 si @DIRQ, #0x0001 - 05fe 0021 halt -} - -// Sync Table -05ff 0617 cmpis $ACC0, #0x17 -0600 0618 cmpis $ACC0, #0x18 -0601 0658 cmpis $ACC0, #0x58 -0602 065b cmpis $ACC0, #0x5b - - // at the end of a frame, we get a mail telling ucode what to do next -void 0603_FinalizeFrame(_returnAddr($AR0)) -{ - // 0603 00e0 03f9 sr @0x03f9, $AR0 - 0x03f9 = _returnAddr - - // 0605 009e 0005 lri $AC0.M, #0x0005 - // 0607 02bf 066a call 0x066a - SendMB_DCD1(0x0005) - - # 0609 8e00 set16 - // 060a 8100 clr $ACC0 - // 060b 8900 clr $ACC1 - ACC0 = 0 - ACC1 = 0 - - // 060c 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - // 060e 27ff lrs $AC1.M, @CMBL - // 060f 009e 05ff lri $AC0.M, #0x05ff - // 0611 4c00 add $ACC0, $ACC1 - AC0.M = 0x05ff + *CMBL - - // 0612 1c7e mrr $AR3, $AC0.M - // 0613 0313 ilrr $AC1.M, @$AR3 - // 0614 1c7f mrr $AR3, $AC1.M - AR3 = *AC0.M <- "BUT FROM Instrcution Memory (look at sync table about)" - - // 0615 176f jmpr $AR3 - switch(AR3 - 0x05FF) - { - case 0x00: HALT(); break; - case 0x01: 0618_PrepareBootUcode(); break; - case 0x02: 0658_SoftReset(); break; - case 0x03: 065b_ContinueWithUCode(); break; - default: HALT(); - // 0616 0021 halt - } -} - -0617 0021 halt - - // Sets up info needed to dma in a chunk to iram or dram, - // and calls irom to do actual dma. irom returns to address given in AR0 -void 0618_PrepareBootUcode() { - // Dunno what that's about... - 0618 009a 0002 lri $AX0.H, #0x0002 - 061a 00fa 03a3 sr @0x03a3, $AX0.H - - 061c 8100 clr $ACC0 - 061d 8900 clr $ACC1 - - //061e 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - 0620 24ff lrs $AC0.L, @CMBL - - //0621 02bf 0664 call 0x0664 - 0664_WaitForCPUMailBox_AC1() - - 0623 25ff lrs $AC1.L, @CMBL - - //0624 02bf 0664 call 0x0664 - 0664_WaitForCPUMailBox_AC1() - - 0626 27ff lrs $AC1.M, @CMBL - 0627 2ece srs @DSMAH, $AC0.M - 0628 2ccf srs @DSMAL, $AC0.L // 0 - 0629 16c9 0001 si @DSCR, #0x0001 - 062b 2fcd srs @DSPA, $AC1.M // 2 - 062c 2dcb srs @DSBL, $AC1.L // 1 - - 062d 8100 clr $ACC0 - 062e 8900 clr $ACC1 - - //062f 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - 0631 24ff lrs $AC0.L, @CMBL - 0632 1c9e mrr $IX0, $AC0.M - 0633 1cbc mrr $IX1, $AC0.L - //0634 02bf 0664 call 0x0664 - 0664_WaitForCPUMailBox_AC1() - - 0636 25ff lrs $AC1.L, @CMBL - - //0637 02bf 0664 call 0x0664 - 0664_WaitForCPUMailBox_AC1() - - 0639 27ff lrs $AC1.M, @CMBL - 063a 1cdf mrr $IX2, $AC1.M - 063b 1cfd mrr $IX3, $AC1.L - 063c 8100 clr $ACC0 - - //063d 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - 063f 26ff lrs $AC0.M, @CMBL - 0640 1c1e mrr $AR0, $AC0.M - 0641 8900 clr $ACC1 - //0642 02bf 0664 call 0x0664 - 0664_WaitForCPUMailBox_AC1() - - 0644 20ff lrs $AX0.L, @CMBL - 0645 1f5f mrr $AX0.H, $AC1.M - //0646 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - 0648 21ff lrs $AX1.L, @CMBL - - //0649 02bf 065e call 0x065e - 065e_WaitForCPUMailBox_AC0() - - 064b 23ff lrs $AX1.H, @CMBL - - // Make sure dma is ready - // 064c 26c9 lrs $AC0.M, @DSCR - // 064d 02a0 0004 andf $AC0.M, #0x0004 - // 064f 029c 064c jlnz 0x064c - - // Reset some of the state - // 0651 1206 sbclr #0x06 - // 0652 1203 sbclr #0x03 - // 0653 1204 sbclr #0x04 - // 0654 1205 sbclr #0x05 - - // 0655 029f 80b5 jmp 0x80b5 - 80b5_BootUcode(); - - // Should not reach here - 0657 0021 halt -} - -void 0658_SoftReset() { - 0658 029f 8000 jmp 0x8000 - 065a 0021 halt -} - -void 065b_ContinueWithUCode() -{ - // 065b 00c0 03f9 lr $AR0, @0x03f9 - // 065d 170f jmpr $AR0 - GOTO *0x03f9; -} - - -void 065e_WaitForCPUMailBox_AC0() -{ - 065e 26fe lrs $AC0.M, @CMBH - 065f 02c0 8000 andcf $AC0.M, #0x8000 - 0661 029c 065e jlnz 0x065e - 0663 02df ret -} - -void 0664_WaitForCPUMailBox_AC1() -{ - 0664 27fe lrs $AC1.M, @CMBH - 0665 03c0 8000 andcf $AC1.M, #0x8000 - 0667 029c 0664 jlnz 0x0664 - 0669 02df ret -} -void SendMB_DCD1(_low) - { - // 066a 02bf 0682 call 0x0682 - WaitForEmptyDSPMailBox_ovAC1(); - - // 066c 16fc dcd1 si @DMBH, #0xdcd1 - // 066e 2efd srs @DMBL, $AC0.M - // 066f 16fb 0001 si @DIRQ, #0x0001 - - *DMBH = 0xDCD1 - *DMBL = _low - *DIRQ = 0x0001 - - // 0671 02bf 0682 call 0x0682 - WaitForEmptyDSPMailBox_ovAC1() - - // 0673 02df ret -} - - -void SendMB_F355(_low) -{ - // 0674 02bf 0682 call 0x0682 - WaitForEmptyDSPMailBox_ovAC1(); - - // 0676 16fc f355 si @DMBH, #0xf355 - // 0678 2efd srs @DMBL, $AC0.M - - *DMBH = 0xf355 - *DMBL = _low - - // 0679 02bf 0682 call 0x0682 - WaitForEmptyDSPMailBox_ovAC1(); - - // 067b 02df ret -} - - -void 067c_Unk() -{ - 067c 26fc lrs $AC0.M, @DMBH - 067d 02c0 8000 andcf $AC0.M, #0x8000 - 067f 029d 067c jlz 0x067c - 0681 02df ret -} - - -void WaitForEmptyDSPMailBox_ovAC1.M() - { - // 0682 27fc lrs $AC1.M, @DMBH - // 0683 03c0 8000 andcf $AC1.M, #0x8000 - // 0685 029d 0682 jlz 0x0682 - while (*DMBH & 0x8000); - - // 0687 02df ret -} - - -void 0688_InitCommandBlock() -{ - // 0688 009a 0280 lri $AX0.H, #0x0280 - // 068a 00fa 0350 sr @0x0350, $AX0.H - // 068c 00fa 0351 sr @0x0351, $AX0.H - *0x0350 = 0x0280 - *0x0351 = 0x0280 - - // 068e 0a00 lris $AX0.H, #0x00 - // 068f 00fa 0352 sr @0x0352, $AX0.H - *0x0352 = 0x00 - - // 0691 02df ret -} - - // - // this block is called by the new mail exception - // it seems to copy a new command to the address @0x0350 and increase the - // number of commands at 0x0352 - // - { - 0692 00e0 03fb sr @0x03fb, $AR0 - 0694 00e8 03fc sr @0x03fc, $WR0 - 0696 00c0 0350 lr $AR0, @0x0350 - 0698 0088 002f lri $WR0, #0x002f - - do { - 069a 1b1a srri @$AR0, $AX0.H - - // 069b 00de fffe lr $AC0.M, @CMBH - // 069d 02c0 8000 andcf $AC0.M, #0x8000 - // 069f 029c 069b jlnz 0x069b - while (!CMBH & 0x8000) - ; - 06a1 00dc ffff lr $AC0.L, @CMBL - 06a3 1b1e srri @$AR0, $AC0.M - 06a4 1b1c srri @$AR0, $AC0.L - 06a5 1fda mrr $AC0.M, $AX0.H - 06a6 7800 decm $AC0.M - 06a7 1f5e mrr $AX0.H, $AC0.M - - // 06a8 8600 tstaxh $AX0.H - // 06a9 0294 069b jnz 0x069b - } while (AX0.H); - - /* - 06ab 8100 clr $ACC0 - 06ac 00de 0352 lr $AC0.M, @0x0352 - 06ae 7400 incm $AC0.M - 06af 00fe 0352 sr @0x0352, $AC0.M - increase number of commands - */ - *0x0352 = *0x0352++ - - - 06b1 00e0 0350 sr @0x0350, $AR0 - 06b3 00c0 03fb lr $AR0, @0x03fb - 06b5 00c8 03fc lr $WR0, @0x03fc - - // 06b7 029f 05e6 jmp 0x05e6 - GOTO EndOfMailException // return values and leave exception - - // looks like a read from ring buffer [0x350, 0x37f] - // note the use of the wrap register WR0. - 06b9 00e0 03fb sr @0x03fb, $AR0 - 06bb 00e8 03fc sr @0x03fc, $WR0 - 06bd 00c0 0350 lr $AR0, @0x0350 - 06bf 0088 002f lri $WR0, #0x002f - 06c1 0a00 lris $AX0.H, #0x00 - 06c2 1b1a srri @$AR0, $AX0.H - 06c3 029f 06ab jmp 0x06ab -} - - -void 06c5_CopyCommandBlock() - { - // 06c5 00c0 0351 lr $AR0, @0x0351 - short srcCommandQueueAddr = *0x0351 - - // 06c7 0088 002f lri $WR0, #0x002f - $WR0 = #0x002f - - -:start - /* - 06c9 00da 0352 lr $AX0.H, @0x0352 - 06cb 8600 tstaxh $AX0.H - 06cc 0295 06ed jz 0x06ed - check how many commands are inside the "queue" - */ - - if (*0x352 == 0) - { - $WR0 = #0xffff - return 0x2d; - } - - /* - 06ce 1205 sbclr #0x05 - 06cf 00da 0352 lr $AX0.H, @0x0352 - 06d1 1fda mrr $AC0.M, $AX0.H - 06d2 7800 decm $AC0.M - 06d3 00fe 0352 sr @0x0352, $AC0.M - 06d5 1305 sbset #0x05 - decrement number of commands in queue - */ - *0x352--; - - // 06d6 0081 0356 lri $AR1, #0x0356 - short destCommandQueueAddr = 0x0356 - - // 06d8 191e lrri $AC0.M, @$AR0 - // 06d9 02c0 8000 andcf $AC0.M, #0x8000 - // 06db 029d 06f1 jlz 0x06f1 - // 06dd 1f5e mrr $AX0.H, $AC0.M - // 06de 8600 tstaxh $AX0.H - // 06df 0295 06f5 jz 0x06f5 - - // check if command is valid - - short numCommands = *srcCommandQueueAddr++ - numCommands &= 0x8000 - if (numCommands < 0) - { - *0x0351 = srcCommandQueueAddr - GOTO :start - } - - if (numCommands == 0) - { - 05f0_HaltUCode() - } - - /* - 06e1 007a 06e6 bloop $AX0.H, 0x06e6 - 06e3 191e lrri $AC0.M, @$AR0 - 06e4 1b3e srri @$AR1, $AC0.M - 06e5 191e lrri $AC0.M, @$AR0 - 06e6 1b3e srri @$AR1, $AC0.M - - copy command queue - */ - - for (int i=0; i> 4 - - //07c5 2380 lrs $AX1.H, @0xff80 - //07c6 8d00 set15 - //07c7 c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - - $AX0.l = (PB.LoopStartPos >> 4) & 0xffff; - prod = (PB.LoopStartPos >> 4 & 0xffff0000)*PB.Format; - - //07c8 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - - $ACC0 = (PB.LoopStartPos >> 4 & 0xffff0000)*PB.Format; - prod = ((PB.LoopStartPos >> 4) & 0xffff)*PB.Format; - - //07c9 8c00 clr15 - //07ca f000 lsl16 $ACC0 - - $ACC0 = (((PB.LoopStartPos >> 4) & 0xffff0000)*PB.Format)<<16 - - //07cb 4e00 addp $ACC0 - - $ACC0 = ((((PB.LoopStartPos >> 4) & 0xffff0000)*PB.Format)<<16)+ - (((PB.LoopStartPos >> 4) & 0xffff)*PB.Format) - - // 07cc 238c lrs $AX1.H, @0xff8c - // 07cd 218d lrs $AX1.L, @0xff8d - // 07ce 4a00 addax $ACC0, $AX1 - - $ACC0 = (((((PB.LoopStartPos >> 4) & 0xffff0000)*PB.Format)<<16)+ - (((PB.LoopStartPos >> 4) & 0xffff)*PB.Format))+PB.StartAddr - - // 07cf 2e38 srs @0x0038, $AC0.M - // 07d0 2c39 srs @0x0039, $AC0.L - - PB.CurAddr = $ACC0 & 0xffffffff; - - // 07d1 2682 lrs $AC0.M, @0xff82 - // 07d2 2e67 srs @0x0067, $AC0.M - // 07d3 2683 lrs $AC0.M, @0xff83 - // 07d4 2e66 srs @0x0066, $AC0.M - //Unconditionally (!) copy YN1 and YN2 from loopyn2 and loopyn1 - - PB.YN1 = PB.LoopYN1; - PB.YN2 = PB.LoopYN2; - - 07d5 00e3 0363 sr @0x0363, $AR3 - 07d7 0083 0458 lri $AR3, #0x0458 - 07d9 8100 clr $ACC0 - 07da 0e01 lris $AC0.M, #0x01 - - // 07db 02bf 07eb call 0x07eb - 07eb_AFCDecoder(); - - 07dd 00c3 0363 lr $AR3, @0x0363 - 07df 02bf 0729 call 0x0729 - 07e1 029f 0749 jmp 0x0749 - - // No repeat - // stop rendering of this PB (0x401 == 1) and clear the output buffer with zeroes... - //07e3 0e01 lris $AC0.M, #0x01 - //07e4 2e01 srs @0x0001, $AC0.M - - PB.KeyOff = 1; - - early_out: - // Zero the buffer. - 07e5 8100 clr $ACC0 - 07e6 005f loop $AC1.M - 07e7 1b7e srri @$AR3, $AC0.M - 07e8 0092 00ff lri $CR, #0x00ff - - // 07ea 02df ret - return - } -} - - - - -void 07eb_AFCDecoder(_numberOfSample(AC0.M)) -{ - // 07eb 00ff 0360 sr @0x0360, $AC1.M - // 07ed 00fe 0361 sr @0x0361, $AC0.M - // 07ef 2638 lrs $AC0.M, @0x0038 - // 07f0 2439 lrs $AC0.L, @0x0039 - // 07f1 0f05 lris $AC1.M, #0x05 - // 07f2 02bf 05ad call 0x05ad - 05ad_SetupAccelerator(AC0.M, AC0.L, AC1.M) - - // 07f4 2638 lrs $AC0.M, @0x0038 - // 07f5 2439 lrs $AC0.L, @0x0039 - // 07f6 8900 clr $ACC1 - // 07f7 00df 0361 lr $AC1.M, @0x0361 - // 07f9 2280 lrs $AX0.H, @0xff80 - // 07fa d000 mulc $AC1.M, $AX0.H - // 07fb 6f00 movp $ACC1 - // 07fc 4c00 add $ACC0, $ACC1 - // 07fd 2e38 srs @0x0038, $AC0.M - // 07fe 2c39 srs @0x0039, $AC0.L - // increase sample offset in ARAM - AC0 = (*0x0038 << 16) | *0x0039 - AC1 = AC0 + _numberOfSample * *0x0480 // bytes per sample - *0x0038 = AC0.M - *0x0039 = AC0.L - - - // 07ff 8100 clr $ACC0 - // 0800 00de 0361 lr $AC0.M, @0x0361 - //0802 007e 086b bloop $AC0.M, 0x086b - for (int i = 0; i < _numberOfSample; i++) - { - // Look for the lrrn below to find the ARAM reads. - - // FFD3 seems to be some interface to do plain single byte reads - // from ARAM with no ADPCM fanciness or similar. - - // It loads through AR0 loaded with immediate #ffd3, not through - // lrs, so CR doesn't affect the effective address. - - 0804 0080 ffd3 lri $AR0, #0xffd3 - 0806 0084 0000 lri $IX0, #0x0000 - 0808 199e lrrn $AC0.M, @$AR0 - 0809 8900 clr $ACC1 - 080a 1ffe mrr $AC1.M, $AC0.M - 080b 1401 lsl $ACC0, #1 - 080c 0240 001e andi $AC0.M, #0x001e - 080e 0200 0300 addi $AC0.M, #0x0300 // AFC COEF Table - 0810 1c3e mrr $AR1, $AC0.M - 0811 157c lsr $ACC1, #-4 - 0812 0340 000f andi $AC1.M, #0x000f - 0814 0a11 lris $AX0.H, #0x11 - 0815 5500 subr $ACC1, $AX0.H - - // 0816 8100 clr $ACC0 - // 0817 2680 lrs $AC0.M, @0xff80 - // 0818 0605 cmpis $ACC0, #0x05 - // 0819 0295 0832 jz 0x0832 - if (*0x480 != 0x5) // ( == 0x09) - { - 081b 009a 00f0 lri $AX0.H, #0x00f0 - 081d 0b0f lris $AX1.H, #0x0f - 081e 0082 0364 lri $AR2, #0x0364 - 0820 1998 lrrn $AX0.L, @$AR0 - 0821 6000 movr $ACC0, $AX0.L - - // Unpack 14 of the nibbles.. - 0822 1107 0829 bloopi #0x07, 0x0829 - for (int j=0; j<7; j++) - { - 0824 3400 andr $AC0.M, $AX0.H - 0825 1408 lsl $ACC0, #8 - 0826 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - - 0827 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 0828 140c lsl $ACC0, #12 - 0829 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - } - // Then do the last two .. - 082a 3400 andr $AC0.M, $AX0.H - 082b 1408 lsl $ACC0, #8 - 082c 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 082d 3600 andr $AC0.M, $AX1.H - 082e 140c lsl $ACC0, #12 - 082f 1b5e srri @$AR2, $AC0.M - - 0830 029f 0852 jmp 0x0852 - } - else // (*0x480 == 5) - { - 0832 009a c000 lri $AX0.H, #0xc000 - 0834 0082 0364 lri $AR2, #0x0364 - 0836 1998 lrrn $AX0.L, @$AR0 - 0837 6000 movr $ACC0, $AX0.L - - // Unpack half nibbles (half quality, ~half space) - //0838 1103 0845 bloopi #0x03, 0x0845 - for (j=0; j<3; j++) - { - 083a 1408 lsl $ACC0, #8 - 083b 3400 andr $AC0.M, $AX0.H - 083c 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 083d 140a lsl $ACC0, #10 - 083e 3400 andr $AC0.M, $AX0.H - 083f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0840 140c lsl $ACC0, #12 - 0841 3400 andr $AC0.M, $AX0.H - 0842 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0843 140e lsl $ACC0, #14 - 0844 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0 - 0845 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - } - - 0846 1408 lsl $ACC0, #8 - 0847 3400 andr $AC0.M, $AX0.H - 0848 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0849 140a lsl $ACC0, #10 - 084a 3400 andr $AC0.M, $AX0.H - 084b 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 084c 140c lsl $ACC0, #12 - 084d 3400 andr $AC0.M, $AX0.H - 084e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 084f 140e lsl $ACC0, #14 - 0850 3400 andr $AC0.M, $AX0.H - 0851 1b5e srri @$AR2, $AC0.M - } - - 0852 8f00 set40 - 0853 1f7f mrr $AX1.H, $AC1.M - 0854 2066 lrs $AX0.L, @0x0066 - 0855 2767 lrs $AC1.M, @0x0067 - 0856 193a lrri $AX0.H, @$AR1 - 0857 1939 lrri $AX1.L, @$AR1 - 0858 0080 0364 lri $AR0, #0x0364 - 085a 1c80 mrr $IX0, $AR0 - 085b a000 mulx $AX0.L, $AX1.L - 085c ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - - // ADPCM decoding main loop. - 085d 1108 0866 bloopi #0x08, 0x0866 - for (int i=0; i<8; i++) - { - 085f 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 0860 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 0861 1485 asl $ACC0, #5 - 0862 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 0863 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 0864 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 0865 1585 asl $ACC1, #5 - 0866 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - } - 0867 2f67 srs @0x0067, $AC1.M - 0868 8e00 set16 - 0869 1ff8 mrr $AC1.M, $AX0.L - 086a 2f66 srs @0x0066, $AC1.M - 086b 8900 clr $ACC1 - } - 086c 00df 0360 lr $AC1.M, @0x0360 - 086e 02df ret -} - - - - - - // probably unreachable - { - // 086f b100 tst $ACC0 - // 0870 02d5 retz - if (!$ACC0) return; - - 0871 04fe addis $ACC0, #0xfe - 0872 1f1e mrr $AX0.L, $AC0.M - 0873 191e lrri $AC0.M, @$AR0 - 0874 0291 087a jl 0x087a - 0876 191a lrri $AX0.H, @$AR0 - 0877 0058 loop $AX0.L - 0878 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0879 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 087a 1b7e srri @$AR3, $AC0.M - 087b 02df ret -} - - -//////////////////////////////////////////// DEFAULT DECODER -void 087c_DefaultDecoder() -{ - // 087c 8100 clr $ACC0 - // 087d 1f5e mrr $AX0.H, $AC0.M - // 087e 00d8 0402 lr $AX0.L, @0x0402 - - ACC0 = 0; - AX0.L = *0x0402; // == PB.RatioInt - - // Sample fraction is stored in a common way, but sample position is not, so - // it's in the individual decoders. Some decoders, like square wave, only care about - // fractional sample position. So here we just load up the fractional sample - // position before handing control over. - - // 0880 00dc 0430 lr $AC0.L, @0x0430 - // 0882 0080 0520 lri $AR0, #0x0520 - - AC0.L = *0x430; // == PB.CurSampleFrac - AR0 = 0x0520; - - // 0884 00df 0480 lr $AC1.M, @0x0480 - // 0886 1501 lsl $ACC1, #1 - // 0887 0340 007e andi $AC1.M, #0x007e - // 0889 0300 0891 addi $AC1.M, #0x0891 - // 088b 1c5f mrr $AR2, $AC1.M - // 088c 175f callr $AR2 // (*$AR2)() <-- See jump table at 0x0891 - - AC1.M = ((*0x480 * 2) & 0x007e) + 0x0891; // == ((PB.Format * 2) & 0x007e) + 0x0891 - AR2 = AC1.M; - - JumpTable0891(PB.Format); - - //088d 00fc 0430 sr @0x0430, $AC0.L - *0x430 = AC0.L; // *0x430 == PB.CurSampleFrac - - // 088f 029f 02d8 jmp 0x02d8 - GOTO ContinueWithBlock: // in SyncFrame -} - - -// Jump table -// switch(PB.Format) -0891 029f 08b2 jmp 0x08b2 // case 0x0 // 08b2_Decoder0x0_SquareWave (used in ZWW) -0893 029f 08ed jmp 0x08ed // case 0x1 // 08ed_Decoder0x1_SawWave (used in ZWW) -0895 029f 08d5 jmp 0x08d5 // case 0x2 // 08d5_Decoder0x2_SquareSaw (hasn't been spotted) -0897 029f 08c2 jmp 0x08c2 // case 0x3 // 08c2_Decoder0x3_RectangleWave (hasn't been spotted) -0899 029f 08fb jmp 0x08fb // case 0x4 // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) -089b 029f 08b1 jmp 0x08b1 // case 0x5 (can never happen) -089d 029f 0919 jmp 0x0919 // case 0x6 // 0919_Decoder0x6_Constant (hasn't been spotted) -089f 029f 091c jmp 0x091c // case 0x7 // 091c_Decoder0x7_WaveTable (used in Pikmin) -08a1 029f 08b1 jmp 0x08b1 // case 0x8 (can never happen) -08a3 029f 08b1 jmp 0x08b1 // case 0x9 (can never happen) -08a5 029f 093a jmp 0x093a // case 0xa (hasn't been spotted) -08a7 029f 08f3 jmp 0x08f3 // case 0xb // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) (used in Pikmin) -08a9 029f 08f7 jmp 0x08f7 // case 0xc // void 08f3_Decoder0x4_0xb_0xc_WaveTable (used in Pikmin) (Zelda force field in temple of gods) -08ab 029f 08b1 jmp 0x08b1 // case 0xd (unused) -08ad 029f 08b1 jmp 0x08b1 // case 0xe (unused) -08af 029f 08b1 jmp 0x08b1 // case 0xf (unused) -08b1 02df ret - -void 08b2_Decoder0x0_SquareWave(ACC0, AR0, AX0.L) { - // 08b2 1401 lsl $ACC0, #1 - t = samplePosition * 2; - - // Set up sound buffers - // 08b3 009b c000 lri $AX1.H, #0xc000 - // 08b5 0099 4000 lri $AX1.L, #0x4000 - - // 08b7 1150 08bf bloopi #0x50, 0x08bf - for(int i = 0; i < 80; i++) { - //08b9 02c0 0001 andcf $AC0.M, #0x0001 - //08bb 027c iflnz - // 08bc 1b1b srri @$AR0, $AX1.H - //08bd 027d iflz - // 08be 1b19 srri @$AR0, $AX1.L - if(($AC0.M & 1) == 1) - *$AR0++ = 0x4000; - else - *$AR0++ = 0xc000; - - // 08bf 4800 addax $ACC0, $AX0 - t += PB.Ratio; - } - // 08c0 147f lsr $ACC0, #-1 - t /= 2; - - // 08c1 02df ret -} - -void 08c2_Decoder0x3_RectangleWave(ACC0, AR0, AX0.L) { - 08c2 1402 lsl $ACC0, #2 // t = PB.CurSampleFrac * 4 - 08c3 8900 clr $ACC1 // ACC1 = 0 - 08c4 1fb8 mrr $AC1.L, $AX0.L // AC1.L = PB.RatioInt - 08c5 1501 lsl $ACC1, #1 // ACC1 *= 2 - 08c6 009b c000 lri $AX1.H, #0xc000 - 08c8 0099 4000 lri $AX1.L, #0x4000 - // 08ca 1150 08d2 bloopi #0x50, 0x08d2 - for(int i = 0; i < 80; i++) { - // 08cc 02c0 0003 andcf $AC0.M, #0x0003 - // 08ce 027c iflnz - // 08cf 1b1b srri @$AR0, $AX1.H - // 08d0 027d iflz - // 08d1 1b19 srri @$AR0, $AX1.L - // 08d2 4c00 add $ACC0, $ACC1 - - if (($AC0.M & 3) == 3) - *$AR0++ = 0x4000; - else - *$AR0++ = 0xc000; - - t += (PB.RatioInt * 2); - } - // 08d3 147e lsr $ACC0, #-2 - t /= 4; - - // 08d4 02df ret -} - -void 08d5_Decoder0x2_SquareSaw(ACC0, AR0, AX0.L) { - 08d5 1401 lsl $ACC0, #1 - 08d6 0081 0ca0 lri $AR1, #0x0ca0 - 08d8 009b c000 lri $AX1.H, #0xc000 - 08da 0099 4000 lri $AX1.L, #0x4000 - 08dc 8900 clr $ACC1 - 08dd 0082 0000 lri $AR2, #0x0000 - 08df 1150 08ea bloopi #0x50, 0x08ea - 08e1 02c0 0001 andcf $AC0.M, #0x0001 - 08e3 027c iflnz - 08e4 1b1b srri @$AR0, $AX1.H - 08e5 027d iflz - 08e6 1b19 srri @$AR0, $AX1.L - 08e7 183d lrr $AC1.L, @$AR1 - 08e8 4900 addax $ACC1, $AX0 - 08e9 1fe2 mrr $AC1.M, $AR2 - 08ea 4c39 add's $ACC0, $ACC1 : @$AR1, $AC1.M - 08eb 147f lsr $ACC0, #-1 - // 08ec 02df ret -} - -void 08ed_Decoder0x1_SawWave(ACC0, AR0, AX0.L) { - // 08ed 8900 clr $ACC1 - // 08ee 1fb8 mrr $AC1.L, $AX0.L - // 08ef 157f lsr $ACC1, #-1 - - // At this point AX0.L is PB.RatioInt and AC0.L is PB.CurSampleFrac - ACC1 = 0; - AC1.L = AX0.L * 2; - - // 08f0 1050 loopi #0x50 - for(int i = 0; i < 0x50; i++) { - // 08f1 4c20 add's $ACC0, $ACC1 : @$AR0, $AC0.L - ACC0 += ACC1; - *$AR0++ = AC0.L; - } - // 08f2 02df ret -} - - -void 08f3_Decoder0x4_0xb_0xc_WaveTable(ACC0, AR0, AX0.L) { - // See 091c - - 08f3 0082 0180 lri $AR2, #0x0180 // Entrance 1, 0x0b - 08f5 029f 08fd jmp 0x08fd - - 08f7 0082 01c0 lri $AR2, #0x01c0 // Entrance 2, 0x0c - 08f9 029f 08fd jmp 0x08fd - - 08fb 0082 0140 lri $AR2, #0x0140 // Entrance 3, 0x04 - - 08fd 008a 003f lri $WR2, #0x003f - 08ff 0086 0000 lri $IX2, #0x0000 - 0901 1406 lsl $ACC0, #6 - 0902 8900 clr $ACC1 - 0903 1fb8 mrr $AC1.L, $AX0.L - 0904 1505 lsl $ACC1, #5 - 0905 009b 003f lri $AX1.H, #0x003f - 0907 009a 0000 lri $AX0.H, #0x0000 - 0909 3600 andr $AC0.M, $AX1.H - 090a 1cde mrr $IX2, $AC0.M - 090b 001a addarn $AR2, $IX2 - 090c 3400 andr $AC0.M, $AX0.H - 090d 1150 0913 bloopi #0x50, 0x0913 - 090f 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0910 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0911 1cde mrr $IX2, $AC0.M - 0912 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0913 1b19 srri @$AR0, $AX1.L - 0914 1fc2 mrr $AC0.M, $AR2 - 0915 147a lsr $ACC0, #-6 - 0916 008a ffff lri $WR2, #0xffff - // 0918 02df ret -} - -void 0919_Decoder0x6_Constant(AR0, AX0.L) { - // case 0x6: Fills the buffer with PB.RatioInt (zero?) - - // 0919 1050 loopi #0x50 - // 091a 1b18 srri @$AR0, $AX0.L - - for(int i = 0; i < 0x50; i++) - *AR0++ = AX0.L; // PB.RatioInt - - // 091b 02df ret -} - -void 091c_Decoder0x7_WaveTable(ACC0, AR0, AX0.L) { - // So AR2 is where it reads the data from, and it updates ACC0 to the final read address in the end - // Questions: How does the wrap register change the data access? - - // 091c 0082 0100 lri $AR2, #0x0100 - // 091e 008a 003f lri $WR2, #0x003f - // 0920 0086 0000 lri $IX2, #0x0000 - // 0922 1406 lsl $ACC0, #6 - // 0923 8900 clr $ACC1 - // 0924 1fb8 mrr $AC1.L, $AX0.L - // 0925 1505 lsl $ACC1, #5 - - - WR2 = 0x003f; - ACC0 <<= 6; - ACC1 = AX0.L << 5; - - - // 0926 009b 003f lri $AX1.H, #0x003f - // 0928 009a 0000 lri $AX0.H, #0x0000 - // 092a 3600 andr $AC0.M, $AX1.H - // 092b 1cde mrr $IX2, $AC0.M - // 092c 001a addarn $AR2, $IX2 - // 092d 3400 andr $AC0.M, $AX0.H - - AC0.M &= 0x003f; - IX2 = AC0.M; - AR2 = 0x0100 + IX2; - - AC0.M = 0; - - - // 092e 1150 0934 bloopi #0x50, 0x0934 - for(int i = 0; i < 0x50; i++) { - // 0930 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - - ACC0 += ACC1; - AX1.L = *AR2++; - - // 0931 3606 andr'dr $AC0.M, $AX1.H : $AR2 - AC0.M &= 0x003f; - AR2--; - - // 0932 1cde mrr $IX2, $AC0.M - IX2 = AC0.M; - - // 0933 340e andr'nr $AC0.M, $AX0.H : $AR2 - AC0.M = 0; - AR2 += IX2; - - // 0934 1b19 srri @$AR0, $AX1.L - *AR0++ = AX1.L; - - } - - // 0935 1fc2 mrr $AC0.M, $AR2 - // 0936 147a lsr $ACC0, #-6 - // 0937 008a ffff lri $WR2, #0xffff - - AC0.M = AR2; - ACC0 >>= 6; - WR2 = 0xffff; - - // 0939 02df ret -} - -void 093a_Unk() { - 093a 0082 0100 lri $AR2, #0x0100 - 093c 008a 003f lri $WR2, #0x003f - 093e 0086 0000 lri $IX2, #0x0000 - 0940 0081 0ca0 lri $AR1, #0x0ca0 - 0942 1406 lsl $ACC0, #6 - 0943 8900 clr $ACC1 - 0944 1fb8 mrr $AC1.L, $AX0.L - 0945 1505 lsl $ACC1, #5 - 0946 009b 003f lri $AX1.H, #0x003f - 0948 009a 0000 lri $AX0.H, #0x0000 - 094a 3600 andr $AC0.M, $AX1.H - 094b 1cde mrr $IX2, $AC0.M - 094c 001a addarn $AR2, $IX2 - 094d 3400 andr $AC0.M, $AX0.H - 094e 1150 0959 bloopi #0x50, 0x0959 - 0950 1939 lrri $AX1.L, @$AR1 - 0951 a000 mulx $AX0.L, $AX1.L - 0952 140a lsl $ACC0, #10 - 0953 4e00 addp $ACC0 - 0954 1476 lsr $ACC0, #-10 - 0955 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0956 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0957 1cde mrr $IX2, $AC0.M - 0958 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0959 1b19 srri @$AR0, $AX1.L - 095a 1fc2 mrr $AC0.M, $AR2 - 095b 147a lsr $ACC0, #-6 - 095c 008a ffff lri $WR2, #0xffff - 095e 02df ret -} - -void 095f_Unk_SetupMemAt0_0180() { - 095f 0080 01be lri $AR0, #0x01be - 0961 1918 lrri $AX0.L, @$AR0 - 0962 191a lrri $AX0.H, @$AR0 - 0963 0080 0180 lri $AR0, #0x0180 - 0965 0083 0180 lri $AR3, #0x0180 - 0967 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0968 1ffe mrr $AC1.M, $AC0.M - // 0969 1120 0970 bloopi #0x20, 0x0970 - for (int i = 0; i < 0x20; i++) { - 096b 7c00 neg $ACC0 - 096c d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 096d 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 096e c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 096f 1501 lsl $ACC1, #1 - 0970 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - } - 0971 0080 01fe lri $AR0, #0x01fe - 0973 191a lrri $AX0.H, @$AR0 - 0974 1918 lrri $AX0.L, @$AR0 - 0975 0080 01c0 lri $AR0, #0x01c0 - 0977 0083 01c0 lri $AR3, #0x01c0 - 0979 1ff8 mrr $AC1.M, $AX0.L - 097a 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 097b f800 addpaxz $ACC0, $AX0.H - 097c 0240 01ff andi $AC0.M, #0x01ff - 097e 0260 2000 ori $AC0.M, #0x2000 - - //0980 02bf 0983 call 0x0983 - 0983_WriteRamp($ACC0, $ACC1, Dest($AR3)) - - // 0982 02df ret -} - -void 0983_WriteRamp(ACC0, ACC1, Dest($AR3)) { - // 0983 b900 tst $ACC1 - // 0984 0272 ifg - // 0985 7c00 neg $ACC0 - if ($ACC1 > 0) { - $ACC0 = -$ACC0; - } - - // 0986 1f7e mrr $AX1.H, $AC0.M - // 0987 4700 addr $ACC1, $AX1.H - - // 0988 1110 098d bloopi #0x10, 0x098d - for (int i = 0; i < 0x10; i++) { - 098a 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 098b 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 098c 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 098d 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - } - 098e 02df ret -} - -//////////////////////////////////////////// 0x08 DECODER -// Hardcoded destination 0x0580. -void Decoder0x08() { - 098f 0092 0004 lri $CR, #0x0004 - 0991 2002 lrs $AX0.L, @0x0002 - 0992 8100 clr $ACC0 - 0993 8900 clr $ACC1 - 0994 2430 lrs $AC0.L, @0x0030 // CurSampleFrac - - // 0995 8d00 set15 - // 0996 0950 lris $AX1.L, #0x50 - // 0997 a000 mulx $AX0.L, $AX1.L - // 0998 a400 mulxac $AX0.L, $AX1.L, $ACC0 - // 0999 1404 lsl $ACC0, #4 - // 099a 8c00 clr15 - // Compute how much data we need to read, to get 0x50 samples after resampling. - // AC0.L is cursamplefrace, AX0.L is ratio. - $ACC0 = PB.CurrentSampleFrac + 0x50 * PB.Ratio; - - 099b 1ffe mrr $AC1.M, $AC0.M - 099c 0083 0580 lri $AR3, #0x0580 - 099e 2201 lrs $AX0.H, @0x0001 - 099f 8600 tstaxh $AX0.H - 09a0 0294 09b1 jnz 0x09b1 - - // 09a2 2204 lrs $AX0.H, @0x0004 - // 09a3 8600 tstaxh $AX0.H - // 09a4 02b4 09f9 callne 0x09f9 - if (*0x0404) { // NeedsReset - 09f9_UpdateSampleCounters8(); - } - - 09a6 8100 clr $ACC0 - 09a7 2605 lrs $AC0.M, @0x0005 - 09a8 b100 tst $ACC0 - 09a9 0295 09be jz 0x09be - -label09ab: - 09ab 8100 clr $ACC0 - 09ac 2e05 srs @0x0005, $AC0.M - 09ad 2281 lrs $AX0.H, @0xff81 - 09ae 8600 tstaxh $AX0.H - 09af 0294 09b8 jnz 0x09b8 - 09b1 8100 clr $ACC0 - 09b2 005f loop $AC1.M - 09b3 1b7e srri @$AR3, $AC0.M - 09b4 7400 incm $AC0.M - 09b5 2e01 srs @0x0001, $AC0.M - 09b6 029f 09f2 jmp 0x09f2 - 09b8 2688 lrs $AC0.M, @0xff88 - 09b9 2489 lrs $AC0.L, @0xff89 - 09ba 2e34 srs @0x0034, $AC0.M - 09bb 2c35 srs @0x0035, $AC0.L - // 09bc 02bf 09f9 call 0x09f9 - 09f9_UpdateSampleCounters8(); - - 09be 00ff 0360 sr @0x0360, $AC1.M - - 09c0 2638 lrs $AC0.M, @0x0038 - 09c1 2439 lrs $AC0.L, @0x0039 - 09c2 0f05 lris $AC1.M, #0x05 // Sample format 5 - // 09c3 02bf 05ad call 0x05ad - 05ad_SetupAccelerator(AC0.M, AC0.L, AC1.M) - - 09c5 00df 0360 lr $AC1.M, @0x0360 - 09c7 8100 clr $ACC0 - // 09c8 263a lrs $AC0.M, @0x003a - // 09c9 b100 tst $ACC0 - // 09ca 0294 09d9 jnz 0x09d9 - if (*(0x043a)) { - 09cc 263b lrs $AC0.M, @0x003b - 09cd 5c00 sub $ACC0, $ACC1 - 09ce 0290 09d9 jge 0x09d9 - - 09d0 223b lrs $AX0.H, @0x003b - // 09d1 02bf 0a0a call 0x0a0a // Load more samples. - 0a0a_ReadFromAccelerator8To16(OutBuffer($AR3), Count($AX0.H)) - - 09d3 5500 subr $ACC1, $AX0.H - // 09d4 0a01 lris $AX0.H, #0x01 - // 09d5 00fa 0405 sr @0x0405, $AX0.H - *0x405 = 1; // PB.ReachedEnd = 1; - - 09d7 029f 09ab jmp 0x09ab - } - - 09d9 1f5f mrr $AX0.H, $AC1.M - // 09da 02bf 0a0a call 0x0a0a // Load more samples. - 0a0a_ReadFromAccelerator8To16(OutBuffer($AR3), Count($AX0.H)); - - // Stash AX0.H away, it gets read again at 09ef. - 09dc 00fa 0362 sr @0x0362, $AX0.H - - 09de 8100 clr $ACC0 - 09df 263a lrs $AC0.M, @0x003a - 09e0 243b lrs $AC0.L, @0x003b - 09e1 1570 lsr $ACC1, #-16 - - // 09e2 0a01 lris $AX0.H, #0x01 - // 09e3 0081 0405 lri $AR1, #0x0405 - // 09e5 5c00 sub $ACC0, $ACC1 - // 09e6 b100 tst $ACC0 - // 09e7 0275 ifz - // 09e8 1a3a srr @$AR1, $AX0.H - - ACC0 -= ACC1; - if(ACC0 == 0) - *0x405 = 1; // PB.ReachedEnd = 1 - - 09e9 2e3a srs @0x003a, $AC0.M - 09ea 2c3b srs @0x003b, $AC0.L - 09eb 2638 lrs $AC0.M, @0x0038 - 09ec 2439 lrs $AC0.L, @0x0039 - 09ed 00d8 0362 lr $AX0.L, @0x0362 - 09ef 7000 addaxl $ACC0, $AX0.L - 09f0 2c39 srs @0x0039, $AC0.L - 09f1 2e38 srs @0x0038, $AC0.M - - // 09f2 0092 00ff lri $CR, #0x00ff - // 09f4 029f 02d0 jmp 0x02d0 - GOTO Resample_From0580To0520: -} - - -// unreachable code -void Unreachable() { - 09f6 8100 clr $ACC0 - 09f7 2e34 srs @0x0034, $AC0.M - 09f8 2e35 srs @0x0035, $AC0.M -} - -void 09f9_UpdateSampleCounters8() { - 09f9 2334 lrs $AX1.H, @0x0034 - 09fa 2135 lrs $AX1.L, @0x0035 - 09fb 268a lrs $AC0.M, @0xff8a - 09fc 248b lrs $AC0.L, @0xff8b - 09fd 5a00 subax $ACC0, $AX1 - 09fe 2e3a srs @0x003a, $AC0.M - 09ff 2c3b srs @0x003b, $AC0.L - 0a00 2634 lrs $AC0.M, @0x0034 - 0a01 2435 lrs $AC0.L, @0x0035 - 0a02 238c lrs $AX1.H, @0xff8c - 0a03 218d lrs $AX1.L, @0xff8d - 0a04 4a00 addax $ACC0, $AX1 - 0a05 2e38 srs @0x0038, $AC0.M - 0a06 2c39 srs @0x0039, $AC0.L - 0a07 8100 clr $ACC0 - 0a08 2e05 srs @0x0005, $AC0.M - // 0a09 02df ret -} - -void 0a0a_ReadFromAccelerator8To16(OutBuffer($AR3), Count($AX0.H)) { - // Read from ARAM. Convert 8-bit samples to 16-bit. - // 0a0a 0080 ffd3 lri $AR0, #0xffd3 - // 0a0c 0084 0000 lri $IX0, #0x0000 - // 0a0e 007a 0a12 bloop $AX0.H, 0x0a12 - // 0a10 199e lrrn $AC0.M, @$AR0 - // 0a11 1488 asl $ACC0, #8 - // 0a12 1b7e srri @$AR3, $AC0.M - // 0a13 02df ret - for (int i = 0; i < $AX0.H; i++) { - *($AR3++) = (*0xffd3) << 8; // ffd3 is the non-adpcm alternative read address for the accelerator. - } -} - - -//////////////////////////////////////////// 0x10 DECODER -// Hardcoded destination 0x0580. -// This should be the easiest decoder to decipher in full -- except the really -// trivial ones like the synths. -// It's almost identical to Decoder0x08 -void Decoder0x10() { - // 0a14 0092 0004 lri $CR, #0x0004 - 0a16 2002 lrs $AX0.L, @0x0002 - 0a17 8100 clr $ACC0 - 0a18 8900 clr $ACC1 - // 0a19 2430 lrs $AC0.L, @0x0030 - 0a1a 8d00 set15 - - // 0a1b 0950 lris $AX1.L, #0x50 - // 0a1c a000 mulx $AX0.L, $AX1.L - // 0a1d a400 mulxac $AX0.L, $AX1.L, $ACC0 - // 0a1e 1404 lsl $ACC0, #4 - // 0a1f 8c00 clr15 - - // Compute how much data we need to read, to get 0x50 samples after resampling. - // AC0.L is cursamplefrac, AX0.L is ratio. - $ACC0 = (PB.CurrentSampleFrac + 0x50 * PB.Ratio) << 4; - - 0a20 1ffe mrr $AC1.M, $AC0.M - 0a21 0083 0580 lri $AR3, #0x0580 - 0a23 2201 lrs $AX0.H, @0x0001 - 0a24 8600 tstaxh $AX0.H - 0a25 0294 0a36 jnz 0x0a36 /// Jump! See jump destination below. - - 0a27 2204 lrs $AX0.H, @0x0004 - 0a28 8600 tstaxh $AX0.H - 0a29 02b4 0a7f callne 0x0a7f - if (*0x0404) // "NeedsReset" - { - 0a7f_UpdateSampleCounters10() - } - - 0a2b 8100 clr $ACC0 - - 0a2c 2605 lrs $AC0.M, @0x0005 - 0a2d b100 tst $ACC0 - 0a2e 0295 0a43 jz 0x0a43 - if (*0x405) { - - retry_0a30: - 0a30 8100 clr $ACC0 - 0a31 2e05 srs @0x0005, $AC0.M - 0a32 2281 lrs $AX0.H, @0xff81 - 0a33 8600 tstaxh $AX0.H - 0a34 0294 0a3d jnz 0x0a3d - if (!*401) { //// <<<<<<<<<<<< Jump destination - 0a36 8100 clr $ACC0 - 0a37 005f loop $AC1.M - 0a38 1b7e srri @$AR3, $AC0.M - 0a39 7400 incm $AC0.M - 0a3a 2e01 srs @0x0001, $AC0.M - 0a3b 029f 0a78 jmp 0x0a78 // quit - } else { - // Copy [88,89] to [34,35] - 0a3d 2688 lrs $AC0.M, @0xff88 - 0a3e 2489 lrs $AC0.L, @0xff89 - 0a3f 2e34 srs @0x0034, $AC0.M - 0a40 2c35 srs @0x0035, $AC0.L - 0a41 02bf 0a7f call 0x0a7f - 0a7f_UpdateSampleCounters10() - } - } - - 0a43: - 0a43 00ff 0360 sr @0x0360, $AC1.M - 0a45 2638 lrs $AC0.M, @0x0038 - 0a46 2439 lrs $AC0.L, @0x0039 - 0a47 0f06 lris $AC1.M, #0x06 // Sample format 6 - // 0a48 02bf 05ad call 0x05ad - 05ad_SetupAccelerator(AC0.M, AC0.L, AC1.M) - - 0a4a 00df 0360 lr $AC1.M, @0x0360 - 0a4c 8100 clr $ACC0 - 0a4d 263a lrs $AC0.M, @0x003a - 0a4e b100 tst $ACC0 - 0a4f 0294 0a5e jnz 0x0a5e - if (!*0x043a) { - 0a51 263b lrs $AC0.M, @0x003b - 0a52 5c00 sub $ACC0, $ACC1 - 0a53 0290 0a5e jge 0x0a5e - if (0x43b <= ACC1) { // not sure, but .. not enough samples? - 0a55 223b lrs $AX0.H, @0x003b - // 0a56 02bf 0a91 call 0x0a91 // Read more samples - 0a91_ReadFromAccelerator(OutBuffer($AR3), Count($AX0.H)); - 0a58 5500 subr $ACC1, $AX0.H - // 0a59 0a01 lris $AX0.H, #0x01 - // 0a5a 00fa 0405 sr @0x0405, $AX0.H - *0x405 = 1; // PB.ReachedEnd - - 0a5c 029f 0a30 jmp 0x0a30 // GOTO retry_0a30; - } - } - - 0a5e 1f5f mrr $AX0.H, $AC1.M - // 0a5f 02bf 0a91 call 0x0a91 // Read more samples - 0a91_ReadFromAccelerator(OutBuffer($AR3), Count($AX0.H)) - - // Stash AX0.H away, it gets read again at 0a72. - 0a61 00fa 0362 sr @0x0362, $AX0.H - - 0a63 8100 clr $ACC0 - 0a64 263a lrs $AC0.M, @0x003a - 0a65 243b lrs $AC0.L, @0x003b - 0a66 1570 lsr $ACC1, #-16 - // 0a67 0a01 lris $AX0.H, #0x01 - // 0a68 0081 0405 lri $AR1, #0x0405 - // 0a6a 5c00 sub $ACC0, $ACC1 - // 0a6b b100 tst $ACC0 - // 0a6c 0275 ifz - // 0a6d 1a3a srr @$AR1, $AX0.H - - ACC0 -= ACC1; - if(ACC0 == 0) - *0x405 = 1; // PB.ReachedEnd = 1 - - 0a6e 2e3a srs @0x003a, $AC0.M - 0a6f 2c3b srs @0x003b, $AC0.L - 0a70 2638 lrs $AC0.M, @0x0038 - 0a71 2439 lrs $AC0.L, @0x0039 - 0a72 00d8 0362 lr $AX0.L, @0x0362 - 0a74 7000 addaxl $ACC0, $AX0.L - 0a75 7000 addaxl $ACC0, $AX0.L - 0a76 2c39 srs @0x0039, $AC0.L - 0a77 2e38 srs @0x0038, $AC0.M - - // 0a78 0092 00ff lri $CR, #0x00ff - // 0a7a 029f 02d0 jmp 0x02d0 - GOTO Resample_From0580To0520: -} - -void 0a7c_UnkUnused() { - 0a7c 8100 clr $ACC0 - 0a7d 2e34 srs @0x0034, $AC0.M - 0a7e 2e35 srs @0x0035, $AC0.M - -// used by 0x10 decoder -void 0a7f_UpdateSampleCounters10() { - 0a7f 2334 lrs $AX1.H, @0x0034 - 0a80 2135 lrs $AX1.L, @0x0035 - 0a81 268a lrs $AC0.M, @0xff8a - 0a82 248b lrs $AC0.L, @0xff8b - 0a83 5a00 subax $ACC0, $AX1 // Subtract [34,35] from [8a, 8b] - 0a84 2e3a srs @0x003a, $AC0.M - 0a85 2c3b srs @0x003b, $AC0.L - 0a86 2634 lrs $AC0.M, @0x0034 - 0a87 2435 lrs $AC0.L, @0x0035 - 0a88 1401 lsl $ACC0, #1 // This shift is not done in UpdateSampleCounters8. - 0a89 238c lrs $AX1.H, @0xff8c - 0a8a 218d lrs $AX1.L, @0xff8d - 0a8b 4a00 addax $ACC0, $AX1 // Add [34,35]<<1 to [8c, 8d] - 0a8c 2e38 srs @0x0038, $AC0.M - 0a8d 2c39 srs @0x0039, $AC0.L - 0a8e 8100 clr $ACC0 - 0a8f 2e05 srs @0x0005, $AC0.M - 0a90 02df ret -} - - -// Read AX0.H samples from the accelerator. -void 0a91_ReadFromAccelerator(OutBuffer($AR3), Count($AX0.H)) { - // 0a91 0080 ffd3 lri $AR0, #0xffd3 - // 0a93 0084 0000 lri $IX0, #0x0000 - // 0a95 007a 0a98 bloop $AX0.H, 0x0a98 - // 0a97 199e lrrn $AC0.M, @$AR0 - // 0a98 1b7e srri @$AR3, $AC0.M - // 0a99 02df ret - - for (int i = 0; i < $AX0.H; i++) { - *($AR3++) = *0xffd3; // ffd3 is the non-adpcm alternative read address for the accelerator. - } -} - -//////////////////////////////////////////// 0x20 DECODER -// Same as 0x21 but with no resampling. -{ - // 0a9a 8900 clr $ACC1 - // 0a9b 0f50 lris $AC1.M, #0x50 - // 0a9c 0083 0520 lri $AR3, #0x0520 - // 0a9e 02bf 0ab3 call 0x0ab3 - - ACC1 = 0; - AC1.M = 0x50; - AR3 = 0x520; - - 0ab3_Decoder0x21Core(AC1.M=0x50, AR3=#0x0520); - - // 0aa0 029f 02d8 jmp 0x02d8 - GOTO ContinueWithBlock: // in SyncFrame -} - -//////////////////////////////////////////// 0x21 DECODER -void 0aa2_Decoder0x21() { - // 0aa2 00d8 0402 lr $AX0.L, @0x0402 - // 0aa4 8100 clr $ACC0 - // 0aa5 8900 clr $ACC1 - AX0.L = *0x0402; - ACC0 = 0 - ACC1 = 0 - // 0aa6 00dc 0430 lr $AC0.L, @0x0430 - // 0aa8 0a50 lris $AX0.H, #0x50 - // 0aa9 9000 mul $AX0.L, $AX0.H - // 0aaa 9400 mulac $AX0.L, $AX0.H, $ACC0 - // 0aab 1404 lsl $ACC0, #4 - ACC0 = (*0x0430 + (*0x0402 * 0x50)) << 4; - - // 0aac 1ffe mrr $AC1.M, $AC0.M - ACC1 = ACC0 & 0xFFFF0000; - - // 0aad 0083 0580 lri $AR3, #0x0580 - // 0aaf 02bf 0ab3 call 0x0ab3 // 0ab3_Decoder0x21Core - 0ab3_Decoder0x21Core(AC1.M, AR3=#0x0580); - - // 0ab1 029f 02d0 jmp 0x02d0 - GOTO Resample_From0580To0520: -} - -// 0x21 Decoder Core -// Decoder 0x21 simply streams raw audio from RAM (not ARAM!) by using DMA. -// Lots of buffer wrap trickery etc but no actual decoding. -void 0ab3_Decoder0x21Core(AC1.M, AR3) { - // 0ab3 0092 0004 lri $CR, #0x0004 - // 0ab5 8100 clr $ACC0 - // 0ab6 263a lrs $AC0.M, @0x003a - // 0ab7 243b lrs $AC0.L, @0x003b - // 0ab8 1f1f mrr $AX0.L, $AC1.M - // 0ab9 0a00 lris $AX0.H, #0x00 - // 0aba 5800 subax $ACC0, $AX0 - ACC0 = [0x043a,0x043b]; - ACC0 -= AC1.M; - - - // 0abb 0292 0ad1 jg 0x0ad1 - if ([0x043a,0x043b] <= AC1.M) { - // Happens when sound has finished playing? - - // 0abd 8900 clr $ACC1 - // 0abe 00c0 043b lr $AR0, @0x043b - ACC1 = 0; - AR0 = *0x043b; - - // 0ac0 02bf 0af6 call 0x0af6 // 0af6_Decoder0x21_MoreStuff() - 0af6_Decoder0x21_MoreStuff(AR0=*0x043b, AR3); - - // 0ac2 8100 clr $ACC0 - // 0ac3 1fd8 mrr $AC0.M, $AX0.L - // 0ac4 223b lrs $AX0.H, @0x003b - // 0ac5 5400 subr $ACC0, $AX0.H - // 0ac6 0007 dar $AR3 - // 0ac7 1979 lrri $AX1.L, @$AR3 - - ACC0 = 0; - AX0.H = *0x043b; - AC0.M = AX0.L - *0x043b; - - AX1.L = *$AR3; - - // Looks like duplication of the first memory address AC0.M times - - // 0ac8 005e loop $AC0.M - for(int i = 0; i < AC0.M; i++) { - // 0ac9 1b79 srri @$AR3, $AX1.L - *$AR3++ = AX1.L; - } - - // 0aca 0f01 lris $AC1.M, #0x01 - // 0acb 2f01 srs @0x0001, $AC1.M - // 0acc 8900 clr $ACC1 - // 0acd 2f3b srs @0x003b, $AC1.M - - ACC1 = 0; - - // Looks like some finalization of the PB - *0x0401 = 1; // KeyOff - *0x043b = 0; // RemLength - - - 0ace 0092 00ff lri $CR, #0x00ff - //0ad0 02df ret - return; - } - - // 0ad1 2e3a srs @0x003a, $AC0.M - // 0ad2 2c3b srs @0x003b, $AC0.L - - *0x043a = AC0.M; - *0x043b = AC0.L; - - // 0ad3 8100 clr $ACC0 - // 0ad4 8900 clr $ACC1 - // 0ad5 268a lrs $AC0.M, @0xff8a - // 0ad6 2734 lrs $AC1.M, @0x0034 - - ACC0 = 0; - ACC1 = 0; - AC0.M = *0x048a; - AC1.M = *0x0434; - - // 0ad7 5c00 sub $ACC0, $ACC1 - // 0ad8 2e36 srs @0x0036, $AC0.M - - ACC0 -= AC1.L; - *0x0436 = (ACC0 & 0xFFFF0000) >> 16; - - // 0ad9 5000 subr $ACC0, $AX0.L - ACC0 -= AX0.L; - - 0ada 0290 0af0 jge 0x0af0 - if (ACC0 < 0) { - // 0adc 00c0 0436 lr $AR0, @0x0436 - // 0ade 02bf 0af6 call 0x0af6 - 0af6_Decoder0x21_MoreStuff(AR0=*0x0436, AR3); - - // 0ae0 8100 clr $ACC0 - // 0ae1 1fd8 mrr $AC0.M, $AX0.L - - ACC0 = 0; - AC0.M = AX0.L; - - // 0ae2 2236 lrs $AX0.H, @0x0036 // 0x0436 - AX0.H = *0x0436; - - // 0ae3 5400 subr $ACC0, $AX0.H - // 0ae4 1c1e mrr $AR0, $AC0.M - // 0ae5 8100 clr $ACC0 - // 0ae6 2e34 srs @0x0034, $AC0.M - - ACC0 -= AX0.H; - AR0 = (ACC0 & 0xFFFF0000) >> 16; - ACC0 = 0; - *0x0434 = 0; - - // 0ae7 2688 lrs $AC0.M, @0xff88 // 0x0488 - // 0ae8 2489 lrs $AC0.L, @0xff89 // 0x0489 - // 0ae9 2e8c srs @0xff8c, $AC0.M - // 0aea 2c8d srs @0xff8d, $AC0.L - - *0x048c = *0x0488; - *0x048d = *0x0489; - - // 0aeb 02bf 0af6 call 0x0af6 - 0af6_Decoder0x21_MoreStuff(AR0=*0x0436, AR3); - - 0aed 0092 00ff lri $CR, #0x00ff - // 0aef 02df ret - return; - } - - // 0af0 1c18 mrr $AR0, $AX0.L - // 0af1 02bf 0af6 call 0x0af6 - - AR0 = AX0.L; - 0af6_Decoder0x21_MoreStuff(AR0=AX0.L, AR3); - - 0af3 0092 00ff lri $CR, #0x00ff - // 0af5 02df ret -} - - - -// CR = 0x4 -// Does strange stuff with PB[0x34] and the address PB[0x8c,d] -// Does not touch AX0.L -void 0af6_Decoder0x21_MoreStuff($AR0, $AR3) { - // 0af6 8100 clr $ACC0 - // 0af7 1fc0 mrr $AC0.M, $AR0 - // 0af8 b100 tst $ACC0 - // 0af9 02d5 retz - if (!AR0) - return; - - // 0afa 8900 clr $ACC1 - // 0afb 2734 lrs $AC1.M, @0x0034 - // 0afc 0340 0001 andi $AC1.M, #0x0001 - // 0afe 0b00 lris $AX1.H, #0x00 - // 0aff 1f3f mrr $AX1.L, $AC1.M - - AX1.L = *0x0434 & 1; - - // 0b00 268c lrs $AC0.M, @0xff8c - // 0b01 248d lrs $AC0.L, @0xff8d - // 0b02 8900 clr $ACC1 - // 0b03 2534 lrs $AC1.L, @0x0034 - // 0b04 1501 lsl $ACC1, #1 - // 0b05 4c00 add $ACC0, $ACC1 - - // 0b06 5a00 subax $ACC0, $AX1 - // 0b07 5a00 subax $ACC0, $AX1 - - ACC0 = [8c,8d] + *0x0434 * 2 - ((*0x0434 & 1) * 2); - - // 0b08 1c20 mrr $AR1, $AR0 - - AR1 = AR0; - - // 0b09 1fe0 mrr $AC1.M, $AR0 - // 0b0a 0502 addis $ACC1, #0x02 - ACC1 = ($AR0 << 16) + 0x20000; - - // - // 0b0b 1c1f mrr $AR0, $AC1.M - // 0b0c 009f 0b00 lri $AC1.M, #0x0b00 - 0b0e 0092 00ff lri $CR, #0x00ff - - AR0 = AC1.M; - AC1.M = 0x0b00; - - // Load more audio from RAM by DMA?? - - // 0b10 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM - 0525_CopyRAMtoDMEM($AR1 == $ACC1 >> 16, 0x0b00, $AR0) - - // 0b12 0092 0004 lri $CR, #0x0004 - - // 0b14 2734 lrs $AC1.M, @0x0034 - // 0b15 1f61 mrr $AX1.H, $AR1 - // 0b16 4700 addr $ACC1, $AX1.H - // 0b17 2f34 srs @0x0034, $AC1.M - *0x0434 += AR1; - - // 0b18 0080 0b00 lri $AR0, #0x0b00 - // 0b1a 8900 clr $ACC1 - // 0b1b 1ff9 mrr $AC1.M, $AX1.L - // 0b1c b900 tst $ACC1 - // 0b1d 0274 ifnz - if (AX1.L) { - // 0b1e 0008 iar $AR0 - $AR0++; - } - // 0b1f 8900 clr $ACC1 - // 0b20 1fe1 mrr $AC1.M, $AR1 - // 0b21 191e lrri $AC0.M, @$AR0 - // 0b22 0701 cmpis $ACC1, #0x01 - ACC1 = 0; - AC1.M = AR1; - AC0.M = *$AR0++; - // 0b23 0293 0b2c jle 0x0b2c - if (AC1.M > 1) { - // 0b25 191a lrri $AX0.H, @$AR0 - // 0b26 05fe addis $ACC1, #0xfe - AX0.H = *$AR0++; - ACC1 += 0xfe0000; - - // 0b27 005f loop $AC1.M - for(int i = 0; i < AC1.M; i++) { - // 0b28 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - AC0.L = 0; - AC0.H = AX0.H; - AC0.M = AX0.H; - AX0.H = *$AR0++; - *$AR3++ = AC0.M; - } - //0b29 1b7e srri @$AR3, $AC0.M - //0b2a 1b7a srri @$AR3, $AX0.H - //0b2b 02df ret - - *$AR3++ = AC0.M; - *$AR3++ = AX0.H; - } else { - //0b2c 1b7e srri @$AR3, $AC0.M - //0b2d 02df ret - *$AR3++ = AC0.M; - } -} - - -void 0b2e_Unk_Multiply() { // ZWW: 01c2_Unk - 0b2e 8a00 m2 - 0b2f 0083 03e8 lri $AR3, #0x03e8 - 0b31 191e lrri $AC0.M, @$AR0 - 0b32 191a lrri $AX0.H, @$AR0 - 0b33 1006 loopi #0x06 - 0b34 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0b35 1b7e srri @$AR3, $AC0.M - 0b36 1b7a srri @$AR3, $AX0.H - 0b37 0080 03e8 lri $AR0, #0x03e8 - 0b39 0088 0007 lri $WR0, #0x0007 - 0b3b 1150 0b48 bloopi #0x50, 0x0b48 - for (int i = 0; i < 0x50; i++) { - 0b3d 1c61 mrr $AR3, $AR1 - 0b3e 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0b3f f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b40 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b41 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b42 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b43 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b44 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b45 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b46 f200 madd $AX0.L, $AX0.H - 0b47 fe00 movpz $ACC0 - 0b48 1b3e srri @$AR1, $AC0.M - } - 0b49 0088 ffff lri $WR0, #0xffff - 0b4b 8b00 m0 - 0b4c 02df ret -} - -// looks kind of like a IIR filter? -// Hardcoded buffer length = 0x50 -void 0b4d_IIR_Filter(InBuffer($AR0), OutBuffer($AR1), FilterLength(AC1.M)) { - 0b4d 8a00 m2 - 0b4e 05fe addis $ACC1, #0xfe - 0b4f 0083 03e8 lri $AR3, #0x03e8 - 0b51 191e lrri $AC0.M, @$AR0 - 0b52 191a lrri $AX0.H, @$AR0 - 0b53 005f loop $AC1.M - 0b54 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - - 0b55 1b7e srri @$AR3, $AC0.M - 0b56 1b7a srri @$AR3, $AX0.H - 0b57 0080 03e8 lri $AR0, #0x03e8 - 0b59 0501 addis $ACC1, #0x01 - 0b5a 1d1f mrr $WR0, $AC1.M - // 0b5b 1150 0b63 bloopi #0x50, 0x0b63 - for (int i = 0; i < 0x50; i++) { - 0b5d 1c61 mrr $AR3, $AR1 - 0b5e 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0b5f 005f loop $AC1.M - 0b60 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0b61 f200 madd $AX0.L, $AX0.H - 0b62 fe00 movpz $ACC0 - 0b63 1b3e srri @$AR1, $AC0.M - } - 0b64 0088 ffff lri $WR0, #0xffff - 0b66 8b00 m0 - 0b67 02df ret -} - -// Looks like a 4-tap FIR filter. -// Hardcoded buffer length = 0x50 -// Uses 0x03e8 as some scratch space, i think . -void 0b68_4TapFIR(InBuffer($AR2), FilterBuffer($AR0), OutBuffer($AR1)) { - 0b68 0083 03e8 lri $AR3, #0x03e8 - 0b6a 191e lrri $AC0.M, @$AR0 - 0b6b 191a lrri $AX0.H, @$AR0 - 0b6c 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0b6d 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0b6e 1b7e srri @$AR3, $AC0.M - 0b6f 1b7a srri @$AR3, $AX0.H - 0b70 0080 03e8 lri $AR0, #0x03e8 - 0b72 0088 0003 lri $WR0, #0x0003 // That's a short wrap - filter coefs? - 0b74 0085 0000 lri $IX1, #0x0000 - 0b76 0087 0000 lri $IX3, #0x0000 - 0b78 1fc2 mrr $AC0.M, $AR2 - 0b79 195b lrri $AX1.H, @$AR2 - 0b7a 1959 lrri $AX1.L, @$AR2 - 0b7b 195f lrri $AC1.M, @$AR2 - 0b7c 195a lrri $AX0.H, @$AR2 - 0b7d 1c5e mrr $AR2, $AC0.M - 0b7e 1fda mrr $AC0.M, $AX0.H - 0b7f 1c61 mrr $AR3, $AR1 - 0b80 8a00 m2 - 0b81 8f00 set40 - 0b82 191a lrri $AX0.H, @$AR0 - 0b83 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0b84 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0b85 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0b86 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0b87 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0b88 1127 0b93 bloopi #0x27, 0x0b93 - for (int i = 0; i < 0x27; i++) { - 0b8a e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M // end of first iteration - - 0b8b 197e lrri $AC0.M, @$AR3 - 0b8c e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0b8d eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0b8e bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0b8f e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M // e - - 0b90 197f lrri $AC1.M, @$AR3 // start of first iteration - 0b91 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0b92 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0b93 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - } - 0b94 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0b95 197e lrri $AC0.M, @$AR3 - 0b96 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0b97 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0b98 bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 0b99 1bff srrn @$AR3, $AC1.M - 0b9a 197f lrri $AC1.M, @$AR3 - 0b9b 8e00 set16 - 0b9c 8b00 m0 - 0b9d 0088 ffff lri $WR0, #0xffff - 0b9f 1b5b srri @$AR2, $AX1.H - 0ba0 1b59 srri @$AR2, $AX1.L - 0ba1 1b5f srri @$AR2, $AC1.M - 0ba2 1b5e srri @$AR2, $AC0.M - 0ba3 02df ret -} - -// Fixed length 0x50. -void 0ba4_UnknownFilter(params($AR0), buffer($AR1), filter_state($AR2)) { - 0ba4 0083 03e8 lri $AR3, #0x03e8 - - // Load 4 parameters from *$AR0, copy them into the tiny ring buffer - // later handled by $AR0/$WR0 (filter state?) - 0ba6 191e lrri $AC0.M, @$AR0 - 0ba7 191a lrri $AX0.H, @$AR0 - 0ba8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0ba9 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0baa 1b7e srri @$AR3, $AC0.M - 0bab 1b7a srri @$AR3, $AX0.H - 0bac 0080 03e8 lri $AR0, #0x03e8 - 0bae 0088 0003 lri $WR0, #0x0003 // That's a short wrap - filter coefs? - 0bb0 0085 0000 lri $IX1, #0x0000 - 0bb2 0087 0000 lri $IX3, #0x0000 - - // Load more parameters from *$AR2 - 0bb4 1fc2 mrr $AC0.M, $AR2 - 0bb5 195b lrri $AX1.H, @$AR2 - 0bb6 1959 lrri $AX1.L, @$AR2 - 0bb7 195f lrri $AC1.M, @$AR2 - 0bb8 195a lrri $AX0.H, @$AR2 - - 0bb9 1c5e mrr $AR2, $AC0.M - 0bba 1fda mrr $AC0.M, $AX0.H - - // Setup AR3, now ready to read in data. - 0bbb 1c61 mrr $AR3, $AR1 - 0bbc 8a00 m2 - 0bbd 8f00 set40 - - // Start the pipeline - 0bbe 191a lrri $AX0.H, @$AR0 - 0bbf b800 mulx $AX0.H, $AX1.H - 0bc0 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0bc1 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0bc2 ea00 maddc $AC1.M, $AX1.L - 0bc3 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0bc4 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0bc5 ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0bc6 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - - 0bc7 1127 0bd8 bloopi #0x27, 0x0bd8 - // (half of 0x50) - 1, -1 due to the software pipelining. - for (int i = 0; i < 0x27; i++) { - 0bc9 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0bca e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - - 0bcb 197e lrri $AC0.M, @$AR3 - 0bcc e800 maddc $AC0.M, $AX1.L - 0bcd e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0bce ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0bcf eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0bd0 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0bd1 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0bd2 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - - 0bd3 197f lrri $AC1.M, @$AR3 - 0bd4 ea00 maddc $AC1.M, $AX1.L - 0bd5 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0bd6 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0bd7 ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0bd8 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - } - 0bd9 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0bda e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - - 0bdb 197e lrri $AC0.M, @$AR3 - 0bdc e800 maddc $AC0.M, $AX1.L - 0bdd e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0bde ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0bdf eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0be0 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0be1 1bff srrn @$AR3, $AC1.M - - 0be2 197f lrri $AC1.M, @$AR3 - 0be3 8e00 set16 - 0be4 8b00 m0 - 0be5 0088 ffff lri $WR0, #0xffff - 0be7 1b5b srri @$AR2, $AX1.H - 0be8 1b59 srri @$AR2, $AX1.L - 0be9 1b5f srri @$AR2, $AC1.M - 0bea 1b5e srri @$AR2, $AC0.M - // 0beb 02df ret -} - -void 0bec_Unk() { - // 0bec 0eff lris $AC0.M, #0xff - // 0bed 00fe 03f2 sr @0x03f2, $AC0.M - *0x03f2 = 0xFF - - // 0bef 8100 clr $ACC0 - // 0bf0 00fe 03f0 sr @0x03f0, $AC0.M - // 0bf2 00fe 03f6 sr @0x03f6, $AC0.M - *0x03f0 = 0x00 - *0x03f6 = 0x00 - - // 0bf4 009e 0100 lri $AC0.M, #0x0100 - // 0bf6 00fe 03f7 sr @0x03f7, $AC0.M - *0x03f7 = 0x100 - - 0bf8 00da 03f7 lr $AX0.H, @0x03f7 - 0bfa 009e 8000 lri $AC0.M, #0x8000 - 0bfc 5400 subr $ACC0, $AX0.H - 0bfd 00fe 03f5 sr @0x03f5, $AC0.M - - // 0bff 0e30 lris $AC0.M, #0x30 - // 0c00 00fe 03f3 sr @0x03f3, $AC0.M - *0x03f3 = 0x0030 - - // 0c02 0e10 lris $AC0.M, #0x10 - // 0c03 00fe 03f4 sr @0x03f4, $AC0.M - *0x03f5 = 0x0010 - - // 0c05 009e 0096 lri $AC0.M, #0x0096 - // 0c07 00fe 03f1 sr @0x03f1, $AC0.M - *0x03f1 = 0x0096 - - // 0c09 02df ret -} - -void 0c0a_Unk() { - // 0c0a 0080 0a00 lri $AR0, #0x0a00 - // 0c0c 8100 clr $ACC0 - // 0c0d 00de 03f0 lr $AC0.M, @0x03f0 - // 0c0f 8900 clr $ACC1 - // 0c10 b100 tst $ACC0 - - // 0c11 0275 ifz - // 0c12 0550 addis $ACC1, #0x50 - $AC0.M = *(0x03f0); - if (*(0x03f0) == 0) { - $ACC1 = 0x50 << 16; - } - // 0c13 00ff 03f0 sr @0x03f0, $AC1.M - *(0x03f0) = $ACC1; - - // 0c15 0200 0a60 addi $AC0.M, #0x0a60 - // 0c17 1c7e mrr $AR3, $AC0.M - // 0c18 0f4e lris $AC1.M, #0x4e - - $AC0.M += 0xa60; - $AR3 = $AC0.M - $AC1.M = 0x4e; - - // 0c19 02bf 00da call 0x00da - 00da_CopyBuffer(src=0x0a00, dst=$AC0.M, #0x4e) - - // 0c1b 02df ret -} - -// The control flow of this thing is NOT easy ... -// Reads from buffer at 0x0a60 -// Writes to buffer at 0x0a00 -void 0c1c_ComputeReverbFrom0a60To0a00() -{ - // 0c1c 00de 03f1 lr $AC0.M, @0x03f1 - // 0c1e 0200 0a60 addi $AC0.M, #0x0a60 - // 0c20 1c7e mrr $AR3, $AC0.M - $AR3 = 0x0a60 + *(0x03f1); - - 0c21 8100 clr $ACC0 - 0c22 8900 clr $ACC1 - 0c23 009f 00a0 lri $AC1.M, #0x00a0 - 0c25 00de 03f1 lr $AC0.M, @0x03f1 - 0c27 5d00 sub $ACC1, $ACC0 - 0c28 0e50 lris $AC0.M, #0x50 - 0c29 0750 cmpis $ACC1, #0x50 - 0c2a 0270 ifge - 0c2b 5d00 sub $ACC1, $ACC0 - 0c2c 00da 03f2 lr $AX0.H, @0x03f2 - 0c2e 8600 tstaxh $AX0.H - 0c2f 0290 0c4d jge 0x0c4d - 0c31 00de 03f3 lr $AC0.M, @0x03f3 - 0c33 5c00 sub $ACC0, $ACC1 - 0c34 0293 0c38 jle 0x0c38 - 0c36 029f 0c52 jmp 0x0c52 // done: - - 0c38 00db 03f7 lr $AX1.H, @0x03f7 - 0c3a 009e 8000 lri $AC0.M, #0x8000 - 0c3c 4600 addr $ACC0, $AX1.H - 0c3d 029f 0c44 jmp 0x0c44 - - 0c3f 00db 03f7 lr $AX1.H, @0x03f7 - 0c41 009e 8000 lri $AC0.M, #0x8000 - 0c43 5600 subr $ACC0, $AX1.H - - 0c44 00fe 03f5 sr @0x03f5, $AC0.M - 0c46 1fda mrr $AC0.M, $AX0.H - 0c47 7c00 neg $ACC0 - 0c48 1f5e mrr $AX0.H, $AC0.M - 0c49 00fe 03f2 sr @0x03f2, $AC0.M - 0c4b 029f 0c52 jmp 0x0c52 // done: - - 0c4d 00de 03f4 lr $AC0.M, @0x03f4 - 0c4f 5d00 sub $ACC1, $ACC0 - 0c50 0293 0c3f jle 0x0c3f - -done: - 0c52 8900 clr $ACC1 - 0c53 00dd 03f5 lr $AC1.L, @0x03f5 - 0c55 1501 lsl $ACC1, #1 - 0c56 8100 clr $ACC0 - 0c57 00dc 03f6 lr $AC0.L, @0x03f6 - 0c59 008b 009f lri $WR3, #0x009f // 0xa0 wrap - 0c5b 0080 0a00 lri $AR0, #0x0a00 - 0c5d 0900 lris $AX1.L, #0x00 - - // This is the loop that used to go crazy in the LLE emulation - // before we fixed addarn to obey the wrapping register. - - // Feels like some crazy delay function with a slowly drifting delay time. - - // Could this be part of a reverb? Or just a flanger? - - // 0c5e 1150 0c65 bloopi #0x50, 0x0c65 - for (int i = 0; i < 0x50; i++) { - 0c60 1878 lrr $AX0.L, @$AR3 - 0c61 4c00 add $ACC0, $ACC1 - 0c62 1cfe mrr $IX3, $AC0.M - 0c63 001f addarn $AR3, $IX3 - 0c64 1fd9 mrr $AC0.M, $AX1.L - 0c65 1b18 srri @$AR0, $AX0.L - - $AX0.L = *AR3; - $ACC0 += $ACC1; - $IX3 = $AC0.M; - $AR3 += $IX3; - $AC0.M = $AX1.L; - *(AR0++) = $AX0.L; - } - - 0c66 009f 0a60 lri $AC1.M, #0x0a60 - 0c68 1fc3 mrr $AC0.M, $AR3 - 0c69 5c00 sub $ACC0, $ACC1 - 0c6a 00fe 03f1 sr @0x03f1, $AC0.M - 0c6c 00fc 03f6 sr @0x03f6, $AC0.L - 0c6e 008b ffff lri $WR3, #0xffff // restore wrap - // 0c70 02df ret -} - - -void 0c71_AddBufferA00ToD60AndD00() -{ - // 0c71 0f50 lris $AC1.M, #0x50 - // 0c72 0080 0a00 lri $AR0, #0x0a00 - // 0c74 0083 0d60 lri $AR3, #0x0d60 - // 0c76 0098 3fff lri $AX0.L, #0x3fff - // 0c78 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(0x0a00, 0x0d60, 0x50, 0x3fff) - - // 0c7a 0f50 lris $AC1.M, #0x50 - // 0c7b 0080 0a00 lri $AR0, #0x0a00 - // 0c7d 0083 0d00 lri $AR3, #0x0d00 - // 0c7f 0098 3fff lri $AX0.L, #0x3fff - // 0c81 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(0x0a00, 0x0d00, 0x50, 0x3fff) - - // 0c83 02df ret -} - -void 0c84_FilterBufferInPlace(_sampleAddr($AR0), multiplier($AX0.H)) -{ - // 0c84 8a00 m2 - // 0c85 8f00 set40 - // 0c86 8100 clr $ACC0 - // 0c87 00de 0404 lr $AC0.M, @0x0404 - // 0c89 b100 tst $ACC0 - // 0c8a 0295 0c91 jz 0x0c91 - if (*(0x0404)) { - // 0c8c 8100 clr $ACC0 - // 0c8d 00fe 0478 sr @0x0478, $AC0.M - // 0c8f 00fe 0479 sr @0x0479, $AC0.M - *0x0478 = 0; - *0x0479 = 0; - } - // 0c91 00df 0479 lr $AC1.M, @0x0479 - // 0c93 00db 0478 lr $AX1.H, @0x0478 - // 0c95 0900 lris $AX1.L, #0x00 - // 0c96 0084 0000 lri $IX0, #0x0000 - // 0c98 1150 0ca1 bloopi #0x50, 0x0ca1 - $AC1.M = *0x0479; - $AX1.H = *0x0478; - - // ACC1 always contains the value from the previous iteration. - for (int i = 0; i < 0x50; i++) { - // 0c9a 199e lrrn $AC0.M, @$AR0 - // 0c9b 5c7c sub'ln $ACC0, $ACC1 : $AC1.M, @$AR0 - // 0c9c c000 mulc $AC0.M, $AX0.H // Where does AX0.H get set? - // 0c9d 6e00 movp $ACC0 - // 0c9e 1488 asl $ACC0, #8 - // 0c9f 4a00 addax $ACC0, $AX1 - // 0ca0 1b1e srri @$AR0, $AC0.M - // 0ca1 1f7e mrr $AX1.H, $AC0.M - *$AC0.M = *$AR0; - $ACC0 -= $ACC1; - ( $AC1.M = *AR0; ) - $ACC0 = ($AC0.M * $AX0.H * 2 << 8) + ($AX1.L); - *($AR0++) = $AC0.M; - $AX1.H = $AC0.M; - - // Write back - 0ca2 00fb 0478 sr @0x0478, $AX1.H - 0ca4 00ff 0479 sr @0x0479, $AC1.M - - // 0ca6 8b00 m0 - // 0ca7 8e00 set16 - // 0ca8 02df ret -} - -// Called from both volume handlers. -// ACC1 is volume, AX is volume delta. -void 0ca9_RampedMultiplyAddBuffer(Volume($ACC1), Delta($AX0), InBuffer($AR0), Buffer($AR3)) { - // 0ca9 b900 tst $ACC1 - // 0caa 0294 0caf jnz 0x0caf - if (!ACC1) { - // 0cac 6800 movax $ACC0, $AX0.L - // 0cad b100 tst $ACC0 - // 0cae 02d5 retz - if (!AX0.L) - // If incoming volume is zero and ramp delta is zero, - // not really much point to do anything. - return - } - 0caf 1c23 mrr $AR1, $AR3 - 0cb0 197e lrri $AC0.M, @$AR3 - - // This is another heavily software pipelined loop, so it's very confusing. - // See the docs for mulc and mulcac if you want to have any hope of understanding it. - // - // Produce the first result, so it's ready in the prod register. - 0cb1 191b lrri $AX1.H, @$AR0 - 0cb2 d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - - // 0cb3 1120 0cb9 bloopi #0x20, 0x0cb9 - for (int i = 0; i < 0x20; i++) { - 0cb5 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0cb6 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - - 0cb7 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0cb8 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M // Store 1 - - // Walk the ramp. Somewhat odd that it's done only every 2 samples. - 0cb9 4900 addax $ACC1, $AX0 - } - - // 0cba 1108 0cbf bloopi #0x08, 0x0cbf - for (int i = 0; i < 0x8; i++) { - 0cbc dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0cbd 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - - 0cbe dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0cbf 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - } - - // NOTE - The above two loops are very similar and the sum of their lengths is - // 0x28 - which is half of 0x50. And each does two loads and two stores, so together - // it's 50. Just strange that the addax is missing in the second loop. - - // It looks like we're dealing with crappy volume ramping - the delta is computed using - // (vol2 - vol1) >> 5! That's why it can only ramp the volume the first 64 (0x20 * 2) samples! - - 0cc0 02df ret -} - - -// What a strange filter .. ORR? -void 0cc1_StrangeORRFilter(_pBuffer(AR3)) -{ - 0cc1 8f00 set40 - 0cc2 8d00 set15 // X multiplications unsigned - 0cc3 1c03 mrr $AR0, $AR3 - 0cc4 00d9 038e lr $AX1.L, @0x038e - 0cc6 0b04 lris $AX1.H, #0x04 - - // pipeline starts here. - 0cc7 197a lrri $AX0.H, @$AR3 - 0cc8 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3 - 0cc9 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0cca 1128 0ccf bloopi #0x28, 0x0ccf - 0ccc 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0ccd b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0cce 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0ccf b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0cd0 8c00 clr15 - 0cd1 8e00 set16 - - // 0cd2 02df ret -} - - -// called from sync frame if (*0x042c != 0) -// That is, if volume mode != 0. -// It first seems to compute a lot of parameters and store them at 0x0b00 forwards. -// Then it uses those as input for the usual (ramped?) mixes. -void 0cd3_VolumeMixer1() -{ - // 0cd3 00da 0485 lr $AX0.H, @0x0485 - // 0cd5 8600 tstaxh $AX0.H - // 0cd6 0295 0ce5 jz 0x0ce5 - if (*0x0485 != 0) { - // 0cd8 8100 clr $ACC0 - // 0cd9 00de 042a lr $AC0.M, @0x042a - // 0cdb 147f lsr $ACC0, #-1 - // 0cdc 00fe 042b sr @0x042b, $AC0.M - *(0x042b) = *(0x042a) >> 1; - - // 0cde b100 tst $ACC0 - // 0cdf 0294 0ce5 jnz 0x0ce5 - if (*0x042b == 0) { - // 0ce1 009a 0001 lri $AX0.H, #0x0001 - // 0ce3 00fa 0401 sr @0x0401, $AX0.H - *(0x0401) = 1; // KeyOff - } - } - - // 0ce5 8f00 set40 - // 0ce6 8100 clr $ACC0 - // 0ce7 00de 0428 lr $AC0.M, @0x0428 - // 0ce9 1478 lsr $ACC0, #-8 - (ACC0 = *(0x0428) << 8); - - // 0cea 00df 0428 lr $AC1.M, @0x0428 - // 0cec 0340 007f andi $AC1.M, #0x007f - // 0cee 1f1e mrr $AX0.L, $AC0.M - // 0cef 1f5f mrr $AX0.H, $AC1.M - // 0cf0 0220 007f xori $ACC0, #0x007f - // 0cf2 1f3e mrr $AX1.L, $AC0.M - // 0cf3 0320 007f xori $ACC1, #0x007f - // 0cf5 1f7f mrr $AX1.H, $AC1.M - AX0.L = *(0x0428) >> 8; - AX0.H = *(0x0428) & 0x7F; - AX1.L = AX0.L ^ 0x7f; - AX1.H = AX1.H ^ 0x7f; - - // 0cf6 8100 clr $ACC0 - // 0cf7 8900 clr $ACC1 - // 0cf8 009f 0200 lri $AC1.M, #0x0200 - - // 0cfa 1fd8 mrr $AC0.M, $AX0.L - // 0cfb 4c00 add $ACC0, $ACC1 # broken disasm? this doesn't make much sense. - // 0cfc 1c1e mrr $AR0, $AC0.M - // 0cfd 1818 lrr $AX0.L, @$AR0 - AR0 = AX0.L + 0x0200; - AX0.L = *AR0; - - // 0cfe 1fda mrr $AC0.M, $AX0.H - // 0cff 4c00 add $ACC0, $ACC1 - // 0d00 1c1e mrr $AR0, $AC0.M - // 0d01 181a lrr $AX0.H, @$AR0 - AR0 = AX0.H + 0x200; - AX0.H = *AR0; - - // 0d02 1fd9 mrr $AC0.M, $AX1.L - // 0d03 4c00 add $ACC0, $ACC1 - // 0d04 1c1e mrr $AR0, $AC0.M - // 0d05 1819 lrr $AX1.L, @$AR0 - AR0 = AX1.L + 0x200; - AX1.L = *AR0 - - // 0d06 1fdb mrr $AC0.M, $AX1.H - // 0d07 4c00 add $ACC0, $ACC1 - // 0d08 1c1e mrr $AR0, $AC0.M - // 0d09 181b lrr $AX1.H, @$AR0 - AR0 = AX1.H + 0x200; - AX1.H = *AR0; - - // 0d0a 0080 0b00 lri $AR0, #0x0b00 - // 0d0c 9800 mul $AX1.L, $AX1.H - // 0d0d ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - // 0d0e b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - // 0d0f 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M - // 0d10 6e30 movp's $ACC0 : @$AR0, $AC0.M - // 0d11 1b1e srri @$AR0, $AC0.M - - // The above is heavily "sw-pipelined" but I think it turns into: - $AR0 = 0x0b00; - *$AR0++ = AX1.L * AX1.H; - *$AR0++ = AX0.L * AX1.H; - *$AR0++ = AX0.H * AX1.L; - *$AR0++ = AX0.L * AX0.H; - - // 0d12 0080 0b00 lri $AR0, #0x0b00 - // 0d14 0081 0b04 lri $AR1, #0x0b04 - // 0d16 00da 042a lr $AX0.H, @0x042a - // 0d18 02bf 0d62 call 0x0d62 // some tricky multiplication - 0d62_Mul4ByAX0H(0x0b00, 0x0b04, *(0x042a)); - - // 0d1a 0081 0b08 lri $AR1, #0x0b08 - // 0d1c 0080 0b04 lri $AR0, #0x0b04 - // 0d1e 00da 042a lr $AX0.H, @0x042a // interesting - // 0d20 00de 0429 lr $AC0.M, @0x0429 // interesting - // 0d22 c000 mulc $AC0.M, $AX0.H - // 0d23 6e00 movp $ACC0 - // 0d24 1481 asl $ACC0, #1 - // 0d25 1f5e mrr $AX0.H, $AC0.M - - 0d62_Mul4ByAX0H(0x0b00, 0x0b04, (*(0x042a) * *(0x0429) << 1) >> 16); - // 0d26 02bf 0d62 call 0x0d62 // some tricky multiplication - - // 0d28 0080 0b00 lri $AR0, #0x0b00 - // 0d2a 0081 0b0c lri $AR1, #0x0b0c - // 0d2c 8100 clr $ACC0 - // 0d2d 8900 clr $ACC1 - // 0d2e 00de 042b lr $AC0.M, @0x042b // interesting - // 0d30 00df 042a lr $AC1.M, @0x042a // interesting - // 0d32 00fe 042a sr @0x042a, $AC0.M - *(0x042a) = *(0x042b); - - // 0d34 5c00 sub $ACC0, $ACC1 - // 0d35 1f5e mrr $AX0.H, $AC0.M - // 0d36 02bf 0d6b call 0x0d6b // some other tricky multiplication - 0d6b_Mul4ByAC0M_Unsigned(0xb00, 0x0b0c, $AC0.M(*(0x042a) - *(0x042b))) // does not touch AX0.H - - // 0d38 0080 0b0c lri $AR0, #0x0b0c - // 0d3a 0081 0b10 lri $AR1, #0x0b10 - // 0d3c 00da 0429 lr $AX0.H, @0x0429 // interesting - 0d3e 02bf 0d62 call 0x0d62 // some tricky multiplication - 0d62_Mul4ByAX0H(0x0b0c, 0x0b10, *(0x0429)); - - // 0d40 0081 0b04 lri $AR1, #0x0b04 - // 0d42 0082 0b0c lri $AR2, #0x0b0c - // 0d44 0083 0d77 lri $AR3, #0x0d77 - - // So basically the below loop is: - // For i in 0 to 8: - // Call 0ca9_RampedMultiplyAddBuffer($AR0 = *0x038f, $AR3=0x0d77[i], AX0=0xb0c[i]<<11, AC1.M=0x0b04[i]) - - // 0d46 1108 0d5f bloopi #0x08, 0x0d5f - for (int i = 0; i < 8; i++) { - // 0d48 195f lrri $AC1.M, @$AR2 - // 0d49 15fb asr $ACC1, #-5 - // 0d4a 1f1d mrr $AX0.L, $AC1.L - // 0d4b 1f5f mrr $AX0.H, $AC1.M - // Compute volume delta - AX0 = *AR2++ << 11; - - // 0d4c 193f lrri $AC1.M, @$AR1 - AC1.M = *AR1++; - - // 0d4d 00e1 0b24 sr @0x0b24, $AR1 - // 0d4f 00e2 0b25 sr @0x0b25, $AR2 - // 0d51 021b ilrri $AC0.M, @$AR3 // Buffer address table lookup (see below) - // 0d52 00e3 0b26 sr @0x0b26, $AR3 - (Stash AR1, AR2, AR3) - // 0d54 1c7e mrr $AR3, $AC0.M - // 0d55 00c0 038f lr $AR0, @0x038f - // 0d57 02bf 0ca9 call 0x0ca9 - 0ca9_RampedMultiplyAddBuffer(Volume($ACC1), Delta($AX0), InBuffer($AR0), Buffer($AR3)) - - // 0d59 00c1 0b24 lr $AR1, @0x0b24 - // 0d5b 00c2 0b25 lr $AR2, @0x0b25 - // 0d5d 00c3 0b26 lr $AR3, @0x0b26 - (Restore AR1, AR2, AR3) - 0d5f 0000 nop - } - - // 0d60 8e00 set16 - // 0d61 02df ret -} - -void 0d62_Mul4ByAX0H(in_buffer($AR0), out_buffer($AR1), multiplicand($AX0.H)) { - // 0d62 191f lrri $AC1.M, @$AR0 - // 0d63 d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0 - // 0d64 d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0 - // 0d65 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - // 0d66 191f lrri $AC1.M, @$AR0 - // 0d67 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - // 0d68 6e31 movp's $ACC0 : @$AR1, $AC0.M - // 0d69 1b3e srri @$AR1, $AC0.M - // 0d6a 02df ret - // The above is a crazy sw-pipelined way to write: - for (int i = 0; i < 4; i++) { - out_buffer[i] = (s16)in_buffer[i] * (s16)multiplicand >> 16; - } -} - -void 0d6b_Mul4ByAC0M_Unsigned(in_buffer($AR0), out_buffer($AR1), multiplicand($AX1.H)) { - // 0d6b 8d00 set15 - // 0d6c 1f7e mrr $AX1.H, $AC0.M - // 0d6d 1918 lrri $AX0.L, @$AR0 - // 0d6e a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0 - // 0d6f ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0 - // 0d70 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - // 0d71 1918 lrri $AX0.L, @$AR0 - // 0d72 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - // 0d73 6e31 movp's $ACC0 : @$AR1, $AC0.M - // 0d74 1b3e srri @$AR1, $AC0.M - // 0d75 8c00 clr15 - // 0d76 02df ret - // The above is a crazy sw-pipelined way to write: - for (int i = 0; i < 4; i++) { - out_buffer[i] = in_buffer[i] * multiplicand >> 16; //(unsigned multiplication) - } -} - -// table for 0cd3_Unk -// This is a bunch of buffer addresses! -short table = {0x0d00, 0x0d60, 0x0f40, 0x0ca0, 0x0e80, 0x0ee0, 0x0c00, 0x0c50}; - -0d77 0d00 -0d78 0d60 -0d79 0f40 -0d7a 0ca0 -0d7b 0e80 -0d7c 0ee0 -0d7d 0c00 -0d7e 0c50 - -void 0d7f_ResampleAudioData(_src($AR0), _dest($AR1), param(AX1.L) = 0, _option??) -{ - 0d7f 00f9 0361 sr @0x0361, $AX1.L // always 0 - - // 0d81 1fc0 mrr $AC0.M, $AR0 - // 0d82 0200 fffc addi $AC0.M, #0xfffc - // 0d84 1c1e mrr $AR0, $AC0.M - // 0d85 1c5e mrr $AR2, $AC0.M - - // We read a little bit BEFORE the input. The next piece of code takes care of that... - $AR0 = $AR0 - 4; - $AR2 = $AR0; - - // 0x043c to 0x043f is storage for old sample data. - 0d86 0083 043c lri $AR3, #0x043c - - // Pipelined tiny memcpy - first four are loads, last four are stores. middle two overlap. - // 0d88 197e lrri $AC0.M, @$AR3 - // 0d89 197f lrri $AC1.M, @$AR3 - // 0d8a 80a2 nx'sl : $AC0.M, $AX0.H - // 0d8b 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - // 0d8c 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - // 0d8d 1b1f srri @$AR0, $AC1.M - for (int i = 0; i < 4; i++) - *($AR0++) = *($AR3++); - - // Point $AR0 back at 4 words before the start of the in buffer. - // 0d8e 1c02 mrr $AR0, $AR2 - - 0d8f 8100 clr $ACC0 - // 0d90 00de 0402 lr $AC0.M, @0x0402 // Ratio int - // 0d92 00fe 0362 sr @0x0362, $AC0.M - // 0d94 1474 lsr $ACC0, #-12 - // 0d95 1f7e mrr $AX1.H, $AC0.M - // 0d96 1f3c mrr $AX1.L, $AC0.L - *0x0362 = PB.Ratio; - $AX1 = PB.Ratio << 4; - - 0d97 8900 clr $ACC1 - 0d98 00dd 0430 lr $AC1.L, @0x0430 // Sample position frac - 0d9a 1504 lsl $ACC1, #4 - - // $ACC0 here still contains ratio << 12; - 0d9b 0604 cmpis $ACC0, #0x04 - // 0d9c 0290 0df3 jge 0x0df3 // subroutine - - // If ratio too low, don't bother resampling? - GOTONS JustCopyWithoutResampling; - - 0d9e 1fdd mrr $AC0.M, $AC1.L - 0d9f 0082 02b0 lri $AR2, #0x02b0 - - // Store a ramp at 0x2b0? Lookup table for read addresses? - 0da1 1050 loopi #0x50 - 0da2 4b2a addax's $ACC1, $AX1 : @$AR2, $AC1.L - - 0da3 1fbe mrr $AC1.L, $AC0.M - 0da4 00fe 0360 sr @0x0360, $AC0.M - 0da6 8900 clr $ACC1 - 0da7 1fbe mrr $AC1.L, $AC0.M - - 0da8 0af8 lris $AX0.H, #0xf8 - 0da9 009b 00fc lri $AX1.H, #0x00fc - 0dab 00d8 0361 lr $AX0.L, @0x0361 // parameter was stashed here. - - // 0x02b0 is where the ramp from above is stored. - 0dad 0082 02b0 lri $AR2, #0x02b0 - 0daf 0083 02b0 lri $AR3, #0x02b0 - 0db1 195e lrri $AC0.M, @$AR2 - - // I really don't understand what the purpose of this loop is. - 0db2 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M - // 0db3 1128 0db8 bloopi #0x28, 0x0db8 - for (int i = 0; i < 0x50; i += 2) { - 0db5 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 - 0db6 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H - 0db7 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 - 0db8 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - } - - 0db9 8a00 m2 // All muls doubled. - - // 0x02b0 is where the ramp from above is stored. - 0dba 0082 02b0 lri $AR2, #0x02b0 - - 0dbc 00dd 0430 lr $AC1.L, @0x0430 - 0dbe 1504 lsl $ACC1, #4 - 0dbf 1fe0 mrr $AC1.M, $AR0 - 0dc0 8100 clr $ACC0 - 0dc1 00de 0362 lr $AC0.M, @0x0362 - 0dc3 1474 lsr $ACC0, #-12 - 0dc4 1f7e mrr $AX1.H, $AC0.M - 0dc5 1f3c mrr $AX1.L, $AC0.L - - // Resample with some nice filter of some sort, using unreadable - // pipelined DSP code... gah. - - 0dc6 8f00 set40 // Loaded ACx.M values extend to the entire ACC. Don't see any actual use though. - - // Yep, this pretty much confirms that 0x02b0 is precomputed read addresses. - 0dc7 1943 lrri $AR3, @$AR2 - 0dc8 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 - 0dc9 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0dca f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0dcb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0dcc f200 madd $AX0.L, $AX0.H - 0dcd fe00 movpz $ACC0 - 0dce 1c1f mrr $AR0, $AC1.M - 0dcf 1943 lrri $AR3, @$AR2 - 0dd0 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 - 0dd1 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - // 0dd2 114e 0dda bloopi #0x4e, 0x0dda - // Count the stores - 0x4e stores in the main loop, two more afterwards. - // Deeply pipelined. - for (int i = 0; i < 0x4e; i++) { - 0dd4 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0dd5 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0dd6 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0dd7 1c1f mrr $AR0, $AC1.M - 0dd8 1943 lrri $AR3, @$AR2 - 0dd9 4bc3 addax'ld $ACC1, $AX1 : $AX0.L, $AX1.L, @$AR3 - 0dda 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - } - 0ddb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ddc f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0ddd f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0dde fe00 movpz $ACC0 - 0ddf 1b3e srri @$AR1, $AC0.M - - // Things back to normal. - // 0de0 8b00 m0 - // 0de1 8e00 set16 - -back_from_JustCopyWithoutResampling: - 0de2 00fe 0433 sr @0x0433, $AC0.M - 0de4 1c1f mrr $AR0, $AC1.M - 0de5 150c lsl $ACC1, #12 - 0de6 0340 0fff andi $AC1.M, #0x0fff - 0de8 00ff 0430 sr @0x0430, $AC1.M - - // Store the last 4 samples or something undecoded - // back into the PB. - 0dea 0083 043c lri $AR3, #0x043c - 0dec 191e lrri $AC0.M, @$AR0 - 0ded 191f lrri $AC1.M, @$AR0 - 0dee 80a0 nx'ls : $AX0.H, $AC0.M - 0def 64a1 movr'ls $AC0.M, $AX0.H : $AX0.H, $AC1.M - 0df0 6533 movr's $AC1.M, $AX0.H : @$AR3, $AC0.M - 0df1 1b7f srri @$AR3, $AC1.M - // 0df2 02df ret - return; - -JustCopyWithoutResampling: - // 0df3 1fe0 mrr $AC1.M, $AR0 - // 0df4 1c1f mrr $AR0, $AC1.M // This instruction looks very pointless. - - // 0df5 1128 0dfc bloopi #0x28, 0x0dfc - // 0df7 4b70 addax'l $ACC1, $AX1 : $AC0.M, @$AR0 - // 0df8 1b3e srri @$AR1, $AC0.M - // 0df9 1c1f mrr $AR0, $AC1.M - // 0dfa 4b70 addax'l $ACC1, $AX1 : $AC0.M, @$AR0 - // 0dfb 1b3e srri @$AR1, $AC0.M - // 0dfc 1c1f mrr $AR0, $AC1.M - for (int i = 0; i < 0x50; i++) { - $ACC1 += $AX1; // This is to still advance the playback position. - $AC0.M = *($AR0++); - *($AR1++) = $AC0.M; - $AR0 = $AC1.M; // Undo the increment - } - - // Looks like $AR0 stays unchanged, while $AR1 gets incremented by 0x50. - 0dfd 029f 0de2 jmp 0x0de2 -} - - -// Small utility jumped to from SyncFrame. -// sets 50 shorts from 0x520 to zero. -void 0dff_Zero520_50() { - 0dff 0083 0520 lri $AR3, #0x0520 - 0e01 00de 0433 lr $AC0.M, @0x0433 - 0e03 1050 loopi #0x50 - 0e04 1b7e srri @$AR3, $AC0.M - // 0e05 029f 02d8 jmp 0x02d8 - GOTO ContinueWithBlock: // in SyncFrame -} - -// No-one calls this routine. -void 0e07_UnUsed() { - 0e07 1c20 mrr $AR1, $AR0 - 0e08 185f lrr $AC1.M, @$AR2 - 0e09 1f7f mrr $AX1.H, $AC1.M - 0e0a 193a lrri $AX0.H, @$AR1 - 0e0b 6400 movr $ACC0, $AX0.H - 0e0c 0078 0e11 bloop $AX0.L, 0x0e11 - 0e0e 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1 - 0e0f 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M - 0e10 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1 - 0e11 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M - 0e12 1a5b srr @$AR2, $AX1.H - // 0e13 02df ret -} - -void 0e14_DolbyInit() -{ - // Init parameters/coefficients for UnknownFilter - 0e14 0098 8240 lri $AX0.L, #0x8240 - 0e16 00f8 04e8 sr @0x04e8, $AX0.L - 0e18 0098 7fff lri $AX0.L, #0x7fff - 0e1a 00f8 04e9 sr @0x04e9, $AX0.L - 0e1c 0098 7dbf lri $AX0.L, #0x7dbf - 0e1e 00f8 04ea sr @0x04ea, $AX0.L - 0e20 0098 843f lri $AX0.L, #0x843f - 0e22 00f8 04eb sr @0x04eb, $AX0.L - 0e24 0098 b23b lri $AX0.L, #0xb23b - 0e26 00f8 04f0 sr @0x04f0, $AX0.L - 0e28 0098 7fff lri $AX0.L, #0x7fff - 0e2a 00f8 04f1 sr @0x04f1, $AX0.L - 0e2c 0098 4dc4 lri $AX0.L, #0x4dc4 - 0e2e 00f8 04f2 sr @0x04f2, $AX0.L - 0e30 0098 d808 lri $AX0.L, #0xd808 - 0e32 00f8 04f3 sr @0x04f3, $AX0.L - - // Zero the UnknownFilter states. - 0e34 0098 0000 lri $AX0.L, #0x0000 - 0e36 0080 04ec lri $AR0, #0x04ec - 0e38 1004 loopi #0x04 - 0e39 1b18 srri @$AR0, $AX0.L - 0e3a 0080 04f4 lri $AR0, #0x04f4 - 0e3c 1004 loopi #0x04 - 0e3d 1b18 srri @$AR0, $AX0.L - // 0e3e 02df ret -} - -// I'm going to guess that this is Dolby mixing. -void 0e3f_DolbyMixdown() -{ - 0e3f 0080 0f40 lri $AR0, #0x0f40 - 0e41 0083 0b00 lri $AR3, #0x0b00 - 0e43 8900 clr $ACC1 - 0e44 0f50 lris $AC1.M, #0x50 - 0e45 0098 6784 lri $AX0.L, #0x6784 - //0e47 02bf 00fa call 0x00fa // XorBuffer - 00fa_BufferMultiply(src($AR0), dst($AR3), count($AC1.M), $mult($AX0.L)) - - 0e49 0080 04e8 lri $AR0, #0x04e8 - 0e4b 0082 04ec lri $AR2, #0x04ec - 0e4d 0081 0b00 lri $AR1, #0x0b00 - 0e4f 02bf 0ba4 call 0x0ba4 // 0ba4_UnknownFilter - 0ba4_UnknownFilter(params($AR0), buffer($AR1), filter_state($AR2)) - - 0e51 8900 clr $ACC1 - 0e52 0f50 lris $AC1.M, #0x50 - 0e53 0080 0b00 lri $AR0, #0x0b00 - 0e55 0083 0d00 lri $AR3, #0x0d00 - 0e57 0098 7fff lri $AX0.L, #0x7fff - // 0e59 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - 0e5b 8900 clr $ACC1 - 0e5c 0f50 lris $AC1.M, #0x50 - 0e5d 0080 0b00 lri $AR0, #0x0b00 - 0e5f 0083 0d60 lri $AR3, #0x0d60 - 0e61 0098 b820 lri $AX0.L, #0xb820 - // 0e63 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - 0e65 0080 0ca0 lri $AR0, #0x0ca0 - 0e67 0083 0b00 lri $AR3, #0x0b00 - 0e69 8900 clr $ACC1 - 0e6a 0f50 lris $AC1.M, #0x50 - 0e6b 0098 6784 lri $AX0.L, #0x6784 - // 0e6d 02bf 00fa call 0x00fa // XorBuffer - 00fa_BufferMultiply(src($AR0), dst($AR3), count($AC1.M), $mult($AX0.L)) - - 0e6f 0080 04e8 lri $AR0, #0x04e8 - 0e71 0082 04f4 lri $AR2, #0x04f4 - 0e73 0081 0b00 lri $AR1, #0x0b00 - // 0e75 02bf 0ba4 call 0x0ba4 // 0ba4_UnknownFilter - 0ba4_UnknownFilter(params($AR0), buffer($AR1), filter_state($AR2)) - - 0e77 8900 clr $ACC1 - 0e78 0f50 lris $AC1.M, #0x50 - 0e79 0080 0b00 lri $AR0, #0x0b00 - 0e7b 0083 0d00 lri $AR3, #0x0d00 - 0e7d 0098 47e0 lri $AX0.L, #0x47e0 - // 0e7f 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - 0e81 8900 clr $ACC1 - 0e82 0f50 lris $AC1.M, #0x50 - 0e83 0080 0b00 lri $AR0, #0x0b00 - 0e85 0083 0d60 lri $AR3, #0x0d60 - 0e87 0098 8001 lri $AX0.L, #0x8001 - // 0e89 02bf 00eb call 0x00eb - 00eb_Unk_BufferMultAddToDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) - - // 0e8b 02df ret -} - - -void Nops() { - 0e8c 0000 nop - 0e8d 0000 nop - 0e8e 0000 nop - 0e8f 0000 nop -} diff --git a/docs/DSP/DSP_UC_Zelda_Wii.txt b/docs/DSP/DSP_UC_Zelda_Wii.txt deleted file mode 100644 index a70c3274ec..0000000000 --- a/docs/DSP/DSP_UC_Zelda_Wii.txt +++ /dev/null @@ -1,2850 +0,0 @@ - 0000 029f 0012 jmp 0x0012 - 0002 0000 nop - 0003 0000 nop - 0004 02ff rti - 0005 0000 nop - 0006 02ff rti - 0007 0000 nop - 0008 02ff rti - 0009 0000 nop - 000a 02ff rti - 000b 0000 nop - 000c 02ff rti - 000d 0000 nop - 000e 029f 0725 jmp 0x0725 - 0010 029f 0059 jmp 0x0059 - 0012 1205 sbclr #0x05 - 0013 02bf 0062 call 0x0062 - 0015 8100 clr $ACC0 - 0016 009f 1000 lri $AC1.M, #0x1000 - 0018 0080 0000 lri $AR0, #0x0000 - 001a 005f loop $AC1.M - 001b 1b1e srri @$AR0, $AC0.M - 001c 02bf 07f5 call 0x07f5 - 001e 02bf 0f44 call 0x0f44 - 0020 0e00 lris $AC0.M, #0x00 - 0021 02bf 07d7 call 0x07d7 - 0023 009e 1111 lri $AC0.M, #0x1111 -// SEND_f355(0x1111) - 0025 02bf 07e1 call 0x07e1 - 0027 0e00 lris $AC0.M, #0x00 - 0028 00fe 034e sr @0x034e, $AC0.M - 002a 1305 sbset #0x05 - 002b 3a00 orr $AC0.M, $AX1.H - 002c 7400 incm $AC0.M - 002d 1f7e mrr $AX1.H, $AC0.M - 002e 0240 00ff andi $AC0.M, #0x00ff - 0030 0200 5500 addi $AC0.M, #0x5500 - 0032 02bf 00a0 call 0x00a0 - 0034 029f 0832 jmp 0x0832 - 0036 00df 0357 lr $AC1.M, @0x0357 - 0038 00ff 0345 sr @0x0345, $AC1.M - 003a 00de 0356 lr $AC0.M, @0x0356 - 003c 1ffe mrr $AC1.M, $AC0.M - 003d 0340 00ff andi $AC1.M, #0x00ff - 003f 00ff 0344 sr @0x0344, $AC1.M - 0041 1479 lsr $ACC0, #-7 - 0042 0240 007e andi $AC0.M, #0x007e - 0044 00fe 0343 sr @0x0343, $AC0.M - 0046 0200 0080 addi $AC0.M, #0x0080 - 0048 1c1e mrr $AR0, $AC0.M - 0049 170f jmpr $AR0 - 004a 0092 00ff lri $CR, #0x00ff - 004c 009e cafe lri $AC0.M, #0xcafe - 004e 02bf 00a0 call 0x00a0 - 0050 0e04 lris $AC0.M, #0x04 - 0051 02bf 07d7 call 0x07d7 - 0053 00de 0356 lr $AC0.M, @0x0356 - 0055 02bf 07e1 call 0x07e1 - 0057 029f 002b jmp 0x002b - 0059 1205 sbclr #0x05 - 005a 02bf 0062 call 0x0062 - 005c 0e01 lris $AC0.M, #0x01 - 005d 02bf 07d7 call 0x07d7 - 005f 1305 sbset #0x05 - 0060 029f 002b jmp 0x002b - 0062 1202 sbclr #0x02 - 0063 1203 sbclr #0x03 - 0064 1204 sbclr #0x04 - 0065 1306 sbset #0x06 - 0066 8e00 set16 - 0067 8c00 clr15 - 0068 8b00 m0 - 0069 009e ffff lri $AC0.M, #0xffff - 006b 1d1e mrr $WR0, $AC0.M - 006c 1d3e mrr $WR1, $AC0.M - 006d 1d5e mrr $WR2, $AC0.M - 006e 1d7e mrr $WR3, $AC0.M - 006f 0092 00ff lri $CR, #0x00ff - 0071 02df ret - 0072 0081 0358 lri $AR1, #0x0358 - 0074 0090 0000 lri $AC0.H, #0x0000 - 0076 0c00 lris $AC0.L, #0x00 - 0077 007e 007c bloop $AC0.M, 0x007c - 0079 193e lrri $AC0.M, @$AR1 - 007a 1b1e srri @$AR0, $AC0.M - 007b 193e lrri $AC0.M, @$AR1 - 007c 1b1e srri @$AR0, $AC0.M - 007d 02df ret - 007e 029f 004a jmp 0x004a - 0080 029f 004a jmp 0x004a - 0082 029f 00d9 jmp 0x00d9 - 0084 029f 02e3 jmp 0x02e3 - 0086 029f 007e jmp 0x007e - 0088 029f 066e jmp 0x066e - 008a 029f 0680 jmp 0x0680 - 008c 029f 004a jmp 0x004a - 008e 029f 05b7 jmp 0x05b7 - 0090 029f 0603 jmp 0x0603 - 0092 029f 05e7 jmp 0x05e7 - 0094 029f 004a jmp 0x004a - 0096 029f 004a jmp 0x004a - 0098 029f 004a jmp 0x004a - 009a 029f 0103 jmp 0x0103 - 009c 029f 00f6 jmp 0x00f6 - 009e 029f 004a jmp 0x004a - 00a0 00fe 0b00 sr @0x0b00, $AC0.M - 00a2 8100 clr $ACC0 - 00a3 00de 0354 lr $AC0.M, @0x0354 - 00a5 1408 lsl $ACC0, #8 - 00a6 00df 0341 lr $AC1.M, @0x0341 - 00a8 3e00 cw 0x3e00 ; *** UNKNOWN OPCODE *** - 00a9 00fe 0b01 sr @0x0b01, $AC0.M - 00ab 00de 0350 lr $AC0.M, @0x0350 - 00ad 00fe 0b02 sr @0x0b02, $AC0.M - 00af 00de 0351 lr $AC0.M, @0x0351 - 00b1 00fe 0b03 sr @0x0b03, $AC0.M - 00b3 00de 0352 lr $AC0.M, @0x0352 - 00b5 00fe 0b04 sr @0x0b04, $AC0.M - 00b7 00de 037d lr $AC0.M, @0x037d - 00b9 00dc 037e lr $AC0.L, @0x037e - 00bb 009f 0b00 lri $AC1.M, #0x0b00 - 00bd 0080 0010 lri $AR0, #0x0010 - 00bf 0090 0001 lri $AC0.H, #0x0001 - 00c1 1c3f mrr $AR1, $AC1.M - 00c2 0f0a lris $AC1.M, #0x0a - 00c3 2fd1 srs @SampleFormat, $AC1.M - 00c4 1f5e mrr $AX0.H, $AC0.M - 00c5 1f1c mrr $AX0.L, $AC0.L - 00c6 009e ffff lri $AC0.M, #0xffff - 00c8 2ed6 srs @ACEAH, $AC0.M - 00c9 2ed7 srs @ACEAL, $AC0.M - 00ca 1fda mrr $AC0.M, $AX0.H - 00cb 1f98 mrr $AC0.L, $AX0.L - 00cc 147f lsr $ACC0, #-1 - 00cd 2ed8 srs @ACCAH, $AC0.M - 00ce 2cd9 srs @ACCAL, $AC0.L - 00cf 1f40 mrr $AX0.H, $AR0 - 00d0 007a 00d7 bloop $AX0.H, 0x00d7 - 00d2 193e lrri $AC0.M, @$AR1 - 00d3 2ed3 srs @UnkZelda, $AC0.M - 00d4 0000 nop - 00d5 0000 nop - 00d6 0000 nop - 00d7 0000 nop - 00d8 02df ret - 00d9 0080 0380 lri $AR0, #0x0380 - 00db 0e04 lris $AC0.M, #0x04 - 00dc 02bf 0072 call 0x0072 - 00de 0081 0382 lri $AR1, #0x0382 - 00e0 009f 0000 lri $AC1.M, #0x0000 - 00e2 0080 0280 lri $AR0, #0x0280 - 00e4 02bf 063e call 0x063e - 00e6 0081 0384 lri $AR1, #0x0384 - 00e8 009f 0300 lri $AC1.M, #0x0300 - 00ea 0080 0020 lri $AR0, #0x0020 - 00ec 02bf 063e call 0x063e - 00ee 00de 0345 lr $AC0.M, @0x0345 - 00f0 00fe 0342 sr @0x0342, $AC0.M - 00f2 02bf 0d3b call 0x0d3b - 00f4 029f 004a jmp 0x004a - 00f6 0080 037d lri $AR0, #0x037d - 00f8 0e01 lris $AC0.M, #0x01 - 00f9 02bf 0072 call 0x0072 - 00fb 00de 037d lr $AC0.M, @0x037d - 00fd 0240 7fff andi $AC0.M, #0x7fff - 00ff 00fe 037d sr @0x037d, $AC0.M - 0101 029f 004a jmp 0x004a - 0103 0080 0374 lri $AR0, #0x0374 - 0105 0e01 lris $AC0.M, #0x01 - 0106 00fe 0377 sr @0x0377, $AC0.M - 0108 00fe 037c sr @0x037c, $AC0.M - 010a 02bf 0072 call 0x0072 - 010c 00de 0345 lr $AC0.M, @0x0345 - 010e 00fe 0376 sr @0x0376, $AC0.M - 0110 029f 004a jmp 0x004a - 0112 0081 034c lri $AR1, #0x034c - 0114 009f 0400 lri $AC1.M, #0x0400 - 0116 0080 00c0 lri $AR0, #0x00c0 - 0118 02bf 063e call 0x063e - 011a 02df ret - 011b 0081 034c lri $AR1, #0x034c - 011d 009f 0400 lri $AC1.M, #0x0400 - 011f 0080 0080 lri $AR0, #0x0080 - 0121 0081 034c lri $AR1, #0x034c - 0123 193e lrri $AC0.M, @$AR1 - 0124 193c lrri $AC0.L, @$AR1 - 0125 0098 0000 lri $AX0.L, #0x0000 - 0127 7000 addaxl $ACC0, $AX0.L - 0128 02bf 064d call 0x064d - 012a 02df ret - 012b 191e lrri $AC0.M, @$AR0 - 012c 191a lrri $AX0.H, @$AR0 - 012d 005f loop $AC1.M - 012e 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 012f 1b7e srri @$AR3, $AC0.M - 0130 1b7a srri @$AR3, $AX0.H - 0131 02df ret - 0132 0000 nop - 0133 007f 0138 bloop $AC1.M, 0x0138 - 0135 191e lrri $AC0.M, @$AR0 - 0136 1b7e srri @$AR3, $AC0.M - 0137 191e lrri $AC0.M, @$AR0 - 0138 1b7e srri @$AR3, $AC0.M - 0139 0000 nop - 013a 02df ret - 013b 191e lrri $AC0.M, @$AR0 - 013c 191a lrri $AX0.H, @$AR0 - 013d 007f 0142 bloop $AC1.M, 0x0142 - 013f 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H - 0140 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M - 0141 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H - 0142 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0143 0000 nop - 0144 02df ret - 0145 8a00 m2 - 0146 157f lsr $ACC1, #-1 - 0147 1c20 mrr $AR1, $AR0 - 0148 1c03 mrr $AR0, $AR3 - 0149 193a lrri $AX0.H, @$AR1 - 014a 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 - 014b 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 - 014c 007f 0151 bloop $AC1.M, 0x0151 - 014e 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 014f 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 0150 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 - 0151 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H - 0152 8b00 m0 - 0153 02df ret - 0154 8a00 m2 - 0155 191a lrri $AX0.H, @$AR0 - 0156 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 - 0157 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0158 005f loop $AC1.M - 0159 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M - 015a 8b00 m0 - 015b 02df ret - 015c 8100 clr $ACC0 - 015d 8900 clr $ACC1 - 015e 0e50 lris $AC0.M, #0x50 - 015f 0080 0d00 lri $AR0, #0x0d00 - 0161 005e loop $AC0.M - 0162 1b1f srri @$AR0, $AC1.M - 0163 0080 0d60 lri $AR0, #0x0d60 - 0165 005e loop $AC0.M - 0166 1b1f srri @$AR0, $AC1.M - 0167 00da 0374 lr $AX0.H, @0x0374 - 0169 8600 tstaxh $AX0.H - 016a 02b5 0f6f callz 0x0f6f - 016c 8100 clr $ACC0 - 016d 8900 clr $ACC1 - 016e 0e50 lris $AC0.M, #0x50 - 016f 0080 0ca0 lri $AR0, #0x0ca0 - 0171 005e loop $AC0.M - 0172 1b1f srri @$AR0, $AC1.M - 0173 0080 0f40 lri $AR0, #0x0f40 - 0175 005e loop $AC0.M - 0176 1b1f srri @$AR0, $AC1.M - 0177 0080 0fa0 lri $AR0, #0x0fa0 - 0179 005e loop $AC0.M - 017a 1b1f srri @$AR0, $AC1.M - 017b 0080 0a00 lri $AR0, #0x0a00 - 017d 005e loop $AC0.M - 017e 1b1f srri @$AR0, $AC1.M - 017f 0080 09a0 lri $AR0, #0x09a0 - 0181 005e loop $AC0.M - 0182 1b1f srri @$AR0, $AC1.M - 0183 0f04 lris $AC1.M, #0x04 - 0184 0080 0e10 lri $AR0, #0x0e10 - 0186 0083 0dc0 lri $AR3, #0x0dc0 - 0188 02bf 0132 call 0x0132 - 018a 0080 0e70 lri $AR0, #0x0e70 - 018c 0083 0e20 lri $AR3, #0x0e20 - 018e 02bf 0132 call 0x0132 - 0190 0080 0ed0 lri $AR0, #0x0ed0 - 0192 0083 0e80 lri $AR3, #0x0e80 - 0194 02bf 0132 call 0x0132 - 0196 0080 0f30 lri $AR0, #0x0f30 - 0198 0083 0ee0 lri $AR3, #0x0ee0 - 019a 02bf 0132 call 0x0132 - 019c 8100 clr $ACC0 - 019d 0e50 lris $AC0.M, #0x50 - 019e 8900 clr $ACC1 - 019f 0080 0dc8 lri $AR0, #0x0dc8 - 01a1 005e loop $AC0.M - 01a2 1b1f srri @$AR0, $AC1.M - 01a3 0080 0e28 lri $AR0, #0x0e28 - 01a5 005e loop $AC0.M - 01a6 1b1f srri @$AR0, $AC1.M - 01a7 0080 0e88 lri $AR0, #0x0e88 - 01a9 005e loop $AC0.M - 01aa 1b1f srri @$AR0, $AC1.M - 01ab 0080 0ee8 lri $AR0, #0x0ee8 - 01ad 005e loop $AC0.M - 01ae 1b1f srri @$AR0, $AC1.M - 01af 02df ret - 01b0 009f 0580 lri $AC1.M, #0x0580 - 01b2 009b 00a0 lri $AX1.H, #0x00a0 - 01b4 0081 0393 lri $AR1, #0x0393 - 01b6 18bc lrrd $AC0.L, @$AR1 - 01b7 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 01b8 bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 01b9 0080 0050 lri $AR0, #0x0050 - 01bb 02bf 0640 call 0x0640 - 01bd 02df ret - 01be 00df 03a1 lr $AC1.M, @0x03a1 - 01c0 0508 addis $ACC1, #0x08 - 01c1 0080 0580 lri $AR0, #0x0580 - 01c3 1c7f mrr $AR3, $AC1.M - 01c4 0098 7fff lri $AX0.L, #0x7fff - 01c6 8900 clr $ACC1 - 01c7 0f50 lris $AC1.M, #0x50 - 01c8 02bf 0145 call 0x0145 - 01ca 02df ret - 01cb 00c0 03a0 lr $AR0, @0x03a0 - 01cd 191a lrri $AX0.H, @$AR0 - 01ce 02bf 01b0 call 0x01b0 - 01d0 02bf 01be call 0x01be - 01d2 8100 clr $ACC0 - 01d3 8900 clr $ACC1 - 01d4 00de 0390 lr $AC0.M, @0x0390 - 01d6 02a0 0001 andf $AC0.M, #0x0001 - 01d8 029d 01e1 jlz 0x01e1 - 01da 0080 0398 lri $AR0, #0x0398 - 01dc 0e08 lris $AC0.M, #0x08 - 01dd 00c1 03a1 lr $AR1, @0x03a1 - 01df 02bf 0c7d call 0x0c7d - 01e1 0f50 lris $AC1.M, #0x50 - 01e2 00c0 03a1 lr $AR0, @0x03a1 - 01e4 00da 0394 lr $AX0.H, @0x0394 - 01e6 8600 tstaxh $AX0.H - 01e7 0295 01ee jz 0x01ee - 01e9 1c7a mrr $AR3, $AX0.H - 01ea 00d8 0395 lr $AX0.L, @0x0395 - 01ec 02bf 0145 call 0x0145 - 01ee 0f50 lris $AC1.M, #0x50 - 01ef 00c0 03a1 lr $AR0, @0x03a1 - 01f1 00da 0396 lr $AX0.H, @0x0396 - 01f3 8600 tstaxh $AX0.H - 01f4 0295 01fb jz 0x01fb - 01f6 1c7a mrr $AR3, $AX0.H - 01f7 00d8 0397 lr $AX0.L, @0x0397 - 01f9 02bf 0145 call 0x0145 - 01fb 00de 0390 lr $AC0.M, @0x0390 - 01fd 02a0 0002 andf $AC0.M, #0x0002 - 01ff 02dd retlz - 0200 0080 0398 lri $AR0, #0x0398 - 0202 0e08 lris $AC0.M, #0x08 - 0203 00c1 03a1 lr $AR1, @0x03a1 - 0205 02bf 0c7d call 0x0c7d - 0207 02df ret - 0208 8900 clr $ACC1 - 0209 009f 0dc0 lri $AC1.M, #0x0dc0 - 020b 00ff 03a1 sr @0x03a1, $AC1.M - 020d 009f 03a8 lri $AC1.M, #0x03a8 - 020f 00ff 03a2 sr @0x03a2, $AC1.M - 0211 009f 03a4 lri $AC1.M, #0x03a4 - 0213 00ff 03a0 sr @0x03a0, $AC1.M - 0215 1104 0235 bloopi #0x04, 0x0235 - 0217 00c0 03a2 lr $AR0, @0x03a2 - 0219 0083 0390 lri $AR3, #0x0390 - 021b 8900 clr $ACC1 - 021c 0f08 lris $AC1.M, #0x08 - 021d 02bf 0132 call 0x0132 - 021f 00da 0390 lr $AX0.H, @0x0390 - 0221 8600 tstaxh $AX0.H - 0222 0295 0226 jz 0x0226 - 0224 02bf 01cb call 0x01cb - 0226 8100 clr $ACC0 - 0227 00de 03a2 lr $AC0.M, @0x03a2 - 0229 0410 addis $ACC0, #0x10 - 022a 00fe 03a2 sr @0x03a2, $AC0.M - 022c 00de 03a1 lr $AC0.M, @0x03a1 - 022e 0460 addis $ACC0, #0x60 - 022f 00fe 03a1 sr @0x03a1, $AC0.M - 0231 00de 03a0 lr $AC0.M, @0x03a0 - 0233 7400 incm $AC0.M - 0234 00fe 03a0 sr @0x03a0, $AC0.M - 0236 00da 0374 lr $AX0.H, @0x0374 - 0238 8600 tstaxh $AX0.H - 0239 0294 025f jnz 0x025f - 023b 0f50 lris $AC1.M, #0x50 - 023c 0080 0be0 lri $AR0, #0x0be0 - 023e 0083 0e80 lri $AR3, #0x0e80 - 0240 0098 7fff lri $AX0.L, #0x7fff - 0242 02bf 0145 call 0x0145 - 0244 0f50 lris $AC1.M, #0x50 - 0245 0080 0be0 lri $AR0, #0x0be0 - 0247 0083 0ee0 lri $AR3, #0x0ee0 - 0249 0098 b820 lri $AX0.L, #0xb820 - 024b 02bf 0145 call 0x0145 - 024d 0f28 lris $AC1.M, #0x28 - 024e 0080 0c68 lri $AR0, #0x0c68 - 0250 0083 0e80 lri $AR3, #0x0e80 - 0252 0098 b820 lri $AX0.L, #0xb820 - 0254 02bf 0145 call 0x0145 - 0256 0f28 lris $AC1.M, #0x28 - 0257 0080 0c68 lri $AR0, #0x0c68 - 0259 0083 0ee0 lri $AR3, #0x0ee0 - 025b 0098 7fff lri $AX0.L, #0x7fff - 025d 02bf 0145 call 0x0145 - 025f 8100 clr $ACC0 - 0260 8900 clr $ACC1 - 0261 0e50 lris $AC0.M, #0x50 - 0262 0080 0be0 lri $AR0, #0x0be0 - 0264 005e loop $AC0.M - 0265 1b1f srri @$AR0, $AC1.M - 0266 0080 0c40 lri $AR0, #0x0c40 - 0268 005e loop $AC0.M - 0269 1b1f srri @$AR0, $AC1.M - 026a 02df ret - 026b 00c0 03a0 lr $AR0, @0x03a0 - 026d 181a lrr $AX0.H, @$AR0 - 026e 8100 clr $ACC0 - 026f 181e lrr $AC0.M, @$AR0 - 0270 00db 0391 lr $AX1.H, @0x0391 - 0272 7400 incm $AC0.M - 0273 d100 cmpar $ACC1, $AX0.H - 0274 0270 ifge - 0275 8100 clr $ACC0 - 0276 1b1e srri @$AR0, $AC0.M - 0277 00df 03a1 lr $AC1.M, @0x03a1 - 0279 009b 00a0 lri $AX1.H, #0x00a0 - 027b 0081 0393 lri $AR1, #0x0393 - 027d 18bc lrrd $AC0.L, @$AR1 - 027e b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 - 027f bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 0280 0080 0050 lri $AR0, #0x0050 - 0282 02bf 064d call 0x064d - 0284 02df ret - 0285 00da 0374 lr $AX0.H, @0x0374 - 0287 8600 tstaxh $AX0.H - 0288 0294 029e jnz 0x029e - 028a 8900 clr $ACC1 - 028b 0f28 lris $AC1.M, #0x28 - 028c 0080 0c40 lri $AR0, #0x0c40 - 028e 0083 0ea8 lri $AR3, #0x0ea8 - 0290 0098 b820 lri $AX0.L, #0xb820 - 0292 02bf 0145 call 0x0145 - 0294 8900 clr $ACC1 - 0295 0f28 lris $AC1.M, #0x28 - 0296 0080 0c40 lri $AR0, #0x0c40 - 0298 0083 0f08 lri $AR3, #0x0f08 - 029a 0098 7fff lri $AX0.L, #0x7fff - 029c 02bf 0145 call 0x0145 - 029e 009f 0dc0 lri $AC1.M, #0x0dc0 - 02a0 00ff 03a1 sr @0x03a1, $AC1.M - 02a2 009f 03a8 lri $AC1.M, #0x03a8 - 02a4 00ff 03a2 sr @0x03a2, $AC1.M - 02a6 009f 03a4 lri $AC1.M, #0x03a4 - 02a8 00ff 03a0 sr @0x03a0, $AC1.M - 02aa 1104 02c8 bloopi #0x04, 0x02c8 - 02ac 00c0 03a2 lr $AR0, @0x03a2 - 02ae 0083 0390 lri $AR3, #0x0390 - 02b0 0f08 lris $AC1.M, #0x08 - 02b1 02bf 0132 call 0x0132 - 02b3 00da 0390 lr $AX0.H, @0x0390 - 02b5 8600 tstaxh $AX0.H - 02b6 0295 02ba jz 0x02ba - 02b8 02bf 026b call 0x026b - 02ba 00de 03a2 lr $AC0.M, @0x03a2 - 02bc 0410 addis $ACC0, #0x10 - 02bd 00fe 03a2 sr @0x03a2, $AC0.M - 02bf 00de 03a1 lr $AC0.M, @0x03a1 - 02c1 0460 addis $ACC0, #0x60 - 02c2 00fe 03a1 sr @0x03a1, $AC0.M - 02c4 00de 03a0 lr $AC0.M, @0x03a0 - 02c6 7400 incm $AC0.M - 02c7 00fe 03a0 sr @0x03a0, $AC0.M - 02c9 02df ret - 02ca 0081 0386 lri $AR1, #0x0386 - 02cc 009f 03a8 lri $AC1.M, #0x03a8 - 02ce 0080 0040 lri $AR0, #0x0040 - 02d0 02bf 063e call 0x063e - 02d2 02df ret - 02d3 191e lrri $AC0.M, @$AR0 - 02d4 189c lrrd $AC0.L, @$AR0 - 02d5 4800 addax $ACC0, $AX0.L - 02d6 1b1e srri @$AR0, $AC0.M - 02d7 1b1c srri @$AR0, $AC0.L - 02d8 02df ret - 02d9 8100 clr $ACC0 - 02da 8900 clr $ACC1 - 02db 00df 0354 lr $AC1.M, @0x0354 - 02dd 00de 034e lr $AC0.M, @0x034e - 02df 8200 cmp - 02e0 0293 02d9 jle 0x02d9 - 02e2 02df ret - 02e3 0080 0388 lri $AR0, #0x0388 - 02e5 0081 0072 lri $AR1, #0x0072 - 02e7 0e02 lris $AC0.M, #0x02 - 02e8 173f callr $AR1 - 02e9 02bf 04ce call 0x04ce - 02eb 00de 0344 lr $AC0.M, @0x0344 - 02ed 00fe 0341 sr @0x0341, $AC0.M - 02ef 00de 0345 lr $AC0.M, @0x0345 - 02f1 00fe 038e sr @0x038e, $AC0.M - 02f3 8100 clr $ACC0 - 02f4 00fe 0355 sr @0x0355, $AC0.M - 02f6 02bf 02ca call 0x02ca - 02f8 02bf 0692 call 0x0692 - 02fa 0092 00ff lri $CR, #0x00ff - 02fc 00de 0341 lr $AC0.M, @0x0341 - 02fe 007e 04c5 bloop $AC0.M, 0x04c5 - 0300 02bf 015c call 0x015c - 0302 02bf 0208 call 0x0208 - 0304 02bf 053a call 0x053a - 0306 02bf 0acb call 0x0acb - 0308 00de 0355 lr $AC0.M, @0x0355 - 030a 7400 incm $AC0.M - 030b 00fe 0355 sr @0x0355, $AC0.M - 030d 8100 clr $ACC0 - 030e 00fe 0354 sr @0x0354, $AC0.M - 0310 00de 0342 lr $AC0.M, @0x0342 - 0312 007e 0465 bloop $AC0.M, 0x0465 - 0314 009e fead lri $AC0.M, #0xfead - 0316 02bf 00a0 call 0x00a0 - 0318 02bf 02d9 call 0x02d9 - 031a 009e d0d0 lri $AC0.M, #0xd0d0 - 031c 02bf 00a0 call 0x00a0 - 031e 8100 clr $ACC0 - 031f 8900 clr $ACC1 - 0320 00de 0354 lr $AC0.M, @0x0354 - 0322 147c lsr $ACC0, #-4 - 0323 0200 04fc addi $AC0.M, #0x04fc - 0325 1c1e mrr $AR0, $AC0.M - 0326 181f lrr $AC1.M, @$AR0 - 0327 00de 0354 lr $AC0.M, @0x0354 - 0329 0240 000f andi $AC0.M, #0x000f - 032b 3d80 lsrnr $ACC1 - 032c 03c0 8000 andcf $AC1.M, #0x8000 - 032e 029c 0461 jlnz 0x0461 - 0330 00d8 0354 lr $AX0.L, @0x0354 - 0332 009a 0180 lri $AX0.H, #0x0180 - 0334 8100 clr $ACC0 - 0335 00de 0380 lr $AC0.M, @0x0380 - 0337 00dc 0381 lr $AC0.L, @0x0381 - 0339 9000 mul $AX0.L, $AX0.H - 033a 9400 mulac $AX0.L, $AX0.H, $ACC0 - 033b 00fe 034c sr @0x034c, $AC0.M - 033d 00fc 034d sr @0x034d, $AC0.L - 033f 02bf 0112 call 0x0112 - 0341 00da 0400 lr $AX0.H, @0x0400 - 0343 8600 tstaxh $AX0.H - 0344 0295 0461 jz 0x0461 - 0346 00da 0401 lr $AX0.H, @0x0401 - 0348 8600 tstaxh $AX0.H - 0349 0294 0461 jnz 0x0461 - 034b 00da 0433 lr $AX0.H, @0x0433 - 034d 00fa 03f8 sr @0x03f8, $AX0.H - 034f 00da 0406 lr $AX0.H, @0x0406 - 0351 8600 tstaxh $AX0.H - 0352 0294 0f2f jnz 0x0f2f - 0354 8100 clr $ACC0 - 0355 00de 0480 lr $AC0.M, @0x0480 - 0357 0609 cmpis $ACC0, #0x09 - 0358 0295 036b jz 0x036b - 035a 0605 cmpis $ACC0, #0x05 - 035b 0295 036b jz 0x036b - 035d 0608 cmpis $ACC0, #0x08 - 035e 0295 0afb jz 0x0afb - 0360 0610 cmpis $ACC0, #0x10 - 0361 0295 0b78 jz 0x0b78 - 0363 0620 cmpis $ACC0, #0x20 - 0364 0295 0be9 jz 0x0be9 - 0366 0621 cmpis $ACC0, #0x21 - 0367 0295 0bf1 jz 0x0bf1 - 0369 029f 09e8 jmp 0x09e8 - 036b 00d8 0402 lr $AX0.L, @0x0402 - 036d 8100 clr $ACC0 - 036e 8900 clr $ACC1 - 036f 00dc 0430 lr $AC0.L, @0x0430 - 0371 8d00 set15 - 0372 0950 lris $AX1.L, #0x50 - 0373 a000 mulx $AX0.L, $AX1.L - 0374 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0375 1404 lsl $ACC0, #4 - 0376 8c00 clr15 - 0377 1ffe mrr $AC1.M, $AC0.M - 0378 0083 0580 lri $AR3, #0x0580 - 037a 02bf 08aa call 0x08aa - 037c 029f 037e jmp 0x037e - 037e 0080 0580 lri $AR0, #0x0580 - 0380 0081 0520 lri $AR1, #0x0520 - 0382 0099 0000 lri $AX1.L, #0x0000 - 0384 02bf 0eaf call 0x0eaf - 0386 009e 0520 lri $AC0.M, #0x0520 - 0388 00fe 038f sr @0x038f, $AC0.M - 038a 8900 clr $ACC1 - 038b 00df 0484 lr $AC1.M, @0x0484 - 038d 0340 001f andi $AC1.M, #0x001f - 038f b900 tst $ACC1 - 0390 0295 03b6 jz 0x03b6 - 0392 00de 038f lr $AC0.M, @0x038f - 0394 5c00 sub $ACC0, $ACC1 - 0395 00fe 038f sr @0x038f, $AC0.M - 0397 1c7e mrr $AR3, $AC0.M - 0398 0080 0440 lri $AR0, #0x0440 - 039a 05fe addis $ACC1, #0xfe - 039b 02bf 012b call 0x012b - 039d 0080 0490 lri $AR0, #0x0490 - 039f 00c1 038f lr $AR1, @0x038f - 03a1 8900 clr $ACC1 - 03a2 00df 0484 lr $AC1.M, @0x0484 - 03a4 0340 001f andi $AC1.M, #0x001f - 03a6 02bf 0c9c call 0x0c9c - 03a8 00de 038f lr $AC0.M, @0x038f - 03aa 0450 addis $ACC0, #0x50 - 03ab 1c1e mrr $AR0, $AC0.M - 03ac 0083 0440 lri $AR3, #0x0440 - 03ae 8900 clr $ACC1 - 03af 00df 0484 lr $AC1.M, @0x0484 - 03b1 0340 001f andi $AC1.M, #0x001f - 03b3 05fe addis $ACC1, #0xfe - 03b4 02bf 012b call 0x012b - 03b6 00de 0484 lr $AC0.M, @0x0484 - 03b8 0240 0020 andi $AC0.M, #0x0020 - 03ba 0295 03d8 jz 0x03d8 - 03bc 0080 04a4 lri $AR0, #0x04a4 - 03be 00c1 038f lr $AR1, @0x038f - 03c0 0082 0454 lri $AR2, #0x0454 - 03c2 0083 04a7 lri $AR3, #0x04a7 - 03c4 18fa lrrd $AX0.H, @$AR3 - 03c5 8600 tstaxh $AX0.H - 03c6 0294 03d6 jnz 0x03d6 - 03c8 18fa lrrd $AX0.H, @$AR3 - 03c9 8600 tstaxh $AX0.H - 03ca 0294 03d6 jnz 0x03d6 - 03cc 18fa lrrd $AX0.H, @$AR3 - 03cd 8600 tstaxh $AX0.H - 03ce 0294 03d6 jnz 0x03d6 - 03d0 8100 clr $ACC0 - 03d1 18fe lrrd $AC0.M, @$AR3 - 03d2 0280 7fff cmpi $AC0.M, #0x7fff - 03d4 0295 03d8 jz 0x03d8 - 03d6 02bf 0cb7 call 0x0cb7 - 03d8 8100 clr $ACC0 - 03d9 00de 042c lr $AC0.M, @0x042c - 03db b100 tst $ACC0 - 03dc 0295 03e2 jz 0x03e2 - 03de 02bf 0dfd call 0x0dfd - 03e0 029f 0457 jmp 0x0457 - 03e2 8100 clr $ACC0 - 03e3 1c9e mrr $IX0, $AC0.M - 03e4 1cde mrr $IX2, $AC0.M - 03e5 7400 incm $AC0.M - 03e6 1cfe mrr $IX3, $AC0.M - 03e7 8100 clr $ACC0 - 03e8 00de 0407 lr $AC0.M, @0x0407 - 03ea b100 tst $ACC0 - 03eb 0295 03fa jz 0x03fa - 03ed 00c3 038f lr $AR3, @0x038f - 03ef 0007 dar $AR3 - 03f0 0080 0477 lri $AR0, #0x0477 - 03f2 0084 ffff lri $IX0, #0xffff - 03f4 0087 ffff lri $IX3, #0xffff - 03f6 199a lrrn $AX0.H, @$AR0 - 03f7 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 - 03f8 005e loop $AC0.M - 03f9 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M - 03fa 00da 0485 lr $AX0.H, @0x0485 - 03fc 8600 tstaxh $AX0.H - 03fd 0295 0410 jz 0x0410 - 03ff 8900 clr $ACC1 - 0400 0086 0005 lri $IX2, #0x0005 - 0402 0082 040a lri $AR2, #0x040a - 0404 1106 0408 bloopi #0x06, 0x0408 - 0406 18de lrrd $AC0.M, @$AR2 - 0407 147f lsr $ACC0, #-1 - 0408 4d36 add'sn $ACC1, $ACC0 : @$AR2, $AC0.M - 0409 b900 tst $ACC1 - 040a 0294 0410 jnz 0x0410 - 040c 009a 0001 lri $AX0.H, #0x0001 - 040e 00fa 0401 sr @0x0401, $AX0.H - 0410 8f00 set40 - 0411 0086 0002 lri $IX2, #0x0002 - 0413 0082 0408 lri $AR2, #0x0408 - 0415 1106 0440 bloopi #0x06, 0x0440 - 0417 8100 clr $ACC0 - 0418 195e lrri $AC0.M, @$AR2 - 0419 1200 sbclr #0x00 - 041a b100 tst $ACC0 - 041b 0275 ifz - 041c 1300 sbset #0x00 - 041d 1c7e mrr $AR3, $AC0.M - 041e 195e lrri $AC0.M, @$AR2 - 041f 195f lrri $AC1.M, @$AR2 - 0420 5c00 sub $ACC0, $ACC1 - 0421 14fb asr $ACC0, #-5 - 0422 1f5e mrr $AX0.H, $AC0.M - 0423 1f1c mrr $AX0.L, $AC0.L - 0424 185e lrr $AC0.M, @$AR2 - 0425 0240 00ff andi $AC0.M, #0x00ff - 0427 1f7e mrr $AX1.H, $AC0.M - 0428 185e lrr $AC0.M, @$AR2 - 0429 1478 lsr $ACC0, #-8 - 042a 009c 0000 lri $AC0.L, #0x0000 - 042c d100 cmpar $ACC1, $AX0.H - 042d 0295 0435 jz 0x0435 - 042f 185e lrr $AC0.M, @$AR2 - 0430 0272 ifg - 0431 7400 incm $AC0.M - 0432 0271 ifl - 0433 7800 decm $AC0.M - 0434 1a5e srr @$AR2, $AC0.M - 0435 0006 dar $AR2 - 0436 00de 038f lr $AC0.M, @0x038f - 0438 5600 subr $ACC0, $AX1.H - 0439 029d 043e jlz 0x043e - 043b 1c1e mrr $AR0, $AC0.M - 043c 02bf 0dd3 call 0x0dd3 - 043e 0000 nop - 043f 1b5f srri @$AR2, $AC1.M - 0440 000a iar $AR2 - 0441 8e00 set16 - 0442 8100 clr $ACC0 - 0443 00de 0407 lr $AC0.M, @0x0407 - 0445 b100 tst $ACC0 - 0446 0295 0457 jz 0x0457 - 0448 00c3 038f lr $AR3, @0x038f - 044a 0087 004f lri $IX3, #0x004f - 044c 001f addarn $AR3, $IX3 - 044d 0080 0477 lri $AR0, #0x0477 - 044f 0084 ffff lri $IX0, #0xffff - 0451 0087 ffff lri $IX3, #0xffff - 0453 19fa lrrn $AX0.H, @$AR3 - 0454 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 - 0455 005e loop $AC0.M - 0456 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H - 0457 00da 0406 lr $AX0.H, @0x0406 - 0459 8600 tstaxh $AX0.H - 045a 0294 045f jnz 0x045f - 045c 8100 clr $ACC0 - 045d 00fe 0404 sr @0x0404, $AC0.M - 045f 02bf 011b call 0x011b - 0461 00de 0354 lr $AC0.M, @0x0354 - 0463 7400 incm $AC0.M - 0464 00fe 0354 sr @0x0354, $AC0.M - 0466 009e b05e lri $AC0.M, #0xb05e - 0468 02bf 00a0 call 0x00a0 - 046a 0e00 lris $AC0.M, #0x00 - 046b 00fe 034e sr @0x034e, $AC0.M - 046d 0e04 lris $AC0.M, #0x04 - 046e 02bf 07d7 call 0x07d7 - 0470 00de 0355 lr $AC0.M, @0x0355 - 0472 0260 ff00 ori $AC0.M, #0xff00 - 0474 02bf 07e1 call 0x07e1 - 0476 02bf 0d59 call 0x0d59 - 0478 02bf 0d6b call 0x0d6b - 047a 02bf 0dc0 call 0x0dc0 - 047c 00de 0341 lr $AC0.M, @0x0341 - 047e 7800 decm $AC0.M - 047f 00fe 0341 sr @0x0341, $AC0.M - 0481 0080 09a0 lri $AR0, #0x09a0 - 0483 0083 0d00 lri $AR3, #0x0d00 - 0485 0f50 lris $AC1.M, #0x50 - 0486 0098 5a82 lri $AX0.L, #0x5a82 - 0488 02bf 0145 call 0x0145 - 048a 0080 09a0 lri $AR0, #0x09a0 - 048c 0083 0d60 lri $AR3, #0x0d60 - 048e 0f50 lris $AC1.M, #0x50 - 048f 02bf 0145 call 0x0145 - 0491 0083 0d00 lri $AR3, #0x0d00 - 0493 02bf 0deb call 0x0deb - 0495 0081 0388 lri $AR1, #0x0388 - 0497 009f 0d00 lri $AC1.M, #0x0d00 - 0499 0080 0050 lri $AR0, #0x0050 - 049b 02bf 064b call 0x064b - 049d 0080 0fa0 lri $AR0, #0x0fa0 - 049f 0083 0d60 lri $AR3, #0x0d60 - 04a1 0f50 lris $AC1.M, #0x50 - 04a2 0098 8000 lri $AX0.L, #0x8000 - 04a4 02bf 0145 call 0x0145 - 04a6 0083 0d60 lri $AR3, #0x0d60 - 04a8 02bf 0deb call 0x0deb - 04aa 0081 038a lri $AR1, #0x038a - 04ac 009f 0d60 lri $AC1.M, #0x0d60 - 04ae 0080 0050 lri $AR0, #0x0050 - 04b0 02bf 064b call 0x064b - 04b2 009a 0000 lri $AX0.H, #0x0000 - 04b4 0098 00a0 lri $AX0.L, #0x00a0 - 04b6 0080 0388 lri $AR0, #0x0388 - 04b8 02bf 02d3 call 0x02d3 - 04ba 0080 038a lri $AR0, #0x038a - 04bc 02bf 02d3 call 0x02d3 - 04be 02bf 0285 call 0x0285 - 04c0 02bf 0509 call 0x0509 - 04c2 02bf 04e0 call 0x04e0 - 04c4 0000 nop - 04c5 0000 nop - 04c6 009e 0dac lri $AC0.M, #0x0dac - 04c8 02bf 00a0 call 0x00a0 - 04ca 0080 002b lri $AR0, #0x002b - 04cc 029f 0770 jmp 0x0770 - 04ce 0080 0374 lri $AR0, #0x0374 - 04d0 0e02 lris $AC0.M, #0x02 - 04d1 02bf 0074 call 0x0074 - 04d3 00de 0374 lr $AC0.M, @0x0374 - 04d5 0240 7fff andi $AC0.M, #0x7fff - 04d7 00fe 0374 sr @0x0374, $AC0.M - 04d9 00de 0376 lr $AC0.M, @0x0376 - 04db 0240 7fff andi $AC0.M, #0x7fff - 04dd 00fe 0376 sr @0x0376, $AC0.M - 04df 02df ret - 04e0 00da 0374 lr $AX0.H, @0x0374 - 04e2 8600 tstaxh $AX0.H - 04e3 02d5 retz - 04e4 0083 0f40 lri $AR3, #0x0f40 - 04e6 02bf 0deb call 0x0deb - 04e8 0083 0ca0 lri $AR3, #0x0ca0 - 04ea 02bf 0deb call 0x0deb - 04ec 0081 0374 lri $AR1, #0x0374 - 04ee 009f 0f40 lri $AC1.M, #0x0f40 - 04f0 0080 0050 lri $AR0, #0x0050 - 04f2 02bf 064b call 0x064b - 04f4 0081 0376 lri $AR1, #0x0376 - 04f6 009f 0ca0 lri $AC1.M, #0x0ca0 - 04f8 0080 0050 lri $AR0, #0x0050 - 04fa 02bf 064b call 0x064b - 04fc 009a 0000 lri $AX0.H, #0x0000 - 04fe 0098 00a0 lri $AX0.L, #0x00a0 - 0500 0080 0374 lri $AR0, #0x0374 - 0502 02bf 02d3 call 0x02d3 - 0504 0080 0376 lri $AR0, #0x0376 - 0506 02bf 02d3 call 0x02d3 - 0508 02df ret - 0509 00da 0374 lr $AX0.H, @0x0374 - 050b 8600 tstaxh $AX0.H - 050c 02d5 retz - 050d 009f 0be0 lri $AC1.M, #0x0be0 - 050f 00ff 03a1 sr @0x03a1, $AC1.M - 0511 00df 03ca lr $AC1.M, @0x03ca - 0513 00ff 0392 sr @0x0392, $AC1.M - 0515 00df 03cb lr $AC1.M, @0x03cb - 0517 00ff 0393 sr @0x0393, $AC1.M - 0519 009f 03a6 lri $AC1.M, #0x03a6 - 051b 00ff 03a0 sr @0x03a0, $AC1.M - 051d 00df 03c9 lr $AC1.M, @0x03c9 - 051f 00ff 0391 sr @0x0391, $AC1.M - 0521 02bf 026b call 0x026b - 0523 009f 0c40 lri $AC1.M, #0x0c40 - 0525 00ff 03a1 sr @0x03a1, $AC1.M - 0527 00df 03da lr $AC1.M, @0x03da - 0529 00ff 0392 sr @0x0392, $AC1.M - 052b 00df 03db lr $AC1.M, @0x03db - 052d 00ff 0393 sr @0x0393, $AC1.M - 052f 009f 03a7 lri $AC1.M, #0x03a7 - 0531 00ff 03a0 sr @0x03a0, $AC1.M - 0533 00df 03d9 lr $AC1.M, @0x03d9 - 0535 00ff 0391 sr @0x0391, $AC1.M - 0537 02bf 026b call 0x026b - 0539 02df ret - 053a 00da 0374 lr $AX0.H, @0x0374 - 053c 8600 tstaxh $AX0.H - 053d 02d5 retz - 053e 00da 03d8 lr $AX0.H, @0x03d8 - 0540 8600 tstaxh $AX0.H - 0541 02d5 retz - 0542 0083 0be0 lri $AR3, #0x0be0 - 0544 0080 0c30 lri $AR0, #0x0c30 - 0546 0f04 lris $AC1.M, #0x04 - 0547 02bf 0132 call 0x0132 - 0549 0083 0c40 lri $AR3, #0x0c40 - 054b 0080 0c90 lri $AR0, #0x0c90 - 054d 0f04 lris $AC1.M, #0x04 - 054e 02bf 0132 call 0x0132 - 0550 00df 03ca lr $AC1.M, @0x03ca - 0552 00ff 0392 sr @0x0392, $AC1.M - 0554 00df 03cb lr $AC1.M, @0x03cb - 0556 00ff 0393 sr @0x0393, $AC1.M - 0558 00df 03a6 lr $AC1.M, @0x03a6 - 055a 7500 incm $AC1.M - 055b 1f5f mrr $AX0.H, $AC1.M - 055c 009f 0be8 lri $AC1.M, #0x0be8 - 055e 02bf 01b2 call 0x01b2 - 0560 00df 03da lr $AC1.M, @0x03da - 0562 00ff 0392 sr @0x0392, $AC1.M - 0564 00df 03db lr $AC1.M, @0x03db - 0566 00ff 0393 sr @0x0393, $AC1.M - 0568 00df 03a7 lr $AC1.M, @0x03a7 - 056a 7500 incm $AC1.M - 056b 1f5f mrr $AX0.H, $AC1.M - 056c 009f 0c48 lri $AC1.M, #0x0c48 - 056e 02bf 01b2 call 0x01b2 - 0570 00de 03c8 lr $AC0.M, @0x03c8 - 0572 02a0 0001 andf $AC0.M, #0x0001 - 0574 029d 057d jlz 0x057d - 0576 0080 03d0 lri $AR0, #0x03d0 - 0578 0e08 lris $AC0.M, #0x08 - 0579 0081 0be0 lri $AR1, #0x0be0 - 057b 02bf 0c7d call 0x0c7d - 057d 00de 03d8 lr $AC0.M, @0x03d8 - 057f 02a0 0001 andf $AC0.M, #0x0001 - 0581 029d 058a jlz 0x058a - 0583 0080 03e0 lri $AR0, #0x03e0 - 0585 0e08 lris $AC0.M, #0x08 - 0586 0081 0c40 lri $AR1, #0x0c40 - 0588 02bf 0c7d call 0x0c7d - 058a 0f50 lris $AC1.M, #0x50 - 058b 0080 0be0 lri $AR0, #0x0be0 - 058d 0083 0f40 lri $AR3, #0x0f40 - 058f 00d8 03cd lr $AX0.L, @0x03cd - 0591 02bf 0145 call 0x0145 - 0593 0f50 lris $AC1.M, #0x50 - 0594 0080 0c40 lri $AR0, #0x0c40 - 0596 0083 0ca0 lri $AR3, #0x0ca0 - 0598 00d8 03df lr $AX0.L, @0x03df - 059a 02bf 0145 call 0x0145 - 059c 00de 03c8 lr $AC0.M, @0x03c8 - 059e 02a0 0002 andf $AC0.M, #0x0002 - 05a0 029d 05a9 jlz 0x05a9 - 05a2 0080 03d0 lri $AR0, #0x03d0 - 05a4 0e08 lris $AC0.M, #0x08 - 05a5 0081 0be0 lri $AR1, #0x0be0 - 05a7 02bf 0c7d call 0x0c7d - 05a9 00de 03d8 lr $AC0.M, @0x03d8 - 05ab 02a0 0002 andf $AC0.M, #0x0002 - 05ad 029d 05b6 jlz 0x05b6 - 05af 0080 03e0 lri $AR0, #0x03e0 - 05b1 0e08 lris $AC0.M, #0x08 - 05b2 0081 0c40 lri $AR1, #0x0c40 - 05b4 02bf 0c7d call 0x0c7d - 05b6 02df ret - 05b7 0080 0346 lri $AR0, #0x0346 - 05b9 02bf 0072 call 0x0072 - 05bb 02bf 0072 call 0x0072 - 05bd 0081 0346 lri $AR1, #0x0346 - 05bf 193e lrri $AC0.M, @$AR1 - 05c0 193c lrri $AC0.L, @$AR1 - 05c1 009f 0400 lri $AC1.M, #0x0400 - 05c3 00c0 0345 lr $AR0, @0x0345 - 05c5 02bf 0640 call 0x0640 - 05c7 0081 0348 lri $AR1, #0x0348 - 05c9 193e lrri $AC0.M, @$AR1 - 05ca 193c lrri $AC0.L, @$AR1 - 05cb 009f 0800 lri $AC1.M, #0x0800 - 05cd 00c0 0345 lr $AR0, @0x0345 - 05cf 02bf 0640 call 0x0640 - 05d1 0081 0346 lri $AR1, #0x0346 - 05d3 193e lrri $AC0.M, @$AR1 - 05d4 193c lrri $AC0.L, @$AR1 - 05d5 009f 0800 lri $AC1.M, #0x0800 - 05d7 00c0 0345 lr $AR0, @0x0345 - 05d9 02bf 064d call 0x064d - 05db 0081 0348 lri $AR1, #0x0348 - 05dd 193e lrri $AC0.M, @$AR1 - 05de 193c lrri $AC0.L, @$AR1 - 05df 009f 0400 lri $AC1.M, #0x0400 - 05e1 00c0 0345 lr $AR0, @0x0345 - 05e3 02bf 064d call 0x064d - 05e5 029f 004a jmp 0x004a - 05e7 0080 0346 lri $AR0, #0x0346 - 05e9 02bf 0072 call 0x0072 - 05eb 02bf 0072 call 0x0072 - 05ed 0081 0346 lri $AR1, #0x0346 - 05ef 193e lrri $AC0.M, @$AR1 - 05f0 193c lrri $AC0.L, @$AR1 - 05f1 009f 0400 lri $AC1.M, #0x0400 - 05f3 00c0 0345 lr $AR0, @0x0345 - 05f5 02bf 0640 call 0x0640 - 05f7 0081 0348 lri $AR1, #0x0348 - 05f9 193e lrri $AC0.M, @$AR1 - 05fa 193c lrri $AC0.L, @$AR1 - 05fb 009f 0400 lri $AC1.M, #0x0400 - 05fd 00c0 0345 lr $AR0, @0x0345 - 05ff 02bf 064d call 0x064d - 0601 029f 004a jmp 0x004a - 0603 0080 0346 lri $AR0, #0x0346 - 0605 02bf 0072 call 0x0072 - 0607 02bf 0072 call 0x0072 - 0609 0081 0346 lri $AR1, #0x0346 - 060b 193e lrri $AC0.M, @$AR1 - 060c 193c lrri $AC0.L, @$AR1 - 060d 009f 0400 lri $AC1.M, #0x0400 - 060f 00c0 0344 lr $AR0, @0x0344 - 0611 02bf 0640 call 0x0640 - 0613 0081 0348 lri $AR1, #0x0348 - 0615 193e lrri $AC0.M, @$AR1 - 0616 193c lrri $AC0.L, @$AR1 - 0617 009f 0800 lri $AC1.M, #0x0800 - 0619 00c0 0344 lr $AR0, @0x0344 - 061b 02bf 0640 call 0x0640 - 061d 0080 0400 lri $AR0, #0x0400 - 061f 0083 0800 lri $AR3, #0x0800 - 0621 0084 0000 lri $IX0, #0x0000 - 0623 00da 0345 lr $AX0.H, @0x0345 - 0625 00df 0344 lr $AC1.M, @0x0344 - 0627 8f00 set40 - 0628 197b lrri $AX1.H, @$AR3 - 0629 b800 mulx $AX0.H, $AX1.H - 062a 197b lrri $AX1.H, @$AR3 - 062b 007f 0630 bloop $AC1.M, 0x0630 - 062d 199e lrrn $AC0.M, @$AR0 - 062e bc00 mulxac $AX0.H, $AX1.H, $ACC0 - 062f 80b2 nx'sl : $AC0.M, $AX1.H - 0630 0000 nop - 0631 8e00 set16 - 0632 0081 0346 lri $AR1, #0x0346 - 0634 193e lrri $AC0.M, @$AR1 - 0635 193c lrri $AC0.L, @$AR1 - 0636 009f 0400 lri $AC1.M, #0x0400 - 0638 00c0 0344 lr $AR0, @0x0344 - 063a 02bf 064d call 0x064d - 063c 029f 004a jmp 0x004a - 063e 193e lrri $AC0.M, @$AR1 - 063f 193c lrri $AC0.L, @$AR1 - 0640 2fcd srs @DSPA, $AC1.M - 0641 0f00 lris $AC1.M, #0x00 - 0642 2fc9 srs @DSCR, $AC1.M - 0643 2ece srs @DSMAH, $AC0.M - 0644 2ccf srs @DSMAL, $AC0.L - 0645 1fe0 mrr $AC1.M, $AR0 - 0646 1501 lsl $ACC1, #1 - 0647 2fcb srs @DSBL, $AC1.M - 0648 02bf 0651 call 0x0651 - 064a 02df ret - 064b 193e lrri $AC0.M, @$AR1 - 064c 193c lrri $AC0.L, @$AR1 - 064d 2fcd srs @DSPA, $AC1.M - 064e 0f01 lris $AC1.M, #0x01 - 064f 029f 0642 jmp 0x0642 - 0651 26c9 lrs $AC0.M, @DSCR - 0652 02a0 0004 andf $AC0.M, #0x0004 - 0654 029c 0651 jlnz 0x0651 - 0656 02df ret - 0657 193e lrri $AC0.M, @$AR1 - 0658 193c lrri $AC0.L, @$AR1 - 0659 00ff ffcd sr @DSPA, $AC1.M - 065b 0f00 lris $AC1.M, #0x00 - 065c 00ff ffc9 sr @DSCR, $AC1.M - 065e 00fe ffce sr @DSMAH, $AC0.M - 0660 00fc ffcf sr @DSMAL, $AC0.L - 0662 1fe0 mrr $AC1.M, $AR0 - 0663 1501 lsl $ACC1, #1 - 0664 00ff ffcb sr @DSBL, $AC1.M - 0666 02df ret - 0667 00de ffc9 lr $AC0.M, @DSCR - 0669 02a0 0004 andf $AC0.M, #0x0004 - 066b 029c 0667 jlnz 0x0667 - 066d 02df ret - 066e 0080 0346 lri $AR0, #0x0346 - 0670 02bf 0072 call 0x0072 - 0672 02bf 0072 call 0x0072 - 0674 0081 0346 lri $AR1, #0x0346 - 0676 00df 0349 lr $AC1.M, @0x0349 - 0678 0340 ffff andi $AC1.M, #0xffff - 067a 00c0 0345 lr $AR0, @0x0345 - 067c 02bf 063e call 0x063e - 067e 029f 004a jmp 0x004a - 0680 0080 0346 lri $AR0, #0x0346 - 0682 02bf 0072 call 0x0072 - 0684 02bf 0072 call 0x0072 - 0686 0081 0346 lri $AR1, #0x0346 - 0688 00df 0349 lr $AC1.M, @0x0349 - 068a 0340 ffff andi $AC1.M, #0xffff - 068c 00c0 0345 lr $AR0, @0x0345 - 068e 02bf 064b call 0x064b - 0690 029f 004a jmp 0x004a - 0692 0092 00ff lri $CR, #0x00ff - 0694 009e ffff lri $AC0.M, #0xffff - 0696 2ed4 srs @ACSAH, $AC0.M - 0697 2ed5 srs @ACSAL, $AC0.M - 0698 2ed6 srs @ACEAH, $AC0.M - 0699 2ed7 srs @ACEAL, $AC0.M - 069a 02df ret - 069b 00ff ffd1 sr @SampleFormat, $AC1.M - 069d 0340 0003 andi $AC1.M, #0x0003 - 069f 7900 decm $AC1.M - 06a0 02ca lsrn - 06a1 00df 037d lr $AC1.M, @0x037d - 06a3 00dd 037e lr $AC1.L, @0x037e - 06a5 4c00 add $ACC0, $ACC1 - 06a6 00fe ffd8 sr @ACCAH, $AC0.M - 06a8 00fc ffd9 sr @ACCAL, $AC0.L - 06aa 02df ret - 06ab 1fc3 mrr $AC0.M, $AR3 - 06ac 043f addis $ACC0, #0x3f - 06ad 0240 fff0 andi $AC0.M, #0xfff0 - 06af 00fe ffcd sr @DSPA, $AC0.M - 06b1 1c1a mrr $AR0, $AX0.H - 06b2 00da 037f lr $AX0.H, @0x037f - 06b4 4400 addr $ACC0, $AX0.H - 06b5 1f40 mrr $AX0.H, $AR0 - 06b6 1c1e mrr $AR0, $AC0.M - 06b7 1fda mrr $AC0.M, $AX0.H - 06b8 041f addis $ACC0, #0x1f - 06b9 0240 fff0 andi $AC0.M, #0xfff0 - 06bb 1401 lsl $ACC0, #1 - 06bc 00fe ffcb sr @DSBL, $AC0.M - 06be 00de ffc9 lr $AC0.M, @DSCR - 06c0 02a0 0004 andf $AC0.M, #0x0004 - 06c2 029c 06be jlnz 0x06be - 06c4 007a 06c7 bloop $AX0.H, 0x06c7 - 06c6 191e lrri $AC0.M, @$AR0 - 06c7 1b7e srri @$AR3, $AC0.M - 06c8 02df ret - 06c9 8900 clr $ACC1 - 06ca 1ffc mrr $AC1.M, $AC0.L - 06cb 0340 001f andi $AC1.M, #0x001f - 06cd 00ff 037f sr @0x037f, $AC1.M - 06cf 1ffc mrr $AC1.M, $AC0.L - 06d0 0340 ffe0 andi $AC1.M, #0xffe0 - 06d2 1f9f mrr $AC0.L, $AC1.M - 06d3 00df 037d lr $AC1.M, @0x037d - 06d5 00dd 037e lr $AC1.L, @0x037e - 06d7 4c00 add $ACC0, $ACC1 - 06d8 00fe ffce sr @DSMAH, $AC0.M - 06da 00fc ffcf sr @DSMAL, $AC0.L - 06dc 0f00 lris $AC1.M, #0x00 - 06dd 00ff ffc9 sr @DSCR, $AC1.M - 06df 02df ret - 06e0 00df 037f lr $AC1.M, @0x037f - 06e2 157f lsr $ACC1, #-1 - 06e3 00ff 037f sr @0x037f, $AC1.M - 06e5 02df ret - 06e6 8600 tstaxh $AX0.H - 06e7 02d5 retz - 06e8 1f1a mrr $AX0.L, $AX0.H - 06e9 009e 0780 lri $AC0.M, #0x0780 - 06eb 00fe ffcd sr @DSPA, $AC0.M - 06ed 1fda mrr $AC0.M, $AX0.H - 06ee 043f addis $ACC0, #0x3f - 06ef 0240 ffe0 andi $AC0.M, #0xffe0 - 06f1 00fe ffcb sr @DSBL, $AC0.M - 06f3 00de ffc9 lr $AC0.M, @DSCR - 06f5 02a0 0004 andf $AC0.M, #0x0004 - 06f7 029c 06f3 jlnz 0x06f3 - 06f9 8100 clr $ACC0 - 06fa 00de 037f lr $AC0.M, @0x037f - 06fc 147f lsr $ACC0, #-1 - 06fd 0200 0780 addi $AC0.M, #0x0780 - 06ff 1c1e mrr $AR0, $AC0.M - 0700 00de 037f lr $AC0.M, @0x037f - 0702 02a0 0001 andf $AC0.M, #0x0001 - 0704 029d 070d jlz 0x070d - 0706 8100 clr $ACC0 - 0707 191e lrri $AC0.M, @$AR0 - 0708 1488 asl $ACC0, #8 - 0709 1b7e srri @$AR3, $AC0.M - 070a 1fda mrr $AC0.M, $AX0.H - 070b 7800 decm $AC0.M - 070c 1f5e mrr $AX0.H, $AC0.M - 070d 8100 clr $ACC0 - 070e 1fda mrr $AC0.M, $AX0.H - 070f 147f lsr $ACC0, #-1 - 0710 007e 0719 bloop $AC0.M, 0x0719 - 0712 8100 clr $ACC0 - 0713 181e lrr $AC0.M, @$AR0 - 0714 0240 ff00 andi $AC0.M, #0xff00 - 0716 1b7e srri @$AR3, $AC0.M - 0717 191e lrri $AC0.M, @$AR0 - 0718 1488 asl $ACC0, #8 - 0719 1b7e srri @$AR3, $AC0.M - 071a 1fda mrr $AC0.M, $AX0.H - 071b 1f58 mrr $AX0.H, $AX0.L - 071c 02a0 0001 andf $AC0.M, #0x0001 - 071e 02dd retlz - 071f 8100 clr $ACC0 - 0720 181e lrr $AC0.M, @$AR0 - 0721 0240 ff00 andi $AC0.M, #0xff00 - 0723 1b7e srri @$AR3, $AC0.M - 0724 02df ret - 0725 1205 sbclr #0x05 - 0726 8e00 set16 - 0727 00f0 03fd sr @0x03fd, $AC0.H - 0729 00fc 03ff sr @0x03ff, $AC0.L - 072b f400 lsr16 $ACC0 - 072c 00fc 03fe sr @0x03fe, $AC0.L - 072e 00fa 03fa sr @0x03fa, $AX0.H - 0730 8100 clr $ACC0 - 0731 00de fffe lr $AC0.M, @CMBH - 0733 02c0 8000 andcf $AC0.M, #0x8000 - 0735 029c 0826 jlnz 0x0826 - 0737 00da ffff lr $AX0.H, @CMBL - 0739 8600 tstaxh $AX0.H - 073a 0294 07ff jnz 0x07ff - 073c 00de fffe lr $AC0.M, @CMBH - 073e 02c0 8000 andcf $AC0.M, #0x8000 - 0740 029c 073c jlnz 0x073c - 0742 0240 000f andi $AC0.M, #0x000f - 0744 1f5e mrr $AX0.H, $AC0.M - 0745 7400 incm $AC0.M - 0746 0c00 lris $AC0.L, #0x00 - 0747 1404 lsl $ACC0, #4 - 0748 00fe 034e sr @0x034e, $AC0.M - 074a 1fda mrr $AC0.M, $AX0.H - 074b 1f40 mrr $AX0.H, $AR0 - 074c 0200 04fc addi $AC0.M, #0x04fc - 074e 1c1e mrr $AR0, $AC0.M - 074f 00de ffff lr $AC0.M, @CMBL - 0751 1a1e srr @$AR0, $AC0.M - 0752 1c1a mrr $AR0, $AX0.H - 0753 00de 03fe lr $AC0.M, @0x03fe - 0755 00dc 03ff lr $AC0.L, @0x03ff - 0757 00d0 03fd lr $AC0.H, @0x03fd - 0759 00da 03fa lr $AX0.H, @0x03fa - 075b 1305 sbset #0x05 - 075c 02ff rti - 075d 009a 0002 lri $AX0.H, #0x0002 - 075f 00fa 03a3 sr @0x03a3, $AX0.H - 0761 00e0 03f9 sr @0x03f9, $AR0 - 0763 02bf 07e9 call 0x07e9 - 0765 16fc dcd1 si @DMBH, #0xdcd1 - 0767 16fd 0002 si @DMBL, #0x0002 - 0769 16fb 0001 si @DIRQ, #0x0001 - 076b 0021 halt - 076c 0784 cmpis $ACC1, #0x84 - 076d 0785 cmpis $ACC1, #0x85 - 076e 07c5 cmpis $ACC1, #0xc5 - 076f 07c8 cmpis $ACC1, #0xc8 - 0770 00e0 03f9 sr @0x03f9, $AR0 - 0772 009e 0005 lri $AC0.M, #0x0005 - 0774 02bf 07d7 call 0x07d7 - 0776 8e00 set16 - 0777 8100 clr $ACC0 - 0778 8900 clr $ACC1 - 0779 02bf 07cb call 0x07cb - 077b 27ff lrs $AC1.M, @CMBL - 077c 009e 076c lri $AC0.M, #0x076c - 077e 4c00 add $ACC0, $ACC1 - 077f 1c7e mrr $AR3, $AC0.M - 0780 0313 ilrr $AC1.M, @$AR3 - 0781 1c7f mrr $AR3, $AC1.M - 0782 176f jmpr $AR3 - 0783 0021 halt - 0784 0021 halt - 0785 009a 0002 lri $AX0.H, #0x0002 - 0787 00fa 03a3 sr @0x03a3, $AX0.H - 0789 8100 clr $ACC0 - 078a 8900 clr $ACC1 - 078b 02bf 07cb call 0x07cb - 078d 24ff lrs $AC0.L, @CMBL - 078e 02bf 07d1 call 0x07d1 - 0790 25ff lrs $AC1.L, @CMBL - 0791 02bf 07d1 call 0x07d1 - 0793 27ff lrs $AC1.M, @CMBL - 0794 2ece srs @DSMAH, $AC0.M - 0795 2ccf srs @DSMAL, $AC0.L - 0796 16c9 0001 si @DSCR, #0x0001 - 0798 2fcd srs @DSPA, $AC1.M - 0799 2dcb srs @DSBL, $AC1.L - 079a 8100 clr $ACC0 - 079b 8900 clr $ACC1 - 079c 02bf 07cb call 0x07cb - 079e 24ff lrs $AC0.L, @CMBL - 079f 1c9e mrr $IX0, $AC0.M - 07a0 1cbc mrr $IX1, $AC0.L - 07a1 02bf 07d1 call 0x07d1 - 07a3 25ff lrs $AC1.L, @CMBL - 07a4 02bf 07d1 call 0x07d1 - 07a6 27ff lrs $AC1.M, @CMBL - 07a7 1cdf mrr $IX2, $AC1.M - 07a8 1cfd mrr $IX3, $AC1.L - 07a9 8100 clr $ACC0 - 07aa 02bf 07cb call 0x07cb - 07ac 26ff lrs $AC0.M, @CMBL - 07ad 1c1e mrr $AR0, $AC0.M - 07ae 8900 clr $ACC1 - 07af 02bf 07d1 call 0x07d1 - 07b1 20ff lrs $AX0.L, @CMBL - 07b2 1f5f mrr $AX0.H, $AC1.M - 07b3 02bf 07cb call 0x07cb - 07b5 21ff lrs $AX1.L, @CMBL - 07b6 02bf 07cb call 0x07cb - 07b8 23ff lrs $AX1.H, @CMBL - 07b9 26c9 lrs $AC0.M, @DSCR - 07ba 02a0 0004 andf $AC0.M, #0x0004 - 07bc 029c 07b9 jlnz 0x07b9 - 07be 1206 sbclr #0x06 - 07bf 1203 sbclr #0x03 - 07c0 1204 sbclr #0x04 - 07c1 1205 sbclr #0x05 - 07c2 029f 80b5 jmp 0x80b5 - 07c4 0021 halt - 07c5 029f 8000 jmp 0x8000 - 07c7 0021 halt - 07c8 00c0 03f9 lr $AR0, @0x03f9 - 07ca 170f jmpr $AR0 - 07cb 26fe lrs $AC0.M, @CMBH - 07cc 02c0 8000 andcf $AC0.M, #0x8000 - 07ce 029c 07cb jlnz 0x07cb - 07d0 02df ret - 07d1 27fe lrs $AC1.M, @CMBH - 07d2 03c0 8000 andcf $AC1.M, #0x8000 - 07d4 029c 07d1 jlnz 0x07d1 - 07d6 02df ret - -void SEND_DCD1(AC0.M) { - 07d7 02bf 07ef call 0x07ef - 07d9 16fc dcd1 si @DMBH, #0xdcd1 - 07db 2efd srs @DMBL, $AC0.M - 07dc 16fb 0001 si @DIRQ, #0x0001 - 07de 02bf 07ef call 0x07ef - 07e0 02df ret -} - -void SEND_F355(AC0.M) { - 07e1 02bf 07ef call 0x07ef - 07e3 16fc f355 si @DMBH, #0xf355 - 07e5 2efd srs @DMBL, $AC0.M - 07e6 02bf 07ef call 0x07ef - 07e8 02df ret -} - - 07e9 26fc lrs $AC0.M, @DMBH - 07ea 02c0 8000 andcf $AC0.M, #0x8000 - 07ec 029d 07e9 jlz 0x07e9 - 07ee 02df ret - 07ef 27fc lrs $AC1.M, @DMBH - 07f0 03c0 8000 andcf $AC1.M, #0x8000 - 07f2 029d 07ef jlz 0x07ef - 07f4 02df ret - 07f5 009a 0280 lri $AX0.H, #0x0280 - 07f7 00fa 0350 sr @0x0350, $AX0.H - 07f9 00fa 0351 sr @0x0351, $AX0.H - 07fb 0a00 lris $AX0.H, #0x00 - 07fc 00fa 0352 sr @0x0352, $AX0.H - 07fe 02df ret - 07ff 00e0 03fb sr @0x03fb, $AR0 - 0801 00e8 03fc sr @0x03fc, $WR0 - 0803 00c0 0350 lr $AR0, @0x0350 - 0805 0088 002f lri $WR0, #0x002f - 0807 1b1a srri @$AR0, $AX0.H - 0808 00de fffe lr $AC0.M, @CMBH - 080a 02c0 8000 andcf $AC0.M, #0x8000 - 080c 029c 0808 jlnz 0x0808 - 080e 00dc ffff lr $AC0.L, @CMBL - 0810 1b1e srri @$AR0, $AC0.M - 0811 1b1c srri @$AR0, $AC0.L - 0812 1fda mrr $AC0.M, $AX0.H - 0813 7800 decm $AC0.M - 0814 1f5e mrr $AX0.H, $AC0.M - 0815 8600 tstaxh $AX0.H - 0816 0294 0808 jnz 0x0808 - 0818 8100 clr $ACC0 - 0819 00de 0352 lr $AC0.M, @0x0352 - 081b 7400 incm $AC0.M - 081c 00fe 0352 sr @0x0352, $AC0.M - 081e 00e0 0350 sr @0x0350, $AR0 - 0820 00c0 03fb lr $AR0, @0x03fb - 0822 00c8 03fc lr $WR0, @0x03fc - 0824 029f 0753 jmp 0x0753 - 0826 00e0 03fb sr @0x03fb, $AR0 - 0828 00e8 03fc sr @0x03fc, $WR0 - 082a 00c0 0350 lr $AR0, @0x0350 - 082c 0088 002f lri $WR0, #0x002f - 082e 0a00 lris $AX0.H, #0x00 - 082f 1b1a srri @$AR0, $AX0.H - 0830 029f 0818 jmp 0x0818 - 0832 00c0 0351 lr $AR0, @0x0351 - 0834 0088 002f lri $WR0, #0x002f - 0836 00da 0352 lr $AX0.H, @0x0352 - 0838 8600 tstaxh $AX0.H - 0839 0295 085a jz 0x085a - 083b 1205 sbclr #0x05 - 083c 00da 0352 lr $AX0.H, @0x0352 - 083e 1fda mrr $AC0.M, $AX0.H - 083f 7800 decm $AC0.M - 0840 00fe 0352 sr @0x0352, $AC0.M - 0842 1305 sbset #0x05 - 0843 0081 0356 lri $AR1, #0x0356 - 0845 191e lrri $AC0.M, @$AR0 - 0846 02c0 8000 andcf $AC0.M, #0x8000 - 0848 029d 085e jlz 0x085e - 084a 1f5e mrr $AX0.H, $AC0.M - 084b 8600 tstaxh $AX0.H - 084c 0295 0862 jz 0x0862 - 084e 007a 0853 bloop $AX0.H, 0x0853 - 0850 191e lrri $AC0.M, @$AR0 - 0851 1b3e srri @$AR1, $AC0.M - 0852 191e lrri $AC0.M, @$AR0 - 0853 1b3e srri @$AR1, $AC0.M - 0854 00e0 0351 sr @0x0351, $AR0 - 0856 0088 ffff lri $WR0, #0xffff - 0858 029f 0036 jmp 0x0036 - 085a 0088 ffff lri $WR0, #0xffff - 085c 029f 002b jmp 0x002b - 085e 00e0 0351 sr @0x0351, $AR0 - 0860 029f 0836 jmp 0x0836 - 0862 0080 0832 lri $AR0, #0x0832 - 0864 029f 075d jmp 0x075d - 0866 8100 clr $ACC0 - 0867 0e10 lris $AC0.M, #0x10 - 0868 2232 lrs $AX0.H, @0x0032 - 0869 8600 tstaxh $AX0.H - 086a 02d5 retz - 086b 5400 subr $ACC0, $AX0.H - 086c 0200 0458 addi $AC0.M, #0x0458 - 086e 1c1e mrr $AR0, $AC0.M - 086f 1fda mrr $AC0.M, $AX0.H - 0870 04fe addis $ACC0, #0xfe - 0871 1f1e mrr $AX0.L, $AC0.M - 0872 191e lrri $AC0.M, @$AR0 - 0873 0291 0879 jl 0x0879 - 0875 191a lrri $AX0.H, @$AR0 - 0876 0058 loop $AX0.L - 0877 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0878 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 0879 1b7e srri @$AR3, $AC0.M - 087a 02df ret - 087b 02bf 0866 call 0x0866 - 087d 8100 clr $ACC0 - 087e 2632 lrs $AC0.M, @0x0032 - 087f 5c00 sub $ACC0, $ACC1 - 0880 2e32 srs @0x0032, $AC0.M - 0881 0092 00ff lri $CR, #0x00ff - 0883 02df ret - 0884 00de 04fb lr $AC0.M, @0x04fb - 0886 7400 incm $AC0.M - 0887 00fe 04fb sr @0x04fb, $AC0.M - 0889 8100 clr $ACC0 - 088a 2e32 srs @0x0032, $AC0.M - 088b 2e66 srs @0x0066, $AC0.M - 088c 2e67 srs @0x0067, $AC0.M - 088d 268a lrs $AC0.M, @0xff8a - 088e 248b lrs $AC0.L, @0xff8b - 088f 2e3a srs @0x003a, $AC0.M - 0890 2c3b srs @0x003b, $AC0.L - 0891 268c lrs $AC0.M, @0xff8c - 0892 248d lrs $AC0.L, @0xff8d - 0893 2e38 srs @0x0038, $AC0.M - 0894 2c39 srs @0x0039, $AC0.L - 0895 02df ret - 0896 8100 clr $ACC0 - 0897 2689 lrs $AC0.M, @0xff89 - 0898 0240 000f andi $AC0.M, #0x000f - 089a 1f5e mrr $AX0.H, $AC0.M - 089b 8100 clr $ACC0 - 089c 0e10 lris $AC0.M, #0x10 - 089d 5400 subr $ACC0, $AX0.H - 089e 2e32 srs @0x0032, $AC0.M - 089f 268a lrs $AC0.M, @0xff8a - 08a0 248b lrs $AC0.L, @0xff8b - 08a1 2288 lrs $AX0.H, @0xff88 - 08a2 2089 lrs $AX0.L, @0xff89 - 08a3 5800 subax $ACC0, $AX0.L - 08a4 0a00 lris $AX0.H, #0x00 - 08a5 2032 lrs $AX0.L, @0x0032 - 08a6 5800 subax $ACC0, $AX0.L - 08a7 2e3a srs @0x003a, $AC0.M - 08a8 2c3b srs @0x003b, $AC0.L - 08a9 02df ret - 08aa 0092 0004 lri $CR, #0x0004 - 08ac 8100 clr $ACC0 - 08ad 2604 lrs $AC0.M, @0x0004 - 08ae b100 tst $ACC0 - 08af 02b4 0884 callnz 0x0884 - 08b1 8100 clr $ACC0 - 08b2 2601 lrs $AC0.M, @0x0001 - 08b3 b100 tst $ACC0 - 08b4 0294 0952 jnz 0x0952 - 08b6 2232 lrs $AX0.H, @0x0032 - 08b7 c900 cmpar $ACC0, $AX1.H - 08b8 0293 087b jle 0x087b - 08ba 5500 subr $ACC1, $AX0.H - 08bb 02bf 0866 call 0x0866 - 08bd 223a lrs $AX0.H, @0x003a - 08be 8600 tstaxh $AX0.H - 08bf 0294 08c6 jnz 0x08c6 - 08c1 8100 clr $ACC0 - 08c2 263b lrs $AC0.M, @0x003b - 08c3 8200 cmp - 08c4 0291 0918 jl 0x0918 - 08c6 8100 clr $ACC0 - 08c7 1fdf mrr $AC0.M, $AC1.M - 08c8 040f addis $ACC0, #0x0f - 08c9 147c lsr $ACC0, #-4 - 08ca 1f7e mrr $AX1.H, $AC0.M - 08cb 0c00 lris $AC0.L, #0x00 - 08cc 1404 lsl $ACC0, #4 - 08cd 1f1e mrr $AX0.L, $AC0.M - 08ce 0a00 lris $AX0.H, #0x00 - 08cf 8100 clr $ACC0 - 08d0 263a lrs $AC0.M, @0x003a - 08d1 243b lrs $AC0.L, @0x003b - 08d2 5800 subax $ACC0, $AX0.L - 08d3 0290 08de jge 0x08de - 08d5 8100 clr $ACC0 - 08d6 263b lrs $AC0.M, @0x003b - 08d7 5c00 sub $ACC0, $ACC1 - 08d8 2e32 srs @0x0032, $AC0.M - 08d9 8100 clr $ACC0 - 08da 2e3a srs @0x003a, $AC0.M - 08db 2e3b srs @0x003b, $AC0.M - 08dc 029f 08e4 jmp 0x08e4 - 08de 2e3a srs @0x003a, $AC0.M - 08df 2c3b srs @0x003b, $AC0.L - 08e0 0c00 lris $AC0.L, #0x00 - 08e1 1fd8 mrr $AC0.M, $AX0.L - 08e2 5c00 sub $ACC0, $ACC1 - 08e3 2e32 srs @0x0032, $AC0.M - 08e4 8100 clr $ACC0 - 08e5 1fdb mrr $AC0.M, $AX1.H - 08e6 02bf 0958 call 0x0958 - 08e8 2232 lrs $AX0.H, @0x0032 - 08e9 8600 tstaxh $AX0.H - 08ea 0295 0915 jz 0x0915 - 08ec 0a10 lris $AX0.H, #0x10 - 08ed 8100 clr $ACC0 - 08ee 1fc3 mrr $AC0.M, $AR3 - 08ef 5400 subr $ACC0, $AX0.H - 08f0 1c7e mrr $AR3, $AC0.M - 08f1 0080 0458 lri $AR0, #0x0458 - 08f3 197e lrri $AC0.M, @$AR3 - 08f4 197a lrri $AX0.H, @$AR3 - 08f5 100e loopi #0x0e - 08f6 64a2 movr'sl $ACC0, $AX0.H : $AC0.M, $AX0.H - 08f7 1b1e srri @$AR0, $AC0.M - 08f8 1b1a srri @$AR0, $AX0.H - 08f9 8100 clr $ACC0 - 08fa 263a lrs $AC0.M, @0x003a - 08fb 243b lrs $AC0.L, @0x003b - 08fc b100 tst $ACC0 - 08fd 0294 0915 jnz 0x0915 - 08ff 2232 lrs $AX0.H, @0x0032 - 0900 8600 tstaxh $AX0.H - 0901 0295 0915 jz 0x0915 - 0903 0080 0467 lri $AR0, #0x0467 - 0905 8100 clr $ACC0 - 0906 268b lrs $AC0.M, @0xff8b - 0907 b100 tst $ACC0 - 0908 0295 0915 jz 0x0915 - 090a 0200 000f addi $AC0.M, #0x000f - 090c 0240 000f andi $AC0.M, #0x000f - 090e 0200 0458 addi $AC0.M, #0x0458 - 0910 1c7e mrr $AR3, $AC0.M - 0911 007a 0914 bloop $AX0.H, 0x0914 - 0913 18fe lrrd $AC0.M, @$AR3 - 0914 1a9e srrd @$AR0, $AC0.M - 0915 0092 00ff lri $CR, #0x00ff - 0917 02df ret - 0918 b100 tst $ACC0 - 0919 0295 0928 jz 0x0928 - 091b 5d00 sub $ACC1, $ACC0 - 091c 040f addis $ACC0, #0x0f - 091d 147c lsr $ACC0, #-4 - 091e 0c00 lris $AC0.L, #0x00 - 091f 00e3 0363 sr @0x0363, $AR3 - 0921 02bf 0958 call 0x0958 - 0923 00de 0363 lr $AC0.M, @0x0363 - 0925 223b lrs $AX0.H, @0x003b - 0926 4400 addr $ACC0, $AX0.H - 0927 1c7e mrr $AR3, $AC0.M - 0928 8100 clr $ACC0 - 0929 2681 lrs $AC0.M, @0xff81 - 092a b100 tst $ACC0 - 092b 0295 0950 jz 0x0950 - 092d 2380 lrs $AX1.H, @0xff80 - 092e 2688 lrs $AC0.M, @0xff88 - 092f 2489 lrs $AC0.L, @0xff89 - 0930 1408 lsl $ACC0, #8 - 0931 14f4 asr $ACC0, #-12 - 0932 2380 lrs $AX1.H, @0xff80 - 0933 8d00 set15 - 0934 c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L - 0935 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0936 8c00 clr15 - 0937 f000 lsl16 $ACC0 - 0938 4e00 addp $ACC0 - 0939 238c lrs $AX1.H, @0xff8c - 093a 218d lrs $AX1.L, @0xff8d - 093b 4a00 addax $ACC0, $AX1.L - 093c 2e38 srs @0x0038, $AC0.M - 093d 2c39 srs @0x0039, $AC0.L - 093e 2682 lrs $AC0.M, @0xff82 - 093f 2e67 srs @0x0067, $AC0.M - 0940 2683 lrs $AC0.M, @0xff83 - 0941 2e66 srs @0x0066, $AC0.M - 0942 00e3 0363 sr @0x0363, $AR3 - 0944 0083 0458 lri $AR3, #0x0458 - 0946 8100 clr $ACC0 - 0947 0e01 lris $AC0.M, #0x01 - 0948 02bf 0958 call 0x0958 - 094a 00c3 0363 lr $AR3, @0x0363 - 094c 02bf 0896 call 0x0896 - 094e 029f 08b6 jmp 0x08b6 - 0950 0e01 lris $AC0.M, #0x01 - 0951 2e01 srs @0x0001, $AC0.M - 0952 8100 clr $ACC0 - 0953 005f loop $AC1.M - 0954 1b7e srri @$AR3, $AC0.M - 0955 0092 00ff lri $CR, #0x00ff - 0957 02df ret - 0958 00ff 0360 sr @0x0360, $AC1.M - 095a 00fe 0361 sr @0x0361, $AC0.M - 095c 2638 lrs $AC0.M, @0x0038 - 095d 2439 lrs $AC0.L, @0x0039 - 095e 0f05 lris $AC1.M, #0x05 - 095f 02bf 069b call 0x069b - 0961 2638 lrs $AC0.M, @0x0038 - 0962 2439 lrs $AC0.L, @0x0039 - 0963 8900 clr $ACC1 - 0964 00df 0361 lr $AC1.M, @0x0361 - 0966 2280 lrs $AX0.H, @0xff80 - 0967 d000 mulc $AC1.M, $AX0.H - 0968 6f00 movp $ACC1 - 0969 4c00 add $ACC0, $ACC1 - 096a 2e38 srs @0x0038, $AC0.M - 096b 2c39 srs @0x0039, $AC0.L - 096c 8100 clr $ACC0 - 096d 00de 0361 lr $AC0.M, @0x0361 - 096f 007e 09d6 bloop $AC0.M, 0x09d6 - 0971 0080 ffd3 lri $AR0, #0xffd3 - 0973 0084 0000 lri $IX0, #0x0000 - 0975 199e lrrn $AC0.M, @$AR0 - 0976 8900 clr $ACC1 - 0977 1ffe mrr $AC1.M, $AC0.M - 0978 1401 lsl $ACC0, #1 - 0979 0240 001e andi $AC0.M, #0x001e - 097b 0200 0300 addi $AC0.M, #0x0300 - 097d 1c3e mrr $AR1, $AC0.M - 097e 157c lsr $ACC1, #-4 - 097f 0340 000f andi $AC1.M, #0x000f - 0981 0a11 lris $AX0.H, #0x11 - 0982 5500 subr $ACC1, $AX0.H - 0983 8100 clr $ACC0 - 0984 2680 lrs $AC0.M, @0xff80 - 0985 0605 cmpis $ACC0, #0x05 - 0986 0295 099f jz 0x099f - 0988 009a 00f0 lri $AX0.H, #0x00f0 - 098a 0b0f lris $AX1.H, #0x0f - 098b 0082 0364 lri $AR2, #0x0364 - 098d 1998 lrrn $AX0.L, @$AR0 - 098e 6000 movr $ACC0, $AX0.L - 098f 1107 0996 bloopi #0x07, 0x0996 - 0991 3400 andr $AC0.M, $AX0.H - 0992 1408 lsl $ACC0, #8 - 0993 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0994 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 - 0995 140c lsl $ACC0, #12 - 0996 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 0997 3400 andr $AC0.M, $AX0.H - 0998 1408 lsl $ACC0, #8 - 0999 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 099a 3600 andr $AC0.M, $AX1.H - 099b 140c lsl $ACC0, #12 - 099c 1b5e srri @$AR2, $AC0.M - 099d 029f 09bf jmp 0x09bf - 099f 009a c000 lri $AX0.H, #0xc000 - 09a1 0082 0364 lri $AR2, #0x0364 - 09a3 1998 lrrn $AX0.L, @$AR0 - 09a4 6000 movr $ACC0, $AX0.L - 09a5 1103 09b2 bloopi #0x03, 0x09b2 - 09a7 1408 lsl $ACC0, #8 - 09a8 3400 andr $AC0.M, $AX0.H - 09a9 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09aa 140a lsl $ACC0, #10 - 09ab 3400 andr $AC0.M, $AX0.H - 09ac 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09ad 140c lsl $ACC0, #12 - 09ae 3400 andr $AC0.M, $AX0.H - 09af 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b0 140e lsl $ACC0, #14 - 09b1 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0 - 09b2 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b3 1408 lsl $ACC0, #8 - 09b4 3400 andr $AC0.M, $AX0.H - 09b5 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b6 140a lsl $ACC0, #10 - 09b7 3400 andr $AC0.M, $AX0.H - 09b8 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09b9 140c lsl $ACC0, #12 - 09ba 3400 andr $AC0.M, $AX0.H - 09bb 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M - 09bc 140e lsl $ACC0, #14 - 09bd 3400 andr $AC0.M, $AX0.H - 09be 1b5e srri @$AR2, $AC0.M - 09bf 8f00 set40 - 09c0 1f7f mrr $AX1.H, $AC1.M - 09c1 2066 lrs $AX0.L, @0x0066 - 09c2 2767 lrs $AC1.M, @0x0067 - 09c3 193a lrri $AX0.H, @$AR1 - 09c4 1939 lrri $AX1.L, @$AR1 - 09c5 0080 0364 lri $AR0, #0x0364 - 09c7 a000 mulx $AX0.L, $AX1.L - 09c8 ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 - 09c9 1108 09d2 bloopi #0x08, 0x09d2 - 09cb 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L - 09cc a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 - 09cd 1485 asl $ACC0, #5 - 09ce e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M - 09cf 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L - 09d0 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 - 09d1 1585 asl $ACC1, #5 - 09d2 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M - 09d3 2f67 srs @0x0067, $AC1.M - 09d4 8e00 set16 - 09d5 1ff8 mrr $AC1.M, $AX0.L - 09d6 2f66 srs @0x0066, $AC1.M - 09d7 8900 clr $ACC1 - 09d8 00df 0360 lr $AC1.M, @0x0360 - 09da 02df ret - 09db b100 tst $ACC0 - 09dc 02d5 retz - 09dd 04fe addis $ACC0, #0xfe - 09de 1f1e mrr $AX0.L, $AC0.M - 09df 191e lrri $AC0.M, @$AR0 - 09e0 0291 09e6 jl 0x09e6 - 09e2 191a lrri $AX0.H, @$AR0 - 09e3 0058 loop $AX0.L - 09e4 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 09e5 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M - 09e6 1b7e srri @$AR3, $AC0.M - 09e7 02df ret - 09e8 8100 clr $ACC0 - 09e9 1f5e mrr $AX0.H, $AC0.M - 09ea 00d8 0402 lr $AX0.L, @0x0402 - 09ec 00dc 0430 lr $AC0.L, @0x0430 - 09ee 0080 0520 lri $AR0, #0x0520 - 09f0 00df 0480 lr $AC1.M, @0x0480 - 09f2 1501 lsl $ACC1, #1 - 09f3 0340 007e andi $AC1.M, #0x007e - 09f5 0300 09fd addi $AC1.M, #0x09fd - 09f7 1c5f mrr $AR2, $AC1.M - 09f8 175f callr $AR2 - 09f9 00fc 0430 sr @0x0430, $AC0.L - 09fb 029f 0386 jmp 0x0386 - 09fd 029f 0a1e jmp 0x0a1e - 09ff 029f 0a59 jmp 0x0a59 - 0a01 029f 0a41 jmp 0x0a41 - 0a03 029f 0a2e jmp 0x0a2e - 0a05 029f 0a67 jmp 0x0a67 - 0a07 029f 0a1d jmp 0x0a1d - 0a09 029f 0a85 jmp 0x0a85 - 0a0b 029f 0a88 jmp 0x0a88 - 0a0d 029f 0a1d jmp 0x0a1d - 0a0f 029f 0a1d jmp 0x0a1d - 0a11 029f 0aa6 jmp 0x0aa6 - 0a13 029f 0a5f jmp 0x0a5f - 0a15 029f 0a63 jmp 0x0a63 - 0a17 029f 0a1d jmp 0x0a1d - 0a19 029f 0a1d jmp 0x0a1d - 0a1b 029f 0a1d jmp 0x0a1d - 0a1d 02df ret - 0a1e 1401 lsl $ACC0, #1 - 0a1f 009b c000 lri $AX1.H, #0xc000 - 0a21 0099 4000 lri $AX1.L, #0x4000 - 0a23 1150 0a2b bloopi #0x50, 0x0a2b - 0a25 02c0 0001 andcf $AC0.M, #0x0001 - 0a27 027c iflnz - 0a28 1b1b srri @$AR0, $AX1.H - 0a29 027d iflz - 0a2a 1b19 srri @$AR0, $AX1.L - 0a2b 4800 addax $ACC0, $AX0.L - 0a2c 147f lsr $ACC0, #-1 - 0a2d 02df ret - 0a2e 1402 lsl $ACC0, #2 - 0a2f 8900 clr $ACC1 - 0a30 1fb8 mrr $AC1.L, $AX0.L - 0a31 1501 lsl $ACC1, #1 - 0a32 009b c000 lri $AX1.H, #0xc000 - 0a34 0099 4000 lri $AX1.L, #0x4000 - 0a36 1150 0a3e bloopi #0x50, 0x0a3e - 0a38 02c0 0003 andcf $AC0.M, #0x0003 - 0a3a 027c iflnz - 0a3b 1b1b srri @$AR0, $AX1.H - 0a3c 027d iflz - 0a3d 1b19 srri @$AR0, $AX1.L - 0a3e 4c00 add $ACC0, $ACC1 - 0a3f 147e lsr $ACC0, #-2 - 0a40 02df ret - 0a41 1401 lsl $ACC0, #1 - 0a42 0081 0ca0 lri $AR1, #0x0ca0 - 0a44 009b c000 lri $AX1.H, #0xc000 - 0a46 0099 4000 lri $AX1.L, #0x4000 - 0a48 8900 clr $ACC1 - 0a49 0082 0000 lri $AR2, #0x0000 - 0a4b 1150 0a56 bloopi #0x50, 0x0a56 - 0a4d 02c0 0001 andcf $AC0.M, #0x0001 - 0a4f 027c iflnz - 0a50 1b1b srri @$AR0, $AX1.H - 0a51 027d iflz - 0a52 1b19 srri @$AR0, $AX1.L - 0a53 183d lrr $AC1.L, @$AR1 - 0a54 4900 addax $ACC1, $AX0.L - 0a55 1fe2 mrr $AC1.M, $AR2 - 0a56 4c39 add's $ACC0, $ACC1 : @$AR1, $AC1.M - 0a57 147f lsr $ACC0, #-1 - 0a58 02df ret - 0a59 8900 clr $ACC1 - 0a5a 1fb8 mrr $AC1.L, $AX0.L - 0a5b 157f lsr $ACC1, #-1 - 0a5c 1050 loopi #0x50 - 0a5d 4c20 add's $ACC0, $ACC1 : @$AR0, $AC0.L - 0a5e 02df ret - 0a5f 0082 0180 lri $AR2, #0x0180 - 0a61 029f 0a69 jmp 0x0a69 - 0a63 0082 01c0 lri $AR2, #0x01c0 - 0a65 029f 0a69 jmp 0x0a69 - 0a67 0082 0140 lri $AR2, #0x0140 - 0a69 008a 003f lri $WR2, #0x003f - 0a6b 0086 0000 lri $IX2, #0x0000 - 0a6d 1406 lsl $ACC0, #6 - 0a6e 8900 clr $ACC1 - 0a6f 1fb8 mrr $AC1.L, $AX0.L - 0a70 1505 lsl $ACC1, #5 - 0a71 009b 003f lri $AX1.H, #0x003f - 0a73 009a 0000 lri $AX0.H, #0x0000 - 0a75 3600 andr $AC0.M, $AX1.H - 0a76 1cde mrr $IX2, $AC0.M - 0a77 001a addarn $AR2, $IX2 - 0a78 3400 andr $AC0.M, $AX0.H - 0a79 1150 0a7f bloopi #0x50, 0x0a7f - 0a7b 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a7c 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a7d 1cde mrr $IX2, $AC0.M - 0a7e 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0a7f 1b19 srri @$AR0, $AX1.L - 0a80 1fc2 mrr $AC0.M, $AR2 - 0a81 147a lsr $ACC0, #-6 - 0a82 008a ffff lri $WR2, #0xffff - 0a84 02df ret - 0a85 1050 loopi #0x50 - 0a86 1b18 srri @$AR0, $AX0.L - 0a87 02df ret - 0a88 0082 0100 lri $AR2, #0x0100 - 0a8a 008a 003f lri $WR2, #0x003f - 0a8c 0086 0000 lri $IX2, #0x0000 - 0a8e 1406 lsl $ACC0, #6 - 0a8f 8900 clr $ACC1 - 0a90 1fb8 mrr $AC1.L, $AX0.L - 0a91 1505 lsl $ACC1, #5 - 0a92 009b 003f lri $AX1.H, #0x003f - 0a94 009a 0000 lri $AX0.H, #0x0000 - 0a96 3600 andr $AC0.M, $AX1.H - 0a97 1cde mrr $IX2, $AC0.M - 0a98 001a addarn $AR2, $IX2 - 0a99 3400 andr $AC0.M, $AX0.H - 0a9a 1150 0aa0 bloopi #0x50, 0x0aa0 - 0a9c 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0a9d 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0a9e 1cde mrr $IX2, $AC0.M - 0a9f 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0aa0 1b19 srri @$AR0, $AX1.L - 0aa1 1fc2 mrr $AC0.M, $AR2 - 0aa2 147a lsr $ACC0, #-6 - 0aa3 008a ffff lri $WR2, #0xffff - 0aa5 02df ret - 0aa6 0082 0100 lri $AR2, #0x0100 - 0aa8 008a 003f lri $WR2, #0x003f - 0aaa 0086 0000 lri $IX2, #0x0000 - 0aac 0081 0ca0 lri $AR1, #0x0ca0 - 0aae 1406 lsl $ACC0, #6 - 0aaf 8900 clr $ACC1 - 0ab0 1fb8 mrr $AC1.L, $AX0.L - 0ab1 1505 lsl $ACC1, #5 - 0ab2 009b 003f lri $AX1.H, #0x003f - 0ab4 009a 0000 lri $AX0.H, #0x0000 - 0ab6 3600 andr $AC0.M, $AX1.H - 0ab7 1cde mrr $IX2, $AC0.M - 0ab8 001a addarn $AR2, $IX2 - 0ab9 3400 andr $AC0.M, $AX0.H - 0aba 1150 0ac5 bloopi #0x50, 0x0ac5 - 0abc 1939 lrri $AX1.L, @$AR1 - 0abd a000 mulx $AX0.L, $AX1.L - 0abe 140a lsl $ACC0, #10 - 0abf 4e00 addp $ACC0 - 0ac0 1476 lsr $ACC0, #-10 - 0ac1 4c4a add'l $ACC0, $ACC1 : $AX1.L, @$AR2 - 0ac2 3606 andr'dr $AC0.M, $AX1.H : $AR2 - 0ac3 1cde mrr $IX2, $AC0.M - 0ac4 340e andr'nr $AC0.M, $AX0.H : $AR2 - 0ac5 1b19 srri @$AR0, $AX1.L - 0ac6 1fc2 mrr $AC0.M, $AR2 - 0ac7 147a lsr $ACC0, #-6 - 0ac8 008a ffff lri $WR2, #0xffff - 0aca 02df ret - 0acb 0080 01be lri $AR0, #0x01be - 0acd 1918 lrri $AX0.L, @$AR0 - 0ace 191a lrri $AX0.H, @$AR0 - 0acf 0080 0180 lri $AR0, #0x0180 - 0ad1 0083 0180 lri $AR3, #0x0180 - 0ad3 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0ad4 1ffe mrr $AC1.M, $AC0.M - 0ad5 1120 0adc bloopi #0x20, 0x0adc - 0ad7 7c00 neg $ACC0 - 0ad8 d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0 - 0ad9 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0ada c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0 - 0adb 1501 lsl $ACC1, #1 - 0adc 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M - 0add 0080 01fe lri $AR0, #0x01fe - 0adf 191a lrri $AX0.H, @$AR0 - 0ae0 1918 lrri $AX0.L, @$AR0 - 0ae1 0080 01c0 lri $AR0, #0x01c0 - 0ae3 0083 01c0 lri $AR3, #0x01c0 - 0ae5 1ff8 mrr $AC1.M, $AX0.L - 0ae6 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0 - 0ae7 f800 addpaxz $ACC0, $AX0.H - 0ae8 0240 01ff andi $AC0.M, #0x01ff - 0aea 0260 2000 ori $AC0.M, #0x2000 - 0aec 02bf 0aef call 0x0aef - 0aee 02df ret - 0aef b900 tst $ACC1 - 0af0 0272 ifg - 0af1 7c00 neg $ACC0 - 0af2 1f7e mrr $AX1.H, $AC0.M - 0af3 4700 addr $ACC1, $AX1.H - 0af4 1110 0af9 bloopi #0x10, 0x0af9 - 0af6 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0af7 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0af8 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0af9 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M - 0afa 02df ret - 0afb 02bf 0b68 call 0x0b68 - 0afd 2201 lrs $AX0.H, @0x0001 - 0afe 8600 tstaxh $AX0.H - 0aff 0294 0b10 jnz 0x0b10 - 0b01 2204 lrs $AX0.H, @0x0004 - 0b02 8600 tstaxh $AX0.H - 0b03 02b4 0b57 callnz 0x0b57 - 0b05 8100 clr $ACC0 - 0b06 2605 lrs $AC0.M, @0x0005 - 0b07 b100 tst $ACC0 - 0b08 0295 0b1d jz 0x0b1d - 0b0a 8100 clr $ACC0 - 0b0b 2e05 srs @0x0005, $AC0.M - 0b0c 2281 lrs $AX0.H, @0xff81 - 0b0d 8600 tstaxh $AX0.H - 0b0e 0294 0b17 jnz 0x0b17 - 0b10 8100 clr $ACC0 - 0b11 005f loop $AC1.M - 0b12 1b7e srri @$AR3, $AC0.M - 0b13 7400 incm $AC0.M - 0b14 2e01 srs @0x0001, $AC0.M - 0b15 029f 0b50 jmp 0x0b50 - 0b17 2688 lrs $AC0.M, @0xff88 - 0b18 2489 lrs $AC0.L, @0xff89 - 0b19 2e34 srs @0x0034, $AC0.M - 0b1a 2c35 srs @0x0035, $AC0.L - 0b1b 02bf 0b57 call 0x0b57 - 0b1d 00ff 0360 sr @0x0360, $AC1.M - 0b1f 2638 lrs $AC0.M, @0x0038 - 0b20 2439 lrs $AC0.L, @0x0039 - 0b21 02bf 06c9 call 0x06c9 - 0b23 00df 0360 lr $AC1.M, @0x0360 - 0b25 8100 clr $ACC0 - 0b26 263a lrs $AC0.M, @0x003a - 0b27 b100 tst $ACC0 - 0b28 0294 0b37 jnz 0x0b37 - 0b2a 263b lrs $AC0.M, @0x003b - 0b2b 5c00 sub $ACC0, $ACC1 - 0b2c 0290 0b37 jge 0x0b37 - 0b2e 223b lrs $AX0.H, @0x003b - 0b2f 02bf 06e6 call 0x06e6 - 0b31 5500 subr $ACC1, $AX0.H - 0b32 0a01 lris $AX0.H, #0x01 - 0b33 00fa 0405 sr @0x0405, $AX0.H - 0b35 029f 0b0a jmp 0x0b0a - 0b37 1f5f mrr $AX0.H, $AC1.M - 0b38 02bf 06e6 call 0x06e6 - 0b3a 00fa 0362 sr @0x0362, $AX0.H - 0b3c 8100 clr $ACC0 - 0b3d 263a lrs $AC0.M, @0x003a - 0b3e 243b lrs $AC0.L, @0x003b - 0b3f 1570 lsr $ACC1, #-16 - 0b40 0a01 lris $AX0.H, #0x01 - 0b41 0081 0405 lri $AR1, #0x0405 - 0b43 5c00 sub $ACC0, $ACC1 - 0b44 b100 tst $ACC0 - 0b45 0275 ifz - 0b46 1a3a srr @$AR1, $AX0.H - 0b47 2e3a srs @0x003a, $AC0.M - 0b48 2c3b srs @0x003b, $AC0.L - 0b49 2638 lrs $AC0.M, @0x0038 - 0b4a 2439 lrs $AC0.L, @0x0039 - 0b4b 00d8 0362 lr $AX0.L, @0x0362 - 0b4d 7000 addaxl $ACC0, $AX0.L - 0b4e 2c39 srs @0x0039, $AC0.L - 0b4f 2e38 srs @0x0038, $AC0.M - 0b50 0092 00ff lri $CR, #0x00ff - 0b52 029f 037e jmp 0x037e - 0b54 8100 clr $ACC0 - 0b55 2e34 srs @0x0034, $AC0.M - 0b56 2e35 srs @0x0035, $AC0.M - 0b57 2334 lrs $AX1.H, @0x0034 - 0b58 2135 lrs $AX1.L, @0x0035 - 0b59 268a lrs $AC0.M, @0xff8a - 0b5a 248b lrs $AC0.L, @0xff8b - 0b5b 5a00 subax $ACC0, $AX1.L - 0b5c 2e3a srs @0x003a, $AC0.M - 0b5d 2c3b srs @0x003b, $AC0.L - 0b5e 2634 lrs $AC0.M, @0x0034 - 0b5f 2435 lrs $AC0.L, @0x0035 - 0b60 238c lrs $AX1.H, @0xff8c - 0b61 218d lrs $AX1.L, @0xff8d - 0b62 4a00 addax $ACC0, $AX1.L - 0b63 2e38 srs @0x0038, $AC0.M - 0b64 2c39 srs @0x0039, $AC0.L - 0b65 8100 clr $ACC0 - 0b66 2e05 srs @0x0005, $AC0.M - 0b67 02df ret - 0b68 0092 0004 lri $CR, #0x0004 - 0b6a 2002 lrs $AX0.L, @0x0002 - 0b6b 8100 clr $ACC0 - 0b6c 8900 clr $ACC1 - 0b6d 2430 lrs $AC0.L, @0x0030 - 0b6e 8d00 set15 - 0b6f 0950 lris $AX1.L, #0x50 - 0b70 a000 mulx $AX0.L, $AX1.L - 0b71 a400 mulxac $AX0.L, $AX1.L, $ACC0 - 0b72 1404 lsl $ACC0, #4 - 0b73 8c00 clr15 - 0b74 1ffe mrr $AC1.M, $AC0.M - 0b75 0083 0580 lri $AR3, #0x0580 - 0b77 02df ret - 0b78 02bf 0b68 call 0x0b68 - 0b7a 2201 lrs $AX0.H, @0x0001 - 0b7b 8600 tstaxh $AX0.H - 0b7c 0294 0b8d jnz 0x0b8d - 0b7e 2204 lrs $AX0.H, @0x0004 - 0b7f 8600 tstaxh $AX0.H - 0b80 02b4 0bd7 callnz 0x0bd7 - 0b82 8100 clr $ACC0 - 0b83 2605 lrs $AC0.M, @0x0005 - 0b84 b100 tst $ACC0 - 0b85 0295 0b9a jz 0x0b9a - 0b87 8100 clr $ACC0 - 0b88 2e05 srs @0x0005, $AC0.M - 0b89 2281 lrs $AX0.H, @0xff81 - 0b8a 8600 tstaxh $AX0.H - 0b8b 0294 0b94 jnz 0x0b94 - 0b8d 8100 clr $ACC0 - 0b8e 005f loop $AC1.M - 0b8f 1b7e srri @$AR3, $AC0.M - 0b90 7400 incm $AC0.M - 0b91 2e01 srs @0x0001, $AC0.M - 0b92 029f 0bd0 jmp 0x0bd0 - 0b94 2688 lrs $AC0.M, @0xff88 - 0b95 2489 lrs $AC0.L, @0xff89 - 0b96 2e34 srs @0x0034, $AC0.M - 0b97 2c35 srs @0x0035, $AC0.L - 0b98 02bf 0bd7 call 0x0bd7 - 0b9a 00ff 0360 sr @0x0360, $AC1.M - 0b9c 2638 lrs $AC0.M, @0x0038 - 0b9d 2439 lrs $AC0.L, @0x0039 - 0b9e 02bf 06c9 call 0x06c9 - 0ba0 02bf 06e0 call 0x06e0 - 0ba2 00df 0360 lr $AC1.M, @0x0360 - 0ba4 8100 clr $ACC0 - 0ba5 263a lrs $AC0.M, @0x003a - 0ba6 b100 tst $ACC0 - 0ba7 0294 0bb6 jnz 0x0bb6 - 0ba9 263b lrs $AC0.M, @0x003b - 0baa 5c00 sub $ACC0, $ACC1 - 0bab 0290 0bb6 jge 0x0bb6 - 0bad 223b lrs $AX0.H, @0x003b - 0bae 02bf 06ab call 0x06ab - 0bb0 5500 subr $ACC1, $AX0.H - 0bb1 0a01 lris $AX0.H, #0x01 - 0bb2 00fa 0405 sr @0x0405, $AX0.H - 0bb4 029f 0b87 jmp 0x0b87 - 0bb6 1f5f mrr $AX0.H, $AC1.M - 0bb7 02bf 06ab call 0x06ab - 0bb9 00fa 0362 sr @0x0362, $AX0.H - 0bbb 8100 clr $ACC0 - 0bbc 263a lrs $AC0.M, @0x003a - 0bbd 243b lrs $AC0.L, @0x003b - 0bbe 1570 lsr $ACC1, #-16 - 0bbf 0a01 lris $AX0.H, #0x01 - 0bc0 0081 0405 lri $AR1, #0x0405 - 0bc2 5c00 sub $ACC0, $ACC1 - 0bc3 b100 tst $ACC0 - 0bc4 0275 ifz - 0bc5 1a3a srr @$AR1, $AX0.H - 0bc6 2e3a srs @0x003a, $AC0.M - 0bc7 2c3b srs @0x003b, $AC0.L - 0bc8 2638 lrs $AC0.M, @0x0038 - 0bc9 2439 lrs $AC0.L, @0x0039 - 0bca 00d8 0362 lr $AX0.L, @0x0362 - 0bcc 7000 addaxl $ACC0, $AX0.L - 0bcd 7000 addaxl $ACC0, $AX0.L - 0bce 2c39 srs @0x0039, $AC0.L - 0bcf 2e38 srs @0x0038, $AC0.M - 0bd0 0092 00ff lri $CR, #0x00ff - 0bd2 029f 037e jmp 0x037e - 0bd4 8100 clr $ACC0 - 0bd5 2e34 srs @0x0034, $AC0.M - 0bd6 2e35 srs @0x0035, $AC0.M - 0bd7 2334 lrs $AX1.H, @0x0034 - 0bd8 2135 lrs $AX1.L, @0x0035 - 0bd9 268a lrs $AC0.M, @0xff8a - 0bda 248b lrs $AC0.L, @0xff8b - 0bdb 5a00 subax $ACC0, $AX1.L - 0bdc 2e3a srs @0x003a, $AC0.M - 0bdd 2c3b srs @0x003b, $AC0.L - 0bde 2634 lrs $AC0.M, @0x0034 - 0bdf 2435 lrs $AC0.L, @0x0035 - 0be0 1401 lsl $ACC0, #1 - 0be1 238c lrs $AX1.H, @0xff8c - 0be2 218d lrs $AX1.L, @0xff8d - 0be3 4a00 addax $ACC0, $AX1.L - 0be4 2e38 srs @0x0038, $AC0.M - 0be5 2c39 srs @0x0039, $AC0.L - 0be6 8100 clr $ACC0 - 0be7 2e05 srs @0x0005, $AC0.M - 0be8 02df ret - 0be9 8900 clr $ACC1 - 0bea 0f50 lris $AC1.M, #0x50 - 0beb 0083 0520 lri $AR3, #0x0520 - 0bed 02bf 0c02 call 0x0c02 - 0bef 029f 0386 jmp 0x0386 - 0bf1 00d8 0402 lr $AX0.L, @0x0402 - 0bf3 8100 clr $ACC0 - 0bf4 8900 clr $ACC1 - 0bf5 00dc 0430 lr $AC0.L, @0x0430 - 0bf7 0a50 lris $AX0.H, #0x50 - 0bf8 9000 mul $AX0.L, $AX0.H - 0bf9 9400 mulac $AX0.L, $AX0.H, $ACC0 - 0bfa 1404 lsl $ACC0, #4 - 0bfb 1ffe mrr $AC1.M, $AC0.M - 0bfc 0083 0580 lri $AR3, #0x0580 - 0bfe 02bf 0c02 call 0x0c02 - 0c00 029f 037e jmp 0x037e - 0c02 0092 0004 lri $CR, #0x0004 - 0c04 8100 clr $ACC0 - 0c05 263a lrs $AC0.M, @0x003a - 0c06 243b lrs $AC0.L, @0x003b - 0c07 1f1f mrr $AX0.L, $AC1.M - 0c08 0a00 lris $AX0.H, #0x00 - 0c09 5800 subax $ACC0, $AX0.L - 0c0a 0292 0c20 jg 0x0c20 - 0c0c 8900 clr $ACC1 - 0c0d 00c0 043b lr $AR0, @0x043b - 0c0f 02bf 0c45 call 0x0c45 - 0c11 8100 clr $ACC0 - 0c12 1fd8 mrr $AC0.M, $AX0.L - 0c13 223b lrs $AX0.H, @0x003b - 0c14 5400 subr $ACC0, $AX0.H - 0c15 0007 dar $AR3 - 0c16 1979 lrri $AX1.L, @$AR3 - 0c17 005e loop $AC0.M - 0c18 1b79 srri @$AR3, $AX1.L - 0c19 0f01 lris $AC1.M, #0x01 - 0c1a 2f01 srs @0x0001, $AC1.M - 0c1b 8900 clr $ACC1 - 0c1c 2f3b srs @0x003b, $AC1.M - 0c1d 0092 00ff lri $CR, #0x00ff - 0c1f 02df ret - 0c20 2e3a srs @0x003a, $AC0.M - 0c21 2c3b srs @0x003b, $AC0.L - 0c22 8100 clr $ACC0 - 0c23 8900 clr $ACC1 - 0c24 268a lrs $AC0.M, @0xff8a - 0c25 2734 lrs $AC1.M, @0x0034 - 0c26 5c00 sub $ACC0, $ACC1 - 0c27 2e36 srs @0x0036, $AC0.M - 0c28 5000 subr $ACC0, $AX0.L - 0c29 0290 0c3f jge 0x0c3f - 0c2b 00c0 0436 lr $AR0, @0x0436 - 0c2d 02bf 0c45 call 0x0c45 - 0c2f 8100 clr $ACC0 - 0c30 1fd8 mrr $AC0.M, $AX0.L - 0c31 2236 lrs $AX0.H, @0x0036 - 0c32 5400 subr $ACC0, $AX0.H - 0c33 1c1e mrr $AR0, $AC0.M - 0c34 8100 clr $ACC0 - 0c35 2e34 srs @0x0034, $AC0.M - 0c36 2688 lrs $AC0.M, @0xff88 - 0c37 2489 lrs $AC0.L, @0xff89 - 0c38 2e8c srs @0xff8c, $AC0.M - 0c39 2c8d srs @0xff8d, $AC0.L - 0c3a 02bf 0c45 call 0x0c45 - 0c3c 0092 00ff lri $CR, #0x00ff - 0c3e 02df ret - 0c3f 1c18 mrr $AR0, $AX0.L - 0c40 02bf 0c45 call 0x0c45 - 0c42 0092 00ff lri $CR, #0x00ff - 0c44 02df ret - 0c45 8100 clr $ACC0 - 0c46 1fc0 mrr $AC0.M, $AR0 - 0c47 b100 tst $ACC0 - 0c48 02d5 retz - 0c49 8900 clr $ACC1 - 0c4a 2734 lrs $AC1.M, @0x0034 - 0c4b 0340 0001 andi $AC1.M, #0x0001 - 0c4d 0b00 lris $AX1.H, #0x00 - 0c4e 1f3f mrr $AX1.L, $AC1.M - 0c4f 268c lrs $AC0.M, @0xff8c - 0c50 248d lrs $AC0.L, @0xff8d - 0c51 8900 clr $ACC1 - 0c52 2534 lrs $AC1.L, @0x0034 - 0c53 1501 lsl $ACC1, #1 - 0c54 4c00 add $ACC0, $ACC1 - 0c55 5a00 subax $ACC0, $AX1.L - 0c56 5a00 subax $ACC0, $AX1.L - 0c57 1c20 mrr $AR1, $AR0 - 0c58 1fe0 mrr $AC1.M, $AR0 - 0c59 0502 addis $ACC1, #0x02 - 0c5a 1c1f mrr $AR0, $AC1.M - 0c5b 009f 0b00 lri $AC1.M, #0x0b00 - 0c5d 0092 00ff lri $CR, #0x00ff - 0c5f 02bf 0640 call 0x0640 - 0c61 0092 0004 lri $CR, #0x0004 - 0c63 2734 lrs $AC1.M, @0x0034 - 0c64 1f61 mrr $AX1.H, $AR1 - 0c65 4700 addr $ACC1, $AX1.H - 0c66 2f34 srs @0x0034, $AC1.M - 0c67 0080 0b00 lri $AR0, #0x0b00 - 0c69 8900 clr $ACC1 - 0c6a 1ff9 mrr $AC1.M, $AX1.L - 0c6b b900 tst $ACC1 - 0c6c 0274 ifnz - 0c6d 0008 iar $AR0 - 0c6e 8900 clr $ACC1 - 0c6f 1fe1 mrr $AC1.M, $AR1 - 0c70 191e lrri $AC0.M, @$AR0 - 0c71 0701 cmpis $ACC1, #0x01 - 0c72 0293 0c7b jle 0x0c7b - 0c74 191a lrri $AX0.H, @$AR0 - 0c75 05fe addis $ACC1, #0xfe - 0c76 005f loop $AC1.M - 0c77 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c78 1b7e srri @$AR3, $AC0.M - 0c79 1b7a srri @$AR3, $AX0.H - 0c7a 02df ret - 0c7b 1b7e srri @$AR3, $AC0.M - 0c7c 02df ret - 0c7d 0083 03e8 lri $AR3, #0x03e8 - 0c7f 191e lrri $AC0.M, @$AR0 - 0c80 191a lrri $AX0.H, @$AR0 - 0c81 1006 loopi #0x06 - 0c82 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0c83 1b7e srri @$AR3, $AC0.M - 0c84 1b7a srri @$AR3, $AX0.H - 0c85 0080 03e8 lri $AR0, #0x03e8 - 0c87 8a00 m2 - 0c88 0088 0007 lri $WR0, #0x0007 - 0c8a 1150 0c97 bloopi #0x50, 0x0c97 - 0c8c 1c61 mrr $AR3, $AR1 - 0c8d 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0c8e f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c8f f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c90 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c91 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c92 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c93 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c94 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0c95 f200 madd $AX0.L, $AX0.H - 0c96 fe00 movpz $ACC0 - 0c97 1b3e srri @$AR1, $AC0.M - 0c98 0088 ffff lri $WR0, #0xffff - 0c9a 8b00 m0 - 0c9b 02df ret - 0c9c 8a00 m2 - 0c9d 05fe addis $ACC1, #0xfe - 0c9e 0083 03e8 lri $AR3, #0x03e8 - 0ca0 191e lrri $AC0.M, @$AR0 - 0ca1 191a lrri $AX0.H, @$AR0 - 0ca2 005f loop $AC1.M - 0ca3 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0ca4 1b7e srri @$AR3, $AC0.M - 0ca5 1b7a srri @$AR3, $AX0.H - 0ca6 0080 03e8 lri $AR0, #0x03e8 - 0ca8 0501 addis $ACC1, #0x01 - 0ca9 1d1f mrr $WR0, $AC1.M - 0caa 1150 0cb2 bloopi #0x50, 0x0cb2 - 0cac 1c61 mrr $AR3, $AR1 - 0cad 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3 - 0cae 005f loop $AC1.M - 0caf f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0cb0 f200 madd $AX0.L, $AX0.H - 0cb1 fe00 movpz $ACC0 - 0cb2 1b3e srri @$AR1, $AC0.M - 0cb3 0088 ffff lri $WR0, #0xffff - 0cb5 8b00 m0 - 0cb6 02df ret - 0cb7 0083 03e8 lri $AR3, #0x03e8 - 0cb9 191e lrri $AC0.M, @$AR0 - 0cba 191a lrri $AX0.H, @$AR0 - 0cbb 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cbc 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cbd 1b7e srri @$AR3, $AC0.M - 0cbe 1b7a srri @$AR3, $AX0.H - 0cbf 0080 03e8 lri $AR0, #0x03e8 - 0cc1 0088 0003 lri $WR0, #0x0003 - 0cc3 0085 0000 lri $IX1, #0x0000 - 0cc5 0087 0000 lri $IX3, #0x0000 - 0cc7 1fc2 mrr $AC0.M, $AR2 - 0cc8 195b lrri $AX1.H, @$AR2 - 0cc9 1959 lrri $AX1.L, @$AR2 - 0cca 195f lrri $AC1.M, @$AR2 - 0ccb 195a lrri $AX0.H, @$AR2 - 0ccc 1c5e mrr $AR2, $AC0.M - 0ccd 1fda mrr $AC0.M, $AX0.H - 0cce 1c61 mrr $AR3, $AR1 - 0ccf 8a00 m2 - 0cd0 8f00 set40 - 0cd1 191a lrri $AX0.H, @$AR0 - 0cd2 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0cd3 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0cd4 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0cd5 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0cd6 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0cd7 1127 0ce2 bloopi #0x27, 0x0ce2 - 0cd9 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0cda 197e lrri $AC0.M, @$AR3 - 0cdb e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0cdc eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0cdd bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0 - 0cde e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0cdf 197f lrri $AC1.M, @$AR3 - 0ce0 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0ce1 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0ce2 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0 - 0ce3 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0ce4 197e lrri $AC0.M, @$AR3 - 0ce5 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0ce6 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0ce7 bf00 mulxmv $AX0.H, $AX1.H, $ACC1 - 0ce8 1bff srrn @$AR3, $AC1.M - 0ce9 197f lrri $AC1.M, @$AR3 - 0cea 8e00 set16 - 0ceb 8b00 m0 - 0cec 0088 ffff lri $WR0, #0xffff - 0cee 1b5b srri @$AR2, $AX1.H - 0cef 1b59 srri @$AR2, $AX1.L - 0cf0 1b5f srri @$AR2, $AC1.M - 0cf1 1b5e srri @$AR2, $AC0.M - 0cf2 02df ret - 0cf3 0083 03e8 lri $AR3, #0x03e8 - 0cf5 191e lrri $AC0.M, @$AR0 - 0cf6 191a lrri $AX0.H, @$AR0 - 0cf7 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cf8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M - 0cf9 1b7e srri @$AR3, $AC0.M - 0cfa 1b7a srri @$AR3, $AX0.H - 0cfb 0080 03e8 lri $AR0, #0x03e8 - 0cfd 0088 0003 lri $WR0, #0x0003 - 0cff 0085 0000 lri $IX1, #0x0000 - 0d01 0087 0000 lri $IX3, #0x0000 - 0d03 1fc2 mrr $AC0.M, $AR2 - 0d04 195b lrri $AX1.H, @$AR2 - 0d05 1959 lrri $AX1.L, @$AR2 - 0d06 195f lrri $AC1.M, @$AR2 - 0d07 195a lrri $AX0.H, @$AR2 - 0d08 1c5e mrr $AR2, $AC0.M - 0d09 1fda mrr $AC0.M, $AX0.H - 0d0a 1c61 mrr $AR3, $AR1 - 0d0b 8a00 m2 - 0d0c 8f00 set40 - 0d0d 191a lrri $AX0.H, @$AR0 - 0d0e b800 mulx $AX0.H, $AX1.H - 0d0f e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0d10 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d11 ea00 maddc $AC1.M, $AX1.L - 0d12 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0d13 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0d14 ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0d15 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0d16 1127 0d27 bloopi #0x27, 0x0d27 - 0d18 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d19 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0d1a 197e lrri $AC0.M, @$AR3 - 0d1b e800 maddc $AC0.M, $AX1.L - 0d1c e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0d1d ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0d1e eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0d1f bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0d20 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0 - 0d21 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M - 0d22 197f lrri $AC1.M, @$AR3 - 0d23 ea00 maddc $AC1.M, $AX1.L - 0d24 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0 - 0d25 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3 - 0d26 ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0 - 0d27 b200 mulxmvz $AX0.H, $AX1.L, $ACC0 - 0d28 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0 - 0d29 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M - 0d2a 197e lrri $AC0.M, @$AR3 - 0d2b e800 maddc $AC0.M, $AX1.L - 0d2c e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0 - 0d2d ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3 - 0d2e eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0 - 0d2f bb00 mulxmvz $AX0.H, $AX1.H, $ACC1 - 0d30 1bff srrn @$AR3, $AC1.M - 0d31 197f lrri $AC1.M, @$AR3 - 0d32 8e00 set16 - 0d33 8b00 m0 - 0d34 0088 ffff lri $WR0, #0xffff - 0d36 1b5b srri @$AR2, $AX1.H - 0d37 1b59 srri @$AR2, $AX1.L - 0d38 1b5f srri @$AR2, $AC1.M - 0d39 1b5e srri @$AR2, $AC0.M - 0d3a 02df ret - 0d3b 0eff lris $AC0.M, #0xff - 0d3c 00fe 03f2 sr @0x03f2, $AC0.M - 0d3e 8100 clr $ACC0 - 0d3f 00fe 03f0 sr @0x03f0, $AC0.M - 0d41 00fe 03f6 sr @0x03f6, $AC0.M - 0d43 009e 0100 lri $AC0.M, #0x0100 - 0d45 00fe 03f7 sr @0x03f7, $AC0.M - 0d47 00da 03f7 lr $AX0.H, @0x03f7 - 0d49 009e 8000 lri $AC0.M, #0x8000 - 0d4b 5400 subr $ACC0, $AX0.H - 0d4c 00fe 03f5 sr @0x03f5, $AC0.M - 0d4e 0e30 lris $AC0.M, #0x30 - 0d4f 00fe 03f3 sr @0x03f3, $AC0.M - 0d51 0e10 lris $AC0.M, #0x10 - 0d52 00fe 03f4 sr @0x03f4, $AC0.M - 0d54 009e 0096 lri $AC0.M, #0x0096 - 0d56 00fe 03f1 sr @0x03f1, $AC0.M - 0d58 02df ret - 0d59 0080 0a00 lri $AR0, #0x0a00 - 0d5b 8100 clr $ACC0 - 0d5c 00de 03f0 lr $AC0.M, @0x03f0 - 0d5e 8900 clr $ACC1 - 0d5f b100 tst $ACC0 - 0d60 0275 ifz - 0d61 0550 addis $ACC1, #0x50 - 0d62 00ff 03f0 sr @0x03f0, $AC1.M - 0d64 0200 0a60 addi $AC0.M, #0x0a60 - 0d66 1c7e mrr $AR3, $AC0.M - 0d67 0f4e lris $AC1.M, #0x4e - 0d68 02bf 012b call 0x012b - 0d6a 02df ret - 0d6b 00de 03f1 lr $AC0.M, @0x03f1 - 0d6d 0200 0a60 addi $AC0.M, #0x0a60 - 0d6f 1c7e mrr $AR3, $AC0.M - 0d70 8100 clr $ACC0 - 0d71 8900 clr $ACC1 - 0d72 009f 00a0 lri $AC1.M, #0x00a0 - 0d74 00de 03f1 lr $AC0.M, @0x03f1 - 0d76 5d00 sub $ACC1, $ACC0 - 0d77 0e50 lris $AC0.M, #0x50 - 0d78 0750 cmpis $ACC1, #0x50 - 0d79 0270 ifge - 0d7a 5d00 sub $ACC1, $ACC0 - 0d7b 00da 03f2 lr $AX0.H, @0x03f2 - 0d7d 8600 tstaxh $AX0.H - 0d7e 0290 0d9c jge 0x0d9c - 0d80 00de 03f3 lr $AC0.M, @0x03f3 - 0d82 5c00 sub $ACC0, $ACC1 - 0d83 0293 0d87 jle 0x0d87 - 0d85 029f 0da1 jmp 0x0da1 - 0d87 00db 03f7 lr $AX1.H, @0x03f7 - 0d89 009e 8000 lri $AC0.M, #0x8000 - 0d8b 4600 addr $ACC0, $AX1.H - 0d8c 029f 0d93 jmp 0x0d93 - 0d8e 00db 03f7 lr $AX1.H, @0x03f7 - 0d90 009e 8000 lri $AC0.M, #0x8000 - 0d92 5600 subr $ACC0, $AX1.H - 0d93 00fe 03f5 sr @0x03f5, $AC0.M - 0d95 1fda mrr $AC0.M, $AX0.H - 0d96 7c00 neg $ACC0 - 0d97 1f5e mrr $AX0.H, $AC0.M - 0d98 00fe 03f2 sr @0x03f2, $AC0.M - 0d9a 029f 0da1 jmp 0x0da1 - 0d9c 00de 03f4 lr $AC0.M, @0x03f4 - 0d9e 5d00 sub $ACC1, $ACC0 - 0d9f 0293 0d8e jle 0x0d8e - 0da1 8900 clr $ACC1 - 0da2 00dd 03f5 lr $AC1.L, @0x03f5 - 0da4 1501 lsl $ACC1, #1 - 0da5 8100 clr $ACC0 - 0da6 00dc 03f6 lr $AC0.L, @0x03f6 - 0da8 008b 009f lri $WR3, #0x009f - 0daa 0080 0a00 lri $AR0, #0x0a00 - 0dac 0900 lris $AX1.L, #0x00 - 0dad 1150 0db4 bloopi #0x50, 0x0db4 - 0daf 1878 lrr $AX0.L, @$AR3 - 0db0 4c00 add $ACC0, $ACC1 - 0db1 1cfe mrr $IX3, $AC0.M - 0db2 001f addarn $AR3, $IX3 - 0db3 1fd9 mrr $AC0.M, $AX1.L - 0db4 1b18 srri @$AR0, $AX0.L - 0db5 009f 0a60 lri $AC1.M, #0x0a60 - 0db7 1fc3 mrr $AC0.M, $AR3 - 0db8 5c00 sub $ACC0, $ACC1 - 0db9 00fe 03f1 sr @0x03f1, $AC0.M - 0dbb 00fc 03f6 sr @0x03f6, $AC0.L - 0dbd 008b ffff lri $WR3, #0xffff - 0dbf 02df ret - 0dc0 0f50 lris $AC1.M, #0x50 - 0dc1 0080 0a00 lri $AR0, #0x0a00 - 0dc3 0083 0d60 lri $AR3, #0x0d60 - 0dc5 0098 3fff lri $AX0.L, #0x3fff - 0dc7 02bf 0145 call 0x0145 - 0dc9 0f50 lris $AC1.M, #0x50 - 0dca 0080 0a00 lri $AR0, #0x0a00 - 0dcc 0083 0d00 lri $AR3, #0x0d00 - 0dce 0098 3fff lri $AX0.L, #0x3fff - 0dd0 02bf 0145 call 0x0145 - 0dd2 02df ret - 0dd3 b900 tst $ACC1 - 0dd4 0294 0dd9 jnz 0x0dd9 - 0dd6 6800 movax $ACC0, $AX0.L - 0dd7 b100 tst $ACC0 - 0dd8 02d5 retz - 0dd9 1c23 mrr $AR1, $AR3 - 0dda 197e lrri $AC0.M, @$AR3 - 0ddb 191b lrri $AX1.H, @$AR0 - 0ddc d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0 - 0ddd 1120 0de3 bloopi #0x20, 0x0de3 - 0ddf dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0de0 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0de1 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0de2 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0de3 4900 addax $ACC1, $AX0.L - 0de4 1108 0de9 bloopi #0x08, 0x0de9 - 0de6 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0de7 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0de8 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3 - 0de9 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M - 0dea 02df ret - 0deb 8f00 set40 - 0dec 8d00 set15 - 0ded 1c03 mrr $AR0, $AR3 - 0dee 00d9 038e lr $AX1.L, @0x038e - 0df0 0b04 lris $AX1.H, #0x04 - 0df1 197a lrri $AX0.H, @$AR3 - 0df2 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3 - 0df3 b600 mulxmv $AX0.H, $AX1.L, $ACC0 - 0df4 1128 0df9 bloopi #0x28, 0x0df9 - 0df6 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0df7 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0df8 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3 - 0df9 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0dfa 8c00 clr15 - 0dfb 8e00 set16 - 0dfc 02df ret - 0dfd 00da 0485 lr $AX0.H, @0x0485 - 0dff 8600 tstaxh $AX0.H - 0e00 0295 0e0e jz 0x0e0e - 0e02 8100 clr $ACC0 - 0e03 00de 042a lr $AC0.M, @0x042a - 0e05 147f lsr $ACC0, #-1 - 0e06 00fe 042b sr @0x042b, $AC0.M - 0e08 b100 tst $ACC0 - 0e09 0294 0e0e jnz 0x0e0e - 0e0b 0a01 lris $AX0.H, #0x01 - 0e0c 00fa 0401 sr @0x0401, $AX0.H - 0e0e 8f00 set40 - 0e0f 8100 clr $ACC0 - 0e10 00de 0428 lr $AC0.M, @0x0428 - 0e12 1478 lsr $ACC0, #-8 - 0e13 00df 0428 lr $AC1.M, @0x0428 - 0e15 0340 007f andi $AC1.M, #0x007f - 0e17 1f1e mrr $AX0.L, $AC0.M - 0e18 1f5f mrr $AX0.H, $AC1.M - 0e19 0220 007f xori $ACC0, #0x007f - 0e1b 1f3e mrr $AX1.L, $AC0.M - 0e1c 0320 007f xori $ACC1, #0x007f - 0e1e 1f7f mrr $AX1.H, $AC1.M - 0e1f 8100 clr $ACC0 - 0e20 8900 clr $ACC1 - 0e21 009f 0200 lri $AC1.M, #0x0200 - 0e23 1fd8 mrr $AC0.M, $AX0.L - 0e24 4c00 add $ACC0, $ACC1 - 0e25 1c1e mrr $AR0, $AC0.M - 0e26 1818 lrr $AX0.L, @$AR0 - 0e27 1fda mrr $AC0.M, $AX0.H - 0e28 4c00 add $ACC0, $ACC1 - 0e29 1c1e mrr $AR0, $AC0.M - 0e2a 181a lrr $AX0.H, @$AR0 - 0e2b 1fd9 mrr $AC0.M, $AX1.L - 0e2c 4c00 add $ACC0, $ACC1 - 0e2d 1c1e mrr $AR0, $AC0.M - 0e2e 1819 lrr $AX1.L, @$AR0 - 0e2f 1fdb mrr $AC0.M, $AX1.H - 0e30 4c00 add $ACC0, $ACC1 - 0e31 1c1e mrr $AR0, $AC0.M - 0e32 181b lrr $AX1.H, @$AR0 - 0e33 8a00 m2 - 0e34 0080 0b00 lri $AR0, #0x0b00 - 0e36 9800 mul $AX1.L, $AX1.H - 0e37 ae00 mulxmv $AX0.L, $AX1.H, $ACC0 - 0e38 b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M - 0e39 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M - 0e3a 6e30 movp's $ACC0 : @$AR0, $AC0.M - 0e3b 1b1e srri @$AR0, $AC0.M - 0e3c 8b00 m0 - 0e3d 0080 0b00 lri $AR0, #0x0b00 - 0e3f 0081 0b04 lri $AR1, #0x0b04 - 0e41 00da 042a lr $AX0.H, @0x042a - 0e43 02bf 0e8e call 0x0e8e - 0e45 0081 0b08 lri $AR1, #0x0b08 - 0e47 0080 0b00 lri $AR0, #0x0b00 - 0e49 00da 042a lr $AX0.H, @0x042a - 0e4b 00de 0429 lr $AC0.M, @0x0429 - 0e4d 8a00 m2 - 0e4e c000 mulc $AC0.M, $AX0.H - 0e4f 8b00 m0 - 0e50 6e00 movp $ACC0 - 0e51 1f5e mrr $AX0.H, $AC0.M - 0e52 02bf 0e8e call 0x0e8e - 0e54 0080 0b00 lri $AR0, #0x0b00 - 0e56 0081 0b0c lri $AR1, #0x0b0c - 0e58 8100 clr $ACC0 - 0e59 8900 clr $ACC1 - 0e5a 00de 042b lr $AC0.M, @0x042b - 0e5c 00df 042a lr $AC1.M, @0x042a - 0e5e 00fe 042a sr @0x042a, $AC0.M - 0e60 5c00 sub $ACC0, $ACC1 - 0e61 1f5e mrr $AX0.H, $AC0.M - 0e62 02bf 0e99 call 0x0e99 - 0e64 0080 0b0c lri $AR0, #0x0b0c - 0e66 0081 0b10 lri $AR1, #0x0b10 - 0e68 00da 0429 lr $AX0.H, @0x0429 - 0e6a 02bf 0e8e call 0x0e8e - 0e6c 0081 0b04 lri $AR1, #0x0b04 - 0e6e 0082 0b0c lri $AR2, #0x0b0c - 0e70 0083 0ea7 lri $AR3, #0x0ea7 - 0e72 1108 0e8b bloopi #0x08, 0x0e8b - 0e74 195f lrri $AC1.M, @$AR2 - 0e75 15fb asr $ACC1, #-5 - 0e76 1f1d mrr $AX0.L, $AC1.L - 0e77 1f5f mrr $AX0.H, $AC1.M - 0e78 193f lrri $AC1.M, @$AR1 - 0e79 00e1 0b24 sr @0x0b24, $AR1 - 0e7b 00e2 0b25 sr @0x0b25, $AR2 - 0e7d 021b ilrri $AC0.M, @$AR3 - 0e7e 00e3 0b26 sr @0x0b26, $AR3 - 0e80 1c7e mrr $AR3, $AC0.M - 0e81 00c0 038f lr $AR0, @0x038f - 0e83 02bf 0dd3 call 0x0dd3 - 0e85 00c1 0b24 lr $AR1, @0x0b24 - 0e87 00c2 0b25 lr $AR2, @0x0b25 - 0e89 00c3 0b26 lr $AR3, @0x0b26 - 0e8b 0000 nop - 0e8c 8e00 set16 - 0e8d 02df ret - 0e8e 8a00 m2 - 0e8f 191f lrri $AC1.M, @$AR0 - 0e90 d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0 - 0e91 d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0 - 0e92 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e93 191f lrri $AC1.M, @$AR0 - 0e94 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M - 0e95 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0e96 1b3e srri @$AR1, $AC0.M - 0e97 8b00 m0 - 0e98 02df ret - 0e99 8a00 m2 - 0e9a 8d00 set15 - 0e9b 1f7e mrr $AX1.H, $AC0.M - 0e9c 1918 lrri $AX0.L, @$AR0 - 0e9d a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0 - 0e9e ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0 - 0e9f ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ea0 1918 lrri $AX0.L, @$AR0 - 0ea1 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M - 0ea2 6e31 movp's $ACC0 : @$AR1, $AC0.M - 0ea3 1b3e srri @$AR1, $AC0.M - 0ea4 8c00 clr15 - 0ea5 8b00 m0 - 0ea6 02df ret - 0ea7 0d00 lris $AC1.L, #0x00 - 0ea8 0d60 lris $AC1.L, #0x60 - 0ea9 0f40 lris $AC1.M, #0x40 - 0eaa 0ca0 lris $AC0.L, #0xa0 - 0eab 0e80 lris $AC0.M, #0x80 - 0eac 0ee0 lris $AC0.M, #0xe0 - 0ead 0be0 lris $AX1.H, #0xe0 - 0eae 0c40 lris $AC0.L, #0x40 - 0eaf 00f9 0361 sr @0x0361, $AX1.L - 0eb1 1fc0 mrr $AC0.M, $AR0 - 0eb2 0200 fffc addi $AC0.M, #0xfffc - 0eb4 1c1e mrr $AR0, $AC0.M - 0eb5 1c5e mrr $AR2, $AC0.M - 0eb6 0083 043c lri $AR3, #0x043c - 0eb8 197e lrri $AC0.M, @$AR3 - 0eb9 197f lrri $AC1.M, @$AR3 - 0eba 80a2 nx'sl : $AC0.M, $AX0.H - 0ebb 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H - 0ebc 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M - 0ebd 1b1f srri @$AR0, $AC1.M - 0ebe 1c02 mrr $AR0, $AR2 - 0ebf 8100 clr $ACC0 - 0ec0 00de 0402 lr $AC0.M, @0x0402 - 0ec2 00fe 0362 sr @0x0362, $AC0.M - 0ec4 1474 lsr $ACC0, #-12 - 0ec5 1f7e mrr $AX1.H, $AC0.M - 0ec6 1f3c mrr $AX1.L, $AC0.L - 0ec7 8900 clr $ACC1 - 0ec8 00dd 0430 lr $AC1.L, @0x0430 - 0eca 1504 lsl $ACC1, #4 - 0ecb 0604 cmpis $ACC0, #0x04 - 0ecc 0290 0f23 jge 0x0f23 - 0ece 1fdd mrr $AC0.M, $AC1.L - 0ecf 0082 02b0 lri $AR2, #0x02b0 - 0ed1 1050 loopi #0x50 - 0ed2 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L - 0ed3 1fbe mrr $AC1.L, $AC0.M - 0ed4 00fe 0360 sr @0x0360, $AC0.M - 0ed6 8900 clr $ACC1 - 0ed7 1fbe mrr $AC1.L, $AC0.M - 0ed8 0af8 lris $AX0.H, #0xf8 - 0ed9 009b 00fc lri $AX1.H, #0x00fc - 0edb 00d8 0361 lr $AX0.L, @0x0361 - 0edd 0082 02b0 lri $AR2, #0x02b0 - 0edf 0083 02b0 lri $AR3, #0x02b0 - 0ee1 195e lrri $AC0.M, @$AR2 - 0ee2 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M - 0ee3 1128 0ee8 bloopi #0x28, 0x0ee8 - 0ee5 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 - 0ee6 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H - 0ee7 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 - 0ee8 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H - 0ee9 8a00 m2 - 0eea 0082 02b0 lri $AR2, #0x02b0 - 0eec 00dd 0430 lr $AC1.L, @0x0430 - 0eee 1504 lsl $ACC1, #4 - 0eef 1fe0 mrr $AC1.M, $AR0 - 0ef0 8100 clr $ACC0 - 0ef1 00de 0362 lr $AC0.M, @0x0362 - 0ef3 1474 lsr $ACC0, #-12 - 0ef4 1f7e mrr $AX1.H, $AC0.M - 0ef5 1f3c mrr $AX1.L, $AC0.L - 0ef6 8f00 set40 - 0ef7 1943 lrri $AR3, @$AR2 - 0ef8 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0ef9 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0efa f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0efb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0efc f200 madd $AX0.L, $AX0.H - 0efd fe00 movpz $ACC0 - 0efe 1c1f mrr $AR0, $AC1.M - 0eff 1943 lrri $AR3, @$AR2 - 0f00 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0f01 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f02 114e 0f0a bloopi #0x4e, 0x0f0a - 0f04 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f05 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f06 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0f07 1c1f mrr $AR0, $AC1.M - 0f08 1943 lrri $AR3, @$AR2 - 0f09 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3 - 0f0a 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3 - 0f0b f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f0c f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3 - 0f0d f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M - 0f0e fe00 movpz $ACC0 - 0f0f 1b3e srri @$AR1, $AC0.M - 0f10 8b00 m0 - 0f11 8e00 set16 - 0f12 00fe 0433 sr @0x0433, $AC0.M - 0f14 1c1f mrr $AR0, $AC1.M - 0f15 150c lsl $ACC1, #12 - 0f16 0340 0fff andi $AC1.M, #0x0fff - 0f18 00ff 0430 sr @0x0430, $AC1.M - 0f1a 0083 043c lri $AR3, #0x043c - 0f1c 191e lrri $AC0.M, @$AR0 - 0f1d 191f lrri $AC1.M, @$AR0 - 0f1e 80a0 nx'ls : $AX0.H, $AC0.M - 0f1f 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M - 0f20 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M - 0f21 1b7f srri @$AR3, $AC1.M - 0f22 02df ret - 0f23 1fe0 mrr $AC1.M, $AR0 - 0f24 1c1f mrr $AR0, $AC1.M - 0f25 1128 0f2c bloopi #0x28, 0x0f2c - 0f27 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f28 1b3e srri @$AR1, $AC0.M - 0f29 1c1f mrr $AR0, $AC1.M - 0f2a 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0 - 0f2b 1b3e srri @$AR1, $AC0.M - 0f2c 1c1f mrr $AR0, $AC1.M - 0f2d 029f 0f12 jmp 0x0f12 - 0f2f 0083 0520 lri $AR3, #0x0520 - 0f31 00de 0433 lr $AC0.M, @0x0433 - 0f33 1050 loopi #0x50 - 0f34 1b7e srri @$AR3, $AC0.M - 0f35 029f 0386 jmp 0x0386 - 0f37 1c20 mrr $AR1, $AR0 - 0f38 185f lrr $AC1.M, @$AR2 - 0f39 1f7f mrr $AX1.H, $AC1.M - 0f3a 193a lrri $AX0.H, @$AR1 - 0f3b 6400 movr $ACC0, $AX0.H - 0f3c 0078 0f41 bloop $AX0.L, 0x0f41 - 0f3e 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1 - 0f3f 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M - 0f40 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1 - 0f41 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M - 0f42 1a5b srr @$AR2, $AX1.H - 0f43 02df ret - 0f44 0098 8240 lri $AX0.L, #0x8240 - 0f46 00f8 04e8 sr @0x04e8, $AX0.L - 0f48 0098 7fff lri $AX0.L, #0x7fff - 0f4a 00f8 04e9 sr @0x04e9, $AX0.L - 0f4c 0098 7dbf lri $AX0.L, #0x7dbf - 0f4e 00f8 04ea sr @0x04ea, $AX0.L - 0f50 0098 843f lri $AX0.L, #0x843f - 0f52 00f8 04eb sr @0x04eb, $AX0.L - 0f54 0098 b23b lri $AX0.L, #0xb23b - 0f56 00f8 04f0 sr @0x04f0, $AX0.L - 0f58 0098 7fff lri $AX0.L, #0x7fff - 0f5a 00f8 04f1 sr @0x04f1, $AX0.L - 0f5c 0098 4dc4 lri $AX0.L, #0x4dc4 - 0f5e 00f8 04f2 sr @0x04f2, $AX0.L - 0f60 0098 d808 lri $AX0.L, #0xd808 - 0f62 00f8 04f3 sr @0x04f3, $AX0.L - 0f64 0098 0000 lri $AX0.L, #0x0000 - 0f66 0080 04ec lri $AR0, #0x04ec - 0f68 1004 loopi #0x04 - 0f69 1b18 srri @$AR0, $AX0.L - 0f6a 0080 04f4 lri $AR0, #0x04f4 - 0f6c 1004 loopi #0x04 - 0f6d 1b18 srri @$AR0, $AX0.L - 0f6e 02df ret - 0f6f 0080 0f40 lri $AR0, #0x0f40 - 0f71 0083 0b00 lri $AR3, #0x0b00 - 0f73 8900 clr $ACC1 - 0f74 0f50 lris $AC1.M, #0x50 - 0f75 0098 6784 lri $AX0.L, #0x6784 - 0f77 02bf 0154 call 0x0154 - 0f79 0080 04e8 lri $AR0, #0x04e8 - 0f7b 0082 04ec lri $AR2, #0x04ec - 0f7d 0081 0b00 lri $AR1, #0x0b00 - 0f7f 8900 clr $ACC1 - 0f80 0f50 lris $AC1.M, #0x50 - 0f81 0080 0b00 lri $AR0, #0x0b00 - 0f83 0083 0d00 lri $AR3, #0x0d00 - 0f85 0098 7fff lri $AX0.L, #0x7fff - 0f87 02bf 0145 call 0x0145 - 0f89 8900 clr $ACC1 - 0f8a 0f50 lris $AC1.M, #0x50 - 0f8b 0080 0b00 lri $AR0, #0x0b00 - 0f8d 0083 0d60 lri $AR3, #0x0d60 - 0f8f 0098 b820 lri $AX0.L, #0xb820 - 0f91 02bf 0145 call 0x0145 - 0f93 0080 0ca0 lri $AR0, #0x0ca0 - 0f95 0083 0b00 lri $AR3, #0x0b00 - 0f97 8900 clr $ACC1 - 0f98 0f50 lris $AC1.M, #0x50 - 0f99 0098 6784 lri $AX0.L, #0x6784 - 0f9b 02bf 0154 call 0x0154 - 0f9d 0080 04e8 lri $AR0, #0x04e8 - 0f9f 0082 04f4 lri $AR2, #0x04f4 - 0fa1 0081 0b00 lri $AR1, #0x0b00 - 0fa3 8900 clr $ACC1 - 0fa4 0f50 lris $AC1.M, #0x50 - 0fa5 0080 0b00 lri $AR0, #0x0b00 - 0fa7 0083 0d00 lri $AR3, #0x0d00 - 0fa9 0098 47e0 lri $AX0.L, #0x47e0 - 0fab 02bf 0145 call 0x0145 - 0fad 8900 clr $ACC1 - 0fae 0f50 lris $AC1.M, #0x50 - 0faf 0080 0b00 lri $AR0, #0x0b00 - 0fb1 0083 0d60 lri $AR3, #0x0d60 - 0fb3 0098 8001 lri $AX0.L, #0x8001 - 0fb5 02bf 0145 call 0x0145 - 0fb7 02df ret - 0fb8 0000 nop - 0fb9 0000 nop - 0fba 0000 nop - 0fbb 0000 nop - 0fbc 0000 nop - 0fbd 0000 nop - 0fbe 0000 nop - 0fbf 0000 nop